[
  {
    "path": ".gitignore",
    "content": "# Built application files\r\n/*/build/\r\napp/src/main/libs\r\napp/src/main/objs\r\nbuild/\r\n\r\n# Crashlytics configuations\r\ncom_crashlytics_export_strings.xml\r\n\r\n# Local configuration file (sdk path, etc)\r\nlocal.properties\r\n\r\n# Gradle generated files\r\n.gradle/\r\n\r\n# Signing files\r\n.signing/\r\n\r\n# User-specific configurations\r\n.idea/libraries/\r\n.idea/workspace.xml\r\n.idea/tasks.xml\r\n.idea/.name\r\n.idea/compiler.xml\r\n.idea/copyright/profiles_settings.xml\r\n.idea/encodings.xml\r\n.idea/misc.xml\r\n.idea/modules.xml\r\n.idea/scopes/scope_settings.xml\r\n.idea/vcs.xml\r\n*.iml\r\n\r\n# OS-specific files\r\n.DS_Store\r\n.DS_Store?\r\n._*\r\n.Spotlight-V100\r\n.Trashes\r\nehthumbs.db\r\nThumbs.db\r\n*.bak"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"LOCAL\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleHome\" value=\"E:\\Android\\Android Studio\\gradle\\gradle-2.8\" />\n        <option name=\"gradleJvm\" value=\"1.7\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    {one line to give the program's name and a brief idea of what it does.}\n    Copyright (C) {year}  {name of author}\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    {project}  Copyright (C) {year}  {fullname}\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# nds4droid\nnds4droid is a free (including ad-free) open source Nintendo DS emulator for Android smartphones. It is based off of [DeSmuME](https://en.wikipedia.org/wiki/DeSmuME) and has a wide variety of options for balancing performance and accuracy. In addition, it has been translated into several languages. Enjoy!\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\r\n\r\nandroid {\r\n    compileSdkVersion 10\r\n    buildToolsVersion \"23.0.2\"\r\n\r\n    defaultConfig {\r\n        applicationId \"com.opendoorstudios.ds4droid\"\r\n        minSdkVersion 10\r\n        targetSdkVersion 10\r\n    }\r\n\r\n    sourceSets.main {\r\n        jniLibs.srcDir 'src/main/libs'\r\n        jni.srcDirs = []\r\n    }\r\n\r\n    buildTypes {\r\n        release {\r\n            minifyEnabled false\r\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'\r\n        }\r\n    }\r\n\r\n    lintOptions {\r\n        checkReleaseBuilds false\r\n    }\r\n}\r\n\r\ndependencies {\r\n    compile files('libs/ouya-sdk.jar')\r\n}\r\n"
  },
  {
    "path": "app/lint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<lint>\n</lint>"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    package=\"com.opendoorstudios.ds4droid\"\r\n    android:versionCode=\"47\"\r\n    android:versionName=\"47\"\r\n    android:installLocation=\"auto\" >\r\n\r\n    <uses-sdk\r\n        android:minSdkVersion=\"10\"\r\n        android:targetSdkVersion=\"10\" />\r\n    \r\n\t<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\r\n\t<uses-permission android:name=\"android.permission.RECORD_AUDIO\"></uses-permission>\r\n\t<uses-feature android:name=\"android.hardware.touchscreen\" android:required=\"false\"/> \r\n\t\t    \r\n    <application\r\n        android:icon=\"@drawable/ic_launcher\"\r\n        android:label=\"@string/app_name\"\r\n        android:theme=\"@android:style/Theme.Black.NoTitleBar.Fullscreen\"\r\n        android:configChanges=\"keyboardHidden|orientation\"\r\n        android:name=\"ds4droidApplication\">\r\n        \r\n        <activity\r\n            android:name=\".MainActivity\"\r\n            android:label=\"@string/title_activity_main\" >\r\n            <intent-filter>\r\n                <action android:name=\"android.intent.action.MAIN\" />\r\n                <category android:name=\"android.intent.category.LAUNCHER\" />\r\n                <category android:name=\"tv.ouya.intent.category.GAME\" />\r\n            </intent-filter>\r\n        </activity>\r\n\r\n        <activity android:name=\".FileDialog\">\r\n            <intent-filter>\r\n                <action android:name=\"android.intent.action.PICK\"/>\r\n                <category android:name=\"android.intent.category.DEFAULT\"/>\r\n\t\t\t</intent-filter>\r\n        </activity>\r\n\t\t\r\n\t\t<activity\r\n\t\t\tandroid:name=\"com.opendoorstudios.ds4droid.NDSScanner.CollectionActivity\"\r\n\t\t\tandroid:label=\"@string/app_name\" >\r\n\t\t\t\r\n\t\t\t<intent-filter>\r\n                <action android:name=\"android.intent.action.PICK\"/>\r\n                <category android:name=\"android.intent.category.DEFAULT\"/>\r\n\t\t\t</intent-filter>\r\n\t\t</activity>\r\n        \r\n        <activity android:name=\".Settings\">\r\n        </activity>\r\n        \r\n        <activity android:name=\".ButtonLayoutEditor\">\r\n        </activity>\r\n        \r\n        <activity android:name=\".KeyMapSettings\"/>\r\n        \r\n        <activity android:name=\".Cheats\"/>\r\n        \r\n        <activity android:name=\".About\" />\r\n        \r\n    </application>\r\n\r\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/About.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\nimport android.app.Activity;\r\nimport android.content.pm.PackageManager.NameNotFoundException;\r\nimport android.os.Bundle;\r\nimport android.widget.TextView;\r\n\r\npublic class About extends Activity {\r\n\t\r\n\t@Override\r\n\tpublic void onCreate(Bundle savedInstanceState) {\r\n\t\tsuper.onCreate(savedInstanceState);\r\n\t\t\r\n\t\tsetContentView(R.layout.about);\r\n\t\t\r\n\t\tfinal TextView textVersion = (TextView)findViewById(R.id.about_versionstring);\r\n\t\t\r\n\t\tfinal StringBuilder build = new StringBuilder();\r\n\t\t\r\n\t\tString family, library;\r\n\t\t\r\n\t\tDeSmuME.load();\r\n\t\t\r\n\t\tswitch(DeSmuME.getCPUFamily()) {\r\n\t\tcase 1: family = \"ARM\"; break;\r\n\t\tcase 2: family = \"x86\"; break;\r\n\t\tdefault: family = \"unknown\"; break;\r\n\t\t}\r\n\t\t\r\n\t\tswitch(DeSmuME.getCPUType()) {\r\n\t\tcase DeSmuME.CPUTYPE_COMPAT: library = \"compat\"; break;\r\n\t\tcase DeSmuME.CPUTYPE_V7: library = \"v7\"; break;\r\n\t\tcase DeSmuME.CPUTYPE_NEON: library = \"neon\"; break;\r\n\t\tdefault: library = \"unknown\";\r\n\t\t}\r\n\t\t\r\n\t\tString version = null;\r\n\t\ttry {\r\n\t\t\tversion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;\r\n\t\t} catch (NameNotFoundException e) {\r\n\t\t\t// TODO Auto-generated catch block\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\tif(version == null)\r\n\t\t\tversion = \"unknown\";\r\n\t\t\r\n\t\tbuild.append(getString(R.string.app_name)).append(\" \").append(version).append(\r\n\t\t\t\t\t\t\" \").append(family).append(\"/\").append(library);\r\n\t\t\r\n\t\ttextVersion.setText(build.toString());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/Button.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\nCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport java.util.HashMap;\r\n\r\nimport android.content.Context;\r\nimport android.content.SharedPreferences;\r\nimport android.graphics.Bitmap;\r\nimport android.graphics.BitmapFactory;\r\nimport android.graphics.Rect;\r\nimport android.preference.PreferenceManager;\r\n\r\nclass Button {\r\n\t\r\n\tButton(int id) {\r\n\t\tthis.id = id;\r\n\t\tthis.position = null;\r\n\t\tthis.bitmap = null;\r\n\t}\r\n\t\r\n\tButton(Rect position, int id) {\r\n\t\tthis.position = position;\r\n\t\tthis.id = id;\r\n\t\tthis.bitmap = null;\r\n\t}\r\n\t\r\n\tButton(Rect position, int id, Bitmap bitmap) {\r\n\t\tthis.position = position;\r\n\t\tthis.id = id;\r\n\t\tthis.bitmap = bitmap;\r\n\t}\r\n\t\r\n\tstatic final Button L_PORT_DEFAULT = new Button(new Rect(0, 590, 160, 680), Button.BUTTON_L);\r\n\tstatic final Button R_PORT_DEFAULT = new Button(new Rect(610, 590, 768, 680), Button.BUTTON_R);\r\n\tstatic final Button TOUCH_PORT_DEFAULT = new Button(new Rect(320, 590, 441, 659), Button.BUTTON_TOUCH);\r\n\tstatic final Button DPAD_PORT_DEFAULT = new Button(new Rect(0, 760, 334, 1074), Button.BUTTON_DPAD);\r\n\tstatic final Button ABXY_PORT_DEFAULT = new Button(new Rect(397, 755, 759, 1072), Button.BUTTON_ABXY);\r\n\tstatic final Button START_PORT_DEFAULT = new Button(new Rect(270, 1082, 366, 1147), Button.BUTTON_START);\r\n\tstatic final Button SELECT_PORT_DEFAULT = new Button(new Rect(400, 1082, 485, 1145), Button.BUTTON_SELECT);\r\n\t//static final Button FASTFORWARD_PORT_DEFAULT = new Button(new Rect(595, 1190, 713, 1281), Button.BUTTON_FASTFORWARD);\r\n\tstatic final Button OPTIONS_DEFAULT = new Button(new Rect(620, 1068, 768, 1152), Button.BUTTON_OPTIONS);\r\n\t\r\n\tstatic final Button L_LAND_DEFAULT = new Button(new Rect(0, 0, 160, 90), Button.BUTTON_L);\r\n\tstatic final Button R_LAND_DEFAULT = new Button(new Rect(994, 0, 1152, 90), Button.BUTTON_R);\r\n\tstatic final Button DPAD_LAND_DEFAULT = new Button(new Rect(0, 454, 334, 768), Button.BUTTON_DPAD);\r\n\tstatic final Button ABXY_LAND_DEFAULT = new Button(new Rect(770, 451, 1132, 768), Button.BUTTON_ABXY);\r\n\tstatic final Button START_LAND_DEFAULT = new Button(new Rect(380, 703, 476, 768), Button.BUTTON_START);\r\n\tstatic final Button TOUCH_LAND_DEFAULT = new Button(new Rect(506, 703, 627, 768), Button.BUTTON_TOUCH);\r\n\tstatic final Button SELECT_LAND_DEFAULT = new Button(new Rect(667, 703, 752, 768), Button.BUTTON_SELECT);\r\n\t//static final Button FASTFORWARD_LAND_DEFAULT = new Button(new Rect(487, 0, 645, 90), Button.BUTTON_FASTFORWARD);\r\n\tstatic final Button OPTIONS_LAND_DEFAULT = new Button(new Rect(502, 0, 650, 84), Button.BUTTON_OPTIONS);\r\n\t\r\n\t\r\n\tstatic final HashMap<Integer, Button> portraitToDefault;\r\n\tstatic final HashMap<Integer, Button> landscapeToDefault;\r\n\t\r\n\tstatic {\r\n\t\tportraitToDefault = new HashMap<Integer, Button>();\r\n\t\tportraitToDefault.put(Button.BUTTON_L, L_PORT_DEFAULT);\r\n\t\tportraitToDefault.put(Button.BUTTON_R, R_PORT_DEFAULT);\r\n\t\tportraitToDefault.put(Button.BUTTON_TOUCH, TOUCH_PORT_DEFAULT);\r\n\t\tportraitToDefault.put(Button.BUTTON_DPAD, DPAD_PORT_DEFAULT);\r\n\t\tportraitToDefault.put(Button.BUTTON_ABXY, ABXY_PORT_DEFAULT);\r\n\t\tportraitToDefault.put(Button.BUTTON_START, START_PORT_DEFAULT);\r\n\t\tportraitToDefault.put(Button.BUTTON_SELECT, SELECT_PORT_DEFAULT);\r\n\t\t//portraitToDefault.put(Button.BUTTON_FASTFORWARD, FASTFORWARD_PORT_DEFAULT);\r\n\t\tportraitToDefault.put(Button.BUTTON_OPTIONS, OPTIONS_DEFAULT);\r\n\t\t\r\n\t\tlandscapeToDefault = new HashMap<Integer, Button>();\r\n\t\tlandscapeToDefault.put(Button.BUTTON_L, L_LAND_DEFAULT);\r\n\t\tlandscapeToDefault.put(Button.BUTTON_R, R_LAND_DEFAULT);\r\n\t\tlandscapeToDefault.put(Button.BUTTON_TOUCH, TOUCH_LAND_DEFAULT);\r\n\t\tlandscapeToDefault.put(Button.BUTTON_DPAD, DPAD_LAND_DEFAULT);\r\n\t\tlandscapeToDefault.put(Button.BUTTON_ABXY, ABXY_LAND_DEFAULT);\r\n\t\tlandscapeToDefault.put(Button.BUTTON_START, START_LAND_DEFAULT);\r\n\t\tlandscapeToDefault.put(Button.BUTTON_SELECT, SELECT_LAND_DEFAULT);\r\n\t\t//landscapeToDefault.put(Button.BUTTON_FASTFORWARD, FASTFORWARD_LAND_DEFAULT);\r\n\t\tlandscapeToDefault.put(Button.BUTTON_OPTIONS, OPTIONS_LAND_DEFAULT);\r\n\t}\r\n\t\r\n\tstatic Button load(Context context, int id, int resId, boolean landscape, boolean is565, Rect screen, Rect space, boolean forceLoad) {\r\n\t\t\r\n\t\tfinal SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\r\n\t\tfinal String prefLayoutBase = \"Controls.\" + (landscape ? \"Landscape.\" : \"Portrait.\");\r\n\t\tfinal String prefBase = prefLayoutBase + getButtonName(id) + \".\" ;\r\n\t\tfinal Button template = landscape ? landscapeToDefault.get(id) : portraitToDefault.get(id);\r\n\t\tif(forceLoad || prefs.getBoolean(prefLayoutBase + \"Draw\" , true)) {\r\n\t\t\tfloat controlxscale = (float)screen.width() / (float)space.width();\r\n\t\t\tfloat controlyscale = (float)screen.height() / (float)space.height();\r\n\r\n\t\t\tfinal Rect finalRect = new Rect(prefs.getInt(prefBase + \"Left\", (int) (template.position.left * controlxscale)),\r\n\t\t\t\t\tprefs.getInt(prefBase + \"Top\", (int) (template.position.top * controlyscale)),\r\n\t\t\t\t\tprefs.getInt(prefBase + \"Right\", (int) (template.position.right * controlxscale)),\r\n\t\t\t\t\tprefs.getInt(prefBase + \"Bottom\", (int) (template.position.bottom * controlyscale)));\r\n\t\r\n\t\t\tfinal BitmapFactory.Options controlOptions = new BitmapFactory.Options();\r\n\t\t\tif(is565)\r\n\t\t\t\tcontrolOptions.inPreferredConfig = Bitmap.Config.RGB_565;\r\n\t\t\tfinal Bitmap originalControls = BitmapFactory.decodeResource(context.getResources(), resId, controlOptions);\r\n\t\t\tfinal Bitmap controls = Bitmap.createScaledBitmap(originalControls, finalRect.width(), finalRect.height(), true);\r\n\t\t\treturn new Button(finalRect, id, controls);\r\n\t\t}\r\n\t\telse\r\n\t\t\treturn new Button(template.position, id);\r\n\t\t\r\n\t}\r\n\t\r\n\tstatic String getButtonName(int id) {\r\n\t\tswitch(id) {\r\n\t\tcase BUTTON_RIGHT: return \"Right\";\r\n\t\tcase BUTTON_DOWN: return \"Down\";\r\n\t\tcase BUTTON_UP: return \"Up\";\r\n\t\tcase BUTTON_LEFT: return \"Left\";\r\n\t\tcase BUTTON_A: return \"A\";\r\n\t\tcase BUTTON_B: return \"B\";\r\n\t\tcase BUTTON_X: return \"X\";\r\n\t\tcase BUTTON_Y: return \"Y\";\r\n\t\tcase BUTTON_L: return \"L\";\r\n\t\tcase BUTTON_R: return \"R\";\r\n\t\tcase BUTTON_START: return \"Start\";\r\n\t\tcase BUTTON_SELECT: return \"Select\";\r\n\t\tcase BUTTON_TOUCH: return \"Touch\";\r\n\t\tcase BUTTON_DPAD: return \"DPad\";\r\n\t\tcase BUTTON_ABXY: return \"ABXY\";\r\n\t\tcase BUTTON_UPLEFT: return \"UpLeft\";\r\n\t\tcase BUTTON_UPRIGHT: return \"UpRight\";\r\n\t\tcase BUTTON_DOWNLEFT: return \"DownLeft\";\r\n\t\tcase BUTTON_DOWNRIGHT: return \"DownRight\";\r\n\t\tcase BUTTON_OPTIONS: return \"Options\";\r\n\t\t//case BUTTON_FASTFORWARD: return \"Fast forward\";\r\n\t\tdefault: return \"Unknown\";\r\n\t\t}\r\n\t}\r\n\t\r\n\tvoid apply(int[] states, boolean on) {\r\n\t\tfinal int val = on ? 1 : 0;\r\n\t\tswitch(id) {\r\n\t\tcase BUTTON_UPLEFT:\r\n\t\t\tstates[Button.BUTTON_UP] = states[Button.BUTTON_LEFT] = val;\r\n\t\t\tbreak;\r\n\t\tcase BUTTON_UPRIGHT:\r\n\t\t\tstates[Button.BUTTON_UP] = states[Button.BUTTON_RIGHT] = val;\r\n\t\t\tbreak;\r\n\t\tcase BUTTON_DOWNLEFT:\r\n\t\t\tstates[Button.BUTTON_DOWN] = states[Button.BUTTON_LEFT] = val;\r\n\t\t\tbreak;\r\n\t\tcase BUTTON_DOWNRIGHT:\r\n\t\t\tstates[Button.BUTTON_DOWN] = states[Button.BUTTON_RIGHT] = val;\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tif(id >= 0 && id < states.length)\r\n\t\t\t\tstates[id] = val;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\t\r\n\tvoid applyToPrefs(SharedPreferences prefs, boolean landscape, boolean overwrite) {\r\n\t\tfinal String prefLayoutBase = \"Controls.\" + (landscape ? \"Landscape.\" : \"Portrait.\");\r\n\t\tfinal String prefBase = prefLayoutBase + getButtonName(id) + \".\" ;\r\n\t\tif(prefs.contains(prefBase + \"Left\") && !overwrite)\r\n\t\t\treturn;\r\n\t\tprefs.edit().putInt(prefBase + \"Left\", position.left).putInt(prefBase + \"Top\", position.top).putInt(prefBase + \"Right\", position.right).putInt(prefBase + \"Bottom\", position.bottom).apply();\r\n\t}\r\n\t\r\n\tstatic final int BUTTON_RIGHT = 0;\r\n\tstatic final int BUTTON_DOWN = 1;\r\n\tstatic final int BUTTON_UP = 2;\r\n\tstatic final int BUTTON_LEFT = 3;\r\n\tstatic final int BUTTON_A = 4;\r\n\tstatic final int BUTTON_B = 5;\r\n\tstatic final int BUTTON_X = 6;\r\n\tstatic final int BUTTON_Y = 7;\r\n\tstatic final int BUTTON_L = 8;\r\n\tstatic final int BUTTON_R = 9;\r\n\tstatic final int BUTTON_START = 10;\r\n\tstatic final int BUTTON_SELECT = 11;\r\n\t\r\n\t//meta buttons, aren't actually passed down\r\n\tstatic final int BUTTON_TOUCH = 12;\r\n\tstatic final int BUTTON_DPAD = 13;\r\n\tstatic final int BUTTON_ABXY = 14;\r\n\tstatic final int BUTTON_UPLEFT = 15;\r\n\tstatic final int BUTTON_UPRIGHT = 16;\r\n\tstatic final int BUTTON_DOWNLEFT = 17;\r\n\tstatic final int BUTTON_DOWNRIGHT = 18;\r\n\tstatic final int BUTTON_OPTIONS = 19;\r\n\t//static final int BUTTON_FASTFORWARD = 20;\r\n\t\r\n\tfinal Bitmap bitmap;\r\n\tRect position;\r\n\tfinal int id;\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/ButtonLayoutEditor.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\n\r\nimport android.app.Activity;\r\nimport android.content.Context;\r\nimport android.content.SharedPreferences;\r\nimport android.graphics.Canvas;\r\nimport android.graphics.PixelFormat;\r\nimport android.graphics.Rect;\r\nimport android.os.Bundle;\r\nimport android.preference.PreferenceManager;\r\nimport android.view.MotionEvent;\r\nimport android.view.ScaleGestureDetector;\r\nimport android.view.SurfaceHolder;\r\nimport android.view.SurfaceHolder.Callback;\r\nimport android.view.SurfaceView;\r\n\r\npublic class ButtonLayoutEditor extends Activity {\r\n\t\r\n\tfinal int[] buttonsToLoad = { Button.BUTTON_L, Button.BUTTON_R, Button.BUTTON_TOUCH, Button.BUTTON_SELECT,\r\n\t\t\tButton.BUTTON_START, Button.BUTTON_DPAD, Button.BUTTON_ABXY, Button.BUTTON_OPTIONS };\r\n\tfinal int[] buttonResIds = { R.drawable.l, R.drawable.r, R.drawable.touch, R.drawable.select,\r\n\t\t\tR.drawable.start, R.drawable.dpad, R.drawable.abxy, R.drawable.menu\t};\r\n\t\r\n\tBundle savedValues = null;\r\n\tButtonEditorView view = null;\r\n\t@Override\r\n\tpublic void onCreate(Bundle savedInstanceState) {\r\n\t\tsuper.onCreate(savedInstanceState);\r\n\t\tsetContentView(view = new ButtonEditorView(this));\r\n\t\tsavedValues = savedInstanceState;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void onStop() {\r\n\t\tsuper.onStop();\r\n\t\tfinal SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\r\n\t\tfor(Editing button : view.buttons) {\r\n\t\t\tif(!button.position.equals(button.button.position)) {\r\n\t\t\t\tbutton.button.position = button.position;\r\n\t\t\t\tbutton.button.applyToPrefs(prefs, view.landscape, true);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tstatic class Editing {\r\n\t\tEditing(Button button) {\r\n\t\t\tthis.button = button;\r\n\t\t\tsourceBitmapRect = new Rect(0, 0, button.bitmap.getWidth(), button.bitmap.getHeight());\r\n\t\t\tposition = new Rect(button.position.left, button.position.top, button.position.right, button.position.bottom);\r\n\t\t}\r\n\t\tfinal Button button;\r\n\t\tint startX;\r\n\t\tint startY;\r\n\t\tfinal Rect sourceBitmapRect;\r\n\t\tRect startRect;\r\n\t\tRect position;\r\n\t}\r\n\t\r\n\tclass ButtonEditorView extends SurfaceView implements Callback {\r\n\r\n\t\tpublic ButtonEditorView(Context context) {\r\n\t\t\tsuper(context);\r\n\t\t\tsetWillNotDraw(false);\r\n\t\t\tgetHolder().addCallback(this);\r\n\t\t\t\r\n\t\t\tscaleDetector = new ScaleGestureDetector(ButtonLayoutEditor.this, new ScaleListener());\r\n\t\t}\r\n\t\t\r\n\t\tfinal ScaleGestureDetector scaleDetector;\r\n\t\t\r\n\t\tclass ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {\r\n\t\t\t\r\n\t\t\t@Override\r\n\t\t\tpublic boolean onScaleBegin(ScaleGestureDetector detector) {\r\n\t\t\t\tint x = (int)detector.getFocusX();\r\n\t\t\t\tint y = (int)detector.getFocusY();\r\n\t\t\t\tfor(Editing button : buttons) {\r\n\t\t\t\t\tif(button.position.contains(x, y)) {\r\n\t\t\t\t\t\tscaling = button;\r\n\t\t\t\t\t\tinvalidate();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\thandledScaleEvent = true;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t@Override\r\n\t\t\tpublic boolean onScale(ScaleGestureDetector detector) {\r\n\t\t\t\tif(scaling == null)\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t//Log.i(MainActivity.TAG, \"Scale factor: \" + detector.getScaleFactor());\r\n\t\t\t\t\r\n\t\t\t\tfinal int scaleX = (int) (scaling.position.width() * (detector.getScaleFactor() - 1.0f));\r\n\t\t\t\tfinal int scaleY = (int) (scaling.position.height() * (detector.getScaleFactor() - 1.0f));\r\n\t\t\t\t//TODO: weigh the initial spot\r\n\t\t\t\tscaling.position.left -= (scaleX / 2);\r\n\t\t\t\tscaling.position.right += (scaleX / 2);\r\n\t\t\t\tscaling.position.top -= (scaleY / 2);\r\n\t\t\t\tscaling.position.bottom += (scaleY / 2);\r\n\t\t\t\tinvalidate();\r\n\t\t\t\thandledScaleEvent = true;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t@Override\r\n\t\t\tpublic void onScaleEnd(ScaleGestureDetector detector) {\r\n\t\t\t\tscaling = null;\r\n\t\t\t\thandledScaleEvent = true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tfinal ArrayList<Editing> buttons = new ArrayList<Editing>();\r\n\t\tboolean landscape;\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {\r\n\t\t\t\r\n\t\t\tlandscape = width > height;\r\n\t\t\tboolean is565 = format == PixelFormat.RGB_565;\r\n\t\t\t\r\n\t\t\tfor(int i = 0 ; i < buttonsToLoad.length ; ++i) {\r\n\t\t\t\tfinal int id = buttonsToLoad[i];\r\n\t\t\t\tfinal Button button = Button.load(ButtonLayoutEditor.this, id, buttonResIds[i], \r\n\t\t\t\t\t\tlandscape, is565, new Rect(0, 0, width, height), landscape ? Controls.defaultLandSpace : Controls.defaultPortSpace, true);\r\n\t\t\t\t\r\n\t\t\t\tif(savedValues != null) {\r\n\t\t\t\t\tfinal Object saved = savedValues.get(Button.getButtonName(id));\r\n\t\t\t\t\tif(saved != null && saved instanceof Rect) \r\n\t\t\t\t\t\tbutton.position = (Rect)saved;\r\n\t\t\t\t}\r\n\t\t\t\tbuttons.add(new Editing(button));\r\n\t\t\t}\r\n\t\t\tsavedValues = null;\r\n\t\t\tinvalidate();\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic void onDraw(Canvas canvas) {\r\n\t\t\tfor(Editing button : buttons) {\r\n\t\t\t\tif(button.button.bitmap != null)\r\n\t\t\t\t\tcanvas.drawBitmap(button.button.bitmap, button.sourceBitmapRect, button.position, null);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic void surfaceCreated(SurfaceHolder holder) {\r\n\t\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic void surfaceDestroyed(SurfaceHolder holder) {\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\tfinal HashMap<Integer, Editing> editing = new HashMap<Integer, Editing>();\r\n\t\tEditing scaling = null;\r\n\t\tboolean handledScaleEvent = false;\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic boolean onTouchEvent(MotionEvent event) {\r\n\t\t\tscaleDetector.onTouchEvent(event);\r\n\t\t\tif(handledScaleEvent) {\r\n\t\t\t\thandledScaleEvent = false;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\tint i = event.getActionIndex();\r\n\t\t\tint id = event.getPointerId(i);\r\n\t\t\tint x = (int) event.getX(i);\r\n\t\t\tint y = (int) event.getY(i);\r\n\t\t\tfinal Editing edit = editing.get(id);\r\n\t\t\tswitch(event.getActionMasked()) {\r\n\t\t\tcase MotionEvent.ACTION_DOWN:\r\n\t\t\tcase MotionEvent.ACTION_POINTER_DOWN:\r\n\t\t\t\tfor(Editing button : buttons) {\r\n\t\t\t\t\tif(button.position.contains(x, y)) {\r\n\t\t\t\t\t\tbutton.startX = x;\r\n\t\t\t\t\t\tbutton.startY = y;\r\n\t\t\t\t\t\tbutton.startRect = new Rect(button.position.left, button.position.top, button.position.right, button.position.bottom);\r\n\t\t\t\t\t\tediting.put(id, button);\r\n\t\t\t\t\t\tinvalidate();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase MotionEvent.ACTION_MOVE:\r\n\t\t\tcase MotionEvent.ACTION_UP:\r\n\t\t\t\tif(edit != null) {\r\n\t\t\t\t\tfinal int deltaX = x - edit.startX;\r\n\t\t\t\t\tfinal int deltaY = y - edit.startY;\r\n\t\t\t\t\tedit.position.left = edit.startRect.left + deltaX;\r\n\t\t\t\t\tedit.position.right = edit.startRect.right + deltaX;\r\n\t\t\t\t\tedit.position.top = edit.startRect.top + deltaY;\r\n\t\t\t\t\tedit.position.bottom = edit.startRect.bottom + deltaY;\r\n\t\t\t\t\tif(event.getActionMasked() == MotionEvent.ACTION_UP) {\r\n\t\t\t\t\t\tediting.remove(id);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tinvalidate();\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase MotionEvent.ACTION_CANCEL:\r\n\t\t\t\tif(edit != null)\r\n\t\t\t\t\tediting.remove(edit);\r\n\t\t\t\tinvalidate();\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/Cheats.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\nimport android.app.Activity;\r\nimport android.app.AlertDialog;\r\nimport android.app.Dialog;\r\nimport android.content.DialogInterface;\r\nimport android.content.DialogInterface.OnClickListener;\r\nimport android.os.Bundle;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.view.ViewGroup;\r\nimport android.widget.BaseAdapter;\r\nimport android.widget.Button;\r\nimport android.widget.CheckBox;\r\nimport android.widget.CompoundButton;\r\nimport android.widget.CompoundButton.OnCheckedChangeListener;\r\nimport android.widget.FrameLayout;\r\nimport android.widget.ListView;\r\nimport android.widget.TextView;\r\n\r\npublic class Cheats extends Activity {\r\n\r\n\t@Override\r\n\tpublic void onCreate(Bundle savedInstanceState) {\r\n\t\tsuper.onCreate(savedInstanceState);\r\n\t\t\r\n\t\tsetContentView(R.layout.cheats);\r\n\t\t\r\n\t\tinflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);\r\n\t\t\r\n\t\tcheatList = (ListView) findViewById(R.id.cheatList);\r\n\t\tcheatList.setAdapter(adapter = new CheatAdapter());\r\n\t\t\r\n\t\tfinal android.widget.Button addButton = (android.widget.Button)findViewById(R.id.addcheat);\r\n\t\taddButton.setOnClickListener(new android.view.View.OnClickListener() {\r\n\t\t\t\r\n\t\t\t@Override\r\n\t\t\tpublic void onClick(View v) {\r\n\t\t\t\tcurrentlyEditing = -1;\r\n\t\t\t\tshowEditDialog();\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\tCheatAdapter adapter = null;\r\n\tListView cheatList = null;\r\n\tLayoutInflater inflater;\r\n\tint currentlyEditing = -1;\r\n\tTextView editingDescription, editingCode;\r\n\tboolean editingCheckedState = false;\r\n\t\r\n\tvoid showEditDialog() {\r\n\t\tfinal AlertDialog.Builder builder = new AlertDialog.Builder(this);\r\n\t\tView cheatEditView;\r\n\t\tfinal AlertDialog dialog = builder.setPositiveButton(R.string.OK, new OnClickListener() {\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\t\t\tif(currentlyEditing == -1) \r\n\t\t\t\t\tDeSmuME.addCheat(editingDescription.getText().toString(), editingCode.getText().toString());\r\n\t\t\t\telse\r\n\t\t\t\t\tDeSmuME.updateCheat(editingDescription.getText().toString(), editingCode.getText().toString(), currentlyEditing);\r\n\t\t\t\tDeSmuME.saveCheats();\r\n\t\t\t\tadapter.notifyDataSetChanged();\r\n\t\t\t\tdialog.dismiss();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}).setNegativeButton(R.string.cancel, new OnClickListener() {\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\t\t\tdialog.dismiss();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}).setView(cheatEditView = inflater.inflate(R.layout.cheatedit, null)).create();\r\n\t\t\r\n\t\teditingDescription = (TextView) cheatEditView.findViewById(R.id.cheatDesc);\r\n\t\teditingCode = (TextView) cheatEditView.findViewById(R.id.cheatCode);\r\n\t\t\r\n\t\tif(currentlyEditing != -1) {\r\n\t\t\t\r\n\t\t\teditingDescription.setText(DeSmuME.getCheatName(currentlyEditing));\r\n\t\t\teditingCode.setText(DeSmuME.getCheatCode(currentlyEditing));\r\n\t\t}\r\n\t\tdialog.show();\r\n\t}\r\n\t\r\n\tclass CheatAdapter extends BaseAdapter {\r\n\r\n\t\t@Override\r\n\t\tpublic int getCount() {\r\n\t\t\treturn DeSmuME.getNumberOfCheats();\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic Object getItem(int position) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic long getItemId(int position) {\r\n\t\t\treturn position;\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\r\n\t\t\tif(convertView == null) {\r\n\t\t\t\tconvertView = inflater.inflate(R.layout.cheatrow, null);\r\n\t\t\t\tfinal android.widget.Button edit = (Button) convertView.findViewById(R.id.cheatEdit);\r\n\t\t\t\tfinal android.widget.Button delete = (Button) convertView.findViewById(R.id.cheatDelete);\r\n\t\t\t\tedit.setOnClickListener(new android.view.View.OnClickListener() {\r\n\r\n\t\t\t\t\t@Override\r\n\t\t\t\t\tpublic void onClick(View v) {\r\n\t\t\t\t\t\tfinal Object tag = v.getTag();\r\n\t\t\t\t\t\tif(tag != null && tag instanceof Integer) {\r\n\t\t\t\t\t\t\tcurrentlyEditing = (Integer)tag;\r\n\t\t\t\t\t\t\tshowEditDialog();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\r\n\t\t\t\t});\r\n\t\t\t\tdelete.setOnClickListener(new android.view.View.OnClickListener() {\r\n\t\t\t\t\t\r\n\t\t\t\t\t@Override\r\n\t\t\t\t\tpublic void onClick(View v) {\r\n\t\t\t\t\t\tfinal Object tag = v.getTag();\r\n\t\t\t\t\t\tif(tag != null && tag instanceof Integer) {\r\n\t\t\t\t\t\t\tDeSmuME.deleteCheat((Integer)tag);\r\n\t\t\t\t\t\t\tnotifyDataSetChanged();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfinal CheckBox cheatEnabled = (CheckBox) convertView.findViewById(R.id.cheatEnabled);\r\n\t\t\tcheatEnabled.setText(DeSmuME.getCheatName(position));\r\n\t\t\teditingCheckedState = true;\r\n\t\t\tcheatEnabled.setChecked(DeSmuME.getCheatEnabled(position));\r\n\t\t\teditingCheckedState = false; //dunno if we need to do this or not\r\n\t\t\tcheatEnabled.setOnCheckedChangeListener(new OnCheckedChangeListener() {\r\n\r\n\t\t\t\t@Override\r\n\t\t\t\tpublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\r\n\t\t\t\t\tif(editingCheckedState)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tfinal Object tag = buttonView.getTag();\r\n\t\t\t\t\tif(tag != null && tag instanceof Integer)\r\n\t\t\t\t\t\tDeSmuME.setCheatEnabled((Integer)tag, isChecked);\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t});\r\n\t\t\tcheatEnabled.setTag(Integer.valueOf(position));\r\n\t\t\t\r\n\t\t\tfinal android.widget.Button edit = (Button) convertView.findViewById(R.id.cheatEdit);\r\n\t\t\tedit.setTag(Integer.valueOf(position));\r\n\t\t\tedit.setEnabled(DeSmuME.getCheatType(position) == 1); //only support editing AR codes for now\r\n\t\t\t\r\n\t\t\tfinal android.widget.Button delete = (Button) convertView.findViewById(R.id.cheatDelete);\r\n\t\t\tdelete.setTag(Integer.valueOf(position));\r\n\t\t\t\r\n\t\t\treturn convertView;\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void onStop() {\r\n\t\tsuper.onStop();\r\n\t\tDeSmuME.saveCheats();\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/Controls.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\nCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.Iterator;\r\nimport java.util.LinkedList;\r\nimport java.util.Map.Entry;\r\n\r\nimport com.opendoorstudios.ds4droid.MainActivity.NDSView;\r\n\r\nimport android.content.Context;\r\nimport android.content.SharedPreferences;\r\nimport android.graphics.Canvas;\r\nimport android.graphics.Paint;\r\nimport android.graphics.Rect;\r\nimport android.preference.PreferenceManager;\r\nimport android.util.SparseArray;\r\nimport android.util.SparseIntArray;\r\nimport android.view.HapticFeedbackConstants;\r\nimport android.view.KeyEvent;\r\nimport android.view.MotionEvent;\r\n\r\nclass Controls {\r\n\t\r\n\tfloat xscale = 0, yscale = 0;\r\n\tfinal Paint controlsPaint = new Paint();\r\n\tNDSView view;\r\n\tboolean landscape;\r\n\tint currentAlpha = -1;\r\n\tRect screen;\r\n\tint screenWidth = 0, screenHeight = 0;\r\n\tint xBlack = 0, yBlack = 0;\r\n\t\r\n\tControls(NDSView view) {\r\n\t\tthis.view = view;\r\n\t}\r\n\t\r\n\tpublic void setView(NDSView view) {\r\n\t\tthis.view = view;\r\n\t}\r\n\t\r\n\tButton touchButton;\r\n\t//Button fastForwardButton;\r\n\tButton optionsButton;\r\n\t\r\n\tfinal SparseArray<int[]> keyMappings = new SparseArray<int[]>();\r\n\t\r\n\tpublic static final int[] KEYS_WITH_MAPPINGS = new int[] { Button.BUTTON_UP, Button.BUTTON_DOWN, Button.BUTTON_LEFT, Button.BUTTON_RIGHT,\r\n\t\t\tButton.BUTTON_A, Button.BUTTON_B, Button.BUTTON_X, Button.BUTTON_Y, Button.BUTTON_START, Button.BUTTON_SELECT,\r\n\t\t\tButton.BUTTON_TOUCH, Button.BUTTON_L, Button.BUTTON_R, Button.BUTTON_OPTIONS };\r\n\t\r\n\tvoid loadMappings(Context context) {\r\n\t\tkeyMappings.clear();\r\n\t\t\r\n\t\tfinal HashMap<Integer, LinkedList<Integer>> buildKey = new HashMap<Integer, LinkedList<Integer>>();\r\n\t\t\r\n\t\tfinal SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\r\n\t\tfor(int id : KEYS_WITH_MAPPINGS) {\r\n\t\t\tint map = prefs.getInt(\"Controls.KeyMap.\" + Button.getButtonName(id), 0);\r\n\t\t\tif(map != 0) {\r\n\t\t\t\tif(!buildKey.containsKey(map))\r\n\t\t\t\t\tbuildKey.put(map, new LinkedList<Integer>());\r\n\t\t\t\tbuildKey.get(map).add(id);\r\n\t\t\t}\t\r\n\t\t}\r\n\t\t\r\n\t\t//iterating over hashmaps is like 10x more complicated than it needs to be\r\n\t\tfinal Iterator<Entry<Integer, LinkedList<Integer>>> it = buildKey.entrySet().iterator();\r\n\t\twhile(it.hasNext()) {\r\n\t\t\tfinal Entry<Integer, LinkedList<Integer>> entry = it.next();\r\n\t\t\tfinal int[] thisKeysMappings = new int[entry.getValue().size()];\r\n\t\t\tint counter = 0;\r\n\t\t\tfor(Integer mapping : entry.getValue()) \r\n\t\t\t\tthisKeysMappings[counter++] = mapping.intValue();\r\n\t\t\tkeyMappings.put(entry.getKey(), thisKeysMappings);\r\n\t\t}\r\n\r\n\t}\r\n\t\r\n\tvoid loadControls(Context context, int screenWidth, int screenHeight, int xBlack, int yBlack, int screenOption, boolean is565, boolean landscape) {\r\n\t\t\r\n\t\tscreen = new Rect(0, 0, this.screenWidth = screenWidth, this.screenHeight = screenHeight);\r\n\t\t\r\n\t\tthis.xBlack = xBlack;\r\n\t\tthis.yBlack = yBlack;\r\n\t\txscale = (float)(screen.width() - (xBlack * 2)) / (screenOption == 0 ? (landscape ? 512.0f : 256.0f) : 256.0f);\r\n\t\tyscale = (float)(screen.height() - (yBlack*2)) / (screenOption == 0 ? (landscape ? 192.0f : 384.0f) : 192.0f);\r\n\t\t\r\n\t\tfor(int i = 0 ; i < buttonStates.length ; ++i)\r\n\t\t\tbuttonStates[i] = 0;\r\n\t\t\r\n\t\tbuttonsToDraw.clear();\r\n\t\tbuttonsToProcess.clear();\r\n\t\tactiveTouches.clear();\r\n\t\t\r\n\t\tthis.landscape = landscape;\r\n\t\t\r\n\t\tfinal Rect space = landscape ? defaultLandSpace : defaultPortSpace;\r\n\t\t\r\n\t\tfinal Button l = Button.load(context, Button.BUTTON_L, R.drawable.l, landscape, is565, screen, space, false);\r\n\t\tif(l.bitmap != null) {\r\n\t\t\tbuttonsToDraw.add(l);\r\n\t\t\tbuttonsToProcess.add(l);\r\n\t\t}\r\n\t\t\r\n\t\tfinal Button r = Button.load(context, Button.BUTTON_R, R.drawable.r, landscape, is565, screen, space, false);\r\n\t\tif(r.bitmap != null) {\r\n\t\t\tbuttonsToDraw.add(r);\r\n\t\t\tbuttonsToProcess.add(r);\r\n\t\t}\r\n\t\t\r\n\t\ttouchButton = Button.load(context, Button.BUTTON_TOUCH, R.drawable.touch, landscape, is565, screen, space, false);\r\n\t\tif(touchButton.bitmap != null) \r\n\t\t\tbuttonsToDraw.add(touchButton);\r\n\t\t\r\n\t\t\r\n\t\tfinal Button start = Button.load(context, Button.BUTTON_START, R.drawable.start, landscape, is565, screen, space, false);\r\n\t\tif(start.bitmap != null) {\r\n\t\t\tbuttonsToDraw.add(start);\r\n\t\t\tbuttonsToProcess.add(start);\r\n\t\t}\r\n\t\t\r\n\t\tfinal Button select = Button.load(context, Button.BUTTON_SELECT, R.drawable.select, landscape, is565, screen, space, false);\r\n\t\tif(select.bitmap != null) {\r\n\t\t\tbuttonsToDraw.add(select);\r\n\t\t\tbuttonsToProcess.add(select);\r\n\t\t}\r\n\t\t\r\n\t\t/*\r\n\t\tfastForwardButton = Button.load(context, Button.BUTTON_FASTFORWARD, R.drawable.ff, landscape, is565, space, space, false);\r\n\t\tif(fastForwardButton.bitmap != null) \r\n\t\t\tbuttonsToDraw.add(fastForwardButton);\r\n\t\t*/\r\n\t\t\r\n\t\toptionsButton = Button.load(context, Button.BUTTON_OPTIONS, R.drawable.menu, landscape, is565, screen, space, false);\r\n\t\tif(optionsButton.bitmap != null)\r\n\t\t\tbuttonsToDraw.add(optionsButton);\r\n\t\t\r\n\t\tfinal Button dpad = Button.load(context, Button.BUTTON_DPAD, R.drawable.dpad, landscape, is565, screen, space, false);\r\n\t\tif(dpad.bitmap != null) {\r\n\t\t\tbuttonsToDraw.add(dpad);\r\n\t\t\t\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.334f, 0.0f, 0.647f, 0.353f), Button.BUTTON_UP));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.631f, 0.35f, 0.973f, 0.643f), Button.BUTTON_RIGHT));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.0f, 0.35f, 0.356f, 0.643f), Button.BUTTON_LEFT));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.334f, 0.643f, 0.647f, 1.0f), Button.BUTTON_DOWN));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.026f, 0.047f, 0.344f, 0.334f), Button.BUTTON_UPLEFT));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.64f, 0.047f, 0.862f, 0.334f), Button.BUTTON_UPRIGHT));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.026f, 0.65f, 0.344f, 0.926f), Button.BUTTON_DOWNLEFT));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(dpad.position, 0.64f, 0.65f, 0.862f, 0.926f), Button.BUTTON_DOWNRIGHT));\r\n\t\t}\r\n\t\t\r\n\t\tfinal Button abxy = Button.load(context, Button.BUTTON_ABXY, R.drawable.abxy, landscape, is565, screen, space, false);\r\n\t\tif(abxy.bitmap != null) {\r\n\t\t\tbuttonsToDraw.add(abxy);\r\n\t\t\t\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(abxy.position, 0.317f, 0.0f, 0.676f, 0.378f), Button.BUTTON_X));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(abxy.position, 0.662f, 0.293f, 1.0f, 0.681f), Button.BUTTON_A));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(abxy.position, 0.317f, 0.611f, 0.676f, 1.0f), Button.BUTTON_B));\r\n\t\t\tbuttonsToProcess.add(new Button(getRatioRect(abxy.position, 0.0f, 0.293f, 0.334f, 0.681f), Button.BUTTON_Y));\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n\tstatic Rect getRatioRect(Rect base, float left, float top, float right, float bottom) {\r\n\t\tfinal int width = base.width();\r\n\t\tfinal int height = base.height();\r\n\t\treturn new Rect(\r\n\t\t\t\t(int)(base.left + (width * left)),\r\n\t\t\t\t(int)(base.top + (height * top)),\r\n\t\t\t\t(int)(base.left + (width * right)),\r\n\t\t\t\t(int)(base.top + (height * bottom))\r\n\t\t\t\t);\r\n\t}\r\n\t\r\n\t\r\n\t//These coordinates are in our \"native\" coordinate space, which was arbitrarily chosen to be 768x1152 (exactly three times the DS native resolution)\r\n\tpublic static final Rect defaultPortSpace = new Rect(0, 0, 768, 1152);\r\n\tpublic static final Rect defaultLandSpace = new Rect(0, 0, 1152, 768);\r\n\t\r\n\t\r\n\t//These are the final on/off values that will get sent to the emulator.\r\n\t//They go from BUTTON_RIGHT to BUTTON_SELECT\r\n\tfinal int[] buttonStates = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\r\n\t\r\n\t//This map goes from pointer id (from the android os) to the different buttons we have\r\n\tfinal SparseArray<Button> activeTouches = new SparseArray<Button>(); \r\n\t\r\n\tfinal ArrayList<Button> buttonsToDraw = new ArrayList<Button>();\r\n\tfinal ArrayList<Button> buttonsToProcess = new ArrayList<Button>();\r\n\t\r\n\tboolean touchScreenProcess(MotionEvent event) {\r\n\t\tswitch(event.getAction()) {\r\n\t\tcase MotionEvent.ACTION_DOWN:\r\n\t\tcase MotionEvent.ACTION_MOVE:\r\n\t\t\tfloat x = event.getX();\r\n\t\t\tfloat y = event.getY();\r\n\t\t\tif( x < xBlack || x > screenWidth - xBlack)\r\n\t\t\t\treturn true;\r\n\t\t\tif( y < yBlack || y > screenHeight - yBlack)\r\n\t\t\t\treturn true;\r\n\t\t\tx -= xBlack;\r\n\t\t\ty -= yBlack;\r\n\t\t\tx /= xscale;\r\n\t\t\ty /= yscale;\r\n\t\t\t//convert to bottom touch screen coordinates\r\n\t\t\tif(landscape && view.dontRotate) {\r\n\t\t\t\tfinal float newy = x / 1.33f;\r\n\t\t\t\tfinal float newx = (192 - y) * 1.33f;\r\n\t\t\t\tx = newx;\r\n\t\t\t\ty = newy;\r\n\t\t\t}\r\n\t\t\tif(landscape && !view.dontRotate) {\r\n\t\t\t\tif(!view.lcdSwap) {\r\n\t\t\t\t\tif(view.screenOption != 2) // 2 is \"touch only\"\r\n\t\t\t\t\t\tx -= 256;\r\n\t\t\t\t\tif(x >= 0)\r\n\t\t\t\t\t\tDeSmuME.touchScreenTouch((int)x, (int)y);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif(x < 256)\r\n\t\t\t\t\t\tDeSmuME.touchScreenTouch((int)x, (int)y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif(!view.lcdSwap) {\r\n\t\t\t\t\tif(view.screenOption != 2) // 2 is \"touch only\"\r\n\t\t\t\t\t\ty -= 192;\r\n\t\t\t\t\tif(y >= 0)\r\n\t\t\t\t\t\tDeSmuME.touchScreenTouch((int)x, (int)y);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif(y < 192)\r\n\t\t\t\t\t\tDeSmuME.touchScreenTouch((int)x, (int)y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\r\n\t\t\tbreak;\r\n\t\tcase MotionEvent.ACTION_UP:\r\n\t\tcase MotionEvent.ACTION_CANCEL:\r\n\t\t\tDeSmuME.touchScreenRelease();\r\n\t\t\tif(touchButton.bitmap != null && !view.forceTouchScreen && touchButton.position.contains((int)event.getX(), (int)event.getY())) {\r\n\t\t\t\tDeSmuME.touchScreenMode = false;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\t\t\r\n\t}\r\n\t\r\n\tboolean onTouchEvent(MotionEvent event) {\r\n\t\tif(xscale == 0 || yscale == 0)\r\n\t\t\treturn false;\r\n\t\tif(DeSmuME.touchScreenMode || view.forceTouchScreen) \r\n\t\t\treturn touchScreenProcess(event);\t\r\n\t\telse\r\n\t\t{\r\n\t\t\tswitch(event.getActionMasked()) {\r\n\t\t\tcase MotionEvent.ACTION_DOWN:\r\n\t\t\tcase MotionEvent.ACTION_POINTER_DOWN:\r\n\t\t\tcase MotionEvent.ACTION_MOVE:\r\n\t\t\t{\r\n\t\t\t\tint i = event.getActionIndex();\r\n\t\t\t\tint id = event.getPointerId(i);\r\n\t\t\t\t\r\n\t\t\t\tfinal Button existingTouch = activeTouches.get(id);\r\n\t\t\t\tif(existingTouch != null) {\r\n\t\t\t\t\t//reset touch, it may get re-set below but we need to deal with sliding off a button\r\n\t\t\t\t\texistingTouch.apply(buttonStates, false);\r\n\t\t\t\t}\r\n\t\t\t\tint x = (int) event.getX(i);\r\n\t\t\t\tint y = (int) event.getY(i);\r\n\t\t\t\t\r\n\t\t\t\tboolean pressedButton = false;\r\n\t\t\t\tfor(Button process : buttonsToProcess) {\r\n\t\t\t\t\tif(process.position.contains(x, y)) {\r\n\t\t\t\t\t\tprocess.apply(buttonStates, true);\r\n\t\t\t\t\t\tactiveTouches.put(id, process);\r\n\t\t\t\t\t\tif(view.haptic && (event.getActionMasked() != MotionEvent.ACTION_MOVE))\r\n\t\t\t\t\t\t\tview.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);\r\n\t\t\t\t\t\tpressedButton = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t/*\r\n\t\t\t\tif(fastForwardButton.bitmap != null && fastForwardButton.position.contains(x, y))\r\n\t\t\t\t\tDeSmuME.fastForwardMode = true;\r\n\t\t\t\t*/\r\n\t\t\t\t\r\n\t\t\t\tif(!pressedButton && view.alwaysTouch) \r\n\t\t\t\t\treturn touchScreenProcess(event);\r\n\t\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase MotionEvent.ACTION_UP:\r\n\t\t\tcase MotionEvent.ACTION_POINTER_UP:\r\n\t\t\t\tif(touchButton.bitmap != null && touchButton.position.contains((int)event.getX(), (int)event.getY())) {\r\n\t\t\t\t\tDeSmuME.touchScreenMode = true;\r\n\t\t\t\t\tactiveTouches.clear();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\t/*\r\n\t\t\t\tif(fastForwardButton.bitmap != null && fastForwardButton.position.contains((int)event.getX(), (int)event.getY()))\r\n\t\t\t\t\tDeSmuME.fastForwardMode = false;\r\n\t\t\t\t*/\r\n\t\t\t\tif(view.alwaysTouch)\r\n\t\t\t\t\ttouchScreenProcess(event);\r\n\t\t\t\tif(optionsButton.bitmap != null && optionsButton.position.contains((int)event.getX(), (int)event.getY()))\r\n\t\t\t\t\tview.showMenu();\r\n\t\t\t\t//FT\r\n\t\t\tcase MotionEvent.ACTION_CANCEL:\r\n\t\t\t{\r\n\t\t\t\tint i = event.getActionIndex();\r\n\t\t\t\tint id = event.getPointerId(i);\r\n\t\t\t\tButton button = activeTouches.get(id);\r\n\t\t\t\tif(button == null)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tbutton.apply(buttonStates, false);\r\n\t\t\t\tactiveTouches.remove(id);\r\n\t\t\t\t/*\r\n\t\t\t\tif(fastForwardButton.bitmap != null && fastForwardButton.position.contains((int)event.getX(), (int)event.getY()))\r\n\t\t\t\t\tDeSmuME.fastForwardMode = false;\r\n\t\t\t\t*/\r\n\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tsendStates();\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\t\r\n\tboolean onKeyDown(int keyCode, KeyEvent event) {\r\n\t\tfinal int[] mappings = keyMappings.get(keyCode, null);\r\n\t\tif(mappings == null)\r\n\t\t\treturn false;\r\n\t\tfor(int button : mappings) {\r\n\t\t\tif(button >=0 && button < buttonStates.length)\r\n\t\t\t\tbuttonStates[button] = 1;\r\n\t\t}\r\n\t\tsendStates();\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tboolean onKeyUp(int keyCode, KeyEvent event) {\r\n\t\tfinal int[] mappings = keyMappings.get(keyCode, null);\r\n\t\tif(mappings == null)\r\n\t\t\treturn false;\r\n\t\tfor(int button : mappings) {\r\n\t\t\tif(button >=0 && button < buttonStates.length)\r\n\t\t\t\tbuttonStates[button] = 0;\r\n\t\t\telse if(button == Button.BUTTON_TOUCH)\r\n\t\t\t\tDeSmuME.touchScreenMode = !DeSmuME.touchScreenMode;\r\n\t\t\telse if(button == Button.BUTTON_OPTIONS)\r\n\t\t\t\tview.showMenu();\r\n\t\t}\r\n\t\tsendStates();\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tvoid sendStates() {\r\n\t\tDeSmuME.setButtons(buttonStates[Button.BUTTON_L], buttonStates[Button.BUTTON_R], buttonStates[Button.BUTTON_UP], buttonStates[Button.BUTTON_DOWN], buttonStates[Button.BUTTON_LEFT], buttonStates[Button.BUTTON_RIGHT], \r\n\t\t\t\tbuttonStates[Button.BUTTON_A], buttonStates[Button.BUTTON_B], buttonStates[Button.BUTTON_X], buttonStates[Button.BUTTON_Y], \r\n\t\t\t\tbuttonStates[Button.BUTTON_START], buttonStates[Button.BUTTON_SELECT], DeSmuME.lidOpen ? 1 : 0);\r\n\r\n\t}\r\n\t\r\n\tvoid drawControls(Canvas canvas) {\r\n\t\tif(view.forceTouchScreen)\r\n\t\t\treturn;\r\n\t\tif(currentAlpha != view.buttonAlpha)\r\n\t\t\tcontrolsPaint.setAlpha(currentAlpha = view.buttonAlpha);\r\n\t\tif(DeSmuME.touchScreenMode) {\r\n\t\t\tif(touchButton.bitmap != null)\r\n\t\t\t\tcanvas.drawBitmap(touchButton.bitmap, touchButton.position.left, touchButton.position.top, controlsPaint);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tfor(Button button : buttonsToDraw)  {\r\n\t\t\t\tif(button.bitmap != null && button.position != null)\r\n\t\t\t\t\tcanvas.drawBitmap(button.bitmap, button.position.left, button.position.top, controlsPaint);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/DeSmuME.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport android.content.Context;\r\nimport android.content.SharedPreferences;\r\nimport android.graphics.Bitmap;\r\nimport android.preference.PreferenceManager;\r\nimport android.util.Log;\r\n\r\nclass DeSmuME {\r\n\t\r\n\tpublic static Context context;\r\n\t\r\n\tstatic boolean loaded = false;\r\n\t\r\n\tstatic final int CPUTYPE_COMPAT =  0;\r\n\tstatic final int CPUTYPE_V7 = 1;\r\n\tstatic final int CPUTYPE_NEON = 2;\r\n\t\r\n\tstatic void load()\r\n\t{\r\n\t\tif(loaded)\r\n\t\t\treturn;\r\n\t\tSystem.loadLibrary(\"cpudetect\");\r\n\t\tfinal int cpuType = getCPUType();\r\n\t\tswitch(cpuType) {\r\n\t\tcase CPUTYPE_NEON:\r\n\t\t\tSystem.loadLibrary(\"desmumeneon\");\r\n\t\t\tLog.i(MainActivity.TAG, \"Using NEON enhanced native library\");\r\n\t\t\tbreak;\r\n\t\tcase CPUTYPE_V7:\r\n\t\t\tSystem.loadLibrary(\"desmumev7\");\r\n\t\t\tLog.i(MainActivity.TAG, \"Using ARMv7 native library\");\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tSystem.loadLibrary(\"desmumecompat\");\r\n\t\t\tLog.i(MainActivity.TAG, \"Using compatibility native library\");\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tloaded = true;\r\n\t}\r\n\t\r\n\tstatic native int getCPUType();\r\n\tstatic native int getCPUFamily();\r\n\tstatic native void init();\r\n\tstatic native void runCore();\r\n\tstatic native void resize(Bitmap bitmap);\r\n\tstatic native int draw(Bitmap bitmapMain, Bitmap bitmapTouch, boolean rotate);\r\n\tstatic native void touchScreenTouch(int x, int y);\r\n\tstatic native void touchScreenRelease();\r\n\tstatic native void setButtons(int l, int r, int up, int down, int left, int right, int a, int b, int x, int y, int start, int select, int lid);\r\n\tstatic native boolean loadRom(String path);\r\n\tstatic native void setWorkingDir(String path, String temp);\r\n\tstatic native void saveState(int slot);\r\n\tstatic native void restoreState(int slot);\r\n\tstatic native void loadSettings();\r\n\tstatic native int getNativeWidth();\r\n\tstatic native int getNativeHeight();\r\n\tstatic native void setFilter(int index);\r\n\tstatic native void change3D(int set);\r\n\tstatic native void changeSound(int set);\r\n\tstatic native void setSoundPaused(int set);\r\n\tstatic native void reloadFirmware();\r\n\tstatic native int getNumberOfCheats();\r\n\tstatic native String getCheatName(int pos);\r\n\tstatic native boolean getCheatEnabled(int pos);\r\n\tstatic native String getCheatCode(int pos);\r\n\tstatic native int getCheatType(int pos);\r\n\tstatic native void addCheat(String description, String code);\r\n\tstatic native void updateCheat(String description, String code, int pos);\r\n\tstatic native void saveCheats();\r\n\tstatic native void setCheatEnabled(int pos, boolean enabled);\r\n\tstatic native void deleteCheat(int pos);\r\n\tstatic native void setMicPaused(int set);\r\n\tstatic native void closeRom();\r\n\tstatic native void exit();\r\n\tstatic native void changeCpuMode(int mode);\r\n\tstatic native void changeSoundSynchMode(int mode);\r\n\t\r\n\tstatic boolean touchScreenMode = false;\r\n\tstatic boolean fastForwardMode = false;\r\n\tstatic boolean inited = false;\r\n\tstatic boolean romLoaded = false;\r\n\tstatic boolean lidOpen = true;\r\n\tstatic String loadedRom = null;\r\n\t\r\n\tpublic static int getSettingInt(String name, int def)\r\n\t{\r\n\t\tSharedPreferences pm = PreferenceManager.getDefaultSharedPreferences(context);\r\n\t\tif(!pm.contains(name))\r\n\t\t\treturn def;\r\n\t\ttry {\r\n\t\t\treturn pm.getInt(name, def);\r\n\t\t}\r\n\t\tcatch(ClassCastException e) {\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tString ret = pm.getString(name, String.valueOf(def));\r\n\t\t\treturn Integer.valueOf(ret);\r\n\t\t}\r\n\t\tcatch(ClassCastException e) {\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tBoolean ret = pm.getBoolean(name, def == 0 ? false : true);\r\n\t\t\treturn ret.booleanValue() ? 1 : 0;\r\n\t\t}\r\n\t\tcatch(ClassCastException e) {\r\n\t\t}\r\n\t\treturn def;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/EmulatorThread.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\nCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport java.io.File;\r\nimport java.util.concurrent.atomic.AtomicBoolean;\r\nimport java.util.concurrent.locks.Lock;\r\nimport java.util.concurrent.locks.ReentrantLock;\r\n\r\nimport android.os.Environment;\r\nimport android.preference.PreferenceManager;\r\n\r\nclass EmulatorThread extends Thread {\r\n\t\r\n\tpublic EmulatorThread(MainActivity activity) {\r\n\t\tsuper(\"EmulatorThread\");\r\n\t\tthis.activity = activity;\r\n\t}\r\n\t\r\n\tpublic void setCurrentActivity(MainActivity activity) {\r\n\t\tthis.activity = activity;\r\n\t}\r\n\t\r\n\tboolean soundPaused = true;\r\n\tboolean frameFinished = false;\r\n\tlong lastDraw = 0;\r\n\tfinal AtomicBoolean finished = new AtomicBoolean(false);\r\n\tfinal AtomicBoolean paused = new AtomicBoolean(false);\r\n\tString pendingRomLoad = null;\r\n\tInteger pending3DChange = null;\r\n\tInteger pendingSoundChange = null;\r\n\tInteger pendingCPUChange = null;\r\n\tInteger pendingSoundSyncModeChange = null;\r\n\t\r\n\tpublic void loadRom(String path) {\r\n\t\tpendingRomLoad = path;\r\n\t\tsynchronized(dormant) {\r\n\t\t\tdormant.notifyAll();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void change3D(int set) {\r\n\t\tpending3DChange = set;\r\n\t}\r\n\t\r\n\tpublic void changeSound(int set) {\r\n\t\tpendingSoundChange = set;\r\n\t}\r\n\t\r\n\tpublic void changeCPUMode(int set) {\r\n\t\tpendingCPUChange = set;\r\n\t}\r\n\t\r\n\tpublic void changeSoundSyncMode(int set) {\r\n\t\tpendingSoundSyncModeChange = set;\r\n\t}\r\n\t\r\n\tpublic void setCancel(boolean set) {\r\n\t\tfinished.set(set);\r\n\t\tsynchronized(dormant) {\r\n\t\t\tdormant.notifyAll();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void setPause(boolean set) {\r\n\t\tpaused.set(set);\r\n\t\tif(DeSmuME.inited) {\r\n\t\t\tDeSmuME.setSoundPaused(set ? 1 : 0);\r\n\t\t\tDeSmuME.setMicPaused(set ? 1 : 0);\r\n\t\t\tsoundPaused = set;\r\n\t\t}\r\n\t\tsynchronized(dormant) {\r\n\t\t\tdormant.notifyAll();\r\n\t\t}\r\n\t}\r\n\t\r\n\tObject dormant = new Object();\r\n\t\r\n\tpublic Lock inFrameLock = new ReentrantLock();\r\n\tint fps = 1;\r\n\tMainActivity activity = null;\r\n\tlong frameCounter = 0;\r\n\t\r\n\t@Override\r\n\tpublic void run() {\r\n\t\tif(!DeSmuME.inited) {\r\n\t\t\tDeSmuME.context = activity;\r\n\t\t\tDeSmuME.load();\r\n\t\t\t\r\n\t\t\tfinal String defaultWorkingDir = Environment.getExternalStorageDirectory().getAbsolutePath() + \"/nds4droid\";\r\n\t\t\tfinal String path = PreferenceManager.getDefaultSharedPreferences(activity).getString(Settings.DESMUME_PATH, defaultWorkingDir);\r\n\t\t\tfinal File workingDir = new File(path);\r\n\t\t\tfinal File tempDir = new File(path + \"/Temp\");\r\n\t\t\ttempDir.mkdir();\r\n\t\t\tDeSmuME.setWorkingDir(workingDir.getAbsolutePath(), tempDir.getAbsolutePath() + \"/\");\r\n\t\t\tworkingDir.mkdir();\r\n\t\t\tnew File(path + \"/States\").mkdir();\r\n\t\t\tnew File(path + \"/Battery\").mkdir();\r\n\t\t\tnew File(path + \"/Cheats\").mkdir();\r\n\t\t\t\r\n\t\t\t//clear any previously extracted ROMs\r\n\t\t\t\r\n\t\t\tfinal File[] cacheFiles = tempDir.listFiles();\r\n\t\t\tif(cacheFiles != null) {\r\n\t\t\t\tfor(File cacheFile : cacheFiles) {\r\n\t\t\t\t\tif(cacheFile.getAbsolutePath().toLowerCase().endsWith(\".nds\"))\r\n\t\t\t\t\t\tcacheFile.delete();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tDeSmuME.init();\r\n\t\t\tDeSmuME.inited = true;\r\n\t\t}\r\n\t\t\r\n\t\twhile(!finished.get()) {\r\n\t\t\tif(pendingRomLoad != null) {\r\n\t\t\t\tactivity.msgHandler.sendEmptyMessage(MainActivity.LOADING_START);\r\n\t\t\t\tif(DeSmuME.romLoaded)\r\n\t\t\t\t\tDeSmuME.closeRom();\r\n\t\t\t\tif(!DeSmuME.loadRom(pendingRomLoad)) {\r\n\t\t\t\t\tactivity.msgHandler.sendEmptyMessage(MainActivity.LOADING_END);\r\n\t\t\t\t\tactivity.msgHandler.sendEmptyMessage(MainActivity.ROM_ERROR);\r\n\t\t\t\t\tDeSmuME.romLoaded = false;\r\n\t\t\t\t\tDeSmuME.loadedRom = null;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tactivity.msgHandler.sendEmptyMessage(MainActivity.LOADING_END);\r\n\t\t\t\t\tDeSmuME.romLoaded = true;\r\n\t\t\t\t\tDeSmuME.loadedRom = pendingRomLoad;\r\n\t\t\t\t\tsetPause(false);\r\n\t\t\t\t}\r\n\t\t\t\tpendingRomLoad = null;\r\n\t\t\t}\r\n\t\t\tif(pending3DChange != null) {\r\n\t\t\t\tDeSmuME.change3D(pending3DChange.intValue());\r\n\t\t\t\tpending3DChange = null;\r\n\t\t\t}\r\n\t\t\tif(pendingSoundChange != null) {\r\n\t\t\t\tDeSmuME.changeSound(pendingSoundChange.intValue());\r\n\t\t\t\tpendingSoundChange = null;\r\n\t\t\t}\r\n\t\t\tif(pendingCPUChange != null) {\r\n\t\t\t\tDeSmuME.changeCpuMode(pendingCPUChange.intValue());\r\n\t\t\t\tpendingCPUChange = null;\r\n\t\t\t}\r\n\t\t\tif(pendingSoundSyncModeChange != null) {\r\n\t\t\t\tDeSmuME.changeSoundSynchMode(pendingSoundSyncModeChange.intValue());\r\n\t\t\t\tpendingSoundSyncModeChange = null;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(!paused.get()) {\r\n\t\t\t\t\r\n\t\t\t\tif(soundPaused) {\r\n\t\t\t\t\tDeSmuME.setSoundPaused(0);\r\n\t\t\t\t\tDeSmuME.setMicPaused(0);\r\n\t\t\t\t\tsoundPaused = false;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tinFrameLock.lock();\r\n\t\t\t\tdo {\r\n\t\t\t\t\tDeSmuME.runCore();\r\n\t\t\t\t} while(DeSmuME.fastForwardMode); \r\n\t\t\t\tinFrameLock.unlock();\r\n\t\t\t\tframeFinished = true;\r\n\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\t//hacky, but keeps thread alive so we don't lose contexts\r\n\t\t\t\ttry {\r\n\t\t\t\t\tsynchronized(dormant) {\r\n\t\t\t\t\t\tdormant.wait();\r\n\t\t\t\t\t}\r\n\t\t\t\t} \r\n\t\t\t\tcatch (InterruptedException e) {\r\n\t\t\t\t} \r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/FileDialog.java",
    "content": "package com.opendoorstudios.ds4droid;\n\n/*\n\tCopyright (C) 2012 Jeffrey Quesnelle\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.TreeMap;\n\nimport android.app.AlertDialog;\nimport android.app.ListActivity;\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.view.KeyEvent;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.ListView;\nimport android.widget.SimpleAdapter;\nimport android.widget.TextView;\n\n\n//This originally came from http://code.google.com/p/android-file-dialog/\n\npublic class FileDialog extends ListActivity {\n\t\n\tpublic static class SelectionMode {\n\t\tpublic static final int MODE_CREATE = 0;\n\n\t\tpublic static final int MODE_OPEN = 1;\n\t}\n\n\n\tprivate static final String ITEM_KEY = \"key\";\n\n\n\tprivate static final String ITEM_IMAGE = \"image\";\n\n\n\tprivate static final String ROOT = \"/\";\n\n\n\tpublic static final String START_PATH = \"START_PATH\";\n\n\n\tpublic static final String FORMAT_FILTER = \"FORMAT_FILTER\";\n\n\n\tpublic static final String RESULT_PATH = \"RESULT_PATH\";\n\n\n\tpublic static final String SELECTION_MODE = \"SELECTION_MODE\";\n\n\n\tpublic static final String CAN_SELECT_DIR = \"CAN_SELECT_DIR\";\n\n\tprivate List<String> path = null;\n\tprivate TextView myPath;\n\tprivate EditText mFileName;\n\tprivate ArrayList<HashMap<String, Object>> mList;\n\n\tprivate String parentPath;\n\tprivate String currentPath = ROOT;\n\n\tprivate int selectionMode = SelectionMode.MODE_CREATE;\n\n\tprivate String[] formatFilter = null;\n\n\tprivate boolean canSelectDir = false;\n\n\tprivate File selectedFile;\n\tprivate HashMap<String, Integer> lastPositions = new HashMap<String, Integer>();\n\n\n\t@Override\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetResult(RESULT_CANCELED, getIntent());\n\n\t\tsetContentView(R.layout.file_dialog_main);\n\t\tmyPath = (TextView) findViewById(R.id.path);\n\n\n\t\tselectionMode = getIntent().getIntExtra(SELECTION_MODE, SelectionMode.MODE_CREATE);\n\n\t\tformatFilter = getIntent().getStringArrayExtra(FORMAT_FILTER);\n\n\t\tcanSelectDir = getIntent().getBooleanExtra(CAN_SELECT_DIR, false);\n\n\n\t\tString startPath = getIntent().getStringExtra(START_PATH);\n\t\tstartPath = startPath != null ? startPath : ROOT;\n\t\tif (canSelectDir) {\n\t\t\tFile file = new File(startPath);\n\t\t\tselectedFile = file;\n\t\t}\n\t\tgetDir(startPath);\n\t}\n\n\tprivate void getDir(String dirPath) {\n\n\t\tboolean useAutoSelection = dirPath.length() < currentPath.length();\n\n\t\tInteger position = lastPositions.get(parentPath);\n\n\t\tgetDirImpl(dirPath);\n\n\t\tif (position != null && useAutoSelection) {\n\t\t\tgetListView().setSelection(position);\n\t\t}\n\n\t}\n\n\n\tprivate void getDirImpl(final String dirPath) {\n\n\t\tcurrentPath = dirPath;\n\n\t\tfinal List<String> item = new ArrayList<String>();\n\t\tpath = new ArrayList<String>();\n\t\tmList = new ArrayList<HashMap<String, Object>>();\n\n\t\tFile f = new File(currentPath);\n\t\tFile[] files = f.listFiles();\n\t\tif (files == null) {\n\t\t\tcurrentPath = ROOT;\n\t\t\tf = new File(currentPath);\n\t\t\tfiles = f.listFiles();\n\t\t}\n\t\tStringBuilder pathString = new StringBuilder(getText(R.string.location) + \": \" + currentPath);\n\t\tif(formatFilter != null) {\n\t\t\tif(formatFilter.length > 0) {\n\t\t\t\tpathString.append(\" (\");\n\t\t\t\tfor(int i = 0 ; i < formatFilter.length ; ++i) {\n\t\t\t\t\tpathString.append(formatFilter[i]);\n\t\t\t\t\tif(i != formatFilter.length - 1)\n\t\t\t\t\t\tpathString.append(\", \");\n\t\t\t\t}\n\t\t\t\tpathString.append(\")\");\n\t\t\t}\n\t\t}\n\t\tmyPath.setText(pathString.toString());\n\n\t\tif (!currentPath.equals(ROOT)) {\n\n\t\t\titem.add(ROOT);\n\t\t\taddItem(ROOT, R.drawable.folder);\n\t\t\tpath.add(ROOT);\n\n\t\t\titem.add(\"../\");\n\t\t\taddItem(\"../\", R.drawable.updirectory);\n\t\t\tpath.add(f.getParent());\n\t\t\tparentPath = f.getParent();\n\n\t\t}\n\n\t\tTreeMap<String, String> dirsMap = new TreeMap<String, String>();\n\t\tTreeMap<String, String> dirsPathMap = new TreeMap<String, String>();\n\t\tTreeMap<String, String> filesMap = new TreeMap<String, String>();\n\t\tTreeMap<String, String> filesPathMap = new TreeMap<String, String>();\n\t\tfor (File file : files) {\n\t\t\tif (file.isDirectory()) {\n\t\t\t\tString dirName = file.getName();\n\t\t\t\tdirsMap.put(dirName, dirName);\n\t\t\t\tdirsPathMap.put(dirName, file.getPath());\n\t\t\t} else {\n\t\t\t\tfinal String fileName = file.getName();\n\t\t\t\tfinal String fileNameLwr = fileName.toLowerCase();\n\t\t\t\t\n\t\t\t\tif (formatFilter != null) {\n\t\t\t\t\tboolean contains = false;\n\t\t\t\t\tfor (int i = 0; i < formatFilter.length; i++) {\n\t\t\t\t\t\tfinal String formatLwr = formatFilter[i].toLowerCase();\n\t\t\t\t\t\tif (fileNameLwr.endsWith(formatLwr)) {\n\t\t\t\t\t\t\tcontains = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (contains) {\n\t\t\t\t\t\tfilesMap.put(fileName, fileName);\n\t\t\t\t\t\tfilesPathMap.put(fileName, file.getPath());\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\tfilesMap.put(fileName, fileName);\n\t\t\t\t\tfilesPathMap.put(fileName, file.getPath());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\titem.addAll(dirsMap.tailMap(\"\").values());\n\t\titem.addAll(filesMap.tailMap(\"\").values());\n\t\tpath.addAll(dirsPathMap.tailMap(\"\").values());\n\t\tpath.addAll(filesPathMap.tailMap(\"\").values());\n\n\t\tSimpleAdapter fileList = new SimpleAdapter(this, mList, R.layout.file_dialog_row, new String[] {\n\t\t\t\tITEM_KEY, ITEM_IMAGE }, new int[] { R.id.fdrowtext, R.id.fdrowimage });\n\n\t\tfor (String dir : dirsMap.tailMap(\"\").values()) {\n\t\t\taddItem(dir, R.drawable.folder);\n\t\t}\n\n\t\tfor (String file : filesMap.tailMap(\"\").values()) {\n\t\t\taddItem(file, R.drawable.file);\n\t\t}\n\n\t\tfileList.notifyDataSetChanged();\n\n\t\tsetListAdapter(fileList);\n\n\t}\n\n\tprivate void addItem(String fileName, int imageId) {\n\t\tHashMap<String, Object> item = new HashMap<String, Object>();\n\t\titem.put(ITEM_KEY, fileName);\n\t\titem.put(ITEM_IMAGE, imageId);\n\t\tmList.add(item);\n\t}\n\n\t@Override\n\tprotected void onListItemClick(ListView l, View v, int position, long id) {\n\n\t\tFile file = new File(path.get(position));\n\n\n\t\tif (file.isDirectory()) {\n\t\t\tif (file.canRead()) {\n\t\t\t\tlastPositions.put(currentPath, position);\n\t\t\t\tgetDir(path.get(position));\n\t\t\t\tif (canSelectDir) {\n\t\t\t\t\tselectedFile = file;\n\t\t\t\t\tv.setSelected(true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnew AlertDialog.Builder(this).setIcon(R.drawable.ic_launcher)\n\t\t\t\t\t\t.setTitle(\"[\" + file.getName() + \"] \" + getText(R.string.cant_read_folder))\n\t\t\t\t\t\t.setPositiveButton(\"OK\", new DialogInterface.OnClickListener() {\n\n\t\t\t\t\t\t\t@Override\n\t\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).show();\n\t\t\t}\n\t\t} else {\n\t\t\tselectedFile = file;\n\t\t\tv.setSelected(true);\n\t\t\tgetIntent().putExtra(RESULT_PATH, selectedFile.getPath());\n\t\t\tsetResult(RESULT_OK, getIntent());\n\t\t\tfinish();\n\t\t}\n\t}\n\n\t\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/KeyMapPreference.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n\r\nimport android.content.Context;\r\nimport android.preference.DialogPreference;\r\nimport android.util.AttributeSet;\r\nimport android.util.SparseArray;\r\nimport android.view.KeyEvent;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.view.View.OnKeyListener;\r\nimport android.widget.RelativeLayout;\r\nimport android.widget.TextView;\r\n\r\n/*\r\nCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\npublic class KeyMapPreference extends DialogPreference implements OnKeyListener {\r\n\r\n\tpublic KeyMapPreference(Context context, AttributeSet attrs) {\r\n\t\tsuper(context, attrs);\r\n\t\tcurrentValuePreface = context.getResources().getString(R.string.KeymapValuePreface);\r\n\t}\r\n\t\r\n\tint currentValue;\r\n\tTextView currentValueDesc;\r\n\tfinal String currentValuePreface;\r\n\t\r\n\tstatic String getKeyDesc(int value) {\r\n\t\tif(value == 0)\r\n\t\t\treturn \"(none)\";\r\n\t\telse {\r\n\t\t\tfinal String ret = KEYCODE_SYMBOLIC_NAMES.get(value, \"(none)\");\r\n\t\t\treturn ret == null ? \"(unknown)\" : ret;\r\n\t\t}\r\n\t}\r\n\t\r\n\tvoid sync() {\r\n\t\tcurrentValueDesc.setText(currentValuePreface + \" \" + getKeyDesc(currentValue));\r\n\t}\r\n\t\r\n\t@Override\r\n\tprotected View onCreateDialogView() {\r\n\t\tcurrentValue = getPersistedInt(0);\r\n\t\t\r\n\t\tLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r\n\t\tRelativeLayout layout = (RelativeLayout)inflater.inflate(R.layout.keymap, null);\r\n\t\tlayout.setOnKeyListener(this);\r\n\t\tlayout.requestFocus();\r\n\t\tcurrentValueDesc = (TextView)layout.findViewById(R.id.keymap_value);\r\n\t\tsync();\r\n\t\t\r\n\t\treturn layout;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic CharSequence getSummary() {\r\n\t\tString summary = super.getSummary().toString();\r\n\t\tint value = getPersistedInt(currentValue);\r\n\t\treturn summary + \" \" + getKeyDesc(value);\r\n\t}\r\n\t\r\n\t\r\n\t@Override\r\n\tpublic boolean onKey(View v, int keyCode, KeyEvent event) {\r\n\t\t/*switch(keyCode) {\r\n\t\tcase KeyEvent.KEYCODE_HOME:\r\n\t\tcase KeyEvent.KEYCODE_BACK:\r\n\t\tcase KeyEvent.KEYCODE_SETTINGS:\r\n\t\tcase KeyEvent.KEYCODE_SEARCH:\r\n\t\t\treturn false;\r\n\t\t}*/\r\n\t\tcurrentValue = keyCode;\r\n\t\tsync();\r\n\t\treturn true;\r\n\t};\r\n\t\r\n\t@Override\r\n\tprotected void onDialogClosed(boolean positiveResult) {\r\n\t\tsuper.onDialogClosed(positiveResult);\r\n\r\n\t\tif (!positiveResult) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (shouldPersist()) {\r\n\t\t\tpersistInt(currentValue);\r\n\t\t}\r\n\r\n\t\tnotifyChanged();\r\n\t}\r\n\t\r\n\tstatic {\r\n\t\tKEYCODE_SYMBOLIC_NAMES = new SparseArray<String>();\r\n\t\tpopulateKeycodeSymbolicNames();\r\n\t}\r\n\t\r\n\t//This actually comes straight from the Android source code (android.view.KeyEvent) but it isn't in until ICS\r\n\tprivate static final SparseArray<String> KEYCODE_SYMBOLIC_NAMES;\r\n    private static void populateKeycodeSymbolicNames() {\r\n        SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;\r\n        names.append(KeyEvent.KEYCODE_UNKNOWN, \"UNKNOWN\");\r\n        names.append(KeyEvent.KEYCODE_SOFT_LEFT, \"SOFT_LEFT\");\r\n        names.append(KeyEvent.KEYCODE_SOFT_RIGHT, \"SOFT_RIGHT\");\r\n        names.append(KeyEvent.KEYCODE_HOME, \"HOME\");\r\n        names.append(KeyEvent.KEYCODE_BACK, \"BACK\");\r\n        names.append(KeyEvent.KEYCODE_CALL, \"CALL\");\r\n        names.append(KeyEvent.KEYCODE_ENDCALL, \"ENDCALL\");\r\n        names.append(KeyEvent.KEYCODE_0, \"0\");\r\n        names.append(KeyEvent.KEYCODE_1, \"1\");\r\n        names.append(KeyEvent.KEYCODE_2, \"2\");\r\n        names.append(KeyEvent.KEYCODE_3, \"3\");\r\n        names.append(KeyEvent.KEYCODE_4, \"4\");\r\n        names.append(KeyEvent.KEYCODE_5, \"5\");\r\n        names.append(KeyEvent.KEYCODE_6, \"6\");\r\n        names.append(KeyEvent.KEYCODE_7, \"7\");\r\n        names.append(KeyEvent.KEYCODE_8, \"8\");\r\n        names.append(KeyEvent.KEYCODE_9, \"9\");\r\n        names.append(KeyEvent.KEYCODE_STAR, \"STAR\");\r\n        names.append(KeyEvent.KEYCODE_POUND, \"POUND\");\r\n        names.append(KeyEvent.KEYCODE_DPAD_UP, \"DPAD_UP\");\r\n        names.append(KeyEvent.KEYCODE_DPAD_DOWN, \"DPAD_DOWN\");\r\n        names.append(KeyEvent.KEYCODE_DPAD_LEFT, \"DPAD_LEFT\");\r\n        names.append(KeyEvent.KEYCODE_DPAD_RIGHT, \"DPAD_RIGHT\");\r\n        names.append(KeyEvent.KEYCODE_DPAD_CENTER, \"DPAD_CENTER\");\r\n        names.append(KeyEvent.KEYCODE_VOLUME_UP, \"VOLUME_UP\");\r\n        names.append(KeyEvent.KEYCODE_VOLUME_DOWN, \"VOLUME_DOWN\");\r\n        names.append(KeyEvent.KEYCODE_POWER, \"POWER\");\r\n        names.append(KeyEvent.KEYCODE_CAMERA, \"CAMERA\");\r\n        names.append(KeyEvent.KEYCODE_CLEAR, \"CLEAR\");\r\n        names.append(KeyEvent.KEYCODE_A, \"A\");\r\n        names.append(KeyEvent.KEYCODE_B, \"B\");\r\n        names.append(KeyEvent.KEYCODE_C, \"C\");\r\n        names.append(KeyEvent.KEYCODE_D, \"D\");\r\n        names.append(KeyEvent.KEYCODE_E, \"E\");\r\n        names.append(KeyEvent.KEYCODE_F, \"F\");\r\n        names.append(KeyEvent.KEYCODE_G, \"G\");\r\n        names.append(KeyEvent.KEYCODE_H, \"H\");\r\n        names.append(KeyEvent.KEYCODE_I, \"I\");\r\n        names.append(KeyEvent.KEYCODE_J, \"J\");\r\n        names.append(KeyEvent.KEYCODE_K, \"K\");\r\n        names.append(KeyEvent.KEYCODE_L, \"L\");\r\n        names.append(KeyEvent.KEYCODE_M, \"M\");\r\n        names.append(KeyEvent.KEYCODE_N, \"N\");\r\n        names.append(KeyEvent.KEYCODE_O, \"O\");\r\n        names.append(KeyEvent.KEYCODE_P, \"P\");\r\n        names.append(KeyEvent.KEYCODE_Q, \"Q\");\r\n        names.append(KeyEvent.KEYCODE_R, \"R\");\r\n        names.append(KeyEvent.KEYCODE_S, \"S\");\r\n        names.append(KeyEvent.KEYCODE_T, \"T\");\r\n        names.append(KeyEvent.KEYCODE_U, \"U\");\r\n        names.append(KeyEvent.KEYCODE_V, \"V\");\r\n        names.append(KeyEvent.KEYCODE_W, \"W\");\r\n        names.append(KeyEvent.KEYCODE_X, \"X\");\r\n        names.append(KeyEvent.KEYCODE_Y, \"Y\");\r\n        names.append(KeyEvent.KEYCODE_Z, \"Z\");\r\n        names.append(KeyEvent.KEYCODE_COMMA, \"COMMA\");\r\n        names.append(KeyEvent.KEYCODE_PERIOD, \"PERIOD\");\r\n        names.append(KeyEvent.KEYCODE_ALT_LEFT, \"ALT_LEFT\");\r\n        names.append(KeyEvent.KEYCODE_ALT_RIGHT, \"ALT_RIGHT\");\r\n        names.append(KeyEvent.KEYCODE_SHIFT_LEFT, \"SHIFT_LEFT\");\r\n        names.append(KeyEvent.KEYCODE_SHIFT_RIGHT, \"SHIFT_RIGHT\");\r\n        names.append(KeyEvent.KEYCODE_TAB, \"TAB\");\r\n        names.append(KeyEvent.KEYCODE_SPACE, \"SPACE\");\r\n        names.append(KeyEvent.KEYCODE_SYM, \"SYM\");\r\n        names.append(KeyEvent.KEYCODE_EXPLORER, \"EXPLORER\");\r\n        names.append(KeyEvent.KEYCODE_ENVELOPE, \"ENVELOPE\");\r\n        names.append(KeyEvent.KEYCODE_ENTER, \"ENTER\");\r\n        names.append(KeyEvent.KEYCODE_DEL, \"DEL\");\r\n        names.append(KeyEvent.KEYCODE_GRAVE, \"GRAVE\");\r\n        names.append(KeyEvent.KEYCODE_MINUS, \"MINUS\");\r\n        names.append(KeyEvent.KEYCODE_EQUALS, \"EQUALS\");\r\n        names.append(KeyEvent.KEYCODE_LEFT_BRACKET, \"LEFT_BRACKET\");\r\n        names.append(KeyEvent.KEYCODE_RIGHT_BRACKET, \"RIGHT_BRACKET\");\r\n        names.append(KeyEvent.KEYCODE_BACKSLASH, \"BACKSLASH\");\r\n        names.append(KeyEvent.KEYCODE_SEMICOLON, \"SEMICOLON\");\r\n        names.append(KeyEvent.KEYCODE_APOSTROPHE, \"APOSTROPHE\");\r\n        names.append(KeyEvent.KEYCODE_SLASH, \"SLASH\");\r\n        names.append(KeyEvent.KEYCODE_AT, \"AT\");\r\n        names.append(KeyEvent.KEYCODE_NUM, \"NUM\");\r\n        names.append(KeyEvent.KEYCODE_HEADSETHOOK, \"HEADSETHOOK\");\r\n        names.append(KeyEvent.KEYCODE_FOCUS, \"FOCUS\");\r\n        names.append(KeyEvent.KEYCODE_PLUS, \"PLUS\");\r\n        names.append(KeyEvent.KEYCODE_MENU, \"MENU\");\r\n        names.append(KeyEvent.KEYCODE_NOTIFICATION, \"NOTIFICATION\");\r\n        names.append(KeyEvent.KEYCODE_SEARCH, \"SEARCH\");\r\n        names.append(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, \"MEDIA_PLAY_PAUSE\");\r\n        names.append(KeyEvent.KEYCODE_MEDIA_STOP, \"MEDIA_STOP\");\r\n        names.append(KeyEvent.KEYCODE_MEDIA_NEXT, \"MEDIA_NEXT\");\r\n        names.append(KeyEvent.KEYCODE_MEDIA_PREVIOUS, \"MEDIA_PREVIOUS\");\r\n        names.append(KeyEvent.KEYCODE_MEDIA_REWIND, \"MEDIA_REWIND\");\r\n        names.append(KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, \"MEDIA_FAST_FORWARD\");\r\n        names.append(KeyEvent.KEYCODE_MUTE, \"MUTE\");\r\n        names.append(KeyEvent.KEYCODE_PAGE_UP, \"PAGE_UP\");\r\n        names.append(KeyEvent.KEYCODE_PAGE_DOWN, \"PAGE_DOWN\");\r\n        names.append(KeyEvent.KEYCODE_PICTSYMBOLS, \"PICTSYMBOLS\");\r\n        names.append(KeyEvent.KEYCODE_SWITCH_CHARSET, \"SWITCH_CHARSET\");\r\n        \r\n        if(!MainActivity.IS_OUYA) {\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_A, \"BUTTON_A\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_B, \"BUTTON_B\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_X, \"BUTTON_X\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_Y, \"BUTTON_Y\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_L1, \"BUTTON_L1\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_R1, \"BUTTON_R1\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_L2, \"BUTTON_L2\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_R2, \"BUTTON_R2\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_THUMBL, \"BUTTON_THUMBL\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_THUMBR, \"BUTTON_THUMBR\");\r\n        }\r\n        else {\r\n        \t//The OUYA interface guidelines wants us to call the buttons by these names\r\n        \tnames.append(KeyEvent.KEYCODE_BUTTON_A, \"O\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_B, \"A\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_X, \"U\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_Y, \"Y\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_L1, \"L1\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_R1, \"R1\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_L2, \"L2\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_R2, \"R2\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_THUMBL, \"L3\");\r\n\t        names.append(KeyEvent.KEYCODE_BUTTON_THUMBR, \"R3\");\r\n        }\r\n        \r\n        names.append(KeyEvent.KEYCODE_BUTTON_START, \"BUTTON_START\");\r\n        names.append(KeyEvent.KEYCODE_BUTTON_SELECT, \"BUTTON_SELECT\");\r\n        names.append(KeyEvent.KEYCODE_BUTTON_MODE, \"BUTTON_MODE\");\r\n        names.append(KeyEvent.KEYCODE_BUTTON_Z, \"BUTTON_Z\");\r\n        names.append(KeyEvent.KEYCODE_BUTTON_C, \"BUTTON_C\");\r\n\t    names.append(188, \"KEYCODE_BUTTON_1\"); //KEYCODE_BUTTON_1\r\n    }\r\n\r\n\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/KeyMapSettings.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\nCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport android.os.Bundle;\r\nimport android.preference.PreferenceActivity;\r\n\r\npublic class KeyMapSettings extends PreferenceActivity {\r\n\t\r\n\t@Override\r\n\tpublic void onCreate(Bundle savedInstanceState) {\r\n\t\tsuper.onCreate(savedInstanceState);\r\n\t\taddPreferencesFromResource(R.xml.keymap);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/MainActivity.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport java.io.File;\r\nimport java.util.Date;\r\nimport java.util.Timer;\r\nimport java.util.TimerTask;\r\n\r\nimport android.app.Activity;\r\nimport android.app.AlertDialog;\r\nimport android.app.Dialog;\r\nimport android.app.ProgressDialog;\r\nimport android.content.Context;\r\nimport android.content.DialogInterface;\r\nimport android.content.DialogInterface.OnCancelListener;\r\nimport android.content.Intent;\r\nimport android.content.SharedPreferences;\r\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\r\nimport android.content.pm.ActivityInfo;\r\nimport android.content.res.Configuration;\r\nimport android.graphics.Bitmap;\r\nimport android.graphics.Bitmap.Config;\r\nimport android.graphics.Canvas;\r\nimport android.graphics.Color;\r\nimport android.graphics.Paint;\r\nimport android.graphics.PixelFormat;\r\nimport android.graphics.Rect;\r\nimport android.os.Build;\r\nimport android.os.Bundle;\r\nimport android.os.Environment;\r\nimport android.os.Handler;\r\nimport android.os.Message;\r\nimport android.preference.PreferenceManager;\r\nimport android.util.Log;\r\nimport android.view.KeyEvent;\r\nimport android.view.Menu;\r\nimport android.view.MenuInflater;\r\nimport android.view.MenuItem;\r\nimport android.view.MotionEvent;\r\nimport android.view.SurfaceHolder;\r\nimport android.view.SurfaceHolder.Callback;\r\nimport android.view.SurfaceView;\r\nimport android.view.WindowManager;\r\n\r\npublic class MainActivity extends Activity implements OnSharedPreferenceChangeListener {\r\n\r\n\tstatic EmulatorThread coreThread;\r\n\tstatic Controls controls;\r\n\tNDSView view;\r\n\tstatic final String TAG = \"nds4droid\";\r\n\tDialog loadingDialog = null;\r\n\t\r\n\tHandler msgHandler = new Handler() {\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic\r\n\t\tvoid dispatchMessage(Message msg) {\r\n\t\t\tswitch(msg.what) {\r\n\t\t\tcase PICK_ROM:\r\n\t\t\t\tpickRom();\r\n\t\t\t\tbreak;\r\n\t\t\tcase LOADING_START:\r\n\t\t\t\tif(loadingDialog == null) {\r\n\t\t\t\t\tfinal String loadingMsg = getResources().getString(R.string.loading);\r\n\t\t\t\t\tloadingDialog = ProgressDialog.show(MainActivity.this, null, loadingMsg, true);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase LOADING_END:\r\n\t\t\t\tif(loadingDialog != null) {\r\n\t\t\t\t\tloadingDialog.dismiss();\r\n\t\t\t\t\tloadingDialog = null;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase ROM_ERROR:\r\n\t\t\t\tAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);\r\n\t\t\t\tbuilder.setMessage(R.string.rom_error).setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {\r\n\t\t\t\t\t\r\n\t\t\t\t\t@Override\r\n\t\t\t\t\tpublic void onClick(DialogInterface arg0, int arg1) {\r\n\t\t\t\t\t\targ0.dismiss();\r\n\t\t\t\t\t\tpickRom();\r\n\t\t\t\t\t}\r\n\t\t\t\t}).setOnCancelListener(new OnCancelListener() {\r\n\r\n\t\t\t\t\t@Override\r\n\t\t\t\t\tpublic void onCancel(DialogInterface arg0) {\r\n\t\t\t\t\t\targ0.dismiss();\r\n\t\t\t\t\t\tpickRom();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t});\r\n\t\t\t\tbuilder.create().show();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t};\r\n\t\r\n\tpublic static final int PICK_ROM = 1338;\r\n\tpublic static final int LOADING_START = 1339;\r\n\tpublic static final int LOADING_END = 1340;\r\n\tpublic static final int ROM_ERROR = 1341;\r\n\t\r\n\tpublic static boolean IS_OUYA = tv.ouya.console.api.OuyaFacade.getInstance().isRunningOnOUYAHardware();\r\n\t\r\n\t@Override\r\n\tpublic void onCreate(Bundle savedInstanceState) {\r\n\t\tsuper.onCreate(savedInstanceState);\r\n\t\t\r\n\t\tif(IS_OUYA)\r\n\t\t\tLog.i(TAG, \"Starting in OUYA mode\");\r\n\r\n\t\tview = new NDSView(this);\r\n\t\tsetContentView(view);\r\n\t\t\r\n\t\tcontrols = new Controls(view);\r\n\r\n\t\tSettings.applyDefaults(this);\r\n\t\tprefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);\r\n\t\tprefs.registerOnSharedPreferenceChangeListener(this);\r\n\t\tloadJavaSettings(null);\r\n\t\t\r\n\t\tif(savedInstanceState != null) \r\n\t\t\ttimeAtLastAutosave = savedInstanceState.getLong(LASTSAVE_KEY);\r\n\t\t\r\n\t\t\r\n\t\tif(!DeSmuME.inited) \r\n\t\t\tpickRom();\r\n\t\t\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void onConfigurationChanged(Configuration newConfig) {\r\n\t    super.onConfigurationChanged(newConfig);\r\n\t    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);\r\n\t}\r\n\t\r\n\tvoid runEmulation() {\r\n\t\tboolean created = false;\r\n\t\tif(coreThread == null) {\r\n\t\t\tcoreThread = new EmulatorThread(this);\r\n\t\t\tcreated = true;\r\n\t\t}\r\n\t\telse\r\n\t\t\tcoreThread.setCurrentActivity(this);\r\n\t\tcoreThread.setPause(!DeSmuME.romLoaded);\r\n\t\tif(created)\r\n\t\t\tcoreThread.start();\r\n\t}\r\n\t\r\n\tvoid pauseEmulation() {\r\n\t\tif(coreThread != null) {\r\n\t\t\tcoreThread.setPause(true);\r\n\t\t}\r\n\t}\r\n\t\r\n\tvoid pickRom() {\r\n\t\tIntent i = new Intent(this, prefs.getBoolean(Settings.DISABLE_ROM_BROWSER, false) ? \r\n\t\t\t\tFileDialog.class : com.opendoorstudios.ds4droid.NDSScanner.CollectionActivity.class);\r\n\t\ti.setAction(Intent.ACTION_PICK);\r\n\t\t\r\n\t\tString startPath = Environment.getExternalStorageDirectory().getPath();\r\n\t\tfinal File path = new File(prefs.getString(Settings.LAST_ROM_DIR, startPath));\r\n\t\tif(path.exists()) //make sure this path actually exists -- otherwise default back to /mnt/sdcard/\r\n\t\t\tstartPath = path.getPath();\r\n\t\t\r\n\t\ti.putExtra(FileDialog.START_PATH, startPath);\r\n\t\ti.putExtra(FileDialog.FORMAT_FILTER, new String[] {\".nds\", \".zip\", \".7z\", \".rar\"});\r\n\t\tstartActivityForResult(i, PICK_ROM);\r\n\t}\r\n\t\r\n\t@Override\r\n\tprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\r\n\t\tif(requestCode != PICK_ROM || resultCode != Activity.RESULT_OK)\r\n\t\t\treturn;\r\n\t\tString romPath = data.getStringExtra(FileDialog.RESULT_PATH);\r\n\t\tif(romPath != null) {\r\n\t\t\tfinal File romDir = new File(romPath);\r\n\t\t\tprefs.edit().putString(Settings.LAST_ROM_DIR, romDir.getParent()).apply();\r\n\t\t\trunEmulation();\r\n\t\t\tcoreThread.loadRom(romPath);\r\n\t\t\ttimeAtLastAutosave = System.currentTimeMillis();\r\n\t\t\tscheduleAutosave();\r\n\t\t}\r\n\t\t\t\r\n\t}\r\n\t\r\n\tprivate static final String LASTSAVE_KEY = \"LASTSAVE_KEY\";\r\n\t\r\n\t@Override\r\n\tpublic void onSaveInstanceState(Bundle out) {\r\n\t\tout.putLong(LASTSAVE_KEY, timeAtLastAutosave);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void onResume() {\r\n\t\tsuper.onResume();\r\n\t\trunEmulation();\r\n\t\tstartDrawTimer();\r\n\t\tif(DeSmuME.romLoaded)\r\n\t\t\tscheduleAutosave();\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void onPause() {\r\n\t\tsuper.onPause();\r\n\t\tpauseEmulation();\r\n\t\tstopDrawTimer();\r\n\t\tcancelAutosave();\r\n\t}\r\n\t\r\n\tTimer drawtimer;\r\n\tvoid startDrawTimer() { \r\n\t\tdrawtimer = new Timer();\r\n\t\tdrawtimer.schedule(new TimerTask() {\r\n\t\t\tpublic void run(){\r\n\t\t\t\tif(coreThread.frameFinished) {\r\n\t\t\t\t\tcoreThread.frameFinished = false;\r\n\t\t\t\t\tview.postInvalidate();\r\n\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t}\r\n\t\t}, 12, 12);\r\n\t}\r\n\t\r\n\tvoid stopDrawTimer() {\r\n\t\tif (drawtimer != null)\r\n\t\t\tdrawtimer.cancel();\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic boolean onCreateOptionsMenu(Menu menu) {\r\n\t\tMenuInflater inflater = getMenuInflater();\r\n\t    inflater.inflate(R.menu.activity_main, menu);\r\n\t    return true;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic boolean onPrepareOptionsMenu(Menu menu) {\r\n\t\tpauseEmulation();\r\n\t\tmenu.findItem(R.id.cheats).setVisible(DeSmuME.romLoaded);\r\n\t\tmenu.findItem(R.id.lid).setChecked(DeSmuME.lidOpen);\r\n\t\t\r\n\t\tfinal String defaultWorkingDir = Environment.getExternalStorageDirectory().getAbsolutePath() + \"/nds4droid\";\r\n\t\tfinal String statesPath = prefs.getString(Settings.DESMUME_PATH, defaultWorkingDir) + \"/States/\";\r\n\t\t\r\n\t\tString romSaveName = DeSmuME.loadedRom != null ? new File(DeSmuME.loadedRom).getName() : null;\r\n\t\tif(romSaveName != null)\r\n\t\t\tromSaveName = romSaveName.substring(0, romSaveName.lastIndexOf('.'));\r\n\t\t\r\n\t\tfor(int i = 1 ; i <= 10 ; ++i) {\r\n\t\t\t\r\n\t\t\tMenuItem saveItem = null, loadItem = null;\r\n\t\t\tswitch(i) {\r\n\t\t\tcase 1: saveItem = menu.findItem(R.id.save1); loadItem = menu.findItem(R.id.restore1); break;\r\n\t\t\tcase 2: saveItem = menu.findItem(R.id.save2); loadItem = menu.findItem(R.id.restore2); break;\r\n\t\t\tcase 3: saveItem = menu.findItem(R.id.save3); loadItem = menu.findItem(R.id.restore3); break;\r\n\t\t\tcase 4: saveItem = menu.findItem(R.id.save4); loadItem = menu.findItem(R.id.restore4); break;\r\n\t\t\tcase 5: saveItem = menu.findItem(R.id.save5); loadItem = menu.findItem(R.id.restore5); break;\r\n\t\t\tcase 6: saveItem = menu.findItem(R.id.save6); loadItem = menu.findItem(R.id.restore6); break;\r\n\t\t\tcase 7: saveItem = menu.findItem(R.id.save7); loadItem = menu.findItem(R.id.restore7); break;\r\n\t\t\tcase 8: saveItem = menu.findItem(R.id.save8); loadItem = menu.findItem(R.id.restore8); break;\r\n\t\t\tcase 9: saveItem = menu.findItem(R.id.save9); loadItem = menu.findItem(R.id.restore9); break;\r\n\t\t\tcase 10: loadItem = menu.findItem(R.id.restoreauto); break;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tString newTitle = i == 10 ? \"Autosave\" : String.valueOf(i);\r\n\t\t\t\r\n\t\t\tif(romSaveName != null) {\r\n\t\t\t\tfinal File thisSave = new File(statesPath + romSaveName + \".ds\" + i);\r\n\t\t\t\tif(thisSave.exists()) {\r\n\t\t\t\t\tfinal String date = new Date(thisSave.lastModified()).toString();\r\n\t\t\t\t\tif(i == 10)\r\n\t\t\t\t\t\tnewTitle = \"Autosave - \" + date;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tnewTitle = String.format(\"%d - %s\", i, date);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(i != 10)\r\n\t\t\t\tsaveItem.setTitle(newTitle);\r\n\t\t\tloadItem.setTitle(newTitle);\r\n\t\t}\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void onOptionsMenuClosed(Menu menu) {\r\n\t\trunEmulation();\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic boolean onMenuItemSelected (int featureId, MenuItem item) {\r\n\t\tswitch(item.getItemId()) {\r\n\t\tcase R.id.load:\r\n\t\t\tpickRom();\r\n\t\t\tbreak;\r\n\t\tcase R.id.quicksave:\r\n\t\t\tsaveState(0);\r\n\t\t\tbreak;\r\n\t\tcase R.id.quickrestore:\r\n\t\t\trestoreState(0);\r\n\t\t\tbreak;\r\n\t\tcase R.id.restore1: case R.id.restore2: case R.id.restore3: case R.id.restore4: case R.id.restore5:\r\n\t\tcase R.id.restore6: case R.id.restore7: case R.id.restore8: case R.id.restore9: case R.id.restoreauto:\r\n\t\t{\r\n\t\t\tString title = item.getTitle().toString();\r\n\t\t\tfinal int spacePos = title.indexOf(' ');\r\n\t\t\tif(spacePos != -1)\r\n\t\t\t\ttitle = title.substring(0, spacePos);\r\n\t\t\tfinal int state = title.equals(\"Autosave\") ? 10 : Integer.valueOf(title);\r\n\t\t\trestoreState(state);\r\n\t\t\t\r\n\t\t}\r\n\t\t\tbreak;\r\n\t\tcase R.id.save1: case R.id.save2: case R.id.save3: case R.id.save4: case R.id.save5:\r\n\t\tcase R.id.save6: case R.id.save7: case R.id.save8: case R.id.save9:\r\n\t\t{\r\n\t\t\tString title = item.getTitle().toString();\r\n\t\t\tfinal int spacePos = title.indexOf(' ');\r\n\t\t\tif(spacePos != -1)\r\n\t\t\t\ttitle = title.substring(0, spacePos);\r\n\t\t\tfinal int state = Integer.valueOf(title);\r\n\t\t\tsaveState(state);\r\n\t\t}\r\n\t\t\tbreak;\r\n\t\tcase R.id.settings:\r\n\t\t\tstartActivity(new Intent(this, Settings.class));\r\n\t\t\tbreak;\r\n\t\tcase R.id.cheats:\r\n\t\t\tstartActivity(new Intent(this, Cheats.class));\r\n\t\t\tbreak;\r\n\t\tcase R.id.exit:\r\n\t\t\tDeSmuME.exit();\r\n\t\t\tfinish();\r\n\t\t\tbreak;\r\n\t\tcase R.id.lid:\r\n\t\t\tif(coreThread != null) {\r\n\t\t\t\tboolean newState = !DeSmuME.lidOpen;\r\n\t\t\t\tDeSmuME.lidOpen = newState;\r\n\t\t\t\titem.setChecked(newState);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase R.id.about:\r\n\t\t\tstartActivity(new Intent(this, About.class));\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\trunEmulation();\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\tstatic String getStateName(int slot) {\r\n\t\tswitch(slot) {\r\n\t\tcase 0: return \"quick state\";\r\n\t\tcase 10: return \"autosave\";\r\n\t\tdefault: return \"state \" + slot;\r\n\t\t}\r\n\t}\r\n\t\r\n\tvoid restoreState(int slot) {\r\n\t\tif(DeSmuME.romLoaded) {\r\n\t\t\tcoreThread.inFrameLock.lock();\r\n\t\t\t\tDeSmuME.restoreState(slot);\r\n\t\t\tcoreThread.inFrameLock.unlock();\r\n\t\t\tview.stateText = \"Restored \" + getStateName(slot);\r\n\t\t\tview.stateDrawStart = System.currentTimeMillis();\r\n\t\t}\r\n\t}\r\n\t\r\n\tvoid saveState(int slot) {\r\n\t\tif(DeSmuME.romLoaded) {\r\n\t\t\tcoreThread.inFrameLock.lock();\r\n\t\t\t\tDeSmuME.saveState(slot);\r\n\t\t\tcoreThread.inFrameLock.unlock();\r\n\t\t\tview.stateText = \"Saved \" + getStateName(slot);\r\n\t\t\tview.stateDrawStart = System.currentTimeMillis();\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\tSharedPreferences prefs = null;\r\n\t\r\n\t@Override\r\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\r\n\r\n\t\tif(DeSmuME.inited)\r\n\t\t\tDeSmuME.loadSettings();\r\n\t\tloadJavaSettings(key);\r\n\t\t\t\r\n\t}\r\n\t\r\n\tvoid loadJavaSettings(String key)\r\n\t{\r\n\t\tif(key != null) {\r\n\t\t\tif(DeSmuME.inited && key.equals(Settings.LANGUAGE))\r\n\t\t\t\tDeSmuME.reloadFirmware();\r\n\t\t}\r\n\t\t\r\n\t\tif(view != null) {\r\n\t\t\tview.showfps = prefs.getBoolean(Settings.SHOW_FPS, false);\r\n\t\t\tview.showTouchMessage = prefs.getBoolean(Settings.SHOW_TOUCH_MESSAGE, true);\r\n\t\t\tview.showSoundMessage = prefs.getBoolean(Settings.SHOW_SOUND_MESSAGE, true);\r\n\t\t\tview.lcdSwap = prefs.getBoolean(Settings.LCD_SWAP, false);\r\n\t\t\tview.buttonAlpha = (int)(prefs.getInt(Settings.BUTTON_TRANSPARENCY, 78) * 2.55f);\r\n\t\t\tview.haptic = prefs.getBoolean(Settings.HAPTIC, false);\r\n\t\t\tview.dontRotate = prefs.getBoolean(Settings.DONT_ROTATE_LCDS, false);\r\n\t\t\tview.alwaysTouch = prefs.getBoolean(Settings.ALWAYS_TOUCH, false);\r\n\t\t\t\r\n\t\t\tcontrols.loadMappings(this);\r\n\t\t\t\r\n\t\t\tif(key != null) {\r\n\t\t\t\tif(key.equals(Settings.SCREEN_FILTER)) {\r\n\t\t\t\t\tint newFilter = DeSmuME.getSettingInt(Settings.SCREEN_FILTER, 0);\r\n\t\t\t\t\tDeSmuME.setFilter(newFilter);\r\n\t\t\t\t\tview.forceResize();\r\n\t\t\t\t}\r\n\t\t\t\telse if(key.equals(Settings.RENDERER)) {\r\n\t\t\t\t\tint new3D = DeSmuME.getSettingInt(Settings.RENDERER, 2);\r\n\t\t\t\t\tif(coreThread != null)\r\n\t\t\t\t\t\tcoreThread.change3D(new3D);\r\n\t\t\t\t}\r\n\t\t\t\telse if(key.equals(Settings.ENABLE_SOUND)) {\r\n\t\t\t\t\tint newSound = DeSmuME.getSettingInt(Settings.ENABLE_SOUND, 0);\r\n\t\t\t\t\tif(coreThread != null)\r\n\t\t\t\t\t\tcoreThread.changeSound(newSound);\r\n\t\t\t\t}\r\n\t\t\t\telse if(key.equals(Settings.CPU_MODE) || key.equals(Settings.JIT_SIZE)) {\r\n\t\t\t\t\tint newCpuMode = DeSmuME.getSettingInt(Settings.CPU_MODE, 1);\r\n\t\t\t\t\tif(coreThread != null)\r\n\t\t\t\t\t\tcoreThread.changeCPUMode(newCpuMode);\r\n\t\t\t\t}\r\n\t\t\t\telse if(key.equals(Settings.SOUND_SYNC_MODE)) {\r\n\t\t\t\t\tint newSoundSyncMode = DeSmuME.getSettingInt(Settings.SOUND_SYNC_MODE, 0);\r\n\t\t\t\t\tif(coreThread != null)\r\n\t\t\t\t\t\tcoreThread.changeSoundSyncMode(newSoundSyncMode);\r\n\t\t\t\t}\r\n\t\t\t\telse if(key.equals(Settings.ENABLE_AUTOSAVE) || key.equals(Settings.AUTOSVAE_FREQUENCY)) {\r\n\t\t\t\t\tcancelAutosave();\r\n\t\t\t\t\tif(coreThread != null) {\r\n\t\t\t\t\t\tif(DeSmuME.romLoaded)\r\n\t\t\t\t\t\t\tscheduleAutosave();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tlong timeAtLastAutosave = 0;\r\n\tTimer autosaveTask;\r\n\t\r\n\tvoid cancelAutosave() {\r\n\t\tif(autosaveTask != null) {\r\n\t\t\tautosaveTask.cancel();\r\n\t\t\tautosaveTask = null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tvoid scheduleAutosave() {\r\n\t\tcancelAutosave();\r\n\t\tif(prefs.getBoolean(Settings.ENABLE_AUTOSAVE, true)) {\r\n\t\t\tfinal int freqSel = Integer.valueOf(prefs.getString(Settings.AUTOSVAE_FREQUENCY, \"1\"));\r\n\t\t\tlong autosaveDelay = 0;\r\n\t\t\tswitch(freqSel) {\r\n\t\t\tcase 0: autosaveDelay = 1 * 60 * 1000; break; //1 minute\r\n\t\t\tcase 2: autosaveDelay = 15 * 60 * 1000; break; //15 minutes\r\n\t\t\tcase 3: autosaveDelay = 30 * 60 * 1000; break; //30 minutes\r\n\t\t\tcase 4: autosaveDelay = 60 * 60 * 1000; break; //1 hour\r\n\t\t\tdefault: autosaveDelay = 5 * 60 * 1000; break; //5 minutes\r\n\t\t\t}\r\n\t\t\tlong timeSinceLastAuto = System.currentTimeMillis() - timeAtLastAutosave;\r\n\t\t\tif(timeSinceLastAuto >= autosaveDelay) \r\n\t\t\t\ttimeSinceLastAuto = autosaveDelay;\r\n\t\t\tautosaveTask = new Timer();\r\n\t\t\tautosaveTask.scheduleAtFixedRate(new TimerTask() {\r\n\r\n\t\t\t\t@Override\r\n\t\t\t\tpublic void run() {\r\n\t\t\t\t\tif(!coreThread.paused.get()) {\r\n\t\t\t\t\t\tsaveState(10);\r\n\t\t\t\t\t\ttimeAtLastAutosave = System.currentTimeMillis();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}, autosaveDelay - timeSinceLastAuto, autosaveDelay);\r\n\t\t}\r\n\t}\r\n\t\r\n\tclass NDSView extends SurfaceView implements Callback {\r\n\t\tBitmap emuBitmapMain, emuBitmapTouch;\r\n\t\t\r\n\t\tfinal Paint emuPaint = new Paint();\r\n\t\tfinal Paint hudPaint = new Paint();\r\n\t\tfinal float defhudsize = 15;\r\n\t\tfloat curhudsize = defhudsize;\r\n\t\tpublic boolean showfps = false;\r\n\t\tpublic boolean showTouchMessage = false;\r\n\t\tpublic boolean showSoundMessage = false;\r\n\t\tpublic boolean lcdSwap = false;\r\n\t\tpublic boolean forceTouchScreen = false;\r\n\t\tpublic int buttonAlpha = 78;\r\n\t\tpublic boolean haptic = true;\r\n\t\tpublic boolean alwaysTouch = false;\r\n\t\t\r\n\t\tpublic NDSView(Context context) {\r\n\t\t\tsuper(context);\r\n\t\t\tgetHolder().addCallback(this);\r\n\t\t\tsetKeepScreenOn(true);\r\n\t\t\tsetWillNotDraw(false);\r\n\t\t\tsetFocusable(true);\r\n\t\t\tsetFocusableInTouchMode(true);\r\n\t\t\t\r\n\t\t\thudPaint.setColor(Color.WHITE);\r\n\t\t\thudPaint.setShadowLayer(1, 0, 0, Color.BLACK);\r\n\t\t\thudPaint.setTextSize(defhudsize);\r\n\t\t\thudPaint.setAntiAlias(false);\r\n\t\t}\r\n\t\t\r\n\t\tboolean doForceResize = false;\r\n\t\tpublic void forceResize() {\r\n\t\t\tdoForceResize = true;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic void onDraw(Canvas canvas) {\r\n\t\t\tcanvas.drawColor(Color.BLACK);\r\n\t\t\t\r\n\t\t\tif(showTouchMessage) {\r\n\t\t\t\tprefs.edit().putBoolean(Settings.SHOW_TOUCH_MESSAGE, showTouchMessage = false).apply();\r\n\t\t\t\tAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);\r\n\t\t\t\tbuilder.setPositiveButton(R.string.OK, null).setMessage(R.string.touchnotify).create().show();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(showSoundMessage) {\r\n\t\t\t\tprefs.edit().putBoolean(Settings.SHOW_SOUND_MESSAGE, showSoundMessage = false).apply();\r\n\t\t\t\tAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);\r\n\t\t\t\tbuilder.setMessage(R.string.soundmsg).setPositiveButton(R.string.yes, new Dialog.OnClickListener() {\r\n\r\n\t\t\t\t\t@Override\r\n\t\t\t\t\tpublic void onClick(DialogInterface arg0, int arg1) {\r\n\t\t\t\t\t\tprefs.edit().putBoolean(Settings.ENABLE_SOUND, true).apply();\r\n\t\t\t\t\t\targ0.dismiss();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}).setNegativeButton(R.string.no, null).create().show();\r\n\t\t\t}\r\n\r\n\t\t\tsynchronized(view) {\r\n\t\t\t\tif(!DeSmuME.inited)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t\r\n\t\t\t\tif(doForceResize)\r\n\t\t\t\t\tview.resize(width, height, pixelFormat);\r\n\t\t\t\t\r\n\t\t\t\tif(emuBitmapMain == null)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tint data = DeSmuME.fastForwardMode ? fpsData : DeSmuME.draw(emuBitmapMain, emuBitmapTouch, landscape && dontRotate);\r\n\t\t\t\t\r\n\t\t\t\tfinal boolean drawTouch = destTouch.left != 0 || destTouch.right != 0;\r\n\r\n\t\t\t\tif(lcdSwap) {\r\n\t\t\t\t\tif(drawTouch) {\r\n\t\t\t\t\t\tcanvas.drawBitmap(emuBitmapTouch, srcMain, destMain, emuPaint);\r\n\t\t\t\t\t\tcanvas.drawBitmap(emuBitmapMain, srcTouch, destTouch, emuPaint);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tcanvas.drawBitmap(emuBitmapMain, srcMain, destMain, emuPaint);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcanvas.drawBitmap(emuBitmapMain, srcMain, destMain, emuPaint);\r\n\t\t\t\t\tif(drawTouch)\r\n\t\t\t\t\t\tcanvas.drawBitmap(emuBitmapTouch, srcTouch, destTouch, emuPaint);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tcontrols.drawControls(canvas);\r\n\t\t\t\t\r\n\t\t\t\tif(stateText != null) {\r\n\t\t\t\t\tfinal long fadeHoldMs = 1000;\r\n\t\t\t\t\tfinal float fadeAwayMs = 750.0f;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfinal long time = System.currentTimeMillis();\r\n\t\t\t\t\tfinal long fadeDiff = time - stateDrawStart;\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(fadeDiff >= (fadeHoldMs + fadeAwayMs))\r\n\t\t\t\t\t\tstateText = null;\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tfinal boolean fading = fadeDiff > fadeHoldMs;\r\n\t\t\t\t\t\tif(fading) {\r\n\t\t\t\t\t\t\tfinal float fadeTime = (fadeDiff - fadeHoldMs) / fadeAwayMs;\r\n\t\t\t\t\t\t\tfinal int fadeColor = Color.argb(255 - (int) (fadeTime * 255), 255, 255, 255);\r\n\t\t\t\t\t\t\thudPaint.setColor(fadeColor);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcanvas.drawText(stateText, 10, curhudsize * 2, hudPaint);\r\n\t\t\t\t\t\tif(fading)\r\n\t\t\t\t\t\t\thudPaint.setColor(Color.WHITE);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (showfps)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(data != fpsData || fpsText == null) {\r\n\t\t\t\t\t\tint fps = (data >> 24) & 0xFF;\r\n\t\t\t\t\t\tint fps3d = (data >> 16) & 0xFF;\r\n\t\t\t\t\t\tint cpuload0 = (data >> 8) & 0xFF;\r\n\t\t\t\t\t\tint cpuload1 = data & 0xFF;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tfpsText = \"Fps:\"+fps+\"/\"+fps3d+\"(\"+cpuload0+\"%/\"+cpuload1+\"%)\";\r\n\t\t\t\t\t\tfpsData = data;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcanvas.drawText(fpsText, 10, curhudsize, hudPaint);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic boolean onTouchEvent(MotionEvent event) {\r\n\t\t\treturn controls.onTouchEvent(event);\r\n\t\t}\r\n\t\t\r\n\t\tboolean resized = false;\r\n\t\tboolean sized = false;\r\n\t\tboolean landscape = false;\r\n\t\tboolean dontRotate = false;\r\n\t\tint sourceWidth;\r\n\t\tint sourceHeight;\r\n\t\tRect srcMain, destMain, srcTouch, destTouch;\r\n\t\tint width = 0, height = 0, pixelFormat;\r\n\t\tString stateText = null;\r\n\t\tlong stateDrawStart = 0;\r\n\t\tint fpsData = 0;\r\n\t\tint screenOption = 0;\r\n\t\tString fpsText = null;\r\n\t\t\r\n\t\t\r\n\t\tvoid resize(int newWidth, int newHeight, int newPixelFormat) {\r\n\t\t\t\r\n\t\t\tsynchronized(view) {\r\n\t\t\t\tsourceWidth = DeSmuME.getNativeWidth();\r\n\t\t\t\tsourceHeight = DeSmuME.getNativeHeight();\r\n\t\t\t\tresized = true;\r\n\t\t\t\t\r\n\t\t\t\tscreenOption = Integer.valueOf(prefs.getString(Settings.SPECIFIC_SCREEN_ONLY, \"0\"));\r\n\t\t\t\tfinal boolean hasScreenFilter = DeSmuME.getSettingInt(Settings.SCREEN_FILTER, 0) != 0;\r\n\t\t\t\tfinal boolean is565 = newPixelFormat == PixelFormat.RGB_565 && !hasScreenFilter;\r\n\t\t\t\tfinal boolean stretch = !prefs.getBoolean(Settings.MAINTAIN_ASPECT_RATIO, false);\r\n\t\t\t\tlandscape = newWidth > newHeight;\r\n\t\t\t\tcontrols.setView(this);\r\n\t\t\t\tint xBlack = 0, yBlack = 0;\r\n\t\t\t\t\r\n\t\t\t\tforceTouchScreen = !prefs.getBoolean(\"Controls.\" + (landscape ? \"Landscape.\" : \"Portrait.\") + \"Draw\", false);\r\n\t\t\t\t\r\n\t\t\t\tfinal Rect emptyRect = new Rect(0, 0, 0, 0);\r\n\t\t\t\t\r\n\t\t\t\tif(landscape) {\r\n\t\t\t\t\tif(stretch) {\r\n\t\t\t\t\t\tif(screenOption > 0) {\r\n\t\t\t\t\t\t\tfinal Rect full = new Rect(0, 0, newWidth, newHeight);\r\n\t\t\t\t\t\t\tdestMain = screenOption == 1 ? full : emptyRect;\r\n\t\t\t\t\t\t\tdestTouch = screenOption == 1 ? emptyRect : full;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tdestMain = new Rect(0, 0, newWidth / 2, newHeight);\r\n\t\t\t\t\t\t\tdestTouch = new Rect(newWidth / 2, 0, newWidth, newHeight);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tfinal float dsAspect = (screenOption > 0) ? (float)(sourceWidth) / (float)(sourceHeight / 2) :\r\n\t\t\t\t\t\t\t(float)(sourceWidth * 2) / (float)(sourceHeight / 2);\r\n\t\t\t\t\t\tfinal float screenAspect = (float)newWidth / (float)newHeight;\r\n\t\t\t\t\t\tif(dsAspect > screenAspect) {\r\n\t\t\t\t\t\t\t//the DS is \"wider\" than our screen -- match to the width\r\n\t\t\t\t\t\t\tfinal int aspectHeight = (int)((float)newWidth / dsAspect);\r\n\t\t\t\t\t\t\tfinal int black = yBlack = (newHeight - aspectHeight) / 2;\r\n\t\t\t\t\t\t\tif(screenOption > 0) {\r\n\t\t\t\t\t\t\t\tfinal Rect full = new Rect(0,black,newWidth,newHeight - black);\r\n\t\t\t\t\t\t\t\tdestMain = screenOption == 1 ? full : emptyRect;\r\n\t\t\t\t\t\t\t\tdestTouch = screenOption == 1 ? emptyRect : full;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tdestMain = new Rect(0,black,newWidth / 2,newHeight - black);\r\n\t\t\t\t\t\t\t\tdestTouch = new Rect(newWidth / 2,black,newWidth,newHeight-black);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t//match to the height\r\n\t\t\t\t\t\t\tfinal int aspectWidth = (int)((float)newHeight * dsAspect);\r\n\t\t\t\t\t\t\tfinal int black = xBlack = (newWidth - aspectWidth) / 2;\r\n\t\t\t\t\t\t\tif(screenOption > 0) {\r\n\t\t\t\t\t\t\t\tfinal Rect full = new Rect(black, 0, newWidth - black, newHeight);\r\n\t\t\t\t\t\t\t\tdestMain = screenOption == 1 ? full : emptyRect;\r\n\t\t\t\t\t\t\t\tdestTouch = screenOption == 1 ? emptyRect : full;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tdestMain = new Rect(black, 0, aspectWidth / 2 + black, newHeight);\r\n\t\t\t\t\t\t\t\tdestTouch = new Rect(aspectWidth / 2 + black, 0, newWidth - black, newHeight);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif(stretch) {\r\n\t\t\t\t\t\tif(screenOption > 0) {\r\n\t\t\t\t\t\t\tfinal Rect full = new Rect(0, 0, newWidth, newHeight);\r\n\t\t\t\t\t\t\tdestMain = screenOption == 1 ? full : emptyRect;\r\n\t\t\t\t\t\t\tdestTouch = screenOption == 1 ? emptyRect : full;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tdestMain = new Rect(0, 0, newWidth, newHeight / 2);\r\n\t\t\t\t\t\t\tdestTouch = new Rect(0, newHeight / 2, newWidth, newHeight);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tfinal float dsAspect = (screenOption > 0) ? (float)sourceWidth / (float)(sourceHeight / 2) : \r\n\t\t\t\t\t\t\t(float)sourceWidth / (float)sourceHeight;\r\n\t\t\t\t\t\tfinal float screenAspect = (float)newWidth / (float)newHeight;\r\n\t\t\t\t\t\tif(dsAspect > screenAspect) {\r\n\t\t\t\t\t\t\t//the DS is \"wider\" than our screen -- match to the width\r\n\t\t\t\t\t\t\tfinal int aspectHeight = (int)((float)newWidth / dsAspect);\r\n\t\t\t\t\t\t\tfinal int black = yBlack = (newHeight - aspectHeight) / 2;\r\n\t\t\t\t\t\t\tif(screenOption > 0) {\r\n\t\t\t\t\t\t\t\tfinal Rect full = new Rect(0, black, newWidth, newHeight - black);\r\n\t\t\t\t\t\t\t\tdestMain = screenOption == 1 ? full : emptyRect;\r\n\t\t\t\t\t\t\t\tdestTouch = screenOption == 1 ? emptyRect : full;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tdestMain = new Rect(0,black,newWidth,aspectHeight / 2 + black);\r\n\t\t\t\t\t\t\t\tdestTouch = new Rect(0,aspectHeight / 2 + black,newWidth,newHeight-black);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t//match to the height\r\n\t\t\t\t\t\t\tfinal int aspectWidth = (int)((float)newHeight * dsAspect);\r\n\t\t\t\t\t\t\tfinal int black = xBlack = (newWidth - aspectWidth) / 2;\r\n\t\t\t\t\t\t\tif(screenOption > 0) {\r\n\t\t\t\t\t\t\t\tfinal Rect full = new Rect(black, 0, newWidth - black, newHeight);\r\n\t\t\t\t\t\t\t\tdestMain = screenOption == 1 ? full : emptyRect;\r\n\t\t\t\t\t\t\t\tdestTouch = screenOption == 1 ? emptyRect : full;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tdestMain = new Rect(black, 0, aspectWidth + black, newHeight / 2);\r\n\t\t\t\t\t\t\t\tdestTouch = new Rect(black, newHeight / 2, aspectWidth + black, newHeight);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tcontrols.loadControls(MainActivity.this, newWidth, newHeight, xBlack, yBlack, screenOption, is565, landscape);\r\n\t\t\t\t\r\n\t\t\t\tif(landscape && dontRotate) {\r\n\t\t\t\t\temuBitmapMain = Bitmap.createBitmap(sourceHeight / 2, sourceWidth, is565 ? Config.RGB_565 : Config.ARGB_8888);\r\n\t\t\t\t\temuBitmapTouch = Bitmap.createBitmap(sourceHeight / 2, sourceWidth, is565 ? Config.RGB_565 : Config.ARGB_8888);\r\n\t\t\t\t\tsrcMain = new Rect(0, 0, sourceHeight / 2, sourceWidth);\r\n\t\t\t\t\tsrcTouch = new Rect(0, 0, sourceHeight / 2, sourceWidth);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\temuBitmapMain = Bitmap.createBitmap(sourceWidth, sourceHeight / 2, is565 ? Config.RGB_565 : Config.ARGB_8888);\r\n\t\t\t\t\temuBitmapTouch = Bitmap.createBitmap(sourceWidth, sourceHeight / 2, is565 ? Config.RGB_565 : Config.ARGB_8888);\r\n\t\t\t\t\tsrcMain = new Rect(0, 0, sourceWidth, sourceHeight / 2);\r\n\t\t\t\t\tsrcTouch = new Rect(0, 0, sourceWidth, sourceHeight / 2);\r\n\t\t\t\t}\r\n\t\t\t\tDeSmuME.resize(emuBitmapMain);\r\n\t\t\t\t\r\n\t\t\t\trequestFocus();\r\n\t\t\t\t\r\n\t\t\t\twidth = newWidth;\r\n\t\t\t\theight = newHeight;\r\n\t\t\t\tpixelFormat = newPixelFormat;\r\n\t\t\t\tsized = true;\r\n\t\t\t\tdoForceResize = false;\r\n\t\t\t\t\r\n\t\t\t\tfloat max_wh = newWidth > newHeight ? newWidth : newHeight;\r\n\t\t\t\tcurhudsize = (max_wh / 384.0f) * defhudsize;\r\n\t\t\t\thudPaint.setTextSize(curhudsize);\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t@Override\r\n\t\tpublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {\r\n\t\t\tsynchronized(view) {\r\n\t\t\t\tif(width > 0 && height > 0) //not sure why, but some devices are sending 0s for these values sometimes\r\n\t\t\t\t\tview.resize(width, height, format);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t@Override\r\n\t\tpublic void surfaceCreated(SurfaceHolder arg0) {\r\n\t\t}\r\n\r\n\r\n\t\t@Override\r\n\t\tpublic void surfaceDestroyed(SurfaceHolder arg0) {\r\n\t\t}\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic boolean onKeyDown(int keyCode, KeyEvent event) {\r\n\t\t\treturn controls.onKeyDown(keyCode, event);\r\n\t\t}\r\n\t\t\r\n\t\t@Override\r\n\t\tpublic boolean onKeyUp(int keyCode, KeyEvent event) {\r\n\t\t\treturn controls.onKeyUp(keyCode, event);\r\n\t\t}\r\n\t\t\r\n\t\tpublic void showMenu() {\r\n\t\t\tMainActivity.this.openOptionsMenu();\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/NDSScanner/CollectionActivity.java",
    "content": "package com.opendoorstudios.ds4droid.NDSScanner;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.app.ProgressDialog;\nimport android.content.ActivityNotFoundException;\nimport android.content.Intent;\nimport android.graphics.Bitmap;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.TransitionDrawable;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.*;\nimport com.opendoorstudios.ds4droid.R;\nimport com.opendoorstudios.ds4droid.FileDialog;\nimport com.opendoorstudios.ds4droid.Settings;\n\nimport java.io.File;\n\n//==============================================================================\npublic class CollectionActivity extends Activity implements GridView.OnItemClickListener {\n\t//--------------------------------------------------------------------------\n\n\tprivate GridView      grid;\n\tprivate RomAdapter    adapter;\n\tprivate static RomCollection collection;\n\t\n\tprivate String browserRoot;\n\tprivate String[] browserFilter;\n\n\t//--------------------------------------------------------------------------\n\n\t@Override\n\tprotected void onCreate( Bundle savedInstanceState ) {\n\t\tsuper.onCreate( savedInstanceState );\n\n\t\t// nds4droid compatibility\n\t\tsetResult( RESULT_CANCELED );\n\t\t\n\n\t\tbrowserFilter = getIntent().getStringArrayExtra(FileDialog.FORMAT_FILTER);\n\t\tbrowserRoot = getIntent().getStringExtra(FileDialog.START_PATH);\n\n\t\tsetContentView( R.layout.fragment_list );\n\t\tgrid = (GridView)findViewById( R.id.list );\n\t\tadapter = new RomAdapter();\n\t\tgrid.setAdapter( adapter );\n\t\tgrid.setOnItemClickListener( this );\n\t}\n\t\n\t@Override\n\tprotected void onDestroy() {\n\t\tsuper.onDestroy();\n\t\tif(adapter != null)\n\t\t\tcollection.removeListener(adapter);\n\t}\n\n\t//--------------------------------------------------------------------------\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu( Menu menu ) {\n\t\tgetMenuInflater().inflate( R.menu.activity_collection, menu );\n\t\treturn true;\n\t}\n\t\n\tprivate void showFileBrowser() {\n\t\tIntent i = new Intent(this, FileDialog.class);\n\t\ti.setAction(Intent.ACTION_PICK);\n\t\ti.putExtra(FileDialog.START_PATH, browserRoot);\n\t\ti.putExtra(FileDialog.FORMAT_FILTER, browserFilter);\n\t\tstartActivityForResult(i, 0);\n\t}\n\t\n\t@Override\n\tpublic boolean onMenuItemSelected (int featureId, MenuItem item) {\n\t\tswitch(item.getItemId()) {\n\t\tcase R.id.scanner_rescan:\n\t\t\tcollection.clear();\n\t\t\tadapter.onScanFinished(collection);\n\t\t\tcollection.update( CollectionActivity.this );\n\t\t\treturn true;\n\t\tcase R.id.scanner_filebrowser:\n\t\t\tshowFileBrowser();\n\t\t\treturn true;\n\t\tcase R.id.scanner_settings:\n\t\t\tstartActivity(new Intent(this, Settings.class));\n\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t}\n\n\t@Override\n\tprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\n\t\tif( resultCode != Activity.RESULT_OK)\n\t\t\treturn;\n\t\tString romPath = data.getStringExtra(FileDialog.RESULT_PATH);\n\t\tif(romPath != null) {\n\t\t\tgetIntent().putExtra(FileDialog.RESULT_PATH, romPath);\n\t\t\tsetResult(RESULT_OK, getIntent());\n\t\t\tfinish();\n\t\t}\n\t\t\t\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\n\t@Override\n\tpublic void onItemClick( AdapterView<?> parent, View view, int index, long id ) {\n\t\tLog.d( \"NDS\", \"onItemClick()\" );\n\n\t\tFile FILE = collection.getRoms()[index].getFile();\n\t\t\n\t\tgetIntent().putExtra(FileDialog.RESULT_PATH, FILE.getAbsolutePath());\n\t\tsetResult(RESULT_OK, getIntent());\n\t\tfinish();\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\t//==========================================================================\n\tprivate class RomAdapter extends BaseAdapter implements RomCollection.ScanListener {\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\tpublic RomAdapter() {\n\t\t\t// TODO Check shared preference for user's desired scanner root\n\t\t\tFile file = new File( Environment.getExternalStorageDirectory().getAbsolutePath() );\n\t\t\tif(collection == null)\n\t\t\t\tcollection = new RomCollection( CollectionActivity.this, file );\n\t\t\tcollection.addListener( this );\n\t\t\tcollection.update( CollectionActivity.this );\n\t\t}\n\t\t\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\t@Override\n\t\tpublic int getCount() {\n\t\t\treturn collection.getRoms().length;\n\t\t}\n\t\t\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\t@Override\n\t\tpublic Object getItem( int index ) {\n\t\t\treturn collection.getRoms()[index];\n\t\t}\n\t\t\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\t@Override\n\t\tpublic long getItemId( int index ) {\n\t\t\treturn collection.getRoms()[index].getGameCode();\n\t\t}\n\t\t\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\t@Override\n\t\tpublic View getView( final int index, View view, ViewGroup parent ) {\n\t\t\tfinal NdsRom rom = collection.getRoms()[index];\n\t\t\t\n\t\t\tif ( view == null ) {\n\t\t\t\tview = getLayoutInflater().inflate( R.layout.griditem_rom, parent, false );\n\t\t\t}\n\t\t\t\n\t\t\tfinal ImageView image_view = ( (ImageView)view.findViewById( R.id.icon ));\n\t\t\tif ( rom.isIconLoaded() ) {\n\t\t\t\timage_view.setImageBitmap( rom.getIcon() );\n\t\t\t\timage_view.getDrawable().setFilterBitmap( false );\n\t\t\t\t\n\t\t\t// Delegate icon loading to an AsyncTask\n\t\t\t} else {\n\t\t\t\timage_view.setImageDrawable( null );\n\t\t\t\tnew AsyncTask<Void,Void,Bitmap>() {\n\t\t\t\t\tprotected Bitmap doInBackground( Void... xx ) {\n\t\t\t\t\t\treturn rom.getIcon();\n\t\t\t\t\t}\n\t\t\t\t\tprotected void onPostExecute( Bitmap result ) {\n\t\t\t\t\t\tDrawable[] transition = new Drawable[] { new ColorDrawable( 0 ), new BitmapDrawable( getResources(), result ) };\n\t\t\t\t\t\ttransition[1].setFilterBitmap( false );\n\t\t\t\t\t\tTransitionDrawable drawable = new TransitionDrawable( transition );\n\t\t\t\t\t\timage_view.setImageDrawable( drawable );\n\t\t\t\t\t\tdrawable.startTransition( 100 );\n\t\t\t\t\t}\n\t\t\t\t}.execute();\n\t\t\t}\n\t\t\t\n\t\t\t( (TextView )view.findViewById( R.id.title )).setText( rom.getTitle() );\n\t\t\treturn view;\n\t\t}\n\t\t\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\tprivate ProgressDialog pd;\n\t\t\n\t\t@Override\n\t\tpublic void onScanStarted( RomCollection collection ) {\n\t\t\tpd = new ProgressDialog(CollectionActivity.this);\n\t\t\tpd.setTitle(getString(R.string.ScanningForROMs));\n\t\t\tpd.setIndeterminate(true);\n\t\t\tpd.setCancelable(true);\n\t\t\tpd.show();\n\t\t}\n\t\t\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\t@Override\n\t\tpublic void onScanFinished( RomCollection collection ) {\n\t\t\tpd.dismiss();\n\t\t\tif(collection.getRoms().length == 0)\n\t\t\t\tshowFileBrowser();\n\t\t\telse\n\t\t\t\tnotifyDataSetChanged();\n\t\t}\n\n\t\t//----------------------------------------------------------------------\n\t}\n\t//--------------------------------------------------------------------------\n}\n//------------------------------------------------------------------------------\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/NDSScanner/NdsRom.java",
    "content": "package com.opendoorstudios.ds4droid.NDSScanner;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport java.io.*;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.util.Collections;\nimport java.util.Locale;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipFile;\n\n//==============================================================================\npublic class NdsRom {\n\t// Data from http://nocash.emubase.de/gbatek.htm\n\t//--------------------------------------------------------------------------\n\t\n\t// title, gamecode, makercode are tightly packed; no offset needed until info\n\tprivate static final int INFO_OFFSET = 0x56, INFO_ADDRESS = 0x68, ICON_OFFSET = 0x20;\n\t\n\tprotected final byte[] TITLE_BYTES = new byte[12],\n\t                    GAMECODE_BYTES = new byte[ 4],\n\t                   MAKERCODE_BYTES = new byte[ 2],\n\t                        INFO_BYTES = new byte[ 4],\n\t                        \n\t                   // Below only used if INFO_BYTES > 0\n\t                        ICON_BYTES = new byte[512],\n\t                     PALETTE_BYTES = new byte[ 32],\n\t                    TITLE_JP_BYTES = new byte[256], // Japanese\n\t                    TITLE_EN_BYTES = new byte[256], // English\n\t                    TITLE_FR_BYTES = new byte[256], // French\n\t                    TITLE_DE_BYTES = new byte[256], // German\n\t    \t            TITLE_IT_BYTES = new byte[256], // Italian\n\t                    TITLE_ES_BYTES = new byte[256]; // Spanish\n\t\n\tprivate long   game_code;\n\tprivate Bitmap icon;\n\tprivate String title_jp, title_en, title_fr, title_de, title_it, title_es;\n\n\tstatic final String ROM_PATTERN = \"^.*\\\\.(NDS|nds)$\",\n\t                    ZIP_PATTERN = \"^.*\\\\.(ZIP|zip)$\",\n\t                    RAR_PATTERN = \"^.*\\\\.(RAR|rar)$\";\n\t\n\tprivate final File FILE;\n\t\n\t//--------------------------------------------------------------------------\n\n\tpublic static NdsRom MakeRom(File f) {\n\t\tfinal InputStream stream = NdsRom.getRomStream(f);\n\t\tif(f == null)\n\t\t\treturn null;\n\t\treturn new NdsRom(f,stream);\n\t}\n\t\n\tprivate NdsRom(File file, InputStream stream ) {\n\t\tFILE = file;\n\t\ttry {\n\t\t\tstream.read( TITLE_BYTES );\n\t\t\tstream.read( GAMECODE_BYTES );\n\t\t\tstream.read( MAKERCODE_BYTES );\n\t\t\tstream.skip( INFO_OFFSET );\n\t\t\tstream.read( INFO_BYTES );\n\n\t\t\t// Load info iff a valid address was provided in INFO_BYTES\n\t\t\tint info_skip = composeInt( INFO_BYTES ) - INFO_ADDRESS - INFO_BYTES.length;\n\n\t\t\tif ( info_skip > 0 ) {\n\n\t\t\t\tlongSkip( stream, info_skip );\n\n\t\t\t\tstream.skip( ICON_OFFSET ); // Some junk data before the icon\n\n\t\t\t\t// Also iterate to read large sections\n\t\t\t\tint read_index = 0;\n\t\t\t\twhile ( read_index < ICON_BYTES.length ) {\n\t\t\t\t\tread_index += stream.read( ICON_BYTES, read_index, ICON_BYTES.length - read_index );\n\t\t\t\t}\n\n\t\t\t\tstream.read( PALETTE_BYTES );\n\t\t\t\tstream.read( TITLE_JP_BYTES );\n\t\t\t\tstream.read( TITLE_EN_BYTES );\n\t\t\t\tstream.read( TITLE_FR_BYTES );\n\t\t\t\tstream.read( TITLE_DE_BYTES );\n\t\t\t\tstream.read( TITLE_IT_BYTES );\n\t\t\t\tstream.read( TITLE_ES_BYTES );\n\t\t\t}\n\n\t\t} catch ( IOException e ) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\tfinally {\n\t\t\ttry {\n\t\t\t\tstream.close();\n\t\t\t} catch (IOException e) {\n\t\t\t\t// TODO Auto-generated catch block\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\t}\n\n\t//--------------------------------------------------------------------------\n\n\t// Iterate to skip large sections, in case we're reading an archive\n\tprivate void longSkip( InputStream stream, int skip ) throws IOException {\n\t\tlong skipped_total = 0;\n\t\twhile ( skipped_total < skip ) {\n\t\t\tskipped_total += stream.skip( skip - skipped_total );\n\t\t}\n\t}\n\n\t//--------------------------------------------------------------------------\n\n\tprivate static int composeInt( byte[] bytes ) {\n\t\treturn ByteBuffer.wrap( bytes ).order( ByteOrder.LITTLE_ENDIAN ).getInt();\n\t}\n\n\t//--------------------------------------------------------------------------\n\t\n\tpublic long getGameCode() {\n\t\tif ( game_code == 0 ) game_code = composeInt( GAMECODE_BYTES );\n\t\treturn game_code;\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic Bitmap getIcon() {\n\t\tif ( icon == null && composeInt( INFO_BYTES ) > 0 ) {\n\t\t\ticon = Bitmap.createBitmap( 32, 32, Bitmap.Config.ARGB_8888 );\n\t\t\tCanvas canvas = new Canvas( icon );\n\t\t\tPaint paint = new Paint();\n\t\t\t\n\t\t\tint x, y, index_a, index_b, color_a, color_b;\n\t\t\tByteBuffer palette = ByteBuffer.wrap( PALETTE_BYTES ).order( ByteOrder.LITTLE_ENDIAN );\n\t\t\t\n\t\t\tfor ( int i = 0; i < 512; i ++ ) {\n\t\t\t\tindex_a = ( ICON_BYTES[i]       ) & 15;\n\t\t\t\tindex_b = ( ICON_BYTES[i] >>> 4 ) & 15;\n\t\t\t\t\n\t\t\t\tcolor_a = palette.getShort( index_a * 2 );\n\t\t\t\tcolor_b = palette.getShort( index_b * 2 );\n\t\t\t\t\n\t\t\t\t// Oh fuck me\n\t\t\t\tx = ( 2 * (  i         % 4 )) \n\t\t\t\t  + ( 8 * (( i /  32 ) % 4 ));\n\t\t\t\ty = (     (  i /   4 ) % 8  )\n\t\t\t\t  + ( 8 * (  i / 128 )      );\n\t\t\t\t\n\t\t\t\t// X b b b b b g g|g g g r r r r r\n\t\t\t\tpaint.setARGB( index_a != 0    ? 255 : 0,\n\t\t\t\t\t         ( color_a <<  3 ) & 255, \n\t\t\t\t\t         ( color_a >>> 2 ) & 255,\n\t\t\t\t\t         ( color_a >>> 7 ) & 255 );\n\t\t\t\tcanvas.drawPoint( x, y, paint );\n\t\t\t\tpaint.setARGB( index_b != 0    ? 255 : 0,\n\t\t\t\t\t\t     ( color_b <<  3 ) & 255, \n\t\t\t\t\t\t     ( color_b >>> 2 ) & 255,\n\t\t\t\t\t\t     ( color_b >>> 7 ) & 255 );\n\t\t\t\tcanvas.drawPoint( x + 1, y, paint );\n\t\t\t}\n\t\t}\n\t\treturn icon;\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic boolean isIconLoaded() {\n\t\treturn icon != null;\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic String getTitle() {\n\t\treturn getTitle( null );\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic String getTitle( String lang ) {\n\t\ttry {\n\t\t\tif ( Locale.JAPANESE.getLanguage().equals( lang )) {\n\t\t\t\tif ( title_jp == null ) title_jp = new String( TITLE_JP_BYTES, \"UTF-8\" );\n\t\t\t\treturn title_jp;\n\t\t\t\t\n\t\t\t} else if ( Locale.FRENCH.getLanguage().equals( lang )) {\n\t\t\t\tif ( title_fr == null ) title_fr = new String( TITLE_FR_BYTES, \"UTF-8\" );\n\t\t\t\treturn title_fr;\n\t\t\t\t\n\t\t\t} else if ( Locale.GERMAN.getLanguage().equals( lang )) {\n\t\t\t\tif ( title_de == null ) title_de = new String( TITLE_DE_BYTES, \"UTF-8\" );\n\t\t\t\treturn title_de;\n\t\t\t\t\n\t\t\t} else if ( Locale.ITALIAN.getLanguage().equals( lang )) {\n\t\t\t\tif ( title_it == null ) title_it = new String( TITLE_IT_BYTES, \"UTF-8\" );\n\t\t\t\treturn title_it;\n\t\t\t\t\n\t\t\t} else if ( \"es\".equals( lang )) { // Spanish not in Android?\n\t\t\t\tif ( title_es == null ) title_es = new String( TITLE_ES_BYTES, \"UTF-8\" );\n\t\t\t\treturn title_es;\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tif ( title_en == null ) title_en = new String( TITLE_EN_BYTES, \"UTF-8\" );\n\t\t\t\treturn title_en;\n\t\t\t}\n\t\t\t\n\t\t} catch ( UnsupportedEncodingException e ) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic File getFile() { return FILE; }\n\t\n\t//--------------------------------------------------------------------------\n\n\tstatic boolean isRomArchive( ZipFile file ) {\n\t\tfor ( ZipEntry entry : Collections.list( file.entries() )) {\n\t\t\tif ( entry.getName().matches( ROM_PATTERN )) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t/*\n\tprivate static boolean isRomArchive( RARFile file ) {\n\t\tfor ( RARArchivedFile entry : file.getArchivedFiles() ) {\n\t\t\tif ( entry.getName().matches( ROM_PATTERN )) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t*/\n\t//--------------------------------------------------------------------------\n\t\n\tprivate static InputStream getRomStream( File file ) {\n\t\tif ( file.getName().matches( ROM_PATTERN )) {\n\t\t\ttry { return new FileInputStream( file ); }\n\t\t\tcatch ( FileNotFoundException e ) { return null; }\n\t\t}\n\t\t\n\t\tif ( file.getName().matches( ZIP_PATTERN )) {\n\t\t\ttry { return getRomStream( new ZipFile( file )); }\n\t\t\tcatch ( IOException e ) { return null; }\n\t\t}\n\t\t/*\n\t\tif ( file.getName().matches( RAR_PATTERN )) {\n\t\t\tLog.d( \"NDS\", \"\\nLoading RAR file \" + file.getName() );\n\t\t\ttry { return getRomStream( new RARFile( file )); }\n\t\t\tcatch ( IOException e ) { return null; }\n\t\t}\n\t\t*/\n\t\treturn null;\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tprivate static InputStream getRomStream( ZipFile file ) {\n\t\tfor ( ZipEntry entry : Collections.list( file.entries() )){\n\t\t\tif ( entry.getName().matches( ROM_PATTERN )) {\n\t\t\t\ttry { return file.getInputStream( entry ); }\n\t\t\t\tcatch ( IOException e ) { return null; }\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t/*\n\tprivate static InputStream getRomStream( RARFile file ) {\n\t\tfor ( RARArchivedFile entry : file.getArchivedFiles() ) {\n\t\t\tif ( entry.getName().matches( ROM_PATTERN )) {\n\t\t\t\treturn file.extract( entry );\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t*/\n\t//--------------------------------------------------------------------------\n}\n//------------------------------------------------------------------------------"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/NDSScanner/RomCollection.java",
    "content": "package com.opendoorstudios.ds4droid.NDSScanner;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.os.AsyncTask;\nimport android.util.Log;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.HashSet;\nimport java.util.LinkedList;\nimport java.util.Set;\nimport java.util.zip.ZipFile;\n\n//==============================================================================\npublic class RomCollection {\n\t// NOTE: Rar archives weren't working for some reason. Probably need to plug in a new library.\n\t//--------------------------------------------------------------------------\n\t\n\tprivate static final FileFilter\n\t\t\n\t\tDIR_FILTER = new FileFilter() { @Override public boolean accept( File file ) {\n\t\t\treturn file.isDirectory();\n\t\t}},\n\n\tNDS_FILTER = new FileFilter() {\n\t\t@Override\n\t\tpublic boolean accept( File file ) {\n\t\t\treturn !file.isDirectory() && file.getName().matches( NdsRom.ROM_PATTERN );\n\t\t}\n\t},\n\n\tZIP_FILTER = new FileFilter() {\n\t\t@Override\n\t\tpublic boolean accept( File file ) {\n\t\t\tif ( file.getName().matches( NdsRom.ZIP_PATTERN ) ) {\n\t\t\t\ttry {\n\t\t\t\t\treturn NdsRom.isRomArchive( new ZipFile( file ) );\n\t\t\t\t} catch ( IOException e ) { return false; }\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n\t/*\n\tRAR_FILTER = new FileFilter() { @Override public boolean accept( File file ) {\n\t\tif ( file.getName().matches( \"^.*\\\\.(RAR|rar)$\" )) {\n\t\t\ttry { return isRomArchive( new RARFile( file )); }\n\t\t\tcatch ( IOException e ) { return false; }\n\t\t}\n\t\treturn false;\n\t}},\n\t*/\n\tALL_ROMS_FILTER = new FileFilter() {\n\t\t@Override\n\t\tpublic boolean accept( File file ) {\n\t\t\treturn NDS_FILTER.accept( file )\n\t\t\t\t\t|| ZIP_FILTER.accept( file )\n\t\t\t    /*|| RAR_FILTER.accept( file )*/;\n\t\t}\n\t};\n\n\tprivate SQLiteDatabase DB;\n\tprivate final File           ROOT;\n\n\tprivate final Set<ScanListener> LISTENERS = new HashSet<ScanListener>();\n\n\tprivate NdsRom[] roms;\n\n\t//--------------------------------------------------------------------------\n\n\tpublic RomCollection( Context context, File root ) {\n\t\ttry {\n\t\t\tDB = new RomDatabaseHelper( context ).getWritableDatabase();\n\t\t}\n\t\tcatch(Exception e) {\n\t\t\t//for some reason, this is failing sometimes with a \"SQLiteDatabaseLockedException\".\n\t\t\t//I can't get this to happen on my device, but I see on the Google Play ANR reports.\n\t\t\t//I think it may have something to do with a previous instance of the activity not having\n\t\t\t//closed the connection yet. I made the actual collection instance static, but just as\n\t\t\t//an extra fallback we'll wait a bit here and try to reopen the DB\n\t\t\ttry {\n\t\t\t\tThread.sleep(500);\n\t\t\t} catch (InterruptedException e1) {\n\t\t\t\t// TODO Auto-generated catch block\n\t\t\t\te1.printStackTrace();\n\t\t\t}\n\t\t\tDB = new RomDatabaseHelper( context ).getWritableDatabase();\n\t\t}\n\t\tROOT = root;\n\t}\n\n\t//--------------------------------------------------------------------------\n\n\tpublic void update( final Context context ) {\n\t\tnew AsyncTask<Void,Void,Void>() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onPreExecute() {\n\t\t\t\tfor ( ScanListener listener : LISTENERS ) {\n\t\t\t\t\tlistener.onScanStarted( RomCollection.this );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic Void doInBackground( Void... x ) {\n\t\t\t\tSharedPreferences prefs = context.getSharedPreferences( \"ndsscanner\", Context.MODE_PRIVATE );\n\t\t\n\t\t\t\t// Delete first, ask questions later\n\t\t\t\tCursor cursor = DB.query( \"roms\", new String[]{ \"path\" }, null, null, null, null, null );\n\t\t\t\tDB.beginTransaction();\n\t\t\t\twhile ( cursor.moveToNext() ) {\n\t\t\t\t\tif ( !new File( cursor.getString( 0 ) ).exists() ) {\n\t\t\t\t\t\tDB.delete( \"roms\", \"path=?\", new String[]{ cursor.getString( 0 ) } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tDB.setTransactionSuccessful();\n\t\t\t\tDB.endTransaction();\n\t\t\t\tcursor.close();\n\t\t\n\t\t\t\tlong    last_scan = prefs.getLong(    \"last_scan\", 0 );\n\t\t\t\tboolean recursive = prefs.getBoolean( \"recursive\", true );\n\t\t\n\t\t\t\tDB.beginTransaction();\n\t\t\t\tscanDirectory( ROOT, last_scan, recursive, 0 );\n\t\t\t\tDB.setTransactionSuccessful();\n\t\t\t\tDB.endTransaction();\n\t\t\t\tprefs.edit().putLong( \"last_scan\", System.currentTimeMillis() ).commit();\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onPostExecute( Void x ) {\n\t\t\t\troms = null;\n\t\t\t\tfor ( ScanListener listener : LISTENERS ) {\n\t\t\t\t\tlistener.onScanFinished( RomCollection.this );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}.execute();\n\t}\n\t\n\tpublic void clear() {\n\t\tDB.beginTransaction();\n\t\tDB.delete( \"roms\", null, null );\n\t\tDB.setTransactionSuccessful();\n\t\tDB.endTransaction();\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tprivate void scanDirectory( File file, long last_scan, boolean recursive, int recursionLevel ) {\n\t\t\n\t\tContentValues vals = new ContentValues();\n\t\tNdsRom rom;\n\t\tInputStream stream;\n\t\t\n\t\tif(recursionLevel > 5)\n\t\t\treturn; //if the ROMs are more than 5 layers deep... well... they'll just have to use the file browser\n\t\t\n\t\ttry\n\t\t{\n\t\t\t// Insert DB entries for all matching rom files\n\t\t\tfor ( File f : file.listFiles( ALL_ROMS_FILTER )) {\n\t\t\t\tvals.clear();\n\t\t\t\t\n\t\t\t\trom = NdsRom.MakeRom(f);\n\t\t\t\tif(f == null)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tvals.put( \"path\",     f.getAbsolutePath() );\n\t\t\t\tvals.put( \"title\",    rom.getTitle()      );\n\t\t\t\tvals.put( \"gamecode\", rom.getGameCode()   );\n\t\t\t\t\n\t\t\t\tDB.insertWithOnConflict( \"roms\", null, vals, SQLiteDatabase.CONFLICT_IGNORE );\n\t\t\t}\n\t\t\t\n\t\t\t// Subdirectories\n\t\t\tif ( recursive ) for ( File dir : file.listFiles( DIR_FILTER )) {\n\t\t\t\tif ( dir.lastModified() > last_scan ) scanDirectory( dir, last_scan, recursive, recursionLevel + 1 );\n\t\t\t}\n\t\t}\n\t\tcatch(Exception e)\n\t\t{\n\t\t\t//on my x86 emulator I'm not allowed to read /mnt/sdcard/.android_secure\n\t\t\t//if we get this, just skip the directory\n\t\t\tLog.d(\"nds4droid\", \"Unable to scan \" + file.getAbsolutePath());\n\t\t}\n\t\t\n\t}\n\n\t//--------------------------------------------------------------------------\n\t\n\tpublic void addListener( ScanListener listener ) {\n\t\tLISTENERS.add( listener );\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic void removeListener( ScanListener listener ) {\n\t\tLISTENERS.remove( listener );\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic void clearListeners() {\n\t\tLISTENERS.clear();\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic NdsRom[] getRoms() {\n\t\tif ( roms == null ) {\n\t\t\tfinal LinkedList<NdsRom> list = new LinkedList<NdsRom>(); \n\t\t\tCursor c = DB.query( \"roms\", new String[]{ \"path\" },\n\t\t\t                     null, null, null, null, \"title\" );\n\t\t\twhile ( c.moveToNext() ) {\n\t\t\t\tfinal NdsRom rom = NdsRom.MakeRom(new File( c.getString( 0 )));\n\t\t\t\tif(rom == null)\n\t\t\t\t\tcontinue;\n\t\t\t\tlist.add(rom);\n\t\t\t}\n\t\t\troms = new NdsRom[list.size()];\n\t\t\tlist.toArray(roms);\n\t\t\tc.close();\n\t\t}\n\t\treturn roms;\n\t}\n\t\n\t//--------------------------------------------------------------------------\n\t\n\t//==========================================================================\n\tpublic interface ScanListener {\n\t\t//----------------------------------------------------------------------\n\t\t\n\t\tpublic void onScanStarted(  RomCollection collection );\n\t\tpublic void onScanFinished( RomCollection collection );\n\t\t\n\t\t//----------------------------------------------------------------------\n\t}\n\t//--------------------------------------------------------------------------\n}\n//------------------------------------------------------------------------------\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/NDSScanner/RomDatabaseHelper.java",
    "content": "package com.opendoorstudios.ds4droid.NDSScanner;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\n\n//==============================================================================\npublic class RomDatabaseHelper extends SQLiteOpenHelper {\n\t//--------------------------------------------------------------------------\n\t\n\tpublic static final String DB_NAME    = \"roms.db\";\n\tpublic static final int    DB_VERSION = 1;\n\t\n\t//--------------------------------------------------------------------------\n\t\n\tpublic RomDatabaseHelper( Context context ) {\n\t\tsuper( context, DB_NAME, null, DB_VERSION );\n\t}\n\n\t//--------------------------------------------------------------------------\n\n\t@Override\n\tpublic void onCreate( SQLiteDatabase db ) {\n\t\tdb.execSQL(\n\t\t\t\"CREATE TABLE roms            ( \" +\n\t\t\t\t\"path     TEXT PRIMARY KEY, \" +\n\t\t\t\t\"title    TEXT            , \" +\n\t\t\t\t\"gamecode TEXT              \" +\n\t\t\t\");\" );\n\t}\n\n\t//--------------------------------------------------------------------------\n\t\n\t@Override\n\tpublic void onUpgrade( SQLiteDatabase db, int old_version, int new_version ) {\n\t\tswitch ( old_version ) {\n\t\t}\t\n\t}\n\t\n\t//--------------------------------------------------------------------------\n}\n//------------------------------------------------------------------------------"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/Settings.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\nCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport java.util.Locale;\r\nimport java.util.Map.Entry;\r\n\r\nimport android.content.Context;\r\nimport android.content.Intent;\r\nimport android.content.SharedPreferences;\r\nimport android.content.pm.PackageInfo;\r\nimport android.content.pm.PackageManager.NameNotFoundException;\r\nimport android.graphics.Rect;\r\nimport android.os.Bundle;\r\nimport android.os.Environment;\r\nimport android.preference.ListPreference;\r\nimport android.preference.Preference;\r\nimport android.preference.Preference.OnPreferenceClickListener;\r\nimport android.preference.PreferenceActivity;\r\nimport android.preference.PreferenceManager;\r\nimport android.view.KeyEvent;\r\n\r\npublic class Settings extends PreferenceActivity {\r\n\r\n\t\r\n\tstatic final int EDIT_LAYOUT_ID = 1337;\r\n\t\r\n\t@Override\r\n\tpublic void onCreate(Bundle savedInstanceState) {\r\n\t\tsuper.onCreate(savedInstanceState);\r\n\t\taddPreferencesFromResource(R.xml.settings);\r\n\t\t\r\n\t\tfinal SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\r\n\t\tfindPreference(EDIT_LAYOUT).setOnPreferenceClickListener(new OnPreferenceClickListener() {\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic boolean onPreferenceClick(Preference pref) {\r\n\t\t\t\tstartActivityForResult(new Intent(Settings.this, ButtonLayoutEditor.class), EDIT_LAYOUT_ID);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t});\r\n\t\t\r\n\t\tfindPreference(RESET_LAYOUT).setOnPreferenceClickListener(new OnPreferenceClickListener() {\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic boolean onPreferenceClick(Preference preference) {\r\n\t\t\t\tapplyLayoutDefaults(prefs, true);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t});\r\n\t\t\r\n\t\tfindPreference(EDIT_MAPPINGS).setOnPreferenceClickListener(new OnPreferenceClickListener() {\r\n\r\n\t\t\t@Override\r\n\t\t\tpublic boolean onPreferenceClick(Preference preference) {\r\n\t\t\t\tstartActivity(new Intent(Settings.this, KeyMapSettings.class));\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t});\r\n\t\t\t\r\n\t}\r\n\t\r\n\tstatic void applyLayoutDefaults(SharedPreferences prefs, boolean overwrite) {\r\n\t\tSharedPreferences.Editor edit = prefs.edit();\r\n\t\tfor(Entry<Integer, Button> button : Button.portraitToDefault.entrySet()) {\r\n\t\t\tfinal String prefBase = \"Controls.Portrait.\" + Button.getButtonName(button.getValue().id);\r\n\t\t\tif(!overwrite && prefs.contains(prefBase + \".Left\"))\r\n\t\t\t\tcontinue;\r\n\t\t\tedit.remove(prefBase + \".Left\");\r\n\t\t\tedit.remove(prefBase + \".Right\");\r\n\t\t\tedit.remove(prefBase + \".Top\");\r\n\t\t\tedit.remove(prefBase + \".Bottom\");\r\n\t\t}\r\n\t\tif(overwrite || !prefs.contains(\"Controls.Portrait.Draw\"))\r\n\t\t\t\tedit.putBoolean(\"Controls.Portrait.Draw\", true);\r\n\t\tfor(Entry<Integer, Button> button : Button.landscapeToDefault.entrySet()) {\r\n\t\t\tfinal String prefBase = \"Controls.Landscape.\" + Button.getButtonName(button.getValue().id);\r\n\t\t\tif(!overwrite && prefs.contains(prefBase + \".Left\"))\r\n\t\t\t\tcontinue;\r\n\t\t\tedit.remove(prefBase + \".Left\");\r\n\t\t\tedit.remove(prefBase + \".Right\");\r\n\t\t\tedit.remove(prefBase + \".Top\");\r\n\t\t\tedit.remove(prefBase + \".Bottom\");\r\n\t\t}\r\n\t\tif(overwrite || !prefs.contains(\"Controls.Landscape.Draw\"))\r\n\t\t\tedit.putBoolean(\"Controls.Landscape.Draw\", true);\r\n\t\tif(overwrite || !prefs.contains(BUTTON_TRANSPARENCY))\r\n\t\t\tedit.putInt(BUTTON_TRANSPARENCY, 78);\r\n\t\tif(overwrite || !prefs.contains(HAPTIC))\r\n\t\t\tedit.putBoolean(HAPTIC, false);\r\n\t\tif(overwrite || !prefs.contains(ALWAYS_TOUCH))\r\n\t\t\tedit.putBoolean(ALWAYS_TOUCH, false);\r\n\t\tedit.apply();\r\n\t}\r\n\t\r\n\tpublic static final String SHOW_TOUCH_MESSAGE = \"ShowTouchMessage\";\r\n\tpublic static final String DESMUME_PATH = \"DeSmuMEPath\";\r\n\tpublic static final String SHOW_FPS = \"DisplayFps\";\r\n\tpublic static final String FRAME_SKIP = \"FrameSkip\";\r\n\tpublic static final String SCREEN_FILTER = \"Filter\";\r\n\tpublic static final String RENDERER = \"Renderer\";\r\n\tpublic static final String ENABLE_SOUND = \"SoundCore2\";\r\n\tpublic static final String SHOW_SOUND_MESSAGE = \"ShowSoundMessage\";\r\n\tpublic static final String INSTALLED_RELEASE = \"InstalledRelease\";\r\n\tpublic static final String EDIT_LAYOUT = \"Controls.EditLayout\";\r\n\tpublic static final String RESET_LAYOUT = \"Controls.ResetLayout\";\r\n\tpublic static final String LCD_SWAP = \"LCDsSwap\";\r\n\tpublic static final String BUTTON_TRANSPARENCY = \"Controls.Transparency\";\r\n\tpublic static final String HAPTIC = \"Controls.Haptic\";\r\n\tpublic static final String EDIT_MAPPINGS = \"Controls.EditMappings\";\r\n\tpublic static final String MAPPING_UP = \"Controls.KeyMap.Up\";\r\n\tpublic static final String MAPPING_DOWN = \"Controls.KeyMap.Down\";\r\n\tpublic static final String MAPPING_LEFT = \"Controls.KeyMap.Left\";\r\n\tpublic static final String MAPPING_RIGHT = \"Controls.KeyMap.Right\";\r\n\tpublic static final String MAPPING_A = \"Controls.KeyMap.A\";\r\n\tpublic static final String MAPPING_B = \"Controls.KeyMap.B\";\r\n\tpublic static final String MAPPING_X = \"Controls.KeyMap.X\";\r\n\tpublic static final String MAPPING_Y = \"Controls.KeyMap.Y\";\r\n\tpublic static final String MAPPING_START = \"Controls.KeyMap.Start\";\r\n\tpublic static final String MAPPING_SELECT = \"Controls.KeyMap.Select\";\r\n\tpublic static final String MAPPING_L = \"Controls.KeyMap.L\";\r\n\tpublic static final String MAPPING_R = \"Controls.KeyMap.R\";\r\n\tpublic static final String MAPPING_TOUCH = \"Controls.KeyMap.Touch\";\r\n\tpublic static final String MAPPING_OPTIONS = \"Controls.KeyMap.Options\";\r\n\tpublic static final String DONT_ROTATE_LCDS = \"WindowRotate\";\r\n\tpublic static final String LANGUAGE = \"Language\";\r\n\tpublic static final String ENABLE_MICROPHONE = \"EnableMicrophone\";\r\n\tpublic static final String ALWAYS_TOUCH = \"Controls.AlwaysTouch\";\r\n\tpublic static final String MAINTAIN_ASPECT_RATIO = \"MaintainAspectRatio\";\r\n\tpublic static final String MAIN_SCREEN_ONLY = \"MainScreenOnly\";\r\n\tpublic static final String SPECIFIC_SCREEN_ONLY = \"SpecificScreenOnly\";\r\n\tpublic static final String FIRST_OUYA_RUN = \"FirstOUYARun\";\r\n\tpublic static final String LAST_ROM_DIR = \"LastROMDir\";\r\n\tpublic static final String CPU_MODE = \"CpuMode\";\r\n\tpublic static final String SOUND_SYNC_MODE = \"SynchMode\";\r\n\tpublic static final String JIT_SIZE =\"JitSize\";\r\n\tpublic static final String ENABLE_FOG = \"EnableFog\";\r\n\tpublic static final String ENABLE_AUTOSAVE = \"EnableAutosave\";\r\n\tpublic static final String AUTOSVAE_FREQUENCY = \"AutosaveFrequency\";\r\n\tpublic static final String DISABLE_ROM_BROWSER = \"DisableROMBrowser\";\r\n\t\r\n\tstatic void applyMappingDefaults(SharedPreferences prefs, boolean overwrite) {\r\n\t\tfinal SharedPreferences.Editor editor = prefs.edit();\r\n\t\tif(overwrite || !prefs.contains(MAPPING_UP))\r\n\t\t\teditor.putInt(MAPPING_UP, KeyEvent.KEYCODE_DPAD_UP);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_DOWN))\r\n\t\t\teditor.putInt(MAPPING_DOWN, KeyEvent.KEYCODE_DPAD_DOWN);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_LEFT))\r\n\t\t\teditor.putInt(MAPPING_LEFT, KeyEvent.KEYCODE_DPAD_LEFT);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_RIGHT))\r\n\t\t\teditor.putInt(MAPPING_RIGHT, KeyEvent.KEYCODE_DPAD_RIGHT);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_A))\r\n\t\t\teditor.putInt(MAPPING_A, KeyEvent.KEYCODE_BUTTON_B);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_B))\r\n\t\t\teditor.putInt(MAPPING_B, KeyEvent.KEYCODE_BUTTON_A);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_X))\r\n\t\t\teditor.putInt(MAPPING_X, KeyEvent.KEYCODE_BUTTON_Y);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_Y))\r\n\t\t\teditor.putInt(MAPPING_Y, KeyEvent.KEYCODE_BUTTON_X);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_START))\r\n\t\t\teditor.putInt(MAPPING_START, KeyEvent.KEYCODE_BUTTON_THUMBR);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_SELECT))\r\n\t\t\teditor.putInt(MAPPING_SELECT, KeyEvent.KEYCODE_BUTTON_THUMBL);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_L))\r\n\t\t\teditor.putInt(MAPPING_L, KeyEvent.KEYCODE_BUTTON_L1);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_R))\r\n\t\t\teditor.putInt(MAPPING_R, KeyEvent.KEYCODE_BUTTON_R1);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_TOUCH))\r\n\t\t\teditor.putInt(MAPPING_TOUCH, KeyEvent.KEYCODE_T);\r\n\t\tif(overwrite || !prefs.contains(MAPPING_OPTIONS))\r\n\t\t\teditor.putInt(MAPPING_OPTIONS, KeyEvent.KEYCODE_BUTTON_START);\r\n\t\teditor.apply();\r\n\t}\r\n\t\r\n\tpublic static void applyDefaults(Context context) {\r\n\t\tfinal SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\r\n\t\tSharedPreferences.Editor editor = prefs.edit();\r\n\t\t\r\n\t\tif(MainActivity.IS_OUYA) {\r\n\t\t\t//check if we should overwrite settings with the OUYA defaults\r\n\t\t\tif(!prefs.contains(FIRST_OUYA_RUN)) {\r\n\t\t\t\teditor.putBoolean(FIRST_OUYA_RUN, true);\r\n\t\t\t\t\r\n\t\t\t\teditor.putBoolean(\"Controls.Landscape.Draw\", false);\r\n\t\t\t\teditor.putBoolean(\"Controls.Portrait.Draw\", false);\r\n\t\t\t\teditor.putBoolean(SHOW_TOUCH_MESSAGE, false);\r\n\t\t\t\teditor.putBoolean(ALWAYS_TOUCH, true);\r\n\t\t\t\teditor.putBoolean(ENABLE_SOUND, true);\r\n\t\t\t\teditor.putBoolean(ENABLE_MICROPHONE, false);\r\n\t\t\t\teditor.putBoolean(SHOW_SOUND_MESSAGE, false);\r\n\t\t\t\t\r\n\t\t\t\teditor.apply();\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif(prefs.contains(INSTALLED_RELEASE)) {\r\n\t\t\tint currentInstall = prefs.getInt(INSTALLED_RELEASE, 0);\r\n\t\t\tif(prefs.contains(FRAME_SKIP)) {\r\n\t\t\t\tint currentFS = Integer.valueOf(prefs.getString(FRAME_SKIP, \"0\"));\r\n\t\t\t\t//from version 20->21 the default frameskip changed from 1 to 3\r\n\t\t\t\tif(currentInstall <= 20 && currentFS == 1)\r\n\t\t\t\t\teditor.putString(FRAME_SKIP, \"3\");\r\n\t\t\t}\r\n\t\t\tif(prefs.contains(CPU_MODE)) {\r\n\t\t\t\t//the new default cpu engine in 35 is \"lightning jit\"\r\n\t\t\t\tif(currentInstall <= 34)\r\n\t\t\t\t\teditor.putString(CPU_MODE, \"2\");\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif(!prefs.contains(SHOW_TOUCH_MESSAGE))\r\n\t\t\teditor.putBoolean(SHOW_TOUCH_MESSAGE, true);\r\n\t\tif(!prefs.contains(SHOW_FPS))\r\n\t\t\teditor.putBoolean(SHOW_FPS, false);\r\n\t\tif(!prefs.contains(FRAME_SKIP))\r\n\t\t\teditor.putString(FRAME_SKIP, \"3\");\r\n\t\tif(!prefs.contains(SCREEN_FILTER))\r\n\t\t\teditor.putString(SCREEN_FILTER, \"0\");\r\n\t\tif(!prefs.contains(RENDERER))\r\n\t\t\teditor.putString(RENDERER, \"2\");\r\n\t\tif(!prefs.contains(ENABLE_SOUND))\r\n\t\t\teditor.putBoolean(ENABLE_SOUND, false);\r\n\t\tif(!prefs.contains(SHOW_SOUND_MESSAGE))\r\n\t\t\teditor.putBoolean(SHOW_SOUND_MESSAGE, true);\r\n\t\tif(!prefs.contains(LCD_SWAP))\r\n\t\t\teditor.putBoolean(LCD_SWAP, false);\r\n\t\tif(!prefs.contains(DONT_ROTATE_LCDS))\r\n\t\t\teditor.putBoolean(DONT_ROTATE_LCDS, false);\r\n\t\tif(!prefs.contains(ENABLE_MICROPHONE))\r\n\t\t\teditor.putBoolean(ENABLE_MICROPHONE, true);\r\n\t\tif(!prefs.contains(MAINTAIN_ASPECT_RATIO))\r\n\t\t\teditor.putBoolean(MAINTAIN_ASPECT_RATIO, true);\r\n\t\tif(!prefs.contains(MAIN_SCREEN_ONLY))\r\n\t\t\teditor.putBoolean(MAIN_SCREEN_ONLY, false);\r\n\t\tif(!prefs.contains(SPECIFIC_SCREEN_ONLY))\r\n\t\t\teditor.putString(SPECIFIC_SCREEN_ONLY, \"0\");\r\n\t\tif(!prefs.contains(LAST_ROM_DIR))\r\n\t\t\teditor.putString(LAST_ROM_DIR, Environment.getExternalStorageDirectory().getPath() );\r\n\t\tif(!prefs.contains(CPU_MODE))\r\n\t\t\teditor.putString(CPU_MODE, \"2\");\r\n\t\tif(!prefs.contains(SOUND_SYNC_MODE))\r\n\t\t\teditor.putString(SOUND_SYNC_MODE, \"0\");\r\n\t\tif(!prefs.contains(ENABLE_FOG))\r\n\t\t\teditor.putBoolean(ENABLE_FOG, true);\r\n\t\tif(!prefs.contains(JIT_SIZE))\r\n\t\t\teditor.putInt(JIT_SIZE,10);\r\n\t\tif(!prefs.contains(ENABLE_AUTOSAVE))\r\n\t\t\teditor.putBoolean(ENABLE_AUTOSAVE, true);\r\n\t\tif(!prefs.contains(AUTOSVAE_FREQUENCY))\r\n\t\t\teditor.putString(AUTOSVAE_FREQUENCY, \"1\");\r\n\t\tif(!prefs.contains(DISABLE_ROM_BROWSER))\r\n\t\t\teditor.putBoolean(DISABLE_ROM_BROWSER, false);\r\n\t\tif(!prefs.contains(LANGUAGE)) {\r\n\t\t\tfinal String userLanguage = Locale.getDefault().getISO3Language();\r\n\t\t\tint lang = 1; //english\r\n\t\t\tif(userLanguage.equals(\"jpn\")) \r\n\t\t\t\tlang = 0;\t\t\t\r\n\t\t\telse if(userLanguage.equals(\"fra\")) \r\n\t\t\t\tlang = 2;\r\n\t\t\telse if(userLanguage.equals(\"deu\"))\r\n\t\t\t\tlang = 3;\r\n\t\t\telse if(userLanguage.equals(\"ita\"))\r\n\t\t\t\tlang = 4;\r\n\t\t\telse if(userLanguage.equals(\"spa\"))\r\n\t\t\t\tlang = 5;\r\n\t\t\teditor.putString(LANGUAGE, String.valueOf(lang));\r\n\t\t}\r\n\t\tapplyLayoutDefaults(prefs, false);\r\n\t\tapplyMappingDefaults(prefs, false);\r\n\t\ttry {\r\n\t\t\tPackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);\r\n\t\t\teditor.putInt(INSTALLED_RELEASE, info.versionCode);\r\n\t\t} catch (NameNotFoundException e) {\r\n\t\t}\r\n\t\teditor.apply();\r\n\t}\r\n\t\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/SliderPreference.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\nimport android.content.Context;\r\nimport android.preference.DialogPreference;\r\nimport android.util.AttributeSet;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.widget.ImageView;\r\nimport android.widget.SeekBar;\r\nimport android.widget.TextView;\r\nimport android.widget.SeekBar.OnSeekBarChangeListener;\r\n\r\npublic class SliderPreference extends DialogPreference implements OnSeekBarChangeListener {\r\n\r\n\tpublic SliderPreference(Context context, AttributeSet attrs) {\r\n\t\tsuper(context, attrs);\r\n\t\t\r\n\t}\r\n\t\r\n\tprivate SeekBar seek;\r\n\tprivate int currentValue;\r\n\tprivate static final int defaultValue = 10;\r\n\tprivate TextView currentValueDisplay;\r\n\t\r\n\t@Override\r\n\tprotected View onCreateDialogView() {\r\n\r\n\t\tcurrentValue = getPersistedInt(defaultValue);\r\n\r\n\t\tLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r\n\t\tView view = inflater.inflate(R.layout.dialog_slider_noimg, null);\r\n\r\n\t\t((TextView) view.findViewById(R.id.min_value_noimg)).setText(\"0\");\r\n\t\t((TextView) view.findViewById(R.id.max_value_noimg)).setText(\"100\");\r\n\t\tcurrentValueDisplay = (TextView)view.findViewById(R.id.current_value_noimg);\r\n\t\tcurrentValueDisplay.setText(String.valueOf(currentValue));\r\n\r\n\t\tseek = (SeekBar) view.findViewById(R.id.seek_bar_noimg);\r\n\t\tseek.setMax(100);\r\n\t\tseek.setProgress(currentValue);\r\n\t\tseek.setOnSeekBarChangeListener(this);\r\n\r\n\t\treturn view;\r\n\t}\r\n\t\r\n\t@Override\r\n\tprotected void onDialogClosed(boolean positiveResult) {\r\n\t\tsuper.onDialogClosed(positiveResult);\r\n\r\n\t\tif (!positiveResult) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (shouldPersist()) {\r\n\t\t\tpersistInt(currentValue);\r\n\t\t}\r\n\r\n\t\tnotifyChanged();\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic CharSequence getSummary() {\r\n\r\n\t\tString summary = super.getSummary().toString();\r\n\t\tint value = getPersistedInt(currentValue);\r\n\t\treturn summary + \" (currently \" + value + \")\";\r\n\t}\r\n\t\r\n\tpublic void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {\r\n\t\tcurrentValueDisplay.setText(String.valueOf(currentValue = value));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void onStartTrackingTouch(SeekBar paramSeekBar) {\r\n\t\t// TODO Auto-generated method stub\r\n\t\t\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void onStopTrackingTouch(SeekBar paramSeekBar) {\r\n\t\t// TODO Auto-generated method stub\r\n\t\t\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/TransparencyPreference.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\nCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\nimport android.content.Context;\r\nimport android.graphics.drawable.Drawable;\r\nimport android.util.AttributeSet;\r\nimport android.util.DisplayMetrics;\r\nimport android.util.TypedValue;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.preference.DialogPreference;\r\nimport android.widget.ImageView;\r\nimport android.widget.SeekBar;\r\nimport android.widget.TextView;\r\nimport android.widget.SeekBar.OnSeekBarChangeListener;\r\n\r\npublic class TransparencyPreference extends DialogPreference implements OnSeekBarChangeListener {\r\n\r\n\tfinal Drawable example;\r\n\t\r\n\tpublic TransparencyPreference(Context context, AttributeSet attrs) {\r\n\t\tsuper(context, attrs);\r\n\t\t\r\n\t\texample = context.getResources().getDrawable(R.drawable.dpad);\r\n\t}\r\n\r\n\tprivate SeekBar seek;\r\n\tprivate ImageView img;\r\n\tprivate DisplayMetrics metrics;\r\n\r\n\tstatic final int defaultValue = 78;\r\n\tprivate int currentValue;\r\n\r\n\t@Override\r\n\tprotected View onCreateDialogView() {\r\n\r\n\t\tcurrentValue = getPersistedInt(defaultValue);\r\n\r\n\t\tLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r\n\t\tView view = inflater.inflate(R.layout.dialog_slider, null);\r\n\r\n\t\t((TextView) view.findViewById(R.id.min_value)).setText(\"0\");\r\n\t\t((TextView) view.findViewById(R.id.max_value)).setText(\"100\");\r\n\r\n\t\tseek = (SeekBar) view.findViewById(R.id.seek_bar);\r\n\t\tseek.setMax(100);\r\n\t\tseek.setProgress(currentValue);\r\n\t\tseek.setOnSeekBarChangeListener(this);\r\n\r\n\t\timg = (ImageView) view.findViewById(R.id.current_value);\r\n\t\timg.setImageDrawable(example);\r\n\t\timg.setAlpha((int)(currentValue * 2.55f));\r\n\r\n\t\treturn view;\r\n\t}\r\n\t\r\n\r\n\r\n\t\r\n\r\n\t@Override\r\n\tprotected void onDialogClosed(boolean positiveResult) {\r\n\t\tsuper.onDialogClosed(positiveResult);\r\n\r\n\t\tif (!positiveResult) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (shouldPersist()) {\r\n\t\t\tpersistInt(currentValue);\r\n\t\t}\r\n\r\n\t\tnotifyChanged();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic CharSequence getSummary() {\r\n\r\n\t\tString summary = super.getSummary().toString();\r\n\t\tint value = getPersistedInt(currentValue);\r\n\t\treturn summary + \" (currently \" + value + \"%)\";\r\n\t}\r\n\r\n\tpublic void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {\r\n\t\tcurrentValue = value;\r\n\t\timg.setAlpha((int)(currentValue * 2.55f));\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void onStartTrackingTouch(SeekBar arg0) {\r\n\t\t// TODO Auto-generated method stub\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void onStopTrackingTouch(SeekBar arg0) {\r\n\t\t// TODO Auto-generated method stub\r\n\t}\r\n\r\n}"
  },
  {
    "path": "app/src/main/java/com/opendoorstudios/ds4droid/ds4droidApplication.java",
    "content": "package com.opendoorstudios.ds4droid;\r\n\r\n/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n\r\n\r\nimport android.app.Application;\r\n\r\npublic class ds4droidApplication extends Application {\r\n\t\r\n\t@Override\r\n\tpublic void onCreate() {\r\n\t\tsuper.onCreate();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/Android.mk",
    "content": "# Android ndk makefile for ds4droid\r\n\r\nLOCAL_BUILD_PATH := $(call my-dir)\r\n\r\ninclude $(CLEAR_VARS)\r\n\r\ninclude $(LOCAL_BUILD_PATH)/cpudetect/cpudetect.mk\r\n\r\nifeq ($(TARGET_ARCH_ABI),armeabi-v7a)\r\ninclude $(LOCAL_BUILD_PATH)/desmume_neon.mk\r\ninclude $(LOCAL_BUILD_PATH)/desmume_v7.mk\r\nendif\r\n\r\ninclude $(LOCAL_BUILD_PATH)/desmume_compat.mk\r\ninclude $(LOCAL_BUILD_PATH)/desmume/src/android/7z/7z.mk\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/Application.mk",
    "content": "# Android ndk makefile for nds4droid\r\n\r\nAPP_STL := gnustl_static\r\nAPP_ABI := armeabi armeabi-v7a x86\r\n\r\n# For releases\r\nAPP_CFLAGS := -Ofast -ftree-vectorize -fsingle-precision-constant -fprefetch-loop-arrays -fvariable-expansion-in-unroller -ffast-math -funroll-loops -fomit-frame-pointer -fno-math-errno -funsafe-math-optimizations -ffinite-math-only -fdata-sections -fbranch-target-load-optimize2 -fno-exceptions -fno-stack-protector -fforce-addr -funswitch-loops -ftree-loop-im -ftree-loop-ivcanon -fivopts -ftree-loop-if-convert-stores -ftree-loop-distribution -floop-interchange -ftree-loop-linear -floop-block -Wno-psabi\r\n\r\n# For profiling\r\n#APP_CFLAGS := -Ofast -ftree-vectorize -fsingle-precision-constant -fprefetch-loop-arrays -fvariable-expansion-in-unroller -ffast-math -funroll-loops -fno-math-errno -funsafe-math-optimizations -ffinite-math-only -fdata-sections -fbranch-target-load-optimize2 -fno-exceptions -fno-stack-protector -fforce-addr -funswitch-loops -ftree-loop-im -ftree-loop-ivcanon -fivopts -ftree-loop-if-convert-stores -ftree-loop-distribution -floop-interchange -ftree-loop-linear -floop-block -Wno-psabi\r\n\r\n# To generate data for profile guided optimizations\r\n#APP_CFLAGS += -fprofile-generate=/sdcard/profile\r\n#APP_LDFLAGS := -fprofile-generate=/sdcard/profile\r\n\r\n# To use profile guide optimizaions\r\n#APP_CFLAGS += -Wno-coverage-mismatch -fprofile-correction -fprofile-use=d:/ds/profile\r\n#APP_LDFLAGS := -fprofile-use=d:/ds/profile\r\n\r\n# For debugging\r\n#APP_CFLAGS := -Wno-psabi\r\n\r\nNDK_TOOLCHAIN_VERSION=4.9\r\nAPP_PLATFORM := android-9\r\n"
  },
  {
    "path": "app/src/main/jni/android-ndk-profiler/Android.mk",
    "content": "TARGET_thumb_release_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_thumb_release_CFLAGS))\nTARGET_thumb_release_CFLAGS := $(filter-out -fomit-frame-pointer,$(TARGET_thumb_release_CFLAGS))\nTARGET_arm_release_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_arm_release_CFLAGS))\nTARGET_arm_release_CFLAGS := $(filter-out -fomit-frame-pointer,$(TARGET_arm_release_CFLAGS))\nTARGET_CFLAGS := $(filter-out -ffunction-sections,$(TARGET_CFLAGS))\n\nLOCAL_PATH := $(call my-dir)\n\n# include libandprof.a in the build\ninclude $(CLEAR_VARS)\nLOCAL_MODULE := android-ndk-profiler\nLOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libandroid-ndk-profiler.a\nLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)\nLOCAL_EXPORT_LDLIBS := -llog\ninclude $(PREBUILT_STATIC_LIBRARY)\n"
  },
  {
    "path": "app/src/main/jni/android-ndk-profiler/prof.h",
    "content": "/*\n * Part of the android-ndk-profiler library.\n * Copyright (C) Richard Quirk\n *\n * This library is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n */\n#ifndef prof_h_seen\n#define prof_h_seen\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid monstartup(const char *libname);\nvoid moncleanup(void);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/cpudetect/cpu.cpp",
    "content": "/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include <cpu-features.h>\r\n#include <jni.h>\r\n\r\n#define JNI_NOARGS(X) Java_com_opendoorstudios_ds4droid_DeSmuME_##X(JNIEnv* env, jclass* clazz)\r\n\r\n#define CPUTYPE_COMPAT 0\r\n#define CPUTYPE_V7 1\r\n#define CPUTYPE_NEON 2\r\n\r\nextern \"C\"\r\n{\r\n\r\njint JNI_NOARGS(getCPUType)\r\n{\r\n\tAndroidCpuFamily cpuFamily = android_getCpuFamily();\r\n\tuint64_t cpuFeatures = android_getCpuFeatures();\r\n\tif (cpuFamily == ANDROID_CPU_FAMILY_ARM &&\r\n        (cpuFeatures & ANDROID_CPU_ARM_FEATURE_NEON) != 0)\r\n    {\r\n\t\treturn CPUTYPE_NEON;\r\n    }\r\n\telse if (cpuFamily == ANDROID_CPU_FAMILY_ARM &&\r\n        (cpuFeatures & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0)\r\n\t{\r\n\t\treturn CPUTYPE_V7;\r\n\t}\r\n    else\r\n    {\r\n        return CPUTYPE_COMPAT;\r\n    }\r\n}\r\n\r\njint JNI_NOARGS(getCPUFamily)\r\n{\r\n\treturn (int)android_getCpuFamily();\r\n}\r\n\r\n}"
  },
  {
    "path": "app/src/main/jni/cpudetect/cpudetect.mk",
    "content": "# Android ndk makefile for cpudetect\r\n\r\nLOCAL_PATH := $(call my-dir)\r\n\r\nMY_LOCAL_PATH := $(LOCAL_PATH)\r\n\r\ninclude $(CLEAR_VARS)\r\n\r\n\r\nLOCAL_MODULE    \t\t:= \tlibcpudetect\t\t\t\t   \r\nLOCAL_SRC_FILES\t\t\t:= \tcpu.cpp\r\nLOCAL_ARM_MODE \t\t\t:= thumb\r\nLOCAL_ARM_NEON \t\t\t:= false\r\nLOCAL_CFLAGS\t\t\t:= -fexceptions\r\nLOCAL_STATIC_LIBRARIES := cpufeatures\r\n\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n\r\n$(call import-module,cpufeatures)"
  },
  {
    "path": "app/src/main/jni/desmume/AUTHORS",
    "content": "Original author\r\n---------------\r\nyopyop\r\n\r\nCurrent team\r\n------------\r\nGuillaume Duhamel\r\nNormmatt\r\nBernat Muoz (shash)\r\nRiccardo Magliocchetti\r\nMax Tabachenko (CrazyMax)\r\nzeromus\r\nrogerman\r\nLuigi__\r\n\r\nContributors\r\n------------\r\nAllustar\r\namponzi\r\nAnthony Molinaro\r\nape\r\nDamien Nozay (damdoum)\r\ndelfare\r\nRomain Vallet\r\nsnkmad\r\nTheo Berkau\r\nthoduv\r\nTim Seidel (Mighty Max)\r\nPascal Giard (evilynux)\r\nBen Jaques (masscat)\r\nJeff Bland\r\nBernat Muoz (shash)\r\nmatusz\r\nnitsuja\r\ngocha\r\npa__\r\nadelikat\r\nhi-coder\r\nWinterMute\r\npengvado\r\ndormito\r\nldesnogue\r\n\r\nThanks to our super testers for this release\r\n------------\r\nnash679\r\npokefan999\r\ndottorleo\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/COPYING",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year  name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n"
  },
  {
    "path": "app/src/main/jni/desmume/ChangeLog",
    "content": "0.9.7 -> 0.9.8 (r3812-r4228)\n\nYes, it's been a while since the last release, but we haven't been completely idle. There's a brand new top shelf Cocoa frontend to make life far more pleasant for OSX users, and a host of compatibility fixes.\n\nGeneral/Core:\n bug: fix more IPC FIFO errors\n bug: import more save files correctly\n bug: don't autopatch already-patched roms\n bug: fix bugs in piano and guitar grip\n bug: fix ARM7's VRAMSTAT register\n bug: fix memory leaks on compact flash emulation\n bug: fix reading of rom from low header area\n bug: spu: fix some poppy interpolation audio quality issues\n bug: improve timing of dma operations by running through normal mem cycle accounting; fixes an annoying number of games and graphical glitches\n bug: fix opcode MRC and fake bios CRC16\n enh: jitter some related register and irq events to simulate pipeline effects and stimulate some race conditions to other outcomes\n enh: fake (deterministic) some tiny jitter from human's hand holding stylus; some games were accidentally depending on this\n enh: support nocash-stylep rints from arm\n enh: add lua apis for accessing vram\n enh: platforms other than windows receive threading optimizations\n enh: provide diagnostics when system powers off (useful for homebrewers returning from main())\n enh: clarify handling of different console types within the family (ds,dslite,debug)\n enh: vfat support for slot-1 devices\n enh: emulate temperature register\n enh: add paddle emulation\n\nGraphics:\n bug: fix occasional crash from uninitialized blending table\n bug: fix some 2d alpha blending cases resulting in white screens\n bug: fix VRAM_I B_OBJ mirroring and fix sprites rendering across the end of vram\n bug: fix rotoscaled sprites wrapping around screen\n bug: dont fix rotscaled bitmap sprites with alpha==0\n bug: opengl: fix degradation of toon rendering during loadstate\n bug: opengl: alpha blending fixes\n bug: many refinements to opengl renderer\n bug: opengl: support rear-plane/ClearImage emulation (fixes many graphics)\n bug: rasterizer: fix some rare alpha blending cases\n bug: fix bug in environment mapping introduced after 0.9.6\n bug: fix totally glitched out 3d graphics with several improvements involving matrix stack\n bug: fix memory overflows in epx filter\n bug: prevent backdrop from blending with ???\n enh: opengl: better depth buffering emulation\n enh: better support for line segment \"polys\" by detection and special rendering logic\n enh: opengl: support quad primitives directly\n enh: add hq4x filter\n \nWindows:\n bug: fix a long-standing loadstate crash\n bug: fix lag frame accounting\n bug: fix glitches in cheat entry menu\n bug: stop compact flash emulation from accidentally scanning c:\\ sometimes\n enh: add support for game database for improved save type detection\n enh: hotkey for limit framerate toggle\n enh: remove stop and reset toolbar buttons which were accidentally getting used\n enh: additional complexification to desmume's behaviour run from a console prompt. whether it's better is uncertain.\n enh: add support for cheats databases\n enh: improvements to ram search tool\n enh: preliminary support for varying stylus pressure\n enh: add [Display] Show Console=1 to ini file\n enh: more graceful cheat parsing and add some hotkeys\n enh: add 5x window size\n enh: add big endian and 20.12 toggle to memview and ramwatch\n enh: improve FPS throttle feedback and granularity\n enh: add lua menu API\n enh: hud font switching\n enh: add optional file association for .nds to path config dialog\n\nCocoa:\n enh: Big update to cocoa frontend. Pretty much entirely new. (rogerman)\n\nLinux:\n bug: gtk: glitches in rom and recent rom loading\n bug: glade: normalize savestate slot to hotkey mapping\n enh: support soundtouch for use by metaspu\n enh: gtk: add SPU mode selection (Tobias Jakobi)\n enh: cli: better fps limiting (Thomas Jones)\n \nWx: \n  bug: some small fixes here and there (Jan Bcken)\n  enh: lot of code cleanup (Jan Bcken) \n\n0.9.6 -> 0.9.7 (r3493-r3812)\n\nGeneral/Core:\n bug: fix a ton of old, broken cpu opcodes and CP15 logic\n bug: return Z1 and Z2 from TSC (fixes some touch logic)\n bug: gba slot save type detection improved\n bug: handle unusual rom headers more correctly\n bug: dont confuse motion pack commands with save memory commands\n bug: make cheat system a little less flaky and add AR 1.54 support\n bug: fix nondeterministic backup memory behaviour while rerecording\n bug: correct emulation of register accesses of wrong size and during powerdown\n bug: rewrite --cflash-path emulation\n bug: rewrite IPC/GX FIFO, IRQ flag generation, and wait-for-IRQ logics\n bug: rewrite RTC calendar handling; now supports years > 2038\n enh: auto-DLDI patching for homebrew\n enh: --gbaslot-rom=self mounts self.nds in slot2\n enh: more realistic exception handling\n enh: piano controller emulation\n enh: modular slot-1 system for exact emulation of homebrew cards\n \nGraphics:\n bug: edge marking colors were wrong\n bug: handle some \"invalid\" vram configurations correctly\n bug: convert half of geometry engine to fixed point\n bug: fix sprite blend+fadein/fadeout\n bug: improve rasterizer shadows\n bug: fix main memory display DMA\n bug: fix some raster fx timing bugs\n enh: add a hack for improving some non-stencil shadows\n \nWindows:\n bug: misc fixes and improvements to gpu viewer tools\n bug: sub screen layer display toggling fixed\n bug: fixes and improvements to ram watch, ram search, cheats list\n bug: fix start-paused commandline\n bug: fix memory leaks when sound disabled\n bug: improve load average calculators and add arm7 load average\n enh: background input support\n enh: add vsync option\n enh: support more knobs on joysticks\n enh: import cheats from R4 database\n enh: add xinput rumble for 360 pads\n\nLinux/OSX:\n bug: crash less in recent roms list\n enh: Add horizontal screen layout and swap screen ability to gtk frontend (noodlebox)\n enh: Big improvement to joystick support, support complex configurations and multiple devices (noodlebox)\n \n\n0.9.5 -> 0.9.6 (r3075-r3493)\n\nUsers of gtk, cli and gtk-glade frontends please note that now we\nhave a common directory in ~/.config/desmume for config file,\nsaves and savestates. The old .desmume.ini will be moved\nautomatically with the name config but you have to move your saves\nmanually.\n\nSome save files may be invalidated due to use of broken crc logic.\nBack up your DSV files before using this version of the emulator or else\nthe game might wipe it.\n\nGeneral/Core:\n bug: emulate keypad interrupt\n bug: spu overhaul, add capture support\n bug: fix dma address reloading\n bug: fix rom close memory corruption\n bug: fix div and sqrt busy flag bug\n bug: fix vectest\n bug: fix lid savestate desync\n bug: fix texcache memory GB explosion when games use tons of tiny 3d sprites\n bug: fix huge rerecording movie file handle leak\n bug: fix EXXXXXXX cheat codes and some add/edit/save/load bugs\n bug: add 8MBit - 512MBit flash emulation\n bug: fix firmware booted-from-card flag\n bug: fix some failures to wake\n bug: fix some rtc calendar logic\n bug: op_bkpt emulation\n bug: correctly emulate POWCNT1 and POWCNT2 and SPI power device\n bug: corrections to bootup stack configuration\n bug: protect bios from being overwritten\n bug: initialize save data to 0xFF instead of 0x00\n bug: handle relocated irq vectors\n bug: support patched firmwares\n bug: handle 8bit auxspidata, 32bit BLDY, 32bit div regs\n bug: fix some divide by zero cases\n bug: don't print \\n in ideas debug message\n bug: don't let games read off end of cart and crash emulator\n bug: fix SWI 0x0E crc16 ; some save files using wrong crc may be invalidated\n bug: fix many big endian bugs\n bug: fix CPSR.I idle wakeup\n bug: fix loadstate crashes, mostly when sound is enabled\n enh: support devkitpro argv\n enh: add gbaslot-rom commandline\n enh: add no$gba debug message\n enh: add rtc start to dsm header\n\nGraphics:\n bug: fix a mistakenly rendered OBJ window and 3d blend effects\n bug: fixes to matrix stacks, fixing lots of garbled geometry\n bug: fix fog density registers\n bug: fix hblank dma to run also on scanline 262\n bug: fix w/z depth flags for broken GUIs in dual screen 3d games\n bug: fixes to poly sorting\n bug: block 8bit vram writes\n enh: improve accuracy of opengl shaders\n \nWindows:\n bug: fix 16bpp display\n bug: more fixes to multi-gamepads\n bug: cheat windows robustification\n bug: fix that sticky pause state when resetting and loading roms\n bug: dont crash when no sound device is available\n bug: change F10 to be save slot 0\n bug: fix --start-paused\n enh: try not to screensave while using gamepad\n enh: add EPX and EPX1.5X resize filters\n enh: add a japanese translation which will soon be stale like the others\n enh: add fancy ctrl+printscreen with emulator info on it\n enh: add \"lockdown\" window mode to keep window safe from fast stylus action\n enh: add alt+enter fullscreen command\n enh: add card eject command\n enh: add ddraw software mode forcer\n enh: improve oam viewer\n enh: default 3d to rasterizer so we dont have to suggest it 1000 times a day\n enh: add dump-all-memory tool\n enh: add reload rom menu/hotkey\n \nLinux/OSX:\n bug: fix building for nosse2 systems\n bug: fix --num-cores\n bug: fix occasional touchscreen failures\n bug: fix crash starting dsm record\n enh: add --nojoy=1 to fix laptops with accelerometers\n enh: add simple auto frameskip mode in the gtk frontend\n enh: add gui for configuring joystick in the gtk frontend\n enh: make the cli frontend read the ini config file too\n enh: additional OpenAL microphone backend (ncalexan)\n enh: common place for config and saves (Jan Steffens)\n enh: libagg is now optional if you don't need the hud\n\n0.9.4 -> 0.9.5 (r2437-r3075)\n\n0.9.5 introduces an entirely rewritten main emulation loop\nThis totally changes the timing, and totally breaks old savestates.\nThe OSX build is now based on the GTK port which is more up-to-date.\n\nAssorted Highlights:\n  * synchronous SPU mode to fix\tstreaming sounds\n  * win32: lua engine, path configuration, 7z dearchiving support\n  \nGeneral/Core:\n bug: rewrite main emulation loop and cycle accounting, fixes a lot of timings\n bug: add more detailed timing emulation, removes much bogus lag\n bug: rewrite DMA,gxfifo,gxstat; fix many games and no more alternate flush mode\n bug: fix cflash directory support for non-windows and sector-writing\n bug: fix freeze in cart irq\n bug: correctly emulate dma to/from tcm\n bug: fix in thumb LSR carryflag\n bug: fix thumb BX PC switch to arm state\n bug: fix adpcm looping, remove adpcm caching (no longer necessary)\n bug: fixes to swi 3,4,5,8,0x10\n bug: fixes to exmemstat and ipc sync registers\n bug: support new backup commands\n bug: improve bootup bios/firmware emulation steps\n enh: gbaslot: add guitar grip, gbagame flash support, expansion memory pak\n enh: add more powerful antigrain-based drawing library and rewrite OSD system\n enh: ideas-style debugging prints\n enh: most optimizations now SSE instead of SSE2\n enh: more improvements to frameskipping and frame advance/speed controls\n\nGraphics:\n bug: fix backdrop blending with garbage\n bug: fix 256B granularity sprite addressing for sub gpu\n bug: fix obj blending, bmp obj rendering, and some obj window cases\n bug: fix 128-wide captures\n bug: fix 16color BG line buffer overflow\n bug: fix color overflow in capture blending\n bug: fix disp fifo capture\n bug: fix simultaneous vram display and capture via same bank\n bug: fix 3d overflow acknowledge registers\n bug: fix 32bit toon table writes\n bug: change 3d cores to use 18bit color\n bug: fix boxtest (addition overflow!), move clipper to main graphics engine\n bug: fix failure in some cases of polygon clipping\n bug: fix disp3dcnt emulations\n bug: fixes to poly sorting\n bug: fix ogl renderer wireframe support\t\n bug: swrast: fix backface culling of nonconvex polys\n bug: swrast: add clear image and scroll emulation\n bug: swrast: add fog emulation\n bug: swrast: fixes to shadow rendering\n bug: swrast: preliminary edge marking, works decent\n enh: swrast: multicore optimization for a few fps speedup\n  \nWindows:\n bug: fix support for multiple gamepads and gamepad hotkeys\n bug: fix mic noise code and load wav instead of raw; effective in more cases\n bug: fix for several sticky and broken hotkeys, and f10 hotkeys\n bug: fixes in ram search, add DTCM and ITCM searching, ...\n bug: fix sound settings vol slider\n bug: recover from missing window -32000 problem\n bug: don't turn on mic unless mic input is enabled\n enh: x64 build type now supported\n enh: side-by-side and single screen view modes, many fixes to window resizing\n enh: choose any gap size by dragging bottom window edge (must be enabled)\n enh: choose a gap color\n enh: import/export no$GBA savefiles directly\n enh: multicore optimization for filters, rotation, OSD\n enh: soundview can now mute channels\n enh: new ioregview\n enh: common commandline system, many arguments shared with linux\n enh: improve map view tool to support more modes\n enh: add \"FORCE AS CURRENT\" recovery tool for mis-sized savefiles\n enh: add some kind of very small savestate rewinding buffer\n enh: autoframeskip works better\n enh: add Italian translation\n enh: added 2x resizing filters (hq2x, hq2xs, lq2x, lq2xs, 2xsai, supereagle)\n                                (scanlines, nearest2x, bilinear)\n                                  \nLinux:\n enh: alsa microphone support\n enh: hud and osd notification for gtk and cli frontends\n enh: add support for the SSE optimizations\n\n0.9.2 -> 0.9.4 (r1844->r2352->r2437)\n\n0.9.3 was skipped due to emu news sites sneaking it out of our staging area and \nreleasing it prematurely while it still had bugs. I was going to curse them \nindividually, but then I decided that they would just like the publicity.\n\nHighlights:\n * New save autodetection and save file format\n * Full rerecording support\n \nGeneral/Core:\n bug: fix many 64 bit and endian issues\n bug: fix mic input, which was nearly useless before\n bug: fix failures of large dmas\n bug: fix in ipc sync which broke devkitpro touch\n bug: screenshots now exclude hud and rotation\n bug: rewritten vram mapping (fixes corrupted or missing BG)\n enh: add universal commandline system (same commandline options on every port)\n enh: cheats: added Action Replay code parser\n enh: more reliable and useful frameskipping\n enh: SPU: speedup: add adpcm caching\n enh: SPU: speedup: interpolation is now optional\n enh: print svn build number so we can identify people's svn builds from screenshots\n\nGraphics:\n bug: add polygon y-sorting (fixes 3d guis)\n bug: fix texcoordgen mode 3; fixes some ortho sprites and some entirely broken games\n bug: display capture fixes\n bug: fix a number of OBJ modes\n bug: fixes to affine BG modes\n bug: better emulate some translucent OBJ\n bug: more correct handling of color effect windows and backdrop colors\n bug: fix matrix stack overrun which crashed emulator\n bug: swrast: add clear depth image emulation and other fixes to depth buffering\n bug: swrast: fix some toon and highlight cases\n bug: fix bug in matrix stack, fixes some broken models\n enh: add alternate flush mode HACK 3d config toggle, fixes some entirely broken 3d games  \n \nWindows:\n bug: more robust cheats engine and dialog\n enh: more solid avi and wav recording\n enh: improved tools: memory viewer\n enh: added tools: spu viewer, ram watch, ram search\n enh: change build configuration system\n enh: speedup: add gpu core disabling to hide useless screens\n enh: add background pause feature (for when emulator loses focus)\n enh: add missing autohold for L and R\n enh: add chinese translation\n\nGtk frontend:\n enh: switch all of menu/toolbar system to GtkAction + GtkUIManager\n enh: remove the gtglext 3d code\n enh: improve/speedup screen resize and final presentation logic in gtk frontend\n enh: minimal rerecording hookups\n\nCli frontend:\n enh: hooked the frameskip (szigor)\n enh: misc usability improvements: auto pause switch for pausing when focus is lost and exit on escape pressing (szigor)\n enh: hook the fake noise mic; use m to toggle\n\n0.9.1 -> 0.9.2\nGeneral/Core:\n bug: fix error in SBCS/RSCS flags; fixes many odd behaviors and crashes [zeromus]\n bug: add support for sleep mode and power registers [luigi__]\n bug: important fixes to RTC so correct time is actually told [luigi__]\n bug: fix card reads below 0x8000; fixes some game freezes [normatt]\n bug: fix 4 mbit save type; fix non-autodetect savefile dumping [zeromus, matusz]\n enh: add sram to GBA game addon emulation for importing savefiles [zeromus]\n enh: many improvements and feature hookups in linux ports [matusz, luigi__]\n \nGraphics:\n bug: fix specular texture mapping mode [luigi__]\n bug: repairs to some capture modes and vram mapping [zeromus, CrazyMax]\n bug: viewports finally correctly handled [zeromus]\n enh: add software rasterizer. quirky, but on par with opengl [zeromus]\n \nWindows:\n bug: mitigate bad frameskipper; default to old frameskipping mode [zeromus]\n bug: fixes with recent roms and zipfile loading [zeromus]\n bug: fix window position memory [zeromus]\n enh: bios and firmware may now be used and booted [luigi__]\n enh: many display, OSD, and input enhancements [luigi__]\n enh: brand new hotkey and controls binding system [zeromus]\n enh: configurable screen separation [luigi__]\n enh: fast forward key [pa__]\n enh: improvements to mic [luigi__]\n enh: faster updates in debug tools, up to once per frame [pa__]\n\nMac OS X Port:\n enh: added Italian translation thanks to Paolo Bernini [jeff]\n enh: resurrection of GDB stub [sigmaris]\n\n0.9 -> 0.9.1\nGeneral/Core:\n enh: GBA slot emulation  [CrazyMax]\n  - Rumble support (windows only)\n  - GBA game\n enh: Mic support (windows only?) [luigi__]\n enh: Preliminary cheats system [CrazyMax]\n enh: Savestates invalidated, as more variables have been added.\n bug: Added PSG white noise [luigi__]\n bug: fix arm/thumb ROR [zeromus]\n bug: [ 2550645 ] Super Princess Peach: crash when starting a puzzle [zeromus]\n bug: win32: fix spu wav file writer (regression from 0.8) [zeromus,luigi__]\n bug: Much work on FIFOs, still not finished [CrazyMax]\n bug: Many fixes to dma [zeromus, CrazyMax]\n bug: bios WaitForVblank and WaitForInterrupt fixed [luigi__]\n\nGraphics:\n bug: Added sprite blending [luigi__]\n bug: more correct mosaic effects, still imperfect [zeromus]\n bug: Many fixes to tile rendering; all graphics tests now pass [luigi__]\n bug: fix crashes in some affine BG [zeromus]\n bug: Implement some pos test function [luigi__]\n bug: fix texture mapping across texture and palette banks and to unmapped banks [zeromus]\n bug: fix texture handling for texels with MSB set (fixes some texture corruption) [zeromus]\n bug: fix texture coordinate generation, including environment mapping [zeromus]\n bug: texture cache invalidates when palettes change, prevents some texture corruption [zeromus]\n bug: fix display capturing from 2d+3d source when display mode is display-vram [zeromus] \n bug: [ 2488334 ].1 fixes to layer compositing [luigi__]\n bug: [ 2488334 ].3 fix bug in support for hdma affine bg parameters [zeromus]\n bug: Improvements to 3d h-scrolling [luigi__]\n bug: Fix some errors in rendering 512 tall BG [zeromus,CrazyMax] (still not fully resolved)\n bug: Add optional fragment shading pipeline (more precision) [luigi__]\n bug: Fix bug where some sprites got cut of on x=255 [zeromus]\n bug: Implement GXSTAT register [CrazyMax]\n \nWindows:\n bug: resizing and rotating work in vista [luigi__]\n enh: 0 frameskip now lets emulator run at excess speed [zeromus]\n  \nMac OS X Port:\n bug: left key setting no longer gets confused with the right key [jeff]\n enh: more keys can be mapped\n  \n0.8 -> 0.9\n There have been so many changes that this list can hardly be considered complete.\n For this release, we have formatted the list into a high level overview of big changes and bad bugs relative to the previous release. Hopefully what you're interested in.\n This list does not include items which are solely performance boosts, for let us just say that virtually every system has been speeded up.\n  \n * The savestate system is totally changed and incompatible with old savestates.\n * The 3d system should be considered rewritten.\n \nGeneral/Core:\n enh: Convert to c++\n enh: Add functions for a lid open/close. Holding key (default \"Backspace\" in Windows port) while game is freeze/non freeze. [CrazyMax]\n enh: Add secure area decryption from ndstool [zeromus]\n enh: Change savestate code to support loosely bound chunks and more easily other parts of the emu (GE, GPU).\n      The savestate format is changed, but from now on it is in principle more resilient \n      (though it will continue to break as we tinker with the internals) [zeromus]\n enh: Added SSE2 optimizations for matrices. Since we now make an SSE2 build, more optimizations can be made. [CrazyMax]\n enh: Add a preliminary GUI hud system [CrazyMax,zeromus]\n\nCPU/MMU:\n bug: Many fixes in IPC and GE FIFOs. Fixes freezes in NSMB, dsracing, and others. [CrazyMax,luigi__,shash]\n bug: Fix ARM instructions SBC and RSC (likewise SBC in thumb) [normatt]\n bug: Fixed Thumb LDMIA (fixes ingame Dead'n'Furious) [shash]\n bug: Fix repeating DMA (fixes NSMB parallax BG) [zeromus]\n bug: Proper handling for unaligned CPU accesses [luigi__]\n bug: Proper handling for undefined instruction exceptions [Salva Peir]\n bug: correctly return vram control register values (fixes homebrew 3d games) [zeromus]\n enh: Remove 16MB of WRAM at 0x01****** from arm9. Mapped to unused instead. Nobody knows what this was. [zeromus]\n enh: Changed instruction execution to 16 at a time blocks (tested and stable) [shash]\n\nHardware: \n bug: Newer and better sqrt and div emulation; makes SM64DS playable [luigi__,shash,zeromus]\n bug: Add preliminary RTC implementations [CrazyMax]\n enh: Add cosine interpolation in the SPU (conditionally compiled) [zeromus,luigi__]\n enh: Experimental: always one silent non-mixing SPU core at 44.1khz synched with emu, for more precision.\n      The audible core runs with the host, causing music to slow down but not tear or pitch bend. [zeromus]\n\nGraphics:\n - Overhaul 3d:\n  . Move entire GE to core emu.\n  . Move OpenGL renderer to emu core for optional use by platforms, removing ogl_collector. Now every platform shares the same 3d code.\n  . Reorganize 3d code to defer rendering to after 3d vblank. Eliminates tearing, and texturing artifacts. [zeromus]\n  . Add optional fragment shading pipeline (more precision) [luigi__]\n  . Move lighting model to software instead of using opengl's fixed function model [zeromus]\n  . Render shadow volumes; toon shading and highlight table [zeromus, luigi__]\n  . Added texture caching! big speed up. [CrazyMax]\n \n bug: Many assorted tweaks and improvements to 3d and 2d precision [zeromus,CrazyMax,luigi__]\n bug: Fixes to GE: command unpacking, projection and pos-vector mode matrix handling, mult and load commands [zeromus]\n bug: Fix a bug in texture transformation mode 1 [zeromus]\n bug: Fixed GPU rendering bugs in sprites and BG [CrazyMax]\n bug: Fixes to texture conversion [CrazyMax,zeromus]\n bug: Fixes in capture display (no blinking in many games with dual 3D) [CrazyMax]\n bug: Fixes in master brightness (this fixes some games with black screens) [CrazyMax] \n bug: Fixes in screen, backdrop, and sprite blending [luigi__]\n bug: Changed clear depths and how depth initial values are calculated (fixes SM64DS skybox, Castlevania) [shash,lugi__] \n bug: Add 3d layer h-scrolling [zeromus]\n bug: Added transparency and fixed material alpha support and alpha testing on the 3D core [shash]\n bug: Rewrite VRAM mapping control and rendering (more accurate) [CrazyMax,luigi__]\n\n bug: convert colors to opengl better to prevent alpha=31 polys from being ever so slightly transparent [zeromus]\n enh: Add MMU->GPU signal for when vram mappings change to function as a texture cache invalidate signal [zeromus]\n enh: Make matrix 4x4 multiply routines use W-coordinate; carry w coord through pipeline [zeromus]\n  \nMac OS X port:\n bug: Fixed: Filenames and paths with unicode characters now work. [Jeff]\n bug: Fixed: Load state from file button works again. [Jeff]\n enh: Save State panel now pauses emulation while the file selection box is open. [Jeff]\n bug: Fixed: Frozen video output (and/or messed 3d emulation) after loading a state. [Jeff]\n bug: Added option to load the most recent file upon launching the program. [Jeff]\n enh: Added French translation (thanks to Pierre Rudloff). [Jeff]\n enh: Added basic key mapping configuration to application preferences (thanks to Julio Gorg). [Jeff]\n enh: Added keyboard shortcuts for Execute, Pause and Reset command (thanks to Julio Gorg). [Jeff]\n enh: Default key mappings are no longer case sensitive. [Jeff]\n enh: Added ability to limit speed. [Jeff]\n enh: Fixed: Video output should work on software-only 3D renderers. [Jeff]\n \nWindows port:\n bug: Fix a race condition in NDS_3D_Reset and NDS_glInit [zeromus]\n bug: Fix the buggy auto frameskip logic which made the emu slow to a crawl. Now it runs fast! [zeromus]\n bug: Fix resizing, rotate & aspect ration of main window. [CrazyMax,_zeromus]\n bug: Remove multithreading from user interface after finding several synchronization issues [zeromus]\n enh: recent roms menu [luigi_]\n enh: Changed graphics render core to DirectDraw (work faster) [CrazyMax]\n enh: Add an arm9 cpu load average calculator similar to no$. but I dont think it works right. [zeromus]\n enh: Rewrite all debug tools (autoupdate works now) [CrazyMax]\n enh: Rewrite input core & replace config input dialog [CrazyMax]\n enh: Add AVI output [zeromus]\n enh: Add pause toggle and frame advance hotkeys [adelikat]\n enh: Add frame counter display and hud messages framework [adelikat]\n enh: Main window remembers position, size, and a few other emu preferences [adelikat]\n enh: Removed directx sdk dependency for easier building. [zeromus]\n enh: Savestate doesnt unpause emu if it is already paused [adelikat]\n\n0.7.3 -> 0.8\n Cocoa:\n - Save State As function now works. [Jeff B]\n - Recent Items menu now works. [Jeff B]\n - Opening NDS files from Finder now works. [Jeff B]\n - Added screenshot feature. [Jeff B]\n - Added preferences. [Jeff B]\n - Many more strings are translatable now. [Jeff B]\n - Default screen color is black (better represents being \"off\" and easier on eyes at night). [Jeff B]\n - Added sound. [Jeff B]\n - Now is a universal binary. [Jeff B]\n - Leopard resolution icon added. [Jeff B]\n - Added a Japanese translation. [Jeff B]\n - Added an optional status bar (resize handle no longer overlaps screen). [Jeff B]\n - New ROM Info and About DeSmuME windows have been added. [Jeff B]\n - Fixed several bugs in window resizing. [Jeff B]\n - Added FAT image support for homebrew games (thanks to TypeError). [Jeff B]\n - Key config can be changed on the command line. Save/load hotkeys changed (so expose doesn't override). [Jeff B]\n - Key bindings may work better on non-US keyboards now (needs testing). [Jeff B]\n general:\n - Encapsulate GDB debug stub to avoid certain problems [shash]\n - Fixed CPU LD*/ST* bugs [shash]\n - Fixed New SMB mini-games freeze [shash]\n - Fixed possible segfault in ROMReader on ia64 and amd64. [evilynux]\n - Fixed a crash bug with 2D background corrupting memory [shash]\n - Flag check optimization [carlo_bramini]\n - Applied some endian fixes in GPU (thanks to Phazz) [Jeff B]\n gtk-glade:\n - Added DeSmuME version in about dialog. [evilynux]\n - Updated website url in about dialog. [evilynux]\n - Added Brazilian Portuguese translation by Dreampeppers99. [evilynux]\n - Better desktop menu entry following FreeDesktop specifications. [evilynux]\n gtk:\n - Updated website url in about dialog. [evilynux]\n - Better desktop menu entry following FreeDesktop specifications. [evilynux]\n windows port:\n - Added an \"about\" box [shash]\n - DirectInput control interface with joystick support [CrazyMax]\n - Matrix and Light viewer [Acid Burn]\n\t\n0.7.2 -> 0.7.3\n gtk-glade:\n  - Full localization using intltool/gettext. [evilynux]\n general:\n  - Added a README.TRANSLATION documenting the localization process. [evilynux]\n MacOS X:\n  - Initial version of the Mac interface added. [Jeff B]\n\n0.7.1 -> 0.7.2\n spu:\n  - big endian fixes. [cyberwarriorx]\n gpu:\n  - big endian fixes. [marcus_c]\n gtk-glade:\n  - opengl improvements. [masscat]\n general:\n  - Added support for setting NDS firmware language value. [masscat]\n  - Function added for setting firmware language. [masscat]\n  - Mac/msys compilation fixes. [cyberwarriorx]\n  - Fix compilation when pkg-config macros are not available [evilynux]\n\n0.7.0 -> 0.7.1\n general:\n  - Added GDB debugger stub [masscat]\n  - Added new/different GBAMP CFlash image reader/writer [masscat]\n gpu:\n  - Major speedup to the 2D core [shash]\n gtk-glade:\n  - Added command line options. [masscat]\n  - Added FPS limiter [masscat]\n cli:\n  - Added command line options. [masscat]\n  - Added FPS limiter [masscat]\n  - Added option to use OpenGl to render window (allows resizing). [masscat]\n windows port:\n  - Added command line options. [masscat]\n  - Added multiple language support [cyberwarriorx]\n  - Added Danish language translation [thomas-2007]\n\n0.6.0 -> 0.7.0\n general:\n  - Added support for *.duc files [cyberwarriorx]\n gpu:\n  - Added support for sprite rotation/scaling [shash]\n  - Added support for the 3D core (openGL and null plugins) [shash] \n windows port:\n  - A bunch of fixes [Dmitry Krutskih]\n  - Fixed a bug in sound that was causing it to still not work for some\n    people [cyberwarriorx]\n gtk:\n  - Added 3D emulation\n  - Added command line options.\n  - Added option to use OpenGL to render window (allows resizing).\n gtk-glade:\n  - Added 3D emulation\n\n0.5.0 -> 0.6.0\n general:\n  - Added zipped (based on zziplib) and gzipped (based on zlib) rom support.\n arm:\n  - Added relocation interrupt vector.\n  - Added region access right checks.\n  - Enabled LDC/STC instructions.\n  - Fixed powersave (cp15) IRQ wait.\n  - Fixed MOV instructions\n gpu:\n  - Added special color effects.\n  - Added windowing feature.\n  - Fixed transparent direct color backgrounds.\n  - Fixed disabled sprites showing.\n  - Fixed 8/32 bit access to gpu registers.\n  - Fixed missing backgrounds\n  - Support for master brightness\n wifi:\n  - Added RF chip interface.\n  - Added BB chip interface.\n windows port:\n  - Fixed address calculation in disassembler.\n  - Added Force Maintain Ratio option for window stretching\n linux port (cli, gtk and gtk-glade):\n  all:\n   - Added joystick support.\n   - Fixed X and Y buttons.\n  gtk-glade:\n   - Added joystick configuration.\n   - Improved I/O registers viewer tool.\n   - Added save and load states support.\n\n0.3.3 -> 0.5.0\n arm:\n  - Fixed MSR with immediate value opcode.\n  - Fixed LSR_0 thumb opcode (C flag is correctly set now).\n  - Fixed LDR*/STR* opcodes.\n  - Fixed unaligned memory access on THUMB Core.\n  - Added relocating SWI routines.\n bios:\n  - Added decompression functions.\n  - Added GetPitchTable function.\n  - Added GetVolumeTable function.\n  - Added GetCRC16 function.\n  - Added experimental SoundBias function.\n  - Added GetSineTable function.\n cart:\n  - Added CompactFlash/FAT emulation.\n  - Added Get ROM chip ID Cartridge command.\n gpu:\n  - Added framebuffer emulation.\n  - Fixed a bug in GPU (xfin could be greater than LG causing a segfault).\n  - Added support for Display Mode 0(Display Off).\n  - Added the basic framework for Display Mode 3(Display from Main RAM).\n spu:\n  - Added sound emulation.\n  - Added sound core system.\n  - Added WAV write core.\n  - Added dummy core.\n  - Added Direct Sound core.\n linux port:\n  - Added GTK+ GUI.\n  - Added command line interface.\n  - Added stylus and arm9 keypad support in CLI version.\n  - Added FPS display.\n  - Added basic frameskip.\n windows port:\n  - Fixed a bug when displaying a ROM's information.\n  - Added key configuration.\n  - Removed the debug key.\n  - Added new experimental auto frameskip/frame limit code.\n  - Added sound settings dialog.\n  - Added a few menu options for accessing the website, forums, and for\n    submitting bugs.\n general:\n  - Rewrote code in C.\n  - Fixed warnings.\n  - Used defines and typedef's to make things more portable and easier to\n    read.\n  - Added autotools stuff.\n  - Changes to logging system.\n  - Added screenshot function.\n  - Translated most french to english.\n  - Added savestate support.\n  - Added firmware reading support(needs work).\n  - Added Backup Memory support with autodetection.\n  - Fixed some endianess issues.\n  - Fixed things so Visual C++ can compile code.\n  - Added bsd support.\n  - Reworked ROM loading so you can load a different rom without any problems.\n  - Finished NDS_Reset. Now the emulation can be reset even while running.\n"
  },
  {
    "path": "app/src/main/jni/desmume/INSTALL",
    "content": "Installation Instructions\n*************************\n\nCopyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,\nInc.\n\n   Copying and distribution of this file, with or without modification,\nare permitted in any medium without royalty provided the copyright\nnotice and this notice are preserved.  This file is offered as-is,\nwithout warranty of any kind.\n\nBasic Installation\n==================\n\n   Briefly, the shell commands `./configure; make; make install' should\nconfigure, build, and install this package.  The following\nmore-detailed instructions are generic; see the `README' file for\ninstructions specific to this package.  Some packages provide this\n`INSTALL' file but do not implement all of the features documented\nbelow.  The lack of an optional feature in a given package is not\nnecessarily a bug.  More recommendations for GNU packages can be found\nin *note Makefile Conventions: (standards)Makefile Conventions.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You need `configure.ac' if\nyou want to change it or regenerate `configure' using a newer version\nof `autoconf'.\n\n   The simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.\n\n     Running `configure' might take a while.  While running, it prints\n     some messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package, generally using the just-built uninstalled binaries.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.  When installing into a prefix owned by root, it is\n     recommended that the package be configured and built as a regular\n     user, and only the `make install' phase executed with root\n     privileges.\n\n  5. Optionally, type `make installcheck' to repeat any self-tests, but\n     this time using the binaries in their final installed location.\n     This target does not install anything.  Running this target as a\n     regular user, particularly if the prior `make install' required\n     root privileges, verifies that the installation completed\n     correctly.\n\n  6. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\n  7. Often, you can also type `make uninstall' to remove the installed\n     files again.  In practice, not all packages have tested that\n     uninstallation works correctly, even though it is required by the\n     GNU Coding Standards.\n\n  8. Some packages, particularly those that use Automake, provide `make\n     distcheck', which can by used by developers to test that all other\n     targets like `make install' and `make uninstall' work correctly.\n     This target is generally not run by end users.\n\nCompilers and Options\n=====================\n\n   Some systems require unusual options for compilation or linking that\nthe `configure' script does not know about.  Run `./configure --help'\nfor details on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c99 CFLAGS=-g LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\n   You can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you can use GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.  This\nis known as a \"VPATH\" build.\n\n   With a non-GNU `make', it is safer to compile the package for one\narchitecture at a time in the source code directory.  After you have\ninstalled the package for one architecture, use `make distclean' before\nreconfiguring for another architecture.\n\n   On MacOS X 10.5 and later systems, you can create libraries and\nexecutables that work on multiple system types--known as \"fat\" or\n\"universal\" binaries--by specifying multiple `-arch' options to the\ncompiler but only a single `-arch' option to the preprocessor.  Like\nthis:\n\n     ./configure CC=\"gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CXX=\"g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CPP=\"gcc -E\" CXXCPP=\"g++ -E\"\n\n   This is not guaranteed to produce working output in all cases, you\nmay have to build one architecture at a time and combine the results\nusing the `lipo' tool if you have problems.\n\nInstallation Names\n==================\n\n   By default, `make install' installs the package's commands under\n`/usr/local/bin', include files under `/usr/local/include', etc.  You\ncan specify an installation prefix other than `/usr/local' by giving\n`configure' the option `--prefix=PREFIX', where PREFIX must be an\nabsolute file name.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option `--exec-prefix=PREFIX' to `configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=DIR' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.  In general, the\ndefault for these options is expressed in terms of `${prefix}', so that\nspecifying just `--prefix' will affect all of the other directory\nspecifications that were not explicitly provided.\n\n   The most portable way to affect installation locations is to pass the\ncorrect locations to `configure'; however, many packages provide one or\nboth of the following shortcuts of passing variable assignments to the\n`make install' command line to change installation locations without\nhaving to reconfigure or recompile.\n\n   The first method involves providing an override variable for each\naffected directory.  For example, `make install\nprefix=/alternate/directory' will choose an alternate location for all\ndirectory configuration variables that were expressed in terms of\n`${prefix}'.  Any directories that were specified during `configure',\nbut not in terms of `${prefix}', must each be overridden at install\ntime for the entire installation to be relocated.  The approach of\nmakefile variable overrides for each directory variable is required by\nthe GNU Coding Standards, and ideally causes no recompilation.\nHowever, some platforms have known limitations with the semantics of\nshared libraries that end up requiring recompilation when using this\nmethod, particularly noticeable in packages that use GNU Libtool.\n\n   The second method involves providing the `DESTDIR' variable.  For\nexample, `make install DESTDIR=/alternate/directory' will prepend\n`/alternate/directory' before all installation names.  The approach of\n`DESTDIR' overrides is not required by the GNU Coding Standards, and\ndoes not work on platforms that have drive letters.  On the other hand,\nit does better at avoiding recompilation issues, and works well even\nwhen some directory options were not specified in terms of `${prefix}'\nat `configure' time.\n\nOptional Features\n=================\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\n   Some packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\n   Some packages offer the ability to configure how verbose the\nexecution of `make' will be.  For these packages, running `./configure\n--enable-silent-rules' sets the default to minimal output, which can be\noverridden with `make V=1'; while running `./configure\n--disable-silent-rules' sets the default to verbose, which can be\noverridden with `make V=0'.\n\nParticular systems\n==================\n\n   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU\nCC is not installed, it is recommended to use the following options in\norder to use an ANSI C compiler:\n\n     ./configure CC=\"cc -Ae -D_XOPEN_SOURCE=500\"\n\nand if that doesn't work, install pre-built binaries of GCC for HP-UX.\n\n   HP-UX `make' updates targets which have the same time stamps as\ntheir prerequisites, which makes it generally unusable when shipped\ngenerated files such as `configure' are involved.  Use GNU `make'\ninstead.\n\n   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot\nparse its `<wchar.h>' header file.  The option `-nodtk' can be used as\na workaround.  If GNU CC is not installed, it is therefore recommended\nto try\n\n     ./configure CC=\"cc\"\n\nand if that doesn't work, try\n\n     ./configure CC=\"cc -nodtk\"\n\n   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This\ndirectory contains several dysfunctional programs; working variants of\nthese programs are available in `/usr/bin'.  So, if you need `/usr/ucb'\nin your `PATH', put it _after_ `/usr/bin'.\n\n   On Haiku, software installed for all users goes in `/boot/common',\nnot `/usr/local'.  It is recommended to use the following options:\n\n     ./configure --prefix=/boot/common\n\nSpecifying the System Type\n==========================\n\n   There may be some features `configure' cannot figure out\nautomatically, but needs to determine by the type of machine the package\nwill run on.  Usually, assuming the package is built to be run on the\n_same_ architectures, `configure' can figure that out, but if it prints\na message saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS\n     KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option `--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\n   If you want to set default values for `configure' scripts to share,\nyou can create a site shell script called `config.site' that gives\ndefault values for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\n   Variables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified `gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).\n\nUnfortunately, this technique does not work for `CONFIG_SHELL' due to\nan Autoconf bug.  Until the bug is fixed you can use this workaround:\n\n     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash\n\n`configure' Invocation\n======================\n\n   `configure' recognizes the following options to control how it\noperates.\n\n`--help'\n`-h'\n     Print a summary of all of the options to `configure', and exit.\n\n`--help=short'\n`--help=recursive'\n     Print a summary of the options unique to this package's\n     `configure', and exit.  The `short' variant lists options used\n     only in the top level, while the `recursive' variant lists options\n     also present in any nested packages.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`--prefix=DIR'\n     Use DIR as the installation prefix.  *note Installation Names::\n     for more details, including other options available for fine-tuning\n     the installation locations.\n\n`--no-create'\n`-n'\n     Run the configure checks, but stop before creating any output\n     files.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/Makefile.am",
    "content": "EXTRA_DIST = README.LIN README.MAC README.WIN dsm.txt dsv.txt autogen.sh \\\n\t\t$(PO_FILES_IN)\nDISTCLEANFILES = $(PO_FILES)\nSUBDIRS = $(PO_DIR) src\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.5 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n# Foundation, Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\nVPATH = @srcdir@\nam__make_dryrun = \\\n  { \\\n    am__dry=no; \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        echo 'am--echo: ; @echo \"AM\"  OK' | $(MAKE) -f - 2>/dev/null \\\n          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \\\n      *) \\\n        for am__flg in $$MAKEFLAGS; do \\\n          case $$am__flg in \\\n            *=*|--*) ;; \\\n            *n*) am__dry=yes; break;; \\\n          esac; \\\n        done;; \\\n    esac; \\\n    test $$am__dry = yes; \\\n  }\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = .\nDIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \\\n\t$(srcdir)/Makefile.in \\\n\t$(top_srcdir)/autopackage/default.apspec.in \\\n\t$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \\\n\tcompile config.guess config.sub depcomp install-sh missing\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \\\n\t$(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nam__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \\\n configure.lineno config.status.lineno\nmkinstalldirs = $(install_sh) -d\nCONFIG_CLEAN_FILES = autopackage/default.apspec\nCONFIG_CLEAN_VPATH_FILES =\nSOURCES =\nDIST_SOURCES =\nRECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \\\n\thtml-recursive info-recursive install-data-recursive \\\n\tinstall-dvi-recursive install-exec-recursive \\\n\tinstall-html-recursive install-info-recursive \\\n\tinstall-pdf-recursive install-ps-recursive install-recursive \\\n\tinstallcheck-recursive installdirs-recursive pdf-recursive \\\n\tps-recursive uninstall-recursive\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nAM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \\\n\t$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \\\n\tdistdir dist dist-all distcheck\nETAGS = etags\nCTAGS = ctags\nDIST_SUBDIRS = $(SUBDIRS)\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\ndistdir = $(PACKAGE)-$(VERSION)\ntop_distdir = $(distdir)\nam__remove_distdir = \\\n  if test -d \"$(distdir)\"; then \\\n    find \"$(distdir)\" -type d ! -perm -200 -exec chmod u+w {} ';' \\\n      && rm -rf \"$(distdir)\" \\\n      || { sleep 5 && rm -rf \"$(distdir)\"; }; \\\n  else :; fi\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nDIST_ARCHIVES = $(distdir).tar.gz\nGZIP_ENV = --best\ndistuninstallcheck_listfiles = find . -type f -print\nam__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \\\n  | sed 's|^\\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'\ndistcleancheck_listfiles = find . -type f -print\nACLOCAL = @ACLOCAL@\nALL_LINGUAS = @ALL_LINGUAS@\nALSA_CFLAGS = @ALSA_CFLAGS@\nALSA_LIBS = @ALSA_LIBS@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCATALOGS = @CATALOGS@\nCATOBJEXT = @CATOBJEXT@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDATADIRNAME = @DATADIRNAME@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGETTEXT_PACKAGE = @GETTEXT_PACKAGE@\nGLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@\nGLIB_CFLAGS = @GLIB_CFLAGS@\nGLIB_LIBS = @GLIB_LIBS@\nGMOFILES = @GMOFILES@\nGMSGFMT = @GMSGFMT@\nGREP = @GREP@\nGTHREAD_CFLAGS = @GTHREAD_CFLAGS@\nGTHREAD_LIBS = @GTHREAD_LIBS@\nGTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@\nGTKGLEXT_LIBS = @GTKGLEXT_LIBS@\nGTK_CFLAGS = @GTK_CFLAGS@\nGTK_LIBS = @GTK_LIBS@\nHAVE_PKG = @HAVE_PKG@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nINSTOBJEXT = @INSTOBJEXT@\nINTLLIBS = @INTLLIBS@\nINTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@\nINTLTOOL_MERGE = @INTLTOOL_MERGE@\nINTLTOOL_PERL = @INTLTOOL_PERL@\nINTLTOOL_UPDATE = @INTLTOOL_UPDATE@\nINTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@\nINTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@\nINTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@\nINTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@\nLDFLAGS = @LDFLAGS@\nLIBAGG_CFLAGS = @LIBAGG_CFLAGS@\nLIBAGG_LIBS = @LIBAGG_LIBS@\nLIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@\nLIBGLADE_LIBS = @LIBGLADE_LIBS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@\nLIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nLUA_CFLAGS = @LUA_CFLAGS@\nLUA_LIBS = @LUA_LIBS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nMKINSTALLDIRS = @MKINSTALLDIRS@\nMSGFMT = @MSGFMT@\nMSGFMT_OPTS = @MSGFMT_OPTS@\nMSGMERGE = @MSGMERGE@\nOBJEXT = @OBJEXT@\nOSMESA_LIBS = @OSMESA_LIBS@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPKG_CONFIG = @PKG_CONFIG@\nPKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@\nPKG_CONFIG_PATH = @PKG_CONFIG_PATH@\nPOFILES = @POFILES@\nPOSUB = @POSUB@\nPO_DIR = @PO_DIR@\nPO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@\nPO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@\nRANLIB = @RANLIB@\nSDLCONFIG = @SDLCONFIG@\nSDL_CFLAGS = @SDL_CFLAGS@\nSDL_LIBS = @SDL_LIBS@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nUI_DIR = @UI_DIR@\nUPDATEDESKTOP = @UPDATEDESKTOP@\nUSE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@\nUSE_NLS = @USE_NLS@\nVERSION = @VERSION@\nWX_CFLAGS = @WX_CFLAGS@\nWX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@\nWX_CONFIG_PATH = @WX_CONFIG_PATH@\nWX_CPPFLAGS = @WX_CPPFLAGS@\nWX_CXXFLAGS = @WX_CXXFLAGS@\nWX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@\nWX_LIBS = @WX_LIBS@\nWX_LIBS_STATIC = @WX_LIBS_STATIC@\nWX_RESCOMP = @WX_RESCOMP@\nWX_VERSION = @WX_VERSION@\nXGETTEXT = @XGETTEXT@\nXMKMF = @XMKMF@\nX_CFLAGS = @X_CFLAGS@\nX_EXTRA_LIBS = @X_EXTRA_LIBS@\nX_LIBS = @X_LIBS@\nX_PRE_LIBS = @X_PRE_LIBS@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndesmume_arch = @desmume_arch@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nintltool__v_merge_options_ = @intltool__v_merge_options_@\nintltool__v_merge_options_0 = @intltool__v_merge_options_0@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nEXTRA_DIST = README.LIN README.MAC README.WIN dsm.txt dsv.txt autogen.sh \\\n\t\t$(PO_FILES_IN)\n\nDISTCLEANFILES = $(PO_FILES)\nSUBDIRS = $(PO_DIR) src\nall: all-recursive\n\n.SUFFIXES:\nam--refresh: Makefile\n\t@:\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \\\n\t      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \\\n\t\t&& exit 0; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --gnu Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    echo ' $(SHELL) ./config.status'; \\\n\t    $(SHELL) ./config.status;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\t$(SHELL) ./config.status --recheck\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\t$(am__cd) $(srcdir) && $(AUTOCONF)\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\t$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)\n$(am__aclocal_m4_deps):\nautopackage/default.apspec: $(top_builddir)/config.status $(top_srcdir)/autopackage/default.apspec.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run `make' without going through this Makefile.\n# To change the values of `make' variables: instead of editing Makefiles,\n# (1) if the variable is set in `config.status', edit `config.status'\n#     (which will cause the Makefiles to be regenerated when you run `make');\n# (2) otherwise, pass the desired values on the `make' command line.\n$(RECURSIVE_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\n$(RECURSIVE_CLEAN_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\trev=''; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = \".\"; then :; else \\\n\t    rev=\"$$subdir $$rev\"; \\\n\t  fi; \\\n\tdone; \\\n\trev=\"$$rev .\"; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tfor subdir in $$rev; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone && test -z \"$$fail\"\ntags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \\\n\tdone\nctags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \\\n\tdone\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t$(am__remove_distdir)\n\ttest -d \"$(distdir)\" || mkdir \"$(distdir)\"\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    $(am__make_dryrun) \\\n\t      || test -d \"$(distdir)/$$subdir\" \\\n\t      || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t      || exit 1; \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\n\t-test -n \"$(am__skip_mode_fix)\" \\\n\t|| find \"$(distdir)\" -type d ! -perm -755 \\\n\t\t-exec chmod u+rwx,go+rx {} \\; -o \\\n\t  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -400 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \\; \\\n\t|| chmod -R a+r \"$(distdir)\"\ndist-gzip: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\ndist-bzip2: distdir\n\ttardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2\n\t$(am__remove_distdir)\n\ndist-lzip: distdir\n\ttardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz\n\t$(am__remove_distdir)\n\ndist-lzma: distdir\n\ttardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma\n\t$(am__remove_distdir)\n\ndist-xz: distdir\n\ttardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz\n\t$(am__remove_distdir)\n\ndist-tarZ: distdir\n\ttardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z\n\t$(am__remove_distdir)\n\ndist-shar: distdir\n\tshar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz\n\t$(am__remove_distdir)\n\ndist-zip: distdir\n\t-rm -f $(distdir).zip\n\tzip -rq $(distdir).zip $(distdir)\n\t$(am__remove_distdir)\n\ndist dist-all: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\n# This target untars the dist file and tries a VPATH configuration.  Then\n# it guarantees that the distribution is self-contained by making another\n# tarfile.\ndistcheck: dist\n\tcase '$(DIST_ARCHIVES)' in \\\n\t*.tar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\\\n\t*.tar.bz2*) \\\n\t  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\\\n\t*.tar.lzma*) \\\n\t  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\\\n\t*.tar.lz*) \\\n\t  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\\\n\t*.tar.xz*) \\\n\t  xz -dc $(distdir).tar.xz | $(am__untar) ;;\\\n\t*.tar.Z*) \\\n\t  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\\\n\t*.shar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\\\n\t*.zip*) \\\n\t  unzip $(distdir).zip ;;\\\n\tesac\n\tchmod -R a-w $(distdir); chmod a+w $(distdir)\n\tmkdir $(distdir)/_build\n\tmkdir $(distdir)/_inst\n\tchmod a-w $(distdir)\n\ttest -d $(distdir)/_build || exit 0; \\\n\tdc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\\\/]:[\\\\/],/,'` \\\n\t  && dc_destdir=\"$${TMPDIR-/tmp}/am-dc-$$$$/\" \\\n\t  && am__cwd=`pwd` \\\n\t  && $(am__cd) $(distdir)/_build \\\n\t  && ../configure --srcdir=.. --prefix=\"$$dc_install_base\" \\\n\t    $(AM_DISTCHECK_CONFIGURE_FLAGS) \\\n\t    $(DISTCHECK_CONFIGURE_FLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dvi \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) check \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) install \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) installcheck \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) uninstall \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir=\"$$dc_install_base\" \\\n\t        distuninstallcheck \\\n\t  && chmod -R a-w \"$$dc_install_base\" \\\n\t  && ({ \\\n\t       (cd ../.. && umask 077 && mkdir \"$$dc_destdir\") \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" install \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" uninstall \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" \\\n\t            distuninstallcheck_dir=\"$$dc_destdir\" distuninstallcheck; \\\n\t      } || { rm -rf \"$$dc_destdir\"; exit 1; }) \\\n\t  && rm -rf \"$$dc_destdir\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dist \\\n\t  && rm -rf $(DIST_ARCHIVES) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \\\n\t  && cd \"$$am__cwd\" \\\n\t  || exit 1\n\t$(am__remove_distdir)\n\t@(echo \"$(distdir) archives ready for distribution: \"; \\\n\t  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \\\n\t  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'\ndistuninstallcheck:\n\t@test -n '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: trying to run $@ with an empty' \\\n\t       '$$(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\t$(am__cd) '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\ttest `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \\\n\t   || { echo \"ERROR: files left after uninstall:\" ; \\\n\t        if test -n \"$(DESTDIR)\"; then \\\n\t          echo \"  (check DESTDIR support)\"; \\\n\t        fi ; \\\n\t        $(distuninstallcheck_listfiles) ; \\\n\t        exit 1; } >&2\ndistcleancheck: distclean\n\t@if test '$(srcdir)' = . ; then \\\n\t  echo \"ERROR: distcleancheck can only run from a VPATH build\" ; \\\n\t  exit 1 ; \\\n\tfi\n\t@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \\\n\t  || { echo \"ERROR: files left in build directory after distclean:\" ; \\\n\t       $(distcleancheck_listfiles) ; \\\n\t       exit 1; } >&2\ncheck-am: all-am\ncheck: check-recursive\nall-am: Makefile\ninstalldirs: installdirs-recursive\ninstalldirs-am:\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\t-test -z \"$(DISTCLEANFILES)\" || rm -f $(DISTCLEANFILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-generic mostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf $(top_srcdir)/autom4te.cache\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-generic\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am:\n\n.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \\\n\tinstall-am install-strip tags-recursive\n\n.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \\\n\tall all-am am--refresh check check-am clean clean-generic \\\n\tctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \\\n\tdist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \\\n\tdistcheck distclean distclean-generic distclean-tags \\\n\tdistcleancheck distdir distuninstallcheck dvi dvi-am html \\\n\thtml-am info info-am install install-am install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs installdirs-am maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-generic pdf \\\n\tpdf-am ps ps-am tags tags-recursive uninstall uninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "app/src/main/jni/desmume/NEWS",
    "content": ""
  },
  {
    "path": "app/src/main/jni/desmume/README",
    "content": "                                       DeSmuME\n                      _________________________________________\n                      Copyright (C) 2006 yopyop\n                      Copyright (C) 2006-2012 DeSmuME team\n                      Last Updated: March 31, 2012\n\nContents:\n1) About ................................................................... 14\n2) Credits ................................................................. 59\n3) Contact Information ..................................................... 72\n4) License ................................................................. 82\n\n\n1) About ______________________________________________________________________\n\nDeSmuME is software that allows you to emulate a Nintendo DS system. Think of\nit as a Swiss-Army knife for Nintendo DS emulation, giving you access to many\npowerful tools for testing DS features, from viewing ROM properties to managing\nAction Replay cheats. And best of all, this software is completely free and\nopen-source.\n\nFor information on how to install or operate DeSmuME for your operating system,\nplease see the README file that should be present with your installation.\n\nPort-specific README files:\n    * README.LIN for the Linux port\n    * README.WIN for the Windows port\n    * README.MAC for the Macintosh port\n\nNote that each DeSmuME port may have a different feature set from another port.\nYou may see more feature parity between ports over time as we continue\ndeveloping DeSmuME.\n\nYou can find our documentation on our online Wiki page. The major pages of\ninterest are:\n\n* Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page\n\nThis is the main Wiki page that contains all of our official documentation.\n\n* Manuals: http://wiki.desmume.org/index.php?title=Manual\n\nThe manuals contain detailed information about how to operate DeSmuME for each\nport.\n\n* FAQ: http://wiki.desmume.org/index.php?title=Faq\n\nThe Frequently Asked Questions (FAQ) page has a lot of useful general\ninformation about DeSmuME. Do note that some of the information may be platform\nspecific, and may not directly apply to your version of DeSmuME.\n\n* Build Instructions:\nhttp://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source\n\nThis page contains detailed port-specific instructions about how to make your\nown build of DeSmuME directly from the source code.\n\n\n2) Credits ____________________________________________________________________\n\nSee the AUTHORS file for list of DeSmuME team members.\n\nSpecial thanks go to:\n\n    * yopyop (original author of DeSmuME),\n      for releasing the source code of this great emulator.\n\n    * Martin Korth (author of GBATEK),\n      for his well-written Gameboy Advance and Nintendo DS documentation.\n\n\n3) Contact Information ________________________________________________________\n\nOfficial Website:   http://desmume.org\nPublic Forum:       http://forum.desmume.org\nDeveloper Chat:     irc://irc.freenode.net/desmume\nBug Reports:        http://sourceforge.net/tracker/?group_id=164579&atid=832291\n\nPlease don't ask for ROMs, BIOS files, or any other copyrighted stuff.\n\n\n4) License ____________________________________________________________________\n\nThis file is free software: you can redistribute it and/or modify it under the\nterms of the GNU General Public License as published by the Free Software\nFoundation, either version 2 of the License, or (at your option) any later\nversion.\n\nThis file is distributed in the hope that it will be useful, but WITHOUT ANY\nWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\nPARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with\nthis software.  If not, see <http://www.gnu.org/licenses/>.\n\n\n    * See the GNU General Public License details in COPYING.\n"
  },
  {
    "path": "app/src/main/jni/desmume/README.LIN",
    "content": "                        DeSmuME\n        _________________________________________\n        Copyright (C) 2006 yopyop\n        Copyright (C) 2006-2007 DeSmuME team\n\n\n1) Compiling instructions...................................13\n2) How to use DeSmuME.......................................53\n3) Contact information......................................142\n4) Disclaimer...............................................160\n\n\n1 Compiling instructions______________________________________\n\nDeSmuME is written in C using the gtk+ and SDL libraries.\nSo you need a working C compiler, such as gcc and\nthe above libraries runtime and development packages:\n\n  * http://www.gtk.org\n\n  * http://www.libsdl.org/\n\nOnce these libraries are installed, you should be ready to\ninstall DeSmuME.\n\nDeSmuME provides another interface based on libglade, to use\nit, you'll need glade:\n\n  * http://glade.gnome.org/\n\n1.1 From a release archive____________________________________\n\nUncompress the DeSmuME archive, move to the newly created \ndirectory, type \"./configure\", then \"make\".\nIt will generate three programs:\n1) \"desmume\" in the \"src/gtk\" directory;\n2) \"desmume-cli\" in the \"src/cli\" directory.\nIf glade is installed on your system, you'll get a third\nbinary:\n3) \"desmume-glade\" in the \"src/gtk-glade\" directory.\n\nYou can even type \"make install\" to install those programs on\nyour system (in /usr/local/ by default), then uninstalling is\ndone by typing \"make uninstall\".\n\n1.2 From a CVS copy___________________________________________\n\nMove to the toplevel directory (the one that contains the\nconfigure.ac file). Type \"./autogen.sh\" to generate the\nconfigure/install scripts and needed Makefiles. Then you can follow the\nsame procedure as in 1.1 .\n\n2 How to use DeSmuME__________________________________________\n\nThere are three versions of DeSmuME under Linux. These are a\nGtk+ build, a Glade build and a CLI SDL build. All these builds\nhave some common command line options:\n\n--disable-limiter   Disables the 60 fps limiter\n--soft-convert      Use software colour conversion during OpenGL\n                    screen rendering. May produce better or worse\n                    frame rates depending on hardware.\n\n--arm9gdb=PORT_NUM  Enable the ARM9 GDB stub on the given port\n--arm7gdb=PORT_NUM  Enable the ARM7 GDB stub on the given port\n\n--cflash=PATH_TO_DISK_IMAGE\n                    Enable disk image GBAMP compact flash emulation\n\n--help              Display this message\n\n\nNOTE:\nThe Gtk+ and Glade builds use gtkGLext to handle the OpenGL\nrendering and contexts. You may get improved performance by\nalso passing the argument --gdk-gl-force-indirect. This has\nbeen seen to improve things for Nvidia based graphics cards\nunder Linux.\n\n\nGDB Debugger Stubs:\nSource level debugging of ARM9 and/or ARM7 code is supported\nusing a GDB/Insight debugger.\nThe GDB stubs are enabled from the command line using the\nfollowing options:\n\n--arm9gdb=<PORT_NUM> (for the ARM9)\n--arm7gdb=<PORT_NUM> (for the ARM7)\n\nThe PORT_NUM is the TCP port upon which the stub will listen for\nconnections. Once enabled you can connect to the stub using the\nfollowing command at the GDB debugger prompt (assuming GDB and\nDeSmuME are running on the same machine):\n\ntarget remote :<PORT_NUM>\n\nNOTE: there are problems with the ARM support when stepping code\nwith GDB versions prior to version 6.6. It is recommended that\nyou use at least version 6.6 if possible.\n\n\nGBAMP compact flash emulation:\n\nThe default behaviour of DeSmumME is to attempt to emulate the\nFAT image for the contents of the directory where the running\n.nds file was located.\nThis behaviour can be altered using the\n--cflash=<DISK_IMAGE_FILE> command line option. Using this\noption DeSmuME will emulation a GBAMP and read and write sectors\nfrom/to the disk image file.\nThe disk image file must be created and populated with files\nusing some external tool.\nNOTE: currently if desmume fails to open the disk image file it\nwill silently continue minus a working GBAMP emulation.\n\n\n2.1 Gtk+ version______________________________________________\n\nType \"desmume\" in a shell, a window should appear, then open\na rom file using the \"open\" button, next use the \"run\" button\nto start emulation.\n\nThe following command line options are specific to the Gtk+\nbuild:\n\n--opengl-2d         Enables using OpenGL for screen rendering\n--disable-sound     Disables the sound emulation\n--disable-3d        Disables the 3D emulation\n\n\n2.2 CLI SDL version_______________________________________________\n\nJust type \"desmume-cli path-to-a-rom\" in a shell.\n\nThe following command line options are specific to the CLI\nbuild:\n\n--opengl-2d         Enables using OpenGL for screen rendering\n--disable-sound     Disables the sound emulation\n\n\n3 Contact information_________________________________________\n\nGeneral inquiries should go to:\nE-mail:\tguillaume@desmume.org\n\nLinux Port-related inquiries should go to:\nE-mail: guillaume@desmume.org\n\nWeb:    http://desmume.org\n\nPlease don't ask for roms, bios files or any other copyrighted\nstuff.\n\nIf you want to submit a bug report, please run desmume, go into\nthe \"Help\" menu, and click on \"Submit a bug report\". If you're\nhaving trouble with it, please feel free to email.\n\n\n4 Disclaimer__________________________________________________\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License as \npublished by the Free Software Foundation; either version 2 of \nthe License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be\nuseful,but WITHOUT ANY WARRANTY; without even the implied\nwarranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\nPURPOSE.  See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public\nLicense along with this program; if not, write to the Free\nSoftware Foundation, Inc., 59 Temple Place, Suite 330, Boston,\nMA  02111-1307  USA\n\nSee the GNU General Public License details in COPYING.\n"
  },
  {
    "path": "app/src/main/jni/desmume/README.MAC",
    "content": "                                       DeSmuME\n                      _________________________________________\n                      Copyright (C) 2006 yopyop\n                      Copyright (C) 2006-2012 DeSmuME team\n                      Last Updated: March 31, 2012\n\nContents:\n1) System Requirements ..................................................... 15\n2) Quick Start Guide for Using DeSmuME for OS X ............................ 36\n3) Additional Documentation ............................................... 108\n4) Contact Information .................................................... 138\n5) License ................................................................ 257\n\n\n1) System Requirements ________________________________________________________\n\nDeSmuME is a very demanding app, especially for CPU usage. Before you begin,\nmake sure that your Mac meets the listed system requirements.\n\nIf your Mac meets only the minimum requirements, then you should expect to run\nmost simple 2D-only games with some frameskip, but you will be unable to run\ncomplex 2D games or any 3D-heavy games. However, if your Mac meets the\nrecommended requirements, then you should expect to run almost every game,\nincluding very complex 3D-heavy games, with minimal to no frameskip.\n\nOperating System: OS X v10.5 (Leopard) or later\n\nCPU:              Can run on any PowerPC G4, G5, or Intel processor\n                  2.1 GHz Intel Core 2 Duo (minimum)\n                  3.0 GHz Intel Core 2 Duo or faster (recommended)\n\nRAM:              512 MB (minimum)\n                  2 GB (recommended)\n\n\n2) Quick Start Guide for Using DeSmuME for OS X _______________________________\n\nInstalling DeSmuME is as easy as copying DeSmuME.app to your Applications\nfolder (or other folder of your choice). Double-click the app to start DeSmuME.\n\nNote that DeSmuME for OS X may have a different feature set than DeSmuME for\nWindows and DeSmuME for Linux. As of this writing, some features that are\npresent in DeSmuME for Windows are not present in DeSmuME for OS X.\n\nThe rest of this section will be a guide to help you quickly get started using\nDeSmuME for OS X.\n\nLoading a ROM and Starting the Emulator:\nSimply double-click the desired ROM from the Finder to play the game. By\ndefault, DeSmuME will load the ROM and start emulation. Also, there are\nadditional ROM loading options that you can change in DeSmuME > Preferences if\nyou need them.\n\nUsing the DS Controller:\nEach DS controller button can be mapped to a button of your choice on your\nkeyboard, gamepad, or joystick. You can view the mappings by clicking on Input\nin DeSmuME > Preferences, and then clicking the Controller tab on the Input\npage. To change a mapping, click on the DS control that you want to change,\nthen press the button on your input device to map it.\n\nBy default, the DS controller is mapped to the following keys on your keyboard:\n    Up - Up Arrow\n    Down - Down Arrow\n    Left - Left Arrow\n    Right - Right Arrow\n    A Button - X\n    B Button - Z\n    X Button - S\n    Y Button - A\n    L Trigger - Q\n    R Trigger - W\n    Start - Return\n    Select - Tab\n    Lid - Delete (Backspace)\n    Debug - \\\n    Microphone - `\n\nUsing the DS Touch Pad:\nTouch pad input is emulated using the left mouse button. Simply click in the\ntouch pad area of the DS display window to use the DS touch pad.\n\nRotating the DS Display:\nSome games require that the DS display be at a certain rotation in order to\nlook correct. Rotation options can be found by choosing\nView > Display Rotation. You can also use the toolbar buttons Rotate Left and\nRotate Right to rotate the display by 90 degrees counterclockwise or clockwise,\nrespectively.\n\nFreezing and Restoring the Emulation State:\nSave states are a powerful feature that allows you to freeze the emulation\nstate and restore it later. However, note that save states are only a\ntemporary means of saving -- more permanent saves must be done using the\nin-game save (or ROM save).\n\n- To freeze the emulation state, choose File > Save State File.\n- To restore the emulation state, choose File > Open State File.\n\nYou can also freeze/restore emulation states without having to manage the\nOpen/Save dialogs. There are ten available save state \"slots\" that you can\nuse to quickly freeze/restore the emulation state.\n\n- To quick freeze the emulation state, choose File > Save State Slot > Slot #.\n  The default hotkey for this is (Shift-#).\n- To quick restore the emulation state, choose File > Load State Slot > Slot #.\n  The default hotkey for this is (#).\n\n\n3) Additional Documentation ___________________________________________________\n\nThe quick start guide in this Read Me is by no means a complete reference to\neverything that DeSmuME can do! If you need any additional information about\nDeSmuME, then you can reference our online Wiki pages for up-to-date\ninformation.\n\n* Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page\n\nThis is the main Wiki page that contains all of our official documentation.\n\n* FAQ: http://wiki.desmume.org/index.php?title=Faq\n\nThe Frequently Asked Questions (FAQ) page has a lot of useful general\ninformation about DeSmuME. Do note that some of the information may be platform\nspecific, and may not directly apply to the OS X version of DeSmuME.\n\n* DeSmuME Manual for OS X:\nhttp://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Macintosh_port\n\nThis page contains complete and detailed information about how to operate\nDeSmuME for OS X.\n\n* DeSmuME Build Instructions for OS X:\nhttp://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source_on_OS_X\n\nThis page contains complete and detailed instructions about how to make your\nown build of DeSmuME for OS X directly from the source code.\n\n\n4) Contact Information ________________________________________________________\n\nThank you for you interest in DeSmuME! If you want to tell us how useful\nDeSmuME is in your life, your love (or hate) of certain NDS games, your passion\nfor NDS homebrew development, or anything else related to DeSmuME or NDS\nemulation, then there are various ways for you to contact us!\n\nHowever, keep in mind that there are a few of rules that you need to follow:\n- Do not ask us to provide ROMs, BIOS files, or any other copyrighted stuff.\n  We don't want to have to deal with any legal issues that could get us in\n  trouble, or worse, completely shut down.\n  \n- When contacting us, please use the appropriate means to do it. For example,\n  if you simply want to tell us how much you love or hate us, then use the\n  comments on the official webpage. Another example: If you want to post on the\n  forum, be sure to keep the topic focused on DeSmuME; questions that ask for\n  things like us providing you the latest Pokemon cheats are not DeSmuME\n  related, and we will instead refer you to a Pokemon cheaters forum. Finally,\n  our developer chat channel is intended for furthering the development work of\n  DeSmuME; questions about how to use DeSmuME should not come here, but instead\n  go to the Support forum. In short, use the appropriate contact method. That's\n  why the different methods exist!\n\n* Official Website: http://desmume.org\n\nOur official website has the latest news on DeSmuME releases, and also has a\nlot of other useful information about DeSmuME. You can comment on different\nposts telling us how you feel about DeSmuME. Is DeSmuME the best thing in your\nlife? Is it making you cry? Or is it a bunch of blah? Let us know here!\n\n* Public Forum: http://forum.desmume.org\n\nIf you have a question about DeSmuME, then this is the place to ask it. But\nbefore you ask it, be aware that your question may have already been\nanswered before, so try the following things first:\n\n- Read the manual and the FAQ. A lot of questions people have are usually\n  already answered in our documentation.\n- Do a forum search about your question.\n\nIf you still need to ask a question, then be sure to provide us the following\ninformation:\n\n- DeSmuME app version\n- Your operating system and OS version\n- The name of the ROM (if a ROM is involved)\n- The serial code of the ROM (if a ROM is involved)\n\nThe app version can be found by choosing DeSmuME > About DeSmuME in the DeSmuME\napp. Alternatively, you can select the DeSmuME app in the Finder and choose\nFile > Get Info.\n\nYou can find your operating system and OS version by choosing About This Mac in\nthe Apple menu.\n\nThe ROM name and serial can be found by choosing File > ROM Info in the DeSmuME\napplication.\n\nIt is very important that you provide us with this information! If you don't,\nthen it will take much longer for us to respond to your question.\n\n* Live Developer Chat Channel: irc://irc.freenode.net/desmume\n\nWe have a live developer chatline on Freenode IRC at #desmume. This channel\nis meant for discussing the development of DeSmuME, and shows the real work\nthat goes on behind the scenes. If you are interested in doing any sort of\nsoftware programming, software testing, documentation, or graphics work, then\nplease join our chat channel! We would love for you to join us!\n\n* Bug Reports: http://sourceforge.net/tracker/?group_id=164579&atid=832291\n\nIf you believe that you have found a bug, you may submit a bug report by\nchoosing Help > Submit a Bug Report in the DeSmuME application, or by\nfollowing the above link. This will take you to our bug tracker on SourceForge.\nDo note that you will need a SourceForge account in order to submit a bug\nreport.\n\nBug submissions are very welcome and encouraged. However, when you submit a bug\nto us, you MUST provide the following information, or else your bug submission\nmay be rejected:\n\n- DeSmuME app version\n- Your operating system and OS version\n- Your Mac model identifier\n- The name of the running ROM when the bug was observed (or \"None\", if no ROM\n  was running)\n- The serial code of the running ROM when the bug was observed (or \"None\", if\n  no ROM was running)\n- A description of the exact behavior you observed\n- A description of the behavior you expected\n\nYou can find your Mac model identifier in the System Profiler app. The app is\nlocated in the Applications/Utilities folder.\n\nWhen you write your description, make sure that they are as detailed as\npossible. The better your descriptions are, the faster we can test and fix\nbugs.\n\nFor example, if you observed a bug in the game Golden Sun: Dark Dawn, then the\nbug report could look something like this:\n\n    App Version: v0.9.8\n    Operating System: OS X v10.6.8\n    Mac Model Identifier: iMac 11,2\n    ROM Name: GOLDENSUN_DD\n    ROM Serial: NTR-BO5E-USA\n    Observed Behavior: I tried to load a save state using the\n    File > Load State > Slot 3 menu option, but the game froze. If I reset, I\n    can get the game working again.\n    Expected Behavior: The game should continue running from the point where I\n    made the save state.\n\nWe will try to get your bug tested as soon as possible, but any fixes may take\nlonger, depending on the complexity of the bug. Also, some bugs may require us\nto ask you for certain files, such as your ROM saves, save states, or console\nlogs. For the above example, we would probably ask you for your save states to\nhelp us track down the bug.\n\n\n5) License ____________________________________________________________________\n\nThis file is free software: you can redistribute it and/or modify it under the\nterms of the GNU General Public License as published by the Free Software\nFoundation, either version 2 of the License, or (at your option) any later\nversion.\n\nThis file is distributed in the hope that it will be useful, but WITHOUT ANY\nWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\nPARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with\nthis software.  If not, see <http://www.gnu.org/licenses/>.\n\n\n    * See the GNU General Public License details in COPYING.\n"
  },
  {
    "path": "app/src/main/jni/desmume/README.WIN",
    "content": "Manual\r\nFrom DeSmuME\r\nJump to: navigation, search\r\nContents\r\n[hide]\r\n\r\n    * 1 DeSmuME Platform Specific Manuals\r\n    * 2 DeSmuME Common command line arguments\r\n          o 2.1 --load-slot=NUM [gtk,win]\r\n          o 2.2 --play-movie=PATH_TO_PLAY_MOVIE [gtk,win]\r\n          o 2.3 --record-movie=PATH_TO_RECORD_MOVIE [gtk,win]\r\n          o 2.4 --start-paused=START_PAUSED [gtk,win]\r\n          o 2.5 --cflash-image=PATH_TO_DISK_IMAGE [gtk,win]\r\n          o 2.6 --cflash-path=PATH_TO_DISK_DIRECTORY [gtk,win]\r\n          o 2.7 --bios-arm9=BIOS_ARM9_PATH [gtk,win]\r\n          o 2.8 --bios-arm7=BIOS_ARM9_PATH [gtk,win]\r\n          o 2.9 --bios-swi=BIOS_SWI [gtk,win]\r\n          o 2.10 --num-cores=NUM [win]\r\n          o 2.11 --scanline-filter-a=NUM [win]\r\n          o 2.12 --scanline-filter-b=NUM [win]\r\n          o 2.13 --arm9gdb=PORT_NUM [gtk,win]\r\n          o 2.14 --arm7gdb=PORT_NUM [gtk,win]\r\n          o 2.15 -h, --help [gtk,win]\r\n          o 2.16 --opengl-2d [gtk]\r\n          o 2.17 --soft-convert [gtk]\r\n          o 2.18 --3d-engine=ENGINE [gtk]\r\n          o 2.19 --disable-sound [gtk]\r\n          o 2.20 --disable-limiter [gtk]\r\n          o 2.21 --save-type=TYPE [gtk]\r\n          o 2.22 --fwlang=LANG [gtk]\r\n          o 2.23 --timeout=SECONDS [gtk]\r\n          o 2.24 --display=DISPLAY [gtk]\r\n          o 2.25 -v, --version [gtk]\r\n\r\n[edit] DeSmuME Platform Specific Manuals\r\n\r\nDeSmuME places responsibility on the developers of each port to expose emulation features in a way that is tuned to the needs of that platform. As a consequence, some ports are able to move well ahead of the others. Conversely, some ports are far behind some others. As a consequence, some behaviours and menu structures are different in each port. Therefore, the decision was made to create separate manuals for each port as well: when a specific port is changed, only the manual for that specific port needs to be altered.\r\n\r\n \r\n\r\nDeSmuME Manual for the Windows port\r\n\r\nDeSmuME Manual for the Linux GTK+ port\r\n\r\nDeSmuME Manual for the Linux Glade port\r\n\r\nDeSmuME Manual for the Linux command line port\r\n\r\nDeSmuME Manual for the Macintosh port\r\n[edit] DeSmuME Common command line arguments\r\n\r\nThe GTK+ and windows ports share common command line arguments. We are trying slowly to move over to a common command line handling engine. The commandline arguments for these platforms are described here:\r\n[edit] --load-slot=NUM [gtk,win]\r\n\r\nLoads savegame from slot NUM\r\n[edit] --play-movie=PATH_TO_PLAY_MOVIE [gtk,win]\r\n\r\nSpecifies a dsm format movie to play\r\n[edit] --record-movie=PATH_TO_RECORD_MOVIE [gtk,win]\r\n\r\nSpecifies a path to a new dsm format movie\r\n[edit] --start-paused=START_PAUSED [gtk,win]\r\n\r\nIndicates that emulation should start paused\r\n[edit] --cflash-image=PATH_TO_DISK_IMAGE [gtk,win]\r\n\r\nRequests cflash in gbaslot with fat image at this path\r\n[edit] --cflash-path=PATH_TO_DISK_DIRECTORY [gtk,win]\r\n\r\nRequests cflash in gbaslot with filesystem rooted at this path\r\n[edit] --bios-arm9=BIOS_ARM9_PATH [gtk,win]\r\n\r\nSpecifies a path to an arm9 bios which will be used\r\n[edit] --bios-arm7=BIOS_ARM9_PATH [gtk,win]\r\n\r\nSpecifies a path to an arm7 bios which will be used\r\n[edit] --bios-swi=BIOS_SWI [gtk,win]\r\n\r\nSet to 1 to enable the emulation of SWI via the provided bios files, which I hope you have provided with the above options. (default 0)\r\n[edit] --num-cores=NUM [win]\r\n\r\nOverrides the emulator's autodetection for number of processors. Presently, any system with more than one core (this may inadvertantly include singlecore systems with hyperthreading, but I can't test it) will operate with somewhat reduced OSD functionality, with lower quality and no asynchronous composition. In the future, other optimizations will require higher numbers of cores (optimizations for quad-core are planned, but it won't be too impressive)\r\n[edit] --scanline-filter-a=NUM [win]\r\n\r\nIntensity of fadeout for scanlines filter (edge) (default 2)\r\n[edit] --scanline-filter-b=NUM [win]\r\n\r\nIntensity of fadeout for scanlines filter (corner) (default 4)\r\n[edit] --arm9gdb=PORT_NUM [gtk,win]\r\n\r\nEnable the ARM9 GDB stub on the given port\r\n[edit] --arm7gdb=PORT_NUM [gtk,win]\r\n\r\nEnable the ARM7 GDB stub on the given port\r\n[edit] -h, --help [gtk,win]\r\n\r\nShow summary of options.\r\n[edit] --opengl-2d [gtk]\r\n\r\nEnables using OpenGL for screen rendering\r\n[edit] --soft-convert [gtk]\r\n\r\nUse software colour conversion during OpenGL screen rendering. May produce better or worse frame rates depending on hardware.\r\n[edit] --3d-engine=ENGINE [gtk]\r\n\r\nSelect available 3d emulation:\r\n\r\n    0 = 3d disabled \r\n    1 = internal desmume software rasterizer (default) \r\n    2 = osmesa or gtkglext opengl (if available, depending on compilation options, see desmume --help) \r\n\r\n[edit] --disable-sound [gtk]\r\n\r\nDisables the sound emulation\r\n[edit] --disable-limiter [gtk]\r\n\r\nDisables the 60 fps limiter\r\n[edit] --save-type=TYPE [gtk]\r\n\r\nSelect savetype from the following:\r\n\r\n    0 = Autodetect \r\n    1 = EEPROM 4kbit \r\n    2 = EEPROM 64kbit \r\n    3 = EEPROM 512kbit \r\n    4 = FRAM 256kbit \r\n    5 = FLASH 2mbit \r\n    6 = FLASH 4mbit \r\n\r\n[edit] --fwlang=LANG [gtk]\r\n\r\nSet the language in the firmware, LANG as follows:\r\n\r\n    0 = Japanese \r\n    1 = English \r\n    2 = French \r\n    3 = German \r\n    4 = Italian \r\n    5 = Spanish \r\n\r\n[edit] --timeout=SECONDS [gtk]\r\n\r\nQuit desmume after the specified seconds for testing purpose.\r\n[edit] --display=DISPLAY [gtk]\r\n\r\nX display to use.\r\n[edit] -v, --version [gtk]\r\n\r\nShow version of program. \r\n\r\nRetrieved from http://wiki.desmume.org/index.php?title=Manual\r\nThis page was last modified on 22 November 2009, at 18:17.\r\n\r\n====================================================================\r\n\r\nDeSmuME Manual for the Windows port\r\nFrom DeSmuME\r\nJump to: navigation, search\r\n\r\nNOTE: This refers to the 0.9.5 revision of desmume, and may or may not accurately reflect any other revision.\r\n\r\n\r\nContents\r\n[hide]\r\n\r\n    * 1 Quick Getting Started Guide\r\n          o 1.1 Menu Layout\r\n                + 1.1.1 File Menu\r\n                      # 1.1.1.1 File | Open ROM\r\n                      # 1.1.1.2 File | Recent ROM\r\n                      # 1.1.1.3 File | ROM Info\r\n                      # 1.1.1.4 File | Close ROM\r\n                      # 1.1.1.5 File | Save State As...\r\n                      # 1.1.1.6 File | Load State As...\r\n                      # 1.1.1.7 File | Save State\r\n                      # 1.1.1.8 File | Load State\r\n                      # 1.1.1.9 File | Import Backup Memory\r\n                      # 1.1.1.10 File | Export Backup Memory\r\n                      # 1.1.1.11 File | Save Screenshot As...\r\n                      # 1.1.1.12 File | Quick Screenshot\r\n                      # 1.1.1.13 File | Record AVI\r\n                      # 1.1.1.14 File | Stop AVI\r\n                      # 1.1.1.15 File | Record WAV\r\n                      # 1.1.1.16 File | Record Movie\r\n                      # 1.1.1.17 File | Play Movie\r\n                      # 1.1.1.18 File | Stop Movie\r\n                      # 1.1.1.19 File | Lua Scripting | New Lua Script Window\r\n                      # 1.1.1.20 File | Lua Scripting | Close All Script Windows\r\n                      # 1.1.1.21 File | Quit\r\n                + 1.1.2 Emulation Menu\r\n                      # 1.1.2.1 Emulation | Pause\r\n                      # 1.1.2.2 Emulation | Reset\r\n                      # 1.1.2.3 Emulation | Shut Up\r\n                      # 1.1.2.4 Emulation | GBA Slot\r\n                      # 1.1.2.5 Emulation | Cheats\r\n                      # 1.1.2.6 Emulation | Cheats | List\r\n                      # 1.1.2.7 Emulation | Cheats | Search\r\n                      # 1.1.2.8 Emulation | Cheats | Disable\r\n                + 1.1.3 View Menu\r\n                      # 1.1.3.1 View | LCDs layout\r\n                      # 1.1.3.2 View | Rotation\r\n                      # 1.1.3.3 View | Window size\r\n                      # 1.1.3.4 View | Window size | Always On Top\r\n                      # 1.1.3.5 View | Screen Separation\r\n                      # 1.1.3.6 View | Screen Separation | White,Gray,Black\r\n                      # 1.1.3.7 View | Screen Separation | Editable via border dragging\r\n                      # 1.1.3.8 View | Render\r\n                      # 1.1.3.9 View | Force Maintain Ratio\r\n                      # 1.1.3.10 View | Display Frame Counter\r\n                      # 1.1.3.11 View | Display FPS\r\n                      # 1.1.3.12 View | Display Input\r\n                      # 1.1.3.13 View | Display Graphical Input\r\n                      # 1.1.3.14 View | Display Lag Counter\r\n                      # 1.1.3.15 View | Display Microphone\r\n                      # 1.1.3.16 View | HUD Editing Mode\r\n                + 1.1.4 Config Menu\r\n                      # 1.1.4.1 Config | Save Type\r\n                      # 1.1.4.2 Config | 3D Settings\r\n                      # 1.1.4.3 Config | Control Config\r\n                      # 1.1.4.4 Config | Control Config | Allow Left+Rt/Up+Dn\r\n                      # 1.1.4.5 Config | Hotkey Config\r\n                      # 1.1.4.6 Config | Sound Settings\r\n                      # 1.1.4.7 Config | WIFI Settings\r\n                      # 1.1.4.8 Config | Firmware Settings\r\n                      # 1.1.4.9 Config | Emulation Settings\r\n                      # 1.1.4.10 Config | Microphone Settings\r\n                      # 1.1.4.11 Config | Path Settings\r\n                      # 1.1.4.12 Config | Frame Skip\r\n                      # 1.1.4.13 Config | Language\r\n                      # 1.1.4.14 Config | Background Pause\r\n                      # 1.1.4.15 Config | Enable State Rewinding\r\n                + 1.1.5 Tools Menu\r\n                      # 1.1.5.1 Tools | Disassembler\r\n                      # 1.1.5.2 Tools | View Memory\r\n                      # 1.1.5.3 Tools | View Registers\r\n                      # 1.1.5.4 Tools | View Palette\r\n                      # 1.1.5.5 Tools | View Tiles\r\n                      # 1.1.5.6 Tools | View Maps\r\n                      # 1.1.5.7 Tools | View OAM\r\n                      # 1.1.5.8 Tools | View Matrices\r\n                      # 1.1.5.9 Tools | View Lights\r\n                      # 1.1.5.10 Tools | View Sound State\r\n                      # 1.1.5.11 View | RAM Watch\r\n                      # 1.1.5.12 View | RAM Search\r\n                      # 1.1.5.13 Tools | View Layers\r\n                + 1.1.6 Help Menu\r\n                      # 1.1.6.1 Help | Website\r\n                      # 1.1.6.2 Help | Forums\r\n                      # 1.1.6.3 Help | Submit a bug report\r\n                      # 1.1.6.4 Help | About\r\n\r\n[edit] Quick Getting Started Guide\r\n\r\nWhen you start the emulator for the first time, you probably just want to play a certain game. You can do this by going to 'File' in the menu, and selecting 'Open Rom'. This will open up an explorer window, within which you can browse to the rom (nds file) that you wish to play. Once the game has finished loading (and this should only take a few seconds at most), your game will automatically start running. But if you want, you can also compile from source. See the article Installing DeSmuME from source on Windows for details.\r\n[edit] Menu Layout\r\n\r\nThe rest of this manual will be spend on explaining all the other options in the menu.\r\n\r\n\r\n[edit] File Menu\r\n[edit] File | Open ROM\r\n\r\nThis option is for loading games. A game is typically called a rom file. Just use the explorer window to browse to the file, and click on open. The game should just load and start. The desmume windows port is also able to load some compressed formats, like zip, rar, and 7z. Just as long as there is a valid game (rom) file in the compressed archive ending with an .nds extension, it should load fine.\r\n[edit] File | Recent ROM\r\n\r\nThis menu option contains a list of the roms that you have most recently loaded. You can quickly access a game that way, without having browse to the right directory with the 'Open Rom' option.\r\n[edit] File | ROM Info\r\n\r\nThis option offers some information about the internals of the rom file, like name, code, manufacturer, and size. This should not concern the casual gamer, but may come in handy for developers.\r\n[edit] File | Close ROM\r\n\r\nJust ends the current game and leaves the emulator more or less how it was when you first launched it.\r\n[edit] File | Save State As...\r\n\r\nImagine you have gotten to a certian point in a game, and you need to do something else. The emulator let's you save the current state of the game, so that you can continue the game later at precisely the same point somewhere in the future.\r\n\r\nPlease note that the use of SAVESTATES is discouraged, as these are likely to break between emulator versions. Instead use SAVE FILES. These are likely to survive between emulator versions. This means that you will have to use save points within the game. SAVE FILES are stored in .dsv files.\r\n[edit] File | Load State As...\r\n\r\nOnce you have saved a game's position, or 'state', you can load it again with this option.\r\n[edit] File | Save State\r\n\r\nThis option works fairly similair to the 'Save As' option, altough it let's you save numbers instead os specifying a chosen name. Also, All the states saved via this option end up with a pre-determined name of 'game (rom) name'.dsx. So if the game is called MyGame, the first savefile will be called MyGame.ds0, the second one MyGame.ds1, etc.\r\n[edit] File | Load State\r\n\r\nThis option let's you load the states that you saved via the 'File | Save State' option\r\n[edit] File | Import Backup Memory\r\n\r\nBackup Memory is the data the game uses to remember its own state. It is stored on the cart in a normal game. Desmume uses the .dsv extension and file format; other formats which can be imported are .duc and raw .sav, as well as no$gba savefiles (also using the .sav extension). People use pro action replays to capture duc files from their card and post it online without using emulators. These are frequently found on gamefaqs.com. See the faq for details on how to use this function, where it has been documented better.\r\n[edit] File | Export Backup Memory\r\n\r\nThis lets you export the game's state for use in other Nintendo DS Emulators. It will write a 'raw' sav file or a no$gba savefile.\r\n[edit] File | Save Screenshot As...\r\n\r\nThis lets you take a screenshot of the current view of the emulator, and specify it's name to save as a bitmap (.bmp) file.\r\n[edit] File | Quick Screenshot\r\n\r\nThis option also dumps a screencapture, but it has a pre-determined filename and location. The name will be based on the name of the rom and somehow sequentially numbered, and placed in the directory specified in the Path Settings.\r\n[edit] File | Record AVI\r\n\r\nThis option lets you capture what's going on in the emulator, and save it in an avi file.\r\n[edit] File | Stop AVI\r\n\r\nThe 'Record AVI' option continues to record the game, untill you press the 'Stop Avi' option.\r\n[edit] File | Record WAV\r\n\r\nThis option lets you capture the sound played in the emulator, and save it in a wav file. In contrast to the other option, this records, as faithfully as possible, the exact emulated audio output (which is not necessarily what you hear), although it will use the interpolation you have specified in the sound config.\r\n[edit] File | Record Movie\r\n\r\nThis option lets you record the gameplay in TAS format, see http://tasvideos.org for details on TAS (tool-assisted speedruns).\r\n[edit] File | Play Movie\r\n\r\nThis option lets you playback a pre-recorded TAS movie.\r\n[edit] File | Stop Movie\r\n\r\nThis options lets you stop a movie which is playing or recording.\r\n[edit] File | Lua Scripting | New Lua Script Window\r\n\r\nLaunches a lua scripting dashboard. Reference the FAQ for more information on lua in emulators.\r\n[edit] File | Lua Scripting | Close All Script Windows\r\n\r\nCloses all the lua dashboards.\r\n[edit] File | Quit\r\n\r\nChoosing this option exits the emulator.\r\n[edit] Emulation Menu\r\n[edit] Emulation | Pause\r\n\r\nThis option will pause the emulation, freezing it at the current moment of execution. Selecting it again will resume the execution of the ROM at the exact moment where you paused it.\r\n[edit] Emulation | Reset\r\n\r\nThis option will reset the ROM that is currently loaded to the very start of the ROM, just as if you chose 'File | Open Rom' again.\r\n[edit] Emulation | Shut Up\r\n\r\nThis option turns off all the currently-running sounds, effectively killing streams and decoded music and voiceovers. Sequenced music and sound effects will continue to play, and when you enter a new area in the game or someone else speaks, the sounds will play again. Use this to Shut Up an annoying sound.\r\n[edit] Emulation | GBA Slot\r\n\r\nThis menu option pop-ups a new window, which lets you specirfy what to do with the GBA slot of the Nintendo DS. It has the following choices : NONE, Compact Flash, Rumble Pack, GBA Game, Guitar Grip. Rumble pack allows some games to use vibration. Memory extension... Extends memory, as introduced by the NDS Opera browser. And some DS games can have bonuses, unlockable by GBA cart. For example in Megaman ZX you can fight some Megaman Zero Bosses when correct cartridge is inserted. This is also commonly used by pokemon players for finding some pokemons from older GBA games. There are some GBA slot extensions which are not yet emulated by desmume. Compact Flash is is used for homebrew software emulation, for example that uses DLDI (Dynamically Linked Device Interface). As usual, see the FAQ for more up-to-date information on that.\r\n[edit] Emulation | Cheats\r\n\r\nThis option pulls down a drop-down menu, and presents the options list and search. Be aware though, that cheats are sort of half baked right now. If you are not having luck, wait for some news on an improved cheat system. Also, it is impossible yet to use \"commercial\" codes, such as Action Replay and Codebreaker, so what you'll have to do is manually search for, and alter the memory positions to your advantage. They are called 'raw' or 'internal' cheats. There's an excellent article in the wiki on Using Cheats in DeSmuMe . In post-0.9.2 development builds, there is also the support for Action Replay cheat codes.\r\n[edit] Emulation | Cheats | List\r\n\r\nChoosing 'list' will list all the currently known cheats. Please refer to the article Using Cheats in DeSmuMe for further details on how to use the cheat mechanism in desmume.\r\n[edit] Emulation | Cheats | Search\r\n\r\nChoosing 'search' will let you search for cheats. Please refer to the article Using Cheats in DeSmuMe for further details on how to use the cheat mechanism in desmume.\r\n[edit] Emulation | Cheats | Disable\r\n\r\nDisables the cheat engine, and all active cheats.\r\n[edit] View Menu\r\n[edit] View | LCDs layout\r\n\r\nThis powerful menu controls how the NDS screens will be arranged into the window. Vertical and Horizontal will choose to stack them in the specified manner (vertical being traditional and default and horizontal being wide-screen). One LCD shows just one screen--whichever one is \"first\" (top) as described below. \"Top First\" means that the top screen is First and will be displayed on top. \"Bottom first\" means that the bottom screen is First and will be displayed on top (effectively switching the usual ordering of the screens for this game). \"Main screen first\" selects the main graphics engine (the one with 3d on it) to consider as first. This option will help you track the action and discard the useless status screen in many games. \"Sub screen first\" is added for the sake of completeness and you may occasionally find it helpful. Please note that these last two options may not work well in the case of dual screen 3d games, as the screens are always toggling around.\r\n[edit] View | Rotation\r\n\r\nThis option will let you rotate the screen a pre-determined amount of degrees clockwise in order to adjust the angle of the display. Some programs require that you normally turn the DS on its side. You can set it up in that manner using this. The options are 0 (no rotation), 90, 180, and 270.\r\n[edit] View | Window size\r\n\r\nThis option will let you enlarge the windows a pre-determined size. The resize options are: 1x, 1.5x, 2x, 3x, and 4x the default size. You can also adjust the window size by resizing the window as usual in Windows apps.\r\n[edit] View | Window size | Always On Top\r\n\r\nAs featured in media players and IM programs and other emulators, etc., this will prevent other apps from displaying on top of desmume.\r\n[edit] View | Screen Separation\r\n\r\nThis option controls how far the two windows should be apart of each other, in other words: how big the border between them should be. Valid choices are: None (which is the default), narrow border (which is slightly larger), DS (which is about the same amount of room there is on a real Nintendo DS).\r\n[edit] View | Screen Separation | White,Gray,Black\r\n\r\nChanges the colour of the gap. Savvy users may discover that they can edit this in the ini file to be any color they want.\r\n[edit] View | Screen Separation | Editable via border dragging\r\n\r\nWhen enabled, you can pick any gap size you want by dragging the bottom edge (not a corner) of the main window.\r\n[edit] View | Render\r\n\r\nThese options will apply different resizing filters to the emulator screen display.\r\n[edit] View | Force Maintain Ratio\r\n\r\nHere you can choose, when re-sizing the windows, if you wan to maintain the ratio of the windows. Sometimes when the window size is changed it doesn't look correct on the screen. This option forces the window to maintain a correct ratio so it looks correct.\r\n[edit] View | Display Frame Counter\r\n\r\nSelecting this option will display the emulation frame number. This way you can tell how long you have been playing the game. It is also useful for timestamping emulation events (for example, you can tell if you made it out of a level faster than last time)\r\n[edit] View | Display FPS\r\n\r\nSelecting this option causes the 'frames-per-second' (or 'fps', for short) to be displayed. It also displays an additional '3D' counter, which tells how frequently the game is updating its 3d graphics. But unlike the fps counter, the 3d counter has nothing to do with the power of your system. If it is low, then the game is running slow on a retail cart, and so it runs slow in an emulator. The last number in parentheses is the arm9 load average, which indicates how hard the emulated CPU is working. This has nothing to do with the power of your system either.\r\n[edit] View | Display Input\r\n\r\nSelecting this option displays the emulated input that the emulator is recognizing and sending to the game software.\r\n[edit] View | Display Graphical Input\r\n\r\nSame as Display Input but it is a super-spiffy graphical version.\r\n[edit] View | Display Lag Counter\r\n\r\nThis option displays the lag counter, which records frames where the game does not poll input.\r\n[edit] View | Display Microphone\r\n\r\nThis option is somewhat less exciting than it sounds, but it displays some numbers which may help you diagnose whether your microphone is hooked up correctly.\r\n[edit] View | HUD Editing Mode\r\n\r\nThis option will let you drag around hud elements to pick their position.\r\n[edit] Config Menu\r\n[edit] Config | Save Type\r\n\r\nThis option lets you specify the save type of a particular game. The default is 'automatic'. However, this is not fail-safe in all cases, so you might need to manually select one of the other savetypes. You may also need to set this before important a savefile from some other source, as they do not always contain sufficient information to guess the correct size.\r\n[edit] Config | 3D Settings\r\n\r\nThis option lets you select the method that is used to draw the screen. You can choose between OpenGL (hardware accelerated) or SoftRasterizer (desmume's custom-crafted software renderer). Note that however hardware accelerated it may be, oftentimes SoftRasterizer will run faster.\r\n\r\nFurthermore, you have three toggles for SoftRasterizer:\r\n\r\n    * Unrealistically High-Precision Color Interpolation - this affects how material colors get handled when polygons are clipped.\r\n    * Enable Edge Marking / Enable Fog - Using these you can prohibit emulation of these hardware features to gain a minor speedup. \r\n\r\nDesmume 0.9.4 had an option called \"Alternate Flush Mode\" which fixed some games with flickering graphics, but this was removed in 0.9.5.\r\n[edit] Config | Control Config\r\n\r\nThis option lets you configure keyboard keys or a joystick. The joystick support is implemented using a DirectInput control interface.\r\n\r\nHere are the default control mappings (they may be subject to change):\r\n\r\n Up arrow             - Up\r\n Left arrow           - Left\r\n Down arrow           - Down\r\n Right arrow          - Right\r\n x                    - A button\r\n z                    - B button\r\n s                    - X button\r\n a                    - Y button\r\n q                    - Left Trigger\r\n w                    - Right Trigger\r\n Enter                - Start button\r\n Right Shift          - Select button\r\n Backspace            - Lid fold/unfold\r\n\r\n[edit] Config | Control Config | Allow Left+Rt/Up+Dn\r\n\r\nIt is nearly impossible on an actual console to press left and right at the same time. You may accidentally (or on purpose!) be glitching games by sending input they did not expect if you enable this option. Most casual users can emulate the hardware better by leaving this unchecked.\r\n[edit] Config | Hotkey Config\r\n\r\nThis menu option lets you define keys, that can be used to quickly select other options without having to go through the entire menu structure. Some examples are a hotkey for 'pause', or a hotkey for loading a specific savestate.\r\n\r\nHere are the default hotkey mappings (they may be subject to change):\r\n\r\n n                    - Frame advance\r\n Space                - Pause/Unpause \r\n p                    - Load current state\r\n 1,2,3,4,5,6,7,8,9,0  - Select current state\r\n F1-F10               - Load relevant state\r\n Shift+F1-F10         - Save relevant state\r\n\r\n[edit] Config | Sound Settings\r\n\r\nThis option lets you configure the way sound is generated.\r\nThe sync/async modes and sync methods give you different output:\r\n\r\n    * Dual sync/async: the traditional mode, which generates more sound when the game slows down. Gives clear sound in most cases but can cause streamed sounds to be garbled sometimes.\r\n    * Sync: always generates the same amount of sound, and uses one of the three available methods to compensate for too low or too high framerates. This mode shouldn't make streamed sounds garbled.\r\n          o Sync method 'N': created by Nitsuja. Basically stretches the sound. Sounds like No$GBA (without the crackling).\r\n          o Sync method 'Z': created by Zeromus. Stretches the sound to compensate for slowdowns, and resamples it to compensate for too high framerates. That resampling causes latency and can behave weird sometimes.\r\n          o Sync method 'P': taken from SPU2-X, an SPU2 plugin for PCSX2. Stretches the sound intelligently, giving clear sound in most cases, but also latency.\r\n\r\n\r\nThe sound core setting allows you to choose between the DirectX sound core and the dummy one which produces no sound. The WAV write core has been removed since the new \"Record WAV\" option made it useless.\r\nThe buffer size setting should be kept to its original value. However, if your sound isn't clear even at 60 fps, you can try increasing it.\r\nThe interpolation setting allows you to choose between three interpolation methods:\r\n\r\n    * None: Fast, but may sound bad.\r\n    * Linear: typical, sounds good\r\n    * Cosine: maybe slower than linear, but doesn't sound much better\r\n\r\nNote that the DS has no interpolation method. While sometimes interpolation can make a noticeable improvement, it can also be unnoticeable or distort some sounds.\r\n\r\nThe ADPCM caching has been removed. It was needed due to a bug in ADPCM decoding which has been fixed. If you are still using 0.9.4, then enabling this can speed up some games while breaking the sound in others.\r\n[edit] Config | WIFI Settings\r\n\r\nWIFI support is currently under heavy development, but it is not useful yet. Therefore, you may find this option missing, or simply 'greyed-out' for now. Even if you can fiddle with it, it won't do anything useful.\r\n[edit] Config | Firmware Settings\r\n\r\nThis option provides you with the same set of options that a real Nintendo DS firmware does. The most important here is the language, because multi-lingual games will often look at how this option is set.\r\n[edit] Config | Emulation Settings\r\n\r\nThese options let you boot from the extracted BIOS and Firmware of a real Nintendo DS. unless you have extracted/downloaded the firmware or bios from a Nintendo DS that you actually own yourself, these settings have no value for you as desmume does not generally require them to run correctly. Occasionally, however, a game may require them in order to work.\r\n[edit] Config | Microphone Settings\r\n\r\nYou can choose one of four modes. The first will attempt to use the windows default recording device (it is up to you to make your microphone take this role) and feed its input to the emulator. This works, but not perfectly, and it suffers from some unresolved conceptual issues, similar in nature to the emulator audio synchronization problem. The remainder of the options are triggered when using the mic hotkey. You can \"Use internal noise sample\" which works for many games that want you to blow on the mic; you can \"Use rand() whitenoise\" which will work for games that require blowing, but which don't work with the internal noise sample (note that this is NONDETERMINISTIC and not tas-safe); and finally you can supply your own microphone sample, which may be noise, or your nintendog's name, or any other thing. It has even been tested with bangai-o spirits level loading. This must be an 8bit mono pcm wav file.\r\n[edit] Config | Path Settings\r\n\r\nUse this dialog to configure the default paths for roms, savestates, screenshots, etc. Some people like everything in one directory and some people like using 50 directories; you can have it your way.\r\n[edit] Config | Frame Skip\r\n\r\nThe first option, \"Limit framerate\" engages the throttler and prohibits the emulator from running more than 60fps. With this disabled, a fast computer may run the game doubly or triply fast.\r\n\r\nThe fixed skip options allow you to specify how many frames should be skipped, constantly. It is generally safe to choose 1 or 2 if you don't mind a slightly choppier game, in order to get a speedup. You may get accustomed to the degraded game performance and not notice. Note, however, that frameskipping can sometimes entirely fail in dual-screen 3d games or games that use capture.\r\n\r\nThe auto skip options will try engaging the frameskipping when the emulator is running slow, to keep the game from slowing down, but render all the frames when possible to maintain 60fps. This can make a game look sort of like a modern console 3d game which slows down when the action gets intense or too much of the world is visible.\r\n\r\nNote that you can use the fast-forward hotkey to engage a special mode which disables the throttler and skips some large number of frames in order to run the game as quickly as possible. This may help you speed through cutscenes or other slow grinding in games and is easier to use than constantly fiddling with these menu options.\r\n[edit] Config | Language\r\n\r\nThis lets you set the language the emulator displays its menus and options in. This won't change everything in the emulator, as due to the way it is coded, some things aren't translateable through this system, and it may very well be the case that your desired translation is incomplete.\r\n[edit] Config | Background Pause\r\n\r\nSelecting this option will pause the emulation whenever you put desmume in the background, or the window loses focus.\r\n[edit] Config | Enable State Rewinding\r\n\r\nThis is a bit of an experimental option which will suck up a ton of your cpu power taking secret savestates every 0.25 seconds or so. With this enabled, the use of a rewind hotkey will permit you to rewind time a little bit in case you die.\r\n[edit] Tools Menu\r\n[edit] Tools | Disassembler\r\n\r\nThis option displays the ARM9 and ARM7 disassembler. Be aware though, that the windows are drawn exactly on top of each other, so that you have to move (drag n drop) the first windows before the second window shows.\r\n[edit] Tools | View Memory\r\n\r\nThis tool displays the ARM7 and ARM9 memory. Be aware though, that the windows are drawn exactly on top of each other, so that you have to move (drag n drop) the first windows before the second window shows.\r\n\r\nThe \"View mode\" radio buttons allow you to choose how the memory will be shown:\r\n\r\n    * 8-bit : shows the memory as bytes\r\n    * 16-bit : shows the memory as words\r\n    * 32-bit : shows the memory as dwords \r\n\r\nThe \"View address\" textbox and button allow you to jump to a different address:\r\n\r\n    * Enter an hexadecimal address without 0x prefix, with up to 8 digits\r\n    * Click \"Go\" to jump to the entered address \r\n\r\nThe \"View dump\" buttons allow you to dump the current view:\r\n\r\n    * Text dump : dumps the view to a text file, in an human-readable form\r\n    * Raw dump : dumps the memory directly to a binary file which can be read with an hex editor \r\n\r\nNote that if you dump memory to a file already containing (a) dump(s), the new dump will be appended to the existing one(s).\r\n\r\nThe scrollbar... well, you surely know how a scrollbar works.\r\n\r\nThe viewers additionally allow to edit the memory. For it, click on the value you want to edit, then type the new value. The new value is applied only once you've entirely entered it.\r\n[edit] Tools | View Registers\r\n\r\nThis option lets you view the ARM7 and ARM9 I/O registers.\r\n[edit] Tools | View Palette\r\n\r\nThis option lets you view the palette in detail.\r\n[edit] Tools | View Tiles\r\n\r\nThis option lets you view the tiles in detail.\r\n[edit] Tools | View Maps\r\n\r\nThis option lets you view the maps in detail.\r\n[edit] Tools | View OAM\r\n\r\nThis option lets you view the OAM layer in detail.\r\n[edit] Tools | View Matrices\r\n\r\nThis option lets you view the matrices in detail.\r\n[edit] Tools | View Lights\r\n\r\nThis option lets you view the lights in detail.\r\n[edit] Tools | View Sound State\r\n\r\nThis option displays the sound output.\r\n[edit] View | RAM Watch\r\n\r\nThis option will pop-up a new window, with extensive and advanced features to watch the emulated RAM memory.\r\n[edit] View | RAM Search\r\n\r\nThis option will pop-up a new window, with extensive and advanced features to search through the emulated RAM memory.\r\n[edit] Tools | View Layers\r\n\r\nThis option lets you toggle BG layer visibility one by one. You can also toggle the rendering for an entire GPU engine, which can help your framerate in games where one screen is pointless.\r\n[edit] Help Menu\r\n[edit] Help | Website\r\n\r\nThis option directs your browser to the desmume homepage.\r\n[edit] Help | Forums\r\n\r\nThis option directs your browser to the desmume forums.\r\n[edit] Help | Submit a bug report\r\n\r\nThis option directs your browser to the SourceForge bugtracker for desmume.\r\n[edit] Help | About\r\n\r\nThis option displays the authors of the emulator. \r\n\r\nRetrieved from \"http://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Windows_port\"\r\nThis page was last modified on 22 November 2009, at 22:09.\r\n\r\n====================================================================\r\n\r\nFaq\r\nFrom DeSmuME\r\nJump to: navigation, search\r\n\r\nDesMuMe FAQ\r\n\r\nThis FAQ holds a list of many commonly asked questions about DeSmuME.\r\n\r\nIf the FAQ is unable to answer any questions you have, then please make sure that you also consult the manual. If this doesn't help, either, post your question on the forums.\r\nContents\r\n[hide]\r\n\r\n    * 1 Release 0.9.4 Topics\r\n          o 1.1 Using old DeSmuME save files in 0.9.4\r\n          o 1.2 What is this NOSSE and dev stuff? / Why does desmume.exe crash when it loads? / Which EXE do I use?\r\n    * 2 Savegames and Savestates\r\n          o 2.1 Why does this game fail to save? / I get the error \"Data could not be accessed. Turn off the power and reinsert the DS card.\" or \"Unable to write data. Please turn off the power and reinsert the game card.\"\r\n          o 2.2 Why was the save file format and extension changed from .sav to .dsv ?\r\n          o 2.3 Can I use my save states across versions?\r\n          o 2.4 Can I convert an ideas or no$gba nocash .sav savefile to DeSmuME .dsv?\r\n          o 2.5 How do I make Pokemon saves?\r\n          o 2.6 Why can't Pokemon save after beating the elite 4?\r\n    * 3 Wi-Fi and WFC\r\n          o 3.1 Does DeSmuME support wifi?\r\n          o 3.2 Why do I get an assert in wifi.cpp which keeps me from playing a game?\r\n          o 3.3 If DeSmuME doesn't support wifi, then why does it make my firewall alert since 0.9.2?\r\n          o 3.4 Why did my build come with winpcap.dll? / Why do I get crashes when I run DeSmuME on vista which mention something about winpcap?\r\n          o 3.5 What is WFC / Nintendo WiFi Connection?\r\n    * 4 Troubleshooting and Errors\r\n          o 4.1 Help! My desmume window disappeared! Maybe I can hear sound and it is in the taskbar but I can't see the window\r\n          o 4.2 Does Scribblenauts work?\r\n          o 4.3 How do I use external BIOS files or firmware?\r\n          o 4.4 Why does my touch screen not work? Oh yes you did read my mind, I was using external firmware\r\n          o 4.5 I have a gameplay related question\r\n          o 4.6 Why doesn't my DeSmuME play this game?\r\n          o 4.7 Why doesn't my game boot or progress into the main game engine?\r\n          o 4.8 Why does the emulator take a long time to start up and/or devastate my system or unarchiver when I run it?\r\n          o 4.9 Why doesn't OpenGL 3D work in Linux?\r\n          o 4.10 Why doesn't OpenGL 3D work in windows?\r\n          o 4.11 My display is incorrect or corrupted or something is missing\r\n          o 4.12 My display has flickering graphics in a certain game\r\n          o 4.13 Why does music and FMV sound bad/distorted sometimes?\r\n    * 5 Performance\r\n          o 5.1 Why is the emulator slow?\r\n          o 5.2 Does DeSmuME make use of multiple CPU's or multiple cores?\r\n          o 5.3 In 0.9.4, what does the number/percentage in the DeSmuME title bar mean\r\n          o 5.4 In 0.9.5, what does the percentage in the FPS display mean\r\n          o 5.5 Why are there Two/Numbers in the FPS display?\r\n    * 6 Using The Emulator\r\n          o 6.1 What are the minimum hardware requirements for DeSmuME ?\r\n          o 6.2 What are the recommended hardware requirements for DeSmuME?\r\n          o 6.3 It is hard to zoom in on a widescreen display due to the unusual aspect ratio of the DS\r\n          o 6.4 But will you please add screen splitting / window tearing apart / fullscreen modes?\r\n          o 6.5 How do I enter 'cheat codes' in DeSmuME?\r\n          o 6.6 I entered a 'cheat code', and now the emulator freezes.\r\n          o 6.7 Does DeSmuME support the microphone?\r\n          o 6.8 Does the 'GBA slot' option let me play GBA games?\r\n          o 6.9 How do I \"Close the DS\"?\r\n          o 6.10 How do I use the stylus (pen) to 'touch' the screen?\r\n          o 6.11 How can I touch two points on the screen at once, as required by Hotel Dusk?\r\n    * 7 General Questions\r\n          o 7.1 What does DeSmuME emulate and on what systems?\r\n          o 7.2 What does DeSmuME mean?\r\n          o 7.3 Under what license is DeSmuME distributed ?\r\n          o 7.4 Can I freely copy DeSmuME ?\r\n          o 7.5 Where can I report bugs?\r\n          o 7.6 Can I attach files to bug reports I did not create myself ?\r\n          o 7.7 What is 'TAS' ?\r\n          o 7.8 What hardware features are emulated?\r\n          o 7.9 Does the GDB stub still work?\r\n          o 7.10 How do I enable the GDB stub on the Windows port ?\r\n          o 7.11 Does compact flash works?\r\n          o 7.12 Where/what is IRC?\r\n          o 7.13 Where is the manual?\r\n          o 7.14 Where is release 0.9.3?\r\n          o 7.15 What is DLDI?\r\n          o 7.16 How can I post a save file or AVI capture on the DeSmuME forum?\r\n          o 7.17 How can I record an AVI with a gap between the screens?\r\n          o 7.18 How can I post a large log or other text file on the DeSmuME IRC chat room?\r\n          o 7.19 What are the origins of DeSmuME?\r\n    * 8 SVN and Compiling\r\n          o 8.1 Why doesn't the DeSmuME team release pre-build SVN binaries ?\r\n          o 8.2 How do I get the latest svn code and build DeSmuME myself?\r\n          o 8.3 What is 'SVN' ?\r\n          o 8.4 What compilers are supported for building DeSmuME from source?\r\n          o 8.5 I'm Compiling using MSVC Express On Windows, and I get the error : \"ml.exe\" not found.\r\n    * 9 Development and Technical Questions\r\n          o 9.1 I have a patch, modification or other code addition\r\n          o 9.2 I'm a developer, and would like to contribute to the codebase. What can I do?\r\n          o 9.3 Im not a developer, but would like to help out anyway. What can I do?\r\n          o 9.4 What is this Lua stuff I see?\r\n          o 9.5 How do I easily capture the ASM code for troubleshooting purposes?\r\n          o 9.6 Where can I find technical details on the Nintendo DS and GBA?\r\n    * 10 Mac Users\r\n          o 10.1 Why can't I find a Mac binary?\r\n          o 10.2 Why does my Mac binary say something about being unsupported?\r\n          o 10.3 Why doesn't a menu option or tool exist in my Linux or Mac build?\r\n\r\n[edit] Release 0.9.4 Topics\r\n[edit] Using old DeSmuME save files in 0.9.4\r\n\r\nDeSmuME will first try to load a dsv file. If the dsv is missing, it will try to load a sav and then it will immediately dump the dsv. The conversion process is supposed to be seamless.\r\n[edit] What is this NOSSE and dev stuff? / Why does desmume.exe crash when it loads? / Which EXE do I use?\r\n\r\nUse dev if you are a developer and want the gdb stub. Use nosse if the regular exe crashes for you because you are on an old computer. desmume.exe uses some SSE2 optimizations for 3D matrix calculations which have been disabled in desmume_nosse.exe. Any modern Intel CPU (AMD or intel) will support SSE2.\r\n[edit] Savegames and Savestates\r\n[edit] Why does this game fail to save? / I get the error \"Data could not be accessed. Turn off the power and reinsert the DS card.\" or \"Unable to write data. Please turn off the power and reinsert the game card.\"\r\n\r\nUntil version 0.9.4 DeSmuME's save size autodetection was poor. With 0.9.4, autodetection should work almost all the time. In fact, here is the entire list of games we currently know of that fail to autodetect correctly:\r\n\r\n    * Spider-Man 3 (should be autodetect_size=1, detected as 3)\r\n    * Over The Hedge (should be autodetect_size=1, detected as 3; same failure mechanism) \r\n\r\nIf you find any other game for which automatic savetype detection does not work, please let the developers know by posting on the forum or submitting a bug. If you want to fix it yourself, you may need to manually specify the correct save type for your game. Consult the manual for details on how to do this for your platform. You may also consult http://www.advanscene.com/ to easily identify the save type for your game.\r\n[edit] Why was the save file format and extension changed from .sav to .dsv ?\r\n\r\nBecause it is better now. These raw save files that everyone uses aren't good enough and were causing problems with autodetection. See our bug tracker or forum for more details; the dsv format has been documented in the svn source tree as dsv.txt and if you don't like the degree of interoperability with other emulators, then go tell the other emulators to support our format.\r\n[edit] Can I use my save states across versions?\r\n\r\nMaybe, maybe not. Due to constant internal changes in DeSmuME, it is possible that a save state created with one version may not work with another version of DeSmuME. Savestate compatibility is preserved wherever possible, but it is not always possible. Please note that for easily confused gamers, the use of SAVESTATES is discouraged, as these are likely to break between emulator versions. Instead use SAVE FILES. These are likely to survive between emulator versions. This means that you will have to use save points within the game. SAVE FILES are stored in .dsv files. Also, see this article for further details : Savefile or savestate\r\n[edit] Can I convert an ideas or no$gba nocash .sav savefile to DeSmuME .dsv?\r\n\r\n1. Convert the save file using http://shunyweb.info/convert.php ; the target format should be \"Acekard RPG | EZFlash V | RAW Format [Autodetection] (.sav)\" 2. Load the game. Let it get to the main menu 3. Select the correct backup size*, as specified by advanscene.com (which is not always right, by the way) 4. Use File > Import Backup Memory and pick the converted save file 5. Reset the game\r\n\r\n    * Step 3 is not always necessary, if you are smart, however, it will never hurt to do it. \r\n\r\n[edit] How do I make Pokemon saves?\r\n\r\nUpdate to 0.9.4, which ensures the save type is detected automatically and correctly.\r\n[edit] Why can't Pokemon save after beating the elite 4?\r\n\r\nYour save file is 9KB. It should be 513KB. Your save file is broken due to you never having established the right savefile size. That means you made it all the way through the game without saving and then testing it by loading (which would not have worked, if you had tried it). See the above discussion for why that was a very bad idea. In 0.9.5+ or post-0.9.4 svn or 0.9.4+ rr builds you may see an option in the savetypes menu called FORCE AS CURRENT which, when used after picking the correct pokemon savefile size (4mbit) will hopefully permit subsequent saves to create a correct savefile.\r\n\r\n\r\nIn order to do that youll have to load your savestate first. If you have been using 0.9.4, since savestate compatibility between versions is not warranted, and definitely won't work between 0.9.4 and 0.9.5, you'll have to use Gocha's 0.9.4+ build which is located at http://tasvideos.org/forum/viewtopic.php?p=210670 which will be able to load an 0.9.4 savestate.\r\n\r\n\r\nThese instructions were not explicit enough for one user. In an effort to tailor this information to the intellectual capacity of the audience for this question, I will paste the instructions which apparently were simple enough for him to follow: go to the faq. follow the link to gocha's build. download gocha's build. load the savestate. set the size (4Mbit). use force as current. save the game. exit the emulator and verify that you can load the game from the savefile. if you can, then load it and play through to complete the game.\r\n[edit] Wi-Fi and WFC\r\n[edit] Does DeSmuME support wifi?\r\n\r\nWifi is not supported. It is currently under slow and incomplete development. Therefore, you may find this option missing, or simply 'greyed-out' for now. Also, since WIFI support does not work yet, don't ask any questions about it's functioning because it still is unfinished and does not work yet. Furthermore, current development activities focus mainly on the Windows build.\r\n[edit] Why do I get an assert in wifi.cpp which keeps me from playing a game?\r\n\r\nThis was a glitch in 0.9.2 release which was fixed in 0.9.4.\r\n[edit] If DeSmuME doesn't support wifi, then why does it make my firewall alert since 0.9.2?\r\n\r\nYour firewall is stupid, or winsock is stupid, (I am not sure which yet) for alerting just when winsock gets initialized. The emulator hasnt actually tried to connect to the internet yet. How could it? There isn't any wifi. All we are doing is some network initialization code. For those of you who are still not satisfied, then I will admit that there is actually some wifi code--but it doesn't actually do anything yet! Except alert your firewall. Sorry. Also, maybe that is actually a good, unobtrusive time for firewalls to alert. But I am not sorry for calling them stupid. They are hyperactive crybabies.\r\n[edit] Why did my build come with winpcap.dll? / Why do I get crashes when I run DeSmuME on vista which mention something about winpcap?\r\n\r\nBecause you are running an unofficial build, from dubious origins, made by unknown people. The DeSmuME team cannot support builds it did not create itself. Therefore, you are advised to stop using unofficial builds, as you can expect no support from the DeSmuME team or on the DeSmuME forums. Only use builds you downloaded from the DeSmuME website.\r\n[edit] What is WFC / Nintendo WiFi Connection?\r\n\r\nSee the article Nintendo wifi config utility for more information.\r\n[edit] Troubleshooting and Errors\r\n[edit] Help! My desmume window disappeared! Maybe I can hear sound and it is in the taskbar but I can't see the window\r\n\r\nDelete your ini file. This is caused by exiting the app while you have executed win+d show desktop mode. Desmume tries to remember the window position, but windows implements show desktop by setting the window position to something like x=-32000 and so that gets saved. There is supposed to be some code to handle that case, but I guess it is not working well. This is a problem in many windows apps and this solution will usually fix it. If you don't want to lose all the other settings in your ini file, poke around in it and find the offending items which should look like this:\r\n\r\n[Video]\r\nWindow Size=0\r\nWindow width=0\r\nWindow height=0\r\nWindowPosX=-32000\r\nWindowPosY=-32000\r\n\r\nDelete the -32000 items\r\n[edit] Does Scribblenauts work?\r\n\r\nIt works in 0.9.4 but you must use external bios files and \"emulate swi's with bios images\". Speaking of work, it has come to my attention that several people worked for some years making this game. If that means anything to you people.\r\n[edit] How do I use external BIOS files or firmware?\r\n\r\nConfig > emulation settings and supply the path. Do not ask us for BIOS files as we don't have them. It is only my psychic skills which enable me to know that this fixes Scribblenauts.\r\n\r\nSince the menu option doesn't exist in the OS X port, it is impossible to play scribblenauts on it.\r\n\r\nLike to MAC/OSX port, the Linux port(s) don't allow you to use external BIOS or Firmware files either.\r\n[edit] Why does my touch screen not work? Oh yes you did read my mind, I was using external firmware\r\n\r\nIt's a bug. It is not a high priority since nobody yet has proven that they actually need the external firmware. If there was a way around it, I wouldve just told you.\r\n[edit] I have a gameplay related question\r\n\r\nPlease check a site like http://www.gamefaqs.com, and don't post gameplay related questions on the forum or IRC *unless* you believe there is a bug in the emulation of DeSmuME.\r\n[edit] Why doesn't my DeSmuME play this game?\r\n\r\nGo to desmume.org and make sure you are using the latest version. The latest version is 0.9.4. Hint: DeSmuME 0.8 and 0.3.4 are very old, being numbers smaller than the latest version. Older versions will not be supported, under any circumstances.\r\n[edit] Why doesn't my game boot or progress into the main game engine?\r\n\r\nDeSmuME is not perfect yet. Some games may fail due to wifi emulation. You might find ways to patch the games to work better on emulators by searching on the internet, but that is not something you should seek help with on the DeSmuME forums. If it really doesn't boot up, you can submit a bug report for the game on the sourceforge bugtracker.\r\n[edit] Why does the emulator take a long time to start up and/or devastate my system or unarchiver when I run it?\r\n\r\nThis is a problem with the DeSmuME 0.9.2 that some people impolitely distribute themselves. Redownload 0.9.2 from sourceforge.net or get a newer version. It isn't a virus or anything, it is a bug in the application that can just bring a system to its knees. It tries to allocate 1GB of virtual memory. This also crashes or freezes some virus scanners (I've seen it on AVG).\r\n[edit] Why doesn't OpenGL 3D work in Linux?\r\n\r\nBlame NVIDIA and ATI for putting out shoddy and/or closed source drivers. Then switch to software rasterizer.\r\n[edit] Why doesn't OpenGL 3D work in windows?\r\n\r\nYou are probably using an ATI video card. ATI driver support of OpenGL is known to be poor. NVIDIA cards have a much more robust support of OpenGL, so getting one of those will help. Alternatively, you can switch to software rasterizer.\r\n[edit] My display is incorrect or corrupted or something is missing\r\n\r\nTry switching the 3D Renderer from OpenGL or SoftRasterizer, or vice versa, to see if that resolves the bug. In Windows, the default hotkey to do this quickly is numpad minus.\r\n[edit] My display has flickering graphics in a certain game\r\n\r\nIn the 0.9.4 Windows port, you can choose 'Alternate Flush Mode' in the 'Config | 3D Settings' menu. This fixes some games with flickering graphics. This option is no longer necessary in 0.9.5. If you still have flickering graphics, find the discussion about frameskipping in this doc (try turning it off.)\r\n[edit] Why does music and FMV sound bad/distorted sometimes?\r\n\r\nMost DS music is sequenced music, loaded from the cart entirely when the level loads. This works mostly fine, but bonus points for you if your ears are good enough to spot the bugs. Your music that doesn't work well at all is probably streaming music, which loads from the cart on the fly and goes straight to the speakers, and possibly decoded along the way. This includes FMVs. This is much harder to emulate as it requires correct timing, which is not one of DeSmuME's strengths right now. At any rate, in 0.9.5 support for a synchronized SPU was added for the windows builds which can be optionally enabled to make these streaming sounds work correctly. Synchronizing audio is a hard problem to solve, and we're not finished solving it. The synchronous SPU comes with some other issues, which is why it is optional. Also available, if you are using the windows build, is a command from the menu Emulation > Shut Up to make the offending music go away.\r\n[edit] Performance\r\n[edit] Why is the emulator slow?\r\n\r\nBecause nobody pays us to work on it full time and it runs fast enough for us to be happy. Well, almost.\r\n\r\nNew releases may always be a step backwards in some (or many) cases from earlier releases in terms of speed. There is a delicate balance between compatibility and speed and sometimes one advances further than the other. At any rate, we have introduced a few speed hacks and toggles which you may find helpful:\r\n\r\n    * (0.9.4) If you are in Windows, make sure you're not using the NOSSE build. That one is slower.\r\n    * (0.9.5) If you are in Windows, try using the SSE2 build. It may be a little faster.\r\n    * (0.9.5) If you are in linux, try making a build with SSE and SSE2 extensions enabled because the code is ready to handle it. Someone should provide details on how to do this.\r\n    * If you are using someone else's unofficial \"SVN\" build, it probably is not fully optimized, since we make our Windows releases using some profiler-guided optimization, which helps by several FPS. For all I know, they are also carriers of viruses, and lately they tend to crash on Vista.\r\n    * If you can handle it, turn off the sound.\r\n    * Use frame skip. Even frameskipping by 1 will help and many games will stay playable. Frameskipping is continually tweaked in each release to get more bang for the buck, but beware that dual screen 3d games still may not work well under frameskip. If screens seem stuck, pick a different frameskip value.\r\n    * (0.9.4+) In the sound options, set interpolation to none which should help a little bit.\r\n    * (0.9.4 only) Turn on the sound option \"ADPCM Caching\"; this is new and experimental, and will break some things, but it should offer a substantial speedup in some cases.\r\n    * (0.9.5+) Use dual/asynch SPU mode -- even if you turn off the sound. Try alternate synch methods if you must use synch spu mode.\r\n    * (0.9.4+) There is now the option of disabling an entire screen. (Tools > View Layers > Main GPU, etc) Consider disabling a screen which is useless in the game you are playing.\r\n    * Try the software rasterizer. In many cases, especially games which make only light use of the 3d hardware, this will actually run faster, by as many as 10 FPS. But it might also run slower, again, by as many as 10 FPS.\r\n    * (0.9.5+) If you are using the software rasterizer, disable edge marking and fog if you feel like they aren't needed. If the game isn't using those features then this won't help.\r\n    * Buying a newer, faster computer is somewhat more expensive, but it has other side benefits.\r\n    * A faster CPU is more helpful than a bleeding edge graphics card. DeSmuME is more CPU intensive than it is GPU intensive. It just needs a graphics card that is glitch-free, and currently the NVIDIA cards have a better track record. A newer graphics card has a slim possibility of increasing speed.\r\n    * The cheapest way to get 60fps is to buy the cart. You may find that this is not enough, and you need to buy a console as well. Here are some steps that have worked well for me in the past:\r\n          o Look for neighbors that are mowing their own lawns. Ask them if they would like for you to do it instead.\r\n          o Borrow your daddy's lawn mower and mow the neighbor's lawn.\r\n          o After this, they will generally give you cash. As you repeat the above steps, this cash can accumulate to large values.\r\n          o Once the accumulated cash is sufficient, it can be taken to a merchant where it can be exchanged for games and consoles. \r\n    * My lawn needs mowing. It wont make your game run any faster if you mow it for me, but I am less likely to get evicted, which would be bad for my productivity. \r\n\r\n[edit] Does DeSmuME make use of multiple CPU's or multiple cores?\r\n\r\nCurrently, the Windows port has two particular multicore optimizations (in 0.9.5+): first, the display logic runs in its own thread independent from the emulator. This is used to make the OSD run frame-rate independent from emulation. This thread performs color conversion, filtering, and directdraw presentation. The net result is a speedup by a few FPS. This codepath is disabled on single core systems, and may be disabled forcefully by the user with the --num-cores=1 command line argument. Second, the software rasterizer will run in a SLI mode using as many cores as you have specified (or have been detected) up to four. Still, DeSmuMe benefits MUCH more from a single CPU with a higher GHz than from multiple cores or from multiple CPUs.\r\n[edit] In 0.9.4, what does the number/percentage in the DeSmuME title bar mean\r\n\r\n    * For the Windows port, the percentage is the emulated ARM9 CPU load average. The CPU in an actual Nintendo DS is an ARM9 CPU. The percentage shows us how busy the emulated CPU is. This number isnt really for you. You are far too curious. But go ahead and brag about how emulated games run at 99% on your system, it makes us laugh.\r\n    * For the Linux GTK and Glade ports, it's frames per second (fps). \r\n\r\n[edit] In 0.9.5, what does the percentage in the FPS display mean\r\n\r\nSee above, it was moved here to save 915 million people from asking what it means in the title bar.\r\n[edit] Why are there Two/Numbers in the FPS display?\r\n\r\nThe first is your actual FPS which is how fast the emu is running on your system. If it is less than 60 then you need speed hacks or more a more powerful CPU. The second is the 3d FPS, which is a rough gauge of how fast the game is supposed to be running. If you are seeing 60/15 then the game will feel slow because it is sloppily coded but theres NOTHING YOU CAN DO ABOUT IT short of turning off speed throttling and playing at 100fps.\r\n[edit] Using The Emulator\r\n[edit] What are the minimum hardware requirements for DeSmuME ?\r\n\r\nFrom a purely technical viewpoint, there are no minimum requirements. However, for 'real-world' playable speeds, you would need at least the following :\r\n\r\n    * Windows OS: Windows XP or Vista\r\n    * Linux OS: Any recent Linux distribution with a 2.6 kernel.\r\n    * 2 GHz Processor\r\n    * 512 MB Available System Memory\r\n    * Available Hard Drive Space: A few MB for the emulator\r\n    * 128 MB 3D Video Card (Nvidia GeForce 6800 or better), ATI cards are not recommended.\r\n    * Optional: Sound Card, if you want sound support\r\n    * Optional: Microphone, if you wish to make use the Windows Microphone feature \r\n\r\n[edit] What are the recommended hardware requirements for DeSmuME?\r\n\r\nFrom a purely technical viewpoint, there are no recommended requirements. However, for 'real-world' playable speeds, the following gives you good performance:\r\n\r\n    * Windows OS: Windows XP or Vista\r\n    * Linux OS: Any recent Linux distribution with a 2.6 kernel.\r\n    * 3 GHz Processor\r\n    * 1 GB Available System Memory\r\n    * Available Hard Drive Space: A few MB for DeSmuME, 100MB or so for a bunch of savestates and savefiles.\r\n    * 512 MB 3D Video Card (Nvidia GeForce), ATI cards are not recommended.\r\n    * Sound Card.\r\n    * Microphone. \r\n\r\nIn general, the more GHz, the better. The faster memory, the better. DeSmuME 0.9.4 won't benefit from multiple cores. DeSmuME is at the moment, unfortunately, slower than no$gba.\r\n[edit] It is hard to zoom in on a widescreen display due to the unusual aspect ratio of the DS\r\n\r\nIn fact it is hard to zoom in on a 4:3 screen, too. In 0.9.5, you can configure the screens to be side-by-side, so maybe this will make you happy. Additionally you can choose to display only one screen. I don't think anyone wants to add tear-apart windows, though.\r\n[edit] But will you please add screen splitting / window tearing apart / fullscreen modes?\r\n\r\nYou think youre the first person to have thought of this? The answer is no. Of all the things in the world to code, we hate this the most.\r\n[edit] How do I enter 'cheat codes' in DeSmuME?\r\n\r\nAs of 0.9.4, there are two types of cheat codes: Action Replay and 'raw' or 'internal' cheats. The 'raw' or 'internal' cheats include cheat-finding facilities where you may manually search for and alter the memory positions which work to your advantage. There's an excellent article on 'raw' or 'internal' cheats in the wiki on Using Cheats in DeSmuMe . For Action Replay Cheats, You can find codes for the NTSC games at http://us.codejunkies.com/Departments/DS-and-GBA.aspx and for the PAL at http://uk.codejunkies.com/Departments/DS-and-GBA.aspx.\r\n[edit] I entered a 'cheat code', and now the emulator freezes.\r\n\r\nMost likely it's a problem from the (Action Replay) cheat code you used. Using codes modify the game and can make it crash/freeze if it comes to an unexpected situation. It just depends on the code you use and what it's used for in the game. Find the .dct file in your emulator's folder that matches the game's filename, and then erase it to solve the 'freezing' problem.\r\n[edit] Does DeSmuME support the microphone?\r\n\r\nYes, but only on the Windows and GNU/Linux ports. You do need to have an actual microphone attached to your PC, though. In 0.9.2 the microphone in Windows really only works for noise, but this was fixed in 0.9.4; it was fixed even further in 0.9.5. Linux support will exist in 0.9.5+ -- please note that it requires libasound.\r\n\r\nWhen in windows, if it seems that the microphone is not working, bear in mind that it has no idea what kind of how many microphones you have. You will need to use the windows control panel to specify the correct microphone as the default audio input device, and then make sure in the recording level properties (volume control) that it is selected and at an appropriate volume.\r\n[edit] Does the 'GBA slot' option let me play GBA games?\r\n\r\nNo. A 'real' DS can use the gba slot to play gba games, but DeSmuME does not emulate this. But a 'real' DS can also use the gba slot to access gba roms and sram so that ds games can import savefiles, and that part is emulated by DeSmuME. (please note that in 0.9.4 this is reportedly buggy for some games, including pokemon; this is supposed to have been fixed in 0.9.5) If you are looking for a Game Boy Advance (GBA) emulator, perhaps you can try mednafen or VisualBoy Advance.\r\n[edit] How do I \"Close the DS\"?\r\n\r\nThis can be done using the 'lid' command or BACKSPACE key (this can be changed in the control configuration).\r\n[edit] How do I use the stylus (pen) to 'touch' the screen?\r\n\r\nYou can use your mouse to emulate the stylus. Move the mouse cursor to the desired position, and then press the left mouse button in order to 'touch' the screen at the position the mouse cursor is located. Yes, we have really been asked this question before.\r\n[edit] How can I touch two points on the screen at once, as required by Hotel Dusk?\r\n\r\nOne user got past this by first switching on one of the switches, then pausing the game, and sort of switching on an imaginary switch in the middle of the two switches while manipulating the frame advance hotkey. See, gbatek says that when two points are touched, that the hardware appears as if the average of the two points is actually pressed. But the game expects you to touch them at not-exactly-the-same-time.\r\n[edit] General Questions\r\n[edit] What does DeSmuME emulate and on what systems?\r\n\r\nDeSmuME attempts to emulate, as faithfully as possible, the Nintendo DS and Nintendo DS Lite handheld game consoles (NDS). It currently runs on Windows, Linux, and mac OSX. DSi is not supported.\r\n[edit] What does DeSmuME mean?\r\n\r\nDeSmuME is a Nintendo DS emulator and the name is a play of words - DS Emu + ME (like FlashMe - firmware hack and PassMe mod-chip for DS) The name DeSmuME derives from the popular use of ME in Nintendo DS products by homebrew developers. So DeSmuME would equal DSemuMe. Other popular uses of ME include:\r\n\r\n    * LoadMe - a generic patcher for commercial DS roms that works with any GBA Flash Card\r\n    * PassMe - \"mod-chip\" using which takes authentication from an original DS card an allows execution of unauthenticated DS rom code - from the GBA cartridge slot / GBA flash card.\r\n    * FlashMe - a hacked firmware for DS that allows you to start code in DS mode from a flash card in the GBA slot.\r\n    * WifiMe - are a set of a custom drivers and software by FireFly for RALink based wireless network cards enabling to boot homebrew code on DS via Nintendo Wireless Multiboot method. \r\n\r\nIts name is derived from emu which is short for emulator, DS and me. It's possibly supposed to mean \"DS emulator for me\".\r\n[edit] Under what license is DeSmuME distributed ?\r\n\r\nDeSmuME is distributed under the GNU General Public License, or GPL: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\r\n[edit] Can I freely copy DeSmuME ?\r\n\r\nYes you can, as long as you adhere to the license as specified in the GNU GPL.\r\n[edit] Where can I report bugs?\r\n\r\nIn the official bug tracker. Feel free to post to the bug tracker as long as you are willing to take ownership of testing that bug and letting the developers know when it is resolved to your satisfaction. Just don't submit a bug report and run. You may also request features around the same location, too, but in the other trackers.\r\n[edit] Can I attach files to bug reports I did not create myself ?\r\n\r\nSourceForge likes for folks to only respond on items they submit. If you see a ticket that represents something you are encountering, SourceForge doesn't necessarily want you commenting on that. The reasoning for this given by SourceForge is that they feel it is best to open your own ticket, which helps appreciate the extent of issues in many cases. The authors of DeSmuME may or may not agree with this point of view from SourceForge.\r\n[edit] What is 'TAS' ?\r\n\r\nTAS lets you record the gameplay in TAS format, see http://tasvideos.org for details on TAS (tool-assisted speedruns).\r\n[edit] What hardware features are emulated?\r\n\r\n    * All known 2D graphics features are correct. Mosaics work but are imperfect. There may be small issues with colors as the correct color bit depths are not used at all points in the pipeline. \r\n\r\n    * All 3D features are emulated, except the following: wireframes and antialising. In 0.9.5, support for fog is added, as well as edge marking which mostly-works but is not perfect. In 0.9.5 the box test was significantly improved (dare I say perfected?) which fixed a number of games. The OpenGL engine is near its limit and renders some things incorrectly. Eventually the software rasterizer will support more features and be far more precise in the basic features. Both engines have trouble with some shadows, but software rasterizer is better. Software rasterizer has some noticeable texturing issues right now, especially in 2d games. Software rasterizer supports more correct lighting interpolation than opengl ever will (e.g. glitches at the edge of the screen while scrolling.) In software rasterizer, there are issues similar to 2d with incorrect bit depth being used in the pipeline. There are unfavorable edge conditions in each renderer; in OpenGL, textures tend to get overdrawn; in software rasterizer, edges of textures tend to be jittery (like the real DS) \r\n\r\nOne last thing -- if buttons and labels and menus rendering on the 3d screen are obscured (for example, a button but no label is on it) then you may need to use the software rasterizer. Or you may need to use OpenGL instead. Each renderer has strengths and weaknesses, which is why both are provided.\r\n\r\n    * All sound features are emulated. The microphone support is new and the manual should be consulted, where you will find out, among other things, that it is only supported in windows right now. \r\n\r\n    * Wifi is not supported. It is currently under slow and incomplete development. Therefore, you may find this option missing, or simply 'greyed-out' for now. Also, since WIFI support does not work yet, please don't ask any questions regarding it, because it still is unfinished and does not work yet. \r\n\r\n    * We are unaware of any outstanding issues in the core system hardware (CPU, DMA, MMU) but there are certainly still some. The instruction and memory timings are quite incorrect; however, this seems not to hurt most titles. \r\n\r\n    * DLDI - Dynamically Linked Driver Interface, commonly known as DLDI, is a driver framework that allows NDS and GBA homebrew to easily read and write to any number of different devices, just by substituting a driver file. The MPCF driver (GBA MoviePlayer CF-version) is the only one that is supported, so you will need to install it into your application before using it in desmume. You will find that a directory or fat image must be mounted via the commandline or UI for the \"gbaslot\" configuration. Right now, our codebase really only has libfat support for SLOT-2 devices and CF devices so more thorough support for other DLDI drivers is unlikely at this time. \r\n\r\n    * RTC (real-time clock) works; If it didn't, then the time in your games stays at 00:00:00, and your random number values always come up the same. \r\n\r\n[edit] Does the GDB stub still work?\r\n\r\nIt seems as if it works in 0.9.4, tested with the Insight GDB variant on windows with a recent devKitPro. This support has been compiled into the dev+ build.\r\n[edit] How do I enable the GDB stub on the Windows port ?\r\n\r\nAdd #define GDB_STUB to src/windows/userconfig/userconfig.h which you have created according to the instructions in src/windows/defaultconfig/userconfig.h ; sorry for this confusing system, but that's how it is for now.\r\n[edit] Does compact flash works?\r\n\r\nIn 0.9.2+ it works, somewhat buggily, at least for directory scanning (i.e. not fat16 image) in windows via the gba slot. There is a bug that breaks it in linux, which has been fixed for 0.9.5+ along with some other work on that system.\r\n[edit] Where/what is IRC?\r\n\r\nIRC is an on-line communication system.\r\n\r\ndata you need:\r\n\r\n    * server: irc.freenode.net\r\n    * port: 6667\r\n    * channel: #desmume \r\n\r\nwhat to use:\r\n\r\n    * mIRC - Windows\r\n    * ChatZilla - FireFox add-on\r\n    * xchat - X\r\n    * plenty other, see wikipedia \r\n\r\nLanguage:\r\n\r\n    * Most of the people on the channel speak, or try to speak the English language. \r\n\r\n[edit] Where is the manual?\r\n\r\nA manual for DeSmuME is over at http://wiki.desmume.org/index.php?title=Manual. It may not have the information that other entries in this FAQ promised that it would.\r\n[edit] Where is release 0.9.3?\r\n\r\nWho cares? 0.9.4 is out now. DeSmuME 0.9.3 does not exist. It was sneaked out of our staging area. It has bugs, which is why we hadn't released it yet. So we decided not to release it at all. Any release claiming to be 0.9.3 won't be supported.\r\n[edit] What is DLDI?\r\n\r\nDLDI is a patching system for homebrew ROMs using libfat which makes DS homebrew much easier to write and much more user friendly. As you may know, there are many various flash cartridges for DS. These 'flashcarts' use different hardware, so to make a program run on all cards, youd have to write support for each and every card into the program. But no-one needs support for any other cards than their own. So a libfat developer, chism, developed DLDI. The program itself knows nothing about the hardware. However, when a DLDI patch is applied, libfat can use this patch to know how to write to the flashcart. So, if one user has an M3 flashcart, and downloads a program, they could patch it with the M3 DLDI patch and the program would work with it. Then, another user with a Supercart could download it, apply the Supercard DLDI patch, and it would work on their flashcart, too. The same patch should let the flashcart work with any libfat based program.\r\n[edit] How can I post a save file or AVI capture on the DeSmuME forum?\r\n\r\nAfter you created it, you can upload it to a free external service provider like MediaFire (http://www.mediafire.com/), and then put the provided links to the page in the message you post on the forum.\r\n[edit] How can I record an AVI with a gap between the screens?\r\n\r\nLearn how to use virtualdub and avisynth. Then use the following avisynth script which we have developed for this purpose:\r\n\r\n####configuration####\r\ngap = 64\r\n#color = $aaaaaa\r\n#color = $000000\r\ncolor = $ffffff\r\n##################\r\nA = AviSource(\"c:\\ds.avi\", pixel_type=\"RGB32\")\r\nB = AviSource(\"c:\\ds.avi\", pixel_type=\"RGB32\")\r\nC = blankclip(fps=A.FrameRate, width=256, height=192+gap+192, color=color, length=A.FrameCount)\r\nA = A.crop(0,0,256,192)\r\nB = B.crop(0,192,256,192)\r\nD = overlay(C,A)\r\nD = overlay(D,B,0,192+gap)\r\nreturn AudioDub(D,A)\r\n\r\nWe really don't want to put any smarts into the desmume avi dumper, preferring to do it with avisynth instead. It is a slippery slope, as there are about 50 things that people want avi dumpers to do and theyre better off learning how to do it outside the emu with other tools. To that end, if you have any particular needs regarding this do not hesitate to post in our forum and maybe we'll help you make a new avisynth script.\r\n[edit] How can I post a large log or other text file on the DeSmuME IRC chat room?\r\n\r\nMake use of an external text storage site, such as 'pastebin' (http://pastebin.com/), and post the url to it on the IRC channel.\r\n[edit] What are the origins of DeSmuME?\r\n\r\nDeSmuME is a freeware emulator for the Nintendo DS originally created by YopYop156. The original website was http://yopyop156.ifrance.com\r\n\r\nDue to change in French laws regarding emulation YopYop decided to stop development of DeSmuME. However, he released the source under the GPL, and other programmers have picked it up and kept it under active development.\r\n\r\nYopyop said:\r\n\r\n    Its release under GPL. I have just removed the new 3D engine because its too much bugged. Hopefully it will be helpful for some of you. \r\n\r\n\r\nThe latest statement heard from yopyop was:\r\n\r\n    DeSmuME project is over. \r\n    You may dont know but there are a new law in France that could put me in big trouble. \r\n    With DeSmuME, I have closed the doors of game company but I can not offer to pay for it. \r\n\r\n    The worst thing is that I have found the bad coded instructions. \r\n    For those how have download the sources you have to look in sbc, rsbc instructions the Carry flag updating is wrong. \r\n    Sorry for the home brew programmers. \r\n\r\n    For the illegality the demonstration seemed to me convincing thus without proof clarify I prefer to stick to this decision. \r\n\r\n    It is also the fact that few people seem interested by the project. Put besides some people who sent demonstrations to me which did not go, I received only malls to wonder to make function such or such plays or to ask me why moved is in French . \r\n    Thus I will not do something of useless and illegal. \r\n\r\n    For the site it would not obstruct me if there were not the bond on the left which does nothing but add to confusion on the goal of the project. \r\n\r\n    And for the sources it is the same problem as for the project. \r\n\r\n    good week end \r\n\r\n    yopyop \r\n\r\n    edit the law relates to the royalties and the rights close, not? \r\n\r\n[edit] SVN and Compiling\r\n[edit] Why doesn't the DeSmuME team release pre-build SVN binaries ?\r\n\r\nBecause the DeSmuME team doesn't have trusted people to make the builds, and don't want to get involved on builds that could include whatever the author wants. Every newbie coder could do a version that, after 10 minutes of gameplay, for example, starts corrupting stuff from the hard disk. Also, anyone incapable of building it's own builds, probably isn't very helpful for submitting bug reports or helping the development team on SVN releases, so there isn't much point on them getting a SVN build.\r\n[edit] How do I get the latest svn code and build DeSmuME myself?\r\n\r\nPlease check out the instructions related to your platform, over at Installing DeSmuME from source\r\n[edit] What is 'SVN' ?\r\n\r\nsvn is a developers tool. It's used to let multiple developers work on the same codebase without conflicts. If youre an end-user, don't worry about it. And if you're a developer, see the question on how to get the latest svn code and build DeSmuME yourself. See wikipedia for more info\r\n[edit] What compilers are supported for building DeSmuME from source?\r\n\r\n    * At the moment, for Windows Microsoft Visual C++ 2005 and 2008 are the only supported compilers. Dev-C++ is not supported. Microsoft's Visual C++ Express is free to install and use, so there's no reason not to use it.\r\n    * For Linux, any recent version of GCC and toolchain should work. \r\n\r\n[edit] I'm Compiling using MSVC Express On Windows, and I get the error : \"ml.exe\" not found.\r\n\r\nml.exe was not included in earlier downloads of MSVC++ 2008 Express Edition. Uninstall, redownload and install again. 'ml.exe' shoud be located in the \"Microsoft Visual Studio 9.0\\VC\\bin\" directory.\r\n[edit] Development and Technical Questions\r\n[edit] I have a patch, modification or other code addition\r\n\r\nPlease add them to the appropriate sourceforge tracker. Patches go to the 'Patches' tracker : http://sourceforge.net/tracker/?group_id=164579&atid=832293\r\n[edit] I'm a developer, and would like to contribute to the codebase. What can I do?\r\n\r\nTo start you off in the right direction, the best thing you can do is join the developer team on IRC and discuss your intentions with the developers.\r\n[edit] Im not a developer, but would like to help out anyway. What can I do?\r\n\r\nThe most helpful thing you can do is use DeSmuME, learn its ins and outs, and learn how to compile svn builds. Then monitor it for regressions and report bugs. You can patrol the bug tracker for bugs which could use elucidation or which, based on your awareness of how the emulator is changing, might be fixed without us having specifically addressed the bug. Basically, be a super user. And hang out on irc. Also, adding to or perfecting the documentation in the wiki is useful. You could also watch for and answer questions placed on the DeSmuME forum.\r\n[edit] What is this Lua stuff I see?\r\n\r\nIt is sort of a macro language for interacting with the running game software. Here is an example of it working with an NES game in another emulator, and youtubing for \"fceux lua\" should suffice to explain it if you don't get the picture from this url: http://www.youtube.com/watch?v=1XNTjVScm_8\r\n[edit] How do I easily capture the ASM code for troubleshooting purposes?\r\n\r\nSavestate during the problem or just before your problem occurs, and #define WANTASMLISTING in armcpu.cpp. Recompile. Then redirect stdout to a file. I know it isn't easy but its what we have for now.\r\n\r\nA newer, and possibly better way, is to search for LOG_ARM9 in ndssystem.cpp and uncomment it. You will also need to trigger the condition for logging by setting dolog=true. Beware that this is very verbose, and can dump around 100MBytes of logs per frame.\r\n[edit] Where can I find technical details on the Nintendo DS and GBA?\r\n\r\nhttp://nocash.emubase.de/gbatek.htm\r\n[edit] Mac Users\r\n[edit] Why can't I find a Mac binary?\r\n\r\nMaybe we haven't made it yet. There aren't a lot of people willing to compile Mac software. Just to be sure, go to https://sourceforge.net/project/showfiles.php?group_id=164579&package_id=186413\r\n[edit] Why does my Mac binary say something about being unsupported?\r\n\r\nYou have probably downloaded the i386 version of DeSmuME for MAC, and are running on the PPC platform (or the other way around). Please verify if you're running on Intel (i386) hardware, or on PPC (G4, G5) hardware, and download the appropriate binary.\r\n[edit] Why doesn't a menu option or tool exist in my Linux or Mac build?\r\n\r\nBecause making portable tools and platform harnesses are not our cup of tea and so a developer puts a feature into whichever ports he cares about. This policy is never going to change, although some features might migrate to other platforms over time. Better check the manual. \r\n\r\nRetrieved from \"http://wiki.desmume.org/index.php?title=Faq\"\r\nThis page was last modified on 21 November 2009, at 21:55.\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/aclocal.m4",
    "content": "# generated automatically by aclocal 1.11.5 -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,\n# Inc.\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\nm4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,\n[m4_warning([this file was generated for autoconf 2.68.\nYou have another version of autoconf.  It may work, but is not guaranteed to.\nIf you have problems, you may need to regenerate the build system entirely.\nTo do so, use the procedure documented by the package, typically `autoreconf'.])])\n\n# Copyright (C) 1995-2002 Free Software Foundation, Inc.\n# Copyright (C) 2001-2003,2004 Red Hat, Inc.\n#\n# This file is free software, distributed under the terms of the GNU\n# General Public License.  As a special exception to the GNU General\n# Public License, this file may be distributed as part of a program\n# that contains a configuration script generated by Autoconf, under\n# the same distribution terms as the rest of that program.\n#\n# This file can be copied and used freely without restrictions.  It can\n# be used in projects which are not available under the GNU Public License\n# but which still want to provide support for the GNU gettext functionality.\n#\n# Macro to add for using GNU gettext.\n# Ulrich Drepper <drepper@cygnus.com>, 1995, 1996\n#\n# Modified to never use included libintl. \n# Owen Taylor <otaylor@redhat.com>, 12/15/1998\n#\n# Major rework to remove unused code\n# Owen Taylor <otaylor@redhat.com>, 12/11/2002\n#\n# Added better handling of ALL_LINGUAS from GNU gettext version \n# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002\n#\n# Modified to require ngettext\n# Matthias Clasen <mclasen@redhat.com> 08/06/2004\n#\n# We need this here as well, since someone might use autoconf-2.5x\n# to configure GLib then an older version to configure a package\n# using AM_GLIB_GNU_GETTEXT\nAC_PREREQ(2.53)\n\ndnl\ndnl We go to great lengths to make sure that aclocal won't \ndnl try to pull in the installed version of these macros\ndnl when running aclocal in the glib directory.\ndnl\nm4_copy([AC_DEFUN],[glib_DEFUN])\nm4_copy([AC_REQUIRE],[glib_REQUIRE])\ndnl\ndnl At the end, if we're not within glib, we'll define the public\ndnl definitions in terms of our private definitions.\ndnl\n\n# GLIB_LC_MESSAGES\n#--------------------\nglib_DEFUN([GLIB_LC_MESSAGES],\n  [AC_CHECK_HEADERS([locale.h])\n    if test $ac_cv_header_locale_h = yes; then\n    AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,\n      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],\n       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])\n    if test $am_cv_val_LC_MESSAGES = yes; then\n      AC_DEFINE(HAVE_LC_MESSAGES, 1,\n        [Define if your <locale.h> file defines LC_MESSAGES.])\n    fi\n  fi])\n\n# GLIB_PATH_PROG_WITH_TEST\n#----------------------------\ndnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,\ndnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])\nglib_DEFUN([GLIB_PATH_PROG_WITH_TEST],\n[# Extract the first word of \"$2\", so it can be a program name with args.\nset dummy $2; ac_word=[$]2\nAC_MSG_CHECKING([for $ac_word])\nAC_CACHE_VAL(ac_cv_path_$1,\n[case \"[$]$1\" in\n  /*)\n  ac_cv_path_$1=\"[$]$1\" # Let the user override the test with a path.\n  ;;\n  *)\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:\"\n  for ac_dir in ifelse([$5], , $PATH, [$5]); do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      if [$3]; then\n\tac_cv_path_$1=\"$ac_dir/$ac_word\"\n\tbreak\n      fi\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\ndnl If no 4th arg is given, leave the cache variable unset,\ndnl so AC_PATH_PROGS will keep looking.\nifelse([$4], , , [  test -z \"[$]ac_cv_path_$1\" && ac_cv_path_$1=\"$4\"\n])dnl\n  ;;\nesac])dnl\n$1=\"$ac_cv_path_$1\"\nif test ifelse([$4], , [-n \"[$]$1\"], [\"[$]$1\" != \"$4\"]); then\n  AC_MSG_RESULT([$]$1)\nelse\n  AC_MSG_RESULT(no)\nfi\nAC_SUBST($1)dnl\n])\n\n# GLIB_WITH_NLS\n#-----------------\nglib_DEFUN([GLIB_WITH_NLS],\n  dnl NLS is obligatory\n  [USE_NLS=yes\n    AC_SUBST(USE_NLS)\n\n    gt_cv_have_gettext=no\n\n    CATOBJEXT=NONE\n    XGETTEXT=:\n    INTLLIBS=\n\n    AC_CHECK_HEADER(libintl.h,\n     [gt_cv_func_dgettext_libintl=\"no\"\n      libintl_extra_libs=\"\"\n\n      #\n      # First check in libc\n      #\n      AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc,\n        [AC_TRY_LINK([\n#include <libintl.h>\n],\n         [return !ngettext (\"\",\"\", 1)],\n\t  gt_cv_func_ngettext_libc=yes,\n          gt_cv_func_ngettext_libc=no)\n        ])\n  \n      if test \"$gt_cv_func_ngettext_libc\" = \"yes\" ; then\n\t      AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,\n        \t[AC_TRY_LINK([\n#include <libintl.h>\n],\n\t          [return !dgettext (\"\",\"\")],\n\t\t  gt_cv_func_dgettext_libc=yes,\n\t          gt_cv_func_dgettext_libc=no)\n        \t])\n      fi\n  \n      if test \"$gt_cv_func_ngettext_libc\" = \"yes\" ; then\n        AC_CHECK_FUNCS(bind_textdomain_codeset)\n      fi\n\n      #\n      # If we don't have everything we want, check in libintl\n      #\n      if test \"$gt_cv_func_dgettext_libc\" != \"yes\" \\\n\t || test \"$gt_cv_func_ngettext_libc\" != \"yes\" \\\n         || test \"$ac_cv_func_bind_textdomain_codeset\" != \"yes\" ; then\n        \n        AC_CHECK_LIB(intl, bindtextdomain,\n\t    [AC_CHECK_LIB(intl, ngettext,\n\t\t    [AC_CHECK_LIB(intl, dgettext,\n\t\t\t          gt_cv_func_dgettext_libintl=yes)])])\n\n\tif test \"$gt_cv_func_dgettext_libintl\" != \"yes\" ; then\n\t  AC_MSG_CHECKING([if -liconv is needed to use gettext])\n\t  AC_MSG_RESULT([])\n  \t  AC_CHECK_LIB(intl, ngettext,\n          \t[AC_CHECK_LIB(intl, dcgettext,\n\t\t       [gt_cv_func_dgettext_libintl=yes\n\t\t\tlibintl_extra_libs=-liconv],\n\t\t\t:,-liconv)],\n\t\t:,-liconv)\n        fi\n\n        #\n        # If we found libintl, then check in it for bind_textdomain_codeset();\n        # we'll prefer libc if neither have bind_textdomain_codeset(),\n        # and both have dgettext and ngettext\n        #\n        if test \"$gt_cv_func_dgettext_libintl\" = \"yes\" ; then\n          glib_save_LIBS=\"$LIBS\"\n          LIBS=\"$LIBS -lintl $libintl_extra_libs\"\n          unset ac_cv_func_bind_textdomain_codeset\n          AC_CHECK_FUNCS(bind_textdomain_codeset)\n          LIBS=\"$glib_save_LIBS\"\n\n          if test \"$ac_cv_func_bind_textdomain_codeset\" = \"yes\" ; then\n            gt_cv_func_dgettext_libc=no\n          else\n            if test \"$gt_cv_func_dgettext_libc\" = \"yes\" \\\n\t\t&& test \"$gt_cv_func_ngettext_libc\" = \"yes\"; then\n              gt_cv_func_dgettext_libintl=no\n            fi\n          fi\n        fi\n      fi\n\n      if test \"$gt_cv_func_dgettext_libc\" = \"yes\" \\\n\t|| test \"$gt_cv_func_dgettext_libintl\" = \"yes\"; then\n        gt_cv_have_gettext=yes\n      fi\n  \n      if test \"$gt_cv_func_dgettext_libintl\" = \"yes\"; then\n        INTLLIBS=\"-lintl $libintl_extra_libs\"\n      fi\n  \n      if test \"$gt_cv_have_gettext\" = \"yes\"; then\n\tAC_DEFINE(HAVE_GETTEXT,1,\n\t  [Define if the GNU gettext() function is already present or preinstalled.])\n\tGLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,\n\t  [test -z \"`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`\"], no)dnl\n\tif test \"$MSGFMT\" != \"no\"; then\n          glib_save_LIBS=\"$LIBS\"\n          LIBS=\"$LIBS $INTLLIBS\"\n\t  AC_CHECK_FUNCS(dcgettext)\n\t  MSGFMT_OPTS=\n\t  AC_MSG_CHECKING([if msgfmt accepts -c])\n\t  GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[\nmsgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: test 1.0\\n\"\n\"PO-Revision-Date: 2007-02-15 12:01+0100\\n\"\n\"Last-Translator: test <foo@bar.xx>\\n\"\n\"Language-Team: C <LL@li.org>\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])\n\t  AC_SUBST(MSGFMT_OPTS)\n\t  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)\n\t  GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,\n\t    [test -z \"`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`\"], :)\n\t  AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;\n\t\t\t return _nl_msg_cat_cntr],\n\t    [CATOBJEXT=.gmo \n             DATADIRNAME=share],\n\t    [case $host in\n\t    *-*-solaris*)\n\t    dnl On Solaris, if bind_textdomain_codeset is in libc,\n\t    dnl GNU format message catalog is always supported,\n            dnl since both are added to the libc all together.\n\t    dnl Hence, we'd like to go with DATADIRNAME=share and\n\t    dnl and CATOBJEXT=.gmo in this case.\n            AC_CHECK_FUNC(bind_textdomain_codeset,\n\t      [CATOBJEXT=.gmo \n               DATADIRNAME=share],\n\t      [CATOBJEXT=.mo\n               DATADIRNAME=lib])\n\t    ;;\n\t    *-*-openbsd*)\n\t    CATOBJEXT=.mo\n            DATADIRNAME=share\n\t    ;;\n\t    *)\n\t    CATOBJEXT=.mo\n            DATADIRNAME=lib\n\t    ;;\n\t    esac])\n          LIBS=\"$glib_save_LIBS\"\n\t  INSTOBJEXT=.mo\n\telse\n\t  gt_cv_have_gettext=no\n\tfi\n      fi\n    ])\n\n    if test \"$gt_cv_have_gettext\" = \"yes\" ; then\n      AC_DEFINE(ENABLE_NLS, 1,\n        [always defined to indicate that i18n is enabled])\n    fi\n\n    dnl Test whether we really found GNU xgettext.\n    if test \"$XGETTEXT\" != \":\"; then\n      dnl If it is not GNU xgettext we define it as : so that the\n      dnl Makefiles still can work.\n      if $XGETTEXT --omit-header /dev/null 2> /dev/null; then\n        : ;\n      else\n        AC_MSG_RESULT(\n\t  [found xgettext program is not GNU xgettext; ignore it])\n        XGETTEXT=\":\"\n      fi\n    fi\n\n    # We need to process the po/ directory.\n    POSUB=po\n\n    AC_OUTPUT_COMMANDS(\n      [case \"$CONFIG_FILES\" in *po/Makefile.in*)\n        sed -e \"/POTFILES =/r po/POTFILES\" po/Makefile.in > po/Makefile\n      esac])\n\n    dnl These rules are solely for the distribution goal.  While doing this\n    dnl we only have to keep exactly one list of the available catalogs\n    dnl in configure.ac.\n    for lang in $ALL_LINGUAS; do\n      GMOFILES=\"$GMOFILES $lang.gmo\"\n      POFILES=\"$POFILES $lang.po\"\n    done\n\n    dnl Make all variables we use known to autoconf.\n    AC_SUBST(CATALOGS)\n    AC_SUBST(CATOBJEXT)\n    AC_SUBST(DATADIRNAME)\n    AC_SUBST(GMOFILES)\n    AC_SUBST(INSTOBJEXT)\n    AC_SUBST(INTLLIBS)\n    AC_SUBST(PO_IN_DATADIR_TRUE)\n    AC_SUBST(PO_IN_DATADIR_FALSE)\n    AC_SUBST(POFILES)\n    AC_SUBST(POSUB)\n  ])\n\n# AM_GLIB_GNU_GETTEXT\n# -------------------\n# Do checks necessary for use of gettext. If a suitable implementation \n# of gettext is found in either in libintl or in the C library,\n# it will set INTLLIBS to the libraries needed for use of gettext\n# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable\n# gt_cv_have_gettext will be set to \"yes\".) It will also call AC_SUBST()\n# on various variables needed by the Makefile.in.in installed by \n# glib-gettextize.\ndnl\nglib_DEFUN([GLIB_GNU_GETTEXT],\n  [AC_REQUIRE([AC_PROG_CC])dnl\n   AC_REQUIRE([AC_HEADER_STDC])dnl\n   \n   GLIB_LC_MESSAGES\n   GLIB_WITH_NLS\n\n   if test \"$gt_cv_have_gettext\" = \"yes\"; then\n     if test \"x$ALL_LINGUAS\" = \"x\"; then\n       LINGUAS=\n     else\n       AC_MSG_CHECKING(for catalogs to be installed)\n       NEW_LINGUAS=\n       for presentlang in $ALL_LINGUAS; do\n         useit=no\n         if test \"%UNSET%\" != \"${LINGUAS-%UNSET%}\"; then\n           desiredlanguages=\"$LINGUAS\"\n         else\n           desiredlanguages=\"$ALL_LINGUAS\"\n         fi\n         for desiredlang in $desiredlanguages; do\n \t   # Use the presentlang catalog if desiredlang is\n           #   a. equal to presentlang, or\n           #   b. a variant of presentlang (because in this case,\n           #      presentlang can be used as a fallback for messages\n           #      which are not translated in the desiredlang catalog).\n           case \"$desiredlang\" in\n             \"$presentlang\"*) useit=yes;;\n           esac\n         done\n         if test $useit = yes; then\n           NEW_LINGUAS=\"$NEW_LINGUAS $presentlang\"\n         fi\n       done\n       LINGUAS=$NEW_LINGUAS\n       AC_MSG_RESULT($LINGUAS)\n     fi\n\n     dnl Construct list of names of catalog files to be constructed.\n     if test -n \"$LINGUAS\"; then\n       for lang in $LINGUAS; do CATALOGS=\"$CATALOGS $lang$CATOBJEXT\"; done\n     fi\n   fi\n\n   dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly\n   dnl find the mkinstalldirs script in another subdir but ($top_srcdir).\n   dnl Try to locate is.\n   MKINSTALLDIRS=\n   if test -n \"$ac_aux_dir\"; then\n     MKINSTALLDIRS=\"$ac_aux_dir/mkinstalldirs\"\n   fi\n   if test -z \"$MKINSTALLDIRS\"; then\n     MKINSTALLDIRS=\"\\$(top_srcdir)/mkinstalldirs\"\n   fi\n   AC_SUBST(MKINSTALLDIRS)\n\n   dnl Generate list of files to be processed by xgettext which will\n   dnl be included in po/Makefile.\n   test -d po || mkdir po\n   if test \"x$srcdir\" != \"x.\"; then\n     if test \"x`echo $srcdir | sed 's@/.*@@'`\" = \"x\"; then\n       posrcprefix=\"$srcdir/\"\n     else\n       posrcprefix=\"../$srcdir/\"\n     fi\n   else\n     posrcprefix=\"../\"\n   fi\n   rm -f po/POTFILES\n   sed -e \"/^#/d\" -e \"/^\\$/d\" -e \"s,.*,\t$posrcprefix& \\\\\\\\,\" -e \"\\$s/\\(.*\\) \\\\\\\\/\\1/\" \\\n\t< $srcdir/po/POTFILES.in > po/POTFILES\n  ])\n\n# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)\n# -------------------------------\n# Define VARIABLE to the location where catalog files will\n# be installed by po/Makefile.\nglib_DEFUN([GLIB_DEFINE_LOCALEDIR],\n[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl\nglib_save_prefix=\"$prefix\"\nglib_save_exec_prefix=\"$exec_prefix\"\nglib_save_datarootdir=\"$datarootdir\"\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\ntest \"x$exec_prefix\" = xNONE && exec_prefix=$prefix\ndatarootdir=`eval echo \"${datarootdir}\"`\nif test \"x$CATOBJEXT\" = \"x.mo\" ; then\n  localedir=`eval echo \"${libdir}/locale\"`\nelse\n  localedir=`eval echo \"${datadir}/locale\"`\nfi\nprefix=\"$glib_save_prefix\"\nexec_prefix=\"$glib_save_exec_prefix\"\ndatarootdir=\"$glib_save_datarootdir\"\nAC_DEFINE_UNQUOTED($1, \"$localedir\",\n  [Define the location where the catalogs will be installed])\n])\n\ndnl\ndnl Now the definitions that aclocal will find\ndnl\nifdef(glib_configure_ac,[],[\nAC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])\nAC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])\n])dnl\n\n# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL])\n# \n# Create a temporary file with TEST-FILE as its contents and pass the\n# file name to PROGRAM.  Perform ACTION-IF-PASS if PROGRAM exits with\n# 0 and perform ACTION-IF-FAIL for any other exit status.\nAC_DEFUN([GLIB_RUN_PROG],\n[cat >conftest.foo <<_ACEOF\n$2\n_ACEOF\nif AC_RUN_LOG([$1 conftest.foo]); then\n  m4_ifval([$3], [$3], [:])\nm4_ifvaln([$4], [else $4])dnl\necho \"$as_me: failed input was:\" >&AS_MESSAGE_LOG_FD\nsed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD\nfi])\n\n\n\ndnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml])\n# serial 42 IT_PROG_INTLTOOL\nAC_DEFUN([IT_PROG_INTLTOOL], [\nAC_PREREQ([2.50])dnl\nAC_REQUIRE([AM_NLS])dnl\n\ncase \"$am__api_version\" in\n    1.[01234])\n\tAC_MSG_ERROR([Automake 1.5 or newer is required to use intltool])\n    ;;\n    *)\n    ;;\nesac\n\nINTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`\nINTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d\" \" -f3`\nINTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`\nif test -n \"$1\"; then\n    AC_MSG_CHECKING([for intltool >= $1])\n    AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found])\n    test \"$INTLTOOL_APPLIED_VERSION_AS_INT\" -ge \"$INTLTOOL_REQUIRED_VERSION_AS_INT\" ||\n\tAC_MSG_ERROR([Your intltool is too old.  You need intltool $1 or later.])\nfi\n\nAC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update])\nAC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge])\nAC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract])\nif test -z \"$INTLTOOL_UPDATE\" -o -z \"$INTLTOOL_MERGE\" -o -z \"$INTLTOOL_EXTRACT\"; then\n    AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.])\nfi\n\nif test -z \"$AM_DEFAULT_VERBOSITY\"; then\n  AM_DEFAULT_VERBOSITY=1\nfi\nAC_SUBST([AM_DEFAULT_VERBOSITY])\n\nINTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))'\nINTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))'\nINTLTOOL__v_MERGE_0='@echo \"  ITMRG \" [$]@;'\nAC_SUBST(INTLTOOL_V_MERGE)\nAC_SUBST(INTLTOOL__v_MERGE_)\nAC_SUBST(INTLTOOL__v_MERGE_0)\n\nINTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))'\nintltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))'\nintltool__v_merge_options_0='-q'\nAC_SUBST(INTLTOOL_V_MERGE_OPTIONS)\nAC_SUBST(intltool__v_merge_options_)\nAC_SUBST(intltool__v_merge_options_0)\n\n  INTLTOOL_DESKTOP_RULE='%.desktop:   %.desktop.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \nINTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n     INTLTOOL_KEYS_RULE='%.keys:      %.keys.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n     INTLTOOL_PROP_RULE='%.prop:      %.prop.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n      INTLTOOL_OAF_RULE='%.oaf:       %.oaf.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@'\n     INTLTOOL_PONG_RULE='%.pong:      %.pong.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n   INTLTOOL_SERVER_RULE='%.server:    %.server.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n    INTLTOOL_SHEET_RULE='%.sheet:     %.sheet.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \nINTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n       INTLTOOL_UI_RULE='%.ui:        %.ui.in        $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n      INTLTOOL_XML_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \nif test \"$INTLTOOL_APPLIED_VERSION_AS_INT\" -ge 5000; then\n      INTLTOOL_XML_NOMERGE_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@'\nelse\n      INTLTOOL_XML_NOMERGE_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir'\nfi\n      INTLTOOL_XAM_RULE='%.xam:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n      INTLTOOL_KBD_RULE='%.kbd:       %.kbd.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n    INTLTOOL_CAVES_RULE='%.caves:     %.caves.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n  INTLTOOL_SCHEMAS_RULE='%.schemas:   %.schemas.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n    INTLTOOL_THEME_RULE='%.theme:     %.theme.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' \n    INTLTOOL_SERVICE_RULE='%.service: %.service.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'\n   INTLTOOL_POLICY_RULE='%.policy:    %.policy.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'\n\n_IT_SUBST(INTLTOOL_DESKTOP_RULE)\n_IT_SUBST(INTLTOOL_DIRECTORY_RULE)\n_IT_SUBST(INTLTOOL_KEYS_RULE)\n_IT_SUBST(INTLTOOL_PROP_RULE)\n_IT_SUBST(INTLTOOL_OAF_RULE)\n_IT_SUBST(INTLTOOL_PONG_RULE)\n_IT_SUBST(INTLTOOL_SERVER_RULE)\n_IT_SUBST(INTLTOOL_SHEET_RULE)\n_IT_SUBST(INTLTOOL_SOUNDLIST_RULE)\n_IT_SUBST(INTLTOOL_UI_RULE)\n_IT_SUBST(INTLTOOL_XAM_RULE)\n_IT_SUBST(INTLTOOL_KBD_RULE)\n_IT_SUBST(INTLTOOL_XML_RULE)\n_IT_SUBST(INTLTOOL_XML_NOMERGE_RULE)\n_IT_SUBST(INTLTOOL_CAVES_RULE)\n_IT_SUBST(INTLTOOL_SCHEMAS_RULE)\n_IT_SUBST(INTLTOOL_THEME_RULE)\n_IT_SUBST(INTLTOOL_SERVICE_RULE)\n_IT_SUBST(INTLTOOL_POLICY_RULE)\n\n# Check the gettext tools to make sure they are GNU\nAC_PATH_PROG(XGETTEXT, xgettext)\nAC_PATH_PROG(MSGMERGE, msgmerge)\nAC_PATH_PROG(MSGFMT, msgfmt)\nAC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)\nif test -z \"$XGETTEXT\" -o -z \"$MSGMERGE\" -o -z \"$MSGFMT\"; then\n    AC_MSG_ERROR([GNU gettext tools not found; required for intltool])\nfi\nxgversion=\"`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`\"\nmmversion=\"`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`\"\nmfversion=\"`$MSGFMT --version|grep '(GNU ' 2> /dev/null`\"\nif test -z \"$xgversion\" -o -z \"$mmversion\" -o -z \"$mfversion\"; then\n    AC_MSG_ERROR([GNU gettext tools not found; required for intltool])\nfi\n\nAC_PATH_PROG(INTLTOOL_PERL, perl)\nif test -z \"$INTLTOOL_PERL\"; then\n   AC_MSG_ERROR([perl not found])\nfi\nAC_MSG_CHECKING([for perl >= 5.8.1])\n$INTLTOOL_PERL -e \"use 5.8.1;\" > /dev/null 2>&1\nif test $? -ne 0; then\n   AC_MSG_ERROR([perl 5.8.1 is required for intltool])\nelse\n   IT_PERL_VERSION=`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`\n   AC_MSG_RESULT([$IT_PERL_VERSION])\nfi\nif test \"x$2\" != \"xno-xml\"; then\n   AC_MSG_CHECKING([for XML::Parser])\n   if `$INTLTOOL_PERL -e \"require XML::Parser\" 2>/dev/null`; then\n       AC_MSG_RESULT([ok])\n   else\n       AC_MSG_ERROR([XML::Parser perl module is required for intltool])\n   fi\nfi\n\n# Substitute ALL_LINGUAS so we can use it in po/Makefile\nAC_SUBST(ALL_LINGUAS)\n\n# Set DATADIRNAME correctly if it is not set yet\n# (copied from glib-gettext.m4)\nif test -z \"$DATADIRNAME\"; then\n  AC_LINK_IFELSE(\n    [AC_LANG_PROGRAM([[]],\n                     [[extern int _nl_msg_cat_cntr;\n                       return _nl_msg_cat_cntr]])],\n    [DATADIRNAME=share],\n    [case $host in\n    *-*-solaris*)\n    dnl On Solaris, if bind_textdomain_codeset is in libc,\n    dnl GNU format message catalog is always supported,\n    dnl since both are added to the libc all together.\n    dnl Hence, we'd like to go with DATADIRNAME=share\n    dnl in this case.\n    AC_CHECK_FUNC(bind_textdomain_codeset,\n      [DATADIRNAME=share], [DATADIRNAME=lib])\n    ;;\n    *)\n    [DATADIRNAME=lib]\n    ;;\n    esac])\nfi\nAC_SUBST(DATADIRNAME)\n\nIT_PO_SUBDIR([po])\n\n])\n\n\n# IT_PO_SUBDIR(DIRNAME)\n# ---------------------\n# All po subdirs have to be declared with this macro; the subdir \"po\" is\n# declared by IT_PROG_INTLTOOL.\n#\nAC_DEFUN([IT_PO_SUBDIR],\n[AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS.\ndnl\ndnl The following CONFIG_COMMANDS should be executed at the very end\ndnl of config.status.\nAC_CONFIG_COMMANDS_PRE([\n  AC_CONFIG_COMMANDS([$1/stamp-it], [\n    if [ ! grep \"^# INTLTOOL_MAKEFILE$\" \"$1/Makefile.in\" > /dev/null ]; then\n       AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.])\n    fi\n    rm -f \"$1/stamp-it\" \"$1/stamp-it.tmp\" \"$1/POTFILES\" \"$1/Makefile.tmp\"\n    >\"$1/stamp-it.tmp\"\n    [sed '/^#/d\n\t s/^[[].*] *//\n\t /^[ \t]*$/d\n\t'\"s|^|\t$ac_top_srcdir/|\" \\\n      \"$srcdir/$1/POTFILES.in\" | sed '$!s/$/ \\\\/' >\"$1/POTFILES\"\n    ]\n    [sed '/^POTFILES =/,/[^\\\\]$/ {\n\t\t/^POTFILES =/!d\n\t\tr $1/POTFILES\n\t  }\n\t ' \"$1/Makefile.in\" >\"$1/Makefile\"]\n    rm -f \"$1/Makefile.tmp\"\n    mv \"$1/stamp-it.tmp\" \"$1/stamp-it\"\n  ])\n])dnl\n])\n\n# _IT_SUBST(VARIABLE)\n# -------------------\n# Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST\n#\nAC_DEFUN([_IT_SUBST],\n[\nAC_SUBST([$1])\nm4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])])\n]\n)\n\n# deprecated macros\nAU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL])\n# A hint is needed for aclocal from Automake <= 1.9.4:\n# AC_DEFUN([AC_PROG_INTLTOOL], ...)\n\n\n# nls.m4 serial 5 (gettext-0.18)\ndnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation,\ndnl Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\ndnl\ndnl This file can can be used in projects which are not available under\ndnl the GNU General Public License or the GNU Library General Public\ndnl License but which still want to provide support for the GNU gettext\ndnl functionality.\ndnl Please note that the actual code of the GNU gettext library is covered\ndnl by the GNU Library General Public License, and the rest of the GNU\ndnl gettext package package is covered by the GNU General Public License.\ndnl They are *not* in the public domain.\n\ndnl Authors:\ndnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.\ndnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.\n\nAC_PREREQ([2.50])\n\nAC_DEFUN([AM_NLS],\n[\n  AC_MSG_CHECKING([whether NLS is requested])\n  dnl Default is enabled NLS\n  AC_ARG_ENABLE([nls],\n    [  --disable-nls           do not use Native Language Support],\n    USE_NLS=$enableval, USE_NLS=yes)\n  AC_MSG_RESULT([$USE_NLS])\n  AC_SUBST([USE_NLS])\n])\n\n# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-\n# serial 1 (pkg-config-0.24)\n# \n# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# PKG_PROG_PKG_CONFIG([MIN-VERSION])\n# ----------------------------------\nAC_DEFUN([PKG_PROG_PKG_CONFIG],\n[m4_pattern_forbid([^_?PKG_[A-Z_]+$])\nm4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])\nm4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])\nAC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])\nAC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])\nAC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])\n\nif test \"x$ac_cv_env_PKG_CONFIG_set\" != \"xset\"; then\n\tAC_PATH_TOOL([PKG_CONFIG], [pkg-config])\nfi\nif test -n \"$PKG_CONFIG\"; then\n\t_pkg_min_version=m4_default([$1], [0.9.0])\n\tAC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])\n\tif $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then\n\t\tAC_MSG_RESULT([yes])\n\telse\n\t\tAC_MSG_RESULT([no])\n\t\tPKG_CONFIG=\"\"\n\tfi\nfi[]dnl\n])# PKG_PROG_PKG_CONFIG\n\n# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])\n#\n# Check to see whether a particular set of modules exists.  Similar\n# to PKG_CHECK_MODULES(), but does not set variables or print errors.\n#\n# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])\n# only at the first occurence in configure.ac, so if the first place\n# it's called might be skipped (such as if it is within an \"if\", you\n# have to call PKG_CHECK_EXISTS manually\n# --------------------------------------------------------------\nAC_DEFUN([PKG_CHECK_EXISTS],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nif test -n \"$PKG_CONFIG\" && \\\n    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors \"$1\"]); then\n  m4_default([$2], [:])\nm4_ifvaln([$3], [else\n  $3])dnl\nfi])\n\n# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])\n# ---------------------------------------------\nm4_define([_PKG_CONFIG],\n[if test -n \"$$1\"; then\n    pkg_cv_[]$1=\"$$1\"\n elif test -n \"$PKG_CONFIG\"; then\n    PKG_CHECK_EXISTS([$3],\n                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 \"$3\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes ],\n\t\t     [pkg_failed=yes])\n else\n    pkg_failed=untried\nfi[]dnl\n])# _PKG_CONFIG\n\n# _PKG_SHORT_ERRORS_SUPPORTED\n# -----------------------------\nAC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi[]dnl\n])# _PKG_SHORT_ERRORS_SUPPORTED\n\n\n# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],\n# [ACTION-IF-NOT-FOUND])\n#\n#\n# Note that if there is a possibility the first call to\n# PKG_CHECK_MODULES might not happen, you should be sure to include an\n# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac\n#\n#\n# --------------------------------------------------------------\nAC_DEFUN([PKG_CHECK_MODULES],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nAC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl\nAC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl\n\npkg_failed=no\nAC_MSG_CHECKING([for $1])\n\n_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])\n_PKG_CONFIG([$1][_LIBS], [libs], [$2])\n\nm4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS\nand $1[]_LIBS to avoid the need to call pkg-config.\nSee the pkg-config man page for more details.])\n\nif test $pkg_failed = yes; then\n   \tAC_MSG_RESULT([no])\n        _PKG_SHORT_ERRORS_SUPPORTED\n        if test $_pkg_short_errors_supported = yes; then\n\t        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"$2\" 2>&1`\n        else \n\t        $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"$2\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$$1[]_PKG_ERRORS\" >&AS_MESSAGE_LOG_FD\n\n\tm4_default([$4], [AC_MSG_ERROR(\n[Package requirements ($2) were not met:\n\n$$1_PKG_ERRORS\n\nConsider adjusting the PKG_CONFIG_PATH environment variable if you\ninstalled software in a non-standard prefix.\n\n_PKG_TEXT])[]dnl\n        ])\nelif test $pkg_failed = untried; then\n     \tAC_MSG_RESULT([no])\n\tm4_default([$4], [AC_MSG_FAILURE(\n[The pkg-config script could not be found or is too old.  Make sure it\nis in your PATH or set the PKG_CONFIG environment variable to the full\npath to pkg-config.\n\n_PKG_TEXT\n\nTo get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl\n        ])\nelse\n\t$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS\n\t$1[]_LIBS=$pkg_cv_[]$1[]_LIBS\n        AC_MSG_RESULT([yes])\n\t$3\nfi[]dnl\n])# PKG_CHECK_MODULES\n\n# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software\n# Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_AUTOMAKE_VERSION(VERSION)\n# ----------------------------\n# Automake X.Y traces this macro to ensure aclocal.m4 has been\n# generated from the m4 files accompanying Automake X.Y.\n# (This private macro should not be called outside this file.)\nAC_DEFUN([AM_AUTOMAKE_VERSION],\n[am__api_version='1.11'\ndnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to\ndnl require some minimum version.  Point them to the right macro.\nm4_if([$1], [1.11.5], [],\n      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl\n])\n\n# _AM_AUTOCONF_VERSION(VERSION)\n# -----------------------------\n# aclocal traces this macro to find the Autoconf version.\n# This is a private macro too.  Using m4_define simplifies\n# the logic in aclocal, which can simply ignore this definition.\nm4_define([_AM_AUTOCONF_VERSION], [])\n\n# AM_SET_CURRENT_AUTOMAKE_VERSION\n# -------------------------------\n# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.\n# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.\nAC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],\n[AM_AUTOMAKE_VERSION([1.11.5])dnl\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\n_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])\n\n# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-\n\n# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets\n# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to\n# `$srcdir', `$srcdir/..', or `$srcdir/../..'.\n#\n# Of course, Automake must honor this variable whenever it calls a\n# tool from the auxiliary directory.  The problem is that $srcdir (and\n# therefore $ac_aux_dir as well) can be either absolute or relative,\n# depending on how configure is run.  This is pretty annoying, since\n# it makes $ac_aux_dir quite unusable in subdirectories: in the top\n# source directory, any form will work fine, but in subdirectories a\n# relative path needs to be adjusted first.\n#\n# $ac_aux_dir/missing\n#    fails when called from a subdirectory if $ac_aux_dir is relative\n# $top_srcdir/$ac_aux_dir/missing\n#    fails if $ac_aux_dir is absolute,\n#    fails when called from a subdirectory in a VPATH build with\n#          a relative $ac_aux_dir\n#\n# The reason of the latter failure is that $top_srcdir and $ac_aux_dir\n# are both prefixed by $srcdir.  In an in-source build this is usually\n# harmless because $srcdir is `.', but things will broke when you\n# start a VPATH build or use an absolute $srcdir.\n#\n# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,\n# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:\n#   am_aux_dir='\\$(top_srcdir)/'`expr \"$ac_aux_dir\" : \"$srcdir//*\\(.*\\)\"`\n# and then we would define $MISSING as\n#   MISSING=\"\\${SHELL} $am_aux_dir/missing\"\n# This will work as long as MISSING is not called from configure, because\n# unfortunately $(top_srcdir) has no meaning in configure.\n# However there are other variables, like CC, which are often used in\n# configure, and could therefore not use this \"fixed\" $ac_aux_dir.\n#\n# Another solution, used here, is to always expand $ac_aux_dir to an\n# absolute PATH.  The drawback is that using absolute paths prevent a\n# configured tree to be moved without reconfiguration.\n\nAC_DEFUN([AM_AUX_DIR_EXPAND],\n[dnl Rely on autoconf to set up CDPATH properly.\nAC_PREREQ([2.50])dnl\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n])\n\n# AM_CONDITIONAL                                            -*- Autoconf -*-\n\n# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 9\n\n# AM_CONDITIONAL(NAME, SHELL-CONDITION)\n# -------------------------------------\n# Define a conditional.\nAC_DEFUN([AM_CONDITIONAL],\n[AC_PREREQ(2.52)dnl\n ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],\n\t[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl\nAC_SUBST([$1_TRUE])dnl\nAC_SUBST([$1_FALSE])dnl\n_AM_SUBST_NOTMAKE([$1_TRUE])dnl\n_AM_SUBST_NOTMAKE([$1_FALSE])dnl\nm4_define([_AM_COND_VALUE_$1], [$2])dnl\nif $2; then\n  $1_TRUE=\n  $1_FALSE='#'\nelse\n  $1_TRUE='#'\n  $1_FALSE=\nfi\nAC_CONFIG_COMMANDS_PRE(\n[if test -z \"${$1_TRUE}\" && test -z \"${$1_FALSE}\"; then\n  AC_MSG_ERROR([[conditional \"$1\" was never defined.\nUsually this means the macro was only invoked conditionally.]])\nfi])])\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,\n# 2010, 2011 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 12\n\n# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be\n# written in clear, in which case automake, when reading aclocal.m4,\n# will think it sees a *use*, and therefore will trigger all it's\n# C support machinery.  Also note that it means that autoscan, seeing\n# CC etc. in the Makefile, will ask for an AC_PROG_CC use...\n\n\n# _AM_DEPENDENCIES(NAME)\n# ----------------------\n# See how the compiler implements dependency checking.\n# NAME is \"CC\", \"CXX\", \"GCJ\", or \"OBJC\".\n# We try a few techniques and use that to set a single cache variable.\n#\n# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was\n# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular\n# dependency, and given that the user is not expected to run this macro,\n# just rely on AC_PROG_CC.\nAC_DEFUN([_AM_DEPENDENCIES],\n[AC_REQUIRE([AM_SET_DEPDIR])dnl\nAC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl\nAC_REQUIRE([AM_MAKE_INCLUDE])dnl\nAC_REQUIRE([AM_DEP_TRACK])dnl\n\nifelse([$1], CC,   [depcc=\"$CC\"   am_compiler_list=],\n       [$1], CXX,  [depcc=\"$CXX\"  am_compiler_list=],\n       [$1], OBJC, [depcc=\"$OBJC\" am_compiler_list='gcc3 gcc'],\n       [$1], UPC,  [depcc=\"$UPC\"  am_compiler_list=],\n       [$1], GCJ,  [depcc=\"$GCJ\"  am_compiler_list='gcc3 gcc'],\n                   [depcc=\"$$1\"   am_compiler_list=])\n\nAC_CACHE_CHECK([dependency style of $depcc],\n               [am_cv_$1_dependencies_compiler_type],\n[if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_$1_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n ['s/^#*\\([a-zA-Z0-9]*\\))$/\\1/p'] < ./depcomp`\n  fi\n  am__universal=false\n  m4_case([$1], [CC],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac],\n    [CXX],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac])\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_$1_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_$1_dependencies_compiler_type=none\nfi\n])\nAC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])\nAM_CONDITIONAL([am__fastdep$1], [\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_$1_dependencies_compiler_type\" = gcc3])\n])\n\n\n# AM_SET_DEPDIR\n# -------------\n# Choose a directory name for dependency files.\n# This macro is AC_REQUIREd in _AM_DEPENDENCIES\nAC_DEFUN([AM_SET_DEPDIR],\n[AC_REQUIRE([AM_SET_LEADING_DOT])dnl\nAC_SUBST([DEPDIR], [\"${am__leading_dot}deps\"])dnl\n])\n\n\n# AM_DEP_TRACK\n# ------------\nAC_DEFUN([AM_DEP_TRACK],\n[AC_ARG_ENABLE(dependency-tracking,\n[  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors])\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\nAM_CONDITIONAL([AMDEP], [test \"x$enable_dependency_tracking\" != xno])\nAC_SUBST([AMDEPBACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl\nAC_SUBST([am__nodep])dnl\n_AM_SUBST_NOTMAKE([am__nodep])dnl\n])\n\n# Generate code to set up dependency tracking.              -*- Autoconf -*-\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n#serial 5\n\n# _AM_OUTPUT_DEPENDENCY_COMMANDS\n# ------------------------------\nAC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],\n[{\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`AS_DIRNAME(\"$mf\")`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`AS_DIRNAME([\"$file\"])`\n      AS_MKDIR_P([$dirpart/$fdir])\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n])# _AM_OUTPUT_DEPENDENCY_COMMANDS\n\n\n# AM_OUTPUT_DEPENDENCY_COMMANDS\n# -----------------------------\n# This macro should only be invoked once -- use via AC_REQUIRE.\n#\n# This code is only required when automatic dependency tracking\n# is enabled.  FIXME.  This creates each `.P' file that we will\n# need in order to bootstrap the dependency handling code.\nAC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],\n[AC_CONFIG_COMMANDS([depfiles],\n     [test x\"$AMDEP_TRUE\" != x\"\" || _AM_OUTPUT_DEPENDENCY_COMMANDS],\n     [AMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"])\n])\n\n# Do all the work for Automake.                             -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 16\n\n# This macro actually does too much.  Some checks are only needed if\n# your package does certain things.  But this isn't really a big deal.\n\n# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])\n# AM_INIT_AUTOMAKE([OPTIONS])\n# -----------------------------------------------\n# The call with PACKAGE and VERSION arguments is the old style\n# call (pre autoconf-2.50), which is being phased out.  PACKAGE\n# and VERSION should now be passed to AC_INIT and removed from\n# the call to AM_INIT_AUTOMAKE.\n# We support both call styles for the transition.  After\n# the next Automake release, Autoconf can make the AC_INIT\n# arguments mandatory, and then we can depend on a new Autoconf\n# release and drop the old call support.\nAC_DEFUN([AM_INIT_AUTOMAKE],\n[AC_PREREQ([2.62])dnl\ndnl Autoconf wants to disallow AM_ names.  We explicitly allow\ndnl the ones we care about.\nm4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl\nAC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl\nAC_REQUIRE([AC_PROG_INSTALL])dnl\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\nAC_SUBST([CYGPATH_W])\n\n# Define the identity of the package.\ndnl Distinguish between old-style and new-style calls.\nm4_ifval([$2],\n[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl\n AC_SUBST([PACKAGE], [$1])dnl\n AC_SUBST([VERSION], [$2])],\n[_AM_SET_OPTIONS([$1])dnl\ndnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.\nm4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,\n  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl\n AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl\n AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl\n\n_AM_IF_OPTION([no-define],,\n[AC_DEFINE_UNQUOTED(PACKAGE, \"$PACKAGE\", [Name of package])\n AC_DEFINE_UNQUOTED(VERSION, \"$VERSION\", [Version number of package])])dnl\n\n# Some tools Automake needs.\nAC_REQUIRE([AM_SANITY_CHECK])dnl\nAC_REQUIRE([AC_ARG_PROGRAM])dnl\nAM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})\nAM_MISSING_PROG(AUTOCONF, autoconf)\nAM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})\nAM_MISSING_PROG(AUTOHEADER, autoheader)\nAM_MISSING_PROG(MAKEINFO, makeinfo)\nAC_REQUIRE([AM_PROG_INSTALL_SH])dnl\nAC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl\nAC_REQUIRE([AM_PROG_MKDIR_P])dnl\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([AC_PROG_MAKE_SET])dnl\nAC_REQUIRE([AM_SET_LEADING_DOT])dnl\n_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],\n\t      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],\n\t\t\t     [_AM_PROG_TAR([v7])])])\n_AM_IF_OPTION([no-dependencies],,\n[AC_PROVIDE_IFELSE([AC_PROG_CC],\n\t\t  [_AM_DEPENDENCIES(CC)],\n\t\t  [define([AC_PROG_CC],\n\t\t\t  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_CXX],\n\t\t  [_AM_DEPENDENCIES(CXX)],\n\t\t  [define([AC_PROG_CXX],\n\t\t\t  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJC],\n\t\t  [_AM_DEPENDENCIES(OBJC)],\n\t\t  [define([AC_PROG_OBJC],\n\t\t\t  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl\n])\n_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl\ndnl The `parallel-tests' driver may need to know about EXEEXT, so add the\ndnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro\ndnl is hooked onto _AC_COMPILER_EXEEXT early, see below.\nAC_CONFIG_COMMANDS_PRE(dnl\n[m4_provide_if([_AM_COMPILER_EXEEXT],\n  [AM_CONDITIONAL([am__EXEEXT], [test -n \"$EXEEXT\"])])])dnl\n])\n\ndnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not\ndnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further\ndnl mangled by Autoconf and run in a shell conditional statement.\nm4_define([_AC_COMPILER_EXEEXT],\nm4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])\n\n\n# When config.status generates a header, we must update the stamp-h file.\n# This file resides in the same directory as the config header\n# that is generated.  The stamp files are numbered to have different names.\n\n# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the\n# loop where config.status creates the headers, so we can generate\n# our stamp files there.\nAC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],\n[# Compute $1's index in $config_headers.\n_am_arg=$1\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`AS_DIRNAME([\"$_am_arg\"])`/stamp-h[]$_am_stamp_count])\n\n# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,\n# Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_PROG_INSTALL_SH\n# ------------------\n# Define $install_sh.\nAC_DEFUN([AM_PROG_INSTALL_SH],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\nAC_SUBST(install_sh)])\n\n# Copyright (C) 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# Check whether the underlying file-system supports filenames\n# with a leading dot.  For instance MS-DOS doesn't.\nAC_DEFUN([AM_SET_LEADING_DOT],\n[rm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\nAC_SUBST([am__leading_dot])])\n\n# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-\n# From Jim Meyering\n\n# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,\n# 2011 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 5\n\n# AM_MAINTAINER_MODE([DEFAULT-MODE])\n# ----------------------------------\n# Control maintainer-specific portions of Makefiles.\n# Default is to disable them, unless `enable' is passed literally.\n# For symmetry, `disable' may be passed as well.  Anyway, the user\n# can override the default with the --enable/--disable switch.\nAC_DEFUN([AM_MAINTAINER_MODE],\n[m4_case(m4_default([$1], [disable]),\n       [enable], [m4_define([am_maintainer_other], [disable])],\n       [disable], [m4_define([am_maintainer_other], [enable])],\n       [m4_define([am_maintainer_other], [enable])\n        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])\nAC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])\n  dnl maintainer-mode's default is 'disable' unless 'enable' is passed\n  AC_ARG_ENABLE([maintainer-mode],\n[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful\n\t\t\t  (and sometimes confusing) to the casual installer],\n      [USE_MAINTAINER_MODE=$enableval],\n      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))\n  AC_MSG_RESULT([$USE_MAINTAINER_MODE])\n  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])\n  MAINT=$MAINTAINER_MODE_TRUE\n  AC_SUBST([MAINT])dnl\n]\n)\n\nAU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])\n\n# Check to see how 'make' treats includes.\t            -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 4\n\n# AM_MAKE_INCLUDE()\n# -----------------\n# Check to see how make treats includes.\nAC_DEFUN([AM_MAKE_INCLUDE],\n[am_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\nAC_MSG_CHECKING([for style of include used by $am_make])\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\nAC_SUBST([am__include])\nAC_SUBST([am__quote])\nAC_MSG_RESULT([$_am_result])\nrm -f confinc confmf\n])\n\n# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-\n\n# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 6\n\n# AM_MISSING_PROG(NAME, PROGRAM)\n# ------------------------------\nAC_DEFUN([AM_MISSING_PROG],\n[AC_REQUIRE([AM_MISSING_HAS_RUN])\n$1=${$1-\"${am_missing_run}$2\"}\nAC_SUBST($1)])\n\n\n# AM_MISSING_HAS_RUN\n# ------------------\n# Define MISSING if not defined so far and test if it supports --run.\n# If it does, set am_missing_run to use it, otherwise, to nothing.\nAC_DEFUN([AM_MISSING_HAS_RUN],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([missing])dnl\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  AC_MSG_WARN([`missing' script is too old or missing])\nfi\n])\n\n# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,\n# Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_PROG_MKDIR_P\n# ---------------\n# Check for `mkdir -p'.\nAC_DEFUN([AM_PROG_MKDIR_P],\n[AC_PREREQ([2.60])dnl\nAC_REQUIRE([AC_PROG_MKDIR_P])dnl\ndnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,\ndnl while keeping a definition of mkdir_p for backward compatibility.\ndnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.\ndnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of\ndnl Makefile.ins that do not define MKDIR_P, so we do our own\ndnl adjustment using top_builddir (which is defined more often than\ndnl MKDIR_P).\nAC_SUBST([mkdir_p], [\"$MKDIR_P\"])dnl\ncase $mkdir_p in\n  [[\\\\/$]]* | ?:[[\\\\/]]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n])\n\n# Helper functions for option handling.                     -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software\n# Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 5\n\n# _AM_MANGLE_OPTION(NAME)\n# -----------------------\nAC_DEFUN([_AM_MANGLE_OPTION],\n[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])\n\n# _AM_SET_OPTION(NAME)\n# --------------------\n# Set option NAME.  Presently that only means defining a flag for this option.\nAC_DEFUN([_AM_SET_OPTION],\n[m4_define(_AM_MANGLE_OPTION([$1]), 1)])\n\n# _AM_SET_OPTIONS(OPTIONS)\n# ------------------------\n# OPTIONS is a space-separated list of Automake options.\nAC_DEFUN([_AM_SET_OPTIONS],\n[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])\n\n# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])\n# -------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nAC_DEFUN([_AM_IF_OPTION],\n[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])\n\n# Check to make sure that the build environment is sane.    -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 5\n\n# AM_SANITY_CHECK\n# ---------------\nAC_DEFUN([AM_SANITY_CHECK],\n[AC_MSG_CHECKING([whether build environment is sane])\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]]*)\n    AC_MSG_ERROR([unsafe absolute working directory name]);;\nesac\ncase $srcdir in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]]*)\n    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$[*]\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$[*]\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$[*]\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken\nalias in your environment])\n   fi\n\n   test \"$[2]\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   AC_MSG_ERROR([newly created file is older than distributed files!\nCheck your system clock])\nfi\nAC_MSG_RESULT(yes)])\n\n# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 1\n\n# AM_PROG_INSTALL_STRIP\n# ---------------------\n# One issue with vendor `install' (even GNU) is that you can't\n# specify the program used to strip binaries.  This is especially\n# annoying in cross-compiling environments, where the build's strip\n# is unlikely to handle the host's binaries.\n# Fortunately install-sh will honor a STRIPPROG variable, so we\n# always use install-sh in `make install-strip', and initialize\n# STRIPPROG with the value of the STRIP variable (set by the user).\nAC_DEFUN([AM_PROG_INSTALL_STRIP],\n[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\ndnl Don't test for $cross_compiling = yes, because it might be `maybe'.\nif test \"$cross_compiling\" != no; then\n  AC_CHECK_TOOL([STRIP], [strip], :)\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\nAC_SUBST([INSTALL_STRIP_PROGRAM])])\n\n# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 3\n\n# _AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.\n# This macro is traced by Automake.\nAC_DEFUN([_AM_SUBST_NOTMAKE])\n\n# AM_SUBST_NOTMAKE(VARIABLE)\n# --------------------------\n# Public sister of _AM_SUBST_NOTMAKE.\nAC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])\n\n# Check how to create a tarball.                            -*- Autoconf -*-\n\n# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# _AM_PROG_TAR(FORMAT)\n# --------------------\n# Check how to create a tarball in format FORMAT.\n# FORMAT should be one of `v7', `ustar', or `pax'.\n#\n# Substitute a variable $(am__tar) that is a command\n# writing to stdout a FORMAT-tarball containing the directory\n# $tardir.\n#     tardir=directory && $(am__tar) > result.tar\n#\n# Substitute a variable $(am__untar) that extract such\n# a tarball read from stdin.\n#     $(am__untar) < result.tar\nAC_DEFUN([_AM_PROG_TAR],\n[# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAC_SUBST([AMTAR], ['$${TAR-tar}'])\nm4_if([$1], [v7],\n     [am__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'],\n     [m4_case([$1], [ustar],, [pax],,\n              [m4_fatal([Unknown tar format])])\nAC_MSG_CHECKING([how to create a $1 tar archive])\n# Loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'\n_am_tools=${am_cv_prog_tar_$1-$_am_tools}\n# Do not fold the above two line into one, because Tru64 sh and\n# Solaris sh will not grok spaces in the rhs of `-'.\nfor _am_tool in $_am_tools\ndo\n  case $_am_tool in\n  gnutar)\n    for _am_tar in tar gnutar gtar;\n    do\n      AM_RUN_LOG([$_am_tar --version]) && break\n    done\n    am__tar=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$$tardir\"'\n    am__tar_=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$tardir\"'\n    am__untar=\"$_am_tar -xf -\"\n    ;;\n  plaintar)\n    # Must skip GNU tar: if it does not support --format= it doesn't create\n    # ustar tarball either.\n    (tar --version) >/dev/null 2>&1 && continue\n    am__tar='tar chf - \"$$tardir\"'\n    am__tar_='tar chf - \"$tardir\"'\n    am__untar='tar xf -'\n    ;;\n  pax)\n    am__tar='pax -L -x $1 -w \"$$tardir\"'\n    am__tar_='pax -L -x $1 -w \"$tardir\"'\n    am__untar='pax -r'\n    ;;\n  cpio)\n    am__tar='find \"$$tardir\" -print | cpio -o -H $1 -L'\n    am__tar_='find \"$tardir\" -print | cpio -o -H $1 -L'\n    am__untar='cpio -i -H $1 -d'\n    ;;\n  none)\n    am__tar=false\n    am__tar_=false\n    am__untar=false\n    ;;\n  esac\n\n  # If the value was cached, stop now.  We just wanted to have am__tar\n  # and am__untar set.\n  test -n \"${am_cv_prog_tar_$1}\" && break\n\n  # tar/untar a dummy directory, and stop if the command works\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  echo GrepMe > conftest.dir/file\n  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])\n  rm -rf conftest.dir\n  if test -s conftest.tar; then\n    AM_RUN_LOG([$am__untar <conftest.tar])\n    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n  fi\ndone\nrm -rf conftest.dir\n\nAC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])\nAC_MSG_RESULT([$am_cv_prog_tar_$1])])\nAC_SUBST([am__tar])\nAC_SUBST([am__untar])\n]) # _AM_PROG_TAR\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/autogen.sh",
    "content": "#!/bin/sh\n# intltoolize is optionnal as it's only required for the gtk-glade UI.\n\nif test ! \"x$(which intltoolize)\" = \"x\"; then\n  echo \"Running intltoolize\"\n  intltoolize --copy --force --automake\nelse\n  if test ! \"x$(which gintltoolize)\" = \"x\"; then\n    echo \"Running gintltoolize\"\n    gintltoolize --copy --force --automake\n  fi\nfi\n\nautoreconf --install --force --verbose\n"
  },
  {
    "path": "app/src/main/jni/desmume/compile",
    "content": "#! /bin/sh\n# Wrapper for compilers which do not understand `-c -o'.\n\nscriptversion=2005-05-14.22\n\n# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.\n# Written by Tom Tromey <tromey@cygnus.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try \\`$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: compile [--help] [--version] PROGRAM [ARGS]\n\nWrapper for compilers which do not understand `-c -o'.\nRemove `-o dest.o' from ARGS, run PROGRAM with the remaining\narguments, and rename the output as expected.\n\nIf you are trying to build a whole package this is not the\nright script to run: please start by reading the file `INSTALL'.\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"compile $scriptversion\"\n    exit $?\n    ;;\nesac\n\nofile=\ncfile=\neat=\n\nfor arg\ndo\n  if test -n \"$eat\"; then\n    eat=\n  else\n    case $1 in\n      -o)\n\t# configure might choose to run compile as `compile cc -o foo foo.c'.\n\t# So we strip `-o arg' only if arg is an object.\n\teat=1\n\tcase $2 in\n\t  *.o | *.obj)\n\t    ofile=$2\n\t    ;;\n\t  *)\n\t    set x \"$@\" -o \"$2\"\n\t    shift\n\t    ;;\n\tesac\n\t;;\n      *.c)\n\tcfile=$1\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n      *)\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n    esac\n  fi\n  shift\ndone\n\nif test -z \"$ofile\" || test -z \"$cfile\"; then\n  # If no `-o' option was seen then we might have been invoked from a\n  # pattern rule where we don't need one.  That is ok -- this is a\n  # normal compilation that the losing compiler can handle.  If no\n  # `.c' file was seen then we are probably linking.  That is also\n  # ok.\n  exec \"$@\"\nfi\n\n# Name of file we expect compiler to create.\ncofile=`echo \"$cfile\" | sed -e 's|^.*/||' -e 's/\\.c$/.o/'`\n\n# Create the lock directory.\n# Note: use `[/.-]' here to ensure that we don't use the same name\n# that we are using for the .o file.  Also, base the name on the expected\n# object file name, since that is what matters with a parallel build.\nlockdir=`echo \"$cofile\" | sed -e 's|[/.-]|_|g'`.d\nwhile true; do\n  if mkdir \"$lockdir\" >/dev/null 2>&1; then\n    break\n  fi\n  sleep 1\ndone\n# FIXME: race condition here if user kills between mkdir and trap.\ntrap \"rmdir '$lockdir'; exit 1\" 1 2 15\n\n# Run the compile.\n\"$@\"\nret=$?\n\nif test -f \"$cofile\"; then\n  mv \"$cofile\" \"$ofile\"\nelif test -f \"${cofile}bj\"; then\n  mv \"${cofile}bj\" \"$ofile\"\nfi\n\nrmdir \"$lockdir\"\nexit $ret\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-end: \"$\"\n# End:\n"
  },
  {
    "path": "app/src/main/jni/desmume/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n#   2011, 2012 Free Software Foundation, Inc.\n\ntimestamp='2012-02-10'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Originally written by Per Bothner.  Please send patches (context\n# diff format) to <config-patches@gnu.org> and include a ChangeLog\n# entry.\n#\n# This script attempts to guess a canonical system name similar to\n# config.sub.  If it succeeds, it prints the system name on stdout, and\n# exits with 0.  Otherwise, it exits with 1.\n#\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,\n2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\ntrap 'exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\nset_cc_for_build='\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\n: ${TMPDIR=/tmp} ;\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\ndummy=$tmp/dummy ;\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int x;\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac ; set_cc_for_build= ;'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep -q __ELF__\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t\tos=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase \"${UNAME_VERSION}\" in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit ;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}\n\texit ;;\n    *:ekkoBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}\n\texit ;;\n    *:SolidBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}\n\texit ;;\n    macppc:MirBSD:*:*)\n\techo powerpc-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    *:MirBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    alpha:OSF1:*:*)\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase \"$ALPHA_CPU_TYPE\" in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=\"alphaev5\" ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=\"alphaev56\" ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca56\" ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca57\" ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=\"alphaev6\" ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=\"alphaev67\" ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=\"alphaev69\" ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=\"alphaev7\" ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=\"alphaev79\" ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\t# Reset EXIT trap before exiting to avoid spurious non-zero exit code.\n\texitcode=$?\n\ttrap '' 0\n\texit $exitcode ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit ;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit ;;\n    *:z/VM:*:*)\n\techo s390-ibm-zvmoe\n\texit ;;\n    *:OS400:*:*)\n\techo powerpc-ibm-os400\n\texit ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit ;;\n    arm:riscos:*:*|arm:RISCOS:*:*)\n\techo arm-unknown-riscos\n\texit ;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit ;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit ;;\n    DRS?6000:unix:4.0:6*)\n\techo sparc-icl-nx6\n\texit ;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) echo sparc-icl-nx7; exit ;;\n\tesac ;;\n    s390x:SunOS:*:*)\n\techo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)\n\techo i386-pc-auroraux${UNAME_RELEASE}\n\texit ;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\teval $set_cc_for_build\n\tSUN_ARCH=\"i386\"\n\t# If there is a compiler, see if it is configured for 64-bit objects.\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\n\t# This test works for both compilers.\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tSUN_ARCH=\"x86_64\"\n\t    fi\n\tfi\n\techo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n\techo m68k-milan-mint${UNAME_RELEASE}\n\texit ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n\techo m68k-hades-mint${UNAME_RELEASE}\n\texit ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n\techo m68k-unknown-mint${UNAME_RELEASE}\n\texit ;;\n    m68k:machten:*:*)\n\techo m68k-apple-machten${UNAME_RELEASE}\n\texit ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c &&\n\t  dummyarg=`echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`$dummy $dummyarg` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit ;;\n    Motorola:*:4.3:PL8-*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit ;;\n    AViiON:dgux:*:*)\n\t# DG/UX returns AViiON for all architectures\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n\texit ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`\n\t\tthen\n\t\t\techo \"$SYSTEM_NAME\"\n\t\telse\n\t\t\techo rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit ;;\n    *:AIX:*:[4567])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit ;;                             # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n\t\t    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n\t\t    case \"${sc_cpu_version}\" in\n\t\t      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n\t\t      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n\t\t      532)                      # CPU_PA_RISC2_0\n\t\t\tcase \"${sc_kernel_bits}\" in\n\t\t\t  32) HP_ARCH=\"hppa2.0n\" ;;\n\t\t\t  64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n\t\t\tesac ;;\n\t\t    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^\t\t//' << EOF >$dummy.c\n\n\t\t#define _HPUX_SOURCE\n\t\t#include <stdlib.h>\n\t\t#include <unistd.h>\n\n\t\tint main ()\n\t\t{\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t    long bits = sysconf(_SC_KERNEL_BITS);\n\t\t#endif\n\t\t    long cpu  = sysconf (_SC_CPU_VERSION);\n\n\t\t    switch (cpu)\n\t\t\t{\n\t\t\tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n\t\t\tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n\t\t\tcase CPU_PA_RISC2_0:\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t\t    switch (bits)\n\t\t\t\t{\n\t\t\t\tcase 64: puts (\"hppa2.0w\"); break;\n\t\t\t\tcase 32: puts (\"hppa2.0n\"); break;\n\t\t\t\tdefault: puts (\"hppa2.0\"); break;\n\t\t\t\t} break;\n\t\t#else  /* !defined(_SC_KERNEL_BITS) */\n\t\t\t    puts (\"hppa2.0\"); break;\n\t\t#endif\n\t\t\tdefault: puts (\"hppa1.0\"); break;\n\t\t\t}\n\t\t    exit (0);\n\t\t}\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif [ ${HP_ARCH} = \"hppa2.0w\" ]\n\tthen\n\t    eval $set_cc_for_build\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep -q __LP64__\n\t    then\n\t\tHP_ARCH=\"hppa2.0w\"\n\t    else\n\t\tHP_ARCH=\"hppa64\"\n\t    fi\n\tfi\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\techo unknown-hitachi-hiuxwe2\n\texit ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n\texit ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n\texit ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n\texit ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n\texit ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    *:UNICOS/mp:*:*)\n\techo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n\techo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    5000:UNIX_System_V:4.*:*)\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`\n\techo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:FreeBSD:*:*)\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tcase ${UNAME_PROCESSOR} in\n\t    amd64)\n\t\techo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    *)\n\t\techo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\tesac\n\texit ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit ;;\n    *:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit ;;\n    i*:MSYS*:*)\n\techo ${UNAME_MACHINE}-pc-msys\n\texit ;;\n    i*:windows32*:*)\n\t# uname -m includes \"-pc\" on this system.\n\techo ${UNAME_MACHINE}-mingw32\n\texit ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit ;;\n    *:Interix*:*)\n\tcase ${UNAME_MACHINE} in\n\t    x86)\n\t\techo i586-pc-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    authenticamd | genuineintel | EM64T)\n\t\techo x86_64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    IA64)\n\t\techo ia64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\tesac ;;\n    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)\n\techo i${UNAME_MACHINE}-pc-mks\n\texit ;;\n    8664:Windows_NT:*)\n\techo x86_64-pc-mks\n\texit ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i586-pc-interix\n\texit ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit ;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\techo x86_64-unknown-cygwin\n\texit ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    *:GNU:*:*)\n\t# the GNU system\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit ;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\techo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu\n\texit ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit ;;\n    aarch64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    aarch64_be:Linux:*:*)\n\tUNAME_MACHINE=aarch64_be\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n\tesac\n\tobjdump --private-headers /bin/sh | grep -q ld.so.1\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\n\texit ;;\n    arm*:Linux:*:*)\n\teval $set_cc_for_build\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_EABI__\n\tthen\n\t    echo ${UNAME_MACHINE}-unknown-linux-gnu\n\telse\n\t    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t| grep -q __ARM_PCS_VFP\n\t    then\n\t\techo ${UNAME_MACHINE}-unknown-linux-gnueabi\n\t    else\n\t\techo ${UNAME_MACHINE}-unknown-linux-gnueabihf\n\t    fi\n\tfi\n\texit ;;\n    avr32*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    cris:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-gnu\n\texit ;;\n    crisv32:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-gnu\n\texit ;;\n    frv:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    hexagon:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    i*86:Linux:*:*)\n\tLIBC=gnu\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#ifdef __dietlibc__\n\tLIBC=dietlibc\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`\n\techo \"${UNAME_MACHINE}-pc-linux-${LIBC}\"\n\texit ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m32r*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    mips:Linux:*:* | mips64:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef ${UNAME_MACHINE}\n\t#undef ${UNAME_MACHINE}el\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=${UNAME_MACHINE}el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=${UNAME_MACHINE}\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-gnu\"; exit; }\n\t;;\n    or32:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    padre:Linux:*:*)\n\techo sparc-unknown-linux-gnu\n\texit ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-gnu\n\texit ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\n\t  *)    echo hppa-unknown-linux-gnu ;;\n\tesac\n\texit ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-gnu\n\texit ;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-gnu\n\texit ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux\n\texit ;;\n    sh64*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    tile*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    vax:Linux:*:*)\n\techo ${UNAME_MACHINE}-dec-linux-gnu\n\texit ;;\n    x86_64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    xtensa*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n\t# Unixware is an offshoot of SVR4, but it has its own version\n\t# number series starting with 2...\n\t# I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n\t# Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit ;;\n    i*86:syllable:*:*)\n\techo ${UNAME_MACHINE}-pc-syllable\n\texit ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit ;;\n    i*86:*:5:[678]*)\n\t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n\t# uname -m prints for DJGPP always 'pc', but it prints nothing about\n\t# the processor, so we play safe by assuming i586.\n\t# Note: whatever this is, it MUST be the same as what config.sub\n\t# prints for the \"djgpp\" host, or else GDB configury will decide that\n\t# this is a cross-build.\n\techo i586-pc-msdosdjgpp\n\texit ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit ;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\techo m68k-convergent-sysv\n\texit ;;\n    M680?0:D-NIX:5.3:*)\n\techo m68k-diab-dnix\n\texit ;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4; exit; } ;;\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\n\tOS_REL='.3'\n\ttest -r /etc/.relid \\\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit ;;\n    PENTIUM:*:4.0*:*)\t# Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n\t\t\t# says <Richard.M.Bartel@ccMail.Census.GOV>\n\techo i586-unisys-sysv4\n\texit ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit ;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo ${UNAME_MACHINE}-stratus-vos\n\texit ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t\techo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t\techo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n\texit ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit ;;\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\n\techo i586-pc-haiku\n\texit ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-6:SUPER-UX:*:*)\n\techo sx6-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-7:SUPER-UX:*:*)\n\techo sx7-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8:SUPER-UX:*:*)\n\techo sx8-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8R:SUPER-UX:*:*)\n\techo sx8r-nec-superux${UNAME_RELEASE}\n\texit ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\n\tcase $UNAME_PROCESSOR in\n\t    i386)\n\t\teval $set_cc_for_build\n\t\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t\t  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\t      grep IS_64BIT_ARCH >/dev/null\n\t\t  then\n\t\t      UNAME_PROCESSOR=\"x86_64\"\n\t\t  fi\n\t\tfi ;;\n\t    unknown) UNAME_PROCESSOR=powerpc ;;\n\tesac\n\techo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}\n\texit ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit ;;\n    NEO-?:NONSTOP_KERNEL:*:*)\n\techo neo-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSE-?:NONSTOP_KERNEL:*:*)\n\techo nse-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSR-?:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit ;;\n    SEI:*:*:SEIUX)\n\techo mips-sei-seiux${UNAME_RELEASE}\n\texit ;;\n    *:DragonFly:*:*)\n\techo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit ;;\n    *:*VMS:*:*)\n\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase \"${UNAME_MACHINE}\" in\n\t    A*) echo alpha-dec-vms ; exit ;;\n\t    I*) echo ia64-dec-vms ; exit ;;\n\t    V*) echo vax-dec-vms ; exit ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\techo i386-pc-xenix\n\texit ;;\n    i*86:skyos:*:*)\n\techo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'\n\texit ;;\n    i*86:rdos:*:*)\n\techo ${UNAME_MACHINE}-pc-rdos\n\texit ;;\n    i*86:AROS:*:*)\n\techo ${UNAME_MACHINE}-pc-aros\n\texit ;;\n    x86_64:VMkernel:*:*)\n\techo ${UNAME_MACHINE}-unknown-esx\n\texit ;;\nesac\n\n#echo '(No uname command or uname output not recognized.)' 1>&2\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n\t\"4\"\n#else\n\t\"\"\n#endif\n\t); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\\n\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&\n\t{ echo \"$SYSTEM_NAME\"; exit; }\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    c34*)\n\techo c34-convex-bsd\n\texit ;;\n    c38*)\n\techo c38-convex-bsd\n\texit ;;\n    c4*)\n\techo c4-convex-bsd\n\texit ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\nand\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "app/src/main/jni/desmume/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n#   2011, 2012 Free Software Foundation, Inc.\n\ntimestamp='2012-02-10'\n\n# This file is (in principle) common to ALL GNU software.\n# The presence of a machine in this file suggests that SOME GNU software\n# can handle that machine.  It does not imply ALL GNU software can.\n#\n# This file is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted GNU ChangeLog entry.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,\n2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \\\n  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \\\n  knetbsd*-gnu* | netbsd*-gnu* | \\\n  kopensolaris*-gnu* | \\\n  storm-chaos* | os2-emx* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  android-linux)\n    os=-linux-android\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`-unknown\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis | -knuth | -cray | -microblaze)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-bluegene*)\n\t\tos=-cnk\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusrdb)\n\t\tos=-chorusrdb\n\t\tbasic_machine=$1\n\t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco6)\n\t\tos=-sco5v6\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| aarch64 | aarch64_be \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| am33_2.0 \\\n\t| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \\\n        | be32 | be64 \\\n\t| bfin \\\n\t| c4x | clipper \\\n\t| d10v | d30v | dlx | dsp16xx \\\n\t| epiphany \\\n\t| fido | fr30 | frv \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| hexagon \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| ip2k | iq2000 \\\n\t| le32 | le64 \\\n\t| lm32 \\\n\t| m32c | m32r | m32rle | m68000 | m68k | m88k \\\n\t| maxq | mb | microblaze | mcore | mep | metag \\\n\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t| mips16 \\\n\t| mips64 | mips64el \\\n\t| mips64octeon | mips64octeonel \\\n\t| mips64orion | mips64orionel \\\n\t| mips64r5900 | mips64r5900el \\\n\t| mips64vr | mips64vrel \\\n\t| mips64vr4100 | mips64vr4100el \\\n\t| mips64vr4300 | mips64vr4300el \\\n\t| mips64vr5000 | mips64vr5000el \\\n\t| mips64vr5900 | mips64vr5900el \\\n\t| mipsisa32 | mipsisa32el \\\n\t| mipsisa32r2 | mipsisa32r2el \\\n\t| mipsisa64 | mipsisa64el \\\n\t| mipsisa64r2 | mipsisa64r2el \\\n\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t| mipstx39 | mipstx39el \\\n\t| mn10200 | mn10300 \\\n\t| moxie \\\n\t| mt \\\n\t| msp430 \\\n\t| nds32 | nds32le | nds32be \\\n\t| nios | nios2 \\\n\t| ns16k | ns32k \\\n\t| open8 \\\n\t| or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle \\\n\t| pyramid \\\n\t| rl78 | rx \\\n\t| score \\\n\t| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \\\n\t| sh64 | sh64le \\\n\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \\\n\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v \\\n\t| spu \\\n\t| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \\\n\t| ubicom32 \\\n\t| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \\\n\t| we32k \\\n\t| x86 | xc16x | xstormy16 | xtensa \\\n\t| z8k | z80)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tc54x)\n\t\tbasic_machine=tic54x-unknown\n\t\t;;\n\tc55x)\n\t\tbasic_machine=tic55x-unknown\n\t\t;;\n\tc6x)\n\t\tbasic_machine=tic6x-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\tms1)\n\t\tbasic_machine=mt-unknown\n\t\t;;\n\n\tstrongarm | thumb | xscale)\n\t\tbasic_machine=arm-unknown\n\t\t;;\n\txgate)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\txscaleeb)\n\t\tbasic_machine=armeb-unknown\n\t\t;;\n\n\txscaleel)\n\t\tbasic_machine=armel-unknown\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| aarch64-* | aarch64_be-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \\\n\t| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \\\n\t| avr-* | avr32-* \\\n\t| be32-* | be64-* \\\n\t| bfin-* | bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c4x-* \\\n\t| clipper-* | craynv-* | cydra-* \\\n\t| d10v-* | d30v-* | dlx-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| hexagon-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| ip2k-* | iq2000-* \\\n\t| le32-* | le64-* \\\n\t| lm32-* \\\n\t| m32c-* | m32r-* | m32rle-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \\\n\t| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \\\n\t| mips16-* \\\n\t| mips64-* | mips64el-* \\\n\t| mips64octeon-* | mips64octeonel-* \\\n\t| mips64orion-* | mips64orionel-* \\\n\t| mips64r5900-* | mips64r5900el-* \\\n\t| mips64vr-* | mips64vrel-* \\\n\t| mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* \\\n\t| mips64vr5000-* | mips64vr5000el-* \\\n\t| mips64vr5900-* | mips64vr5900el-* \\\n\t| mipsisa32-* | mipsisa32el-* \\\n\t| mipsisa32r2-* | mipsisa32r2el-* \\\n\t| mipsisa64-* | mipsisa64el-* \\\n\t| mipsisa64r2-* | mipsisa64r2el-* \\\n\t| mipsisa64sb1-* | mipsisa64sb1el-* \\\n\t| mipsisa64sr71k-* | mipsisa64sr71kel-* \\\n\t| mipstx39-* | mipstx39el-* \\\n\t| mmix-* \\\n\t| mt-* \\\n\t| msp430-* \\\n\t| nds32-* | nds32le-* | nds32be-* \\\n\t| nios-* | nios2-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| open8-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \\\n\t| pyramid-* \\\n\t| rl78-* | romp-* | rs6000-* | rx-* \\\n\t| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \\\n\t| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \\\n\t| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \\\n\t| sparclite-* \\\n\t| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \\\n\t| tahoe-* \\\n\t| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \\\n\t| tile*-* \\\n\t| tron-* \\\n\t| ubicom32-* \\\n\t| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \\\n\t| vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xc16x-* | xps100-* \\\n\t| xstormy16-* | xtensa*-* \\\n\t| ymp-* \\\n\t| z8k-* | z80-*)\n\t\t;;\n\t# Recognize the basic CPU types without company name, with glob match.\n\txtensa*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tabacus)\n\t\tbasic_machine=abacus-unknown\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamd64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\tamd64-*)\n\t\tbasic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taros)\n\t\tbasic_machine=i386-pc\n\t\tos=-aros\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tblackfin)\n\t\tbasic_machine=bfin-unknown\n\t\tos=-linux\n\t\t;;\n\tblackfin-*)\n\t\tbasic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tbluegene*)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-cnk\n\t\t;;\n\tc54x-*)\n\t\tbasic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc55x-*)\n\t\tbasic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc6x-*)\n\t\tbasic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tcegcc)\n\t\tbasic_machine=arm-unknown\n\t\tos=-cegcc\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcraynv)\n\t\tbasic_machine=craynv-cray\n\t\tos=-unicosmp\n\t\t;;\n\tcr16 | cr16-*)\n\t\tbasic_machine=cr16-unknown\n\t\tos=-elf\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcrisv32 | crisv32-* | etraxfs*)\n\t\tbasic_machine=crisv32-axis\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tcrx)\n\t\tbasic_machine=crx-unknown\n\t\tos=-elf\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdicos)\n\t\tbasic_machine=i686-pc\n\t\tos=-dicos\n\t\t;;\n\tdjgpp)\n\t\tbasic_machine=i586-pc\n\t\tos=-msdosdjgpp\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm68knommu)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-linux\n\t\t;;\n\tm68knommu-*)\n\t\tbasic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmicroblaze)\n\t\tbasic_machine=microblaze-xilinx\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i386-pc\n\t\tos=-mingw32\n\t\t;;\n\tmingw32ce)\n\t\tbasic_machine=arm-unknown\n\t\tos=-mingw32ce\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tms1-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`\n\t\t;;\n\tmsys)\n\t\tbasic_machine=i386-pc\n\t\tos=-msys\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tnacl)\n\t\tbasic_machine=le32-unknown\n\t\tos=-nacl\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tneo-tandem)\n\t\tbasic_machine=neo-tandem\n\t\t;;\n\tnse-tandem)\n\t\tbasic_machine=nse-tandem\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\topenrisc | openrisc-*)\n\t\tbasic_machine=or32-unknown\n\t\t;;\n\tos400)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-os400\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tparisc)\n\t\tbasic_machine=hppa-unknown\n\t\tos=-linux\n\t\t;;\n\tparisc-*)\n\t\tbasic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n\tpc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpc98)\n\t\tbasic_machine=i386-pc\n\t\t;;\n\tpc98-*)\n\t\tbasic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon | athlon_*)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2 | pentiumiii | pentium3)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium4)\n\t\tbasic_machine=i786-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium4-*)\n\t\tbasic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc | ppcbe)\tbasic_machine=powerpc-unknown\n\t\t;;\n\tppc-* | ppcbe-*)\n\t\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t\t;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-rdos\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsb1)\n\t\tbasic_machine=mipsisa64sb1-unknown\n\t\t;;\n\tsb1el)\n\t\tbasic_machine=mipsisa64sb1el-unknown\n\t\t;;\n\tsde)\n\t\tbasic_machine=mipsisa32-sde\n\t\tos=-elf\n\t\t;;\n\tsei)\n\t\tbasic_machine=mips-sei\n\t\tos=-seiux\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsh5el)\n\t\tbasic_machine=sh5le-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tstrongarm-* | thumb-*)\n\t\tbasic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n\tsv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttile*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-linux-gnu\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\ttpf)\n\t\tbasic_machine=s390x-ibm\n\t\tos=-tpf\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tbasic_machine=f301-fujitsu\n\t\t;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\txbox)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\txps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\txscale-* | xscalee[bl]-*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tz80-*-coff)\n\t\tbasic_machine=z80-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\tmmix)\n\t\tbasic_machine=mmix-knuth\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tcydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n\t# First match some system type aliases\n\t# that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-auroraux)\n\t\tos=-auroraux\n\t\t;;\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n\t      | -sym* | -kopensolaris* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* | -aros* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \\\n\t      | -openbsd* | -solidbsd* \\\n\t      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \\\n\t      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* | -cegcc* \\\n\t      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -linux-gnu* | -linux-android* \\\n\t      | -linux-newlib* | -linux-uclibc* \\\n\t      | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n\t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto-qnx*)\n\t\t;;\n\t-nto*)\n\t\tos=`echo $os | sed -e 's|nto|nto-qnx|'`\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux-dietlibc)\n\t\tos=-linux-dietlibc\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-os400*)\n\t\tos=-os400\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-syllable*)\n\t\tos=-syllable\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t\tos=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-tpf*)\n\t\tos=-tpf\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\tos=-mint\n\t\t;;\n\t-aros*)\n\t\tos=-aros\n\t\t;;\n\t-kaos*)\n\t\tos=-kaos\n\t\t;;\n\t-zvmoe)\n\t\tos=-zvmoe\n\t\t;;\n\t-dicos*)\n\t\tos=-dicos\n\t\t;;\n\t-nacl*)\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\tscore-*)\n\t\tos=-elf\n\t\t;;\n\tspu-*)\n\t\tos=-elf\n\t\t;;\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\tc4x-* | tic4x-*)\n\t\tos=-coff\n\t\t;;\n\ttic54x-*)\n\t\tos=-coff\n\t\t;;\n\ttic55x-*)\n\t\tos=-coff\n\t\t;;\n\ttic6x-*)\n\t\tos=-coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmep-*)\n\t\tos=-elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-haiku)\n\t\tos=-haiku\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-knuth)\n\t\tos=-mmixware\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n\t*-gould)\n\t\tos=-sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n\t*-sgi)\n\t\tos=-irix\n\t\t;;\n\t*-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-cnk*|-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks* | -windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "app/src/main/jni/desmume/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.68 for desmume 0.9.8.\n#\n#\n# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,\n# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software\n# Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  # We cannot yet assume a decent shell, so we have to provide a\n\t# neutralization value for shells without unset; and this also\n\t# works around shells that cannot unset nonexistent variables.\n\t# Preserve -v and -x to the replacement shell.\n\tBASH_ENV=/dev/null\n\tENV=/dev/null\n\t(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\n\texport CONFIG_SHELL\n\tcase $- in # ((((\n\t  *v*x* | *x*v* ) as_opts=-vx ;;\n\t  *v* ) as_opts=-v ;;\n\t  *x* ) as_opts=-x ;;\n\t  * ) as_opts= ;;\n\tesac\n\texec \"$CONFIG_SHELL\" $as_opts \"$as_myself\" ${1+\"$@\"}\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME='desmume'\nPACKAGE_TARNAME='desmume'\nPACKAGE_VERSION='0.9.8'\nPACKAGE_STRING='desmume 0.9.8'\nPACKAGE_BUGREPORT=''\nPACKAGE_URL=''\n\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nUSE_MAINTAINER_MODE\nMAINT\nMAINTAINER_MODE_FALSE\nMAINTAINER_MODE_TRUE\nHAVE_GDB_STUB_FALSE\nHAVE_GDB_STUB_TRUE\nPO_DIR\nUI_DIR\nX_EXTRA_LIBS\nX_LIBS\nX_PRE_LIBS\nX_CFLAGS\nXMKMF\nMKINSTALLDIRS\nPOSUB\nPOFILES\nPO_IN_DATADIR_FALSE\nPO_IN_DATADIR_TRUE\nINTLLIBS\nINSTOBJEXT\nGMOFILES\nCATOBJEXT\nCATALOGS\nMSGFMT_OPTS\nGETTEXT_PACKAGE\nHAVE_WX_FALSE\nHAVE_WX_TRUE\nWX_RESCOMP\nWX_VERSION\nWX_LIBS_STATIC\nWX_LIBS\nWX_CXXFLAGS_ONLY\nWX_CFLAGS_ONLY\nWX_CXXFLAGS\nWX_CFLAGS\nWX_CPPFLAGS\nWX_CONFIG_PATH\nHAVE_LIBSOUNDTOUCH_FALSE\nHAVE_LIBSOUNDTOUCH_TRUE\nLIBSOUNDTOUCH_LIBS\nLIBSOUNDTOUCH_CFLAGS\nHAVE_LIBAGG_FALSE\nHAVE_LIBAGG_TRUE\nLIBAGG_LIBS\nLIBAGG_CFLAGS\nHAVE_ALSA_FALSE\nHAVE_ALSA_TRUE\nALSA_LIBS\nALSA_CFLAGS\nHAVE_LUA_FALSE\nHAVE_LUA_TRUE\nLUA_LIBS\nLUA_CFLAGS\nUPDATEDESKTOP\nGTKGLEXT_LIBS\nGTKGLEXT_CFLAGS\nGLADEUI_UNINSTALLED_DIR\nLIBGLADE_LIBS\nLIBGLADE_CFLAGS\nGTHREAD_LIBS\nGTHREAD_CFLAGS\nGTK_LIBS\nGTK_CFLAGS\nGLIB_LIBS\nGLIB_CFLAGS\nHAVE_OPENAL_FALSE\nHAVE_OPENAL_TRUE\nHAVE_LIBOSMESA_FALSE\nHAVE_LIBOSMESA_TRUE\nOSMESA_LIBS\nHAVE_GL_FALSE\nHAVE_GL_TRUE\nSDL_LIBS\nSDL_CFLAGS\nSDLCONFIG\nHAVE_PKG\nDATADIRNAME\nALL_LINGUAS\nINTLTOOL_PERL\nGMSGFMT\nMSGFMT\nMSGMERGE\nXGETTEXT\nINTLTOOL_POLICY_RULE\nINTLTOOL_SERVICE_RULE\nINTLTOOL_THEME_RULE\nINTLTOOL_SCHEMAS_RULE\nINTLTOOL_CAVES_RULE\nINTLTOOL_XML_NOMERGE_RULE\nINTLTOOL_XML_RULE\nINTLTOOL_KBD_RULE\nINTLTOOL_XAM_RULE\nINTLTOOL_UI_RULE\nINTLTOOL_SOUNDLIST_RULE\nINTLTOOL_SHEET_RULE\nINTLTOOL_SERVER_RULE\nINTLTOOL_PONG_RULE\nINTLTOOL_OAF_RULE\nINTLTOOL_PROP_RULE\nINTLTOOL_KEYS_RULE\nINTLTOOL_DIRECTORY_RULE\nINTLTOOL_DESKTOP_RULE\nintltool__v_merge_options_0\nintltool__v_merge_options_\nINTLTOOL_V_MERGE_OPTIONS\nINTLTOOL__v_MERGE_0\nINTLTOOL__v_MERGE_\nINTLTOOL_V_MERGE\nAM_DEFAULT_VERBOSITY\nINTLTOOL_EXTRACT\nINTLTOOL_MERGE\nINTLTOOL_UPDATE\nUSE_NLS\nPKG_CONFIG_LIBDIR\nPKG_CONFIG_PATH\nPKG_CONFIG\nEGREP\nGREP\nCPP\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nac_ct_CC\nCFLAGS\nCC\nRANLIB\nam__fastdepCXX_FALSE\nam__fastdepCXX_TRUE\nCXXDEPMODE\nam__nodep\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nam__quote\nam__include\nDEPDIR\nOBJEXT\nEXEEXT\nac_ct_CXX\nCPPFLAGS\nLDFLAGS\nCXXFLAGS\nCXX\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\ndesmume_arch\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_dependency_tracking\nenable_nls\nenable_osmesa\nenable_hud\nenable_macosxhack\nenable_openal\nenable_glade\nenable_wxwidgets\nenable_wifi\nwith_x\nenable_gdb_stub\nenable_hardcore\nenable_debug\nenable_gpu_debug\nenable_div_debug\nenable_sqrt_debug\nenable_dma_debug\nenable_maintainer_mode\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCXX\nCXXFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCCC\nCC\nCFLAGS\nCPP\nPKG_CONFIG\nPKG_CONFIG_PATH\nPKG_CONFIG_LIBDIR\nGLIB_CFLAGS\nGLIB_LIBS\nGTK_CFLAGS\nGTK_LIBS\nGTHREAD_CFLAGS\nGTHREAD_LIBS\nLIBGLADE_CFLAGS\nLIBGLADE_LIBS\nGTKGLEXT_CFLAGS\nGTKGLEXT_LIBS\nLUA_CFLAGS\nLUA_LIBS\nALSA_CFLAGS\nALSA_LIBS\nLIBAGG_CFLAGS\nLIBAGG_LIBS\nLIBSOUNDTOUCH_CFLAGS\nLIBSOUNDTOUCH_LIBS\nXMKMF'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n    $as_echo \"$as_me: WARNING: if you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used\" >&2\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures desmume 0.9.8 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/desmume]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n\nX features:\n  --x-includes=DIR    X include files are in DIR\n  --x-libraries=DIR   X library files are in DIR\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of desmume 0.9.8:\";;\n   esac\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors\n  --disable-nls           do not use Native Language Support\n  --enable-osmesa         use off-screen mesa\n  --enable-hud            Enable HUD rendering, requires libagg\n  --enable-macosxhack     hack to build MacOSX package\n  --enable-openal         enable experimental OpenAL microphone input\n  --enable-glade          enable glade frontend\n  --enable-wxwidgets      Enable cross platform wx widgets frontend\n  --enable-wifi           enable experimental wifi comm support\n  --enable-gdb-stub       enable gdb stub\n  --enable-hardcore       turn on -W -Wall -Werror\n  --enable-debug          enable debug information\n  --enable-gpu-debug      enable gpu debug information\n  --enable-div-debug      enable div debug information\n  --enable-sqrt-debug     enable sqrt debug information\n  --enable-dma-debug      enable dma debug information\n  --enable-maintainer-mode  enable make rules and dependencies not useful\n\t\t\t  (and sometimes confusing) to the casual installer\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-x                use the X Window System\n\nSome influential environment variables:\n  CXX         C++ compiler command\n  CXXFLAGS    C++ compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  CPP         C preprocessor\n  PKG_CONFIG  path to pkg-config utility\n  PKG_CONFIG_PATH\n              directories to add to pkg-config's search path\n  PKG_CONFIG_LIBDIR\n              path overriding pkg-config's built-in search path\n  GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config\n  GLIB_LIBS   linker flags for GLIB, overriding pkg-config\n  GTK_CFLAGS  C compiler flags for GTK, overriding pkg-config\n  GTK_LIBS    linker flags for GTK, overriding pkg-config\n  GTHREAD_CFLAGS\n              C compiler flags for GTHREAD, overriding pkg-config\n  GTHREAD_LIBS\n              linker flags for GTHREAD, overriding pkg-config\n  LIBGLADE_CFLAGS\n              C compiler flags for LIBGLADE, overriding pkg-config\n  LIBGLADE_LIBS\n              linker flags for LIBGLADE, overriding pkg-config\n  GTKGLEXT_CFLAGS\n              C compiler flags for GTKGLEXT, overriding pkg-config\n  GTKGLEXT_LIBS\n              linker flags for GTKGLEXT, overriding pkg-config\n  LUA_CFLAGS  C compiler flags for LUA, overriding pkg-config\n  LUA_LIBS    linker flags for LUA, overriding pkg-config\n  ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config\n  ALSA_LIBS   linker flags for ALSA, overriding pkg-config\n  LIBAGG_CFLAGS\n              C compiler flags for LIBAGG, overriding pkg-config\n  LIBAGG_LIBS linker flags for LIBAGG, overriding pkg-config\n  LIBSOUNDTOUCH_CFLAGS\n              C compiler flags for LIBSOUNDTOUCH, overriding pkg-config\n  LIBSOUNDTOUCH_LIBS\n              linker flags for LIBSOUNDTOUCH, overriding pkg-config\n  XMKMF       Path to xmkmf, Makefile generator for X Window System\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\ndesmume configure 0.9.8\ngenerated by GNU Autoconf 2.68\n\nCopyright (C) 2010 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_cxx_try_compile LINENO\n# ----------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_compile\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_func\n\n# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_c_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_mongrel\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by desmume $as_me 0.9.8, which was\ngenerated by GNU Autoconf 2.68.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error $? \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif ${ac_cv_build+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error $? \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif ${ac_cv_host+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\ncase $host in\n  *linux*) desmume_arch=linux;;\n  *mingw*) desmume_arch=windows;;\n  *darwin*) desmume_arch=linux;;\n  *bsd*) desmume_arch=linux;;\nesac\n\n\nam__api_version='1.11'\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; }; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    as_fn_error $? \"unsafe absolute working directory name\" \"$LINENO\" 5;;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    as_fn_error $? \"unsafe srcdir value: \\`$srcdir'\" \"$LINENO\" 5;;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$*\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      as_fn_error $? \"ls -t appears to fail.  Make sure there is not a broken\nalias in your environment\" \"$LINENO\" 5\n   fi\n\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   as_fn_error $? \"newly created file is older than distributed files!\nCheck your system clock\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: \\`missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if ${ac_cv_path_mkdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; } || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nmkdir_p=\"$MKDIR_P\"\ncase $mkdir_p in\n  [\\\\/$]* | ?:[\\\\/]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AWK+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval \\${ac_cv_prog_make_${ac_make}_set+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    as_fn_error $? \"source directory already configured; run \\\"make distclean\\\" there first\" \"$LINENO\" 5\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE='desmume'\n VERSION='0.9.8'\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\n# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAMTAR='$${TAR-tar}'\n\nam__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'\n\n\n\n\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nif test -z \"$CXX\"; then\n  if test -n \"$CCC\"; then\n    CXX=$CCC\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CXX\"; then\n  ac_cv_prog_CXX=\"$CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CXX=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCXX=$ac_cv_prog_CXX\nif test -n \"$CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXX\" >&5\n$as_echo \"$CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CXX\" && break\n  done\nfi\nif test -z \"$CXX\"; then\n  ac_ct_CXX=$CXX\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CXX\"; then\n  ac_cv_prog_ac_ct_CXX=\"$ac_ct_CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CXX=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CXX=$ac_cv_prog_ac_ct_CXX\nif test -n \"$ac_ct_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX\" >&5\n$as_echo \"$ac_ct_CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CXX\" && break\ndone\n\n  if test \"x$ac_ct_CXX\" = x; then\n    CXX=\"g++\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CXX=$ac_ct_CXX\n  fi\nfi\n\n  fi\nfi\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works\" >&5\n$as_echo_n \"checking whether the C++ compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C++ compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name\" >&5\n$as_echo_n \"checking for C++ compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C++ compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C++ compiler... \" >&6; }\nif ${ac_cv_cxx_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_cxx_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu\" >&5\n$as_echo \"$ac_cv_cxx_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GXX=yes\nelse\n  GXX=\nfi\nac_test_CXXFLAGS=${CXXFLAGS+set}\nac_save_CXXFLAGS=$CXXFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g\" >&5\n$as_echo_n \"checking whether $CXX accepts -g... \" >&6; }\nif ${ac_cv_prog_cxx_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_cxx_werror_flag=$ac_cxx_werror_flag\n   ac_cxx_werror_flag=yes\n   ac_cv_prog_cxx_g=no\n   CXXFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nelse\n  CXXFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  ac_cxx_werror_flag=$ac_save_cxx_werror_flag\n\t CXXFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_cxx_werror_flag=$ac_save_cxx_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g\" >&5\n$as_echo \"$ac_cv_prog_cxx_g\" >&6; }\nif test \"$ac_test_CXXFLAGS\" = set; then\n  CXXFLAGS=$ac_save_CXXFLAGS\nelif test $ac_cv_prog_cxx_g = yes; then\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-g -O2\"\n  else\n    CXXFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-O2\"\n  else\n    CXXFLAGS=\n  fi\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n\nam_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make\" >&5\n$as_echo_n \"checking for style of include used by $am_make... \" >&6; }\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_am_result\" >&5\n$as_echo \"$_am_result\" >&6; }\nrm -f confinc confmf\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n\ndepcc=\"$CXX\"  am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CXX_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CXX_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CXX_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CXX_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CXX_dependencies_compiler_type\" >&6; }\nCXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CXX_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCXX_TRUE=\n  am__fastdepCXX_FALSE='#'\nelse\n  am__fastdepCXX_TRUE='#'\n  am__fastdepCXX_FALSE=\nfi\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CC_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if ${ac_cv_prog_CPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif ${ac_cv_path_GREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_GREP\" && $as_test_x \"$ac_path_GREP\"; } || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif ${ac_cv_path_EGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_EGREP\" && $as_test_x \"$ac_path_EGREP\"; } || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian\" >&5\n$as_echo_n \"checking whether byte ordering is bigendian... \" >&6; }\nif ${ac_cv_c_bigendian+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_c_bigendian=unknown\n    # See if we're dealing with a universal compiler.\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifndef __APPLE_CC__\n\t       not a universal capable compiler\n\t     #endif\n\t     typedef int dummy;\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\n\t# Check for potential -arch flags.  It is not universal unless\n\t# there are at least two -arch flags with different values.\n\tac_arch=\n\tac_prev=\n\tfor ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do\n\t if test -n \"$ac_prev\"; then\n\t   case $ac_word in\n\t     i?86 | x86_64 | ppc | ppc64)\n\t       if test -z \"$ac_arch\" || test \"$ac_arch\" = \"$ac_word\"; then\n\t\t ac_arch=$ac_word\n\t       else\n\t\t ac_cv_c_bigendian=universal\n\t\t break\n\t       fi\n\t       ;;\n\t   esac\n\t   ac_prev=\n\t elif test \"x$ac_word\" = \"x-arch\"; then\n\t   ac_prev=arch\n\t fi\n       done\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if sys/param.h defines the BYTE_ORDER macro.\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t     #include <sys/param.h>\n\nint\nmain ()\n{\n#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\\n\t\t     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\\n\t\t     && LITTLE_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  # It does; now see whether it defined to BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t\t#include <sys/param.h>\n\nint\nmain ()\n{\n#if BYTE_ORDER != BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_bigendian=yes\nelse\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain ()\n{\n#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  # It does; now see whether it defined to _BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain ()\n{\n#ifndef _BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_bigendian=yes\nelse\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # Compile a test program.\n      if test \"$cross_compiling\" = yes; then :\n  # Try to guess by grepping values from an object file.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nshort int ascii_mm[] =\n\t\t  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };\n\t\tshort int ascii_ii[] =\n\t\t  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };\n\t\tint use_ascii (int i) {\n\t\t  return ascii_mm[i] + ascii_ii[i];\n\t\t}\n\t\tshort int ebcdic_ii[] =\n\t\t  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };\n\t\tshort int ebcdic_mm[] =\n\t\t  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };\n\t\tint use_ebcdic (int i) {\n\t\t  return ebcdic_mm[i] + ebcdic_ii[i];\n\t\t}\n\t\textern int foo;\n\nint\nmain ()\n{\nreturn use_ascii (foo) == use_ebcdic (foo);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then\n\t      ac_cv_c_bigendian=yes\n\t    fi\n\t    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then\n\t      if test \"$ac_cv_c_bigendian\" = unknown; then\n\t\tac_cv_c_bigendian=no\n\t      else\n\t\t# finding both strings is unlikely to happen, but who knows?\n\t\tac_cv_c_bigendian=unknown\n\t      fi\n\t    fi\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain ()\n{\n\n\t     /* Are we little or big endian?  From Harbison&Steele.  */\n\t     union\n\t     {\n\t       long int l;\n\t       char c[sizeof (long int)];\n\t     } u;\n\t     u.l = 1;\n\t     return u.c[sizeof (long int) - 1] == 1;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  ac_cv_c_bigendian=no\nelse\n  ac_cv_c_bigendian=yes\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\n    fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian\" >&5\n$as_echo \"$ac_cv_c_bigendian\" >&6; }\n case $ac_cv_c_bigendian in #(\n   yes)\n     $as_echo \"#define WORDS_BIGENDIAN 1\" >>confdefs.h\n;; #(\n   no)\n      ;; #(\n   universal)\n\n$as_echo \"#define AC_APPLE_UNIVERSAL_BUILD 1\" >>confdefs.h\n\n     ;; #(\n   *)\n     as_fn_error $? \"unknown endianness\n presetting ac_cv_c_bigendian=no (or yes) will help\" \"$LINENO\" 5 ;;\n esac\n\n\n# took this from geany, hope it works\nREVISION=\"r0\"\nSVN=`which svn 2>/dev/null`\nif test -d \".svn\" -a \"x${SVN}\" != \"x\" -a -x \"${SVN}\" ; then\n  REVISION=r`$SVN info|grep 'Last Changed Rev'|cut -d' ' -f4`\nfi\n\ncat >>confdefs.h <<_ACEOF\n#define SVN_REV \"$REVISION\"\n_ACEOF\n\n\n\n\n\n\n\n\n\n\nif test \"x$ac_cv_env_PKG_CONFIG_set\" != \"xset\"; then\n\tif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}pkg-config\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}pkg-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_PKG_CONFIG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $PKG_CONFIG in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_PKG_CONFIG=\"$PKG_CONFIG\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_PKG_CONFIG=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nPKG_CONFIG=$ac_cv_path_PKG_CONFIG\nif test -n \"$PKG_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG\" >&5\n$as_echo \"$PKG_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_path_PKG_CONFIG\"; then\n  ac_pt_PKG_CONFIG=$PKG_CONFIG\n  # Extract the first word of \"pkg-config\", so it can be a program name with args.\nset dummy pkg-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $ac_pt_PKG_CONFIG in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_ac_pt_PKG_CONFIG=\"$ac_pt_PKG_CONFIG\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_ac_pt_PKG_CONFIG=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG\nif test -n \"$ac_pt_PKG_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG\" >&5\n$as_echo \"$ac_pt_PKG_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_pt_PKG_CONFIG\" = x; then\n    PKG_CONFIG=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    PKG_CONFIG=$ac_pt_PKG_CONFIG\n  fi\nelse\n  PKG_CONFIG=\"$ac_cv_path_PKG_CONFIG\"\nfi\n\nfi\nif test -n \"$PKG_CONFIG\"; then\n\t_pkg_min_version=0.9.0\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version\" >&5\n$as_echo_n \"checking pkg-config is at least version $_pkg_min_version... \" >&6; }\n\tif $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then\n\t\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\telse\n\t\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t\tPKG_CONFIG=\"\"\n\tfi\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether NLS is requested\" >&5\n$as_echo_n \"checking whether NLS is requested... \" >&6; }\n    # Check whether --enable-nls was given.\nif test \"${enable_nls+set}\" = set; then :\n  enableval=$enable_nls; USE_NLS=$enableval\nelse\n  USE_NLS=yes\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $USE_NLS\" >&5\n$as_echo \"$USE_NLS\" >&6; }\n\n\n\n\ncase \"$am__api_version\" in\n    1.01234)\n\tas_fn_error $? \"Automake 1.5 or newer is required to use intltool\" \"$LINENO\" 5\n    ;;\n    *)\n    ;;\nesac\n\nINTLTOOL_REQUIRED_VERSION_AS_INT=`echo  | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`\nINTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d\" \" -f3`\nINTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`\nif test -n \"\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for intltool >= \" >&5\n$as_echo_n \"checking for intltool >= ... \" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found\" >&5\n$as_echo \"$INTLTOOL_APPLIED_VERSION found\" >&6; }\n    test \"$INTLTOOL_APPLIED_VERSION_AS_INT\" -ge \"$INTLTOOL_REQUIRED_VERSION_AS_INT\" ||\n\tas_fn_error $? \"Your intltool is too old.  You need intltool  or later.\" \"$LINENO\" 5\nfi\n\n# Extract the first word of \"intltool-update\", so it can be a program name with args.\nset dummy intltool-update; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_INTLTOOL_UPDATE+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $INTLTOOL_UPDATE in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_INTLTOOL_UPDATE=\"$INTLTOOL_UPDATE\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_INTLTOOL_UPDATE=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nINTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE\nif test -n \"$INTLTOOL_UPDATE\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE\" >&5\n$as_echo \"$INTLTOOL_UPDATE\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n# Extract the first word of \"intltool-merge\", so it can be a program name with args.\nset dummy intltool-merge; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_INTLTOOL_MERGE+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $INTLTOOL_MERGE in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_INTLTOOL_MERGE=\"$INTLTOOL_MERGE\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_INTLTOOL_MERGE=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nINTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE\nif test -n \"$INTLTOOL_MERGE\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE\" >&5\n$as_echo \"$INTLTOOL_MERGE\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n# Extract the first word of \"intltool-extract\", so it can be a program name with args.\nset dummy intltool-extract; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $INTLTOOL_EXTRACT in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_INTLTOOL_EXTRACT=\"$INTLTOOL_EXTRACT\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_INTLTOOL_EXTRACT=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nINTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT\nif test -n \"$INTLTOOL_EXTRACT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT\" >&5\n$as_echo \"$INTLTOOL_EXTRACT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nif test -z \"$INTLTOOL_UPDATE\" -o -z \"$INTLTOOL_MERGE\" -o -z \"$INTLTOOL_EXTRACT\"; then\n    as_fn_error $? \"The intltool scripts were not found. Please install intltool.\" \"$LINENO\" 5\nfi\n\nif test -z \"$AM_DEFAULT_VERBOSITY\"; then\n  AM_DEFAULT_VERBOSITY=1\nfi\n\n\nINTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))'\nINTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))'\nINTLTOOL__v_MERGE_0='@echo \"  ITMRG \" $@;'\n\n\n\n\nINTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))'\nintltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))'\nintltool__v_merge_options_0='-q'\n\n\n\n\n  INTLTOOL_DESKTOP_RULE='%.desktop:   %.desktop.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\nINTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n     INTLTOOL_KEYS_RULE='%.keys:      %.keys.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n     INTLTOOL_PROP_RULE='%.prop:      %.prop.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n      INTLTOOL_OAF_RULE='%.oaf:       %.oaf.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@'\n     INTLTOOL_PONG_RULE='%.pong:      %.pong.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n   INTLTOOL_SERVER_RULE='%.server:    %.server.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n    INTLTOOL_SHEET_RULE='%.sheet:     %.sheet.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\nINTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n       INTLTOOL_UI_RULE='%.ui:        %.ui.in        $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n      INTLTOOL_XML_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\nif test \"$INTLTOOL_APPLIED_VERSION_AS_INT\" -ge 5000; then\n      INTLTOOL_XML_NOMERGE_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@'\nelse\n      INTLTOOL_XML_NOMERGE_RULE='%.xml:       %.xml.in       $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir'\nfi\n      INTLTOOL_XAM_RULE='%.xam:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n      INTLTOOL_KBD_RULE='%.kbd:       %.kbd.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n    INTLTOOL_CAVES_RULE='%.caves:     %.caves.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n  INTLTOOL_SCHEMAS_RULE='%.schemas:   %.schemas.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n    INTLTOOL_THEME_RULE='%.theme:     %.theme.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n    INTLTOOL_SERVICE_RULE='%.service: %.service.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n   INTLTOOL_POLICY_RULE='%.policy:    %.policy.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check the gettext tools to make sure they are GNU\n# Extract the first word of \"xgettext\", so it can be a program name with args.\nset dummy xgettext; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_XGETTEXT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $XGETTEXT in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_XGETTEXT=\"$XGETTEXT\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_XGETTEXT=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nXGETTEXT=$ac_cv_path_XGETTEXT\nif test -n \"$XGETTEXT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $XGETTEXT\" >&5\n$as_echo \"$XGETTEXT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n# Extract the first word of \"msgmerge\", so it can be a program name with args.\nset dummy msgmerge; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_MSGMERGE+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MSGMERGE in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_MSGMERGE=\"$MSGMERGE\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_MSGMERGE=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nMSGMERGE=$ac_cv_path_MSGMERGE\nif test -n \"$MSGMERGE\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MSGMERGE\" >&5\n$as_echo \"$MSGMERGE\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n# Extract the first word of \"msgfmt\", so it can be a program name with args.\nset dummy msgfmt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_MSGFMT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MSGFMT in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_MSGFMT=\"$MSGFMT\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_MSGFMT=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nMSGFMT=$ac_cv_path_MSGFMT\nif test -n \"$MSGFMT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MSGFMT\" >&5\n$as_echo \"$MSGFMT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n# Extract the first word of \"gmsgfmt\", so it can be a program name with args.\nset dummy gmsgfmt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_GMSGFMT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $GMSGFMT in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_GMSGFMT=\"$GMSGFMT\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_GMSGFMT=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_GMSGFMT\" && ac_cv_path_GMSGFMT=\"$MSGFMT\"\n  ;;\nesac\nfi\nGMSGFMT=$ac_cv_path_GMSGFMT\nif test -n \"$GMSGFMT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $GMSGFMT\" >&5\n$as_echo \"$GMSGFMT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nif test -z \"$XGETTEXT\" -o -z \"$MSGMERGE\" -o -z \"$MSGFMT\"; then\n    as_fn_error $? \"GNU gettext tools not found; required for intltool\" \"$LINENO\" 5\nfi\nxgversion=\"`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`\"\nmmversion=\"`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`\"\nmfversion=\"`$MSGFMT --version|grep '(GNU ' 2> /dev/null`\"\nif test -z \"$xgversion\" -o -z \"$mmversion\" -o -z \"$mfversion\"; then\n    as_fn_error $? \"GNU gettext tools not found; required for intltool\" \"$LINENO\" 5\nfi\n\n# Extract the first word of \"perl\", so it can be a program name with args.\nset dummy perl; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_INTLTOOL_PERL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $INTLTOOL_PERL in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_INTLTOOL_PERL=\"$INTLTOOL_PERL\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_INTLTOOL_PERL=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nINTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL\nif test -n \"$INTLTOOL_PERL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL\" >&5\n$as_echo \"$INTLTOOL_PERL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nif test -z \"$INTLTOOL_PERL\"; then\n   as_fn_error $? \"perl not found\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1\" >&5\n$as_echo_n \"checking for perl >= 5.8.1... \" >&6; }\n$INTLTOOL_PERL -e \"use 5.8.1;\" > /dev/null 2>&1\nif test $? -ne 0; then\n   as_fn_error $? \"perl 5.8.1 is required for intltool\" \"$LINENO\" 5\nelse\n   IT_PERL_VERSION=`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION\" >&5\n$as_echo \"$IT_PERL_VERSION\" >&6; }\nfi\nif test \"x\" != \"xno-xml\"; then\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for XML::Parser\" >&5\n$as_echo_n \"checking for XML::Parser... \" >&6; }\n   if `$INTLTOOL_PERL -e \"require XML::Parser\" 2>/dev/null`; then\n       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\n   else\n       as_fn_error $? \"XML::Parser perl module is required for intltool\" \"$LINENO\" 5\n   fi\nfi\n\n# Substitute ALL_LINGUAS so we can use it in po/Makefile\n\n\n# Set DATADIRNAME correctly if it is not set yet\n# (copied from glib-gettext.m4)\nif test -z \"$DATADIRNAME\"; then\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\nextern int _nl_msg_cat_cntr;\n                       return _nl_msg_cat_cntr\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  DATADIRNAME=share\nelse\n  case $host in\n    *-*-solaris*)\n                        ac_fn_c_check_func \"$LINENO\" \"bind_textdomain_codeset\" \"ac_cv_func_bind_textdomain_codeset\"\nif test \"x$ac_cv_func_bind_textdomain_codeset\" = xyes; then :\n  DATADIRNAME=share\nelse\n  DATADIRNAME=lib\nfi\n\n    ;;\n    *)\n    DATADIRNAME=lib\n    ;;\n    esac\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}pkg-config\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}pkg-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_HAVE_PKG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$HAVE_PKG\"; then\n  ac_cv_prog_HAVE_PKG=\"$HAVE_PKG\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_HAVE_PKG=\"${ac_tool_prefix}pkg-config\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nHAVE_PKG=$ac_cv_prog_HAVE_PKG\nif test -n \"$HAVE_PKG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $HAVE_PKG\" >&5\n$as_echo \"$HAVE_PKG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_HAVE_PKG\"; then\n  ac_ct_HAVE_PKG=$HAVE_PKG\n  # Extract the first word of \"pkg-config\", so it can be a program name with args.\nset dummy pkg-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_HAVE_PKG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_HAVE_PKG\"; then\n  ac_cv_prog_ac_ct_HAVE_PKG=\"$ac_ct_HAVE_PKG\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_HAVE_PKG=\"pkg-config\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_HAVE_PKG=$ac_cv_prog_ac_ct_HAVE_PKG\nif test -n \"$ac_ct_HAVE_PKG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_HAVE_PKG\" >&5\n$as_echo \"$ac_ct_HAVE_PKG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_HAVE_PKG\" = x; then\n    HAVE_PKG=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    HAVE_PKG=$ac_ct_HAVE_PKG\n  fi\nelse\n  HAVE_PKG=\"$ac_cv_prog_HAVE_PKG\"\nfi\n\nif test \"xHAVE_PKG\" = \"x\" ; then\n  as_fn_error $? \"pkg-config is required to build desmume\" \"$LINENO\" 5\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz\" >&5\n$as_echo_n \"checking for gzopen in -lz... \" >&6; }\nif ${ac_cv_lib_z_gzopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lz  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gzopen ();\nint\nmain ()\n{\nreturn gzopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_z_gzopen=yes\nelse\n  ac_cv_lib_z_gzopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen\" >&5\n$as_echo \"$ac_cv_lib_z_gzopen\" >&6; }\nif test \"x$ac_cv_lib_z_gzopen\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBZ 1\n_ACEOF\n\n  LIBS=\"-lz $LIBS\"\n\nelse\n  as_fn_error $? \"zlib was not found, we can't go further. Please install it or specify the location where it's installed.\" \"$LINENO\" 5\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for zzip_open in -lzzip\" >&5\n$as_echo_n \"checking for zzip_open in -lzzip... \" >&6; }\nif ${ac_cv_lib_zzip_zzip_open+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lzzip  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar zzip_open ();\nint\nmain ()\n{\nreturn zzip_open ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_zzip_zzip_open=yes\nelse\n  ac_cv_lib_zzip_zzip_open=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zzip_zzip_open\" >&5\n$as_echo \"$ac_cv_lib_zzip_zzip_open\" >&6; }\nif test \"x$ac_cv_lib_zzip_zzip_open\" = xyes; then :\n\n\tLIBS=\"-lzzip $LIBS\"\n\t$as_echo \"#define HAVE_LIBZZIP 1\" >>confdefs.h\n\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether zzip use void * as second parameter\" >&5\n$as_echo_n \"checking whether zzip use void * as second parameter... \" >&6; }\n\tcat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <zzip/lib.h>\nint\nmain ()\n{\n\n\t\tvoid * v;\n\t\tzzip_read(NULL, v, 0);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  $as_echo \"#define ZZIP_OLD_READ 1\" >>confdefs.h\n\n\t\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n\n\nfor ac_prog in sdl-config sdl11-config\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_SDLCONFIG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $SDLCONFIG in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_SDLCONFIG=\"$SDLCONFIG\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_SDLCONFIG=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nSDLCONFIG=$ac_cv_path_SDLCONFIG\nif test -n \"$SDLCONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $SDLCONFIG\" >&5\n$as_echo \"$SDLCONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$SDLCONFIG\" && break\ndone\n\nif test ! \"x$SDLCONFIG\" = \"x\" ; then\n  SDL_CFLAGS=`$SDLCONFIG --cflags`\n  SDL_LIBS=`$SDLCONFIG --libs`\n\n\nelse\n  as_fn_error $? \"sdl is required to build desmume\" \"$LINENO\" 5\nfi\n\nfor ac_header in GL/gl.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"GL/gl.h\" \"ac_cv_header_GL_gl_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_GL_gl_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_GL_GL_H 1\n_ACEOF\n for ac_header in GL/glu.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"GL/glu.h\" \"ac_cv_header_GL_glu_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_GL_glu_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_GL_GLU_H 1\n_ACEOF\n have_gl_h=yes LIBS=\"$LIBS -lGLU\"\nelse\n  have_gl_h=no\nfi\n\ndone\n\nelse\n  have_gl_h=no\nfi\n\ndone\n\nif test \"have_gl_h\" = \"no\" ; then\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Building without GL support because of missing headers.\" >&5\n$as_echo \"$as_me: WARNING: Building without GL support because of missing headers.\" >&2;}\nfi\n if test \"${have_gl_h}\" = \"yes\"; then\n  HAVE_GL_TRUE=\n  HAVE_GL_FALSE='#'\nelse\n  HAVE_GL_TRUE='#'\n  HAVE_GL_FALSE=\nfi\n\n\n# Check whether --enable-osmesa was given.\nif test \"${enable_osmesa+set}\" = set; then :\n  enableval=$enable_osmesa; osmesa=$enableval\nelse\n  osmesa=yes\nfi\n\n\nif test \"x$osmesa\" = \"xyes\" ; then\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for main in -ldl\" >&5\n$as_echo_n \"checking for main in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_main+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\nreturn main ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_main=yes\nelse\n  ac_cv_lib_dl_main=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_main\" >&5\n$as_echo \"$ac_cv_lib_dl_main\" >&6; }\nif test \"x$ac_cv_lib_dl_main\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBDL 1\n_ACEOF\n\n  LIBS=\"-ldl $LIBS\"\n\nfi\n\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for main in -lGL\" >&5\n$as_echo_n \"checking for main in -lGL... \" >&6; }\nif ${ac_cv_lib_GL_main+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lGL  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\nreturn main ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_GL_main=yes\nelse\n  ac_cv_lib_GL_main=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_main\" >&5\n$as_echo \"$ac_cv_lib_GL_main\" >&6; }\nif test \"x$ac_cv_lib_GL_main\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBGL 1\n_ACEOF\n\n  LIBS=\"-lGL $LIBS\"\n\nfi\n\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for main in -lOSMesa\" >&5\n$as_echo_n \"checking for main in -lOSMesa... \" >&6; }\nif ${ac_cv_lib_OSMesa_main+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lOSMesa  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\nreturn main ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_OSMesa_main=yes\nelse\n  ac_cv_lib_OSMesa_main=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_OSMesa_main\" >&5\n$as_echo \"$ac_cv_lib_OSMesa_main\" >&6; }\nif test \"x$ac_cv_lib_OSMesa_main\" = xyes; then :\n\n\t\tuseosmesa=yes\n\t\t$as_echo \"#define HAVE_LIBOSMESA 1\" >>confdefs.h\n\n\t\tOSMESA_LIBS=\"-lOSMesa\"\n\n\nfi\n\nfi\n if test \"${useosmesa}\" = \"yes\"; then\n  HAVE_LIBOSMESA_TRUE=\n  HAVE_LIBOSMESA_FALSE='#'\nelse\n  HAVE_LIBOSMESA_TRUE='#'\n  HAVE_LIBOSMESA_FALSE=\nfi\n\n\n# Check whether --enable-hud was given.\nif test \"${enable_hud+set}\" = set; then :\n  enableval=$enable_hud; libagg=yes\nfi\n\n\n# Check whether --enable-macosxhack was given.\nif test \"${enable_macosxhack+set}\" = set; then :\n  enableval=$enable_macosxhack; GTK_MACOSX_HACK=yes\nfi\n\n\nHAVE_OPENAL=no\n# Check whether --enable-openal was given.\nif test \"${enable_openal+set}\" = set; then :\n  enableval=$enable_openal; openal=yes\nfi\n\n\nif test \"x$openal\" = \"xyes\" ; then\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for main in -lopenal\" >&5\n$as_echo_n \"checking for main in -lopenal... \" >&6; }\nif ${ac_cv_lib_openal_main+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lopenal  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\nreturn main ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_openal_main=yes\nelse\n  ac_cv_lib_openal_main=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openal_main\" >&5\n$as_echo \"$ac_cv_lib_openal_main\" >&6; }\nif test \"x$ac_cv_lib_openal_main\" = xyes; then :\n\n                HAVE_OPENAL=yes\n\t\tLIBS=\"$LIBS -lopenal\"\n\nfi\n\nfi\n if test \"${HAVE_OPENAL}\" = \"yes\"; then\n  HAVE_OPENAL_TRUE=\n  HAVE_OPENAL_FALSE='#'\nelse\n  HAVE_OPENAL_TRUE='#'\n  HAVE_OPENAL_FALSE=\nfi\n\n\nFOUND_GLIB=no\nHAVE_ALSA=no\nGLIB_VER=2.8\nGTK_VER=2.14\n\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GLIB\" >&5\n$as_echo_n \"checking for GLIB... \" >&6; }\n\nif test -n \"$GLIB_CFLAGS\"; then\n    pkg_cv_GLIB_CFLAGS=\"$GLIB_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"glib-2.0 >= \\$GLIB_VER\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"glib-2.0 >= $GLIB_VER\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags \"glib-2.0 >= $GLIB_VER\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$GLIB_LIBS\"; then\n    pkg_cv_GLIB_LIBS=\"$GLIB_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"glib-2.0 >= \\$GLIB_VER\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"glib-2.0 >= $GLIB_VER\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs \"glib-2.0 >= $GLIB_VER\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"glib-2.0 >= $GLIB_VER\" 2>&1`\n        else\n\t        GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"glib-2.0 >= $GLIB_VER\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$GLIB_PKG_ERRORS\" >&5\n\n\tFOUND_GLIB=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tFOUND_GLIB=no\nelse\n\tGLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS\n\tGLIB_LIBS=$pkg_cv_GLIB_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tFOUND_GLIB=yes\nfi\nif test \"x$FOUND_GLIB\" = \"xno\"; then\n   if test ! \"x$GTK_MACOSX_HACK\" = \"xyes\"; then\n     as_fn_error $? \"Glib is required to build desmume\" \"$LINENO\" 5\n   fi\nfi\n\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GTK\" >&5\n$as_echo_n \"checking for GTK... \" >&6; }\n\nif test -n \"$GTK_CFLAGS\"; then\n    pkg_cv_GTK_CFLAGS=\"$GTK_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"gtk+-2.0 >= \\$GTK_VER\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= $GTK_VER\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags \"gtk+-2.0 >= $GTK_VER\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$GTK_LIBS\"; then\n    pkg_cv_GTK_LIBS=\"$GTK_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"gtk+-2.0 >= \\$GTK_VER\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= $GTK_VER\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs \"gtk+-2.0 >= $GTK_VER\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"gtk+-2.0 >= $GTK_VER\" 2>&1`\n        else\n\t        GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"gtk+-2.0 >= $GTK_VER\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$GTK_PKG_ERRORS\" >&5\n\n\tHAVE_GTK=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tHAVE_GTK=no\nelse\n\tGTK_CFLAGS=$pkg_cv_GTK_CFLAGS\n\tGTK_LIBS=$pkg_cv_GTK_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tHAVE_GTK=yes\nfi\n\n\n\n\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GTHREAD\" >&5\n$as_echo_n \"checking for GTHREAD... \" >&6; }\n\nif test -n \"$GTHREAD_CFLAGS\"; then\n    pkg_cv_GTHREAD_CFLAGS=\"$GTHREAD_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"\\\"gthread-2.0\\\"\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"\"gthread-2.0\"\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GTHREAD_CFLAGS=`$PKG_CONFIG --cflags \"\"gthread-2.0\"\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$GTHREAD_LIBS\"; then\n    pkg_cv_GTHREAD_LIBS=\"$GTHREAD_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"\\\"gthread-2.0\\\"\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"\"gthread-2.0\"\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GTHREAD_LIBS=`$PKG_CONFIG --libs \"\"gthread-2.0\"\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        GTHREAD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"\"gthread-2.0\"\" 2>&1`\n        else\n\t        GTHREAD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"\"gthread-2.0\"\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$GTHREAD_PKG_ERRORS\" >&5\n\n\tHAVE_GTHREAD=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tHAVE_GTHREAD=no\nelse\n\tGTHREAD_CFLAGS=$pkg_cv_GTHREAD_CFLAGS\n\tGTHREAD_LIBS=$pkg_cv_GTHREAD_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tHAVE_GTHREAD=yes\nfi\n\n\n\n# Check whether --enable-glade was given.\nif test \"${enable_glade+set}\" = set; then :\n  enableval=$enable_glade; glade=$enableval\nelse\n  glade=yes\nfi\n\n\nif test \"x$glade\" = \"xyes\" ; then\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for LIBGLADE\" >&5\n$as_echo_n \"checking for LIBGLADE... \" >&6; }\n\nif test -n \"$LIBGLADE_CFLAGS\"; then\n    pkg_cv_LIBGLADE_CFLAGS=\"$LIBGLADE_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"\\\"libglade-2.0\\\"\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"\"libglade-2.0\"\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LIBGLADE_CFLAGS=`$PKG_CONFIG --cflags \"\"libglade-2.0\"\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$LIBGLADE_LIBS\"; then\n    pkg_cv_LIBGLADE_LIBS=\"$LIBGLADE_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"\\\"libglade-2.0\\\"\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"\"libglade-2.0\"\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LIBGLADE_LIBS=`$PKG_CONFIG --libs \"\"libglade-2.0\"\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"\"libglade-2.0\"\" 2>&1`\n        else\n\t        LIBGLADE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"\"libglade-2.0\"\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$LIBGLADE_PKG_ERRORS\" >&5\n\n\tHAVE_LIBGLADE=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tHAVE_LIBGLADE=no\nelse\n\tLIBGLADE_CFLAGS=$pkg_cv_LIBGLADE_CFLAGS\n\tLIBGLADE_LIBS=$pkg_cv_LIBGLADE_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tHAVE_LIBGLADE=yes\nfi\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define GLADEUI_UNINSTALLED_DIR \"`pwd`/src/gtk-glade/glade/\"\n_ACEOF\n\n\n\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GTKGLEXT\" >&5\n$as_echo_n \"checking for GTKGLEXT... \" >&6; }\n\nif test -n \"$GTKGLEXT_CFLAGS\"; then\n    pkg_cv_GTKGLEXT_CFLAGS=\"$GTKGLEXT_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"\\\"gtkglext-1.0\\\"\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"\"gtkglext-1.0\"\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GTKGLEXT_CFLAGS=`$PKG_CONFIG --cflags \"\"gtkglext-1.0\"\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$GTKGLEXT_LIBS\"; then\n    pkg_cv_GTKGLEXT_LIBS=\"$GTKGLEXT_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"\\\"gtkglext-1.0\\\"\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"\"gtkglext-1.0\"\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_GTKGLEXT_LIBS=`$PKG_CONFIG --libs \"\"gtkglext-1.0\"\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        GTKGLEXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"\"gtkglext-1.0\"\" 2>&1`\n        else\n\t        GTKGLEXT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"\"gtkglext-1.0\"\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$GTKGLEXT_PKG_ERRORS\" >&5\n\n\tas_fn_error $? \"Package requirements (\\\"gtkglext-1.0\\\") were not met:\n\n$GTKGLEXT_PKG_ERRORS\n\nConsider adjusting the PKG_CONFIG_PATH environment variable if you\ninstalled software in a non-standard prefix.\n\nAlternatively, you may set the environment variables GTKGLEXT_CFLAGS\nand GTKGLEXT_LIBS to avoid the need to call pkg-config.\nSee the pkg-config man page for more details.\" \"$LINENO\" 5\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"The pkg-config script could not be found or is too old.  Make sure it\nis in your PATH or set the PKG_CONFIG environment variable to the full\npath to pkg-config.\n\nAlternatively, you may set the environment variables GTKGLEXT_CFLAGS\nand GTKGLEXT_LIBS to avoid the need to call pkg-config.\nSee the pkg-config man page for more details.\n\nTo get pkg-config, see <http://pkg-config.freedesktop.org/>.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n\tGTKGLEXT_CFLAGS=$pkg_cv_GTKGLEXT_CFLAGS\n\tGTKGLEXT_LIBS=$pkg_cv_GTKGLEXT_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\t$as_echo \"#define GTKGLEXT_AVAILABLE 1\" >>confdefs.h\n\n\nfi\n\n\nfi\n\n# Extract the first word of \"update-desktop-database\", so it can be a program name with args.\nset dummy update-desktop-database; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_UPDATEDESKTOP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $UPDATEDESKTOP in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_UPDATEDESKTOP=\"$UPDATEDESKTOP\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_UPDATEDESKTOP=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nUPDATEDESKTOP=$ac_cv_path_UPDATEDESKTOP\nif test -n \"$UPDATEDESKTOP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $UPDATEDESKTOP\" >&5\n$as_echo \"$UPDATEDESKTOP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n# Need check for both lua and lua5.1 to run on debian, see mysql bug #29945\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for LUA\" >&5\n$as_echo_n \"checking for LUA... \" >&6; }\n\nif test -n \"$LUA_CFLAGS\"; then\n    pkg_cv_LUA_CFLAGS=\"$LUA_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"lua >= 5.1\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"lua >= 5.1\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags \"lua >= 5.1\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$LUA_LIBS\"; then\n    pkg_cv_LUA_LIBS=\"$LUA_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"lua >= 5.1\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"lua >= 5.1\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs \"lua >= 5.1\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"lua >= 5.1\" 2>&1`\n        else\n\t        LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"lua >= 5.1\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$LUA_PKG_ERRORS\" >&5\n\n\tHAVE_LUA=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tHAVE_LUA=no\nelse\n\tLUA_CFLAGS=$pkg_cv_LUA_CFLAGS\n\tLUA_LIBS=$pkg_cv_LUA_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tHAVE_LUA=yes\nfi\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for LUA\" >&5\n$as_echo_n \"checking for LUA... \" >&6; }\n\nif test -n \"$LUA_CFLAGS\"; then\n    pkg_cv_LUA_CFLAGS=\"$LUA_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"lua5.1 >= 5.1\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags \"lua5.1 >= 5.1\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$LUA_LIBS\"; then\n    pkg_cv_LUA_LIBS=\"$LUA_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"lua5.1 >= 5.1\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs \"lua5.1 >= 5.1\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"lua5.1 >= 5.1\" 2>&1`\n        else\n\t        LUA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"lua5.1 >= 5.1\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$LUA_PKG_ERRORS\" >&5\n\n\tHAVE_LUA=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tHAVE_LUA=no\nelse\n\tLUA_CFLAGS=$pkg_cv_LUA_CFLAGS\n\tLUA_LIBS=$pkg_cv_LUA_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tHAVE_LUA=yes\nfi\n\n\n if test \"${HAVE_LUA}x\" = \"yes\"; then\n  HAVE_LUA_TRUE=\n  HAVE_LUA_FALSE='#'\nelse\n  HAVE_LUA_TRUE='#'\n  HAVE_LUA_FALSE=\nfi\n\n\nif test ! \"x$HAVE_OPENAL\" = \"xyes\" ; then\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ALSA\" >&5\n$as_echo_n \"checking for ALSA... \" >&6; }\n\nif test -n \"$ALSA_CFLAGS\"; then\n    pkg_cv_ALSA_CFLAGS=\"$ALSA_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"alsa >= 1.0\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"alsa >= 1.0\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_ALSA_CFLAGS=`$PKG_CONFIG --cflags \"alsa >= 1.0\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$ALSA_LIBS\"; then\n    pkg_cv_ALSA_LIBS=\"$ALSA_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"alsa >= 1.0\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"alsa >= 1.0\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_ALSA_LIBS=`$PKG_CONFIG --libs \"alsa >= 1.0\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        ALSA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"alsa >= 1.0\" 2>&1`\n        else\n\t        ALSA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"alsa >= 1.0\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$ALSA_PKG_ERRORS\" >&5\n\n\tHAVE_ALSA=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tHAVE_ALSA=no\nelse\n\tALSA_CFLAGS=$pkg_cv_ALSA_CFLAGS\n\tALSA_LIBS=$pkg_cv_ALSA_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tHAVE_ALSA=yes\nfi\n\n\nfi\n if test \"${HAVE_ALSA}\" = \"yes\"; then\n  HAVE_ALSA_TRUE=\n  HAVE_ALSA_FALSE='#'\nelse\n  HAVE_ALSA_TRUE='#'\n  HAVE_ALSA_FALSE=\nfi\n\n\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for LIBAGG\" >&5\n$as_echo_n \"checking for LIBAGG... \" >&6; }\n\nif test -n \"$LIBAGG_CFLAGS\"; then\n    pkg_cv_LIBAGG_CFLAGS=\"$LIBAGG_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"libagg >= 2.5.0\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"libagg >= 2.5.0\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LIBAGG_CFLAGS=`$PKG_CONFIG --cflags \"libagg >= 2.5.0\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$LIBAGG_LIBS\"; then\n    pkg_cv_LIBAGG_LIBS=\"$LIBAGG_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"libagg >= 2.5.0\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"libagg >= 2.5.0\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LIBAGG_LIBS=`$PKG_CONFIG --libs \"libagg >= 2.5.0\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        LIBAGG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"libagg >= 2.5.0\" 2>&1`\n        else\n\t        LIBAGG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"libagg >= 2.5.0\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$LIBAGG_PKG_ERRORS\" >&5\n\n\tFOUND_LIBAGG=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tFOUND_LIBAGG=no\nelse\n\tLIBAGG_CFLAGS=$pkg_cv_LIBAGG_CFLAGS\n\tLIBAGG_LIBS=$pkg_cv_LIBAGG_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tFOUND_LIBAGG=yes\nfi\n if test \"x$libagg\" = \"xyes\" -a \"${FOUND_LIBAGG}\" = \"yes\"; then\n  HAVE_LIBAGG_TRUE=\n  HAVE_LIBAGG_FALSE='#'\nelse\n  HAVE_LIBAGG_TRUE='#'\n  HAVE_LIBAGG_FALSE=\nfi\n\nif test \"x$libagg\" = \"xyes\" ; then\n   if test \"x$FOUND_LIBAGG\" = \"xyes\" ; then\n\n\n       $as_echo \"#define HAVE_LIBAGG 1\" >>confdefs.h\n\n   else\n       { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: HUD rendering enabled, but libagg not found\" >&5\n$as_echo \"$as_me: WARNING: HUD rendering enabled, but libagg not found\" >&2;}\n   fi\nfi\n\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for LIBSOUNDTOUCH\" >&5\n$as_echo_n \"checking for LIBSOUNDTOUCH... \" >&6; }\n\nif test -n \"$LIBSOUNDTOUCH_CFLAGS\"; then\n    pkg_cv_LIBSOUNDTOUCH_CFLAGS=\"$LIBSOUNDTOUCH_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"soundtouch >= 1.5.0\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"soundtouch >= 1.5.0\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LIBSOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags \"soundtouch >= 1.5.0\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$LIBSOUNDTOUCH_LIBS\"; then\n    pkg_cv_LIBSOUNDTOUCH_LIBS=\"$LIBSOUNDTOUCH_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"soundtouch >= 1.5.0\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"soundtouch >= 1.5.0\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_LIBSOUNDTOUCH_LIBS=`$PKG_CONFIG --libs \"soundtouch >= 1.5.0\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        LIBSOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"soundtouch >= 1.5.0\" 2>&1`\n        else\n\t        LIBSOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"soundtouch >= 1.5.0\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$LIBSOUNDTOUCH_PKG_ERRORS\" >&5\n\n\tHAVE_LIBSOUNDTOUCH=no\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\tHAVE_LIBSOUNDTOUCH=no\nelse\n\tLIBSOUNDTOUCH_CFLAGS=$pkg_cv_LIBSOUNDTOUCH_CFLAGS\n\tLIBSOUNDTOUCH_LIBS=$pkg_cv_LIBSOUNDTOUCH_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\tHAVE_LIBSOUNDTOUCH=yes\nfi\n\n\n if test \"${HAVE_LIBSOUNDTOUCH}\" = \"yes\"; then\n  HAVE_LIBSOUNDTOUCH_TRUE=\n  HAVE_LIBSOUNDTOUCH_FALSE='#'\nelse\n  HAVE_LIBSOUNDTOUCH_TRUE='#'\n  HAVE_LIBSOUNDTOUCH_FALSE=\nfi\n\nif test \"x$HAVE_LIBSOUNDTOUCH\" = \"xyes\"; then\n   $as_echo \"#define HAVE_LIBSOUNDTOUCH 1\" >>confdefs.h\n\nelse\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: SoundTouch library not found, pcsx2 resampler will be disabled\" >&5\n$as_echo \"$as_me: WARNING: SoundTouch library not found, pcsx2 resampler will be disabled\" >&2;}\nfi\n\nif test \"x$HAVE_ALSA\" = \"xno\"; then\n   if test \"x$HAVE_OPENAL\" = \"xno\"; then\n      $as_echo \"#define FAKE_MIC 1\" >>confdefs.h\n\n   fi\nfi\n\n\n# Check whether --enable-wxwidgets was given.\nif test \"${enable_wxwidgets+set}\" = set; then :\n  enableval=$enable_wxwidgets; wxwidgets=$enableval\nelse\n  wxwidgets=no\nfi\n\nif test \"x$wxwidgets\" = \"xyes\" ; then\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    if test x${WX_CONFIG_NAME+set} != xset ; then\n     WX_CONFIG_NAME=wx-config\n  fi\n\n  if test \"x$wx_config_name\" != x ; then\n     WX_CONFIG_NAME=\"$wx_config_name\"\n  fi\n\n    if test x$wx_config_exec_prefix != x ; then\n     wx_config_args=\"$wx_config_args --exec-prefix=$wx_config_exec_prefix\"\n     WX_LOOKUP_PATH=\"$wx_config_exec_prefix/bin\"\n  fi\n  if test x$wx_config_prefix != x ; then\n     wx_config_args=\"$wx_config_args --prefix=$wx_config_prefix\"\n     WX_LOOKUP_PATH=\"$WX_LOOKUP_PATH:$wx_config_prefix/bin\"\n  fi\n  if test \"$cross_compiling\" = \"yes\"; then\n     wx_config_args=\"$wx_config_args --host=$host_alias\"\n  fi\n\n    if test -x \"$WX_CONFIG_NAME\" ; then\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for wx-config\" >&5\n$as_echo_n \"checking for wx-config... \" >&6; }\n     WX_CONFIG_PATH=\"$WX_CONFIG_NAME\"\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH\" >&5\n$as_echo \"$WX_CONFIG_PATH\" >&6; }\n  else\n     # Extract the first word of \"$WX_CONFIG_NAME\", so it can be a program name with args.\nset dummy $WX_CONFIG_NAME; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_WX_CONFIG_PATH+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $WX_CONFIG_PATH in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_WX_CONFIG_PATH=\"$WX_CONFIG_PATH\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_dummy=\"\"$WX_LOOKUP_PATH:$PATH\"\"\nfor as_dir in $as_dummy\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_WX_CONFIG_PATH=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_WX_CONFIG_PATH\" && ac_cv_path_WX_CONFIG_PATH=\"no\"\n  ;;\nesac\nfi\nWX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH\nif test -n \"$WX_CONFIG_PATH\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH\" >&5\n$as_echo \"$WX_CONFIG_PATH\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\n\n  if test \"$WX_CONFIG_PATH\" != \"no\" ; then\n    WX_VERSION=\"\"\n\n    min_wx_version=2.4.0\n    if test -z \"\" ; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version\" >&5\n$as_echo_n \"checking for wxWidgets version >= $min_wx_version... \" >&6; }\n    else\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()\" >&5\n$as_echo_n \"checking for wxWidgets version >= $min_wx_version ()... \" >&6; }\n    fi\n\n    WX_CONFIG_WITH_ARGS=\"$WX_CONFIG_PATH $wx_config_args  \"\n\n    WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null`\n    wx_config_major_version=`echo $WX_VERSION | \\\n           sed 's/\\([0-9]*\\).\\([0-9]*\\).\\([0-9]*\\)/\\1/'`\n    wx_config_minor_version=`echo $WX_VERSION | \\\n           sed 's/\\([0-9]*\\).\\([0-9]*\\).\\([0-9]*\\)/\\2/'`\n    wx_config_micro_version=`echo $WX_VERSION | \\\n           sed 's/\\([0-9]*\\).\\([0-9]*\\).\\([0-9]*\\)/\\3/'`\n\n    wx_requested_major_version=`echo $min_wx_version | \\\n           sed 's/\\([0-9]*\\).\\([0-9]*\\).\\([0-9]*\\)/\\1/'`\n    wx_requested_minor_version=`echo $min_wx_version | \\\n           sed 's/\\([0-9]*\\).\\([0-9]*\\).\\([0-9]*\\)/\\2/'`\n    wx_requested_micro_version=`echo $min_wx_version | \\\n           sed 's/\\([0-9]*\\).\\([0-9]*\\).\\([0-9]*\\)/\\3/'`\n\n\n    wx_ver_ok=\"\"\n    if test \"x$WX_VERSION\" != x ; then\n      if test $wx_config_major_version -gt $wx_requested_major_version; then\n        wx_ver_ok=yes\n      else\n        if test $wx_config_major_version -eq $wx_requested_major_version; then\n           if test $wx_config_minor_version -gt $wx_requested_minor_version; then\n              wx_ver_ok=yes\n           else\n              if test $wx_config_minor_version -eq $wx_requested_minor_version; then\n                 if test $wx_config_micro_version -ge $wx_requested_micro_version; then\n                    wx_ver_ok=yes\n                 fi\n              fi\n           fi\n        fi\n      fi\n    fi\n\n\n    if test -n \"$wx_ver_ok\"; then\n\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)\" >&5\n$as_echo \"yes (version $WX_VERSION)\" >&6; }\n      WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs`\n\n                              { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library\" >&5\n$as_echo_n \"checking for wxWidgets static library... \" >&6; }\n      WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null`\n      if test \"x$WX_LIBS_STATIC\" = \"x\"; then\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n      else\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n      fi\n\n            wx_has_cppflags=\"\"\n      if test $wx_config_major_version -gt 2; then\n        wx_has_cppflags=yes\n      else\n        if test $wx_config_major_version -eq 2; then\n           if test $wx_config_minor_version -gt 2; then\n              wx_has_cppflags=yes\n           else\n              if test $wx_config_minor_version -eq 2; then\n                 if test $wx_config_micro_version -ge 6; then\n                    wx_has_cppflags=yes\n                 fi\n              fi\n           fi\n        fi\n      fi\n\n            wx_has_rescomp=\"\"\n      if test $wx_config_major_version -gt 2; then\n        wx_has_rescomp=yes\n      else\n        if test $wx_config_major_version -eq 2; then\n           if test $wx_config_minor_version -ge 7; then\n              wx_has_rescomp=yes\n           fi\n        fi\n      fi\n      if test \"x$wx_has_rescomp\" = x ; then\n                  WX_RESCOMP=\n      else\n         WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp`\n      fi\n\n      if test \"x$wx_has_cppflags\" = x ; then\n                  WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags`\n         WX_CPPFLAGS=$WX_CFLAGS\n         WX_CXXFLAGS=$WX_CFLAGS\n\n         WX_CFLAGS_ONLY=$WX_CFLAGS\n         WX_CXXFLAGS_ONLY=$WX_CFLAGS\n      else\n                  WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags`\n         WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags`\n         WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags`\n\n         WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed \"s@^$WX_CPPFLAGS *@@\"`\n         WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed \"s@^$WX_CFLAGS *@@\"`\n      fi\n\n      wxwin=yes\n\n    else\n\n       if test \"x$WX_VERSION\" = x; then\n                    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n       else\n          { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)\" >&5\n$as_echo \"no (version $WX_VERSION is not new enough)\" >&6; }\n       fi\n\n       WX_CFLAGS=\"\"\n       WX_CPPFLAGS=\"\"\n       WX_CXXFLAGS=\"\"\n       WX_LIBS=\"\"\n       WX_LIBS_STATIC=\"\"\n       WX_RESCOMP=\"\"\n       :\n\n    fi\n  else\n\n    WX_CFLAGS=\"\"\n    WX_CPPFLAGS=\"\"\n    WX_CXXFLAGS=\"\"\n    WX_LIBS=\"\"\n    WX_LIBS_STATIC=\"\"\n    WX_RESCOMP=\"\"\n\n    :\n\n  fi\n\n\n\n\n\n\n\n\n\n\n\n\tif test \"x$wxwin\" = \"xyes\"; then\n\n\n   \t\t$as_echo \"#define WANT_WX 1\" >>confdefs.h\n\n\tfi\nfi\n\n if test \"x$wxwidgets\" = \"xyes\"; then\n  HAVE_WX_TRUE=\n  HAVE_WX_FALSE='#'\nelse\n  HAVE_WX_TRUE='#'\n  HAVE_WX_FALSE=\nfi\n\n\nPO_DIR=\"\"\nUI_DIR=\"cli $UI_DIR\"\nif test \"x$HAVE_GTK\" = \"xyes\"; then\n  UI_DIR=\"gtk $UI_DIR\"\nfi\nif test \"x$wxwin\" = \"xyes\"; then\n  UI_DIR=\"wx $UI_DIR\"\nfi\n\nif test \"x$HAVE_LIBGLADE\" = \"xyes\"; then\n\n    UI_DIR=\"gtk-glade $UI_DIR\"\n\n        GETTEXT_PACKAGE=desmume\n\ncat >>confdefs.h <<_ACEOF\n#define GETTEXT_PACKAGE \"$GETTEXT_PACKAGE\"\n_ACEOF\n\n\n    ALL_LINGUAS=\"fr nb pt_BR sv zh_CN zh_TW\"\n\n   for ac_header in locale.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"locale.h\" \"ac_cv_header_locale_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_locale_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LOCALE_H 1\n_ACEOF\n\nfi\n\ndone\n\n    if test $ac_cv_header_locale_h = yes; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES\" >&5\n$as_echo_n \"checking for LC_MESSAGES... \" >&6; }\nif ${am_cv_val_LC_MESSAGES+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <locale.h>\nint\nmain ()\n{\nreturn LC_MESSAGES\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  am_cv_val_LC_MESSAGES=yes\nelse\n  am_cv_val_LC_MESSAGES=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES\" >&5\n$as_echo \"$am_cv_val_LC_MESSAGES\" >&6; }\n    if test $am_cv_val_LC_MESSAGES = yes; then\n\n$as_echo \"#define HAVE_LC_MESSAGES 1\" >>confdefs.h\n\n    fi\n  fi\n     USE_NLS=yes\n\n\n    gt_cv_have_gettext=no\n\n    CATOBJEXT=NONE\n    XGETTEXT=:\n    INTLLIBS=\n\n    ac_fn_c_check_header_mongrel \"$LINENO\" \"libintl.h\" \"ac_cv_header_libintl_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_libintl_h\" = xyes; then :\n  gt_cv_func_dgettext_libintl=\"no\"\n      libintl_extra_libs=\"\"\n\n      #\n      # First check in libc\n      #\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ngettext in libc\" >&5\n$as_echo_n \"checking for ngettext in libc... \" >&6; }\nif ${gt_cv_func_ngettext_libc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <libintl.h>\n\nint\nmain ()\n{\nreturn !ngettext (\"\",\"\", 1)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  gt_cv_func_ngettext_libc=yes\nelse\n  gt_cv_func_ngettext_libc=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc\" >&5\n$as_echo \"$gt_cv_func_ngettext_libc\" >&6; }\n\n      if test \"$gt_cv_func_ngettext_libc\" = \"yes\" ; then\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dgettext in libc\" >&5\n$as_echo_n \"checking for dgettext in libc... \" >&6; }\nif ${gt_cv_func_dgettext_libc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <libintl.h>\n\nint\nmain ()\n{\nreturn !dgettext (\"\",\"\")\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  gt_cv_func_dgettext_libc=yes\nelse\n  gt_cv_func_dgettext_libc=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc\" >&5\n$as_echo \"$gt_cv_func_dgettext_libc\" >&6; }\n      fi\n\n      if test \"$gt_cv_func_ngettext_libc\" = \"yes\" ; then\n        for ac_func in bind_textdomain_codeset\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"bind_textdomain_codeset\" \"ac_cv_func_bind_textdomain_codeset\"\nif test \"x$ac_cv_func_bind_textdomain_codeset\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_BIND_TEXTDOMAIN_CODESET 1\n_ACEOF\n\nfi\ndone\n\n      fi\n\n      #\n      # If we don't have everything we want, check in libintl\n      #\n      if test \"$gt_cv_func_dgettext_libc\" != \"yes\" \\\n\t || test \"$gt_cv_func_ngettext_libc\" != \"yes\" \\\n         || test \"$ac_cv_func_bind_textdomain_codeset\" != \"yes\" ; then\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl\" >&5\n$as_echo_n \"checking for bindtextdomain in -lintl... \" >&6; }\nif ${ac_cv_lib_intl_bindtextdomain+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lintl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar bindtextdomain ();\nint\nmain ()\n{\nreturn bindtextdomain ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_intl_bindtextdomain=yes\nelse\n  ac_cv_lib_intl_bindtextdomain=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain\" >&5\n$as_echo \"$ac_cv_lib_intl_bindtextdomain\" >&6; }\nif test \"x$ac_cv_lib_intl_bindtextdomain\" = xyes; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl\" >&5\n$as_echo_n \"checking for ngettext in -lintl... \" >&6; }\nif ${ac_cv_lib_intl_ngettext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lintl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar ngettext ();\nint\nmain ()\n{\nreturn ngettext ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_intl_ngettext=yes\nelse\n  ac_cv_lib_intl_ngettext=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext\" >&5\n$as_echo \"$ac_cv_lib_intl_ngettext\" >&6; }\nif test \"x$ac_cv_lib_intl_ngettext\" = xyes; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl\" >&5\n$as_echo_n \"checking for dgettext in -lintl... \" >&6; }\nif ${ac_cv_lib_intl_dgettext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lintl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dgettext ();\nint\nmain ()\n{\nreturn dgettext ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_intl_dgettext=yes\nelse\n  ac_cv_lib_intl_dgettext=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext\" >&5\n$as_echo \"$ac_cv_lib_intl_dgettext\" >&6; }\nif test \"x$ac_cv_lib_intl_dgettext\" = xyes; then :\n  gt_cv_func_dgettext_libintl=yes\nfi\n\nfi\n\nfi\n\n\n\tif test \"$gt_cv_func_dgettext_libintl\" != \"yes\" ; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext\" >&5\n$as_echo_n \"checking if -liconv is needed to use gettext... \" >&6; }\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: \" >&5\n$as_echo \"\" >&6; }\n  \t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl\" >&5\n$as_echo_n \"checking for ngettext in -lintl... \" >&6; }\nif ${ac_cv_lib_intl_ngettext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lintl -liconv $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar ngettext ();\nint\nmain ()\n{\nreturn ngettext ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_intl_ngettext=yes\nelse\n  ac_cv_lib_intl_ngettext=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext\" >&5\n$as_echo \"$ac_cv_lib_intl_ngettext\" >&6; }\nif test \"x$ac_cv_lib_intl_ngettext\" = xyes; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl\" >&5\n$as_echo_n \"checking for dcgettext in -lintl... \" >&6; }\nif ${ac_cv_lib_intl_dcgettext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lintl -liconv $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dcgettext ();\nint\nmain ()\n{\nreturn dcgettext ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_intl_dcgettext=yes\nelse\n  ac_cv_lib_intl_dcgettext=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext\" >&5\n$as_echo \"$ac_cv_lib_intl_dcgettext\" >&6; }\nif test \"x$ac_cv_lib_intl_dcgettext\" = xyes; then :\n  gt_cv_func_dgettext_libintl=yes\n\t\t\tlibintl_extra_libs=-liconv\nelse\n  :\nfi\n\nelse\n  :\nfi\n\n        fi\n\n        #\n        # If we found libintl, then check in it for bind_textdomain_codeset();\n        # we'll prefer libc if neither have bind_textdomain_codeset(),\n        # and both have dgettext and ngettext\n        #\n        if test \"$gt_cv_func_dgettext_libintl\" = \"yes\" ; then\n          glib_save_LIBS=\"$LIBS\"\n          LIBS=\"$LIBS -lintl $libintl_extra_libs\"\n          unset ac_cv_func_bind_textdomain_codeset\n          for ac_func in bind_textdomain_codeset\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"bind_textdomain_codeset\" \"ac_cv_func_bind_textdomain_codeset\"\nif test \"x$ac_cv_func_bind_textdomain_codeset\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_BIND_TEXTDOMAIN_CODESET 1\n_ACEOF\n\nfi\ndone\n\n          LIBS=\"$glib_save_LIBS\"\n\n          if test \"$ac_cv_func_bind_textdomain_codeset\" = \"yes\" ; then\n            gt_cv_func_dgettext_libc=no\n          else\n            if test \"$gt_cv_func_dgettext_libc\" = \"yes\" \\\n\t\t&& test \"$gt_cv_func_ngettext_libc\" = \"yes\"; then\n              gt_cv_func_dgettext_libintl=no\n            fi\n          fi\n        fi\n      fi\n\n      if test \"$gt_cv_func_dgettext_libc\" = \"yes\" \\\n\t|| test \"$gt_cv_func_dgettext_libintl\" = \"yes\"; then\n        gt_cv_have_gettext=yes\n      fi\n\n      if test \"$gt_cv_func_dgettext_libintl\" = \"yes\"; then\n        INTLLIBS=\"-lintl $libintl_extra_libs\"\n      fi\n\n      if test \"$gt_cv_have_gettext\" = \"yes\"; then\n\n$as_echo \"#define HAVE_GETTEXT 1\" >>confdefs.h\n\n\t# Extract the first word of \"msgfmt\", so it can be a program name with args.\nset dummy msgfmt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_MSGFMT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case \"$MSGFMT\" in\n  /*)\n  ac_cv_path_MSGFMT=\"$MSGFMT\" # Let the user override the test with a path.\n  ;;\n  *)\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:\"\n  for ac_dir in $PATH; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      if test -z \"`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`\"; then\n\tac_cv_path_MSGFMT=\"$ac_dir/$ac_word\"\n\tbreak\n      fi\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  test -z \"$ac_cv_path_MSGFMT\" && ac_cv_path_MSGFMT=\"no\"\n  ;;\nesac\nfi\nMSGFMT=\"$ac_cv_path_MSGFMT\"\nif test \"$MSGFMT\" != \"no\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MSGFMT\" >&5\n$as_echo \"$MSGFMT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\tif test \"$MSGFMT\" != \"no\"; then\n          glib_save_LIBS=\"$LIBS\"\n          LIBS=\"$LIBS $INTLLIBS\"\n\t  for ac_func in dcgettext\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"dcgettext\" \"ac_cv_func_dcgettext\"\nif test \"x$ac_cv_func_dcgettext\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_DCGETTEXT 1\n_ACEOF\n\nfi\ndone\n\n\t  MSGFMT_OPTS=\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c\" >&5\n$as_echo_n \"checking if msgfmt accepts -c... \" >&6; }\n\t  cat >conftest.foo <<_ACEOF\n\nmsgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: test 1.0\\n\"\n\"PO-Revision-Date: 2007-02-15 12:01+0100\\n\"\n\"Last-Translator: test <foo@bar.xx>\\n\"\n\"Language-Team: C <LL@li.org>\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n_ACEOF\nif { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$MSGFMT -c -o /dev/null conftest.foo\"; } >&5\n  ($MSGFMT -c -o /dev/null conftest.foo) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  MSGFMT_OPTS=-c; { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\necho \"$as_me: failed input was:\" >&5\nsed 's/^/| /' conftest.foo >&5\nfi\n\n\t  # Extract the first word of \"gmsgfmt\", so it can be a program name with args.\nset dummy gmsgfmt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_GMSGFMT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $GMSGFMT in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_GMSGFMT=\"$GMSGFMT\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_path_GMSGFMT=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_GMSGFMT\" && ac_cv_path_GMSGFMT=\"$MSGFMT\"\n  ;;\nesac\nfi\nGMSGFMT=$ac_cv_path_GMSGFMT\nif test -n \"$GMSGFMT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $GMSGFMT\" >&5\n$as_echo \"$GMSGFMT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\t  # Extract the first word of \"xgettext\", so it can be a program name with args.\nset dummy xgettext; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_XGETTEXT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case \"$XGETTEXT\" in\n  /*)\n  ac_cv_path_XGETTEXT=\"$XGETTEXT\" # Let the user override the test with a path.\n  ;;\n  *)\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:\"\n  for ac_dir in $PATH; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      if test -z \"`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`\"; then\n\tac_cv_path_XGETTEXT=\"$ac_dir/$ac_word\"\n\tbreak\n      fi\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  test -z \"$ac_cv_path_XGETTEXT\" && ac_cv_path_XGETTEXT=\":\"\n  ;;\nesac\nfi\nXGETTEXT=\"$ac_cv_path_XGETTEXT\"\nif test \"$XGETTEXT\" != \":\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $XGETTEXT\" >&5\n$as_echo \"$XGETTEXT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\t  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\nextern int _nl_msg_cat_cntr;\n\t\t\t return _nl_msg_cat_cntr\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  CATOBJEXT=.gmo\n             DATADIRNAME=share\nelse\n  case $host in\n\t    *-*-solaris*)\n\t    \t                \t    \t                ac_fn_c_check_func \"$LINENO\" \"bind_textdomain_codeset\" \"ac_cv_func_bind_textdomain_codeset\"\nif test \"x$ac_cv_func_bind_textdomain_codeset\" = xyes; then :\n  CATOBJEXT=.gmo\n               DATADIRNAME=share\nelse\n  CATOBJEXT=.mo\n               DATADIRNAME=lib\nfi\n\n\t    ;;\n\t    *-*-openbsd*)\n\t    CATOBJEXT=.mo\n            DATADIRNAME=share\n\t    ;;\n\t    *)\n\t    CATOBJEXT=.mo\n            DATADIRNAME=lib\n\t    ;;\n\t    esac\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n          LIBS=\"$glib_save_LIBS\"\n\t  INSTOBJEXT=.mo\n\telse\n\t  gt_cv_have_gettext=no\n\tfi\n      fi\n\nfi\n\n\n\n    if test \"$gt_cv_have_gettext\" = \"yes\" ; then\n\n$as_echo \"#define ENABLE_NLS 1\" >>confdefs.h\n\n    fi\n\n        if test \"$XGETTEXT\" != \":\"; then\n                  if $XGETTEXT --omit-header /dev/null 2> /dev/null; then\n        : ;\n      else\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it\" >&5\n$as_echo \"found xgettext program is not GNU xgettext; ignore it\" >&6; }\n        XGETTEXT=\":\"\n      fi\n    fi\n\n    # We need to process the po/ directory.\n    POSUB=po\n\n    ac_config_commands=\"$ac_config_commands default-1\"\n\n\n                for lang in $ALL_LINGUAS; do\n      GMOFILES=\"$GMOFILES $lang.gmo\"\n      POFILES=\"$POFILES $lang.po\"\n    done\n\n\n\n\n\n\n\n\n\n\n\n\n\n   if test \"$gt_cv_have_gettext\" = \"yes\"; then\n     if test \"x$ALL_LINGUAS\" = \"x\"; then\n       LINGUAS=\n     else\n       { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed\" >&5\n$as_echo_n \"checking for catalogs to be installed... \" >&6; }\n       NEW_LINGUAS=\n       for presentlang in $ALL_LINGUAS; do\n         useit=no\n         if test \"%UNSET%\" != \"${LINGUAS-%UNSET%}\"; then\n           desiredlanguages=\"$LINGUAS\"\n         else\n           desiredlanguages=\"$ALL_LINGUAS\"\n         fi\n         for desiredlang in $desiredlanguages; do\n \t   # Use the presentlang catalog if desiredlang is\n           #   a. equal to presentlang, or\n           #   b. a variant of presentlang (because in this case,\n           #      presentlang can be used as a fallback for messages\n           #      which are not translated in the desiredlang catalog).\n           case \"$desiredlang\" in\n             \"$presentlang\"*) useit=yes;;\n           esac\n         done\n         if test $useit = yes; then\n           NEW_LINGUAS=\"$NEW_LINGUAS $presentlang\"\n         fi\n       done\n       LINGUAS=$NEW_LINGUAS\n       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LINGUAS\" >&5\n$as_echo \"$LINGUAS\" >&6; }\n     fi\n\n          if test -n \"$LINGUAS\"; then\n       for lang in $LINGUAS; do CATALOGS=\"$CATALOGS $lang$CATOBJEXT\"; done\n     fi\n   fi\n\n            MKINSTALLDIRS=\n   if test -n \"$ac_aux_dir\"; then\n     MKINSTALLDIRS=\"$ac_aux_dir/mkinstalldirs\"\n   fi\n   if test -z \"$MKINSTALLDIRS\"; then\n     MKINSTALLDIRS=\"\\$(top_srcdir)/mkinstalldirs\"\n   fi\n\n\n         test -d po || mkdir po\n   if test \"x$srcdir\" != \"x.\"; then\n     if test \"x`echo $srcdir | sed 's@/.*@@'`\" = \"x\"; then\n       posrcprefix=\"$srcdir/\"\n     else\n       posrcprefix=\"../$srcdir/\"\n     fi\n   else\n     posrcprefix=\"../\"\n   fi\n   rm -f po/POTFILES\n   sed -e \"/^#/d\" -e \"/^\\$/d\" -e \"s,.*,\t$posrcprefix& \\\\\\\\,\" -e \"\\$s/\\(.*\\) \\\\\\\\/\\1/\" \\\n\t< $srcdir/po/POTFILES.in > po/POTFILES\n\n    PO_DIR=\"po\"\n    PO_MAKEFILE=\"po/Makefile.in\"\n\nfi\n\n# Check whether --enable-wifi was given.\nif test \"${enable_wifi+set}\" = set; then :\n  enableval=$enable_wifi;\n\t\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for main in -lpcap\" >&5\n$as_echo_n \"checking for main in -lpcap... \" >&6; }\nif ${ac_cv_lib_pcap_main+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lpcap  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\nreturn main ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_pcap_main=yes\nelse\n  ac_cv_lib_pcap_main=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_main\" >&5\n$as_echo \"$ac_cv_lib_pcap_main\" >&6; }\nif test \"x$ac_cv_lib_pcap_main\" = xyes; then :\n\n\t\t  $as_echo \"#define EXPERIMENTAL_WIFI_COMM 1\" >>confdefs.h\n\n\t\t  LIBS=\"$LIBS -lpcap\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: pcap library not found, wifi will not work\" >&5\n$as_echo \"$as_me: WARNING: pcap library not found, wifi will not work\" >&2;}\nfi\n\n\nfi\n\n\ncase $host in\n  *mingw*)\n    LIBS=\"$LIBS -ldxguid -ldxerr8 -ldsound -lopengl32 -lws2_32 -mwindows\"\n    UI_DIR=\"windows\"\n    ;;\n  *darwin*)\n    if test \"x$GTK_MACOSX_HACK\" = \"xyes\" ; then\n      LIBS=\"$LIBS -framework Gtk -framework GLib\"\n      CPPFLAGS=\"$CPPFLAGS -I/Library/Frameworks/Cairo.framework/Headers -I/Library/Frameworks/Gtk.framework/Headers -I/Library/Frameworks/GLib.framework/Headers\"\n      GLIB_LIBS=\"\"\n\n    fi\n        $as_echo \"#define HAVE_OPENAL 1\" >>confdefs.h\n\n    LIBS=\"$LIBS -framework OpenGL -framework OpenAL\"\n    CPPFLAGS=\"$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers\"\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for X\" >&5\n$as_echo_n \"checking for X... \" >&6; }\n\n\n# Check whether --with-x was given.\nif test \"${with_x+set}\" = set; then :\n  withval=$with_x;\nfi\n\n# $have_x is `yes', `no', `disabled', or empty when we do not yet know.\nif test \"x$with_x\" = xno; then\n  # The user explicitly disabled X.\n  have_x=disabled\nelse\n  case $x_includes,$x_libraries in #(\n    *\\'*) as_fn_error $? \"cannot use X directory names containing '\" \"$LINENO\" 5;; #(\n    *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # One or both of the vars are not set, and there is no cached value.\nac_x_includes=no ac_x_libraries=no\nrm -f -r conftest.dir\nif mkdir conftest.dir; then\n  cd conftest.dir\n  cat >Imakefile <<'_ACEOF'\nincroot:\n\t@echo incroot='${INCROOT}'\nusrlibdir:\n\t@echo usrlibdir='${USRLIBDIR}'\nlibdir:\n\t@echo libdir='${LIBDIR}'\n_ACEOF\n  if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then\n    # GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\n    for ac_var in incroot usrlibdir libdir; do\n      eval \"ac_im_$ac_var=\\`\\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\\`\"\n    done\n    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.\n    for ac_extension in a so sl dylib la dll; do\n      if test ! -f \"$ac_im_usrlibdir/libX11.$ac_extension\" &&\n\t test -f \"$ac_im_libdir/libX11.$ac_extension\"; then\n\tac_im_usrlibdir=$ac_im_libdir; break\n      fi\n    done\n    # Screen out bogus values from the imake configuration.  They are\n    # bogus both because they are the default anyway, and because\n    # using them would break gcc on systems where it needs fixed includes.\n    case $ac_im_incroot in\n\t/usr/include) ac_x_includes= ;;\n\t*) test -f \"$ac_im_incroot/X11/Xos.h\" && ac_x_includes=$ac_im_incroot;;\n    esac\n    case $ac_im_usrlibdir in\n\t/usr/lib | /usr/lib64 | /lib | /lib64) ;;\n\t*) test -d \"$ac_im_usrlibdir\" && ac_x_libraries=$ac_im_usrlibdir ;;\n    esac\n  fi\n  cd ..\n  rm -f -r conftest.dir\nfi\n\n# Standard set of common directories for X headers.\n# Check X11 before X11Rn because it is often a symlink to the current release.\nac_x_header_dirs='\n/usr/X11/include\n/usr/X11R7/include\n/usr/X11R6/include\n/usr/X11R5/include\n/usr/X11R4/include\n\n/usr/include/X11\n/usr/include/X11R7\n/usr/include/X11R6\n/usr/include/X11R5\n/usr/include/X11R4\n\n/usr/local/X11/include\n/usr/local/X11R7/include\n/usr/local/X11R6/include\n/usr/local/X11R5/include\n/usr/local/X11R4/include\n\n/usr/local/include/X11\n/usr/local/include/X11R7\n/usr/local/include/X11R6\n/usr/local/include/X11R5\n/usr/local/include/X11R4\n\n/usr/X386/include\n/usr/x386/include\n/usr/XFree86/include/X11\n\n/usr/include\n/usr/local/include\n/usr/unsupported/include\n/usr/athena/include\n/usr/local/x11r5/include\n/usr/lpp/Xamples/include\n\n/usr/openwin/include\n/usr/openwin/share/include'\n\nif test \"$ac_x_includes\" = no; then\n  # Guess where to find include files, by looking for Xlib.h.\n  # First, try using that file with no special directory specified.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <X11/Xlib.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # We can compile using X headers with no special include directory.\nac_x_includes=\nelse\n  for ac_dir in $ac_x_header_dirs; do\n  if test -r \"$ac_dir/X11/Xlib.h\"; then\n    ac_x_includes=$ac_dir\n    break\n  fi\ndone\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\nfi # $ac_x_includes = no\n\nif test \"$ac_x_libraries\" = no; then\n  # Check for the libraries.\n  # See if we find them without any special options.\n  # Don't add to $LIBS permanently.\n  ac_save_LIBS=$LIBS\n  LIBS=\"-lX11 $LIBS\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <X11/Xlib.h>\nint\nmain ()\n{\nXrmInitialize ()\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  LIBS=$ac_save_LIBS\n# We can link X programs with no special library path.\nac_x_libraries=\nelse\n  LIBS=$ac_save_LIBS\nfor ac_dir in `$as_echo \"$ac_x_includes $ac_x_header_dirs\" | sed s/include/lib/g`\ndo\n  # Don't even attempt the hair of trying to link an X program!\n  for ac_extension in a so sl dylib la dll; do\n    if test -r \"$ac_dir/libX11.$ac_extension\"; then\n      ac_x_libraries=$ac_dir\n      break 2\n    fi\n  done\ndone\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi # $ac_x_libraries = no\n\ncase $ac_x_includes,$ac_x_libraries in #(\n  no,* | *,no | *\\'*)\n    # Didn't find X, or a directory has \"'\" in its name.\n    ac_cv_have_x=\"have_x=no\";; #(\n  *)\n    # Record where we found X for the cache.\n    ac_cv_have_x=\"have_x=yes\\\n\tac_x_includes='$ac_x_includes'\\\n\tac_x_libraries='$ac_x_libraries'\"\nesac\nfi\n;; #(\n    *) have_x=yes;;\n  esac\n  eval \"$ac_cv_have_x\"\nfi # $with_x != no\n\nif test \"$have_x\" != yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $have_x\" >&5\n$as_echo \"$have_x\" >&6; }\n  no_x=yes\nelse\n  # If each of the values was on the command line, it overrides each guess.\n  test \"x$x_includes\" = xNONE && x_includes=$ac_x_includes\n  test \"x$x_libraries\" = xNONE && x_libraries=$ac_x_libraries\n  # Update the cache value to reflect the command line values.\n  ac_cv_have_x=\"have_x=yes\\\n\tac_x_includes='$x_includes'\\\n\tac_x_libraries='$x_libraries'\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes\" >&5\n$as_echo \"libraries $x_libraries, headers $x_includes\" >&6; }\nfi\n\nif test \"$no_x\" = yes; then\n  # Not all programs may use this symbol, but it does not hurt to define it.\n\n$as_echo \"#define X_DISPLAY_MISSING 1\" >>confdefs.h\n\n  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=\nelse\n  if test -n \"$x_includes\"; then\n    X_CFLAGS=\"$X_CFLAGS -I$x_includes\"\n  fi\n\n  # It would also be nice to do this for all -L options, not just this one.\n  if test -n \"$x_libraries\"; then\n    X_LIBS=\"$X_LIBS -L$x_libraries\"\n    # For Solaris; some versions of Sun CC require a space after -R and\n    # others require no space.  Words are not sufficient . . . .\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space\" >&5\n$as_echo_n \"checking whether -R must be followed by a space... \" >&6; }\n    ac_xsave_LIBS=$LIBS; LIBS=\"$LIBS -R$x_libraries\"\n    ac_xsave_c_werror_flag=$ac_c_werror_flag\n    ac_c_werror_flag=yes\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n       X_LIBS=\"$X_LIBS -R$x_libraries\"\nelse\n  LIBS=\"$ac_xsave_LIBS -R $x_libraries\"\n       cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\t  X_LIBS=\"$X_LIBS -R $x_libraries\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: neither works\" >&5\n$as_echo \"neither works\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    ac_c_werror_flag=$ac_xsave_c_werror_flag\n    LIBS=$ac_xsave_LIBS\n  fi\n\n  # Check for system-dependent libraries X programs must link with.\n  # Do this before checking for the system-independent R6 libraries\n  # (-lICE), since we may need -lsocket or whatever for X linking.\n\n  if test \"$ISC\" = yes; then\n    X_EXTRA_LIBS=\"$X_EXTRA_LIBS -lnsl_s -linet\"\n  else\n    # Martyn Johnson says this is needed for Ultrix, if the X\n    # libraries were built with DECnet support.  And Karl Berry says\n    # the Alpha needs dnet_stub (dnet does not exist).\n    ac_xsave_LIBS=\"$LIBS\"; LIBS=\"$LIBS $X_LIBS -lX11\"\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar XOpenDisplay ();\nint\nmain ()\n{\nreturn XOpenDisplay ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet\" >&5\n$as_echo_n \"checking for dnet_ntoa in -ldnet... \" >&6; }\nif ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldnet  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dnet_ntoa ();\nint\nmain ()\n{\nreturn dnet_ntoa ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dnet_dnet_ntoa=yes\nelse\n  ac_cv_lib_dnet_dnet_ntoa=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa\" >&5\n$as_echo \"$ac_cv_lib_dnet_dnet_ntoa\" >&6; }\nif test \"x$ac_cv_lib_dnet_dnet_ntoa\" = xyes; then :\n  X_EXTRA_LIBS=\"$X_EXTRA_LIBS -ldnet\"\nfi\n\n    if test $ac_cv_lib_dnet_dnet_ntoa = no; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub\" >&5\n$as_echo_n \"checking for dnet_ntoa in -ldnet_stub... \" >&6; }\nif ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldnet_stub  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dnet_ntoa ();\nint\nmain ()\n{\nreturn dnet_ntoa ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dnet_stub_dnet_ntoa=yes\nelse\n  ac_cv_lib_dnet_stub_dnet_ntoa=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa\" >&5\n$as_echo \"$ac_cv_lib_dnet_stub_dnet_ntoa\" >&6; }\nif test \"x$ac_cv_lib_dnet_stub_dnet_ntoa\" = xyes; then :\n  X_EXTRA_LIBS=\"$X_EXTRA_LIBS -ldnet_stub\"\nfi\n\n    fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    LIBS=\"$ac_xsave_LIBS\"\n\n    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,\n    # to get the SysV transport functions.\n    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)\n    # needs -lnsl.\n    # The nsl library prevents programs from opening the X display\n    # on Irix 5.2, according to T.E. Dickey.\n    # The functions gethostbyname, getservbyname, and inet_addr are\n    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.\n    ac_fn_c_check_func \"$LINENO\" \"gethostbyname\" \"ac_cv_func_gethostbyname\"\nif test \"x$ac_cv_func_gethostbyname\" = xyes; then :\n\nfi\n\n    if test $ac_cv_func_gethostbyname = no; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl\" >&5\n$as_echo_n \"checking for gethostbyname in -lnsl... \" >&6; }\nif ${ac_cv_lib_nsl_gethostbyname+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lnsl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gethostbyname ();\nint\nmain ()\n{\nreturn gethostbyname ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_nsl_gethostbyname=yes\nelse\n  ac_cv_lib_nsl_gethostbyname=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname\" >&5\n$as_echo \"$ac_cv_lib_nsl_gethostbyname\" >&6; }\nif test \"x$ac_cv_lib_nsl_gethostbyname\" = xyes; then :\n  X_EXTRA_LIBS=\"$X_EXTRA_LIBS -lnsl\"\nfi\n\n      if test $ac_cv_lib_nsl_gethostbyname = no; then\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd\" >&5\n$as_echo_n \"checking for gethostbyname in -lbsd... \" >&6; }\nif ${ac_cv_lib_bsd_gethostbyname+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lbsd  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gethostbyname ();\nint\nmain ()\n{\nreturn gethostbyname ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_bsd_gethostbyname=yes\nelse\n  ac_cv_lib_bsd_gethostbyname=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname\" >&5\n$as_echo \"$ac_cv_lib_bsd_gethostbyname\" >&6; }\nif test \"x$ac_cv_lib_bsd_gethostbyname\" = xyes; then :\n  X_EXTRA_LIBS=\"$X_EXTRA_LIBS -lbsd\"\nfi\n\n      fi\n    fi\n\n    # lieder@skyler.mavd.honeywell.com says without -lsocket,\n    # socket/setsockopt and other routines are undefined under SCO ODT\n    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary\n    # on later versions), says Simon Leinen: it contains gethostby*\n    # variants that don't use the name server (or something).  -lsocket\n    # must be given before -lnsl if both are needed.  We assume that\n    # if connect needs -lnsl, so does gethostbyname.\n    ac_fn_c_check_func \"$LINENO\" \"connect\" \"ac_cv_func_connect\"\nif test \"x$ac_cv_func_connect\" = xyes; then :\n\nfi\n\n    if test $ac_cv_func_connect = no; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket\" >&5\n$as_echo_n \"checking for connect in -lsocket... \" >&6; }\nif ${ac_cv_lib_socket_connect+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsocket $X_EXTRA_LIBS $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar connect ();\nint\nmain ()\n{\nreturn connect ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_socket_connect=yes\nelse\n  ac_cv_lib_socket_connect=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect\" >&5\n$as_echo \"$ac_cv_lib_socket_connect\" >&6; }\nif test \"x$ac_cv_lib_socket_connect\" = xyes; then :\n  X_EXTRA_LIBS=\"-lsocket $X_EXTRA_LIBS\"\nfi\n\n    fi\n\n    # Guillermo Gomez says -lposix is necessary on A/UX.\n    ac_fn_c_check_func \"$LINENO\" \"remove\" \"ac_cv_func_remove\"\nif test \"x$ac_cv_func_remove\" = xyes; then :\n\nfi\n\n    if test $ac_cv_func_remove = no; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for remove in -lposix\" >&5\n$as_echo_n \"checking for remove in -lposix... \" >&6; }\nif ${ac_cv_lib_posix_remove+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lposix  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar remove ();\nint\nmain ()\n{\nreturn remove ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_posix_remove=yes\nelse\n  ac_cv_lib_posix_remove=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove\" >&5\n$as_echo \"$ac_cv_lib_posix_remove\" >&6; }\nif test \"x$ac_cv_lib_posix_remove\" = xyes; then :\n  X_EXTRA_LIBS=\"$X_EXTRA_LIBS -lposix\"\nfi\n\n    fi\n\n    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.\n    ac_fn_c_check_func \"$LINENO\" \"shmat\" \"ac_cv_func_shmat\"\nif test \"x$ac_cv_func_shmat\" = xyes; then :\n\nfi\n\n    if test $ac_cv_func_shmat = no; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc\" >&5\n$as_echo_n \"checking for shmat in -lipc... \" >&6; }\nif ${ac_cv_lib_ipc_shmat+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lipc  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shmat ();\nint\nmain ()\n{\nreturn shmat ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_ipc_shmat=yes\nelse\n  ac_cv_lib_ipc_shmat=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat\" >&5\n$as_echo \"$ac_cv_lib_ipc_shmat\" >&6; }\nif test \"x$ac_cv_lib_ipc_shmat\" = xyes; then :\n  X_EXTRA_LIBS=\"$X_EXTRA_LIBS -lipc\"\nfi\n\n    fi\n  fi\n\n  # Check for libraries that X11R6 Xt/Xaw programs need.\n  ac_save_LDFLAGS=$LDFLAGS\n  test -n \"$x_libraries\" && LDFLAGS=\"$LDFLAGS -L$x_libraries\"\n  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to\n  # check for ICE first), but we must link in the order -lSM -lICE or\n  # we get undefined symbols.  So assume we have SM if we have ICE.\n  # These have to be linked with before -lX11, unlike the other\n  # libraries we check for below, so use a different variable.\n  # John Interrante, Karl Berry\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE\" >&5\n$as_echo_n \"checking for IceConnectionNumber in -lICE... \" >&6; }\nif ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lICE $X_EXTRA_LIBS $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar IceConnectionNumber ();\nint\nmain ()\n{\nreturn IceConnectionNumber ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_ICE_IceConnectionNumber=yes\nelse\n  ac_cv_lib_ICE_IceConnectionNumber=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber\" >&5\n$as_echo \"$ac_cv_lib_ICE_IceConnectionNumber\" >&6; }\nif test \"x$ac_cv_lib_ICE_IceConnectionNumber\" = xyes; then :\n  X_PRE_LIBS=\"$X_PRE_LIBS -lSM -lICE\"\nfi\n\n  LDFLAGS=$ac_save_LDFLAGS\n\nfi\n\n    ;;\nesac\n\n\n\n\n# Check whether --enable-gdb-stub was given.\nif test \"${enable_gdb_stub+set}\" = set; then :\n  enableval=$enable_gdb_stub;\n\t\t\t$as_echo \"#define GDB_STUB 1\" >>confdefs.h\n\n\t\t\twantgdbstub=yes\n\nfi\n\n if test \"${wantgdbstub}\" = \"yes\"; then\n  HAVE_GDB_STUB_TRUE=\n  HAVE_GDB_STUB_FALSE='#'\nelse\n  HAVE_GDB_STUB_TRUE='#'\n  HAVE_GDB_STUB_FALSE=\nfi\n\n\n\n# for developer use, enable lots of compile warnings,\n# but don't require this generally, because some system's\n# header files (BSD) can't handle it\n#\n# NB: must add -Werror after AC_PROG_CC, etc., so do this last\n# Check whether --enable-hardcore was given.\nif test \"${enable_hardcore+set}\" = set; then :\n  enableval=$enable_hardcore; case \"${enableval}\" in\n                yes) ENABLE_HARDCORE=1 ;;\n                no) ENABLE_HARDCORE=0 ;;\n                *) as_fn_error $? \"bad value ${enableval} for --enable-hardcore\" \"$LINENO\" 5 ;;              esac\nelse\n  ENABLE_HARDCORE=0\nfi\n\n\nif test \"x$ENABLE_HARDCORE\" = \"x1\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: enable hardcore compile warnings\" >&5\n$as_echo \"$as_me: WARNING: enable hardcore compile warnings\" >&2;}\n  if test \"x$CXX\" = \"x\"; then\n        CPPFLAGS=\"$CPPFLAGS -Wmissing-prototypes\"\n  fi\n      CPPFLAGS=\"$CPPFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -Wno-missing-field-initializers -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-unused-parameter -Wmissing-declarations -Wundef -Wmissing-noreturn -Wredundant-decls -Wformat-nonliteral -Wformat-security -Winit-self -Wno-reorder\"\nfi\n\n# Check whether --enable-debug was given.\nif test \"${enable_debug+set}\" = set; then :\n  enableval=$enable_debug; $as_echo \"#define DEBUG 1\" >>confdefs.h\n\nfi\n\n# Check whether --enable-gpu-debug was given.\nif test \"${enable_gpu_debug+set}\" = set; then :\n  enableval=$enable_gpu_debug; $as_echo \"#define GPUDEBUG 1\" >>confdefs.h\n\nfi\n\n# Check whether --enable-div-debug was given.\nif test \"${enable_div_debug+set}\" = set; then :\n  enableval=$enable_div_debug; $as_echo \"#define DIVDEBUG 1\" >>confdefs.h\n\nfi\n\n# Check whether --enable-sqrt-debug was given.\nif test \"${enable_sqrt_debug+set}\" = set; then :\n  enableval=$enable_sqrt_debug; $as_echo \"#define SQRTDEBUG 1\" >>confdefs.h\n\nfi\n\n# Check whether --enable-dma-debug was given.\nif test \"${enable_dma_debug+set}\" = set; then :\n  enableval=$enable_dma_debug; $as_echo \"#define DMADEBUG 1\" >>confdefs.h\n\nfi\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles\" >&5\n$as_echo_n \"checking whether to enable maintainer-specific portions of Makefiles... \" >&6; }\n    # Check whether --enable-maintainer-mode was given.\nif test \"${enable_maintainer_mode+set}\" = set; then :\n  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval\nelse\n  USE_MAINTAINER_MODE=no\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE\" >&5\n$as_echo \"$USE_MAINTAINER_MODE\" >&6; }\n   if test $USE_MAINTAINER_MODE = yes; then\n  MAINTAINER_MODE_TRUE=\n  MAINTAINER_MODE_FALSE='#'\nelse\n  MAINTAINER_MODE_TRUE='#'\n  MAINTAINER_MODE_FALSE=\nfi\n\n  MAINT=$MAINTAINER_MODE_TRUE\n\n\n\n\n\nac_config_files=\"$ac_config_files Makefile ${PO_MAKEFILE} src/Makefile src/cli/Makefile src/cli/doc/Makefile src/gtk/Makefile src/gtk/doc/Makefile src/gtk-glade/Makefile src/gtk-glade/doc/Makefile src/wx/Makefile src/gdbstub/Makefile autopackage/default.apspec\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\n# Transform confdefs.h into DEFS.\n# Protect against shell expansion while executing Makefile rules.\n# Protect against Makefile macro expansion.\n#\n# If the first sed substitution is executed (which looks for macros that\n# take arguments), then branch to the quote section.  Otherwise,\n# look for a macro that doesn't take arguments.\nac_script='\n:mline\n/\\\\$/{\n N\n s,\\\\\\n,,\n b mline\n}\nt clear\n:clear\ns/^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t (][^\t (]*([^)]*)\\)[\t ]*\\(.*\\)/-D\\1=\\2/g\nt quote\ns/^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t ][^\t ]*\\)[\t ]*\\(.*\\)/-D\\1=\\2/g\nt quote\nb any\n:quote\ns/[\t `~#$^&*(){}\\\\|;'\\''\"<>?]/\\\\&/g\ns/\\[/\\\\&/g\ns/\\]/\\\\&/g\ns/\\$/$$/g\nH\n:any\n${\n\tg\n\ts/^\\n//\n\ts/\\n/ /g\n\tp\n}\n'\nDEFS=`sed -n \"$ac_script\" confdefs.h`\n\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCXX_TRUE}\" && test -z \"${am__fastdepCXX_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCXX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n\n  ac_config_commands=\"$ac_config_commands po/stamp-it\"\n\n\nif test -z \"${HAVE_GL_TRUE}\" && test -z \"${HAVE_GL_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_GL\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_LIBOSMESA_TRUE}\" && test -z \"${HAVE_LIBOSMESA_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_LIBOSMESA\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_OPENAL_TRUE}\" && test -z \"${HAVE_OPENAL_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_OPENAL\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_LUA_TRUE}\" && test -z \"${HAVE_LUA_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_LUA\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_ALSA_TRUE}\" && test -z \"${HAVE_ALSA_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_ALSA\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_LIBAGG_TRUE}\" && test -z \"${HAVE_LIBAGG_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_LIBAGG\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_LIBSOUNDTOUCH_TRUE}\" && test -z \"${HAVE_LIBSOUNDTOUCH_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_LIBSOUNDTOUCH\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_WX_TRUE}\" && test -z \"${HAVE_WX_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_WX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_GDB_STUB_TRUE}\" && test -z \"${HAVE_GDB_STUB_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_GDB_STUB\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${MAINTAINER_MODE_TRUE}\" && test -z \"${MAINTAINER_MODE_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"MAINTAINER_MODE\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by desmume $as_me 0.9.8, which was\ngenerated by GNU Autoconf 2.68.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n\nConfiguration files:\n$config_files\n\nConfiguration commands:\n$config_commands\n\nReport bugs to the package provider.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\ndesmume config.status 0.9.8\nconfigured by $0, generated by GNU Autoconf 2.68,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2010 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h |  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X '$SHELL' '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"\n\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"default-1\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS default-1\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"${PO_MAKEFILE}\") CONFIG_FILES=\"$CONFIG_FILES ${PO_MAKEFILE}\" ;;\n    \"src/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/Makefile\" ;;\n    \"src/cli/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/cli/Makefile\" ;;\n    \"src/cli/doc/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/cli/doc/Makefile\" ;;\n    \"src/gtk/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/gtk/Makefile\" ;;\n    \"src/gtk/doc/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/gtk/doc/Makefile\" ;;\n    \"src/gtk-glade/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/gtk-glade/Makefile\" ;;\n    \"src/gtk-glade/doc/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/gtk-glade/doc/Makefile\" ;;\n    \"src/wx/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/wx/Makefile\" ;;\n    \"src/gdbstub/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/gdbstub/Makefile\" ;;\n    \"autopackage/default.apspec\") CONFIG_FILES=\"$CONFIG_FILES autopackage/default.apspec\" ;;\n    \"po/stamp-it\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS po/stamp-it\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n\neval set X \"  :F $CONFIG_FILES      :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n\n\n  :C)  { $as_echo \"$as_me:${as_lineno-$LINENO}: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`$as_dirname -- \"$mf\" ||\n$as_expr X\"$mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`$as_dirname -- \"$file\" ||\n$as_expr X\"$file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$file\" : 'X\\(//\\)$' \\| \\\n\t X\"$file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      as_dir=$dirpart/$fdir; as_fn_mkdir_p\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n ;;\n    \"default-1\":C) case \"$CONFIG_FILES\" in *po/Makefile.in*)\n        sed -e \"/POTFILES =/r po/POTFILES\" po/Makefile.in > po/Makefile\n      esac ;;\n    \"po/stamp-it\":C)\n    if  ! grep \"^# INTLTOOL_MAKEFILE$\" \"po/Makefile.in\" > /dev/null ; then\n       as_fn_error $? \"po/Makefile.in.in was not created by intltoolize.\" \"$LINENO\" 5\n    fi\n    rm -f \"po/stamp-it\" \"po/stamp-it.tmp\" \"po/POTFILES\" \"po/Makefile.tmp\"\n    >\"po/stamp-it.tmp\"\n    sed '/^#/d\n\t s/^[[].*] *//\n\t /^[ \t]*$/d\n\t'\"s|^|\t$ac_top_srcdir/|\" \\\n      \"$srcdir/po/POTFILES.in\" | sed '$!s/$/ \\\\/' >\"po/POTFILES\"\n\n    sed '/^POTFILES =/,/[^\\\\]$/ {\n\t\t/^POTFILES =/!d\n\t\tr po/POTFILES\n\t  }\n\t ' \"po/Makefile.in\" >\"po/Makefile\"\n    rm -f \"po/Makefile.tmp\"\n    mv \"po/stamp-it.tmp\" \"po/stamp-it\"\n   ;;\n\n  esac\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/configure.ac",
    "content": "dnl --- Package name is first argument to AC_INIT\ndnl --- Release version is second argument to AC_INIT\n\nAC_INIT(desmume, [0.9.8])\n\ndnl -- find host architecture for some os specific libraries\nAC_CANONICAL_HOST\ncase $host in\n  *linux*) desmume_arch=linux;;\n  *mingw*) desmume_arch=windows;;\n  *darwin*) desmume_arch=linux;;\n  *bsd*) desmume_arch=linux;;\nesac\nAC_SUBST(desmume_arch)\n\nAM_INIT_AUTOMAKE([1.10])\n\ndnl -- make sure we have a c++ compiler\nAC_PROG_CXX\n\ndnl -- use ranlib for libraries\nAC_PROG_RANLIB\n\ndnl -- check for endianess\nAC_C_BIGENDIAN\n\n# took this from geany, hope it works\nREVISION=\"r0\"\nSVN=`which svn 2>/dev/null`\nif test -d \".svn\" -a \"x${SVN}\" != \"x\" -a -x \"${SVN}\" ; then\n  REVISION=r`$SVN info|grep 'Last Changed Rev'|cut -d' ' -f4`\nfi\nAC_DEFINE_UNQUOTED([SVN_REV], \"$REVISION\", [subversion revision number])\n\n\ndnl --- Other prerequisites ---\ndnl - Check for pkg-config macros\nm4_ifdef([PKG_PROG_PKG_CONFIG], [PKG_PROG_PKG_CONFIG])\ndnl - Check for intltool/gettext macros\nm4_ifdef([IT_PROG_INTLTOOL],[IT_PROG_INTLTOOL])\n\nAC_CHECK_TOOL(HAVE_PKG, pkg-config, [])\nif test \"xHAVE_PKG\" = \"x\" ; then\n  AC_MSG_ERROR([pkg-config is required to build desmume])\nfi\n\ndnl - Check for zlib\nAC_CHECK_LIB(z, gzopen, [], [AC_MSG_ERROR([zlib was not found, we can't go further. Please install it or specify the location where it's installed.])])\n\ndnl - Check for zziplib\nAC_CHECK_LIB(zzip, zzip_open, [\n\tLIBS=\"-lzzip $LIBS\"\n\tAC_DEFINE([HAVE_LIBZZIP])\n\tAC_MSG_CHECKING([[whether zzip use void * as second parameter]])\n\tAC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <zzip/lib.h>]], [[\n\t\tvoid * v;\n\t\tzzip_read(NULL, v, 0);]])],\n\t\tAC_MSG_RESULT(yes),\n\t\tAC_DEFINE([ZZIP_OLD_READ])\n\t\tAC_MSG_RESULT(no))\n])\n\ndnl - Check for SDL\nAC_PATH_PROGS(SDLCONFIG, [sdl-config sdl11-config])\nif test ! \"x$SDLCONFIG\" = \"x\" ; then\n  SDL_CFLAGS=`$SDLCONFIG --cflags`\n  SDL_LIBS=`$SDLCONFIG --libs`\n  AC_SUBST(SDL_CFLAGS)\n  AC_SUBST(SDL_LIBS)\nelse\n  AC_MSG_ERROR([sdl is required to build desmume])\nfi\n\ndnl - Check for the OpenGL includes\nAC_CHECK_HEADERS([GL/gl.h],\n\t\t [AC_CHECK_HEADERS([GL/glu.h], [have_gl_h=yes LIBS=\"$LIBS -lGLU\"], [have_gl_h=no])],\n\t\t [have_gl_h=no])\nif test \"have_gl_h\" = \"no\" ; then\n\tAC_MSG_WARN([Building without GL support because of missing headers.])\nfi\nAM_CONDITIONAL([HAVE_GL], [test \"${have_gl_h}\" = \"yes\"])\n\ndnl - if --enable-osmesa is used, check for it\nAC_ARG_ENABLE([osmesa],\n               [AC_HELP_STRING([--enable-osmesa], [use off-screen mesa])],\n               [osmesa=$enableval],\n               [osmesa=yes])\n\nif test \"x$osmesa\" = \"xyes\" ; then\n\tAC_CHECK_LIB(dl, main)\n\tAC_CHECK_LIB([GL], main)\n\tAC_CHECK_LIB(OSMesa, main,[\n\t\tuseosmesa=yes\n\t\tAC_DEFINE(HAVE_LIBOSMESA)\n\t\tOSMESA_LIBS=\"-lOSMesa\"\n\t\tAC_SUBST(OSMESA_LIBS)\n\t])\nfi\nAM_CONDITIONAL([HAVE_LIBOSMESA], [test \"${useosmesa}\" = \"yes\"])\n\ndnl - make the usage of libagg for HUD rendering configurable\nAC_ARG_ENABLE([hud],\n              [AC_HELP_STRING([--enable-hud], [Enable HUD rendering, requires libagg])],\n              [libagg=yes])\n\ndnl - hack to help zero build gtk frontend macos x package\nAC_ARG_ENABLE(macosxhack,\n\t      [AC_HELP_STRING(--enable-macosxhack, hack to build MacOSX package)],\n\t      [GTK_MACOSX_HACK=yes])\n\nHAVE_OPENAL=no\ndnl - openal support\nAC_ARG_ENABLE(openal,\n\t      [AC_HELP_STRING(--enable-openal, enable experimental OpenAL microphone input)],\n\t      [openal=yes])\n\nif test \"x$openal\" = \"xyes\" ; then\n\tAC_CHECK_LIB([openal], [main],[\n                HAVE_OPENAL=yes\n\t\tLIBS=\"$LIBS -lopenal\"\n\t])\nfi\nAM_CONDITIONAL([HAVE_OPENAL], [test \"${HAVE_OPENAL}\" = \"yes\"])\n\ndnl - Check for GTK and/or libglade\nFOUND_GLIB=no\nHAVE_ALSA=no\nGLIB_VER=2.8\nGTK_VER=2.14\n\nPKG_CHECK_MODULES(GLIB,\n                  glib-2.0 >= $GLIB_VER,\n                  FOUND_GLIB=yes,\n                  FOUND_GLIB=no)\nif test \"x$FOUND_GLIB\" = \"xno\"; then\n   if test ! \"x$GTK_MACOSX_HACK\" = \"xyes\"; then\n     AC_MSG_ERROR([Glib is required to build desmume])\n   fi\nfi\n\nPKG_CHECK_MODULES(GTK,\n                  gtk+-2.0 >= $GTK_VER,\n                  HAVE_GTK=yes,\n                  HAVE_GTK=no)\nAC_SUBST(GTK_CFLAGS)\nAC_SUBST(GTK_LIBS)\n\n\nPKG_CHECK_MODULES(GTHREAD,\n                  \"gthread-2.0\",\n                  HAVE_GTHREAD=yes,\n                  HAVE_GTHREAD=no)\nAC_SUBST(GTHREAD_CFLAGS)\nAC_SUBST(GTHREAD_LIBS)\n\nAC_ARG_ENABLE([glade],\n               [AC_HELP_STRING([--enable-glade], [enable glade frontend])],\n               [glade=$enableval],\n               [glade=yes])\n\nif test \"x$glade\" = \"xyes\" ; then\n    PKG_CHECK_MODULES(LIBGLADE,\n                      \"libglade-2.0\",\n                      HAVE_LIBGLADE=yes,\n                      HAVE_LIBGLADE=no)\n    AC_SUBST(LIBGLADE_CFLAGS)\n    AC_SUBST(LIBGLADE_LIBS)\n\n    dnl uninstalled glade ui dir\n    AC_DEFINE_UNQUOTED(GLADEUI_UNINSTALLED_DIR,\"`pwd`/src/gtk-glade/glade/\",[path to glade ui dir])\n    AC_SUBST(GLADEUI_UNINSTALLED_DIR)\n\n    PKG_CHECK_MODULES(GTKGLEXT,\n                      \"gtkglext-1.0\",\n                      AC_DEFINE([GTKGLEXT_AVAILABLE], [1])\n                      [])\n    AC_SUBST(GTKGLEXT_CFLAGS)\n    AC_SUBST(GTKGLEXT_LIBS)\nfi\n\nAC_PATH_PROG(UPDATEDESKTOP, [update-desktop-database])\n\n# Need check for both lua and lua5.1 to run on debian, see mysql bug #29945\nPKG_CHECK_MODULES(LUA,\n                  lua >= 5.1,\n                  HAVE_LUA=yes,\n                  HAVE_LUA=no)\nPKG_CHECK_MODULES(LUA,\n                  lua5.1 >= 5.1,\n                  HAVE_LUA=yes,\n                  HAVE_LUA=no)\nAC_SUBST(LUA_CFLAGS)\nAC_SUBST(LUA_LIBS)\ndnl -- force lua disabled\nAM_CONDITIONAL([HAVE_LUA], [test \"${HAVE_LUA}x\" = \"yes\"])\n\nif test ! \"x$HAVE_OPENAL\" = \"xyes\" ; then\n  PKG_CHECK_MODULES(ALSA, alsa >= 1.0, HAVE_ALSA=yes, HAVE_ALSA=no)\n  AC_SUBST(ALSA_CFLAGS)\n  AC_SUBST(ALSA_LIBS)\nfi\nAM_CONDITIONAL([HAVE_ALSA], [test \"${HAVE_ALSA}\" = \"yes\"])\n\nPKG_CHECK_MODULES(LIBAGG, libagg >= 2.5.0, FOUND_LIBAGG=yes, FOUND_LIBAGG=no)\nAM_CONDITIONAL([HAVE_LIBAGG], [test \"x$libagg\" = \"xyes\" -a \"${FOUND_LIBAGG}\" = \"yes\"])\nif test \"x$libagg\" = \"xyes\" ; then\n   if test \"x$FOUND_LIBAGG\" = \"xyes\" ; then\n       AC_SUBST(LIBAGG_CFLAGS)\n       AC_SUBST(LIBAGG_LIBS)\n       AC_DEFINE([HAVE_LIBAGG])\n   else\n       AC_MSG_WARN([HUD rendering enabled, but libagg not found])\n   fi\nfi\n\nPKG_CHECK_MODULES(LIBSOUNDTOUCH, soundtouch >= 1.5.0, HAVE_LIBSOUNDTOUCH=yes, HAVE_LIBSOUNDTOUCH=no)\nAC_SUBST(LIBSOUNDTOUCH_CFLAGS)\nAC_SUBST(LIBSOUNDTOUCH_LIBS)\nAM_CONDITIONAL([HAVE_LIBSOUNDTOUCH], [test \"${HAVE_LIBSOUNDTOUCH}\" = \"yes\"])\nif test \"x$HAVE_LIBSOUNDTOUCH\" = \"xyes\"; then\n   AC_DEFINE([HAVE_LIBSOUNDTOUCH])\nelse\n   AC_MSG_WARN([SoundTouch library not found, pcsx2 resampler will be disabled])\nfi\n\nif test \"x$HAVE_ALSA\" = \"xno\"; then\n   if test \"x$HAVE_OPENAL\" = \"xno\"; then\n      AC_DEFINE([FAKE_MIC])\n   fi\nfi\n\ndnl - Check for wxWidgets\n\ndnl - if --enable-wxwidgets is used, check for it\nAC_ARG_ENABLE([wxwidgets],\n               [AC_HELP_STRING([--enable-wxwidgets], [Enable cross platform wx widgets frontend])],\n               [wxwidgets=$enableval],\n               [wxwidgets=no])\nif test \"x$wxwidgets\" = \"xyes\" ; then\n\tm4_include(wxwin.m4)\n\tAM_PATH_WXCONFIG([2.4.0], wxwin=yes)\n\tif test \"x$wxwin\" = \"xyes\"; then\n\t\tAC_SUBST(WX_CPPFLAGS)\n\t\tAC_SUBST(WX_LIBS)\n   \t\tAC_DEFINE([WANT_WX])\n\tfi\nfi\n\nAM_CONDITIONAL([HAVE_WX], [test \"x$wxwidgets\" = \"xyes\"])\n\ndnl - Determine which UIs to build and if po/ should be included\nPO_DIR=\"\"\nUI_DIR=\"cli $UI_DIR\"\nif test \"x$HAVE_GTK\" = \"xyes\"; then\n  UI_DIR=\"gtk $UI_DIR\"\nfi\nif test \"x$wxwin\" = \"xyes\"; then\n  UI_DIR=\"wx $UI_DIR\"\nfi\n\nif test \"x$HAVE_LIBGLADE\" = \"xyes\"; then\n  AC_PROVIDE_IFELSE([IT_PROG_INTLTOOL],[\n    UI_DIR=\"gtk-glade $UI_DIR\"\n\n    dnl -- localization for gtk-glade UI\n    GETTEXT_PACKAGE=desmume\n    AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, \"$GETTEXT_PACKAGE\", [Define to the gettext package name])\n    AC_SUBST(GETTEXT_PACKAGE)\n    ALL_LINGUAS=\"fr nb pt_BR sv zh_CN zh_TW\"\n    AM_GLIB_GNU_GETTEXT\n    PO_DIR=\"po\"\n    PO_MAKEFILE=\"po/Makefile.in\"\n  ],[\n    echo \"WARNING: intltool and/or gettext are not available therefore the gtk-glade interface won't be installed.\"\n  ])\nfi\n\ndnl - wifi support\nAC_ARG_ENABLE(wifi,\n\t      [AC_HELP_STRING(--enable-wifi, enable experimental wifi comm support)],\n\t      [\n\t\tAC_CHECK_LIB(pcap, main,[\n\t\t  AC_DEFINE(EXPERIMENTAL_WIFI_COMM)\n\t\t  LIBS=\"$LIBS -lpcap\"],\n\t\t  [AC_MSG_WARN([pcap library not found, wifi will not work])])\n\t      ])\n\ndnl Set compiler library flags per host architecture\ncase $host in\n  *mingw*)\n    LIBS=\"$LIBS -ldxguid -ldxerr8 -ldsound -lopengl32 -lws2_32 -mwindows\"\n    UI_DIR=\"windows\"\n    ;;\n  *darwin*)\n    if test \"x$GTK_MACOSX_HACK\" = \"xyes\" ; then\n      LIBS=\"$LIBS -framework Gtk -framework GLib\"\n      CPPFLAGS=\"$CPPFLAGS -I/Library/Frameworks/Cairo.framework/Headers -I/Library/Frameworks/Gtk.framework/Headers -I/Library/Frameworks/GLib.framework/Headers\"\n      GLIB_LIBS=\"\"\n      AC_SUBST(GLIB_LIBS)\n    fi\n    dnl - openal is required on mac os x and we are not able to figure out if it's installed or not\n    AC_DEFINE(HAVE_OPENAL)\n    LIBS=\"$LIBS -framework OpenGL -framework OpenAL\"\n    CPPFLAGS=\"$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers\"\n    AC_SUBST(CPPFLAGS)\n    dnl - extra hackery needed for X includes\n    AC_PATH_XTRA\n    ;;\nesac\n\nAC_SUBST(UI_DIR)\nAC_SUBST(PO_DIR)\n\ndnl - Gdb stub\nAC_ARG_ENABLE(gdb-stub,\n              [AC_HELP_STRING(--enable-gdb-stub, enable gdb stub)],\n              [\n\t\t\tAC_DEFINE(GDB_STUB)\n\t\t\twantgdbstub=yes\n\t\t])\nAM_CONDITIONAL([HAVE_GDB_STUB], [test \"${wantgdbstub}\" = \"yes\"])\n\ndnl - Compiler warnings\n\n# for developer use, enable lots of compile warnings,\n# but don't require this generally, because some system's\n# header files (BSD) can't handle it\n#\n# NB: must add -Werror after AC_PROG_CC, etc., so do this last\nAC_ARG_ENABLE(hardcore,\n              [AC_HELP_STRING(--enable-hardcore, turn on -W -Wall -Werror)],\n              [case \"${enableval}\" in\n                yes) ENABLE_HARDCORE=1 ;;\n                no) ENABLE_HARDCORE=0 ;;\n                *) AC_MSG_ERROR(bad value ${enableval} for --enable-hardcore) ;;              esac],\n              [ENABLE_HARDCORE=0])\n\nif test \"x[$]ENABLE_HARDCORE\" = \"x1\"; then\n  AC_MSG_WARN(enable hardcore compile warnings)\n  if test \"x$CXX\" = \"x\"; then\n    dnl - only valid for C with newer gcc's\n    CPPFLAGS=\"[$]CPPFLAGS -Wmissing-prototypes\"\n  fi\n   dnl - -Wshadow\n   CPPFLAGS=\"[$]CPPFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -Wno-missing-field-initializers -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-unused-parameter -Wmissing-declarations -Wundef -Wmissing-noreturn -Wredundant-decls -Wformat-nonliteral -Wformat-security -Winit-self -Wno-reorder\"\nfi\n\ndnl - Enable debug mode\nAC_ARG_ENABLE(debug,\n              AC_HELP_STRING(--enable-debug, enable debug information),\n              AC_DEFINE(DEBUG))\nAC_ARG_ENABLE(gpu-debug,\n              AC_HELP_STRING(--enable-gpu-debug, enable gpu debug information),\n              AC_DEFINE(GPUDEBUG))\nAC_ARG_ENABLE(div-debug,\n              AC_HELP_STRING(--enable-div-debug, enable div debug information),\n              AC_DEFINE(DIVDEBUG))\nAC_ARG_ENABLE(sqrt-debug,\n              AC_HELP_STRING(--enable-sqrt-debug, enable sqrt debug information),\n              AC_DEFINE(SQRTDEBUG))\nAC_ARG_ENABLE(dma-debug,\n              AC_HELP_STRING(--enable-dma-debug, enable dma debug information),\n              AC_DEFINE(DMADEBUG))\n\ndnl - Enable memory profiling (disabled)\ndnl - AC_ARG_ENABLE(memory-profiling,\ndnl -              AC_HELP_STRING(--enable-memory-profiling, enable memory profiling information),\ndnl -              AC_DEFINE(PROFILE_MEMORY_ACCESS))\n\ndnl -- set maintainer mode\nAM_MAINTAINER_MODE\nAC_SUBST(USE_MAINTAINER_MODE)\n\n\ndnl --- Finally, output all the makefiles\nAC_CONFIG_FILES([Makefile\n                 ${PO_MAKEFILE}\n                 src/Makefile\n                 src/cli/Makefile\n                 src/cli/doc/Makefile\n                 src/gtk/Makefile\n                 src/gtk/doc/Makefile\n                 src/gtk-glade/Makefile\n                 src/gtk-glade/doc/Makefile\n                 src/wx/Makefile\n\t\t src/gdbstub/Makefile\n\t\t autopackage/default.apspec\n])\nAC_OUTPUT\n"
  },
  {
    "path": "app/src/main/jni/desmume/depcomp",
    "content": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2012-03-27.16; # UTC\n\n# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,\n# 2011, 2012 Free Software Foundation, Inc.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try '$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: depcomp [--help] [--version] PROGRAM [ARGS]\n\nRun PROGRAMS ARGS to compile a file, generating dependencies\nas side-effects.\n\nEnvironment variables:\n  depmode     Dependency tracking mode.\n  source      Source file read by 'PROGRAMS ARGS'.\n  object      Object file output by 'PROGRAMS ARGS'.\n  DEPDIR      directory where to store dependencies.\n  depfile     Dependency file to output.\n  tmpdepfile  Temporary file to use when outputting dependencies.\n  libtool     Whether libtool is used (yes/no).\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"depcomp $scriptversion\"\n    exit $?\n    ;;\nesac\n\n# A tabulation character.\ntab='\t'\n# A newline character.\nnl='\n'\n\nif test -z \"$depmode\" || test -z \"$source\" || test -z \"$object\"; then\n  echo \"depcomp: Variables source, object and depmode must be set\" 1>&2\n  exit 1\nfi\n\n# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.\ndepfile=${depfile-`echo \"$object\" |\n  sed 's|[^\\\\/]*$|'${DEPDIR-.deps}'/&|;s|\\.\\([^.]*\\)$|.P\\1|;s|Pobj$|Po|'`}\ntmpdepfile=${tmpdepfile-`echo \"$depfile\" | sed 's/\\.\\([^.]*\\)$/.T\\1/'`}\n\nrm -f \"$tmpdepfile\"\n\n# Some modes work just like other modes, but use different flags.  We\n# parameterize here, but still list the modes in the big case below,\n# to make depend.m4 easier to write.  Note that we *cannot* use a case\n# here, because this file can only contain one case statement.\nif test \"$depmode\" = hp; then\n  # HP compiler uses -M and no extra arg.\n  gccflag=-M\n  depmode=gcc\nfi\n\nif test \"$depmode\" = dashXmstdout; then\n   # This is just like dashmstdout with a different argument.\n   dashmflag=-xM\n   depmode=dashmstdout\nfi\n\ncygpath_u=\"cygpath -u -f -\"\nif test \"$depmode\" = msvcmsys; then\n   # This is just like msvisualcpp but w/o cygpath translation.\n   # Just convert the backslash-escaped backslashes to single forward\n   # slashes to satisfy depend.m4\n   cygpath_u='sed s,\\\\\\\\,/,g'\n   depmode=msvisualcpp\nfi\n\nif test \"$depmode\" = msvc7msys; then\n   # This is just like msvc7 but w/o cygpath translation.\n   # Just convert the backslash-escaped backslashes to single forward\n   # slashes to satisfy depend.m4\n   cygpath_u='sed s,\\\\\\\\,/,g'\n   depmode=msvc7\nfi\n\nif test \"$depmode\" = xlc; then\n   # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.\n   gccflag=-qmakedep=gcc,-MF\n   depmode=gcc\nfi\n\ncase \"$depmode\" in\ngcc3)\n## gcc 3 implements dependency tracking that does exactly what\n## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like\n## it if -MD -MP comes after the -MF stuff.  Hmm.\n## Unfortunately, FreeBSD c89 acceptance of flags depends upon\n## the command line argument order; so add the flags where they\n## appear in depend2.am.  Note that the slowdown incurred here\n## affects only configure: in makefiles, %FASTDEP% shortcuts this.\n  for arg\n  do\n    case $arg in\n    -c) set fnord \"$@\" -MT \"$object\" -MD -MP -MF \"$tmpdepfile\" \"$arg\" ;;\n    *)  set fnord \"$@\" \"$arg\" ;;\n    esac\n    shift # fnord\n    shift # $arg\n  done\n  \"$@\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  mv \"$tmpdepfile\" \"$depfile\"\n  ;;\n\ngcc)\n## There are various ways to get dependency output from gcc.  Here's\n## why we pick this rather obscure method:\n## - Don't want to use -MD because we'd like the dependencies to end\n##   up in a subdir.  Having to rename by hand is ugly.\n##   (We might end up doing this anyway to support other compilers.)\n## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like\n##   -MM, not -M (despite what the docs say).\n## - Using -M directly means running the compiler twice (even worse\n##   than renaming).\n  if test -z \"$gccflag\"; then\n    gccflag=-MD,\n  fi\n  \"$@\" -Wp,\"$gccflag$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n## The second -e expression handles DOS-style file names with drive letters.\n  sed -e 's/^[^:]*: / /' \\\n      -e 's/^['$alpha']:\\/[^:]*: / /' < \"$tmpdepfile\" >> \"$depfile\"\n## This next piece of magic avoids the \"deleted header file\" problem.\n## The problem is that when a header file which appears in a .P file\n## is deleted, the dependency causes make to die (because there is\n## typically no way to rebuild the header).  We avoid this by adding\n## dummy dependencies for each header file.  Too bad gcc doesn't do\n## this for us directly.\n  tr ' ' \"$nl\" < \"$tmpdepfile\" |\n## Some versions of gcc put a space before the ':'.  On the theory\n## that the space means something, we add a space to the output as\n## well.  hp depmode also adds that space, but also prefixes the VPATH\n## to the object.  Take care to not repeat it in the output.\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e \"s|.*$object$||\" -e '/:$/d' \\\n      | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nsgi)\n  if test \"$libtool\" = yes; then\n    \"$@\" \"-Wp,-MDupdate,$tmpdepfile\"\n  else\n    \"$@\" -MDupdate \"$tmpdepfile\"\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n\n  if test -f \"$tmpdepfile\"; then  # yes, the sourcefile depend on other files\n    echo \"$object : \\\\\" > \"$depfile\"\n\n    # Clip off the initial element (the dependent).  Don't try to be\n    # clever and replace this with sed code, as IRIX sed won't handle\n    # lines with more than a fixed number of characters (4096 in\n    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;\n    # the IRIX cc adds comments like '#:fec' to the end of the\n    # dependency line.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n    | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' | \\\n    tr \"$nl\" ' ' >> \"$depfile\"\n    echo >> \"$depfile\"\n\n    # The second pass generates a dummy entry for each header file.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n   | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \\\n   >> \"$depfile\"\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nxlc)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\naix)\n  # The C for AIX Compiler uses -M and outputs the dependencies\n  # in a .u file.  In older versions, this file always lives in the\n  # current directory.  Also, the AIX compiler puts '$object:' at the\n  # start of each line; $object doesn't have directory information.\n  # Version 6 uses the directory in both cases.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$base.u\n    tmpdepfile3=$dir.libs/$base.u\n    \"$@\" -Wc,-M\n  else\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$dir$base.u\n    tmpdepfile3=$dir$base.u\n    \"$@\" -M\n  fi\n  stat=$?\n\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    # Each line is of the form 'foo.o: dependent.h'.\n    # Do two passes, one to just change these to\n    # '$object: dependent.h' and one to simply 'dependent.h:'.\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n    sed -e 's,^.*\\.[a-z]*:['\"$tab\"' ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nicc)\n  # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.\n  # However on\n  #    $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c\n  # ICC 7.0 will fill foo.d with something like\n  #    foo.o: sub/foo.c\n  #    foo.o: sub/foo.h\n  # which is wrong.  We want\n  #    sub/foo.o: sub/foo.c\n  #    sub/foo.o: sub/foo.h\n  #    sub/foo.c:\n  #    sub/foo.h:\n  # ICC 7.1 will output\n  #    foo.o: sub/foo.c sub/foo.h\n  # and will wrap long lines using '\\':\n  #    foo.o: sub/foo.c ... \\\n  #     sub/foo.h ... \\\n  #     ...\n  # tcc 0.9.26 (FIXME still under development at the moment of writing)\n  # will emit a similar output, but also prepend the continuation lines\n  # with horizontal tabulation characters.\n  \"$@\" -MD -MF \"$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each line is of the form 'foo.o: dependent.h',\n  # or 'foo.o: dep1.h dep2.h \\', or ' dep3.h dep4.h \\'.\n  # Do two passes, one to just change these to\n  # '$object: dependent.h' and one to simply 'dependent.h:'.\n  sed -e \"s/^[ $tab][ $tab]*/  /\" -e \"s,^[^:]*:,$object :,\" \\\n    < \"$tmpdepfile\" > \"$depfile\"\n  sed '\n    s/[ '\"$tab\"'][ '\"$tab\"']*/ /g\n    s/^ *//\n    s/ *\\\\*$//\n    s/^[^:]*: *//\n    /^$/d\n    /:$/d\n    s/$/ :/\n  ' < \"$tmpdepfile\" >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp2)\n  # The \"hp\" stanza above does not work with aCC (C++) and HP's ia64\n  # compilers, which have integrated preprocessors.  The correct option\n  # to use with these is +Maked; it writes dependencies to a file named\n  # 'foo.d', which lands next to the object file, wherever that\n  # happens to be.\n  # Much of this is similar to the tru64 case; see comments there.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir.libs/$base.d\n    \"$@\" -Wc,+Maked\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    \"$@\" +Maked\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n     rm -f \"$tmpdepfile1\" \"$tmpdepfile2\"\n     exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" \"$tmpdepfile\" > \"$depfile\"\n    # Add 'dependent.h:' lines.\n    sed -ne '2,${\n\t       s/^ *//\n\t       s/ \\\\*$//\n\t       s/$/:/\n\t       p\n\t     }' \"$tmpdepfile\" >> \"$depfile\"\n  else\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\" \"$tmpdepfile2\"\n  ;;\n\ntru64)\n   # The Tru64 compiler uses -MD to generate dependencies as a side\n   # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.\n   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put\n   # dependencies in 'foo.d' instead, so we check for that too.\n   # Subdirectories are respected.\n   dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n   test \"x$dir\" = \"x$object\" && dir=\n   base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n\n   if test \"$libtool\" = yes; then\n      # With Tru64 cc, shared objects can also be used to make a\n      # static library.  This mechanism is used in libtool 1.4 series to\n      # handle both shared and static libraries in a single compilation.\n      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.\n      #\n      # With libtool 1.5 this exception was removed, and libtool now\n      # generates 2 separate objects for the 2 libraries.  These two\n      # compilations output dependencies in $dir.libs/$base.o.d and\n      # in $dir$base.o.d.  We have to check for both files, because\n      # one of the two compilations can be disabled.  We should prefer\n      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is\n      # automatically cleaned when .libs/ is deleted, while ignoring\n      # the former would cause a distcleancheck panic.\n      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4\n      tmpdepfile2=$dir$base.o.d          # libtool 1.5\n      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5\n      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504\n      \"$@\" -Wc,-MD\n   else\n      tmpdepfile1=$dir$base.o.d\n      tmpdepfile2=$dir$base.d\n      tmpdepfile3=$dir$base.d\n      tmpdepfile4=$dir$base.d\n      \"$@\" -MD\n   fi\n\n   stat=$?\n   if test $stat -eq 0; then :\n   else\n      rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n      exit $stat\n   fi\n\n   for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n   do\n     test -f \"$tmpdepfile\" && break\n   done\n   if test -f \"$tmpdepfile\"; then\n      sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n      sed -e 's,^.*\\.[a-z]*:['\"$tab\"' ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n   else\n      echo \"#dummy\" > \"$depfile\"\n   fi\n   rm -f \"$tmpdepfile\"\n   ;;\n\nmsvc7)\n  if test \"$libtool\" = yes; then\n    showIncludes=-Wc,-showIncludes\n  else\n    showIncludes=-showIncludes\n  fi\n  \"$@\" $showIncludes > \"$tmpdepfile\"\n  stat=$?\n  grep -v '^Note: including file: ' \"$tmpdepfile\"\n  if test \"$stat\" = 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The first sed program below extracts the file names and escapes\n  # backslashes for cygpath.  The second sed program outputs the file\n  # name when reading, but also accumulates all include files in the\n  # hold buffer in order to output them again at the end.  This only\n  # works with sed implementations that can handle large buffers.\n  sed < \"$tmpdepfile\" -n '\n/^Note: including file:  *\\(.*\\)/ {\n  s//\\1/\n  s/\\\\/\\\\\\\\/g\n  p\n}' | $cygpath_u | sort -u | sed -n '\ns/ /\\\\ /g\ns/\\(.*\\)/'\"$tab\"'\\1 \\\\/p\ns/.\\(.*\\) \\\\/\\1:/\nH\n$ {\n  s/.*/'\"$tab\"'/\n  G\n  p\n}' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvc7msys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\n#nosideeffect)\n  # This comment above is used by automake to tell side-effect\n  # dependency tracking mechanisms from slower ones.\n\ndashmstdout)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  test -z \"$dashmflag\" && dashmflag=-M\n  # Require at least two characters before searching for ':'\n  # in the target name.  This is to cope with DOS-style filenames:\n  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.\n  \"$@\" $dashmflag |\n    sed 's:^['\"$tab\"' ]*[^:'\"$tab\"' ][^:][^:]*\\:['\"$tab\"' ]*:'\"$object\"'\\: :' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  tr ' ' \"$nl\" < \"$tmpdepfile\" | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\ndashXmstdout)\n  # This case only exists to satisfy depend.m4.  It is never actually\n  # run, as this mode is specially recognized in the preamble.\n  exit 1\n  ;;\n\nmakedepend)\n  \"$@\" || exit $?\n  # Remove any Libtool call\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n  # X makedepend\n  shift\n  cleared=no eat=no\n  for arg\n  do\n    case $cleared in\n    no)\n      set \"\"; shift\n      cleared=yes ;;\n    esac\n    if test $eat = yes; then\n      eat=no\n      continue\n    fi\n    case \"$arg\" in\n    -D*|-I*)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    # Strip any option that makedepend may not understand.  Remove\n    # the object too, otherwise makedepend will parse it as a source file.\n    -arch)\n      eat=yes ;;\n    -*|$object)\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    esac\n  done\n  obj_suffix=`echo \"$object\" | sed 's/^.*\\././'`\n  touch \"$tmpdepfile\"\n  ${MAKEDEPEND-makedepend} -o\"$obj_suffix\" -f\"$tmpdepfile\" \"$@\"\n  rm -f \"$depfile\"\n  # makedepend may prepend the VPATH from the source file name to the object.\n  # No need to regex-escape $object, excess matching of '.' is harmless.\n  sed \"s|^.*\\($object *:\\)|\\1|\" \"$tmpdepfile\" > \"$depfile\"\n  sed '1,2d' \"$tmpdepfile\" | tr ' ' \"$nl\" | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\" \"$tmpdepfile\".bak\n  ;;\n\ncpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  \"$@\" -E |\n    sed -n -e '/^# [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n       -e '/^#line [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' |\n    sed '$ s: \\\\$::' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  cat < \"$tmpdepfile\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" '/^$/d;s/^ //;s/ \\\\$//;s/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvisualcpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  IFS=\" \"\n  for arg\n  do\n    case \"$arg\" in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    \"-Gm\"|\"/Gm\"|\"-Gi\"|\"/Gi\"|\"-ZI\"|\"/ZI\")\n\tset fnord \"$@\"\n\tshift\n\tshift\n\t;;\n    *)\n\tset fnord \"$@\" \"$arg\"\n\tshift\n\tshift\n\t;;\n    esac\n  done\n  \"$@\" -E 2>/dev/null |\n  sed -n '/^#line [0-9][0-9]* \"\\([^\"]*\\)\"/ s::\\1:p' | $cygpath_u | sort -u > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::'\"$tab\"'\\1 \\\\:p' >> \"$depfile\"\n  echo \"$tab\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\\1\\::p' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvcmsys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nnone)\n  exec \"$@\"\n  ;;\n\n*)\n  echo \"Unknown depmode $depmode\" 1>&2\n  exit 1\n  ;;\nesac\n\nexit 0\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "app/src/main/jni/desmume/dsm.txt",
    "content": "DSM is ascii plain text. It is derived from the FCEUX FM2 format.\r\nIt consists of several key-value pairs followed by an inputlog section.\r\nThe inputlog section can be identified by its starting with a | (pipe).\r\nThe inputlog section terminates at eof.\r\nNewlines may be \\r\\n or \\n\r\n\r\nKey-value pairs consist of a key identifier, followed by a space separator, followed by the value text.\r\nValue text is always terminated by a newline, which the value text will not include.\r\nThe value text is parsed differently depending on the type of the key.\r\nThe key-value pairs may be in any order, except that the first key must be version.\r\n\r\nInteger keys (also used for booleans, with a 1 or 0) will have a value that is a simple integer not to exceed 32bits\r\n - version (required) - the version of the movie file format; for now it is always 3\r\n - emuVersion (required) - the version of the emulator used to produce the movie\r\n - rerecordCount (optional) - the rerecord count\r\n - romChecksum (optional) - the CRC32 of the rom used to make the movie. should match values specified on advanscene.com\r\n - romSerial (optional) - a concatenation of other uniquely identifying information about the rom (name,gamecode,makercode)\r\n - useExtBios (optional) - were bios files was used? defaults to false. \r\n - swiFromBios (optional) - were swi emulated by ExtBios? (alternative is internal HLE bios). defaults to false.\r\n \r\nThe rom identification information may be used at a later point to warn about mismatches between movies and roms, but is not right now.\r\n\r\nString keys have values that consist of the remainder of the key-value pair line. As a consequence, string values cannot contain newlines.\r\n - romFilename (required) - the name of the file used to record the movie\r\n - comment (optional) - simply a memo. \r\n     by convention, the first token in the comment value is the subject of the comment.\r\n     by convention, subsequent comments with the same subject will have their ordering preserved and may be used to approximate multiline comments.\r\n     by convention, the author of the movie should be stored in comment(s) with a subject of: author\r\n\r\nHex string keys (used for binary blobs) will have a value that is like 0x0123456789ABCDEF...\r\n - romChecksum (required) - this is currently unused.\r\n\r\nGUID keys have a value which is in the standard guid format: 452DE2C3-EF43-2FA9-77AC-0677FC51543B\r\n - guid (required) a unique identifier for a movie, generated when the movie is created, which is used when loading a savestate to make sure it belongs to the current movie.\r\n\r\nThe inputlog section consists of lines beginning and ending with a | (pipe).\r\nThe fields are as follows, except as noted in note C.\r\n|c|.............XXX YYY Z|\r\n\r\n'R','L','D','U','T','S','B','A','Y','X','W','E','G'\r\n\r\nfield c is a variable length decimal integer which is a bitfield corresponding to miscellaneous input states which are valid at the start of the frame.\r\nTherefore, no miscellaneous commands is represented by a value of 0.\r\nHere are the currently defined bit values:\r\n0x01 - Microphone Noise (hardcoded noise sample; to be held through duration of frame)\r\n0x02 - Reset\r\n0x04 - Lid\r\n\r\n\r\nthe format of the main section is as follows:\r\n\r\n the field begins with 13 characters which constitute a bitfield.\r\n any character other than ' ' or '.' means that the button was pressed.\r\n by convention, the following mnemonics will be used in a column to remind us of which button corresponds to which column:\r\n   RLDUTSBAYXWEG (Right,Left,Down,Up,sTart,Select,B,A,Y,X,lshoulder,rshoulder,debuG)\r\n This ordering is based on FCEUX to a certain extent, and arbitrary after that.\r\n W and E were chosen for shoulders to suggest West and East for Left and Right.\r\n While the emulator supports a 'lid' button, and to some extent a 'blow' button, these are not supported in the movies.\r\n\r\n XXX: %03d, the x position of the stylus (0,0 topleft, 255,191 bottomright)\r\n YYY: %03d, the y position of the stylus\r\n Z: %1d, 1 if the stylus is pressed pressed; 0 if not\r\n\r\nAdditional fields after this main section may be added later without breaking the file format.\r\n\r\n* Notes *\r\nA. There is no key-value pair that indicates the length of the movie. This must be read by scanning the inputlog and counting the number of lines.\r\n\r\nB. All movies start from power-on.\r\n\r\nC. The emulator uses these framerate constants\r\n   arm7_cycles_per_frame = 560190\r\n   frames_per_second = 59.8261\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/dsv.txt",
    "content": "The desmume save file format is merely a raw save file with a FOOTER.\r\n\r\nThis was chosen in order to maximize compatibility with other emulators,\r\nwhich tend load the savefile as-is and let the game read out of whatever range\r\nit is expecting. To assist with this, before writing the save file, desmume\r\nwill pad the raw save file out to the next highest known length. Note that this\r\nmay sometimes be incorrect if the savefile hasnt been written through to the end\r\nduring initialization. This could cause other emulators to fail to recognize the\r\nsave file.\r\n\r\nAdditionally, the footer makes it easier to analyze save files, because the\r\ngame's data will be at the correct addresses starting at offset 0x0000.\r\n\r\nThe footer format can be identified by locating the 16Byte ascii string \r\n\"|-DESMUME SAVE-|\"\r\nat the end of the file. This corresponds with the following save structure:\r\n\r\nstruct Footer {\r\n\tu32 actually_written_size;\r\n\tu32 padded_size;\r\n\tu32 save_type; //(not currently used)\r\n\tu32 address_size; //address bus size\r\n\tu32 save_size; //size parameter of the save type (not currently used)\r\n\tu32 version_number; //should be 0\r\n\tchar cookie[16];\r\n};\r\n\r\nnote that padded_size should be where you see the end of the raw save data\r\nand the beginning of desmume-specific information, including some junk before\r\nthe actual footer.\r\n\r\nactually_written_size is the highest address (plus one) written to by the game.\r\n\r\nThe new desmume savefile system tries to make as few decisions as possible,\r\nwhich is the reason for the behavior of actually_written_size and the disuse\r\nof save_type and save_size.  If few decisions are made, then few mistakes can\r\nbe made. That is the idea, anyway. We'll make decisions later if we need to.\r\nsave_type and save_size are reserved in case we do.\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2011-01-19.21; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# `make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=${DOITPROG-}\nif test -z \"$doit\"; then\n  doit_exec=exec\nelse\n  doit_exec=$doit\nfi\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_glob='?'\ninitialize_posix_glob='\n  test \"$posix_glob\" != \"?\" || {\n    if (set -f) 2>/dev/null; then\n      posix_glob=\n    else\n      posix_glob=:\n    fi\n  }\n'\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nno_target_directory=\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n\tshift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n\tcase $mode in\n\t  *' '* | *'\t'* | *'\n'*\t  | *'*'* | *'?'* | *'['*)\n\t    echo \"$0: invalid mode: $mode\" >&2\n\t    exit 1;;\n\tesac\n\tshift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n\tshift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t) dst_arg=$2\n\t# Protect names problematic for `test' and other utilities.\n\tcase $dst_arg in\n\t  -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n\tesac\n\tshift;;\n\n    -T) no_target_directory=true;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --)\tshift\n\tbreak;;\n\n    -*)\techo \"$0: invalid option: $1\" >&2\n\texit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n    # Protect names problematic for `test' and other utilities.\n    case $dst_arg in\n      -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n    esac\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call `install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  do_exit='(exit $ret); exit $ret'\n  trap \"ret=129; $do_exit\" 1\n  trap \"ret=130; $do_exit\" 2\n  trap \"ret=141; $do_exit\" 13\n  trap \"ret=143; $do_exit\" 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names problematic for `test' and other utilities.\n  case $src in\n    -* | [=\\(\\)!]) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n    dst=$dst_arg\n\n    # If destination is a directory, append the input filename; won't work\n    # if double slashes aren't ignored.\n    if test -d \"$dst\"; then\n      if test -n \"$no_target_directory\"; then\n\techo \"$0: $dst_arg: Is a directory\" >&2\n\texit 1\n      fi\n      dstdir=$dst\n      dst=$dstdir/`basename \"$src\"`\n      dstdir_status=0\n    else\n      # Prefer dirname, but fall back on a substitute if dirname fails.\n      dstdir=`\n\t(dirname \"$dst\") 2>/dev/null ||\n\texpr X\"$dst\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)[^/]' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)$' \\| \\\n\t     X\"$dst\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n\techo X\"$dst\" |\n\t    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)[^/].*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\).*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t s/.*/./; q'\n      `\n\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n\t# Create intermediate dirs using mode 755 as modified by the umask.\n\t# This is like FreeBSD 'install' as of 1997-10-28.\n\tumask=`umask`\n\tcase $stripcmd.$umask in\n\t  # Optimize common cases.\n\t  *[2367][2367]) mkdir_umask=$umask;;\n\t  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n\t  *[0-7])\n\t    mkdir_umask=`expr $umask + 22 \\\n\t      - $umask % 100 % 40 + $umask % 20 \\\n\t      - $umask % 10 % 4 + $umask % 2\n\t    `;;\n\t  *) mkdir_umask=$umask,go-w;;\n\tesac\n\n\t# With -d, create the new directory with the user-specified mode.\n\t# Otherwise, rely on $mkdir_umask.\n\tif test -n \"$dir_arg\"; then\n\t  mkdir_mode=-m$mode\n\telse\n\t  mkdir_mode=\n\tfi\n\n\tposix_mkdir=false\n\tcase $umask in\n\t  *[123567][0-7][0-7])\n\t    # POSIX mkdir -p sets u+wx bits regardless of umask, which\n\t    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n\t    ;;\n\t  *)\n\t    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\t    trap 'ret=$?; rmdir \"$tmpdir/d\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n\t    if (umask $mkdir_umask &&\n\t\texec $mkdirprog $mkdir_mode -p -- \"$tmpdir/d\") >/dev/null 2>&1\n\t    then\n\t      if test -z \"$dir_arg\" || {\n\t\t   # Check for POSIX incompatibilities with -m.\n\t\t   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t\t   # other-writeable bit of parent directory when it shouldn't.\n\t\t   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t\t   ls_ld_tmpdir=`ls -ld \"$tmpdir\"`\n\t\t   case $ls_ld_tmpdir in\n\t\t     d????-?r-*) different_mode=700;;\n\t\t     d????-?--*) different_mode=755;;\n\t\t     *) false;;\n\t\t   esac &&\n\t\t   $mkdirprog -m$different_mode -p -- \"$tmpdir\" && {\n\t\t     ls_ld_tmpdir_1=`ls -ld \"$tmpdir\"`\n\t\t     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t\t   }\n\t\t }\n\t      then posix_mkdir=:\n\t      fi\n\t      rmdir \"$tmpdir/d\" \"$tmpdir\"\n\t    else\n\t      # Remove any dirs left behind by ancient mkdir implementations.\n\t      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null\n\t    fi\n\t    trap '' 0;;\n\tesac;;\n    esac\n\n    if\n      $posix_mkdir && (\n\tumask $mkdir_umask &&\n\t$doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n\t/*) prefix='/';;\n\t[-=\\(\\)!]*) prefix='./';;\n\t*)  prefix='';;\n      esac\n\n      eval \"$initialize_posix_glob\"\n\n      oIFS=$IFS\n      IFS=/\n      $posix_glob set -f\n      set fnord $dstdir\n      shift\n      $posix_glob set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n\ttest X\"$d\" = X && continue\n\n\tprefix=$prefix$d\n\tif test -d \"$prefix\"; then\n\t  prefixes=\n\telse\n\t  if $posix_mkdir; then\n\t    (umask=$mkdir_umask &&\n\t     $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n\t    # Don't fail if two instances are running concurrently.\n\t    test -d \"$prefix\" || exit 1\n\t  else\n\t    case $prefix in\n\t      *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n\t      *) qprefix=$prefix;;\n\t    esac\n\t    prefixes=\"$prefixes '$qprefix'\"\n\t  fi\n\tfi\n\tprefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n\t# Don't fail if two instances are running concurrently.\n\t(umask $mkdir_umask &&\n\t eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n\t  test -d \"$dstdir\" || exit 1\n\tobsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=$dstdir/_inst.$$_\n    rmtmp=$dstdir/_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"\t2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"\t2>/dev/null` &&\n\n       eval \"$initialize_posix_glob\" &&\n       $posix_glob set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       $posix_glob set +f &&\n\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n\t# Now remove or move aside any old file at destination location.\n\t# We try this two ways since rm can't unlink itself on some\n\t# systems and the destination file might be busy for other\n\t# reasons.  In this case, the final cleanup might fail but the new\n\t# file should still install successfully.\n\t{\n\t  test ! -f \"$dst\" ||\n\t  $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n\t  { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n\t    { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n\t  } ||\n\t  { echo \"$0: cannot unlink or rename $dst\" >&2\n\t    (exit 1); exit 1\n\t  }\n\t} &&\n\n\t# Now rename the file to the real destination.\n\t$doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "app/src/main/jni/desmume/missing",
    "content": "#! /bin/sh\n# Common stub for a few missing GNU programs while installing.\n\nscriptversion=2012-01-06.13; # UTC\n\n# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,\n# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.\n# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\nif test $# -eq 0; then\n  echo 1>&2 \"Try \\`$0 --help' for more information\"\n  exit 1\nfi\n\nrun=:\nsed_output='s/.* --output[ =]\\([^ ]*\\).*/\\1/p'\nsed_minuso='s/.* -o \\([^ ]*\\).*/\\1/p'\n\n# In the cases where this matters, `missing' is being run in the\n# srcdir already.\nif test -f configure.ac; then\n  configure_ac=configure.ac\nelse\n  configure_ac=configure.in\nfi\n\nmsg=\"missing on your system\"\n\ncase $1 in\n--run)\n  # Try to run requested program, and just exit if it succeeds.\n  run=\n  shift\n  \"$@\" && exit 0\n  # Exit code 63 means version mismatch.  This often happens\n  # when the user try to use an ancient version of a tool on\n  # a file that requires a minimum version.  In this case we\n  # we should proceed has if the program had been absent, or\n  # if --run hadn't been passed.\n  if test $? = 63; then\n    run=:\n    msg=\"probably too old\"\n  fi\n  ;;\n\n  -h|--h|--he|--hel|--help)\n    echo \"\\\n$0 [OPTION]... PROGRAM [ARGUMENT]...\n\nHandle \\`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an\nerror status if there is no known handling for PROGRAM.\n\nOptions:\n  -h, --help      display this help and exit\n  -v, --version   output version information and exit\n  --run           try to run the given command, and emulate it if it fails\n\nSupported PROGRAM values:\n  aclocal      touch file \\`aclocal.m4'\n  autoconf     touch file \\`configure'\n  autoheader   touch file \\`config.h.in'\n  autom4te     touch the output file, or create a stub one\n  automake     touch all \\`Makefile.in' files\n  bison        create \\`y.tab.[ch]', if possible, from existing .[ch]\n  flex         create \\`lex.yy.c', if possible, from existing .c\n  help2man     touch the output file\n  lex          create \\`lex.yy.c', if possible, from existing .c\n  makeinfo     touch the output file\n  yacc         create \\`y.tab.[ch]', if possible, from existing .[ch]\n\nVersion suffixes to PROGRAM as well as the prefixes \\`gnu-', \\`gnu', and\n\\`g' are ignored when checking the name.\n\nSend bug reports to <bug-automake@gnu.org>.\"\n    exit $?\n    ;;\n\n  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)\n    echo \"missing $scriptversion (GNU Automake)\"\n    exit $?\n    ;;\n\n  -*)\n    echo 1>&2 \"$0: Unknown \\`$1' option\"\n    echo 1>&2 \"Try \\`$0 --help' for more information\"\n    exit 1\n    ;;\n\nesac\n\n# normalize program name to check for.\nprogram=`echo \"$1\" | sed '\n  s/^gnu-//; t\n  s/^gnu//; t\n  s/^g//; t'`\n\n# Now exit if we have it, but it failed.  Also exit now if we\n# don't have it and --version was passed (most likely to detect\n# the program).  This is about non-GNU programs, so use $1 not\n# $program.\ncase $1 in\n  lex*|yacc*)\n    # Not GNU programs, they don't have --version.\n    ;;\n\n  *)\n    if test -z \"$run\" && ($1 --version) > /dev/null 2>&1; then\n       # We have it, but it failed.\n       exit 1\n    elif test \"x$2\" = \"x--version\" || test \"x$2\" = \"x--help\"; then\n       # Could not run --version or --help.  This is probably someone\n       # running `$TOOL --version' or `$TOOL --help' to check whether\n       # $TOOL exists and not knowing $TOOL uses missing.\n       exit 1\n    fi\n    ;;\nesac\n\n# If it does not exist, or fails to run (possibly an outdated version),\n# try to emulate it.\ncase $program in\n  aclocal*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acinclude.m4' or \\`${configure_ac}'.  You might want\n         to install the \\`Automake' and \\`Perl' packages.  Grab them from\n         any GNU archive site.\"\n    touch aclocal.m4\n    ;;\n\n  autoconf*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`${configure_ac}'.  You might want to install the\n         \\`Autoconf' and \\`GNU m4' packages.  Grab them from any GNU\n         archive site.\"\n    touch configure\n    ;;\n\n  autoheader*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acconfig.h' or \\`${configure_ac}'.  You might want\n         to install the \\`Autoconf' and \\`GNU m4' packages.  Grab them\n         from any GNU archive site.\"\n    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\\([^)]*\\)).*/\\1/p' ${configure_ac}`\n    test -z \"$files\" && files=\"config.h\"\n    touch_files=\n    for f in $files; do\n      case $f in\n      *:*) touch_files=\"$touch_files \"`echo \"$f\" |\n\t\t\t\t       sed -e 's/^[^:]*://' -e 's/:.*//'`;;\n      *) touch_files=\"$touch_files $f.in\";;\n      esac\n    done\n    touch $touch_files\n    ;;\n\n  automake*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`Makefile.am', \\`acinclude.m4' or \\`${configure_ac}'.\n         You might want to install the \\`Automake' and \\`Perl' packages.\n         Grab them from any GNU archive site.\"\n    find . -type f -name Makefile.am -print |\n\t   sed 's/\\.am$/.in/' |\n\t   while read f; do touch \"$f\"; done\n    ;;\n\n  autom4te*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, but is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.\n         You can get \\`$1' as part of \\`Autoconf' from any GNU\n         archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \"#! /bin/sh\"\n\techo \"# Created by GNU Automake missing as a replacement of\"\n\techo \"#  $ $@\"\n\techo \"exit 0\"\n\tchmod +x $file\n\texit 1\n    fi\n    ;;\n\n  bison*|yacc*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' $msg.  You should only need it if\n         you modified a \\`.y' file.  You may need the \\`Bison' package\n         in order for those modifications to take effect.  You can get\n         \\`Bison' from any GNU archive site.\"\n    rm -f y.tab.c y.tab.h\n    if test $# -ne 1; then\n        eval LASTARG=\\${$#}\n\tcase $LASTARG in\n\t*.y)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.c\n\t    fi\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/h/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.h\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f y.tab.h; then\n\techo >y.tab.h\n    fi\n    if test ! -f y.tab.c; then\n\techo 'main() { return 0; }' >y.tab.c\n    fi\n    ;;\n\n  lex*|flex*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.l' file.  You may need the \\`Flex' package\n         in order for those modifications to take effect.  You can get\n         \\`Flex' from any GNU archive site.\"\n    rm -f lex.yy.c\n    if test $# -ne 1; then\n        eval LASTARG=\\${$#}\n\tcase $LASTARG in\n\t*.l)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/l$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" lex.yy.c\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f lex.yy.c; then\n\techo 'main() { return 0; }' >lex.yy.c\n    fi\n    ;;\n\n  help2man*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n\t you modified a dependency of a manual page.  You may need the\n\t \\`Help2man' package in order for those modifications to take\n\t effect.  You can get \\`Help2man' from any GNU archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \".ab help2man is required to generate this page\"\n\texit $?\n    fi\n    ;;\n\n  makeinfo*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.texi' or \\`.texinfo' file, or any other file\n         indirectly affecting the aspect of the manual.  The spurious\n         call might also be the consequence of using a buggy \\`make' (AIX,\n         DU, IRIX).  You might want to install the \\`Texinfo' package or\n         the \\`GNU make' package.  Grab either from any GNU archive site.\"\n    # The file to touch is that specified with -o ...\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -z \"$file\"; then\n      # ... or it is the one specified with @setfilename ...\n      infile=`echo \"$*\" | sed 's/.* \\([^ ]*\\) *$/\\1/'`\n      file=`sed -n '\n\t/^@setfilename/{\n\t  s/.* \\([^ ]*\\) *$/\\1/\n\t  p\n\t  q\n\t}' $infile`\n      # ... or it is derived from the source name (dir/f.texi becomes f.info)\n      test -z \"$file\" && file=`echo \"$infile\" | sed 's,.*/,,;s,.[^.]*$,,'`.info\n    fi\n    # If the file does not exist, the user really needs makeinfo;\n    # let's fail without touching anything.\n    test -f $file || exit 1\n    touch $file\n    ;;\n\n  *)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, and is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.  Check the \\`README' file,\n         it often tells you about the needed prerequisites for installing\n         this package.  You may also peek at any GNU archive site, in case\n         some other package would contain this missing \\`$1' program.\"\n    exit 1\n    ;;\nesac\n\nexit 0\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmAnalyze.cpp",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"ArmAnalyze.h\"\n#include \"armcpu.h\"\n#include \"instructions.h\"\n#include \"Disassembler.h\"\n#include <assert.h>\n\n///////////////////////////////////////////////////////////////////////////////////////////////\ntypedef u32 (FASTCALL* OpDecoder)(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d);\n#define TEMPLATE template<int PROCNUM> \n///////////////////////////////////////////////////////////////////////////////////////////////\n#define DCL_UNDEF_OP(name) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\td->IROp = IR_UND;\\\n\t\td->ExecuteCycles = 1;\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP1_ARG4(name, op, arg1, arg2, arg3, arg4) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top(arg1, arg2, arg3, arg4)\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP1_ARG5(name, op, arg1, arg2, arg3, arg4, arg5) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top(arg1, arg2, arg3, arg4, arg5)\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP1_ARG6(name, op, arg1, arg2, arg3, arg4, arg5, arg6) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top(arg1, arg2, arg3, arg4, arg5, arg6)\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP2_ARG1(name, op1, op2, arg) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top1\\\n\t\top2(arg)\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP2_ARG2(name, op1, op2, arg1, arg2) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top1\\\n\t\top2(arg1, arg2)\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP2_ARG4(name, op1, op2, arg1, arg2, arg3, arg4) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top1\\\n\t\top2(arg1, arg2, arg3, arg4)\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP2_ARG5(name, op1, op2, arg1, arg2, arg3, arg4, arg5) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top1\\\n\t\top2(arg1, arg2, arg3, arg4, arg5)\\\n\t\treturn 1;\\\n\t}\n\n#define DCL_OP2_ARG6(name, op1, op2, arg1, arg2, arg3, arg4, arg5, arg6) \\\n\tTEMPLATE u32 FASTCALL name(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d) \\\n\t{\\\n\t\top1\\\n\t\top2(arg1, arg2, arg3, arg4, arg5, arg6)\\\n\t\treturn 1;\\\n\t}\n\n#define THUMB_REGPOS(i, n)\t(((i)>>n)&0x7)\n#define ARM_REGPOS(i, n)\t(((i)>>n)&0xF)\n\n#define LOAD_CPSR \\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->TbitModified = 1;\\\n\td->Reschedule = 1;\n///////////////////////////////////////////////////////////////////////////////////////////////\n//------------------------------------------------------------\n//                         THUMB\n//------------------------------------------------------------\nnamespace ThumbOpDecoder\n{\n//-----------------------------------------------------------------------------\n//   Undefined instruction\n//-----------------------------------------------------------------------------\n\tDCL_UNDEF_OP(OP_UND_THUMB)\n\n//-----------------------------------------------------------------------------\n//   LSL\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_LSL_0(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LSL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->Immediate = (opcode.ThumbOp>>6) & 0x1F;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\tif (!d->Immediate)\n\t\t\td->FlagsNeeded |= FLAG_C;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LSL_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = d->Rd;\n\t\td->Rs = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->I = 0;\n\t\td->R = 1;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   LSR\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_LSR_0(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSR;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LSR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->Immediate = (opcode.ThumbOp>>6) & 0x1F;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSR;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LSR_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = d->Rd;\n\t\td->Rs = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->I = 0;\n\t\td->R = 1;\n\t\td->Typ = IRSHIFT_LSR;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   ASR\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_ASR_0(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_ASR;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ASR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->Immediate = (opcode.ThumbOp>>6) & 0x1F;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_ASR;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ASR_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = d->Rd;\n\t\td->Rs = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->I = 0;\n\t\td->R = 1;\n\t\td->Typ = IRSHIFT_ASR;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   ADD\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_ADD_IMM3(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADD;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = (opcode.ThumbOp >> 6) & 0x07;\n\t\td->I = 1;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ADD_IMM8(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADD;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Rn = d->Rd;\n\t\td->Immediate = (opcode.ThumbOp & 0xFF);\n\t\td->I = 1;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ADD_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADD;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ADD_SPE(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADD;\n\t\td->Rd = (THUMB_REGPOS(opcode.ThumbOp, 0) | ((opcode.ThumbOp>>4)&8));\n\t\td->Rn = d->Rd;\n\t\td->Rm = ARM_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 0;\n\t\tif (d->Rd == 15)\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->ExecuteCycles = 1;\n\t\t}\n\t\telse\n\t\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ADD_2PC(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADD;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Rn = 15;\n\t\td->Immediate = ((opcode.ThumbOp&0xFF)<<2);\n\t\td->I = 1;\n\t\td->S = 0;\n\t\td->ReadPCMask = 0xFFFFFFFC;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ADD_2SP(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADD;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Rn = 13;\n\t\td->Immediate = ((opcode.ThumbOp&0xFF)<<2);\n\t\td->I = 1;\n\t\td->S = 0;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SUB\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SUB_IMM3(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SUB;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = (opcode.ThumbOp >> 6) & 0x07;\n\t\td->I = 1;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SUB_IMM8(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SUB;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Rn = d->Rd;\n\t\td->Immediate = (opcode.ThumbOp & 0xFF);\n\t\td->I = 1;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SUB_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SUB;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   MOV\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_MOV_IMM8(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Rn = 0;\n\t\td->Immediate = (opcode.ThumbOp & 0xFF);\n\t\td->I = 1;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MOV_SPE(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\tif (opcode.ThumbOp == 0x46C0)\n\t\t{\n\t\t\td->IROp = IR_NOP;\n\t\t\td->ExecuteCycles = 1;\n\t\t\treturn 1;\n\t\t}\n\n\t\td->IROp = IR_MOV;\n\t\td->Rd = (THUMB_REGPOS(opcode.ThumbOp, 0) | ((opcode.ThumbOp>>4)&8));\n\t\td->Rn = 0;\n\t\td->Rm = ARM_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 0;\n\t\tif (d->Rd == 15)\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->ExecuteCycles = 1;\n\t\t}\n\t\telse\n\t\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   CMP\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_CMP_IMM8(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_CMP;\n\t\td->Rd = 0;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Immediate = (opcode.ThumbOp & 0xFF);\n\t\td->I = 1;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_CMP(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_CMP;\n\t\td->Rd = 0;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_CMP_SPE(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_CMP;\n\t\td->Rd = 0;\n\t\td->Rn = (THUMB_REGPOS(opcode.ThumbOp, 0) | ((opcode.ThumbOp>>4)&8));\n\t\td->Rm = ARM_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 0;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   AND\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_AND(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_AND;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = d->Rd;\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   EOR\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_EOR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_EOR;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = d->Rd;\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   ADC\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_ADC_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADC;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = d->Rd;\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsNeeded |= FLAG_C;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SBC\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SBC_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SBC;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = d->Rd;\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsNeeded |= FLAG_C;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   ROR\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_ROR_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MOV;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = d->Rd;\n\t\td->Rs = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rn = 0;\n\t\td->I = 0;\n\t\td->R = 1;\n\t\td->Typ = IRSHIFT_ROR;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_TST(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_TST;\n\t\td->Rd = 0;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   NEG\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_NEG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_RSB;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 1;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   CMN\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_CMN(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_CMN;\n\t\td->Rd = 0;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   ORR\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_ORR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ORR;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = d->Rd;\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   BIC\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_BIC(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_BIC;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = d->Rd;\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   MVN\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_MVN(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MVN;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rn = d->Rd;\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   MUL\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_MUL_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MUL;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rs = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rm = d->Rd;\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   STRB / LDRB\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_STRB_IMM_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Immediate = (opcode.ThumbOp>>6)&0x1F;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 1;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDRB_IMM_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Immediate = (opcode.ThumbOp>>6)&0x1F;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 1;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_STRB_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 1;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDRB_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 1;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   LDRSB\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_LDRSB_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDRx;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->I = 0;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->W = 0;\n\t\td->S = 1;\n\t\td->H = 0;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   STRH / LDRH\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_STRH_IMM_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STRx;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Immediate = (opcode.ThumbOp>>5)&0x3E;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->W = 0;\n\t\td->S = 0;\n\t\td->H = 1;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDRH_IMM_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDRx;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Immediate = (opcode.ThumbOp>>5)&0x3E;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->W = 0;\n\t\td->S = 0;\n\t\td->H = 1;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_STRH_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STRx;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->I = 0;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->W = 0;\n\t\td->S = 0;\n\t\td->H = 1;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDRH_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDRx;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->I = 0;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->W = 0;\n\t\td->S = 0;\n\t\td->H = 1;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   LDRSH\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_LDRSH_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDRx;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->I = 0;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->W = 0;\n\t\td->S = 1;\n\t\td->H = 1;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   STR / LDR\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_STR_IMM_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Immediate = (opcode.ThumbOp>>4)&0x7C;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 0;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDR_IMM_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Immediate = (opcode.ThumbOp>>4)&0x7C;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 0;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_STR_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 0;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDR_REG_OFF(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDR;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 3);\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 0);\n\t\td->Rm = THUMB_REGPOS(opcode.ThumbOp, 6);\n\t\td->Immediate = 0;\n\t\td->I = 0;\n\t\td->R = 0;\n\t\td->Typ = IRSHIFT_LSL;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 0;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_STR_SPREL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STR;\n\t\td->Rn = 13;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Immediate = (opcode.ThumbOp&0xFF)<<2;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 0;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDR_SPREL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDR;\n\t\td->Rn = 13;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Immediate = (opcode.ThumbOp&0xFF)<<2;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 0;\n\t\td->W = 0;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDR_PCREL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDR;\n\t\td->Rn = 15;\n\t\td->Rd = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->Immediate = (opcode.ThumbOp&0xFF)<<2;\n\t\td->I = 1;\n\t\td->P = 1;\n\t\td->U = 1;\n\t\td->B = 0;\n\t\td->W = 0;\n\t\td->ReadPCMask = 0xFFFFFFFC;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   Adjust SP\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_ADJUST_P_SP(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_ADD;\n\t\td->Rd = 13;\n\t\td->Rn = 13;\n\t\td->Immediate = (opcode.ThumbOp&0x7F)<<2;\n\t\td->I = 1;\n\t\td->S = 0;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_ADJUST_M_SP(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SUB;\n\t\td->Rd = 13;\n\t\td->Rn = 13;\n\t\td->Immediate = (opcode.ThumbOp&0x7F)<<2;\n\t\td->I = 1;\n\t\td->S = 0;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   PUSH / POP\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_PUSH(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STM;\n\t\td->Rn = 13;\n\t\td->RegisterList = (opcode.ThumbOp & 0xFF);\n\t\td->P = 1;\n\t\td->U = 0;\n\t\td->S = 0;\n\t\td->W = 1;\n\t\td->ExecuteCycles = 3;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_PUSH_LR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STM;\n\t\td->Rn = 13;\n\t\td->RegisterList = (opcode.ThumbOp & 0xFF) | (1 << 14);\n\t\td->P = 1;\n\t\td->U = 0;\n\t\td->S = 0;\n\t\td->W = 1;\n\t\td->ExecuteCycles = 4;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_POP(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDM;\n\t\td->Rn = 13;\n\t\td->RegisterList = (opcode.ThumbOp & 0xFF);\n\t\td->P = 0;\n\t\td->U = 1;\n\t\td->S = 0;\n\t\td->W = 1;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_POP_PC(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDM;\n\t\td->Rn = 13;\n\t\td->RegisterList = (opcode.ThumbOp & 0xFF) | (1 << 15);\n\t\td->P = 0;\n\t\td->U = 1;\n\t\td->S = 0;\n\t\td->W = 1;\n\t\td->ExecuteCycles = 5;\n\t\td->VariableCycles = 1;\n\t\td->R15Modified = 1;\n\t\tif (PROCNUM == 0) d->TbitModified = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   STMIA / LDMIA\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_STMIA_THUMB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STM;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->RegisterList = (opcode.ThumbOp & 0xFF);\n\t\td->P = 0;\n\t\td->U = 1;\n\t\td->S = 0;\n\t\td->W = 1;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDMIA_THUMB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDM;\n\t\td->Rn = THUMB_REGPOS(opcode.ThumbOp, 8);\n\t\td->RegisterList = (opcode.ThumbOp & 0xFF);\n\t\td->P = 0;\n\t\td->U = 1;\n\t\td->S = 0;\n\t\td->W = 1;\n\t\td->ExecuteCycles = 2;\n\t\td->VariableCycles = 1;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   BKPT\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_BKPT_THUMB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_BKPT;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 4;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SWI\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SWI_THUMB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SWI;\n\t\t//d->Immediate = (opcode.ThumbOp & 0xFF);\n\t\td->Immediate = (opcode.ThumbOp & 0xFF) & 0x1F;\n\t\tbool bypassBuiltinSWI = \n\t\t\t(armcpu->intVector == 0x00000000 && armcpu->proc_ID==0)\n\t\t\t|| (armcpu->intVector == 0xFFFF0000 && armcpu->proc_ID==1);\n\t\tif (armcpu->swi_tab && !bypassBuiltinSWI)\n\t\t{\n\t\t\tif (d->Immediate == 0x04 || d->Immediate == 0x05 || d->Immediate == 0x06)\n\t\t\t\td->Reschedule = 1;\n\t\t\tif (d->Immediate == 0x04 || d->Immediate == 0x05)\n\t\t\t\td->MayHalt = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->TbitModified = 1;\n\t\t\td->Reschedule = 1;\n\t\t}\n\t\td->VariableCycles = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_B_COND(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\tu32 off = (u32)((s8)(opcode.ThumbOp&0xFF))<<1;\n\t\td->IROp = IR_B;\n\t\td->Cond = (opcode.ThumbOp>>8)&0xF;\n\t\td->Immediate = d->CalcR15(*d) + off;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_B_UNCOND(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\tu32 off = (((opcode.ThumbOp)&0x7FF) | (BIT10(opcode.ThumbOp) * 0xFFFFF800))<<1;\n\t\td->IROp = IR_B;\n\t\td->Immediate = d->CalcR15(*d) + off;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_BLX(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_T32P2;\n\t\td->R15Modified = 1;\n\t\td->TbitModified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_BL_10(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_T32P1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_BL_11(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_T32P2;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 4;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_BX_THUMB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_BX;\n\t\td->Rn = ARM_REGPOS(opcode.ThumbOp, 3);\n\t\td->R15Modified = 1;\n\t\td->TbitModified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_BLX_THUMB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_BLX;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 3);\n\t\td->R15Modified = 1;\n\t\td->TbitModified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n};\n\n//------------------------------------------------------------\n//                         ARM\n//------------------------------------------------------------\nnamespace ArmOpDecoder\n{\n#define LSL_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_LSL;\n\n#define S_LSL_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_LSL;\\\n\td->S = 1;\\\n\tif (!d->Immediate) \\\n\t\td->FlagsNeeded |= FLAG_C;\n\n#define LSL_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_LSL;\n\n#define S_LSL_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_LSL;\\\n\td->S = 1;\\\n\td->FlagsNeeded |= FLAG_C;\n\n#define LSR_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_LSR;\n\n#define S_LSR_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_LSR;\\\n\td->S = 1;\n\n#define LSR_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_LSR;\n\n#define S_LSR_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_LSR;\\\n\td->FlagsNeeded |= FLAG_C;\n\n#define ASR_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_ASR;\n\n#define S_ASR_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_ASR;\\\n\td->S = 1;\n\n#define ASR_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_ASR;\n\n#define S_ASR_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_ASR;\\\n\td->S = 1;\\\n\td->FlagsNeeded |= FLAG_C;\n\n#define ROR_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_ROR;\\\n\tif (d->Immediate) \\\n\t\td->FlagsNeeded |= FLAG_C;\n\n#define S_ROR_IMM \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Immediate = ((opcode.ArmOp>>7)&0x1F);\\\n\td->I = 0;\\\n\td->R = 0;\\\n\td->Typ = IRSHIFT_ROR;\\\n\td->S = 1;\\\n\tif (d->Immediate) \\\n\t\td->FlagsNeeded |= FLAG_C;\n\n#define ROR_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_ROR;\n\n#define S_ROR_REG \\\n\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\\\n\td->I = 0;\\\n\td->R = 1;\\\n\td->Typ = IRSHIFT_ROR;\\\n\td->S = 1;\\\n\td->FlagsNeeded |= FLAG_C;\n\n#define IMM_VALUE \\\n\td->Immediate = ROR((opcode.ArmOp&0xFF), (opcode.ArmOp>>7)&0x1E);\\\n\td->I = 1;\n\n#define S_IMM_VALUE \\\n\td->Immediate = ROR((opcode.ArmOp&0xFF), (opcode.ArmOp>>7)&0x1E);\\\n\td->I = 1;\\\n\td->S = 1;\\\n\tif (!((opcode.ArmOp>>8)&0xF)) \\\n\t\td->FlagsNeeded |= FLAG_C;\n\n//-----------------------------------------------------------------------------\n//   Undefined instruction\n//-----------------------------------------------------------------------------\n\tDCL_UNDEF_OP(OP_UND)\n\n//-----------------------------------------------------------------------------\n//   AND / ANDS\n//-----------------------------------------------------------------------------\n#define OPDEF_AND(a, b) \\\n\td->IROp = IR_AND;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_ANDS(a, b) \\\n\td->IROp = IR_AND;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_AND_LSL_IMM, LSL_IMM, OPDEF_AND, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_LSL_REG, LSL_REG, OPDEF_AND, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_LSR_IMM, LSR_IMM, OPDEF_AND, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_LSR_REG, LSR_REG, OPDEF_AND, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_ASR_IMM, ASR_IMM, OPDEF_AND, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_ASR_REG, ASR_REG, OPDEF_AND, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_ROR_IMM, ROR_IMM, OPDEF_AND, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_ROR_REG, ROR_REG, OPDEF_AND, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_IMM_VAL, IMM_VALUE, OPDEF_AND, 1, 3)\n\n\tDCL_OP2_ARG2(OP_AND_S_LSL_IMM, S_LSL_IMM, OPDEF_ANDS, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_S_LSL_REG, S_LSL_REG, OPDEF_ANDS, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_S_LSR_IMM, S_LSR_IMM, OPDEF_ANDS, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_S_LSR_REG, S_LSR_REG, OPDEF_ANDS, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_S_ASR_IMM, S_ASR_IMM, OPDEF_ANDS, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_S_ASR_REG, S_ASR_REG, OPDEF_ANDS, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_S_ROR_IMM, S_ROR_IMM, OPDEF_ANDS, 1, 3)\n\tDCL_OP2_ARG2(OP_AND_S_ROR_REG, S_ROR_REG, OPDEF_ANDS, 2, 4)\n\tDCL_OP2_ARG2(OP_AND_S_IMM_VAL, S_IMM_VALUE, OPDEF_ANDS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   EOR / EORS\n//-----------------------------------------------------------------------------\n#define OPDEF_EOR(a, b) \\\n\td->IROp = IR_EOR;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_EORS(a, b) \\\n\td->IROp = IR_EOR;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_EOR_LSL_IMM, LSL_IMM, OPDEF_EOR, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_LSL_REG, LSL_REG, OPDEF_EOR, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_LSR_IMM, LSR_IMM, OPDEF_EOR, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_LSR_REG, LSR_REG, OPDEF_EOR, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_ASR_IMM, ASR_IMM, OPDEF_EOR, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_ASR_REG, ASR_REG, OPDEF_EOR, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_ROR_IMM, ROR_IMM, OPDEF_EOR, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_ROR_REG, ROR_REG, OPDEF_EOR, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_IMM_VAL, IMM_VALUE, OPDEF_EOR, 1, 3)\n\n\tDCL_OP2_ARG2(OP_EOR_S_LSL_IMM, S_LSL_IMM, OPDEF_EORS, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_S_LSL_REG, S_LSL_REG, OPDEF_EORS, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_S_LSR_IMM, S_LSR_IMM, OPDEF_EORS, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_S_LSR_REG, S_LSR_REG, OPDEF_EORS, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_S_ASR_IMM, S_ASR_IMM, OPDEF_EORS, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_S_ASR_REG, S_ASR_REG, OPDEF_EORS, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_S_ROR_IMM, S_ROR_IMM, OPDEF_EORS, 1, 3)\n\tDCL_OP2_ARG2(OP_EOR_S_ROR_REG, S_ROR_REG, OPDEF_EORS, 2, 4)\n\tDCL_OP2_ARG2(OP_EOR_S_IMM_VAL, S_IMM_VALUE, OPDEF_EORS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   SUB / SUBS\n//-----------------------------------------------------------------------------\n#define OPDEF_SUB(a, b) \\\n\td->IROp = IR_SUB;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_SUBS(a, b) \\\n\td->IROp = IR_SUB;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_SUB_LSL_IMM, LSL_IMM, OPDEF_SUB, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_LSL_REG, LSL_REG, OPDEF_SUB, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_LSR_IMM, LSR_IMM, OPDEF_SUB, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_LSR_REG, LSR_REG, OPDEF_SUB, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_ASR_IMM, ASR_IMM, OPDEF_SUB, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_ASR_REG, ASR_REG, OPDEF_SUB, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_ROR_IMM, ROR_IMM, OPDEF_SUB, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_ROR_REG, ROR_REG, OPDEF_SUB, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_IMM_VAL, IMM_VALUE, OPDEF_SUB, 1, 3)\n\n\tDCL_OP2_ARG2(OP_SUB_S_LSL_IMM, LSL_IMM, OPDEF_SUBS, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_S_LSL_REG, LSL_REG, OPDEF_SUBS, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_S_LSR_IMM, LSR_IMM, OPDEF_SUBS, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_S_LSR_REG, LSR_REG, OPDEF_SUBS, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_S_ASR_IMM, ASR_IMM, OPDEF_SUBS, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_S_ASR_REG, ASR_REG, OPDEF_SUBS, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_S_ROR_IMM, ROR_IMM, OPDEF_SUBS, 1, 3)\n\tDCL_OP2_ARG2(OP_SUB_S_ROR_REG, ROR_REG, OPDEF_SUBS, 2, 4)\n\tDCL_OP2_ARG2(OP_SUB_S_IMM_VAL, IMM_VALUE, OPDEF_SUBS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   RSB / RSBS\n//-----------------------------------------------------------------------------\n#define OPDEF_RSB(a, b) \\\n\td->IROp = IR_RSB;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_RSBS(a, b) \\\n\td->IROp = IR_RSB;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_RSB_LSL_IMM, LSL_IMM, OPDEF_RSB, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_LSL_REG, LSL_REG, OPDEF_RSB, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_LSR_IMM, LSR_IMM, OPDEF_RSB, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_LSR_REG, LSR_REG, OPDEF_RSB, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_ASR_IMM, ASR_IMM, OPDEF_RSB, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_ASR_REG, ASR_REG, OPDEF_RSB, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_ROR_IMM, ROR_IMM, OPDEF_RSB, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_ROR_REG, ROR_REG, OPDEF_RSB, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_IMM_VAL, IMM_VALUE, OPDEF_RSB, 1, 3)\n\n\tDCL_OP2_ARG2(OP_RSB_S_LSL_IMM, LSL_IMM, OPDEF_RSBS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_S_LSL_REG, LSL_REG, OPDEF_RSBS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_S_LSR_IMM, LSR_IMM, OPDEF_RSBS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_S_LSR_REG, LSR_REG, OPDEF_RSBS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_S_ASR_IMM, ASR_IMM, OPDEF_RSBS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_S_ASR_REG, ASR_REG, OPDEF_RSBS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_S_ROR_IMM, ROR_IMM, OPDEF_RSBS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSB_S_ROR_REG, ROR_REG, OPDEF_RSBS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSB_S_IMM_VAL, IMM_VALUE, OPDEF_RSBS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   ADD / ADDS\n//-----------------------------------------------------------------------------\n#define OPDEF_ADD(a, b) \\\n\td->IROp = IR_ADD;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_ADDS(a, b) \\\n\td->IROp = IR_ADD;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_ADD_LSL_IMM, LSL_IMM, OPDEF_ADD, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_LSL_REG, LSL_REG, OPDEF_ADD, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_LSR_IMM, LSR_IMM, OPDEF_ADD, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_LSR_REG, LSR_REG, OPDEF_ADD, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_ASR_IMM, ASR_IMM, OPDEF_ADD, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_ASR_REG, ASR_REG, OPDEF_ADD, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_ROR_IMM, ROR_IMM, OPDEF_ADD, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_ROR_REG, ROR_REG, OPDEF_ADD, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_IMM_VAL, IMM_VALUE, OPDEF_ADD, 1, 3)\n\n\tDCL_OP2_ARG2(OP_ADD_S_LSL_IMM, LSL_IMM, OPDEF_ADDS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_S_LSL_REG, LSL_REG, OPDEF_ADDS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_S_LSR_IMM, LSR_IMM, OPDEF_ADDS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_S_LSR_REG, LSR_REG, OPDEF_ADDS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_S_ASR_IMM, ASR_IMM, OPDEF_ADDS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_S_ASR_REG, ASR_REG, OPDEF_ADDS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_S_ROR_IMM, ROR_IMM, OPDEF_ADDS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADD_S_ROR_REG, ROR_REG, OPDEF_ADDS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADD_S_IMM_VAL, IMM_VALUE, OPDEF_ADDS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   ADC / ADCS\n//-----------------------------------------------------------------------------\n#define OPDEF_ADC(a, b) \\\n\td->IROp = IR_ADC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->FlagsNeeded |= FLAG_C;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_ADCS(a, b) \\\n\td->IROp = IR_ADC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\td->FlagsNeeded |= FLAG_C;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_ADC_LSL_IMM, LSL_IMM, OPDEF_ADC, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_LSL_REG, LSL_REG, OPDEF_ADC, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_LSR_IMM, LSR_IMM, OPDEF_ADC, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_LSR_REG, LSR_REG, OPDEF_ADC, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_ASR_IMM, ASR_IMM, OPDEF_ADC, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_ASR_REG, ASR_REG, OPDEF_ADC, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_ROR_IMM, ROR_IMM, OPDEF_ADC, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_ROR_REG, ROR_REG, OPDEF_ADC, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_IMM_VAL, IMM_VALUE, OPDEF_ADC, 1, 3)\n\n\tDCL_OP2_ARG2(OP_ADC_S_LSL_IMM, LSL_IMM, OPDEF_ADCS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_S_LSL_REG, LSL_REG, OPDEF_ADCS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_S_LSR_IMM, LSR_IMM, OPDEF_ADCS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_S_LSR_REG, LSR_REG, OPDEF_ADCS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_S_ASR_IMM, ASR_IMM, OPDEF_ADCS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_S_ASR_REG, ASR_REG, OPDEF_ADCS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_S_ROR_IMM, ROR_IMM, OPDEF_ADCS, 1, 3)\n\tDCL_OP2_ARG2(OP_ADC_S_ROR_REG, ROR_REG, OPDEF_ADCS, 2, 4)\n\tDCL_OP2_ARG2(OP_ADC_S_IMM_VAL, IMM_VALUE, OPDEF_ADCS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   SBC / SBCS\n//-----------------------------------------------------------------------------\n#define OPDEF_SBC(a, b) \\\n\td->IROp = IR_SBC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->FlagsNeeded |= FLAG_C;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_SBCS(a, b) \\\n\td->IROp = IR_SBC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\td->FlagsNeeded |= FLAG_C;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_SBC_LSL_IMM, LSL_IMM, OPDEF_SBC, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_LSL_REG, LSL_REG, OPDEF_SBC, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_LSR_IMM, LSR_IMM, OPDEF_SBC, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_LSR_REG, LSR_REG, OPDEF_SBC, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_ASR_IMM, ASR_IMM, OPDEF_SBC, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_ASR_REG, ASR_REG, OPDEF_SBC, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_ROR_IMM, ROR_IMM, OPDEF_SBC, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_ROR_REG, ROR_REG, OPDEF_SBC, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_IMM_VAL, IMM_VALUE, OPDEF_SBC, 1, 3)\n\n\tDCL_OP2_ARG2(OP_SBC_S_LSL_IMM, LSL_IMM, OPDEF_SBCS, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_S_LSL_REG, LSL_REG, OPDEF_SBCS, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_S_LSR_IMM, LSR_IMM, OPDEF_SBCS, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_S_LSR_REG, LSR_REG, OPDEF_SBCS, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_S_ASR_IMM, ASR_IMM, OPDEF_SBCS, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_S_ASR_REG, ASR_REG, OPDEF_SBCS, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_S_ROR_IMM, ROR_IMM, OPDEF_SBCS, 1, 3)\n\tDCL_OP2_ARG2(OP_SBC_S_ROR_REG, ROR_REG, OPDEF_SBCS, 2, 4)\n\tDCL_OP2_ARG2(OP_SBC_S_IMM_VAL, IMM_VALUE, OPDEF_SBCS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   RSC / RSCS\n//-----------------------------------------------------------------------------\n#define OPDEF_RSC(a, b) \\\n\td->IROp = IR_RSC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->FlagsNeeded |= FLAG_C;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_RSCS(a, b) \\\n\td->IROp = IR_RSC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\td->FlagsNeeded |= FLAG_C;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_RSC_LSL_IMM, LSL_IMM, OPDEF_RSC, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_LSL_REG, LSL_REG, OPDEF_RSC, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_LSR_IMM, LSR_IMM, OPDEF_RSC, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_LSR_REG, LSR_REG, OPDEF_RSC, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_ASR_IMM, ASR_IMM, OPDEF_RSC, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_ASR_REG, ASR_REG, OPDEF_RSC, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_ROR_IMM, ROR_IMM, OPDEF_RSC, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_ROR_REG, ROR_REG, OPDEF_RSC, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_IMM_VAL, IMM_VALUE, OPDEF_RSC, 1, 3)\n\n\tDCL_OP2_ARG2(OP_RSC_S_LSL_IMM, LSL_IMM, OPDEF_RSCS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_S_LSL_REG, LSL_REG, OPDEF_RSCS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_S_LSR_IMM, LSR_IMM, OPDEF_RSCS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_S_LSR_REG, LSR_REG, OPDEF_RSCS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_S_ASR_IMM, ASR_IMM, OPDEF_RSCS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_S_ASR_REG, ASR_REG, OPDEF_RSCS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_S_ROR_IMM, ROR_IMM, OPDEF_RSCS, 1, 3)\n\tDCL_OP2_ARG2(OP_RSC_S_ROR_REG, ROR_REG, OPDEF_RSCS, 2, 4)\n\tDCL_OP2_ARG2(OP_RSC_S_IMM_VAL, IMM_VALUE, OPDEF_RSCS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\n#define OPDEF_TST(a) \\\n\td->IROp = IR_TST;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG1(OP_TST_LSL_IMM, S_LSL_IMM, OPDEF_TST, 1)\n\tDCL_OP2_ARG1(OP_TST_LSL_REG, S_LSL_REG, OPDEF_TST, 2)\n\tDCL_OP2_ARG1(OP_TST_LSR_IMM, S_LSR_IMM, OPDEF_TST, 1)\n\tDCL_OP2_ARG1(OP_TST_LSR_REG, S_LSR_REG, OPDEF_TST, 2)\n\tDCL_OP2_ARG1(OP_TST_ASR_IMM, S_ASR_IMM, OPDEF_TST, 1)\n\tDCL_OP2_ARG1(OP_TST_ASR_REG, S_ASR_REG, OPDEF_TST, 2)\n\tDCL_OP2_ARG1(OP_TST_ROR_IMM, S_ROR_IMM, OPDEF_TST, 1)\n\tDCL_OP2_ARG1(OP_TST_ROR_REG, S_ROR_REG, OPDEF_TST, 2)\n\tDCL_OP2_ARG1(OP_TST_IMM_VAL, S_IMM_VALUE, OPDEF_TST, 1)\n\n//-----------------------------------------------------------------------------\n//   TEQ\n//-----------------------------------------------------------------------------\n#define OPDEF_TEQ(a) \\\n\td->IROp = IR_TEQ;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG1(OP_TEQ_LSL_IMM, S_LSL_IMM, OPDEF_TEQ, 1)\n\tDCL_OP2_ARG1(OP_TEQ_LSL_REG, S_LSL_REG, OPDEF_TEQ, 2)\n\tDCL_OP2_ARG1(OP_TEQ_LSR_IMM, S_LSR_IMM, OPDEF_TEQ, 1)\n\tDCL_OP2_ARG1(OP_TEQ_LSR_REG, S_LSR_REG, OPDEF_TEQ, 2)\n\tDCL_OP2_ARG1(OP_TEQ_ASR_IMM, S_ASR_IMM, OPDEF_TEQ, 1)\n\tDCL_OP2_ARG1(OP_TEQ_ASR_REG, S_ASR_REG, OPDEF_TEQ, 2)\n\tDCL_OP2_ARG1(OP_TEQ_ROR_IMM, S_ROR_IMM, OPDEF_TEQ, 1)\n\tDCL_OP2_ARG1(OP_TEQ_ROR_REG, S_ROR_REG, OPDEF_TEQ, 2)\n\tDCL_OP2_ARG1(OP_TEQ_IMM_VAL, S_IMM_VALUE, OPDEF_TEQ, 1)\n\n//-----------------------------------------------------------------------------\n//   CMP\n//-----------------------------------------------------------------------------\n#define OPDEF_CMP(a) \\\n\td->IROp = IR_CMP;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG1(OP_CMP_LSL_IMM, LSL_IMM, OPDEF_CMP, 1)\n\tDCL_OP2_ARG1(OP_CMP_LSL_REG, LSL_REG, OPDEF_CMP, 2)\n\tDCL_OP2_ARG1(OP_CMP_LSR_IMM, LSR_IMM, OPDEF_CMP, 1)\n\tDCL_OP2_ARG1(OP_CMP_LSR_REG, LSR_REG, OPDEF_CMP, 2)\n\tDCL_OP2_ARG1(OP_CMP_ASR_IMM, ASR_IMM, OPDEF_CMP, 1)\n\tDCL_OP2_ARG1(OP_CMP_ASR_REG, ASR_REG, OPDEF_CMP, 2)\n\tDCL_OP2_ARG1(OP_CMP_ROR_IMM, ROR_IMM, OPDEF_CMP, 1)\n\tDCL_OP2_ARG1(OP_CMP_ROR_REG, ROR_REG, OPDEF_CMP, 2)\n\tDCL_OP2_ARG1(OP_CMP_IMM_VAL, IMM_VALUE, OPDEF_CMP, 1)\n\n//-----------------------------------------------------------------------------\n//   CMN\n//-----------------------------------------------------------------------------\n#define OPDEF_CMN(a) \\\n\td->IROp = IR_CMN;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->FlagsSet |= ALL_FLAGS;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG1(OP_CMN_LSL_IMM, LSL_IMM, OPDEF_CMN, 1)\n\tDCL_OP2_ARG1(OP_CMN_LSL_REG, LSL_REG, OPDEF_CMN, 2)\n\tDCL_OP2_ARG1(OP_CMN_LSR_IMM, LSR_IMM, OPDEF_CMN, 1)\n\tDCL_OP2_ARG1(OP_CMN_LSR_REG, LSR_REG, OPDEF_CMN, 2)\n\tDCL_OP2_ARG1(OP_CMN_ASR_IMM, ASR_IMM, OPDEF_CMN, 1)\n\tDCL_OP2_ARG1(OP_CMN_ASR_REG, ASR_REG, OPDEF_CMN, 2)\n\tDCL_OP2_ARG1(OP_CMN_ROR_IMM, ROR_IMM, OPDEF_CMN, 1)\n\tDCL_OP2_ARG1(OP_CMN_ROR_REG, ROR_REG, OPDEF_CMN, 2)\n\tDCL_OP2_ARG1(OP_CMN_IMM_VAL, IMM_VALUE, OPDEF_CMN, 1)\n\n//-----------------------------------------------------------------------------\n//   ORR / ORRS\n//-----------------------------------------------------------------------------\n#define OPDEF_ORR(a, b) \\\n\td->IROp = IR_ORR;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_ORRS(a, b) \\\n\td->IROp = IR_ORR;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_ORR_LSL_IMM, LSL_IMM, OPDEF_ORR, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_LSL_REG, LSL_REG, OPDEF_ORR, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_LSR_IMM, LSR_IMM, OPDEF_ORR, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_LSR_REG, LSR_REG, OPDEF_ORR, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_ASR_IMM, ASR_IMM, OPDEF_ORR, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_ASR_REG, ASR_REG, OPDEF_ORR, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_ROR_IMM, ROR_IMM, OPDEF_ORR, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_ROR_REG, ROR_REG, OPDEF_ORR, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_IMM_VAL, IMM_VALUE, OPDEF_ORR, 1, 3)\n\n\tDCL_OP2_ARG2(OP_ORR_S_LSL_IMM, S_LSL_IMM, OPDEF_ORRS, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_S_LSL_REG, S_LSL_REG, OPDEF_ORRS, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_S_LSR_IMM, S_LSR_IMM, OPDEF_ORRS, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_S_LSR_REG, S_LSR_REG, OPDEF_ORRS, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_S_ASR_IMM, S_ASR_IMM, OPDEF_ORRS, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_S_ASR_REG, S_ASR_REG, OPDEF_ORRS, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_S_ROR_IMM, S_ROR_IMM, OPDEF_ORRS, 1, 3)\n\tDCL_OP2_ARG2(OP_ORR_S_ROR_REG, S_ROR_REG, OPDEF_ORRS, 2, 4)\n\tDCL_OP2_ARG2(OP_ORR_S_IMM_VAL, S_IMM_VALUE, OPDEF_ORRS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   MOV / MOVS\n//-----------------------------------------------------------------------------\n#define OPDEF_MOV(a, b) \\\n\tif (opcode.ArmOp == 0xE1A00000)\\\n\t{\\\n\t\t/*nop: MOV R0, R0*/\\\n\t\td->IROp = IR_NOP;\\\n\t\td->ExecuteCycles = 1;\\\n\t\treturn 1;\\\n\t}\\\n\td->IROp = IR_MOV;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_MOVS(a, b) \\\n\td->IROp = IR_MOV;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_MOV_LSL_IMM, LSL_IMM, OPDEF_MOV, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_LSL_REG, LSL_REG, OPDEF_MOV, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_LSR_IMM, LSR_IMM, OPDEF_MOV, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_LSR_REG, LSR_REG, OPDEF_MOV, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_ASR_IMM, ASR_IMM, OPDEF_MOV, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_ASR_REG, ASR_REG, OPDEF_MOV, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_ROR_IMM, ROR_IMM, OPDEF_MOV, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_ROR_REG, ROR_REG, OPDEF_MOV, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_IMM_VAL, IMM_VALUE, OPDEF_MOV, 1, 3)\n\n\tDCL_OP2_ARG2(OP_MOV_S_LSL_IMM, S_LSL_IMM, OPDEF_MOVS, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_S_LSL_REG, S_LSL_REG, OPDEF_MOVS, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_S_LSR_IMM, S_LSR_IMM, OPDEF_MOVS, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_S_LSR_REG, S_LSR_REG, OPDEF_MOVS, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_S_ASR_IMM, S_ASR_IMM, OPDEF_MOVS, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_S_ASR_REG, S_ASR_REG, OPDEF_MOVS, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_S_ROR_IMM, S_ROR_IMM, OPDEF_MOVS, 1, 3)\n\tDCL_OP2_ARG2(OP_MOV_S_ROR_REG, S_ROR_REG, OPDEF_MOVS, 2, 4)\n\tDCL_OP2_ARG2(OP_MOV_S_IMM_VAL, S_IMM_VALUE, OPDEF_MOVS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   BIC / BICS\n//-----------------------------------------------------------------------------\n#define OPDEF_BIC(a, b) \\\n\td->IROp = IR_BIC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_BICS(a, b) \\\n\td->IROp = IR_BIC;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_BIC_LSL_IMM, LSL_IMM, OPDEF_BIC, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_LSL_REG, LSL_REG, OPDEF_BIC, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_LSR_IMM, LSR_IMM, OPDEF_BIC, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_LSR_REG, LSR_REG, OPDEF_BIC, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_ASR_IMM, ASR_IMM, OPDEF_BIC, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_ASR_REG, ASR_REG, OPDEF_BIC, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_ROR_IMM, ROR_IMM, OPDEF_BIC, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_ROR_REG, ROR_REG, OPDEF_BIC, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_IMM_VAL, IMM_VALUE, OPDEF_BIC, 1, 3)\n\n\tDCL_OP2_ARG2(OP_BIC_S_LSL_IMM, S_LSL_IMM, OPDEF_BICS, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_S_LSL_REG, S_LSL_REG, OPDEF_BICS, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_S_LSR_IMM, S_LSR_IMM, OPDEF_BICS, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_S_LSR_REG, S_LSR_REG, OPDEF_BICS, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_S_ASR_IMM, S_ASR_IMM, OPDEF_BICS, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_S_ASR_REG, S_ASR_REG, OPDEF_BICS, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_S_ROR_IMM, S_ROR_IMM, OPDEF_BICS, 1, 3)\n\tDCL_OP2_ARG2(OP_BIC_S_ROR_REG, S_ROR_REG, OPDEF_BICS, 2, 4)\n\tDCL_OP2_ARG2(OP_BIC_S_IMM_VAL, S_IMM_VALUE, OPDEF_BICS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   MVN / MVNS\n//-----------------------------------------------------------------------------\n#define OPDEF_MVN(a, b) \\\n\td->IROp = IR_MVN;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n#define OPDEF_MVNS(a, b) \\\n\td->IROp = IR_MVN;\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->S = 1;\\\n\tif (d->Rd == 15)\\\n\t{\\\n\t\td->R15Modified = 1;\\\n\t\tLOAD_CPSR\\\n\t\td->ExecuteCycles = b;\\\n\t\treturn 1;\\\n\t}\\\n\td->FlagsSet |= FLAG_C | FLAG_N | FLAG_Z;\\\n\td->ExecuteCycles = a;\\\n\treturn 1;\n\n\tDCL_OP2_ARG2(OP_MVN_LSL_IMM, LSL_IMM, OPDEF_MVN, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_LSL_REG, LSL_REG, OPDEF_MVN, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_LSR_IMM, LSR_IMM, OPDEF_MVN, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_LSR_REG, LSR_REG, OPDEF_MVN, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_ASR_IMM, ASR_IMM, OPDEF_MVN, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_ASR_REG, ASR_REG, OPDEF_MVN, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_ROR_IMM, ROR_IMM, OPDEF_MVN, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_ROR_REG, ROR_REG, OPDEF_MVN, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_IMM_VAL, IMM_VALUE, OPDEF_MVN, 1, 3)\n\n\tDCL_OP2_ARG2(OP_MVN_S_LSL_IMM, S_LSL_IMM, OPDEF_MVNS, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_S_LSL_REG, S_LSL_REG, OPDEF_MVNS, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_S_LSR_IMM, S_LSR_IMM, OPDEF_MVNS, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_S_LSR_REG, S_LSR_REG, OPDEF_MVNS, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_S_ASR_IMM, S_ASR_IMM, OPDEF_MVNS, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_S_ASR_REG, S_ASR_REG, OPDEF_MVNS, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_S_ROR_IMM, S_ROR_IMM, OPDEF_MVNS, 1, 3)\n\tDCL_OP2_ARG2(OP_MVN_S_ROR_REG, S_ROR_REG, OPDEF_MVNS, 2, 4)\n\tDCL_OP2_ARG2(OP_MVN_S_IMM_VAL, S_IMM_VALUE, OPDEF_MVNS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   MUL / MULS / MLA / MLAS\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_MUL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MUL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MLA(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MLA;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MUL_S(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MUL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MLA_S(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MLA;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   UMULL / UMULLS / UMLAL / UMLALS\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_UMULL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_UMULL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_UMLAL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_UMLAL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_UMULL_S(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_UMULL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_UMLAL_S(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_UMLAL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SMULL / SMULLS / SMLAL / SMLALS\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SMULL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLAL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMULL_S(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLAL_S(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAL;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->S = 1;\n\t\td->FlagsSet |= FLAG_N | FLAG_Z;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SWP / SWPB\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SWP(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SWP;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->B = 0;\n\t\td->ExecuteCycles = 4;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SWPB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SWP;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->B = 1;\n\t\td->ExecuteCycles = 4;\n\t\td->VariableCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   LDRH\n//-----------------------------------------------------------------------------\n#define OPDEF_LDRH(p,u,i,w,cycle)\\\n\td->IROp = IR_LDRx;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->I = i;\\\n\tif (i)\\\n\t{\\\n\t\td->Immediate = (((opcode.ArmOp>>4)&0xF0)+(opcode.ArmOp&0xF));\\\n\t}\\\n\telse\\\n\t{\\\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\t}\\\n\td->W = w;\\\n\td->S = 0;\\\n\td->H = 1;\\\n\td->ExecuteCycles = cycle;\\\n\td->VariableCycles = 1;\\\n\td->Reschedule = 2;\n\n\tDCL_OP1_ARG5(OP_LDRH_P_IMM_OFF, OPDEF_LDRH, 1, 1, 1, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRH_M_IMM_OFF, OPDEF_LDRH, 1, 0, 1, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRH_P_REG_OFF, OPDEF_LDRH, 1, 1, 0, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRH_M_REG_OFF, OPDEF_LDRH, 1, 0, 0, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRH_PRE_INDE_P_IMM_OFF, OPDEF_LDRH, 1, 1, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRH_PRE_INDE_M_IMM_OFF, OPDEF_LDRH, 1, 0, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRH_PRE_INDE_P_REG_OFF, OPDEF_LDRH, 1, 1, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRH_PRE_INDE_M_REG_OFF, OPDEF_LDRH, 1, 0, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRH_POS_INDE_P_IMM_OFF, OPDEF_LDRH, 0, 1, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRH_POS_INDE_M_IMM_OFF, OPDEF_LDRH, 0, 0, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRH_POS_INDE_P_REG_OFF, OPDEF_LDRH, 0, 1, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRH_POS_INDE_M_REG_OFF, OPDEF_LDRH, 0, 0, 0, 1, 3)\n\n#undef OPDEF_LDRH\n//-----------------------------------------------------------------------------\n//   STRH\n//-----------------------------------------------------------------------------\n#define OPDEF_STRH(p,u,i,w,cycle)\\\n\td->IROp = IR_STRx;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->I = i;\\\n\tif (i)\\\n\t{\\\n\t\td->Immediate = (((opcode.ArmOp>>4)&0xF0)+(opcode.ArmOp&0xF));\\\n\t}\\\n\telse\\\n\t{\\\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\t}\\\n\td->W = w;\\\n\td->S = 0;\\\n\td->H = 1;\\\n\td->ExecuteCycles = cycle;\\\n\td->VariableCycles = 1;\\\n\td->Reschedule = 2;\n\n\tDCL_OP1_ARG5(OP_STRH_P_IMM_OFF, OPDEF_STRH, 1, 1, 1, 0, 2)\n\tDCL_OP1_ARG5(OP_STRH_M_IMM_OFF, OPDEF_STRH, 1, 0, 1, 0, 2)\n\tDCL_OP1_ARG5(OP_STRH_P_REG_OFF, OPDEF_STRH, 1, 1, 0, 0, 2)\n\tDCL_OP1_ARG5(OP_STRH_M_REG_OFF, OPDEF_STRH, 1, 0, 0, 0, 2)\n\tDCL_OP1_ARG5(OP_STRH_PRE_INDE_P_IMM_OFF, OPDEF_STRH, 1, 1, 1, 1, 2)\n\tDCL_OP1_ARG5(OP_STRH_PRE_INDE_M_IMM_OFF, OPDEF_STRH, 1, 0, 1, 1, 2)\n\tDCL_OP1_ARG5(OP_STRH_PRE_INDE_P_REG_OFF, OPDEF_STRH, 1, 1, 0, 1, 2)\n\tDCL_OP1_ARG5(OP_STRH_PRE_INDE_M_REG_OFF, OPDEF_STRH, 1, 0, 0, 1, 2)\n\tDCL_OP1_ARG5(OP_STRH_POS_INDE_P_IMM_OFF, OPDEF_STRH, 0, 1, 1, 1, 2)\n\tDCL_OP1_ARG5(OP_STRH_POS_INDE_M_IMM_OFF, OPDEF_STRH, 0, 0, 1, 1, 2)\n\tDCL_OP1_ARG5(OP_STRH_POS_INDE_P_REG_OFF, OPDEF_STRH, 0, 1, 0, 1, 2)\n\tDCL_OP1_ARG5(OP_STRH_POS_INDE_M_REG_OFF, OPDEF_STRH, 0, 0, 0, 1, 2)\n\n#undef OPDEF_STRH\n//-----------------------------------------------------------------------------\n//   LDRSH\n//-----------------------------------------------------------------------------\n#define OPDEF_LDRSH(p,u,i,w,cycle)\\\n\td->IROp = IR_LDRx;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->I = i;\\\n\tif (i)\\\n\t{\\\n\t\td->Immediate = (((opcode.ArmOp>>4)&0xF0)+(opcode.ArmOp&0xF));\\\n\t}\\\n\telse\\\n\t{\\\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\t}\\\n\td->W = w;\\\n\td->S = 1;\\\n\td->H = 1;\\\n\td->ExecuteCycles = cycle;\\\n\td->VariableCycles = 1;\\\n\td->Reschedule = 2;\n\n\tDCL_OP1_ARG5(OP_LDRSH_P_IMM_OFF, OPDEF_LDRSH, 1, 1, 1, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_M_IMM_OFF, OPDEF_LDRSH, 1, 0, 1, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_P_REG_OFF, OPDEF_LDRSH, 1, 1, 0, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_M_REG_OFF, OPDEF_LDRSH, 1, 0, 0, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_PRE_INDE_P_IMM_OFF, OPDEF_LDRSH, 1, 1, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_PRE_INDE_M_IMM_OFF, OPDEF_LDRSH, 1, 0, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_PRE_INDE_P_REG_OFF, OPDEF_LDRSH, 1, 1, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_PRE_INDE_M_REG_OFF, OPDEF_LDRSH, 1, 0, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_POS_INDE_P_IMM_OFF, OPDEF_LDRSH, 0, 1, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_POS_INDE_M_IMM_OFF, OPDEF_LDRSH, 0, 0, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_POS_INDE_P_REG_OFF, OPDEF_LDRSH, 0, 1, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSH_POS_INDE_M_REG_OFF, OPDEF_LDRSH, 0, 0, 0, 1, 3)\n\n#undef OPDEF_LDRSH\n\n//-----------------------------------------------------------------------------\n//   LDRSB\n//-----------------------------------------------------------------------------\n#define OPDEF_LDRSB(p,u,i,w,cycle)\\\n\td->IROp = IR_LDRx;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->I = i;\\\n\tif (i)\\\n\t{\\\n\t\td->Immediate = (((opcode.ArmOp>>4)&0xF0)+(opcode.ArmOp&0xF));\\\n\t}\\\n\telse\\\n\t{\\\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\\\n\t}\\\n\td->W = w;\\\n\td->S = 1;\\\n\td->H = 0;\\\n\td->ExecuteCycles = cycle;\\\n\td->VariableCycles = 1;\\\n\td->Reschedule = 2;\n\n\tDCL_OP1_ARG5(OP_LDRSB_P_IMM_OFF, OPDEF_LDRSB, 1, 1, 1, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_M_IMM_OFF, OPDEF_LDRSB, 1, 0, 1, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_P_REG_OFF, OPDEF_LDRSB, 1, 1, 0, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_M_REG_OFF, OPDEF_LDRSB, 1, 0, 0, 0, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_PRE_INDE_P_IMM_OFF, OPDEF_LDRSB, 1, 1, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_PRE_INDE_M_IMM_OFF, OPDEF_LDRSB, 1, 0, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_PRE_INDE_P_REG_OFF, OPDEF_LDRSB, 1, 1, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_PRE_INDE_M_REG_OFF, OPDEF_LDRSB, 1, 0, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_POS_INDE_P_IMM_OFF, OPDEF_LDRSB, 0, 1, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_POS_INDE_M_IMM_OFF, OPDEF_LDRSB, 0, 0, 1, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_POS_INDE_P_REG_OFF, OPDEF_LDRSB, 0, 1, 0, 1, 3)\n\tDCL_OP1_ARG5(OP_LDRSB_POS_INDE_M_REG_OFF, OPDEF_LDRSB, 0, 0, 0, 1, 3)\n\n#undef OPDEF_LDRSB\n\n//-----------------------------------------------------------------------------\n//   MRS / MSR\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_MRS_CPSR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MRS;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\t//if (d->Rd == 15)\n\t\t//\td->R15Modified = 1;\n\t\td->P = 0;\n\t\td->FlagsNeeded |= ALL_FLAGS;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MRS_SPSR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MRS;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->P = 1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MSR_CPSR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MSR;\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->P = 0;\n\t\td->OpData = (opcode.ArmOp >> 16) & 0xF;\n\t\tif (BIT19(opcode.ArmOp))\n\t\t\td->FlagsSet |= ALL_FLAGS;\n\t\tif (BIT16(opcode.ArmOp))\n\t\t\td->TbitModified = 1;\n\t\td->Reschedule = 1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MSR_SPSR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MSR;\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->P = 1;\n\t\td->OpData = (opcode.ArmOp >> 16) & 0xF;\n\t\td->Reschedule = 1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MSR_CPSR_IMM_VAL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MSR;\n\t\td->Immediate = ROR((opcode.ArmOp&0xFF), (opcode.ArmOp>>7)&0x1E);\n\t\td->P = 0;\n\t\td->I = 1;\n\t\td->OpData = (opcode.ArmOp >> 16) & 0xF;\n\t\tif (BIT19(opcode.ArmOp))\n\t\t\td->FlagsSet |= ALL_FLAGS;\n\t\tif (BIT16(opcode.ArmOp))\n\t\t\td->TbitModified = 1;\n\t\td->Reschedule = 1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MSR_SPSR_IMM_VAL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MSR;\n\t\td->Immediate = ROR((opcode.ArmOp&0xFF), (opcode.ArmOp>>7)&0x1E);\n\t\td->P = 1;\n\t\td->I = 1;\n\t\td->OpData = (opcode.ArmOp >> 16) & 0xF;\n\t\td->Reschedule = 1;\n\t\td->ExecuteCycles = 1;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_BX(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_BX;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->R15Modified = 1;\n\t\td->TbitModified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_BLX_REG(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_BLX;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->R15Modified = 1;\n\t\td->TbitModified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\tu32 off = (u32)(((s32)opcode.ArmOp<<8)>>8);\n\t\td->IROp = IR_B;\n\t\td->Immediate = (d->CalcR15(*d) + (off<<2))&0xFFFFFFFC;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_BL(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\tu32 off = (u32)(((s32)opcode.ArmOp<<8)>>8);\n\t\td->IROp = IR_BL;\n\t\td->Immediate = (d->CalcR15(*d) + (off<<2))&0xFFFFFFFC;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   CLZ\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_CLZ(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_CLZ;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   QADD / QDADD / QSUB / QDSUB\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_QADD(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_QADD;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\tif (d->Rd == 15)\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->ExecuteCycles = 3;\n\t\t}\n\t\telse\n\t\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_QSUB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_QSUB;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\tif (d->Rd == 15)\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->ExecuteCycles = 3;\n\t\t}\n\t\telse\n\t\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_QDADD(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_QDADD;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\tif (d->Rd == 15)\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->ExecuteCycles = 3;\n\t\t}\n\t\telse\n\t\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_QDSUB(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_QDSUB;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\tif (d->Rd == 15)\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->ExecuteCycles = 3;\n\t\t}\n\t\telse\n\t\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SMUL\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SMUL_B_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 0;\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMUL_B_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 0;\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMUL_T_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 1;\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMUL_T_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 1;\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SMLA\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SMLA_B_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 0;\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLA_B_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 0;\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLA_T_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 1;\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLA_T_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 1;\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SMLAL\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SMLAL_B_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLALxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 0;\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLAL_B_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLALxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 0;\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLAL_T_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLALxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 1;\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLAL_T_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLALxy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->X = 1;\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SMULW\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SMULW_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULWy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMULW_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMULWy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SMLAW\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SMLAW_B(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAWy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->Y = 0;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_SMLAW_T(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SMLAWy;\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rs = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->Y = 1;\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   LDR\n//-----------------------------------------------------------------------------\n#define IMM_OFF_12 \\\n\td->Immediate = ((opcode.ArmOp)&0xFFF);\\\n\td->I = 1;\n\n#define OPDEF_LDR(p,u,b,w,cycle_a,cycle_b)\\\n\td->IROp = IR_LDR;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->B = b;\\\n\td->W = w;\\\n\td->VariableCycles = 1;\\\n\td->ExecuteCycles = cycle_a;\\\n\tif (!d->B && d->Rd == 15)\\\n\t{\\\n\t\td->ExecuteCycles = cycle_b;\\\n\t\td->R15Modified = 1;\\\n\t\tif (PROCNUM == 0) d->TbitModified = 1;\\\n\t}\\\n\td->Reschedule = 2;\n\n\tDCL_OP2_ARG6(OP_LDR_P_IMM_OFF, IMM_OFF_12, OPDEF_LDR, 1, 1, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_IMM_OFF, IMM_OFF_12, OPDEF_LDR, 1, 0, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_LSL_IMM_OFF, LSL_IMM, OPDEF_LDR, 1, 1, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_LSL_IMM_OFF, LSL_IMM, OPDEF_LDR, 1, 0, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_LSR_IMM_OFF, LSR_IMM, OPDEF_LDR, 1, 1, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_LSR_IMM_OFF, LSR_IMM, OPDEF_LDR, 1, 0, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_ASR_IMM_OFF, ASR_IMM, OPDEF_LDR, 1, 1, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_ASR_IMM_OFF, ASR_IMM, OPDEF_LDR, 1, 0, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_ROR_IMM_OFF, ROR_IMM, OPDEF_LDR, 1, 1, 0, 0, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_ROR_IMM_OFF, ROR_IMM, OPDEF_LDR, 1, 0, 0, 0, 3, 5)\n\n\tDCL_OP2_ARG6(OP_LDR_P_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_LDR, 1, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_LDR, 1, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_LDR, 1, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_LDR, 1, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_LDR, 1, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_LDR, 1, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_LDR, 1, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_LDR, 1, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_LDR, 1, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_LDR, 1, 0, 0, 1, 3, 5)\n\n\tDCL_OP2_ARG6(OP_LDR_P_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_LDR, 0, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_LDR, 0, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_LDR, 0, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_LDR, 0, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_LDR, 0, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_LDR, 0, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_LDR, 0, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_LDR, 0, 0, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_P_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_LDR, 0, 1, 0, 1, 3, 5)\n\tDCL_OP2_ARG6(OP_LDR_M_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_LDR, 0, 0, 0, 1, 3, 5)\n\n//-----------------------------------------------------------------------------\n//   LDREX\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_LDREX(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_LDREX;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->VariableCycles = 1;\n\t\td->ExecuteCycles = 3;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   LDRB\n//-----------------------------------------------------------------------------\n\tDCL_OP2_ARG6(OP_LDRB_P_IMM_OFF, IMM_OFF_12, OPDEF_LDR, 1, 1, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_IMM_OFF, IMM_OFF_12, OPDEF_LDR, 1, 0, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_LSL_IMM_OFF, LSL_IMM, OPDEF_LDR, 1, 1, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_LSL_IMM_OFF, LSL_IMM, OPDEF_LDR, 1, 0, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_LSR_IMM_OFF, LSR_IMM, OPDEF_LDR, 1, 1, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_LSR_IMM_OFF, LSR_IMM, OPDEF_LDR, 1, 0, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_ASR_IMM_OFF, ASR_IMM, OPDEF_LDR, 1, 1, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_ASR_IMM_OFF, ASR_IMM, OPDEF_LDR, 1, 0, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_ROR_IMM_OFF, ROR_IMM, OPDEF_LDR, 1, 1, 1, 0, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_ROR_IMM_OFF, ROR_IMM, OPDEF_LDR, 1, 0, 1, 0, 3, 3)\n\n\tDCL_OP2_ARG6(OP_LDRB_P_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_LDR, 1, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_LDR, 1, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_LDR, 1, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_LDR, 1, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_LDR, 1, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_LDR, 1, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_LDR, 1, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_LDR, 1, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_LDR, 1, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_LDR, 1, 0, 1, 1, 3, 3)\n\n\tDCL_OP2_ARG6(OP_LDRB_P_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_LDR, 0, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_LDR, 0, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_LDR, 0, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_LDR, 0, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_LDR, 0, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_LDR, 0, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_LDR, 0, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_LDR, 0, 0, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_P_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_LDR, 0, 1, 1, 1, 3, 3)\n\tDCL_OP2_ARG6(OP_LDRB_M_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_LDR, 0, 0, 1, 1, 3, 3)\n\n//-----------------------------------------------------------------------------\n//   STR\n//-----------------------------------------------------------------------------\n#define OPDEF_STR(p,u,b,w,cycle)\\\n\td->IROp = IR_STR;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->B = b;\\\n\td->W = w;\\\n\td->VariableCycles = 1;\\\n\td->ExecuteCycles = cycle;\\\n\td->Reschedule = 2;\n\n\tDCL_OP2_ARG5(OP_STR_P_IMM_OFF, IMM_OFF_12, OPDEF_STR, 1, 1, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_M_IMM_OFF, IMM_OFF_12, OPDEF_STR, 1, 0, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_P_LSL_IMM_OFF, LSL_IMM, OPDEF_STR, 1, 1, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_M_LSL_IMM_OFF, LSL_IMM, OPDEF_STR, 1, 0, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_P_LSR_IMM_OFF, LSR_IMM, OPDEF_STR, 1, 1, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_M_LSR_IMM_OFF, LSR_IMM, OPDEF_STR, 1, 0, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_P_ASR_IMM_OFF, ASR_IMM, OPDEF_STR, 1, 1, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_M_ASR_IMM_OFF, ASR_IMM, OPDEF_STR, 1, 0, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_P_ROR_IMM_OFF, ROR_IMM, OPDEF_STR, 1, 1, 0, 0, 2)\n\tDCL_OP2_ARG5(OP_STR_M_ROR_IMM_OFF, ROR_IMM, OPDEF_STR, 1, 0, 0, 0, 2)\n\n\tDCL_OP2_ARG5(OP_STR_P_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_STR, 1, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_STR, 1, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_STR, 1, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_STR, 1, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_STR, 1, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_STR, 1, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_STR, 1, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_STR, 1, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_STR, 1, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_STR, 1, 0, 0, 1, 2)\n\n\tDCL_OP2_ARG5(OP_STR_P_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_STR, 0, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_STR, 0, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_STR, 0, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_STR, 0, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_STR, 0, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_STR, 0, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_STR, 0, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_STR, 0, 0, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_P_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_STR, 0, 1, 0, 1, 2)\n\tDCL_OP2_ARG5(OP_STR_M_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_STR, 0, 0, 0, 1, 2)\n\n//-----------------------------------------------------------------------------\n//   STREX\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_STREX(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_STREX;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->VariableCycles = 1;\n\t\td->ExecuteCycles = 2;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   STRB\n//-----------------------------------------------------------------------------\n\tDCL_OP2_ARG5(OP_STRB_P_IMM_OFF, IMM_OFF_12, OPDEF_STR, 1, 1, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_IMM_OFF, IMM_OFF_12, OPDEF_STR, 1, 0, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_LSL_IMM_OFF, LSL_IMM, OPDEF_STR, 1, 1, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_LSL_IMM_OFF, LSL_IMM, OPDEF_STR, 1, 0, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_LSR_IMM_OFF, LSR_IMM, OPDEF_STR, 1, 1, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_LSR_IMM_OFF, LSR_IMM, OPDEF_STR, 1, 0, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_ASR_IMM_OFF, ASR_IMM, OPDEF_STR, 1, 1, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_ASR_IMM_OFF, ASR_IMM, OPDEF_STR, 1, 0, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_ROR_IMM_OFF, ROR_IMM, OPDEF_STR, 1, 1, 1, 0, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_ROR_IMM_OFF, ROR_IMM, OPDEF_STR, 1, 0, 1, 0, 2)\n\n\tDCL_OP2_ARG5(OP_STRB_P_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_STR, 1, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_IMM_OFF_PREIND, IMM_OFF_12, OPDEF_STR, 1, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_STR, 1, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_LSL_IMM_OFF_PREIND, LSL_IMM, OPDEF_STR, 1, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_STR, 1, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_LSR_IMM_OFF_PREIND, LSR_IMM, OPDEF_STR, 1, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_STR, 1, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_ASR_IMM_OFF_PREIND, ASR_IMM, OPDEF_STR, 1, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_STR, 1, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_ROR_IMM_OFF_PREIND, ROR_IMM, OPDEF_STR, 1, 0, 1, 1, 2)\n\n\tDCL_OP2_ARG5(OP_STRB_P_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_STR, 0, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_IMM_OFF_POSTIND, IMM_OFF_12, OPDEF_STR, 0, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_STR, 0, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OPDEF_STR, 0, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_STR, 0, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OPDEF_STR, 0, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_STR, 0, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OPDEF_STR, 0, 0, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_P_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_STR, 0, 1, 1, 1, 2)\n\tDCL_OP2_ARG5(OP_STRB_M_ROR_IMM_OFF_POSTIND, ROR_IMM, OPDEF_STR, 0, 0, 1, 1, 2)\n\n//-----------------------------------------------------------------------------\n//   LDMIA / LDMIB / LDMDA / LDMDB\n//-----------------------------------------------------------------------------\n#define OPDEF_LDM(p,u,s,w,cycle_a,cycle_b)\\\n\td->IROp = IR_LDM;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->RegisterList = (opcode.ArmOp & 0xFFFF);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->S = s;\\\n\td->W = w;\\\n\td->VariableCycles = 1;\\\n\td->ExecuteCycles = cycle_a;\\\n\td->Reschedule = 2;\\\n\tif (s) d->Reschedule = 1;\\\n\tif (BIT15(opcode.ArmOp))\\\n\t{\\\n\t\td->ExecuteCycles = cycle_b;\\\n\t\td->R15Modified = 1;\\\n\t\tif (PROCNUM == 0) d->TbitModified = 1;\\\n\t\tif (s) LOAD_CPSR\\\n\t}\n\n\tDCL_OP1_ARG6(OP_LDMIA, OPDEF_LDM, 0, 1, 0, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMIB, OPDEF_LDM, 1, 1, 0, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMDA, OPDEF_LDM, 0, 0, 0, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMDB, OPDEF_LDM, 1, 0, 0, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMIA_W, OPDEF_LDM, 0, 1, 0, 1, 2, 4)\n\tDCL_OP1_ARG6(OP_LDMIB_W, OPDEF_LDM, 1, 1, 0, 1, 2, 4)\n\tDCL_OP1_ARG6(OP_LDMDA_W, OPDEF_LDM, 0, 0, 0, 1, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMDB_W, OPDEF_LDM, 1, 0, 0, 1, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMIA2, OPDEF_LDM, 0, 1, 1, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMIB2, OPDEF_LDM, 1, 1, 1, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMDA2, OPDEF_LDM, 0, 0, 1, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMDB2, OPDEF_LDM, 1, 0, 1, 0, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMIA2_W, OPDEF_LDM, 0, 1, 1, 1, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMIB2_W, OPDEF_LDM, 1, 1, 1, 1, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMDA2_W, OPDEF_LDM, 0, 0, 1, 1, 2, 2)\n\tDCL_OP1_ARG6(OP_LDMDB2_W, OPDEF_LDM, 1, 0, 1, 1, 2, 2)\n\n//-----------------------------------------------------------------------------\n//   STMIA / STMIB / STMDA / STMDB\n//-----------------------------------------------------------------------------\n#define OPDEF_STM(p,u,s,w,cycle)\\\n\td->IROp = IR_STM;\\\n\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\\\n\td->RegisterList = (opcode.ArmOp & 0xFFFF);\\\n\td->P = p;\\\n\td->U = u;\\\n\td->S = s;\\\n\td->W = w;\\\n\td->Reschedule = 2;\\\n\tif (s) d->Reschedule = 1;\\\n\td->VariableCycles = 1;\\\n\td->ExecuteCycles = cycle;\n\n\tDCL_OP1_ARG5(OP_STMIA, OPDEF_STM, 0, 1, 0, 0, 1)\n\tDCL_OP1_ARG5(OP_STMIB, OPDEF_STM, 1, 1, 0, 0, 1)\n\tDCL_OP1_ARG5(OP_STMDA, OPDEF_STM, 0, 0, 0, 0, 1)\n\tDCL_OP1_ARG5(OP_STMDB, OPDEF_STM, 1, 0, 0, 0, 1)\n\tDCL_OP1_ARG5(OP_STMIA_W, OPDEF_STM, 0, 1, 0, 1, 1)\n\tDCL_OP1_ARG5(OP_STMIB_W, OPDEF_STM, 1, 1, 0, 1, 1)\n\tDCL_OP1_ARG5(OP_STMDA_W, OPDEF_STM, 0, 0, 0, 1, 1)\n\tDCL_OP1_ARG5(OP_STMDB_W, OPDEF_STM, 1, 0, 0, 1, 1)\n\tDCL_OP1_ARG5(OP_STMIA2, OPDEF_STM, 0, 1, 1, 0, 1)\n\tDCL_OP1_ARG5(OP_STMIB2, OPDEF_STM, 1, 1, 1, 0, 1)\n\tDCL_OP1_ARG5(OP_STMDA2, OPDEF_STM, 0, 0, 1, 0, 1)\n\tDCL_OP1_ARG5(OP_STMDB2, OPDEF_STM, 1, 0, 1, 0, 1)\n\tDCL_OP1_ARG5(OP_STMIA2_W, OPDEF_STM, 0, 1, 1, 1, 1)\n\tDCL_OP1_ARG5(OP_STMIB2_W, OPDEF_STM, 1, 1, 1, 1, 1)\n\tDCL_OP1_ARG5(OP_STMDA2_W, OPDEF_STM, 0, 0, 1, 1, 1)\n\tDCL_OP1_ARG5(OP_STMDB2_W, OPDEF_STM, 1, 0, 1, 1, 1)\n\n//-----------------------------------------------------------------------------\n//   LDRD / STRD\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_LDRD_STRD_POST_INDEX(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\tif (BIT5(opcode.ArmOp)) \n\t\t\td->IROp = IR_STRD;\n\t\telse\n\t\t\td->IROp = IR_LDRD;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\tif (BIT22(opcode.ArmOp))\n\t\t{\n\t\t\td->I = 1;\n\t\t\td->Immediate = (((opcode.ArmOp>>4)&0xF0)+(opcode.ArmOp&0xF));\n\t\t}\n\t\telse\n\t\t{\n\t\t\td->I = 0;\n\t\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\t}\n\t\td->U = BIT23(opcode.ArmOp);\n\t\td->P = 0;\n\t\td->W = 1;\n\t\td->VariableCycles = 1;\n\t\td->ExecuteCycles = 3;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_LDRD_STRD_OFFSET_PRE_INDEX(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\tif (BIT5(opcode.ArmOp)) \n\t\t\td->IROp = IR_STRD;\n\t\telse\n\t\t\td->IROp = IR_LDRD;\n\t\td->Rn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\tif (BIT22(opcode.ArmOp))\n\t\t{\n\t\t\td->I = 1;\n\t\t\td->Immediate = (((opcode.ArmOp>>4)&0xF0)+(opcode.ArmOp&0xF));\n\t\t}\n\t\telse\n\t\t{\n\t\t\td->I = 0;\n\t\t\td->Rm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\t}\n\t\td->U = BIT23(opcode.ArmOp);\n\t\td->P = 1;\n\t\td->W = BIT21(opcode.ArmOp);\n\t\td->VariableCycles = 1;\n\t\td->ExecuteCycles = 3;\n\t\td->Reschedule = 2;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   STC\n//   the NDS has no coproc that responses to a STC, no feedback is given to the arm\n//-----------------------------------------------------------------------------\n\tDCL_UNDEF_OP(OP_STC_P_IMM_OFF)\n\tDCL_UNDEF_OP(OP_STC_M_IMM_OFF)\n\tDCL_UNDEF_OP(OP_STC_P_PREIND)\n\tDCL_UNDEF_OP(OP_STC_M_PREIND)\n\tDCL_UNDEF_OP(OP_STC_P_POSTIND)\n\tDCL_UNDEF_OP(OP_STC_M_POSTIND)\n\tDCL_UNDEF_OP(OP_STC_OPTION)\n\n//-----------------------------------------------------------------------------\n//   LDC\n//   the NDS has no coproc that responses to a LDC, no feedback is given to the arm\n//-----------------------------------------------------------------------------\n\tDCL_UNDEF_OP(OP_LDC_P_IMM_OFF)\n\tDCL_UNDEF_OP(OP_LDC_M_IMM_OFF)\n\tDCL_UNDEF_OP(OP_LDC_P_PREIND)\n\tDCL_UNDEF_OP(OP_LDC_M_PREIND)\n\tDCL_UNDEF_OP(OP_LDC_P_POSTIND)\n\tDCL_UNDEF_OP(OP_LDC_M_POSTIND)\n\tDCL_UNDEF_OP(OP_LDC_OPTION)\n\n//-----------------------------------------------------------------------------\n//   MCR / MRC\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_MCR(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MCR;\n\t\td->CRm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->CP = (opcode.ArmOp>>5)&0x7;\n\t\td->CPNum = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->CRn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->CPOpc = (opcode.ArmOp>>21)&0x7;\n\t\tif (d->CPNum == 15)\n\t\t{\n\t\t\tif (d->CRn == 1 && d->CRm == 0 && d->CPOpc == 0 && d->CP == 0)\n\t\t\t\td->InvalidICache = 2;\n\t\t\telse if (d->CRn == 7 && d->CPOpc == 0)\n\t\t\t{\n\t\t\t\tif (d->CRm == 0 && d->CP == 4)\n\t\t\t\t\td->Reschedule = 1;\n\t\t\t\telse if (d->CRm == 5 && d->CP >= 0 && d->CP <= 2)\n\t\t\t\t\td->InvalidICache = 1;\n\t\t\t}\n\t\t\telse if (d->CRn == 9 && d->CRm == 1 && d->CPOpc == 0 && d->CP == 0)\n\t\t\t\td->InvalidICache = 2;\n\t\t}\n\t\td->ExecuteCycles = 2;\n\t\treturn 1;\n\t}\n\n\tTEMPLATE u32 FASTCALL OP_MRC(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_MRC;\n\t\td->CRm = ARM_REGPOS(opcode.ArmOp, 0);\n\t\td->CP = (opcode.ArmOp>>5)&0x7;\n\t\td->CPNum = ARM_REGPOS(opcode.ArmOp, 8);\n\t\td->Rd = ARM_REGPOS(opcode.ArmOp, 12);\n\t\td->CRn = ARM_REGPOS(opcode.ArmOp, 16);\n\t\td->CPOpc = (opcode.ArmOp>>21)&0x7;\n\t\td->ExecuteCycles = 4;\n\t\tif (d->Rd == 15)\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->FlagsSet |= ALL_FLAGS;\n\t\t}\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   SWI\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_SWI(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_SWI;\n\t\t//d->Immediate = (opcode.ArmOp>>16)&0xFF;\n\t\td->Immediate = ((opcode.ArmOp>>16)&0xFF) & 0x1F;\n\t\tbool bypassBuiltinSWI = \n\t\t\t(armcpu->intVector == 0x00000000 && armcpu->proc_ID==0)\n\t\t\t|| (armcpu->intVector == 0xFFFF0000 && armcpu->proc_ID==1);\n\t\tif (armcpu->swi_tab && !bypassBuiltinSWI)\n\t\t{\n\t\t\tif (d->Immediate == 0x04 || d->Immediate == 0x05 || d->Immediate == 0x06)\n\t\t\t\td->Reschedule = 1;\n\t\t\tif (d->Immediate == 0x04 || d->Immediate == 0x05)\n\t\t\t\td->MayHalt = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\td->R15Modified = 1;\n\t\t\td->Reschedule = 1;\n\t\t}\n\t\td->VariableCycles = 1;\n\t\td->ExecuteCycles = 3;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   BKPT\n//-----------------------------------------------------------------------------\n\tTEMPLATE u32 FASTCALL OP_BKPT(armcpu_t *armcpu, const OPCODE opcode, struct _Decoded* d)\n\t{\n\t\td->IROp = IR_BKPT;\n\t\td->R15Modified = 1;\n\t\td->ExecuteCycles = 4;\n\t\treturn 1;\n\t}\n\n//-----------------------------------------------------------------------------\n//   CDP\n//-----------------------------------------------------------------------------\n\tDCL_UNDEF_OP(OP_CDP)\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////////\nstatic const OpDecoder thumb_opdecoder_set[2][1024] = {{\n#define TABDECL(x) ThumbOpDecoder::x<0>\n#include \"thumb_tabdef.inc\"\n#undef TABDECL\n},{\n#define TABDECL(x) ThumbOpDecoder::x<1>\n#include \"thumb_tabdef.inc\"\n#undef TABDECL\n}};\nstatic const OpDecoder arm_cond_opdecoder_set[2][4096] = {{\n#define TABDECL(x) ArmOpDecoder::x<0>\n#include \"instruction_tabdef.inc\"\n#undef TABDECL\n},{\n#define TABDECL(x) ArmOpDecoder::x<1>\n#include \"instruction_tabdef.inc\"\n#undef TABDECL\n}};\n\n///////////////////////////////////////////////////////////////////////////////////////////////\n#define ARM_OPCODE_INDEX(i)\t\t((((i)>>16)&0xFF0)|(((i)>>4)&0xF))\n#define THUMB_OPCODE_INDEX(i)\t((i)>>6)\n#define ARM_CONDITION(i)\t\t((i)>>28)\n#define THUMB2_HEAD(i)\t\t\t((i)>>11)\n\nstatic const u32 FlagList[] = {\n    FLAG_Z,\n    FLAG_C,\n    FLAG_N,\n    FLAG_V,\n    (FLAG_Z|FLAG_C),\n    (FLAG_N|FLAG_V),\n    (FLAG_Z|FLAG_N|FLAG_V),\n    NO_FLAGS\n};\n\nstatic const char *CondStrings[] ={\n    \"(EQ) \",\n    \"(NE) \",\n    \"(CS) \",\n    \"(CC) \",\n    \"(MI) \",\n    \"(PL) \",\n    \"(VS) \",\n    \"(VC) \",\n    \"(HI) \",\n    \"(LS) \",\n    \"(GC) \",\n    \"(LT) \",\n    \"(GT) \",\n    \"(LE) \",\n    \"(AL) \",\n\t\"(UNCOND)\"\n};\n\nstatic const char *FlagStrings[] = {\n    \"(    )\",\n    \"(   V)\",\n    \"(  C )\",\n    \"(  CV)\",\n    \"( Z  )\",\n    \"( Z V)\",\n    \"( ZC )\",\n    \"( ZCV)\",\n    \"(N   )\",\n    \"(N  V)\",\n    \"(N C )\",\n    \"(N CV)\",\n    \"(NZ  )\",\n    \"(NZ V)\",\n    \"(NZC )\",\n    \"(NZCV)\"\n};\n\ntypedef struct _ProcessorConfig {\n\tstruct ARM\n\t{\n\t\tstatic u32 PCOffset[2];\n\t\tstatic u32 PCStoreOffset[2];\t//IR_STR,IR_STRx,IR_STREX,IR_STM\n\t};\n\n\tstruct THUMB\n\t{\n\t\tstatic u32 PCOffset[2];\n\t};\n} ProcessorConfig;\n\nu32 _ProcessorConfig::ARM::PCOffset[2] = {8,8};\nu32 _ProcessorConfig::ARM::PCStoreOffset[2] = {8,12};\nu32 _ProcessorConfig::THUMB::PCOffset[2] = {4,4};\n\nu32 Decoded::CalcR15(const Decoded &d)\n{\n\tif (d.ThumbFlag)\n\t\treturn d.Address + ProcessorConfig::THUMB::PCOffset[d.ProcessID];\n\n\tswitch (d.IROp)\n\t{\n\tcase IR_STR:\n\tcase IR_STRx:\n\tcase IR_STREX:\n\tcase IR_STM:\n\t\treturn d.Address + ProcessorConfig::ARM::PCStoreOffset[d.ProcessID]; \n\n\tdefault:\n\t\treturn d.Address + ProcessorConfig::ARM::PCOffset[d.ProcessID];\n\t}\n}\n\nu32 Decoded::CalcNextInstruction(const Decoded &d)\n{\n\tif (d.ThumbFlag)\n\t\treturn d.Address + 2;\n\telse\n\t\treturn d.Address + 4;\n}\n\nstd::string ArmAnalyze::DumpInstruction(Decoded *Instructions, s32 InstructionsNum)\n{\n\tif (InstructionsNum <= 0)\n\t\treturn \"\";\n\n\tchar dasmbuf[1024] = {0};\n\tchar otherbuf[1024] = {0};\n\tstd::string retbuf;\n\n\tretbuf.reserve(1024);\n\n\tsprintf(dasmbuf, \"CPU : %s, Mode : %s, Count : %d\\n\", CPU_STR(Instructions[0].ProcessID), Instructions[0].ThumbFlag?\"THUMB\":\"ARM\", InstructionsNum);\n\tretbuf.append(dasmbuf);\n\n\tfor (s32 i = 0; i < InstructionsNum; i++)\n\t{\n\t\tDecoded &Inst = Instructions[i];\n\n\t\tif (Inst.ThumbFlag)\n\t\t\tdes_thumb_instructions_set[THUMB_OPCODE_INDEX(Inst.Instruction.ThumbOp)](Inst.Address, Inst.Instruction.ThumbOp, dasmbuf);\n\t\telse\n\t\t\tdes_arm_instructions_set[ARM_OPCODE_INDEX(Inst.Instruction.ArmOp)](Inst.Address, Inst.Instruction.ArmOp, dasmbuf);\n\n\t\tsprintf(otherbuf, \"%08X : \", Inst.Address);\n\t\tretbuf.append(otherbuf);\n\t\tretbuf.append(dasmbuf);\n\t\tretbuf.append(\"\\n\");\n\t}\n\n\treturn retbuf;\n}\n\nArmAnalyze::ArmAnalyze(s32 MaxInstructionsNum, s32 MaxBlocksNum)\n{\n\tINFO(\"sizeof(armcpu_t) = %d\\n\", sizeof(armcpu_t));\n\tINFO(\"sizeof(Decoded) = %d\\n\", sizeof(Decoded));\n\tINFO(\"sizeof(JitBlock) = %d\\n\", sizeof(JitBlock));\n\n\tm_Optimize = false;\n\tm_OptimizeFlag = false;\n\tm_MergeSubBlocks = false;\n\tm_JumpEndDecode = false;\n\n\tm_Instructions = new Decoded[MaxInstructionsNum + 1];\n\tm_MaxInstructionsNum = MaxInstructionsNum + 1;\n\tm_InstructionsNum = 0;\n\tif (MaxBlocksNum <= 0) MaxBlocksNum = m_MaxInstructionsNum;\n\tm_BlockInfos = new BlockInfo[MaxBlocksNum];\n\tm_MaxBlocksNum = MaxBlocksNum;\n\tm_BlocksNum = 0;\n}\n\nArmAnalyze::~ArmAnalyze()\n{\n\tdelete [] m_Instructions;\n\tdelete [] m_BlockInfos;\n}\n\nbool ArmAnalyze::Decode(armcpu_t *armcpu)\n{\n\ts32 InstNum = 0;\n\tu32 StartAddress = armcpu->instruct_adr;\n\tu32 AddressStep = 2;\n\n\tif (armcpu->CPSR.bits.T)\n\t{\n\t\tStartAddress &= 0xFFFFFFFE;\n\t\tAddressStep = 2;\n\t}\n\telse\n\t{\n\t\tStartAddress &= 0xFFFFFFFC;\n\t\tAddressStep = 4;\n\t}\n\n\tu32 MaxEndAddress = StartAddress + (m_MaxInstructionsNum - 1) * AddressStep;\n\n\tmemset(m_Instructions, 0, sizeof(Decoded) * m_MaxInstructionsNum);\n\n\tbool forceLoad = false;\n\tbool newblock = true;\n\tfor (InstNum = 0; forceLoad || (InstNum < m_MaxInstructionsNum - 1); InstNum++)\n\t{\n\t\tDecoded &Inst = m_Instructions[InstNum];\n\n\t\tInst.ProcessID = armcpu->proc_ID;\n\t\tInst.Address = StartAddress + InstNum * AddressStep;\n\n\t\tInst.ThumbFlag = armcpu->CPSR.bits.T;\n\n\t\tif (newblock)\n\t\t{\n\t\t\tInst.Block = 1;\n\t\t\tnewblock = false;\n\t\t}\n\n\t\tarmcpu->instruct_adr = Inst.Address;\n\n\t\tif (armcpu->CPSR.bits.T)\n\t\t{\n\t\t\tInst.Instruction.ThumbOp = _MMU_read16(Inst.ProcessID, MMU_AT_CODE, Inst.Address);\n\n\t\t\tInst.ReadPCMask = 0xFFFFFFFE;\n\n\t\t\tInst.Cond = 0xE;\n\n\t\t\t// THUMB1\n\t\t\tu32 ret = thumb_opdecoder_set[Inst.ProcessID][THUMB_OPCODE_INDEX(Inst.Instruction.ThumbOp)](armcpu, Inst.Instruction, &Inst);\n\t\t\tif (ret == 0)\n\t\t\t{\n\t\t\t\tINFO(\"thumb opdecoder failed.\\n\");\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// THUMB2\n\t\t\tif (Inst.IROp == IR_T32P1)\n\t\t\t\tforceLoad = true;\n\t\t\telse if (Inst.IROp == IR_T32P2)\n\t\t\t{\n\t\t\t\tforceLoad = false;\n\n\t\t\t\tif (InstNum == 0)\n\t\t\t\t\tINFO(\"thumb2 only has part2.\\n\");\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDecoded &InstP1 = m_Instructions[InstNum-1];\n\t\t\t\t\tif (InstP1.IROp == IR_T32P1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (THUMB2_HEAD(InstP1.Instruction.ThumbOp) == 0x1E \n\t\t\t\t\t\t\t&& THUMB2_HEAD(Inst.Instruction.ThumbOp) == 0x1F)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//BL IMM\n\t\t\t\t\t\t\tInstP1.IROp = IR_DUMMY;\n\t\t\t\t\t\t\tInst.IROp = IR_BL;\n\n\t\t\t\t\t\t\tu32 op1 = (u32)InstP1.Instruction.ThumbOp;\n\t\t\t\t\t\t\tu32 LR = InstP1.CalcR15(InstP1) + ((((s32)op1<<21)>>21)<<12);\n\t\t\t\t\t\t\tInst.Immediate = LR + ((Inst.Instruction.ThumbOp&0x7FF)<<1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (THUMB2_HEAD(InstP1.Instruction.ThumbOp) == 0x1E \n\t\t\t\t\t\t\t\t&& THUMB2_HEAD(Inst.Instruction.ThumbOp) == 0x1D)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//BLX IMM\n\t\t\t\t\t\t\tInstP1.IROp = IR_DUMMY;\n\t\t\t\t\t\t\tInst.IROp = IR_BLX_IMM;\n\n\t\t\t\t\t\t\tu32 op1 = (u32)InstP1.Instruction.ThumbOp;\n\t\t\t\t\t\t\tu32 LR = InstP1.CalcR15(InstP1) + ((((s32)op1<<21)>>21)<<12);\n\t\t\t\t\t\t\tInst.Immediate = (LR + ((Inst.Instruction.ThumbOp&0x7FF)<<1))&0xFFFFFFFC;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tINFO(\"thumb2 opdecoder failed.\\n\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tINFO(\"thumb2 only has part2.\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (forceLoad && Inst.IROp != IR_T32P2)\n\t\t\t{\n\t\t\t\tINFO(\"thumb2 only has part1.\\n\");\n\t\t\t\tforceLoad = false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tInst.Instruction.ArmOp = _MMU_read32(Inst.ProcessID, MMU_AT_CODE, Inst.Address);\n\n\t\t\tInst.ReadPCMask = 0xFFFFFFFC;\n\n\t\t\tInst.Cond = ARM_CONDITION(Inst.Instruction.ArmOp);\n\t\t\tInst.FlagsNeeded = FlagList[Inst.Cond / 2];\n\n\t\t\tif (Inst.Cond == 0xF)\n\t\t\t{\n\t\t\t\t//UnconditionalExtension\n\t\t\t\tInst.Cond = 0xE;\n\t\t\t\tif ((Inst.Instruction.ArmOp >> 24) & 0xF)\n\t\t\t\t{\n\t\t\t\t\tu32 off = (((s32)Inst.Instruction.ArmOp<<8)>>8);\n\t\t\t\t\tu32 H = (Inst.Instruction.ArmOp >> 24) & 0x1;\n\n\t\t\t\t\tInst.IROp = IR_BLX_IMM;\n\t\t\t\t\tInst.Immediate = (Inst.CalcR15(Inst) + (off<<2) + H*2)&0xFFFFFFFE;\n\t\t\t\t\tInst.R15Modified = 1;\n\t\t\t\t\tInst.TbitModified = 1;\n\t\t\t\t\tInst.ExecuteCycles = 3;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tINFO(\"arm uncond opdecoder failed.\\n\");\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 ret = arm_cond_opdecoder_set[Inst.ProcessID][ARM_OPCODE_INDEX(Inst.Instruction.ArmOp)](armcpu, Inst.Instruction, &Inst);\n\t\t\t\tif (ret == 0)\n\t\t\t\t{\n\t\t\t\t\tINFO(\"arm opdecoder failed.\\n\");\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ((Inst.Rd == 15 || Inst.Rn == 15 || Inst.Rm == 15 || Inst.Rs == 15 || (Inst.RegisterList & (1<<15))))\n\t\t\tInst.R15Used = 1;\n\n\t\tif (Inst.IROp == IR_B || Inst.IROp == IR_BL || Inst.IROp == IR_BLX_IMM)\n\t\t{\n\t\t\tif (Inst.Immediate >= StartAddress && Inst.Immediate <= MaxEndAddress)\n\t\t\t{\n\t\t\t\tu32 slot = (Inst.Immediate - StartAddress) / AddressStep;\n\t\t\t\tm_Instructions[slot].Block = 1;\n\t\t\t}\n\t\t}\n\n\t\tif (Inst.Reschedule == 1 && Inst.Cond != 0xE && Inst.Cond != 0xF)\n\t\t\tInst.Reschedule = 2;\n\t\telse if (Inst.Reschedule == 1 && (Inst.Cond == 0xE || Inst.Cond == 0xF))\n\t\t\tnewblock = true;\n\n\t\tif (Inst.MayHalt || Inst.InvalidICache)\n\t\t\tnewblock = true;\n\n\t\tif (Inst.IROp == IR_UND)\n\t\t\tbreak;\n\n\t\tif ((Inst.R15Modified || Inst.TbitModified) \n\t\t\t&& (m_JumpEndDecode || Inst.Cond == 0xE || Inst.Cond == 0xF))\n\t\t{\n\t\t\tInstNum++;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tarmcpu->instruct_adr = StartAddress;\n\n\tIF_DEVELOPER(if(InstNum>m_MaxInstructionsNum) INFO(\"armanalyze overflow(%u, %u).\\n\", InstNum, m_MaxInstructionsNum););\n\n\tm_InstructionsNum = InstNum;\n\n\treturn InstNum > 0;\n}\n\nbool ArmAnalyze::CreateBlocks()\n{\n\ts32 CurBlock = -1;\n\n\ts32 InstNum = 0;\n\ts32 CurBlockInstNum = 0;\n\t\n\tfor (; InstNum < m_InstructionsNum; InstNum++)\n\t{\n\t\tif (m_Instructions[InstNum].Block == 1)\n\t\t{\n\t\t\tif (CurBlock >= 0)\n\t\t\t{\n\t\t\t\tBlockInfo &Block = m_BlockInfos[CurBlock];\n\n\t\t\t\tBlock.R15Num = OptimizeFlag(Block.Instructions, CurBlockInstNum);\n\t\t\t\tBlock.SubBlocks = CreateSubBlocks(Block.Instructions, CurBlockInstNum);\n\t\t\t\tBlock.InstructionsNum = Optimize(Block.Instructions, CurBlockInstNum);\n\t\t\t}\n\n\t\t\tCurBlock++;\n\t\t\tif (CurBlock >= m_MaxBlocksNum)\n\t\t\t\tbreak;\n\t\t\tCurBlockInstNum = 1;\n\t\t\tm_BlockInfos[CurBlock].Instructions = &m_Instructions[InstNum];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCurBlockInstNum++;\n\t\t}\n\t}\n\n\tif (CurBlock >= 0)\n\t{\n\t\tBlockInfo &Block = m_BlockInfos[CurBlock];\n\n\t\tBlock.R15Num = OptimizeFlag(Block.Instructions, CurBlockInstNum);\n\t\tBlock.SubBlocks = CreateSubBlocks(Block.Instructions, CurBlockInstNum);\n\t\tBlock.InstructionsNum = Optimize(Block.Instructions, CurBlockInstNum);\n\t}\n\n\tm_BlocksNum = CurBlock + 1;\n\n\treturn m_BlocksNum > 0;\n}\n\nvoid ArmAnalyze::GetInstructions(Decoded *&Instructions, s32 &InstructionsNum)\n{\n\tInstructions = m_Instructions;\n\tInstructionsNum = m_InstructionsNum;\n}\n\nvoid ArmAnalyze::GetBlocks(BlockInfo *&BlockInfos, s32 &BlocksNum)\n{\n\tBlockInfos = m_BlockInfos;\n\tBlocksNum = m_BlocksNum;\n}\n\ns32 ArmAnalyze::Optimize(Decoded *Instructions, s32 InstructionsNum)\n{\n\tif (!m_Optimize)\n\t\treturn InstructionsNum;\n\n\tfor (s32 i = 0; i < InstructionsNum; i++)\n\t{\n\t}\n\n\treturn InstructionsNum;\n}\n\nu32 ArmAnalyze::OptimizeFlag(Decoded *Instructions, s32 InstructionsNum)\n{\n\tu32 R15Num = 0;\n\n\tif (!m_OptimizeFlag)\n\t{\n\t\tfor (s32 i = InstructionsNum - 1; i >= 0; i--)\n\t\t{\n\t\t\tDecoded &Inst = Instructions[i];\n\n\t\t\tif (Inst.R15Modified || Inst.R15Used)\n\t\t\t\tR15Num++;\n\t\t}\n\n\t\treturn R15Num;\n\t}\n\n\tu32 FlagsToGenerate = 0;\n\tu32 FlagsNeeded = ALL_FLAGS;\n\tfor (s32 i = InstructionsNum - 1; i >= 0; i--)\n\t{\n\t\tDecoded &Inst = Instructions[i];\n\n\t\tif (Inst.R15Modified || Inst.R15Used)\n\t\t\tR15Num++;\n\n\t\tif (Inst.FlagsNeeded || Inst.FlagsSet || \n\t\t\tInst.R15Modified/* || Inst.TbitModified*/)\n\t\t{\n\t\t\tFlagsToGenerate = FlagsNeeded & Inst.FlagsSet;\n\n\t\t\t//INFO(\"%s\", DumpInstruction(&Inst, 1).c_str());\n\t\t\t//INFO(\"ArmAnalyze::OptimizeFlag() : [%s %s]\\n\", FlagStrings[Inst.FlagsSet], FlagStrings[FlagsToGenerate]);\n\n\t\t\tInst.FlagsSet = FlagsToGenerate;\n\n\t\t\tif (Inst.Cond != 0xE && Inst.Cond != 0xF)\n\t\t\t{\n\t\t\t\tFlagsNeeded |= Inst.FlagsNeeded;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tFlagsNeeded = (FlagsNeeded & ~FlagsToGenerate) | Inst.FlagsNeeded;\n\t\t\t}\n\n\t\t\tif (Inst.R15Modified/* || Inst.TbitModified*/)\n\t\t\t{\n\t\t\t\tFlagsNeeded = ALL_FLAGS;\n\t\t\t}\n\t\t}\n\t}\n\t//INFO(\"\\n\\n\");\n\n\treturn R15Num;\n}\n\ns32 ArmAnalyze::CreateSubBlocks(Decoded *Instructions, s32 InstructionsNum)\n{\n\tif (InstructionsNum <= 0)\n\t\treturn 0;\n\n\tu32 nSubBlocks = 0;\n\tu32 Cond = Instructions[0].Cond;\n\tu32 CondFlg = FlagList[Cond / 2];\n\tbool bNewBlock = true;\n\n\tif (m_MergeSubBlocks)\n\t{\n\t\tfor (s32 i = 0; i < InstructionsNum; i++)\n\t\t{\n\t\t\tDecoded &Inst = Instructions[i];\n\n\t\t\tif (Cond != Inst.Cond)\n\t\t\t\tbNewBlock = true;\n\n\t\t\tif (bNewBlock)\n\t\t\t{\n\t\t\t\tCond = Inst.Cond;\n\t\t\t\tCondFlg = FlagList[Cond / 2];\n\t\t\t\tnSubBlocks++;\n\n\t\t\t\tbNewBlock = false;\n\t\t\t}\n\n\t\t\tInst.SubBlock = nSubBlocks;\n\n\t\t\tif (CondFlg & Inst.FlagsSet)\n\t\t\t\tbNewBlock = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (s32 i = 0; i < InstructionsNum; i++)\n\t\t{\n\t\t\tDecoded &Inst = Instructions[i];\n\n\t\t\tif ((Cond != 0xE && Cond != 0xF) || \n\t\t\t\tCond != Inst.Cond)\n\t\t\t\tbNewBlock = true;\n\n\t\t\tif (bNewBlock)\n\t\t\t{\n\t\t\t\tCond = Inst.Cond;\n\t\t\t\tnSubBlocks++;\n\n\t\t\t\tbNewBlock = false;\n\t\t\t}\n\n\t\t\tInst.SubBlock = nSubBlocks;\n\t\t}\n\t}\n\n\treturn nSubBlocks;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmAnalyze.h",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ARM_ANALYZE\n#define ARM_ANALYZE\n\n#include \"common.h\"\n\n#define FLAG_N     (1<<3)          // sign (neg)\n#define FLAG_Z     (1<<2)          // zero\n#define FLAG_C     (1<<1)          // carry\n#define FLAG_V     (1<<0)          // overflow\n#define ALL_FLAGS  (FLAG_N|FLAG_Z|FLAG_C|FLAG_V)\n#define NO_FLAGS 0\n\nenum IROpCode\n{\n\tIR_UND,\n\n\tIR_NOP,\n\tIR_DUMMY,\n\n\tIR_T32P1,\t\t//Part1 of THUMB2\n\tIR_T32P2,\t\t//Part2 of THUMB2\n\n\t//Logical Operations\n\tIR_MOV,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_MVN,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_AND,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_TST,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_EOR,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_TEQ,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_ORR,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_BIC,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\n\t//Arithmetic Operations\n\tIR_ADD,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_ADC,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_SUB,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_SBC,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_RSB,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_RSC,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_CMP,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\tIR_CMN,\t\t\t//I=0?REG:IMM, R=0?ShiftIsImm:ShiftIsReg, Typ=ShiftOp\n\n\t//Multiply\n\tIR_MUL,\n\tIR_MLA,\n\tIR_UMULL,\t\t//RdHi=Rd,RdLo=Rn\n\tIR_UMLAL,\t\t//RdHi=Rd,RdLo=Rn\n\tIR_SMULL,\t\t//RdHi=Rd,RdLo=Rn\n\tIR_SMLAL,\t\t//RdHi=Rd,RdLo=Rn\n\tIR_SMULxy,\t\t//Rm:X=0?Lower_16bit:Upper_16bit, Rs:Y=0?Lower_16bit:Upper_16bit\n\tIR_SMLAxy,\t\t//Rm:X=0?Lower_16bit:Upper_16bit, Rs:Y=0?Lower_16bit:Upper_16bit\n\tIR_SMULWy,\t\t//Rs:Y=0?Lower_16bit:Upper_16bit\n\tIR_SMLAWy,\t\t//Rs:Y=0?Lower_16bit:Upper_16bit\n\tIR_SMLALxy,\t\t//Rm:X=0?Lower_16bit:Upper_16bit, Rs:Y=0?Lower_16bit:Upper_16bit;RdHi=Rd,RdLo=Rn\n\n\t//Memory Load/Store\n\tIR_LDR,\t\t\t//P=0?Post:Pre, U=0?Down:Up, W=0?no_WB:WB, B=0?Word:Byte, //I=0?REG:IMM\n\tIR_STR,\t\t\t//P=0?Post:Pre, U=0?Down:Up, W=0?no_WB:WB, B=0?Word:Byte, //I=0?REG:IMM\n\tIR_LDRx,\t\t//P=0?Post:Pre, U=0?Down:Up, W=0?no_WB:WB, S=0?unsigned:signed, H=0?byte:halfword, I=0?REG:IMM\n\tIR_STRx,\t\t//P=0?Post:Pre, U=0?Down:Up, W=0?no_WB:WB, S=0?unsigned:signed, H=0?byte:halfword, I=0?REG:IMM\n\tIR_LDRD,\t\t//I=0?REG:IMM, P=0?Post:Pre, U=0?Down:Up, W=0?no_WB:WB\n\tIR_STRD,\t\t//I=0?REG:IMM, P=0?Post:Pre, U=0?Down:Up, W=0?no_WB:WB\n\tIR_LDREX,\n\tIR_STREX,\n\tIR_LDM,\t\t\t//P=0?Post:Pre, U=0?Down:Up, S=0?No:load_PSR_or_force_user_mode, W=0?no_WB:WB\n\tIR_STM,\t\t\t//P=0?Post:Pre, U=0?Down:Up, S=0?No:load_PSR_or_force_user_mode, W=0?no_WB:WB\n\tIR_SWP,\n\n\t//Jumps, Calls\n\tIR_B,\t\t\t//IMM\n\tIR_BL,\t\t\t//IMM\n\tIR_BX,\t\t\t//REG\n\tIR_BLX,\t\t\t//REG\n\tIR_SWI,\n\n\t//CPSR Mode\n\tIR_MSR,\t\t\t//P=0?CPSR:SPSR\n\tIR_MRS,\t\t\t//P=0?CPSR:SPSR\n\n\t//Coprocessor Functions\n\t//IR_CDP,\n\t//IR_STC,\n\t//IR_LDC,\n\tIR_MCR,\n\tIR_MRC,\n\t//IR_MCRR,\n\t//IR_MRRC,\n\n\t//Others\n\tIR_CLZ,\n\tIR_QADD,\n\tIR_QSUB,\n\tIR_QDADD,\n\tIR_QDSUB,\n\n\t//UnconditionalExtension\n\t//IR_PLD,\n\tIR_BLX_IMM,\t\t//IMM\n\t//IR_CDP2,\n\t//IR_LDC2,\n\t//IR_STC2,\n\t//IR_MCR2,\n\t//IR_MRC2,\n\n\t//Debug\n\tIR_BKPT,\n\n\t//IR Num\n\tIR_MAXNUM\n};\n\nenum IRShiftOpCode\n{\n\tIRSHIFT_UND,\n\tIRSHIFT_LSL,\n\tIRSHIFT_LSR,\n\tIRSHIFT_ASR,\n\tIRSHIFT_ROR\n};\n\ntypedef union _OPCODE {\n\tu32 ArmOp;\n\tu16 ThumbOp;\n} OPCODE;\n\n#define INVALID_SUBBLOCK 0\n\ntypedef struct _Decoded\n{\n\tu16 Block;\n\tu16 SubBlock;\n\n\tu32 ProcessID;\n\tu32 Address;\n\tOPCODE Instruction;\n\n\tu32 ExecuteCycles;\n\tu32 VariableCycles:1;\n\n\tu32 Cond:4;\n\tu32 ThumbFlag:1;\n\tu32 R15Used:1;\n\tu32 R15Modified:1;\n\tu32 TbitModified:1;\n\tu32 Reschedule:2;//1:always reschedule, 2:may reschedule\n\tu32 InvalidICache:2;//1:clean ICache, 2:clean jit cache\n\tu32 MayHalt:1;\n\n\tu8 FlagsNeeded:4;\n\tu8 FlagsSet:4;\n\n\tIROpCode IROp;\n\n\tu32 ReadPCMask;\n\n\tu32 OpData;//used in IR_MSR\n\tu32 Immediate;\n\n\t// Registers\n\tu32 Rd:4;\n\tu32 Rn:4;\n\tu32 Rm:4;\n\tu32 Rs:4;\n\tu16 RegisterList;\n\n\t// Coprocs\n\tu32 CP:3;\n\tu32 CRd:4;\n\tu32 CRm:4;\n\tu32 CRn:4;\n\tu32 CPNum:4;\n\tu32 CPOpc:4;\n\n\tu32 I:1;\n\tu32 S:1;\n\t//u32 L:1;\n\tu32 P:1;\n\t//u32 A:1;\n\tu32 U:1;\n\tu32 X:1;\n\tu32 Y:1;\n\tu32 B:1;\n\tu32 W:1;\n\tu32 H:1;\n\t//u32 N:1;\n\tu32 R:1;\n\tu32 Typ:3;\n\n\t// CalcR15\n\tstatic u32 CalcR15(const _Decoded &Instruction);\n\t// \n\tstatic u32 CalcNextInstruction(const _Decoded &Instruction);\n}Decoded;\n\ntypedef struct _BlockInfo\n{\n\tDecoded *Instructions;\n\ts32 InstructionsNum;\n\ts32 R15Num;\n\ts32 SubBlocks;\n}BlockInfo;\n\nstruct ArmAnalyze\n{\npublic:\n\tstatic std::string DumpInstruction(Decoded *Instructions, s32 InstructionsNum);\n\npublic:\n\tArmAnalyze(s32 MaxInstructionsNum, s32 MaxBlocksNum = 0);\n\n\t~ArmAnalyze();\n\n\tbool Decode(struct armcpu_t *armcpu);\n\n\tbool CreateBlocks();\n\n\tvoid GetInstructions(Decoded *&Instructions, s32 &InstructionsNum);\n\t\n\tvoid GetBlocks(BlockInfo *&BlockInfos, s32 &BlocksNum);\n\nprotected:\n\ts32 Optimize(Decoded *Instructions, s32 InstructionsNum);\n\n\tu32 OptimizeFlag(Decoded *Instructions, s32 InstructionsNum);\n\n\ts32 CreateSubBlocks(Decoded *Instructions, s32 InstructionsNum);\n\npublic:\n\tbool m_Optimize;\n\tbool m_OptimizeFlag;\n\tbool m_MergeSubBlocks;\n\tbool m_JumpEndDecode;\n\nprotected:\n\tDecoded *m_Instructions;\n\ts32 m_MaxInstructionsNum;\n\ts32 m_InstructionsNum;\n\n\tBlockInfo *m_BlockInfos;\n\ts32 m_MaxBlocksNum;\n\ts32 m_BlocksNum;\n};\n\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmAnalyze_tabdef.inc",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2007-2012 DeSmuME team\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nTABDECL(IR_UND),\n\nTABDECL(IR_NOP),\nTABDECL(IR_DUMMY),\n\nTABDECL(IR_T32P1),\nTABDECL(IR_T32P2),\n\nTABDECL(IR_MOV),\nTABDECL(IR_MVN),\nTABDECL(IR_AND),\nTABDECL(IR_TST),\nTABDECL(IR_EOR),\nTABDECL(IR_TEQ),\nTABDECL(IR_ORR),\nTABDECL(IR_BIC),\n\nTABDECL(IR_ADD),\nTABDECL(IR_ADC),\nTABDECL(IR_SUB),\nTABDECL(IR_SBC),\nTABDECL(IR_RSB),\nTABDECL(IR_RSC),\nTABDECL(IR_CMP),\nTABDECL(IR_CMN),\n\nTABDECL(IR_MUL),\nTABDECL(IR_MLA),\nTABDECL(IR_UMULL),\nTABDECL(IR_UMLAL),\nTABDECL(IR_SMULL),\nTABDECL(IR_SMLAL),\nTABDECL(IR_SMULxy),\nTABDECL(IR_SMLAxy),\nTABDECL(IR_SMULWy),\nTABDECL(IR_SMLAWy),\nTABDECL(IR_SMLALxy),\n\nTABDECL(IR_LDR),\nTABDECL(IR_STR),\nTABDECL(IR_LDRx),\nTABDECL(IR_STRx),\nTABDECL(IR_LDRD),\nTABDECL(IR_STRD),\nTABDECL(IR_LDREX),\nTABDECL(IR_STREX),\nTABDECL(IR_LDM),\nTABDECL(IR_STM),\nTABDECL(IR_SWP),\n\nTABDECL(IR_B),\nTABDECL(IR_BL),\nTABDECL(IR_BX),\nTABDECL(IR_BLX),\nTABDECL(IR_SWI),\n\nTABDECL(IR_MSR),\nTABDECL(IR_MRS),\n\n//TABDECL(IR_CDP),\n//TABDECL(IR_STC),\n//TABDECL(IR_LDC),\nTABDECL(IR_MCR),\nTABDECL(IR_MRC),\n//TABDECL(IR_MCRR),\n//TABDECL(IR_MRRC),\n\nTABDECL(IR_CLZ),\nTABDECL(IR_QADD),\nTABDECL(IR_QSUB),\nTABDECL(IR_QDADD),\nTABDECL(IR_QDSUB),\n\n//TABDECL(IR_PLD),\nTABDECL(IR_BLX_IMM),\n//TABDECL(IR_CDP2),\n//TABDECL(IR_LDC2),\n//TABDECL(IR_STC2),\n//TABDECL(IR_MCR2),\n//TABDECL(IR_MRC2),\n\nTABDECL(IR_BKPT),\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmCJit.cpp",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n#include \"ArmCJit.h\"\n#include \"ArmAnalyze.h\"\n#include \"instructions.h\"\n#include \"Disassembler.h\"\n\n#include \"armcpu.h\"\n#include \"MMU.h\"\n#include \"MMU_timing.h\"\n#include \"JitCommon.h\"\n#include \"utils/MemBuffer.h\"\n#include \"utils/tinycc/libtcc.h\"\n\n#ifdef HAVE_JIT\n\n#define GETCPUPTR (&ARMPROC)\n#define GETCPU (ARMPROC)\n\n#define READREG(i) ((i)==15?(d.CalcR15(d)&d.ReadPCMask):GETCPU.R[(i)])\n\n#define REG_R(i)\t(i)==15?\"_C\":\"\",(i)==15?(u32*)(d.CalcR15(d)&d.ReadPCMask):&(GETCPU.R[(i)])\n#define REG_W(i)\t(&(GETCPU.R[(i)]))\n#define REG(i)\t\t(&(GETCPU.R[(i)]))\n#define REGPTR(i)\t(&(GETCPU.R[(i)]))\n\n#define TEMPLATE template<u32 PROCNUM> \n#define OPCDECODER_DECL(name) void FASTCALL name##_CDecoder(const Decoded &d, char *&szCodeBuffer)\n#define WRITE_CODE(...) szCodeBuffer += sprintf(szCodeBuffer, __VA_ARGS__)\n\ntypedef void (FASTCALL* IROpCDecoder)(const Decoded &d, char *&szCodeBuffer);\n\ntypedef u32 (FASTCALL* Interpreter)(const Decoded &d);\n\ntypedef u32 (FASTCALL* MemOp1)(u32, u32*);\ntypedef u32 (FASTCALL* MemOp2)(u32, u32);\ntypedef u32 (* MemOp3)(u32, u32, u32*);\ntypedef u32 (* MemOp4)(u32, u32*, u32);\n\n// (*(u32*)0x11)\n// ((u32 (FASTCALL *)(u32,u32))0x11)(1,1);\n\n// #define REG_R(p)\t\t(*(u32*)p)\n// #define REG_SR(p)\t(*(s32*)p)\n// #define REG_R_C(p)\t((u32)p)\n// #define REG_SR_C(p)\t((s32)p)\n// #define REG_W(p)\t\t(*(u32*)p)\n// #define REG(p)\t\t(*(u32*)p)\n// #define REGPTR(p)\t((u32*)p)\n\nnamespace ArmCJit\n{\n//------------------------------------------------------------\n//                         Memory type\n//------------------------------------------------------------\n\tenum {\n\t\tMEMTYPE_GENERIC = 0,\t// no assumptions\n\t\tMEMTYPE_MAIN = 1,\t\t// arm9:r/w arm7:r/w\n\t\tMEMTYPE_DTCM_ARM9 = 2,\t// arm9:r/w\n\t\tMEMTYPE_ERAM_ARM7 = 3,\t// arm7:r/w\n\t\tMEMTYPE_SWIRAM = 4,\t\t// arm9:r/w arm7:r/w\n\n\t\tMEMTYPE_COUNT,\n\t};\n\n\tu32 GuessAddressArea(u32 PROCNUM, u32 adr)\n\t{\n\t\tif(PROCNUM==ARMCPU_ARM9 && (adr & ~0x3FFF) == MMU.DTCMRegion)\n\t\t\treturn MEMTYPE_DTCM_ARM9;\n\t\telse if((adr & 0x0F000000) == 0x02000000)\n\t\t\treturn MEMTYPE_MAIN;\n\t\telse if(PROCNUM==ARMCPU_ARM7 && (adr & 0xFF800000) == 0x03800000)\n\t\t\treturn MEMTYPE_ERAM_ARM7;\n\t\telse if((adr & 0xFF800000) == 0x03000000)\n\t\t\treturn MEMTYPE_SWIRAM;\n\t\telse\n\t\t\treturn MEMTYPE_GENERIC;\n\t}\n\n\tu32 GuessAddressArea(u32 PROCNUM, u32 adr_s, u32 adr_e)\n\t{\n\t\tu32 mt_s = GuessAddressArea(PROCNUM, adr_s);\n\t\tu32 mt_e = GuessAddressArea(PROCNUM, adr_e);\n\n\t\tif (mt_s != mt_e)\n\t\t\treturn MEMTYPE_GENERIC;\n\n\t\treturn mt_s;\n\t}\n\n//------------------------------------------------------------\n//                         Help function\n//------------------------------------------------------------\n\tu32 FASTCALL CalcShiftOp(const Decoded &d)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\t\tu32 shiftop = 0;\n\n\t\tswitch (d.Typ)\n\t\t{\n\t\t\tcase IRSHIFT_LSL:\n\t\t\t\tif (!d.R)\n\t\t\t\t\tshiftop = READREG(d.Rm)<<d.Immediate;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tshiftop = READREG(d.Rs)&0xFF;\n\t\t\t\t\tif (shiftop >= 32)\n\t\t\t\t\t\tshiftop = 0;\n\t\t\t\t\telse\n\t\t\t\t\t\tshiftop = READREG(d.Rm)<<shiftop;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IRSHIFT_LSR:\n\t\t\t\tif (!d.R)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate)\n\t\t\t\t\t\tshiftop = READREG(d.Rm)>>d.Immediate;\n\t\t\t\t\telse\n\t\t\t\t\t\tshiftop = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tshiftop = READREG(d.Rs)&0xFF;\n\t\t\t\t\tif (shiftop >= 32)\n\t\t\t\t\t\tshiftop = 0;\n\t\t\t\t\telse\n\t\t\t\t\t\tshiftop = READREG(d.Rm)>>shiftop;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IRSHIFT_ASR:\n\t\t\t\tif (!d.R)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate)\n\t\t\t\t\t\tshiftop = (u32)(((s32)READREG(d.Rm))>>d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tshiftop = BIT31(READREG(d.Rm))*0xFFFFFFFF;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tshiftop = READREG(d.Rs)&0xFF;\n\t\t\t\t\tif (shiftop == 32)\n\t\t\t\t\t\tshiftop = READREG(d.Rm);\n\t\t\t\t\telse if(shiftop<32)\n\t\t\t\t\t\tshiftop = (u32)(((s32)READREG(d.Rm))>>shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tshiftop = BIT31(READREG(d.Rm))*0xFFFFFFFF;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase IRSHIFT_ROR:\n\t\t\t\tif (!d.R)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate)\n\t\t\t\t\t\tshiftop = ROR(READREG(d.Rm),d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tshiftop = ((u32)GETCPU.CPSR.bits.C<<31)|(READREG(d.Rm)>>1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tshiftop = READREG(d.Rs)&0x1F;\n\t\t\t\t\tif (shiftop == 0)\n\t\t\t\t\t\tshiftop = READREG(d.Rm);\n\t\t\t\t\telse\n\t\t\t\t\t\tshiftop = ROR(READREG(d.Rm),(shiftop&0x1F));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn shiftop;\n\t}\n\n\tvoid FASTCALL IRShiftOpGenerate(const Decoded &d, char *&szCodeBuffer, bool clacCarry)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tswitch (d.Typ)\n\t\t{\n\t\tcase IRSHIFT_LSL:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = ((Status_Reg*)%#p)->bits.C;\\n\", &(GETCPU.CPSR));\n\t\t\t\t\telse\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = BIT_N(REG_R%s(%#p), %u);\\n\", REG_R(d.Rm), 32-d.Immediate);\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)<<%u;\\n\", REG_R(d.Rm), d.Immediate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 c;\\n\");\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0xFF;\\n\", REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op == 0){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c=((Status_Reg*)%#p)->bits.C;\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"shift_op=REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else if (shift_op < 32){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT_N(REG_R%s(%#p), 32-shift_op);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op = REG_R%s(%#p)<<shift_op;\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else if (shift_op == 32){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT0(REG_R%s(%#p));\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op=0;\\n\");\n\t\t\t\t\tWRITE_CODE(\"}else{\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op=c=0;}\\n\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0xFF;\\n\", REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op >= 32)\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op=0;\\n\");\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op=REG_R%s(%#p)<<shift_op;\\n\", REG_R(d.Rm));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IRSHIFT_LSR:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = BIT31(REG_R%s(%#p));\\n\", REG_R(d.Rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = BIT_N(REG_R%s(%#p), %u);\\n\", REG_R(d.Rm), d.Immediate-1);\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = 0;\\n\");\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)>>%u;\\n\", REG_R(d.Rm), d.Immediate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 c;\\n\");\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0xFF;\\n\", REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op == 0){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c=((Status_Reg*)%#p)->bits.C;\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"shift_op=REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else if (shift_op < 32){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT_N(REG_R%s(%#p), shift_op-1);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op = REG_R%s(%#p)>>shift_op;\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else if (shift_op == 32){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT31(REG_R%s(%#p));\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op=0;\\n\");\n\t\t\t\t\tWRITE_CODE(\"}else{\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op=c=0;}\\n\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0xFF;\\n\",REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op >= 32)\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op=0;\\n\");\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op=REG_R%s(%#p)>>shift_op;\\n\", REG_R(d.Rm));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IRSHIFT_ASR:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = BIT31(REG_R%s(%#p));\\n\", REG_R(d.Rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = BIT_N(REG_R%s(%#p), %u);\\n\", REG_R(d.Rm), d.Immediate-1);\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = BIT31(REG_R%s(%#p))*0xFFFFFFFF;\\n\", REG_R(d.Rm));\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = (u32)(REG_SR%s(%#p)>>%u);\\n\", REG_R(d.Rm), d.Immediate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 c;\\n\");\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0xFF;\\n\", REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op == 0){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c=((Status_Reg*)%#p)->bits.C;\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"shift_op = REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else if (shift_op < 32){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT_N(REG_R%s(%#p), shift_op-1);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op = (u32)(REG_SR%s(%#p)>>shift_op);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else{\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT31(REG_R%s(%#p));\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op = BIT31(REG_R%s(%#p))*0xFFFFFFFF;}\\n\", REG_R(d.Rm));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0xFF;\\n\", REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op == 0)\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op = REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"else if (shift_op < 32)\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op = (u32)(REG_SR%s(%#p)>>shift_op);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op = BIT31(REG_R%s(%#p))*0xFFFFFFFF;\\n\", REG_R(d.Rm));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IRSHIFT_ROR:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = BIT0(REG_R%s(%#p));\\n\", REG_R(d.Rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tWRITE_CODE(\"u32 c = BIT_N(REG_R%s(%#p), %u);\\n\", REG_R(d.Rm), d.Immediate-1);\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = (((u32)((Status_Reg*)%#p)->bits.C)<<31)|(REG_R%s(%#p)>>1);\\n\", &(GETCPU.CPSR), REG_R(d.Rm));\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = ROR(REG_R%s(%#p), %u);\\n\", REG_R(d.Rm), d.Immediate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 c;\\n\");\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0xFF;\\n\", REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op == 0){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c=((Status_Reg*)%#p)->bits.C;\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"shift_op = REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else{\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op &= 0x1F;\\n\");\n\t\t\t\t\tWRITE_CODE(\"if (shift_op != 0){\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT_N(REG_R%s(%#p), shift_op-1);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op = ROR(REG_R%s(%#p), shift_op);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"}else{\\n\");\n\t\t\t\t\tWRITE_CODE(\"c = BIT31(REG_R%s(%#p));\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"shift_op = REG_R%s(%#p);}}\\n\", REG_R(d.Rm));\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"u32 shift_op = REG_R%s(%#p)&0x1F;\\n\", REG_R(d.Rs));\n\t\t\t\t\tWRITE_CODE(\"if (shift_op == 0)\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op = REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"shift_op = ROR(REG_R%s(%#p), shift_op);\\n\", REG_R(d.Rm));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tINFO(\"Unknow Shift Op : %u.\\n\", d.Typ);\n\t\t\tif (clacCarry)\n\t\t\t\tWRITE_CODE(\"u32 c = 0;\\n\");\n\t\t\tWRITE_CODE(\"u32 shift_op = 0;\\n\");\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid FASTCALL DataProcessLoadCPSRGenerate(const Decoded &d, char *&szCodeBuffer)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"{\\n\");\n\n\t\tWRITE_CODE(\"Status_Reg SPSR;\\n\");\n\t\tWRITE_CODE(\"SPSR.val = ((Status_Reg*)%#p)->val;\\n\", &(GETCPU.SPSR));\n\t\tWRITE_CODE(\"((u32 (*)(void*,u8))%#p)((void*)%#p,SPSR.bits.mode);\\n\", armcpu_switchMode, GETCPUPTR);\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->val = SPSR.val;\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"((void (*)(void*))%#p)((void*)%#p);\\n\", armcpu_changeCPSR, GETCPUPTR);\n\t\tWRITE_CODE(\"REG_W(%#p)&=(0xFFFFFFFC|((((Status_Reg*)%#p)->bits.T)<<1));\\n\", REG_W(15), &(GETCPU.CPSR));\n\n\t\tWRITE_CODE(\"}\\n\");\n\t}\n\n\tvoid FASTCALL LDM_S_LoadCPSRGenerate(const Decoded &d, char *&szCodeBuffer)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t}\n\n\tvoid FASTCALL R15ModifiedGenerate(const Decoded &d, char *&szCodeBuffer)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"(*(u32*)%#p) = REG(%#p);\\n\", &(GETCPU.instruct_adr), REG(15));\n\t\tWRITE_CODE(\"return ExecuteCycles;\\n\");\n\t}\n\n//------------------------------------------------------------\n//                         IROp decoder\n//------------------------------------------------------------\n\tOPCDECODER_DECL(IR_UND)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"IR_UND\\n\");\n\n\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruction), d.ThumbFlag?d.Instruction.ThumbOp:d.Instruction.ArmOp);\n\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruct_adr), d.Address);\n\t\tWRITE_CODE(\"((u32 (*)(void*))%#p)((void*)%#p);\\n\", TRAPUNDEF, GETCPUPTR);\n\t\tWRITE_CODE(\"return ExecuteCycles;\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_NOP)\n\t{\n\t}\n\n\tOPCDECODER_DECL(IR_DUMMY)\n\t{\n\t}\n\n\tOPCDECODER_DECL(IR_T32P1)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"IR_T32P1\\n\");\n\n\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruction), d.ThumbFlag?d.Instruction.ThumbOp:d.Instruction.ArmOp);\n\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruct_adr), d.Address);\n\t\tWRITE_CODE(\"((u32 (*)(void*))%#p)((void*)%#p);\\n\", TRAPUNDEF, GETCPUPTR);\n\t\tWRITE_CODE(\"return ExecuteCycles;\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_T32P2)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"IR_T32P2\\n\");\n\n\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruction), d.ThumbFlag?d.Instruction.ThumbOp:d.Instruction.ArmOp);\n\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruct_adr), d.Address);\n\t\tWRITE_CODE(\"((u32 (*)(void*))%#p)((void*)%#p);\\n\", TRAPUNDEF, GETCPUPTR);\n\t\tWRITE_CODE(\"return ExecuteCycles;\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_MOV)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\",REG_W(d.Rd), d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=%u;\\n\", &(GETCPU.CPSR), d.Immediate==0 ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"REG_W(%#p)=shift_op;\\n\", REG_W(d.Rd));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_MVN)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(d.Rd), ~d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=%u;\\n\", &(GETCPU.CPSR), BIT31(~d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=%u;\\n\", &(GETCPU.CPSR), (~d.Immediate)==0 ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"shift_op=REG_W(%#p)=~shift_op;\\n\", REG_W(d.Rd));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_AND)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 shift_op=REG_W(%#p)=REG_R%s(%#p)&%u;\\n\", REG_W(d.Rd), REG_R(d.Rn), d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"shift_op=REG_W(%#p)=REG_R%s(%#p)&shift_op;\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_TST)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 shift_op=REG_R%s(%#p)&%u;\\n\", REG_R(d.Rn), d.Immediate);\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"shift_op=REG_R%s(%#p)&shift_op;\\n\", REG_R(d.Rn));\n\t\t\t\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_EOR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 shift_op=REG_W(%#p)=REG_R%s(%#p)^%u;\\n\", REG_W(d.Rd), REG_R(d.Rn), d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"shift_op=REG_W(%#p)=REG_R%s(%#p)^shift_op;\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_TEQ)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 shift_op=REG_R%s(%#p)^%u;\\n\", REG_R(d.Rn), d.Immediate);\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"shift_op=REG_R%s(%#p)^shift_op;\\n\", REG_R(d.Rn));\n\t\t\t\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_ORR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 shift_op=REG_W(%#p)=REG_R%s(%#p)|%u;\\n\", REG_W(d.Rd), REG_R(d.Rn), d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"shift_op=REG_W(%#p)=REG_R%s(%#p)|shift_op;\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_BIC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 shift_op=REG_W(%#p)=REG_R%s(%#p)&%u;\\n\", REG_W(d.Rd), REG_R(d.Rn), ~d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u;\\n\", &(GETCPU.CPSR), BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, clacCarry);\n\n\t\t\tWRITE_CODE(\"shift_op=REG_W(%#p)=REG_R%s(%#p)&(~shift_op);\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=c;\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(shift_op==0);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_ADD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)+%u;\\n\", REG_W(d.Rd), REG_R(d.Rn), d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=CarryFrom(v, %u);\\n\", &(GETCPU.CPSR), d.Immediate);\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromADD(REG(%#p), v, %u);\\n\", &(GETCPU.CPSR), REG(d.Rd), d.Immediate);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)+shift_op;\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=CarryFrom(v, shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromADD(REG(%#p), v, shift_op);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_ADC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)+%u+((Status_Reg*)%#p)->bits.C;\\n\", REG_W(d.Rd), REG_R(d.Rn), d.Immediate, &(GETCPU.CPSR));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=BIT31((v^%u^-1) & (v^REG(%#p)));\\n\", &(GETCPU.CPSR), d.Immediate, REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.C)\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=REG(%#p)<=v;\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=REG(%#p)<v;\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)+shift_op+((Status_Reg*)%#p)->bits.C;\\n\", REG_W(d.Rd), REG_R(d.Rn), &(GETCPU.CPSR));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=BIT31((v^shift_op^-1) & (v^REG(%#p)));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.C)\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=REG(%#p)<=v;\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=REG(%#p)<v;\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_SUB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)-%u;\\n\", REG_W(d.Rd), REG_R(d.Rn), d.Immediate);\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=!BorrowFrom(v, %u);\\n\", &(GETCPU.CPSR), d.Immediate);\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromSUB(REG(%#p), v, %u);\\n\", &(GETCPU.CPSR), REG(d.Rd), d.Immediate);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)-shift_op;\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=!BorrowFrom(v, shift_op);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromSUB(REG(%#p), v, shift_op);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_SBC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)-%u-!((Status_Reg*)%#p)->bits.C;\\n\", REG_W(d.Rd), REG_R(d.Rn), d.Immediate, &(GETCPU.CPSR));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=BIT31((v^%u) & (v^REG(%#p)));\\n\", &(GETCPU.CPSR), d.Immediate, REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.C)\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=v>=%u;\\n\", &(GETCPU.CPSR), d.Immediate);\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=v>%u;\\n\", &(GETCPU.CPSR), d.Immediate);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)-shift_op-!((Status_Reg*)%#p)->bits.C;\\n\", REG_W(d.Rd), REG_R(d.Rn), &(GETCPU.CPSR));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=BIT31((v^shift_op) & (v^REG(%#p)));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.C)\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=v>=shift_op;\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=v>shift_op;\\n\", &(GETCPU.CPSR));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_RSB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=%u-REG_R%s(%#p);\\n\", REG_W(d.Rd), d.Immediate, REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=!BorrowFrom(%u, v);\\n\", &(GETCPU.CPSR), d.Immediate);\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromSUB(REG(%#p), %u, v);\\n\", &(GETCPU.CPSR), REG(d.Rd), d.Immediate);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=shift_op-REG_R%s(%#p);\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=!BorrowFrom(shift_op, v);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromSUB(REG(%#p), shift_op, v);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_RSC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=%u-REG_R%s(%#p)-!((Status_Reg*)%#p)->bits.C;\\n\", REG_W(d.Rd), d.Immediate, REG_R(d.Rn), &(GETCPU.CPSR));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=BIT31((%u^v) & (%u^REG(%#p)));\\n\", &(GETCPU.CPSR), d.Immediate, d.Immediate, REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.C)\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u>=v;\\n\", &(GETCPU.CPSR), d.Immediate);\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=%u>v;\\n\", &(GETCPU.CPSR), d.Immediate);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p)=shift_op-REG_R%s(%#p)-!((Status_Reg*)%#p)->bits.C;\\n\", REG_W(d.Rd), REG_R(d.Rn), &(GETCPU.CPSR));\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=BIT31((v^shift_op) & (shift_op^REG(%#p)));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.C)\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=shift_op>=v;\\n\", &(GETCPU.CPSR));\n\t\t\t\t\tWRITE_CODE(\"else\\n\");\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=shift_op>v;\\n\", &(GETCPU.CPSR));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, szCodeBuffer);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_CMP)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 tmp=REG_R%s(%#p)-%u;\\n\", REG_R(d.Rn), d.Immediate);\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(tmp);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(tmp==0);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=!BorrowFrom(REG_R%s(%#p), %u);\\n\", &(GETCPU.CPSR), REG_R(d.Rn), d.Immediate);\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromSUB(tmp, REG_R%s(%#p), %u);\\n\", &(GETCPU.CPSR), REG_R(d.Rn), d.Immediate);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tWRITE_CODE(\"u32 tmp=REG_R%s(%#p)-shift_op;\\n\", REG_R(d.Rn));\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(tmp);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(tmp==0);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=!BorrowFrom(REG_R%s(%#p), shift_op);\\n\", &(GETCPU.CPSR), REG_R(d.Rn));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromSUB(tmp, REG_R%s(%#p), shift_op);\\n\", &(GETCPU.CPSR), REG_R(d.Rn));\n\t\t\t}\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_CMN)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 tmp=REG_R%s(%#p)+%u;\\n\", REG_R(d.Rn), d.Immediate);\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(tmp);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(tmp==0);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=CarryFrom(REG_R%s(%#p), %u);\\n\", &(GETCPU.CPSR), REG_R(d.Rn), d.Immediate);\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromADD(tmp, REG_R%s(%#p), %u);\\n\", &(GETCPU.CPSR), REG_R(d.Rn), d.Immediate);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\tWRITE_CODE(\"u32 tmp=REG_R%s(%#p)+shift_op;\\n\", REG_R(d.Rn));\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(tmp);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(tmp==0);\\n\", &(GETCPU.CPSR));\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=CarryFrom(REG_R%s(%#p), shift_op);\\n\", &(GETCPU.CPSR), REG_R(d.Rn));\n\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=OverflowFromADD(tmp, REG_R%s(%#p), shift_op);\\n\", &(GETCPU.CPSR), REG_R(d.Rn));\n\t\t\t}\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_MUL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rs));\n\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)*v;\\n\", REG_W(d.Rd), REG_R(d.Rm));\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t}\n\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v==0)||(v==0xFFFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=1+1;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v==0)||(v==0xFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=1+2;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v==0)||(v==0xFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=1+3;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=1+4;\\n\");\n\t\tWRITE_CODE(\"}}}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_MLA)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rs));\n\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)*v+REG_R%s(%#p);\\n\", REG_W(d.Rd), REG_R(d.Rm), REG_R(d.Rn));\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t}\n\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v==0)||(v==0xFFFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+1;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v==0)||(v==0xFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+2;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v==0)||(v==0xFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+3;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+4;\\n\");\n\t\tWRITE_CODE(\"}}}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_UMULL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rs));\n\t\tWRITE_CODE(\"u64 res=(u64)REG_R%s(%#p)*v;\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"REG_W(%#p)=(u32)res;\\n\", REG_W(d.Rn));\n\t\tWRITE_CODE(\"REG_W(%#p)=(u32)(res>>32);\\n\", REG_W(d.Rd));\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0)&&(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd), REG(d.Rn));\n\t\t}\n\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if(v==0){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+1;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if(v==0){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+2;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if(v==0){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+3;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+4;\\n\");\n\t\tWRITE_CODE(\"}}}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_UMLAL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 v=REG_R%s(%#p);\\n\", REG_R(d.Rs));\n\t\tWRITE_CODE(\"u64 res=(u64)REG_R%s(%#p)*v;\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"u32 tmp=(u32)res;\\n\");\n\t\tWRITE_CODE(\"REG_W(%#p)=(u32)(res>>32)+REG_R%s(%#p)+CarryFrom(tmp,REG_R%s(%#p));\\n\", REG_W(d.Rd), REG_R(d.Rd), REG_R(d.Rn));\n\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)+tmp;\\n\", REG_W(d.Rn), REG_R(d.Rn));\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0)&&(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd), REG(d.Rn));\n\t\t}\n\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if(v==0){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+1;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if(v==0){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+2;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v >>= 8;\\n\");\n\t\tWRITE_CODE(\"if(v==0){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+3;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+4;\\n\");\n\t\tWRITE_CODE(\"}}}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_SMULL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"s64 v=REG_SR%s(%#p);\\n\", REG_R(d.Rs));\n\t\tWRITE_CODE(\"s64 res=(s64)REG_SR%s(%#p)*v;\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"REG_W(%#p)=(u32)res;\\n\", REG_W(d.Rn));\n\t\tWRITE_CODE(\"REG_W(%#p)=(u32)(res>>32);\\n\", REG_W(d.Rd));\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0)&&(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd), REG(d.Rn));\n\t\t}\n\n\t\tWRITE_CODE(\"u32 v2 = v&0xFFFFFFFF;\\n\");\n\t\tWRITE_CODE(\"v2 >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v2==0)||(v2==0xFFFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+1;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v2 >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v2==0)||(v2==0xFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+2;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v2 >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v2==0)||(v2==0xFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+3;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=2+4;\\n\");\n\t\tWRITE_CODE(\"}}}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_SMLAL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"s64 v=REG_SR%s(%#p);\\n\", REG_R(d.Rs));\n\t\tWRITE_CODE(\"s64 res=(s64)REG_SR%s(%#p)*v;\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"u32 tmp=(u32)res;\\n\");\n\t\tWRITE_CODE(\"REG_W(%#p)=(u32)(res>>32)+REG_R%s(%#p)+CarryFrom(tmp,REG_R%s(%#p));\\n\", REG_W(d.Rd), REG_R(d.Rd), REG_R(d.Rn));\n\t\tWRITE_CODE(\"REG_W(%#p)=REG_R%s(%#p)+tmp;\\n\", REG_W(d.Rn), REG_R(d.Rn));\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(REG(%#p));\\n\", &(GETCPU.CPSR), REG(d.Rd));\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=(REG(%#p)==0)&&(REG(%#p)==0);\\n\", &(GETCPU.CPSR), REG(d.Rd), REG(d.Rn));\n\t\t}\n\n\t\tWRITE_CODE(\"u32 v2 = v&0xFFFFFFFF;\\n\");\n\t\tWRITE_CODE(\"v2 >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v2==0)||(v2==0xFFFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+1;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v2 >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v2==0)||(v2==0xFFFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+2;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"v2 >>= 8;\\n\");\n\t\tWRITE_CODE(\"if((v2==0)||(v2==0xFF)){\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+3;\\n\");\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"ExecuteCycles+=3+4;\\n\");\n\t\tWRITE_CODE(\"}}}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_SMULxy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"REG_W(%#p)=(u32)(\", REG_W(d.Rd));\n\t\tif (d.X)\n\t\t\tWRITE_CODE(\"HWORD(\");\n\t\telse\n\t\t\tWRITE_CODE(\"LWORD(\");\n\t\tWRITE_CODE(\"REG_R%s(%#p))*\", REG_R(d.Rm));\n\t\tif (d.Y)\n\t\t\tWRITE_CODE(\"HWORD(\");\n\t\telse\n\t\t\tWRITE_CODE(\"LWORD(\");\n\t\tWRITE_CODE(\"REG_R%s(%#p)));\\n\", REG_R(d.Rs));\n\t}\n\n\tOPCDECODER_DECL(IR_SMLAxy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (!d.X && !d.Y)\n\t\t{\n\t\t\tWRITE_CODE(\"u32 tmp=(u32)((s16)REG_R%s(%#p) * (s16)REG_R%s(%#p));\\n\", REG_R(d.Rm), REG_R(d.Rs));\n\t\t\tWRITE_CODE(\"REG_W(%#p) = tmp + REG_R%s(%#p);\\n\", REG_W(d.Rd), REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"if (OverflowFromADD(REG(%#p), tmp, REG_R%s(%#p)))\\n\", REG(d.Rd), REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"u32 tmp=(u32)(\");\n\t\t\tif (d.X)\n\t\t\t\tWRITE_CODE(\"HWORD(\");\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"LWORD(\");\n\t\t\tWRITE_CODE(\"REG_R%s(%#p))*\", REG_R(d.Rm));\n\t\t\tif (d.Y)\n\t\t\t\tWRITE_CODE(\"HWORD(\");\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"LWORD(\");\n\t\t\tWRITE_CODE(\"REG_R%s(%#p)));\\n\", REG_R(d.Rs));\n\t\t\tWRITE_CODE(\"u32 a = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tWRITE_CODE(\"REG_W(%#p) = tmp + a;\\n\", REG_W(d.Rd));\n\t\t\tWRITE_CODE(\"if (SIGNED_OVERFLOW(tmp, a, REG(%#p)))\\n\", REG(d.Rd));\n\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_SMULWy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"s64 tmp = (s64)\");\n\t\tif (d.Y)\n\t\t\tWRITE_CODE(\"HWORD(\");\n\t\telse\n\t\t\tWRITE_CODE(\"LWORD(\");\n\t\tWRITE_CODE(\"REG_R%s(%#p)) * (s64)((s32)REG_R%s(%#p));\\n\", REG_R(d.Rs), REG_R(d.Rm));\n\t\tWRITE_CODE(\"REG_W(%#p) = ((tmp>>16)&0xFFFFFFFF);\\n\", REG_W(d.Rd));\n\t}\n\n\tOPCDECODER_DECL(IR_SMLAWy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"s64 tmp = (s64)\");\n\t\tif (d.Y)\n\t\t\tWRITE_CODE(\"HWORD(\");\n\t\telse\n\t\t\tWRITE_CODE(\"LWORD(\");\n\t\tWRITE_CODE(\"REG_R%s(%#p)) * (s64)((s32)REG_R%s(%#p));\\n\", REG_R(d.Rs), REG_R(d.Rm));\n\t\tWRITE_CODE(\"u32 a = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\tWRITE_CODE(\"tmp = ((tmp>>16)&0xFFFFFFFF);\\n\");\n\t\tWRITE_CODE(\"REG_W(%#p) = tmp + a;\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"if (SIGNED_OVERFLOW((u32)tmp, a, REG(%#p)))\\n\", REG(d.Rd));\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t}\n\n\tOPCDECODER_DECL(IR_SMLALxy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"s64 tmp=(s64)(\");\n\t\tif (d.X)\n\t\t\tWRITE_CODE(\"HWORD(\");\n\t\telse\n\t\t\tWRITE_CODE(\"LWORD(\");\n\t\tWRITE_CODE(\"REG_R%s(%#p))*\", REG_R(d.Rm));\n\t\tif (d.Y)\n\t\t\tWRITE_CODE(\"HWORD(\");\n\t\telse\n\t\t\tWRITE_CODE(\"LWORD(\");\n\t\tWRITE_CODE(\"REG_R%s(%#p)));\\n\", REG_R(d.Rs));\n\t\tWRITE_CODE(\"u64 res = (u64)tmp + REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\tWRITE_CODE(\"REG_W(%#p) = (u32)res;\\n\", REG_W(d.Rn));\n\t\tWRITE_CODE(\"REG_W(%#p) = REG_R%s(%#p) + (res + ((tmp<0)*0xFFFFFFFF));\\n\", REG_W(d.Rd), REG_R(d.Rd));\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_LDR(u32 adr, u32 *dstreg)\n\t{\n\t\tu32 data = READ32(GETCPU.mem_if->data, adr);\n\t\tif(adr&3)\n\t\t\tdata = ROR(data, 8*(adr&3));\n\t\t*dstreg = data;\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(cycle,adr);\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_LDRB(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = READ8(GETCPU.mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(cycle,adr);\n\t}\n\n\tstatic const MemOp1 LDR_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDR<0,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_GENERIC,3>,//MEMOP_LDR<0,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_SWIRAM,3>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDR<1,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_GENERIC,3>,//MEMOP_LDR<1,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_SWIRAM,3>,\n\t\t}\n\t};\n\n\tstatic const MemOp1 LDR_R15_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDR<0,MEMTYPE_GENERIC,5>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_MAIN,5>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_DTCM_ARM9,5>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_GENERIC,5>,//MEMOP_LDR<0,MEMTYPE_ERAM_ARM7,5>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_SWIRAM,5>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDR<1,MEMTYPE_GENERIC,5>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_MAIN,5>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_GENERIC,5>,//MEMOP_LDR<1,MEMTYPE_DTCM_ARM9,5>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_ERAM_ARM7,5>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_SWIRAM,5>,\n\t\t}\n\t};\n\n\tstatic const MemOp1 LDRB_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRB<0,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_GENERIC,3>,//MEMOP_LDRB<0,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_SWIRAM,3>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRB<1,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_GENERIC,3>,//MEMOP_LDRB<1,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_SWIRAM,3>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_LDR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\t\tu32 adr_guess = 0;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c %u;\\n\", REG_R(d.Rn), d.U?'+':'-', d.Immediate);\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (d.Immediate * (d.U?1:-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c shift_op;\\n\", REG_R(d.Rn), d.U?'+':'-');\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (CalcShiftOp(d) * (d.U?1:-1));\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr;\\n\", REG_W(d.Rn));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', d.Immediate);\n\t\t\telse\n\t\t\t{\n\t\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c shift_op;\\n\", REG_W(d.Rn), d.U?'+':'-');\n\t\t\t}\n\n\t\t\tadr_guess = READREG(d.Rn);\n\t\t}\n\n\t\tif (d.B)\n\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDRB_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t\telse\n\t\t{\n\t\t\tif (d.R15Modified)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDR_R15_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\n\t\t\t\tif (PROCNUM == 0)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.T=BIT0(REG(%#p));\\n\", &(GETCPU.CPSR), REG(15));\n\t\t\t\t\tWRITE_CODE(\"REG(%#p) &= 0xFFFFFFFE;\\n\", REG(15));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"REG(%#p) &= 0xFFFFFFFC;\\n\", REG(15));\n\n\t\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t\t}\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDR_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t\t}\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_STR(u32 adr, u32 data)\n\t{\n\t\tWRITE32(GETCPU.mem_if->data, adr, data);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(cycle,adr);\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_STRB(u32 adr, u32 data)\n\t{\n\t\tWRITE8(GETCPU.mem_if->data, adr, data);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(cycle,adr);\n\t}\n\n\tstatic const MemOp2 STR_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STR<0,MEMTYPE_GENERIC,2>,\n\t\t\tMEMOP_STR<0,MEMTYPE_MAIN,2>,\n\t\t\tMEMOP_STR<0,MEMTYPE_DTCM_ARM9,2>,\n\t\t\tMEMOP_STR<0,MEMTYPE_GENERIC,2>,//MEMOP_STR<0,MEMTYPE_ERAM_ARM7,2>,\n\t\t\tMEMOP_STR<0,MEMTYPE_SWIRAM,2>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STR<1,MEMTYPE_GENERIC,2>,\n\t\t\tMEMOP_STR<1,MEMTYPE_MAIN,2>,\n\t\t\tMEMOP_STR<1,MEMTYPE_GENERIC,2>,//MEMOP_STR<1,MEMTYPE_DTCM_ARM9,2>,\n\t\t\tMEMOP_STR<1,MEMTYPE_ERAM_ARM7,2>,\n\t\t\tMEMOP_STR<1,MEMTYPE_SWIRAM,2>,\n\t\t}\n\t};\n\n\tstatic const MemOp2 STRB_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STRB<0,MEMTYPE_GENERIC,2>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_MAIN,2>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_DTCM_ARM9,2>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_GENERIC,2>,//MEMOP_STRB<0,MEMTYPE_ERAM_ARM7,2>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_SWIRAM,2>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STRB<1,MEMTYPE_GENERIC,2>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_MAIN,2>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_GENERIC,2>,//MEMOP_STRB<1,MEMTYPE_DTCM_ARM9,2>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_ERAM_ARM7,2>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_SWIRAM,2>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_STR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\t\tu32 adr_guess = 0;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c %u;\\n\", REG_R(d.Rn), d.U?'+':'-', d.Immediate);\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (d.Immediate * (d.U?1:-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c shift_op;\\n\", REG_R(d.Rn), d.U?'+':'-');\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (CalcShiftOp(d) * (d.U?1:-1));\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr;\\n\", REG_W(d.Rn));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\t\tadr_guess = READREG(d.Rn);\n\t\t}\n\n\t\tif (d.B)\n\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32))%#p)(adr,REG_R%s(%#p));\\n\", STRB_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REG_R(d.Rd));\n\t\telse\n\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32))%#p)(adr,REG_R%s(%#p));\\n\", STR_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REG_R(d.Rd));\n\n\t\tif (!d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', d.Immediate);\n\t\t\telse\n\t\t\t{\n\t\t\t\tIRShiftOpGenerate(d, szCodeBuffer, false);\n\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c shift_op;\\n\", REG_W(d.Rn), d.U?'+':'-');\n\t\t\t}\n\t\t}\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_LDRH(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = READ16(GETCPU.mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(cycle,adr);\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_LDRSH(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = (s16)READ16(GETCPU.mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(cycle,adr);\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_LDRSB(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = (s8)READ8(GETCPU.mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(cycle,adr);\n\t}\n\n\tstatic const MemOp1 LDRH_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRH<0,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_GENERIC,3>,//MEMOP_LDRH<0,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_SWIRAM,3>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRH<1,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_GENERIC,3>,//MEMOP_LDRH<1,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_SWIRAM,3>,\n\t\t}\n\t};\n\n\tstatic const MemOp1 LDRSH_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_GENERIC,3>,//MEMOP_LDRSH<0,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_SWIRAM,3>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_GENERIC,3>,//MEMOP_LDRSH<1,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_SWIRAM,3>,\n\t\t}\n\t};\n\n\tstatic const MemOp1 LDRSB_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_GENERIC,3>,//MEMOP_LDRSB<0,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_SWIRAM,3>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_GENERIC,3>,//MEMOP_LDRSB<1,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_SWIRAM,3>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_LDRx)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\t\tu32 adr_guess = 0;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c %u;\\n\", REG_R(d.Rn), d.U?'+':'-', d.Immediate);\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (d.Immediate * (d.U?1:-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c REG_R%s(%#p);\\n\", REG_R(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\t\t\t\tadr_guess = READREG(d.Rn) + (READREG(d.Rm) * (d.U?1:-1));\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr;\\n\", REG_W(d.Rn));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\t\tadr_guess = READREG(d.Rn);\n\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', d.Immediate);\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c REG_R%s(%#p);\\n\", REG_W(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\t\t}\n\n\t\tif (d.H)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDRSH_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDRH_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t\t}\n\t\telse\n\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDRSB_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_STRH(u32 adr, u32 data)\n\t{\n\t\tWRITE16(GETCPU.mem_if->data, adr, data);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(cycle,adr);\n\t}\n\n\tstatic const MemOp2 STRH_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STRH<0,MEMTYPE_GENERIC,2>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_MAIN,2>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_DTCM_ARM9,2>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_GENERIC,2>,//MEMOP_STRH<0,MEMTYPE_ERAM_ARM7,2>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_SWIRAM,2>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STRH<1,MEMTYPE_GENERIC,2>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_MAIN,2>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_GENERIC,2>,//MEMOP_STRH<1,MEMTYPE_DTCM_ARM9,2>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_ERAM_ARM7,2>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_SWIRAM,2>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_STRx)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\t\tu32 adr_guess = 0;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c %u;\\n\", REG_R(d.Rn), d.U?'+':'-', d.Immediate);\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (d.Immediate * (d.U?1:-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c REG_R%s(%#p);\\n\", REG_R(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (READREG(d.Rm) * (d.U?1:-1));\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr;\\n\", REG_W(d.Rn));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\t\tadr_guess = READREG(d.Rn);\n\t\t}\n\n\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32))%#p)(adr,REG_R%s(%#p));\\n\", STRH_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REG_R(d.Rd));\n\n\t\tif (!d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', d.Immediate);\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c REG_R%s(%#p);\\n\", REG_W(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\t\t}\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_LDRD(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = READ32(GETCPU.mem_if->data, adr);\n\t\t*(dstreg+1) = READ32(GETCPU.mem_if->data, adr+4);\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr) + MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr+4));\n\t}\n\n\tstatic const MemOp1 LDRD_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRD<0,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRD<0,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRD<0,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRD<0,MEMTYPE_GENERIC,3>,//MEMOP_LDRD<0,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRD<0,MEMTYPE_SWIRAM,3>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRD<1,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_LDRD<1,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_LDRD<1,MEMTYPE_GENERIC,3>,//MEMOP_LDRD<1,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_LDRD<1,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_LDRD<1,MEMTYPE_SWIRAM,3>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_LDRD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\t\tu32 adr_guess = 0;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c %u;\\n\", REG_R(d.Rn), d.U?'+':'-', d.Immediate);\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (d.Immediate * (d.U?1:-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c REG_R%s(%#p);\\n\", REG_R(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (READREG(d.Rm) * (d.U?1:-1));\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr;\\n\", REG_W(d.Rn));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\t\tadr_guess = READREG(d.Rn);\n\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c %u;\\n\", REG_W(d.Rn), d.Immediate, d.U?'+':'-');\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c REG_R%s(%#p);\\n\", REG_W(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\t\t}\n\n\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDRD_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 FASTCALL MEMOP_STRD(u32 adr, u32 *srcreg)\n\t{\n\t\tWRITE32(GETCPU.mem_if->data, adr, *srcreg);\n\t\tWRITE32(GETCPU.mem_if->data, adr+4, *(srcreg+1));\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr) + MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr+4));\n\t}\n\n\tstatic const MemOp1 STRD_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STRD<0,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_STRD<0,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_STRD<0,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_STRD<0,MEMTYPE_GENERIC,3>,//MEMOP_STRD<0,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_STRD<0,MEMTYPE_SWIRAM,3>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STRD<1,MEMTYPE_GENERIC,3>,\n\t\t\tMEMOP_STRD<1,MEMTYPE_MAIN,3>,\n\t\t\tMEMOP_STRD<1,MEMTYPE_GENERIC,3>,//MEMOP_STRD<1,MEMTYPE_DTCM_ARM9,3>,\n\t\t\tMEMOP_STRD<1,MEMTYPE_ERAM_ARM7,3>,\n\t\t\tMEMOP_STRD<1,MEMTYPE_SWIRAM,3>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_STRD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\t\tu32 adr_guess = 0;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c %u;\\n\", REG_R(d.Rn), d.U?'+':'-', d.Immediate);\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (d.Immediate * (d.U?1:-1));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) %c REG_R%s(%#p);\\n\", REG_R(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\n\t\t\t\tadr_guess = READREG(d.Rn) + (READREG(d.Rm) * (d.U?1:-1));\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr;\\n\", REG_W(d.Rn));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\t\tadr_guess = READREG(d.Rn);\n\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c %u;\\n\", REG_W(d.Rn), d.Immediate, d.U?'+':'-');\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"REG_W(%#p) = adr %c REG_R%s(%#p);\\n\", REG_W(d.Rn), d.U?'+':'-', REG_R(d.Rm));\n\t\t}\n\n\t\tif (d.Rd == 14)\n\t\t\tWRITE_CODE(\"REG_W(%#p) = %u;\\n\", REG_W(15), d.CalcR15(d));\n\n\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", STRD_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t}\n\n\tOPCDECODER_DECL(IR_LDREX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\tu32 adr_guess = READREG(d.Rn);\n\n\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32*))%#p)(adr,REGPTR(%#p));\\n\", LDR_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REGPTR(d.Rd));\n\t}\n\n\tOPCDECODER_DECL(IR_STREX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\tu32 adr_guess = READREG(d.Rn);\n\n\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32, u32))%#p)(adr,REG_R%s(%#p));\\n\", STR_Tab[PROCNUM][GuessAddressArea(PROCNUM,adr_guess)], REG_R(d.Rd));\n\n\t\tWRITE_CODE(\"REG_W(%#p) = 0;\\n\", REG_W(d.Rm));\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle, bool up>\n\tstatic u32 MEMOP_LDM_SEQUENCE(u32 adr, u32 count, u32 *regs)\n\t{\n\t\tu32 c = 0;\n\t\tu8 *ptr = _MMU_read_getrawptr32<PROCNUM, MMU_AT_DATA>(adr, adr+(count-1)*4);\n\t\tif (ptr)\n\t\t{\n#ifdef WORDS_BIGENDIAN\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tregs[i] = T1ReadLong_guaranteedAligned(ptr, i * sizeof(u32));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tregs[i] = T1ReadLong_guaranteedAligned(ptr, i * sizeof(u32));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n#else\n\t\t\tmemcpy(regs, ptr, sizeof(u32) * count);\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tregs[i] = READ32(GETCPU.mem_if->data, adr);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tregs[i] = READ32(GETCPU.mem_if->data, adr);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, c);\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle, bool up>\n\tstatic u32 MEMOP_LDM(u32 adr, u32 count, u32 *regs_ptr)\n\t{\n\t\tu32 c = 0;\n\t\tu32 **regs = (u32 **)regs_ptr;\n\t\tu8 *ptr = _MMU_read_getrawptr32<PROCNUM, MMU_AT_DATA>(adr, adr+(count-1)*4);\n\t\tif (ptr)\n\t\t{\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\t*(regs[i]) = T1ReadLong_guaranteedAligned(ptr, i * sizeof(u32));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\t*(regs[i]) = T1ReadLong_guaranteedAligned(ptr, i * sizeof(u32));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\t*(regs[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\t*(regs[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, c);\n\t}\n\n\tstatic const MemOp3 LDM_SEQUENCE_Up_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_MAIN,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_DTCM_ARM9,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,2,true>,//MEMOP_LDM_SEQUENCE<0,MEMTYPE_ERAM_ARM7,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_SWIRAM,2,true>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_MAIN,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,2,true>,//MEMOP_LDM_SEQUENCE<1,MEMTYPE_DTCM_ARM9,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_ERAM_ARM7,2,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_SWIRAM,2,true>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 LDM_Up_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,2,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_MAIN,2,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_DTCM_ARM9,2,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,2,true>,//MEMOP_LDM<0,MEMTYPE_ERAM_ARM7,2,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_SWIRAM,2,true>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,2,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_MAIN,2,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,2,true>,//MEMOP_LDM<1,MEMTYPE_DTCM_ARM9,2,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_ERAM_ARM7,2,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_SWIRAM,2,true>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 LDM_SEQUENCE_Up_R15_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_MAIN,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_DTCM_ARM9,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,4,true>,//MEMOP_LDM_SEQUENCE<0,MEMTYPE_ERAM_ARM7,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_SWIRAM,4,true>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_MAIN,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,4,true>,//MEMOP_LDM_SEQUENCE<1,MEMTYPE_DTCM_ARM9,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_ERAM_ARM7,4,true>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_SWIRAM,4,true>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 LDM_Up_R15_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,4,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_MAIN,4,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_DTCM_ARM9,4,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,4,true>,//MEMOP_LDM<0,MEMTYPE_ERAM_ARM7,4,true>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_SWIRAM,4,true>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,4,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_MAIN,4,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,4,true>,//MEMOP_LDM<1,MEMTYPE_DTCM_ARM9,4,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_ERAM_ARM7,4,true>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_SWIRAM,4,true>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 LDM_SEQUENCE_Down_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_MAIN,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_DTCM_ARM9,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,2,false>,//MEMOP_LDM_SEQUENCE<0,MEMTYPE_ERAM_ARM7,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_SWIRAM,2,false>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_MAIN,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,2,false>,//MEMOP_LDM_SEQUENCE<1,MEMTYPE_DTCM_ARM9,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_ERAM_ARM7,2,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_SWIRAM,2,false>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 LDM_Down_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,2,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_MAIN,2,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_DTCM_ARM9,2,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,2,false>,//MEMOP_LDM<0,MEMTYPE_ERAM_ARM7,2,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_SWIRAM,2,false>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,2,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_MAIN,2,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,2,false>,//MEMOP_LDM<1,MEMTYPE_DTCM_ARM9,2,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_ERAM_ARM7,2,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_SWIRAM,2,false>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 LDM_SEQUENCE_Down_R15_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_MAIN,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_DTCM_ARM9,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_GENERIC,4,false>,//MEMOP_LDM_SEQUENCE<0,MEMTYPE_ERAM_ARM7,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<0,MEMTYPE_SWIRAM,4,false>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_MAIN,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_GENERIC,4,false>,//MEMOP_LDM_SEQUENCE<1,MEMTYPE_DTCM_ARM9,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_ERAM_ARM7,4,false>,\n\t\t\tMEMOP_LDM_SEQUENCE<1,MEMTYPE_SWIRAM,4,false>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 LDM_Down_R15_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,4,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_MAIN,4,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_DTCM_ARM9,4,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_GENERIC,4,false>,//MEMOP_LDM<0,MEMTYPE_ERAM_ARM7,4,false>,\n\t\t\tMEMOP_LDM<0,MEMTYPE_SWIRAM,4,false>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,4,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_MAIN,4,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_GENERIC,4,false>,//MEMOP_LDM<1,MEMTYPE_DTCM_ARM9,4,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_ERAM_ARM7,4,false>,\n\t\t\tMEMOP_LDM<1,MEMTYPE_SWIRAM,4,false>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_LDM)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 SequenceFlag = 0;//0:no sequence start,1:one sequence start,2:one sequence end,3:more than one sequence start\n\t\tu32 Count = 0;\n\t\tu32* Regs[16];\n\t\tfor(u32 RegisterList = d.RegisterList, n = 0; RegisterList; RegisterList >>= 1, n++)\n\t\t{\n\t\t\tif (RegisterList & 0x1)\n\t\t\t{\n\t\t\t\tRegs[Count] = &GETCPU.R[n];\n\t\t\t\tCount++;\n\n\t\t\t\tif (SequenceFlag == 0)\n\t\t\t\t\tSequenceFlag = 1;\n\t\t\t\telse if (SequenceFlag == 2)\n\t\t\t\t\tSequenceFlag = 3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (SequenceFlag == 1)\n\t\t\t\t\tSequenceFlag = 2;\n\t\t\t}\n\t\t}\n\n\t\tbool NeedWriteBack = false;\n\t\tif (d.W)\n\t\t{\n\t\t\tif (d.RegisterList & (1 << d.Rn))\n\t\t\t{\n\t\t\t\tu32 bitList = (~((2 << d.Rn)-1)) & 0xFFFF;\n\t\t\t\tif (/*!d.S && */(d.RegisterList & bitList))\n\t\t\t\t\tNeedWriteBack = true;\n\t\t\t}\n\t\t\telse\n\t\t\t\tNeedWriteBack = true;\n\t\t}\n\n\t\tbool IsOneSequence = (SequenceFlag == 1 || SequenceFlag == 2);\n\n\t\tif (NeedWriteBack)\n\t\t\tWRITE_CODE(\"u32 adr_old = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\tif (d.P)\n\t\t\tWRITE_CODE(\"u32 adr = (REG_R%s(%#p) %c 4) & 0xFFFFFFFC;\\n\", REG_R(d.Rn), d.U?'+':'-');\n\t\telse\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) & 0xFFFFFFFC;\\n\", REG_R(d.Rn));\n\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.R15Modified)\n\t\t\t{\n\t\t\t\t//WRITE_CODE(\"((Status_Reg*)%#p)->val=((Status_Reg*)%#p)->val;\\n\", &(GETCPU.CPSR), &(GETCPU.SPSR));\n\t\t\t}\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"u32 oldmode = ((u32 (*)(void*,u8))%#p)((void*)%#p,%u);\\n\", armcpu_switchMode, GETCPUPTR, SYS);\n\t\t}\n\n\t\tif (IsOneSequence)\n\t\t{\n\t\t\tif (d.U)\n\t\t\t{\n\t\t\t\tif (d.R15Modified)\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)%#p);\\n\", LDM_SEQUENCE_Up_R15_Tab[PROCNUM][0], Count, Regs[0]);\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)%#p);\\n\", LDM_SEQUENCE_Up_Tab[PROCNUM][0], Count, Regs[0]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (d.R15Modified)\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)%#p);\\n\", LDM_SEQUENCE_Down_R15_Tab[PROCNUM][0], Count, Regs[0]);\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)%#p);\\n\", LDM_SEQUENCE_Down_Tab[PROCNUM][0], Count, Regs[0]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"static const u32* Regs[]={\");\n\t\t\tfor (u32 i = 0; i < Count; i++)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"(u32*)%#p\", Regs[i]);\n\t\t\t\tif (i != Count - 1)\n\t\t\t\t\tWRITE_CODE(\",\");\n\t\t\t}\n\t\t\tWRITE_CODE(\"};\\n\");\n\n\t\t\tif (d.U)\n\t\t\t{\n\t\t\t\tif (d.R15Modified)\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)&Regs[0]);\\n\", LDM_Up_R15_Tab[PROCNUM][0], Count);\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)&Regs[0]);\\n\", LDM_Up_Tab[PROCNUM][0], Count);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (d.R15Modified)\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)&Regs[0]);\\n\", LDM_Down_R15_Tab[PROCNUM][0], Count);\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)&Regs[0]);\\n\", LDM_Down_Tab[PROCNUM][0], Count);\n\t\t\t}\n\t\t}\n\n\t\tif (d.S)\n\t\t{\n\t\t\tif (NeedWriteBack)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p)=adr_old %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', Count*4);\n\n\t\t\tif (d.R15Modified)\n\t\t\t{\n\t\t\t\tLDM_S_LoadCPSRGenerate(d, szCodeBuffer);\n\n\t\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t\t}\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"((u32 (*)(void*,u8))%#p)((void*)%#p,oldmode);\\n\", armcpu_switchMode, GETCPUPTR);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (d.R15Modified)\n\t\t\t{\n\t\t\t\tif (PROCNUM == 0)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.T=BIT0(REG(%#p));\\n\", &(GETCPU.CPSR), REG(15));\n\t\t\t\t\tWRITE_CODE(\"REG(%#p)&=0xFFFFFFFE;\\n\", REG(15));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"REG(%#p)&=0xFFFFFFFC;\\n\", REG(15));\n\t\t\t}\n\n\t\t\tif (NeedWriteBack)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p)=adr_old %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', Count*4);\n\n\t\t\tif (d.R15Modified)\n\t\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle, bool up>\n\tstatic u32 MEMOP_STM_SEQUENCE(u32 adr, u32 count, u32 *regs)\n\t{\n\t\tu32 c = 0;\n\t\tu8 *ptr = _MMU_write_getrawptr32<PROCNUM, MMU_AT_DATA>(adr, adr+(count-1)*4);\n\t\tif (ptr)\n\t\t{\n#ifdef WORDS_BIGENDIAN\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tT1WriteLong(ptr, i * sizeof(u32), regs[i]);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tT1WriteLong(ptr, i * sizeof(u32), regs[i]);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n#else\n\t\t\tmemcpy(ptr, regs, sizeof(u32) * count);\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tWRITE32(GETCPU.mem_if->data, adr, regs[i]);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tWRITE32(GETCPU.mem_if->data, adr, regs[i]);\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, c);\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle, bool up>\n\tstatic u32 MEMOP_STM(u32 adr, u32 count, u32 *regs_ptr)\n\t{\n\t\tu32 c = 0;\n\t\tu32 **regs = (u32 **)regs_ptr;\n\t\tu8 *ptr = _MMU_write_getrawptr32<PROCNUM, MMU_AT_DATA>(adr, adr+(count-1)*4);\n\t\tif (ptr)\n\t\t{\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tT1WriteLong(ptr, i * sizeof(u32), *(regs[i]));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tT1WriteLong(ptr, i * sizeof(u32), *(regs[i]));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (up)\n\t\t\t{\n\t\t\t\tfor (u32 i = 0; i < count; i++)\n\t\t\t\t{\n\t\t\t\t\tWRITE32(GETCPU.mem_if->data, adr, *(regs[i]));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tadr = adr+(count-1)*4;\n\t\t\t\tfor (s32 i = (s32)count - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tWRITE32(GETCPU.mem_if->data, adr, *(regs[i]));\n\t\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\t\t\tadr -= 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, c);\n\t}\n\n\tstatic const MemOp3 STM_SEQUENCE_Up_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_GENERIC,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_MAIN,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_DTCM_ARM9,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_GENERIC,1,true>,//MEMOP_STM_SEQUENCE<0,MEMTYPE_ERAM_ARM7,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_SWIRAM,1,true>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_GENERIC,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_MAIN,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_GENERIC,1,true>,//MEMOP_STM_SEQUENCE<1,MEMTYPE_DTCM_ARM9,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_ERAM_ARM7,1,true>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_SWIRAM,1,true>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 STM_Up_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STM<0,MEMTYPE_GENERIC,1,true>,\n\t\t\tMEMOP_STM<0,MEMTYPE_MAIN,1,true>,\n\t\t\tMEMOP_STM<0,MEMTYPE_DTCM_ARM9,1,true>,\n\t\t\tMEMOP_STM<0,MEMTYPE_GENERIC,1,true>,//MEMOP_STM<0,MEMTYPE_ERAM_ARM7,1,true>,\n\t\t\tMEMOP_STM<0,MEMTYPE_SWIRAM,1,true>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STM<1,MEMTYPE_GENERIC,1,true>,\n\t\t\tMEMOP_STM<1,MEMTYPE_MAIN,1,true>,\n\t\t\tMEMOP_STM<1,MEMTYPE_GENERIC,1,true>,//MEMOP_STM<1,MEMTYPE_DTCM_ARM9,1,true>,\n\t\t\tMEMOP_STM<1,MEMTYPE_ERAM_ARM7,1,true>,\n\t\t\tMEMOP_STM<1,MEMTYPE_SWIRAM,1,true>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 STM_SEQUENCE_Down_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_GENERIC,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_MAIN,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_DTCM_ARM9,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_GENERIC,1,false>,//MEMOP_STM_SEQUENCE<0,MEMTYPE_ERAM_ARM7,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<0,MEMTYPE_SWIRAM,1,false>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_GENERIC,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_MAIN,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_GENERIC,1,false>,//MEMOP_STM_SEQUENCE<1,MEMTYPE_DTCM_ARM9,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_ERAM_ARM7,1,false>,\n\t\t\tMEMOP_STM_SEQUENCE<1,MEMTYPE_SWIRAM,1,false>,\n\t\t}\n\t};\n\n\tstatic const MemOp3 STM_Down_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STM<0,MEMTYPE_GENERIC,1,false>,\n\t\t\tMEMOP_STM<0,MEMTYPE_MAIN,1,false>,\n\t\t\tMEMOP_STM<0,MEMTYPE_DTCM_ARM9,1,false>,\n\t\t\tMEMOP_STM<0,MEMTYPE_GENERIC,1,false>,//MEMOP_STM<0,MEMTYPE_ERAM_ARM7,1,false>,\n\t\t\tMEMOP_STM<0,MEMTYPE_SWIRAM,1,false>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STM<1,MEMTYPE_GENERIC,1,false>,\n\t\t\tMEMOP_STM<1,MEMTYPE_MAIN,1,false>,\n\t\t\tMEMOP_STM<1,MEMTYPE_GENERIC,1,false>,//MEMOP_STM<1,MEMTYPE_DTCM_ARM9,1,false>,\n\t\t\tMEMOP_STM<1,MEMTYPE_ERAM_ARM7,1,false>,\n\t\t\tMEMOP_STM<1,MEMTYPE_SWIRAM,1,false>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_STM)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tbool StoreR15 = false;\n\t\tu32 SequenceFlag = 0;//0:no sequence start,1:one sequence start,2:one sequence end,3:more than one sequence start\n\t\tu32 Count = 0;\n\t\tu32* Regs[16];\n\t\tfor(u32 RegisterList = d.RegisterList, n = 0; RegisterList; RegisterList >>= 1, n++)\n\t\t{\n\t\t\tif (RegisterList & 0x1)\n\t\t\t{\n\t\t\t\tRegs[Count] = &GETCPU.R[n];\n\t\t\t\tCount++;\n\n\t\t\t\tif (n == 15)\n\t\t\t\t\tStoreR15 = true;\n\n\t\t\t\tif (SequenceFlag == 0)\n\t\t\t\t\tSequenceFlag = 1;\n\t\t\t\telse if (SequenceFlag == 2)\n\t\t\t\t\tSequenceFlag = 3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (SequenceFlag == 1)\n\t\t\t\t\tSequenceFlag = 2;\n\t\t\t}\n\t\t}\n\n\t\tif (d.S)\n\t\t\tWRITE_CODE(\"if (((Status_Reg*)%#p)->bits.mode!=%u){\\n\", &(GETCPU.CPSR), USR);\n\n\t\tif (StoreR15)\n\t\t\tWRITE_CODE(\"REG_W(%#p) = %u;\\n\", REG_W(15), d.CalcR15(d));\n\n\t\tbool IsOneSequence = (SequenceFlag == 1 || SequenceFlag == 2);\n\n\t\tif (d.W)\n\t\t\tWRITE_CODE(\"u32 adr_old = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\tif (d.P)\n\t\t\tWRITE_CODE(\"u32 adr = (REG_R%s(%#p) %c 4) & 0xFFFFFFFC;\\n\", REG_R(d.Rn), d.U?'+':'-');\n\t\telse\n\t\t\tWRITE_CODE(\"u32 adr = REG_R%s(%#p) & 0xFFFFFFFC;\\n\", REG_R(d.Rn));\n\n\t\tif (d.S)\n\t\t\tWRITE_CODE(\"u32 oldmode = ((u32 (*)(void*,u8))%#p)((void*)%#p,%u);\\n\", armcpu_switchMode, GETCPUPTR, SYS);\n\n\t\tif (IsOneSequence)\n\t\t{\n\t\t\tif (d.U)\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)%#p);\\n\", STM_SEQUENCE_Up_Tab[PROCNUM][0], Count, Regs[0]);\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)%#p);\\n\", STM_SEQUENCE_Down_Tab[PROCNUM][0], Count, Regs[0]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWRITE_CODE(\"static const u32* Regs[]={\");\n\t\t\tfor (u32 i = 0; i < Count; i++)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"(u32*)%#p\", Regs[i]);\n\t\t\t\tif (i != Count - 1)\n\t\t\t\t\tWRITE_CODE(\",\");\n\t\t\t}\n\t\t\tWRITE_CODE(\"};\\n\");\n\n\t\t\tif (d.U)\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)&Regs[0]);\\n\", STM_Up_Tab[PROCNUM][0], Count);\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32, u32*))%#p)(adr, %u,(u32*)&Regs[0]);\\n\", STM_Down_Tab[PROCNUM][0], Count);\n\t\t}\n\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p)=adr_old %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', Count*4);\n\n\t\t\tWRITE_CODE(\"((u32 (*)(void*,u8))%#p)((void*)%#p,oldmode);\\n\", armcpu_switchMode, GETCPUPTR);\n\n\t\t\tWRITE_CODE(\"}else ExecuteCycles+=2;\\n\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (d.W)\n\t\t\t\tWRITE_CODE(\"REG_W(%#p)=adr_old %c %u;\\n\", REG_W(d.Rn), d.U?'+':'-', Count*4);\n\t\t}\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 MEMOP_SWP(u32 adr, u32 *Rd, u32 Rm)\n\t{\n\t\tu32 tmp = ROR(READ32(GETCPU.mem_if->data, adr), (adr & 3)<<3);\n\t\tWRITE32(GETCPU.mem_if->data, adr, Rm);\n\t\t*Rd = tmp;\n\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr) + MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr));\n\t}\n\n\ttemplate<u32 PROCNUM, u32 memtype, u32 cycle>\n\tstatic u32 MEMOP_SWPB(u32 adr, u32 *Rd, u32 Rm)\n\t{\n\t\tu32 tmp = READ8(GETCPU.mem_if->data, adr);\n\t\tWRITE8(GETCPU.mem_if->data, adr, Rm);\n\t\t*Rd = tmp;\n\n\t\treturn MMU_aluMemCycles<PROCNUM>(cycle, MMU_memAccessCycles<PROCNUM,8,MMU_AD_READ>(adr) + MMU_memAccessCycles<PROCNUM,8,MMU_AD_WRITE>(adr));\n\t}\n\n\tstatic const MemOp4 SWP_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_SWP<0,MEMTYPE_GENERIC,4>,\n\t\t\tMEMOP_SWP<0,MEMTYPE_MAIN,4>,\n\t\t\tMEMOP_SWP<0,MEMTYPE_DTCM_ARM9,4>,\n\t\t\tMEMOP_SWP<0,MEMTYPE_GENERIC,4>,//MEMOP_SWP<0,MEMTYPE_ERAM_ARM7,4>,\n\t\t\tMEMOP_SWP<0,MEMTYPE_SWIRAM,4>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_SWP<1,MEMTYPE_GENERIC,4>,\n\t\t\tMEMOP_SWP<1,MEMTYPE_MAIN,4>,\n\t\t\tMEMOP_SWP<1,MEMTYPE_GENERIC,4>,//MEMOP_SWP<1,MEMTYPE_DTCM_ARM9,4>,\n\t\t\tMEMOP_SWP<1,MEMTYPE_ERAM_ARM7,4>,\n\t\t\tMEMOP_SWP<1,MEMTYPE_SWIRAM,4>,\n\t\t}\n\t};\n\n\tstatic const MemOp4 SWPB_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_SWPB<0,MEMTYPE_GENERIC,4>,\n\t\t\tMEMOP_SWPB<0,MEMTYPE_MAIN,4>,\n\t\t\tMEMOP_SWPB<0,MEMTYPE_DTCM_ARM9,4>,\n\t\t\tMEMOP_SWPB<0,MEMTYPE_GENERIC,4>,//MEMOP_SWPB<0,MEMTYPE_ERAM_ARM7,4>,\n\t\t\tMEMOP_SWPB<0,MEMTYPE_SWIRAM,4>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_SWPB<1,MEMTYPE_GENERIC,4>,\n\t\t\tMEMOP_SWPB<1,MEMTYPE_MAIN,4>,\n\t\t\tMEMOP_SWPB<1,MEMTYPE_GENERIC,4>,//MEMOP_SWPB<1,MEMTYPE_DTCM_ARM9,4>,\n\t\t\tMEMOP_SWPB<1,MEMTYPE_ERAM_ARM7,4>,\n\t\t\tMEMOP_SWPB<1,MEMTYPE_SWIRAM,4>,\n\t\t}\n\t};\n\n\tOPCDECODER_DECL(IR_SWP)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.B)\n\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32*, u32))%#p)(REG_R%s(%#p),REGPTR(%#p),REG_R%s(%#p));\\n\", SWPB_Tab[PROCNUM][0], REG_R(d.Rn), REGPTR(d.Rd), REG_R(d.Rm));\n\t\telse\n\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)(u32, u32*, u32))%#p)(REG_R%s(%#p),REGPTR(%#p),REG_R%s(%#p));\\n\", SWP_Tab[PROCNUM][0], REG_R(d.Rn), REGPTR(d.Rd), REG_R(d.Rm));\n\t}\n\n\tOPCDECODER_DECL(IR_B)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(15), d.Immediate);\n\n\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t}\n\n\tOPCDECODER_DECL(IR_BL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(14), d.CalcNextInstruction(d) | d.ThumbFlag);\n\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(15), d.Immediate);\n\n\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t}\n\n\tOPCDECODER_DECL(IR_BX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 tmp = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.T=BIT0(tmp);\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=tmp & (0xFFFFFFFC|(BIT0(tmp)<<1));\\n\", REG_W(15));\n\n\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t}\n\n\tOPCDECODER_DECL(IR_BLX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 tmp = REG_R%s(%#p);\\n\", REG_R(d.Rn));\n\n\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(14), d.CalcNextInstruction(d) | d.ThumbFlag);\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.T=BIT0(tmp);\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=tmp & (0xFFFFFFFC|(BIT0(tmp)<<1));\\n\", REG_W(15));\n\n\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t}\n\n\tOPCDECODER_DECL(IR_SWI)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (GETCPU.swi_tab)\n\t\t{\n\t\t\tif (PROCNUM == 0)\n\t\t\t\tWRITE_CODE(\"if ((*(u32*)%#p) != 0x00000000){\\n\", &(GETCPU.intVector));\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"if ((*(u32*)%#p) != 0xFFFF0000){\\n\", &(GETCPU.intVector));\n\n\t\t\tif (d.MayHalt)\n\t\t\t{\n\t\t\t\tif (d.ThumbFlag)\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruct_adr), d.Address);\n\t\t\t\t\t//WRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.next_instruction), d.CalcNextInstruction(d));\n\t\t\t\t\t// alway set r15 to next_instruction\n\t\t\t\t\tWRITE_CODE(\"REG_W(%#p) = %u;\\n\", REG_W(15), d.CalcNextInstruction(d));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruct_adr), d.Address);\n\t\t\t\t\t//WRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.next_instruction), d.CalcNextInstruction(d));\n\t\t\t\t\t// alway set r15 to next_instruction\n\t\t\t\t\tWRITE_CODE(\"REG_W(%#p) = %u;\\n\", REG_W(15), d.CalcNextInstruction(d));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (*)())%#p)()+3;\\n\", GETCPU.swi_tab[d.Immediate]);\n\n\t\t\tif (d.MayHalt)\n\t\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\n\t\t\tWRITE_CODE(\"}else{\\n\");\n\t\t}\n\t\t\n\t\t{\n\t\t\tWRITE_CODE(\"Status_Reg tmp;\\n\");\n\t\t\tWRITE_CODE(\"tmp.val = ((Status_Reg*)%#p)->val;\\n\", &(GETCPU.CPSR));\n\t\t\tWRITE_CODE(\"((u32 (*)(void*,u8))%#p)((void*)%#p,%u);\\n\", armcpu_switchMode, GETCPUPTR, SVC);\n\t\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(14), d.CalcNextInstruction(d));\n\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->val = tmp.val;\\n\", &(GETCPU.SPSR));\n\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.T=0;\\n\", &(GETCPU.CPSR));\n\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.I=1;\\n\", &(GETCPU.CPSR));\n\t\t\tWRITE_CODE(\"((void (*)(void*))%#p)((void*)%#p);\\n\", armcpu_changeCPSR, GETCPUPTR);\n\t\t\tWRITE_CODE(\"REG_W(%#p)= (*(u32*)%#p) + 0x08;\\n\", REG_W(15), &(GETCPU.intVector));\n\n\t\t\tWRITE_CODE(\"ExecuteCycles+=3;\\n\");\n\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\n\t\tif (GETCPU.swi_tab)\n\t\t\tWRITE_CODE(\"}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_MSR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tu32 byte_mask = (BIT0(d.OpData)?0x000000FF:0x00000000) |\n\t\t\t\t\t\t\t(BIT1(d.OpData)?0x0000FF00:0x00000000) |\n\t\t\t\t\t\t\t(BIT2(d.OpData)?0x00FF0000:0x00000000) |\n\t\t\t\t\t\t\t(BIT3(d.OpData)?0xFF000000:0x00000000);\n\n\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.mode!=%u&&((Status_Reg*)%#p)->bits.mode!=%u){\\n\",\n\t\t\t\t\t&(GETCPU.CPSR), USR, &(GETCPU.CPSR), SYS);\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"(*(u32*)%#p) = ((*(u32*)%#p) & %u) | %u);\\n\", \n\t\t\t\t\t\t&(GETCPU.SPSR.val), &(GETCPU.SPSR.val), ~byte_mask, byte_mask & d.Immediate);\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"(*(u32*)%#p) = ((*(u32*)%#p) & %u) | (REG_R%s(%#p) & %u);\\n\", \n\t\t\t\t\t\t&(GETCPU.SPSR.val), &(GETCPU.SPSR.val), ~byte_mask, REG_R(d.Rm), byte_mask);\n\t\t\tWRITE_CODE(\"((void (*)(void*))%#p)((void*)%#p);\\n\", armcpu_changeCPSR, GETCPUPTR);\n\t\t\tWRITE_CODE(\"}\\n\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 byte_mask_usr = (BIT3(d.OpData)?0xFF000000:0x00000000);\n\t\t\tu32 byte_mask_other = (BIT0(d.OpData)?0x000000FF:0x00000000) |\n\t\t\t\t\t\t\t\t(BIT1(d.OpData)?0x0000FF00:0x00000000) |\n\t\t\t\t\t\t\t\t(BIT2(d.OpData)?0x00FF0000:0x00000000) |\n\t\t\t\t\t\t\t\t(BIT3(d.OpData)?0xFF000000:0x00000000);\n\n\t\t\tWRITE_CODE(\"u32 byte_mask=(((Status_Reg*)%#p)->bits.mode==%u)?%u:%u;\\n\", \n\t\t\t\t\t&(GETCPU.CPSR), USR, byte_mask_usr, byte_mask_other);\n\n\t\t\tif (BIT0(d.OpData))\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"if(((Status_Reg*)%#p)->bits.mode!=%u){\\n\", &(GETCPU.CPSR), USR);\n\t\t\t\tif (d.I)\n\t\t\t\t\tWRITE_CODE(\"((u32 (*)(void*,u8))%#p)((void*)%#p,%u);\\n\", armcpu_switchMode, GETCPUPTR, d.Immediate & 0x1F);\n\t\t\t\telse\n\t\t\t\t\tWRITE_CODE(\"((u32 (*)(void*,u8))%#p)((void*)%#p,REG_R%s(%#p)&0x1F);\\n\", armcpu_switchMode, GETCPUPTR, REG_R(d.Rm));\n\t\t\t\tWRITE_CODE(\"}\\n\");\n\t\t\t}\n\n\t\t\tif (d.I)\n\t\t\t\tWRITE_CODE(\"(*(u32*)%#p) = ((*(u32*)%#p) & ~byte_mask) | (%u & byte_mask);\\n\", \n\t\t\t\t\t\t&(GETCPU.CPSR.val), &(GETCPU.CPSR.val), d.Immediate);\n\t\t\telse\n\t\t\t\tWRITE_CODE(\"(*(u32*)%#p)=((*(u32*)%#p)&~byte_mask)|(REG_R%s(%#p)&byte_mask);\\n\", \n\t\t\t\t\t\t&(GETCPU.CPSR.val), &(GETCPU.CPSR.val), REG_R(d.Rm));\n\t\t\tWRITE_CODE(\"((void (*)(void*))%#p)((void*)%#p);\\n\", armcpu_changeCPSR, GETCPUPTR);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_MRS)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.P)\n\t\t\tWRITE_CODE(\"REG_W(%#p)= (*(u32*)%#p);\\n\", REG_W(d.Rd), &(GETCPU.SPSR.val));\n\t\telse\n\t\t\tWRITE_CODE(\"REG_W(%#p)= (*(u32*)%#p);\\n\", REG_W(d.Rd), &(GETCPU.CPSR.val));\n\t}\n\n\tOPCDECODER_DECL(IR_MCR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.CPNum == 15)\n\t\t{\n\t\t\tWRITE_CODE(\"((BOOL (*)(u32,u8,u8,u8,u8))%#p)(REG_R%s(%#p),%u,%u,%u,%u);\\n\", \n\t\t\t\t\tarmcp15_moveARM2CP, REG_R(d.Rd), d.CRn, d.CRm, d.CPOpc, d.CP);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tINFO(\"ARM%c: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", \n\t\t\t\tPROCNUM?'7':'9', d.CPNum, d.Rd, d.CRn, d.CRm, d.CPOpc, d.CP);\n\t\t}\n\t}\n\n\tOPCDECODER_DECL(IR_MRC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.CPNum == 15)\n\t\t{\n\t\t\tif (d.Rd == 15)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"u32 data = 0;\\n\");\n\t\t\t\tWRITE_CODE(\"((BOOL (*)(u32*,u8,u8,u8,u8))%#p)(&data,%u,%u,%u,%u);\\n\", \n\t\t\t\t\t\tarmcp15_moveCP2ARM, d.CRn, d.CRm, d.CPOpc, d.CP);\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.N=BIT31(data);\\n\", &(GETCPU.CPSR));\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Z=BIT30(data);\\n\", &(GETCPU.CPSR));\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.C=BIT29(data);\\n\", &(GETCPU.CPSR));\n\t\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.V=BIT28(data);\\n\", &(GETCPU.CPSR));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"((BOOL (*)(u32*,u8,u8,u8,u8))%#p)(REGPTR(%#p),%u,%u,%u,%u);\\n\", \n\t\t\t\t\t\tarmcp15_moveCP2ARM, REGPTR(d.Rd), d.CRn, d.CRm, d.CPOpc, d.CP);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tINFO(\"ARM%c: MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", \n\t\t\t\tPROCNUM?'7':'9', d.CPNum, d.Rd, d.CRn, d.CRm, d.CPOpc, d.CP);\n\t\t}\n\t}\n\n\tstatic const u8 CLZ_TAB[16]=\n\t{\n\t\t0,\t\t\t\t\t\t\t// 0000\n\t\t1,\t\t\t\t\t\t\t// 0001\n\t\t2, 2,\t\t\t\t\t\t// 001X\n\t\t3, 3, 3, 3,\t\t\t\t\t// 01XX\n\t\t4, 4, 4, 4, 4, 4, 4, 4\t\t// 1XXX\n\t};\n\n\tOPCDECODER_DECL(IR_CLZ)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 Rm = REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"if(Rm==0){\\n\");\n\t\tWRITE_CODE(\"REG_W(%#p)=32;\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tWRITE_CODE(\"Rm |= (Rm >>1);\\n\");\n\t\tWRITE_CODE(\"Rm |= (Rm >>2);\\n\");\n\t\tWRITE_CODE(\"Rm |= (Rm >>4);\\n\");\n\t\tWRITE_CODE(\"Rm |= (Rm >>8);\\n\");\n\t\tWRITE_CODE(\"Rm |= (Rm >>16);\\n\");\n\t\tWRITE_CODE(\"static const u8* CLZ_TAB = (u8*)%#p;\\n\", CLZ_TAB);\n\t\tWRITE_CODE(\"u32 pos = CLZ_TAB[Rm&0xF] + \\n\");\n\t\tWRITE_CODE(\"\t\t\tCLZ_TAB[(Rm>>4)&0xF] + \\n\");\n\t\tWRITE_CODE(\"\t\t\tCLZ_TAB[(Rm>>8)&0xF] + \\n\");\n\t\tWRITE_CODE(\"\t\t\tCLZ_TAB[(Rm>>12)&0xF] + \\n\");\n\t\tWRITE_CODE(\"\t\t\tCLZ_TAB[(Rm>>16)&0xF] + \\n\");\n\t\tWRITE_CODE(\"\t\t\tCLZ_TAB[(Rm>>20)&0xF] + \\n\");\n\t\tWRITE_CODE(\"\t\t\tCLZ_TAB[(Rm>>24)&0xF] + \\n\");\n\t\tWRITE_CODE(\"\t\t\tCLZ_TAB[(Rm>>28)&0xF];\\n\");\n\t\tWRITE_CODE(\"REG_W(%#p)=32-pos;}\\n\", REG_W(d.Rd));\n\t}\n\n\tOPCDECODER_DECL(IR_QADD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 res = REG_R%s(%#p) + REG_R%s(%#p);\\n\", REG_R(d.Rn), REG_R(d.Rm));\n\t\tWRITE_CODE(\"if(SIGNED_OVERFLOW(REG_R%s(%#p),REG_R%s(%#p),res)){\\n\", \n\t\t\t\tREG_R(d.Rn), REG_R(d.Rm));\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=0x80000000-BIT31(res);\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res & 0xFFFFFFFC;\\n\", REG_W(d.Rd));\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t\telse\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res;\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_QSUB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 res = REG_R%s(%#p) - REG_R%s(%#p);\\n\", REG_R(d.Rm), REG_R(d.Rn));\n\t\tWRITE_CODE(\"if(SIGNED_UNDERFLOW(REG_R%s(%#p),REG_R%s(%#p),res)){\\n\", \n\t\t\t\tREG_R(d.Rm), REG_R(d.Rn));\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=0x80000000-BIT31(res);\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res & 0xFFFFFFFC;\\n\", REG_W(d.Rd));\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t\telse\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res;\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_QDADD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 mul = REG_R%s(%#p)<<1;\\n\", REG_R(d.Rn));\n\t\tWRITE_CODE(\"if(BIT31(REG_R%s(%#p))!=BIT31(mul)){\\n\", REG_R(d.Rn));\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=0x80000000-BIT31(res);\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}\\n\");\n\t\tWRITE_CODE(\"u32 res = mul + REG_R%s(%#p);\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"if(SIGNED_OVERFLOW(REG_R%s(%#p),mul, res)){\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=0x80000000-BIT31(res);\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res & 0xFFFFFFFC;\\n\", REG_W(d.Rd));\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t\telse\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res;\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_QDSUB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tWRITE_CODE(\"u32 mul = REG_R%s(%#p)<<1;\\n\", REG_R(d.Rn));\n\t\tWRITE_CODE(\"if(BIT31(REG_R%s(%#p))!=BIT31(mul)){\\n\", REG_R(d.Rn));\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=0x80000000-BIT31(res);\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}\\n\");\n\t\tWRITE_CODE(\"u32 res = REG_R%s(%#p) - mul;\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"if(SIGNED_UNDERFLOW(REG_R%s(%#p),mul, res)){\\n\", REG_R(d.Rm));\n\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.Q=1;\\n\", &(GETCPU.CPSR));\n\t\tWRITE_CODE(\"REG_W(%#p)=0x80000000-BIT31(res);\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}else{\\n\");\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res & 0xFFFFFFFC;\\n\", REG_W(d.Rd));\n\t\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t\t}\n\t\telse\n\t\t\tWRITE_CODE(\"REG_W(%#p)=res;\\n\", REG_W(d.Rd));\n\t\tWRITE_CODE(\"}\\n\");\n\t}\n\n\tOPCDECODER_DECL(IR_BLX_IMM)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif(d.ThumbFlag)\n\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.T=0;\\n\", &(GETCPU.CPSR));\n\t\telse\n\t\t\tWRITE_CODE(\"((Status_Reg*)%#p)->bits.T=1;\\n\", &(GETCPU.CPSR));\n\n\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(14), d.CalcNextInstruction(d) | d.ThumbFlag);\n\t\tWRITE_CODE(\"REG_W(%#p)=%u;\\n\", REG_W(15), d.Immediate);\n\n\t\tR15ModifiedGenerate(d, szCodeBuffer);\n\t}\n\n\tOPCDECODER_DECL(IR_BKPT)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"ARM%c: Unimplemented opcode BKPT\\n\", PROCNUM?'7':'9');\n\t}\n};\n\nstatic const IROpCDecoder iropcdecoder_set[IR_MAXNUM] = {\n#define TABDECL(x) ArmCJit::x##_CDecoder\n#include \"ArmAnalyze_tabdef.inc\"\n#undef TABDECL\n};\n\n////////////////////////////////////////////////////////////////////\ntemplate<u32 PROCNUM, bool thumb>\nstatic u32 FASTCALL RunInterpreter(const Decoded &d)\n{\n\tu32 cycles;\n\n\tGETCPU.next_instruction = d.CalcNextInstruction(d);\n\tGETCPU.R[15] = d.CalcR15(d);\n\tif (thumb)\n\t{\n\t\tu32 opcode = d.Instruction.ThumbOp;\n\t\tcycles = thumb_instructions_set[PROCNUM][opcode>>6](opcode);\n\t}\n\telse\n\t{\n\t\tu32 opcode = d.Instruction.ArmOp;\n\t\tif(CONDITION(opcode) == 0xE || TEST_COND(CONDITION(opcode), CODE(opcode), GETCPU.CPSR))\n\t\t\tcycles = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)](opcode);\n\t\telse\n\t\t\tcycles = 1;\n\t}\n\tGETCPU.instruct_adr = GETCPU.next_instruction;\n\n\treturn cycles;\n}\n\nstatic const Interpreter s_OpDecode[2][2] = {RunInterpreter<0,false>, RunInterpreter<0,true>, RunInterpreter<1,false>, RunInterpreter<1,true>};\n\n////////////////////////////////////////////////////////////////////\nstatic void FASTCALL InterpreterFallback(const Decoded &d, char *&szCodeBuffer)\n{\n\tu32 PROCNUM = d.ProcessID;\n\n\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.next_instruction), d.CalcNextInstruction(d));\n\tWRITE_CODE(\"REG_W(%#p) = %u;\\n\", REG_W(15), d.CalcR15(d));\n\tif (d.ThumbFlag)\n\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32))%#p)(%u);\\n\", thumb_instructions_set[PROCNUM][d.Instruction.ThumbOp>>6], d.Instruction.ThumbOp);\n\telse\n\t\tWRITE_CODE(\"ExecuteCycles+=((u32 (FASTCALL *)(u32))%#p)(%u);\\n\", arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(d.Instruction.ArmOp)], d.Instruction.ArmOp);\n\tWRITE_CODE(\"(*(u32*)%#p) = (*(u32*)%#p);\\n\", &(GETCPU.instruct_adr), &(GETCPU.next_instruction));\n\n\tif (d.R15Modified)\n\t\tWRITE_CODE(\"return ExecuteCycles;\\n\");\n}\n////////////////////////////////////////////////////////////////////\nstatic const u32 s_CacheReserveMin = 4 * 1024 * 1024;\nstatic u32 s_CacheReserve = 16 * 1024 * 1024;\nstatic MemBuffer* s_CodeBuffer = NULL;\n\nstatic void ReleaseCodeBuffer()\n{\n\tdelete s_CodeBuffer;\n\ts_CodeBuffer = NULL;\n}\n\nstatic void InitializeCodeBuffer()\n{\n\tReleaseCodeBuffer();\n\n\ts_CodeBuffer = new MemBuffer(MemBuffer::kRead|MemBuffer::kWrite|MemBuffer::kExec,s_CacheReserveMin);\n\ts_CodeBuffer->Reserve(s_CacheReserve);\n\ts_CacheReserve = s_CodeBuffer->GetReservedSize();\n\n\tINFO(\"CodeBuffer : start=%#p, size1=%u, size2=%u\\n\", \n\t\ts_CodeBuffer->GetBasePtr(), s_CodeBuffer->GetCommittedSize(), s_CacheReserve);\n}\n\nstatic void ResetCodeBuffer()\n{\n\tu8* base = s_CodeBuffer->GetBasePtr();\n\tu32 size = s_CodeBuffer->GetUsedSize();\n\n\tPROGINFO(\"CodeBuffer : used=%u\\n\", size);\n\n\ts_CodeBuffer->Reset();\n\n\tFlushIcacheSection(base, base + size);\n}\n\nstatic u8* AllocCodeBuffer(size_t size)\n{\n\t//return s_CodeBuffer->Alloc(size);\n\tstatic const u32 align = 4 - 1;\n\n\tu32 size_new = size + align;\n\n\tuintptr_t ptr = (uintptr_t)s_CodeBuffer->Alloc(size_new);\n\tif (ptr == 0)\n\t\treturn NULL;\n\n\tuintptr_t retptr = (ptr + align) & ~align;\n\n\treturn (u8*)retptr;\n}\n\n////////////////////////////////////////////////////////////////////\nstatic MemBuffer* s_CMemBuffer = NULL;\nstatic char* s_CBufferBase = NULL;\nstatic char* s_CBuffer = NULL;\nstatic char* s_CBufferCur = NULL;\n\nstatic void ReleaseCBuffer()\n{\n\tdelete s_CMemBuffer;\n\n\ts_CMemBuffer = NULL;\n\ts_CBufferBase = NULL;\n\ts_CBuffer = NULL;\n\ts_CBufferCur = NULL;\n}\n\nstatic void InitializeCBuffer()\n{\n\tReleaseCBuffer();\n\n\tstatic const int Size = 1024 * 1024;\n\n\ts_CMemBuffer = new MemBuffer(MemBuffer::kRead|MemBuffer::kWrite,Size);\n\ts_CMemBuffer->Reserve();\n\ts_CBufferBase = (char*)s_CMemBuffer->Alloc(Size);\n\n\t{\n\t\tchar* szCodeBuffer = s_CBufferBase;\n\n\t\tWRITE_CODE(\"typedef unsigned char u8;\\n\");\n\t\tWRITE_CODE(\"typedef unsigned short u16;\\n\");\n\t\tWRITE_CODE(\"typedef unsigned int u32;\\n\");\n\t\tWRITE_CODE(\"typedef unsigned long long u64;\\n\");\n\t\tWRITE_CODE(\"typedef signed char s8;\\n\");\n\t\tWRITE_CODE(\"typedef signed short s16;\\n\");\n\t\tWRITE_CODE(\"typedef signed int s32;\\n\");\n\t\tWRITE_CODE(\"typedef signed long long s64;\\n\");\n\t\tWRITE_CODE(\"typedef int BOOL;\\n\");\n\n#ifdef __MINGW32__ \n\t\tWRITE_CODE(\"#define FASTCALL __attribute__((fastcall))\\n\");\n#elif defined (__i386__) && !defined(__clang__)\n\t\tWRITE_CODE(\"#define FASTCALL __attribute__((regparm(3)))\\n\");\n#elif defined(_MSC_VER) || defined(__INTEL_COMPILER)\n\t\t//WRITE_CODE(\"#define FASTCALL __fastcall\\n\");\n\t\tWRITE_CODE(\"#define FASTCALL __attribute__((fastcall))\\n\");\n#else\n\t\tWRITE_CODE(\"#define FASTCALL\\n\");\n#endif\n\n\t\tWRITE_CODE(\"#define BIT(n)  (1<<(n))\\n\");\n\t\tWRITE_CODE(\"#define BIT_N(i,n)  (((i)>>(n))&1)\\n\");\n\t\tWRITE_CODE(\"#define BIT0(i)     ((i)&1)\\n\");\n\t\t//WRITE_CODE(\"#define BIT1(i)     BIT_N((i),1)\\n\");\n\t\t//WRITE_CODE(\"#define BIT2(i)     BIT_N((i),2)\\n\");\n\t\t//WRITE_CODE(\"#define BIT3(i)     BIT_N((i),3)\\n\");\n\t\t//WRITE_CODE(\"#define BIT4(i)     BIT_N((i),4)\\n\");\n\t\t//WRITE_CODE(\"#define BIT5(i)     BIT_N((i),5)\\n\");\n\t\t//WRITE_CODE(\"#define BIT6(i)     BIT_N((i),6)\\n\");\n\t\t//WRITE_CODE(\"#define BIT7(i)     BIT_N((i),7)\\n\");\n\t\t//WRITE_CODE(\"#define BIT8(i)     BIT_N((i),8)\\n\");\n\t\t//WRITE_CODE(\"#define BIT9(i)     BIT_N((i),9)\\n\");\n\t\t//WRITE_CODE(\"#define BIT10(i)     BIT_N((i),10)\\n\");\n\t\t//WRITE_CODE(\"#define BIT11(i)     BIT_N((i),11)\\n\");\n\t\t//WRITE_CODE(\"#define BIT12(i)     BIT_N((i),12)\\n\");\n\t\t//WRITE_CODE(\"#define BIT13(i)     BIT_N((i),13)\\n\");\n\t\t//WRITE_CODE(\"#define BIT14(i)     BIT_N((i),14)\\n\");\n\t\t//WRITE_CODE(\"#define BIT15(i)     BIT_N((i),15)\\n\");\n\t\t//WRITE_CODE(\"#define BIT16(i)     BIT_N((i),16)\\n\");\n\t\t//WRITE_CODE(\"#define BIT17(i)     BIT_N((i),17)\\n\");\n\t\t//WRITE_CODE(\"#define BIT18(i)     BIT_N((i),18)\\n\");\n\t\t//WRITE_CODE(\"#define BIT19(i)     BIT_N((i),19)\\n\");\n\t\t//WRITE_CODE(\"#define BIT20(i)     BIT_N((i),20)\\n\");\n\t\t//WRITE_CODE(\"#define BIT21(i)     BIT_N((i),21)\\n\");\n\t\t//WRITE_CODE(\"#define BIT22(i)     BIT_N((i),22)\\n\");\n\t\t//WRITE_CODE(\"#define BIT23(i)     BIT_N((i),23)\\n\");\n\t\t//WRITE_CODE(\"#define BIT24(i)     BIT_N((i),24)\\n\");\n\t\t//WRITE_CODE(\"#define BIT25(i)     BIT_N((i),25)\\n\");\n\t\t//WRITE_CODE(\"#define BIT26(i)     BIT_N((i),26)\\n\");\n\t\t//WRITE_CODE(\"#define BIT27(i)     BIT_N((i),27)\\n\");\n\t\tWRITE_CODE(\"#define BIT28(i)     BIT_N((i),28)\\n\");\n\t\tWRITE_CODE(\"#define BIT29(i)     BIT_N((i),29)\\n\");\n\t\tWRITE_CODE(\"#define BIT30(i)     BIT_N((i),30)\\n\");\n\t\tWRITE_CODE(\"#define BIT31(i)    ((i)>>31)\\n\");\n\n\t\tWRITE_CODE(\"#define HWORD(i)   ((s32)(((s32)(i))>>16))\\n\");\n\t\tWRITE_CODE(\"#define LWORD(i)   (s32)(((s32)((i)<<16))>>16)\\n\");\n\n\t\tWRITE_CODE(\"#define NEG(i) ((i)>>31)\\n\");\n\t\tWRITE_CODE(\"#define POS(i) ((~(i))>>31)\\n\");\n\n#ifdef WORDS_BIGENDIAN\n\t\tWRITE_CODE(\"typedef union{\\n\");\n\t\tWRITE_CODE(\"\tstruct{\\n\");\n\t\tWRITE_CODE(\"\t\tu32 N : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tZ : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tC : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tV : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tQ : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tRAZ : 19,\\n\");\n\t\tWRITE_CODE(\"\t\tI : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tF : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tT : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tmode : 5;\\n\");\n\t\tWRITE_CODE(\"\t} bits;\\n\");\n\t\tWRITE_CODE(\"\tu32 val;\\n\");\n\t\tWRITE_CODE(\"} Status_Reg;\\n\");\n#else\n\t\tWRITE_CODE(\"typedef union{\\n\");\n\t\tWRITE_CODE(\"\tstruct{\\n\");\n\t\tWRITE_CODE(\"\t\tu32 mode : 5,\\n\");\n\t\tWRITE_CODE(\"\t\tT : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tF : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tI : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tRAZ : 19,\\n\");\n\t\tWRITE_CODE(\"\t\tQ : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tV : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tC : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tZ : 1,\\n\");\n\t\tWRITE_CODE(\"\t\tN : 1;\\n\");\n\t\tWRITE_CODE(\"\t} bits;\\n\");\n\t\tWRITE_CODE(\"\tu32 val;\\n\");\n\t\tWRITE_CODE(\"} Status_Reg;\\n\");\n#endif\n\n\t\tWRITE_CODE(\"#define REG_R(p)\t(*(u32*)(p))\\n\");\n\t\tWRITE_CODE(\"#define REG_SR(p)\t(*(s32*)(p))\\n\");\n\t\tWRITE_CODE(\"#define REG_R_C(p)\t((u32)(p))\\n\");\n\t\tWRITE_CODE(\"#define REG_SR_C(p)\t((s32)(p))\\n\");\n\t\tWRITE_CODE(\"#define REG_W(p)\t(*(u32*)(p))\\n\");\n\t\tWRITE_CODE(\"#define REG(p)\t\t(*(u32*)(p))\\n\");\n\t\tWRITE_CODE(\"#define REGPTR(p)\t((u32*)(p))\\n\");\n\n\t\tWRITE_CODE(\"static const u8* arm_cond_table = (const u8*)%#p;\\n\", arm_cond_table);\n\n\t\tWRITE_CODE(\"#define TEST_COND(cond,inst,CPSR) ((arm_cond_table[((CPSR>>24)&0xf0)|(cond)]) & (1<<(inst)))\\n\");\n\n#if 0\n\t\tWRITE_CODE(\"inline u32 ROR(u32 i, u32 j)\\n\");\n\t\tWRITE_CODE(\"{return ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j))));}\\n\");\n\n\t\t//WRITE_CODE(\"inline u32 UNSIGNED_OVERFLOW(u32 a,u32 b,u32 c)\\n\");\n\t\t//WRITE_CODE(\"{return BIT31(((a)&(b)) | (((a)|(b))&(~c)));}\\n\");\n\n\t\t//WRITE_CODE(\"inline u32 UNSIGNED_UNDERFLOW(u32 a,u32 b,u32 c)\\n\");\n\t\t//WRITE_CODE(\"{return BIT31(((~a)&(b)) | (((~a)|(b))&(c)));}\\n\");\n\n\t\tWRITE_CODE(\"inline u32 SIGNED_OVERFLOW(u32 a,u32 b,u32 c)\\n\");\n\t\tWRITE_CODE(\"{return BIT31(((a)&(b)&(~c)) | ((~a)&(~(b))&(c)));}\\n\");\n\n\t\tWRITE_CODE(\"inline u32 SIGNED_UNDERFLOW(u32 a,u32 b,u32 c)\\n\");\n\t\tWRITE_CODE(\"{return BIT31(((a)&(~(b))&(~c)) | ((~a)&(b)&(c)));}\\n\");\n\n\t\tWRITE_CODE(\"inline BOOL CarryFrom(s32 left, s32 right)\\n\");\n\t\tWRITE_CODE(\"{u32 res  = (0xFFFFFFFFU - (u32)left);\\n\");\n\t\tWRITE_CODE(\"return ((u32)right > res);}\\n\");\n\n\t\tWRITE_CODE(\"inline BOOL BorrowFrom(s32 left, s32 right)\\n\");\n\t\tWRITE_CODE(\"{return ((u32)right > (u32)left);}\\n\");\n\n\t\tWRITE_CODE(\"inline BOOL OverflowFromADD(s32 alu_out, s32 left, s32 right)\\n\");\n\t\tWRITE_CODE(\"{return ((left >= 0 && right >= 0) || (left < 0 && right < 0))\\n\");\n\t\tWRITE_CODE(\"&& ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));}\\n\");\n\n\t\tWRITE_CODE(\"inline BOOL OverflowFromSUB(s32 alu_out, s32 left, s32 right)\\n\");\n\t\tWRITE_CODE(\"{return ((left < 0 && right >= 0) || (left >= 0 && right < 0))\\n\");\n\t\tWRITE_CODE(\"&& ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));}\\n\");\n#else\n\t\tWRITE_CODE(\"#define ROR(i, j) ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j))))\\n\");\n\n\t\t//WRITE_CODE(\"#define UNSIGNED_OVERFLOW(a,b,c) BIT31(((a)&(b)) | (((a)|(b))&(~c)))\\n\");\n\n\t\t//WRITE_CODE(\"#define UNSIGNED_UNDERFLOW(a,b,c) BIT31(((~a)&(b)) | (((~a)|(b))&(c)))\\n\");\n\n\t\tWRITE_CODE(\"#define SIGNED_OVERFLOW(a,b,c) BIT31(((a)&(b)&(~c)) | ((~a)&(~(b))&(c)))\\n\");\n\n\t\tWRITE_CODE(\"#define SIGNED_UNDERFLOW(a,b,c) BIT31(((a)&(~(b))&(~c)) | ((~a)&(b)&(c)))\\n\");\n\n\t\tWRITE_CODE(\"#define CarryFrom(left, right) ((u32)(right) > (0xFFFFFFFFU - (u32)(left)))\\n\");\n\n\t\tWRITE_CODE(\"#define BorrowFrom(left, right) ((u32)(right) > (u32)(left))\\n\");\n\n\t\t//WRITE_CODE(\"#define OverflowFromADD(alu_out, left, right) \");\n\t\t//WRITE_CODE(\"(((s32)(left) >= 0 && (s32)(right) >= 0) || ((s32)(left) < 0 && (s32)(right) < 0))\");\n\t\t//WRITE_CODE(\"&& (((s32)(left) < 0 && (s32)(alu_out) >= 0) || ((s32)(left) >= 0 && (s32)(alu_out) < 0))\\n\");\n\n\t\t//WRITE_CODE(\"#define OverflowFromSUB(alu_out, left, right) \");\n\t\t//WRITE_CODE(\"(((s32)(left) < 0 && (s32)(right) >= 0) || ((s32)(left) >= 0 && (s32)(right) < 0))\");\n\t\t//WRITE_CODE(\"&& (((s32)(left) < 0 && (s32)(alu_out) >= 0) || ((s32)(left) >= 0 && (s32)(alu_out) < 0))\\n\");\n\n\t\tWRITE_CODE(\"#define OverflowFromADD(alu_out, left, right) ((NEG(left) & NEG(right) & POS(alu_out)) | (POS(left) & POS(right) & NEG(alu_out)))\\n\");\n\n\t\tWRITE_CODE(\"#define OverflowFromSUB(alu_out, left, right) ((NEG(left) & POS(right) & POS(alu_out)) | (POS(left) & NEG(right) & NEG(alu_out)))\\n\");\n#endif\n\n\t\ts_CBuffer = szCodeBuffer;\n\t}\n\n\ts_CBufferCur = s_CBuffer;\n}\n\nstatic void ResetCBuffer()\n{\n\ts_CBufferCur = s_CBuffer;\n}\n\n////////////////////////////////////////////////////////////////////\nstruct CompiledAddress\n{\n\tu32 Address;\n\tu32 ProcessID;\n};\n\nstatic const u32 s_MaxCompiledAddress = 16;\nstatic CompiledAddress s_CompiledAddress[s_MaxCompiledAddress] = {0};\nstatic u32 s_CurCompiledAddress = 0;\n\nstatic void TccErrOutput(void *opaque, const char *msg)\n{\n\tINFO(\"%s\\n\", msg);\n}\n\nstatic bool TccGenerateNativeCode()\n{\n\tbool ret = false;\n\tint size;\n\tu8* ptr;\n\tchar szFunName[64];\n\n\tTCCState *s = tcc_new();\n\n\t//tcc_set_output_type(s, TCC_OUTPUT_MEMORY);\n\t//tcc_set_options(s, \"-Werror\");\n\ttcc_set_error_func(s, NULL, TccErrOutput);\n\ttcc_set_options(s, \"-nostdlib\");\n\n\tif (tcc_compile_string(s, s_CBufferBase) == -1)\n\t{\n\t\tINFO(\"%s\\n\", s_CBufferBase);\n\t\tgoto cleanup;\n\t}\n\n\tsize = tcc_relocate(s, NULL);\n\tif (size == -1)\n\t\tgoto cleanup;\n\n\tptr = AllocCodeBuffer(size);\n\tif (!ptr)\n\t{\n\t\tINFO(\"JIT: cache full, reset cpu.\\n\");\n\n\t\tarm_cjit.Reset();\n\n\t\tptr = AllocCodeBuffer(size);\n\t\tif (!ptr)\n\t\t{\n\t\t\tINFO(\"JIT: alloc code buffer failed, size : %u.\\n\", size);\n\t\t\tgoto cleanup;\n\t\t}\n\t}\n\t\t\n\tif (tcc_relocate(s, ptr) == -1)\n\t\tgoto cleanup;\n\n\tret = true;\n\n\tFlushIcacheSection(ptr, ptr + size);\n\n\tfor (u32 i = 0; i < s_CurCompiledAddress; i++)\n\t{\n\t\tsprintf(szFunName, \"ArmOp_%u_%u\", s_CompiledAddress[i].Address, s_CompiledAddress[i].ProcessID);\n\t\tuintptr_t opfun = (uintptr_t)tcc_get_symbol(s, szFunName);\n\t\tJITLUT_HANDLE(s_CompiledAddress[i].Address, s_CompiledAddress[i].ProcessID) = opfun;\n\t}\n\ncleanup:\n\ttcc_delete(s);\n\n\tmemset(s_CompiledAddress, 0, sizeof(s_CompiledAddress));\n\ts_CurCompiledAddress = 0;\n\n\tResetCBuffer();\n\n\treturn ret;\n}\n\nstatic bool IsAddressCompiled(u32 Address, u32 ProcessID)\n{\n\t//is address already compiled\n\tfor (u32 i = 0; i < s_CurCompiledAddress; i++)\n\t{\n\t\tif (s_CompiledAddress[i].Address == Address && \n\t\t\ts_CompiledAddress[i].ProcessID == ProcessID)\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nstatic bool TccCompileCCode(const BlockInfo &blockinfo)\n{\n\ts_CompiledAddress[s_CurCompiledAddress].Address = blockinfo.Instructions[0].Address;\n\ts_CompiledAddress[s_CurCompiledAddress].ProcessID = blockinfo.Instructions[0].ProcessID;\n\ts_CurCompiledAddress++;\n\n\tif (s_CurCompiledAddress >= s_MaxCompiledAddress)\n\t\treturn TccGenerateNativeCode();\n\n\treturn true;\n}\n\nstatic void ResetTcc()\n{\n\tResetCBuffer();\n\n\tmemset(s_CompiledAddress, 0, sizeof(s_CompiledAddress));\n\ts_CurCompiledAddress = 0;\n}\n\n////////////////////////////////////////////////////////////////////\nstatic ArmAnalyze *s_pArmAnalyze = NULL;\n\nTEMPLATE static u32 armcpu_compileblock(BlockInfo &blockinfo, bool runblock)\n{\n\tu32 Cycles = 0;\n\n\tDecoded *Instructions = blockinfo.Instructions;\n\ts32 InstructionsNum = blockinfo.InstructionsNum;\n\n\tu32 adr = Instructions[0].Address;\n\n\t//find a better way\n\tif (IsAddressCompiled(adr, PROCNUM))\n\t{\n\t\tTccGenerateNativeCode();\n\t\treturn 0;\n\t}\n\n\tchar* szCodeBuffer = s_CBufferCur;\n\n\tWRITE_CODE(\"u32 ArmOp_%u_%u(){\\n\", adr, PROCNUM);\n\tWRITE_CODE(\"u32 ExecuteCycles=0;\\n\");\n\t\n\tu32 CurSubBlock = INVALID_SUBBLOCK;\n\tu32 CurInstructions = 0;\n\tu32 ConstCycles = 0;\n\tbool IsSubBlockStart = false;\n\n\tfor (s32 i = 0; i < InstructionsNum; i++)\n\t{\n\t\tDecoded &Inst = Instructions[i];\n\n\t\tif (CurSubBlock != Inst.SubBlock)\n\t\t{\n\t\t\tif (ConstCycles > 0)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"ExecuteCycles+=%u;\\n\", ConstCycles);\n\t\t\t\tConstCycles = 0;\n\t\t\t}\n\n\t\t\tif (IsSubBlockStart)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"}\\n\");\n\t\t\t\tWRITE_CODE(\"else ExecuteCycles+=%u;\\n\", CurInstructions);\n\t\t\t\tIsSubBlockStart = false;\n\t\t\t}\n\n\t\t\tif (Inst.Cond != 0xE && Inst.Cond != 0xF)\n\t\t\t{\n\t\t\t\tWRITE_CODE(\"if(TEST_COND(%u,0,(*(u32*)%#p))){\\n\", Inst.Cond, &GETCPU.CPSR.val);\n\t\t\t\tIsSubBlockStart = true;\n\t\t\t}\n\n\t\t\tCurInstructions = 0;\n\n\t\t\tCurSubBlock = Inst.SubBlock;\n\t\t}\n\n\t\tCurInstructions++;\n\n\t\tif (!Inst.VariableCycles)\n\t\t\tConstCycles += Inst.ExecuteCycles;\n\n\t\tWRITE_CODE(\"{\\n\");\n\t\tif ((Inst.R15Modified || Inst.TbitModified) && (ConstCycles > 0))\n\t\t{\n\t\t\tWRITE_CODE(\"ExecuteCycles+=%u;\\n\", ConstCycles);\n\t\t\tConstCycles = 0;\n\t\t}\n\t\tif (Inst.ThumbFlag)\n\t\t{\n\t\t\tif ((Inst.IROp >= IR_LDM && Inst.IROp <= IR_STM))\n\t\t\t\tInterpreterFallback(Inst, szCodeBuffer);\n\t\t\telse\n\t\t\t\tiropcdecoder_set[Inst.IROp](Inst, szCodeBuffer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ((Inst.IROp >= IR_LDM && Inst.IROp <= IR_STM))\n\t\t\t\tInterpreterFallback(Inst, szCodeBuffer);\n\t\t\telse\n\t\t\t\tiropcdecoder_set[Inst.IROp](Inst, szCodeBuffer);\n\t\t}\n\t\tWRITE_CODE(\"}\\n\");\n\n\t\tif (runblock)\n\t\t\tCycles += s_OpDecode[PROCNUM][Inst.ThumbFlag](Inst);\n\t}\n\n\tif (ConstCycles > 0)\n\t{\n\t\tWRITE_CODE(\"ExecuteCycles+=%u;\\n\", ConstCycles);\n\t\tConstCycles = 0;\n\t}\n\n\tDecoded &LastIns = Instructions[InstructionsNum - 1];\n\tif (IsSubBlockStart)\n\t{\n\t\tWRITE_CODE(\"}\\n\");\n\t\tIsSubBlockStart = false;\n\t}\n\tWRITE_CODE(\"(*(u32*)%#p) = %u;\\n\", &(GETCPU.instruct_adr), LastIns.Address + (LastIns.ThumbFlag ? 2 : 4));\n\tWRITE_CODE(\"return ExecuteCycles;}\\n\");\n\n\ts_CBufferCur = szCodeBuffer;\n\n\tTccCompileCCode(blockinfo);\n\n\treturn Cycles;\n}\n\nTEMPLATE u32 armcpu_compileCJIT()\n{\n\tu32 adr = ARMPROC.instruct_adr;\n\tu32 Cycles = 0;\n\n\tif (!JITLUT_MAPPED(adr & 0x0FFFFFFF, PROCNUM))\n\t{\n\t\tINFO(\"JIT: use unmapped memory address %08X\\n\", adr);\n\t\texecute = false;\n\t\treturn 1;\n\t}\n\n\tif (!s_pArmAnalyze->Decode(GETCPUPTR) || !s_pArmAnalyze->CreateBlocks())\n\t{\n\t\tINFO(\"JIT: unknow error cpu[%d].\\n\", PROCNUM);\n\t\treturn 1;\n\t}\n\n\tBlockInfo *BlockInfos;\n\ts32 BlockInfoNum;\n\n\ts_pArmAnalyze->GetBlocks(BlockInfos, BlockInfoNum);\n\tfor (s32 BlockNum = 0; BlockNum < BlockInfoNum; BlockNum++)\n\t{\n\t\tCycles += armcpu_compileblock<PROCNUM>(BlockInfos[BlockNum], BlockNum == 0);\n\t}\n\n\treturn Cycles;\n}\n\nstatic void cpuReserve()\n{\n\tInitializeCBuffer();\n\tInitializeCodeBuffer();\n\n\ts_pArmAnalyze = new ArmAnalyze(CommonSettings.jit_max_block_size);\n\n\ts_pArmAnalyze->m_MergeSubBlocks = true;\n\ts_pArmAnalyze->m_OptimizeFlag = true;\n\ts_pArmAnalyze->m_JumpEndDecode = true;\n}\n\nstatic void cpuShutdown()\n{\n\tReleaseCBuffer();\n\tReleaseCodeBuffer();\n\n\tJitLutReset();\n\n\tdelete s_pArmAnalyze;\n\ts_pArmAnalyze = NULL;\n}\n\nstatic void cpuReset()\n{\n\tResetCodeBuffer();\n\tResetTcc();\n\n\tJitLutReset();\n}\n\nstatic void cpuSync()\n{\n\tarmcpu_sync();\n}\n\nTEMPLATE static void cpuClear(u32 Addr, u32 Size)\n{\n\tJITLUT_HANDLE(Addr, PROCNUM) = (uintptr_t)NULL;\n}\n\nstatic u32 cpuGetCacheReserve()\n{\n\treturn s_CacheReserve / 1024 /1024;\n}\n\nstatic void cpuSetCacheReserve(u32 reserveInMegs)\n{\n\ts_CacheReserve = reserveInMegs * 1024 * 1024;\n}\n\nstatic const char* cpuDescription()\n{\n\treturn \"Arm CJit\";\n}\n\nCpuBase arm_cjit =\n{\n\tcpuReserve,\n\n\tcpuShutdown,\n\n\tcpuReset,\n\n\tcpuSync,\n\n\tcpuClear<0>, cpuClear<1>,\n\n\tcpuExecuteCJIT<0>, cpuExecuteCJIT<1>,\n\n\tcpuGetCacheReserve,\n\tcpuSetCacheReserve,\n\n\tcpuDescription\n};\n\ntemplate u32 armcpu_compileCJIT<0>();\ntemplate u32 armcpu_compileCJIT<1>();\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmCJit.h",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n#ifndef ARM_CJIT\n#define ARM_CJIT\n\n#include \"common.h\"\n#include \"CpuBase.h\"\n#include \"JitCommon.h\"\n#include \"armcpu.h\"\n\ntypedef u32 (* ArmOpCompiled)();\n\ntemplate<unsigned int PROCNUM> u32 armcpu_compileCJIT();\n\ntemplate<unsigned int PROCNUM> u32 cpuExecuteCJIT()\n{\n\tArmOpCompiled opfun = (ArmOpCompiled)JITLUT_HANDLE(ARMPROC.instruct_adr, PROCNUM);\n\tif (opfun)\n\t\treturn opfun();\n\n\treturn armcpu_compileCJIT<PROCNUM>();\n}\n\nextern CpuBase arm_cjit;\n\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmLJit.cpp",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n#include <stddef.h>\n\n#include \"ArmLJit.h\"\n#include \"ArmAnalyze.h\"\n#include \"instructions.h\"\n#include \"Disassembler.h\"\n\n#include \"armcpu.h\"\n#include \"MMU.h\"\n#include \"MMU_timing.h\"\n#include \"JitCommon.h\"\n#include \"utils/MemBuffer.h\"\n#include \"utils/lightning/lightning.h\"\n\n#ifdef _MSC_VER\n#include <intrin.h>\n#endif\n\n#ifdef HAVE_JIT\n\n#define GETCPUPTR (&ARMPROC)\n#define GETCPU (ARMPROC)\n\n#define TEMPLATE template<u32 PROCNUM> \n#define OPDECODER_DECL(name) void FASTCALL name##_Decoder(const Decoded &d, RegisterMap &regMap)\n\ntypedef void (FASTCALL* IROpDecoder)(const Decoded &d, RegisterMap &regMap);\ntypedef u32 (* ArmOpCompiled)();\n\ntypedef u32 (* MemOp1)(u32, u32*);\ntypedef u32 (* MemOp2)(u32, u32);\ntypedef u32 (* MemOp3)(u32, u32, u32*);\ntypedef u32 (* MemOp4)(u32, u32*, u32);\n\n#define HWORD(i)   ((s32)(((s32)(i))>>16))\n#define LWORD(i)   (s32)(((s32)((i)<<16))>>16)\n\n#define DEBUG_BKPT\t_O(0xcc);\n\nnamespace ArmLJit\n{\n//------------------------------------------------------------\n//                         RegisterMap Imp\n//------------------------------------------------------------\n\tenum LocalRegType\n\t{\n\t\tLRT_R,\n\t\tLRT_V,\n\t};\n\n\tstatic jit_gpr_t LocalMap[JIT_V_NUM + JIT_R_NUM];\n\n\tFORCEINLINE u32 LOCALREG_INIT()\n\t{\n\t\tfor (u32 i = 0; i < JIT_V_NUM; i++)\n\t\t\tLocalMap[i] = JIT_V(i);\n\n\t\tfor (u32 i = 0; i < JIT_R_NUM; i++)\n\t\t\tLocalMap[i + JIT_V_NUM] = JIT_R(i);\n\n\t\treturn JIT_V_NUM + JIT_R_NUM;\n\t}\n\n\tFORCEINLINE jit_gpr_t LOCALREG(u32 i)\n\t{\n\t\treturn LocalMap[i];\n\t}\n\n\tFORCEINLINE LocalRegType LOCALREGTYPE(u32 i)\n\t{\n\t\tif (i < JIT_V_NUM)\n\t\t\treturn LRT_V;\n\n\t\treturn LRT_R;\n\t}\n\n\tFORCEINLINE RegisterMap::GuestRegId REGID(u32 i)\n\t{\n\t\treturn (RegisterMap::GuestRegId)(i);\n\t}\n\n\tclass RegisterMapImp : public RegisterMap\n\t{\n\t\tpublic:\n\t\t\tRegisterMapImp(u32 HostRegCount);\n\n\t\t\tvoid CallABI(void* funptr, \n\t\t\t\t\t\tconst std::vector<ABIOp> &args, \n\t\t\t\t\t\tconst std::vector<GuestRegId> &flushs, \n\t\t\t\t\t\tu32 hostreg_ret, \n\t\t\t\t\t\tImmData::Type type_ret);\n\n\t\tprotected:\n\t\t\tvoid StartBlock();\n\t\t\tvoid EndBlock();\n\n\t\t\tvoid StoreGuestReg(u32 hostreg, GuestRegId guestreg);\n\t\t\tvoid LoadGuestReg(u32 hostreg, GuestRegId guestreg);\n\n\t\t\tvoid StoreImm(GuestRegId guestreg, const ImmData &data);\n\t\t\tvoid LoadImm(u32 hostreg, const ImmData &data);\n\n\t\t\tbool IsPerdureHostReg(u32 hostreg);\n\n\t\tprivate:\n\t\t\tint m_StackExecyc;\n\t\t\tint m_StackTemp;\n\t};\n\n\tRegisterMapImp::RegisterMapImp(u32 HostRegCount)\n\t\t: RegisterMap(HostRegCount)\n\t{\n\t}\n\n\tvoid RegisterMapImp::CallABI(void* funptr, \n\t\t\t\t\t\t\t\tconst std::vector<ABIOp> &args, \n\t\t\t\t\t\t\t\tconst std::vector<GuestRegId> &flushs, \n\t\t\t\t\t\t\t\tu32 hostreg_ret, \n\t\t\t\t\t\t\t\tImmData::Type type_ret)\n\t{\n\t\tjit_prepare(args.size());\n\n\t\tfor (std::vector<ABIOp>::const_reverse_iterator itr = args.rbegin(); \n\t\t\titr != args.rend(); itr++)\n\t\t{\n\t\t\tconst ABIOp &Op = *itr;\n\n\t\t\tswitch (Op.type)\n\t\t\t{\n\t\t\tcase ABIOp::IMM:\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = AllocTempReg();\n\n\t\t\t\t\tswitch (Op.immdata.type)\n\t\t\t\t\t{\n\t\t\t\t\tcase ImmData::IMM8:\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(tmp), Op.immdata.imm8);\n\t\t\t\t\t\tjit_pusharg_uc(LOCALREG(tmp));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ImmData::IMM16:\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(tmp), Op.immdata.imm16);\n\t\t\t\t\t\tjit_pusharg_us(LOCALREG(tmp));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ImmData::IMM32:\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(tmp), Op.immdata.imm32);\n\t\t\t\t\t\tjit_pusharg_ui(LOCALREG(tmp));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ImmData::IMMPTR:\n\t\t\t\t\t\tjit_movi_p(LOCALREG(tmp), Op.immdata.immptr);\n\t\t\t\t\t\tjit_pusharg_p(LOCALREG(tmp));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ABIOp::GUSETREG:\n\t\t\t\t{\n\t\t\t\t\tu32 reg = MapReg(REGID(Op.regdata));\n\t\t\t\t\tLock(reg);\n\n\t\t\t\t\tjit_pusharg_ui(LOCALREG(reg));\n\n\t\t\t\t\tUnlock(reg);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ABIOp::HOSTREG:\n\t\t\t\tjit_pusharg_ui(LOCALREG(Op.regdata));\n\t\t\t\tbreak;\n\n\t\t\tcase ABIOp::TEMPREG:\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = Op.regdata;\n\n\t\t\t\t\tjit_pusharg_ui(LOCALREG(tmp));\n\t\t\t\t\tReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ABIOp::GUSETREGPTR:\n\t\t\t\t{\n\t\t\t\t\tu32 cpuptr = GetCpuPtrReg();\n\t\t\t\t\tu32 tmp = AllocTempReg();\n\n\t\t\t\t\tif (REGID(Op.regdata) >= R0 && REGID(Op.regdata) <= R15)\n\t\t\t\t\t\tjit_addi_p(LOCALREG(tmp), LOCALREG(cpuptr), jit_field(armcpu_t, R[Op.regdata]));\n\t\t\t\t\telse if (REGID(Op.regdata) == CPSR)\n\t\t\t\t\t\tjit_addi_p(LOCALREG(tmp), LOCALREG(cpuptr), jit_field(armcpu_t, CPSR));\n\t\t\t\t\telse if (REGID(Op.regdata) == SPSR)\n\t\t\t\t\t\tjit_addi_p(LOCALREG(tmp), LOCALREG(cpuptr), jit_field(armcpu_t, SPSR));\n\t\t\t\t\tjit_pusharg_p(LOCALREG(tmp));\n\n\t\t\t\t\tReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (size_t i = 0; i < flushs.size(); i++)\n\t\t{\n\t\t\tFlushGuestReg(flushs[i]);\n\t\t}\n\n\t\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t\t{\n\t\t\tif (m_State.HostRegs[i].alloced && \n\t\t\t\tm_State.HostRegs[i].guestreg != INVALID_REG_ID && \n\t\t\t\t!IsPerdureHostReg(i))\n\t\t\t\tFlushHostReg(i);\n\t\t}\n\n\t\tjit_finish(funptr);\n\n\t\tif (hostreg_ret != INVALID_REG_ID)\n\t\t{\n\t\t\tswitch (type_ret)\n\t\t\t{\n\t\t\tcase ImmData::IMM8:\n\t\t\t\tjit_retval_uc(LOCALREG(hostreg_ret));\n\t\t\t\tbreak;\n\t\t\tcase ImmData::IMM16:\n\t\t\t\tjit_retval_us(LOCALREG(hostreg_ret));\n\t\t\t\tbreak;\n\t\t\tcase ImmData::IMM32:\n\t\t\t\tjit_retval_ui(LOCALREG(hostreg_ret));\n\t\t\t\tbreak;\n\t\t\tcase ImmData::IMMPTR:\n\t\t\t\tjit_retval_p(LOCALREG(hostreg_ret));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tm_Profile.CallABICount++;\n\t}\n\n\tvoid RegisterMapImp::StartBlock()\n\t{\n\t\tjit_prolog(0);\n\n\t\tm_StackExecyc = jit_allocai(sizeof(u32));\n\t\tm_StackTemp = jit_allocai(sizeof(u32));\n\n\t\tSetImm32(EXECUTECYCLES, 0);\n\n\t\tjit_movi_p(LOCALREG(GetCpuPtrReg()), m_Cpu);\n\t}\n\n\tvoid RegisterMapImp::EndBlock()\n\t{\n\t\tif (IsImm(EXECUTECYCLES))\n\t\t{\n\t\t\tjit_movi_ui(JIT_RET, GetImm32(EXECUTECYCLES));\n\t\t\tjit_ret();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 execyc = MapReg(EXECUTECYCLES);\n\t\t\tLock(execyc);\n\n\t\t\tjit_movr_ui(JIT_RET, LOCALREG(execyc));\n\t\t\tjit_ret();\n\n\t\t\tUnlock(execyc);\n\t\t}\n\t}\n\n\tvoid RegisterMapImp::StoreGuestReg(u32 hostreg, GuestRegId guestreg)\n\t{\n\t\tif (guestreg >= R0 && guestreg <= SPSR)\n\t\t{\n\t\t\tu32 cpuptr = GetCpuPtrReg();\n\n\t\t\tif (guestreg >= R0 && guestreg <= R15)\n\t\t\t\tjit_stxi_ui(jit_field(armcpu_t, R[guestreg]), LOCALREG(cpuptr), LOCALREG(hostreg));\n\t\t\telse if (guestreg == CPSR)\n\t\t\t\tjit_stxi_ui(jit_field(armcpu_t, CPSR), LOCALREG(cpuptr), LOCALREG(hostreg));\n\t\t\telse if (guestreg == SPSR)\n\t\t\t\tjit_stxi_ui(jit_field(armcpu_t, SPSR), LOCALREG(cpuptr), LOCALREG(hostreg));\n\t\t}\n\t\telse if (guestreg == EXECUTECYCLES)\n\t\t{\n\t\t\tjit_stxi_ui(m_StackExecyc, JIT_FP, LOCALREG(hostreg));\n\t\t}\n\n\t\tm_Profile.StoreRegCount++;\n\t}\n\n\tvoid RegisterMapImp::LoadGuestReg(u32 hostreg, GuestRegId guestreg)\n\t{\n\t\tif (guestreg >= R0 && guestreg <= SPSR)\n\t\t{\n\t\t\tLock(hostreg);\n\n\t\t\tu32 cpuptr = GetCpuPtrReg();\n\n\t\t\tif (guestreg >= R0 && guestreg <= R15)\n\t\t\t\tjit_ldxi_ui(LOCALREG(hostreg), LOCALREG(cpuptr), jit_field(armcpu_t, R[guestreg]));\n\t\t\telse if (guestreg == CPSR)\n\t\t\t\tjit_ldxi_ui(LOCALREG(hostreg), LOCALREG(cpuptr), jit_field(armcpu_t, CPSR));\n\t\t\telse if (guestreg == SPSR)\n\t\t\t\tjit_ldxi_ui(LOCALREG(hostreg), LOCALREG(cpuptr), jit_field(armcpu_t, SPSR));\n\n\t\t\tUnlock(hostreg);\n\t\t}\n\t\telse if (guestreg == EXECUTECYCLES)\n\t\t{\n\t\t\tjit_ldxi_ui(LOCALREG(hostreg), JIT_FP, m_StackExecyc);\n\t\t}\n\n\t\tm_Profile.LoadRegCount++;\n\t}\n\n\tvoid RegisterMapImp::StoreImm(GuestRegId guestreg, const ImmData &data)\n\t{\n\t\tu32 regmode = 0; //0:freereg 1:tempreg 2:backupreg\n\t\tu32 tmp = FindFreeHostReg();\n\n\t\tif (tmp == INVALID_REG_ID)\n\t\t{\n\t\t\tif (!m_IsInMerge)\n\t\t\t{\n\t\t\t\ttmp = AllocTempReg();\n\n\t\t\t\tregmode = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmp = FindFirstHostReg();\n\n\t\t\t\tjit_stxi_ui(m_StackTemp, JIT_FP, LOCALREG(tmp));\n\n\t\t\t\tregmode = 2;\n\n\t\t\t\tm_Profile.BackupRegCount++;\n\t\t\t}\n\t\t}\n\n\t\tswitch (data.type)\n\t\t{\n\t\tcase ImmData::IMM8:\n\t\t\tjit_movi_ui(LOCALREG(tmp), data.imm8);\n\t\t\tbreak;\n\t\tcase ImmData::IMM16:\n\t\t\tjit_movi_ui(LOCALREG(tmp), data.imm16);\n\t\t\tbreak;\n\t\tcase ImmData::IMM32:\n\t\t\tjit_movi_ui(LOCALREG(tmp), data.imm32);\n\t\t\tbreak;\n\t\tcase ImmData::IMMPTR:\n\t\t\tjit_movi_p(LOCALREG(tmp), data.immptr);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tStoreGuestReg(tmp, guestreg);\n\n\t\tif (regmode == 1)\n\t\t\tReleaseTempReg(tmp);\n\t\telse if (regmode == 2)\n\t\t\tjit_ldxi_ui(LOCALREG(tmp), JIT_FP, m_StackTemp);\n\t}\n\n\tvoid RegisterMapImp::LoadImm(u32 hostreg, const ImmData &data)\n\t{\n\t\tswitch (data.type)\n\t\t{\n\t\tcase ImmData::IMM8:\n\t\t\tjit_movi_ui(LOCALREG(hostreg), data.imm8);\n\t\t\tbreak;\n\t\tcase ImmData::IMM16:\n\t\t\tjit_movi_ui(LOCALREG(hostreg), data.imm16);\n\t\t\tbreak;\n\t\tcase ImmData::IMM32:\n\t\t\tjit_movi_ui(LOCALREG(hostreg), data.imm32);\n\t\t\tbreak;\n\t\tcase ImmData::IMMPTR:\n\t\t\tjit_movi_p(LOCALREG(hostreg), data.immptr);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tbool RegisterMapImp::IsPerdureHostReg(u32 hostreg)\n\t{\n\t\treturn LOCALREGTYPE(hostreg) == LRT_V;\n\t}\n\n//------------------------------------------------------------\n//                         Memory function\n//------------------------------------------------------------\n\tenum {\n\t\tMEMTYPE_GENERIC = 0,\t// no assumptions\n\t\tMEMTYPE_MAIN = 1,\t\t// arm9:r/w arm7:r/w\n\t\tMEMTYPE_DTCM_ARM9 = 2,\t// arm9:r/w\n\t\tMEMTYPE_ERAM_ARM7 = 3,\t// arm7:r/w\n\t\tMEMTYPE_SWIRAM = 4,\t\t// arm9:r/w arm7:r/w\n\n\t\tMEMTYPE_COUNT,\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_LDR(u32 adr, u32 *dstreg)\n\t{\n\t\tu32 data = READ32(cpu->mem_if->data, adr);\n\t\tif(adr&3)\n\t\t\tdata = ROR(data, 8*(adr&3));\n\t\t*dstreg = data;\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3,adr);\n\t}\n\n\tstatic const MemOp1 LDR_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDR<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_GENERIC>,//MEMOP_LDR<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDR<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDR<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_GENERIC>,//MEMOP_LDR<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDR<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_LDRB(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = READ8(cpu->mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n\t}\n\n\tstatic const MemOp1 LDRB_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRB<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_GENERIC>,//MEMOP_LDRB<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRB<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRB<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_GENERIC>,//MEMOP_LDRB<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRB<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_LDRH(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = READ16(cpu->mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n\t}\n\n\tstatic const MemOp1 LDRH_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRH<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_GENERIC>,//MEMOP_LDRH<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRH<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRH<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_GENERIC>,//MEMOP_LDRH<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRH<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_LDRSH(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = (s16)READ16(cpu->mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n\t}\n\n\tstatic const MemOp1 LDRSH_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_GENERIC>,//MEMOP_LDRSH<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRSH<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_GENERIC>,//MEMOP_LDRSH<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRSH<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_LDRSB(u32 adr, u32 *dstreg)\n\t{\n\t\t*dstreg = (s8)READ8(cpu->mem_if->data, adr);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n\t}\n\n\tstatic const MemOp1 LDRSB_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_GENERIC>,//MEMOP_LDRSB<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRSB<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_GENERIC>,//MEMOP_LDRSB<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_LDRSB<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_STRB(u32 adr, u32 data)\n\t{\n\t\tWRITE8(cpu->mem_if->data, adr, data);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n\t}\n\n\tstatic const MemOp2 STRB_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STRB<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_GENERIC>,//MEMOP_STRB<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_STRB<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STRB<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_GENERIC>,//MEMOP_STRB<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_STRB<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_STR(u32 adr, u32 data)\n\t{\n\t\tWRITE32(cpu->mem_if->data, adr, data);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n\t}\n\n\tstatic const MemOp2 STR_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STR<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_STR<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_STR<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_STR<0,MEMTYPE_GENERIC>,//MEMOP_STR<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_STR<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STR<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_STR<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_STR<1,MEMTYPE_GENERIC>,//MEMOP_STR<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_STR<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_STR<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n\n\ttemplate<u32 PROCNUM, u32 memtype>\n\tstatic u32 MEMOP_STRH(u32 adr, u32 data)\n\t{\n\t\tWRITE16(cpu->mem_if->data, adr, data);\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n\t}\n\n\tstatic const MemOp2 STRH_Tab[2][MEMTYPE_COUNT] = \n\t{\n\t\t{\n\t\t\tMEMOP_STRH<0,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_MAIN>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_GENERIC>,//MEMOP_STRH<0,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_STRH<0,MEMTYPE_SWIRAM>,\n\t\t},\n\t\t{\n\t\t\tMEMOP_STRH<1,MEMTYPE_GENERIC>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_MAIN>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_GENERIC>,//MEMOP_STRH<1,MEMTYPE_DTCM_ARM9>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_ERAM_ARM7>,\n\t\t\tMEMOP_STRH<1,MEMTYPE_SWIRAM>,\n\t\t}\n\t};\n//------------------------------------------------------------\n//                         Help function\n//------------------------------------------------------------\n#ifdef WORDS_BIGENDIAN\n\tstatic const u32 PSR_MODE_BITSHIFT = 27;\n\tstatic const u32 PSR_MODE_BITMASK = 0xF8000000;\n\tstatic const u32 PSR_T_BITSHIFT = 26;\n\tstatic const u32 PSR_T_BITMASK = 1 << PSR_T_BITSHIFT;\n\tstatic const u32 PSR_F_BITSHIFT = 25;\n\tstatic const u32 PSR_F_BITMASK = 1 << PSR_F_BITSHIFT;\n\tstatic const u32 PSR_I_BITSHIFT = 24;\n\tstatic const u32 PSR_I_BITMASK = 1 << PSR_I_BITSHIFT;\n\tstatic const u32 PSR_Q_BITSHIFT = 4;\n\tstatic const u32 PSR_Q_BITMASK = 1 << PSR_Q_BITSHIFT;\n\tstatic const u32 PSR_V_BITSHIFT = 3;\n\tstatic const u32 PSR_V_BITMASK = 1 << PSR_V_BITSHIFT;\n\tstatic const u32 PSR_C_BITSHIFT = 2;\n\tstatic const u32 PSR_C_BITMASK = 1 << PSR_C_BITSHIFT;\n\tstatic const u32 PSR_Z_BITSHIFT = 1;\n\tstatic const u32 PSR_Z_BITMASK = 1 << PSR_Z_BITSHIFT;\n\tstatic const u32 PSR_N_BITSHIFT = 0;\n\tstatic const u32 PSR_N_BITMASK = 1 << PSR_N_BITSHIFT;\n#else\n\tstatic const u32 PSR_MODE_BITSHIFT = 0;\n\tstatic const u32 PSR_MODE_BITMASK = 31;\n\tstatic const u32 PSR_T_BITSHIFT = 5;\n\tstatic const u32 PSR_T_BITMASK = 1 << PSR_T_BITSHIFT;\n\tstatic const u32 PSR_F_BITSHIFT = 6;\n\tstatic const u32 PSR_F_BITMASK = 1 << PSR_F_BITSHIFT;\n\tstatic const u32 PSR_I_BITSHIFT = 7;\n\tstatic const u32 PSR_I_BITMASK = 1 << PSR_I_BITSHIFT;\n\tstatic const u32 PSR_Q_BITSHIFT = 27;\n\tstatic const u32 PSR_Q_BITMASK = 1 << PSR_Q_BITSHIFT;\n\tstatic const u32 PSR_V_BITSHIFT = 28;\n\tstatic const u32 PSR_V_BITMASK = 1 << PSR_V_BITSHIFT;\n\tstatic const u32 PSR_C_BITSHIFT = 29;\n\tstatic const u32 PSR_C_BITMASK = 1 << PSR_C_BITSHIFT;\n\tstatic const u32 PSR_Z_BITSHIFT = 30;\n\tstatic const u32 PSR_Z_BITMASK = 1 << PSR_Z_BITSHIFT;\n\tstatic const u32 PSR_N_BITSHIFT = 31;\n\tstatic const u32 PSR_N_BITMASK = 1 << PSR_N_BITSHIFT;\n#endif\n\n\tenum ARMCPU_PSR\n\t{\n\t\tPSR_MODE,\n\t\tPSR_T,\n\t\tPSR_F,\n\t\tPSR_I,\n\t\tPSR_Q,\n\t\tPSR_V,\n\t\tPSR_C,\n\t\tPSR_Z,\n\t\tPSR_N,\n\t};\n\n\tvoid FASTCALL UnpackPSR(ARMCPU_PSR flg, u32 in, u32 out)\n\t{\n\t\tu32 shift, mask;\n\n\t\tswitch (flg)\n\t\t{\n\t\tcase PSR_MODE:\n\t\t\tshift = PSR_MODE_BITSHIFT;\n\t\t\tmask = PSR_MODE_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_T:\n\t\t\tshift = PSR_T_BITSHIFT;\n\t\t\tmask = PSR_T_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_F:\n\t\t\tshift = PSR_F_BITSHIFT;\n\t\t\tmask = PSR_F_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_I:\n\t\t\tshift = PSR_I_BITSHIFT;\n\t\t\tmask = PSR_I_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_Q:\n\t\t\tshift = PSR_Q_BITSHIFT;\n\t\t\tmask = PSR_Q_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_V:\n\t\t\tshift = PSR_V_BITSHIFT;\n\t\t\tmask = PSR_V_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_C:\n\t\t\tshift = PSR_C_BITSHIFT;\n\t\t\tmask = PSR_C_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_Z:\n\t\t\tshift = PSR_Z_BITSHIFT;\n\t\t\tmask = PSR_Z_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_N:\n\t\t\tshift = PSR_N_BITSHIFT;\n\t\t\tmask = PSR_N_BITMASK;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tshift = 0;\n\t\t\tmask = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (mask == (1 << 31) && shift == 31)\n\t\t\tjit_rshi_ui(LOCALREG(out), LOCALREG(in), shift);\n\t\telse\n\t\t{\n\t\t\tjit_andi_ui(LOCALREG(out), LOCALREG(in), mask);\n\t\t\tif (shift != 0)\n\t\t\t\tjit_rshi_ui(LOCALREG(out), LOCALREG(out), shift);\n\t\t}\n\t}\n\n\tvoid FASTCALL UnpackCPSR(RegisterMap &regMap, ARMCPU_PSR flg, u32 out)\n\t{\n\t\tu32 cpsr = regMap.MapReg(RegisterMap::CPSR);\n\t\tregMap.Lock(cpsr);\n\n\t\tUnpackPSR(flg, cpsr, out);\n\n\t\tregMap.Unlock(cpsr);\n\t}\n\n\tvoid FASTCALL PackCPSR(RegisterMap &regMap, ARMCPU_PSR flg, u32 in)\n\t{\n\t\tu32 shift, mask;\n\n\t\tswitch (flg)\n\t\t{\n\t\tcase PSR_MODE:\n\t\t\tshift = PSR_MODE_BITSHIFT;\n\t\t\tmask = PSR_MODE_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_T:\n\t\t\tshift = PSR_T_BITSHIFT;\n\t\t\tmask = PSR_T_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_F:\n\t\t\tshift = PSR_F_BITSHIFT;\n\t\t\tmask = PSR_F_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_I:\n\t\t\tshift = PSR_I_BITSHIFT;\n\t\t\tmask = PSR_I_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_Q:\n\t\t\tshift = PSR_Q_BITSHIFT;\n\t\t\tmask = PSR_Q_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_V:\n\t\t\tshift = PSR_V_BITSHIFT;\n\t\t\tmask = PSR_V_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_C:\n\t\t\tshift = PSR_C_BITSHIFT;\n\t\t\tmask = PSR_C_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_Z:\n\t\t\tshift = PSR_Z_BITSHIFT;\n\t\t\tmask = PSR_Z_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_N:\n\t\t\tshift = PSR_N_BITSHIFT;\n\t\t\tmask = PSR_N_BITMASK;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tshift = 0;\n\t\t\tmask = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tu32 cpsr = regMap.MapReg(RegisterMap::CPSR, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(cpsr);\n\n\t\tjit_andi_ui(LOCALREG(cpsr), LOCALREG(cpsr), ~mask);\n\t\tif (shift == 0)\n\t\t\tjit_orr_ui(LOCALREG(cpsr), LOCALREG(cpsr), LOCALREG(in));\n\t\telse\n\t\t{\n\t\t\tjit_lshi_ui(LOCALREG(in), LOCALREG(in), shift);\n\t\t\tjit_orr_ui(LOCALREG(cpsr), LOCALREG(cpsr), LOCALREG(in));\n\t\t}\n\n\t\tregMap.Unlock(cpsr);\n\t}\n\n\tvoid FASTCALL PackCPSRImm(RegisterMap &regMap, ARMCPU_PSR flg, u32 in)\n\t{\n\t\tu32 shift, mask;\n\n\t\tswitch (flg)\n\t\t{\n\t\tcase PSR_MODE:\n\t\t\tshift = PSR_MODE_BITSHIFT;\n\t\t\tmask = PSR_MODE_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_T:\n\t\t\tshift = PSR_T_BITSHIFT;\n\t\t\tmask = PSR_T_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_F:\n\t\t\tshift = PSR_F_BITSHIFT;\n\t\t\tmask = PSR_F_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_I:\n\t\t\tshift = PSR_I_BITSHIFT;\n\t\t\tmask = PSR_I_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_Q:\n\t\t\tshift = PSR_Q_BITSHIFT;\n\t\t\tmask = PSR_Q_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_V:\n\t\t\tshift = PSR_V_BITSHIFT;\n\t\t\tmask = PSR_V_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_C:\n\t\t\tshift = PSR_C_BITSHIFT;\n\t\t\tmask = PSR_C_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_Z:\n\t\t\tshift = PSR_Z_BITSHIFT;\n\t\t\tmask = PSR_Z_BITMASK;\n\t\t\tbreak;\n\t\tcase PSR_N:\n\t\t\tshift = PSR_N_BITSHIFT;\n\t\t\tmask = PSR_N_BITMASK;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tshift = 0;\n\t\t\tmask = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (flg != PSR_MODE)\n\t\t\tin = !!in;\n\n\t\tu32 cpsr = regMap.MapReg(RegisterMap::CPSR, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(cpsr);\n\n\t\tif (in)\n\t\t\tjit_ori_ui(LOCALREG(cpsr), LOCALREG(cpsr), in << shift);\n\t\telse\n\t\t\tjit_andi_ui(LOCALREG(cpsr), LOCALREG(cpsr), ~mask);\n\n\t\tregMap.Unlock(cpsr);\n\t}\n\n\tstruct ShiftOut\n\t{\n\t\tu32 shiftop;\n\t\tu32 cflg;\n\t\tbool shiftopimm;\n\t\tbool cflgimm;\n\n\t\tShiftOut()\n\t\t\t: shiftop(INVALID_REG_ID)\n\t\t\t, cflg(INVALID_REG_ID)\n\t\t\t, shiftopimm(false)\n\t\t\t, cflgimm(false)\n\t\t{\n\t\t}\n\n\t\tvoid CleanShiftOp(RegisterMap &regMap)\n\t\t{\n\t\t\tif (!shiftopimm && shiftop != INVALID_REG_ID)\n\t\t\t\tregMap.ReleaseTempReg(shiftop);\n\t\t}\n\n\t\tvoid CleanCflg(RegisterMap &regMap)\n\t\t{\n\t\t\tif (!cflgimm && cflg != INVALID_REG_ID)\n\t\t\t\tregMap.ReleaseTempReg(cflg);\n\t\t}\n\n\t\tvoid Clean(RegisterMap &regMap)\n\t\t{\n\t\t\tCleanShiftOp(regMap);\n\t\t\tCleanCflg(regMap);\n\t\t}\n\t};\n\n\tShiftOut FASTCALL IRShiftOpGenerate(const Decoded &d, RegisterMap &regMap, bool clacCarry)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tShiftOut Out;\n\n\t\tswitch (d.Typ)\n\t\t{\n\t\tcase IRSHIFT_LSL:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\tUnpackCPSR(regMap, PSR_C, Out.cflg);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = BIT_N(regMap.GetImm32(REGID(d.Rm)), (32-d.Immediate));\n\t\t\t\t\t\t\tOut.cflgimm = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 32-d.Immediate);\n\t\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\n\t\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.GetImm32(REGID(d.Rm));\n\t\t\t\t\t\tOut.shiftopimm = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.GetImm32(REGID(d.Rm))<<d.Immediate;\n\t\t\t\t\t\tOut.shiftopimm = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tjit_lshi_ui(LOCALREG(Out.shiftop), LOCALREG(rm), d.Immediate);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\tUnpackCPSR(regMap, PSR_C, Out.cflg);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0xFF);\n\n\t\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\t\t\t\t\t\n\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_insn *lt32 = jit_blti_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_insn *eq32 = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.cflg), 0);\n\t\t\t\t\t\tjit_insn *done1 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq32);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 1);\n\t\t\t\t\t\tjit_insn *done2 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\t\t\t\t\t\tjit_insn *done3 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(lt32);\n\t\t\t\t\t\tjit_rsbi_ui(LOCALREG(Out.cflg), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.cflg), LOCALREG(rm), LOCALREG(Out.cflg));\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\t\t\t\t\t\tjit_lshr_ui(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\t\tjit_patch(done1);\n\t\t\t\t\t\tjit_patch(done2);\n\t\t\t\t\t\tjit_patch(done3);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0xFF);\n\n\t\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tjit_insn *lt32 = jit_blti_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(lt32);\n\t\t\t\t\t\tjit_lshr_ui(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\t\tjit_patch(done);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IRSHIFT_LSR:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = BIT31(regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t\t\t\tOut.cflgimm = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 31);\n\t\t\t\t\t\t\t//jit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\n\t\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = BIT_N(regMap.GetImm32(REGID(d.Rm)), d.Immediate-1);\n\t\t\t\t\t\t\tOut.cflgimm = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), d.Immediate-1);\n\t\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\n\t\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t{\n\t\t\t\t\tOut.shiftop = 0;\n\t\t\t\t\tOut.shiftopimm = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.GetImm32(REGID(d.Rm))>>d.Immediate;\n\t\t\t\t\t\tOut.shiftopimm = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.shiftop), LOCALREG(rm), d.Immediate);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\tUnpackCPSR(regMap, PSR_C, Out.cflg);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0xFF);\n\n\t\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_insn *lt32 = jit_blti_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_insn *eq32 = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.cflg), 0);\n\t\t\t\t\t\tjit_insn *done1 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq32);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 31);\n\t\t\t\t\t\t//jit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\t\t\t\t\t\tjit_insn *done2 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\t\t\t\t\t\tjit_insn *done3 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(lt32);\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(Out.cflg), LOCALREG(Out.shiftop), 1);\n\t\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.cflg), LOCALREG(rm), LOCALREG(Out.cflg));\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\t\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\t\tjit_patch(done1);\n\t\t\t\t\t\tjit_patch(done2);\n\t\t\t\t\t\tjit_patch(done3);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0xFF);\n\n\t\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\t\t\t\t\t\n\t\t\t\t\t\tjit_insn *lt32 = jit_blti_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_movi_ui(LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(lt32);\n\t\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\t\tjit_patch(done);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IRSHIFT_ASR:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = BIT31(regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t\t\t\tOut.cflgimm = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 31);\n\t\t\t\t\t\t\t//jit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\n\t\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = BIT_N(regMap.GetImm32(REGID(d.Rm)), d.Immediate-1);\n\t\t\t\t\t\t\tOut.cflgimm = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), d.Immediate-1);\n\t\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\n\t\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = BIT31(regMap.GetImm32(REGID(d.Rm))) * 0xFFFFFFFF;\n\t\t\t\t\t\tOut.shiftopimm = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t//jit_rshi_ui(LOCALREG(Out.shiftop), LOCALREG(rm), 31);\n\t\t\t\t\t\t//jit_muli_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), 0xFFFFFFFF);\n\t\t\t\t\t\tjit_rshi_i(LOCALREG(Out.shiftop), LOCALREG(rm), 31);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = (u32)((s32)regMap.GetImm32(REGID(d.Rm)) >> d.Immediate);\n\t\t\t\t\t\tOut.shiftopimm = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tjit_rshi_i(LOCALREG(Out.shiftop), LOCALREG(rm), d.Immediate);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\tUnpackCPSR(regMap, PSR_C, Out.cflg);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0xFF);\n\n\t\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_insn *lt32 = jit_blti_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\t//jit_rshi_ui(LOCALREG(Out.shiftop), LOCALREG(rm), 31);\n\t\t\t\t\t\t//jit_muli_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), 0xFFFFFFFF);\n\t\t\t\t\t\tjit_rshi_i(LOCALREG(Out.shiftop), LOCALREG(rm), 31);\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 31);\n\t\t\t\t\t\t//jit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\t\t\t\t\t\tjit_insn *done1 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\t\t\t\t\t\tjit_insn *done2 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(lt32);\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(Out.cflg), LOCALREG(Out.shiftop), 1);\n\t\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.cflg), LOCALREG(rm), LOCALREG(Out.cflg));\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\t\t\t\t\t\tjit_rshr_i(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\t\tjit_patch(done1);\n\t\t\t\t\t\tjit_patch(done2);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0xFF);\n\n\t\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\t\t\t\t\t\n\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_insn *lt32 = jit_blti_ui(jit_forward(), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\t//jit_rshi_ui(LOCALREG(Out.shiftop), LOCALREG(rm), 31);\n\t\t\t\t\t\t//jit_muli_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), 0xFFFFFFFF);\n\t\t\t\t\t\tjit_rshi_i(LOCALREG(Out.shiftop), LOCALREG(rm), 31);\n\t\t\t\t\t\tjit_insn *done1 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\t\t\t\t\t\tjit_insn *done2 = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(lt32);\n\t\t\t\t\t\tjit_rshr_i(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\t\tjit_patch(done1);\n\t\t\t\t\t\tjit_patch(done2);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IRSHIFT_ROR:\n\t\t\tif (!d.R)\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = BIT0(regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t\t\t\tOut.cflgimm = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 1);\n\n\t\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = BIT_N(regMap.GetImm32(REGID(d.Rm)), d.Immediate-1);\n\t\t\t\t\t\t\tOut.cflgimm = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), d.Immediate-1);\n\t\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\n\t\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (d.Immediate == 0)\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tu32 tmp = regMap.GetImm32(REGID(d.Rm)) >> 1;\n\n\t\t\t\t\t\tUnpackCPSR(regMap, PSR_C, Out.shiftop);\n\t\t\t\t\t\tjit_lshi_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), 31);\n\t\t\t\t\t\tjit_ori_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), tmp);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tUnpackCPSR(regMap, PSR_C, Out.shiftop);\n\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_lshi_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), 31);\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rm), 1);\n\t\t\t\t\t\tjit_orr_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), LOCALREG(tmp));\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = ROR(regMap.GetImm32(REGID(d.Rm)), d.Immediate);\n\t\t\t\t\t\tOut.shiftopimm = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rm), d.Immediate);\n\t\t\t\t\t\tjit_lshi_ui(LOCALREG(Out.shiftop), LOCALREG(rm), 32-d.Immediate);\n\t\t\t\t\t\tjit_orr_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), LOCALREG(tmp));\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (clacCarry)\n\t\t\t\t{\n\t\t\t\t\t{\n\t\t\t\t\t\tOut.cflg = regMap.AllocTempReg();\n\n\t\t\t\t\t\tUnpackCPSR(regMap, PSR_C, Out.cflg);\n\t\t\t\t\t}\n\n\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\tregMap.Lock(rs);\n\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0xFF);\n\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 0);\n\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0x1F);\n\t\t\t\t\tjit_insn *eq0_1F = jit_beqi_ui(jit_forward(), LOCALREG(Out.shiftop), 0);\n\t\t\t\t\tjit_subi_ui(LOCALREG(tmp), LOCALREG(Out.shiftop), 1);\n\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.cflg), LOCALREG(rm), LOCALREG(tmp));\n\t\t\t\t\tjit_andi_ui(LOCALREG(Out.cflg), LOCALREG(Out.cflg), 1);\n\t\t\t\t\tjit_rsbi_ui(LOCALREG(tmp), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\tjit_lshr_ui(LOCALREG(tmp), LOCALREG(rm), LOCALREG(tmp));\n\t\t\t\t\tjit_orr_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), LOCALREG(tmp));\n\t\t\t\t\tjit_insn *done1 = jit_jmpi(jit_forward());\n\t\t\t\t\tjit_patch(eq0_1F);\n\t\t\t\t\tjit_rshi_ui(LOCALREG(Out.cflg), LOCALREG(rm), 31);\n\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\t\t\t\t\tjit_insn *done2 = jit_jmpi(jit_forward());\n\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\t\t\t\t\tjit_patch(done1);\n\t\t\t\t\tjit_patch(done2);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tOut.shiftop = regMap.AllocTempReg();\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(Out.shiftop), LOCALREG(rs), 0x1F);\n\n\t\t\t\t\t\tregMap.Unlock(rs);\n\t\t\t\t\t}\n\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_insn *nei0 = jit_bnei_ui(jit_forward(), LOCALREG(Out.shiftop), 0);\n\t\t\t\t\t\tjit_movr_ui(LOCALREG(Out.shiftop), LOCALREG(rm));\n\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(nei0);\n\t\t\t\t\t\tjit_rsbi_ui(LOCALREG(tmp), LOCALREG(Out.shiftop), 32);\n\t\t\t\t\t\tjit_rshr_ui(LOCALREG(Out.shiftop), LOCALREG(rm), LOCALREG(Out.shiftop));\n\t\t\t\t\t\tjit_lshr_ui(LOCALREG(tmp), LOCALREG(rm), LOCALREG(tmp));\n\t\t\t\t\t\tjit_orr_ui(LOCALREG(Out.shiftop), LOCALREG(Out.shiftop), LOCALREG(tmp));\n\t\t\t\t\t\tjit_patch(done);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tINFO(\"Unknow Shift Op : %u.\\n\", d.Typ);\n\t\t\tif (clacCarry)\n\t\t\t{\n\t\t\t\tOut.cflg = 0;\n\t\t\t\tOut.cflgimm = true;\n\t\t\t}\n\t\t\tOut.shiftop = 0;\n\t\t\tOut.shiftopimm = true;\n\t\t\tbreak;\n\t\t}\n\n\t\treturn Out;\n\t}\n\n\tvoid FASTCALL DataProcessLoadCPSRGenerate(const Decoded &d, RegisterMap &regMap)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\tu32 tmp = regMap.AllocTempReg(true);\n\n\t\t{\n\t\t\targs.clear();\n\t\t\tflushs.clear();\n\n\t\t\tu32 tmp2 = regMap.AllocTempReg();\n\t\t\tu32 spsr = regMap.MapReg(RegisterMap::SPSR);\n\t\t\tregMap.Lock(spsr);\n\t\t\tjit_movr_ui(LOCALREG(tmp), LOCALREG(spsr));\n\t\t\tregMap.Unlock(spsr);\n\t\t\tUnpackPSR(PSR_MODE, tmp, tmp2);\n\n\t\t\tfor (u32 i = RegisterMap::R8; i <= RegisterMap::R14; i++)\n\t\t\t\tflushs.push_back((RegisterMap::GuestRegId)i);\n\t\t\tflushs.push_back(RegisterMap::CPSR);\n\t\t\tflushs.push_back(RegisterMap::SPSR);\n\n\t\t\tABIOp op;\n\n\t\t\top.type = ABIOp::HOSTREG;\n\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\targs.push_back(op);\n\n\t\t\top.type = ABIOp::TEMPREG;\n\t\t\top.regdata = tmp2;\n\t\t\targs.push_back(op);\n\n\t\t\tregMap.CallABI((void*)&armcpu_switchMode, args, flushs);\n\t\t}\n\n\t\tu32 cpsr = regMap.MapReg(RegisterMap::CPSR, RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\tregMap.Lock(cpsr);\n\t\tjit_movr_ui(LOCALREG(cpsr), LOCALREG(tmp));\n\t\tregMap.Unlock(cpsr);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t{\n\t\t\targs.clear();\n\t\t\tflushs.clear();\n\n\t\t\tABIOp op;\n\n\t\t\top.type = ABIOp::HOSTREG;\n\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\targs.push_back(op);\n\n\t\t\tregMap.CallABI((void*)&armcpu_changeCPSR, args, flushs);\n\t\t}\n\n\t\ttmp = regMap.AllocTempReg();\n\n\t\tUnpackCPSR(regMap, PSR_T, tmp);\n\t\tjit_lshi_ui(LOCALREG(tmp), LOCALREG(tmp), 1);\n\t\tjit_ori_ui(LOCALREG(tmp), LOCALREG(tmp), 0xFFFFFFFC);\n\n\t\tu32 r15 = regMap.MapReg(RegisterMap::R15, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(r15);\n\n\t\tjit_andr_ui(LOCALREG(r15), LOCALREG(r15), LOCALREG(tmp));\n\n\t\tregMap.Unlock(r15);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\t}\n\n\tvoid FASTCALL LDM_S_LoadCPSRGenerate(const Decoded &d, RegisterMap &regMap)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t}\n\n\tvoid FASTCALL R15ModifiedGenerate(const Decoded &d, RegisterMap &regMap)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 cpuptr = regMap.GetCpuPtrReg();\n\t\tu32 r15 = regMap.MapReg(RegisterMap::R15);\n\t\tregMap.Lock(r15);\n\n\t\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(r15));\n\n\t\tregMap.Unlock(r15);\n\t}\n\n\tvoid FASTCALL MUL_Mxx_END(const Decoded &d, RegisterMap &regMap, u32 base, u32 v)\n\t{\n\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(execyc);\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), base);\n\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(v), 0xFFFFFF00);\n\t\tjit_insn *eq_l1 = jit_beqi_ui(jit_forward(), LOCALREG(tmp), 0);\n\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(v), 0xFFFF0000);\n\t\tjit_insn *eq_l2 = jit_beqi_ui(jit_forward(), LOCALREG(tmp), 0);\n\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(v), 0xFF000000);\n\t\tjit_insn *eq_l3 = jit_beqi_ui(jit_forward(), LOCALREG(tmp), 0);\n\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), 4);\n\t\tjit_insn *done4 = jit_jmpi(jit_forward());\n\t\tjit_patch(eq_l1);\n\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), 1);\n\t\tjit_insn *done1 = jit_jmpi(jit_forward());\n\t\tjit_patch(eq_l2);\n\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), 2);\n\t\tjit_insn *done2 = jit_jmpi(jit_forward());\n\t\tjit_patch(eq_l3);\n\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), 3);\n\t\tjit_patch(done1);\n\t\tjit_patch(done2);\n\t\tjit_patch(done4);\n\n\t\tregMap.Unlock(execyc);\n\t\tregMap.ReleaseTempReg(tmp);\n\t}\n\n\tvoid FASTCALL MUL_Mxx_END_Imm(const Decoded &d, RegisterMap &regMap, u32 base, u32 v)\n\t{\n\t\tif ((v & 0xFFFFFF00) == 0)\n\t\t\tbase += 1;\n\t\telse if ((v & 0xFFFF0000) == 0)\n\t\t\tbase += 2;\n\t\telse if ((v & 0xFF000000) == 0)\n\t\t\tbase += 3;\n\t\telse \n\t\t\tbase += 4;\n\n\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(execyc);\n\t\t\n\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), base);\n\n\t\tregMap.Unlock(execyc);\n\t}\n\n\tjit_insn* FASTCALL PrepareSLZone()\n\t{\n\t\tstatic const u32 ALIGN_SIZE = 4 - 1;\n\t\tstatic const u32 SLZONE_SIZE = 32*4;\n\n\t\tjit_insn* bk_ptr = jit_get_label();\n\n\t\tuintptr_t new_ptr = (uintptr_t)jit_get_ip().ptr + (SLZONE_SIZE + ALIGN_SIZE);\n\t\tjit_insn* new_ptr_align = (jit_insn*)(new_ptr & ~ALIGN_SIZE);\n\n\t\tjit_set_ip(new_ptr_align);\n\n\t\tmemset(bk_ptr, 0xCC, new_ptr_align - bk_ptr);\n\n\t\t//PROGINFO(\"PrepareSLZone(), bk : %#p, new : %#p, size : %u\\n\", bk_ptr, new_ptr_align, new_ptr_align - bk_ptr);\n\n\t\treturn bk_ptr;\n\t}\n\n\tvoid FASTCALL Fallback2Interpreter(const Decoded &d, RegisterMap &regMap)\n\t{\n#ifdef HAVE_FASTCALL\n\t\tstruct Interpreter\n\t\t{\n\t\t\tstatic u32 Method(OpFunc func, u32 opcode)\n\t\t\t{\n\t\t\t\treturn func(opcode);\n\t\t\t}\n\t\t};\n#endif\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\tu32 opcode;\n\t\tOpFunc func;\n\n\t\tif (d.ThumbFlag)\n\t\t{\n\t\t\topcode = d.Instruction.ThumbOp;\n\t\t\tfunc = thumb_instructions_set[PROCNUM][opcode>>6];\n\t\t}\n\t\telse\n\t\t{\n\t\t\topcode = d.Instruction.ArmOp;\n\t\t\tfunc = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)];\n\t\t}\n\n\t\targs.clear();\n\t\tflushs.clear();\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tABIOp op;\n#ifdef HAVE_FASTCALL\n\t\top.type = ABIOp::IMM;\n\t\top.immdata.type = ImmData::IMMPTR;\n\t\top.immdata.immptr = reinterpret_cast<void*>(func);\n\t\targs.push_back(op);\n\t\t\n\t\top.type = ABIOp::IMM;\n\t\top.immdata.type = ImmData::IMM32;\n\t\top.immdata.imm32 = opcode;\n\t\targs.push_back(op);\n\n\t\tregMap.CallABI((void*)&Interpreter::Method, args, flushs, tmp);\n#else\n\t\top.type = ABIOp::IMM;\n\t\top.immdata.type = ImmData::IMM32;\n\t\top.immdata.imm32 = opcode;\n\t\targs.push_back(op);\n\n\t\tregMap.CallABI((void*)func, args, flushs, tmp);\n#endif\n\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(execyc);\n\n\t\tjit_addr_ui(LOCALREG(execyc), LOCALREG(execyc), LOCALREG(tmp));\n\n\t\tregMap.Unlock(execyc);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\t}\n\n\tvoid FASTCALL CheckReschedule(const Decoded &d, RegisterMap &regMap)\n\t{\n\t}\n\n//------------------------------------------------------------\n//                         IROp decoder\n//------------------------------------------------------------\n\tOPDECODER_DECL(IR_UND)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"IR_UND\\n\");\n\n\t\tu32 cpuptr = regMap.GetCpuPtrReg();\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tif (d.ThumbFlag)\n\t\t\tjit_movi_ui(LOCALREG(tmp), d.Instruction.ThumbOp);\n\t\telse\n\t\t\tjit_movi_ui(LOCALREG(tmp), d.Instruction.ArmOp);\n\t\tjit_stxi_ui(jit_field(armcpu_t, instruction), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\tjit_movi_ui(LOCALREG(tmp), d.Address);\n\t\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t{\n\t\t\tstd::vector<ABIOp> args;\n\t\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\t\tABIOp op;\n\t\t\top.type = ABIOp::HOSTREG;\n\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\targs.push_back(op);\n\n\t\t\tregMap.CallABI((void*)&TRAPUNDEF, args, flushs);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_NOP)\n\t{\n\t}\n\n\tOPDECODER_DECL(IR_DUMMY)\n\t{\n\t}\n\n\tOPDECODER_DECL(IR_T32P1)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"IR_T32P1\\n\");\n\n\t\tu32 cpuptr = regMap.GetCpuPtrReg();\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tif (d.ThumbFlag)\n\t\t\tjit_movi_ui(LOCALREG(tmp), d.Instruction.ThumbOp);\n\t\telse\n\t\t\tjit_movi_ui(LOCALREG(tmp), d.Instruction.ArmOp);\n\t\tjit_stxi_ui(jit_field(armcpu_t, instruction), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\tjit_movi_ui(LOCALREG(tmp), d.Address);\n\t\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t{\n\t\t\tstd::vector<ABIOp> args;\n\t\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\t\tABIOp op;\n\t\t\top.type = ABIOp::HOSTREG;\n\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\targs.push_back(op);\n\n\t\t\tregMap.CallABI((void*)&TRAPUNDEF, args, flushs);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_T32P2)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"IR_T32P2\\n\");\n\n\t\tu32 cpuptr = regMap.GetCpuPtrReg();\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tif (d.ThumbFlag)\n\t\t\tjit_movi_ui(LOCALREG(tmp), d.Instruction.ThumbOp);\n\t\telse\n\t\t\tjit_movi_ui(LOCALREG(tmp), d.Instruction.ArmOp);\n\t\tjit_stxi_ui(jit_field(armcpu_t, instruction), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\tjit_movi_ui(LOCALREG(tmp), d.Address);\n\t\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t{\n\t\t\tstd::vector<ABIOp> args;\n\t\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\t\tABIOp op;\n\t\t\top.type = ABIOp::HOSTREG;\n\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\targs.push_back(op);\n\n\t\t\tregMap.CallABI((void*)&TRAPUNDEF, args, flushs);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_MOV)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tregMap.SetImm32(REGID(d.Rd), d.Immediate);\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, d.Immediate==0 ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tu32 rd = INVALID_REG_ID;\n\n\t\t\tif (shift_out.shiftopimm)\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), shift_out.shiftop);\n\t\t\telse\n\t\t\t{\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_movr_ui(LOCALREG(rd), LOCALREG(shift_out.shiftop));\n\t\t\t}\n\t\t\t\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\t\tshift_out.CleanCflg(regMap);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(shift_out.shiftop), LOCALREG(rd), 31);\n\t\t\t\t\t\tPackCPSR(regMap, PSR_N, shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_eqi_ui(LOCALREG(shift_out.shiftop), LOCALREG(rd), 0);\n\t\t\t\t\t\tPackCPSR(regMap, PSR_Z, shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rd != INVALID_REG_ID)\n\t\t\t\tregMap.Unlock(rd);\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_MVN)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tregMap.SetImm32(REGID(d.Rd), ~d.Immediate);\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(~d.Immediate));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, ~d.Immediate==0 ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tu32 rd = INVALID_REG_ID;\n\n\t\t\tif (shift_out.shiftopimm)\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), ~shift_out.shiftop);\n\t\t\telse\n\t\t\t{\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_notr_ui(LOCALREG(rd), LOCALREG(shift_out.shiftop));\n\t\t\t}\n\t\t\t\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\t\tshift_out.CleanCflg(regMap);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(shift_out.shiftop), LOCALREG(rd), 31);\n\t\t\t\t\t\tPackCPSR(regMap, PSR_N, shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t{\n\t\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_eqi_ui(LOCALREG(shift_out.shiftop), LOCALREG(rd), 0);\n\t\t\t\t\t\tPackCPSR(regMap, PSR_Z, shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rd != INVALID_REG_ID)\n\t\t\t\tregMap.Unlock(rd);\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_AND)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) & d.Immediate);\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_andi_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) & shift_out.shiftop);\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_andi_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_andr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_TST)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 dst = INVALID_REG_ID;\n\t\tbool dstimm = false;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) & d.Immediate;\n\t\t\t\tdstimm = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tjit_andi_ui(LOCALREG(dst), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t{\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) & shift_out.shiftop;\n\t\t\t\tdstimm = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_andi_ui(LOCALREG(dst), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_andr_ui(LOCALREG(dst), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\t\t\t\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t}\n\n\t\t\t\tshift_out.Clean(regMap);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(dst));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(dst), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, dst==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(dst), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!dstimm)\n\t\t\tregMap.ReleaseTempReg(dst);\n\t}\n\n\tOPDECODER_DECL(IR_EOR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) ^ d.Immediate);\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_xori_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) ^ shift_out.shiftop);\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_xori_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_xorr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_TEQ)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 dst = INVALID_REG_ID;\n\t\tbool dstimm = false;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) ^ d.Immediate;\n\t\t\t\tdstimm = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tjit_xori_ui(LOCALREG(dst), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t{\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) ^ shift_out.shiftop;\n\t\t\t\tdstimm = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_xori_ui(LOCALREG(dst), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_xorr_ui(LOCALREG(dst), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\t\t\t\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t}\n\n\t\t\t\tshift_out.Clean(regMap);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(dst));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(dst), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, dst==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(dst), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!dstimm)\n\t\t\tregMap.ReleaseTempReg(dst);\n\t}\n\n\tOPDECODER_DECL(IR_ORR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) | d.Immediate);\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_ori_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) | shift_out.shiftop);\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_ori_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_orr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_BIC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) & (~d.Immediate));\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_andi_ui(LOCALREG(rd), LOCALREG(rn), ~d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_C, BIT31(d.Immediate));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst bool clacCarry = d.S && !d.R15Modified && (d.FlagsSet & FLAG_C);\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, clacCarry);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) & (~shift_out.shiftop));\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_andi_ui(LOCALREG(rd), LOCALREG(rn), ~shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tjit_notr_ui(LOCALREG(shift_out.shiftop), LOCALREG(shift_out.shiftop));\n\t\t\t\t\tjit_andr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.S && !d.R15Modified)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.cflgimm)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t\telse\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, shift_out.cflg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_ADD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) + d.Immediate);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, CarryFrom(v, d.Immediate));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromADD(regMap.GetImm32(REGID(d.Rd)), v, d.Immediate));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tu32 v_tmp = INVALID_REG_ID;\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_V)))\n\t\t\t\t{\n\t\t\t\t\tv_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(v_tmp), LOCALREG(rn));\n\t\t\t\t}\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C)))\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movi_ui(LOCALREG(c_tmp), 0);\n\t\t\t\t\tjit_addci_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tjit_addi_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(v_tmp), d.Immediate);\n\t\t\t\t\t\tjit_notr_ui(LOCALREG(tmp), LOCALREG(tmp));\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(v_tmp), LOCALREG(rd), d.Immediate);\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, v_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(v_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) + shift_out.shiftop);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, CarryFrom(v, shift_out.shiftop));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromADD(regMap.GetImm32(REGID(d.Rd)), v, shift_out.shiftop));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tu32 v_tmp = INVALID_REG_ID;\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_V)))\n\t\t\t\t{\n\t\t\t\t\tv_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(v_tmp), LOCALREG(rn));\n\t\t\t\t}\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C)))\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movi_ui(LOCALREG(c_tmp), 0);\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\tjit_addci_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_addcr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_addr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(v_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_notr_ui(LOCALREG(tmp), LOCALREG(tmp));\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(v_tmp), LOCALREG(rd), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(tmp), LOCALREG(v_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_notr_ui(LOCALREG(tmp), LOCALREG(tmp));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(v_tmp), LOCALREG(rd), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, v_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(v_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_ADC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tu32 rn_tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_movr_ui(LOCALREG(rn_tmp), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tu32 cflg = regMap.AllocTempReg();\n\t\t\t\tUnpackCPSR(regMap, PSR_C, cflg);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\t\t\t\t\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C)))\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movi_ui(LOCALREG(c_tmp), 0);\n\t\t\t\t\tjit_addci_ui(LOCALREG(rd), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t\tjit_addcr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t\tjit_nei_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tjit_addi_ui(LOCALREG(rd), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\tjit_addr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(cflg);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\t\tjit_notr_ui(LOCALREG(tmp), LOCALREG(tmp));\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(rn_tmp), LOCALREG(rd), d.Immediate);\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, rn_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(rn_tmp);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tu32 rn_tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_movr_ui(LOCALREG(rn_tmp), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tu32 cflg = regMap.AllocTempReg();\n\t\t\t\tUnpackCPSR(regMap, PSR_C, cflg);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\t\t\t\t\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C)))\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movi_ui(LOCALREG(c_tmp), 0);\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\tjit_addci_ui(LOCALREG(rd), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_addcr_ui(LOCALREG(rd), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t\tjit_addcr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t\tjit_nei_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(rd), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_addr_ui(LOCALREG(rd), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\tjit_addr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(cflg);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_notr_ui(LOCALREG(tmp), LOCALREG(tmp));\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(rn_tmp), LOCALREG(rd), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(tmp), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_notr_ui(LOCALREG(tmp), LOCALREG(tmp));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(rn_tmp), LOCALREG(rd), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, rn_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(rn_tmp);\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_SUB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) - d.Immediate);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, !BorrowFrom(v, d.Immediate));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromSUB(regMap.GetImm32(REGID(d.Rd)), v, d.Immediate));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tu32 v_tmp = INVALID_REG_ID;\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_V)))\n\t\t\t\t{\n\t\t\t\t\tv_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(v_tmp), LOCALREG(rn));\n\t\t\t\t}\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C)))\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_gei_ui(LOCALREG(c_tmp), LOCALREG(rn), d.Immediate);\n\t\t\t\t\tjit_subi_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tjit_subi_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(v_tmp), d.Immediate);\n\t\t\t\t\t\tjit_xorr_ui(LOCALREG(v_tmp), LOCALREG(rd), LOCALREG(v_tmp));\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, v_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(v_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rn)) - shift_out.shiftop);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, !BorrowFrom(v, shift_out.shiftop));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromSUB(regMap.GetImm32(REGID(d.Rd)), v, shift_out.shiftop));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tu32 v_tmp = INVALID_REG_ID;\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_V)))\n\t\t\t\t{\n\t\t\t\t\tv_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(v_tmp), LOCALREG(rn));\n\t\t\t\t}\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C)))\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_gei_ui(LOCALREG(c_tmp), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_ger_ui(LOCALREG(c_tmp), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\tjit_subr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(v_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(v_tmp), LOCALREG(rd), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(tmp), LOCALREG(v_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(v_tmp), LOCALREG(rd), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, v_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(v_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_SBC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tu32 rn_tmp = regMap.AllocTempReg();\n\t\t\t\tjit_movr_ui(LOCALREG(rn_tmp), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tu32 cflg = regMap.AllocTempReg();\n\t\t\t\tUnpackCPSR(regMap, PSR_C, cflg);\n\t\t\t\tjit_xori_ui(LOCALREG(cflg), LOCALREG(cflg), 1);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_subi_ui(LOCALREG(rd), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\tjit_subr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(cflg), 1);\n\t\t\t\t\t\tjit_gei_ui(LOCALREG(cflg), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\tjit_gti_ui(LOCALREG(cflg), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\t\tjit_patch(done);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, cflg);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = cflg;\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\t\tjit_xorr_ui(LOCALREG(rn_tmp), LOCALREG(rd), LOCALREG(rn_tmp));\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, rn_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(cflg);\n\t\t\t\tregMap.ReleaseTempReg(rn_tmp);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tu32 rn_tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_movr_ui(LOCALREG(rn_tmp), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tu32 cflg = regMap.AllocTempReg();\n\t\t\t\tUnpackCPSR(regMap, PSR_C, cflg);\n\t\t\t\tjit_xori_ui(LOCALREG(cflg), LOCALREG(cflg), 1);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_subi_ui(LOCALREG(rd), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_subr_ui(LOCALREG(rd), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\tjit_subr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(cflg), 1);\n\t\t\t\t\t\t\tjit_gei_ui(LOCALREG(cflg), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\t\tjit_gti_ui(LOCALREG(cflg), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_patch(done);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(cflg), 1);\n\t\t\t\t\t\t\tjit_ger_ui(LOCALREG(cflg), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\t\tjit_gtr_ui(LOCALREG(cflg), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_patch(done);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, cflg);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = cflg;\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(rn_tmp), LOCALREG(rd), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(tmp), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(rn_tmp), LOCALREG(rd), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, rn_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(cflg);\n\t\t\t\tregMap.ReleaseTempReg(rn_tmp);\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_RSB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), d.Immediate - v);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, !BorrowFrom(d.Immediate, v));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromSUB(regMap.GetImm32(REGID(d.Rd)), d.Immediate, v));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tu32 v_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\t{\n\t\t\t\t\tv_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(v_tmp), LOCALREG(rn));\n\t\t\t\t}\n\n\t\t\t\tjit_rsbi_ui(LOCALREG(rd), LOCALREG(rn), d.Immediate);\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_lei_ui(LOCALREG(tmp), LOCALREG(v_tmp), d.Immediate);\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(v_tmp), d.Immediate);\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(v_tmp), LOCALREG(rd), d.Immediate);\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, v_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (v_tmp != INVALID_REG_ID)\n\t\t\t\t\tregMap.ReleaseTempReg(v_tmp);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tregMap.SetImm32(REGID(d.Rd), shift_out.shiftop - v);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, !BorrowFrom(shift_out.shiftop, v));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromSUB(regMap.GetImm32(REGID(d.Rd)), shift_out.shiftop, v));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tu32 v_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.S && !d.R15Modified && ((d.FlagsSet & FLAG_C) || (d.FlagsSet & FLAG_V)))\n\t\t\t\t{\n\t\t\t\t\tv_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(v_tmp), LOCALREG(rn));\n\t\t\t\t}\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_rsbi_ui(LOCALREG(rd), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_rsbr_ui(LOCALREG(rd), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t\tjit_lei_ui(LOCALREG(tmp), LOCALREG(v_tmp), shift_out.shiftop);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_ler_ui(LOCALREG(tmp), LOCALREG(v_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(v_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(v_tmp), LOCALREG(rd), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(tmp), LOCALREG(v_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(v_tmp), LOCALREG(rd), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(v_tmp), LOCALREG(tmp), LOCALREG(v_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(v_tmp), LOCALREG(v_tmp), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, v_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (v_tmp != INVALID_REG_ID)\n\t\t\t\t\tregMap.ReleaseTempReg(v_tmp);\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_RSC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = INVALID_REG_ID;\n\n\t\tif (d.I)\n\t\t{\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tu32 rn_tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_movr_ui(LOCALREG(rn_tmp), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tu32 cflg = regMap.AllocTempReg();\n\t\t\t\tUnpackCPSR(regMap, PSR_C, cflg);\n\t\t\t\tjit_xori_ui(LOCALREG(cflg), LOCALREG(cflg), 1);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tjit_rsbi_ui(LOCALREG(rd), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\tjit_subr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(cflg), 1);\n\t\t\t\t\t\tjit_lei_ui(LOCALREG(cflg), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\tjit_lti_ui(LOCALREG(cflg), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\t\tjit_patch(done);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, cflg);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = cflg;\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(rn_tmp), d.Immediate);\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(rn_tmp), LOCALREG(rd), d.Immediate);\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, rn_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(cflg);\n\t\t\t\tregMap.ReleaseTempReg(rn_tmp);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tu32 rn_tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_movr_ui(LOCALREG(rn_tmp), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\n\t\t\t\tu32 cflg = regMap.AllocTempReg();\n\t\t\t\tUnpackCPSR(regMap, PSR_C, cflg);\n\t\t\t\tjit_xori_ui(LOCALREG(cflg), LOCALREG(cflg), 1);\n\n\t\t\t\trd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\tregMap.Lock(rd);\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_rsbi_ui(LOCALREG(rd), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_rsbr_ui(LOCALREG(rd), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\tjit_subr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(cflg));\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(cflg), 1);\n\t\t\t\t\t\t\tjit_lei_ui(LOCALREG(cflg), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\t\tjit_lti_ui(LOCALREG(cflg), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_patch(done);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_insn *eq0 = jit_beqi_ui(jit_forward(), LOCALREG(cflg), 1);\n\t\t\t\t\t\t\tjit_ler_ui(LOCALREG(cflg), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_insn *done = jit_jmpi(jit_forward());\n\t\t\t\t\t\t\tjit_patch(eq0);\n\t\t\t\t\t\t\tjit_ltr_ui(LOCALREG(cflg), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_patch(done);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, cflg);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = cflg;\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(tmp), LOCALREG(rn_tmp), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(rn_tmp), LOCALREG(rd), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(tmp), LOCALREG(rn_tmp), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(rn_tmp), LOCALREG(rd), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(rn_tmp), LOCALREG(tmp), LOCALREG(rn_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(rn_tmp), LOCALREG(rn_tmp), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, rn_tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.ReleaseTempReg(cflg);\n\t\t\t\tregMap.ReleaseTempReg(rn_tmp);\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\tif (d.S && !d.R15Modified)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rd)))\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (rd != INVALID_REG_ID)\n\t\t\tregMap.Unlock(rd);\n\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tDataProcessLoadCPSRGenerate(d, regMap);\n\t\t\t}\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_CMP)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 dst = INVALID_REG_ID;\n\t\tbool dstimm = false;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) - d.Immediate;\n\t\t\t\tdstimm = true;\n\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, !BorrowFrom(v, d.Immediate));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromSUB(dst, v, d.Immediate));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tjit_subi_ui(LOCALREG(dst), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 c_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_gei_ui(LOCALREG(c_tmp), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\t\t\t\t\t\t\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 flg = regMap.AllocTempReg();\n\t\t\t\t\t\tu32 flg_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(flg), LOCALREG(rn), d.Immediate);\n\t\t\t\t\t\tjit_xorr_ui(LOCALREG(flg_tmp), LOCALREG(dst), LOCALREG(rn));\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(flg), LOCALREG(flg), LOCALREG(flg_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(flg), LOCALREG(flg), 31);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg_tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, flg);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) - shift_out.shiftop;\n\t\t\t\tdstimm = true;\n\n\t\t\t\tif (d.S && !d.R15Modified)\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, !BorrowFrom(v, shift_out.shiftop));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromSUB(dst, v, shift_out.shiftop));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\tjit_subi_ui(LOCALREG(dst), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\telse\n\t\t\t\t\tjit_subr_ui(LOCALREG(dst), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 c_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t\tjit_gei_ui(LOCALREG(c_tmp), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_ger_ui(LOCALREG(c_tmp), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 flg = regMap.AllocTempReg();\n\t\t\t\t\t\tu32 flg_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(flg), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(flg_tmp), LOCALREG(dst), LOCALREG(rn));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(flg), LOCALREG(flg), LOCALREG(flg_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(flg), LOCALREG(flg), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(flg), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(flg_tmp), LOCALREG(dst), LOCALREG(rn));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(flg), LOCALREG(flg), LOCALREG(flg_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(flg), LOCALREG(flg), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg_tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, flg);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(dst));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(dst), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, dst==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(dst), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!dstimm)\n\t\t\tregMap.ReleaseTempReg(dst);\n\t}\n\n\tOPDECODER_DECL(IR_CMN)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 dst = INVALID_REG_ID;\n\t\tbool dstimm = false;\n\n\t\tif (d.I)\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) + d.Immediate;\n\t\t\t\tdstimm = true;\n\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, CarryFrom(v, d.Immediate));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromADD(dst, v, d.Immediate));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movi_ui(LOCALREG(c_tmp), 0);\n\t\t\t\t\tjit_addci_ui(LOCALREG(dst), LOCALREG(rn), d.Immediate);\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tjit_addi_ui(LOCALREG(dst), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 flg = regMap.AllocTempReg();\n\t\t\t\t\t\tu32 flg_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(flg), LOCALREG(rn), d.Immediate);\n\t\t\t\t\t\tjit_notr_ui(LOCALREG(flg), LOCALREG(flg));\n\t\t\t\t\t\tjit_xori_ui(LOCALREG(flg_tmp), LOCALREG(dst), d.Immediate);\n\t\t\t\t\t\tjit_andr_ui(LOCALREG(flg), LOCALREG(flg), LOCALREG(flg_tmp));\n\t\t\t\t\t\tjit_rshi_ui(LOCALREG(flg), LOCALREG(flg), 31);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg_tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, flg);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t{\n\t\t\t\tu32 v = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tdst = regMap.GetImm32(REGID(d.Rn)) + shift_out.shiftop;\n\t\t\t\tdstimm = true;\n\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_C, CarryFrom(v, shift_out.shiftop));\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t\tPackCPSRImm(regMap, PSR_V, OverflowFromADD(dst, v, shift_out.shiftop));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tdst = regMap.AllocTempReg();\n\n\t\t\t\tu32 c_tmp = INVALID_REG_ID;\n\n\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t{\n\t\t\t\t\tc_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_movi_ui(LOCALREG(c_tmp), 0);\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\tjit_addci_ui(LOCALREG(dst), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_addcr_ui(LOCALREG(dst), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\tjit_addxi_ui(LOCALREG(c_tmp), LOCALREG(c_tmp), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(dst), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_addr_ui(LOCALREG(dst), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\tif (d.FlagsSet & FLAG_C)\n\t\t\t\t\t{\n\t\t\t\t\t\tPackCPSR(regMap, PSR_C, c_tmp);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(c_tmp);\n\t\t\t\t\t}\n\t\t\t\t\tif (d.FlagsSet & FLAG_V)\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 flg = regMap.AllocTempReg();\n\t\t\t\t\t\tu32 flg_tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(flg), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_notr_ui(LOCALREG(flg), LOCALREG(flg));\n\t\t\t\t\t\t\tjit_xori_ui(LOCALREG(flg_tmp), LOCALREG(dst), shift_out.shiftop);\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(flg), LOCALREG(flg), LOCALREG(flg_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(flg), LOCALREG(flg), 31);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(flg), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_notr_ui(LOCALREG(flg), LOCALREG(flg));\n\t\t\t\t\t\t\tjit_xorr_ui(LOCALREG(flg_tmp), LOCALREG(dst), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\t\tjit_andr_ui(LOCALREG(flg), LOCALREG(flg), LOCALREG(flg_tmp));\n\t\t\t\t\t\t\tjit_rshi_ui(LOCALREG(flg), LOCALREG(flg), 31);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg_tmp);\n\n\t\t\t\t\t\tPackCPSR(regMap, PSR_V, flg);\n\n\t\t\t\t\t\tregMap.ReleaseTempReg(flg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tshift_out.Clean(regMap);\n\t\t}\n\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(dst));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(dst), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tif (dstimm)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, dst==0);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(dst), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\t\t\t\t\t\t\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!dstimm)\n\t\t\tregMap.ReleaseTempReg(dst);\n\t}\n\n\tOPDECODER_DECL(IR_MUL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)) && regMap.IsImm(REGID(d.Rm)))\n\t\t{\n\t\t\tu32 v = regMap.GetImm32(REGID(d.Rs));\n\t\t\tif ((s32)v < 0)\n\t\t\t\tv = ~v;\n\n\t\t\tMUL_Mxx_END_Imm(d, regMap, 1, v);\n\n\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rs)) * regMap.GetImm32(REGID(d.Rm)));\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 v = INVALID_REG_ID;\n\t\t\tbool vimm = false;\n\n\t\t\tif (regMap.IsImm(REGID(d.Rs)))\n\t\t\t{\n\t\t\t\tv = regMap.GetImm32(REGID(d.Rs));\n\t\t\t\tvimm = true;\n\n\t\t\t\tif ((s32)v < 0)\n\t\t\t\t\tv = ~v;\n\t\t\t}\n\t\t\telse\n\t\t\t\tv = regMap.AllocTempReg();\n\n\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\tregMap.Lock(rs);\n\n\t\t\tif (!vimm)\n\t\t\t{\n\t\t\t\tjit_movr_ui(LOCALREG(v), LOCALREG(rs));\n\t\t\t\tjit_rshi_i(LOCALREG(v), LOCALREG(v), 31);\n\t\t\t\tjit_xorr_ui(LOCALREG(v), LOCALREG(v), LOCALREG(rs));\n\n\t\t\t\tMUL_Mxx_END(d, regMap, 1, v);\n\n\t\t\t\tregMap.ReleaseTempReg(v);\n\t\t\t}\n\t\t\telse\n\t\t\t\tMUL_Mxx_END_Imm(d, regMap, 1, v);\n\n\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\tregMap.Lock(rm);\n\n\t\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rd);\n\n\t\t\tjit_mulr_ui(LOCALREG(rd), LOCALREG(rs), LOCALREG(rm));\n\n\t\t\tregMap.Unlock(rm);\n\t\t\tregMap.Unlock(rs);\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tregMap.Unlock(rd);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_MLA)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)) && regMap.IsImm(REGID(d.Rm)) && regMap.IsImm(REGID(d.Rn)))\n\t\t{\n\t\t\tu32 v = regMap.GetImm32(REGID(d.Rs));\n\n\t\t\tif ((s32)v < 0)\n\t\t\t\tv = ~v;\n\n\t\t\tMUL_Mxx_END_Imm(d, regMap, 2, v);\n\n\t\t\tregMap.SetImm32(REGID(d.Rd), regMap.GetImm32(REGID(d.Rs)) * regMap.GetImm32(REGID(d.Rm)) + regMap.GetImm32(REGID(d.Rn)));\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, regMap.GetImm32(REGID(d.Rd))==0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 v = INVALID_REG_ID;\n\t\t\tbool vimm = false;\n\n\t\t\tif (regMap.IsImm(REGID(d.Rs)))\n\t\t\t{\n\t\t\t\tv = regMap.GetImm32(REGID(d.Rs));\n\t\t\t\tvimm = true;\n\n\t\t\t\tif ((s32)v < 0)\n\t\t\t\t\tv = ~v;\n\t\t\t}\n\t\t\telse\n\t\t\t\tv = regMap.AllocTempReg();\n\n\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\tregMap.Lock(rs);\n\n\t\t\tif (!vimm)\n\t\t\t{\n\t\t\t\tjit_movr_ui(LOCALREG(v), LOCALREG(rs));\n\t\t\t\tjit_rshi_i(LOCALREG(v), LOCALREG(v), 31);\n\t\t\t\tjit_xorr_ui(LOCALREG(v), LOCALREG(v), LOCALREG(rs));\n\n\t\t\t\tMUL_Mxx_END(d, regMap, 2, v);\n\n\t\t\t\tregMap.ReleaseTempReg(v);\n\t\t\t}\n\t\t\telse\n\t\t\t\tMUL_Mxx_END_Imm(d, regMap, 2, v);\n\n\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\tregMap.Lock(rm);\n\n\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\tregMap.Lock(rn);\n\n\t\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rd);\n\n\t\t\tif (rd != rn)\n\t\t\t{\n\t\t\t\tjit_mulr_ui(LOCALREG(rd), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_addr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(rn));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_mulr_ui(LOCALREG(tmp), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_addr_ui(LOCALREG(rd), LOCALREG(tmp), LOCALREG(rn));\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\n\t\t\tregMap.Unlock(rn);\n\t\t\tregMap.Unlock(rm);\n\t\t\tregMap.Unlock(rs);\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(rd), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tregMap.Unlock(rd);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_UMULL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)) && regMap.IsImm(REGID(d.Rm)))\n\t\t{\n\t\t\tu32 v = regMap.GetImm32(REGID(d.Rs));\n\n\t\t\tMUL_Mxx_END_Imm(d, regMap, 2, v);\n\n\t\t\tu64 res = (u64)regMap.GetImm32(REGID(d.Rs)) * regMap.GetImm32(REGID(d.Rm));\n\n\t\t\tregMap.SetImm32(REGID(d.Rn), (u32)res);\n\t\t\tregMap.SetImm32(REGID(d.Rd), (u32)(res>>32));\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, res==0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 v = INVALID_REG_ID;\n\t\t\tbool vimm = false;\n\n\t\t\tif (regMap.IsImm(REGID(d.Rs)))\n\t\t\t{\n\t\t\t\tv = regMap.GetImm32(REGID(d.Rs));\n\t\t\t\tvimm = true;\n\t\t\t}\n\n\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\tregMap.Lock(rs);\n\n\t\t\tif (!vimm)\n\t\t\t\tMUL_Mxx_END(d, regMap, 2, rs);\n\t\t\telse\n\t\t\t\tMUL_Mxx_END_Imm(d, regMap, 2, v);\n\n\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\tregMap.Lock(rm);\n\n\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rn);\n\n\t\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rd);\n\n\t\t\tif (rn != rs && rn != rm)\n\t\t\t{\n\t\t\t\tjit_mulr_ui(LOCALREG(rn), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_hmulr_ui(LOCALREG(rd), LOCALREG(rs), LOCALREG(rm));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_mulr_ui(LOCALREG(tmp), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_hmulr_ui(LOCALREG(rd), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_movr_ui(LOCALREG(rn), LOCALREG(tmp));\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\n\t\t\tregMap.Unlock(rm);\n\t\t\tregMap.Unlock(rs);\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_andr_ui(LOCALREG(tmp), LOCALREG(rn), LOCALREG(rd));\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(tmp), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tregMap.Unlock(rn);\n\t\t\tregMap.Unlock(rd);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_UMLAL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 v = INVALID_REG_ID;\n\t\tbool vimm = false;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)))\n\t\t{\n\t\t\tv = regMap.GetImm32(REGID(d.Rs));\n\t\t\tvimm = true;\n\t\t}\n\n\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\tregMap.Lock(rs);\n\n\t\tif (!vimm)\n\t\t\tMUL_Mxx_END(d, regMap, 3, rs);\n\t\telse\n\t\t\tMUL_Mxx_END_Imm(d, regMap, 3, v);\n\n\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\tregMap.Lock(rm);\n\n\t\tu32 hi = regMap.AllocTempReg();\n\t\tu32 lo = regMap.AllocTempReg();\n\n\t\tjit_mulr_ui(LOCALREG(lo), LOCALREG(rs), LOCALREG(rm));\n\t\tjit_hmulr_ui(LOCALREG(hi), LOCALREG(rs), LOCALREG(rm));\n\n\t\tregMap.Unlock(rm);\n\t\tregMap.Unlock(rs);\n\n\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(rn);\n\n\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(rd);\n\n\t\tjit_addcr_ui(LOCALREG(rn), LOCALREG(rn), LOCALREG(lo));\n\t\tjit_addxr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(hi));\n\n\t\tregMap.ReleaseTempReg(lo);\n\t\tregMap.ReleaseTempReg(hi);\n\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_andr_ui(LOCALREG(tmp), LOCALREG(rn), LOCALREG(rd));\n\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(tmp), 0);\n\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\t\t}\n\n\t\tregMap.Unlock(rn);\n\t\tregMap.Unlock(rd);\n\t}\n\n\tOPDECODER_DECL(IR_SMULL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)) && regMap.IsImm(REGID(d.Rm)))\n\t\t{\n\t\t\tu32 v = regMap.GetImm32(REGID(d.Rs));\n\t\t\tif ((s32)v < 0)\n\t\t\t\tv = ~v;\n\n\t\t\tMUL_Mxx_END_Imm(d, regMap, 2, v);\n\n\t\t\tu64 res = (s64)regMap.GetImm32(REGID(d.Rs)) * regMap.GetImm32(REGID(d.Rm));\n\n\t\t\tregMap.SetImm32(REGID(d.Rn), (u32)res);\n\t\t\tregMap.SetImm32(REGID(d.Rd), (u32)(res>>32));\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_N, BIT31(regMap.GetImm32(REGID(d.Rd))));\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t\tPackCPSRImm(regMap, PSR_Z, res==0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 v = INVALID_REG_ID;\n\t\t\tbool vimm = false;\n\n\t\t\tif (regMap.IsImm(REGID(d.Rs)))\n\t\t\t{\n\t\t\t\tv = regMap.GetImm32(REGID(d.Rs));\n\t\t\t\tvimm = true;\n\n\t\t\t\tif ((s32)v < 0)\n\t\t\t\t\tv = ~v;\n\t\t\t}\n\t\t\telse\n\t\t\t\tv = regMap.AllocTempReg();\n\n\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\tregMap.Lock(rs);\n\n\t\t\tif (!vimm)\n\t\t\t{\n\t\t\t\tjit_movr_ui(LOCALREG(v), LOCALREG(rs));\n\t\t\t\tjit_rshi_i(LOCALREG(v), LOCALREG(v), 31);\n\t\t\t\tjit_xorr_ui(LOCALREG(v), LOCALREG(v), LOCALREG(rs));\n\n\t\t\t\tMUL_Mxx_END(d, regMap, 2, v);\n\n\t\t\t\tregMap.ReleaseTempReg(v);\n\t\t\t}\n\t\t\telse\n\t\t\t\tMUL_Mxx_END_Imm(d, regMap, 2, v);\n\n\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\tregMap.Lock(rm);\n\n\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rn);\n\n\t\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rd);\n\n\t\t\tif (rn != rs && rn != rm)\n\t\t\t{\n\t\t\t\tjit_mulr_i(LOCALREG(rn), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_hmulr_i(LOCALREG(rd), LOCALREG(rs), LOCALREG(rm));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_mulr_i(LOCALREG(tmp), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_hmulr_i(LOCALREG(rd), LOCALREG(rs), LOCALREG(rm));\n\t\t\t\tjit_movr_i(LOCALREG(rn), LOCALREG(tmp));\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\n\t\t\tregMap.Unlock(rm);\n\t\t\tregMap.Unlock(rs);\n\n\t\t\tif (d.S)\n\t\t\t{\n\t\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t\t{\n\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\tjit_andr_ui(LOCALREG(tmp), LOCALREG(rn), LOCALREG(rd));\n\t\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(tmp), 0);\n\t\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\n\t\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tregMap.Unlock(rn);\n\t\t\tregMap.Unlock(rd);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_SMLAL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 v = INVALID_REG_ID;\n\t\tbool vimm = false;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)))\n\t\t{\n\t\t\tv = regMap.GetImm32(REGID(d.Rs));\n\t\t\tvimm = true;\n\n\t\t\tif ((s32)v < 0)\n\t\t\t\tv = ~v;\n\t\t}\n\t\telse\n\t\t\tv = regMap.AllocTempReg();\n\n\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\tregMap.Lock(rs);\n\n\t\tif (!vimm)\n\t\t{\n\t\t\tjit_movr_ui(LOCALREG(v), LOCALREG(rs));\n\t\t\tjit_rshi_i(LOCALREG(v), LOCALREG(v), 31);\n\t\t\tjit_xorr_ui(LOCALREG(v), LOCALREG(v), LOCALREG(rs));\n\n\t\t\tMUL_Mxx_END(d, regMap, 3, v);\n\n\t\t\tregMap.ReleaseTempReg(v);\n\t\t}\n\t\telse\n\t\t\tMUL_Mxx_END_Imm(d, regMap, 3, v);\n\n\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\tregMap.Lock(rm);\n\n\t\tu32 hi = regMap.AllocTempReg();\n\t\tu32 lo = regMap.AllocTempReg();\n\n\t\tjit_mulr_i(LOCALREG(lo), LOCALREG(rs), LOCALREG(rm));\n\t\tjit_hmulr_i(LOCALREG(hi), LOCALREG(rs), LOCALREG(rm));\n\n\t\tregMap.Unlock(rm);\n\t\tregMap.Unlock(rs);\n\n\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(rn);\n\n\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(rd);\n\n\t\tjit_addcr_ui(LOCALREG(rn), LOCALREG(rn), LOCALREG(lo));\n\t\tjit_addxr_ui(LOCALREG(rd), LOCALREG(rd), LOCALREG(hi));\n\n\t\tregMap.ReleaseTempReg(lo);\n\t\tregMap.ReleaseTempReg(hi);\n\n\t\tif (d.S)\n\t\t{\n\t\t\tif (d.FlagsSet & FLAG_N)\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(rd), 31);\n\t\t\t\tPackCPSR(regMap, PSR_N, tmp);\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\t\t\tif (d.FlagsSet & FLAG_Z)\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_andr_ui(LOCALREG(tmp), LOCALREG(rn), LOCALREG(rd));\n\t\t\t\tjit_eqi_ui(LOCALREG(tmp), LOCALREG(tmp), 0);\n\t\t\t\tPackCPSR(regMap, PSR_Z, tmp);\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\t\t}\n\n\t\tregMap.Unlock(rn);\n\t\tregMap.Unlock(rd);\n\t}\n\n\tOPDECODER_DECL(IR_SMULxy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)) && regMap.IsImm(REGID(d.Rm)))\n\t\t{\n\t\t\ts32 tmp1, tmp2;\n\n\t\t\tif (d.X)\n\t\t\t\ttmp1 = HWORD(regMap.GetImm32(REGID(d.Rm)));\n\t\t\telse\n\t\t\t\ttmp1 = LWORD(regMap.GetImm32(REGID(d.Rm)));\n\n\t\t\tif (d.Y)\n\t\t\t\ttmp2 = HWORD(regMap.GetImm32(REGID(d.Rs)));\n\t\t\telse\n\t\t\t\ttmp2 = LWORD(regMap.GetImm32(REGID(d.Rs)));\n\n\t\t\tregMap.SetImm32(REGID(d.Rd), (u32)(tmp1 * tmp2));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 tmp1, tmp2;\n\n\t\t\t{\n\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\ttmp1 = regMap.AllocTempReg();\n\n\t\t\t\tif (d.X)\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp1), LOCALREG(rm), 16);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tjit_lshi_i(LOCALREG(tmp1), LOCALREG(rm), 16);\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp1), LOCALREG(tmp1), 16);\n\t\t\t\t\t//jit_extr_s_ui(LOCALREG(tmp1), LOCALREG(rm));\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rm);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\ttmp2 = regMap.AllocTempReg();\n\n\t\t\t\tif (d.Y)\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp2), LOCALREG(rs), 16);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tjit_lshi_i(LOCALREG(tmp2), LOCALREG(rs), 16);\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp2), LOCALREG(tmp2), 16);\n\t\t\t\t\t//jit_extr_s_ui(LOCALREG(tmp2), LOCALREG(rs));\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rs);\n\t\t\t}\n\n\t\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rd);\n\n\t\t\tjit_mulr_i(LOCALREG(rd), LOCALREG(tmp1), LOCALREG(tmp2));\n\n\t\t\tregMap.Unlock(rd);\n\n\t\t\tregMap.ReleaseTempReg(tmp1);\n\t\t\tregMap.ReleaseTempReg(tmp2);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_SMLAxy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (regMap.IsImm(REGID(d.Rs)) && regMap.IsImm(REGID(d.Rm)) && regMap.IsImm(REGID(d.Rn)))\n\t\t{\n\t\t\ts32 tmp1, tmp2;\n\n\t\t\tif (d.X)\n\t\t\t\ttmp1 = HWORD(regMap.GetImm32(REGID(d.Rm)));\n\t\t\telse\n\t\t\t\ttmp1 = LWORD(regMap.GetImm32(REGID(d.Rm)));\n\n\t\t\tif (d.Y)\n\t\t\t\ttmp2 = HWORD(regMap.GetImm32(REGID(d.Rs)));\n\t\t\telse\n\t\t\t\ttmp2 = LWORD(regMap.GetImm32(REGID(d.Rs)));\n\n\t\t\tu32 mul = (u32)(tmp1 * tmp2);\n\t\t\tu32 mla = mul + regMap.GetImm32(REGID(d.Rn));\n\n\t\t\tif (OverflowFromADD(mla, mul, regMap.GetImm32(REGID(d.Rn))))\n\t\t\t\tPackCPSRImm(regMap, PSR_Q, 1);\n\n\t\t\tregMap.SetImm32(REGID(d.Rd), mla);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 tmp1, tmp2;\n\n\t\t\t{\n\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\ttmp1 = regMap.AllocTempReg();\n\n\t\t\t\tif (d.X)\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp1), LOCALREG(rm), 16);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tjit_lshi_i(LOCALREG(tmp1), LOCALREG(rm), 16);\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp1), LOCALREG(tmp1), 16);\n\t\t\t\t\t//jit_extr_s_ui(LOCALREG(tmp1), LOCALREG(rm));\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rm);\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tu32 rs = regMap.MapReg(REGID(d.Rs));\n\t\t\t\tregMap.Lock(rs);\n\n\t\t\t\ttmp2 = regMap.AllocTempReg();\n\n\t\t\t\tif (d.Y)\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp2), LOCALREG(rs), 16);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tjit_lshi_i(LOCALREG(tmp2), LOCALREG(rs), 16);\n\t\t\t\t\tjit_rshi_i(LOCALREG(tmp2), LOCALREG(tmp2), 16);\n\t\t\t\t\t//jit_extr_s_ui(LOCALREG(tmp2), LOCALREG(rs));\n\t\t\t\t}\n\n\t\t\t\tregMap.Unlock(rs);\n\t\t\t}\n\n\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\tregMap.Lock(rn);\n\t\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(rd);\n\n\t\t\tjit_mulr_i(LOCALREG(tmp1), LOCALREG(tmp1), LOCALREG(tmp2));\n\t\t\tjit_movr_ui(LOCALREG(tmp2), LOCALREG(rn));\n\t\t\tjit_addr_ui(LOCALREG(rd), LOCALREG(tmp1), LOCALREG(rn));\n\n\t\t\tjit_xorr_ui(LOCALREG(tmp2), LOCALREG(tmp1), LOCALREG(tmp2));\n\t\t\tjit_notr_ui(LOCALREG(tmp2), LOCALREG(tmp2));\n\t\t\tjit_xorr_ui(LOCALREG(tmp1), LOCALREG(rd), LOCALREG(tmp1));\n\t\t\tjit_andr_ui(LOCALREG(tmp1), LOCALREG(tmp1), LOCALREG(tmp2));\n\t\t\tjit_rshi_ui(LOCALREG(tmp1), LOCALREG(tmp1), 31);\n\n\t\t\tregMap.Unlock(rd);\n\t\t\tregMap.Unlock(rn);\n\n\t\t\tregMap.ReleaseTempReg(tmp2);\n\n\t\t\tu32 cpsr = regMap.MapReg(RegisterMap::CPSR);\n\t\t\tregMap.Lock(cpsr);\n\n\t\t\tjit_lshi_ui(LOCALREG(tmp1), LOCALREG(tmp1), PSR_Q_BITSHIFT);\n\t\t\tjit_orr_ui(LOCALREG(cpsr), LOCALREG(cpsr), LOCALREG(tmp1));\n\n\t\t\tregMap.Unlock(cpsr);\n\n\t\t\tregMap.ReleaseTempReg(tmp1);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_SMULWy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(REGID(d.Rs));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_SMLAWy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rs));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_SMLALxy)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rs));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_LDR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tenum AddressRegType\n\t\t{\n\t\t\tTEMPREG,\n\t\t\tIMM\n\t\t};\n\n\t\tu32 adr = INVALID_REG_ID;\n\t\tAddressRegType adr_type = TEMPREG;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + d.Immediate;\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - d.Immediate;\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + shift_out.shiftop;\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - shift_out.shiftop;\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addi_ui(LOCALREG(adr), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subi_ui(LOCALREG(adr), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t}\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\n\t\t\t\tshift_out.Clean(regMap);\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t{\n\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(rn), LOCALREG(adr));\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tadr_type = IMM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\tjit_movr_ui(LOCALREG(adr), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (adr_type == IMM)\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr + d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr - d.Immediate);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(adr), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(rn), LOCALREG(adr), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t{\n\t\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr + shift_out.shiftop);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr - shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(adr), shift_out.shiftop);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subi_ui(LOCALREG(rn), LOCALREG(adr), shift_out.shiftop);\n\n\t\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(shift_out.shiftop), adr);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_rsbi_ui(LOCALREG(rn), LOCALREG(shift_out.shiftop), adr);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addr_ui(LOCALREG(rn), LOCALREG(adr), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subr_ui(LOCALREG(rn), LOCALREG(adr), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t}\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\n\t\t\t\tshift_out.Clean(regMap);\n\t\t\t}\n\t\t}\n\n\t\tregMap.DiscardReg(REGID(d.Rd), true);\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\targs.clear();\n\t\tflushs.clear();\n\n\t\tABIOp op;\n\n\t\tif (adr_type == TEMPREG)\n\t\t{\n\t\t\top.type = ABIOp::TEMPREG;\n\t\t\top.regdata = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\t\telse if (adr_type == IMM)\n\t\t{\n\t\t\top.type = ABIOp::IMM;\n\t\t\top.immdata.type = ImmData::IMM32;\n\t\t\top.immdata.imm32 = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\n\t\top.type = ABIOp::GUSETREGPTR;\n\t\top.regdata = d.Rd;\n\t\targs.push_back(op);\n\n\t\tMemOp1 func = NULL;\n\n\t\tif (d.B)\n\t\t\tfunc = LDRB_Tab[PROCNUM][MEMTYPE_GENERIC];\n\t\telse\n\t\t\tfunc = LDR_Tab[PROCNUM][MEMTYPE_GENERIC];\n\n\t\tregMap.CallABI((void*)func, args, flushs, tmp);\n\n\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(execyc);\n\n\t\tjit_addr_ui(LOCALREG(execyc), LOCALREG(execyc), LOCALREG(tmp));\n\n\t\tregMap.Unlock(execyc);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\tif (!d.B && d.R15Modified)\n\t\t{\n\t\t\tu32 r15 = regMap.MapReg(RegisterMap::R15, RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(r15);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(r15), 1);\n\t\t\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFE);\n\n\t\t\t\tPackCPSR(regMap, PSR_T, tmp);\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFC);\n\t\t\t}\n\n\t\t\tregMap.Unlock(r15);\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_STR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tenum AddressRegType\n\t\t{\n\t\t\tTEMPREG,\n\t\t\tGUSETREG,\n\t\t\tIMM\n\t\t};\n\n\t\tu32 adr = INVALID_REG_ID;\n\t\tAddressRegType adr_type = TEMPREG;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + d.Immediate;\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - d.Immediate;\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + shift_out.shiftop;\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - shift_out.shiftop;\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addi_ui(LOCALREG(adr), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subi_ui(LOCALREG(adr), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t}\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\n\t\t\t\tshift_out.Clean(regMap);\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t{\n\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(rn), LOCALREG(adr));\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tadr = d.Rn;\n\t\t\tadr_type = GUSETREG;\n\t\t}\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\targs.clear();\n\t\tflushs.clear();\n\n\t\tABIOp op;\n\n\t\tif (adr_type == TEMPREG)\n\t\t{\n\t\t\top.type = ABIOp::TEMPREG;\n\t\t\top.regdata = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\t\telse if (adr_type == GUSETREG)\n\t\t{\n\t\t\top.type = ABIOp::GUSETREG;\n\t\t\top.regdata = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\t\telse if (adr_type == IMM)\n\t\t{\n\t\t\top.type = ABIOp::IMM;\n\t\t\top.immdata.type = ImmData::IMM32;\n\t\t\top.immdata.imm32 = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\n\t\top.type = ABIOp::GUSETREG;\n\t\top.regdata = d.Rd;\n\t\targs.push_back(op);\n\n\t\tMemOp2 func = NULL;\n\n\t\tif (d.B)\n\t\t\tfunc = STRB_Tab[PROCNUM][MEMTYPE_GENERIC];\n\t\telse\n\t\t\tfunc = STR_Tab[PROCNUM][MEMTYPE_GENERIC];\n\n\t\tregMap.CallABI((void*)func, args, flushs, tmp);\n\n\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(execyc);\n\n\t\tjit_addr_ui(LOCALREG(execyc), LOCALREG(execyc), LOCALREG(tmp));\n\n\t\tregMap.Unlock(execyc);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\tif (!d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) + d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) - d.Immediate);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(rn), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(rn), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tShiftOut shift_out = IRShiftOpGenerate(d, regMap, false);\n\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)) && shift_out.shiftopimm)\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) + shift_out.shiftop);\n\t\t\t\t\telse\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) - shift_out.shiftop);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tif (shift_out.shiftopimm)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subi_ui(LOCALREG(rn), LOCALREG(rn), shift_out.shiftop);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addr_ui(LOCALREG(rn), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subr_ui(LOCALREG(rn), LOCALREG(rn), LOCALREG(shift_out.shiftop));\n\t\t\t\t\t}\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\n\t\t\t\tshift_out.Clean(regMap);\n\t\t\t}\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_LDRx)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tenum AddressRegType\n\t\t{\n\t\t\tTEMPREG,\n\t\t\tIMM\n\t\t};\n\n\t\tu32 adr = INVALID_REG_ID;\n\t\tAddressRegType adr_type = TEMPREG;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + d.Immediate;\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - d.Immediate;\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)) && regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + regMap.GetImm32(REGID(d.Rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - regMap.GetImm32(REGID(d.Rm));\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(rm));\n\n\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t{\n\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(rn), LOCALREG(adr));\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t{\n\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn));\n\n\t\t\t\tadr_type = IMM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\tjit_movr_ui(LOCALREG(adr), LOCALREG(rn));\n\n\t\t\t\tregMap.Unlock(rn);\n\t\t\t}\n\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (adr_type == IMM)\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr + d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr - d.Immediate);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(adr), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(rn), LOCALREG(adr), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t{\n\t\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr + regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr - regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(adr), regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subi_ui(LOCALREG(rn), LOCALREG(adr), regMap.GetImm32(REGID(d.Rm)));\n\n\t\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\tregMap.Lock(rm);\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(rm), adr);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_rsbi_ui(LOCALREG(rn), LOCALREG(rm), adr);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (d.U)\n\t\t\t\t\t\t\tjit_addr_ui(LOCALREG(rn), LOCALREG(adr), LOCALREG(rm));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tjit_subr_ui(LOCALREG(rn), LOCALREG(adr), LOCALREG(rm));\n\t\t\t\t\t}\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tregMap.DiscardReg(REGID(d.Rd), true);\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\targs.clear();\n\t\tflushs.clear();\n\n\t\tABIOp op;\n\n\t\tif (adr_type == TEMPREG)\n\t\t{\n\t\t\top.type = ABIOp::TEMPREG;\n\t\t\top.regdata = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\t\telse if (adr_type == IMM)\n\t\t{\n\t\t\top.type = ABIOp::IMM;\n\t\t\top.immdata.type = ImmData::IMM32;\n\t\t\top.immdata.imm32 = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\n\t\top.type = ABIOp::GUSETREGPTR;\n\t\top.regdata = d.Rd;\n\t\targs.push_back(op);\n\n\t\tMemOp1 func = NULL;\n\n\t\tif (d.H)\n\t\t{\n\t\t\tif (d.S)\n\t\t\t\tfunc = LDRSH_Tab[PROCNUM][MEMTYPE_GENERIC];\n\t\t\telse\n\t\t\t\tfunc = LDRH_Tab[PROCNUM][MEMTYPE_GENERIC];\n\t\t}\n\t\telse\n\t\t\tfunc = LDRSB_Tab[PROCNUM][MEMTYPE_GENERIC];\n\n\t\tregMap.CallABI((void*)func, args, flushs, tmp);\n\n\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(execyc);\n\n\t\tjit_addr_ui(LOCALREG(execyc), LOCALREG(execyc), LOCALREG(tmp));\n\n\t\tregMap.Unlock(execyc);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\t}\n\n\tOPDECODER_DECL(IR_STRx)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tenum AddressRegType\n\t\t{\n\t\t\tTEMPREG,\n\t\t\tGUSETREG,\n\t\t\tIMM\n\t\t};\n\n\t\tu32 adr = INVALID_REG_ID;\n\t\tAddressRegType adr_type = TEMPREG;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + d.Immediate;\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - d.Immediate;\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(adr), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)) && regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) + regMap.GetImm32(REGID(d.Rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tadr = regMap.GetImm32(REGID(d.Rn)) - regMap.GetImm32(REGID(d.Rm));\n\n\t\t\t\t\tadr_type = IMM;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\t\t\t\tregMap.Lock(rn);\n\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\tadr = regMap.AllocTempReg();\n\t\t\t\t\tadr_type = TEMPREG;\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subr_ui(LOCALREG(adr), LOCALREG(rn), LOCALREG(rm));\n\n\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (d.W)\n\t\t\t{\n\t\t\t\tif (adr_type == IMM)\n\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), adr);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tjit_movr_ui(LOCALREG(rn), LOCALREG(adr));\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tadr = d.Rn;\n\t\t\tadr_type = GUSETREG;\n\t\t}\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\targs.clear();\n\t\tflushs.clear();\n\n\t\tABIOp op;\n\n\t\tif (adr_type == TEMPREG)\n\t\t{\n\t\t\top.type = ABIOp::TEMPREG;\n\t\t\top.regdata = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\t\telse if (adr_type == GUSETREG)\n\t\t{\n\t\t\top.type = ABIOp::GUSETREG;\n\t\t\top.regdata = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\t\telse if (adr_type == IMM)\n\t\t{\n\t\t\top.type = ABIOp::IMM;\n\t\t\top.immdata.type = ImmData::IMM32;\n\t\t\top.immdata.imm32 = adr;\n\t\t\targs.push_back(op);\n\t\t}\n\n\t\top.type = ABIOp::GUSETREG;\n\t\top.regdata = d.Rd;\n\t\targs.push_back(op);\n\n\t\tMemOp2 func = STRH_Tab[PROCNUM][MEMTYPE_GENERIC];\n\n\t\tregMap.CallABI((void*)func, args, flushs, tmp);\n\n\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\tregMap.Lock(execyc);\n\n\t\tjit_addr_ui(LOCALREG(execyc), LOCALREG(execyc), LOCALREG(tmp));\n\n\t\tregMap.Unlock(execyc);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\tif (!d.P)\n\t\t{\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) + d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) - d.Immediate);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY);\n\t\t\t\t\tregMap.Lock(rn);\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addi_ui(LOCALREG(rn), LOCALREG(rn), d.Immediate);\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subi_ui(LOCALREG(rn), LOCALREG(rn), d.Immediate);\n\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (regMap.IsImm(REGID(d.Rn)) && regMap.IsImm(REGID(d.Rm)))\n\t\t\t\t{\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) + regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t\telse\n\t\t\t\t\t\tregMap.SetImm32(REGID(d.Rn), regMap.GetImm32(REGID(d.Rn)) - regMap.GetImm32(REGID(d.Rm)));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 rn = regMap.MapReg(REGID(d.Rn), RegisterMap::MAP_DIRTY);\n\t\t\t\t\tregMap.Lock(rn);\n\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\t\tif (d.U)\n\t\t\t\t\t\tjit_addr_ui(LOCALREG(rn), LOCALREG(rn), LOCALREG(rm));\n\t\t\t\t\telse\n\t\t\t\t\t\tjit_subr_ui(LOCALREG(rn), LOCALREG(rn), LOCALREG(rm));\n\n\t\t\t\t\tregMap.Unlock(rm);\n\t\t\t\t\tregMap.Unlock(rn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_LDRD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tif(!d.I)\n\t\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(REGID(d.Rd+1));\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_STRD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tif(!d.I)\n\t\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(REGID(d.Rd+1));\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_LDREX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_STREX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_LDM)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tfor (u32 RegisterList = d.RegisterList, n = 0; RegisterList; RegisterList >>= 1, n++)\n\t\t{\n\t\t\tif (RegisterList & 0x1)\n\t\t\t\tregMap.FlushGuestReg(REGID(n));\n\t\t}\n\t\tif (d.TbitModified)\n\t\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\t\tif (d.S)\n\t\t{\n\t\t\tfor (u32 i = RegisterMap::R8; i <= RegisterMap::R14; i++)\n\t\t\t\tregMap.FlushGuestReg((RegisterMap::GuestRegId)i);\n\t\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\t\t\tregMap.FlushGuestReg(RegisterMap::SPSR);\n\t\t}\n\n\t\tFallback2Interpreter(d, regMap);\n\n\t\tif (d.R15Modified)\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_STM)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tfor (u32 RegisterList = d.RegisterList, n = 0; RegisterList; RegisterList >>= 1, n++)\n\t\t{\n\t\t\tif (RegisterList & 0x1)\n\t\t\t\tregMap.FlushGuestReg(REGID(n));\n\t\t}\n\t\tif (d.S)\n\t\t{\n\t\t\tfor (u32 i = RegisterMap::R8; i <= RegisterMap::R14; i++)\n\t\t\t\tregMap.FlushGuestReg((RegisterMap::GuestRegId)i);\n\t\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\t\t\tregMap.FlushGuestReg(RegisterMap::SPSR);\n\t\t}\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_SWP)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\n\t\tFallback2Interpreter(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_B)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tregMap.SetImm32(RegisterMap::R15, d.Immediate);\n\n\t\tR15ModifiedGenerate(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_BL)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tregMap.SetImm32(RegisterMap::R14, d.CalcNextInstruction(d) | d.ThumbFlag);\n\t\tregMap.SetImm32(RegisterMap::R15, d.Immediate);\n\n\t\tR15ModifiedGenerate(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_BX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\tregMap.Lock(rn);\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tjit_movr_ui(LOCALREG(tmp), LOCALREG(rn));\n\n\t\tregMap.Unlock(rn);\n\n\t\tu32 r15 = regMap.MapReg(RegisterMap::R15, RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\tregMap.Lock(r15);\n\n\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(tmp), 1);\n\t\tjit_lshi_ui(LOCALREG(r15), LOCALREG(r15), 1);\n\t\tjit_ori_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFC);\n\t\tjit_andr_ui(LOCALREG(r15), LOCALREG(tmp), LOCALREG(r15));\n\n\t\tregMap.Unlock(r15);\n\n\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(tmp), 1);\n\t\tPackCPSR(regMap, PSR_T, tmp);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\tR15ModifiedGenerate(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_BLX)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rn = regMap.MapReg(REGID(d.Rn));\n\t\tregMap.Lock(rn);\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tjit_movr_ui(LOCALREG(tmp), LOCALREG(rn));\n\n\t\tregMap.Unlock(rn);\n\n\t\tu32 r15 = regMap.MapReg(RegisterMap::R15, RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\tregMap.Lock(r15);\n\n\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(tmp), 1);\n\t\tjit_lshi_ui(LOCALREG(r15), LOCALREG(r15), 1);\n\t\tjit_ori_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFC);\n\t\tjit_andr_ui(LOCALREG(r15), LOCALREG(tmp), LOCALREG(r15));\n\n\t\tregMap.Unlock(r15);\n\n\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(tmp), 1);\n\t\tPackCPSR(regMap, PSR_T, tmp);\n\n\t\tregMap.ReleaseTempReg(tmp);\n\n\t\tregMap.SetImm32(RegisterMap::R14, d.CalcNextInstruction(d) | d.ThumbFlag);\n\n\t\tR15ModifiedGenerate(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_SWI)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\tbool bypassBuiltinSWI = \n\t\t\t(GETCPU.intVector == 0x00000000 && PROCNUM==0)\n\t\t\t|| (GETCPU.intVector == 0xFFFF0000 && PROCNUM==1);\n\n\t\tif (GETCPU.swi_tab && !bypassBuiltinSWI)\n\t\t{\n\t\t\tif (d.MayHalt)\n\t\t\t{\n\t\t\t\tu32 cpuptr = regMap.GetCpuPtrReg();\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_movi_ui(LOCALREG(tmp), d.Address);\n\t\t\t\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\t\t\tjit_movi_ui(LOCALREG(tmp), d.CalcNextInstruction(d));\n\t\t\t\tjit_stxi_ui(jit_field(armcpu_t, next_instruction), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\t\t\t//regMap.SetImm32(RegisterMap::R15, d.CalcNextInstruction(d));\n\t\t\t\t//regMap.FlushGuestReg(RegisterMap::R15);\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\n\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\targs.clear();\n\t\t\tflushs.clear();\n\n\t\t\tfor (u32 i = RegisterMap::R0; i <= RegisterMap::R3; i++)\n\t\t\t\tflushs.push_back((RegisterMap::GuestRegId)i);\n\n\t\t\tregMap.CallABI((void*)GETCPU.swi_tab[d.Immediate], args, flushs, tmp);\n\n\t\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(execyc);\n\n\t\t\tjit_addr_ui(LOCALREG(execyc), LOCALREG(execyc), LOCALREG(tmp));\n\t\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), 3);\n\n\t\t\tregMap.Unlock(execyc);\n\n\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\tif (d.MayHalt)\n\t\t\t{\n\t\t\t\tu32 cpuptr = regMap.GetCpuPtrReg();\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_ldxi_ui(LOCALREG(tmp), LOCALREG(cpuptr), jit_field(armcpu_t, next_instruction));\n\t\t\t\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 tmp = regMap.AllocTempReg(true);\n\n\t\t\tu32 cpsr = regMap.MapReg(RegisterMap::CPSR);\n\t\t\tregMap.Lock(cpsr);\n\n\t\t\tjit_movr_ui(LOCALREG(tmp), LOCALREG(cpsr));\n\n\t\t\tregMap.Unlock(cpsr);\n\n\t\t\t{\n\t\t\t\targs.clear();\n\t\t\t\tflushs.clear();\n\n\t\t\t\tfor (u32 i = RegisterMap::R8; i <= RegisterMap::R14; i++)\n\t\t\t\t\tflushs.push_back((RegisterMap::GuestRegId)i);\n\t\t\t\tflushs.push_back(RegisterMap::CPSR);\n\t\t\t\tflushs.push_back(RegisterMap::SPSR);\n\n\t\t\t\tABIOp op;\n\n\t\t\t\top.type = ABIOp::HOSTREG;\n\t\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = SVC;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\tregMap.CallABI((void*)&armcpu_switchMode, args, flushs);\n\t\t\t}\n\n\t\t\tregMap.SetImm32(RegisterMap::R14, d.CalcNextInstruction(d));\n\n\t\t\tu32 spsr = regMap.MapReg(RegisterMap::SPSR);\n\n\t\t\tjit_movr_ui(LOCALREG(spsr), LOCALREG(tmp));\n\n\t\t\tregMap.Unlock(spsr);\n\n\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\tPackCPSRImm(regMap, PSR_T, 0);\n\t\t\tPackCPSRImm(regMap, PSR_I, 1);\n\n\t\t\t{\n\t\t\t\targs.clear();\n\t\t\t\tflushs.clear();\n\n\t\t\t\tABIOp op;\n\n\t\t\t\top.type = ABIOp::HOSTREG;\n\t\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\t\targs.push_back(op);\n\n\t\t\t\tregMap.CallABI((void*)&armcpu_changeCPSR, args, flushs);\n\t\t\t}\n\n\t\t\tu32 r15 = regMap.MapReg(RegisterMap::R15, RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\t\tregMap.Lock(r15);\n\t\t\tu32 cpuptr = regMap.GetCpuPtrReg();\n\n\t\t\tjit_ldxi_ui(LOCALREG(r15), LOCALREG(cpuptr), jit_field(armcpu_t, intVector));\n\t\t\tjit_addi_ui(LOCALREG(r15), LOCALREG(r15), 0x08);\n\n\t\t\tregMap.Unlock(r15);\n\n\t\t\tu32 execyc = regMap.MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\n\t\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), 3);\n\n\t\t\tregMap.Unlock(execyc);\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_MSR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\t\tstd::vector<u32> states;\n\n\t\tif (d.P)\n\t\t{\n\t\t\tu32 byte_mask = (BIT0(d.OpData)?0x000000FF:0x00000000) |\n\t\t\t\t\t\t\t(BIT1(d.OpData)?0x0000FF00:0x00000000) |\n\t\t\t\t\t\t\t(BIT2(d.OpData)?0x00FF0000:0x00000000) |\n\t\t\t\t\t\t\t(BIT3(d.OpData)?0xFF000000:0x00000000);\n\n\t\t\tu32 state_start = regMap.StoreState();\n\n\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\tUnpackCPSR(regMap, PSR_MODE, tmp);\n\t\t\tjit_insn *done1 = jit_beqi_ui(jit_forward(), LOCALREG(tmp), USR);\n\t\t\tjit_insn *done2 = jit_beqi_ui(jit_forward(), LOCALREG(tmp), SYS);\n\n\t\t\tregMap.ReleaseTempReg(tmp);\n\n\t\t\tu32 spsr = regMap.MapReg(RegisterMap::SPSR, RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(spsr);\n\n\t\t\tif (d.I)\n\t\t\t{\n\t\t\t\tjit_andi_ui(LOCALREG(spsr), LOCALREG(spsr), ~byte_mask);\n\t\t\t\tjit_ori_ui(LOCALREG(spsr), LOCALREG(spsr), byte_mask & d.Immediate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\tregMap.Lock(rm);\n\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\tjit_andi_ui(LOCALREG(spsr), LOCALREG(spsr), ~byte_mask);\n\t\t\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(rm), byte_mask);\n\t\t\t\tjit_orr_ui(LOCALREG(spsr), LOCALREG(spsr), LOCALREG(tmp));\n\n\t\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\t\tregMap.Unlock(rm);\n\t\t\t}\n\n\t\t\tregMap.Unlock(spsr);\n\n\t\t\t{\n\t\t\t\targs.clear();\n\t\t\t\tflushs.clear();\n\n\t\t\t\tABIOp op;\n\n\t\t\t\top.type = ABIOp::HOSTREG;\n\t\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\t\targs.push_back(op);\n\n\t\t\t\tregMap.CallABI((void*)&armcpu_changeCPSR, args, flushs);\n\t\t\t}\n\n\t\t\tjit_insn* pt_end1 = PrepareSLZone();\n\n\t\t\tu32 state_end1 = regMap.StoreState();\n\n\t\t\tjit_patch(done1);\n\t\t\tjit_patch(done2);\n\n\t\t\tregMap.RestoreState(state_start);\n\t\t\tu32 state_end2 = regMap.StoreState();\n\n\t\t\t// merge states\n\t\t\tstates.clear();\n\t\t\tstates.push_back(state_end1);\n\t\t\tstates.push_back(state_end2);\n\n\t\t\tu32 state_merge = regMap.CalcStates(state_start, states);\n\n\t\t\t// generate merge code\n\t\t\tregMap.RestoreState(state_end2);\n\t\t\tregMap.MergeToStates(state_merge);\n\n\t\t\t// backup pc\n\t\t\tjit_insn* lable_end = jit_get_label();\n\n\t\t\t// generate merge code\n\t\t\tregMap.RestoreState(state_end1);\n\t\t\tjit_set_ip(pt_end1);\n\t\t\tregMap.MergeToStates(state_merge);\n\t\t\tjit_jmpi(lable_end);\n\n\t\t\t// restore pc\n\t\t\tregMap.RestoreState(state_merge);\n\t\t\tjit_set_ip(lable_end);\n\n\t\t\tregMap.CleanState(state_start);\n\t\t\tregMap.CleanState(state_end1);\n\t\t\tregMap.CleanState(state_end2);\n\t\t\tregMap.CleanState(state_merge);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 byte_mask_usr = (BIT3(d.OpData)?0xFF000000:0x00000000);\n\t\t\tu32 byte_mask_other = (BIT0(d.OpData)?0x000000FF:0x00000000) |\n\t\t\t\t\t\t\t\t(BIT1(d.OpData)?0x0000FF00:0x00000000) |\n\t\t\t\t\t\t\t\t(BIT2(d.OpData)?0x00FF0000:0x00000000) |\n\t\t\t\t\t\t\t\t(BIT3(d.OpData)?0xFF000000:0x00000000);\n\n\t\t\tu32 byte_mask = regMap.AllocTempReg(true);\n\t\t\tu32 mode = regMap.AllocTempReg();\n\n\t\t\tUnpackCPSR(regMap, PSR_MODE, mode);\n\t\t\tjit_insn *eq_usr = jit_beqi_ui(jit_forward(), LOCALREG(mode), USR);\n\t\t\tjit_movi_ui(LOCALREG(byte_mask), byte_mask_other);\n\t\t\tjit_insn *eq_usr_done = jit_jmpi(jit_forward());\n\t\t\tjit_patch(eq_usr);\n\t\t\tjit_movi_ui(LOCALREG(byte_mask), byte_mask_usr);\n\t\t\tjit_patch(eq_usr_done);\n\n\t\t\tif (BIT0(d.OpData))\n\t\t\t{\n\t\t\t\tjit_insn *done = jit_beqi_ui(jit_forward(), LOCALREG(mode), USR);\n\t\t\t\tregMap.ReleaseTempReg(mode);\n\n\t\t\t\tu32 state_start = regMap.StoreState();\n\n\t\t\t\t{\n\t\t\t\t\targs.clear();\n\t\t\t\t\tflushs.clear();\n\n\t\t\t\t\tfor (u32 i = RegisterMap::R8; i <= RegisterMap::R14; i++)\n\t\t\t\t\t\tflushs.push_back((RegisterMap::GuestRegId)i);\n\t\t\t\t\tflushs.push_back(RegisterMap::CPSR);\n\t\t\t\t\tflushs.push_back(RegisterMap::SPSR);\n\n\t\t\t\t\tABIOp op;\n\n\t\t\t\t\top.type = ABIOp::HOSTREG;\n\t\t\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\t\t\targs.push_back(op);\n\n\t\t\t\t\tif (d.I)\n\t\t\t\t\t{\n\t\t\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\t\t\top.immdata.imm8 = d.Immediate & 0x1F;\n\t\t\t\t\t\targs.push_back(op);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\t\t\tregMap.Lock(rm);\n\t\t\t\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\t\t\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(rm), 0x1F);\n\n\t\t\t\t\t\tregMap.Unlock(rm);\n\n\t\t\t\t\t\top.type = ABIOp::TEMPREG;\n\t\t\t\t\t\top.regdata = tmp;\n\t\t\t\t\t\targs.push_back(op);\n\t\t\t\t\t}\n\n\t\t\t\t\tregMap.CallABI((void*)&armcpu_switchMode, args, flushs);\n\t\t\t\t}\n\n\t\t\t\tjit_insn* pt_end1 = PrepareSLZone();\n\n\t\t\t\tu32 state_end1 = regMap.StoreState();\n\n\t\t\t\tjit_patch(done);\n\n\t\t\t\tregMap.RestoreState(state_start);\n\t\t\t\tu32 state_end2 = regMap.StoreState();\n\n\t\t\t\t// merge states\n\t\t\t\tstates.clear();\n\t\t\t\tstates.push_back(state_end1);\n\t\t\t\tstates.push_back(state_end2);\n\n\t\t\t\tu32 state_merge = regMap.CalcStates(state_start, states);\n\n\t\t\t\t// generate merge code\n\t\t\t\tregMap.RestoreState(state_end2);\n\t\t\t\tregMap.MergeToStates(state_merge);\n\n\t\t\t\t// backup pc\n\t\t\t\tjit_insn* lable_end = jit_get_label();\n\n\t\t\t\t// generate merge code\n\t\t\t\tregMap.RestoreState(state_end1);\n\t\t\t\tjit_set_ip(pt_end1);\n\t\t\t\tregMap.MergeToStates(state_merge);\n\t\t\t\tjit_jmpi(lable_end);\n\n\t\t\t\t// restore pc\n\t\t\t\tregMap.RestoreState(state_merge);\n\t\t\t\tjit_set_ip(lable_end);\n\n\t\t\t\tregMap.CleanState(state_start);\n\t\t\t\tregMap.CleanState(state_end1);\n\t\t\t\tregMap.CleanState(state_end2);\n\t\t\t\tregMap.CleanState(state_merge);\n\t\t\t}\n\t\t\telse\n\t\t\t\tregMap.ReleaseTempReg(mode);\n\n\t\t\tu32 cpsr = regMap.MapReg(RegisterMap::CPSR, RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(cpsr);\n\t\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\t\tjit_notr_ui(LOCALREG(tmp), LOCALREG(byte_mask));\n\t\t\tjit_andr_ui(LOCALREG(cpsr), LOCALREG(cpsr), LOCALREG(tmp));\n\n\t\t\tif (d.I)\n\t\t\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(byte_mask), d.Immediate);\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 rm = regMap.MapReg(REGID(d.Rm));\n\t\t\t\tregMap.Lock(rm);\n\n\t\t\t\tjit_andr_ui(LOCALREG(tmp), LOCALREG(byte_mask), LOCALREG(rm));\n\n\t\t\t\tregMap.Unlock(rm);\n\t\t\t}\n\n\t\t\tjit_orr_ui(LOCALREG(cpsr), LOCALREG(cpsr), LOCALREG(tmp));\n\n\t\t\tregMap.ReleaseTempReg(tmp);\n\t\t\tregMap.Unlock(cpsr);\n\n\t\t\tregMap.ReleaseTempReg(byte_mask);\n\n\t\t\t{\n\t\t\t\targs.clear();\n\t\t\t\tflushs.clear();\n\n\t\t\t\tABIOp op;\n\n\t\t\t\top.type = ABIOp::HOSTREG;\n\t\t\t\top.regdata = regMap.GetCpuPtrReg();\n\t\t\t\targs.push_back(op);\n\n\t\t\t\tregMap.CallABI((void*)&armcpu_changeCPSR, args, flushs);\n\t\t\t}\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_MRS)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\tregMap.Lock(rd);\n\t\tu32 psr = regMap.MapReg(d.P ? RegisterMap::SPSR : RegisterMap::CPSR);\n\t\tregMap.Lock(psr);\n\n\t\tjit_movr_ui(LOCALREG(rd), LOCALREG(psr));\n\n\t\tregMap.Unlock(psr);\n\t\tregMap.Unlock(rd);\n\t}\n\n\tOPDECODER_DECL(IR_MCR)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.CPNum == 15)\n\t\t{\n\t\t\tstd::vector<ABIOp> args;\n\t\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\t\t{\n\t\t\t\targs.clear();\n\t\t\t\tflushs.clear();\n\n\t\t\t\tflushs.push_back(RegisterMap::CPSR);\n\n\t\t\t\tABIOp op;\n\n\t\t\t\top.type = ABIOp::GUSETREG;\n\t\t\t\top.regdata = REGID(d.Rd);\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CRn;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CRm;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CPOpc;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CP;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\tregMap.CallABI((void*)&armcp15_moveARM2CP, args, flushs);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tINFO(\"ARM%c: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", \n\t\t\t\tPROCNUM?'7':'9', d.CPNum, d.Rd, d.CRn, d.CRm, d.CPOpc, d.CP);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_MRC)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif (d.CPNum == 15)\n\t\t{\n\t\t\tstd::vector<ABIOp> args;\n\t\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\t\tif (d.Rd == 15)\n\t\t\t{\n\t\t\t\t// fallback to interpreter\n\t\t\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\n\t\t\t\tFallback2Interpreter(d, regMap);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\targs.clear();\n\t\t\t\tflushs.clear();\n\n\t\t\t\tflushs.push_back(RegisterMap::CPSR);\n\t\t\t\tflushs.push_back(REGID(d.Rd));\n\n\t\t\t\tABIOp op;\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMMPTR;\n\t\t\t\top.immdata.immptr = &GETCPU.R[d.Rd];\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CRn;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CRm;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CPOpc;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\top.type = ABIOp::IMM;\n\t\t\t\top.immdata.type = ImmData::IMM8;\n\t\t\t\top.immdata.imm8 = d.CP;\n\t\t\t\targs.push_back(op);\n\n\t\t\t\tregMap.CallABI((void*)&armcp15_moveCP2ARM, args, flushs);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tINFO(\"ARM%c: MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", \n\t\t\t\tPROCNUM?'7':'9', d.CPNum, d.Rd, d.CRn, d.CRm, d.CPOpc, d.CP);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_CLZ)\n\t{\n\t\tstruct CLZImp\n\t\t{\n\t\t\tstatic u32 Method(u32 in)\n\t\t\t{\n\t\t\t\tif (in == 0)\n\t\t\t\t\treturn 32;\n\n\t\t#ifdef _MSC_VER\n\t\t\t\tunsigned long out;\n\t\t\t\t_BitScanReverse(&out, in);\n\t\t\t\treturn out^0x1F;\n\t\t#else\n\t\t\t\treturn __builtin_clz(in);\n\t\t#endif\n\t\t\t}\n\t\t};\n\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\tABIOp op;\n\t\top.type = ABIOp::GUSETREG;\n\t\top.regdata = REGID(d.Rm);\n\t\targs.push_back(op);\n\n\t\tu32 tmp = regMap.AllocTempReg();\n\n\t\tregMap.CallABI((void*)&CLZImp::Method, args, flushs, tmp);\n\n\t\tu32 rd = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY | RegisterMap::MAP_NOTINIT);\n\t\tregMap.Lock(rd);\n\n\t\tjit_movr_ui(LOCALREG(rd), LOCALREG(tmp));\n\n\t\tregMap.Unlock(rd);\n\t\tregMap.ReleaseTempReg(tmp);\n\t}\n\n\tOPDECODER_DECL(IR_QADD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\n\t\tFallback2Interpreter(d, regMap);\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tu32 r15 = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(r15);\n\n\t\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFC);\n\n\t\t\tregMap.Unlock(r15);\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_QSUB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\n\t\tFallback2Interpreter(d, regMap);\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tu32 r15 = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(r15);\n\n\t\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFC);\n\n\t\t\tregMap.Unlock(r15);\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_QDADD)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\n\t\tFallback2Interpreter(d, regMap);\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tu32 r15 = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(r15);\n\n\t\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFC);\n\n\t\t\tregMap.Unlock(r15);\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_QDSUB)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\t// fallback to interpreter\n\t\tregMap.FlushGuestReg(REGID(d.Rn));\n\t\tregMap.FlushGuestReg(REGID(d.Rm));\n\t\tregMap.FlushGuestReg(REGID(d.Rd));\n\t\tregMap.FlushGuestReg(RegisterMap::CPSR);\n\n\t\tFallback2Interpreter(d, regMap);\n\t\tif (d.R15Modified)\n\t\t{\n\t\t\tu32 r15 = regMap.MapReg(REGID(d.Rd), RegisterMap::MAP_DIRTY);\n\t\t\tregMap.Lock(r15);\n\n\t\t\tjit_andi_ui(LOCALREG(r15), LOCALREG(r15), 0xFFFFFFFC);\n\n\t\t\tregMap.Unlock(r15);\n\n\t\t\tR15ModifiedGenerate(d, regMap);\n\t\t}\n\t}\n\n\tOPDECODER_DECL(IR_BLX_IMM)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tif(d.ThumbFlag)\n\t\t\tPackCPSRImm(regMap, PSR_T, 0);\n\t\telse\n\t\t\tPackCPSRImm(regMap, PSR_T, 1);\n\n\t\tregMap.SetImm32(RegisterMap::R14, d.CalcNextInstruction(d) | d.ThumbFlag);\n\t\tregMap.SetImm32(RegisterMap::R15, d.Immediate);\n\n\t\tR15ModifiedGenerate(d, regMap);\n\t}\n\n\tOPDECODER_DECL(IR_BKPT)\n\t{\n\t\tu32 PROCNUM = d.ProcessID;\n\n\t\tINFO(\"ARM%c: Unimplemented opcode BKPT\\n\", PROCNUM?'7':'9');\n\t}\n};\n\nstatic const IROpDecoder iropdecoder_set[IR_MAXNUM] = {\n#define TABDECL(x) ArmLJit::x##_Decoder\n#include \"ArmAnalyze_tabdef.inc\"\n#undef TABDECL\n};\n\n//------------------------------------------------------------\n//                         Code Buffer\n//------------------------------------------------------------\nstatic const u32 s_CacheReserveMin = 4 * 1024 * 1024;\nstatic u32 s_CacheReserve = 16 * 1024 * 1024;\nstatic MemBuffer* s_CodeBuffer = NULL;\n\nstatic void ReleaseCodeBuffer()\n{\n\tdelete s_CodeBuffer;\n\ts_CodeBuffer = NULL;\n}\n\nstatic void InitializeCodeBuffer()\n{\n\tReleaseCodeBuffer();\n\n\ts_CodeBuffer = new MemBuffer(MemBuffer::kRead|MemBuffer::kWrite|MemBuffer::kExec,s_CacheReserveMin);\n\ts_CodeBuffer->Reserve(s_CacheReserve);\n\ts_CacheReserve = s_CodeBuffer->GetReservedSize();\n\n\tINFO(\"CodeBuffer : start=%#p, size1=%u, size2=%u\\n\", \n\t\ts_CodeBuffer->GetBasePtr(), s_CodeBuffer->GetCommittedSize(), s_CacheReserve);\n}\n\nstatic void ResetCodeBuffer()\n{\n\tu8* base = s_CodeBuffer->GetBasePtr();\n\tu32 size = s_CodeBuffer->GetUsedSize();\n\n\tPROGINFO(\"CodeBuffer : used=%u\\n\", size);\n\n\ts_CodeBuffer->Reset();\n\n\tFlushIcacheSection(base, base + size);\n}\n\nstatic u8* AllocCodeBuffer(size_t size)\n{\n\t//return s_CodeBuffer->Alloc(size);\n\tstatic const u32 align = 4 - 1;\n\n\tu32 size_new = size + align;\n\n\tuintptr_t ptr = (uintptr_t)s_CodeBuffer->Alloc(size_new);\n\tif (ptr == 0)\n\t\treturn NULL;\n\n\tuintptr_t retptr = (ptr + align) & ~align;\n\n\treturn (u8*)retptr;\n}\n\nstatic void FreeCodeBuffer(size_t size)\n{\n\ts_CodeBuffer->Free(size);\n}\n\n//------------------------------------------------------------\n//                         Cpu\n//------------------------------------------------------------\nusing namespace ArmLJit;\n\nstatic ArmAnalyze *s_pArmAnalyze = NULL;\nstatic RegisterMap *s_pRegisterMap = NULL;\n\nstatic void AddExecuteCycles(u32 ConstCycles)\n{\n\tif (s_pRegisterMap->IsImm(RegisterMap::EXECUTECYCLES))\n\t{\n\t\tu32 execyc = s_pRegisterMap->GetImm32(RegisterMap::EXECUTECYCLES);\n\t\ts_pRegisterMap->SetImm32(RegisterMap::EXECUTECYCLES, execyc + ConstCycles);\n\t}\n\telse\n\t{\n\t\tu32 execyc = s_pRegisterMap->MapReg(RegisterMap::EXECUTECYCLES, RegisterMap::MAP_DIRTY);\n\t\ts_pRegisterMap->Lock(execyc);\n\n\t\tjit_addi_ui(LOCALREG(execyc), LOCALREG(execyc), ConstCycles);\n\n\t\ts_pRegisterMap->Unlock(execyc);\n\t}\n}\n\nstatic void EndSubBlock(u32 state_start, u32 state_end1, u32 state_end2, jit_insn* pt_end1)\n{\n\tstd::vector<u32> states;\n\n\t// merge states\n\tstates.clear();\n\tstates.push_back(state_end1);\n\tstates.push_back(state_end2);\n\n\tu32 state_merge = s_pRegisterMap->CalcStates(state_start, states);\n\n\t// generate merge code\n\ts_pRegisterMap->RestoreState(state_end2);\n\ts_pRegisterMap->MergeToStates(state_merge);\n\n\t// backup pc\n\tjit_insn* lable_end = jit_get_label();\n\n\t// generate merge code\n\ts_pRegisterMap->RestoreState(state_end1);\n\tjit_set_ip(pt_end1);\n\ts_pRegisterMap->MergeToStates(state_merge);\n\tjit_jmpi(lable_end);\n\n\t// restore pc\n\ts_pRegisterMap->RestoreState(state_merge);\n\tjit_set_ip(lable_end);\n\n\ts_pRegisterMap->CleanState(state_merge);\n}\n\nTEMPLATE static void armcpu_compileblock(BlockInfo &blockinfo, bool runblock)\n{\n\tstruct PrintBlock\n\t{\n\t\tstatic void Method(u32 ProcessID, u32 adr)\n\t\t{\n\t\t\tINFO(\"%s %x\\n\", CPU_STR(ProcessID), adr);\n\t\t}\n\t};\n\n\tstatic const u32 CondSimple[] = {PSR_Z_BITMASK, PSR_Z_BITMASK, \n\t\t\t\t\t\t\t\t\tPSR_C_BITMASK, PSR_C_BITMASK, \n\t\t\t\t\t\t\t\t\tPSR_N_BITMASK, PSR_N_BITMASK, \n\t\t\t\t\t\t\t\t\tPSR_V_BITMASK, PSR_V_BITMASK};\n\n\tstatic const u32 estimate_size = 64 * 1024;\n\tu8 *ptr = AllocCodeBuffer(estimate_size);\n\tif (!ptr)\n\t{\n\t\tINFO(\"JIT: cache full, reset cpu.\\n\");\n\n\t\tarm_ljit.Reset();\n\n\t\tptr = AllocCodeBuffer(estimate_size);\n\t\tif (!ptr)\n\t\t{\n\t\t\tINFO(\"JIT: alloc code buffer failed, size : %u.\\n\", estimate_size);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tuintptr_t opfun = (uintptr_t)jit_set_ip(ptr).ptr;\n\n\ts_pRegisterMap->Start(NULL, GETCPUPTR);\n\n\tDecoded *Instructions = blockinfo.Instructions;\n\ts32 InstructionsNum = blockinfo.InstructionsNum;\n\n\tu32 Address = Instructions[0].Address;\n\n\tu32 CurSubBlock = INVALID_SUBBLOCK;\n\tu32 CurInstructions = 0;\n\tu32 ConstCycles = 0;\n\tbool IsSubBlockStart = false;\n\n\tu32 StateSubBlockStart = INVALID_STATE_ID;//before subblock\n\n\tjit_insn* PatchSubBlockEnd2 = NULL;//not exec subblock\n\n#if 0\n\t{\n\t\tstd::vector<ABIOp> args;\n\t\tstd::vector<RegisterMap::GuestRegId> flushs;\n\n\t\tABIOp op;\n\t\t\n\t\top.type = ABIOp::IMM;\n\t\top.immdata.type = ImmData::IMM32;\n\t\top.immdata.imm32 = PROCNUM;\n\t\targs.push_back(op);\n\n\t\top.type = ABIOp::IMM;\n\t\top.immdata.type = ImmData::IMM32;\n\t\top.immdata.imm32 = Address;\n\t\targs.push_back(op);\n\n\t\ts_pRegisterMap->CallABI((void*)&PrintBlock::Method, args, flushs);\n\t}\n#endif\n\n\tfor (s32 i = 0; i < InstructionsNum; i++)\n\t{\n\t\tDecoded &Inst = Instructions[i];\n\n\t\tif (CurSubBlock != Inst.SubBlock)\n\t\t{\n\t\t\tif (ConstCycles > 0)\n\t\t\t{\n\t\t\t\tAddExecuteCycles(ConstCycles);\n\n\t\t\t\tConstCycles = 0;\n\t\t\t}\n\n\t\t\tif (IsSubBlockStart)\n\t\t\t{\n\t\t\t\tjit_insn* PatchSubBlockEnd1 = PrepareSLZone();//exec subblock\n\n\t\t\t\tu32 state_end1 = s_pRegisterMap->StoreState();//exec subblock\n\n\t\t\t\ts_pRegisterMap->RestoreState(StateSubBlockStart);\n\n\t\t\t\tjit_patch(PatchSubBlockEnd2);\n\t\t\t\tAddExecuteCycles(CurInstructions);\n\n\t\t\t\tu32 state_end2 = s_pRegisterMap->StoreState();//not exec subblock\n\n\t\t\t\tEndSubBlock(StateSubBlockStart, state_end1, state_end2, PatchSubBlockEnd1);\n\n\t\t\t\ts_pRegisterMap->CleanState(StateSubBlockStart);\n\t\t\t\ts_pRegisterMap->CleanState(state_end1);\n\t\t\t\ts_pRegisterMap->CleanState(state_end2);\n\n\t\t\t\tIsSubBlockStart = false;\n\n\t\t\t\tPatchSubBlockEnd2 = NULL;\n\t\t\t}\n\n\t\t\tif (Inst.Cond != 0xE && Inst.Cond != 0xF)\n\t\t\t{\n\t\t\t\tu32 cpsr = s_pRegisterMap->MapReg(RegisterMap::CPSR);\n\t\t\t\ts_pRegisterMap->Lock(cpsr);\n\t\t\t\tu32 tmp = s_pRegisterMap->AllocTempReg();\n\t\t\t\t\n\t\t\t\tif (Inst.Cond <= 0x07)\n\t\t\t\t{\n\t\t\t\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(cpsr), CondSimple[Inst.Cond]);\n\t\t\t\t\tif (Inst.Cond & 1)\n\t\t\t\t\t\tPatchSubBlockEnd2 = jit_bnei_ui(jit_forward(), LOCALREG(tmp), 0);//flag clear\n\t\t\t\t\telse\n\t\t\t\t\t\tPatchSubBlockEnd2 = jit_beqi_ui(jit_forward(), LOCALREG(tmp), 0);//flag set\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 table = s_pRegisterMap->AllocTempReg();\n\n\t\t\t\t\tjit_movi_p(LOCALREG(table), (void*)arm_cond_table);\n\t\t\t\t\tjit_rshi_ui(LOCALREG(tmp), LOCALREG(cpsr), 24);\n\t\t\t\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(tmp), 0xF0);\n\t\t\t\t\tjit_ori_ui(LOCALREG(tmp), LOCALREG(tmp), Inst.Cond);\n\t\t\t\t\tjit_ldxr_ui(LOCALREG(tmp), LOCALREG(table), LOCALREG(tmp));\n\t\t\t\t\tjit_andi_ui(LOCALREG(tmp), LOCALREG(tmp), Inst.ThumbFlag ? (1 << 0) : (1 << (CODE(Inst.Instruction.ArmOp))));\n\t\t\t\t\tPatchSubBlockEnd2 = jit_beqi_ui(jit_forward(), LOCALREG(tmp), 0);\n\n\t\t\t\t\ts_pRegisterMap->ReleaseTempReg(table);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ts_pRegisterMap->ReleaseTempReg(tmp);\n\t\t\t\ts_pRegisterMap->Unlock(cpsr);\n\n\t\t\t\tStateSubBlockStart = s_pRegisterMap->StoreState();\n\n\t\t\t\tIsSubBlockStart = true;\n\t\t\t}\n\n\t\t\tCurInstructions = 0;\n\n\t\t\tCurSubBlock = Inst.SubBlock;\n\t\t}\n\n\t\tCurInstructions++;\n\n\t\ts_pRegisterMap->SetImm32(RegisterMap::R15, Inst.CalcR15(Inst) & Inst.ReadPCMask);\n\t\t\n\t\t//if ((Inst.IROp >= IR_CMN && Inst.IROp <= IR_CMN))\n\t\t//{\n\t\t//\tu32 cpuptr = s_pRegisterMap->GetCpuPtrReg();\n\t\t//\tu32 tmp = s_pRegisterMap->AllocTempReg();\n\n\t\t//\tjit_movi_ui(LOCALREG(tmp), Inst.Address);\n\t\t//\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\t//\tjit_movi_ui(LOCALREG(tmp), Inst.CalcNextInstruction(Inst));\n\t\t//\tjit_stxi_ui(jit_field(armcpu_t, next_instruction), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\t//\ts_pRegisterMap->ReleaseTempReg(tmp);\n\n\t\t//\ts_pRegisterMap->FlushAll(true);\n\t\t//\tFallback2Interpreter(Inst, *s_pRegisterMap);\n\n\t\t//\tif (Inst.IROp == IR_SWI && Inst.MayHalt)\n\t\t//\t{\n\t\t//\t\tu32 cpuptr = s_pRegisterMap->GetCpuPtrReg();\n\t\t//\t\tu32 tmp = s_pRegisterMap->AllocTempReg();\n\n\t\t//\t\tjit_ldxi_ui(LOCALREG(tmp), LOCALREG(cpuptr), jit_field(armcpu_t, next_instruction));\n\t\t//\t\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\t\t//\t\ts_pRegisterMap->ReleaseTempReg(tmp);\n\t\t//\t}\n\n\t\t//\tif (Inst.R15Modified)\n\t\t//\t\tR15ModifiedGenerate(Inst, *s_pRegisterMap);\n\t\t//}\n\t\t//else\n\t\t{\n\t\t\t//s_pRegisterMap->FlushAll(true);\n\t\t\tiropdecoder_set[Inst.IROp](Inst, *s_pRegisterMap);\n\n\t\t\tif (!Inst.VariableCycles)\n\t\t\t\tConstCycles += Inst.ExecuteCycles;\n\t\t}\n\n\t\tif (Inst.R15Modified || (Inst.IROp == IR_SWI && Inst.MayHalt))\n\t\t{\n\t\t\tif (ConstCycles > 0)\n\t\t\t{\n\t\t\t\tAddExecuteCycles(ConstCycles);\n\n\t\t\t\tConstCycles = 0;\n\t\t\t}\n\n\t\t\ts_pRegisterMap->End(false);\n\t\t}\n\t}\n\n\tif (ConstCycles > 0)\n\t{\n\t\tAddExecuteCycles(ConstCycles);\n\n\t\tConstCycles = 0;\n\t}\n\n\tDecoded &LastIns = Instructions[InstructionsNum - 1];\n\tif (IsSubBlockStart)\n\t{\n\t\tjit_insn* PatchSubBlockEnd1 = PrepareSLZone();//exec subblock\n\n\t\tu32 state_end1 = s_pRegisterMap->StoreState();//exec subblock\n\n\t\ts_pRegisterMap->RestoreState(StateSubBlockStart);\n\n\t\tjit_patch(PatchSubBlockEnd2);\n\t\tAddExecuteCycles(CurInstructions);\n\n\t\tu32 state_end2 = s_pRegisterMap->StoreState();//not exec subblock\n\n\t\tEndSubBlock(StateSubBlockStart, state_end1, state_end2, PatchSubBlockEnd1);\n\n\t\ts_pRegisterMap->CleanState(StateSubBlockStart);\n\t\ts_pRegisterMap->CleanState(state_end1);\n\t\ts_pRegisterMap->CleanState(state_end2);\n\n\t\tIsSubBlockStart = false;\n\t}\n\n\tu32 cpuptr = s_pRegisterMap->GetCpuPtrReg();\n\tu32 tmp = s_pRegisterMap->AllocTempReg();\n\n\tjit_movi_ui(LOCALREG(tmp), LastIns.CalcNextInstruction(LastIns));\n\tjit_stxi_ui(jit_field(armcpu_t, instruct_adr), LOCALREG(cpuptr), LOCALREG(tmp));\n\n\ts_pRegisterMap->ReleaseTempReg(tmp);\n\n\ts_pRegisterMap->End(true);\n\n\t//{\n\t//\tINFO(\"Block Address : 0x%x, InstructionsNum : %u\\n\", Address, InstructionsNum);\n\t//\ts_pRegisterMap->PrintProfile();\n\t//\tINFO(\"\\n\");\n\t//}\n\n\tJITLUT_HANDLE(Address, PROCNUM) = opfun;\n\n\tu8* ptr_end = (u8*)jit_get_ip().ptr;\n\tu32 used_size = (u8*)ptr_end - (u8*)ptr;\n\n\tif (used_size > estimate_size)\n\t\tINFO(\"JIT: estimate_size[%u] is too small, used_size[%u].\\n\", estimate_size, used_size);\n\telse\n\t\tFreeCodeBuffer(estimate_size - used_size);\n\n\tFlushIcacheSection((u8*)ptr, (u8*)ptr_end);\n\n\treturn;\n}\n\nTEMPLATE static ArmOpCompiled armcpu_compile()\n{\n\tu32 adr = ARMPROC.instruct_adr;\n\n\tif (!JITLUT_MAPPED(adr & 0x0FFFFFFF, PROCNUM))\n\t{\n\t\tINFO(\"JIT: use unmapped memory address %08X\\n\", adr);\n\t\texecute = false;\n\t\treturn NULL;\n\t}\n\n\tif (!s_pArmAnalyze->Decode(GETCPUPTR) || !s_pArmAnalyze->CreateBlocks())\n\t{\n\t\tINFO(\"JIT: unknow error cpu[%d].\\n\", PROCNUM);\n\t\treturn NULL;\n\t}\n\n\tBlockInfo *BlockInfos;\n\ts32 BlockInfoNum;\n\n\ts_pArmAnalyze->GetBlocks(BlockInfos, BlockInfoNum);\n\tfor (s32 BlockNum = 0; BlockNum < BlockInfoNum; BlockNum++)\n\t{\n\t\tarmcpu_compileblock<PROCNUM>(BlockInfos[BlockNum], BlockNum == 0);\n\t}\n\n\treturn (ArmOpCompiled)JITLUT_HANDLE(adr, PROCNUM);\n}\n\nstatic void cpuReserve()\n{\n\tstatic bool is_inited = false;\n\tif (!is_inited)\n\t{\n\t\tis_inited = true;\n\t\tjit_get_cpu();\n\t}\n\tmemset(&_jit,0,sizeof(jit_state_t));\n\n\tu32 HostRegCount = LOCALREG_INIT();\n\tInitializeCodeBuffer();\n\n\ts_pArmAnalyze = new ArmAnalyze(CommonSettings.jit_max_block_size);\n\ts_pRegisterMap = new RegisterMapImp(HostRegCount);\n\n\ts_pArmAnalyze->m_MergeSubBlocks = true;\n\ts_pArmAnalyze->m_OptimizeFlag = true;\n\t//s_pArmAnalyze->m_JumpEndDecode = true;\n}\n\nstatic void cpuShutdown()\n{\n\tReleaseCodeBuffer();\n\n\tJitLutReset();\n\n\tdelete s_pArmAnalyze;\n\ts_pArmAnalyze = NULL;\n\n\tdelete s_pRegisterMap;\n\ts_pRegisterMap = NULL;\n}\n\nstatic void cpuReset()\n{\n\tResetCodeBuffer();\n\n\tJitLutReset();\n}\n\nstatic void cpuSync()\n{\n\tarmcpu_sync();\n}\n\nTEMPLATE static void cpuClear(u32 Addr, u32 Size)\n{\n\tif (Addr == 0 && Size == CPUBASE_FLUSHALL)\n\t{\n\t\tJitLutReset();\n\t}\n\telse\n\t{\n\t\tSize /= 2;\n\t\tfor (u32 i = 0; i < Size; i++)\n\t\t{\n\t\t\tconst u32 adr = Addr + i*2;\n\n\t\t\tif (JITLUT_MAPPED(adr, PROCNUM))\n\t\t\t\tJITLUT_HANDLE(adr, PROCNUM) = (uintptr_t)NULL;\n\t\t}\n\t}\n}\n\nTEMPLATE static u32 cpuExecuteLJIT()\n{\n\tArmOpCompiled opfun = (ArmOpCompiled)JITLUT_HANDLE(ARMPROC.instruct_adr, PROCNUM);\n\tif (!opfun)\n\t\topfun = armcpu_compile<PROCNUM>();\n\n\treturn opfun();\n}\n\nstatic u32 cpuGetCacheReserve()\n{\n\treturn s_CacheReserve / 1024 /1024;\n}\n\nstatic void cpuSetCacheReserve(u32 reserveInMegs)\n{\n\ts_CacheReserve = reserveInMegs * 1024 * 1024;\n}\n\nstatic const char* cpuDescription()\n{\n\treturn \"Arm LJit\";\n}\n\nCpuBase arm_ljit =\n{\n\tcpuReserve,\n\n\tcpuShutdown,\n\n\tcpuReset,\n\n\tcpuSync,\n\n\tcpuClear<0>, cpuClear<1>,\n\n\tcpuExecuteLJIT<0>, cpuExecuteLJIT<1>,\n\n\tcpuGetCacheReserve,\n\tcpuSetCacheReserve,\n\n\tcpuDescription\n};\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmLJit.h",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n#ifndef ARM_LJIT\n#define ARM_LJIT\n\n#include \"common.h\"\n#include \"CpuBase.h\"\n\nextern CpuBase arm_ljit;\n\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmThreadedInterpreter.cpp",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"ArmThreadedInterpreter.h\"\n\n#include \"instructions.h\"\n#include \"instruction_attributes.h\"\n#include \"Disassembler.h\"\n\n#include \"armcpu.h\"\n#include \"MMU.h\"\n#include \"MMU_timing.h\"\n#include \"JitCommon.h\"\n\n\n#include <map>\n\n#ifdef HAVE_JIT\n\n//#define DUMPLOG\n\n\n\n#define GETCPUPTR (&ARMPROC)\n#define GETCPU (ARMPROC)\n#define TEMPLATE template<int PROCNUM> \n\nstatic void* AllocCache(u32 size);\nstatic void* AllocCacheAlign(u32 size);\nstatic u32 GetCacheRemain();\n\n\n\nu32 Block::cycles = 0;\n\n#define DCL_OP_START(name) \\\n\tTEMPLATE struct name \\\n\t{\n\n#define DCL_OP_COMPILER(name) \\\n\tstatic u32 FASTCALL Compiler(const Decoded& d, MethodCommon* common) \\\n\t{ \\\n\t\tname *pData = (name*)AllocCacheAlign(sizeof(name)); \\\n\t\tcommon->func = name<PROCNUM>::Method; \\\n\t\tcommon->data = pData; \\\n\t\tconst u32 i = d.ThumbFlag==0 ? d.Instruction.ArmOp : d.Instruction.ThumbOp;\n\t\t\n#define DCL_OP_COMPILER_NOFUNC(name) \\\n\tstatic u32 FASTCALL Compiler(const Decoded& d, MethodCommon* common) \\\n\t{ \\\n\t\tname *pData = (name*)AllocCacheAlign(sizeof(name)); \\\n\t\tcommon->data = pData; \\\n\t\tconst u32 i = d.ThumbFlag==0 ? d.Instruction.ArmOp : d.Instruction.ThumbOp;\n\n#define DCL_OP_METHOD(name) \\\n\tstatic void FASTCALL Method(const MethodCommon* common) \\\n\t{ \\\n\t\tconst name *pData = (const name*)common->data;\n\n#define DCL_OP_METHOD2(name) \\\n\tstatic void FASTCALL Method2(const MethodCommon* common) \\\n\t{ \\\n\t\tconst name *pData = (const name*)common->data;\n\n#define DCL_OP_METHOD3(name) \\\n\tstatic void FASTCALL Method3(const MethodCommon* common) \\\n\t{ \\\n\t\tconst name *pData = (const name*)common->data;\n\n#define DCL_OP_METHOD4(name) \\\n\tstatic void FASTCALL Method4(const MethodCommon* common) \\\n\t{ \\\n\t\tconst name *pData = (const name*)common->data;\n\t\t\n#define DCL_OP_METHODTEMPLATE(name)\t\\\n\ttemplate<int METHODNUM> static void FASTCALL MethodTemplate(const MethodCommon* common) \\\n\t{ \\\n\t\tconst name *pData = (const name*)common->data;\n\n#define DONE_COMPILER \\\n\treturn 1;\n\t\n#define DONE_COMPILER_TEMPLATE(k) \\\n\tcommon->func = MethodTemplate<k>; \\\n\treturn 1;\n\t\n#define DONE_COMPILER_TEMPLATE_14(k) \\\n\tswitch(k) \\\n\t{ \\\n\t\tcase 14: DONE_COMPILER_TEMPLATE(14) \\\n\t\tcase 13: DONE_COMPILER_TEMPLATE(13) \\\n\t\tcase 12: DONE_COMPILER_TEMPLATE(12) \\\n\t\tcase 11: DONE_COMPILER_TEMPLATE(11) \\\n\t\tcase 10: DONE_COMPILER_TEMPLATE(10) \\\n\t\tcase 9: DONE_COMPILER_TEMPLATE(9) \\\n\t\tcase 8: DONE_COMPILER_TEMPLATE(8) \\\n\t\tcase 7: DONE_COMPILER_TEMPLATE(7) \\\n\t\tcase 6: DONE_COMPILER_TEMPLATE(6) \\\n\t\tcase 5: DONE_COMPILER_TEMPLATE(5) \\\n\t\tcase 4: DONE_COMPILER_TEMPLATE(4) \\\n\t\tcase 3: DONE_COMPILER_TEMPLATE(3) \\\n\t\tcase 2: DONE_COMPILER_TEMPLATE(2) \\\n\t\tcase 1: DONE_COMPILER_TEMPLATE(1) \\\n\t\tdefault: DONE_COMPILER_TEMPLATE(0) \\\n\t}\n\t\n#define DONE_COMPILER_TEMPLATE_15(k) \\\n\tswitch(k) \\\n\t{ \\\n\t\tcase 15: DONE_COMPILER_TEMPLATE(15) \\\n\t\tcase 14: DONE_COMPILER_TEMPLATE(14) \\\n\t\tcase 13: DONE_COMPILER_TEMPLATE(13) \\\n\t\tcase 12: DONE_COMPILER_TEMPLATE(12) \\\n\t\tcase 11: DONE_COMPILER_TEMPLATE(11) \\\n\t\tcase 10: DONE_COMPILER_TEMPLATE(10) \\\n\t\tcase 9: DONE_COMPILER_TEMPLATE(9) \\\n\t\tcase 8: DONE_COMPILER_TEMPLATE(8) \\\n\t\tcase 7: DONE_COMPILER_TEMPLATE(7) \\\n\t\tcase 6: DONE_COMPILER_TEMPLATE(6) \\\n\t\tcase 5: DONE_COMPILER_TEMPLATE(5) \\\n\t\tcase 4: DONE_COMPILER_TEMPLATE(4) \\\n\t\tcase 3: DONE_COMPILER_TEMPLATE(3) \\\n\t\tcase 2: DONE_COMPILER_TEMPLATE(2) \\\n\t\tcase 1: DONE_COMPILER_TEMPLATE(1) \\\n\t\tdefault: DONE_COMPILER_TEMPLATE(0) \\\n\t}\n\n#define GOTO_NEXTOP(num) \\\n\tBlock::cycles += (num); \\\n\tcommon++; \\\n\treturn common->func(common); \n\n#define GOTO_NEXBLOCK(num) \\\n\tBlock::cycles += (num); \\\n\tGETCPU.instruct_adr = GETCPU.R[15]; \\\n\treturn; \n\n#define BREAK_OP(num) \\\n\tBlock::cycles += (num); \\\n\treturn; \n\n#define DATA(name) (pData->name)\n\n#define GETCPUREG_R(i)\t\t\t((i) == 15 ? common->R15 : GETCPUPTR->R[(i)])\n#define GETCPUREG_W(i)\t\t\t(GETCPUPTR->R[(i)])\n#define GETCPUREG_RW(i)\t\t\t(GETCPUPTR->R[(i)])\n\n#define THUMB_REGPOS_R(i, n)\t(GETCPUREG_R(((i)>>n)&0x7))\n#define THUMB_REGPOS_W(i, n)\t(GETCPUREG_W(((i)>>n)&0x7))\n#define THUMB_REGPOS_RW(i, n)\t(GETCPUREG_RW(((i)>>n)&0x7))\n\n#define ARM_REGPOS_R(i, n)\t\t(GETCPUREG_R(((i)>>n)&0xF))\n#define ARM_REGPOS_W(i, n)\t\t(GETCPUREG_W(((i)>>n)&0xF))\n#define ARM_REGPOS_RW(i, n)\t\t(GETCPUREG_RW(((i)>>n)&0xF))\n\n//------------------------------------------------------------\n//                         THUMB\n//------------------------------------------------------------\n//-----------------------------------------------------------------------------\n//   Undefined instruction\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_UND_THUMB)\n\tDCL_OP_COMPILER(OP_UND_THUMB)\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_UND_THUMB)\n\t\tTRAPUNDEF(GETCPUPTR);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LSL\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_LSL_0)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_LSL_0)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LSL_0)\n\t\tu32 r_0 = *DATA(r_3);\n\t\t*DATA(r_0) = r_0;\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_LSL)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 v;\n\n\tDCL_OP_COMPILER(OP_LSL)\n\t\tDATA(v) = (i>>6) & 0x1F;\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LSL)\n\t\tu32 r_3 = *DATA(r_3);\n\t\tDATA(cpsr)->bits.C = BIT_N(r_3, 32 - DATA(v));\n\t\tu32 r_0 = *DATA(r_0) = *DATA(r_3) << DATA(v);\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_LSL_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_LSL_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LSL_REG)\n\t\tu32 v = *DATA(r_3) & 0xFF;\n\t\tu32 r_0;\n\n\t\tif(v==0)\n\t\t{\n\t\t\tr_0 = *DATA(r_0);\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\t\tif(v<32)\n\t\t{\n\t\t\tDATA(cpsr)->bits.C = BIT_N(*DATA(r_0), 32-v);\n\t\t\tr_0 = *DATA(r_0) <<= v;\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\t\tif(v==32)\n\t\t\tDATA(cpsr)->bits.C = BIT0(*DATA(r_0));\n\t\telse\n\t\t\tDATA(cpsr)->bits.C = 0;\n\n\t\t*DATA(r_0) = 0;\n\t\tDATA(cpsr)->bits.N = 0;\n\t\tDATA(cpsr)->bits.Z = 1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LSR\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_LSR_0)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_LSR_0)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LSR_0)\n\t\tDATA(cpsr)->bits.C = BIT31(*DATA(r_3));\n\t\t*DATA(r_0) = 0;\n\t\tDATA(cpsr)->bits.N = 0;\n\t\tDATA(cpsr)->bits.Z = 1;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_LSR)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 v;\n\n\tDCL_OP_COMPILER(OP_LSR)\n\t\tDATA(v) = (i>>6) & 0x1F;\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LSR)\n\t\tu32 r_3 = *DATA(r_3);\n\t\tDATA(cpsr)->bits.C = BIT_N(r_3, DATA(v) - 1);\n\t\tu32 r_0 = *DATA(r_0) = r_3 >> DATA(v);\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_LSR_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_LSR_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LSR_REG)\n\t\tu32 v = *DATA(r_3) & 0xFF;\n\t\tu32 r_0;\n\n\t\tif(v == 0)\n\t\t{\n\t\t\tr_0 = *DATA(r_0);\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\t\n\t\tif(v<32)\n\t\t{\n\t\t\tDATA(cpsr)->bits.C = BIT_N(*DATA(r_0), v-1);\n\t\t\tr_0 = *DATA(r_0) >>= v;\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\t\tif(v==32)\n\t\t\tDATA(cpsr)->bits.C = BIT31(*DATA(r_0));\n\t\telse\n\t\t\tDATA(cpsr)->bits.C = 0;\n\n\t\t*DATA(r_0) = 0;\n\t\tDATA(cpsr)->bits.N = 0;\n\t\tDATA(cpsr)->bits.Z = 1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   ASR\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_ASR_0)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_ASR_0)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ASR_0)\n\t\tu32 r_3 = *DATA(r_3);\n\t\tDATA(cpsr)->bits.C = BIT31(r_3);\n\t\tu32 r_0 = *DATA(r_0) = BIT31(r_3)*0xFFFFFFFF;\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ASR)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 v;\n\n\tDCL_OP_COMPILER(OP_ASR)\n\t\tDATA(v) = (i>>6) & 0x1F;\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ASR)\n\t\tu32 r_3 = *DATA(r_3);\n\t\tDATA(cpsr)->bits.C = BIT_N(r_3, DATA(v) - 1);\n\t\tu32 r_0 = *DATA(r_0) = (u32)(((s32)r_3) >> DATA(v));\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ASR_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_ASR_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ASR_REG)\n\t\tu32 v = *DATA(r_3) & 0xFF;\n\t\tu32 r_0;\n\n\t\tif(v == 0)\n\t\t{\n\t\t\tr_0 = *DATA(r_0);\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\t\tif(v<32)\n\t\t{\n\t\t\tr_0 = *DATA(r_0);\n\t\t\tDATA(cpsr)->bits.C = BIT_N(r_0, v-1);\n\t\t\tr_0 = *DATA(r_0) = (u32)(((s32)r_0) >> v);\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tr_0 = *DATA(r_0);\n\t\tDATA(cpsr)->bits.C = BIT31(r_0);\n\t\tr_0 = *DATA(r_0) = BIT31(r_0)*0xFFFFFFFF;\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   ADD\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_ADD_IMM3)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 imm3;\n\n\tDCL_OP_COMPILER(OP_ADD_IMM3)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(imm3) = (i >> 6) & 0x07;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADD_IMM3)\n\t\tu32 Rn = *DATA(r_3);\n\t\tu32 imm3 = DATA(imm3);\n\t\tu32 r_0;\n\n\t\tif (imm3 == 0)\t// mov 2\n\t\t{\n\t\t\tr_0 = *DATA(r_0) = Rn;\n\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\t\t\tDATA(cpsr)->bits.C = 0;\n\t\t\tDATA(cpsr)->bits.V = 0;\n\n\t\t\tGOTO_NEXTOP(1)\n\t\t}\n\n\t\tr_0 = *DATA(r_0) = Rn + imm3;\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\t\tDATA(cpsr)->bits.C = CarryFrom(Rn, imm3);\n\t\tDATA(cpsr)->bits.V = OverflowFromADD(r_0, Rn, imm3);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ADD_IMM8)\n\tStatus_Reg *cpsr;\n\tu32 *r_8;\n\tu32 imm8;\n\n\tDCL_OP_COMPILER(OP_ADD_IMM8)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_8) = &(THUMB_REGPOS_RW(i, 8));\n\t\tDATA(imm8) = (i & 0xFF);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADD_IMM8)\n\t\tu32 Rd = *DATA(r_8);\n\t\tu32 imm8 = DATA(imm8);\n\n\t\tu32 r_8 = *DATA(r_8) = Rd + imm8;\n\t\tDATA(cpsr)->bits.N = BIT31(r_8);\n\t\tDATA(cpsr)->bits.Z = r_8 == 0;\n\t\tDATA(cpsr)->bits.C = CarryFrom(Rd, imm8);\n\t\tDATA(cpsr)->bits.V = OverflowFromADD(r_8, Rd, imm8);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ADD_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_ADD_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADD_REG)\n\t\tu32 Rn = *DATA(r_3);\n\t\tu32 Rm = *DATA(r_6);\n\n\t\tu32 r_0 = *DATA(r_0) = Rn + Rm;\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\t\tDATA(cpsr)->bits.C = CarryFrom(Rn, Rm);\n\t\tDATA(cpsr)->bits.V = OverflowFromADD(r_0, Rn, Rm);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ADD_SPE)\n\tu32 *r_d;\n\tu32 *r_3;\n\tbool mod_r15;\n\n\tDCL_OP_COMPILER(OP_ADD_SPE)\n\t\tu32 Rd = ((i)&0x7) | ((i>>4)&8);\n\t\t\n\t\tDATA(r_d) = &(GETCPUREG_RW(Rd));\n\t\tDATA(r_3) = &(ARM_REGPOS_R(i, 3));\n\t\tDATA(mod_r15) = Rd == 15;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADD_SPE)\n\t\t*DATA(r_d) += *DATA(r_3);\n\n\t\tif (DATA(mod_r15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ADD_2PC)\n\tu32 *r_8;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_ADD_2PC)\n\t\tDATA(r_8) = &(THUMB_REGPOS_W(i, 8));\n\t\tDATA(val) = (common->R15&0xFFFFFFFC) + ((i&0xFF)<<2);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADD_2PC)\n\t\t*DATA(r_8) = DATA(val);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ADD_2SP)\n\tu32 *r_8;\n\tu32 *r_13;\n\tu32 add;\n\n\tDCL_OP_COMPILER(OP_ADD_2SP)\n\t\tDATA(r_8) = &(THUMB_REGPOS_W(i, 8));\n\t\tDATA(r_13) = &(GETCPUREG_R(13));\n\t\tDATA(add) = ((i&0xFF)<<2);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADD_2SP)\n\t\t*DATA(r_8) = *DATA(r_13) + DATA(add);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SUB\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SUB_IMM3)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 imm3;\n\n\tDCL_OP_COMPILER(OP_SUB_IMM3)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(imm3) = (i>>6) & 0x07;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SUB_IMM3)\n\t\tu32 Rn = *DATA(r_3);\n\t\tu32 imm3 = DATA(imm3);\n\t\tu32 tmp = Rn - imm3;\n\n\t\t*DATA(r_0) = tmp;\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\t\tDATA(cpsr)->bits.C = !BorrowFrom(Rn, imm3);\n\t\tDATA(cpsr)->bits.V = OverflowFromSUB(tmp, Rn, imm3);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_SUB_IMM8)\n\tStatus_Reg *cpsr;\n\tu32 *r_8;\n\tu32 imm8;\n\n\tDCL_OP_COMPILER(OP_SUB_IMM8)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_8) = &(THUMB_REGPOS_RW(i, 8));\n\t\tDATA(imm8) = (i & 0xFF);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SUB_IMM8)\n\t\tu32 Rd = *DATA(r_8);\n\t\tu32 imm8 = DATA(imm8);\n\t\tu32 tmp = Rd - imm8;\n\n\t\t*DATA(r_8) = tmp;\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\t\tDATA(cpsr)->bits.C = !BorrowFrom(Rd, imm8);\n\t\tDATA(cpsr)->bits.V = OverflowFromSUB(tmp, Rd, imm8);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_SUB_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_SUB_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SUB_REG)\n\t\tu32 Rn = *DATA(r_3);\n\t\tu32 Rm = *DATA(r_6);\n\t\tu32 tmp = Rn - Rm;\n\n\t\t*DATA(r_0) = tmp;\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\t\tDATA(cpsr)->bits.C = !BorrowFrom(Rn, Rm);\n\t\tDATA(cpsr)->bits.V = OverflowFromSUB(tmp, Rn, Rm);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   MOV\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_MOV_IMM8)\n\tStatus_Reg *cpsr;\n\tu32 *r_8;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_MOV_IMM8)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_8) = &(THUMB_REGPOS_W(i, 8));\n\t\tDATA(val) = (i & 0xFF);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MOV_IMM8)\n\t\tu32 val = DATA(val);\n\t\t*DATA(r_8) = val;\n\t\tDATA(cpsr)->bits.N = BIT31(val);\n\t\tDATA(cpsr)->bits.Z = val == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_MOV_SPE)\n\tu32 *r_d;\n\tu32 *r_3;\n\tbool mod_r15;\n\n\tDCL_OP_COMPILER(OP_MOV_SPE)\n\t\tu32 Rd = ((i)&0x7) | ((i>>4)&8);\n\t\t\n\t\tDATA(r_d) = &(GETCPUREG_W(Rd));\n\t\tDATA(r_3) = &(ARM_REGPOS_R(i, 3));\n\t\tDATA(mod_r15) = Rd == 15;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MOV_SPE)\n\t\t*DATA(r_d) = *DATA(r_3);\n\n\t\tif (DATA(mod_r15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   CMP\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_CMP_IMM8)\n\tStatus_Reg *cpsr;\n\tu32 *r_8;\n\tu32 imm8;\n\n\tDCL_OP_COMPILER(OP_CMP_IMM8)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_8) = &(THUMB_REGPOS_R(i, 8));\n\t\tDATA(imm8) = (i & 0xFF);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_CMP_IMM8)\n\t\tu32 imm8 = DATA(imm8);\n\t\tu32 r_8 = *DATA(r_8);\n\t\tu32 tmp = r_8 - imm8;\n\t\t\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\t\tDATA(cpsr)->bits.C = !BorrowFrom(r_8, imm8);\n\t\tDATA(cpsr)->bits.V = OverflowFromSUB(tmp, r_8, imm8);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_CMP)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_CMP)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_CMP)\n\t\tu32 r_0 = *DATA(r_0);\n\t\tu32 r_3 = *DATA(r_3);\n\t\tu32 tmp = r_0 - r_3;\n\t\t\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\t\tDATA(cpsr)->bits.C = !BorrowFrom(r_0, r_3);\n\t\tDATA(cpsr)->bits.V = OverflowFromSUB(tmp, r_0, r_3);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_CMP_SPE)\n\tStatus_Reg *cpsr;\n\tu32 *r_n;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_CMP_SPE)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_n) = &(GETCPUREG_R((i&7) | ((i>>4)&8)));\n\t\tDATA(r_3) = &(ARM_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_CMP_SPE)\n\t\tu32 r_n = *DATA(r_n);\n\t\tu32 r_3 = *DATA(r_3);\n\t\tu32 tmp = r_n - r_3;\n\t\t\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\t\tDATA(cpsr)->bits.C = !BorrowFrom(r_n, r_3);\n\t\tDATA(cpsr)->bits.V = OverflowFromSUB(tmp, r_n, r_3);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   AND\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_AND)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_AND)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_AND)\n\t\tu32 r_0 = *DATA(r_0) &= *DATA(r_3);\n\t\t\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   EOR\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_EOR)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_EOR)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_EOR)\n\t\tu32 r_0 = *DATA(r_0) ^= *DATA(r_3);\n\t\t\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   ADC\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_ADC_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_ADC_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADC_REG)\n\t\tu32 Rd = *DATA(r_0);\n\t\tu32 Rm = *DATA(r_3);\n\t\tu32 r_0;\n\n\t\tif (!DATA(cpsr)->bits.C)\n\t\t{\n\t\t\tr_0 = *DATA(r_0) = Rd + Rm;\n\t\t\tDATA(cpsr)->bits.C = r_0 < Rm;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tr_0 = *DATA(r_0) = Rd + Rm + 1;\n\t\t\tDATA(cpsr)->bits.C = r_0 <= Rm;\n\t\t}\n\t\t\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\t\tDATA(cpsr)->bits.V = BIT31((Rd ^ Rm ^ -1) & (Rd ^ r_0));\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SBC\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SBC_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_SBC_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SBC_REG)\n\t\tu32 Rd = *DATA(r_0);\n\t\tu32 Rm = *DATA(r_3);\n\t\tu32 r_0;\n\n\t\tif (!DATA(cpsr)->bits.C)\n\t\t{\n\t\t\tr_0 = *DATA(r_0) = Rd - Rm - 1;\n\t\t\tDATA(cpsr)->bits.C = Rd > Rm;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tr_0 = *DATA(r_0) = Rd - Rm;\n\t\t\tDATA(cpsr)->bits.C = Rd >= Rm;\n\t\t}\n\t\t\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\t\tDATA(cpsr)->bits.V = BIT31((Rd ^ Rm) & (Rd ^ r_0));\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   ROR\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_ROR_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_ROR_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ROR_REG)\n\t\tu32 v = *DATA(r_3) & 0xFF;\n\t\tu32 r_0;\n\n\t\tif(v == 0)\n\t\t{\n\t\t\tr_0 = *DATA(r_0);\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tv &= 0x1F;\n\t\tif(v == 0)\n\t\t{\n\t\t\tr_0 = *DATA(r_0);\n\t\t\tDATA(cpsr)->bits.C = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\t\t\n\t\tr_0 = *DATA(r_0);\n\t\tDATA(cpsr)->bits.C = BIT_N(r_0, v-1);\n\t\tr_0 = *DATA(r_0) = ROR(r_0, v);\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_TST)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_TST)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_TST)\n\t\tu32 tmp = *DATA(r_0) & *DATA(r_3);\n\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   NEG\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_NEG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_NEG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_NEG)\n\t\tu32 Rm = *DATA(r_3);\n\n\t\tu32 r_0 = *DATA(r_0) = (u32)((s32)0 - (s32)Rm);\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\t\tDATA(cpsr)->bits.C = !BorrowFrom(0, Rm);\n\t\tDATA(cpsr)->bits.V = OverflowFromSUB(r_0, 0, Rm);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   CMN\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_CMN)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_CMN)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_CMN)\n\t\tu32 r_0 = *DATA(r_0);\n\t\tu32 r_3 = *DATA(r_3);\n\t\tu32 tmp = r_0 + r_3;\n\n\t\tDATA(cpsr)->bits.N = BIT31(tmp);\n\t\tDATA(cpsr)->bits.Z = tmp == 0;\n\t\tDATA(cpsr)->bits.C = CarryFrom(r_0, r_3);\n\t\tDATA(cpsr)->bits.V = OverflowFromADD(tmp, r_0, r_3);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   ORR\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_ORR)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_ORR)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ORR)\n\t\tu32 r_0 = *DATA(r_0) |= *DATA(r_3);\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   BIC\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_BIC)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_BIC)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BIC)\n\t\tu32 r_0 = *DATA(r_0) &= (~(*DATA(r_3)));\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   MVN\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_MVN)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_MVN)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MVN)\n\t\tu32 r_0 = *DATA(r_0) = (~(*DATA(r_3)));\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   MUL\n//-----------------------------------------------------------------------------\n#define MUL_Mxx_END_THUMB(c) \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFFFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+1); \\\n\t} \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+2); \\\n\t} \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+3); \\\n\t} \\\n\tGOTO_NEXTOP(c+4);\n\nDCL_OP_START(OP_MUL_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_3;\n\n\tDCL_OP_COMPILER(OP_MUL_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(THUMB_REGPOS_RW(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MUL_REG)\n\t\tu32 v = *DATA(r_3);\n\n\t\tu32 r_0 = *DATA(r_0) *= v;\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_0);\n\t\tDATA(cpsr)->bits.Z = r_0 == 0;\n\n\t\tif (PROCNUM == 1)\t// ARM4T 1S + mI, m = 3\n\t\t{\n\t\t\tGOTO_NEXTOP(4)\n\t\t}\n\n\t\tMUL_Mxx_END_THUMB(1)\n\t}\n};\n\n#undef MUL_Mxx_END_THUMB\n\n//-----------------------------------------------------------------------------\n//   STRB / LDRB\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_STRB_IMM_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_STRB_IMM_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(val) = ((i>>6)&0x1F);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STRB_IMM_OFF)\n\t\tu32 adr = *DATA(r_3) + DATA(val);\n\t\t\n\t\tWRITE8(GETCPU.mem_if->data, adr, (u8)*DATA(r_0));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDRB_IMM_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_LDRB_IMM_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(val) = ((i>>6)&0x1F);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRB_IMM_OFF)\n\t\tu32 adr = *DATA(r_3) + DATA(val);\n\t\t\n\t\t*DATA(r_0) = (u32)READ8(GETCPU.mem_if->data, adr);\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STRB_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_STRB_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STRB_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\t\n\t\tWRITE8(GETCPU.mem_if->data, adr, (u8)*DATA(r_0));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDRB_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_LDRB_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRB_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\t\n\t\t*DATA(r_0) = (u32)READ8(GETCPU.mem_if->data, adr);\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LDRSB\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_LDRSB_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_LDRSB_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRSB_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\t\n\t\t*DATA(r_0) = (u32)((s8)READ8(GETCPU.mem_if->data, adr));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   STRH / LDRH\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_STRH_IMM_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_STRH_IMM_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(val) = ((i>>5)&0x3E);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STRH_IMM_OFF)\n\t\tu32 adr = *DATA(r_3) + DATA(val);\n\t\t\n\t\tWRITE16(GETCPU.mem_if->data, adr, (u16)*DATA(r_0));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDRH_IMM_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_LDRH_IMM_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(val) = ((i>>5)&0x3E);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRH_IMM_OFF)\n\t\tu32 adr = *DATA(r_3) + DATA(val);\n\t\t\n\t\t*DATA(r_0) = (u32)READ16(GETCPU.mem_if->data, adr);\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STRH_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_STRH_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STRH_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\t\n\t\tWRITE16(GETCPU.mem_if->data, adr, (u16)*DATA(r_0));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDRH_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_LDRH_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRH_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\t\n\t\t*DATA(r_0) = (u32)READ16(GETCPU.mem_if->data, adr);\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LDRSH\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_LDRSH_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_LDRSH_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRSH_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\t\n\t\t*DATA(r_0) = (u32)((s16)READ16(GETCPU.mem_if->data, adr));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   STR / LDR\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_STR_IMM_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_STR_IMM_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(val) = ((i>>4)&0x7C);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STR_IMM_OFF)\n\t\tu32 adr = *DATA(r_3) + DATA(val);\n\t\t\n\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_0));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDR_IMM_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_LDR_IMM_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(val) = ((i>>4)&0x7C);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDR_IMM_OFF)\n\t\tu32 adr = *DATA(r_3) + DATA(val);\n\t\tu32 tempValue = READ32(GETCPU.mem_if->data, adr);\n\t\tadr = (adr&3)*8;\n\t\ttempValue = (tempValue>>adr) | (tempValue<<(32-adr));\n\t\t*DATA(r_0) = tempValue;\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STR_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_STR_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_R(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STR_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\t\n\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_0));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDR_REG_OFF)\n\tu32 *r_0;\n\tu32 *r_3;\n\tu32 *r_6;\n\n\tDCL_OP_COMPILER(OP_LDR_REG_OFF)\n\t\tDATA(r_0) = &(THUMB_REGPOS_W(i, 0));\n\t\tDATA(r_3) = &(THUMB_REGPOS_R(i, 3));\n\t\tDATA(r_6) = &(THUMB_REGPOS_R(i, 6));\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDR_REG_OFF)\n\t\tu32 adr = *DATA(r_3) + *DATA(r_6);\n\t\tu32 tempValue = READ32(GETCPU.mem_if->data, adr);\n\t\tadr = (adr&3)*8;\n\t\ttempValue = (tempValue>>adr) | (tempValue<<(32-adr));\n\t\t*DATA(r_0) = tempValue;\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STR_SPREL)\n\tu32 *r_8;\n\tu32 *r_13;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_STR_SPREL)\n\t\tDATA(r_8) = &(THUMB_REGPOS_R(i, 8));\n\t\tDATA(r_13) = &(GETCPUREG_R(13));\n\t\tDATA(val) = ((i&0xFF)<<2);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STR_SPREL)\n\t\tu32 adr = *DATA(r_13) + DATA(val);\n\t\t\n\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_8));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDR_SPREL)\n\tu32 *r_8;\n\tu32 *r_13;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_LDR_SPREL)\n\t\tDATA(r_8) = &(THUMB_REGPOS_W(i, 8));\n\t\tDATA(r_13) = &(GETCPUREG_R(13));\n\t\tDATA(val) = ((i&0xFF)<<2);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDR_SPREL)\n\t\tu32 adr = *DATA(r_13) + DATA(val);\n\t\t\n\t\t*DATA(r_8) = READ32(GETCPU.mem_if->data, adr);\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, adr);\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDR_PCREL)\n\tu32 *r_8;\n\tu32 adr;\n\n\tDCL_OP_COMPILER(OP_LDR_PCREL)\n\t\tDATA(r_8) = &(THUMB_REGPOS_W(i, 8));\n\t\tDATA(adr) = (common->R15&0xFFFFFFFC) + ((i&0xFF)<<2);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDR_PCREL)\n\t\t*DATA(r_8) = READ32(GETCPU.mem_if->data, DATA(adr));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, DATA(adr));\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   Adjust SP\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_ADJUST_P_SP)\n\tu32 *r_13;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_ADJUST_P_SP)\n\t\tDATA(r_13) = &(GETCPUREG_RW(13));\n\t\tDATA(val) = ((i&0x7F)<<2);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADJUST_P_SP)\n\t\t*DATA(r_13) += DATA(val);\n\t\t\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_ADJUST_M_SP)\n\tu32 *r_13;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_ADJUST_M_SP)\n\t\tDATA(r_13) = &(GETCPUREG_RW(13));\n\t\tDATA(val) = ((i&0x7F)<<2);\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_ADJUST_M_SP)\n\t\t*DATA(r_13) -= DATA(val);\n\t\t\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   PUSH / POP\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_PUSH)\n\tu32 count;\n\tu32 *r_13;\n\tu32 *r[8];\n\n\tDCL_OP_COMPILER(OP_PUSH)\n\t\tDATA(r_13) = &(GETCPUREG_RW(13));\n\n\t\tu32 count = 0;\n\t\tfor(u32 j = 0; j<8; j++)\n\t\t{\n\t\t\tif(BIT_N(i, 7-j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(7-j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_PUSH)\n\t\tu32 adr = *DATA(r_13) - 4;\n\t\tu32 c = 0;\n\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\t*DATA(r_13) = adr + 4;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(3, c);\n\t\t\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_PUSH_LR)\n\tu32 count;\n\tu32 *r_13;\n\tu32 *r_14;\n\tu32 *r[8];\n\n\tDCL_OP_COMPILER(OP_PUSH_LR)\n\t\tDATA(r_13) = &(GETCPUREG_RW(13));\n\t\tDATA(r_14) = &(GETCPUREG_R(14));\n\n\t\tu32 count = 0;\n\t\tfor(u32 j = 0; j<8; j++)\n\t\t{\n\t\t\tif(BIT_N(i, 7-j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(7-j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_PUSH_LR)\n\t\tu32 adr = *DATA(r_13) - 4;\n\n\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_14));\n\t\tu32 c = MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\tadr -= 4;\n\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\t*DATA(r_13) = adr + 4;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(4, c);\n\t\t\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_POP)\n\tu32 count;\n\tu32 *r_13;\n\tu32 *r[8];\n\n\tDCL_OP_COMPILER(OP_POP)\n\t\tDATA(r_13) = &(GETCPUREG_RW(13));\n\n\t\tu32 count = 0;\n\t\tfor(u32 j = 0; j<8; j++)\n\t\t{\n\t\t\tif(BIT_N(i, j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_POP)\n\t\tu32 adr = *DATA(r_13);\n\t\tu32 c = 0;\n\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\t*DATA(r_13) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\t\t\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_POP_PC)\n\tu32 count;\n\tStatus_Reg *cpsr;\n\tu32 *r_13;\n\tu32 *r_15;\n\tu32 *r[8];\n\n\tDCL_OP_COMPILER(OP_POP_PC)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_13) = &(GETCPUREG_RW(13));\n\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\n\t\tu32 count = 0;\n\t\tfor(u32 j = 0; j<8; j++)\n\t\t{\n\t\t\tif(BIT_N(i, j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_POP_PC)\n\t\tu32 adr = *DATA(r_13);\n\t\tu32 c = 0;\n\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tu32 v = READ32(GETCPU.mem_if->data, adr);\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\n\t\tif(PROCNUM==0)\n\t\t\tDATA(cpsr->bits.T) = BIT0(v);\n\n\t\t*DATA(r_15) = v & 0xFFFFFFFE;\n\n\t\t*DATA(r_13) = adr + 4;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(5, c);\n\t\t\n\t\tGOTO_NEXBLOCK(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   STMIA / LDMIA\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_STMIA_THUMB)\n\tu32 count;\n\tu32 *r_8;\n\tu32 *r[8];\n\n\tDCL_OP_COMPILER(OP_STMIA_THUMB)\n\t\tDATA(r_8) = &(THUMB_REGPOS_RW(i, 8));\n\n\t\tu32 erList = 1; //Empty Register List\n\n\t\tif (BIT_N(i, (((i)>>8)&0x7)))\n\t\t\tprintf(\"STMIA with Rb in Rlist\\n\");\n\n\t\tu32 count = 0;\n\t\tfor(u32 j = 0; j<8; j++)\n\t\t{\n\t\t\tif(BIT_N(i, j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\n\t\t\t\terList = 0; //Register List isnt empty\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\n\t\tif (erList)\n\t\t\t printf(\"STMIA with Empty Rlist\\n\");\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIA_THUMB)\n\t\tu32 adr = *DATA(r_8);\n\t\tu32 c = 0;\n\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\t*DATA(r_8) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\t\t\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDMIA_THUMB)\n\tu32 count;\n\tu32 *r_8;\n\tu32 *r[8];\n\tbool write_back;\n\n\tDCL_OP_COMPILER(OP_LDMIA_THUMB)\n\t\tu32 regIndex = (((i)>>8)&0x7);\n\t\tu32 erList = 1; //Empty Register List\n\n\t\tDATA(r_8) = &(GETCPUREG_RW(regIndex));\n\t\tDATA(write_back) = !BIT_N(i, regIndex);\n\n\t\t//if (BIT_N(i, regIndex))\n\t\t//\t printf(\"LDMIA with Rb in Rlist at %08X\\n\",cpu->instruct_adr);\n\n\t\tu32 count = 0;\n\t\tfor(u32 j = 0; j<8; j++)\n\t\t{\n\t\t\tif(BIT_N(i, j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\n\t\t\t\terList = 0; //Register List isnt empty\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\n\t\tif (erList)\n\t\t\t printf(\"LDMIA with Empty Rlist\\n\");\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMIA_THUMB)\n\t\tu32 adr = *DATA(r_8);\n\t\tu32 c = 0;\n\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tif (DATA(write_back))\n\t\t\t*DATA(r_8) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(3, c);\n\t\t\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   BKPT\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_BKPT_THUMB)\n\n\tDCL_OP_COMPILER(OP_BKPT_THUMB)\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BKPT_THUMB)\n\t\tprintf(\"THUMB%c: Unimplemented opcode BKPT\\n\", PROCNUM?'7':'9');\n\t\t\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SWI\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SWI_THUMB)\n\tu32 swinum;\n\n\tDCL_OP_COMPILER(OP_SWI_THUMB)\n\t\tDATA(swinum) = (i & 0xFF) & 0x1F;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SWI_THUMB)\n\t\tbool bypassBuiltinSWI = (GETCPU.intVector == 0x00000000 && PROCNUM==0) \n\t\t\t\t\t\t\t\t|| (GETCPU.intVector == 0xFFFF0000 && PROCNUM==1);\n\n\t\tif(GETCPU.swi_tab && !bypassBuiltinSWI)\n\t\t{\n\t\t\tu32 swinum = DATA(swinum);\n\t\t\t\n\t\t\tif (swinum == 0x04 || swinum == 0x05)\n\t\t\t{\n\t\t\t\tGETCPU.instruct_adr = common->R15 - 4;\n\t\t\t\tGETCPU.next_instruction = common->R15 - 2;\n\n\t\t\t\tu32 c = GETCPU.swi_tab[swinum]() + 3;\n\n\t\t\t\tGETCPU.instruct_adr = GETCPU.next_instruction;\n\n\t\t\t\tBREAK_OP(c)\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 c = GETCPU.swi_tab[swinum]() + 3;\n\n\t\t\t\tGOTO_NEXTOP(c)\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatus_Reg tmp = GETCPU.CPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SVC);\n\t\t\tGETCPU.R[14] = common->R15 - 2;\n\t\t\tGETCPU.SPSR = tmp;\n\t\t\tGETCPU.CPSR.bits.T = 0;\n\t\t\tGETCPU.CPSR.bits.I = 1;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tGETCPU.R[15] = GETCPU.intVector + 0x08;\n\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\n#define SIGNEEXT_IMM11(i)\t(((i)&0x7FF) | (BIT10(i) * 0xFFFFF800))\n#define SIGNEXTEND_11(i)\t(((s32)i<<21)>>21)\n\nDCL_OP_START(OP_B_COND)\n\tStatus_Reg *cpsr;\n\tu32 *r_15;\n\t//u32 cond;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_B_COND)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_15) = &(GETCPUREG_RW(15));\n\t\t//DATA(cond) = (i>>8)&0xF;\n\t\tDATA(val) = d.Immediate;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_B_COND)\n\t\t//if(!TEST_COND(DATA(cond), 0, (*DATA(cpsr))))\n\t\t//{\n\t\t//\tGOTO_NEXTOP(1)\n\t\t//}\n\n\t\t*DATA(r_15) = DATA(val);\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n};\n\nDCL_OP_START(OP_B_UNCOND)\n\tu32 *r_15;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_B_UNCOND)\n\t\tDATA(r_15) = &(GETCPUREG_RW(15));\n\t\tDATA(val) = d.Immediate;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_B_UNCOND)\n\t\t*DATA(r_15) = DATA(val);\n\n\t\tGOTO_NEXBLOCK(1)\n\t}\n};\n\nDCL_OP_START(OP_BLX)\n\tStatus_Reg *cpsr;\n\tu32 *r_14;\n\tu32 *r_15;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_BLX)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_14) = &(GETCPUREG_RW(14));\n\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\tDATA(val) = d.Immediate;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BLX)\n\t\t*DATA(r_15) = DATA(val);\n\t\t*DATA(r_14) = (common->R15 - 2) | 1;\n\t\tDATA(cpsr)->bits.T = 0;\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n};\n\nDCL_OP_START(OP_BL_10)\n\n\tDCL_OP_COMPILER(OP_BL_10)\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BL_10)\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_BL_11)\n\tu32 *r_14;\n\tu32 *r_15;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_BL_11)\n\t\tDATA(r_14) = &(GETCPUREG_RW(14));\n\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\tDATA(val) = d.Immediate;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BL_11)\n\t\t*DATA(r_15) = DATA(val);\n\t\t*DATA(r_14) = ((common->R15 - 2)) | 1;\n\n\t\tGOTO_NEXBLOCK(4)\n\t}\n};\n\nDCL_OP_START(OP_BX_THUMB)\n\tStatus_Reg *cpsr;\n\tu32 *r_3;\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_BX_THUMB)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_3) = &(ARM_REGPOS_R(i, 3));\n\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BX_THUMB)\n\t\tu32 Rm = *DATA(r_3);\n\t\t\n\t\tDATA(cpsr)->bits.T = BIT0(Rm);\n\t\t*DATA(r_15) = (Rm & (0xFFFFFFFC|(1<<DATA(cpsr)->bits.T)));\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n};\n\nDCL_OP_START(OP_BLX_THUMB)\n\tStatus_Reg *cpsr;\n\tu32 *r_3;\n\tu32 *r_14;\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_BLX_THUMB)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_3) = &(ARM_REGPOS_R(i, 3));\n\t\tDATA(r_14) = &(GETCPUREG_W(14));\n\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BLX_THUMB)\n\t\tu32 Rm = *DATA(r_3);\n\t\t\n\t\tDATA(cpsr)->bits.T = BIT0(Rm);\n\t\t*DATA(r_15) = Rm & 0xFFFFFFFE;\n\t\t*DATA(r_14) = ((common->R15 - 2)) | 1;\n\n\t\tGOTO_NEXBLOCK(4)\n\t}\n};\n\n//------------------------------------------------------------\n//                         ARM\n//------------------------------------------------------------\n#define DCL_OP2_ARG1(name, op1, op2, arg) \\\n\tDCL_OP_START(name) \\\n\t\top1##_DATA \\\n\t\top2##_DATA \\\n\t\tDCL_OP_COMPILER(name) \\\n\t\t\top1##_COMPILER \\\n\t\t\top2##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(name) \\\n\t\t\top1; \\\n\t\t\top2(arg); \\\n\t\t} \\\n\t}; \n\n#define DCL_OP2_ARG2(name, op1, op2, arg1, arg2) \\\n\tDCL_OP_START(name) \\\n\t\top1##_DATA \\\n\t\top2##_DATA \\\n\t\tDCL_OP_COMPILER(name) \\\n\t\t\top1##_COMPILER \\\n\t\t\top2##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(name) \\\n\t\t\top1; \\\n\t\t\top2(arg1, arg2); \\\n\t\t} \\\n\t}; \n\n#define DCL_OP2EX_ARG2(name, op1, op2, opex, arg1, arg2) \\\n\tDCL_OP_START(name) \\\n\t\top1##_DATA \\\n\t\top2##_DATA \\\n\t\tDCL_OP_COMPILER(name) \\\n\t\t\top1##_COMPILER \\\n\t\t\top2##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(name) \\\n\t\t\top1; \\\n\t\t\topex; \\\n\t\t\top2(arg1, arg2); \\\n\t\t} \\\n\t}; \n\n//-----------------------------------------------------------------------------\n//   Shifting macros\n//-----------------------------------------------------------------------------\n#define LSL_IMM_DATA \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define LSL_IMM_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define LSL_IMM \\\n\tu32 shift_op = (*DATA(r_0))<<(DATA(shift_op));\n\n#define S_LSL_IMM_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define S_LSL_IMM_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define S_LSL_IMM \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = DATA(shift_op); \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=(r_0); \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N((r_0), 32-shift_op); \\\n\t\tshift_op = (r_0)<<shift_op; \\\n\t}\n\n#define LSL_REG_DATA \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define LSL_REG_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8)); \n#define LSL_REG \\\n\tu32 shift_op = (*DATA(r_8))&0xFF; \\\n\tif(shift_op>=32) \\\n\t\tshift_op=0; \\\n\telse \\\n\t\tshift_op=(*DATA(r_0))<<shift_op;\n\n#define S_LSL_REG_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define S_LSL_REG_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n#define S_LSL_REG \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = (*DATA(r_8))&0xFF; \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=(r_0); \\\n\telse \\\n\tif(shift_op<32) \\\n\t{ \\\n\t\tc = BIT_N((r_0), 32-shift_op); \\\n\t\tshift_op = (r_0)<<shift_op; \\\n\t} \\\n\telse \\\n\tif(shift_op==32) \\\n\t{ \\\n\t\tshift_op = 0; \\\n\t\tc = BIT0((r_0)); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tshift_op = 0; \\\n\t\tc = 0; \\\n\t}\n\n#define LSR_IMM_DATA \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define LSR_IMM_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define LSR_IMM \\\n\tu32 shift_op = DATA(shift_op); \\\n\tif(shift_op!=0) \\\n\t\tshift_op = (*DATA(r_0))>>shift_op;\n\n#define S_LSR_IMM_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define S_LSR_IMM_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define S_LSR_IMM \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = DATA(shift_op); \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tc = BIT31(r_0); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N(r_0, shift_op-1); \\\n\t\tshift_op = r_0>>shift_op; \\\n\t}\n\n#define LSR_REG_DATA \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define LSR_REG_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8)); \n#define LSR_REG \\\n\tu32 shift_op = (*DATA(r_8))&0xFF; \\\n\tif(shift_op>=32) \\\n\t\tshift_op = 0; \\\n\telse \\\n\t\tshift_op = *DATA(r_0)>>shift_op;\n\n#define S_LSR_REG_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define S_LSR_REG_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n#define S_LSR_REG \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = (*DATA(r_8))&0xFF; \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op = r_0; \\\n\t} \\\n\telse \\\n\tif(shift_op<32) \\\n\t{ \\\n\t\tc = BIT_N(r_0, shift_op-1); \\\n\t\tshift_op = r_0>>shift_op; \\\n\t} \\\n\telse \\\n\tif(shift_op==32) \\\n\t{ \\\n\t\tc = BIT31(r_0); \\\n\t\tshift_op = 0; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = 0; \\\n\t\tshift_op = 0; \\\n\t}\n\n#define ASR_IMM_DATA \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define ASR_IMM_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define ASR_IMM \\\n\tu32 shift_op = DATA(shift_op); \\\n\tif(shift_op==0) \\\n\t\tshift_op=BIT31(*DATA(r_0))*0xFFFFFFFF; \\\n\telse \\\n\t\tshift_op = (u32)((s32)*DATA(r_0)>>shift_op);\n\n#define S_ASR_IMM_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define S_ASR_IMM_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define S_ASR_IMM \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = DATA(shift_op); \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op=BIT31(r_0)*0xFFFFFFFF; \\\n\t\tc = BIT31(r_0); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N(r_0, shift_op-1); \\\n\t\tshift_op = (u32)((s32)r_0>>shift_op); \\\n\t}\n\n#define ASR_REG_DATA \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define ASR_REG_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8)); \n#define ASR_REG \\\n\tu32 shift_op = (*DATA(r_8))&0xFF; \\\n\tif(shift_op==0) \\\n\t\tshift_op=*DATA(r_0); \\\n\telse \\\n\tif(shift_op<32) \\\n\t\tshift_op = (u32)((s32)*DATA(r_0)>>shift_op); \\\n\telse \\\n\t\tshift_op=BIT31(*DATA(r_0))*0xFFFFFFFF;\n\n#define S_ASR_REG_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define S_ASR_REG_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n#define S_ASR_REG \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = (*DATA(r_8))&0xFF; \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=r_0; \\\n\telse \\\n\tif(shift_op<32) \\\n\t{ \\\n\t\tc = BIT_N(r_0, shift_op-1); \\\n\t\tshift_op = (u32)((s32)r_0>>shift_op); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT31(r_0); \\\n\t\tshift_op=BIT31(r_0)*0xFFFFFFFF; \\\n\t}\n\n#define ROR_IMM_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define ROR_IMM_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define ROR_IMM \\\n\tu32 shift_op = DATA(shift_op); \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op = ((u32)DATA(cpsr)->bits.C<<31)|(*DATA(r_0)>>1); \\\n\t} \\\n\telse \\\n\t\tshift_op = ROR(*DATA(r_0),shift_op);\n\n#define ROR_IMM2_DATA \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define ROR_IMM2_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define ROR_IMM2 \\\n\tu32 shift_op = DATA(shift_op); \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op = ((u32)DATA(cpsr)->bits.C<<31)|(*DATA(r_0)>>1); \\\n\t} \\\n\telse \\\n\t\tshift_op = ROR(*DATA(r_0),shift_op);\n\n#define S_ROR_IMM_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 shift_op;\n#define S_ROR_IMM_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(shift_op) = ((i>>7)&0x1F);\n#define S_ROR_IMM \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = DATA(shift_op); \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op = ((u32)DATA(cpsr)->bits.C<<31)|(r_0>>1); \\\n\t\tc = BIT0(r_0); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N(r_0, shift_op-1); \\\n\t\tshift_op = ROR(r_0,shift_op); \\\n\t}\n\n#define ROR_REG_DATA \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define ROR_REG_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8)); \n#define ROR_REG \\\n\tu32 shift_op = (*DATA(r_8))&0x1F; \\\n\tif((shift_op&0x1F)==0) \\\n\t\tshift_op=*DATA(r_0); \\\n\telse \\\n\t\tshift_op = ROR(*DATA(r_0),shift_op);\n\n#define S_ROR_REG_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_0; \\\n\tu32 *r_8;\n#define S_ROR_REG_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n#define S_ROR_REG \\\n\tu32 r_0 = *DATA(r_0); \\\n\tu32 shift_op = (*DATA(r_8))&0xFF; \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=r_0; \\\n\telse \\\n\t{ \\\n\t\tshift_op&=0x1F; \\\n\t\tif(shift_op!=0) \\\n\t\t{ \\\n\t\t\tc = BIT_N(r_0, shift_op-1); \\\n\t\t\tshift_op = ROR(r_0,shift_op); \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tshift_op=r_0; \\\n\t\t\tc = BIT31(r_0); \\\n\t\t} \\\n\t}\n\n#define IMM_VALUE_DATA \\\n\tu32 shift_op; \n#define IMM_VALUE_COMPILER \\\n\tDATA(shift_op) = ROR((i&0xFF), (i>>7)&0x1E);\n#define IMM_VALUE \\\n\tu32 shift_op = DATA(shift_op);\n\n#define S_IMM_VALUE_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 shift_op; \\\n\tu32 val; \n#define S_IMM_VALUE_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(shift_op) = ROR((i&0xFF), (i>>7)&0x1E); \\\n\tDATA(val) = (i>>8)&0xF;\n#define S_IMM_VALUE \\\n\tu32 shift_op = DATA(shift_op); \\\n\tu32 c = DATA(cpsr)->bits.C; \\\n\tif(DATA(val)) \\\n\t\tc = BIT31(shift_op);\n\n//-----------------------------------------------------------------------------\n//   Undefined instruction\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_UND)\n\n\tDCL_OP_COMPILER(OP_UND)\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_UND)\n\t\tTRAPUNDEF(GETCPUPTR);\n\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n#define DCL_OP_DATAPROCESS(name, op1, op2, arg1, arg2) \\\n\tDCL_OP_START(name) \\\n\t\top1##_DATA \\\n\t\top2##_DATA \\\n\t\tDCL_OP_COMPILER(name) \\\n\t\t\top1##_COMPILER \\\n\t\t\top2##_COMPILER(name) \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(name) \\\n\t\t\top1; \\\n\t\t\top2(arg1, arg2); \\\n\t\t} \\\n\t\tDCL_OP_METHOD2(name) \\\n\t\t\top1; \\\n\t\t\top2##_WR15(arg1, arg2); \\\n\t\t} \\\n\t}; \n\n#define DCL_OP_DATAPROCESS_EX(name, op1, op2, opex, arg1, arg2) \\\n\tDCL_OP_START(name) \\\n\t\top1##_DATA \\\n\t\top2##_DATA \\\n\t\tDCL_OP_COMPILER(name) \\\n\t\t\top1##_COMPILER \\\n\t\t\top2##_COMPILER_EX(name) \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(name) \\\n\t\t\top1; \\\n\t\t\top2(arg1, arg2); \\\n\t\t} \\\n\t\tDCL_OP_METHOD2(name) \\\n\t\t\top1; \\\n\t\t\top2##_WR15(arg1, arg2); \\\n\t\t} \\\n\t\tDCL_OP_METHOD3(name) \\\n\t\t\top1; \\\n\t\t\topex; \\\n\t\t\top2(arg1, arg2); \\\n\t\t} \\\n\t\tDCL_OP_METHOD4(name) \\\n\t\t\top1; \\\n\t\t\topex; \\\n\t\t\top2##_WR15(arg1, arg2); \\\n\t\t} \\\n\t}; \n\n//-----------------------------------------------------------------------------\n//   AND / ANDS\n//   Timing: OK\n//-----------------------------------------------------------------------------\n#define OP_AND_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_AND_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_AND(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) & shift_op; \\\n\tGOTO_NEXTOP(a);\n#define OP_AND_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) & shift_op; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_ANDS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_ANDS_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_ANDS(a, b) \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) & shift_op; \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tGOTO_NEXTOP(a);\n#define OP_ANDS_WR15(a, b) \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) & shift_op; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_AND_LSL_IMM, LSL_IMM, OP_AND, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_LSL_REG, LSL_REG, OP_AND, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_LSR_IMM, LSR_IMM, OP_AND, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_LSR_REG, LSR_REG, OP_AND, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_ASR_IMM, ASR_IMM, OP_AND, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_ASR_REG, ASR_REG, OP_AND, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_ROR_IMM, ROR_IMM, OP_AND, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_ROR_REG, ROR_REG, OP_AND, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_IMM_VAL, IMM_VALUE, OP_AND, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_AND_S_LSL_IMM, S_LSL_IMM, OP_ANDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_S_LSL_REG, S_LSL_REG, OP_ANDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_S_LSR_IMM, S_LSR_IMM, OP_ANDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_S_LSR_REG, S_LSR_REG, OP_ANDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_S_ASR_IMM, S_ASR_IMM, OP_ANDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_S_ASR_REG, S_ASR_REG, OP_ANDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_S_ROR_IMM, S_ROR_IMM, OP_ANDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_AND_S_ROR_REG, S_ROR_REG, OP_ANDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_AND_S_IMM_VAL, S_IMM_VALUE, OP_ANDS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   EOR / EORS\n//-----------------------------------------------------------------------------\n#define OP_EOR_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_EOR_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_EOR(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) ^ shift_op; \\\n\tGOTO_NEXTOP(a); \n#define OP_EOR_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) ^ shift_op; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_EORS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_EORS_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_EORS(a, b) \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) ^ shift_op; \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tGOTO_NEXTOP(a);\n#define OP_EORS_WR15(a, b) \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) ^ shift_op; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_EOR_LSL_IMM, LSL_IMM, OP_EOR, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_LSL_REG, LSL_REG, OP_EOR, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_LSR_IMM, LSR_IMM, OP_EOR, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_LSR_REG, LSR_REG, OP_EOR, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_ASR_IMM, ASR_IMM, OP_EOR, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_ASR_REG, ASR_REG, OP_EOR, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_ROR_IMM, ROR_IMM, OP_EOR, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_ROR_REG, ROR_REG, OP_EOR, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_IMM_VAL, IMM_VALUE, OP_EOR, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_EOR_S_LSL_IMM, S_LSL_IMM, OP_EORS, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_S_LSL_REG, S_LSL_REG, OP_EORS, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_S_LSR_IMM, S_LSR_IMM, OP_EORS, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_S_LSR_REG, S_LSR_REG, OP_EORS, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_S_ASR_IMM, S_ASR_IMM, OP_EORS, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_S_ASR_REG, S_ASR_REG, OP_EORS, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_S_ROR_IMM, S_ROR_IMM, OP_EORS, 1, 3)\nDCL_OP_DATAPROCESS(OP_EOR_S_ROR_REG, S_ROR_REG, OP_EORS, 2, 4)\nDCL_OP_DATAPROCESS(OP_EOR_S_IMM_VAL, S_IMM_VALUE, OP_EORS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   SUB / SUBS\n//-----------------------------------------------------------------------------\n#define OP_SUB_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_SUB_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_SUB(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) - shift_op; \\\n\tGOTO_NEXTOP(a);\n#define OP_SUB_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) - shift_op; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_SUBS_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_SUBS_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_SUBS(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12 = *DATA(r_12) = v - shift_op; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tDATA(cpsr)->bits.C = !BorrowFrom(v, shift_op); \\\n\tDATA(cpsr)->bits.V = OverflowFromSUB(r_12, v, shift_op); \\\n\tGOTO_NEXTOP(a);\n#define OP_SUBS_WR15(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12 = *DATA(r_12) = v - shift_op; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_SUB_LSL_IMM, LSL_IMM, OP_SUB, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_LSL_REG, LSL_REG, OP_SUB, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_LSR_IMM, LSR_IMM, OP_SUB, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_LSR_REG, LSR_REG, OP_SUB, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_ASR_IMM, ASR_IMM, OP_SUB, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_ASR_REG, ASR_REG, OP_SUB, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_ROR_IMM, ROR_IMM, OP_SUB, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_ROR_REG, ROR_REG, OP_SUB, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_IMM_VAL, IMM_VALUE, OP_SUB, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_SUB_S_LSL_IMM, LSL_IMM, OP_SUBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_S_LSL_REG, LSL_REG, OP_SUBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_S_LSR_IMM, LSR_IMM, OP_SUBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_S_LSR_REG, LSR_REG, OP_SUBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_S_ASR_IMM, ASR_IMM, OP_SUBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_S_ASR_REG, ASR_REG, OP_SUBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_S_ROR_IMM, ROR_IMM2, OP_SUBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SUB_S_ROR_REG, ROR_REG, OP_SUBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SUB_S_IMM_VAL, IMM_VALUE, OP_SUBS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   RSB / RSBS\n//-----------------------------------------------------------------------------\n#define OP_RSB_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_RSB_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_RSB(a, b) \\\n\t*DATA(r_12) = shift_op - *DATA(r_16); \\\n\tGOTO_NEXTOP(a);\n#define OP_RSB_WR15(a, b) \\\n\t*DATA(r_12) = shift_op - *DATA(r_16); \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_RSBS_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_RSBS_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_RSBS(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12 = *DATA(r_12) = shift_op - v; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tDATA(cpsr)->bits.C = !BorrowFrom(shift_op, v); \\\n\tDATA(cpsr)->bits.V = OverflowFromSUB(r_12, shift_op, v); \\\n\tGOTO_NEXTOP(a);\n#define OP_RSBS_WR15(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12 = *DATA(r_12) = shift_op - v; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_RSB_LSL_IMM, LSL_IMM, OP_RSB, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_LSL_REG, LSL_REG, OP_RSB, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_LSR_IMM, LSR_IMM, OP_RSB, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_LSR_REG, LSR_REG, OP_RSB, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_ASR_IMM, ASR_IMM, OP_RSB, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_ASR_REG, ASR_REG, OP_RSB, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_ROR_IMM, ROR_IMM, OP_RSB, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_ROR_REG, ROR_REG, OP_RSB, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_IMM_VAL, IMM_VALUE, OP_RSB, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_RSB_S_LSL_IMM, LSL_IMM, OP_RSBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_S_LSL_REG, LSL_REG, OP_RSBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_S_LSR_IMM, LSR_IMM, OP_RSBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_S_LSR_REG, LSR_REG, OP_RSBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_S_ASR_IMM, ASR_IMM, OP_RSBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_S_ASR_REG, ASR_REG, OP_RSBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_S_ROR_IMM, ROR_IMM2, OP_RSBS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSB_S_ROR_REG, ROR_REG, OP_RSBS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSB_S_IMM_VAL, IMM_VALUE, OP_RSBS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   ADD / ADDS\n//-----------------------------------------------------------------------------\n#define OP_ADD_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_ADD_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_ADD(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) + shift_op; \\\n\tGOTO_NEXTOP(a);\n#define OP_ADD_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) + shift_op; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_ADDS_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_ADDS_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_ADDS(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12 = *DATA(r_12) = v + shift_op; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tDATA(cpsr)->bits.C = CarryFrom(v, shift_op); \\\n\tDATA(cpsr)->bits.V = OverflowFromADD(r_12, v, shift_op); \\\n\tGOTO_NEXTOP(a);\n#define OP_ADDS_WR15(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12 = *DATA(r_12) = v + shift_op; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_ADD_LSL_IMM, LSL_IMM, OP_ADD, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_LSL_REG, LSL_REG, OP_ADD, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_LSR_IMM, LSR_IMM, OP_ADD, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_LSR_REG, LSR_REG, OP_ADD, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_ASR_IMM, ASR_IMM, OP_ADD, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_ASR_REG, ASR_REG, OP_ADD, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_ROR_IMM, ROR_IMM, OP_ADD, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_ROR_REG, ROR_REG, OP_ADD, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_IMM_VAL, IMM_VALUE, OP_ADD, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_ADD_S_LSL_IMM, LSL_IMM, OP_ADDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_S_LSL_REG, LSL_REG, OP_ADDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_S_LSR_IMM, LSR_IMM, OP_ADDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_S_LSR_REG, LSR_REG, OP_ADDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_S_ASR_IMM, ASR_IMM, OP_ADDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_S_ASR_REG, ASR_REG, OP_ADDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_S_ROR_IMM, ROR_IMM2, OP_ADDS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADD_S_ROR_REG, ROR_REG, OP_ADDS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADD_S_IMM_VAL, IMM_VALUE, OP_ADDS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   ADC / ADCS\n//-----------------------------------------------------------------------------\n#define OP_ADC_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_ADC_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_ADC(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) + shift_op + DATA(cpsr)->bits.C; \\\n\tGOTO_NEXTOP(a);\n#define OP_ADC_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) + shift_op + DATA(cpsr)->bits.C; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_ADCS_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_ADCS_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_ADCS(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12; \\\n\tif (!DATA(cpsr)->bits.C) \\\n\t{ \\\n\t\tr_12 = *DATA(r_12) = v + shift_op; \\\n\t\tDATA(cpsr)->bits.C = *DATA(r_12) < v; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tr_12 = *DATA(r_12) = v + shift_op + 1; \\\n\t\tDATA(cpsr)->bits.C = *DATA(r_12) <= v; \\\n\t} \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tDATA(cpsr)->bits.V = BIT31((v ^ shift_op ^ -1) & (v ^ r_12));\\\n\tGOTO_NEXTOP(a); \n#define OP_ADCS_WR15(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\t*DATA(r_12) = v + shift_op + DATA(cpsr)->bits.C; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_ADC_LSL_IMM, LSL_IMM, OP_ADC, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_LSL_REG, LSL_REG, OP_ADC, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_LSR_IMM, LSR_IMM, OP_ADC, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_LSR_REG, LSR_REG, OP_ADC, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_ASR_IMM, ASR_IMM, OP_ADC, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_ASR_REG, ASR_REG, OP_ADC, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_ROR_IMM, ROR_IMM2, OP_ADC, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_ROR_REG, ROR_REG, OP_ADC, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_IMM_VAL, IMM_VALUE, OP_ADC, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_ADC_S_LSL_IMM, LSL_IMM, OP_ADCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_S_LSL_REG, LSL_REG, OP_ADCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_S_LSR_IMM, LSR_IMM, OP_ADCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_S_LSR_REG, LSR_REG, OP_ADCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_S_ASR_IMM, ASR_IMM, OP_ADCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_S_ASR_REG, ASR_REG, OP_ADCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_S_ROR_IMM, ROR_IMM2, OP_ADCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ADC_S_ROR_REG, ROR_REG, OP_ADCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ADC_S_IMM_VAL, IMM_VALUE, OP_ADCS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   SBC / SBCS\n//-----------------------------------------------------------------------------\n#define OP_SBC_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_SBC_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_SBC(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) - shift_op - !DATA(cpsr)->bits.C; \\\n\tGOTO_NEXTOP(a);\n#define OP_SBC_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) - shift_op - !DATA(cpsr)->bits.C; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_SBCS_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_SBCS_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_SBCS(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12; \\\n\tif (!DATA(cpsr)->bits.C) \\\n\t{ \\\n\t\tr_12 = *DATA(r_12) = v - shift_op - 1; \\\n\t\tDATA(cpsr)->bits.C = v > shift_op; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tr_12 = *DATA(r_12) = v - shift_op; \\\n\t\tDATA(cpsr)->bits.C = v >= shift_op; \\\n\t} \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tDATA(cpsr)->bits.V = BIT31((v ^ shift_op) & (v ^ r_12)); \\\n\tGOTO_NEXTOP(a);\n#define OP_SBCS_WR15(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\t*DATA(r_12) = v - shift_op - !DATA(cpsr)->bits.C; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_SBC_LSL_IMM, LSL_IMM, OP_SBC, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_LSL_REG, LSL_REG, OP_SBC, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_LSR_IMM, LSR_IMM, OP_SBC, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_LSR_REG, LSR_REG, OP_SBC, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_ASR_IMM, ASR_IMM, OP_SBC, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_ASR_REG, ASR_REG, OP_SBC, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_ROR_IMM, ROR_IMM2, OP_SBC, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_ROR_REG, ROR_REG, OP_SBC, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_IMM_VAL, IMM_VALUE, OP_SBC, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_SBC_S_LSL_IMM, LSL_IMM, OP_SBCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_S_LSL_REG, LSL_REG, OP_SBCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_S_LSR_IMM, LSR_IMM, OP_SBCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_S_LSR_REG, LSR_REG, OP_SBCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_S_ASR_IMM, ASR_IMM, OP_SBCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_S_ASR_REG, ASR_REG, OP_SBCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_S_ROR_IMM, ROR_IMM2, OP_SBCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_SBC_S_ROR_REG, ROR_REG, OP_SBCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_SBC_S_IMM_VAL, IMM_VALUE, OP_SBCS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   RSC / RSCS\n//-----------------------------------------------------------------------------\n#define OP_RSC_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_RSC_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_RSC(a, b) \\\n\t*DATA(r_12) = shift_op - *DATA(r_16) + DATA(cpsr)->bits.C - 1; \\\n\tGOTO_NEXTOP(a);\n#define OP_RSC_WR15(a, b) \\\n\t*DATA(r_12) = shift_op - *DATA(r_16) + DATA(cpsr)->bits.C - 1; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_RSCS_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_RSCS_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_RSCS(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\tu32 r_12; \\\n\tif (!DATA(cpsr)->bits.C) \\\n\t{ \\\n\t\tr_12 = *DATA(r_12) = shift_op - v - 1; \\\n\t\tDATA(cpsr)->bits.C = shift_op > v; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tr_12 = *DATA(r_12) = shift_op - v; \\\n\t\tDATA(cpsr)->bits.C = shift_op >= v; \\\n\t} \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tDATA(cpsr)->bits.V = BIT31((shift_op ^ v) & (shift_op ^ r_12)); \\\n\tGOTO_NEXTOP(a); \n#define OP_RSCS_WR15(a, b) \\\n\tu32 v = *DATA(r_16); \\\n\t*DATA(r_12) = shift_op - v - !DATA(cpsr)->bits.C; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_RSC_LSL_IMM, LSL_IMM, OP_RSC, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_LSL_REG, LSL_REG, OP_RSC, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_LSR_IMM, LSR_IMM, OP_RSC, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_LSR_REG, LSR_REG, OP_RSC, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_ASR_IMM, ASR_IMM, OP_RSC, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_ASR_REG, ASR_REG, OP_RSC, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_ROR_IMM, ROR_IMM2, OP_RSC, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_ROR_REG, ROR_REG, OP_RSC, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_IMM_VAL, IMM_VALUE, OP_RSC, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_RSC_S_LSL_IMM, LSL_IMM, OP_RSCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_S_LSL_REG, LSL_REG, OP_RSCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_S_LSR_IMM, LSR_IMM, OP_RSCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_S_LSR_REG, LSR_REG, OP_RSCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_S_ASR_IMM, ASR_IMM, OP_RSCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_S_ASR_REG, ASR_REG, OP_RSCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_S_ROR_IMM, ROR_IMM2, OP_RSCS, 1, 3)\nDCL_OP_DATAPROCESS(OP_RSC_S_ROR_REG, ROR_REG, OP_RSCS, 2, 4)\nDCL_OP_DATAPROCESS(OP_RSC_S_IMM_VAL, IMM_VALUE, OP_RSCS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\n#define OP_TST_DATA \\\n\tu32 *r_16;\n#define OP_TST_COMPILER \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16));\n#define OP_TST(a) \\\n\t{ \\\n\tu32 tmp = *DATA(r_16) & shift_op; \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(tmp); \\\n\tDATA(cpsr)->bits.Z = (tmp==0); \\\n\tGOTO_NEXTOP(a); \\\n\t}\n\nDCL_OP2_ARG1(OP_TST_LSL_IMM, S_LSL_IMM, OP_TST, 1)\nDCL_OP2_ARG1(OP_TST_LSL_REG, S_LSL_REG, OP_TST, 2)\nDCL_OP2_ARG1(OP_TST_LSR_IMM, S_LSR_IMM, OP_TST, 1)\nDCL_OP2_ARG1(OP_TST_LSR_REG, S_LSR_REG, OP_TST, 2)\nDCL_OP2_ARG1(OP_TST_ASR_IMM, S_ASR_IMM, OP_TST, 1)\nDCL_OP2_ARG1(OP_TST_ASR_REG, S_ASR_REG, OP_TST, 2)\nDCL_OP2_ARG1(OP_TST_ROR_IMM, S_ROR_IMM, OP_TST, 1)\nDCL_OP2_ARG1(OP_TST_ROR_REG, S_ROR_REG, OP_TST, 2)\nDCL_OP2_ARG1(OP_TST_IMM_VAL, S_IMM_VALUE, OP_TST, 1)\n\n//-----------------------------------------------------------------------------\n//   TEQ\n//-----------------------------------------------------------------------------\n#define OP_TEQ_DATA \\\n\tu32 *r_16;\n#define OP_TEQ_COMPILER \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16));\n#define OP_TEQ(a) \\\n\t{ \\\n\tu32 tmp = *DATA(r_16) ^ shift_op; \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(tmp); \\\n\tDATA(cpsr)->bits.Z = (tmp==0); \\\n\tGOTO_NEXTOP(a); \\\n\t}\n\nDCL_OP2_ARG1(OP_TEQ_LSL_IMM, S_LSL_IMM, OP_TEQ, 1)\nDCL_OP2_ARG1(OP_TEQ_LSL_REG, S_LSL_REG, OP_TEQ, 2)\nDCL_OP2_ARG1(OP_TEQ_LSR_IMM, S_LSR_IMM, OP_TEQ, 1)\nDCL_OP2_ARG1(OP_TEQ_LSR_REG, S_LSR_REG, OP_TEQ, 2)\nDCL_OP2_ARG1(OP_TEQ_ASR_IMM, S_ASR_IMM, OP_TEQ, 1)\nDCL_OP2_ARG1(OP_TEQ_ASR_REG, S_ASR_REG, OP_TEQ, 2)\nDCL_OP2_ARG1(OP_TEQ_ROR_IMM, S_ROR_IMM, OP_TEQ, 1)\nDCL_OP2_ARG1(OP_TEQ_ROR_REG, S_ROR_REG, OP_TEQ, 2)\nDCL_OP2_ARG1(OP_TEQ_IMM_VAL, S_IMM_VALUE, OP_TEQ, 1)\n\n//-----------------------------------------------------------------------------\n//   CMP\n//-----------------------------------------------------------------------------\n#define OP_CMP_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_16;\n#define OP_CMP_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16));\n#define OP_CMP(a) \\\n\t{ \\\n\tu32 r_16 = *DATA(r_16); \\\n\tu32 tmp = r_16 - shift_op; \\\n\tDATA(cpsr)->bits.N = BIT31(tmp); \\\n\tDATA(cpsr)->bits.Z = (tmp==0); \\\n\tDATA(cpsr)->bits.C = !BorrowFrom(r_16, shift_op); \\\n\tDATA(cpsr)->bits.V = OverflowFromSUB(tmp, r_16, shift_op); \\\n\tGOTO_NEXTOP(a); \\\n\t}\n\nDCL_OP2_ARG1(OP_CMP_LSL_IMM, LSL_IMM, OP_CMP, 1)\nDCL_OP2_ARG1(OP_CMP_LSL_REG, LSL_REG, OP_CMP, 2)\nDCL_OP2_ARG1(OP_CMP_LSR_IMM, LSR_IMM, OP_CMP, 1)\nDCL_OP2_ARG1(OP_CMP_LSR_REG, LSR_REG, OP_CMP, 2)\nDCL_OP2_ARG1(OP_CMP_ASR_IMM, ASR_IMM, OP_CMP, 1)\nDCL_OP2_ARG1(OP_CMP_ASR_REG, ASR_REG, OP_CMP, 2)\nDCL_OP2_ARG1(OP_CMP_ROR_IMM, ROR_IMM2, OP_CMP, 1)\nDCL_OP2_ARG1(OP_CMP_ROR_REG, ROR_REG, OP_CMP, 2)\nDCL_OP2_ARG1(OP_CMP_IMM_VAL, IMM_VALUE, OP_CMP, 1)\n\n//-----------------------------------------------------------------------------\n//   CMN\n//-----------------------------------------------------------------------------\n#define OP_CMN_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_16;\n#define OP_CMN_COMPILER \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16));\n#define OP_CMN(a) \\\n\t{ \\\n\tu32 r_16 = *DATA(r_16); \\\n\tu32 tmp = r_16 + shift_op; \\\n\tDATA(cpsr)->bits.N = BIT31(tmp); \\\n\tDATA(cpsr)->bits.Z = (tmp==0); \\\n\tDATA(cpsr)->bits.C = CarryFrom(r_16, shift_op); \\\n\tDATA(cpsr)->bits.V = OverflowFromADD(tmp, r_16, shift_op); \\\n\tGOTO_NEXTOP(a); \\\n\t}\n\nDCL_OP2_ARG1(OP_CMN_LSL_IMM, LSL_IMM, OP_CMN, 1)\nDCL_OP2_ARG1(OP_CMN_LSL_REG, LSL_REG, OP_CMN, 2)\nDCL_OP2_ARG1(OP_CMN_LSR_IMM, LSR_IMM, OP_CMN, 1)\nDCL_OP2_ARG1(OP_CMN_LSR_REG, LSR_REG, OP_CMN, 2)\nDCL_OP2_ARG1(OP_CMN_ASR_IMM, ASR_IMM, OP_CMN, 1)\nDCL_OP2_ARG1(OP_CMN_ASR_REG, ASR_REG, OP_CMN, 2)\nDCL_OP2_ARG1(OP_CMN_ROR_IMM, ROR_IMM2, OP_CMN, 1)\nDCL_OP2_ARG1(OP_CMN_ROR_REG, ROR_REG, OP_CMN, 2)\nDCL_OP2_ARG1(OP_CMN_IMM_VAL, IMM_VALUE, OP_CMN, 1)\n\n//-----------------------------------------------------------------------------\n//   ORR / ORRS\n//-----------------------------------------------------------------------------\n#define OP_ORR_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_ORR_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_ORR(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) | shift_op; \\\n\tGOTO_NEXTOP(a);\n#define OP_ORR_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) | shift_op; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_ORRS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_ORRS_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_ORRS(a,b) \\\n\t{ \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) | shift_op; \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tGOTO_NEXTOP(a); \\\n\t}\n#define OP_ORRS_WR15(a,b) \\\n\t{ \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) | shift_op; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \\\n\t}\n\nDCL_OP_DATAPROCESS(OP_ORR_LSL_IMM, LSL_IMM, OP_ORR, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_LSL_REG, LSL_REG, OP_ORR, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_LSR_IMM, LSR_IMM, OP_ORR, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_LSR_REG, LSR_REG, OP_ORR, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_ASR_IMM, ASR_IMM, OP_ORR, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_ASR_REG, ASR_REG, OP_ORR, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_ROR_IMM, ROR_IMM, OP_ORR, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_ROR_REG, ROR_REG, OP_ORR, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_IMM_VAL, IMM_VALUE, OP_ORR, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_ORR_S_LSL_IMM, S_LSL_IMM, OP_ORRS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_S_LSL_REG, S_LSL_REG, OP_ORRS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_S_LSR_IMM, S_LSR_IMM, OP_ORRS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_S_LSR_REG, S_LSR_REG, OP_ORRS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_S_ASR_IMM, S_ASR_IMM, OP_ORRS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_S_ASR_REG, S_ASR_REG, OP_ORRS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_S_ROR_IMM, S_ROR_IMM, OP_ORRS, 1, 3)\nDCL_OP_DATAPROCESS(OP_ORR_S_ROR_REG, S_ROR_REG, OP_ORRS, 2, 4)\nDCL_OP_DATAPROCESS(OP_ORR_S_IMM_VAL, S_IMM_VALUE, OP_ORRS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   MOV / MOVS\n//-----------------------------------------------------------------------------\n#define OP_MOV_DATA \\\n\tu32 *r_12; \n#define OP_MOV_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2; \n#define OP_MOV_COMPILER_EX(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tif (REG_POS(i,0) == 15) \\\n\t{ \\\n\t\tif (REG_POS(i,12) == 15) \\\n\t\t\tcommon->func = name<PROCNUM>::Method4; \\\n\t\telse \\\n\t\t\tcommon->func = name<PROCNUM>::Method3; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tif (REG_POS(i,12) == 15) \\\n\t\t\tcommon->func = name<PROCNUM>::Method2; \\\n\t\telse \\\n\t\t\tcommon->func = name<PROCNUM>::Method; \\\n\t}\n#define OP_MOV(a, b) \\\n\t*DATA(r_12) = shift_op; \\\n\tGOTO_NEXTOP(a);\n#define OP_MOV_WR15(a, b) \\\n\t*DATA(r_12) = shift_op; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_MOVS_DATA \\\n\tu32 *r_12; \n#define OP_MOVS_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2; \n#define OP_MOVS_COMPILER_EX(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tif (REG_POS(i,0) == 15) \\\n\t{ \\\n\t\tif (REG_POS(i,12) == 15) \\\n\t\t\tcommon->func = name<PROCNUM>::Method4; \\\n\t\telse \\\n\t\t\tcommon->func = name<PROCNUM>::Method3; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tif (REG_POS(i,12) == 15) \\\n\t\t\tcommon->func = name<PROCNUM>::Method2; \\\n\t\telse \\\n\t\t\tcommon->func = name<PROCNUM>::Method; \\\n\t}\n#define OP_MOVS(a, b) \\\n\tu32 r_12 = *DATA(r_12) = shift_op; \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tGOTO_NEXTOP(a);\n#define OP_MOVS_WR15(a, b) \\\n\tu32 r_12 = *DATA(r_12) = shift_op; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_MOV_LSL_IMM, LSL_IMM, OP_MOV, 1, 3)\nDCL_OP_DATAPROCESS_EX(OP_MOV_LSL_REG, LSL_REG, OP_MOV, shift_op += 4;, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_LSR_IMM, LSR_IMM, OP_MOV, 1, 3)\nDCL_OP_DATAPROCESS_EX(OP_MOV_LSR_REG, LSR_REG, OP_MOV, shift_op += 4;, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_ASR_IMM, ASR_IMM, OP_MOV, 1, 3)\nDCL_OP_DATAPROCESS(OP_MOV_ASR_REG, ASR_REG, OP_MOV, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_ROR_IMM, ROR_IMM, OP_MOV, 1, 3)\nDCL_OP_DATAPROCESS(OP_MOV_ROR_REG, ROR_REG, OP_MOV, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_IMM_VAL, IMM_VALUE, OP_MOV, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_MOV_S_LSL_IMM, S_LSL_IMM, OP_MOVS, 1, 3)\nDCL_OP_DATAPROCESS_EX(OP_MOV_S_LSL_REG, S_LSL_REG, OP_MOVS, shift_op += 4;, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_S_LSR_IMM, S_LSR_IMM, OP_MOVS, 1, 3)\nDCL_OP_DATAPROCESS_EX(OP_MOV_S_LSR_REG, S_LSR_REG, OP_MOVS, shift_op += 4;, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_S_ASR_IMM, S_ASR_IMM, OP_MOVS, 1, 3)\nDCL_OP_DATAPROCESS(OP_MOV_S_ASR_REG, S_ASR_REG, OP_MOVS, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_S_ROR_IMM, S_ROR_IMM, OP_MOVS, 1, 3)\nDCL_OP_DATAPROCESS(OP_MOV_S_ROR_REG, S_ROR_REG, OP_MOVS, 2, 4)\nDCL_OP_DATAPROCESS(OP_MOV_S_IMM_VAL, S_IMM_VALUE, OP_MOVS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   BIC / BICS\n//-----------------------------------------------------------------------------\n#define OP_BIC_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_BIC_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_BIC(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) & (~shift_op); \\\n\tGOTO_NEXTOP(a);\n#define OP_BIC_WR15(a, b) \\\n\t*DATA(r_12) = *DATA(r_16) & (~shift_op); \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_BICS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_BICS_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_BICS(a, b) \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) & (~shift_op); \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tGOTO_NEXTOP(a);\n#define OP_BICS_WR15(a, b) \\\n\tu32 r_12 = *DATA(r_12) = *DATA(r_16) & (~shift_op); \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_BIC_LSL_IMM, LSL_IMM, OP_BIC, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_LSL_REG, LSL_REG, OP_BIC, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_LSR_IMM, LSR_IMM, OP_BIC, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_LSR_REG, LSR_REG, OP_BIC, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_ASR_IMM, ASR_IMM, OP_BIC, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_ASR_REG, ASR_REG, OP_BIC, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_ROR_IMM, ROR_IMM, OP_BIC, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_ROR_REG, ROR_REG, OP_BIC, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_IMM_VAL, IMM_VALUE, OP_BIC, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_BIC_S_LSL_IMM, S_LSL_IMM, OP_BICS, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_S_LSL_REG, S_LSL_REG, OP_BICS, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_S_LSR_IMM, S_LSR_IMM, OP_BICS, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_S_LSR_REG, S_LSR_REG, OP_BICS, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_S_ASR_IMM, S_ASR_IMM, OP_BICS, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_S_ASR_REG, S_ASR_REG, OP_BICS, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_S_ROR_IMM, S_ROR_IMM, OP_BICS, 1, 3)\nDCL_OP_DATAPROCESS(OP_BIC_S_ROR_REG, S_ROR_REG, OP_BICS, 2, 4)\nDCL_OP_DATAPROCESS(OP_BIC_S_IMM_VAL, S_IMM_VALUE, OP_BICS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   MVN / MVNS\n//-----------------------------------------------------------------------------\n#define OP_MVN_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_MVN_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_MVN(a, b) \\\n\t*DATA(r_12) = ~shift_op; \\\n\tGOTO_NEXTOP(a);\n#define OP_MVN_WR15(a, b) \\\n\t*DATA(r_12) = ~shift_op; \\\n\tGOTO_NEXBLOCK(b); \n\n#define OP_MVNS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_MVNS_COMPILER(name) \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_MVNS(a, b) \\\n\tu32 r_12 = *DATA(r_12) = ~shift_op; \\\n\tDATA(cpsr)->bits.C = c; \\\n\tDATA(cpsr)->bits.N = BIT31(r_12); \\\n\tDATA(cpsr)->bits.Z = (r_12==0); \\\n\tGOTO_NEXTOP(a);\n#define OP_MVNS_WR15(a, b) \\\n\tu32 r_12 = *DATA(r_12) = ~shift_op; \\\n\tStatus_Reg SPSR = GETCPU.SPSR; \\\n\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode); \\\n\t*DATA(cpsr)=SPSR; \\\n\tGETCPU.changeCPSR(); \\\n\t*DATA(r_12) &= (0xFFFFFFFC|(((u32)DATA(cpsr)->bits.T)<<1)); \\\n\tGOTO_NEXBLOCK(b); \n\nDCL_OP_DATAPROCESS(OP_MVN_LSL_IMM, LSL_IMM, OP_MVN, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_LSL_REG, LSL_REG, OP_MVN, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_LSR_IMM, LSR_IMM, OP_MVN, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_LSR_REG, LSR_REG, OP_MVN, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_ASR_IMM, ASR_IMM, OP_MVN, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_ASR_REG, ASR_REG, OP_MVN, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_ROR_IMM, ROR_IMM, OP_MVN, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_ROR_REG, ROR_REG, OP_MVN, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_IMM_VAL, IMM_VALUE, OP_MVN, 1, 3)\n\nDCL_OP_DATAPROCESS(OP_MVN_S_LSL_IMM, S_LSL_IMM, OP_MVNS, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_S_LSL_REG, S_LSL_REG, OP_MVNS, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_S_LSR_IMM, S_LSR_IMM, OP_MVNS, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_S_LSR_REG, S_LSR_REG, OP_MVNS, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_S_ASR_IMM, S_ASR_IMM, OP_MVNS, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_S_ASR_REG, S_ASR_REG, OP_MVNS, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_S_ROR_IMM, S_ROR_IMM, OP_MVNS, 1, 3)\nDCL_OP_DATAPROCESS(OP_MVN_S_ROR_REG, S_ROR_REG, OP_MVNS, 2, 4)\nDCL_OP_DATAPROCESS(OP_MVN_S_IMM_VAL, S_IMM_VALUE, OP_MVNS, 1, 3)\n\n//-----------------------------------------------------------------------------\n//   MUL / MULS / MLA / MLAS\n//-----------------------------------------------------------------------------\n#define MUL_Mxx_END(c) \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFFFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+1); \\\n\t} \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+2); \\\n\t} \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+3); \\\n\t} \\\n\tGOTO_NEXTOP(c+4);\n\nDCL_OP_START(OP_MUL)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_MUL)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MUL)\n\t\tu32 v = *DATA(r_8);\n\t\t*DATA(r_16) = *DATA(r_0) * v;\n\n\t\tMUL_Mxx_END(1)\n\t}\n};\n\nDCL_OP_START(OP_MLA)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_MLA)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MLA)\n\t\tu32 v = *DATA(r_8);\n\t\t*DATA(r_16) = *DATA(r_0) * v + *DATA(r_12);\n\n\t\tMUL_Mxx_END(2)\n\t}\n};\n\nDCL_OP_START(OP_MUL_S)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_MUL_S)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MUL_S)\n\t\tu32 v = *DATA(r_8);\n\t\tu32 r_16 = *DATA(r_16) = *DATA(r_0) * v;\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_16);\n\t\tDATA(cpsr)->bits.Z = (r_16==0);\n\n\t\tMUL_Mxx_END(1)\n\t}\n};\n\nDCL_OP_START(OP_MLA_S)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_MLA_S)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MLA_S)\n\t\tu32 v = *DATA(r_8);\n\t\tu32 r_16 = *DATA(r_16) = *DATA(r_0) * v + *DATA(r_12);\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_16);\n\t\tDATA(cpsr)->bits.Z = (r_16==0);\n\n\t\tMUL_Mxx_END(2)\n\t}\n};\n\n#undef MUL_Mxx_END\n\n//-----------------------------------------------------------------------------\n//   UMULL / UMULLS / UMLAL / UMLALS\n//-----------------------------------------------------------------------------\n#define MUL_UMxxL_END(c) \\\n\tv >>= 8; \\\n\tif(v==0) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+1); \\\n\t} \\\n\tv >>= 8; \\\n\tif(v==0) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+2); \\\n\t} \\\n\tv >>= 8; \\\n\tif(v==0) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+3); \\\n\t} \\\n\tGOTO_NEXTOP(c+4); \n\nDCL_OP_START(OP_UMULL)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_UMULL)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_UMULL)\n\t\tu32 v = *DATA(r_8);\n\t\tu64 res = (u64)*DATA(r_0) * (u64)v;\n\n\t\t*DATA(r_12) = (u32)res;\n\t\t*DATA(r_16) = (u32)(res>>32);\n\n\t\tMUL_UMxxL_END(2)\n\t}\n};\n\nDCL_OP_START(OP_UMLAL)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_UMLAL)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_UMLAL)\n\t\tu32 v = *DATA(r_8);\n\t\tu64 res = (u64)*DATA(r_0) * (u64)v;\n\n\t\tu32 tmp = (u32)res;\n\t\t*DATA(r_16) = (u32)(res>>32) + *DATA(r_16) + CarryFrom(tmp, *DATA(r_12));\n\t\t*DATA(r_12) += tmp; \n\n\t\tMUL_UMxxL_END(3)\n\t}\n};\n\nDCL_OP_START(OP_UMULL_S)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_UMULL_S)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_UMULL_S)\n\t\tu32 v = *DATA(r_8);\n\t\tu64 res = (u64)*DATA(r_0) * (u64)v;\n\n\t\t*DATA(r_12) = (u32)res;\n\t\tu32 r_16 = *DATA(r_16) = (u32)(res>>32);\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_16);\n\t\t//DATA(cpsr)->bits.Z = (r_16==0) && (*DATA(r_12)==0);\n\t\tDATA(cpsr)->bits.Z = res==0;\n\n\t\tMUL_UMxxL_END(2)\n\t}\n};\n\nDCL_OP_START(OP_UMLAL_S)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_UMLAL_S)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_UMLAL_S)\n\t\tu32 v = *DATA(r_8);\n\t\tu64 res = (u64)*DATA(r_0) * (u64)v;\n\n\t\tu32 tmp = (u32)res;\n\t\tu32 r_16 = *DATA(r_16) = (u32)(res>>32) + *DATA(r_16) + CarryFrom(tmp, *DATA(r_12));\n\t\tu32 r_12 = *DATA(r_12) += tmp; \n\n\t\tDATA(cpsr)->bits.N = BIT31(r_16);\n\t\tDATA(cpsr)->bits.Z = (r_16==0) && (r_12==0);\n\n\t\tMUL_UMxxL_END(3)\n\t}\n};\n\n#undef MUL_UMxxL_END\n\n//-----------------------------------------------------------------------------\n//   SMULL / SMULLS / SMLAL / SMLALS\n//-----------------------------------------------------------------------------\n#define MUL_SMxxL_END(c) \\\n\tv &= 0xFFFFFFFF; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFFFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+1); \\\n\t} \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+2); \\\n\t} \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFF)) \\\n\t{ \\\n\t\tGOTO_NEXTOP(c+3); \\\n\t} \\\n\tGOTO_NEXTOP(c+4); \n\nDCL_OP_START(OP_SMULL)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_SMULL)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMULL)\n\t\ts64 v = (s32)*DATA(r_8);\n\t\ts64 res = v * (s64)(s32)*DATA(r_0);\n\n\t\t*DATA(r_12) = (u32)res;\n\t\t*DATA(r_16) = (u32)(res>>32);\n\n\t\tMUL_SMxxL_END(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLAL)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_SMLAL)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAL)\n\t\ts64 v = (s32)*DATA(r_8);\n\t\ts64 res = v * (s64)(s32)*DATA(r_0);\n\n\t\tu32 tmp = (u32)res;\n\n\t\t*DATA(r_16) = (u32)(res>>32) + *DATA(r_16) + CarryFrom(tmp, *DATA(r_12));\n\t\t*DATA(r_12) += tmp;\n\n\t\tMUL_SMxxL_END(3)\n\t}\n};\n\nDCL_OP_START(OP_SMULL_S)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_SMULL_S)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMULL_S)\n\t\ts64 v = (s32)*DATA(r_8);\n\t\ts64 res = v * (s64)(s32)*DATA(r_0);\n\n\t\t*DATA(r_12) = (u32)res;\n\t\tu32 r_16 = *DATA(r_16) = (u32)(res>>32);\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_16);\n\t\t//DATA(cpsr)->bits.Z = (*DATA(r_16)==0) && (*DATA(r_12)==0);\n\t\tDATA(cpsr)->bits.Z = res==0;\n\n\t\tMUL_SMxxL_END(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLAL_S)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_SMLAL_S)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i,8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAL_S)\n\t\ts64 v = (s32)*DATA(r_8);\n\t\ts64 res = v * (s64)(s32)*DATA(r_0);\n\n\t\tu32 tmp = (u32)res;\n\n\t\tu32 r_16 = *DATA(r_16) = (u32)(res>>32) + *DATA(r_16) + CarryFrom(tmp, *DATA(r_12));\n\t\tu32 r_12 = *DATA(r_12) += tmp;\n\n\t\tDATA(cpsr)->bits.N = BIT31(r_16);\n\t\tDATA(cpsr)->bits.Z = (r_16==0) && (r_12==0);\n\n\t\tMUL_SMxxL_END(3)\n\t}\n};\n\n#undef MUL_SMxxL_END\n\n//-----------------------------------------------------------------------------\n//   SWP / SWPB\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SWP)\n\tu32 *r_0;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_SWP)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SWP)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 tmp = ROR(READ32(GETCPU.mem_if->data, adr), (adr & 3)<<3);\n\n\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_0));\n\t\t*DATA(r_12) = tmp;\n\n\t\tu32 c = MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(4, c);\n\n\t\tGOTO_NEXTOP(c);\n\t}\n};\n\nDCL_OP_START(OP_SWPB)\n\tu32 *r_0;\n\tu32 *r_12;\n\tu32 *r_16; \n\n\tDCL_OP_COMPILER(OP_SWPB)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i,0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i,16)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SWPB)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 tmp = READ8(GETCPU.mem_if->data, adr);\n\n\t\tWRITE8(GETCPU.mem_if->data, adr, (u8)(*DATA(r_0)&0xFF));\n\t\t*DATA(r_12) = tmp;\n\n\t\tu32 c = MMU_memAccessCycles<PROCNUM,8,MMU_AD_READ>(adr);\n\t\tc += MMU_memAccessCycles<PROCNUM,8,MMU_AD_WRITE>(adr);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(4, c);\n\n\t\tGOTO_NEXTOP(c);\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LDR/STR macros\n//-----------------------------------------------------------------------------\n#define OP_LDR_PRE_(Op, Adr, MemCycles) \\\n\tDCL_OP_START(OP_##Op##_##Adr) \\\n\t\tOp##_DATA \\\n\t\tAdr##_DATA \\\n\t\tDCL_OP_COMPILER(OP_##Op##_##Adr) \\\n\t\t\tOp##_COMPILER \\\n\t\t\tAdr##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(OP_##Op##_##Adr) \\\n\t\t\tPRE_INDE_##Adr \\\n\t\t\tOp \\\n\t\t\tu32 c = (MemCycles); \\\n\t\t\tGOTO_NEXTOP(c) \\\n\t\t} \\\n\t};\n\n#define OP_LDR_PRE_WB_(Op, Adr, MemCycles) \\\n\tDCL_OP_START(OP_##Op##_PRE_INDE_##Adr) \\\n\t\tOp##_DATA \\\n\t\tAdr##_DATA \\\n\t\tDCL_OP_COMPILER(OP_##Op##_PRE_INDE_##Adr) \\\n\t\t\tOp##_COMPILER \\\n\t\t\tAdr##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(OP_##Op##_PRE_INDE_##Adr) \\\n\t\t\tPRE_INDE_##Adr \\\n\t\t\tPRE_INDE_ADR_WB \\\n\t\t\tOp \\\n\t\t\tu32 c = (MemCycles); \\\n\t\t\tGOTO_NEXTOP(c) \\\n\t\t} \\\n\t};\n\n#define OP_LDR_POS_(Op, Adr, MemCycles) \\\n\tDCL_OP_START(OP_##Op##_POS_INDE_##Adr) \\\n\t\tOp##_DATA \\\n\t\tAdr##_DATA \\\n\t\tDCL_OP_COMPILER(OP_##Op##_POS_INDE_##Adr) \\\n\t\t\tOp##_COMPILER \\\n\t\t\tAdr##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(OP_##Op##_POS_INDE_##Adr) \\\n\t\t\tPOS_INDE_ADR_CALC \\\n\t\t\tPOS_INDE_##Adr \\\n\t\t\tOp \\\n\t\t\tu32 c = (MemCycles); \\\n\t\t\tGOTO_NEXTOP(c) \\\n\t\t} \\\n\t};\n\n#define OP_STR_PRE_(Op, Adr, MemCycles) \\\n\tDCL_OP_START(OP_##Op##_##Adr) \\\n\t\tOp##_DATA \\\n\t\tAdr##_DATA \\\n\t\tDCL_OP_COMPILER(OP_##Op##_##Adr) \\\n\t\t\tOp##_COMPILER \\\n\t\t\tAdr##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(OP_##Op##_##Adr) \\\n\t\t\tPRE_INDE_##Adr \\\n\t\t\tOp \\\n\t\t\tu32 c = (MemCycles); \\\n\t\t\tGOTO_NEXTOP(c) \\\n\t\t} \\\n\t};\n\n#define OP_STR_PRE_WB_(Op, Adr, MemCycles) \\\n\tDCL_OP_START(OP_##Op##_PRE_INDE_##Adr) \\\n\t\tOp##_DATA \\\n\t\tAdr##_DATA \\\n\t\tDCL_OP_COMPILER(OP_##Op##_PRE_INDE_##Adr) \\\n\t\t\tOp##_COMPILER \\\n\t\t\tAdr##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(OP_##Op##_PRE_INDE_##Adr) \\\n\t\t\tPRE_INDE_##Adr \\\n\t\t\tPRE_INDE_ADR_WB \\\n\t\t\tOp \\\n\t\t\tu32 c = (MemCycles); \\\n\t\t\tGOTO_NEXTOP(c) \\\n\t\t} \\\n\t};\n\n#define OP_STR_POS_(Op, Adr, MemCycles) \\\n\tDCL_OP_START(OP_##Op##_POS_INDE_##Adr) \\\n\t\tOp##_DATA \\\n\t\tAdr##_DATA \\\n\t\tDCL_OP_COMPILER(OP_##Op##_POS_INDE_##Adr) \\\n\t\t\tOp##_COMPILER \\\n\t\t\tAdr##_COMPILER \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(OP_##Op##_POS_INDE_##Adr) \\\n\t\t\tPOS_INDE_ADR_CALC \\\n\t\t\tOp \\\n\t\t\tPOS_INDE_##Adr \\\n\t\t\tu32 c = (MemCycles); \\\n\t\t\tGOTO_NEXTOP(c) \\\n\t\t} \\\n\t};\n\n#define IMM_OFF (((i>>4)&0xF0)+(i&0xF))\n\n#define P_IMM_OFF_DATA \\\n\tu32 *r_16; \\\n\tu32 value;\n#define P_IMM_OFF_COMPILER \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i,16)); \\\n\tDATA(value) = IMM_OFF;\n\n#define M_IMM_OFF_DATA \\\n\tu32 *r_16; \\\n\tu32 value;\n#define M_IMM_OFF_COMPILER \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i,16)); \\\n\tDATA(value) = IMM_OFF;\n\n#define P_REG_OFF_DATA \\\n\tu32 *r_0; \\\n\tu32 *r_16;\n#define P_REG_OFF_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i,16)); \n\n#define M_REG_OFF_DATA \\\n\tu32 *r_0; \\\n\tu32 *r_16;\n#define M_REG_OFF_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i,16)); \n\n#define PRE_INDE_P_IMM_OFF \\\n\tu32 adr = *DATA(r_16) + DATA(value); \n#define PRE_INDE_M_IMM_OFF \\\n\tu32 adr = *DATA(r_16) - DATA(value); \n#define PRE_INDE_P_REG_OFF \\\n\tu32 adr = *DATA(r_16) + *DATA(r_0); \n#define PRE_INDE_M_REG_OFF \\\n\tu32 adr = *DATA(r_16) - *DATA(r_0); \n#define PRE_INDE_ADR_WB \\\n\t*DATA(r_16) = adr; \n\n#define POS_INDE_ADR_CALC \\\n\tu32 adr = *DATA(r_16); \n#define POS_INDE_P_IMM_OFF \\\n\t*DATA(r_16) += DATA(value);\n#define POS_INDE_M_IMM_OFF \\\n\t*DATA(r_16) -= DATA(value);\n#define POS_INDE_P_REG_OFF \\\n\t*DATA(r_16) += *DATA(r_0); \n#define POS_INDE_M_REG_OFF \\\n\t*DATA(r_16) -= *DATA(r_0); \n\n//-----------------------------------------------------------------------------\n//   LDRH\n//-----------------------------------------------------------------------------\n#define LDRH_DATA \\\n\tu32 *r_12; \n#define LDRH_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \n#define LDRH \\\n\t*DATA(r_12) = (u32)READ16(GETCPU.mem_if->data, adr);\n\n#define LDRH_MEMCYCLES \\\n\tMMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr)\n\nOP_LDR_PRE_(LDRH, P_IMM_OFF, LDRH_MEMCYCLES)\nOP_LDR_PRE_(LDRH, M_IMM_OFF, LDRH_MEMCYCLES)\nOP_LDR_PRE_(LDRH, P_REG_OFF, LDRH_MEMCYCLES)\nOP_LDR_PRE_(LDRH, M_REG_OFF, LDRH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRH, P_IMM_OFF, LDRH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRH, M_IMM_OFF, LDRH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRH, P_REG_OFF, LDRH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRH, M_REG_OFF, LDRH_MEMCYCLES)\nOP_LDR_POS_(LDRH, P_IMM_OFF, LDRH_MEMCYCLES)\nOP_LDR_POS_(LDRH, M_IMM_OFF, LDRH_MEMCYCLES)\nOP_LDR_POS_(LDRH, P_REG_OFF, LDRH_MEMCYCLES)\nOP_LDR_POS_(LDRH, M_REG_OFF, LDRH_MEMCYCLES)\n\n#undef LDRH_DATA\n#undef LDRH_COMPILER\n#undef LDRH\n#undef LDRH_MEMCYCLES\n\n//-----------------------------------------------------------------------------\n//   STRH\n//-----------------------------------------------------------------------------\n#define STRH_DATA \\\n\tu32 *r_12; \n#define STRH_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_R(i,12)); \n#define STRH \\\n\tWRITE16(GETCPU.mem_if->data, adr, (u16)*DATA(r_12));\n\n#define STRH_MEMCYCLES \\\n\tMMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr)\n\nOP_STR_PRE_(STRH, P_IMM_OFF, STRH_MEMCYCLES)\nOP_STR_PRE_(STRH, M_IMM_OFF, STRH_MEMCYCLES)\nOP_STR_PRE_(STRH, P_REG_OFF, STRH_MEMCYCLES)\nOP_STR_PRE_(STRH, M_REG_OFF, STRH_MEMCYCLES)\nOP_STR_PRE_WB_(STRH, P_IMM_OFF, STRH_MEMCYCLES)\nOP_STR_PRE_WB_(STRH, M_IMM_OFF, STRH_MEMCYCLES)\nOP_STR_PRE_WB_(STRH, P_REG_OFF, STRH_MEMCYCLES)\nOP_STR_PRE_WB_(STRH, M_REG_OFF, STRH_MEMCYCLES)\nOP_STR_POS_(STRH, P_IMM_OFF, STRH_MEMCYCLES)\nOP_STR_POS_(STRH, M_IMM_OFF, STRH_MEMCYCLES)\nOP_STR_POS_(STRH, P_REG_OFF, STRH_MEMCYCLES)\nOP_STR_POS_(STRH, M_REG_OFF, STRH_MEMCYCLES)\n\n#undef STRH_DATA\n#undef STRH_COMPILER\n#undef STRH\n#undef STRH_MEMCYCLES\n\n//-----------------------------------------------------------------------------\n//   LDRSH\n//-----------------------------------------------------------------------------\n#define LDRSH_DATA \\\n\tu32 *r_12; \n#define LDRSH_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \n#define LDRSH \\\n\t*DATA(r_12) = (s32)((s16)READ16(GETCPU.mem_if->data, adr));\n\n#define LDRSH_MEMCYCLES \\\n\tMMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr)\n\nOP_LDR_PRE_(LDRSH, P_IMM_OFF, LDRSH_MEMCYCLES)\nOP_LDR_PRE_(LDRSH, M_IMM_OFF, LDRSH_MEMCYCLES)\nOP_LDR_PRE_(LDRSH, P_REG_OFF, LDRSH_MEMCYCLES)\nOP_LDR_PRE_(LDRSH, M_REG_OFF, LDRSH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSH, P_IMM_OFF, LDRSH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSH, M_IMM_OFF, LDRSH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSH, P_REG_OFF, LDRSH_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSH, M_REG_OFF, LDRSH_MEMCYCLES)\nOP_LDR_POS_(LDRSH, P_IMM_OFF, LDRSH_MEMCYCLES)\nOP_LDR_POS_(LDRSH, M_IMM_OFF, LDRSH_MEMCYCLES)\nOP_LDR_POS_(LDRSH, P_REG_OFF, LDRSH_MEMCYCLES)\nOP_LDR_POS_(LDRSH, M_REG_OFF, LDRSH_MEMCYCLES)\n\n#undef LDRSH_DATA\n#undef LDRSH_COMPILER\n#undef LDRSH\n#undef LDRSH_MEMCYCLES\n\n//-----------------------------------------------------------------------------\n//   LDRSB\n//-----------------------------------------------------------------------------\n#define LDRSB_DATA \\\n\tu32 *r_12; \n#define LDRSB_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \n#define LDRSB \\\n\t*DATA(r_12) = (s32)((s8)READ8(GETCPU.mem_if->data, adr));\n\n#define LDRSB_MEMCYCLES \\\n\tMMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr)\n\nOP_LDR_PRE_(LDRSB, P_IMM_OFF, LDRSB_MEMCYCLES)\nOP_LDR_PRE_(LDRSB, M_IMM_OFF, LDRSB_MEMCYCLES)\nOP_LDR_PRE_(LDRSB, P_REG_OFF, LDRSB_MEMCYCLES)\nOP_LDR_PRE_(LDRSB, M_REG_OFF, LDRSB_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSB, P_IMM_OFF, LDRSB_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSB, M_IMM_OFF, LDRSB_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSB, P_REG_OFF, LDRSB_MEMCYCLES)\nOP_LDR_PRE_WB_(LDRSB, M_REG_OFF, LDRSB_MEMCYCLES)\nOP_LDR_POS_(LDRSB, P_IMM_OFF, LDRSB_MEMCYCLES)\nOP_LDR_POS_(LDRSB, M_IMM_OFF, LDRSB_MEMCYCLES)\nOP_LDR_POS_(LDRSB, P_REG_OFF, LDRSB_MEMCYCLES)\nOP_LDR_POS_(LDRSB, M_REG_OFF, LDRSB_MEMCYCLES)\n\n#undef LDRSB_DATA\n#undef LDRSB_COMPILER\n#undef LDRSB\n#undef LDRSB_MEMCYCLES\n\n//-----------------------------------------------------------------------------\n//   MRS / MSR\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_MRS_CPSR)\n\tStatus_Reg *cpsr;\n\tu32 *r_12; \n\n\tDCL_OP_COMPILER(OP_MRS_CPSR)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MRS_CPSR)\n\t\t*DATA(r_12) = DATA(cpsr)->val;\n\t\t\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\nDCL_OP_START(OP_MRS_SPSR)\n\tStatus_Reg *spsr;\n\tu32 *r_12; \n\n\tDCL_OP_COMPILER(OP_MRS_SPSR)\n\t\tDATA(spsr) = &(GETCPUPTR->SPSR);\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i,12)); \n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MRS_SPSR)\n\t\t*DATA(r_12) = DATA(spsr)->val;\n\t\t\n\t\tGOTO_NEXTOP(1)\n\t}\n};\n\n#define OPERAND_DATA \\\n\tu32 *r_0; \n#define OPERAND_COMPILER \\\n\tDATA(r_0) = &(ARM_REGPOS_R(i,0)); \n#define OPERAND \\\n\tu32 operand = *DATA(r_0);\n\n#define MSR_CPSR_DATA \\\n\tu32 byte_mask_USR; \\\n\tu32 byte_mask_OTH; \\\n\tbool flag;\n#define MSR_CPSR_COMPILER \\\n\tDATA(byte_mask_USR) = (BIT19(i)?0xFF000000:0x00000000); \\\n\tDATA(byte_mask_OTH) = (BIT16(i)?0x000000FF:0x00000000) | \\\n\t\t\t\t\t\t\t(BIT17(i)?0x0000FF00:0x00000000) | \\\n\t\t\t\t\t\t\t(BIT18(i)?0x00FF0000:0x00000000) | \\\n\t\t\t\t\t\t\t(BIT19(i)?0xFF000000:0x00000000); \\\n\tDATA(flag) = BIT16(i); \n#define MSR_CPSR(operand, c) \\\n\tu32 byte_mask = (GETCPU.CPSR.bits.mode == USR)?DATA(byte_mask_USR):DATA(byte_mask_OTH); \\\n\tif(GETCPU.CPSR.bits.mode != USR && DATA(flag)) \\\n\t\t{ armcpu_switchMode(GETCPUPTR, operand & 0x1F); } \\\n\tGETCPU.CPSR.val = (GETCPU.CPSR.val & ~byte_mask) | (operand & byte_mask); \\\n\tGETCPU.changeCPSR(); \\\n\tGOTO_NEXTOP(c)\n\n#define MSR_SPSR_DATA \\\n\tu32 byte_mask; \n#define MSR_SPSR_COMPILER \\\n\tDATA(byte_mask) = (BIT16(i)?0x000000FF:0x00000000) | \\\n\t\t\t\t\t\t(BIT17(i)?0x0000FF00:0x00000000) | \\\n\t\t\t\t\t\t(BIT18(i)?0x00FF0000:0x00000000) | \\\n\t\t\t\t\t\t(BIT19(i)?0xFF000000:0x00000000); \n#define MSR_SPSR(operand, c) \\\n\tif(GETCPU.CPSR.bits.mode == USR || GETCPU.CPSR.bits.mode == SYS) \\\n\t\t{ GOTO_NEXTOP(1) }\\\n\tGETCPU.SPSR.val = (GETCPU.SPSR.val & ~DATA(byte_mask)) | (operand & DATA(byte_mask)); \\\n\tGETCPU.changeCPSR(); \\\n\tGOTO_NEXTOP(c)\n\nDCL_OP2_ARG2(OP_MSR_CPSR, OPERAND, MSR_CPSR, operand, 1)\nDCL_OP2_ARG2(OP_MSR_SPSR, OPERAND, MSR_SPSR, operand, 1)\nDCL_OP2_ARG2(OP_MSR_CPSR_IMM_VAL, IMM_VALUE, MSR_CPSR, shift_op, 1)\nDCL_OP2_ARG2(OP_MSR_SPSR_IMM_VAL, IMM_VALUE, MSR_SPSR, shift_op, 1)\n\n#undef OPERAND_DATA\n#undef OPERAND_COMPILER\n#undef OPERAND\n#undef MSR_CPSR_DATA\n#undef MSR_CPSR_COMPILER\n#undef MSR_CPSR\n#undef MSR_SPSR_DATA\n#undef MSR_SPSR_COMPILER\n#undef MSR_SPSR\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_BX)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_BX)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BX)\n\t\tu32 tmp = *DATA(r_0);\n\t\t\n\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t*DATA(r_15) = (tmp & (0xFFFFFFFC|(DATA(cpsr)->bits.T)<<1));\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n};\n\nDCL_OP_START(OP_BLX_REG)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_14;\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_BLX_REG)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_14) = &(GETCPUREG_W(14));\n\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BLX_REG)\n\t\tu32 tmp = *DATA(r_0);\n\t\t\n\t\t*DATA(r_14) = common->R15 - 4;\n\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t*DATA(r_15) = (tmp & (0xFFFFFFFC|(DATA(cpsr)->bits.T)<<1));\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n};\n\n#define SIGNEXTEND_24(i) (((s32)i<<8)>>8)\n\nDCL_OP_START(OP_B)\n\tStatus_Reg *cpsr;\n\tu32 *r_14;\n\tu32 *r_15;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_B)\n\t\tu32 cond = CONDITION(i);\n\t\tif (cond == 0xF)\n\t\t\tcommon->func = OP_B<PROCNUM>::Method2;\n\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_14) = &(GETCPUREG_W(14));\n\t\tDATA(r_15) = &(GETCPUREG_RW(15));\n\t\tDATA(val) = d.Immediate;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_B)\n\t\t*DATA(r_15) = DATA(val);\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n\n\tDCL_OP_METHOD2(OP_B)\n\t\t*DATA(r_14) = common->R15 - 4;\n\t\tDATA(cpsr)->bits.T = 1;\n\n\t\t*DATA(r_15) = DATA(val);\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n};\n\nDCL_OP_START(OP_BL)\n\tStatus_Reg *cpsr;\n\tu32 *r_14;\n\tu32 *r_15;\n\tu32 val;\n\n\tDCL_OP_COMPILER(OP_BL)\n\t\tu32 cond = CONDITION(i);\n\t\tif (cond == 0xF)\n\t\t\tcommon->func = OP_BL<PROCNUM>::Method2;\n\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_14) = &(GETCPUREG_W(14));\n\t\tDATA(r_15) = &(GETCPUREG_RW(15));\n\t\tDATA(val) = d.Immediate;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BL)\n\t\t*DATA(r_14) = common->R15 - 4;\n\t\t*DATA(r_15) = DATA(val);\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n\n\tDCL_OP_METHOD2(OP_BL)\n\t\tDATA(cpsr)->bits.T = 1;\n\n\t\t*DATA(r_14) = common->R15 - 4;\n\t\t*DATA(r_15) = DATA(val);\n\n\t\tGOTO_NEXBLOCK(3)\n\t}\n};\n\n#undef SIGNEXTEND_24\n\n//-----------------------------------------------------------------------------\n//   CLZ\n//-----------------------------------------------------------------------------\nconst u8 CLZ_TAB[16]=\n{\n\t0,\t\t\t\t\t\t\t// 0000\n\t1,\t\t\t\t\t\t\t// 0001\n\t2, 2,\t\t\t\t\t\t// 001X\n\t3, 3, 3, 3,\t\t\t\t\t// 01XX\n\t4, 4, 4, 4, 4, 4, 4, 4\t\t// 1XXX\n};\n\nDCL_OP_START(OP_CLZ)\n\tu32 *r_0;\n\tu32 *r_12;\n\n\tDCL_OP_COMPILER(OP_CLZ)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i, 12));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_CLZ)\n\t\tu32 Rm = *DATA(r_0);\n\n\t\tif(Rm==0)\n\t\t{\n\t\t\t*DATA(r_12) = 32;\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tRm |= (Rm >>1);\n\t\tRm |= (Rm >>2);\n\t\tRm |= (Rm >>4);\n\t\tRm |= (Rm >>8);\n\t\tRm |= (Rm >>16);\n\t\n\t\tu32 pos =\t \n\t\t\tCLZ_TAB[Rm&0xF] +\n\t\t\tCLZ_TAB[(Rm>>4)&0xF] +\n\t\t\tCLZ_TAB[(Rm>>8)&0xF] +\n\t\t\tCLZ_TAB[(Rm>>12)&0xF] +\n\t\t\tCLZ_TAB[(Rm>>16)&0xF] +\n\t\t\tCLZ_TAB[(Rm>>20)&0xF] +\n\t\t\tCLZ_TAB[(Rm>>24)&0xF] +\n\t\t\tCLZ_TAB[(Rm>>28)&0xF];\n\n\t\t*DATA(r_12) = 32 - pos;\n\t\t\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   QADD / QDADD / QSUB / QDSUB\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_QADD)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_12;\n\tu32 *r_16;\n\tbool mod_r15;\n\n\tDCL_OP_COMPILER(OP_QADD)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tDATA(mod_r15) = REG_POS(i,12)==15;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_QADD)\n\t\tu32 r_16 = *DATA(r_16);\n\t\tu32 r_0 = *DATA(r_0);\n\t\tu32 res = r_16 + r_0;\n\n\t\tif (SIGNED_OVERFLOW(r_16, r_0, res))\n\t\t{\n\t\t\tDATA(cpsr)->bits.Q=1;\n\t\t\t*DATA(r_12)=0x80000000-BIT31(res);\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tif (DATA(mod_r15))\n\t\t{\n\t\t\t*DATA(r_12)=res&0xFFFFFFFC;\n\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\n\t\t*DATA(r_12)=res;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_QSUB)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_12;\n\tu32 *r_16;\n\tbool mod_r15;\n\n\tDCL_OP_COMPILER(OP_QSUB)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tDATA(mod_r15) = REG_POS(i,12)==15;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_QSUB)\n\t\tu32 r_16 = *DATA(r_16);\n\t\tu32 r_0 = *DATA(r_0);\n\t\tu32 res = r_0 - r_16;\n\n\t\tif (SIGNED_UNDERFLOW(r_0, r_16, res))\n\t\t{\n\t\t\tDATA(cpsr)->bits.Q=1;\n\t\t\t*DATA(r_12)=0x80000000-BIT31(res);\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tif (DATA(mod_r15))\n\t\t{\n\t\t\t*DATA(r_12)=res&0xFFFFFFFC;\n\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\n\t\t*DATA(r_12)=res;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_QDADD)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_12;\n\tu32 *r_16;\n\tbool mod_r15;\n\n\tDCL_OP_COMPILER(OP_QDADD)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tDATA(mod_r15) = REG_POS(i,12)==15;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_QDADD)\n\t\tu32 r_16 = *DATA(r_16);\n\t\tu32 mul = r_16<<1;\n\t\t\n\t\tif(BIT31(r_16)!=BIT31(mul))\n\t\t{\n\t\t\tDATA(cpsr)->bits.Q=1;\n\t\t\tmul = 0x80000000-BIT31(mul);\n\t\t}\n\t\t\n\t\tu32 r_0 = *DATA(r_0);\n\t\tu32 res = mul + r_0;\n\n\t\tif (SIGNED_OVERFLOW(r_0, mul, res))\n\t\t{\n\t\t\tDATA(cpsr)->bits.Q=1;\n\t\t\t*DATA(r_12)=0x80000000-BIT31(res);\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tif (DATA(mod_r15))\n\t\t{\n\t\t\t*DATA(r_12)=res&0xFFFFFFFC;\n\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\n\t\t*DATA(r_12)=res;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_QDSUB)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_12;\n\tu32 *r_16;\n\tbool mod_r15;\n\n\tDCL_OP_COMPILER(OP_QDSUB)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tDATA(mod_r15) = REG_POS(i,12)==15;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_QDSUB)\n\t\tu32 r_16 = *DATA(r_16);\n\t\tu32 mul = r_16<<1;\n\t\t\n\t\tif(BIT31(r_16)!=BIT31(mul))\n\t\t{\n\t\t\tDATA(cpsr)->bits.Q=1;\n\t\t\tmul = 0x80000000-BIT31(mul);\n\t\t}\n\t\t\n\t\tu32 r_0 = *DATA(r_0);\n\t\tu32 res = r_0 - mul;\n\n\t\tif (SIGNED_UNDERFLOW(r_0, mul, res))\n\t\t{\n\t\t\tDATA(cpsr)->bits.Q=1;\n\t\t\t*DATA(r_12)=0x80000000-BIT31(res);\n\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tif (DATA(mod_r15))\n\t\t{\n\t\t\t*DATA(r_12)=res&0xFFFFFFFC;\n\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\n\t\t*DATA(r_12)=res;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SMUL\n//-----------------------------------------------------------------------------\n#define HWORD(i)   ((s32)(((s32)(i))>>16))\n#define LWORD(i)   (s32)(((s32)((i)<<16))>>16)\n\nDCL_OP_START(OP_SMUL_B_B)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMUL_B_B)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMUL_B_B)\n\t\t*DATA(r_16) = (u32)(LWORD(*DATA(r_0)) * LWORD(*DATA(r_8)));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMUL_B_T)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMUL_B_T)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMUL_B_T)\n\t\t*DATA(r_16) = (u32)(LWORD(*DATA(r_0)) * HWORD(*DATA(r_8)));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMUL_T_B)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMUL_T_B)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMUL_T_B)\n\t\t*DATA(r_16) = (u32)(HWORD(*DATA(r_0)) * LWORD(*DATA(r_8)));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMUL_T_T)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMUL_T_T)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMUL_T_T)\n\t\t*DATA(r_16) = (u32)(HWORD(*DATA(r_0)) * HWORD(*DATA(r_8)));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SMLA\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SMLA_B_B)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLA_B_B)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLA_B_B)\n\t\tu32 tmp = (u32)((s16)(*DATA(r_0)) * (s16)(*DATA(r_8)));\n\t\t\n\t\tu32 r_12 = *DATA(r_12);\n\t\tu32 r_16 = *DATA(r_16) = tmp + r_12;\n\n\t\tif (OverflowFromADD(r_16, tmp, r_12))\n\t\t\tDATA(cpsr)->bits.Q=1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLA_B_T)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLA_B_T)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLA_B_T)\n\t\tu32 tmp = (u32)(LWORD(*DATA(r_0)) * HWORD(*DATA(r_8)));\n\t\tu32 a = *DATA(r_12);\n\t\t\n\t\tu32 r_16 = *DATA(r_16) = tmp + a;\n\n\t\tif (SIGNED_OVERFLOW(tmp, a, r_16))\n\t\t\tDATA(cpsr)->bits.Q=1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLA_T_B)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLA_T_B)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLA_T_B)\n\t\tu32 tmp = (u32)(HWORD(*DATA(r_0)) * LWORD(*DATA(r_8)));\n\t\tu32 a = *DATA(r_12);\n\t\t\n\t\tu32 r_16 = *DATA(r_16) = tmp + a;\n\n\t\tif (SIGNED_OVERFLOW(tmp, a, r_16))\n\t\t\tDATA(cpsr)->bits.Q=1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLA_T_T)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLA_T_T)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLA_T_T)\n\t\tu32 tmp = (u32)(HWORD(*DATA(r_0)) * HWORD(*DATA(r_8)));\n\t\tu32 a = *DATA(r_12);\n\t\t\n\t\tu32 r_16 = *DATA(r_16) = tmp + a;\n\n\t\tif (SIGNED_OVERFLOW(tmp, a, r_16))\n\t\t\tDATA(cpsr)->bits.Q=1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SMLAL\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SMLAL_B_B)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLAL_B_B)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAL_B_B)\n\t\ts64 tmp = (s64)(LWORD(*DATA(r_0)) * LWORD(*DATA(r_8)));\n\t\tu64 res = (u64)tmp + *DATA(r_12);\n\n\t\t*DATA(r_12) = (u32) res;\n\t\t*DATA(r_16) += (res + ((tmp<0)*0xFFFFFFFF));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLAL_B_T)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLAL_B_T)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAL_B_T)\n\t\ts64 tmp = (s64)(LWORD(*DATA(r_0)) * HWORD(*DATA(r_8)));\n\t\tu64 res = (u64)tmp + *DATA(r_12);\n\n\t\t*DATA(r_12) = (u32) res;\n\t\t*DATA(r_16) += (res + ((tmp<0)*0xFFFFFFFF));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLAL_T_B)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLAL_T_B)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAL_T_B)\n\t\ts64 tmp = (s64)(HWORD(*DATA(r_0)) * (s64)LWORD(*DATA(r_8)));\n\t\tu64 res = (u64)tmp + *DATA(r_12);\n\n\t\t*DATA(r_12) = (u32) res;\n\t\t*DATA(r_16) += (res + ((tmp<0)*0xFFFFFFFF));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLAL_T_T)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLAL_T_T)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAL_T_T)\n\t\ts64 tmp = (s64)(HWORD(*DATA(r_0)) * HWORD(*DATA(r_8)));\n\t\tu64 res = (u64)tmp + *DATA(r_12);\n\n\t\t*DATA(r_12) = (u32) res;\n\t\t*DATA(r_16) += (res + ((tmp<0)*0xFFFFFFFF));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SMULW\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SMULW_B)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMULW_B)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMULW_B)\n\t\ts64 tmp = (s64)LWORD(*DATA(r_8)) * (s64)(s32)(*DATA(r_0));\n\n\t\t*DATA(r_16) = ((tmp>>16)&0xFFFFFFFF);\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMULW_T)\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMULW_T)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMULW_T)\n\t\ts64 tmp = (s64)HWORD(*DATA(r_8)) * (s64)(s32)(*DATA(r_0));\n\n\t\t*DATA(r_16) = ((tmp>>16)&0xFFFFFFFF);\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SMLAW\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SMLAW_B)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLAW_B)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAW_B)\n\t\ts64 tmp = (s64)LWORD(*DATA(r_8)) * (s64)(s32)(*DATA(r_0));\n\t\tu32 a = *DATA(r_12);\n\n\t\ttmp = (tmp>>16);\n\t\t\n\t\tu32 r_16 = *DATA(r_16) = tmp + a;\n\n\t\tif (SIGNED_OVERFLOW((u32)tmp, a, r_16))\n\t\t\tDATA(cpsr)->bits.Q=1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_SMLAW_T)\n\tStatus_Reg *cpsr;\n\tu32 *r_0;\n\tu32 *r_8;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_SMLAW_T)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR);\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_8) = &(ARM_REGPOS_R(i, 8));\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_W(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SMLAW_T)\n\t\ts64 tmp = (s64)HWORD(*DATA(r_8)) * (s64)(s32)(*DATA(r_0));\n\t\tu32 a = *DATA(r_12);\n\n\t\ttmp = ((tmp>>16)&0xFFFFFFFF);\n\t\t\n\t\tu32 r_16 = *DATA(r_16) = tmp + a;\n\n\t\tif (SIGNED_OVERFLOW((u32)tmp, a, r_16))\n\t\t\tDATA(cpsr)->bits.Q=1;\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LDR/STR macros\n//-----------------------------------------------------------------------------\n#define IMM_OFF_12_DATA \\\n\tu32 offset;\n#define IMM_OFF_12_COMPILER \\\n\tDATA(offset) = ((i)&0xFFF);\n#define IMM_OFF_12 \n\n#define IMM_OFF_12\n\n//-----------------------------------------------------------------------------\n//   LDR\n//-----------------------------------------------------------------------------\n#define DCL_LDR_OP(name, op1, op2, opex, arg1, arg2) \\\n\tDCL_OP_START(name) \\\n\t\top1##_DATA \\\n\t\top2##_DATA \\\n\t\tDCL_OP_COMPILER(name) \\\n\t\t\top1##_COMPILER \\\n\t\t\top2##_COMPILER(name) \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(name) \\\n\t\t\top1; \\\n\t\t\topex; \\\n\t\t\top2(arg1, arg2); \\\n\t\t} \\\n\t\tDCL_OP_METHOD2(name) \\\n\t\t\top1; \\\n\t\t\topex; \\\n\t\t\top2##_WR15(arg1, arg2); \\\n\t\t} \\\n\t}; \n\n#define OP_LDR_PRE_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_LDR_PRE_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i, 16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_LDR_PRE(a, b) \\\n\t*DATA(r_12) = ROR(READ32(GETCPU.mem_if->data, adr), 8*(adr&3)); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(a,adr); \\\n\tGOTO_NEXTOP(c) \n#define OP_LDR_PRE_WR15(a, b) \\\n\t*DATA(r_12) = ROR(READ32(GETCPU.mem_if->data, adr), 8*(adr&3)); \\\n\tif (PROCNUM == 0) \\\n\t{ \\\n\t\tDATA(cpsr)->bits.T = BIT0(*DATA(r_12)); \\\n\t\t*DATA(r_12) &= 0xFFFFFFFE; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\t*DATA(r_12) &= 0xFFFFFFFC; \\\n\t} \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(b,adr); \\\n\tGOTO_NEXBLOCK(c) \n\n#define OP_LDR_PRE_WB_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_LDR_PRE_WB_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_LDR_PRE_WB(a, b) \\\n\t*DATA(r_16) = adr; \\\n\t*DATA(r_12) = ROR(READ32(GETCPU.mem_if->data, adr), 8*(adr&3)); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(a,adr); \\\n\tGOTO_NEXTOP(c) \n#define OP_LDR_PRE_WB_WR15(a, b) \\\n\t*DATA(r_16) = adr; \\\n\t*DATA(r_12) = ROR(READ32(GETCPU.mem_if->data, adr), 8*(adr&3)); \\\n\tif (PROCNUM == 0) \\\n\t{ \\\n\t\tDATA(cpsr)->bits.T = BIT0(*DATA(r_12)); \\\n\t\t*DATA(r_12) &= 0xFFFFFFFE; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\t*DATA(r_12) &= 0xFFFFFFFC; \\\n\t} \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(b,adr); \\\n\tGOTO_NEXBLOCK(c) \n\n#define OP_LDR_POS_DATA \\\n\tStatus_Reg *cpsr; \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_LDR_POS_COMPILER(name) \\\n\tDATA(cpsr) = &(GETCPUPTR->CPSR); \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \\\n\tif (REG_POS(i,12) == 15) \\\n\t\tcommon->func = name<PROCNUM>::Method2;\n#define OP_LDR_POS(a, b) \\\n\tu32 adr = *DATA(r_16); \\\n\t*DATA(r_16) = adr + offset; \\\n\t*DATA(r_12) = ROR(READ32(GETCPU.mem_if->data, adr), 8*(adr&3)); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(a,adr); \\\n\tGOTO_NEXTOP(c) \n#define OP_LDR_POS_WR15(a, b) \\\n\tu32 adr = *DATA(r_16); \\\n\t*DATA(r_16) = adr + offset; \\\n\t*DATA(r_12) = ROR(READ32(GETCPU.mem_if->data, adr), 8*(adr&3)); \\\n\tif (PROCNUM == 0) \\\n\t{ \\\n\t\tDATA(cpsr)->bits.T = BIT0(*DATA(r_12)); \\\n\t\t*DATA(r_12) &= 0xFFFFFFFE; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\t*DATA(r_12) &= 0xFFFFFFFC; \\\n\t} \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(b,adr); \\\n\tGOTO_NEXBLOCK(c) \n\nDCL_LDR_OP(OP_LDR_P_IMM_OFF, IMM_OFF_12, OP_LDR_PRE, u32 adr=*DATA(r_16)+DATA(offset), 3, 5)\nDCL_LDR_OP(OP_LDR_M_IMM_OFF, IMM_OFF_12, OP_LDR_PRE, u32 adr=*DATA(r_16)-DATA(offset), 3, 5)\nDCL_LDR_OP(OP_LDR_P_LSL_IMM_OFF, LSL_IMM, OP_LDR_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_LSL_IMM_OFF, LSL_IMM, OP_LDR_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_LSR_IMM_OFF, LSR_IMM, OP_LDR_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_LSR_IMM_OFF, LSR_IMM, OP_LDR_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_ASR_IMM_OFF, ASR_IMM, OP_LDR_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_ASR_IMM_OFF, ASR_IMM, OP_LDR_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_ROR_IMM_OFF, ROR_IMM2, OP_LDR_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_ROR_IMM_OFF, ROR_IMM2, OP_LDR_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 5)\n\nDCL_LDR_OP(OP_LDR_P_IMM_OFF_PREIND,IMM_OFF_12, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)+DATA(offset), 3,5)\nDCL_LDR_OP(OP_LDR_M_IMM_OFF_PREIND,IMM_OFF_12, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)-DATA(offset), 3,5)\nDCL_LDR_OP(OP_LDR_P_LSL_IMM_OFF_PREIND, LSL_IMM, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_LSL_IMM_OFF_PREIND, LSL_IMM, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_LSR_IMM_OFF_PREIND, LSR_IMM, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_LSR_IMM_OFF_PREIND, LSR_IMM, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_ASR_IMM_OFF_PREIND, ASR_IMM, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_ASR_IMM_OFF_PREIND, ASR_IMM, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_ROR_IMM_OFF_PREIND, ROR_IMM2, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_ROR_IMM_OFF_PREIND, ROR_IMM2, OP_LDR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 5)\n\nDCL_LDR_OP(OP_LDR_P_IMM_OFF_POSTIND, IMM_OFF_12, OP_LDR_POS, u32 offset=DATA(offset), 3, 5)\nDCL_LDR_OP(OP_LDR_M_IMM_OFF_POSTIND, IMM_OFF_12, OP_LDR_POS, u32 offset=-DATA(offset), 3, 5)\nDCL_LDR_OP(OP_LDR_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_LDR_POS, u32 offset=shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_LDR_POS, u32 offset=-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_LDR_POS, u32 offset=shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_LDR_POS, u32 offset=-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_LDR_POS, u32 offset=shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_LDR_POS, u32 offset=-shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_P_ROR_IMM_OFF_POSTIND, ROR_IMM2, OP_LDR_POS, u32 offset=shift_op, 3, 5)\nDCL_LDR_OP(OP_LDR_M_ROR_IMM_OFF_POSTIND, ROR_IMM2, OP_LDR_POS, u32 offset=-shift_op, 3, 5)\n\n//-----------------------------------------------------------------------------\n//   LDREX\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_LDREX)\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_LDREX)\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDREX)\n\t\tu32 adr = *DATA(r_16);\n\t\t*DATA(r_12) = ROR(READ32(GETCPU.mem_if->data, adr), 8*(adr&3));\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3,adr);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LDRB\n//-----------------------------------------------------------------------------\n#define OP_LDRB_PRE_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_LDRB_PRE_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i, 16)); \n#define OP_LDRB_PRE(a, b) \\\n\t*DATA(r_12) = (u32)READ8(GETCPU.mem_if->data, adr); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr); \\\n\tGOTO_NEXTOP(c) \n\n#define OP_LDRB_PRE_WB_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_LDRB_PRE_WB_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \n#define OP_LDRB_PRE_WB(a, b) \\\n\t*DATA(r_16) = adr; \\\n\t*DATA(r_12) = (u32)READ8(GETCPU.mem_if->data, adr); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr); \\\n\tGOTO_NEXTOP(c) \n\n#define OP_LDRB_POS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_LDRB_POS_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_W(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \n#define OP_LDRB_POS(a, b) \\\n\tu32 adr = *DATA(r_16); \\\n\t*DATA(r_16) = adr + offset; \\\n\t*DATA(r_12) = (u32)READ8(GETCPU.mem_if->data, adr); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr); \\\n\tGOTO_NEXTOP(c) \n\nDCL_OP2EX_ARG2(OP_LDRB_P_IMM_OFF, IMM_OFF_12, OP_LDRB_PRE, u32 adr=*DATA(r_16)+DATA(offset), 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_IMM_OFF, IMM_OFF_12, OP_LDRB_PRE, u32 adr=*DATA(r_16)-DATA(offset), 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_LSL_IMM_OFF, LSL_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_LSL_IMM_OFF, LSL_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_LSR_IMM_OFF, LSR_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_LSR_IMM_OFF, LSR_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_ASR_IMM_OFF, ASR_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_ASR_IMM_OFF, ASR_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_ROR_IMM_OFF, ROR_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_ROR_IMM_OFF, ROR_IMM, OP_LDRB_PRE, u32 adr=*DATA(r_16)-shift_op, 3, 3)\n\nDCL_OP2EX_ARG2(OP_LDRB_P_IMM_OFF_PREIND, IMM_OFF_12, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)+DATA(offset), 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_IMM_OFF_PREIND, IMM_OFF_12, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)-DATA(offset), 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_LSL_IMM_OFF_PREIND, LSL_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_LSL_IMM_OFF_PREIND, LSL_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_LSR_IMM_OFF_PREIND, LSR_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_LSR_IMM_OFF_PREIND, LSR_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_ASR_IMM_OFF_PREIND, ASR_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_ASR_IMM_OFF_PREIND, ASR_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_ROR_IMM_OFF_PREIND, ROR_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_ROR_IMM_OFF_PREIND, ROR_IMM, OP_LDRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 3, 3)\n\nDCL_OP2EX_ARG2(OP_LDRB_P_IMM_OFF_POSTIND, IMM_OFF_12, OP_LDRB_POS, u32 offset=DATA(offset), 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_IMM_OFF_POSTIND, IMM_OFF_12, OP_LDRB_POS, u32 offset=-DATA(offset), 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_LDRB_POS, u32 offset=shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_LDRB_POS, u32 offset=-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_LDRB_POS, u32 offset=shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_LDRB_POS, u32 offset=-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_LDRB_POS, u32 offset=shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_LDRB_POS, u32 offset=-shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_P_ROR_IMM_OFF_POSTIND, ROR_IMM, OP_LDRB_POS, u32 offset=shift_op, 3, 3)\nDCL_OP2EX_ARG2(OP_LDRB_M_ROR_IMM_OFF_POSTIND, ROR_IMM, OP_LDRB_POS, u32 offset=-shift_op, 3, 3)\n\n//-----------------------------------------------------------------------------\n//   STR\n//-----------------------------------------------------------------------------\n#define OP_STR_PRE_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_STR_PRE_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_R(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i, 16)); \n#define OP_STR_PRE(a, b) \\\n\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_12)); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr); \\\n\tGOTO_NEXTOP(c) \n\n#define OP_STR_PRE_WB_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_STR_PRE_WB_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_R(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \n#define OP_STR_PRE_WB(a, b) \\\n\t*DATA(r_16) = adr; \\\n\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_12)); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr); \\\n\tGOTO_NEXTOP(c) \n\n#define OP_STR_POS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_STR_POS_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_R(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \n#define OP_STR_POS(a, b) \\\n\tu32 adr = *DATA(r_16); \\\n\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_12)); \\\n\t*DATA(r_16) = adr + offset; \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr); \\\n\tGOTO_NEXTOP(c) \n\nDCL_OP2EX_ARG2(OP_STR_P_IMM_OFF, IMM_OFF_12, OP_STR_PRE, u32 adr=*DATA(r_16)+DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_IMM_OFF, IMM_OFF_12, OP_STR_PRE, u32 adr=*DATA(r_16)-DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_LSL_IMM_OFF, LSL_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_LSL_IMM_OFF, LSL_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_LSR_IMM_OFF, LSR_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_LSR_IMM_OFF, LSR_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_ASR_IMM_OFF, ASR_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_ASR_IMM_OFF, ASR_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_ROR_IMM_OFF, ROR_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_ROR_IMM_OFF, ROR_IMM, OP_STR_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\n\nDCL_OP2EX_ARG2(OP_STR_P_IMM_OFF_PREIND, IMM_OFF_12, OP_STR_PRE_WB, u32 adr=*DATA(r_16)+DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_IMM_OFF_PREIND, IMM_OFF_12, OP_STR_PRE_WB, u32 adr=*DATA(r_16)-DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_LSL_IMM_OFF_PREIND, LSL_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_LSL_IMM_OFF_PREIND, LSL_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_LSR_IMM_OFF_PREIND, LSR_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_LSR_IMM_OFF_PREIND, LSR_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_ASR_IMM_OFF_PREIND, ASR_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_ASR_IMM_OFF_PREIND, ASR_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_ROR_IMM_OFF_PREIND, ROR_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_ROR_IMM_OFF_PREIND, ROR_IMM, OP_STR_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\n\nDCL_OP2EX_ARG2(OP_STR_P_IMM_OFF_POSTIND, IMM_OFF_12, OP_STR_POS, u32 offset=DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_IMM_OFF_POSTIND, IMM_OFF_12, OP_STR_POS, u32 offset=-DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_STR_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_STR_POS, u32 offset=-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_STR_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_STR_POS, u32 offset=-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_STR_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_STR_POS, u32 offset=-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_P_ROR_IMM_OFF_POSTIND, ROR_IMM, OP_STR_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STR_M_ROR_IMM_OFF_POSTIND, ROR_IMM, OP_STR_POS, u32 offset=-shift_op, 2, 2)\n\n//-----------------------------------------------------------------------------\n//   STREX\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_STREX)\n\tu32 *r_0;\n\tu32 *r_12;\n\tu32 *r_16;\n\n\tDCL_OP_COMPILER(OP_STREX)\n\t\tDATA(r_0) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(r_12) = &(ARM_REGPOS_W(i, 12));\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STREX)\n\t\tu32 adr = *DATA(r_16);\n\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r_0));\n\t\t*DATA(r_12) = 0;\n\n\t\tu32 c = MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   STRB\n//-----------------------------------------------------------------------------\n#define OP_STRB_PRE_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_STRB_PRE_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_R(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_R(i, 16)); \n#define OP_STRB_PRE(a, b) \\\n\tWRITE8(GETCPU.mem_if->data, adr, (u8)*DATA(r_12)); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr); \\\n\tGOTO_NEXTOP(c) \n\n#define OP_STRB_PRE_WB_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_STRB_PRE_WB_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_R(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \n#define OP_STRB_PRE_WB(a, b) \\\n\t*DATA(r_16) = adr; \\\n\tWRITE8(GETCPU.mem_if->data, adr, (u8)*DATA(r_12)); \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr); \\\n\tGOTO_NEXTOP(c) \n\n#define OP_STRB_POS_DATA \\\n\tu32 *r_12; \\\n\tu32 *r_16; \n#define OP_STRB_POS_COMPILER \\\n\tDATA(r_12) = &(ARM_REGPOS_R(i, 12)); \\\n\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16)); \n#define OP_STRB_POS(a, b) \\\n\tu32 adr = *DATA(r_16); \\\n\tWRITE8(GETCPU.mem_if->data, adr, (u8)*DATA(r_12)); \\\n\t*DATA(r_16) = adr + offset; \\\n\tu32 c = MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr); \\\n\tGOTO_NEXTOP(c) \n\nDCL_OP2EX_ARG2(OP_STRB_P_IMM_OFF, IMM_OFF_12, OP_STRB_PRE, u32 adr=*DATA(r_16)+DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_IMM_OFF, IMM_OFF_12, OP_STRB_PRE, u32 adr=*DATA(r_16)-DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_LSL_IMM_OFF, LSL_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_LSL_IMM_OFF, LSL_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_LSR_IMM_OFF, LSR_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_LSR_IMM_OFF, LSR_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_ASR_IMM_OFF, ASR_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_ASR_IMM_OFF, ASR_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_ROR_IMM_OFF, ROR_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_ROR_IMM_OFF, ROR_IMM, OP_STRB_PRE, u32 adr=*DATA(r_16)-shift_op, 2, 2)\n\nDCL_OP2EX_ARG2(OP_STRB_P_IMM_OFF_PREIND, IMM_OFF_12, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)+DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_IMM_OFF_PREIND, IMM_OFF_12, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)-DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_LSL_IMM_OFF_PREIND, LSL_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_LSL_IMM_OFF_PREIND, LSL_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_LSR_IMM_OFF_PREIND, LSR_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_LSR_IMM_OFF_PREIND, LSR_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_ASR_IMM_OFF_PREIND, ASR_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_ASR_IMM_OFF_PREIND, ASR_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_ROR_IMM_OFF_PREIND, ROR_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)+shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_ROR_IMM_OFF_PREIND, ROR_IMM, OP_STRB_PRE_WB, u32 adr=*DATA(r_16)-shift_op, 2, 2)\n\nDCL_OP2EX_ARG2(OP_STRB_P_IMM_OFF_POSTIND, IMM_OFF_12, OP_STRB_POS, u32 offset=DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_IMM_OFF_POSTIND, IMM_OFF_12, OP_STRB_POS, u32 offset=-DATA(offset), 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_STRB_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_LSL_IMM_OFF_POSTIND, LSL_IMM, OP_STRB_POS, u32 offset=-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_STRB_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_LSR_IMM_OFF_POSTIND, LSR_IMM, OP_STRB_POS, u32 offset=-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_STRB_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_ASR_IMM_OFF_POSTIND, ASR_IMM, OP_STRB_POS, u32 offset=-shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_P_ROR_IMM_OFF_POSTIND, ROR_IMM, OP_STRB_POS, u32 offset=shift_op, 2, 2)\nDCL_OP2EX_ARG2(OP_STRB_M_ROR_IMM_OFF_POSTIND, ROR_IMM, OP_STRB_POS, u32 offset=-shift_op, 2, 2)\n\n//-----------------------------------------------------------------------------\n//   LDMIA / LDMIB / LDMDA / LDMDB\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_LDMIA)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER_NOFUNC(OP_LDMIA)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER_TEMPLATE_14(count)\n\t}\n\n\tDCL_OP_METHODTEMPLATE(OP_LDMIA)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tfor(u32 i = 0; i < METHODNUM; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\t//adr += 4;\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDMIB)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_LDMIB)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMIB)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tadr += 4;\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\t\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(4, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDMDA)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_LDMDA)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDA)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\t\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\n\t\t\tadr -= 4;\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMDB)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_LDMDB)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDB)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tadr -= 4;\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\t\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMIA_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg1;\n\tbool wb_flg2;\n\n\tDCL_OP_COMPILER_NOFUNC(OP_LDMIA_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg1) = (i & (1 << REG_POS(i,16)));\n\t\tDATA(wb_flg2) = (i & ((~((2 << REG_POS(i,16))-1)) & 0xFFFF));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER_TEMPLATE_14(count)\n\t}\n\n\tDCL_OP_METHODTEMPLATE(OP_LDMIA_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\tu32 alu_c = 2;\n\t\t\n\t\tfor(u32 i = 0; i < METHODNUM; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\talu_c = 4;\n\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tif (DATA(wb_flg1))\n\t\t{\n\t\t\tif (DATA(wb_flg2))\n\t\t\t\t*DATA(r_16) = adr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*DATA(r_16) = adr;\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(alu_c, c);\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMIB_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg1;\n\tbool wb_flg2;\n\n\tDCL_OP_COMPILER(OP_LDMIB_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg1) = (i & (1 << REG_POS(i,16)));\n\t\tDATA(wb_flg2) = (i & ((~((2 << REG_POS(i,16))-1)) & 0xFFFF));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMIB_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\tu32 alu_c = 2;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\talu_c = 4;\n\n\t\t\tadr += 4;\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(wb_flg1))\n\t\t{\n\t\t\tif (DATA(wb_flg2))\n\t\t\t\t*DATA(r_16) = adr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*DATA(r_16) = adr;\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(alu_c, c);\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMDA_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg1;\n\tbool wb_flg2;\n\n\tDCL_OP_COMPILER(OP_LDMDA_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg1) = (i & (1 << REG_POS(i,16)));\n\t\tDATA(wb_flg2) = (i & ((~((2 << REG_POS(i,16))-1)) & 0xFFFF));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDA_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\tif (DATA(wb_flg1))\n\t\t{\n\t\t\tif (DATA(wb_flg2))\n\t\t\t\t*DATA(r_16) = adr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*DATA(r_16) = adr;\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMDB_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg1;\n\tbool wb_flg2;\n\n\tDCL_OP_COMPILER(OP_LDMDB_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg1) = (i & (1 << REG_POS(i,16)));\n\t\tDATA(wb_flg2) = (i & ((~((2 << REG_POS(i,16))-1)) & 0xFFFF));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDB_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tadr -= 4;\n\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\n\t\t\tif (PROCNUM == 0)\n\t\t\t{\n\t\t\t\tDATA(cpsr)->bits.T = BIT0(tmp);\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*DATA(r_15) = tmp & 0xFFFFFFFC;\n\t\t\t}\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(wb_flg1))\n\t\t{\n\t\t\tif (DATA(wb_flg2))\n\t\t\t\t*DATA(r_16) = adr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*DATA(r_16) = adr;\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\tif (DATA(r_15))\n\t\t{\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMIA2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_LDMIA2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMIA2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\tStatus_Reg SPSR;\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tSPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t//adr += 4;\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMIB2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_LDMIB2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMIB2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tadr += 4;\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\tStatus_Reg SPSR;\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tSPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMDA2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_LDMDA2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDA2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tGETCPU.CPSR = GETCPU.SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatus_Reg SPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMDB2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\n\tDCL_OP_COMPILER(OP_LDMDB2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDB2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tadr -= 4;\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tGETCPU.CPSR = GETCPU.SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatus_Reg SPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMIA2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg;\n\n\tDCL_OP_COMPILER(OP_LDMIA2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg) = !BIT_N(i, REG_POS(i,16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMIA2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif (DATA(wb_flg))\n\t\t\t\t*DATA(r_16) = adr;\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (DATA(wb_flg))\n\t\t\t\t*DATA(r_16) = adr + 4;\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\tStatus_Reg SPSR;\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tSPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t//adr += 4;\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMIB2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg;\n\n\tDCL_OP_COMPILER(OP_LDMIB2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg) = !BIT_N(i, REG_POS(i,16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 0; j <= 14; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMIB2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif (DATA(wb_flg))\n\t\t\t\t*DATA(r_16) = adr;\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tadr += 4;\n\t\t\tif (DATA(wb_flg))\n\t\t\t\t*DATA(r_16) = adr;\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tGETCPU.CPSR = GETCPU.SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tStatus_Reg SPSR;\n\t\t\tSPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t\t\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMDA2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg;\n\n\tDCL_OP_COMPILER(OP_LDMDA2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg) = !BIT_N(i, REG_POS(i,16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDA2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!DATA(wb_flg))\n\t\t\t\tprintf(\"error1_1\\n\");\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\tif (DATA(wb_flg))\n\t\t\t*DATA(r_16) = adr;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatus_Reg SPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\nDCL_OP_START(OP_LDMDB2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[15];\n\tu32 *r_15;\n\tbool wb_flg;\n\n\tDCL_OP_COMPILER(OP_LDMDB2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\t\tif (BIT15(i))\n\t\t\tDATA(r_15) = &(GETCPUREG_W(15));\n\t\telse\n\t\t\tDATA(r_15) = NULL;\n\t\tDATA(wb_flg) = !BIT_N(i, REG_POS(i,16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 14; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_W(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDMDB2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 oldmode = 0;\n\t\tu32 c = 0;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tif((GETCPU.CPSR.bits.mode==USR)||(GETCPU.CPSR.bits.mode==SYS))\n\t\t\t{\n\t\t\t\tprintf(\"ERROR1\\n\");\n\t\t\t\tGOTO_NEXTOP(1)\n\t\t\t}\n\t\t\toldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!DATA(wb_flg))\n\t\t\t\tprintf(\"error1_2\\n\");\n\t\t\tadr -= 4;\n\t\t\tu32 tmp = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\t*DATA(r_15) = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\t\tGETCPU.CPSR = GETCPU.SPSR;\n\t\t\tGETCPU.changeCPSR();\n\t\t}\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\t*DATA(r[i]) = READ32(GETCPU.mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t}\n\n\t\tif (DATA(wb_flg))\n\t\t\t*DATA(r_16) = adr;\n\n\t\tif (DATA(r_15) == NULL)\n\t\t{\n\t\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXTOP(c)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatus_Reg SPSR = GETCPU.SPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SPSR.bits.mode);\n\t\t\tGETCPU.CPSR=SPSR;\n\t\t\tGETCPU.changeCPSR();\n\n\t\t\tc = MMU_aluMemCycles<PROCNUM>(2, c);\n\n\t\t\tGOTO_NEXBLOCK(c)\n\t\t}\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   STMIA / STMIB / STMDA / STMDB\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_STMIA)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIA)\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIA)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMIB)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIB)\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIB)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDA)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMDA)\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMDA)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDB)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMDB)\n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMDB)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMIA_W)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIA_W)\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIA_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\t*DATA(r_16) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMIB_W)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIB_W)\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIB_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\t*DATA(r_16) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDA_W)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMDA_W)\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMDA_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\t*DATA(r_16) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDB_W)\n\tu32 count;\n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER_NOFUNC(OP_STMDB_W)\n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER_TEMPLATE_15(count)\n\t}\n\n\tDCL_OP_METHODTEMPLATE(OP_STMDB_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\t\t\n\t\tfor(u32 i = 0; i < METHODNUM; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\t*DATA(r_16) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMIA2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIA2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIA2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMIB2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIB2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIB2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDA2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMDA2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMDA2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDB2)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMDB2)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_R(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMDB2)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMIA2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIA2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIA2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\t\t*DATA(r_16) = adr;\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMIB2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMIB2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (u32 j = 0; j < 16; j++)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMIB2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr += 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\t*DATA(r_16) = adr;\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDA2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMDA2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMDA2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\n\t\t*DATA(r_16) = adr;\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_STMDB2_W)\n\tu32 count;\n\tStatus_Reg *cpsr; \n\tu32 *r_16;\n\tu32 *r[16];\n\n\tDCL_OP_COMPILER(OP_STMDB2_W)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_16) = &(ARM_REGPOS_RW(i, 16));\n\n\t\tu32 count = 0;\n\t\tfor (s32 j = 15; j >= 0; j--)\n\t\t{\n\t\t\tif (BIT_N(i,j))\n\t\t\t{\n\t\t\t\tDATA(r[count++]) = &(GETCPUREG_R(j));\n\t\t\t}\n\t\t}\n\t\tDATA(count) = count;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_STMDB2_W)\n\t\tu32 adr = *DATA(r_16);\n\t\tu32 c = 0;\n\n\t\tif(DATA(cpsr)->bits.mode==USR)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 oldmode = armcpu_switchMode(GETCPUPTR, SYS);\n\t\t\n\t\tu32 count = DATA(count);\n\t\tfor(u32 i = 0; i < count; i++)\n\t\t{\n\t\t\tadr -= 4;\n\t\t\tWRITE32(GETCPU.mem_if->data, adr, *DATA(r[i]));\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t}\n\n\t\t*DATA(r_16) = adr;\n\n\t\tarmcpu_switchMode(GETCPUPTR, oldmode);\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(1, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   LDRD / STRD\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_LDRD_STRD_POST_INDEX)\n\tu32 *r_addr;\n\tu32 *r_off;\n\tu32 i_off;\n\tu8 Rd_num;\n\tbool i_bit;\n\tbool u_bit;\n\tbool s_bit;\n\tbool flg1;\n\n\tDCL_OP_COMPILER(OP_LDRD_STRD_POST_INDEX)\n\t\tDATA(r_addr) = &(ARM_REGPOS_RW(i, 16));\n\t\tDATA(r_off) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(i_off) = IMM_OFF;\n\t\tDATA(Rd_num) = REG_POS(i, 12);\n\t\tDATA(i_bit) = BIT22(i);\n\t\tDATA(u_bit) = BIT23(i);\n\t\tDATA(s_bit) = BIT5(i);\n\t\tDATA(flg1) = !(DATA(Rd_num) & 0x1);\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRD_STRD_POST_INDEX)\n\t\tu32 addr = *DATA(r_addr);\n\t\tu32 index;\n\n\t\tif (DATA(i_bit))\n\t\t\tindex = DATA(i_off);\n\t\telse\n\t\t\tindex = *DATA(r_off);\n\n\t\tif (DATA(u_bit))\n\t\t\t*DATA(r_addr) += index;\n\t\telse\n\t\t\t*DATA(r_addr) -= index;\n\n\t\tu32 c = 0;\n\t\tu8 Rd_num = DATA(Rd_num);\n\t\tif (DATA(flg1))\n\t\t{\n\t\t\tif (DATA(s_bit))\n\t\t\t{\n\t\t\t\tWRITE32(GETCPU.mem_if->data, addr, GETCPU.R[Rd_num]);\n\t\t\t\tWRITE32(GETCPU.mem_if->data, addr + 4, GETCPU.R[Rd_num + 1]);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr + 4);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tGETCPU.R[Rd_num] = READ32(GETCPU.mem_if->data, addr);\n\t\t\t\tGETCPU.R[Rd_num + 1] = READ32(GETCPU.mem_if->data, addr + 4);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr + 4);\n\t\t\t}\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(3, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\nDCL_OP_START(OP_LDRD_STRD_OFFSET_PRE_INDEX)\n\tu32 *r_addr;\n\tu32 *r_off;\n\tu32 i_off;\n\tu8 Rd_num;\n\tbool i_bit;\n\tbool u_bit;\n\tbool s_bit;\n\tbool w_bit;\n\tbool flg1;\n\n\tDCL_OP_COMPILER(OP_LDRD_STRD_OFFSET_PRE_INDEX)\n\t\tDATA(r_addr) = &(ARM_REGPOS_RW(i, 16));\n\t\tDATA(r_off) = &(ARM_REGPOS_R(i, 0));\n\t\tDATA(i_off) = IMM_OFF;\n\t\tDATA(Rd_num) = REG_POS(i, 12);\n\t\tDATA(i_bit) = BIT22(i);\n\t\tDATA(u_bit) = BIT23(i);\n\t\tDATA(s_bit) = BIT5(i);\n\t\tDATA(w_bit) = BIT21(i);\n\t\tDATA(flg1) = !(DATA(Rd_num) & 0x1);\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_LDRD_STRD_OFFSET_PRE_INDEX)\n\t\tu32 addr = *DATA(r_addr);\n\t\tu32 index;\n\n\t\tif (DATA(i_bit))\n\t\t\tindex = DATA(i_off);\n\t\telse\n\t\t\tindex = *DATA(r_off);\n\n\t\tif (DATA(u_bit))\n\t\t\taddr += index;\n\t\telse\n\t\t\taddr -= index;\n\n\t\tu32 c = 0;\n\t\tu8 Rd_num = DATA(Rd_num);\n\t\tif (DATA(flg1))\n\t\t{\n\t\t\tif (DATA(s_bit))\n\t\t\t{\n\t\t\t\tWRITE32(GETCPU.mem_if->data, addr, GETCPU.R[Rd_num]);\n\t\t\t\tWRITE32(GETCPU.mem_if->data, addr + 4, GETCPU.R[Rd_num + 1]);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr + 4);\n\t\t\t\tif (DATA(w_bit))\n\t\t\t\t\t*DATA(r_addr) = addr;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (DATA(w_bit))\n\t\t\t\t\t*DATA(r_addr) = addr;\n\t\t\t\tGETCPU.R[Rd_num] = READ32(GETCPU.mem_if->data, addr);\n\t\t\t\tGETCPU.R[Rd_num + 1] = READ32(GETCPU.mem_if->data, addr + 4);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr);\n\t\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr + 4);\n\t\t\t}\n\t\t}\n\n\t\tc = MMU_aluMemCycles<PROCNUM>(3, c);\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   STC\n//   the NDS has no coproc that responses to a STC, no feedback is given to the arm\n//-----------------------------------------------------------------------------\n#define DCL_UNDEF_OP(name) \\\n\tDCL_OP_START(name) \\\n\t\tDCL_OP_COMPILER(name) \\\n\t\t\tDONE_COMPILER \\\n\t\t} \\\n\t\tDCL_OP_METHOD(name) \\\n\t\t\tTRAPUNDEF(GETCPUPTR); \\\n\t\t\tGOTO_NEXTOP(1) \\\n\t\t} \\\n\t};\n\nDCL_UNDEF_OP(OP_STC_P_IMM_OFF)\nDCL_UNDEF_OP(OP_STC_M_IMM_OFF)\nDCL_UNDEF_OP(OP_STC_P_PREIND)\nDCL_UNDEF_OP(OP_STC_M_PREIND)\nDCL_UNDEF_OP(OP_STC_P_POSTIND)\nDCL_UNDEF_OP(OP_STC_M_POSTIND)\nDCL_UNDEF_OP(OP_STC_OPTION)\n\n//-----------------------------------------------------------------------------\n//   LDC\n//   the NDS has no coproc that responses to a LDC, no feedback is given to the arm\n//-----------------------------------------------------------------------------\nDCL_UNDEF_OP(OP_LDC_P_IMM_OFF)\nDCL_UNDEF_OP(OP_LDC_M_IMM_OFF)\nDCL_UNDEF_OP(OP_LDC_P_PREIND)\nDCL_UNDEF_OP(OP_LDC_M_PREIND)\nDCL_UNDEF_OP(OP_LDC_P_POSTIND)\nDCL_UNDEF_OP(OP_LDC_M_POSTIND)\nDCL_UNDEF_OP(OP_LDC_OPTION)\n\n//-----------------------------------------------------------------------------\n//   MCR / MRC\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_MCR)\n\tu32 *r_12;\n\tu8 cpnum;\n\tu8 crn;\n\tu8 crm;\n\tu8 op1;\n\tu8 op2;\n\n\tDCL_OP_COMPILER(OP_MCR)\n\t\tDATA(r_12) = &(ARM_REGPOS_R(i, 12));\n\t\tDATA(cpnum) = REG_POS(i, 8);\n\t\tDATA(crn) = REG_POS(i, 16);\n\t\tDATA(crm) = REG_POS(i, 0);\n\t\tDATA(op1) = (i>>21)&0x7;\n\t\tDATA(op2) = (i>>5)&0x7;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MCR)\n\t\tif(DATA(cpnum) != 15)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tcp15.moveARM2CP(*DATA(r_12), DATA(crn), DATA(crm), DATA(op1), DATA(op2));\n\n\t\tGOTO_NEXTOP(2)\n\t}\n};\n\nDCL_OP_START(OP_MRC)\n\tStatus_Reg *cpsr; \n\tu32 *r_12;\n\tbool mod_r15;\n\tu8 cpnum;\n\tu8 crn;\n\tu8 crm;\n\tu8 op1;\n\tu8 op2;\n\n\tDCL_OP_COMPILER(OP_MRC)\n\t\tDATA(cpsr) = &(GETCPUPTR->CPSR); \n\t\tDATA(r_12) = &(ARM_REGPOS_RW(i, 12));\n\t\tDATA(mod_r15) = REG_POS(i, 12)==15;\n\t\tDATA(cpnum) = REG_POS(i, 8);\n\t\tDATA(crn) = REG_POS(i, 16);\n\t\tDATA(crm) = REG_POS(i, 0);\n\t\tDATA(op1) = (i>>21)&0x7;\n\t\tDATA(op2) = (i>>5)&0x7;\n\t\t\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_MRC)\n\t\tif(DATA(cpnum) != 15)\n\t\t{\n\t\t\tGOTO_NEXTOP(2)\n\t\t}\n\n\t\tu32 data = 0;\n\t\tcp15.moveCP2ARM(&data, DATA(crn), DATA(crm), DATA(op1), DATA(op2));\n\t\tif (DATA(mod_r15))\n\t\t{\n\t\t\tDATA(cpsr)->bits.N = BIT31(data);\n\t\t\tDATA(cpsr)->bits.Z = BIT30(data);\n\t\t\tDATA(cpsr)->bits.C = BIT29(data);\n\t\t\tDATA(cpsr)->bits.V = BIT28(data);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*DATA(r_12) = data;\n\t\t}\n\n\t\tGOTO_NEXTOP(4)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   SWI\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_SWI)\n\tu32 swinum;\n\n\tDCL_OP_COMPILER(OP_SWI)\n\t\tDATA(swinum) = ((i>>16)&0xFF)&0x1F;\n\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_SWI)\n\t\tbool bypassBuiltinSWI = (GETCPU.intVector == 0x00000000 && PROCNUM==0) \n\t\t\t\t\t\t\t\t|| (GETCPU.intVector == 0xFFFF0000 && PROCNUM==1);\n\n\t\tif(GETCPU.swi_tab && !bypassBuiltinSWI)\n\t\t{\n\t\t\tu32 swinum = DATA(swinum);\n\t\t\t\n\t\t\tif (swinum == 0x04 || swinum == 0x05)\n\t\t\t{\n\t\t\t\tGETCPU.instruct_adr = common->R15 - 8;\n\t\t\t\tGETCPU.next_instruction = common->R15 - 4;\n\n\t\t\t\tu32 c = GETCPU.swi_tab[swinum]() + 3;\n\n\t\t\t\tGETCPU.instruct_adr = GETCPU.next_instruction;\n\n\t\t\t\tBREAK_OP(c)\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 c = GETCPU.swi_tab[swinum]() + 3;\n\n\t\t\t\tGOTO_NEXTOP(c)\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStatus_Reg tmp = GETCPU.CPSR;\n\t\t\tarmcpu_switchMode(GETCPUPTR, SVC);\n\t\t\tGETCPU.R[14] = common->R15 - 4;\n\t\t\tGETCPU.SPSR = tmp;\n\t\t\tGETCPU.CPSR.bits.T = 0;\n\t\t\tGETCPU.CPSR.bits.I = 1;\n\t\t\tGETCPU.changeCPSR();\n\t\t\tGETCPU.R[15] = GETCPU.intVector + 0x08;\n\n\t\t\tGOTO_NEXBLOCK(3)\n\t\t}\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   BKPT\n//-----------------------------------------------------------------------------\nDCL_OP_START(OP_BKPT)\n\t\n\tDCL_OP_COMPILER(OP_BKPT)\n\t\tDONE_COMPILER\n\t}\n\n\tDCL_OP_METHOD(OP_BKPT)\n\t\tprintf(\"THUMB%c: Unimplemented opcode BKPT\\n\", PROCNUM?'7':'9');\n\t\t\n\t\tGOTO_NEXTOP(4)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   CDP\n//-----------------------------------------------------------------------------\nDCL_UNDEF_OP(OP_CDP);\n\n//-----------------------------------------------------------------------------\n//   Dispatch table\n//-----------------------------------------------------------------------------\nstatic const OpCompiler thumb_compiler_set[2][1024] = {{\n#define TABDECL(x) x<0>::Compiler\n#include \"thumb_tabdef.inc\"\n#undef TABDECL\n},{\n#define TABDECL(x) x<1>::Compiler\n#include \"thumb_tabdef.inc\"\n#undef TABDECL\n}};\n\nstatic const OpCompiler arm_compiler_set[2][4096] = {{\n#define TABDECL(x) x<0>::Compiler\n#include \"instruction_tabdef.inc\"\n#undef TABDECL\n},{\n#define TABDECL(x) x<1>::Compiler\n#include \"instruction_tabdef.inc\"\n#undef TABDECL\n}};\n\n//-----------------------------------------------------------------------------\n//   Generic instruction wrapper\n//-----------------------------------------------------------------------------\ntemplate<int PROCNUM, int thumb>\nstatic void FASTCALL Method_OPDECODE(const MethodCommon* common)\n{\n\tu32 c;\n\tu32 adr = ARMPROC.instruct_adr;\n\n\tif(thumb)\n\t{\n\t\tARMPROC.next_instruction = adr + 2;\n\t\tARMPROC.R[15] = adr + 4;\n\t\tu32 opcode = _MMU_read16<PROCNUM, MMU_AT_CODE>(adr);\n\t\tc = thumb_instructions_set[PROCNUM][opcode>>6](opcode);\n\t}\n\telse\n\t{\n\t\tARMPROC.next_instruction = adr + 4;\n\t\tARMPROC.R[15] = adr + 8;\n\t\tu32 opcode = _MMU_read32<PROCNUM, MMU_AT_CODE>(adr);\n\t\tif(CONDITION(opcode) == 0xE || TEST_COND(CONDITION(opcode), CODE(opcode), ARMPROC.CPSR))\n\t\t\tc = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)](opcode);\n\t\telse\n\t\t\tc = 1;\n\t}\n\n\tARMPROC.instruct_adr = ARMPROC.next_instruction;\n\tBlock::cycles += c;\n\n\treturn;\n}\n\nstatic MethodCommon s_OpDecode[2][2] =\t{\n\t\t\t\t\t\t\t\t\t\t\t{{Method_OPDECODE<0,0>, NULL, 0},{Method_OPDECODE<0,1>, NULL, 0},},\n\t\t\t\t\t\t\t\t\t\t\t{{Method_OPDECODE<1,0>, NULL, 0},{Method_OPDECODE<1,1>, NULL, 0},},\n\t\t\t\t\t\t\t\t\t\t};\n\nstatic Block s_OpDecodeBlock[2][2] =\t{\n\t\t\t\t\t\t\t\t\t\t\t{{&s_OpDecode[0][0]},{&s_OpDecode[0][1]},},\n\t\t\t\t\t\t\t\t\t\t\t{{&s_OpDecode[1][0]},{&s_OpDecode[1][1]},},\n\t\t\t\t\t\t\t\t\t\t};\n\nstruct OP_WRAPPER\n{\n\tu32 adr;\n\tu32 opcode;\n\tOpFunc fun;\n\n\tTEMPLATE static void FASTCALL Compiler(const Decoded &i, MethodCommon* common)\n\t{\n\t\tOP_WRAPPER *pData = (OP_WRAPPER*)AllocCacheAlign(sizeof(OP_WRAPPER));\n\t\tcommon->data = pData;\n\n\t\tDATA(adr) = i.Address;\n\t\tif (i.ThumbFlag)\n\t\t{\n\t\t\tDATA(opcode) = i.Instruction.ThumbOp;\n\t\t\tDATA(fun) = thumb_instructions_set[PROCNUM][i.Instruction.ThumbOp>>6];\n\t\t\tcommon->func = OP_WRAPPER::MethodThumb<PROCNUM>;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDATA(opcode) = i.Instruction.ArmOp;\n\t\t\tDATA(fun) = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(i.Instruction.ArmOp)];\n\t\t\tcommon->func = OP_WRAPPER::MethodArm<PROCNUM>;\n\t\t}\n\t}\n\n\tTEMPLATE static void FASTCALL MethodArm(const MethodCommon* common)\n\t{\n\t\tOP_WRAPPER *pData = (OP_WRAPPER*)common->data;\n\n\t\tu32 c;\n\t\tu32 opcode = DATA(opcode);\n\n\t\tu32 oldnext_instruction = ARMPROC.next_instruction = DATA(adr) + 4;\n\t\tARMPROC.R[15] = common->R15;\n\n\t\t//if(CONDITION(opcode) == 0xE || TEST_COND(CONDITION(opcode), CODE(opcode), ARMPROC.CPSR))\n\t\t\tc = DATA(fun)(opcode);\n\t\t//else\n\t\t//\tc = 1;\n\n\t\tARMPROC.instruct_adr = ARMPROC.next_instruction;\n\t\tif (ARMPROC.instruct_adr != oldnext_instruction)\n\t\t{\n\t\t\tBREAK_OP(c)\n\t\t}\n\n\t\tGOTO_NEXTOP(c)\n\t}\n\n\tTEMPLATE static void FASTCALL MethodThumb(const MethodCommon* common)\n\t{\n\t\tOP_WRAPPER *pData = (OP_WRAPPER*)common->data;\n\n\t\tu32 c;\n\t\tu32 opcode = DATA(opcode);\n\n\t\tu32 oldnext_instruction = ARMPROC.next_instruction = DATA(adr) + 2;\n\t\tARMPROC.R[15] = common->R15;\n\n\t\tc = DATA(fun)(opcode);\n\n\t\tARMPROC.instruct_adr = ARMPROC.next_instruction;\n\t\tif (ARMPROC.instruct_adr != oldnext_instruction)\n\t\t{\n\t\t\tBREAK_OP(c)\n\t\t}\n\n\t\tGOTO_NEXTOP(c)\n\t}\n};\n\n//-----------------------------------------------------------------------------\n//   Block method\n//-----------------------------------------------------------------------------\nstruct OP_SyncR15Before\n{\n\tTEMPLATE static void FASTCALL Compiler(const Decoded &i, MethodCommon* common)\n\t{\n\t\tOP_SyncR15Before *pData = (OP_SyncR15Before*)AllocCacheAlign(sizeof(OP_SyncR15Before));\n\t\tcommon->func = OP_SyncR15Before::Method<PROCNUM>;\n\t\tcommon->data = pData;\n\t}\n\n\tTEMPLATE static void FASTCALL Method(const MethodCommon* common)\n\t{\n\t\tOP_SyncR15Before *pData = (OP_SyncR15Before*)common->data;\n\n\t\tcommon++;\n\t\tGETCPU.R[15] = common->R15;\n\n\t\treturn common->func(common);\n\t}\n};\n\nstruct OP_StopExecute\n{\n\tu32 nextinsadr;\n\n\tTEMPLATE static void FASTCALL Compiler(const u32 i, MethodCommon* common)\n\t{\n\t\tOP_StopExecute *pData = (OP_StopExecute*)AllocCacheAlign(sizeof(OP_StopExecute));\n\t\tcommon->func = OP_StopExecute::Method<PROCNUM>;\n\t\tcommon->data = pData;\n\n\t\tDATA(nextinsadr) = i;\n\t}\n\n\tTEMPLATE static void FASTCALL Method(const MethodCommon* common)\n\t{\n\t\tOP_StopExecute *pData = (OP_StopExecute*)common->data;\n\n\t\tGETCPU.instruct_adr = DATA(nextinsadr);\n\n\t\treturn;\n\t}\n};\n\nstruct Cond_SubBlockStart\n{\n\tMethodCommon* target;\n\tu32 cond;\n\tu32 instructions;\n\n\tTEMPLATE static Cond_SubBlockStart* FASTCALL Compiler(const u32 cond, MethodCommon* common)\n\t{\n\t\tCond_SubBlockStart *pData = (Cond_SubBlockStart*)AllocCacheAlign(sizeof(Cond_SubBlockStart));\n\t\tcommon->func = Cond_SubBlockStart::Method<PROCNUM>;\n\t\tcommon->data = pData;\n\n\t\tDATA(cond) = cond;\n\n\t\treturn pData;\n\t}\n\n\tTEMPLATE static void FASTCALL Method(const MethodCommon* common)\n\t{\n\t\tCond_SubBlockStart *pData = (Cond_SubBlockStart*)common->data;\n\n\t\tif(TEST_COND(DATA(cond), 0, GETCPU.CPSR))\n\t\t\tcommon++;\n\t\telse\n\t\t{\n\t\t\tcommon = DATA(target);\n\t\t\tBlock::cycles += DATA(instructions);\n\t\t}\n\n\t\treturn common->func(common);\n\t}\n};\n\n////////////////////////////////////////////////////////////////////\nstatic u32 s_CacheReserve = 16 * 1024 * 1024;\nstatic u32 s_ReserveBufferUsed = 0;\nstatic u8* s_ReserveBuffer = NULL;\n\nstatic void ReleaseCache()\n{\n\tif (s_ReserveBuffer)\n\t{\n\t\tdelete [] s_ReserveBuffer;\n\t\ts_ReserveBuffer = NULL;\n\t}\n\ts_ReserveBufferUsed = 0;\n}\n\nstatic void InitializeCache()\n{\n\tReleaseCache();\n\n\ts_ReserveBuffer = new u8[s_CacheReserve];\n\tmemset(s_ReserveBuffer, 0xFD, s_CacheReserve * sizeof(u8));\n\ts_ReserveBufferUsed = 0;\n}\n\nstatic void ResetCache()\n{\n\tmemset(s_ReserveBuffer, 0xFD, s_CacheReserve * sizeof(u8));\n\ts_ReserveBufferUsed = 0;\n}\n\nstatic void* AllocCache(u32 size)\n{\n\tif (s_ReserveBufferUsed + size >= s_CacheReserve)\n\t\treturn NULL;\n\n\tvoid *ptr = &s_ReserveBuffer[s_ReserveBufferUsed];\n\ts_ReserveBufferUsed += size;\n\n\treturn ptr;\n}\n\nstatic void* AllocCacheAlign(u32 size)\n{\n\tstatic const u32 align = 4 - 1;\n\n\tu32 size_new = size + align;\n\n\tuintptr_t ptr = (uintptr_t)AllocCache(size_new);\n\tif (ptr == 0)\n\t\treturn NULL;\n\n\tuintptr_t retptr = (ptr + align) & ~align;\n\n\treturn (void*)retptr;\n}\n\nstatic u32 GetCacheRemain()\n{\n\treturn s_CacheReserve - s_ReserveBufferUsed;\n}\n\n////////////////////////////////////////////////////////////////////\nstatic ArmAnalyze *s_pArmAnalyze = NULL;\n\n#ifdef DUMPLOG\nstruct EInfo\n{\n\tu32 count;\n\tu32 time;\n};\nstatic std::map<u32,EInfo> exec_info[2];\nstatic FILE* dump_log = NULL;\n#endif\n\nTEMPLATE static Block* armcpu_compileblock(BlockInfo &blockinfo)\n{\n#define ALLOC_METHOD(name) \\\n\tname = &block->ops[n++];\\\n\tname->R15 = CalcR15;\n\n#ifdef DEVELOPER\n\tDEBUG_statistics.blockCompileCounters[PROCNUM]++;\n#endif\n\n\tDecoded *Instructions = blockinfo.Instructions;\n\ts32 InstructionsNum = blockinfo.InstructionsNum;\n\ts32 R15Num = blockinfo.R15Num;\n\ts32 SubBlocks = blockinfo.SubBlocks;\n\n#ifdef DUMPLOG\n\tstd::string dump = s_pArmAnalyze->DumpInstruction(Instructions, InstructionsNum);\n\tfprintf(dump_log, \"%s\\n\", dump.c_str());\n#endif\n\n\tBlock *block = (Block*)AllocCacheAlign(sizeof(Block));\n\tJITLUT_HANDLE(Instructions[0].Address, PROCNUM) = (uintptr_t)block;\n\n\tu32 MethodCount = InstructionsNum + R15Num + SubBlocks + 1/* StopExecute */;\n\tblock->ops = (MethodCommon*)AllocCacheAlign(sizeof(MethodCommon) * MethodCount);\n\n\tCond_SubBlockStart *pSubBlockStart = NULL;\n\tu32 CurSubBlock = INVALID_SUBBLOCK;\n\tu32 CurInstructions = 0;\n\n\tu32 n = 0;\n\tfor (s32 i = 0; i < InstructionsNum; i++)\n\t{\n\t\tDecoded &Inst = Instructions[i];\n\n\t\tu32 CalcR15 = Inst.CalcR15(Inst);\n\t\tbool link = false;\n\n\t\tif (Inst.IROp == IR_NOP)\n\t\t\tcontinue;\n\n\t\tMethodCommon *pCond_SubBlockStart = NULL;\n\t\tif (CurSubBlock != Inst.SubBlock)\n\t\t{\n\t\t\tif (pSubBlockStart)\n\t\t\t\tpSubBlockStart->instructions = CurInstructions;\n\n\t\t\tCurInstructions = 0;\n\n\t\t\tif (Inst.Cond != 0xE && Inst.Cond != 0xF)\n\t\t\t{\n\t\t\t\tALLOC_METHOD(pCond_SubBlockStart)\n\n\t\t\t\tif (pSubBlockStart)\n\t\t\t\t\tpSubBlockStart->target = pCond_SubBlockStart;\n\n\t\t\t\tpSubBlockStart = Cond_SubBlockStart::Compiler<PROCNUM>(Inst.Cond, pCond_SubBlockStart);\n\t\t\t}\n\t\t\telse\n\t\t\t\tlink = true;\n\n\t\t\tCurSubBlock = Inst.SubBlock;\n\t\t}\n\n\t\tMethodCommon *pSynR15Before = NULL;\n\t\tif (Inst.R15Modified && Inst.R15Used)\n\t\t{\n\t\t\tALLOC_METHOD(pSynR15Before)\n\n\t\t\tOP_SyncR15Before::Compiler<PROCNUM>(Inst, pSynR15Before);\n\t\t}\n\n\t\tMethodCommon *pMethod;\n\t\tALLOC_METHOD(pMethod)\n\n\t\tif (Inst.ThumbFlag)\n\t\t{\n\t\t\t//if ((Inst.IROp >= IR_NOP && Inst.IROp <= IR_BKPT))\n\t\t\t//\tOP_WRAPPER::Compiler<PROCNUM>(Inst, pMethod);\n\t\t\t//else\n\t\t\t\tthumb_compiler_set[Inst.ProcessID][Inst.Instruction.ThumbOp>>6](Inst, pMethod);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//if ((Inst.IROp >= IR_NOP && Inst.IROp <= IR_BKPT))\n\t\t\t//\tOP_WRAPPER::Compiler<PROCNUM>(Inst, pMethod);\n\t\t\t//else\n\t\t\t\tarm_compiler_set[Inst.ProcessID][INSTRUCTION_INDEX(Inst.Instruction.ArmOp)](Inst, pMethod);\n\t\t}\n\n\t\tCurInstructions++;\n\n\t\tif (link && pSubBlockStart)\n\t\t{\n\t\t\tpSubBlockStart->target = pSynR15Before ? pSynR15Before : pMethod;\n\t\t\tpSubBlockStart = NULL;\n\t\t}\n\t}\n\n\tDecoded &LastIns = Instructions[InstructionsNum - 1];\n\tu32 CalcR15 = LastIns.CalcR15(LastIns);\n\n\tMethodCommon *pEndBlock;\n\tALLOC_METHOD(pEndBlock)\n\n\tOP_StopExecute::Compiler<PROCNUM>(LastIns.Address + (LastIns.ThumbFlag ? 2 : 4), pEndBlock);\n\tif (pSubBlockStart)\n\t{\n\t\tpSubBlockStart->target = pEndBlock;\n\t\tpSubBlockStart->instructions = CurInstructions;\n\t\tpSubBlockStart = NULL;\n\t}\n\n\tIF_DEVELOPER(if(n > MethodCount) INFO(\"method over !!!.\\n\"););\n\n\treturn block;\n\n#undef ALLOC_METHOD\n}\n\nTEMPLATE static Block* armcpu_compile()\n{\n#define DO_FB_BLOCK \\\n\tBlock *block = &s_OpDecodeBlock[PROCNUM][ARMPROC.CPSR.bits.T];\\\n\tJITLUT_HANDLE(adr, PROCNUM) = (uintptr_t)block;\\\n\treturn block;\n\n\tu32 adr = ARMPROC.instruct_adr;\n\n\tif (!JITLUT_MAPPED(adr & 0x0FFFFFFF, PROCNUM))\n\t{\n\t\tINFO(\"JIT: use unmapped memory address %08X\\n\", adr);\n\t\texecute = false;\n\t\treturn NULL;\n\t}\n\n\t//if (!JitBlockModify(adr))\n\t//{\n\t//\tPROGINFO(\"hot modify %x %d !!!.\\n\", adr, PROCNUM);\n\n\t//\tDO_FB_BLOCK\n\t//}\n\n\tif (GetCacheRemain() < 1 * 64 * 1024)\n\t{\n\t\tINFO(\"cache full, reset cpu[%d].\\n\", PROCNUM);\n\n\t\tarm_threadedinterpreter.Reset();\n\t}\n\n\tif (!s_pArmAnalyze->Decode(GETCPUPTR) || !s_pArmAnalyze->CreateBlocks())\n\t{\n\t\tDO_FB_BLOCK\n\t}\n\n\tBlock *first_block = NULL;\n\n\tBlockInfo *BlockInfos;\n\ts32 BlockInfoNum;\n\n\ts_pArmAnalyze->GetBlocks(BlockInfos, BlockInfoNum);\n\tfor (s32 BlockNum = 0; BlockNum < BlockInfoNum; BlockNum++)\n\t{\n\t\tBlock *block = armcpu_compileblock<PROCNUM>(BlockInfos[BlockNum]);\n\t\tif (BlockNum == 0)\n\t\t\tfirst_block = block;\n\t}\n\n\treturn first_block;\n\n#undef DO_FB_BLOCK\n}\n\n////////////////////////////////////////////////////////////////////\nstatic void cpuReserve()\n{\n\tInitializeCache();\n\n\ts_pArmAnalyze = new ArmAnalyze(CommonSettings.jit_max_block_size);\n\n\ts_pArmAnalyze->m_MergeSubBlocks = true;\n\ts_pArmAnalyze->m_OptimizeFlag = true;\n\n#ifdef DUMPLOG\n\textern unsigned long long RawGetTickPerSecond();\n\n\tunsigned long long tps = RawGetTickPerSecond();\n#ifdef ANDROID\n\tdump_log = fopen(\"/sdcard/desmume_dump.log\", \"w\");\n#else\n\tdump_log = fopen(\"./desmume_dump.log\", \"w\");\n#endif\n\n\tfprintf(dump_log, \"RawGetTickPerSecond : %llu\\n\", tps);\n\tfprintf(dump_log, \"\\n\");\n\n\texec_info[0].clear();\n\texec_info[1].clear();\n#endif\n}\n\nstatic void cpuShutdown()\n{\n\tReleaseCache();\n\n\tJitLutReset();\n\n\tdelete s_pArmAnalyze;\n\ts_pArmAnalyze = NULL;\n\n#ifdef DUMPLOG\n\textern unsigned long long RawGetTickPerSecond();\n\n\tunsigned long long tps = RawGetTickPerSecond();\n\n\tfprintf(dump_log, \"ARM9 exec info\\n\");\n\tfor (std::map<u32,EInfo>::const_iterator itr = exec_info[0].begin(); itr != exec_info[0].end(); itr++)\n\t{\n\t\tfloat time = (float)(itr->second.time * 1000000.0 / tps);\n\t\tif (itr->second.count > 100/* && itr->second.time > 1000*/)\n\t\t\tfprintf(dump_log, \"Address : %08X, Exec : %10d, Time : %14.6f, Rate : %14.6f\\n\", \n\t\t\t\t\titr->first, itr->second.count, time, time / (float)itr->second.count);\n\t}\n\texec_info[0].clear();\n\n\tfprintf(dump_log, \"\\nARM7 exec info\\n\");\n\tfor (std::map<u32,EInfo>::const_iterator itr = exec_info[1].begin(); itr != exec_info[1].end(); itr++)\n\t{\n\t\tfloat time = (float)(itr->second.time * 1000000.0 / tps);\n\t\tif (itr->second.count > 100/* && itr->second.time > 1000*/)\n\t\t\tfprintf(dump_log, \"Address : %08X, Exec : %10d, Time : %14.6f, Rate : %14.6f\\n\", \n\t\t\t\t\titr->first, itr->second.count, time, time / (float)itr->second.count);\n\t}\n\texec_info[1].clear();\n\n\tfflush(dump_log);\n\tfclose(dump_log);\n\tdump_log = NULL;\n#endif\n}\n\nstatic void cpuReset()\n{\n\tResetCache();\n\n\tJitLutReset();\n}\n\nstatic void cpuSync()\n{\n\tarmcpu_sync();\n}\n\nTEMPLATE static void cpuClear(u32 Addr, u32 Size)\n{\n\tif (Addr == 0 && Size == CPUBASE_FLUSHALL)\n\t{\n\t\tJitLutReset();\n\t}\n\telse\n\t{\n\t\tSize /= 2;\n\t\tfor (u32 i = 0; i < Size; i++)\n\t\t{\n\t\t\tconst u32 adr = Addr + i*2;\n\n\t\t\tif (JITLUT_MAPPED(adr, PROCNUM))\n\t\t\t\tJITLUT_HANDLE(adr, PROCNUM) = (uintptr_t)NULL;\n\t\t}\n\t}\n}\n\n\nstatic u32 cpuGetCacheReserve()\n{\n\treturn s_CacheReserve / 1024 /1024;\n}\n\nstatic void cpuSetCacheReserve(u32 reserveInMegs)\n{\n\ts_CacheReserve = reserveInMegs * 1024 * 1024;\n}\n\nstatic const char* cpuDescription()\n{\n\treturn \"Arm Threaded Interpreter\";\n}\n\nCpuBase arm_threadedinterpreter =\n{\n\tcpuReserve,\n\n\tcpuShutdown,\n\n\tcpuReset,\n\n\tcpuSync,\n\n\tcpuClear<0>, cpuClear<1>,\n\n\tcpuExecute<0>, cpuExecute<1>,\n\n\tcpuGetCacheReserve,\n\tcpuSetCacheReserve,\n\n\tcpuDescription\n};\n\n template Block* armcpu_compileblock<0>(BlockInfo &blockinfo);\n template Block* armcpu_compileblock<1>(BlockInfo &blockinfo);\n template Block* armcpu_compile<0>();\n template Block* armcpu_compile<1>();\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ArmThreadedInterpreter.h",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ARM_THREADEDINTERPRETER\n#define ARM_THREADEDINTERPRETER\n\n#include \"common.h\"\n#include \"CpuBase.h\"\n#include \"armcpu.h\"\n\n#include \"ArmThreadedInterpreter.h\"\n#include \"ArmAnalyze.h\"\n#include \"JitCommon.h\"\n\ntypedef u32 (FASTCALL* OpCompiler)(const Decoded& d, struct MethodCommon* common);\ntypedef void (FASTCALL* OpMethod)(const struct MethodCommon* common);\n\nstruct MethodCommon\n{\n\tOpMethod func;\n\tvoid* data;\n\tu32 R15;\n};\n\n\nstruct Block\n{\n\tMethodCommon *ops;\n\tstatic u32 cycles;\n};\n\ntemplate<int PROCNUM> Block* armcpu_compileblock(BlockInfo &blockinfo);\n\ntemplate<int PROCNUM> Block* armcpu_compile();\n\ntemplate<int PROCNUM> static u32 cpuExecute()\n{\n\tBlock *block = (Block*)JITLUT_HANDLE(ARMPROC.instruct_adr, PROCNUM);\n\tif (!block)\n\t\tblock = armcpu_compile<PROCNUM>();\n\n#ifdef DUMPLOG\n\textern unsigned long long RawGetTickCount();\n\n\tunsigned long long start = RawGetTickCount();\n#endif\n\n\tblock->cycles = 0;\n\tblock->ops->func(block->ops);\n\n#ifdef DUMPLOG\n\tu32 time = (u32)(RawGetTickCount() - start);\n\n\tstd::map<u32,EInfo>::iterator itr = exec_info[PROCNUM].find(ARMPROC.instruct_adr);\n\tif (itr != exec_info[PROCNUM].end())\n\t{\n\t\titr->second.count++;\n\t\titr->second.time += time;\n\t}\n\telse\n\t{\n\t\tEInfo info;\n\t\tinfo.count = 1;\n\t\tinfo.time = time;\n\n\t\texec_info[PROCNUM][ARMPROC.instruct_adr] = info;\n\t}\n#endif\n\n\treturn block->cycles;\n}\n\nextern CpuBase arm_threadedinterpreter;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/CpuBase.cpp",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"CpuBase.h\"\n\nCpuBase *arm_cpubase = NULL;\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/CpuBase.h",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef CPU_BASE\n#define CPU_BASE\n\n#include \"common.h\"\n\n#define CPUBASE_FLUSHALL ((u32)-1)\n\nstruct CpuBase\n{\n\tvoid (*Reserve)();\n\n\tvoid (*Shutdown)();\n\n\tvoid (*Reset)();\n\n\tvoid (*Sync)();\n\n\tvoid (*Clear[2])(u32 Addr, u32 Size);\n\n\tu32 (*Execute[2])();\n\n\tu32 (*GetCacheReserve)();\n\tvoid (*SetCacheReserve)(u32 reserveInMegs);\n\n\tconst char* (*Description)();\n};\n\nextern CpuBase *arm_cpubase;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/Disassembler.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdio.h>\n#include <string.h>\n#include \"Disassembler.h\"\n#include \"bits.h\"\n\n#define ROR(i, j)   ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j))))\n\nconst char Condition[16][3] = {\n      \"EQ\",\n      \"NE\",\n      \"CS\",\n      \"CC\",\n      \"MI\",\n      \"PL\",\n      \"VS\",\n      \"VC\",\n      \"HI\",\n      \"LS\",\n      \"GE\",\n      \"LT\",\n      \"GT\",\n      \"LE\",\n      \"\",\n      \"\"\n      };\n      \nconst char Registre[16][4] = {\n      \"R0\",\n      \"R1\",\n      \"R2\",\n      \"R3\",\n      \"R4\",\n      \"R5\",\n      \"R6\",\n      \"R7\",\n      \"R8\",\n      \"R9\",\n      \"R10\",\n      \"R11\",\n      \"R12\",\n      \"SP\",\n      \"LR\",\n      \"PC\",\n      };\n\nconst char MSR_FIELD[16][5] = {\n     \"\",\n     \"c\",\n     \"x\",\n     \"xc\",\n     \"s\",\n     \"sc\",\n     \"sx\",\n     \"sxc\",\n     \"f\",\n     \"fc\",\n     \"fx\",\n     \"fxc\",\n     \"fs\",\n     \"fsc\",\n     \"fsx\",\n     \"fsxc\"\n     };\n     \n#define DATAPROC_LSL_IMM(nom, s)      char tmp[10] = \"\";\\\n     if(((i>>7)&0x1F)!=0)\\\n          sprintf(tmp, \", LSL #%X\", (int)((i>>7)&0x1F));\\\n     sprintf(txt, \"%s%s%s %s, %s, %s%s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,12)],\\\n                                     Registre[REG_POS(i,16)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     tmp);\n#define DATAPROC_ROR_IMM(nom, s)      char tmp[10] = \"\";\\\n     if(((i>>7)&0x1F)!=0)\\\n          sprintf(tmp, \", RRX\");\\\n     sprintf(txt, \"%s%s%s %s, %s, %s%s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,12)],\\\n                                     Registre[REG_POS(i,16)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     tmp\\\n                                     );\n\n#define DATAPROC_REG_SHIFT(nom, shift,s)      sprintf(txt, \"%s%s%s %s, %s, %s, %s %s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,12)],\\\n                                     Registre[REG_POS(i,16)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     #shift,\\\n                                     Registre[REG_POS(i,8)]\\\n                                     );\n\n#define DATAPROC_IMM_SHIFT(nom, shift, s)      sprintf(txt, \"%s%s%s %s, %s, %s, %s #%X\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,12)],\\\n                                     Registre[REG_POS(i,16)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     #shift,\\\n                                     (int)((i>>7)&0x1F)\\\n                                     );\n                                     \n#define DATAPROC_IMM_VALUE(nom,s)  u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E);\\\n                                   sprintf(txt, \"%s%s%s %s, %s, #%X\",\\\n                                        #nom,\\\n                                        Condition[CONDITION(i)],\\\n                                        s,\\\n                                        Registre[REG_POS(i,12)],\\\n                                        Registre[REG_POS(i,16)],\\\n                                        (int)shift_op\\\n                                        );\n                                        \n#define DATAPROC_ONE_OP_LSL_IMM(nom, s, v) char tmp[10] = \"\";\\\n     if(((i>>7)&0x1F)!=0)\\\n          sprintf(tmp, \", LSL #%X\", (int)((i>>7)&0x1F));\\\n     sprintf(txt, \"%s%s%s %s, %s%s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,v)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     tmp); \n                                      \n#define DATAPROC_ONE_OP_ROR_IMM(nom, s, v)      char tmp[10] = \"\";\\\n     if(((i>>7)&0x1F)==0)\\\n          sprintf(tmp, \", RRX\");\\\n     else\\\n          sprintf(tmp, \", ROR %d\", (int)((i>>7)&0x1F));\\\n     sprintf(txt, \"%s%s%s %s, %s%s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,v)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     tmp\\\n                                     );\n\n#define DATAPROC_ONE_OP_REG_SHIFT(nom, shift,s, v)      sprintf(txt, \"%s%s%s %s, %s, %s %s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,v)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     #shift,\\\n                                     Registre[REG_POS(i,8)]\\\n                                     );\n\n#define DATAPROC_ONE_OP_IMM_SHIFT(nom, shift, s, v)      sprintf(txt, \"%s%s%s %s, %s, %s #%X\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,v)],\\\n                                     Registre[REG_POS(i,0)],\\\n                                     #shift,\\\n                                     (int)((i>>7)&0x1F)\\\n                                     );\n                                     \n#define DATAPROC_ONE_OP_IMM_VALUE(nom, s, v)\\\n                                     u32 shift_op = ROR((i&0xFF), (i>>7)&0x1E);\\\n                                     sprintf(txt, \"%s%s%s %s, #%X\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     s,\\\n                                     Registre[REG_POS(i,v)],\\\n                                     (int)shift_op\\\n                                     );\n\n#define SIGNEXTEND_24(i) (((i)&0xFFFFFF)|(0xFF000000*BIT23(i)))\n\n#define LDRSTR_LSL_IMM(nom, op, op2, op3)      char tmp[10] = \"\";\\\n     if(((i>>7)&0x1F)!=0)\\\n          sprintf(tmp, \", LSL #%X\", (int)((i>>7)&0x1F));\\\n     sprintf(txt, \"%s%s %s, [%s%s, %s%s%s%s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     Registre[REG_POS(i,12)],\\\n                                     Registre[REG_POS(i,16)],\\\n                                     op2,\\\n                                     op,\\\n                                     Registre[REG_POS(i,0)],\\\n                                     tmp,\\\n                                     op3);\n#define LDRSTR_ROR_IMM(nom, op, op2, op3)      char tmp[10] = \"\";\\\n     if(((i>>7)&0x1F)!=0)\\\n          sprintf(tmp, \", RRX\");\\\n     sprintf(txt, \"%s%s %s, [%s%s, %s%s%s%s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     Registre[REG_POS(i,12)],\\\n                                     Registre[REG_POS(i,16)],\\\n                                     op2,\\\n                                     op,\\\n                                     Registre[REG_POS(i,0)],\\\n                                     tmp,\\\n                                     op3\\\n                                     );\n\n#define LDRSTR_IMM_SHIFT(nom, shift, op, op2, op3)\\\n                                     sprintf(txt, \"%s%s %s, [%s%s, %s%s, %s #%X%s\",\\\n                                     #nom,\\\n                                     Condition[CONDITION(i)],\\\n                                     Registre[REG_POS(i,12)],\\\n                                     Registre[REG_POS(i,16)],\\\n                                     op2,\\\n                                     op,\\\n                                     Registre[REG_POS(i,0)],\\\n                                     #shift,\\\n                                     (int)((i>>7)&0x1F),\\\n                                     op3\\\n                                     );\n                                     \n#define RegList(nb)      char lreg[100] = \"\";\\\n     int prec = 0;\\\n     int j;\\\n     for(j = 0; j < nb; j++)\\\n     {\\\n          if(prec)\\\n          {\\\n               if((!BIT_N(i, j+1))||(j==nb-1))\\\n               {\\\n                    sprintf(lreg + strlen(lreg), \"%s,\", Registre[j]);\\\n                    prec = 0;\\\n               }\\\n          }\\\n          else\\\n          {\\\n               if(BIT_N(i, j))\\\n               {\\\n                    if((BIT_N(i, j+1))&&(j!=nb-1))\\\n                    {\\\n                         sprintf(lreg + strlen(lreg), \"%s-\", Registre[j]);\\\n                         prec = 1;\\\n                    }\\\n                    else\\\n                         sprintf(lreg + strlen(lreg), \"%s,\", Registre[j]);\\\n               }\\\n          }\\\n     }\\\n     if(*lreg) lreg[strlen(lreg)-1]='\\0';\n\nstatic char * OP_UND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"--<UNDEFINED>--\");\n     return txt;\n}\n \n//-----------------------AND------------------------------------\nstatic char * OP_AND_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(AND, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, LSL, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(AND, LSR, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, LSR, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(AND, ASR, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, ASR, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(AND, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, ROR, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(AND, \"\");\n     return txt;\n}\n\nstatic char * OP_AND_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(AND, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, LSL, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(AND, LSR, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, LSR, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(AND, ASR, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, ASR, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(AND, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(AND, ROR, \"S\");\n     return txt;\n}\n\nstatic char * OP_AND_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(AND, \"S\");\n     return txt;\n}\n\n//--------------EOR------------------------------\nstatic char * OP_EOR_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(EOR, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, LSL, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n    DATAPROC_IMM_SHIFT(EOR, LSR, \"\");\n    return txt;\n}\n    \nstatic char * OP_EOR_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, LSR, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(EOR, ASR, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, ASR, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(EOR, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, ROR, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(EOR, \"\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(EOR, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, LSL, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(EOR, LSR, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, LSR, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(EOR, ASR, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, ASR, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(EOR, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(EOR, ROR, \"S\");\n     return txt;\n}\n\nstatic char * OP_EOR_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(EOR, \"S\");\n     return txt;\n}\n\n//-------------SUB-------------------------------------\n\nstatic char * OP_SUB_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(SUB, \"\");\n     return txt;\n}\n\nstatic char * OP_SUB_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, LSL, \"\");\n     return txt;\n}\n\nstatic char * OP_SUB_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SUB, LSR, \"\");\n     return txt;\n}\n\nstatic char * OP_SUB_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, LSR, \"\");\n     return txt;\n}\n\nstatic char * OP_SUB_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SUB, ASR, \"\");\n     return txt;\n}\n\nstatic char * OP_SUB_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_SUB_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(SUB, \"\");\nreturn txt;}\n\nstatic char * OP_SUB_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_SUB_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(SUB, \"\");\nreturn txt;}\n\nstatic char * OP_SUB_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(SUB, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SUB, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SUB, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(SUB, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SUB, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_SUB_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(SUB, \"S\");\nreturn txt;}\n\n//------------------RSB------------------------\n\nstatic char * OP_RSB_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(RSB, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, LSL, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSB, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSB, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(RSB, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(RSB, \"\");\nreturn txt;}\n\nstatic char * OP_RSB_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(RSB, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSB, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSB, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(RSB, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSB, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSB_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(RSB, \"S\");\nreturn txt;}\n\n//------------------ADD-----------------------------------\n\nstatic char * OP_ADD_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(ADD, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, LSL, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADD, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADD, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(ADD, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(ADD, \"\");\nreturn txt;}\n\nstatic char * OP_ADD_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(ADD, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADD, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADD, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(ADD, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADD, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADD_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(ADD, \"S\");\nreturn txt;}\n\n//------------------ADC-----------------------------------\n\nstatic char * OP_ADC_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(ADC, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, LSL, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(ADC, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(ADC, \"\");\nreturn txt;}\n\nstatic char * OP_ADC_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(ADC, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ADC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(ADC, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ADC, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_ADC_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(ADC, \"S\");\nreturn txt;}\n\n//-------------SBC-------------------------------------\n\nstatic char * OP_SBC_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(SBC, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, LSL, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SBC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SBC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(SBC, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(SBC, \"\");\nreturn txt;}\n\nstatic char * OP_SBC_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(SBC, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SBC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(SBC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(SBC, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(SBC, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_SBC_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(SBC, \"S\");\nreturn txt;}\n\n//---------------RSC----------------------------------\n\nstatic char * OP_RSC_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(RSC, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, LSL, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(RSC, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(RSC, \"\");\nreturn txt;}\n\nstatic char * OP_RSC_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(RSC, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(RSC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(RSC, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(RSC, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_RSC_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(RSC, \"S\");\nreturn txt;}\n\n//-------------------TST----------------------------\n\nstatic char * OP_TST_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(TST, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TST, LSL, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(TST, LSR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TST, LSR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(TST, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TST, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(TST, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TST, ROR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TST_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(TST, \"\", 16);\nreturn txt;}\n\n//-------------------TEQ----------------------------\n\nstatic char * OP_TEQ_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(TEQ, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TEQ, LSL, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(TEQ, LSR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TEQ, LSR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(TEQ, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TEQ, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(TEQ, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(TEQ, ROR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_TEQ_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(TEQ, \"\", 16);\nreturn txt;}\n\n//-------------CMP-------------------------------------\n\nstatic char * OP_CMP_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(CMP, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMP, LSL, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(CMP, LSR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMP, LSR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(CMP, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMP, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(CMP, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMP, ROR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMP_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(CMP, \"\", 16);\nreturn txt;}\n\n//---------------CMN---------------------------\n\nstatic char * OP_CMN_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(CMN, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMN, LSL, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(CMP, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMN, LSR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(CMN, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMN, ASR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(CMN, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(CMN, ROR, \"\", 16);\nreturn txt;}\n\nstatic char * OP_CMN_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(CMN, \"\", 16);\nreturn txt;}\n\n//------------------ORR-------------------\n\nstatic char * OP_ORR_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(ORR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, LSL, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ORR, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ORR, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(ORR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(ORR, \"\");\nreturn txt;}\n\nstatic char * OP_ORR_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(ORR, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ORR, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(ORR, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(ORR, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(ORR, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_ORR_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(ORR, \"S\");\nreturn txt;}\n\n//------------------MOV-------------------\n\nstatic char * OP_MOV_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(MOV, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, LSL, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MOV, LSR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, LSR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, ASR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(MOV, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, ROR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(MOV, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(MOV, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, LSL, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MOV, LSR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, LSR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, ASR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(MOV, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MOV, ROR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MOV_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(MOV, \"S\", 12);\nreturn txt;}\n\n//------------------BIC-------------------\n\nstatic char * OP_BIC_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(BIC, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, LSL, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(BIC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, LSR, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(BIC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, ASR, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(BIC, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, ROR, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(BIC, \"\");\nreturn txt;}\n\nstatic char * OP_BIC_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_LSL_IMM(BIC, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, LSL, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(BIC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, LSR, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_SHIFT(BIC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, ASR, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ROR_IMM(BIC, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_REG_SHIFT(BIC, ROR, \"S\");\nreturn txt;}\n\nstatic char * OP_BIC_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_IMM_VALUE(BIC, \"S\");\nreturn txt;}\n\n//------------------MVN-------------------\n\nstatic char * OP_MVN_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(MVN, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, LSL, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MVN, LSR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, LSR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MVN, ASR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, ASR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(MVN, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, ROR, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(MVN, \"\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_LSL_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_LSL_IMM(MVN, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, LSL, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_LSR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MVN, LSR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, LSR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_ASR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_SHIFT(MOV, ASR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, ASR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_ROR_IMM(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_ROR_IMM(MVN, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_REG_SHIFT(MVN, ROR, \"S\", 12);\nreturn txt;}\n\nstatic char * OP_MVN_S_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     DATAPROC_ONE_OP_IMM_VALUE(MVN, \"S\", 12);\nreturn txt;}\n\n\n//-------------MUL------------------------\n\nstatic char * OP_MUL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MUL%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_MLA(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MLA%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\nstatic char * OP_MUL_S(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MUL%sS %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_MLA_S(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MLA%sS %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\n\n//----------UMUL--------------------------\n\nstatic char * OP_UMULL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"UMULL%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_UMLAL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"UMLAL%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_UMULL_S(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"UMULL%sS %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_UMLAL_S(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"UMLAL%sS %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\n//----------SMUL--------------------------\n\nstatic char * OP_SMULL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULL%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMLAL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLAL%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMULL_S(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULL%sS %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMLAL_S(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLAL%sS %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\n//---------------SWP------------------------------\n\nstatic char * OP_SWP(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SWP%s %s, %s, [%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\nstatic char * OP_SWPB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SWPB%s %s, %s, [%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\n//------------LDRH-----------------------------\n\nstatic char * OP_LDRH_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRH_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRH_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, %s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRH_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, -%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, %s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s, -%s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s], #%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s], -#%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s], %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH%s %s, [%s], -%s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\n//------------STRH-----------------------------\n\nstatic char * OP_STRH_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_STRH_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_STRH_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, %s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_STRH_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, -%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_STRH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_STRH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_STRH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, %s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_STRH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s, -%s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_STRH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s], #%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_STRH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s], -#%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_STRH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s], %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_STRH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH%s %s, [%s], -%s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\n//----------------LDRSH--------------------------\n\nstatic char * OP_LDRSH_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSH_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSH_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, %s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSH_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, -%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSH_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSH_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSH_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, %s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSH_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s, -%s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSH_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s], #%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSH_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s], -#%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSH_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s], %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSH_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH%s %s, [%s], -%s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\n//----------------------LDRSB----------------------\n\nstatic char * OP_LDRSB_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSB_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSB_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, %s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSB_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, -%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSB_PRE_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSB_PRE_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSB_PRE_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, %s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSB_PRE_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s, -%s]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSB_POS_INDE_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s], #%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSB_POS_INDE_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s], -#%X\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(((i>>4)&0xF0)|(i&0xF)));\nreturn txt;}\n\nstatic char * OP_LDRSB_POS_INDE_P_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s], %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_LDRSB_POS_INDE_M_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB%s %s, [%s], -%s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\n//--------------MRS--------------------------------\n\nstatic char * OP_MRS_CPSR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MRS%s %s, CPSR\", Condition[CONDITION(i)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\nstatic char * OP_MRS_SPSR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MRS%s %s, SPSR\", Condition[CONDITION(i)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\n//--------------MSR--------------------------------\n\nstatic char * OP_MSR_CPSR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MSR%s CPSR_%s, %s\", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_MSR_SPSR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MSR%s SPSR_%s, %s\", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_MSR_CPSR_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MSR%s CPSR_%s, #%X\", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], (int)ROR((i&0xFF), ((i>>7)&0x1E)));\nreturn txt;}\n\nstatic char * OP_MSR_SPSR_IMM_VAL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MSR%s SPSR_%s, #%X\", Condition[CONDITION(i)], MSR_FIELD[REG_POS(i,16)], (int)ROR((i&0xFF), (i>>7)&0x1E));\nreturn txt;}\n\n//-----------------BRANCH--------------------------\n\nstatic char * OP_BX(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BX%s %s\", Condition[CONDITION(i)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_BLX_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BLX%s %s\", Condition[CONDITION(i)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\nstatic char * OP_B(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"BLX%s %08X\", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8));\n     return txt;}\n     sprintf(txt, \"B%s %08X\", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8));\nreturn txt;}\n\nstatic char * OP_BL(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"BLX%s %08X\", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+10));\n     return txt;}\n     sprintf(txt, \"BL%s %08X\", Condition[CONDITION(i)], (int)(adr+(SIGNEXTEND_24(i)<<2)+8));\nreturn txt;}\n\n//----------------CLZ-------------------------------\n\nstatic char * OP_CLZ(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"CLZ%s %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)]);\nreturn txt;}\n\n\n//--------------------QADD--QSUB------------------------------\n\nstatic char * OP_QADD(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"QADD%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\nstatic char * OP_QSUB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"QSUB%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\nstatic char * OP_QDADD(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"QDADD%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\nstatic char * OP_QDSUB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"QDSUB%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\n//-----------------SMUL-------------------------------\n\nstatic char * OP_SMUL_B_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULBB%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMUL_B_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULBT%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMUL_T_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULTB%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMUL_T_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULTT%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\n//-----------SMLA----------------------------\n\nstatic char * OP_SMLA_B_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLABB%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\nstatic char * OP_SMLA_B_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLABT%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\nstatic char * OP_SMLA_T_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLATB%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\nstatic char * OP_SMLA_T_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLATT%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\n//--------------SMLAL---------------------------------------\n\nstatic char * OP_SMLAL_B_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLABB%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMLAL_B_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLABT%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMLAL_T_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLATB%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMLAL_T_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLATT%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\n//--------------SMULW--------------------\n\nstatic char * OP_SMULW_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULWB%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\nstatic char * OP_SMULW_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMULWT%s %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)]);\nreturn txt;}\n\n//--------------SMLAW-------------------\nstatic char * OP_SMLAW_B(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLAWB%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\nstatic char * OP_SMLAW_T(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SMLAWT%s %s, %s, %s, %s\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], Registre[REG_POS(i,0)], Registre[REG_POS(i,8)], Registre[REG_POS(i,12)]);\nreturn txt;}\n\n//------------LDR---------------------------\n\nstatic char * OP_LDR_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n\tif(REG_POS(i,16) == 15)\n\t\tsprintf(txt, \"LDR%s %s, [%08X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 + (int)(i&0x7FF)));\n\telse\n\t\tsprintf(txt, \"LDR%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDR_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n\tif(REG_POS(i,16) == 15)\n\t\tsprintf(txt, \"LDR%s %s, [%08X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 - (int)(i&0x7FF)));\n\telse\n\t\tsprintf(txt, \"LDR%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDREX(u32 adr, u32 i, char * txt)\n{\n\tsprintf(txt, \"LDREX%s %s, [%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\nstatic char * OP_LDR_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, LSR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, LSR, \"M\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, ASR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, ASR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, LSR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, LSR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, ASR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, ASR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR%s %s, [%s], #%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDR_P_IMM_OFF_POSTIND2(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR%s %s, [%s], #%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR%s %s, [%s], -#%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDR_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDR_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, LSR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDR_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, LSR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDR_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, ASR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDR_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDR, ASR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDR_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDR_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDR, \"-\", \"]\", \"\");\nreturn txt;}\n\n//-----------------LDRB-------------------------------------------\n\nstatic char * OP_LDRB_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRB_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRB, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRB, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, LSR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, LSR, \"M\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, ASR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, ASR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRB, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRB, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRB, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRB, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, LSR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, LSR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, ASR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, ASR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRB, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRB, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB%s %s, [%s], #%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB%s %s, [%s], -#%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRB, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRB, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, LSR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, LSR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, ASR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRB, ASR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRB_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRB, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRB_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRB, \"-\", \"]\", \"\");\nreturn txt;}\n\n//----------------------STR--------------------------------\n\nstatic char * OP_STR_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STR_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STREX(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STREX%s %s, %s, [%s]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,0)], Registre[REG_POS(i,16)]);\nreturn txt;}\n\nstatic char * OP_STR_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, LSR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, LSR, \"M\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, ASR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, ASR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, LSR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, LSR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, ASR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, ASR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR%s %s, [%s], #%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR%s %s, [%s], -#%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STR_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STR_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, LSR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STR_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, LSR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STR_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, ASR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STR_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STR, ASR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STR_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STR_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STR, \"-\", \"]\", \"\");\nreturn txt;}\n\n//-----------------------STRB-------------------------------------\n\nstatic char * OP_STRB_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB%s %s, [%s, #%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRB_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB%s %s, [%s, -#%X]\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRB, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_M_LSL_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRB, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_P_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, LSR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_M_LSR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, LSR, \"M\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_P_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, ASR, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_M_ASR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, ASR, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_P_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRB, \"\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_M_ROR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRB, \"-\", \"\", \"]\");\nreturn txt;}\n\nstatic char * OP_STRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB%s %s, [%s, #%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB%s %s, [%s, -#%X]!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRB, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_M_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRB, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_P_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, LSR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_M_LSR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, LSR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_P_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, ASR, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_M_ASR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, ASR, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_P_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRB, \"\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_M_ROR_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRB, \"-\", \"\", \"]!\");\nreturn txt;}\n\nstatic char * OP_STRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB%s %s, [%s], #%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB%s %s, [%s], -#%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRB, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRB_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRB, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRB_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, LSR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRB_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, LSR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRB_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, ASR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRB_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRB, ASR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRB_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRB, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRB_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRB, \"-\", \"]\", \"\");\nreturn txt;}\n\n//-----------------------LDRBT-------------------------------------\n\n#if 0\nstatic char * OP_LDRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRBT%s %s, [%s], #%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRBT%s %s, [%s], -#%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_LDRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRBT, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRBT_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(LDRBT, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRBT_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRBT, LSR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRBT_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRBT, LSR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRBT_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRBT, ASR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRBT_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(LDRBT, ASR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRBT_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRBT, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_LDRBT_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(LDRBT, \"-\", \"]\", \"\");\nreturn txt;}\n\n//----------------------STRBT----------------------------\n\nstatic char * OP_STRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRBT%s %s, [%s], #%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRBT%s %s, [%s], -#%X!\", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));\nreturn txt;}\n\nstatic char * OP_STRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRBT, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRBT_M_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_LSL_IMM(STRBT, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRBT_P_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRBT, LSR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRBT_M_LSR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRBT, LSR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRBT_P_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRBT, ASR, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRBT_M_ASR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_IMM_SHIFT(STRBT, ASR, \"-\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRBT_P_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRBT, \"\", \"]\", \"\");\nreturn txt;}\n\nstatic char * OP_STRBT_M_ROR_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)\n{\n     LDRSTR_ROR_IMM(STRBT, \"-\", \"]\", \"\");\nreturn txt;}\n#endif\n\n//---------------------LDM-----------------------------\n\nstatic char * OP_LDMIA(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIA%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMIB(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIB%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMDA(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDA%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMDB(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDB%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMIA_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIA%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMIB_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIB%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMDA_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDA%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMDB_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDB%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMIA2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIA%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMIB2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIB%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMDA2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDA%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMDB2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDB%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_LDMIA2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIA%s %s!, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\n     if(BIT15(i)==0) sprintf(txt, \"%s ?????\", txt);\nreturn txt;}\n\nstatic char * OP_LDMIB2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMIB%s %s!, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\n     if(BIT15(i)==0) sprintf(txt, \"%s ?????\", txt);\nreturn txt;}\n\nstatic char * OP_LDMDA2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDA%s %s!, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\n     if(BIT15(i)==0) sprintf(txt, \"%s ?????\", txt);\nreturn txt;}\n\nstatic char * OP_LDMDB2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"LDMDB%s %s!, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\n     if(BIT15(i)==0) sprintf(txt, \"%s ?????\", txt);\nreturn txt;}\n\n//------------------------------STM----------------------------------\n\nstatic char * OP_STMIA(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIA%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMIB(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIB%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMDA(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDA%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMDB(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDB%s %s, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMIA_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIA%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMIB_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIB%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMDA_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDA%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMDB_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDB%s %s!, {%s}\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMIA2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIA%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMIB2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIB%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMDA2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDA%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMDB2(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDB%s %s, {%s}^\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMIA2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIA%s %s!, {%s}^ ?????\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMIB2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMIB%s %s!, {%s}^ ?????\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\nreturn txt;}\n\nstatic char * OP_STMDA2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDA%s %s!, {%s}^ ?????\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\n     return txt;\n}\n\nstatic char * OP_STMDB2_W(u32 adr, u32 i, char * txt)\n{\n     RegList(16);\n     sprintf(txt, \"STMDB%s %s!, {%s}^ ?????\", Condition[CONDITION(i)], Registre[REG_POS(i,16)], lreg);\n     return txt;\n}\n\n//---------------------STC----------------------------------\n\nstatic char * OP_STC_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"STC2 CP%X, CR%X, [%s, #%X]\", (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"STC%s %X, CP%X, [%s, #%X]\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_STC_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"STC2 CP%X, CR%X, [%s, #-%X]\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)],(int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"STC%s CP%X, CR%X, [%s, #-%X]\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_STC_P_PREIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"STC2 CP%X, CR%X, [%s, #%X]!\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"STC%s CP%X, CR%X, [%s, #%X]!\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_STC_M_PREIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"STC2 CP%X, CR%X, [%s, #-%X]!\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"STC%s CP%X, CR%X, [%s, #-%X]!\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_STC_P_POSTIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"STC2 CP%X, CR%X, [%s], #%X\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"STC%s CP%X, CR%X, [%s], #%X\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_STC_M_POSTIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"STC2 CP%X, CR%X, [%s], #-%X\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"STC%s CP%X, CR%X, [%s], #-%X\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_STC_OPTION(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"STC2 CP%X, CR%X, [%s], {%X}\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF));\n          return txt;\n     }\n     sprintf(txt, \"STC%s CP%X, CR%X, [%s], {%X}\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF));\n     return txt;\n}\n\n//---------------------LDC----------------------------------\n\nstatic char * OP_LDC_P_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"LDC2 CP%X, CR%X, [%s, #%X]\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"LDC%s CP%X, CR%X, [%s, #%X]\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_LDC_M_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"LDC2 CP%X, CR%X, [%s, #-%X]\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"LDC%s CP%X, CR%X, [%s, #-%X]\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_LDC_P_PREIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"LDC2 CP%X, CR%X, [%s, #%X]!\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"LDC%s CP%X, CR%X, [%s, #%X]!\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_LDC_M_PREIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"LDC2 CP%X, CR%X, [%s, #-%X]!\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"LDC%s CP%X, CR%X, [%s, #-%X]!\",Condition[CONDITION(i)], (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_LDC_P_POSTIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"LDC2 CP%X, CR%X, [%s], #%X\",(int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"LDC%s CP%X, CR%X, [%s], #%X\",Condition[CONDITION(i)],  (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_LDC_M_POSTIND(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"LDC2 CP%X, CR%X, [%s], #-%X\", (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n          return txt;\n     }\n     sprintf(txt, \"LDC%s CP%X, CR%X, [%s], #-%X\",Condition[CONDITION(i)],  (int)REG_POS(i, 8),(int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_LDC_OPTION(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"LDC2 CP%X, CR%X, [%s], {%X}\", (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF));\n          return txt;\n     }\n     sprintf(txt, \"LDC%s CP%X, CR%X, [%s], {%X}\",Condition[CONDITION(i)],  (int)REG_POS(i, 8), (int)REG_POS(i, 12), Registre[REG_POS(i, 16)], (int)(i&0xFF));\n     return txt;\n}\n\n\n/*\n *\n * The Enhanced DSP Extension LDRD and STRD instructions.\n *\n */\nstatic char *\nOP_LDRD_STRD_POST_INDEX(u32 adr, u32 i, char * txt) {\n  const char *direction =\n    BIT5(i) ? \"STR\" : \"LDR\";\n  /* U bit - set = add, clear = sub */\n  char sign = BIT23(i) ? '+' : '-';\n  int txt_index = 0;\n\n  txt_index += sprintf( &txt[txt_index], \"%s%sD R%d, [R%d], \",\n                        direction, Condition[CONDITION(i)],\n                        (int)REG_POS(i, 12),\n                        (int)REG_POS(i, 16));\n\n  /* I bit - set = immediate,  clear = reg */\n  if ( BIT22(i)) {\n    sprintf( &txt[txt_index], \"#%c%d\",\n             sign, (int)(((i>>4) & 0xF0) | (i&0xF)) );\n  }\n  else {\n    sprintf( &txt[txt_index], \"%cR%d\",\n             sign, (int)REG_POS(i, 0));\n  }\n  return txt;\n}\nstatic char *\nOP_LDRD_STRD_OFFSET_PRE_INDEX(u32 adr, u32 i, char * txt) {\n  const char *direction =\n    BIT5(i) ? \"STR\" : \"LDR\";\n  /* U bit - set = add, clear = sub */\n  char sign = BIT23(i) ? '+' : '-';\n  int txt_index = 0;\n\n  txt_index += sprintf( &txt[txt_index], \"%s%sD R%d, [R%d, \",\n                        direction, Condition[CONDITION(i)],\n                        (int)REG_POS(i, 12),\n                        (int)REG_POS(i, 16));\n\n  /* I bit - set = immediate,  clear = reg */\n  if ( BIT22(i)) {\n    if ( BIT21(i)) {\n      /* pre-index */\n      sprintf( &txt[txt_index], \"#%c%d]!\",\n             sign, (int)(((i>>4)&0xF0)|(i&0xF)));\n    }\n    else {\n      /* offset */\n      sprintf( &txt[txt_index], \"#%c%d]\",\n             sign, (int)(((i>>4)&0xF0)|(i&0xF)));\n    }\n  }\n  else {\n    if ( BIT21(i)) {\n      /* pre-index */\n      sprintf( &txt[txt_index], \"%c%d]!\",\n             sign, (int)REG_POS(i, 0));\n    }\n    else {\n      /* offset */\n      sprintf( &txt[txt_index], \"%c%d]\",\n             sign, (int)REG_POS(i, 0));\n    }\n  }\n\n  return txt;\n}\n\n\n//----------------MCR-----------------------\n\nstatic char * OP_MCR(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"MCR2 CP%d, %X, %s, CR%d, CR%d, %X\",(int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7));\n          return txt;\n     }\n     sprintf(txt, \"MCR%s CP%d, %X, %s, CR%d, CR%d, %X\",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7));\n     return txt;\n}\n\n//----------------MRC-----------------------\n\nstatic char * OP_MRC(u32 adr, u32 i, char * txt)\n{\n     if(CONDITION(i)==0xF)\n     {\n          sprintf(txt, \"MRC2 CP%d, %X, %s, CR%d, CR%d, %X\",(int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7));\n          return txt;\n     }\n     sprintf(txt, \"MRC%s CP%d, %X, %s, CR%d, CR%d, %X\",Condition[CONDITION(i)], (int)REG_POS(i, 8), (int)((i>>21)&7), Registre[REG_POS(i, 12)], (int)REG_POS(i, 16), (int)REG_POS(i, 0), (int)((i>>5)&0x7));\n     return txt;\n}\n\n//--------------SWI--------------------------\n\nstatic char * OP_SWI(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SWI%s %X\",Condition[CONDITION(i)], (int)((i&0xFFFFFF)>>16));\n     return txt;\n}\n\n//----------------BKPT-------------------------\nstatic char * OP_BKPT(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BKPT #%X\",(int)(((i>>4)&0xFFF)|(i&0xF)));\n     return txt;\n}\n\n//----------------CDP-----------------------\n\nstatic char *  OP_CDP(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"CDP-------------------------------\");\n     return txt;\n}\n\n//------------------------------------------------------------\n//                         THUMB\n//------------------------------------------------------------\n#define REG_NUM(i, n) (((i)>>n)&0x7)\n\nstatic char * OP_UND_THUMB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"--<UNDEFINED>--\");\n     return txt;\n}\n \nstatic char * OP_LSL_0(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LSL %s, %s, #0\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_LSL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LSL %s, %s, #%X\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F));\n     return txt;\n}\n\nstatic char * OP_LSR_0(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LSR %s, %s, #0\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_LSR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LSR %s, %s, #%X\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F));\n     return txt;\n}\n\nstatic char * OP_ASR_0(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ASR %s, %s, #0\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_ASR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ASR %s, %s, #%X\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6) & 0x1F));\n     return txt;\n}\n\nstatic char * OP_ADD_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ADD %s, %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_SUB_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SUB %s, %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_ADD_IMM3(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ADD %s, %s, #%X\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)REG_NUM(i, 6));\n     return txt;\n}\n\nstatic char * OP_SUB_IMM3(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SUB %s, %s, #%X\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)REG_NUM(i, 6));\n     return txt;\n}\n\nstatic char * OP_MOV_IMM8(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MOV %s, #%X\", Registre[REG_NUM(i, 8)], (int)(i&0xFF));\n     return txt;\n}\n\nstatic char * OP_CMP_IMM8(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"CMP %s, #%X\", Registre[REG_NUM(i, 8)], (int)(i&0xFF));\n     return txt;\n}\n\nstatic char * OP_ADD_IMM8(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ADD %s, #%X\", Registre[REG_NUM(i, 8)], (int)(i&0xFF));\n     return txt;\n}\n\nstatic char * OP_SUB_IMM8(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SUB %s, #%X\", Registre[REG_NUM(i, 8)], (int)(i&0xFF));\n     return txt;\n}\n\nstatic char * OP_AND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"AND %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_EOR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"EOR %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_LSL_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LSL %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_LSR_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LSR %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_ASR_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ASR %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_ADC_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ADC %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_SBC_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SBC %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_ROR_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ROR %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_TST(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"TST %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_NEG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"NEG %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_CMP(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"CMP %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_CMN(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"CMN %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_ORR(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ORR %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_MUL_REG(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MUL %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_BIC(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BIC %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_MVN(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"MVN %s, %s\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_ADD_SPE(u32 adr, u32 i, char * txt)\n{\n     u8 Rd = (i&7) | ((i>>4)&8);\n     sprintf(txt, \"ADD %s, %s\", Registre[Rd], Registre[REG_POS(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_CMP_SPE(u32 adr, u32 i, char * txt)\n{\n     u8 Rd = (i&7) | ((i>>4)&8);\n     sprintf(txt, \"CMP %s, %s\", Registre[Rd], Registre[REG_POS(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_MOV_SPE(u32 adr, u32 i, char * txt)\n{\n     u8 Rd = (i&7) | ((i>>4)&8);\n     sprintf(txt, \"MOV %s, %s\", Registre[Rd], Registre[REG_POS(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_BX_THUMB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BX %s\", Registre[REG_POS(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_BLX_THUMB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BLX %s\", Registre[REG_POS(i, 3)]);\n     return txt;\n}\n\nstatic char * OP_LDR_PCREL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR %s, [PC, #%X]\", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_STR_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_STRH_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_STRB_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_LDRSB_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSB %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_LDR_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_LDRH_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_LDRB_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_LDRSH_REG_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRSH %s, [%s, %s]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], Registre[REG_NUM(i, 6)]);\n     return txt;\n}\n\nstatic char * OP_STR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR %s, [%s, #%X]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>4)&0x7C));\n     return txt;\n}\n\nstatic char * OP_LDR_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR %s, [%s, #%X]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>4)&0x7C));\n     return txt;\n}\n\nstatic char * OP_STRB_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRB %s, [%s, #%X]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6)&0x1F));\n     return txt;\n}\n\nstatic char * OP_LDRB_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRB %s, [%s, #%X]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>6)&0x1F));\n     return txt;\n}\n\nstatic char * OP_STRH_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STRH %s, [%s, #%X]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>5)&0x3E));\n     return txt;\n}\n\nstatic char * OP_LDRH_IMM_OFF(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDRH %s, [%s, #%X]\", Registre[REG_NUM(i, 0)], Registre[REG_NUM(i, 3)], (int)((i>>5)&0x3E));\n     return txt;\n}\n\nstatic char * OP_STR_SPREL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"STR %s, [SP, #%X]\", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_LDR_SPREL(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"LDR %s, [SP, #%X]\", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_ADD_2PC(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ADD %s, PC, #%X\", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_ADD_2SP(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ADD %s, SP, #%X\", Registre[REG_NUM(i, 8)], (int)((i&0xFF)<<2));\n     return txt;\n}\n\nstatic char * OP_ADJUST_P_SP(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"ADD SP, #%X\", (int)((i&0x7F)<<2));\n     return txt;\n}\n\nstatic char * OP_ADJUST_M_SP(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SUB SP, #%X\", (int)((i&0x7F)<<2));\n     return txt;\n}\n\nstatic char * OP_PUSH(u32 adr, u32 i, char * txt)\n{\n     RegList(8);\n     sprintf(txt, \"PUSH {%s}\", lreg);\n     return txt;\n}\n\nstatic char * OP_PUSH_LR(u32 adr, u32 i, char * txt)\n{\n     RegList(8);\n     sprintf(txt, \"PUSH {%s, LR}\", lreg);\n     return txt;\n}\n\nstatic char * OP_POP(u32 adr, u32 i, char * txt)\n{\n     RegList(8);\n     sprintf(txt, \"POP {%s}\", lreg);\n     return txt;\n}\n\nstatic char * OP_POP_PC(u32 adr, u32 i, char * txt)\n{\n     RegList(8);\n     sprintf(txt, \"POP {%s, PC}\", lreg);\n     return txt;\n}\n\nstatic char * OP_BKPT_THUMB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BKPT\");\n     return txt;\n}\n\nstatic char * OP_STMIA_THUMB(u32 adr, u32 i, char * txt)\n{\n     RegList(8);\n     sprintf(txt, \"STMIA %s!, {%s}\", Registre[REG_NUM(i, 8)], lreg);\n     return txt;\n}\n\nstatic char * OP_LDMIA_THUMB(u32 adr, u32 i, char * txt)\n{\n     RegList(8);\n     sprintf(txt, \"LDMIA %s!, {%s}\", Registre[REG_NUM(i, 8)], lreg);\n     return txt;\n}\n\nstatic char * OP_B_COND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"B%s #%08X\", Condition[(i>>8)&0xF], (int)(adr+(((s32)((signed char)(i&0xFF)))<<1)+4));\n     return txt;\n}\n\nstatic char * OP_SWI_THUMB(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"SWI #%X\", (int)(i & 0xFF));\n     return txt;\n}\n\n#define SIGNEEXT_IMM11(i)     (((i)&0x7FF) | (BIT10(i) * 0xFFFFF800))\n\nstatic char * OP_B_UNCOND(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"B #%08X\", (int)(adr+(SIGNEEXT_IMM11(i)<<1)+4));\n     return txt;\n}\n\nu32 part = 0;\n\nstatic char * OP_BLX(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BLX #%08X\", (int)(part + ((i&0x7FF)<<1))&0xFFFFFFFC);\n     return txt;\n}\n\nstatic char * OP_BL_10(u32 adr, u32 i, char * txt)\n{\n     part = adr+4 + (SIGNEEXT_IMM11(i)<<12);\n     sprintf(txt, \"calculating high part of the address\");\n     return txt;\n\n}\n\nstatic char * OP_BL_11(u32 adr, u32 i, char * txt)\n{\n     sprintf(txt, \"BL #%08X\", (int)(part + ((i&0x7FF)<<1))&0xFFFFFFFC);\n     return txt;\n} \n\n\n\n#define TABDECL(x) x\n\nconst DisasmOpFunc des_arm_instructions_set[4096] = {\n#include \"instruction_tabdef.inc\"\n};\n\nconst DisasmOpFunc des_thumb_instructions_set[1024] = {\n#include \"thumb_tabdef.inc\"\n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/Disassembler.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef DISASSEMBLER_H\n#define DISASSEMBLER_H\n\n#include \"types.h\"\n\ntypedef char* (* DisasmOpFunc)(u32 adr, u32 i, char * txt);\n\nextern const DisasmOpFunc des_arm_instructions_set[4096];\nextern const DisasmOpFunc des_thumb_instructions_set[1024];\n\n#endif\n\n \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/FIFO.cpp",
    "content": "/*\n\tCopyright 2006 yopyop\n\tCopyright 2007 shash\n\tCopyright 2007-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"FIFO.h\"\n#include <string.h>\n#include \"armcpu.h\"\n#include \"debug.h\"\n#include \"mem.h\"\n#include \"MMU.h\"\n#include \"NDSSystem.h\"\n#include \"gfx3d.h\"\n\n// ========================================================= IPC FIFO\nIPC_FIFO ipc_fifo[2];\n\nvoid IPC_FIFOinit(u8 proc)\n{\n\tmemset(&ipc_fifo[proc], 0, sizeof(IPC_FIFO));\n\tT1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, 0x00000101);\n}\n\nvoid IPC_FIFOsend(u8 proc, u32 val)\n{\n\tu16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184);\n\tif (!(cnt_l & IPCFIFOCNT_FIFOENABLE)) return;\t\t\t// FIFO disabled\n\tu8\tproc_remote = proc ^ 1;\n\n\tif (ipc_fifo[proc].size > 15)\n\t{\n\t\tcnt_l |= IPCFIFOCNT_FIFOERROR;\n\t\tT1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l);\n\t\treturn;\n\t}\n\n\tu16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc_remote][0x40], 0x184);\n\n\t//LOG(\"IPC%s send FIFO 0x%08X size %03i (l 0x%X, tail %02i) (r 0x%X, tail %02i)\\n\", \n\t//\tproc?\"7\":\"9\", val, ipc_fifo[proc].size, cnt_l, ipc_fifo[proc].tail, cnt_r, ipc_fifo[proc^1].tail);\n\t\n\tcnt_l &= 0xBFFC;\t\t// clear send empty bit & full\n\tcnt_r &= 0xBCFF;\t\t// set recv empty bit & full\n\tipc_fifo[proc].buf[ipc_fifo[proc].tail] = val;\n\tipc_fifo[proc].tail++;\n\tipc_fifo[proc].size++;\n\tif (ipc_fifo[proc].tail > 15) ipc_fifo[proc].tail = 0;\n\t\n\tif (ipc_fifo[proc].size > 15)\n\t{\n\t\tcnt_l |= IPCFIFOCNT_SENDFULL;\t\t// set send full bit\n\t\tcnt_r |= IPCFIFOCNT_RECVFULL;\t\t// set recv full bit\n\t}\n\n\tT1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l);\n\tT1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r);\n\n\tif(cnt_r&IPCFIFOCNT_RECVIRQEN)\n\t\tNDS_makeIrq(proc_remote, IRQ_BIT_IPCFIFO_RECVNONEMPTY);\n\n\tNDS_Reschedule();\n}\n\nu32 IPC_FIFOrecv(u8 proc)\n{\n\tu16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184);\n\tif (!(cnt_l & IPCFIFOCNT_FIFOENABLE)) return (0);\t\t\t\t\t\t\t\t\t// FIFO disabled\n\tu8\tproc_remote = proc ^ 1;\n\n\tu32 val = 0;\n\n\tif ( ipc_fifo[proc_remote].size == 0 )\t\t// remote FIFO error\n\t{\n\t\tcnt_l |= IPCFIFOCNT_FIFOERROR;\n\t\tT1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l);\n\t\treturn (0);\n\t}\n\n\tu16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc_remote][0x40], 0x184);\n\n\tcnt_l &= 0xBCFF;\t\t// clear send full bit & empty\n\tcnt_r &= 0xBFFC;\t\t// set recv full bit & empty\n\n\tval = ipc_fifo[proc_remote].buf[ipc_fifo[proc_remote].head];\n\tipc_fifo[proc_remote].head++;\n\tipc_fifo[proc_remote].size--;\n\tif (ipc_fifo[proc_remote].head > 15) ipc_fifo[proc_remote].head = 0;\n\t\n\t//LOG(\"IPC%s recv FIFO 0x%08X size %03i (l 0x%X, tail %02i) (r 0x%X, tail %02i)\\n\", \n\t//\tproc?\"7\":\"9\", val, ipc_fifo[proc].size, cnt_l, ipc_fifo[proc].tail, cnt_r, ipc_fifo[proc^1].tail);\n\n\tif ( ipc_fifo[proc_remote].size == 0 )\t\t// FIFO empty\n\t{\n\t\tcnt_l |= IPCFIFOCNT_RECVEMPTY;\n\t\tcnt_r |= IPCFIFOCNT_SENDEMPTY;\n\n\t\tif(cnt_r&IPCFIFOCNT_SENDIRQEN)\n\t\t\tNDS_makeIrq(proc_remote, IRQ_BIT_IPCFIFO_SENDEMPTY);\n\t}\n\n\tT1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l);\n\tT1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r);\n\n\tNDS_Reschedule();\n\n\treturn (val);\n}\n\nvoid IPC_FIFOcnt(u8 proc, u16 val)\n{\n\tu16 cnt_l = T1ReadWord(MMU.MMU_MEM[proc][0x40], 0x184);\n\tu16 cnt_r = T1ReadWord(MMU.MMU_MEM[proc^1][0x40], 0x184);\n\n\tif (val & IPCFIFOCNT_FIFOERROR)\n\t{\n\t\t//at least SPP uses this, maybe every retail game\n\t\tcnt_l &= ~IPCFIFOCNT_FIFOERROR;\n\t}\n\n\tif (val & IPCFIFOCNT_SENDCLEAR)\n\t{\n\t\tipc_fifo[proc].head = 0; ipc_fifo[proc].tail = 0; ipc_fifo[proc].size = 0;\n\n\t\tcnt_l |= IPCFIFOCNT_SENDEMPTY;\n\t\tcnt_r |= IPCFIFOCNT_RECVEMPTY;\n\t\t\n\t\tcnt_l &= ~IPCFIFOCNT_SENDFULL;\n\t\tcnt_r &= ~IPCFIFOCNT_RECVFULL;\n\n\t}\n\tcnt_l &= ~IPCFIFOCNT_WRITEABLE;\n\tcnt_l |= val & IPCFIFOCNT_WRITEABLE;\n\n\t//IPCFIFOCNT_SENDIRQEN may have been set (and/or the fifo may have been cleared) so we may need to trigger this irq\n\t//(this approach is used by libnds fifo system on occasion in fifoInternalSend, and began happening frequently for value32 with r4326)\n\tif(cnt_l&IPCFIFOCNT_SENDIRQEN) if(cnt_l & IPCFIFOCNT_SENDEMPTY)\n\t\tNDS_makeIrq(proc, IRQ_BIT_IPCFIFO_SENDEMPTY);\n\n\t//IPCFIFOCNT_RECVIRQEN may have been set so we may need to trigger this irq\n\tif(cnt_l&IPCFIFOCNT_RECVIRQEN) if(!(cnt_l & IPCFIFOCNT_RECVEMPTY))\n\t\tNDS_makeIrq(proc, IRQ_BIT_IPCFIFO_RECVNONEMPTY);\n\n\tT1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l);\n\tT1WriteWord(MMU.MMU_MEM[proc^1][0x40], 0x184, cnt_r);\n\n\tNDS_Reschedule();\n}\n\n// ========================================================= GFX FIFO\nGFX_PIPE\tgxPIPE;\nGFX_FIFO\tgxFIFO;\n\nvoid GFX_PIPEclear()\n{\n\tgxPIPE.head = 0;\n\tgxPIPE.tail = 0;\n\tgxPIPE.size = 0;\n\tgxFIFO.matrix_stack_op_size = 0;\n}\n\nvoid GFX_FIFOclear()\n{\n\tgxFIFO.head = 0;\n\tgxFIFO.tail = 0;\n\tgxFIFO.size = 0;\n\tgxFIFO.matrix_stack_op_size = 0;\n}\n\nstatic void GXF_FIFO_handleEvents()\n{\n\tbool low = gxFIFO.size <= 127;\n\tbool lowchange = MMU_new.gxstat.fifo_low ^ low;\n\tMMU_new.gxstat.fifo_low = low;\n\tif(low) triggerDma<EDMAMode_GXFifo>();\n\n\tbool empty = gxFIFO.size == 0;\n\tbool emptychange = MMU_new.gxstat.fifo_empty ^ empty;\n\tMMU_new.gxstat.fifo_empty = empty;\n\n\n\tMMU_new.gxstat.sb = gxFIFO.matrix_stack_op_size != 0;\n\n\tif(emptychange||lowchange) NDS_Reschedule();\n}\n\nstatic FORCEINLINE bool IsMatrixStackCommand(u8 cmd)\n{\n\treturn cmd == 0x11 || cmd == 0x12;\n}\n\nvoid GFX_FIFOsend(u8 cmd, u32 param)\n{\n\t//INFO(\"gxFIFO: send 0x%02X = 0x%08X (size %03i/0x%02X) gxstat 0x%08X\\n\", cmd, param, gxFIFO.size, gxFIFO.size, gxstat);\n\t//printf(\"fifo recv: %02X: %08X upto:%d\\n\",cmd,param,gxFIFO.size+1);\n\n\t//TODO - WOAH ! NOT HANDLING A TOO-BIG FIFO RIGHT NOW!\n\t//if (gxFIFO.size > 255)\n\t//{\n\t//\tGXF_FIFO_handleEvents();\n\t//\t//NEED TO HANDLE THIS!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\t//\t//gxstat |= 0x08000000;\t\t\t// busy\n\t//\tNDS_RescheduleGXFIFO(1);\n\t//\t//INFO(\"ERROR: gxFIFO is full (cmd 0x%02X = 0x%08X) (prev cmd 0x%02X = 0x%08X)\\n\", cmd, param, gxFIFO.cmd[255], gxFIFO.param[255]);\n\t//\treturn;\t\t\n\t//}\n\n\n\tgxFIFO.cmd[gxFIFO.tail] = cmd;\n\tgxFIFO.param[gxFIFO.tail] = param;\n\tgxFIFO.tail++;\n\tgxFIFO.size++;\n\tif (gxFIFO.tail > HACK_GXIFO_SIZE-1) gxFIFO.tail = 0;\n\n\t//if a matrix op is entering the pipeline, do accounting for it\n\t//(this is tested by wild west, which will jam a few ops in the fifo and then wait for the matrix stack to be \n\t//un-busy so it can read back the current matrix stack position).\n\t//it is definitely only pushes and pops which set this flag.\n\t//seems like it would be less work in the HW to make a counter than do cmps on all the command bytes, so maybe we're even doing it right.\n\tif(IsMatrixStackCommand(cmd))\n\t\tgxFIFO.matrix_stack_op_size++;\n\n\t/*if(gxFIFO.size>=HACK_GXIFO_SIZE) {\n\t\tprintf(\"--FIFO FULL-- : %d\\n\",gxFIFO.size);\n\t}*/\n\t\n\t//gxstat |= 0x08000000;\t\t// set busy flag\n\n\tGXF_FIFO_handleEvents();\n\n\tNDS_RescheduleGXFIFO(1);\n}\n\n// this function used ONLY in gxFIFO\nBOOL GFX_PIPErecv(u8 *cmd, u32 *param)\n{\n\t//gxstat &= 0xF7FFFFFF;\t\t// clear busy flag\n\n\tif (gxFIFO.size == 0)\n\t{\n\t\tGXF_FIFO_handleEvents();\n\t\treturn FALSE;\n\t}\n\n\t*cmd = gxFIFO.cmd[gxFIFO.head];\n\t*param = gxFIFO.param[gxFIFO.head];\n\n\t//see the associated increment in another function\n\tif(IsMatrixStackCommand(*cmd))\n\t{\n\t\tgxFIFO.matrix_stack_op_size--;\n\t\t/*if(gxFIFO.matrix_stack_op_size>0x10000000)\n\t\t\tprintf(\"bad news disaster in matrix_stack_op_size\\n\");*/\n\t}\n\n\tgxFIFO.head++;\n\tgxFIFO.size--;\n\tif (gxFIFO.head > HACK_GXIFO_SIZE-1) gxFIFO.head = 0;\n\n\tGXF_FIFO_handleEvents();\n\n\treturn (TRUE);\n}\n\nvoid GFX_FIFOcnt(u32 val)\n{\n\t////INFO(\"gxFIFO: write cnt 0x%08X (prev 0x%08X) FIFO size %03i PIPE size %03i\\n\", val, gxstat, gxFIFO.size, gxPIPE.size);\n\n\tif (val & (1<<29))\t\t// clear? (only in homebrew?)\n\t{\n\t\tGFX_PIPEclear();\n\t\tGFX_FIFOclear();\n\t\treturn;\n\t}\n\n\t//zeromus says: what happened to clear stack?\n\t//if (val & (1<<15))\t\t// projection stack pointer reset\n\t//{\n\t//\tgfx3d_ClearStack();\n\t//\tval &= 0xFFFF5FFF;\t\t// clear reset (bit15) & stack level (bit13)\n\t//}\n\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600, val);\n}\n\n// ========================================================= DISP FIFO\nDISP_FIFO\tdisp_fifo;\n\nvoid DISP_FIFOinit()\n{\n\tmemset(&disp_fifo, 0, sizeof(DISP_FIFO));\n}\n\nvoid DISP_FIFOsend(u32 val)\n{\n\t//INFO(\"DISP_FIFO send value 0x%08X (head 0x%06X, tail 0x%06X)\\n\", val, disp_fifo.head, disp_fifo.tail);\n\tdisp_fifo.buf[disp_fifo.tail] = val;\n\tdisp_fifo.tail++;\n\tif (disp_fifo.tail > 0x5FFF)\n\t\tdisp_fifo.tail = 0;\n}\n\nu32 DISP_FIFOrecv()\n{\n\t//if (disp_fifo.tail == disp_fifo.head) return (0); // FIFO is empty\n\tu32 val = disp_fifo.buf[disp_fifo.head];\n\tdisp_fifo.head++;\n\tif (disp_fifo.head > 0x5FFF)\n\t\tdisp_fifo.head = 0;\n\treturn (val);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/FIFO.h",
    "content": "/*\n\tCopyright 2006 yopyop\n\tCopyright 2007 shash\n\tCopyright 2007-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n\n#ifndef FIFO_H\n#define FIFO_H\n\n#include \"types.h\"\n\n//=================================================== IPC FIFO\ntypedef struct\n{\n\tu32\t\tbuf[16];\n\t\n\tu8\t\thead;\n\tu8\t\ttail;\n\tu8\t\tsize;\n} IPC_FIFO;\n\nextern IPC_FIFO ipc_fifo[2];\nextern void IPC_FIFOinit(u8 proc);\nextern void IPC_FIFOsend(u8 proc, u32 val);\nextern u32 IPC_FIFOrecv(u8 proc);\nextern void IPC_FIFOcnt(u8 proc, u16 val);\n\n//=================================================== GFX FIFO\n\n//yeah, its oversize for now. thats a simpler solution\n//moon seems to overdrive the fifo with immediate dmas\n//i think this might be nintendo code too\n#define HACK_GXIFO_SIZE 200000\n\ntypedef struct\n{\n\tu8\t\tcmd[HACK_GXIFO_SIZE];\n\tu32\t\tparam[HACK_GXIFO_SIZE];\n\n\tu32\t\thead;\t\t// start position\n\tu32\t\ttail;\t\t// tail\n\tu32\t\tsize;\t\t// size FIFO buffer\n\tu32\t\tmatrix_stack_op_size; //number of matrix stack items in the fifo (stack is busy when this is nonzero)\n} GFX_FIFO;\n\ntypedef struct\n{\n\tu8\t\tcmd[4];\n\tu32\t\tparam[4];\n\n\tu8\t\thead;\n\tu8\t\ttail;\n\tu8\t\tsize;\n} GFX_PIPE;\n\nextern GFX_PIPE gxPIPE;\nextern GFX_FIFO gxFIFO;\nextern void GFX_PIPEclear();\nextern void GFX_FIFOclear();\nextern void GFX_FIFOsend(u8 cmd, u32 param);\nextern BOOL GFX_PIPErecv(u8 *cmd, u32 *param);\nextern void GFX_FIFOcnt(u32 val);\n\n//=================================================== Display memory FIFO\ntypedef struct\n{\n\tu32\t\tbuf[0x6000];\t\t\t// 256x192 32K color\n\tu32\t\thead;\t\t\t\t\t// head\n\tu32\t\ttail;\t\t\t\t\t// tail\n} DISP_FIFO;\n\nextern DISP_FIFO disp_fifo;\nextern void DISP_FIFOinit();\nextern void DISP_FIFOsend(u32 val);\nextern u32 DISP_FIFOrecv();\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/GPU.cpp",
    "content": "/*\r\n\tCopyright (C) 2006 yopyop\r\n\tCopyright (C) 2006-2007 Theo Berkau\r\n\tCopyright (C) 2007 shash\r\n\tCopyright (C) 2008-2012 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n\r\n#include <algorithm>\r\n#include <string.h>\r\n#include <stdlib.h>\r\n#include <assert.h>\r\n#include <iostream>\r\n#include \"MMU.h\"\r\n#include \"GPU.h\"\r\n#include \"debug.h\"\r\n#include \"render3D.h\"\r\n#include \"gfx3d.h\"\r\n#include \"debug.h\"\r\n#include \"GPU_osd.h\"\r\n#include \"NDSSystem.h\"\r\n#include \"readwrite.h\"\r\n\r\n#ifdef FASTBUILD\r\n\t#undef FORCEINLINE\r\n\t#define FORCEINLINE\r\n\t//compilation speed hack (cuts time exactly in half by cutting out permutations)\r\n\t#define DISABLE_MOSAIC\r\n#endif\r\n\r\nextern BOOL click;\r\nNDS_Screen MainScreen;\r\nNDS_Screen SubScreen;\r\n\r\n//instantiate static instance\r\nGPU::MosaicLookup GPU::mosaicLookup;\r\n\r\n//#define DEBUG_TRI\r\n\r\nCACHE_ALIGN u8 GPU_screen[4*256*192];\r\nCACHE_ALIGN u8 sprWin[256];\r\n\r\n\r\nu16\t\t\tgpu_angle = 0;\r\n\r\nconst size sprSizeTab[4][4] = \r\n{\r\n     {{8, 8}, {16, 8}, {8, 16}, {8, 8}},\r\n     {{16, 16}, {32, 8}, {8, 32}, {8, 8}},\r\n     {{32, 32}, {32, 16}, {16, 32}, {8, 8}},\r\n     {{64, 64}, {64, 32}, {32, 64}, {8, 8}},\r\n};\r\n\r\n\r\n\r\nconst BGType GPU_mode2type[8][4] = \r\n{\r\n      {BGType_Text, BGType_Text, BGType_Text, BGType_Text},\r\n      {BGType_Text, BGType_Text, BGType_Text, BGType_Affine},\r\n      {BGType_Text, BGType_Text, BGType_Affine, BGType_Affine},\r\n      {BGType_Text, BGType_Text, BGType_Text, BGType_AffineExt},\r\n      {BGType_Text, BGType_Text, BGType_Affine, BGType_AffineExt},\r\n      {BGType_Text, BGType_Text, BGType_AffineExt, BGType_AffineExt},\r\n      {BGType_Invalid, BGType_Invalid, BGType_Large8bpp, BGType_Invalid},\r\n      {BGType_Invalid, BGType_Invalid, BGType_Invalid, BGType_Invalid}\r\n};\r\n\r\n//dont ever think of changing these to bits because you could avoid the multiplies in the main tile blitter.\r\n//it doesnt really help any\r\nconst short sizeTab[8][4][2] =\r\n{\r\n\t{{0, 0}, {0, 0}, {0, 0}, {0, 0}}, //Invalid\r\n    {{256,256}, {512,256}, {256,512}, {512,512}}, //text\r\n    {{128,128}, {256,256}, {512,512}, {1024,1024}}, //affine\r\n    {{512,1024}, {1024,512}, {0,0}, {0,0}}, //large 8bpp\r\n\t{{0, 0}, {0, 0}, {0, 0}, {0, 0}}, //affine ext (to be elaborated with another value)\r\n\t{{128,128}, {256,256}, {512,512}, {1024,1024}}, //affine ext 256x16\r\n\t{{128,128}, {256,256}, {512,256}, {512,512}}, //affine ext 256x1\r\n\t{{128,128}, {256,256}, {512,256}, {512,512}}, //affine ext direct\r\n};\r\n\r\nstatic GraphicsInterface_struct *GFXCore=NULL;\r\n\r\n// This should eventually be moved to the port specific code\r\nGraphicsInterface_struct *GFXCoreList[] = {\r\n&GFXDummy,\r\nNULL\r\n};\r\n\r\nstatic const CACHE_ALIGN u8 win_empty[256] = {\r\n\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r\n\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r\nstatic CACHE_ALIGN u16 fadeInColors[17][0x8000];\r\nCACHE_ALIGN u16 fadeOutColors[17][0x8000];\r\n\r\n//this should be public, because it gets used somewhere else\r\nCACHE_ALIGN u8 gpuBlendTable555[17][17][32][32];\r\n\r\n\r\n/*****************************************************************************/\r\n//\t\t\tINITIALIZATION\r\n/*****************************************************************************/\r\n\r\n\r\nstatic void GPU_InitFadeColors()\r\n{\r\n\t/*\r\n\tNOTE: gbatek (in the reference above) seems to expect 6bit values \r\n\tper component, but as desmume works with 5bit per component, \r\n\twe use 31 as top, instead of 63. Testing it on a few games, \r\n\tusing 63 seems to give severe color wraping, and 31 works\r\n\tnicely, so for now we'll just that, until proven wrong.\r\n\r\n\ti have seen pics of pokemon ranger getting white with 31, with 63 it is nice.\r\n\tit could be pb of alpha or blending or...\r\n\r\n\tMightyMax> created a test NDS to check how the brightness values work,\r\n\tand 31 seems to be correct. FactorEx is a override for max brighten/darken\r\n\tSee: http://mightymax.org/gfx_test_brightness.nds\r\n\tThe Pokemon Problem could be a problem with 8/32 bit writes not recognized yet,\r\n\ti'll add that so you can check back.\r\n\r\n\t*/\r\n\r\n\tfor(int i = 0; i <= 16; i++)\r\n\t{\r\n\t\tfor(int j = 0x8000; j < 0x10000; j++)\r\n\t\t{\r\n\t\t\tCOLOR cur;\r\n\r\n\t\t\tcur.val = j;\r\n\t\t\tcur.bits.red = (cur.bits.red + ((31 - cur.bits.red) * i / 16));\r\n\t\t\tcur.bits.green = (cur.bits.green + ((31 - cur.bits.green) * i / 16));\r\n\t\t\tcur.bits.blue = (cur.bits.blue + ((31 - cur.bits.blue) * i / 16));\r\n\t\t\tcur.bits.alpha = 0;\r\n\t\t\tfadeInColors[i][j & 0x7FFF] = cur.val;\r\n\r\n\t\t\tcur.val = j;\r\n\t\t\tcur.bits.red = (cur.bits.red - (cur.bits.red * i / 16));\r\n\t\t\tcur.bits.green = (cur.bits.green - (cur.bits.green * i / 16));\r\n\t\t\tcur.bits.blue = (cur.bits.blue - (cur.bits.blue * i / 16));\r\n\t\t\tcur.bits.alpha = 0;\r\n\t\t\tfadeOutColors[i][j & 0x7FFF] = cur.val;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfor(int c0=0;c0<=31;c0++) \r\n\t\tfor(int c1=0;c1<=31;c1++) \r\n\t\t\tfor(int eva=0;eva<=16;eva++)\r\n\t\t\t\tfor(int evb=0;evb<=16;evb++)\r\n\t\t\t\t{\r\n\t\t\t\t\tint blend = ((c0 * eva) + (c1 * evb) ) / 16;\r\n\t\t\t\t\tint final = std::min<int>(31,blend);\r\n\t\t\t\t\tgpuBlendTable555[eva][evb][c0][c1] = final;\r\n\t\t\t\t}\r\n}\r\n\r\nstatic CACHE_ALIGN GPU GPU_main, GPU_sub;\r\n\r\nGPU * GPU_Init(u8 l)\r\n{\r\n\tGPU * g;\r\n\r\n\tif(l==0) g = &GPU_main;\r\n\telse g = &GPU_sub;\r\n\r\n\tGPU_Reset(g, l);\r\n\tGPU_InitFadeColors();\r\n\r\n\tg->curr_win[0] = win_empty;\r\n\tg->curr_win[1] = win_empty;\r\n\tg->need_update_winh[0] = true;\r\n\tg->need_update_winh[1] = true;\r\n\tg->setFinalColorBck_funcNum = 0;\r\n\tg->setFinalColor3d_funcNum = 0;\r\n\tg->setFinalColorSpr_funcNum = 0;\r\n\r\n\treturn g;\r\n}\r\n\r\nvoid GPU_Reset(GPU *g, u8 l)\r\n{\r\n\tmemset(g, 0, sizeof(GPU));\r\n\r\n\t//important for emulator stability for this to initialize, since we have to setup a table based on it\r\n\tg->BLDALPHA_EVA = 0;\r\n\tg->BLDALPHA_EVB = 0;\r\n\t//make sure we have our blend table setup even if the game blends without setting the blend variables\r\n\tg->updateBLDALPHA();\r\n\r\n\tg->setFinalColorBck_funcNum = 0;\r\n\tg->setFinalColor3d_funcNum = 0;\r\n\tg->setFinalColorSpr_funcNum = 0;\r\n\tg->core = l;\r\n\tg->BGSize[0][0] = g->BGSize[1][0] = g->BGSize[2][0] = g->BGSize[3][0] = 256;\r\n\tg->BGSize[0][1] = g->BGSize[1][1] = g->BGSize[2][1] = g->BGSize[3][1] = 256;\r\n\r\n\tg->spriteRenderMode = GPU::SPRITE_1D;\r\n\r\n\tg->bgPrio[4] = 0xFF;\r\n\r\n\tg->bg0HasHighestPrio = TRUE;\r\n\r\n\tif(g->core == GPU_SUB)\r\n\t{\r\n\t\tg->oam = (OAM *)(MMU.ARM9_OAM + ADDRESS_STEP_1KB);\r\n\t\tg->sprMem = MMU_BOBJ;\r\n\t\t// GPU core B\r\n\t\tg->dispx_st = (REG_DISPx*)(&MMU.ARM9_REG[REG_DISPB]);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tg->oam = (OAM *)(MMU.ARM9_OAM);\r\n\t\tg->sprMem = MMU_AOBJ;\r\n\t\t// GPU core A\r\n\t\tg->dispx_st = (REG_DISPx*)(&MMU.ARM9_REG[0]);\r\n\t}\r\n}\r\n\r\nvoid GPU_DeInit(GPU * gpu)\r\n{\r\n\tif(gpu==&GPU_main || gpu==&GPU_sub) return;\r\n\tfree(gpu);\r\n}\r\n\r\nstatic void GPU_resortBGs(GPU *gpu)\r\n{\r\n\tint i, prio;\r\n\tstruct _DISPCNT * cnt = &gpu->dispx_st->dispx_DISPCNT.bits;\r\n\titemsForPriority_t * item;\r\n\r\n\t// we don't need to check for windows here...\r\n// if we tick boxes, invisible layers become invisible & vice versa\r\n#define OP ^ !\r\n// if we untick boxes, layers become invisible\r\n//#define OP &&\r\n\tgpu->LayersEnable[0] = CommonSettings.dispLayers[gpu->core][0] OP(cnt->BG0_Enable/* && !(cnt->BG0_3D && (gpu->core==0))*/);\r\n\tgpu->LayersEnable[1] = CommonSettings.dispLayers[gpu->core][1] OP(cnt->BG1_Enable);\r\n\tgpu->LayersEnable[2] = CommonSettings.dispLayers[gpu->core][2] OP(cnt->BG2_Enable);\r\n\tgpu->LayersEnable[3] = CommonSettings.dispLayers[gpu->core][3] OP(cnt->BG3_Enable);\r\n\tgpu->LayersEnable[4] = CommonSettings.dispLayers[gpu->core][4] OP(cnt->OBJ_Enable);\r\n\r\n\t// KISS ! lower priority first, if same then lower num\r\n\tfor (i=0;i<NB_PRIORITIES;i++) {\r\n\t\titem = &(gpu->itemsForPriority[i]);\r\n\t\titem->nbBGs=0;\r\n\t\titem->nbPixelsX=0;\r\n\t}\r\n\tfor (i=NB_BG; i>0; ) {\r\n\t\ti--;\r\n\t\tif (!gpu->LayersEnable[i]) continue;\r\n\t\tprio = (gpu->dispx_st)->dispx_BGxCNT[i].bits.Priority;\r\n\t\titem = &(gpu->itemsForPriority[prio]);\r\n\t\titem->BGs[item->nbBGs]=i;\r\n\t\titem->nbBGs++;\r\n\t}\r\n\r\n\tint bg0Prio = gpu->dispx_st->dispx_BGxCNT[0].bits.Priority;\r\n\tgpu->bg0HasHighestPrio = TRUE;\r\n\tfor(i = 1; i < 4; i++)\r\n\t{\r\n\t\tif(gpu->LayersEnable[i])\r\n\t\t{\r\n\t\t\tif(gpu->dispx_st->dispx_BGxCNT[i].bits.Priority < bg0Prio)\r\n\t\t\t{\r\n\t\t\t\tgpu->bg0HasHighestPrio = FALSE;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n#if 0\r\n//debug\r\n\tfor (i=0;i<NB_PRIORITIES;i++) {\r\n\t\titem = &(gpu->itemsForPriority[i]);\r\n\t\tprintf(\"%d : \", i);\r\n\t\tfor (j=0; j<NB_PRIORITIES; j++) {\r\n\t\t\tif (j<item->nbBGs) \r\n\t\t\t\tprintf(\"BG%d \", item->BGs[j]);\r\n\t\t\telse\r\n\t\t\t\tprintf(\"... \", item->BGs[j]);\r\n\t\t}\r\n\t}\r\n\tprintf(\"\\n\");\r\n#endif\r\n}\r\n\r\nstatic FORCEINLINE u16 _blend(u16 colA, u16 colB, GPU::TBlendTable* blendTable)\r\n{\r\n\tu8 r = (*blendTable)[colA&0x1F][colB&0x1F];\r\n\tu8 g = (*blendTable)[(colA>>5)&0x1F][(colB>>5)&0x1F];\r\n\tu8 b = (*blendTable)[(colA>>10)&0x1F][(colB>>10)&0x1F];\r\n\r\n\treturn r|(g<<5)|(b<<10);\r\n}\r\n\r\nFORCEINLINE u16 GPU::blend(u16 colA, u16 colB)\r\n{\r\n\treturn _blend(colA, colB, blendTable);\r\n}\r\n\r\n\r\nvoid GPU_setMasterBrightness (GPU *gpu, u16 val)\r\n{\r\n\t/*if(!nds.isInVblank()) {\r\n\t\tPROGINFO(\"Changing master brightness outside of vblank\\n\");\r\n\t}*/\r\n \tgpu->MasterBrightFactor = (val & 0x1F);\r\n\tgpu->MasterBrightMode\t= (val>>14);\r\n\t//printf(\"MASTER BRIGHTNESS %d to %d at %d\\n\",gpu->core,gpu->MasterBrightFactor,nds.VCount);\r\n\r\n}\r\n\r\nvoid SetupFinalPixelBlitter (GPU *gpu)\r\n{\r\n\tu8 windowUsed = (gpu->WIN0_ENABLED | gpu->WIN1_ENABLED | gpu->WINOBJ_ENABLED);\r\n\tu8 blendMode  = (gpu->BLDCNT >> 6)&3;\r\n\r\n\tgpu->setFinalColorSpr_funcNum = windowUsed*4 + blendMode;\r\n\tgpu->setFinalColorBck_funcNum = windowUsed*4 + blendMode;\r\n\tgpu->setFinalColor3d_funcNum = windowUsed*4 + blendMode;\r\n\t\r\n}\r\n    \r\n//Sets up LCD control variables for Display Engines A and B for quick reading\r\nvoid GPU_setVideoProp(GPU * gpu, u32 p)\r\n{\r\n\tstruct _DISPCNT * cnt;\r\n\tcnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;\r\n\r\n\tT1WriteLong((u8 *)&(gpu->dispx_st)->dispx_DISPCNT.val, 0, p);\r\n\r\n\tgpu->WIN0_ENABLED\t= cnt->Win0_Enable;\r\n\tgpu->WIN1_ENABLED\t= cnt->Win1_Enable;\r\n\tgpu->WINOBJ_ENABLED = cnt->WinOBJ_Enable;\r\n\r\n\tSetupFinalPixelBlitter (gpu);\r\n\r\n    gpu->dispMode = cnt->DisplayMode & ((gpu->core)?1:3);\r\n\r\n\tgpu->vramBlock = cnt->VRAM_Block;\r\n\r\n\tswitch (gpu->dispMode)\r\n\t{\r\n\t\tcase 0: // Display Off\r\n\t\t\tbreak;\r\n\t\tcase 1: // Display BG and OBJ layers\r\n\t\t\tbreak;\r\n\t\tcase 2: // Display framebuffer\r\n\t\t\tgpu->VRAMaddr = (u8 *)MMU.ARM9_LCD + (gpu->vramBlock * 0x20000);\r\n\t\t\tbreak;\r\n\t\tcase 3: // Display from Main RAM\r\n\t\t\t// nothing to be done here\r\n\t\t\t// see GPU_RenderLine who gets data from FIFO.\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tif(cnt->OBJ_Tile_mapping)\r\n\t{\r\n\t\t//1-d sprite mapping boundaries:\r\n\t\t//32k, 64k, 128k, 256k\r\n\t\tgpu->sprBoundary = 5 + cnt->OBJ_Tile_1D_Bound ;\r\n\t\t\r\n\t\t//do not be deceived: even though a sprBoundary==8 (256KB region) is impossible to fully address\r\n\t\t//in GPU_SUB, it is still fully legal to address it with that granularity.\r\n\t\t//so don't do this: //if((gpu->core == GPU_SUB) && (cnt->OBJ_Tile_1D_Bound == 3)) gpu->sprBoundary = 7;\r\n\r\n\t\tgpu->spriteRenderMode = GPU::SPRITE_1D;\r\n\t} else {\r\n\t\t//2d sprite mapping\r\n\t\t//boundary : 32k\r\n\t\tgpu->sprBoundary = 5;\r\n\t\tgpu->spriteRenderMode = GPU::SPRITE_2D;\r\n\t}\r\n     \r\n\tif(cnt->OBJ_BMP_1D_Bound && (gpu->core == GPU_MAIN))\r\n\t\tgpu->sprBMPBoundary = 8;\r\n\telse\r\n\t\tgpu->sprBMPBoundary = 7;\r\n\r\n\tgpu->sprEnable = cnt->OBJ_Enable;\r\n\t\r\n\tGPU_setBGProp(gpu, 3, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 14));\r\n\tGPU_setBGProp(gpu, 2, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 12));\r\n\tGPU_setBGProp(gpu, 1, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 10));\r\n\tGPU_setBGProp(gpu, 0, T1ReadWord(MMU.ARM9_REG, gpu->core * ADDRESS_STEP_4KB + 8));\r\n\t\r\n\t//GPU_resortBGs(gpu);\r\n}\r\n\r\n//this handles writing in BGxCNT\r\nvoid GPU_setBGProp(GPU * gpu, u16 num, u16 p)\r\n{\r\n\tstruct _BGxCNT * cnt = &((gpu->dispx_st)->dispx_BGxCNT[num].bits);\r\n\tstruct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;\r\n\t\r\n\tT1WriteWord((u8 *)&(gpu->dispx_st)->dispx_BGxCNT[num].val, 0, p);\r\n\t\r\n\tGPU_resortBGs(gpu);\r\n\r\n\tif(gpu->core == GPU_SUB)\r\n\t{\r\n\t\tgpu->BG_tile_ram[num] = MMU_BBG;\r\n\t\tgpu->BG_bmp_ram[num]  = MMU_BBG;\r\n\t\tgpu->BG_bmp_large_ram[num]  = MMU_BBG;\r\n\t\tgpu->BG_map_ram[num]  = MMU_BBG;\r\n\t} \r\n\telse \r\n\t{\r\n\t\tgpu->BG_tile_ram[num] = MMU_ABG +  dispCnt->CharacBase_Block * ADDRESS_STEP_64KB ;\r\n\t\tgpu->BG_bmp_ram[num]  = MMU_ABG;\r\n\t\tgpu->BG_bmp_large_ram[num] = MMU_ABG;\r\n\t\tgpu->BG_map_ram[num]  = MMU_ABG +  dispCnt->ScreenBase_Block * ADDRESS_STEP_64KB;\r\n\t}\r\n\r\n\tgpu->BG_tile_ram[num] += (cnt->CharacBase_Block * ADDRESS_STEP_16KB);\r\n\tgpu->BG_bmp_ram[num]  += (cnt->ScreenBase_Block * ADDRESS_STEP_16KB);\r\n\tgpu->BG_map_ram[num]  += (cnt->ScreenBase_Block * ADDRESS_STEP_2KB);\r\n\r\n\tswitch(num)\r\n\t{\r\n\t\tcase 0:\r\n\t\tcase 1:\r\n\t\t\tgpu->BGExtPalSlot[num] = cnt->PaletteSet_Wrap * 2 + num ;\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tdefault:\r\n\t\t\tgpu->BGExtPalSlot[num] = (u8)num;\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tBGType mode = GPU_mode2type[dispCnt->BG_Mode][num];\r\n\r\n\t//clarify affine ext modes \r\n\tif(mode == BGType_AffineExt)\r\n\t{\r\n\t\t//see: http://nocash.emubase.de/gbatek.htm#dsvideobgmodescontrol\r\n\t\tu8 affineModeSelection = (cnt->Palette_256 << 1) | (cnt->CharacBase_Block & 1) ;\r\n\t\tswitch(affineModeSelection)\r\n\t\t{\r\n\t\tcase 0:\r\n\t\tcase 1:\r\n\t\t\tmode = BGType_AffineExt_256x16;\r\n\t\t\tbreak;\r\n\t\tcase 2:\r\n\t\t\tmode = BGType_AffineExt_256x1;\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tmode = BGType_AffineExt_Direct;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tgpu->BGTypes[num] = mode;\r\n\r\n\tgpu->BGSize[num][0] = sizeTab[mode][cnt->ScreenSize][0];\r\n\tgpu->BGSize[num][1] = sizeTab[mode][cnt->ScreenSize][1];\r\n\t\r\n\tgpu->bgPrio[num] = (p & 0x3);\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tENABLING / DISABLING LAYERS\r\n/*****************************************************************************/\r\n\r\nvoid GPU_remove(GPU * gpu, u8 num)\r\n{\r\n\tCommonSettings.dispLayers[gpu->core][num] = false;\r\n\tGPU_resortBGs(gpu);\r\n}\r\nvoid GPU_addBack(GPU * gpu, u8 num)\r\n{\r\n\tCommonSettings.dispLayers[gpu->core][num] = true;\r\n\tGPU_resortBGs(gpu);\r\n}\r\n\r\n\r\n/*****************************************************************************/\r\n//\t\tROUTINES FOR INSIDE / OUTSIDE WINDOW CHECKS\r\n/*****************************************************************************/\r\n\r\ntemplate<int WIN_NUM>\r\nFORCEINLINE u8 GPU::withinRect(u16 x) const\r\n{\r\n\t//assert(x<256); //only way to be >256 is in debug views, and mosaic shouldnt be enabled for those\r\n\treturn curr_win[WIN_NUM][x];\r\n}\r\n\r\n\r\n\r\n//  Now assumes that *draw and *effect are different from 0 when called, so we can avoid\r\n// setting some values twice\r\nFORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) const\r\n{\r\n\t// Check if win0 if enabled, and only check if it is\r\n\t// howevever, this has already been taken care of by the window precalculation\r\n\t//if (WIN0_ENABLED)\r\n\t{\r\n\t\t// it is in win0, do we display ?\r\n\t\t// high priority\t\r\n\t\tif (withinRect<0>(x))\r\n\t\t{\r\n\t\t\t//INFO(\"bg%i passed win0 : (%i %i) was within (%i %i)(%i %i)\\n\", bgnum, x, gpu->currLine, gpu->WIN0H0, gpu->WIN0V0, gpu->WIN0H1, gpu->WIN0V1);\r\n\t\t\tdraw = (WININ0 >> currBgNum)&1;\r\n\t\t\teffect = (WININ0_SPECIAL);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\t// Check if win1 if enabled, and only check if it is\r\n\t//if (WIN1_ENABLED)\r\n\t// howevever, this has already been taken care of by the window precalculation\r\n\t{\r\n\t\t// it is in win1, do we display ?\r\n\t\t// mid priority\r\n\t\tif(withinRect<1>(x))\r\n\t\t{\r\n\t\t\t//INFO(\"bg%i passed win1 : (%i %i) was within (%i %i)(%i %i)\\n\", bgnum, x, gpu->currLine, gpu->WIN1H0, gpu->WIN1V0, gpu->WIN1H1, gpu->WIN1V1);\r\n\t\t\tdraw\t= (WININ1 >> currBgNum)&1;\r\n\t\t\teffect = (WININ1_SPECIAL);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\t//if(true) //sprwin test hack\r\n\tif (WINOBJ_ENABLED)\r\n\t{\r\n\t\t// it is in winOBJ, do we display ?\r\n\t\t// low priority\r\n\t\tif (sprWin[x])\r\n\t\t{\r\n\t\t\tdraw\t= (WINOBJ >> currBgNum)&1;\r\n\t\t\teffect\t= (WINOBJ_SPECIAL);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tif (WINOBJ_ENABLED | WIN1_ENABLED | WIN0_ENABLED)\r\n\t{\r\n\t\tdraw\t= (WINOUT >> currBgNum) & 1;\r\n\t\teffect\t= (WINOUT_SPECIAL);\r\n\t}\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tPIXEL RENDERING\r\n/*****************************************************************************/\r\n\r\ntemplate<BlendFunc FUNC, bool WINDOW>\r\nFORCEINLINE FASTCALL void GPU::_master_setFinal3dColor(int dstX, int srcX)\r\n{\r\n\tint x = dstX;\r\n\tint passing = dstX<<1;\r\n\tu8* color = &_3dColorLine[srcX<<2];\r\n\tu8 red = color[0];\r\n\tu8 green = color[1];\r\n\tu8 blue = color[2];\r\n\tu8 alpha = color[3];\r\n\tu8* dst = currDst;\r\n\tu16 final;\r\n\r\n\tbool windowEffect = blend1; //bomberman land touch dialogbox will fail without setting to blend1\r\n\t\r\n\t//TODO - should we do an alpha==0 -> bail out entirely check here?\r\n\r\n\tif(WINDOW)\r\n\t{\r\n\t\tbool windowDraw = false;\r\n\t\trenderline_checkWindows(dstX, windowDraw, windowEffect);\r\n\r\n\t\t//we never have anything more to do if the window rejected us\r\n\t\tif(!windowDraw) return;\r\n\t}\r\n\r\n\tint bg_under = bgPixels[dstX];\r\n\tif(blend2[bg_under])\r\n\t{\r\n\t\talpha++;\r\n\t\tif(alpha<32)\r\n\t\t{\r\n\t\t\t//if the layer underneath is a blend bottom layer, then 3d always alpha blends with it\r\n\t\t\tCOLOR c2, cfinal;\r\n\r\n\t\t\tc2.val = HostReadWord(dst, passing);\r\n\r\n\t\t\tcfinal.bits.red = ((red * alpha) + ((c2.bits.red<<1) * (32 - alpha)))>>6;\r\n\t\t\tcfinal.bits.green = ((green * alpha) + ((c2.bits.green<<1) * (32 - alpha)))>>6;\r\n\t\t\tcfinal.bits.blue = ((blue * alpha) + ((c2.bits.blue<<1) * (32 - alpha)))>>6;\r\n\r\n\t\t\tfinal = cfinal.val;\r\n\t\t}\r\n\t\telse final = R6G6B6TORGB15(red,green,blue);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfinal = R6G6B6TORGB15(red,green,blue);\r\n\t\t//perform the special effect\r\n\t\tif(windowEffect)\r\n\t\t\tswitch(FUNC) {\r\n\t\t\t\tcase Increase: final = currentFadeInColors[final&0x7FFF]; break;\r\n\t\t\t\tcase Decrease: final = currentFadeOutColors[final&0x7FFF]; break;\r\n\t\t\t\tcase None: \r\n\t\t\t\tcase Blend:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t}\r\n\r\n\tHostWriteWord(dst, passing, (final | 0x8000));\r\n\tbgPixels[x] = 0;\r\n}\r\n\r\n\r\ntemplate<bool BACKDROP, BlendFunc FUNC, bool WINDOW>\r\nFORCEINLINE FASTCALL bool GPU::_master_setFinalBGColor(u16 &color, const u32 x)\r\n{\r\n\t//no further analysis for no special effects. on backdrops. just draw it.\r\n\tif(FUNC==None && BACKDROP) return true;\r\n\r\n\t//blend backdrop with what?? this doesn't make sense\r\n\tif(FUNC==Blend && BACKDROP) return true;\r\n\r\n\tbool windowEffect = true;\r\n\r\n\tif(WINDOW)\r\n\t{\r\n\t\tbool windowDraw = false;\r\n\t\trenderline_checkWindows(x, windowDraw, windowEffect);\r\n\r\n\t\t//backdrop must always be drawn\r\n\t\tif(BACKDROP) windowDraw = true;\r\n\r\n\t\t//we never have anything more to do if the window rejected us\r\n\t\tif(!windowDraw) return false;\r\n\t}\r\n\r\n\t//special effects rejected. just draw it.\r\n\tif(!(blend1 && windowEffect))\r\n\t\treturn true;\r\n\r\n\tconst u8 bg_under = bgPixels[x];\r\n\r\n\t//perform the special effect\r\n\tswitch(FUNC) {\r\n\t\tcase Blend: if(blend2[bg_under]) color = blend(color,HostReadWord(currDst, x<<1)); break;\r\n\t\tcase Increase: color = currentFadeInColors[color]; break;\r\n\t\tcase Decrease: color = currentFadeOutColors[color]; break;\r\n\t\tcase None: break;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\ntemplate<BlendFunc FUNC, bool WINDOW>\r\nstatic FORCEINLINE void _master_setFinalOBJColor(GPU *gpu, u8 *dst, u16 color, u8 alpha, u8 type, u16 x)\r\n{\r\n\tbool windowDraw = true, windowEffect = true;\r\n\r\n\tif(WINDOW)\r\n\t{\r\n\t\tgpu->renderline_checkWindows(x, windowDraw, windowEffect);\r\n\t\tif(!windowDraw)\r\n\t\t\treturn;\r\n\t}\r\n\r\n\tconst bool sourceEffectSelected = gpu->blend1;\r\n\r\n\t//note that the fadein and fadeout is done here before blending, \r\n\t//so that a fade and blending can be applied at the same time (actually, I don't think that is legal..)\r\n\tbool forceBlendingForNormal = false;\r\n\tif(windowEffect && sourceEffectSelected)\r\n\t\tswitch(FUNC) \r\n\t\t{\r\n\t\t\t//zero 13-jun-2010 : if(allowBlend) was removed from these;\r\n\t\t\t//it should be possible to increase/decrease and also blend\r\n\t\t\t//(the effect would be increase, but the obj properties permit blending and the target layers are configured correctly)\r\n\t\tcase Increase: color = gpu->currentFadeInColors[color&0x7FFF]; break;\r\n\t\tcase Decrease: color = gpu->currentFadeOutColors[color&0x7FFF]; break;\r\n\r\n\t\t//only when blend color effect is selected, ordinarily opaque sprites are blended with the color effect params\r\n\t\tcase Blend: forceBlendingForNormal = true; break;\r\n\t\tcase None: break;\r\n\t\t}\r\n\r\n\t//this inspects the layer beneath the sprite to see if the current blend flags make it a candidate for blending\r\n\tconst int bg_under = gpu->bgPixels[x];\r\n\tconst bool allowBlend = (bg_under != 4) && gpu->blend2[bg_under];\r\n\r\n\tif(allowBlend)\r\n\t{\r\n\t\tu16 backColor = HostReadWord(dst,x<<1);\r\n\t\t//this hasn't been tested: this blending occurs without regard to the color effect,\r\n\t\t//but rather purely from the sprite's alpha\r\n\t\tif(type == GPU_OBJ_MODE_Bitmap)\r\n\t\t\tcolor = _blend(color,backColor,&gpuBlendTable555[alpha+1][15-alpha]);\r\n\t\telse if(type == GPU_OBJ_MODE_Transparent || forceBlendingForNormal)\r\n\t\t\tcolor = gpu->blend(color,backColor);\r\n\t}\r\n\r\n\tHostWriteWord(dst, x<<1, (color | 0x8000));\r\n\tgpu->bgPixels[x] = 4;\t\r\n}\r\n\r\n//FUNCNUM is only set for backdrop, for an optimization of looking it up early\r\ntemplate<bool BACKDROP, int FUNCNUM> \r\nFORCEINLINE void GPU::setFinalColorBG(u16 color, const u32 x)\r\n{\r\n\t//It is not safe to assert this here.\r\n\t//This is probably the best place to enforce it, since almost every single color that comes in here\r\n\t//will be pulled from a palette that needs the top bit stripped off anyway.\r\n\t//assert((color&0x8000)==0);\r\n\tif(!BACKDROP) color &= 0x7FFF; //but for the backdrop we can easily guarantee earlier that theres no bit here\r\n\r\n\tbool draw;\r\n\r\n\tconst int test = BACKDROP?FUNCNUM:setFinalColorBck_funcNum;\r\n\tswitch(test)\r\n\t{\r\n\t\tcase 0: draw = _master_setFinalBGColor<BACKDROP,None,false>(color,x); break;\r\n\t\tcase 1: draw = _master_setFinalBGColor<BACKDROP,Blend,false>(color,x); break;\r\n\t\tcase 2: draw = _master_setFinalBGColor<BACKDROP,Increase,false>(color,x); break;\r\n\t\tcase 3: draw = _master_setFinalBGColor<BACKDROP,Decrease,false>(color,x); break;\r\n\t\tcase 4: draw = _master_setFinalBGColor<BACKDROP,None,true>(color,x); break;\r\n\t\tcase 5: draw = _master_setFinalBGColor<BACKDROP,Blend,true>(color,x); break;\r\n\t\tcase 6: draw = _master_setFinalBGColor<BACKDROP,Increase,true>(color,x); break;\r\n\t\tcase 7: draw = _master_setFinalBGColor<BACKDROP,Decrease,true>(color,x); break;\r\n\t\tdefault: draw = false; break;\r\n\t};\r\n\r\n\tif(BACKDROP || draw) //backdrop must always be drawn\r\n\t{\r\n\t\tHostWriteWord(currDst, x<<1, color | 0x8000);\r\n\t\tif(!BACKDROP) bgPixels[x] = currBgNum; //lets do this in the backdrop drawing loop, should be faster\r\n\t}\r\n}\r\n\r\n\r\nFORCEINLINE void GPU::setFinalColor3d(int dstX, int srcX)\r\n{\r\n\tswitch(setFinalColor3d_funcNum)\r\n\t{\r\n\tcase 0x0: _master_setFinal3dColor<None,false>(dstX,srcX); break;\r\n\tcase 0x1: _master_setFinal3dColor<Blend,false>(dstX,srcX); break;\r\n\tcase 0x2: _master_setFinal3dColor<Increase,false>(dstX,srcX); break;\r\n\tcase 0x3: _master_setFinal3dColor<Decrease,false>(dstX,srcX); break;\r\n\tcase 0x4: _master_setFinal3dColor<None,true>(dstX,srcX); break;\r\n\tcase 0x5: _master_setFinal3dColor<Blend,true>(dstX,srcX); break;\r\n\tcase 0x6: _master_setFinal3dColor<Increase,true>(dstX,srcX); break;\r\n\tcase 0x7: _master_setFinal3dColor<Decrease,true>(dstX,srcX); break;\r\n\t};\r\n}\r\n\r\nFORCEINLINE void setFinalColorSpr(GPU* gpu, u8 *dst, u16 color, u8 alpha, u8 type, u16 x)\r\n{\r\n\tswitch(gpu->setFinalColorSpr_funcNum)\r\n\t{\r\n\tcase 0x0: _master_setFinalOBJColor<None,false>(gpu, dst, color, alpha, type, x); break;\r\n\tcase 0x1: _master_setFinalOBJColor<Blend,false>(gpu, dst, color, alpha, type, x); break;\r\n\tcase 0x2: _master_setFinalOBJColor<Increase,false>(gpu, dst, color, alpha, type, x); break;\r\n\tcase 0x3: _master_setFinalOBJColor<Decrease,false>(gpu, dst, color, alpha, type, x); break;\r\n\tcase 0x4: _master_setFinalOBJColor<None,true>(gpu, dst, color, alpha, type, x); break;\r\n\tcase 0x5: _master_setFinalOBJColor<Blend,true>(gpu, dst, color, alpha, type, x); break;\r\n\tcase 0x6: _master_setFinalOBJColor<Increase,true>(gpu, dst, color, alpha, type, x); break;\r\n\tcase 0x7: _master_setFinalOBJColor<Decrease,true>(gpu, dst, color, alpha, type, x); break;\r\n\t};\r\n}\r\n\r\ntemplate<bool MOSAIC, bool BACKDROP>\r\nFORCEINLINE void GPU::__setFinalColorBck(u16 color, const u32 x, const int opaque)\r\n{\r\n\treturn ___setFinalColorBck<MOSAIC, BACKDROP, 0>(color,x,opaque);\r\n}\r\n\r\n//this was forced inline because most of the time it just falls through to setFinalColorBck() and the function call\r\n//overhead was ridiculous and terrible\r\ntemplate<bool MOSAIC, bool BACKDROP, int FUNCNUM>\r\nFORCEINLINE void GPU::___setFinalColorBck(u16 color, const u32 x, const int opaque)\r\n{\r\n\t//under ordinary circumstances, nobody should pass in something >=256\r\n\t//but in fact, someone is going to try. specifically, that is the map viewer debug tools\r\n\t//which try to render the enter BG. in cases where that is large, it could be up to 1024 wide.\r\n\t//assert(debug || x<256);\r\n\r\n\tint x_int;\r\n\r\n\t//due to this early out, we will get incorrect behavior in cases where \r\n\t//we enable mosaic in the middle of a frame. this is deemed unlikely.\r\n\tif(!MOSAIC) {\r\n\t\tif(opaque) goto finish;\r\n\t\telse return;\r\n\t}\r\n\r\n\tif(!opaque) color = 0xFFFF;\r\n\telse color &= 0x7FFF;\r\n\r\n\t//due to the early out, enabled must always be true\r\n\t//x_int = enabled ? GPU::mosaicLookup.width[x].trunc : x;\r\n\tx_int = GPU::mosaicLookup.width[x].trunc;\r\n\r\n\tif(GPU::mosaicLookup.width[x].begin && GPU::mosaicLookup.height[currLine].begin) {}\r\n\telse color = mosaicColors.bg[currBgNum][x_int];\r\n\tmosaicColors.bg[currBgNum][x] = color;\r\n\r\n\tif(color != 0xFFFF)\r\n\t{\r\nfinish:\r\n\t\tsetFinalColorBG<BACKDROP,FUNCNUM>(color,x);\r\n\t}\r\n}\r\n\r\n//this is fantastically inaccurate.\r\n//we do the early return even though it reduces the resulting accuracy\r\n//because we need the speed, and because it is inaccurate anyway\r\nstatic void mosaicSpriteLinePixel(GPU * gpu, int x, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab)\r\n{\r\n\tint x_int;\r\n\tint y = l;\r\n\r\n\t_OAM_ * spriteInfo = (_OAM_ *)(gpu->oam + gpu->sprNum[x]);\r\n\tbool enabled = spriteInfo->Mosaic;\r\n\tif(!enabled)\r\n\t\treturn;\r\n\r\n\tbool opaque = prioTab[x] <= 4;\r\n\r\n\tGPU::MosaicColor::Obj objColor;\r\n\tobjColor.color = T1ReadWord(dst,x<<1);\r\n\tobjColor.alpha = dst_alpha[x];\r\n\tobjColor.opaque = opaque;\r\n\r\n\tx_int = enabled ? GPU::mosaicLookup.width[x].trunc : x;\r\n\r\n\tif(enabled)\r\n\t{\r\n\t\tif(GPU::mosaicLookup.width[x].begin && GPU::mosaicLookup.height[y].begin) {}\r\n\t\telse objColor = gpu->mosaicColors.obj[x_int];\r\n\t}\r\n\tgpu->mosaicColors.obj[x] = objColor;\r\n\r\n\tT1WriteWord(dst,x<<1,objColor.color);\r\n\tdst_alpha[x] = objColor.alpha;\r\n\tif(!objColor.opaque) prioTab[x] = 0xFF;\r\n}\r\n\r\nFORCEINLINE static void mosaicSpriteLine(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab)\r\n{\r\n\t//don't even try this unless the mosaic is effective\r\n\tif(gpu->mosaicLookup.widthValue != 0 || gpu->mosaicLookup.heightValue != 0)\r\n\t\tfor(int i=0;i<256;i++)\r\n\t\t\tmosaicSpriteLinePixel(gpu,i,l,dst,dst_alpha,typeTab,prioTab);\r\n}\r\n\r\ntemplate<bool MOSAIC> void lineLarge8bpp(GPU * gpu)\r\n{\r\n\tif(gpu->core == 1) {\r\n\t\tPROGINFO(\"Cannot use large 8bpp screen on sub core\\n\");\r\n\t\treturn;\r\n\t}\r\n\r\n\tu8 num = gpu->currBgNum;\r\n\tu16 XBG = gpu->getHOFS(gpu->currBgNum);\r\n\tu16 YBG = gpu->currLine + gpu->getVOFS(gpu->currBgNum);\r\n\tu16 lg     = gpu->BGSize[num][0];\r\n\tu16 ht     = gpu->BGSize[num][1];\r\n\tu16 wmask  = (lg-1);\r\n\tu16 hmask  = (ht-1);\r\n\tYBG &= hmask;\r\n\r\n\t//TODO - handle wrapping / out of bounds correctly from rot_scale_op?\r\n\r\n\tu32 tmp_map = gpu->BG_bmp_large_ram[num] + lg * YBG;\r\n\tu8* map = (u8 *)MMU_gpu_map(tmp_map);\r\n\r\n\tu8* pal = MMU.ARM9_VMEM + gpu->core * ADDRESS_STEP_1KB;\r\n\r\n\tfor(int x = 0; x < lg; ++x, ++XBG)\r\n\t{\r\n\t\tXBG &= wmask;\r\n\t\tu8 pixel = map[XBG];\r\n\t\tu16 color = T1ReadWord(pal, pixel<<1);\r\n\t\tgpu->__setFinalColorBck<MOSAIC,false>(color,x,color);\r\n\t}\r\n\t\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tBACKGROUND RENDERING -TEXT-\r\n/*****************************************************************************/\r\n// render a text background to the combined pixelbuffer\r\ntemplate<bool MOSAIC> INLINE void renderline_textBG(GPU * gpu, u16 XBG, u16 YBG, u16 LG)\r\n{\r\n\tu8 num = gpu->currBgNum;\r\n\tstruct _BGxCNT *bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[num].bits;\r\n\tstruct _DISPCNT *dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;\r\n\tu16 lg     = gpu->BGSize[num][0];\r\n\tu16 ht     = gpu->BGSize[num][1];\r\n\tu16 wmask  = (lg-1);\r\n\tu16 hmask  = (ht-1);\r\n\tu16 tmp    = ((YBG & hmask) >> 3);\r\n\tu32 map;\r\n\tu8 *pal, *line;\r\n\tu32 tile;\r\n\tu16 color;\r\n\tu16 xoff;\r\n\tu16 yoff;\r\n\tu32 x      = 0;\r\n\tu32 xfin;\r\n\r\n\ts8 line_dir = 1;\r\n\tu32 mapinfo;\r\n\tTILEENTRY tileentry;\r\n\r\n\tu32 tmp_map = gpu->BG_map_ram[num] + (tmp&31) * 64;\r\n\tif(tmp>31) \r\n\t\ttmp_map+= ADDRESS_STEP_512B << bgCnt->ScreenSize ;\r\n\r\n\tmap = tmp_map;\r\n\ttile = gpu->BG_tile_ram[num];\r\n\r\n\txoff = XBG;\r\n\tpal = MMU.ARM9_VMEM + gpu->core * ADDRESS_STEP_1KB;\r\n\r\n\tif(!bgCnt->Palette_256)    // color: 16 palette entries\r\n\t{\r\n\t\tyoff = ((YBG&7)<<2);\r\n\t\txfin = 8 - (xoff&7);\r\n\t\tfor(x = 0; x < LG; xfin = std::min<u16>(x+8, LG))\r\n\t\t{\r\n\t\t\tu16 tilePalette = 0;\r\n\t\t\ttmp = ((xoff&wmask)>>3);\r\n\t\t\tmapinfo = map + (tmp&0x1F) * 2;\r\n\t\t\tif(tmp>31) mapinfo += 32*32*2;\r\n\t\t\ttileentry.val = T1ReadWord(MMU_gpu_map(mapinfo), 0);\r\n\r\n\t\t\ttilePalette = (tileentry.bits.Palette*16);\r\n\r\n\t\t\tline = (u8*)MMU_gpu_map(tile + (tileentry.bits.TileNum * 0x20) + ((tileentry.bits.VFlip) ? (7*4)-yoff : yoff));\r\n\t\t\t\r\n\t\t\tif(tileentry.bits.HFlip)\r\n\t\t\t{\r\n\t\t\t\tline += (3 - ((xoff&7)>>1));\r\n\t\t\t\tfor(; x < xfin; line --) \r\n\t\t\t\t{\t\r\n\t\t\t\t\tu8 currLine = *line;\r\n\r\n\t\t\t\t\tif(!(xoff&1))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcolor = T1ReadWord(pal, ((currLine>>4) + tilePalette) << 1);\r\n\t\t\t\t\t\tgpu->__setFinalColorBck<MOSAIC,false>(color,x,currLine>>4);\r\n\t\t\t\t\t\tx++; xoff++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(x<xfin)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcolor = T1ReadWord(pal, ((currLine&0xF) + tilePalette) << 1);\r\n\t\t\t\t\t\tgpu->__setFinalColorBck<MOSAIC,false>(color,x,currLine&0xF);\r\n\t\t\t\t\t\tx++; xoff++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tline += ((xoff&7)>>1);\r\n\t\t\t\tfor(; x < xfin; line ++) \r\n\t\t\t\t{\r\n\t\t\t\t\tu8 currLine = *line;\r\n\r\n\t\t\t\t\tif(!(xoff&1))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcolor = T1ReadWord(pal, ((currLine&0xF) + tilePalette) << 1);\r\n\t\t\t\t\t\tgpu->__setFinalColorBck<MOSAIC,false>(color,x,currLine&0xF);\r\n\t\t\t\t\t\tx++; xoff++;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif(x<xfin)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcolor = T1ReadWord(pal, ((currLine>>4) + tilePalette) << 1);\r\n\t\t\t\t\t\tgpu->__setFinalColorBck<MOSAIC,false>(color,x,currLine>>4);\r\n\t\t\t\t\t\tx++; xoff++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\t//256-color BG\r\n\r\n\tif(dispCnt->ExBGxPalette_Enable)  // color: extended palette\r\n\t{\r\n\t\tpal = MMU.ExtPal[gpu->core][gpu->BGExtPalSlot[num]];\r\n\t\tif(!pal) return;\r\n\t}\r\n\r\n\tyoff = ((YBG&7)<<3);\r\n\tu8* tilePal;\r\n\txfin = 8 - (xoff&7);\r\n\tu32 extPalMask = -dispCnt->ExBGxPalette_Enable;\r\n\tfor(x = 0; x < LG; xfin = std::min<u16>(x+8, LG))\r\n\t{\r\n\t\ttmp = (xoff & (lg-1))>>3;\r\n\t\tmapinfo = map + (tmp & 31) * 2;\r\n\t\tif(tmp > 31) mapinfo += 32*32*2;\r\n\t\ttileentry.val = T1ReadWord(MMU_gpu_map(mapinfo), 0);\r\n\t\ttilePal = pal + ((tileentry.bits.Palette<<9)&extPalMask);\r\n\t\tline = (u8*)MMU_gpu_map(tile + (tileentry.bits.TileNum*0x40) + ((tileentry.bits.VFlip) ? (7*8)-yoff : yoff));\r\n\r\n\t\tif(tileentry.bits.HFlip)\r\n\t\t{\r\n\t\t\tline += (7 - (xoff&7));\r\n\t\t\tline_dir = -1;\r\n\t\t} else {\r\n\t\t\tline += (xoff&7);\r\n\t\t\tline_dir = 1;\r\n\t\t}\r\n\t\tfor(; x < xfin; )\r\n\t\t{\r\n\t\t\tcolor = T1ReadWord(tilePal, (*line) << 1);\r\n\r\n\t\t\tgpu->__setFinalColorBck<MOSAIC,false>(color,x,*line);\r\n\t\t\t\r\n\t\t\tx++; xoff++;\r\n\r\n\t\t\tline += line_dir;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tBACKGROUND RENDERING -ROTOSCALE-\r\n/*****************************************************************************/\r\ntemplate<bool MOSAIC> FORCEINLINE void rot_tiled_8bit_entry(GPU * gpu, const s32 auxX, const s32 auxY, const int lg, const u32 map, const u32 tile, u8 * pal, const int i) {\r\n\r\n\tu8 palette_entry;\r\n\tu16 tileindex, x, y, color;\r\n\r\n\ttileindex = *(u8*)MMU_gpu_map(map + ((auxX>>3) + (auxY>>3) * (lg>>3)));\r\n\r\n\tx = (auxX&7); \r\n\ty = (auxY&7);\r\n\r\n\tpalette_entry = *(u8*)MMU_gpu_map(tile + ((tileindex<<6)+(y<<3)+x));\r\n\tcolor = T1ReadWord(pal, palette_entry << 1);\r\n\tgpu->__setFinalColorBck<MOSAIC,false>(color,i,palette_entry);\r\n}\r\n\r\ntemplate<bool MOSAIC, bool extPal> FORCEINLINE void rot_tiled_16bit_entry(GPU * gpu, const s32 auxX, const s32 auxY, const int lg, const u32 map, const u32 tile, u8 * pal, int i) {\r\n\tvoid* const map_addr = MMU_gpu_map(map + (((auxX>>3) + (auxY>>3) * (lg>>3))<<1));\r\n\t\r\n\tTILEENTRY tileentry;\r\n\ttileentry.val = T1ReadWord(map_addr, 0);\r\n\r\n\tconst u16 x = ((tileentry.bits.HFlip) ? 7 - (auxX) : (auxX))&7;\r\n\tconst u16 y = ((tileentry.bits.VFlip) ? 7 - (auxY) : (auxY))&7;\r\n\r\n\tconst u8 palette_entry = *(u8*)MMU_gpu_map(tile + ((tileentry.bits.TileNum<<6)+(y<<3)+x));\r\n\tconst u16 color = T1ReadWord(pal, (palette_entry + (extPal ? (tileentry.bits.Palette<<8) : 0)) << 1);\r\n\tgpu->__setFinalColorBck<MOSAIC,false>(color, i, palette_entry);\r\n}\r\n\r\ntemplate<bool MOSAIC> FORCEINLINE void rot_256_map(GPU * gpu, const s32 auxX, const s32 auxY, const int lg, const u32 map, const u32 tile, u8 * pal, const int i) {\r\n\tu8 palette_entry;\r\n\tu16 color;\r\n\r\n\tu8* adr = (u8*)MMU_gpu_map((map) + ((auxX + auxY * lg)));\r\n\r\n\tpalette_entry = *adr;\r\n\tcolor = T1ReadWord(pal, palette_entry << 1);\r\n\tgpu->__setFinalColorBck<MOSAIC,false>(color, i, palette_entry);\r\n}\r\n\r\ntemplate<bool MOSAIC> FORCEINLINE void rot_BMP_map(GPU * gpu, const s32 auxX, const s32 auxY, const int lg, const u32 map, const u32 tile, u8 * pal, const int i) {\r\n\tu16 color;\r\n\tvoid* adr = MMU_gpu_map((map) + ((auxX + auxY * lg) << 1));\r\n\tcolor = T1ReadWord(adr, 0);\r\n\tgpu->__setFinalColorBck<MOSAIC,false>(color, i, color&0x8000);\r\n}\r\n\r\ntypedef void (*rot_fun)(GPU * gpu, const s32 auxX, const s32 auxY, const int lg, const u32 map, const u32 tile, u8 * pal, const int i);\r\n\r\ntemplate<rot_fun fun, bool WRAP>\r\nFORCEINLINE void rot_scale_op(GPU * gpu, const s32 X, const s32 Y, const s16 PA, const s16 PB, const s16 PC, const s16 PD, const u16 LG, const s32 wh, const s32 ht, const u32 map, const u32 tile, u8 * pal)\r\n{\r\n\tROTOCOORD x, y;\r\n\tx.val = X;\r\n\ty.val = Y;\r\n\r\n\tconst s32 dx = (s32)PA;\r\n\tconst s32 dy = (s32)PC;\r\n\r\n\t// as an optimization, specially handle the fairly common case of\r\n\t// \"unrotated + unscaled + no boundary checking required\"\r\n\tif(dx==0x100 && dy==0)\r\n\t{\r\n\t\ts32 auxX = x.bits.Integer;\r\n\t\ts32 auxY = y.bits.Integer;\r\n\t\tif(WRAP || (auxX + LG < wh && auxX >= 0 && auxY < ht && auxY >= 0))\r\n\t\t{\r\n\t\t\tif(WRAP)\r\n\t\t\t{\r\n\t\t\t\tauxY = auxY & (ht-1);\r\n\t\t\t\tauxX = auxX & (wh-1);\r\n\t\t\t}\r\n\t\t\tfor(int i = 0; i < LG; ++i)\r\n\t\t\t{\r\n\t\t\t\tfun(gpu, auxX, auxY, wh, map, tile, pal, i);\r\n\t\t\t\tauxX++;\r\n\t\t\t\tif(WRAP)\r\n\t\t\t\t\tauxX = auxX & (wh-1);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\t\r\n\tfor(int i = 0; i < LG; ++i)\r\n\t{\r\n\t\ts32 auxX, auxY;\r\n\t\tauxX = x.bits.Integer;\r\n\t\tauxY = y.bits.Integer;\r\n\t\r\n\t\tif(WRAP)\r\n\t\t{\r\n\t\t\tauxX = auxX & (wh-1);\r\n\t\t\tauxY = auxY & (ht-1);\r\n\t\t}\r\n\t\t\r\n\t\tif(WRAP || ((auxX >= 0) && (auxX < wh) && (auxY >= 0) && (auxY < ht)))\r\n\t\t\tfun(gpu, auxX, auxY, wh, map, tile, pal, i);\r\n\r\n\t\tx.val += dx;\r\n\t\ty.val += dy;\r\n\t}\r\n}\r\n\r\ntemplate<rot_fun fun>\r\nFORCEINLINE void apply_rot_fun(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG, u32 map, u32 tile, u8 * pal)\r\n{\r\n\tstruct _BGxCNT * bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[gpu->currBgNum].bits;\r\n\ts32 wh = gpu->BGSize[gpu->currBgNum][0];\r\n\ts32 ht = gpu->BGSize[gpu->currBgNum][1];\r\n\tif(bgCnt->PaletteSet_Wrap)\r\n\t\trot_scale_op<fun,true>(gpu, X, Y, PA, PB, PC, PD, LG, wh, ht, map, tile, pal);\t\r\n\telse rot_scale_op<fun,false>(gpu, X, Y, PA, PB, PC, PD, LG, wh, ht, map, tile, pal);\t\r\n}\r\n\r\n\r\ntemplate<bool MOSAIC> FORCEINLINE void rotBG2(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, u16 LG)\r\n{\r\n\tu8 num = gpu->currBgNum;\r\n\tu8 * pal = MMU.ARM9_VMEM + gpu->core * 0x400;\r\n//\tprintf(\"rot mode\\n\");\r\n\tapply_rot_fun<rot_tiled_8bit_entry<MOSAIC> >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal);\r\n}\r\n\r\ntemplate<bool MOSAIC> FORCEINLINE void extRotBG2(GPU * gpu, s32 X, s32 Y, s16 PA, s16 PB, s16 PC, s16 PD, s16 LG)\r\n{\r\n\tu8 num = gpu->currBgNum;\r\n\tstruct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;\r\n\t\r\n\tu8 *pal;\r\n\r\n\tswitch(gpu->BGTypes[num])\r\n\t{\r\n\tcase BGType_AffineExt_256x16:\r\n\t\tif(dispCnt->ExBGxPalette_Enable)\r\n\t\t\tpal = MMU.ExtPal[gpu->core][gpu->BGExtPalSlot[num]];\r\n\t\telse\r\n\t\t\tpal = MMU.ARM9_VMEM + gpu->core * 0x400;\r\n\t\tif (!pal) return;\r\n\t\t// 16  bit bgmap entries\r\n\t\tif(dispCnt->ExBGxPalette_Enable)\r\n\t\t\tapply_rot_fun<rot_tiled_16bit_entry<MOSAIC, true> >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal);\r\n\t\telse apply_rot_fun<rot_tiled_16bit_entry<MOSAIC, false> >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_map_ram[num], gpu->BG_tile_ram[num], pal);\r\n\t\treturn;\r\n\tcase BGType_AffineExt_256x1:\r\n\t\t// 256 colors \r\n\t\tpal = MMU.ARM9_VMEM + gpu->core * 0x400;\r\n\t\tapply_rot_fun<rot_256_map<MOSAIC> >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_ram[num], 0, pal);\r\n\t\treturn;\r\n\tcase BGType_AffineExt_Direct:\r\n\t\t// direct colors / BMP\r\n\t\tapply_rot_fun<rot_BMP_map<MOSAIC> >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_ram[num], 0, NULL);\r\n\t\treturn;\r\n\tcase BGType_Large8bpp:\r\n\t\t// large screen 256 colors\r\n\t\tpal = MMU.ARM9_VMEM + gpu->core * 0x400;\r\n\t\tapply_rot_fun<rot_256_map<MOSAIC> >(gpu,X,Y,PA,PB,PC,PD,LG, gpu->BG_bmp_large_ram[num], 0, pal);\r\n\t\treturn;\r\n\tdefault: break;\r\n\t}\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tBACKGROUND RENDERING -HELPER FUNCTIONS-\r\n/*****************************************************************************/\r\n\r\n#if 0\r\nstatic void lineNull(GPU * gpu)\r\n{\r\n}\r\n#endif\r\n\r\ntemplate<bool MOSAIC> void lineText(GPU * gpu)\r\n{\r\n#if 0\r\n\tif(gpu->debug)\r\n\t{\r\n\t\tconst s32 wh = gpu->BGSize[gpu->currBgNum][0];\r\n\t\trenderline_textBG<MOSAIC>(gpu, 0, gpu->currLine, wh);\r\n\t}\r\n\telse\r\n#endif\r\n\t{\r\n\t\tconst u16 vofs = gpu->getVOFS(gpu->currBgNum);\r\n\t\tconst u16 hofs = gpu->getHOFS(gpu->currBgNum);\r\n\t\trenderline_textBG<MOSAIC>(gpu, hofs, gpu->currLine + vofs, 256);\r\n\t}\r\n}\r\n\r\ntemplate<bool MOSAIC> void lineRot(GPU * gpu)\r\n{\t\r\n\tBGxPARMS * parms;\r\n\tif (gpu->currBgNum==2) {\r\n\t\tparms = &(gpu->dispx_st)->dispx_BG2PARMS;\r\n\t} else {\r\n\t\tparms = &(gpu->dispx_st)->dispx_BG3PARMS;\t\t\r\n\t}\r\n\r\n#if 0\r\n\tif(gpu->debug)\r\n\t{\r\n\t\ts32 wh = gpu->BGSize[gpu->currBgNum][0];\r\n\t\trotBG2<MOSAIC>(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh);\r\n\t}\r\n\telse\r\n#endif\r\n\t{\r\n\t\t rotBG2<MOSAIC>(gpu, \r\n\t\t\t\t  parms->BGxX,\r\n\t\t\t\t  parms->BGxY,\r\n\t\t\t\t  parms->BGxPA,\r\n\t\t\t\t  parms->BGxPB,\r\n\t\t\t\t  parms->BGxPC,\r\n\t\t\t\t  parms->BGxPD,\r\n\t\t\t\t  256);\r\n\t\t parms->BGxX += parms->BGxPB;\r\n\t\t parms->BGxY += parms->BGxPD;\r\n\t}\r\n}\r\n\r\ntemplate<bool MOSAIC> void lineExtRot(GPU * gpu)\r\n{\r\n\tBGxPARMS * parms;\r\n\tif (gpu->currBgNum==2) {\r\n\t\tparms = &(gpu->dispx_st)->dispx_BG2PARMS;\r\n\t} else {\r\n\t\tparms = &(gpu->dispx_st)->dispx_BG3PARMS;\t\t\r\n\t}\r\n\r\n#if 0\r\n\tif(gpu->debug)\r\n\t{\r\n\t\ts32 wh = gpu->BGSize[gpu->currBgNum][0];\r\n\t\textRotBG2<MOSAIC>(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh);\r\n\t}\r\n\telse\r\n#endif\r\n\t{\r\n\t\textRotBG2<MOSAIC>(gpu,\r\n              parms->BGxX,\r\n              parms->BGxY,\r\n              parms->BGxPA,\r\n              parms->BGxPB,\r\n              parms->BGxPC,\r\n              parms->BGxPD,\r\n              256);\r\n\t\tparms->BGxX += parms->BGxPB;\r\n\t\tparms->BGxY += parms->BGxPD;\r\n\t}\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tSPRITE RENDERING -HELPER FUNCTIONS-\r\n/*****************************************************************************/\r\n\r\n#define nbShow 128\r\n\r\n/* if i understand it correct, and it fixes some sprite problems in chameleon shot */\r\n/* we have a 15 bit color, and should use the pal entry bits as alpha ?*/\r\n/* http://nocash.emubase.de/gbatek.htm#dsvideoobjs */\r\nINLINE void render_sprite_BMP (GPU * gpu, u8 spriteNum, u16 l, u8 * dst, u32 srcadr, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha) \r\n{\r\n\tint i; u16 color;\r\n\tfor(i = 0; i < lg; i++, ++sprX, x+=xdir)\r\n\t{\r\n\t\tu16* src = (u16*)MMU_gpu_map(srcadr+(x<<1));\r\n\t\tcolor = LE_TO_LOCAL_16(*src);\r\n\r\n\t\t// alpha bit = invisible\r\n\t\tif ((color&0x8000)&&(prio<prioTab[sprX]))\r\n\t\t{\r\n\t\t\tHostWriteWord(dst, (sprX<<1), color);\r\n\t\t\tdst_alpha[sprX] = alpha;\r\n\t\t\ttypeTab[sprX] = 3;\r\n\t\t\tprioTab[sprX] = prio;\r\n\t\t\tgpu->sprNum[sprX] = spriteNum;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nINLINE void render_sprite_256(GPU * gpu, u8 spriteNum, u16 l, u8 * dst, u32 srcadr, u16 * pal, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha)\r\n{\r\n\tint i; \r\n\tu8 palette_entry; \r\n\tu16 color;\r\n\r\n\tfor(i = 0; i < lg; i++, ++sprX, x+=xdir)\r\n\t{\r\n\t\tu32 adr = srcadr + (x&0x7) + ((x&0xFFF8)<<3);\r\n\t\tu8* src = (u8 *)MMU_gpu_map(adr);\r\n\t\tpalette_entry = *src;\r\n\t\tcolor = LE_TO_LOCAL_16(pal[palette_entry]);\r\n\r\n\t\t// palette entry = 0 means backdrop\r\n\t\tif ((palette_entry>0)&&(prio<prioTab[sprX]))\r\n\t\t{\r\n\t\t\tHostWriteWord(dst, (sprX<<1), color);\r\n\t\t\tdst_alpha[sprX] = 16;\r\n\t\t\ttypeTab[sprX] = (alpha ? 1 : 0);\r\n\t\t\tprioTab[sprX] = prio;\r\n\t\t\tgpu->sprNum[sprX] = spriteNum;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nINLINE void render_sprite_16 (\tGPU * gpu, u16 l, u8 * dst, u32 srcadr, u16 * pal, u8 * dst_alpha, u8 * typeTab, u8 * prioTab, u8 prio, int lg, int sprX, int x, int xdir, u8 alpha)\r\n{\r\n\tint i; \r\n\tu8 palette, palette_entry;\r\n\tu16 color, x1;\r\n\r\n\tfor(i = 0; i < lg; i++, ++sprX, x+=xdir)\r\n\t{\r\n\t\tx1 = x>>1;\r\n\t\t\r\n\t\tu32 adr = srcadr + (x1&0x3) + ((x1&0xFFFC)<<3);\r\n\t\tu8* src = (u8 *)MMU_gpu_map(adr);//\r\n\t\tpalette = *src;\r\n\r\n\t\tif (x & 1) palette_entry = palette >> 4;\r\n\t\telse       palette_entry = palette & 0xF;\r\n\t\tcolor = LE_TO_LOCAL_16(pal[palette_entry]);\r\n\r\n\t\t// palette entry = 0 means backdrop\r\n\t\tif ((palette_entry>0)&&(prio<prioTab[sprX]))\r\n\t\t{\r\n\t\t\tHostWriteWord(dst, (sprX<<1), color);\r\n\t\t\tdst_alpha[sprX] = 16;\r\n\t\t\ttypeTab[sprX] = (alpha ? 1 : 0);\r\n\t\t\tprioTab[sprX] = prio;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nINLINE void render_sprite_Win (GPU * gpu, u16 l, u8 * src,\r\n\tint col256, int lg, int sprX, int x, int xdir) {\r\n\tint i; u8 palette, palette_entry;\r\n\tu16 x1;\r\n\tif (col256) {\r\n\t\tfor(i = 0; i < lg; i++, sprX++,x+=xdir)\r\n\t\t\t//sprWin[sprX] = (src[x])?1:0;\r\n\t\t\tif(src[(x&7) + ((x&0xFFF8)<<3)]) \r\n\t\t\t\tsprWin[sprX] = 1;\r\n\t} else {\r\n\t\tfor(i = 0; i < lg; i++, ++sprX, x+=xdir)\r\n\t\t{\r\n\t\t\tx1 = x>>1;\r\n\t\t\tpalette = src[(x1&0x3) + ((x1&0xFFFC)<<3)];\r\n\t\t\tif (x & 1) palette_entry = palette >> 4;\r\n\t\t\telse       palette_entry = palette & 0xF;\r\n\t\t\t//sprWin[sprX] = (palette_entry)?1:0;\r\n\t\t\tif(palette_entry)\r\n\t\t\t\tsprWin[sprX] = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// return val means if the sprite is to be drawn or not\r\nFORCEINLINE BOOL compute_sprite_vars(_OAM_ * spriteInfo, u16 l, \r\n\tsize &sprSize, s32 &sprX, s32 &sprY, s32 &x, s32 &y, s32 &lg, int &xdir) {\r\n\r\n\tx = 0;\r\n\t// get sprite location and size\r\n\tsprX = (spriteInfo->X/*<<23*/)/*>>23*/;\r\n\tsprY = spriteInfo->Y;\r\n\tsprSize = sprSizeTab[spriteInfo->Size][spriteInfo->Shape];\r\n\r\n\tlg = sprSize.x;\r\n\t\r\n\tif (sprY>=192)\r\n\t\tsprY = (s32)((s8)(spriteInfo->Y));\r\n\t\r\n// FIXME: for rot/scale, a list of entries into the sprite should be maintained,\r\n// that tells us where the first pixel of a screenline starts in the sprite,\r\n// and how a step to the right in a screenline translates within the sprite\r\n\r\n\t//this wasn't really tested by anything. very unlikely to get triggered\r\n\ty = (l - sprY)&255;                        /* get the y line within sprite coords */\r\n\tif(y >= sprSize.y)\r\n\t\treturn FALSE;\r\n\r\n\tif((sprX==256)||(sprX+sprSize.x<=0))\t/* sprite pixels outside of line */\r\n\t\treturn FALSE;\t\t\t\t/* not to be drawn */\r\n\r\n\t// sprite portion out of the screen (LEFT)\r\n\tif(sprX<0)\r\n\t{\r\n\t\tlg += sprX;\t\r\n\t\tx = -(sprX);\r\n\t\tsprX = 0;\r\n\t}\r\n\t// sprite portion out of the screen (RIGHT)\r\n\tif (sprX+sprSize.x >= 256)\r\n\t\tlg = 256 - sprX;\r\n\r\n\t// switch TOP<-->BOTTOM\r\n\tif (spriteInfo->VFlip)\r\n\t\ty = sprSize.y - y -1;\r\n\t\r\n\t// switch LEFT<-->RIGHT\r\n\tif (spriteInfo->HFlip) {\r\n\t\tx = sprSize.x - x -1;\r\n\t\txdir  = -1;\r\n\t} else {\r\n\t\txdir  = 1;\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tSPRITE RENDERING\r\n/*****************************************************************************/\r\n\r\n\r\n//TODO - refactor this so there isnt as much duped code between rotozoomed and non-rotozoomed versions\r\n\r\nstatic u32 bmp_sprite_address(GPU* gpu, _OAM_ * spriteInfo, size sprSize, s32 y)\r\n{\r\n\tif (gpu->dispCnt().OBJ_BMP_mapping)\r\n\t{\r\n\t\t//tested by buffy sacrifice damage blood splatters in corner\r\n\t\treturn gpu->sprMem + (spriteInfo->TileIndex<<gpu->sprBMPBoundary) + (y*sprSize.x*2);\r\n\t}\r\n\telse\r\n\t{\r\n\t\t//2d mapping:\r\n\t\t//verified in rotozoomed mode by knights in the nightmare intro\r\n\r\n\t\tif (gpu->dispCnt().OBJ_BMP_2D_dim)\r\n\t\t\t//256*256, verified by heroes of mana FMV intro\r\n\t\t\treturn gpu->sprMem + (((spriteInfo->TileIndex&0x3E0) * 64  + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1);\r\n\t\telse \r\n\t\t\t//128*512, verified by harry potter and the order of the phoenix conversation portraits\r\n\t\t\treturn gpu->sprMem + (((spriteInfo->TileIndex&0x3F0) * 64  + (spriteInfo->TileIndex&0x0F) *8 + ( y << 7)) << 1);\r\n\t}\r\n}\r\n\r\n\r\ntemplate<GPU::SpriteRenderMode MODE>\r\nvoid GPU::_spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab)\r\n{\r\n\tu16 l = currLine;\r\n\tGPU *gpu = this;\r\n\r\n\tint cost = 0;\r\n\r\n\tstruct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;\r\n\t_OAM_ * spriteInfo = (_OAM_ *)(gpu->oam);\r\n\tu8 block = gpu->sprBoundary;\r\n\tu8 i;\r\n\r\n\t//what the hell? why is all this here? the #ifdefs in the bitfields definition should take care of this.\r\n\t//this needs to be fixed anyway since i changed the sprite render order\r\n\t//better yet, just dont do it this way at all. _OAM_ is so small, why not just copy it and then twiddle it?\r\n\r\n//#ifdef WORDS_BIGENDIAN\r\n//\t*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) >> 1) | *(((u16*)spriteInfo)+1) << 15;\r\n//\t*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) >> 2) | *(((u16*)spriteInfo)+2) << 14;\r\n//#endif\r\n\r\n\tfor(i = 0; i<nbShow; ++i, ++spriteInfo\r\n//#ifdef WORDS_BIGENDIAN    \r\n//\t,*(((u16*)(spriteInfo+1))+1) = (*(((u16*)(spriteInfo+1))+1) << 1) | *(((u16*)(spriteInfo+1))+1) >> 15\r\n//\t,*(((u16*)(spriteInfo+1))+2) = (*(((u16*)(spriteInfo+1))+2) << 2) | *(((u16*)(spriteInfo+1))+2) >> 14\r\n//\t,*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) >> 1) | *(((u16*)spriteInfo)+1) << 15\r\n//\t,*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) >> 2) | *(((u16*)spriteInfo)+2) << 14\r\n//#endif\r\n\t)     \r\n\t{\r\n\t\t//for each sprite:\r\n\t\tif(cost>=2130)\r\n\t\t{\r\n\t\t\t//out of sprite rendering time\r\n\t\t\t//printf(\"sprite overflow!\\n\");\r\n\t\t\t//return;\t\t\r\n\t\t}\r\n\r\n\t\t//do we incur a cost if a sprite is disabled?? we guess so.\r\n\t\tcost += 2;\r\n\r\n\t\tsize sprSize;\r\n\t\ts32 sprX, sprY, x, y, lg;\r\n\t\tint xdir;\r\n\t\tu8 prio, * src;\r\n\t\tu32 srcadr;\r\n\t\tu16 j;\r\n\r\n\t\t// Check if sprite is disabled before everything\r\n\t\tif (spriteInfo->RotScale == 2)\r\n\t\t\tcontinue;\r\n\r\n\t\tprio = spriteInfo->Priority;\r\n\r\n\r\n\t\tif (spriteInfo->RotScale & 1) \r\n\t\t{\r\n\t\t\ts32\t\tfieldX, fieldY, auxX, auxY, realX, realY, offset;\r\n\t\t\tu8\t\tblockparameter, *pal;\r\n\t\t\ts16\t\tdx, dmx, dy, dmy;\r\n\t\t\tu16\t\tcolour;\r\n\r\n\t\t\t// Get sprite positions and size\r\n\t\t\tsprX = (spriteInfo->X<<23)>>23;\r\n\t\t\tsprY = spriteInfo->Y;\r\n\t\t\tsprSize = sprSizeTab[spriteInfo->Size][spriteInfo->Shape];\r\n\r\n\t\t\tlg = sprSize.x;\r\n\t\t\t\r\n\t\t\tif (sprY>=192)\r\n\t\t\t\tsprY = (s32)((s8)(spriteInfo->Y));\r\n\r\n\t\t\t// Copy sprite size, to check change it if needed\r\n\t\t\tfieldX = sprSize.x;\r\n\t\t\tfieldY = sprSize.y;\r\n\r\n\t\t\t// If we are using double size mode, double our control vars\r\n\t\t\tif (spriteInfo->RotScale & 2)\r\n\t\t\t{\r\n\t\t\t\tfieldX <<= 1;\r\n\t\t\t\tfieldY <<= 1;\r\n\t\t\t\tlg <<= 1;\r\n\t\t\t}\r\n\r\n\t\t\t//check if the sprite is visible y-wise. unfortunately our logic for x and y is different due to our scanline based rendering\r\n\t\t\t//tested thoroughly by many large sprites in Super Robot Wars K which wrap around the screen\r\n\t\t\ty = (l - sprY)&255;\r\n\t\t\tif(y >= fieldY)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t//check if sprite is visible x-wise.\r\n\t\t\tif((sprX==256) || (sprX+fieldX<=0))\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tcost += sprSize.x*2 + 10;\r\n\r\n\t\t\t// Get which four parameter block is assigned to this sprite\r\n\t\t\tblockparameter = (spriteInfo->RotScalIndex + (spriteInfo->HFlip<< 3) + (spriteInfo->VFlip << 4))*4;\r\n\r\n\t\t\t// Get rotation/scale parameters\r\n#ifdef WORDS_BIGENDIAN\r\n\t\t\tdx  = ((s16)(gpu->oam + blockparameter+0)->attr31 << 8) | ((s16)(gpu->oam + blockparameter+0)->attr30);\r\n\t\t\tdmx = ((s16)(gpu->oam + blockparameter+1)->attr31 << 8) | ((s16)(gpu->oam + blockparameter+1)->attr30);\r\n\t\t\tdy  = ((s16)(gpu->oam + blockparameter+2)->attr31 << 8) | ((s16)(gpu->oam + blockparameter+2)->attr30);\r\n\t\t\tdmy = ((s16)(gpu->oam + blockparameter+3)->attr31 << 8) | ((s16)(gpu->oam + blockparameter+3)->attr30);\r\n#else\r\n\t\t\tdx  = (s16)(gpu->oam + blockparameter+0)->attr3;\r\n\t\t\tdmx = (s16)(gpu->oam + blockparameter+1)->attr3;\r\n\t\t\tdy  = (s16)(gpu->oam + blockparameter+2)->attr3;\r\n\t\t\tdmy = (s16)(gpu->oam + blockparameter+3)->attr3;\r\n#endif\r\n\r\n\t\t\t// Calculate fixed poitn 8.8 start offsets\r\n\t\t\trealX = ((sprSize.x) << 7) - (fieldX >> 1)*dx - (fieldY>>1)*dmx + y * dmx;\r\n\t\t\trealY = ((sprSize.y) << 7) - (fieldX >> 1)*dy - (fieldY>>1)*dmy + y * dmy;\r\n\r\n\t\t\tif(sprX<0)\r\n\t\t\t{\r\n\t\t\t\t// If sprite is not in the window\r\n\t\t\t\tif(sprX + fieldX <= 0)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t// Otherwise, is partially visible\r\n\t\t\t\tlg += sprX;\r\n\t\t\t\trealX -= sprX*dx;\r\n\t\t\t\trealY -= sprX*dy;\r\n\t\t\t\tsprX = 0;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif(sprX+fieldX>256)\r\n\t\t\t\t\tlg = 256 - sprX;\r\n\t\t\t}\r\n\r\n\t\t\t// If we are using 1 palette of 256 colours\r\n\t\t\tif(spriteInfo->Depth)\r\n\t\t\t{\r\n\t\t\t\tsrc = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex << block));\r\n\r\n\t\t\t\t// If extended palettes are set, use them\r\n\t\t\t\tif (dispCnt->ExOBJPalette_Enable)\r\n\t\t\t\t\tpal = (MMU.ObjExtPal[gpu->core][0]+(spriteInfo->PaletteIndex*0x200));\r\n\t\t\t\telse\r\n\t\t\t\t\tpal = (MMU.ARM9_VMEM + 0x200 + gpu->core *0x400);\r\n\r\n\t\t\t\tfor(j = 0; j < lg; ++j, ++sprX)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data\r\n\t\t\t\t\tauxX = (realX>>8);\r\n\t\t\t\t\tauxY = (realY>>8);\r\n\r\n\t\t\t\t\tif (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(MODE == SPRITE_2D)\r\n\t\t\t\t\t\t\toffset = (auxX&0x7) + ((auxX&0xFFF8)<<3) + ((auxY>>3)<<10) + ((auxY&0x7)*8);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\toffset = (auxX&0x7) + ((auxX&0xFFF8)<<3) + ((auxY>>3)*sprSize.x*8) + ((auxY&0x7)*8);\r\n\r\n\t\t\t\t\t\tcolour = src[offset];\r\n\r\n\t\t\t\t\t\tif (colour && (prio<prioTab[sprX]))\r\n\t\t\t\t\t\t{ \r\n\t\t\t\t\t\t\tHostWriteWord(dst, (sprX<<1), HostReadWord(pal, (colour<<1)));\r\n\t\t\t\t\t\t\tdst_alpha[sprX] = 16;\r\n\t\t\t\t\t\t\ttypeTab[sprX] = spriteInfo->Mode;\r\n\t\t\t\t\t\t\tprioTab[sprX] = prio;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//  Add the rotation/scale coeficients, here the rotation/scaling\r\n\t\t\t\t\t// is performed\r\n\t\t\t\t\trealX += dx;\r\n\t\t\t\t\trealY += dy;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\t// Rotozoomed direct color\r\n\t\t\telse if(spriteInfo->Mode == 3)\r\n\t\t\t{\r\n\t\t\t\t//transparent (i think, dont bother to render?) if alpha is 0\r\n\t\t\t\tif(spriteInfo->PaletteIndex == 0)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\tsrcadr = bmp_sprite_address(this,spriteInfo,sprSize,0);\r\n\r\n\t\t\t\tfor(j = 0; j < lg; ++j, ++sprX)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data\r\n\t\t\t\t\tauxX = (realX>>8);\r\n\t\t\t\t\tauxY = (realY>>8);\r\n\r\n\t\t\t\t\t//this is all very slow, and so much dup code with other rotozoomed modes.\r\n\t\t\t\t\t//dont bother fixing speed until this whole thing gets reworked\r\n\r\n\t\t\t\t\tif (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(dispCnt->OBJ_BMP_2D_dim)\r\n\t\t\t\t\t\t\t//tested by knights in the nightmare\r\n\t\t\t\t\t\t\toffset = (bmp_sprite_address(this,spriteInfo,sprSize,auxY)-srcadr)/2+auxX;\r\n\t\t\t\t\t\telse //tested by lego indiana jones (somehow?)\r\n\t\t\t\t\t\t\t//tested by buffy sacrifice damage blood splatters in corner\r\n\t\t\t\t\t\t\toffset = auxX + (auxY*sprSize.x);\r\n\r\n\r\n\t\t\t\t\t\tu16* mem = (u16*)MMU_gpu_map(srcadr + (offset<<1));\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tcolour = T1ReadWord(mem,0);\r\n\r\n\t\t\t\t\t\tif((colour&0x8000) && (prio<prioTab[sprX]))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tHostWriteWord(dst, (sprX<<1), colour);\r\n\t\t\t\t\t\t\tdst_alpha[sprX] = spriteInfo->PaletteIndex;\r\n\t\t\t\t\t\t\ttypeTab[sprX] = spriteInfo->Mode;\r\n\t\t\t\t\t\t\tprioTab[sprX] = prio;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//  Add the rotation/scale coeficients, here the rotation/scaling\r\n\t\t\t\t\t// is performed\r\n\t\t\t\t\trealX += dx;\r\n\t\t\t\t\trealY += dy;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\t// Rotozoomed 16/16 palette\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif(MODE == SPRITE_2D)\r\n\t\t\t\t{\r\n\t\t\t\t\tsrc = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<<5));\r\n\t\t\t\t\tpal = MMU.ARM9_VMEM + 0x200 + (gpu->core*0x400 + (spriteInfo->PaletteIndex*32));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tsrc = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<<gpu->sprBoundary));\r\n\t\t\t\t\tpal = MMU.ARM9_VMEM + 0x200 + gpu->core*0x400 + (spriteInfo->PaletteIndex*32);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor(j = 0; j < lg; ++j, ++sprX)\r\n\t\t\t\t{\r\n\t\t\t\t\t// Get the integer part of the fixed point 8.8, and check if it lies inside the sprite data\r\n\t\t\t\t\tauxX = (realX>>8);\r\n\t\t\t\t\tauxY = (realY>>8);\r\n\r\n\t\t\t\t\tif (auxX >= 0 && auxY >= 0 && auxX < sprSize.x && auxY < sprSize.y)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(MODE == SPRITE_2D)\r\n\t\t\t\t\t\t\toffset = ((auxX>>1)&0x3) + (((auxX>>1)&0xFFFC)<<3) + ((auxY>>3)<<10) + ((auxY&0x7)*4);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\toffset = ((auxX>>1)&0x3) + (((auxX>>1)&0xFFFC)<<3) + ((auxY>>3)*sprSize.x)*4 + ((auxY&0x7)*4);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tcolour = src[offset];\r\n\r\n\t\t\t\t\t\t// Get 4bits value from the readed 8bits\r\n\t\t\t\t\t\tif (auxX&1)\tcolour >>= 4;\r\n\t\t\t\t\t\telse\t\tcolour &= 0xF;\r\n\r\n\t\t\t\t\t\tif(colour && (prio<prioTab[sprX]))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(spriteInfo->Mode==2)\r\n\t\t\t\t\t\t\t\tsprWin[sprX] = 1;\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tHostWriteWord(dst, (sprX<<1), LE_TO_LOCAL_16(HostReadWord(pal, colour << 1)));\r\n\t\t\t\t\t\t\t\tdst_alpha[sprX] = 16;\r\n\t\t\t\t\t\t\t\ttypeTab[sprX] = spriteInfo->Mode;\r\n\t\t\t\t\t\t\t\tprioTab[sprX] = prio;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//  Add the rotation/scale coeficients, here the rotation/scaling\r\n\t\t\t\t\t// is performed\r\n\t\t\t\t\trealX += dx;\r\n\t\t\t\t\trealY += dy;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse //NOT rotozoomed\r\n\t\t{\r\n\t\t\tu16 * pal;\r\n\t\r\n\t\t\tif (!compute_sprite_vars(spriteInfo, l, sprSize, sprX, sprY, x, y, lg, xdir))\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tcost += sprSize.x;\r\n\r\n\t\t\tif (spriteInfo->Mode == 2)\r\n\t\t\t{\r\n\t\t\t\tif(MODE == SPRITE_2D)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (spriteInfo->Depth)\r\n\t\t\t\t\t\tsrc = (u8 *)MMU_gpu_map(gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8));\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tsrc = (u8 *)MMU_gpu_map(gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4));\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif (spriteInfo->Depth)\r\n\t\t\t\t\t\tsrc = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<<block) + ((y>>3)*sprSize.x*8) + ((y&0x7)*8));\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tsrc = (u8 *)MMU_gpu_map(gpu->sprMem + (spriteInfo->TileIndex<<block) + ((y>>3)*sprSize.x*4) + ((y&0x7)*4));\r\n\t\t\t\t}\r\n\r\n\t\t\t\trender_sprite_Win (gpu, l, src, spriteInfo->Depth, lg, sprX, x, xdir);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (spriteInfo->Mode == 3)              //sprite is in BMP format\r\n\t\t\t{\r\n\t\t\t\tsrcadr = bmp_sprite_address(this,spriteInfo,sprSize, y);\r\n\r\n\t\t\t\t//transparent (i think, dont bother to render?) if alpha is 0\r\n\t\t\t\tif(spriteInfo->PaletteIndex == 0)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t\r\n\t\t\t\trender_sprite_BMP (gpu, i, l, dst, srcadr, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->PaletteIndex);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tif(spriteInfo->Depth) //256 colors\r\n\t\t\t{\r\n\t\t\t\tif(MODE == SPRITE_2D)\r\n\t\t\t\t\tsrcadr = gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8);\r\n\t\t\t\telse\r\n\t\t\t\t\tsrcadr = gpu->sprMem + (spriteInfo->TileIndex<<block) + ((y>>3)*sprSize.x*8) + ((y&0x7)*8);\r\n\t\t\t\t\r\n\t\t\t\tif (dispCnt->ExOBJPalette_Enable)\r\n\t\t\t\t\tpal = (u16*)(MMU.ObjExtPal[gpu->core][0]+(spriteInfo->PaletteIndex*0x200));\r\n\t\t\t\telse\r\n\t\t\t\t\tpal = (u16*)(MMU.ARM9_VMEM + 0x200 + gpu->core *0x400);\r\n\t\t\r\n\t\t\t\trender_sprite_256(gpu, i, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1);\r\n\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// 16 colors \r\n\t\t\tif(MODE == SPRITE_2D)\r\n\t\t\t{\r\n\t\t\t\tsrcadr = gpu->sprMem + ((spriteInfo->TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tsrcadr = gpu->sprMem + (spriteInfo->TileIndex<<block) + ((y>>3)*sprSize.x*4) + ((y&0x7)*4);\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tpal = (u16*)(MMU.ARM9_VMEM + 0x200 + gpu->core * 0x400);\r\n\t\t\t\r\n\t\t\tpal += (spriteInfo->PaletteIndex<<4);\r\n\t\t\t\r\n\t\t\trender_sprite_16 (gpu, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo->Mode == 1);\r\n\t\t}\r\n\t}\r\n\r\n//#ifdef WORDS_BIGENDIAN\r\n//\t*(((u16*)spriteInfo)+1) = (*(((u16*)spriteInfo)+1) << 1) | *(((u16*)spriteInfo)+1) >> 15;\r\n//\t*(((u16*)spriteInfo)+2) = (*(((u16*)spriteInfo)+2) << 2) | *(((u16*)spriteInfo)+2) >> 14;\r\n//#endif\r\n\r\n}\r\n\r\n\r\n/*****************************************************************************/\r\n//\t\t\tSCREEN FUNCTIONS\r\n/*****************************************************************************/\r\n\r\nint Screen_Init(int coreid)\r\n{\r\n\tMainScreen.gpu = GPU_Init(0);\r\n\tSubScreen.gpu = GPU_Init(1);\r\n\r\n\tmemset(GPU_screen, 0, sizeof(GPU_screen));\r\n\tfor(int i = 0; i < (256*192*2); i++)\r\n\t\t((u16*)GPU_screen)[i] = 0x7FFF;\r\n\tdisp_fifo.head = disp_fifo.tail = 0;\r\n\r\n\tif (osd)  {delete osd; osd =NULL; }\r\n\tosd  = new OSDCLASS(-1);\r\n\r\n\treturn GPU_ChangeGraphicsCore(coreid);\r\n}\r\n\r\nvoid Screen_Reset(void)\r\n{\r\n\tGPU_Reset(MainScreen.gpu, 0);\r\n\tGPU_Reset(SubScreen.gpu, 1);\r\n\r\n\tmemset(GPU_screen, 0, sizeof(GPU_screen));\r\n\tfor(int i = 0; i < (256*192*2); i++)\r\n\t\t((u16*)GPU_screen)[i] = 0x7FFF;\r\n\r\n\tdisp_fifo.head = disp_fifo.tail = 0;\r\n\tosd->clear();\r\n}\r\n\r\nvoid Screen_DeInit(void)\r\n{\r\n\tGPU_DeInit(MainScreen.gpu);\r\n\tGPU_DeInit(SubScreen.gpu);\r\n\r\n\tif (GFXCore)\r\n\t\tGFXCore->DeInit();\r\n\r\n\tif (osd)  {delete osd; osd =NULL; }\r\n}\r\n\r\n/*****************************************************************************/\r\n//\t\t\tGRAPHICS CORE\r\n/*****************************************************************************/\r\n\r\n// This is for future graphics core switching. This is by no means set in stone\r\n\r\nint GPU_ChangeGraphicsCore(int coreid)\r\n{\r\n   int i;\r\n\r\n   // Make sure the old core is freed\r\n   if (GFXCore)\r\n      GFXCore->DeInit();\r\n\r\n   // So which core do we want?\r\n   if (coreid == GFXCORE_DEFAULT)\r\n      coreid = 0; // Assume we want the first one\r\n\r\n   // Go through core list and find the id\r\n   for (i = 0; GFXCoreList[i] != NULL; i++)\r\n   {\r\n      if (GFXCoreList[i]->id == coreid)\r\n      {\r\n         // Set to current core\r\n         GFXCore = GFXCoreList[i];\r\n         break;\r\n      }\r\n   }\r\n\r\n   if (GFXCore == NULL)\r\n   {\r\n      GFXCore = &GFXDummy;\r\n      return -1;\r\n   }\r\n\r\n   if (GFXCore->Init() == -1)\r\n   {\r\n      // Since it failed, instead of it being fatal, we'll just use the dummy\r\n      // core instead\r\n      GFXCore = &GFXDummy;\r\n   }\r\n\r\n   return 0;\r\n}\r\n\r\nint GFXDummyInit();\r\nvoid GFXDummyDeInit();\r\nvoid GFXDummyResize(int width, int height, BOOL fullscreen);\r\nvoid GFXDummyOnScreenText(char *string, ...);\r\n\r\nGraphicsInterface_struct GFXDummy = {\r\nGFXCORE_DUMMY,\r\n\"Dummy Graphics Interface\",\r\n0,\r\nGFXDummyInit,\r\nGFXDummyDeInit,\r\nGFXDummyResize,\r\nGFXDummyOnScreenText\r\n};\r\n\r\nint GFXDummyInit()\r\n{\r\n   return 0;\r\n}\r\n\r\nvoid GFXDummyDeInit()\r\n{\r\n}\r\n\r\nvoid GFXDummyResize(int width, int height, BOOL fullscreen)\r\n{\r\n}\r\n\r\nvoid GFXDummyOnScreenText(char *string, ...)\r\n{\r\n}\r\n\r\n\r\n/*****************************************************************************/\r\n//\t\t\tGPU_RenderLine\r\n/*****************************************************************************/\r\n\r\nvoid GPU_set_DISPCAPCNT(u32 val)\r\n{\r\n\tGPU * gpu = MainScreen.gpu;\t\r\n\tstruct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;\r\n\r\n\tgpu->dispCapCnt.val = val;\r\n\tgpu->dispCapCnt.EVA = std::min((u32)16, (val & 0x1F));\r\n\tgpu->dispCapCnt.EVB = std::min((u32)16, ((val >> 8) & 0x1F));\r\n\tgpu->dispCapCnt.writeBlock =  (val >> 16) & 0x03;\r\n\tgpu->dispCapCnt.writeOffset = (val >> 18) & 0x03;\r\n\tgpu->dispCapCnt.readBlock = dispCnt->VRAM_Block;\r\n\r\n\tif (dispCnt->DisplayMode == 2)\r\n\t\tgpu->dispCapCnt.readOffset = 0;\r\n\telse\r\n\t\tgpu->dispCapCnt.readOffset = (val >> 26) & 0x03;\r\n\t\r\n\tgpu->dispCapCnt.srcA = (val >> 24) & 0x01;\r\n\tgpu->dispCapCnt.srcB = (val >> 25) & 0x01;\r\n\tgpu->dispCapCnt.capSrc = (val >> 29) & 0x03;\r\n\r\n\tswitch((val >> 20) & 0x03)\r\n\t{\r\n\t\tcase 0:\r\n\t\t\tgpu->dispCapCnt.capx = DISPCAPCNT::_128;\r\n\t\t\tgpu->dispCapCnt.capy = 128;\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tgpu->dispCapCnt.capx = DISPCAPCNT::_256;\r\n\t\t\tgpu->dispCapCnt.capy = 64;\r\n\t\t\tbreak;\r\n\t\tcase 2:\r\n\t\t\tgpu->dispCapCnt.capx = DISPCAPCNT::_256;\r\n\t\t\tgpu->dispCapCnt.capy = 128;\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tgpu->dispCapCnt.capx = DISPCAPCNT::_256;\r\n\t\t\tgpu->dispCapCnt.capy = 192;\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t/*INFO(\"Capture 0x%X:\\n EVA=%i, EVB=%i, wBlock=%i, wOffset=%i, capX=%i, capY=%i\\n rBlock=%i, rOffset=%i, srcCap=%i, dst=0x%X, src=0x%X\\n srcA=%i, srcB=%i\\n\\n\",\r\n\t\t\tval, gpu->dispCapCnt.EVA, gpu->dispCapCnt.EVB, gpu->dispCapCnt.writeBlock, gpu->dispCapCnt.writeOffset,\r\n\t\t\tgpu->dispCapCnt.capx, gpu->dispCapCnt.capy, gpu->dispCapCnt.readBlock, gpu->dispCapCnt.readOffset, \r\n\t\t\tgpu->dispCapCnt.capSrc, gpu->dispCapCnt.dst - MMU.ARM9_LCD, gpu->dispCapCnt.src - MMU.ARM9_LCD,\r\n\t\t\tgpu->dispCapCnt.srcA, gpu->dispCapCnt.srcB);*/\r\n}\r\n\r\nstatic void GPU_RenderLine_layer(NDS_Screen * screen, u16 l)\r\n{\r\n\tCACHE_ALIGN u8 spr[512];\r\n\tCACHE_ALIGN u8 sprAlpha[256];\r\n\tCACHE_ALIGN u8 sprType[256];\r\n\tCACHE_ALIGN u8 sprPrio[256];\r\n\r\n\tGPU * gpu = screen->gpu;\r\n\tstruct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;\r\n\titemsForPriority_t * item;\r\n\tu16 i16;\r\n\tBOOL BG_enabled  = TRUE;\r\n\r\n\tgpu->currentFadeInColors = &fadeInColors[gpu->BLDY_EVY][0];\r\n\tgpu->currentFadeOutColors = &fadeOutColors[gpu->BLDY_EVY][0];\r\n\r\n\tu16 backdrop_color = T1ReadWord(MMU.ARM9_VMEM, gpu->core * 0x400) & 0x7FFF;\r\n\r\n\t//we need to write backdrop colors in the same way as we do BG pixels in order to do correct window processing\r\n\t//this is currently eating up 2fps or so. it is a reasonable candidate for optimization. \r\n\tgpu->currBgNum = 5;\r\n\tswitch(gpu->setFinalColorBck_funcNum)\r\n\t{\r\n\t\t//for backdrops, blend isnt applied (it's illogical, isnt it?)\r\n\t\tcase 0: \r\n\t\tcase 1: \r\n\t\t\tmemset_u16_le<256>(gpu->currDst,backdrop_color); \r\n\t\t\tbreak;\r\n\r\n\t\t//for backdrops, fade in and fade out can be applied if it's a 1st target screen\r\n\t\tcase 2:\r\n\t\t\tif(gpu->BLDCNT & 0x20) //backdrop is selected for color effect\r\n\t\t\t\tmemset_u16_le<256>(gpu->currDst,gpu->currentFadeInColors[backdrop_color]);\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tif(gpu->BLDCNT & 0x20) //backdrop is selected for color effect\r\n\t\t\t\tmemset_u16_le<256>(gpu->currDst,gpu->currentFadeOutColors[backdrop_color]);\r\n\t\t\tbreak;\r\n\r\n\t\t//windowed cases apparently need special treatment? why? can we not render the backdrop? how would that even work?\r\n\t\tcase 4: for(int x=0;x<256;x++) gpu->___setFinalColorBck<false,true,4>(backdrop_color,x,1); break;\r\n\t\tcase 5: for(int x=0;x<256;x++) gpu->___setFinalColorBck<false,true,5>(backdrop_color,x,1); break;\r\n\t\tcase 6: for(int x=0;x<256;x++) gpu->___setFinalColorBck<false,true,6>(backdrop_color,x,1); break;\r\n\t\tcase 7: for(int x=0;x<256;x++) gpu->___setFinalColorBck<false,true,7>(backdrop_color,x,1); break;\r\n\t}\r\n\t\r\n\tmemset(gpu->bgPixels,5,256);\r\n\r\n\t// init background color & priorities\r\n\tmemset(sprAlpha, 0, 256);\r\n\tmemset(sprType, 0, 256);\r\n\tmemset(sprPrio, 0xFF, 256);\r\n\tmemset(sprWin, 0, 256);\r\n\t\r\n\t// init pixels priorities\r\n\t//assert(NB_PRIORITIES==4);\r\n\tgpu->itemsForPriority[0].nbPixelsX = 0;\r\n\tgpu->itemsForPriority[1].nbPixelsX = 0;\r\n\tgpu->itemsForPriority[2].nbPixelsX = 0;\r\n\tgpu->itemsForPriority[3].nbPixelsX = 0;\r\n\r\n\t// for all the pixels in the line\r\n\tif (gpu->LayersEnable[4]) \r\n\t{\r\n\t\t//n.b. - this is clearing the sprite line buffer to the background color,\r\n\t\t//but it has been changed to write u32 instead of u16 for a little speedup\r\n\t\tfor(int i = 0; i< 128; ++i) HostWriteTwoWords(spr, i << 2, backdrop_color | (backdrop_color<<16));\r\n\t\t//zero 06-may-09: I properly supported window color effects for backdrop, but I am not sure\r\n\t\t//how it interacts with this. I wish we knew why we needed this\r\n\t\t\r\n\t\tgpu->spriteRender(spr, sprAlpha, sprType, sprPrio);\r\n\t\tmosaicSpriteLine(gpu, l, spr, sprAlpha, sprType, sprPrio);\r\n\r\n\t\tfor(int i = 0; i<256; i++) \r\n\t\t{\r\n\t\t\t// assign them to the good priority item\r\n\t\t\tint prio = sprPrio[i];\r\n\t\t\tif (prio >=4) continue;\r\n\t\t\t\r\n\t\t\titem = &(gpu->itemsForPriority[prio]);\r\n\t\t\titem->PixelsX[item->nbPixelsX]=i;\r\n\t\t\titem->nbPixelsX++;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\tif (!gpu->LayersEnable[0] && !gpu->LayersEnable[1] && !gpu->LayersEnable[2] && !gpu->LayersEnable[3])\r\n\t\tBG_enabled = FALSE;\r\n\r\n\tfor(int j=0;j<8;j++)\r\n\t\tgpu->blend2[j] = (gpu->BLDCNT & (0x100 << j))!=0;\r\n\r\n\t// paint lower priorities first\r\n\t// then higher priorities on top\r\n\tfor(int prio=NB_PRIORITIES; prio > 0; )\r\n\t{\r\n\t\tprio--;\r\n\t\titem = &(gpu->itemsForPriority[prio]);\r\n\t\t// render BGs\r\n\t\tif (BG_enabled)\r\n\t\t{\r\n\t\t\tfor (int i=0; i < item->nbBGs; i++) \r\n\t\t\t{\r\n\t\t\t\ti16 = item->BGs[i];\r\n\t\t\t\tif (gpu->LayersEnable[i16])\r\n\t\t\t\t{\r\n\t\t\t\t\tgpu->currBgNum = (u8)i16;\r\n\t\t\t\t\tgpu->blend1 = (gpu->BLDCNT & (1 << gpu->currBgNum))!=0;\r\n\r\n\t\t\t\t\tstruct _BGxCNT *bgCnt = &(gpu->dispx_st)->dispx_BGxCNT[i16].bits;\r\n\t\t\t\t\tgpu->curr_mosaic_enabled = bgCnt->Mosaic_Enable;\r\n\r\n\t\t\t\t\tif (gpu->core == GPU_MAIN)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (i16 == 0 && dispCnt->BG0_3D)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tgpu->currBgNum = 0;\r\n\r\n\t\t\t\t\t\t\tconst u16 hofs = gpu->getHOFS(i16);\r\n\r\n\t\t\t\t\t\t\tgfx3d_GetLineData(l, &gpu->_3dColorLine);\r\n\t\t\t\t\t\t\tu8* colorLine = gpu->_3dColorLine;\r\n\r\n\t\t\t\t\t\t\tfor(int k = 0; k < 256; k++)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tint q = ((k + hofs) & 0x1FF);\r\n\r\n\t\t\t\t\t\t\t\tif((q < 0) || (q > 255))\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t\tif(colorLine[(q<<2)+3])\r\n\t\t\t\t\t\t\t\t\tgpu->setFinalColor3d(k, q);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//useful for debugging individual layers\r\n\t\t\t\t\t//if(gpu->core == 1 || i16 != 2) continue;\r\n\r\n\r\n\r\n\r\n#ifndef DISABLE_MOSAIC\r\n\t\t\t\t\tif(gpu->curr_mosaic_enabled)\r\n\t\t\t\t\t\tgpu->modeRender<true>(i16);\r\n\t\t\t\t\telse \r\n#endif\r\n\t\t\t\t\t\tgpu->modeRender<false>(i16);\r\n\t\t\t\t} //layer enabled\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// render sprite Pixels\r\n\t\tif (gpu->LayersEnable[4])\r\n\t\t{\r\n\t\t\tgpu->currBgNum = 4;\r\n\t\t\tgpu->blend1 = (gpu->BLDCNT & (1 << gpu->currBgNum))!=0;\r\n\t\t\t\r\n\t\t\tfor (int i=0; i < item->nbPixelsX; i++)\r\n\t\t\t{\r\n\t\t\t\ti16=item->PixelsX[i];\r\n\t\t\t\tsetFinalColorSpr(gpu, gpu->currDst, HostReadWord(spr, (i16<<1)), sprAlpha[i16], sprType[i16], i16);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\ntemplate<bool SKIP> static void GPU_RenderLine_DispCapture(u16 l)\r\n{\r\n\t//this macro takes advantage of the fact that there are only two possible values for capx\r\n\t#define CAPCOPY(SRC,DST,SETALPHABIT) \\\r\n\tswitch(gpu->dispCapCnt.capx) { \\\r\n\t\tcase DISPCAPCNT::_128: \\\r\n\t\t\tfor (int i = 0; i < 128; i++)  \\\r\n\t\t\t\tHostWriteWord(DST, i << 1, HostReadWord(SRC, i << 1) | (SETALPHABIT?(1<<15):0)); \\\r\n\t\t\tbreak; \\\r\n\t\tcase DISPCAPCNT::_256: \\\r\n\t\t\tfor (int i = 0; i < 256; i++)  \\\r\n\t\t\t\tHostWriteWord(DST, i << 1, HostReadWord(SRC, i << 1) | (SETALPHABIT?(1<<15):0)); \\\r\n\t\t\tbreak; \\\r\n\t\t\tdefault: assert(false); \\\r\n\t\t}\r\n\t\r\n\tGPU * gpu = MainScreen.gpu;\r\n\r\n\tif (l == 0)\r\n\t{\r\n\t\tif (gpu->dispCapCnt.val & 0x80000000)\r\n\t\t{\r\n\t\t\tgpu->dispCapCnt.enabled = TRUE;\r\n\t\t\tT1WriteLong(MMU.ARM9_REG, 0x64, gpu->dispCapCnt.val);\r\n\t\t}\r\n\t}\r\n\r\n\tbool skip = SKIP;\r\n\r\n\tif (gpu->dispCapCnt.enabled)\r\n\t{\r\n\t\t//128-wide captures should write linearly into memory, with no gaps\r\n\t\t//this is tested by hotel dusk\r\n\t\tu32 ofsmul = gpu->dispCapCnt.capx==DISPCAPCNT::_128?256:512;\r\n\t\tu32 cap_src_adr = gpu->dispCapCnt.readOffset * 0x8000 + (l * 512);\r\n\t\tu32 cap_dst_adr = gpu->dispCapCnt.writeOffset * 0x8000 + (l * ofsmul);\r\n\r\n\t\t//Read/Write block wrap to 00000h when exceeding 1FFFFh (128k)\r\n\t\t//this has not been tested yet (I thought I needed it for hotel dusk, but it was fixed by the above)\r\n\t\tcap_src_adr &= 0x1FFFF;\r\n\t\tcap_dst_adr &= 0x1FFFF;\r\n\r\n\t\tcap_src_adr += gpu->dispCapCnt.readBlock * 0x20000;\r\n\t\tcap_dst_adr += gpu->dispCapCnt.writeBlock * 0x20000;\r\n\r\n\t\tu8* cap_src = MMU.ARM9_LCD + cap_src_adr;\r\n\t\tu8* cap_dst = MMU.ARM9_LCD + cap_dst_adr;\r\n\r\n\t\t//we must block captures when the capture dest is not mapped to LCDC\r\n\t\tif(vramConfiguration.banks[gpu->dispCapCnt.writeBlock].purpose != VramConfiguration::LCDC)\r\n\t\t\tskip = true;\r\n\r\n\t\t//we must return zero from reads from memory not mapped to lcdc\r\n\t\tif(vramConfiguration.banks[gpu->dispCapCnt.readBlock].purpose != VramConfiguration::LCDC)\r\n\t\t\tcap_src = MMU.blank_memory;\r\n\r\n\t\tif(!skip)\r\n\t\tif (l < gpu->dispCapCnt.capy)\r\n\t\t{\r\n\t\t\tswitch (gpu->dispCapCnt.capSrc)\r\n\t\t\t{\r\n\t\t\t\tcase 0:\t\t// Capture source is SourceA\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//INFO(\"Capture source is SourceA\\n\");\r\n\t\t\t\t\t\tswitch (gpu->dispCapCnt.srcA)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tcase 0:\t\t\t// Capture screen (BG + OBJ + 3D)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t//INFO(\"Capture screen (BG + OBJ + 3D)\\n\");\r\n\r\n\t\t\t\t\t\t\t\t\tu8 *src;\r\n\t\t\t\t\t\t\t\t\tsrc = (u8*)(gpu->tempScanline);\r\n\t\t\t\t\t\t\t\t\tCAPCOPY(src,cap_dst,true);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 1:\t\t\t// Capture 3D\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t//INFO(\"Capture 3D\\n\");\r\n\t\t\t\t\t\t\t\t\tu16* colorLine;\r\n\t\t\t\t\t\t\t\t\tgfx3d_GetLineData15bpp(l, &colorLine);\r\n\t\t\t\t\t\t\t\t\tCAPCOPY(((u8*)colorLine),cap_dst,false);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\t\t// Capture source is SourceB\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//INFO(\"Capture source is SourceB\\n\");\r\n\t\t\t\t\t\tswitch (gpu->dispCapCnt.srcB)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tcase 0:\t\r\n\t\t\t\t\t\t\t\t//Capture VRAM\r\n\t\t\t\t\t\t\t\tCAPCOPY(cap_src,cap_dst,true);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\t\t\t//capture dispfifo\r\n\t\t\t\t\t\t\t\t//(not yet tested)\r\n\t\t\t\t\t\t\t\tfor(int i=0; i < 128; i++)\r\n\t\t\t\t\t\t\t\t\tT1WriteLong(cap_dst, i << 2, DISP_FIFOrecv());\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\tdefault:\t// Capture source is SourceA+B blended\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t//INFO(\"Capture source is SourceA+B blended\\n\");\r\n\t\t\t\t\t\tu16 *srcA = NULL;\r\n\t\t\t\t\t\tu16 *srcB = NULL;\r\n\r\n\t\t\t\t\t\tif (gpu->dispCapCnt.srcA == 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t// Capture screen (BG + OBJ + 3D)\r\n\t\t\t\t\t\t\tsrcA = (u16*)(gpu->tempScanline);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tgfx3d_GetLineData15bpp(l, &srcA);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tstatic u16 fifoLine[256];\r\n\r\n\t\t\t\t\t\tif (gpu->dispCapCnt.srcB == 0)\t\t\t// VRAM screen\r\n\t\t\t\t\t\t\tsrcB = (u16 *)cap_src;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t//fifo - tested by splinter cell chaos theory thermal view\r\n\t\t\t\t\t\t\tsrcB = fifoLine;\r\n\t\t\t\t\t\t\tfor (int i=0; i < 128; i++)\r\n\t\t\t\t\t\t\t\tT1WriteLong((u8*)srcB, i << 2, DISP_FIFOrecv());\r\n\t\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t\tconst int todo = (gpu->dispCapCnt.capx==DISPCAPCNT::_128?128:256);\r\n\r\n\t\t\t\t\t\tfor(u16 i = 0; i < todo; i++) \r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tu16 a,r,g,b;\r\n\r\n\t\t\t\t\t\t\tu16 a_alpha = srcA[i] & 0x8000;\r\n\t\t\t\t\t\t\tu16 b_alpha = srcB[i] & 0x8000;\r\n\r\n\t\t\t\t\t\t\tif(a_alpha)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ta = 0x8000;\r\n\t\t\t\t\t\t\t\tr = ((srcA[i] & 0x1F) * gpu->dispCapCnt.EVA);\r\n\t\t\t\t\t\t\t\tg = (((srcA[i] >>  5) & 0x1F) * gpu->dispCapCnt.EVA);\r\n\t\t\t\t\t\t\t\tb = (((srcA[i] >>  10) & 0x1F) * gpu->dispCapCnt.EVA);\r\n\t\t\t\t\t\t\t} \r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\ta = r = g = b = 0;\r\n\r\n\t\t\t\t\t\t\tif(b_alpha)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ta = 0x8000;\r\n\t\t\t\t\t\t\t\tr += ((srcB[i] & 0x1F) * gpu->dispCapCnt.EVB);\r\n\t\t\t\t\t\t\t\tg += (((srcB[i] >>  5) & 0x1F) * gpu->dispCapCnt.EVB);\r\n\t\t\t\t\t\t\t\tb += (((srcB[i] >> 10) & 0x1F) * gpu->dispCapCnt.EVB);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tr >>= 4;\r\n\t\t\t\t\t\t\tg >>= 4;\r\n\t\t\t\t\t\t\tb >>= 4;\r\n\r\n\t\t\t\t\t\t\t//freedom wings sky will overflow while doing some fsaa/motionblur effect without this\r\n\t\t\t\t\t\t\tr = std::min((u16)31,r);\r\n\t\t\t\t\t\t\tg = std::min((u16)31,g);\r\n\t\t\t\t\t\t\tb = std::min((u16)31,b);\r\n\r\n\t\t\t\t\t\t\tHostWriteWord(cap_dst, i << 1, a | (b << 10) | (g << 5) | r);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (l>=191)\r\n\t\t{\r\n\t\t\tgpu->dispCapCnt.enabled = FALSE;\r\n\t\t\tgpu->dispCapCnt.val &= 0x7FFFFFFF;\r\n\t\t\tT1WriteLong(MMU.ARM9_REG, 0x64, gpu->dispCapCnt.val);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic INLINE void GPU_RenderLine_MasterBrightness(NDS_Screen * screen, u16 l)\r\n{\r\n\tGPU * gpu = screen->gpu;\r\n\r\n\tu8 * dst =  GPU_screen + (screen->offset + l) * 512;\r\n\tu16 i16;\r\n\r\n\t//isn't it odd that we can set uselessly high factors here?\r\n\t//factors above 16 change nothing. curious.\r\n\tint factor = gpu->MasterBrightFactor;\r\n\tif(factor==0) return;\r\n\tif(factor>16) factor=16;\r\n\r\n\r\n\t//Apply final brightness adjust (MASTER_BRIGHT)\r\n\t//http://nocash.emubase.de/gbatek.htm#dsvideo (Under MASTER_BRIGHTNESS)\r\n\t\r\n\tswitch (gpu->MasterBrightMode)\r\n\t{\r\n\t\t// Disabled\r\n\t\tcase 0:\r\n\t\t\tbreak;\r\n\r\n\t\t// Bright up\r\n\t\tcase 1:\r\n\t\t{\r\n\t\t\tif(factor != 16)\r\n\t\t\t{\r\n\t\t\t\tfor(i16 = 0; i16 < 256; ++i16)\r\n\t\t\t\t{\r\n\t\t\t\t\t((u16*)dst)[i16] = fadeInColors[factor][((u16*)dst)[i16]&0x7FFF];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t// all white (optimization)\r\n\t\t\t\tfor(i16 = 0; i16 < 256; ++i16)\r\n\t\t\t\t\t((u16*)dst)[i16] = 0x7FFF;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t// Bright down\r\n\t\tcase 2:\r\n\t\t{\r\n\t\t\tif(factor != 16)\r\n\t\t\t{\r\n\t\t\t\tfor(i16 = 0; i16 < 256; ++i16)\r\n\t\t\t\t{\r\n\t\t\t\t\t((u16*)dst)[i16] = fadeOutColors[factor][((u16*)dst)[i16]&0x7FFF];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t// all black (optimization)\r\n\t\t\t\tmemset(dst, 0, 512);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\t// Reserved\r\n\t\tcase 3:\r\n\t\t\tbreak;\r\n\t }\r\n\r\n}\r\n\r\ntemplate<int WIN_NUM>\r\nFORCEINLINE void GPU::setup_windows()\r\n{\r\n\tu8 y = currLine;\r\n\tu16 startY,endY;\r\n\r\n\tif(WIN_NUM==0)\r\n\t{\r\n\t\tstartY = WIN0V0;\r\n\t\tendY = WIN0V1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tstartY = WIN1V0;\r\n\t\tendY = WIN1V1;\r\n\t}\r\n\r\n\tif(WIN_NUM == 0 && !WIN0_ENABLED) goto allout;\r\n\tif(WIN_NUM == 1 && !WIN1_ENABLED) goto allout;\r\n\r\n\tif(startY > endY)\r\n\t{\r\n\t\tif((y < startY) && (y > endY)) goto allout;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif((y < startY) || (y >= endY)) goto allout;\r\n\t}\r\n\r\n\t//the x windows will apply for this scanline\r\n\tcurr_win[WIN_NUM] = h_win[WIN_NUM];\r\n\treturn;\r\n\t\r\nallout:\r\n\tcurr_win[WIN_NUM] = win_empty;\r\n}\r\n\r\nvoid GPU::update_winh(int WIN_NUM)\r\n{\r\n\t//dont even waste any time in here if the window isnt enabled\r\n\tif(WIN_NUM==0 && !WIN0_ENABLED) return;\r\n\tif(WIN_NUM==1 && !WIN1_ENABLED) return;\r\n\r\n\tneed_update_winh[WIN_NUM] = false;\r\n\tu16 startX,endX;\r\n\r\n\tif(WIN_NUM==0)\r\n\t{\r\n\t\tstartX = WIN0H0;\r\n\t\tendX = WIN0H1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tstartX = WIN1H0;\r\n\t\tendX = WIN1H1;\r\n\t}\r\n\r\n\t//the original logic: if you doubt the window code, please check it against the newer implementation below\r\n\t//if(startX > endX)\r\n\t//{\r\n\t//\tif((x < startX) && (x > endX)) return false;\r\n\t//}\r\n\t//else\r\n\t//{\r\n\t//\tif((x < startX) || (x >= endX)) return false;\r\n\t//}\r\n\r\n\tif(startX > endX)\r\n\t{\r\n\t\tfor(int i=0;i<=endX;i++)\r\n\t\t\th_win[WIN_NUM][i] = 1;\r\n\t\tfor(int i=endX+1;i<startX;i++)\r\n\t\t\th_win[WIN_NUM][i] = 0;\r\n\t\tfor(int i=startX;i<256;i++)\r\n\t\t\th_win[WIN_NUM][i] = 1;\r\n\t} else\r\n\t{\r\n\t\tfor(int i=0;i<startX;i++)\r\n\t\t\th_win[WIN_NUM][i] = 0;\r\n\t\tfor(int i=startX;i<endX;i++)\r\n\t\t\th_win[WIN_NUM][i] = 1;\r\n\t\tfor(int i=endX;i<256;i++)\r\n\t\t\th_win[WIN_NUM][i] = 0;\r\n\t}\r\n}\r\n\r\nvoid GPU_RenderLine(NDS_Screen * screen, u16 l, bool skip)\r\n{\r\n\tGPU * gpu = screen->gpu;\r\n\r\n\t//here is some setup which is only done on line 0\r\n\tif(l == 0) {\r\n\t\t//this is speculative. the idea is as follows:\r\n\t\t//whenever the user updates the affine start position regs, it goes into the active regs immediately\r\n\t\t//(this is handled on the set event from MMU)\r\n\t\t//maybe it shouldnt take effect until the next hblank or something..\r\n\t\t//this is a based on a combination of:\r\n\t\t//heroes of mana intro FMV\r\n\t\t//SPP level 3-8 rotoscale room\r\n\t\t//NSMB raster fx backdrops\r\n\t\t//bubble bobble revolution classic mode\r\n\t\t//NOTE:\r\n\t\t//I am REALLY unsatisfied with this logic now. But it seems to be working..\r\n\t\tgpu->refreshAffineStartRegs(-1,-1);\r\n\t}\r\n\r\n\tif(skip)\r\n\t{\r\n\t\tgpu->currLine = l;\r\n\t\tif (gpu->core == GPU_MAIN) \r\n\t\t{\r\n\t\t\tGPU_RenderLine_DispCapture<true>(l);\r\n\t\t\tif (l == 191) { disp_fifo.head = disp_fifo.tail = 0; }\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\t//blacken the screen if it is turned off by the user\r\n\tif(!CommonSettings.showGpu.screens[gpu->core])\r\n\t{\r\n\t\tu8 * dst =  GPU_screen + (screen->offset + l) * 512;\r\n\t\tmemset(dst,0,512);\r\n\t\treturn;\r\n\t}\r\n\r\n\t// skip some work if master brightness makes the screen completely white or completely black\r\n\tif(gpu->MasterBrightFactor >= 16 && (gpu->MasterBrightMode == 1 || gpu->MasterBrightMode == 2))\r\n\t{\r\n\t\t// except if it could cause any side effects (for example if we're capturing), then don't skip anything\r\n\t\tif(!(gpu->core == GPU_MAIN && (gpu->dispCapCnt.enabled || l == 0 || l == 191)))\r\n\t\t{\r\n\t\t\tgpu->currLine = l;\r\n\t\t\tGPU_RenderLine_MasterBrightness(screen, l);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\t//cache some parameters which are assumed to be stable throughout the rendering of the entire line\r\n\tgpu->currLine = l;\r\n\tu16 mosaic_control = T1ReadWord((u8 *)&gpu->dispx_st->dispx_MISC.MOSAIC, 0);\r\n\tu16 mosaic_width = (mosaic_control & 0xF);\r\n\tu16 mosaic_height = ((mosaic_control>>4) & 0xF);\r\n\r\n\t//mosaic test hacks\r\n\t//mosaic_width = mosaic_height = 3;\r\n\r\n\tGPU::mosaicLookup.widthValue = mosaic_width;\r\n\tGPU::mosaicLookup.heightValue = mosaic_height;\r\n\tGPU::mosaicLookup.width = &GPU::mosaicLookup.table[mosaic_width][0];\r\n\tGPU::mosaicLookup.height = &GPU::mosaicLookup.table[mosaic_height][0];\r\n\r\n\tif(gpu->need_update_winh[0]) gpu->update_winh(0);\r\n\tif(gpu->need_update_winh[1]) gpu->update_winh(1);\r\n\r\n\tgpu->setup_windows<0>();\r\n\tgpu->setup_windows<1>();\r\n\r\n\t//generate the 2d engine output\r\n\tif(gpu->dispMode == 1) {\r\n\t\t//optimization: render straight to the output buffer when thats what we are going to end up displaying anyway\r\n\t\tgpu->tempScanline = screen->gpu->currDst = (u8 *)(GPU_screen) + (screen->offset + l) * 512;\r\n\t} else {\r\n\t\t//otherwise, we need to go to a temp buffer\r\n\t\tgpu->tempScanline = screen->gpu->currDst = (u8 *)gpu->tempScanlineBuffer;\r\n\t}\r\n\r\n\tGPU_RenderLine_layer(screen, l);\r\n\r\n\tswitch (gpu->dispMode)\r\n\t{\r\n\t\tcase 0: // Display Off(Display white)\r\n\t\t\t{\r\n\t\t\t\tu8 * dst =  GPU_screen + (screen->offset + l) * 512;\r\n\r\n\t\t\t\tfor (int i=0; i<256; i++)\r\n\t\t\t\t\tHostWriteWord(dst, i << 1, 0x7FFF);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 1: // Display BG and OBJ layers\r\n\t\t\t//do nothing: it has already been generated into the right place\r\n\t\t\tbreak;\r\n\r\n\t\tcase 2: // Display vram framebuffer\r\n\t\t\t{\r\n\t\t\t\tu8 * dst = GPU_screen + (screen->offset + l) * 512;\r\n\t\t\t\tu8 * src = gpu->VRAMaddr + (l*512);\r\n\t\t\t\tmemcpy (dst, src, 512);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 3: // Display memory FIFO\r\n\t\t\t{\r\n\t\t\t\t//this has not been tested since the dma timing for dispfifo was changed around the time of\r\n\t\t\t\t//newemuloop. it may not work.\r\n\t\t\t\tu8 * dst =  GPU_screen + (screen->offset + l) * 512;\r\n\t\t\t\tfor (int i=0; i < 128; i++)\r\n\t\t\t\t\tT1WriteLong(dst, i << 2, DISP_FIFOrecv() & 0x7FFF7FFF);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t//capture after displaying so that we can safely display vram before overwriting it here\r\n\tif (gpu->core == GPU_MAIN) \r\n\t{\r\n\t\t//BUG!!! if someone is capturing and displaying both from the fifo, then it will have been \r\n\t\t//consumed above by the display before we get here\r\n\t\t//(is that even legal? i think so)\r\n\t\tGPU_RenderLine_DispCapture<false>(l);\r\n\t\tif (l == 191) { disp_fifo.head = disp_fifo.tail = 0; }\r\n\t}\r\n\r\n\r\n\tGPU_RenderLine_MasterBrightness(screen, l);\r\n}\r\n\r\nvoid gpu_savestate(EMUFILE* os)\r\n{\r\n\t//version\r\n\twrite32le(1,os);\r\n\t\r\n\tos->fwrite((char*)GPU_screen,sizeof(GPU_screen));\r\n\t\r\n\twrite32le(MainScreen.gpu->affineInfo[0].x,os);\r\n\twrite32le(MainScreen.gpu->affineInfo[0].y,os);\r\n\twrite32le(MainScreen.gpu->affineInfo[1].x,os);\r\n\twrite32le(MainScreen.gpu->affineInfo[1].y,os);\r\n\twrite32le(SubScreen.gpu->affineInfo[0].x,os);\r\n\twrite32le(SubScreen.gpu->affineInfo[0].y,os);\r\n\twrite32le(SubScreen.gpu->affineInfo[1].x,os);\r\n\twrite32le(SubScreen.gpu->affineInfo[1].y,os);\r\n}\r\n\r\nbool gpu_loadstate(EMUFILE* is, int size)\r\n{\r\n\t//read version\r\n\tu32 version;\r\n\r\n\t//sigh.. shouldve used a new version number\r\n\tif(size == 256*192*2*2)\r\n\t\tversion = 0;\r\n\telse if(size== 0x30024)\r\n\t{\r\n\t\tread32le(&version,is);\r\n\t\tversion = 1;\r\n\t}\r\n\telse\r\n\t\tif(read32le(&version,is) != 1) return false;\r\n\t\t\r\n\r\n\tif(version<0||version>1) return false;\r\n\r\n\tis->fread((char*)GPU_screen,sizeof(GPU_screen));\r\n\r\n\tif(version==1)\r\n\t{\r\n\t\tread32le(&MainScreen.gpu->affineInfo[0].x,is);\r\n\t\tread32le(&MainScreen.gpu->affineInfo[0].y,is);\r\n\t\tread32le(&MainScreen.gpu->affineInfo[1].x,is);\r\n\t\tread32le(&MainScreen.gpu->affineInfo[1].y,is);\r\n\t\tread32le(&SubScreen.gpu->affineInfo[0].x,is);\r\n\t\tread32le(&SubScreen.gpu->affineInfo[0].y,is);\r\n\t\tread32le(&SubScreen.gpu->affineInfo[1].x,is);\r\n\t\tread32le(&SubScreen.gpu->affineInfo[1].y,is);\r\n\t\t//removed per nitsuja feedback. anyway, this same thing will happen almost immediately in gpu line=0\r\n\t\t//MainScreen.gpu->refreshAffineStartRegs(-1,-1);\r\n\t\t//SubScreen.gpu->refreshAffineStartRegs(-1,-1);\r\n\t}\r\n\r\n\tMainScreen.gpu->updateBLDALPHA();\r\n\tSubScreen.gpu->updateBLDALPHA();\r\n\treturn !is->fail();\r\n}\r\n\r\nu32 GPU::getAffineStart(int layer, int xy)\r\n{\r\n\tif(xy==0) return affineInfo[layer-2].x;\r\n\telse return affineInfo[layer-2].y;\r\n}\r\n\r\nvoid GPU::setAffineStartWord(int layer, int xy, u16 val, int word)\r\n{\r\n\tu32 curr = getAffineStart(layer,xy);\r\n\tif(word==0) curr = (curr&0xFFFF0000)|val;\r\n\telse curr = (curr&0x0000FFFF)|(((u32)val)<<16);\r\n\tsetAffineStart(layer,xy,curr);\r\n}\r\n\r\nvoid GPU::setAffineStart(int layer, int xy, u32 val)\r\n{\r\n\tif(xy==0) affineInfo[layer-2].x = val;\r\n\telse affineInfo[layer-2].y = val;\r\n\trefreshAffineStartRegs(layer,xy);\r\n}\r\n\r\nvoid GPU::refreshAffineStartRegs(const int num, const int xy)\r\n{\r\n\tif(num==-1)\r\n\t{\r\n\t\trefreshAffineStartRegs(2,xy);\r\n\t\trefreshAffineStartRegs(3,xy);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif(xy==-1)\r\n\t{\r\n\t\trefreshAffineStartRegs(num,0);\r\n\t\trefreshAffineStartRegs(num,1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tBGxPARMS * parms;\r\n\tif (num==2)\r\n\t\tparms = &(dispx_st)->dispx_BG2PARMS;\r\n\telse\r\n\t\tparms = &(dispx_st)->dispx_BG3PARMS;\t\t\r\n\r\n\tif(xy==0)\r\n\t\tparms->BGxX = affineInfo[num-2].x;\r\n\telse\r\n\t\tparms->BGxY = affineInfo[num-2].y;\r\n}\r\n\r\ntemplate<bool MOSAIC> void GPU::modeRender(int layer)\r\n{\r\n\tswitch(GPU_mode2type[dispCnt().BG_Mode][layer])\r\n\t{\r\n\t\tcase BGType_Text: lineText<MOSAIC>(this); break;\r\n\t\tcase BGType_Affine: lineRot<MOSAIC>(this); break;\r\n\t\tcase BGType_AffineExt: lineExtRot<MOSAIC>(this); break;\r\n\t\tcase BGType_Large8bpp: lineExtRot<MOSAIC>(this); break;\r\n\t\tcase BGType_Invalid: \r\n\t\t\tPROGINFO(\"Attempting to render an invalid BG type\\n\");\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid gpu_SetRotateScreen(u16 angle)\r\n{\r\n\tgpu_angle = angle;\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/GPU.h",
    "content": "/*\r\n\tCopyright (C) 2006 yopyop\r\n\tCopyright (C) 2006-2007 Theo Berkau\r\n\tCopyright (C) 2007 shash\r\n\tCopyright (C) 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef GPU_H\r\n#define GPU_H\r\n\r\n#include <stdio.h>\r\n#include \"mem.h\"\r\n#include \"common.h\"\r\n#include \"registers.h\"\r\n#include \"FIFO.h\"\r\n#include \"MMU.h\"\r\n#include <iosfwd>\r\n\r\n//#undef FORCEINLINE\r\n//#define FORCEINLINE\r\n\r\nvoid gpu_savestate(EMUFILE* os);\r\nbool gpu_loadstate(EMUFILE* is, int size);\r\n\r\n/*******************************************************************************\r\n    this structure is for display control,\r\n    it holds flags for general display\r\n*******************************************************************************/\r\n\r\n#ifdef WORDS_BIGENDIAN\r\nstruct _DISPCNT\r\n{\r\n/* 7*/  u8 ForceBlank:1;      // A+B:\r\n/* 6*/  u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB)\r\n/* 5*/  u8 OBJ_BMP_2D_dim:1;  // A+B: 0=128x512,    1=256x256 pixels\r\n/* 4*/  u8 OBJ_Tile_mapping:1;// A+B: 0=2D (32KB),  1=1D (32..256KB)\r\n/* 3*/  u8 BG0_3D:1;          // A  : 0=2D,         1=3D\r\n/* 0*/  u8 BG_Mode:3;         // A+B:\r\n/*15*/  u8 WinOBJ_Enable:1;   // A+B: 0=disable, 1=Enable\r\n/*14*/  u8 Win1_Enable:1;     // A+B: 0=disable, 1=Enable\r\n/*13*/  u8 Win0_Enable:1;     // A+B: 0=disable, 1=Enable\r\n/*12*/  u8 OBJ_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/*11*/  u8 BG3_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/*10*/  u8 BG2_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/* 9*/  u8 BG1_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/* 8*/  u8 BG0_Enable:1;        // A+B: 0=disable, 1=Enable\r\n/*23*/  u8 OBJ_HBlank_process:1;    // A+B: OBJ processed during HBlank (GBA bit5)\r\n/*22*/  u8 OBJ_BMP_1D_Bound:1;      // A  :\r\n/*20*/  u8 OBJ_Tile_1D_Bound:2;     // A+B:\r\n/*18*/  u8 VRAM_Block:2;            // A  : VRAM block (0..3=A..D)\r\n\r\n/*16*/  u8 DisplayMode:2;     // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap)\r\n                                    // 0=off (white screen)\r\n                                    // 1=on (normal BG & OBJ layers)\r\n                                    // 2=VRAM display (coreA only)\r\n                                    // 3=RAM display (coreA only, DMA transfers)\r\n\r\n/*31*/  u8 ExOBJPalette_Enable:1;   // A+B: 0=disable, 1=Enable OBJ extended Palette\r\n/*30*/  u8 ExBGxPalette_Enable:1;   // A+B: 0=disable, 1=Enable BG extended Palette\r\n/*27*/  u8 ScreenBase_Block:3;      // A  : Screen Base (64K step)\r\n/*24*/  u8 CharacBase_Block:3;      // A  : Character Base (64K step)\r\n};\r\n#else\r\nstruct _DISPCNT\r\n{\r\n/* 0*/  u8 BG_Mode:3;         // A+B:\r\n/* 3*/  u8 BG0_3D:1;          // A  : 0=2D,         1=3D\r\n/* 4*/  u8 OBJ_Tile_mapping:1;     // A+B: 0=2D (32KB),  1=1D (32..256KB)\r\n/* 5*/  u8 OBJ_BMP_2D_dim:1;  // A+B: 0=128x512,    1=256x256 pixels\r\n/* 6*/  u8 OBJ_BMP_mapping:1; // A+B: 0=2D (128KB), 1=1D (128..256KB)\r\n\r\n                                    // 7-15 same as GBA\r\n/* 7*/  u8 ForceBlank:1;      // A+B:\r\n/* 8*/  u8 BG0_Enable:1;        // A+B: 0=disable, 1=Enable\r\n/* 9*/  u8 BG1_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/*10*/  u8 BG2_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/*11*/  u8 BG3_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/*12*/  u8 OBJ_Enable:1;      // A+B: 0=disable, 1=Enable\r\n/*13*/  u8 Win0_Enable:1;     // A+B: 0=disable, 1=Enable\r\n/*14*/  u8 Win1_Enable:1;     // A+B: 0=disable, 1=Enable\r\n/*15*/  u8 WinOBJ_Enable:1;   // A+B: 0=disable, 1=Enable\r\n\r\n/*16*/  u8 DisplayMode:2;     // A+B: coreA(0..3) coreB(0..1) GBA(Green Swap)\r\n                                    // 0=off (white screen)\r\n                                    // 1=on (normal BG & OBJ layers)\r\n                                    // 2=VRAM display (coreA only)\r\n                                    // 3=RAM display (coreA only, DMA transfers)\r\n\r\n/*18*/  u8 VRAM_Block:2;            // A  : VRAM block (0..3=A..D)\r\n/*20*/  u8 OBJ_Tile_1D_Bound:2;     // A+B:\r\n/*22*/  u8 OBJ_BMP_1D_Bound:1;      // A  :\r\n/*23*/  u8 OBJ_HBlank_process:1;    // A+B: OBJ processed during HBlank (GBA bit5)\r\n/*24*/  u8 CharacBase_Block:3;      // A  : Character Base (64K step)\r\n/*27*/  u8 ScreenBase_Block:3;      // A  : Screen Base (64K step)\r\n/*30*/  u8 ExBGxPalette_Enable:1;   // A+B: 0=disable, 1=Enable BG extended Palette\r\n/*31*/  u8 ExOBJPalette_Enable:1;   // A+B: 0=disable, 1=Enable OBJ extended Palette\r\n};\r\n#endif\r\n\r\ntypedef union\r\n{\r\n    struct _DISPCNT bits;\r\n    u32 val;\r\n} DISPCNT;\r\n#define BGxENABLED(cnt,num)    ((num<8)? ((cnt.val>>8) & num):0)\r\n\r\n\r\nenum BlendFunc\r\n{\r\n\tNone, Blend, Increase, Decrease\r\n};\r\n\r\n\r\n/*******************************************************************************\r\n    this structure is for display control of a specific layer,\r\n    there are 4 background layers\r\n    their priority indicate which one to draw on top of the other\r\n    some flags indicate special drawing mode, size, FX\r\n*******************************************************************************/\r\n\r\n#ifdef WORDS_BIGENDIAN\r\nstruct _BGxCNT\r\n{\r\n/* 7*/ u8 Palette_256:1;         // 0=16x16, 1=1*256 palette\r\n/* 6*/ u8 Mosaic_Enable:1;       // 0=disable, 1=Enable mosaic\r\n/* 2*/ u8 CharacBase_Block:4;    // individual character base offset (n*16KB)\r\n/* 0*/ u8 Priority:2;            // 0..3=high..low\r\n/*14*/ u8 ScreenSize:2;          // text    : 256x256 512x256 256x512 512x512\r\n                                       // x/rot/s : 128x128 256x256 512x512 1024x1024\r\n                                       // bmp     : 128x128 256x256 512x256 512x512\r\n                                       // large   : 512x1024 1024x512 - -\r\n/*13*/ u8 PaletteSet_Wrap:1;     // BG0 extended palette set 0=set0, 1=set2\r\n                                       // BG1 extended palette set 0=set1, 1=set3\r\n                                       // BG2 overflow area wraparound 0=off, 1=wrap\r\n                                       // BG3 overflow area wraparound 0=off, 1=wrap\r\n/* 8*/ u8 ScreenBase_Block:5;    // individual screen base offset (text n*2KB, BMP n*16KB)\r\n};\r\n#else\r\nstruct _BGxCNT\r\n{\r\n/* 0*/ u8 Priority:2;            // 0..3=high..low\r\n/* 2*/ u8 CharacBase_Block:4;    // individual character base offset (n*16KB)\r\n/* 6*/ u8 Mosaic_Enable:1;       // 0=disable, 1=Enable mosaic\r\n/* 7*/ u8 Palette_256:1;         // 0=16x16, 1=1*256 palette\r\n/* 8*/ u8 ScreenBase_Block:5;    // individual screen base offset (text n*2KB, BMP n*16KB)\r\n/*13*/ u8 PaletteSet_Wrap:1;     // BG0 extended palette set 0=set0, 1=set2\r\n                                       // BG1 extended palette set 0=set1, 1=set3\r\n                                       // BG2 overflow area wraparound 0=off, 1=wrap\r\n                                       // BG3 overflow area wraparound 0=off, 1=wrap\r\n/*14*/ u8 ScreenSize:2;          // text    : 256x256 512x256 256x512 512x512\r\n                                       // x/rot/s : 128x128 256x256 512x512 1024x1024\r\n                                       // bmp     : 128x128 256x256 512x256 512x512\r\n                                       // large   : 512x1024 1024x512 - -\r\n};\r\n#endif\r\n\r\n\r\ntypedef union\r\n{\r\n    struct _BGxCNT bits;\r\n    u16 val;\r\n} BGxCNT;\r\n\r\n/*******************************************************************************\r\n    this structure is for background offset\r\n*******************************************************************************/\r\n\r\ntypedef struct {\r\n    u16 BGxHOFS;\r\n    u16 BGxVOFS;\r\n} BGxOFS;\r\n\r\n/*******************************************************************************\r\n    this structure is for rotoscale parameters\r\n*******************************************************************************/\r\n\r\ntypedef struct {\r\n    s16 BGxPA;\r\n    s16 BGxPB;\r\n    s16 BGxPC;\r\n    s16 BGxPD;\r\n    s32 BGxX;\r\n    s32 BGxY;\r\n} BGxPARMS;\r\n\r\n\r\n/*******************************************************************************\r\n\tthese structures are for window description,\r\n\twindows are square regions and can \"subclass\"\r\n\tbackground layers or object layers (i.e window controls the layers)\r\n\r\n\tscreen\r\n\t|\r\n\t+-- Window0/Window1/OBJwindow/OutOfWindows\r\n\t\t|\r\n\t\t+-- BG0/BG1/BG2/BG3/OBJ\r\n*******************************************************************************/\r\n\r\ntypedef union {\r\n\tstruct\t{\r\n\t\tu8 end:8;\r\n\t\tu8 start:8;\r\n\t} bits ;\r\n\tu16 val;\r\n} WINxDIM;\r\n\r\n#ifdef WORDS_BIGENDIAN\r\ntypedef struct {\r\n/* 6*/  u8 :2;\r\n/* 5*/  u8 WINx_Effect_Enable:1;\r\n/* 4*/  u8 WINx_OBJ_Enable:1;\r\n/* 3*/  u8 WINx_BG3_Enable:1;\r\n/* 2*/  u8 WINx_BG2_Enable:1;\r\n/* 1*/  u8 WINx_BG1_Enable:1;\r\n/* 0*/  u8 WINx_BG0_Enable:1;\r\n} WINxBIT;\r\n#else\r\ntypedef struct {\r\n/* 0*/  u8 WINx_BG0_Enable:1;\r\n/* 1*/  u8 WINx_BG1_Enable:1;\r\n/* 2*/  u8 WINx_BG2_Enable:1;\r\n/* 3*/  u8 WINx_BG3_Enable:1;\r\n/* 4*/  u8 WINx_OBJ_Enable:1;\r\n/* 5*/  u8 WINx_Effect_Enable:1;\r\n/* 6*/  u8 :2;\r\n} WINxBIT;\r\n#endif\r\n\r\n#ifdef WORDS_BIGENDIAN\r\ntypedef union {\r\n\tstruct {\r\n\t\tWINxBIT win0;\r\n\t\tWINxBIT win1;\r\n\t} bits;\r\n\tstruct {\r\n\t\tu8 :3;\r\n\t\tu8 win0_en:5;\r\n\t\tu8 :3;\r\n\t\tu8 win1_en:5;\r\n\t} packed_bits;\r\n\tstruct {\r\n\t\tu8 low;\r\n\t\tu8 high;\r\n\t} bytes;\r\n\tu16 val ;\r\n} WINxCNT ;\r\n#else\r\ntypedef union {\r\n\tstruct {\r\n\t\tWINxBIT win0;\r\n\t\tWINxBIT win1;\r\n\t} bits;\r\n\tstruct {\r\n\t\tu8 win0_en:5;\r\n\t\tu8 :3;\r\n\t\tu8 win1_en:5;\r\n\t\tu8 :3;\r\n\t} packed_bits;\r\n\tstruct {\r\n\t\tu8 low;\r\n\t\tu8 high;\r\n\t} bytes;\r\n\tu16 val ;\r\n} WINxCNT ;\r\n#endif\r\n\r\n/*\r\ntypedef struct {\r\n    WINxDIM WIN0H;\r\n    WINxDIM WIN1H;\r\n    WINxDIM WIN0V;\r\n    WINxDIM WIN1V;\r\n    WINxCNT WININ;\r\n    WINxCNT WINOUT;\r\n} WINCNT;\r\n*/\r\n\r\n/*******************************************************************************\r\n    this structure is for miscellanous settings\r\n    //TODO: needs further description\r\n*******************************************************************************/\r\n\r\ntypedef struct {\r\n    u16 MOSAIC;\r\n    u16 unused1;\r\n    u16 unused2;//BLDCNT;\r\n    u16 unused3;//BLDALPHA;\r\n    u16 unused4;//BLDY;\r\n    u16 unused5;\r\n\t/*\r\n    u16 unused6;\r\n    u16 unused7;\r\n    u16 unused8;\r\n    u16 unused9;\r\n\t*/\r\n} MISCCNT;\r\n\r\n\r\n/*******************************************************************************\r\n    this structure is for 3D settings\r\n*******************************************************************************/\r\n\r\nstruct _DISP3DCNT\r\n{\r\n/* 0*/ u8 EnableTexMapping:1;    //\r\n/* 1*/ u8 PolygonShading:1;      // 0=Toon Shading, 1=Highlight Shading\r\n/* 2*/ u8 EnableAlphaTest:1;     // see ALPHA_TEST_REF\r\n/* 3*/ u8 EnableAlphaBlending:1; // see various Alpha values\r\n/* 4*/ u8 EnableAntiAliasing:1;  //\r\n/* 5*/ u8 EnableEdgeMarking:1;   // see EDGE_COLOR\r\n/* 6*/ u8 FogOnlyAlpha:1;        // 0=Alpha and Color, 1=Only Alpha (see FOG_COLOR)\r\n/* 7*/ u8 EnableFog:1;           // Fog Master Enable\r\n/* 8*/ u8 FogShiftSHR:4;         // 0..10 SHR-Divider (see FOG_OFFSET)\r\n/*12*/ u8 AckColorBufferUnderflow:1; // Color Buffer RDLINES Underflow (0=None, 1=Underflow/Acknowledge)\r\n/*13*/ u8 AckVertexRAMOverflow:1;    // Polygon/Vertex RAM Overflow    (0=None, 1=Overflow/Acknowledge)\r\n/*14*/ u8 RearPlaneMode:1;       // 0=Blank, 1=Bitmap\r\n/*15*/ u8 :1;\r\n/*16*/ u16 :16;\r\n};\r\n\r\ntypedef union\r\n{\r\n    struct _DISP3DCNT bits;\r\n    u32 val;\r\n} DISP3DCNT;\r\n\r\n/*******************************************************************************\r\n    this structure is for capture control (core A only)\r\n\r\n    source:\r\n    http://nocash.emubase.de/gbatek.htm#dsvideocaptureandmainmemorydisplaymode\r\n*******************************************************************************/\r\nstruct DISPCAPCNT\r\n{\r\n\tenum CAPX {\r\n\t\t_128, _256\r\n\t} capx;\r\n    u32 val;\r\n\tBOOL enabled;\r\n\tu8 EVA;\r\n\tu8 EVB;\r\n\tu8 writeBlock;\r\n\tu8 writeOffset;\r\n\tu16 capy;\r\n\tu8 srcA;\r\n\tu8 srcB;\r\n\tu8 readBlock;\r\n\tu8 readOffset;\r\n\tu8 capSrc;\r\n} ;\r\n\r\n/*******************************************************************************\r\n    this structure holds everything and should be mapped to\r\n    * core A : 0x04000000\r\n    * core B : 0x04001000\r\n*******************************************************************************/\r\n\r\ntypedef struct _reg_dispx {\r\n    DISPCNT dispx_DISPCNT;            // 0x0400x000\r\n    u16 dispA_DISPSTAT;               // 0x04000004\r\n    u16 dispx_VCOUNT;                 // 0x0400x006\r\n    BGxCNT dispx_BGxCNT[4];           // 0x0400x008\r\n    BGxOFS dispx_BGxOFS[4];           // 0x0400x010\r\n    BGxPARMS dispx_BG2PARMS;          // 0x0400x020\r\n    BGxPARMS dispx_BG3PARMS;          // 0x0400x030\r\n    u8\t\t\tfiller[12];           // 0x0400x040\r\n    MISCCNT dispx_MISC;               // 0x0400x04C\r\n    DISP3DCNT dispA_DISP3DCNT;        // 0x04000060\r\n    DISPCAPCNT dispA_DISPCAPCNT;      // 0x04000064\r\n    u32 dispA_DISPMMEMFIFO;           // 0x04000068\r\n} REG_DISPx ;\r\n\r\n\r\ntypedef BOOL (*fun_gl_Begin) (int screen);\r\ntypedef void (*fun_gl_End) (int screen);\r\n// the GUI should use this function prior to all gl calls\r\n// if call to beg succeeds opengl draw\r\nvoid register_gl_fun(fun_gl_Begin beg,fun_gl_End end);\r\n\r\n#define GPU_MAIN\t0\r\n#define GPU_SUB\t\t1\r\n\r\n/* human readable bitmask names */\r\n#define ADDRESS_STEP_512B\t   0x00200\r\n#define ADDRESS_STEP_1KB\t\t0x00400\r\n#define ADDRESS_STEP_2KB\t\t0x00800\r\n#define ADDRESS_STEP_4KB\t\t0x01000\r\n#define ADDRESS_STEP_8KB\t\t0x02000\r\n#define ADDRESS_STEP_16KB\t   0x04000\r\n#define ADDRESS_STEP_32KB\t   0x08000\r\n#define ADDRESS_STEP_64KB\t   0x10000\r\n#define ADDRESS_STEP_128KB\t   0x20000\r\n#define ADDRESS_STEP_256KB\t   0x40000\r\n#define ADDRESS_STEP_512KB\t   0x80000\r\n#define ADDRESS_MASK_256KB\t   (ADDRESS_STEP_256KB-1)\r\n\r\n#ifdef WORDS_BIGENDIAN\r\nstruct _TILEENTRY\r\n{\r\n/*14*/\tunsigned Palette:4;\r\n/*13*/\tunsigned VFlip:1;\t// VERTICAL FLIP (top<-->bottom)\r\n/*12*/\tunsigned HFlip:1;\t// HORIZONTAL FLIP (left<-->right)\r\n/* 0*/\tunsigned TileNum:10;\r\n};\r\n#else\r\nstruct _TILEENTRY\r\n{\r\n/* 0*/\tunsigned TileNum:10;\r\n/*12*/\tunsigned HFlip:1;\t// HORIZONTAL FLIP (left<-->right)\r\n/*13*/\tunsigned VFlip:1;\t// VERTICAL FLIP (top<-->bottom)\r\n/*14*/\tunsigned Palette:4;\r\n};\r\n#endif\r\ntypedef union\r\n{\r\n\tstruct _TILEENTRY bits;\r\n\tu16 val;\r\n} TILEENTRY;\r\n\r\nstruct _ROTOCOORD\r\n{\r\n\tu32 Fraction:8;\r\n\ts32 Integer:20;\r\n\tu32 pad:4;\r\n};\r\ntypedef union\r\n{\r\n\tstruct _ROTOCOORD bits;\r\n\ts32 val;\r\n} ROTOCOORD;\r\n\r\n\r\n/*\r\n\tthis structure is for color representation,\r\n\tit holds 5 meaningful bits per color channel (red,green,blue)\r\n\tand\t  1 meaningful bit for alpha representation\r\n\tthis bit can be unused or used for special FX\r\n*/\r\n\r\nstruct _COLOR { // abgr x555\r\n#ifdef WORDS_BIGENDIAN\r\n\tunsigned alpha:1;    // sometimes it is unused (pad)\r\n\tunsigned blue:5;\r\n\tunsigned green:5;\r\n\tunsigned red:5;\r\n#else\r\n     unsigned red:5;\r\n     unsigned green:5;\r\n     unsigned blue:5;\r\n     unsigned alpha:1;    // sometimes it is unused (pad)\r\n#endif\r\n};\r\nstruct _COLORx { // abgr x555\r\n\tunsigned bgr:15;\r\n\tunsigned alpha:1;\t// sometimes it is unused (pad)\r\n};\r\n\r\ntypedef union\r\n{\r\n\tstruct _COLOR bits;\r\n\tstruct _COLORx bitx;\r\n\tu16 val;\r\n} COLOR;\r\n\r\nstruct _COLOR32 { // ARGB\r\n\tunsigned :3;\r\n\tunsigned blue:5;\r\n\tunsigned :3;\r\n\tunsigned green:5;\r\n\tunsigned :3;\r\n\tunsigned red:5;\r\n\tunsigned :7;\r\n\tunsigned alpha:1;\t// sometimes it is unused (pad)\r\n};\r\n\r\ntypedef union\r\n{\r\n\tstruct _COLOR32 bits;\r\n\tu32 val;\r\n} COLOR32;\r\n\r\n#define COLOR_16_32(w,i)\t\\\r\n\t/* doesnt matter who's 16bit who's 32bit */ \\\r\n\ti.bits.red   = w.bits.red; \\\r\n\ti.bits.green = w.bits.green; \\\r\n\ti.bits.blue  = w.bits.blue; \\\r\n\ti.bits.alpha = w.bits.alpha;\r\n\r\n\r\n\r\n // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap)\r\nenum GPU_OBJ_MODE\r\n{\r\n\tGPU_OBJ_MODE_Normal = 0,\r\n\tGPU_OBJ_MODE_Transparent = 1,\r\n\tGPU_OBJ_MODE_Window = 2,\r\n\tGPU_OBJ_MODE_Bitmap = 3\r\n};\r\n\r\n/*\r\n\tthis structure is for Sprite description,\r\n\tit holds flags & transformations for 1 sprite\r\n\t(max 128 OBJs / screen)\r\nref: http://www.bottledlight.com/ds/index.php/Video/Sprites\r\n*/\r\n\r\nstruct _OAM_\r\n{\r\n#ifdef WORDS_BIGENDIAN\r\n// attr0\r\n/* 0*/    unsigned Y:8;\r\n/*14*/    unsigned Shape:2;    // (00: Square, 01: Wide, 10: Tall, 11: Illegal)\r\n/*13*/    unsigned Depth:1;    // (0: 16, 1: 256)\r\n/*12*/    unsigned Mosaic:1;   // (1: Enabled)\r\n/*10*/    unsigned Mode:2;     // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap)\r\n/* 8*/    unsigned RotScale:2; // (00: Normal, 01: Rot/scale, 10: Disabled, 11: Double-size rot/scale)\r\n// attr1\r\n/* 0*/    signed   X:9;\r\n/*14*/    unsigned Size:2;\r\n/*13*/    unsigned VFlip:1;\r\n/*12*/    unsigned HFlip:1;\r\n/* 9*/    unsigned RotScalIndex:3; // Rot/scale matrix index\r\n// attr2\r\n/* 0*/    unsigned TileIndex:10;\r\n/*12*/    unsigned PaletteIndex:4;\r\n/*10*/    unsigned Priority:2;\r\n// attr3\r\n          unsigned attr3:16;    \r\n#else\r\n// attr0\r\n/* 0*/\tunsigned Y:8;\r\n/* 8*/\tunsigned RotScale:2; // (00: Normal, 01: Rot/scale, 10: Disabled, 11: Double-size rot/scale)\r\n/*10*/\tunsigned Mode:2;\t // (00: Normal, 01: Transparent, 10: Object window, 11: Bitmap)\r\n/*12*/\tunsigned Mosaic:1;   // (1: Enabled)\r\n/*13*/\tunsigned Depth:1;\t// (0: 16, 1: 256)\r\n/*14*/\tunsigned Shape:2;\t// (00: Square, 01: Wide, 10: Tall, 11: Illegal)\r\n// attr1\r\n/* 0*/\tsigned   X:9;\r\n/* 9*/\tunsigned RotScalIndex:3; // Rot/scale matrix index\r\n/*12*/\tunsigned HFlip:1;\r\n/*13*/\tunsigned VFlip:1;\r\n/*14*/\tunsigned Size:2;\r\n// attr2\r\n/* 0*/\tunsigned TileIndex:10;\r\n/*10*/\tunsigned Priority:2;\r\n/*12*/\tunsigned PaletteIndex:4;\r\n// attr3\r\n\tunsigned attr3:16;\r\n#endif\r\n};\r\n\r\ntypedef struct\r\n{\r\n#ifdef WORDS_BIGENDIAN\r\n\t u8 attr00;\r\n\t u8 attr01;\r\n\t u8 attr10;\r\n\t u8 attr11;\r\n\t u8 attr20;\r\n\t u8 attr21;\r\n\t u8 attr30;\r\n\t u8 attr31;\r\n#else\r\n\t u16 attr0;\r\n\t u16 attr1;\r\n\t u16 attr2;\r\n\t u16 attr3;\r\n#endif\r\n} OAM;\r\n\r\n\r\ntypedef struct\r\n{\r\n\t s16 x;\r\n\t s16 y;\r\n} size;\r\n\r\n\r\n\r\n\r\n/*\r\n\tthis structure holds information\r\n\tfor rendering.\r\n*/\r\n\r\n#define NB_PRIORITIES\t4\r\n#define NB_BG\t\t4\r\ntypedef struct\r\n{\r\n\tu8 PixelsX[256];\r\n\tu8 BGs[NB_BG], nbBGs;\r\n\tu8 pad[1];\r\n\tu16 nbPixelsX;\r\n\t//256+8:\r\n\tu8 pad2[248];\r\n\r\n\t//things were slower when i organized this struct this way. whatever.\r\n\t//u8 PixelsX[256];\r\n\t//int BGs[NB_BG], nbBGs;\r\n\t//int nbPixelsX;\r\n\t////<-- 256 + 24\r\n\t//u8 pad2[256-24];\r\n} itemsForPriority_t;\r\n#define MMU_ABG\t\t0x06000000\r\n#define MMU_BBG\t\t0x06200000\r\n#define MMU_AOBJ\t0x06400000\r\n#define MMU_BOBJ\t0x06600000\r\n#define MMU_LCDC\t0x06800000\r\n\r\nextern CACHE_ALIGN u8 gpuBlendTable555[17][17][32][32];\r\n\r\nenum BGType {\r\n\tBGType_Invalid=0, BGType_Text=1, BGType_Affine=2, BGType_Large8bpp=3, \r\n\tBGType_AffineExt=4, BGType_AffineExt_256x16=5, BGType_AffineExt_256x1=6, BGType_AffineExt_Direct=7\r\n};\r\n\r\nextern const BGType GPU_mode2type[8][4];\r\n\r\nstruct GPU\r\n{\r\n\tGPU()\r\n\t\t: debug(false)\r\n\t{}\r\n\r\n\t// some structs are becoming redundant\r\n\t// some functions too (no need to recopy some vars as it is done by MMU)\r\n\tREG_DISPx * dispx_st;\r\n\r\n\t//this indicates whether this gpu is handling debug tools\r\n\tbool debug;\r\n\r\n\t_BGxCNT & bgcnt(int num) { return (dispx_st)->dispx_BGxCNT[num].bits; }\r\n\t_DISPCNT & dispCnt() { return dispx_st->dispx_DISPCNT.bits; }\r\n\ttemplate<bool MOSAIC> void modeRender(int layer);\r\n\r\n\tDISPCAPCNT dispCapCnt;\r\n\tBOOL LayersEnable[5];\r\n\titemsForPriority_t itemsForPriority[NB_PRIORITIES];\r\n\r\n#define BGBmpBB BG_bmp_ram\r\n#define BGChBB BG_tile_ram\r\n\r\n\tu32 BG_bmp_large_ram[4];\r\n\tu32 BG_bmp_ram[4];\r\n\tu32 BG_tile_ram[4];\r\n\tu32 BG_map_ram[4];\r\n\r\n\tu8 BGExtPalSlot[4];\r\n\tu32 BGSize[4][2];\r\n\tBGType BGTypes[4];\r\n\r\n\tstruct MosaicColor {\r\n\t\tu16 bg[4][256];\r\n\t\tstruct Obj {\r\n\t\t\tu16 color;\r\n\t\t\tu8 alpha, opaque;\r\n\t\t} obj[256];\r\n\t} mosaicColors;\r\n\r\n\tu8 sprNum[256];\r\n\tu8 h_win[2][256];\r\n\tconst u8 *curr_win[2];\r\n\tvoid update_winh(int WIN_NUM); \r\n\tbool need_update_winh[2];\r\n\t\r\n\ttemplate<int WIN_NUM> void setup_windows();\r\n\r\n\tu8 core;\r\n\r\n\tu8 dispMode;\r\n\tu8 vramBlock;\r\n\tu8 *VRAMaddr;\r\n\r\n\t//FIFO\tfifo;\r\n\r\n\tu8 bgPrio[5];\r\n\r\n\tBOOL bg0HasHighestPrio;\r\n\r\n\tOAM * oam;\r\n\tu32\tsprMem;\r\n\tu8 sprBoundary;\r\n\tu8 sprBMPBoundary;\r\n\tu8 sprBMPMode;\r\n\tu32 sprEnable;\r\n\r\n\tu8 WIN0H0;\r\n\tu8 WIN0H1;\r\n\tu8 WIN0V0;\r\n\tu8 WIN0V1;\r\n\r\n\tu8 WIN1H0;\r\n\tu8 WIN1H1;\r\n\tu8 WIN1V0;\r\n\tu8 WIN1V1;\r\n\r\n\tu8 WININ0;\r\n\tbool WININ0_SPECIAL;\r\n\tu8 WININ1;\r\n\tbool WININ1_SPECIAL;\r\n\r\n\tu8 WINOUT;\r\n\tbool WINOUT_SPECIAL;\r\n\tu8 WINOBJ;\r\n\tbool WINOBJ_SPECIAL;\r\n\r\n\tu8 WIN0_ENABLED;\r\n\tu8 WIN1_ENABLED;\r\n\tu8 WINOBJ_ENABLED;\r\n\r\n\tu16 BLDCNT;\r\n\tu8\tBLDALPHA_EVA;\r\n\tu8\tBLDALPHA_EVB;\r\n\tu8\tBLDY_EVY;\r\n\tu16 *currentFadeInColors, *currentFadeOutColors;\r\n\tbool blend2[8];\r\n\r\n\tCACHE_ALIGN u16 tempScanlineBuffer[256];\r\n\tu8 *tempScanline;\r\n\r\n\tu8\tMasterBrightMode;\r\n\tu32 MasterBrightFactor;\r\n\r\n\tCACHE_ALIGN u8 bgPixels[1024]; //yes indeed, this is oversized. map debug tools try to write to it\r\n\r\n\tu32 currLine;\r\n\tu8 currBgNum;\r\n\tbool blend1;\r\n\tu8* currDst;\r\n\r\n\tu8* _3dColorLine;\r\n\r\n\r\n\tstatic struct MosaicLookup {\r\n\r\n\t\tstruct TableEntry {\r\n\t\t\tu8 begin, trunc;\r\n\t\t} table[16][256];\r\n\r\n\t\tMosaicLookup() {\r\n\t\t\tfor(int m=0;m<16;m++)\r\n\t\t\t\tfor(int i=0;i<256;i++) {\r\n\t\t\t\t\tint mosaic = m+1;\r\n\t\t\t\t\tTableEntry &te = table[m][i];\r\n\t\t\t\t\tte.begin = (i%mosaic==0);\r\n\t\t\t\t\tte.trunc = i/mosaic*mosaic;\r\n\t\t\t\t}\r\n\t\t}\r\n\r\n\t\tTableEntry *width, *height;\r\n\t\tint widthValue, heightValue;\r\n\t\t\r\n\t} mosaicLookup;\r\n\tbool curr_mosaic_enabled;\r\n\r\n\tu16 blend(u16 colA, u16 colB);\r\n\r\n\ttemplate<bool BACKDROP, BlendFunc FUNC, bool WINDOW>\r\n\tFORCEINLINE FASTCALL bool _master_setFinalBGColor(u16 &color, const u32 x);\r\n\r\n\ttemplate<BlendFunc FUNC, bool WINDOW>\r\n\tFORCEINLINE FASTCALL void _master_setFinal3dColor(int dstX, int srcX);\r\n\r\n\tint setFinalColorBck_funcNum;\r\n\tint bgFunc;\r\n\tint setFinalColor3d_funcNum;\r\n\tint setFinalColorSpr_funcNum;\r\n\t//Final3DColFunct setFinalColor3D;\r\n\tenum SpriteRenderMode {\r\n\t\tSPRITE_1D, SPRITE_2D\r\n\t} spriteRenderMode;\r\n\r\n\ttemplate<GPU::SpriteRenderMode MODE>\r\n\tvoid _spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab);\r\n\t\r\n\tinline void spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab)\r\n\t{\r\n\t\tif(spriteRenderMode == SPRITE_1D)\r\n\t\t\t_spriteRender<SPRITE_1D>(dst,dst_alpha,typeTab, prioTab);\r\n\t\telse\r\n\t\t\t_spriteRender<SPRITE_2D>(dst,dst_alpha,typeTab, prioTab);\r\n\t}\r\n\r\n\r\n\tvoid setFinalColor3d(int dstX, int srcX);\r\n\t\r\n\ttemplate<bool BACKDROP, int FUNCNUM> void setFinalColorBG(u16 color, const u32 x);\r\n\ttemplate<bool MOSAIC, bool BACKDROP> FORCEINLINE void __setFinalColorBck(u16 color, const u32 x, const int opaque);\r\n\ttemplate<bool MOSAIC, bool BACKDROP, int FUNCNUM> FORCEINLINE void ___setFinalColorBck(u16 color, const u32 x, const int opaque);\r\n\r\n\tvoid setAffineStart(int layer, int xy, u32 val);\r\n\tvoid setAffineStartWord(int layer, int xy, u16 val, int word);\r\n\tu32 getAffineStart(int layer, int xy);\r\n\tvoid refreshAffineStartRegs(const int num, const int xy);\r\n\r\n\tstruct AffineInfo {\r\n\t\tAffineInfo() : x(0), y(0) {}\r\n\t\tu32 x, y;\r\n\t} affineInfo[2];\r\n\r\n\tvoid renderline_checkWindows(u16 x, bool &draw, bool &effect) const;\r\n\r\n\t// check whether (x,y) is within the rectangle (including wraparounds) \r\n\ttemplate<int WIN_NUM>\r\n\tu8 withinRect(u16 x) const;\r\n\r\n\tvoid setBLDALPHA(u16 val)\r\n\t{\r\n\t\tBLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f); \r\n\t\tBLDALPHA_EVB = ((val>>8)&0x1f) > 16 ? 16 : ((val>>8)&0x1f);\r\n\t\tupdateBLDALPHA();\r\n\t}\r\n\r\n\tvoid setBLDALPHA_EVA(u8 val)\r\n\t{\r\n\t\tBLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f);\r\n\t\tupdateBLDALPHA();\r\n\t}\r\n\t\r\n\tvoid setBLDALPHA_EVB(u8 val)\r\n\t{\r\n\t\tBLDALPHA_EVB = (val&0x1f) > 16 ? 16 : (val&0x1f);\r\n\t\tupdateBLDALPHA();\r\n\t}\r\n\r\n\tu32 getHOFS(int bg) { return T1ReadWord(&dispx_st->dispx_BGxOFS[bg].BGxHOFS,0) & 0x1FF; }\r\n\tu32 getVOFS(int bg) { return T1ReadWord(&dispx_st->dispx_BGxOFS[bg].BGxVOFS,0) & 0x1FF; }\r\n\r\n\ttypedef u8 TBlendTable[32][32];\r\n\tTBlendTable *blendTable;\r\n\r\n\tvoid updateBLDALPHA()\r\n\t{\r\n\t\tblendTable = (TBlendTable*)&gpuBlendTable555[BLDALPHA_EVA][BLDALPHA_EVB][0][0];\r\n\t}\r\n\t\r\n};\r\n#if 0\r\n// normally should have same addresses\r\nstatic void REG_DISPx_pack_test(GPU * gpu)\r\n{\r\n\tREG_DISPx * r = gpu->dispx_st;\r\n\tprintf (\"%08x %02x\\n\",  (u32)r, (u32)(&r->dispx_DISPCNT) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispA_DISPSTAT) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispx_VCOUNT) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispx_BGxCNT[0]) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispx_BGxOFS[0]) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispx_BG2PARMS) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispx_BG3PARMS) - (u32)r);\r\n//\tprintf (\"\\t%02x\\n\", (u32)(&r->dispx_WINCNT) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispx_MISC) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispA_DISP3DCNT) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispA_DISPCAPCNT) - (u32)r);\r\n\tprintf (\"\\t%02x\\n\", (u32)(&r->dispA_DISPMMEMFIFO) - (u32)r);\r\n}\r\n#endif\r\n\r\nCACHE_ALIGN extern u8 GPU_screen[4*256*192];\r\n\r\n\r\nGPU * GPU_Init(u8 l);\r\nvoid GPU_Reset(GPU *g, u8 l);\r\nvoid GPU_DeInit(GPU *);\r\n\r\n//these are functions used by debug tools which want to render layers etc outside the context of the emulation\r\nnamespace GPU_EXT\r\n{\r\n\tvoid textBG(GPU * gpu, u8 num, u8 * DST);\t\t//Draw text based background\r\n\tvoid rotBG(GPU * gpu, u8 num, u8 * DST);\r\n\tvoid extRotBG(GPU * gpu, u8 num, u8 * DST);\r\n};\r\nvoid sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab);\r\nvoid sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab);\r\n\r\nextern const size sprSizeTab[4][4];\r\n\r\ntypedef struct {\r\n\tGPU * gpu;\r\n\tu16 offset;\r\n} NDS_Screen;\r\n\r\nextern NDS_Screen MainScreen;\r\nextern NDS_Screen SubScreen;\r\n\r\nint Screen_Init(int coreid);\r\nvoid Screen_Reset(void);\r\nvoid Screen_DeInit(void);\r\n\r\nextern MMU_struct MMU;\r\n\r\n\r\n\r\n#define GFXCORE_DEFAULT\t\t -1\r\n#define GFXCORE_DUMMY\t\t   0\r\n\r\n#define GFXCORE_FULLSCREEN\t  (1 << 0)\r\n\r\nstruct GraphicsInterface_struct\r\n{\r\n   int id; // ID number for core(see above defines)\r\n   const char *Name; // Name of core\r\n   int flags; // What features the core supports(full screen, etc.)\r\n   int (*Init)(); // Initializes stuff related to core\r\n   void (*DeInit)(); // Deinitializes stuff related to core\r\n   void (*Resize)(int width, int height, BOOL fullscreen); // Resizes window or fullscreen\r\n   void (*OnScreenText)(char *string, ...); // For handling save state messages, etc.\r\n} ;\r\n\r\nextern GraphicsInterface_struct GFXDummy;\r\n\r\nvoid GPU_setVideoProp(GPU *, u32 p);\r\nvoid GPU_setBGProp(GPU *, u16 num, u16 p);\r\n\r\nvoid GPU_setBLDCNT(GPU *gpu, u16 v) ;\r\nvoid GPU_setBLDY(GPU *gpu, u16 v) ;\r\nvoid GPU_setMOSAIC(GPU *gpu, u16 v) ;\r\n\r\n\r\nvoid GPU_remove(GPU *, u8 num);\r\nvoid GPU_addBack(GPU *, u8 num);\r\n\r\nint GPU_ChangeGraphicsCore(int coreid);\r\n\r\nvoid GPU_set_DISPCAPCNT(u32 val) ;\r\nvoid GPU_RenderLine(NDS_Screen * screen, u16 l, bool skip = false) ;\r\nvoid GPU_setMasterBrightness (GPU *gpu, u16 val);\r\n\r\ninline void GPU_setWIN0_H(GPU* gpu, u16 val) { gpu->WIN0H0 = val >> 8; gpu->WIN0H1 = val&0xFF; gpu->need_update_winh[0] = true; }\r\ninline void GPU_setWIN0_H0(GPU* gpu, u8 val) { gpu->WIN0H0 = val;  gpu->need_update_winh[0] = true; }\r\ninline void GPU_setWIN0_H1(GPU* gpu, u8 val) { gpu->WIN0H1 = val;  gpu->need_update_winh[0] = true; }\r\n\r\ninline void GPU_setWIN0_V(GPU* gpu, u16 val) { gpu->WIN0V0 = val >> 8; gpu->WIN0V1 = val&0xFF;}\r\ninline void GPU_setWIN0_V0(GPU* gpu, u8 val) { gpu->WIN0V0 = val; }\r\ninline void GPU_setWIN0_V1(GPU* gpu, u8 val) { gpu->WIN0V1 = val; }\r\n\r\ninline void GPU_setWIN1_H(GPU* gpu, u16 val) {gpu->WIN1H0 = val >> 8; gpu->WIN1H1 = val&0xFF;  gpu->need_update_winh[1] = true; }\r\ninline void GPU_setWIN1_H0(GPU* gpu, u8 val) { gpu->WIN1H0 = val;  gpu->need_update_winh[1] = true; }\r\ninline void GPU_setWIN1_H1(GPU* gpu, u8 val) { gpu->WIN1H1 = val;  gpu->need_update_winh[1] = true; }\r\n\r\ninline void GPU_setWIN1_V(GPU* gpu, u16 val) { gpu->WIN1V0 = val >> 8; gpu->WIN1V1 = val&0xFF; }\r\ninline void GPU_setWIN1_V0(GPU* gpu, u8 val) { gpu->WIN1V0 = val; }\r\ninline void GPU_setWIN1_V1(GPU* gpu, u8 val) { gpu->WIN1V1 = val; }\r\n\r\ninline void GPU_setWININ(GPU* gpu, u16 val) {\r\n\tgpu->WININ0=val&0x1F;\r\n\tgpu->WININ0_SPECIAL=((val>>5)&1)!=0;\r\n\tgpu->WININ1=(val>>8)&0x1F;\r\n\tgpu->WININ1_SPECIAL=((val>>13)&1)!=0;\r\n}\r\n\r\ninline void GPU_setWININ0(GPU* gpu, u8 val) { gpu->WININ0 = val&0x1F; gpu->WININ0_SPECIAL = (val>>5)&1; }\r\ninline void GPU_setWININ1(GPU* gpu, u8 val) { gpu->WININ1 = val&0x1F; gpu->WININ1_SPECIAL = (val>>5)&1; }\r\n\r\ninline void GPU_setWINOUT16(GPU* gpu, u16 val) {\r\n\tgpu->WINOUT=val&0x1F;\r\n\tgpu->WINOUT_SPECIAL=((val>>5)&1)!=0;\r\n\tgpu->WINOBJ=(val>>8)&0x1F;\r\n\tgpu->WINOBJ_SPECIAL=((val>>13)&1)!=0;\r\n}\r\ninline void GPU_setWINOUT(GPU* gpu, u8 val) { gpu->WINOUT = val&0x1F; gpu->WINOUT_SPECIAL = (val>>5)&1; }\r\ninline void GPU_setWINOBJ(GPU* gpu, u8 val) { gpu->WINOBJ = val&0x1F; gpu->WINOBJ_SPECIAL = (val>>5)&1; }\r\n\r\n// Blending\r\nvoid SetupFinalPixelBlitter (GPU *gpu);\r\n#define GPU_setBLDCNT_LOW(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF00) | (val); SetupFinalPixelBlitter (gpu);}\r\n#define GPU_setBLDCNT_HIGH(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF) | (val<<8); SetupFinalPixelBlitter (gpu);}\r\n#define GPU_setBLDCNT(gpu, val) {gpu->BLDCNT = (val); SetupFinalPixelBlitter (gpu);}\r\n\r\n\r\n\r\n#define GPU_setBLDY_EVY(gpu, val) {gpu->BLDY_EVY = ((val)&0x1f) > 16 ? 16 : ((val)&0x1f);}\r\n\r\n//these arent needed right now since the values get poked into memory via default mmu handling and dispx_st\r\n//#define GPU_setBGxHOFS(bg, gpu, val) gpu->dispx_st->dispx_BGxOFS[bg].BGxHOFS = ((val) & 0x1FF)\r\n//#define GPU_setBGxVOFS(bg, gpu, val) gpu->dispx_st->dispx_BGxOFS[bg].BGxVOFS = ((val) & 0x1FF)\r\n\r\nvoid gpu_SetRotateScreen(u16 angle);\r\n\r\n//#undef FORCEINLINE\r\n//#define FORCEINLINE __forceinline\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/GPU_osd.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"GPU_osd.h\"\n#include \"GPU.h\"\n#include \"mem.h\"\n#include <string.h> //mem funcs\n#include <stdarg.h> //va_start, etc\n#include <sstream>\n#include <stdio.h>\n#include <time.h>\n#ifndef ANDROID\n#include <glib.h>\n#else\n#include <sys/time.h>\n#endif\n#include \"debug.h\"\n\n#include \"aggdraw.h\"\n#include \"movie.h\"\n#include \"rtc.h\"\n#include \"NDSSystem.h\"\n#include \"mic.h\"\n#include \"saves.h\"\n\nbool HudEditorMode = false;\nOSDCLASS\t*osd = NULL;\nHudStruct Hud;\n\n//contains a timer to be used for well-timed hud components\nstatic s64 hudTimer;\n\nstatic void SetHudDummy (HudCoordinates *hud)\n{\n\thud->x=666;\n\thud->y=666;\n}\n\nstatic bool IsHudDummy (HudCoordinates *hud)\n{\n\treturn (hud->x == 666 && hud->y == 666);\n}\n\ntemplate<typename T>\nstatic T calcY(T y) // alters a GUI element y coordinate as necessary to obey swapScreens and singleScreen settings\n{\n\tif(osd->singleScreen)\n\t{\n\t\tif(y >= 192)\n\t\t\ty -= 192;\n\t\tif(osd->swapScreens)\n\t\t\ty += 192;\n\t}\n\telse if(osd->swapScreens)\n\t{\n\t\tif(y >= 192)\n\t\t\ty -= 192;\n\t\telse\n\t\t\ty += 192;\n\t}\n\treturn y;\n}\n\nvoid EditHud(s32 x, s32 y, HudStruct *hudstruct) {\n\n\tu32 i = 0;\n\n\twhile (!IsHudDummy(&hudstruct->hud(i))) {\n\t\tHudCoordinates &hud = hudstruct->hud(i);\n\n\t\t//reset\n\t\tif(!hud.clicked) {\n\t\t\thud.storedx=0;\n\t\t\thud.storedy=0;\n\t\t}\n\n\t\tif((x >= hud.x && x <= hud.x + hud.xsize) && \n\t\t\t(calcY(y) >= calcY(hud.y) && calcY(y) <= calcY(hud.y) + hud.ysize) && !hudstruct->clicked ) {\n\n\t\t\t\thud.clicked=1;\n\t\t\t\thud.storedx = x - hud.x;\n\t\t\t\thud.storedy = y - hud.y;\n\t\t}\n\n\t\tif(hud.clicked) {\n\t\t\thud.x = x - hud.storedx;\n\t\t\thud.y = y - hud.storedy;\n\t\t}\n\n\t\t//sanity checks\n\t\tif(hud.x < 0)  hud.x = 0;\n\t\tif(hud.y < 0)  hud.y = 0;\n\t\tif(hud.x > 245)hud.x = 245; //margins\n\t\tif(hud.y > 384-16)hud.y = 384-16;\n\n\t\tif(hud.clicked)\n\t\t{\n\t\t\thudstruct->clicked = true;\n\t\t\tbreak;//prevent items from grouping together\n\t\t}\n\n\t\ti++;\n\t}\n}\n\nvoid HudClickRelease(HudStruct *hudstruct) {\n\n\tu32 i = 0;\n\n\twhile (!IsHudDummy(&hudstruct->hud(i))) {\n\t\tHudCoordinates &hud = hudstruct->hud(i);\n\t\thud.clicked=0;\n\t\ti++;\n\t}\n\n\thudstruct->clicked = false;\n}\n\nvoid HudStruct::reset()\n{\n\tFpsDisplay.x=0;\n\tFpsDisplay.y=5;\n\tFpsDisplay.xsize=166;\n\tFpsDisplay.ysize=10;\n\n\tFrameCounter.x=0;\n\tFrameCounter.y=25;\n\tFrameCounter.xsize=60;\n\tFrameCounter.ysize=10;\n\n\tInputDisplay.x=0;\n\tInputDisplay.y=45;\n\tInputDisplay.xsize=220;\n\tInputDisplay.ysize=10;\n\n\tGraphicalInputDisplay.x=8;\n\tGraphicalInputDisplay.y=328;\n\tGraphicalInputDisplay.xsize=102;\n\tGraphicalInputDisplay.ysize=50;\n\n\tLagFrameCounter.x=0;\n\tLagFrameCounter.y=65;\n\tLagFrameCounter.xsize=30;\n\tLagFrameCounter.ysize=10;\n\t\n\tMicrophone.x=0;\n\tMicrophone.y=85;\n\tMicrophone.xsize=20;\n\tMicrophone.ysize=10;\n\n\tRTCDisplay.x=0;\n\tRTCDisplay.y=105;\n\tRTCDisplay.xsize=220;\n\tRTCDisplay.ysize=10;\n\n\tSavestateSlots.x = 8;\n\tSavestateSlots.y = 160;\n\tSavestateSlots.xsize = 240;\n\tSavestateSlots.ysize = 24;\n\n\tSetHudDummy(&Dummy);\n\tclicked = false;\n}\n\nstatic void joyFill(int n) {\n\n\tbool pressedForGame = NDS_getFinalUserInput().buttons.array[n];\n\tbool physicallyPressed = NDS_getRawUserInput().buttons.array[n];\n\tif(pressedForGame && physicallyPressed)\n\t\taggDraw.hud->fillColor(0,0,0,255);\n\telse if(pressedForGame)\n\t\taggDraw.hud->fillColor(255,0,0,255);\n\telse if(physicallyPressed)\n\t\taggDraw.hud->fillColor(0,255,0,255);\n\telse\n\t\taggDraw.hud->fillColor(255,255,255,255);\n}\n\nstatic void joyEllipse(double ex, double ey, int xc, int yc, int x, int y, double ratio, double rad, int button) {\n\n\tjoyFill(button);\n\taggDraw.hud->lineWidth(rad);\n\taggDraw.hud->ellipse(x+((xc*ex)*ratio), y+((yc*ey)*ratio), rad*ratio, rad*ratio);\n}\n\nstatic void joyRoundedRect(double x1, double y1, int x2, int y2, int alpha1, int alpha2, int button)\n{\n\tbool pressedForGame = NDS_getFinalUserInput().buttons.array[button];\n\tbool physicallyPressed = NDS_getRawUserInput().buttons.array[button];\n\tif(pressedForGame && physicallyPressed)\n\t\taggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,0,0,alpha1), agg::rgba8(0,0,0,alpha2));\n\telse if(pressedForGame)\n\t\taggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,0,0,alpha1), agg::rgba8(255,0,0,alpha2));\n\telse if(physicallyPressed)\n\t\taggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,255,0,alpha1), agg::rgba8(0,255,0,alpha2));\n\telse\n\t\treturn; //aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,255,255,alpha1), agg::rgba8(255,255,255,alpha2));\n\n\taggDraw.hud->roundedRect(x1,y1,x2,y2,1);\n}\n\n\nstatic void drawPad(double x, double y, double ratio) {\n\n\t// you might notice black/red/green colors used to show what buttons are pressed.\n\t// the logic is roughly:\n\t//    RED == PAST    (the button was held last frame)\n\t//  GREEN == FUTURE  (the button is physically held now)\n\t//  BLACK == PRESENT (the button was held last frame and is still physically held now)\n\n\t// aligning to odd half-pixel boundaries prevents agg2d from blurring thin straight lines\n\tx = floor(x) + 0.5;\n\ty = floor(calcY(y)) + 0.5;\n\tdouble xc = 41 - 0.5;\n\tdouble yc = 20 - 0.5;\n\n\taggDraw.hud->lineColor(128,128,128,255);\n\n\taggDraw.hud->fillLinearGradient(x, y, x+(xc*ratio), y+(yc*ratio), agg::rgba8(222,222,222,128), agg::rgba8(255,255,255,255));\n\n\taggDraw.hud->roundedRect (x, y, floor(x+(xc*ratio))+0.5, floor(y+(yc*ratio))+0.5, 1);\n\n\tdouble screenLeft = x+(xc*.25*ratio);\n\tdouble screenTop = y+(yc*.1*ratio);\n\tdouble screenRight = x+(xc*.745*ratio);\n\tdouble screenBottom = y+(yc*.845*ratio);\n\taggDraw.hud->fillLinearGradient(screenLeft, screenTop, screenRight, screenBottom, agg::rgba8(128,128,128,128), agg::rgba8(255,255,255,255));\n\taggDraw.hud->roundedRect (screenLeft, screenTop, screenRight, screenBottom, 1);\n\n\n\tjoyEllipse(.89,.45,xc,yc,x,y,ratio,1,6);//B\n\tjoyEllipse(.89,.22,xc,yc,x,y,ratio,1,3);//X\n\tjoyEllipse(.83,.34,xc,yc,x,y,ratio,1,4);//Y\n\tjoyEllipse(.95,.34,xc,yc,x,y,ratio,1,5);//A\n\tjoyEllipse(.82,.716,xc,yc,x,y,ratio,.5,7);//Start\n\tjoyEllipse(.82,.842,xc,yc,x,y,ratio,.5,8);//Select\n\n\n\tdouble dpadPoints [][2] = {\n\t\t{.04,.33}, // top-left corner of left button\n\t\t{.08,.33},\n\t\t{.08,.24}, // top-left corner of up button\n\t\t{.13,.24}, // top-right corner of up button\n\t\t{.13,.33},\n\t\t{.17,.33}, // top-right corner of right button\n\t\t{.17,.43}, // bottom-right corner of right button\n\t\t{.13,.43},\n\t\t{.13,.516}, // bottom-right corner of down button\n\t\t{.08,.516}, // bottom-left corner of down button\n\t\t{.08,.43},\n\t\t{.04,.43}, // bottom-left corner of left button\n\t};\n\tstatic const int numdpadPoints = sizeof(dpadPoints)/sizeof(dpadPoints[0]);\n\tfor(int i = 0; i < numdpadPoints; i++)\n\t{\n\t\tdpadPoints[i][0] = x+(xc*(dpadPoints[i][0]+.01)*ratio);\n\t\tdpadPoints[i][1] = y+(yc*(dpadPoints[i][1]+.00)*ratio);\n\t}\n\n\t// dpad outline\n\taggDraw.hud->fillColor(255,255,255,200);\n\taggDraw.hud->polygon((double*)dpadPoints, numdpadPoints);\n\n\taggDraw.hud->noLine();\n\n\t// left\n\tjoyRoundedRect(dpadPoints[0][0], dpadPoints[0][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 11);\n\t\n\t// right\n\tjoyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[6][0], dpadPoints[6][1], 0, 255, 12);\n\n\t// up\n\tjoyRoundedRect(dpadPoints[2][0], dpadPoints[2][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 9);\n\t\n\t// right\n\tjoyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[8][0], dpadPoints[8][1], 0, 255, 10);\n\n\t// left shoulder\n\tjoyRoundedRect(x+(xc*.00*ratio), y+(yc*.00*ratio), x+(xc*.15*ratio), y+(yc*.07*ratio), 255, 200, 2);\n\n\t// right shoulder\n\tjoyRoundedRect(x+(xc*.85*ratio), y+(yc*.00*ratio), x+(xc*1.0*ratio), y+(yc*.07*ratio), 200, 255, 1);\n\n\t// lid...\n\tjoyRoundedRect(x+(xc*.4*ratio), y+(yc*.96*ratio), x+(xc*0.6*ratio), y+(yc*1.0*ratio), 200, 200, 13);\n\n\t// touch pad\n\t{\n\t\tBOOL gameTouchOn = nds.isTouch;\n\t\tdouble gameTouchX = screenLeft+1 + (nds.scr_touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0;\n\t\tdouble gameTouchY = screenTop+1 + (nds.scr_touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0;\n\t\tbool physicalTouchOn = NDS_getRawUserInput().touch.isTouch;\n\t\tdouble physicalTouchX = screenLeft+1 + (NDS_getRawUserInput().touch.touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0;\n\t\tdouble physicalTouchY = screenTop+1 + (NDS_getRawUserInput().touch.touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0;\n\t\tif(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY)\n\t\t{\n\t\t\taggDraw.hud->fillColor(0,0,0,255);\n\t\t\taggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(physicalTouchOn)\n\t\t\t{\n\t\t\t\taggDraw.hud->fillColor(0,0,0,128);\n\t\t\t\taggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.5, ratio*0.5);\n\t\t\t\taggDraw.hud->fillColor(0,255,0,255);\n\t\t\t\taggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.37, ratio*0.37);\n\t\t\t}\n\t\t\tif(gameTouchOn)\n\t\t\t{\n\t\t\t\taggDraw.hud->fillColor(255,0,0,255);\n\t\t\t\taggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nstruct TouchInfo{\n\tu16 X;\n\tu16 Y;\n};\nstatic int touchalpha[8]= {31, 63, 95, 127, 159, 191, 223, 255};\nstatic TouchInfo temptouch;\nstatic const bool touchshadow = false;//true; // sorry, it's cool but also distracting and looks cleaner with it off. maybe if it drew line segments between touch points instead of isolated crosses...\nstatic std::vector<TouchInfo> touch (8);\n\nstatic void TextualInputDisplay() {\n\n\t// drawing the whole string at once looks ugly\n\t// (because of variable width font and the \"shadow\" appearing over blank space)\n\t// and can't give us the color-coded effects we want anyway (see drawPad for info)\n\n\tconst UserButtons& gameButtons = NDS_getFinalUserInput().buttons;\n\tconst UserButtons& physicalButtons = NDS_getRawUserInput().buttons;\n\n\tdouble x = Hud.InputDisplay.x;\n\n\t// from order FRLDUTSBAYXWEG where G is 0\n\tstatic const char* buttonChars = \"<^>vABXYLRSsgf\";\n\tstatic const int buttonIndex [14] = {11,9,12,10,5,6,3,4,2,1,7,8,0,13};\n\tfor(int i = 0; i < 14; i++, x+=11.0)\n\t{\n\t\tbool pressedForGame = gameButtons.array[buttonIndex[i]];\n\t\tbool physicallyPressed = physicalButtons.array[buttonIndex[i]];\n\t\tif(pressedForGame && physicallyPressed)\n\t\t\taggDraw.hud->lineColor(255,255,255,255);\n\t\telse if(pressedForGame)\n\t\t\taggDraw.hud->lineColor(255,48,48,255);\n\t\telse if(physicallyPressed)\n\t\t\taggDraw.hud->lineColor(0,192,0,255);\n\t\telse\n\t\t\tcontinue;\n\n\t\t// cast from char to std::string is a bit awkward\n\t\tstd::string str(buttonChars+i, 2);\n\t\tstr[1] = '\\0';\n\n\t\taggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str);\n\t}\n\n\t// touch pad\n\t{\n\t\tchar str [32];\n\t\tBOOL gameTouchOn = nds.isTouch;\n\t\tint gameTouchX = nds.adc_touchX >> 4;\n\t\tint gameTouchY = nds.adc_touchY >> 4;\n\t\tbool physicalTouchOn = NDS_getRawUserInput().touch.isTouch;\n\t\tint physicalTouchX = NDS_getRawUserInput().touch.touchX >> 4;\n\t\tint physicalTouchY = NDS_getRawUserInput().touch.touchY >> 4;\n\t\tif(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY)\n\t\t{\n\t\t\tsprintf(str, \"%d,%d\", gameTouchX, gameTouchY);\n\t\t\taggDraw.hud->lineColor(255,255,255,255);\n\t\t\taggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(gameTouchOn)\n\t\t\t{\n\t\t\t\tsprintf(str, \"%d,%d\", gameTouchX, gameTouchY);\n\t\t\t\taggDraw.hud->lineColor(255,48,48,255);\n\t\t\t\taggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)-(physicalTouchOn?8:0), str);\n\t\t\t}\n\t\t\tif(physicalTouchOn)\n\t\t\t{\n\t\t\t\tsprintf(str, \"%d,%d\", physicalTouchX, physicalTouchY);\n\t\t\t\taggDraw.hud->lineColor(0,192,0,255);\n\t\t\t\taggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)+(gameTouchOn?8:0), str);\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic void TouchDisplay() {\n\t// note: calcY should not be used in this function.\n\taggDraw.hud->lineWidth(1.0);\n\n\ttemptouch.X = NDS_getRawUserInput().touch.touchX >> 4;\n\ttemptouch.Y = NDS_getRawUserInput().touch.touchY >> 4;\n\n\tif(touchshadow) {\n\n\t\ttouch.push_back(temptouch);\n\t\tif(touch.size() > 8) touch.erase(touch.begin());\n\n\t\tfor (int i = 0; i < 8; i++) {\n\t\t\ttemptouch = touch[i];\n\t\t\tif(temptouch.X != 0 || temptouch.Y != 0) {\n\t\t\t\taggDraw.hud->lineColor(0, 255, 0, touchalpha[i]);\n\t\t\t\taggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz\n\t\t\t\taggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert\n\t\t\t\taggDraw.hud->fillColor(0, 0, 0, touchalpha[i]);\n\t\t\t\taggDraw.hud->rectangle(temptouch.X-1, temptouch.Y + 192-1, temptouch.X+1, temptouch.Y + 192+1);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t\tif(NDS_getRawUserInput().touch.isTouch) {\n\t\t\taggDraw.hud->lineColor(0, 255, 0, 128);\n\t\t\taggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz\n\t\t\taggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert\n\t\t}\n\n\tif(nds.isTouch)\n\t{\n\t\ttemptouch.X = nds.scr_touchX / 16;\n\t\ttemptouch.Y = nds.scr_touchY / 16;\n\t\taggDraw.hud->lineColor(255, 0, 0, 128);\n\t\taggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz\n\t\taggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert\n\t}\n\n}\n\nstatic int previousslot = 0;\nstatic char number[10];\nstatic s64 slotTimer=0;\n\nstatic void DrawStateSlots(){\n\n\tconst int yloc = calcY(Hud.SavestateSlots.y); //160\n\tconst int xloc = Hud.SavestateSlots.x; //8\n\n\ts64 fadecounter = 512 - (hudTimer-slotTimer)/4; //change constant to alter fade speed\n\tif(fadecounter < 1) fadecounter = 0;\n\tif(fadecounter>255) fadecounter = 255;\n\n\tint alpha = (int)fadecounter;\n\tif(HudEditorMode)\n\t\talpha = 255;\n\n\tif(alpha!=0)\n\t{\n\t\taggDraw.hud->lineWidth(1.0);\n\t\taggDraw.hud->lineColor(0, 0, 0, alpha);\n\t\taggDraw.hud->fillColor(255, 255, 255, alpha);\n\n\t\tfor ( int i = 0, xpos=0; i < 10; xpos=xpos+24) {\n\n\t\t\tint yheight=0;\n\n\t\t\taggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, xloc + 22 + xpos, yloc + 20 + yheight+20, agg::rgba8(100,200,255,alpha), agg::rgba8(255,255,255,0));\n\n\t\t\tif(lastSaveState == i) {\n\t\t\t\tyheight = 5;\n\t\t\t\taggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, 22 + xloc + xpos, yloc + 20 + yheight+20, agg::rgba8(100,255,255,alpha), agg::rgba8(255,255,255,0));\n\t\t\t}\n\n\t\t\taggDraw.hud->rectangle(xloc + xpos , yloc - yheight, xloc + 22 + xpos , yloc + 20 + yheight);\n\t\t\tsnprintf(number, 10, \"%d\", i);\n\t\t\taggDraw.hud->renderText(xloc + 1 + xpos + 4, yloc+4, std::string(number));\n\t\t\ti++;\n\t\t}\n\t}\n\n\tif(lastSaveState != previousslot)\n\t\tslotTimer = hudTimer;\n\n\tpreviousslot = lastSaveState;\n}\n\nstatic void DrawEditableElementIndicators()\n{\n\tu32 i = 0;\n\twhile (!IsHudDummy(&Hud.hud(i))) {\n\t\tHudCoordinates &hud = Hud.hud(i);\n\t\taggDraw.hud->fillColor(0,0,0,0);\n\t\taggDraw.hud->lineColor(0,0,0,64);\n\t\taggDraw.hud->lineWidth(2.0);\n\t\taggDraw.hud->rectangle(hud.x,calcY(hud.y),hud.x+hud.xsize+1.0,calcY(hud.y)+hud.ysize+1.0);\n\t\taggDraw.hud->lineColor(255,hud.clicked?127:255,0,255);\n\t\taggDraw.hud->lineWidth(1.0);\n\t\taggDraw.hud->rectangle(hud.x-0.5,calcY(hud.y)-0.5,hud.x+hud.xsize+0.5,calcY(hud.y)+hud.ysize+0.5);\n\t\ti++;\n\t}\n}\n\n\nvoid DrawHUD()\n{\n#ifdef ANDROID\n\tstruct timeval time;\n\tgettimeofday(&time, NULL);\n#else\n\tGTimeVal time;\n\tg_get_current_time(&time);\n#endif\n\thudTimer = ((s64)time.tv_sec * 1000) + ((s64)time.tv_usec/1000);\n\n\tif (HudEditorMode)\n\t{\n\t\tDrawEditableElementIndicators();\n\t}\n\t\n\tif (CommonSettings.hud.ShowInputDisplay) \n\t{\n\t\tTextualInputDisplay();\n\t\tTouchDisplay();\n\t}\n\n\tif (CommonSettings.hud.FpsDisplay) \n\t{\n\t\tosd->addFixed(Hud.FpsDisplay.x, Hud.FpsDisplay.y, \"Fps:%02d/%02d (%02d%%/%02d%%)%s\", Hud.fps, Hud.fps3d, Hud.cpuload[0], Hud.cpuload[1], driver->EMU_IsEmulationPaused() ? \" (paused)\" : \"\");\n\t}\n\n\tif (CommonSettings.hud.FrameCounterDisplay) \n\t{\n\t\tif(movieMode == MOVIEMODE_RECORD) \n\t\t\tosd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, \"%d\",currFrameCounter);\n\t\telse if (movieMode == MOVIEMODE_PLAY)\n\t\t\tosd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, \"%d/%d\",currFrameCounter,currMovieData.records.size());\n\t\telse if (movieMode == MOVIEMODE_FINISHED)\n\t\t\tosd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, \"%d/%d (finished)\",currFrameCounter,currMovieData.records.size());\n\t\telse\n\t\t\tosd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, \"%d (no movie)\",currFrameCounter);\n\t}\n\n\tif (CommonSettings.hud.ShowLagFrameCounter) \n\t{\n\t\tosd->addFixed(Hud.LagFrameCounter.x, Hud.LagFrameCounter.y, \"%d\",TotalLagFrames);\n\t}\n\n\tif (CommonSettings.hud.ShowGraphicalInputDisplay)\n\t{\n\t\tdrawPad(Hud.GraphicalInputDisplay.x, Hud.GraphicalInputDisplay.y, 2.5);\n\t}\n\n\t#if defined(WIN32) && !defined(WXPORT)\n\tif (CommonSettings.hud.ShowMicrophone) \n\t{\n\t\tosd->addFixed(Hud.Microphone.x, Hud.Microphone.y, \"%03d [%07d]\",MicDisplay, Hud.cpuloopIterationCount);\n\t}\n\t#endif\n\n\tif (CommonSettings.hud.ShowRTC) \n\t{\n\t\tDateTime tm = rtcGetTime();\n\t\tstatic const char *wday[] = { \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" };\n\t\tosd->addFixed(Hud.RTCDisplay.x, Hud.RTCDisplay.y, \"%04d-%03s-%02d %s %02d:%02d:%02d\", tm.get_Year(), DateTime::GetNameOfMonth(tm.get_Month()), tm.get_Day(), wday[tm.get_DayOfWeek()%7], tm.get_Hour(), tm.get_Minute(), tm.get_Second());\n\t}\n\n\tDrawStateSlots();\n}\n\n\n\nOSDCLASS::OSDCLASS(u8 core)\n{\n\tmemset(name,0,7);\n\n\tmode=core;\n\toffset=0;\n\n\tlastLineText=0;\n\tlineText_x = 5;\n\tlineText_y = 120;\n\tlineText_color = AggColor(255, 255, 255);\n\tfor (int i=0; i < OSD_MAX_LINES+1; i++)\n\t{\n\t\tlineText[i] = new char[1024];\n\t\tmemset(lineText[i], 0, 1024);\n\t\tlineTimer[i] = 0;\n\t\tlineColor[i] = lineText_color;\n\t}\n\n\trotAngle = 0;\n\n\tsingleScreen = false;\n\tswapScreens = false;\n\n\tneedUpdate = false;\n\n\tif (core==0) \n\t\tstrcpy(name,\"Core A\");\n\telse\n\tif (core==1)\n\t\tstrcpy(name,\"Core B\");\n\telse\n\t{\n\t\tstrcpy(name,\"Main\");\n\t\tmode=255;\n\t}\n\n\t//border(false);\n\n\tLOG(\"OSD_Init (%s)\\n\",name);\n}\n\nOSDCLASS::~OSDCLASS()\n{\n\tLOG(\"OSD_Deinit (%s)\\n\",name);\n\n\tfor (int i=0; i < OSD_MAX_LINES+1; i++)\n\t{\n\t\tif (lineText[i]) \n\t\t\tdelete [] lineText[i];\n\t\tlineText[i] = NULL;\n\t}\n}\n\nvoid OSDCLASS::setOffset(u16 ofs)\n{\n\toffset=ofs;\n}\n\nvoid OSDCLASS::setRotate(u16 angle)\n{\n\trotAngle = angle;\n}\n\nvoid OSDCLASS::clear()\n{\n\tneedUpdate=false;\n}\n\nbool OSDCLASS::checkTimers()\n{\n\tif (lastLineText == 0) return false;\n\n\ttime_t\ttmp_time = time(NULL);\n\n\tfor (int i=0; i < lastLineText; i++)\n\t{\n\t\tif (tmp_time > (lineTimer[i] + OSD_TIMER_SECS) )\n\t\t{\n\t\t\tif (i < lastLineText)\n\t\t\t{\n\t\t\t\tfor (int j=i; j < lastLineText; j++)\n\t\t\t\t{\n\t\t\t\t\tstrcpy(lineText[j], lineText[j+1]);\n\t\t\t\t\tlineTimer[j] = lineTimer[j+1];\n\t\t\t\t\tlineColor[j] = lineColor[j+1];\n\t\t\t\t}\n\t\t\t}\n\t\t\tlineTimer[lastLineText] = 0;\n\t\t\tlastLineText--;\n\t\t\tif (lastLineText == 0) return false;\n\t\t}\n\t}\n\treturn true;\n}\n\nvoid OSDCLASS::update()\n{\n\tif ( (!needUpdate) && (!lastLineText) ) return;\t// don't update if buffer empty (speed up)\n\tif (lastLineText)\n\t{\n\t\tif (checkTimers())\n\t\t{\n\t\t\tfor (int i=0; i < lastLineText; i++)\n\t\t\t{\n\t\t\t\taggDraw.hud->lineColor(lineColor[i]);\n\t\t\t\taggDraw.hud->renderTextDropshadowed(lineText_x,lineText_y+(i*16),lineText[i]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!needUpdate) return;\n\t\t}\n\t}\n}\n\nvoid OSDCLASS::setListCoord(u16 x, u16 y)\n{\n\tlineText_x = x;\n\tlineText_y = y;\n}\n\nvoid OSDCLASS::setLineColor(u8 r=255, u8 g=255, u8 b=255)\n{\n\tlineText_color = AggColor(r,g,b);\n}\n\nvoid OSDCLASS::addLine(const char *fmt, ...)\n{\n\tva_list list;\n\n\tif (lastLineText > OSD_MAX_LINES) lastLineText = OSD_MAX_LINES;\n\tif (lastLineText == OSD_MAX_LINES)\t// full\n\t{\n\t\tlastLineText--;\n\t\tfor (int j=0; j < lastLineText; j++)\n\t\t{\n\t\t\tstrcpy(lineText[j], lineText[j+1]);\n\t\t\tlineTimer[j] = lineTimer[j+1];\n\t\t\tlineColor[j] = lineColor[j+1];\n\t\t}\n\t}\n\n\tva_start(list,fmt);\n#if defined(_MSC_VER) || defined(__INTEL_COMPILER)\n\t\t_vsnprintf(lineText[lastLineText],1023,fmt,list);\n#else\n\t\tvsnprintf(lineText[lastLineText],1023,fmt,list);\n#endif\n\tva_end(list);\n\tlineColor[lastLineText] = lineText_color;\n\tlineTimer[lastLineText] = time(NULL);\n\tneedUpdate = true;\n\n\tlastLineText++;\n}\n\nvoid OSDCLASS::addFixed(u16 x, u16 y, const char *fmt, ...)\n{\n\tva_list list;\n\tchar msg[1024];\n\n\tva_start(list,fmt);\n\tvsnprintf(msg,1023,fmt,list);\n\tva_end(list);\n\n\taggDraw.hud->lineColor(255,255,255);\n\taggDraw.hud->renderTextDropshadowed(x,calcY(y),msg);\n\n\tneedUpdate = true;\n}\n\nvoid OSDCLASS::border(bool enabled)\n{\n\t//render51.setTextBoxBorder(enabled);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/GPU_osd.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef __GPU_OSD_\n#define __GPU_OSD_\n\n#include \"types.h\"\n\n#ifdef HAVE_LIBAGG\n#include <stdlib.h>\n#include <time.h>\n\n#include \"aggdraw.h\"\n\n#define OSD_MAX_LINES 4\n#define OSD_TIMER_SECS 2\n\n\nstruct HudCoordinates{\n\tint x;\n\tint y;\n\tint xsize;\n\tint ysize;\n\tint storedx;\n\tint storedy;\n\tint clicked;\n};\n\nstruct HudStruct\n{\npublic:\n\tHudStruct()\n\t{\n\t\tresetTransient();\n\t}\n\n\tvoid resetTransient()\n\t{\n\t\tfps = 0;\n\t\tfps3d = 0;\n\t\tcpuload[0] = cpuload[1] = 0;\n\t\tcpuloopIterationCount = 0;\n\t\tclicked = false;\n\t}\n\n\tHudCoordinates SavestateSlots;\n\tHudCoordinates FpsDisplay;\n\tHudCoordinates FrameCounter;\n\tHudCoordinates InputDisplay;\n\tHudCoordinates GraphicalInputDisplay;\n\tHudCoordinates LagFrameCounter;\n\tHudCoordinates Microphone;\n\tHudCoordinates RTCDisplay;\n\tHudCoordinates Dummy;\n\n\tHudCoordinates &hud(int i) { return ((HudCoordinates*)this)[i]; }\n\tvoid reset();\n\n\tint fps, fps3d, cpuload[2], cpuloopIterationCount;\n\tbool clicked;\n};\n\nvoid EditHud(s32 x, s32 y, HudStruct *hudstruct);\nvoid HudClickRelease(HudStruct *hudstruct);\n\nvoid DrawHUD();\n\nextern HudStruct Hud;\nextern bool HudEditorMode;\n\nclass OSDCLASS\n{\nprivate:\n\tu64\t\toffset;\n\tu8\t\tmode;\n\n\tu16\t\trotAngle;\n\n\tu16\t\tlineText_x;\n\tu16\t\tlineText_y;\n\tAggColor\t\tlineText_color;\n\tu8\t\tlastLineText;\n\tchar\t*lineText[OSD_MAX_LINES+1];\n\ttime_t\tlineTimer[OSD_MAX_LINES+1];\n\tAggColor lineColor[OSD_MAX_LINES+1];\n\n\tbool\tneedUpdate;\n\n\tbool\tcheckTimers();\n\npublic:\n\tchar\tname[7];\t\t// for debuging\n\tbool    singleScreen;\n\tbool    swapScreens;\n\n\tOSDCLASS(u8 core);\n\t~OSDCLASS();\n\n\tvoid\tsetOffset(u16 ofs);\n\tvoid\tsetRotate(u16 angle);\n\tvoid\tupdate();\n\tvoid\tclear();\n\tvoid\tsetListCoord(u16 x, u16 y);\n\tvoid\tsetLineColor(u8 r, u8 b, u8 g);\n\tvoid\taddLine(const char *fmt, ...);\n\tvoid\taddFixed(u16 x, u16 y, const char *fmt, ...);\n\tvoid\tborder(bool enabled);\n};\n\nextern OSDCLASS\t*osd;\n#else /* HAVE_LIBAGG */\nvoid DrawHUD();\n\nclass OSDCLASS {\npublic:\n  OSDCLASS(u8 core);\n  ~OSDCLASS();\n  void    update();\n  void    clear();\n  void    setLineColor(u8 r, u8 b, u8 g);\n  void    addLine(const char *fmt, ...);\n};\n\nextern OSDCLASS        *osd;\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/GPU_osd_stub.cpp",
    "content": "/*\n\tCopyright (C) 2010 DeSmumE team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"types.h\"\n#include \"GPU_osd.h\"\n\nOSDCLASS        *osd;\n\nOSDCLASS::OSDCLASS(u8 core) {}\nOSDCLASS::~OSDCLASS() {}\nvoid OSDCLASS::update() {}\nvoid OSDCLASS::clear() {}\nvoid OSDCLASS::setLineColor(u8 r, u8 b, u8 g) {}\nvoid OSDCLASS::addLine(const char *fmt, ...) {}\n\nvoid DrawHUD() {}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/JitCommon.cpp",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"JitCommon.h\"\n#include \"MMU.h\"\n#include \"armcpu.h\"\n#include \"debug.h\"\n#ifdef _MSC_VER\n#include <Windows.h>\n#endif\n\n#ifdef HAVE_JIT\n\n#ifdef MAPPED_JIT_FUNCS\nstatic uintptr_t *JIT_MEM[2][32] = {\n\t//arm9\n\t{\n\t\t/* 0X*/\tDUP2(g_JitLut.ARM9_ITCM),\n\t\t/* 1X*/\tDUP2(g_JitLut.ARM9_ITCM), // mirror\n\t\t/* 2X*/\tDUP2(g_JitLut.MAIN_MEM),\n\t\t/* 3X*/\tDUP2(g_JitLut.SWIRAM),\n\t\t/* 4X*/\tDUP2(NULL),\n\t\t/* 5X*/\tDUP2(NULL),\n\t\t/* 6X*/\t\t NULL, \n\t\t\t\t\t g_JitLut.ARM9_LCDC,\t// Plain ARM9-CPU Access (LCDC mode) (max 656KB)\n\t\t/* 7X*/\tDUP2(NULL),\n\t\t/* 8X*/\tDUP2(NULL),\n\t\t/* 9X*/\tDUP2(NULL),\n\t\t/* AX*/\tDUP2(NULL),\n\t\t/* BX*/\tDUP2(NULL),\n\t\t/* CX*/\tDUP2(NULL),\n\t\t/* DX*/\tDUP2(NULL),\n\t\t/* EX*/\tDUP2(NULL),\n\t\t/* FX*/\tDUP2(g_JitLut.ARM9_BIOS)\n\t},\n\t//arm7\n\t{\n\t\t/* 0X*/\tDUP2(g_JitLut.ARM7_BIOS),\n\t\t/* 1X*/\tDUP2(NULL),\n\t\t/* 2X*/\tDUP2(g_JitLut.MAIN_MEM),\n\t\t/* 3X*/\t     g_JitLut.SWIRAM,\n\t\t             g_JitLut.ARM7_ERAM,\n\t\t/* 4X*/\t     NULL,\n\t\t             g_JitLut.ARM7_WIRAM,\n\t\t/* 5X*/\tDUP2(NULL),\n\t\t/* 6X*/\t\t g_JitLut.ARM7_WRAM,\t\t// VRAM allocated as Work RAM to ARM7 (max. 256K)\n\t\t\t\t\t NULL,\n\t\t/* 7X*/\tDUP2(NULL),\n\t\t/* 8X*/\tDUP2(NULL),\n\t\t/* 9X*/\tDUP2(NULL),\n\t\t/* AX*/\tDUP2(NULL),\n\t\t/* BX*/\tDUP2(NULL),\n\t\t/* CX*/\tDUP2(NULL),\n\t\t/* DX*/\tDUP2(NULL),\n\t\t/* EX*/\tDUP2(NULL),\n\t\t/* FX*/\tDUP2(NULL)\n\t}\n};\n\nstatic u32 JIT_MASK[2][32] = {\n\t//arm9\n\t{\n\t\t/* 0X*/\tDUP2(0x00007FFF),\n\t\t/* 1X*/\tDUP2(0x00007FFF),\n\t\t/* 2X*/\tDUP2(0x003FFFFF), // FIXME _MMU_MAIN_MEM_MASK\n\t\t/* 3X*/\tDUP2(0x00007FFF),\n\t\t/* 4X*/\tDUP2(0x00000000),\n\t\t/* 5X*/\tDUP2(0x00000000),\n\t\t/* 6X*/\t\t 0x00000000,\n\t\t\t\t\t 0x000FFFFF,\n\t\t/* 7X*/\tDUP2(0x00000000),\n\t\t/* 8X*/\tDUP2(0x00000000),\n\t\t/* 9X*/\tDUP2(0x00000000),\n\t\t/* AX*/\tDUP2(0x00000000),\n\t\t/* BX*/\tDUP2(0x00000000),\n\t\t/* CX*/\tDUP2(0x00000000),\n\t\t/* DX*/\tDUP2(0x00000000),\n\t\t/* EX*/\tDUP2(0x00000000),\n\t\t/* FX*/\tDUP2(0x00007FFF)\n\t},\n\t//arm7\n\t{\n\t\t/* 0X*/\tDUP2(0x00003FFF),\n\t\t/* 1X*/\tDUP2(0x00000000),\n\t\t/* 2X*/\tDUP2(0x003FFFFF),\n\t\t/* 3X*/\t     0x00007FFF,\n\t\t             0x0000FFFF,\n\t\t/* 4X*/\t     0x00000000,\n\t\t             0x0000FFFF,\n\t\t/* 5X*/\tDUP2(0x00000000),\n\t\t/* 6X*/\t\t 0x0003FFFF,\n\t\t\t\t\t 0x00000000,\n\t\t/* 7X*/\tDUP2(0x00000000),\n\t\t/* 8X*/\tDUP2(0x00000000),\n\t\t/* 9X*/\tDUP2(0x00000000),\n\t\t/* AX*/\tDUP2(0x00000000),\n\t\t/* BX*/\tDUP2(0x00000000),\n\t\t/* CX*/\tDUP2(0x00000000),\n\t\t/* DX*/\tDUP2(0x00000000),\n\t\t/* EX*/\tDUP2(0x00000000),\n\t\t/* FX*/\tDUP2(0x00000000)\n\t}\n};\n\nCACHE_ALIGN JitLut g_JitLut;\n#else\nDS_ALIGN(4096) uintptr_t g_CompiledFuncs[1<<26] = {0};\n#endif\n\nRegisterMap::~RegisterMap()\n{\n}\n\nbool RegisterMap::Start(void *context, struct armcpu_t *armcpu)\n{\n\tm_SwapData = 0;\n\tm_StateData = 0;\n\tm_Context = context;\n\tm_Cpu = armcpu;\n\n\tm_Profile.Reset();\n\n\t// check\n#ifdef DEVELOPER\n\tfor (u32 i = 0; i < GUESTREG_COUNT; i++)\n\t{\n\t\tif (m_State.GuestRegs[i].state != GuestReg::GRS_MEM)\n\t\t\tINFO(\"RegisterMap::Start() : GuestRegId[%u] is bad(state)\\n\", i);\n\n\t\tif (m_State.GuestRegs[i].hostreg != INVALID_REG_ID)\n\t\t\tINFO(\"RegisterMap::Start() : GuestRegId[%u] is bad(hostreg)\\n\", i);\n\t}\n\n\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t{\n\t\tif (m_State.HostRegs[i].guestreg != INVALID_REG_ID)\n\t\t\tINFO(\"RegisterMap::Start() : HostReg[%u] is bad(guestreg)\\n\", i);\n\n\t\tif (m_State.HostRegs[i].alloced)\n\t\t\tINFO(\"RegisterMap::Start() : HostReg[%u] is bad(alloced)\\n\", i);\n\n\t\tif (m_State.HostRegs[i].locked)\n\t\t\tINFO(\"RegisterMap::Start() : HostReg[%u] is bad(locked)\\n\", i);\n\n\t\tif (m_State.HostRegs[i].dirty)\n\t\t\tINFO(\"RegisterMap::Start() : HostReg[%u] is bad(dirty)\\n\", i);\n\t}\n\n\tif (m_StateMap.size() > 0)\n\t\tINFO(\"RegisterMap::Start() : StateMap is not empty\\n\");\n#endif\n\n\tm_CpuPtrReg = AllocTempReg(true);\n\n\tStartBlock();\n\n\treturn true;\n}\n\nvoid RegisterMap::End(bool cleanup)\n{\n\t//UnlockAll();\n\tFlushAll(true);\n\n\tEndBlock();\n\n\tif (cleanup)\n\t{\n\t\tDiscardReg(EXECUTECYCLES, true);\n\t\tReleaseTempReg(m_CpuPtrReg);\n\n\t\tCleanAllStates();\n\n\t\tm_Context = NULL;\n\t\tm_Cpu = NULL;\n\t}\n}\n\nvoid RegisterMap::PrintProfile()\n{\n\tINFO(\"RegisterMap::PrintProfile() : \\n\");\n\tINFO(\"\\tTempRegCount = %u\\n\", m_Profile.TempRegCount);\n\tINFO(\"\\tMapRegCount = %u\\n\", m_Profile.MapRegCount);\n\tINFO(\"\\tSetImmCount = %u\\n\", m_Profile.SetImmCount);\n\tINFO(\"\\tGetImmCount = %u\\n\", m_Profile.GetImmCount);\n\tINFO(\"\\tStoreRegCount = %u\\n\", m_Profile.StoreRegCount);\n\tINFO(\"\\tLoadRegCount = %u\\n\", m_Profile.LoadRegCount);\n\tINFO(\"\\tBackupRegCount = %u\\n\", m_Profile.BackupRegCount);\n\tINFO(\"\\tCallABICount = %u\\n\", m_Profile.CallABICount);\n}\n\nbool RegisterMap::IsImm(GuestRegId reg) const\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::IsImm() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn false;\n\t}\n\n\treturn m_State.GuestRegs[reg].state == GuestReg::GRS_IMM;\n}\n\nvoid RegisterMap::SetImm8(GuestRegId reg, u8 imm)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::SetImm8() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MAPPED)\n\t{\n\t\tconst u32 hostreg = m_State.GuestRegs[reg].hostreg;\n\n\t\tif (hostreg == INVALID_REG_ID || m_State.HostRegs[hostreg].guestreg != reg)\n\t\t\tINFO(\"RegisterMap::SetImm8() : GuestRegId[%u] out of sync\\n\", (u32)reg);\n\t\t\n\t\tm_State.HostRegs[hostreg].guestreg = INVALID_REG_ID;\n\t\tm_State.HostRegs[hostreg].alloced = false;\n\t\tm_State.HostRegs[hostreg].dirty = false;\n\t\tm_State.HostRegs[hostreg].locked = 0;\n\t}\n\n\tm_State.GuestRegs[reg].state = GuestReg::GRS_IMM;\n\tm_State.GuestRegs[reg].hostreg = INVALID_REG_ID;\n\tm_State.GuestRegs[reg].immdata.type = ImmData::IMM8;\n\tm_State.GuestRegs[reg].immdata.imm8 = imm;\n\n\tm_Profile.SetImmCount++;\n}\n\nvoid RegisterMap::SetImm16(GuestRegId reg, u16 imm)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::SetImm16() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MAPPED)\n\t{\n\t\tconst u32 hostreg = m_State.GuestRegs[reg].hostreg;\n\n\t\tif (hostreg == INVALID_REG_ID || m_State.HostRegs[hostreg].guestreg != reg)\n\t\t\tINFO(\"RegisterMap::SetImm16() : GuestRegId[%u] out of sync\\n\", (u32)reg);\n\t\t\n\t\tm_State.HostRegs[hostreg].guestreg = INVALID_REG_ID;\n\t\tm_State.HostRegs[hostreg].alloced = false;\n\t\tm_State.HostRegs[hostreg].dirty = false;\n\t\tm_State.HostRegs[hostreg].locked = 0;\n\t}\n\n\tm_State.GuestRegs[reg].state = GuestReg::GRS_IMM;\n\tm_State.GuestRegs[reg].hostreg = INVALID_REG_ID;\n\tm_State.GuestRegs[reg].immdata.type = ImmData::IMM16;\n\tm_State.GuestRegs[reg].immdata.imm16 = imm;\n\n\tm_Profile.SetImmCount++;\n}\n\nvoid RegisterMap::SetImm32(GuestRegId reg, u32 imm)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::SetImm32() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MAPPED)\n\t{\n\t\tconst u32 hostreg = m_State.GuestRegs[reg].hostreg;\n\n\t\tif (hostreg == INVALID_REG_ID || m_State.HostRegs[hostreg].guestreg != reg)\n\t\t\tINFO(\"RegisterMap::SetImm32() : GuestRegId[%u] out of sync\\n\", (u32)reg);\n\t\t\n\t\tm_State.HostRegs[hostreg].guestreg = INVALID_REG_ID;\n\t\tm_State.HostRegs[hostreg].alloced = false;\n\t\tm_State.HostRegs[hostreg].dirty = false;\n\t\tm_State.HostRegs[hostreg].locked = 0;\n\t}\n\n\tm_State.GuestRegs[reg].state = GuestReg::GRS_IMM;\n\tm_State.GuestRegs[reg].hostreg = INVALID_REG_ID;\n\tm_State.GuestRegs[reg].immdata.type = ImmData::IMM32;\n\tm_State.GuestRegs[reg].immdata.imm32 = imm;\n\n\tm_Profile.SetImmCount++;\n}\n\nvoid RegisterMap::SetImmPtr(GuestRegId reg, void* imm)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::SetImmPtr() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MAPPED)\n\t{\n\t\tconst u32 hostreg = m_State.GuestRegs[reg].hostreg;\n\n\t\tif (hostreg == INVALID_REG_ID || m_State.HostRegs[hostreg].guestreg != reg)\n\t\t\tINFO(\"RegisterMap::SetImmPtr() : GuestRegId[%u] out of sync\\n\", (u32)reg);\n\t\t\n\t\tm_State.HostRegs[hostreg].guestreg = INVALID_REG_ID;\n\t\tm_State.HostRegs[hostreg].alloced = false;\n\t\tm_State.HostRegs[hostreg].dirty = false;\n\t\tm_State.HostRegs[hostreg].locked = 0;\n\t}\n\n\tm_State.GuestRegs[reg].state = GuestReg::GRS_IMM;\n\tm_State.GuestRegs[reg].hostreg = INVALID_REG_ID;\n\tm_State.GuestRegs[reg].immdata.type = ImmData::IMMPTR;\n\tm_State.GuestRegs[reg].immdata.immptr = imm;\n\n\tm_Profile.SetImmCount++;\n}\n\nu8 RegisterMap::GetImm8(GuestRegId reg) const\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::GetImm8() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_IMM)\n\t{\n\t\tINFO(\"RegisterMap::GetImm8() : GuestRegId[%u] is non-imm register\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].immdata.type != ImmData::IMM8)\n\t\tINFO(\"RegisterMap::GetImm8() : GuestRegId[%u] is not imm8\\n\", (u32)reg);\n\n\tm_Profile.GetImmCount++;\n\n\treturn m_State.GuestRegs[reg].immdata.imm8;\n}\n\nu16 RegisterMap::GetImm16(GuestRegId reg) const\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::GetImm16() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_IMM)\n\t{\n\t\tINFO(\"RegisterMap::GetImm16() : GuestRegId[%u] is non-imm register\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].immdata.type != ImmData::IMM16)\n\t\tINFO(\"RegisterMap::GetImm8() : GuestRegId[%u] is not imm16\\n\", (u32)reg);\n\n\tm_Profile.GetImmCount++;\n\n\treturn m_State.GuestRegs[reg].immdata.imm16;\n}\n\nu32 RegisterMap::GetImm32(GuestRegId reg) const\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::GetImm32() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_IMM)\n\t{\n\t\tINFO(\"RegisterMap::GetImm32() : GuestRegId[%u] is non-imm register\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].immdata.type != ImmData::IMM32)\n\t\tINFO(\"RegisterMap::GetImm32() : GuestRegId[%u] is not imm32\\n\", (u32)reg);\n\n\tm_Profile.GetImmCount++;\n\n\treturn m_State.GuestRegs[reg].immdata.imm32;\n}\n\nvoid* RegisterMap::GetImmPtr(GuestRegId reg) const\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::GetImmPtr() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_IMM)\n\t{\n\t\tINFO(\"RegisterMap::GetImmPtr() : GuestRegId[%u] is non-imm register\\n\", (u32)reg);\n\n\t\treturn 0;\n\t}\n\n\tif (m_State.GuestRegs[reg].immdata.type != ImmData::IMMPTR)\n\t\tINFO(\"RegisterMap::GetImm32() : GuestRegId[%u] is not ptr\\n\", (u32)reg);\n\n\tm_Profile.GetImmCount++;\n\n\treturn m_State.GuestRegs[reg].immdata.immptr;\n}\n\nu32 RegisterMap::MapReg(GuestRegId reg, u32 mapflag)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::MapReg() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn INVALID_REG_ID;\n\t}\n\n\tm_Profile.MapRegCount++;\n\n\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MAPPED)\n\t{\n\t\tconst u32 hostreg = m_State.GuestRegs[reg].hostreg;\n\n\t\tif (hostreg == INVALID_REG_ID || m_State.HostRegs[hostreg].guestreg != reg)\n\t\t\tINFO(\"RegisterMap::MapReg() : GuestRegId[%u] out of sync\\n\", (u32)reg);\n\n\t\tif (mapflag & MAP_DIRTY)\n\t\t\tm_State.HostRegs[hostreg].dirty = true;\n\n\t\tm_State.HostRegs[hostreg].swapdata = GenSwapData();\n\n\t\treturn hostreg;\n\t}\n\n\tconst u32 hostreg = AllocHostReg(false);\n\tif (hostreg == INVALID_REG_ID)\n\t{\n\t\tINFO(\"RegisterMap::MapReg() : out of host registers\\n\");\n\n\t\treturn INVALID_REG_ID;\n\t}\n\n\tm_State.HostRegs[hostreg].guestreg = reg;\n\tm_State.HostRegs[hostreg].dirty = (mapflag & MAP_DIRTY);\n\tm_State.HostRegs[hostreg].swapdata = GenSwapData();\n\tif (!(mapflag & MAP_NOTINIT))\n\t{\n\t\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MEM)\n\t\t{\n\t\t\tLoadGuestReg(hostreg, reg);\n\t\t}\n\t\telse if (m_State.GuestRegs[reg].state == GuestReg::GRS_IMM)\n\t\t{\n\t\t\tLoadImm(hostreg, m_State.GuestRegs[reg].immdata);\n\n\t\t\tm_State.HostRegs[hostreg].dirty = true;\n\t\t}\n\t}\n\tif (mapflag & MAP_DIRTY)\n\t\tm_State.HostRegs[hostreg].dirty = true;\n\n\tm_State.GuestRegs[reg].state = GuestReg::GRS_MAPPED;\n\tm_State.GuestRegs[reg].hostreg = hostreg;\n\n\treturn hostreg;\n}\n\nu32 RegisterMap::MappedReg(GuestRegId reg)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::MappedReg() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn INVALID_REG_ID;\n\t}\n\n\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_MAPPED)\n\t{\n\t\tINFO(\"RegisterMap::MappedReg() : GuestRegId[%u] is not mapped\\n\", (u32)reg);\n\n\t\treturn INVALID_REG_ID;\n\t}\n\n\tm_Profile.MapRegCount++;\n\n\tm_State.HostRegs[m_State.GuestRegs[reg].hostreg].swapdata = GenSwapData();\n\n\treturn m_State.GuestRegs[reg].hostreg;\n}\n\nvoid RegisterMap::DiscardReg(GuestRegId reg, bool force)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::DiscardReg() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MAPPED)\n\t{\n\t\tconst u32 hostreg = m_State.GuestRegs[reg].hostreg;\n\n\t\tif (!force && m_State.HostRegs[hostreg].dirty)\n\t\t{\n\t\t\tINFO(\"RegisterMap::DiscardReg() : GuestRegId[%u] is dirty\\n\", (u32)reg);\n\n\t\t\treturn;\n\t\t}\n\n\t\tm_State.HostRegs[hostreg].guestreg = INVALID_REG_ID;\n\t\tm_State.HostRegs[hostreg].swapdata = 0;\n\t\tm_State.HostRegs[hostreg].alloced = false;\n\t\tm_State.HostRegs[hostreg].dirty = false;\n\t\tm_State.HostRegs[hostreg].locked = 0;\n\t}\n\telse if (m_State.GuestRegs[reg].state == GuestReg::GRS_IMM)\n\t{\n\t\tif (!force && reg != EXECUTECYCLES)\n\t\t\tINFO(\"RegisterMap::DiscardReg() : GuestRegId[%u] is immediate\\n\", (u32)reg);\n\t}\n\n\tm_State.GuestRegs[reg].state = GuestReg::GRS_MEM;\n\tm_State.GuestRegs[reg].hostreg = INVALID_REG_ID;\n}\n\nu32 RegisterMap::GetCpuPtrReg()\n{\n\treturn m_CpuPtrReg;\n}\n\nu32 RegisterMap::AllocTempReg(bool preserved)\n{\n\tconst u32 hostreg = AllocHostReg(preserved);\n\tif (hostreg == INVALID_REG_ID)\n\t{\n\t\tINFO(\"RegisterMap::AllocTempReg() : out of host registers\\n\");\n\n\t\treturn INVALID_REG_ID;\n\t}\n\n\tLock(hostreg);\n\n\tm_Profile.TempRegCount++;\n\n\treturn hostreg;\n}\n\nvoid RegisterMap::ReleaseTempReg(u32 &reg)\n{\n\tif (reg >= m_HostRegCount)\n\t{\n\t\tINFO(\"RegisterMap::ReleaseTempReg() : HostReg[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (!m_State.HostRegs[reg].alloced)\n\t{\n\t\tINFO(\"RegisterMap::ReleaseTempReg() : HostReg[%u] is not alloced\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.HostRegs[reg].guestreg != INVALID_REG_ID)\n\t{\n\t\tINFO(\"RegisterMap::ReleaseTempReg() : HostReg[%u] is not a temp reg\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.HostRegs[reg].locked > 1)\n\t{\n\t\tINFO(\"RegisterMap::ReleaseTempReg() : HostReg[%u] is locked\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tUnlock(reg);\n\n\tFlushHostReg(reg);\n\n\treg = INVALID_REG_ID;\n}\n\nvoid RegisterMap::Lock(u32 reg)\n{\n\tif (reg >= m_HostRegCount)\n\t{\n\t\tINFO(\"RegisterMap::Lock() : HostReg[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (!m_State.HostRegs[reg].alloced)\n\t{\n\t\tINFO(\"RegisterMap::Lock() : HostReg[%u] is not alloced\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tm_State.HostRegs[reg].locked++;\n}\n\nvoid RegisterMap::Unlock(u32 reg)\n{\n\tif (reg >= m_HostRegCount)\n\t{\n\t\tINFO(\"RegisterMap::Unlock() : HostReg[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (!m_State.HostRegs[reg].alloced)\n\t{\n\t\tINFO(\"RegisterMap::Unlock() : HostReg[%u] is not alloced\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (!m_State.HostRegs[reg].locked)\n\t{\n\t\tINFO(\"RegisterMap::Unlock() : HostReg[%u] is not locked\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tm_State.HostRegs[reg].locked--;\n}\n\nvoid RegisterMap::UnlockAll()\n{\n\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t{\n\t\tif (m_State.HostRegs[i].alloced && i != m_CpuPtrReg)\n\t\t{\n\t\t\tfor (u32 j = 0; j < m_State.HostRegs[i].locked; j++)\n\t\t\t\tUnlock(i);\n\t\t}\n\t}\n}\n\nvoid RegisterMap::FlushGuestReg(GuestRegId reg)\n{\n\tif (reg >= GUESTREG_COUNT)\n\t{\n\t\tINFO(\"RegisterMap::FlushGuestReg() : GuestRegId[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.GuestRegs[reg].state == GuestReg::GRS_MAPPED)\n\t{\n\t\tFlushHostReg(m_State.GuestRegs[reg].hostreg);\n\t}\n\telse if (m_State.GuestRegs[reg].state == GuestReg::GRS_IMM)\n\t{\n\t\tStoreImm(reg, m_State.GuestRegs[reg].immdata);\n\t}\n\n\tm_State.GuestRegs[reg].state = GuestReg::GRS_MEM;\n\tm_State.GuestRegs[reg].hostreg = INVALID_REG_ID;\n}\n\nvoid RegisterMap::FlushHostReg(u32 reg)\n{\n\tif (reg >= m_HostRegCount)\n\t{\n\t\tINFO(\"RegisterMap::FreeHostReg() : HostReg[%u] invalid\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (!m_State.HostRegs[reg].alloced)\n\t{\n\t\tINFO(\"RegisterMap::FreeHostReg() : HostReg[%u] is not alloced\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.HostRegs[reg].locked)\n\t{\n\t\tINFO(\"RegisterMap::FreeHostReg() : HostReg[%u] is locked\\n\", (u32)reg);\n\n\t\treturn;\n\t}\n\n\tif (m_State.HostRegs[reg].guestreg == INVALID_REG_ID)\n\t{\n\t\t//m_State.HostRegs[reg].guestreg = INVALID_REG_ID;\n\t\tm_State.HostRegs[reg].swapdata = 0;\n\t\tm_State.HostRegs[reg].alloced = false;\n\t\tm_State.HostRegs[reg].dirty = false;\n\t\tm_State.HostRegs[reg].locked = 0;\n\t}\n\telse\n\t{\n\t\tconst GuestRegId guestreg = (GuestRegId)m_State.HostRegs[reg].guestreg;\n\n\t\tif (m_State.GuestRegs[guestreg].state != GuestReg::GRS_MAPPED || m_State.GuestRegs[guestreg].hostreg != reg)\n\t\t\tINFO(\"RegisterMap::FlushHostReg() : HostReg[%u] out of sync\\n\", (u32)reg);\n\n\t\tif (m_State.HostRegs[reg].dirty)\n\t\t\tStoreGuestReg(reg, guestreg);\n\n\t\tm_State.HostRegs[reg].guestreg = INVALID_REG_ID;\n\t\tm_State.HostRegs[reg].swapdata = 0;\n\t\tm_State.HostRegs[reg].alloced = false;\n\t\tm_State.HostRegs[reg].dirty = false;\n\t\tm_State.HostRegs[reg].locked = 0;\n\n\t\tm_State.GuestRegs[guestreg].state = GuestReg::GRS_MEM;\n\t\tm_State.GuestRegs[guestreg].hostreg = INVALID_REG_ID;\n\t}\n}\n\nvoid RegisterMap::FlushAll(bool onlyreal)\n{\n\tif (onlyreal)\n\t{\n\t\tfor (u32 i = R0; i <= SPSR; i++)\n\t\t{\n\t\t\tFlushGuestReg((GuestRegId)i);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (u32 i = 0; i < GUESTREG_COUNT; i++)\n\t\t{\n\t\t\tFlushGuestReg((GuestRegId)i);\n\t\t}\n\n\t\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t\t{\n\t\t\tif (m_State.HostRegs[i].alloced)\n\t\t\t\tFlushHostReg(i);\n\t\t}\n\t}\n}\n\nu32 RegisterMap::StoreState()\n{\n\tState *state = new State;\n\n\tstate->GuestRegs = new GuestReg[GUESTREG_COUNT];\n\tmemcpy(state->GuestRegs, m_State.GuestRegs, sizeof(GuestReg) * GUESTREG_COUNT);\n\n\tstate->HostRegs = new HostReg[m_HostRegCount];\n\tmemcpy(state->HostRegs, m_State.HostRegs, sizeof(HostReg) * m_HostRegCount);\n\t\n\tu32 new_state_id = GenStateData();\n\tm_StateMap.insert(std::make_pair(new_state_id, state));\n\n\treturn new_state_id;\n}\n\nvoid RegisterMap::RestoreState(u32 state_id)\n{\n\tif (state_id == INVALID_STATE_ID)\n\t{\n\t\tINFO(\"RegisterMap::RestoreState() : state_id is not invalid\\n\");\n\n\t\treturn;\n\t}\n\n\tstd::map<u32, State*>::iterator itr = m_StateMap.find(state_id);\n\tif (itr == m_StateMap.end())\n\t{\n\t\tINFO(\"RegisterMap::RestoreState() : state_id[%u] is not exist\\n\", state_id);\n\n\t\treturn;\n\t}\n\n\tState *state = itr->second;\n\n\tmemcpy(m_State.GuestRegs, state->GuestRegs, sizeof(GuestReg) * GUESTREG_COUNT);\n\tmemcpy(m_State.HostRegs, state->HostRegs, sizeof(HostReg) * m_HostRegCount);\n\n\treturn;\n}\n\nvoid RegisterMap::CleanState(u32 &state_id)\n{\n\tif (state_id == INVALID_STATE_ID)\n\t{\n\t\tINFO(\"RegisterMap::CleanState() : state_id is not invalid\\n\");\n\n\t\treturn;\n\t}\n\n\tstd::map<u32, State*>::iterator itr = m_StateMap.find(state_id);\n\tif (itr == m_StateMap.end())\n\t{\n\t\tINFO(\"RegisterMap::RestoreState() : state_id[%u] is not exist\\n\", state_id);\n\n\t\treturn;\n\t}\n\n\tdelete itr->second;\n\tm_StateMap.erase(itr);\n\tstate_id = INVALID_STATE_ID;\n\n\treturn;\n}\n\nvoid RegisterMap::CleanAllStates()\n{\n\tfor (std::map<u32, State*>::iterator itr = m_StateMap.begin(); \n\t\titr != m_StateMap.end(); itr++)\n\t{\n\t\tdelete itr->second;\n\t}\n\n\tm_StateMap.clear();\n\n\treturn;\n}\n\nu32 RegisterMap::CalcStates(u32 state_id, const std::vector<u32> &states)\n{\n\tif (states.size() == 0)\n\t{\n\t\tINFO(\"RegisterMap::CalcStates() : state_end is empty\\n\");\n\n\t\treturn state_id;\n\t}\n\n\tstd::vector<State*> state_datas;\n\n\tstate_datas.reserve(states.size() + 1);\n\n\t{\n\t\tstd::map<u32, State*>::iterator itr = m_StateMap.find(state_id);\n\t\tif (itr != m_StateMap.end())\n\t\t\tstate_datas.push_back(itr->second);\n\n\t\tfor (size_t i = 0; i < states.size(); i++)\n\t\t{\n\t\t\tstd::map<u32, State*>::iterator itr = m_StateMap.find(states[i]);\n\t\t\tif (itr != m_StateMap.end())\n\t\t\t\tstate_datas.push_back(itr->second);\n\t\t}\n\t}\n\n\tif (state_datas.size() != states.size() + 1)\n\t{\n\t\tINFO(\"RegisterMap::CalcStates() : some state is not exist\\n\");\n\n\t\treturn state_id;\n\t}\n\t\n\tState *new_state = new State;\n\n\tnew_state->GuestRegs = new GuestReg[GUESTREG_COUNT];\n\tmemcpy(new_state->GuestRegs, state_datas[0]->GuestRegs, sizeof(GuestReg) * GUESTREG_COUNT);\n\tnew_state->HostRegs = new HostReg[m_HostRegCount];\n\tmemcpy(new_state->HostRegs, state_datas[0]->HostRegs, sizeof(HostReg) * m_HostRegCount);\n\t\n\tfor (u32 reg = 0; reg < GUESTREG_COUNT; reg++)\n\t{\n\t\tif (reg == R15)\n\t\t\tcontinue;\n\n\t\tfor (u32 s = 1; s < state_datas.size(); s++)\n\t\t{\n\t\t\tState *state = state_datas[s];\n\n\t\t\tswitch (new_state->GuestRegs[reg].state)\n\t\t\t{\n\t\t\tcase GuestReg::GRS_IMM:\n\t\t\t\tif (state->GuestRegs[reg].state != GuestReg::GRS_IMM || \n\t\t\t\t\tstate->GuestRegs[reg].immdata != new_state->GuestRegs[reg].immdata)\n\t\t\t\t{\n\t\t\t\t\tnew_state->GuestRegs[reg].state = GuestReg::GRS_MEM;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase GuestReg::GRS_MAPPED:\n\t\t\t\tif (state->GuestRegs[reg].state != GuestReg::GRS_MAPPED || \n\t\t\t\t\tstate->GuestRegs[reg].hostreg != new_state->GuestRegs[reg].hostreg || \n\t\t\t\t\tstate->HostRegs[state->GuestRegs[reg].hostreg].dirty != new_state->HostRegs[new_state->GuestRegs[reg].hostreg].dirty)\n\t\t\t\t{\n\t\t\t\t\tconst u32 hostreg = new_state->GuestRegs[reg].hostreg;\n\n\t\t\t\t\tnew_state->HostRegs[hostreg].guestreg = INVALID_REG_ID;\n\t\t\t\t\tnew_state->HostRegs[hostreg].swapdata = 0;\n\t\t\t\t\tnew_state->HostRegs[hostreg].alloced = false;\n\t\t\t\t\tnew_state->HostRegs[hostreg].dirty = false;\n\t\t\t\t\tif (new_state->HostRegs[hostreg].locked > 0)\n\t\t\t\t\t\tINFO(\"RegisterMap::CalcStates() : HostReg[%u] is locked\\n\", hostreg);\n\t\t\t\t\tnew_state->HostRegs[hostreg].locked = 0;\n\n\t\t\t\t\tnew_state->GuestRegs[reg].state = GuestReg::GRS_MEM;\n\t\t\t\t\tnew_state->GuestRegs[reg].hostreg = INVALID_REG_ID;\n\t\t\t\t}\n\t\t\t\telse if (state->GuestRegs[reg].state == GuestReg::GRS_MAPPED && \n\t\t\t\t\t\tstate->GuestRegs[reg].hostreg == new_state->GuestRegs[reg].hostreg)\n\t\t\t\t{\n\t\t\t\t\tconst u32 hostreg = new_state->GuestRegs[reg].hostreg;\n\n\t\t\t\t\tif (new_state->HostRegs[hostreg].locked != state->HostRegs[hostreg].locked)\n\t\t\t\t\t\tINFO(\"RegisterMap::CalcStates() : HostReg[%u] lock count is mismatch\\n\", hostreg);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase GuestReg::GRS_MEM:\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tINFO(\"RegisterMap::CalcStates() : GuestReg[%u] state unknow\\n\", reg);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (u32 hostreg = 0; hostreg < m_HostRegCount; hostreg++)\n\t{\n\t\tfor (u32 s = 1; s < state_datas.size(); s++)\n\t\t{\n\t\t\tState *state = state_datas[s];\n\n\t\t\tif (new_state->HostRegs[hostreg].alloced && \n\t\t\t\tnew_state->HostRegs[hostreg].guestreg == INVALID_REG_ID)\n\t\t\t{\n\t\t\t\tif (state->HostRegs[hostreg].alloced != new_state->HostRegs[hostreg].alloced || \n\t\t\t\t\tstate->HostRegs[hostreg].guestreg != new_state->HostRegs[hostreg].guestreg || \n\t\t\t\t\tstate->HostRegs[hostreg].locked != new_state->HostRegs[hostreg].locked)\n\t\t\t\t{\n\t\t\t\t\tINFO(\"RegisterMap::CalcStates() : HostRegs[%u] is mismatch1\\n\", hostreg);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (state->HostRegs[hostreg].alloced && \n\t\t\t\tstate->HostRegs[hostreg].guestreg == INVALID_REG_ID)\n\t\t\t{\n\t\t\t\tif (state->HostRegs[hostreg].alloced != new_state->HostRegs[hostreg].alloced || \n\t\t\t\t\tstate->HostRegs[hostreg].guestreg != new_state->HostRegs[hostreg].guestreg || \n\t\t\t\t\tstate->HostRegs[hostreg].locked != new_state->HostRegs[hostreg].locked)\n\t\t\t\t{\n\t\t\t\t\tINFO(\"RegisterMap::CalcStates() : HostRegs[%u] is mismatch2\\n\", hostreg);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tu32 new_state_id = GenStateData();\n\tm_StateMap.insert(std::make_pair(new_state_id, new_state));\n\n\treturn new_state_id;\n}\n\nvoid RegisterMap::MergeToStates(u32 state_id)\n{\n\tm_IsInMerge = true;\n\n\tif (state_id == INVALID_STATE_ID)\n\t{\n\t\tINFO(\"RegisterMap::MergeToStates() : state_id is not invalid\\n\");\n\n\t\treturn;\n\t}\n\n\tstd::map<u32, State*>::iterator itr = m_StateMap.find(state_id);\n\tif (itr == m_StateMap.end())\n\t{\n\t\tINFO(\"RegisterMap::MergeToStates() : state_id[%u] is not exist\\n\", state_id);\n\n\t\treturn;\n\t}\n\n\tState *state = itr->second;\n\n\tfor (u32 reg = 0; reg < GUESTREG_COUNT; reg++)\n\t{\n\t\tif (reg == R15)\n\t\t\tcontinue;\n\n\t\tswitch (state->GuestRegs[reg].state)\n\t\t{\n\t\tcase GuestReg::GRS_IMM:\n\t\t\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_IMM || \n\t\t\t\tm_State.GuestRegs[reg].immdata != state->GuestRegs[reg].immdata)\n\t\t\t{\n\t\t\t\tINFO(\"RegisterMap::MergeToStates() : GuestReg[%u] state mismatch1\\n\", reg);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase GuestReg::GRS_MAPPED:\n\t\t\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_MAPPED || \n\t\t\t\tm_State.GuestRegs[reg].hostreg != state->GuestRegs[reg].hostreg)\n\t\t\t{\n\t\t\t\tINFO(\"RegisterMap::MergeToStates() : GuestReg[%u] state mismatch2\\n\", reg);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase GuestReg::GRS_MEM:\n\t\t\tif (m_State.GuestRegs[reg].state != GuestReg::GRS_MEM)\n\t\t\t{\n\t\t\t\tFlushGuestReg((GuestRegId)reg);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tINFO(\"RegisterMap::MergeToStates() : GuestReg[%u] state unknow\\n\", reg);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (u32 hostreg = 0; hostreg < m_HostRegCount; hostreg++)\n\t{\n\t\tif (m_State.HostRegs[hostreg].alloced != state->HostRegs[hostreg].alloced)\n\t\t{\n\t\t\tINFO(\"RegisterMap::MergeToStates() : HostRegs[%u] is mismatch(allocate)\\n\", hostreg);\n\t\t}\n\t\telse if (m_State.HostRegs[hostreg].alloced && \n\t\t\t\t(m_State.HostRegs[hostreg].guestreg != state->HostRegs[hostreg].guestreg || \n\t\t\t\tm_State.HostRegs[hostreg].dirty != state->HostRegs[hostreg].dirty || \n\t\t\t\tm_State.HostRegs[hostreg].locked != state->HostRegs[hostreg].locked))\n\t\t{\n\t\t\tINFO(\"RegisterMap::MergeToStates() : HostRegs[%u] is mismatch\\n\", hostreg);\n\t\t}\n\t}\n\n\tm_IsInMerge = false;\n}\n\nRegisterMap::RegisterMap(u32 HostRegCount)\n\t: m_HostRegCount(HostRegCount)\n\t, m_CpuPtrReg(INVALID_REG_ID)\n\t, m_SwapData(0)\n\t, m_StateData(0)\n\t, m_IsInMerge(false)\n\t, m_Context(NULL)\n\t, m_Cpu(NULL)\n{\n\tm_State.GuestRegs = new GuestReg[GUESTREG_COUNT];\n\tm_State.HostRegs = new HostReg[HostRegCount];\n}\n\nu32 RegisterMap::FindFreeHostReg()\n{\n\tu32 freereg = INVALID_REG_ID;\n\n\t// find a free hostreg\n\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t{\n\t\tif (!m_State.HostRegs[i].alloced)\n\t\t{\n\t\t\tfreereg = i;\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn freereg;\n}\n\nu32 RegisterMap::FindFirstHostReg()\n{\n\tu32 reg = INVALID_REG_ID;\n\n\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t{\n\t\tif (i != GetCpuPtrReg())\n\t\t{\n\t\t\treg = i;\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (reg == INVALID_REG_ID)\n\t\tINFO(\"RegisterMap::FindFirstHostReg() : no HostReg?\\n\");\n\n\treturn reg;\n}\n\nu32 RegisterMap::AllocHostReg(bool preserved)\n{\n\tu32 freereg = INVALID_REG_ID;\n\n\t// find a free hostreg\n\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t{\n\t\tif (!m_State.HostRegs[i].alloced && \n\t\t\t(!preserved || IsPerdureHostReg(i)))\n\t\t{\n\t\t\tfreereg = i;\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (freereg == INVALID_REG_ID)\n\t{\n\t\t// no free hostreg\n\t\tif (m_IsInMerge)\n\t\t\treturn INVALID_REG_ID;\n\n\t\t// no free hostreg, try swap\n\t\tstruct SwapData\n\t\t{\n\t\t\tu32 hostreg;\n\t\t\tu32 swapdata;\n\t\t\tbool dirty;\n\n\t\t\tstatic int Compare(const void *p1, const void *p2)\n\t\t\t{\n\t\t\t\tconst SwapData *data1 = (const SwapData *)p1;\n\t\t\t\tconst SwapData *data2 = (const SwapData *)p2;\n\n\t\t\t\tif (data1->swapdata > data2->swapdata)\n\t\t\t\t\treturn 1;\n\t\t\t\telse if (data1->swapdata < data2->swapdata)\n\t\t\t\t\treturn -1;\n\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t};\n\n\t\tSwapData *swaplist = (SwapData*)_alloca32(m_HostRegCount * sizeof(SwapData));\n\n\t\tu32 swapcount = 0;\n\t\tfor (u32 i = 0; i < m_HostRegCount; i++)\n\t\t{\n\t\t\tif (m_State.HostRegs[i].alloced && !m_State.HostRegs[i].locked && \n\t\t\t\t(!preserved || IsPerdureHostReg(i)))\n\t\t\t{\n\t\t\t\tswaplist[swapcount].hostreg = i;\n\t\t\t\tswaplist[swapcount].swapdata = m_State.HostRegs[i].swapdata;\n\t\t\t\tswaplist[swapcount].dirty = m_State.HostRegs[i].dirty;\n\t\t\t\tswapcount++;\n\t\t\t}\n\t\t}\n\n\t\tif (swapcount > 0)\n\t\t{\n\t\t\tif (swapcount > 1)\n\t\t\t\tqsort(swaplist, swapcount, sizeof(SwapData), &SwapData::Compare);\n\n\t\t\t//for (u32 i = 0; i < swapcount; i++)\n\t\t\t//{\n\t\t\t//\tINFO(\"RegisterMap::AllocHostReg() : HostRegs[%u %u %u].\\n\", swaplist[i].hostreg, swaplist[i].swapdata, swaplist[i].dirty);\n\t\t\t//}\n\t\t\t//INFO(\"\\n\");\n\n\t\t\tfreereg = swaplist[0].hostreg;\n\n\t\t\tFlushHostReg(freereg);\n\t\t}\n\t\telse\n\t\t\treturn INVALID_REG_ID;\n\t}\n\n\tm_State.HostRegs[freereg].guestreg = INVALID_REG_ID;\n\tm_State.HostRegs[freereg].swapdata = 0;\n\tm_State.HostRegs[freereg].alloced = true;\n\tm_State.HostRegs[freereg].dirty = false;\n\tm_State.HostRegs[freereg].locked = 0;\n\n\treturn freereg;\n}\n\nu32 RegisterMap::GenSwapData()\n{\n\treturn m_SwapData++;\n}\n\nu32 RegisterMap::GenStateData()\n{\n\treturn m_StateData++;\n}\n\n//CACHE_ALIGN u8 g_RecompileCounts[(1<<26)/16];\n\nvoid JitLutInit()\n{\n#ifdef MAPPED_JIT_FUNCS\n\tJIT_MASK[ARMCPU_ARM9][2*2+0] = _MMU_MAIN_MEM_MASK;\n\tJIT_MASK[ARMCPU_ARM9][2*2+1] = _MMU_MAIN_MEM_MASK;\n\n\tfor (int proc = 0; proc < JitLut::JIT_MEM_COUNT; proc++)\n\t{\n\t\tfor (int i = 0; i < JitLut::JIT_MEM_LEN; i++)\n\t\t{\n\t\t\tg_JitLut.JIT_MEM[proc][i] = JIT_MEM[proc][i>>9] + (((i<<14) & JIT_MASK[proc][i>>9]) >> 1);\n\t\t}\n\t}\n#endif\n}\n\nvoid JitLutDeInit()\n{\n}\n\nvoid JitLutReset()\n{\n#ifdef MAPPED_JIT_FUNCS\n\tmemset(g_JitLut.MAIN_MEM,  0, sizeof(g_JitLut.MAIN_MEM));\n\tmemset(g_JitLut.SWIRAM,    0, sizeof(g_JitLut.SWIRAM));\n\tmemset(g_JitLut.ARM9_ITCM, 0, sizeof(g_JitLut.ARM9_ITCM));\n\tmemset(g_JitLut.ARM9_LCDC, 0, sizeof(g_JitLut.ARM9_LCDC));\n\tmemset(g_JitLut.ARM9_BIOS, 0, sizeof(g_JitLut.ARM9_BIOS));\n\tmemset(g_JitLut.ARM7_BIOS, 0, sizeof(g_JitLut.ARM7_BIOS));\n\tmemset(g_JitLut.ARM7_ERAM, 0, sizeof(g_JitLut.ARM7_ERAM));\n\tmemset(g_JitLut.ARM7_WIRAM,0, sizeof(g_JitLut.ARM7_WIRAM));\n\tmemset(g_JitLut.ARM7_WRAM, 0, sizeof(g_JitLut.ARM7_WRAM));\n#else\n\tmemset(g_CompiledFuncs, 0, sizeof(g_CompiledFuncs));\n#endif\n\t//memset(g_RecompileCounts,0, sizeof(g_RecompileCounts));\n}\n\nvoid FlushIcacheSection(u8 *begin, u8 *end)\n{\n#ifdef _MSC_VER\n\tFlushInstructionCache(GetCurrentProcess(), begin, end - begin);\n#else\n\t__builtin___clear_cache(begin, end);\n#endif\n}\n\n#endif //HAVE_JIT\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/JitCommon.h",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef JIT_COMMON\n#define JIT_COMMON\n\n#include \"common.h\"\n#include <vector>\n#include <map>\n\n#ifdef HAVE_JIT\n\n#if defined(_WINDOWS) || defined(DESMUME_COCOA)\n#define MAPPED_JIT_FUNCS\n#elif defined(ANDROID)\n#define MAPPED_JIT_FUNCS\n#endif\n\n#ifdef MAPPED_JIT_FUNCS\nstruct JitLut\n{\n\tstatic const int MAIN_MEM_LEN = 16*1024*1024/2;\n\tstatic const int SWIRAM_LEN = 0x8000/2;\n\tstatic const int ARM9_ITCM_LEN = 0x8000/2;\n\tstatic const int ARM9_LCDC_LEN = 0xA4000/2;\n\tstatic const int ARM9_BIOS_LEN = 0x8000/2;\n\tstatic const int ARM7_BIOS_LEN = 0x4000/2;\n\tstatic const int ARM7_ERAM_LEN = 0x10000/2;\n\tstatic const int ARM7_WIRAM_LEN = 0x10000/2;\n\tstatic const int ARM7_WRAM_LEN = 0x40000/2;\n\tstatic const int JIT_MEM_COUNT = 2;\n\tstatic const int JIT_MEM_LEN = 0x4000;\n\n\tuintptr_t MAIN_MEM[MAIN_MEM_LEN];\n\tuintptr_t SWIRAM[SWIRAM_LEN];\n\tuintptr_t ARM9_ITCM[ARM9_ITCM_LEN];\n\tuintptr_t ARM9_LCDC[ARM9_LCDC_LEN];\n\tuintptr_t ARM9_BIOS[ARM9_BIOS_LEN];\n\tuintptr_t ARM7_BIOS[ARM7_BIOS_LEN];\n\tuintptr_t ARM7_ERAM[ARM7_ERAM_LEN];\n\tuintptr_t ARM7_WIRAM[ARM7_WIRAM_LEN];\n\tuintptr_t ARM7_WRAM[ARM7_WRAM_LEN];\n\n\tuintptr_t* JIT_MEM[JIT_MEM_COUNT][JIT_MEM_LEN];\n};\nextern CACHE_ALIGN JitLut g_JitLut;\n#define JITLUT_HANDLE(adr, PROCNUM) g_JitLut.JIT_MEM[PROCNUM][((adr)&0x0FFFC000)>>14][((adr)&0x00003FFE)>>1]\n#define JITLUT_HANDLE_PREMASKED(adr, PROCNUM, ofs) g_JitLut.JIT_MEM[PROCNUM][(adr)>>14][(((adr)&0x00003FFE)>>1)+ofs]\n#define JITLUT_HANDLE_KNOWNBANK(adr, bank, mask, ofs) g_JitLut.bank[(((adr)&(mask))>>1)+ofs]\n#define JITLUT_MAPPED(adr, PROCNUM) g_JitLut.JIT_MEM[PROCNUM][(adr)>>14]\n#else\nextern uintptr_t g_CompiledFuncs[];\n#define JITLUT_HANDLE(adr, PROCNUM) g_CompiledFuncs[((adr) & 0x07FFFFFE) >> 1]\n#define JITLUT_HANDLE_PREMASKED(adr, PROCNUM, ofs) JITLUT_HANDLE(adr, PROCNUM)\n#define JITLUT_HANDLE_KNOWNBANK(adr, bank, mask, ofs) JITLUT_HANDLE(adr, PROCNUM)\n#define JITLUT_MAPPED(adr, PROCNUM) true\n#endif\n\nstruct JitBlock\n{\n\tconst u8 *checkedEntry;\n\tconst u8 *normalEntry;\n\n\tu8 *exitPtrs[2];\t\t // to be able to rewrite the exit jum\n\tu32 exitAddress[2];\t// 0xFFFFFFFF == unknown\n\n\tu32 originalAddress;\n\tu32 originalFirstOpcode; //to be able to restore\n\tu32 codeSize; \n\tu32 originalSize;\n\tint runCount;\t// for profiling.\n\tint blockNum;\n\tint flags;\n\n\tbool invalid;\n\tbool linkStatus[2];\n\tbool ContainsAddress(u32 em_address);\n\n#ifdef _WIN32\n\t// we don't really need to save start and stop\n\t// TODO (mb2): ticStart and ticStop -> \"local var\" mean \"in block\" ... low priority ;)\n\tu64 ticStart;\t\t// for profiling - time.\n\tu64 ticStop;\t\t// for profiling - time.\n\tu64 ticCounter;\t// for profiling - time.\n#endif\n\n#ifdef USE_VTUNE\n\tchar blockName[32];\n#endif\n};\n\n#define INVALID_REG_ID ((u32)-1)\n#define INVALID_STATE_ID ((u32)-1)\n\nstruct ImmData\n{\n\tenum Type\n\t{\n\t\tIMM8,\n\t\tIMM16,\n\t\tIMM32,\n\t\tIMMPTR,\n\t};\n\n\tType type;\n\tunion\n\t{\n\t\tu8 imm8;\n\t\tu16 imm16;\n\t\tu32 imm32;\n\t\tvoid* immptr;\n\t};\n\n\tImmData()\n\t\t: type(IMM32)\n\t\t, imm32(0)\n\t{\n\t}\n\n\tbool operator !=(const ImmData &right)\n\t{\n\t\tif (type != right.type)\n\t\t\treturn true;\n\n\t\tswitch (type)\n\t\t{\n\t\tcase IMM8:\n\t\t\treturn imm8 != right.imm8;\n\t\t\tbreak;\n\n\t\tcase IMM16:\n\t\t\treturn imm16 != right.imm16;\n\t\t\tbreak;\n\n\t\tcase IMM32:\n\t\t\treturn imm32 != right.imm32;\n\t\t\tbreak;\n\n\t\tcase IMMPTR:\n\t\t\treturn immptr != right.immptr;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn false;\n\t}\n};\n\nstruct GuestReg\n{\n\tenum GuestRegState\n\t{\n\t\tGRS_IMM,\n\t\tGRS_MAPPED,\n\t\tGRS_MEM,\n\t};\n\n\tGuestRegState state;\n\tu32 hostreg;\n\tImmData immdata;\n\n\tGuestReg()\n\t\t: state(GRS_MEM)\n\t\t, hostreg(INVALID_REG_ID)\n\t{\n\t}\n};\n\nstruct HostReg\n{\n\tu32 guestreg;\n\tu32 swapdata;\n\tbool alloced;\n\tbool dirty;\n\tu16 locked;\n\n\tHostReg()\n\t\t: guestreg(INVALID_REG_ID)\n\t\t, swapdata(0)\n\t\t, alloced(false)\n\t\t, dirty(false)\n\t\t, locked(0)\n\t{\n\t}\n};\n\nstruct ABIOp\n{\n\tenum Type\n\t{\n\t\tIMM,\n\t\tGUSETREG,\n\t\tHOSTREG,\n\t\tTEMPREG,\n\t\tGUSETREGPTR,\n\t};\n\n\tType type;\n\tu32 regdata;\n\tImmData immdata;\n\n\tABIOp()\n\t\t: type(IMM)\n\t\t, regdata(INVALID_REG_ID)\n\t{\n\t}\n};\n\nclass RegisterMap\n{\npublic:\n\tenum GuestRegId\n\t{\n\t\tR0 = 0,\n\t\tR1,\n\t\tR2,\n\t\tR3,\n\t\tR4,\n\t\tR5,\n\t\tR6,\n\t\tR7,\n\t\tR8,\n\t\tR9,\n\t\tR10,\n\t\tR11,\n\t\tR12,\n\t\tR13,\n\t\tR14,\n\t\tR15,\n\t\tCPSR,\n\t\tSPSR,\n\t\t//\n\t\tEXECUTECYCLES,\n\t\t//\n\t\tGUESTREG_COUNT,\n\t};\n\n\tenum MapFlag\n\t{\n\t\tMAP_NORMAL = 0,\n\t\tMAP_DIRTY = 1,\n\t\tMAP_NOTINIT = 2,\n\t};\n\npublic:\n\tvirtual ~RegisterMap();\n\npublic:\n\tbool Start(void *context, struct armcpu_t *armcpu);\n\tvoid End(bool cleanup);\n\n\tvoid PrintProfile();\n\n\tbool IsImm(GuestRegId reg) const;\n\tvoid SetImm8(GuestRegId reg, u8 imm);\n\tvoid SetImm16(GuestRegId reg, u16 imm);\n\tvoid SetImm32(GuestRegId reg, u32 imm);\n\tvoid SetImmPtr(GuestRegId reg, void* imm);\n\tu8 GetImm8(GuestRegId reg) const;\n\tu16 GetImm16(GuestRegId reg) const;\n\tu32 GetImm32(GuestRegId reg) const;\n\tvoid* GetImmPtr(GuestRegId reg) const;\n\n\tu32 MapReg(GuestRegId reg, u32 mapflag = MAP_NORMAL);\n\tu32 MappedReg(GuestRegId reg);\n\tvoid DiscardReg(GuestRegId reg, bool force);\n\n\tu32 GetCpuPtrReg();\n\n\tu32 AllocTempReg(bool preserved = false);\n\tvoid ReleaseTempReg(u32 &reg);\n\n\tvoid Lock(u32 reg);\n\tvoid Unlock(u32 reg);\n\tvoid UnlockAll();\n\n\tvoid FlushGuestReg(GuestRegId reg);\n\tvoid FlushHostReg(u32 reg);\n\tvoid FlushAll(bool onlyreal);\n\n\tu32 StoreState();\n\tvoid RestoreState(u32 state_id);\n\tvoid CleanState(u32 &state_id);\n\tvoid CleanAllStates();\n\tu32 CalcStates(u32 state_id, const std::vector<u32> &states);\n\tvoid MergeToStates(u32 state_id);\n\n\tvirtual void CallABI(void* funptr, \n\t\t\t\t\t\tconst std::vector<ABIOp> &args, \n\t\t\t\t\t\tconst std::vector<GuestRegId> &flushs, \n\t\t\t\t\t\tu32 hostreg_ret = INVALID_REG_ID, \n\t\t\t\t\t\tImmData::Type type_ret = ImmData::IMM32) = 0;\n\nprotected:\n\tRegisterMap(u32 HostRegCount);\n\n\tu32 FindFreeHostReg();\n\tu32 FindFirstHostReg();\n\n\tu32 AllocHostReg(bool preserved);\n\tu32 GenSwapData();\n\tu32 GenStateData();\n\n\tvirtual void StartBlock() = 0;\n\tvirtual void EndBlock() = 0;\n\n\tvirtual void StoreGuestReg(u32 hostreg, GuestRegId guestreg) = 0;\n\tvirtual void LoadGuestReg(u32 hostreg, GuestRegId guestreg) = 0;\n\n\tvirtual void StoreImm(GuestRegId guestreg, const ImmData &data) = 0;\n\tvirtual void LoadImm(u32 hostreg, const ImmData &data) = 0;\n\n\tvirtual bool IsPerdureHostReg(u32 hostreg) = 0;\n\nprotected:\n\tstruct Profile\n\t{\n\t\tu32 TempRegCount;\n\t\tu32 MapRegCount;\n\t\tu32 SetImmCount;\n\t\tu32 GetImmCount;\n\t\tu32 StoreRegCount;\n\t\tu32 LoadRegCount;\n\t\tu32 BackupRegCount;\n\t\tu32 CallABICount;\n\n\t\tvoid Reset()\n\t\t{\n\t\t\tTempRegCount = 0;\n\t\t\tMapRegCount = 0;\n\t\t\tSetImmCount = 0;\n\t\t\tGetImmCount = 0;\n\t\t\tStoreRegCount = 0;\n\t\t\tLoadRegCount = 0;\n\t\t\tBackupRegCount = 0;\n\t\t\tCallABICount = 0;\n\t\t}\n\t};\n\tmutable Profile m_Profile;\n\n\tstruct State\n\t{\n\t\tGuestReg *GuestRegs;\n\t\tHostReg *HostRegs;\n\n\t\tState()\n\t\t\t: GuestRegs(NULL)\n\t\t\t, HostRegs(NULL)\n\t\t{\n\t\t}\n\n\t\t~State()\n\t\t{\n\t\t\tdelete [] GuestRegs;\n\t\t\tdelete [] HostRegs;\n\t\t}\n\t}m_State;\n\n\tu32 m_HostRegCount;\n\n\tu32 m_CpuPtrReg;\n\n\tu32 m_SwapData;\n\tu32 m_StateData;\n\n\tstd::map<u32, State*> m_StateMap;\n\n\tbool m_IsInMerge;\n\n\tvoid *m_Context;\n\tstruct armcpu_t *m_Cpu;\n};\n\nvoid JitLutInit();\n\nvoid JitLutDeInit();\n\nvoid JitLutReset();\n\nvoid FlushIcacheSection(u8 *begin, u8 *end);\n\n//extern CACHE_ALIGN u8 g_RecompileCounts[(1<<26)/16];\n\n//FORCEINLINE bool JitBlockModify(u32 adr)\n//{\n//\tu32 mask_adr = (adr & 0x07FFFFFE) >> 4;\n//\n//\tif (((g_RecompileCounts[mask_adr >> 1] >> 4*(mask_adr & 1)) & 0xF) > 8)\n//\t\treturn false;\n//\n//\tg_RecompileCounts[mask_adr >> 1] += 1 << 4*(mask_adr & 1);\n//\n//\treturn true;\n//}\n\n#endif //HAVE_JIT\n\n#endif //JIT_COMMON\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/MMU.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2007 shash\n\tCopyright (C) 2007-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdlib.h>\n#include <math.h>\n#include <string.h>\n#include <assert.h>\n#include <sstream>\n\n#include \"common.h\"\n#include \"debug.h\"\n#include \"NDSSystem.h\"\n#include \"cp15.h\"\n#include \"wifi.h\"\n#include \"registers.h\"\n#include \"render3D.h\"\n#include \"gfx3d.h\"\n#include \"rtc.h\"\n#include \"mc.h\"\n#include \"addons.h\"\n#include \"slot1.h\"\n#include \"mic.h\"\n#include \"movie.h\"\n#include \"readwrite.h\"\n#include \"MMU_timing.h\"\n\n#ifdef DO_ASSERT_UNALIGNED\n#define ASSERT_UNALIGNED(x) assert(x)\n#else\n#define ASSERT_UNALIGNED(x)\n#endif\n\n#define FLOATING_SQRT\n\n#ifdef HAVE_NEON\n#include \"android/math-neon/math_neon.h\"\n#endif\n\n//http://home.utah.edu/~nahaj/factoring/isqrt.c.html\nstatic u64 isqrt (u64 x) {\n  \n\n   if (x<1) return 0;\n\n#ifdef FLOATING_SQRT\n\t#ifdef HAVE_NEON\n\t\treturn sqrtf_neon_sfp(x);\n\t#else\n\t   return sqrt((double)x);\n\t#endif\n   \n#else\n  u64   squaredbit, remainder, root;\n   /* Load the binary constant 01 00 00 ... 00, where the number\n    * of zero bits to the right of the single one bit\n    * is even, and the one bit is as far left as is consistant\n    * with that condition.)\n    */\n   squaredbit  = (u64) ((((u64) ~0LL) >> 1) & \n                        ~(((u64) ~0LL) >> 2));\n   /* This portable load replaces the loop that used to be \n    * here, and was donated by  legalize@xmission.com \n    */\n\n   /* Form bits of the answer. */\n   remainder = x;  root = 0;\n   while (squaredbit > 0) {\n     if (remainder >= (squaredbit | root)) {\n         remainder -= (squaredbit | root);\n         root >>= 1; root |= squaredbit;\n     } else {\n         root >>= 1;\n     }\n     squaredbit >>= 2; \n   }\n\n   return root;\n#endif\n}\n\nu32 partie = 1;\nu32 _MMU_MAIN_MEM_MASK = 0x3FFFFF;\nu32 _MMU_MAIN_MEM_MASK16 = 0x3FFFFF & ~1;\nu32 _MMU_MAIN_MEM_MASK32 = 0x3FFFFF & ~3;\n\n//#define\t_MMU_DEBUG\n\n#ifdef _MMU_DEBUG\n\n#include <stdarg.h>\nvoid mmu_log_debug_ARM9(u32 adr, const char *fmt, ...)\n{\n\tif (adr < 0x4000000) return;\n//\tif (adr > 0x4100014) return;\n//#if 1\n\tif (adr >= 0x4000000 && adr <= 0x400006E) return;\t\t// Display Engine A\n\tif (adr >= 0x40000B0 && adr <= 0x4000134) return;\t\t// DMA, Timers and Keypad\n\tif (adr >= 0x4000180 && adr <= 0x40001BC) return;\t\t// IPC/ROM\n\tif (adr >= 0x4000204 && adr <= 0x400024A) return;\t\t// Memory & IRQ control\n\tif (adr >= 0x4000280 && adr <= 0x4000306) return;\t\t// Maths\n\tif (adr >= 0x4000320 && adr <= 0x40006A3) return;\t\t// 3D dispaly engine\n\tif (adr >= 0x4001000 && adr <= 0x400106E) return;\t\t// Display Engine B\n\tif (adr >= 0x4100000 && adr <= 0x4100014) return;\t\t// IPC/ROM\n//#endif\n\tva_list list;\n\tchar msg[512];\n\n\tmemset(msg,0,512);\n\n\tva_start(list,fmt);\n\t\t_vsnprintf(msg,511,fmt,list);\n\tva_end(list);\n\n\tINFO(\"MMU ARM9 0x%08X: %s\\n\", adr, msg);\n}\n\nvoid mmu_log_debug_ARM7(u32 adr, const char *fmt, ...)\n{\n\tif (adr < 0x4000004) return;\n\tif (adr > 0x4808FFF) return;\n#if 1\n\tif (adr >= 0x4000004 && adr < 0x4000180) return;\t\t// ARM7 I/O Map\n\tif (adr >= 0x4000180 && adr <= 0x40001C4) return;\t\t// IPC/ROM\n\tif (adr >= 0x4000204 && adr <= 0x400030C) return;\t\t// Memory and IRQ Control\n\tif (adr >= 0x4000400 && adr <= 0x400051E) return;\t\t// Sound Registers\n\tif (adr >= 0x4100000 && adr <= 0x4100014) return;\t\t// IPC/ROM\n\tif (adr >= 0x4800000 && adr <= 0x4808FFF) return;\t\t// WLAN Registers\n#endif\n\tva_list list;\n\tchar msg[512];\n\n\tmemset(msg,0,512);\n\n\tva_start(list,fmt);\n\t\t_vsnprintf(msg,511,fmt,list);\n\tva_end(list);\n\n\tINFO(\"MMU ARM7 0x%08X: %s\\n\", adr, msg);\n\n}\n#else\n#define mmu_log_debug_ARM9(...)\n#define mmu_log_debug_ARM7(...)\n#endif\n\n\n//#define LOG_CARD\n//#define LOG_GPU\n//#define LOG_DMA\n//#define LOG_DMA2\n//#define LOG_DIV\n\nMMU_struct MMU;\nMMU_struct_new MMU_new;\nMMU_struct_timing MMU_timing;\n\nu8 * MMU_struct::MMU_MEM[2][256] = {\n\t//arm9\n\t{\n\t\t/* 0X*/\tDUP16(MMU.ARM9_ITCM), \n\t\t/* 1X*/\t//DUP16(MMU.ARM9_ITCM)\n\t\t/* 1X*/\tDUP16(MMU.UNUSED_RAM), \n\t\t/* 2X*/\tDUP16(MMU.MAIN_MEM),\n\t\t/* 3X*/\tDUP16(MMU.SWIRAM),\n\t\t/* 4X*/\tDUP16(MMU.ARM9_REG),\n\t\t/* 5X*/\tDUP16(MMU.ARM9_VMEM),\n\t\t/* 6X*/\tDUP16(MMU.ARM9_LCD),\n\t\t/* 7X*/\tDUP16(MMU.ARM9_OAM),\n\t\t/* 8X*/\tDUP16(NULL),\n\t\t/* 9X*/\tDUP16(NULL),\n\t\t/* AX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* BX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* CX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* DX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* EX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* FX*/\tDUP16(MMU.ARM9_BIOS)\n\t},\n\t//arm7\n\t{\n\t\t/* 0X*/\tDUP16(MMU.ARM7_BIOS), \n\t\t/* 1X*/\tDUP16(MMU.UNUSED_RAM), \n\t\t/* 2X*/\tDUP16(MMU.MAIN_MEM),\n\t\t/* 3X*/\tDUP8(MMU.SWIRAM),\n\t\t\t\tDUP8(MMU.ARM7_ERAM),\n\t\t/* 4X*/\tDUP8(MMU.ARM7_REG),\n\t\t\t\tDUP8(MMU.ARM7_WIRAM),\n\t\t/* 5X*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* 6X*/\tDUP16(MMU.ARM9_LCD),\n\t\t/* 7X*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* 8X*/\tDUP16(NULL),\n\t\t/* 9X*/\tDUP16(NULL),\n\t\t/* AX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* BX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* CX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* DX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* EX*/\tDUP16(MMU.UNUSED_RAM),\n\t\t/* FX*/\tDUP16(MMU.UNUSED_RAM)\n\t\t}\n};\n\nu32 MMU_struct::MMU_MASK[2][256] = {\n\t//arm9\n\t{\n\t\t/* 0X*/\tDUP16(0x00007FFF), \n\t\t/* 1X*/\t//DUP16(0x00007FFF)\n\t\t/* 1X*/\tDUP16(0x00000003),\n\t\t/* 2X*/\tDUP16(0x003FFFFF),\n\t\t/* 3X*/\tDUP16(0x00007FFF),\n\t\t/* 4X*/\tDUP16(0x00FFFFFF),\n\t\t/* 5X*/\tDUP16(0x000007FF),\n\t\t/* 6X*/\tDUP16(0x00FFFFFF),\n\t\t/* 7X*/\tDUP16(0x000007FF),\n\t\t/* 8X*/\tDUP16(0x00000003),\n\t\t/* 9X*/\tDUP16(0x00000003),\n\t\t/* AX*/\tDUP16(0x00000003),\n\t\t/* BX*/\tDUP16(0x00000003),\n\t\t/* CX*/\tDUP16(0x00000003),\n\t\t/* DX*/\tDUP16(0x00000003),\n\t\t/* EX*/\tDUP16(0x00000003),\n\t\t/* FX*/\tDUP16(0x00007FFF)\n\t},\n\t//arm7\n\t{\n\t\t/* 0X*/\tDUP16(0x00003FFF), \n\t\t/* 1X*/\tDUP16(0x00000003),\n\t\t/* 2X*/\tDUP16(0x003FFFFF),\n\t\t/* 3X*/\tDUP8(0x00007FFF),\n\t\t\t\tDUP8(0x0000FFFF),\n\t\t/* 4X*/\tDUP8(0x00FFFFFF),\n\t\t\t\tDUP8(0x0000FFFF),\n\t\t/* 5X*/\tDUP16(0x00000003),\n\t\t/* 6X*/\tDUP16(0x00FFFFFF),\n\t\t/* 7X*/\tDUP16(0x00000003),\n\t\t/* 8X*/\tDUP16(0x00000003),\n\t\t/* 9X*/\tDUP16(0x00000003),\n\t\t/* AX*/\tDUP16(0x00000003),\n\t\t/* BX*/\tDUP16(0x00000003),\n\t\t/* CX*/\tDUP16(0x00000003),\n\t\t/* DX*/\tDUP16(0x00000003),\n\t\t/* EX*/\tDUP16(0x00000003),\n\t\t/* FX*/\tDUP16(0x00000003)\n\t\t}\n};\n\n// this logic was moved to MMU_timing.h\n//CACHE_ALIGN\n//TWaitState MMU_struct::MMU_WAIT16[2][16] = {\n//\t{ 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1 }, //arm9\n//\t{ 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1 }, //arm7\n//};\n//\n//CACHE_ALIGN\n//TWaitState MMU_struct::MMU_WAIT32[2][16] = {\n//\t{ 1, 1, 1, 1, 1, 2, 2, 1, 8, 8, 5, 1, 1, 1, 1, 1 }, //arm9\n//\t{ 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 5, 1, 1, 1, 1, 1 }, //arm7\n//};\n\n//////////////////////////////////////////////////////////////\n\n//-------------\n//VRAM MEMORY MAPPING\n//-------------\n//(Everything is mapped through to ARM9_LCD in blocks of 16KB)\n\n//for all of the below, values = 41 indicate unmapped memory\n#define VRAM_PAGE_UNMAPPED 41\n\n#define VRAM_LCDC_PAGES 41\nu8 vram_lcdc_map[VRAM_LCDC_PAGES];\n\n//in the range of 0x06000000 - 0x06800000 in 16KB pages (the ARM9 vram mappable area)\n//this maps to 16KB pages in the LCDC buffer which is what will actually contain the data\nu8 vram_arm9_map[VRAM_ARM9_PAGES];\n\n//this chooses which banks are mapped in the 128K banks starting at 0x06000000 in ARM7\nu8 vram_arm7_map[2];\n\n//----->\n//consider these later, for better recordkeeping, instead of using the u8* in MMU\n\n////for each 128KB texture slot, this maps to a 16KB starting page in the LCDC buffer\n//#define VRAM_TEX_SLOTS 4\n//u8 vram_tex_map[VRAM_TEX_SLOTS];\n//\n////for each 16KB tex palette slot, this maps to a 16KB starting page in the LCDC buffer\n//#define VRAM_TEX_PALETTE_SLOTS 6\n//u8 vram_tex_palette_map[VRAM_TEX_PALETTE_SLOTS];\n\n//<---------\n\n\nvoid MMU_VRAM_unmap_all();\n\nstruct TVramBankInfo {\n\tu8 page_addr, num_pages;\n};\n\nstatic const TVramBankInfo vram_bank_info[VRAM_BANKS] = {\n\t{0,8},\n\t{8,8},\n\t{16,8},\n\t{24,8},\n\t{32,4},\n\t{36,1},\n\t{37,1},\n\t{38,2},\n\t{40,1}\n};\n\n//this is to remind you that the LCDC mapping returns a strange value (not 0x06800000) as you would expect\n//in order to play nicely with the MMU address and mask tables\n#define LCDC_HACKY_LOCATION 0x06000000\n\n#define ARM7_HACKY_IWRAM_LOCATION 0x03800000\n#define ARM7_HACKY_SIWRAM_LOCATION 0x03000000\n\n//maps an ARM9 BG/OBJ or LCDC address into an LCDC address, and informs the caller of whether it isn't mapped\n//TODO - in cases where this does some mapping work, we could bypass the logic at the end of the _read* and _write* routines\n//this is a good optimization to consider\n//NOTE - this whole approach is probably fundamentally wrong.\n//according to dasShiny research, its possible to map multiple banks to the same addresses. something more sophisticated would be needed.\n//however, it hasnt proven necessary yet for any known test case.\ntemplate<int PROCNUM> \nstatic FORCEINLINE u32 MMU_LCDmap(u32 addr, bool& unmapped, bool& restricted)\n{\n\tunmapped = false;\n\trestricted = false; //this will track whether 8bit writes are allowed\n\n\t//handle SIWRAM and non-shared IWRAM in here too, since it is quite similar to vram.\n\t//in fact it is probably implemented with the same pieces of hardware.\n\t//its sort of like arm7 non-shared IWRAM is lowest priority, and then SIWRAM goes on top.\n\t//however, we implement it differently than vram in emulator for historical reasons.\n\t//instead of keeping a page map like we do vram, we just have a list of all possible page maps (there are only 4 each for arm9 and arm7)\n\tif(addr >= 0x03000000 && addr < 0x04000000)\n\t{\n\t\t//blocks 0,1,2,3 is arm7 non-shared IWRAM and blocks 4,5 is SIWRAM, and block 8 is un-mapped zeroes\n\t\tint iwram_block_16k;\n\t\tint iwram_offset = addr & 0x3FFF;\n\t\taddr &= 0x00FFFFFF;\n\t\tif(PROCNUM == ARMCPU_ARM7)\n\t\t{\n\t\t\tstatic const int arm7_siwram_blocks[2][4][4] =\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\t{0,1,2,3}, //WRAMCNT = 0 -> map to IWRAM\n\t\t\t\t\t{4,4,4,4}, //WRAMCNT = 1 -> map to SIWRAM block 0\n\t\t\t\t\t{5,5,5,5}, //WRAMCNT = 2 -> map to SIWRAM block 1\n\t\t\t\t\t{4,5,4,5}, //WRAMCNT = 3 -> map to SIWRAM blocks 0,1\n\t\t\t\t},\n\t\t\t\t\t //high region; always maps to non-shared IWRAM\n\t\t\t\t{\n\t\t\t\t\t{0,1,2,3}, {0,1,2,3}, {0,1,2,3}, {0,1,2,3}\n\t\t\t\t}\n\t\t\t};\n\t\t\tint region = (addr >> 23)&1;\n\t\t\tint block = (addr >> 14)&3;\n\t\t\tassert(region<2);\n\t\t\tassert(block<4);\n\t\t\tiwram_block_16k = arm7_siwram_blocks[region][MMU.WRAMCNT][block];\n\t\t} //PROCNUM == ARMCPU_ARM7\n\t\telse\n\t\t{\n\t\t\t//PROCNUM == ARMCPU_ARM9\n\t\t\tstatic const int arm9_siwram_blocks[4][4] =\n\t\t\t{\n\t\t\t\t{4,5,4,5}, //WRAMCNT = 0 -> map to SIWRAM blocks 0,1\n\t\t\t\t{5,5,5,5}, //WRAMCNT = 1 -> map to SIWRAM block 1\n\t\t\t\t{4,4,4,4}, //WRAMCNT = 2 -> map to SIWRAM block 0\n\t\t\t\t{8,8,8,8}, //WRAMCNT = 3 -> unmapped\n\t\t\t};\n\t\t\tint block = (addr >> 14)&3;\n\t\t\tassert(block<4);\n\t\t\tiwram_block_16k = arm9_siwram_blocks[MMU.WRAMCNT][block];\n\t\t}\n\n\t\tswitch(iwram_block_16k>>2)\n\t\t{\n\t\tcase 0: //arm7 non-shared IWRAM\n\t\t\treturn ARM7_HACKY_IWRAM_LOCATION + (iwram_block_16k<<14) + iwram_offset;\n\t\tcase 1: //SIWRAM\n\t\t\treturn ARM7_HACKY_SIWRAM_LOCATION + ((iwram_block_16k&3)<<14) + iwram_offset;\n\t\tcase 2: //zeroes\n\t\tCASE2:\n\t\t\tunmapped = true;\n\t\t\treturn 0;\n\t\tdefault:\n\t\t\tassert(false); //how did this happen?\n\t\t\tgoto CASE2;\n\t\t}\n\t}\n\n\t//in case the address is entirely outside of the interesting VRAM ranges\n\tif(addr < 0x06000000) return addr;\n\tif(addr >= 0x07000000) return addr;\n\n\t//shared wram mapping for arm7\n\tif(PROCNUM==ARMCPU_ARM7)\n\t{\n\t\t//necessary? not sure\n\t\t//addr &= 0x3FFFF;\n\t\t//addr += 0x06000000;\n\t\tu32 ofs = addr & 0x1FFFF;\n\t\tu32 bank = (addr >> 17)&1;\n\t\tif(vram_arm7_map[bank] == VRAM_PAGE_UNMAPPED)\n\t\t{\n\t\t\tunmapped = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn LCDC_HACKY_LOCATION + (vram_arm7_map[bank]<<14) + ofs;\n\t}\n\n\trestricted = true;\n\n\t//handle LCD memory mirroring\n\t//TODO - this is gross! this should be renovated if the vram mapping is ever done in a more sophisticated way taking into account dasShiny research\n\tif(addr>=0x068A4000)\n\t\taddr = 0x06800000 + \n\t\t//(addr%0xA4000); //yuck!! is this even how it mirrors? but we have to keep from overrunning the buffer somehow\n\t\t(addr&0x80000); //just as likely to be right (I have no clue how it should work) but faster.\n\n\tu32 vram_page;\n\tu32 ofs = addr & 0x3FFF;\n\n\t//return addresses in LCDC range\n\tif(addr>=0x06800000) \n\t{\n\t\t//already in LCDC range. just look it up to see whether it is unmapped\n\t\tvram_page = (addr>>14)&63;\n\t\tassert(vram_page<VRAM_LCDC_PAGES);\n\t\tvram_page = vram_lcdc_map[vram_page];\n\t}\n\telse\n\t{\n\t\t//map addresses in BG/OBJ range to an LCDC range\n\t\tvram_page = (addr>>14)&(VRAM_ARM9_PAGES-1);\n\t\tassert(vram_page<VRAM_ARM9_PAGES);\n\t\tvram_page = vram_arm9_map[vram_page];\n\t}\n\n\tif(vram_page == VRAM_PAGE_UNMAPPED)\n\t{\n\t\tunmapped = true;\n\t\treturn 0;\n\t}\n\telse\n\t\treturn LCDC_HACKY_LOCATION + (vram_page<<14) + ofs;\n}\n\n\n#define LOG_VRAM_ERROR() LOG(\"No data for block %i MST %i\\n\", block, VRAMBankCnt & 0x07);\n\nVramConfiguration vramConfiguration;\n\nstd::string VramConfiguration::describePurpose(Purpose p) {\n\tswitch(p) {\n\t\tcase OFF: return \"OFF\";\n\t\tcase INVALID: return \"INVALID\";\n\t\tcase ABG: return \"ABG\";\n\t\tcase BBG: return \"BBG\";\n\t\tcase AOBJ: return \"AOBJ\";\n\t\tcase BOBJ: return \"BOBJ\";\n\t\tcase LCDC: return \"LCDC\";\n\t\tcase ARM7: return \"ARM7\";\n\t\tcase TEX: return \"TEX\";\n\t\tcase TEXPAL: return \"TEXPAL\";\n\t\tcase ABGEXTPAL: return \"ABGEXTPAL\";\n\t\tcase BBGEXTPAL: return \"BBGEXTPAL\";\n\t\tcase AOBJEXTPAL: return \"AOBJEXTPAL\";\n\t\tcase BOBJEXTPAL: return \"BOBJEXTPAL\";\n\t\tdefault: return \"UNHANDLED CASE\";\n\t}\n}\n\nstd::string VramConfiguration::describe() {\n\tstd::stringstream ret;\n\tfor(int i=0;i<VRAM_BANKS;i++) {\n\t\tret << (char)(i+'A') << \": \" << banks[i].ofs << \" \" << describePurpose(banks[i].purpose) << std::endl;\n\t}\n\treturn ret.str();\n}\n\n//maps the specified bank to LCDC\nstatic inline void MMU_vram_lcdc(const int bank)\n{\n\tfor(int i=0;i<vram_bank_info[bank].num_pages;i++)\n\t{\n\t\tint page = vram_bank_info[bank].page_addr+i;\n\t\tvram_lcdc_map[page] = page;\n\t}\n}\n\n//maps the specified bank to ARM9 at the provided page offset\nstatic inline void MMU_vram_arm9(const int bank, const int offset)\n{\n\tfor(int i=0;i<vram_bank_info[bank].num_pages;i++)\n\t{\n\t\tint page = vram_bank_info[bank].page_addr+i;\n\t\tvram_arm9_map[i+offset] = page;\n\t}\n}\n\nstatic inline u8* MMU_vram_physical(const int page)\n{\n\treturn MMU.ARM9_LCD + (page*ADDRESS_STEP_16KB);\n}\n\n//todo - templateize\nstatic inline void MMU_VRAMmapRefreshBank(const int bank)\n{\n\tint block = bank;\n\tif(bank >= VRAM_BANK_H) block++;\n\n\tu8 VRAMBankCnt = T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x240 + block);\n\t\n\t//do nothing if the bank isnt enabled\n\tu8 en = VRAMBankCnt & 0x80;\n\tif(!en) return;\n\n\tint mst,ofs=0;\n\tswitch(bank) {\n\t\tcase VRAM_BANK_A:\n\t\tcase VRAM_BANK_B:\n\t\t\tmst = VRAMBankCnt & 3;\n\t\t\tofs = (VRAMBankCnt>>3) & 3;\n\t\t\tswitch(mst)\n\t\t\t{\n\t\t\tcase 0: //LCDC\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::LCDC;\n\t\t\t\tMMU_vram_lcdc(bank);\n\t\t\t\tif(ofs != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\t\tbreak;\n\t\t\tcase 1: //ABG\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::ABG;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_ABG+ofs*8);\n\t\t\t\tbreak;\n\t\t\tcase 2: //AOBJ\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ;\n\t\t\t\tswitch(ofs) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_AOBJ+ofs*8);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tPROGINFO(\"Unsupported ofs setting %d for engine A OBJ vram bank %c\\n\", ofs, 'A'+bank);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 3: //texture\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::TEX;\n\t\t\t\tMMU.texInfo.textureSlotAddr[ofs] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tbreak;\n\t\t\tdefault: goto unsupported_mst;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase VRAM_BANK_C:\n\t\tcase VRAM_BANK_D:\n\t\t\tmst = VRAMBankCnt & 7;\n\t\t\tofs = (VRAMBankCnt>>3) & 3;\n\t\t\tswitch(mst)\n\t\t\t{\n\t\t\tcase 0: //LCDC\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::LCDC;\n\t\t\t\tMMU_vram_lcdc(bank);\n\t\t\t\tif(ofs != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\t\tbreak;\n\t\t\tcase 1: //ABG\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::ABG;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_ABG+ofs*8);\n\t\t\t\tbreak;\n\t\t\tcase 2: //arm7\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::ARM7;\n\t\t\t\tif(bank == 2) T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240, T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240) | 1);\n\t\t\t\tif(bank == 3) T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240, T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240) | 2);\n\t\t\t\t//printf(\"DING!\\n\");\n\t\t\t\tswitch(ofs) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\t\tvram_arm7_map[ofs] = vram_bank_info[bank].page_addr;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tPROGINFO(\"Unsupported ofs setting %d for arm7 vram bank %c\\n\", ofs, 'A'+bank);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 3: //texture\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::TEX;\n\t\t\t\tMMU.texInfo.textureSlotAddr[ofs] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tbreak;\n\t\t\tcase 4: //BGB or BOBJ\n\t\t\t\tif(bank == VRAM_BANK_C)  {\n\t\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::BBG;\n\t\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BBG); //BBG\n\t\t\t\t} else {\n\t\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::BOBJ;\n\t\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BOBJ); //BOBJ\n\t\t\t\t}\n\t\t\t\tif(ofs != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\t\tbreak;\n\t\t\tdefault: goto unsupported_mst;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase VRAM_BANK_E:\n\t\t\tmst = VRAMBankCnt & 7;\n\t\t\tif(((VRAMBankCnt>>3)&3) != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\tswitch(mst) {\n\t\t\tcase 0: //LCDC\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::LCDC;\n\t\t\t\tMMU_vram_lcdc(bank);\n\t\t\t\tbreak;\n\t\t\tcase 1: //ABG\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::ABG;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_ABG);\n\t\t\t\tbreak;\n\t\t\tcase 2: //AOBJ\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_AOBJ);\n\t\t\t\tbreak;\n\t\t\tcase 3: //texture palette\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::TEXPAL;\n\t\t\t\tMMU.texInfo.texPalSlot[0] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tMMU.texInfo.texPalSlot[1] = MMU_vram_physical(vram_bank_info[bank].page_addr+1);\n\t\t\t\tMMU.texInfo.texPalSlot[2] = MMU_vram_physical(vram_bank_info[bank].page_addr+2);\n\t\t\t\tMMU.texInfo.texPalSlot[3] = MMU_vram_physical(vram_bank_info[bank].page_addr+3);\n\t\t\t\tbreak;\n\t\t\tcase 4: //A BG extended palette\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::ABGEXTPAL;\n\t\t\t\tMMU.ExtPal[0][0] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tMMU.ExtPal[0][1] = MMU.ExtPal[0][0] + ADDRESS_STEP_8KB;\n\t\t\t\tMMU.ExtPal[0][2] = MMU.ExtPal[0][1] + ADDRESS_STEP_8KB;\n\t\t\t\tMMU.ExtPal[0][3] = MMU.ExtPal[0][2] + ADDRESS_STEP_8KB;\n\t\t\t\tbreak;\n\t\t\tdefault: goto unsupported_mst;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase VRAM_BANK_F:\n\t\tcase VRAM_BANK_G: {\n\t\t\tmst = VRAMBankCnt & 7;\n\t\t\tofs = (VRAMBankCnt>>3) & 3;\n\t\t\tconst int pageofslut[] = {0,1,4,5};\n\t\t\tconst int pageofs = pageofslut[ofs];\n\t\t\tswitch(mst)\n\t\t\t{\n\t\t\tcase 0: //LCDC\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::LCDC;\n\t\t\t\tMMU_vram_lcdc(bank);\n\t\t\t\tif(ofs != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\t\tbreak;\n\t\t\tcase 1: //ABG\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::ABG;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_ABG+pageofs);\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_ABG+pageofs+2); //unexpected mirroring (required by spyro eternal night)\n\t\t\t\tbreak;\n\t\t\tcase 2: //AOBJ\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::AOBJ;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_AOBJ+pageofs);\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_AOBJ+pageofs+2); //unexpected mirroring - I have no proof, but it is inferred from the ABG above\n\t\t\t\tbreak;\n\t\t\tcase 3: //texture palette\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::TEXPAL;\n\t\t\t\tMMU.texInfo.texPalSlot[pageofs] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tbreak;\n\t\t\tcase 4: //A BG extended palette\n\t\t\t\tswitch(ofs) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::ABGEXTPAL;\n\t\t\t\t\tMMU.ExtPal[0][ofs*2] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\t\tMMU.ExtPal[0][ofs*2+1] = MMU.ExtPal[0][ofs*2] + ADDRESS_STEP_8KB;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::INVALID;\n\t\t\t\t\tPROGINFO(\"Unsupported ofs setting %d for engine A bgextpal vram bank %c\\n\", ofs, 'A'+bank);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 5: //A OBJ extended palette\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::AOBJEXTPAL;\n\t\t\t\tMMU.ObjExtPal[0][0] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tMMU.ObjExtPal[0][1] = MMU.ObjExtPal[0][1] + ADDRESS_STEP_8KB;\n\t\t\t\tif(ofs != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\t\tbreak;\n\t\t\tdefault: goto unsupported_mst;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase VRAM_BANK_H:\n\t\t\tmst = VRAMBankCnt & 3;\n\t\t\tif(((VRAMBankCnt>>3)&3) != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\tswitch(mst)\n\t\t\t{\n\t\t\tcase 0: //LCDC\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::LCDC;\n\t\t\t\tMMU_vram_lcdc(bank);\n\t\t\t\tbreak;\n\t\t\tcase 1: //BBG\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::BBG;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BBG);\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BBG + 4); //unexpected mirroring\n\t\t\t\tbreak;\n\t\t\tcase 2: //B BG extended palette\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::BBGEXTPAL;\n\t\t\t\tMMU.ExtPal[1][0] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tMMU.ExtPal[1][1] = MMU.ExtPal[1][0] + ADDRESS_STEP_8KB;\n\t\t\t\tMMU.ExtPal[1][2] = MMU.ExtPal[1][1] + ADDRESS_STEP_8KB;\n\t\t\t\tMMU.ExtPal[1][3] = MMU.ExtPal[1][2] + ADDRESS_STEP_8KB;\n\t\t\t\tbreak;\n\t\t\tdefault: goto unsupported_mst;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase VRAM_BANK_I:\n\t\t\tmst = VRAMBankCnt & 3;\n\t\t\tif(((VRAMBankCnt>>3)&3) != 0) PROGINFO(\"Bank %i: MST %i OFS %i\\n\", mst, ofs);\n\t\t\tswitch(mst)\n\t\t\t{\n\t\t\tcase 0: //LCDC\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::LCDC;\n\t\t\t\tMMU_vram_lcdc(bank);\n\t\t\t\tbreak;\n\t\t\tcase 1: //BBG\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::BBG;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BBG+2);\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BBG+3); //unexpected mirroring\n\t\t\t\tbreak;\n\t\t\tcase 2: //BOBJ\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::BOBJ;\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BOBJ);\n\t\t\t\tMMU_vram_arm9(bank,VRAM_PAGE_BOBJ+1); //FF3 end scene (lens flare sprite) needs this as it renders a sprite off the end of the 16KB and back around\n\t\t\t\tbreak;\n\t\t\tcase 3: //B OBJ extended palette\n\t\t\t\tvramConfiguration.banks[bank].purpose = VramConfiguration::BOBJEXTPAL;\n\t\t\t\tMMU.ObjExtPal[1][0] = MMU_vram_physical(vram_bank_info[bank].page_addr);\n\t\t\t\tMMU.ObjExtPal[1][1] = MMU.ObjExtPal[1][1] + ADDRESS_STEP_8KB;\n\t\t\t\tbreak;\n\t\t\tdefault: goto unsupported_mst;\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\t\n\t} //switch(bank)\n\n\tvramConfiguration.banks[bank].ofs = ofs;\n\n\treturn;\n\nunsupported_mst:\n\tvramConfiguration.banks[bank].purpose = VramConfiguration::INVALID;\n\tPROGINFO(\"Unsupported mst setting %d for vram bank %c\\n\", mst, 'A'+bank);\n}\n\nvoid MMU_VRAM_unmap_all()\n{\n\tvramConfiguration.clear();\n\n\tvram_arm7_map[0] = VRAM_PAGE_UNMAPPED;\n\tvram_arm7_map[1] = VRAM_PAGE_UNMAPPED;\n\n\tfor(int i=0;i<VRAM_LCDC_PAGES;i++)\n\t\tvram_lcdc_map[i] = VRAM_PAGE_UNMAPPED;\n\tfor(int i=0;i<VRAM_ARM9_PAGES;i++)\n\t\tvram_arm9_map[i] = VRAM_PAGE_UNMAPPED;\n\n\tfor (int i = 0; i < 4; i++)\n\t{\n\t\tMMU.ExtPal[0][i] = MMU.blank_memory;\n\t\tMMU.ExtPal[1][i] = MMU.blank_memory;\n\t}\n\n\tMMU.ObjExtPal[0][0] = MMU.blank_memory;\n\tMMU.ObjExtPal[0][1] = MMU.blank_memory;\n\tMMU.ObjExtPal[1][0] = MMU.blank_memory;\n\tMMU.ObjExtPal[1][1] = MMU.blank_memory;\n\n\tfor(int i=0;i<6;i++)\n\t\tMMU.texInfo.texPalSlot[i] = MMU.blank_memory;\n\n\tfor(int i=0;i<4;i++)\n\t\tMMU.texInfo.textureSlotAddr[i] = MMU.blank_memory;\n}\n\nstatic inline void MMU_VRAMmapControl(u8 block, u8 VRAMBankCnt)\n{\n\t//handle WRAM, first of all\n\tif(block == 7)\n\t{\n\t\tMMU.WRAMCNT = VRAMBankCnt & 3;\n\t\treturn;\n\t}\n\n\t//first, save the texture info so we can check it for changes and trigger purges of the texcache\n\tMMU_struct::TextureInfo oldTexInfo = MMU.texInfo;\n\n\t//unmap everything\n\tMMU_VRAM_unmap_all();\n\n\t//unmap VRAM_BANK_C and VRAM_BANK_D from arm7. theyll get mapped again in a moment if necessary\n\tT1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x240, 0);\n\n\t//write the new value to the reg\n\tT1WriteByte(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x240 + block, VRAMBankCnt);\n\n\t//refresh all bank settings\n\t//zero XX-XX-200X (long before jun 2012)\n\t//these are enumerated so that we can tune the order they get applied\n\t//in order to emulate prioritization rules for memory regions\n\t//with multiple banks mapped.\n\t//We're probably still not mapping things 100% correctly, but this helped us get closer:\n\t//goblet of fire \"care of magical creatures\" maps I and D to BOBJ (the I is an accident)\n\t//and requires A to override it.\n\t//This may create other bugs....\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_I);\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_H);\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_G);\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_F);\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_E);\n\t//zero 21-jun-2012\n\t//tomwi's streaming music demo sets A and D to ABG (the A is an accident).\n\t//in this case, D should get priority. \n\t//this is somewhat risky. will it break other things?\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_A);\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_B);\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_C);\n\tMMU_VRAMmapRefreshBank(VRAM_BANK_D);\n\n\t//printf(vramConfiguration.describe().c_str());\n\t//printf(\"vram remapped at vcount=%d\\n\",nds.VCount);\n\n\t//if texInfo changed, trigger notifications\n\tif(memcmp(&oldTexInfo,&MMU.texInfo,sizeof(MMU_struct::TextureInfo)))\n\t{\n\t\t//if(!nds.isIn3dVblank())\n\t//\t\tPROGINFO(\"Changing texture or texture palette mappings outside of 3d vblank\\n\");\n\t\tgpu3D->NDS_3D_VramReconfigureSignal();\n\t}\n\n\t//-------------------------------\n\t//set up arm9 mirrorings\n\t//these are probably not entirely accurate. more study will be necessary.\n\t//in general, we find that it is not uncommon at all for games to accidentally do this.\n\t//\n\t//being able to easily do these experiments was one of the primary motivations for this remake of the vram mapping system\n\n\t//see the \"unexpected mirroring\" comments above for some more mirroring\n\t//so far \"unexpected mirrorings\" are tested by combining these games:\n\t//despereaux - storybook subtitles\n\t//NSMB - world map sub screen\n\t//drill spirits EU - mission select (just for control purposes, as it doesnt use H or I)\n\t//...\n\t//note that the \"unexpected mirroring\" items above may at some point rely on being executed in a certain order.\n\t//(sequentially A..I)\n\n\tconst int types[] = {VRAM_PAGE_ABG,VRAM_PAGE_BBG,VRAM_PAGE_AOBJ,VRAM_PAGE_BOBJ};\n\tconst int sizes[] = {32,8,16,8};\n\tfor(int t=0;t<4;t++)\n\t{\n\t\t//the idea here is to pad out the mirrored space with copies of the mappable area,\n\t\t//without respect to what is mapped within that mappable area.\n\t\t//we hope that this is correct in all cases\n\t\t//required for driller spirits in mission select (mapping is simple A,B,C,D to each purpose)\n\t\tconst int size = sizes[t];\n\t\tconst int mask = size-1;\n\t\tconst int type = types[t];\n\t\tfor(int i=size;i<128;i++)\n\t\t{\n\t\t\tconst int page = type + i;\n\t\t\tvram_arm9_map[page] = vram_arm9_map[type+(i&mask)];\n\t\t}\n\n\t\t//attempt #1: screen corruption in drill spirits EU\n\t\t//it seems like these shouldnt pad out 128K banks (space beyond those should have remained unmapped)\n\t\t//int mirrorMask = -1;\n\t\t//int type = types[t];\n\t\t////if(type==VRAM_PAGE_BOBJ) continue;\n\t\t//if(type==VRAM_PAGE_AOBJ) continue;\n\t\t//for(int i=0;i<128;i++)\n\t\t//{\n\t\t//\tint page = type + i;\n\t\t//\tif(vram_arm9_map[page] == VRAM_PAGE_UNMAPPED)\n\t\t//\t{\n\t\t//\t\tif(i==0) break; //can't mirror anything if theres nothing mapped!\n\t\t//\t\tif(mirrorMask == -1)\n\t\t//\t\t\tmirrorMask = i-1;\n\t\t//\t\tvram_arm9_map[page] = vram_arm9_map[type+(i&mirrorMask)];\n\t\t//\t}\n\t\t//}\n\t}\n\n\t//-------------------------------\n}\n\n//////////////////////////////////////////////////////////////\n//end vram\n//////////////////////////////////////////////////////////////\n\n\n\nvoid MMU_Init(void) {\n\tLOG(\"MMU init\\n\");\n\n\tmemset(&MMU, 0, sizeof(MMU_struct));\n\n\tMMU.CART_ROM = MMU.UNUSED_RAM;\n\n\t//MMU.DTCMRegion = 0x027C0000;\n\t//even though apps may change dtcm immediately upon startup, this is the correct hardware starting value:\n\tMMU.DTCMRegion = 0x08000000;\n\tMMU.ITCMRegion = 0x00000000;\n\n\tIPC_FIFOinit(ARMCPU_ARM9);\n\tIPC_FIFOinit(ARMCPU_ARM7);\n\tGFX_PIPEclear();\n\tGFX_FIFOclear();\n\tDISP_FIFOinit();\n\tnew(&MMU_new) MMU_struct_new;\t\n\n\tmc_init(&MMU.fw, MC_TYPE_FLASH);  /* init fw device */\n\tmc_alloc(&MMU.fw, NDS_FW_SIZE_V1);\n\tMMU.fw.fp = NULL;\n\tMMU.fw.isFirmware = true;\n\n\t// Init Backup Memory device, this should really be done when the rom is loaded\n\t//mc_init(&MMU.bupmem, MC_TYPE_AUTODETECT);\n\t//mc_alloc(&MMU.bupmem, 1);\n\t//MMU.bupmem.fp = NULL;\n\trtcInit();\n\taddonsInit();\n\tslot1Init();\n\tif(Mic_Init() == FALSE)\n\t\tINFO(\"Microphone init failed.\\n\");\n\telse\n\t\tINFO(\"Microphone successfully inited.\\n\");\n} \n\nvoid MMU_DeInit(void) {\n\tLOG(\"MMU deinit\\n\");\n\tif (MMU.fw.fp)\n\t\tfclose(MMU.fw.fp);\n\tmc_free(&MMU.fw);      \n\t//if (MMU.bupmem.fp)\n\t//\tfclose(MMU.bupmem.fp);\n\t//mc_free(&MMU.bupmem);\n\taddonsClose();\n\tslot1Close();\n\tMic_DeInit();\n}\n\nvoid MMU_Reset()\n{\n\tmemset(MMU.ARM9_DTCM, 0, sizeof(MMU.ARM9_DTCM));\n\tmemset(MMU.ARM9_ITCM, 0, sizeof(MMU.ARM9_ITCM));\n\tmemset(MMU.ARM9_LCD,  0, sizeof(MMU.ARM9_LCD));\n\tmemset(MMU.ARM9_OAM,  0, sizeof(MMU.ARM9_OAM));\n\tmemset(MMU.ARM9_REG,  0, sizeof(MMU.ARM9_REG));\n\tmemset(MMU.ARM9_VMEM, 0, sizeof(MMU.ARM9_VMEM));\n\tmemset(MMU.MAIN_MEM,  0, sizeof(MMU.MAIN_MEM));\n\n\tmemset(MMU.blank_memory,  0, sizeof(MMU.blank_memory));\n\tmemset(MMU.UNUSED_RAM,    0, sizeof(MMU.UNUSED_RAM));\n\tmemset(MMU.MORE_UNUSED_RAM,    0, sizeof(MMU.UNUSED_RAM));\n\t\n\tmemset(MMU.ARM7_ERAM,     0, sizeof(MMU.ARM7_ERAM));\n\tmemset(MMU.ARM7_REG,      0, sizeof(MMU.ARM7_REG));\n\tmemset(MMU.ARM7_WIRAM,\t  0, sizeof(MMU.ARM7_WIRAM));\n\tmemset(MMU.SWIRAM,\t  0, sizeof(MMU.SWIRAM));\n\n\tIPC_FIFOinit(ARMCPU_ARM9);\n\tIPC_FIFOinit(ARMCPU_ARM7);\n\tGFX_PIPEclear();\n\tGFX_FIFOclear();\n\tDISP_FIFOinit();\n\t\n\tMMU.DTCMRegion = 0x027C0000;\n\tMMU.ITCMRegion = 0x00000000;\n\t\n\tmemset(MMU.timer,         0, sizeof(u16) * 2 * 4);\n\tmemset(MMU.timerMODE,     0, sizeof(s32) * 2 * 4);\n\tmemset(MMU.timerON,       0, sizeof(u32) * 2 * 4);\n\tmemset(MMU.timerRUN,      0, sizeof(u32) * 2 * 4);\n\tmemset(MMU.timerReload,   0, sizeof(u16) * 2 * 4);\n\t\n\tmemset(MMU.reg_IME,       0, sizeof(u32) * 2);\n\tmemset(MMU.reg_IE,        0, sizeof(u32) * 2);\n\tmemset(MMU.reg_IF_bits,   0, sizeof(u32) * 2);\n\tmemset(MMU.reg_IF_pending,   0, sizeof(u32) * 2);\n\t\n\tmemset(MMU.dscard,        0, sizeof(nds_dscard) * 2);\n\n\tMMU.divRunning = 0;\n\tMMU.divResult = 0;\n\tMMU.divMod = 0;\n\tMMU.divCycles = 0;\n\n\tMMU.sqrtRunning = 0;\n\tMMU.sqrtResult = 0;\n\tMMU.sqrtCycles = 0;\n\n\tMMU.SPI_CNT = 0;\n\tMMU.AUX_SPI_CNT = 0;\n\n\tMMU.WRAMCNT = 0;\n\n\t// Enable the sound speakers\n\tT1WriteWord(MMU.ARM7_REG, 0x304, 0x0001);\n\t\n\tMainScreen.offset = 0;\n\tSubScreen.offset  = 192;\n\t\n\tMMU_VRAM_unmap_all();\n\n\tMMU.powerMan_CntReg = 0x00;\n\tMMU.powerMan_CntRegWritten = FALSE;\n\tMMU.powerMan_Reg[0] = 0x0B;\n\tMMU.powerMan_Reg[1] = 0x00;\n\tMMU.powerMan_Reg[2] = 0x01;\n\tMMU.powerMan_Reg[3] = 0x00;\n\n\trtcInit();\n\tpartie = 1;\n\taddonsReset();\n\tslot1Reset();\n\tMic_Reset();\n\tMMU.gfx3dCycles = 0;\n\n\tmemset(MMU.dscard[ARMCPU_ARM9].command, 0, 8);\n\tMMU.dscard[ARMCPU_ARM9].address = 0;\n\tMMU.dscard[ARMCPU_ARM9].transfer_count = 0;\n\tMMU.dscard[ARMCPU_ARM9].mode = CardMode_Normal;\n\n\tmemset(MMU.dscard[ARMCPU_ARM7].command, 0, 8);\n\tMMU.dscard[ARMCPU_ARM7].address = 0;\n\tMMU.dscard[ARMCPU_ARM7].transfer_count = 0;\n\tMMU.dscard[ARMCPU_ARM7].mode = CardMode_Normal;\n\n\t//HACK!!!\n\t//until we improve all our session tracking stuff, we need to save the backup memory filename\n\tstd::string bleh = MMU_new.backupDevice.getFilename();\n\tBackupDevice tempBackupDevice;\n\tbool bleh2 = MMU_new.backupDevice.isMovieMode;\n\tif(bleh2) tempBackupDevice = MMU_new.backupDevice;\n\treconstruct(&MMU_new);\n\tif(bleh2) {\n\t\tMMU_new.backupDevice = tempBackupDevice;\n\t\tMMU_new.backupDevice.reset_hardware();\n\t}\n\telse MMU_new.backupDevice.load_rom(bleh.c_str());\n\n\tMMU_timing.arm7codeFetch.Reset();\n\tMMU_timing.arm7dataFetch.Reset();\n\tMMU_timing.arm9codeFetch.Reset();\n\tMMU_timing.arm9dataFetch.Reset();\n\tMMU_timing.arm9codeCache.Reset();\n\tMMU_timing.arm9dataCache.Reset();\n}\n\nvoid SetupMMU(bool debugConsole, bool dsi) {\n\tif(debugConsole) _MMU_MAIN_MEM_MASK = 0x7FFFFF;\n\telse _MMU_MAIN_MEM_MASK = 0x3FFFFF;\n\tif(dsi) _MMU_MAIN_MEM_MASK = 0xFFFFFF;\n\t_MMU_MAIN_MEM_MASK16 = _MMU_MAIN_MEM_MASK & ~1;\n\t_MMU_MAIN_MEM_MASK32 = _MMU_MAIN_MEM_MASK & ~3;\n}\n\nvoid MMU_setRom(u8 * rom, u32 mask)\n{\n\tMMU.CART_ROM = rom;\n}\n\nvoid MMU_unsetRom()\n{\n\tMMU.CART_ROM=MMU.UNUSED_RAM;\n}\n\nstatic void execsqrt() {\n\tu32 ret;\n\tu8 mode = MMU_new.sqrt.mode;\n\tMMU_new.sqrt.busy = 1;\n\n\tif (mode) { \n\t\tu64 v = T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8);\n\t\tret = (u32)isqrt(v);\n\t} else {\n\t\tu32 v = T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8);\n\t\tret = (u32)isqrt(v);\n\t}\n\n\t//clear the result while the sqrt unit is busy\n\t//todo - is this right? is it reasonable?\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B4, 0);\n\n\tMMU.sqrtCycles = nds_timer + 26;\n\tMMU.sqrtResult = ret;\n\tMMU.sqrtRunning = TRUE;\n\tNDS_Reschedule();\n}\n\nstatic void execdiv() {\n\n\ts64 num,den;\n\ts64 res,mod;\n\tu8 mode = MMU_new.div.mode;\n\tMMU_new.div.busy = 1;\n\tMMU_new.div.div0 = 0;\n\n\tswitch(mode)\n\t{\n\tcase 0:\t// 32/32\n\t\tnum = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290);\n\t\tden = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298);\n\t\tMMU.divCycles = nds_timer + 36;\n\t\tbreak;\n\tcase 1:\t// 64/32\n\tcase 3: //gbatek says this is same as mode 1\n\t\tnum = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290);\n\t\tden = (s64) (s32) T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298);\n\t\tMMU.divCycles = nds_timer + 68;\n\t\tbreak;\n\tcase 2:\t// 64/64\n\tdefault:\n\t\tnum = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290);\n\t\tden = (s64) T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298);\n\t\tMMU.divCycles = nds_timer + 68;\n\t\tbreak;\n\t}\n\n\tif(den==0)\n\t{\n\t\tres = ((num < 0) ? 1 : -1);\n\t\tmod = num;\n\n\t\t// the DIV0 flag in DIVCNT is set only if the full 64bit DIV_DENOM value is zero, even in 32bit mode\n\t\tif ((u64)T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298) == 0) \n\t\t\tMMU_new.div.div0 = 1;\n\t}\n\telse\n\t{\n\t\tres = num / den;\n\t\tmod = num % den;\n\t}\n\n\tDIVLOG(\"DIV %08X%08X / %08X%08X = %08X%08X\\r\\n\", (u32)(num>>32), (u32)num, \n\t\t\t\t\t\t\t(u32)(den>>32), (u32)den, \n\t\t\t\t\t\t\t(u32)(res>>32), (u32)res);\n\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, 0);\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A4, 0);\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, 0);\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2AC, 0);\n\n\tMMU.divResult = res;\n\tMMU.divMod = mod;\n\tMMU.divRunning = TRUE;\n\tNDS_Reschedule();\n}\n\nDSI_TSC::DSI_TSC()\n{\n\tfor(int i=0;i<ARRAY_SIZE(registers);i++)\n\t\tregisters[i] = 0x00;\n\treset_command();\n}\n\nvoid DSI_TSC::reset_command()\n{\n\tstate = 0;\n\treadcount = 0;\n\tread_flag = 1;\n}\n\nu16 DSI_TSC::write16(u16 val)\n{\n\tu16 ret;\n\tswitch(state)\n\t{\n\tcase 0:\n\t\treg_selection = (val>>1)&0x7F;\n\t\tread_flag = val&1;\n\t\tstate = 1;\n\t\treturn read16();\n\tcase 1:\n\t\tif(read_flag)\n\t\t{ }\n\t\telse\n\t\t{\n\t\t\tregisters[reg_selection] = (u8)val;\n\t\t}\n\t\tret = read16();\n\t\treg_selection++;\n\t\treg_selection &= 0x7F;\n\t\treturn ret;\n\t}\n\treturn 0;\n}\n\nu16 DSI_TSC::read16()\n{\n\tu8 page = registers[0];\n\tswitch(page)\n\t{\n\tcase 3: //page 3\n\t\tswitch(reg_selection)\n\t\t{\n\t\tcase 9:\n\t\t\tif(nds.isTouch) \n\t\t\t\treturn 0;\n\t\t\telse return 0x40;\n\t\t\tbreak;\n\t\tcase 14:\n\t\t\tif(nds.isTouch) \n\t\t\t\treturn 0;\n\t\t\telse return 0x02;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\n\tcase 252: //page 252\n\t\tswitch(reg_selection)\n\t\t{\n\t\t//high byte of X:\n\t\tcase 1: case 3: case 5: case 7: case 9:\n\t\t\treturn (nds.scr_touchX>>8)&0xFF;\n\n\t\t//low byte of X:\n\t\tcase 2: case 4: case 6: case 8: case 10:\n\t\t\treturn nds.scr_touchX&0xFF;\n\n\t\t//high byte of Y:\n\t\tcase 11: case 13: case 15: case 17: case 19:\n\t\t\treturn (nds.scr_touchY>>8)&0xFF;\n\n\t\t//low byte of Y:\n\t\tcase 12: case 14: case 16: case 18: case 20:\n\t\t\treturn nds.scr_touchY&0xFF;\n\t\t\n\t\tdefault:\n\t\t\treturn 0xFF;\n\t\t}\n\t\tbreak;\n\t} //switch(page)\n\n\t//unknown page or register\n\treturn 0xFF;\n}\n\nbool DSI_TSC::save_state(EMUFILE* os)\n{\n\tu32 version = 0;\n\twrite32le(version,os);\n\n\twrite8le(reg_selection,os);\n\twrite8le(read_flag,os);\n\twrite32le(state,os);\n\twrite32le(readcount,os);\n\tfor(int i=0;i<ARRAY_SIZE(registers);i++)\n\t\twrite8le(registers[i],os);\n\n\treturn true;\n}\n\nbool DSI_TSC::load_state(EMUFILE* is)\n{\n\tu32 version;\n\tread32le(&version,is);\n\n\tread8le(&reg_selection,is);\n\tread8le(&read_flag,is);\n\tread32le(&state,is);\n\tread32le(&readcount,is);\n\tfor(int i=0;i<ARRAY_SIZE(registers);i++)\n\t\tread8le(&registers[i],is);\n\n\treturn true;\n}\n\ntemplate<int PROCNUM>\nvoid FASTCALL MMU_writeToGCControl(u32 val)\n{\n\tconst int TEST_PROCNUM = PROCNUM;\n\tnds_dscard& card = MMU.dscard[TEST_PROCNUM];\n\n\tmemcpy(&card.command[0], &MMU.MMU_MEM[TEST_PROCNUM][0x40][0x1A8], 8);\n\n\tcard.blocklen = 0;\n\tslot1_device.write32(PROCNUM,0xFFFFFFFF,val); //Special case for some flashcarts\n\tif(card.blocklen==0x01020304) return;\n\n\tif(!(val & 0x80000000))\n\t{\n\t\tcard.address = 0;\n\t\tcard.transfer_count = 0;\n\n\t\tval &= 0x7F7FFFFF;\n\t\tT1WriteLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4, val);\n\t\treturn;\n\t}\n\t\n\tu32 shift = (val>>24&7); \n\tif(shift == 7)\n\t\tcard.transfer_count = 1;\n\telse if(shift == 0)\n\t\tcard.transfer_count = 0;\n\telse\n\t\tcard.transfer_count = (0x100<<shift)/4;\n\n\tswitch (card.mode)\n\t{\n\tcase CardMode_Normal: \n\t\tbreak;\n\n\tcase CardMode_KEY1:\n\t\t{\n\t\t\t// TODO\n\t\t\tINFO(\"Cartridge: KEY1 mode unsupported.\\n\");\n\n\t\t\tcard.address = 0;\n\t\t\tcard.transfer_count = 0;\n\n\t\t\tval &= 0x7F7FFFFF;\n\t\t\tT1WriteLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4, val);\n\t\t\treturn;\n\t\t}\n\t\tbreak;\n\tcase CardMode_KEY2:\n\t\t\tINFO(\"Cartridge: KEY2 mode unsupported.\\n\");\n\t\tbreak;\n\t}\n\n\tswitch(card.command[0])\n\t{\n\tcase 0x9F: //Dummy\n\t\tcard.address = 0;\n\t\tcard.transfer_count = 0x800;\n\t\tbreak;\n\n\t//case 0x90: //Get ROM chip ID\n\t//\tbreak;\n\n\tcase 0x3C: //Switch to KEY1 mode\n\t\tcard.mode = CardMode_KEY1;\n\t\tbreak;\n\t\n\tdefault:\n\t\t//fall through to the special slot1 handler\n\t\tslot1_device.write32(TEST_PROCNUM, REG_GCROMCTRL,val);\n\t\tbreak;\n\t}\n\n\tif(card.transfer_count == 0)\n\t{\n\t\tval &= 0x7F7FFFFF;\n\t\tT1WriteLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4, val);\n\t\treturn;\n\t}\n\t\n    val |= 0x00800000;\n    T1WriteLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4, val);\n\t\t\t\t\t\t\n\t// Launch DMA if start flag was set to \"DS Cart\"\n\t//printf(\"triggering card dma\\n\");\n\ttriggerDma<EDMAMode_Card>();\n}\n\n\n\ntemplate<int PROCNUM>\nu32 MMU_readFromGC()\n{\n\tconst int TEST_PROCNUM = PROCNUM;\n\n\tnds_dscard& card = MMU.dscard[TEST_PROCNUM];\n\tu32 val = 0;\n\n\tif(card.transfer_count == 0)\n\t\treturn 0;\n\n\tswitch(card.command[0])\n\t{\n\t\tcase 0x9F: //Dummy\n\t\t\tval = 0xFFFFFFFF;\n\t\t\tbreak;\n\t\n\t\tcase 0x3C: //Switch to KEY1 mode\n\t\t\tval = 0xFFFFFFFF;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tval = slot1_device.read32(TEST_PROCNUM, REG_GCDATAIN);\n\t\t\tbreak;\n\t}\n\n\tcard.address += 4;\t// increment address\n\n\tcard.transfer_count--;\t// update transfer counter\n\tif(card.transfer_count) // if transfer is not ended\n\t\treturn val;\t// return data\n\n\t// transfer is done\n\tT1WriteLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4, \n\t\tT1ReadLong(MMU.MMU_MEM[TEST_PROCNUM][0x40], 0x1A4) & 0x7F7FFFFF);\n\n\t// if needed, throw irq for the end of transfer\n\tif(MMU.AUX_SPI_CNT & 0x4000)\n\t\tNDS_makeIrq(TEST_PROCNUM, IRQ_BIT_GC_TRANSFER_COMPLETE);\n\n\treturn val;\n}\n\n// ====================================================================== REG_SPIxxx\nstatic void CalculateTouchPressure(int pressurePercent, u16 &z1, u16& z2)\n{\n\tbool touch = nds.isTouch!=0;\n\tif(!touch)\n\t{\n\t\tz1 = z2 = 0;\n\t\treturn;\n\t}\n\tint y = nds.scr_touchY;\n\tint x = nds.scr_touchX;\n\tfloat u = (x/256.0f);\n\tfloat v = (y/192.0f);\t\n\n\t//these coefficients \n\n\tfloat fPressurePercent = pressurePercent/100.0f;\n\t//z1 goes up as pressure goes up\n\t{\n\t\tfloat b0 = (96-80)*fPressurePercent + 80;\n\t\tfloat b1 = (970-864)*fPressurePercent + 864;\n\t\tfloat b2 = (192-136)*fPressurePercent + 136;\n\t\tfloat b3 = (1560-1100)*fPressurePercent + 1100;\n\t\tz1 = (u16)(int)(b0 + (b1-b0)*u + (b2-b0)*v + (b3-b2-b1+b0)*u*v);\n\t}\n\t\n\t//z2 goes down as pressure goes up\n\t{\n\t\tfloat b0=(1976-2300)*fPressurePercent + 2300;\n\t\tfloat b1=(2360-2600)*fPressurePercent + 2600;\n\t\tfloat b2=(3840-3900)*fPressurePercent + 3900;\n\t\tfloat b3=(3912-3950)*fPressurePercent + 3950;\n\t\tz2 = (u16)(int)(b0 + (b1-b0)*u + (b2-b0)*v + (b3-b2-b1+b0)*u*v);\n\t}\n\n}\n\nvoid FASTCALL MMU_writeToSPIData(u16 val)\n{\n\tif (val !=0)\n\t\tMMU.SPI_CMD = val;\n\n\tu16 spicnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPICNT >> 20) & 0xff], REG_SPICNT & 0xfff);\n\n\tswitch ((spicnt >> 8) & 0x3)\t// device\n\t{\n\t\tcase 0:\t\t// Powerman\n\t\t\tif (!MMU.powerMan_CntRegWritten)\n\t\t\t{\n\t\t\t\tMMU.powerMan_CntReg = (val & 0xFF);\n\t\t\t\tMMU.powerMan_CntRegWritten = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu16 reg = MMU.powerMan_CntReg & 0x7F;\n\t\t\t\treg &= 0x7;\n\t\t\t\tif(reg==5 || reg==6 || reg==7) reg = 4;\n\n\t\t\t\t//(let's start with emulating a DS lite, since it is the more complex case)\n\t\t\t\tif(MMU.powerMan_CntReg & 0x80)\n\t\t\t\t{\n\t\t\t\t\t//read\n\t\t\t\t\tval = MMU.powerMan_Reg[reg];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//write\n\t\t\t\t\tMMU.powerMan_Reg[reg] = (u8)val;\n\n\t\t\t\t\tenum PM_Bits //from libnds\n\t\t\t\t\t{\n\t\t\t\t\t\tPM_SOUND_AMP\t\t= BIT(0) ,   /*!< \\brief Power the sound hardware (needed to hear stuff in GBA mode too) */\n\t\t\t\t\t\tPM_SOUND_MUTE\t\t= BIT(1),    /*!< \\brief   Mute the main speakers, headphone output will still work. */\n\t\t\t\t\t\tPM_BACKLIGHT_BOTTOM\t= BIT(2),    /*!< \\brief   Enable the top backlight if set */\n\t\t\t\t\t\tPM_BACKLIGHT_TOP\t= BIT(3)  ,  /*!< \\brief   Enable the bottom backlight if set */\n\t\t\t\t\t\tPM_SYSTEM_PWR\t\t= BIT(6) ,   /*!< \\brief  Turn the power *off* if set */\n\t\t\t\t\t};\n\n\t\t\t\t\t//our totally pathetic register handling, only the one thing we've wanted so far\n\t\t\t\t\tif(MMU.powerMan_Reg[0]&PM_SYSTEM_PWR)\n\t\t\t\t\t{\n\t\t\t\t\t\tprintf(\"SYSTEM POWERED OFF VIA ARM7 SPI POWER DEVICE\\n\");\n\t\t\t\t\t\tprintf(\"Did your main() return?\\n\");\n\t\t\t\t\t\temu_halt();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tMMU.powerMan_CntRegWritten = FALSE;\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 1:\t// Firmware\n\t\t\tif((spicnt & 0x3) != 0)\t\t// check SPI baudrate (must be 4mhz)\n\t\t\t\tval = 0;\n\t\t\telse\n\t\t\t\tval = fw_transfer(&MMU.fw, (u8)val);\n\t\tbreak;\n\n\t\tcase 2:\t// Touch screen\n\t\t{\n\t\t\tif(nds.Is_DSI())\n\t\t\t{\n\t\t\t\t//pass data to TSC\n\t\t\t\tval = MMU_new.dsi_tsc.write16(val);\n\n\t\t\t\t//apply reset command if appropriate\n\t\t\t\tif(!BIT11(MMU.SPI_CNT))\n\t\t\t\t\tMMU_new.dsi_tsc.reset_command();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tint channel = (MMU.SPI_CMD&0x70)>>4;\n\n\t\t\tswitch(channel)\n\t\t\t{\n\t\t\t\tcase TSC_MEASURE_TEMP1:\n\t\t\t\t\tif(spicnt & 0x800)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(partie)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = ((716<<3)&0x7FF);\n\t\t\t\t\t\t\tpartie = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval = (716>>5);\n\t\t\t\t\t\tpartie = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tval = ((716<<3)&0x7FF);\n\t\t\t\t\tpartie = 1;\n\t\t\t\tbreak;\n\n\t\t\t\tcase TSC_MEASURE_TEMP2:\n\t\t\t\t\tif(spicnt & 0x800)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(partie)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = ((865<<3)&0x7FF);\n\t\t\t\t\t\t\tpartie = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval = (865>>5);\n\t\t\t\t\t\tpartie = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tval = ((865<<3)&0x7FF);\n\t\t\t\t\tpartie = 1;\n\t\t\t\tbreak;\n\n\t\t\t\tcase TSC_MEASURE_Y:\n\t\t\t\t\t//counter the number of adc touch coord reads and jitter it after a while to simulate a shaky human hand or multiple reads\n\t\t\t\t\tnds.adc_jitterctr++;\n\t\t\t\t\tif(nds.adc_jitterctr == 25)\n\t\t\t\t\t{\n\t\t\t\t\t\tnds.adc_jitterctr = 0;\n\t\t\t\t\t\tif (nds.stylusJitter)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnds.adc_touchY ^= 16;\n\t\t\t\t\t\t\tnds.adc_touchX ^= 16;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(MMU.SPI_CNT&(1<<11))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(partie)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = (nds.adc_touchY<<3) & 0xFF;\n\t\t\t\t\t\t\tpartie = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tval = (nds.adc_touchY>>5) & 0xFF;\n\t\t\t\t\t\tpartie = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tval = (nds.adc_touchY<<3)&0xFF;\n\t\t\t\t\tpartie = 1;\n\t\t\t\tbreak;\n\n\t\t\t\tcase TSC_MEASURE_Z1: //Z1\n\t\t\t\t{\n\t\t\t\t\t//used for pressure calculation - must be nonzero or else some softwares will think the stylus is up.\n\t\t\t\t\t//something is wrong in here and some of these LSB dont make it back to libnds... whatever.\n\t\t\t\t\tu16 scratch;\n\t\t\t\t\tCalculateTouchPressure(CommonSettings.StylusPressure,val,scratch);\n\n\t\t\t\t\tif(spicnt & 0x800)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(partie)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = ((val<<3)&0x7FF);\n\t\t\t\t\t\t\tpartie = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval = (val>>5);\n\t\t\t\t\t\tpartie = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tval = ((val<<3)&0x7FF);\n\t\t\t\t\tpartie = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase TSC_MEASURE_Z2: //Z2\n\t\t\t\t{\n\t\t\t\t\t//used for pressure calculation - must be nonzero or else some softwares will think the stylus is up.\n\t\t\t\t\t//something is wrong in here and some of these LSB dont make it back to libnds... whatever.\n\t\t\t\t\tu16 scratch;\n\t\t\t\t\tCalculateTouchPressure(CommonSettings.StylusPressure,scratch,val);\n\n\t\t\t\t\tif(spicnt & 0x800)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(partie)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = ((val<<3)&0x7FF);\n\t\t\t\t\t\t\tpartie = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval = (val>>5);\n\t\t\t\t\t\tpartie = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tval = ((val<<3)&0x7FF);\n\t\t\t\t\tpartie = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase TSC_MEASURE_X:\n\t\t\t\t\tif(spicnt & 0x800)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(partie)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tval = (nds.adc_touchX << 3) & 0xFF;\n\t\t\t\t\t\t\tpartie = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval = (nds.adc_touchX>>5) & 0xFF;\n\t\t\t\t\t\tpartie = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tval = (nds.adc_touchX<<3) & 0xFF;\n\t\t\t\t\tpartie = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TSC_MEASURE_AUX:\n\t\t\t\t\tif(!(val & 0x80))\n\t\t\t\t\t\tval = (Mic_ReadSample() & 0xFF);\n\t\t\t\t\telse\n\t\t\t\t\t\tval = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 3 :\n\t\t// NOTICE: Device 3 of SPI is reserved (unused and unusable)\n\t\tbreak;\n\t}\n\n\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPIDATA >> 20) & 0xff], REG_SPIDATA & 0xfff, val & 0x00FF);\n}\n// ====================================================================== REG_SPIxxx END\n\n//does some validation on the game's choice of IF value, correcting it if necessary\nstatic void validateIF_arm9()\n{\n}\n\ntemplate<int PROCNUM> static void REG_IF_WriteByte(u32 addr, u8 val)\n{\n\t//the following bits are generated from logic and should not be affected here\n\t//Bit 21    NDS9 only: Geometry Command FIFO\n\t//arm9: IF &= ~0x00200000;\n\t//arm7: IF &= ~0x00000000;\n\t//UPDATE IN setIF() ALSO!!!!!!!!!!!!!!!!\n\t//UPDATE IN mmu_loadstate ALSO!!!!!!!!!!!!\n\tif (addr==2) {\n\t\tif(PROCNUM==ARMCPU_ARM9)\n\t\t\tval &= ~0x20;\n\t\telse\n\t\t\tval &= ~0x00;\n\t}\n\n\t//ZERO 01-dec-2010 : I am no longer sure this approach is correct.. it proved to be wrong for IPC fifo.......\n\t//it seems as if IF bits should always be cached (only the user can clear them)\n\t\n\tMMU.reg_IF_bits[PROCNUM] &= (~(((u32)val)<<(addr<<3)));\n\tNDS_Reschedule();\n}\n\ntemplate<int PROCNUM> static void REG_IF_WriteWord(u32 addr,u16 val)\n{\n\tREG_IF_WriteByte<PROCNUM>(addr,val&0xFF);\n\tREG_IF_WriteByte<PROCNUM>(addr+1,(val>>8)&0xFF);\n}\n\ntemplate<int PROCNUM> static void REG_IF_WriteLong(u32 val)\n{\n\tREG_IF_WriteByte<PROCNUM>(0,val&0xFF);\n\tREG_IF_WriteByte<PROCNUM>(1,(val>>8)&0xFF);\n\tREG_IF_WriteByte<PROCNUM>(2,(val>>16)&0xFF);\n\tREG_IF_WriteByte<PROCNUM>(3,(val>>24)&0xFF);\n}\n\ntemplate<int PROCNUM>\nu32 MMU_struct::gen_IF()\n{\n\tu32 IF = reg_IF_bits[PROCNUM];\n\n\tif(PROCNUM==ARMCPU_ARM9)\n\t{\n\t\t//according to gbatek, these flags are forced on until the condition is removed.\n\t\t//no proof of this though...\n\t\tswitch(MMU_new.gxstat.gxfifo_irq)\n\t\t{\n\t\tcase 0: //never\n\t\t\tbreak;\n\t\tcase 1: //less than half full\n\t\t\tif(MMU_new.gxstat.fifo_low) \n\t\t\t\tIF |= IRQ_MASK_ARM9_GXFIFO;\n\t\t\tbreak;\n\t\tcase 2: //empty\n\t\t\tif(MMU_new.gxstat.fifo_empty) \n\t\t\t\tIF |= IRQ_MASK_ARM9_GXFIFO;\n\t\t\tbreak;\n\t\tcase 3: //reserved/unknown\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn IF;\n}\n\nstatic void writereg_DISP3DCNT(const int size, const u32 adr, const u32 val)\n{\n\t//UGH. rewrite this shite to use individual values and reconstruct the return value instead of packing things in this !@#)ing register\n\t\n\t//nanostray2 cutscene will test this vs old desmumes by using some kind of 32bit access for setting up this reg for cutscenes\n\tswitch(size)\n\t{\n\tcase 8:\n\t\tswitch(adr)\n\t\t{\n\t\tcase REG_DISPA_DISP3DCNT: \n\t\t\tMMU.reg_DISP3DCNT_bits &= 0xFFFFFF00;\n\t\t\tMMU.reg_DISP3DCNT_bits |= val;\n\t\t\tgfx3d_Control(MMU.reg_DISP3DCNT_bits);\n\t\t\tbreak;\n\t\tcase REG_DISPA_DISP3DCNT+1:\n\t\t\t{\n\t\t\t\tu32 myval = (val & ~0x30) | (~val & ((MMU.reg_DISP3DCNT_bits>>8) & 0x30)); // bits 12,13 are ack bits\n\t\t\t\tmyval &= 0x7F; //top bit isnt connected\n\t\t\t\tMMU.reg_DISP3DCNT_bits = MMU.reg_DISP3DCNT_bits&0xFFFF00FF;\n\t\t\t\tMMU.reg_DISP3DCNT_bits |= (myval<<8);\n\t\t\t\tgfx3d_Control(MMU.reg_DISP3DCNT_bits);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase 16:\n\tcase 32:\n\t\twritereg_DISP3DCNT(8,adr,val&0xFF);\n\t\twritereg_DISP3DCNT(8,adr+1,(val>>8)&0xFF);\n\t\tbreak;\n\t}\n}\n\nstatic u32 readreg_DISP3DCNT(const int size, const u32 adr)\n{\n\t//UGH. rewrite this shite to use individual values and reconstruct the return value instead of packing things in this !@#)ing register\n\tswitch(size)\n\t{\n\tcase 8:\n\t\tswitch(adr)\n\t\t{\n\t\tcase REG_DISPA_DISP3DCNT: \n\t\t\treturn MMU.reg_DISP3DCNT_bits & 0xFF;\n\t\tcase REG_DISPA_DISP3DCNT+1:\n\t\t\treturn ((MMU.reg_DISP3DCNT_bits)>>8)& 0xFF;\n\t\t}\n\t\tbreak;\n\tcase 16:\n\tcase 32:\n\t\treturn readreg_DISP3DCNT(8,adr)|(readreg_DISP3DCNT(8,adr+1)<<8);\n\t}\n\tassert(false);\n\treturn 0;\n}\n\n\nstatic u32 readreg_POWCNT1(const int size, const u32 adr) { \n\tswitch(size)\n\t{\n\tcase 8:\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_POWCNT1: {\n\t\t\t\tu8 ret = 0;\t\t\n\t\t\t\tret |= nds.power1.lcd?BIT(0):0;\n\t\t\t\tret |= nds.power1.gpuMain?BIT(1):0;\n\t\t\t\tret |= nds.power1.gfx3d_render?BIT(2):0;\n\t\t\t\tret |= nds.power1.gfx3d_geometry?BIT(3):0;\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase REG_POWCNT1+1: {\n\t\t\t\tu8 ret = 0;\n\t\t\t\tret |= nds.power1.gpuSub?BIT(1):0;\n\t\t\t\tret |= nds.power1.dispswap?BIT(7):0;\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn 0;\t\t}\n\tcase 16:\n\tcase 32:\n\t\treturn readreg_POWCNT1(8,adr)|(readreg_POWCNT1(8,adr+1)<<8);\n\t}\n\tassert(false);\n\treturn 0;\n}\nstatic void writereg_POWCNT1(const int size, const u32 adr, const u32 val) { \n\tswitch(size)\n\t{\n\tcase 8:\n\t\tswitch(adr)\n\t\t{\n\t\tcase REG_POWCNT1:\n\t\t\tnds.power1.lcd = BIT0(val);\n\t\t\tnds.power1.gpuMain = BIT1(val);\n\t\t\tnds.power1.gfx3d_render = BIT2(val);\n\t\t\tnds.power1.gfx3d_geometry = BIT3(val);\n\t\t\tbreak;\n\t\tcase REG_POWCNT1+1:\n\t\t\tnds.power1.gpuSub = BIT1(val);\n\t\t\tnds.power1.dispswap = BIT7(val);\n\t\t\tif(nds.power1.dispswap)\n\t\t\t{\n\t\t\t\t//printf(\"Main core on top (vcount=%d)\\n\",nds.VCount);\n\t\t\t\tMainScreen.offset = 0;\n\t\t\t\tSubScreen.offset = 192;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//printf(\"Main core on bottom (vcount=%d)\\n\",nds.VCount);\n\t\t\t\tMainScreen.offset = 192;\n\t\t\t\tSubScreen.offset = 0;\n\t\t\t}\t\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase 16:\n\tcase 32:\n\t\twritereg_POWCNT1(8,adr,val&0xFF);\n\t\twritereg_POWCNT1(8,adr+1,(val>>8)&0xFF);\n\t\tbreak;\n\t}\n}\n\nstatic INLINE void MMU_IPCSync(u8 proc, u32 val)\n{\n\t//INFO(\"IPC%s sync 0x%04X (0x%02X|%02X)\\n\", proc?\"7\":\"9\", val, val >> 8, val & 0xFF);\n\tu32 sync_l = T1ReadLong(MMU.MMU_MEM[proc][0x40], 0x180) & 0xFFFF;\n\tu32 sync_r = T1ReadLong(MMU.MMU_MEM[proc^1][0x40], 0x180) & 0xFFFF;\n\n\tsync_l = ( sync_l & 0x000F ) | ( val & 0x0F00 );\n\tsync_r = ( sync_r & 0x6F00 ) | ( (val >> 8) & 0x000F );\n\n\tsync_l |= val & 0x6000;\n\n\tif(nds.ensataEmulation && proc==1 && nds.ensataIpcSyncCounter<9) {\n\t\tu32 iteration = (val&0x0F00)>>8;\n\n\t\tif(iteration==8-nds.ensataIpcSyncCounter)\n\t\t\tnds.ensataIpcSyncCounter++;\n\t\telse printf(\"ERROR: ENSATA IPC SYNC HACK FAILED; BAD THINGS MAY HAPPEN\\n\");\n\n\t\t//for some reason, the arm9 doesn't handshake when ensata is detected.\n\t\t//so we complete the protocol here, which is to mirror the values 8..0 back to \n\t\t//the arm7 as they are written by the arm7\n\t\tsync_r &= 0xF0FF;\n\t\tsync_r |= (iteration<<8);\n\t\tsync_l &= 0xFFF0;\n\t\tsync_l |= iteration;\n\t}\n\n\tT1WriteLong(MMU.MMU_MEM[proc][0x40], 0x180, sync_l);\n\tT1WriteLong(MMU.MMU_MEM[proc^1][0x40], 0x180, sync_r);\n\n\tif ((sync_l & IPCSYNC_IRQ_SEND) && (sync_r & IPCSYNC_IRQ_RECV))\n\t\tNDS_makeIrq(proc^1, IRQ_BIT_IPCSYNC);\n\n\tNDS_Reschedule();\n}\n\nstatic INLINE u16 read_timer(int proc, int timerIndex)\n{\n\t//chained timers are always up to date\n\tif(MMU.timerMODE[proc][timerIndex] == 0xFFFF)\n\t\treturn MMU.timer[proc][timerIndex];\n\n\t//sometimes a timer will be read when it is not enabled.\n\t//we should have the value cached\n\tif(!MMU.timerON[proc][timerIndex])\n\t\treturn MMU.timer[proc][timerIndex];\n\n\t//for unchained timers, we do not keep the timer up to date. its value will need to be calculated here\n\ts32 diff = (s32)(nds.timerCycle[proc][timerIndex] - nds_timer);\n\tassert(diff>=0);\n\tif(diff<0) \n\t\tprintf(\"NEW EMULOOP BAD NEWS PLEASE REPORT: TIME READ DIFF < 0 (%d) (%d) (%d)\\n\",diff,timerIndex,MMU.timerMODE[proc][timerIndex]);\n\t\n\ts32 units = diff / (1<<MMU.timerMODE[proc][timerIndex]);\n\ts32 ret;\n\n\tif(units==65536)\n\t\tret = 0; //I'm not sure why this is happening...\n\t\t//whichever instruction setup this counter should advance nds_timer (I think?) and the division should truncate down to 65535 immediately\n\telse if(units>65536) {\n\t\tprintf(\"NEW EMULOOP BAD NEWS PLEASE REPORT: UNITS %d:%d = %d\\n\",proc,timerIndex,units);\n\t\tret = 0;\n\t}\n\telse ret = 65535 - units;\n\n\treturn ret;\n}\n\nstatic INLINE void write_timer(int proc, int timerIndex, u16 val)\n{\n#if 0\n\tint mask\t\t= ((val&0x80)>>7) << timerIndex;\n\tMMU.CheckTimers = (MMU.CheckTimers & (~mask)) | mask;\n#endif\n\n\tif(val&0x80)\n\t\tMMU.timer[proc][timerIndex] = MMU.timerReload[proc][timerIndex];\n\telse\n\t{\n\t\tif(MMU.timerON[proc][timerIndex])\n\t\t\t//read the timer value one last time\n\t\t\tMMU.timer[proc][timerIndex] = read_timer(proc,timerIndex);\n\t}\n\n\tMMU.timerON[proc][timerIndex] = val & 0x80;\n\n\tswitch(val&7)\n\t{\n\t\tcase 0 :\n\t\t\tMMU.timerMODE[proc][timerIndex] = 0+1;\n\t\t\tbreak;\n\t\tcase 1 :\n\t\t\tMMU.timerMODE[proc][timerIndex] = 6+1;\n\t\t\tbreak;\n\t\tcase 2 :\n\t\t\tMMU.timerMODE[proc][timerIndex] = 8+1;\n\t\t\tbreak;\n\t\tcase 3 :\n\t\t\tMMU.timerMODE[proc][timerIndex] = 10+1;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tMMU.timerMODE[proc][timerIndex] = 0xFFFF;\n\t\t\tbreak;\n\t}\n\n\tint remain = 65536 - MMU.timerReload[proc][timerIndex];\n\tnds.timerCycle[proc][timerIndex] = nds_timer + (remain<<MMU.timerMODE[proc][timerIndex]);\n\n\tT1WriteWord(MMU.MMU_MEM[proc][0x40], 0x102+timerIndex*4, val);\n\tNDS_RescheduleTimers();\n}\n\nextern CACHE_ALIGN MatrixStack\tmtxStack[4];\nu32 TGXSTAT::read32()\n{\n\tu32 ret = 0;\n\n\tret |= tb|(tr<<1);\n\n\tint _hack_getMatrixStackLevel(int which);\n\t\n\t// stack position always equal zero. possible timings is wrong\n\t// using in \"The Wild West\"\n\tint proj_level = _hack_getMatrixStackLevel(0);\n\tint mv_level = _hack_getMatrixStackLevel(1);\n\tret |= ((proj_level << 13) | (mv_level << 8)); //matrix stack levels //no proof that these are needed yet\n\n\tret |= sb<<14;\t//stack busy\n\tret |= se<<15;\n\tret |= (std::min(gxFIFO.size,(u32)255))<<16;\n\tif(gxFIFO.size>=255) ret |= BIT(24); //fifo full\n\tif(gxFIFO.size<128) ret |= BIT(25); //fifo half\n\tif(gxFIFO.size==0) ret |= BIT(26); //fifo empty\n\t//determine busy flag.\n\t//if we're waiting for a flush, we're busy\n\tif(isSwapBuffers) ret |= BIT(27);\n\t//if fifo is nonempty, we're busy\n\tif(gxFIFO.size!=0) ret |= BIT(27);\n\n\t//printf(\"[%d] %d %d %d\\n\",currFrameCounter,se,sb,gxFIFO.size!=0);\n\n\t\n\tret |= ((gxfifo_irq & 0x3) << 30); //user's irq flags\n\n\t//printf(\"vc=%03d Returning gxstat read: %08X (isSwapBuffers=%d)\\n\",nds.VCount,ret,isSwapBuffers);\n\n\t//ret = (2 << 8);\n\t//INFO(\"gxSTAT 0x%08X (proj %i, pos %i)\\n\", ret, _hack_getMatrixStackLevel(1), _hack_getMatrixStackLevel(2));\n\treturn ret;\n}\n\nvoid TGXSTAT::write32(const u32 val)\n{\n\tgxfifo_irq = (val>>30)&3;\n\tif(BIT15(val)) \n\t{\n\t\t// Writing \"1\" to Bit15 does reset the Error Flag (Bit15), \n\t\t// and additionally resets the Projection Stack Pointer (Bit13)\n\t\tmtxStack[0].position = 0;\n\t\tse = 0; //clear stack error flag\n\t}\n\t//printf(\"gxstat write: %08X while gxfifo.size=%d\\n\",val,gxFIFO.size);\n\n\t\t//if (val & (1<<29))\t\t// clear? (only in homebrew?)\n\t//{\n\t//\tGFX_PIPEclear();\n\t//\tGFX_FIFOclear();\n\t//\treturn;\n\t//}\n}\n\nvoid TGXSTAT::savestate(EMUFILE *f)\n{\n\twrite32le(1,f); //version\n\twrite8le(tb,f); write8le(tr,f); write8le(se,f); write8le(gxfifo_irq,f); write8le(sb,f);\n}\nbool TGXSTAT::loadstate(EMUFILE *f)\n{\n\tu32 version;\n\tif(read32le(&version,f) != 1) return false;\n\tif(version > 1) return false;\n\n\tread8le(&tb,f); read8le(&tr,f); read8le(&se,f); read8le(&gxfifo_irq,f); \n\tif (version >= 1)\n\t\tread8le(&sb,f);\n\n\treturn true;\n}\n\n//this could be inlined...\nvoid MMU_struct_new::write_dma(const int proc, const int size, const u32 _adr, const u32 val)\n{\n\t//printf(\"%08lld -- write_dma: %d %d %08X %08X\\n\",nds_timer,proc,size,_adr,val);\n\tconst u32 adr = _adr - _REG_DMA_CONTROL_MIN;\n\tconst u32 chan = adr/12;\n\tconst u32 regnum = (adr - chan*12)>>2;\n\n\tMMU_new.dma[proc][chan].regs[regnum]->write(size,adr,val);\n}\n\t\n\n//this could be inlined...\nu32 MMU_struct_new::read_dma(const int proc, const int size, const u32 _adr)\n{\n\tconst u32 adr = _adr - _REG_DMA_CONTROL_MIN;\n\tconst u32 chan = adr/12;\n\tconst u32 regnum = (adr - chan*12)>>2;\n\n\tconst u32 temp = MMU_new.dma[proc][chan].regs[regnum]->read(size,adr);\n\t//printf(\"%08lld --  read_dma: %d %d %08X = %08X\\n\",nds_timer,proc,size,_adr,temp);\n\n\treturn temp;\n}\n\nMMU_struct_new::MMU_struct_new()\n{\n\tfor(int i=0;i<2;i++)\n\t\tfor(int j=0;j<4;j++) {\n\t\t\tdma[i][j].procnum = i;\n\t\t\tdma[i][j].chan = j;\n\t\t}\n}\n\nbool DmaController::loadstate(EMUFILE* f)\n{\n\tu32 version;\n\tif(read32le(&version,f) != 1) return false;\n\tif(version >1) return false;\n\n\tread8le(&enable,f); read8le(&irq,f); read8le(&repeatMode,f); read8le(&_startmode,f);\n\tread8le(&userEnable,f);\n\tread32le(&wordcount,f);\n\tu8 temp;\n\tread8le(&temp,f); startmode = (EDMAMode)temp;\n\tread8le(&temp,f); bitWidth = (EDMABitWidth)temp;\n\tread8le(&temp,f); sar = (EDMASourceUpdate)temp;\n\tread8le(&temp,f); dar = (EDMADestinationUpdate)temp;\n\tread32le(&saddr,f); read32le(&daddr,f);\n\tread32le(&dmaCheck,f); read32le(&running,f); read32le(&paused,f); read32le(&triggered,f); \n\tread64le(&nextEvent,f);\n\n\tif(version==1)\n\t{\n\t\tread32le(&saddr_user,f);\n\t\tread32le(&daddr_user,f);\n\t}\n\n\treturn true;\n}\n\nvoid DmaController::savestate(EMUFILE *f)\n{\n\twrite32le(1,f); //version\n\twrite8le(enable,f); write8le(irq,f); write8le(repeatMode,f); write8le(_startmode,f);\n\twrite8le(userEnable,f);\n\twrite32le(wordcount,f);\n\twrite8le(startmode,f); \n\twrite8le(bitWidth,f); \n\twrite8le(sar,f); \n\twrite8le(dar,f); \n\twrite32le(saddr,f); write32le(daddr,f);\n\twrite32le(dmaCheck,f); write32le(running,f); write32le(paused,f); write32le(triggered,f); \n\twrite64le(nextEvent,f);\n\twrite32le(saddr_user,f);\n\twrite32le(daddr_user,f);\n}\n\nvoid DmaController::write32(const u32 val)\n{\n\tif(running)\n\t{\n\t\t//desp triggers this a lot. figure out whats going on\n\t\t//printf(\"thats weird..user edited dma control while it was running\\n\");\n\t}\n\t//printf(\"dma %d,%d WRITE %08X\\n\",procnum,chan,val);\n\twordcount = val&0x1FFFFF;\n\tu8 wasRepeatMode = repeatMode;\n\tu8 wasEnable = enable;\n\tu32 valhi = val>>16;\n\tdar = (EDMADestinationUpdate)((valhi>>5)&3);\n\tsar = (EDMASourceUpdate)((valhi>>7)&3);\n\trepeatMode = BIT9(valhi);\n\tbitWidth = (EDMABitWidth)BIT10(valhi);\n\t_startmode = (valhi>>11)&7;\n\tif(procnum==ARMCPU_ARM7) _startmode &= 6;\n\tirq = BIT14(valhi);\n\tenable = BIT15(valhi);\n\n\t//if(irq) printf(\"!!!!!!!!!!!!IRQ!!!!!!!!!!!!!\\n\");\n\n\t//make sure we don't get any old triggers\n\tif(!wasEnable && enable)\n\t\ttriggered = FALSE;\n\n\tif(enable)\n\t{\n\t\t//address registers are reloaded from user's settings whenever dma is enabled\n\t\t//this is tested well by contra4 classic games, which use this to hdma scroll registers\n\t\t//specifically in the fit-screen mode.\n\t\tsaddr = saddr_user;\n\t\tdaddr = daddr_user;\n\t}\n\n\t//printf(\"dma %d,%d set to startmode %d with wordcount set to: %08X\\n\",procnum,chan,_startmode,wordcount);\n\tif (enable && procnum==1 && (!(chan&1)) && _startmode==6)\n\t\tprintf(\"!!!---!!! WIFI DMA: %08X TO %08X, %i WORDS !!!---!!!\\n\", saddr, daddr, wordcount);\n\n\t//analyze enabling and startmode.\n\t//note that we only do this if the dma was freshly enabled.\n\t//we should probably also only be latching these other regs in that case too..\n\t//but for now just this one will do (otherwise the dma repeat stop procedure (in this case the ff4 title menu load with gamecard dma) will fail)\n\t//if(!running) enable = userEnable;\n\n\t//if we were previously in a triggered mode, and were already enabled,\n\t//then don't re-trigger now. this is rather confusing..\n\t//we really only want to auto-trigger gxfifo and immediate modes.\n\t//but we don't know what mode we're in yet.\n\t//so this is our workaround\n\t//(otherwise the dma repeat stop procedure (in this case the ff4 title menu load with gamecard dma) will fail)\n\tbool doNotStart = false;\n\tif(startmode != EDMAMode_Immediate && startmode != EDMAMode_GXFifo && wasEnable) doNotStart = true;\n\n\t//this dma may need to trigger now, so give it a chance\n\t//if(!(wasRepeatMode && !repeatMode)) //this was an older test\n\tif(!doNotStart)\n\t\tdoSchedule();\n\n\tdriver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA);\n}\n\nvoid DmaController::exec()\n{\n\t//this function runs when the DMA ends. the dma start actually queues this event after some kind of guess as to how long the DMA should take\n\n\t//we'll need to unfreeze the arm9 bus now\n\tif(procnum==ARMCPU_ARM9) nds.freezeBus &= ~(1<<(chan+1));\n\n\tdmaCheck = FALSE;\n\n\tif(running)\n\t{\n\t\tswitch(startmode) {\n\t\t\tcase EDMAMode_GXFifo:\n\t\t\t\t//this dma mode won't finish always its job when it gets signalled\n\t\t\t\t//sometimes it will have words left to transfer.\n\t\t\t\t//if(!paused) printf(\"gxfifo dma ended with %d remaining\\n\",wordcount); //only print this once\n\t\t\t\tif(wordcount>0) {\n\t\t\t\t\tdoPause();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tdoStop();\n\t\t\t\tdriver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA);\n\t\t\t\treturn;\n\t\t}\n\t}\n\t\n\tif(enable)\n\t{\n\t\t//analyze startmode (this only gets latched when a dma begins)\n\t\tif(procnum==ARMCPU_ARM9) startmode = (EDMAMode)_startmode;\n\t\telse {\n\t\t\t//arm7 startmode analysis:\n\t\t\tstatic const EDMAMode lookup[] = {EDMAMode_Immediate,EDMAMode_VBlank,EDMAMode_Card,EDMAMode7_Wifi};\n\t\t\t//arm7 has a slightly different startmode encoding\n\t\t\tstartmode = lookup[_startmode>>1];\n\t\t\tif(startmode == EDMAMode7_Wifi && (chan==1 || chan==3))\n\t\t\t\tstartmode = EDMAMode7_GBASlot;\n\t\t}\n\n\t\t//make it run, if it is triggered\n\t\t//but first, scan for triggering conditions\n\t\tswitch(startmode) {\n\t\t\tcase EDMAMode_Immediate:\n\t\t\t\ttriggered = TRUE;\n\t\t\t\tbreak;\n\t\t\tcase EDMAMode_GXFifo:\n\t\t\t\tif(gxFIFO.size<=127)\n\t\t\t\t\ttriggered = TRUE;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(triggered)\n\t\t{\n\t\t\t//if(procnum==0) printf(\"vc=%03d %08lld trig type %d dma#%d w/words %d at src:%08X dst:%08X gxf:%d\",nds.VCount,nds_timer,startmode,chan,wordcount,saddr,daddr,gxFIFO.size);\n\t\t\trunning = TRUE;\n\t\t\tpaused = FALSE;\n\t\t\tif(procnum == ARMCPU_ARM9) doCopy<ARMCPU_ARM9>();\n\t\t\telse doCopy<ARMCPU_ARM7>();\n\t\t\t//printf(\";%d\\n\",gxFIFO.size);\n\t\t}\n\t}\n\n\tdriver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA);\n}\n\ntemplate<int PROCNUM>\nvoid DmaController::doCopy()\n{\n\t//generate a copy count depending on various copy mode's behavior\n\tu32 todo = wordcount;\n\tif(PROCNUM == ARMCPU_ARM9) if(todo == 0) todo = 0x200000; //according to gbatek.. we've verified this behaviour on the arm7\n\tif(startmode == EDMAMode_MemDisplay) \n\t{\n\t\ttodo = 128; //this is a hack. maybe an alright one though. it should be 4 words at a time. this is a whole scanline\n\t\n\t\t//apparently this dma turns off after it finishes a frame\n\t\tif(nds.VCount==191) enable = 0;\n\t}\n\tif(startmode == EDMAMode_Card) todo *= 0x80;\n\tif(startmode == EDMAMode_GXFifo) todo = std::min(todo,(u32)112);\n\n\t//determine how we're going to copy\n\tbool bogarted = false;\n\tu32 sz = (bitWidth==EDMABitWidth_16)?2:4;\n\tu32 dstinc,srcinc;\n\tswitch(dar) {\n\t\tcase EDMADestinationUpdate_Increment       :  dstinc =  sz; break;\n\t\tcase EDMADestinationUpdate_Decrement       :  dstinc = (u32)-(s32)sz; break;\n\t\tcase EDMADestinationUpdate_Fixed           :  dstinc =   0; break;\n\t\tcase EDMADestinationUpdate_IncrementReload :  dstinc =  sz; break;\n\t\tdefault: bogarted = true; break;\n\t}\n\tswitch(sar) {\n\t\tcase EDMASourceUpdate_Increment : srcinc = sz; break;\n\t\tcase EDMASourceUpdate_Decrement : srcinc = (u32)-(s32)sz; break;\n\t\tcase EDMASourceUpdate_Fixed\t\t: srcinc = 0; break;\n\t\tcase EDMASourceUpdate_Invalid   : bogarted = true; break;\n\t\tdefault: bogarted = true; break;\n\t}\n\n\t//need to figure out what to do about this\n\tif(bogarted) \n\t{\n\t\tprintf(\"YOUR GAME IS BOGARTED!!! PLEASE REPORT!!!\\n\");\n\t\tassert(false);\n\t\treturn;\n\t}\n\n\tu32 src = saddr;\n\tu32 dst = daddr;\n\n\n\t//if these do not use MMU_AT_DMA and the corresponding code in the read/write routines,\n\t//then danny phantom title screen will be filled with a garbage char which is made by\n\t//dmaing from 0x00000000 to 0x06000000\n\t//TODO - these might be losing out a lot by not going through the templated version anymore.\n\t//we might make another function to do just the raw copy op which can use them with checks\n\t//outside the loop\n\tint time_elapsed = 0;\n\tif(sz==4) {\n\t\tfor(s32 i=(s32)todo; i>0; i--)\n\t\t{\n\t\t\ttime_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,32,MMU_AD_READ,TRUE>(src,true);\n\t\t\ttime_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,32,MMU_AD_WRITE,TRUE>(dst,true);\n\t\t\tu32 temp = _MMU_read32(procnum,MMU_AT_DMA,src);\n\t\t\t_MMU_write32(procnum,MMU_AT_DMA,dst, temp);\n\t\t\tdst += dstinc;\n\t\t\tsrc += srcinc;\n\t\t}\n\t} else {\n\t\tfor(s32 i=(s32)todo; i>0; i--)\n\t\t{\n\t\t\ttime_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,16,MMU_AD_READ,TRUE>(src,true);\n\t\t\ttime_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,16,MMU_AD_WRITE,TRUE>(dst,true);\n\t\t\tu16 temp = _MMU_read16(procnum,MMU_AT_DMA,src);\n\t\t\t_MMU_write16(procnum,MMU_AT_DMA,dst, temp);\n\t\t\tdst += dstinc;\n\t\t\tsrc += srcinc;\n\t\t}\n\t}\n\n\t//printf(\"ARM%c dma of size %d from 0x%08X to 0x%08X took %d cycles\\n\",PROCNUM==0?'9':'7',todo*sz,saddr,daddr,time_elapsed);\n\n\t//reschedule an event for the end of this dma, and figure out how much it cost us\n\tdoSchedule();\n\tnextEvent += time_elapsed;\n\n\t//freeze the ARM9 bus for the duration of this DMA\n\t//thats not entirely accurate\n\tif(procnum==ARMCPU_ARM9) \n\t\tnds.freezeBus |= (1<<(chan+1));\n\t\t\n\t//write back the addresses\n\tsaddr = src;\n\tif(dar != EDMADestinationUpdate_IncrementReload) //but dont write back dst if we were supposed to reload\n\t\tdaddr = dst;\n\n\t//do wordcount accounting\n\tif(startmode == EDMAMode_Card) \n\t\ttodo /= 0x80; //divide this funky one back down before subtracting it \n\n\tif(!repeatMode)\n\t\twordcount -= todo;\n}\n\n#define tryTriggerInl(m) \tDmaController& mmu = m; \\\n\t\t\t\t\t\t\tif((mmu.startmode==mode) && mmu.enable  && (!mmu.running || mmu.paused)) { mmu.triggered = mmu.dmaCheck = TRUE; mmu.nextEvent = nds_timer; NDS_RescheduleDMA(); }\n\ntemplate<EDMAMode mode> void triggerDma()\n{\n\tMACRODO2(0, {\n\t\tconst int i=X;\n\t\tMACRODO4(0, {\n\t\t\tconst int j=X;\n\t\t\ttryTriggerInl(MMU_new.dma[i][j]);\n\t\t});\n\t});\n}\n\ntemplate void triggerDma<EDMAMode_VBlank>();\ntemplate void triggerDma<EDMAMode_HBlank>();\ntemplate void triggerDma<EDMAMode_HStart>();\ntemplate void triggerDma<EDMAMode_MemDisplay>();\ntemplate void triggerDma<EDMAMode_GXFifo>();\n\nvoid DmaController::tryTrigger(EDMAMode mode)\n{\n\tif(startmode != mode) return;\n\tif(!enable) return;\n\n\t//hmm dont trigger it if its already running! \n\t//but paused things need triggers to continue\n\tif(running && !paused) return; \n\ttriggered = TRUE;\n\tdoSchedule();\n}\n\nvoid DmaController::doSchedule()\n{\n\tdmaCheck = TRUE;\n\tnextEvent = nds_timer;\n\tNDS_RescheduleDMA();\n}\n\n\nvoid DmaController::doPause()\n{\n\ttriggered = FALSE;\n\tpaused = TRUE;\n}\n\nvoid DmaController::doStop()\n{\n\t//if(procnum==0) printf(\"%08lld stop type %d dma#%d\\n\",nds_timer,startmode,chan);\n\trunning = FALSE;\n\tif(!repeatMode) enable = FALSE;\n\tif(irq) {\n\t\tNDS_makeIrq(procnum,IRQ_BIT_DMA_0+chan);\n\t}\n}\n\n\n\nu32 DmaController::read32()\n{\n\tu32 ret = 0;\n\tret |= enable<<31;\n\tret |= irq<<30;\n\tret |= _startmode<<27;\n\tret |= bitWidth<<26;\n\tret |= repeatMode<<25;\n\tret |= sar<<23;\n\tret |= dar<<21;\n\tret |= wordcount;\n\t//printf(\"dma %d,%d READ  %08X\\n\",procnum,chan,ret);\n\treturn ret;\n}\n\nstatic INLINE void write_auxspicnt(const int proc, const int size, const int adr, const int val)\n{\n\t//why val==0 to reset? is it a particular bit? its not bit 6...\n\tswitch(size) {\n\t\tcase 16:\n\t\t\tMMU.AUX_SPI_CNT = val;\n\t\t\tif (val == 0) MMU_new.backupDevice.reset_command();\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tswitch(adr) {\n\t\t\t\tcase 0: \n\t\t\t\t\tT1WriteByte((u8*)&MMU.AUX_SPI_CNT,0,val); \n\t\t\t\t\tif (val == 0) MMU_new.backupDevice.reset_command();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1: \n\t\t\t\t\tT1WriteByte((u8*)&MMU.AUX_SPI_CNT,1,val); \n\t\t\t\t\tbreak;\n\t\t\t}\n\t}\n}\n\n\n//================================================================================================== ARM9 *\n//=========================================================================================================\n//=========================================================================================================\n//================================================= MMU write 08\nvoid FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)\n{\n\tadr &= 0x0FFFFFFF;\n\n\tmmu_log_debug_ARM9(adr, \"(write08) 0x%02X\", val);\n\n\tif(adr < 0x02000000)\n\t{\n#ifdef HAVE_JIT\n\t\tJITLUT_HANDLE_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0;\n#endif\n\t\tT1WriteByte(MMU.ARM9_ITCM, adr & 0x7FFF, val);\n\t\treturn;\n\t}\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\t\tif(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)\n\t\t{} //prohibited\n\t\telse addon.write08(ARMCPU_ARM9, adr, val);\n\t\treturn;\n\t}\n\n\t//block 8bit writes to OAM and palette memory\n\tif((adr&0x0F000000)==0x07000000) return;\n\tif((adr&0x0F000000)==0x05000000) return;\n\n\tif (adr >> 24 == 4)\n\t{\n\t\t\n\t\t// TODO: add pal reg\n\t\tif (nds.power1.gpuMain == 0)\n\t\t\tif ((adr >= 0x04000008) && (adr<=0x0400005F)) return;\n\t\tif (nds.power1.gpuSub == 0)\n\t\t\tif ((adr >= 0x04001008) && (adr<=0x0400105F)) return;\n\t\tif (nds.power1.gfx3d_geometry == 0)\n\t\t\tif ((adr >= 0x04000400) && (adr<=0x040006FF)) return;\n\t\tif (nds.power1.gfx3d_render == 0)\n\t\t\tif ((adr >= 0x04000320) && (adr<=0x040003FF)) return;\n\n\t\tif(MMU_new.is_dma(adr)) { \n\t\t\tMMU_new.write_dma(ARMCPU_ARM9,8,adr,val); \n\t\t\treturn;\n\t\t}\n\t\t\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_SQRTCNT: printf(\"ERROR 8bit SQRTCNT WRITE\\n\"); return;\n\t\t\tcase REG_SQRTCNT+1: printf(\"ERROR 8bit SQRTCNT1 WRITE\\n\"); return;\n\t\t\tcase REG_SQRTCNT+2: printf(\"ERROR 8bit SQRTCNT2 WRITE\\n\"); return;\n\t\t\tcase REG_SQRTCNT+3: printf(\"ERROR 8bit SQRTCNT3 WRITE\\n\"); return;\n\t\t\t\n#if 1\n\t\t\tcase REG_DIVCNT: printf(\"ERROR 8bit DIVCNT WRITE\\n\"); return;\n\t\t\tcase REG_DIVCNT+1: printf(\"ERROR 8bit DIVCNT+1 WRITE\\n\"); return;\n\t\t\tcase REG_DIVCNT+2: printf(\"ERROR 8bit DIVCNT+2 WRITE\\n\"); return;\n\t\t\tcase REG_DIVCNT+3: printf(\"ERROR 8bit DIVCNT+3 WRITE\\n\"); return;\n#endif\n\n\t\t\t//fog table: only write bottom 7 bits\n\t\t\tcase eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x01: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x03: \n\t\t\tcase eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x05: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x07: \n\t\t\tcase eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x09: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0B: \n\t\t\tcase eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0D: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x0F: \n\t\t\tcase eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x11: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x13: \n\t\t\tcase eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x15: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x17: \n\t\t\tcase eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x19: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1B: \n\t\t\tcase eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1D: case eng_3D_FOG_TABLE+0x1E: case eng_3D_FOG_TABLE+0x1F: \n\t\t\t\tval &= 0x7F;\n\t\t\t\tbreak;\n\n\t\t\t//ensata putchar port\n\t\t\tcase 0x04FFF000:\n\t\t\t\tif(nds.ensataEmulation)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"%c\",val);\n\t\t\t\t\tfflush(stdout);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase eng_3D_GXSTAT:\n\t\t\t\tMMU_new.gxstat.write(8,adr,val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPA_WIN0H: \t \n\t\t\t\tGPU_setWIN0_H1(MainScreen.gpu, val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN0H+1: \t \n\t\t\t\tGPU_setWIN0_H0 (MainScreen.gpu, val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN1H: \t \n\t\t\t\tGPU_setWIN1_H1 (MainScreen.gpu,val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN1H+1: \t \n\t\t\t\tGPU_setWIN1_H0 (MainScreen.gpu,val);\n\t\t\t\tbreak ; \t \n\n\t\t\tcase REG_DISPB_WIN0H: \t \n\t\t\t\tGPU_setWIN0_H1(SubScreen.gpu,val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN0H+1: \t \n\t\t\t\tGPU_setWIN0_H0(SubScreen.gpu,val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN1H: \t \n\t\t\t\tGPU_setWIN1_H1(SubScreen.gpu,val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN1H+1: \t \n\t\t\t\tGPU_setWIN1_H0(SubScreen.gpu,val);\n\t\t\t\tbreak ;\n\n\t\t\tcase REG_DISPA_WIN0V: \t \n\t\t\t\tGPU_setWIN0_V1(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN0V+1: \t \n\t\t\t\tGPU_setWIN0_V0(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN1V: \t \n\t\t\t\tGPU_setWIN1_V1(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN1V+1: \t \n\t\t\t\tGPU_setWIN1_V0(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\n\t\t\tcase REG_DISPB_WIN0V: \t \n\t\t\t\tGPU_setWIN0_V1(SubScreen.gpu,val) ;\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN0V+1: \t \n\t\t\t\tGPU_setWIN0_V0(SubScreen.gpu,val) ;\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN1V: \t \n\t\t\t\tGPU_setWIN1_V1(SubScreen.gpu,val) ;\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN1V+1: \t \n\t\t\t\tGPU_setWIN1_V0(SubScreen.gpu,val) ;\n\t\t\t\tbreak ;\n\n\t\t\tcase REG_DISPA_WININ: \t \n\t\t\t\tGPU_setWININ0(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WININ+1: \t \n\t\t\t\tGPU_setWININ1(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WINOUT: \t \n\t\t\t\tGPU_setWINOUT(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WINOUT+1: \t \n\t\t\t\tGPU_setWINOBJ(MainScreen.gpu,val);\n\t\t\t\tbreak ; \t \n\n\t\t\tcase REG_DISPB_WININ: \t \n\t\t\t\tGPU_setWININ0(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WININ+1: \t \n\t\t\t\tGPU_setWININ1(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \n\t\t\tcase REG_DISPB_WINOUT: \t \n\t\t\t\tGPU_setWINOUT(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WINOUT+1: \t \n\t\t\t\tGPU_setWINOBJ(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ;\n\n\t\t\tcase REG_DISPA_BLDCNT:\n\t\t\t\tGPU_setBLDCNT_HIGH(MainScreen.gpu,val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPA_BLDCNT+1:\n\t\t\t\tGPU_setBLDCNT_LOW (MainScreen.gpu,val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPB_BLDCNT: \t \n\t\t\t\tGPU_setBLDCNT_HIGH (SubScreen.gpu,val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BLDCNT+1: \t \n\t\t\t\tGPU_setBLDCNT_LOW (SubScreen.gpu,val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPA_BLDALPHA: \t \n\t\t\t\tMainScreen.gpu->setBLDALPHA_EVA(val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPA_BLDALPHA+1:\n\t\t\t\tMainScreen.gpu->setBLDALPHA_EVB(val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPB_BLDALPHA:\n\t\t\t\tSubScreen.gpu->setBLDALPHA_EVA(val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BLDALPHA+1:\n\t\t\t\tSubScreen.gpu->setBLDALPHA_EVB(val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPA_BLDY: \t \n\t\t\t\tGPU_setBLDY_EVY(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_BLDY: \t \n\t\t\t\tGPU_setBLDY_EVY(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak;\n\n\t\t\tcase REG_AUXSPICNT:\n\t\t\t\twrite_auxspicnt(9,8,0,val);\n\t\t\t\treturn;\n\t\t\tcase REG_AUXSPICNT+1:\n\t\t\t\twrite_auxspicnt(9,8,1,val);\n\t\t\t\treturn;\n\t\t\t\n\t\t\tcase REG_AUXSPIDATA:\n\t\t\t\tif(val!=0) MMU.AUX_SPI_CMD = val & 0xFF;\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM9));\n\t\t\t\tMMU.AUX_SPI_CNT &= ~0x80; //remove busy flag\n\t\t\t\treturn;\n\n\t\t\tcase REG_POWCNT1: writereg_POWCNT1(8,adr,val); break;\n\t\t\t\n\t\t\tcase REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(8,adr,val); return;\n\t\t\tcase REG_DISPA_DISP3DCNT+1: writereg_DISP3DCNT(8,adr,val); return;\n\n\t\t\tcase REG_IF: REG_IF_WriteByte<ARMCPU_ARM9>(0,val); break;\n\t\t\tcase REG_IF+1: REG_IF_WriteByte<ARMCPU_ARM9>(1,val); break;\n\t\t\tcase REG_IF+2: REG_IF_WriteByte<ARMCPU_ARM9>(2,val); break;\n\t\t\tcase REG_IF+3: REG_IF_WriteByte<ARMCPU_ARM9>(3,val); break;\n\n\t\t\tcase eng_3D_CLEAR_COLOR+0: case eng_3D_CLEAR_COLOR+1:\n\t\t\tcase eng_3D_CLEAR_COLOR+2: case eng_3D_CLEAR_COLOR+3:\n\t\t\t\tT1WriteByte((u8*)&gfx3d.state.clearColor,adr-eng_3D_CLEAR_COLOR,val); \n\t\t\t\tbreak;\n\n\t\t\tcase REG_VRAMCNTA:\n\t\t\tcase REG_VRAMCNTB:\n\t\t\tcase REG_VRAMCNTC:\n\t\t\tcase REG_VRAMCNTD:\n\t\t\tcase REG_VRAMCNTE:\n\t\t\tcase REG_VRAMCNTF:\n\t\t\tcase REG_VRAMCNTG:\n\t\t\tcase REG_WRAMCNT:\n\t\t\tcase REG_VRAMCNTH:\n\t\t\tcase REG_VRAMCNTI:\n\t\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA, val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPA_DISPMMEMFIFO:\n\t\t\t{\n\t\t\t\tDISP_FIFOsend(val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t#ifdef LOG_CARD\n\t\t\tcase 0x040001A0 : /* TODO (clear): ??? */\n\t\t\tcase 0x040001A1 :\n\t\t\tcase 0x040001A2 :\n\t\t\tcase 0x040001A8 :\n\t\t\tcase 0x040001A9 :\n\t\t\tcase 0x040001AA :\n\t\t\tcase 0x040001AB :\n\t\t\tcase 0x040001AC :\n\t\t\tcase 0x040001AD :\n\t\t\tcase 0x040001AE :\n\t\t\tcase 0x040001AF :\n\t\t\t\t\t\tLOG(\"%08X : %02X\\r\\n\", adr, val);\n\t\t#endif\n\n\t\t}\n\n\t\tMMU.MMU_MEM[ARMCPU_ARM9][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val;\n\t\treturn;\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);\n\tif(unmapped) return;\n\tif(restricted) return; //block 8bit vram writes\n\n//#ifdef HAVE_JIT\n//\tif (JITLUT_MAPPED(adr, ARMCPU_ARM9))\n//\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM9, 0) = 0;\n//#endif\n\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash]\n\tMMU.MMU_MEM[ARMCPU_ARM9][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val;\n}\n\n//================================================= MMU ARM9 write 16\nvoid FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)\n{\n\tadr &= 0x0FFFFFFE;\n\n\tmmu_log_debug_ARM9(adr, \"(write16) 0x%04X\", val);\n\n\tif (adr < 0x02000000)\n\t{\n#ifdef HAVE_JIT\n\t\tJITLUT_HANDLE_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0;\n#endif\n\t\tT1WriteWord(MMU.ARM9_ITCM, adr & 0x7FFF, val);\n\t\treturn;\n\t}\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\t\tif(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)\n\t\t{} //prohibited\n\t\telse addon.write16(ARMCPU_ARM9, adr, val);\n\t\treturn;\n\t}\n\n\tif((adr >> 24) == 4)\n\t{\n\t\t// TODO: add pal reg\n\t\tif (nds.power1.gpuMain == 0)\n\t\t\tif ((adr >= 0x04000008) && (adr<=0x0400005F)) return;\n\t\tif (nds.power1.gpuSub == 0)\n\t\t\tif ((adr >= 0x04001008) && (adr<=0x0400105F)) return;\n\t\tif (nds.power1.gfx3d_geometry == 0)\n\t\t\tif ((adr >= 0x04000400) && (adr<=0x040006FF)) return;\n\t\tif (nds.power1.gfx3d_render == 0)\n\t\t\tif ((adr >= 0x04000320) && (adr<=0x040003FF)) return;\n\n\t\tif(MMU_new.is_dma(adr)) { \n\t\t\tMMU_new.write_dma(ARMCPU_ARM9,16,adr,val); \n\t\t\treturn;\n\t\t}\n\n\t\tswitch (adr >> 4)\n\t\t{\n\t\t\t\t\t\t//toon table\n\t\t\tcase 0x0400038:\n\t\t\tcase 0x0400039:\n\t\t\tcase 0x040003A:\n\t\t\tcase 0x040003B:\n\t\t\t\t((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF)>>1] = val;\n\t\t\t\tgfx3d_UpdateToonTable((adr & 0x3F) >> 1, val);\n\t\t\treturn;\n\t\t}\n\t\t// Address is an IO register\n\t\tswitch(adr)\n\t\t{\n\t\tcase eng_3D_GXSTAT:\n\t\t\tMMU_new.gxstat.write(16,adr,val);\n\t\t\tbreak;\n\n\t\t//fog table: only write bottom 7 bits\n\t\tcase eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x06:\n\t\tcase eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0E:\n\t\tcase eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x16:\n\t\tcase eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1E:\n\t\t\tval &= 0x7F7F;\n\t\t\tbreak;\n\n\t\tcase REG_DISPA_BG2XL: MainScreen.gpu->setAffineStartWord(2,0,val,0); break;\n\t\tcase REG_DISPA_BG2XH: MainScreen.gpu->setAffineStartWord(2,0,val,1); break;\n\t\tcase REG_DISPA_BG2YL: MainScreen.gpu->setAffineStartWord(2,1,val,0); break;\n\t\tcase REG_DISPA_BG2YH: MainScreen.gpu->setAffineStartWord(2,1,val,1); break;\n\t\tcase REG_DISPA_BG3XL: MainScreen.gpu->setAffineStartWord(3,0,val,0); break;\n\t\tcase REG_DISPA_BG3XH: MainScreen.gpu->setAffineStartWord(3,0,val,1); break;\n\t\tcase REG_DISPA_BG3YL: MainScreen.gpu->setAffineStartWord(3,1,val,0); break;\n\t\tcase REG_DISPA_BG3YH: MainScreen.gpu->setAffineStartWord(3,1,val,1); break;\n\t\tcase REG_DISPB_BG2XL: SubScreen.gpu->setAffineStartWord(2,0,val,0); break;\n\t\tcase REG_DISPB_BG2XH: SubScreen.gpu->setAffineStartWord(2,0,val,1); break;\n\t\tcase REG_DISPB_BG2YL: SubScreen.gpu->setAffineStartWord(2,1,val,0); break;\n\t\tcase REG_DISPB_BG2YH: SubScreen.gpu->setAffineStartWord(2,1,val,1); break;\n\t\tcase REG_DISPB_BG3XL: SubScreen.gpu->setAffineStartWord(3,0,val,0); break;\n\t\tcase REG_DISPB_BG3XH: SubScreen.gpu->setAffineStartWord(3,0,val,1); break;\n\t\tcase REG_DISPB_BG3YL: SubScreen.gpu->setAffineStartWord(3,1,val,0); break;\n\t\tcase REG_DISPB_BG3YH: SubScreen.gpu->setAffineStartWord(3,1,val,1); break;\n\n\t\tcase REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(16,adr,val); return;\n\n\t\t\t// Alpha test reference value - Parameters:1\n\t\t\tcase eng_3D_ALPHA_TEST_REF:\n\t\t\t{\n\t\t\t\t((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x340>>1] = val;\n\t\t\t\tgfx3d_glAlphaFunc(val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tcase eng_3D_CLEAR_COLOR:\n\t\t\tcase eng_3D_CLEAR_COLOR+2:\n\t\t\t{\n\t\t\t\tT1WriteWord((u8*)&gfx3d.state.clearColor,adr-eng_3D_CLEAR_COLOR,val);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Clear background depth setup - Parameters:2\n\t\t\tcase eng_3D_CLEAR_DEPTH:\n\t\t\t{\n\t\t\t\t((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x354>>1] = val;\n\t\t\t\tgfx3d_glClearDepth(val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Fog Color - Parameters:4b\n\t\t\tcase eng_3D_FOG_COLOR:\n\t\t\t{\n\t\t\t\t((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x358>>1] = val;\n\t\t\t\tgfx3d_glFogColor(val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase eng_3D_FOG_OFFSET:\n\t\t\t{\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x35C>>1] = val;\n\t\t\t\tgfx3d_glFogOffset(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase REG_DIVCNT:\n\t\t\t\tMMU_new.div.write16(val);\n\t\t\t\texecdiv();\n\t\t\t\treturn;\n#if 1\n\t\t\tcase REG_DIVNUMER:\n\t\t\tcase REG_DIVNUMER+2:\n\t\t\tcase REG_DIVNUMER+4:\n\t\t\t\tprintf(\"DIV: 16 write NUMER %08X. PLEASE REPORT! \\n\", val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DIVDENOM:\n\t\t\tcase REG_DIVDENOM+2:\n\t\t\tcase REG_DIVDENOM+4:\n\t\t\t\tprintf(\"DIV: 16 write DENOM %08X. PLEASE REPORT! \\n\", val);\n\t\t\t\tbreak;\n#endif\n\t\t\tcase REG_SQRTCNT:\n\t\t\t\tMMU_new.sqrt.write16(val);\n\t\t\t\texecsqrt();\n\t\t\t\treturn;\n\n\t\t\tcase REG_DISPA_BLDCNT: \t \n\t\t\t\tGPU_setBLDCNT(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_BLDCNT: \t \n\t\t\t\tGPU_setBLDCNT(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_BLDALPHA: \t \n\t\t\t\tMainScreen.gpu->setBLDALPHA(val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_BLDALPHA: \t \n\t\t\t\tSubScreen.gpu->setBLDALPHA(val);\n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_BLDY: \t \n\t\t\t\tGPU_setBLDY_EVY(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_BLDY: \t \n\t\t\t\tGPU_setBLDY_EVY(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak;\n\t\t\tcase REG_DISPA_MASTERBRIGHT:\n\t\t\t\tGPU_setMasterBrightness (MainScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\t\t/*\n\t\t\tcase REG_DISPA_MOSAIC: \t \n\t\t\t\tGPU_setMOSAIC(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_MOSAIC: \t \n\t\t\t\tGPU_setMOSAIC(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ;\n\t\t\t\t*/\n\t\t\t//case REG_DISPA_BG0HOFS:\n\t\t\t//\tGPU_setBGxHOFS(0, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\t\t\t//case REG_DISPA_BG0VOFS:\n\t\t\t//\tGPU_setBGxVOFS(0, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\t\t\t//case REG_DISPA_BG1HOFS:\n\t\t\t//\tGPU_setBGxHOFS(1, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\t\t\t//case REG_DISPA_BG1VOFS:\n\t\t\t//\tGPU_setBGxVOFS(1, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\t\t\t//case REG_DISPA_BG2HOFS:\n\t\t\t//\tGPU_setBGxHOFS(2, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\t\t\t//case REG_DISPA_BG2VOFS:\n\t\t\t//\tGPU_setBGxVOFS(2, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\t\t\t//case REG_DISPA_BG3HOFS:\n\t\t\t//\tGPU_setBGxHOFS(3, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\t\t\t//case REG_DISPA_BG3VOFS:\n\t\t\t//\tGPU_setBGxVOFS(3, MainScreen.gpu, val);\n\t\t\t//\tbreak;\n\n\t\t\tcase REG_DISPA_WIN0H: \t \n\t\t\t\tGPU_setWIN0_H (MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN1H: \t \n\t\t\t\tGPU_setWIN1_H(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN0H: \t \n\t\t\t\tGPU_setWIN0_H(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN1H: \t \n\t\t\t\tGPU_setWIN1_H(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN0V: \t \n\t\t\t\tGPU_setWIN0_V(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WIN1V: \t \n\t\t\t\tGPU_setWIN1_V(MainScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN0V: \t \n\t\t\t\tGPU_setWIN0_V(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WIN1V: \t \n\t\t\t\tGPU_setWIN1_V(SubScreen.gpu,val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WININ: \t \n\t\t\t\tGPU_setWININ(MainScreen.gpu, val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPA_WINOUT: \t \n\t\t\t\tGPU_setWINOUT16(MainScreen.gpu, val) ; \t \n\t\t\t\tbreak ; \t \n\n\t\t/*\tcase REG_DISPB_BG0HOFS:\n\t\t\t\tGPU_setBGxHOFS(0, SubScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BG0VOFS:\n\t\t\t\tGPU_setBGxVOFS(0, SubScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BG1HOFS:\n\t\t\t\tGPU_setBGxHOFS(1, SubScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BG1VOFS:\n\t\t\t\tGPU_setBGxVOFS(1, SubScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BG2HOFS:\n\t\t\t\tGPU_setBGxHOFS(2, SubScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BG2VOFS:\n\t\t\t\tGPU_setBGxVOFS(2, SubScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BG3HOFS:\n\t\t\t\tGPU_setBGxHOFS(3, SubScreen.gpu, val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_BG3VOFS:\n\t\t\t\tGPU_setBGxVOFS(3, SubScreen.gpu, val);\n\t\t\t\tbreak;*/\n\n\t\t\tcase REG_DISPB_WININ: \t \n\t\t\t\tGPU_setWININ(SubScreen.gpu, val) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_WINOUT: \t \n\t\t\t\tGPU_setWINOUT16(SubScreen.gpu, val) ; \t \n\t\t\t\tbreak ;\n\n\t\t\tcase REG_DISPB_MASTERBRIGHT:\n\t\t\t\tGPU_setMasterBrightness (SubScreen.gpu, val);\n\t\t\t\tbreak;\n\n            case REG_POWCNT1:\n\t\t\t\twritereg_POWCNT1(16,adr,val);\n\t\t\t\treturn;\n\n\t\t\tcase REG_EXMEMCNT:\n\t\t\t{\n\t\t\t\tu16 remote_proc = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204, (val & 0xFF80) | (remote_proc & 0x7F));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase REG_AUXSPICNT:\n\t\t\t\twrite_auxspicnt(9,16,0,val);\n\t\t\t\treturn;\n\n\t\t\tcase REG_AUXSPIDATA:\n\t\t\t\tif(val!=0)\n\t\t\t\t   MMU.AUX_SPI_CMD = val & 0xFF;\n\n\t\t\t\t//T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, bm_transfer(&MMU.bupmem, val));\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM9));\n\t\t\t\tMMU.AUX_SPI_CNT &= ~0x80; //remove busy flag\n\t\t\t\treturn;\n\n\t\t\tcase REG_DISPA_BG0CNT :\n\t\t\t\t//GPULOG(\"MAIN BG0 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(MainScreen.gpu, 0, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x8, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_BG1CNT :\n\t\t\t\t//GPULOG(\"MAIN BG1 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(MainScreen.gpu, 1, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xA, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_BG2CNT :\n\t\t\t\t//GPULOG(\"MAIN BG2 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(MainScreen.gpu, 2, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xC, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_BG3CNT :\n\t\t\t\t//GPULOG(\"MAIN BG3 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(MainScreen.gpu, 3, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xE, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG0CNT :\n\t\t\t\t//GPULOG(\"SUB BG0 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(SubScreen.gpu, 0, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1008, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG1CNT :\n\t\t\t\t//GPULOG(\"SUB BG1 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(SubScreen.gpu, 1, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100A, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG2CNT :\n\t\t\t\t//GPULOG(\"SUB BG2 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(SubScreen.gpu, 2, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100C, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG3CNT :\n\t\t\t\t//GPULOG(\"SUB BG3 SETPROP 16B %08X\\r\\n\", val);\n\t\t\t\tGPU_setBGProp(SubScreen.gpu, 3, val);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x100E, val);\n\t\t\t\treturn;\n\n\t\t\tcase REG_VRAMCNTA:\n\t\t\tcase REG_VRAMCNTC:\n\t\t\tcase REG_VRAMCNTE:\n\t\t\tcase REG_VRAMCNTG:\n\t\t\tcase REG_VRAMCNTH:\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF);\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA+1, val >> 8);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_IME:\n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IME[ARMCPU_ARM9] = val & 0x01;\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x208, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IE :\n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IE[ARMCPU_ARM9] = (MMU.reg_IE[ARMCPU_ARM9]&0xFFFF0000) | val;\n\t\t\t\treturn;\n\t\t\tcase REG_IE + 2 :\n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IE[ARMCPU_ARM9] = (MMU.reg_IE[ARMCPU_ARM9]&0xFFFF) | (((u32)val)<<16);\n\t\t\t\treturn;\n\t\t\tcase REG_IF: REG_IF_WriteWord<ARMCPU_ARM9>(0,val); return;\n\t\t\tcase REG_IF+2: REG_IF_WriteWord<ARMCPU_ARM9>(2,val); return;\n\n            case REG_IPCSYNC:\n\t\t\t\tMMU_IPCSync(ARMCPU_ARM9, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IPCFIFOCNT:\n\t\t\t\tIPC_FIFOcnt(ARMCPU_ARM9, val);\n\t\t\t\treturn;\n\n            case REG_TM0CNTL :\n            case REG_TM1CNTL :\n            case REG_TM2CNTL :\n            case REG_TM3CNTL :\n\t\t\t\tMMU.timerReload[ARMCPU_ARM9][(adr>>2)&3] = val;\n\t\t\t\treturn;\n\t\t\tcase REG_TM0CNTH :\n\t\t\tcase REG_TM1CNTH :\n\t\t\tcase REG_TM2CNTH :\n\t\t\tcase REG_TM3CNTH :\n\t\t\t{\n\t\t\t\tint timerIndex\t= ((adr-2)>>2)&0x3;\n\t\t\t\twrite_timer(ARMCPU_ARM9, timerIndex, val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase REG_DISPA_DISPCNT :\n\t\t\t\t{\n\t\t\t\t\tu32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0) & 0xFFFF0000) | val;\n\t\t\t\t\tGPU_setVideoProp(MainScreen.gpu, v);\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, v);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\tcase REG_DISPA_DISPCNT+2 : \n\t\t\t\t{\n\t\t\t\t\tu32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0) & 0xFFFF) | ((u32) val << 16);\n\t\t\t\t\tGPU_setVideoProp(MainScreen.gpu, v);\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, v);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_DISPCAPCNT :\n\t\t\t\t{\n\t\t\t\t\tu32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64) & 0xFFFF0000) | val; \n\t\t\t\t\tGPU_set_DISPCAPCNT(v);\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64, v);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\tcase REG_DISPA_DISPCAPCNT + 2:\n\t\t\t\t{\n\t\t\t\t\tu32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64) & 0xFFFF) | ((u32)val << 16); \n\t\t\t\t\tGPU_set_DISPCAPCNT(v);\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x64, v);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\tcase REG_DISPB_DISPCNT :\n\t\t\t\t{\n\t\t\t\t\tu32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000) & 0xFFFF0000) | val;\n\t\t\t\t\tGPU_setVideoProp(SubScreen.gpu, v);\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, v);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\tcase REG_DISPB_DISPCNT+2 : \n\t\t\t\t{\n\t\t\t\t\t//emu_halt();\n\t\t\t\t\tu32 v = (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000) & 0xFFFF) | ((u32) val << 16);\n\t\t\t\t\tGPU_setVideoProp(SubScreen.gpu, v);\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, v);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\tcase REG_DISPA_DISPMMEMFIFO:\n\t\t\t{\n\t\t\t\tDISP_FIFOsend(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase REG_GCROMCTRL :\n\t\t\t\tMMU_writeToGCControl<ARMCPU_ARM9>( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF0000) | val);\n\t\t\t\treturn;\n\t\t\tcase REG_GCROMCTRL+2 :\n\t\t\t\tMMU_writeToGCControl<ARMCPU_ARM9>( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16));\n\t\t\t\treturn;\n\t\t}\n\n\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val); \n\t\treturn;\n\t}\n\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);\n\tif(unmapped) return;\n\n//#ifdef HAVE_JIT\n//\tif (JITLUT_MAPPED(adr, ARMCPU_ARM9))\n//\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM9, 0) = 0;\n//#endif\n\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash]\n\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val);\n} \n\n//================================================= MMU ARM9 write 32\nvoid FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)\n{\n\tadr &= 0x0FFFFFFC;\n\t\n\tmmu_log_debug_ARM9(adr, \"(write32) 0x%08X\", val);\n\n\tif(adr<0x02000000)\n\t{\n#ifdef HAVE_JIT\n\t\tJITLUT_HANDLE_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 0) = 0;\n\t\tJITLUT_HANDLE_KNOWNBANK(adr, ARM9_ITCM, 0x7FFF, 1) = 0;\n#endif\n\t\tT1WriteLong(MMU.ARM9_ITCM, adr & 0x7FFF, val);\n\t\treturn ;\n\t}\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\t\tif(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)\n\t\t{} //prohibited\n\t\telse addon.write32(ARMCPU_ARM9, adr, val);\n\t\treturn;\n\t}\n\n#if 0\n\tif ((adr & 0xFF800000) == 0x04800000) {\n\t\t// access to non regular hw registers\n\t\t// return to not overwrite valid data\n\t\treturn ;\n\t}\n#endif\n\n\tif((adr>>24)==4)\n\t{\n\t\t// TODO: add pal reg\n\t\tif (nds.power1.gpuMain == 0)\n\t\t\tif ((adr >= 0x04000008) && (adr<=0x0400005F)) return;\n\t\tif (nds.power1.gpuSub == 0)\n\t\t\tif ((adr >= 0x04001008) && (adr<=0x0400105F)) return;\n\t\tif (nds.power1.gfx3d_geometry == 0)\n\t\t\tif ((adr >= 0x04000400) && (adr<=0x040006FF)) return;\n\t\tif (nds.power1.gfx3d_render == 0)\n\t\t\tif ((adr >= 0x04000320) && (adr<=0x040003FF)) return;\n\n\t\t// MightyMax: no need to do several ifs, when only one can happen\n\t\t// switch/case instead\n\t\t// both comparison >=,< per if can be replaced by one bit comparison since\n\t\t// they are 2^4 aligned and 2^4n wide\n\t\t// this looks ugly but should reduce load on register writes, they are done as \n\t\t// lookups by the compiler\n\t\tswitch (adr >> 4)\n\t\t{\n\t\t\tcase 0x400033:\t\t//edge color table\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val;\n\t\t\t\treturn;\n\n\t\t\tcase 0x400038:\n\t\t\tcase 0x400039:\n\t\t\tcase 0x40003A:\n\t\t\tcase 0x40003B:\t\t//toon table\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val;\n\t\t\t\tgfx3d_UpdateToonTable((adr & 0x3F) >> 1, val);\n\t\t\t\treturn;\n\n\t\t\tcase 0x400040:\n\t\t\tcase 0x400041:\n\t\t\tcase 0x400042:\n\t\t\tcase 0x400043:\t\t// FIFO Commands\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val;\n\t\t\t\tgfx3d_sendCommandToFIFO(val);\n\t\t\t\treturn;\n\t\t\t\t\n\t\t\tcase 0x400044:\n\t\t\tcase 0x400045:\n\t\t\tcase 0x400046:\n\t\t\tcase 0x400047:\n\t\t\tcase 0x400048:\n\t\t\tcase 0x400049:\n\t\t\tcase 0x40004A:\n\t\t\tcase 0x40004B:\n\t\t\tcase 0x40004C:\n\t\t\tcase 0x40004D:\n\t\t\tcase 0x40004E:\n\t\t\tcase 0x40004F:\n\t\t\tcase 0x400050:\n\t\t\tcase 0x400051:\n\t\t\tcase 0x400052:\n\t\t\tcase 0x400053:\n\t\t\tcase 0x400054:\n\t\t\tcase 0x400055:\n\t\t\tcase 0x400056:\n\t\t\tcase 0x400057:\n\t\t\tcase 0x400058:\n\t\t\tcase 0x400059:\n\t\t\tcase 0x40005A:\n\t\t\tcase 0x40005B:\n\t\t\tcase 0x40005C:\t\t// Individual Commands\n\t\t\t\tif (gxFIFO.size > 254)\n\t\t\t\t\tnds.freezeBus |= 1;\n\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val;\n\t\t\t\tgfx3d_sendCommand(adr, val);\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(MMU_new.is_dma(adr)) { \n\t\t\tMMU_new.write_dma(ARMCPU_ARM9,32,adr,val);\n\t\t\treturn;\n\t\t}\n\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_SQRTCNT: MMU_new.sqrt.write16((u16)val); return;\n\t\t\tcase REG_DIVCNT: MMU_new.div.write16((u16)val); return;\n\n\t\t\tcase REG_POWCNT1: writereg_POWCNT1(32,adr,val); break;\n\n\t\t\t//fog table: only write bottom 7 bits\n\t\t\tcase eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0C:\n\t\t\tcase eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1C:\n\t\t\t\tval &= 0x7F7F7F7F;\n\t\t\t\tbreak;\n\n\n\t\t\t//ensata handshaking port?\n\t\t\tcase 0x04FFF010:\n\t\t\t\tif(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_ack && val == 0x13579bdf)\n\t\t\t\t\tnds.ensataHandshake = ENSATA_HANDSHAKE_confirm;\n\t\t\t\tif(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_confirm && val == 0xfdb97531)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"ENSATA HANDSHAKE COMPLETE\\n\");\n\t\t\t\t\tnds.ensataHandshake = ENSATA_HANDSHAKE_complete;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t//todo - these are usually write only regs (these and 1000 more)\n\t\t\t//shouldnt we block them from getting written? ugh\n\t\t\tcase eng_3D_CLIPMTX_RESULT:\n\t\t\t\tif(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_none && val==0x2468ace0)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"ENSATA HANDSHAKE BEGIN\\n\");\n\t\t\t\t\tnds.ensataHandshake = ENSATA_HANDSHAKE_query;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase eng_3D_GXSTAT:\n\t\t\t\tMMU_new.gxstat.write32(val);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPA_BG2XL:\n\t\t\t\tMainScreen.gpu->setAffineStart(2,0,val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_BG2YL:\n\t\t\t\tMainScreen.gpu->setAffineStart(2,1,val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG2XL:\n\t\t\t\tSubScreen.gpu->setAffineStart(2,0,val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG2YL:\n\t\t\t\tSubScreen.gpu->setAffineStart(2,1,val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_BG3XL:\n\t\t\t\tMainScreen.gpu->setAffineStart(3,0,val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_BG3YL:\n\t\t\t\tMainScreen.gpu->setAffineStart(3,1,val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG3XL:\n\t\t\t\tSubScreen.gpu->setAffineStart(3,0,val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG3YL:\n\t\t\t\tSubScreen.gpu->setAffineStart(3,1,val);\n\t\t\t\treturn;\n\n\t\t\t// Alpha test reference value - Parameters:1\n\t\t\tcase eng_3D_ALPHA_TEST_REF:\n\t\t\t{\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x340>>2] = val;\n\t\t\t\tgfx3d_glAlphaFunc(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase eng_3D_CLEAR_COLOR:\n\t\t\t\tT1WriteLong((u8*)&gfx3d.state.clearColor,0,val); \n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t// Clear background depth setup - Parameters:2\n\t\t\tcase eng_3D_CLEAR_DEPTH:\n\t\t\t{\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x354>>2] = val;\n\t\t\t\tgfx3d_glClearDepth(val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Fog Color - Parameters:4b\n\t\t\tcase 0x04000358:\n\t\t\t{\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x358>>2] = val;\n\t\t\t\tgfx3d_glFogColor(val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 0x0400035C:\n\t\t\t{\n\t\t\t\t((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x35C>>2] = val;\n\t\t\t\tgfx3d_glFogOffset(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//case REG_DISPA_BG0HOFS:\n\t\t\t//\tGPU_setBGxHOFS(0, MainScreen.gpu, val&0xFFFF);\n\t\t\t//\tGPU_setBGxVOFS(0, MainScreen.gpu, (val>>16));\n\t\t\t//\tbreak;\n\n\t\t\tcase REG_DISPA_WININ: \t \n\t\t\t{\n\t\t\t\tGPU_setWININ(MainScreen.gpu, val & 0xFFFF) ; \t \n\t\t\t\tGPU_setWINOUT16(MainScreen.gpu, (val >> 16) & 0xFFFF) ; \t \n\t            break;\n\t\t\t}\n\t\t\tcase REG_DISPB_WININ:\n\t\t\t{\n\t\t\t\tGPU_setWININ(SubScreen.gpu, val & 0xFFFF) ; \t \n\t\t\t\tGPU_setWINOUT16(SubScreen.gpu, (val >> 16) & 0xFFFF) ; \t \n\t            break;\n\t\t\t}\n\n\t\t\tcase REG_DISPA_WIN0H:\n\t\t\t{\n\t\t\t\tGPU_setWIN0_H(MainScreen.gpu, val&0xFFFF);\n\t\t\t\tGPU_setWIN1_H(MainScreen.gpu, val>>16);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase REG_DISPA_WIN0V:\n\t\t\t{\n\t\t\t\tGPU_setWIN0_V(MainScreen.gpu, val&0xFFFF);\n\t\t\t\tGPU_setWIN1_V(MainScreen.gpu, val>>16);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase REG_DISPB_WIN0H:\n\t\t\t{\n\t\t\t\tGPU_setWIN0_H(SubScreen.gpu, val&0xFFFF);\n\t\t\t\tGPU_setWIN1_H(SubScreen.gpu, val>>16);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase REG_DISPB_WIN0V:\n\t\t\t{\n\t\t\t\tGPU_setWIN0_V(SubScreen.gpu, val&0xFFFF);\n\t\t\t\tGPU_setWIN1_V(SubScreen.gpu, val>>16);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase REG_DISPA_MASTERBRIGHT:\n\t\t\t\tGPU_setMasterBrightness(MainScreen.gpu, val & 0xFFFF);\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPB_MASTERBRIGHT:\n\t\t\t\tGPU_setMasterBrightness(SubScreen.gpu, val & 0xFFFF);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPA_BLDCNT:\n\t\t\t{\n\t\t\t\tGPU_setBLDCNT   (MainScreen.gpu,val&0xffff);\n\t\t\t\tMainScreen.gpu->setBLDALPHA(val>>16);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase REG_DISPB_BLDCNT:\n\t\t\t{\n\t\t\t\tGPU_setBLDCNT   (SubScreen.gpu,val&0xffff);\n\t\t\t\tSubScreen.gpu->setBLDALPHA(val>>16);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase REG_DISPA_BLDY:\n\t\t\t\tGPU_setBLDY_EVY(MainScreen.gpu,val&0xFFFF) ; \t \n\t\t\t\tbreak ; \t \n\t\t\tcase REG_DISPB_BLDY: \t \n\t\t\t\tGPU_setBLDY_EVY(SubScreen.gpu,val&0xFFFF);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPA_DISPCNT :\n\t\t\t\tGPU_setVideoProp(MainScreen.gpu, val);\n\t\t\t\t//GPULOG(\"MAIN INIT 32B %08X\\r\\n\", val);\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0, val);\n\t\t\t\treturn;\n\t\t\t\t\n\t\t\tcase REG_DISPB_DISPCNT : \n\t\t\t\tGPU_setVideoProp(SubScreen.gpu, val);\n\t\t\t\t//GPULOG(\"SUB INIT 32B %08X\\r\\n\", val);\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1000, val);\n\t\t\t\treturn;\n\n\t\t\tcase REG_VRAMCNTA:\n\t\t\tcase REG_VRAMCNTE:\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF);\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA+1, (val >> 8) & 0xFF);\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA+2, (val >> 16) & 0xFF);\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA+3, (val >> 24) & 0xFF);\n\t\t\t\tbreak;\n\t\t\tcase REG_VRAMCNTH:\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA, val & 0xFF);\n\t\t\t\tMMU_VRAMmapControl(adr-REG_VRAMCNTA+1, (val >> 8) & 0xFF);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_IME : \n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IME[ARMCPU_ARM9] = val & 0x01;\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x208, val);\n\t\t\t\treturn;\n\t\t\t\t\n\t\t\tcase REG_IE :\n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IE[ARMCPU_ARM9] = val;\n\t\t\t\treturn;\n\t\t\t\n\t\t\tcase REG_IF: REG_IF_WriteLong<ARMCPU_ARM9>(val); return;\n\n            case REG_TM0CNTL:\n            case REG_TM1CNTL:\n            case REG_TM2CNTL:\n            case REG_TM3CNTL:\n\t\t\t{\n\t\t\t\tint timerIndex = (adr>>2)&0x3;\n\t\t\t\tMMU.timerReload[ARMCPU_ARM9][timerIndex] = (u16)val;\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & 0xFFF, val);\n\t\t\t\twrite_timer(ARMCPU_ARM9, timerIndex, val>>16);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase REG_DIVNUMER:\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x290, val);\n\t\t\t\texecdiv();\n\t\t\t\treturn;\n\t\t\tcase REG_DIVNUMER+4:\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x294, val);\n\t\t\t\texecdiv();\n\t\t\t\treturn;\n\n            case REG_DIVDENOM :\n\t\t\t\t{\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298, val);\n\t\t\t\t\texecdiv();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\tcase REG_DIVDENOM+4 :\n\t\t\t\t{\n\t\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x29C, val);\n\t\t\t\t\texecdiv();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\tcase REG_SQRTPARAM :\n\t\t\t{\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B8, val);\n\t\t\t\texecsqrt();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase REG_SQRTPARAM+4 :\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2BC, val);\n\t\t\t\texecsqrt();\n\t\t\t\treturn;\n\t\t\t\n\t\t\tcase REG_IPCSYNC:\n\t\t\t\tMMU_IPCSync(ARMCPU_ARM9, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IPCFIFOCNT:\n\t\t\t\tIPC_FIFOcnt(ARMCPU_ARM9, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IPCFIFOSEND:\n\t\t\t\tIPC_FIFOsend(ARMCPU_ARM9, val);\n\t\t\t\treturn;\n\n           \n\t\t\tcase REG_GCROMCTRL :\n\t\t\t\tMMU_writeToGCControl<ARMCPU_ARM9>(val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_DISPCAPCNT :\n\t\t\t\t//INFO(\"MMU write32: REG_DISPA_DISPCAPCNT 0x%X\\n\", val);\n\t\t\t\tGPU_set_DISPCAPCNT(val);\n\t\t\t\tT1WriteLong(MMU.ARM9_REG, 0x64, val);\n\t\t\t\treturn;\n\t\t\t\t\n\t\t\tcase REG_DISPA_BG0CNT :\n\t\t\t\tGPU_setBGProp(MainScreen.gpu, 0, (val&0xFFFF));\n\t\t\t\tGPU_setBGProp(MainScreen.gpu, 1, (val>>16));\n\t\t\t\t//if((val>>16)==0x400) emu_halt();\n\t\t\t\tT1WriteLong(MMU.ARM9_REG, 8, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_BG2CNT :\n\t\t\t\t\tGPU_setBGProp(MainScreen.gpu, 2, (val&0xFFFF));\n\t\t\t\t\tGPU_setBGProp(MainScreen.gpu, 3, (val>>16));\n\t\t\t\t\tT1WriteLong(MMU.ARM9_REG, 0xC, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG0CNT :\n\t\t\t\t\tGPU_setBGProp(SubScreen.gpu, 0, (val&0xFFFF));\n\t\t\t\t\tGPU_setBGProp(SubScreen.gpu, 1, (val>>16));\n\t\t\t\t\tT1WriteLong(MMU.ARM9_REG, 0x1008, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPB_BG2CNT :\n\t\t\t\t\tGPU_setBGProp(SubScreen.gpu, 2, (val&0xFFFF));\n\t\t\t\t\tGPU_setBGProp(SubScreen.gpu, 3, (val>>16));\n\t\t\t\t\tT1WriteLong(MMU.ARM9_REG, 0x100C, val);\n\t\t\t\treturn;\n\t\t\tcase REG_DISPA_DISPMMEMFIFO:\n\t\t\t{\n\t\t\t\tDISP_FIFOsend(val);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase REG_DISPA_DISP3DCNT: writereg_DISP3DCNT(32,adr,val); return;\n\n\t\t\tcase REG_GCDATAIN:\n\t\t\t\tslot1_device.write32(ARMCPU_ARM9, REG_GCDATAIN,val);\n\t\t\t\treturn;\n\t\t}\n\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val);\n\t\treturn;\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);\n\tif(unmapped) return;\n\n//#ifdef HAVE_JIT\n//\tif (JITLUT_MAPPED(adr, ARMCPU_ARM9))\n//\t{\n//\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM9, 0) = 0;\n//\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM9, 1) = 0;\n//\t}\n//#endif\n\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash]\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val);\n}\n\n//================================================= MMU ARM9 read 08\nu8 FASTCALL _MMU_ARM9_read08(u32 adr)\n{\n\tadr &= 0x0FFFFFFF;\n\t\n\tmmu_log_debug_ARM9(adr, \"(read08) 0x%02X\", MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]);\n\n\tif(adr<0x02000000)\n\t\treturn T1ReadByte(MMU.ARM9_ITCM, adr&0x7FFF);\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\t\tif(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)\n\t\t\treturn 0; //prohibited\n\t\telse return addon.read08(ARMCPU_ARM9, adr);\n\t}\n\n\tif (adr >> 24 == 4)\n\t{\t//Address is an IO register\n\t\tif(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,8,adr);\n\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_IF: return MMU.gen_IF<ARMCPU_ARM9>();\n\t\t\tcase REG_IF+1: return (MMU.gen_IF<ARMCPU_ARM9>()>>8);\n\t\t\tcase REG_IF+2: return (MMU.gen_IF<ARMCPU_ARM9>()>>16);\n\t\t\tcase REG_IF+3: return (MMU.gen_IF<ARMCPU_ARM9>()>>24);\n\n\t\t\tcase REG_WRAMCNT:\n\t\t\t\treturn MMU.WRAMCNT;\n\n\t\t\tcase REG_DISPA_DISPSTAT:\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPA_DISPSTAT+1:\n\t\t\t\tbreak;\n\t\t\tcase REG_DISPx_VCOUNT: return nds.VCount & 0xFF;\n\t\t\tcase REG_DISPx_VCOUNT+1: return (nds.VCount>>8) & 0xFF;\n\n\t\t\tcase REG_SQRTCNT: return (MMU_new.sqrt.read16() & 0xFF);\n\t\t\tcase REG_SQRTCNT+1: return ((MMU_new.sqrt.read16()>>8) & 0xFF);\n\t\t\t\t\n\t\t\t//sqrtcnt isnt big enough for these to exist. but they'd probably return 0 so its ok\n\t\t\tcase REG_SQRTCNT+2: printf(\"ERROR 8bit SQRTCNT+2 READ\\n\"); return 0;\n\t\t\tcase REG_SQRTCNT+3: printf(\"ERROR 8bit SQRTCNT+3 READ\\n\"); return 0;\n\n\t\t\t//Nostalgia's options menu requires that these work\n\t\t\tcase REG_DIVCNT: return (MMU_new.div.read16() & 0xFF);\n\t\t\tcase REG_DIVCNT+1: return ((MMU_new.div.read16()>>8) & 0xFF);\n\n\t\t\t//divcnt isnt big enough for these to exist. but they'd probably return 0 so its ok\n\t\t\tcase REG_DIVCNT+2: printf(\"ERROR 8bit DIVCNT+2 READ\\n\"); return 0;\n\t\t\tcase REG_DIVCNT+3: printf(\"ERROR 8bit DIVCNT+3 READ\\n\"); return 0;\n\n\t\t\t//fog table: write only\n\t\t\tcase eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x01: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x03: \n\t\t\tcase eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x05: case eng_3D_FOG_TABLE+0x06: case eng_3D_FOG_TABLE+0x07: \n\t\t\tcase eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x09: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0B: \n\t\t\tcase eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0D: case eng_3D_FOG_TABLE+0x0E: case eng_3D_FOG_TABLE+0x0F: \n\t\t\tcase eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x11: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x13: \n\t\t\tcase eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x15: case eng_3D_FOG_TABLE+0x16: case eng_3D_FOG_TABLE+0x17: \n\t\t\tcase eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x19: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1B: \n\t\t\tcase eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1D: case eng_3D_FOG_TABLE+0x1E: case eng_3D_FOG_TABLE+0x1F: \n\t\t\t\treturn 0;\n\n\t\t\tcase REG_POWCNT1: \n\t\t\tcase REG_POWCNT1+1: \n\t\t\tcase REG_POWCNT1+2: \n\t\t\tcase REG_POWCNT1+3:\n\t\t\t\treturn readreg_POWCNT1(8,adr);\n\n\t\t\tcase eng_3D_GXSTAT:\n\t\t\t\treturn MMU_new.gxstat.read(8,adr);\n\n\t\t\tcase REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(8,adr);\n\t\t\tcase REG_DISPA_DISP3DCNT+1: return readreg_DISP3DCNT(8,adr);\n\t\t\tcase REG_DISPA_DISP3DCNT+2: return readreg_DISP3DCNT(8,adr);\n\t\t\tcase REG_DISPA_DISP3DCNT+3: return readreg_DISP3DCNT(8,adr);\n\n\t\t\tcase REG_KEYINPUT:\n\t\t\t\tLagFrameFlag=0;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tbool unmapped, restricted;\t\n\tadr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);\n\tif(unmapped) return 0;\n\n\treturn MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]];\n}\n\n//================================================= MMU ARM9 read 16\nu16 FASTCALL _MMU_ARM9_read16(u32 adr)\n{    \n\tadr &= 0x0FFFFFFE;\n\n\tmmu_log_debug_ARM9(adr, \"(read16) 0x%04X\", T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]));\n\n\tif(adr<0x02000000)\n\t\treturn T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, adr & 0x7FFE);\t\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\t\tif(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)\n\t\t\treturn 0; //prohibited\n\t\telse return addon.read16(ARMCPU_ARM9, adr);\n\t}\n\n\tif (adr >> 24 == 4)\n\t{\n\t\tif(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,16,adr); \n\n\t\t// Address is an IO register\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_DISPA_DISPSTAT:\n\t\t\t\tbreak;\n\n\t\t\tcase REG_SQRTCNT: return MMU_new.sqrt.read16();\n\t\t\t//sqrtcnt isnt big enough for this to exist. but it'd probably return 0 so its ok\n\t\t\tcase REG_SQRTCNT+2: printf(\"ERROR 16bit SQRTCNT+2 READ\\n\"); return 0;\n\n\t\t\tcase REG_DIVCNT: return MMU_new.div.read16();\n\t\t\t//divcnt isnt big enough for this to exist. but it'd probably return 0 so its ok\n\t\t\tcase REG_DIVCNT+2: printf(\"ERROR 16bit DIVCNT+2 READ\\n\"); return 0;\n\n\t\t\tcase eng_3D_GXSTAT: return MMU_new.gxstat.read(16,adr);\n\n\t\t\tcase REG_DISPA_VCOUNT:\n\t\t\t\tif(nds.ensataEmulation && nds.ensataHandshake == ENSATA_HANDSHAKE_query)\n\t\t\t\t{\n\t\t\t\t\tnds.ensataHandshake = ENSATA_HANDSHAKE_ack;\n\t\t\t\t\treturn 270;\n\t\t\t\t} \n\t\t\t\telse \n\t\t\t\t\treturn nds.VCount;\n\n\t\t\t// ============================================= 3D\n\t\t\tcase eng_3D_RAM_COUNT:\n\t\t\t\treturn 0;\n\t\t\t\t//almost worthless for now\n\t\t\t\t//return (gfx3d_GetNumPolys());\n\t\t\tcase eng_3D_RAM_COUNT+2:\n\t\t\t\treturn 0;\n\t\t\t\t//almost worthless for now\n\t\t\t\t//return (gfx3d_GetNumVertex());\n\t\t\t// ============================================= 3D end\n\t\t\tcase REG_IME :\n\t\t\t\treturn (u16)MMU.reg_IME[ARMCPU_ARM9];\n\n\t\t\t//WRAMCNT is readable but VRAMCNT is not, so just return WRAM's value\n\t\t\tcase REG_VRAMCNTG:\n\t\t\t\treturn MMU.WRAMCNT << 8;\n\t\t\t\t\n\t\t\tcase REG_IE :\n\t\t\t\treturn (u16)MMU.reg_IE[ARMCPU_ARM9];\n\t\t\tcase REG_IE + 2 :\n\t\t\t\treturn (u16)(MMU.reg_IE[ARMCPU_ARM9]>>16);\n\t\t\t\t\n\t\t\tcase REG_IF: return MMU.gen_IF<ARMCPU_ARM9>();\n\t\t\tcase REG_IF+2: return MMU.gen_IF<ARMCPU_ARM9>()>>16;\n\n\t\t\tcase REG_TM0CNTL :\n\t\t\tcase REG_TM1CNTL :\n\t\t\tcase REG_TM2CNTL :\n\t\t\tcase REG_TM3CNTL :\n\t\t\t\treturn read_timer(ARMCPU_ARM9,(adr&0xF)>>2);\n\n\t\t\tcase REG_AUXSPICNT:\n\t\t\t\treturn MMU.AUX_SPI_CNT;\n\n            case REG_POWCNT1: \n\t\t\tcase REG_POWCNT1+2:\n\t\t\t\treturn readreg_POWCNT1(16,adr);\n\n\t\t\tcase REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(16,adr);\n\t\t\tcase REG_DISPA_DISP3DCNT+2: return readreg_DISP3DCNT(16,adr);\n\n\t\t\tcase REG_KEYINPUT:\n\t\t\t\tLagFrameFlag=0;\n\t\t\t\tbreak;\n\n\t\t\t//fog table: write only\n\t\t\tcase eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x02: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x06:\n\t\t\tcase eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0A: case eng_3D_FOG_TABLE+0x0C: case eng_3D_FOG_TABLE+0x0E:\n\t\t\tcase eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x16:\n\t\t\tcase eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1E:\n\t\t\t\treturn 0;\n\t\t}\n\n\t\treturn  T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM9>(adr,unmapped, restricted);\n\tif(unmapped) return 0;\n\t\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF\n\treturn T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]); \n}\n\n//================================================= MMU ARM9 read 32\nu32 FASTCALL _MMU_ARM9_read32(u32 adr)\n{\n\tadr &= 0x0FFFFFFC;\n\n\tmmu_log_debug_ARM9(adr, \"(read32) 0x%08X\", T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]));\n\n\tif(adr<0x02000000) \n\t\treturn T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, adr&0x7FFC);\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\t\tif(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7)\n\t\t\treturn 0; //prohibited\n\t\telse return addon.read32(ARMCPU_ARM9, adr);\n\t}\n\n\t// Address is an IO register\n\tif((adr >> 24) == 4)\n\t{\n\t\tif(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,32,adr); \n\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_DSIMODE:\n\t\t\t\tif(!nds.Is_DSI()) break;\n\t\t\t\treturn 1;\n\t\t\tcase 0x04004008:\n\t\t\t\tif(!nds.Is_DSI()) break;\n\t\t\t\treturn 0x8000;\n\n\t\t\tcase REG_DISPA_DISPSTAT:\n\t\t\t\tbreak;\n\n\t\t\tcase REG_DISPx_VCOUNT:\n\t\t\t\treturn nds.VCount;\n\n\t\t\t//WRAMCNT is readable but VRAMCNT is not, so just return WRAM's value\n\t\t\tcase REG_VRAMCNTE:\n\t\t\t\treturn MMU.WRAMCNT << 24;\n\n\t\t\t//despite these being 16bit regs,\n\t\t\t//Dolphin Island Underwater Adventures uses this amidst seemingly reasonable divs so we're going to emulate it.\n\t\t\t//well, it's pretty reasonable to read them as 32bits though, isnt it?\n\t\t\tcase REG_DIVCNT: return MMU_new.div.read16();\n\t\t\tcase REG_SQRTCNT: return MMU_new.sqrt.read16(); //I guess we'll do this also\n\n\t\t\t//fog table: write only\n\t\t\tcase eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0C:\n\t\t\tcase eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1C:\n\t\t\t\treturn 0;\n\n\t\t\tcase eng_3D_CLIPMTX_RESULT:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+4:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+8:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+12:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+16:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+20:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+24:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+28:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+32:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+36:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+40:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+44:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+48:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+52:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+56:\n\t\t\tcase eng_3D_CLIPMTX_RESULT+60:\n\t\t\t{\n\t\t\t\t//LOG(\"4000640h..67Fh - CLIPMTX_RESULT - Read Current Clip Coordinates Matrix (R)\");\n\t\t\t\treturn gfx3d_GetClipMatrix ((adr-0x04000640)/4);\n\t\t\t}\n\t\t\tcase eng_3D_VECMTX_RESULT:\n\t\t\tcase eng_3D_VECMTX_RESULT+4:\n\t\t\tcase eng_3D_VECMTX_RESULT+8:\n\t\t\tcase eng_3D_VECMTX_RESULT+12:\n\t\t\tcase eng_3D_VECMTX_RESULT+16:\n\t\t\tcase eng_3D_VECMTX_RESULT+20:\n\t\t\tcase eng_3D_VECMTX_RESULT+24:\n\t\t\tcase eng_3D_VECMTX_RESULT+28:\n\t\t\tcase eng_3D_VECMTX_RESULT+32:\n\t\t\t{\n\t\t\t\t//LOG(\"4000680h..6A3h - VECMTX_RESULT - Read Current Directional Vector Matrix (R)\");\n\t\t\t\treturn gfx3d_GetDirectionalMatrix ((adr-0x04000680)/4);\n\t\t\t}\n\n\t\t\tcase eng_3D_RAM_COUNT:\n\t\t\t{\n\t\t\t\treturn (gfx3d_GetNumPolys()) | ((gfx3d_GetNumVertex()) << 16);\n\t\t\t\t//LOG (\"read32 - RAM_COUNT -> 0x%X\", ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF]))[(adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF])>>2]);\n\t\t\t}\n\n\t\t\tcase eng_3D_POS_RESULT:\n\t\t\tcase eng_3D_POS_RESULT+4:\n\t\t\tcase eng_3D_POS_RESULT+8:\n\t\t\tcase eng_3D_POS_RESULT+12:\n\t\t\t{\n\t\t\t\treturn gfx3d_glGetPosRes((adr & 0xF) >> 2);\n\t\t\t}\n\t\t\tcase eng_3D_GXSTAT:\n\t\t\t\treturn MMU_new.gxstat.read(32,adr);\n\t\t\t//\t======================================== 3D end\n\n\t\t\t\n\t\t\tcase REG_IME :\n\t\t\t\treturn MMU.reg_IME[ARMCPU_ARM9];\n\t\t\tcase REG_IE :\n\t\t\t\treturn MMU.reg_IE[ARMCPU_ARM9];\n\t\t\t\n\t\t\tcase REG_IF: return MMU.gen_IF<ARMCPU_ARM9>();\n\n\t\t\tcase REG_IPCFIFORECV :\n\t\t\t\treturn IPC_FIFOrecv(ARMCPU_ARM9);\n\t\t\tcase REG_TM0CNTL :\n\t\t\tcase REG_TM1CNTL :\n\t\t\tcase REG_TM2CNTL :\n\t\t\tcase REG_TM3CNTL :\n\t\t\t\t{\n\t\t\t\t\tu32 val = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], (adr + 2) & 0xFFF);\n\t\t\t\t\treturn MMU.timer[ARMCPU_ARM9][(adr&0xF)>>2] | (val<<16);\n\t\t\t\t}\t\n     \n\t\t\tcase REG_GCDATAIN: return MMU_readFromGC<ARMCPU_ARM9>();\n      case REG_POWCNT1: return readreg_POWCNT1(32,adr);\n\t\t\tcase REG_DISPA_DISP3DCNT: return readreg_DISP3DCNT(32,adr);\n\n\t\t\tcase REG_KEYINPUT:\n\t\t\t\tLagFrameFlag=0;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);\n\t}\n\t\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM9>(adr,unmapped, restricted);\n\tif(unmapped) return 0;\n\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [zeromus, inspired by shash]\n\treturn T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);\n}\n//================================================================================================== ARM7 *\n//=========================================================================================================\n//=========================================================================================================\n//================================================= MMU ARM7 write 08\nvoid FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)\n{\n\tadr &= 0x0FFFFFFF;\n\n\tmmu_log_debug_ARM7(adr, \"(write08) 0x%02X\", val);\n\n\tif (adr < 0x02000000) return; //can't write to bios or entire area below main memory\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204);\n\t\tif(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7))\n\t\t{} //prohibited\n\t\telse addon.write08(ARMCPU_ARM7,adr, val);\n\t\treturn;\n\t}\n\n\tif ((adr>=0x04000400)&&(adr<0x04000520)) \n\t{\n\t\tSPU_WriteByte(adr, val);\n\t\treturn;\n    }\n\n\tif ((adr & 0xFFFF0000) == 0x04800000)\n\t{\n\t\t/* is wifi hardware, dont intermix with regular hardware registers */\n\t\t// 8-bit writes to wifi I/O and RAM are ignored\n\t\t// Reference: http://nocash.emubase.de/gbatek.htm#dswifiiomap\n\t\treturn;\n\t}\n\n\tif (adr >> 24 == 4)\n\t{\n\t\tif(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,8,adr,val); return; }\n\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_IF: REG_IF_WriteByte<ARMCPU_ARM7>(0,val); break;\n\t\t\tcase REG_IF+1: REG_IF_WriteByte<ARMCPU_ARM7>(1,val); break;\n\t\t\tcase REG_IF+2: REG_IF_WriteByte<ARMCPU_ARM7>(2,val); break;\n\t\t\tcase REG_IF+3: REG_IF_WriteByte<ARMCPU_ARM7>(3,val); break;\n\n\t\t\tcase REG_POSTFLG:\n\t\t\t\t//The NDS7 register can be written to only from code executed in BIOS.\n\t\t\t\tif (NDS_ARM7.instruct_adr > 0x3FFF) return;\n\t\t\t\t\n\t\t\t\t// hack for patched firmwares\n\t\t\t\tif (val == 1)\n\t\t\t\t{\n\t\t\t\t\tif (_MMU_ARM7_read08(REG_POSTFLG) != 0)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t_MMU_write32<ARMCPU_ARM9>(0x27FFE24, gameInfo.header.ARM9exe);\n\t\t\t\t\t_MMU_write32<ARMCPU_ARM7>(0x27FFE34, gameInfo.header.ARM7exe);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase REG_HALTCNT:\n\t\t\t\t//printf(\"halt 0x%02X\\n\", val);\n\t\t\t\tswitch(val)\n\t\t\t\t{\n\t\t\t\t\tcase 0xC0: NDS_Sleep(); break;\n\t\t\t\t\tcase 0x80: armcpu_Wait4IRQ(&NDS_ARM7); break;\n\t\t\t\t\tdefault: break;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase REG_RTC:\n\t\t\t\trtcWrite(val);\n\t\t\t\treturn;\n\n\t\t\tcase REG_AUXSPICNT:\n\t\t\t\twrite_auxspicnt(9,8,0,val);\n\t\t\t\treturn;\n\t\t\tcase REG_AUXSPICNT+1:\n\t\t\t\twrite_auxspicnt(9,8,1,val);\n\t\t\t\treturn;\n\t\t\tcase REG_AUXSPIDATA:\n\t\t\t\tif(val!=0) MMU.AUX_SPI_CMD = val & 0xFF;\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM7));\n\t\t\t\tMMU.AUX_SPI_CNT &= ~0x80; //remove busy flag\n\t\t\t\treturn;\n\n\t\t\tcase REG_SPIDATA:\n\t\t\t\t// CrazyMax: 27 May 2013: BIOS write 8bit commands to flash controller\n\t\t\t\t// (write firmware header into RAM at 0x027FF830)\n\t\t\t\tMMU_writeToSPIData(val);\n\t\t\t\treturn;\n\t\t}\n\t\tMMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val;\n\t\treturn;\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);\n\tif(unmapped) return;\n\n#ifdef HAVE_JIT\n\tif (JITLUT_MAPPED(adr, ARMCPU_ARM7))\n\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM7, 0) = 0;\n#endif\n\t\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash]\n\tMMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val;\n}\n\n//================================================= MMU ARM7 write 16\nvoid FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)\n{\n\tadr &= 0x0FFFFFFE;\n\n\tmmu_log_debug_ARM7(adr, \"(write16) 0x%04X\", val);\n\n\tif (adr < 0x02000000) return; //can't write to bios or entire area below main memory\n\t\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204);\n\t\tif(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7))\n\t\t{} //prohibited\n\t\telse addon.write16(ARMCPU_ARM7,adr, val);\n\t\treturn;\n\t}\n\n\t//wifi mac access\n\tif ((adr & 0xFFFF0000) == 0x04800000)\n\t{\n\t\tWIFI_write16(adr,val);\n\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x48], adr&MMU.MMU_MASK[ARMCPU_ARM7][0x48], val);\n\t\treturn;\n\t}\n\n\tif ((adr>=0x04000400)&&(adr<0x04000520))\n\t{\n\t\tSPU_WriteWord(adr, val);\n\t\treturn;\n\t}\n\n\tif((adr >> 24) == 4)\n\t{\n\t\tif(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,16,adr,val); return; }\n\n\t\t//Address is an IO register\n\t\tswitch(adr)\n\t\t{\n\t\tcase REG_DISPA_VCOUNT:\n\t\t\tif (nds.VCount >= 202 && nds.VCount <= 212)\n\t\t\t{\n\t\t\t\tprintf(\"VCOUNT set to %i (previous value %i)\\n\", val, nds.VCount);\n\t\t\t\tnds.VCount = val;\n\t\t\t}\n\t\t\telse\n\t\t\t\tprintf(\"Attempt to set VCOUNT while not within 202-212 (%i), ignored\\n\", nds.VCount);\n\t\t\treturn;\n\n\t\t\tcase REG_RTC:\n\t\t\t\trtcWrite(val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_EXMEMCNT:\n\t\t\t{\n\t\t\t\tu16 remote_proc = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204, (val & 0x7F) | (remote_proc & 0xFF80));\n\t\t\t}\n\t\t\treturn;\n\n\t\t\tcase REG_EXTKEYIN: //readonly\n\t\t\t\treturn;\n\n\t\t\t\n\t\t\tcase REG_POWCNT2:\n\t\t\t\t{\n\t\t\t\t\tnds.power2.speakers = BIT0(val);\n\t\t\t\t\tnds.power2.wifi = BIT0(val);\n\t\t\t\t}\n\t\t\t\treturn;\n\n\n\t\t\tcase REG_AUXSPICNT:\n\t\t\t\twrite_auxspicnt(7,16,0,val);\n\t\t\treturn;\n\n\t\t\tcase REG_AUXSPIDATA:\n\t\t\t\tif(val!=0)\n\t\t\t\t   MMU.AUX_SPI_CMD = val & 0xFF;\n\n\t\t\t\t//T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, bm_transfer(&MMU.bupmem, val));\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_AUXSPIDATA >> 20) & 0xff], REG_AUXSPIDATA & 0xfff, MMU_new.backupDevice.data_command((u8)val,ARMCPU_ARM7));\n\t\t\t\tMMU.AUX_SPI_CNT &= ~0x80; //remove busy flag\n\t\t\treturn;\n\n\t\t\tcase REG_SPICNT :\n\t\t\t\t{\n\t\t\t\t\tint reset_firmware = 1;\n\n\t\t\t\t\tif ( ((MMU.SPI_CNT >> 8) & 0x3) == 1) \n\t\t\t\t\t{\n\t\t\t\t\t\tif ( ((val >> 8) & 0x3) == 1) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( BIT11(MMU.SPI_CNT)) \n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// select held\n\t\t\t\t\t\t\t\treset_firmware = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//MMU.fw.com == 0; // reset fw device communication\n\t\t\t\t\tif ( reset_firmware) \n\t\t\t\t\t{\n\t\t\t\t\t  // reset fw device communication\n\t\t\t\t\t  fw_reset_com(&MMU.fw);\n\t\t\t\t\t}\n\t\t\t\t\tMMU.SPI_CNT = val;\n\t\t\t\t\n\t\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPICNT >> 20) & 0xff], REG_SPICNT & 0xfff, val);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t\t\n\t\t\tcase REG_SPIDATA :\n\t\t\t\tMMU_writeToSPIData(val);\n\t\t\t\t\t\treturn;\n\n\t\t\t\t/* NOTICE: Perhaps we have to use gbatek-like reg names instead of libnds-like ones ...*/\n\t\t\t\t\n\t\t\tcase REG_IME : \n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IME[ARMCPU_ARM7] = val & 0x01;\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x208, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IE :\n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IE[ARMCPU_ARM7] = (MMU.reg_IE[ARMCPU_ARM7]&0xFFFF0000) | val;\n\t\t\t\treturn;\n\t\t\tcase REG_IE + 2 :\n\t\t\t\tNDS_Reschedule();\n\t\t\t\t//emu_halt();\n\t\t\t\tMMU.reg_IE[ARMCPU_ARM7] = (MMU.reg_IE[ARMCPU_ARM7]&0xFFFF) | (((u32)val)<<16);\n\t\t\t\treturn;\n\t\t\t\t\n\t\t\tcase REG_IF: REG_IF_WriteWord<ARMCPU_ARM7>(0,val); return;\n\t\t\tcase REG_IF+2: REG_IF_WriteWord<ARMCPU_ARM7>(2,val); return;\n\t\t\t\t\n            case REG_IPCSYNC:\n\t\t\t\tMMU_IPCSync(ARMCPU_ARM7, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IPCFIFOCNT:\n\t\t\t\tIPC_FIFOcnt(ARMCPU_ARM7, val);\n\t\t\t\treturn;\n\n            case REG_TM0CNTL :\n            case REG_TM1CNTL :\n            case REG_TM2CNTL :\n            case REG_TM3CNTL :\n\t\t\t\tMMU.timerReload[ARMCPU_ARM7][(adr>>2)&3] = val;\n\t\t\t\treturn;\n\t\t\tcase REG_TM0CNTH :\n\t\t\tcase REG_TM1CNTH :\n\t\t\tcase REG_TM2CNTH :\n\t\t\tcase REG_TM3CNTH :\n\t\t\t{\n\t\t\t\tint timerIndex\t= ((adr-2)>>2)&0x3;\n\t\t\t\twrite_timer(ARMCPU_ARM7, timerIndex, val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tcase REG_GCROMCTRL :\n\t\t\t\tMMU_writeToGCControl<ARMCPU_ARM7>( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF0000) | val);\n\t\t\t\treturn;\n\t\t\tcase REG_GCROMCTRL+2 :\n\t\t\t\tMMU_writeToGCControl<ARMCPU_ARM7>( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16));\n\t\t\t\treturn;\n\t\t}\n\n\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val); \n\t\treturn;\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);\n\tif(unmapped) return;\n\n#ifdef HAVE_JIT\n\tif (JITLUT_MAPPED(adr, ARMCPU_ARM7))\n\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM7, 0) = 0;\n#endif\n\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash]\n\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val);\n} \n//================================================= MMU ARM7 write 32\nvoid FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)\n{\n\tadr &= 0x0FFFFFFC;\n\n\tmmu_log_debug_ARM7(adr, \"(write32) 0x%08X\", val);\n\n\tif (adr < 0x02000000) return; //can't write to bios or entire area below main memory\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204);\n\t\tif(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7))\n\t\t{} //prohibited\n\t\telse addon.write32(ARMCPU_ARM7,adr, val);\n\t\treturn;\n\t}\n\n\tif ((adr & 0xFFFF0000) == 0x04800000)\n\t{\n\t\tWIFI_write16(adr, val & 0xFFFF);\n\t\tWIFI_write16(adr+2, val >> 16);\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x48], adr&MMU.MMU_MASK[ARMCPU_ARM7][0x48], val);\n\t\treturn;\n\t}\n\n\tif ((adr>=0x04000400)&&(adr<0x04000520))\n\t{\n\t\tSPU_WriteLong(adr, val);\n\t\treturn;\n\t}\n\n\tif((adr>>24)==4)\n\t{\n\t\tif(MMU_new.is_dma(adr)) { MMU_new.write_dma(ARMCPU_ARM7,32,adr,val); return; }\n\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_RTC:\n\t\t\t\trtcWrite((u16)val);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_IME : \n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IME[ARMCPU_ARM7] = val & 0x01;\n\t\t\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x208, val);\n\t\t\t\treturn;\n\t\t\t\t\n\t\t\tcase REG_IE :\n\t\t\t\tNDS_Reschedule();\n\t\t\t\tMMU.reg_IE[ARMCPU_ARM7] = val;\n\t\t\t\treturn;\n\t\t\t\n\t\t\tcase REG_IF: REG_IF_WriteLong<ARMCPU_ARM7>(val); return;\n\n            case REG_TM0CNTL:\n            case REG_TM1CNTL:\n            case REG_TM2CNTL:\n            case REG_TM3CNTL:\n\t\t\t{\n\t\t\t\tint timerIndex = (adr>>2)&0x3;\n\t\t\t\tMMU.timerReload[ARMCPU_ARM7][timerIndex] = (u16)val;\n\t\t\t\tT1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr & 0xFFF, val);\n\t\t\t\twrite_timer(ARMCPU_ARM7, timerIndex, val>>16);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tcase REG_IPCSYNC:\n\t\t\t\tMMU_IPCSync(ARMCPU_ARM7, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IPCFIFOCNT:\n\t\t\t\tIPC_FIFOcnt(ARMCPU_ARM7, val);\n\t\t\t\treturn;\n\t\t\tcase REG_IPCFIFOSEND:\n\t\t\t\tIPC_FIFOsend(ARMCPU_ARM7, val);\n\t\t\t\treturn;\n\t\t\t\n\t\t\tcase REG_GCROMCTRL :\n\t\t\t\tMMU_writeToGCControl<ARMCPU_ARM7>(val);\n\t\t\t\treturn;\n\n\t\t\tcase REG_GCDATAIN:\n\t\t\t\tslot1_device.write32(ARMCPU_ARM7, REG_GCDATAIN,val);\n\t\t\t\treturn;\n\t\t}\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val);\n\t\treturn;\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);\n\tif(unmapped) return;\n\n#ifdef HAVE_JIT\n\tif (JITLUT_MAPPED(adr, ARMCPU_ARM7))\n\t{\n\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM7, 0) = 0;\n\t\tJITLUT_HANDLE_PREMASKED(adr, ARMCPU_ARM7, 1) = 0;\n\t}\n#endif\n\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [shash]\n\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val);\n}\n\n//================================================= MMU ARM7 read 08\nu8 FASTCALL _MMU_ARM7_read08(u32 adr)\n{\n\tadr &= 0x0FFFFFFF;\n\n\tmmu_log_debug_ARM7(adr, \"(read08) 0x%02X\", MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]]);\n\n\tif (adr < 0x4000)\n\t{\n\t\t//u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);\n\t\t//if (prot) INFO(\"MMU7 read 08 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\\n\", adr, NDS_ARM7.R[15], prot);\n\t\t\n\t\t//How accurate is this? our R[15] may not be exactly what the hardware uses (may use something less by up to 0x08)\n\t\t//This may be inaccurate at the very edge cases.\n\t\tif (NDS_ARM7.instruct_adr > 0x3FFF)\n\t\t\treturn 0xFF;\n\t}\n\n\t// wifi mac access \n\tif ((adr & 0xFFFF0000) == 0x04800000)\n\t{\n\t\tif (adr & 1)\n\t\t\treturn (WIFI_read16(adr-1) >> 8) & 0xFF;\n\t\telse\n\t\t\treturn WIFI_read16(adr) & 0xFF;\n\t}\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204);\n\t\tif(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7))\n\t\t\treturn 0; //prohibited\n\t\telse return addon.read08(ARMCPU_ARM7,adr);\n\t}\n\n\tif ((adr>=0x04000400)&&(adr<0x04000520))\n\t{\n\t\treturn SPU_ReadByte(adr);\n\t}\n\n\tif (adr == REG_RTC) return (u8)rtcRead();\n\n\tif (adr >> 24 == 4)\n\t{\n\t\tif(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,8,adr); \n\n\t\t// Address is an IO register\n\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_IF: return MMU.gen_IF<ARMCPU_ARM7>();\n\t\t\tcase REG_IF+1: return (MMU.gen_IF<ARMCPU_ARM7>()>>8);\n\t\t\tcase REG_IF+2: return (MMU.gen_IF<ARMCPU_ARM7>()>>16);\n\t\t\tcase REG_IF+3: return (MMU.gen_IF<ARMCPU_ARM7>()>>24);\n\n\t\t\tcase REG_DISPx_VCOUNT: return nds.VCount&0xFF;\n\t\t\tcase REG_DISPx_VCOUNT+1: return (nds.VCount>>8)&0xFF;\n\n\t\t\tcase REG_WRAMSTAT: return MMU.WRAMCNT;\n\t\t}\n\n\t\treturn MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]];\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);\n\tif(unmapped) return 0;\n\n\treturn MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]];\n}\n//================================================= MMU ARM7 read 16\nu16 FASTCALL _MMU_ARM7_read16(u32 adr)\n{\n\tadr &= 0x0FFFFFFE;\n\n\tmmu_log_debug_ARM7(adr, \"(read16) 0x%04X\", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]));\n\n\tif (adr < 0x4000)\n\t{\n\t\t//u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);\n\t\t//if (prot) INFO(\"MMU7 read 16 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\\n\", adr, NDS_ARM7.R[15], prot);\n\t\tif (NDS_ARM7.instruct_adr > 0x3FFF)\n\t\t\treturn 0xFFFF;\n\t}\n\n\t//wifi mac access\n\tif ((adr & 0xFFFF0000) == 0x04800000)\n\t\treturn WIFI_read16(adr) ;\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204);\n\t\tif(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7))\n\t\t\treturn 0; //prohibited\n\t\telse return addon.read16(ARMCPU_ARM7,adr);\n\t}\n\n    if ((adr>=0x04000400)&&(adr<0x04000520))\n    {\n        return SPU_ReadWord(adr);\n    }\n\n\tif(adr>>24==4)\n\t{\t//Address is an IO register\n\n\t\tif(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,16,adr); \n\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_POWCNT2:\n\t\t\t{\n\t\t\t\tu16 ret = 0;\n\t\t\t\tret |= nds.power2.speakers?BIT(0):0;\n\t\t\t\tret |= nds.power2.wifi?BIT(1):0;\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase REG_DISPx_VCOUNT: return nds.VCount;\n\t\t\tcase REG_RTC: return rtcRead();\n\t\t\tcase REG_IME: return (u16)MMU.reg_IME[ARMCPU_ARM7];\n\t\t\t\t\n\t\t\tcase REG_IE:\n\t\t\t\treturn (u16)MMU.reg_IE[ARMCPU_ARM7];\n\t\t\tcase REG_IE + 2:\n\t\t\t\treturn (u16)(MMU.reg_IE[ARMCPU_ARM7]>>16);\n\t\t\t\t\n\t\t\tcase REG_IF: return MMU.gen_IF<ARMCPU_ARM7>();\n\t\t\tcase REG_IF+2: return MMU.gen_IF<ARMCPU_ARM7>()>>16;\n\n\t\t\tcase REG_TM0CNTL :\n\t\t\tcase REG_TM1CNTL :\n\t\t\tcase REG_TM2CNTL :\n\t\t\tcase REG_TM3CNTL :\n\t\t\t\treturn read_timer(ARMCPU_ARM7,(adr&0xF)>>2);\n\n\t\t\tcase REG_VRAMSTAT:\n\t\t\t\t//make sure WRAMSTAT is stashed and then fallthrough to return the value from memory. i know, gross.\n\t\t\t\tT1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, MMU.WRAMCNT);\n\t\t\t\tbreak;\n\n\t\t\tcase REG_AUXSPICNT:\n\t\t\t\treturn MMU.AUX_SPI_CNT;\n\n\t\t\tcase REG_KEYINPUT:\n\t\t\t\t//here is an example of what not to do:\n\t\t\t\t//since the arm7 polls this (and EXTKEYIN) every frame, we shouldnt count this as an input check\n\t\t\t\t//LagFrameFlag=0;\n\t\t\t\tbreak;\n\n\t\t\tcase REG_EXTKEYIN:\n\t\t\t\t{\n\t\t\t\t\t//this is gross. we should generate this whole reg instead of poking it in ndssystem\n\t\t\t\t\tu16 ret = MMU.ARM7_REG[0x136];\n\t\t\t\t\tif(nds.isTouch) \n\t\t\t\t\t\tret &= ~64;\n\t\t\t\t\telse ret |= 64;\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\t\t}\n\t\treturn T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]); \n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);\n\tif(unmapped) return 0;\n\n\t/* Returns data from memory */\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF\n\treturn T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]); \n}\n//================================================= MMU ARM7 read 32\nu32 FASTCALL _MMU_ARM7_read32(u32 adr)\n{\n\tadr &= 0x0FFFFFFC;\n\n\tmmu_log_debug_ARM7(adr, \"(read32) 0x%08X\", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]));\n\n\tif (adr < 0x4000)\n\t{\n\t\t//u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);\n\t\t//if (prot) INFO(\"MMU7 read 32 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\\n\", adr, NDS_ARM7.R[15], prot);\n\t\tif (NDS_ARM7.instruct_adr > 0x3FFF)\n\t\t\treturn 0xFFFFFFFF;\n\t}\n\n\t//wifi mac access\n\tif ((adr & 0xFFFF0000) == 0x04800000)\n\t\treturn (WIFI_read16(adr) | (WIFI_read16(adr+2) << 16));\n\n\tif ( (adr >= 0x08000000) && (adr < 0x0A010000) )\n\t{\n\t\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204);\n\t\tif(!(exmemcnt & EXMEMCNT_MASK_SLOT2_ARM7))\n\t\t\treturn 0; //prohibited\n\t\telse return addon.read32(ARMCPU_ARM7,adr);\n\t}\n\n    if ((adr>=0x04000400)&&(adr<0x04000520))\n    {\n        return SPU_ReadLong(adr);\n    }\n\n\tif((adr >> 24) == 4)\n\t{\t//Address is an IO register\n\t\t\n\t\tif(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,32,adr); \n\t\t\n\t\tswitch(adr)\n\t\t{\n\t\t\tcase REG_RTC: return (u32)rtcRead();\n\t\t\tcase REG_DISPx_VCOUNT: return nds.VCount;\n\n\t\t\tcase REG_IME : \n\t\t\t\treturn MMU.reg_IME[ARMCPU_ARM7];\n\t\t\tcase REG_IE :\n\t\t\t\treturn MMU.reg_IE[ARMCPU_ARM7];\n\t\t\tcase REG_IF: return MMU.gen_IF<ARMCPU_ARM7>();\n\t\t\tcase REG_IPCFIFORECV :\n\t\t\t\treturn IPC_FIFOrecv(ARMCPU_ARM7);\n\t\t\tcase REG_TM0CNTL :\n\t\t\tcase REG_TM1CNTL :\n\t\t\tcase REG_TM2CNTL :\n\t\t\tcase REG_TM3CNTL :\n\t\t\t{\n\t\t\t\tu32 val = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], (adr + 2) & 0xFFF);\n\t\t\t\treturn MMU.timer[ARMCPU_ARM7][(adr&0xF)>>2] | (val<<16);\n\t\t\t}\t\n\t\t\tcase REG_GCROMCTRL:\n\t\t\t{\n\t\t\t\t//INFO(\"arm7 romctrl read\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase REG_GCDATAIN:\n\t\t\t\treturn MMU_readFromGC<ARMCPU_ARM7>();\n\n\t\t\tcase REG_VRAMSTAT:\n\t\t\t\t//make sure WRAMSTAT is stashed and then fallthrough return the value from memory. i know, gross.\n\t\t\t\tT1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, MMU.WRAMCNT);\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]);\n\t}\n\n\tbool unmapped, restricted;\n\tadr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);\n\tif(unmapped) return 0;\n\n\t//Returns data from memory\n\t// Removed the &0xFF as they are implicit with the adr&0x0FFFFFFF [zeromus, inspired by shash]\n\treturn T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]);\n}\n\n//=========================================================================================================\n\nu32 FASTCALL MMU_read32(u32 proc, u32 adr) \n{\n\tASSERT_UNALIGNED((adr&3)==0);\n\n\tif(proc==0) \n\t\treturn _MMU_ARM9_read32(adr);\n\telse\n\t\treturn _MMU_ARM7_read32(adr);\n}\n\nu16 FASTCALL MMU_read16(u32 proc, u32 adr) \n{\n\tASSERT_UNALIGNED((adr&1)==0);\n\n\tif(proc==0)\n\t\treturn _MMU_ARM9_read16(adr);\n\telse \n\t\treturn _MMU_ARM7_read16(adr);\n}\n\nu8 FASTCALL MMU_read8(u32 proc, u32 adr) \n{\n\tif(proc==0) \n\t\treturn _MMU_ARM9_read08(adr);\n\telse \n\t\treturn _MMU_ARM7_read08(adr);\n}\n\nvoid FASTCALL MMU_write32(u32 proc, u32 adr, u32 val)\n{\n\tASSERT_UNALIGNED((adr&3)==0);\n\n\tif(proc==0)\n\t\t_MMU_ARM9_write32(adr, val);\n\telse\n\t\t_MMU_ARM7_write32(adr,val);\n}\n\nvoid FASTCALL MMU_write16(u32 proc, u32 adr, u16 val)\n{\n\tASSERT_UNALIGNED((adr&1)==0);\n\n\tif(proc==0)\n\t\t_MMU_ARM9_write16(adr, val);\n\telse \n\t\t_MMU_ARM7_write16(adr,val);\n}\n\nvoid FASTCALL MMU_write8(u32 proc, u32 adr, u8 val)\n{\n\tif(proc==0) \n\t\t_MMU_ARM9_write08(adr, val);\n\telse\n\t\t_MMU_ARM7_write08(adr,val);\n}\n\nvoid FASTCALL MMU_DumpMemBlock(u8 proc, u32 address, u32 size, u8 *buffer)\n{\n\tu32 i;\n\tu32 curaddr;\n\n\tfor(i = 0, curaddr = address; i < size; i++, curaddr++)\n\t{\n\t\tbuffer[i] = _MMU_read08(proc,MMU_AT_DEBUG,curaddr);\n\t}\n}\n\n\n//these templates needed to be instantiated manually\ntemplate u32 MMU_struct::gen_IF<ARMCPU_ARM9>();\ntemplate u32 MMU_struct::gen_IF<ARMCPU_ARM7>();\n\n////////////////////////////////////////////////////////////\n//function pointer handlers for gdb stub stuff\n\nstatic u16 FASTCALL arm9_prefetch16( void *data, u32 adr) {\n\treturn _MMU_read16<ARMCPU_ARM9,MMU_AT_CODE>(adr);\n}\n\nstatic u32 FASTCALL arm9_prefetch32( void *data, u32 adr) {\n\treturn _MMU_read32<ARMCPU_ARM9,MMU_AT_CODE>(adr);\n}\n\nstatic u8 FASTCALL arm9_read8( void *data, u32 adr) {\n\treturn _MMU_read08<ARMCPU_ARM9>(adr);\n}\n\nstatic u16 FASTCALL arm9_read16( void *data, u32 adr) {\n\treturn _MMU_read16<ARMCPU_ARM9>(adr);\n}\n\nstatic u32 FASTCALL arm9_read32( void *data, u32 adr) {\n\treturn _MMU_read32<ARMCPU_ARM9>(adr);\n}\n\nstatic void FASTCALL arm9_write8(void *data, u32 adr, u8 val) {\n\t_MMU_write08<ARMCPU_ARM9>(adr, val);\n}\n\nstatic void FASTCALL arm9_write16(void *data, u32 adr, u16 val) {\n\t_MMU_write16<ARMCPU_ARM9>(adr, val);\n}\n\nstatic void FASTCALL arm9_write32(void *data, u32 adr, u32 val) {\n\t_MMU_write32<ARMCPU_ARM9>(adr, val);\n}\n\nstatic u16 FASTCALL arm7_prefetch16( void *data, u32 adr) {\n  return _MMU_read16<ARMCPU_ARM7,MMU_AT_CODE>(adr);\n}\n\nstatic u32 FASTCALL arm7_prefetch32( void *data, u32 adr) {\n  return _MMU_read32<ARMCPU_ARM7,MMU_AT_CODE>(adr);\n}\n\nstatic u8 FASTCALL arm7_read8( void *data, u32 adr) {\n  return _MMU_read08<ARMCPU_ARM7>(adr);\n}\n\nstatic u16 FASTCALL arm7_read16( void *data, u32 adr) {\n  return _MMU_read16<ARMCPU_ARM7>(adr);\n}\n\nstatic u32 FASTCALL arm7_read32( void *data, u32 adr) {\n  return _MMU_read32<ARMCPU_ARM7>(adr);\n}\n\nstatic void FASTCALL arm7_write8(void *data, u32 adr, u8 val) {\n  _MMU_write08<ARMCPU_ARM7>(adr, val);\n}\n\nstatic void FASTCALL arm7_write16(void *data, u32 adr, u16 val) {\n  _MMU_write16<ARMCPU_ARM7>(adr, val);\n}\n\nstatic void FASTCALL arm7_write32(void *data, u32 adr, u32 val) {\n  _MMU_write32<ARMCPU_ARM7>(adr, val);\n}\n\n\n\n/*\n * the base memory interfaces\n */\nstruct armcpu_memory_iface arm9_base_memory_iface = {\n  arm9_prefetch32,\n  arm9_prefetch16,\n\n  arm9_read8,\n  arm9_read16,\n  arm9_read32,\n\n  arm9_write8,\n  arm9_write16,\n  arm9_write32\n};\n\nstruct armcpu_memory_iface arm7_base_memory_iface = {\n  arm7_prefetch32,\n  arm7_prefetch16,\n\n  arm7_read8,\n  arm7_read16,\n  arm7_read32,\n\n  arm7_write8,\n  arm7_write16,\n  arm7_write32\n};\n\n/*\n * The direct memory interface for the ARM9.\n * This avoids the ARM9 protection unit when accessing\n * memory.\n */\nstruct armcpu_memory_iface arm9_direct_memory_iface = {\n  NULL,\n  NULL,\n\n  arm9_read8,\n  arm9_read16,\n  arm9_read32,\n\n  arm9_write8,\n  arm9_write16,\n  arm9_write32\n};\n\n\n/////////////////////////////////////////////////////////////////\n/////////////////////////////////////////////////////////////////\n/////////////////////////////////////////////////////////////////\n/////////////////////////////////////////////////////////////////\n/////////////////////////////////////////////////////////////////\n/////////////////////////////////////////////////////////////////\n\n//#ifdef PROFILE_MEMORY_ACCESS\n//\n//#define PROFILE_PREFETCH 0\n//#define PROFILE_READ 1\n//#define PROFILE_WRITE 2\n//\n//struct mem_access_profile {\n//  u64 num_accesses;\n//  u32 address_mask;\n//  u32 masked_value;\n//};\n//\n//#define PROFILE_NUM_MEM_ACCESS_PROFILES 4\n//\n//static u64 profile_num_accesses[2][3];\n//static u64 profile_unknown_addresses[2][3];\n//static struct mem_access_profile\n//profile_memory_accesses[2][3][PROFILE_NUM_MEM_ACCESS_PROFILES];\n//\n//static void\n//setup_profiling( void) {\n//  int i;\n//\n//  for ( i = 0; i < 2; i++) {\n//    int access_type;\n//\n//    for ( access_type = 0; access_type < 3; access_type++) {\n//      profile_num_accesses[i][access_type] = 0;\n//      profile_unknown_addresses[i][access_type] = 0;\n//\n//      /*\n//       * Setup the access testing structures\n//       */\n//      profile_memory_accesses[i][access_type][0].address_mask = 0x0e000000;\n//      profile_memory_accesses[i][access_type][0].masked_value = 0x00000000;\n//      profile_memory_accesses[i][access_type][0].num_accesses = 0;\n//\n//      /* main memory */\n//      profile_memory_accesses[i][access_type][1].address_mask = 0x0f000000;\n//      profile_memory_accesses[i][access_type][1].masked_value = 0x02000000;\n//      profile_memory_accesses[i][access_type][1].num_accesses = 0;\n//\n//      /* shared memory */\n//      profile_memory_accesses[i][access_type][2].address_mask = 0x0f800000;\n//      profile_memory_accesses[i][access_type][2].masked_value = 0x03000000;\n//      profile_memory_accesses[i][access_type][2].num_accesses = 0;\n//\n//      /* arm7 memory */\n//      profile_memory_accesses[i][access_type][3].address_mask = 0x0f800000;\n//      profile_memory_accesses[i][access_type][3].masked_value = 0x03800000;\n//      profile_memory_accesses[i][access_type][3].num_accesses = 0;\n//    }\n//  }\n//}\n//\n//static void\n//profile_memory_access( int arm9, u32 adr, int access_type) {\n//  static int first = 1;\n//  int mem_profile;\n//  int address_found = 0;\n//\n//  if ( first) {\n//    setup_profiling();\n//    first = 0;\n//  }\n//\n//  profile_num_accesses[arm9][access_type] += 1;\n//\n//  for ( mem_profile = 0;\n//        mem_profile < PROFILE_NUM_MEM_ACCESS_PROFILES &&\n//          !address_found;\n//        mem_profile++) {\n//    if ( (adr & profile_memory_accesses[arm9][access_type][mem_profile].address_mask) ==\n//         profile_memory_accesses[arm9][access_type][mem_profile].masked_value) {\n//      /*printf( \"adr %08x mask %08x res %08x expected %08x\\n\",\n//              adr,\n//              profile_memory_accesses[arm9][access_type][mem_profile].address_mask,\n//              adr & profile_memory_accesses[arm9][access_type][mem_profile].address_mask,\n//              profile_memory_accesses[arm9][access_type][mem_profile].masked_value);*/\n//      address_found = 1;\n//      profile_memory_accesses[arm9][access_type][mem_profile].num_accesses += 1;\n//    }\n//  }\n//\n//  if ( !address_found) {\n//    profile_unknown_addresses[arm9][access_type] += 1;\n//  }\n//}\n//\n//\n//static const char *access_type_strings[] = {\n//  \"prefetch\",\n//  \"read    \",\n//  \"write   \"\n//};\n//\n//void\n//print_memory_profiling( void) {\n//  int arm;\n//\n//  printf(\"------ Memory access profile ------\\n\");\n//\n//  for ( arm = 0; arm < 2; arm++) {\n//    int access_type;\n//\n//    for ( access_type = 0; access_type < 3; access_type++) {\n//      int mem_profile;\n//      printf(\"ARM%c: num of %s %lld\\n\",\n//             arm ? '9' : '7',\n//             access_type_strings[access_type],\n//             profile_num_accesses[arm][access_type]);\n//\n//      for ( mem_profile = 0;\n//            mem_profile < PROFILE_NUM_MEM_ACCESS_PROFILES;\n//            mem_profile++) {\n//        printf( \"address %08x: %lld\\n\",\n//                profile_memory_accesses[arm][access_type][mem_profile].masked_value,\n//                profile_memory_accesses[arm][access_type][mem_profile].num_accesses);\n//      }\n//              \n//      printf( \"unknown addresses %lld\\n\",\n//              profile_unknown_addresses[arm][access_type]);\n//\n//      printf( \"\\n\");\n//    }\n//  }\n//\n//  printf(\"------ End of Memory access profile ------\\n\\n\");\n//}\n//#else\n//void\n//print_memory_profiling( void) {\n//}\n//#endif /* End of PROFILE_MEMORY_ACCESS area */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/MMU.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2007 shash\n\tCopyright (C) 2007-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef MMU_H\n#define MMU_H\n\n#include \"FIFO.h\"\n#include \"mem.h\"\n#include \"registers.h\"\n#include \"mc.h\"\n#include \"bits.h\"\n#include \"readwrite.h\"\n#include \"debug.h\"\n#include \"JitCommon.h\"\n\n#ifdef HAVE_LUA\n#include \"lua-engine.h\"\n#endif\n\n#ifdef HAVE_JIT\n#include \"arm_jit.h\"\n#endif\n\n#define ARMCPU_ARM7 1\n#define ARMCPU_ARM9 0\n#define ARMPROC (PROCNUM ? NDS_ARM7:NDS_ARM9)\n\ntypedef const u8 TWaitState;\n\n\nenum EDMAMode\n{\n\tEDMAMode_Immediate = 0,\n\tEDMAMode_VBlank = 1,\n\tEDMAMode_HBlank = 2,\n\tEDMAMode_HStart = 3,\n\tEDMAMode_MemDisplay = 4,\n\tEDMAMode_Card = 5,\n\tEDMAMode_GBASlot = 6,\n\tEDMAMode_GXFifo = 7,\n\tEDMAMode7_Wifi = 8,\n\tEDMAMode7_GBASlot = 9,\n};\n\nenum EDMABitWidth\n{\n\tEDMABitWidth_16 = 0,\n\tEDMABitWidth_32 = 1\n};\n\nenum EDMASourceUpdate\n{\n\tEDMASourceUpdate_Increment = 0,\n\tEDMASourceUpdate_Decrement = 1,\n\tEDMASourceUpdate_Fixed = 2,\n\tEDMASourceUpdate_Invalid = 3,\n};\n\nenum EDMADestinationUpdate\n{\n\tEDMADestinationUpdate_Increment = 0,\n\tEDMADestinationUpdate_Decrement = 1,\n\tEDMADestinationUpdate_Fixed = 2,\n\tEDMADestinationUpdate_IncrementReload = 3,\n};\n\n//TODO\n//n.b. this may be a bad idea, for complex registers like the dma control register.\n//we need to know exactly what part was written to, instead of assuming all 32bits were written.\nclass TRegister_32\n{\npublic:\n\tvirtual u32 read32() = 0;\n\tvirtual void write32(const u32 val) = 0;\n\tvoid write(const int size, const u32 adr, const u32 val) { \n\t\tif(size==32) write32(val);\n\t\telse {\n\t\t\tconst u32 offset = adr&3;\n\t\t\tif(size==8) {\n\t\t\t\tprintf(\"WARNING! 8BIT DMA ACCESS\\n\"); \n\t\t\t\tu32 mask = 0xFF<<(offset<<3);\n\t\t\t\twrite32((read32()&~mask)|(val<<(offset<<3)));\n\t\t\t}\n\t\t\telse if(size==16) {\n\t\t\t\tu32 mask = 0xFFFF<<(offset<<3);\n\t\t\t\twrite32((read32()&~mask)|(val<<(offset<<3)));\n\t\t\t}\n\t\t}\n\t}\n\n\tu32 read(const int size, const u32 adr)\n\t{\n\t\tif(size==32) return read32();\n\t\telse {\n\t\t\tconst u32 offset = adr&3;\n\t\t\tif(size==8) { printf(\"WARNING! 8BIT DMA ACCESS\\n\"); return (read32()>>(offset<<3))&0xFF; }\n\t\t\telse return (read32()>>(offset<<3))&0xFFFF;\n\t\t}\n\t}\n};\n\nstruct TGXSTAT : public TRegister_32\n{\n\tTGXSTAT() {\n\t\tgxfifo_irq = se = tr = tb = sb = 0;\n\t\tfifo_empty = true;\n\t\tfifo_low = false;\n\t}\n\tu8 tb; //test busy\n\tu8 tr; //test result\n\tu8 se; //stack error\n\tu8 sb; //stack busy\n\tu8 gxfifo_irq; //irq configuration\n\n\tbool fifo_empty, fifo_low;\n\n\tvirtual u32 read32();\n\tvirtual void write32(const u32 val);\n\n\tvoid savestate(EMUFILE *f);\n\tbool loadstate(EMUFILE *f);\n};\n\ntemplate<EDMAMode mode> void triggerDma();\n\nclass DivController\n{\npublic:\n\tDivController()\n\t\t: mode(0), busy(0)\n\t{}\n\tvoid exec();\n\tu8 mode, busy, div0;\n\tu16 read16() { return mode|(busy<<15)|(div0<<14); }\n\tvoid write16(u16 val) { \n\t\tmode = val&3;\n\t\t//todo - do we clear the div0 flag here or is that strictly done by the divider unit?\n\t}\n\tvoid savestate(EMUFILE* os)\n\t{\n\t\twrite8le(&mode,os);\n\t\twrite8le(&busy,os);\n\t\twrite8le(&div0,os);\n\t}\n\tbool loadstate(EMUFILE* is, int version)\n\t{\n\t\tint ret = 1;\n\t\tret &= read8le(&mode,is);\n\t\tret &= read8le(&busy,is);\n\t\tret &= read8le(&div0,is);\n\t\treturn ret==1;\n\t}\n};\n\nclass SqrtController\n{\npublic:\n\tSqrtController()\n\t\t: mode(0), busy(0)\n\t{}\n\tvoid exec();\n\tu8 mode, busy;\n\tu16 read16() { return mode|(busy<<15); }\n\tvoid write16(u16 val) { mode = val&1; }\n\tvoid savestate(EMUFILE* os)\n\t{\n\t\twrite8le(&mode,os);\n\t\twrite8le(&busy,os);\n\t}\n\tbool loadstate(EMUFILE* is, int version)\n\t{\n\t\tint ret=1;\n\t\tret &= read8le(&mode,is);\n\t\tret &= read8le(&busy,is);\n\t\treturn ret==1;\n\t}\n};\n\n\nclass DmaController\n{\npublic:\n\tu8 enable, irq, repeatMode, _startmode;\n\tu8 userEnable;\n\tu32 wordcount;\n\tEDMAMode startmode;\n\tEDMABitWidth bitWidth;\n\tEDMASourceUpdate sar;\n\tEDMADestinationUpdate dar;\n\tu32 saddr, daddr;\n\tu32 saddr_user, daddr_user;\n\t\n\t//indicates whether the dma needs to be checked for triggering\n\tBOOL dmaCheck;\n\n\t//indicates whether the dma right now is logically running\n\t//(though for now we copy all the data when it triggers)\n\tBOOL running;\n\n\tBOOL paused;\n\n\t//this flag will sometimes be set when a start condition is triggered\n\t//other conditions may be automatically triggered based on scanning conditions\n\tBOOL triggered;\n\n\tu64 nextEvent;\n\n\tint procnum, chan;\n\n\tvoid savestate(EMUFILE *f);\n\tbool loadstate(EMUFILE *f);\n\n\tvoid exec();\n\ttemplate<int PROCNUM> void doCopy();\n\tvoid doPause();\n\tvoid doStop();\n\tvoid doSchedule();\n\tvoid tryTrigger(EDMAMode mode);\n\n\tDmaController() :\n\t\tenable(0), irq(0), repeatMode(0), _startmode(0),\n\t\twordcount(0), startmode(EDMAMode_Immediate),\n\t\tbitWidth(EDMABitWidth_16),\n\t\tsar(EDMASourceUpdate_Increment), dar(EDMADestinationUpdate_Increment),\n\t\t//if saddr isnt cleared then rings of fate will trigger copy protection\n\t\t//by inspecting dma3 saddr when it boots\n\t\tsaddr(0), daddr(0),\n\t\tsaddr_user(0), daddr_user(0),\n\t\tdmaCheck(FALSE),\n\t\trunning(FALSE),\n\t\tpaused(FALSE),\n\t\ttriggered(FALSE),\n\t\tnextEvent(0),\n\t\tsad(&saddr_user),\n\t\tdad(&daddr_user)\n\t{\n\t\tsad.controller = this;\n\t\tdad.controller = this;\n\t\tctrl.controller = this;\n\t\tregs[0] = &sad;\n\t\tregs[1] = &dad;\n\t\tregs[2] = &ctrl;\n\t}\n\n\tclass AddressRegister : public TRegister_32 {\n\tpublic:\n\t\t//we pass in a pointer to the controller here so we can alert it if anything changes\n\t\tDmaController* controller;\n\t\tu32 * const ptr;\n\t\tAddressRegister(u32* _ptr)\n\t\t\t: ptr(_ptr)\n\t\t{}\n\t\tvirtual u32 read32() { \n\t\t\treturn *ptr;\n\t\t}\n\t\tvirtual void write32(const u32 val) {\n\t\t\t*ptr = val;\n\t\t}\n\t};\n\n\tclass ControlRegister : public TRegister_32 {\n\tpublic:\n\t\t//we pass in a pointer to the controller here so we can alert it if anything changes\n\t\tDmaController* controller;\n\t\tControlRegister() {}\n\t\tvirtual u32 read32() { \n\t\t\treturn controller->read32();\n\t\t}\n\t\tvirtual void write32(const u32 val) {\n\t\t\treturn controller->write32(val);\n\t\t}\n\t};\n\n\tAddressRegister sad, dad;\n\tControlRegister ctrl;\n\tTRegister_32* regs[3];\n\n\tvoid write32(const u32 val);\n\tu32 read32();\n\n};\n\nenum ECardMode\n{\n\tCardMode_Normal = 0,\n\tCardMode_KEY1,\n\tCardMode_KEY2,\n};\n\ntypedef struct\n{\n\t\n\tu8 command[8];\n\n\tu32 address;\n\tu32 transfer_count;\n\n\tECardMode mode;\n\n\t// NJSD stuff\n\tint blocklen;\n\t\n} nds_dscard;\n\n#define DUP2(x)  x, x\n#define DUP4(x)  x, x, x, x\n#define DUP8(x)  x, x, x, x,  x, x, x, x\n#define DUP16(x) x, x, x, x,  x, x, x, x,  x, x, x, x,  x, x, x, x\n\nstruct MMU_struct \n{\n\t//ARM9 mem\n\tCACHE_ALIGN u8 ARM9_ITCM[0x8000];\n\tCACHE_ALIGN u8 ARM9_DTCM[0x4000];\n\n\t//u8 MAIN_MEM[4*1024*1024]; //expanded from 4MB to 8MB to support debug consoles\n\t//u8 MAIN_MEM[8*1024*1024]; //expanded from 8MB to 16MB to support dsi\n\tCACHE_ALIGN u8 MAIN_MEM[16*1024*1024]; //expanded from 8MB to 16MB to support dsi\n\tu8 ARM9_REG[0x1000000]; //this variable is evil and should be removed by correctly emulating all registers.\n\tu8 ARM9_BIOS[0x8000];\n\tu8 ARM9_VMEM[0x800];\n\t\n\t#include \"PACKED.h\"\n\tstruct {\n\t\tu8 ARM9_LCD[0xA4000];\n\t\t//an extra 128KB for blank memory, directly after arm9_lcd, so that\n\t\t//we can easily map things to the end of arm9_lcd to represent \n\t\t//an unmapped state\n\t\tu8 blank_memory[0x20000];  \n\t};\n\t#include \"PACKED_END.h\"\n\n    u8 ARM9_OAM[0x800];\n\n\tu8* ExtPal[2][4];\n\tu8* ObjExtPal[2][2];\n\t\n\tstruct TextureInfo {\n\t\tu8* texPalSlot[6];\n\t\tu8* textureSlotAddr[4];\n\t} texInfo;\n\n\t//ARM7 mem\n\tu8 ARM7_BIOS[0x4000];\n\tu8 ARM7_ERAM[0x10000]; //64KB of exclusive WRAM\n\tu8 ARM7_REG[0x10000];\n\tu8 ARM7_WIRAM[0x10000]; //WIFI ram\n\n\t// VRAM mapping\n\tu8 VRAM_MAP[4][32];\n\tu32 LCD_VRAM_ADDR[10];\n\tu8 LCDCenable[10];\n\n\t//32KB of shared WRAM - can be switched between ARM7 & ARM9 in two blocks\n\tu8 SWIRAM[0x8000];\n\n\t//Card rom & ram\n\tu8 * CART_ROM;\n\n\t//Unused ram\n\tu8 UNUSED_RAM[4];\n\n\t//this is here so that we can trap glitchy emulator code\n\t//which is accessing offsets 5,6,7 of unused ram due to unaligned accesses\n\t//(also since the emulator doesn't prevent unaligned accesses)\n\tu8 MORE_UNUSED_RAM[4];\n\n\tCACHE_ALIGN static u8 * MMU_MEM[2][256];\n\tCACHE_ALIGN static u32 MMU_MASK[2][256];\n\n\tu8 ARM9_RW_MODE;\n\n\tu32 DTCMRegion;\n\tu32 ITCMRegion;\n\n\tu16 timer[2][4];\n\ts32 timerMODE[2][4];\n\tu32 timerON[2][4];\n\tu32 timerRUN[2][4];\n\tu16 timerReload[2][4];\n\n\tu32 reg_IME[2];\n\tu32 reg_IE[2];\n\t\n\t//these are the user-controlled IF bits. some IF bits are generated as necessary from hardware conditions\n\tu32 reg_IF_bits[2];\n\t//these flags are set occasionally to indicate that an irq should have entered the pipeline, and processing will be deferred a tiny bit to help emulate things\n\tu32 reg_IF_pending[2];\n\n\tu32 reg_DISP3DCNT_bits;\n\n\ttemplate<int PROCNUM> u32 gen_IF();\n\n\tBOOL divRunning;\n\ts64 divResult;\n\ts64 divMod;\n\tu64 divCycles;\n\n\tBOOL sqrtRunning;\n\tu32 sqrtResult;\n\tu64 sqrtCycles;\n\n\tu16 SPI_CNT;\n\tu16 SPI_CMD;\n\tu16 AUX_SPI_CNT;\n\tu16 AUX_SPI_CMD;\n\n\tu8 WRAMCNT;\n\n\tu64 gfx3dCycles;\n\n\tu8 powerMan_CntReg;\n\tBOOL powerMan_CntRegWritten;\n\tu8 powerMan_Reg[5];\n\n\tmemory_chip_t fw;\n\n\tnds_dscard dscard[2];\n};\n\n\n//everything in here is derived from libnds behaviours. no hardware tests yet\nclass DSI_TSC\n{\npublic:\n\tDSI_TSC();\n\tvoid reset_command();\n\tu16 write16(u16 val);\n\tbool save_state(EMUFILE* os);\n\tbool load_state(EMUFILE* is);\n\nprivate:\n\tu16 read16();\n\tu8 reg_selection;\n\tu8 read_flag;\n\ts32 state;\n\ts32 readcount;\n\n\t//registers[0] contains the current page.\n\t//we are going to go ahead and save these out in case we want to change the way this is emulated in the future..\n\t//we may want to poke registers in here at more convenient times and have the TSC dumbly pluck them out,\n\t//rather than generate the values on the fly\n\tu8 registers[0x80];\n};\n\n\n//this contains things which can't be memzeroed because they are smarter classes\nstruct MMU_struct_new\n{\n\tMMU_struct_new() ;\n\tBackupDevice backupDevice;\n\tDmaController dma[2][4];\n\tTGXSTAT gxstat;\n\tSqrtController sqrt;\n\tDivController div;\n\tDSI_TSC dsi_tsc;\n\n\tvoid write_dma(const int proc, const int size, const u32 adr, const u32 val);\n\tu32 read_dma(const int proc, const int size, const u32 adr);\n\tbool is_dma(const u32 adr) { return adr >= _REG_DMA_CONTROL_MIN && adr <= _REG_DMA_CONTROL_MAX; }\n};\n\nextern MMU_struct MMU;\nextern MMU_struct_new MMU_new;\n\n\nstruct armcpu_memory_iface {\n  /** the 32 bit instruction prefetch */\n  u32 (FASTCALL *prefetch32)( void *data, u32 adr);\n\n  /** the 16 bit instruction prefetch */\n  u16 (FASTCALL *prefetch16)( void *data, u32 adr);\n\n  /** read 8 bit data value */\n  u8 (FASTCALL *read8)( void *data, u32 adr);\n  /** read 16 bit data value */\n  u16 (FASTCALL *read16)( void *data, u32 adr);\n  /** read 32 bit data value */\n  u32 (FASTCALL *read32)( void *data, u32 adr);\n\n  /** write 8 bit data value */\n  void (FASTCALL *write8)( void *data, u32 adr, u8 val);\n  /** write 16 bit data value */\n  void (FASTCALL *write16)( void *data, u32 adr, u16 val);\n  /** write 32 bit data value */\n  void (FASTCALL *write32)( void *data, u32 adr, u32 val);\n\n  void *data;\n};\n\n\nvoid MMU_Init(void);\nvoid MMU_DeInit(void);\n\nvoid MMU_Reset( void);\n\nvoid MMU_setRom(u8 * rom, u32 mask);\nvoid MMU_unsetRom( void);\n\nvoid print_memory_profiling( void);\n\n// Memory reading/writing (old)\nu8 FASTCALL MMU_read8(u32 proc, u32 adr);\nu16 FASTCALL MMU_read16(u32 proc, u32 adr);\nu32 FASTCALL MMU_read32(u32 proc, u32 adr);\nvoid FASTCALL MMU_write8(u32 proc, u32 adr, u8 val);\nvoid FASTCALL MMU_write16(u32 proc, u32 adr, u16 val);\nvoid FASTCALL MMU_write32(u32 proc, u32 adr, u32 val);\n \n//template<int PROCNUM> void FASTCALL MMU_doDMA(u32 num);\n\n//The base ARM memory interfaces\nextern struct armcpu_memory_iface arm9_base_memory_iface;\nextern struct armcpu_memory_iface arm7_base_memory_iface;\nextern struct armcpu_memory_iface arm9_direct_memory_iface;\t\n\n#define VRAM_BANKS 9\n#define VRAM_BANK_A 0\n#define VRAM_BANK_B 1\n#define VRAM_BANK_C 2\n#define VRAM_BANK_D 3\n#define VRAM_BANK_E 4\n#define VRAM_BANK_F 5\n#define VRAM_BANK_G 6\n#define VRAM_BANK_H 7\n#define VRAM_BANK_I 8\n\n#define VRAM_PAGE_ABG 0\n#define VRAM_PAGE_BBG 128\n#define VRAM_PAGE_AOBJ 256\n#define VRAM_PAGE_BOBJ 384\n\n\nstruct VramConfiguration {\n\n\tenum Purpose {\n\t\tOFF, INVALID, ABG, BBG, AOBJ, BOBJ, LCDC, ARM7, TEX, TEXPAL, ABGEXTPAL, BBGEXTPAL, AOBJEXTPAL, BOBJEXTPAL\n\t};\n\n\tstruct BankInfo {\n\t\tPurpose purpose;\n\t\tint ofs;\n\t} banks[VRAM_BANKS];\n\t\n\tinline void clear() {\n\t\tfor(int i=0;i<VRAM_BANKS;i++) {\n\t\t\tbanks[i].ofs = 0;\n\t\t\tbanks[i].purpose = OFF;\n\t\t}\n\t}\n\n\tstd::string describePurpose(Purpose p);\n\tstd::string describe();\n};\n\nextern VramConfiguration vramConfiguration;\n\n#define VRAM_ARM9_PAGES 512\nextern u8 vram_arm9_map[VRAM_ARM9_PAGES];\nFORCEINLINE void* MMU_gpu_map(u32 vram_addr)\n{\n\t//this is supposed to map a single gpu vram address to emulator host memory\n\t//but it returns a pointer to some zero memory in case of accesses to unmapped memory.\n\t//this correctly handles the case with tile accesses to unmapped memory.\n\t//it could also potentially go through a different LUT than vram_arm9_map in case we discover\n\t//that it needs to be set up with different or no mirroring\n\t//(I think it is a reasonable possibility that only the cpu has the nutty mirroring rules)\n\t//\n\t//if this system isn't used, Fantasy Aquarium displays garbage in the first ingame screen\n\t//due to it storing 0x0F0F or somesuch in screen memory which points to a ridiculously big tile\n\t//which should contain all 0 pixels\n\n\tu32 vram_page = (vram_addr>>14)&(VRAM_ARM9_PAGES-1);\n\tu32 ofs = vram_addr & 0x3FFF;\n\tvram_page = vram_arm9_map[vram_page];\n\t//blank pages are handled by the extra 16KB of blank memory at the end of ARM9_LCD\n\t//and the fact that blank pages are mapped to appear at that location\n\treturn MMU.ARM9_LCD + (vram_page<<14) + ofs;\n}\n\nvoid FASTCALL _MMU_ARM9_write08(u32 adr, u8 val);\nvoid FASTCALL _MMU_ARM9_write16(u32 adr, u16 val);\nvoid FASTCALL _MMU_ARM9_write32(u32 adr, u32 val);\nu8  FASTCALL _MMU_ARM9_read08(u32 adr);\nu16 FASTCALL _MMU_ARM9_read16(u32 adr);\nu32 FASTCALL _MMU_ARM9_read32(u32 adr);\n\nvoid FASTCALL _MMU_ARM7_write08(u32 adr, u8 val);\nvoid FASTCALL _MMU_ARM7_write16(u32 adr, u16 val);\nvoid FASTCALL _MMU_ARM7_write32(u32 adr, u32 val);\nu8  FASTCALL _MMU_ARM7_read08(u32 adr);\nu16 FASTCALL _MMU_ARM7_read16(u32 adr);\nu32 FASTCALL _MMU_ARM7_read32(u32 adr);\n\nextern u32 partie;\n\nextern u32 _MMU_MAIN_MEM_MASK;\nextern u32 _MMU_MAIN_MEM_MASK16;\nextern u32 _MMU_MAIN_MEM_MASK32;\nvoid SetupMMU(bool debugConsole, bool dsi);\n\n#ifdef NO_MEMDEBUG\n#define CheckMemoryDebugEvent(event, type, procnum, addr, size, val)\n#else\nFORCEINLINE void CheckMemoryDebugEvent(EDEBUG_EVENT event, const MMU_ACCESS_TYPE type, const u32 procnum, const u32 addr, const u32 size, const u32 val)\n{\n\t//TODO - ugh work out a better prefetch event system\n\tif(type == MMU_AT_CODE && event == DEBUG_EVENT_READ)\n\t\tevent = DEBUG_EVENT_EXECUTE;\n\tif(CheckDebugEvent(event))\n\t{\n\t\tDebugEventData.memAccessType = type;\n\t\tDebugEventData.procnum = procnum;\n\t\tDebugEventData.addr = addr;\n\t\tDebugEventData.size = size;\n\t\tDebugEventData.val = val;\n\t\tHandleDebugEvent(event);\n\t}\n}\n#endif\n\n//ALERT!!!!!!!!!!!!!!\n//the following inline functions dont do the 0x0FFFFFFF mask.\n//this may result in some unexpected behavior\n\nFORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr)\n{\n\tCheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,8,0);\n\n\t//special handling for DMA: read 0 from TCM\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr<0x02000000) return 0; //itcm\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm\n\t}\n\n#ifdef HAVE_LUA\n\tCallRegisteredLuaMemHook(addr, 1, /*FIXME*/ 0, LUAMEMHOOK_READ);\n#endif\n\n\tif(PROCNUM==ARMCPU_ARM9)\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\t//Returns data from DTCM (ARM9 only)\n\t\t\treturn T1ReadByte(MMU.ARM9_DTCM, addr & 0x3FFF);\n\t\t}\n\n\tif ( (addr & 0x0F000000) == 0x02000000)\n\t\treturn T1ReadByte( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK);\n\n\tif(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read08(addr);\n\telse return _MMU_ARM7_read08(addr);\n}\n\nFORCEINLINE u16 _MMU_read16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) \n{\n\tCheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,16,0);\n\n\t//special handling for DMA: read 0 from TCM\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr<0x02000000) return 0; //itcm\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm\n\t}\n\n#ifdef HAVE_LUA\n\tCallRegisteredLuaMemHook(addr, 2, /*FIXME*/ 0, LUAMEMHOOK_READ);\n#endif\n\n\t//special handling for execution from arm9, since we spend so much time in there\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE)\n\t{\n\t\tif ((addr & 0x0F000000) == 0x02000000)\n\t\t\treturn T1ReadWord_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16);\n\n\t\tif(addr<0x02000000) \n\t\t\treturn T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, addr&0x7FFE);\n\n\t\tgoto dunno;\n\t}\n\n\tif(PROCNUM==ARMCPU_ARM9)\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\t//Returns data from DTCM (ARM9 only)\n\t\t\treturn T1ReadWord_guaranteedAligned(MMU.ARM9_DTCM, addr & 0x3FFE);\n\t\t}\n\n\tif ( (addr & 0x0F000000) == 0x02000000)\n\t\treturn T1ReadWord_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16);\n\ndunno:\n\tif(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read16(addr);\n\telse return _MMU_ARM7_read16(addr);\n}\n\nFORCEINLINE u32 _MMU_read32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr)\n{\n\tCheckMemoryDebugEvent(DEBUG_EVENT_READ,AT,PROCNUM,addr,32,0);\n\n\t//special handling for DMA: read 0 from TCM\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr<0x02000000) return 0; //itcm\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm\n\t}\n\n#ifdef HAVE_LUA\n\tCallRegisteredLuaMemHook(addr, 4, /*FIXME*/ 0, LUAMEMHOOK_READ);\n#endif\n\n\t//special handling for execution from arm9, since we spend so much time in there\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE)\n\t{\n\t\tif ( (addr & 0x0F000000) == 0x02000000)\n\t\t\treturn T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32);\n\n\t\tif(addr<0x02000000) \n\t\t\treturn T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, addr&0x7FFC);\n\n\t\t//what happens when we execute from DTCM? nocash makes it look like we get 0xFFFFFFFF but i can't seem to verify it\n\t\t//historically, desmume would fall through to its old memory map struct\n\t\t//which would return unused memory (0)\n\t\t//it seems the hardware returns 0 or something benign because in actuality 0xFFFFFFFF is an undefined opcode\n\t\t//and we know our handling for that is solid\n\n\t\tgoto dunno;\n\t}\n\n\t//special handling for execution from arm7. try reading from main memory first\n\tif(PROCNUM==ARMCPU_ARM7)\n\t{\n\t\tif ( (addr & 0x0F000000) == 0x02000000)\n\t\t\treturn T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32);\n\t}\n\n\n\t//for other arm9 cases, we have to check from dtcm first because it is patched on top of the main memory range\n\tif(PROCNUM==ARMCPU_ARM9)\n\t{\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\t//Returns data from DTCM (ARM9 only)\n\t\t\treturn T1ReadLong_guaranteedAligned(MMU.ARM9_DTCM, addr & 0x3FFC);\n\t\t}\n\t\n\t\tif ( (addr & 0x0F000000) == 0x02000000)\n\t\t\treturn T1ReadLong_guaranteedAligned( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32);\n\t}\n\ndunno:\n\tif(PROCNUM==ARMCPU_ARM9) return _MMU_ARM9_read32(addr);\n\telse return _MMU_ARM7_read32(addr);\n}\n\nFORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u8 val)\n{\n\tCheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,8,val);\n\n\t//special handling for DMA: discard writes to TCM\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr<0x02000000) return; //itcm\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm\n\t}\n\n\tif(PROCNUM==ARMCPU_ARM9)\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\tT1WriteByte(MMU.ARM9_DTCM, addr & 0x3FFF, val);\n#ifdef HAVE_LUA\n\t\t\tCallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE);\n#endif\n\t\t\treturn;\n\t\t}\n\n\tif ( (addr & 0x0F000000) == 0x02000000) {\n#ifdef HAVE_JIT\n\t\tif(PROCNUM==ARMCPU_ARM7)\n\t\t{\n\t\t\tJITLUT_HANDLE_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK, 0) = 0;\n\t\t}\n#endif\n\t\tT1WriteByte( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK, val);\n#ifdef HAVE_LUA\n\t\tCallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE);\n#endif\n\t\treturn;\n\t}\n\n\tif(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write08(addr,val);\n\telse _MMU_ARM7_write08(addr,val);\n#ifdef HAVE_LUA\n\tCallRegisteredLuaMemHook(addr, 1, val, LUAMEMHOOK_WRITE);\n#endif\n}\n\nFORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u16 val)\n{\n\tCheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,16,val);\n\n\t//special handling for DMA: discard writes to TCM\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr<0x02000000) return; //itcm\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm\n\t}\n\n\tif(PROCNUM==ARMCPU_ARM9)\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\tT1WriteWord(MMU.ARM9_DTCM, addr & 0x3FFE, val);\n#ifdef HAVE_LUA\n\t\t\tCallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE);\n#endif\n\t\t\treturn;\n\t\t}\n\n\tif ( (addr & 0x0F000000) == 0x02000000) {\n#ifdef HAVE_JIT\n\t\tif(PROCNUM==ARMCPU_ARM7)\n\t\t{\n\t\t\tJITLUT_HANDLE_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK16, 0) = 0;\n\t\t}\n#endif\n\t\tT1WriteWord( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK16, val);\n#ifdef HAVE_LUA\n\t\tCallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE);\n#endif\n\t\treturn;\n\t}\n\n\tif(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write16(addr,val);\n\telse _MMU_ARM7_write16(addr,val);\n#ifdef HAVE_LUA\n\tCallRegisteredLuaMemHook(addr, 2, val, LUAMEMHOOK_WRITE);\n#endif\n}\n\nFORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u32 val)\n{\n\tCheckMemoryDebugEvent(DEBUG_EVENT_WRITE,AT,PROCNUM,addr,32,val);\n\n\t//special handling for DMA: discard writes to TCM\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr<0x02000000) return; //itcm\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm\n\t}\n\n\tif(PROCNUM==ARMCPU_ARM9)\n\t\tif((addr&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\tT1WriteLong(MMU.ARM9_DTCM, addr & 0x3FFC, val);\n#ifdef HAVE_LUA\n\t\t\tCallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE);\n#endif\n\t\t\treturn;\n\t\t}\n\n\tif ( (addr & 0x0F000000) == 0x02000000) {\n#ifdef HAVE_JIT\n\t\tif(PROCNUM==ARMCPU_ARM7)\n\t\t{\n\t\t\tJITLUT_HANDLE_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK32, 0) = 0;\n\t\t\tJITLUT_HANDLE_KNOWNBANK(addr, MAIN_MEM, _MMU_MAIN_MEM_MASK32, 1) = 0;\n\t\t}\n#endif\n\t\tT1WriteLong( MMU.MAIN_MEM, addr & _MMU_MAIN_MEM_MASK32, val);\n#ifdef HAVE_LUA\n\t\tCallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE);\n#endif\n\t\treturn;\n\t}\n\n\tif(PROCNUM==ARMCPU_ARM9) _MMU_ARM9_write32(addr,val);\n\telse _MMU_ARM7_write32(addr,val);\n#ifdef HAVE_LUA\n\tCallRegisteredLuaMemHook(addr, 4, val, LUAMEMHOOK_WRITE);\n#endif\n}\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE u8* _MMU_read_getrawptr32(const u32 addr_s, const u32 addr_e)\n{\n\t//special handling for DMA: read 0 from TCM\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr_s<0x02000000 || addr_e<0x02000000) return NULL; //itcm\n\t\tif((addr_s&(~0x3FFF)) == MMU.DTCMRegion || (addr_e&(~0x3FFF)) == MMU.DTCMRegion) return NULL; //dtcm\n\t}\n\n\t//special handling for execution from arm9, since we spend so much time in there\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE)\n\t{\n\t\tif ((addr_s & 0x0F000000) == 0x02000000 && \n\t\t\t(addr_e & 0x0F000000) == 0x02000000)\n\t\t\treturn &MMU.MAIN_MEM[addr_s & _MMU_MAIN_MEM_MASK32];\n\n\t\tif (addr_s<0x02000000 && \n\t\t\taddr_e<0x02000000) \n\t\t\treturn &MMU.ARM9_ITCM[addr_s & 0x7FFC];\n\n\t\t//what happens when we execute from DTCM? nocash makes it look like we get 0xFFFFFFFF but i can't seem to verify it\n\t\t//historically, desmume would fall through to its old memory map struct\n\t\t//which would return unused memory (0)\n\t\t//it seems the hardware returns 0 or something benign because in actuality 0xFFFFFFFF is an undefined opcode\n\t\t//and we know our handling for that is solid\n\n\t\treturn NULL;\n\t}\n\n\t//special handling for execution from arm7. try reading from main memory first\n\tif (PROCNUM==ARMCPU_ARM7)\n\t{\n\t\tif ((addr_s & 0x0F000000) == 0x02000000 && \n\t\t\t(addr_e & 0x0F000000) == 0x02000000)\n\t\t\treturn &MMU.MAIN_MEM[addr_s & _MMU_MAIN_MEM_MASK32];\n\t}\n\n\n\t//for other arm9 cases, we have to check from dtcm first because it is patched on top of the main memory range\n\tif (PROCNUM==ARMCPU_ARM9)\n\t{\n\t\tif ((addr_s&(~0x3FFF)) == MMU.DTCMRegion && \n\t\t\t(addr_e&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\t//Returns data from DTCM (ARM9 only)\n\t\t\treturn &MMU.ARM9_DTCM[addr_s & 0x3FFC];\n\t\t}\n\t\n\t\tif ((addr_s & 0x0F000000) == 0x02000000 && \n\t\t\t(addr_e & 0x0F000000) == 0x02000000)\n\t\t\treturn &MMU.MAIN_MEM[addr_s & _MMU_MAIN_MEM_MASK32];\n\t}\n\n\treturn NULL;\n}\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE u8* _MMU_write_getrawptr32(const u32 addr_s, const u32 addr_e)\n{\n\t//special handling for DMA: discard writes to TCM\n\tif (PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA)\n\t{\n\t\tif(addr_s<0x02000000 || addr_e<0x02000000) return NULL; //itcm\n\t\tif((addr_s&(~0x3FFF)) == MMU.DTCMRegion || (addr_e&(~0x3FFF)) == MMU.DTCMRegion) return NULL; //dtcm\n\t}\n\n\tif (PROCNUM==ARMCPU_ARM9)\n\t\tif((addr_s&(~0x3FFF)) == MMU.DTCMRegion && \n\t\t\t(addr_s&(~0x3FFF)) == MMU.DTCMRegion)\n\t\t{\n\t\t\treturn &MMU.ARM9_DTCM[addr_s & 0x3FFC];\n\t\t}\n\n\tif ((addr_s & 0x0F000000) == 0x02000000 && \n\t\t(addr_e & 0x0F000000) == 0x02000000) \n\t{\n\t\treturn &MMU.MAIN_MEM[addr_s & _MMU_MAIN_MEM_MASK32];\n\t}\n\n\treturn NULL;\n}\n\n\n//#ifdef MMU_ENABLE_ACL\n//\tvoid FASTCALL MMU_write8_acl(u32 proc, u32 adr, u8 val);\n//\tvoid FASTCALL MMU_write16_acl(u32 proc, u32 adr, u16 val);\n//\tvoid FASTCALL MMU_write32_acl(u32 proc, u32 adr, u32 val);\n//\tu8 FASTCALL MMU_read8_acl(u32 proc, u32 adr, u32 access);\n//\tu16 FASTCALL MMU_read16_acl(u32 proc, u32 adr, u32 access);\n//\tu32 FASTCALL MMU_read32_acl(u32 proc, u32 adr, u32 access);\n//#else\n//\t#define MMU_write8_acl(proc, adr, val)  _MMU_write08<proc>(adr, val)\n//\t#define MMU_write16_acl(proc, adr, val) _MMU_write16<proc>(adr, val)\n//\t#define MMU_write32_acl(proc, adr, val) _MMU_write32<proc>(adr, val)\n//\t#define MMU_read8_acl(proc,adr,access)  _MMU_read08<proc>(adr)\n//\t#define MMU_read16_acl(proc,adr,access) ((access==CP15_ACCESS_EXECUTE)?_MMU_read16<proc,MMU_AT_CODE>(adr):_MMU_read16<proc,MMU_AT_DATA>(adr))\n//\t#define MMU_read32_acl(proc,adr,access) ((access==CP15_ACCESS_EXECUTE)?_MMU_read32<proc,MMU_AT_CODE>(adr):_MMU_read32<proc,MMU_AT_DATA>(adr))\n//#endif\n\n// Use this macros for reading/writing, so the GDB stub isn't broken\n#ifdef GDB_STUB\n\t#define READ32(a,b)\t\tcpu->mem_if->read32(a,(b) & 0xFFFFFFFC)\n\t#define WRITE32(a,b,c)\tcpu->mem_if->write32(a,(b) & 0xFFFFFFFC,c)\n\t#define READ16(a,b)\t\tcpu->mem_if->read16(a,(b) & 0xFFFFFFFE)\n\t#define WRITE16(a,b,c)\tcpu->mem_if->write16(a,(b) & 0xFFFFFFFE,c)\n\t#define READ8(a,b)\t\tcpu->mem_if->read8(a,b)\n\t#define WRITE8(a,b,c)\tcpu->mem_if->write8(a,b,c)\n#else\n\t#define READ32(a,b)\t\t_MMU_read32<PROCNUM>((b) & 0xFFFFFFFC)\n\t#define WRITE32(a,b,c)\t_MMU_write32<PROCNUM>((b) & 0xFFFFFFFC,c)\n\t#define READ16(a,b)\t\t_MMU_read16<PROCNUM>((b) & 0xFFFFFFFE)\n\t#define WRITE16(a,b,c)\t_MMU_write16<PROCNUM>((b) & 0xFFFFFFFE,c)\n\t#define READ8(a,b)\t\t_MMU_read08<PROCNUM>(b)\n\t#define WRITE8(a,b,c)\t_MMU_write08<PROCNUM>(b, c)\n#endif\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE u8 _MMU_read08(u32 addr) { return _MMU_read08(PROCNUM, AT, addr); }\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE u16 _MMU_read16(u32 addr) { return _MMU_read16(PROCNUM, AT, addr); }\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE u32 _MMU_read32(u32 addr) { return _MMU_read32(PROCNUM, AT, addr); }\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE void _MMU_write08(u32 addr, u8 val) { _MMU_write08(PROCNUM, AT, addr, val); }\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE void _MMU_write16(u32 addr, u16 val) { _MMU_write16(PROCNUM, AT, addr, val); }\n\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\nFORCEINLINE void _MMU_write32(u32 addr, u32 val) { _MMU_write32(PROCNUM, AT, addr, val); }\n\ntemplate<int PROCNUM> FORCEINLINE u8 _MMU_read08(u32 addr) { return _MMU_read08<PROCNUM, MMU_AT_DATA>(addr); }\ntemplate<int PROCNUM> FORCEINLINE u16 _MMU_read16(u32 addr) { return _MMU_read16<PROCNUM, MMU_AT_DATA>(addr); }\ntemplate<int PROCNUM> FORCEINLINE u32 _MMU_read32(u32 addr) { return _MMU_read32<PROCNUM, MMU_AT_DATA>(addr); }\ntemplate<int PROCNUM> FORCEINLINE void _MMU_write08(u32 addr, u8 val) { _MMU_write08<PROCNUM, MMU_AT_DATA>(addr,val); }\ntemplate<int PROCNUM> FORCEINLINE void _MMU_write16(u32 addr, u16 val) { _MMU_write16<PROCNUM, MMU_AT_DATA>(addr,val); }\ntemplate<int PROCNUM> FORCEINLINE void _MMU_write32(u32 addr, u32 val) { _MMU_write32<PROCNUM, MMU_AT_DATA>(addr,val); }\n\nvoid FASTCALL MMU_DumpMemBlock(u8 proc, u32 address, u32 size, u8 *buffer);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/MMU_timing.h",
    "content": " /*\r\n\tCopyright (C) 2006 yopyop\r\n\tCopyright (C) 2007 shash\r\n\tCopyright (C) 2007-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n// this file is split from MMU.h for the purpose of avoiding ridiculous recompile times\r\n// when changing it, because practically everything includes MMU.h.\r\n#ifndef MMUTIMING_H\r\n#define MMUTIMING_H\r\n\r\n#include <algorithm>\r\n#include \"MMU.h\"\r\n#include \"cp15.h\"\r\n#include \"readwrite.h\"\r\n#include \"debug.h\"\r\n#include \"NDSSystem.h\"\r\n\r\n////////////////////////////////////////////////////////////////\r\n// MEMORY TIMING ACCURACY CONFIGURATION\r\n//\r\n// the more of these are enabled,\r\n// the more accurate memory access timing _should_ become.\r\n// they should be listed roughly in order of most to least important.\r\n// it's reasonable to disable some of these as a speed hack.\r\n// obviously, these defines don't cover all the variables or features needed,\r\n// and in particular, DMA or code+data access bus contention is still missing.\r\n\r\nFORCEINLINE bool USE_TIMING() { \r\n\treturn false;\r\n}\r\n\r\n\r\nenum MMU_ACCESS_DIRECTION\r\n{\r\n\tMMU_AD_READ, MMU_AD_WRITE\r\n};\r\n\r\n\r\n// note that we don't actually emulate the cache contents here,\r\n// only enough to guess what would be a cache hit or a cache miss.\r\n// this doesn't really get used unless ENABLE_CACHE_CONTROLLER_EMULATION is defined.\r\ntemplate<int SIZESHIFT, int ASSOCIATIVESHIFT, int BLOCKSIZESHIFT>\r\nclass CacheController\r\n{\r\npublic:\r\n\ttemplate<MMU_ACCESS_DIRECTION DIR>\r\n\tFORCEINLINE bool Cached(u32 addr)\r\n\t{\r\n\t\tu32 blockMasked = addr & BLOCKMASK;\r\n\t\tif(blockMasked == m_cacheCache)\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn this->CachedInternal<DIR>(addr, blockMasked);\r\n\t}\r\n\t\r\n\tvoid Reset()\r\n\t{\r\n\t\tfor(int blockIndex = 0; blockIndex < NUMBLOCKS; blockIndex++)\r\n\t\t\tm_blocks[blockIndex].Reset();\r\n\t\tm_cacheCache = ~0;\r\n\t}\r\n\tCacheController()\r\n\t{\r\n\t\tReset();\r\n\t}\r\n\t\r\n\tvoid savestate(EMUFILE* os, int version)\r\n\t{\r\n\t\twrite32le(m_cacheCache, os);\r\n\t\tfor(int i = 0; i < NUMBLOCKS; i++)\r\n\t\t{\r\n\t\t\tfor(int j = 0; j < ASSOCIATIVITY; j++)\r\n\t\t\t\twrite32le(m_blocks[i].tag[j],os);\r\n\t\t\twrite32le(m_blocks[i].nextWay,os);\r\n\t\t}\r\n\t}\r\n\tbool loadstate(EMUFILE* is, int version)\r\n\t{\r\n\t\tread32le(&m_cacheCache, is);\r\n\t\tfor(int i = 0; i < NUMBLOCKS; i++)\r\n\t\t{\r\n\t\t\tfor(int j = 0; j < ASSOCIATIVITY; j++)\r\n\t\t\t\tread32le(&m_blocks[i].tag[j],is);\r\n\t\t\tread32le(&m_blocks[i].nextWay,is);\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\nprivate:\r\n\ttemplate<MMU_ACCESS_DIRECTION DIR>\r\n\tbool CachedInternal(u32 addr, u32 blockMasked)\r\n\t{\r\n\t\tu32 blockIndex = blockMasked >> BLOCKSIZESHIFT;\r\n\t\tCacheBlock& block = m_blocks[blockIndex];\r\n\t\taddr &= TAGMASK;\r\n\r\n\t\tfor(int way = 0; way < ASSOCIATIVITY; way++)\r\n\t\t\tif(addr == block.tag[way])\r\n\t\t\t{\r\n\t\t\t\t// found it, already allocated\r\n\t\t\t\tm_cacheCache = blockMasked;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\tif(DIR == MMU_AD_READ)\r\n\t\t{\r\n\t\t\t// TODO: support other allocation orders?\r\n\t\t\tblock.tag[block.nextWay++] = addr;\r\n\t\t\tblock.nextWay %= ASSOCIATIVITY;\r\n\t\t\tm_cacheCache = blockMasked;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tenum { SIZE = 1 << SIZESHIFT };\r\n\tenum { ASSOCIATIVITY = 1 << ASSOCIATIVESHIFT };\r\n\tenum { BLOCKSIZE = 1 << BLOCKSIZESHIFT };\r\n\tenum { TAGSHIFT = SIZESHIFT - ASSOCIATIVESHIFT };\r\n\tenum { TAGMASK = (u32)(~0 << TAGSHIFT) };\r\n\tenum { BLOCKMASK = ((u32)~0 >> (32 - TAGSHIFT)) & (u32)(~0 << BLOCKSIZESHIFT) };\r\n\tenum { WORDSIZE = sizeof(u32) };\r\n\tenum { WORDSPERBLOCK = (1 << BLOCKSIZESHIFT) / WORDSIZE };\r\n\tenum { DATAPERWORD = WORDSIZE * ASSOCIATIVITY };\r\n\tenum { DATAPERBLOCK = DATAPERWORD * WORDSPERBLOCK };\r\n\tenum { NUMBLOCKS = SIZE / DATAPERBLOCK };\r\n\r\n\tstruct CacheBlock\r\n\t{\r\n\t\tu32 tag [ASSOCIATIVITY];\r\n\t\tu32 nextWay;\r\n\r\n\t\tvoid Reset()\r\n\t\t{\r\n\t\t\tnextWay = 0;\r\n\t\t\tfor(int way = 0; way < ASSOCIATIVITY; way++)\r\n\t\t\t\ttag[way] = 0;\r\n\t\t}\r\n\t};\r\n\r\n\tu32 m_cacheCache; // optimization\r\n\r\n\tCacheBlock m_blocks [NUMBLOCKS];\r\n};\r\n\r\n\r\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT, int READSIZE, MMU_ACCESS_DIRECTION DIRECTION, bool TIMING>\r\nFORCEINLINE u32 _MMU_accesstime(u32 addr, bool sequential);\r\n\r\n\r\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT>\r\nclass FetchAccessUnit\r\n{\r\npublic:\r\n\ttemplate<int READSIZE, MMU_ACCESS_DIRECTION DIRECTION, bool TIMING>\r\n\tFORCEINLINE u32 Fetch(u32 address)\r\n\t{\r\n\t\t#ifdef ACCOUNT_FOR_CODE_FETCH_CYCLES\r\n\t\tconst bool prohibit = TIMING;\r\n\t\t#else\r\n\t\tconst bool prohibit = false;\r\n\t\t#endif\r\n\t\t\r\n\t\tif(AT == MMU_AT_CODE && !prohibit)\r\n\t\t{\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\tu32 time = _MMU_accesstime<PROCNUM, AT, READSIZE, DIRECTION,TIMING>(address,\r\n#ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS\r\n\t\t\t(TIMING?\r\n\t\t\t\t(address == (m_lastAddress + (READSIZE>>3)))\r\n\t\t\t\t:true\r\n\t\t\t)\r\n#else\r\n\t\t\ttrue\r\n#endif\r\n\t\t);\r\n\r\n#ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS\r\n\t\tm_lastAddress = address;\r\n#endif\r\n\r\n\t\treturn time;\r\n\t}\r\n\r\n\tvoid Reset()\r\n\t{\r\n\t\tm_lastAddress = ~0;\r\n\t}\r\n\tFetchAccessUnit() { this->Reset(); }\r\n\r\n\tvoid savestate(EMUFILE* os, int version)\r\n\t{\r\n\t\twrite32le(m_lastAddress,os);\r\n\t}\r\n\tbool loadstate(EMUFILE* is, int version)\r\n\t{\r\n\t\tread32le(&m_lastAddress,is);\r\n\t\treturn true;\r\n\t}\r\n\r\nprivate:\r\n\tu32 m_lastAddress;\r\n};\r\n\r\n\r\n\r\n\r\n\r\nstruct MMU_struct_timing\r\n{\r\n\t// technically part of the cp15, but I didn't want the dereferencing penalty.\r\n\t// these template values correspond with the value of armcp15->cacheType.\r\n\tCacheController<13,2,5> arm9codeCache; // 8192 bytes, 4-way associative, 32-byte blocks\r\n\tCacheController<12,2,5> arm9dataCache; // 4096 bytes, 4-way associative, 32-byte blocks\r\n\r\n\t// technically part of armcpu_t, but that struct isn't templated on PROCNUM\r\n\tFetchAccessUnit<0,MMU_AT_CODE> arm9codeFetch;\r\n\tFetchAccessUnit<0,MMU_AT_DATA> arm9dataFetch;\r\n\tFetchAccessUnit<1,MMU_AT_CODE> arm7codeFetch;\r\n\tFetchAccessUnit<1,MMU_AT_DATA> arm7dataFetch;\r\n\r\n\ttemplate<int PROCNUM> FORCEINLINE FetchAccessUnit<PROCNUM,MMU_AT_CODE>& armCodeFetch();\r\n\ttemplate<int PROCNUM> FORCEINLINE FetchAccessUnit<PROCNUM,MMU_AT_DATA>& armDataFetch();\r\n};\r\ntemplate<> FORCEINLINE FetchAccessUnit<0,MMU_AT_CODE>& MMU_struct_timing::armCodeFetch<0>() { return this->arm9codeFetch; }\r\ntemplate<> FORCEINLINE FetchAccessUnit<1,MMU_AT_CODE>& MMU_struct_timing::armCodeFetch<1>() { return this->arm7codeFetch; }\r\ntemplate<> FORCEINLINE FetchAccessUnit<0,MMU_AT_DATA>& MMU_struct_timing::armDataFetch<0>() { return this->arm9dataFetch; }\r\ntemplate<> FORCEINLINE FetchAccessUnit<1,MMU_AT_DATA>& MMU_struct_timing::armDataFetch<1>() { return this->arm7dataFetch; }\r\n\r\n\r\nextern MMU_struct_timing MMU_timing;\r\n\r\n\r\n\r\n// calculates the time a single memory access takes,\r\n// in units of cycles of the current processor.\r\n// this function replaces what used to be MMU_WAIT16 and MMU_WAIT32.\r\n// this may have side effects, so don't call it more than necessary.\r\ntemplate<int PROCNUM, MMU_ACCESS_TYPE AT, int READSIZE, MMU_ACCESS_DIRECTION DIRECTION, bool TIMING>\r\nFORCEINLINE u32 _MMU_accesstime(u32 addr, bool sequential)\r\n{\r\n\tstatic const int MC = 1; // cached or tcm memory speed\r\n\tstatic const int M32 = (PROCNUM==ARMCPU_ARM9) ? 2 : 1; // access through 32-bit bus\r\n\tstatic const int M16 = M32 * ((READSIZE>16) ? 2 : 1); // access through 16-bit bus\r\n\tstatic const int MSLW = M16 * 8; // this needs tuning\r\n\r\n\tif(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE && addr < 0x02000000)\r\n\t\treturn MC; // ITCM\r\n\r\n#ifdef ACCOUNT_FOR_DATA_TCM_SPEED\r\n\tif(TIMING && PROCNUM==ARMCPU_ARM9 && AT==MMU_AT_DATA && (addr&(~0x3FFF)) == MMU.DTCMRegion)\r\n\t\treturn MC; // DTCM\r\n#endif\r\n\r\n\t// for now, assume the cache is always enabled for all of main memory\r\n\tif(AT != MMU_AT_DMA && TIMING && PROCNUM==ARMCPU_ARM9 && (addr & 0x0F000000) == 0x02000000)\r\n\t{\r\n#ifdef ENABLE_CACHE_CONTROLLER_EMULATION\r\n\t\tbool cached = false;\r\n\t\tif(AT==MMU_AT_CODE)\r\n\t\t\tcached = MMU_timing.arm9codeCache.Cached<DIRECTION>(addr);\r\n\t\tif(AT==MMU_AT_DATA)\r\n\t\t\tcached = MMU_timing.arm9dataCache.Cached<DIRECTION>(addr);\r\n\t\tif(cached)\r\n\t\t\treturn MC;\r\n\t\tu32 c;\r\n\t\tif(sequential && AT==MMU_AT_DATA)\r\n\t\t\tc = M16; // bonus for sequential data access\r\n\t\telse if(DIRECTION == MMU_AD_READ)\r\n\t\t\tc = M16 * 5;\r\n\t\telse\r\n\t\t\tc = M16 * 2; // should be 4, but write buffer isn't emulated yet.\r\n\t\tif(DIRECTION == MMU_AD_READ)\r\n\t\t{\r\n\t\t\t// cache miss while reading means it has to fill a whole cache line\r\n\t\t\t// by reading 32 bytes...\r\n\t\t\tc += 8 * M32*2;\r\n\t\t}\r\n\r\n\t\tif(CheckDebugEvent(DEBUG_EVENT_CACHE_MISS))\r\n\t\t{\r\n\t\t\tDebugEventData.addr = addr;\r\n\t\t\tDebugEventData.size = READSIZE;\r\n\t\t\tHandleDebugEvent(DEBUG_EVENT_CACHE_MISS);\r\n\t\t}\r\n\r\n\t\treturn c;\r\n#elif defined(ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS)\r\n\t\t// this is the closest approximation I could find\r\n\t\t// to the with-cache-controller timing\r\n\t\t// that doesn't do any actual caching logic.\r\n\t\treturn sequential ? MC : M16;\r\n#endif\r\n\t}\r\n\r\n\tstatic const TWaitState MMU_WAIT[16*16] = {\r\n        // ITCM, ITCM, MAIN, SWI, REG, VMEM, LCD, OAM,  ROM,  ROM,  RAM,   U,  U,  U,  U, BIOS\r\n#define X    MC,   MC,  M16, M32, M32,  M16, M16, M32, MSLW, MSLW, MSLW, M32,M32,M32,M32,  M32,\r\n\t\t// duplicate it 16 times (this was somehow faster than using a mask of 0xF)\r\n\t\tX X X X  X X X X  X X X X  X X X X\r\n#undef X\r\n\t};\r\n\r\n\tu32 c = MMU_WAIT[(addr >> 24)];\r\n\r\n#ifdef ACCOUNT_FOR_NON_SEQUENTIAL_ACCESS\r\n\tif(TIMING && !sequential)\r\n\t{\r\n\t\t//if(c != MC || PROCNUM==ARMCPU_ARM7) // check not needed anymore because ITCM/DTCM return earlier\r\n\t\t{\r\n\t\t\tc += (PROCNUM==ARMCPU_ARM9) ? 3*2 : 1;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\treturn c;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n// calculates the cycle time of a single memory access in the MEM stage.\r\n// to be used to calculate the memCycles argument for MMU_aluMemCycles.\r\n// this may have side effects, so don't call it more than necessary.\r\ntemplate<int PROCNUM, int READSIZE, MMU_ACCESS_DIRECTION DIRECTION, bool TIMING>\r\nFORCEINLINE u32 MMU_memAccessCycles(u32 addr)\r\n{\r\n\tif(TIMING)\r\n\t\treturn MMU_timing.armDataFetch<PROCNUM>().template Fetch<READSIZE,DIRECTION,true>((addr)&(~((READSIZE>>3)-1)));\r\n\telse\r\n\t\treturn MMU_timing.armDataFetch<PROCNUM>().template Fetch<READSIZE,DIRECTION,false>((addr)&(~((READSIZE>>3)-1)));\r\n}\r\n\r\ntemplate<int PROCNUM, int READSIZE, MMU_ACCESS_DIRECTION DIRECTION>\r\nFORCEINLINE u32 MMU_memAccessCycles(u32 addr)\r\n{\r\n\tif(USE_TIMING())\r\n\t\treturn MMU_memAccessCycles<PROCNUM,READSIZE,DIRECTION,true>(addr);\r\n\telse\r\n\t\treturn MMU_memAccessCycles<PROCNUM,READSIZE,DIRECTION,false>(addr);\r\n}\r\n\r\n// calculates the cycle time of a single code fetch in the FETCH stage\r\n// to be used to calculate the fetchCycles argument for MMU_fetchExecuteCycles.\r\n// this may have side effects, so don't call it more than necessary.\r\ntemplate<int PROCNUM, int READSIZE>\r\nFORCEINLINE u32 MMU_codeFetchCycles(u32 addr)\r\n{\r\n\tif(USE_TIMING())\r\n\t\treturn MMU_timing.armCodeFetch<PROCNUM>().template Fetch<READSIZE,MMU_AD_READ,true>((addr)&(~((READSIZE>>3)-1)));\r\n\telse\r\n\t\treturn MMU_timing.armCodeFetch<PROCNUM>().template Fetch<READSIZE,MMU_AD_READ,false>((addr)&(~((READSIZE>>3)-1)));\r\n}\r\n\r\nu32 FORCEINLINE fastu32max( const u32 a, const u32 b )\r\n{\r\n    s32 mask = a - b;\r\n    return a + ( ( b - a ) & ( mask >> 31 ) );\r\n}\r\n\r\n// calculates the cycle contribution of ALU + MEM stages (= EXECUTE)\r\n// given ALU cycle time and the summation of multiple memory access cycle times.\r\n// this function might belong more in armcpu, but I don't think it matters.\r\ntemplate<int PROCNUM>\r\nFORCEINLINE u32 MMU_aluMemCycles(u32 aluCycles, u32 memCycles)\r\n{\r\n\tif(PROCNUM==ARMCPU_ARM9)\r\n\t{\r\n\t\t// ALU and MEM are different stages of the 5-stage pipeline.\r\n\t\t// we approximate the pipeline throughput using max,\r\n\t\t// since simply adding the cycles of each instruction together\r\n\t\t// fails to take into account the parallelism of the arm pipeline\r\n\t\t// and would make the emulated system unnaturally slow.\r\n\t\treturn fastu32max(aluCycles, memCycles);\r\n\t}\r\n\telse\r\n\t{\r\n\t\t// ALU and MEM are part of the same stage of the 3-stage pipeline,\r\n\t\t// thus they occur in sequence and we can simply add the counts together.\r\n\t\treturn aluCycles + memCycles;\r\n\t}\r\n}\r\n\r\n// calculates the cycle contribution of ALU + MEM stages (= EXECUTE)\r\n// given ALU cycle time and the description of a single memory access.\r\n// this may have side effects, so don't call it more than necessary.\r\ntemplate<int PROCNUM, int READSIZE, MMU_ACCESS_DIRECTION DIRECTION>\r\nFORCEINLINE u32 MMU_aluMemAccessCycles(u32 aluCycles, u32 addr)\r\n{\r\n\tu32 memCycles;\r\n\tif(USE_TIMING())\r\n\t\tmemCycles = MMU_memAccessCycles<PROCNUM,READSIZE,DIRECTION,true>(addr);\r\n\telse memCycles = MMU_memAccessCycles<PROCNUM,READSIZE,DIRECTION,false>(addr);\r\n\treturn MMU_aluMemCycles<PROCNUM>(aluCycles, memCycles);\r\n}\r\n\r\n// calculates the cycle contribution of FETCH + EXECUTE stages\r\n// given executeCycles = the combined ALU+MEM cycles\r\n//     and fetchCycles = the cycle time of the FETCH stage\r\n// this function might belong more in armcpu, but I don't think it matters.\r\ntemplate<int PROCNUM>\r\nFORCEINLINE u32 MMU_fetchExecuteCycles(u32 executeCycles, u32 fetchCycles)\r\n{\r\n\t#ifdef ACCOUNT_FOR_CODE_FETCH_CYCLES\r\n\tconst bool allow = true;\r\n\t#else\r\n\tconst bool allow = false;\r\n\t#endif\r\n\r\n\tif(USE_TIMING() && allow)\r\n\t{\r\n\t\t// execute and fetch are different stages of the pipeline for both arm7 and arm9.\r\n\t\t// again, we approximate the pipeline throughput using max.\r\n\t\treturn std::max(executeCycles, fetchCycles);\r\n\t\t// TODO: add an option to support conflict between MEM and FETCH cycles\r\n\t\t//  if they're both using the same data bus.\r\n\t\t//  in the case of a conflict this should be:\r\n\t\t//  return std::max(aluCycles, memCycles + fetchCycles);\r\n\t}\r\n\treturn executeCycles;\r\n}\r\n\r\n\r\n#endif //MMUTIMING_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/Makefile.am",
    "content": "include $(top_srcdir)/src/desmume.mk\n\nAM_CPPFLAGS += $(SDL_CFLAGS) $(GTHREAD_CFLAGS) $(X_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS)\n\nEXTRA_DIST = build.bat instruction_tabdef.inc thumb_tabdef.inc fs-linux.cpp fs-windows.cpp cocoa\nif HAVE_GDB_STUB\nSUBDIRS = . gdbstub $(UI_DIR)\nelse\nSUBDIRS = . $(UI_DIR)\nendif\nDIST_SUBDIRS = . gdbstub cli gtk gtk-glade wx\nnoinst_LIBRARIES = libdesmume.a\nlibdesmume_a_SOURCES = \\\n\tarmcpu.cpp armcpu.h \\\n\tarm_instructions.cpp arm_instructions.h \\\n\tagg2d.h agg2d.inl \\\n\tbios.cpp bios.h bits.h cp15.cpp cp15.h \\\n\tcommandline.h commandline.cpp \\\n\tcommon.cpp common.h \\\n\tdebug.cpp debug.h \\\n\tDisassembler.cpp Disassembler.h \\\n\temufile.h emufile.cpp emufile_types.h FIFO.cpp FIFO.h \\\n\tfirmware.cpp firmware.h GPU.cpp GPU.h \\\n\tfs.h \\\n\tGPU_osd.h \\\n\tmem.h mc.cpp mc.h \\\n\tpath.cpp path.h \\\n\treadwrite.cpp readwrite.h \\\n\twifi.cpp wifi.h \\\n\tmic.h \\\n\tMMU.cpp MMU.h MMU_timing.h NDSSystem.cpp NDSSystem.h registers.h \\\n\tOGLRender.h \\\n\tROMReader.cpp ROMReader.h \\\n\trender3D.cpp render3D.h \\\n\trtc.cpp rtc.h \\\n\tsaves.cpp saves.h \\\n\tslot1.cpp slot1.h \\\n\tSPU.cpp SPU.h \\\n\tmatrix.cpp matrix.h \\\n\tgfx3d.cpp gfx3d.h \\\n\tthumb_instructions.cpp thumb_instructions.h types.h \\\n\tshaders.h \\\n\tmovie.cpp movie.h \\\n\tPACKED.h PACKED_END.h \\\n\tutils/datetime.cpp utils/datetime.h \\\n\tutils/ConvertUTF.c utils/ConvertUTF.h utils/guid.cpp utils/guid.h \\\n\tutils/emufat.cpp utils/emufat.h utils/emufat_types.h \\\n\tutils/md5.cpp utils/md5.h utils/valuearray.h utils/xstring.cpp utils/xstring.h \\\n\tutils/decrypt/crc.cpp utils/decrypt/crc.h utils/decrypt/decrypt.cpp \\\n\tutils/decrypt/decrypt.h utils/decrypt/header.cpp utils/decrypt/header.h \\\n\tutils/task.cpp utils/task.h \\\n\tutils/vfat.h utils/vfat.cpp \\\n\tutils/dlditool.cpp \\\n\tutils/libfat/bit_ops.h \\\n\tutils/libfat/cache.cpp \\\n\tutils/libfat/cache.h \\\n\tutils/libfat/common.h \\\n\tutils/libfat/directory.cpp \\\n\tutils/libfat/directory.h \\\n\tutils/libfat/disc.cpp \\\n\tutils/libfat/disc.h \\\n\tutils/libfat/disc_io.h \\\n\tutils/libfat/fat.h \\\n\tutils/libfat/fatdir.cpp \\\n\tutils/libfat/fatdir.h \\\n\tutils/libfat/fatfile.cpp \\\n\tutils/libfat/fatfile.h \\\n\tutils/libfat/filetime.cpp \\\n\tutils/libfat/filetime.h \\\n\tutils/libfat/file_allocation_table.cpp \\\n\tutils/libfat/file_allocation_table.h \\\n\tutils/libfat/libfat.cpp \\\n\tutils/libfat/libfat_pc.h \\\n\tutils/libfat/libfat_public_api.cpp \\\n\tutils/libfat/libfat_public_api.h \\\n\tutils/libfat/lock.cpp \\\n\tutils/libfat/lock.h \\\n\tutils/libfat/mem_allocate.h \\\n\tutils/libfat/partition.cpp \\\n\tutils/libfat/partition.h \\\n\tutils/tinyxml/tinystr.cpp \\\n\tutils/tinyxml/tinystr.h \\\n\tutils/tinyxml/tinyxml.cpp \\\n\tutils/tinyxml/tinyxml.h \\\n\tutils/tinyxml/tinyxmlerror.cpp \\\n\tutils/tinyxml/tinyxmlparser.cpp \\\n\taddons.cpp addons.h \\\n\taddons/slot2_mpcf.cpp addons/slot2_paddle.cpp addons/slot2_gbagame.cpp addons/slot2_none.cpp addons/slot2_rumblepak.cpp addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp addons/slot2_piano.cpp addons/slot1_none.cpp addons/slot1_r4.cpp addons/slot1_retail.cpp addons/slot1_retail_nand.cpp \\\n\tcheatSystem.cpp cheatSystem.h \\\n\ttexcache.cpp texcache.h rasterize.cpp rasterize.h \\\n\tmetaspu/metaspu.cpp metaspu/metaspu.h \\\n\tversion.cpp version.h \\\n\tdesmume_config.cpp desmume_config.h\n\nif HAVE_GL\nlibdesmume_a_SOURCES += OGLRender.cpp\nendif\n\nif HAVE_OPENAL\nlibdesmume_a_SOURCES += mic_openal.cpp\nelse\nif HAVE_ALSA\nlibdesmume_a_SOURCES += mic_alsa.cpp\nelse\nlibdesmume_a_SOURCES += mic.cpp\nendif\nendif\n\nif HAVE_LIBSOUNDTOUCH\nlibdesmume_a_SOURCES += metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp\nendif\n\nif HAVE_LIBAGG\nlibdesmume_a_SOURCES += aggdraw.cpp aggdraw.h GPU_osd.cpp\nelse\nlibdesmume_a_SOURCES += GPU_osd_stub.cpp\nendif\nif HAVE_LUA\nAM_CPPFLAGS += $(LUA_CFLAGS)\nlibdesmume_a_SOURCES += lua-engine.cpp\nendif\nif HAVE_GDB_STUB\nlibdesmume_a_SOURCES += gdbstub.h\nendif\nlibdesmume_a_LIBADD = fs-$(desmume_arch).$(OBJEXT)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.5 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n# Foundation, Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__make_dryrun = \\\n  { \\\n    am__dry=no; \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        echo 'am--echo: ; @echo \"AM\"  OK' | $(MAKE) -f - 2>/dev/null \\\n          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \\\n      *) \\\n        for am__flg in $$MAKEFLAGS; do \\\n          case $$am__flg in \\\n            *=*|--*) ;; \\\n            *n*) am__dry=yes; break;; \\\n          esac; \\\n        done;; \\\n    esac; \\\n    test $$am__dry = yes; \\\n  }\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nDIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \\\n\t$(top_srcdir)/src/desmume.mk\n@HAVE_GL_TRUE@am__append_1 = OGLRender.cpp\n@HAVE_OPENAL_TRUE@am__append_2 = mic_openal.cpp\n@HAVE_ALSA_TRUE@@HAVE_OPENAL_FALSE@am__append_3 = mic_alsa.cpp\n@HAVE_ALSA_FALSE@@HAVE_OPENAL_FALSE@am__append_4 = mic.cpp\n@HAVE_LIBSOUNDTOUCH_TRUE@am__append_5 = metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp\n@HAVE_LIBAGG_TRUE@am__append_6 = aggdraw.cpp aggdraw.h GPU_osd.cpp\n@HAVE_LIBAGG_FALSE@am__append_7 = GPU_osd_stub.cpp\n@HAVE_LUA_TRUE@am__append_8 = $(LUA_CFLAGS)\n@HAVE_LUA_TRUE@am__append_9 = lua-engine.cpp\n@HAVE_GDB_STUB_TRUE@am__append_10 = gdbstub.h\nsubdir = src\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/wxwin.m4 \\\n\t$(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLIBRARIES = $(noinst_LIBRARIES)\nAR = ar\nARFLAGS = cru\nlibdesmume_a_AR = $(AR) $(ARFLAGS)\nlibdesmume_a_DEPENDENCIES = fs-$(desmume_arch).$(OBJEXT)\nam__libdesmume_a_SOURCES_DIST = armcpu.cpp armcpu.h \\\n\tarm_instructions.cpp arm_instructions.h agg2d.h agg2d.inl \\\n\tbios.cpp bios.h bits.h cp15.cpp cp15.h commandline.h \\\n\tcommandline.cpp common.cpp common.h debug.cpp debug.h \\\n\tDisassembler.cpp Disassembler.h emufile.h emufile.cpp \\\n\temufile_types.h FIFO.cpp FIFO.h firmware.cpp firmware.h \\\n\tGPU.cpp GPU.h fs.h GPU_osd.h mem.h mc.cpp mc.h path.cpp path.h \\\n\treadwrite.cpp readwrite.h wifi.cpp wifi.h mic.h MMU.cpp MMU.h \\\n\tMMU_timing.h NDSSystem.cpp NDSSystem.h registers.h OGLRender.h \\\n\tROMReader.cpp ROMReader.h render3D.cpp render3D.h rtc.cpp \\\n\trtc.h saves.cpp saves.h slot1.cpp slot1.h SPU.cpp SPU.h \\\n\tmatrix.cpp matrix.h gfx3d.cpp gfx3d.h thumb_instructions.cpp \\\n\tthumb_instructions.h types.h shaders.h movie.cpp movie.h \\\n\tPACKED.h PACKED_END.h utils/datetime.cpp utils/datetime.h \\\n\tutils/ConvertUTF.c utils/ConvertUTF.h utils/guid.cpp \\\n\tutils/guid.h utils/emufat.cpp utils/emufat.h \\\n\tutils/emufat_types.h utils/md5.cpp utils/md5.h \\\n\tutils/valuearray.h utils/xstring.cpp utils/xstring.h \\\n\tutils/decrypt/crc.cpp utils/decrypt/crc.h \\\n\tutils/decrypt/decrypt.cpp utils/decrypt/decrypt.h \\\n\tutils/decrypt/header.cpp utils/decrypt/header.h utils/task.cpp \\\n\tutils/task.h utils/vfat.h utils/vfat.cpp utils/dlditool.cpp \\\n\tutils/libfat/bit_ops.h utils/libfat/cache.cpp \\\n\tutils/libfat/cache.h utils/libfat/common.h \\\n\tutils/libfat/directory.cpp utils/libfat/directory.h \\\n\tutils/libfat/disc.cpp utils/libfat/disc.h \\\n\tutils/libfat/disc_io.h utils/libfat/fat.h \\\n\tutils/libfat/fatdir.cpp utils/libfat/fatdir.h \\\n\tutils/libfat/fatfile.cpp utils/libfat/fatfile.h \\\n\tutils/libfat/filetime.cpp utils/libfat/filetime.h \\\n\tutils/libfat/file_allocation_table.cpp \\\n\tutils/libfat/file_allocation_table.h utils/libfat/libfat.cpp \\\n\tutils/libfat/libfat_pc.h utils/libfat/libfat_public_api.cpp \\\n\tutils/libfat/libfat_public_api.h utils/libfat/lock.cpp \\\n\tutils/libfat/lock.h utils/libfat/mem_allocate.h \\\n\tutils/libfat/partition.cpp utils/libfat/partition.h \\\n\tutils/tinyxml/tinystr.cpp utils/tinyxml/tinystr.h \\\n\tutils/tinyxml/tinyxml.cpp utils/tinyxml/tinyxml.h \\\n\tutils/tinyxml/tinyxmlerror.cpp utils/tinyxml/tinyxmlparser.cpp \\\n\taddons.cpp addons.h addons/slot2_mpcf.cpp \\\n\taddons/slot2_paddle.cpp addons/slot2_gbagame.cpp \\\n\taddons/slot2_none.cpp addons/slot2_rumblepak.cpp \\\n\taddons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp \\\n\taddons/slot2_piano.cpp addons/slot1_none.cpp \\\n\taddons/slot1_r4.cpp addons/slot1_retail.cpp \\\n\taddons/slot1_retail_nand.cpp cheatSystem.cpp cheatSystem.h \\\n\ttexcache.cpp texcache.h rasterize.cpp rasterize.h \\\n\tmetaspu/metaspu.cpp metaspu/metaspu.h version.cpp version.h \\\n\tdesmume_config.cpp desmume_config.h OGLRender.cpp \\\n\tmic_openal.cpp mic_alsa.cpp mic.cpp metaspu/SndOut.cpp \\\n\tmetaspu/SndOut.h metaspu/Timestretcher.cpp aggdraw.cpp \\\n\taggdraw.h GPU_osd.cpp GPU_osd_stub.cpp lua-engine.cpp \\\n\tgdbstub.h\n@HAVE_GL_TRUE@am__objects_1 = OGLRender.$(OBJEXT)\n@HAVE_OPENAL_TRUE@am__objects_2 = mic_openal.$(OBJEXT)\n@HAVE_ALSA_TRUE@@HAVE_OPENAL_FALSE@am__objects_3 = mic_alsa.$(OBJEXT)\n@HAVE_ALSA_FALSE@@HAVE_OPENAL_FALSE@am__objects_4 = mic.$(OBJEXT)\n@HAVE_LIBSOUNDTOUCH_TRUE@am__objects_5 = SndOut.$(OBJEXT) \\\n@HAVE_LIBSOUNDTOUCH_TRUE@\tTimestretcher.$(OBJEXT)\n@HAVE_LIBAGG_TRUE@am__objects_6 = aggdraw.$(OBJEXT) GPU_osd.$(OBJEXT)\n@HAVE_LIBAGG_FALSE@am__objects_7 = GPU_osd_stub.$(OBJEXT)\n@HAVE_LUA_TRUE@am__objects_8 = lua-engine.$(OBJEXT)\nam__objects_9 =\nam_libdesmume_a_OBJECTS = armcpu.$(OBJEXT) arm_instructions.$(OBJEXT) \\\n\tbios.$(OBJEXT) cp15.$(OBJEXT) commandline.$(OBJEXT) \\\n\tcommon.$(OBJEXT) debug.$(OBJEXT) Disassembler.$(OBJEXT) \\\n\temufile.$(OBJEXT) FIFO.$(OBJEXT) firmware.$(OBJEXT) \\\n\tGPU.$(OBJEXT) mc.$(OBJEXT) path.$(OBJEXT) readwrite.$(OBJEXT) \\\n\twifi.$(OBJEXT) MMU.$(OBJEXT) NDSSystem.$(OBJEXT) \\\n\tROMReader.$(OBJEXT) render3D.$(OBJEXT) rtc.$(OBJEXT) \\\n\tsaves.$(OBJEXT) slot1.$(OBJEXT) SPU.$(OBJEXT) matrix.$(OBJEXT) \\\n\tgfx3d.$(OBJEXT) thumb_instructions.$(OBJEXT) movie.$(OBJEXT) \\\n\tdatetime.$(OBJEXT) ConvertUTF.$(OBJEXT) guid.$(OBJEXT) \\\n\temufat.$(OBJEXT) md5.$(OBJEXT) xstring.$(OBJEXT) crc.$(OBJEXT) \\\n\tdecrypt.$(OBJEXT) header.$(OBJEXT) task.$(OBJEXT) \\\n\tvfat.$(OBJEXT) dlditool.$(OBJEXT) cache.$(OBJEXT) \\\n\tdirectory.$(OBJEXT) disc.$(OBJEXT) fatdir.$(OBJEXT) \\\n\tfatfile.$(OBJEXT) filetime.$(OBJEXT) \\\n\tfile_allocation_table.$(OBJEXT) libfat.$(OBJEXT) \\\n\tlibfat_public_api.$(OBJEXT) lock.$(OBJEXT) partition.$(OBJEXT) \\\n\ttinystr.$(OBJEXT) tinyxml.$(OBJEXT) tinyxmlerror.$(OBJEXT) \\\n\ttinyxmlparser.$(OBJEXT) addons.$(OBJEXT) slot2_mpcf.$(OBJEXT) \\\n\tslot2_paddle.$(OBJEXT) slot2_gbagame.$(OBJEXT) \\\n\tslot2_none.$(OBJEXT) slot2_rumblepak.$(OBJEXT) \\\n\tslot2_guitarGrip.$(OBJEXT) slot2_expMemory.$(OBJEXT) \\\n\tslot2_piano.$(OBJEXT) slot1_none.$(OBJEXT) slot1_r4.$(OBJEXT) \\\n\tslot1_retail.$(OBJEXT) slot1_retail_nand.$(OBJEXT) \\\n\tcheatSystem.$(OBJEXT) texcache.$(OBJEXT) rasterize.$(OBJEXT) \\\n\tmetaspu.$(OBJEXT) version.$(OBJEXT) desmume_config.$(OBJEXT) \\\n\t$(am__objects_1) $(am__objects_2) $(am__objects_3) \\\n\t$(am__objects_4) $(am__objects_5) $(am__objects_6) \\\n\t$(am__objects_7) $(am__objects_8) $(am__objects_9)\nlibdesmume_a_OBJECTS = $(am_libdesmume_a_OBJECTS)\nDEFAULT_INCLUDES = -I.@am__isrc@\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nCCLD = $(CC)\nLINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nCXXLD = $(CXX)\nCXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \\\n\t-o $@\nSOURCES = $(libdesmume_a_SOURCES)\nDIST_SOURCES = $(am__libdesmume_a_SOURCES_DIST)\nRECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \\\n\thtml-recursive info-recursive install-data-recursive \\\n\tinstall-dvi-recursive install-exec-recursive \\\n\tinstall-html-recursive install-info-recursive \\\n\tinstall-pdf-recursive install-ps-recursive install-recursive \\\n\tinstallcheck-recursive installdirs-recursive pdf-recursive \\\n\tps-recursive uninstall-recursive\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nAM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \\\n\t$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \\\n\tdistdir\nETAGS = etags\nCTAGS = ctags\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nACLOCAL = @ACLOCAL@\nALL_LINGUAS = @ALL_LINGUAS@\nALSA_CFLAGS = @ALSA_CFLAGS@\nALSA_LIBS = @ALSA_LIBS@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCATALOGS = @CATALOGS@\nCATOBJEXT = @CATOBJEXT@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDATADIRNAME = @DATADIRNAME@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nGETTEXT_PACKAGE = @GETTEXT_PACKAGE@\nGLADEUI_UNINSTALLED_DIR = @GLADEUI_UNINSTALLED_DIR@\nGLIB_CFLAGS = @GLIB_CFLAGS@\nGLIB_LIBS = @GLIB_LIBS@\nGMOFILES = @GMOFILES@\nGMSGFMT = @GMSGFMT@\nGREP = @GREP@\nGTHREAD_CFLAGS = @GTHREAD_CFLAGS@\nGTHREAD_LIBS = @GTHREAD_LIBS@\nGTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@\nGTKGLEXT_LIBS = @GTKGLEXT_LIBS@\nGTK_CFLAGS = @GTK_CFLAGS@\nGTK_LIBS = @GTK_LIBS@\nHAVE_PKG = @HAVE_PKG@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nINSTOBJEXT = @INSTOBJEXT@\nINTLLIBS = @INTLLIBS@\nINTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@\nINTLTOOL_MERGE = @INTLTOOL_MERGE@\nINTLTOOL_PERL = @INTLTOOL_PERL@\nINTLTOOL_UPDATE = @INTLTOOL_UPDATE@\nINTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@\nINTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@\nINTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@\nINTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@\nLDFLAGS = @LDFLAGS@\nLIBAGG_CFLAGS = @LIBAGG_CFLAGS@\nLIBAGG_LIBS = @LIBAGG_LIBS@\nLIBGLADE_CFLAGS = @LIBGLADE_CFLAGS@\nLIBGLADE_LIBS = @LIBGLADE_LIBS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBSOUNDTOUCH_CFLAGS = @LIBSOUNDTOUCH_CFLAGS@\nLIBSOUNDTOUCH_LIBS = @LIBSOUNDTOUCH_LIBS@\nLTLIBOBJS = @LTLIBOBJS@\nLUA_CFLAGS = @LUA_CFLAGS@\nLUA_LIBS = @LUA_LIBS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nMKINSTALLDIRS = @MKINSTALLDIRS@\nMSGFMT = @MSGFMT@\nMSGFMT_OPTS = @MSGFMT_OPTS@\nMSGMERGE = @MSGMERGE@\nOBJEXT = @OBJEXT@\nOSMESA_LIBS = @OSMESA_LIBS@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPKG_CONFIG = @PKG_CONFIG@\nPKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@\nPKG_CONFIG_PATH = @PKG_CONFIG_PATH@\nPOFILES = @POFILES@\nPOSUB = @POSUB@\nPO_DIR = @PO_DIR@\nPO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@\nPO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@\nRANLIB = @RANLIB@\nSDLCONFIG = @SDLCONFIG@\nSDL_CFLAGS = @SDL_CFLAGS@\nSDL_LIBS = @SDL_LIBS@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nUI_DIR = @UI_DIR@\nUPDATEDESKTOP = @UPDATEDESKTOP@\nUSE_MAINTAINER_MODE = @USE_MAINTAINER_MODE@\nUSE_NLS = @USE_NLS@\nVERSION = @VERSION@\nWX_CFLAGS = @WX_CFLAGS@\nWX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@\nWX_CONFIG_PATH = @WX_CONFIG_PATH@\nWX_CPPFLAGS = @WX_CPPFLAGS@\nWX_CXXFLAGS = @WX_CXXFLAGS@\nWX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@\nWX_LIBS = @WX_LIBS@\nWX_LIBS_STATIC = @WX_LIBS_STATIC@\nWX_RESCOMP = @WX_RESCOMP@\nWX_VERSION = @WX_VERSION@\nXGETTEXT = @XGETTEXT@\nXMKMF = @XMKMF@\nX_CFLAGS = @X_CFLAGS@\nX_EXTRA_LIBS = @X_EXTRA_LIBS@\nX_LIBS = @X_LIBS@\nX_PRE_LIBS = @X_PRE_LIBS@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndesmume_arch = @desmume_arch@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nintltool__v_merge_options_ = @intltool__v_merge_options_@\nintltool__v_merge_options_0 = @intltool__v_merge_options_0@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nAM_CFLAGS = \nAM_CPPFLAGS = -I$(top_srcdir)/src $(SDL_CFLAGS) $(GTHREAD_CFLAGS) \\\n\t$(X_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) \\\n\t$(LIBSOUNDTOUCH_CFLAGS) $(am__append_8)\nAM_LDFLAGS = \nEXTRA_DIST = build.bat instruction_tabdef.inc thumb_tabdef.inc fs-linux.cpp fs-windows.cpp cocoa\n@HAVE_GDB_STUB_FALSE@SUBDIRS = . $(UI_DIR)\n@HAVE_GDB_STUB_TRUE@SUBDIRS = . gdbstub $(UI_DIR)\nDIST_SUBDIRS = . gdbstub cli gtk gtk-glade wx\nnoinst_LIBRARIES = libdesmume.a\nlibdesmume_a_SOURCES = armcpu.cpp armcpu.h arm_instructions.cpp \\\n\tarm_instructions.h agg2d.h agg2d.inl bios.cpp bios.h bits.h \\\n\tcp15.cpp cp15.h commandline.h commandline.cpp common.cpp \\\n\tcommon.h debug.cpp debug.h Disassembler.cpp Disassembler.h \\\n\temufile.h emufile.cpp emufile_types.h FIFO.cpp FIFO.h \\\n\tfirmware.cpp firmware.h GPU.cpp GPU.h fs.h GPU_osd.h mem.h \\\n\tmc.cpp mc.h path.cpp path.h readwrite.cpp readwrite.h wifi.cpp \\\n\twifi.h mic.h MMU.cpp MMU.h MMU_timing.h NDSSystem.cpp \\\n\tNDSSystem.h registers.h OGLRender.h ROMReader.cpp ROMReader.h \\\n\trender3D.cpp render3D.h rtc.cpp rtc.h saves.cpp saves.h \\\n\tslot1.cpp slot1.h SPU.cpp SPU.h matrix.cpp matrix.h gfx3d.cpp \\\n\tgfx3d.h thumb_instructions.cpp thumb_instructions.h types.h \\\n\tshaders.h movie.cpp movie.h PACKED.h PACKED_END.h \\\n\tutils/datetime.cpp utils/datetime.h utils/ConvertUTF.c \\\n\tutils/ConvertUTF.h utils/guid.cpp utils/guid.h \\\n\tutils/emufat.cpp utils/emufat.h utils/emufat_types.h \\\n\tutils/md5.cpp utils/md5.h utils/valuearray.h utils/xstring.cpp \\\n\tutils/xstring.h utils/decrypt/crc.cpp utils/decrypt/crc.h \\\n\tutils/decrypt/decrypt.cpp utils/decrypt/decrypt.h \\\n\tutils/decrypt/header.cpp utils/decrypt/header.h utils/task.cpp \\\n\tutils/task.h utils/vfat.h utils/vfat.cpp utils/dlditool.cpp \\\n\tutils/libfat/bit_ops.h utils/libfat/cache.cpp \\\n\tutils/libfat/cache.h utils/libfat/common.h \\\n\tutils/libfat/directory.cpp utils/libfat/directory.h \\\n\tutils/libfat/disc.cpp utils/libfat/disc.h \\\n\tutils/libfat/disc_io.h utils/libfat/fat.h \\\n\tutils/libfat/fatdir.cpp utils/libfat/fatdir.h \\\n\tutils/libfat/fatfile.cpp utils/libfat/fatfile.h \\\n\tutils/libfat/filetime.cpp utils/libfat/filetime.h \\\n\tutils/libfat/file_allocation_table.cpp \\\n\tutils/libfat/file_allocation_table.h utils/libfat/libfat.cpp \\\n\tutils/libfat/libfat_pc.h utils/libfat/libfat_public_api.cpp \\\n\tutils/libfat/libfat_public_api.h utils/libfat/lock.cpp \\\n\tutils/libfat/lock.h utils/libfat/mem_allocate.h \\\n\tutils/libfat/partition.cpp utils/libfat/partition.h \\\n\tutils/tinyxml/tinystr.cpp utils/tinyxml/tinystr.h \\\n\tutils/tinyxml/tinyxml.cpp utils/tinyxml/tinyxml.h \\\n\tutils/tinyxml/tinyxmlerror.cpp utils/tinyxml/tinyxmlparser.cpp \\\n\taddons.cpp addons.h addons/slot2_mpcf.cpp \\\n\taddons/slot2_paddle.cpp addons/slot2_gbagame.cpp \\\n\taddons/slot2_none.cpp addons/slot2_rumblepak.cpp \\\n\taddons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp \\\n\taddons/slot2_piano.cpp addons/slot1_none.cpp \\\n\taddons/slot1_r4.cpp addons/slot1_retail.cpp \\\n\taddons/slot1_retail_nand.cpp cheatSystem.cpp cheatSystem.h \\\n\ttexcache.cpp texcache.h rasterize.cpp rasterize.h \\\n\tmetaspu/metaspu.cpp metaspu/metaspu.h version.cpp version.h \\\n\tdesmume_config.cpp desmume_config.h $(am__append_1) \\\n\t$(am__append_2) $(am__append_3) $(am__append_4) \\\n\t$(am__append_5) $(am__append_6) $(am__append_7) \\\n\t$(am__append_9) $(am__append_10)\nlibdesmume_a_LIBADD = fs-$(desmume_arch).$(OBJEXT)\nall: all-recursive\n\n.SUFFIXES:\n.SUFFIXES: .c .cpp .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src/desmume.mk $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --gnu src/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n$(top_srcdir)/src/desmume.mk:\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLIBRARIES:\n\t-test -z \"$(noinst_LIBRARIES)\" || rm -f $(noinst_LIBRARIES)\nlibdesmume.a: $(libdesmume_a_OBJECTS) $(libdesmume_a_DEPENDENCIES) $(EXTRA_libdesmume_a_DEPENDENCIES) \n\t-rm -f libdesmume.a\n\t$(libdesmume_a_AR) libdesmume.a $(libdesmume_a_OBJECTS) $(libdesmume_a_LIBADD)\n\t$(RANLIB) libdesmume.a\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConvertUTF.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Disassembler.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FIFO.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU_osd.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GPU_osd_stub.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MMU.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NDSSystem.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OGLRender.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ROMReader.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SPU.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SndOut.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Timestretcher.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addons.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aggdraw.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_instructions.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/armcpu.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bios.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheatSystem.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commandline.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp15.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datetime.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decrypt.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desmume_config.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directory.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disc.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlditool.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emufat.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emufile.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fatdir.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fatfile.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_allocation_table.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filetime.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/firmware.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx3d.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guid.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfat.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfat_public_api.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua-engine.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mc.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metaspu.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic_alsa.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mic_openal.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movie.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rasterize.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readwrite.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render3D.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtc.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/saves.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_none.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_r4.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_retail.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot1_retail_nand.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_expMemory.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_gbagame.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_guitarGrip.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_mpcf.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_none.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_paddle.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_piano.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slot2_rumblepak.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texcache.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumb_instructions.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinystr.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxml.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxmlerror.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxmlparser.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfat.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wifi.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstring.Po@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(COMPILE) -c $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(COMPILE) -c `$(CYGPATH_W) '$<'`\n\nConvertUTF.o: utils/ConvertUTF.c\n@am__fastdepCC_TRUE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ConvertUTF.o -MD -MP -MF $(DEPDIR)/ConvertUTF.Tpo -c -o ConvertUTF.o `test -f 'utils/ConvertUTF.c' || echo '$(srcdir)/'`utils/ConvertUTF.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/ConvertUTF.Tpo $(DEPDIR)/ConvertUTF.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='utils/ConvertUTF.c' object='ConvertUTF.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ConvertUTF.o `test -f 'utils/ConvertUTF.c' || echo '$(srcdir)/'`utils/ConvertUTF.c\n\nConvertUTF.obj: utils/ConvertUTF.c\n@am__fastdepCC_TRUE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ConvertUTF.obj -MD -MP -MF $(DEPDIR)/ConvertUTF.Tpo -c -o ConvertUTF.obj `if test -f 'utils/ConvertUTF.c'; then $(CYGPATH_W) 'utils/ConvertUTF.c'; else $(CYGPATH_W) '$(srcdir)/utils/ConvertUTF.c'; fi`\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/ConvertUTF.Tpo $(DEPDIR)/ConvertUTF.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='utils/ConvertUTF.c' object='ConvertUTF.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ConvertUTF.obj `if test -f 'utils/ConvertUTF.c'; then $(CYGPATH_W) 'utils/ConvertUTF.c'; else $(CYGPATH_W) '$(srcdir)/utils/ConvertUTF.c'; fi`\n\n.cpp.o:\n@am__fastdepCXX_TRUE@\t$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXXCOMPILE) -c -o $@ $<\n\n.cpp.obj:\n@am__fastdepCXX_TRUE@\t$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\ndatetime.o: utils/datetime.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT datetime.o -MD -MP -MF $(DEPDIR)/datetime.Tpo -c -o datetime.o `test -f 'utils/datetime.cpp' || echo '$(srcdir)/'`utils/datetime.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/datetime.Tpo $(DEPDIR)/datetime.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/datetime.cpp' object='datetime.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o datetime.o `test -f 'utils/datetime.cpp' || echo '$(srcdir)/'`utils/datetime.cpp\n\ndatetime.obj: utils/datetime.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT datetime.obj -MD -MP -MF $(DEPDIR)/datetime.Tpo -c -o datetime.obj `if test -f 'utils/datetime.cpp'; then $(CYGPATH_W) 'utils/datetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/datetime.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/datetime.Tpo $(DEPDIR)/datetime.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/datetime.cpp' object='datetime.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o datetime.obj `if test -f 'utils/datetime.cpp'; then $(CYGPATH_W) 'utils/datetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/datetime.cpp'; fi`\n\nguid.o: utils/guid.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT guid.o -MD -MP -MF $(DEPDIR)/guid.Tpo -c -o guid.o `test -f 'utils/guid.cpp' || echo '$(srcdir)/'`utils/guid.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/guid.Tpo $(DEPDIR)/guid.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/guid.cpp' object='guid.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o guid.o `test -f 'utils/guid.cpp' || echo '$(srcdir)/'`utils/guid.cpp\n\nguid.obj: utils/guid.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT guid.obj -MD -MP -MF $(DEPDIR)/guid.Tpo -c -o guid.obj `if test -f 'utils/guid.cpp'; then $(CYGPATH_W) 'utils/guid.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/guid.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/guid.Tpo $(DEPDIR)/guid.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/guid.cpp' object='guid.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o guid.obj `if test -f 'utils/guid.cpp'; then $(CYGPATH_W) 'utils/guid.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/guid.cpp'; fi`\n\nemufat.o: utils/emufat.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT emufat.o -MD -MP -MF $(DEPDIR)/emufat.Tpo -c -o emufat.o `test -f 'utils/emufat.cpp' || echo '$(srcdir)/'`utils/emufat.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/emufat.Tpo $(DEPDIR)/emufat.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/emufat.cpp' object='emufat.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o emufat.o `test -f 'utils/emufat.cpp' || echo '$(srcdir)/'`utils/emufat.cpp\n\nemufat.obj: utils/emufat.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT emufat.obj -MD -MP -MF $(DEPDIR)/emufat.Tpo -c -o emufat.obj `if test -f 'utils/emufat.cpp'; then $(CYGPATH_W) 'utils/emufat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/emufat.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/emufat.Tpo $(DEPDIR)/emufat.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/emufat.cpp' object='emufat.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o emufat.obj `if test -f 'utils/emufat.cpp'; then $(CYGPATH_W) 'utils/emufat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/emufat.cpp'; fi`\n\nmd5.o: utils/md5.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT md5.o -MD -MP -MF $(DEPDIR)/md5.Tpo -c -o md5.o `test -f 'utils/md5.cpp' || echo '$(srcdir)/'`utils/md5.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/md5.Tpo $(DEPDIR)/md5.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/md5.cpp' object='md5.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o md5.o `test -f 'utils/md5.cpp' || echo '$(srcdir)/'`utils/md5.cpp\n\nmd5.obj: utils/md5.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT md5.obj -MD -MP -MF $(DEPDIR)/md5.Tpo -c -o md5.obj `if test -f 'utils/md5.cpp'; then $(CYGPATH_W) 'utils/md5.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/md5.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/md5.Tpo $(DEPDIR)/md5.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/md5.cpp' object='md5.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o md5.obj `if test -f 'utils/md5.cpp'; then $(CYGPATH_W) 'utils/md5.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/md5.cpp'; fi`\n\nxstring.o: utils/xstring.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xstring.o -MD -MP -MF $(DEPDIR)/xstring.Tpo -c -o xstring.o `test -f 'utils/xstring.cpp' || echo '$(srcdir)/'`utils/xstring.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/xstring.Tpo $(DEPDIR)/xstring.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/xstring.cpp' object='xstring.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xstring.o `test -f 'utils/xstring.cpp' || echo '$(srcdir)/'`utils/xstring.cpp\n\nxstring.obj: utils/xstring.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT xstring.obj -MD -MP -MF $(DEPDIR)/xstring.Tpo -c -o xstring.obj `if test -f 'utils/xstring.cpp'; then $(CYGPATH_W) 'utils/xstring.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/xstring.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/xstring.Tpo $(DEPDIR)/xstring.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/xstring.cpp' object='xstring.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o xstring.obj `if test -f 'utils/xstring.cpp'; then $(CYGPATH_W) 'utils/xstring.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/xstring.cpp'; fi`\n\ncrc.o: utils/decrypt/crc.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc.o -MD -MP -MF $(DEPDIR)/crc.Tpo -c -o crc.o `test -f 'utils/decrypt/crc.cpp' || echo '$(srcdir)/'`utils/decrypt/crc.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/crc.Tpo $(DEPDIR)/crc.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/decrypt/crc.cpp' object='crc.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc.o `test -f 'utils/decrypt/crc.cpp' || echo '$(srcdir)/'`utils/decrypt/crc.cpp\n\ncrc.obj: utils/decrypt/crc.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc.obj -MD -MP -MF $(DEPDIR)/crc.Tpo -c -o crc.obj `if test -f 'utils/decrypt/crc.cpp'; then $(CYGPATH_W) 'utils/decrypt/crc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/crc.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/crc.Tpo $(DEPDIR)/crc.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/decrypt/crc.cpp' object='crc.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc.obj `if test -f 'utils/decrypt/crc.cpp'; then $(CYGPATH_W) 'utils/decrypt/crc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/crc.cpp'; fi`\n\ndecrypt.o: utils/decrypt/decrypt.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT decrypt.o -MD -MP -MF $(DEPDIR)/decrypt.Tpo -c -o decrypt.o `test -f 'utils/decrypt/decrypt.cpp' || echo '$(srcdir)/'`utils/decrypt/decrypt.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/decrypt.Tpo $(DEPDIR)/decrypt.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/decrypt/decrypt.cpp' object='decrypt.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o decrypt.o `test -f 'utils/decrypt/decrypt.cpp' || echo '$(srcdir)/'`utils/decrypt/decrypt.cpp\n\ndecrypt.obj: utils/decrypt/decrypt.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT decrypt.obj -MD -MP -MF $(DEPDIR)/decrypt.Tpo -c -o decrypt.obj `if test -f 'utils/decrypt/decrypt.cpp'; then $(CYGPATH_W) 'utils/decrypt/decrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/decrypt.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/decrypt.Tpo $(DEPDIR)/decrypt.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/decrypt/decrypt.cpp' object='decrypt.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o decrypt.obj `if test -f 'utils/decrypt/decrypt.cpp'; then $(CYGPATH_W) 'utils/decrypt/decrypt.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/decrypt.cpp'; fi`\n\nheader.o: utils/decrypt/header.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT header.o -MD -MP -MF $(DEPDIR)/header.Tpo -c -o header.o `test -f 'utils/decrypt/header.cpp' || echo '$(srcdir)/'`utils/decrypt/header.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/header.Tpo $(DEPDIR)/header.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/decrypt/header.cpp' object='header.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o header.o `test -f 'utils/decrypt/header.cpp' || echo '$(srcdir)/'`utils/decrypt/header.cpp\n\nheader.obj: utils/decrypt/header.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT header.obj -MD -MP -MF $(DEPDIR)/header.Tpo -c -o header.obj `if test -f 'utils/decrypt/header.cpp'; then $(CYGPATH_W) 'utils/decrypt/header.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/header.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/header.Tpo $(DEPDIR)/header.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/decrypt/header.cpp' object='header.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o header.obj `if test -f 'utils/decrypt/header.cpp'; then $(CYGPATH_W) 'utils/decrypt/header.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/decrypt/header.cpp'; fi`\n\ntask.o: utils/task.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT task.o -MD -MP -MF $(DEPDIR)/task.Tpo -c -o task.o `test -f 'utils/task.cpp' || echo '$(srcdir)/'`utils/task.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/task.Tpo $(DEPDIR)/task.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/task.cpp' object='task.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o task.o `test -f 'utils/task.cpp' || echo '$(srcdir)/'`utils/task.cpp\n\ntask.obj: utils/task.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT task.obj -MD -MP -MF $(DEPDIR)/task.Tpo -c -o task.obj `if test -f 'utils/task.cpp'; then $(CYGPATH_W) 'utils/task.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/task.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/task.Tpo $(DEPDIR)/task.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/task.cpp' object='task.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o task.obj `if test -f 'utils/task.cpp'; then $(CYGPATH_W) 'utils/task.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/task.cpp'; fi`\n\nvfat.o: utils/vfat.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vfat.o -MD -MP -MF $(DEPDIR)/vfat.Tpo -c -o vfat.o `test -f 'utils/vfat.cpp' || echo '$(srcdir)/'`utils/vfat.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/vfat.Tpo $(DEPDIR)/vfat.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/vfat.cpp' object='vfat.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vfat.o `test -f 'utils/vfat.cpp' || echo '$(srcdir)/'`utils/vfat.cpp\n\nvfat.obj: utils/vfat.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vfat.obj -MD -MP -MF $(DEPDIR)/vfat.Tpo -c -o vfat.obj `if test -f 'utils/vfat.cpp'; then $(CYGPATH_W) 'utils/vfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/vfat.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/vfat.Tpo $(DEPDIR)/vfat.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/vfat.cpp' object='vfat.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vfat.obj `if test -f 'utils/vfat.cpp'; then $(CYGPATH_W) 'utils/vfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/vfat.cpp'; fi`\n\ndlditool.o: utils/dlditool.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dlditool.o -MD -MP -MF $(DEPDIR)/dlditool.Tpo -c -o dlditool.o `test -f 'utils/dlditool.cpp' || echo '$(srcdir)/'`utils/dlditool.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/dlditool.Tpo $(DEPDIR)/dlditool.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/dlditool.cpp' object='dlditool.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dlditool.o `test -f 'utils/dlditool.cpp' || echo '$(srcdir)/'`utils/dlditool.cpp\n\ndlditool.obj: utils/dlditool.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dlditool.obj -MD -MP -MF $(DEPDIR)/dlditool.Tpo -c -o dlditool.obj `if test -f 'utils/dlditool.cpp'; then $(CYGPATH_W) 'utils/dlditool.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/dlditool.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/dlditool.Tpo $(DEPDIR)/dlditool.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/dlditool.cpp' object='dlditool.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dlditool.obj `if test -f 'utils/dlditool.cpp'; then $(CYGPATH_W) 'utils/dlditool.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/dlditool.cpp'; fi`\n\ncache.o: utils/libfat/cache.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cache.o -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.o `test -f 'utils/libfat/cache.cpp' || echo '$(srcdir)/'`utils/libfat/cache.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/cache.cpp' object='cache.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cache.o `test -f 'utils/libfat/cache.cpp' || echo '$(srcdir)/'`utils/libfat/cache.cpp\n\ncache.obj: utils/libfat/cache.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cache.obj -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.obj `if test -f 'utils/libfat/cache.cpp'; then $(CYGPATH_W) 'utils/libfat/cache.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/cache.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/cache.cpp' object='cache.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cache.obj `if test -f 'utils/libfat/cache.cpp'; then $(CYGPATH_W) 'utils/libfat/cache.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/cache.cpp'; fi`\n\ndirectory.o: utils/libfat/directory.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT directory.o -MD -MP -MF $(DEPDIR)/directory.Tpo -c -o directory.o `test -f 'utils/libfat/directory.cpp' || echo '$(srcdir)/'`utils/libfat/directory.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/directory.Tpo $(DEPDIR)/directory.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/directory.cpp' object='directory.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o directory.o `test -f 'utils/libfat/directory.cpp' || echo '$(srcdir)/'`utils/libfat/directory.cpp\n\ndirectory.obj: utils/libfat/directory.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT directory.obj -MD -MP -MF $(DEPDIR)/directory.Tpo -c -o directory.obj `if test -f 'utils/libfat/directory.cpp'; then $(CYGPATH_W) 'utils/libfat/directory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/directory.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/directory.Tpo $(DEPDIR)/directory.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/directory.cpp' object='directory.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o directory.obj `if test -f 'utils/libfat/directory.cpp'; then $(CYGPATH_W) 'utils/libfat/directory.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/directory.cpp'; fi`\n\ndisc.o: utils/libfat/disc.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT disc.o -MD -MP -MF $(DEPDIR)/disc.Tpo -c -o disc.o `test -f 'utils/libfat/disc.cpp' || echo '$(srcdir)/'`utils/libfat/disc.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/disc.Tpo $(DEPDIR)/disc.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/disc.cpp' object='disc.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o disc.o `test -f 'utils/libfat/disc.cpp' || echo '$(srcdir)/'`utils/libfat/disc.cpp\n\ndisc.obj: utils/libfat/disc.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT disc.obj -MD -MP -MF $(DEPDIR)/disc.Tpo -c -o disc.obj `if test -f 'utils/libfat/disc.cpp'; then $(CYGPATH_W) 'utils/libfat/disc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/disc.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/disc.Tpo $(DEPDIR)/disc.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/disc.cpp' object='disc.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o disc.obj `if test -f 'utils/libfat/disc.cpp'; then $(CYGPATH_W) 'utils/libfat/disc.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/disc.cpp'; fi`\n\nfatdir.o: utils/libfat/fatdir.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatdir.o -MD -MP -MF $(DEPDIR)/fatdir.Tpo -c -o fatdir.o `test -f 'utils/libfat/fatdir.cpp' || echo '$(srcdir)/'`utils/libfat/fatdir.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/fatdir.Tpo $(DEPDIR)/fatdir.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/fatdir.cpp' object='fatdir.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatdir.o `test -f 'utils/libfat/fatdir.cpp' || echo '$(srcdir)/'`utils/libfat/fatdir.cpp\n\nfatdir.obj: utils/libfat/fatdir.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatdir.obj -MD -MP -MF $(DEPDIR)/fatdir.Tpo -c -o fatdir.obj `if test -f 'utils/libfat/fatdir.cpp'; then $(CYGPATH_W) 'utils/libfat/fatdir.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatdir.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/fatdir.Tpo $(DEPDIR)/fatdir.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/fatdir.cpp' object='fatdir.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatdir.obj `if test -f 'utils/libfat/fatdir.cpp'; then $(CYGPATH_W) 'utils/libfat/fatdir.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatdir.cpp'; fi`\n\nfatfile.o: utils/libfat/fatfile.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatfile.o -MD -MP -MF $(DEPDIR)/fatfile.Tpo -c -o fatfile.o `test -f 'utils/libfat/fatfile.cpp' || echo '$(srcdir)/'`utils/libfat/fatfile.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/fatfile.Tpo $(DEPDIR)/fatfile.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/fatfile.cpp' object='fatfile.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatfile.o `test -f 'utils/libfat/fatfile.cpp' || echo '$(srcdir)/'`utils/libfat/fatfile.cpp\n\nfatfile.obj: utils/libfat/fatfile.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fatfile.obj -MD -MP -MF $(DEPDIR)/fatfile.Tpo -c -o fatfile.obj `if test -f 'utils/libfat/fatfile.cpp'; then $(CYGPATH_W) 'utils/libfat/fatfile.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatfile.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/fatfile.Tpo $(DEPDIR)/fatfile.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/fatfile.cpp' object='fatfile.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fatfile.obj `if test -f 'utils/libfat/fatfile.cpp'; then $(CYGPATH_W) 'utils/libfat/fatfile.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/fatfile.cpp'; fi`\n\nfiletime.o: utils/libfat/filetime.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT filetime.o -MD -MP -MF $(DEPDIR)/filetime.Tpo -c -o filetime.o `test -f 'utils/libfat/filetime.cpp' || echo '$(srcdir)/'`utils/libfat/filetime.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/filetime.Tpo $(DEPDIR)/filetime.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/filetime.cpp' object='filetime.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o filetime.o `test -f 'utils/libfat/filetime.cpp' || echo '$(srcdir)/'`utils/libfat/filetime.cpp\n\nfiletime.obj: utils/libfat/filetime.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT filetime.obj -MD -MP -MF $(DEPDIR)/filetime.Tpo -c -o filetime.obj `if test -f 'utils/libfat/filetime.cpp'; then $(CYGPATH_W) 'utils/libfat/filetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/filetime.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/filetime.Tpo $(DEPDIR)/filetime.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/filetime.cpp' object='filetime.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o filetime.obj `if test -f 'utils/libfat/filetime.cpp'; then $(CYGPATH_W) 'utils/libfat/filetime.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/filetime.cpp'; fi`\n\nfile_allocation_table.o: utils/libfat/file_allocation_table.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT file_allocation_table.o -MD -MP -MF $(DEPDIR)/file_allocation_table.Tpo -c -o file_allocation_table.o `test -f 'utils/libfat/file_allocation_table.cpp' || echo '$(srcdir)/'`utils/libfat/file_allocation_table.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/file_allocation_table.Tpo $(DEPDIR)/file_allocation_table.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/file_allocation_table.cpp' object='file_allocation_table.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o file_allocation_table.o `test -f 'utils/libfat/file_allocation_table.cpp' || echo '$(srcdir)/'`utils/libfat/file_allocation_table.cpp\n\nfile_allocation_table.obj: utils/libfat/file_allocation_table.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT file_allocation_table.obj -MD -MP -MF $(DEPDIR)/file_allocation_table.Tpo -c -o file_allocation_table.obj `if test -f 'utils/libfat/file_allocation_table.cpp'; then $(CYGPATH_W) 'utils/libfat/file_allocation_table.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/file_allocation_table.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/file_allocation_table.Tpo $(DEPDIR)/file_allocation_table.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/file_allocation_table.cpp' object='file_allocation_table.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o file_allocation_table.obj `if test -f 'utils/libfat/file_allocation_table.cpp'; then $(CYGPATH_W) 'utils/libfat/file_allocation_table.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/file_allocation_table.cpp'; fi`\n\nlibfat.o: utils/libfat/libfat.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat.o -MD -MP -MF $(DEPDIR)/libfat.Tpo -c -o libfat.o `test -f 'utils/libfat/libfat.cpp' || echo '$(srcdir)/'`utils/libfat/libfat.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/libfat.Tpo $(DEPDIR)/libfat.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/libfat.cpp' object='libfat.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat.o `test -f 'utils/libfat/libfat.cpp' || echo '$(srcdir)/'`utils/libfat/libfat.cpp\n\nlibfat.obj: utils/libfat/libfat.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat.obj -MD -MP -MF $(DEPDIR)/libfat.Tpo -c -o libfat.obj `if test -f 'utils/libfat/libfat.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/libfat.Tpo $(DEPDIR)/libfat.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/libfat.cpp' object='libfat.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat.obj `if test -f 'utils/libfat/libfat.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat.cpp'; fi`\n\nlibfat_public_api.o: utils/libfat/libfat_public_api.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat_public_api.o -MD -MP -MF $(DEPDIR)/libfat_public_api.Tpo -c -o libfat_public_api.o `test -f 'utils/libfat/libfat_public_api.cpp' || echo '$(srcdir)/'`utils/libfat/libfat_public_api.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/libfat_public_api.Tpo $(DEPDIR)/libfat_public_api.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/libfat_public_api.cpp' object='libfat_public_api.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat_public_api.o `test -f 'utils/libfat/libfat_public_api.cpp' || echo '$(srcdir)/'`utils/libfat/libfat_public_api.cpp\n\nlibfat_public_api.obj: utils/libfat/libfat_public_api.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libfat_public_api.obj -MD -MP -MF $(DEPDIR)/libfat_public_api.Tpo -c -o libfat_public_api.obj `if test -f 'utils/libfat/libfat_public_api.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat_public_api.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat_public_api.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/libfat_public_api.Tpo $(DEPDIR)/libfat_public_api.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/libfat_public_api.cpp' object='libfat_public_api.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libfat_public_api.obj `if test -f 'utils/libfat/libfat_public_api.cpp'; then $(CYGPATH_W) 'utils/libfat/libfat_public_api.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/libfat_public_api.cpp'; fi`\n\nlock.o: utils/libfat/lock.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lock.o -MD -MP -MF $(DEPDIR)/lock.Tpo -c -o lock.o `test -f 'utils/libfat/lock.cpp' || echo '$(srcdir)/'`utils/libfat/lock.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/lock.Tpo $(DEPDIR)/lock.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/lock.cpp' object='lock.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lock.o `test -f 'utils/libfat/lock.cpp' || echo '$(srcdir)/'`utils/libfat/lock.cpp\n\nlock.obj: utils/libfat/lock.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lock.obj -MD -MP -MF $(DEPDIR)/lock.Tpo -c -o lock.obj `if test -f 'utils/libfat/lock.cpp'; then $(CYGPATH_W) 'utils/libfat/lock.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/lock.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/lock.Tpo $(DEPDIR)/lock.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/lock.cpp' object='lock.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lock.obj `if test -f 'utils/libfat/lock.cpp'; then $(CYGPATH_W) 'utils/libfat/lock.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/lock.cpp'; fi`\n\npartition.o: utils/libfat/partition.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT partition.o -MD -MP -MF $(DEPDIR)/partition.Tpo -c -o partition.o `test -f 'utils/libfat/partition.cpp' || echo '$(srcdir)/'`utils/libfat/partition.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/partition.Tpo $(DEPDIR)/partition.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/partition.cpp' object='partition.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o partition.o `test -f 'utils/libfat/partition.cpp' || echo '$(srcdir)/'`utils/libfat/partition.cpp\n\npartition.obj: utils/libfat/partition.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT partition.obj -MD -MP -MF $(DEPDIR)/partition.Tpo -c -o partition.obj `if test -f 'utils/libfat/partition.cpp'; then $(CYGPATH_W) 'utils/libfat/partition.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/partition.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/partition.Tpo $(DEPDIR)/partition.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/libfat/partition.cpp' object='partition.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o partition.obj `if test -f 'utils/libfat/partition.cpp'; then $(CYGPATH_W) 'utils/libfat/partition.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/libfat/partition.cpp'; fi`\n\ntinystr.o: utils/tinyxml/tinystr.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinystr.o -MD -MP -MF $(DEPDIR)/tinystr.Tpo -c -o tinystr.o `test -f 'utils/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinystr.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinystr.Tpo $(DEPDIR)/tinystr.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinystr.cpp' object='tinystr.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinystr.o `test -f 'utils/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinystr.cpp\n\ntinystr.obj: utils/tinyxml/tinystr.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinystr.obj -MD -MP -MF $(DEPDIR)/tinystr.Tpo -c -o tinystr.obj `if test -f 'utils/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinystr.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinystr.Tpo $(DEPDIR)/tinystr.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinystr.cpp' object='tinystr.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinystr.obj `if test -f 'utils/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinystr.cpp'; fi`\n\ntinyxml.o: utils/tinyxml/tinyxml.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxml.o -MD -MP -MF $(DEPDIR)/tinyxml.Tpo -c -o tinyxml.o `test -f 'utils/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxml.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinyxml.Tpo $(DEPDIR)/tinyxml.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinyxml.cpp' object='tinyxml.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxml.o `test -f 'utils/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxml.cpp\n\ntinyxml.obj: utils/tinyxml/tinyxml.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxml.obj -MD -MP -MF $(DEPDIR)/tinyxml.Tpo -c -o tinyxml.obj `if test -f 'utils/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxml.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinyxml.Tpo $(DEPDIR)/tinyxml.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinyxml.cpp' object='tinyxml.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxml.obj `if test -f 'utils/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxml.cpp'; fi`\n\ntinyxmlerror.o: utils/tinyxml/tinyxmlerror.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlerror.o -MD -MP -MF $(DEPDIR)/tinyxmlerror.Tpo -c -o tinyxmlerror.o `test -f 'utils/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlerror.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinyxmlerror.Tpo $(DEPDIR)/tinyxmlerror.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinyxmlerror.cpp' object='tinyxmlerror.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlerror.o `test -f 'utils/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlerror.cpp\n\ntinyxmlerror.obj: utils/tinyxml/tinyxmlerror.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlerror.obj -MD -MP -MF $(DEPDIR)/tinyxmlerror.Tpo -c -o tinyxmlerror.obj `if test -f 'utils/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlerror.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinyxmlerror.Tpo $(DEPDIR)/tinyxmlerror.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinyxmlerror.cpp' object='tinyxmlerror.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlerror.obj `if test -f 'utils/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlerror.cpp'; fi`\n\ntinyxmlparser.o: utils/tinyxml/tinyxmlparser.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlparser.o -MD -MP -MF $(DEPDIR)/tinyxmlparser.Tpo -c -o tinyxmlparser.o `test -f 'utils/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlparser.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinyxmlparser.Tpo $(DEPDIR)/tinyxmlparser.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinyxmlparser.cpp' object='tinyxmlparser.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlparser.o `test -f 'utils/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`utils/tinyxml/tinyxmlparser.cpp\n\ntinyxmlparser.obj: utils/tinyxml/tinyxmlparser.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlparser.obj -MD -MP -MF $(DEPDIR)/tinyxmlparser.Tpo -c -o tinyxmlparser.obj `if test -f 'utils/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlparser.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/tinyxmlparser.Tpo $(DEPDIR)/tinyxmlparser.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='utils/tinyxml/tinyxmlparser.cpp' object='tinyxmlparser.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlparser.obj `if test -f 'utils/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'utils/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/utils/tinyxml/tinyxmlparser.cpp'; fi`\n\nslot2_mpcf.o: addons/slot2_mpcf.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_mpcf.o -MD -MP -MF $(DEPDIR)/slot2_mpcf.Tpo -c -o slot2_mpcf.o `test -f 'addons/slot2_mpcf.cpp' || echo '$(srcdir)/'`addons/slot2_mpcf.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_mpcf.Tpo $(DEPDIR)/slot2_mpcf.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_mpcf.cpp' object='slot2_mpcf.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_mpcf.o `test -f 'addons/slot2_mpcf.cpp' || echo '$(srcdir)/'`addons/slot2_mpcf.cpp\n\nslot2_mpcf.obj: addons/slot2_mpcf.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_mpcf.obj -MD -MP -MF $(DEPDIR)/slot2_mpcf.Tpo -c -o slot2_mpcf.obj `if test -f 'addons/slot2_mpcf.cpp'; then $(CYGPATH_W) 'addons/slot2_mpcf.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_mpcf.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_mpcf.Tpo $(DEPDIR)/slot2_mpcf.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_mpcf.cpp' object='slot2_mpcf.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_mpcf.obj `if test -f 'addons/slot2_mpcf.cpp'; then $(CYGPATH_W) 'addons/slot2_mpcf.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_mpcf.cpp'; fi`\n\nslot2_paddle.o: addons/slot2_paddle.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_paddle.o -MD -MP -MF $(DEPDIR)/slot2_paddle.Tpo -c -o slot2_paddle.o `test -f 'addons/slot2_paddle.cpp' || echo '$(srcdir)/'`addons/slot2_paddle.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_paddle.Tpo $(DEPDIR)/slot2_paddle.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_paddle.cpp' object='slot2_paddle.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_paddle.o `test -f 'addons/slot2_paddle.cpp' || echo '$(srcdir)/'`addons/slot2_paddle.cpp\n\nslot2_paddle.obj: addons/slot2_paddle.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_paddle.obj -MD -MP -MF $(DEPDIR)/slot2_paddle.Tpo -c -o slot2_paddle.obj `if test -f 'addons/slot2_paddle.cpp'; then $(CYGPATH_W) 'addons/slot2_paddle.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_paddle.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_paddle.Tpo $(DEPDIR)/slot2_paddle.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_paddle.cpp' object='slot2_paddle.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_paddle.obj `if test -f 'addons/slot2_paddle.cpp'; then $(CYGPATH_W) 'addons/slot2_paddle.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_paddle.cpp'; fi`\n\nslot2_gbagame.o: addons/slot2_gbagame.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_gbagame.o -MD -MP -MF $(DEPDIR)/slot2_gbagame.Tpo -c -o slot2_gbagame.o `test -f 'addons/slot2_gbagame.cpp' || echo '$(srcdir)/'`addons/slot2_gbagame.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_gbagame.Tpo $(DEPDIR)/slot2_gbagame.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_gbagame.cpp' object='slot2_gbagame.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_gbagame.o `test -f 'addons/slot2_gbagame.cpp' || echo '$(srcdir)/'`addons/slot2_gbagame.cpp\n\nslot2_gbagame.obj: addons/slot2_gbagame.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_gbagame.obj -MD -MP -MF $(DEPDIR)/slot2_gbagame.Tpo -c -o slot2_gbagame.obj `if test -f 'addons/slot2_gbagame.cpp'; then $(CYGPATH_W) 'addons/slot2_gbagame.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_gbagame.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_gbagame.Tpo $(DEPDIR)/slot2_gbagame.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_gbagame.cpp' object='slot2_gbagame.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_gbagame.obj `if test -f 'addons/slot2_gbagame.cpp'; then $(CYGPATH_W) 'addons/slot2_gbagame.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_gbagame.cpp'; fi`\n\nslot2_none.o: addons/slot2_none.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_none.o -MD -MP -MF $(DEPDIR)/slot2_none.Tpo -c -o slot2_none.o `test -f 'addons/slot2_none.cpp' || echo '$(srcdir)/'`addons/slot2_none.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_none.Tpo $(DEPDIR)/slot2_none.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_none.cpp' object='slot2_none.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_none.o `test -f 'addons/slot2_none.cpp' || echo '$(srcdir)/'`addons/slot2_none.cpp\n\nslot2_none.obj: addons/slot2_none.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_none.obj -MD -MP -MF $(DEPDIR)/slot2_none.Tpo -c -o slot2_none.obj `if test -f 'addons/slot2_none.cpp'; then $(CYGPATH_W) 'addons/slot2_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_none.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_none.Tpo $(DEPDIR)/slot2_none.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_none.cpp' object='slot2_none.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_none.obj `if test -f 'addons/slot2_none.cpp'; then $(CYGPATH_W) 'addons/slot2_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_none.cpp'; fi`\n\nslot2_rumblepak.o: addons/slot2_rumblepak.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_rumblepak.o -MD -MP -MF $(DEPDIR)/slot2_rumblepak.Tpo -c -o slot2_rumblepak.o `test -f 'addons/slot2_rumblepak.cpp' || echo '$(srcdir)/'`addons/slot2_rumblepak.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_rumblepak.Tpo $(DEPDIR)/slot2_rumblepak.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_rumblepak.cpp' object='slot2_rumblepak.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_rumblepak.o `test -f 'addons/slot2_rumblepak.cpp' || echo '$(srcdir)/'`addons/slot2_rumblepak.cpp\n\nslot2_rumblepak.obj: addons/slot2_rumblepak.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_rumblepak.obj -MD -MP -MF $(DEPDIR)/slot2_rumblepak.Tpo -c -o slot2_rumblepak.obj `if test -f 'addons/slot2_rumblepak.cpp'; then $(CYGPATH_W) 'addons/slot2_rumblepak.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_rumblepak.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_rumblepak.Tpo $(DEPDIR)/slot2_rumblepak.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_rumblepak.cpp' object='slot2_rumblepak.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_rumblepak.obj `if test -f 'addons/slot2_rumblepak.cpp'; then $(CYGPATH_W) 'addons/slot2_rumblepak.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_rumblepak.cpp'; fi`\n\nslot2_guitarGrip.o: addons/slot2_guitarGrip.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_guitarGrip.o -MD -MP -MF $(DEPDIR)/slot2_guitarGrip.Tpo -c -o slot2_guitarGrip.o `test -f 'addons/slot2_guitarGrip.cpp' || echo '$(srcdir)/'`addons/slot2_guitarGrip.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_guitarGrip.Tpo $(DEPDIR)/slot2_guitarGrip.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_guitarGrip.cpp' object='slot2_guitarGrip.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_guitarGrip.o `test -f 'addons/slot2_guitarGrip.cpp' || echo '$(srcdir)/'`addons/slot2_guitarGrip.cpp\n\nslot2_guitarGrip.obj: addons/slot2_guitarGrip.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_guitarGrip.obj -MD -MP -MF $(DEPDIR)/slot2_guitarGrip.Tpo -c -o slot2_guitarGrip.obj `if test -f 'addons/slot2_guitarGrip.cpp'; then $(CYGPATH_W) 'addons/slot2_guitarGrip.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_guitarGrip.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_guitarGrip.Tpo $(DEPDIR)/slot2_guitarGrip.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_guitarGrip.cpp' object='slot2_guitarGrip.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_guitarGrip.obj `if test -f 'addons/slot2_guitarGrip.cpp'; then $(CYGPATH_W) 'addons/slot2_guitarGrip.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_guitarGrip.cpp'; fi`\n\nslot2_expMemory.o: addons/slot2_expMemory.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_expMemory.o -MD -MP -MF $(DEPDIR)/slot2_expMemory.Tpo -c -o slot2_expMemory.o `test -f 'addons/slot2_expMemory.cpp' || echo '$(srcdir)/'`addons/slot2_expMemory.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_expMemory.Tpo $(DEPDIR)/slot2_expMemory.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_expMemory.cpp' object='slot2_expMemory.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_expMemory.o `test -f 'addons/slot2_expMemory.cpp' || echo '$(srcdir)/'`addons/slot2_expMemory.cpp\n\nslot2_expMemory.obj: addons/slot2_expMemory.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_expMemory.obj -MD -MP -MF $(DEPDIR)/slot2_expMemory.Tpo -c -o slot2_expMemory.obj `if test -f 'addons/slot2_expMemory.cpp'; then $(CYGPATH_W) 'addons/slot2_expMemory.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_expMemory.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_expMemory.Tpo $(DEPDIR)/slot2_expMemory.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_expMemory.cpp' object='slot2_expMemory.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_expMemory.obj `if test -f 'addons/slot2_expMemory.cpp'; then $(CYGPATH_W) 'addons/slot2_expMemory.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_expMemory.cpp'; fi`\n\nslot2_piano.o: addons/slot2_piano.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_piano.o -MD -MP -MF $(DEPDIR)/slot2_piano.Tpo -c -o slot2_piano.o `test -f 'addons/slot2_piano.cpp' || echo '$(srcdir)/'`addons/slot2_piano.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_piano.Tpo $(DEPDIR)/slot2_piano.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_piano.cpp' object='slot2_piano.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_piano.o `test -f 'addons/slot2_piano.cpp' || echo '$(srcdir)/'`addons/slot2_piano.cpp\n\nslot2_piano.obj: addons/slot2_piano.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot2_piano.obj -MD -MP -MF $(DEPDIR)/slot2_piano.Tpo -c -o slot2_piano.obj `if test -f 'addons/slot2_piano.cpp'; then $(CYGPATH_W) 'addons/slot2_piano.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_piano.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot2_piano.Tpo $(DEPDIR)/slot2_piano.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot2_piano.cpp' object='slot2_piano.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot2_piano.obj `if test -f 'addons/slot2_piano.cpp'; then $(CYGPATH_W) 'addons/slot2_piano.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot2_piano.cpp'; fi`\n\nslot1_none.o: addons/slot1_none.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_none.o -MD -MP -MF $(DEPDIR)/slot1_none.Tpo -c -o slot1_none.o `test -f 'addons/slot1_none.cpp' || echo '$(srcdir)/'`addons/slot1_none.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_none.Tpo $(DEPDIR)/slot1_none.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_none.cpp' object='slot1_none.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_none.o `test -f 'addons/slot1_none.cpp' || echo '$(srcdir)/'`addons/slot1_none.cpp\n\nslot1_none.obj: addons/slot1_none.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_none.obj -MD -MP -MF $(DEPDIR)/slot1_none.Tpo -c -o slot1_none.obj `if test -f 'addons/slot1_none.cpp'; then $(CYGPATH_W) 'addons/slot1_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_none.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_none.Tpo $(DEPDIR)/slot1_none.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_none.cpp' object='slot1_none.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_none.obj `if test -f 'addons/slot1_none.cpp'; then $(CYGPATH_W) 'addons/slot1_none.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_none.cpp'; fi`\n\nslot1_r4.o: addons/slot1_r4.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_r4.o -MD -MP -MF $(DEPDIR)/slot1_r4.Tpo -c -o slot1_r4.o `test -f 'addons/slot1_r4.cpp' || echo '$(srcdir)/'`addons/slot1_r4.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_r4.Tpo $(DEPDIR)/slot1_r4.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_r4.cpp' object='slot1_r4.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_r4.o `test -f 'addons/slot1_r4.cpp' || echo '$(srcdir)/'`addons/slot1_r4.cpp\n\nslot1_r4.obj: addons/slot1_r4.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_r4.obj -MD -MP -MF $(DEPDIR)/slot1_r4.Tpo -c -o slot1_r4.obj `if test -f 'addons/slot1_r4.cpp'; then $(CYGPATH_W) 'addons/slot1_r4.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_r4.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_r4.Tpo $(DEPDIR)/slot1_r4.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_r4.cpp' object='slot1_r4.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_r4.obj `if test -f 'addons/slot1_r4.cpp'; then $(CYGPATH_W) 'addons/slot1_r4.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_r4.cpp'; fi`\n\nslot1_retail.o: addons/slot1_retail.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail.o -MD -MP -MF $(DEPDIR)/slot1_retail.Tpo -c -o slot1_retail.o `test -f 'addons/slot1_retail.cpp' || echo '$(srcdir)/'`addons/slot1_retail.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_retail.Tpo $(DEPDIR)/slot1_retail.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_retail.cpp' object='slot1_retail.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail.o `test -f 'addons/slot1_retail.cpp' || echo '$(srcdir)/'`addons/slot1_retail.cpp\n\nslot1_retail.obj: addons/slot1_retail.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail.obj -MD -MP -MF $(DEPDIR)/slot1_retail.Tpo -c -o slot1_retail.obj `if test -f 'addons/slot1_retail.cpp'; then $(CYGPATH_W) 'addons/slot1_retail.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_retail.Tpo $(DEPDIR)/slot1_retail.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_retail.cpp' object='slot1_retail.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail.obj `if test -f 'addons/slot1_retail.cpp'; then $(CYGPATH_W) 'addons/slot1_retail.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail.cpp'; fi`\n\nslot1_retail_nand.o: addons/slot1_retail_nand.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail_nand.o -MD -MP -MF $(DEPDIR)/slot1_retail_nand.Tpo -c -o slot1_retail_nand.o `test -f 'addons/slot1_retail_nand.cpp' || echo '$(srcdir)/'`addons/slot1_retail_nand.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_retail_nand.Tpo $(DEPDIR)/slot1_retail_nand.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_retail_nand.cpp' object='slot1_retail_nand.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail_nand.o `test -f 'addons/slot1_retail_nand.cpp' || echo '$(srcdir)/'`addons/slot1_retail_nand.cpp\n\nslot1_retail_nand.obj: addons/slot1_retail_nand.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT slot1_retail_nand.obj -MD -MP -MF $(DEPDIR)/slot1_retail_nand.Tpo -c -o slot1_retail_nand.obj `if test -f 'addons/slot1_retail_nand.cpp'; then $(CYGPATH_W) 'addons/slot1_retail_nand.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail_nand.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/slot1_retail_nand.Tpo $(DEPDIR)/slot1_retail_nand.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='addons/slot1_retail_nand.cpp' object='slot1_retail_nand.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o slot1_retail_nand.obj `if test -f 'addons/slot1_retail_nand.cpp'; then $(CYGPATH_W) 'addons/slot1_retail_nand.cpp'; else $(CYGPATH_W) '$(srcdir)/addons/slot1_retail_nand.cpp'; fi`\n\nmetaspu.o: metaspu/metaspu.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT metaspu.o -MD -MP -MF $(DEPDIR)/metaspu.Tpo -c -o metaspu.o `test -f 'metaspu/metaspu.cpp' || echo '$(srcdir)/'`metaspu/metaspu.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/metaspu.Tpo $(DEPDIR)/metaspu.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='metaspu/metaspu.cpp' object='metaspu.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o metaspu.o `test -f 'metaspu/metaspu.cpp' || echo '$(srcdir)/'`metaspu/metaspu.cpp\n\nmetaspu.obj: metaspu/metaspu.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT metaspu.obj -MD -MP -MF $(DEPDIR)/metaspu.Tpo -c -o metaspu.obj `if test -f 'metaspu/metaspu.cpp'; then $(CYGPATH_W) 'metaspu/metaspu.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/metaspu.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/metaspu.Tpo $(DEPDIR)/metaspu.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='metaspu/metaspu.cpp' object='metaspu.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o metaspu.obj `if test -f 'metaspu/metaspu.cpp'; then $(CYGPATH_W) 'metaspu/metaspu.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/metaspu.cpp'; fi`\n\nSndOut.o: metaspu/SndOut.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SndOut.o -MD -MP -MF $(DEPDIR)/SndOut.Tpo -c -o SndOut.o `test -f 'metaspu/SndOut.cpp' || echo '$(srcdir)/'`metaspu/SndOut.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/SndOut.Tpo $(DEPDIR)/SndOut.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='metaspu/SndOut.cpp' object='SndOut.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SndOut.o `test -f 'metaspu/SndOut.cpp' || echo '$(srcdir)/'`metaspu/SndOut.cpp\n\nSndOut.obj: metaspu/SndOut.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SndOut.obj -MD -MP -MF $(DEPDIR)/SndOut.Tpo -c -o SndOut.obj `if test -f 'metaspu/SndOut.cpp'; then $(CYGPATH_W) 'metaspu/SndOut.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/SndOut.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/SndOut.Tpo $(DEPDIR)/SndOut.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='metaspu/SndOut.cpp' object='SndOut.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SndOut.obj `if test -f 'metaspu/SndOut.cpp'; then $(CYGPATH_W) 'metaspu/SndOut.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/SndOut.cpp'; fi`\n\nTimestretcher.o: metaspu/Timestretcher.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Timestretcher.o -MD -MP -MF $(DEPDIR)/Timestretcher.Tpo -c -o Timestretcher.o `test -f 'metaspu/Timestretcher.cpp' || echo '$(srcdir)/'`metaspu/Timestretcher.cpp\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/Timestretcher.Tpo $(DEPDIR)/Timestretcher.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='metaspu/Timestretcher.cpp' object='Timestretcher.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Timestretcher.o `test -f 'metaspu/Timestretcher.cpp' || echo '$(srcdir)/'`metaspu/Timestretcher.cpp\n\nTimestretcher.obj: metaspu/Timestretcher.cpp\n@am__fastdepCXX_TRUE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Timestretcher.obj -MD -MP -MF $(DEPDIR)/Timestretcher.Tpo -c -o Timestretcher.obj `if test -f 'metaspu/Timestretcher.cpp'; then $(CYGPATH_W) 'metaspu/Timestretcher.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/Timestretcher.cpp'; fi`\n@am__fastdepCXX_TRUE@\t$(am__mv) $(DEPDIR)/Timestretcher.Tpo $(DEPDIR)/Timestretcher.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tsource='metaspu/Timestretcher.cpp' object='Timestretcher.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Timestretcher.obj `if test -f 'metaspu/Timestretcher.cpp'; then $(CYGPATH_W) 'metaspu/Timestretcher.cpp'; else $(CYGPATH_W) '$(srcdir)/metaspu/Timestretcher.cpp'; fi`\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run `make' without going through this Makefile.\n# To change the values of `make' variables: instead of editing Makefiles,\n# (1) if the variable is set in `config.status', edit `config.status'\n#     (which will cause the Makefiles to be regenerated when you run `make');\n# (2) otherwise, pass the desired values on the `make' command line.\n$(RECURSIVE_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\n$(RECURSIVE_CLEAN_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\trev=''; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = \".\"; then :; else \\\n\t    rev=\"$$subdir $$rev\"; \\\n\t  fi; \\\n\tdone; \\\n\trev=\"$$rev .\"; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tfor subdir in $$rev; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone && test -z \"$$fail\"\ntags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \\\n\tdone\nctags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \\\n\tdone\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    $(am__make_dryrun) \\\n\t      || test -d \"$(distdir)/$$subdir\" \\\n\t      || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t      || exit 1; \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-recursive\nall-am: Makefile $(LIBRARIES)\ninstalldirs: installdirs-recursive\ninstalldirs-am:\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am:\n\n.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \\\n\tinstall-am install-strip tags-recursive\n\n.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \\\n\tall all-am check check-am clean clean-generic \\\n\tclean-noinstLIBRARIES ctags ctags-recursive distclean \\\n\tdistclean-compile distclean-generic distclean-tags distdir dvi \\\n\tdvi-am html html-am info info-am install install-am \\\n\tinstall-data install-data-am install-dvi install-dvi-am \\\n\tinstall-exec install-exec-am install-html install-html-am \\\n\tinstall-info install-info-am install-man install-pdf \\\n\tinstall-pdf-am install-ps install-ps-am install-strip \\\n\tinstallcheck installcheck-am installdirs installdirs-am \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \\\n\ttags tags-recursive uninstall uninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/NDSSystem.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <string.h>\n#include <stdlib.h>\n#include <algorithm>\n#include <math.h>\n#include <zlib.h>\n\n#include \"common.h\"\n#include \"NDSSystem.h\"\n#include \"render3D.h\"\n#include \"MMU.h\"\n#include \"ROMReader.h\"\n#include \"gfx3d.h\"\n#include \"utils/decrypt/decrypt.h\"\n#include \"utils/decrypt/crc.h\"\n#include \"cp15.h\"\n#include \"bios.h\"\n#include \"debug.h\"\n#include \"cheatSystem.h\"\n#include \"movie.h\"\n#include \"Disassembler.h\"\n#include \"readwrite.h\"\n#include \"debug.h\"\n#include \"firmware.h\"\n#include \"version.h\"\n#include \"slot1.h\"\n\n#include \"path.h\"\n\n//int xxctr=0;\n//#define LOG_ARM9\n//#define LOG_ARM7\n//#define dolog (currFrameCounter>15)\n//bool dolog=true;\n//#define LOG_TO_FILE\n//#define LOG_TO_FILE_REGS\n\n//===============================================================\nFILE *fp_dis7 = NULL;\nFILE *fp_dis9 = NULL;\n\nPathInfo path;\n\nTCommonSettings CommonSettings;\nstatic BaseDriver _stub_driver;\nBaseDriver* driver = &_stub_driver;\nstd::string InputDisplayString;\n\nstatic BOOL LidClosed = FALSE;\nstatic u8\tcountLid = 0;\n\nGameInfo gameInfo;\nNDSSystem nds;\nCFIRMWARE\t*firmware = NULL;\nADVANsCEne\tadvsc;\n\nusing std::min;\nusing std::max;\n\nbool singleStep;\nbool nds_debug_continuing[2];\nint lagframecounter;\nint LagFrameFlag;\nint lastLag;\nint TotalLagFrames;\nu64 sequencerNext = 0;\n\nTSCalInfo TSCal;\n\nnamespace DLDI\n{\n\tbool tryPatch(void* data, size_t size);\n}\n\nvoid Desmume_InitOnce()\n{\n\tstatic bool initOnce = false;\n\tif(initOnce) return;\n\tinitOnce = true;\n\n#ifdef HAVE_LIBAGG\n\textern void Agg_init(); //no need to include just for this\n\tAgg_init();\n#endif\n}\n\n#ifdef GDB_STUB\nint NDS_Init( struct armcpu_memory_iface *arm9_mem_if,\nstruct armcpu_ctrl_iface **arm9_ctrl_iface,\nstruct armcpu_memory_iface *arm7_mem_if,\nstruct armcpu_ctrl_iface **arm7_ctrl_iface)\n#else\nint NDS_Init( void)\n#endif\n{\n\tnds.idleFrameCounter = 0;\n\tmemset(nds.runCycleCollector,0,sizeof(nds.runCycleCollector));\n\tMMU_Init();\n\tnds.VCount = 0;\n\n\t//got to print this somewhere..\n\tprintf(\"%s\\n\", EMU_DESMUME_NAME_AND_VERSION());\n\n\tif (Screen_Init(0) != 0)\n\t\treturn -1;\n\n#ifdef HAVE_JIT\n\tJitLutInit();\n#endif\n\n\tgfx3d_init();\n\n#ifdef GDB_STUB\n\tarmcpu_new(&NDS_ARM7,1, arm7_mem_if, arm7_ctrl_iface);\n\tarmcpu_new(&NDS_ARM9,0, arm9_mem_if, arm9_ctrl_iface);\n#else\n\tarmcpu_new(&NDS_ARM7,1);\n\tarmcpu_new(&NDS_ARM9,0);\n#endif\n\n\tif (SPU_Init(SNDCORE_DUMMY, 740) != 0)\n\t\treturn -1;\n\n\tWIFI_Init() ;\n\n\t// Init calibration info\n\tTSCal.adc.x1 = 0x0200;\n\tTSCal.adc.y1 = 0x0200;\n\tTSCal.scr.x1 = 0x20 + 1; // calibration screen coords are 1-based,\n\tTSCal.scr.y1 = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong.\n\tTSCal.adc.x2 = 0x0E00;\n\tTSCal.adc.y2 = 0x0800;\n\tTSCal.scr.x2 = 0xE0 + 1;\n\tTSCal.scr.y2 = 0x80 + 1;\n\tTSCal.adc.width = (TSCal.adc.x2 - TSCal.adc.x1);\n\tTSCal.adc.height = (TSCal.adc.y2 - TSCal.adc.y1);\n\tTSCal.scr.width = (TSCal.scr.x2 - TSCal.scr.x1);\n\tTSCal.scr.height = (TSCal.scr.y2 - TSCal.scr.y1);\n\n\tcheats = new CHEATS();\n\tcheatSearch = new CHEATSEARCH();\n\n\treturn 0;\n}\n\nvoid NDS_DeInit(void) {\n\tif(MMU.CART_ROM != MMU.UNUSED_RAM)\n\t\tNDS_FreeROM();\n\n\tSPU_DeInit();\n\tScreen_DeInit();\n\tMMU_DeInit();\n\tgpu3D->NDS_3D_Close();\n\n\tWIFI_DeInit();\n\tif (cheats)\n\t\tdelete cheats;\n\tif (cheatSearch)\n\t\tdelete cheatSearch;\n\n#ifdef HAVE_JIT\n\tif (arm_cpubase)\n\t\tarm_cpubase->Shutdown();\n\n\tJitLutDeInit();\n#endif\n\n#ifdef LOG_ARM7\n\tif (fp_dis7 != NULL) \n\t{\n\t\tfclose(fp_dis7);\n\t\tfp_dis7 = NULL;\n\t}\n#endif\n\n#ifdef LOG_ARM9\n\tif (fp_dis9 != NULL) \n\t{\n\t\tfclose(fp_dis9);\n\t\tfp_dis9 = NULL;\n\t}\n#endif\n}\n\nBOOL NDS_SetROM(u8 * rom, u32 mask)\n{\n\tMMU_setRom(rom, mask);\n\n\treturn TRUE;\n} \n\nNDS_header * NDS_getROMHeader(void)\n{\n\tif(MMU.CART_ROM == MMU.UNUSED_RAM) return NULL;\n\tNDS_header * header = new NDS_header;\n\n\tmemcpy(header->gameTile, MMU.CART_ROM, 12);\n\tmemcpy(header->gameCode, MMU.CART_ROM + 12, 4);\n\theader->makerCode = T1ReadWord(MMU.CART_ROM, 16);\n\theader->unitCode = MMU.CART_ROM[18];\n\theader->deviceCode = MMU.CART_ROM[19];\n\theader->cardSize = MMU.CART_ROM[20];\n\tmemcpy(header->cardInfo, MMU.CART_ROM + 21, 8);\n\theader->flags = MMU.CART_ROM[29];\n\theader->romversion = MMU.CART_ROM[30];\n\theader->ARM9src = T1ReadLong(MMU.CART_ROM, 32);\n\theader->ARM9exe = T1ReadLong(MMU.CART_ROM, 36);\n\theader->ARM9cpy = T1ReadLong(MMU.CART_ROM, 40);\n\theader->ARM9binSize = T1ReadLong(MMU.CART_ROM, 44);\n\theader->ARM7src = T1ReadLong(MMU.CART_ROM, 48);\n\theader->ARM7exe = T1ReadLong(MMU.CART_ROM, 52);\n\theader->ARM7cpy = T1ReadLong(MMU.CART_ROM, 56);\n\theader->ARM7binSize = T1ReadLong(MMU.CART_ROM, 60);\n\theader->FNameTblOff = T1ReadLong(MMU.CART_ROM, 64);\n\theader->FNameTblSize = T1ReadLong(MMU.CART_ROM, 68);\n\theader->FATOff = T1ReadLong(MMU.CART_ROM, 72);\n\theader->FATSize = T1ReadLong(MMU.CART_ROM, 76);\n\theader->ARM9OverlayOff = T1ReadLong(MMU.CART_ROM, 80);\n\theader->ARM9OverlaySize = T1ReadLong(MMU.CART_ROM, 84);\n\theader->ARM7OverlayOff = T1ReadLong(MMU.CART_ROM, 88);\n\theader->ARM7OverlaySize = T1ReadLong(MMU.CART_ROM, 92);\n\theader->unknown2a = T1ReadLong(MMU.CART_ROM, 96);\n\theader->unknown2b = T1ReadLong(MMU.CART_ROM, 100);\n\theader->IconOff = T1ReadLong(MMU.CART_ROM, 104);\n\theader->CRC16 = T1ReadWord(MMU.CART_ROM, 108);\n\theader->ROMtimeout = T1ReadWord(MMU.CART_ROM, 110);\n\theader->ARM9unk = T1ReadLong(MMU.CART_ROM, 112);\n\theader->ARM7unk = T1ReadLong(MMU.CART_ROM, 116);\n\tmemcpy(header->unknown3c, MMU.CART_ROM + 120, 8);\n\theader->ROMSize = T1ReadLong(MMU.CART_ROM, 128);\n\theader->HeaderSize = T1ReadLong(MMU.CART_ROM, 132);\n\tmemcpy(header->unknown5, MMU.CART_ROM + 136, 56);\n\tmemcpy(header->logo, MMU.CART_ROM + 192, 156);\n\theader->logoCRC16 = T1ReadWord(MMU.CART_ROM, 348);\n\theader->headerCRC16 = T1ReadWord(MMU.CART_ROM, 350);\n\tmemcpy(header->reserved, MMU.CART_ROM + 352, min(160, (int)gameInfo.romsize - 352));\n\n\treturn header;\n} \n\n\n\n\nvoid debug()\n{\n\t//if(NDS_ARM9.R[15]==0x020520DC) emu_halt();\n\t//DSLinux\n\t//if(NDS_ARM9.CPSR.bits.mode == 0) emu_halt();\n\t//if((NDS_ARM9.R[15]&0xFFFFF000)==0) emu_halt();\n\t//if((NDS_ARM9.R[15]==0x0201B4F4)/*&&(NDS_ARM9.R[1]==0x0)*/) emu_halt();\n\t//AOE\n\t//if((NDS_ARM9.R[15]==0x01FFE194)&&(NDS_ARM9.R[0]==0)) emu_halt();\n\t//if((NDS_ARM9.R[15]==0x01FFE134)&&(NDS_ARM9.R[0]==0)) emu_halt();\n\n\t//BBMAN\n\t//if(NDS_ARM9.R[15]==0x02098B4C) emu_halt();\n\t//if(NDS_ARM9.R[15]==0x02004924) emu_halt();\n\t//if(NDS_ARM9.R[15]==0x02004890) emu_halt();\n\n\t//if(NDS_ARM9.R[15]==0x0202B800) emu_halt();\n\t//if(NDS_ARM9.R[15]==0x0202B3DC) emu_halt();\n\t//if((NDS_ARM9.R[1]==0x9AC29AC1)&&(!fait)) {emu_halt();fait = TRUE;}\n\t//if(NDS_ARM9.R[1]==0x0400004A) {emu_halt();fait = TRUE;}\n\t/*if(NDS_ARM9.R[4]==0x2E33373C) emu_halt();\n\tif(NDS_ARM9.R[15]==0x02036668) //emu_halt();\n\t{\n\tnds.logcount++;\n\tsprintf(logbuf, \"%d %08X\", nds.logcount, NDS_ARM9.R[13]);\n\tlog::ajouter(logbuf);\n\tif(nds.logcount==89) execute=FALSE;\n\t}*/\n\t//if(NDS_ARM9.instruction==0) emu_halt();\n\t//if((NDS_ARM9.R[15]>>28)) emu_halt();\n}\n\n#define DSGBA_LOADER_SIZE 512\nenum\n{\n\tROM_NDS = 0,\n\tROM_DSGBA\n};\n\n#if 0 /* not used */\n//http://www.aggregate.org/MAGIC/#Population%20Count%20(Ones%20Count)\nstatic u32 ones32(u32 x)\n{\n\t/* 32-bit recursive reduction using SWAR...\n\tbut first step is mapping 2-bit values\n\tinto sum of 2 1-bit values in sneaky way\n\t*/\n\tx -= ((x >> 1) & 0x55555555);\n\tx = (((x >> 2) & 0x33333333) + (x & 0x33333333));\n\tx = (((x >> 4) + x) & 0x0f0f0f0f);\n\tx += (x >> 8);\n\tx += (x >> 16);\n\treturn(x & 0x0000003f);\n}\n#endif\n\nRomBanner::RomBanner(bool defaultInit)\n{\n\tif(!defaultInit) return;\n\tversion = 1; //Version  (0001h)\n\tcrc16 = 0; //CRC16 across entries 020h..83Fh\n\tmemset(reserved,0,sizeof(reserved));\n\tmemset(bitmap,0,sizeof(bitmap));\n\tmemset(palette,0,sizeof(palette));\n\tmemset(titles,0,sizeof(titles));\n\tmemset(end0xFF,0,sizeof(end0xFF));\n}\n\nbool GameInfo::hasRomBanner()\n{\n\tif(header.IconOff + sizeof(RomBanner) > romsize)\n\t\treturn false;\n\telse return true;\n}\n\nconst RomBanner& GameInfo::getRomBanner()\n{\n\t//we may not have a valid banner. return a default one\n\tif(!hasRomBanner())\n\t{\n\t\tstatic RomBanner defaultBanner(true);\n\t\treturn defaultBanner;\n\t}\n\t\n\treturn *(RomBanner*)(romdata+header.IconOff);\n}\n\nvoid GameInfo::populate()\n{\n\tconst char *regions[] = {\t\"JPFSEDIRKHX\",\n\t\t\t\t\t\t\t\t\"JPN\",\n\t\t\t\t\t\t\t\t\"EUR\",\n\t\t\t\t\t\t\t\t\"FRA\",\n\t\t\t\t\t\t\t\t\"ESP\",\n\t\t\t\t\t\t\t\t\"USA\",\n\t\t\t\t\t\t\t\t\"NOE\",\n\t\t\t\t\t\t\t\t\"ITA\",\n\t\t\t\t\t\t\t\t\"RUS\",\n\t\t\t\t\t\t\t\t\"KOR\",\n\t\t\t\t\t\t\t\t\"HOL\",\n\t\t\t\t\t\t\t\t\"EUU\",\n\n\t};\n\n\tNDS_header * _header = NDS_getROMHeader();\n\theader = *_header;\n\tdelete _header;\n\n\tmemset(ROMserial, 0, sizeof(ROMserial));\n\tmemset(ROMname, 0, sizeof(ROMname));\n\n\t//homebrew detection heuristics\n\t//Option Old. - look for this instruction in the game title\n\t//(did this ever work?)\n\t//(header->gameTile[0] == 0x2E) && (header->gameTile[1] == 0x00) && header->gameTile[2] == 0x00) && header->gameTile[3] == 0xEA)\n\t//Option New. - look for gamecode #### (default for ndstool)\n\t//or an invalid gamecode\n\t//this first part may look like a poor heuristic for detecting homebrew, but it is actually pretty good.\n\t//setting your own game code is stupid, so homebrew should just leave it.\n\t//however, non-devkitARM-default makefiles may not have set this.\n\tbool gamecodeHash = !memcmp(header.gameCode,\"####\",4);\n\tbool gamecodeInvalid = header.gameCode[0] == 0x00;\n\n\n\tif((gamecodeHash || gamecodeInvalid) \n\t\t//TBD - is this check a good idea?\n\t\t&& header.makerCode == 0x0\n\t\t)\n\t{\n\t\tisHomebrew = true;\n\t}\n\telse\n\t\tisHomebrew = false;\n\n\tif(isHomebrew)\n\t{\n\t\t//we can't really make a serial for a homebrew game that hasnt set a game code\n\t\tstrcpy(ROMserial, \"Homebrew\");\n\t}\n\telse\n\t{\n\t\tstrcpy(ROMserial,\"NTR-    -\");\n\t\tmemcpy(ROMserial+4, header.gameCode, 4);\n\n\t\tu32 region = (u32)(std::max<s32>(strchr(regions[0],header.gameCode[3]) - regions[0] + 1, 0));\n\t\tif (region > 0 && region < 12)\n\t\t\tstrcat(ROMserial, regions[region]);\n\t\telse\n\t\t\tstrcat(ROMserial, \"Unknown\");\n\t}\n\n\t//rom name is probably set even in homebrew, so do it regardless\n\tmemset(ROMname, 0, sizeof(ROMname));\n\tmemcpy(ROMname, header.gameTile, 12);\n\ttrim(ROMname,20);\n\n\t\t/*if(header.IconOff < romsize)\n\t\t{\n\t\t\tu8 num = (T1ReadByte((u8*)romdata, header.IconOff) == 1)?6:7;\n\t\t\tfor (int i = 0; i < num; i++)\n\t\t\t{\n\t\t\t\twcstombs(ROMfullName[i], (wchar_t *)(romdata+header.IconOff+0x240+(i*0x100)), 0x100);\n\t\t\t\ttrim(ROMfullName[i]);\n\t\t\t}\n\t\t}*/\n\n\n}\n\n#if defined(_WINDOWS) || defined(ANDROID)\n\nstatic std::vector<char> buffer;\nstatic std::vector<char> v;\n\nstatic void loadrom(std::string fname) {\n\n\tif(!useMmapForRomLoading)\n\t{\n\t\tFILE* inf = fopen(fname.c_str(),\"rb\");\n\t\tif(!inf) return;\n\n\t\tfseek(inf,0,SEEK_END);\n\t\tint size = ftell(inf);\n\t\tfseek(inf,0,SEEK_SET);\n\n\t\tgameInfo.resize(size);\n\t\tfread(gameInfo.romdata,1,size,inf);\n\t\tgameInfo.fillGap();\n\t\t\n\t\tfclose(inf);\n\t}\n\telse\n\t{\n\t\tstruct stat stats;\n\t\tif(stat(fname.c_str(), &stats) == -1)\n\t\t\treturn;\n\t\tint fd = open(fname.c_str(), O_RDONLY);\n\t\tif(fd == -1)\n\t\t\treturn;\n\t\tchar* map = (char*)mmap(NULL, stats.st_size, PROT_READ, MAP_PRIVATE, fd, 0);\n\t\tif(map == MAP_FAILED)\n\t\t\treturn;\n\t\tgameInfo.resize(stats.st_size);\n\t\tgameInfo.romdata = map;\n\t\tgameInfo.openRomFd = fd;\n\t\tgameInfo.fillGap();\n\t\t\t\n\t}\n}\n\nstatic int rom_init_path(const char *filename, const char *logicalFilename)\n{\n\tint\ttype = ROM_NDS;\n\n\tpath.init(logicalFilename);\n\n\tif ( path.isdsgba(path.path)) {\n\t\ttype = ROM_DSGBA;\n\t\tloadrom(path.path);\n\t}\n\telse if ( !strcasecmp(path.extension().c_str(), \"nds\")) {\n\t\ttype = ROM_NDS;\n\t\tloadrom(path.path); //n.b. this does nothing if the file can't be found (i.e. if it was an extracted tempfile)...\n\t\t//...but since the data was extracted to gameInfo then it is ok\n\t}\n\t//ds.gba in archives, it's already been loaded into memory at this point\n\telse if (path.isdsgba(std::string(logicalFilename))) {\n\t\ttype = ROM_DSGBA;\n\t} else {\n\t\t//well, try to load it as an nds rom anyway\n\t\ttype = ROM_NDS;\n\t\tloadrom(path.path);\n\t}\n\n\tif(type == ROM_DSGBA)\n\t{\n\t\tstd::vector<char> v(gameInfo.romdata + DSGBA_LOADER_SIZE, gameInfo.romdata + gameInfo.romsize);\n\t\tgameInfo.loadData(&v[0],gameInfo.romsize - DSGBA_LOADER_SIZE);\n\t}\n\n\t//check that size is at least the size of the header\n\tif (gameInfo.romsize < 352) {\n\t\treturn -1;\n\t}\n\n\treturn 1;\n}\n#else\nstatic int rom_init_path(const char *filename, const char *logicalFilename)\n{\n\tint\t\t\tret;\n\tint\t\t\ttype;\n\tROMReader_struct\t*reader;\n\tvoid\t\t\t*file;\n\tu32\t\t\tsize;\n\tchar\t\t\t*noext;\n\n\tnoext = strdup(filename);\n\treader = ROMReaderInit(&noext);\n\tfree(noext);\n\t\n\tif (logicalFilename)\n\t\tpath.init(logicalFilename);\n\telse\n\t\tpath.init(filename);\n\n\tif (!strcasecmp(path.extension().c_str(), \"zip\"))\n\t\ttype = ROM_NDS;\n\telse if (!strcasecmp(path.extension().c_str(), \"nds\"))\n\t\ttype = ROM_NDS;\n\telse if (path.isdsgba(path.path))\n\t\ttype = ROM_DSGBA;\n\telse\n\t\ttype = ROM_NDS;\n\n\tfile = reader->Init(filename);\n\tif (!file)\n\t{\n\t\treader->DeInit(file);\n\t\treturn -1;\n\t}\n\n\tsize = reader->Size(file);\n\n\tif(type == ROM_DSGBA)\n\t{\n\t\treader->Seek(file, DSGBA_LOADER_SIZE, SEEK_SET);\n\t\tsize -= DSGBA_LOADER_SIZE;\n\t}\n\n\t//check that size is at least the size of the header\n\tif (size < 352) {\n\t\treader->DeInit(file);\n\t\treturn -1;\n\t}\n\n\t// Make sure old ROM is freed first(at least this way we won't be eating\n\t// up a ton of ram before the old ROM is freed)\n\tif(MMU.CART_ROM != MMU.UNUSED_RAM)\n\t\tNDS_FreeROM();\n\n\tgameInfo.resize(size);\n\tret = reader->Read(file, gameInfo.romdata, size);\n\tgameInfo.fillGap();\n\treader->DeInit(file);\n\n\treturn ret;\n}\n#endif\n\nint NDS_LoadROM(const char *filename, const char *logicalFilename)\n{\n\tint\tret;\n\tchar\tbuf[MAX_PATH];\n\n\tif (filename == NULL)\n\t\treturn -1;\n\n\tret = rom_init_path(filename, logicalFilename);\n\tif (ret < 1)\n\t\treturn ret;\n\n\t//decrypt if necessary..\n\t//but this is untested and suspected to fail on big endian, so lets not support this on big endian\n#ifndef WORDS_BIGENDIAN\n\tbool okRom = DecryptSecureArea((u8*)gameInfo.romdata,gameInfo.romsize);\n\n\tif(!okRom) {\n\t\tprintf(\"Specified file is not a valid rom\\n\");\n\t\treturn -1;\n\t}\n#endif\n\n\tif (cheatSearch)\n\t\tcheatSearch->close();\n\tFCEUI_StopMovie();\n\n\tMMU_unsetRom();\n\tNDS_SetROM((u8*)gameInfo.romdata, gameInfo.mask);\n\n\tgameInfo.populate();\n\tgameInfo.crc = crc32(0,(u8*)gameInfo.romdata,gameInfo.romsize);\n\tINFO(\"\\nROM game code: %c%c%c%c\\n\", gameInfo.header.gameCode[0], gameInfo.header.gameCode[1], gameInfo.header.gameCode[2], gameInfo.header.gameCode[3]);\n\tINFO(\"ROM crc: %08X\\n\", gameInfo.crc);\n\tINFO(\"ROM serial: %s\\n\", gameInfo.ROMserial);\n\tINFO(\"ROM internal name: %s\\n\", gameInfo.ROMname);\n\t\n\tmemset(buf, 0, MAX_PATH);\n\tstrcpy(buf, path.pathToModule);\n\tstrcat(buf, \"desmume.ddb\");\t\t\t\t\t\t\t// DeSmuME database\t:)\n\tadvsc.setDatabase(buf);\n\tbuf[0] = gameInfo.header.gameCode[0];\n\tbuf[1] = gameInfo.header.gameCode[1];\n\tbuf[2] = gameInfo.header.gameCode[2];\n\tbuf[3] = gameInfo.header.gameCode[3];\n\tbuf[4] = 0;\n\tif (advsc.checkDB(buf, gameInfo.crc))\n\t{\n\t\tu8 sv = advsc.getSaveType();\n\t\tprintf(\"Found in game database by %s:\\n\",advsc.getIdMethod());\n\t\tprintf(\"\\t* ROM save type: \");\n\t\tif (sv == 0xFF)\n\t\t\tprintf(\"Unknown\");\n\t\telse\n\t\t\tif (sv == 0xFE)\n\t\t\t\tprintf(\"None\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tprintf(\"%s\", save_types[sv + 1].descr);\n\t\t\t\tif (CommonSettings.autodetectBackupMethod == 1)\n\t\t\t\t\tbackup_setManualBackupType(sv + 1);\n\t\t\t}\n\t\tprintf(\"\\n\\t* ROM crc: %08X\\n\", advsc.getCRC32());\n\t}\n\tprintf(\"\\n\");\n\n\t//for homebrew, try auto-patching DLDI. should be benign if there is no DLDI or if it fails\n\tif(gameInfo.isHomebrew)\n\t\tDLDI::tryPatch((void*)gameInfo.romdata, gameInfo.romsize);\n\n\tmemset(buf, 0, MAX_PATH);\n\tpath.getpathnoext(path.BATTERY, buf);\n\tstrcat(buf, \".dsv\");\t\t\t\t\t\t\t// DeSmuME memory card\t:)\n\tMMU_new.backupDevice.load_rom(buf);\n\n\tif (cheats != NULL)\n\t{\n\t\tmemset(buf, 0, MAX_PATH);\n\t\tpath.getpathnoext(path.CHEATS, buf);\n\t\tstrcat(buf, \".dct\");\t\t\t\t\t\t// DeSmuME cheat\t\t:)\n\t\tcheats->init(buf);\n\t}\n\n\tNDS_Reset();\n\n\treturn ret;\n}\n\nvoid NDS_FreeROM(void)\n{\n\tFCEUI_StopMovie();\n\tif ((u8*)MMU.CART_ROM == (u8*)gameInfo.romdata)\n\t\tgameInfo.romdata = NULL;\n\tif (MMU.CART_ROM != MMU.UNUSED_RAM)\n\t{\n\t\tif(!useMmapForRomLoading)\n\t\t\tdelete [] MMU.CART_ROM;\n\t\telse\n\t\t\tgameInfo.cleanup();\n\t}\n\tMMU_unsetRom();\n}\n\nu32 NDS_ImportSaveSize(const char *filename)\n{\n\tu32 res = 0;\n\tif (strlen(filename) < 4) return 0;\n\n\tif (memcmp(filename+strlen(filename)-4, \".duc\", 4) == 0)\n\t{\n\t\tres = MMU_new.backupDevice.get_save_duc_size(filename);\n\t\tif (res == 0xFFFFFFFF) return 0;\n\t\treturn res;\n\t}\n\n\tres = MMU_new.backupDevice.get_save_nogba_size(filename);\n\tif (res != 0xFFFFFFFF) return res;\n\n\tres = MMU_new.backupDevice.get_save_raw_size(filename);\n\tif (res != 0xFFFFFFFF) return res;\n\n\treturn 0;\n}\n\nint NDS_ImportSave(const char *filename, u32 force_size)\n{\n\tif (strlen(filename) < 4) return 0;\n\n\tif (memcmp(filename+strlen(filename)-4, \".duc\", 4) == 0)\n\t\treturn MMU_new.backupDevice.load_duc(filename, force_size);\n\telse\n\t\tif (MMU_new.backupDevice.load_no_gba(filename, force_size))\n\t\t\treturn 1;\n\t\telse\n\t\t\treturn MMU_new.backupDevice.load_raw(filename, force_size);\n\n\treturn 0;\n}\n\nbool NDS_ExportSave(const char *filename)\n{\n\tif (strlen(filename) < 4)\n\t\treturn false;\n\n\tif (memcmp(filename+strlen(filename)-5, \".sav*\", 5) == 0)\n\t{\n\t\tchar tmp[MAX_PATH];\n\t\tmemset(tmp, 0, MAX_PATH);\n\t\tstrcpy(tmp, filename);\n\t\ttmp[strlen(tmp)-1] = 0;\n\t\treturn MMU_new.backupDevice.save_no_gba(tmp);\n\t}\n\n\tif (memcmp(filename+strlen(filename)-4, \".sav\", 4) == 0)\n\t\treturn MMU_new.backupDevice.save_raw(filename);\n\n\treturn false;\n}\n\nstatic int WritePNGChunk(FILE *fp, uint32 size, const char *type, const uint8 *data)\n{\n\tuint32 crc;\n\n\tuint8 tempo[4];\n\n\ttempo[0]=size>>24;\n\ttempo[1]=size>>16;\n\ttempo[2]=size>>8;\n\ttempo[3]=size;\n\n\tif(fwrite(tempo,4,1,fp)!=1)\n\t\treturn 0;\n\tif(fwrite(type,4,1,fp)!=1)\n\t\treturn 0;\n\n\tif(size)\n\t\tif(fwrite(data,1,size,fp)!=size)\n\t\t\treturn 0;\n\n\tcrc = crc32(0,(uint8 *)type,4);\n\tif(size)\n\t\tcrc = crc32(crc,data,size);\n\n\ttempo[0]=crc>>24;\n\ttempo[1]=crc>>16;\n\ttempo[2]=crc>>8;\n\ttempo[3]=crc;\n\n\tif(fwrite(tempo,4,1,fp)!=1)\n\t\treturn 0;\n\treturn 1;\n}\nint NDS_WritePNG(const char *fname)\n{\n\tint x, y;\n\tint width=256;\n\tint height=192*2;\n\tu16 * bmp = (u16 *)GPU_screen;\n\tFILE *pp=NULL;\n\tuint8 *compmem = NULL;\n\tuLongf compmemsize = (uLongf)( (height * (width + 1) * 3 * 1.001 + 1) + 12 );\n\n\tif(!(compmem=(uint8 *)malloc(compmemsize)))\n\t\treturn 0;\n\n\tif(!(pp=fopen(fname, \"wb\")))\n\t{\n\t\tgoto PNGerr;\n\t}\n\t{\n\t\tconst uint8 header[8]={137,80,78,71,13,10,26,10};\n\t\tif(fwrite(header,8,1,pp)!=1)\n\t\t\tgoto PNGerr;\n\t}\n\n\t{\n\t\tuint8 chunko[13];\n\n\t\tchunko[0] = width >> 24;\t\t// Width\n\t\tchunko[1] = width >> 16;\n\t\tchunko[2] = width >> 8;\n\t\tchunko[3] = width;\n\n\t\tchunko[4] = height >> 24;\t\t// Height\n\t\tchunko[5] = height >> 16;\n\t\tchunko[6] = height >> 8;\n\t\tchunko[7] = height;\n\n\t\tchunko[8]=8;\t\t\t\t// 8 bits per sample(24 bits per pixel)\n\t\tchunko[9]=2;\t\t\t\t// Color type; RGB triplet\n\t\tchunko[10]=0;\t\t\t\t// compression: deflate\n\t\tchunko[11]=0;\t\t\t\t// Basic adapative filter set(though none are used).\n\t\tchunko[12]=0;\t\t\t\t// No interlace.\n\n\t\tif(!WritePNGChunk(pp,13,\"IHDR\",chunko))\n\t\t\tgoto PNGerr;\n\t}\n\n\t{\n\t\tuint8 *tmp_buffer;\n\t\tuint8 *tmp_inc;\n\t\ttmp_inc = tmp_buffer = (uint8 *)malloc((width * 3 + 1) * height);\n\n\t\tfor(y=0;y<height;y++)\n\t\t{\n\t\t\t*tmp_inc = 0;\n\t\t\ttmp_inc++;\n\t\t\tfor(x=0;x<width;x++)\n\t\t\t{\n\t\t\t\tint r,g,b;\n\t\t\t\tu16 pixel = bmp[y*256+x];\n\t\t\t\tr = pixel>>10;\n\t\t\t\tpixel-=r<<10;\n\t\t\t\tg = pixel>>5;\n\t\t\t\tpixel-=g<<5;\n\t\t\t\tb = pixel;\n\t\t\t\tr*=255/31;\n\t\t\t\tg*=255/31;\n\t\t\t\tb*=255/31;\n\t\t\t\ttmp_inc[0] = b;\n\t\t\t\ttmp_inc[1] = g;\n\t\t\t\ttmp_inc[2] = r;\n\t\t\t\ttmp_inc += 3;\n\t\t\t}\n\t\t}\n\n\t\tif(compress(compmem, &compmemsize, tmp_buffer, height * (width * 3 + 1))!=Z_OK)\n\t\t{\n\t\t\tif(tmp_buffer) free(tmp_buffer);\n\t\t\tgoto PNGerr;\n\t\t}\n\t\tif(tmp_buffer) free(tmp_buffer);\n\t\tif(!WritePNGChunk(pp,compmemsize,\"IDAT\",compmem))\n\t\t\tgoto PNGerr;\n\t}\n\tif(!WritePNGChunk(pp,0,\"IEND\",0))\n\t\tgoto PNGerr;\n\n\tfree(compmem);\n\tfclose(pp);\n\n\treturn 1;\n\nPNGerr:\n\tif(compmem)\n\t\tfree(compmem);\n\tif(pp)\n\t\tfclose(pp);\n\treturn(0);\n}\n\ntypedef struct\n{\n\tu32 size;\n\ts32 width;\n\ts32 height;\n\tu16 planes;\n\tu16 bpp;\n\tu32 cmptype;\n\tu32 imgsize;\n\ts32 hppm;\n\ts32 vppm;\n\tu32 numcol;\n\tu32 numimpcol;\n} bmpimgheader_struct;\n\n#include \"PACKED.h\"\ntypedef struct\n{\n\tu16 id __PACKED;\n\tu32 size __PACKED;\n\tu16 reserved1 __PACKED;\n\tu16 reserved2 __PACKED;\n\tu32 imgoffset __PACKED;\n} bmpfileheader_struct;\n#include \"PACKED_END.h\"\n\nint NDS_WriteBMP(const char *filename)\n{\n\tbmpfileheader_struct fileheader;\n\tbmpimgheader_struct imageheader;\n\tFILE *file;\n\tint i,j;\n\tu16 * bmp = (u16 *)GPU_screen;\n\tsize_t elems_written = 0;\n\n\tmemset(&fileheader, 0, sizeof(fileheader));\n\tfileheader.size = sizeof(fileheader);\n\tfileheader.id = 'B' | ('M' << 8);\n\tfileheader.imgoffset = sizeof(fileheader)+sizeof(imageheader);\n\n\tmemset(&imageheader, 0, sizeof(imageheader));\n\timageheader.size = sizeof(imageheader);\n\timageheader.width = 256;\n\timageheader.height = 192*2;\n\timageheader.planes = 1;\n\timageheader.bpp = 24;\n\timageheader.cmptype = 0; // None\n\timageheader.imgsize = imageheader.width * imageheader.height * 3;\n\n\tif ((file = fopen(filename,\"wb\")) == NULL)\n\t\treturn 0;\n\n\telems_written += fwrite(&fileheader, 1, sizeof(fileheader), file);\n\telems_written += fwrite(&imageheader, 1, sizeof(imageheader), file);\n\n\tfor(j=0;j<192*2;j++)\n\t{\n\t\tfor(i=0;i<256;i++)\n\t\t{\n\t\t\tu8 r,g,b;\n\t\t\tu16 pixel = bmp[(192*2-j-1)*256+i];\n\t\t\tr = pixel>>10;\n\t\t\tpixel-=r<<10;\n\t\t\tg = pixel>>5;\n\t\t\tpixel-=g<<5;\n\t\t\tb = (u8)pixel;\n\t\t\tr*=255/31;\n\t\t\tg*=255/31;\n\t\t\tb*=255/31;\n\t\t\telems_written += fwrite(&r, 1, sizeof(u8), file); \n\t\t\telems_written += fwrite(&g, 1, sizeof(u8), file); \n\t\t\telems_written += fwrite(&b, 1, sizeof(u8), file);\n\t\t}\n\t}\n\tfclose(file);\n\n\treturn 1;\n}\n\nint NDS_WriteBMP_32bppBuffer(int width, int height, const void* buf, const char *filename)\n{\n\tbmpfileheader_struct fileheader;\n\tbmpimgheader_struct imageheader;\n\tFILE *file;\n\tsize_t elems_written = 0;\n\tmemset(&fileheader, 0, sizeof(fileheader));\n\tfileheader.size = sizeof(fileheader);\n\tfileheader.id = 'B' | ('M' << 8);\n\tfileheader.imgoffset = sizeof(fileheader)+sizeof(imageheader);\n\n\tmemset(&imageheader, 0, sizeof(imageheader));\n\timageheader.size = sizeof(imageheader);\n\timageheader.width = width;\n\timageheader.height = height;\n\timageheader.planes = 1;\n\timageheader.bpp = 32;\n\timageheader.cmptype = 0; // None\n\timageheader.imgsize = imageheader.width * imageheader.height * 4;\n\n\tif ((file = fopen(filename,\"wb\")) == NULL)\n\t\treturn 0;\n\n\telems_written += fwrite(&fileheader, 1, sizeof(fileheader), file);\n\telems_written += fwrite(&imageheader, 1, sizeof(imageheader), file);\n\n\tfor(int i=0;i<height;i++)\n\t\tfor(int x=0;x<width;x++)\n\t\t{\n\t\t\tu8* pixel = (u8*)buf + (height-i-1)*width*4;\n\t\t\tpixel += (x*4);\n\t\t\telems_written += fwrite(pixel+2,1,1,file);\n\t\t\telems_written += fwrite(pixel+1,1,1,file);\n\t\t\telems_written += fwrite(pixel+0,1,1,file);\n\t\t\telems_written += fwrite(pixel+3,1,1,file);\n\t\t}\n\tfclose(file);\n\n\treturn 1;\n}\n\nvoid NDS_Sleep() { nds.sleeping = TRUE; }\n\nvoid NDS_TriggerCardEjectIRQ()\n{\n\tNDS_makeIrq(ARMCPU_ARM7, IRQ_BIT_GC_IREQ_MC);\n}\n\n\nclass FrameSkipper\n{\npublic:\n\tvoid RequestSkip()\n\t{\n\t\tnextSkip = true;\n\t}\n\tvoid OmitSkip(bool force, bool forceEvenIfCapturing=false)\n\t{\n\t\tnextSkip = false;\n\t\tif((force && consecutiveNonCaptures > 30) || forceEvenIfCapturing)\n\t\t{\n\t\t\tSkipCur2DFrame = false;\n\t\t\tSkipCur3DFrame = false;\n\t\t\tSkipNext2DFrame = false;\n\t\t\tif(forceEvenIfCapturing)\n\t\t\t\tconsecutiveNonCaptures = 0;\n\t\t}\n\t}\n\tvoid Advance()\n\t{\n\t\tbool capturing = (MainScreen.gpu->dispCapCnt.enabled || (MainScreen.gpu->dispCapCnt.val & 0x80000000));\n\n\t\tif(capturing && consecutiveNonCaptures > 30)\n\t\t{\n\t\t\t// the worst-looking graphics corruption problems from frameskip\n\t\t\t// are the result of skipping the capture on first frame it turns on.\n\t\t\t// so we do this to handle the capture immediately,\n\t\t\t// despite the risk of 1 frame of 2d/3d mismatch or wrong screen display.\n\t\t\tSkipNext2DFrame = false;\n\t\t\tnextSkip = false;\n\t\t}\n\t\telse if(lastOffset != MainScreen.offset && lastSkip && !skipped)\n\t\t{\n\t\t\t// if we're switching from not skipping to skipping\n\t\t\t// and the screens are also switching around this frame,\n\t\t\t// go for 1 extra frame without skipping.\n\t\t\t// this avoids the scenario where we only draw one of the two screens\n\t\t\t// when a game is switching screens every frame.\n\t\t\tnextSkip = false;\n\t\t}\n\n\t\tif(capturing)\n\t\t\tconsecutiveNonCaptures = 0;\n\t\telse if(!(consecutiveNonCaptures > 9000)) // arbitrary cap to avoid eventual wrap\n\t\t\tconsecutiveNonCaptures++;\n\t\tlastLastOffset = lastOffset;\n\t\tlastOffset = MainScreen.offset;\n\t\tlastSkip = skipped;\n\t\tskipped = nextSkip;\n\t\tnextSkip = false;\n\n\t\tSkipCur2DFrame = SkipNext2DFrame;\n\t\tSkipCur3DFrame = skipped;\n\t\tSkipNext2DFrame = skipped;\n\t}\n\tFORCEINLINE bool ShouldSkip2D()\n\t{\n\t\treturn SkipCur2DFrame;\n\t}\n\tFORCEINLINE bool ShouldSkip3D()\n\t{\n\t\treturn SkipCur3DFrame;\n\t}\n\tFrameSkipper()\n\t{\n\t\tnextSkip = false;\n\t\tskipped = false;\n\t\tlastSkip = false;\n\t\tlastOffset = 0;\n\t\tSkipCur2DFrame = false;\n\t\tSkipCur3DFrame = false;\n\t\tSkipNext2DFrame = false;\n\t\tconsecutiveNonCaptures = 0;\n\t}\nprivate:\n\tbool nextSkip;\n\tbool skipped;\n\tbool lastSkip;\n\tint lastOffset;\n\tint lastLastOffset;\n\tint consecutiveNonCaptures;\n\tbool SkipCur2DFrame;\n\tbool SkipCur3DFrame;\n\tbool SkipNext2DFrame;\n};\nstatic FrameSkipper frameSkipper;\n\n\nvoid NDS_SkipNextFrame() {\n\tif (!driver->AVI_IsRecording()) {\n\t\tframeSkipper.RequestSkip();\n\t}\n}\nvoid NDS_OmitFrameSkip(int force) {\n\tframeSkipper.OmitSkip(force > 0, force > 1);\n}\n\n#define INDEX(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF))\n\n\nenum ESI_DISPCNT\n{\n\tESI_DISPCNT_HStart, ESI_DISPCNT_HStartIRQ, ESI_DISPCNT_HDraw, ESI_DISPCNT_HBlank\n};\n\nu64 nds_timer;\nu64 nds_arm9_timer, nds_arm7_timer;\n\nstatic const u64 kNever = 0xFFFFFFFFFFFFFFFFULL;\n\n\nvoid TSequenceItem::save(EMUFILE* os)\n{\n\twrite64le(timestamp,os);\n\twrite32le(param,os);\n\twritebool(enabled,os);\n}\n\nbool TSequenceItem::load(EMUFILE* is)\n{\n\tif(read64le(&timestamp,is) != 1) return false;\n\tif(read32le(&param,is) != 1) return false;\n\tif(readbool(&enabled,is) != 1) return false;\n\treturn true;\n}\n\nFORCEINLINE bool TSequenceItem::isTriggered()\n{\n\treturn enabled && nds_timer >= timestamp;\n}\n\nFORCEINLINE u64 TSequenceItem::next()\n{\n\treturn timestamp;\n}\n\n\n\nFORCEINLINE bool TSequenceItem_GXFIFO::isTriggered()\n{\n\treturn enabled && nds_timer >= MMU.gfx3dCycles;\n}\n\nFORCEINLINE void TSequenceItem_GXFIFO::exec()\n{\n\tIF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[4]++);\n\twhile(isTriggered()) {\n\t\tenabled = false;\n\t\tgfx3d_execute3D();\n\t}\n}\n\nFORCEINLINE u64 TSequenceItem_GXFIFO::next()\n{\n\tif(enabled) return MMU.gfx3dCycles;\n\telse return kNever;\n}\n\ntemplate<int procnum, int num> struct TSequenceItem_Timer : public TSequenceItem\n{\n\tFORCEINLINE bool isTriggered()\n\t{\n\t\treturn enabled && nds_timer >= nds.timerCycle[procnum][num];\n\t}\n\n\tFORCEINLINE void schedule()\n\t{\n\t\tenabled = MMU.timerON[procnum][num] && MMU.timerMODE[procnum][num] != 0xFFFF;\n\t}\n\n\tFORCEINLINE u64 next()\n\t{\n\t\treturn nds.timerCycle[procnum][num];\n\t}\n\n\tFORCEINLINE void exec()\n\t{\n\t\tIF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[13+procnum*4+num]++);\n\t\tu8* regs = procnum==0?MMU.ARM9_REG:MMU.ARM7_REG;\n\t\tbool first = true, over;\n\t\t//we'll need to check chained timers..\n\t\tfor(int i=num;i<4;i++)\n\t\t{\n\t\t\t//maybe too many checks if this is here, but we need it here for now\n\t\t\tif(!MMU.timerON[procnum][i]) return;\n\n\t\t\tif(MMU.timerMODE[procnum][i] == 0xFFFF)\n\t\t\t{\n\t\t\t\t++(MMU.timer[procnum][i]);\n\t\t\t\tover = !MMU.timer[procnum][i];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(!first) break; //this timer isn't chained. break the chain\n\t\t\t\tfirst = false;\n\n\t\t\t\tover = true;\n\t\t\t\tint remain = 65536 - MMU.timerReload[procnum][i];\n\t\t\t\tint ctr=0;\n\t\t\t\twhile(nds.timerCycle[procnum][i] <= nds_timer) {\n\t\t\t\t\tnds.timerCycle[procnum][i] += (remain << MMU.timerMODE[procnum][i]);\n\t\t\t\t\tctr++;\n\t\t\t\t}\n#ifndef NDEBUG\n\t\t\t\tif(ctr>1) {\n\t\t\t\t\tprintf(\"yikes!!!!! please report!\\n\");\n\t\t\t\t}\n#endif\n\t\t\t}\n\n\t\t\tif(over)\n\t\t\t{\n\t\t\t\tMMU.timer[procnum][i] = MMU.timerReload[procnum][i];\n\t\t\t\tif(T1ReadWord(regs, 0x102 + i*4) & 0x40) \n\t\t\t\t{\n\t\t\t\t\tNDS_makeIrq(procnum, IRQ_BIT_TIMER_0 + i);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tbreak; //no more chained timers to trigger. we're done here\n\t\t}\n\t}\n};\n\ntemplate<int procnum, int chan> struct TSequenceItem_DMA : public TSequenceItem\n{\n\tDmaController* controller;\n\n\tFORCEINLINE bool isTriggered()\n\t{\n\t\treturn (controller->dmaCheck && nds_timer>= controller->nextEvent);\n\t}\n\n\tFORCEINLINE bool isEnabled() { \n\t\treturn controller->dmaCheck?TRUE:FALSE;\n\t}\n\n\tFORCEINLINE u64 next()\n\t{\n\t\treturn controller->nextEvent;\n\t}\n\n\tFORCEINLINE void exec()\n\t{\n\t\tIF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[5+procnum*4+chan]++);\n\n\t\t//if (nds.freezeBus) return;\n\n\t\t//printf(\"exec from TSequenceItem_DMA: %d %d\\n\",procnum,chan);\n\t\tcontroller->exec();\n//\t\t//give gxfifo dmas a chance to re-trigger\n//\t\tif(MMU.DMAStartTime[procnum][chan] == EDMAMode_GXFifo) {\n//\t\t\tMMU.DMAing[procnum][chan] = FALSE;\n//\t\t\tif (gxFIFO.size <= 127) \n//\t\t\t{\n//\t\t\t\texecHardware_doDma(procnum,chan,EDMAMode_GXFifo);\n//\t\t\t\tif (MMU.DMACompleted[procnum][chan])\n//\t\t\t\t\tgoto docomplete;\n//\t\t\t\telse return;\n//\t\t\t}\n//\t\t}\n//\n//docomplete:\n//\t\tif (MMU.DMACompleted[procnum][chan])\t\n//\t\t{\n//\t\t\tu8* regs = procnum==0?MMU.ARM9_REG:MMU.ARM7_REG;\n//\n//\t\t\t//disable the channel\n//\t\t\tif(MMU.DMAStartTime[procnum][chan] != EDMAMode_GXFifo) {\n//\t\t\t\tT1WriteLong(regs, 0xB8 + (0xC*chan), T1ReadLong(regs, 0xB8 + (0xC*chan)) & 0x7FFFFFFF);\n//\t\t\t\tMMU.DMACrt[procnum][chan] &= 0x7FFFFFFF; //blehhh i hate this shit being mirrored in memory\n//\t\t\t}\n//\n//\t\t\tif((MMU.DMACrt[procnum][chan])&(1<<30)) {\n//\t\t\t\tif(procnum==0) NDS_makeARM9Int(8+chan);\n//\t\t\t\telse NDS_makeARM7Int(8+chan);\n//\t\t\t}\n//\n//\t\t\tMMU.DMAing[procnum][chan] = FALSE;\n//\t\t}\n\n\t}\n};\n\nstruct TSequenceItem_divider : public TSequenceItem\n{\n\tFORCEINLINE bool isTriggered()\n\t{\n\t\treturn MMU.divRunning && nds_timer >= MMU.divCycles;\n\t}\n\n\tbool isEnabled() { return MMU.divRunning!=0; }\n\n\tFORCEINLINE u64 next()\n\t{\n\t\treturn MMU.divCycles;\n\t}\n\n\tvoid exec()\n\t{\n\t\tIF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[2]++);\n\t\tMMU_new.div.busy = 0;\n#ifdef _WIN64\n\t\tT1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, MMU.divResult);\n\t\tT1WriteQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, MMU.divMod);\n#else\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A0, (u32)MMU.divResult);\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A4, (u32)(MMU.divResult >> 32));\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2A8, (u32)MMU.divMod);\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2AC, (u32)(MMU.divMod >> 32));\n#endif\n\t\tMMU.divRunning = FALSE;\n\t}\n\n};\n\nstruct TSequenceItem_sqrtunit : public TSequenceItem\n{\n\tFORCEINLINE bool isTriggered()\n\t{\n\t\treturn MMU.sqrtRunning && nds_timer >= MMU.sqrtCycles;\n\t}\n\n\tbool isEnabled() { return MMU.sqrtRunning!=0; }\n\n\tFORCEINLINE u64 next()\n\t{\n\t\treturn MMU.sqrtCycles;\n\t}\n\n\tFORCEINLINE void exec()\n\t{\n\t\tIF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[3]++);\n\t\tMMU_new.sqrt.busy = 0;\n\t\tT1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x2B4, MMU.sqrtResult);\n\t\tMMU.sqrtRunning = FALSE;\n\t}\n\n};\n\nstruct Sequencer\n{\n\tbool nds_vblankEnded;\n\tbool reschedule;\n\tTSequenceItem dispcnt;\n\tTSequenceItem wifi;\n\tTSequenceItem_divider divider;\n\tTSequenceItem_sqrtunit sqrtunit;\n\tTSequenceItem_GXFIFO gxfifo;\n\tTSequenceItem_DMA<0,0> dma_0_0; TSequenceItem_DMA<0,1> dma_0_1; \n\tTSequenceItem_DMA<0,2> dma_0_2; TSequenceItem_DMA<0,3> dma_0_3; \n\tTSequenceItem_DMA<1,0> dma_1_0; TSequenceItem_DMA<1,1> dma_1_1; \n\tTSequenceItem_DMA<1,2> dma_1_2; TSequenceItem_DMA<1,3> dma_1_3; \n\tTSequenceItem_Timer<0,0> timer_0_0; TSequenceItem_Timer<0,1> timer_0_1;\n\tTSequenceItem_Timer<0,2> timer_0_2; TSequenceItem_Timer<0,3> timer_0_3;\n\tTSequenceItem_Timer<1,0> timer_1_0; TSequenceItem_Timer<1,1> timer_1_1;\n\tTSequenceItem_Timer<1,2> timer_1_2; TSequenceItem_Timer<1,3> timer_1_3;\n\n\tvoid init();\n\n\tvoid execHardware();\n\tu64 findNext();\n\n\tvoid save(EMUFILE* os)\n\t{\n\t\twrite64le(nds_timer,os);\n\t\twrite64le(nds_arm9_timer,os);\n\t\twrite64le(nds_arm7_timer,os);\n\t\tdispcnt.save(os);\n\t\tdivider.save(os);\n\t\tsqrtunit.save(os);\n\t\tgxfifo.save(os);\n\t\twifi.save(os);\n#define SAVE(I,X,Y) I##_##X##_##Y .save(os);\n\t\tSAVE(timer,0,0); SAVE(timer,0,1); SAVE(timer,0,2); SAVE(timer,0,3); \n\t\tSAVE(timer,1,0); SAVE(timer,1,1); SAVE(timer,1,2); SAVE(timer,1,3); \n\t\tSAVE(dma,0,0); SAVE(dma,0,1); SAVE(dma,0,2); SAVE(dma,0,3); \n\t\tSAVE(dma,1,0); SAVE(dma,1,1); SAVE(dma,1,2); SAVE(dma,1,3); \n#undef SAVE\n\t}\n\n\tbool load(EMUFILE* is, int version)\n\t{\n\t\tif(read64le(&nds_timer,is) != 1) return false;\n\t\tif(read64le(&nds_arm9_timer,is) != 1) return false;\n\t\tif(read64le(&nds_arm7_timer,is) != 1) return false;\n\t\tif(!dispcnt.load(is)) return false;\n\t\tif(!divider.load(is)) return false;\n\t\tif(!sqrtunit.load(is)) return false;\n\t\tif(!gxfifo.load(is)) return false;\n\t\tif(version >= 1) if(!wifi.load(is)) return false;\n#define LOAD(I,X,Y) if(!I##_##X##_##Y .load(is)) return false;\n\t\tLOAD(timer,0,0); LOAD(timer,0,1); LOAD(timer,0,2); LOAD(timer,0,3); \n\t\tLOAD(timer,1,0); LOAD(timer,1,1); LOAD(timer,1,2); LOAD(timer,1,3); \n\t\tLOAD(dma,0,0); LOAD(dma,0,1); LOAD(dma,0,2); LOAD(dma,0,3); \n\t\tLOAD(dma,1,0); LOAD(dma,1,1); LOAD(dma,1,2); LOAD(dma,1,3); \n#undef LOAD\n\n\t\treturn true;\n\t}\n\n} sequencer;\n\n/*\nvoid NDS_RescheduleGXFIFO(u32 cost)\n{\n\tif(!sequencer.gxfifo.enabled) {\n\t\tMMU.gfx3dCycles = nds_timer;\n\t\tsequencer.gxfifo.enabled = true;\n\t}\n\tMMU.gfx3dCycles += cost;\n\tNDS_Reschedule();\n}*/\n\nTSequenceItem_GXFIFO& sequencer_gfxfifo = sequencer.gxfifo;\nbool& sequencer_reschedule = sequencer.reschedule;\n\nvoid NDS_RescheduleTimers()\n{\n#define check(X,Y) sequencer.timer_##X##_##Y .schedule();\n\tcheck(0,0); check(0,1); check(0,2); check(0,3);\n\tcheck(1,0); check(1,1); check(1,2); check(1,3);\n#undef check\n\n\tNDS_Reschedule();\n}\n\nvoid NDS_RescheduleDMA()\n{\n\t//TBD\n\tNDS_Reschedule();\n\n}\n\nstatic void initSchedule()\n{\n\tsequencer.init();\n\n\t//begin at the very end of the last scanline\n\t//so that at t=0 we can increment to scanline=0\n\tnds.VCount = 262; \n\n\tsequencer.nds_vblankEnded = false;\n}\n\n\n// 2196372 ~= (ARM7_CLOCK << 16) / 1000000\n// This value makes more sense to me, because:\n// ARM7_CLOCK   = 33.51 mhz\n//\t\t\t\t= 33513982 cycles per second\n// \t\t\t\t= 33.513982 cycles per microsecond\nconst u64 kWifiCycles = 67;//34*2;\n//(this isn't very precise. I don't think it needs to be)\n\nvoid Sequencer::init()\n{\n\tNDS_RescheduleTimers();\n\tNDS_RescheduleDMA();\n\n\treschedule = false;\n\tnds_timer = 0;\n\tnds_arm9_timer = 0;\n\tnds_arm7_timer = 0;\n\n\tdispcnt.enabled = true;\n\tdispcnt.param = ESI_DISPCNT_HStart;\n\tdispcnt.timestamp = 0;\n\n\tgxfifo.enabled = false;\n\n\tdma_0_0.controller = &MMU_new.dma[0][0];\n\tdma_0_1.controller = &MMU_new.dma[0][1];\n\tdma_0_2.controller = &MMU_new.dma[0][2];\n\tdma_0_3.controller = &MMU_new.dma[0][3];\n\tdma_1_0.controller = &MMU_new.dma[1][0];\n\tdma_1_1.controller = &MMU_new.dma[1][1];\n\tdma_1_2.controller = &MMU_new.dma[1][2];\n\tdma_1_3.controller = &MMU_new.dma[1][3];\n\n\n\t#ifdef EXPERIMENTAL_WIFI_COMM\n\twifi.enabled = true;\n\twifi.timestamp = kWifiCycles;\n\t#else\n\twifi.enabled = false;\n\t#endif\n}\n\n//this isnt helping much right now. work on it later\n//#include \"utils/task.h\"\n//Task taskSubGpu(true);\n//void* renderSubScreen(void*)\n//{\n//\tGPU_RenderLine(&SubScreen, nds.VCount, SkipCur2DFrame);\n//\treturn NULL;\n//}\n\nstatic void execHardware_hblank()\n{\n\t//this logic keeps moving around.\n\t//now, we try and give the game as much time as possible to finish doing its work for the scanline,\n\t//by drawing scanline N at the end of drawing time (but before subsequent interrupt or hdma-driven events happen)\n\t//don't try to do this at the end of the scanline, because some games (sonic classics) may use hblank IRQ to set\n\t//scroll regs for the next scanline\n\tif(nds.VCount<192)\n\t{\n\t\t//taskSubGpu.execute(renderSubScreen,NULL);\n\t\tGPU_RenderLine(&MainScreen, nds.VCount, frameSkipper.ShouldSkip2D());\n\t\tGPU_RenderLine(&SubScreen, nds.VCount, frameSkipper.ShouldSkip2D());\n\t\t//taskSubGpu.finish();\n\n\t\t//trigger hblank dmas\n\t\t//but notice, we do that just after we finished drawing the line\n\t\t//(values copied by this hdma should not be used until the next scanline)\n\t\ttriggerDma<EDMAMode_HBlank>();\n\t}\n\n\tif(nds.VCount==262)\n\t{\n\t\t//we need to trigger one last hblank dma since \n\t\t//a. we're sort of lagged behind by one scanline\n\t\t//b. i think that 193 hblanks actually fire (one for the hblank in scanline 262)\n\t\t//this is demonstrated by NSMB splot-parallaxing clouds\n\t\t//for some reason the game will setup two hdma scroll register buffers\n\t\t//to be run consecutively, and unless we do this, the second buffer will be offset by one scanline\n\t\t//causing a glitch in the 0th scanline\n\t\t//triggerDma(EDMAMode_HBlank);\n\n\t\t//BUT! this was removed in order to make glitches in megaman zero collection (mmz 4 1st level) work.\n\t\t//and, it seems that it is no longer necessary in nsmb. perhaps something else fixed it\n\t}\n\n\n\t//turn on hblank status bit\n\tT1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) | 2);\n\tT1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) | 2);\n\n\t//fire hblank interrupts if necessary\n\tif(T1ReadWord(MMU.ARM9_REG, 4) & 0x10) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_LCD_HBLANK);\n\tif(T1ReadWord(MMU.ARM7_REG, 4) & 0x10) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_LCD_HBLANK);\n\n\t//emulation housekeeping. for some reason we always do this at hblank,\n\t//even though it sounds more reasonable to do it at hstart\n\tSPU_Emulate_core();\n\tdriver->AVI_SoundUpdate(SPU_core->outbuf,spu_core_samples);\n\tWAV_WavSoundUpdate(SPU_core->outbuf,spu_core_samples);\n}\n\nstatic void execHardware_hstart_vblankEnd()\n{\n\tsequencer.nds_vblankEnded = true;\n\tsequencer.reschedule = true;\n\n\t//turn off vblank status bit\n\tT1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) & ~1);\n\tT1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) & ~1);\n\n\t//some emulation housekeeping\n\tframeSkipper.Advance();\n}\n\nstatic void execHardware_hstart_vblankStart()\n{\n\t//printf(\"--------VBLANK!!!--------\\n\");\n\n\t//fire vblank interrupts if necessary\n\tfor(int i=0;i<2;i++)\n\t\tif(MMU.reg_IF_pending[i] & (1<<IRQ_BIT_LCD_VBLANK))\n\t\t{\n\t\t\tMMU.reg_IF_pending[i] &= ~(1<<IRQ_BIT_LCD_VBLANK);\n\t\t\tNDS_makeIrq(i,IRQ_BIT_LCD_VBLANK);\n\t\t}\n\n\t//trigger vblank dmas\n\ttriggerDma<EDMAMode_VBlank>();\n\n\t//tracking for arm9 load average\n\tnds.runCycleCollector[0][nds.idleFrameCounter] = 1120380-nds.idleCycles[0];\n\tnds.runCycleCollector[1][nds.idleFrameCounter] = 1120380-nds.idleCycles[1];\n\tnds.idleFrameCounter++;\n\tnds.idleFrameCounter &= 15;\n\tnds.idleCycles[0] = 0;\n\tnds.idleCycles[1] = 0;\n}\n\nstatic u16 execHardware_gen_vmatch_goal()\n{\n\tu16 vmatch = T1ReadWord(MMU.ARM9_REG, 4);\n\tvmatch = ((vmatch>>8)|((vmatch<<1)&(1<<8)));\n\treturn vmatch;\n}\n\nstatic void execHardware_hstart_vcount_irq()\n{\n\t//trigger pending VMATCH irqs\n\tif(MMU.reg_IF_pending[ARMCPU_ARM9] & (1<<IRQ_BIT_LCD_VMATCH))\n\t{\n\t\tMMU.reg_IF_pending[ARMCPU_ARM9] &= ~(1<<IRQ_BIT_LCD_VMATCH);\n\t\tNDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_LCD_VMATCH);\n\t}\n\tif(MMU.reg_IF_pending[ARMCPU_ARM7] & (1<<IRQ_BIT_LCD_VMATCH))\n\t{\n\t\tMMU.reg_IF_pending[ARMCPU_ARM7] &= ~(1<<IRQ_BIT_LCD_VMATCH);\n\t\tNDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_LCD_VMATCH);\n\t}\n}\n\nstatic void execHardware_hstart_vcount()\n{\n\tu16 vmatch = execHardware_gen_vmatch_goal();\n\tif(nds.VCount==vmatch)\n\t{\n\t\t//arm9 vmatch\n\t\tT1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) | 4);\n\t\tif(T1ReadWord(MMU.ARM9_REG, 4) & 32) {\n\t\t\tMMU.reg_IF_pending[ARMCPU_ARM9] |= (1<<IRQ_BIT_LCD_VMATCH);\n\t\t}\n\t}\n\telse\n\t\tT1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) & 0xFFFB);\n\n\tvmatch = T1ReadWord(MMU.ARM7_REG, 4);\n\tvmatch = ((vmatch>>8)|((vmatch<<1)&(1<<8)));\n\tif(nds.VCount==vmatch)\n\t{\n\t\t//arm7 vmatch\n\t\tT1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) | 4);\n\t\tif(T1ReadWord(MMU.ARM7_REG, 4) & 32)\n\t\t\tMMU.reg_IF_pending[ARMCPU_ARM7] |= (1<<IRQ_BIT_LCD_VMATCH);\n\t}\n\telse\n\t\tT1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) & 0xFFFB);\n}\n\nstatic void execHardware_hdraw()\n{\n\t//due to hacks in our selection of rendering time, we do not actually render here as intended.\n\t//consider changing this if there is some problem with raster fx timing but check the documentation near the gpu rendering calls\n\t//to make sure you check for regressions (nsmb, sonic classics, et al)\n}\n\nstatic void execHardware_hstart_irq()\n{\n\t//this function very soon after the registers get updated to trigger IRQs\n\t//this is necessary to fix \"egokoro kyoushitsu\" which idles waiting for vcount=192, which never happens due to a long vblank irq\n\t//100% accurate emulation would require the read of VCOUNT to be in the pipeline already with the irq coming in behind it, thus \n\t//allowing the vcount to register as 192 occasionally (maybe about 1 out of 28 frames)\n\t//the actual length of the delay is in execHardware() where the events are scheduled\n\tsequencer.reschedule = true;\n\tif(nds.VCount==192)\n\t{\n\t\t//when the vcount hits 192, vblank begins\n\t\texecHardware_hstart_vblankStart();\n\t}\n\n\texecHardware_hstart_vcount_irq();\n}\n\nstatic void execHardware_hstart()\n{\n\tnds.VCount++;\n\n\t//end of 3d vblank\n\t//this should be 214, but we are going to be generous for games with tight timing\n\t//they shouldnt be changing any textures at 262 but they might accidentally still be at 214\n\t//so..\n\tif((CommonSettings.rigorous_timing && nds.VCount==214) || (!CommonSettings.rigorous_timing && nds.VCount==262))\n\t{\n\t\tgfx3d_VBlankEndSignal(frameSkipper.ShouldSkip3D());\n\t}\n\n\tif(nds.VCount==263)\n\t{\n\t\t//when the vcount hits 263 it rolls over to 0\n\t\tnds.VCount=0;\n\t}\n\tif(nds.VCount==262)\n\t{\n\t\t//when the vcount hits 262, vblank ends (oam pre-renders by one scanline)\n\t\texecHardware_hstart_vblankEnd();\n\t}\n\telse if(nds.VCount==192)\n\t{\n\t\t//turn on vblank status bit\n\t\tT1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) | 1);\n\t\tT1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) | 1);\n\n\t\t//check whether we'll need to fire vblank irqs\n\t\tif(T1ReadWord(MMU.ARM9_REG, 4) & 0x8) MMU.reg_IF_pending[ARMCPU_ARM9] |= (1<<IRQ_BIT_LCD_VBLANK);\n\t\tif(T1ReadWord(MMU.ARM7_REG, 4) & 0x8) MMU.reg_IF_pending[ARMCPU_ARM7] |= (1<<IRQ_BIT_LCD_VBLANK);\n\n\t\t//this is important for the character select in Dragon Ball Kai - Ultimate Butouden\n\t\t//it seems if you allow the 3d to begin before the vblank, then it will get interrupted and not complete.\n\t\t//the game needs to pick up the gxstat reg busy as clear after it finishes processing vblank.\n\t\t//therefore, this can't happen until sometime after vblank.\n\t\t//devil survivor 2 will have screens get stuck if this is on any other scanline.\n\t\t//obviously 192 is the right choice.\n\t\tgfx3d_VBlankSignal();\n\t\t//this isnt important for any known game, but it would be nice to prove it.\n\t\tNDS_RescheduleGXFIFO(392*2);\n\t}\n\n\t//write the new vcount\n\tT1WriteWord(MMU.ARM9_REG, 6, nds.VCount);\n\tT1WriteWord(MMU.ARM9_REG, 0x1006, nds.VCount);\n\tT1WriteWord(MMU.ARM7_REG, 6, nds.VCount);\n\tT1WriteWord(MMU.ARM7_REG, 0x1006, nds.VCount);\n\n\t//turn off hblank status bit\n\tT1WriteWord(MMU.ARM9_REG, 4, T1ReadWord(MMU.ARM9_REG, 4) & 0xFFFD);\n\tT1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) & 0xFFFD);\n\n\t//handle vcount status\n\texecHardware_hstart_vcount();\n\n\t//trigger hstart dmas\n\ttriggerDma<EDMAMode_HStart>();\n\n\tif(nds.VCount<192)\n\t{\n\t\t//this is hacky.\n\t\t//there is a corresponding hack in doDMA.\n\t\t//it should be driven by a fifo (and generate just in time as the scanline is displayed)\n\t\t//but that isnt even possible until we have some sort of sub-scanline timing.\n\t\t//it may not be necessary.\n\t\ttriggerDma<EDMAMode_MemDisplay>();\n\t}\n}\n\n/*\nvoid NDS_Reschedule()\n{\n\tIF_DEVELOPER(if(!sequencer.reschedule) DEBUG_statistics.sequencerExecutionCounters[0]++;);\n\tsequencer.reschedule = true;\n}\n*/\n\nFORCEINLINE u32 _fast_min32(u32 a, u32 b, u32 c, u32 d)\n{\n\treturn ((( ((s32)(a-b)) >> (32-1)) & (c^d)) ^ d);\n}\n\nFORCEINLINE u64 _fast_min(u64 a, u64 b)\n{\n\t//you might find that this is faster on a 64bit system; someone should try it\n\t//http://aggregate.org/MAGIC/#Integer%20Selection\n\t//u64 ret = (((((s64)(a-b)) >> (64-1)) & (a^b)) ^ b);\n\t//assert(ret==min(a,b));\n\t//return ret;\t\n\t\n\t//but this ends up being the fastest on 32bits\n\treturn a<b?a:b;\n\n\t//just for the record, I tried to do the 64bit math on a 32bit proc\n\t//using sse2 and it was really slow\n\t//__m128i __a; __a.m128i_u64[0] = a;\n\t//__m128i __b; __b.m128i_u64[0] = b;\n\t//__m128i xorval = _mm_xor_si128(__a,__b);\n\t//__m128i temp = _mm_sub_epi64(__a,__b);\n\t//temp.m128i_i64[0] >>= 63; //no 64bit shra in sse2, what a disappointment\n\t//temp = _mm_and_si128(temp,xorval);\n\t//temp = _mm_xor_si128(temp,__b);\n\t//return temp.m128i_u64[0];\n}\n\n\n\nu64 Sequencer::findNext()\n{\n\t//this one is always enabled so dont bother to check it\n\t/*\n\tu64 next = dispcnt.next();\n\n\tif(divider.isEnabled()) next = _fast_min(next,divider.next());\n\tif(sqrtunit.isEnabled()) next = _fast_min(next,sqrtunit.next());\n\tif(gxfifo.getEnabled()) next = _fast_min(next,gxfifo.next());\n\n#ifdef EXPERIMENTAL_WIFI_COMM\n\tnext = _fast_min(next,wifi.next());\n#endif\n\n#define test(X,Y) if(dma_##X##_##Y .isEnabled()) next = _fast_min(next,dma_##X##_##Y .next());\n\ttest(0,0); test(0,1); test(0,2); test(0,3);\n\ttest(1,0); test(1,1); test(1,2); test(1,3);\n#undef test*/\n#define test(X,Y) if(timer_##X##_##Y .enabled) SEQUENCER_NEXT(timer_##X##_##Y .next()); /*next = _fast_min(next,timer_##X##_##Y .next())*/;\n\ttest(0,0); test(0,1); test(0,2); test(0,3);\n\ttest(1,0); test(1,1); test(1,2); test(1,3);\n#undef test\n\n\treturn sequencerNext;\n}\n\nvoid Sequencer::execHardware()\n{\n\tif(dispcnt.isTriggered())\n\t{\n\n\t\tIF_DEVELOPER(DEBUG_statistics.sequencerExecutionCounters[1]++);\n\n\t\tswitch(dispcnt.param)\n\t\t{\n\t\tcase ESI_DISPCNT_HStart:\n\t\t\texecHardware_hstart();\n\t\t\t//(used to be 3168)\n\t\t\t//hstart is actually 8 dots before the visible drawing begins\n\t\t\t//we're going to run 1 here and then run 7 in the next case\n\t\t\tdispcnt.timestamp += 1*6*2;\n\t\t\tdispcnt.param = ESI_DISPCNT_HStartIRQ;\n\t\t\tbreak;\n\t\tcase ESI_DISPCNT_HStartIRQ:\n\t\t\texecHardware_hstart_irq();\n\t\t\tdispcnt.timestamp += 7*6*2;\n\t\t\tdispcnt.param = ESI_DISPCNT_HDraw;\n\t\t\tbreak;\n\t\t\t\n\t\tcase ESI_DISPCNT_HDraw:\n\t\t\texecHardware_hdraw();\n\t\t\t//duration of non-blanking period is ~1606 clocks (gbatek agrees) [but says its different on arm7]\n\t\t\t//im gonna call this 267 dots = 267*6=1602\n\t\t\t//so, this event lasts 267 dots minus the 8 dot preroll\n\t\t\tdispcnt.timestamp += (267-8)*6*2;\n\t\t\tdispcnt.param = ESI_DISPCNT_HBlank;\n\t\t\tbreak;\n\n\t\tcase ESI_DISPCNT_HBlank:\n\t\t\texecHardware_hblank();\n\t\t\t//(once this was 1092 or 1092/12=91 dots.)\n\t\t\t//there are surely 355 dots per scanline, less 267 for non-blanking period. the rest is hblank and then after that is hstart\n\t\t\tdispcnt.timestamp += ((355-267)*6*2);\n\t\t\tdispcnt.param = ESI_DISPCNT_HStart;\n\t\t\tbreak;\n\t\t}\n\t}\n\tsequencerNext = dispcnt.timestamp;\n\n#ifdef EXPERIMENTAL_WIFI_COMM\n\tif(wifi.isTriggered())\n\t{\n\t\tWIFI_usTrigger();\n\t\twifi.timestamp += kWifiCycles;\n\t}\n#endif\n\t\n\tif(divider.isTriggered()) { divider.exec(); SEQUENCER_NEXT(divider.next()); }\n\tif(sqrtunit.isTriggered()) { sqrtunit.exec(); SEQUENCER_NEXT(sqrtunit.next()); }\n\tif(gxfifo.isTriggered()) { gxfifo.exec(); SEQUENCER_NEXT(gxfifo.next()); }\n\n\n#define test(X,Y) if(dma_##X##_##Y .isTriggered()) { dma_##X##_##Y .exec(); SEQUENCER_NEXT(dma_##X##_##Y .next()); }\n\ttest(0,0); test(0,1); test(0,2); test(0,3);\n\ttest(1,0); test(1,1); test(1,2); test(1,3);\n#undef test\n#define test(X,Y) if(timer_##X##_##Y .isTriggered()) timer_##X##_##Y .exec();\n\ttest(0,0); test(0,1); test(0,2); test(0,3);\n\ttest(1,0); test(1,1); test(1,2); test(1,3);\n#undef test\n}\n\nvoid execHardware_interrupts();\n\nstatic void saveUserInput(EMUFILE* os);\nstatic bool loadUserInput(EMUFILE* is, int version);\n\nvoid nds_savestate(EMUFILE* os)\n{\n\t//version\n\twrite32le(3,os);\n\n\tsequencer.save(os);\n\n\tsaveUserInput(os);\n\n\twrite32le(LidClosed,os);\n\twrite8le(countLid,os);\n}\n\nbool nds_loadstate(EMUFILE* is, int size)\n{\n\t// this isn't part of the savestate loading logic, but\n\t// don't skip the next frame after loading a savestate\n\tframeSkipper.OmitSkip(true, true);\n\n\t//read version\n\tu32 version;\n\tif(read32le(&version,is) != 1) return false;\n\n\tif(version > 3) return false;\n\n\tbool temp = true;\n\ttemp &= sequencer.load(is, version);\n\tif(version <= 1 || !temp) return temp;\n\ttemp &= loadUserInput(is, version);\n\n\tif(version < 3) return temp;\n\n\tread32le(&LidClosed,is);\n\tread8le(&countLid,is);\n\n\treturn temp;\n}\n\nFORCEINLINE void arm9log()\n{\n#ifdef LOG_ARM9\n\tif(dolog)\n\t{\n\t\tchar dasmbuf[4096];\n\t\tif(NDS_ARM9.CPSR.bits.T)\n\t\t\tdes_thumb_instructions_set[((NDS_ARM9.instruction)>>6)&1023](NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf);\n\t\telse\n\t\t\tdes_arm_instructions_set[INDEX(NDS_ARM9.instruction)](NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf);\n\n#ifdef LOG_TO_FILE\n\t\tif (!fp_dis9) return;\n#ifdef LOG_TO_FILE_REGS\n\t\tfprintf(fp_dis9, \"\\t\\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\\n\\t\\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\\n\",\n\t\t\tNDS_ARM9.R[0],  NDS_ARM9.R[1],  NDS_ARM9.R[2],  NDS_ARM9.R[3],  NDS_ARM9.R[4],  NDS_ARM9.R[5],  NDS_ARM9.R[6],  NDS_ARM9.R[7], \n\t\t\tNDS_ARM9.R[8],  NDS_ARM9.R[9],  NDS_ARM9.R[10],  NDS_ARM9.R[11],  NDS_ARM9.R[12],  NDS_ARM9.R[13],  NDS_ARM9.R[14],  NDS_ARM9.R[15],\n\t\t\tNDS_ARM9.next_instruction, NDS_ARM9.CPSR.bits.N, NDS_ARM9.CPSR.bits.Z, NDS_ARM9.CPSR.bits.C, NDS_ARM9.CPSR.bits.V);\n#endif\n\t\tfprintf(fp_dis9, \"%s %08X\\t%08X \\t%s\\n\", NDS_ARM9.CPSR.bits.T?\"THUMB\":\"ARM\", NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf);\n\t\t/*if (NDS_ARM9.instruction == 0)\n\t\t{\n\t\t\tdolog = false;\n\t\t\tINFO(\"Disassembler is stopped\\n\");\n\t\t}*/\n#else\n\t\tprintf(\"%05d:%03d %12lld 9:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\\n\",\n\t\t\tcurrFrameCounter, nds.VCount, nds_timer, \n\t\t\tNDS_ARM9.instruct_adr,NDS_ARM9.instruction, dasmbuf, \n\t\t\tNDS_ARM9.R[0],  NDS_ARM9.R[1],  NDS_ARM9.R[2],  NDS_ARM9.R[3],  NDS_ARM9.R[4],  NDS_ARM9.R[5],  NDS_ARM9.R[6],  NDS_ARM9.R[7], \n\t\t\tNDS_ARM9.R[8],  NDS_ARM9.R[9],  NDS_ARM9.R[10],  NDS_ARM9.R[11],  NDS_ARM9.R[12],  NDS_ARM9.R[13],  NDS_ARM9.R[14],  NDS_ARM9.R[15]);  \n#endif\n\t}\n#endif\n}\n\nFORCEINLINE void arm7log()\n{\n#ifdef LOG_ARM7\n\tif(dolog)\n\t{\n\t\tchar dasmbuf[4096];\n\t\tif(NDS_ARM7.CPSR.bits.T)\n\t\t\tdes_thumb_instructions_set[((NDS_ARM7.instruction)>>6)&1023](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf);\n\t\telse\n\t\t\tdes_arm_instructions_set[INDEX(NDS_ARM7.instruction)](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf);\n#ifdef LOG_TO_FILE\n\t\tif (!fp_dis7) return;\n#ifdef LOG_TO_FILE_REGS\n\t\tfprintf(fp_dis7, \"\\t\\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\\n\\t\\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\\n\",\n\t\t\tNDS_ARM7.R[0],  NDS_ARM7.R[1],  NDS_ARM7.R[2],  NDS_ARM7.R[3],  NDS_ARM7.R[4],  NDS_ARM7.R[5],  NDS_ARM7.R[6],  NDS_ARM7.R[7], \n\t\t\tNDS_ARM7.R[8],  NDS_ARM7.R[9],  NDS_ARM7.R[10],  NDS_ARM7.R[11],  NDS_ARM7.R[12],  NDS_ARM7.R[13],  NDS_ARM7.R[14],  NDS_ARM7.R[15],\n\t\t\tNDS_ARM7.next_instruction, NDS_ARM7.CPSR.bits.N, NDS_ARM7.CPSR.bits.Z, NDS_ARM7.CPSR.bits.C, NDS_ARM7.CPSR.bits.V);\n#endif\n\t\tfprintf(fp_dis7, \"%s %08X\\t%08X \\t%s\\n\", NDS_ARM7.CPSR.bits.T?\"THUMB\":\"ARM\", NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf);\n\t\t/*if (NDS_ARM7.instruction == 0)\n\t\t{\n\t\t\tdolog = false;\n\t\t\tINFO(\"Disassembler is stopped\\n\");\n\t\t}*/\n#else\t\t\n\t\tprintf(\"%05d:%03d %12lld 7:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\\n\",\n\t\t\tcurrFrameCounter, nds.VCount, nds_timer, \n\t\t\tNDS_ARM7.instruct_adr,NDS_ARM7.instruction, dasmbuf, \n\t\t\tNDS_ARM7.R[0],  NDS_ARM7.R[1],  NDS_ARM7.R[2],  NDS_ARM7.R[3],  NDS_ARM7.R[4],  NDS_ARM7.R[5],  NDS_ARM7.R[6],  NDS_ARM7.R[7], \n\t\t\tNDS_ARM7.R[8],  NDS_ARM7.R[9],  NDS_ARM7.R[10],  NDS_ARM7.R[11],  NDS_ARM7.R[12],  NDS_ARM7.R[13],  NDS_ARM7.R[14],  NDS_ARM7.R[15]);\n#endif\n\t}\n#endif\n}\n\n//these have not been tuned very well yet.\nstatic const int kMaxWork = 4000;\nstatic const int kIrqWait = 4000;\n\nstatic FORCEINLINE s32 fasts32min(const s32& a, const s32& b)\n{\n\tconst s32 mask=a-b; \n\treturn b+((mask)&(mask>>31));\n}\n\ntemplate<bool doarm9, bool doarm7>\nstatic FORCEINLINE s32 minarmtime(const s32& arm9, const s32& arm7)\n{\n\tif(doarm9)\n\t\tif(doarm7)\n\t\t\treturn fasts32min(arm9,arm7);\n\t\telse\n\t\t\treturn arm9;\n\telse\n\t\treturn arm7;\n}\n\n\n#include \"armcpu_exec_inline.h\"\n\ntemplate<bool doarm9, bool doarm7, int cpuMode>\nstatic /*donotinline*/ std::pair<s32,s32> armInnerLoop(\n\tconst u64 nds_timer_base, const s32 s32next, s32 arm9, s32 arm7)\n{\n\ts32 timer = minarmtime<doarm9,doarm7>(arm9,arm7);\n\tif(nds_timer_base == 0)\n\t{\n\t\ttimer++;\n\t\ttimer--;\n\t}\n\twhile(timer < s32next && !sequencer.reschedule)\n\t{\n\t\tif(doarm9 && (!doarm7 || arm9 <= timer))\n\t\t{\n\t\t\tif(!NDS_ARM9.waitIRQ && !nds.freezeBus)\n\t\t\t\tarm9 += armcpu_exec<ARMCPU_ARM9,cpuMode>();\n\t\t\telse\n\t\t\t{\n\t\t\t\ts32 temp = arm9;\n\t\t\t\tarm9 = fasts32min(s32next, arm9 + kIrqWait);\n\t\t\t\tnds.idleCycles[0] += arm9-temp;\n\t\t\t\tif (gxFIFO.size < 255) nds.freezeBus &= ~1;\n\t\t\t}\n\t\t}\n\t\tif(doarm7 && (!doarm9 || arm7 <= timer))\n\t\t{\n\t\t\tif(!NDS_ARM7.waitIRQ && !nds.freezeBus)\n\t\t\t\tarm7 += (armcpu_exec<ARMCPU_ARM7,cpuMode>()<<1);\n\t\t\telse\n\t\t\t{\n\t\t\t\ts32 temp = arm7;\n\t\t\t\tarm7 = fasts32min(s32next, arm7 + kIrqWait);\n\t\t\t\tnds.idleCycles[1] += arm7-temp;\n\t\t\t\tif(arm7 == s32next)\n\t\t\t\t{\n\t\t\t\t\tnds_timer = nds_timer_base + minarmtime<doarm9,false>(arm9,arm7);\n\t\t\t\t\treturn armInnerLoop<doarm9,false,cpuMode>(nds_timer_base, s32next, arm9, arm7);\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttimer = minarmtime<doarm9,doarm7>(arm9,arm7);\n\t}\n\tnds_timer = nds_timer_base + timer;\n\treturn std::make_pair(arm9, arm7);\n}\n\nvoid NDS_debug_break()\n{\n\tNDS_ARM9.stalled = NDS_ARM7.stalled = 1;\n\n\t//triggers an immediate exit from the cpu loop\n\tNDS_Reschedule();\n}\n\nvoid NDS_debug_continue()\n{\n\tNDS_ARM9.stalled = NDS_ARM7.stalled = 0;\n}\n\nvoid NDS_debug_step()\n{\n\tNDS_debug_continue();\n\tsingleStep = true;\n}\n\ntemplate<bool FORCE>\nvoid NDS_exec(s32 nb)\n{\n\tLagFrameFlag=1;\n\n\tif((currFrameCounter&63) == 0)\n\t\tMMU_new.backupDevice.lazy_flush();\n\n\tsequencer.nds_vblankEnded = false;\n\n\tnds.cpuloopIterationCount = 0;\n\n\tIF_DEVELOPER(for(int i=0;i<32;i++) DEBUG_statistics.sequencerExecutionCounters[i] = 0);\n\n\tif(nds.sleeping)\n\t{\n\t\t//speculative code: if ANY irq happens, wake up the arm7.\n\t\t//I think the arm7 program analyzes the system and may decide not to wake up\n\t\t//if it is dissatisfied with the conditions\n\t\tif((MMU.reg_IE[1] & MMU.gen_IF<1>()))\n\t\t{\n\t\t\tnds.sleeping = FALSE;\n\t\t}\n\t}\n\telse\n\t{\n//#define PRINT_LOOP\n#ifdef PRINT_LOOP\n\t\textern unsigned long long RawGetTickCount();\n\t\textern unsigned long long RawGetTickPerSecond();\n\n\t\tunsigned long long tps = RawGetTickPerSecond();\n\t\tunsigned long long st,ed,ed2;\n\t\tunsigned int s1=0,s2=0,s3=0;\n#endif\n\n\t\tfor(;;)\n\t\t{\n#ifdef PRINT_LOOP\n\t\t\tst=RawGetTickCount();\n#endif\n\t\t\t//trap the debug-stalled condition\n\t\t\t#ifdef DEVELOPER\n\t\t\t\tsingleStep = false;\n\t\t\t\t//(gdb stub doesnt yet know how to trigger these immediately by calling reschedule)\n\t\t\t\twhile((NDS_ARM9.stalled || NDS_ARM7.stalled) && execute)\n\t\t\t\t{\n\t\t\t\t\tdriver->EMU_DebugIdleUpdate();\n\t\t\t\t\tnds_debug_continuing[0] = nds_debug_continuing[1] = true;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tnds.cpuloopIterationCount++;\n\t\t\tsequencer.execHardware();\n\n\t\t\t//break out once per frame\n\t\t\tif(sequencer.nds_vblankEnded) break;\n\t\t\t//it should be benign to execute execHardware in the next frame,\n\t\t\t//since there won't be anything for it to do (everything should be scheduled in the future)\n\n\t\t\t//bail in case the system halted\n\t\t\tif(!execute) break;\n\n\t\t\texecHardware_interrupts();\n\n\t\t\t//find next work unit:\n\t\t\tu64 next = sequencer.findNext();\n\t\t\tnext = min(next,nds_timer+kMaxWork); //lets set an upper limit for now\n\n\t\t\t//printf(\"%d\\n\",(next-nds_timer));\n\n\t\t\tsequencer.reschedule = false;\n\n\t\t\t//cast these down to 32bits so that things run faster on 32bit procs\n\t\t\tu64 nds_timer_base = nds_timer;\n\t\t\ts32 arm9 = (s32)(nds_arm9_timer-nds_timer);\n\t\t\ts32 arm7 = (s32)(nds_arm7_timer-nds_timer);\n\t\t\ts32 s32next = (s32)(next-nds_timer);\n\n\t\t\t#ifdef DEVELOPER\n\t\t\t\tif(singleStep)\n\t\t\t\t{\n\t\t\t\t\ts32next = 1;\n\t\t\t\t}\n\t\t\t#endif\n#ifdef PRINT_LOOP\n\t\t\ted=RawGetTickCount();\n\t\t\ts1+=ed-st;\n#endif\n\t\n#ifdef HAVE_JIT\t\t\n\t\t\tstd::pair<s32,s32> arm9arm7;\n\t\t\tswitch(CommonSettings.CpuMode)\n\t\t\t{\n\t\t\t\tcase 1: arm9arm7 = armInnerLoop<true,true,1>(nds_timer_base,s32next,arm9,arm7); break;\n\t\t\t\tcase 2: arm9arm7 = armInnerLoop<true,true,2>(nds_timer_base,s32next,arm9,arm7); break;\n\t\t\t\tdefault: arm9arm7 = armInnerLoop<true,true,0>(nds_timer_base,s32next,arm9,arm7); break;\n\t\t\t\t\t\n\t\t\t}\n#else\n\t\t\t\tstd::pair<s32,s32> arm9arm7 = armInnerLoop<true,true>(nds_timer_base,s32next,arm9,arm7);\n#endif\n\n\t\t\t#ifdef DEVELOPER\n\t\t\t\tif(singleStep)\n\t\t\t\t{\n\t\t\t\t\tNDS_ARM9.stalled = NDS_ARM7.stalled = 1;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tarm9 = arm9arm7.first;\n\t\t\tarm7 = arm9arm7.second;\n\t\t\tnds_arm7_timer = nds_timer_base+arm7;\n\t\t\tnds_arm9_timer = nds_timer_base+arm9;\n\n#ifndef NDEBUG\n\t\t\t//what we find here is dependent on the timing constants above\n\t\t\t//if(nds_timer>next && (nds_timer-next)>22)\n\t\t\t//\tprintf(\"curious. please report: over by %d\\n\",(int)(nds_timer-next));\n#endif\n\n\t\t\t//if we were waiting for an irq, don't wait too long:\n\t\t\t//let's re-analyze it after this hardware event (this rolls back a big burst of irq waiting which may have been interrupted by a resynch)\n\t\t\tif(NDS_ARM9.waitIRQ)\n\t\t\t{\n\t\t\t\tnds.idleCycles[0] -= (s32)(nds_arm9_timer-nds_timer);\n\t\t\t\tnds_arm9_timer = nds_timer;\n\t\t\t}\n\t\t\tif(NDS_ARM7.waitIRQ)\n\t\t\t{\n\t\t\t\tnds.idleCycles[1] -= (s32)(nds_arm7_timer-nds_timer);\n\t\t\t\tnds_arm7_timer = nds_timer;\n\t\t\t}\n#ifdef PRINT_LOOP\n\t\t\ted2=RawGetTickCount();\n\t\t\ts2+=ed2-ed;\n\t\t\ts3+=ed2-st;\n#endif\n\t\t}\n#ifdef PRINT_LOOP\n\t\tINFO(\"s1:%f s2:%f s3:%f\\n\",(float)(s1*1000000.0)/tps,(float)(s2*1000000.0)/tps,(float)(s3*1000000.0)/tps);\n#endif\n\t}\n\n\t//static int debug_pcount = 0;\n\t//if (debug_pcount++ > 10)\n\t//{\n\t//\t//DEBUG_statistics.printSequencerExecutionCounters();\n\t//\tDEBUG_statistics.print();\n\t//\t//DEBUG_reset();\n\t//\tdebug_pcount = 0;\n\t//}\n\n\t//end of frame emulation housekeeping\n\tif(LagFrameFlag)\n\t{\n\t\tlagframecounter++;\n\t\tTotalLagFrames++;\n\t}\n\telse \n\t{\n\t\tlastLag = lagframecounter;\n\t\tlagframecounter = 0;\n\t}\n\tcurrFrameCounter++;\n\tDEBUG_Notify.NextFrame();\n\tif (cheats)\n\t\tcheats->process();\n}\n\ntemplate<int PROCNUM> static void execHardware_interrupts_core()\n{\n\tu32 IF = MMU.gen_IF<PROCNUM>();\n\tu32 IE = MMU.reg_IE[PROCNUM];\n\tu32 masked = IF & IE;\n\tif(ARMPROC.halt_IE_and_IF && masked)\n\t{\n\t\tARMPROC.halt_IE_and_IF = FALSE;\n\t\tARMPROC.waitIRQ = FALSE;\n\t}\n\n\tif(masked && MMU.reg_IME[PROCNUM] && !ARMPROC.CPSR.bits.I)\n\t{\n\t\t//printf(\"Executing IRQ on procnum %d with IF = %08X and IE = %08X\\n\",PROCNUM,IF,IE);\n\t\tarmcpu_irqException(&ARMPROC);\n\t}\n}\n\nvoid execHardware_interrupts()\n{\n\texecHardware_interrupts_core<ARMCPU_ARM9>();\n\texecHardware_interrupts_core<ARMCPU_ARM7>();\n}\n\nstatic void resetUserInput();\n\nstatic void PrepareBiosARM7()\n{\n\tNDS_ARM7.BIOS_loaded = false;\n\tmemset(MMU.ARM7_BIOS, 0, sizeof(MMU.ARM7_BIOS));\n\tif(CommonSettings.UseExtBIOS == true)\n\t{\n\t\t//read arm7 bios from inputfile and flag it if it succeeds\n\t\tFILE *arm7inf = fopen(CommonSettings.ARM7BIOS,\"rb\");\n\t\tif (fread(MMU.ARM7_BIOS,1,16384,arm7inf) == 16384)\n\t\t\tNDS_ARM7.BIOS_loaded = true;\n\t\tfclose(arm7inf);\n\t}\n\n\t//choose to use SWI emulation or routines from bios\n\tif((CommonSettings.SWIFromBIOS) && (NDS_ARM7.BIOS_loaded))\n\t{\n\t\tNDS_ARM7.swi_tab = 0;\n\n\t\t//if we used routines from bios, apply patches\n\t\tif (CommonSettings.PatchSWI3)\n\t\t\t_MMU_write16<ARMCPU_ARM7>(0x00002F08, 0x4770);\n\t} \n\telse \n\t\tNDS_ARM7.swi_tab = ARM_swi_tab[ARMCPU_ARM7];\n\n\tif(NDS_ARM7.BIOS_loaded)\n\t{\n\t\tINFO(\"ARM7 BIOS load: %s.\\n\", NDS_ARM7.BIOS_loaded?\"OK\":\"FAILED\");\n\t}\n\telse\n\t{\n\t\t//fake bios content, critical to normal operations, since we dont have a real bios.\n\n#if 0\n\t\t//someone please document what is in progress here\n\t\t// TODO\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0000, 0xEAFFFFFE);\t\t// loop for Reset !!!\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0004, 0xEAFFFFFE);\t\t// loop for Undef instr expection\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0008, 0xEA00009C);\t\t// SWI\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x000C, 0xEAFFFFFE);\t\t// loop for Prefetch Abort\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0010, 0xEAFFFFFE);\t\t// loop for Data Abort\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0014, 0x00000000);\t\t// Reserved\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x001C, 0x00000000);\t\t// Fast IRQ\n#endif\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0000, 0xE25EF002);\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0018, 0xEA000000);\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0020, 0xE92D500F);\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0024, 0xE3A00301);\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0028, 0xE28FE000);\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x002C, 0xE510F004);\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0030, 0xE8BD500F);\n\t\tT1WriteLong(MMU.ARM7_BIOS, 0x0034, 0xE25EF004);\n\t}\n}\n\nstatic void PrepareBiosARM9()\n{\n\tmemset(MMU.ARM9_BIOS, 0, sizeof(MMU.ARM9_BIOS));\n\tNDS_ARM9.BIOS_loaded = false;\n\tif(CommonSettings.UseExtBIOS == true)\n\t{\n\t\t//read arm9 bios from inputfile and flag it if it succeeds\n\t\tFILE* arm9inf = fopen(CommonSettings.ARM9BIOS,\"rb\");\n\t\tif (fread(MMU.ARM9_BIOS,1,4096,arm9inf) == 4096) \n\t\t\tNDS_ARM9.BIOS_loaded = true;\n\t\tfclose(arm9inf);\n\t}\n\n\t//choose to use SWI emulation or routines from bios\n\tif((CommonSettings.SWIFromBIOS) && (NDS_ARM9.BIOS_loaded))\n\t{\n\t\tNDS_ARM9.swi_tab = 0;\n\t\t\n\t\t//if we used routines from bios, apply patches\n\t\tif (CommonSettings.PatchSWI3)\n\t\t\t_MMU_write16<ARMCPU_ARM9>(0xFFFF07CC, 0x4770);\n\t}\n\telse NDS_ARM9.swi_tab = ARM_swi_tab[ARMCPU_ARM9];\n\n\tif(NDS_ARM9.BIOS_loaded) \n\t{\n\t\tINFO(\"ARM9 BIOS load: %s.\\n\", NDS_ARM9.BIOS_loaded?\"OK\":\"FAILED\");\n\t} \n\telse \n\t{\n\t\t//fake bios content, critical to normal operations, since we dont have a real bios.\n\t\t//it'd be cool if we could write this in some kind of assembly language, inline or otherwise, without some bulky dependencies\n\t\t//perhaps we could build it with devkitarm? but thats bulky (offline) dependencies, to be sure..\n\n\t\t//reminder: bios chains data abort to fast irq\n\n\t\t//exception vectors:\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0000, 0xEAFFFFFE);\t\t// (infinite loop for) Reset !!!\n\t\t//T1WriteLong(MMU.ARM9_BIOS, 0x0004, 0xEAFFFFFE);\t\t// (infinite loop for) Undefined instruction\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0004, 0xEA000004);\t\t// Undefined instruction -> Fast IRQ (just guessing)\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0008, 0xEA00009C);\t\t// SWI -> ?????\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x000C, 0xEAFFFFFE);\t\t// (infinite loop for) Prefetch Abort\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0010, 0xEA000001);\t\t// Data Abort -> Fast IRQ\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0014, 0x00000000);\t\t// Reserved\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0018, 0xEA000095);\t\t// Normal IRQ -> 0x0274\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x001C, 0xEA00009D);\t\t// Fast IRQ -> 0x0298\n\n\t\tstatic const u8 logo_data[156] = {\n\t\t\t0x24,0xFF,0xAE,0x51,0x69,0x9A,0xA2,0x21,0x3D,0x84,0x82,0x0A,0x84,0xE4,0x09,0xAD,\n\t\t\t0x11,0x24,0x8B,0x98,0xC0,0x81,0x7F,0x21,0xA3,0x52,0xBE,0x19,0x93,0x09,0xCE,0x20,\n\t\t\t0x10,0x46,0x4A,0x4A,0xF8,0x27,0x31,0xEC,0x58,0xC7,0xE8,0x33,0x82,0xE3,0xCE,0xBF,\n\t\t\t0x85,0xF4,0xDF,0x94,0xCE,0x4B,0x09,0xC1,0x94,0x56,0x8A,0xC0,0x13,0x72,0xA7,0xFC,\n\t\t\t0x9F,0x84,0x4D,0x73,0xA3,0xCA,0x9A,0x61,0x58,0x97,0xA3,0x27,0xFC,0x03,0x98,0x76,\n\t\t\t0x23,0x1D,0xC7,0x61,0x03,0x04,0xAE,0x56,0xBF,0x38,0x84,0x00,0x40,0xA7,0x0E,0xFD,\n\t\t\t0xFF,0x52,0xFE,0x03,0x6F,0x95,0x30,0xF1,0x97,0xFB,0xC0,0x85,0x60,0xD6,0x80,0x25,\n\t\t\t0xA9,0x63,0xBE,0x03,0x01,0x4E,0x38,0xE2,0xF9,0xA2,0x34,0xFF,0xBB,0x3E,0x03,0x44,\n\t\t\t0x78,0x00,0x90,0xCB,0x88,0x11,0x3A,0x94,0x65,0xC0,0x7C,0x63,0x87,0xF0,0x3C,0xAF,\n\t\t\t0xD6,0x25,0xE4,0x8B,0x38,0x0A,0xAC,0x72,0x21,0xD4,0xF8,0x07\n\t\t};\n\t\t\n\t\t// logo (do some games fail to boot without this? example?)\n\t\tfor (int t = 0; t < 0x9C; t++)\n\t\t\tMMU.ARM9_BIOS[t + 0x20] = logo_data[t];\n\n\t\t//...0xBC:\n\n\t\t//(now what goes in this gap??)\n\n\t\t//IRQ handler: get dtcm address and jump to a vector in it\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0274, 0xE92D500F); //STMDB SP!, {R0-R3,R12,LR} \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0278, 0xEE190F11); //MRC CP15, 0, R0, CR9, CR1, 0\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x027C, 0xE1A00620); //MOV R0, R0, LSR #C\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0280, 0xE1A00600); //MOV R0, R0, LSL #C \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0284, 0xE2800C40); //ADD R0, R0, #4000\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0288, 0xE28FE000); //ADD LR, PC, #0   \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x028C, 0xE510F004); //LDR PC, [R0, -#4] \n\n\t\t//????\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0290, 0xE8BD500F); //LDMIA SP!, {R0-R3,R12,LR}\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0294, 0xE25EF004); //SUBS PC, LR, #4\n\n\t\t//-------\n\t\t//FIQ and abort exception handler\n\t\t//TODO - this code is copied from the bios. refactor it\n\t\t//friendly reminder: to calculate an immediate offset: encoded = (desired_address-cur_address-8)\n\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x0298, 0xE10FD000); //MRS SP, CPSR  \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x029C, 0xE38DD0C0); //ORR SP, SP, #C0\n\t\t\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02A0, 0xE12FF00D); //MSR CPSR_fsxc, SP\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02A4, 0xE59FD000 | (0x2D4-0x2A4-8)); //LDR SP, [FFFF02D4]\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02A8, 0xE28DD001); //ADD SP, SP, #1   \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02AC, 0xE92D5000); //STMDB SP!, {R12,LR}\n\t\t\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02B0, 0xE14FE000); //MRS LR, SPSR\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02B4, 0xEE11CF10); //MRC CP15, 0, R12, CR1, CR0, 0\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02B8, 0xE92D5000); //STMDB SP!, {R12,LR}\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02BC, 0xE3CCC001); //BIC R12, R12, #1\n\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02C0, 0xEE01CF10); //MCR CP15, 0, R12, CR1, CR0, 0\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02C4, 0xE3CDC001); //BIC R12, SP, #1    \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02C8, 0xE59CC010); //LDR R12, [R12, #10] \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02CC, 0xE35C0000); //CMP R12, #0  \n\n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02D0, 0x112FFF3C); //BLXNE R12    \n\t\tT1WriteLong(MMU.ARM9_BIOS, 0x02D4, 0x027FFD9C); //0x027FFD9C  \n\t\t//---------\n\t}\n}\n\nstatic void JumbleMemory()\n{\n\t//put random garbage in vram for homebrew games, to help mimic the situation where libnds does not clear out junk\n\t//which the card's launcher may or may not have left behind\n\t//analysis:\n  //1. retail games dont clear TCM, so why should we jumble it and expect homebrew to clear it?\n  //2. some retail games _dont boot_ if main memory is jumbled. wha...?\n  //3. clearing this is not as useful as tracking uninitialized reads in dev+ builds\n  //4. the vram clearing causes lots of graphical corruptions in badly coded homebrews. this reduces compatibility substantially\n  //conclusion: disable it for now and bring it back as an option\n\t//if(gameInfo.isHomebrew)\n\t//{\n\t//\tu32 w=100000,x=99,y=117,z=19382173;\n\t//\tCTASSERT(sizeof(MMU.ARM9_LCD) < sizeof(MMU.MAIN_MEM));\n\t//\tCTASSERT(sizeof(MMU.ARM9_VMEM) < sizeof(MMU.MAIN_MEM));\n\t//\tCTASSERT(sizeof(MMU.ARM9_ITCM) < sizeof(MMU.MAIN_MEM));\n\t//\tCTASSERT(sizeof(MMU.ARM9_DTCM) < sizeof(MMU.MAIN_MEM));\n\t//\tfor(int i=0;i<sizeof(MMU.MAIN_MEM);i++)\n\t//\t{\n\t//\t\tu32 t= (x^(x<<11)); \n\t//\t\tx=y;\n\t//\t\ty=z; \n\t//\t\tz=w;\n\t//\t\tt = (w= (w^(w>>19))^(t^(t>>8)));\n\t//\t\t//MMU.MAIN_MEM[i] = t;\n\t//\t\tif (i<sizeof(MMU.ARM9_LCD)) MMU.ARM9_LCD[i] = t;\n\t//\t\tif (i<sizeof(MMU.ARM9_VMEM)) MMU.ARM9_VMEM[i] = t;\n\t//\t\t//if (i<sizeof(MMU.ARM9_ITCM)) MMU.ARM9_ITCM[i] = t;\n\t//\t\t//if (i<sizeof(MMU.ARM9_DTCM)) MMU.ARM9_DTCM[i] = t;\n\t//\t}\n\t//}\n}\n\nstatic void PrepareLogfiles()\n{\n#ifdef LOG_ARM7\n\tif (fp_dis7 != NULL) \n\t{\n\t\tfclose(fp_dis7);\n\t\tfp_dis7 = NULL;\n\t}\n\tfp_dis7 = fopen(\"D:\\\\desmume_dis7.asm\", \"w\");\n#endif\n\n#ifdef LOG_ARM9\n\tif (fp_dis9 != NULL) \n\t{\n\t\tfclose(fp_dis9);\n\t\tfp_dis9 = NULL;\n\t}\n\tfp_dis9 = fopen(\"D:\\\\desmume_dis9.asm\", \"w\");\n#endif\n}\n\nbool _HACK_DONT_STOPMOVIE = false;\nvoid NDS_Reset()\n{\n\tsingleStep = false;\n\tnds_debug_continuing[0] = nds_debug_continuing[1] = false;\n\tbool fw_success = false;\n\tFILE* inf = NULL;\n\tNDS_header * header = NDS_getROMHeader();\n\n\tDEBUG_reset();\n\n\tif (!header) return ;\n\n\tnds.sleeping = FALSE;\n\tnds.cardEjected = FALSE;\n\tnds.freezeBus = 0;\n\tnds.power1.lcd = nds.power1.gpuMain = nds.power1.gfx3d_render = nds.power1.gfx3d_geometry = nds.power1.gpuSub = nds.power1.dispswap = 1;\n\tnds.power2.speakers = 1;\n\tnds.power2.wifi = 0;\n\n\tnds_timer = 0;\n\tnds_arm9_timer = 0;\n\tnds_arm7_timer = 0;\n\n\tif(movieMode != MOVIEMODE_INACTIVE && !_HACK_DONT_STOPMOVIE)\n\t\tmovie_reset_command = true;\n\n\tif(movieMode == MOVIEMODE_INACTIVE) {\n\t\tcurrFrameCounter = 0;\n\t\tlagframecounter = 0;\n\t\tLagFrameFlag = 0;\n\t\tlastLag = 0;\n\t\tTotalLagFrames = 0;\n\t}\n\n\tSPU_DeInit();\n\n\tMMU_Reset();\n\n#ifdef HAVE_JIT\n\tarmcpu_setjitmode(CommonSettings.CpuMode);\n#endif\n\n\tJumbleMemory();\n\tPrepareBiosARM7();\n\tPrepareBiosARM9();\n\n\tPrepareLogfiles();\n\n\t//according to smea, this is initialized to 3 by the time we get into a user game program. who does this? \n\t//well, the firmware load process is about to write a boot program into SIWRAM for the arm7. so we need it setup by now.\n\t//but, this is a bit weird.. I would be expecting the bioses to do that. maybe we have some more detail to emulate.\n\t//* is this setting the default, or does the bios do it before loading the firmware programs?\n\t//at any, it's important that this be done long before the user code ever runs\n\t_MMU_write08<ARMCPU_ARM9>(REG_WRAMCNT,3);\n\n\tif (firmware)\n\t{\n\t\tdelete firmware;\n\t\tfirmware = NULL;\n\t}\n\tfirmware = new CFIRMWARE();\n\tfw_success = firmware->load();\n\n\tif (NDS_ARM7.BIOS_loaded && NDS_ARM9.BIOS_loaded && CommonSettings.BootFromFirmware && fw_success)\n\t{\n\t\t//Copy secure area to memory if needed.\n\t\t//could we get a comment about what's going on here?\n\t\t//how does this stuff get copied before anything ever even runs?\n\t\t//does it get mapped straight to the rom somehow?\n\t\t//This code could be made more clear too.\n\t\tif ((header->ARM9src >= 0x4000) && (header->ARM9src < 0x8000))\n\t\t{\n\t\t\tu32 src = header->ARM9src;\n\t\t\tu32 dst = header->ARM9cpy;\n\n\t\t\tu32 size = (0x8000 - src) >> 2;\n\t\n\t\t\tfor (u32 i = 0; i < size; i++)\n\t\t\t{\n\t\t\t\t_MMU_write32<ARMCPU_ARM9>(dst, T1ReadLong(MMU.CART_ROM, src));\n\t\t\t\tsrc += 4; dst += 4;\n\t\t\t}\n\t\t}\n\n\t\t//TODO someone describe why here\n\t\tif (firmware->patched)\n\t\t{\n\t\t\tarmcpu_init(&NDS_ARM7, 0x00000008);\n\t\t\tarmcpu_init(&NDS_ARM9, 0xFFFF0008);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//set the cpus to an initial state with their respective firmware program entrypoints\n\t\t\tarmcpu_init(&NDS_ARM7, firmware->ARM7bootAddr);\n\t\t\tarmcpu_init(&NDS_ARM9, firmware->ARM9bootAddr);\n\t\t}\n\n\t\t//set REG_POSTFLG to the value indicating pre-firmware status\n\t\tMMU.ARM9_REG[0x300] = 0;\n\t\tMMU.ARM7_REG[0x300] = 0;\n\t}\n\telse\n\t{\n\t\t//fake firmware boot-up process\n\n\t\t// Create the dummy firmware\n\t\tNDS_CreateDummyFirmware(&CommonSettings.fw_config);\n\n\t\t//copy the arm9 program to the address specified by rom header\n\t\tu32 src = header->ARM9src;\n\t\tu32 dst = header->ARM9cpy;\n\t\tfor(u32 i = 0; i < (header->ARM9binSize>>2); ++i)\n\t\t{\n\t\t\t_MMU_write32<ARMCPU_ARM9>(dst, T1ReadLong(MMU.CART_ROM, src));\n\t\t\tdst += 4;\n\t\t\tsrc += 4;\n\t\t}\n\n\t\t//copy the arm7 program to the address specified by rom header\n\t\tsrc = header->ARM7src;\n\t\tdst = header->ARM7cpy;\n\t\tfor(u32 i = 0; i < (header->ARM7binSize>>2); ++i)\n\t\t{\n\t\t\t_MMU_write32<ARMCPU_ARM7>(dst, T1ReadLong(MMU.CART_ROM, src));\n\t\t\tdst += 4;\n\t\t\tsrc += 4;\n\t\t}\n\n\t\t//set the cpus to an initial state with their respective programs entrypoints\n\t\tarmcpu_init(&NDS_ARM7, header->ARM7exe);\n\t\tarmcpu_init(&NDS_ARM9, header->ARM9exe);\n\n\t\t//set REG_POSTFLG to the value indicating post-firmware status\n\t\tMMU.ARM9_REG[0x300] = 1;\n\t\tMMU.ARM7_REG[0x300] = 1;\n\t}\n\n\t// only ARM9 have co-processor\n\treconstruct(&cp15);\n\tcp15.reset(&NDS_ARM9);\n\n\t//bitbox 4k demo is so stripped down it relies on default stack values\n\t//otherwise the arm7 will crash before making a sound\n\t//(these according to gbatek softreset bios docs)\n\tNDS_ARM7.R13_svc = 0x0380FFDC;\n\tNDS_ARM7.R13_irq = 0x0380FFB0;\n\tNDS_ARM7.R13_usr = 0x0380FF00;\n\tNDS_ARM7.R[13] = NDS_ARM7.R13_usr;\n\t//and let's set these for the arm9 while we're at it, though we have no proof\n\tNDS_ARM9.R13_svc = 0x00803FC0;\n\tNDS_ARM9.R13_irq = 0x00803FA0;\n\tNDS_ARM9.R13_usr = 0x00803EC0;\n\tNDS_ARM9.R13_abt = NDS_ARM9.R13_usr; //????? \n\t//I think it is wrong to take gbatek's \"SYS\" and put it in USR--maybe USR doesnt matter. \n\t//i think SYS is all the misc modes. please verify by setting nonsensical stack values for USR here\n\tNDS_ARM9.R[13] = NDS_ARM9.R13_usr;\n\t//n.b.: im not sure about all these, I dont know enough about arm9 svc/irq/etc modes\n\t//and how theyre named in desmume to match them up correctly. i just guessed.\n\n\tnds.wifiCycle = 0;\n\tmemset(nds.timerCycle, 0, sizeof(u64) * 2 * 4);\n\tnds.old = 0;\n\tnds.scr_touchX = nds.scr_touchY = nds.adc_touchX = nds.adc_touchY = 0;\n\tnds.isTouch = 0;\n\tnds.paddle = 0;\n\tnds.ConsoleType = CommonSettings.ConsoleType;\n\tnds._DebugConsole = CommonSettings.DebugConsole;\n\tnds.ensataEmulation = CommonSettings.EnsataEmulation;\n\tnds.stylusJitter = CommonSettings.StylusJitter;\n\tnds.ensataHandshake = ENSATA_HANDSHAKE_none;\n\tnds.ensataIpcSyncCounter = 0;\n\tSetupMMU(nds.Is_DebugConsole(),nds.Is_DSI());\n\n\t_MMU_write16<ARMCPU_ARM9>(REG_KEYINPUT, 0x3FF);\n\t_MMU_write16<ARMCPU_ARM7>(REG_KEYINPUT, 0x3FF);\n\t_MMU_write08<ARMCPU_ARM7>(REG_EXTKEYIN, 0x43);\n\n\tLidClosed = FALSE;\n\tcountLid = 0;\n\n\tresetUserInput();\n\n\t//Setup a copy of the firmware user settings in memory.\n\t//(this is what the DS firmware would do).\n\t{\n\t\tu8 temp_buffer[NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT];\n\t\tint fw_index;\n\n\t\tif ( copy_firmware_user_data( temp_buffer, MMU.fw.data)) {\n\t\t\tfor ( fw_index = 0; fw_index < NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT; fw_index++)\n\t\t\t\t_MMU_write08<ARMCPU_ARM9>(0x027FFC80 + fw_index, temp_buffer[fw_index]);\n\t\t}\n\t}\n\n\t// Copy the whole header to Main RAM 0x27FFE00 on startup. (http://nocash.emubase.de/gbatek.htm#dscartridgeheader)\n\t//once upon a time this copied 0x90 more. this was thought to be wrong, and changed.\n\tif(nds.Is_DSI())\n\t{\n\t\t//dsi needs this copied later in memory. there are probably a number of things that  get copied to a later location in memory.. thats where the NDS consoles tend to stash stuff.\n\t\tfor (int i = 0; i < ((0x170)/4); i++)\n\t\t\t_MMU_write32<ARMCPU_ARM9>(0x02FFFE00+i*4, LE_TO_LOCAL_32(((u32*)MMU.CART_ROM)[i]));\n\t}\n\telse\n\t{\n\t\tfor (int i = 0; i < ((0x170)/4); i++)\n\t\t\t_MMU_write32<ARMCPU_ARM9>(0x027FFE00+i*4, LE_TO_LOCAL_32(((u32*)MMU.CART_ROM)[i]));\n\t}\n\n\n\t// Write the header checksum to memory (the firmware needs it to see the cart)\n\t_MMU_write16<ARMCPU_ARM9>(0x027FF808, T1ReadWord(MMU.CART_ROM, 0x15E));\n\n\t//--------------------------------\n\t//setup the homebrew argv\n\t//this is useful for nitrofs apps which are emulating themselves via cflash\n\t//struct __argv {\n\t//\tint argvMagic;\t\t//!< argv magic number, set to 0x5f617267 ('_arg') if valid \n\t//\tchar *commandLine;\t//!< base address of command line, set of null terminated strings\n\t//\tint length;\t\t\t//!< total length of command line\n\t//\tint argc;\t\t\t//!< internal use, number of arguments\n\t//\tchar **argv;\t\t//!< internal use, argv pointer\n\t//};\n\tstd::string rompath = \"fat:/\" + path.RomName;\n\tconst u32 kCommandline = 0x027E0000;\n\t//const u32 kCommandline = 0x027FFF84;\n\n\t//\n\t_MMU_write32<ARMCPU_ARM9>(0x02FFFE70, 0x5f617267);\n\t_MMU_write32<ARMCPU_ARM9>(0x02FFFE74, kCommandline); //(commandline starts here)\n\t_MMU_write32<ARMCPU_ARM9>(0x02FFFE78, rompath.size()+1);\n\t//0x027FFF7C (argc)\n\t//0x027FFF80 (argv)\n\tfor(size_t i=0;i<rompath.size();i++)\n\t\t_MMU_write08<ARMCPU_ARM9>(kCommandline+i, rompath[i]);\n\t_MMU_write08<ARMCPU_ARM9>(kCommandline+rompath.size(), 0);\n\t//--------------------------------\n\n\tif ((firmware->patched) && (CommonSettings.UseExtBIOS == true) && (CommonSettings.BootFromFirmware == true) && (fw_success == TRUE))\n\t{\n\t\t// HACK! for flashme\n\t\t_MMU_write32<ARMCPU_ARM9>(0x27FFE24, firmware->ARM9bootAddr);\n\t\t_MMU_write32<ARMCPU_ARM7>(0x27FFE34, firmware->ARM7bootAddr);\n\t}\n\n\t// make system think it's booted from card -- EXTREMELY IMPORTANT!!! Thanks to cReDiAr\n\t_MMU_write08<ARMCPU_ARM9>(0x02FFFC40,0x1);\n\t_MMU_write08<ARMCPU_ARM7>(0x02FFFC40,0x1);\n\n\t// Save touchscreen calibration info in a structure\n\t// so we can easily access it at any time\n\tTSCal.adc.x1 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x58);\n\tTSCal.adc.y1 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x5A);\n\tTSCal.scr.x1 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x5C);\n\tTSCal.scr.y1 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x5D);\n\tTSCal.adc.x2 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x5E);\n\tTSCal.adc.y2 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x60);\n\tTSCal.scr.x2 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x62);\n\tTSCal.scr.y2 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x63);\n\n\tTSCal.adc.width = (TSCal.adc.x2 - TSCal.adc.x1);\n\tTSCal.adc.height = (TSCal.adc.y2 - TSCal.adc.y1);\n\tTSCal.scr.width = (TSCal.scr.x2 - TSCal.scr.x1);\n\tTSCal.scr.height = (TSCal.scr.y2 - TSCal.scr.y1);\n\n\tMainScreen.offset = 0;\n\tSubScreen.offset = 192;\n\n\t//_MMU_write32[ARMCPU_ARM9](0x02007FFC, 0xE92D4030);\n\n\tdelete header;\n\n\tScreen_Reset();\n\tgfx3d_reset();\n\tgpu3D->NDS_3D_Reset();\n\tslot1Reset();\n\n\tWIFI_Reset();\n\n\tmemcpy(FW_Mac, (MMU.fw.data + 0x36), 6);\n\n\tinitSchedule();\n\n\tSPU_ReInit();\n}\n\nstatic std::string MakeInputDisplayString(u16 pad, const std::string* Buttons, int count) {\n    std::string s;\n    for (int x = 0; x < count; x++) {\n        if (pad & (1 << x))\n            s.append(Buttons[x].size(), ' '); \n        else\n            s += Buttons[x];\n    }\n    return s;\n}\n\nstatic std::string MakeInputDisplayString(u16 pad, u16 padExt) {\n    const std::string Buttons[] = {\"A\", \"B\", \"Sl\", \"St\", \"R\", \"L\", \"U\", \"D\", \"Rs\", \"Ls\"};\n    const std::string Ext[] = {\"X\", \"Y\"};\n\n    std::string s = MakeInputDisplayString(pad, Ext, ARRAY_SIZE(Ext));\n    s += MakeInputDisplayString(padExt, Buttons, ARRAY_SIZE(Buttons));\n\n    return s;\n}\n\n\nbuttonstruct<bool> Turbo;\nbuttonstruct<int> TurboTime;\nbuttonstruct<bool> AutoHold;\n\nvoid ClearAutoHold(void) {\n\t\n\tfor (u32 i=0; i < ARRAY_SIZE(AutoHold.array); i++) {\n\t\tAutoHold.array[i]=false;\n\t}\n}\n\n//convert a 12.4 screen coordinate to an ADC value.\n//the desmume host system will track the screen coordinate, but the hardware should be receiving the raw ADC values.\n//so we'll need to use this to simulate the ADC values corresponding to the desired screen coords, based on the current TSC calibrations\nu16 NDS_getADCTouchPosX(int scrX_lsl4)\n{\n\tscrX_lsl4 >>= 4;\n\tint rv = ((scrX_lsl4 - TSCal.scr.x1 + 1) * TSCal.adc.width) / TSCal.scr.width + TSCal.adc.x1;\n\trv = min(0xFFF, max(0, rv));\n\treturn (u16)(rv);\n}\nu16 NDS_getADCTouchPosY(int scrY_lsl4)\n{\n\tscrY_lsl4 >>= 4;\n\tint rv = ((scrY_lsl4 - TSCal.scr.y1 + 1) * TSCal.adc.height) / TSCal.scr.height + TSCal.adc.y1;\n\trv = min(0xFFF, max(0, rv));\n\treturn (u16)(rv);\n}\n\nstatic UserInput rawUserInput = {}; // requested input, generally what the user is physically pressing\nstatic UserInput intermediateUserInput = {}; // intermediate buffer for modifications (seperated from finalUserInput for safety reasons)\nstatic UserInput finalUserInput = {}; // what gets sent to the game and possibly recorded\nbool validToProcessInput = false;\n\nconst UserInput& NDS_getRawUserInput()\n{\n\treturn rawUserInput;\n}\nUserInput& NDS_getProcessingUserInput()\n{\n\tassert(validToProcessInput);\n\treturn intermediateUserInput;\n}\nbool NDS_isProcessingUserInput()\n{\n\treturn validToProcessInput;\n}\nconst UserInput& NDS_getFinalUserInput()\n{\n\treturn finalUserInput;\n}\n\n\nstatic void saveUserInput(EMUFILE* os, UserInput& input)\n{\n\tos->fwrite((const char*)input.buttons.array, 14);\n\twritebool(input.touch.isTouch, os);\n\twrite16le(input.touch.touchX, os);\n\twrite16le(input.touch.touchY, os);\n\twrite32le(input.mic.micButtonPressed, os);\n}\nstatic bool loadUserInput(EMUFILE* is, UserInput& input, int version)\n{\n\tis->fread((char*)input.buttons.array, 14);\n\treadbool(&input.touch.isTouch, is);\n\tread16le(&input.touch.touchX, is);\n\tread16le(&input.touch.touchY, is);\n\tread32le(&input.mic.micButtonPressed, is);\n\treturn true;\n}\nstatic void resetUserInput(UserInput& input)\n{\n\tmemset(&input, 0, sizeof(UserInput));\n}\n// (userinput is kind of a misnomer, e.g. finalUserInput has to mirror nds.pad, nds.touchX, etc.)\nstatic void saveUserInput(EMUFILE* os)\n{\n\tsaveUserInput(os, finalUserInput);\n\tsaveUserInput(os, intermediateUserInput); // saved in case a savestate is made during input processing (which Lua could do if nothing else)\n\twritebool(validToProcessInput, os);\n\tfor(int i = 0; i < 14; i++)\n\t\twrite32le(TurboTime.array[i], os); // saved to make autofire more tolerable to use with re-recording\n}\nstatic bool loadUserInput(EMUFILE* is, int version)\n{\n\tbool rv = true;\n\trv &= loadUserInput(is, finalUserInput, version);\n\trv &= loadUserInput(is, intermediateUserInput, version);\n\treadbool(&validToProcessInput, is);\n\tfor(int i = 0; i < 14; i++)\n\t\tread32le((u32*)&TurboTime.array[i], is);\n\treturn rv;\n}\nstatic void resetUserInput()\n{\n\tresetUserInput(finalUserInput);\n\tresetUserInput(intermediateUserInput);\n}\n\nstatic inline void gotInputRequest()\n{\n\t// nobody should set the raw input while we're processing the input.\n\t// it might not screw anything up but it would be completely useless.\n\tassert(!validToProcessInput);\n}\n\nvoid NDS_setPad(bool R,bool L,bool D,bool U,bool T,bool S,bool B,bool A,bool Y,bool X,bool W,bool E,bool G, bool F)\n{\n\tgotInputRequest();\n\tUserButtons& rawButtons = rawUserInput.buttons;\n\trawButtons.R = R;\n\trawButtons.L = L;\n\trawButtons.D = D;\n\trawButtons.U = U;\n\trawButtons.T = T;\n\trawButtons.S = S;\n\trawButtons.B = B;\n\trawButtons.A = A;\n\trawButtons.Y = Y;\n\trawButtons.X = X;\n\trawButtons.W = W;\n\trawButtons.E = E;\n\trawButtons.G = G;\n\trawButtons.F = F;\n}\nvoid NDS_setTouchPos(u16 x, u16 y)\n{\n\tgotInputRequest();\n\trawUserInput.touch.touchX = x<<4;\n\trawUserInput.touch.touchY = y<<4;\n\trawUserInput.touch.isTouch = true;\n\n\tif(movieMode != MOVIEMODE_INACTIVE && movieMode != MOVIEMODE_FINISHED)\n\t{\n\t\t// just in case, since the movie only stores 8 bits per touch coord\n#ifdef WORDS_BIGENDIAN\n\t\trawUserInput.touch.touchX &= 0xF00F;\n\t\trawUserInput.touch.touchY &= 0xF00F;\n#else\n\t\trawUserInput.touch.touchX &= 0x0FF0;\n\t\trawUserInput.touch.touchY &= 0x0FF0;\n#endif\n\t}\n}\nvoid NDS_releaseTouch(void)\n{ \n\tgotInputRequest();\n\trawUserInput.touch.touchX = 0;\n\trawUserInput.touch.touchY = 0;\n\trawUserInput.touch.isTouch = false;\n}\nvoid NDS_setMic(bool pressed)\n{\n\tgotInputRequest();\n\trawUserInput.mic.micButtonPressed = (pressed ? TRUE : FALSE);\n}\n\n\nstatic void NDS_applyFinalInput();\n\n\nvoid NDS_beginProcessingInput()\n{\n\t// start off from the raw input\n\tintermediateUserInput = rawUserInput;\n\n\t// processing is valid now\n\tvalidToProcessInput = true;\n}\n\nvoid NDS_endProcessingInput()\n{\n\t// transfer the processed input\n\tfinalUserInput = intermediateUserInput;\n\n\t// processing is invalid now\n\tvalidToProcessInput = false;\n\n\t// use the final input for a few things right away\n\tNDS_applyFinalInput();\n}\n\n\n\n\n\n\n\n\nstatic void NDS_applyFinalInput()\n{\n\tconst UserInput& input = NDS_getFinalUserInput();\n\n\tu16\tpad\t= (0 |\n\t\t((input.buttons.A ? 0 : 0x80) >> 7) |\n\t\t((input.buttons.B ? 0 : 0x80) >> 6) |\n\t\t((input.buttons.T ? 0 : 0x80) >> 5) |\n\t\t((input.buttons.S ? 0 : 0x80) >> 4) |\n\t\t((input.buttons.R ? 0 : 0x80) >> 3) |\n\t\t((input.buttons.L ? 0 : 0x80) >> 2) |\n\t\t((input.buttons.U ? 0 : 0x80) >> 1) |\n\t\t((input.buttons.D ? 0 : 0x80)     ) |\n\t\t((input.buttons.E ? 0 : 0x80) << 1) |\n\t\t((input.buttons.W ? 0 : 0x80) << 2)) ;\n\n\tpad = LOCAL_TO_LE_16(pad);\n\t((u16 *)MMU.ARM9_REG)[0x130>>1] = (u16)pad;\n\t((u16 *)MMU.ARM7_REG)[0x130>>1] = (u16)pad;\n\n\tu16 k_cnt = ((u16 *)MMU.ARM9_REG)[0x132>>1];\n\tif ( k_cnt & (1<<14))\n\t{\n\t\t//INFO(\"ARM9: KeyPad IRQ (pad 0x%04X, cnt 0x%04X (condition %s))\\n\", pad, k_cnt, k_cnt&(1<<15)?\"AND\":\"OR\");\n\t\tu16 k_cnt_selected = (k_cnt & 0x3F);\n\t\tif (k_cnt&(1<<15))\t// AND\n\t\t{\n\t\t\tif ((~pad & k_cnt_selected) == k_cnt_selected) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_KEYPAD);\n\t\t}\n\t\telse\t\t\t\t// OR\n\t\t{\n\t\t\tif (~pad & k_cnt_selected) NDS_makeIrq(ARMCPU_ARM9,IRQ_BIT_KEYPAD);\n\t\t}\n\t}\n\n\tk_cnt = ((u16 *)MMU.ARM7_REG)[0x132>>1];\n\tif ( k_cnt & (1<<14))\n\t{\n\t\t//INFO(\"ARM7: KeyPad IRQ (pad 0x%04X, cnt 0x%04X (condition %s))\\n\", pad, k_cnt, k_cnt&(1<<15)?\"AND\":\"OR\");\n\t\tu16 k_cnt_selected = (k_cnt & 0x3F);\n\t\tif (k_cnt&(1<<15))\t// AND\n\t\t{\n\t\t\tif ((~pad & k_cnt_selected) == k_cnt_selected) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_KEYPAD);\n\t\t}\n\t\telse\t\t\t\t// OR\n\t\t{\n\t\t\tif (~pad & k_cnt_selected) NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_KEYPAD);\n\t\t}\n\t}\n\n\n\tif(input.touch.isTouch)\n\t{\n\t\tu16 adc_x = NDS_getADCTouchPosX(input.touch.touchX);\n\t\tu16 adc_y = NDS_getADCTouchPosY(input.touch.touchY);\n\t\tnds.adc_touchX = adc_x;\n\t\tnds.adc_touchY = adc_y;\n\t\tnds.adc_jitterctr = 0;\n\n\t\tnds.scr_touchX = input.touch.touchX;\n\t\tnds.scr_touchY = input.touch.touchY;\n\t\tnds.isTouch = 1;\n\t}\n\telse\n\t{\n\t\tnds.adc_touchX = 0;\n\t\tnds.adc_touchY = 0;\n\t\tnds.scr_touchX = 0;\n\t\tnds.scr_touchY = 0;\n\t\tnds.isTouch = 0;\n\t}\n\n\tif (input.buttons.F && !countLid) \n\t{\n\t\tLidClosed = (!LidClosed) & 0x01;\n\t\tif (!LidClosed)\n\t\t{\n\t\t\tNDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_ARM7_FOLD);\n\t\t}\n\n\t\tcountLid = 30;\n\t}\n\telse \n\t{\n\t\tif (countLid > 0)\n\t\t\tcountLid--;\n\t}\n\n\tu16 padExt = ((input.buttons.X ? 0 : 0x80) >> 7) |\n\t\t((input.buttons.Y ? 0 : 0x80) >> 6) |\n\t\t((input.buttons.G ? 0 : 0x80) >> 4) |\n\t\t((LidClosed) << 7) |\n\t\t0x0034;\n\n\tpadExt = LOCAL_TO_LE_16(padExt);\n\tpadExt |= (((u16 *)MMU.ARM7_REG)[0x136>>1] & 0x0070);\n\t\n\t((u16 *)MMU.ARM7_REG)[0x136>>1] = (u16)padExt;\n\n\tInputDisplayString=MakeInputDisplayString(padExt, pad);\n\n\t//put into the format we want for the movie system\n\t//fRLDUTSBAYXWEg\n\t//we don't really need nds.pad anymore, but removing it would be a pain\n\n \tnds.pad =\n\t\t((input.buttons.R ? 1 : 0) << 12)|\n\t\t((input.buttons.L ? 1 : 0) << 11)|\n\t\t((input.buttons.D ? 1 : 0) << 10)|\n\t\t((input.buttons.U ? 1 : 0) << 9)|\n\t\t((input.buttons.T ? 1 : 0) << 8)|\n\t\t((input.buttons.S ? 1 : 0) << 7)|\n\t\t((input.buttons.B ? 1 : 0) << 6)|\n\t\t((input.buttons.A ? 1 : 0) << 5)|\n\t\t((input.buttons.Y ? 1 : 0) << 4)|\n\t\t((input.buttons.X ? 1 : 0) << 3)|\n\t\t((input.buttons.W ? 1 : 0) << 2)|\n\t\t((input.buttons.E ? 1 : 0) << 1);\n\n\t//these values are arbitrarily chosen to make arkanoid paddle control act similarly to its dpad controls\n\tif(input.buttons.R)\n\t\tnds.paddle += 5;\n\telse if(input.buttons.L)\n\t\tnds.paddle -= 5;\n\n\t// TODO: low power IRQ\n}\n\n\nvoid NDS_suspendProcessingInput(bool suspend)\n{\n\tstatic int suspendCount = 0;\n\tif(suspend)\n\t{\n\t\t// enter non-processing block\n\t\tassert(validToProcessInput);\n\t\tvalidToProcessInput = false;\n\t\tsuspendCount++;\n\t}\n\telse if(suspendCount)\n\t{\n\t\t// exit non-processing block\n\t\tvalidToProcessInput = true;\n\t\tsuspendCount--;\n\t}\n\telse\n\t{\n\t\t// unwound past first time -> not processing\n\t\tvalidToProcessInput = false;\n\t}\n}\n\n\nvoid emu_halt() {\n\t//printf(\"halting emu: ARM9 PC=%08X/%08X, ARM7 PC=%08X/%08X\\n\", NDS_ARM9.R[15], NDS_ARM9.instruct_adr, NDS_ARM7.R[15], NDS_ARM7.instruct_adr);\n\texecute = false;\n#ifdef LOG_ARM9\n\tif (fp_dis9)\n\t{\n\t\tchar buf[256] = { 0 };\n\t\tsprintf(buf, \"halting emu: ARM9 PC=%08X/%08X\\n\", NDS_ARM9.R[15], NDS_ARM9.instruct_adr);\n\t\tfwrite(buf, 1, strlen(buf), fp_dis9);\n\t\tINFO(\"ARM9 halted\\n\");\n\t}\n#endif\n\n#ifdef LOG_ARM7\n\tif (fp_dis7)\n\t{\n\t\tchar buf[256] = { 0 };\n\t\tsprintf(buf, \"halting emu: ARM7 PC=%08X/%08X\\n\", NDS_ARM7.R[15], NDS_ARM7.instruct_adr);\n\t\tfwrite(buf, 1, strlen(buf), fp_dis7);\n\t\tINFO(\"ARM7 halted\\n\");\n\t}\n#endif\n}\n\n//returns true if exmemcnt specifies satisfactory parameters for the device, which calls this function\nbool ValidateSlot2Access(u32 procnum, u32 demandSRAMSpeed, u32 demand1stROMSpeed, u32 demand2ndROMSpeed, int clockbits)\n{\n\tstatic const u32 _sramSpeeds[] = {10,8,6,18};\n\tstatic const u32 _rom1Speeds[] = {10,8,6,18};\n\tstatic const u32 _rom2Speeds[] = {6,4};\n\tu16 exmemcnt = T1ReadWord(MMU.MMU_MEM[procnum][0x40], 0x204);\n\tu16 exmemcnt9 = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x204);\n\tu32 arm7access = (exmemcnt9 & EXMEMCNT_MASK_SLOT2_ARM7);\n\tu32 sramSpeed = _sramSpeeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_SRAM_TIME)];\n\tu32 romSpeed1 = _rom1Speeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_ROM_1ST_TIME)>>2];\n\tu32 romSpeed2 = _rom2Speeds[(exmemcnt & EXMEMCNT_MASK_SLOT2_ROM_2ND_TIME)>>4];\n\tu32 curclockbits = (exmemcnt & EXMEMCNT_MASK_SLOT2_CLOCKRATE)>>5;\n\t\n\tif(procnum==ARMCPU_ARM9 && arm7access) return false;\n\tif(procnum==ARMCPU_ARM7 && !arm7access) return false;\n\n\t//what we're interested in here is whether the rom/ram are too low -> too fast. then accesses won't have enough time to work.\n\t//i'm not sure if this gives us enough flexibility, but it is good enough for now.\n\t//should make the arguments to this function bitmasks later if we need better.\n\tif(sramSpeed < demandSRAMSpeed) return false;\n\tif(romSpeed1 < demand1stROMSpeed) return false;\n\tif(romSpeed2 < demand2ndROMSpeed) return false;\n\n\tif(clockbits != -1 && clockbits != (int)curclockbits) return false;\n\n\treturn true;\n}\n\n//these templates needed to be instantiated manually\ntemplate void NDS_exec<FALSE>(s32 nb);\ntemplate void NDS_exec<TRUE>(s32 nb);\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/NDSSystem.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef NDSSYSTEM_H\n#define NDSSYSTEM_H\n\n#include <string.h>\n#include \"armcpu.h\"\n#include \"MMU.h\"\n#include \"driver.h\"\n#include \"GPU.h\"\n#include \"SPU.h\"\n#include \"mem.h\"\n#include \"wifi.h\"\n#include \"emufile.h\"\n#include \"firmware.h\"\n#include \"types.h\"\n#include \"sequencer.h\"\n\n#include <string>\n\n#if defined(_WINDOWS) && !defined(WXPORT)\n#include \"pathsettings.h\"\n#endif\n\n#ifndef _WINDOWS\n#include <sys/mman.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#endif\n\ntemplate<typename Type>\nstruct buttonstruct {\n\tunion {\n\t\tstruct {\n\t\t\t// changing the order of these fields would break stuff\n\t\t\t//fRLDUTSBAYXWEg\n\t\t\tType G; // debug\n\t\t\tType E; // right shoulder\n\t\t\tType W; // left shoulder\n\t\t\tType X;\n\t\t\tType Y;\n\t\t\tType A;\n\t\t\tType B;\n\t\t\tType S; // start\n\t\t\tType T; // select\n\t\t\tType U; // up\n\t\t\tType D; // down\n\t\t\tType L; // left\n\t\t\tType R; // right\n\t\t\tType F; // lid\n\t\t};\n\t\tType array[14];\n\t};\n};\n\nextern buttonstruct<bool> Turbo;\nextern buttonstruct<int> TurboTime;\nextern buttonstruct<bool> AutoHold;\n\nint NDS_WritePNG(const char *fname);\n\nextern volatile bool execute;\nextern BOOL click;\n\n/*\n * The firmware language values\n */\n#define NDS_FW_LANG_JAP 0\n#define NDS_FW_LANG_ENG 1\n#define NDS_FW_LANG_FRE 2\n#define NDS_FW_LANG_GER 3\n#define NDS_FW_LANG_ITA 4\n#define NDS_FW_LANG_SPA 5\n#define NDS_FW_LANG_CHI 6\n#define NDS_FW_LANG_RES 7\n\n\n//#define LOG_ARM9\n//#define LOG_ARM7\n\nstruct NDS_header\n{\n       char     gameTile[12];\n       char     gameCode[4];\n       u16      makerCode;\n       u8       unitCode;\n       u8       deviceCode;\n       u8       cardSize;\n       u8       cardInfo[8];\n       u8       flags;\n\t   u8\t\tromversion;\n       \n       u32      ARM9src;\n       u32      ARM9exe;\n       u32      ARM9cpy;\n       u32      ARM9binSize;\n       \n       u32      ARM7src;\n       u32      ARM7exe;\n       u32      ARM7cpy;\n       u32      ARM7binSize;\n       \n       u32      FNameTblOff;\n       u32      FNameTblSize;\n       \n       u32      FATOff;\n       u32      FATSize;\n       \n       u32     ARM9OverlayOff;\n       u32     ARM9OverlaySize;\n       u32     ARM7OverlayOff;\n       u32     ARM7OverlaySize;\n       \n       u32     unknown2a;\n       u32     unknown2b;\n       \n       u32     IconOff;\n       u16     CRC16;\n       u16     ROMtimeout;\n       u32     ARM9unk;\n       u32     ARM7unk;\n       \n       u8      unknown3c[8];\n       u32     ROMSize;\n       u32     HeaderSize;\n       u8      unknown5[56];\n       u8      logo[156];\n       u16     logoCRC16;\n       u16     headerCRC16;\n       u8      reserved[160];\n};\n\nextern void debug();\nvoid emu_halt();\n\nextern u64 nds_timer;\nvoid NDS_RescheduleDMA();\nvoid NDS_RescheduleTimers();\n\nenum ENSATA_HANDSHAKE\n{\n\tENSATA_HANDSHAKE_none = 0,\n\tENSATA_HANDSHAKE_query = 1,\n\tENSATA_HANDSHAKE_ack = 2,\n\tENSATA_HANDSHAKE_confirm = 3,\n\tENSATA_HANDSHAKE_complete = 4,\n};\n\nenum NDS_CONSOLE_TYPE\n{\n\tNDS_CONSOLE_TYPE_FAT,\n\tNDS_CONSOLE_TYPE_LITE,\n\tNDS_CONSOLE_TYPE_IQUE,\n\tNDS_CONSOLE_TYPE_DSI\n};\n\nstruct NDSSystem\n{\n\ts32 wifiCycle;\n\ts32 cycles;\n\tu64 timerCycle[2][4];\n\tu32 VCount;\n\tu32 old;\n\n\t//raw adc touch coords for old NDS\n\tu16 adc_touchX;\n\tu16 adc_touchY;\n\ts32 adc_jitterctr;\n\tBOOL stylusJitter;\n\n\t//the DSI returns calibrated touch coords from its TSC (?), so we need to save these separately\n\tu16 scr_touchX;\n\tu16 scr_touchY;\n\n\tBOOL isTouch;\n\tu16 pad;\n\t\n\tu16 paddle;\n\n\tu8 *FW_ARM9BootCode;\n\tu8 *FW_ARM7BootCode;\n\tu32 FW_ARM9BootCodeAddr;\n\tu32 FW_ARM7BootCodeAddr;\n\tu32 FW_ARM9BootCodeSize;\n\tu32 FW_ARM7BootCodeSize;\n\n\tBOOL sleeping;\n\tBOOL cardEjected;\n\tu32 freezeBus;\n\n\t//this is not essential NDS runtime state.\n\t//it was perhaps a mistake to put it here.\n\t//it is far less important than the above.\n\t//maybe I should move it.\n\ts32 idleCycles[2];\n\ts32 runCycleCollector[2][16];\n\ts32 idleFrameCounter;\n\ts32 cpuloopIterationCount; //counts the number of times during a frame that a reschedule happened\n\n\t//console type must be copied in when the system boots. it can't be changed on the fly.\n\tint ConsoleType;\n\tbool Is_DSI() { return ConsoleType == NDS_CONSOLE_TYPE_DSI; }\n\tbool Is_DebugConsole() { return _DebugConsole!=0; }\n\tBOOL _DebugConsole;\n\t\n\t//set if the user requests ensata emulation\n\tBOOL ensataEmulation;\n\n\t//there is a hack in the ipc sync for ensata. this tracks its state\n\tu32 ensataIpcSyncCounter;\n\n\t//maintains the state of the ensata handshaking protocol\n\tu32 ensataHandshake;\n\n\tstruct {\n\t\tu8 lcd, gpuMain, gfx3d_render, gfx3d_geometry, gpuSub, dispswap;\n\t} power1; //POWCNT1\n\n\tstruct {\n\t\tu8 speakers, wifi /*(initial value=0)*/;\n\t} power2; //POWCNT2\n\n\tbool isInVblank() const { return VCount >= 192; } \n\tbool isIn3dVblank() const { return VCount >= 192 && VCount<215; } \n};\n\n/** /brief A touchscreen calibration point.\n */\nstruct NDS_fw_touchscreen_cal {\n  u16 adc_x;\n  u16 adc_y;\n\n  u8 screen_x;\n  u8 screen_y;\n};\n\n#define MAX_FW_NICKNAME_LENGTH 10\n#define MAX_FW_MESSAGE_LENGTH 26\n\nstruct NDS_fw_config_data\n{\n  NDS_CONSOLE_TYPE ds_type;\n\n  u8 fav_colour;\n  u8 birth_month;\n  u8 birth_day;\n\n  u16 nickname[MAX_FW_NICKNAME_LENGTH];\n  u8 nickname_len;\n\n  u16 message[MAX_FW_MESSAGE_LENGTH];\n  u8 message_len;\n\n  u8 language;\n\n  //touchscreen calibration\n  NDS_fw_touchscreen_cal touch_cal[2];\n};\n\nextern NDSSystem nds;\n\n#ifdef GDB_STUB\nint NDS_Init( struct armcpu_memory_iface *arm9_mem_if,\n              struct armcpu_ctrl_iface **arm9_ctrl_iface,\n              struct armcpu_memory_iface *arm7_mem_if,\n              struct armcpu_ctrl_iface **arm7_ctrl_iface);\n#else\nint NDS_Init ( void);\n#endif\n\nvoid Desmume_InitOnce();\n\nvoid NDS_DeInit(void);\n\nBOOL NDS_SetROM(u8 * rom, u32 mask);\nNDS_header * NDS_getROMHeader(void);\n\nstruct RomBanner\n{\n\tRomBanner(bool defaultInit);\n\tu16 version; //Version  (0001h)\n\tu16 crc16; //CRC16 across entries 020h..83Fh\n\tu8 reserved[0x1C]; //Reserved (zero-filled)\n\tu8 bitmap[0x200]; //Icon Bitmap  (32x32 pix) (4x4 tiles, each 4x8 bytes, 4bit depth)\n\tu16 palette[0x10]; //Icon Palette (16 colors, 16bit, range 0000h-7FFFh) (Color 0 is transparent, so the 1st palette entry is ignored)\n\tenum { NUM_TITLES = 6 };\n\tunion {\n\t\tstruct {\n\t\t\tu16 title_jp[0x80]; //Title 0 Japanese (128 characters, 16bit Unicode)\n\t\t\tu16 title_en[0x80]; //Title 1 English  (\"\")\n\t\t\tu16 title_fr[0x80]; //Title 2 French   (\"\")\n\t\t\tu16 title_de[0x80]; //Title 3 German   (\"\")\n\t\t\tu16 title_it[0x80]; //Title 4 Italian  (\"\")\n\t\t\tu16 title_es[0x80]; //Title 5 Spanish  (\"\")\n\t\t};\n\t\tu16 titles[NUM_TITLES][0x80];\n\t};\n\tu8 end0xFF[0x1C0]; \n  //840h  ?    (Maybe newer/chinese firmware do also support chinese title?)\n  //840h  -    End of Icon/Title structure (next 1C0h bytes usually FFh-filled)\n};\n\nextern bool useMmapForRomLoading;\n\nclass GameInfo\n{\npublic:\n\tGameInfo()\n\t\t: romdata(NULL), openRomFd(-1)\n\t{}\n\t\n\t~GameInfo()\n\t{\n\t\tcloseMmap();\n\t}\n\t\n\tint openRomFd;\n\t\n\tvoid closeMmap()\n\t{\n\t\tif(useMmapForRomLoading)\n\t\t{\n\t\t\tif(openRomFd != -1)\n\t\t\t\tclose(openRomFd);\n\t\t\topenRomFd = -1;\n\t\t\tif(romdata != NULL)\n\t\t\t\tmunmap(romdata, romsize);\n\t\t\tromdata = NULL;\n\t\t}\n\t}\n\t\n\tvoid cleanup()\n\t{\n\t\tif(useMmapForRomLoading)\n\t\t\tcloseMmap();\n\t\telse if(romdata != NULL) delete[] romdata;\n\t}\n\n\tvoid loadData(char* buf, int size)\n\t{\n\t\tresize(size);\n\t\tmemcpy(romdata,buf,size);\n\t\tromsize = (u32)size;\n\t\tfillGap();\n\t}\n\n\tvoid fillGap()\n\t{\n\t\tif(!useMmapForRomLoading)\n\t\t\tmemset(romdata+romsize,0xFF,allocatedSize-romsize);\n\t}\n\n\tvoid resize(int size) {\n\t\tcleanup();\n\n\t\t//calculate the necessary mask for the requested size\n\t\tmask = size-1; \n\t\tmask |= (mask >>1);\n\t\tmask |= (mask >>2);\n\t\tmask |= (mask >>4);\n\t\tmask |= (mask >>8);\n\t\tmask |= (mask >>16);\n\n\t\t//now, we actually need to over-allocate, because bytes from anywhere protected by that mask\n\t\t//could be read from the rom\n\t\tallocatedSize = mask+4;\n\n\t\tif(!useMmapForRomLoading)\n\t\t\tromdata = new char[allocatedSize];\n\t\tromsize = size;\n\t}\n\tu32 crc;\n\tNDS_header header;\n\tchar ROMserial[20];\n\tchar ROMname[20];\n\t//char ROMfullName[7][0x100];\n\tvoid populate();\n\tchar* romdata;\n\tu32 romsize;\n\tu32 allocatedSize;\n\tu32 mask;\n\tconst RomBanner& getRomBanner();\n\tbool hasRomBanner();\n\tbool isHomebrew;\n};\n\ntypedef struct TSCalInfo\n{\n\tstruct\n\t{\n\t\tu16 x1, x2;\n\t\tu16 y1, y2;\n\t\tu16 width;\n\t\tu16 height;\n\t} adc;\n\n\tstruct\n\t{\n\t\tu8 x1, x2;\n\t\tu8 y1, y2;\n\t\tu16 width;\n\t\tu16 height;\n\t} scr;\n\n} TSCalInfo;\n\nextern GameInfo gameInfo;\n\n\nstruct UserButtons : buttonstruct<bool>\n{\n};\nstruct UserTouch\n{\n\tu16 touchX;\n\tu16 touchY;\n\tbool isTouch;\n};\nstruct UserMicrophone\n{\n\tu32 micButtonPressed;\n};\nstruct UserInput\n{\n\tUserButtons buttons;\n\tUserTouch touch;\n\tUserMicrophone mic;\n};\n\n// set physical user input\n// these functions merely request the input to be changed.\n// the actual change happens later at a specific time during the frame.\n// this is to minimize the risk of desyncs.\nvoid NDS_setTouchPos(u16 x, u16 y);\nvoid NDS_releaseTouch(void);\nvoid NDS_setPad(bool right,bool left,bool down,bool up,bool select,bool start,bool B,bool A,bool Y,bool X,bool leftShoulder,bool rightShoulder,bool debug, bool lid);\nvoid NDS_setMic(bool pressed);\n\n// get physical user input\n// not including the results of autofire/etc.\n// the effects of calls to \"set physical user input\" functions will be immediately reflected here though.\nconst UserInput& NDS_getRawUserInput();\nconst UserInput& NDS_getPrevRawUserInput();\n\n// get final (fully processed) user input\n// this should match whatever was or would be sent to the game\nconst UserInput& NDS_getFinalUserInput();\n\n// set/get to-be-processed or in-the-middle-of-being-processed user input\n// to process input, simply call this function and edit the return value.\n// (applying autofire is one example of processing the input.)\n// (movie playback is another example.)\n// this must be done after the raw user input is set\n// and before that input is sent to the game's memory.\nUserInput& NDS_getProcessingUserInput();\nbool NDS_isProcessingUserInput();\n// call once per frame to prepare input for processing \nvoid NDS_beginProcessingInput();\n// call once per frame to copy the processed input to the final input\nvoid NDS_endProcessingInput();\n\n// this is in case something needs reentrancy while processing input\nvoid NDS_suspendProcessingInput(bool suspend);\n\n\n\nint NDS_LoadROM(const char *filename, const char* logicalFilename=0);\nvoid NDS_FreeROM(void);\nvoid NDS_Reset();\nint NDS_ImportSave(const char *filename, u32 force_size = 0);\nu32 NDS_ImportSaveSize(const char *filename);\nbool NDS_ExportSave(const char *filename);\n\nvoid nds_savestate(EMUFILE* os);\nbool nds_loadstate(EMUFILE* is, int size);\n\nint NDS_WriteBMP(const char *filename);\n\nvoid NDS_Sleep();\nvoid NDS_TriggerCardEjectIRQ();\n\nvoid NDS_SkipNextFrame();\n#define NDS_SkipFrame(s) if(s) NDS_SkipNext2DFrame();\nvoid NDS_OmitFrameSkip(int force=0);\n\nvoid NDS_debug_break();\nvoid NDS_debug_continue();\nvoid NDS_debug_step();\n\nvoid execHardware_doAllDma(EDMAMode modeNum);\n\ntemplate<bool FORCE> void NDS_exec(s32 nb = 560190<<1);\n\nextern int lagframecounter;\n\nstatic INLINE void NDS_swapScreen(void)\n{\n   u16 tmp = MainScreen.offset;\n   MainScreen.offset = SubScreen.offset;\n   SubScreen.offset = tmp;\n}\n\nint NDS_WriteBMP_32bppBuffer(int width, int height, const void* buf, const char *filename);\n\nextern struct TCommonSettings {\n\tTCommonSettings() \n\t\t: GFX3D_HighResolutionInterpolateColor(true)\n\t\t, GFX3D_EdgeMark(true)\n\t\t, GFX3D_Fog(true)\n\t\t, GFX3D_Texture(true)\n\t\t, GFX3D_LineHack(true)\n\t\t, GFX3D_Zelda_Shadow_Depth_Hack(0)\n\t\t, GFX3D_Renderer_Multisample(false)\n\t\t, jit_max_block_size(10)\n\t\t, UseExtBIOS(false)\n\t\t, SWIFromBIOS(false)\n\t\t, PatchSWI3(false)\n\t\t, UseExtFirmware(false)\n\t\t, BootFromFirmware(false)\n\t\t, DebugConsole(false)\n\t\t, EnsataEmulation(false)\n\t\t, cheatsDisable(false)\n\t\t, num_cores(1)\n\t\t, rigorous_timing(false)\n\t\t, advanced_timing(true)\n\t\t, micMode(InternalNoise)\n\t\t, spuInterpolationMode(SPUInterpolation_Linear)\n\t\t, manualBackupType(0)\n\t\t, autodetectBackupMethod(0)\n\t\t, spu_captureMuted(false)\n\t\t, spu_advanced(false)\n\t\t, StylusPressure(50)\n\t\t, ConsoleType(NDS_CONSOLE_TYPE_FAT)\n\t\t, StylusJitter(false)\n\t{\n\t\tstrcpy(ARM9BIOS, \"biosnds9.bin\");\n\t\tstrcpy(ARM7BIOS, \"biosnds7.bin\");\n\t\tstrcpy(Firmware, \"firmware.bin\");\n\t\tNDS_FillDefaultFirmwareConfigData(&fw_config);\n\n\t\t/* WIFI mode: adhoc = 0, infrastructure = 1 */\n\t\twifi.mode = 1;\n\t\twifi.infraBridgeAdapter = 0;\n\n\t\tfor(int i=0;i<16;i++)\n\t\t\tspu_muteChannels[i] = false;\n\n\t\tfor(int g=0;g<2;g++)\n\t\t\tfor(int x=0;x<5;x++)\n\t\t\t\tdispLayers[g][x]=true;\n\n\t\t//zero 06-sep-2012 - shouldnt be defaulting this to true for now, since the jit is buggy. \n\t\t//id rather have people discover a bonus speedhack than discover new bugs in a new version\n\t\tCpuMode = 0;\n\t}\n\tbool GFX3D_HighResolutionInterpolateColor;\n\tbool GFX3D_EdgeMark;\n\tbool GFX3D_Fog;\n\tbool GFX3D_Texture;\n\tbool GFX3D_LineHack;\n\tint  GFX3D_Zelda_Shadow_Depth_Hack;\n\tbool GFX3D_Renderer_Multisample;\n\tbool UseExtBIOS;\n\tchar ARM9BIOS[256];\n\tchar ARM7BIOS[256];\n\tbool SWIFromBIOS;\n\tbool PatchSWI3;\n\n\tbool UseExtFirmware;\n\tchar Firmware[256];\n\tbool BootFromFirmware;\n\tNDS_fw_config_data fw_config;\n\n\tNDS_CONSOLE_TYPE ConsoleType;\n\tbool DebugConsole;\n\tbool EnsataEmulation;\n\t\n\tbool cheatsDisable;\n\n\tint num_cores;\n\tbool single_core() { return num_cores==1; }\n\tbool rigorous_timing;\n\n\tint StylusPressure;\n\tbool StylusJitter;\n\n\tbool dispLayers[2][5];\n\t\n\tFAST_ALIGN bool advanced_timing;\n\n\tint CpuMode;\n\tu32\tjit_max_block_size;\n\t\n\tstruct _Wifi {\n\t\tint mode;\n\t\tint infraBridgeAdapter;\n\t} wifi;\n\n\tenum MicMode\n\t{\n\t\tInternalNoise = 0,\n\t\tSample = 1,\n\t\tRandom = 2,\n\t\tPhysical = 3,\n\t} micMode;\n\n\n\tSPUInterpolationMode spuInterpolationMode;\n\n\t//this is a temporary hack until we straighten out the flushing logic and/or gxfifo\n\t//int gfx3d_flushMode;\n\n\tint autodetectBackupMethod;\n\t//this is the user's choice of manual backup type, for cases when the autodetection can't be trusted\n\tint manualBackupType;\n\n\tbool spu_muteChannels[16];\n\tbool spu_captureMuted;\n\tbool spu_advanced;\n\n\tstruct _ShowGpu {\n\t\t_ShowGpu() : main(true), sub(true) {}\n\t\tunion {\n\t\t\tstruct { bool main,sub; };\n\t\t\tbool screens[2];\n\t\t};\n\t} showGpu;\n\n\tstruct _Hud {\n\t\t_Hud() \n\t\t\t: ShowInputDisplay(false)\n\t\t\t, ShowGraphicalInputDisplay(false)\n\t\t\t, FpsDisplay(false)\n\t\t\t, FrameCounterDisplay(false)\n\t\t\t, ShowLagFrameCounter(false)\n\t\t\t, ShowMicrophone(false)\n\t\t\t, ShowRTC(false)\n\t\t{}\n\t\tbool ShowInputDisplay, ShowGraphicalInputDisplay, FpsDisplay, FrameCounterDisplay, ShowLagFrameCounter, ShowMicrophone, ShowRTC;\n\t} hud;\n\n} CommonSettings;\n\n\nextern std::string InputDisplayString;\nextern int LagFrameFlag;\nextern int lastLag, TotalLagFrames;\n\nvoid MovieSRAM();\n\nvoid ClearAutoHold(void);\n\nbool ValidateSlot2Access(u32 procnum, u32 demandSRAMSpeed, u32 demand1stROMSpeed, u32 demand2ndROMSpeed, int clockbits);\n\nextern ADVANsCEne\tadvsc;\n\nextern u64 sequencerNext;\n#define SEQUENCER_NEXT(X) if(X <= sequencerNext) sequencerNext = X\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/OGLES2Render.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"OGLES2Render.h\"\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"debug.h\"\n#include \"gfx3d.h\"\n#include \"NDSSystem.h\"\n#include \"texcache.h\"\n\n\ntypedef struct\n{\n\tunsigned int major;\n\tunsigned int minor;\n} OGLVersion;\n\nstatic OGLVersion _OGLDriverVersion = {0, 0};\nstatic OpenGLESRenderer *_OGLRenderer = NULL;\n\n// Lookup Tables\nCACHE_ALIGN GLuint dsDepthToD24S8_LUT[32768] = {0};\nconst GLfloat divide5bitBy31_LUT[32]\t= {0.0, 0.03225806451613, 0.06451612903226, 0.09677419354839,\n\t\t\t\t\t\t\t\t\t   0.1290322580645, 0.1612903225806, 0.1935483870968, 0.2258064516129,\n\t\t\t\t\t\t\t\t\t   0.258064516129, 0.2903225806452, 0.3225806451613, 0.3548387096774,\n\t\t\t\t\t\t\t\t\t   0.3870967741935, 0.4193548387097, 0.4516129032258, 0.4838709677419,\n\t\t\t\t\t\t\t\t\t   0.5161290322581, 0.5483870967742, 0.5806451612903, 0.6129032258065,\n\t\t\t\t\t\t\t\t\t   0.6451612903226, 0.6774193548387, 0.7096774193548, 0.741935483871,\n\t\t\t\t\t\t\t\t\t   0.7741935483871, 0.8064516129032, 0.8387096774194, 0.8709677419355,\n\t\t\t\t\t\t\t\t\t   0.9032258064516, 0.9354838709677, 0.9677419354839, 1.0};\n\nstatic bool BEGINGL()\n{\n\tif(oglrender_beginOpenGL) \n\t\treturn oglrender_beginOpenGL();\n\telse return true;\n}\n\nstatic void ENDGL()\n{\n\tif(oglrender_endOpenGL) \n\t\toglrender_endOpenGL();\n}\n\n// Function Pointers\nbool (*oglrender_init)() = NULL;\nbool (*oglrender_beginOpenGL)() = NULL;\nvoid (*oglrender_endOpenGL)() = NULL;\n\n//------------------------------------------------------------\n\n// VAO\nOGLEXT(PFNGLGENVERTEXARRAYSOESPROC, glGenVertexArraysOES)\nOGLEXT(PFNGLDELETEVERTEXARRAYSOESPROC, glDeleteVertexArraysOES)\nOGLEXT(PFNGLBINDVERTEXARRAYOESPROC, glBindVertexArrayOES)\n\n// VBO\nOGLEXT(PFNGLMAPBUFFEROESPROC, glMapBufferOES)\nOGLEXT(PFNGLUNMAPBUFFEROESPROC, glUnmapBufferOES)\n\nstatic void OGLES2LoadEntryPoints()\n{\n\t// VAO\n\tINITOGLEXT(PFNGLGENVERTEXARRAYSOESPROC, glGenVertexArraysOES)\n\tINITOGLEXT(PFNGLDELETEVERTEXARRAYSOESPROC, glDeleteVertexArraysOES)\n\tINITOGLEXT(PFNGLBINDVERTEXARRAYOESPROC, glBindVertexArrayOES)\n\n\t// VBO\n\tINITOGLEXT(PFNGLMAPBUFFEROESPROC, glMapBufferOES)\n\tINITOGLEXT(PFNGLUNMAPBUFFEROESPROC, glUnmapBufferOES)\n}\n\n// Vertex Shader GLSL 1.00\nstatic const char *vertexShader_100 = {\"\\\n\tattribute vec4 inPosition; \\n\\\n\tattribute vec2 inTexCoord0; \\n\\\n\tattribute vec3 inColor; \\n\\\n\t\\n\\\n\tuniform float polyAlpha; \\n\\\n\tuniform vec2 texScale; \\n\\\n\t\\n\\\n\tvarying vec4 vtxPosition; \\n\\\n\tvarying vec2 vtxTexCoord; \\n\\\n\tvarying vec4 vtxColor; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\tmat2 texScaleMtx\t= mat2(\tvec2(texScale.x,        0.0), \\n\\\n\t\t\t\t\t\t\t\t\tvec2(       0.0, texScale.y)); \\n\\\n\t\t\\n\\\n\t\tvtxPosition = inPosition; \\n\\\n\t\tvtxTexCoord = texScaleMtx * inTexCoord0; \\n\\\n\t\tvtxColor = vec4(inColor * 4.0, polyAlpha); \\n\\\n\t\t\\n\\\n\t\tgl_Position = vtxPosition; \\n\\\n\t} \\n\\\n\"};\n\n// Fragment Shader GLSL 1.00\nstatic const char *fragmentShader_100 = {\"\\\n\tprecision mediump float; \\n\\\n\tvarying vec4 vtxPosition; \\n\\\n\tvarying vec2 vtxTexCoord; \\n\\\n\tvarying vec4 vtxColor; \\n\\\n\t\\n\\\n\tuniform sampler2D texMainRender; \\n\\\n\tuniform sampler2D texToonTable; \\n\\\n\tuniform int polyID; \\n\\\n\tuniform bool hasTexture; \\n\\\n\tuniform int polygonMode; \\n\\\n\tuniform int toonShadingMode; \\n\\\n\tuniform int oglWBuffer; \\n\\\n\tuniform bool enableAlphaTest; \\n\\\n\tuniform float alphaTestRef; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\tvec4 texColor = vec4(1.0, 1.0, 1.0, 1.0); \\n\\\n\t\tvec4 fragColor; \\n\\\n\t\t\\n\\\n\t\tif(hasTexture) \\n\\\n\t\t{ \\n\\\n\t\t\ttexColor = texture2D(texMainRender, vtxTexCoord); \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tfragColor = texColor; \\n\\\n\t\t\\n\\\n\t\tif(polygonMode == 0) \\n\\\n\t\t{ \\n\\\n\t\t\tfragColor = vtxColor * texColor; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 1) \\n\\\n\t\t{ \\n\\\n\t\t\tif (texColor.a == 0.0 || !hasTexture) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = vtxColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse if (texColor.a == 1.0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * (1.0-texColor.a) + vtxColor.rgb * texColor.a;\\n\\\n\t\t\t} \\n\\\n\t\t\t\\n\\\n\t\t\tfragColor.a = vtxColor.a; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 2) \\n\\\n\t\t{ \\n\\\n\t\t\tif (toonShadingMode == 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tvec3 toonColor = vec3(texture2D(texToonTable, vec2(vtxColor.r,0)).rgb); \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * toonColor.rgb;\\n\\\n\t\t\t\tfragColor.a = texColor.a * vtxColor.a;\\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tvec3 toonColor = vec3(texture2D(texToonTable, vec2(vtxColor.r,0)).rgb); \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * vtxColor.rgb + toonColor.rgb; \\n\\\n\t\t\t\tfragColor.a = texColor.a * vtxColor.a; \\n\\\n\t\t\t} \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 3) \\n\\\n\t\t{ \\n\\\n\t\t\tif (polyID != 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor = vtxColor; \\n\\\n\t\t\t} \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tif (fragColor.a == 0.0 || (enableAlphaTest && fragColor.a < alphaTestRef)) \\n\\\n\t\t{ \\n\\\n\t\t\tdiscard; \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tgl_FragColor = fragColor; \\n\\\n\t} \\n\\\n\"};\n\n//FORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix)\n//{\n//\tconst u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F;\n//\t\n//\treturn\t (dstPix & 0x0000FF00) << 16 |\t\t// R\n//\t\t\t (dstPix & 0x00FF0000)       |\t\t// G\n//\t\t\t (dstPix & 0xFF000000) >> 16 |\t\t// B\n//\t\t\t((dstPix >> 1) & 0x000000FF);\t\t// A\n//}\n//\n//FORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix)\n//{\n//\tconst u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F;\n//\t\n//\treturn\t (dstPix & 0x00FF0000) >> 16 |\t\t// R\n//\t\t\t (dstPix & 0x0000FF00)       |\t\t// G\n//\t\t\t (dstPix & 0x000000FF) << 16 |\t\t// B\n//\t\t\t((dstPix >> 1) & 0xFF000000);\t\t// A\n//}\n\nFORCEINLINE u32 RGBA8888_32_To_RGBA6665_32Rev(const u32 srcPix)\n{\n\tconst u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F;\n\t\n\treturn\t (dstPix & 0xFF000000) >> 24 |\t\t// R\n\t\t\t (dstPix & 0x00FF0000) >> 16 |\t\t// G\n\t\t\t (dstPix & 0x0000FF00) >> 8 |\t\t// B\n\t\t\t((dstPix >> 1) & 0x000000FF) << 24;\t// A\n}\n\nFORCEINLINE u32 RGBA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix)\n{\n\tconst u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F;\n\t\n\t//return\t (dstPix & 0x00FF0000) |\t\t// R\n\t//\t\t (dstPix & 0x0000FF00) |\t\t// G\n\t//\t\t (dstPix & 0x000000FF) |\t\t// B\n\t//\t\t((dstPix >> 1) & 0xFF000000);\t// A\n\treturn ((dstPix >> 1) & 0xFF000000) | (dstPix & 0x00FFFFFF);\n}\n\n//opengl state caching:\n//This is of dubious performance assistance, but it is easy to take out so I am leaving it for now.\n//every function that is xgl* can be replaced with gl* if we decide to rip this out or if anyone else\n//doesnt feel like sticking with it (or if it causes trouble)\n\nstruct GLCaps {\n\tu8 caps[0x100];\n\tGLCaps() {\n\t\tmemset(caps,0xFF,sizeof(caps));\n\t}\n};\nstatic GLCaps glcaps;\n\nstatic void _xglEnable(GLenum cap) {\n\tcap -= 0x0B00;\n\tif(glcaps.caps[cap] == 0xFF || glcaps.caps[cap] == 0) {\n\t\tglEnable(cap+0x0B00);\n\t\tglcaps.caps[cap] = 1;\n\t}\n}\n\nstatic void _xglDisable(GLenum cap) {\n\tcap -= 0x0B00;\n\tif(glcaps.caps[cap]) {\n\t\tglDisable(cap+0x0B00);\n\t\tglcaps.caps[cap] = 0;\n\t}\n}\n\n#define xglEnable(cap) { \\\n\tCTASSERT((cap-0x0B00)<0x100); \\\n\t_xglEnable(cap); }\n\n#define xglDisable(cap) {\\\n\tCTASSERT((cap-0x0B00)<0x100); \\\n\t_xglDisable(cap); }\n\nbool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor)\n{\n\tbool result = false;\n\t\n\tif ( (_OGLDriverVersion.major > checkVersionMajor) ||\n\t\t (_OGLDriverVersion.major >= checkVersionMajor && _OGLDriverVersion.minor >= checkVersionMinor))\n\t{\n\t\tresult = true;\n\t}\n\t\n\treturn result;\n}\n\nstatic void texDeleteCallback(TexCacheItem *item)\n{\n\t_OGLRenderer->DeleteTexture(item);\n}\n\nstatic char OGLInit(void)\n{\n\tchar result = 0;\n\tRender3DError error = OGLERROR_NOERR;\n\t\n\tif(!oglrender_init)\n\t\treturn result;\n\tif(!oglrender_init())\n\t\treturn result;\n\t\n\tresult = Default3D_Init();\n\tif (result == 0)\n\t{\n\t\treturn result;\n\t}\n\n\tif(!BEGINGL())\n\t{\n\t\tINFO(\"OpenGLES2: Could not initialize -- BEGINGL() failed.\\n\");\n\t\tresult = 0;\n\t\treturn result;\n\t}\n\t\n\t// Get OpenGLES2 info\n\tconst char *oglVersionString = (const char *)glGetString(GL_VERSION);\n\tconst char *oglVendorString = (const char *)glGetString(GL_VENDOR);\n\tconst char *oglRendererString = (const char *)glGetString(GL_RENDERER);\n\t\n\t// Check the driver's OpenGLES2 version\n\t_OGLDriverVersion.major = 2;\n\t_OGLDriverVersion.minor = 0;\n\tif (!IsVersionSupported(OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR))\n\t{\n\t\tINFO(\"OpenGLES2: Driver does not support OpenGLES2 v%u.%u or later. Disabling 3D renderer.\\n[ Driver Info -\\n    Version: %s\\n    Vendor: %s\\n    Renderer: %s ]\\n\",\n\t\t\t OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR,\n\t\t\t oglVersionString, oglVendorString, oglRendererString);\n\t\t\n\t\tresult = 0;\n\t\treturn result;\n\t}\n\t\n\t// If the renderer doesn't initialize with OpenGLES2 v3.2 or higher, fall back\n\t// to one of the lower versions.\n\tif (_OGLRenderer == NULL)\n\t{\n\t\tOGLES2LoadEntryPoints();\n\t\t\n\t\tif (IsVersionSupported(2, 0))\n\t\t{\n\t\t\t_OGLRenderer = new OpenGLES2Renderer;\n\t\t\t_OGLRenderer->SetVersion(2, 0);\n\t\t}\n\t}\n\t\n\tif (_OGLRenderer == NULL)\n\t{\n\t\tINFO(\"OpenGLES2: Renderer did not initialize. Disabling 3D renderer.\\n[ Driver Info -\\n    Version: %s\\n    Vendor: %s\\n    Renderer: %s ]\\n\",\n\t\t\t oglVersionString, oglVendorString, oglRendererString);\n\t\tresult = 0;\n\t\treturn result;\n\t}\n\t\n\t// Initialize OpenGLES2 extensions\n\terror = _OGLRenderer->InitExtensions();\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tif ( IsVersionSupported(2, 0) &&\n\t\t\t(error == OGLERROR_SHADER_CREATE_ERROR ||\n\t\t\t error == OGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR ||\n\t\t\t error == OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR) )\n\t\t{\n\t\t\tINFO(\"OpenGLES2: Shaders are not working, even though they should be. Disabling 3D renderer.\\n\");\n\t\t\tresult = 0;\n\t\t\treturn result;\n\t\t}\n\t}\n\t\n\t// Initialization finished -- reset the renderer\n\t_OGLRenderer->Reset();\n\t\n\tENDGL();\n\t\n\tunsigned int major = 0;\n\tunsigned int minor = 0;\n\t_OGLRenderer->GetVersion(&major, &minor);\n\t\n\tINFO(\"OpenGLES2: Renderer initialized successfully (v%u.%u).\\n[ Driver Info -\\n    Version: %s\\n    Vendor: %s\\n    Renderer: %s ]\\n\",\n\t\t major, minor, oglVersionString, oglVendorString, oglRendererString);\n\t\n\treturn result;\n}\n\nstatic void OGLReset()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->Reset();\n\t\n\tENDGL();\n}\n\nstatic void OGLClose()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\tdelete _OGLRenderer;\n\t_OGLRenderer = NULL;\n\t\n\tENDGL();\n\t\n\tDefault3D_Close();\n}\n\nstatic void OGLRender()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->Render(&gfx3d.renderState, gfx3d.vertlist, gfx3d.polylist, &gfx3d.indexlist, gfx3d.frameCtr);\n\t\n\tENDGL();\n}\n\nstatic void OGLVramReconfigureSignal()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->VramReconfigureSignal();\n\t\n\tENDGL();\n}\n\nstatic void OGLRenderFinish()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->RenderFinish();\n\t\n\tENDGL();\n}\n\nGPU3DInterface gpu3Dgles2 = {\n\t\"OpenGLES2\",\n\tOGLInit,\n\tOGLReset,\n\tOGLClose,\n\tOGLRender,\n\tOGLRenderFinish,\n\tOGLVramReconfigureSignal\n};\n\nOpenGLESRenderer::OpenGLESRenderer()\n{\n\tversionMajor = 0;\n\tversionMinor = 0;\n}\n\nbool OpenGLESRenderer::IsExtensionPresent(const std::set<std::string> *oglExtensionSet, const std::string extensionName) const\n{\n\tif (oglExtensionSet == NULL || oglExtensionSet->size() == 0)\n\t{\n\t\treturn false;\n\t}\n\t\n\treturn (oglExtensionSet->find(extensionName) != oglExtensionSet->end());\n}\n\nbool OpenGLESRenderer::ValidateShaderCompile(GLuint theShader) const\n{\n\tbool isCompileValid = false;\n\tGLint status = GL_FALSE;\n\t\n\tglGetShaderiv(theShader, GL_COMPILE_STATUS, &status);\n\tif(status == GL_TRUE)\n\t{\n\t\tisCompileValid = true;\n\t}\n\telse\n\t{\n\t\tGLint logSize;\n\t\tGLchar *log = NULL;\n\t\t\n\t\tglGetShaderiv(theShader, GL_INFO_LOG_LENGTH, &logSize);\n\t\tlog = new GLchar[logSize];\n\t\tglGetShaderInfoLog(theShader, logSize, &logSize, log);\n\t\t\n\t\tINFO(\"OpenGLES2: SEVERE - FAILED TO COMPILE SHADER : %s\\n\", log);\n\t\tdelete[] log;\n\t}\n\t\n\treturn isCompileValid;\n}\n\nbool OpenGLESRenderer::ValidateShaderProgramLink(GLuint theProgram) const\n{\n\tbool isLinkValid = false;\n\tGLint status = GL_FALSE;\n\t\n\tglGetProgramiv(theProgram, GL_LINK_STATUS, &status);\n\tif(status == GL_TRUE)\n\t{\n\t\tisLinkValid = true;\n\t}\n\telse\n\t{\n\t\tGLint logSize;\n\t\tGLchar *log = NULL;\n\t\t\n\t\tglGetProgramiv(theProgram, GL_INFO_LOG_LENGTH, &logSize);\n\t\tlog = new GLchar[logSize];\n\t\tglGetProgramInfoLog(theProgram, logSize, &logSize, log);\n\t\t\n\t\tINFO(\"OpenGLES2: SEVERE - FAILED TO LINK SHADER PROGRAM : %s\\n\", log);\n\t\tdelete[] log;\n\t}\n\t\n\treturn isLinkValid;\n}\n\nvoid OpenGLESRenderer::GetVersion(unsigned int *major, unsigned int *minor) const\n{\n\t*major = this->versionMajor;\n\t*minor = this->versionMinor;\n}\n\nvoid OpenGLESRenderer::SetVersion(unsigned int major, unsigned int minor)\n{\n\tthis->versionMajor = major;\n\tthis->versionMinor = minor;\n}\n\nvoid OpenGLESRenderer::ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer)\n{\n\tif (srcBuffer == NULL || dstBuffer == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\t// Convert from 32-bit BGRA8888/RGBA8888 format to 32-bit RGBA6665 reversed format. OpenGLES2\n\t// stores pixels using a flipped Y-coordinate, so this needs to be flipped back\n\t// to the DS Y-coordinate.\n\tfor(int i = 0, y = 191; y >= 0; y--)\n\t{\n\t\tu32 *__restrict dst = dstBuffer + (y << 8); // Same as dstBuffer + (y * 256)\n\t\t\n\t\tfor(unsigned int x = 0; x < 256; x++, i++)\n\t\t{\n\t\t\t// Use the correct endian format since OpenGLES2 uses the native endian of\n\t\t\t// the architecture it is running on.\n#ifdef WORDS_BIGENDIAN\n\t\t\t//*dst++ = BGRA8888_32_To_RGBA6665_32(srcBuffer[i]);\n\t\t\t*dst++ = RGBA8888_32_To_RGBA6665_32Rev(srcBuffer[i]);\n#else\n\t\t\t//*dst++ = BGRA8888_32Rev_To_RGBA6665_32Rev(srcBuffer[i]);\n\t\t\t*dst++ = RGBA8888_32Rev_To_RGBA6665_32Rev(srcBuffer[i]);\n#endif\n\t\t}\n\t}\n}\n\nOpenGLES2Renderer::OpenGLES2Renderer()\n{\n\tisFBOSupported = false;\n\tisVAOSupported = false;\n\t\n\t// Init OpenGLES2 rendering states\n\tref = new OGLESRenderRef;\n}\n\nOpenGLES2Renderer::~OpenGLES2Renderer()\n{\n\tif (ref == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\tglFinish();\n\t\n\tgpuScreen3DHasNewData[0] = false;\n\tgpuScreen3DHasNewData[1] = false;\n\t\n\tDestroyShaders();\n\tDestroyVAOs();\n\tDestroyVBOs();\n\tDestroyFBOs();\n\t\n\t//kill the tex cache to free all the texture ids\n\tTexCache_Reset();\n\t\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\t\n\twhile(!ref->freeTextureIDs.empty())\n\t{\n\t\tGLuint temp = ref->freeTextureIDs.front();\n\t\tref->freeTextureIDs.pop();\n\t\tglDeleteTextures(1, &temp);\n\t}\n\t\n\tglFinish();\n\t\n\t// Destroy OpenGLES2 rendering states\n\tdelete ref;\n\tref = NULL;\n}\n\nRender3DError OpenGLES2Renderer::InitExtensions()\n{\n\tRender3DError error = OGLERROR_NOERR;\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\t// Get OpenGLES2 extensions\n\tstd::set<std::string> oglExtensionSet;\n\tthis->GetExtensionSet(&oglExtensionSet);\n\t\n\t// Initialize OpenGLES2\n\tthis->InitTables();\n\t\n\tstd::string vertexShaderProgram;\n\tstd::string fragmentShaderProgram;\n\terror = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram);\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\treturn error;\n\t}\n\t\n\terror = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram);\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\treturn error;\n\t}\n\t\n\tthis->CreateToonTable();\n\t\n\tthis->CreateVBOs();\n\t\n\tthis->isVAOSupported = this->IsExtensionPresent(&oglExtensionSet, \"GL_OES_vertex_array_object\");\n\tif (this->isVAOSupported)\n\t{\n\t\tthis->CreateVAOs();\n\t}\n\t\n\t//this->isFBOSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_OES_depth_texture\") &&\n\t//\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_OES_packed_depth_stencil\");\n\tthis->isFBOSupported = false;\n\tif (this->isFBOSupported)\n\t{\n\t\terror = this->CreateFBOs();\n\t\tif (error != OGLERROR_NOERR)\n\t\t{\n\t\t\tOGLRef.fboFinalOutputID = 0;\n\t\t\tthis->isFBOSupported = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\tOGLRef.fboFinalOutputID = 0;\n\t\tINFO(\"OpenGLES2: FBOs are unsupported. Some emulation features will be disabled.\\n\");\n\t}\n\t\n\tthis->InitTextures();\n\tthis->InitFinalRenderStates(&oglExtensionSet); // This must be done last\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::CreateVBOs()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglGenBuffers(1, &OGLRef.vboVertexID);\n\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\tglBufferData(GL_ARRAY_BUFFER, VERTLIST_SIZE * sizeof(VERT), NULL, GL_STREAM_DRAW);\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\t\n\tglGenBuffers(1, &OGLRef.iboIndexID);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort), NULL, GL_STREAM_DRAW);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLES2Renderer::DestroyVBOs()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\tglDeleteBuffers(1, &OGLRef.vboVertexID);\n\t\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\tglDeleteBuffers(1, &OGLRef.iboIndexID);\n}\n\nRender3DError OpenGLES2Renderer::LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram)\n{\n\toutVertexShaderProgram->clear();\n\toutFragmentShaderProgram->clear();\n\t\n\t*outVertexShaderProgram += std::string(vertexShader_100);\n\t*outFragmentShaderProgram += std::string(fragmentShader_100);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::SetupShaderIO()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Position, \"inPosition\");\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_TexCoord0, \"inTexCoord0\");\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Color, \"inColor\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tOGLRef.vertexShaderID = glCreateShader(GL_VERTEX_SHADER);\n\tif(!OGLRef.vertexShaderID)\n\t{\n\t\tINFO(\"OpenGLES2: Failed to create the vertex shader.\\n\");\t\t\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tconst char *vertexShaderProgramChar = vertexShaderProgram->c_str();\n\tglShaderSource(OGLRef.vertexShaderID, 1, (const GLchar **)&vertexShaderProgramChar, NULL);\n\tglCompileShader(OGLRef.vertexShaderID);\n\tif (!this->ValidateShaderCompile(OGLRef.vertexShaderID))\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tINFO(\"OpenGLES2: Failed to compile the vertex shader.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tOGLRef.fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);\n\tif(!OGLRef.fragmentShaderID)\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tINFO(\"OpenGLES2: Failed to create the fragment shader.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tconst char *fragmentShaderProgramChar = fragmentShaderProgram->c_str();\n\tglShaderSource(OGLRef.fragmentShaderID, 1, (const GLchar **)&fragmentShaderProgramChar, NULL);\n\tglCompileShader(OGLRef.fragmentShaderID);\n\tif (!this->ValidateShaderCompile(OGLRef.fragmentShaderID))\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\tINFO(\"OpenGLES2: Failed to compile the fragment shader.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tOGLRef.shaderProgram = glCreateProgram();\n\tif(!OGLRef.shaderProgram)\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\tINFO(\"OpenGLES2: Failed to create the shader program.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tglAttachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID);\n\tglAttachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID);\n\t\n\tthis->SetupShaderIO();\n\t\n\tglLinkProgram(OGLRef.shaderProgram);\n\tif (!this->ValidateShaderProgramLink(OGLRef.shaderProgram))\n\t{\n\t\tglDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID);\n\t\tglDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID);\n\t\tglDeleteProgram(OGLRef.shaderProgram);\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\tINFO(\"OpenGLES2: Failed to link the shader program.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tglValidateProgram(OGLRef.shaderProgram);\n\tglUseProgram(OGLRef.shaderProgram);\n\t\n\t// Set up shader uniforms\n\tGLint uniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, \"texMainRender\");\n\tglUniform1i(uniformTexSampler, 0);\n\t\n\tuniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, \"texToonTable\");\n\tglUniform1i(uniformTexSampler, OGLTextureUnitID_ToonTable);\n\t\n\tOGLRef.uniformPolyAlpha\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"polyAlpha\");\n\tOGLRef.uniformTexScale\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"texScale\");\n\tOGLRef.uniformPolyID\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"polyID\");\n\tOGLRef.uniformHasTexture\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"hasTexture\");\n\tOGLRef.uniformPolygonMode\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"polygonMode\");\n\tOGLRef.uniformToonShadingMode\t= glGetUniformLocation(OGLRef.shaderProgram, \"toonShadingMode\");\n\tOGLRef.uniformWBuffer\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"oglWBuffer\");\n\tOGLRef.uniformEnableAlphaTest\t= glGetUniformLocation(OGLRef.shaderProgram, \"enableAlphaTest\");\n\tOGLRef.uniformAlphaTestRef\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"alphaTestRef\");\n\t\n\tINFO(\"OpenGLES2: Successfully created shaders.\\n\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLES2Renderer::DestroyShaders()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglUseProgram(0);\n\t\n\tglDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID);\n\tglDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID);\n\t\n\tglDeleteProgram(OGLRef.shaderProgram);\n\tglDeleteShader(OGLRef.vertexShaderID);\n\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\n\tthis->DestroyToonTable();\n}\n\nRender3DError OpenGLES2Renderer::CreateVAOs()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglGenVertexArraysOES(1, &OGLRef.vaoMainStatesID);\n\tglBindVertexArrayOES(OGLRef.vaoMainStatesID);\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\t\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\n\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t\n\tglBindVertexArrayOES(0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLES2Renderer::DestroyVAOs()\n{\n\tif (!this->isVAOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tglBindVertexArrayOES(0);\n\tglDeleteVertexArraysOES(1, &this->ref->vaoMainStatesID);\n\t\n\tthis->isVAOSupported = false;\n}\n\nRender3DError OpenGLES2Renderer::CreateFBOs()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\t// Set up FBO render targets\n\tthis->CreateClearImage();\n\t\n\t// Set up FBOs\n\tglGenFramebuffers(1, &OGLRef.fboClearImageID);\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboClearImageID);\n\tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, OGLRef.texClearImageColorID, 0);\n\tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0);\n\tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0);\n\t\n\tif (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)\n\t{\n\t\tINFO(\"OpenGLES2: Failed to created FBOs. Some emulation features will be disabled.\\n\");\n\t\t\n\t\tglBindFramebuffer(GL_FRAMEBUFFER, 0);\n\t\tglDeleteFramebuffers(1, &OGLRef.fboClearImageID);\n\t\tthis->DestroyClearImage();\n\t\t\n\t\tthis->isFBOSupported = false;\n\t\treturn OGLERROR_FBO_CREATE_ERROR;\n\t}\n\t\n\t// Set up final output FBO\n\tOGLRef.fboFinalOutputID = 0;\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboFinalOutputID);\n\t\n\tINFO(\"OpenGLES2: Successfully created FBOs.\\n\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLES2Renderer::DestroyFBOs()\n{\n\tif (!this->isFBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, 0);\n\tglDeleteFramebuffers(1, &OGLRef.fboClearImageID);\n\tthis->DestroyClearImage();\n\tthis->isFBOSupported = false;\n}\n\nRender3DError OpenGLES2Renderer::InitFinalRenderStates(const std::set<std::string> *oglExtensionSet)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tbool isBlendEquationSeparateSupported = this->IsExtensionPresent(oglExtensionSet, \"GL_EXT_blend_minmax\");\n\t\n\t// Blending Support\n\tif (isBlendEquationSeparateSupported)\n\t{\n\t\t// we want to use alpha destination blending so we can track the last-rendered alpha value\n\t\t// test: new super mario brothers renders the stormclouds at the beginning\n\t\tglBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA);\n\t\tglBlendEquationSeparate(GL_FUNC_ADD, GL_MAX_EXT);\n\t}\n\telse\n\t{\n\t\tglBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_DST_ALPHA);\n\t}\n\t\n\t// Mirrored Repeat Mode Support\n\tOGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT;\n\t\n\t// Always enable depth test, and control using glDepthMask().\n\tglEnable(GL_DEPTH_TEST);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::InitTextures()\n{\n\tthis->ExpandFreeTextures();\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::InitTables()\n{\n\tstatic bool needTableInit = true;\n\t\n\tif (needTableInit)\n\t{\n\t\tfor (unsigned int i = 0; i < 32768; i++)\n\t\t\tdsDepthToD24S8_LUT[i] = (GLuint)DS_DEPTH15TO24(i) << 8;\n\t\t\n\t\tneedTableInit = false;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::CreateToonTable()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\t// The toon table is a special 1D texture where each pixel corresponds\n\t// to a specific color in the toon table.\n\tglGenTextures(1, &OGLRef.texToonTableID);\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texToonTableID);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\t\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::DestroyToonTable()\n{\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\tglActiveTexture(GL_TEXTURE0);\n\tglDeleteTextures(1, &this->ref->texToonTableID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::UploadToonTable(const GLuint *toonTableBuffer)\n{\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable);\n\tglBindTexture(GL_TEXTURE_2D, this->ref->texToonTableID);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, toonTableBuffer);\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::CreateClearImage()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglGenTextures(1, &OGLRef.texClearImageColorID);\n\tglGenTextures(1, &OGLRef.texClearImageDepthStencilID);\n\t\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\t//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_OES, 256, 192, 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL);\n\t\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::DestroyClearImage()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\tglActiveTexture(GL_TEXTURE0);\n\tglDeleteTextures(1, &OGLRef.texClearImageColorID);\n\tglDeleteTextures(1, &OGLRef.texClearImageDepthStencilID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID);\n\tglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_BYTE, clearImageColorBuffer);\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID);\n\tglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, clearImageDepthBuffer);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\t\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLES2Renderer::GetExtensionSet(std::set<std::string> *oglExtensionSet)\n{\n\tstd::string oglExtensionString = std::string((const char *)glGetString(GL_EXTENSIONS));\n\t\n\tsize_t extStringStartLoc = 0;\n\tsize_t delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc);\n\twhile (delimiterLoc != std::string::npos)\n\t{\n\t\tstd::string extensionName = oglExtensionString.substr(extStringStartLoc, delimiterLoc - extStringStartLoc);\n\t\toglExtensionSet->insert(extensionName);\n\t\t\n\t\textStringStartLoc = delimiterLoc + 1;\n\t\tdelimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc);\n\t}\n\t\n\tif (extStringStartLoc - oglExtensionString.length() > 0)\n\t{\n\t\tstd::string extensionName = oglExtensionString.substr(extStringStartLoc, oglExtensionString.length() - extStringStartLoc);\n\t\toglExtensionSet->insert(extensionName);\n\t}\n\n\tINFO(\"{ ExtensionSet : %s }\\n\", oglExtensionString.c_str());\n}\n\nRender3DError OpenGLES2Renderer::ExpandFreeTextures()\n{\n\tstatic const int kInitTextures = 128;\n\tGLuint oglTempTextureID[kInitTextures];\n\tglGenTextures(kInitTextures, oglTempTextureID);\n\t\n\tfor(int i=0;i<kInitTextures;i++)\n\t{\n\t\tthis->ref->freeTextureIDs.push(oglTempTextureID[i]);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\tconst unsigned int polyCount = polyList->count;\n\tunsigned int vertIndexCount = 0;\n\t\n\tfor(unsigned int i = 0; i < polyCount; i++)\n\t{\n\t\tconst POLY *poly = &polyList->list[indexList->list[i]];\n\t\tconst unsigned int polyType = poly->type;\n\t\t\n\t\tfor(unsigned int j = 0; j < polyType; j++)\n\t\t{\n\t\t\tconst GLushort vertIndex = poly->vertIndexes[j];\n\t\t\t\t\n\t\t\t// While we're looping through our vertices, add each vertex index to\n\t\t\t// a buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional\n\t\t\t// vertices here to convert them to GL_TRIANGLES, which are much easier\n\t\t\t// to work with and won't be deprecated in future OpenGLES2 versions.\n\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\tif (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP)\n\t\t\t{\n\t\t\t\tif (j == 2)\n\t\t\t\t{\n\t\t\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\t\t}\n\t\t\t\telse if (j == 3)\n\t\t\t\t{\n\t\t\t\t\toutIndexBuffer[vertIndexCount++] = poly->vertIndexes[0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t*outIndexCount = vertIndexCount;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArrayOES(OGLRef.vaoMainStatesID);\n\t\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\t\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t}\n\telse\n\t{\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\t\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t\t\n\t\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\t\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\t\t\n\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t\n\t\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\t\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\t\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::DisableVertexAttributes()\n{\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArrayOES(0);\n\t}\n\telse\n\t{\n\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\tglDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t\n\t\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::SelectRenderingFramebuffer()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\n\tOGLRef.selectedRenderingFBO = OGLRef.fboFinalOutputID;\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.selectedRenderingFBO);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::ReadBackPixels()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tthis->gpuScreen3DHasNewData[i] = true;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::DeleteTexture(const TexCacheItem *item)\n{\n\tthis->ref->freeTextureIDs.push((GLuint)item->texid);\n\tif(this->currTexture == item)\n\t{\n\t\tthis->currTexture = NULL;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::BeginRender(const GFX3D_State *renderState)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\tthis->doubleBufferIndex = (this->doubleBufferIndex + 1) & 0x01;\n\t\n\tthis->SelectRenderingFramebuffer();\n\t\n\tglUniform1i(OGLRef.uniformEnableAlphaTest, renderState->enableAlphaTest ? GL_TRUE : GL_FALSE);\n\tglUniform1f(OGLRef.uniformAlphaTestRef, divide5bitBy31_LUT[renderState->alphaTestRef]);\n\tglUniform1i(OGLRef.uniformToonShadingMode, renderState->shading);\n\tglUniform1i(OGLRef.uniformWBuffer, renderState->wbuffer);\n\t\n\tif(renderState->enableAlphaBlending)\n\t{\n\t\tglEnable(GL_BLEND);\n\t}\n\telse\n\t{\n\t\tglDisable(GL_BLEND);\n\t}\n\t\n\tglDepthMask(GL_TRUE);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\tunsigned int vertIndexCount = 0;\n\t\n\tthis->SetupVertices(vertList, polyList, indexList, OGLRef.vertIndexBuffer, &vertIndexCount);\n\tthis->EnableVertexAttributes(vertList, OGLRef.vertIndexBuffer, vertIndexCount);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\tu32 lastTexParams = 0;\n\tu32 lastTexPalette = 0;\n\tu32 lastPolyAttr = 0;\n\tu32 lastViewport = 0xFFFFFFFF;\n\tconst unsigned int polyCount = polyList->count;\n\t//GLushort *indexBufferPtr = this->isVBOSupported ? 0 : OGLRef.vertIndexBuffer;\n\tGLushort *indexBufferPtr = 0;\n\t\n\t// Map GFX3D_QUADS and GFX3D_QUAD_STRIP to GL_TRIANGLES since we will convert them.\n\t//\n\t// Also map GFX3D_TRIANGLE_STRIP to GL_TRIANGLES. This is okay since this is actually\n\t// how the POLY struct stores triangle strip vertices, which is in sets of 3 vertices\n\t// each. This redefinition is necessary since uploading more than 3 indices at a time\n\t// will cause glDrawElements() to draw the triangle strip incorrectly.\n\tstatic const GLenum oglPrimitiveType[]\t= {GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES,\n\t\t\t\t\t\t\t\t\t\t\t   GL_LINE_LOOP, GL_LINE_LOOP, GL_LINE_STRIP, GL_LINE_STRIP};\n\t\n\tstatic const unsigned int indexIncrementLUT[] = {3, 6, 3, 6, 3, 4, 3, 4};\n\t\n\tfor(unsigned int i = 0; i < polyCount; i++)\n\t{\n\t\tconst POLY *poly = &polyList->list[indexList->list[i]];\n\t\t\n\t\t// Set up the polygon if it changed\n\t\tif(lastPolyAttr != poly->polyAttr || i == 0)\n\t\t{\n\t\t\tlastPolyAttr = poly->polyAttr;\n\t\t\tthis->SetupPolygon(poly);\n\t\t}\n\t\t\n\t\t// Set up the texture if it changed\n\t\tif(lastTexParams != poly->texParam || lastTexPalette != poly->texPalette || i == 0)\n\t\t{\n\t\t\tlastTexParams = poly->texParam;\n\t\t\tlastTexPalette = poly->texPalette;\n\t\t\tthis->SetupTexture(poly, renderState->enableTexturing);\n\t\t}\n\t\t\n\t\t// Set up the viewport if it changed\n\t\tif(lastViewport != poly->viewport || i == 0)\n\t\t{\n\t\t\tlastViewport = poly->viewport;\n\t\t\tthis->SetupViewport(poly);\n\t\t}\n\t\t\n\t\t// In wireframe mode, redefine all primitives as GL_LINE_LOOP rather than\n\t\t// setting the polygon mode to GL_LINE though glPolygonMode(). Not only is\n\t\t// drawing more accurate this way, but it also allows GFX3D_QUADS and\n\t\t// GFX3D_QUAD_STRIP primitives to properly draw as wireframe without the\n\t\t// extra diagonal line.\n\t\tconst GLenum polyPrimitive = !poly->isWireframe() ? oglPrimitiveType[poly->vtxFormat] : GL_LINE_LOOP;\n\t\t\n\t\t// Render the polygon\n\t\tconst unsigned int vertIndexCount = indexIncrementLUT[poly->vtxFormat];\n\t\tglDrawElements(polyPrimitive, vertIndexCount, GL_UNSIGNED_SHORT, indexBufferPtr);\n\t\tindexBufferPtr += vertIndexCount;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::PostRender()\n{\n\tthis->DisableVertexAttributes();\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::EndRender(const u64 frameCount)\n{\n\t//needs to happen before endgl because it could free some textureids for expired cache items\n\tTexCache_EvictFrame();\n\t\n\tthis->ReadBackPixels();\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll)\n{\n\tstatic const size_t pixelsPerLine = 256;\n\tstatic const size_t lineCount = 192;\n\tstatic const size_t totalPixelCount = pixelsPerLine * lineCount;\n\tstatic const size_t bufferSize = totalPixelCount * sizeof(u16);\n\t\n\tstatic CACHE_ALIGN GLushort clearImageColorBuffer[totalPixelCount] = {0};\n\tstatic CACHE_ALIGN GLint clearImageDepthBuffer[totalPixelCount] = {0};\n\tstatic CACHE_ALIGN u16 lastColorBuffer[totalPixelCount] = {0};\n\tstatic CACHE_ALIGN u16 lastDepthBuffer[totalPixelCount] = {0};\n\tstatic u8 lastXScroll = 0;\n\tstatic u8 lastYScroll = 0;\n\t\n\tif (!this->isFBOSupported)\n\t{\n\t\treturn OGLERROR_FEATURE_UNSUPPORTED;\n\t}\n\t\n\tif (lastXScroll != xScroll ||\n\t\tlastYScroll != yScroll ||\n\t\tmemcmp(colorBuffer, lastColorBuffer, bufferSize) ||\n\t\tmemcmp(depthBuffer, lastDepthBuffer, bufferSize) )\n\t{\n\t\tlastXScroll = xScroll;\n\t\tlastYScroll = yScroll;\n\t\tmemcpy(lastColorBuffer, colorBuffer, bufferSize);\n\t\tmemcpy(lastDepthBuffer, depthBuffer, bufferSize);\n\t\t\n\t\tunsigned int dd = totalPixelCount - pixelsPerLine;\n\t\t\n\t\tfor(unsigned int iy = 0; iy < lineCount; iy++)\n\t\t{\n\t\t\tconst unsigned int y = ((iy + yScroll) & 0xFF) << 8;\n\t\t\t\n\t\t\tfor(unsigned int ix = 0; ix < pixelsPerLine; ix++)\n\t\t\t{\n\t\t\t\tconst unsigned int x = (ix + xScroll) & 0xFF;\n\t\t\t\tconst unsigned int adr = y + x;\n\t\t\t\t\n\t\t\t\tclearImageColorBuffer[dd] = colorBuffer[adr];\n\t\t\t\tclearImageDepthBuffer[dd] = dsDepthToD24S8_LUT[depthBuffer[adr] & 0x7FFF] | clearStencil;\n\t\t\t\t\n\t\t\t\tdd++;\n\t\t\t}\n\t\t\t\n\t\t\tdd -= pixelsPerLine * 2;\n\t\t}\n\t\t\n\t\tthis->UploadClearImage(clearImageColorBuffer, clearImageDepthBuffer);\n\t}\n\t\n\tthis->clearImageStencilValue = clearStencil;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::UpdateToonTable(const u16 *toonTableBuffer)\n{\n\tstatic CACHE_ALIGN u16 currentToonTable16[32] = {0};\n\n\t// Update the toon table if it changed.\n\tif (memcmp(currentToonTable16, toonTableBuffer, sizeof(currentToonTable16)))\n\t{\n\t\tmemcpy(currentToonTable16, toonTableBuffer, sizeof(currentToonTable16));\n\n\t\tfor(int i=0;i<32;i++)\n\t\t\tthis->currentToonTable32[i] = RGB15TO32_NOALPHA(toonTableBuffer[i]);\n\n\t\tthis->toonTableNeedsUpdate = true;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::ClearUsingImage() const\n{\n\tstatic u8 lastClearStencil = 0;\n\t\n\tif (!this->isFBOSupported)\n\t{\n\t\treturn OGLERROR_FEATURE_UNSUPPORTED;\n\t}\n\t\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\t//glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, OGLRef.fboClearImageID);\n\t//glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO);\n\t//glBlitFramebufferEXT(0, 0, 256, 192, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);\n\t//glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO);\n\t\n\tif (lastClearStencil == this->clearImageStencilValue)\n\t{\n\t\tlastClearStencil = this->clearImageStencilValue;\n\t\tglClearStencil(lastClearStencil);\n\t}\n\t\n\tglClear(GL_STENCIL_BUFFER_BIT);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const\n{\n\tstatic u8 last_r = 0;\n\tstatic u8 last_g = 0;\n\tstatic u8 last_b = 0;\n\tstatic u8 last_a = 0;\n\tstatic u32 lastClearDepth = 0;\n\tstatic u8 lastClearStencil = 0;\n\t\n\tif (r != last_r || g != last_g || b != last_b || a != last_a)\n\t{\n\t\tlast_r = r;\n\t\tlast_g = g;\n\t\tlast_b = b;\n\t\tlast_a = a;\n\t\tglClearColor(divide5bitBy31_LUT[r], divide5bitBy31_LUT[g], divide5bitBy31_LUT[b], divide5bitBy31_LUT[a]);\n\t}\n\t\n\tif (clearDepth != lastClearDepth)\n\t{\n\t\tlastClearDepth = clearDepth;\n\t\tglClearDepthf((GLfloat)clearDepth / (GLfloat)0x00FFFFFF);\n\t}\n\t\n\tif (clearStencil != lastClearStencil)\n\t{\n\t\tlastClearStencil = clearStencil;\n\t\tglClearStencil(clearStencil);\n\t}\n\t\n\tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::SetupPolygon(const POLY *thePoly)\n{\n\tstatic unsigned int lastTexBlendMode = 0;\n\tstatic int lastStencilState = -1;\n\t\n\tOGLESRenderRef &OGLRef = *this->ref;\n\tconst PolygonAttributes attr = thePoly->getAttributes();\n\t\n\t// Set up polygon ID\n\tglUniform1i(OGLRef.uniformPolyID, attr.polygonID);\n\t\n\t// Set up alpha value\n\tconst GLfloat thePolyAlpha = (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f;\n\tglUniform1f(OGLRef.uniformPolyAlpha, thePolyAlpha);\n\t\n\t// Set up depth test mode\n\tstatic const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL};\n\tglDepthFunc(oglDepthFunc[attr.enableDepthTest]);\n\t\n\t// Set up culling mode\n\tstatic const GLenum oglCullingMode[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0};\n\tGLenum cullingMode = oglCullingMode[attr.surfaceCullingMode];\n\t\n\tif (cullingMode == 0)\n\t{\n\t\txglDisable(GL_CULL_FACE);\n\t}\n\telse\n\t{\n\t\txglEnable(GL_CULL_FACE);\n\t\tglCullFace(cullingMode);\n\t}\n\t\n\t// Set up depth write\n\tGLboolean enableDepthWrite = GL_TRUE;\n\t\n\t// Handle shadow polys. Do this after checking for depth write, since shadow polys\n\t// can change this too.\n\tif(attr.polygonMode == 3)\n\t{\n\t\txglEnable(GL_STENCIL_TEST);\n\t\tif(attr.polygonID == 0)\n\t\t{\n\t\t\tenableDepthWrite = GL_FALSE;\n\t\t\tif(lastStencilState != 0)\n\t\t\t{\n\t\t\t\tlastStencilState = 0;\n\t\t\t\t//when the polyID is zero, we are writing the shadow mask.\n\t\t\t\t//set stencilbuf = 1 where the shadow volume is obstructed by geometry.\n\t\t\t\t//do not write color or depth information.\n\t\t\t\tglStencilFunc(GL_ALWAYS, 65, 255);\n\t\t\t\tglStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);\n\t\t\t\tglColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tenableDepthWrite = GL_TRUE;\n\t\t\tif(lastStencilState != 1)\n\t\t\t{\n\t\t\t\tlastStencilState = 1;\n\t\t\t\t//when the polyid is nonzero, we are drawing the shadow poly.\n\t\t\t\t//only draw the shadow poly where the stencilbuf==1.\n\t\t\t\t//I am not sure whether to update the depth buffer here--so I chose not to.\n\t\t\t\tglStencilFunc(GL_EQUAL, 65, 255);\n\t\t\t\tglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);\n\t\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\txglEnable(GL_STENCIL_TEST);\n\t\tif(attr.isTranslucent)\n\t\t{\n\t\t\tlastStencilState = 3;\n\t\t\tglStencilFunc(GL_NOTEQUAL, attr.polygonID, 255);\n\t\t\tglStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);\n\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t}\n\t\telse if(lastStencilState != 2)\n\t\t{\n\t\t\tlastStencilState = 2;\n\t\t\tglStencilFunc(GL_ALWAYS, 64, 255);\n\t\t\tglStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);\n\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t}\n\t}\n\t\n\tif(attr.isTranslucent && !attr.enableAlphaDepthWrite)\n\t{\n\t\tenableDepthWrite = GL_FALSE;\n\t}\n\t\n\tglDepthMask(enableDepthWrite);\n\t\n\t// Set up texture blending mode\n\tif(attr.polygonMode != lastTexBlendMode)\n\t{\n\t\tlastTexBlendMode = attr.polygonMode;\n\t\t\n\t\tglUniform1i(OGLRef.uniformPolygonMode, attr.polygonMode);\n\t\t\t\n\t\t// Update the toon table if necessary\n\t\tif (this->toonTableNeedsUpdate && attr.polygonMode == 2)\n\t\t{\n\t\t\tthis->UploadToonTable(this->currentToonTable32);\n\t\t\tthis->toonTableNeedsUpdate = false;\n\t\t}\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::SetupTexture(const POLY *thePoly, bool enableTexturing)\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\tconst PolygonTexParams params = thePoly->getTexParams();\n\t\n\t// Check if we need to use textures\n\tif (thePoly->texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing)\n\t{\n\t\tglUniform1i(OGLRef.uniformHasTexture, GL_FALSE);\n\t\t\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\t// Enable textures if they weren't already enabled\n\tglUniform1i(OGLRef.uniformHasTexture, GL_TRUE);\n\t\n\t//\ttexCacheUnit.TexCache_SetTexture<TexFormat_32bpp>(format, texpal);\n\tTexCacheItem *newTexture = TexCache_SetTexture(TexFormat_32bpp, thePoly->texParam, thePoly->texPalette);\n\tif(newTexture != this->currTexture)\n\t{\n\t\tthis->currTexture = newTexture;\n\t\t//has the ogl renderer initialized the texture?\n\t\tif(!this->currTexture->deleteCallback)\n\t\t{\n\t\t\tthis->currTexture->deleteCallback = texDeleteCallback;\n\t\t\t\n\t\t\tif(OGLRef.freeTextureIDs.empty())\n\t\t\t{\n\t\t\t\tthis->ExpandFreeTextures();\n\t\t\t}\n\t\t\t\n\t\t\tthis->currTexture->texid = (u64)OGLRef.freeTextureIDs.front();\n\t\t\tOGLRef.freeTextureIDs.pop();\n\t\t\t\n\t\t\tglBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid);\n\t\t\t\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (params.enableRepeatS ? (params.enableMirroredRepeatS ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE));\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (params.enableRepeatT ? (params.enableMirroredRepeatT ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE));\n\t\t\t\n\t\t\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,\n\t\t\t\t\t\t this->currTexture->sizeX, this->currTexture->sizeY, 0,\n\t\t\t\t\t\t GL_RGBA, GL_UNSIGNED_BYTE, this->currTexture->decoded);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//otherwise, just bind it\n\t\t\tglBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid);\n\t\t}\n\t\t\n\t\tglUniform2f(OGLRef.uniformTexScale, this->currTexture->invSizeX, this->currTexture->invSizeY);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::SetupViewport(const POLY *thePoly)\n{\n\tVIEWPORT viewport;\n\tviewport.decode(thePoly->viewport);\n\tglViewport(viewport.x, viewport.y, viewport.width, viewport.height);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::Reset()\n{\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tthis->gpuScreen3DHasNewData[0] = false;\n\tthis->gpuScreen3DHasNewData[1] = false;\n\t\n\tglFinish();\n\t\n\tfor (unsigned int i = 0; i < 2; i++)\n\t{\n\t\tmemset(this->GPU_screen3D[i], 0, sizeof(this->GPU_screen3D[i]));\n\t}\n\t\n\tmemset(currentToonTable32, 0, sizeof(currentToonTable32));\n\tthis->UpdateToonTable((u16*)currentToonTable32);\n\tthis->toonTableNeedsUpdate = true;\n\t\n\tglUniform1f(OGLRef.uniformPolyAlpha, 1.0f);\n\tglUniform2f(OGLRef.uniformTexScale, 1.0f, 1.0f);\n\tglUniform1i(OGLRef.uniformPolyID, 0);\n\tglUniform1i(OGLRef.uniformHasTexture, GL_FALSE);\n\tglUniform1i(OGLRef.uniformPolygonMode, 0);\n\tglUniform1i(OGLRef.uniformToonShadingMode, 0);\n\tglUniform1i(OGLRef.uniformWBuffer, 0);\n\tglUniform1i(OGLRef.uniformEnableAlphaTest, GL_TRUE);\n\tglUniform1f(OGLRef.uniformAlphaTestRef, 0.0f);\n\t\n\tmemset(OGLRef.vertIndexBuffer, 0, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort));\n\tthis->currTexture = NULL;\n\tthis->doubleBufferIndex = 0;\n\tthis->clearImageStencilValue = 0;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLES2Renderer::RenderFinish()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tif (!this->gpuScreen3DHasNewData[i])\n\t{\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\tOGLESRenderRef &OGLRef = *this->ref;\n\t\n\tu32 *__restrict workingBuffer = this->GPU_screen3D[i];\n\tglReadPixels(0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_BYTE, workingBuffer);\n\tthis->ConvertFramebuffer(workingBuffer, (u32 *)gfx3d_convertedScreen);\n\t\n\tthis->gpuScreen3DHasNewData[i] = false;\n\t\n\treturn OGLERROR_NOERR;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/OGLES2Render.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef OGLES2RENDER_H\n#define OGLES2RENDER_H\n\n#include <queue>\n#include <set>\n#include <string>\n#include \"render3D.h\"\n#include \"types.h\"\n\n#include <GLES2/gl2.h>\n#include <GLES2/gl2ext.h>\n#include <EGL/egl.h>\n\n#define OGLEXT(procPtr, func)\t\tprocPtr func = NULL;\n#define INITOGLEXT(procPtr, func)\tfunc = (procPtr)eglGetProcAddress(#func);\n#define EXTERNOGLEXT(procPtr, func)\textern procPtr func;\n\n// VAO\nEXTERNOGLEXT(PFNGLGENVERTEXARRAYSOESPROC, glGenVertexArraysOES)\nEXTERNOGLEXT(PFNGLDELETEVERTEXARRAYSOESPROC, glDeleteVertexArraysOES)\nEXTERNOGLEXT(PFNGLBINDVERTEXARRAYOESPROC, glBindVertexArrayOES)\n\n// VBO\nEXTERNOGLEXT(PFNGLMAPBUFFEROESPROC, glMapBufferOES)\nEXTERNOGLEXT(PFNGLUNMAPBUFFEROESPROC, glUnmapBufferOES)\n\n// Define the minimum required OpenGL version for the driver to support\n#define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR\t\t\t2\n#define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR\t\t\t0\n\n#define OGLRENDER_MAX_MULTISAMPLES\t\t\t16\n#define OGLRENDER_VERT_INDEX_BUFFER_COUNT\t131072\n\nenum OGLVertexAttributeID\n{\n\tOGLVertexAttributeID_Position\t= 0,\n\tOGLVertexAttributeID_TexCoord0\t= 8,\n\tOGLVertexAttributeID_Color\t\t= 3,\n};\n\nenum OGLTextureUnitID\n{\n\t// Main textures will always be on texture unit 0.\n\tOGLTextureUnitID_ToonTable = 1,\n\tOGLTextureUnitID_ClearImage\n};\n\nenum OGLErrorCode\n{\n\tOGLERROR_NOERR = RENDER3DERROR_NOERR,\n\t\n\tOGLERROR_FEATURE_UNSUPPORTED,\n\tOGLERROR_VBO_UNSUPPORTED,\n\tOGLERROR_PBO_UNSUPPORTED,\n\tOGLERROR_SHADER_UNSUPPORTED,\n\tOGLERROR_VAO_UNSUPPORTED,\n\tOGLERROR_FBO_UNSUPPORTED,\n\tOGLERROR_MULTISAMPLED_FBO_UNSUPPORTED,\n\t\n\tOGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR,\n\tOGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR,\n\tOGLERROR_SHADER_CREATE_ERROR,\n\t\n\tOGLERROR_FBO_CREATE_ERROR\n};\n\nstruct OGLESRenderRef\n{\t\n\t// OpenGL Feature Support\n\tGLint stateTexMirroredRepeat;\n\t\n\t// VBO\n\tGLuint vboVertexID;\n\tGLuint iboIndexID;\n\t\n\t// FBO\n\tGLuint texClearImageColorID;\n\tGLuint texClearImageDepthStencilID;\n\tGLuint fboClearImageID;\n\t\n\tGLuint rboFinalOutputColorID;\n\tGLuint rboFinalOutputDepthStencilID;\n\tGLuint fboFinalOutputID;\n\t\n\tGLuint selectedRenderingFBO;\n\t\n\t// Shader states\n\tGLuint vertexShaderID;\n\tGLuint fragmentShaderID;\n\tGLuint shaderProgram;\n\t\n\tGLint uniformPolyID;\n\tGLint uniformPolyAlpha;\n\tGLint uniformTexScale;\n\tGLint uniformHasTexture;\n\tGLint uniformPolygonMode;\n\tGLint uniformToonShadingMode;\n\tGLint uniformWBuffer;\n\tGLint uniformEnableAlphaTest;\n\tGLint uniformAlphaTestRef;\n\t\n\tGLuint texToonTableID;\n\t\n\t// VAO\n\tGLuint vaoMainStatesID;\n\t\n\t// Textures\n\tstd::queue<GLuint> freeTextureIDs;\n\t\n\t// Client-side Buffers\n\tDS_ALIGN(16) GLushort vertIndexBuffer[OGLRENDER_VERT_INDEX_BUFFER_COUNT];\n};\n\nstruct GFX3D_State;\nstruct VERTLIST;\nstruct POLYLIST;\nstruct INDEXLIST;\nstruct POLY;\nclass TexCacheItem;\nclass OpenGLESRenderer;\n\nextern GPU3DInterface gpu3Dgles2;\n\n//This is called by OGLRender whenever it initializes.\n//Platforms, please be sure to set this up.\n//return true if you successfully init.\nextern bool (*oglrender_init)();\n\n//This is called by OGLRender before it uses opengl.\n//return true if youre OK with using opengl\nextern bool (*oglrender_beginOpenGL)();\n\n//This is called by OGLRender after it is done using opengl.\nextern void (*oglrender_endOpenGL)();\n\n// Lookup Tables\nextern CACHE_ALIGN GLuint dsDepthToD24S8_LUT[32768];\nextern const GLfloat divide5bitBy31_LUT[32];\n\n//FORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix);\n//FORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix);\nFORCEINLINE u32 RGBA8888_32_To_RGBA6665_32Rev(const u32 srcPix);\nFORCEINLINE u32 RGBA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix);\nbool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor);\n\nclass OpenGLESRenderer : public Render3D\n{\nprivate:\n\t// Driver's OpenGL Version\n\tunsigned int versionMajor;\n\tunsigned int versionMinor;\n\t\nprotected:\n\t// OpenGL-specific References\n\tOGLESRenderRef *ref;\n\t\n\t// OpenGL Feature Support\n\tbool isFBOSupported;\n\tbool isVAOSupported;\n\t\n\t// Textures\n\tTexCacheItem *currTexture;\n\t\n\tu32 currentToonTable32[32];\n\tbool toonTableNeedsUpdate;\n\t\n\tDS_ALIGN(16) u32 GPU_screen3D[2][256 * 192 * sizeof(u32)];\n\tbool gpuScreen3DHasNewData[2];\n\tunsigned int doubleBufferIndex;\n\tu8 clearImageStencilValue;\n\t\n\t// OpenGL-specific methods\n\tvirtual Render3DError CreateVBOs() = 0;\n\tvirtual void DestroyVBOs() = 0;\n\tvirtual Render3DError CreateFBOs() = 0;\n\tvirtual void DestroyFBOs() = 0;\n\tvirtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram) = 0;\n\tvirtual void DestroyShaders() = 0;\n\tvirtual Render3DError CreateVAOs() = 0;\n\tvirtual void DestroyVAOs() = 0;\n\tvirtual Render3DError InitTextures() = 0;\n\tvirtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet) = 0;\n\tvirtual Render3DError InitTables() = 0;\n\t\n\tvirtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram) = 0;\n\tvirtual Render3DError SetupShaderIO() = 0;\n\tvirtual Render3DError CreateToonTable() = 0;\n\tvirtual Render3DError DestroyToonTable() = 0;\n\tvirtual Render3DError UploadToonTable(const GLuint *toonTableBuffer) = 0;\n\tvirtual Render3DError CreateClearImage() = 0;\n\tvirtual Render3DError DestroyClearImage() = 0;\n\tvirtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer) = 0;\n\t\n\tvirtual void GetExtensionSet(std::set<std::string> *oglExtensionSet) = 0;\n\tvirtual Render3DError ExpandFreeTextures() = 0;\n\tvirtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount) = 0;\n\tvirtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount) = 0;\n\tvirtual Render3DError DisableVertexAttributes() = 0;\n\tvirtual Render3DError SelectRenderingFramebuffer() = 0;\n\tvirtual Render3DError ReadBackPixels() = 0;\n\t\n\t// Base rendering methods\n\tvirtual Render3DError BeginRender(const GFX3D_State *renderState) = 0;\n\tvirtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0;\n\tvirtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0;\n\tvirtual Render3DError PostRender() = 0;\n\tvirtual Render3DError EndRender(const u64 frameCount) = 0;\n\t\n\tvirtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll) = 0;\n\tvirtual Render3DError UpdateToonTable(const u16 *toonTableBuffer) = 0;\n\t\n\tvirtual Render3DError ClearUsingImage() const = 0;\n\tvirtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const = 0;\n\t\n\tvirtual Render3DError SetupPolygon(const POLY *thePoly) = 0;\n\tvirtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing) = 0;\n\tvirtual Render3DError SetupViewport(const POLY *thePoly) = 0;\n\t\npublic:\n\tOpenGLESRenderer();\n\tvirtual ~OpenGLESRenderer() {};\n\t\n\tvirtual Render3DError InitExtensions() = 0;\n\tvirtual Render3DError Reset() = 0;\n\tvirtual Render3DError RenderFinish() = 0;\n\t\n\tvirtual Render3DError DeleteTexture(const TexCacheItem *item) = 0;\n\t\n\tbool IsExtensionPresent(const std::set<std::string> *oglExtensionSet, const std::string extensionName) const;\n\tbool ValidateShaderCompile(GLuint theShader) const;\n\tbool ValidateShaderProgramLink(GLuint theProgram) const;\n\tvoid GetVersion(unsigned int *major, unsigned int *minor) const;\n\tvoid SetVersion(unsigned int major, unsigned int minor);\n\tvoid ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer);\n};\n\nclass OpenGLES2Renderer : public OpenGLESRenderer\n{\nprotected:\n\t// OpenGL-specific methods\n\tvirtual Render3DError CreateVBOs();\n\tvirtual void DestroyVBOs();\n\tvirtual Render3DError CreateFBOs();\n\tvirtual void DestroyFBOs();\n\tvirtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram);\n\tvirtual void DestroyShaders();\n\tvirtual Render3DError CreateVAOs();\n\tvirtual void DestroyVAOs();\n\tvirtual Render3DError InitTextures();\n\tvirtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet);\n\tvirtual Render3DError InitTables();\n\t\n\tvirtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram);\n\tvirtual Render3DError SetupShaderIO();\n\tvirtual Render3DError CreateToonTable();\n\tvirtual Render3DError DestroyToonTable();\n\tvirtual Render3DError UploadToonTable(const GLuint *toonTableBuffer);\n\tvirtual Render3DError CreateClearImage();\n\tvirtual Render3DError DestroyClearImage();\n\tvirtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer);\n\t\n\tvirtual void GetExtensionSet(std::set<std::string> *oglExtensionSet);\n\tvirtual Render3DError ExpandFreeTextures();\n\tvirtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount);\n\tvirtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount);\n\tvirtual Render3DError DisableVertexAttributes();\n\tvirtual Render3DError SelectRenderingFramebuffer();\n\tvirtual Render3DError ReadBackPixels();\n\t\n\t// Base rendering methods\n\tvirtual Render3DError BeginRender(const GFX3D_State *renderState);\n\tvirtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);\n\tvirtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);\n\tvirtual Render3DError PostRender();\n\tvirtual Render3DError EndRender(const u64 frameCount);\n\t\n\tvirtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll);\n\tvirtual Render3DError UpdateToonTable(const u16 *toonTableBuffer);\n\t\n\tvirtual Render3DError ClearUsingImage() const;\n\tvirtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const;\n\t\n\tvirtual Render3DError SetupPolygon(const POLY *thePoly);\n\tvirtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing);\n\tvirtual Render3DError SetupViewport(const POLY *thePoly);\n\t\npublic:\n\tOpenGLES2Renderer();\n\t~OpenGLES2Renderer();\n\t\n\tvirtual Render3DError InitExtensions();\n\tvirtual Render3DError Reset();\n\tvirtual Render3DError RenderFinish();\n\t\n\tvirtual Render3DError DeleteTexture(const TexCacheItem *item);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/OGLRender.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"OGLRender.h\"\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"debug.h\"\n#include \"gfx3d.h\"\n#include \"NDSSystem.h\"\n#include \"texcache.h\"\n\n\ntypedef struct\n{\n\tunsigned int major;\n\tunsigned int minor;\n\tunsigned int revision;\n} OGLVersion;\n\nstatic OGLVersion _OGLDriverVersion = {0, 0, 0};\nstatic OpenGLRenderer *_OGLRenderer = NULL;\nstatic bool isIntel965 = false;\n\n// Lookup Tables\nCACHE_ALIGN GLfloat material_8bit_to_float[256] = {0};\nCACHE_ALIGN GLuint dsDepthToD24S8_LUT[32768] = {0};\nconst GLfloat divide5bitBy31_LUT[32]\t= {0.0, 0.03225806451613, 0.06451612903226, 0.09677419354839,\n\t\t\t\t\t\t\t\t\t   0.1290322580645, 0.1612903225806, 0.1935483870968, 0.2258064516129,\n\t\t\t\t\t\t\t\t\t   0.258064516129, 0.2903225806452, 0.3225806451613, 0.3548387096774,\n\t\t\t\t\t\t\t\t\t   0.3870967741935, 0.4193548387097, 0.4516129032258, 0.4838709677419,\n\t\t\t\t\t\t\t\t\t   0.5161290322581, 0.5483870967742, 0.5806451612903, 0.6129032258065,\n\t\t\t\t\t\t\t\t\t   0.6451612903226, 0.6774193548387, 0.7096774193548, 0.741935483871,\n\t\t\t\t\t\t\t\t\t   0.7741935483871, 0.8064516129032, 0.8387096774194, 0.8709677419355,\n\t\t\t\t\t\t\t\t\t   0.9032258064516, 0.9354838709677, 0.9677419354839, 1.0};\n\nstatic bool BEGINGL()\n{\n\tif(oglrender_beginOpenGL) \n\t\treturn oglrender_beginOpenGL();\n\telse return true;\n}\n\nstatic void ENDGL()\n{\n\tif(oglrender_endOpenGL) \n\t\toglrender_endOpenGL();\n}\n\n// Function Pointers\nbool (*oglrender_init)() = NULL;\nbool (*oglrender_beginOpenGL)() = NULL;\nvoid (*oglrender_endOpenGL)() = NULL;\nvoid (*OGLLoadEntryPoints_3_2_Func)() = NULL;\nvoid (*OGLCreateRenderer_3_2_Func)(OpenGLRenderer **rendererPtr) = NULL;\n\n//------------------------------------------------------------\n\n// Textures\n#if !defined(GLX_H)\nOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3\nOGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB)\n#endif\n\n// Blending\nOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4\nOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0\n\nOGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT)\nOGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT)\n\n// Shaders\nOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0\nOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0\nOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0\nOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0\nOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0\nOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0\nOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0\nOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0\nOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0\nOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0\nOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0\nOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0\nOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0\nOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0\nOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0\nOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0\nOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0\nOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0\nOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0\nOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0\nOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0\nOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0\nOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0\nOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0\nOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0\n\n// VAO\nOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays)\nOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays)\nOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray)\n\n// Buffer Objects\nOGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB)\nOGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB)\nOGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB)\nOGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB)\nOGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB)\nOGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB)\nOGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB)\n\nOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5\nOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5\nOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5\nOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5\nOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5\nOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5\nOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5\n\n// FBO\nOGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT)\nOGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT)\nOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT)\nOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT)\nOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT)\nOGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT)\nOGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT)\nOGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT)\nOGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT)\nOGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT)\nOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT)\nOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT)\n\nstatic void OGLLoadEntryPoints_Legacy()\n{\n\t// Textures\n\t#if !defined(GLX_H)\n\tINITOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3\n\tINITOGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB)\n\t#endif\n\n\t// Blending\n\tINITOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4\n\tINITOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0\n\n\tINITOGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT)\n\tINITOGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT)\n\n\t// Shaders\n\tINITOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0\n\tINITOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0\n\tINITOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0\n\tINITOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0\n\tINITOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0\n\tINITOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0\n\tINITOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0\n\tINITOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0\n\tINITOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0\n\tINITOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0\n\tINITOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0\n\tINITOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0\n\tINITOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0\n\tINITOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0\n\tINITOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0\n\tINITOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0\n\tINITOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0\n\tINITOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0\n\tINITOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0\n\tINITOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0\n\tINITOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0\n\tINITOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0\n\tINITOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0\n\tINITOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0\n\tINITOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0\n\n\t// VAO\n\tINITOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays)\n\tINITOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays)\n\tINITOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray)\n\n\t// Buffer Objects\n\tINITOGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB)\n\tINITOGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB)\n\tINITOGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB)\n\tINITOGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB)\n\tINITOGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB)\n\tINITOGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB)\n\tINITOGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB)\n\n\tINITOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5\n\tINITOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5\n\tINITOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5\n\tINITOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5\n\tINITOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5\n\tINITOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5\n\tINITOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5\n\n\t// FBO\n\tINITOGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT)\n\tINITOGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT)\n\tINITOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT)\n\tINITOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT)\n\tINITOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT)\n\tINITOGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT)\n\tINITOGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT)\n\tINITOGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT)\n\tINITOGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT)\n\tINITOGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT)\n\tINITOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT)\n\tINITOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT)\n}\n\n// Vertex Shader GLSL 1.00\nstatic const char *vertexShader_100 = {\"\\\n\tattribute vec4 inPosition; \\n\\\n\tattribute vec2 inTexCoord0; \\n\\\n\tattribute vec3 inColor; \\n\\\n\t\\n\\\n\tuniform float polyAlpha; \\n\\\n\tuniform vec2 texScale; \\n\\\n\t\\n\\\n\tvarying vec4 vtxPosition; \\n\\\n\tvarying vec2 vtxTexCoord; \\n\\\n\tvarying vec4 vtxColor; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\tmat2 texScaleMtx\t= mat2(\tvec2(texScale.x,        0.0), \\n\\\n\t\t\t\t\t\t\t\t\tvec2(       0.0, texScale.y)); \\n\\\n\t\t\\n\\\n\t\tvtxPosition = inPosition; \\n\\\n\t\tvtxTexCoord = texScaleMtx * inTexCoord0; \\n\\\n\t\tvtxColor = vec4(inColor * 4.0, polyAlpha); \\n\\\n\t\t\\n\\\n\t\tgl_Position = vtxPosition; \\n\\\n\t} \\n\\\n\"};\n\n// Fragment Shader GLSL 1.00\nstatic const char *fragmentShader_100 = {\"\\\n\tvarying vec4 vtxPosition; \\n\\\n\tvarying vec2 vtxTexCoord; \\n\\\n\tvarying vec4 vtxColor; \\n\\\n\t\\n\\\n\tuniform sampler2D texMainRender; \\n\\\n\tuniform sampler1D texToonTable; \\n\\\n\tuniform int polyID; \\n\\\n\tuniform bool hasTexture; \\n\\\n\tuniform int polygonMode; \\n\\\n\tuniform int toonShadingMode; \\n\\\n\tuniform int oglWBuffer; \\n\\\n\tuniform bool enableAlphaTest; \\n\\\n\tuniform float alphaTestRef; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\tvec4 texColor = vec4(1.0, 1.0, 1.0, 1.0); \\n\\\n\t\tvec4 fragColor; \\n\\\n\t\t\\n\\\n\t\tif(hasTexture) \\n\\\n\t\t{ \\n\\\n\t\t\ttexColor = texture2D(texMainRender, vtxTexCoord); \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tfragColor = texColor; \\n\\\n\t\t\\n\\\n\t\tif(polygonMode == 0) \\n\\\n\t\t{ \\n\\\n\t\t\tfragColor = vtxColor * texColor; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 1) \\n\\\n\t\t{ \\n\\\n\t\t\tif (texColor.a == 0.0 || !hasTexture) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = vtxColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse if (texColor.a == 1.0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * (1.0-texColor.a) + vtxColor.rgb * texColor.a;\\n\\\n\t\t\t} \\n\\\n\t\t\t\\n\\\n\t\t\tfragColor.a = vtxColor.a; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 2) \\n\\\n\t\t{ \\n\\\n\t\t\tif (toonShadingMode == 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tvec3 toonColor = vec3(texture1D(texToonTable, vtxColor.r).rgb); \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * toonColor.rgb;\\n\\\n\t\t\t\tfragColor.a = texColor.a * vtxColor.a;\\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tvec3 toonColor = vec3(texture1D(texToonTable, vtxColor.r).rgb); \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * vtxColor.rgb + toonColor.rgb; \\n\\\n\t\t\t\tfragColor.a = texColor.a * vtxColor.a; \\n\\\n\t\t\t} \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 3) \\n\\\n\t\t{ \\n\\\n\t\t\tif (polyID != 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor = vtxColor; \\n\\\n\t\t\t} \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tif (fragColor.a == 0.0 || (enableAlphaTest && fragColor.a < alphaTestRef)) \\n\\\n\t\t{ \\n\\\n\t\t\tdiscard; \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\t#ifdef WANT_DEPTHLOGIC \\n\\\n\t\tif (oglWBuffer == 1) \\n\\\n\t\t{ \\n\\\n\t\t\t// TODO \\n\\\n\t\t\tgl_FragDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \\n\\\n\t\t} \\n\\\n\t\telse \\n\\\n\t\t{ \\n\\\n\t\t\tgl_FragDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \\n\\\n\t\t} \\n\\\n\t\t#endif //WANT_DEPTHLOGIC \\n\\\n\t\t\\n\\\n\t\tgl_FragColor = fragColor; \\n\\\n\t} \\n\\\n\"};\n\nFORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix)\n{\n\tconst u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F;\n\t\n\treturn\t (dstPix & 0x0000FF00) << 16 |\t\t// R\n\t\t\t (dstPix & 0x00FF0000)       |\t\t// G\n\t\t\t (dstPix & 0xFF000000) >> 16 |\t\t// B\n\t\t\t((dstPix >> 1) & 0x000000FF);\t\t// A\n}\n\nFORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix)\n{\n\tconst u32 dstPix = (srcPix >> 2) & 0x3F3F3F3F;\n\t\n\treturn\t (dstPix & 0x00FF0000) >> 16 |\t\t// R\n\t\t\t (dstPix & 0x0000FF00)       |\t\t// G\n\t\t\t (dstPix & 0x000000FF) << 16 |\t\t// B\n\t\t\t((dstPix >> 1) & 0xFF000000);\t\t// A\n}\n\n//opengl state caching:\n//This is of dubious performance assistance, but it is easy to take out so I am leaving it for now.\n//every function that is xgl* can be replaced with gl* if we decide to rip this out or if anyone else\n//doesnt feel like sticking with it (or if it causes trouble)\n\nstruct GLCaps {\n\tu8 caps[0x100];\n\tGLCaps() {\n\t\tmemset(caps,0xFF,sizeof(caps));\n\t}\n};\nstatic GLCaps glcaps;\n\nstatic void _xglEnable(GLenum cap) {\n\tcap -= 0x0B00;\n\tif(glcaps.caps[cap] == 0xFF || glcaps.caps[cap] == 0) {\n\t\tglEnable(cap+0x0B00);\n\t\tglcaps.caps[cap] = 1;\n\t}\n}\n\nstatic void _xglDisable(GLenum cap) {\n\tcap -= 0x0B00;\n\tif(glcaps.caps[cap]) {\n\t\tglDisable(cap+0x0B00);\n\t\tglcaps.caps[cap] = 0;\n\t}\n}\n\n#define xglEnable(cap) { \\\n\tCTASSERT((cap-0x0B00)<0x100); \\\n\t_xglEnable(cap); }\n\n#define xglDisable(cap) {\\\n\tCTASSERT((cap-0x0B00)<0x100); \\\n\t_xglDisable(cap); }\n\nbool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor, unsigned int checkVersionRevision)\n{\n\tbool result = false;\n\t\n\tif ( (_OGLDriverVersion.major > checkVersionMajor) ||\n\t\t (_OGLDriverVersion.major >= checkVersionMajor && _OGLDriverVersion.minor > checkVersionMinor) ||\n\t\t (_OGLDriverVersion.major >= checkVersionMajor && _OGLDriverVersion.minor >= checkVersionMinor && _OGLDriverVersion.revision >= checkVersionRevision) )\n\t{\n\t\tresult = true;\n\t}\n\t\n\treturn result;\n}\n\nstatic void OGLGetDriverVersion(const char *oglVersionString,\n\t\t\t\t\t\t\t\tunsigned int *versionMajor,\n\t\t\t\t\t\t\t\tunsigned int *versionMinor,\n\t\t\t\t\t\t\t\tunsigned int *versionRevision)\n{\n\tsize_t versionStringLength = 0;\n\t\n\tif (oglVersionString == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\t// First, check for the dot in the revision string. There should be at\n\t// least one present.\n\tconst char *versionStrEnd = strstr(oglVersionString, \".\");\n\tif (versionStrEnd == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\t// Next, check for the space before the vendor-specific info (if present).\n\tversionStrEnd = strstr(oglVersionString, \" \");\n\tif (versionStrEnd == NULL)\n\t{\n\t\t// If a space was not found, then the vendor-specific info is not present,\n\t\t// and therefore the entire string must be the version number.\n\t\tversionStringLength = strlen(oglVersionString);\n\t}\n\telse\n\t{\n\t\t// If a space was found, then the vendor-specific info is present,\n\t\t// and therefore the version number is everything before the space.\n\t\tversionStringLength = versionStrEnd - oglVersionString;\n\t}\n\t\n\t// Copy the version substring and parse it.\n\tchar *versionSubstring = (char *)malloc(versionStringLength * sizeof(char));\n\tstrncpy(versionSubstring, oglVersionString, versionStringLength);\n\t\n\tunsigned int major = 0;\n\tunsigned int minor = 0;\n\tunsigned int revision = 0;\n\t\n\tsscanf(versionSubstring, \"%u.%u.%u\", &major, &minor, &revision);\n\t\n\tfree(versionSubstring);\n\tversionSubstring = NULL;\n\t\n\tif (versionMajor != NULL)\n\t{\n\t\t*versionMajor = major;\n\t}\n\t\n\tif (versionMinor != NULL)\n\t{\n\t\t*versionMinor = minor;\n\t}\n\t\n\tif (versionRevision != NULL)\n\t{\n\t\t*versionRevision = revision;\n\t}\n}\n\nstatic void texDeleteCallback(TexCacheItem *item)\n{\n\t_OGLRenderer->DeleteTexture(item);\n}\n\ntemplate<bool require_profile, bool enable_3_2>\nstatic char OGLInit(void)\n{\n\tchar result = 0;\n\tRender3DError error = OGLERROR_NOERR;\n\t\n\tif(!oglrender_init)\n\t\treturn result;\n\tif(!oglrender_init())\n\t\treturn result;\n\t\n\tresult = Default3D_Init();\n\tif (result == 0)\n\t{\n\t\treturn result;\n\t}\n\n\tif(!BEGINGL())\n\t{\n\t\tINFO(\"OpenGL<%s,%s>: Could not initialize -- BEGINGL() failed.\\n\",require_profile?\"force\":\"auto\",enable_3_2?\"3_2\":\"old\");\n\t\tresult = 0;\n\t\treturn result;\n\t}\n\t\n\t// Get OpenGL info\n\tconst char *oglVersionString = (const char *)glGetString(GL_VERSION);\n\tconst char *oglVendorString = (const char *)glGetString(GL_VENDOR);\n\tconst char *oglRendererString = (const char *)glGetString(GL_RENDERER);\n\n\tif(!strcmp(oglVendorString,\"Intel\") && strstr(oglRendererString,\"965\"))\n\t\tisIntel965 = true;\n\t\n\t// Check the driver's OpenGL version\n\tOGLGetDriverVersion(oglVersionString, &_OGLDriverVersion.major, &_OGLDriverVersion.minor, &_OGLDriverVersion.revision);\n\t\n\tif (!IsVersionSupported(OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION))\n\t{\n\t\tINFO(\"OpenGL: Driver does not support OpenGL v%u.%u.%u or later. Disabling 3D renderer.\\n[ Driver Info -\\n    Version: %s\\n    Vendor: %s\\n    Renderer: %s ]\\n\",\n\t\t\t OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION,\n\t\t\t oglVersionString, oglVendorString, oglRendererString);\n\t\t\n\t\tresult = 0;\n\t\treturn result;\n\t}\n\t\n\t// Create new OpenGL rendering object\n\tif(enable_3_2)\n\t{\n\t\tif (OGLLoadEntryPoints_3_2_Func != NULL && OGLCreateRenderer_3_2_Func != NULL)\n\t\t{\n\t\t\tOGLLoadEntryPoints_3_2_Func();\n\t\t\tOGLLoadEntryPoints_Legacy(); //zero 04-feb-2013 - this seems to be necessary as well\n\t\t\tOGLCreateRenderer_3_2_Func(&_OGLRenderer);\n\t\t}\n\t\telse \n\t\t{\n\t\t\tif(require_profile)\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\t\n\t// If the renderer doesn't initialize with OpenGL v3.2 or higher, fall back\n\t// to one of the lower versions.\n\tif (_OGLRenderer == NULL)\n\t{\n\t\tOGLLoadEntryPoints_Legacy();\n\t\t\n\t\tif (IsVersionSupported(2, 1, 0))\n\t\t{\n\t\t\t_OGLRenderer = new OpenGLRenderer_2_1;\n\t\t\t_OGLRenderer->SetVersion(2, 1, 0);\n\t\t}\n\t\telse if (IsVersionSupported(2, 0, 0))\n\t\t{\n\t\t\t_OGLRenderer = new OpenGLRenderer_2_0;\n\t\t\t_OGLRenderer->SetVersion(2, 0, 0);\n\t\t}\n\t\telse if (IsVersionSupported(1, 5, 0))\n\t\t{\n\t\t\t_OGLRenderer = new OpenGLRenderer_1_5;\n\t\t\t_OGLRenderer->SetVersion(1, 5, 0);\n\t\t}\n\t\telse if (IsVersionSupported(1, 4, 0))\n\t\t{\n\t\t\t_OGLRenderer = new OpenGLRenderer_1_4;\n\t\t\t_OGLRenderer->SetVersion(1, 4, 0);\n\t\t}\n\t\telse if (IsVersionSupported(1, 3, 0))\n\t\t{\n\t\t\t_OGLRenderer = new OpenGLRenderer_1_3;\n\t\t\t_OGLRenderer->SetVersion(1, 3, 0);\n\t\t}\n\t\telse if (IsVersionSupported(1, 2, 0))\n\t\t{\n\t\t\t_OGLRenderer = new OpenGLRenderer_1_2;\n\t\t\t_OGLRenderer->SetVersion(1, 2, 0);\n\t\t}\n\t}\n\t\n\tif (_OGLRenderer == NULL)\n\t{\n\t\tINFO(\"OpenGL: Renderer did not initialize. Disabling 3D renderer.\\n[ Driver Info -\\n    Version: %s\\n    Vendor: %s\\n    Renderer: %s ]\\n\",\n\t\t\t oglVersionString, oglVendorString, oglRendererString);\n\t\tresult = 0;\n\t\treturn result;\n\t}\n\t\n\t// Initialize OpenGL extensions\n\terror = _OGLRenderer->InitExtensions();\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tif ( IsVersionSupported(2, 0, 0) &&\n\t\t\t(error == OGLERROR_SHADER_CREATE_ERROR ||\n\t\t\t error == OGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR ||\n\t\t\t error == OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR) )\n\t\t{\n\t\t\tINFO(\"OpenGL: Shaders are not working, even though they should be. Disabling 3D renderer.\\n\");\n\t\t\tresult = 0;\n\t\t\treturn result;\n\t\t}\n\t\telse if (IsVersionSupported(3, 0, 0) && error == OGLERROR_FBO_CREATE_ERROR && OGLLoadEntryPoints_3_2_Func != NULL)\n\t\t{\n\t\t\tINFO(\"OpenGL: FBOs are not working, even though they should be. Disabling 3D renderer.\\n\");\n\t\t\tresult = 0;\n\t\t\treturn result;\n\t\t}\n\t}\n\t\n\t// Initialization finished -- reset the renderer\n\t_OGLRenderer->Reset();\n\t\n\tENDGL();\n\t\n\tunsigned int major = 0;\n\tunsigned int minor = 0;\n\tunsigned int revision = 0;\n\t_OGLRenderer->GetVersion(&major, &minor, &revision);\n\t\n\tINFO(\"OpenGL: Renderer initialized successfully (v%u.%u.%u).\\n[ Driver Info -\\n    Version: %s\\n    Vendor: %s\\n    Renderer: %s ]\\n\",\n\t\t major, minor, revision, oglVersionString, oglVendorString, oglRendererString);\n\t\n\treturn result;\n}\n\nstatic void OGLReset()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->Reset();\n\t\n\tENDGL();\n}\n\nstatic void OGLClose()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\tdelete _OGLRenderer;\n\t_OGLRenderer = NULL;\n\t\n\tENDGL();\n\t\n\tDefault3D_Close();\n}\n\nstatic void OGLRender()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->Render(&gfx3d.renderState, gfx3d.vertlist, gfx3d.polylist, &gfx3d.indexlist, gfx3d.frameCtr);\n\t\n\tENDGL();\n}\n\nstatic void OGLVramReconfigureSignal()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->VramReconfigureSignal();\n\t\n\tENDGL();\n}\n\nstatic void OGLRenderFinish()\n{\n\tif(!BEGINGL())\n\t\treturn;\n\t\n\t_OGLRenderer->RenderFinish();\n\t\n\tENDGL();\n}\n\n//automatically select 3.2 or old profile depending on whether 3.2 is available\nGPU3DInterface gpu3Dgl = {\n\t\"OpenGL\",\n\tOGLInit<false,true>,\n\tOGLReset,\n\tOGLClose,\n\tOGLRender,\n\tOGLRenderFinish,\n\tOGLVramReconfigureSignal\n};\n\n//forcibly use old profile\nGPU3DInterface gpu3DglOld = {\n\t\"OpenGL Old\",\n\tOGLInit<true,false>,\n\tOGLReset,\n\tOGLClose,\n\tOGLRender,\n\tOGLRenderFinish,\n\tOGLVramReconfigureSignal\n};\n\n//forcibly use new profile\nGPU3DInterface gpu3Dgl_3_2 = {\n\t\"OpenGL 3.2\",\n\tOGLInit<true,true>,\n\tOGLReset,\n\tOGLClose,\n\tOGLRender,\n\tOGLRenderFinish,\n\tOGLVramReconfigureSignal\n};\n\nOpenGLRenderer::OpenGLRenderer()\n{\n\tversionMajor = 0;\n\tversionMinor = 0;\n\tversionRevision = 0;\n}\n\nbool OpenGLRenderer::IsExtensionPresent(const std::set<std::string> *oglExtensionSet, const std::string extensionName) const\n{\n\tif (oglExtensionSet == NULL || oglExtensionSet->size() == 0)\n\t{\n\t\treturn false;\n\t}\n\t\n\treturn (oglExtensionSet->find(extensionName) != oglExtensionSet->end());\n}\n\nbool OpenGLRenderer::ValidateShaderCompile(GLuint theShader) const\n{\n\tbool isCompileValid = false;\n\tGLint status = GL_FALSE;\n\t\n\tglGetShaderiv(theShader, GL_COMPILE_STATUS, &status);\n\tif(status == GL_TRUE)\n\t{\n\t\tisCompileValid = true;\n\t}\n\telse\n\t{\n\t\tGLint logSize;\n\t\tGLchar *log = NULL;\n\t\t\n\t\tglGetShaderiv(theShader, GL_INFO_LOG_LENGTH, &logSize);\n\t\tlog = new GLchar[logSize];\n\t\tglGetShaderInfoLog(theShader, logSize, &logSize, log);\n\t\t\n\t\tINFO(\"OpenGL: SEVERE - FAILED TO COMPILE SHADER : %s\\n\", log);\n\t\tdelete[] log;\n\t}\n\t\n\treturn isCompileValid;\n}\n\nbool OpenGLRenderer::ValidateShaderProgramLink(GLuint theProgram) const\n{\n\tbool isLinkValid = false;\n\tGLint status = GL_FALSE;\n\t\n\tglGetProgramiv(theProgram, GL_LINK_STATUS, &status);\n\tif(status == GL_TRUE)\n\t{\n\t\tisLinkValid = true;\n\t}\n\telse\n\t{\n\t\tGLint logSize;\n\t\tGLchar *log = NULL;\n\t\t\n\t\tglGetProgramiv(theProgram, GL_INFO_LOG_LENGTH, &logSize);\n\t\tlog = new GLchar[logSize];\n\t\tglGetProgramInfoLog(theProgram, logSize, &logSize, log);\n\t\t\n\t\tINFO(\"OpenGL: SEVERE - FAILED TO LINK SHADER PROGRAM : %s\\n\", log);\n\t\tdelete[] log;\n\t}\n\t\n\treturn isLinkValid;\n}\n\nvoid OpenGLRenderer::GetVersion(unsigned int *major, unsigned int *minor, unsigned int *revision) const\n{\n\t*major = this->versionMajor;\n\t*minor = this->versionMinor;\n\t*revision = this->versionRevision;\n}\n\nvoid OpenGLRenderer::SetVersion(unsigned int major, unsigned int minor, unsigned int revision)\n{\n\tthis->versionMajor = major;\n\tthis->versionMinor = minor;\n\tthis->versionRevision = revision;\n}\n\nvoid OpenGLRenderer::ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer)\n{\n\tif (srcBuffer == NULL || dstBuffer == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\t// Convert from 32-bit BGRA8888 format to 32-bit RGBA6665 reversed format. OpenGL\n\t// stores pixels using a flipped Y-coordinate, so this needs to be flipped back\n\t// to the DS Y-coordinate.\n\tfor(int i = 0, y = 191; y >= 0; y--)\n\t{\n\t\tu32 *__restrict dst = dstBuffer + (y << 8); // Same as dstBuffer + (y * 256)\n\t\t\n\t\tfor(unsigned int x = 0; x < 256; x++, i++)\n\t\t{\n\t\t\t// Use the correct endian format since OpenGL uses the native endian of\n\t\t\t// the architecture it is running on.\n#ifdef WORDS_BIGENDIAN\n\t\t\t*dst++ = BGRA8888_32_To_RGBA6665_32(srcBuffer[i]);\n#else\n\t\t\t*dst++ = BGRA8888_32Rev_To_RGBA6665_32Rev(srcBuffer[i]);\n#endif\n\t\t}\n\t}\n}\n\nOpenGLRenderer_1_2::OpenGLRenderer_1_2()\n{\n\tisVBOSupported = false;\n\tisPBOSupported = false;\n\tisFBOSupported = false;\n\tisMultisampledFBOSupported = false;\n\tisShaderSupported = false;\n\tisVAOSupported = false;\n\t\n\t// Init OpenGL rendering states\n\tref = new OGLRenderRef;\n}\n\nOpenGLRenderer_1_2::~OpenGLRenderer_1_2()\n{\n\tif (ref == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\tglFinish();\n\t\n\tgpuScreen3DHasNewData[0] = false;\n\tgpuScreen3DHasNewData[1] = false;\n\t\n\tdelete [] ref->color4fBuffer;\n\tref->color4fBuffer = NULL;\n\t\n\tDestroyShaders();\n\tDestroyVAOs();\n\tDestroyVBOs();\n\tDestroyPBOs();\n\tDestroyFBOs();\n\tDestroyMultisampledFBO();\n\t\n\t//kill the tex cache to free all the texture ids\n\tTexCache_Reset();\n\t\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\t\n\twhile(!ref->freeTextureIDs.empty())\n\t{\n\t\tGLuint temp = ref->freeTextureIDs.front();\n\t\tref->freeTextureIDs.pop();\n\t\tglDeleteTextures(1, &temp);\n\t}\n\t\n\tglFinish();\n\t\n\t// Destroy OpenGL rendering states\n\tdelete ref;\n\tref = NULL;\n}\n\nRender3DError OpenGLRenderer_1_2::InitExtensions()\n{\n\tRender3DError error = OGLERROR_NOERR;\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// Get OpenGL extensions\n\tstd::set<std::string> oglExtensionSet;\n\tthis->GetExtensionSet(&oglExtensionSet);\n\t\n\t// Initialize OpenGL\n\tthis->InitTables();\n\t\n\tthis->isShaderSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_shader_objects\") &&\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_vertex_shader\") &&\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_fragment_shader\") &&\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_vertex_program\");\n\t\n\tif (this->isShaderSupported)\n\t{\n\t\tstd::string vertexShaderProgram;\n\t\tstd::string fragmentShaderProgram;\n\t\t\n\t\terror = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram);\n\t\tif (error == OGLERROR_NOERR)\n\t\t{\n\t\t\terror = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram);\n\t\t\tif (error != OGLERROR_NOERR)\n\t\t\t{\n\t\t\t\tthis->isShaderSupported = false;\n\t\t\t\t\n\t\t\t\tif (error == OGLERROR_SHADER_CREATE_ERROR)\n\t\t\t\t{\n\t\t\t\t\treturn error;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis->CreateToonTable();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis->isShaderSupported = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\tINFO(\"OpenGL: Shaders are unsupported. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\\n\");\n\t}\n\t\n\tthis->isVBOSupported = this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_vertex_buffer_object\");\n\tif (this->isVBOSupported)\n\t{\n\t\tthis->CreateVBOs();\n\t}\n\t\n#if\t!defined(GL_ARB_pixel_buffer_object) && !defined(GL_EXT_pixel_buffer_object)\n\tthis->isPBOSupported = false;\n#else\n\tthis->isPBOSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_vertex_buffer_object\") &&\n\t\t\t\t\t\t\t (this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_pixel_buffer_object\") ||\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_pixel_buffer_object\"));\n#endif\n\tif (this->isPBOSupported)\n\t{\n\t\tthis->CreatePBOs();\n\t}\n\t\n#if !defined(GL_ARB_vertex_array_object) && !defined(GL_APPLE_vertex_array_object)\n\tthis->isVAOSupported = false;\n#else\n\tthis->isVAOSupported\t= this->isShaderSupported &&\n\t\t\t\t\t\t\t  this->isVBOSupported &&\n\t\t\t\t\t\t\t (this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_vertex_array_object\") ||\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_APPLE_vertex_array_object\"));\n#endif\n\tif (this->isVAOSupported)\n\t{\n\t\tthis->CreateVAOs();\n\t}\n\t\n\t// Don't use ARB versions since we're using the EXT versions for backwards compatibility.\n#if\t!defined(GL_EXT_framebuffer_object)\t\t|| \\\n\t!defined(GL_EXT_framebuffer_blit)\t\t|| \\\n\t!defined(GL_EXT_packed_depth_stencil)\n\t\n\tthis->isFBOSupported = false;\n#else\n\tthis->isFBOSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_object\") &&\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_blit\") &&\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_packed_depth_stencil\");\n#endif\n\tif (this->isFBOSupported)\n\t{\n\t\terror = this->CreateFBOs();\n\t\tif (error != OGLERROR_NOERR)\n\t\t{\n\t\t\tOGLRef.fboFinalOutputID = 0;\n\t\t\tthis->isFBOSupported = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\tOGLRef.fboFinalOutputID = 0;\n\t\tINFO(\"OpenGL: FBOs are unsupported. Some emulation features will be disabled.\\n\");\n\t}\n\t\n\t// Don't use ARB versions since we're using the EXT versions for backwards compatibility.\n#if\t!defined(GL_EXT_framebuffer_object)\t\t\t|| \\\n\t!defined(GL_EXT_framebuffer_multisample)\t|| \\\n\t!defined(GL_EXT_framebuffer_blit)\t\t\t|| \\\n\t!defined(GL_EXT_packed_depth_stencil)\n\t\n\tthis->isMultisampledFBOSupported = false;\n#else\n\tthis->isMultisampledFBOSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_object\") &&\n\t\t\t\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_blit\") &&\n\t\t\t\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_packed_depth_stencil\") &&\n\t\t\t\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_multisample\");\n#endif\n\tif (this->isMultisampledFBOSupported)\n\t{\n\t\terror = this->CreateMultisampledFBO();\n\t\tif (error != OGLERROR_NOERR)\n\t\t{\n\t\t\tOGLRef.selectedRenderingFBO = 0;\n\t\t\tthis->isMultisampledFBOSupported = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\tOGLRef.selectedRenderingFBO = 0;\n\t\tINFO(\"OpenGL: Multisampled FBOs are unsupported. Multisample antialiasing will be disabled.\\n\");\n\t}\n\t\n\tthis->InitTextures();\n\tthis->InitFinalRenderStates(&oglExtensionSet); // This must be done last\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::CreateVBOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenBuffersARB(1, &OGLRef.vboVertexID);\n\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID);\n\tglBufferDataARB(GL_ARRAY_BUFFER_ARB, VERTLIST_SIZE * sizeof(VERT), NULL, GL_STREAM_DRAW_ARB);\n\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);\n\t\n\tglGenBuffersARB(1, &OGLRef.iboIndexID);\n\tglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID);\n\tglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort), NULL, GL_STREAM_DRAW_ARB);\n\tglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_2::DestroyVBOs()\n{\n\tif (!this->isVBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);\n\tglDeleteBuffersARB(1, &OGLRef.vboVertexID);\n\t\n\tglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);\n\tglDeleteBuffersARB(1, &OGLRef.iboIndexID);\n\t\n\tthis->isVBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_2::CreatePBOs()\n{\n\tglGenBuffersARB(2, this->ref->pboRenderDataID);\n\tfor (unsigned int i = 0; i < 2; i++)\n\t{\n\t\tglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]);\n\t\tglBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, 256 * 192 * sizeof(u32), NULL, GL_STREAM_READ_ARB);\n\t}\n\t\n\tglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_2::DestroyPBOs()\n{\n\tif (!this->isPBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\tglDeleteBuffersARB(2, this->ref->pboRenderDataID);\n\t\n\tthis->isPBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_2::LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram)\n{\n\toutVertexShaderProgram->clear();\n\toutFragmentShaderProgram->clear();\n\t\n\t//not only does this hardware not work, it flat-out freezes the system.\n\t//the problem is due to writing gl_FragDepth (it seems theres no way to successfully use it)\n\t//so, we disable that feature. it still works pretty well.\n\tif(isIntel965)\n\t\t*outFragmentShaderProgram = std::string(\"#define WANT_DEPTHLOGIC\\n\");\n\t\n\t*outVertexShaderProgram += std::string(vertexShader_100);\n\t*outFragmentShaderProgram += std::string(fragmentShader_100);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::SetupShaderIO()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Position, \"inPosition\");\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_TexCoord0, \"inTexCoord0\");\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Color, \"inColor\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tOGLRef.vertexShaderID = glCreateShader(GL_VERTEX_SHADER);\n\tif(!OGLRef.vertexShaderID)\n\t{\n\t\tINFO(\"OpenGL: Failed to create the vertex shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\\n\");\t\t\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tconst char *vertexShaderProgramChar = vertexShaderProgram->c_str();\n\tglShaderSource(OGLRef.vertexShaderID, 1, (const GLchar **)&vertexShaderProgramChar, NULL);\n\tglCompileShader(OGLRef.vertexShaderID);\n\tif (!this->ValidateShaderCompile(OGLRef.vertexShaderID))\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tINFO(\"OpenGL: Failed to compile the vertex shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tOGLRef.fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);\n\tif(!OGLRef.fragmentShaderID)\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tINFO(\"OpenGL: Failed to create the fragment shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tconst char *fragmentShaderProgramChar = fragmentShaderProgram->c_str();\n\tglShaderSource(OGLRef.fragmentShaderID, 1, (const GLchar **)&fragmentShaderProgramChar, NULL);\n\tglCompileShader(OGLRef.fragmentShaderID);\n\tif (!this->ValidateShaderCompile(OGLRef.fragmentShaderID))\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\tINFO(\"OpenGL: Failed to compile the fragment shader. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tOGLRef.shaderProgram = glCreateProgram();\n\tif(!OGLRef.shaderProgram)\n\t{\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\tINFO(\"OpenGL: Failed to create the shader program. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tglAttachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID);\n\tglAttachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID);\n\t\n\tthis->SetupShaderIO();\n\t\n\tglLinkProgram(OGLRef.shaderProgram);\n\tif (!this->ValidateShaderProgramLink(OGLRef.shaderProgram))\n\t{\n\t\tglDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID);\n\t\tglDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID);\n\t\tglDeleteProgram(OGLRef.shaderProgram);\n\t\tglDeleteShader(OGLRef.vertexShaderID);\n\t\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\tINFO(\"OpenGL: Failed to link the shader program. Disabling shaders and using fixed-function pipeline. Some emulation features will be disabled.\\n\");\n\t\treturn OGLERROR_SHADER_CREATE_ERROR;\n\t}\n\t\n\tglValidateProgram(OGLRef.shaderProgram);\n\tglUseProgram(OGLRef.shaderProgram);\n\t\n\t// Set up shader uniforms\n\tGLint uniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, \"texMainRender\");\n\tglUniform1i(uniformTexSampler, 0);\n\t\n\tuniformTexSampler = glGetUniformLocation(OGLRef.shaderProgram, \"texToonTable\");\n\tglUniform1i(uniformTexSampler, OGLTextureUnitID_ToonTable);\n\t\n\tOGLRef.uniformPolyAlpha\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"polyAlpha\");\n\tOGLRef.uniformTexScale\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"texScale\");\n\tOGLRef.uniformPolyID\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"polyID\");\n\tOGLRef.uniformHasTexture\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"hasTexture\");\n\tOGLRef.uniformPolygonMode\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"polygonMode\");\n\tOGLRef.uniformToonShadingMode\t= glGetUniformLocation(OGLRef.shaderProgram, \"toonShadingMode\");\n\tOGLRef.uniformWBuffer\t\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"oglWBuffer\");\n\tOGLRef.uniformEnableAlphaTest\t= glGetUniformLocation(OGLRef.shaderProgram, \"enableAlphaTest\");\n\tOGLRef.uniformAlphaTestRef\t\t= glGetUniformLocation(OGLRef.shaderProgram, \"alphaTestRef\");\n\t\n\tINFO(\"OpenGL: Successfully created shaders.\\n\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_2::DestroyShaders()\n{\n\tif(!this->isShaderSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglUseProgram(0);\n\t\n\tglDetachShader(OGLRef.shaderProgram, OGLRef.vertexShaderID);\n\tglDetachShader(OGLRef.shaderProgram, OGLRef.fragmentShaderID);\n\t\n\tglDeleteProgram(OGLRef.shaderProgram);\n\tglDeleteShader(OGLRef.vertexShaderID);\n\tglDeleteShader(OGLRef.fragmentShaderID);\n\t\n\tthis->DestroyToonTable();\n\t\n\tthis->isShaderSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_2::CreateVAOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenVertexArrays(1, &OGLRef.vaoMainStatesID);\n\tglBindVertexArray(OGLRef.vaoMainStatesID);\n\t\n\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID);\n\tglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID);\n\t\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\n\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t\n\tglBindVertexArray(0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_2::DestroyVAOs()\n{\n\tif (!this->isVAOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tglBindVertexArray(0);\n\tglDeleteVertexArrays(1, &this->ref->vaoMainStatesID);\n\t\n\tthis->isVAOSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_2::CreateFBOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// Set up FBO render targets\n\tthis->CreateClearImage();\n\t\n\t// Set up FBOs\n\tglGenFramebuffersEXT(1, &OGLRef.fboClearImageID);\n\t\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboClearImageID);\n\tglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, OGLRef.texClearImageColorID, 0);\n\tglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0);\n\tglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0);\n\t\n\tif (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)\n\t{\n\t\tINFO(\"OpenGL: Failed to created FBOs. Some emulation features will be disabled.\\n\");\n\t\t\n\t\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);\n\t\tglDeleteFramebuffersEXT(1, &OGLRef.fboClearImageID);\n\t\tthis->DestroyClearImage();\n\t\t\n\t\tthis->isFBOSupported = false;\n\t\treturn OGLERROR_FBO_CREATE_ERROR;\n\t}\n\t\n\t// Set up final output FBO\n\tOGLRef.fboFinalOutputID = 0;\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID);\n\t\n\tINFO(\"OpenGL: Successfully created FBOs.\\n\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_2::DestroyFBOs()\n{\n\tif (!this->isFBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);\n\tglDeleteFramebuffersEXT(1, &OGLRef.fboClearImageID);\n\tthis->DestroyClearImage();\n\tthis->isFBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_2::CreateMultisampledFBO()\n{\n\t// Check the maximum number of samples that the driver supports and use that.\n\t// Since our target resolution is only 256x192 pixels, using the most samples\n\t// possible is the best thing to do.\n\tGLint maxSamples = 0;\n\tglGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples);\n\t\n\tif (maxSamples < 2)\n\t{\n\t\tINFO(\"OpenGL: Driver does not support at least 2x multisampled FBOs. Multisample antialiasing will be disabled.\\n\");\n\t\treturn OGLERROR_FEATURE_UNSUPPORTED;\n\t}\n\telse if (maxSamples > OGLRENDER_MAX_MULTISAMPLES)\n\t{\n\t\tmaxSamples = OGLRENDER_MAX_MULTISAMPLES;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// Set up FBO render targets\n\tglGenRenderbuffersEXT(1, &OGLRef.rboMultisampleColorID);\n\tglGenRenderbuffersEXT(1, &OGLRef.rboMultisampleDepthStencilID);\n\t\n\tglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleColorID);\n\tglRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamples, GL_RGBA, 256, 192);\n\tglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleDepthStencilID);\n\tglRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamples, GL_DEPTH24_STENCIL8_EXT, 256, 192);\n\t\n\t// Set up multisampled rendering FBO\n\tglGenFramebuffersEXT(1, &OGLRef.fboMultisampleRenderID);\n\t\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboMultisampleRenderID);\n\tglFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleColorID);\n\tglFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleDepthStencilID);\n\tglFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, OGLRef.rboMultisampleDepthStencilID);\n\t\n\tif (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)\n\t{\n\t\tINFO(\"OpenGL: Failed to create multisampled FBO. Multisample antialiasing will be disabled.\\n\");\n\t\t\n\t\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);\n\t\tglDeleteFramebuffersEXT(1, &OGLRef.fboMultisampleRenderID);\n\t\tglDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleColorID);\n\t\tglDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleDepthStencilID);\n\t\t\n\t\treturn OGLERROR_FBO_CREATE_ERROR;\n\t}\n\t\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID);\n\tINFO(\"OpenGL: Successfully created multisampled FBO.\\n\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_2::DestroyMultisampledFBO()\n{\n\tif (!this->isMultisampledFBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);\n\tglDeleteFramebuffersEXT(1, &OGLRef.fboMultisampleRenderID);\n\tglDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleColorID);\n\tglDeleteRenderbuffersEXT(1, &OGLRef.rboMultisampleDepthStencilID);\n\t\n\tthis->isMultisampledFBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_2::InitFinalRenderStates(const std::set<std::string> *oglExtensionSet)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tbool isTexMirroredRepeatSupported = this->IsExtensionPresent(oglExtensionSet, \"GL_ARB_texture_mirrored_repeat\");\n\tbool isBlendFuncSeparateSupported = this->IsExtensionPresent(oglExtensionSet, \"GL_EXT_blend_func_separate\");\n\tbool isBlendEquationSeparateSupported = this->IsExtensionPresent(oglExtensionSet, \"GL_EXT_blend_equation_separate\");\n\t\n\t// Blending Support\n\tif (isBlendFuncSeparateSupported)\n\t{\n\t\tif (isBlendEquationSeparateSupported)\n\t\t{\n\t\t\t// we want to use alpha destination blending so we can track the last-rendered alpha value\n\t\t\t// test: new super mario brothers renders the stormclouds at the beginning\n\t\t\tglBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA);\n\t\t\tglBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_DST_ALPHA);\n\t\t}\n\t}\n\telse\n\t{\n\t\tglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\t}\n\t\n\t// Mirrored Repeat Mode Support\n\tOGLRef.stateTexMirroredRepeat = isTexMirroredRepeatSupported ? GL_MIRRORED_REPEAT : GL_REPEAT;\n\t\n\t// Always enable depth test, and control using glDepthMask().\n\tglEnable(GL_DEPTH_TEST);\n\t\n\t// Map the vertex list's colors with 4 floats per color. This is being done\n\t// because OpenGL needs 4-colors per vertex to support translucency. (The DS\n\t// uses 3-colors per vertex, and adds alpha through the poly, so we can't\n\t// simply reference the colors+alpha from just the vertices by themselves.)\n\tOGLRef.color4fBuffer = this->isShaderSupported ? NULL : new GLfloat[VERTLIST_SIZE * 4];\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::InitTextures()\n{\n\tthis->ExpandFreeTextures();\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::InitTables()\n{\n\tstatic bool needTableInit = true;\n\t\n\tif (needTableInit)\n\t{\n\t\tfor (unsigned int i = 0; i < 256; i++)\n\t\t\tmaterial_8bit_to_float[i] = (GLfloat)(i * 4) / 255.0f;\n\t\t\n\t\tfor (unsigned int i = 0; i < 32768; i++)\n\t\t\tdsDepthToD24S8_LUT[i] = (GLuint)DS_DEPTH15TO24(i) << 8;\n\t\t\n\t\tneedTableInit = false;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::CreateToonTable()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// The toon table is a special 1D texture where each pixel corresponds\n\t// to a specific color in the toon table.\n\tglGenTextures(1, &OGLRef.texToonTableID);\n\tglActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ToonTable);\n\t\n\tglBindTexture(GL_TEXTURE_1D, OGLRef.texToonTableID);\n\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglBindTexture(GL_TEXTURE_1D, 0);\n\t\n\tglActiveTextureARB(GL_TEXTURE0_ARB);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::DestroyToonTable()\n{\n\tglActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ToonTable);\n\tglBindTexture(GL_TEXTURE_1D, 0);\n\tglActiveTextureARB(GL_TEXTURE0_ARB);\n\tglDeleteTextures(1, &this->ref->texToonTableID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::UploadToonTable(const GLushort *toonTableBuffer)\n{\n\tglActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ToonTable);\n\tglBindTexture(GL_TEXTURE_1D, this->ref->texToonTableID);\n\tglTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, toonTableBuffer);\n\tglActiveTextureARB(GL_TEXTURE0_ARB);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::CreateClearImage()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenTextures(1, &OGLRef.texClearImageColorID);\n\tglGenTextures(1, &OGLRef.texClearImageDepthStencilID);\n\t\n\tglActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ClearImage);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, 256, 192, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);\n\t\n\tglActiveTextureARB(GL_TEXTURE0_ARB);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::DestroyClearImage()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ClearImage);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\tglActiveTextureARB(GL_TEXTURE0_ARB);\n\tglDeleteTextures(1, &OGLRef.texClearImageColorID);\n\tglDeleteTextures(1, &OGLRef.texClearImageDepthStencilID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglActiveTextureARB(GL_TEXTURE0_ARB + OGLTextureUnitID_ClearImage);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID);\n\tglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, clearImageColorBuffer);\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID);\n\tglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, clearImageDepthBuffer);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\t\n\tglActiveTextureARB(GL_TEXTURE0_ARB);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_2::GetExtensionSet(std::set<std::string> *oglExtensionSet)\n{\n\tstd::string oglExtensionString = std::string((const char *)glGetString(GL_EXTENSIONS));\n\t\n\tsize_t extStringStartLoc = 0;\n\tsize_t delimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc);\n\twhile (delimiterLoc != std::string::npos)\n\t{\n\t\tstd::string extensionName = oglExtensionString.substr(extStringStartLoc, delimiterLoc - extStringStartLoc);\n\t\toglExtensionSet->insert(extensionName);\n\t\t\n\t\textStringStartLoc = delimiterLoc + 1;\n\t\tdelimiterLoc = oglExtensionString.find_first_of(' ', extStringStartLoc);\n\t}\n\t\n\tif (extStringStartLoc - oglExtensionString.length() > 0)\n\t{\n\t\tstd::string extensionName = oglExtensionString.substr(extStringStartLoc, oglExtensionString.length() - extStringStartLoc);\n\t\toglExtensionSet->insert(extensionName);\n\t}\n}\n\nRender3DError OpenGLRenderer_1_2::ExpandFreeTextures()\n{\n\tstatic const int kInitTextures = 128;\n\tGLuint oglTempTextureID[kInitTextures];\n\tglGenTextures(kInitTextures, oglTempTextureID);\n\t\n\tfor(int i=0;i<kInitTextures;i++)\n\t{\n\t\tthis->ref->freeTextureIDs.push(oglTempTextureID[i]);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tconst unsigned int polyCount = polyList->count;\n\tunsigned int vertIndexCount = 0;\n\t\n\tfor(unsigned int i = 0; i < polyCount; i++)\n\t{\n\t\tconst POLY *poly = &polyList->list[indexList->list[i]];\n\t\tconst unsigned int polyType = poly->type;\n\t\t\n\t\tif (this->isShaderSupported)\n\t\t{\n\t\t\tfor(unsigned int j = 0; j < polyType; j++)\n\t\t\t{\n\t\t\t\tconst GLushort vertIndex = poly->vertIndexes[j];\n\t\t\t\t\n\t\t\t\t// While we're looping through our vertices, add each vertex index to\n\t\t\t\t// a buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional\n\t\t\t\t// vertices here to convert them to GL_TRIANGLES, which are much easier\n\t\t\t\t// to work with and won't be deprecated in future OpenGL versions.\n\t\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\t\tif (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP)\n\t\t\t\t{\n\t\t\t\t\tif (j == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\t\t\t}\n\t\t\t\t\telse if (j == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\toutIndexBuffer[vertIndexCount++] = poly->vertIndexes[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst GLfloat thePolyAlpha = (!poly->isWireframe() && poly->isTranslucent()) ? divide5bitBy31_LUT[poly->getAttributeAlpha()] : 1.0f;\n\t\t\t\n\t\t\tfor(unsigned int j = 0; j < polyType; j++)\n\t\t\t{\n\t\t\t\tconst GLushort vertIndex = poly->vertIndexes[j];\n\t\t\t\tconst GLushort colorIndex = vertIndex * 4;\n\t\t\t\t\n\t\t\t\t// Consolidate the vertex color and the poly alpha to our internal color buffer\n\t\t\t\t// so that OpenGL can use it.\n\t\t\t\tconst VERT *vert = &vertList->list[vertIndex];\n\t\t\t\tOGLRef.color4fBuffer[colorIndex+0] = material_8bit_to_float[vert->color[0]];\n\t\t\t\tOGLRef.color4fBuffer[colorIndex+1] = material_8bit_to_float[vert->color[1]];\n\t\t\t\tOGLRef.color4fBuffer[colorIndex+2] = material_8bit_to_float[vert->color[2]];\n\t\t\t\tOGLRef.color4fBuffer[colorIndex+3] = thePolyAlpha;\n\t\t\t\t\n\t\t\t\t// While we're looping through our vertices, add each vertex index to a\n\t\t\t\t// buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional\n\t\t\t\t// vertices here to convert them to GL_TRIANGLES, which are much easier\n\t\t\t\t// to work with and won't be deprecated in future OpenGL versions.\n\t\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\t\tif (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP)\n\t\t\t\t{\n\t\t\t\t\tif (j == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\t\t\t}\n\t\t\t\t\telse if (j == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\toutIndexBuffer[vertIndexCount++] = poly->vertIndexes[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t*outIndexCount = vertIndexCount;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArray(OGLRef.vaoMainStatesID);\n\t\tglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList);\n\t\tglBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t}\n\telse\n\t{\n\t\tif (this->isShaderSupported)\n\t\t{\n\t\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\t\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t\t\n\t\t\tif (this->isVBOSupported)\n\t\t\t{\n\t\t\t\tglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID);\n\t\t\t\tglBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), OGLRef.vertIndexBuffer);\n\t\t\t\t\n\t\t\t\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID);\n\t\t\t\tglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList);\n\t\t\t\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\t\t\t\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\t\t\t\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), &vertList->list[0].coord);\n\t\t\t\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), &vertList->list[0].texcoord);\n\t\t\t\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), &vertList->list[0].color);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglEnableClientState(GL_TEXTURE_COORD_ARRAY);\n\t\t\tglEnableClientState(GL_COLOR_ARRAY);\n\t\t\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\t\t\n\t\t\tif (this->isVBOSupported)\n\t\t\t{\n\t\t\t\tglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, OGLRef.iboIndexID);\n\t\t\t\tglBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, vertIndexCount * sizeof(GLushort), OGLRef.vertIndexBuffer);\n\t\t\t\t\n\t\t\t\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);\n\t\t\t\tglColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer);\n\t\t\t\t\n\t\t\t\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, OGLRef.vboVertexID);\n\t\t\t\tglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(VERT) * vertList->count, vertList);\n\t\t\t\tglVertexPointer(4, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\t\t\t\tglTexCoordPointer(2, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tglVertexPointer(4, GL_FLOAT, sizeof(VERT), &vertList->list[0].coord);\n\t\t\t\tglTexCoordPointer(2, GL_FLOAT, sizeof(VERT), &vertList->list[0].texcoord);\n\t\t\t\tglColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::DisableVertexAttributes()\n{\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArray(0);\n\t}\n\telse\n\t{\n\t\tif (this->isShaderSupported)\n\t\t{\n\t\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\t\tglDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglDisableClientState(GL_VERTEX_ARRAY);\n\t\t\tglDisableClientState(GL_COLOR_ARRAY);\n\t\t\tglDisableClientState(GL_TEXTURE_COORD_ARRAY);\n\t\t}\n\t\t\n\t\tif (this->isVBOSupported)\n\t\t{\n\t\t\tglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);\n\t\t\tglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);\n\t\t}\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::SelectRenderingFramebuffer()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isMultisampledFBOSupported)\n\t{\n\t\tOGLRef.selectedRenderingFBO = CommonSettings.GFX3D_Renderer_Multisample ? OGLRef.fboMultisampleRenderID : OGLRef.fboFinalOutputID;\n\t\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::DownsampleFBO()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (!this->isMultisampledFBOSupported || OGLRef.selectedRenderingFBO != OGLRef.fboMultisampleRenderID)\n\t{\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\tglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO);\n\tglBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID);\n\tglBlitFramebufferEXT(0, 0, 256, 192, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT, GL_NEAREST);\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboFinalOutputID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::ReadBackPixels()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tif (this->isPBOSupported)\n\t{\n\t\tthis->DownsampleFBO();\n\t\t\n\t\tglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]);\n\t\tglReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, 0);\n\t\tglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\t}\n\t\n\tthis->gpuScreen3DHasNewData[i] = true;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::DeleteTexture(const TexCacheItem *item)\n{\n\tthis->ref->freeTextureIDs.push((GLuint)item->texid);\n\tif(this->currTexture == item)\n\t{\n\t\tthis->currTexture = NULL;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::BeginRender(const GFX3D_State *renderState)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tthis->doubleBufferIndex = (this->doubleBufferIndex + 1) & 0x01;\n\t\n\tthis->SelectRenderingFramebuffer();\n\t\n\tif (this->isShaderSupported)\n\t{\n\t\tglUniform1i(OGLRef.uniformEnableAlphaTest, renderState->enableAlphaTest ? GL_TRUE : GL_FALSE);\n\t\tglUniform1f(OGLRef.uniformAlphaTestRef, divide5bitBy31_LUT[renderState->alphaTestRef]);\n\t\tglUniform1i(OGLRef.uniformToonShadingMode, renderState->shading);\n\t\tglUniform1i(OGLRef.uniformWBuffer, renderState->wbuffer);\n\t}\n\telse\n\t{\n\t\tif(renderState->enableAlphaTest && (renderState->alphaTestRef > 0))\n\t\t{\n\t\t\tglAlphaFunc(GL_GEQUAL, divide5bitBy31_LUT[renderState->alphaTestRef]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglAlphaFunc(GL_GREATER, 0);\n\t\t}\n\t}\n\t\n\tif(renderState->enableAlphaBlending)\n\t{\n\t\tglEnable(GL_BLEND);\n\t}\n\telse\n\t{\n\t\tglDisable(GL_BLEND);\n\t}\n\t\n\tglDepthMask(GL_TRUE);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tunsigned int vertIndexCount = 0;\n\t\n\tif (!this->isShaderSupported)\n\t{\n\t\tglMatrixMode(GL_PROJECTION);\n\t\tglLoadIdentity();\n\t}\n\t\n\tthis->SetupVertices(vertList, polyList, indexList, OGLRef.vertIndexBuffer, &vertIndexCount);\n\tthis->EnableVertexAttributes(vertList, OGLRef.vertIndexBuffer, vertIndexCount);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tu32 lastTexParams = 0;\n\tu32 lastTexPalette = 0;\n\tu32 lastPolyAttr = 0;\n\tu32 lastViewport = 0xFFFFFFFF;\n\tconst unsigned int polyCount = polyList->count;\n\tGLushort *indexBufferPtr = this->isVBOSupported ? 0 : OGLRef.vertIndexBuffer;\n\t\n\t// Map GFX3D_QUADS and GFX3D_QUAD_STRIP to GL_TRIANGLES since we will convert them.\n\t//\n\t// Also map GFX3D_TRIANGLE_STRIP to GL_TRIANGLES. This is okay since this is actually\n\t// how the POLY struct stores triangle strip vertices, which is in sets of 3 vertices\n\t// each. This redefinition is necessary since uploading more than 3 indices at a time\n\t// will cause glDrawElements() to draw the triangle strip incorrectly.\n\tstatic const GLenum oglPrimitiveType[]\t= {GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES,\n\t\t\t\t\t\t\t\t\t\t\t   GL_LINE_LOOP, GL_LINE_LOOP, GL_LINE_STRIP, GL_LINE_STRIP};\n\t\n\tstatic const unsigned int indexIncrementLUT[] = {3, 6, 3, 6, 3, 4, 3, 4};\n\t\n\tfor(unsigned int i = 0; i < polyCount; i++)\n\t{\n\t\tconst POLY *poly = &polyList->list[indexList->list[i]];\n\t\t\n\t\t// Set up the polygon if it changed\n\t\tif(lastPolyAttr != poly->polyAttr || i == 0)\n\t\t{\n\t\t\tlastPolyAttr = poly->polyAttr;\n\t\t\tthis->SetupPolygon(poly);\n\t\t}\n\t\t\n\t\t// Set up the texture if it changed\n\t\tif(lastTexParams != poly->texParam || lastTexPalette != poly->texPalette || i == 0)\n\t\t{\n\t\t\tlastTexParams = poly->texParam;\n\t\t\tlastTexPalette = poly->texPalette;\n\t\t\tthis->SetupTexture(poly, renderState->enableTexturing);\n\t\t}\n\t\t\n\t\t// Set up the viewport if it changed\n\t\tif(lastViewport != poly->viewport || i == 0)\n\t\t{\n\t\t\tlastViewport = poly->viewport;\n\t\t\tthis->SetupViewport(poly);\n\t\t}\n\t\t\n\t\t// In wireframe mode, redefine all primitives as GL_LINE_LOOP rather than\n\t\t// setting the polygon mode to GL_LINE though glPolygonMode(). Not only is\n\t\t// drawing more accurate this way, but it also allows GFX3D_QUADS and\n\t\t// GFX3D_QUAD_STRIP primitives to properly draw as wireframe without the\n\t\t// extra diagonal line.\n\t\tconst GLenum polyPrimitive = !poly->isWireframe() ? oglPrimitiveType[poly->vtxFormat] : GL_LINE_LOOP;\n\t\t\n\t\t// Render the polygon\n\t\tconst unsigned int vertIndexCount = indexIncrementLUT[poly->vtxFormat];\n\t\tglDrawElements(polyPrimitive, vertIndexCount, GL_UNSIGNED_SHORT, indexBufferPtr);\n\t\tindexBufferPtr += vertIndexCount;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::PostRender()\n{\n\tthis->DisableVertexAttributes();\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::EndRender(const u64 frameCount)\n{\n\t//needs to happen before endgl because it could free some textureids for expired cache items\n\tTexCache_EvictFrame();\n\t\n\tthis->ReadBackPixels();\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll)\n{\n\tstatic const size_t pixelsPerLine = 256;\n\tstatic const size_t lineCount = 192;\n\tstatic const size_t totalPixelCount = pixelsPerLine * lineCount;\n\tstatic const size_t bufferSize = totalPixelCount * sizeof(u16);\n\t\n\tstatic CACHE_ALIGN GLushort clearImageColorBuffer[totalPixelCount] = {0};\n\tstatic CACHE_ALIGN GLint clearImageDepthBuffer[totalPixelCount] = {0};\n\tstatic CACHE_ALIGN u16 lastColorBuffer[totalPixelCount] = {0};\n\tstatic CACHE_ALIGN u16 lastDepthBuffer[totalPixelCount] = {0};\n\tstatic u8 lastXScroll = 0;\n\tstatic u8 lastYScroll = 0;\n\t\n\tif (!this->isFBOSupported)\n\t{\n\t\treturn OGLERROR_FEATURE_UNSUPPORTED;\n\t}\n\t\n\tif (lastXScroll != xScroll ||\n\t\tlastYScroll != yScroll ||\n\t\tmemcmp(colorBuffer, lastColorBuffer, bufferSize) ||\n\t\tmemcmp(depthBuffer, lastDepthBuffer, bufferSize) )\n\t{\n\t\tlastXScroll = xScroll;\n\t\tlastYScroll = yScroll;\n\t\tmemcpy(lastColorBuffer, colorBuffer, bufferSize);\n\t\tmemcpy(lastDepthBuffer, depthBuffer, bufferSize);\n\t\t\n\t\tunsigned int dd = totalPixelCount - pixelsPerLine;\n\t\t\n\t\tfor(unsigned int iy = 0; iy < lineCount; iy++)\n\t\t{\n\t\t\tconst unsigned int y = ((iy + yScroll) & 0xFF) << 8;\n\t\t\t\n\t\t\tfor(unsigned int ix = 0; ix < pixelsPerLine; ix++)\n\t\t\t{\n\t\t\t\tconst unsigned int x = (ix + xScroll) & 0xFF;\n\t\t\t\tconst unsigned int adr = y + x;\n\t\t\t\t\n\t\t\t\tclearImageColorBuffer[dd] = colorBuffer[adr];\n\t\t\t\tclearImageDepthBuffer[dd] = dsDepthToD24S8_LUT[depthBuffer[adr] & 0x7FFF] | clearStencil;\n\t\t\t\t\n\t\t\t\tdd++;\n\t\t\t}\n\t\t\t\n\t\t\tdd -= pixelsPerLine * 2;\n\t\t}\n\t\t\n\t\tthis->UploadClearImage(clearImageColorBuffer, clearImageDepthBuffer);\n\t}\n\t\n\tthis->clearImageStencilValue = clearStencil;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::UpdateToonTable(const u16 *toonTableBuffer)\n{\n\t// Update the toon table if it changed.\n\tif (memcmp(this->currentToonTable16, toonTableBuffer, sizeof(this->currentToonTable16)))\n\t{\n\t\tmemcpy(this->currentToonTable16, toonTableBuffer, sizeof(this->currentToonTable16));\n\t\tthis->toonTableNeedsUpdate = true;\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::ClearUsingImage() const\n{\n\tstatic u8 lastClearStencil = 0;\n\t\n\tif (!this->isFBOSupported)\n\t{\n\t\treturn OGLERROR_FEATURE_UNSUPPORTED;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, OGLRef.fboClearImageID);\n\tglBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO);\n\tglBlitFramebufferEXT(0, 0, 256, 192, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);\n\tglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.selectedRenderingFBO);\n\t\n\t// It might seem wasteful to be doing a separate glClear(GL_STENCIL_BUFFER_BIT) instead\n\t// of simply blitting the stencil buffer with everything else.\n\t//\n\t// We do this because glBlitFramebufferEXT() for GL_STENCIL_BUFFER_BIT has been tested\n\t// to be unsupported on ATI/AMD GPUs running in compatibility mode. So we do the separate\n\t// glClear() for GL_STENCIL_BUFFER_BIT to keep these GPUs working.\n\tif (lastClearStencil == this->clearImageStencilValue)\n\t{\n\t\tlastClearStencil = this->clearImageStencilValue;\n\t\tglClearStencil(lastClearStencil);\n\t}\n\t\n\tglClear(GL_STENCIL_BUFFER_BIT);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const\n{\n\tstatic u8 last_r = 0;\n\tstatic u8 last_g = 0;\n\tstatic u8 last_b = 0;\n\tstatic u8 last_a = 0;\n\tstatic u32 lastClearDepth = 0;\n\tstatic u8 lastClearStencil = 0;\n\t\n\tif (r != last_r || g != last_g || b != last_b || a != last_a)\n\t{\n\t\tlast_r = r;\n\t\tlast_g = g;\n\t\tlast_b = b;\n\t\tlast_a = a;\n\t\tglClearColor(divide5bitBy31_LUT[r], divide5bitBy31_LUT[g], divide5bitBy31_LUT[b], divide5bitBy31_LUT[a]);\n\t}\n\t\n\tif (clearDepth != lastClearDepth)\n\t{\n\t\tlastClearDepth = clearDepth;\n\t\tglClearDepth((GLfloat)clearDepth / (GLfloat)0x00FFFFFF);\n\t}\n\t\n\tif (clearStencil != lastClearStencil)\n\t{\n\t\tlastClearStencil = clearStencil;\n\t\tglClearStencil(clearStencil);\n\t}\n\t\n\tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::SetupPolygon(const POLY *thePoly)\n{\n\tstatic unsigned int lastTexBlendMode = 0;\n\tstatic int lastStencilState = -1;\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\tconst PolygonAttributes attr = thePoly->getAttributes();\n\t\n\t// Set up polygon ID\n\tif (this->isShaderSupported)\n\t{\n\t\tglUniform1i(OGLRef.uniformPolyID, attr.polygonID);\n\t}\n\t\n\t// Set up alpha value\n\tif (this->isShaderSupported)\n\t{\n\t\tconst GLfloat thePolyAlpha = (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f;\n\t\tglUniform1f(OGLRef.uniformPolyAlpha, thePolyAlpha);\n\t}\n\t\n\t// Set up depth test mode\n\tstatic const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL};\n\tglDepthFunc(oglDepthFunc[attr.enableDepthTest]);\n\t\n\t// Set up culling mode\n\tstatic const GLenum oglCullingMode[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0};\n\tGLenum cullingMode = oglCullingMode[attr.surfaceCullingMode];\n\t\n\tif (cullingMode == 0)\n\t{\n\t\txglDisable(GL_CULL_FACE);\n\t}\n\telse\n\t{\n\t\txglEnable(GL_CULL_FACE);\n\t\tglCullFace(cullingMode);\n\t}\n\t\n\t// Set up depth write\n\tGLboolean enableDepthWrite = GL_TRUE;\n\t\n\t// Handle shadow polys. Do this after checking for depth write, since shadow polys\n\t// can change this too.\n\tif(attr.polygonMode == 3)\n\t{\n\t\txglEnable(GL_STENCIL_TEST);\n\t\tif(attr.polygonID == 0)\n\t\t{\n\t\t\tenableDepthWrite = GL_FALSE;\n\t\t\tif(lastStencilState != 0)\n\t\t\t{\n\t\t\t\tlastStencilState = 0;\n\t\t\t\t//when the polyID is zero, we are writing the shadow mask.\n\t\t\t\t//set stencilbuf = 1 where the shadow volume is obstructed by geometry.\n\t\t\t\t//do not write color or depth information.\n\t\t\t\tglStencilFunc(GL_ALWAYS, 65, 255);\n\t\t\t\tglStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);\n\t\t\t\tglColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tenableDepthWrite = GL_TRUE;\n\t\t\tif(lastStencilState != 1)\n\t\t\t{\n\t\t\t\tlastStencilState = 1;\n\t\t\t\t//when the polyid is nonzero, we are drawing the shadow poly.\n\t\t\t\t//only draw the shadow poly where the stencilbuf==1.\n\t\t\t\t//I am not sure whether to update the depth buffer here--so I chose not to.\n\t\t\t\tglStencilFunc(GL_EQUAL, 65, 255);\n\t\t\t\tglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);\n\t\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\txglEnable(GL_STENCIL_TEST);\n\t\tif(attr.isTranslucent)\n\t\t{\n\t\t\tlastStencilState = 3;\n\t\t\tglStencilFunc(GL_NOTEQUAL, attr.polygonID, 255);\n\t\t\tglStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);\n\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t}\n\t\telse if(lastStencilState != 2)\n\t\t{\n\t\t\tlastStencilState = 2;\n\t\t\tglStencilFunc(GL_ALWAYS, 64, 255);\n\t\t\tglStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);\n\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t}\n\t}\n\t\n\tif(attr.isTranslucent && !attr.enableAlphaDepthWrite)\n\t{\n\t\tenableDepthWrite = GL_FALSE;\n\t}\n\t\n\tglDepthMask(enableDepthWrite);\n\t\n\t// Set up texture blending mode\n\tif(attr.polygonMode != lastTexBlendMode)\n\t{\n\t\tlastTexBlendMode = attr.polygonMode;\n\t\t\n\t\tif(this->isShaderSupported)\n\t\t{\n\t\t\tglUniform1i(OGLRef.uniformPolygonMode, attr.polygonMode);\n\t\t\t\n\t\t\t// Update the toon table if necessary\n\t\t\tif (this->toonTableNeedsUpdate && attr.polygonMode == 2)\n\t\t\t{\n\t\t\t\tthis->UploadToonTable(this->currentToonTable16);\n\t\t\t\tthis->toonTableNeedsUpdate = false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatic const GLint oglTexBlendMode[4] = {GL_MODULATE, GL_DECAL, GL_MODULATE, GL_MODULATE};\n\t\t\tglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, oglTexBlendMode[attr.polygonMode]);\n\t\t}\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::SetupTexture(const POLY *thePoly, bool enableTexturing)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tconst PolygonTexParams params = thePoly->getTexParams();\n\t\n\t// Check if we need to use textures\n\tif (thePoly->texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing)\n\t{\n\t\tif (this->isShaderSupported)\n\t\t{\n\t\t\tglUniform1i(OGLRef.uniformHasTexture, GL_FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglDisable(GL_TEXTURE_2D);\n\t\t}\n\t\t\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\t// Enable textures if they weren't already enabled\n\tif (this->isShaderSupported)\n\t{\n\t\tglUniform1i(OGLRef.uniformHasTexture, GL_TRUE);\n\t}\n\telse\n\t{\n\t\tglEnable(GL_TEXTURE_2D);\n\t}\n\t\n\t//\ttexCacheUnit.TexCache_SetTexture<TexFormat_32bpp>(format, texpal);\n\tTexCacheItem *newTexture = TexCache_SetTexture(TexFormat_32bpp, thePoly->texParam, thePoly->texPalette);\n\tif(newTexture != this->currTexture)\n\t{\n\t\tthis->currTexture = newTexture;\n\t\t//has the ogl renderer initialized the texture?\n\t\tif(!this->currTexture->deleteCallback)\n\t\t{\n\t\t\tthis->currTexture->deleteCallback = texDeleteCallback;\n\t\t\t\n\t\t\tif(OGLRef.freeTextureIDs.empty())\n\t\t\t{\n\t\t\t\tthis->ExpandFreeTextures();\n\t\t\t}\n\t\t\t\n\t\t\tthis->currTexture->texid = (u64)OGLRef.freeTextureIDs.front();\n\t\t\tOGLRef.freeTextureIDs.pop();\n\t\t\t\n\t\t\tglBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid);\n\t\t\t\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (params.enableRepeatS ? (params.enableMirroredRepeatS ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE));\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (params.enableRepeatT ? (params.enableMirroredRepeatT ? OGLRef.stateTexMirroredRepeat : GL_REPEAT) : GL_CLAMP_TO_EDGE));\n\t\t\t\n\t\t\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,\n\t\t\t\t\t\t this->currTexture->sizeX, this->currTexture->sizeY, 0,\n\t\t\t\t\t\t GL_RGBA, GL_UNSIGNED_BYTE, this->currTexture->decoded);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//otherwise, just bind it\n\t\t\tglBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid);\n\t\t}\n\t\t\n\t\tif (this->isShaderSupported)\n\t\t{\n\t\t\tglUniform2f(OGLRef.uniformTexScale, this->currTexture->invSizeX, this->currTexture->invSizeY);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglMatrixMode(GL_TEXTURE);\n\t\t\tglLoadIdentity();\n\t\t\tglScalef(this->currTexture->invSizeX, this->currTexture->invSizeY, 1.0f);\n\t\t}\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::SetupViewport(const POLY *thePoly)\n{\n\tVIEWPORT viewport;\n\tviewport.decode(thePoly->viewport);\n\tglViewport(viewport.x, viewport.y, viewport.width, viewport.height);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::Reset()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tthis->gpuScreen3DHasNewData[0] = false;\n\tthis->gpuScreen3DHasNewData[1] = false;\n\t\n\tglFinish();\n\t\n\tfor (unsigned int i = 0; i < 2; i++)\n\t{\n\t\tmemset(this->GPU_screen3D[i], 0, sizeof(this->GPU_screen3D[i]));\n\t}\n\t\n\tmemset(currentToonTable16, 0, sizeof(currentToonTable16));\n\tthis->toonTableNeedsUpdate = true;\n\t\n\tif(this->isShaderSupported)\n\t{\n\t\tglUniform1f(OGLRef.uniformPolyAlpha, 1.0f);\n\t\tglUniform2f(OGLRef.uniformTexScale, 1.0f, 1.0f);\n\t\tglUniform1i(OGLRef.uniformPolyID, 0);\n\t\tglUniform1i(OGLRef.uniformHasTexture, GL_FALSE);\n\t\tglUniform1i(OGLRef.uniformPolygonMode, 0);\n\t\tglUniform1i(OGLRef.uniformToonShadingMode, 0);\n\t\tglUniform1i(OGLRef.uniformWBuffer, 0);\n\t\tglUniform1i(OGLRef.uniformEnableAlphaTest, GL_TRUE);\n\t\tglUniform1f(OGLRef.uniformAlphaTestRef, 0.0f);\n\t}\n\telse\n\t{\n\t\tglEnable(GL_NORMALIZE);\n\t\tglEnable(GL_TEXTURE_1D);\n\t\tglEnable(GL_TEXTURE_2D);\n\t\tglAlphaFunc(GL_GREATER, 0);\n\t\tglEnable(GL_ALPHA_TEST);\n\t\t\n\t\tmemset(OGLRef.color4fBuffer, 0, VERTLIST_SIZE * 4 * sizeof(GLfloat));\n\t}\n\t\n\tmemset(OGLRef.vertIndexBuffer, 0, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort));\n\tthis->currTexture = NULL;\n\tthis->doubleBufferIndex = 0;\n\tthis->clearImageStencilValue = 0;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_2::RenderFinish()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tif (!this->gpuScreen3DHasNewData[i])\n\t{\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isPBOSupported)\n\t{\n\t\tglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]);\n\t\t\n\t\tconst u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);\n\t\tif (mappedBufferPtr != NULL)\n\t\t{\n\t\t\tthis->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen);\n\t\t\tglUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);\n\t\t}\n\t\t\n\t\tglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\t}\n\telse\n\t{\n\t\tthis->DownsampleFBO();\n\t\t\n\t\tu32 *__restrict workingBuffer = this->GPU_screen3D[i];\n\t\tglReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, workingBuffer);\n\t\tthis->ConvertFramebuffer(workingBuffer, (u32 *)gfx3d_convertedScreen);\n\t}\n\t\n\tthis->gpuScreen3DHasNewData[i] = false;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_3::CreateToonTable()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// The toon table is a special 1D texture where each pixel corresponds\n\t// to a specific color in the toon table.\n\tglGenTextures(1, &OGLRef.texToonTableID);\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable);\n\t\n\tglBindTexture(GL_TEXTURE_1D, OGLRef.texToonTableID);\n\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglBindTexture(GL_TEXTURE_1D, 0);\n\t\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_3::DestroyToonTable()\n{\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable);\n\tglBindTexture(GL_TEXTURE_1D, 0);\n\tglActiveTexture(GL_TEXTURE0);\n\tglDeleteTextures(1, &this->ref->texToonTableID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_3::UploadToonTable(const GLushort *toonTableBuffer)\n{\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ToonTable);\n\tglBindTexture(GL_TEXTURE_1D, this->ref->texToonTableID);\n\tglTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, toonTableBuffer);\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_3::CreateClearImage()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenTextures(1, &OGLRef.texClearImageColorID);\n\tglGenTextures(1, &OGLRef.texClearImageDepthStencilID);\n\t\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, 256, 192, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);\n\t\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_3::DestroyClearImage()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\tglActiveTexture(GL_TEXTURE0);\n\tglDeleteTextures(1, &OGLRef.texClearImageColorID);\n\tglDeleteTextures(1, &OGLRef.texClearImageDepthStencilID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_3::UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_ClearImage);\n\t\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageColorID);\n\tglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, clearImageColorBuffer);\n\tglBindTexture(GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID);\n\tglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, clearImageDepthBuffer);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\t\n\tglActiveTexture(GL_TEXTURE0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_4::InitFinalRenderStates(const std::set<std::string> *oglExtensionSet)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tbool isBlendEquationSeparateSupported = this->IsExtensionPresent(oglExtensionSet, \"GL_EXT_blend_equation_separate\");\n\t\n\t// Blending Support\n\tif (isBlendEquationSeparateSupported)\n\t{\n\t\t// we want to use alpha destination blending so we can track the last-rendered alpha value\n\t\t// test: new super mario brothers renders the stormclouds at the beginning\n\t\tglBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA);\n\t\tglBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX);\n\t}\n\telse\n\t{\n\t\tglBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_DST_ALPHA);\n\t}\n\t\n\t// Mirrored Repeat Mode Support\n\tOGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT;\n\t\n\t// Always enable depth test, and control using glDepthMask().\n\tglEnable(GL_DEPTH_TEST);\n\t\n\t// Map the vertex list's colors with 4 floats per color. This is being done\n\t// because OpenGL needs 4-colors per vertex to support translucency. (The DS\n\t// uses 3-colors per vertex, and adds alpha through the poly, so we can't\n\t// simply reference the colors+alpha from just the vertices by themselves.)\n\tOGLRef.color4fBuffer = this->isShaderSupported ? NULL : new GLfloat[VERTLIST_SIZE * 4];\n\t\n\treturn OGLERROR_NOERR;\n}\n\nOpenGLRenderer_1_5::~OpenGLRenderer_1_5()\n{\n\tglFinish();\n\t\n\tDestroyVAOs();\n\tDestroyVBOs();\n\tDestroyPBOs();\n}\n\nRender3DError OpenGLRenderer_1_5::CreateVBOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenBuffers(1, &OGLRef.vboVertexID);\n\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\tglBufferData(GL_ARRAY_BUFFER, VERTLIST_SIZE * sizeof(VERT), NULL, GL_STREAM_DRAW);\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\t\n\tglGenBuffers(1, &OGLRef.iboIndexID);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, OGLRENDER_VERT_INDEX_BUFFER_COUNT * sizeof(GLushort), NULL, GL_STREAM_DRAW);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_5::DestroyVBOs()\n{\n\tif (!this->isVBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\tglDeleteBuffers(1, &OGLRef.vboVertexID);\n\t\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\tglDeleteBuffers(1, &OGLRef.iboIndexID);\n\t\n\tthis->isVBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_5::CreatePBOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenBuffers(2, OGLRef.pboRenderDataID);\n\tfor (unsigned int i = 0; i < 2; i++)\n\t{\n\t\tglBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]);\n\t\tglBufferData(GL_PIXEL_PACK_BUFFER_ARB, 256 * 192 * sizeof(u32), NULL, GL_STREAM_READ);\n\t}\n\t\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_1_5::DestroyPBOs()\n{\n\tif (!this->isPBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\tglDeleteBuffers(2, this->ref->pboRenderDataID);\n\t\n\tthis->isPBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_1_5::CreateVAOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenVertexArrays(1, &OGLRef.vaoMainStatesID);\n\tglBindVertexArray(OGLRef.vaoMainStatesID);\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\t\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\n\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t\n\tglBindVertexArray(0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_5::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArray(OGLRef.vaoMainStatesID);\n\t\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\t\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t}\n\telse\n\t{\n\t\tif (this->isShaderSupported)\n\t\t{\n\t\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\t\t\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t\t\t\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\t\t\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\t\t\t\n\t\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\t\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t\t\n\t\t\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\t\t\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\t\t\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglEnableClientState(GL_TEXTURE_COORD_ARRAY);\n\t\t\tglEnableClientState(GL_COLOR_ARRAY);\n\t\t\tglEnableClientState(GL_VERTEX_ARRAY);\n\t\t\t\n\t\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\t\t\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t\t\t\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\t\t\tglColorPointer(4, GL_FLOAT, 0, OGLRef.color4fBuffer);\n\t\t\t\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\t\t\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\t\t\tglVertexPointer(4, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\t\t\tglTexCoordPointer(2, GL_FLOAT, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\t\t}\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_5::DisableVertexAttributes()\n{\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArray(0);\n\t}\n\telse\n\t{\n\t\tif (this->isShaderSupported)\n\t\t{\n\t\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\t\tglDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tglDisableClientState(GL_VERTEX_ARRAY);\n\t\t\tglDisableClientState(GL_COLOR_ARRAY);\n\t\t\tglDisableClientState(GL_TEXTURE_COORD_ARRAY);\n\t\t}\n\t\t\n\t\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_5::ReadBackPixels()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tif (this->isPBOSupported)\n\t{\n\t\tthis->DownsampleFBO();\n\t\t\n\t\tglBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, this->ref->pboRenderDataID[i]);\n\t\tglReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, 0);\n\t\tglBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\t}\n\t\n\tthis->gpuScreen3DHasNewData[i] = true;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_1_5::RenderFinish()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tif (!this->gpuScreen3DHasNewData[i])\n\t{\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isPBOSupported)\n\t{\n\t\tglBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, OGLRef.pboRenderDataID[i]);\n\t\t\n\t\tconst u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);\n\t\tif (mappedBufferPtr != NULL)\n\t\t{\n\t\t\tthis->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen);\n\t\t\tglUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);\n\t\t}\n\t\t\n\t\tglBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);\n\t}\n\telse\n\t{\n\t\tthis->DownsampleFBO();\n\t\t\n\t\tu32 *__restrict workingBuffer = this->GPU_screen3D[i];\n\t\tglReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, workingBuffer);\n\t\tthis->ConvertFramebuffer(workingBuffer, (u32 *)gfx3d_convertedScreen);\n\t}\n\t\n\tthis->gpuScreen3DHasNewData[i] = false;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::InitExtensions()\n{\n\tRender3DError error = OGLERROR_NOERR;\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// Get OpenGL extensions\n\tstd::set<std::string> oglExtensionSet;\n\tthis->GetExtensionSet(&oglExtensionSet);\n\t\n\t// Initialize OpenGL\n\tthis->InitTables();\n\t\n\t// Load and create shaders. Return on any error, since a v2.0 driver will assume that shaders are available.\n\tthis->isShaderSupported\t= true;\n\t\n\tstd::string vertexShaderProgram;\n\tstd::string fragmentShaderProgram;\n\terror = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram);\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tthis->isShaderSupported = false;\n\t\treturn error;\n\t}\n\t\n\terror = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram);\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tthis->isShaderSupported = false;\n\t\treturn error;\n\t}\n\t\n\tthis->CreateToonTable();\n\t\n\tthis->isVBOSupported = true;\n\tthis->CreateVBOs();\n\t\n#if\t!defined(GL_ARB_pixel_buffer_object) && !defined(GL_EXT_pixel_buffer_object)\n\tthis->isPBOSupported = false;\n#else\n\tthis->isPBOSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_vertex_buffer_object\") &&\n\t\t\t\t\t\t\t (this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_pixel_buffer_object\") ||\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_pixel_buffer_object\"));\n#endif\n\tif (this->isPBOSupported)\n\t{\n\t\tthis->CreatePBOs();\n\t}\n\t\n#if !defined(GL_ARB_vertex_array_object) && !defined(GL_APPLE_vertex_array_object)\n\tthis->isVAOSupported = false;\n#else\n\tthis->isVAOSupported\t= this->isShaderSupported &&\n\t\t\t\t\t\t\t  this->isVBOSupported &&\n\t\t\t\t\t\t\t (this->IsExtensionPresent(&oglExtensionSet, \"GL_ARB_vertex_array_object\") ||\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_APPLE_vertex_array_object\"));\n#endif\n\tif (this->isVAOSupported)\n\t{\n\t\tthis->CreateVAOs();\n\t}\n\t\n\t// Don't use ARB versions since we're using the EXT versions for backwards compatibility.\n#if\t!defined(GL_EXT_framebuffer_object)\t\t|| \\\n\t!defined(GL_EXT_framebuffer_blit)\t\t|| \\\n\t!defined(GL_EXT_packed_depth_stencil)\n\t\n\tthis->isFBOSupported = false;\n#else\n\tthis->isFBOSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_object\") &&\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_blit\") &&\n\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_packed_depth_stencil\");\n#endif\n\tif (this->isFBOSupported)\n\t{\n\t\terror = this->CreateFBOs();\n\t\tif (error != OGLERROR_NOERR)\n\t\t{\n\t\t\tOGLRef.fboFinalOutputID = 0;\n\t\t\tthis->isFBOSupported = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\tOGLRef.fboFinalOutputID = 0;\n\t\tINFO(\"OpenGL: FBOs are unsupported. Some emulation features will be disabled.\\n\");\n\t}\n\t\n\t// Don't use ARB versions since we're using the EXT versions for backwards compatibility.\n#if\t!defined(GL_EXT_framebuffer_object)\t\t\t|| \\\n\t!defined(GL_EXT_framebuffer_multisample)\t|| \\\n\t!defined(GL_EXT_framebuffer_blit)\t\t\t|| \\\n\t!defined(GL_EXT_packed_depth_stencil)\n\t\n\tthis->isMultisampledFBOSupported = false;\n#else\n\tthis->isMultisampledFBOSupported\t= this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_object\") &&\n\t\t\t\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_blit\") &&\n\t\t\t\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_packed_depth_stencil\") &&\n\t\t\t\t\t\t\t\t\t\t  this->IsExtensionPresent(&oglExtensionSet, \"GL_EXT_framebuffer_multisample\");\n#endif\n\tif (this->isMultisampledFBOSupported)\n\t{\n\t\terror = this->CreateMultisampledFBO();\n\t\tif (error != OGLERROR_NOERR)\n\t\t{\n\t\t\tOGLRef.selectedRenderingFBO = 0;\n\t\t\tthis->isMultisampledFBOSupported = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\tOGLRef.selectedRenderingFBO = 0;\n\t\tINFO(\"OpenGL: Multisampled FBOs are unsupported. Multisample antialiasing will be disabled.\\n\");\n\t}\n\t\n\tthis->InitTextures();\n\tthis->InitFinalRenderStates(&oglExtensionSet); // This must be done last\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::InitFinalRenderStates(const std::set<std::string> *oglExtensionSet)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// we want to use alpha destination blending so we can track the last-rendered alpha value\n\t// test: new super mario brothers renders the stormclouds at the beginning\n\t\n\t// Blending Support\n\tglBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA);\n\tglBlendEquationSeparate(GL_FUNC_ADD, GL_MAX);\n\t\n\t// Mirrored Repeat Mode Support\n\tOGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT;\n\t\n\t// Always enable depth test, and control using glDepthMask().\n\tglEnable(GL_DEPTH_TEST);\n\t\n\t// Ignore our color buffer since we'll transfer the polygon alpha through a uniform.\n\tOGLRef.color4fBuffer = NULL;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount)\n{\n\tconst unsigned int polyCount = polyList->count;\n\tunsigned int vertIndexCount = 0;\n\t\n\tfor(unsigned int i = 0; i < polyCount; i++)\n\t{\n\t\tconst POLY *poly = &polyList->list[indexList->list[i]];\n\t\tconst unsigned int polyType = poly->type;\n\t\t\n\t\tfor(unsigned int j = 0; j < polyType; j++)\n\t\t{\n\t\t\tconst GLushort vertIndex = poly->vertIndexes[j];\n\t\t\t\n\t\t\t// While we're looping through our vertices, add each vertex index to\n\t\t\t// a buffer. For GFX3D_QUADS and GFX3D_QUAD_STRIP, we also add additional\n\t\t\t// vertices here to convert them to GL_TRIANGLES, which are much easier\n\t\t\t// to work with and won't be deprecated in future OpenGL versions.\n\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\tif (poly->vtxFormat == GFX3D_QUADS || poly->vtxFormat == GFX3D_QUAD_STRIP)\n\t\t\t{\n\t\t\t\tif (j == 2)\n\t\t\t\t{\n\t\t\t\t\toutIndexBuffer[vertIndexCount++] = vertIndex;\n\t\t\t\t}\n\t\t\t\telse if (j == 3)\n\t\t\t\t{\n\t\t\t\t\toutIndexBuffer[vertIndexCount++] = poly->vertIndexes[0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t*outIndexCount = vertIndexCount;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArray(OGLRef.vaoMainStatesID);\n\t\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\t\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t}\n\telse\n\t{\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\t\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t\t\n\t\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\t\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\t\t\n\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t\n\t\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\t\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\t\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::DisableVertexAttributes()\n{\n\tif (this->isVAOSupported)\n\t{\n\t\tglBindVertexArray(0);\n\t}\n\telse\n\t{\n\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Position);\n\t\tglDisableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\t\tglDisableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\t\n\t\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::BeginRender(const GFX3D_State *renderState)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tthis->doubleBufferIndex = (this->doubleBufferIndex + 1) & 0x01;\n\t\n\tthis->SelectRenderingFramebuffer();\n\t\n\tglUniform1i(OGLRef.uniformEnableAlphaTest, renderState->enableAlphaTest ? GL_TRUE : GL_FALSE);\n\tglUniform1f(OGLRef.uniformAlphaTestRef, divide5bitBy31_LUT[renderState->alphaTestRef]);\n\tglUniform1i(OGLRef.uniformToonShadingMode, renderState->shading);\n\tglUniform1i(OGLRef.uniformWBuffer, renderState->wbuffer);\n\t\n\tif(renderState->enableAlphaBlending)\n\t{\n\t\tglEnable(GL_BLEND);\n\t}\n\telse\n\t{\n\t\tglDisable(GL_BLEND);\n\t}\n\t\n\tglDepthMask(GL_TRUE);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tunsigned int vertIndexCount = 0;\n\t\n\tthis->SetupVertices(vertList, polyList, indexList, OGLRef.vertIndexBuffer, &vertIndexCount);\n\tthis->EnableVertexAttributes(vertList, OGLRef.vertIndexBuffer, vertIndexCount);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::SetupPolygon(const POLY *thePoly)\n{\n\tstatic unsigned int lastTexBlendMode = 0;\n\tstatic int lastStencilState = -1;\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\tconst PolygonAttributes attr = thePoly->getAttributes();\n\t\n\t// Set up polygon ID\n\tglUniform1i(OGLRef.uniformPolyID, attr.polygonID);\n\t\n\t// Set up alpha value\n\tconst GLfloat thePolyAlpha = (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f;\n\tglUniform1f(OGLRef.uniformPolyAlpha, thePolyAlpha);\n\t\n\t// Set up depth test mode\n\tstatic const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL};\n\tglDepthFunc(oglDepthFunc[attr.enableDepthTest]);\n\t\n\t// Set up culling mode\n\tstatic const GLenum oglCullingMode[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0};\n\tGLenum cullingMode = oglCullingMode[attr.surfaceCullingMode];\n\t\n\tif (cullingMode == 0)\n\t{\n\t\txglDisable(GL_CULL_FACE);\n\t}\n\telse\n\t{\n\t\txglEnable(GL_CULL_FACE);\n\t\tglCullFace(cullingMode);\n\t}\n\t\n\t// Set up depth write\n\tGLboolean enableDepthWrite = GL_TRUE;\n\t\n\t// Handle shadow polys. Do this after checking for depth write, since shadow polys\n\t// can change this too.\n\tif(attr.polygonMode == 3)\n\t{\n\t\txglEnable(GL_STENCIL_TEST);\n\t\tif(attr.polygonID == 0)\n\t\t{\n\t\t\tenableDepthWrite = GL_FALSE;\n\t\t\tif(lastStencilState != 0)\n\t\t\t{\n\t\t\t\tlastStencilState = 0;\n\t\t\t\t//when the polyID is zero, we are writing the shadow mask.\n\t\t\t\t//set stencilbuf = 1 where the shadow volume is obstructed by geometry.\n\t\t\t\t//do not write color or depth information.\n\t\t\t\tglStencilFunc(GL_ALWAYS, 65, 255);\n\t\t\t\tglStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);\n\t\t\t\tglColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tenableDepthWrite = GL_TRUE;\n\t\t\tif(lastStencilState != 1)\n\t\t\t{\n\t\t\t\tlastStencilState = 1;\n\t\t\t\t//when the polyid is nonzero, we are drawing the shadow poly.\n\t\t\t\t//only draw the shadow poly where the stencilbuf==1.\n\t\t\t\t//I am not sure whether to update the depth buffer here--so I chose not to.\n\t\t\t\tglStencilFunc(GL_EQUAL, 65, 255);\n\t\t\t\tglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);\n\t\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\txglEnable(GL_STENCIL_TEST);\n\t\tif(attr.isTranslucent)\n\t\t{\n\t\t\tlastStencilState = 3;\n\t\t\tglStencilFunc(GL_NOTEQUAL, attr.polygonID, 255);\n\t\t\tglStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);\n\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t}\n\t\telse if(lastStencilState != 2)\n\t\t{\n\t\t\tlastStencilState = 2;\n\t\t\tglStencilFunc(GL_ALWAYS, 64, 255);\n\t\t\tglStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);\n\t\t\tglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);\n\t\t}\n\t}\n\t\n\tif(attr.isTranslucent && !attr.enableAlphaDepthWrite)\n\t{\n\t\tenableDepthWrite = GL_FALSE;\n\t}\n\t\n\tglDepthMask(enableDepthWrite);\n\t\n\t// Set up texture blending mode\n\tif(attr.polygonMode != lastTexBlendMode)\n\t{\n\t\tlastTexBlendMode = attr.polygonMode;\n\t\tglUniform1i(OGLRef.uniformPolygonMode, attr.polygonMode);\n\t\t\n\t\t// Update the toon table if necessary\n\t\tif (this->toonTableNeedsUpdate && attr.polygonMode == 2)\n\t\t{\n\t\t\tthis->UploadToonTable(this->currentToonTable16);\n\t\t\tthis->toonTableNeedsUpdate = false;\n\t\t}\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_0::SetupTexture(const POLY *thePoly, bool enableTexturing)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\tconst PolygonTexParams params = thePoly->getTexParams();\n\t\n\t// Check if we need to use textures\n\tif (thePoly->texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing)\n\t{\n\t\tglUniform1i(OGLRef.uniformHasTexture, GL_FALSE);\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\tglUniform1i(OGLRef.uniformHasTexture, GL_TRUE);\n\t\n\t//\ttexCacheUnit.TexCache_SetTexture<TexFormat_32bpp>(format, texpal);\n\tTexCacheItem *newTexture = TexCache_SetTexture(TexFormat_32bpp, thePoly->texParam, thePoly->texPalette);\n\tif(newTexture != this->currTexture)\n\t{\n\t\tthis->currTexture = newTexture;\n\t\t//has the ogl renderer initialized the texture?\n\t\tif(!this->currTexture->deleteCallback)\n\t\t{\n\t\t\tthis->currTexture->deleteCallback = texDeleteCallback;\n\t\t\t\n\t\t\tif(OGLRef.freeTextureIDs.empty())\n\t\t\t{\n\t\t\t\tthis->ExpandFreeTextures();\n\t\t\t}\n\t\t\t\n\t\t\tthis->currTexture->texid = (u64)OGLRef.freeTextureIDs.front();\n\t\t\tOGLRef.freeTextureIDs.pop();\n\t\t\t\n\t\t\tglBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid);\n\t\t\t\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (params.enableRepeatS ? (params.enableMirroredRepeatS ? GL_MIRRORED_REPEAT : GL_REPEAT) : GL_CLAMP_TO_EDGE));\n\t\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (params.enableRepeatT ? (params.enableMirroredRepeatT ? GL_MIRRORED_REPEAT : GL_REPEAT) : GL_CLAMP_TO_EDGE));\n\t\t\t\n\t\t\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,\n\t\t\t\t\t\t this->currTexture->sizeX, this->currTexture->sizeY, 0,\n\t\t\t\t\t\t GL_RGBA, GL_UNSIGNED_BYTE, this->currTexture->decoded);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//otherwise, just bind it\n\t\t\tglBindTexture(GL_TEXTURE_2D, (GLuint)this->currTexture->texid);\n\t\t}\n\t\t\n\t\tglUniform2f(OGLRef.uniformTexScale, this->currTexture->invSizeX, this->currTexture->invSizeY);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_1::ReadBackPixels()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tthis->DownsampleFBO();\n\t\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER, this->ref->pboRenderDataID[i]);\n\tglReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, 0);\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER, 0);\n\t\n\tthis->gpuScreen3DHasNewData[i] = true;\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_2_1::RenderFinish()\n{\n\tconst unsigned int i = this->doubleBufferIndex;\n\t\n\tif (!this->gpuScreen3DHasNewData[i])\n\t{\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER, this->ref->pboRenderDataID[i]);\n\t\n\tconst u32 *__restrict mappedBufferPtr = (u32 *__restrict)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);\n\tif (mappedBufferPtr != NULL)\n\t{\n\t\tthis->ConvertFramebuffer(mappedBufferPtr, (u32 *)gfx3d_convertedScreen);\n\t\tglUnmapBuffer(GL_PIXEL_PACK_BUFFER);\n\t}\n\t\n\tglBindBuffer(GL_PIXEL_PACK_BUFFER, 0);\n\t\n\tthis->gpuScreen3DHasNewData[i] = false;\n\t\n\treturn OGLERROR_NOERR;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/OGLRender.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef OGLRENDER_H\n#define OGLRENDER_H\n\n#include <queue>\n#include <set>\n#include <string>\n#include \"render3D.h\"\n#include \"types.h\"\n\n#ifndef OGLRENDER_3_2_H\n\n#if defined(_WIN32) && !defined(WXPORT)\n\t#define WIN32_LEAN_AND_MEAN\n\t#include <windows.h>\n\t#include <GL/gl.h>\n\t#include <GL/glext.h>\n\n\t#define OGLEXT(procPtr, func)\t\tprocPtr func = NULL;\n\t#define INITOGLEXT(procPtr, func)\tfunc = (procPtr)wglGetProcAddress(#func);\n\t#define EXTERNOGLEXT(procPtr, func)\textern procPtr func;\n#elif defined(__APPLE__)\n\t#include <OpenGL/gl.h>\n\t#include <OpenGL/glext.h>\n\n\t// Ignore dynamic linking on Apple OS\n\t#define OGLEXT(procPtr, func)\n\t#define INITOGLEXT(procPtr, func)\n\t#define EXTERNOGLEXT(procPtr, func)\n\n\t// We're not exactly committing to OpenGL 3.2 Core Profile just yet, so redefine APPLE\n\t// extensions as a temporary measure.\n\t#if defined(GL_APPLE_vertex_array_object) && !defined(GL_ARB_vertex_array_object)\n\t\t#define glGenVertexArrays(n, ids)\t\tglGenVertexArraysAPPLE(n, ids)\n\t\t#define glBindVertexArray(id)\t\t\tglBindVertexArrayAPPLE(id)\n\t\t#define glDeleteVertexArrays(n, ids)\tglDeleteVertexArraysAPPLE(n, ids)\n\t#endif\n#else\n\t#include <GL/gl.h>\n\t#include <GL/glext.h>\n\t#include <GL/glx.h>\n\n\t/* This is a workaround needed to compile against nvidia GL headers */\n\t#ifndef GL_ALPHA_BLEND_EQUATION_ATI\n\t\t#undef GL_VERSION_1_3\n\t#endif\n\n\t#define OGLEXT(procPtr, func)\t\tprocPtr func = NULL;\n\t#define INITOGLEXT(procPtr, func)\tfunc = (procPtr)glXGetProcAddress((const GLubyte *) #func);\n\t#define EXTERNOGLEXT(procPtr, func)\textern procPtr func;\n#endif\n\n// Check minimum OpenGL header version\n#if !defined(GL_VERSION_2_1)\n\t#if defined(GL_VERSION_2_0)\n\t\t#warning Using OpenGL v2.0 headers with v2.1 overrides. Some features will be disabled.\n\n\t\t#if !defined(GL_ARB_framebuffer_object)\n\t\t\t// Overrides for GL_EXT_framebuffer_blit\n\t\t\t#if !defined(GL_EXT_framebuffer_blit)\n\t\t\t\t#define GL_READ_FRAMEBUFFER_EXT\t\tGL_FRAMEBUFFER_EXT\n\t\t\t\t#define GL_DRAW_FRAMEBUFFER_EXT\t\tGL_FRAMEBUFFER_EXT\n\t\t\t\t#define glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter)\n\t\t\t#endif\n\n\t\t\t// Overrides for GL_EXT_framebuffer_multisample\n\t\t\t#if !defined(GL_EXT_framebuffer_multisample)\n\t\t\t\t#define GL_MAX_SAMPLES_EXT 0\n\t\t\t\t#define glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height)\n\t\t\t#endif\n\n\t\t\t// Overrides for GL_ARB_pixel_buffer_object\n\t\t\t#if !defined(GL_PIXEL_PACK_BUFFER) && defined(GL_PIXEL_PACK_BUFFER_ARB)\n\t\t\t\t#define GL_PIXEL_PACK_BUFFER GL_PIXEL_PACK_BUFFER_ARB\n\t\t\t#endif\n\t\t#endif\n\t#else\n\t\t#error OpenGL requires v2.1 headers or later.\n\t#endif\n#endif\n\n// Textures\n#if !defined(GLX_H)\nEXTERNOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3\nEXTERNOGLEXT(PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB)\n#endif\n\n// Blending\nEXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4\nEXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0\n\nEXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT)\nEXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT)\n\n// Shaders\nEXTERNOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0\nEXTERNOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0\nEXTERNOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0\nEXTERNOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0\nEXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0\n\n// Generic vertex attributes\nEXTERNOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0\nEXTERNOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0\nEXTERNOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0\nEXTERNOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0\n\n// VAO\nEXTERNOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays)\nEXTERNOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays)\nEXTERNOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray)\n\n// VBO and PBO\nEXTERNOGLEXT(PFNGLGENBUFFERSARBPROC, glGenBuffersARB)\nEXTERNOGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffersARB)\nEXTERNOGLEXT(PFNGLBINDBUFFERARBPROC, glBindBufferARB)\nEXTERNOGLEXT(PFNGLBUFFERDATAARBPROC, glBufferDataARB)\nEXTERNOGLEXT(PFNGLBUFFERSUBDATAARBPROC, glBufferSubDataARB)\nEXTERNOGLEXT(PFNGLMAPBUFFERARBPROC, glMapBufferARB)\nEXTERNOGLEXT(PFNGLUNMAPBUFFERARBPROC, glUnmapBufferARB)\n\nEXTERNOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5\nEXTERNOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5\nEXTERNOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5\nEXTERNOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5\nEXTERNOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5\nEXTERNOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5\nEXTERNOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5\n\n// FBO\nEXTERNOGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT)\nEXTERNOGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT)\nEXTERNOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT)\nEXTERNOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT)\nEXTERNOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT)\nEXTERNOGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT)\nEXTERNOGLEXT(PFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT)\n\n// Multisampled FBO\nEXTERNOGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT)\nEXTERNOGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT)\nEXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT)\nEXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT)\nEXTERNOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT)\n\n#else // OGLRENDER_3_2_H\n\n// Basic Functions\nEXTERNOGLEXT(PFNGLGETSTRINGIPROC, glGetStringi) // Core in v3.0\n\n// Textures\n#if !defined(GLX_H)\nEXTERNOGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture) // Core in v1.3\n#endif\n\n// Blending\nEXTERNOGLEXT(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate) // Core in v1.4\nEXTERNOGLEXT(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate) // Core in v2.0\n\n// Shaders\nEXTERNOGLEXT(PFNGLCREATESHADERPROC, glCreateShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource) // Core in v2.0\nEXTERNOGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLATTACHSHADERPROC, glAttachShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLDETACHSHADERPROC, glDetachShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETSHADERIVPROC, glGetShaderiv) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) // Core in v2.0\nEXTERNOGLEXT(PFNGLDELETESHADERPROC, glDeleteShader) // Core in v2.0\nEXTERNOGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETPROGRAMIVPROC, glGetProgramiv) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) // Core in v2.0\nEXTERNOGLEXT(PFNGLVALIDATEPROGRAMPROC, glValidateProgram) // Core in v2.0\nEXTERNOGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM1IPROC, glUniform1i) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM1IVPROC, glUniform1iv) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM1FPROC, glUniform1f) // Core in v2.0\nEXTERNOGLEXT(PFNGLUNIFORM2FPROC, glUniform2f) // Core in v2.0\nEXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0\n\n// Generic vertex attributes\nEXTERNOGLEXT(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation) // Core in v2.0\nEXTERNOGLEXT(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation) // Core in v3.0\nEXTERNOGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) // Core in v2.0\nEXTERNOGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray) // Core in v2.0\nEXTERNOGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) // Core in v2.0\n\n// VAO\nEXTERNOGLEXT(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) // Core in v3.0\nEXTERNOGLEXT(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) // Core in v3.0\nEXTERNOGLEXT(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) // Core in v3.0\n\n// VBO and PBO\nEXTERNOGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers) // Core in v1.5\nEXTERNOGLEXT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) // Core in v1.5\nEXTERNOGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer) // Core in v1.5\nEXTERNOGLEXT(PFNGLBUFFERDATAPROC, glBufferData) // Core in v1.5\nEXTERNOGLEXT(PFNGLBUFFERSUBDATAPROC, glBufferSubData) // Core in v1.5\nEXTERNOGLEXT(PFNGLMAPBUFFERPROC, glMapBuffer) // Core in v1.5\nEXTERNOGLEXT(PFNGLUNMAPBUFFERPROC, glUnmapBuffer) // Core in v1.5\n\n// FBO\nEXTERNOGLEXT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) // Core in v3.0\nEXTERNOGLEXT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) // Core in v3.0\nEXTERNOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) // Core in v3.0\nEXTERNOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) // Core in v3.0\nEXTERNOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus) // Core in v3.0\nEXTERNOGLEXT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) // Core in v3.0\nEXTERNOGLEXT(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) // Core in v3.0\nEXTERNOGLEXT(PFNGLDRAWBUFFERSPROC, glDrawBuffers) // Core in v2.0\n\n// Multisampled FBO\nEXTERNOGLEXT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) // Core in v3.0\nEXTERNOGLEXT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer) // Core in v3.0\nEXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage) // Core in v3.0\nEXTERNOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) // Core in v3.0\nEXTERNOGLEXT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers) // Core in v3.0\n\n#endif // OGLRENDER_3_2_H\n\n// Define the minimum required OpenGL version for the driver to support\n#define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR\t\t\t1\n#define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR\t\t\t2\n#define OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION\t\t0\n\n#define OGLRENDER_MAX_MULTISAMPLES\t\t\t16\n#define OGLRENDER_VERT_INDEX_BUFFER_COUNT\t131072\n\nenum OGLVertexAttributeID\n{\n\tOGLVertexAttributeID_Position\t= 0,\n\tOGLVertexAttributeID_TexCoord0\t= 8,\n\tOGLVertexAttributeID_Color\t\t= 3,\n};\n\nenum OGLTextureUnitID\n{\n\t// Main textures will always be on texture unit 0.\n\tOGLTextureUnitID_ToonTable = 1,\n\tOGLTextureUnitID_ClearImage\n};\n\nenum OGLErrorCode\n{\n\tOGLERROR_NOERR = RENDER3DERROR_NOERR,\n\t\n\tOGLERROR_FEATURE_UNSUPPORTED,\n\tOGLERROR_VBO_UNSUPPORTED,\n\tOGLERROR_PBO_UNSUPPORTED,\n\tOGLERROR_SHADER_UNSUPPORTED,\n\tOGLERROR_VAO_UNSUPPORTED,\n\tOGLERROR_FBO_UNSUPPORTED,\n\tOGLERROR_MULTISAMPLED_FBO_UNSUPPORTED,\n\t\n\tOGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR,\n\tOGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR,\n\tOGLERROR_SHADER_CREATE_ERROR,\n\t\n\tOGLERROR_FBO_CREATE_ERROR\n};\n\nstruct OGLRenderRef\n{\t\n\t// OpenGL Feature Support\n\tGLint stateTexMirroredRepeat;\n\t\n\t// VBO\n\tGLuint vboVertexID;\n\tGLuint iboIndexID;\n\t\n\t// PBO\n\tGLuint pboRenderDataID[2];\n\t\n\t// FBO\n\tGLuint texClearImageColorID;\n\tGLuint texClearImageDepthStencilID;\n\tGLuint fboClearImageID;\n\t\n\tGLuint rboFinalOutputColorID;\n\tGLuint rboFinalOutputDepthStencilID;\n\tGLuint fboFinalOutputID;\n\t\n\t// Multisampled FBO\n\tGLuint rboMultisampleColorID;\n\tGLuint rboMultisampleDepthStencilID;\n\tGLuint fboMultisampleRenderID;\n\tGLuint selectedRenderingFBO;\n\t\n\t// Shader states\n\tGLuint vertexShaderID;\n\tGLuint fragmentShaderID;\n\tGLuint shaderProgram;\n\t\n\tGLint uniformPolyID;\n\tGLint uniformPolyAlpha;\n\tGLint uniformTexScale;\n\tGLint uniformHasTexture;\n\tGLint uniformPolygonMode;\n\tGLint uniformToonShadingMode;\n\tGLint uniformWBuffer;\n\tGLint uniformEnableAlphaTest;\n\tGLint uniformAlphaTestRef;\n\t\n\tGLuint texToonTableID;\n\t\n\t// VAO\n\tGLuint vaoMainStatesID;\n\t\n\t// Textures\n\tstd::queue<GLuint> freeTextureIDs;\n\t\n\t// Client-side Buffers\n\tGLfloat *color4fBuffer;\n\tDS_ALIGN(16) GLushort vertIndexBuffer[OGLRENDER_VERT_INDEX_BUFFER_COUNT];\n};\n\nstruct GFX3D_State;\nstruct VERTLIST;\nstruct POLYLIST;\nstruct INDEXLIST;\nstruct POLY;\nclass TexCacheItem;\nclass OpenGLRenderer;\n\nextern GPU3DInterface gpu3Dgl;\nextern GPU3DInterface gpu3DglOld;\nextern GPU3DInterface gpu3Dgl_3_2;\n\n//This is called by OGLRender whenever it initializes.\n//Platforms, please be sure to set this up.\n//return true if you successfully init.\nextern bool (*oglrender_init)();\n\n//This is called by OGLRender before it uses opengl.\n//return true if youre OK with using opengl\nextern bool (*oglrender_beginOpenGL)();\n\n//This is called by OGLRender after it is done using opengl.\nextern void (*oglrender_endOpenGL)();\n\n// These functions need to be assigned by ports that support using an\n// OpenGL 3.2 Core Profile context. The OGLRender_3_2.cpp file includes\n// the corresponding functions to assign to each function pointer.\n//\n// If any of these functions are unassigned, then one of the legacy OpenGL\n// renderers will be used instead.\nextern void (*OGLLoadEntryPoints_3_2_Func)();\nextern void (*OGLCreateRenderer_3_2_Func)(OpenGLRenderer **rendererPtr);\n\n// Lookup Tables\nextern CACHE_ALIGN GLfloat material_8bit_to_float[256];\nextern CACHE_ALIGN GLuint dsDepthToD24S8_LUT[32768];\nextern const GLfloat divide5bitBy31_LUT[32];\n\nFORCEINLINE u32 BGRA8888_32_To_RGBA6665_32(const u32 srcPix);\nFORCEINLINE u32 BGRA8888_32Rev_To_RGBA6665_32Rev(const u32 srcPix);\nbool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor, unsigned int checkVersionRevision);\n\nclass OpenGLRenderer : public Render3D\n{\nprivate:\n\t// Driver's OpenGL Version\n\tunsigned int versionMajor;\n\tunsigned int versionMinor;\n\tunsigned int versionRevision;\n\t\nprotected:\n\t// OpenGL-specific References\n\tOGLRenderRef *ref;\n\t\n\t// OpenGL Feature Support\n\tbool isVBOSupported;\n\tbool isPBOSupported;\n\tbool isFBOSupported;\n\tbool isMultisampledFBOSupported;\n\tbool isShaderSupported;\n\tbool isVAOSupported;\n\t\n\t// Textures\n\tTexCacheItem *currTexture;\n\t\n\tu16 currentToonTable16[32];\n\tbool toonTableNeedsUpdate;\n\t\n\tDS_ALIGN(16) u32 GPU_screen3D[2][256 * 192 * sizeof(u32)];\n\tbool gpuScreen3DHasNewData[2];\n\tunsigned int doubleBufferIndex;\n\tu8 clearImageStencilValue;\n\t\n\t// OpenGL-specific methods\n\tvirtual Render3DError CreateVBOs() = 0;\n\tvirtual void DestroyVBOs() = 0;\n\tvirtual Render3DError CreatePBOs() = 0;\n\tvirtual void DestroyPBOs() = 0;\n\tvirtual Render3DError CreateFBOs() = 0;\n\tvirtual void DestroyFBOs() = 0;\n\tvirtual Render3DError CreateMultisampledFBO() = 0;\n\tvirtual void DestroyMultisampledFBO() = 0;\n\tvirtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram) = 0;\n\tvirtual void DestroyShaders() = 0;\n\tvirtual Render3DError CreateVAOs() = 0;\n\tvirtual void DestroyVAOs() = 0;\n\tvirtual Render3DError InitTextures() = 0;\n\tvirtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet) = 0;\n\tvirtual Render3DError InitTables() = 0;\n\t\n\tvirtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram) = 0;\n\tvirtual Render3DError SetupShaderIO() = 0;\n\tvirtual Render3DError CreateToonTable() = 0;\n\tvirtual Render3DError DestroyToonTable() = 0;\n\tvirtual Render3DError UploadToonTable(const GLushort *toonTableBuffer) = 0;\n\tvirtual Render3DError CreateClearImage() = 0;\n\tvirtual Render3DError DestroyClearImage() = 0;\n\tvirtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer) = 0;\n\t\n\tvirtual void GetExtensionSet(std::set<std::string> *oglExtensionSet) = 0;\n\tvirtual Render3DError ExpandFreeTextures() = 0;\n\tvirtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount) = 0;\n\tvirtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount) = 0;\n\tvirtual Render3DError DisableVertexAttributes() = 0;\n\tvirtual Render3DError SelectRenderingFramebuffer() = 0;\n\tvirtual Render3DError DownsampleFBO() = 0;\n\tvirtual Render3DError ReadBackPixels() = 0;\n\t\n\t// Base rendering methods\n\tvirtual Render3DError BeginRender(const GFX3D_State *renderState) = 0;\n\tvirtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0;\n\tvirtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList) = 0;\n\tvirtual Render3DError PostRender() = 0;\n\tvirtual Render3DError EndRender(const u64 frameCount) = 0;\n\t\n\tvirtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll) = 0;\n\tvirtual Render3DError UpdateToonTable(const u16 *toonTableBuffer) = 0;\n\t\n\tvirtual Render3DError ClearUsingImage() const = 0;\n\tvirtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const = 0;\n\t\n\tvirtual Render3DError SetupPolygon(const POLY *thePoly) = 0;\n\tvirtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing) = 0;\n\tvirtual Render3DError SetupViewport(const POLY *thePoly) = 0;\n\t\npublic:\n\tOpenGLRenderer();\n\tvirtual ~OpenGLRenderer() {};\n\t\n\tvirtual Render3DError InitExtensions() = 0;\n\tvirtual Render3DError Reset() = 0;\n\tvirtual Render3DError RenderFinish() = 0;\n\t\n\tvirtual Render3DError DeleteTexture(const TexCacheItem *item) = 0;\n\t\n\tbool IsExtensionPresent(const std::set<std::string> *oglExtensionSet, const std::string extensionName) const;\n\tbool ValidateShaderCompile(GLuint theShader) const;\n\tbool ValidateShaderProgramLink(GLuint theProgram) const;\n\tvoid GetVersion(unsigned int *major, unsigned int *minor, unsigned int *revision) const;\n\tvoid SetVersion(unsigned int major, unsigned int minor, unsigned int revision);\n\tvoid ConvertFramebuffer(const u32 *__restrict srcBuffer, u32 *dstBuffer);\n};\n\nclass OpenGLRenderer_1_2 : public OpenGLRenderer\n{\nprotected:\n\t// OpenGL-specific methods\n\tvirtual Render3DError CreateVBOs();\n\tvirtual void DestroyVBOs();\n\tvirtual Render3DError CreatePBOs();\n\tvirtual void DestroyPBOs();\n\tvirtual Render3DError CreateFBOs();\n\tvirtual void DestroyFBOs();\n\tvirtual Render3DError CreateMultisampledFBO();\n\tvirtual void DestroyMultisampledFBO();\n\tvirtual Render3DError CreateShaders(const std::string *vertexShaderProgram, const std::string *fragmentShaderProgram);\n\tvirtual void DestroyShaders();\n\tvirtual Render3DError CreateVAOs();\n\tvirtual void DestroyVAOs();\n\tvirtual Render3DError InitTextures();\n\tvirtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet);\n\tvirtual Render3DError InitTables();\n\t\n\tvirtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram);\n\tvirtual Render3DError SetupShaderIO();\n\tvirtual Render3DError CreateToonTable();\n\tvirtual Render3DError DestroyToonTable();\n\tvirtual Render3DError UploadToonTable(const GLushort *toonTableBuffer);\n\tvirtual Render3DError CreateClearImage();\n\tvirtual Render3DError DestroyClearImage();\n\tvirtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer);\n\t\n\tvirtual void GetExtensionSet(std::set<std::string> *oglExtensionSet);\n\tvirtual Render3DError ExpandFreeTextures();\n\tvirtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount);\n\tvirtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount);\n\tvirtual Render3DError DisableVertexAttributes();\n\tvirtual Render3DError SelectRenderingFramebuffer();\n\tvirtual Render3DError DownsampleFBO();\n\tvirtual Render3DError ReadBackPixels();\n\t\n\t// Base rendering methods\n\tvirtual Render3DError BeginRender(const GFX3D_State *renderState);\n\tvirtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);\n\tvirtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);\n\tvirtual Render3DError PostRender();\n\tvirtual Render3DError EndRender(const u64 frameCount);\n\t\n\tvirtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll);\n\tvirtual Render3DError UpdateToonTable(const u16 *toonTableBuffer);\n\t\n\tvirtual Render3DError ClearUsingImage() const;\n\tvirtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const;\n\t\n\tvirtual Render3DError SetupPolygon(const POLY *thePoly);\n\tvirtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing);\n\tvirtual Render3DError SetupViewport(const POLY *thePoly);\n\t\npublic:\n\tOpenGLRenderer_1_2();\n\t~OpenGLRenderer_1_2();\n\t\n\tvirtual Render3DError InitExtensions();\n\tvirtual Render3DError Reset();\n\tvirtual Render3DError RenderFinish();\n\t\n\tvirtual Render3DError DeleteTexture(const TexCacheItem *item);\n};\n\nclass OpenGLRenderer_1_3 : public OpenGLRenderer_1_2\n{\nprotected:\n\tvirtual Render3DError CreateToonTable();\n\tvirtual Render3DError DestroyToonTable();\n\tvirtual Render3DError UploadToonTable(const GLushort *toonTableBuffer);\n\tvirtual Render3DError CreateClearImage();\n\tvirtual Render3DError DestroyClearImage();\n\tvirtual Render3DError UploadClearImage(const GLushort *clearImageColorBuffer, const GLint *clearImageDepthBuffer);\n};\n\nclass OpenGLRenderer_1_4 : public OpenGLRenderer_1_3\n{\nprotected:\n\tvirtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet);\n};\n\nclass OpenGLRenderer_1_5 : public OpenGLRenderer_1_4\n{\nprotected:\n\tvirtual Render3DError CreateVBOs();\n\tvirtual void DestroyVBOs();\n\tvirtual Render3DError CreatePBOs();\n\tvirtual void DestroyPBOs();\n\tvirtual Render3DError CreateVAOs();\n\t\n\tvirtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount);\n\tvirtual Render3DError DisableVertexAttributes();\n\tvirtual Render3DError ReadBackPixels();\n\t\t\npublic:\n\t~OpenGLRenderer_1_5();\n\t\n\tvirtual Render3DError RenderFinish();\n};\n\nclass OpenGLRenderer_2_0 : public OpenGLRenderer_1_5\n{\nprotected:\n\tvirtual Render3DError InitExtensions();\n\tvirtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet);\n\t\n\tvirtual Render3DError SetupVertices(const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, GLushort *outIndexBuffer, unsigned int *outIndexCount);\n\tvirtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount);\n\tvirtual Render3DError DisableVertexAttributes();\n\t\n\tvirtual Render3DError BeginRender(const GFX3D_State *renderState);\n\tvirtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);\n\t\n\tvirtual Render3DError SetupPolygon(const POLY *thePoly);\n\tvirtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing);\n};\n\nclass OpenGLRenderer_2_1 : public OpenGLRenderer_2_0\n{\nprotected:\n\tvirtual Render3DError ReadBackPixels();\n\t\npublic:\n\tvirtual Render3DError RenderFinish();\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/OGLRender_3_2.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"OGLRender_3_2.h\"\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"debug.h\"\n#include \"gfx3d.h\"\n#include \"NDSSystem.h\"\n#include \"texcache.h\"\n\n//------------------------------------------------------------\n\n// Basic Functions\nOGLEXT(PFNGLGETSTRINGIPROC, glGetStringi) // Core in v3.0\n\n// Shaders\nOGLEXT(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation) // Core in v3.0\n\n// FBO\nOGLEXT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) // Core in v3.0\nOGLEXT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) // Core in v3.0\nOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) // Core in v3.0\nOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) // Core in v3.0\nOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus) // Core in v3.0\nOGLEXT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) // Core in v3.0\nOGLEXT(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) // Core in v3.0\nOGLEXT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) // Core in v3.0\nOGLEXT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer) // Core in v3.0\nOGLEXT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage) // Core in v3.0\nOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) // Core in v3.0\nOGLEXT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers) // Core in v3.0\n\nvoid OGLLoadEntryPoints_3_2()\n{\n\t// Basic Functions\n\tINITOGLEXT(PFNGLGETSTRINGIPROC, glGetStringi)\n\t\n\t// Shaders\n\tINITOGLEXT(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation)\n\t\n\t// FBO\n\tINITOGLEXT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) // Promote to core version\n\tINITOGLEXT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) // Promote to core version\n\tINITOGLEXT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer) // Promote to core version\n\tINITOGLEXT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) // Promote to core version\n\tINITOGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus) // Promote to core version\n\tINITOGLEXT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) // Promote to core version\n\tINITOGLEXT(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer) // Promote to core version\n\tINITOGLEXT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers) // Promote to core version\n\tINITOGLEXT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer) // Promote to core version\n\tINITOGLEXT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage) // Promote to core version\n\tINITOGLEXT(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample) // Promote to core version\n\tINITOGLEXT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers) // Promote to core version\n}\n\n// Vertex Shader GLSL 1.50\nstatic const char *vertexShader_150 = {\"\\\n\t#version 150 \\n\\\n\t\\n\\\n\tin vec4 inPosition; \\n\\\n\tin vec2 inTexCoord0; \\n\\\n\tin vec3 inColor; \\n\\\n\t\\n\\\n\tuniform float polyAlpha; \\n\\\n\tuniform vec2 texScale; \\n\\\n\t\\n\\\n\tout vec4 vtxPosition; \\n\\\n\tout vec2 vtxTexCoord; \\n\\\n\tout vec4 vtxColor; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\tmat2 texScaleMtx\t= mat2(\tvec2(texScale.x,        0.0), \\n\\\n\t\t\t\t\t\t\t\t\tvec2(       0.0, texScale.y)); \\n\\\n\t\t\\n\\\n\t\tvtxPosition = inPosition; \\n\\\n\t\tvtxTexCoord = texScaleMtx * inTexCoord0; \\n\\\n\t\tvtxColor = vec4(inColor * 4.0, polyAlpha); \\n\\\n\t\t\\n\\\n\t\tgl_Position = vtxPosition; \\n\\\n\t} \\n\\\n\"};\n\n// Fragment Shader GLSL 1.50\nstatic const char *fragmentShader_150 = {\"\\\n\t#version 150 \\n\\\n\t\\n\\\n\tin vec4 vtxPosition; \\n\\\n\tin vec2 vtxTexCoord; \\n\\\n\tin vec4 vtxColor; \\n\\\n\t\\n\\\n\tuniform sampler2D texMainRender; \\n\\\n\tuniform sampler1D texToonTable; \\n\\\n\tuniform int polyID; \\n\\\n\tuniform bool hasTexture; \\n\\\n\tuniform int polygonMode; \\n\\\n\tuniform int toonShadingMode; \\n\\\n\tuniform int oglWBuffer; \\n\\\n\tuniform bool enableAlphaTest; \\n\\\n\tuniform float alphaTestRef; \\n\\\n\t\\n\\\n\tout vec4 outFragColor; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\tvec4 texColor = vec4(1.0, 1.0, 1.0, 1.0); \\n\\\n\t\tvec4 fragColor; \\n\\\n\t\tfloat fragDepth; \\n\\\n\t\t\\n\\\n\t\tif(hasTexture) \\n\\\n\t\t{ \\n\\\n\t\t\ttexColor = texture(texMainRender, vtxTexCoord); \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tfragColor = texColor; \\n\\\n\t\t\\n\\\n\t\tif(polygonMode == 0) \\n\\\n\t\t{ \\n\\\n\t\t\tfragColor = vtxColor * texColor; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 1) \\n\\\n\t\t{ \\n\\\n\t\t\tif (texColor.a == 0.0 || !hasTexture) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = vtxColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse if (texColor.a == 1.0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * (1.0-texColor.a) + vtxColor.rgb * texColor.a; \\n\\\n\t\t\t} \\n\\\n\t\t\t\\n\\\n\t\t\tfragColor.a = vtxColor.a; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 2) \\n\\\n\t\t{ \\n\\\n\t\t\tvec3 toonColor = vec3(texture(texToonTable, vtxColor.r).rgb); \\n\\\n\t\t\t\\n\\\n\t\t\tif (toonShadingMode == 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * toonColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor.rgb = texColor.rgb * vtxColor.rgb + toonColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\t\\n\\\n\t\t\tfragColor.a = texColor.a * vtxColor.a; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 3) \\n\\\n\t\t{ \\n\\\n\t\t\tif (polyID != 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tfragColor = vtxColor; \\n\\\n\t\t\t} \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tif (fragColor.a == 0.0 || (enableAlphaTest && fragColor.a < alphaTestRef)) \\n\\\n\t\t{ \\n\\\n\t\t\tdiscard; \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tif (oglWBuffer == 1) \\n\\\n\t\t{ \\n\\\n\t\t\t// TODO \\n\\\n\t\t\tfragDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \\n\\\n\t\t} \\n\\\n\t\telse \\n\\\n\t\t{ \\n\\\n\t\t\tfragDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\toutFragColor = fragColor; \\n\\\n\t\tgl_FragDepth = fragDepth; \\n\\\n\t} \\n\\\n\"};\n\nvoid OGLCreateRenderer_3_2(OpenGLRenderer **rendererPtr)\n{\n\tif (IsVersionSupported(3, 2, 0))\n\t{\n\t\t*rendererPtr = new OpenGLRenderer_3_2;\n\t\t(*rendererPtr)->SetVersion(3, 2, 0);\n\t}\n}\n\nOpenGLRenderer_3_2::~OpenGLRenderer_3_2()\n{\n\tglFinish();\n\t\n\tDestroyVAOs();\n\tDestroyFBOs();\n\tDestroyMultisampledFBO();\n}\n\nRender3DError OpenGLRenderer_3_2::InitExtensions()\n{\n\tRender3DError error = OGLERROR_NOERR;\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// Get OpenGL extensions\n\tstd::set<std::string> oglExtensionSet;\n\tthis->GetExtensionSet(&oglExtensionSet);\n\t\n\t// Initialize OpenGL\n\tthis->InitTables();\n\t\n\t// Load and create shaders. Return on any error, since v3.2 Core Profile makes shaders mandatory.\n\tthis->isShaderSupported\t= true;\n\t\n\tstd::string vertexShaderProgram;\n\tstd::string fragmentShaderProgram;\n\terror = this->LoadShaderPrograms(&vertexShaderProgram, &fragmentShaderProgram);\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tthis->isShaderSupported = false;\n\t\treturn error;\n\t}\n\t\n\terror = this->CreateShaders(&vertexShaderProgram, &fragmentShaderProgram);\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tthis->isShaderSupported = false;\n\t\treturn error;\n\t}\n\t\n\tthis->CreateToonTable();\n\t\n\tthis->isVBOSupported = true;\n\tthis->CreateVBOs();\n\t\n\tthis->isPBOSupported = true;\n\tthis->CreatePBOs();\n\t\n\tthis->isVAOSupported = true;\n\tthis->CreateVAOs();\n\t\n\t// Load and create FBOs. Return on any error, since v3.2 Core Profile makes FBOs mandatory.\n\tthis->isFBOSupported = true;\n\terror = this->CreateFBOs();\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tOGLRef.fboFinalOutputID = 0;\n\t\tthis->isFBOSupported = false;\n\t\treturn error;\n\t}\n\t\n\tthis->isMultisampledFBOSupported = true;\n\terror = this->CreateMultisampledFBO();\n\tif (error != OGLERROR_NOERR)\n\t{\n\t\tOGLRef.selectedRenderingFBO = 0;\n\t\tthis->isMultisampledFBOSupported = false;\n\t\t\n\t\tif (error == OGLERROR_FBO_CREATE_ERROR)\n\t\t{\n\t\t\t// Return on OGLERROR_FBO_CREATE_ERROR, since a v3.0 driver should be able to\n\t\t\t// support FBOs.\n\t\t\treturn error;\n\t\t}\n\t}\n\t\n\tthis->InitTextures();\n\tthis->InitFinalRenderStates(&oglExtensionSet); // This must be done last\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_3_2::CreateFBOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// Set up FBO render targets\n\tthis->CreateClearImage();\n\t\n\tglGenRenderbuffers(1, &OGLRef.rboFinalOutputColorID);\n\tglGenRenderbuffers(1, &OGLRef.rboFinalOutputDepthStencilID);\n\t\n\tglBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboFinalOutputColorID);\n\tglRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 256, 192);\n\tglBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboFinalOutputDepthStencilID);\n\tglRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 192);\n\t\n\t// Set up FBOs\n\tglGenFramebuffers(1, &OGLRef.fboClearImageID);\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboClearImageID);\n\tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, OGLRef.texClearImageColorID, 0);\n\tglFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, OGLRef.texClearImageDepthStencilID, 0);\n\t\n\tif (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)\n\t{\n\t\tINFO(\"OpenGL: Failed to created FBOs. Some emulation features will be disabled.\\n\");\n\t\t\n\t\tglBindFramebuffer(GL_FRAMEBUFFER, 0);\n\t\t\n\t\tglDeleteFramebuffers(1, &OGLRef.fboClearImageID);\n\t\tthis->DestroyClearImage();\n\t\t\n\t\tglDeleteRenderbuffers(1, &OGLRef.rboFinalOutputColorID);\n\t\tglDeleteRenderbuffers(1, &OGLRef.rboFinalOutputDepthStencilID);\n\t\t\n\t\treturn OGLERROR_FBO_CREATE_ERROR;\n\t}\n\t\n\t// Set up final output FBO\n\tglGenFramebuffers(1, &OGLRef.fboFinalOutputID);\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboFinalOutputID);\n\tglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, OGLRef.rboFinalOutputColorID);\n\tglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, OGLRef.rboFinalOutputDepthStencilID);\n\t\n\tif (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)\n\t{\n\t\tINFO(\"OpenGL: Failed to created FBOs. Some emulation features will be disabled.\\n\");\n\t\t\n\t\tglBindFramebuffer(GL_FRAMEBUFFER, 0);\n\t\t\n\t\tglDeleteFramebuffers(1, &OGLRef.fboClearImageID);\n\t\tthis->DestroyClearImage();\n\t\t\n\t\tglDeleteFramebuffers(1, &OGLRef.fboFinalOutputID);\n\t\tglDeleteRenderbuffers(1, &OGLRef.rboFinalOutputColorID);\n\t\tglDeleteRenderbuffers(1, &OGLRef.rboFinalOutputDepthStencilID);\n\t\t\n\t\tOGLRef.fboFinalOutputID = 0;\n\t\treturn OGLERROR_FBO_CREATE_ERROR;\n\t}\n\t\n\tglReadBuffer(GL_COLOR_ATTACHMENT0);\n\t\n\tINFO(\"OpenGL: Successfully created FBOs.\\n\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_3_2::DestroyFBOs()\n{\n\tif (!this->isFBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, 0);\n\t\n\tglDeleteFramebuffers(1, &OGLRef.fboClearImageID);\n\tthis->DestroyClearImage();\n\t\n\tglDeleteFramebuffers(1, &OGLRef.fboFinalOutputID);\n\tglDeleteRenderbuffers(1, &OGLRef.rboFinalOutputColorID);\n\tglDeleteRenderbuffers(1, &OGLRef.rboFinalOutputDepthStencilID);\n\t\n\tthis->isFBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_3_2::CreateMultisampledFBO()\n{\n\t// Check the maximum number of samples that the GPU supports and use that.\n\t// Since our target resolution is only 256x192 pixels, using the most samples\n\t// possible is the best thing to do.\n\tGLint maxSamples = 0;\n\tglGetIntegerv(GL_MAX_SAMPLES, &maxSamples);\n\t\n\tif (maxSamples < 2)\n\t{\n\t\tINFO(\"OpenGL: GPU does not support at least 2x multisampled FBOs. Multisample antialiasing will be disabled.\\n\");\n\t\treturn OGLERROR_FEATURE_UNSUPPORTED;\n\t}\n\telse if (maxSamples > OGLRENDER_MAX_MULTISAMPLES)\n\t{\n\t\tmaxSamples = OGLRENDER_MAX_MULTISAMPLES;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\t// Set up FBO render targets\n\tglGenRenderbuffers(1, &OGLRef.rboMultisampleColorID);\n\tglGenRenderbuffers(1, &OGLRef.rboMultisampleDepthStencilID);\n\t\n\tglBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMultisampleColorID);\n\tglRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamples, GL_RGBA, 256, 192);\n\tglBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMultisampleDepthStencilID);\n\tglRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamples, GL_DEPTH24_STENCIL8, 256, 192);\n\t\n\t// Set up multisampled rendering FBO\n\tglGenFramebuffers(1, &OGLRef.fboMultisampleRenderID);\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboMultisampleRenderID);\n\tglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, OGLRef.rboMultisampleColorID);\n\tglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, OGLRef.rboMultisampleDepthStencilID);\n\t\n\tif (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)\n\t{\n\t\tglBindFramebuffer(GL_FRAMEBUFFER, 0);\n\t\tglDeleteFramebuffers(1, &OGLRef.fboMultisampleRenderID);\n\t\tglDeleteRenderbuffers(1, &OGLRef.rboMultisampleColorID);\n\t\tglDeleteRenderbuffers(1, &OGLRef.rboMultisampleDepthStencilID);\n\t\t\n\t\tINFO(\"OpenGL: Failed to create multisampled FBO. Multisample antialiasing will be disabled.\\n\");\n\t\treturn OGLERROR_FBO_CREATE_ERROR;\n\t}\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboFinalOutputID);\n\tINFO(\"OpenGL: Successfully created multisampled FBO.\\n\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_3_2::DestroyMultisampledFBO()\n{\n\tif (!this->isMultisampledFBOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindFramebuffer(GL_FRAMEBUFFER, 0);\n\tglDeleteFramebuffers(1, &OGLRef.fboMultisampleRenderID);\n\tglDeleteRenderbuffers(1, &OGLRef.rboMultisampleColorID);\n\tglDeleteRenderbuffers(1, &OGLRef.rboMultisampleDepthStencilID);\n\t\n\tthis->isMultisampledFBOSupported = false;\n}\n\nRender3DError OpenGLRenderer_3_2::CreateVAOs()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglGenVertexArrays(1, &OGLRef.vaoMainStatesID);\n\tglBindVertexArray(OGLRef.vaoMainStatesID);\n\t\n\tglBindBuffer(GL_ARRAY_BUFFER, OGLRef.vboVertexID);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OGLRef.iboIndexID);\n\t\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Position);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_TexCoord0);\n\tglEnableVertexAttribArray(OGLVertexAttributeID_Color);\n\t\n\tglVertexAttribPointer(OGLVertexAttributeID_Position, 4, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, coord));\n\tglVertexAttribPointer(OGLVertexAttributeID_TexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(VERT), (const GLvoid *)offsetof(VERT, texcoord));\n\tglVertexAttribPointer(OGLVertexAttributeID_Color, 3, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VERT), (const GLvoid *)offsetof(VERT, color));\n\t\n\tglBindVertexArray(0);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_3_2::DestroyVAOs()\n{\n\tif (!this->isVAOSupported)\n\t{\n\t\treturn;\n\t}\n\t\n\tglBindVertexArray(0);\n\tglDeleteVertexArrays(1, &this->ref->vaoMainStatesID);\n\t\n\tthis->isVAOSupported = false;\n}\n\nRender3DError OpenGLRenderer_3_2::LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram)\n{\n\t*outVertexShaderProgram = std::string(vertexShader_150);\n\t*outFragmentShaderProgram = std::string(fragmentShader_150);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_3_2::SetupShaderIO()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Position, \"inPosition\");\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_TexCoord0, \"inTexCoord0\");\n\tglBindAttribLocation(OGLRef.shaderProgram, OGLVertexAttributeID_Color, \"inColor\");\n\tglBindFragDataLocation(OGLRef.shaderProgram, 0, \"outFragColor\");\n\t\n\treturn OGLERROR_NOERR;\n}\n\nvoid OpenGLRenderer_3_2::GetExtensionSet(std::set<std::string> *oglExtensionSet)\n{\n\tGLint extensionCount = 0;\n\t\n\tglGetIntegerv(GL_NUM_EXTENSIONS, &extensionCount);\n\tfor (unsigned int i = 0; i < extensionCount; i++)\n\t{\n\t\tstd::string extensionName = std::string((const char *)glGetStringi(GL_EXTENSIONS, i));\n\t\toglExtensionSet->insert(extensionName);\n\t}\n}\n\nRender3DError OpenGLRenderer_3_2::EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount)\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindVertexArray(OGLRef.vaoMainStatesID);\n\tglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VERT) * vertList->count, vertList);\n\tglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, vertIndexCount * sizeof(GLushort), indexBuffer);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_3_2::DisableVertexAttributes()\n{\n\tglBindVertexArray(0);\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_3_2::SelectRenderingFramebuffer()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (this->isMultisampledFBOSupported)\n\t{\n\t\tOGLRef.selectedRenderingFBO = CommonSettings.GFX3D_Renderer_Multisample ? OGLRef.fboMultisampleRenderID : OGLRef.fboFinalOutputID;\n\t\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.selectedRenderingFBO);\n\t\t\n\t\tconst GLenum drawBufferList = {GL_COLOR_ATTACHMENT0};\n\t\tglDrawBuffers(1, &drawBufferList);\n\t}\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_3_2::DownsampleFBO()\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tif (!this->isMultisampledFBOSupported || OGLRef.selectedRenderingFBO != OGLRef.fboMultisampleRenderID)\n\t{\n\t\treturn OGLERROR_NOERR;\n\t}\n\t\n\tglBindFramebuffer(GL_READ_FRAMEBUFFER, OGLRef.selectedRenderingFBO);\n\tglBindFramebuffer(GL_DRAW_FRAMEBUFFER, OGLRef.fboFinalOutputID);\n\tglBlitFramebuffer(0, 0, 256, 192, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT, GL_NEAREST);\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboFinalOutputID);\n\t\n\treturn OGLERROR_NOERR;\n}\n\nRender3DError OpenGLRenderer_3_2::ClearUsingImage() const\n{\n\tOGLRenderRef &OGLRef = *this->ref;\n\t\n\tglBindFramebuffer(GL_READ_FRAMEBUFFER, OGLRef.fboClearImageID);\n\tglBindFramebuffer(GL_DRAW_FRAMEBUFFER, OGLRef.selectedRenderingFBO);\n\tglBlitFramebuffer(0, 0, 256, 192, 0, 0, 256, 192, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);\n\tglBindFramebuffer(GL_FRAMEBUFFER, OGLRef.selectedRenderingFBO);\n\t\n\treturn OGLERROR_NOERR;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/OGLRender_3_2.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef OGLRENDER_3_2_H\n#define OGLRENDER_3_2_H\n\n#if defined(_WIN32) && !defined(WXPORT)\n\t#define WIN32_LEAN_AND_MEAN\n\t#include <windows.h>\n\t#include <GL/gl.h>\n\t#include <GL/glcorearb.h>\n\n\t#define OGLEXT(procPtr, func)\t\tprocPtr func = NULL;\n\t#define INITOGLEXT(procPtr, func)\tfunc = (procPtr)wglGetProcAddress(#func);\n\t#define EXTERNOGLEXT(procPtr, func)\textern procPtr func;\n#elif defined(__APPLE__)\n\t#include <OpenGL/gl3.h>\n\t#include <OpenGL/gl3ext.h>\n\n\t// Ignore dynamic linking on Apple OS\n\t#define OGLEXT(procPtr, func)\n\t#define INITOGLEXT(procPtr, func)\n\t#define EXTERNOGLEXT(procPtr, func)\n#else\n\t#include <GL/gl.h>\n\t#include <GL/glcorearb.h>\n\t#include <GL/glx.h>\n\n\t#define OGLEXT(procPtr, func)\t\tprocPtr func = NULL;\n\t#define INITOGLEXT(procPtr, func)\tfunc = (procPtr)glXGetProcAddress((const GLubyte *) #func);\n\t#define EXTERNOGLEXT(procPtr, func)\textern procPtr func;\n#endif\n\n// Check minimum OpenGL header version\n#if !defined(GL_VERSION_3_2)\n\t#error OpenGL requires v3.2 headers or later.\n#endif\n\n#include \"OGLRender.h\"\n\nvoid OGLLoadEntryPoints_3_2();\nvoid OGLCreateRenderer_3_2(OpenGLRenderer **rendererPtr);\n\nclass OpenGLRenderer_3_2 : public OpenGLRenderer_2_1\n{\nprotected:\n\tvirtual Render3DError InitExtensions();\n\tvirtual Render3DError CreateFBOs();\n\tvirtual void DestroyFBOs();\n\tvirtual Render3DError CreateMultisampledFBO();\n\tvirtual void DestroyMultisampledFBO();\n\tvirtual Render3DError CreateVAOs();\n\tvirtual void DestroyVAOs();\n\t\n\tvirtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram);\n\tvirtual Render3DError SetupShaderIO();\n\t\n\tvirtual void GetExtensionSet(std::set<std::string> *oglExtensionSet);\n\tvirtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount);\n\tvirtual Render3DError DisableVertexAttributes();\n\tvirtual Render3DError SelectRenderingFramebuffer();\n\tvirtual Render3DError DownsampleFBO();\n\t\n\tvirtual Render3DError ClearUsingImage() const;\n\t\npublic:\n\t~OpenGLRenderer_3_2();\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/PACKED.h",
    "content": "#ifndef __GNUC__\n#pragma pack(push, 1)\n#pragma warning(disable : 4103)\n#endif\n\n#ifndef __PACKED\n\t#ifdef __GNUC__\n\t#define __PACKED __attribute__((__packed__))\n\t#else\n\t#define __PACKED\n\t#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/PACKED_END.h",
    "content": "#ifndef __GNUC__\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ROMReader.cpp",
    "content": "/*\n\tCopyright 2007 Guillaume Duhamel\n\tCopyright 2007-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"ROMReader.h\"\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <stdio.h>\n#ifdef HAVE_LIBZZIP\n#include <zzip/zzip.h>\n#endif\n\n#ifdef WIN32\n#define stat(...) _stat(__VA_ARGS__)\n#define S_IFMT _S_IFMT\n#define S_IFREG _S_IFREG\n#endif\n\nROMReader_struct * ROMReaderInit(char ** filename)\n{\n#ifdef HAVE_LIBZ\n\tif(!strcasecmp(\".gz\", *filename + (strlen(*filename) - 3)))\n\t{\n\t\t(*filename)[strlen(*filename) - 3] = '\\0';\n\t\treturn &GZIPROMReader;\n\t}\n#endif\n#ifdef HAVE_LIBZZIP\n\tif (!strcasecmp(\".zip\", *filename + (strlen(*filename) - 4)))\n\t{\n\t\t(*filename)[strlen(*filename) - 4] = '\\0';\n\t\treturn &ZIPROMReader;\n\t}\n#endif\n\treturn &STDROMReader;\n}\n\nvoid * STDROMReaderInit(const char * filename);\nvoid STDROMReaderDeInit(void *);\nu32 STDROMReaderSize(void *);\nint STDROMReaderSeek(void *, int, int);\nint STDROMReaderRead(void *, void *, u32);\n\nROMReader_struct STDROMReader =\n{\n\tROMREADER_STD,\n\t\"Standard ROM Reader\",\n\tSTDROMReaderInit,\n\tSTDROMReaderDeInit,\n\tSTDROMReaderSize,\n\tSTDROMReaderSeek,\n\tSTDROMReaderRead\n};\n\nvoid * STDROMReaderInit(const char * filename)\n{\n#ifdef WIN32\n\tstruct _stat sb;\n#else\n\tstruct stat sb;\n#endif\n\tif (stat(filename, &sb) == -1)\n\t\treturn 0;\n\n \tif ((sb.st_mode & S_IFMT) != S_IFREG)\n\t\treturn 0;\n\n\treturn (void *) fopen(filename, \"rb\");\n}\n\nvoid STDROMReaderDeInit(void * file)\n{\n\tif (!file) return ;\n\tfclose((FILE*)file);\n}\n\nu32 STDROMReaderSize(void * file)\n{\n\tu32 size;\n\n\tif (!file) return 0 ;\n\n\tfseek((FILE*)file, 0, SEEK_END);\n\tsize = ftell((FILE*)file);\n\tfseek((FILE*)file, 0, SEEK_SET);\n\n\treturn size;\n}\n\nint STDROMReaderSeek(void * file, int offset, int whence)\n{\n\tif (!file) return 0 ;\n\treturn fseek((FILE*)file, offset, whence);\n}\n\nint STDROMReaderRead(void * file, void * buffer, u32 size)\n{\n\tif (!file) return 0 ;\n\treturn fread(buffer, 1, size, (FILE*)file);\n}\n\n#ifdef HAVE_LIBZ\nvoid * GZIPROMReaderInit(const char * filename);\nvoid GZIPROMReaderDeInit(void *);\nu32 GZIPROMReaderSize(void *);\nint GZIPROMReaderSeek(void *, int, int);\nint GZIPROMReaderRead(void *, void *, u32);\n\nROMReader_struct GZIPROMReader =\n{\n\tROMREADER_GZIP,\n\t\"Gzip ROM Reader\",\n\tGZIPROMReaderInit,\n\tGZIPROMReaderDeInit,\n\tGZIPROMReaderSize,\n\tGZIPROMReaderSeek,\n\tGZIPROMReaderRead\n};\n\nvoid * GZIPROMReaderInit(const char * filename)\n{\n\treturn (void*)gzopen(filename, \"rb\");\n}\n\nvoid GZIPROMReaderDeInit(void * file)\n{\n\tgzclose((gzFile)file);\n}\n\nu32 GZIPROMReaderSize(void * file)\n{\n\tchar useless[1024];\n\tu32 size = 0;\n\n\t/* FIXME this function should first save the current\n\t * position and restore it after size calculation */\n\tgzrewind((gzFile)file);\n\twhile (gzeof ((gzFile)file) == 0)\n\t\tsize += gzread((gzFile)file, useless, 1024);\n\tgzrewind((gzFile)file);\n\n\treturn size;\n}\n\nint GZIPROMReaderSeek(void * file, int offset, int whence)\n{\n\treturn gzseek((gzFile)file, offset, whence);\n}\n\nint GZIPROMReaderRead(void * file, void * buffer, u32 size)\n{\n\treturn gzread((gzFile)file, buffer, size);\n}\n#endif\n\n#ifdef HAVE_LIBZZIP\nvoid * ZIPROMReaderInit(const char * filename);\nvoid ZIPROMReaderDeInit(void *);\nu32 ZIPROMReaderSize(void *);\nint ZIPROMReaderSeek(void *, int, int);\nint ZIPROMReaderRead(void *, void *, u32);\n\nROMReader_struct ZIPROMReader =\n{\n\tROMREADER_ZIP,\n\t\"Zip ROM Reader\",\n\tZIPROMReaderInit,\n\tZIPROMReaderDeInit,\n\tZIPROMReaderSize,\n\tZIPROMReaderSeek,\n\tZIPROMReaderRead\n};\n\nvoid * ZIPROMReaderInit(const char * filename)\n{\n\tZZIP_DIR * dir = zzip_opendir(filename);\n\tZZIP_DIRENT * dirent = zzip_readdir(dir);\n\tif (dir != NULL)\n\t{\n\t\tchar tmp1[1024];\n\t\tchar tmp2[1024];\n\t\tmemset(tmp1,0,sizeof(tmp1));\n\t\tmemset(tmp2,0,sizeof(tmp2));\n\t\tstrncpy(tmp1, filename, strlen(filename) - 4);\n\t\tsprintf(tmp2, \"%s/%s\", tmp1, dirent->d_name);\n\t\treturn zzip_fopen(tmp2, \"rb\");\n\t}\n\treturn NULL;\n}\n\nvoid ZIPROMReaderDeInit(void * file)\n{\n\tzzip_close((ZZIP_FILE*)file);\n}\n\nu32 ZIPROMReaderSize(void * file)\n{\n\tu32 size;\n\n\tzzip_seek((ZZIP_FILE*)file, 0, SEEK_END);\n\tsize = zzip_tell((ZZIP_FILE*)file);\n\tzzip_seek((ZZIP_FILE*)file, 0, SEEK_SET);\n\n\treturn size;\n}\n\nint ZIPROMReaderSeek(void * file, int offset, int whence)\n{\n\treturn zzip_seek((ZZIP_FILE*)file, offset, whence);\n}\n\nint ZIPROMReaderRead(void * file, void * buffer, u32 size)\n{\n#ifdef ZZIP_OLD_READ\n\treturn zzip_read((ZZIP_FILE*)file, (char *) buffer, size);\n#else\n\treturn zzip_read((ZZIP_FILE*)file, buffer, size);\n#endif\n}\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ROMReader.h",
    "content": "/*\n\tCopyright (C) 2007 Guillaume Duhamel\n\tCopyright (C) 2007 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifdef HAVE_LIBZ\n#include <zlib.h>\n#endif\n#include <string.h>\n\n#include \"types.h\"\n\n#define ROMREADER_DEFAULT -1\n#define ROMREADER_STD\t0\n#define ROMREADER_GZIP\t1\n#define ROMREADER_ZIP\t2\n\ntypedef struct\n{\n\tint id;\n\tconst char * Name;\n\tvoid * (*Init)(const char * filename);\n\tvoid (*DeInit)(void * file);\n\tu32 (*Size)(void * file);\n\tint (*Seek)(void * file, int offset, int whence);\n\tint (*Read)(void * file, void * buffer, u32 size);\n} ROMReader_struct;\n\nextern ROMReader_struct STDROMReader;\n#ifdef HAVE_LIBZ\nextern ROMReader_struct GZIPROMReader;\n#endif\n#ifdef HAVE_LIBZZIP\nextern ROMReader_struct ZIPROMReader;\n#endif\n\nROMReader_struct * ROMReaderInit(char ** filename);\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/SPU.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006 Theo Berkau\n\tCopyright (C) 2008-2012 DeSmuME team\n\n\tIdeas borrowed from Stephane Dallongeville's SCSP core\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n\n#define _USE_MATH_DEFINES\n#include <math.h>\n#ifndef M_PI\n#define M_PI 3.1415926535897932386\n#endif\n\n#include <stdlib.h>\n#include <string.h>\n#include <queue>\n#include <vector>\n\n#include \"debug.h\"\n#include \"MMU.h\"\n#include \"SPU.h\"\n#include \"mem.h\"\n#include \"readwrite.h\"\n#include \"armcpu.h\"\n#include \"NDSSystem.h\"\n#include \"matrix.h\"\n\n\nstatic inline s16 read16(u32 addr) { return (s16)_MMU_read16<ARMCPU_ARM7,MMU_AT_DEBUG>(addr); }\nstatic inline u8 read08(u32 addr) { return _MMU_read08<ARMCPU_ARM7,MMU_AT_DEBUG>(addr); }\nstatic inline s8 read_s8(u32 addr) { return (s8)_MMU_read08<ARMCPU_ARM7,MMU_AT_DEBUG>(addr); }\n\n#define K_ADPCM_LOOPING_RECOVERY_INDEX 99999\n#define COSINE_INTERPOLATION_RESOLUTION 8192\n\n//#ifdef FASTBUILD\n\t#undef FORCEINLINE\n\t#define FORCEINLINE\n//#endif\n\n//static ISynchronizingAudioBuffer* synchronizer = metaspu_construct(ESynchMethod_Z);\nstatic ISynchronizingAudioBuffer* synchronizer = metaspu_construct(ESynchMethod_N);\n\nSPU_struct *SPU_core = 0;\nSPU_struct *SPU_user = 0;\nint SPU_currentCoreNum = SNDCORE_DUMMY;\nstatic int volume = 100;\n\n\nstatic size_t buffersize = 0;\nstatic ESynchMode synchmode = ESynchMode_DualSynchAsynch;\nstatic ESynchMethod synchmethod = ESynchMethod_N;\n\nstatic int SNDCoreId=-1;\nstatic SoundInterface_struct *SNDCore=NULL;\nextern SoundInterface_struct *SNDCoreList[];\n\n//const int shift = (FORMAT == 0 ? 2 : 1);\nstatic const int format_shift[] = { 2, 1, 3, 0 };\n\nstatic const s8 indextbl[8] =\n{\n\t-1, -1, -1, -1, 2, 4, 6, 8\n};\n\nstatic const u16 adpcmtbl[89] =\n{\n\t0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x0010,\n\t0x0011, 0x0013, 0x0015, 0x0017, 0x0019, 0x001C, 0x001F, 0x0022, 0x0025,\n\t0x0029, 0x002D, 0x0032, 0x0037, 0x003C, 0x0042, 0x0049, 0x0050, 0x0058,\n\t0x0061, 0x006B, 0x0076, 0x0082, 0x008F, 0x009D, 0x00AD, 0x00BE, 0x00D1,\n\t0x00E6, 0x00FD, 0x0117, 0x0133, 0x0151, 0x0173, 0x0198, 0x01C1, 0x01EE,\n\t0x0220, 0x0256, 0x0292, 0x02D4, 0x031C, 0x036C, 0x03C3, 0x0424, 0x048E,\n\t0x0502, 0x0583, 0x0610, 0x06AB, 0x0756, 0x0812, 0x08E0, 0x09C3, 0x0ABD,\n\t0x0BD0, 0x0CFF, 0x0E4C, 0x0FBA, 0x114C, 0x1307, 0x14EE, 0x1706, 0x1954,\n\t0x1BDC, 0x1EA5, 0x21B6, 0x2515, 0x28CA, 0x2CDF, 0x315B, 0x364B, 0x3BB9,\n\t0x41B2, 0x4844, 0x4F7E, 0x5771, 0x602F, 0x69CE, 0x7462, 0x7FFF\n};\n\nstatic const s16 wavedutytbl[8][8] = {\n\t{ -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF },\n\t{ -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF },\n\t{ -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF },\n\t{ -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF },\n\t{ -0x7FFF, -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF },\n\t{ -0x7FFF, -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF },\n\t{ -0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF },\n\t{ -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF, -0x7FFF }\n};\n\nstatic s32 precalcdifftbl[89][16];\nstatic u8 precalcindextbl[89][8];\nstatic double cos_lut[COSINE_INTERPOLATION_RESOLUTION];\n\nstatic const double ARM7_CLOCK = 33513982;\n\nstatic const double samples_per_hline = (DESMUME_SAMPLE_RATE / 59.8261f) / 263.0f;\n\nstatic double samples = 0;\n\ntemplate<typename T>\nstatic FORCEINLINE T MinMax(T val, T min, T max)\n{\n\tif (val < min)\n\t\treturn min;\n\telse if (val > max)\n\t\treturn max;\n\n\treturn val;\n}\n\n//--------------external spu interface---------------\n\nint SPU_ChangeSoundCore(int coreid, int buffersize)\n{\n\tint i;\n\n\t::buffersize = buffersize;\n\n\tdelete SPU_user; SPU_user = NULL;\n\n\t// Make sure the old core is freed\n\tif (SNDCore)\n\t\tSNDCore->DeInit();\n\n\t// So which core do we want?\n\tif (coreid == SNDCORE_DEFAULT)\n\t\tcoreid = 0; // Assume we want the first one\n\n\tSPU_currentCoreNum = coreid;\n\n\t// Go through core list and find the id\n\tfor (i = 0; SNDCoreList[i] != NULL; i++)\n\t{\n\t\tif (SNDCoreList[i]->id == coreid)\n\t\t{\n\t\t\t// Set to current core\n\t\t\tSNDCore = SNDCoreList[i];\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tSNDCoreId = coreid;\n\n\t//If the user picked the dummy core, disable the user spu\n\tif(SNDCore == &SNDDummy)\n\t\treturn 0;\n\n\t//If the core wasnt found in the list for some reason, disable the user spu\n\tif (SNDCore == NULL)\n\t\treturn -1;\n\n\t// Since it failed, instead of it being fatal, disable the user spu\n\tif (SNDCore->Init(buffersize * 2) == -1)\n\t{\n\t\tSNDCore = 0;\n\t\treturn -1;\n\t}\n\n\tSNDCore->SetVolume(volume);\n\n\tSPU_SetSynchMode(synchmode,synchmethod);\n\n\treturn 0;\n}\n\nSoundInterface_struct *SPU_SoundCore()\n{\n\treturn SNDCore;\n}\n\nvoid SPU_ReInit()\n{\n\tSPU_Init(SNDCoreId, buffersize);\n}\n\nint SPU_Init(int coreid, int buffersize)\n{\n\tint i, j;\n\t\n\t// Build the cosine interpolation LUT\n\tfor(unsigned int i = 0; i < COSINE_INTERPOLATION_RESOLUTION; i++)\n\t\tcos_lut[i] = (1.0 - cos(((double)i/(double)COSINE_INTERPOLATION_RESOLUTION) * M_PI)) * 0.5;\n\n\tSPU_core = new SPU_struct((int)ceil(samples_per_hline));\n\tSPU_Reset();\n\n\t//create adpcm decode accelerator lookups\n\tfor(i = 0; i < 16; i++)\n\t{\n\t\tfor(j = 0; j < 89; j++)\n\t\t{\n\t\t\tprecalcdifftbl[j][i] = (((i & 0x7) * 2 + 1) * adpcmtbl[j] / 8);\n\t\t\tif(i & 0x8) precalcdifftbl[j][i] = -precalcdifftbl[j][i];\n\t\t}\n\t}\n\tfor(i = 0; i < 8; i++)\n\t{\n\t\tfor(j = 0; j < 89; j++)\n\t\t{\n\t\t\tprecalcindextbl[j][i] = MinMax((j + indextbl[i]), 0, 88);\n\t\t}\n\t}\n\n\treturn SPU_ChangeSoundCore(coreid, buffersize);\n}\n\nvoid SPU_Pause(int pause)\n{\n\tif (SNDCore == NULL) return;\n\n\tif(pause)\n\t\tSNDCore->MuteAudio();\n\telse\n\t\tSNDCore->UnMuteAudio();\n}\n\nvoid SPU_CloneUser()\n{\n\tif(SPU_user) {\n\t\tmemcpy(SPU_user->channels,SPU_core->channels,sizeof(SPU_core->channels));\n\t\tSPU_user->regs = SPU_core->regs;\n\t}\n}\n\n\nvoid SPU_SetSynchMode(int mode, int method)\n{\n\tsynchmode = (ESynchMode)mode;\n\tif(synchmethod != (ESynchMethod)method)\n\t{\n\t\tsynchmethod = (ESynchMethod)method;\n\t\tdelete synchronizer;\n\t\t//grr does this need to be locked? spu might need a lock method\n\t\t  // or maybe not, maybe the platform-specific code that calls this function can deal with it.\n\t\tsynchronizer = metaspu_construct(synchmethod);\n\t}\n\n\tdelete SPU_user;\n\tSPU_user = NULL;\n\t\t\n\tif(synchmode == ESynchMode_DualSynchAsynch)\n\t{\n\t\tSPU_user = new SPU_struct(buffersize);\n\t\tSPU_CloneUser();\n\t}\n}\n\nvoid SPU_ClearOutputBuffer()\n{\n\tif(SNDCore && SNDCore->ClearBuffer)\n\t\tSNDCore->ClearBuffer();\n}\n\nvoid SPU_SetVolume(int volume)\n{\n\t::volume = volume;\n\tif (SNDCore)\n\t\tSNDCore->SetVolume(volume);\n}\n\n\nvoid SPU_Reset(void)\n{\n\tint i;\n\n\tSPU_core->reset();\n\n\tif(SPU_user) {\n\t\tif(SNDCore)\n\t\t{\n\t\t\tSNDCore->DeInit();\n\t\t\tSNDCore->Init(SPU_user->bufsize*2);\n\t\t\tSNDCore->SetVolume(volume);\n\t\t}\n\t\tSPU_user->reset();\n\t}\n\n\t//zero - 09-apr-2010: this concerns me, regarding savestate synch.\n\t//After 0.9.6, lets experiment with removing it and just properly zapping the spu instead\n\t// Reset Registers\n\tfor (i = 0x400; i < 0x51D; i++)\n\t\tT1WriteByte(MMU.ARM7_REG, i, 0);\n\n\tsamples = 0;\n}\n\n//------------------------------------------\n\nvoid SPU_struct::reset()\n{\n\tmemset(sndbuf,0,bufsize*2*4);\n\tmemset(outbuf,0,bufsize*2*2);\n\n\tmemset((void *)channels, 0, sizeof(channel_struct) * 16);\n\n\treconstruct(&regs);\n\n\tfor(int i = 0; i < 16; i++)\n\t{\n\t\tchannels[i].num = i;\n\t}\n}\n\nSPU_struct::SPU_struct(int buffersize)\n\t: bufpos(0)\n\t, buflength(0)\n\t, sndbuf(0)\n\t, outbuf(0)\n\t, bufsize(buffersize)\n{\n\tsndbuf = new s32[buffersize*2];\n\toutbuf = new s16[buffersize*2];\n\treset();\n}\n\nSPU_struct::~SPU_struct()\n{\n\tif(sndbuf) delete[] sndbuf;\n\tif(outbuf) delete[] outbuf;\n}\n\nvoid SPU_DeInit(void)\n{\n\tif(SNDCore)\n\t\tSNDCore->DeInit();\n\tSNDCore = 0;\n\n\tdelete SPU_core; SPU_core=0;\n\tdelete SPU_user; SPU_user=0;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SPU_struct::ShutUp()\n{\n\tfor(int i=0;i<16;i++)\n\t\t channels[i].status = CHANSTAT_STOPPED;\n}\n\nstatic FORCEINLINE void adjust_channel_timer(channel_struct *chan)\n{\n\tchan->sampinc = (((double)ARM7_CLOCK) / (DESMUME_SAMPLE_RATE * 2)) / (double)(0x10000 - chan->timer);\n}\n\nvoid SPU_struct::KeyProbe(int chan_num)\n{\n\tchannel_struct &thischan = channels[chan_num];\n\tif(thischan.status == CHANSTAT_STOPPED)\n\t{\n\t\tif(thischan.keyon && regs.masteren)\n\t\t\tKeyOn(chan_num);\n\t}\n\telse if(thischan.status == CHANSTAT_PLAY)\n\t{\n\t\tif(!thischan.keyon || !regs.masteren)\n\t\t\tKeyOff(chan_num);\n\t}\n}\n\nvoid SPU_struct::KeyOff(int channel)\n{\n\t//printf(\"keyoff%d\\n\",channel);\n\tchannel_struct &thischan = channels[channel];\n\tthischan.status = CHANSTAT_STOPPED;\n}\n\nvoid SPU_struct::KeyOn(int channel)\n{\n\tchannel_struct &thischan = channels[channel];\n\tthischan.status = CHANSTAT_PLAY;\n\n\tthischan.totlength = thischan.length + thischan.loopstart;\n\tadjust_channel_timer(&thischan);\n\n\t//printf(\"keyon %d totlength:%d\\n\",channel,thischan.totlength);\n\n\n\t//LOG(\"Channel %d key on: vol = %d, datashift = %d, hold = %d, pan = %d, waveduty = %d, repeat = %d, format = %d, source address = %07X,\"\n\t//\t\t\"timer = %04X, loop start = %04X, length = %06X, MMU.ARM7_REG[0x501] = %02X\\n\", channel, chan->vol, chan->datashift, chan->hold, \n\t//\t\tchan->pan, chan->waveduty, chan->repeat, chan->format, chan->addr, chan->timer, chan->loopstart, chan->length, T1ReadByte(MMU.ARM7_REG, 0x501));\n\n\tswitch(thischan.format)\n\t{\n\tcase 0: // 8-bit\n\t//\tthischan.loopstart = thischan.loopstart << 2;\n\t//\tthischan.length = (thischan.length << 2) + thischan.loopstart;\n\t\tthischan.sampcnt = -3;\n\t\tbreak;\n\tcase 1: // 16-bit\n\t//\tthischan.loopstart = thischan.loopstart << 1;\n\t//\tthischan.length = (thischan.length << 1) + thischan.loopstart;\n\t\tthischan.sampcnt = -3;\n\t\tbreak;\n\tcase 2: // ADPCM\n\t\t{\n\t\t\tthischan.pcm16b = (s16)read16(thischan.addr);\n\t\t\tthischan.pcm16b_last = thischan.pcm16b;\n\t\t\tthischan.index = read08(thischan.addr + 2) & 0x7F;;\n\t\t\tthischan.lastsampcnt = 7;\n\t\t\tthischan.sampcnt = -3;\n\t\t\tthischan.loop_index = K_ADPCM_LOOPING_RECOVERY_INDEX;\n\t\t//\tthischan.loopstart = thischan.loopstart << 3;\n\t\t//\tthischan.length = (thischan.length << 3) + thischan.loopstart;\n\t\t\tbreak;\n\t\t}\n\tcase 3: // PSG\n\t\t{\n\t\t\tthischan.sampcnt = -1;\n\t\t\tthischan.x = 0x7FFF;\n\t\t\tbreak;\n\t\t}\n\tdefault: break;\n\t}\n\n\tthischan.double_totlength_shifted = (double)(thischan.totlength << format_shift[thischan.format]);\n\n\tif(thischan.format != 3)\n\t{\n\t\tif(thischan.double_totlength_shifted == 0)\n\t\t{\n\t\t\tprintf(\"INFO: Stopping channel %d due to zero length\\n\",channel);\n\t\t\tthischan.status = CHANSTAT_STOPPED;\n\t\t}\n\t}\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\n#define SETBYTE(which,oldval,newval) oldval = (oldval & (~(0xFF<<(which*8)))) | ((newval)<<(which*8))\n#define GETBYTE(which,val) ((val>>(which*8))&0xFF)\n\n\nu8 SPU_ReadByte(u32 addr) { \n\taddr &= 0xFFF;\n\treturn SPU_core->ReadByte(addr);\n}\nu16 SPU_ReadWord(u32 addr) {\n\taddr &= 0xFFF;\n\treturn SPU_core->ReadWord(addr);\n}\nu32 SPU_ReadLong(u32 addr) {\n\taddr &= 0xFFF;\n\treturn SPU_core->ReadLong(addr);\n}\n\nu16 SPU_struct::ReadWord(u32 addr)\n{\n\treturn ReadByte(addr)|(ReadByte(addr+1)<<8);\n}\n\nu32 SPU_struct::ReadLong(u32 addr)\n{\n\treturn ReadByte(addr)|(ReadByte(addr+1)<<8)|(ReadByte(addr+2)<<16)|(ReadByte(addr+3)<<24);\n}\n\nu8 SPU_struct::ReadByte(u32 addr)\n{\n\tswitch(addr)\n\t{\n\t//SOUNDCNT\n\tcase 0x500: return regs.mastervol;\n\tcase 0x501: \n\t\treturn (regs.ctl_left)|(regs.ctl_right<<2)|(regs.ctl_ch1bypass<<4)|(regs.ctl_ch3bypass<<5)|(regs.masteren<<7);\n\tcase 0x502: return 0;\n\tcase 0x503: return 0;\n\n\t//SOUNDBIAS\n\tcase 0x504: return regs.soundbias&0xFF;\n\tcase 0x505: return (regs.soundbias>>8)&0xFF;\n\tcase 0x506: return 0;\n\tcase 0x507: return 0;\n\t\n\t//SNDCAP0CNT/SNDCAP1CNT\n\tcase 0x508:\n\tcase 0x509: {\n\t\tu32 which = addr-0x508;\n\t\treturn regs.cap[which].add\n\t\t\t| (regs.cap[which].source<<1)\n\t\t\t| (regs.cap[which].oneshot<<2)\n\t\t\t| (regs.cap[which].bits8<<3)\n\t\t\t//| (regs.cap[which].active<<7); //? which is right? need test\n\t\t\t| (regs.cap[which].runtime.running<<7);\n\t}\t\n\n\t//SNDCAP0DAD\n\tcase 0x510: return GETBYTE(0,regs.cap[0].dad);\n\tcase 0x511: return GETBYTE(1,regs.cap[0].dad);\n\tcase 0x512: return GETBYTE(2,regs.cap[0].dad);\n\tcase 0x513: return GETBYTE(3,regs.cap[0].dad);\n\n\t//SNDCAP0LEN\n\tcase 0x514: return GETBYTE(0,regs.cap[0].len);\n\tcase 0x515: return GETBYTE(1,regs.cap[0].len);\n\tcase 0x516: return 0; //not used\n\tcase 0x517: return 0; //not used\n\n\t//SNDCAP1DAD\n\tcase 0x518: return GETBYTE(0,regs.cap[1].dad);\n\tcase 0x519: return GETBYTE(1,regs.cap[1].dad);\n\tcase 0x51A: return GETBYTE(2,regs.cap[1].dad);\n\tcase 0x51B: return GETBYTE(3,regs.cap[1].dad);\n\n\t//SNDCAP1LEN\n\tcase 0x51C: return GETBYTE(0,regs.cap[1].len);\n\tcase 0x51D: return GETBYTE(1,regs.cap[1].len);\n\tcase 0x51E: return 0; //not used\n\tcase 0x51F: return 0; //not used\n\n\tdefault: {\n\t\t//individual channel regs\n\n\t\tu32 chan_num = (addr >> 4) & 0xF;\n\t\tif(chan_num>0xF) return 0;\n\t\tchannel_struct &thischan=channels[chan_num];\n\n\t\tswitch(addr & 0xF) {\n\t\t\tcase 0x0: return thischan.vol;\n\t\t\tcase 0x1: {\n\t\t\t\tu8 ret = thischan.datashift;\n\t\t\t\tif(ret==4) ret=3;\n\t\t\t\tret |= thischan.hold<<7;\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase 0x2: return thischan.pan;\n\t\t\tcase 0x3: return thischan.waveduty|(thischan.repeat<<3)|(thischan.format<<5)|((thischan.status == CHANSTAT_PLAY)?0x80:0);\n\t\t\tcase 0x4: return 0; //return GETBYTE(0,thischan.addr); //not readable\n\t\t\tcase 0x5: return 0; //return GETBYTE(1,thischan.addr); //not readable\n\t\t\tcase 0x6: return 0; //return GETBYTE(2,thischan.addr); //not readable\n\t\t\tcase 0x7: return 0; //return GETBYTE(3,thischan.addr); //not readable\n\t\t\tcase 0x8: return GETBYTE(0,thischan.timer);\n\t\t\tcase 0x9: return GETBYTE(1,thischan.timer);\n\t\t\tcase 0xA: return GETBYTE(0,thischan.loopstart);\n\t\t\tcase 0xB: return GETBYTE(1,thischan.loopstart);\n\t\t\tcase 0xC: return 0; //return GETBYTE(0,thischan.length); //not readable\n\t\t\tcase 0xD: return 0; //return GETBYTE(1,thischan.length); //not readable\n\t\t\tcase 0xE: return 0; //return GETBYTE(2,thischan.length); //not readable\n\t\t\tcase 0xF: return 0; //return GETBYTE(3,thischan.length); //not readable\n\t\t\tdefault: return 0; //impossible\n\t\t} //switch on individual channel regs\n\t\t} //default case\n\t} //switch on address\n}\n\nSPUFifo::SPUFifo()\n{\n\treset();\n}\n\nvoid SPUFifo::reset()\n{\n\thead = tail = size = 0;\n}\n\nvoid SPUFifo::enqueue(s16 val)\n{\n\tif(size==16) return;\n\tbuffer[tail] = val;\n\ttail++;\n\ttail &= 15;\n\tsize++;\n}\n\ns16 SPUFifo::dequeue()\n{\n\tif(size==0) return 0;\n\thead++;\n\thead &= 15;\n\ts16 ret = buffer[head];\n\tsize--;\n\treturn ret;\n}\n\nvoid SPUFifo::save(EMUFILE* fp)\n{\n\tu32 version = 1;\n\twrite32le(version,fp);\n\twrite32le(head,fp);\n\twrite32le(tail,fp);\n\twrite32le(size,fp);\n\tfor(int i=0;i<16;i++)\n\t\twrite16le(buffer[i],fp);\n}\n\nbool SPUFifo::load(EMUFILE* fp)\n{\n\tu32 version;\n\tif(read32le(&version,fp) != 1) return false;\n\tread32le(&head,fp);\n\tread32le(&tail,fp);\n\tread32le(&size,fp);\n\tfor(int i=0;i<16;i++)\n\t\tread16le(&buffer[i],fp);\n\treturn true;\n}\n\nvoid SPU_struct::ProbeCapture(int which)\n{\n\t//VERY UNTESTED -- HOW MUCH OF THIS RESETS, AND WHEN?\n\n\tif(!regs.cap[which].active)\n\t{\n\t\tregs.cap[which].runtime.running = 0;\n\t\treturn;\n\t}\n\n\tREGS::CAP &cap = regs.cap[which];\n\tcap.runtime.running = 1;\n\tcap.runtime.curdad = cap.dad;\n\tu32 len = cap.len;\n\tif(len==0) len=1;\n\tcap.runtime.maxdad = cap.dad + len*4;\n\tcap.runtime.sampcnt = 0;\n\tcap.runtime.fifo.reset();\n}\n\nvoid SPU_struct::WriteByte(u32 addr, u8 val)\n{\n\tswitch(addr)\n\t{\n\t//SOUNDCNT\n\tcase 0x500:\n\t\tregs.mastervol = val&0x7F;\n\t\tbreak;\n\tcase 0x501:\n\t\tregs.ctl_left  = (val>>0)&3;\n\t\tregs.ctl_right = (val>>2)&3;\n\t\tregs.ctl_ch1bypass = (val>>4)&1;\n\t\tregs.ctl_ch3bypass = (val>>5)&1;\n\t\tregs.masteren = (val>>7)&1;\n\t\tfor(int i=0;i<16;i++)\n\t\t\tKeyProbe(i);\n\t\tbreak;\n\tcase 0x502: break; //not used\n\tcase 0x503: break; //not used\n\n\t//SOUNDBIAS\n\tcase 0x504: SETBYTE(0,regs.soundbias, val); break;\n\tcase 0x505: SETBYTE(1,regs.soundbias, val&3); break;\n\tcase 0x506: break; //these dont answer anyway\n\tcase 0x507: break; //these dont answer anyway\n\n\t//SNDCAP0CNT/SNDCAP1CNT\n\tcase 0x508:\n\tcase 0x509: {\n\t\tu32 which = addr-0x508;\n\t\tregs.cap[which].add = BIT0(val);\n\t\tregs.cap[which].source = BIT1(val);\n\t\tregs.cap[which].oneshot = BIT2(val);\n\t\tregs.cap[which].bits8 = BIT3(val);\n\t\tregs.cap[which].active = BIT7(val);\n\t\tProbeCapture(which);\n\t\tbreak;\n\t}\n\n\t//SNDCAP0DAD\n\tcase 0x510: SETBYTE(0,regs.cap[0].dad,val); break;\n\tcase 0x511: SETBYTE(1,regs.cap[0].dad,val); break;\n\tcase 0x512: SETBYTE(2,regs.cap[0].dad,val); break;\n\tcase 0x513: SETBYTE(3,regs.cap[0].dad,val&7); break;\n\n\t//SNDCAP0LEN\n\tcase 0x514: SETBYTE(0,regs.cap[0].len,val); break;\n\tcase 0x515: SETBYTE(1,regs.cap[0].len,val); break;\n\tcase 0x516: break; //not used\n\tcase 0x517: break; //not used\n\n\t//SNDCAP1DAD\n\tcase 0x518: SETBYTE(0,regs.cap[1].dad,val); break;\n\tcase 0x519: SETBYTE(1,regs.cap[1].dad,val); break;\n\tcase 0x51A: SETBYTE(2,regs.cap[1].dad,val); break;\n\tcase 0x51B: SETBYTE(3,regs.cap[1].dad,val&7); break;\n\n\t//SNDCAP1LEN\n\tcase 0x51C: SETBYTE(0,regs.cap[1].len,val); break;\n\tcase 0x51D: SETBYTE(1,regs.cap[1].len,val); break;\n\tcase 0x51E: break; //not used\n\tcase 0x51F: break; //not used\n\n\n\t\n\tdefault: {\n\t\t//individual channel regs\n\t\t\n\t\tu32 chan_num = (addr >> 4) & 0xF;\n\t\tif(chan_num>0xF) break;\n\t\tchannel_struct &thischan=channels[chan_num];\n\n\t\tswitch(addr & 0xF) {\n\t\t\tcase 0x0:\n\t\t\t\tthischan.vol = val & 0x7F;\n\t\t\t\tbreak;\n\t\t\tcase 0x1:\n\t\t\t\tthischan.datashift = val & 0x3;\n\t\t\t\tif (thischan.datashift == 3)\n\t\t\t\t\tthischan.datashift = 4;\n\t\t\t\tthischan.hold = (val >> 7) & 0x1;\n\t\t\t\tbreak;\n\t\t\tcase 0x2:\n\t\t\t\tthischan.pan = val & 0x7F;\n\t\t\t\tbreak;\n\t\t\tcase 0x3:\n\t\t\t\tthischan.waveduty = val & 0x7;\n\t\t\t\tthischan.repeat = (val >> 3) & 0x3;\n\t\t\t\tthischan.format = (val >> 5) & 0x3;\n\t\t\t\tthischan.keyon = BIT7(val);\n\t\t\t\tKeyProbe(chan_num);\n\t\t\t\tbreak;\n\t\t\tcase 0x4: SETBYTE(0,thischan.addr,val); break;\n\t\t\tcase 0x5: SETBYTE(1,thischan.addr,val); break;\n\t\t\tcase 0x6: SETBYTE(2,thischan.addr,val); break;\n\t\t\tcase 0x7: SETBYTE(3,thischan.addr,val&0x7); break; //only 27 bits of this register are used\n\t\t\tcase 0x8: \n\t\t\t\tSETBYTE(0,thischan.timer,val); \n\t\t\t\tadjust_channel_timer(&thischan);\n\t\t\t\tbreak;\n\t\t\tcase 0x9: \n\t\t\t\tSETBYTE(1,thischan.timer,val); \n\t\t\t\tadjust_channel_timer(&thischan);\n\t\t\t\tbreak;\n\t\t\tcase 0xA: SETBYTE(0,thischan.loopstart,val); break;\n\t\t\tcase 0xB: SETBYTE(1,thischan.loopstart,val); break;\n\t\t\tcase 0xC: SETBYTE(0,thischan.length,val); break;\n\t\t\tcase 0xD: SETBYTE(1,thischan.length,val); break;\n\t\t\tcase 0xE: SETBYTE(2,thischan.length,val & 0x3F); break; //only 22 bits of this register are used\n\t\t\tcase 0xF: SETBYTE(3,thischan.length,0); break;\n\t\t} //switch on individual channel regs\n\t\t} //default case\n\t} //switch on address\n}\n\nvoid SPU_WriteByte(u32 addr, u8 val)\n{\n\t//printf(\"%08X: chan:%02X reg:%02X val:%02X\\n\",addr,(addr>>4)&0xF,addr&0xF,val);\n\taddr &= 0xFFF;\n\n\tSPU_core->WriteByte(addr,val);\n\tif(SPU_user) SPU_user->WriteByte(addr,val);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SPU_struct::WriteWord(u32 addr, u16 val)\n{\n\tWriteByte(addr,val&0xFF);\n\tWriteByte(addr+1,(val>>8)&0xFF);\n}\n\nvoid SPU_WriteWord(u32 addr, u16 val)\n{\n\t//printf(\"%08X: chan:%02X reg:%02X val:%04X\\n\",addr,(addr>>4)&0xF,addr&0xF,val);\n\taddr &= 0xFFF;\n\n\tSPU_core->WriteWord(addr,val);\n\tif(SPU_user) SPU_user->WriteWord(addr,val);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SPU_struct::WriteLong(u32 addr, u32 val)\n{\n\tWriteByte(addr,val&0xFF);\n\tWriteByte(addr+1,(val>>8)&0xFF);\n\tWriteByte(addr+2,(val>>16)&0xFF);\n\tWriteByte(addr+3,(val>>24)&0xFF);\n}\n\nvoid SPU_WriteLong(u32 addr, u32 val)\n{\n\t//printf(\"%08X: chan:%02X reg:%02X val:%08X\\n\",addr,(addr>>4)&0xF,addr&0xF,val);\n\taddr &= 0xFFF;\n\n\tSPU_core->WriteLong(addr,val);\n\tif(SPU_user) \n\t\tSPU_user->WriteLong(addr,val);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate<SPUInterpolationMode INTERPOLATE_MODE> static FORCEINLINE s32 Interpolate(s32 a, s32 b, double ratio)\n{\n\tdouble sampleA = (double)a;\n\tdouble sampleB = (double)b;\n\tratio = ratio - sputrunc(ratio);\n\t\n\tswitch (INTERPOLATE_MODE)\n\t{\n\t\tcase SPUInterpolation_Cosine:\n\t\t\t// Cosine Interpolation Formula:\n\t\t\t// ratio2 = (1 - cos(ratio * M_PI)) / 2\n\t\t\t// sampleI = sampleA * (1 - ratio2) + sampleB * ratio2\n\t\t\treturn s32floor((cos_lut[(unsigned int)(ratio * (double)COSINE_INTERPOLATION_RESOLUTION)] * (sampleB - sampleA)) + sampleA);\n\t\t\tbreak;\n\t\t\t\n\t\tcase SPUInterpolation_Linear:\n\t\t\t// Linear Interpolation Formula:\n\t\t\t// sampleI = sampleA * (1 - ratio) + sampleB * ratio\n\t\t\treturn s32floor((ratio * (sampleB - sampleA)) + sampleA);\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\t\n\treturn a;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate<SPUInterpolationMode INTERPOLATE_MODE> static FORCEINLINE void Fetch8BitData(channel_struct *chan, s32 *data)\n{\n\tif (chan->sampcnt < 0)\n\t{\n\t\t*data = 0;\n\t\treturn;\n\t}\n\n\tu32 loc = sputrunc(chan->sampcnt);\n\tif(INTERPOLATE_MODE != SPUInterpolation_None)\n\t{\n\t\ts32 a = (s32)(read_s8(chan->addr + loc) << 8);\n\t\tif(loc < (chan->totlength << 2) - 1) {\n\t\t\ts32 b = (s32)(read_s8(chan->addr + loc + 1) << 8);\n\t\t\ta = Interpolate<INTERPOLATE_MODE>(a, b, chan->sampcnt);\n\t\t}\n\t\t*data = a;\n\t}\n\telse\n\t\t*data = (s32)read_s8(chan->addr + loc)<< 8;\n}\n\ntemplate<SPUInterpolationMode INTERPOLATE_MODE> static FORCEINLINE void Fetch16BitData(const channel_struct * const chan, s32 *data)\n{\n\tif (chan->sampcnt < 0)\n\t{\n\t\t*data = 0;\n\t\treturn;\n\t}\n\n\tif(INTERPOLATE_MODE != SPUInterpolation_None)\n\t{\n\t\tu32 loc = sputrunc(chan->sampcnt);\n\t\t\n\t\ts32 a = (s32)read16(loc*2 + chan->addr), b;\n\t\tif(loc < (chan->totlength << 1) - 1)\n\t\t{\n\t\t\tb = (s32)read16(loc*2 + chan->addr + 2);\n\t\t\ta = Interpolate<INTERPOLATE_MODE>(a, b, chan->sampcnt);\n\t\t}\n\t\t*data = a;\n\t}\n\telse\n\t\t*data = read16(chan->addr + sputrunc(chan->sampcnt)*2);\n}\n\ntemplate<SPUInterpolationMode INTERPOLATE_MODE> static FORCEINLINE void FetchADPCMData(channel_struct * const chan, s32 * const data)\n{\n\tif (chan->sampcnt < 8)\n\t{\n\t\t*data = 0;\n\t\treturn;\n\t}\n\n\t// No sense decoding, just return the last sample\n\tif (chan->lastsampcnt != sputrunc(chan->sampcnt)){\n\n\t\tconst u32 endExclusive = sputrunc(chan->sampcnt+1);\n\t\tfor (u32 i = chan->lastsampcnt+1; i < endExclusive; i++)\n\t\t{\n\t\t\tconst u32 shift = (i&1)<<2;\n\t\t\tconst u32 data4bit = ((u32)read08(chan->addr + (i>>1))) >> shift;\n\n\t\t\tconst s32 diff = precalcdifftbl[chan->index][data4bit & 0xF];\n\t\t\tchan->index = precalcindextbl[chan->index][data4bit & 0x7];\n\n\t\t\tchan->pcm16b_last = chan->pcm16b;\n\t\t\tchan->pcm16b = MinMax(chan->pcm16b+diff, -0x8000, 0x7FFF);\n\n\t\t\tif(i == (chan->loopstart<<3)) {\n\t\t\t\tif(chan->loop_index != K_ADPCM_LOOPING_RECOVERY_INDEX) printf(\"over-snagging\\n\");\n\t\t\t\tchan->loop_pcm16b = chan->pcm16b;\n\t\t\t\tchan->loop_index = chan->index;\n\t\t\t}\n\t\t}\n\n\t\tchan->lastsampcnt = sputrunc(chan->sampcnt);\n\t}\n\n\tif(INTERPOLATE_MODE != SPUInterpolation_None)\n\t\t*data = Interpolate<INTERPOLATE_MODE>((s32)chan->pcm16b_last,(s32)chan->pcm16b,chan->sampcnt);\n\telse\n\t\t*data = (s32)chan->pcm16b;\n}\n\nstatic FORCEINLINE void FetchPSGData(channel_struct *chan, s32 *data)\n{\n\tif (chan->sampcnt < 0)\n\t{\n\t\t*data = 0;\n\t\treturn;\n\t}\n\n\tif(chan->num < 8)\n\t{\n\t\t*data = 0;\n\t}\n\telse if(chan->num < 14)\n\t{\n\t\t*data = (s32)wavedutytbl[chan->waveduty][(sputrunc(chan->sampcnt)) & 0x7];\n\t}\n\telse\n\t{\n\t\tif(chan->lastsampcnt == sputrunc(chan->sampcnt))\n\t\t{\n\t\t\t*data = (s32)chan->psgnoise_last;\n\t\t\treturn;\n\t\t}\n\n\t\tu32 max = sputrunc(chan->sampcnt);\n\t\tfor(u32 i = chan->lastsampcnt; i < max; i++)\n\t\t{\n\t\t\tif(chan->x & 0x1)\n\t\t\t{\n\t\t\t\tchan->x = (chan->x >> 1) ^ 0x6000;\n\t\t\t\tchan->psgnoise_last = -0x7FFF;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tchan->x >>= 1;\n\t\t\t\tchan->psgnoise_last = 0x7FFF;\n\t\t\t}\n\t\t}\n\n\t\tchan->lastsampcnt = sputrunc(chan->sampcnt);\n\n\t\t*data = (s32)chan->psgnoise_last;\n\t}\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nstatic FORCEINLINE void MixL(SPU_struct* SPU, channel_struct *chan, s32 data)\n{\n\tdata = spumuldiv7(data, chan->vol) >> chan->datashift;\n\tSPU->sndbuf[SPU->bufpos<<1] += data;\n}\n\nstatic FORCEINLINE void MixR(SPU_struct* SPU, channel_struct *chan, s32 data)\n{\n\tdata = spumuldiv7(data, chan->vol) >> chan->datashift;\n\tSPU->sndbuf[(SPU->bufpos<<1)+1] += data;\n}\n\nstatic FORCEINLINE void MixLR(SPU_struct* SPU, channel_struct *chan, s32 data)\n{\n\tdata = spumuldiv7(data, chan->vol) >> chan->datashift;\n\tSPU->sndbuf[SPU->bufpos<<1] += spumuldiv7(data, 127 - chan->pan);\n\tSPU->sndbuf[(SPU->bufpos<<1)+1] += spumuldiv7(data, chan->pan);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\ntemplate<int FORMAT> static FORCEINLINE void TestForLoop(SPU_struct *SPU, channel_struct *chan)\n{\n\tconst int shift = (FORMAT == 0 ? 2 : 1);\n\n\tchan->sampcnt += chan->sampinc;\n\n\tif (chan->sampcnt > chan->double_totlength_shifted)\n\t{\n\t\t// Do we loop? Or are we done?\n\t\tif (chan->repeat == 1)\n\t\t{\n\t\t\twhile (chan->sampcnt > chan->double_totlength_shifted)\n\t\t\t\tchan->sampcnt -= chan->double_totlength_shifted - (double)(chan->loopstart << shift);\n\t\t\t//chan->sampcnt = (double)(chan->loopstart << shift);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSPU->KeyOff(chan->num);\n\t\t\tSPU->bufpos = SPU->buflength;\n\t\t}\n\t}\n}\n\nstatic FORCEINLINE void TestForLoop2(SPU_struct *SPU, channel_struct *chan)\n{\n\tchan->sampcnt += chan->sampinc;\n\n\tif (chan->sampcnt > chan->double_totlength_shifted)\n\t{\n\t\t// Do we loop? Or are we done?\n\t\tif (chan->repeat == 1)\n\t\t{\n\t\t\twhile (chan->sampcnt > chan->double_totlength_shifted)\n\t\t\t\tchan->sampcnt -= chan->double_totlength_shifted - (double)(chan->loopstart << 3);\n\n\t\t\tif(chan->loop_index == K_ADPCM_LOOPING_RECOVERY_INDEX)\n\t\t\t{\n\t\t\t\tchan->pcm16b = (s16)read16(chan->addr);\n\t\t\t\tchan->index = read08(chan->addr+2) & 0x7F;\n\t\t\t\tchan->lastsampcnt = 7;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tchan->pcm16b = chan->loop_pcm16b;\n\t\t\t\tchan->index = chan->loop_index;\n\t\t\t\tchan->lastsampcnt = (chan->loopstart << 3);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tchan->status = CHANSTAT_STOPPED;\n\t\t\tSPU->KeyOff(chan->num);\n\t\t\tSPU->bufpos = SPU->buflength;\n\t\t}\n\t}\n}\n\ntemplate<int CHANNELS> FORCEINLINE static void SPU_Mix(SPU_struct* SPU, channel_struct *chan, s32 data)\n{\n\tswitch(CHANNELS)\n\t{\n\t\tcase 0: MixL(SPU, chan, data); break;\n\t\tcase 1: MixLR(SPU, chan, data); break;\n\t\tcase 2: MixR(SPU, chan, data); break;\n\t}\n\tSPU->lastdata = data;\n}\n\n//WORK\ntemplate<int FORMAT, SPUInterpolationMode INTERPOLATE_MODE, int CHANNELS> \n\tFORCEINLINE static void ____SPU_ChanUpdate(SPU_struct* const SPU, channel_struct* const chan)\n{\n\tfor (; SPU->bufpos < SPU->buflength; SPU->bufpos++)\n\t{\n\t\tif(CHANNELS != -1)\n\t\t{\n\t\t\ts32 data;\n\t\t\tswitch(FORMAT)\n\t\t\t{\n\t\t\t\tcase 0: Fetch8BitData<INTERPOLATE_MODE>(chan, &data); break;\n\t\t\t\tcase 1: Fetch16BitData<INTERPOLATE_MODE>(chan, &data); break;\n\t\t\t\tcase 2: FetchADPCMData<INTERPOLATE_MODE>(chan, &data); break;\n\t\t\t\tcase 3: FetchPSGData(chan, &data); break;\n\t\t\t}\n\t\t\tSPU_Mix<CHANNELS>(SPU, chan, data);\n\t\t}\n\n\t\tswitch(FORMAT) {\n\t\t\tcase 0: case 1: TestForLoop<FORMAT>(SPU, chan); break;\n\t\t\tcase 2: TestForLoop2(SPU, chan); break;\n\t\t\tcase 3: chan->sampcnt += chan->sampinc; break;\n\t\t}\n\t}\n}\n\ntemplate<int FORMAT, SPUInterpolationMode INTERPOLATE_MODE> \n\tFORCEINLINE static void ___SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan)\n{\n\tif(!actuallyMix)\n\t\t____SPU_ChanUpdate<FORMAT,INTERPOLATE_MODE,-1>(SPU,chan);\n\telse if (chan->pan == 0)\n\t\t____SPU_ChanUpdate<FORMAT,INTERPOLATE_MODE,0>(SPU,chan);\n\telse if (chan->pan == 127)\n\t\t____SPU_ChanUpdate<FORMAT,INTERPOLATE_MODE,2>(SPU,chan);\n\telse\n\t\t____SPU_ChanUpdate<FORMAT,INTERPOLATE_MODE,1>(SPU,chan);\n}\n\ntemplate<SPUInterpolationMode INTERPOLATE_MODE> \n\tFORCEINLINE static void __SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan)\n{\n\tswitch(chan->format)\n\t{\n\t\tcase 0: ___SPU_ChanUpdate<0,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break;\n\t\tcase 1: ___SPU_ChanUpdate<1,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break;\n\t\tcase 2: ___SPU_ChanUpdate<2,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break;\n\t\tcase 3: ___SPU_ChanUpdate<3,INTERPOLATE_MODE>(actuallyMix, SPU, chan); break;\n\t\tdefault: assert(false);\n\t}\n}\n\nFORCEINLINE static void _SPU_ChanUpdate(const bool actuallyMix, SPU_struct* const SPU, channel_struct* const chan)\n{\n\tswitch(CommonSettings.spuInterpolationMode)\n\t{\n\tcase SPUInterpolation_None: __SPU_ChanUpdate<SPUInterpolation_None>(actuallyMix, SPU, chan); break;\n\tcase SPUInterpolation_Linear: __SPU_ChanUpdate<SPUInterpolation_Linear>(actuallyMix, SPU, chan); break;\n\tcase SPUInterpolation_Cosine: __SPU_ChanUpdate<SPUInterpolation_Cosine>(actuallyMix, SPU, chan); break;\n\tdefault: assert(false);\n\t}\n}\n\n//ENTERNEW\nstatic void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length)\n{\n\t//the advanced spu function correctly handles all sound control mixing options, as well as capture\n\t//this code is not entirely optimal, as it relies on sort of manhandling the core mixing functions\n\t//in order to get the results it needs.\n\n\t//THIS IS MAX HACKS!!!!\n\t//AND NEEDS TO BE REWRITTEN ALONG WITH THE DEEPEST PARTS OF THE SPU\n\t//ONCE WE KNOW THAT IT WORKS\n\t\n\t//BIAS gets ignored since our spu is still not bit perfect,\n\t//and it doesnt matter for purposes of capture\n\n\t//-----------DEBUG CODE\n\tbool skipcap = false;\n\t//-----------------\n\n\ts32 samp0[2];\n\t\n\t//believe it or not, we are going to do this one sample at a time.\n\t//like i said, it is slower.\n\tfor(int samp=0;samp<length;samp++)\n\t{\n\t\tSPU->sndbuf[0] = 0;\n\t\tSPU->sndbuf[1] = 0;\n\t\tSPU->buflength = 1;\n\n\t\ts32 capmix[2] = {0,0};\n\t\ts32 mix[2] = {0,0};\n\t\ts32 chanout[16];\n\t\ts32 submix[32];\n\n\t\t//generate each channel, and helpfully mix it at the same time\n\t\tfor(int i=0;i<16;i++)\n\t\t{\n\t\t\tchannel_struct *chan = &SPU->channels[i];\n\n\t\t\tif (chan->status == CHANSTAT_PLAY)\n\t\t\t{\n\t\t\t\tSPU->bufpos = 0;\n\n\t\t\t\tbool bypass = false;\n\t\t\t\tif(i==1 && SPU->regs.ctl_ch1bypass) bypass=true;\n\t\t\t\tif(i==3 && SPU->regs.ctl_ch3bypass) bypass=true;\n\n\n\t\t\t\t//output to mixer unless we are bypassed.\n\t\t\t\t//dont output to mixer if the user muted us\n\t\t\t\tbool outputToMix = true;\n\t\t\t\tif(CommonSettings.spu_muteChannels[i]) outputToMix = false;\n\t\t\t\tif(bypass) outputToMix = false;\n\t\t\t\tbool outputToCap = outputToMix;\n\t\t\t\tif(CommonSettings.spu_captureMuted && !bypass) outputToCap = true;\n\n\t\t\t\t//channels 1 and 3 should probably always generate their audio\n\t\t\t\t//internally at least, just in case they get used by the spu output\n\t\t\t\tbool domix = outputToCap || outputToMix || i==1 || i==3;\n\n\t\t\t\t//clear the output buffer since this is where _SPU_ChanUpdate wants to accumulate things\n\t\t\t\tSPU->sndbuf[0] = SPU->sndbuf[1] = 0;\n\n\t\t\t\t//get channel's next output sample.\n\t\t\t\t_SPU_ChanUpdate(domix, SPU, chan);\n\t\t\t\tchanout[i] = SPU->lastdata >> chan->datashift;\n\n\t\t\t\t//save the panned results\n\t\t\t\tsubmix[i*2] = SPU->sndbuf[0];\n\t\t\t\tsubmix[i*2+1] = SPU->sndbuf[1];\n\n\t\t\t\t//send sample to our capture mix\n\t\t\t\tif(outputToCap)\n\t\t\t\t{\n\t\t\t\t\tcapmix[0] += submix[i*2];\n\t\t\t\t\tcapmix[1] += submix[i*2+1];\n\t\t\t\t}\n\n\t\t\t\t//send sample to our main mixer\n\t\t\t\tif(outputToMix)\n\t\t\t\t{\n\t\t\t\t\tmix[0] += submix[i*2];\n\t\t\t\t\tmix[1] += submix[i*2+1];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\tchanout[i] = 0;\n\t\t\t\tsubmix[i*2] = 0;\n\t\t\t\tsubmix[i*2+1] = 0;\n\t\t\t}\n\t\t} //foreach channel\n\n\t\ts32 mixout[2] = {mix[0],mix[1]};\n\t\ts32 capmixout[2] = {capmix[0],capmix[1]};\n\t\ts32 sndout[2];\n\t\ts32 capout[2];\n\n\t\t//create SPU output\n\t\tswitch(SPU->regs.ctl_left)\n\t\t{\n\t\tcase SPU_struct::REGS::LOM_LEFT_MIXER: sndout[0] = mixout[0]; break;\n\t\tcase SPU_struct::REGS::LOM_CH1: sndout[0] = submix[1*2+0]; break;\n\t\tcase SPU_struct::REGS::LOM_CH3: sndout[0] = submix[3*2+0]; break;\n\t\tcase SPU_struct::REGS::LOM_CH1_PLUS_CH3: sndout[0] = submix[1*2+0] + submix[3*2+0]; break;\n\t\t}\n\t\tswitch(SPU->regs.ctl_right)\n\t\t{\n\t\tcase SPU_struct::REGS::ROM_RIGHT_MIXER: sndout[1] = mixout[1]; break;\n\t\tcase SPU_struct::REGS::ROM_CH1: sndout[1] = submix[1*2+1]; break;\n\t\tcase SPU_struct::REGS::ROM_CH3: sndout[1] = submix[3*2+1]; break;\n\t\tcase SPU_struct::REGS::ROM_CH1_PLUS_CH3: sndout[1] = submix[1*2+1] + submix[3*2+1]; break;\n\t\t}\n\n\n\t\t//generate capture output (\"capture bugs\" from gbatek are not emulated)\n\t\tif(SPU->regs.cap[0].source==0) \n\t\t\tcapout[0] = capmixout[0]; //cap0 = L-mix\n\t\telse if(SPU->regs.cap[0].add)\n\t\t\tcapout[0] = chanout[0] + chanout[1]; //cap0 = ch0+ch1\n\t\telse capout[0] = chanout[0]; //cap0 = ch0\n\n\t\tif(SPU->regs.cap[1].source==0) \n\t\t\tcapout[1] = capmixout[1]; //cap1 = R-mix\n\t\telse if(SPU->regs.cap[1].add)\n\t\t\tcapout[1] = chanout[2] + chanout[3]; //cap1 = ch2+ch3\n\t\telse capout[1] = chanout[2]; //cap1 = ch2\n\n\t\tcapout[0] = MinMax(capout[0],-0x8000,0x7FFF);\n\t\tcapout[1] = MinMax(capout[1],-0x8000,0x7FFF);\n\n\t\t//write the output sample where it is supposed to go\n\t\tif(samp==0)\n\t\t{\n\t\t\tsamp0[0] = sndout[0];\n\t\t\tsamp0[1] = sndout[1];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSPU->sndbuf[samp*2+0] = sndout[0];\n\t\t\tSPU->sndbuf[samp*2+1] = sndout[1];\n\t\t}\n\n\t\tfor(int capchan=0;capchan<2;capchan++)\n\t\t{\n\t\t\tif(SPU->regs.cap[capchan].runtime.running)\n\t\t\t{\n\t\t\t\tSPU_struct::REGS::CAP& cap = SPU->regs.cap[capchan];\n\t\t\t\tu32 last = sputrunc(cap.runtime.sampcnt);\n\t\t\t\tcap.runtime.sampcnt += SPU->channels[1+2*capchan].sampinc;\n\t\t\t\tu32 curr = sputrunc(cap.runtime.sampcnt);\n\t\t\t\tfor(u32 j=last;j<curr;j++)\n\t\t\t\t{\n\t\t\t\t\t//so, this is a little strange. why go through a fifo?\n\t\t\t\t\t//it seems that some games will set up a reverb effect by capturing\n\t\t\t\t\t//to the nearly same address as playback, but ahead by a couple.\n\t\t\t\t\t//So, playback will always end up being what was captured a couple of samples ago.\n\t\t\t\t\t//This system counts on playback always having read ahead 16 samples.\n\t\t\t\t\t//In that case, playback will end up being what was processed at one entire buffer length ago,\n\t\t\t\t\t//since the 16 samples would have read ahead before they got captured over\n\n\t\t\t\t\t//It's actually the source channels which should have a fifo, but we are\n\t\t\t\t\t//not going to take the hit in speed and complexity. Save it for a future rewrite.\n\t\t\t\t\t//Instead, what we do here is delay the capture by 16 samples to create a similar effect.\n\t\t\t\t\t//Subjectively, it seems to be working.\n\n\t\t\t\t\t//Don't do anything until the fifo is filled, so as to delay it\n\t\t\t\t\tif(cap.runtime.fifo.size<16)\n\t\t\t\t\t{\n\t\t\t\t\t\tcap.runtime.fifo.enqueue(capout[capchan]);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t//(actually capture sample from fifo instead of most recently generated)\n\t\t\t\t\tu32 multiplier;\n\t\t\t\t\ts32 sample = cap.runtime.fifo.dequeue();\n\t\t\t\t\tcap.runtime.fifo.enqueue(capout[capchan]);\n\n\t\t\t\t\t//static FILE* fp = NULL;\n\t\t\t\t\t//if(!fp) fp = fopen(\"d:\\\\capout.raw\",\"wb\");\n\t\t\t\t\t//fwrite(&sample,2,1,fp);\n\t\t\t\t\t\n\t\t\t\t\tif(cap.bits8)\n\t\t\t\t\t{\n\t\t\t\t\t\ts8 sample8 = sample>>8;\n\t\t\t\t\t\tif(skipcap) _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,0);\n\t\t\t\t\t\telse _MMU_write08<1,MMU_AT_DMA>(cap.runtime.curdad,sample8);\n\t\t\t\t\t\tcap.runtime.curdad++;\n\t\t\t\t\t\tmultiplier = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\ts16 sample16 = sample;\n\t\t\t\t\t\tif(skipcap) _MMU_write16<1,MMU_AT_DMA>(cap.runtime.curdad,0);\n\t\t\t\t\t\telse _MMU_write16<1,MMU_AT_DMA>(cap.runtime.curdad,sample16);\n\t\t\t\t\t\tcap.runtime.curdad+=2;\n\t\t\t\t\t\tmultiplier = 2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(cap.runtime.curdad>=cap.runtime.maxdad) {\n\t\t\t\t\t\tcap.runtime.curdad = cap.dad;\n\t\t\t\t\t\tcap.runtime.sampcnt -= cap.len*multiplier;\n\t\t\t\t\t}\n\t\t\t\t} //sampinc loop\n\t\t\t} //if capchan running\n\t\t} //capchan loop\n\t} //main sample loop\n\n\tSPU->sndbuf[0] = samp0[0];\n\tSPU->sndbuf[1] = samp0[1];\n}\n\n//ENTER\nstatic void SPU_MixAudio(bool actuallyMix, SPU_struct *SPU, int length)\n{\n\tif(actuallyMix)\n\t{\n\t\tmemset(SPU->sndbuf, 0, length*4*2);\n\t\tmemset(SPU->outbuf, 0, length*2*2);\n\t}\n\n\t//we used to use master enable here, and do nothing if audio is disabled.\n\t//now, master enable is emulated better..\n\t//but for a speed optimization we will still do it\n\tif(!SPU->regs.masteren) return;\n\n\tbool advanced = CommonSettings.spu_advanced ;\n\n\t//branch here so that slow computers don't have to take the advanced (slower) codepath.\n\t//it remainds to be seen exactly how much slower it is\n\t//if it isnt much slower then we should refactor everything to be simpler, once it is working\n\tif(advanced && SPU == SPU_core)\n\t{\n\t\tSPU_MixAudio_Advanced(actuallyMix, SPU, length);\n\t}\n\telse\n\t{\n\t\t//non-advanced mode\n\t\tfor(int i=0;i<16;i++)\n\t\t{\n\t\t\tchannel_struct *chan = &SPU->channels[i];\n\n\t\t\tif (chan->status != CHANSTAT_PLAY)\n\t\t\t\tcontinue;\n\n\t\t\tSPU->bufpos = 0;\n\t\t\tSPU->buflength = length;\n\n\t\t\t// Mix audio\n\t\t\t_SPU_ChanUpdate(!CommonSettings.spu_muteChannels[i] && actuallyMix, SPU, chan);\n\t\t}\n\t}\n\n\t//we used to bail out if speakers were disabled.\n\t//this is technically wrong. sound may still be captured, or something.\n\t//in all likelihood, any game doing this probably master disabled the SPU also\n\t//so, optimization of this case is probably not necessary.\n\t//later, we'll just silence the output\n\tbool speakers = T1ReadWord(MMU.ARM7_REG, 0x304) & 0x01;\n\n\tu8 vol = SPU->regs.mastervol;\n\n\t// convert from 32-bit->16-bit\n\tif(actuallyMix && speakers)\n\t\tfor (int i = 0; i < length*2; i++)\n\t\t{\n\t\t\t// Apply Master Volume\n\t\t\tSPU->sndbuf[i] = spumuldiv7(SPU->sndbuf[i], vol);\n\t\t\ts16 outsample = MinMax(SPU->sndbuf[i],-0x8000,0x7FFF);\n\t\t\tSPU->outbuf[i] = outsample;\n\t\t}\n\n\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\n\n//emulates one hline of the cpu core.\n//this will produce a variable number of samples, calculated to keep a 44100hz output\n//in sync with the emulator framerate\nint spu_core_samples = 0;\nvoid SPU_Emulate_core()\n{\n\tbool needToMix = true;\n\tSoundInterface_struct *soundProcessor = SPU_SoundCore();\n\t\n\tsamples += samples_per_hline;\n\tspu_core_samples = (int)(samples);\n\tsamples -= spu_core_samples;\n\t\n\t// We don't need to mix audio for Dual Synch/Asynch mode since we do this\n\t// later in SPU_Emulate_user(). Disable mixing here to speed up processing.\n\t// However, recording still needs to mix the audio, so make sure we're also\n\t// not recording before we disable mixing.\n\tif ( synchmode == ESynchMode_DualSynchAsynch &&\n\t\t!(driver->AVI_IsRecording() || driver->WAV_IsRecording()) )\n\t{\n\t\tneedToMix = false;\n\t}\n\t\n\tSPU_MixAudio(needToMix, SPU_core, spu_core_samples);\n\t\n\tif (soundProcessor == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\tif (soundProcessor->FetchSamples != NULL)\n\t{\n\t\tsoundProcessor->FetchSamples(SPU_core->outbuf, spu_core_samples, synchmode, synchronizer);\n\t}\n\telse\n\t{\n\t\tSPU_DefaultFetchSamples(SPU_core->outbuf, spu_core_samples, synchmode, synchronizer);\n\t}\n}\n\nvoid SPU_Emulate_user(bool mix)\n{\n\tstatic s16 *postProcessBuffer = NULL;\n\tstatic size_t postProcessBufferSize = 0;\n\tsize_t freeSampleCount = 0;\n\tsize_t processedSampleCount = 0;\n\tSoundInterface_struct *soundProcessor = SPU_SoundCore();\n\t\n\tif (soundProcessor == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\t// Check to see how many free samples are available.\n\t// If there are some, fill up the output buffer.\n\tfreeSampleCount = soundProcessor->GetAudioSpace();\n\tif (freeSampleCount == 0)\n\t{\n\t\treturn;\n\t}\n\t\n\t//printf(\"mix %i samples\\n\", audiosize);\n\tif (freeSampleCount > buffersize)\n\t{\n\t\tfreeSampleCount = buffersize;\n\t}\n\t\n\t// If needed, resize the post-process buffer to guarantee that\n\t// we can store all the sound data.\n\tif (postProcessBufferSize < freeSampleCount * 2 * sizeof(s16))\n\t{\n\t\tpostProcessBufferSize = freeSampleCount * 2 * sizeof(s16);\n\t\tpostProcessBuffer = (s16 *)realloc(postProcessBuffer, postProcessBufferSize);\n\t}\n\t\n\tif (soundProcessor->PostProcessSamples != NULL)\n\t{\n\t\tprocessedSampleCount = soundProcessor->PostProcessSamples(postProcessBuffer, freeSampleCount, synchmode, synchronizer);\n\t}\n\telse\n\t{\n\t\tprocessedSampleCount = SPU_DefaultPostProcessSamples(postProcessBuffer, freeSampleCount, synchmode, synchronizer);\n\t}\n\t\n\tsoundProcessor->UpdateAudio(postProcessBuffer, processedSampleCount);\n\tWAV_WavSoundUpdate(postProcessBuffer, processedSampleCount, WAVMODE_USER);\n}\n\nvoid SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer)\n{\n\tif (synchMode == ESynchMode_Synchronous)\n\t{\n\t\ttheSynchronizer->enqueue_samples(sampleBuffer, sampleCount);\n\t}\n}\n\nsize_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer)\n{\n\tsize_t processedSampleCount = 0;\n\t\n\tswitch (synchMode)\n\t{\n\t\tcase ESynchMode_DualSynchAsynch:\n\t\t\tif(SPU_user != NULL)\n\t\t\t{\n\t\t\t\tSPU_MixAudio(true, SPU_user, requestedSampleCount);\n\t\t\t\tmemcpy(postProcessBuffer, SPU_user->outbuf, requestedSampleCount * 2 * sizeof(s16));\n\t\t\t\tprocessedSampleCount = requestedSampleCount;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase ESynchMode_Synchronous:\n\t\t\tprocessedSampleCount = theSynchronizer->output_samples(postProcessBuffer, requestedSampleCount);\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\t\n\treturn processedSampleCount;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// Dummy Sound Interface\n//////////////////////////////////////////////////////////////////////////////\n\nint SNDDummyInit(int buffersize);\nvoid SNDDummyDeInit();\nvoid SNDDummyUpdateAudio(s16 *buffer, u32 num_samples);\nu32 SNDDummyGetAudioSpace();\nvoid SNDDummyMuteAudio();\nvoid SNDDummyUnMuteAudio();\nvoid SNDDummySetVolume(int volume);\nvoid SNDDummyClearBuffer();\nvoid SNDDummyFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);\nsize_t SNDDummyPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);\n\nSoundInterface_struct SNDDummy = {\n\tSNDCORE_DUMMY,\n\t\"Dummy Sound Interface\",\n\tSNDDummyInit,\n\tSNDDummyDeInit,\n\tSNDDummyUpdateAudio,\n\tSNDDummyGetAudioSpace,\n\tSNDDummyMuteAudio,\n\tSNDDummyUnMuteAudio,\n\tSNDDummySetVolume,\n\tSNDDummyClearBuffer,\n\tSNDDummyFetchSamples,\n\tSNDDummyPostProcessSamples\n};\n\nint SNDDummyInit(int buffersize) { return 0; }\nvoid SNDDummyDeInit() {}\nvoid SNDDummyUpdateAudio(s16 *buffer, u32 num_samples) { }\nu32 SNDDummyGetAudioSpace() { return DESMUME_SAMPLE_RATE/60 + 5; }\nvoid SNDDummyMuteAudio() {}\nvoid SNDDummyUnMuteAudio() {}\nvoid SNDDummySetVolume(int volume) {}\nvoid SNDDummyClearBuffer() {}\nvoid SNDDummyFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) {}\nsize_t SNDDummyPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer) { return 0; }\n\n//---------wav writer------------\n\ntypedef struct {\n\tchar id[4];\n\tu32 size;\n} chunk_struct;\n\ntypedef struct {\n\tchunk_struct riff;\n\tchar rifftype[4];\n} waveheader_struct;\n\ntypedef struct {\n\tchunk_struct chunk;\n\tu16 compress;\n\tu16 numchan;\n\tu32 rate;\n\tu32 bytespersec;\n\tu16 blockalign;\n\tu16 bitspersample;\n} fmt_struct;\n\nWavWriter::WavWriter() \n: spufp(NULL)\n{\n}\nbool WavWriter::open(const std::string & fname)\n{\n\twaveheader_struct waveheader;\n\tfmt_struct fmt;\n\tchunk_struct data;\n\tsize_t elems_written = 0;\n\n\tif ((spufp = fopen(fname.c_str(), \"wb\")) == NULL)\n\t\treturn false;\n\n\t// Do wave header\n\tmemcpy(waveheader.riff.id, \"RIFF\", 4);\n\twaveheader.riff.size = 0; // we'll fix this after the file is closed\n\tmemcpy(waveheader.rifftype, \"WAVE\", 4);\n\telems_written += fwrite((void *)&waveheader, 1, sizeof(waveheader_struct), spufp);\n\n\t// fmt chunk\n\tmemcpy(fmt.chunk.id, \"fmt \", 4);\n\tfmt.chunk.size = 16; // we'll fix this at the end\n\tfmt.compress = 1; // PCM\n\tfmt.numchan = 2; // Stereo\n\tfmt.rate = DESMUME_SAMPLE_RATE;\n\tfmt.bitspersample = 16;\n\tfmt.blockalign = fmt.bitspersample / 8 * fmt.numchan;\n\tfmt.bytespersec = fmt.rate * fmt.blockalign;\n\telems_written += fwrite((void *)&fmt, 1, sizeof(fmt_struct), spufp);\n\n\t// data chunk\n\tmemcpy(data.id, \"data\", 4);\n\tdata.size = 0; // we'll fix this at the end\n\telems_written += fwrite((void *)&data, 1, sizeof(chunk_struct), spufp);\n\n\treturn true;\n}\n\nvoid WavWriter::close()\n{\n\tif(!spufp) return;\n\tsize_t elems_written = 0;\n\tlong length = ftell(spufp);\n\n\t// Let's fix the riff chunk size and the data chunk size\n\tfseek(spufp, sizeof(waveheader_struct)-0x8, SEEK_SET);\n\tlength -= 0x8;\n\telems_written += fwrite((void *)&length, 1, 4, spufp);\n\n\tfseek(spufp, sizeof(waveheader_struct)+sizeof(fmt_struct)+0x4, SEEK_SET);\n\tlength -= sizeof(waveheader_struct)+sizeof(fmt_struct);\n\telems_written += fwrite((void *)&length, 1, 4, spufp);\n\tfclose(spufp);\n\tspufp = NULL;\n}\n\nvoid WavWriter::update(void* soundData, int numSamples)\n{\n\tif(!spufp) return;\n\t//TODO - big endian for the s16 samples??\n\tsize_t elems_written = fwrite(soundData, numSamples*2, 2, spufp);\n}\n\nbool WavWriter::isRecording() const\n{\n\treturn spufp != NULL;\n}\n\n\nstatic WavWriter wavWriter;\n\nvoid WAV_End()\n{\n\twavWriter.close();\n}\n\nbool WAV_Begin(const char* fname, WAVMode mode)\n{\n\tWAV_End();\n\n\tif(!wavWriter.open(fname))\n\t\treturn false;\n\n\tif(mode == WAVMODE_ANY)\n\t\tmode = WAVMODE_CORE;\n\twavWriter.mode = mode;\n\n\tdriver->USR_InfoMessage(\"WAV recording started.\");\n\n\treturn true;\n}\n\nbool WAV_IsRecording(WAVMode mode)\n{\n\tif(wavWriter.mode == mode || mode == WAVMODE_ANY)\n\t\treturn wavWriter.isRecording();\n\treturn false;\n}\n\nvoid WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode)\n{\n\tif(wavWriter.mode == mode || mode == WAVMODE_ANY)\n\t\twavWriter.update(soundData, numSamples);\n}\n\n\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid spu_savestate(EMUFILE* os)\n{\n\t//version\n\twrite32le(6,os);\n\n\tSPU_struct *spu = SPU_core;\n\n\tfor(int j=0;j<16;j++) {\n\t\tchannel_struct &chan = spu->channels[j];\n\t\twrite32le(chan.num,os);\n\t\twrite8le(chan.vol,os);\n\t\twrite8le(chan.datashift,os);\n\t\twrite8le(chan.hold,os);\n\t\twrite8le(chan.pan,os);\n\t\twrite8le(chan.waveduty,os);\n\t\twrite8le(chan.repeat,os);\n\t\twrite8le(chan.format,os);\n\t\twrite8le(chan.status,os);\n\t\twrite32le(chan.addr,os);\n\t\twrite16le(chan.timer,os);\n\t\twrite16le(chan.loopstart,os);\n\t\twrite32le(chan.length,os);\n\t\twrite64le(double_to_u64(chan.sampcnt),os);\n\t\twrite64le(double_to_u64(chan.sampinc),os);\n\t\twrite32le(chan.lastsampcnt,os);\n\t\twrite16le(chan.pcm16b,os);\n\t\twrite16le(chan.pcm16b_last,os);\n\t\twrite32le(chan.index,os);\n\t\twrite16le(chan.x,os);\n\t\twrite16le(chan.psgnoise_last,os);\n\t\twrite8le(chan.keyon,os);\n\t}\n\n\twrite64le(double_to_u64(samples),os);\n\n\twrite8le(spu->regs.mastervol,os);\n\twrite8le(spu->regs.ctl_left,os);\n\twrite8le(spu->regs.ctl_right,os);\n\twrite8le(spu->regs.ctl_ch1bypass,os);\n\twrite8le(spu->regs.ctl_ch3bypass,os);\n\twrite8le(spu->regs.masteren,os);\n\twrite16le(spu->regs.soundbias,os);\n\n\tfor(int i=0;i<2;i++)\n\t{\n\t\twrite8le(spu->regs.cap[i].add,os);\n\t\twrite8le(spu->regs.cap[i].source,os);\n\t\twrite8le(spu->regs.cap[i].oneshot,os);\n\t\twrite8le(spu->regs.cap[i].bits8,os);\n\t\twrite8le(spu->regs.cap[i].active,os);\n\t\twrite32le(spu->regs.cap[i].dad,os);\n\t\twrite16le(spu->regs.cap[i].len,os);\n\t\twrite8le(spu->regs.cap[i].runtime.running,os);\n\t\twrite32le(spu->regs.cap[i].runtime.curdad,os);\n\t\twrite32le(spu->regs.cap[i].runtime.maxdad,os);\n\t\twrite_double_le(spu->regs.cap[i].runtime.sampcnt,os);\n\t}\n\n\tfor(int i=0;i<2;i++)\n\t\tspu->regs.cap[i].runtime.fifo.save(os);\n}\n\nbool spu_loadstate(EMUFILE* is, int size)\n{\n\tu64 temp64; \n\t\n\t//read version\n\tu32 version;\n\tif(read32le(&version,is) != 1) return false;\n\n\tSPU_struct *spu = SPU_core;\n\treconstruct(&SPU_core->regs);\n\n\tfor(int j=0;j<16;j++) {\n\t\tchannel_struct &chan = spu->channels[j];\n\t\tread32le(&chan.num,is);\n\t\tread8le(&chan.vol,is);\n\t\tread8le(&chan.datashift,is);\n\t\tread8le(&chan.hold,is);\n\t\tread8le(&chan.pan,is);\n\t\tread8le(&chan.waveduty,is);\n\t\tread8le(&chan.repeat,is);\n\t\tread8le(&chan.format,is);\n\t\tread8le(&chan.status,is);\n\t\tread32le(&chan.addr,is);\n\t\tread16le(&chan.timer,is);\n\t\tread16le(&chan.loopstart,is);\n\t\tread32le(&chan.length,is);\n\t\tchan.totlength = chan.length + chan.loopstart;\n\t\tchan.double_totlength_shifted = (double)(chan.totlength << format_shift[chan.format]);\n\t\t//printf(\"%f\\n\",chan.double_totlength_shifted);\n\t\tif(version >= 2)\n\t\t{\n\t\t\tread64le(&temp64,is); chan.sampcnt = u64_to_double(temp64);\n\t\t\tread64le(&temp64,is); chan.sampinc = u64_to_double(temp64);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tread32le((u32*)&chan.sampcnt,is);\n\t\t\tread32le((u32*)&chan.sampinc,is);\n\t\t}\n\t\tread32le(&chan.lastsampcnt,is);\n\t\tread16le(&chan.pcm16b,is);\n\t\tread16le(&chan.pcm16b_last,is);\n\t\tread32le(&chan.index,is);\n\t\tread16le(&chan.x,is);\n\t\tread16le(&chan.psgnoise_last,is);\n\n\t\tif(version>=4)\n\t\t\tread8le(&chan.keyon,is);\n\n\t\t//hopefully trigger a recovery of the adpcm looping system\n\t\tchan.loop_index = K_ADPCM_LOOPING_RECOVERY_INDEX;\n\t}\n\n\tif(version>=2) {\n\t\tread64le(&temp64,is); samples = u64_to_double(temp64);\n\t}\n\n\tif(version>=4)\n\t{\n\t\tread8le(&spu->regs.mastervol,is);\n\t\tread8le(&spu->regs.ctl_left,is);\n\t\tread8le(&spu->regs.ctl_right,is);\n\t\tread8le(&spu->regs.ctl_ch1bypass,is);\n\t\tread8le(&spu->regs.ctl_ch3bypass,is);\n\t\tread8le(&spu->regs.masteren,is);\n\t\tread16le(&spu->regs.soundbias,is);\n\t}\n\n\tif(version>=5)\n\t{\n\t\tfor(int i=0;i<2;i++)\n\t\t{\n\t\t\tread8le(&spu->regs.cap[i].add,is);\n\t\t\tread8le(&spu->regs.cap[i].source,is);\n\t\t\tread8le(&spu->regs.cap[i].oneshot,is);\n\t\t\tread8le(&spu->regs.cap[i].bits8,is);\n\t\t\tread8le(&spu->regs.cap[i].active,is);\n\t\t\tread32le(&spu->regs.cap[i].dad,is);\n\t\t\tread16le(&spu->regs.cap[i].len,is);\n\t\t\tread8le(&spu->regs.cap[i].runtime.running,is);\n\t\t\tread32le(&spu->regs.cap[i].runtime.curdad,is);\n\t\t\tread32le(&spu->regs.cap[i].runtime.maxdad,is);\n\t\t\tread_double_le(&spu->regs.cap[i].runtime.sampcnt,is);\n\t\t}\n\t}\n\n\tif(version>=6)\n\t\tfor(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.load(is);\n\telse\n\t\tfor(int i=0;i<2;i++) spu->regs.cap[i].runtime.fifo.reset();\n\n\t//older versions didnt store a mastervol; \n\t//we must reload this or else games will start silent\n\tif(version<4)\n\t{\n\t\tspu->regs.mastervol = T1ReadByte(MMU.ARM7_REG, 0x500) & 0x7F;\n\t\tspu->regs.masteren = BIT15(T1ReadWord(MMU.ARM7_REG, 0x500));\n\t}\n\n\t//copy the core spu (the more accurate) to the user spu\n\tSPU_CloneUser();\n\n\treturn true;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/SPU.h",
    "content": "/*\n\tCopyright 2006 Theo Berkau\n\tCopyright (C) 2006-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef SPU_H\n#define SPU_H\n\n#include <iosfwd>\n#include <string>\n#include <assert.h>\n#include \"types.h\"\n#include \"matrix.h\"\n#include \"emufile.h\"\n#include \"metaspu/metaspu.h\"\n\n\n#define SNDCORE_DEFAULT         -1\n#define SNDCORE_DUMMY           0\n\n#define CHANSTAT_STOPPED          0\n#define CHANSTAT_PLAY             1\n\n//who made these static? theyre used in multiple places.\nFORCEINLINE u32 sputrunc(float f) { return u32floor(f); }\nFORCEINLINE u32 sputrunc(double d) { return u32floor(d); }\nFORCEINLINE s32 spumuldiv7(s32 val, u8 multiplier) {\n\tassert(multiplier <= 127);\n\treturn (multiplier == 127) ? val : ((val * multiplier) >> 7);\n}\n\nenum SPUInterpolationMode\n{\n\tSPUInterpolation_None = 0,\n\tSPUInterpolation_Linear = 1,\n\tSPUInterpolation_Cosine = 2\n};\n\nstruct SoundInterface_struct\n{\n   int id;\n   const char *Name;\n   int (*Init)(int buffersize);\n   void (*DeInit)();\n   void (*UpdateAudio)(s16 *buffer, u32 num_samples);\n   u32 (*GetAudioSpace)();\n   void (*MuteAudio)();\n   void (*UnMuteAudio)();\n   void (*SetVolume)(int volume);\n   void (*ClearBuffer)();\n\tvoid (*FetchSamples)(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);\n\tsize_t (*PostProcessSamples)(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);\n};\n\nextern SoundInterface_struct SNDDummy;\nextern SoundInterface_struct SNDFile;\nextern int SPU_currentCoreNum;\n\nstruct channel_struct\n{\n\tchannel_struct()\n\t{}\n\tu32 num;\n   u8 vol;\n   u8 datashift;\n   u8 hold;\n   u8 pan;\n   u8 waveduty;\n   u8 repeat;\n   u8 format;\n   u8 keyon;\n   u8 status;\n   u32 addr;\n   u16 timer;\n   u16 loopstart;\n   u32 length;\n   u32 totlength;\n   double double_totlength_shifted;\n   double sampcnt;\n   double sampinc;\n   // ADPCM specific\n   u32 lastsampcnt;\n   s16 pcm16b, pcm16b_last;\n   s16 loop_pcm16b;\n   int index;\n   int loop_index;\n   u16 x;\n   s16 psgnoise_last;\n};\n\nclass SPUFifo\n{\npublic:\n\tSPUFifo();\n\tvoid enqueue(s16 val);\n\ts16 dequeue();\n\ts16 buffer[16];\n\ts32 head,tail,size;\n\tvoid save(EMUFILE* fp);\n\tbool load(EMUFILE* fp);\n\tvoid reset();\n};\n\nclass SPU_struct\n{\npublic:\n\tSPU_struct(int buffersize);\n   u32 bufpos;\n   u32 buflength;\n   s32 *sndbuf;\n   s32 lastdata; //the last sample that a channel generated\n   s16 *outbuf;\n   u32 bufsize;\n   channel_struct channels[16];\n\n   //registers\n   struct REGS {\n\t   REGS()\n\t\t\t: mastervol(0)\n\t\t\t, ctl_left(0)\n\t\t\t, ctl_right(0)\n\t\t\t, ctl_ch1bypass(0)\n\t\t\t, ctl_ch3bypass(0)\n\t\t\t, masteren(0)\n\t\t\t, soundbias(0)\n\t   {}\n\n\t   u8 mastervol;\n\t   u8 ctl_left, ctl_right;\n\t   u8 ctl_ch1bypass, ctl_ch3bypass;\n\t   u8 masteren;\n\t   u16 soundbias;\n\n\t   enum LeftOutputMode\n\t   {\n\t\t   LOM_LEFT_MIXER=0, LOM_CH1=1, LOM_CH3=2, LOM_CH1_PLUS_CH3=3\n\t   };\n\n\t   enum RightOutputMode\n\t   {\n\t\t   ROM_RIGHT_MIXER=0, ROM_CH1=1, ROM_CH3=2, ROM_CH1_PLUS_CH3=3\n\t   };\n\n\t   struct CAP {\n\t\t   CAP()\n\t\t\t   : add(0), source(0), oneshot(0), bits8(0), active(0), dad(0), len(0)\n\t\t   {}\n\t\t   u8 add, source, oneshot, bits8, active;\n\t\t   u32 dad;\n\t\t   u16 len;\n\t\t   struct Runtime {\n\t\t\t   Runtime()\n\t\t\t\t   : running(0), curdad(0), maxdad(0)\n\t\t\t   {}\n\t\t\t   u8 running;\n\t\t\t   u32 curdad;\n\t\t\t   u32 maxdad;\n\t\t\t   double sampcnt;\n\t\t\t   SPUFifo fifo;\n\t\t   } runtime;\n\t   } cap[2];\n   } regs;\n\n   void reset();\n   ~SPU_struct();\n   void KeyOff(int channel);\n   void KeyOn(int channel);\n   void KeyProbe(int channel);\n   void ProbeCapture(int which);\n   void WriteByte(u32 addr, u8 val);\n   u8 ReadByte(u32 addr);\n   u16 ReadWord(u32 addr);\n   u32 ReadLong(u32 addr);\n   void WriteWord(u32 addr, u16 val);\n   void WriteLong(u32 addr, u32 val);\n   \n   //kills all channels but leaves SPU otherwise running normally\n   void ShutUp();\n};\n\nint SPU_ChangeSoundCore(int coreid, int buffersize);\nSoundInterface_struct *SPU_SoundCore();\n\nvoid SPU_ReInit();\nint SPU_Init(int coreid, int buffersize);\nvoid SPU_Pause(int pause);\nvoid SPU_SetVolume(int volume);\nvoid SPU_SetSynchMode(int mode, int method);\nvoid SPU_ClearOutputBuffer(void);\nvoid SPU_Reset(void);\nvoid SPU_DeInit(void);\nvoid SPU_KeyOn(int channel);\nvoid SPU_WriteByte(u32 addr, u8 val);\nvoid SPU_WriteWord(u32 addr, u16 val);\nvoid SPU_WriteLong(u32 addr, u32 val);\nu8 SPU_ReadByte(u32 addr);\nu16 SPU_ReadWord(u32 addr);\nu32 SPU_ReadLong(u32 addr);\nvoid SPU_Emulate_core(void);\nvoid SPU_Emulate_user(bool mix = true);\nvoid SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);\nsize_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);\n\nextern SPU_struct *SPU_core, *SPU_user;\nextern int spu_core_samples;\n\nvoid spu_savestate(EMUFILE* os);\nbool spu_loadstate(EMUFILE* is, int size);\n\nenum WAVMode\n{\n\tWAVMODE_ANY = -1,\n\tWAVMODE_CORE = 0,\n\tWAVMODE_USER = 1\n};\n\nclass WavWriter\n{\npublic:\n\tWavWriter();\n\tbool open(const std::string & fname);\n\tvoid close();\n\tvoid update(void* soundData, int numSamples);\n\tbool isRecording() const;\n\tWAVMode mode;\nprivate:\n\tFILE *spufp;\n};\n\nvoid WAV_End();\nbool WAV_Begin(const char* fname, WAVMode mode=WAVMODE_CORE);\nbool WAV_IsRecording(WAVMode mode=WAVMODE_ANY);\nvoid WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode=WAVMODE_CORE);\n\n// we should make this configurable eventually\n// but at least defining it somewhere is probably a step in the right direction\n#define DESMUME_SAMPLE_RATE 44100\n//#define DESMUME_SAMPLE_RATE 48000\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot1_none.cpp",
    "content": "/*  Copyright (C) 2010-2011 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"../slot1.h\"\r\n\r\nstatic void slot1_info(char *info) { strcpy(info, \"Slot1 no-card emulation (card ejected!)\"); }\r\nstatic void slot1_config(void) {}\r\n\r\nstatic BOOL slot1_init() { return (TRUE); }\r\n\r\nstatic void slot1_reset() {}\r\n\r\nstatic void slot1_close() {}\r\n\r\n\r\nstatic void slot1_write08(u8 PROCNUM, u32 adr, u8 val) {}\r\nstatic void slot1_write16(u8 PROCNUM, u32 adr, u16 val) {}\r\nstatic void slot1_write32(u8 PROCNUM, u32 adr, u32 val) {}\r\n\r\nstatic u8 slot1_read08(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFF;\r\n}\r\nstatic u16 slot1_read16(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFFFF;\r\n}\r\nstatic u32 slot1_read32(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFFFFFFFF;\r\n}\r\n\r\n\r\nSLOT1INTERFACE slot1None = {\r\n\t\"None\",\r\n\tslot1_init,\r\n\tslot1_reset,\r\n\tslot1_close,\r\n\tslot1_config,\r\n\tslot1_write08,\r\n\tslot1_write16,\r\n\tslot1_write32,\r\n\tslot1_read08,\r\n\tslot1_read16,\r\n\tslot1_read32,\r\n\tslot1_info};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot1_r4.cpp",
    "content": "/*  Copyright (C) 2010-2011 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include <time.h>\r\n\r\n#include \"../slot1.h\"\r\n#include \"../registers.h\"\r\n#include \"../MMU.h\"\r\n#include \"../NDSSystem.h\"\r\n#include \"../emufile.h\"\r\n\r\nstatic EMUFILE *img = NULL;\r\nstatic u32 write_count = 0;\r\nstatic u32 write_enabled = 0;\r\nstatic void init_r4_flash()\r\n{\r\n\tsrand(time(NULL));\r\n\r\n\tif (!img)\r\n\t\timg = slot1GetFatImage();\r\n\r\n\tif(!img)\r\n\t{\r\n\t\tINFO(\"slot1 fat not successfully mounted\\n\");\r\n\t}\r\n}\r\n\r\nstatic void info(char *info) { strcpy(info, \"Slot1 R4 Emulation\"); }\r\nstatic void config(void) {}\r\n\r\nstatic BOOL init()\r\n{ \r\n\tinit_r4_flash();\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void reset() {\r\n\tinit_r4_flash();\r\n}\r\n\r\nstatic void close() {\r\n\timg = NULL;\r\n}\r\n\r\n\r\nstatic void write08(u8 PROCNUM, u32 adr, u8 val) {}\r\nstatic void write16(u8 PROCNUM, u32 adr, u16 val) {}\r\n\r\nstatic void write32_GCROMCTRL(u32 val)\r\n{\r\n\tnds_dscard& card = MMU.dscard[0];\r\n\r\n\tswitch(card.command[0])\r\n\t{\r\n\t\tcase 0xB0:\r\n\t\t\tbreak;\r\n\t\tcase 0xB9:\r\n\t\tcase 0xBA:\r\n\t\t\tcard.address = \t(card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];\r\n\t\t\timg->fseek(card.address,SEEK_SET);\r\n\t\t\tbreak;\r\n\t\tcase 0xBB:\r\n\t\t\twrite_enabled = 1;\r\n\t\t\twrite_count = 0x80;\r\n\t\tcase 0xBC:\r\n\t\t\tcard.address = \t(card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];\r\n\t\t\timg->fseek(card.address,SEEK_SET);\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic void write32_GCDATAIN(u32 val)\r\n{\r\n\tnds_dscard& card = MMU.dscard[0];\r\n\t//bool log=false;\r\n\r\n\tmemcpy(&card.command[0], &MMU.MMU_MEM[0][0x40][0x1A8], 8);\r\n\r\n\t//last_write_count = write_count;\r\n\tif(card.command[4])\r\n\t{\r\n\t\t// transfer is done\r\n\t\tT1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF);\r\n\r\n\t\t// if needed, throw irq for the end of transfer\r\n\t\tif(MMU.AUX_SPI_CNT & 0x4000)\r\n\t\t\tNDS_makeIrq(ARMCPU_ARM9, IRQ_BIT_GC_TRANSFER_COMPLETE);\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tswitch(card.command[0])\r\n\t{\r\n\t\tcase 0xBB:\r\n\t\t{\r\n\t\t\tif(write_count && write_enabled)\r\n\t\t\t{\r\n\t\t\t\timg->fwrite(&val, 4);\r\n\t\t\t\timg->fflush();\r\n\t\t\t\twrite_count--;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tif(write_count==0)\r\n\t{\r\n\t\twrite_enabled = 0;\r\n\r\n\t\t// transfer is done\r\n\t\tT1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF);\r\n\r\n\t\t// if needed, throw irq for the end of transfer\r\n\t\tif(MMU.AUX_SPI_CNT & 0x4000)\r\n\t\t\tNDS_makeIrq(ARMCPU_ARM9, IRQ_BIT_GC_TRANSFER_COMPLETE);\r\n\t}\r\n\r\n\t/*if(log)\r\n\t{\r\n\t\tINFO(\"WRITE CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\\t\", \r\n\t\t\t\t\t\tcard.command[0], card.command[1], card.command[2], card.command[3],\r\n\t\t\t\t\t\tcard.command[4], card.command[5], card.command[6], card.command[7]);\r\n\t\tINFO(\"FROM: %08X\\t\", NDS_ARM9.instruct_adr);\r\n\t\tINFO(\"VAL: %08X\\n\", val);\r\n\t}*/\r\n}\r\n\r\nstatic void write32(u8 PROCNUM, u32 adr, u32 val)\r\n{\r\n\tswitch(adr)\r\n\t{\r\n\t\tcase REG_GCROMCTRL:\r\n\t\t\twrite32_GCROMCTRL(val);\r\n\t\t\tbreak;\r\n\t\tcase REG_GCDATAIN:\r\n\t\t\twrite32_GCDATAIN(val);\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic u8 read08(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFF;\r\n}\r\nstatic u16 read16(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFFFF;\r\n}\r\n\r\n\r\nstatic u32 read32_GCDATAIN()\r\n{\r\n\tnds_dscard& card = MMU.dscard[0];\r\n\t\r\n\tu32 val;\r\n\r\n\tswitch(card.command[0])\r\n\t{\r\n\t\t//Get ROM chip ID\r\n\t\tcase 0x90:\r\n\t\tcase 0xB8:\r\n\t\t\tval = 0xFC2;\r\n\t\t\tbreak;\r\n\r\n\t\tcase 0xB0:\r\n\t\t\tval = 0x1F4;\r\n\t\t\tbreak;\r\n\t\tcase 0xB9:\r\n\t\t\tval = (rand() % 100) ? 0x1F4 : 0;\r\n\t\t\tbreak;\r\n\t\tcase 0xBB:\r\n\t\tcase 0xBC:\r\n\t\t\tval = 0;\r\n\t\t\tbreak;\r\n\t\tcase 0xBA:\r\n\t\t\t//INFO(\"Read from sd at sector %08X at adr %08X \",card.address/512,ftell(img));\r\n\t\t\timg->fread(&val, 4);\r\n\t\t\t//INFO(\"val %08X\\n\",val);\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tval = 0;\r\n\t}\r\n\r\n\t/*INFO(\"READ CARD command: %02X%02X%02X%02X% 02X%02X%02X%02X RET: %08X  \", \r\n\t\t\t\t\t\tcard.command[0], card.command[1], card.command[2], card.command[3],\r\n\t\t\t\t\t\tcard.command[4], card.command[5], card.command[6], card.command[7],\r\n\t\t\t\t\t\tval);\r\n\tINFO(\"FROM: %08X  LR: %08X\\n\", NDS_ARM9.instruct_adr, NDS_ARM9.R[14]);*/\r\n\r\n\r\n\treturn val;\r\n} //read32_GCDATAIN\r\n\r\n\r\nstatic u32 read32(u8 PROCNUM, u32 adr)\r\n{\r\n\tswitch(adr)\r\n\t{\r\n\tcase REG_GCDATAIN:\r\n\t\treturn read32_GCDATAIN();\r\n\tdefault:\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\nSLOT1INTERFACE slot1R4 = {\r\n\t\"R4\",\r\n\tinit,\r\n\treset,\r\n\tclose,\r\n\tconfig,\r\n\twrite08,\r\n\twrite16,\r\n\twrite32,\r\n\tread08,\r\n\tread16,\r\n\tread32,\r\n\tinfo};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot1_retail.cpp",
    "content": "/*  Copyright (C) 2010-2011 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"../slot1.h\"\r\n#include \"../registers.h\"\r\n#include \"../MMU.h\"\r\n#include \"../NDSSystem.h\"\r\n\r\nstatic void info(char *info) { strcpy(info, \"Slot1 Retail card emulation\"); }\r\nstatic void config(void) {}\r\n\r\nstatic BOOL init() { return (TRUE); }\r\n\r\nstatic void reset() {}\r\n\r\nstatic void close() {}\r\n\r\n\r\nstatic void write08(u8 PROCNUM, u32 adr, u8 val) {}\r\nstatic void write16(u8 PROCNUM, u32 adr, u16 val) {}\r\n\r\nstatic void write32_GCROMCTRL(u8 PROCNUM, u32 val)\r\n{\r\n\tnds_dscard& card = MMU.dscard[PROCNUM];\r\n\r\n\tswitch(card.command[0])\r\n\t{\r\n\t\tcase 0x00: //Data read\r\n\t\tcase 0xB7:\r\n\t\t\tcard.address = \t(card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];\r\n\t\t\tcard.transfer_count = 0x80;\r\n\t\t\tbreak;\r\n\r\n\t\tcase 0xB8:\t// Chip ID\r\n\t\t\tcard.address = 0;\r\n\t\t\tcard.transfer_count = 1;\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tcard.address = 0;\r\n\t\t\tcard.transfer_count = 0;\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic void write32(u8 PROCNUM, u32 adr, u32 val)\r\n{\r\n\tswitch(adr)\r\n\t{\r\n\tcase REG_GCROMCTRL:\r\n\t\twrite32_GCROMCTRL(PROCNUM, val);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic u8 read08(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFF;\r\n}\r\nstatic u16 read16(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFFFF;\r\n}\r\n\r\nstatic u32 read32_GCDATAIN(u8 PROCNUM)\r\n{\r\n\tnds_dscard& card = MMU.dscard[PROCNUM];\r\n\r\n\tswitch(card.command[0])\r\n\t{\r\n\t\t//Get ROM chip ID\r\n\t\tcase 0x90:\r\n\t\tcase 0xB8:\r\n\t\t\t{\r\n\t\t\t\t// Note: the BIOS stores the chip ID in main memory\r\n\t\t\t\t// Most games continuously compare the chip ID with\r\n\t\t\t\t// the value in memory, probably to know if the card\r\n\t\t\t\t// was removed.\r\n\t\t\t\t// As DeSmuME boots directly from the game, the chip\r\n\t\t\t\t// ID in main mem is zero and this value needs to be\r\n\t\t\t\t// zero too.\r\n\r\n\t\t\t\t//staff of kings verifies this (it also uses the arm7 IRQ 20)\r\n\t\t\t\tif(nds.cardEjected) //TODO - handle this with ejected card slot1 device (and verify using this case)\r\n\t\t\t\t\treturn 0xFFFFFFFF;\r\n\t\t\t\telse return 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\r\n\t\t// Data read\r\n\t\tcase 0x00:\r\n\t\tcase 0xB7:\r\n\t\t\t{\r\n\t\t\t\t//it seems that etrian odyssey 3 doesnt work unless we mask this to cart size.\r\n\t\t\t\t//but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision\r\n\t\t\t\t//but there is no test case yet\r\n\t\t\t\tu32 address = card.address & (gameInfo.mask);\r\n\r\n\t\t\t\t// Make sure any reads below 0x8000 redirect to 0x8000+(adr&0x1FF) as on real cart\r\n\t\t\t\tif((card.command[0] == 0xB7) && (address < 0x8000))\r\n\t\t\t\t{\r\n\t\t\t\t\t//TODO - refactor this to include the PROCNUM, for debugging purposes if nothing else\r\n\t\t\t\t\t//(can refactor gbaslot also)\r\n\r\n\t\t\t\t\t//INFO(\"Read below 0x8000 (0x%04X) from: ARM%s %08X\\n\",\r\n\t\t\t\t\t//\tcard.address, (PROCNUM ? \"7\":\"9\"), (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr);\r\n\r\n\t\t\t\t\taddress = (0x8000 + (address&0x1FF));\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms)\r\n\t\t\t\t//we need to protect ourselves by returning 0xFF for things still out of range\r\n\t\t\t\tif(address >= gameInfo.romsize)\r\n\t\t\t\t{\r\n\t\t\t\t\tDEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize);\r\n\t\t\t\t\treturn 0xFFFFFFFF;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn T1ReadLong(MMU.CART_ROM, address);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t} //switch(card.command[0])\r\n} //read32_GCDATAIN\r\n\r\nstatic u32 read32(u8 PROCNUM, u32 adr)\r\n{\r\n\tswitch(adr)\r\n\t{\r\n\tcase REG_GCDATAIN:\r\n\t\treturn read32_GCDATAIN(PROCNUM);\r\n\tdefault:\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\n\r\nSLOT1INTERFACE slot1Retail = {\r\n\t\"Retail\",\r\n\tinit,\r\n\treset,\r\n\tclose,\r\n\tconfig,\r\n\twrite08,\r\n\twrite16,\r\n\twrite32,\r\n\tread08,\r\n\tread16,\r\n\tread32,\r\n\tinfo\r\n};\r\n\r\n\r\n\r\n\t//\t\t///writetoGCControl:\r\n\t//// --- Ninja SD commands -------------------------------------\r\n\r\n\t//\t// NJSD init/reset\r\n\t//\tcase 0x20:\r\n\t//\t\t{\r\n\t//\t\t\tcard.address = 0;\r\n\t//\t\t\tcard.transfer_count = 0;\r\n\t//\t\t}\r\n\t//\t\tbreak;\r\n\r\n\t//\t// NJSD_sendCLK()\r\n\t//\tcase 0xE0:\r\n\t//\t\t{\r\n\t//\t\t\tcard.address = 0;\r\n\t//\t\t\tcard.transfer_count = 0;\r\n\t//\t\t\tNDS_makeInt(PROCNUM, 20);\r\n\t//\t\t}\r\n\t//\t\tbreak;\r\n\r\n\t//\t// NJSD_sendCMDN() / NJSD_sendCMDR()\r\n\t//\tcase 0xF0:\r\n\t//\tcase 0xF1:\r\n\t//\t\tswitch (card.command[2])\r\n\t//\t\t{\r\n\t//\t\t// GO_IDLE_STATE\r\n\t//\t\tcase 0x40:\r\n\t//\t\t\tcard.address = 0;\r\n\t//\t\t\tcard.transfer_count = 0;\r\n\t//\t\t\tNDS_makeInt(PROCNUM, 20);\r\n\t//\t\t\tbreak;\r\n\r\n\t//\t\tcase 0x42:  // ALL_SEND_CID\r\n\t//\t\tcase 0x43:  // SEND_RELATIVE_ADDR\r\n\t//\t\tcase 0x47:  // SELECT_CARD\r\n\t//\t\tcase 0x49:  // SEND_CSD\r\n\t//\t\tcase 0x4D:\r\n\t//\t\tcase 0x77:  // APP_CMD\r\n\t//\t\tcase 0x69:  // SD_APP_OP_COND\r\n\t//\t\t\tcard.address = 0;\r\n\t//\t\t\tcard.transfer_count = 6;\r\n\t//\t\t\tNDS_makeInt(PROCNUM, 20);\r\n\t//\t\t\tbreak;\r\n\r\n\t//\t\t// SET_BLOCKLEN\r\n\t//\t\tcase 0x50:\r\n\t//\t\t\tcard.address = 0;\r\n\t//\t\t\tcard.transfer_count = 6;\r\n\t//\t\t\tcard.blocklen = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24);\r\n\t//\t\t\tNDS_makeInt(PROCNUM, 20);\r\n\t//\t\t\tbreak;\r\n\r\n\t//\t\t// READ_SINGLE_BLOCK\r\n\t//\t\tcase 0x51:\r\n\t//\t\t\tcard.address = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24);\r\n\t//\t\t\tcard.transfer_count = (card.blocklen + 3) >> 2;\r\n\t//\t\t\tNDS_makeInt(PROCNUM, 20);\r\n\t//\t\t\tbreak;\r\n\t//\t\t}\r\n\t//\t\tbreak;\r\n\r\n\t//\t// --- Ninja SD commands end ---------------------------------\r\n\r\n\r\n\r\n\t//\t\t//GCDATAIN:\r\n\t//\t// --- Ninja SD commands -------------------------------------\r\n\r\n\t//\t// NJSD_sendCMDN() / NJSD_sendCMDR()\r\n\t//\tcase 0xF0:\r\n\t//\tcase 0xF1:\r\n\t//\t\tswitch (card.command[2])\r\n\t//\t\t{\r\n\t//\t\t// ALL_SEND_CID\r\n\t//\t\tcase 0x42:\r\n\t//\t\t\tif (card.transfer_count == 2) val = 0x44534A4E;\r\n\t//\t\t\telse val = 0x00000000;\r\n\r\n\t//\t\t// SEND_RELATIVE_ADDR\r\n\t//\t\tcase 0x43:\r\n\t//\t\tcase 0x47:\r\n\t//\t\tcase 0x49:\r\n\t//\t\tcase 0x50:\r\n\t//\t\t\tval = 0x00000000;\r\n\t//\t\t\tbreak;\r\n\r\n\t//\t\tcase 0x4D:\r\n\t//\t\t\tif (card.transfer_count == 2) val = 0x09000000;\r\n\t//\t\t\telse val = 0x00000000;\r\n\t//\t\t\tbreak;\r\n\r\n\t//\t\t// APP_CMD\r\n\t//\t\tcase 0x77:\r\n\t//\t\t\tif (card.transfer_count == 2) val = 0x00000037;\r\n\t//\t\t\telse val = 0x00000000;\r\n\t//\t\t\tbreak;\r\n\r\n\t//\t\t// SD_APP_OP_COND\r\n\t//\t\tcase 0x69:\r\n\t//\t\t\tif (card.transfer_count == 2) val = 0x00008000;\r\n\t//\t\t\telse val = 0x00000000;\r\n\t//\t\t\tbreak;\r\n\r\n\t//\t\t// READ_SINGLE_BLOCK\r\n\t//\t\tcase 0x51:\r\n\t//\t\t\tval = 0x00000000;\r\n\t//\t\t\tbreak;\r\n\t//\t\t}\r\n\t//\t\tbreak;\r\n\r\n\t//\t// --- Ninja SD commands end ---------------------------------\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot1_retail_nand.cpp",
    "content": "/*  Copyright (C) 2011 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"../slot1.h\"\r\n#include \"../registers.h\"\r\n#include \"../MMU.h\"\r\n#include \"../NDSSystem.h\"\r\n\r\nstatic void info(char *info) { strcpy(info, \"Slot1 Retail NAND card emulation\"); }\r\nstatic void config(void) {}\r\n\r\nstatic BOOL init() { return (TRUE); }\r\n\r\nstatic void reset() {}\r\n\r\nstatic void close() {}\r\n\r\n\r\nstatic void write08(u8 PROCNUM, u32 adr, u8 val) {}\r\nstatic void write16(u8 PROCNUM, u32 adr, u16 val) {}\r\n\r\nstatic void write32_GCROMCTRL(u8 PROCNUM, u32 val)\r\n{\r\n\tnds_dscard& card = MMU.dscard[PROCNUM];\r\n\r\n\tswitch(card.command[0])\r\n\t{\r\n\t\tcase 0x00: //Data read\r\n\t\tcase 0xB7:\r\n\t\t\tcard.address = \t(card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];\r\n\t\t\tcard.transfer_count = 0x80;\r\n\t\t\tbreak;\r\n\r\n\t\tcase 0xB8:\t// Chip ID\r\n\t\t\tcard.address = 0;\r\n\t\t\tcard.transfer_count = 1;\r\n\t\t\tbreak;\r\n\r\n\t\t// Nand Init\r\n\t\tcase 0x94:\r\n\t\t\tcard.address = 0;\r\n\t\t\tcard.transfer_count = 0x80;\r\n\t\t\tbreak;\r\n\r\n\t\t// Nand Error?\r\n\t\tcase 0xD6:\r\n\t\t\tcard.address = 0;\r\n\t\t\tcard.transfer_count = 1;\r\n\t\t\tbreak;\r\n\t\t\r\n\t\t// Nand Write? ---- PROGRAM for INTERNAL DATA MOVE/RANDOM DATA INPUT\r\n\t\t//case 0x8B:\r\n\t\tcase 0x85:\r\n\t\t\tcard.address = 0;\r\n\t\t\tcard.transfer_count = 0x80;\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tcard.address = 0;\r\n\t\t\tcard.transfer_count = 0;\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic void write32(u8 PROCNUM, u32 adr, u32 val)\r\n{\r\n\tswitch(adr)\r\n\t{\r\n\tcase REG_GCROMCTRL:\r\n\t\twrite32_GCROMCTRL(PROCNUM, val);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic u8 read08(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFF;\r\n}\r\nstatic u16 read16(u8 PROCNUM, u32 adr)\r\n{\r\n\treturn 0xFFFF;\r\n}\r\n\r\nstatic u32 read32_GCDATAIN(u8 PROCNUM)\r\n{\r\n\tnds_dscard& card = MMU.dscard[PROCNUM];\r\n\r\n\tswitch(card.command[0])\r\n\t{\r\n\t\t//Get ROM chip ID\r\n\t\tcase 0x90:\r\n\t\tcase 0xB8:\r\n\t\t\t{\r\n\t\t\t\t// Note: the BIOS stores the chip ID in main memory\r\n\t\t\t\t// Most games continuously compare the chip ID with\r\n\t\t\t\t// the value in memory, probably to know if the card\r\n\t\t\t\t// was removed.\r\n\t\t\t\t// As DeSmuME boots directly from the game, the chip\r\n\t\t\t\t// ID in main mem is zero and this value needs to be\r\n\t\t\t\t// zero too.\r\n\r\n\t\t\t\t//staff of kings verifies this (it also uses the arm7 IRQ 20)\r\n\t\t\t\tif(nds.cardEjected) //TODO - handle this with ejected card slot1 device (and verify using this case)\r\n\t\t\t\t\treturn 0xFFFFFFFF;\r\n\t\t\t\telse return 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\r\n\t\t// Data read\r\n\t\tcase 0x00:\r\n\t\tcase 0xB7:\r\n\t\t\t{\r\n\t\t\t\t// Make sure any reads below 0x8000 redirect to 0x8000+(adr&0x1FF) as on real cart\r\n\t\t\t\tif((card.command[0] == 0xB7) && (card.address < 0x8000))\r\n\t\t\t\t{\r\n\t\t\t\t\t//TODO - refactor this to include the PROCNUM, for debugging purposes if nothing else\r\n\t\t\t\t\t//(can refactor gbaslot also)\r\n\r\n\t\t\t\t\t//INFO(\"Read below 0x8000 (0x%04X) from: ARM%s %08X\\n\",\r\n\t\t\t\t\t//\tcard.address, (PROCNUM ? \"7\":\"9\"), (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr);\r\n\r\n\t\t\t\t\tcard.address = (0x8000 + (card.address&0x1FF));\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//it seems that etrian odyssey 3 doesnt work unless we mask this to cart size.\r\n\t\t\t\t//but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision\r\n\t\t\t\t//but there is no test case yet\r\n\t\t\t\tu32 address = card.address & (gameInfo.mask);\r\n\r\n\t\t\t\t//as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms)\r\n\t\t\t\t//we need to protect ourselves by returning 0xFF for things still out of range\r\n\t\t\t\tif(address >= gameInfo.romsize)\r\n\t\t\t\t{\r\n\t\t\t\t\tDEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize);\r\n\t\t\t\t\treturn 0xFFFFFFFF;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn T1ReadLong(MMU.CART_ROM, address);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\t// Nand Init?\r\n\t\tcase 0x94:\r\n\t\t\treturn 0; //Unsure what to return here so return 0 for now\r\n\r\n\t\t// Nand Status?\r\n\t\tcase 0xD6:\r\n\t\t\t//0x80 == busy\r\n\t\t\t// Made in Ore/WariWare D.I.Y. need set value to 0x80\r\n\t\t\treturn 0x80; //0x20 == ready\r\n\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t} //switch(card.command[0])\r\n} //read32_GCDATAIN\r\n\r\nstatic u32 read32(u8 PROCNUM, u32 adr)\r\n{\r\n\tswitch(adr)\r\n\t{\r\n\tcase REG_GCDATAIN:\r\n\t\treturn read32_GCDATAIN(PROCNUM);\r\n\tdefault:\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\n\r\nSLOT1INTERFACE slot1Retail_NAND = {\r\n\t\"Retail with NAND Flash\",\r\n\tinit,\r\n\treset,\r\n\tclose,\r\n\tconfig,\r\n\twrite08,\r\n\twrite16,\r\n\twrite32,\r\n\tread08,\r\n\tread16,\r\n\tread32,\r\n\tinfo\r\n};\r\n\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_expMemory.cpp",
    "content": "/*  Copyright (C) 2009-2010 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"../addons.h\"\r\n#include \"../mem.h\"\r\n#include <string.h>\r\n#include \"../MMU.h\"\r\n\r\nu8\t\t*expMemory\t=\tNULL;\r\nu32\t\texpMemSize = 8 * 1024 * 1024; // 8Mb\r\n\r\n#if 0\r\n#define EXPINFO(...) INFO(__VA_ARGS__)\r\n#else\r\n#define EXPINFO(...)\r\n#endif \r\n\r\nstatic BOOL ExpMemory_init(void) { return (TRUE); }\r\nstatic void ExpMemory_reset(void)\r\n{\r\n\tif (expMemory)\r\n\t{\r\n\t\tdelete [] expMemory;\r\n\t\texpMemory = NULL;\r\n\t}\r\n\texpMemory = new u8 [expMemSize];\r\n\tmemset(expMemory, 0xFF, expMemSize);\r\n}\r\nstatic void ExpMemory_close(void)\r\n{\r\n\tif (expMemory)\r\n\t{\r\n\t\tdelete [] expMemory;\r\n\t\texpMemory = NULL;\r\n\t}\r\n}\r\nstatic void ExpMemory_config(void) {}\r\nstatic void ExpMemory_write08(u32 procnum, u32 adr, u8 val) \r\n{\r\n\tif (adr >= 0x09000000)\r\n\t{\r\n\t\tu32 offs = (adr - 0x09000000);\r\n\t\tif (offs >= expMemSize) return;\r\n\t\tT1WriteByte(expMemory, offs, val);\r\n\t}\r\n\tEXPINFO(\"ExpMemory: write 08 at 0x%08X = 0x%02X\\n\", adr, val);\r\n}\r\nstatic void ExpMemory_write16(u32 procnum, u32 adr, u16 val) \r\n{\r\n\tif (adr >= 0x09000000)\r\n\t{\r\n\t\tu32 offs = (adr - 0x09000000);\r\n\t\tif (offs >= expMemSize) return;\r\n\t\tT1WriteWord(expMemory, offs, val);\r\n\t}\r\n\tEXPINFO(\"ExpMemory: write 16 at 0x%08X = 0x%04X\\n\", adr, val);\r\n}\r\nstatic void ExpMemory_write32(u32 procnum, u32 adr, u32 val) \r\n{\r\n\t\r\n\tif (adr >= 0x09000000)\r\n\t{\r\n\t\tu32 offs = (adr - 0x09000000);\r\n\t\tif (offs >= expMemSize) return;\r\n\t\tT1WriteLong(expMemory, offs, val);\r\n\t}\r\n\tEXPINFO(\"ExpMemory: write 32 at 0x%08X = 0x%08X\\n\", adr, val);\r\n}\r\n\r\nstatic u8 header_0x00B0[] = \r\n{ 0xFF, 0xFF, 0x96, 0x00,  //this 0x96 is strange. it can't be read from the pak when it boots, it must appear later\r\n  0x00, 0x24, 0x24, 0x24, \r\n  0xFF, 0xFF, 0xFF, 0xFF,\r\n  0xFF, 0xFF, 0xFF, 0x7F\r\n};\r\n\r\nstatic u8 ExpMemory_read08(u32 procnum, u32 adr)\r\n{\r\n\tEXPINFO(\"ExpMemory: read 08 at 0x%08X\\n\", adr);\r\n\t\r\n\tif(adr>=0x080000B0 && adr<0x080000C0)\r\n\t\treturn T1ReadByte(header_0x00B0,adr-0x080000B0);\r\n\r\n\tif (adr >= 0x09000000)\r\n\t{\r\n\t\tu32 offs = (adr - 0x09000000);\r\n\t\tif (offs >= expMemSize) return (0xFF);\r\n\t\treturn T1ReadByte(expMemory, offs);\r\n\t}\r\n\r\n\treturn 0xFF;\r\n}\r\nstatic u16 ExpMemory_read16(u32 procnum, u32 adr)\r\n{\r\n\tif(adr>=0x080000B0 && adr<0x080000C0)\r\n\t\treturn T1ReadWord(header_0x00B0,adr-0x080000B0);\r\n\r\n\tif (adr == 0x0801FFFC) return 0x7FFF;\r\n\tif (adr == 0x08240002) return 0; //this can't be 0xFFFF. dunno why, we just guessed 0\r\n\r\n\tif (adr >= 0x09000000)\r\n\t{\r\n\t\tu32 offs = (adr - 0x09000000);\r\n\t\tif (offs >= expMemSize) return (0xFFFF);\r\n\t\treturn T1ReadWord(expMemory, offs);\r\n\t}\r\n\r\n\tEXPINFO(\"ExpMemory: read 16 at 0x%08X\\n\", adr);\r\n\treturn 0xFFFF;\r\n}\r\nstatic u32 ExpMemory_read32(u32 procnum, u32 adr)\r\n{\r\n\tif(adr>=0x080000B0 && adr<0x080000C0)\r\n\t\treturn T1ReadLong(header_0x00B0,adr-0x080000B0);\r\n\r\n\tif (adr >= 0x09000000)\r\n\t{\r\n\t\tu32 offs = (adr - 0x09000000);\r\n\t\tif (offs >= expMemSize) return 0xFFFFFFFF;\r\n\t\treturn T1ReadLong(expMemory, offs);\r\n\t}\r\n\r\n\tEXPINFO(\"ExpMemory: read 32 at 0x%08X\\n\", adr);\r\n\treturn 0xFFFFFFFF;\r\n}\r\nstatic void ExpMemory_info(char *info) { strcpy(info, \"Memory Expansion Pak\"); }\r\n\r\nADDONINTERFACE addonExpMemory = {\r\n\t\t\t\t\"Memory Expansion Pak\",\r\n\t\t\t\tExpMemory_init,\r\n\t\t\t\tExpMemory_reset,\r\n\t\t\t\tExpMemory_close,\r\n\t\t\t\tExpMemory_config,\r\n\t\t\t\tExpMemory_write08,\r\n\t\t\t\tExpMemory_write16,\r\n\t\t\t\tExpMemory_write32,\r\n\t\t\t\tExpMemory_read08,\r\n\t\t\t\tExpMemory_read16,\r\n\t\t\t\tExpMemory_read32,\r\n\t\t\t\tExpMemory_info};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_gbagame.cpp",
    "content": "/*  Copyright (C) 2009 CrazyMax\n\tCopyright (C) 2009 DeSmuME team\n\n    This file is part of DeSmuME\n\n    DeSmuME is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    DeSmuME is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with DeSmuME; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n*/\n\n#include \"../addons.h\"\n#include \"../mem.h\"\n#include <string.h>\n#include \"../MMU.h\"\n#include \"../path.h\"\n\n//SRAM is going to be stored just above the rom.\n//that is convenient for us, since it mirrors the nds memory map\n#define GBA_ROMSIZE (32 * 1024 * 1024) + 1\n#define GBA_SAVESIZE (512 * 1024) + 1\n\nstatic u8\t\t*GBArom = NULL;\nstatic u8\t\t*saveData = NULL;\nstatic u8\t\tsaveType = 0xFF;\n\n//================================================================================== Flash GBA\ntypedef struct \n{\n\tu8\tstate;\n\tu8\tcmd;\n\tu32\tsize;\n\tu8\tidDevice;\n\tu8\tidManufacturer;\n\tu8\tbank;\n} FLASH_GBA;\n\nFLASH_GBA\tgbaFlash = {0};\n\nstatic void gbaWriteFlash(u32 adr, u8 val)\n{\n\tswitch (gbaFlash.state)\n\t{\n\t\tcase 0:\n\t\t\tif (adr == 0x0A005555)\n\t\t\t{\n\t\t\t\tif (val == 0xF0)\n\t\t\t\t{\n\t\t\t\t\t//INFO(\"GBAgame: Flash: reset\\n\");\n\t\t\t\t\tgbaFlash.state = 0;\n\t\t\t\t\tgbaFlash.cmd = 0;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (val == 0xAA)\n\t\t\t\t{\n\t\t\t\t\tgbaFlash.state = 1;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (adr == 0x0A000000)\n\t\t\t{\n\t\t\t\tif (gbaFlash.cmd == 0xB0)\n\t\t\t\t{\n\t\t\t\t\tgbaFlash.bank = val;\n\t\t\t\t\tgbaFlash.cmd = 0;\n\t\t\t\t\t//INFO(\"GBAgame: Flash: change bank %i\\n\", val);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tif ( (adr == 0x0A002AAA) && (val == 0x55) )\n\t\t\t{\n\t\t\t\tgbaFlash.state = 2;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgbaFlash.state = 0;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tif (adr == 0x0A005555)\n\t\t\t{\n\t\t\t\t//INFO(\"GBAgame: Flash: send command flash 0x%02X\\n\", val);\n\t\t\t\tswitch (val)\n\t\t\t\t{\n\t\t\t\t\tcase 0x80:\t\t// Erase\n\t\t\t\t\t\tgbaFlash.state = 0x80;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x90:\t\t// Chip Identification\n\t\t\t\t\t\tgbaFlash.state = 0x90;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0xA0:\t\t// Write\n\t\t\t\t\t\tgbaFlash.state = 0;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tgbaFlash.state = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tgbaFlash.cmd = val;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgbaFlash.state = 0;\n\t\tbreak;\n\n\t\t// erase\n\t\tcase 0x80:\n\t\t\tif ( (adr == 0x0A005555) && (val == 0xAA) )\n\t\t\t{\n\t\t\t\tgbaFlash.state = 0x81;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgbaFlash.state = 0;\n\t\tbreak;\n\n\t\tcase 0x81:\n\t\t\tif ( (adr == 0x0A002AAA) && (val == 0x55) )\n\t\t\t{\n\t\t\t\tgbaFlash.state = 0x82;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgbaFlash.state = 0;\n\t\tbreak;\n\n\t\tcase 0x82:\n\t\t\tif (val == 0x30)\n\t\t\t{\n\t\t\t\tu32 ofs = (adr & 0x0000F000);\n\t\t\t\t//INFO(\"GBAgame: Flash: erase from 0x%08X to 0x%08X\\n\", ofs + 0x0A000000, ofs + 0x0A001000);\n\t\t\t\tfor (u32 i = ofs; i < (ofs + 0x1000); i++)\n\t\t\t\t\tsaveData[i] = 0xFF;\n\t\t\t}\n\t\t\tgbaFlash.state = 0;\n\t\t\tgbaFlash.cmd = 0;\n\t\treturn;\n\n\t\t// Chip Identification\n\t\tcase 0x90:\n\t\t\tif ( (adr == 0x0A005555) && (val == 0xAA) )\n\t\t\t{\n\t\t\t\tgbaFlash.state = 0x91;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgbaFlash.state = 0;\n\t\tbreak;\n\n\t\tcase 0x91:\n\t\t\tif ( (adr == 0x0A002AAA) && (val == 0x55) )\n\t\t\t{\n\t\t\t\tgbaFlash.state = 0x92;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgbaFlash.state = 0;\n\t\tbreak;\n\n\t\tcase 0x92:\n\t\t\tgbaFlash.state = 0;\n\t\t\tgbaFlash.cmd = 0;\n\t\treturn;\n\t}\n\n\tif (gbaFlash.cmd == 0xA0)\t// write\n\t{\n\t\tsaveData[(adr & 0x1FFFF)+(0x10000*gbaFlash.bank)] = val;\n\t\tgbaFlash.state = 0;\n\t\tgbaFlash.cmd = 0;\n\t\treturn;\n\t}\n\tINFO(\"GBAgame: Flash: write unknown atn 0x%08X = 0x%02X\\n\", adr, val);\n}\n\nstatic u8 gbaReadFlash(u32 adr)\n{\n\tif (gbaFlash.cmd == 0)\n\t{\n\t\t//INFO(\"GBAgame: flash read at 0x%08X = 0x%02X\\n\", adr, saveData[(adr & 0x1FFFF)+(0x10000*gbaFlash.bank)]);\n\t\treturn saveData[(adr & 0x1FFFF)+(0x10000*gbaFlash.bank)];\n\t}\n\n\t//INFO(\"GBAgame: flash read at 0x%08X\\n\", adr);\n\n\tswitch (gbaFlash.cmd)\n\t{\n\t\tcase 0x90:\t\t\t// Chip Identification\n\t\t\tif (adr == 0x0A000000) return gbaFlash.idManufacturer;\n\t\t\tif (adr == 0x0A000001) return gbaFlash.idDevice;\n\t\tbreak;\n\n\t\tcase 0xF0:\t\t\t//\n\t\t\t//INFO(\"GBAgame: Flash: reset2\\n\");\n\t\t\tgbaFlash.state = 0;\n\t\t\tgbaFlash.cmd = 0;\n\t\tbreak;\n\n\t\tcase 0xB0:\t\t\t// Bank switching\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tINFO(\"GBAgame: Flash: read - unknown command at 0x%08X = 0x%02X\\n\", adr, gbaFlash.cmd);\n\t\tbreak;\n\t}\n\n\treturn 0xFF;\n}\n//==================================================================================\n\nstatic u8 getSaveTypeGBA(const u8 *data, const u32 size)\n{\n\tu8\t*dat = (u8 *)data;\n\t\n\tfor (u32 i = 0; i < size; i++)\n\t{\n\t\tu32\ttmp = T1ReadLong(dat, 0);\n\n\t\tif (tmp == 0x52504545)\n\t\t{\n\t\t\tif(memcmp(dat, \"EEPROM_\", 7) == 0)\n\t\t\t{\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\n\t\tif (tmp == 0x4D415253)\n\t\t{\n\t\t\tif(memcmp(dat, \"SRAM_\", 5) == 0)\n\t\t\t{\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\n\t\tif (tmp == 0x53414C46)\n\t\t{\n\t\t\tif(memcmp(dat, \"FLASH1M_\", 8) == 0)\n\t\t\t{\n\t\t\t\treturn 3;\n\t\t\t}\n\t\t}\n\n\t\tif (tmp == 0x52494953)\n\t\t{\n\t\t\tif(memcmp(dat, \"SIIRTC_V\", 8) == 0)\n\t\t\t{\n\t\t\t\treturn 4;\n\t\t\t}\n\t\t}\n\n\t\tif(memcmp(dat, \"FLASH\", 5) == 0)\n\t\t{\n\t\t\treturn 5;\n\t\t}\n\t\tdat++;\n\t}\n\n\treturn 0xFF;\t\t// NONE\n}\n\nstatic BOOL GBAgame_init(void)\n{\n\treturn (TRUE); \n}\n\nstatic void GBAgame_reset(void)\n{\n\tmemset(&gbaFlash, 0, sizeof(gbaFlash));\n\n\tif (GBArom)\n\t{\n\t\tdelete [] GBArom;\n\t\tGBArom = NULL;\n\t}\n\tGBArom = new u8 [GBA_ROMSIZE];\n\tmemset(GBArom, 0xFF, GBA_ROMSIZE);\n\n\tif (saveData)\n\t{\n\t\tdelete [] saveData;\n\t\tsaveData = NULL;\n\t}\n\tsaveData = new u8 [GBA_SAVESIZE];\n\tmemset(saveData, 0xFF, GBA_SAVESIZE);\n\n\tif (!strlen(GBAgameName)) return;\n\tFILE *fgame = 0;\n\n\t//perk: if the gbagame name is \"self\" this is a special indicator that we should mount the main rom that we're running as the gba game\n\tif(!strcasecmp(GBAgameName,\"self\"))\n\t{\n\t\tstrcpy(GBAgameName,path.path.c_str());\n\t}\n\n\tfgame = fopen(GBAgameName,\"rb\");\n\tif (!fgame) return;\n\tfseek(fgame, 0, SEEK_END);\n\tu32 size = ftell(fgame);\n\trewind(fgame);\n\n\tif (!fread(GBArom, 1, size, fgame))\n\t{\n\t\tfclose(fgame);\n\t\treturn;\n\t}\n\tfclose(fgame);\n\n\tsaveType = getSaveTypeGBA(GBArom, size);\n\tINFO(\"Loaded \\\"%s\\\" in GBA slot (save type %i)\\n\", GBAgameName, saveType);\n\n\t//try loading the sram\n\tchar * dot = strrchr(GBAgameName,'.');\n\tif(!dot) return;\n\tstd::string sram_fname = GBAgameName;\n\tsram_fname.resize(dot-GBAgameName);\n\tsram_fname += \".sav\";\n\tfgame = fopen(sram_fname.c_str(),\"rb\");\n\tif(!fgame) return;\n\n\tfseek(fgame, 0, SEEK_END);\n\tsize = ftell(fgame);\n\trewind(fgame);\n\n\tif (!fread(saveData, 1, size, fgame))\n\t{\n\t\tfclose(fgame);\n\t\treturn;\n\t}\n\tfclose(fgame);\n\t\n\tgbaFlash.size = size;\n\tif (gbaFlash.size <= (64 * 1024))\n\t{\n\t\tgbaFlash.idDevice = 0x1B;\n\t\tgbaFlash.idManufacturer = 0x32;\n\t}\n\telse\n\t{\n\t\tgbaFlash.idDevice = 0x09;\n\t\tgbaFlash.idManufacturer = 0xC2;\n\t}\n\t\n\tINFO(\"Loaded save \\\"%s\\\" in GBA slot\\n\", sram_fname.c_str());\n}\n\nstatic void GBAgame_close(void)\n{\n\tif (GBArom)\n\t{\n\t\tdelete [] GBArom;\n\t\tGBArom = NULL;\n\t}\n\n\tif (saveData)\n\t{\n\t\tdelete [] saveData;\n\t\tsaveData = NULL;\n\t}\n}\n\nstatic void GBAgame_config(void) {}\n\nstatic void GBAgame_write08(u32 procnum, u32 adr, u8 val)\n{\n\t//INFO(\"GBAgame: write08 at 0x%08X val=0x%02X\\n\", adr, val);\n\tif ( (adr >= 0x0A000000) && (adr < 0x0A010000) )\n\t{\n\t\tswitch (saveType)\n\t\t{\n\t\t\tcase 3:\t\t\t// Flash\n\t\t\tcase 5:\n\t\t\t\tgbaWriteFlash(adr, val);\n\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\t//return (u8)T1ReadByte(saveData, (adr - 0x0A000000));\n\t}\n}\nstatic void GBAgame_write16(u32 procnum, u32 adr, u16 val)\n{\n\t//INFO(\"GBAgame: write16 at 0x%08X val=0x%04X\\n\", adr, val); \n}\n\nstatic void GBAgame_write32(u32 procnum, u32 adr, u32 val)\n{\n\t//INFO(\"GBAgame: write32 at 0x%08X val=0x%08X\\n\", adr, val);\n}\n\nstatic u8   GBAgame_read08(u32 procnum, u32 adr)\n{ \n\t//INFO(\"GBAgame: read08 at 0x%08X value 0x%02X\\n\", adr, (u8)T1ReadByte(GBArom, (adr - 0x08000000)));\n\n\tif (adr < 0x0A000000)\n\t\treturn (u8)T1ReadByte(GBArom, (adr - 0x08000000));\n\n\tif (adr < 0x0A010000)\n\t{\n\t\tswitch (saveType)\n\t\t{\n\t\t\tcase 3:\t\t\t// Flash\n\t\t\tcase 5:\n\t\t\t\treturn gbaReadFlash(adr);\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\t//INFO(\"Read08 at 0x%08X val=0x%08X\\n\", adr, (u8)T1ReadByte(GBArom, (adr - 0x08000000)) );\n\t\treturn (u8)T1ReadByte(saveData, (adr - 0x0A000000));\n\t}\n\n\t//INFO(\"Read08 at 0x%08X val=0x%08X\\n\", adr, (u8)T1ReadByte(GBArom, (adr - 0x08000000)) );\n\n\treturn 0xFF;\n}\n\nstatic u16  GBAgame_read16(u32 procnum, u32 adr)\n{ \n\t//INFO(\"GBAgame: read16 at 0x%08X value 0x%04X\\n\", adr, (u16)T1ReadWord(GBArom, (adr - 0x08000000)));\n\t\n\tif (adr < 0x0A000000)\n\t\treturn (u16)T1ReadWord(GBArom, (adr - 0x08000000));\n\n\tif (adr < 0x0A010000)\n\t{\n\t\t//INFO(\"GBAgame: flash read16 at 0x%08X\\n\", adr);\n\t\treturn (u16)T1ReadWord(saveData, (adr - 0x0A000000));\n\t}\n\treturn 0xFFFF;\n}\n\nstatic u32  GBAgame_read32(u32 procnum, u32 adr)\n{ \n\t//INFO(\"GBAgame: read32 at 0x%08X value 0x%08X\\n\", adr, (u32)T1ReadLong(GBArom, (adr - 0x08000000)));\n\n\tif (adr < 0x0A000000)\n\t\treturn (u32)T1ReadLong(GBArom, (adr - 0x08000000));\n\n\tif (adr < 0x0A010000)\n\t{\n\t\t//INFO(\"GBAgame: flash read32 at 0x%08X\\n\", adr);\n\t\treturn (u32)T1ReadLong(saveData, (adr - 0x0A000000));\n\t}\n\treturn 0xFFFFFFFF;\n}\n\nstatic void GBAgame_info(char *info)\n{\n\tstrcpy(info, \"GBA game in slot\");\n}\n\nADDONINTERFACE addonGBAgame = {\n\t\t\t\t\"GBA game\",\n\t\t\t\tGBAgame_init,\n\t\t\t\tGBAgame_reset,\n\t\t\t\tGBAgame_close,\n\t\t\t\tGBAgame_config,\n\t\t\t\tGBAgame_write08,\n\t\t\t\tGBAgame_write16,\n\t\t\t\tGBAgame_write32,\n\t\t\t\tGBAgame_read08,\n\t\t\t\tGBAgame_read16,\n\t\t\t\tGBAgame_read32,\n\t\t\t\tGBAgame_info};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_guitarGrip.cpp",
    "content": "/*  Copyright (C) 2009-2010 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"../addons.h\"\r\n#include <string.h>\r\n\r\nstatic u8\tguitarKeyStatus = 0;\r\n\r\nstatic BOOL guitarGrip_init(void) { return (TRUE); }\r\nstatic void guitarGrip_reset(void)\r\n{\r\n\t//INFO(\"GuitarGrip: Reset\\n\");\r\n\tguitarKeyStatus = 0;\r\n}\r\nstatic void guitarGrip_close(void) {}\r\nstatic void guitarGrip_config(void) {}\r\nstatic void guitarGrip_write08(u32 procnum, u32 adr, u8 val) {}\r\nstatic void guitarGrip_write16(u32 procnum, u32 adr, u16 val) {}\r\nstatic void guitarGrip_write32(u32 procnum, u32 adr, u32 val) {}\r\nstatic u8   guitarGrip_read08(u32 procnum, u32 adr)\r\n{\r\n\t//INFO(\"GuitarGrip: read 08 at 0x%08X\\n\", adr);\r\n\tif (adr == 0x0A000000) return (~guitarKeyStatus);\r\n\telse if(adr&1) return 0xF9;\r\n\telse return 0xFF;\r\n}\r\nstatic u16  guitarGrip_read16(u32 procnum, u32 adr)\r\n{\r\n\t//INFO(\"GuitarGrip: read 16 at 0x%08X\\n\", adr);\r\n\treturn 0xF9FF;\r\n}\r\nstatic u32  guitarGrip_read32(u32 procnum, u32 adr)\r\n{\r\n\t//INFO(\"GuitarGrip: read 32 at 0x%08X\\n\", adr);\r\n\treturn (0xF9FFF9FF);\r\n}\r\nstatic void guitarGrip_info(char *info) { strcpy(info, \"Guitar Grip for Guitar Hero games\"); }\r\n\r\nvoid guitarGrip_setKey(bool green, bool red, bool yellow, bool blue)\r\n{\r\n\tguitarKeyStatus = 0 | (green << 6) | (red << 5) | (yellow << 4) | (blue << 3);\r\n}\r\n\r\nADDONINTERFACE addonGuitarGrip = {\r\n\t\t\t\t\"Guitar Grip\",\r\n\t\t\t\tguitarGrip_init,\r\n\t\t\t\tguitarGrip_reset,\r\n\t\t\t\tguitarGrip_close,\r\n\t\t\t\tguitarGrip_config,\r\n\t\t\t\tguitarGrip_write08,\r\n\t\t\t\tguitarGrip_write16,\r\n\t\t\t\tguitarGrip_write32,\r\n\t\t\t\tguitarGrip_read08,\r\n\t\t\t\tguitarGrip_read16,\r\n\t\t\t\tguitarGrip_read32,\r\n\t\t\t\tguitarGrip_info};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_mpcf.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006 Mic\n\tCopyright (C) 2009-2011 DeSmuME team\n\n\tThis file is part of DeSmuME\n\n\tDeSmuME is free software; you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation; either version 2 of the License, or\n\t(at your option) any later version.\n\n\tDeSmuME is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with DeSmuME; if not, write to the Free Software\n\tFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n*/\n\n#include \"../addons.h\"\n#include <string>\n#include <string.h>\n#include \"debug.h\"\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"types.h\"\n#include \"../utils/vfat.h\"\n#include \"../path.h\"\n\n#include \"MMU.h\"\n#include \"NDSSystem.h\"\n\n// Set up addresses for GBAMP\n#define CF_REG_DATA 0x9000000\n#define CF_REG_ERR 0x9020000\n#define CF_REG_SEC 0x9040000\n#define CF_REG_LBA1 0x9060000\n#define CF_REG_LBA2 0x9080000\n#define CF_REG_LBA3 0x90A0000\n#define CF_REG_LBA4 0x90C0000\n#define CF_REG_CMD 0x90E0000\n#define CF_REG_STS 0x98C0000\n\n// CF Card commands\n#define CF_CMD_LBA 0xE0\n#define CF_CMD_READ 0x20\n#define CF_CMD_WRITE 0x30\n\nstatic u16\tcf_reg_sts, \n\t\t\tcf_reg_lba1,\n\t\t\tcf_reg_lba2,\n\t\t\tcf_reg_lba3,\n\t\t\tcf_reg_lba4,\n\t\t\tcf_reg_cmd;\nstatic off_t currLBA;\n\nstatic const int lfnPos[13] = {1,3,5,7,9,14,16,18,20,22,24,28,30};\n\nstatic u32 fileStartLBA,fileEndLBA;\nstatic std::string sFlashPath;\nstatic BOOL cflashDeviceEnabled = FALSE;\n\nstatic EMUFILE* file = NULL;\n\n// ===========================\nBOOL\tinited;\n\nenum EListCallbackArg {\n\tEListCallbackArg_Item, EListCallbackArg_Pop\n};\n\nstatic BOOL cflash_init() \n{\n\tif (inited) return FALSE;\n\tBOOL init_good = FALSE;\n\n\tCFLASHLOG(\"CFlash_Mode: %d\\n\",CFlash_Mode);\n\n\tif (CFlash_Mode == ADDON_CFLASH_MODE_RomPath)\n\t{\n\t\tsFlashPath = path.RomDirectory;\n\t\tINFO(\"Using CFlash directory of rom: %s\\n\", sFlashPath.c_str());\n\t}\n\telse if(CFlash_Mode == ADDON_CFLASH_MODE_Path)\n\t{\n\t\tsFlashPath = CFlash_Path;\n\t\tINFO(\"Using CFlash directory: %s\\n\", sFlashPath.c_str());\n\t}\n\n\tif(CFlash_IsUsingPath())\n\t{\n\t\tcflashDeviceEnabled = FALSE;\n\t\tcurrLBA = 0;\n\n\t\tfileStartLBA = fileEndLBA = 0xFFFFFFFF;\n\t\tVFAT vfat;\n\t\tbool ret = vfat.build(sFlashPath.c_str(),16); //allocate 16MB extra for writing. this is probably enough for anyone, but maybe it should be configurable.\n\t\t//we could always suggest to users to add a big file to their directory to overwrite (that would cause the image to get padded)\n\n\t\tif(!ret)\n\t\t{\n\t\t\tCFLASHLOG(\"FAILED cflash_build_fat\\n\");\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tfile = vfat.detach();\n\n\t\tcf_reg_sts = 0x58;\t// READY\n\n\t\tcflashDeviceEnabled = TRUE;\n\t\tinit_good = TRUE;\n\t}\n\telse\n\t{\n\t\tsFlashPath = CFlash_Path;\n\t\tINFO(\"Using CFlash disk image file %s\\n\", sFlashPath.c_str());\n\t\tfile = new EMUFILE_FILE(sFlashPath.c_str(),\"rb+\");\n\t\tif(file->fail())\n\t\t{\n\t\t\tINFO(\"Failed to open file %s\\n\", sFlashPath.c_str());\n\t\t\tdelete file;\n\t\t\tfile = NULL;\n\t\t}\n\t}\n\n\t// READY\n\tcf_reg_sts = 0x58;\n\n\tcurrLBA = 0;\n\tcf_reg_lba1 = cf_reg_lba2 =\n\tcf_reg_lba3 = cf_reg_lba4 = 0;\n\n\tinited = TRUE;\n\treturn init_good;\n}\n\nstatic unsigned int cflash_read(unsigned int address)\n{\n\tunsigned int ret_value = 0;\n\tsize_t elems_read = 0;\n\n\tswitch (address)\n\t{\n\t\tcase CF_REG_STS:\n\t\t\tret_value = cf_reg_sts;\n\t\tbreak;\n\n\t\tcase CF_REG_DATA:\n\t\t\tif (cf_reg_cmd == CF_CMD_READ)\n\t\t\t{\n\t\t\t\tif(file)\n\t\t\t\t{\n\t\t\t\t\tu8 data[2];\n\t\t\t\t\tfile->fseek(currLBA, SEEK_SET);\n\t\t\t\t\telems_read += file->fread(data,2);\n\t\t\t\t\tret_value = data[1] << 8 | data[0];\n\t\t\t\t}\n\t\t\t\tcurrLBA += 2;\n\t\t\t}\n\t\tbreak;\n\n\tcase CF_REG_CMD:\n\tbreak;\n\n\tcase CF_REG_LBA1:\n\t\tret_value = cf_reg_lba1;\n\tbreak;\n\t}\n\n\treturn ret_value;\n}\n\nstatic void cflash_write(unsigned int address,unsigned int data)\n{\n\tstatic u8 sector_data[512];\n\tstatic u32 sector_write_index = 0;\n\n\tswitch (address)\n\t{\n\t\tcase CF_REG_STS:\n\t\t\tcf_reg_sts = data&0xFFFF;\n\t\tbreak;\n\n\t\tcase CF_REG_DATA:\n\t\t\tif (cf_reg_cmd == CF_CMD_WRITE)\n\t\t\t{\n\t\t\t\t{\n\t\t\t\t\tsector_data[sector_write_index] = (data >> 0) & 0xff;\n\t\t\t\t\tsector_data[sector_write_index + 1] = (data >> 8) & 0xff;\n\n\t\t\t\t\tsector_write_index += 2;\n\n\t\t\t\t\tif (sector_write_index == 512) \n\t\t\t\t\t{\n\t\t\t\t\t\tCFLASHLOG( \"Write sector to %ld\\n\", currLBA);\n\t\t\t\t\t\tsize_t written = 0;\n\n\t\t\t\t\t\tif(file) \n\t\t\t\t\t\t\tif(currLBA + 512 < file->size()) \n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfile->fseek(currLBA,SEEK_SET);\n\t\t\t\t      \n\t\t\t\t\t\t\t\twhile(written < 512) \n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsize_t todo = 512-written;\n\t\t\t\t\t\t\t\t\tfile->fwrite(&sector_data[written], todo);\n\t\t\t\t\t\t\t\t\tsize_t cur_write = todo;\n\t\t\t\t\t\t\t\t\twritten += cur_write;\n\t\t\t\t\t\t\t\t\tif ( cur_write == (size_t)-1) break;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tCFLASHLOG(\"Wrote %u bytes\\n\", written);\n\t\t\t\t\t\n\t\t\t\t\t\tcurrLBA += 512;\n\t\t\t\t\t\tsector_write_index = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase CF_REG_CMD:\n\t\t\tcf_reg_cmd = data&0xFF;\n\t\t\tcf_reg_sts = 0x58;\t// READY\n\t\tbreak;\n\n\t\tcase CF_REG_LBA1:\n\t\t\tcf_reg_lba1 = data&0xFF;\n\t\t\tcurrLBA = (currLBA&0xFFFFFF00)| cf_reg_lba1;\n\t\tbreak;\n\n\t\tcase CF_REG_LBA2:\n\t\t\tcf_reg_lba2 = data&0xFF;\n\t\t\tcurrLBA = (currLBA&0xFFFF00FF)|(cf_reg_lba2<<8);\n\t\tbreak;\n\n\t\tcase CF_REG_LBA3:\n\t\t\tcf_reg_lba3 = data&0xFF;\n\t\t\tcurrLBA = (currLBA&0xFF00FFFF)|(cf_reg_lba3<<16);\n\t\tbreak;\n\n\t\tcase CF_REG_LBA4:\n\t\t\tcf_reg_lba4 = data&0xFF;\n\n\t\t\tif ((cf_reg_lba4 & 0xf0) == CF_CMD_LBA)\n\t\t\t{\n\t\t\t\tcurrLBA = (currLBA&0x00FFFFFF)|((cf_reg_lba4&0x0F)<<24);\n\t\t\t\tcurrLBA *= 512;\n\t\t\t\tsector_write_index = 0;\n\t\t\t}\n\t\tbreak;\n\t}  \n}\n\nstatic void cflash_close( void) \n{\n\tif (!inited) return;\n  if(file) delete file;\n\tcflashDeviceEnabled = FALSE;\n  file = NULL;\n\tinited = FALSE;\n}\n\nstatic BOOL init(void)\n{\n\treturn TRUE;\n}\n\nstatic void reset(void)\n{\n\tcflash_close();\n\tcflash_init();\n}\n\nstatic void close(void)\n{\n\tcflash_close();\n}\n\nstatic void config(void)\n{\n}\n\nstatic void write08(u32 procnum, u32 adr, u8 val)\n{\n\tcflash_write(adr, val);\n}\n\nstatic void write16(u32 procnum, u32 adr, u16 val)\n{\n\tcflash_write(adr, val);\n}\n\nstatic void write32(u32 procnum, u32 adr, u32 val)\n{\n\tcflash_write(adr, val);\n}\n\nstatic u8 read08(u32 procnum, u32 adr)\n{\n\treturn (cflash_read(adr));\n}\n\nstatic u16 read16(u32 procnum, u32 adr)\n{\n\treturn (cflash_read(adr));\n}\n\nstatic u32 read32(u32 procnum, u32 adr)\n{\n\treturn (cflash_read(adr));\n}\n\nstatic void info(char *info)\n{\n\tstrcpy(info, \"MPCF Flash Card Device\");\n}\n\nADDONINTERFACE addonCFlash = {\n\t\t\t\t\"MPCF Flash Card Device\",\n\t\t\t\tinit,\n\t\t\t\treset,\n\t\t\t\tclose,\n\t\t\t\tconfig,\n\t\t\t\twrite08,\n\t\t\t\twrite16,\n\t\t\t\twrite32,\n\t\t\t\tread08,\n\t\t\t\tread16,\n\t\t\t\tread32,\n\t\t\t\tinfo};\n\n#undef CFLASHDEBUG\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_none.cpp",
    "content": "/*  Copyright (C) 2009 CrazyMax\n\tCopyright (C) 2009 DeSmuME team\n\n    This file is part of DeSmuME\n\n    DeSmuME is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    DeSmuME is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with DeSmuME; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n*/\n\n#include \"../addons.h\"\n#include <string.h>\n\nstatic BOOL None_init(void) { return (TRUE); }\nstatic void None_reset(void) {}\nstatic void None_close(void) {}\nstatic void None_config(void) {}\nstatic void None_write08(u32 procnum, u32 adr, u8 val) {}\nstatic void None_write16(u32 procnum, u32 adr, u16 val) {}\nstatic void None_write32(u32 procnum, u32 adr, u32 val) {}\nstatic u8   None_read08(u32 procnum, u32 adr){ return (0xFF); }\nstatic u16  None_read16(u32 procnum, u32 adr){ return (0xFFFF); }\nstatic u32  None_read32(u32 procnum, u32 adr){ return (0xFFFFFFFF); }\nstatic void None_info(char *info) { strcpy(info, \"Nothing in GBA slot\"); }\n\nADDONINTERFACE addonNone = {\n\t\t\t\t\"NONE\",\n\t\t\t\tNone_init,\n\t\t\t\tNone_reset,\n\t\t\t\tNone_close,\n\t\t\t\tNone_config,\n\t\t\t\tNone_write08,\n\t\t\t\tNone_write16,\n\t\t\t\tNone_write32,\n\t\t\t\tNone_read08,\n\t\t\t\tNone_read16,\n\t\t\t\tNone_read32,\n\t\t\t\tNone_info};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_paddle.cpp",
    "content": "/*\tCopyright (C) 2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n/*\r\nthis device seems to have a 12bit value (like 20.12 fixed point.. get it?) located at 0x0A000000\r\nclockwise = right = increases.\r\nit returns the correct little endian bytes through byte reads.\r\nthrough halfword reads, it returns the LSB twice\r\nthrough full word reads, it returns the LSB four times. \r\nafter that everything is 0x00.\r\nif the slot2 timings are wrong, then this device will return glitchy or 0xFF output.\r\nso this emulation code will attempt to validate that.\r\narkanoid was setting REG_EXMEMCNT = 0x082F\r\n\r\nthe rom returns 0xEFFF for all addresses and should be used to detect this device\r\n\r\nwriting any byte to SRAM or writing any halfword/word to rom results in a reset or some kind of recalibrate\r\nthe resulting value may be 0x000,0x001, or 0xFFF. seems mostly random, though once it is reset, resetting again won't change it.\r\nyou must wait until the paddle has been moved.\r\n\r\nconclusion:\r\nThe emulation in all the handling of erroneous cases is not perfect, and some other users of the paddle (do any other games use it?)\r\nmaybe legally configure the paddle differently, which could be rejected here; in which case this code will need finetuning\r\n*/\r\n\r\n#include \"../addons.h\"\r\n#include <string.h>\r\n#include \"NDSSystem.h\"\r\n\r\nstatic BOOL init(void) { return (TRUE); }\r\nstatic void reset(void)\r\n{\r\n}\r\n\r\nstatic void calibrate()\r\n{\r\n\tnds.paddle = 0;\r\n}\r\n\r\nstatic void close(void) {}\r\nstatic void config(void) {}\r\nstatic void write08(u32 procnum, u32 adr, u8 val)\r\n{\r\n\tif(adr<0x0A000000) return;\r\n\tcalibrate();\r\n}\r\nstatic void write16(u32 procnum, u32 adr, u16 val)\r\n{\r\n\tif(adr<0x0A000000) { calibrate(); return; }\r\n}\r\nstatic void write32(u32 procnum, u32 adr, u32 val)\r\n{\r\n\tif(adr<0x0A000000) { calibrate(); return; }\r\n}\r\nextern int currFrameCounter;\r\n\r\nstatic bool Validate(u32 procnum, bool rom) {\r\n\tif(rom)\r\n\t\treturn ValidateSlot2Access(procnum,0,0,0,-1);\r\n\telse\r\n\t\treturn ValidateSlot2Access(procnum,18,0,0,1);\r\n}\r\nstatic u8 read08(u32 procnum, u32 adr)\r\n{\r\n\t//printf(\"paddle: read 08 at 0x%08X\\n\", adr);\r\n\tif(!Validate(procnum,adr<0x0A000000))\r\n\t\treturn 0xFF;\r\n\r\n\tif(adr<0x0A000000)\r\n\t{\r\n\t\tif(adr&1) return 0xFF;\r\n\t\telse return 0xEF;\r\n\t}\r\n\r\n\tif(adr==0x0A000000)\r\n\t{\r\n\t\treturn nds.paddle&0xFF;\r\n\t}\r\n\tif(adr==0x0A000001)\r\n\t{\r\n\t\treturn (nds.paddle>>8)&0x0F;\r\n\t}\r\n\treturn 0x00;\r\n}\r\nstatic u16 read16(u32 procnum, u32 adr)\r\n{\r\n\t//printf(\"paddle : read 16 at 0x%08X\\n\", adr);\r\n\tif(!Validate(procnum,adr<0x0A000000))\r\n\t\treturn 0xFFFF;\r\n\r\n\tif(adr<0x0A000000)\r\n\t\treturn 0xEFFF;\r\n\tif(adr==0x0A000000)\r\n\t{\r\n\t\tu8 val = nds.paddle&0xFF;\r\n\t\treturn val|(val<<8);\r\n\t}\r\n\t\r\n\treturn 0x0000;\r\n}\r\nstatic u32 read32(u32 procnum, u32 adr)\r\n{\r\n\t//printf(\"paddle: read 32 at 0x%08X\\n\", adr);\r\n\tif(!Validate(procnum,adr<0x0A000000))\r\n\t\treturn 0xFFFFFFFF;\r\n\r\n\tif(adr<0x0A000000)\r\n\t\treturn 0xEFFFEFFF;\r\n\tif(adr==0x0A000000)\r\n\t{\r\n\t\tu8 val = nds.paddle&0xFF;\r\n\t\treturn val|(val<<8)|(val<<16)|(val<<24);\r\n\t}\r\n\r\n\treturn 0x00000000;\r\n}\r\nstatic void info(char *info) { strcpy(info, \"Paddle\"); }\r\n\r\nADDONINTERFACE addonPaddle = {\r\n\t\"Paddle\",\r\n\tinit,\r\n\treset,\r\n\tclose,\r\n\tconfig,\r\n\twrite08,\r\n\twrite16,\r\n\twrite32,\r\n\tread08,\r\n\tread16,\r\n\tread32,\r\n\tinfo};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_piano.cpp",
    "content": "/*  Copyright (C) 2010-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"../addons.h\"\r\n#include <string.h>\r\n\r\nstatic u16\tpianoKeyStatus = 0;\r\n\r\nstatic BOOL piano_init(void) { return (TRUE); }\r\nstatic void piano_reset(void)\r\n{\r\n\t//INFO(\"piano: Reset\\n\");\r\n\tpianoKeyStatus = 0;\r\n}\r\n\r\nstatic void piano_close(void) {}\r\nstatic void piano_config(void) {}\r\nstatic void piano_write08(u32 procnum, u32 adr, u8 val)\r\n{\r\n\t//INFO(\"piano: write 08 at 0x%08X = %02X\\n\", adr, val);\r\n}\r\nstatic void piano_write16(u32 procnum, u32 adr, u16 val)\r\n{\r\n\t//INFO(\"piano: write 16 at 0x%08X = %04X\\n\", adr, val);\r\n}\r\nstatic void piano_write32(u32 procnum, u32 adr, u32 val)\r\n{\r\n\t//INFO(\"piano: write 32 at 0x%08X = %08X\\n\", adr, val);\r\n}\r\nextern int currFrameCounter;\r\nstatic u8 piano_read08(u32 procnum, u32 adr)\r\n{\r\n\t//printf(\"piano: read 08 at 0x%08X\\n\", adr);\r\n\r\n\t//the actual keyboard output\r\n\r\n\t//byte:bit\r\n\t//0x09FFFFFE:0 = C\r\n\t//0x09FFFFFE:1 = C#\r\n\t//0x09FFFFFE:2 = D\r\n\t//0x09FFFFFE:3 = D#\r\n\t//0x09FFFFFE:4 = E\r\n\t//0x09FFFFFE:5 = F\r\n\t//0x09FFFFFE:6 = F#\r\n\t//0x09FFFFFE:7 = G\r\n\t//0x09FFFFFF:0 = G#\r\n\t//0x09FFFFFF:1 = A\r\n\t//0x09FFFFFF:2 = A#\r\n\t//0x09FFFFFF:3 = ?\r\n\t//0x09FFFFFF:4 = ?\r\n\t//0x09FFFFFF:5 = B\r\n\t//0x09FFFFFF:6 = hiC\r\n\t//0x09FFFFFF:7 = ?\r\n\r\n\t//deassert bit if key is pressed\r\n\r\n\t//LOG(\"PIANO: %04X\\n\",pianoKeyStatus);\r\n\r\n\tif(adr == 0x09FFFFFE) return (~(pianoKeyStatus&0xFF));\r\n\tif(adr == 0x09FFFFFF) return (~((pianoKeyStatus>>8)&0xFF))&~(0x18);\r\n\r\n\tif(adr&1) return 0xE7;\r\n\telse return 0xFF;\r\n}\r\nstatic u16 piano_read16(u32 procnum, u32 adr)\r\n{\r\n\t//printf(\"piano: read 16 at 0x%08X\\n\", adr);\r\n\tif(adr != 0x09FFFFFE)\r\n\t\treturn 0xE7FF;\r\n\tu16 ret = piano_read08(procnum,0x09FFFFFE)|(piano_read08(procnum,0x09FFFFFF)<<8);\r\n\t//return ( (PIANO_PAK & 0x1800 ) == 0 );\r\n\treturn ret;\r\n}\r\nstatic u32 piano_read32(u32 procnum, u32 adr)\r\n{\r\n\t//printf(\"piano: read 32 at 0x%08X\\n\", adr);\r\n\treturn 0xE7FFE7FF;\r\n}\r\nstatic void piano_info(char *info) { strcpy(info, \"Piano for EasyPiano\"); }\r\n\r\nvoid piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic)\r\n{\r\n\t//0x09FFFFFE:0 = C\r\n\t//0x09FFFFFE:1 = C#\r\n\t//0x09FFFFFE:2 = D\r\n\t//0x09FFFFFE:3 = D#\r\n\t//0x09FFFFFE:4 = E\r\n\t//0x09FFFFFE:5 = F\r\n\t//0x09FFFFFE:6 = F#\r\n\t//0x09FFFFFE:7 = G\r\n\t//0x09FFFFFE:0 = G#\r\n\t//0x09FFFFFE:1 = A\r\n\t//0x09FFFFFF:2 = A#\r\n\t//0x09FFFFFF:3 = ?\r\n\t//0x09FFFFFF:4 = ?\r\n\t//0x09FFFFFF:5 = B\r\n\t//0x09FFFFFF:6 = hiC\r\n\t//0x09FFFFFF:7 = ?\r\n\r\n#define BIT(N,v) ((v)?(1<<(N)):0)\r\n\tpianoKeyStatus = \r\n\t\tBIT(0,c) |\r\n\t\tBIT(1,cs) |\r\n\t\tBIT(2,d) |\r\n\t\tBIT(3,ds) |\r\n\t\tBIT(4,e) |\r\n\t\tBIT(5,f) |\r\n\t\tBIT(6,fs) |\r\n\t\tBIT(7,g) |\r\n\t\tBIT(8,gs) |\r\n\t\tBIT(9,a) |\r\n\t\tBIT(10,as) |\r\n\t\tBIT(13,b) |\r\n\t\tBIT(14,hic)\r\n\t\t;\r\n\tpianoKeyStatus = pianoKeyStatus;\r\n}\r\n\r\nADDONINTERFACE addonPiano = {\r\n\t\"Piano\",\r\n\tpiano_init,\r\n\tpiano_reset,\r\n\tpiano_close,\r\n\tpiano_config,\r\n\tpiano_write08,\r\n\tpiano_write16,\r\n\tpiano_write32,\r\n\tpiano_read08,\r\n\tpiano_read16,\r\n\tpiano_read32,\r\n\tpiano_info};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons/slot2_rumblepak.cpp",
    "content": "/*  Copyright (C) 2009-2010 DeSmuME team\n\n    This file is part of DeSmuME\n\n    DeSmuME is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    DeSmuME is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with DeSmuME; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n*/\n\n#include \"../addons.h\"\n#include \"../mem.h\"\n#include \"../MMU.h\"\n#include <string.h>\n\nu16 old_val_rumble = 0;\n\nvoid (*FeedbackON)(BOOL enable) = NULL;\n\nstatic BOOL RumblePak_init(void) { return (TRUE); }\n\nstatic void RumblePak_reset(void)\n{\n\told_val_rumble = 0;\n\tif (!FeedbackON) return;\n\tFeedbackON(false);\n}\n\nstatic void RumblePak_close(void) {}\n\nstatic void RumblePak_config(void) {}\n\nstatic void RumblePak_write08(u32 procnum, u32 adr, u8 val)\n{\n}\n\nstatic void RumblePak_write16(u32 procnum, u32 adr, u16 val)\n{\n\tif (!FeedbackON) return;\n\n\tif (old_val_rumble == val) return;\n\n\told_val_rumble = val;\n\t// CrazyMax 17/01/2009\n\t// i don't know how send to feedback (PC) impulse with small latency.\n\tif (adr == 0x08000000) \n\t\tFeedbackON(val);\n\tif (adr == 0x08001000) \n\t\tFeedbackON(val);\n}\n\nstatic void RumblePak_write32(u32 procnum, u32 adr, u32 val)\n{\n}\n\nstatic u8   RumblePak_read08(u32 procnum, u32 adr)\n{\n\tif(adr&1) return 0xFF;\n\telse return 0xFD;\n}\n\nstatic u16  RumblePak_read16(u32 procnum, u32 adr)\n{\n\treturn 0xFFFD;\n}\n\nstatic u32  RumblePak_read32(u32 procnum, u32 adr)\n{\n\treturn 0xFFFDFFFD;\n}\n\nstatic void RumblePak_info(char *info)\n{\n\tstrcpy(info, \"NDS Rumble Pak (need joystick with Feedback)\"); \n}\n\nADDONINTERFACE addonRumblePak = {\n\t\t\t\t\"Rumble Pak\",\n\t\t\t\tRumblePak_init,\n\t\t\t\tRumblePak_reset,\n\t\t\t\tRumblePak_close,\n\t\t\t\tRumblePak_config,\n\t\t\t\tRumblePak_write08,\n\t\t\t\tRumblePak_write16,\n\t\t\t\tRumblePak_write32,\n\t\t\t\tRumblePak_read08,\n\t\t\t\tRumblePak_read16,\n\t\t\t\tRumblePak_read32,\n\t\t\t\tRumblePak_info};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons.cpp",
    "content": "/*\n\tCopyright (C) 2009-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n#include \"addons.h\"\n#include <string>\n\n//this is the currently-configured cflash mode\nADDON_CFLASH_MODE CFlash_Mode;\n\n//this is the currently-configured path (directory or filename) for cflash.\n//it should be viewed as a parameter for the above.\nstd::string CFlash_Path;\n\nchar GBAgameName[MAX_PATH];\n\nextern ADDONINTERFACE addonNone;\nextern ADDONINTERFACE addonCFlash;\nextern ADDONINTERFACE addonRumblePak;\nextern ADDONINTERFACE addonGBAgame;\nextern ADDONINTERFACE addonGuitarGrip;\nextern ADDONINTERFACE addonExpMemory;\nextern ADDONINTERFACE addonPiano;\nextern ADDONINTERFACE addonPaddle;\n//extern ADDONINTERFACE addonExternalMic;\n\nADDONINTERFACE addonList[NDS_ADDON_COUNT] = {\n\t\taddonNone,\n\t\taddonCFlash,\n\t\taddonRumblePak,\n\t\taddonGBAgame,\n\t\taddonGuitarGrip,\n\t\taddonExpMemory,\n\t\taddonPiano,\n\t\taddonPaddle\n};\n\nADDONINTERFACE\taddon = addonCFlash;\t\t// default none pak\nNDS_ADDON_TYPE\t\t\t\taddon_type = NDS_ADDON_CFLASH;\n\nBOOL addonsInit()\n{\n\treturn addon.init();\n}\n\nvoid addonsClose()\n{\n\taddon.close();\n}\n\nvoid addonsReset()\n{\n\taddon.reset();\n}\n\nBOOL addonsChangePak(NDS_ADDON_TYPE type)\n{\n\tif (type > NDS_ADDON_COUNT) return FALSE;\n\taddon.close();\n\taddon = addonList[type];\n\taddon_type = type;\n\tprintf(\"Slot 2: %s\\n\", addon.name);\n\treturn addon.init();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/addons.h",
    "content": "/*\n\tCopyright (C) 2009-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef __ADDONS_H__\n#define __ADDONS_H__\n\n#include \"common.h\"\n#include \"types.h\"\n#include \"debug.h\"\n\nstruct ADDONINTERFACE\n{\n\t// The name of the plugin, this name will appear in the plugins list\n\tconst char * name;\n\n\t//called once when the plugin starts up\n\tBOOL (*init)(void);\n\t\n\t//called when the emulator resets\n\tvoid (*reset)(void);\n\t\n\t//called when the plugin shuts down\n\tvoid (*close)(void);\n\t\n\t//called when the user configurating plugin\n\tvoid (*config)(void);\n\n\t//called when the emulator write to addon\n\tvoid (*write08)(u32 procnum, u32 adr, u8 val);\n\tvoid (*write16)(u32 procnum, u32 adr, u16 val);\n\tvoid (*write32)(u32 procnum, u32 adr, u32 val);\n\n\t//called when the emulator read from addon\n\tu8  (*read08)(u32 procnum, u32 adr);\n\tu16 (*read16)(u32 procnum, u32 adr);\n\tu32 (*read32)(u32 procnum, u32 adr);\n\t\n\t//called when the user get info about addon pak (description)\n\tvoid (*info)(char *info);\n}; \n\nenum NDS_ADDON_TYPE\n{\n\tNDS_ADDON_NONE,\n\tNDS_ADDON_CFLASH,\t\t// compact flash\n\tNDS_ADDON_RUMBLEPAK,\t// rumble pack\n\tNDS_ADDON_GBAGAME,\t\t// gba game in slot\n\tNDS_ADDON_GUITARGRIP,\t// Guitar Grip\n\tNDS_ADDON_EXPMEMORY,\t// Memory Expansion \n\tNDS_ADDON_PIANO,\t\t// Piano\n  NDS_ADDON_PADDLE,\n\t//NDS_ADDON_EXTERNALMIC,\n\tNDS_ADDON_COUNT\t\t// use for counter addons - MUST TO BE LAST!!!\n};\n\nenum ADDON_CFLASH_MODE\n{\n\tADDON_CFLASH_MODE_Path, ADDON_CFLASH_MODE_File, ADDON_CFLASH_MODE_RomPath\n};\n\nextern ADDON_CFLASH_MODE CFlash_Mode;\nextern std::string CFlash_Path;\ninline bool CFlash_IsUsingPath() { return CFlash_Mode==ADDON_CFLASH_MODE_Path || CFlash_Mode==ADDON_CFLASH_MODE_RomPath; }\n\nextern ADDONINTERFACE addon;\t\t\t\t\t\t// current pak\nextern ADDONINTERFACE addonList[NDS_ADDON_COUNT];\t// lists pointer on paks\nextern NDS_ADDON_TYPE addon_type;\t\t\t\t\t\t\t\t// current type pak\n\nextern char GBAgameName[MAX_PATH];\t\t\t\t\t// file name for GBA game (rom)\nextern void (*FeedbackON)(BOOL enable);\t\t\t\t// feedback on/off\n\nextern BOOL addonsInit();\t\t\t\t\t\t\t// Init addons\nextern void addonsClose();\t\t\t\t\t\t\t// Shutdown addons\nextern void addonsReset();\t\t\t\t\t\t\t// Reset addon\nextern BOOL addonsChangePak(NDS_ADDON_TYPE type);\t\t\t\t// change current adddon\n\nextern void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue); // Guitar grip keys\nextern void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic); //piano keys\n\n#endif //__ADDONS_H__\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/agg2d.h",
    "content": "//----------------------------------------------------------------------------\r\n// Agg2D - Version 1.0\r\n// Based on Anti-Grain Geometry\r\n// Copyright (C) 2005 Maxim Shemanarev (http://www.antigrain.com)\r\n//\r\n// Permission to copy, use, modify, sell and distribute this software\r\n// is granted provided this copyright notice appears in all copies.\r\n// This software is provided \"as is\" without express or implied\r\n// warranty, and with no claim as to its suitability for any purpose.\r\n//\r\n//----------------------------------------------------------------------------\r\n// Contact: mcseem@antigrain.com\r\n//          mcseemagg@yahoo.com\r\n//          http://www.antigrain.com\r\n//----------------------------------------------------------------------------\r\n//----------------------------------------------------------------------------\r\n//\r\n//\t25 Jan 2007 - Ported to AGG 2.4 Jerry Evans (jerry@novadsp.com)\r\n//\t11 Jul 2009 - significant refactors for introduction to desmume\r\n//\r\n//----------------------------------------------------------------------------\r\n\r\n#ifndef AGG2D_INCLUDED\r\n#define AGG2D_INCLUDED\r\n\r\n//we're not using vector fonts right now.\r\n//#define AGG2D_USE_VECTORFONTS\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#if defined(UNDER_CE) || not defined(WIN32)\r\n#define AGG2D_USE_FREETYPE\r\n#endif\r\n#endif\r\n\r\n#ifdef _MSC_VER\r\n#pragma warning(disable: 4786)\r\n#endif\r\n\r\n// JME\r\n#include \"agg_basics.h\"\r\n#include \"agg_math_stroke.h\"\r\n#include \"agg_trans_affine.h\"\r\n#include \"agg_trans_viewport.h\"\r\n#include \"agg_path_storage.h\"\r\n#include \"agg_conv_stroke.h\"\r\n#include \"agg_conv_transform.h\"\r\n#include \"agg_conv_curve.h\"\r\n#include \"agg_rendering_buffer.h\"\r\n#include \"agg_renderer_base.h\"\r\n#include \"agg_renderer_scanline.h\"\r\n#include \"agg_span_gradient.h\"\r\n#include \"agg_span_image_filter_rgba.h\"\r\n\r\n//+ JME\r\n#include \"agg_span_allocator.h\"\r\n#include \"agg_span_converter.h\"\r\n#include \"agg_span_interpolator_linear.h\"\r\n#include \"agg_rasterizer_scanline_aa.h\"\r\n#include \"agg_gamma_functions.h\"\r\n#include \"agg_scanline_u.h\"\r\n#include \"agg_bezier_arc.h\"\r\n#include \"agg_rounded_rect.h\"\r\n#include \"agg_font_cache_manager.h\"\r\n\r\n#include \"agg_glyph_raster_bin.h\"\r\n#include \"agg_renderer_raster_text.h\"\r\n#include \"agg_embedded_raster_fonts.h\"\r\n\r\n\r\n#include <string>\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#ifdef AGG2D_USE_FREETYPE\r\n#ifndef WIN32\r\n#include \"agg_font_freetype.h\"\r\n#else\r\n#include \"../font_freetype/agg_font_freetype.h\"\r\n#endif\r\n#else\r\n#include \"../font_win32_tt/agg_font_win32_tt.h\"\r\n#endif\r\n#endif\r\n\r\n#include \"agg_pixfmt_rgba.h\"\r\n//+ JME\r\n#include \"agg_image_accessors.h\"\r\n\r\n#define AGG2D_TEMPLATE template<typename PixFormatSet>\r\n#define AGG2D_TEMPLATE_WITH_IMAGE template<typename PixFormatSet, typename ImagePixFormatSet>\r\n#define AGG2D_TEMPLATE_ARG <PixFormatSet>\r\n#define AGG2D_IMAGE_TEMPLATE template<typename ImagePixFormatSet>\r\n#define AGG2D_IMAGE_TEMPLATE_ARG <ImagePixFormatSet>\r\n#define TIMAGE Agg2DBase :: Image AGG2D_IMAGE_TEMPLATE_ARG\r\n\r\n\r\ntemplate<typename Main, typename Pre, typename SG>\r\nclass PixFormatSetDeclaration\r\n{\r\npublic:\r\n\ttypedef Main PixFormat;\r\n\ttypedef Pre PixFormatPre;\r\n\ttypedef SG SpanGenerator;\r\n};\r\n\r\nclass Agg2DBase\r\n{\r\npublic:\r\n\t// JME\r\n\t//typedef agg::rect         Rect;\r\n\ttypedef agg::rect_i       Rect;\r\n\ttypedef agg::rect_d       RectD;\r\n\ttypedef agg::trans_affine Affine;\r\n\r\n\tenum LineJoin\r\n\t{\r\n\t\tJOIN_MITER = agg::miter_join,\r\n\t\tJOIN_ROUND = agg::round_join,\r\n\t\tJOIN_BEVEL = agg::bevel_join\r\n\t};\r\n\r\n\tenum LineCap\r\n\t{\r\n\t\tCAP_BUTT    = agg::butt_cap,\r\n\t\tCAP_SQUARE  = agg::square_cap,\r\n\t\tCAP_ROUND   = agg::round_cap\r\n\t};\r\n\r\n\tenum TextAlignment\r\n\t{\r\n\t\tAlignLeft,\r\n\t\tAlignRight,\r\n\t\tAlignCenter,\r\n\t\tAlignBaseline,\r\n\t\tAlignTop = AlignRight,\r\n\t\tAlignBottom = AlignLeft\r\n\t};\r\n\r\n\r\n\tenum DrawPathFlag\r\n\t{\r\n\t\tFillOnly,\r\n\t\tStrokeOnly,\r\n\t\tFillAndStroke,\r\n\t\tFillWithLineColor\r\n\t};\r\n\r\n\tenum ViewportOption\r\n\t{\r\n\t\tAnisotropic,\r\n\t\tXMinYMin,\r\n\t\tXMidYMin,\r\n\t\tXMaxYMin,\r\n\t\tXMinYMid,\r\n\t\tXMidYMid,\r\n\t\tXMaxYMid,\r\n\t\tXMinYMax,\r\n\t\tXMidYMax,\r\n\t\tXMaxYMax\r\n\t};\r\n\r\n\tenum WindowFitLogic\r\n\t{\r\n\t\tWindowFitLogic_meet,\r\n\t\tWindowFitLogic_slice\r\n\t};\r\n\r\n\tstruct Transformations\r\n\t{\r\n\t\tdouble affineMatrix[6];\r\n\t};\r\n\r\n\tAGG2D_IMAGE_TEMPLATE struct Image\r\n\t{\r\n\t\tagg::rendering_buffer renBuf;\r\n\r\n\t\tImage(const agg::rendering_buffer& srcBuf)\r\n\t\t\t: renBuf(srcBuf)\r\n\t\t{}\r\n\t\tImage(unsigned char* buf, unsigned width, unsigned height, int stride) :\r\n\t\trenBuf(buf, width, height, stride) {}\r\n\t\tvoid attach(unsigned char* buf, unsigned width, unsigned height, int stride)\r\n\t\t{\r\n\t\t\trenBuf.attach(buf, width, height, stride);\r\n\t\t}\r\n\t\tint width()  const { return renBuf.width(); }\r\n\t\tint height() const { return renBuf.height(); }\r\n\r\n\t\tAGG2D_TEMPLATE void premultiply()\r\n\t\t{\r\n\t\t\ttypename PixFormatSet::PixFormat pixf(renBuf);\r\n\t\t\tpixf.premultiply();\r\n\t\t}\r\n\r\n\t\tAGG2D_TEMPLATE void demultiply()\r\n\t\t{\r\n\t\t\ttypename PixFormatSet::PixFormat pixf(renBuf);\r\n\t\t\tpixf.demultiply();\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tenum ImageFilter\r\n\t{\r\n\t\tNoFilter,\r\n\t\tBilinear,\r\n\t\tHanning,\r\n\t\tHermite,\r\n\t\tQuadric,\r\n\t\tBicubic,\r\n\t\tCatrom,\r\n\t\tSpline16,\r\n\t\tSpline36,\r\n\t\tBlackman144\r\n\t};\r\n\r\n\tenum ImageResample\r\n\t{\r\n\t\tNoResample,\r\n\t\tResampleAlways,\r\n\t\tResampleOnZoomOut\r\n\t};\r\n\r\n\tenum FontCacheType\r\n\t{\r\n\t\tRasterFontCache,\r\n\t\tVectorFontCache\r\n\t};\r\n\r\n\tenum BlendMode\r\n\t{\r\n\t\tBlendAlpha      = agg::end_of_comp_op_e,\r\n\t\tBlendClear      = agg::comp_op_clear,\r\n\t\tBlendSrc        = agg::comp_op_src,\r\n\t\tBlendDst        = agg::comp_op_dst,\r\n\t\tBlendSrcOver    = agg::comp_op_src_over,\r\n\t\tBlendDstOver    = agg::comp_op_dst_over,\r\n\t\tBlendSrcIn      = agg::comp_op_src_in,\r\n\t\tBlendDstIn      = agg::comp_op_dst_in,\r\n\t\tBlendSrcOut     = agg::comp_op_src_out,\r\n\t\tBlendDstOut     = agg::comp_op_dst_out,\r\n\t\tBlendSrcAtop    = agg::comp_op_src_atop,\r\n\t\tBlendDstAtop    = agg::comp_op_dst_atop,\r\n\t\tBlendXor        = agg::comp_op_xor,\r\n\t\tBlendAdd        = agg::comp_op_plus,\r\n\t\tBlendSub        = agg::comp_op_minus,\r\n\t\tBlendMultiply   = agg::comp_op_multiply,\r\n\t\tBlendScreen     = agg::comp_op_screen,\r\n\t\tBlendOverlay    = agg::comp_op_overlay,\r\n\t\tBlendDarken     = agg::comp_op_darken,\r\n\t\tBlendLighten    = agg::comp_op_lighten,\r\n\t\tBlendColorDodge = agg::comp_op_color_dodge,\r\n\t\tBlendColorBurn  = agg::comp_op_color_burn,\r\n\t\tBlendHardLight  = agg::comp_op_hard_light,\r\n\t\tBlendSoftLight  = agg::comp_op_soft_light,\r\n\t\tBlendDifference = agg::comp_op_difference,\r\n\t\tBlendExclusion  = agg::comp_op_exclusion,\r\n\t\tBlendContrast   = agg::comp_op_contrast\r\n\t};\r\n\r\n\tenum Direction\r\n\t{\r\n\t\tCW, CCW\r\n\t};\r\n\r\n};\r\n\r\ntemplate<typename,typename> class Agg2DRenderer;\r\n\r\ntemplate<typename PixFormatSet> class Agg2D : public Agg2DBase\r\n{\r\npublic:\r\n\ttypedef typename PixFormatSet::PixFormat PixFormat;\r\n\ttypedef Image<PixFormatSet> MyImage;\r\n\ttypedef agg::order_bgra ComponentOrder; // Platform dependent!\r\n\r\n\ttypedef agg::rgba8                                               ColorType;\r\n\ttypedef agg::blender_rgba<ColorType, ComponentOrder>             Blender;\r\n\ttypedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder>     BlenderComp;\r\n\ttypedef agg::blender_rgba_pre<ColorType, ComponentOrder>         BlenderPre;\r\n\ttypedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder> BlenderCompPre;\r\n\r\n\t// JME\r\n\t//typedef agg::pixel_formats_rgba<Blender, agg::pixel32_type>    PixFormat;\r\n\t//typedef agg::pixfmt_bgra32\t\t\t\t\t\t\t\t\tPixFormat;\r\n\t// JME\r\n\t//typedef agg::pixfmt_custom_blend_rgba<BlenderComp,>             PixFormatComp;\r\n\ttypedef agg::pixfmt_custom_blend_rgba<BlenderComp,agg::rendering_buffer>             PixFormatComp;\r\n\t// JME\r\n\t//typedef agg::pixel_formats_rgba<BlenderPre, agg::pixel32_type> PixFormatPre;\r\n\ttypedef typename PixFormatSet::PixFormatPre PixFormatPre;\r\n\t// JME\r\n\t//typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre>          PixFormatCompPre;\r\n\ttypedef agg::pixfmt_custom_blend_rgba<BlenderCompPre,agg::rendering_buffer>          PixFormatCompPre;\r\n\r\n\ttypedef agg::renderer_base<PixFormat>        RendererBase;\r\n\ttypedef agg::renderer_base<PixFormatComp>    RendererBaseComp;\r\n\ttypedef agg::renderer_base<PixFormatPre>     RendererBasePre;\r\n\ttypedef agg::renderer_base<PixFormatCompPre> RendererBaseCompPre;\r\n\r\n\ttypedef agg::renderer_scanline_aa_solid<RendererBase>     RendererSolid;\r\n\ttypedef agg::renderer_scanline_aa_solid<RendererBaseComp> RendererSolidComp;\r\n\r\n\ttypedef agg::span_allocator<ColorType> SpanAllocator;\r\n\ttypedef agg::pod_auto_array<ColorType, 256> GradientArray;\r\n\r\n\ttypedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_x,      GradientArray> LinearGradientSpan;\r\n\ttypedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_circle, GradientArray> RadialGradientSpan;\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#ifdef AGG2D_USE_FREETYPE\r\n\ttypedef agg::font_engine_freetype_int32       FontEngine;\r\n#else\r\n\ttypedef agg::font_engine_win32_tt_int32       FontEngine;\r\n#endif\r\n\r\n\ttypedef agg::font_cache_manager<FontEngine>   FontCacheManager;\r\n\ttypedef FontCacheManager::gray8_adaptor_type  FontRasterizer;\r\n\ttypedef FontCacheManager::gray8_scanline_type FontScanline;\r\n#endif\r\n\r\n\ttypedef agg::conv_curve<agg::path_storage>    ConvCurve;\r\n\ttypedef agg::conv_stroke<ConvCurve>           ConvStroke;\r\n\ttypedef agg::conv_transform<ConvCurve>        PathTransform;\r\n\ttypedef agg::conv_transform<ConvStroke>       StrokeTransform;\r\n\tenum Gradient\r\n\t{\r\n\t\tSolid,\r\n\t\tLinear,\r\n\t\tRadial\r\n\t};\r\n\r\npublic:\r\n\ttemplate<typename,typename> friend class Agg2DRenderer;\r\n\r\n\ttypedef ColorType         Color;\r\n\r\n\r\n\r\n\tstruct State\r\n\t{\r\n\t\tRectD                           m_clipBox;\r\n\r\n\t\tBlendMode                       m_blendMode;\r\n\t\tBlendMode                       m_imageBlendMode;\r\n\t\tColor                           m_imageBlendColor;\r\n\r\n\t\tdouble                          m_masterAlpha;\r\n\t\tdouble                          m_antiAliasGamma;\r\n\r\n\t\tconst agg::int8u*               m_font;\r\n\r\n\t\tColor                           m_fillColor;\r\n\t\tColor                           m_lineColor;\r\n\t\tGradientArray                   m_fillGradient;\r\n\t\tGradientArray                   m_lineGradient;\r\n\r\n\t\tLineCap                         m_lineCap;\r\n\t\tLineJoin                        m_lineJoin;\r\n\r\n\t\tGradient                        m_fillGradientFlag;\r\n\t\tGradient                        m_lineGradientFlag;\r\n\t\tagg::trans_affine               m_fillGradientMatrix;\r\n\t\tagg::trans_affine               m_lineGradientMatrix;\r\n\t\tdouble                          m_fillGradientD1;\r\n\t\tdouble                          m_lineGradientD1;\r\n\t\tdouble                          m_fillGradientD2;\r\n\t\tdouble                          m_lineGradientD2;\r\n\r\n\t\tdouble                          m_textAngle;\r\n\t\tTextAlignment                   m_textAlignX;\r\n\t\tTextAlignment                   m_textAlignY;\r\n\t\tbool                            m_textHints;\r\n\t\tdouble                          m_fontHeight;\r\n\t\tdouble                          m_fontAscent;\r\n\t\tdouble                          m_fontDescent;\r\n\t\tFontCacheType                   m_fontCacheType;\r\n\r\n\t\tdouble                          m_lineWidth;\r\n\t\tbool                            m_evenOddFlag;\r\n\r\n\t\tagg::trans_affine               m_transform;\r\n\t\tagg::trans_affine               m_affine;\r\n\r\n\t};\r\n\r\n\r\n\t~Agg2D();\r\n\tAgg2D();\r\n\r\n\t// Setup\r\n\t//-----------------------\r\n\tvoid  attach(unsigned char* buf, unsigned width, unsigned height, int stride);\r\n\tvoid  attach(MyImage& img);\r\n\r\n\tvoid  clipBox(double x1, double y1, double x2, double y2);\r\n\tRectD clipBox() const;\r\n\r\n\tvoid  clearAll(Color c);\r\n\tvoid  clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);\r\n\r\n\tvoid  clearClipBox(Color c);\r\n\tvoid  clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);\r\n\r\n\tunsigned width()  const { return m_rbuf.width();  }\r\n\tunsigned height() const { return m_rbuf.height(); }\r\n\tunsigned stride() const { return m_rbuf.stride(); }\r\n\r\n\t// Conversions\r\n\t//-----------------------\r\n\tvoid   worldToScreen(double& x, double& y) const;\r\n\tvoid   screenToWorld(double& x, double& y) const;\r\n\tdouble worldToScreen(double scalar) const;\r\n\tdouble screenToWorld(double scalar) const;\r\n\tvoid   alignPoint(double& x, double& y) const;\r\n\tbool   inBox(double worldX, double worldY) const;\r\n\r\n\t// General Attributes\r\n\t//-----------------------\r\n\tvoid blendMode(BlendMode m);\r\n\tBlendMode blendMode() const;\r\n\r\n\tvoid imageBlendMode(BlendMode m);\r\n\tBlendMode imageBlendMode() const;\r\n\r\n\tvoid imageBlendColor(Color c);\r\n\tvoid imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255);\r\n\tColor imageBlendColor() const;\r\n\r\n\tvoid masterAlpha(double a);\r\n\tdouble masterAlpha() const;\r\n\r\n\tvoid antiAliasGamma(double g);\r\n\tdouble antiAliasGamma() const;\r\n\r\n\tvoid font(const agg::int8u* font) { m_font = font; }\r\n\tconst agg::int8u* font() { return m_font; }\r\n\r\n\tvoid fillColor(Color c);\r\n\tvoid fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255);\r\n\tvoid noFill();\r\n\r\n\tvoid lineColor(Color c);\r\n\tvoid lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255);\r\n\tvoid noLine();\r\n\r\n\tColor fillColor() const;\r\n\tColor lineColor() const;\r\n\r\n\tvoid fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);\r\n\tvoid lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);\r\n\r\n\tvoid fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);\r\n\tvoid lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);\r\n\r\n\tvoid fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);\r\n\tvoid lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);\r\n\r\n\tvoid fillRadialGradient(double x, double y, double r);\r\n\tvoid lineRadialGradient(double x, double y, double r);\r\n\r\n\tvoid lineWidth(double w);\r\n\tdouble lineWidth() const;\r\n\r\n\tvoid lineCap(LineCap cap);\r\n\tLineCap lineCap() const;\r\n\r\n\tvoid lineJoin(LineJoin join);\r\n\tLineJoin lineJoin() const;\r\n\r\n\tvoid fillEvenOdd(bool evenOddFlag);\r\n\tbool fillEvenOdd() const;\r\n\r\n\t// Transformations\r\n\t//-----------------------\r\n\tTransformations transformations() const;\r\n\tvoid transformations(const Transformations& tr);\r\n\r\n\tconst Affine& affine() const;\r\n\tvoid          affine(const Affine&);\r\n\r\n\tvoid resetTransformations();\r\n\tvoid matrix(const Affine& tr);\r\n\tvoid matrix(const Transformations& tr);\r\n\tvoid rotate(double angle);\r\n\tvoid rotate(double angle, double cx, double cy);\r\n\tvoid scale(double s);\r\n\tvoid scale(double sx, double sy);\r\n\tvoid skew(double sx, double sy);\r\n\tvoid translate(double x, double y);\r\n\tvoid parallelogram(double x1, double y1, double x2, double y2, const double* para);\r\n\tvoid viewport(double worldX1,  double worldY1,  double worldX2,  double worldY2,\r\n\t\tdouble screenX1, double screenY1, double screenX2, double screenY2,\r\n\t\tViewportOption opt=XMidYMid, WindowFitLogic fl = WindowFitLogic_meet);\r\n\r\n\t// Basic Shapes\r\n\t//-----------------------\r\n\tvoid line(double x1, double y1, double x2, double y2);\r\n\tvoid triangle(double x1, double y1, double x2, double y2, double x3, double y3);\r\n\tvoid rectangle(double x1, double y1, double x2, double y2);\r\n\tvoid roundedRect(double x1, double y1, double x2, double y2, double r);\r\n\tvoid roundedRect(double x1, double y1, double x2, double y2, double rx, double ry);\r\n\tvoid roundedRect(double x1, double y1, double x2, double y2,\r\n\t\tdouble rxBottom, double ryBottom,\r\n\t\tdouble rxTop,    double ryTop);\r\n\tvoid ellipse(double cx, double cy, double rx, double ry);\r\n\tvoid arc(double cx, double cy, double rx, double ry, double start, double sweep);\r\n\tvoid star(double cx, double cy, double r1, double r2, double startAngle, int numRays);\r\n\tvoid curve(double x1, double y1, double x2, double y2, double x3, double y3);\r\n\tvoid curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4);\r\n\tvoid polygon(double* xy, int numPoints);\r\n\tvoid polyline(double* xy, int numPoints);\r\n\r\n\r\n\t// Text\r\n\t//-----------------------\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n\tvoid   flipText(bool flip);\r\n\tvoid   font(const char* fileName, double height,\r\n\t\tbool bold = false,\r\n\t\tbool italic = false,\r\n\t\tFontCacheType ch = RasterFontCache,\r\n\t\tdouble angle = 0.0);\r\n\tdouble fontHeight() const;\r\n\tdouble fontAscent() const;\r\n\r\n\tvoid   textAlignment(TextAlignment alignX, TextAlignment alignY);\r\n\tbool   textHints() const;\r\n\tvoid   textHints(bool hints);\r\n\tdouble textWidth(const char* str, unsigned int len);\r\n\tdouble textWidth(const wchar_t* str, unsigned int len);\r\n\tvoid   text(double x, double y, const char* str, unsigned int len, bool roundOff=false, double dx=0.0, double dy=0.0);\r\n\tvoid   text(double x, double y, const wchar_t* str, unsigned int len, bool roundOff=false, double dx=0.0, double dy=0.0);\r\n\r\n\tdouble textWidth(const char* str);\r\n\tvoid   text(double x, double y, const char* str, bool roundOff=false, double dx=0.0, double dy=0.0);\r\n#endif\r\n\r\n\t// Path commands\r\n\t//-----------------------\r\n\tvoid resetPath();\r\n\r\n\tvoid moveTo(double x, double y);\r\n\tvoid moveRel(double dx, double dy);\r\n\r\n\tvoid lineTo(double x, double y);\r\n\tvoid lineRel(double dx, double dy);\r\n\r\n\tvoid horLineTo(double x);\r\n\tvoid horLineRel(double dx);\r\n\r\n\tvoid verLineTo(double y);\r\n\tvoid verLineRel(double dy);\r\n\r\n\tvoid arcTo(double rx, double ry,\r\n\t\tdouble angle,\r\n\t\tbool largeArcFlag,\r\n\t\tbool sweepFlag,\r\n\t\tdouble x, double y);\r\n\r\n\tvoid arcRel(double rx, double ry,\r\n\t\tdouble angle,\r\n\t\tbool largeArcFlag,\r\n\t\tbool sweepFlag,\r\n\t\tdouble dx, double dy);\r\n\r\n\tvoid quadricCurveTo(double xCtrl, double yCtrl,\r\n\t\tdouble xTo,   double yTo);\r\n\tvoid quadricCurveRel(double dxCtrl, double dyCtrl,\r\n\t\tdouble dxTo,   double dyTo);\r\n\tvoid quadricCurveTo(double xTo, double yTo);\r\n\tvoid quadricCurveRel(double dxTo, double dyTo);\r\n\r\n\tvoid cubicCurveTo(double xCtrl1, double yCtrl1,\r\n\t\tdouble xCtrl2, double yCtrl2,\r\n\t\tdouble xTo,    double yTo);\r\n\r\n\tvoid cubicCurveRel(double dxCtrl1, double dyCtrl1,\r\n\t\tdouble dxCtrl2, double dyCtrl2,\r\n\t\tdouble dxTo,    double dyTo);\r\n\r\n\tvoid cubicCurveTo(double xCtrl2, double yCtrl2,\r\n\t\tdouble xTo,    double yTo);\r\n\r\n\tvoid cubicCurveRel(double xCtrl2, double yCtrl2,\r\n\t\tdouble xTo,    double yTo);\r\n\r\n\tvoid addEllipse(double cx, double cy, double rx, double ry, Direction dir);\r\n\tvoid closePolygon();\r\n\r\n\tvoid drawPath(DrawPathFlag flag = FillAndStroke);\r\n\tvoid drawPathNoTransform(DrawPathFlag flag = FillAndStroke);\r\n\r\n\r\n\t// Image Transformations\r\n\t//-----------------------\r\n\tvoid imageFilter(ImageFilter f);\r\n\tImageFilter imageFilter() const;\r\n\r\n\tvoid imageResample(ImageResample f);\r\n\tImageResample imageResample() const;\r\n\r\n\t//---------\r\n\t//if anyone can figure out how to put these in the .inl file, theyre more than welcome to. I couldnt declare them correctly to match\r\n\t//the .h file declaration\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img,\r\n\t\tint imgX1,    int imgY1,    int imgX2,    int imgY2,\r\n\t\tdouble dstX1, double dstY1, double dstX2, double dstY2)\r\n\t{\r\n\t\tresetPath();\r\n\t\tmoveTo(dstX1, dstY1);\r\n\t\tlineTo(dstX2, dstY1);\r\n\t\tlineTo(dstX2, dstY2);\r\n\t\tlineTo(dstX1, dstY2);\r\n\t\tclosePolygon();\r\n\t\tdouble parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 };\r\n\t\trenderImage <typename ImagePixFormatSet::ImagePixFormat> (img, imgX1, imgY1, imgX2, imgY2, parallelogram);\r\n\t}\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img,\r\n\t\tdouble dstX1, double dstY1, double dstX2, double dstY2)\r\n\t{\r\n\t\tresetPath();\r\n\t\tmoveTo(dstX1, dstY1);\r\n\t\tlineTo(dstX2, dstY1);\r\n\t\tlineTo(dstX2, dstY2);\r\n\t\tlineTo(dstX1, dstY2);\r\n\t\tclosePolygon();\r\n\t\tdouble parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 };\r\n\t\trenderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram);\r\n\t}\r\n\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img,\r\n\t\tint imgX1, int imgY1, int imgX2, int imgY2,\r\n\t\tconst double* parallelogram)\r\n\t{\r\n\t\tresetPath();\r\n\t\tmoveTo(parallelogram[0], parallelogram[1]);\r\n\t\tlineTo(parallelogram[2], parallelogram[3]);\r\n\t\tlineTo(parallelogram[4], parallelogram[5]);\r\n\t\tlineTo(parallelogram[0] + parallelogram[4] - parallelogram[2],\r\n\t\t\tparallelogram[1] + parallelogram[5] - parallelogram[3]);\r\n\t\tclosePolygon();\r\n\t\trenderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram);\r\n\t}\r\n\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, const double* parallelogram)\r\n\t{\r\n\t\tresetPath();\r\n\t\tmoveTo(parallelogram[0], parallelogram[1]);\r\n\t\tlineTo(parallelogram[2], parallelogram[3]);\r\n\t\tlineTo(parallelogram[4], parallelogram[5]);\r\n\t\tlineTo(parallelogram[0] + parallelogram[4] - parallelogram[2],\r\n\t\t\tparallelogram[1] + parallelogram[5] - parallelogram[3]);\r\n\t\tclosePolygon();\r\n\t\trenderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram);\r\n\t}\r\n\r\n\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img,\r\n\t\tint imgX1,    int imgY1,    int imgX2,    int imgY2,\r\n\t\tdouble dstX1, double dstY1, double dstX2, double dstY2)\r\n\t{\r\n\t\tdouble parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 };\r\n\t\trenderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram);\r\n\t}\r\n\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img,\r\n\t\tdouble dstX1, double dstY1, double dstX2, double dstY2)\r\n\t{\r\n\t\tdouble parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 };\r\n\t\trenderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram);\r\n\t}\r\n\r\n\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img,\r\n\t\tint imgX1, int imgY1, int imgX2, int imgY2,\r\n\t\tconst double* parallelogram)\r\n\t{\r\n\t\trenderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram);\r\n\t}\r\n\r\n\r\n\tAGG2D_IMAGE_TEMPLATE  void transformImagePath(const TIMAGE& img, const double* parallelogram)\r\n\t{\r\n\t\trenderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram);\r\n\t}\r\n\r\n\r\n\r\n\t// Image Blending (no transformations available)\r\n\tAGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img,\r\n\t\tint imgX1, int imgY1, int imgX2, int imgY2,\r\n\t\tdouble dstX, double dstY, unsigned alpha=255)\r\n\t{\r\n\t\tworldToScreen(dstX, dstY);\r\n\t\tPixFormat pixF(img.renBuf);\r\n\t\t// JME\r\n\t\t//agg::rect r(imgX1, imgY1, imgX2, imgY2);\r\n\t\tRect r(imgX1, imgY1, imgX2, imgY2);\r\n\t\tif(m_blendMode == BlendAlpha)\r\n\t\t{\r\n\t\t\tm_renBasePre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tm_renBaseCompPre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tvoid renderText(double dstX, double dstY, const std::string& str)\r\n\t{\r\n\t\tworldToScreen(dstX, dstY);\r\n\t\tPixFormat pixF(m_rbuf);\r\n\t\t//Rect r(imgX1, imgY1, imgX2, imgY2);\r\n\r\n\t\ttypedef agg::glyph_raster_bin<agg::rgba8> glyph_gen;\r\n\t\tglyph_gen glyph(0);\r\n\r\n\t\tif(m_blendMode == BlendAlpha)\r\n\t\t{\r\n\t\t\ttypedef agg::renderer_base<PixFormatPre> ren_base;\r\n\t\t\tagg::renderer_raster_htext_solid<ren_base, glyph_gen> rt(m_renBasePre,glyph);\r\n\t\t\trt.color(m_lineColor);\r\n\t\t\tglyph.font(m_font);\r\n\t\t\trt.render_text(dstX, dstY, str.c_str(), true); //flipy\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ttypedef agg::renderer_base<PixFormatCompPre> ren_base;\r\n\t\t\tagg::renderer_raster_htext_solid<ren_base, glyph_gen> rt(m_renBaseCompPre,glyph);\r\n\t\t\trt.color(m_lineColor);\r\n\t\t\tglyph.font(m_font);\r\n\t\t\trt.render_text(dstX, dstY, str.c_str(), true); //flipy\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img, double dstX, double dstY, unsigned alpha=255)\r\n\t{\r\n\t\tworldToScreen(dstX, dstY);\r\n\t\tPixFormat pixF(img.renBuf);\r\n\t\tm_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha);\r\n\t\tif(m_blendMode == BlendAlpha)\r\n\t\t{\r\n\t\t\tm_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tm_renBaseCompPre.blend_from(pixF, 0, int(dstX), int(dstY), alpha);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\t// Copy image directly, together with alpha-channel\r\n\tAGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img,\r\n\t\tint imgX1, int imgY1, int imgX2, int imgY2,\r\n\t\tdouble dstX, double dstY)\r\n\t{\r\n\t\tworldToScreen(dstX, dstY);\r\n\t\t// JME\r\n\t\t//agg::rect r(imgX1, imgY1, imgX2, imgY2);\r\n\t\tRect r(imgX1, imgY1, imgX2, imgY2);\r\n\t\tm_renBase.copy_from(img.renBuf, &r, int(dstX)-imgX1, int(dstY)-imgY1);\r\n\t}\r\n\r\n\tAGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img, double dstX, double dstY)\r\n\t{\r\n\t\tworldToScreen(dstX, dstY);\r\n\t\tm_renBase.copy_from(img.renBuf, 0, int(dstX), int(dstY));\r\n\t}\r\n\r\n\t// State\r\n\t//-----------------------\r\n\r\n\tvoid saveStateTo(State& st);\r\n\tvoid restoreStateFrom(const State& st);\r\n\r\n\r\n\r\n\t// Auxiliary\r\n\t//-----------------------\r\n\tstatic double pi() { return agg::pi; }\r\n\tstatic double deg2Rad(double v) { return v * agg::pi / 180.0; }\r\n\tstatic double rad2Deg(double v) { return v * 180.0 / agg::pi; }\r\n\r\n\tPixFormat & pixFormat() { return m_pixFormat; }\r\n\tagg::rendering_buffer & buf() { return m_rbuf; }\r\n\r\nprivate:\r\n\tvoid render(bool fillColor);\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#if !defined( UNDER_CE )\r\n\tvoid render(FontRasterizer& ras, FontScanline& sl);\r\n#endif\r\n#endif\r\n\r\n\tvoid addLine(double x1, double y1, double x2, double y2);\r\n\tvoid updateRasterizerGamma();\r\n\tAGG2D_IMAGE_TEMPLATE void renderImage(const TIMAGE& img, int x1, int y1, int x2, int y2, const double* parl)\r\n\t{\r\n\t\tagg::trans_affine mtx((double)x1,\r\n\t\t\t(double)y1,\r\n\t\t\t(double)x2,\r\n\t\t\t(double)y2,\r\n\t\t\tparl);\r\n\t\tmtx *= m_transform;\r\n\t\tmtx.invert();\r\n\r\n\t\tm_rasterizer.reset();\r\n\t\tm_rasterizer.add_path(m_pathTransform);\r\n\r\n\t\ttypedef agg::span_interpolator_linear<agg::trans_affine> Interpolator;\r\n\t\tInterpolator interpolator(mtx);\r\n\r\n\t\tif(m_blendMode == BlendAlpha)\r\n\t\t{\r\n\t\t\t// JME audit -\r\n\t\t\tAgg2DRenderer<PixFormatSet,ImagePixFormatSet>::renderImage(*this, img, m_renBasePre, interpolator);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tAgg2DRenderer<PixFormatSet,ImagePixFormatSet>::renderImage(*this, img, m_renBaseCompPre, interpolator);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tvoid updateTransformations();\r\n\r\n\tagg::rendering_buffer           m_rbuf;\r\n\tPixFormat                       m_pixFormat;\r\n\tPixFormatComp                   m_pixFormatComp;\r\n\tPixFormatPre                    m_pixFormatPre;\r\n\tPixFormatCompPre                m_pixFormatCompPre;\r\n\tRendererBase                    m_renBase;\r\n\tRendererBaseComp                m_renBaseComp;\r\n\tRendererBasePre                 m_renBasePre;\r\n\tRendererBaseCompPre             m_renBaseCompPre;\r\n\tRendererSolid                   m_renSolid;\r\n\tRendererSolidComp               m_renSolidComp;\r\n\r\n\tSpanAllocator                   m_allocator;\r\n\tRectD                           m_clipBox;\r\n\r\n\tBlendMode                       m_blendMode;\r\n\tBlendMode                       m_imageBlendMode;\r\n\tColor                           m_imageBlendColor;\r\n\r\n\tagg::scanline_u8                m_scanline;\r\n\tagg::rasterizer_scanline_aa<>   m_rasterizer;\r\n\r\n\tdouble                          m_masterAlpha;\r\n\tdouble                          m_antiAliasGamma;\r\n\r\n\tconst agg::int8u*               m_font;\r\n\r\n\tColor                           m_fillColor;\r\n\tColor                           m_lineColor;\r\n\tGradientArray                   m_fillGradient;\r\n\tGradientArray                   m_lineGradient;\r\n\r\n\tLineCap                         m_lineCap;\r\n\tLineJoin                        m_lineJoin;\r\n\r\n\tGradient                        m_fillGradientFlag;\r\n\tGradient                        m_lineGradientFlag;\r\n\tagg::trans_affine               m_fillGradientMatrix;\r\n\tagg::trans_affine               m_lineGradientMatrix;\r\n\tdouble                          m_fillGradientD1;\r\n\tdouble                          m_lineGradientD1;\r\n\tdouble                          m_fillGradientD2;\r\n\tdouble                          m_lineGradientD2;\r\n\r\n\tdouble                          m_textAngle;\r\n\tTextAlignment                   m_textAlignX;\r\n\tTextAlignment                   m_textAlignY;\r\n\tbool                            m_textHints;\r\n\tdouble                          m_fontHeight;\r\n\tdouble                          m_fontAscent;\r\n\tdouble                          m_fontDescent;\r\n\tFontCacheType                   m_fontCacheType;\r\n\r\n\tImageFilter                     m_imageFilter;\r\n\tImageResample                   m_imageResample;\r\n\tagg::image_filter_lut           m_imageFilterLut;\r\n\r\n\tagg::span_interpolator_linear<> m_fillGradientInterpolator;\r\n\tagg::span_interpolator_linear<> m_lineGradientInterpolator;\r\n\r\n\tagg::gradient_x                 m_linearGradientFunction;\r\n\tagg::gradient_circle            m_radialGradientFunction;\r\n\r\n\tdouble                          m_lineWidth;\r\n\tbool                            m_evenOddFlag;\r\n\r\n\tdouble                          m_start_x;\r\n\tdouble                          m_start_y;\r\n\r\n\tagg::path_storage               m_path;\r\n\tagg::trans_affine               m_transform;\r\n\r\n\tagg::trans_affine               m_viewport;\r\n\tagg::trans_affine               m_affine;\r\n\r\n\tConvCurve                       m_convCurve;\r\n\tConvStroke                      m_convStroke;\r\n\r\n\tPathTransform                   m_pathTransform;\r\n\tStrokeTransform                 m_strokeTransform;\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#ifndef AGG2D_USE_FREETYPE\r\n\tHDC                             m_fontDC;\r\n#endif\r\n\tFontEngine                      m_fontEngine;\r\n\tFontCacheManager                m_fontCacheManager;\r\n#endif\r\n};\r\n\r\n\r\n\r\n#include \"agg2d.inl\"\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/agg2d.inl",
    "content": "//----------------------------------------------------------------------------\r\n// Agg2D - Version 1.0\r\n// Based on Anti-Grain Geometry\r\n// Copyright (C) 2005 Maxim Shemanarev (http://www.antigrain.com)\r\n//\r\n// Permission to copy, use, modify, sell and distribute this software\r\n// is granted provided this copyright notice appears in all copies.\r\n// This software is provided \"as is\" without express or implied\r\n// warranty, and with no claim as to its suitability for any purpose.\r\n//\r\n//----------------------------------------------------------------------------\r\n// Contact: mcseem@antigrain.com\r\n//          mcseemagg@yahoo.com\r\n//          http://www.antigrain.com\r\n//----------------------------------------------------------------------------\r\n//----------------------------------------------------------------------------\r\n//\r\n//\t25 Jan 2007 - Ported to AGG 2.4 Jerry Evans (jerry@novadsp.com)\r\n//\t11 Jul 2009 - significant refactors for introduction to desmume\r\n//\r\n//----------------------------------------------------------------------------\r\n#include \"agg2d.h\"\r\n\r\nstatic const double g_approxScale = 2.0;\r\n\r\n#define TAGG2D Agg2D AGG2D_TEMPLATE_ARG\r\n#define TAGG2DRENDERER Agg2DRenderer <PixFormatSet,PixFormatSet>\r\n\r\n//AGG2D_TEMPLATE inline bool operator == (const TAGG2D::Color& c1, const TAGG2D::Color& c2)\r\n//{\r\n//   return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;\r\n//}\r\n//\r\n//AGG2D_TEMPLATE inline bool operator != (const Agg2D<PixFormat>::Color& c1, const Agg2D<PixFormat>::Color& c2)\r\n//{\r\n//   return !(c1 == c2);\r\n//}\r\n\r\nAGG2D_TEMPLATE inline TAGG2D::~Agg2D()\r\n{\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#ifndef AGG2D_USE_FREETYPE\r\n    ::ReleaseDC(0, m_fontDC);\r\n#endif\r\n#endif\r\n}\r\n\r\nAGG2D_TEMPLATE inline TAGG2D::Agg2D() :\r\n    m_rbuf(),\r\n    m_pixFormat(m_rbuf),\r\n    m_pixFormatComp(m_rbuf),\r\n    m_pixFormatPre(m_rbuf),\r\n    m_pixFormatCompPre(m_rbuf),\r\n    m_renBase(m_pixFormat),\r\n    m_renBaseComp(m_pixFormatComp),\r\n    m_renBasePre(m_pixFormatPre),\r\n    m_renBaseCompPre(m_pixFormatCompPre),\r\n    m_renSolid(m_renBase),\r\n    m_renSolidComp(m_renBaseComp),\r\n\r\n    m_allocator(),\r\n    m_clipBox(0,0,0,0),\r\n\r\n    m_blendMode(BlendAlpha),\r\n    m_imageBlendMode(BlendDst),\r\n    m_imageBlendColor(0,0,0),\r\n\r\n    m_scanline(),\r\n    m_rasterizer(),\r\n\r\n    m_masterAlpha(1.0),\r\n    m_antiAliasGamma(1.0),\r\n\r\n\tm_font(agg::gse4x6),\r\n    m_fillColor(255, 255, 255),\r\n    m_lineColor(0,   0,   0),\r\n    m_fillGradient(),\r\n    m_lineGradient(),\r\n\r\n    m_lineCap(CAP_ROUND),\r\n    m_lineJoin(JOIN_ROUND),\r\n\r\n    m_fillGradientFlag(Solid),\r\n    m_lineGradientFlag(Solid),\r\n    m_fillGradientMatrix(),\r\n    m_lineGradientMatrix(),\r\n    m_fillGradientD1(0.0),\r\n    m_lineGradientD1(0.0),\r\n    m_fillGradientD2(100.0),\r\n    m_lineGradientD2(100.0),\r\n\r\n    m_textAngle(0.0),\r\n    m_textAlignX(AlignLeft),\r\n    m_textAlignY(AlignBottom),\r\n    m_textHints(true),\r\n    m_fontHeight(0.0),\r\n    m_fontAscent(0.0),\r\n    m_fontDescent(0.0),\r\n    m_fontCacheType(RasterFontCache),\r\n\r\n    //m_imageFilter(Bilinear), //less quality more speed\r\n\tm_imageFilter(NoFilter),\r\n    m_imageResample(NoResample),\r\n    m_imageFilterLut(agg::image_filter_bilinear(), true),\r\n\r\n    m_fillGradientInterpolator(m_fillGradientMatrix),\r\n    m_lineGradientInterpolator(m_lineGradientMatrix),\r\n\r\n    m_linearGradientFunction(),\r\n    m_radialGradientFunction(),\r\n\r\n    m_lineWidth(1),\r\n    m_evenOddFlag(false),\r\n\r\n    m_start_x(0.0),\r\n    m_start_y(0.0),\r\n\r\n    m_path(),\r\n    m_transform(),\r\n\r\n    m_convCurve(m_path),\r\n    m_convStroke(m_convCurve),\r\n\r\n    m_pathTransform(m_convCurve, m_transform),\r\n    m_strokeTransform(m_convStroke, m_transform)\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#ifdef AGG2D_USE_FREETYPE\r\n    , m_fontEngine(),\r\n#else\r\n    m_fontDC(::GetDC(0)),\r\n    m_fontEngine(m_fontDC),\r\n#endif\r\n    m_fontCacheManager(m_fontEngine)\r\n#endif\r\n{\r\n    lineCap(m_lineCap);\r\n    lineJoin(m_lineJoin);\r\n}\r\n\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::saveStateTo(State& st)\r\n{\r\n\r\n  st.m_clipBox             = m_clipBox;\r\n\r\n  st.m_blendMode           = m_blendMode;\r\n  st.m_imageBlendMode      = m_imageBlendMode;\r\n  st.m_imageBlendColor     = m_imageBlendColor;\r\n\r\n  st.m_masterAlpha         = m_masterAlpha;\r\n  st.m_antiAliasGamma      = m_antiAliasGamma;\r\n\r\n  st.m_font                = m_font;\r\n  st.m_fillColor           = m_fillColor;\r\n  st.m_lineColor           = m_lineColor;\r\n  st.m_fillGradient        = m_fillGradient;\r\n  st.m_lineGradient        = m_lineGradient;\r\n\r\n  st.m_lineCap             = m_lineCap;\r\n  st.m_lineJoin            = m_lineJoin;\r\n\r\n  st.m_fillGradientFlag    = m_fillGradientFlag;\r\n  st.m_lineGradientFlag    = m_lineGradientFlag;\r\n  st.m_fillGradientMatrix  = m_fillGradientMatrix;\r\n  st.m_lineGradientMatrix  = m_lineGradientMatrix;\r\n  st.m_fillGradientD1      = m_fillGradientD1;\r\n  st.m_lineGradientD1      = m_lineGradientD1;\r\n  st.m_fillGradientD2      = m_fillGradientD2;\r\n  st.m_lineGradientD2      = m_lineGradientD2;\r\n\r\n  st.m_textAngle           = m_textAngle;\r\n  st.m_textAlignX          = m_textAlignX;\r\n  st.m_textAlignY          = m_textAlignY;\r\n  st.m_textHints           = m_textHints;\r\n  st.m_fontHeight          = m_fontHeight;\r\n  st.m_fontAscent          = m_fontAscent;\r\n  st.m_fontDescent         = m_fontDescent;\r\n  st.m_fontCacheType       = m_fontCacheType;\r\n\r\n  st.m_lineWidth           = m_lineWidth;\r\n  st.m_evenOddFlag         = m_evenOddFlag;\r\n\r\n  st.m_transform           = m_transform;\r\n  st.m_affine              = m_affine;\r\n\r\n}\r\n\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::restoreStateFrom(const State& st)\r\n{\r\n\r\n  m_clipBox             = st.m_clipBox;\r\n\r\n  m_blendMode           = st.m_blendMode;\r\n  m_imageBlendMode      = st.m_imageBlendMode;\r\n  m_imageBlendColor     = st.m_imageBlendColor;\r\n\r\n  m_masterAlpha         = st.m_masterAlpha;\r\n  m_antiAliasGamma      = st.m_antiAliasGamma;\r\n\r\n  m_font                = st.m_font;\r\n  m_fillColor           = st.m_fillColor;\r\n  m_lineColor           = st.m_lineColor;\r\n  m_fillGradient        = st.m_fillGradient;\r\n  m_lineGradient        = st.m_lineGradient;\r\n\r\n  m_lineCap             = st.m_lineCap;\r\n  m_lineJoin            = st.m_lineJoin;\r\n\r\n  m_fillGradientFlag    = st.m_fillGradientFlag;\r\n  m_lineGradientFlag    = st.m_lineGradientFlag;\r\n  m_fillGradientMatrix  = st.m_fillGradientMatrix;\r\n  m_lineGradientMatrix  = st.m_lineGradientMatrix;\r\n  m_fillGradientD1      = st.m_fillGradientD1;\r\n  m_lineGradientD1      = st.m_lineGradientD1;\r\n  m_fillGradientD2      = st.m_fillGradientD2;\r\n  m_lineGradientD2      = st.m_lineGradientD2;\r\n\r\n  m_textAngle           = st.m_textAngle;\r\n  m_textAlignX          = st.m_textAlignX;\r\n  m_textAlignY          = st.m_textAlignY;\r\n  m_textHints           = st.m_textHints;\r\n  m_fontHeight          = st.m_fontHeight;\r\n  m_fontAscent          = st.m_fontAscent;\r\n  m_fontDescent         = st.m_fontDescent;\r\n  m_fontCacheType       = st.m_fontCacheType;\r\n\r\n  m_lineWidth           = st.m_lineWidth;\r\n  m_evenOddFlag         = st.m_evenOddFlag;\r\n\r\n  m_affine              = st.m_affine;\r\n  m_transform           = st.m_transform;\r\n\r\n}\r\n\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(unsigned char* buf, unsigned width, unsigned height, int stride)\r\n{\r\n    m_rbuf.attach(buf, width, height, stride);\r\n\r\n    m_renBase.reset_clipping(true);\r\n    m_renBaseComp.reset_clipping(true);\r\n    m_renBasePre.reset_clipping(true);\r\n    m_renBaseCompPre.reset_clipping(true);\r\n\r\n\t//why is all this reset here???? seems silly.\r\n\r\n    resetTransformations();\r\n    lineWidth(1.0),\r\n    lineColor(0,0,0);\r\n    fillColor(255,255,255);\r\n    clipBox(0, 0, width, height);\r\n    lineCap(CAP_ROUND);\r\n    lineJoin(JOIN_ROUND);\r\n\t#ifdef AGG2D_USE_VECTORFONTS\r\n    textAlignment(AlignLeft, AlignBottom);\r\n    flipText(false);\r\n\t#endif\r\n    //imageFilter(Bilinear); //less quality more speed\r\n\timageFilter(NoFilter);\r\n    imageResample(NoResample);\r\n    m_masterAlpha = 1.0;\r\n    m_antiAliasGamma = 1.0;\r\n    m_rasterizer.gamma(agg::gamma_none());\r\n    m_blendMode = BlendAlpha;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(MyImage& img)\r\n{\r\n    attach(img.renBuf.buf(), img.renBuf.width(), img.renBuf.height(), img.renBuf.stride());\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clipBox(double x1, double y1, double x2, double y2)\r\n{\r\n    m_viewport.transform(&x1, &y1); // \r\n    m_viewport.transform(&x2, &y2); // see: http://article.gmane.org/gmane.comp.graphics.agg/3543\r\n\r\n    m_clipBox = RectD(x1, y1, x2, y2);\r\n\r\n    int rx1 = int(x1);\r\n    int ry1 = int(y1);\r\n    int rx2 = int(x2);\r\n    int ry2 = int(y2);\r\n\r\n    m_renBase.clip_box(rx1, ry1, rx2, ry2);\r\n    m_renBaseComp.clip_box(rx1, ry1, rx2, ry2);\r\n    m_renBasePre.clip_box(rx1, ry1, rx2, ry2);\r\n    m_renBaseCompPre.clip_box(rx1, ry1, rx2, ry2);\r\n\r\n    // m_rasterizer.clip_box(x1, y1, x2, y2);\r\n    m_rasterizer.clip_box(m_renBase.xmin(),   m_renBase.ymin(), \r\n                          m_renBase.xmax()+1, m_renBase.ymax()+1); // see link above\r\n\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::blendMode(BlendMode m)\r\n{\r\n    m_blendMode = m;\r\n    m_pixFormatComp.comp_op(m);\r\n    m_pixFormatCompPre.comp_op(m);\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::BlendMode Agg2D AGG2D_TEMPLATE_ARG ::blendMode() const\r\n{\r\n    return m_blendMode;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendMode(BlendMode m)\r\n{\r\n    m_imageBlendMode = m;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::BlendMode Agg2D AGG2D_TEMPLATE_ARG ::imageBlendMode() const\r\n{\r\n    return m_imageBlendMode;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor(Color c)\r\n{\r\n    m_imageBlendColor = c;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a)\r\n{\r\n    imageBlendColor(Color(r, g, b, a));\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE typename Agg2D AGG2D_TEMPLATE_ARG ::Color Agg2D AGG2D_TEMPLATE_ARG ::imageBlendColor() const\r\n{\r\n    return m_imageBlendColor;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::masterAlpha(double a)\r\n{\r\n    m_masterAlpha = a;\r\n    updateRasterizerGamma();\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::masterAlpha() const\r\n{\r\n    return m_masterAlpha;\r\n}\r\n\r\n//------------------------------------------------------------------------+\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::antiAliasGamma(double g)\r\n{\r\n    m_antiAliasGamma = g;\r\n    updateRasterizerGamma();\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::antiAliasGamma() const\r\n{\r\n    return m_antiAliasGamma;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE Agg2DBase::RectD Agg2D AGG2D_TEMPLATE_ARG ::clipBox() const\r\n{\r\n    return m_clipBox;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearAll(Color c)\r\n{\r\n    m_renBase.clear(c);\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearAll(unsigned r, unsigned g, unsigned b, unsigned a)\r\n{\r\n    clearAll(Color(r, g, b, a));\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearClipBox(Color c)\r\n{\r\n    m_renBase.copy_bar(0, 0, m_renBase.width(), m_renBase.height(), c);\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a)\r\n{\r\n    clearClipBox(Color(r, g, b, a));\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::worldToScreen(double& x, double& y) const\r\n{\r\n    m_transform.transform(&x, &y);\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::screenToWorld(double& x, double& y) const\r\n{\r\n    m_transform.inverse_transform(&x, &y);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::worldToScreen(double scalar) const\r\n{\r\n    double x1 = 0;\r\n    double y1 = 0;\r\n    double x2 = scalar;\r\n    double y2 = scalar;\r\n    worldToScreen(x1, y1);\r\n    worldToScreen(x2, y2);\r\n    return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * 0.7071068;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double Agg2D AGG2D_TEMPLATE_ARG ::screenToWorld(double scalar) const\r\n{\r\n    double x1 = 0;\r\n    double y1 = 0;\r\n    double x2 = scalar;\r\n    double y2 = scalar;\r\n    screenToWorld(x1, y1);\r\n    screenToWorld(x2, y2);\r\n    return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * 0.7071068;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::alignPoint(double& x, double& y) const\r\n{\r\n    worldToScreen(x, y);\r\n    x = floor(x) + 0.5;\r\n    y = floor(y) + 0.5;\r\n    screenToWorld(x, y);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE bool Agg2D AGG2D_TEMPLATE_ARG ::inBox(double worldX, double worldY) const\r\n{\r\n    worldToScreen(worldX, worldY);\r\n    return m_renBase.inbox(int(worldX), int(worldY));\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE Agg2DBase::Transformations Agg2D AGG2D_TEMPLATE_ARG ::transformations() const\r\n{\r\n    Transformations tr;\r\n    m_transform.store_to(tr.affineMatrix);\r\n    return tr;\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE const Agg2DBase::Affine& Agg2D AGG2D_TEMPLATE_ARG ::affine() const\r\n{\r\n    return m_affine;\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::affine(const Affine& af)\r\n{\r\n    m_affine = af;\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::transformations(const Transformations& tr)\r\n{\r\n    m_transform.load_from(tr.affineMatrix);\r\n    m_convCurve.approximation_scale(worldToScreen(1.0) * g_approxScale);\r\n    m_convStroke.approximation_scale(worldToScreen(1.0) * g_approxScale);\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::resetTransformations()\r\n{\r\n    m_transform.reset();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::updateTransformations()\r\n{\r\n   m_transform  = m_affine;\r\n   m_transform *= m_viewport;\r\n   m_convCurve.approximation_scale(worldToScreen(1.0) * g_approxScale);\r\n   m_convStroke.approximation_scale(worldToScreen(1.0) * g_approxScale);\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::rotate(double angle)\r\n{\r\n    m_affine.premultiply(agg::trans_affine_rotation(angle));\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::rotate(double angle, double cx, double cy)\r\n{\r\n    agg::trans_affine_translation m(-cx, -cy);\r\n    m *= agg::trans_affine_rotation(angle);\r\n    m *= agg::trans_affine_translation(cx, cy);\r\n    m_affine.premultiply(m);\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::skew(double sx, double sy)\r\n{\r\n    m_affine.premultiply(agg::trans_affine_skewing(sx, sy));\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::translate(double x, double y)\r\n{\r\n    m_affine.premultiply(agg::trans_affine_translation(x, y));\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::matrix(const Affine& tr)\r\n{\r\n    m_affine.premultiply(tr);\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::matrix(const Transformations& tr)\r\n{\r\n    matrix(agg::trans_affine(tr.affineMatrix[0], tr.affineMatrix[1], tr.affineMatrix[2],\r\n                             tr.affineMatrix[3], tr.affineMatrix[4], tr.affineMatrix[5]));\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::scale(double s)\r\n{\r\n    m_affine.premultiply(agg::trans_affine_scaling(s));\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::scale(double sx, double sy)\r\n{\r\n    m_affine.premultiply(agg::trans_affine_scaling(sx, sy));\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::parallelogram(double x1, double y1, double x2, double y2, const double* para)\r\n{\r\n    m_affine.premultiply(agg::trans_affine(x1, y1, x2, y2, para));\r\n    updateTransformations();\r\n}\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::viewport(double worldX1,  double worldY1,  double worldX2,  double worldY2,\r\n                     double screenX1, double screenY1, double screenX2, double screenY2,\r\n                     ViewportOption opt, WindowFitLogic fl)\r\n{\r\n    agg::trans_viewport vp;\r\n\r\n    agg::aspect_ratio_e ar =\r\n        (fl == WindowFitLogic_meet) ? agg::aspect_ratio_meet :\r\n                                      agg::aspect_ratio_slice;\r\n    switch(opt)\r\n    {\r\n        case Anisotropic: vp.preserve_aspect_ratio(0.0, 0.0, agg::aspect_ratio_stretch); break;\r\n        case XMinYMin:    vp.preserve_aspect_ratio(0.0, 0.0, ar);    break;\r\n        case XMidYMin:    vp.preserve_aspect_ratio(0.5, 0.0, ar);    break;\r\n        case XMaxYMin:    vp.preserve_aspect_ratio(1.0, 0.0, ar);    break;\r\n        case XMinYMid:    vp.preserve_aspect_ratio(0.0, 0.5, ar);    break;\r\n        case XMidYMid:    vp.preserve_aspect_ratio(0.5, 0.5, ar);    break;\r\n        case XMaxYMid:    vp.preserve_aspect_ratio(1.0, 0.5, ar);    break;\r\n        case XMinYMax:    vp.preserve_aspect_ratio(0.0, 1.0, ar);    break;\r\n        case XMidYMax:    vp.preserve_aspect_ratio(0.5, 1.0, ar);    break;\r\n        case XMaxYMax:    vp.preserve_aspect_ratio(1.0, 1.0, ar);    break;\r\n    }\r\n    vp.world_viewport(worldX1,   worldY1,  worldX2,  worldY2);\r\n    vp.device_viewport(screenX1, screenY1, screenX2, screenY2);\r\n\r\n    m_viewport = vp.to_affine();\r\n    updateTransformations();\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::fillColor(Color c)\r\n{\r\n    m_fillColor = c;\r\n    m_fillGradientFlag = Solid;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::fillColor(unsigned r, unsigned g, unsigned b, unsigned a)\r\n{\r\n    fillColor(Color(r, g, b, a));\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::noFill()\r\n{\r\n    fillColor(Color(0, 0, 0, 0));\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::lineColor(Color c)\r\n{\r\n    m_lineColor = c;\r\n    m_lineGradientFlag = Solid;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::lineColor(unsigned r, unsigned g, unsigned b, unsigned a)\r\n{\r\n    lineColor(Color(r, g, b, a));\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::noLine()\r\n{\r\n    lineColor(Color(0, 0, 0, 0));\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE typename TAGG2D::Color TAGG2D::fillColor() const\r\n{\r\n    return m_fillColor;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE typename TAGG2D::Color TAGG2D::lineColor() const\r\n{\r\n    return m_lineColor;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile)\r\n{\r\n    int i;\r\n    int startGradient = 128 - int(profile * 127.0);\r\n    int endGradient   = 128 + int(profile * 127.0);\r\n    if (endGradient <= startGradient) endGradient = startGradient + 1;\r\n    double k = 1.0 / double(endGradient - startGradient);\r\n    for (i = 0; i < startGradient; i++)\r\n    {\r\n        m_fillGradient[i] = c1;\r\n    }\r\n    for (; i < endGradient; i++)\r\n    {\r\n        m_fillGradient[i] = c1.gradient(c2, double(i - startGradient) * k);\r\n    }\r\n    for (; i < 256; i++)\r\n    {\r\n        m_fillGradient[i] = c2;\r\n    }\r\n    double angle = atan2(y2-y1, x2-x1);\r\n    m_fillGradientMatrix.reset();\r\n    m_fillGradientMatrix *= agg::trans_affine_rotation(angle);\r\n    m_fillGradientMatrix *= agg::trans_affine_translation(x1, y1);\r\n    m_fillGradientMatrix *= m_transform;\r\n    m_fillGradientMatrix.invert();\r\n    m_fillGradientD1 = 0.0;\r\n    m_fillGradientD2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));\r\n    m_fillGradientFlag = Linear;\r\n    m_fillColor = Color(0,0,0);  // Set some real color\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile)\r\n{\r\n    int i;\r\n    int startGradient = 128 - int(profile * 128.0);\r\n    int endGradient   = 128 + int(profile * 128.0);\r\n    if (endGradient <= startGradient) endGradient = startGradient + 1;\r\n    double k = 1.0 / double(endGradient - startGradient);\r\n    for (i = 0; i < startGradient; i++)\r\n    {\r\n        m_lineGradient[i] = c1;\r\n    }\r\n    for (; i < endGradient; i++)\r\n    {\r\n        m_lineGradient[i] = c1.gradient(c2, double(i - startGradient) * k);\r\n    }\r\n    for (; i < 256; i++)\r\n    {\r\n        m_lineGradient[i] = c2;\r\n    }\r\n    double angle = atan2(y2-y1, x2-x1);\r\n    m_lineGradientMatrix.reset();\r\n    m_lineGradientMatrix *= agg::trans_affine_rotation(angle);\r\n    m_lineGradientMatrix *= agg::trans_affine_translation(x1, y1);\r\n    m_fillGradientMatrix *= m_transform;\r\n    m_lineGradientMatrix.invert();\r\n    m_lineGradientD1 = 0;\r\n    m_lineGradientD2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));\r\n    m_lineGradientFlag = Linear;\r\n    m_lineColor = Color(0,0,0);  // Set some real color\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile)\r\n{\r\n    int i;\r\n    int startGradient = 128 - int(profile * 127.0);\r\n    int endGradient   = 128 + int(profile * 127.0);\r\n    if (endGradient <= startGradient) endGradient = startGradient + 1;\r\n    double k = 1.0 / double(endGradient - startGradient);\r\n    for (i = 0; i < startGradient; i++)\r\n    {\r\n        m_fillGradient[i] = c1;\r\n    }\r\n    for (; i < endGradient; i++)\r\n    {\r\n        m_fillGradient[i] = c1.gradient(c2, double(i - startGradient) * k);\r\n    }\r\n    for (; i < 256; i++)\r\n    {\r\n        m_fillGradient[i] = c2;\r\n    }\r\n    m_fillGradientD2 = worldToScreen(r);\r\n    worldToScreen(x, y);\r\n    m_fillGradientMatrix.reset();\r\n    m_fillGradientMatrix *= agg::trans_affine_translation(x, y);\r\n    m_fillGradientMatrix.invert();\r\n    m_fillGradientD1 = 0;\r\n    m_fillGradientFlag = Radial;\r\n    m_fillColor = Color(0,0,0);  // Set some real color\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile)\r\n{\r\n    int i;\r\n    int startGradient = 128 - int(profile * 128.0);\r\n    int endGradient   = 128 + int(profile * 128.0);\r\n    if (endGradient <= startGradient) endGradient = startGradient + 1;\r\n    double k = 1.0 / double(endGradient - startGradient);\r\n    for (i = 0; i < startGradient; i++)\r\n    {\r\n        m_lineGradient[i] = c1;\r\n    }\r\n    for (; i < endGradient; i++)\r\n    {\r\n        m_lineGradient[i] = c1.gradient(c2, double(i - startGradient) * k);\r\n    }\r\n    for (; i < 256; i++)\r\n    {\r\n        m_lineGradient[i] = c2;\r\n    }\r\n    m_lineGradientD2 = worldToScreen(r);\r\n    worldToScreen(x, y);\r\n    m_lineGradientMatrix.reset();\r\n    m_lineGradientMatrix *= agg::trans_affine_translation(x, y);\r\n    m_lineGradientMatrix.invert();\r\n    m_lineGradientD1 = 0;\r\n    m_lineGradientFlag = Radial;\r\n    m_lineColor = Color(0,0,0);  // Set some real color\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3)\r\n{\r\n    int i;\r\n    for (i = 0; i < 128; i++)\r\n    {\r\n        m_fillGradient[i] = c1.gradient(c2, double(i) / 127.0);\r\n    }\r\n    for (; i < 256; i++)\r\n    {\r\n        m_fillGradient[i] = c2.gradient(c3, double(i - 128) / 127.0);\r\n    }\r\n    m_fillGradientD2 = worldToScreen(r);\r\n    worldToScreen(x, y);\r\n    m_fillGradientMatrix.reset();\r\n    m_fillGradientMatrix *= agg::trans_affine_translation(x, y);\r\n    m_fillGradientMatrix.invert();\r\n    m_fillGradientD1 = 0;\r\n    m_fillGradientFlag = Radial;\r\n    m_fillColor = Color(0,0,0);  // Set some real color\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3)\r\n{\r\n    int i;\r\n    for (i = 0; i < 128; i++)\r\n    {\r\n        m_lineGradient[i] = c1.gradient(c2, double(i) / 127.0);\r\n    }\r\n    for (; i < 256; i++)\r\n    {\r\n        m_lineGradient[i] = c2.gradient(c3, double(i - 128) / 127.0);\r\n    }\r\n    m_lineGradientD2 = worldToScreen(r);\r\n    worldToScreen(x, y);\r\n    m_lineGradientMatrix.reset();\r\n    m_lineGradientMatrix *= agg::trans_affine_translation(x, y);\r\n    m_lineGradientMatrix.invert();\r\n    m_lineGradientD1 = 0;\r\n    m_lineGradientFlag = Radial;\r\n    m_lineColor = Color(0,0,0);  // Set some real color\r\n}\r\n\r\n\r\nAGG2D_TEMPLATE void TAGG2D::fillRadialGradient(double x, double y, double r)\r\n{\r\n    m_fillGradientD2 = worldToScreen(r);\r\n    worldToScreen(x, y);\r\n    m_fillGradientMatrix.reset();\r\n    m_fillGradientMatrix *= agg::trans_affine_translation(x, y);\r\n    m_fillGradientMatrix.invert();\r\n    m_fillGradientD1 = 0;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineRadialGradient(double x, double y, double r)\r\n{\r\n    m_lineGradientD2 = worldToScreen(r);\r\n    worldToScreen(x, y);\r\n    m_lineGradientMatrix.reset();\r\n    m_lineGradientMatrix *= agg::trans_affine_translation(x, y);\r\n    m_lineGradientMatrix.invert();\r\n    m_lineGradientD1 = 0;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineWidth(double w)\r\n{\r\n    m_lineWidth = w;\r\n    m_convStroke.width(w);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double TAGG2D::lineWidth() const\r\n{\r\n    return m_lineWidth;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::fillEvenOdd(bool evenOddFlag)\r\n{\r\n    m_evenOddFlag = evenOddFlag;\r\n    m_rasterizer.filling_rule(evenOddFlag ? agg::fill_even_odd : agg::fill_non_zero);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE bool TAGG2D::fillEvenOdd() const\r\n{\r\n    return m_evenOddFlag;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineCap(LineCap cap)\r\n{\r\n    m_lineCap = cap;\r\n    m_convStroke.line_cap((agg::line_cap_e)cap);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE Agg2DBase::LineCap TAGG2D::lineCap() const\r\n{\r\n    return m_lineCap;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineJoin(LineJoin join)\r\n{\r\n    m_lineJoin = join;\r\n    m_convStroke.line_join((agg::line_join_e)join);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE Agg2DBase::LineJoin TAGG2D::lineJoin() const\r\n{\r\n    return m_lineJoin;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::addLine(double x1, double y1, double x2, double y2)\r\n{\r\n    m_path.move_to(x1, y1);\r\n    m_path.line_to(x2, y2);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::line(double x1, double y1, double x2, double y2)\r\n{\r\n    m_path.remove_all();\r\n    addLine(x1, y1, x2, y2);\r\n    drawPath(StrokeOnly);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::triangle(double x1, double y1, double x2, double y2, double x3, double y3)\r\n{\r\n    m_path.remove_all();\r\n    m_path.move_to(x1, y1);\r\n    m_path.line_to(x2, y2);\r\n    m_path.line_to(x3, y3);\r\n    m_path.close_polygon();\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::rectangle(double x1, double y1, double x2, double y2)\r\n{\r\n    m_path.remove_all();\r\n    m_path.move_to(x1, y1);\r\n    m_path.line_to(x2, y1);\r\n    m_path.line_to(x2, y2);\r\n    m_path.line_to(x1, y2);\r\n    m_path.close_polygon();\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double r)\r\n{\r\n    m_path.remove_all();\r\n    agg::rounded_rect rc(x1, y1, x2, y2, r);\r\n    rc.normalize_radius();\r\n    rc.approximation_scale(worldToScreen(1.0) * g_approxScale);\r\n    // JME audit\r\n    //m_path.add_path(rc, 0, false);\r\n    m_path.concat_path(rc,0);\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2, double rx, double ry)\r\n{\r\n    m_path.remove_all();\r\n    agg::rounded_rect rc;\r\n    rc.rect(x1, y1, x2, y2);\r\n    rc.radius(rx, ry);\r\n    rc.normalize_radius();\r\n    //m_path.add_path(rc, 0, false);\r\n    m_path.concat_path(rc,0); // JME\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::roundedRect(double x1, double y1, double x2, double y2,\r\n                        double rx_bottom, double ry_bottom,\r\n                        double rx_top,    double ry_top)\r\n{\r\n    m_path.remove_all();\r\n    agg::rounded_rect rc;\r\n    rc.rect(x1, y1, x2, y2);\r\n    rc.radius(rx_bottom, ry_bottom, rx_top, ry_top);\r\n    rc.normalize_radius();\r\n    rc.approximation_scale(worldToScreen(1.0) * g_approxScale);\r\n    //m_path.add_path(rc, 0, false);\r\n    m_path.concat_path(rc,0); // JME\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::ellipse(double cx, double cy, double rx, double ry)\r\n{\r\n    m_path.remove_all();\r\n    agg::bezier_arc arc(cx, cy, rx, ry, 0, 2*pi());\r\n    //m_path.add_path(arc, 0, false);\r\n    m_path.concat_path(arc,0); // JME\r\n    m_path.close_polygon();\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::arc(double cx, double cy, double rx, double ry, double start, double sweep)\r\n{\r\n    m_path.remove_all();\r\n    agg::bezier_arc arc(cx, cy, rx, ry, start, sweep);\r\n    //m_path.add_path(arc, 0, false);\r\n    m_path.concat_path(arc,0); // JME\r\n    drawPath(StrokeOnly);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::star(double cx, double cy, double r1, double r2, double startAngle, int numRays)\r\n{\r\n    m_path.remove_all();\r\n    double da = agg::pi / double(numRays);\r\n    double a = startAngle;\r\n    int i;\r\n    for (i = 0; i < numRays; i++)\r\n    {\r\n        double x = cos(a) * r2 + cx;\r\n        double y = sin(a) * r2 + cy;\r\n        if (i) m_path.line_to(x, y);\r\n        else   m_path.move_to(x, y);\r\n        a += da;\r\n        m_path.line_to(cos(a) * r1 + cx, sin(a) * r1 + cy);\r\n        a += da;\r\n    }\r\n    closePolygon();\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::curve(double x1, double y1, double x2, double y2, double x3, double y3)\r\n{\r\n    m_path.remove_all();\r\n    m_path.move_to(x1, y1);\r\n    m_path.curve3(x2, y2, x3, y3);\r\n    drawPath(StrokeOnly);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)\r\n{\r\n    m_path.remove_all();\r\n    m_path.move_to(x1, y1);\r\n    m_path.curve4(x2, y2, x3, y3, x4, y4);\r\n    drawPath(StrokeOnly);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::polygon(double* xy, int numPoints)\r\n{\r\n    m_path.remove_all();\r\n    //m_path.add_poly(xy, numPoints);\r\n    m_path.concat_poly(xy,numPoints,true); // JME, AF\r\n    closePolygon();\r\n    drawPath(FillAndStroke);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::polyline(double* xy, int numPoints)\r\n{\r\n    m_path.remove_all();\r\n    //m_path.add_poly(xy, numPoints);\r\n\t  m_path.concat_poly(xy,numPoints,true); // JME, AF\r\n    drawPath(StrokeOnly);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\nAGG2D_TEMPLATE void TAGG2D::flipText(bool flip)\r\n{\r\n    m_fontEngine.flip_y(flip);\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::font(const char* fontName,\r\n                 double height,\r\n                 bool bold,\r\n                 bool italic,\r\n                 FontCacheType ch,\r\n                 double angle)\r\n{\r\n    m_textAngle = angle;\r\n    m_fontHeight = height;\r\n    m_fontCacheType = ch;\r\n\r\n\r\n#ifdef AGG2D_USE_FREETYPE\r\n    m_fontEngine.load_font(fontName,\r\n                           0,\r\n                           (ch == VectorFontCache) ?\r\n                                agg::glyph_ren_outline :\r\n                                agg::glyph_ren_agg_gray8);\r\n    m_fontEngine.hinting(m_textHints);\r\n    m_fontEngine.height((ch == VectorFontCache) ? height : worldToScreen(height));\r\n#else\r\n    m_fontEngine.hinting(m_textHints);\r\n\r\n    m_fontEngine.create_font(fontName,\r\n                             (ch == VectorFontCache) ?\r\n                                agg::glyph_ren_outline :\r\n                                agg::glyph_ren_agg_gray8,\r\n                              (ch == VectorFontCache) ? height : worldToScreen(height),\r\n                              0.0,\r\n                              bold ? 700 : 400,\r\n                              italic);\r\n#endif\r\n\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double TAGG2D::fontHeight() const\r\n{\r\n   return m_fontHeight;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double TAGG2D::fontAscent() const\r\n{\r\n   return m_fontAscent;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::textAlignment(TextAlignment alignX, TextAlignment alignY)\r\n{\r\n   m_textAlignX = alignX;\r\n   m_textAlignY = alignY;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\n\r\nAGG2D_TEMPLATE double TAGG2D::textWidth(const char* str, unsigned int len)\r\n{\r\n#if defined( UNDER_CE )\r\n  return 0;\r\n#else\r\n    double x = 0;\r\n    double y = 0;\r\n    bool first = true;\r\n    while(*str && len)\r\n    {\r\n        const agg::glyph_cache* glyph = m_fontCacheManager.glyph(*str);\r\n        if(glyph)\r\n        {\r\n            if(!first) m_fontCacheManager.add_kerning(&x, &y);\r\n            x += glyph->advance_x;\r\n            y += glyph->advance_y;\r\n            first = true;\r\n        }\r\n        ++str; --len;\r\n    }\r\n    return (m_fontCacheType == VectorFontCache) ? x : screenToWorld(x);\r\n#endif\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE double TAGG2D::textWidth(const wchar_t* str, unsigned int len)\r\n{\r\n#if defined( UNDER_CE )\r\n  return 0;\r\n#else\r\n    double x = 0;\r\n    double y = 0;\r\n    bool first = true;\r\n    while(*str && len)\r\n    {\r\n        const agg::glyph_cache* glyph = m_fontCacheManager.glyph(*str);\r\n        if(glyph)\r\n        {\r\n            if(!first) m_fontCacheManager.add_kerning(&x, &y);\r\n            x += glyph->advance_x;\r\n            y += glyph->advance_y;\r\n            first = true;\r\n        }\r\n        ++str; --len;\r\n    }\r\n    return (m_fontCacheType == VectorFontCache) ? x : screenToWorld(x);\r\n#endif\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE bool TAGG2D::textHints() const\r\n{\r\n   return m_textHints;\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::textHints(bool hints)\r\n{\r\n   m_textHints = hints;\r\n}\r\n\r\n\r\n\r\n//------------------------------------------------------------------------\r\n\r\nAGG2D_TEMPLATE void TAGG2D::text(double x, double y, const char* str, unsigned int len, bool roundOff, double ddx, double ddy)\r\n{\r\n\r\n   double dx = 0.0;\r\n   double dy = 0.0;\r\n\r\n   switch(m_textAlignX)\r\n   {\r\n       case AlignCenter:  dx = -textWidth(str,len) * 0.5; break;\r\n       case AlignRight:   dx = -textWidth(str,len);       break;\r\n       default: break;\r\n   }\r\n\r\n\r\n   double asc = fontHeight();\r\n   const agg::glyph_cache* glyph = m_fontCacheManager.glyph('H');\r\n   if(glyph)\r\n   {\r\n       asc = glyph->bounds.y2 - glyph->bounds.y1;\r\n   }\r\n\r\n   if(m_fontCacheType == RasterFontCache)\r\n   {\r\n       asc = screenToWorld(asc);\r\n   }\r\n\r\n   switch(m_textAlignY)\r\n   {\r\n       case AlignCenter:    dy = -asc * 0.5; break;\r\n       case AlignTop:       dy = -asc;       break;\r\n       case AlignBaseline:  dy = -fontAscent();   break;\r\n       default: break;\r\n   }\r\n\r\n   if(m_fontEngine.flip_y()) dy = -dy;\r\n\r\n   agg::trans_affine  mtx;\r\n\r\n    double start_x = x + dx;\r\n    double start_y = y + dy;\r\n\r\n    if (roundOff)\r\n    {\r\n        start_x = int(start_x);\r\n        start_y = int(start_y);\r\n    }\r\n    start_x += ddx;\r\n    start_y += ddy;\r\n\r\n    mtx *= agg::trans_affine_translation(-x, -y);\r\n    mtx *= agg::trans_affine_rotation(m_textAngle);\r\n    mtx *= agg::trans_affine_translation(x, y);\r\n\r\n    agg::conv_transform<FontCacheManager::path_adaptor_type> tr(m_fontCacheManager.path_adaptor(), mtx);\r\n\r\n    if(m_fontCacheType == RasterFontCache)\r\n    {\r\n        worldToScreen(start_x, start_y);\r\n    }\r\n\r\n    unsigned int i;\r\n    for (i = 0; i < len && str[i]; i++)\r\n    {\r\n        glyph = m_fontCacheManager.glyph(str[i]);\r\n        if(glyph)\r\n        {\r\n            if(i) m_fontCacheManager.add_kerning(&x, &y);\r\n            m_fontCacheManager.init_embedded_adaptors(glyph, start_x, start_y);\r\n\r\n            if(glyph->data_type == agg::glyph_data_outline)\r\n            {\r\n                m_path.remove_all();\r\n                m_path.concat_path(tr, 0);\r\n                drawPath();\r\n            }\r\n\r\n            if(glyph->data_type == agg::glyph_data_gray8)\r\n            {\r\n                render(m_fontCacheManager.gray8_adaptor(),\r\n                       m_fontCacheManager.gray8_scanline());\r\n            }\r\n            start_x += glyph->advance_x;\r\n            start_y += glyph->advance_y;\r\n        }\r\n    }\r\n\r\n}\r\n\r\nAGG2D_TEMPLATE void TAGG2D::text(double x, double y, const wchar_t* str, unsigned int len, bool roundOff, double ddx, double ddy)\r\n{\r\n\r\n   double dx = 0.0;\r\n   double dy = 0.0;\r\n\r\n   switch(m_textAlignX)\r\n   {\r\n       case AlignCenter:  dx = -textWidth(str,len) * 0.5; break;\r\n       case AlignRight:   dx = -textWidth(str,len);       break;\r\n       default: break;\r\n   }\r\n\r\n   double asc = fontHeight();\r\n   const agg::glyph_cache* glyph = m_fontCacheManager.glyph('H');\r\n   if(glyph)\r\n   {\r\n       asc = glyph->bounds.y2 - glyph->bounds.y1;\r\n   }\r\n\r\n   if(m_fontCacheType == RasterFontCache)\r\n   {\r\n       asc = screenToWorld(asc);\r\n   }\r\n\r\n   switch(m_textAlignY)\r\n   {\r\n       case AlignCenter:    dy = -asc * 0.5; break;\r\n       case AlignTop:       dy = -asc;       break;\r\n       case AlignBaseline:  dy = -fontAscent();   break;\r\n       default: break;\r\n   }\r\n\r\n   if(m_fontEngine.flip_y()) dy = -dy;\r\n\r\n   agg::trans_affine  mtx;\r\n\r\n    double start_x = x + dx;\r\n    double start_y = y + dy;\r\n\r\n    if (roundOff)\r\n    {\r\n        start_x = int(start_x);\r\n        start_y = int(start_y);\r\n    }\r\n    start_x += ddx;\r\n    start_y += ddy;\r\n\r\n    mtx *= agg::trans_affine_translation(-x, -y);\r\n    mtx *= agg::trans_affine_rotation(m_textAngle);\r\n    mtx *= agg::trans_affine_translation(x, y);\r\n\r\n    agg::conv_transform<FontCacheManager::path_adaptor_type> tr(m_fontCacheManager.path_adaptor(), mtx);\r\n\r\n    if(m_fontCacheType == RasterFontCache)\r\n    {\r\n        worldToScreen(start_x, start_y);\r\n    }\r\n\r\n    unsigned int i;\r\n    for (i = 0; i < len && str[i]; i++)\r\n    {\r\n        glyph = m_fontCacheManager.glyph(str[i]);\r\n        if(glyph)\r\n        {\r\n            if(i) m_fontCacheManager.add_kerning(&x, &y);\r\n            m_fontCacheManager.init_embedded_adaptors(glyph, start_x, start_y);\r\n\r\n            if(glyph->data_type == agg::glyph_data_outline)\r\n            {\r\n                m_path.remove_all();\r\n                //m_path.add_path(tr, 0, false);\r\n\t\t\t\t        m_path.concat_path(tr,0); // JME\r\n                drawPath();\r\n            }\r\n\r\n            if(glyph->data_type == agg::glyph_data_gray8)\r\n            {\r\n                render(m_fontCacheManager.gray8_adaptor(),\r\n                       m_fontCacheManager.gray8_scanline());\r\n            }\r\n            start_x += glyph->advance_x;\r\n            start_y += glyph->advance_y;\r\n        }\r\n    }\r\n\r\n}\r\n#endif\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::resetPath() { m_path.remove_all(); }\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::moveTo(double x, double y)\r\n{\r\n    m_start_x = x;\r\n    m_start_y = y;\r\n\r\n    m_path.move_to(x, y);\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::moveRel(double dx, double dy)\r\n{\r\n    if(m_path.vertices().total_vertices())\r\n    {\r\n        double x2;\r\n        double y2;\r\n        m_path.vertices().last_vertex(&x2, &y2);\r\n\r\n        dx += x2;\r\n        dy += y2;\r\n    }\r\n\r\n    moveTo(dx, dy);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineTo(double x, double y)\r\n{\r\n    m_path.line_to(x, y);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::lineRel(double dx, double dy)\r\n{\r\n    m_path.line_rel(dx, dy);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::horLineTo(double x)\r\n{\r\n    m_path.hline_to(x);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::horLineRel(double dx)\r\n{\r\n    m_path.hline_rel(dx);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::verLineTo(double y)\r\n{\r\n    m_path.vline_to(y);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::verLineRel(double dy)\r\n{\r\n    m_path.vline_rel(dy);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::arcTo(double rx, double ry,\r\n                  double angle,\r\n                  bool largeArcFlag,\r\n                  bool sweepFlag,\r\n                  double x, double y)\r\n{\r\n    m_path.arc_to(rx, ry, angle, largeArcFlag, sweepFlag, x, y);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::arcRel(double rx, double ry,\r\n                   double angle,\r\n                   bool largeArcFlag,\r\n                   bool sweepFlag,\r\n                   double dx, double dy)\r\n{\r\n    m_path.arc_rel(rx, ry, angle, largeArcFlag, sweepFlag, dx, dy);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::quadricCurveTo(double xCtrl, double yCtrl,\r\n                           double xTo,   double yTo)\r\n{\r\n    m_path.curve3(xCtrl, yCtrl, xTo, yTo);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::quadricCurveRel(double dxCtrl, double dyCtrl,\r\n                            double dxTo,   double dyTo)\r\n{\r\n    m_path.curve3_rel(dxCtrl, dyCtrl, dxTo, dyTo);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::quadricCurveTo(double xTo, double yTo)\r\n{\r\n    m_path.curve3(xTo, yTo);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::quadricCurveRel(double dxTo, double dyTo)\r\n{\r\n    m_path.curve3_rel(dxTo, dyTo);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::cubicCurveTo(double xCtrl1, double yCtrl1,\r\n                         double xCtrl2, double yCtrl2,\r\n                         double xTo,    double yTo)\r\n{\r\n    m_path.curve4(xCtrl1, yCtrl1, xCtrl2, yCtrl2, xTo, yTo);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::cubicCurveRel(double dxCtrl1, double dyCtrl1,\r\n                          double dxCtrl2, double dyCtrl2,\r\n                          double dxTo,    double dyTo)\r\n{\r\n    m_path.curve4_rel(dxCtrl1, dyCtrl1, dxCtrl2, dyCtrl2, dxTo, dyTo);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::cubicCurveTo(double xCtrl2, double yCtrl2,\r\n                         double xTo,    double yTo)\r\n{\r\n    m_path.curve4(xCtrl2, yCtrl2, xTo, yTo);\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::cubicCurveRel(double xCtrl2, double yCtrl2,\r\n                          double xTo,    double yTo)\r\n{\r\n    m_path.curve4_rel(xCtrl2, yCtrl2, xTo, yTo);\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::addEllipse(double cx, double cy, double rx, double ry, Direction dir)\r\n{\r\n    agg::bezier_arc arc(cx, cy, rx, ry, 0, (dir == CCW) ? 2*pi() : -2*pi());\r\n    //m_path.add_path(arc, 0, false);\r\n\t  m_path.concat_path(arc,0); // JME\r\n    m_path.close_polygon();\r\n}\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::closePolygon()\r\n{\r\n    if(agg::is_vertex(m_path.vertices().last_command()))\r\n    {\r\n        m_path.vertices().add_vertex(m_start_x, m_start_y,\r\n            agg::path_cmd_end_poly | agg::path_flags_close);\r\n    }\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::imageFilter(ImageFilter f)\r\n{\r\n    m_imageFilter = f;\r\n    switch(f)\r\n    {\r\n        case NoFilter:    break;\r\n        case Bilinear:    m_imageFilterLut.calculate(agg::image_filter_bilinear(),    true); break;\r\n        case Hanning:     m_imageFilterLut.calculate(agg::image_filter_hanning(),     true); break;\r\n        case Hermite:     m_imageFilterLut.calculate(agg::image_filter_hermite(),     true); break;\r\n        case Quadric:     m_imageFilterLut.calculate(agg::image_filter_quadric(),     true); break;\r\n        case Bicubic:     m_imageFilterLut.calculate(agg::image_filter_bicubic(),     true); break;\r\n        case Catrom:      m_imageFilterLut.calculate(agg::image_filter_catrom(),      true); break;\r\n        case Spline16:    m_imageFilterLut.calculate(agg::image_filter_spline16(),    true); break;\r\n        case Spline36:    m_imageFilterLut.calculate(agg::image_filter_spline36(),    true); break;\r\n        case Blackman144: m_imageFilterLut.calculate(agg::image_filter_blackman144(), true); break;\r\n    }\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE Agg2DBase::ImageFilter TAGG2D::imageFilter() const\r\n{\r\n    return m_imageFilter;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::imageResample(ImageResample f)\r\n{\r\n    m_imageResample = f;\r\n}\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE Agg2DBase::ImageResample TAGG2D::imageResample() const\r\n{\r\n    return m_imageResample;\r\n}\r\n\r\n//==============moved to .h file===========\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::drawPath(DrawPathFlag flag)\r\n{\r\n    m_rasterizer.reset();\r\n    switch(flag)\r\n    {\r\n    case FillOnly:\r\n        if (m_fillColor.a)\r\n        {\r\n            m_rasterizer.add_path(m_pathTransform);\r\n            render(true);\r\n        }\r\n        break;\r\n\r\n    case StrokeOnly:\r\n        if (m_lineColor.a && m_lineWidth > 0.0)\r\n        {\r\n            m_rasterizer.add_path(m_strokeTransform);\r\n            render(false);\r\n        }\r\n        break;\r\n\r\n    case FillAndStroke:\r\n        if (m_fillColor.a)\r\n        {\r\n            m_rasterizer.add_path(m_pathTransform);\r\n            render(true);\r\n        }\r\n\r\n        if (m_lineColor.a && m_lineWidth > 0.0)\r\n        {\r\n            m_rasterizer.add_path(m_strokeTransform);\r\n            render(false);\r\n        }\r\n        break;\r\n\r\n    case FillWithLineColor:\r\n        if (m_lineColor.a)\r\n        {\r\n            m_rasterizer.add_path(m_pathTransform);\r\n            render(false);\r\n        }\r\n        break;\r\n    }\r\n}\r\n\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE_WITH_IMAGE class Agg2DRenderer\r\n{\r\npublic:\r\n\ttypedef typename TAGG2D::Color Color;\r\n\ttypedef typename TIMAGE Image;\r\n    //--------------------------------------------------------------------\r\n    template<class BaseRenderer, class SolidRenderer>\r\n    void static render(TAGG2D& gr, BaseRenderer& renBase, SolidRenderer& renSolid, bool fillColor)\r\n    {\r\n\t\t// JME\r\n\t\ttypedef agg::span_allocator<agg::rgba8> span_allocator_type;\r\n        //- typedef agg::renderer_scanline_aa<BaseRenderer, TAGG2D::LinearGradientSpan> RendererLinearGradient;\r\n        typedef agg::renderer_scanline_aa<BaseRenderer,\r\n\t\t\t\t\t\t\t\t\t\tspan_allocator_type,\r\n\t\t\t\t\t\t\t\t\t\ttypename TAGG2D::LinearGradientSpan> RendererLinearGradient;\r\n        //- typedef agg::renderer_scanline_aa<BaseRenderer, TAGG2D::RadialGradientSpan> RendererRadialGradient;\r\n\t\ttypedef agg::renderer_scanline_aa<BaseRenderer,\r\n\t\t\t\t\t\t\t\t\t\tspan_allocator_type,\r\n\t\t\t\t\t\t\t\t\t\ttypename TAGG2D::RadialGradientSpan> RendererRadialGradient;\r\n\r\n        if ((fillColor && gr.m_fillGradientFlag == TAGG2D::Linear) ||\r\n           (!fillColor && gr.m_lineGradientFlag == TAGG2D::Linear))\r\n        {\r\n            if (fillColor)\r\n            {\r\n                typename TAGG2D::LinearGradientSpan span(/*gr.m_allocator, */\r\n                                               gr.m_fillGradientInterpolator,\r\n                                               gr.m_linearGradientFunction,\r\n                                               gr.m_fillGradient,\r\n                                               gr.m_fillGradientD1,\r\n                                               gr.m_fillGradientD2);\r\n\t\t\t\t//-RendererLinearGradient ren(renBase,span);\r\n                RendererLinearGradient ren(renBase,gr.m_allocator,span);\r\n                agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren);\r\n            }\r\n            else\r\n            {\r\n               typename  TAGG2D::LinearGradientSpan span(/*gr.m_allocator,*/\r\n                                               gr.m_lineGradientInterpolator,\r\n                                               gr.m_linearGradientFunction,\r\n                                               gr.m_lineGradient,\r\n                                               gr.m_lineGradientD1,\r\n                                               gr.m_lineGradientD2);\r\n                //- RendererLinearGradient ren(renBase, span);\r\n                RendererLinearGradient ren(renBase,gr.m_allocator,span);\r\n                agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if ((fillColor && gr.m_fillGradientFlag == TAGG2D::Radial) ||\r\n               (!fillColor && gr.m_lineGradientFlag == TAGG2D::Radial))\r\n            {\r\n                if (fillColor)\r\n                {\r\n                    typename TAGG2D::RadialGradientSpan span(/*gr.m_allocator, */\r\n                                                   gr.m_fillGradientInterpolator,\r\n                                                   gr.m_radialGradientFunction,\r\n                                                   gr.m_fillGradient,\r\n                                                   gr.m_fillGradientD1,\r\n                                                   gr.m_fillGradientD2);\r\n                    //-RendererRadialGradient ren(renBase, span);\r\n                    RendererRadialGradient ren(renBase,gr.m_allocator,span);\r\n                    agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren);\r\n                }\r\n                else\r\n                {\r\n                    typename TAGG2D::RadialGradientSpan span(/*gr.m_allocator,*/\r\n                                                   gr.m_lineGradientInterpolator,\r\n                                                   gr.m_radialGradientFunction,\r\n                                                   gr.m_lineGradient,\r\n                                                   gr.m_lineGradientD1,\r\n                                                   gr.m_lineGradientD2);\r\n                    //-RendererRadialGradient ren(renBase, span);\r\n                    RendererRadialGradient ren(renBase,gr.m_allocator,span);\r\n                    agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ren);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                renSolid.color(fillColor ? gr.m_fillColor : gr.m_lineColor);\r\n                agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, renSolid);\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n    //--------------------------------------------------------------------\r\n    class SpanConvImageBlend\r\n    {\r\n    public:\r\n        SpanConvImageBlend(Agg2DBase::BlendMode m, Color c) :\r\n            m_mode(m), m_color(c)\r\n        {}\r\n\r\n        void convert(Color* span, int x, int y, unsigned len) const\r\n        {\r\n            unsigned l2;\r\n            typename TAGG2D::Color* s2;\r\n            if(m_mode != TAGG2D::BlendDst)\r\n            {\r\n                l2 = len;\r\n                s2 = span;\r\n                typedef agg::comp_op_adaptor_clip_to_dst_rgba_pre<typename TAGG2D::Color, agg::order_rgba> OpType;\r\n                do\r\n                {\r\n                    OpType::blend_pix(m_mode,\r\n                                      (typename TAGG2D::Color::value_type*)s2,\r\n                                      m_color.r,\r\n                                      m_color.g,\r\n                                      m_color.b,\r\n                                     TAGG2D::Color::base_mask,\r\n                                      agg::cover_full);\r\n                    ++s2;\r\n                }\r\n                while(--l2);\r\n            }\r\n            if(m_color.a < TAGG2D::Color::base_mask)\r\n            {\r\n                l2 = len;\r\n                s2 = span;\r\n                unsigned a = m_color.a;\r\n                do\r\n                {\r\n                    s2->r = (s2->r * a) >> TAGG2D::Color::base_shift;\r\n                    s2->g = (s2->g * a) >> TAGG2D::Color::base_shift;\r\n                    s2->b = (s2->b * a) >> TAGG2D::Color::base_shift;\r\n                    s2->a = (s2->a * a) >> TAGG2D::Color::base_shift;\r\n                    ++s2;\r\n                }\r\n                while(--l2);\r\n            }\r\n        }\r\n\r\n    private:\r\n\t\tAgg2DBase::BlendMode m_mode;\r\n        Color     m_color;\r\n    };\r\n\r\n\r\n\r\n\r\n    //--------------------------------------------------------------------\r\n    template<class BaseRenderer, class SolidRenderer, class Rasterizer, class Scanline>\r\n    void static render(TAGG2D& gr, BaseRenderer& renBase, SolidRenderer& renSolid, Rasterizer& ras, Scanline& sl)\r\n    {\r\n\t\t// JME\r\n\t\ttypedef agg::span_allocator<agg::rgba8> span_allocator_type;\r\n        typedef agg::renderer_scanline_aa<BaseRenderer,span_allocator_type,typename TAGG2D::LinearGradientSpan> RendererLinearGradient;\r\n        typedef agg::renderer_scanline_aa<BaseRenderer,span_allocator_type,typename TAGG2D::RadialGradientSpan> RendererRadialGradient;\r\n\r\n        if(gr.m_fillGradientFlag == TAGG2D::Linear)\r\n        {\r\n            typename TAGG2D::LinearGradientSpan span(\r\n                                           gr.m_fillGradientInterpolator,\r\n                                           gr.m_linearGradientFunction,\r\n                                           gr.m_fillGradient,\r\n                                           gr.m_fillGradientD1,\r\n                                           gr.m_fillGradientD2);\r\n            RendererLinearGradient ren(renBase,gr.m_allocator,span);\r\n            agg::render_scanlines(ras, sl, ren);\r\n        }\r\n        else\r\n        {\r\n            if(gr.m_fillGradientFlag == TAGG2D::Radial)\r\n            {\r\n               typename  TAGG2D::RadialGradientSpan span(\r\n                                               gr.m_fillGradientInterpolator,\r\n                                               gr.m_radialGradientFunction,\r\n                                               gr.m_fillGradient,\r\n                                               gr.m_fillGradientD1,\r\n                                               gr.m_fillGradientD2);\r\n                RendererRadialGradient ren(renBase,gr.m_allocator,span);\r\n                agg::render_scanlines(ras, sl, ren);\r\n            }\r\n            else\r\n            {\r\n                renSolid.color(gr.m_fillColor);\r\n                agg::render_scanlines(ras, sl, renSolid);\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n\r\n    //--------------------------------------------------------------------\r\n    //! JME - this is where the bulk of the changes have taken place.\r\n    template<class BaseRenderer, class Interpolator>\r\n    static void renderImage(TAGG2D& gr, const TIMAGE& img,\r\n                            BaseRenderer& renBase, Interpolator& interpolator)\r\n    {\r\n\t\t//! JME - have not quite figured which part of this is not const-correct\r\n\t\t// hence the cast.\r\n\t\tImage& imgc = const_cast<Image&>(img);\r\n\t\ttypename ImagePixFormatSet::PixFormat img_pixf(imgc.renBuf);\r\n\t\ttypedef agg::image_accessor_clone<typename ImagePixFormatSet::PixFormat> img_source_type;\r\n\t\timg_source_type source(img_pixf);\r\n\r\n        SpanConvImageBlend blend(gr.m_imageBlendMode, gr.m_imageBlendColor);\r\n        if(gr.m_imageFilter == TAGG2D::NoFilter)\r\n        {\r\n\t\t\t//original way\r\n\t\t\ttypedef agg::span_image_filter_rgba_nn<img_source_type,Interpolator> SpanGenType;\r\n\t\t\ttypedef agg::renderer_scanline_aa<BaseRenderer,typename TAGG2D::SpanAllocator,SpanGenType> RendererType;\r\n\t\t\tSpanGenType sg(source,interpolator);\r\n\t\t\tRendererType ri(renBase,gr.m_allocator,sg);\r\n            agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri);\r\n\r\n\t\t\t//our way, using our own span generator to support 555\r\n\t\t\t//but, it isnt working yet\r\n\t\t\t//typedef ImagePixFormatSet::SpanGenerator SpanGenType;\r\n\t\t\t//typedef agg::renderer_scanline_aa<BaseRenderer,typename TAGG2D::SpanAllocator,SpanGenType> RendererType;\r\n\t\t\t//SpanGenType sg(imgc.renBuf);\r\n\t\t\t//RendererType ri(renBase,gr.m_allocator,sg);\r\n\t\t\t//agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri);\r\n        }\r\n        //else\r\n    //    {\r\n    //        bool resample = (gr.m_imageResample == TAGG2D::ResampleAlways);\r\n    //        if(gr.m_imageResample == TAGG2D::ResampleOnZoomOut)\r\n    //        {\r\n    //            double sx, sy;\r\n    //            interpolator.transformer().scaling_abs(&sx, &sy);\r\n    //            if (sx > 1.125 || sy > 1.125)\r\n    //            {\r\n\t\t\t\t//\tresample = true;\r\n    //            }\r\n    //        }\r\n\r\n    //        if(resample)\r\n    //        {\r\n    //            typedef agg::span_image_resample_rgba_affine<img_source_type> SpanGenType;\r\n    //            typedef agg::span_converter<SpanGenType,SpanConvImageBlend> SpanConvType;\r\n    //            typedef agg::renderer_scanline_aa<BaseRenderer,typename TAGG2D::SpanAllocator,SpanGenType> RendererType;\r\n\r\n    //            SpanGenType sg(source,interpolator,gr.m_imageFilterLut);\r\n    //            SpanConvType sc(sg, blend);\r\n    //            RendererType ri(renBase,gr.m_allocator,sg);\r\n    //            agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri);\r\n    //        }\r\n    //        else\r\n    //        {\r\n\t\t\t\t//// this is the AGG2D default\r\n    //            if(gr.m_imageFilter == TAGG2D::Bilinear)\r\n    //            {\r\n    //                typedef agg::span_image_filter_rgba_bilinear<img_source_type,Interpolator> SpanGenType;\r\n    //                typedef agg::span_converter<SpanGenType,SpanConvImageBlend> SpanConvType;\r\n\t\t\t\t//\ttypedef agg::renderer_scanline_aa<BaseRenderer,typename TAGG2D::SpanAllocator,SpanGenType> RendererType;\r\n\r\n\t\t\t\t//\tSpanGenType sg(source,interpolator);\r\n    //                SpanConvType sc(sg, blend);\r\n\t\t\t\t//\tRendererType ri(renBase,gr.m_allocator,sg);\r\n    //                agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri);\r\n    //            }\r\n    //            else\r\n    //            {\r\n    //                if(gr.m_imageFilterLut.diameter() == 2)\r\n    //                {\r\n    //                    typedef agg::span_image_filter_rgba_2x2<img_source_type,Interpolator> SpanGenType;\r\n    //                    typedef agg::span_converter<SpanGenType,SpanConvImageBlend> SpanConvType;\r\n    //                    typedef agg::renderer_scanline_aa<BaseRenderer,typename TAGG2D::SpanAllocator,SpanGenType> RendererType;\r\n\r\n    //                    SpanGenType sg(source,interpolator,gr.m_imageFilterLut);\r\n    //                    SpanConvType sc(sg, blend);\r\n    //                    RendererType ri(renBase,gr.m_allocator,sg);\r\n    //                    agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri);\r\n    //                }\r\n    //                else\r\n    //                {\r\n    //                    typedef agg::span_image_filter_rgba<img_source_type,Interpolator> SpanGenType;\r\n    //                    typedef agg::span_converter<SpanGenType,SpanConvImageBlend> SpanConvType;\r\n\t\t\t\t//\t\ttypedef agg::renderer_scanline_aa<BaseRenderer,typename TAGG2D::SpanAllocator,SpanGenType> RendererType;\r\n    //                    SpanGenType sg(source,interpolator,gr.m_imageFilterLut);\r\n    //                    SpanConvType sc(sg, blend);\r\n\t\t\t\t//\t\tRendererType ri(renBase,gr.m_allocator,sg);\r\n    //                    agg::render_scanlines(gr.m_rasterizer, gr.m_scanline, ri);\r\n    //                }\r\n    //            }\r\n    //        }\r\n    //    }\r\n    }\r\n};\r\n\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::render(bool fillColor)\r\n{\r\n    if(m_blendMode == BlendAlpha)\r\n    {\r\n        TAGG2DRENDERER::render(*this, m_renBase, m_renSolid, fillColor);\r\n    }\r\n    else\r\n    {\r\n        TAGG2DRENDERER::render(*this, m_renBaseComp, m_renSolidComp, fillColor);\r\n    }\r\n}\r\n\r\n#ifdef AGG2D_USE_VECTORFONTS\r\n#if !defined( UNDER_CE )\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::render(FontRasterizer& ras, FontScanline& sl)\r\n{\r\n    if(m_blendMode == BlendAlpha)\r\n    {\r\n        Agg2DRenderer::render(*this, m_renBase, m_renSolid, ras, sl);\r\n    }\r\n    else\r\n    {\r\n        Agg2DRenderer::render(*this, m_renBaseComp, m_renSolidComp, ras, sl);\r\n    }\r\n}\r\n\r\n#endif\r\n#endif \r\n\r\n//------------------------------------------------------------------------\r\nstruct Agg2DRasterizerGamma\r\n{\r\n\r\n    Agg2DRasterizerGamma(double alpha, double gamma) :\r\n        m_alpha(alpha), m_gamma(gamma) {}\r\n\r\n    double operator() (double x) const\r\n    {\r\n        return m_alpha(m_gamma(x));\r\n    }\r\n    agg::gamma_multiply m_alpha;\r\n    agg::gamma_power    m_gamma;\r\n};\r\n\r\n//------------------------------------------------------------------------\r\nAGG2D_TEMPLATE void TAGG2D::updateRasterizerGamma()\r\n{\r\n    m_rasterizer.gamma(Agg2DRasterizerGamma(m_masterAlpha, m_antiAliasGamma));\r\n}\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/aggdraw.cpp",
    "content": "/*\r\nThe MIT License\r\n\r\nCopyright (C) 2009-2010 DeSmuME team\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\n*/\n\n#include <map>\n\n#include \"GPU.h\"\n#include \"NDSSystem.h\"\n\n#include \"aggdraw.h\"\n\n#include \"agg_renderer_base.h\"\n#include \"agg_renderer_primitives.h\"\n#include \"agg_renderer_scanline.h\"\n#include \"agg_bounding_rect.h\"\n#include \"agg_trans_affine.h\"\n#include \"agg_path_storage.h\"\n#include \"agg_color_rgba.h\"\n\n#include \"agg_rasterizer_scanline_aa.h\"\n#include \"agg_scanline_u.h\"\n#include \"agg_renderer_scanline.h\"\n#include \"agg_scanline_p.h\"\n\n//raster text\n#include \"agg_glyph_raster_bin.h\"\n#include \"agg_embedded_raster_fonts.h\"\n#include \"agg_renderer_raster_text.h\"\n\n#include \"ctrl/agg_bezier_ctrl.h\"\n#include \"platform/agg_platform_support.h\"\n#include \"agg_pattern_filters_rgba.h\"\n#include \"agg_renderer_outline_image.h\"\n#include \"agg_rasterizer_outline_aa.h\"\n\n#include \"agg_image_accessors.h\"\n#include \"agg_span_interpolator_linear.h\"\n#include \"agg_span_image_filter_rgb.h\"\r\n#include \"agg_span_image_filter_rgba.h\"\r\n#include \"agg_span_image_filter_gray.h\"\n\n#include \"agg_span_allocator.h\"\n\ntypedef std::map<std::string, const agg::int8u*> TAgg_Font_Table;\r\nstatic TAgg_Font_Table font_table;\r\n\r\nfont_type fonts_list[] =\r\n{\r\n\t{ agg::gse4x6, \"gse4x6\" },\r\n\t{ agg::gse4x8, \"gse4x8\" },\r\n\t{ agg::gse5x7, \"gse5x7\" },\r\n\t{ agg::gse5x9, \"gse5x9\" },\r\n\t{ agg::gse6x9, \"gse6x9\" },\r\n\t{ agg::gse6x12, \"gse6x12\" },\r\n\t{ agg::gse7x11, \"gse7x11\" },\r\n\t{ agg::gse7x11_bold, \"gse7x11_bold\" },\r\n\t{ agg::gse7x15, \"gse7x15\" },\r\n\t{ agg::gse7x15_bold, \"gse7x15_bold\" },\r\n\t{ agg::gse8x16, \"gse8x16\" },\r\n\t{ agg::gse8x16_bold, \"gse8x16_bold\" },\r\n\t{ agg::mcs11_prop, \"mcs11_prop\" },\r\n\t{ agg::mcs11_prop_condensed, \"mcs11_prop_condensed\" },\r\n\t{ agg::mcs12_prop, \"mcs12_prop\" },\r\n\t{ agg::mcs13_prop, \"mcs13_prop\" },\r\n\t{ agg::mcs5x10_mono, \"mcs5x10_mono\" },\r\n\t{ agg::mcs5x11_mono, \"mcs5x11_mono\" },\r\n\t{ agg::mcs6x10_mono, \"mcs6x10_mono\" },\r\n\t{ agg::mcs6x11_mono, \"mcs6x11_mono\" },\r\n\t{ agg::mcs7x12_mono_high, \"mcs7x12_mono_high\" },\r\n\t{ agg::mcs7x12_mono_low, \"mcs7x12_mono_low\" },\r\n\t{ agg::verdana12, \"verdana12\" },\r\n\t{ agg::verdana12_bold, \"verdana12_bold\" },\r\n\t{ agg::verdana13, \"verdana13\" },\r\n\t{ agg::verdana13_bold, \"verdana13_bold\" },\r\n\t{ agg::verdana14, \"verdana14\" },\r\n\t{ agg::verdana14_bold, \"verdana14_bold\" },\r\n\t{ agg::verdana16, \"verdana16\" },\r\n\t{ agg::verdana16_bold, \"verdana16_bold\" },\r\n\t{ agg::verdana17, \"verdana17\" },\r\n\t{ agg::verdana17_bold, \"verdana17_bold\" },\r\n\t{ agg::verdana18, \"verdana18\" },\r\n\t{ agg::verdana18_bold, \"verdana18_bold\" },\r\n};\r\nint font_Nums = ARRAY_SIZE(fonts_list);\r\n\r\nconst agg::int8u* AggDrawTarget::lookupFont(const std::string& name)\r\n{ \r\n\tTAgg_Font_Table::iterator it(font_table.find(name));\r\n\tif(it == font_table.end()) return NULL;\r\n\telse return it->second;\r\n}\r\n\r\nstatic void Agg_init_fonts()\r\n{\r\n\tfor(u32 i=0;i<font_Nums;i++)\r\n\t\tfont_table[fonts_list[i].name] = fonts_list[i].font;\r\n}\n\nAggDraw_Desmume aggDraw;\r\n\r\n#if defined(WIN32)\r\nT_AGG_RGBA agg_targetScreen(0, 256, 384, 1024);\r\n#else\r\nT_AGG_RGB555 agg_targetScreen(0, 256, 384, 1512);\r\n#endif\r\n\r\n//static u32 luaBuffer[256*192*2];\r\nT_AGG_RGBA agg_targetLua((u8*)0, 256, 384, 1024);\r\n\r\n//static u32 hudBuffer[256*192*2];\r\nT_AGG_RGBA agg_targetHud(0, 256, 384, 1024);\r\n\r\nstatic AggDrawTarget* targets[] = {\r\n\t&agg_targetScreen,\r\n\t&agg_targetHud,\r\n\t&agg_targetLua,\r\n};\r\n\r\nvoid Agg_init()\r\n{\r\n\tAgg_init_fonts();\r\n\taggDraw.screen = targets[0];\r\n\taggDraw.hud = targets[1];\r\n\taggDraw.lua = targets[2];\r\n\r\n\taggDraw.target = targets[0];\r\n\r\n\t//if we're single core, we don't want to waste time compositing\r\n\tif(CommonSettings.single_core())\r\n\t\taggDraw.hud = &agg_targetScreen;\r\n\r\n\taggDraw.hud = &agg_targetScreen;\r\n\r\n\taggDraw.hud->setFont(\"verdana18_bold\");\r\n}\r\n\r\nvoid AggDraw_Desmume::setTarget(AggTarget newTarget)\r\n{\r\n\ttarget = targets[newTarget];\r\n}\r\n\r\n\r\n\r\n////temporary, just for testing the lib\r\n//void AGGDraw() {\r\n////\r\n//\taggDraw.setTarget(AggTarget_Screen);\r\n//\r\n////\taggDraw.target->clear();\r\n////\r\n////\taggDraw.target->clipBox(0,0,255,383);\r\n////\r\n//\taggDraw.target->lineColor(0, 0, 255, 128);\r\n//\taggDraw.target->fillColor(0, 0, 255, 128);\r\n////\t//aggDraw.target->noFill();\r\n//\taggDraw.target->lineWidth(1.0);\r\n//\taggDraw.target->roundedRect(10,30,256-10,192-10,4);\r\n////\r\n////\taggDraw.target->setFont(\"verdana18_bold\");\r\n////\taggDraw.target->renderText(60,60, \"testing testing testing\");\r\n////\r\n////        // Gradients (Aqua Buttons)\r\n////        //=======================================\r\n//////        m_graphics.font(\"Verdana\", 20.0, false, false, TAGG2D::VectorFontCache);\r\n////        double xb1 = 10;\r\n////        double yb1 = 80;\r\n////        double xb2 = xb1 + 150;\r\n////        double yb2 = yb1 + 36;\r\n////\r\n////        aggDraw.target->fillColor(0,50,180,180);\r\n////        aggDraw.target->lineColor(0,0,80, 255);\r\n////        aggDraw.target->lineWidth(1.0);\r\n////        aggDraw.target->roundedRect(xb1, yb1, xb2, yb2, 12, 18);\r\n////\r\n////        aggDraw.target->lineColor(0,0,0,0);\r\n////        aggDraw.target->fillLinearGradient(xb1, yb1, xb1, yb1+30, \r\n////                                      agg::rgba8(100,200,255,255), \r\n////                                      agg::rgba8(255,255,255,0));\r\n////        aggDraw.target->roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1);\r\n////\r\n////\t\taggDraw.target->fillColor(0,0,50, 200);\r\n////        aggDraw.target->noLine();\r\n/////*        m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter);\r\n////        m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, \"Aqua Button\", true, 0.0, 0.0);\r\n////*/\r\n////        aggDraw.target->fillLinearGradient(xb1, yb2-20, xb1, yb2-3, \r\n////                                      agg::rgba8(0,  0,  255,0),\r\n////                                      agg::rgba8(100,255,255,255)); \r\n////        aggDraw.target->roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18);\r\n////\r\n////        // Basic Shapes -- Ellipse\r\n////        //===========================================\r\n////        aggDraw.target->lineWidth(3.5);\r\n////        aggDraw.target->lineColor(20,  80,  80);\r\n////        aggDraw.target->fillColor(200, 255, 80, 200);\r\n////        aggDraw.target->ellipse(150, 200, 50, 90);\r\n////\r\n////        // Paths\r\n////        //===========================================\r\n////        aggDraw.target->resetPath();\r\n////        aggDraw.target->fillColor(255, 0, 0, 100);\r\n////        aggDraw.target->lineColor(0, 0, 255, 100);\r\n////        aggDraw.target->lineWidth(2);\r\n////        aggDraw.target->moveTo(300/2, 200/2);\r\n////        aggDraw.target->horLineRel(-150/2);\r\n////        aggDraw.target->arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2);\r\n////        aggDraw.target->closePolygon();\r\n////        aggDraw.target->drawPath();\r\n////\r\n////        aggDraw.target->resetPath();\r\n////        aggDraw.target->fillColor(255, 255, 0, 100);\r\n////        aggDraw.target->lineColor(0, 0, 255, 100);\r\n////        aggDraw.target->lineWidth(2);\r\n////        aggDraw.target->moveTo(275/2, 175/2);\r\n////        aggDraw.target->verLineRel(-150/2);\r\n////        aggDraw.target->arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2);\r\n////        aggDraw.target->closePolygon();\r\n////        aggDraw.target->drawPath();\r\n////\r\n////        aggDraw.target->resetPath();\r\n////        aggDraw.target->noFill();\r\n////        aggDraw.target->lineColor(127, 0, 0);\r\n////        aggDraw.target->lineWidth(5);\r\n////        aggDraw.target->moveTo(600/2, 350/2);\r\n////        aggDraw.target->lineRel(50/2, -25/2);\r\n////        aggDraw.target->arcRel(25/2, 25/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n////        aggDraw.target->lineRel(50/2, -25/2);\r\n////        aggDraw.target->arcRel(25/2, 50/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n////        aggDraw.target->lineRel(50/2, -25/2);\r\n////        aggDraw.target->arcRel(25/2, 75/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n////        aggDraw.target->lineRel(50, -25);\r\n////        aggDraw.target->arcRel(25/2, 100/2, aggDraw.target->deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n////        aggDraw.target->lineRel(50/2, -25/2);\r\n////        aggDraw.target->drawPath();\r\n//}\r\n////\r\n\r\n\r\n//\r\n////========================\r\n////testing stufff\r\n//\r\n//int width = 256;\r\n//int height = 384;\r\n//\r\n//Agg2D m_graphics;\r\n//\r\n//void AGGDraw(unsigned char * buffer)\r\n//    {\r\n//        m_graphics.attach(buffer, \r\n//                          256, \r\n//                          384,\r\n//                          512);\r\n//\r\n//        m_graphics.clearAll(255, 255, 255);\r\n//        //m_graphics.clearAll(0, 0, 0);\r\n//\r\n//        //m_graphics.blendMode(TAGG2D::BlendSub);\r\n//        //m_graphics.blendMode(TAGG2D::BlendAdd);\r\n//\r\n//        m_graphics.antiAliasGamma(1.4);\r\n//\r\n//        // Set flipText(true) if you have the Y axis upside down.\r\n//        //m_graphics.flipText(true);\r\n//\r\n//\r\n//        // ClipBox.\r\n//        //m_graphics.clipBox(50, 50, rbuf_window().width() - 50, rbuf_window().height() - 50);\r\n//\r\n//        // Transfornations - Rotate around (300,300) to 5 degree\r\n//        //m_graphics.translate(-300, -300);\r\n//        //m_graphics.rotate(TAGG2D::deg2Rad(5.0));\r\n//        //m_graphics.translate(300, 300);\r\n//\r\n//        // Viewport - set 0,0,600,600 to the actual window size \r\n//        // preserving aspect ratio and placing the viewport in the center.\r\n//        // To ignore aspect ratio use TAGG2D::Anisotropic\r\n//        // Note that the viewport just adds transformations to the current\r\n//        // affine matrix. So that, set the viewport *after* all transformations!\r\n//        m_graphics.viewport(0, 0, 600, 600, \r\n//                            0, 0, width, height, \r\n//                            //TAGG2D::Anisotropic);\r\n//                            TAGG2D::XMidYMid);\r\n//\r\n//\r\n//        // Rounded Rect\r\n//        m_graphics.lineColor(0, 0, 0);\r\n//        m_graphics.noFill();\r\n//        m_graphics.roundedRect(0.5, 0.5, 600-0.5, 600-0.5, 20.0);\r\n///*\r\n//\r\n//        // Reglar Text\r\n//        m_graphics.font(\"Times New Roman\", 14.0, false, false);\r\n//        m_graphics.fillColor(0, 0, 0);\r\n//        m_graphics.noLine();\r\n//        m_graphics.text(100, 20, \"Regular Raster Text -- Fast, but can't be rotated\");\r\n//\r\n//        // Outlined Text\r\n//        m_graphics.font(\"Times New Roman\", 50.0, false, false, TAGG2D::VectorFontCache);\r\n//        m_graphics.lineColor(50, 0, 0);\r\n//        m_graphics.fillColor(180, 200, 100);\r\n//        m_graphics.lineWidth(1.0);\r\n//        m_graphics.text(100.5, 50.5, \"Outlined Text\");\r\n//\r\n//        // Text Alignment\r\n//        m_graphics.line(250.5-150, 150.5,    250.5+150, 150.5);\r\n//        m_graphics.line(250.5,     150.5-20, 250.5,     150.5+20);\r\n//        m_graphics.line(250.5-150, 200.5,    250.5+150, 200.5);\r\n//        m_graphics.line(250.5,     200.5-20, 250.5,     200.5+20);\r\n//        m_graphics.line(250.5-150, 250.5,    250.5+150, 250.5);\r\n//        m_graphics.line(250.5,     250.5-20, 250.5,     250.5+20);\r\n//        m_graphics.line(250.5-150, 300.5,    250.5+150, 300.5);\r\n//        m_graphics.line(250.5,     300.5-20, 250.5,     300.5+20);\r\n//        m_graphics.line(250.5-150, 350.5,    250.5+150, 350.5);\r\n//        m_graphics.line(250.5,     350.5-20, 250.5,     350.5+20);\r\n//        m_graphics.line(250.5-150, 400.5,    250.5+150, 400.5);\r\n//        m_graphics.line(250.5,     400.5-20, 250.5,     400.5+20);\r\n//        m_graphics.line(250.5-150, 450.5,    250.5+150, 450.5);\r\n//        m_graphics.line(250.5,     450.5-20, 250.5,     450.5+20);\r\n//        m_graphics.line(250.5-150, 500.5,    250.5+150, 500.5);\r\n//        m_graphics.line(250.5,     500.5-20, 250.5,     500.5+20);\r\n//        m_graphics.line(250.5-150, 550.5,    250.5+150, 550.5);\r\n//        m_graphics.line(250.5,     550.5-20, 250.5,     550.5+20);\r\n//*/\r\n///*\r\n//        m_graphics.fillColor(100, 50, 50);\r\n//        m_graphics.noLine();\r\n//        //m_graphics.textHints(false);\r\n//        m_graphics.font(\"Times New Roman\", 40.0, false, false, TAGG2D::VectorFontCache);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignBottom);\r\n//        m_graphics.text(250.0,     150.0, \"Left-Bottom\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignBottom);\r\n//        m_graphics.text(250.0,     200.0, \"Center-Bottom\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignBottom);\r\n//        m_graphics.text(250.0,     250.0, \"Right-Bottom\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignCenter);\r\n//        m_graphics.text(250.0,     300.0, \"Left-Center\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter);\r\n//        m_graphics.text(250.0,     350.0, \"Center-Center\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignCenter);\r\n//        m_graphics.text(250.0,     400.0, \"Right-Center\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignTop);\r\n//        m_graphics.text(250.0,     450.0, \"Left-Top\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignTop);\r\n//        m_graphics.text(250.0,     500.0, \"Center-Top\", true, 0, 0);\r\n//\r\n//        m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignTop);\r\n//        m_graphics.text(250.0,     550.0, \"Right-Top\", true, 0, 0);\r\n//\r\n//*/\r\n//        // Gradients (Aqua Buttons)\r\n//        //=======================================\r\n//        m_graphics.font(\"Verdana\", 20.0, false, false, TAGG2D::VectorFontCache);\r\n//        double xb1 = 400;\r\n//        double yb1 = 80;\r\n//        double xb2 = xb1 + 150;\r\n//        double yb2 = yb1 + 36;\r\n//\r\n//        m_graphics.fillColor(TAGG2D::Color(0,50,180,180));\r\n//        m_graphics.lineColor(TAGG2D::Color(0,0,80, 255));\r\n//        m_graphics.lineWidth(1.0);\r\n//        m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18);\r\n//\r\n//        m_graphics.lineColor(TAGG2D::Color(0,0,0,0));\r\n//        m_graphics.fillLinearGradient(xb1, yb1, xb1, yb1+30, \r\n//                                      TAGG2D::Color(100,200,255,255), \r\n//                                      TAGG2D::Color(255,255,255,0));\r\n//        m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1);\r\n//\r\n//        m_graphics.fillColor(TAGG2D::Color(0,0,50, 200));\r\n//        m_graphics.noLine();\r\n///*        m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter);\r\n//        m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, \"Aqua Button\", true, 0.0, 0.0);\r\n//*/\r\n//        m_graphics.fillLinearGradient(xb1, yb2-20, xb1, yb2-3, \r\n//                                      TAGG2D::Color(0,  0,  255,0),\r\n//                                      TAGG2D::Color(100,255,255,255)); \r\n//        m_graphics.roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18);\r\n//\r\n//\r\n//        // Aqua Button Pressed\r\n//        xb1 = 400;\r\n//        yb1 = 30;\r\n//        xb2 = xb1 + 150;\r\n//        yb2 = yb1 + 36;\r\n//\r\n//        m_graphics.fillColor(TAGG2D::Color(0,50,180,180));\r\n//        m_graphics.lineColor(TAGG2D::Color(0,0,0,  255));\r\n//        m_graphics.lineWidth(2.0);\r\n//        m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18);\r\n//\r\n//        m_graphics.lineColor(TAGG2D::Color(0,0,0,0));\r\n//        m_graphics.fillLinearGradient(xb1, yb1+2, xb1, yb1+25, \r\n//                                      TAGG2D::Color(60, 160,255,255), \r\n//                                      TAGG2D::Color(100,255,255,0));\r\n//        m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1);\r\n//\r\n//        m_graphics.fillColor(TAGG2D::Color(0,0,50, 255));\r\n//        m_graphics.noLine();\r\n///*        m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter);\r\n//        m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, \"Aqua Pressed\", 0.0, 0.0);\r\n//*/\r\n//        m_graphics.fillLinearGradient(xb1, yb2-25, xb1, yb2-5, \r\n//                                      TAGG2D::Color(0,  180,255,0),\r\n//                                      TAGG2D::Color(0,  200,255,255)); \r\n//        m_graphics.roundedRect(xb1+3, yb2-25, xb2-3, yb2-2, 1, 1, 9, 18);\r\n//\r\n//\r\n//\r\n//\r\n//        // Basic Shapes -- Ellipse\r\n//        //===========================================\r\n//        m_graphics.lineWidth(3.5);\r\n//        m_graphics.lineColor(20,  80,  80);\r\n//        m_graphics.fillColor(200, 255, 80, 200);\r\n//        m_graphics.ellipse(450, 200, 50, 90);\r\n//\r\n//\r\n//        // Paths\r\n//        //===========================================\r\n//        m_graphics.resetPath();\r\n//        m_graphics.fillColor(255, 0, 0, 100);\r\n//        m_graphics.lineColor(0, 0, 255, 100);\r\n//        m_graphics.lineWidth(2);\r\n//        m_graphics.moveTo(300/2, 200/2);\r\n//        m_graphics.horLineRel(-150/2);\r\n//        m_graphics.arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2);\r\n//        m_graphics.closePolygon();\r\n//        m_graphics.drawPath();\r\n//\r\n//        m_graphics.resetPath();\r\n//        m_graphics.fillColor(255, 255, 0, 100);\r\n//        m_graphics.lineColor(0, 0, 255, 100);\r\n//        m_graphics.lineWidth(2);\r\n//        m_graphics.moveTo(275/2, 175/2);\r\n//        m_graphics.verLineRel(-150/2);\r\n//        m_graphics.arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2);\r\n//        m_graphics.closePolygon();\r\n//        m_graphics.drawPath();\r\n//\r\n//\r\n//        m_graphics.resetPath();\r\n//        m_graphics.noFill();\r\n//        m_graphics.lineColor(127, 0, 0);\r\n//        m_graphics.lineWidth(5);\r\n//        m_graphics.moveTo(600/2, 350/2);\r\n//        m_graphics.lineRel(50/2, -25/2);\r\n//        m_graphics.arcRel(25/2, 25/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n//        m_graphics.lineRel(50/2, -25/2);\r\n//        m_graphics.arcRel(25/2, 50/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n//        m_graphics.lineRel(50/2, -25/2);\r\n//        m_graphics.arcRel(25/2, 75/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n//        m_graphics.lineRel(50, -25);\r\n//        m_graphics.arcRel(25/2, 100/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2);\r\n//        m_graphics.lineRel(50/2, -25/2);\r\n//        m_graphics.drawPath();\r\n//\r\n//\r\n//        // Master Alpha. From now on everything will be translucent\r\n//        //===========================================\r\n//        m_graphics.masterAlpha(0.85);\r\n//\r\n//\r\n//        // Image Transformations\r\n//        //===========================================\r\n///*        TAGG2D::Image img(rbuf_img(0).buf(), \r\n//                         rbuf_img(0).width(), \r\n//                         rbuf_img(0).height(), \r\n//                         rbuf_img(0).stride());\r\n//        m_graphics.imageFilter(TAGG2D::Bilinear);\r\n//\r\n//        //m_graphics.imageResample(TAGG2D::NoResample);\r\n//        //m_graphics.imageResample(TAGG2D::ResampleAlways);\r\n//        m_graphics.imageResample(TAGG2D::ResampleOnZoomOut);\r\n//\r\n//        // Set the initial image blending operation as BlendDst, that actually \r\n//        // does nothing. \r\n//        //-----------------\r\n//        m_graphics.imageBlendMode(TAGG2D::BlendDst);\r\n//\r\n//\r\n//        // Transform the whole image to the destination rectangle\r\n//        //-----------------\r\n//        //m_graphics.transformImage(img, 450, 200, 595, 350);\r\n//\r\n//        // Transform the rectangular part of the image to the destination rectangle\r\n//        //-----------------\r\n//        //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60,\r\n//        //                          450, 200, 595, 350);\r\n//\r\n//        // Transform the whole image to the destination parallelogram\r\n//        //-----------------\r\n//        //double parl[6] = { 450, 200, 595, 220, 575, 350 };\r\n//        //m_graphics.transformImage(img, parl);\r\n//\r\n//        // Transform the rectangular part of the image to the destination parallelogram\r\n//        //-----------------\r\n//        //double parl[6] = { 450, 200, 595, 220, 575, 350 };\r\n//        //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, parl);\r\n//\r\n//        // Transform image to the destination path. The scale is determined by a rectangle\r\n//        //-----------------\r\n//        //m_graphics.resetPath();\r\n//        //m_graphics.moveTo(450, 200);\r\n//        //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350);\r\n//        //m_graphics.lineTo(470, 340);\r\n//        //m_graphics.transformImagePath(img, 450, 200, 595, 350);\r\n//\r\n//\r\n//        // Transform image to the destination path.\r\n//        // The scale is determined by a rectangle\r\n//        //-----------------\r\n//        m_graphics.resetPath();\r\n//        m_graphics.moveTo(450, 200);\r\n//        m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350);\r\n//        m_graphics.lineTo(470, 340);\r\n//        m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60,\r\n//                                      450, 200, 595, 350);\r\n//\r\n//        // Transform image to the destination path. \r\n//        // The transformation is determined by a parallelogram\r\n//        //m_graphics.resetPath();\r\n//        //m_graphics.moveTo(450, 200);\r\n//        //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350);\r\n//        //m_graphics.lineTo(470, 340);\r\n//        //double parl[6] = { 450, 200, 595, 220, 575, 350 };\r\n//        //m_graphics.transformImagePath(img, parl);\r\n//\r\n//        // Transform the rectangular part of the image to the destination path. \r\n//        // The transformation is determined by a parallelogram\r\n//        //m_graphics.resetPath();\r\n//        //m_graphics.moveTo(450, 200);\r\n//        //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350);\r\n//        //m_graphics.lineTo(470, 340);\r\n//        //double parl[6] = { 450, 200, 595, 220, 575, 350 };\r\n//        //m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, parl);\r\n//*/\r\n//\r\n//        // Add/Sub/Contrast Blending Modes\r\n//        m_graphics.noLine();\r\n//        m_graphics.fillColor(70, 70, 0);\r\n//        m_graphics.blendMode(TAGG2D::BlendAdd);\r\n//        m_graphics.ellipse(500, 280, 20, 40);\r\n//\r\n//        m_graphics.fillColor(255, 255, 255);\r\n//        m_graphics.blendMode(TAGG2D::BlendContrast);\r\n//        m_graphics.ellipse(500+40, 280, 20, 40);\r\n//\r\n//\r\n//\r\n//        // Radial gradient.\r\n//        m_graphics.blendMode(TAGG2D::BlendAlpha);\r\n//        m_graphics.fillRadialGradient(400, 500, 40, \r\n//                                      TAGG2D::Color(255, 255, 0, 0),\r\n//                                      TAGG2D::Color(0, 0, 127),\r\n//                                      TAGG2D::Color(0, 255, 0, 0));\r\n//        m_graphics.ellipse(400, 500, 40, 40);\r\n//\r\n//    }\r\n//\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/aggdraw.h",
    "content": "/*\r\nThe MIT License\r\n\r\nCopyright (C) 2009-2010 DeSmuME team\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\n*/\r\n\r\n\r\n//This file contains code designed to be used by hud and lua systems in any emulator\r\n\r\n\r\n#ifndef _AGGDRAW_H_\r\n#define _AGGDRAW_H_\r\n\r\n#include \"agg_color_rgba.h\"\r\n#include \"agg_rendering_buffer.h\"\r\n\r\n#include \"agg_renderer_base.h\"\r\n#include \"agg_renderer_primitives.h\"\r\n#include \"agg_renderer_scanline.h\"\r\n#include \"agg_bounding_rect.h\"\r\n\r\n#include \"agg_renderer_mclip.h\"\r\n#include \"agg_renderer_outline_aa.h\"\r\n#include \"agg_renderer_markers.h\"\r\n\r\n#include \"agg_pixfmt_rgb.h\"\r\n#include \"agg_pixfmt_rgba.h\"\r\n#include \"agg_pixfmt_rgb_packed.h\"\n\r\n#include \"agg2d.h\"\r\n\r\ntypedef agg::rgba8 AggColor;\r\n\r\nnamespace agg\n{\n\t//NOTE - these blenders are necessary to change the rgb order from the defaults, which are incorrect for us\n\n\t//this custom blender does more correct blending math than the default\n\t//which is necessary or else drawing transparent pixels on (31,31,31) will yield (30,30,30)\n    struct my_blender_rgb555_pre\r\n    {\r\n        typedef rgba8 color_type;\r\n        typedef color_type::value_type value_type;\r\n        typedef color_type::calc_type calc_type;\r\n        typedef int16u pixel_type;\r\n\r\n        static AGG_INLINE void blend_pix(pixel_type* p, \r\n                                         unsigned cr, unsigned cg, unsigned cb,\r\n                                         unsigned alpha, \r\n                                         unsigned cover)\r\n        {\r\n\t\t\t//not sure whether this is right...\r\n            alpha = color_type::base_mask - alpha;\r\n            pixel_type rgb = *p;\r\n            calc_type b = (rgb >> 10) & 31;\r\n            calc_type g = (rgb >> 5) & 31;\r\n            calc_type r = (rgb ) & 31;\r\n\t\t\tb = ((b+1)*(alpha+1) + (cb)*(cover)-1)>>8;\r\n\t\t\tg = ((g+1)*(alpha+1) + (cg)*(cover)-1)>>8;\r\n\t\t\tr = ((r+1)*(alpha+1) + (cr)*(cover)-1)>>8;\r\n\t\t\t*p = (b<<10)|(g<<5)|r;\r\n        }\r\n\r\n        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)\r\n        {\r\n            return (pixel_type)(((b & 0xF8) << 7) | \r\n                                ((g & 0xF8) << 2) | \r\n                                 (r >> 3) | 0x8000);\r\n        }\r\n\r\n        static AGG_INLINE color_type make_color(pixel_type p)\r\n        {\r\n            return color_type((p << 3) & 0xF8,\r\n                              (p >> 2) & 0xF8, \r\n                              (p >> 7) & 0xF8);\r\n        }\r\n    };\r\n\r\n\t struct my_blender_rgb555\r\n    {\r\n        typedef rgba8 color_type;\r\n        typedef color_type::value_type value_type;\r\n        typedef color_type::calc_type calc_type;\r\n        typedef int16u pixel_type;\r\n\r\n        static AGG_INLINE void blend_pix(pixel_type* p, \r\n                                         unsigned cr, unsigned cg, unsigned cb,\r\n                                         unsigned alpha, \r\n                                         unsigned)\r\n        {\r\n            pixel_type rgb = *p;\r\n            calc_type b = (rgb >> 7) & 0xF8;\r\n            calc_type g = (rgb >> 2) & 0xF8;\r\n            calc_type r = (rgb << 3) & 0xF8;\r\n            *p = (pixel_type)\r\n               (((((cb - b) * alpha + (b << 8)) >> 1)  & 0x7C00) |\r\n                ((((cg - g) * alpha + (g << 8)) >> 6)  & 0x03E0) |\r\n                 (((cr - r) * alpha + (r << 8)) >> 11) | 0x8000);\r\n        }\r\n\r\n        static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b)\r\n        {\r\n            return (pixel_type)(((b & 0xF8) << 7) | \r\n                                ((g & 0xF8) << 2) | \r\n                                 (r >> 3) | 0x8000);\r\n        }\r\n\r\n        static AGG_INLINE color_type make_color(pixel_type p)\r\n        {\r\n            return color_type((p << 3) & 0xF8,\r\n                              (p >> 2) & 0xF8, \r\n                              (p >> 7) & 0xF8);\r\n\t\t\t\r\n        }\r\n    };\r\n\r\n\t //this is a prototype span generator which should be able to generate 8888 and 555 spans\r\n\t //it would be used in agg2d.inl renderImage()\r\n\t //but it isn't being used yet.\r\n\t //this will need to be completed before we can use 555 as a source imge\r\n    template<class Order> class span_simple_blur_rgb24\r\n    {\r\n    public:\r\n        //--------------------------------------------------------------------\r\n        typedef rgba8 color_type;\r\n        \r\n        //--------------------------------------------------------------------\r\n        span_simple_blur_rgb24() : m_source_image(0) {}\r\n\r\n        //--------------------------------------------------------------------\r\n        span_simple_blur_rgb24(const rendering_buffer& src) : \r\n            m_source_image(&src) {}\r\n\r\n        //--------------------------------------------------------------------\r\n        void source_image(const rendering_buffer& src) { m_source_image = &src; }\r\n        const rendering_buffer& source_image() const { return *m_source_image; }\r\n\r\n        //--------------------------------------------------------------------\r\n        void prepare() {}\r\n\r\n        //--------------------------------------------------------------------\r\n        void generate(color_type* span, int x, int y, int len)\r\n        {\r\n            if(y < 1 || y >= int(m_source_image->height() - 1))\r\n            {\r\n                do\r\n                {\r\n                    *span++ = rgba8(0,0,0,0);\r\n                }\r\n                while(--len);\r\n                return;\r\n            }\r\n\r\n            do\r\n            {\r\n                int color[4];\r\n                color[0] = color[1] = color[2] = color[3] = 0;\r\n                if(x > 0 && x < int(m_source_image->width()-1))\r\n                {\r\n                    int i = 3;\r\n                    do\r\n                    {\r\n                        const int8u* ptr = m_source_image->row_ptr(y - i + 2) + (x - 1) * 3;\r\n\r\n                        color[0] += *ptr++;\r\n                        color[1] += *ptr++;\r\n                        color[2] += *ptr++;\r\n                        color[3] += 255;\r\n\r\n                        color[0] += *ptr++;\r\n                        color[1] += *ptr++;\r\n                        color[2] += *ptr++;\r\n                        color[3] += 255;\r\n\r\n                        color[0] += *ptr++;\r\n                        color[1] += *ptr++;\r\n                        color[2] += *ptr++;\r\n                        color[3] += 255;\r\n                    }\r\n                    while(--i);\r\n                    color[0] /= 9;\r\n                    color[1] /= 9;\r\n                    color[2] /= 9;\r\n                    color[3] /= 9;\r\n                }\r\n                *span++ = rgba8(color[Order::R], color[Order::G], color[Order::B], color[3]);\r\n                ++x;\r\n            }\r\n            while(--len);\r\n        }\r\n\r\n    private:\r\n        const rendering_buffer* m_source_image;\r\n    };\r\n\r\n\ttypedef pixfmt_alpha_blend_rgb_packed<my_blender_rgb555_pre, rendering_buffer> my_pixfmt_rgb555_pre; //----pixfmt_rgb555_pre\r\n\r\n\ttypedef pixfmt_alpha_blend_rgb_packed<my_blender_rgb555, rendering_buffer> my_pixfmt_rgb555; //----pixfmt_rgb555_pre\r\n}\r\n\r\n\r\n\r\ntypedef PixFormatSetDeclaration<agg::my_pixfmt_rgb555,agg::my_pixfmt_rgb555_pre,agg::span_simple_blur_rgb24<agg::order_rgba> > T_AGG_PF_RGB555;\r\ntypedef PixFormatSetDeclaration<agg::pixfmt_bgra32,agg::pixfmt_bgra32_pre,agg::span_simple_blur_rgb24<agg::order_rgba> > T_AGG_PF_RGBA;\r\nclass AggDrawTarget\r\n{\r\npublic:\r\n\tAggDrawTarget()\r\n\t\t: empty(true)\r\n\t{\r\n\t}\r\n\r\nprotected:\r\n\tvoid dirty() { empty = false; }\r\n\tvoid undirty() { empty = true; }\r\n\r\npublic:\r\n\r\n\tbool empty;\r\n\r\n\tvirtual void clear() = 0;\r\n\r\n\tvirtual agg::rendering_buffer & buf() = 0;\r\n\r\n\t//returns an image for this target. you must provide the pixel type, but if it is wrong,\r\n\t//then you have just created trouble for yourself\r\n\tAGG2D_IMAGE_TEMPLATE TIMAGE image() { return TIMAGE(buf()); }\r\n\r\n    // Setup\r\n\tvirtual void  attach(unsigned char* buf, unsigned width, unsigned height, int stride) = 0;\r\n//\tvirtual void  attach(Agg2DBase::Image& img) {attach(img);};\r\n\r\n    virtual void  clipBox(double x1, double y1, double x2, double y2) = 0;\r\n\tvirtual Agg2DBase::RectD clipBox() const = 0;\r\n\r\n\tvirtual void  clearAll(AggColor c) = 0;\r\n\tvirtual void  clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0;\r\n\r\n\tvirtual void  clearClipBox(AggColor c) = 0;\r\n\tvirtual void  clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0;\r\n\r\n//\tvirtual unsigned width()  const { return Agg2DBase::m_rbuf.width();  }\r\n//  virtual unsigned height() const { return Agg2DBase::m_rbuf.height(); }\r\n\r\n    // Conversions\r\n\tvirtual void   worldToScreen(double& x, double& y) const = 0;\r\n\tvirtual void   screenToWorld(double& x, double& y) const = 0;\r\n\tvirtual double worldToScreen(double scalar) const = 0;\r\n\tvirtual double screenToWorld(double scalar) const = 0;\r\n\tvirtual void   alignPoint(double& x, double& y) const = 0;\r\n\tvirtual bool   inBox(double worldX, double worldY) const = 0;\r\n\t\r\n    // General Attributes\r\n\tvirtual void blendMode(Agg2DBase::BlendMode m) = 0;\r\n\tvirtual Agg2DBase::BlendMode blendMode() = 0;\r\n\r\n    virtual void imageBlendMode(Agg2DBase::BlendMode m) = 0;\r\n    virtual Agg2DBase::BlendMode imageBlendMode() = 0;\r\n\r\n\tvirtual void imageBlendColor(AggColor c) = 0;\r\n    virtual void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0;\r\n    virtual AggColor imageBlendColor() = 0;\r\n\r\n    virtual void masterAlpha(double a) = 0;\r\n    virtual double masterAlpha() = 0;\r\n\r\n    virtual void antiAliasGamma(double g) = 0;\r\n    virtual double antiAliasGamma() = 0;\r\n\r\n//\tvirtual void font(const agg::int8u* font) { m_font = font; }\r\n//\tconst agg::int8u* font() { return m_font; }\r\n\r\n    virtual void fillColor(AggColor c) = 0;\r\n    virtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0;\r\n    virtual void noFill() = 0;\r\n\r\n    virtual void lineColor(AggColor c) = 0;\r\n    virtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) = 0;\r\n    virtual void noLine() = 0;\r\n\r\n\tvirtual void transformImage(const Agg2DBase::Image<T_AGG_PF_RGBA> &img, double dstX1, double dstY1, double dstX2, double dstY2) = 0;\r\n\t//virtual void transformImage(const Agg2DBase::Image<T_AGG_PF_RGB555> &img, double dstX1, double dstY1, double dstX2, double dstY2) = 0;\r\n\r\n    virtual AggColor fillColor() = 0;\r\n    virtual AggColor lineColor() = 0;\r\n\r\n    virtual void fillLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) = 0;\r\n    virtual void lineLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) = 0;\r\n\r\n    virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) = 0;\r\n    virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) = 0;\r\n\r\n    virtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) = 0;\r\n    virtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) = 0;\r\n\r\n    virtual void fillRadialGradient(double x, double y, double r) = 0;\r\n    virtual void lineRadialGradient(double x, double y, double r) = 0;\r\n\r\n    virtual void lineWidth(double w) = 0;\r\n    virtual double lineWidth() = 0;\r\n\r\n\tvirtual void lineCap(Agg2DBase::LineCap cap) = 0;\r\n    virtual Agg2DBase::LineCap lineCap() = 0;\r\n\r\n    virtual void lineJoin(Agg2DBase::LineJoin join) = 0;\r\n    virtual Agg2DBase::LineJoin lineJoin() = 0;\r\n\r\n    virtual void fillEvenOdd(bool evenOddFlag) = 0;\r\n    virtual bool fillEvenOdd() = 0;\r\n\r\n    // Transformations\r\n    virtual Agg2DBase::Transformations transformations() = 0;\r\n    virtual void transformations(const Agg2DBase::Transformations& tr) = 0;\r\n\r\n    virtual const Agg2DBase::Affine& affine() = 0;\r\n//    virtual void affine(const Agg2DBase::Affine&) = 0;\r\n\r\n    virtual void resetTransformations() = 0;\r\n    virtual void matrix(const Agg2DBase::Affine& tr) = 0;\r\n    virtual void matrix(const Agg2DBase::Transformations& tr) = 0;\r\n    virtual void rotate(double angle) = 0;\r\n    virtual void rotate(double angle, double cx, double cy) = 0;\r\n    virtual void scale(double s) = 0;\r\n    virtual void scale(double sx, double sy) = 0;\r\n    virtual void skew(double sx, double sy) = 0;\r\n    virtual void translate(double x, double y) = 0;\r\n    virtual void parallelogram(double x1, double y1, double x2, double y2, const double* para) = 0;\r\n    virtual void viewport(double worldX1,  double worldY1,  double worldX2,  double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, Agg2DBase::ViewportOption opt=Agg2DBase::XMidYMid, Agg2DBase::WindowFitLogic fl = Agg2DBase::WindowFitLogic_meet) = 0;\r\n\r\n    // Basic Shapes\r\n    virtual void line(double x1, double y1, double x2, double y2) = 0;\r\n    virtual void triangle(double x1, double y1, double x2, double y2, double x3, double y3) = 0;\r\n    virtual void rectangle(double x1, double y1, double x2, double y2) = 0;\r\n    virtual void roundedRect(double x1, double y1, double x2, double y2, double r) = 0;\r\n    virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) = 0;\r\n    virtual void roundedRect(double x1, double y1, double x2, double y2, double rxBottom, double ryBottom, double rxTop,    double ryTop) = 0;\r\n    virtual void ellipse(double cx, double cy, double rx, double ry) = 0;\r\n    virtual void arc(double cx, double cy, double rx, double ry, double start, double sweep) = 0;\r\n    virtual void star(double cx, double cy, double r1, double r2, double startAngle, int numRays) = 0;\r\n    virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3) = 0;\r\n    virtual void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) = 0;\r\n    virtual void polygon(double* xy, int numPoints) = 0;\r\n    virtual void polyline(double* xy, int numPoints) = 0;\r\n\r\n\t// Path commands\r\n    virtual void resetPath() = 0;\r\n\r\n    virtual void moveTo(double x, double y)= 0;\r\n    virtual void moveRel(double dx, double dy) = 0;\r\n\r\n    virtual void lineTo(double x, double y) = 0;\r\n    virtual void lineRel(double dx, double dy) = 0;\r\n\r\n    virtual void horLineTo(double x) = 0;\r\n    virtual void horLineRel(double dx) = 0;\r\n\r\n    virtual void verLineTo(double y) = 0;\r\n    virtual void verLineRel(double dy) = 0;\r\n\r\n    virtual void arcTo(double rx, double ry,double angle, bool largeArcFlag,bool sweepFlag,double x, double y) = 0;\r\n\r\n    virtual void arcRel(double rx, double ry,double angle, bool largeArcFlag,bool sweepFlag,double dx, double dy) = 0;\r\n\r\n    virtual void quadricCurveTo(double xCtrl, double yCtrl,double xTo,   double yTo) = 0;\r\n    virtual void quadricCurveRel(double dxCtrl, double dyCtrl,double dxTo,   double dyTo) = 0;\r\n    virtual void quadricCurveTo(double xTo, double yTo) = 0;\r\n    virtual void quadricCurveRel(double dxTo, double dyTo) = 0;\r\n\r\n    virtual void cubicCurveTo(double xCtrl1, double yCtrl1,double xCtrl2, double yCtrl2,double xTo,    double yTo) = 0;\r\n    virtual void cubicCurveRel(double dxCtrl1, double dyCtrl1,double dxCtrl2, double dyCtrl2,double dxTo,    double dyTo) = 0;\r\n    virtual void cubicCurveTo(double xCtrl2, double yCtrl2,double xTo,    double yTo) = 0;\r\n    virtual void cubicCurveRel(double xCtrl2, double yCtrl2,double xTo,    double yTo) = 0;\r\n\r\n\tvirtual void addEllipse(double cx, double cy, double rx, double ry, Agg2DBase::Direction dir) = 0;\r\n    virtual void closePolygon() = 0;\r\n\r\n    virtual void drawPath(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) = 0;\r\n//\tvirtual void drawPathNoTransform(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) = 0;\r\n\r\n    // Image Transformations\r\n    virtual void imageFilter(Agg2DBase::ImageFilter f) = 0;\r\n    virtual Agg2DBase::ImageFilter imageFilter() = 0;\r\n\r\n    virtual void imageResample(Agg2DBase::ImageResample f) = 0;\r\n    virtual Agg2DBase::ImageResample imageResample() = 0;\r\n\tstatic const agg::int8u* lookupFont(const std::string& name);\r\n\tvirtual void setFont(const std::string& name) = 0;\r\n\tvirtual void renderText(double dstX, double dstY, const std::string& str) = 0;\r\n\tvirtual void renderTextDropshadowed(double dstX, double dstY, const std::string& str)\r\n\t{\r\n\t\tAggColor lineColorOld = lineColor();\r\n\t\tif(lineColorOld.r+lineColorOld.g+lineColorOld.b<192)\r\n\t\t\tlineColor(255-lineColorOld.r,255-lineColorOld.g,255-lineColorOld.b);\r\n\t\telse\r\n\t\t\tlineColor(0,0,0);\r\n\t\t/*renderText(dstX-1,dstY-1,str);\r\n\t\trenderText(dstX,dstY-1,str);\r\n\t\trenderText(dstX+1,dstY-1,str);\r\n\t\trenderText(dstX-1,dstY,str);\r\n\t\trenderText(dstX+1,dstY,str);\r\n\t\trenderText(dstX-1,dstY+1,str);\r\n\t\trenderText(dstX,dstY+1,str);*/\r\n\t\trenderText(dstX+1,dstY+1,str);\r\n\t\tlineColor(lineColorOld);\r\n\t\trenderText(dstX,dstY,str);\r\n\t}\r\n\r\n\r\n\t// Auxiliary\r\n    virtual double pi() { return agg::pi; }\r\n    virtual double deg2Rad(double v) { return v * agg::pi / 180.0; }\r\n    virtual double rad2Deg(double v) { return v * 180.0 / agg::pi; }\r\n};\r\n\r\n\r\ntemplate<typename PixFormatSet> \r\nclass AggDrawTargetImplementation : public AggDrawTarget, public Agg2D<PixFormatSet>\r\n{\r\npublic:\r\n\ttypedef typename PixFormatSet::PixFormat pixfmt;\r\n\ttypedef typename pixfmt::color_type color_type;\r\n\r\n\ttypedef Agg2D<PixFormatSet> BASE;\r\n\tAggDrawTargetImplementation(agg::int8u* buf, int width, int height, int stride)\r\n\t{\r\n\t\tBASE::attach(buf,width,height,stride);\r\n\r\n\t\tBASE::viewport(0, 0, width-1, height-1, 0, 0, width-1, height-1, TAGG2D::Anisotropic);\r\n\t}\r\n\r\n\tvirtual void clear() { \r\n\t\tif(!empty)\r\n\t\t{\r\n\t\t\tBASE::clearAll(0,0,0,0);\r\n\t\t\tundirty();\r\n\t\t}\r\n\t}\r\n\r\n\tvirtual agg::rendering_buffer & buf() { dirty(); return BASE::buf(); } // buf() might not always require calling dirty()\r\n\ttypename BASE::MyImage image() { return BASE::MyImage(buf()); }\r\n\r\n    // Setup\r\n\tvirtual void  attach(unsigned char* buf, unsigned width, unsigned height, int stride) {BASE::attach(buf, width, height, stride);};\r\n//\tvirtual void  attach(Agg2DBase::Image& img) {attach(img);};\r\n\r\n    virtual void  clipBox(double x1, double y1, double x2, double y2) { BASE::clipBox(x1,y1,x2,y2); }\r\n\tvirtual Agg2DBase::RectD clipBox() const {return BASE::clipBox();};\r\n\r\n\tvirtual void  clearAll(AggColor c) {BASE::clearAll(c);};\r\n\tvirtual void  clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::clearAll(r, g, b, a);};\r\n\r\n\tvirtual void  clearClipBox(AggColor c) {BASE::clearClipBox(c);};\r\n\tvirtual void  clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::clearClipBox(r, g, b, a);};\r\n\r\n//\tvirtual unsigned width()  const { return Agg2DBase::m_rbuf.width();  }\r\n//  virtual unsigned height() const { return Agg2DBase::m_rbuf.height(); }\r\n\r\n    // Conversions\r\n\tvirtual void   worldToScreen(double& x, double& y) const {BASE::worldToScreen(x, y);};\r\n\tvirtual void   screenToWorld(double& x, double& y) const {BASE::screenToWorld(x, y);};\r\n\tvirtual double worldToScreen(double scalar) const {return BASE::worldToScreen(scalar);};\r\n\tvirtual double screenToWorld(double scalar) const {return BASE::screenToWorld(scalar);};\r\n\tvirtual void   alignPoint(double& x, double& y) const {BASE::alignPoint(x, y);};\r\n\tvirtual bool   inBox(double worldX, double worldY) const {return BASE::inBox(worldX, worldY);};\r\n\r\n    // General Attributes\r\n\tvirtual void blendMode(Agg2DBase::BlendMode m) {BASE::blendMode(m);};\r\n\tvirtual Agg2DBase::BlendMode blendMode() {return BASE::blendMode();};\r\n\r\n\tvirtual void imageBlendMode(Agg2DBase::BlendMode m) {BASE::imageBlendMode(m);};\r\n\tvirtual Agg2DBase::BlendMode imageBlendMode() {return BASE::imageBlendMode();};\r\n\r\n\tvirtual void imageBlendColor(AggColor c) {BASE::imageBlendColor(c);};\r\n\tvirtual void imageBlendColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::imageBlendColor(r, g, b, a);};\r\n\tvirtual AggColor imageBlendColor() {return BASE::imageBlendColor();};\r\n\r\n\tvirtual void masterAlpha(double a) {BASE::masterAlpha(a);};\r\n\tvirtual double masterAlpha() {return BASE::masterAlpha();};\r\n\r\n\tvirtual void antiAliasGamma(double g) {BASE::antiAliasGamma(g);};\r\n\tvirtual double antiAliasGamma() {return BASE::antiAliasGamma();};\r\n\r\n//\tvirtual void font(const agg::int8u* font) { m_font = font; }\r\n//\tconst agg::int8u* font() { return m_font; }\r\n\r\n\tvirtual void fillColor(AggColor c) {BASE::fillColor(c);};\r\n\tvirtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::fillColor(r,g,b,a);};\r\n\tvirtual void noFill() {BASE::noFill();};\r\n\r\n\tvirtual void lineColor(AggColor c) {BASE::lineColor(c);};\r\n\tvirtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a = 255) {BASE::lineColor(r,g,b,a);};\r\n\tvirtual void noLine() {BASE::noLine();};\r\n\r\n\tvirtual AggColor fillColor() {return BASE::fillColor();};\r\n\tvirtual AggColor lineColor() {return BASE::lineColor();};\r\n\r\n\tvirtual void fillLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::fillLinearGradient(x1, y1, x2, y2, c1, c2, profile);};\r\n\tvirtual void lineLinearGradient(double x1, double y1, double x2, double y2, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::lineLinearGradient(x1, y1, x2, y2, c1, c2, profile);};\r\n\r\n\tvirtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::fillRadialGradient(x, y, r, c1, c2, profile);};\r\n\tvirtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, double profile=1.0) {dirty(); BASE::lineRadialGradient(x, y, r, c1, c2, profile);};\r\n\r\n\tvirtual void fillRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) {dirty(); BASE::fillRadialGradient(x, y, r, c1, c2, c3);};\r\n\tvirtual void lineRadialGradient(double x, double y, double r, AggColor c1, AggColor c2, AggColor c3) {dirty(); BASE::lineRadialGradient(x, y, r, c1, c2, c3);};\r\n\tvirtual void fillRadialGradient(double x, double y, double r) {dirty(); BASE::fillRadialGradient(x, y, r);};\r\n\tvirtual void lineRadialGradient(double x, double y, double r) {dirty(); BASE::lineRadialGradient(x, y, r);};\r\n\r\n\tvirtual void lineWidth(double w) {BASE::lineWidth(w);};\r\n\tvirtual double lineWidth() {return BASE::lineWidth();};\r\n\r\n\tvirtual void lineCap(Agg2DBase::LineCap cap) {BASE::lineCap(cap);};\r\n\tvirtual Agg2DBase::LineCap lineCap() {return BASE::lineCap();};\r\n\r\n\tvirtual void lineJoin(Agg2DBase::LineJoin join) {BASE::lineJoin(join);};\r\n\tvirtual Agg2DBase::LineJoin lineJoin() {return BASE::lineJoin();};\r\n\r\n\tvirtual void fillEvenOdd(bool evenOddFlag) {BASE::fillEvenOdd(evenOddFlag);};\r\n\tvirtual bool fillEvenOdd() {return BASE::fillEvenOdd();};\r\n\r\n\tvirtual void transformImage(const Agg2DBase::Image<T_AGG_PF_RGBA>& img, double dstX1, double dstY1, double dstX2, double dstY2) { BASE::transformImage(img,dstX1,dstY1,dstX2,dstY2); }\r\n\t//virtual void transformImage(const Agg2DBase::Image<T_AGG_PF_RGB555> &img, double dstX1, double dstY1, double dstX2, double dstY2)  { BASE::transformImage(img,dstX1,dstY1,dstX2,dstY2); }\r\n\r\n    // Transformations\r\n\tvirtual Agg2DBase::Transformations transformations() {return BASE::transformations();};\r\n\tvirtual void transformations(const Agg2DBase::Transformations& tr) {BASE::transformations(tr);};\r\n\r\n\tvirtual const Agg2DBase::Affine& affine() {return BASE::affine();};\r\n//\tvirtual void affine(const Agg2DBase::Affine&) {BASE::affine();};\r\n\r\n\tvirtual void resetTransformations() {BASE::resetTransformations();};\r\n\tvirtual void matrix(const Agg2DBase::Affine& tr) {BASE::matrix(tr);};\r\n\tvirtual void matrix(const Agg2DBase::Transformations& tr) {BASE::matrix(tr);};\r\n\tvirtual void rotate(double angle) {BASE::rotate(angle);};\r\n\tvirtual void rotate(double angle, double cx, double cy) {BASE::rotate(angle, cx, cy);};\r\n\tvirtual void scale(double s) {BASE::scale(s);};\r\n\tvirtual void scale(double sx, double sy) {BASE::scale(sx, sy);};\r\n\tvirtual void skew(double sx, double sy) {BASE::skew(sx, sy);};\r\n\tvirtual void translate(double x, double y) {BASE::translate(x, y);};\r\n\tvirtual void parallelogram(double x1, double y1, double x2, double y2, const double* para) {BASE::parallelogram(x1, y1, x2, y2, para);};\r\n\tvirtual void viewport(double worldX1,  double worldY1,  double worldX2,  double worldY2, double screenX1, double screenY1, double screenX2, double screenY2, Agg2DBase::ViewportOption opt=Agg2DBase::XMidYMid, Agg2DBase::WindowFitLogic fl = Agg2DBase::WindowFitLogic_meet) {BASE::viewport(worldX1, worldY1, worldX2, worldY2, screenX1, screenY1, screenX2, screenY2, opt, fl);};\r\n\r\n\t// Basic Shapes\r\n\tvirtual void line(double x1, double y1, double x2, double y2) {dirty(); BASE::line(x1, y1, x2, y2);};\r\n\tvirtual void triangle(double x1, double y1, double x2, double y2, double x3, double y3) {dirty(); BASE::triangle(x1, y1, x2, y2, x3, y3);};\r\n\tvirtual void rectangle(double x1, double y1, double x2, double y2) {dirty(); BASE::rectangle(x1, y1, x2, y2);};\r\n\tvirtual void roundedRect(double x1, double y1, double x2, double y2, double r) { dirty(); BASE::roundedRect(x1,y1,x2,y2,r); }\r\n    virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry)  { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx,ry); }\r\n\tvirtual void roundedRect(double x1, double y1, double x2, double y2,double rx_bottom, double ry_bottom,double rx_top,double ry_top) { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx_bottom,ry_bottom,rx_top,ry_top); }\r\n\tvirtual void ellipse(double cx, double cy, double rx, double ry) {dirty(); BASE::ellipse(cx, cy, rx, ry);}\r\n\tvirtual void arc(double cx, double cy, double rx, double ry, double start, double sweep) {dirty(); BASE::arc(cx, cy, rx, ry, start, sweep);};\r\n\tvirtual void star(double cx, double cy, double r1, double r2, double startAngle, int numRays) {dirty(); BASE::star(cx, cy, r1, r2, startAngle, numRays);};\r\n\tvirtual void curve(double x1, double y1, double x2, double y2, double x3, double y3) {dirty(); BASE::curve(x1, y1, x2, y2, x3, y3);};\r\n\tvirtual void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {dirty(); BASE::curve(x1, y1, x2, y2, x3, y3, x4, y4);};\r\n\tvirtual void polygon(double* xy, int numPoints) {dirty(); BASE::polygon(xy, numPoints);};\r\n\tvirtual void polyline(double* xy, int numPoints) {dirty(); BASE::polyline(xy, numPoints);};\r\n\r\n\tvirtual void setFont(const std::string& name) { BASE::font(lookupFont(name)); }\r\n\tvirtual void renderText(double dstX, double dstY, const std::string& str) { \r\n\t\tdirty(); \r\n\t\tint height = BASE::font()[0];\r\n\t\tint base = BASE::font()[1];\r\n\t\tint offset = height-base*2;\r\n\t\tBASE::renderText(dstX, dstY + offset, str);\r\n\t}\r\n\r\n    // Path commands\r\n    virtual void resetPath() {BASE::resetPath();};\r\n\r\n\tvirtual void moveTo(double x, double y) {BASE::moveTo(x, y);}\r\n\tvirtual void moveRel(double dx, double dy) {BASE::moveRel(dx,dy);};\r\n\r\n\tvirtual void lineTo(double x, double y) {BASE::lineTo(x, y);};\r\n\tvirtual void lineRel(double dx, double dy) {BASE::lineRel(dx, dy);};\r\n\r\n\tvirtual void horLineTo(double x) {BASE::horLineTo(x);};\r\n\tvirtual void horLineRel(double dx) {BASE::horLineRel(dx);};\r\n\r\n\tvirtual void verLineTo(double y) {BASE::verLineTo(y);};\r\n\tvirtual void verLineRel(double dy) {BASE::verLineRel(dy);};\r\n\r\n\tvirtual void arcTo(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double x, double y) {BASE::arcTo(rx, ry, angle, largeArcFlag, sweepFlag, x, y);};\r\n\r\n\tvirtual void arcRel(double rx, double ry, double angle, bool largeArcFlag, bool sweepFlag, double dx, double dy) {BASE::arcRel(rx, ry, angle, largeArcFlag, sweepFlag, dx, dy);};\r\n\r\n\tvirtual void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo) {BASE::quadricCurveTo(xCtrl, yCtrl, xTo, yTo);};\r\n\tvirtual void quadricCurveRel(double dxCtrl, double dyCtrl, double dxTo, double dyTo) {BASE::quadricCurveRel(dxCtrl, dyCtrl, dxTo, dyTo);};\r\n\tvirtual void quadricCurveTo(double xTo, double yTo) {BASE::quadricCurveTo(xTo, yTo);};\r\n\tvirtual void quadricCurveRel(double dxTo, double dyTo) {BASE::quadricCurveRel(dxTo, dyTo);};\r\n\r\n\tvirtual void cubicCurveTo(double xCtrl1, double yCtrl1, double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveTo(xCtrl1, yCtrl1, xCtrl2, yCtrl2, xTo, yTo);};\r\n\tvirtual void cubicCurveRel(double dxCtrl1, double dyCtrl1, double dxCtrl2, double dyCtrl2, double dxTo, double dyTo) {BASE::cubicCurveRel(dxCtrl1, dyCtrl1, dxCtrl2, dyCtrl2, dxTo, dyTo);};\r\n\tvirtual void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveTo(xCtrl2, yCtrl2, xTo, yTo);};\r\n\tvirtual void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo) {BASE::cubicCurveRel(xCtrl2, yCtrl2, xTo, yTo);};\r\n\r\n\tvirtual void addEllipse(double cx, double cy, double rx, double ry, Agg2DBase::Direction dir) {BASE::addEllipse(cx, cy, rx, ry, dir);};\r\n\tvirtual void closePolygon() {BASE::closePolygon();};\r\n\r\n\tvirtual void drawPath(Agg2DBase::DrawPathFlag flag = Agg2DBase::FillAndStroke) {dirty(); BASE::drawPath(flag);};\r\n//\tvirtual void drawPathNoTransform(DrawPathFlag flag = FillAndStroke) {dirty(); BASE::drawPathNoTransform(flag);};\r\n\r\n    // Image Transformations\r\n\tvirtual void imageFilter(Agg2DBase::ImageFilter f) {BASE::imageFilter(f);};\r\n\tvirtual Agg2DBase::ImageFilter imageFilter() {return BASE::imageFilter();};\r\n\r\n\tvirtual void imageResample(Agg2DBase::ImageResample f) {BASE::imageResample(f);};\r\n\tvirtual Agg2DBase::ImageResample imageResample() {return BASE::imageResample();};\r\n\r\n\t// Auxiliary\r\n    virtual double pi() { return agg::pi; }\r\n    virtual double deg2Rad(double v) { return v * agg::pi / 180.0; }\r\n    virtual double rad2Deg(double v) { return v * 180.0 / agg::pi; }\r\n};\r\n\r\n//the main aggdraw targets for different pixel formats\r\ntypedef AggDrawTargetImplementation<T_AGG_PF_RGB555> T_AGG_RGB555;\r\ntypedef AggDrawTargetImplementation<T_AGG_PF_RGBA> T_AGG_RGBA;\r\n\r\n\r\nclass AggDraw\r\n{\r\npublic:\r\n\tAggDraw()\r\n\t\t: target(NULL)\r\n\t{}\r\n\tAggDrawTarget *target;\r\n};\r\n\r\nenum AggTarget\r\n{\r\n\tAggTarget_Screen = 0,\r\n\tAggTarget_Hud = 1,\r\n\tAggTarget_Lua = 2,\r\n};\r\n\r\n//specialized instance for desmume; should eventually move to another file\r\nclass AggDraw_Desmume : public AggDraw\r\n{\r\npublic:\r\n\tvoid setTarget(AggTarget newTarget);\r\n\t//void composite(void* dest);\r\n\r\n\tAggDrawTarget *screen, *hud, *lua;\r\n};\r\n\r\nextern AggDraw_Desmume aggDraw;\r\n\r\nvoid Agg_init();\r\n\r\nstruct font_type\r\n{\r\n\tconst agg::int8u* font;\r\n\tconst char* name;\r\n};\r\nextern font_type fonts_list[];\r\nextern int font_Nums;\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/7z.mk",
    "content": "# Android ndk makefile for p7zip https://sourceforge.net/projects/p7zip/\r\n\r\nLOCAL_PATH := $(call my-dir)\r\n\r\nMY_LOCAL_PATH := $(LOCAL_PATH)\r\n\r\ninclude $(CLEAR_VARS)\r\n\r\n\r\nLOCAL_MODULE    \t\t:= \tlibsevenzip\r\nLOCAL_C_INCLUDES\t\t:= \t$(LOCAL_PATH)/CPP \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/CPP/include_windows \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/CPP/myWindows\r\nLOCAL_SRC_FILES\t\t\t:= \tC/Threads.c \\\r\n\t\t\t\t\t\t\tC/LzmaDec.c \\\r\n\t\t\t\t\t\t\tC/LzmaEnc.c \\\r\n\t\t\t\t\t\t\tC/LzFind.c \\\r\n\t\t\t\t\t\t\tC/7zCrc.c \\\r\n\t\t\t\t\t\t\tC/Aes.c \\\r\n\t\t\t\t\t\t\tC/HuffEnc.c \\\r\n\t\t\t\t\t\t\tC/Sort.c \\\r\n\t\t\t\t\t\t\tC/BwtSort.c \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/ArchiveExports.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/DllExports2.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/ItemNameUtils.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/OutStreamWithCRC.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/InStreamWithCRC.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/ParseProperties.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/HandlerOut.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/CoderMixer2MT.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/CoderMixer2.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/DummyOutStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Common/FindSignature.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zCompressionMode.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zDecode.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zEncode.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zExtract.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zFolderInStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zFolderOutStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zHandler.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zHandlerOut.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zHeader.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zIn.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zOut.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zProperties.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zRegister.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zSpecStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/7z/7zUpdate.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Rar/RarHandler.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Rar/RarHeader.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Rar/RarIn.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Rar/RarItem.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Rar/RarRegister.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Rar/RarVolumeInStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipAddCommon.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipHandler.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipHandlerOut.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipHeader.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipIn.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipItem.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipOut.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipRegister.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/Zip/ZipUpdate.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/BZip2/bz2Register.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/BZip2/BZip2Handler.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/BZip2/BZip2HandlerOut.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Archive/BZip2/BZip2Update.cpp \\\r\n\t\t\t\t\t\t\tCPP/Common/MyWindows.cpp \\\r\n\t\t\t\t\t\t\tCPP/Common/MyString.cpp \\\r\n\t\t\t\t\t\t\tCPP/Common/StringConvert.cpp \\\r\n\t\t\t\t\t\t\tCPP/Common/MyVector.cpp \\\r\n\t\t\t\t\t\t\tCPP/Common/UTFConvert.cpp \\\r\n\t\t\t\t\t\t\tCPP/Common/IntToString.cpp \\\r\n\t\t\t\t\t\t\tCPP/Common/StringToInt.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/PropVariant.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/PropVariantConversions.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/System.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/Time.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/Synchronization.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/FileIO.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/FileFind.cpp \\\r\n\t\t\t\t\t\t\tCPP/Windows/FileDir.cpp \\\r\n\t\t\t\t\t\t\tCPP/myWindows/wine_date_and_time.cpp \\\r\n\t\t\t\t\t\t\tCPP/myWindows/myGetTickCount.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/CreateCoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/FilterCoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/StreamUtils.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/ProgressUtils.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/LimitedStreams.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/MemBlocks.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/OutMemStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/ProgressMt.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/OutBuffer.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/InBuffer.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/StreamObjects.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/LockedStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/VirtThread.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/InOutTempBuffer.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/MethodProps.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/OffsetStream.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/MethodId.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Common/StreamBinder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/CodecExports.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/CopyCoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/LzmaDecoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/LzmaEncoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/ImplodeDecoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/ShrinkDecoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/ImplodeHuffmanDecoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/LzOutWindow.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/BitlDecoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/DeflateDecoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/DeflateEncoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/DeflateRegister.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/LzmaRegister.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/RarCodecsRegister.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/Rar1Decoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/Rar2Decoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/Rar3Decoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/Rar3Vm.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/BZip2Crc.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/BZip2Decoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/BZip2Encoder.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Compress/BZip2Register.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/ZipStrong.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/ZipCrypto.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/Sha1.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/RandGen.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/MyAes.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/Pbkdf2HmacSha1.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/HmacSha1.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/RarAes.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/Rar20Crypto.cpp \\\r\n\t\t\t\t\t\t\tCPP/7zip/Crypto/WzAes.cpp\r\n\r\nLOCAL_ARM_MODE \t\t\t:= \tarm\r\nLOCAL_ARM_NEON \t\t\t:= \tfalse\r\nLOCAL_CFLAGS\t\t\t:= -DCOMPRESS_MT\r\n\r\ninclude $(BUILD_STATIC_LIBRARY)"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/Asm/x64/7zCrcT8U.asm",
    "content": "\r\n\r\nglobal CrcUpdateT8:function\r\nglobal _CrcUpdateT8:function\r\n\r\nSECTION .text\r\n\r\n%macro CRC1b 0\r\n    movzx EDX, BYTE [RSI]\r\n    inc RSI\r\n    movzx EBX, AL\r\n    xor EDX, EBX\r\n    shr EAX, 8\r\n    xor EAX, [RDI + RDX * 4]\r\n    dec R8\r\n%endmacro\r\n\r\n\r\n\r\nalign 16\r\nCrcUpdateT8:\r\n_CrcUpdateT8:\r\n\r\n    push RBX\r\n    ; push RSI\r\n    ; push RDI\r\n    push RBP\r\n\r\n    mov\tEAX, EDI ; EAX = CRC\r\n    ; RSI = BUF\r\n    mov R8, RDX  ; R8 = LEN\r\n    mov RDI, RCX ; RDI = table\r\n\r\n\r\n    test R8, R8\r\n    jz sl_end\r\n  sl:\r\n    test RSI, 7\r\n    jz sl_end\r\n    CRC1b\r\n    jnz sl\r\n  sl_end:\r\n\r\n    cmp R8, 16\r\n    jb crc_end\r\n    mov R9, R8\r\n    and R8, 7\r\n    add R8, 8\r\n    sub R9, R8\r\n            \r\n    add R9, RSI\r\n    xor EAX, [RSI]\r\n    mov EBX, [RSI + 4]\r\n    movzx ECX, BL\r\n    align 16\r\n  main_loop:\r\n    mov EDX, [RDI + RCX*4 + 0C00h]\r\n    movzx EBP, BH\r\n    xor EDX, [RDI + RBP*4 + 0800h]\r\n    shr EBX, 16\r\n    movzx ECX, BL\r\n    xor EDX, [RSI + 8]\r\n    xor EDX, [RDI + RCX*4 + 0400h]\r\n    movzx ECX, AL\r\n    movzx EBP, BH\r\n    xor EDX, [RDI + RBP*4 + 0000h]\r\n\r\n    mov EBX, [RSI + 12]\r\n\r\n    xor EDX, [RDI + RCX*4 + 01C00h]\r\n    movzx EBP, AH\r\n    shr EAX, 16\r\n    movzx ECX, AL\r\n    xor EDX, [RDI + RBP*4 + 01800h]\r\n    movzx EBP, AH\r\n    mov EAX, [RDI + RCX*4 + 01400h]\r\n    add RSI, 8\r\n    xor EAX, [RDI + RBP*4 + 01000h]\r\n    movzx ECX, BL\r\n    xor EAX,EDX\r\n\r\n    cmp RSI, R9\r\n    jne\tmain_loop\r\n    xor\tEAX, [RSI]\r\n\r\n\r\n  \r\n  crc_end:\r\n\r\n    test R8, R8\r\n    jz fl_end\r\n  fl:\r\n    CRC1b\r\n    jnz fl\r\n  fl_end:\r\n\r\n    pop RBP\r\n    ; pop RDI\r\n    ; pop RSI\r\n    pop RBX\r\n    ret\r\n\r\nend\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/Asm/x86/7zCrcT8U.asm",
    "content": "\r\nSECTION .text\r\n\r\n%macro CRC1b 0\r\n    movzx EDX, BYTE [ESI]\r\n    inc ESI\r\n    movzx EBX, AL\r\n    xor EDX, EBX\r\n    shr EAX, 8\r\n    xor EAX, [EBP + EDX * 4]\r\n    dec EDI\r\n%endmacro\r\n\r\ndata_size equ (28)\r\ncrc_table equ (data_size + 4)\r\n\r\nalign 16\r\nglobal CrcUpdateT8\r\nglobal _CrcUpdateT8\r\nCrcUpdateT8:\r\n_CrcUpdateT8:\r\n    push EBX\r\n    push ESI\r\n    push EDI\r\n    push EBP\r\n\r\n    mov\tEAX, [ESP + 20]        ; CRC\r\n    mov\tESI, [ESP + 24]        ; buf\r\n    mov\tEDI, [ESP + data_size] ; size\r\n    mov EBP, [ESP + crc_table] ; tables\r\n\r\n    test EDI, EDI\r\n    jz sl_end\r\n  sl:\r\n    test ESI, 7\r\n    jz sl_end\r\n    CRC1b\r\n    jnz sl\r\n  sl_end:\r\n\r\n    cmp EDI, 16\r\n    jb NEAR crc_end\r\n    mov [ESP + data_size], EDI\r\n    sub EDI, 8\r\n    and EDI, ~ 7\r\n    sub [ESP + data_size], EDI\r\n\r\n    add EDI, ESI\r\n    xor EAX, [ESI]\r\n    mov EBX, [ESI + 4]\r\n    movzx ECX, BL\r\n    align 16\r\n  main_loop:\r\n    mov EDX, [EBP + ECX*4 + 0C00h]\r\n    movzx ECX, BH\r\n    xor EDX, [EBP + ECX*4 + 0800h]\r\n    shr EBX, 16\r\n    movzx ECX, BL\r\n    xor EDX, [EBP + ECX*4 + 0400h]\r\n    xor EDX, [ESI + 8]\r\n    movzx ECX, AL\r\n    movzx EBX, BH\r\n    xor EDX, [EBP + EBX*4 + 0000h]\r\n\r\n    mov EBX, [ESI + 12]\r\n\r\n    xor EDX, [EBP + ECX*4 + 01C00h]\r\n    movzx ECX, AH\r\n    add ESI, 8\r\n    shr EAX, 16\r\n    xor EDX, [EBP + ECX*4 + 01800h]\r\n    movzx ECX, AL\r\n    xor EDX, [EBP + ECX*4 + 01400h]\r\n    movzx ECX, AH\r\n    mov EAX, [EBP + ECX*4 + 01000h]\r\n    movzx ECX, BL\r\n    xor EAX,EDX\r\n\r\n    cmp ESI, EDI\r\n    jne\tmain_loop\r\n    xor\tEAX, [ESI]\r\n\r\n    mov EDI, [ESP + data_size]\r\n\r\n  crc_end:\r\n\r\n    test EDI, EDI\r\n    jz fl_end\r\n  fl:\r\n    CRC1b\r\n    jnz fl\r\n  fl_end:\r\n\r\n    pop EBP\r\n    pop EDI\r\n    pop ESI\r\n    pop EBX\r\n    ret ; 8\r\n\r\n\r\nend\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/7zCrc.c",
    "content": "/* 7zCrc.c -- CRC32 calculation\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#include \"7zCrc.h\"\n\n#define kCrcPoly 0xEDB88320\nUInt32 g_CrcTable[256];\n\nvoid MY_FAST_CALL CrcGenerateTable(void)\n{\n  UInt32 i;\n  for (i = 0; i < 256; i++)\n  {\n    UInt32 r = i;\n    int j;\n    for (j = 0; j < 8; j++)\n      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));\n    g_CrcTable[i] = r;\n  }\n}\n\nUInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size)\n{\n  const Byte *p = (const Byte *)data;\n  for (; size > 0 ; size--, p++)\n    v = CRC_UPDATE_BYTE(v, *p);\n  return v;\n}\n\nUInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size)\n{\n  return CrcUpdate(CRC_INIT_VAL, data, size) ^ 0xFFFFFFFF;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/7zCrc.h",
    "content": "/* 7zCrc.h -- CRC32 calculation\n2008-03-13\nIgor Pavlov\nPublic domain */\n\n#ifndef __7Z_CRC_H\n#define __7Z_CRC_H\n\n#include <stddef.h>\n\n#include \"Types.h\"\n\nextern UInt32 g_CrcTable[];\n\nvoid MY_FAST_CALL CrcGenerateTable(void);\n\n#define CRC_INIT_VAL 0xFFFFFFFF\n#define CRC_GET_DIGEST(crc) ((crc) ^ 0xFFFFFFFF)\n#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\n\nUInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size);\nUInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/7zCrcT8.c",
    "content": "/* 7zCrcT8.c -- CRC32 calculation with 8 tables\n2008-03-19\nIgor Pavlov\nPublic domain */\n\n#include \"7zCrc.h\"\n\n#define kCrcPoly 0xEDB88320\n#define CRC_NUM_TABLES 8\n\nUInt32 g_CrcTable[256 * CRC_NUM_TABLES];\n\nvoid MY_FAST_CALL CrcGenerateTable()\n{\n  UInt32 i;\n  for (i = 0; i < 256; i++)\n  {\n    UInt32 r = i;\n    int j;\n    for (j = 0; j < 8; j++)\n      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));\n    g_CrcTable[i] = r;\n  }\n  #if CRC_NUM_TABLES > 1\n  for (; i < 256 * CRC_NUM_TABLES; i++)\n  {\n    UInt32 r = g_CrcTable[i - 256];\n    g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8);\n  }\n  #endif\n}\n\nUInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table);\n\nUInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size)\n{\n  return CrcUpdateT8(v, data, size, g_CrcTable);\n}\n\nUInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size)\n{\n  return CrcUpdateT8(CRC_INIT_VAL, data, size, g_CrcTable) ^ 0xFFFFFFFF;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/7zVersion.h",
    "content": "#define MY_VER_MAJOR 4\n#define MY_VER_MINOR 65\n#define MY_VER_BUILD 0\n#define MY_VERSION \"4.65\"\n#define MY_DATE \"2009-02-03\"\n#define MY_COPYRIGHT \": Igor Pavlov : Public domain\"\n#define MY_VERSION_COPYRIGHT_DATE MY_VERSION \" \" MY_COPYRIGHT \" : \" MY_DATE\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Aes.c",
    "content": "/* Aes.c -- AES encryption / decryption\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#include \"Aes.h\"\n#include \"CpuArch.h\"\n\nstatic UInt32 T[256 * 4];\nstatic Byte Sbox[256] = {\n  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,\n  0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,\n  0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n  0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,\n  0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,\n  0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n  0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,\n  0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,\n  0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n  0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,\n  0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,\n  0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n  0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,\n  0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,\n  0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n  0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};\n\nstatic UInt32 D[256 * 4];\nstatic Byte InvS[256];\n\nstatic Byte Rcon[11] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 };\n\n#define xtime(x) ((((x) << 1) ^ (((x) & 0x80) != 0 ? 0x1B : 0)) & 0xFF)\n\n#define Ui32(a0, a1, a2, a3) ((UInt32)(a0) | ((UInt32)(a1) << 8) | ((UInt32)(a2) << 16) | ((UInt32)(a3) << 24))\n\n#define gb0(x) ( (x)          & 0xFF)\n#define gb1(x) (((x) >> ( 8)) & 0xFF)\n#define gb2(x) (((x) >> (16)) & 0xFF)\n#define gb3(x) (((x) >> (24)) & 0xFF)\n\nvoid AesGenTables(void)\n{\n  unsigned i;\n  for (i = 0; i < 256; i++)\n    InvS[Sbox[i]] = (Byte)i;\n  for (i = 0; i < 256; i++)\n  {\n    {\n      UInt32 a1 = Sbox[i];\n      UInt32 a2 = xtime(a1);\n      UInt32 a3 = xtime(a1) ^ a1;\n      T[        i] = Ui32(a2, a1, a1, a3);\n      T[0x100 + i] = Ui32(a3, a2, a1, a1);\n      T[0x200 + i] = Ui32(a1, a3, a2, a1);\n      T[0x300 + i] = Ui32(a1, a1, a3, a2);\n    }\n    {\n      UInt32 a1 = InvS[i];\n      UInt32 a2 = xtime(a1);\n      UInt32 a4 = xtime(a2);\n      UInt32 a8 = xtime(a4);\n      UInt32 a9 = a8 ^ a1;\n      UInt32 aB = a8 ^ a2 ^ a1;\n      UInt32 aD = a8 ^ a4 ^ a1;\n      UInt32 aE = a8 ^ a4 ^ a2;\n      D[        i] = Ui32(aE, a9, aD, aB);\n      D[0x100 + i] = Ui32(aB, aE, a9, aD);\n      D[0x200 + i] = Ui32(aD, aB, aE, a9);\n      D[0x300 + i] = Ui32(a9, aD, aB, aE);\n    }\n  }\n}\n\n#define HT(i, x, s) (T + (x << 8))[gb ## x(s[(i + x) & 3])]\n#define HT4(m, i, s, p) m[i] = \\\n    HT(i, 0, s) ^ \\\n    HT(i, 1, s) ^ \\\n    HT(i, 2, s) ^ \\\n    HT(i, 3, s) ^ w[p + i]\n/* such order (2031) in HT16 is for VC6/K8 speed optimization) */\n#define HT16(m, s, p) \\\n    HT4(m, 2, s, p); \\\n    HT4(m, 0, s, p); \\\n    HT4(m, 3, s, p); \\\n    HT4(m, 1, s, p); \\\n\n#define FT(i, x) Sbox[gb ## x(m[(i + x) & 3])]\n#define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i];\n\n#define HD(i, x, s) (D + (x << 8))[gb ## x(s[(i - x) & 3])]\n#define HD4(m, i, s, p) m[i] = \\\n    HD(i, 0, s) ^ \\\n    HD(i, 1, s) ^ \\\n    HD(i, 2, s) ^ \\\n    HD(i, 3, s) ^ w[p + i];\n/* such order (0231) in HD16 is for VC6/K8 speed optimization) */\n#define HD16(m, s, p) \\\n    HD4(m, 0, s, p); \\\n    HD4(m, 2, s, p); \\\n    HD4(m, 3, s, p); \\\n    HD4(m, 1, s, p); \\\n\n#define FD(i, x) InvS[gb ## x(m[(i - x) & 3])]\n#define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i];\n\nvoid Aes_SetKeyEncode(CAes *p, const Byte *key, unsigned keySize)\n{\n  unsigned i, wSize;\n  UInt32 *w;\n  keySize /= 4;\n  p->numRounds2 = keySize / 2 + 3;\n\n  wSize = (p->numRounds2 * 2 + 1) * 4;\n  w = p->rkey;\n\n  for (i = 0; i < keySize; i++, key += 4)\n    w[i] = Ui32(key[0], key[1], key[2], key[3]);\n\n  for (; i < wSize; i++)\n  {\n    UInt32 t = w[i - 1];\n    unsigned rem = i % keySize;\n    if (rem == 0)\n      t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]);\n    else if (keySize > 6 && rem == 4)\n      t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]);\n    w[i] = w[i - keySize] ^ t;\n  }\n}\n\nvoid Aes_SetKeyDecode(CAes *p, const Byte *key, unsigned keySize)\n{\n  unsigned i, num;\n  UInt32 *w;\n  Aes_SetKeyEncode(p, key, keySize);\n  num = p->numRounds2 * 8 - 4;\n  w = p->rkey + 4;\n  for (i = 0; i < num; i++)\n  {\n    UInt32 r = w[i];\n    w[i] =\n      D[        Sbox[gb0(r)]] ^\n      D[0x100 + Sbox[gb1(r)]] ^\n      D[0x200 + Sbox[gb2(r)]] ^\n      D[0x300 + Sbox[gb3(r)]];\n  }\n}\n\nstatic void AesEncode32(UInt32 *dest, const UInt32 *src, const UInt32 *w, unsigned numRounds2)\n{\n  UInt32 s[4];\n  UInt32 m[4];\n  s[0] = src[0] ^ w[0];\n  s[1] = src[1] ^ w[1];\n  s[2] = src[2] ^ w[2];\n  s[3] = src[3] ^ w[3];\n  w += 4;\n  for (;;)\n  {\n    HT16(m, s, 0);\n    if (--numRounds2 == 0)\n      break;\n    HT16(s, m, 4);\n    w += 8;\n  }\n  w += 4;\n  FT4(0); FT4(1); FT4(2); FT4(3);\n}\n\nstatic void AesDecode32(UInt32 *dest, const UInt32 *src, const UInt32 *w, unsigned numRounds2)\n{\n  UInt32 s[4];\n  UInt32 m[4];\n  w += numRounds2 * 8;\n  s[0] = src[0] ^ w[0];\n  s[1] = src[1] ^ w[1];\n  s[2] = src[2] ^ w[2];\n  s[3] = src[3] ^ w[3];\n  for (;;)\n  {\n    w -= 8;\n    HD16(m, s, 4);\n    if (--numRounds2 == 0)\n      break;\n    HD16(s, m, 0);\n  }\n  FD4(0); FD4(1); FD4(2); FD4(3);\n}\n\nvoid Aes_Encode32(const CAes *p, UInt32 *dest, const UInt32 *src)\n{\n  AesEncode32(dest, src, p->rkey, p->numRounds2);\n}\n\nvoid Aes_Decode32(const CAes *p, UInt32 *dest, const UInt32 *src)\n{\n  AesDecode32(dest, src, p->rkey, p->numRounds2);\n}\n\nvoid AesCbc_Init(CAesCbc *p, const Byte *iv)\n{\n  unsigned i;\n  for (i = 0; i < 4; i++)\n    p->prev[i] = GetUi32(iv + i * 4);\n}\n\nSizeT AesCbc_Encode(CAesCbc *p, Byte *data, SizeT size)\n{\n  SizeT i;\n  if (size == 0)\n    return 0;\n  if (size < AES_BLOCK_SIZE)\n    return AES_BLOCK_SIZE;\n  size -= AES_BLOCK_SIZE;\n  for (i = 0; i <= size; i += AES_BLOCK_SIZE, data += AES_BLOCK_SIZE)\n  {\n    p->prev[0] ^= GetUi32(data);\n    p->prev[1] ^= GetUi32(data + 4);\n    p->prev[2] ^= GetUi32(data + 8);\n    p->prev[3] ^= GetUi32(data + 12);\n    \n    AesEncode32(p->prev, p->prev, p->aes.rkey, p->aes.numRounds2);\n    \n    SetUi32(data,      p->prev[0]);\n    SetUi32(data + 4,  p->prev[1]);\n    SetUi32(data + 8,  p->prev[2]);\n    SetUi32(data + 12, p->prev[3]);\n  }\n  return i;\n}\n\nSizeT AesCbc_Decode(CAesCbc *p, Byte *data, SizeT size)\n{\n  SizeT i;\n  UInt32 in[4], out[4];\n  if (size == 0)\n    return 0;\n  if (size < AES_BLOCK_SIZE)\n    return AES_BLOCK_SIZE;\n  size -= AES_BLOCK_SIZE;\n  for (i = 0; i <= size; i += AES_BLOCK_SIZE, data += AES_BLOCK_SIZE)\n  {\n    in[0] = GetUi32(data);\n    in[1] = GetUi32(data + 4);\n    in[2] = GetUi32(data + 8);\n    in[3] = GetUi32(data + 12);\n    \n    AesDecode32(out, in, p->aes.rkey, p->aes.numRounds2);\n    \n    SetUi32(data,      p->prev[0] ^ out[0]);\n    SetUi32(data + 4,  p->prev[1] ^ out[1]);\n    SetUi32(data + 8,  p->prev[2] ^ out[2]);\n    SetUi32(data + 12, p->prev[3] ^ out[3]);\n    \n    p->prev[0] = in[0];\n    p->prev[1] = in[1];\n    p->prev[2] = in[2];\n    p->prev[3] = in[3];\n  }\n  return i;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Aes.h",
    "content": "/* Aes.h -- AES encryption / decryption\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#ifndef __AES_H\n#define __AES_H\n\n#include \"Types.h\"\n\n#define AES_BLOCK_SIZE 16\n\ntypedef struct\n{\n  unsigned numRounds2; /* = numRounds / 2 */\n  UInt32 rkey[(14 + 1) * 4];\n} CAes;\n\n/* Call AesGenTables one time before other AES functions */\nvoid AesGenTables(void);\n\n/* keySize = 16 or 24 or 32 (bytes) */\nvoid Aes_SetKeyEncode(CAes *p, const Byte *key, unsigned keySize);\nvoid Aes_SetKeyDecode(CAes *p, const Byte *key, unsigned keySize);\n\n/* Aes_Encode32 and Aes_Decode32 functions work with little-endian words.\n  src and dest are pointers to 4 UInt32 words.\n  arc and dest can point to same block */\nvoid Aes_Encode32(const CAes *p, UInt32 *dest, const UInt32 *src);\nvoid Aes_Decode32(const CAes *p, UInt32 *dest, const UInt32 *src);\n\ntypedef struct\n{\n  UInt32 prev[4];\n  CAes aes;\n} CAesCbc;\n\nvoid AesCbc_Init(CAesCbc *p, const Byte *iv); /* iv size is AES_BLOCK_SIZE */\n\n/* AesCbc_Encode and AesCbc_Decode:\n  if (res <= size): Filter have converted res bytes\n  if (res > size):  Filter have not converted anything. And it needs at\n                    least res = AES_BLOCK_SIZE bytes to convert one block */\n\nSizeT AesCbc_Encode(CAesCbc *p, Byte *data, SizeT size);\nSizeT AesCbc_Decode(CAesCbc *p, Byte *data, SizeT size);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Alloc.h",
    "content": "/* Alloc.h -- Memory allocation functions\n2008-03-13\nIgor Pavlov\nPublic domain */\n\n#ifndef __COMMON_ALLOC_H\n#define __COMMON_ALLOC_H\n\n#include <stddef.h>\n\n#ifdef _WIN32\n\nvoid *MyAlloc(size_t size);\nvoid MyFree(void *address);\n\n\nvoid SetLargePageSize();\n\nvoid *MidAlloc(size_t size);\nvoid MidFree(void *address);\nvoid *BigAlloc(size_t size);\nvoid BigFree(void *address);\n\n#else\n\n#include <stdlib.h> /* malloc */\n\n#define MyAlloc(size) malloc(size)\n#define MyFree(address) free(address)\n#define MidAlloc(size) malloc(size)\n#define MidFree(address) free(address)\n#define BigAlloc(size) malloc(size)\n#define BigFree(address) free(address)\n\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Bra.c",
    "content": "/* Bra.c -- Converters for RISC code\n2008-10-04 : Igor Pavlov : Public domain */\n\n#include \"Bra.h\"\n\nSizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  ip += 8;\n  for (i = 0; i <= size; i += 4)\n  {\n    if (data[i + 3] == 0xEB)\n    {\n      UInt32 dest;\n      UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]);\n      src <<= 2;\n      if (encoding)\n        dest = ip + (UInt32)i + src;\n      else\n        dest = src - (ip + (UInt32)i);\n      dest >>= 2;\n      data[i + 2] = (Byte)(dest >> 16);\n      data[i + 1] = (Byte)(dest >> 8);\n      data[i + 0] = (Byte)dest;\n    }\n  }\n  return i;\n}\n\nSizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  ip += 4;\n  for (i = 0; i <= size; i += 2)\n  {\n    if ((data[i + 1] & 0xF8) == 0xF0 &&\n        (data[i + 3] & 0xF8) == 0xF8)\n    {\n      UInt32 dest;\n      UInt32 src =\n        (((UInt32)data[i + 1] & 0x7) << 19) |\n        ((UInt32)data[i + 0] << 11) |\n        (((UInt32)data[i + 3] & 0x7) << 8) |\n        (data[i + 2]);\n      \n      src <<= 1;\n      if (encoding)\n        dest = ip + (UInt32)i + src;\n      else\n        dest = src - (ip + (UInt32)i);\n      dest >>= 1;\n      \n      data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7));\n      data[i + 0] = (Byte)(dest >> 11);\n      data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7));\n      data[i + 2] = (Byte)dest;\n      i += 2;\n    }\n  }\n  return i;\n}\n\nSizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  for (i = 0; i <= size; i += 4)\n  {\n    if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1)\n    {\n      UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) |\n        ((UInt32)data[i + 1] << 16) |\n        ((UInt32)data[i + 2] << 8) |\n        ((UInt32)data[i + 3] & (~3));\n      \n      UInt32 dest;\n      if (encoding)\n        dest = ip + (UInt32)i + src;\n      else\n        dest = src - (ip + (UInt32)i);\n      data[i + 0] = (Byte)(0x48 | ((dest >> 24) &  0x3));\n      data[i + 1] = (Byte)(dest >> 16);\n      data[i + 2] = (Byte)(dest >> 8);\n      data[i + 3] &= 0x3;\n      data[i + 3] |= dest;\n    }\n  }\n  return i;\n}\n\nSizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  UInt32 i;\n  if (size < 4)\n    return 0;\n  size -= 4;\n  for (i = 0; i <= size; i += 4)\n  {\n    if (data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00 ||\n        data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0)\n    {\n      UInt32 src =\n        ((UInt32)data[i + 0] << 24) |\n        ((UInt32)data[i + 1] << 16) |\n        ((UInt32)data[i + 2] << 8) |\n        ((UInt32)data[i + 3]);\n      UInt32 dest;\n      \n      src <<= 2;\n      if (encoding)\n        dest = ip + i + src;\n      else\n        dest = src - (ip + i);\n      dest >>= 2;\n      \n      dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000;\n\n      data[i + 0] = (Byte)(dest >> 24);\n      data[i + 1] = (Byte)(dest >> 16);\n      data[i + 2] = (Byte)(dest >> 8);\n      data[i + 3] = (Byte)dest;\n    }\n  }\n  return i;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Bra.h",
    "content": "/* Bra.h -- Branch converters for executables\n2008-10-04 : Igor Pavlov : Public domain */\n\n#ifndef __BRA_H\n#define __BRA_H\n\n#include \"Types.h\"\n\n/*\nThese functions convert relative addresses to absolute addresses\nin CALL instructions to increase the compression ratio.\n  \n  In:\n    data     - data buffer\n    size     - size of data\n    ip       - current virtual Instruction Pinter (IP) value\n    state    - state variable for x86 converter\n    encoding - 0 (for decoding), 1 (for encoding)\n  \n  Out:\n    state    - state variable for x86 converter\n\n  Returns:\n    The number of processed bytes. If you call these functions with multiple calls,\n    you must start next call with first byte after block of processed bytes.\n  \n  Type   Endian  Alignment  LookAhead\n  \n  x86    little      1          4\n  ARMT   little      2          2\n  ARM    little      4          0\n  PPC     big        4          0\n  SPARC   big        4          0\n  IA64   little     16          0\n\n  size must be >= Alignment + LookAhead, if it's not last block.\n  If (size < Alignment + LookAhead), converter returns 0.\n\n  Example:\n\n    UInt32 ip = 0;\n    for ()\n    {\n      ; size must be >= Alignment + LookAhead, if it's not last block\n      SizeT processed = Convert(data, size, ip, 1);\n      data += processed;\n      size -= processed;\n      ip += processed;\n    }\n*/\n\n#define x86_Convert_Init(state) { state = 0; }\nSizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding);\nSizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nSizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nSizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nSizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\nSizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Bra86.c",
    "content": "/* Bra86.c -- Converter for x86 code (BCJ)\n2008-10-04 : Igor Pavlov : Public domain */\n\n#include \"Bra.h\"\n\n#define Test86MSByte(b) ((b) == 0 || (b) == 0xFF)\n\nconst Byte kMaskToAllowedStatus[8] = {1, 1, 1, 0, 1, 0, 0, 0};\nconst Byte kMaskToBitNumber[8] = {0, 1, 2, 2, 3, 3, 3, 3};\n\nSizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding)\n{\n  SizeT bufferPos = 0, prevPosT;\n  UInt32 prevMask = *state & 0x7;\n  if (size < 5)\n    return 0;\n  ip += 5;\n  prevPosT = (SizeT)0 - 1;\n\n  for (;;)\n  {\n    Byte *p = data + bufferPos;\n    Byte *limit = data + size - 4;\n    for (; p < limit; p++)\n      if ((*p & 0xFE) == 0xE8)\n        break;\n    bufferPos = (SizeT)(p - data);\n    if (p >= limit)\n      break;\n    prevPosT = bufferPos - prevPosT;\n    if (prevPosT > 3)\n      prevMask = 0;\n    else\n    {\n      prevMask = (prevMask << ((int)prevPosT - 1)) & 0x7;\n      if (prevMask != 0)\n      {\n        Byte b = p[4 - kMaskToBitNumber[prevMask]];\n        if (!kMaskToAllowedStatus[prevMask] || Test86MSByte(b))\n        {\n          prevPosT = bufferPos;\n          prevMask = ((prevMask << 1) & 0x7) | 1;\n          bufferPos++;\n          continue;\n        }\n      }\n    }\n    prevPosT = bufferPos;\n\n    if (Test86MSByte(p[4]))\n    {\n      UInt32 src = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]);\n      UInt32 dest;\n      for (;;)\n      {\n        Byte b;\n        int index;\n        if (encoding)\n          dest = (ip + (UInt32)bufferPos) + src;\n        else\n          dest = src - (ip + (UInt32)bufferPos);\n        if (prevMask == 0)\n          break;\n        index = kMaskToBitNumber[prevMask] * 8;\n        b = (Byte)(dest >> (24 - index));\n        if (!Test86MSByte(b))\n          break;\n        src = dest ^ ((1 << (32 - index)) - 1);\n      }\n      p[4] = (Byte)(~(((dest >> 24) & 1) - 1));\n      p[3] = (Byte)(dest >> 16);\n      p[2] = (Byte)(dest >> 8);\n      p[1] = (Byte)dest;\n      bufferPos += 5;\n    }\n    else\n    {\n      prevMask = ((prevMask << 1) & 0x7) | 1;\n      bufferPos++;\n    }\n  }\n  prevPosT = bufferPos - prevPosT;\n  *state = ((prevPosT > 3) ? 0 : ((prevMask << ((int)prevPosT - 1)) & 0x7));\n  return bufferPos;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/BraIA64.c",
    "content": "/* BraIA64.c -- Converter for IA-64 code\n2008-10-04 : Igor Pavlov : Public domain */\n\n#include \"Bra.h\"\n\nstatic const Byte kBranchTable[32] =\n{\n  0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0,\n  4, 4, 6, 6, 0, 0, 7, 7,\n  4, 4, 0, 0, 4, 4, 0, 0\n};\n\nSizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\n{\n  SizeT i;\n  if (size < 16)\n    return 0;\n  size -= 16;\n  for (i = 0; i <= size; i += 16)\n  {\n    UInt32 instrTemplate = data[i] & 0x1F;\n    UInt32 mask = kBranchTable[instrTemplate];\n    UInt32 bitPos = 5;\n    int slot;\n    for (slot = 0; slot < 3; slot++, bitPos += 41)\n    {\n      UInt32 bytePos, bitRes;\n      UInt64 instruction, instNorm;\n      int j;\n      if (((mask >> slot) & 1) == 0)\n        continue;\n      bytePos = (bitPos >> 3);\n      bitRes = bitPos & 0x7;\n      instruction = 0;\n      for (j = 0; j < 6; j++)\n        instruction += (UInt64)data[i + j + bytePos] << (8 * j);\n\n      instNorm = instruction >> bitRes;\n      if (((instNorm >> 37) & 0xF) == 0x5 && ((instNorm >> 9) & 0x7) == 0)\n      {\n        UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF);\n        UInt32 dest;\n        src |= ((UInt32)(instNorm >> 36) & 1) << 20;\n        \n        src <<= 4;\n        \n        if (encoding)\n          dest = ip + (UInt32)i + src;\n        else\n          dest = src - (ip + (UInt32)i);\n        \n        dest >>= 4;\n        \n        instNorm &= ~((UInt64)(0x8FFFFF) << 13);\n        instNorm |= ((UInt64)(dest & 0xFFFFF) << 13);\n        instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20));\n        \n        instruction &= (1 << bitRes) - 1;\n        instruction |= (instNorm << bitRes);\n        for (j = 0; j < 6; j++)\n          data[i + j + bytePos] = (Byte)(instruction >> (8 * j));\n      }\n    }\n  }\n  return i;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/BwtSort.c",
    "content": "/* BwtSort.c -- BWT block sorting\n2008-08-17\nIgor Pavlov\nPublic domain */\n\n#include \"BwtSort.h\"\n#include \"Sort.h\"\n\n/* #define BLOCK_SORT_USE_HEAP_SORT */\n\n#define NO_INLINE MY_FAST_CALL\n\n/* Don't change it !!! */\n#define kNumHashBytes 2\n#define kNumHashValues (1 << (kNumHashBytes * 8))\n\n/* kNumRefBitsMax must be < (kNumHashBytes * 8) = 16 */\n#define kNumRefBitsMax 12\n\n#define BS_TEMP_SIZE kNumHashValues\n\n#ifdef BLOCK_SORT_EXTERNAL_FLAGS\n\n/* 32 Flags in UInt32 word */\n#define kNumFlagsBits 5\n#define kNumFlagsInWord (1 << kNumFlagsBits)\n#define kFlagsMask (kNumFlagsInWord - 1)\n#define kAllFlags 0xFFFFFFFF\n\n#else\n\n#define kNumBitsMax 20\n#define kIndexMask ((1 << kNumBitsMax) - 1)\n#define kNumExtraBits (32 - kNumBitsMax)\n#define kNumExtra0Bits (kNumExtraBits - 2)\n#define kNumExtra0Mask ((1 << kNumExtra0Bits) - 1)\n\n#define SetFinishedGroupSize(p, size) \\\n  {  *(p) |= ((((size) - 1) & kNumExtra0Mask) << kNumBitsMax); \\\n    if ((size) > (1 << kNumExtra0Bits)) { \\\n    *(p) |= 0x40000000;  *((p) + 1) |= ((((size) - 1)>> kNumExtra0Bits) << kNumBitsMax); } } \\\n\nstatic void SetGroupSize(UInt32 *p, UInt32 size)\n{\n  if (--size == 0)\n    return;\n  *p |= 0x80000000 | ((size & kNumExtra0Mask) << kNumBitsMax);\n  if (size >= (1 << kNumExtra0Bits))\n  {\n    *p |= 0x40000000;\n    p[1] |= ((size >> kNumExtra0Bits) << kNumBitsMax);\n  }\n}\n\n#endif\n\n/*\nSortGroup - is recursive Range-Sort function with HeapSort optimization for small blocks\n  \"range\" is not real range. It's only for optimization.\nreturns: 1 - if there are groups, 0 - no more groups\n*/\n\nUInt32 NO_INLINE SortGroup(UInt32 BlockSize, UInt32 NumSortedBytes, UInt32 groupOffset, UInt32 groupSize, int NumRefBits, UInt32 *Indices\n  #ifndef BLOCK_SORT_USE_HEAP_SORT\n  , UInt32 left, UInt32 range\n  #endif\n  )\n{\n  UInt32 *ind2 = Indices + groupOffset;\n  UInt32 *Groups;\n  if (groupSize <= 1)\n  {\n    /*\n    #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n    SetFinishedGroupSize(ind2, 1);\n    #endif\n    */\n    return 0;\n  }\n  Groups = Indices + BlockSize + BS_TEMP_SIZE;\n  if (groupSize <= ((UInt32)1 << NumRefBits)\n      #ifndef BLOCK_SORT_USE_HEAP_SORT\n      && groupSize <= range\n      #endif\n      )\n  {\n    UInt32 *temp = Indices + BlockSize;\n    UInt32 j;\n    UInt32 mask, thereAreGroups, group, cg;\n    {\n      UInt32 gPrev;\n      UInt32 gRes = 0;\n      {\n        UInt32 sp = ind2[0] + NumSortedBytes;\n        if (sp >= BlockSize) sp -= BlockSize;\n        gPrev = Groups[sp];\n        temp[0] = (gPrev << NumRefBits);\n      }\n      \n      for (j = 1; j < groupSize; j++)\n      {\n        UInt32 sp = ind2[j] + NumSortedBytes;\n        UInt32 g;\n        if (sp >= BlockSize) sp -= BlockSize;\n        g = Groups[sp];\n        temp[j] = (g << NumRefBits) | j;\n        gRes |= (gPrev ^ g);\n      }\n      if (gRes == 0)\n      {\n        #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n        SetGroupSize(ind2, groupSize);\n        #endif\n        return 1;\n      }\n    }\n    \n    HeapSort(temp, groupSize);\n    mask = ((1 << NumRefBits) - 1);\n    thereAreGroups = 0;\n    \n    group = groupOffset;\n    cg = (temp[0] >> NumRefBits);\n    temp[0] = ind2[temp[0] & mask];\n\n    {\n    #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n    UInt32 *Flags = Groups + BlockSize;\n    #else\n    UInt32 prevGroupStart = 0;\n    #endif\n    \n    for (j = 1; j < groupSize; j++)\n    {\n      UInt32 val = temp[j];\n      UInt32 cgCur = (val >> NumRefBits);\n      \n      if (cgCur != cg)\n      {\n        cg = cgCur;\n        group = groupOffset + j;\n\n        #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n        {\n        UInt32 t = group - 1;\n        Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));\n        }\n        #else\n        SetGroupSize(temp + prevGroupStart, j - prevGroupStart);\n        prevGroupStart = j;\n        #endif\n      }\n      else\n        thereAreGroups = 1;\n      {\n      UInt32 ind = ind2[val & mask];\n      temp[j] = ind;\n      Groups[ind] = group;\n      }\n    }\n\n    #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n    SetGroupSize(temp + prevGroupStart, j - prevGroupStart);\n    #endif\n    }\n\n    for (j = 0; j < groupSize; j++)\n      ind2[j] = temp[j];\n    return thereAreGroups;\n  }\n\n  /* Check that all strings are in one group (cannot sort) */\n  {\n    UInt32 group, j;\n    UInt32 sp = ind2[0] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;\n    group = Groups[sp];\n    for (j = 1; j < groupSize; j++)\n    {\n      sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;\n      if (Groups[sp] != group)\n        break;\n    }\n    if (j == groupSize)\n    {\n      #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n      SetGroupSize(ind2, groupSize);\n      #endif\n      return 1;\n    }\n  }\n\n  #ifndef BLOCK_SORT_USE_HEAP_SORT\n  {\n  /* ---------- Range Sort ---------- */\n  UInt32 i;\n  UInt32 mid;\n  for (;;)\n  {\n    UInt32 j;\n    if (range <= 1)\n    {\n      #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n      SetGroupSize(ind2, groupSize);\n      #endif\n      return 1;\n    }\n    mid = left + ((range + 1) >> 1);\n    j = groupSize;\n    i = 0;\n    do\n    {\n      UInt32 sp = ind2[i] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;\n      if (Groups[sp] >= mid)\n      {\n        for (j--; j > i; j--)\n        {\n          sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;\n          if (Groups[sp] < mid)\n          {\n            UInt32 temp = ind2[i]; ind2[i] = ind2[j]; ind2[j] = temp;\n            break;\n          }\n        }\n        if (i >= j)\n          break;\n      }\n    }\n    while (++i < j);\n    if (i == 0)\n    {\n      range = range - (mid - left);\n      left = mid;\n    }\n    else if (i == groupSize)\n      range = (mid - left);\n    else\n      break;\n  }\n\n  #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n  {\n    UInt32 t = (groupOffset + i - 1);\n    UInt32 *Flags = Groups + BlockSize;\n    Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));\n  }\n  #endif\n\n  {\n    UInt32 j;\n    for (j = i; j < groupSize; j++)\n      Groups[ind2[j]] = groupOffset + i;\n  }\n\n  {\n  UInt32 res = SortGroup(BlockSize, NumSortedBytes, groupOffset, i, NumRefBits, Indices, left, mid - left);\n  return res | SortGroup(BlockSize, NumSortedBytes, groupOffset + i, groupSize - i, NumRefBits, Indices, mid, range - (mid - left));\n  }\n\n  }\n\n  #else\n\n  /* ---------- Heap Sort ---------- */\n\n  {\n    UInt32 j;\n    for (j = 0; j < groupSize; j++)\n    {\n      UInt32 sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;\n      ind2[j] = sp;\n    }\n\n    HeapSortRef(ind2, Groups, groupSize);\n\n    /* Write Flags */\n    {\n    UInt32 sp = ind2[0];\n    UInt32 group = Groups[sp];\n\n    #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n    UInt32 *Flags = Groups + BlockSize;\n    #else\n    UInt32 prevGroupStart = 0;\n    #endif\n\n    for (j = 1; j < groupSize; j++)\n    {\n      sp = ind2[j];\n      if (Groups[sp] != group)\n      {\n        group = Groups[sp];\n        #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n        {\n        UInt32 t = groupOffset + j - 1;\n        Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));\n        }\n        #else\n        SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart);\n        prevGroupStart = j;\n        #endif\n      }\n    }\n\n    #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n    SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart);\n    #endif\n    }\n    {\n    /* Write new Groups values and Check that there are groups */\n    UInt32 thereAreGroups = 0;\n    for (j = 0; j < groupSize; j++)\n    {\n      UInt32 group = groupOffset + j;\n      #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n      UInt32 subGroupSize = ((ind2[j] & ~0xC0000000) >> kNumBitsMax);\n      if ((ind2[j] & 0x40000000) != 0)\n        subGroupSize += ((ind2[j + 1] >> kNumBitsMax) << kNumExtra0Bits);\n      subGroupSize++;\n      for (;;)\n      {\n        UInt32 original = ind2[j];\n        UInt32 sp = original & kIndexMask;\n        if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes;\n        ind2[j] = sp | (original & ~kIndexMask);\n        Groups[sp] = group;\n        if (--subGroupSize == 0)\n          break;\n        j++;\n        thereAreGroups = 1;\n      }\n      #else\n      UInt32 *Flags = Groups + BlockSize;\n      for (;;)\n      {\n        UInt32 sp = ind2[j]; if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes;\n        ind2[j] = sp;\n        Groups[sp] = group;\n        if ((Flags[(groupOffset + j) >> kNumFlagsBits] & (1 << ((groupOffset + j) & kFlagsMask))) == 0)\n          break;\n        j++;\n        thereAreGroups = 1;\n      }\n      #endif\n    }\n    return thereAreGroups;\n    }\n  }\n  #endif\n}\n\n/* conditions: blockSize > 0 */\nUInt32 BlockSort(UInt32 *Indices, const Byte *data, UInt32 blockSize)\n{\n  UInt32 *counters = Indices + blockSize;\n  UInt32 i;\n  UInt32 *Groups;\n  #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n  UInt32 *Flags;\n  #endif\n\n  /* Radix-Sort for 2 bytes */\n  for (i = 0; i < kNumHashValues; i++)\n    counters[i] = 0;\n  for (i = 0; i < blockSize - 1; i++)\n    counters[((UInt32)data[i] << 8) | data[i + 1]]++;\n  counters[((UInt32)data[i] << 8) | data[0]]++;\n\n  Groups = counters + BS_TEMP_SIZE;\n  #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n  Flags = Groups + blockSize;\n    {\n      UInt32 numWords = (blockSize + kFlagsMask) >> kNumFlagsBits;\n      for (i = 0; i < numWords; i++)\n        Flags[i] = kAllFlags;\n    }\n  #endif\n\n  {\n    UInt32 sum = 0;\n    for (i = 0; i < kNumHashValues; i++)\n    {\n      UInt32 groupSize = counters[i];\n      if (groupSize > 0)\n      {\n        #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n        UInt32 t = sum + groupSize - 1;\n        Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));\n        #endif\n        sum += groupSize;\n      }\n      counters[i] = sum - groupSize;\n    }\n\n    for (i = 0; i < blockSize - 1; i++)\n      Groups[i] = counters[((UInt32)data[i] << 8) | data[i + 1]];\n    Groups[i] = counters[((UInt32)data[i] << 8) | data[0]];\n\n    for (i = 0; i < blockSize - 1; i++)\n      Indices[counters[((UInt32)data[i] << 8) | data[i + 1]]++] = i;\n    Indices[counters[((UInt32)data[i] << 8) | data[0]]++] = i;\n    \n    #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n    {\n    UInt32 prev = 0;\n    for (i = 0; i < kNumHashValues; i++)\n    {\n      UInt32 prevGroupSize = counters[i] - prev;\n      if (prevGroupSize == 0)\n        continue;\n      SetGroupSize(Indices + prev, prevGroupSize);\n      prev = counters[i];\n    }\n    }\n    #endif\n  }\n\n  {\n  int NumRefBits;\n  UInt32 NumSortedBytes;\n  for (NumRefBits = 0; ((blockSize - 1) >> NumRefBits) != 0; NumRefBits++);\n  NumRefBits = 32 - NumRefBits;\n  if (NumRefBits > kNumRefBitsMax)\n    NumRefBits = kNumRefBitsMax;\n\n  for (NumSortedBytes = kNumHashBytes; ; NumSortedBytes <<= 1)\n  {\n    #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n    UInt32 finishedGroupSize = 0;\n    #endif\n    UInt32 newLimit = 0;\n    for (i = 0; i < blockSize;)\n    {\n      UInt32 groupSize;\n      #ifdef BLOCK_SORT_EXTERNAL_FLAGS\n\n      if ((Flags[i >> kNumFlagsBits] & (1 << (i & kFlagsMask))) == 0)\n      {\n        i++;\n        continue;\n      }\n      for (groupSize = 1;\n        (Flags[(i + groupSize) >> kNumFlagsBits] & (1 << ((i + groupSize) & kFlagsMask))) != 0;\n        groupSize++);\n      \n      groupSize++;\n\n      #else\n\n      groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax);\n      {\n      Bool finishedGroup = ((Indices[i] & 0x80000000) == 0);\n      if ((Indices[i] & 0x40000000) != 0)\n      {\n        groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits);\n        Indices[i + 1] &= kIndexMask;\n      }\n      Indices[i] &= kIndexMask;\n      groupSize++;\n      if (finishedGroup || groupSize == 1)\n      {\n        Indices[i - finishedGroupSize] &= kIndexMask;\n        if (finishedGroupSize > 1)\n          Indices[i - finishedGroupSize + 1] &= kIndexMask;\n        {\n        UInt32 newGroupSize = groupSize + finishedGroupSize;\n        SetFinishedGroupSize(Indices + i - finishedGroupSize, newGroupSize);\n        finishedGroupSize = newGroupSize;\n        }\n        i += groupSize;\n        continue;\n      }\n      finishedGroupSize = 0;\n      }\n\n      #endif\n      \n      if (NumSortedBytes >= blockSize)\n      {\n        UInt32 j;\n        for (j = 0; j < groupSize; j++)\n        {\n          UInt32 t = (i + j);\n          /* Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); */\n          Groups[Indices[t]] = t;\n        }\n      }\n      else\n        if (SortGroup(blockSize, NumSortedBytes, i, groupSize, NumRefBits, Indices\n          #ifndef BLOCK_SORT_USE_HEAP_SORT\n          , 0, blockSize\n          #endif\n          ) != 0)\n          newLimit = i + groupSize;\n      i += groupSize;\n    }\n    if (newLimit == 0)\n      break;\n  }\n  }\n  #ifndef BLOCK_SORT_EXTERNAL_FLAGS\n  for (i = 0; i < blockSize;)\n  {\n    UInt32 groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax);\n    if ((Indices[i] & 0x40000000) != 0)\n    {\n      groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits);\n      Indices[i + 1] &= kIndexMask;\n    }\n    Indices[i] &= kIndexMask;\n    groupSize++;\n    i += groupSize;\n  }\n  #endif\n  return Groups[0];\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/BwtSort.h",
    "content": "/* BwtSort.h -- BWT block sorting\n2008-03-26\nIgor Pavlov\nPublic domain */\n\n#ifndef __BWTSORT_H\n#define __BWTSORT_H\n\n#include \"Types.h\"\n\n/* use BLOCK_SORT_EXTERNAL_FLAGS if blockSize can be > 1M */\n/* #define BLOCK_SORT_EXTERNAL_FLAGS */\n\n#ifdef BLOCK_SORT_EXTERNAL_FLAGS\n#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) ((((blockSize) + 31) >> 5))\n#else\n#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) 0\n#endif\n\n#define BLOCK_SORT_BUF_SIZE(blockSize) ((blockSize) * 2 + BLOCK_SORT_EXTERNAL_SIZE(blockSize) + (1 << 16))\n\nUInt32 BlockSort(UInt32 *indices, const Byte *data, UInt32 blockSize);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/CpuArch.h",
    "content": "/* CpuArch.h\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#ifndef __CPUARCH_H\n#define __CPUARCH_H\n\n/*\nLITTLE_ENDIAN_UNALIGN means:\n  1) CPU is LITTLE_ENDIAN\n  2) it's allowed to make unaligned memory accesses\nif LITTLE_ENDIAN_UNALIGN is not defined, it means that we don't know\nabout these properties of platform.\n*/\n\n#if defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__)\n#define LITTLE_ENDIAN_UNALIGN\n#endif\n\n#ifdef LITTLE_ENDIAN_UNALIGN\n\n#define GetUi16(p) (*(const UInt16 *)(p))\n#define GetUi32(p) (*(const UInt32 *)(p))\n#define GetUi64(p) (*(const UInt64 *)(p))\n#define SetUi32(p, d) *(UInt32 *)(p) = (d);\n\n#else\n\n#define GetUi16(p) (((const Byte *)(p))[0] | ((UInt16)((const Byte *)(p))[1] << 8))\n\n#define GetUi32(p) ( \\\n             ((const Byte *)(p))[0]        | \\\n    ((UInt32)((const Byte *)(p))[1] <<  8) | \\\n    ((UInt32)((const Byte *)(p))[2] << 16) | \\\n    ((UInt32)((const Byte *)(p))[3] << 24))\n\n#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32))\n\n#define SetUi32(p, d) { UInt32 _x_ = (d); \\\n    ((Byte *)(p))[0] = (Byte)_x_; \\\n    ((Byte *)(p))[1] = (Byte)(_x_ >> 8); \\\n    ((Byte *)(p))[2] = (Byte)(_x_ >> 16); \\\n    ((Byte *)(p))[3] = (Byte)(_x_ >> 24); }\n\n#endif\n\n#if defined(LITTLE_ENDIAN_UNALIGN) && defined(_WIN64) && (_MSC_VER >= 1300)\n\n#pragma intrinsic(_byteswap_ulong)\n#pragma intrinsic(_byteswap_uint64)\n#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p))\n#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p))\n\n#else\n\n#define GetBe32(p) ( \\\n    ((UInt32)((const Byte *)(p))[0] << 24) | \\\n    ((UInt32)((const Byte *)(p))[1] << 16) | \\\n    ((UInt32)((const Byte *)(p))[2] <<  8) | \\\n             ((const Byte *)(p))[3] )\n\n#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4))\n\n#endif\n\n#define GetBe16(p) (((UInt16)((const Byte *)(p))[0] << 8) | ((const Byte *)(p))[1])\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/HuffEnc.c",
    "content": "/* HuffEnc.c -- functions for Huffman encoding\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#include \"HuffEnc.h\"\n#include \"Sort.h\"\n\n#define kMaxLen 16\n#define NUM_BITS 10\n#define MASK ((1 << NUM_BITS) - 1)\n\n#define NUM_COUNTERS 64\n\n#define HUFFMAN_SPEED_OPT\n\nvoid Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 numSymbols, UInt32 maxLen)\n{\n  UInt32 num = 0;\n  /* if (maxLen > 10) maxLen = 10; */\n  {\n    UInt32 i;\n    \n    #ifdef HUFFMAN_SPEED_OPT\n    \n    UInt32 counters[NUM_COUNTERS];\n    for (i = 0; i < NUM_COUNTERS; i++)\n      counters[i] = 0;\n    for (i = 0; i < numSymbols; i++)\n    {\n      UInt32 freq = freqs[i];\n      counters[(freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1]++;\n    }\n \n    for (i = 1; i < NUM_COUNTERS; i++)\n    {\n      UInt32 temp = counters[i];\n      counters[i] = num;\n      num += temp;\n    }\n\n    for (i = 0; i < numSymbols; i++)\n    {\n      UInt32 freq = freqs[i];\n      if (freq == 0)\n        lens[i] = 0;\n      else\n        p[counters[((freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1)]++] = i | (freq << NUM_BITS);\n    }\n    counters[0] = 0;\n    HeapSort(p + counters[NUM_COUNTERS - 2], counters[NUM_COUNTERS - 1] - counters[NUM_COUNTERS - 2]);\n    \n    #else\n\n    for (i = 0; i < numSymbols; i++)\n    {\n      UInt32 freq = freqs[i];\n      if (freq == 0)\n        lens[i] = 0;\n      else\n        p[num++] = i | (freq << NUM_BITS);\n    }\n    HeapSort(p, num);\n\n    #endif\n  }\n\n  if (num < 2)\n  {\n    int minCode = 0;\n    int maxCode = 1;\n    if (num == 1)\n    {\n      maxCode = (int)(p[0] & MASK);\n      if (maxCode == 0)\n        maxCode++;\n    }\n    p[minCode] = 0;\n    p[maxCode] = 1;\n    lens[minCode] = lens[maxCode] = 1;\n    return;\n  }\n  \n  {\n    UInt32 b, e, i;\n  \n    i = b = e = 0;\n    do\n    {\n      UInt32 n, m, freq;\n      n = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;\n      freq = (p[n] & ~MASK);\n      p[n] = (p[n] & MASK) | (e << NUM_BITS);\n      m = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;\n      freq += (p[m] & ~MASK);\n      p[m] = (p[m] & MASK) | (e << NUM_BITS);\n      p[e] = (p[e] & MASK) | freq;\n      e++;\n    }\n    while (num - e > 1);\n    \n    {\n      UInt32 lenCounters[kMaxLen + 1];\n      for (i = 0; i <= kMaxLen; i++)\n        lenCounters[i] = 0;\n      \n      p[--e] &= MASK;\n      lenCounters[1] = 2;\n      while (e > 0)\n      {\n        UInt32 len = (p[p[--e] >> NUM_BITS] >> NUM_BITS) + 1;\n        p[e] = (p[e] & MASK) | (len << NUM_BITS);\n        if (len >= maxLen)\n          for (len = maxLen - 1; lenCounters[len] == 0; len--);\n        lenCounters[len]--;\n        lenCounters[len + 1] += 2;\n      }\n      \n      {\n        UInt32 len;\n        i = 0;\n        for (len = maxLen; len != 0; len--)\n        {\n          UInt32 num;\n          for (num = lenCounters[len]; num != 0; num--)\n            lens[p[i++] & MASK] = (Byte)len;\n        }\n      }\n      \n      {\n        UInt32 nextCodes[kMaxLen + 1];\n        {\n          UInt32 code = 0;\n          UInt32 len;\n          for (len = 1; len <= kMaxLen; len++)\n            nextCodes[len] = code = (code + lenCounters[len - 1]) << 1;\n        }\n        /* if (code + lenCounters[kMaxLen] - 1 != (1 << kMaxLen) - 1) throw 1; */\n\n        {\n          UInt32 i;\n          for (i = 0; i < numSymbols; i++)\n            p[i] = nextCodes[lens[i]]++;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/HuffEnc.h",
    "content": "/* HuffEnc.h -- functions for Huffman encoding\n2008-03-26\nIgor Pavlov\nPublic domain */\n\n#ifndef __HUFFENC_H\n#define __HUFFENC_H\n\n#include \"Types.h\"\n\n/*\nConditions:\n  num <= 1024 = 2 ^ NUM_BITS\n  Sum(freqs) < 4M = 2 ^ (32 - NUM_BITS)\n  maxLen <= 16 = kMaxLen\n  Num_Items(p) >= HUFFMAN_TEMP_SIZE(num)\n*/\n \nvoid Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 num, UInt32 maxLen);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzFind.c",
    "content": "/* LzFind.c -- Match finder for LZ algorithms\n2008-10-04 : Igor Pavlov : Public domain */\n\n#include <string.h>\n\n#include \"LzFind.h\"\n#include \"LzHash.h\"\n\n#define kEmptyHashValue 0\n#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)\n#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */\n#define kNormalizeMask (~(kNormalizeStepMin - 1))\n#define kMaxHistorySize ((UInt32)3 << 30)\n\n#define kStartMaxLen 3\n\nstatic void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)\n{\n  if (!p->directInput)\n  {\n    alloc->Free(alloc, p->bufferBase);\n    p->bufferBase = 0;\n  }\n}\n\n/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */\n\nstatic int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)\n{\n  UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;\n  if (p->directInput)\n  {\n    p->blockSize = blockSize;\n    return 1;\n  }\n  if (p->bufferBase == 0 || p->blockSize != blockSize)\n  {\n    LzInWindow_Free(p, alloc);\n    p->blockSize = blockSize;\n    p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);\n  }\n  return (p->bufferBase != 0);\n}\n\nByte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }\nByte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }\n\nUInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }\n\nvoid MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)\n{\n  p->posLimit -= subValue;\n  p->pos -= subValue;\n  p->streamPos -= subValue;\n}\n\nstatic void MatchFinder_ReadBlock(CMatchFinder *p)\n{\n  if (p->streamEndWasReached || p->result != SZ_OK)\n    return;\n  for (;;)\n  {\n    Byte *dest = p->buffer + (p->streamPos - p->pos);\n    size_t size = (p->bufferBase + p->blockSize - dest);\n    if (size == 0)\n      return;\n    p->result = p->stream->Read(p->stream, dest, &size);\n    if (p->result != SZ_OK)\n      return;\n    if (size == 0)\n    {\n      p->streamEndWasReached = 1;\n      return;\n    }\n    p->streamPos += (UInt32)size;\n    if (p->streamPos - p->pos > p->keepSizeAfter)\n      return;\n  }\n}\n\nvoid MatchFinder_MoveBlock(CMatchFinder *p)\n{\n  memmove(p->bufferBase,\n    p->buffer - p->keepSizeBefore,\n    (size_t)(p->streamPos - p->pos + p->keepSizeBefore));\n  p->buffer = p->bufferBase + p->keepSizeBefore;\n}\n\nint MatchFinder_NeedMove(CMatchFinder *p)\n{\n  /* if (p->streamEndWasReached) return 0; */\n  return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);\n}\n\nvoid MatchFinder_ReadIfRequired(CMatchFinder *p)\n{\n  if (p->streamEndWasReached)\n    return;\n  if (p->keepSizeAfter >= p->streamPos - p->pos)\n    MatchFinder_ReadBlock(p);\n}\n\nstatic void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)\n{\n  if (MatchFinder_NeedMove(p))\n    MatchFinder_MoveBlock(p);\n  MatchFinder_ReadBlock(p);\n}\n\nstatic void MatchFinder_SetDefaultSettings(CMatchFinder *p)\n{\n  p->cutValue = 32;\n  p->btMode = 1;\n  p->numHashBytes = 4;\n  /* p->skipModeBits = 0; */\n  p->directInput = 0;\n  p->bigHash = 0;\n}\n\n#define kCrcPoly 0xEDB88320\n\nvoid MatchFinder_Construct(CMatchFinder *p)\n{\n  UInt32 i;\n  p->bufferBase = 0;\n  p->directInput = 0;\n  p->hash = 0;\n  MatchFinder_SetDefaultSettings(p);\n\n  for (i = 0; i < 256; i++)\n  {\n    UInt32 r = i;\n    int j;\n    for (j = 0; j < 8; j++)\n      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));\n    p->crc[i] = r;\n  }\n}\n\nstatic void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->hash);\n  p->hash = 0;\n}\n\nvoid MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)\n{\n  MatchFinder_FreeThisClassMemory(p, alloc);\n  LzInWindow_Free(p, alloc);\n}\n\nstatic CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)\n{\n  size_t sizeInBytes = (size_t)num * sizeof(CLzRef);\n  if (sizeInBytes / sizeof(CLzRef) != num)\n    return 0;\n  return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);\n}\n\nint MatchFinder_Create(CMatchFinder *p, UInt32 historySize,\n    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,\n    ISzAlloc *alloc)\n{\n  UInt32 sizeReserv;\n  if (historySize > kMaxHistorySize)\n  {\n    MatchFinder_Free(p, alloc);\n    return 0;\n  }\n  sizeReserv = historySize >> 1;\n  if (historySize > ((UInt32)2 << 30))\n    sizeReserv = historySize >> 2;\n  sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);\n\n  p->keepSizeBefore = historySize + keepAddBufferBefore + 1;\n  p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;\n  /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */\n  if (LzInWindow_Create(p, sizeReserv, alloc))\n  {\n    UInt32 newCyclicBufferSize = (historySize /* >> p->skipModeBits */) + 1;\n    UInt32 hs;\n    p->matchMaxLen = matchMaxLen;\n    {\n      p->fixedHashSize = 0;\n      if (p->numHashBytes == 2)\n        hs = (1 << 16) - 1;\n      else\n      {\n        hs = historySize - 1;\n        hs |= (hs >> 1);\n        hs |= (hs >> 2);\n        hs |= (hs >> 4);\n        hs |= (hs >> 8);\n        hs >>= 1;\n        /* hs >>= p->skipModeBits; */\n        hs |= 0xFFFF; /* don't change it! It's required for Deflate */\n        if (hs > (1 << 24))\n        {\n          if (p->numHashBytes == 3)\n            hs = (1 << 24) - 1;\n          else\n            hs >>= 1;\n        }\n      }\n      p->hashMask = hs;\n      hs++;\n      if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;\n      if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;\n      if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;\n      hs += p->fixedHashSize;\n    }\n\n    {\n      UInt32 prevSize = p->hashSizeSum + p->numSons;\n      UInt32 newSize;\n      p->historySize = historySize;\n      p->hashSizeSum = hs;\n      p->cyclicBufferSize = newCyclicBufferSize;\n      p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);\n      newSize = p->hashSizeSum + p->numSons;\n      if (p->hash != 0 && prevSize == newSize)\n        return 1;\n      MatchFinder_FreeThisClassMemory(p, alloc);\n      p->hash = AllocRefs(newSize, alloc);\n      if (p->hash != 0)\n      {\n        p->son = p->hash + p->hashSizeSum;\n        return 1;\n      }\n    }\n  }\n  MatchFinder_Free(p, alloc);\n  return 0;\n}\n\nstatic void MatchFinder_SetLimits(CMatchFinder *p)\n{\n  UInt32 limit = kMaxValForNormalize - p->pos;\n  UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;\n  if (limit2 < limit)\n    limit = limit2;\n  limit2 = p->streamPos - p->pos;\n  if (limit2 <= p->keepSizeAfter)\n  {\n    if (limit2 > 0)\n      limit2 = 1;\n  }\n  else\n    limit2 -= p->keepSizeAfter;\n  if (limit2 < limit)\n    limit = limit2;\n  {\n    UInt32 lenLimit = p->streamPos - p->pos;\n    if (lenLimit > p->matchMaxLen)\n      lenLimit = p->matchMaxLen;\n    p->lenLimit = lenLimit;\n  }\n  p->posLimit = p->pos + limit;\n}\n\nvoid MatchFinder_Init(CMatchFinder *p)\n{\n  UInt32 i;\n  for (i = 0; i < p->hashSizeSum; i++)\n    p->hash[i] = kEmptyHashValue;\n  p->cyclicBufferPos = 0;\n  p->buffer = p->bufferBase;\n  p->pos = p->streamPos = p->cyclicBufferSize;\n  p->result = SZ_OK;\n  p->streamEndWasReached = 0;\n  MatchFinder_ReadBlock(p);\n  MatchFinder_SetLimits(p);\n}\n\nstatic UInt32 MatchFinder_GetSubValue(CMatchFinder *p)\n{\n  return (p->pos - p->historySize - 1) & kNormalizeMask;\n}\n\nvoid MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)\n{\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n  {\n    UInt32 value = items[i];\n    if (value <= subValue)\n      value = kEmptyHashValue;\n    else\n      value -= subValue;\n    items[i] = value;\n  }\n}\n\nstatic void MatchFinder_Normalize(CMatchFinder *p)\n{\n  UInt32 subValue = MatchFinder_GetSubValue(p);\n  MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);\n  MatchFinder_ReduceOffsets(p, subValue);\n}\n\nstatic void MatchFinder_CheckLimits(CMatchFinder *p)\n{\n  if (p->pos == kMaxValForNormalize)\n    MatchFinder_Normalize(p);\n  if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)\n    MatchFinder_CheckAndMoveAndRead(p);\n  if (p->cyclicBufferPos == p->cyclicBufferSize)\n    p->cyclicBufferPos = 0;\n  MatchFinder_SetLimits(p);\n}\n\nstatic UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,\n    UInt32 *distances, UInt32 maxLen)\n{\n  son[_cyclicBufferPos] = curMatch;\n  for (;;)\n  {\n    UInt32 delta = pos - curMatch;\n    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n      return distances;\n    {\n      const Byte *pb = cur - delta;\n      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];\n      if (pb[maxLen] == cur[maxLen] && *pb == *cur)\n      {\n        UInt32 len = 0;\n        while (++len != lenLimit)\n          if (pb[len] != cur[len])\n            break;\n        if (maxLen < len)\n        {\n          *distances++ = maxLen = len;\n          *distances++ = delta - 1;\n          if (len == lenLimit)\n            return distances;\n        }\n      }\n    }\n  }\n}\n\nUInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,\n    UInt32 *distances, UInt32 maxLen)\n{\n  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;\n  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);\n  UInt32 len0 = 0, len1 = 0;\n  for (;;)\n  {\n    UInt32 delta = pos - curMatch;\n    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n    {\n      *ptr0 = *ptr1 = kEmptyHashValue;\n      return distances;\n    }\n    {\n      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);\n      const Byte *pb = cur - delta;\n      UInt32 len = (len0 < len1 ? len0 : len1);\n      if (pb[len] == cur[len])\n      {\n        if (++len != lenLimit && pb[len] == cur[len])\n          while (++len != lenLimit)\n            if (pb[len] != cur[len])\n              break;\n        if (maxLen < len)\n        {\n          *distances++ = maxLen = len;\n          *distances++ = delta - 1;\n          if (len == lenLimit)\n          {\n            *ptr1 = pair[0];\n            *ptr0 = pair[1];\n            return distances;\n          }\n        }\n      }\n      if (pb[len] < cur[len])\n      {\n        *ptr1 = curMatch;\n        ptr1 = pair + 1;\n        curMatch = *ptr1;\n        len1 = len;\n      }\n      else\n      {\n        *ptr0 = curMatch;\n        ptr0 = pair;\n        curMatch = *ptr0;\n        len0 = len;\n      }\n    }\n  }\n}\n\nstatic void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)\n{\n  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;\n  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);\n  UInt32 len0 = 0, len1 = 0;\n  for (;;)\n  {\n    UInt32 delta = pos - curMatch;\n    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n    {\n      *ptr0 = *ptr1 = kEmptyHashValue;\n      return;\n    }\n    {\n      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);\n      const Byte *pb = cur - delta;\n      UInt32 len = (len0 < len1 ? len0 : len1);\n      if (pb[len] == cur[len])\n      {\n        while (++len != lenLimit)\n          if (pb[len] != cur[len])\n            break;\n        {\n          if (len == lenLimit)\n          {\n            *ptr1 = pair[0];\n            *ptr0 = pair[1];\n            return;\n          }\n        }\n      }\n      if (pb[len] < cur[len])\n      {\n        *ptr1 = curMatch;\n        ptr1 = pair + 1;\n        curMatch = *ptr1;\n        len1 = len;\n      }\n      else\n      {\n        *ptr0 = curMatch;\n        ptr0 = pair;\n        curMatch = *ptr0;\n        len0 = len;\n      }\n    }\n  }\n}\n\n#define MOVE_POS \\\n  ++p->cyclicBufferPos; \\\n  p->buffer++; \\\n  if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);\n\n#define MOVE_POS_RET MOVE_POS return offset;\n\nstatic void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }\n\n#define GET_MATCHES_HEADER2(minLen, ret_op) \\\n  UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \\\n  lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \\\n  cur = p->buffer;\n\n#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)\n#define SKIP_HEADER(minLen)        GET_MATCHES_HEADER2(minLen, continue)\n\n#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue\n\n#define GET_MATCHES_FOOTER(offset, maxLen) \\\n  offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \\\n  distances + offset, maxLen) - distances); MOVE_POS_RET;\n\n#define SKIP_FOOTER \\\n  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;\n\nstatic UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n{\n  UInt32 offset;\n  GET_MATCHES_HEADER(2)\n  HASH2_CALC;\n  curMatch = p->hash[hashValue];\n  p->hash[hashValue] = p->pos;\n  offset = 0;\n  GET_MATCHES_FOOTER(offset, 1)\n}\n\nUInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n{\n  UInt32 offset;\n  GET_MATCHES_HEADER(3)\n  HASH_ZIP_CALC;\n  curMatch = p->hash[hashValue];\n  p->hash[hashValue] = p->pos;\n  offset = 0;\n  GET_MATCHES_FOOTER(offset, 2)\n}\n\nstatic UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n{\n  UInt32 hash2Value, delta2, maxLen, offset;\n  GET_MATCHES_HEADER(3)\n\n  HASH3_CALC;\n\n  delta2 = p->pos - p->hash[hash2Value];\n  curMatch = p->hash[kFix3HashSize + hashValue];\n  \n  p->hash[hash2Value] =\n  p->hash[kFix3HashSize + hashValue] = p->pos;\n\n\n  maxLen = 2;\n  offset = 0;\n  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n  {\n    for (; maxLen != lenLimit; maxLen++)\n      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n        break;\n    distances[0] = maxLen;\n    distances[1] = delta2 - 1;\n    offset = 2;\n    if (maxLen == lenLimit)\n    {\n      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));\n      MOVE_POS_RET;\n    }\n  }\n  GET_MATCHES_FOOTER(offset, maxLen)\n}\n\nstatic UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n{\n  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;\n  GET_MATCHES_HEADER(4)\n\n  HASH4_CALC;\n\n  delta2 = p->pos - p->hash[                hash2Value];\n  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];\n  curMatch = p->hash[kFix4HashSize + hashValue];\n  \n  p->hash[                hash2Value] =\n  p->hash[kFix3HashSize + hash3Value] =\n  p->hash[kFix4HashSize + hashValue] = p->pos;\n\n  maxLen = 1;\n  offset = 0;\n  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n  {\n    distances[0] = maxLen = 2;\n    distances[1] = delta2 - 1;\n    offset = 2;\n  }\n  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)\n  {\n    maxLen = 3;\n    distances[offset + 1] = delta3 - 1;\n    offset += 2;\n    delta2 = delta3;\n  }\n  if (offset != 0)\n  {\n    for (; maxLen != lenLimit; maxLen++)\n      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n        break;\n    distances[offset - 2] = maxLen;\n    if (maxLen == lenLimit)\n    {\n      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));\n      MOVE_POS_RET;\n    }\n  }\n  if (maxLen < 3)\n    maxLen = 3;\n  GET_MATCHES_FOOTER(offset, maxLen)\n}\n\nstatic UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n{\n  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;\n  GET_MATCHES_HEADER(4)\n\n  HASH4_CALC;\n\n  delta2 = p->pos - p->hash[                hash2Value];\n  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];\n  curMatch = p->hash[kFix4HashSize + hashValue];\n\n  p->hash[                hash2Value] =\n  p->hash[kFix3HashSize + hash3Value] =\n  p->hash[kFix4HashSize + hashValue] = p->pos;\n\n  maxLen = 1;\n  offset = 0;\n  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n  {\n    distances[0] = maxLen = 2;\n    distances[1] = delta2 - 1;\n    offset = 2;\n  }\n  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)\n  {\n    maxLen = 3;\n    distances[offset + 1] = delta3 - 1;\n    offset += 2;\n    delta2 = delta3;\n  }\n  if (offset != 0)\n  {\n    for (; maxLen != lenLimit; maxLen++)\n      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n        break;\n    distances[offset - 2] = maxLen;\n    if (maxLen == lenLimit)\n    {\n      p->son[p->cyclicBufferPos] = curMatch;\n      MOVE_POS_RET;\n    }\n  }\n  if (maxLen < 3)\n    maxLen = 3;\n  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),\n    distances + offset, maxLen) - (distances));\n  MOVE_POS_RET\n}\n\nUInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n{\n  UInt32 offset;\n  GET_MATCHES_HEADER(3)\n  HASH_ZIP_CALC;\n  curMatch = p->hash[hashValue];\n  p->hash[hashValue] = p->pos;\n  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),\n    distances, 2) - (distances));\n  MOVE_POS_RET\n}\n\nstatic void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n{\n  do\n  {\n    SKIP_HEADER(2)\n    HASH2_CALC;\n    curMatch = p->hash[hashValue];\n    p->hash[hashValue] = p->pos;\n    SKIP_FOOTER\n  }\n  while (--num != 0);\n}\n\nvoid Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n{\n  do\n  {\n    SKIP_HEADER(3)\n    HASH_ZIP_CALC;\n    curMatch = p->hash[hashValue];\n    p->hash[hashValue] = p->pos;\n    SKIP_FOOTER\n  }\n  while (--num != 0);\n}\n\nstatic void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n{\n  do\n  {\n    UInt32 hash2Value;\n    SKIP_HEADER(3)\n    HASH3_CALC;\n    curMatch = p->hash[kFix3HashSize + hashValue];\n    p->hash[hash2Value] =\n    p->hash[kFix3HashSize + hashValue] = p->pos;\n    SKIP_FOOTER\n  }\n  while (--num != 0);\n}\n\nstatic void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n{\n  do\n  {\n    UInt32 hash2Value, hash3Value;\n    SKIP_HEADER(4)\n    HASH4_CALC;\n    curMatch = p->hash[kFix4HashSize + hashValue];\n    p->hash[                hash2Value] =\n    p->hash[kFix3HashSize + hash3Value] = p->pos;\n    p->hash[kFix4HashSize + hashValue] = p->pos;\n    SKIP_FOOTER\n  }\n  while (--num != 0);\n}\n\nstatic void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n{\n  do\n  {\n    UInt32 hash2Value, hash3Value;\n    SKIP_HEADER(4)\n    HASH4_CALC;\n    curMatch = p->hash[kFix4HashSize + hashValue];\n    p->hash[                hash2Value] =\n    p->hash[kFix3HashSize + hash3Value] =\n    p->hash[kFix4HashSize + hashValue] = p->pos;\n    p->son[p->cyclicBufferPos] = curMatch;\n    MOVE_POS\n  }\n  while (--num != 0);\n}\n\nvoid Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n{\n  do\n  {\n    SKIP_HEADER(3)\n    HASH_ZIP_CALC;\n    curMatch = p->hash[hashValue];\n    p->hash[hashValue] = p->pos;\n    p->son[p->cyclicBufferPos] = curMatch;\n    MOVE_POS\n  }\n  while (--num != 0);\n}\n\nvoid MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)\n{\n  vTable->Init = (Mf_Init_Func)MatchFinder_Init;\n  vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;\n  vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;\n  vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;\n  if (!p->btMode)\n  {\n    vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;\n    vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;\n  }\n  else if (p->numHashBytes == 2)\n  {\n    vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;\n    vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;\n  }\n  else if (p->numHashBytes == 3)\n  {\n    vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;\n    vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;\n  }\n  else\n  {\n    vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;\n    vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzFind.h",
    "content": "/* LzFind.h -- Match finder for LZ algorithms\n2008-10-04 : Igor Pavlov : Public domain */\n\n#ifndef __LZFIND_H\n#define __LZFIND_H\n\n#include \"Types.h\"\n\ntypedef UInt32 CLzRef;\n\ntypedef struct _CMatchFinder\n{\n  Byte *buffer;\n  UInt32 pos;\n  UInt32 posLimit;\n  UInt32 streamPos;\n  UInt32 lenLimit;\n\n  UInt32 cyclicBufferPos;\n  UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */\n\n  UInt32 matchMaxLen;\n  CLzRef *hash;\n  CLzRef *son;\n  UInt32 hashMask;\n  UInt32 cutValue;\n\n  Byte *bufferBase;\n  ISeqInStream *stream;\n  int streamEndWasReached;\n\n  UInt32 blockSize;\n  UInt32 keepSizeBefore;\n  UInt32 keepSizeAfter;\n\n  UInt32 numHashBytes;\n  int directInput;\n  int btMode;\n  /* int skipModeBits; */\n  int bigHash;\n  UInt32 historySize;\n  UInt32 fixedHashSize;\n  UInt32 hashSizeSum;\n  UInt32 numSons;\n  SRes result;\n  UInt32 crc[256];\n} CMatchFinder;\n\n#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)\n#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)])\n\n#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)\n\nint MatchFinder_NeedMove(CMatchFinder *p);\nByte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);\nvoid MatchFinder_MoveBlock(CMatchFinder *p);\nvoid MatchFinder_ReadIfRequired(CMatchFinder *p);\n\nvoid MatchFinder_Construct(CMatchFinder *p);\n\n/* Conditions:\n     historySize <= 3 GB\n     keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB\n*/\nint MatchFinder_Create(CMatchFinder *p, UInt32 historySize,\n    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,\n    ISzAlloc *alloc);\nvoid MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);\nvoid MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);\nvoid MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);\n\nUInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,\n    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,\n    UInt32 *distances, UInt32 maxLen);\n\n/*\nConditions:\n  Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.\n  Mf_GetPointerToCurrentPos_Func's result must be used only before any other function\n*/\n\ntypedef void (*Mf_Init_Func)(void *object);\ntypedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index);\ntypedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);\ntypedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);\ntypedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances);\ntypedef void (*Mf_Skip_Func)(void *object, UInt32);\n\ntypedef struct _IMatchFinder\n{\n  Mf_Init_Func Init;\n  Mf_GetIndexByte_Func GetIndexByte;\n  Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;\n  Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;\n  Mf_GetMatches_Func GetMatches;\n  Mf_Skip_Func Skip;\n} IMatchFinder;\n\nvoid MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);\n\nvoid MatchFinder_Init(CMatchFinder *p);\nUInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);\nUInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);\nvoid Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);\nvoid Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzFindMt.c",
    "content": "/* LzFindMt.c -- multithreaded Match finder for LZ algorithms\n2008-10-04 : Igor Pavlov : Public domain */\n\n#include \"LzHash.h\"\n\n#include \"LzFindMt.h\"\n\nvoid MtSync_Construct(CMtSync *p)\n{\n  p->wasCreated = False;\n  p->csWasInitialized = False;\n  p->csWasEntered = False;\n  Thread_Construct(&p->thread);\n  Event_Construct(&p->canStart);\n  Event_Construct(&p->wasStarted);\n  Event_Construct(&p->wasStopped);\n  Semaphore_Construct(&p->freeSemaphore);\n  Semaphore_Construct(&p->filledSemaphore);\n}\n\nvoid MtSync_GetNextBlock(CMtSync *p)\n{\n  if (p->needStart)\n  {\n    p->numProcessedBlocks = 1;\n    p->needStart = False;\n    p->stopWriting = False;\n    p->exit = False;\n    Event_Reset(&p->wasStarted);\n    Event_Reset(&p->wasStopped);\n\n    Event_Set(&p->canStart);\n    Event_Wait(&p->wasStarted);\n  }\n  else\n  {\n    CriticalSection_Leave(&p->cs);\n    p->csWasEntered = False;\n    p->numProcessedBlocks++;\n    Semaphore_Release1(&p->freeSemaphore);\n  }\n  Semaphore_Wait(&p->filledSemaphore);\n  CriticalSection_Enter(&p->cs);\n  p->csWasEntered = True;\n}\n\n/* MtSync_StopWriting must be called if Writing was started */\n\nvoid MtSync_StopWriting(CMtSync *p)\n{\n  UInt32 myNumBlocks = p->numProcessedBlocks;\n  if (!Thread_WasCreated(&p->thread) || p->needStart)\n    return;\n  p->stopWriting = True;\n  if (p->csWasEntered)\n  {\n    CriticalSection_Leave(&p->cs);\n    p->csWasEntered = False;\n  }\n  Semaphore_Release1(&p->freeSemaphore);\n \n  Event_Wait(&p->wasStopped);\n\n  while (myNumBlocks++ != p->numProcessedBlocks)\n  {\n    Semaphore_Wait(&p->filledSemaphore);\n    Semaphore_Release1(&p->freeSemaphore);\n  }\n  p->needStart = True;\n}\n\nvoid MtSync_Destruct(CMtSync *p)\n{\n  if (Thread_WasCreated(&p->thread))\n  {\n    MtSync_StopWriting(p);\n    p->exit = True;\n    if (p->needStart)\n      Event_Set(&p->canStart);\n    Thread_Wait(&p->thread);\n    Thread_Close(&p->thread);\n  }\n  if (p->csWasInitialized)\n  {\n    CriticalSection_Delete(&p->cs);\n    p->csWasInitialized = False;\n  }\n\n  Event_Close(&p->canStart);\n  Event_Close(&p->wasStarted);\n  Event_Close(&p->wasStopped);\n  Semaphore_Close(&p->freeSemaphore);\n  Semaphore_Close(&p->filledSemaphore);\n\n  p->wasCreated = False;\n}\n\n#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; }\n\nstatic SRes MtSync_Create2(CMtSync *p, unsigned (MY_STD_CALL *startAddress)(void *), void *obj, UInt32 numBlocks)\n{\n  if (p->wasCreated)\n    return SZ_OK;\n\n  RINOK_THREAD(CriticalSection_Init(&p->cs));\n  p->csWasInitialized = True;\n\n  RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart));\n  RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStarted));\n  RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped));\n  \n  RINOK_THREAD(Semaphore_Create(&p->freeSemaphore, numBlocks, numBlocks));\n  RINOK_THREAD(Semaphore_Create(&p->filledSemaphore, 0, numBlocks));\n\n  p->needStart = True;\n  \n  RINOK_THREAD(Thread_Create(&p->thread, startAddress, obj));\n  p->wasCreated = True;\n  return SZ_OK;\n}\n\nstatic SRes MtSync_Create(CMtSync *p, unsigned (MY_STD_CALL *startAddress)(void *), void *obj, UInt32 numBlocks)\n{\n  SRes res = MtSync_Create2(p, startAddress, obj, numBlocks);\n  if (res != SZ_OK)\n    MtSync_Destruct(p);\n  return res;\n}\n\nvoid MtSync_Init(CMtSync *p) { p->needStart = True; }\n\n#define kMtMaxValForNormalize 0xFFFFFFFF\n\n#define DEF_GetHeads2(name, v, action) \\\nstatic void GetHeads ## name(const Byte *p, UInt32 pos, \\\nUInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc) \\\n{ action; for (; numHeads != 0; numHeads--) { \\\nconst UInt32 value = (v); p++; *heads++ = pos - hash[value]; hash[value] = pos++;  } }\n\n#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;)\n\nDEF_GetHeads2(2,  (p[0] | ((UInt32)p[1] << 8)), hashMask = hashMask; crc = crc; )\nDEF_GetHeads(3,  (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8)) & hashMask)\nDEF_GetHeads(4,  (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5)) & hashMask)\nDEF_GetHeads(4b, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ ((UInt32)p[3] << 16)) & hashMask)\nDEF_GetHeads(5,  (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5) ^ (crc[p[4]] << 3)) & hashMask)\n\nvoid HashThreadFunc(CMatchFinderMt *mt)\n{\n  CMtSync *p = &mt->hashSync;\n  for (;;)\n  {\n    UInt32 numProcessedBlocks = 0;\n    Event_Wait(&p->canStart);\n    Event_Set(&p->wasStarted);\n    for (;;)\n    {\n      if (p->exit)\n        return;\n      if (p->stopWriting)\n      {\n        p->numProcessedBlocks = numProcessedBlocks;\n        Event_Set(&p->wasStopped);\n        break;\n      }\n\n      {\n        CMatchFinder *mf = mt->MatchFinder;\n        if (MatchFinder_NeedMove(mf))\n        {\n          CriticalSection_Enter(&mt->btSync.cs);\n          CriticalSection_Enter(&mt->hashSync.cs);\n          {\n            const Byte *beforePtr = MatchFinder_GetPointerToCurrentPos(mf);\n            const Byte *afterPtr;\n            MatchFinder_MoveBlock(mf);\n            afterPtr = MatchFinder_GetPointerToCurrentPos(mf);\n            mt->pointerToCurPos -= beforePtr - afterPtr;\n            mt->buffer -= beforePtr - afterPtr;\n          }\n          CriticalSection_Leave(&mt->btSync.cs);\n          CriticalSection_Leave(&mt->hashSync.cs);\n          continue;\n        }\n\n        Semaphore_Wait(&p->freeSemaphore);\n\n        MatchFinder_ReadIfRequired(mf);\n        if (mf->pos > (kMtMaxValForNormalize - kMtHashBlockSize))\n        {\n          UInt32 subValue = (mf->pos - mf->historySize - 1);\n          MatchFinder_ReduceOffsets(mf, subValue);\n          MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, mf->hashMask + 1);\n        }\n        {\n          UInt32 *heads = mt->hashBuf + ((numProcessedBlocks++) & kMtHashNumBlocksMask) * kMtHashBlockSize;\n          UInt32 num = mf->streamPos - mf->pos;\n          heads[0] = 2;\n          heads[1] = num;\n          if (num >= mf->numHashBytes)\n          {\n            num = num - mf->numHashBytes + 1;\n            if (num > kMtHashBlockSize - 2)\n              num = kMtHashBlockSize - 2;\n            mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc);\n            heads[0] += num;\n          }\n          mf->pos += num;\n          mf->buffer += num;\n        }\n      }\n\n      Semaphore_Release1(&p->filledSemaphore);\n    }\n  }\n}\n\nvoid MatchFinderMt_GetNextBlock_Hash(CMatchFinderMt *p)\n{\n  MtSync_GetNextBlock(&p->hashSync);\n  p->hashBufPosLimit = p->hashBufPos = ((p->hashSync.numProcessedBlocks - 1) & kMtHashNumBlocksMask) * kMtHashBlockSize;\n  p->hashBufPosLimit += p->hashBuf[p->hashBufPos++];\n  p->hashNumAvail = p->hashBuf[p->hashBufPos++];\n}\n\n#define kEmptyHashValue 0\n\n/* #define MFMT_GM_INLINE */\n\n#ifdef MFMT_GM_INLINE\n\n#define NO_INLINE MY_FAST_CALL\n\nInt32 NO_INLINE GetMatchesSpecN(UInt32 lenLimit, UInt32 pos, const Byte *cur, CLzRef *son,\n    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,\n    UInt32 *_distances, UInt32 _maxLen, const UInt32 *hash, Int32 limit, UInt32 size, UInt32 *posRes)\n{\n  do\n  {\n  UInt32 *distances = _distances + 1;\n  UInt32 curMatch = pos - *hash++;\n\n  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;\n  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);\n  UInt32 len0 = 0, len1 = 0;\n  UInt32 cutValue = _cutValue;\n  UInt32 maxLen = _maxLen;\n  for (;;)\n  {\n    UInt32 delta = pos - curMatch;\n    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n    {\n      *ptr0 = *ptr1 = kEmptyHashValue;\n      break;\n    }\n    {\n      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);\n      const Byte *pb = cur - delta;\n      UInt32 len = (len0 < len1 ? len0 : len1);\n      if (pb[len] == cur[len])\n      {\n        if (++len != lenLimit && pb[len] == cur[len])\n          while (++len != lenLimit)\n            if (pb[len] != cur[len])\n              break;\n        if (maxLen < len)\n        {\n          *distances++ = maxLen = len;\n          *distances++ = delta - 1;\n          if (len == lenLimit)\n          {\n            *ptr1 = pair[0];\n            *ptr0 = pair[1];\n            break;\n          }\n        }\n      }\n      if (pb[len] < cur[len])\n      {\n        *ptr1 = curMatch;\n        ptr1 = pair + 1;\n        curMatch = *ptr1;\n        len1 = len;\n      }\n      else\n      {\n        *ptr0 = curMatch;\n        ptr0 = pair;\n        curMatch = *ptr0;\n        len0 = len;\n      }\n    }\n  }\n  pos++;\n  _cyclicBufferPos++;\n  cur++;\n  {\n    UInt32 num = (UInt32)(distances - _distances);\n    *_distances = num - 1;\n    _distances += num;\n    limit -= num;\n  }\n  }\n  while (limit > 0 && --size != 0);\n  *posRes = pos;\n  return limit;\n}\n\n#endif\n\nvoid BtGetMatches(CMatchFinderMt *p, UInt32 *distances)\n{\n  UInt32 numProcessed = 0;\n  UInt32 curPos = 2;\n  UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2);\n  distances[1] = p->hashNumAvail;\n  while (curPos < limit)\n  {\n    if (p->hashBufPos == p->hashBufPosLimit)\n    {\n      MatchFinderMt_GetNextBlock_Hash(p);\n      distances[1] = numProcessed + p->hashNumAvail;\n      if (p->hashNumAvail >= p->numHashBytes)\n        continue;\n      for (; p->hashNumAvail != 0; p->hashNumAvail--)\n        distances[curPos++] = 0;\n      break;\n    }\n    {\n      UInt32 size = p->hashBufPosLimit - p->hashBufPos;\n      UInt32 lenLimit = p->matchMaxLen;\n      UInt32 pos = p->pos;\n      UInt32 cyclicBufferPos = p->cyclicBufferPos;\n      if (lenLimit >= p->hashNumAvail)\n        lenLimit = p->hashNumAvail;\n      {\n        UInt32 size2 = p->hashNumAvail - lenLimit + 1;\n        if (size2 < size)\n          size = size2;\n        size2 = p->cyclicBufferSize - cyclicBufferPos;\n        if (size2 < size)\n          size = size2;\n      }\n      #ifndef MFMT_GM_INLINE\n      while (curPos < limit && size-- != 0)\n      {\n        UInt32 *startDistances = distances + curPos;\n        UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++],\n          pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue,\n          startDistances + 1, p->numHashBytes - 1) - startDistances);\n        *startDistances = num - 1;\n        curPos += num;\n        cyclicBufferPos++;\n        pos++;\n        p->buffer++;\n      }\n      #else\n      {\n        UInt32 posRes;\n        curPos = limit - GetMatchesSpecN(lenLimit, pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue,\n          distances + curPos, p->numHashBytes - 1, p->hashBuf + p->hashBufPos, (Int32)(limit - curPos) , size, &posRes);\n        p->hashBufPos += posRes - pos;\n        cyclicBufferPos += posRes - pos;\n        p->buffer += posRes - pos;\n        pos = posRes;\n      }\n      #endif\n\n      numProcessed += pos - p->pos;\n      p->hashNumAvail -= pos - p->pos;\n      p->pos = pos;\n      if (cyclicBufferPos == p->cyclicBufferSize)\n        cyclicBufferPos = 0;\n      p->cyclicBufferPos = cyclicBufferPos;\n    }\n  }\n  distances[0] = curPos;\n}\n\nvoid BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex)\n{\n  CMtSync *sync = &p->hashSync;\n  if (!sync->needStart)\n  {\n    CriticalSection_Enter(&sync->cs);\n    sync->csWasEntered = True;\n  }\n  \n  BtGetMatches(p, p->btBuf + (globalBlockIndex & kMtBtNumBlocksMask) * kMtBtBlockSize);\n\n  if (p->pos > kMtMaxValForNormalize - kMtBtBlockSize)\n  {\n    UInt32 subValue = p->pos - p->cyclicBufferSize;\n    MatchFinder_Normalize3(subValue, p->son, p->cyclicBufferSize * 2);\n    p->pos -= subValue;\n  }\n\n  if (!sync->needStart)\n  {\n    CriticalSection_Leave(&sync->cs);\n    sync->csWasEntered = False;\n  }\n}\n\nvoid BtThreadFunc(CMatchFinderMt *mt)\n{\n  CMtSync *p = &mt->btSync;\n  for (;;)\n  {\n    UInt32 blockIndex = 0;\n    Event_Wait(&p->canStart);\n    Event_Set(&p->wasStarted);\n    for (;;)\n    {\n      if (p->exit)\n        return;\n      if (p->stopWriting)\n      {\n        p->numProcessedBlocks = blockIndex;\n        MtSync_StopWriting(&mt->hashSync);\n        Event_Set(&p->wasStopped);\n        break;\n      }\n      Semaphore_Wait(&p->freeSemaphore);\n      BtFillBlock(mt, blockIndex++);\n      Semaphore_Release1(&p->filledSemaphore);\n    }\n  }\n}\n\nvoid MatchFinderMt_Construct(CMatchFinderMt *p)\n{\n  p->hashBuf = 0;\n  MtSync_Construct(&p->hashSync);\n  MtSync_Construct(&p->btSync);\n}\n\nvoid MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->hashBuf);\n  p->hashBuf = 0;\n}\n\nvoid MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc)\n{\n  MtSync_Destruct(&p->hashSync);\n  MtSync_Destruct(&p->btSync);\n  MatchFinderMt_FreeMem(p, alloc);\n}\n\n#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks)\n#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks)\n\nstatic unsigned MY_STD_CALL HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p);  return 0; }\nstatic unsigned MY_STD_CALL BtThreadFunc2(void *p)\n{\n  Byte allocaDummy[0x180];\n  int i = 0;\n  for (i = 0; i < 16; i++)\n    allocaDummy[i] = (Byte)i;\n  BtThreadFunc((CMatchFinderMt *)p);\n  return 0;\n}\n\nSRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,\n    UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc)\n{\n  CMatchFinder *mf = p->MatchFinder;\n  p->historySize = historySize;\n  if (kMtBtBlockSize <= matchMaxLen * 4)\n    return SZ_ERROR_PARAM;\n  if (p->hashBuf == 0)\n  {\n    p->hashBuf = (UInt32 *)alloc->Alloc(alloc, (kHashBufferSize + kBtBufferSize) * sizeof(UInt32));\n    if (p->hashBuf == 0)\n      return SZ_ERROR_MEM;\n    p->btBuf = p->hashBuf + kHashBufferSize;\n  }\n  keepAddBufferBefore += (kHashBufferSize + kBtBufferSize);\n  keepAddBufferAfter += kMtHashBlockSize;\n  if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc))\n    return SZ_ERROR_MEM;\n\n  RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p, kMtHashNumBlocks));\n  RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p, kMtBtNumBlocks));\n  return SZ_OK;\n}\n\n/* Call it after ReleaseStream / SetStream */\nvoid MatchFinderMt_Init(CMatchFinderMt *p)\n{\n  CMatchFinder *mf = p->MatchFinder;\n  p->btBufPos = p->btBufPosLimit = 0;\n  p->hashBufPos = p->hashBufPosLimit = 0;\n  MatchFinder_Init(mf);\n  p->pointerToCurPos = MatchFinder_GetPointerToCurrentPos(mf);\n  p->btNumAvailBytes = 0;\n  p->lzPos = p->historySize + 1;\n\n  p->hash = mf->hash;\n  p->fixedHashSize = mf->fixedHashSize;\n  p->crc = mf->crc;\n\n  p->son = mf->son;\n  p->matchMaxLen = mf->matchMaxLen;\n  p->numHashBytes = mf->numHashBytes;\n  p->pos = mf->pos;\n  p->buffer = mf->buffer;\n  p->cyclicBufferPos = mf->cyclicBufferPos;\n  p->cyclicBufferSize = mf->cyclicBufferSize;\n  p->cutValue = mf->cutValue;\n}\n\n/* ReleaseStream is required to finish multithreading */\nvoid MatchFinderMt_ReleaseStream(CMatchFinderMt *p)\n{\n  MtSync_StopWriting(&p->btSync);\n  /* p->MatchFinder->ReleaseStream(); */\n}\n\nvoid MatchFinderMt_Normalize(CMatchFinderMt *p)\n{\n  MatchFinder_Normalize3(p->lzPos - p->historySize - 1, p->hash, p->fixedHashSize);\n  p->lzPos = p->historySize + 1;\n}\n\nvoid MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p)\n{\n  UInt32 blockIndex;\n  MtSync_GetNextBlock(&p->btSync);\n  blockIndex = ((p->btSync.numProcessedBlocks - 1) & kMtBtNumBlocksMask);\n  p->btBufPosLimit = p->btBufPos = blockIndex * kMtBtBlockSize;\n  p->btBufPosLimit += p->btBuf[p->btBufPos++];\n  p->btNumAvailBytes = p->btBuf[p->btBufPos++];\n  if (p->lzPos >= kMtMaxValForNormalize - kMtBtBlockSize)\n    MatchFinderMt_Normalize(p);\n}\n\nconst Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p)\n{\n  return p->pointerToCurPos;\n}\n\n#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p);\n\nUInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p)\n{\n  GET_NEXT_BLOCK_IF_REQUIRED;\n  return p->btNumAvailBytes;\n}\n\nByte MatchFinderMt_GetIndexByte(CMatchFinderMt *p, Int32 index)\n{\n  return p->pointerToCurPos[index];\n}\n\nUInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances)\n{\n  UInt32 hash2Value, curMatch2;\n  UInt32 *hash = p->hash;\n  const Byte *cur = p->pointerToCurPos;\n  UInt32 lzPos = p->lzPos;\n  MT_HASH2_CALC\n      \n  curMatch2 = hash[hash2Value];\n  hash[hash2Value] = lzPos;\n\n  if (curMatch2 >= matchMinPos)\n    if (cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0])\n    {\n      *distances++ = 2;\n      *distances++ = lzPos - curMatch2 - 1;\n    }\n  return distances;\n}\n\nUInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances)\n{\n  UInt32 hash2Value, hash3Value, curMatch2, curMatch3;\n  UInt32 *hash = p->hash;\n  const Byte *cur = p->pointerToCurPos;\n  UInt32 lzPos = p->lzPos;\n  MT_HASH3_CALC\n\n  curMatch2 = hash[                hash2Value];\n  curMatch3 = hash[kFix3HashSize + hash3Value];\n  \n  hash[                hash2Value] =\n  hash[kFix3HashSize + hash3Value] =\n    lzPos;\n\n  if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0])\n  {\n    distances[1] = lzPos - curMatch2 - 1;\n    if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2])\n    {\n      distances[0] = 3;\n      return distances + 2;\n    }\n    distances[0] = 2;\n    distances += 2;\n  }\n  if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0])\n  {\n    *distances++ = 3;\n    *distances++ = lzPos - curMatch3 - 1;\n  }\n  return distances;\n}\n\n/*\nUInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances)\n{\n  UInt32 hash2Value, hash3Value, hash4Value, curMatch2, curMatch3, curMatch4;\n  UInt32 *hash = p->hash;\n  const Byte *cur = p->pointerToCurPos;\n  UInt32 lzPos = p->lzPos;\n  MT_HASH4_CALC\n      \n  curMatch2 = hash[                hash2Value];\n  curMatch3 = hash[kFix3HashSize + hash3Value];\n  curMatch4 = hash[kFix4HashSize + hash4Value];\n  \n  hash[                hash2Value] =\n  hash[kFix3HashSize + hash3Value] =\n  hash[kFix4HashSize + hash4Value] =\n    lzPos;\n\n  if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0])\n  {\n    distances[1] = lzPos - curMatch2 - 1;\n    if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2])\n    {\n      distances[0] =  (cur[(ptrdiff_t)curMatch2 - lzPos + 3] == cur[3]) ? 4 : 3;\n      return distances + 2;\n    }\n    distances[0] = 2;\n    distances += 2;\n  }\n  if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0])\n  {\n    distances[1] = lzPos - curMatch3 - 1;\n    if (cur[(ptrdiff_t)curMatch3 - lzPos + 3] == cur[3])\n    {\n      distances[0] = 4;\n      return distances + 2;\n    }\n    distances[0] = 3;\n    distances += 2;\n  }\n\n  if (curMatch4 >= matchMinPos)\n    if (\n      cur[(ptrdiff_t)curMatch4 - lzPos] == cur[0] &&\n      cur[(ptrdiff_t)curMatch4 - lzPos + 3] == cur[3]\n      )\n    {\n      *distances++ = 4;\n      *distances++ = lzPos - curMatch4 - 1;\n    }\n  return distances;\n}\n*/\n\n#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++;\n\nUInt32 MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *distances)\n{\n  const UInt32 *btBuf = p->btBuf + p->btBufPos;\n  UInt32 len = *btBuf++;\n  p->btBufPos += 1 + len;\n  p->btNumAvailBytes--;\n  {\n    UInt32 i;\n    for (i = 0; i < len; i += 2)\n    {\n      *distances++ = *btBuf++;\n      *distances++ = *btBuf++;\n    }\n  }\n  INCREASE_LZ_POS\n  return len;\n}\n\nUInt32 MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *distances)\n{\n  const UInt32 *btBuf = p->btBuf + p->btBufPos;\n  UInt32 len = *btBuf++;\n  p->btBufPos += 1 + len;\n\n  if (len == 0)\n  {\n    if (p->btNumAvailBytes-- >= 4)\n      len = (UInt32)(p->MixMatchesFunc(p, p->lzPos - p->historySize, distances) - (distances));\n  }\n  else\n  {\n    /* Condition: there are matches in btBuf with length < p->numHashBytes */\n    UInt32 *distances2;\n    p->btNumAvailBytes--;\n    distances2 = p->MixMatchesFunc(p, p->lzPos - btBuf[1], distances);\n    do\n    {\n      *distances2++ = *btBuf++;\n      *distances2++ = *btBuf++;\n    }\n    while ((len -= 2) != 0);\n    len  = (UInt32)(distances2 - (distances));\n  }\n  INCREASE_LZ_POS\n  return len;\n}\n\n#define SKIP_HEADER2  do { GET_NEXT_BLOCK_IF_REQUIRED\n#define SKIP_HEADER(n) SKIP_HEADER2 if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash;\n#define SKIP_FOOTER } INCREASE_LZ_POS p->btBufPos += p->btBuf[p->btBufPos] + 1; } while (--num != 0);\n\nvoid MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num)\n{\n  SKIP_HEADER2 { p->btNumAvailBytes--;\n  SKIP_FOOTER\n}\n\nvoid MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num)\n{\n  SKIP_HEADER(2)\n      UInt32 hash2Value;\n      MT_HASH2_CALC\n      hash[hash2Value] = p->lzPos;\n  SKIP_FOOTER\n}\n\nvoid MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num)\n{\n  SKIP_HEADER(3)\n      UInt32 hash2Value, hash3Value;\n      MT_HASH3_CALC\n      hash[kFix3HashSize + hash3Value] =\n      hash[                hash2Value] =\n        p->lzPos;\n  SKIP_FOOTER\n}\n\n/*\nvoid MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num)\n{\n  SKIP_HEADER(4)\n      UInt32 hash2Value, hash3Value, hash4Value;\n      MT_HASH4_CALC\n      hash[kFix4HashSize + hash4Value] =\n      hash[kFix3HashSize + hash3Value] =\n      hash[                hash2Value] =\n        p->lzPos;\n  SKIP_FOOTER\n}\n*/\n\nvoid MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable)\n{\n  vTable->Init = (Mf_Init_Func)MatchFinderMt_Init;\n  vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinderMt_GetIndexByte;\n  vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes;\n  vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos;\n  vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches;\n  switch(p->MatchFinder->numHashBytes)\n  {\n    case 2:\n      p->GetHeadsFunc = GetHeads2;\n      p->MixMatchesFunc = (Mf_Mix_Matches)0;\n      vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip;\n      vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches;\n      break;\n    case 3:\n      p->GetHeadsFunc = GetHeads3;\n      p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2;\n      vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip;\n      break;\n    default:\n    /* case 4: */\n      p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads4b : GetHeads4;\n      /* p->GetHeadsFunc = GetHeads4; */\n      p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3;\n      vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip;\n      break;\n    /*\n    default:\n      p->GetHeadsFunc = GetHeads5;\n      p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4;\n      vTable->Skip = (Mf_Skip_Func)MatchFinderMt4_Skip;\n      break;\n    */\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzFindMt.h",
    "content": "/* LzFindMt.h -- multithreaded Match finder for LZ algorithms\n2008-10-04 : Igor Pavlov : Public domain */\n\n#ifndef __LZFINDMT_H\n#define __LZFINDMT_H\n\n#include \"Threads.h\"\n#include \"LzFind.h\"\n\n#define kMtHashBlockSize (1 << 13)\n#define kMtHashNumBlocks (1 << 3)\n#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1)\n\n#define kMtBtBlockSize (1 << 14)\n#define kMtBtNumBlocks (1 << 6)\n#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1)\n\ntypedef struct _CMtSync\n{\n  Bool wasCreated;\n  Bool needStart;\n  Bool exit;\n  Bool stopWriting;\n\n  CThread thread;\n  CAutoResetEvent canStart;\n  CAutoResetEvent wasStarted;\n  CAutoResetEvent wasStopped;\n  CSemaphore freeSemaphore;\n  CSemaphore filledSemaphore;\n  Bool csWasInitialized;\n  Bool csWasEntered;\n  CCriticalSection cs;\n  UInt32 numProcessedBlocks;\n} CMtSync;\n\ntypedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances);\n\n/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */\n#define kMtCacheLineDummy 128\n\ntypedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,\n  UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);\n\ntypedef struct _CMatchFinderMt\n{\n  /* LZ */\n  const Byte *pointerToCurPos;\n  UInt32 *btBuf;\n  UInt32 btBufPos;\n  UInt32 btBufPosLimit;\n  UInt32 lzPos;\n  UInt32 btNumAvailBytes;\n\n  UInt32 *hash;\n  UInt32 fixedHashSize;\n  UInt32 historySize;\n  const UInt32 *crc;\n\n  Mf_Mix_Matches MixMatchesFunc;\n  \n  /* LZ + BT */\n  CMtSync btSync;\n  Byte btDummy[kMtCacheLineDummy];\n\n  /* BT */\n  UInt32 *hashBuf;\n  UInt32 hashBufPos;\n  UInt32 hashBufPosLimit;\n  UInt32 hashNumAvail;\n\n  CLzRef *son;\n  UInt32 matchMaxLen;\n  UInt32 numHashBytes;\n  UInt32 pos;\n  Byte *buffer;\n  UInt32 cyclicBufferPos;\n  UInt32 cyclicBufferSize; /* it must be historySize + 1 */\n  UInt32 cutValue;\n\n  /* BT + Hash */\n  CMtSync hashSync;\n  /* Byte hashDummy[kMtCacheLineDummy]; */\n  \n  /* Hash */\n  Mf_GetHeads GetHeadsFunc;\n  CMatchFinder *MatchFinder;\n} CMatchFinderMt;\n\nvoid MatchFinderMt_Construct(CMatchFinderMt *p);\nvoid MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc);\nSRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,\n    UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc);\nvoid MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable);\nvoid MatchFinderMt_ReleaseStream(CMatchFinderMt *p);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzHash.h",
    "content": "/* LzHash.h -- HASH functions for LZ algorithms\n2008-10-04 : Igor Pavlov : Public domain */\n\n#ifndef __LZHASH_H\n#define __LZHASH_H\n\n#define kHash2Size (1 << 10)\n#define kHash3Size (1 << 16)\n#define kHash4Size (1 << 20)\n\n#define kFix3HashSize (kHash2Size)\n#define kFix4HashSize (kHash2Size + kHash3Size)\n#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)\n\n#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8);\n\n#define HASH3_CALC { \\\n  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n  hash2Value = temp & (kHash2Size - 1); \\\n  hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }\n\n#define HASH4_CALC { \\\n  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n  hash2Value = temp & (kHash2Size - 1); \\\n  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \\\n  hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; }\n\n#define HASH5_CALC { \\\n  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n  hash2Value = temp & (kHash2Size - 1); \\\n  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \\\n  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \\\n  hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \\\n  hash4Value &= (kHash4Size - 1); }\n\n/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */\n#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;\n\n\n#define MT_HASH2_CALC \\\n  hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);\n\n#define MT_HASH3_CALC { \\\n  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n  hash2Value = temp & (kHash2Size - 1); \\\n  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }\n\n#define MT_HASH4_CALC { \\\n  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n  hash2Value = temp & (kHash2Size - 1); \\\n  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \\\n  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaDec.c",
    "content": "/* LzmaDec.c -- LZMA Decoder\n2008-11-06 : Igor Pavlov : Public domain */\n\n#include \"LzmaDec.h\"\n\n#include <string.h>\n\n#define kNumTopBits 24\n#define kTopValue ((UInt32)1 << kNumTopBits)\n\n#define kNumBitModelTotalBits 11\n#define kBitModelTotal (1 << kNumBitModelTotalBits)\n#define kNumMoveBits 5\n\n#define RC_INIT_SIZE 5\n\n#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }\n\n#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));\n#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));\n#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \\\n  { UPDATE_0(p); i = (i + i); A0; } else \\\n  { UPDATE_1(p); i = (i + i) + 1; A1; }\n#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)\n\n#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }\n#define TREE_DECODE(probs, limit, i) \\\n  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }\n\n/* #define _LZMA_SIZE_OPT */\n\n#ifdef _LZMA_SIZE_OPT\n#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)\n#else\n#define TREE_6_DECODE(probs, i) \\\n  { i = 1; \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  TREE_GET_BIT(probs, i); \\\n  i -= 0x40; }\n#endif\n\n#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }\n\n#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n#define UPDATE_0_CHECK range = bound;\n#define UPDATE_1_CHECK range -= bound; code -= bound;\n#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \\\n  { UPDATE_0_CHECK; i = (i + i); A0; } else \\\n  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }\n#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)\n#define TREE_DECODE_CHECK(probs, limit, i) \\\n  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }\n\n\n#define kNumPosBitsMax 4\n#define kNumPosStatesMax (1 << kNumPosBitsMax)\n\n#define kLenNumLowBits 3\n#define kLenNumLowSymbols (1 << kLenNumLowBits)\n#define kLenNumMidBits 3\n#define kLenNumMidSymbols (1 << kLenNumMidBits)\n#define kLenNumHighBits 8\n#define kLenNumHighSymbols (1 << kLenNumHighBits)\n\n#define LenChoice 0\n#define LenChoice2 (LenChoice + 1)\n#define LenLow (LenChoice2 + 1)\n#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))\n#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))\n#define kNumLenProbs (LenHigh + kLenNumHighSymbols)\n\n\n#define kNumStates 12\n#define kNumLitStates 7\n\n#define kStartPosModelIndex 4\n#define kEndPosModelIndex 14\n#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))\n\n#define kNumPosSlotBits 6\n#define kNumLenToPosStates 4\n\n#define kNumAlignBits 4\n#define kAlignTableSize (1 << kNumAlignBits)\n\n#define kMatchMinLen 2\n#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)\n\n#define IsMatch 0\n#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))\n#define IsRepG0 (IsRep + kNumStates)\n#define IsRepG1 (IsRepG0 + kNumStates)\n#define IsRepG2 (IsRepG1 + kNumStates)\n#define IsRep0Long (IsRepG2 + kNumStates)\n#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))\n#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))\n#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)\n#define LenCoder (Align + kAlignTableSize)\n#define RepLenCoder (LenCoder + kNumLenProbs)\n#define Literal (RepLenCoder + kNumLenProbs)\n\n#define LZMA_BASE_SIZE 1846\n#define LZMA_LIT_SIZE 768\n\n#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))\n\n#if Literal != LZMA_BASE_SIZE\nStopCompilingDueBUG\n#endif\n\nstatic const Byte kLiteralNextStates[kNumStates * 2] =\n{\n  0, 0, 0, 0, 1, 2, 3,  4,  5,  6,  4,  5,\n  7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10\n};\n\n#define LZMA_DIC_MIN (1 << 12)\n\n/* First LZMA-symbol is always decoded.\nAnd it decodes new LZMA-symbols while (buf < bufLimit), but \"buf\" is without last normalization\nOut:\n  Result:\n    SZ_OK - OK\n    SZ_ERROR_DATA - Error\n  p->remainLen:\n    < kMatchSpecLenStart : normal remain\n    = kMatchSpecLenStart : finished\n    = kMatchSpecLenStart + 1 : Flush marker\n    = kMatchSpecLenStart + 2 : State Init Marker\n*/\n\nstatic int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n{\n  CLzmaProb *probs = p->probs;\n\n  unsigned state = p->state;\n  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];\n  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;\n  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;\n  unsigned lc = p->prop.lc;\n\n  Byte *dic = p->dic;\n  SizeT dicBufSize = p->dicBufSize;\n  SizeT dicPos = p->dicPos;\n  \n  UInt32 processedPos = p->processedPos;\n  UInt32 checkDicSize = p->checkDicSize;\n  unsigned len = 0;\n\n  const Byte *buf = p->buf;\n  UInt32 range = p->range;\n  UInt32 code = p->code;\n\n  do\n  {\n    CLzmaProb *prob;\n    UInt32 bound;\n    unsigned ttt;\n    unsigned posState = processedPos & pbMask;\n\n    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n    IF_BIT_0(prob)\n    {\n      unsigned symbol;\n      UPDATE_0(prob);\n      prob = probs + Literal;\n      if (checkDicSize != 0 || processedPos != 0)\n        prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +\n        (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));\n\n      if (state < kNumLitStates)\n      {\n        symbol = 1;\n        do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);\n      }\n      else\n      {\n        unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n        unsigned offs = 0x100;\n        symbol = 1;\n        do\n        {\n          unsigned bit;\n          CLzmaProb *probLit;\n          matchByte <<= 1;\n          bit = (matchByte & offs);\n          probLit = prob + offs + bit + symbol;\n          GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)\n        }\n        while (symbol < 0x100);\n      }\n      dic[dicPos++] = (Byte)symbol;\n      processedPos++;\n\n      state = kLiteralNextStates[state];\n      /* if (state < 4) state = 0; else if (state < 10) state -= 3; else state -= 6; */\n      continue;\n    }\n    else\n    {\n      UPDATE_1(prob);\n      prob = probs + IsRep + state;\n      IF_BIT_0(prob)\n      {\n        UPDATE_0(prob);\n        state += kNumStates;\n        prob = probs + LenCoder;\n      }\n      else\n      {\n        UPDATE_1(prob);\n        if (checkDicSize == 0 && processedPos == 0)\n          return SZ_ERROR_DATA;\n        prob = probs + IsRepG0 + state;\n        IF_BIT_0(prob)\n        {\n          UPDATE_0(prob);\n          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n          IF_BIT_0(prob)\n          {\n            UPDATE_0(prob);\n            dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n            dicPos++;\n            processedPos++;\n            state = state < kNumLitStates ? 9 : 11;\n            continue;\n          }\n          UPDATE_1(prob);\n        }\n        else\n        {\n          UInt32 distance;\n          UPDATE_1(prob);\n          prob = probs + IsRepG1 + state;\n          IF_BIT_0(prob)\n          {\n            UPDATE_0(prob);\n            distance = rep1;\n          }\n          else\n          {\n            UPDATE_1(prob);\n            prob = probs + IsRepG2 + state;\n            IF_BIT_0(prob)\n            {\n              UPDATE_0(prob);\n              distance = rep2;\n            }\n            else\n            {\n              UPDATE_1(prob);\n              distance = rep3;\n              rep3 = rep2;\n            }\n            rep2 = rep1;\n          }\n          rep1 = rep0;\n          rep0 = distance;\n        }\n        state = state < kNumLitStates ? 8 : 11;\n        prob = probs + RepLenCoder;\n      }\n      {\n        unsigned limit, offset;\n        CLzmaProb *probLen = prob + LenChoice;\n        IF_BIT_0(probLen)\n        {\n          UPDATE_0(probLen);\n          probLen = prob + LenLow + (posState << kLenNumLowBits);\n          offset = 0;\n          limit = (1 << kLenNumLowBits);\n        }\n        else\n        {\n          UPDATE_1(probLen);\n          probLen = prob + LenChoice2;\n          IF_BIT_0(probLen)\n          {\n            UPDATE_0(probLen);\n            probLen = prob + LenMid + (posState << kLenNumMidBits);\n            offset = kLenNumLowSymbols;\n            limit = (1 << kLenNumMidBits);\n          }\n          else\n          {\n            UPDATE_1(probLen);\n            probLen = prob + LenHigh;\n            offset = kLenNumLowSymbols + kLenNumMidSymbols;\n            limit = (1 << kLenNumHighBits);\n          }\n        }\n        TREE_DECODE(probLen, limit, len);\n        len += offset;\n      }\n\n      if (state >= kNumStates)\n      {\n        UInt32 distance;\n        prob = probs + PosSlot +\n            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);\n        TREE_6_DECODE(prob, distance);\n        if (distance >= kStartPosModelIndex)\n        {\n          unsigned posSlot = (unsigned)distance;\n          int numDirectBits = (int)(((distance >> 1) - 1));\n          distance = (2 | (distance & 1));\n          if (posSlot < kEndPosModelIndex)\n          {\n            distance <<= numDirectBits;\n            prob = probs + SpecPos + distance - posSlot - 1;\n            {\n              UInt32 mask = 1;\n              unsigned i = 1;\n              do\n              {\n                GET_BIT2(prob + i, i, ; , distance |= mask);\n                mask <<= 1;\n              }\n              while (--numDirectBits != 0);\n            }\n          }\n          else\n          {\n            numDirectBits -= kNumAlignBits;\n            do\n            {\n              NORMALIZE\n              range >>= 1;\n              \n              {\n                UInt32 t;\n                code -= range;\n                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */\n                distance = (distance << 1) + (t + 1);\n                code += range & t;\n              }\n              /*\n              distance <<= 1;\n              if (code >= range)\n              {\n                code -= range;\n                distance |= 1;\n              }\n              */\n            }\n            while (--numDirectBits != 0);\n            prob = probs + Align;\n            distance <<= kNumAlignBits;\n            {\n              unsigned i = 1;\n              GET_BIT2(prob + i, i, ; , distance |= 1);\n              GET_BIT2(prob + i, i, ; , distance |= 2);\n              GET_BIT2(prob + i, i, ; , distance |= 4);\n              GET_BIT2(prob + i, i, ; , distance |= 8);\n            }\n            if (distance == (UInt32)0xFFFFFFFF)\n            {\n              len += kMatchSpecLenStart;\n              state -= kNumStates;\n              break;\n            }\n          }\n        }\n        rep3 = rep2;\n        rep2 = rep1;\n        rep1 = rep0;\n        rep0 = distance + 1;\n        if (checkDicSize == 0)\n        {\n          if (distance >= processedPos)\n            return SZ_ERROR_DATA;\n        }\n        else if (distance >= checkDicSize)\n          return SZ_ERROR_DATA;\n        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;\n        /* state = kLiteralNextStates[state]; */\n      }\n\n      len += kMatchMinLen;\n\n      if (limit == dicPos)\n        return SZ_ERROR_DATA;\n      {\n        SizeT rem = limit - dicPos;\n        unsigned curLen = ((rem < len) ? (unsigned)rem : len);\n        SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);\n\n        processedPos += curLen;\n\n        len -= curLen;\n        if (pos + curLen <= dicBufSize)\n        {\n          Byte *dest = dic + dicPos;\n          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;\n          const Byte *lim = dest + curLen;\n          dicPos += curLen;\n          do\n            *(dest) = (Byte)*(dest + src);\n          while (++dest != lim);\n        }\n        else\n        {\n          do\n          {\n            dic[dicPos++] = dic[pos];\n            if (++pos == dicBufSize)\n              pos = 0;\n          }\n          while (--curLen != 0);\n        }\n      }\n    }\n  }\n  while (dicPos < limit && buf < bufLimit);\n  NORMALIZE;\n  p->buf = buf;\n  p->range = range;\n  p->code = code;\n  p->remainLen = len;\n  p->dicPos = dicPos;\n  p->processedPos = processedPos;\n  p->reps[0] = rep0;\n  p->reps[1] = rep1;\n  p->reps[2] = rep2;\n  p->reps[3] = rep3;\n  p->state = state;\n\n  return SZ_OK;\n}\n\nstatic void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)\n{\n  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)\n  {\n    Byte *dic = p->dic;\n    SizeT dicPos = p->dicPos;\n    SizeT dicBufSize = p->dicBufSize;\n    unsigned len = p->remainLen;\n    UInt32 rep0 = p->reps[0];\n    if (limit - dicPos < len)\n      len = (unsigned)(limit - dicPos);\n\n    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)\n      p->checkDicSize = p->prop.dicSize;\n\n    p->processedPos += len;\n    p->remainLen -= len;\n    while (len-- != 0)\n    {\n      dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n      dicPos++;\n    }\n    p->dicPos = dicPos;\n  }\n}\n\nstatic int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n{\n  do\n  {\n    SizeT limit2 = limit;\n    if (p->checkDicSize == 0)\n    {\n      UInt32 rem = p->prop.dicSize - p->processedPos;\n      if (limit - p->dicPos > rem)\n        limit2 = p->dicPos + rem;\n    }\n    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));\n    if (p->processedPos >= p->prop.dicSize)\n      p->checkDicSize = p->prop.dicSize;\n    LzmaDec_WriteRem(p, limit);\n  }\n  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);\n\n  if (p->remainLen > kMatchSpecLenStart)\n  {\n    p->remainLen = kMatchSpecLenStart;\n  }\n  return 0;\n}\n\ntypedef enum\n{\n  DUMMY_ERROR, /* unexpected end of input stream */\n  DUMMY_LIT,\n  DUMMY_MATCH,\n  DUMMY_REP\n} ELzmaDummy;\n\nstatic ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)\n{\n  UInt32 range = p->range;\n  UInt32 code = p->code;\n  const Byte *bufLimit = buf + inSize;\n  CLzmaProb *probs = p->probs;\n  unsigned state = p->state;\n  ELzmaDummy res;\n\n  {\n    CLzmaProb *prob;\n    UInt32 bound;\n    unsigned ttt;\n    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);\n\n    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n    IF_BIT_0_CHECK(prob)\n    {\n      UPDATE_0_CHECK\n\n      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */\n\n      prob = probs + Literal;\n      if (p->checkDicSize != 0 || p->processedPos != 0)\n        prob += (LZMA_LIT_SIZE *\n          ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +\n          (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));\n\n      if (state < kNumLitStates)\n      {\n        unsigned symbol = 1;\n        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);\n      }\n      else\n      {\n        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +\n            ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];\n        unsigned offs = 0x100;\n        unsigned symbol = 1;\n        do\n        {\n          unsigned bit;\n          CLzmaProb *probLit;\n          matchByte <<= 1;\n          bit = (matchByte & offs);\n          probLit = prob + offs + bit + symbol;\n          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)\n        }\n        while (symbol < 0x100);\n      }\n      res = DUMMY_LIT;\n    }\n    else\n    {\n      unsigned len;\n      UPDATE_1_CHECK;\n\n      prob = probs + IsRep + state;\n      IF_BIT_0_CHECK(prob)\n      {\n        UPDATE_0_CHECK;\n        state = 0;\n        prob = probs + LenCoder;\n        res = DUMMY_MATCH;\n      }\n      else\n      {\n        UPDATE_1_CHECK;\n        res = DUMMY_REP;\n        prob = probs + IsRepG0 + state;\n        IF_BIT_0_CHECK(prob)\n        {\n          UPDATE_0_CHECK;\n          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n          IF_BIT_0_CHECK(prob)\n          {\n            UPDATE_0_CHECK;\n            NORMALIZE_CHECK;\n            return DUMMY_REP;\n          }\n          else\n          {\n            UPDATE_1_CHECK;\n          }\n        }\n        else\n        {\n          UPDATE_1_CHECK;\n          prob = probs + IsRepG1 + state;\n          IF_BIT_0_CHECK(prob)\n          {\n            UPDATE_0_CHECK;\n          }\n          else\n          {\n            UPDATE_1_CHECK;\n            prob = probs + IsRepG2 + state;\n            IF_BIT_0_CHECK(prob)\n            {\n              UPDATE_0_CHECK;\n            }\n            else\n            {\n              UPDATE_1_CHECK;\n            }\n          }\n        }\n        state = kNumStates;\n        prob = probs + RepLenCoder;\n      }\n      {\n        unsigned limit, offset;\n        CLzmaProb *probLen = prob + LenChoice;\n        IF_BIT_0_CHECK(probLen)\n        {\n          UPDATE_0_CHECK;\n          probLen = prob + LenLow + (posState << kLenNumLowBits);\n          offset = 0;\n          limit = 1 << kLenNumLowBits;\n        }\n        else\n        {\n          UPDATE_1_CHECK;\n          probLen = prob + LenChoice2;\n          IF_BIT_0_CHECK(probLen)\n          {\n            UPDATE_0_CHECK;\n            probLen = prob + LenMid + (posState << kLenNumMidBits);\n            offset = kLenNumLowSymbols;\n            limit = 1 << kLenNumMidBits;\n          }\n          else\n          {\n            UPDATE_1_CHECK;\n            probLen = prob + LenHigh;\n            offset = kLenNumLowSymbols + kLenNumMidSymbols;\n            limit = 1 << kLenNumHighBits;\n          }\n        }\n        TREE_DECODE_CHECK(probLen, limit, len);\n        len += offset;\n      }\n\n      if (state < 4)\n      {\n        unsigned posSlot;\n        prob = probs + PosSlot +\n            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<\n            kNumPosSlotBits);\n        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);\n        if (posSlot >= kStartPosModelIndex)\n        {\n          int numDirectBits = ((posSlot >> 1) - 1);\n\n          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */\n\n          if (posSlot < kEndPosModelIndex)\n          {\n            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;\n          }\n          else\n          {\n            numDirectBits -= kNumAlignBits;\n            do\n            {\n              NORMALIZE_CHECK\n              range >>= 1;\n              code -= range & (((code - range) >> 31) - 1);\n              /* if (code >= range) code -= range; */\n            }\n            while (--numDirectBits != 0);\n            prob = probs + Align;\n            numDirectBits = kNumAlignBits;\n          }\n          {\n            unsigned i = 1;\n            do\n            {\n              GET_BIT_CHECK(prob + i, i);\n            }\n            while (--numDirectBits != 0);\n          }\n        }\n      }\n    }\n  }\n  NORMALIZE_CHECK;\n  return res;\n}\n\n\nstatic void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)\n{\n  p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);\n  p->range = 0xFFFFFFFF;\n  p->needFlush = 0;\n}\n\nvoid LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)\n{\n  p->needFlush = 1;\n  p->remainLen = 0;\n  p->tempBufSize = 0;\n\n  if (initDic)\n  {\n    p->processedPos = 0;\n    p->checkDicSize = 0;\n    p->needInitState = 1;\n  }\n  if (initState)\n    p->needInitState = 1;\n}\n\nvoid LzmaDec_Init(CLzmaDec *p)\n{\n  p->dicPos = 0;\n  LzmaDec_InitDicAndState(p, True, True);\n}\n\nstatic void LzmaDec_InitStateReal(CLzmaDec *p)\n{\n  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));\n  UInt32 i;\n  CLzmaProb *probs = p->probs;\n  for (i = 0; i < numProbs; i++)\n    probs[i] = kBitModelTotal >> 1;\n  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;\n  p->state = 0;\n  p->needInitState = 0;\n}\n\nSRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,\n    ELzmaFinishMode finishMode, ELzmaStatus *status)\n{\n  SizeT inSize = *srcLen;\n  (*srcLen) = 0;\n  LzmaDec_WriteRem(p, dicLimit);\n  \n  *status = LZMA_STATUS_NOT_SPECIFIED;\n\n  while (p->remainLen != kMatchSpecLenStart)\n  {\n      int checkEndMarkNow;\n\n      if (p->needFlush != 0)\n      {\n        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)\n          p->tempBuf[p->tempBufSize++] = *src++;\n        if (p->tempBufSize < RC_INIT_SIZE)\n        {\n          *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n          return SZ_OK;\n        }\n        if (p->tempBuf[0] != 0)\n          return SZ_ERROR_DATA;\n\n        LzmaDec_InitRc(p, p->tempBuf);\n        p->tempBufSize = 0;\n      }\n\n      checkEndMarkNow = 0;\n      if (p->dicPos >= dicLimit)\n      {\n        if (p->remainLen == 0 && p->code == 0)\n        {\n          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;\n          return SZ_OK;\n        }\n        if (finishMode == LZMA_FINISH_ANY)\n        {\n          *status = LZMA_STATUS_NOT_FINISHED;\n          return SZ_OK;\n        }\n        if (p->remainLen != 0)\n        {\n          *status = LZMA_STATUS_NOT_FINISHED;\n          return SZ_ERROR_DATA;\n        }\n        checkEndMarkNow = 1;\n      }\n\n      if (p->needInitState)\n        LzmaDec_InitStateReal(p);\n  \n      if (p->tempBufSize == 0)\n      {\n        SizeT processed;\n        const Byte *bufLimit;\n        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)\n        {\n          int dummyRes = LzmaDec_TryDummy(p, src, inSize);\n          if (dummyRes == DUMMY_ERROR)\n          {\n            memcpy(p->tempBuf, src, inSize);\n            p->tempBufSize = (unsigned)inSize;\n            (*srcLen) += inSize;\n            *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n            return SZ_OK;\n          }\n          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)\n          {\n            *status = LZMA_STATUS_NOT_FINISHED;\n            return SZ_ERROR_DATA;\n          }\n          bufLimit = src;\n        }\n        else\n          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;\n        p->buf = src;\n        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)\n          return SZ_ERROR_DATA;\n        processed = (SizeT)(p->buf - src);\n        (*srcLen) += processed;\n        src += processed;\n        inSize -= processed;\n      }\n      else\n      {\n        unsigned rem = p->tempBufSize, lookAhead = 0;\n        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)\n          p->tempBuf[rem++] = src[lookAhead++];\n        p->tempBufSize = rem;\n        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)\n        {\n          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);\n          if (dummyRes == DUMMY_ERROR)\n          {\n            (*srcLen) += lookAhead;\n            *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n            return SZ_OK;\n          }\n          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)\n          {\n            *status = LZMA_STATUS_NOT_FINISHED;\n            return SZ_ERROR_DATA;\n          }\n        }\n        p->buf = p->tempBuf;\n        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)\n          return SZ_ERROR_DATA;\n        lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));\n        (*srcLen) += lookAhead;\n        src += lookAhead;\n        inSize -= lookAhead;\n        p->tempBufSize = 0;\n      }\n  }\n  if (p->code == 0)\n    *status = LZMA_STATUS_FINISHED_WITH_MARK;\n  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;\n}\n\nSRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)\n{\n  SizeT outSize = *destLen;\n  SizeT inSize = *srcLen;\n  *srcLen = *destLen = 0;\n  for (;;)\n  {\n    SizeT inSizeCur = inSize, outSizeCur, dicPos;\n    ELzmaFinishMode curFinishMode;\n    SRes res;\n    if (p->dicPos == p->dicBufSize)\n      p->dicPos = 0;\n    dicPos = p->dicPos;\n    if (outSize > p->dicBufSize - dicPos)\n    {\n      outSizeCur = p->dicBufSize;\n      curFinishMode = LZMA_FINISH_ANY;\n    }\n    else\n    {\n      outSizeCur = dicPos + outSize;\n      curFinishMode = finishMode;\n    }\n\n    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);\n    src += inSizeCur;\n    inSize -= inSizeCur;\n    *srcLen += inSizeCur;\n    outSizeCur = p->dicPos - dicPos;\n    memcpy(dest, p->dic + dicPos, outSizeCur);\n    dest += outSizeCur;\n    outSize -= outSizeCur;\n    *destLen += outSizeCur;\n    if (res != 0)\n      return res;\n    if (outSizeCur == 0 || outSize == 0)\n      return SZ_OK;\n  }\n}\n\nvoid LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->probs);\n  p->probs = 0;\n}\n\nstatic void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->dic);\n  p->dic = 0;\n}\n\nvoid LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)\n{\n  LzmaDec_FreeProbs(p, alloc);\n  LzmaDec_FreeDict(p, alloc);\n}\n\nSRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)\n{\n  UInt32 dicSize;\n  Byte d;\n  \n  if (size < LZMA_PROPS_SIZE)\n    return SZ_ERROR_UNSUPPORTED;\n  else\n    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);\n \n  if (dicSize < LZMA_DIC_MIN)\n    dicSize = LZMA_DIC_MIN;\n  p->dicSize = dicSize;\n\n  d = data[0];\n  if (d >= (9 * 5 * 5))\n    return SZ_ERROR_UNSUPPORTED;\n\n  p->lc = d % 9;\n  d /= 9;\n  p->pb = d / 5;\n  p->lp = d % 5;\n\n  return SZ_OK;\n}\n\nstatic SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)\n{\n  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);\n  if (p->probs == 0 || numProbs != p->numProbs)\n  {\n    LzmaDec_FreeProbs(p, alloc);\n    p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));\n    p->numProbs = numProbs;\n    if (p->probs == 0)\n      return SZ_ERROR_MEM;\n  }\n  return SZ_OK;\n}\n\nSRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n{\n  CLzmaProps propNew;\n  RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));\n  p->prop = propNew;\n  return SZ_OK;\n}\n\nSRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n{\n  CLzmaProps propNew;\n  SizeT dicBufSize;\n  RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));\n  dicBufSize = propNew.dicSize;\n  if (p->dic == 0 || dicBufSize != p->dicBufSize)\n  {\n    LzmaDec_FreeDict(p, alloc);\n    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);\n    if (p->dic == 0)\n    {\n      LzmaDec_FreeProbs(p, alloc);\n      return SZ_ERROR_MEM;\n    }\n  }\n  p->dicBufSize = dicBufSize;\n  p->prop = propNew;\n  return SZ_OK;\n}\n\nSRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,\n    ELzmaStatus *status, ISzAlloc *alloc)\n{\n  CLzmaDec p;\n  SRes res;\n  SizeT inSize = *srcLen;\n  SizeT outSize = *destLen;\n  *srcLen = *destLen = 0;\n  if (inSize < RC_INIT_SIZE)\n    return SZ_ERROR_INPUT_EOF;\n\n  LzmaDec_Construct(&p);\n  res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);\n  if (res != 0)\n    return res;\n  p.dic = dest;\n  p.dicBufSize = outSize;\n\n  LzmaDec_Init(&p);\n  \n  *srcLen = inSize;\n  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);\n\n  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)\n    res = SZ_ERROR_INPUT_EOF;\n\n  (*destLen) = p.dicPos;\n  LzmaDec_FreeProbs(&p, alloc);\n  return res;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaDec.h",
    "content": "/* LzmaDec.h -- LZMA Decoder\n2008-10-04 : Igor Pavlov : Public domain */\n\n#ifndef __LZMADEC_H\n#define __LZMADEC_H\n\n#include \"Types.h\"\n\n/* #define _LZMA_PROB32 */\n/* _LZMA_PROB32 can increase the speed on some CPUs,\n   but memory usage for CLzmaDec::probs will be doubled in that case */\n\n#ifdef _LZMA_PROB32\n#define CLzmaProb UInt32\n#else\n#define CLzmaProb UInt16\n#endif\n\n\n/* ---------- LZMA Properties ---------- */\n\n#define LZMA_PROPS_SIZE 5\n\ntypedef struct _CLzmaProps\n{\n  unsigned lc, lp, pb;\n  UInt32 dicSize;\n} CLzmaProps;\n\n/* LzmaProps_Decode - decodes properties\nReturns:\n  SZ_OK\n  SZ_ERROR_UNSUPPORTED - Unsupported properties\n*/\n\nSRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);\n\n\n/* ---------- LZMA Decoder state ---------- */\n\n/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.\n   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */\n\n#define LZMA_REQUIRED_INPUT_MAX 20\n\ntypedef struct\n{\n  CLzmaProps prop;\n  CLzmaProb *probs;\n  Byte *dic;\n  const Byte *buf;\n  UInt32 range, code;\n  SizeT dicPos;\n  SizeT dicBufSize;\n  UInt32 processedPos;\n  UInt32 checkDicSize;\n  unsigned state;\n  UInt32 reps[4];\n  unsigned remainLen;\n  int needFlush;\n  int needInitState;\n  UInt32 numProbs;\n  unsigned tempBufSize;\n  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];\n} CLzmaDec;\n\n#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }\n\nvoid LzmaDec_Init(CLzmaDec *p);\n\n/* There are two types of LZMA streams:\n     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.\n     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */\n\ntypedef enum\n{\n  LZMA_FINISH_ANY,   /* finish at any point */\n  LZMA_FINISH_END    /* block must be finished at the end */\n} ELzmaFinishMode;\n\n/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!\n\n   You must use LZMA_FINISH_END, when you know that current output buffer\n   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.\n\n   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,\n   and output value of destLen will be less than output buffer size limit.\n   You can check status result also.\n\n   You can use multiple checks to test data integrity after full decompression:\n     1) Check Result and \"status\" variable.\n     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.\n     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.\n        You must use correct finish mode in that case. */\n\ntypedef enum\n{\n  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */\n  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */\n  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */\n  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */\n  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */\n} ELzmaStatus;\n\n/* ELzmaStatus is used only as output value for function call */\n\n\n/* ---------- Interfaces ---------- */\n\n/* There are 3 levels of interfaces:\n     1) Dictionary Interface\n     2) Buffer Interface\n     3) One Call Interface\n   You can select any of these interfaces, but don't mix functions from different\n   groups for same object. */\n\n\n/* There are two variants to allocate state for Dictionary Interface:\n     1) LzmaDec_Allocate / LzmaDec_Free\n     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs\n   You can use variant 2, if you set dictionary buffer manually.\n   For Buffer Interface you must always use variant 1.\n\nLzmaDec_Allocate* can return:\n  SZ_OK\n  SZ_ERROR_MEM         - Memory allocation error\n  SZ_ERROR_UNSUPPORTED - Unsupported properties\n*/\n   \nSRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);\nvoid LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);\n\nSRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);\nvoid LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);\n\n/* ---------- Dictionary Interface ---------- */\n\n/* You can use it, if you want to eliminate the overhead for data copying from\n   dictionary to some other external buffer.\n   You must work with CLzmaDec variables directly in this interface.\n\n   STEPS:\n     LzmaDec_Constr()\n     LzmaDec_Allocate()\n     for (each new stream)\n     {\n       LzmaDec_Init()\n       while (it needs more decompression)\n       {\n         LzmaDec_DecodeToDic()\n         use data from CLzmaDec::dic and update CLzmaDec::dicPos\n       }\n     }\n     LzmaDec_Free()\n*/\n\n/* LzmaDec_DecodeToDic\n   \n   The decoding to internal dictionary buffer (CLzmaDec::dic).\n   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!\n\nfinishMode:\n  It has meaning only if the decoding reaches output limit (dicLimit).\n  LZMA_FINISH_ANY - Decode just dicLimit bytes.\n  LZMA_FINISH_END - Stream must be finished after dicLimit.\n\nReturns:\n  SZ_OK\n    status:\n      LZMA_STATUS_FINISHED_WITH_MARK\n      LZMA_STATUS_NOT_FINISHED\n      LZMA_STATUS_NEEDS_MORE_INPUT\n      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n  SZ_ERROR_DATA - Data error\n*/\n\nSRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,\n    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n\n\n/* ---------- Buffer Interface ---------- */\n\n/* It's zlib-like interface.\n   See LzmaDec_DecodeToDic description for information about STEPS and return results,\n   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need\n   to work with CLzmaDec variables manually.\n\nfinishMode:\n  It has meaning only if the decoding reaches output limit (*destLen).\n  LZMA_FINISH_ANY - Decode just destLen bytes.\n  LZMA_FINISH_END - Stream must be finished after (*destLen).\n*/\n\nSRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,\n    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n\n\n/* ---------- One Call Interface ---------- */\n\n/* LzmaDecode\n\nfinishMode:\n  It has meaning only if the decoding reaches output limit (*destLen).\n  LZMA_FINISH_ANY - Decode just destLen bytes.\n  LZMA_FINISH_END - Stream must be finished after (*destLen).\n\nReturns:\n  SZ_OK\n    status:\n      LZMA_STATUS_FINISHED_WITH_MARK\n      LZMA_STATUS_NOT_FINISHED\n      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n  SZ_ERROR_DATA - Data error\n  SZ_ERROR_MEM  - Memory allocation error\n  SZ_ERROR_UNSUPPORTED - Unsupported properties\n  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).\n*/\n\nSRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,\n    ELzmaStatus *status, ISzAlloc *alloc);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaEnc.c",
    "content": "/* LzmaEnc.c -- LZMA Encoder\n2009-02-02 : Igor Pavlov : Public domain */\n\n#include <string.h>\n\n/* #define SHOW_STAT */\n/* #define SHOW_STAT2 */\n\n#if defined(SHOW_STAT) || defined(SHOW_STAT2)\n#include <stdio.h>\n#endif\n\n#include \"LzmaEnc.h\"\n\n#include \"LzFind.h\"\n#ifdef COMPRESS_MF_MT\n#include \"LzFindMt.h\"\n#endif\n\n#ifdef SHOW_STAT\nstatic int ttt = 0;\n#endif\n\n#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1)\n\n#define kBlockSize (9 << 10)\n#define kUnpackBlockSize (1 << 18)\n#define kMatchArraySize (1 << 21)\n#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX)\n\n#define kNumMaxDirectBits (31)\n\n#define kNumTopBits 24\n#define kTopValue ((UInt32)1 << kNumTopBits)\n\n#define kNumBitModelTotalBits 11\n#define kBitModelTotal (1 << kNumBitModelTotalBits)\n#define kNumMoveBits 5\n#define kProbInitValue (kBitModelTotal >> 1)\n\n#define kNumMoveReducingBits 4\n#define kNumBitPriceShiftBits 4\n#define kBitPrice (1 << kNumBitPriceShiftBits)\n\nvoid LzmaEncProps_Init(CLzmaEncProps *p)\n{\n  p->level = 5;\n  p->dictSize = p->mc = 0;\n  p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;\n  p->writeEndMark = 0;\n}\n\nvoid LzmaEncProps_Normalize(CLzmaEncProps *p)\n{\n  int level = p->level;\n  if (level < 0) level = 5;\n  p->level = level;\n  if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)));\n  if (p->lc < 0) p->lc = 3;\n  if (p->lp < 0) p->lp = 0;\n  if (p->pb < 0) p->pb = 2;\n  if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);\n  if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);\n  if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);\n  if (p->numHashBytes < 0) p->numHashBytes = 4;\n  if (p->mc == 0)  p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);\n  if (p->numThreads < 0)\n    p->numThreads =\n      #ifdef COMPRESS_MF_MT\n      ((p->btMode && p->algo) ? 2 : 1);\n      #else\n      1;\n      #endif\n}\n\nUInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)\n{\n  CLzmaEncProps props = *props2;\n  LzmaEncProps_Normalize(&props);\n  return props.dictSize;\n}\n\n/* #define LZMA_LOG_BSR */\n/* Define it for Intel's CPU */\n\n\n#ifdef LZMA_LOG_BSR\n\n#define kDicLogSizeMaxCompress 30\n\n#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }\n\nUInt32 GetPosSlot1(UInt32 pos)\n{\n  UInt32 res;\n  BSR2_RET(pos, res);\n  return res;\n}\n#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }\n#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }\n\n#else\n\n#define kNumLogBits (9 + (int)sizeof(size_t) / 2)\n#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)\n\nvoid LzmaEnc_FastPosInit(Byte *g_FastPos)\n{\n  int c = 2, slotFast;\n  g_FastPos[0] = 0;\n  g_FastPos[1] = 1;\n  \n  for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++)\n  {\n    UInt32 k = (1 << ((slotFast >> 1) - 1));\n    UInt32 j;\n    for (j = 0; j < k; j++, c++)\n      g_FastPos[c] = (Byte)slotFast;\n  }\n}\n\n#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \\\n  (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \\\n  res = p->g_FastPos[pos >> i] + (i * 2); }\n/*\n#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \\\n  p->g_FastPos[pos >> 6] + 12 : \\\n  p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }\n*/\n\n#define GetPosSlot1(pos) p->g_FastPos[pos]\n#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }\n#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); }\n\n#endif\n\n\n#define LZMA_NUM_REPS 4\n\ntypedef unsigned CState;\n\ntypedef struct _COptimal\n{\n  UInt32 price;\n\n  CState state;\n  int prev1IsChar;\n  int prev2;\n\n  UInt32 posPrev2;\n  UInt32 backPrev2;\n\n  UInt32 posPrev;\n  UInt32 backPrev;\n  UInt32 backs[LZMA_NUM_REPS];\n} COptimal;\n\n#define kNumOpts (1 << 12)\n\n#define kNumLenToPosStates 4\n#define kNumPosSlotBits 6\n#define kDicLogSizeMin 0\n#define kDicLogSizeMax 32\n#define kDistTableSizeMax (kDicLogSizeMax * 2)\n\n\n#define kNumAlignBits 4\n#define kAlignTableSize (1 << kNumAlignBits)\n#define kAlignMask (kAlignTableSize - 1)\n\n#define kStartPosModelIndex 4\n#define kEndPosModelIndex 14\n#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex)\n\n#define kNumFullDistances (1 << (kEndPosModelIndex / 2))\n\n#ifdef _LZMA_PROB32\n#define CLzmaProb UInt32\n#else\n#define CLzmaProb UInt16\n#endif\n\n#define LZMA_PB_MAX 4\n#define LZMA_LC_MAX 8\n#define LZMA_LP_MAX 4\n\n#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)\n\n\n#define kLenNumLowBits 3\n#define kLenNumLowSymbols (1 << kLenNumLowBits)\n#define kLenNumMidBits 3\n#define kLenNumMidSymbols (1 << kLenNumMidBits)\n#define kLenNumHighBits 8\n#define kLenNumHighSymbols (1 << kLenNumHighBits)\n\n#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)\n\n#define LZMA_MATCH_LEN_MIN 2\n#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)\n\n#define kNumStates 12\n\ntypedef struct\n{\n  CLzmaProb choice;\n  CLzmaProb choice2;\n  CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits];\n  CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits];\n  CLzmaProb high[kLenNumHighSymbols];\n} CLenEnc;\n\ntypedef struct\n{\n  CLenEnc p;\n  UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];\n  UInt32 tableSize;\n  UInt32 counters[LZMA_NUM_PB_STATES_MAX];\n} CLenPriceEnc;\n\ntypedef struct _CRangeEnc\n{\n  UInt32 range;\n  Byte cache;\n  UInt64 low;\n  UInt64 cacheSize;\n  Byte *buf;\n  Byte *bufLim;\n  Byte *bufBase;\n  ISeqOutStream *outStream;\n  UInt64 processed;\n  SRes res;\n} CRangeEnc;\n\ntypedef struct _CSeqInStreamBuf\n{\n  ISeqInStream funcTable;\n  const Byte *data;\n  SizeT rem;\n} CSeqInStreamBuf;\n\nstatic SRes MyRead(void *pp, void *data, size_t *size)\n{\n  size_t curSize = *size;\n  CSeqInStreamBuf *p = (CSeqInStreamBuf *)pp;\n  if (p->rem < curSize)\n    curSize = p->rem;\n  memcpy(data, p->data, curSize);\n  p->rem -= curSize;\n  p->data += curSize;\n  *size = curSize;\n  return SZ_OK;\n}\n\ntypedef struct\n{\n  CLzmaProb *litProbs;\n\n  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];\n  CLzmaProb isRep[kNumStates];\n  CLzmaProb isRepG0[kNumStates];\n  CLzmaProb isRepG1[kNumStates];\n  CLzmaProb isRepG2[kNumStates];\n  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];\n\n  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];\n  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];\n  CLzmaProb posAlignEncoder[1 << kNumAlignBits];\n  \n  CLenPriceEnc lenEnc;\n  CLenPriceEnc repLenEnc;\n\n  UInt32 reps[LZMA_NUM_REPS];\n  UInt32 state;\n} CSaveState;\n\ntypedef struct _CLzmaEnc\n{\n  IMatchFinder matchFinder;\n  void *matchFinderObj;\n\n  #ifdef COMPRESS_MF_MT\n  Bool mtMode;\n  CMatchFinderMt matchFinderMt;\n  #endif\n\n  CMatchFinder matchFinderBase;\n\n  #ifdef COMPRESS_MF_MT\n  Byte pad[128];\n  #endif\n  \n  UInt32 optimumEndIndex;\n  UInt32 optimumCurrentIndex;\n\n  UInt32 longestMatchLength;\n  UInt32 numPairs;\n  UInt32 numAvail;\n  COptimal opt[kNumOpts];\n  \n  #ifndef LZMA_LOG_BSR\n  Byte g_FastPos[1 << kNumLogBits];\n  #endif\n\n  UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];\n  UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];\n  UInt32 numFastBytes;\n  UInt32 additionalOffset;\n  UInt32 reps[LZMA_NUM_REPS];\n  UInt32 state;\n\n  UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];\n  UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];\n  UInt32 alignPrices[kAlignTableSize];\n  UInt32 alignPriceCount;\n\n  UInt32 distTableSize;\n\n  unsigned lc, lp, pb;\n  unsigned lpMask, pbMask;\n\n  CLzmaProb *litProbs;\n\n  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];\n  CLzmaProb isRep[kNumStates];\n  CLzmaProb isRepG0[kNumStates];\n  CLzmaProb isRepG1[kNumStates];\n  CLzmaProb isRepG2[kNumStates];\n  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];\n\n  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];\n  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];\n  CLzmaProb posAlignEncoder[1 << kNumAlignBits];\n  \n  CLenPriceEnc lenEnc;\n  CLenPriceEnc repLenEnc;\n\n  unsigned lclp;\n\n  Bool fastMode;\n  \n  CRangeEnc rc;\n\n  Bool writeEndMark;\n  UInt64 nowPos64;\n  UInt32 matchPriceCount;\n  Bool finished;\n  Bool multiThread;\n\n  SRes result;\n  UInt32 dictSize;\n  UInt32 matchFinderCycles;\n\n  ISeqInStream *inStream;\n  CSeqInStreamBuf seqBufInStream;\n\n  CSaveState saveState;\n} CLzmaEnc;\n\nvoid LzmaEnc_SaveState(CLzmaEncHandle pp)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  CSaveState *dest = &p->saveState;\n  int i;\n  dest->lenEnc = p->lenEnc;\n  dest->repLenEnc = p->repLenEnc;\n  dest->state = p->state;\n\n  for (i = 0; i < kNumStates; i++)\n  {\n    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));\n    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));\n  }\n  for (i = 0; i < kNumLenToPosStates; i++)\n    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));\n  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));\n  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));\n  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));\n  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));\n  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));\n  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));\n  memcpy(dest->reps, p->reps, sizeof(p->reps));\n  memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));\n}\n\nvoid LzmaEnc_RestoreState(CLzmaEncHandle pp)\n{\n  CLzmaEnc *dest = (CLzmaEnc *)pp;\n  const CSaveState *p = &dest->saveState;\n  int i;\n  dest->lenEnc = p->lenEnc;\n  dest->repLenEnc = p->repLenEnc;\n  dest->state = p->state;\n\n  for (i = 0; i < kNumStates; i++)\n  {\n    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));\n    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));\n  }\n  for (i = 0; i < kNumLenToPosStates; i++)\n    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));\n  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));\n  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));\n  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));\n  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));\n  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));\n  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));\n  memcpy(dest->reps, p->reps, sizeof(p->reps));\n  memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));\n}\n\nSRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  CLzmaEncProps props = *props2;\n  LzmaEncProps_Normalize(&props);\n\n  if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX ||\n      props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30))\n    return SZ_ERROR_PARAM;\n  p->dictSize = props.dictSize;\n  p->matchFinderCycles = props.mc;\n  {\n    unsigned fb = props.fb;\n    if (fb < 5)\n      fb = 5;\n    if (fb > LZMA_MATCH_LEN_MAX)\n      fb = LZMA_MATCH_LEN_MAX;\n    p->numFastBytes = fb;\n  }\n  p->lc = props.lc;\n  p->lp = props.lp;\n  p->pb = props.pb;\n  p->fastMode = (props.algo == 0);\n  p->matchFinderBase.btMode = props.btMode;\n  {\n    UInt32 numHashBytes = 4;\n    if (props.btMode)\n    {\n      if (props.numHashBytes < 2)\n        numHashBytes = 2;\n      else if (props.numHashBytes < 4)\n        numHashBytes = props.numHashBytes;\n    }\n    p->matchFinderBase.numHashBytes = numHashBytes;\n  }\n\n  p->matchFinderBase.cutValue = props.mc;\n\n  p->writeEndMark = props.writeEndMark;\n\n  #ifdef COMPRESS_MF_MT\n  /*\n  if (newMultiThread != _multiThread)\n  {\n    ReleaseMatchFinder();\n    _multiThread = newMultiThread;\n  }\n  */\n  p->multiThread = (props.numThreads > 1);\n  #endif\n\n  return SZ_OK;\n}\n\nstatic const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};\nstatic const int kMatchNextStates[kNumStates]   = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};\nstatic const int kRepNextStates[kNumStates]     = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};\nstatic const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};\n\n#define IsCharState(s) ((s) < 7)\n\n#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)\n\n#define kInfinityPrice (1 << 30)\n\nstatic void RangeEnc_Construct(CRangeEnc *p)\n{\n  p->outStream = 0;\n  p->bufBase = 0;\n}\n\n#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)\n\n#define RC_BUF_SIZE (1 << 16)\nstatic int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc)\n{\n  if (p->bufBase == 0)\n  {\n    p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE);\n    if (p->bufBase == 0)\n      return 0;\n    p->bufLim = p->bufBase + RC_BUF_SIZE;\n  }\n  return 1;\n}\n\nstatic void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->bufBase);\n  p->bufBase = 0;\n}\n\nstatic void RangeEnc_Init(CRangeEnc *p)\n{\n  /* Stream.Init(); */\n  p->low = 0;\n  p->range = 0xFFFFFFFF;\n  p->cacheSize = 1;\n  p->cache = 0;\n\n  p->buf = p->bufBase;\n\n  p->processed = 0;\n  p->res = SZ_OK;\n}\n\nstatic void RangeEnc_FlushStream(CRangeEnc *p)\n{\n  size_t num;\n  if (p->res != SZ_OK)\n    return;\n  num = p->buf - p->bufBase;\n  if (num != p->outStream->Write(p->outStream, p->bufBase, num))\n    p->res = SZ_ERROR_WRITE;\n  p->processed += num;\n  p->buf = p->bufBase;\n}\n\nstatic void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)\n{\n  if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0)\n  {\n    Byte temp = p->cache;\n    do\n    {\n      Byte *buf = p->buf;\n      *buf++ = (Byte)(temp + (Byte)(p->low >> 32));\n      p->buf = buf;\n      if (buf == p->bufLim)\n        RangeEnc_FlushStream(p);\n      temp = 0xFF;\n    }\n    while (--p->cacheSize != 0);\n    p->cache = (Byte)((UInt32)p->low >> 24);\n  }\n  p->cacheSize++;\n  p->low = (UInt32)p->low << 8;\n}\n\nstatic void RangeEnc_FlushData(CRangeEnc *p)\n{\n  int i;\n  for (i = 0; i < 5; i++)\n    RangeEnc_ShiftLow(p);\n}\n\nstatic void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits)\n{\n  do\n  {\n    p->range >>= 1;\n    p->low += p->range & (0 - ((value >> --numBits) & 1));\n    if (p->range < kTopValue)\n    {\n      p->range <<= 8;\n      RangeEnc_ShiftLow(p);\n    }\n  }\n  while (numBits != 0);\n}\n\nstatic void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol)\n{\n  UInt32 ttt = *prob;\n  UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt;\n  if (symbol == 0)\n  {\n    p->range = newBound;\n    ttt += (kBitModelTotal - ttt) >> kNumMoveBits;\n  }\n  else\n  {\n    p->low += newBound;\n    p->range -= newBound;\n    ttt -= ttt >> kNumMoveBits;\n  }\n  *prob = (CLzmaProb)ttt;\n  if (p->range < kTopValue)\n  {\n    p->range <<= 8;\n    RangeEnc_ShiftLow(p);\n  }\n}\n\nstatic void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol)\n{\n  symbol |= 0x100;\n  do\n  {\n    RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1);\n    symbol <<= 1;\n  }\n  while (symbol < 0x10000);\n}\n\nstatic void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte)\n{\n  UInt32 offs = 0x100;\n  symbol |= 0x100;\n  do\n  {\n    matchByte <<= 1;\n    RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1);\n    symbol <<= 1;\n    offs &= ~(matchByte ^ symbol);\n  }\n  while (symbol < 0x10000);\n}\n\nvoid LzmaEnc_InitPriceTables(UInt32 *ProbPrices)\n{\n  UInt32 i;\n  for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))\n  {\n    const int kCyclesBits = kNumBitPriceShiftBits;\n    UInt32 w = i;\n    UInt32 bitCount = 0;\n    int j;\n    for (j = 0; j < kCyclesBits; j++)\n    {\n      w = w * w;\n      bitCount <<= 1;\n      while (w >= ((UInt32)1 << 16))\n      {\n        w >>= 1;\n        bitCount++;\n      }\n    }\n    ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);\n  }\n}\n\n\n#define GET_PRICE(prob, symbol) \\\n  p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];\n\n#define GET_PRICEa(prob, symbol) \\\n  ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];\n\n#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]\n#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]\n\n#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits]\n#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]\n\nstatic UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices)\n{\n  UInt32 price = 0;\n  symbol |= 0x100;\n  do\n  {\n    price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1);\n    symbol <<= 1;\n  }\n  while (symbol < 0x10000);\n  return price;\n}\n\nstatic UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices)\n{\n  UInt32 price = 0;\n  UInt32 offs = 0x100;\n  symbol |= 0x100;\n  do\n  {\n    matchByte <<= 1;\n    price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1);\n    symbol <<= 1;\n    offs &= ~(matchByte ^ symbol);\n  }\n  while (symbol < 0x10000);\n  return price;\n}\n\n\nstatic void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)\n{\n  UInt32 m = 1;\n  int i;\n  for (i = numBitLevels; i != 0;)\n  {\n    UInt32 bit;\n    i--;\n    bit = (symbol >> i) & 1;\n    RangeEnc_EncodeBit(rc, probs + m, bit);\n    m = (m << 1) | bit;\n  }\n}\n\nstatic void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)\n{\n  UInt32 m = 1;\n  int i;\n  for (i = 0; i < numBitLevels; i++)\n  {\n    UInt32 bit = symbol & 1;\n    RangeEnc_EncodeBit(rc, probs + m, bit);\n    m = (m << 1) | bit;\n    symbol >>= 1;\n  }\n}\n\nstatic UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)\n{\n  UInt32 price = 0;\n  symbol |= (1 << numBitLevels);\n  while (symbol != 1)\n  {\n    price += GET_PRICEa(probs[symbol >> 1], symbol & 1);\n    symbol >>= 1;\n  }\n  return price;\n}\n\nstatic UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)\n{\n  UInt32 price = 0;\n  UInt32 m = 1;\n  int i;\n  for (i = numBitLevels; i != 0; i--)\n  {\n    UInt32 bit = symbol & 1;\n    symbol >>= 1;\n    price += GET_PRICEa(probs[m], bit);\n    m = (m << 1) | bit;\n  }\n  return price;\n}\n\n\nstatic void LenEnc_Init(CLenEnc *p)\n{\n  unsigned i;\n  p->choice = p->choice2 = kProbInitValue;\n  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++)\n    p->low[i] = kProbInitValue;\n  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++)\n    p->mid[i] = kProbInitValue;\n  for (i = 0; i < kLenNumHighSymbols; i++)\n    p->high[i] = kProbInitValue;\n}\n\nstatic void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState)\n{\n  if (symbol < kLenNumLowSymbols)\n  {\n    RangeEnc_EncodeBit(rc, &p->choice, 0);\n    RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol);\n  }\n  else\n  {\n    RangeEnc_EncodeBit(rc, &p->choice, 1);\n    if (symbol < kLenNumLowSymbols + kLenNumMidSymbols)\n    {\n      RangeEnc_EncodeBit(rc, &p->choice2, 0);\n      RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols);\n    }\n    else\n    {\n      RangeEnc_EncodeBit(rc, &p->choice2, 1);\n      RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols);\n    }\n  }\n}\n\nstatic void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices)\n{\n  UInt32 a0 = GET_PRICE_0a(p->choice);\n  UInt32 a1 = GET_PRICE_1a(p->choice);\n  UInt32 b0 = a1 + GET_PRICE_0a(p->choice2);\n  UInt32 b1 = a1 + GET_PRICE_1a(p->choice2);\n  UInt32 i = 0;\n  for (i = 0; i < kLenNumLowSymbols; i++)\n  {\n    if (i >= numSymbols)\n      return;\n    prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices);\n  }\n  for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++)\n  {\n    if (i >= numSymbols)\n      return;\n    prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices);\n  }\n  for (; i < numSymbols; i++)\n    prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices);\n}\n\nstatic void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices)\n{\n  LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices);\n  p->counters[posState] = p->tableSize;\n}\n\nstatic void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices)\n{\n  UInt32 posState;\n  for (posState = 0; posState < numPosStates; posState++)\n    LenPriceEnc_UpdateTable(p, posState, ProbPrices);\n}\n\nstatic void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices)\n{\n  LenEnc_Encode(&p->p, rc, symbol, posState);\n  if (updatePrice)\n    if (--p->counters[posState] == 0)\n      LenPriceEnc_UpdateTable(p, posState, ProbPrices);\n}\n\n\n\n\nstatic void MovePos(CLzmaEnc *p, UInt32 num)\n{\n  #ifdef SHOW_STAT\n  ttt += num;\n  printf(\"\\n MovePos %d\", num);\n  #endif\n  if (num != 0)\n  {\n    p->additionalOffset += num;\n    p->matchFinder.Skip(p->matchFinderObj, num);\n  }\n}\n\nstatic UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes)\n{\n  UInt32 lenRes = 0, numPairs;\n  p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);\n  numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);\n  #ifdef SHOW_STAT\n  printf(\"\\n i = %d numPairs = %d    \", ttt, numPairs / 2);\n  ttt++;\n  {\n    UInt32 i;\n    for (i = 0; i < numPairs; i += 2)\n      printf(\"%2d %6d   | \", p->matches[i], p->matches[i + 1]);\n  }\n  #endif\n  if (numPairs > 0)\n  {\n    lenRes = p->matches[numPairs - 2];\n    if (lenRes == p->numFastBytes)\n    {\n      const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n      UInt32 distance = p->matches[numPairs - 1] + 1;\n      UInt32 numAvail = p->numAvail;\n      if (numAvail > LZMA_MATCH_LEN_MAX)\n        numAvail = LZMA_MATCH_LEN_MAX;\n      {\n        const Byte *pby2 = pby - distance;\n        for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++);\n      }\n    }\n  }\n  p->additionalOffset++;\n  *numDistancePairsRes = numPairs;\n  return lenRes;\n}\n\n\n#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False;\n#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False;\n#define IsShortRep(p) ((p)->backPrev == 0)\n\nstatic UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState)\n{\n  return\n    GET_PRICE_0(p->isRepG0[state]) +\n    GET_PRICE_0(p->isRep0Long[state][posState]);\n}\n\nstatic UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState)\n{\n  UInt32 price;\n  if (repIndex == 0)\n  {\n    price = GET_PRICE_0(p->isRepG0[state]);\n    price += GET_PRICE_1(p->isRep0Long[state][posState]);\n  }\n  else\n  {\n    price = GET_PRICE_1(p->isRepG0[state]);\n    if (repIndex == 1)\n      price += GET_PRICE_0(p->isRepG1[state]);\n    else\n    {\n      price += GET_PRICE_1(p->isRepG1[state]);\n      price += GET_PRICE(p->isRepG2[state], repIndex - 2);\n    }\n  }\n  return price;\n}\n\nstatic UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState)\n{\n  return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] +\n    GetPureRepPrice(p, repIndex, state, posState);\n}\n\nstatic UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur)\n{\n  UInt32 posMem = p->opt[cur].posPrev;\n  UInt32 backMem = p->opt[cur].backPrev;\n  p->optimumEndIndex = cur;\n  do\n  {\n    if (p->opt[cur].prev1IsChar)\n    {\n      MakeAsChar(&p->opt[posMem])\n      p->opt[posMem].posPrev = posMem - 1;\n      if (p->opt[cur].prev2)\n      {\n        p->opt[posMem - 1].prev1IsChar = False;\n        p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2;\n        p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2;\n      }\n    }\n    {\n      UInt32 posPrev = posMem;\n      UInt32 backCur = backMem;\n      \n      backMem = p->opt[posPrev].backPrev;\n      posMem = p->opt[posPrev].posPrev;\n      \n      p->opt[posPrev].backPrev = backCur;\n      p->opt[posPrev].posPrev = cur;\n      cur = posPrev;\n    }\n  }\n  while (cur != 0);\n  *backRes = p->opt[0].backPrev;\n  p->optimumCurrentIndex  = p->opt[0].posPrev;\n  return p->optimumCurrentIndex;\n}\n\n#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300)\n\nstatic UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes)\n{\n  UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur;\n  UInt32 matchPrice, repMatchPrice, normalMatchPrice;\n  UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS];\n  UInt32 *matches;\n  const Byte *data;\n  Byte curByte, matchByte;\n  if (p->optimumEndIndex != p->optimumCurrentIndex)\n  {\n    const COptimal *opt = &p->opt[p->optimumCurrentIndex];\n    UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex;\n    *backRes = opt->backPrev;\n    p->optimumCurrentIndex = opt->posPrev;\n    return lenRes;\n  }\n  p->optimumCurrentIndex = p->optimumEndIndex = 0;\n  \n  if (p->additionalOffset == 0)\n    mainLen = ReadMatchDistances(p, &numPairs);\n  else\n  {\n    mainLen = p->longestMatchLength;\n    numPairs = p->numPairs;\n  }\n\n  numAvail = p->numAvail;\n  if (numAvail < 2)\n  {\n    *backRes = (UInt32)(-1);\n    return 1;\n  }\n  if (numAvail > LZMA_MATCH_LEN_MAX)\n    numAvail = LZMA_MATCH_LEN_MAX;\n\n  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n  repMaxIndex = 0;\n  for (i = 0; i < LZMA_NUM_REPS; i++)\n  {\n    UInt32 lenTest;\n    const Byte *data2;\n    reps[i] = p->reps[i];\n    data2 = data - (reps[i] + 1);\n    if (data[0] != data2[0] || data[1] != data2[1])\n    {\n      repLens[i] = 0;\n      continue;\n    }\n    for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);\n    repLens[i] = lenTest;\n    if (lenTest > repLens[repMaxIndex])\n      repMaxIndex = i;\n  }\n  if (repLens[repMaxIndex] >= p->numFastBytes)\n  {\n    UInt32 lenRes;\n    *backRes = repMaxIndex;\n    lenRes = repLens[repMaxIndex];\n    MovePos(p, lenRes - 1);\n    return lenRes;\n  }\n\n  matches = p->matches;\n  if (mainLen >= p->numFastBytes)\n  {\n    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;\n    MovePos(p, mainLen - 1);\n    return mainLen;\n  }\n  curByte = *data;\n  matchByte = *(data - (reps[0] + 1));\n\n  if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2)\n  {\n    *backRes = (UInt32)-1;\n    return 1;\n  }\n\n  p->opt[0].state = (CState)p->state;\n\n  posState = (position & p->pbMask);\n\n  {\n    const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));\n    p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) +\n        (!IsCharState(p->state) ?\n          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :\n          LitEnc_GetPrice(probs, curByte, p->ProbPrices));\n  }\n\n  MakeAsChar(&p->opt[1]);\n\n  matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);\n  repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);\n\n  if (matchByte == curByte)\n  {\n    UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState);\n    if (shortRepPrice < p->opt[1].price)\n    {\n      p->opt[1].price = shortRepPrice;\n      MakeAsShortRep(&p->opt[1]);\n    }\n  }\n  lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]);\n\n  if (lenEnd < 2)\n  {\n    *backRes = p->opt[1].backPrev;\n    return 1;\n  }\n\n  p->opt[1].posPrev = 0;\n  for (i = 0; i < LZMA_NUM_REPS; i++)\n    p->opt[0].backs[i] = reps[i];\n\n  len = lenEnd;\n  do\n    p->opt[len--].price = kInfinityPrice;\n  while (len >= 2);\n\n  for (i = 0; i < LZMA_NUM_REPS; i++)\n  {\n    UInt32 repLen = repLens[i];\n    UInt32 price;\n    if (repLen < 2)\n      continue;\n    price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState);\n    do\n    {\n      UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2];\n      COptimal *opt = &p->opt[repLen];\n      if (curAndLenPrice < opt->price)\n      {\n        opt->price = curAndLenPrice;\n        opt->posPrev = 0;\n        opt->backPrev = i;\n        opt->prev1IsChar = False;\n      }\n    }\n    while (--repLen >= 2);\n  }\n\n  normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);\n\n  len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);\n  if (len <= mainLen)\n  {\n    UInt32 offs = 0;\n    while (len > matches[offs])\n      offs += 2;\n    for (; ; len++)\n    {\n      COptimal *opt;\n      UInt32 distance = matches[offs + 1];\n\n      UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN];\n      UInt32 lenToPosState = GetLenToPosState(len);\n      if (distance < kNumFullDistances)\n        curAndLenPrice += p->distancesPrices[lenToPosState][distance];\n      else\n      {\n        UInt32 slot;\n        GetPosSlot2(distance, slot);\n        curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot];\n      }\n      opt = &p->opt[len];\n      if (curAndLenPrice < opt->price)\n      {\n        opt->price = curAndLenPrice;\n        opt->posPrev = 0;\n        opt->backPrev = distance + LZMA_NUM_REPS;\n        opt->prev1IsChar = False;\n      }\n      if (len == matches[offs])\n      {\n        offs += 2;\n        if (offs == numPairs)\n          break;\n      }\n    }\n  }\n\n  cur = 0;\n\n    #ifdef SHOW_STAT2\n    if (position >= 0)\n    {\n      unsigned i;\n      printf(\"\\n pos = %4X\", position);\n      for (i = cur; i <= lenEnd; i++)\n      printf(\"\\nprice[%4X] = %d\", position - cur + i, p->opt[i].price);\n    }\n    #endif\n\n  for (;;)\n  {\n    UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen;\n    UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice;\n    Bool nextIsChar;\n    Byte curByte, matchByte;\n    const Byte *data;\n    COptimal *curOpt;\n    COptimal *nextOpt;\n\n    cur++;\n    if (cur == lenEnd)\n      return Backward(p, backRes, cur);\n\n    newLen = ReadMatchDistances(p, &numPairs);\n    if (newLen >= p->numFastBytes)\n    {\n      p->numPairs = numPairs;\n      p->longestMatchLength = newLen;\n      return Backward(p, backRes, cur);\n    }\n    position++;\n    curOpt = &p->opt[cur];\n    posPrev = curOpt->posPrev;\n    if (curOpt->prev1IsChar)\n    {\n      posPrev--;\n      if (curOpt->prev2)\n      {\n        state = p->opt[curOpt->posPrev2].state;\n        if (curOpt->backPrev2 < LZMA_NUM_REPS)\n          state = kRepNextStates[state];\n        else\n          state = kMatchNextStates[state];\n      }\n      else\n        state = p->opt[posPrev].state;\n      state = kLiteralNextStates[state];\n    }\n    else\n      state = p->opt[posPrev].state;\n    if (posPrev == cur - 1)\n    {\n      if (IsShortRep(curOpt))\n        state = kShortRepNextStates[state];\n      else\n        state = kLiteralNextStates[state];\n    }\n    else\n    {\n      UInt32 pos;\n      const COptimal *prevOpt;\n      if (curOpt->prev1IsChar && curOpt->prev2)\n      {\n        posPrev = curOpt->posPrev2;\n        pos = curOpt->backPrev2;\n        state = kRepNextStates[state];\n      }\n      else\n      {\n        pos = curOpt->backPrev;\n        if (pos < LZMA_NUM_REPS)\n          state = kRepNextStates[state];\n        else\n          state = kMatchNextStates[state];\n      }\n      prevOpt = &p->opt[posPrev];\n      if (pos < LZMA_NUM_REPS)\n      {\n        UInt32 i;\n        reps[0] = prevOpt->backs[pos];\n        for (i = 1; i <= pos; i++)\n          reps[i] = prevOpt->backs[i - 1];\n        for (; i < LZMA_NUM_REPS; i++)\n          reps[i] = prevOpt->backs[i];\n      }\n      else\n      {\n        UInt32 i;\n        reps[0] = (pos - LZMA_NUM_REPS);\n        for (i = 1; i < LZMA_NUM_REPS; i++)\n          reps[i] = prevOpt->backs[i - 1];\n      }\n    }\n    curOpt->state = (CState)state;\n\n    curOpt->backs[0] = reps[0];\n    curOpt->backs[1] = reps[1];\n    curOpt->backs[2] = reps[2];\n    curOpt->backs[3] = reps[3];\n\n    curPrice = curOpt->price;\n    nextIsChar = False;\n    data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n    curByte = *data;\n    matchByte = *(data - (reps[0] + 1));\n\n    posState = (position & p->pbMask);\n\n    curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]);\n    {\n      const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));\n      curAnd1Price +=\n        (!IsCharState(state) ?\n          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :\n          LitEnc_GetPrice(probs, curByte, p->ProbPrices));\n    }\n\n    nextOpt = &p->opt[cur + 1];\n\n    if (curAnd1Price < nextOpt->price)\n    {\n      nextOpt->price = curAnd1Price;\n      nextOpt->posPrev = cur;\n      MakeAsChar(nextOpt);\n      nextIsChar = True;\n    }\n\n    matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]);\n    repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);\n    \n    if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0))\n    {\n      UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState);\n      if (shortRepPrice <= nextOpt->price)\n      {\n        nextOpt->price = shortRepPrice;\n        nextOpt->posPrev = cur;\n        MakeAsShortRep(nextOpt);\n        nextIsChar = True;\n      }\n    }\n    numAvailFull = p->numAvail;\n    {\n      UInt32 temp = kNumOpts - 1 - cur;\n      if (temp < numAvailFull)\n        numAvailFull = temp;\n    }\n\n    if (numAvailFull < 2)\n      continue;\n    numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);\n\n    if (!nextIsChar && matchByte != curByte) /* speed optimization */\n    {\n      /* try Literal + rep0 */\n      UInt32 temp;\n      UInt32 lenTest2;\n      const Byte *data2 = data - (reps[0] + 1);\n      UInt32 limit = p->numFastBytes + 1;\n      if (limit > numAvailFull)\n        limit = numAvailFull;\n\n      for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++);\n      lenTest2 = temp - 1;\n      if (lenTest2 >= 2)\n      {\n        UInt32 state2 = kLiteralNextStates[state];\n        UInt32 posStateNext = (position + 1) & p->pbMask;\n        UInt32 nextRepMatchPrice = curAnd1Price +\n            GET_PRICE_1(p->isMatch[state2][posStateNext]) +\n            GET_PRICE_1(p->isRep[state2]);\n        /* for (; lenTest2 >= 2; lenTest2--) */\n        {\n          UInt32 curAndLenPrice;\n          COptimal *opt;\n          UInt32 offset = cur + 1 + lenTest2;\n          while (lenEnd < offset)\n            p->opt[++lenEnd].price = kInfinityPrice;\n          curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);\n          opt = &p->opt[offset];\n          if (curAndLenPrice < opt->price)\n          {\n            opt->price = curAndLenPrice;\n            opt->posPrev = cur + 1;\n            opt->backPrev = 0;\n            opt->prev1IsChar = True;\n            opt->prev2 = False;\n          }\n        }\n      }\n    }\n    \n    startLen = 2; /* speed optimization */\n    {\n    UInt32 repIndex;\n    for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++)\n    {\n      UInt32 lenTest;\n      UInt32 lenTestTemp;\n      UInt32 price;\n      const Byte *data2 = data - (reps[repIndex] + 1);\n      if (data[0] != data2[0] || data[1] != data2[1])\n        continue;\n      for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);\n      while (lenEnd < cur + lenTest)\n        p->opt[++lenEnd].price = kInfinityPrice;\n      lenTestTemp = lenTest;\n      price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState);\n      do\n      {\n        UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2];\n        COptimal *opt = &p->opt[cur + lenTest];\n        if (curAndLenPrice < opt->price)\n        {\n          opt->price = curAndLenPrice;\n          opt->posPrev = cur;\n          opt->backPrev = repIndex;\n          opt->prev1IsChar = False;\n        }\n      }\n      while (--lenTest >= 2);\n      lenTest = lenTestTemp;\n      \n      if (repIndex == 0)\n        startLen = lenTest + 1;\n        \n      /* if (_maxMode) */\n        {\n          UInt32 lenTest2 = lenTest + 1;\n          UInt32 limit = lenTest2 + p->numFastBytes;\n          UInt32 nextRepMatchPrice;\n          if (limit > numAvailFull)\n            limit = numAvailFull;\n          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);\n          lenTest2 -= lenTest + 1;\n          if (lenTest2 >= 2)\n          {\n            UInt32 state2 = kRepNextStates[state];\n            UInt32 posStateNext = (position + lenTest) & p->pbMask;\n            UInt32 curAndLenCharPrice =\n                price + p->repLenEnc.prices[posState][lenTest - 2] +\n                GET_PRICE_0(p->isMatch[state2][posStateNext]) +\n                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),\n                    data[lenTest], data2[lenTest], p->ProbPrices);\n            state2 = kLiteralNextStates[state2];\n            posStateNext = (position + lenTest + 1) & p->pbMask;\n            nextRepMatchPrice = curAndLenCharPrice +\n                GET_PRICE_1(p->isMatch[state2][posStateNext]) +\n                GET_PRICE_1(p->isRep[state2]);\n            \n            /* for (; lenTest2 >= 2; lenTest2--) */\n            {\n              UInt32 curAndLenPrice;\n              COptimal *opt;\n              UInt32 offset = cur + lenTest + 1 + lenTest2;\n              while (lenEnd < offset)\n                p->opt[++lenEnd].price = kInfinityPrice;\n              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);\n              opt = &p->opt[offset];\n              if (curAndLenPrice < opt->price)\n              {\n                opt->price = curAndLenPrice;\n                opt->posPrev = cur + lenTest + 1;\n                opt->backPrev = 0;\n                opt->prev1IsChar = True;\n                opt->prev2 = True;\n                opt->posPrev2 = cur;\n                opt->backPrev2 = repIndex;\n              }\n            }\n          }\n        }\n    }\n    }\n    /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */\n    if (newLen > numAvail)\n    {\n      newLen = numAvail;\n      for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2);\n      matches[numPairs] = newLen;\n      numPairs += 2;\n    }\n    if (newLen >= startLen)\n    {\n      UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);\n      UInt32 offs, curBack, posSlot;\n      UInt32 lenTest;\n      while (lenEnd < cur + newLen)\n        p->opt[++lenEnd].price = kInfinityPrice;\n\n      offs = 0;\n      while (startLen > matches[offs])\n        offs += 2;\n      curBack = matches[offs + 1];\n      GetPosSlot2(curBack, posSlot);\n      for (lenTest = /*2*/ startLen; ; lenTest++)\n      {\n        UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN];\n        UInt32 lenToPosState = GetLenToPosState(lenTest);\n        COptimal *opt;\n        if (curBack < kNumFullDistances)\n          curAndLenPrice += p->distancesPrices[lenToPosState][curBack];\n        else\n          curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask];\n        \n        opt = &p->opt[cur + lenTest];\n        if (curAndLenPrice < opt->price)\n        {\n          opt->price = curAndLenPrice;\n          opt->posPrev = cur;\n          opt->backPrev = curBack + LZMA_NUM_REPS;\n          opt->prev1IsChar = False;\n        }\n\n        if (/*_maxMode && */lenTest == matches[offs])\n        {\n          /* Try Match + Literal + Rep0 */\n          const Byte *data2 = data - (curBack + 1);\n          UInt32 lenTest2 = lenTest + 1;\n          UInt32 limit = lenTest2 + p->numFastBytes;\n          UInt32 nextRepMatchPrice;\n          if (limit > numAvailFull)\n            limit = numAvailFull;\n          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);\n          lenTest2 -= lenTest + 1;\n          if (lenTest2 >= 2)\n          {\n            UInt32 state2 = kMatchNextStates[state];\n            UInt32 posStateNext = (position + lenTest) & p->pbMask;\n            UInt32 curAndLenCharPrice = curAndLenPrice +\n                GET_PRICE_0(p->isMatch[state2][posStateNext]) +\n                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),\n                    data[lenTest], data2[lenTest], p->ProbPrices);\n            state2 = kLiteralNextStates[state2];\n            posStateNext = (posStateNext + 1) & p->pbMask;\n            nextRepMatchPrice = curAndLenCharPrice +\n                GET_PRICE_1(p->isMatch[state2][posStateNext]) +\n                GET_PRICE_1(p->isRep[state2]);\n            \n            /* for (; lenTest2 >= 2; lenTest2--) */\n            {\n              UInt32 offset = cur + lenTest + 1 + lenTest2;\n              UInt32 curAndLenPrice;\n              COptimal *opt;\n              while (lenEnd < offset)\n                p->opt[++lenEnd].price = kInfinityPrice;\n              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);\n              opt = &p->opt[offset];\n              if (curAndLenPrice < opt->price)\n              {\n                opt->price = curAndLenPrice;\n                opt->posPrev = cur + lenTest + 1;\n                opt->backPrev = 0;\n                opt->prev1IsChar = True;\n                opt->prev2 = True;\n                opt->posPrev2 = cur;\n                opt->backPrev2 = curBack + LZMA_NUM_REPS;\n              }\n            }\n          }\n          offs += 2;\n          if (offs == numPairs)\n            break;\n          curBack = matches[offs + 1];\n          if (curBack >= kNumFullDistances)\n            GetPosSlot2(curBack, posSlot);\n        }\n      }\n    }\n  }\n}\n\n#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))\n\nstatic UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes)\n{\n  UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i;\n  const Byte *data;\n  const UInt32 *matches;\n\n  if (p->additionalOffset == 0)\n    mainLen = ReadMatchDistances(p, &numPairs);\n  else\n  {\n    mainLen = p->longestMatchLength;\n    numPairs = p->numPairs;\n  }\n\n  numAvail = p->numAvail;\n  *backRes = (UInt32)-1;\n  if (numAvail < 2)\n    return 1;\n  if (numAvail > LZMA_MATCH_LEN_MAX)\n    numAvail = LZMA_MATCH_LEN_MAX;\n  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n\n  repLen = repIndex = 0;\n  for (i = 0; i < LZMA_NUM_REPS; i++)\n  {\n    UInt32 len;\n    const Byte *data2 = data - (p->reps[i] + 1);\n    if (data[0] != data2[0] || data[1] != data2[1])\n      continue;\n    for (len = 2; len < numAvail && data[len] == data2[len]; len++);\n    if (len >= p->numFastBytes)\n    {\n      *backRes = i;\n      MovePos(p, len - 1);\n      return len;\n    }\n    if (len > repLen)\n    {\n      repIndex = i;\n      repLen = len;\n    }\n  }\n\n  matches = p->matches;\n  if (mainLen >= p->numFastBytes)\n  {\n    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;\n    MovePos(p, mainLen - 1);\n    return mainLen;\n  }\n\n  mainDist = 0; /* for GCC */\n  if (mainLen >= 2)\n  {\n    mainDist = matches[numPairs - 1];\n    while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1)\n    {\n      if (!ChangePair(matches[numPairs - 3], mainDist))\n        break;\n      numPairs -= 2;\n      mainLen = matches[numPairs - 2];\n      mainDist = matches[numPairs - 1];\n    }\n    if (mainLen == 2 && mainDist >= 0x80)\n      mainLen = 1;\n  }\n\n  if (repLen >= 2 && (\n        (repLen + 1 >= mainLen) ||\n        (repLen + 2 >= mainLen && mainDist >= (1 << 9)) ||\n        (repLen + 3 >= mainLen && mainDist >= (1 << 15))))\n  {\n    *backRes = repIndex;\n    MovePos(p, repLen - 1);\n    return repLen;\n  }\n  \n  if (mainLen < 2 || numAvail <= 2)\n    return 1;\n\n  p->longestMatchLength = ReadMatchDistances(p, &p->numPairs);\n  if (p->longestMatchLength >= 2)\n  {\n    UInt32 newDistance = matches[p->numPairs - 1];\n    if ((p->longestMatchLength >= mainLen && newDistance < mainDist) ||\n        (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) ||\n        (p->longestMatchLength > mainLen + 1) ||\n        (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist)))\n      return 1;\n  }\n  \n  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n  for (i = 0; i < LZMA_NUM_REPS; i++)\n  {\n    UInt32 len, limit;\n    const Byte *data2 = data - (p->reps[i] + 1);\n    if (data[0] != data2[0] || data[1] != data2[1])\n      continue;\n    limit = mainLen - 1;\n    for (len = 2; len < limit && data[len] == data2[len]; len++);\n    if (len >= limit)\n      return 1;\n  }\n  *backRes = mainDist + LZMA_NUM_REPS;\n  MovePos(p, mainLen - 2);\n  return mainLen;\n}\n\nstatic void WriteEndMarker(CLzmaEnc *p, UInt32 posState)\n{\n  UInt32 len;\n  RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);\n  RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);\n  p->state = kMatchNextStates[p->state];\n  len = LZMA_MATCH_LEN_MIN;\n  LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);\n  RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1);\n  RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits);\n  RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);\n}\n\nstatic SRes CheckErrors(CLzmaEnc *p)\n{\n  if (p->result != SZ_OK)\n    return p->result;\n  if (p->rc.res != SZ_OK)\n    p->result = SZ_ERROR_WRITE;\n  if (p->matchFinderBase.result != SZ_OK)\n    p->result = SZ_ERROR_READ;\n  if (p->result != SZ_OK)\n    p->finished = True;\n  return p->result;\n}\n\nstatic SRes Flush(CLzmaEnc *p, UInt32 nowPos)\n{\n  /* ReleaseMFStream(); */\n  p->finished = True;\n  if (p->writeEndMark)\n    WriteEndMarker(p, nowPos & p->pbMask);\n  RangeEnc_FlushData(&p->rc);\n  RangeEnc_FlushStream(&p->rc);\n  return CheckErrors(p);\n}\n\nstatic void FillAlignPrices(CLzmaEnc *p)\n{\n  UInt32 i;\n  for (i = 0; i < kAlignTableSize; i++)\n    p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);\n  p->alignPriceCount = 0;\n}\n\nstatic void FillDistancesPrices(CLzmaEnc *p)\n{\n  UInt32 tempPrices[kNumFullDistances];\n  UInt32 i, lenToPosState;\n  for (i = kStartPosModelIndex; i < kNumFullDistances; i++)\n  {\n    UInt32 posSlot = GetPosSlot1(i);\n    UInt32 footerBits = ((posSlot >> 1) - 1);\n    UInt32 base = ((2 | (posSlot & 1)) << footerBits);\n    tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices);\n  }\n\n  for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)\n  {\n    UInt32 posSlot;\n    const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState];\n    UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState];\n    for (posSlot = 0; posSlot < p->distTableSize; posSlot++)\n      posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices);\n    for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++)\n      posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits);\n\n    {\n      UInt32 *distancesPrices = p->distancesPrices[lenToPosState];\n      UInt32 i;\n      for (i = 0; i < kStartPosModelIndex; i++)\n        distancesPrices[i] = posSlotPrices[i];\n      for (; i < kNumFullDistances; i++)\n        distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i];\n    }\n  }\n  p->matchPriceCount = 0;\n}\n\nvoid LzmaEnc_Construct(CLzmaEnc *p)\n{\n  RangeEnc_Construct(&p->rc);\n  MatchFinder_Construct(&p->matchFinderBase);\n  #ifdef COMPRESS_MF_MT\n  MatchFinderMt_Construct(&p->matchFinderMt);\n  p->matchFinderMt.MatchFinder = &p->matchFinderBase;\n  #endif\n\n  {\n    CLzmaEncProps props;\n    LzmaEncProps_Init(&props);\n    LzmaEnc_SetProps(p, &props);\n  }\n\n  #ifndef LZMA_LOG_BSR\n  LzmaEnc_FastPosInit(p->g_FastPos);\n  #endif\n\n  LzmaEnc_InitPriceTables(p->ProbPrices);\n  p->litProbs = 0;\n  p->saveState.litProbs = 0;\n}\n\nCLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)\n{\n  void *p;\n  p = alloc->Alloc(alloc, sizeof(CLzmaEnc));\n  if (p != 0)\n    LzmaEnc_Construct((CLzmaEnc *)p);\n  return p;\n}\n\nvoid LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)\n{\n  alloc->Free(alloc, p->litProbs);\n  alloc->Free(alloc, p->saveState.litProbs);\n  p->litProbs = 0;\n  p->saveState.litProbs = 0;\n}\n\nvoid LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  #ifdef COMPRESS_MF_MT\n  MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);\n  #endif\n  MatchFinder_Free(&p->matchFinderBase, allocBig);\n  LzmaEnc_FreeLits(p, alloc);\n  RangeEnc_Free(&p->rc, alloc);\n}\n\nvoid LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);\n  alloc->Free(alloc, p);\n}\n\nstatic SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize)\n{\n  UInt32 nowPos32, startPos32;\n  if (p->inStream != 0)\n  {\n    p->matchFinderBase.stream = p->inStream;\n    p->matchFinder.Init(p->matchFinderObj);\n    p->inStream = 0;\n  }\n\n  if (p->finished)\n    return p->result;\n  RINOK(CheckErrors(p));\n\n  nowPos32 = (UInt32)p->nowPos64;\n  startPos32 = nowPos32;\n\n  if (p->nowPos64 == 0)\n  {\n    UInt32 numPairs;\n    Byte curByte;\n    if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)\n      return Flush(p, nowPos32);\n    ReadMatchDistances(p, &numPairs);\n    RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0);\n    p->state = kLiteralNextStates[p->state];\n    curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset);\n    LitEnc_Encode(&p->rc, p->litProbs, curByte);\n    p->additionalOffset--;\n    nowPos32++;\n  }\n\n  if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)\n  for (;;)\n  {\n    UInt32 pos, len, posState;\n\n    if (p->fastMode)\n      len = GetOptimumFast(p, &pos);\n    else\n      len = GetOptimum(p, nowPos32, &pos);\n\n    #ifdef SHOW_STAT2\n    printf(\"\\n pos = %4X,   len = %d   pos = %d\", nowPos32, len, pos);\n    #endif\n\n    posState = nowPos32 & p->pbMask;\n    if (len == 1 && pos == (UInt32)-1)\n    {\n      Byte curByte;\n      CLzmaProb *probs;\n      const Byte *data;\n\n      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0);\n      data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;\n      curByte = *data;\n      probs = LIT_PROBS(nowPos32, *(data - 1));\n      if (IsCharState(p->state))\n        LitEnc_Encode(&p->rc, probs, curByte);\n      else\n        LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1));\n      p->state = kLiteralNextStates[p->state];\n    }\n    else\n    {\n      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);\n      if (pos < LZMA_NUM_REPS)\n      {\n        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1);\n        if (pos == 0)\n        {\n          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0);\n          RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1));\n        }\n        else\n        {\n          UInt32 distance = p->reps[pos];\n          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1);\n          if (pos == 1)\n            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0);\n          else\n          {\n            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1);\n            RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2);\n            if (pos == 3)\n              p->reps[3] = p->reps[2];\n            p->reps[2] = p->reps[1];\n          }\n          p->reps[1] = p->reps[0];\n          p->reps[0] = distance;\n        }\n        if (len == 1)\n          p->state = kShortRepNextStates[p->state];\n        else\n        {\n          LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);\n          p->state = kRepNextStates[p->state];\n        }\n      }\n      else\n      {\n        UInt32 posSlot;\n        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);\n        p->state = kMatchNextStates[p->state];\n        LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);\n        pos -= LZMA_NUM_REPS;\n        GetPosSlot(pos, posSlot);\n        RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot);\n        \n        if (posSlot >= kStartPosModelIndex)\n        {\n          UInt32 footerBits = ((posSlot >> 1) - 1);\n          UInt32 base = ((2 | (posSlot & 1)) << footerBits);\n          UInt32 posReduced = pos - base;\n\n          if (posSlot < kEndPosModelIndex)\n            RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced);\n          else\n          {\n            RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);\n            RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);\n            p->alignPriceCount++;\n          }\n        }\n        p->reps[3] = p->reps[2];\n        p->reps[2] = p->reps[1];\n        p->reps[1] = p->reps[0];\n        p->reps[0] = pos;\n        p->matchPriceCount++;\n      }\n    }\n    p->additionalOffset -= len;\n    nowPos32 += len;\n    if (p->additionalOffset == 0)\n    {\n      UInt32 processed;\n      if (!p->fastMode)\n      {\n        if (p->matchPriceCount >= (1 << 7))\n          FillDistancesPrices(p);\n        if (p->alignPriceCount >= kAlignTableSize)\n          FillAlignPrices(p);\n      }\n      if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)\n        break;\n      processed = nowPos32 - startPos32;\n      if (useLimits)\n      {\n        if (processed + kNumOpts + 300 >= maxUnpackSize ||\n            RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize)\n          break;\n      }\n      else if (processed >= (1 << 15))\n      {\n        p->nowPos64 += nowPos32 - startPos32;\n        return CheckErrors(p);\n      }\n    }\n  }\n  p->nowPos64 += nowPos32 - startPos32;\n  return Flush(p, nowPos32);\n}\n\n#define kBigHashDicLimit ((UInt32)1 << 24)\n\nstatic SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  UInt32 beforeSize = kNumOpts;\n  Bool btMode;\n  if (!RangeEnc_Alloc(&p->rc, alloc))\n    return SZ_ERROR_MEM;\n  btMode = (p->matchFinderBase.btMode != 0);\n  #ifdef COMPRESS_MF_MT\n  p->mtMode = (p->multiThread && !p->fastMode && btMode);\n  #endif\n\n  {\n    unsigned lclp = p->lc + p->lp;\n    if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp)\n    {\n      LzmaEnc_FreeLits(p, alloc);\n      p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));\n      p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));\n      if (p->litProbs == 0 || p->saveState.litProbs == 0)\n      {\n        LzmaEnc_FreeLits(p, alloc);\n        return SZ_ERROR_MEM;\n      }\n      p->lclp = lclp;\n    }\n  }\n\n  p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit);\n\n  if (beforeSize + p->dictSize < keepWindowSize)\n    beforeSize = keepWindowSize - p->dictSize;\n\n  #ifdef COMPRESS_MF_MT\n  if (p->mtMode)\n  {\n    RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig));\n    p->matchFinderObj = &p->matchFinderMt;\n    MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);\n  }\n  else\n  #endif\n  {\n    if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))\n      return SZ_ERROR_MEM;\n    p->matchFinderObj = &p->matchFinderBase;\n    MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);\n  }\n  return SZ_OK;\n}\n\nvoid LzmaEnc_Init(CLzmaEnc *p)\n{\n  UInt32 i;\n  p->state = 0;\n  for (i = 0 ; i < LZMA_NUM_REPS; i++)\n    p->reps[i] = 0;\n\n  RangeEnc_Init(&p->rc);\n\n\n  for (i = 0; i < kNumStates; i++)\n  {\n    UInt32 j;\n    for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)\n    {\n      p->isMatch[i][j] = kProbInitValue;\n      p->isRep0Long[i][j] = kProbInitValue;\n    }\n    p->isRep[i] = kProbInitValue;\n    p->isRepG0[i] = kProbInitValue;\n    p->isRepG1[i] = kProbInitValue;\n    p->isRepG2[i] = kProbInitValue;\n  }\n\n  {\n    UInt32 num = 0x300 << (p->lp + p->lc);\n    for (i = 0; i < num; i++)\n      p->litProbs[i] = kProbInitValue;\n  }\n\n  {\n    for (i = 0; i < kNumLenToPosStates; i++)\n    {\n      CLzmaProb *probs = p->posSlotEncoder[i];\n      UInt32 j;\n      for (j = 0; j < (1 << kNumPosSlotBits); j++)\n        probs[j] = kProbInitValue;\n    }\n  }\n  {\n    for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)\n      p->posEncoders[i] = kProbInitValue;\n  }\n\n  LenEnc_Init(&p->lenEnc.p);\n  LenEnc_Init(&p->repLenEnc.p);\n\n  for (i = 0; i < (1 << kNumAlignBits); i++)\n    p->posAlignEncoder[i] = kProbInitValue;\n\n  p->optimumEndIndex = 0;\n  p->optimumCurrentIndex = 0;\n  p->additionalOffset = 0;\n\n  p->pbMask = (1 << p->pb) - 1;\n  p->lpMask = (1 << p->lp) - 1;\n}\n\nvoid LzmaEnc_InitPrices(CLzmaEnc *p)\n{\n  if (!p->fastMode)\n  {\n    FillDistancesPrices(p);\n    FillAlignPrices(p);\n  }\n\n  p->lenEnc.tableSize =\n  p->repLenEnc.tableSize =\n      p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;\n  LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices);\n  LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices);\n}\n\nstatic SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  UInt32 i;\n  for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++)\n    if (p->dictSize <= ((UInt32)1 << i))\n      break;\n  p->distTableSize = i * 2;\n\n  p->finished = False;\n  p->result = SZ_OK;\n  RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));\n  LzmaEnc_Init(p);\n  LzmaEnc_InitPrices(p);\n  p->nowPos64 = 0;\n  return SZ_OK;\n}\n\nstatic SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqInStream *inStream, ISeqOutStream *outStream,\n    ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  p->inStream = inStream;\n  p->rc.outStream = outStream;\n  return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);\n}\n\nSRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,\n    ISeqInStream *inStream, UInt32 keepWindowSize,\n    ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  p->inStream = inStream;\n  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);\n}\n\nstatic void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)\n{\n  p->seqBufInStream.funcTable.Read = MyRead;\n  p->seqBufInStream.data = src;\n  p->seqBufInStream.rem = srcLen;\n}\n\nSRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,\n    UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  LzmaEnc_SetInputBuf(p, src, srcLen);\n  p->inStream = &p->seqBufInStream.funcTable;\n  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);\n}\n\nvoid LzmaEnc_Finish(CLzmaEncHandle pp)\n{\n  #ifdef COMPRESS_MF_MT\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  if (p->mtMode)\n    MatchFinderMt_ReleaseStream(&p->matchFinderMt);\n  #else\n  pp = pp;\n  #endif\n}\n\ntypedef struct _CSeqOutStreamBuf\n{\n  ISeqOutStream funcTable;\n  Byte *data;\n  SizeT rem;\n  Bool overflow;\n} CSeqOutStreamBuf;\n\nstatic size_t MyWrite(void *pp, const void *data, size_t size)\n{\n  CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp;\n  if (p->rem < size)\n  {\n    size = p->rem;\n    p->overflow = True;\n  }\n  memcpy(p->data, data, size);\n  p->rem -= size;\n  p->data += size;\n  return size;\n}\n\n\nUInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)\n{\n  const CLzmaEnc *p = (CLzmaEnc *)pp;\n  return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);\n}\n\nconst Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)\n{\n  const CLzmaEnc *p = (CLzmaEnc *)pp;\n  return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;\n}\n\nSRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,\n    Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  UInt64 nowPos64;\n  SRes res;\n  CSeqOutStreamBuf outStream;\n\n  outStream.funcTable.Write = MyWrite;\n  outStream.data = dest;\n  outStream.rem = *destLen;\n  outStream.overflow = False;\n\n  p->writeEndMark = False;\n  p->finished = False;\n  p->result = SZ_OK;\n\n  if (reInit)\n    LzmaEnc_Init(p);\n  LzmaEnc_InitPrices(p);\n  nowPos64 = p->nowPos64;\n  RangeEnc_Init(&p->rc);\n  p->rc.outStream = &outStream.funcTable;\n\n  res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);\n  \n  *unpackSize = (UInt32)(p->nowPos64 - nowPos64);\n  *destLen -= outStream.rem;\n  if (outStream.overflow)\n    return SZ_ERROR_OUTPUT_EOF;\n\n  return res;\n}\n\nSRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,\n    ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  SRes res = SZ_OK;\n\n  #ifdef COMPRESS_MF_MT\n  Byte allocaDummy[0x300];\n  int i = 0;\n  for (i = 0; i < 16; i++)\n    allocaDummy[i] = (Byte)i;\n  #endif\n\n  RINOK(LzmaEnc_Prepare(pp, inStream, outStream, alloc, allocBig));\n\n  for (;;)\n  {\n    res = LzmaEnc_CodeOneBlock(p, False, 0, 0);\n    if (res != SZ_OK || p->finished != 0)\n      break;\n    if (progress != 0)\n    {\n      res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));\n      if (res != SZ_OK)\n      {\n        res = SZ_ERROR_PROGRESS;\n        break;\n      }\n    }\n  }\n  LzmaEnc_Finish(pp);\n  return res;\n}\n\nSRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)\n{\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n  int i;\n  UInt32 dictSize = p->dictSize;\n  if (*size < LZMA_PROPS_SIZE)\n    return SZ_ERROR_PARAM;\n  *size = LZMA_PROPS_SIZE;\n  props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);\n\n  for (i = 11; i <= 30; i++)\n  {\n    if (dictSize <= ((UInt32)2 << i))\n    {\n      dictSize = (2 << i);\n      break;\n    }\n    if (dictSize <= ((UInt32)3 << i))\n    {\n      dictSize = (3 << i);\n      break;\n    }\n  }\n\n  for (i = 0; i < 4; i++)\n    props[1 + i] = (Byte)(dictSize >> (8 * i));\n  return SZ_OK;\n}\n\nSRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  SRes res;\n  CLzmaEnc *p = (CLzmaEnc *)pp;\n\n  CSeqOutStreamBuf outStream;\n\n  LzmaEnc_SetInputBuf(p, src, srcLen);\n\n  outStream.funcTable.Write = MyWrite;\n  outStream.data = dest;\n  outStream.rem = *destLen;\n  outStream.overflow = False;\n\n  p->writeEndMark = writeEndMark;\n  res = LzmaEnc_Encode(pp, &outStream.funcTable, &p->seqBufInStream.funcTable,\n      progress, alloc, allocBig);\n\n  *destLen -= outStream.rem;\n  if (outStream.overflow)\n    return SZ_ERROR_OUTPUT_EOF;\n  return res;\n}\n\nSRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,\n    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)\n{\n  CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);\n  SRes res;\n  if (p == 0)\n    return SZ_ERROR_MEM;\n\n  res = LzmaEnc_SetProps(p, props);\n  if (res == SZ_OK)\n  {\n    res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);\n    if (res == SZ_OK)\n      res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,\n          writeEndMark, progress, alloc, allocBig);\n  }\n\n  LzmaEnc_Destroy(p, alloc, allocBig);\n  return res;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaEnc.h",
    "content": "/*  LzmaEnc.h -- LZMA Encoder\n2008-10-04 : Igor Pavlov : Public domain */\n\n#ifndef __LZMAENC_H\n#define __LZMAENC_H\n\n#include \"Types.h\"\n\n#define LZMA_PROPS_SIZE 5\n\ntypedef struct _CLzmaEncProps\n{\n  int level;       /*  0 <= level <= 9 */\n  UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version\n                      (1 << 12) <= dictSize <= (1 << 30) for 64-bit version\n                       default = (1 << 24) */\n  int lc;          /* 0 <= lc <= 8, default = 3 */\n  int lp;          /* 0 <= lp <= 4, default = 0 */\n  int pb;          /* 0 <= pb <= 4, default = 2 */\n  int algo;        /* 0 - fast, 1 - normal, default = 1 */\n  int fb;          /* 5 <= fb <= 273, default = 32 */\n  int btMode;      /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */\n  int numHashBytes; /* 2, 3 or 4, default = 4 */\n  UInt32 mc;        /* 1 <= mc <= (1 << 30), default = 32 */\n  unsigned writeEndMark;  /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */\n  int numThreads;  /* 1 or 2, default = 2 */\n} CLzmaEncProps;\n\nvoid LzmaEncProps_Init(CLzmaEncProps *p);\nvoid LzmaEncProps_Normalize(CLzmaEncProps *p);\nUInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);\n\n\n/* ---------- CLzmaEncHandle Interface ---------- */\n\n/* LzmaEnc_* functions can return the following exit codes:\nReturns:\n  SZ_OK           - OK\n  SZ_ERROR_MEM    - Memory allocation error\n  SZ_ERROR_PARAM  - Incorrect paramater in props\n  SZ_ERROR_WRITE  - Write callback error.\n  SZ_ERROR_PROGRESS - some break from progress callback\n  SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)\n*/\n\ntypedef void * CLzmaEncHandle;\n\nCLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);\nvoid LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);\nSRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);\nSRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);\nSRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,\n    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\nSRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n\n/* ---------- One Call Interface ---------- */\n\n/* LzmaEncode\nReturn code:\n  SZ_OK               - OK\n  SZ_ERROR_MEM        - Memory allocation error\n  SZ_ERROR_PARAM      - Incorrect paramater\n  SZ_ERROR_OUTPUT_EOF - output buffer overflow\n  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)\n*/\n\nSRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,\n    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaUtil/Lzma86Dec.c",
    "content": "/* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder\n2008-04-07\nIgor Pavlov\nPublic domain */\n\n#include \"Lzma86Dec.h\"\n\n#include \"../Alloc.h\"\n#include \"../Bra.h\"\n#include \"../LzmaDec.h\"\n\n#define LZMA86_SIZE_OFFSET (1 + LZMA_PROPS_SIZE)\n#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8)\n\nstatic void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }\nstatic void SzFree(void *p, void *address) { p = p; MyFree(address); }\nstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };\n\nSRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize)\n{\n  unsigned i;\n  if (srcLen < LZMA86_HEADER_SIZE)\n    return SZ_ERROR_INPUT_EOF;\n  *unpackSize = 0;\n  for (i = 0; i < sizeof(UInt64); i++)\n    *unpackSize += ((UInt64)src[LZMA86_SIZE_OFFSET + i]) << (8 * i);\n  return SZ_OK;\n}\n\nSRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen)\n{\n  SRes res;\n  int useFilter;\n  SizeT inSizePure;\n  ELzmaStatus status;\n\n  if (*srcLen < LZMA86_HEADER_SIZE)\n    return SZ_ERROR_INPUT_EOF;\n\n  useFilter = src[0];\n\n  if (useFilter > 1)\n  {\n    *destLen = 0;\n    return SZ_ERROR_UNSUPPORTED;\n  }\n\n  inSizePure = *srcLen - LZMA86_HEADER_SIZE;\n  res = LzmaDecode(dest, destLen, src + LZMA86_HEADER_SIZE, &inSizePure,\n      src + 1, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &g_Alloc);\n  *srcLen = inSizePure + LZMA86_HEADER_SIZE;\n  if (res != SZ_OK)\n    return res;\n  if (useFilter == 1)\n  {\n    UInt32 x86State;\n    x86_Convert_Init(x86State);\n    x86_Convert(dest, *destLen, 0, &x86State, 0);\n  }\n  return SZ_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaUtil/Lzma86Dec.h",
    "content": "/* Lzma86Dec.h -- LZMA + x86 (BCJ) Filter Decoder\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#ifndef __LZMA86DEC_H\n#define __LZMA86DEC_H\n\n#include \"../Types.h\"\n\n/*\nLzma86_GetUnpackSize:\n  In:\n    src      - input data\n    srcLen   - input data size\n  Out:\n    unpackSize - size of uncompressed stream\n  Return code:\n    SZ_OK               - OK\n    SZ_ERROR_INPUT_EOF  - Error in headers\n*/\n\nSRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize);\n\n/*\nLzma86_Decode:\n  In:\n    dest     - output data\n    destLen  - output data size\n    src      - input data\n    srcLen   - input data size\n  Out:\n    destLen  - processed output size\n    srcLen   - processed input size\n  Return code:\n    SZ_OK           - OK\n    SZ_ERROR_DATA  - Data error\n    SZ_ERROR_MEM   - Memory allocation error\n    SZ_ERROR_UNSUPPORTED - unsupported file\n    SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer\n*/\n\nSRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaUtil/Lzma86Enc.c",
    "content": "/* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#include <string.h>\n\n#include \"Lzma86Enc.h\"\n\n#include \"../Alloc.h\"\n#include \"../Bra.h\"\n#include \"../LzmaEnc.h\"\n\n#define SZE_OUT_OVERFLOW SZE_DATA_ERROR\n\nstatic void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }\nstatic void SzFree(void *p, void *address) { p = p; MyFree(address); }\nstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };\n\n#define LZMA86_SIZE_OFFSET (1 + LZMA_PROPS_SIZE)\n#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8)\n\nint Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen,\n    int level, UInt32 dictSize, int filterMode)\n{\n  size_t outSize2 = *destLen;\n  Byte *filteredStream;\n  Bool useFilter;\n  int mainResult = SZ_ERROR_OUTPUT_EOF;\n  CLzmaEncProps props;\n  LzmaEncProps_Init(&props);\n  props.level = level;\n  props.dictSize = dictSize;\n  \n  *destLen = 0;\n  if (outSize2 < LZMA86_HEADER_SIZE)\n    return SZ_ERROR_OUTPUT_EOF;\n\n  {\n    int i;\n    UInt64 t = srcLen;\n    for (i = 0; i < 8; i++, t >>= 8)\n      dest[LZMA86_SIZE_OFFSET + i] = (Byte)t;\n  }\n\n  filteredStream = 0;\n  useFilter = (filterMode != SZ_FILTER_NO);\n  if (useFilter)\n  {\n    if (srcLen != 0)\n    {\n      filteredStream = (Byte *)MyAlloc(srcLen);\n      if (filteredStream == 0)\n        return SZ_ERROR_MEM;\n      memcpy(filteredStream, src, srcLen);\n    }\n    {\n      UInt32 x86State;\n      x86_Convert_Init(x86State);\n      x86_Convert(filteredStream, srcLen, 0, &x86State, 1);\n    }\n  }\n\n  {\n    size_t minSize = 0;\n    Bool bestIsFiltered = False;\n\n    /* passes for SZ_FILTER_AUTO:\n        0 - BCJ + LZMA\n        1 - LZMA\n        2 - BCJ + LZMA agaian, if pass 0 (BCJ + LZMA) is better.\n    */\n    int numPasses = (filterMode == SZ_FILTER_AUTO) ? 3 : 1;\n\n    int i;\n    for (i = 0; i < numPasses; i++)\n    {\n      size_t outSizeProcessed = outSize2 - LZMA86_HEADER_SIZE;\n      size_t outPropsSize = 5;\n      SRes curRes;\n      Bool curModeIsFiltered = (numPasses > 1 && i == numPasses - 1);\n      if (curModeIsFiltered && !bestIsFiltered)\n        break;\n      if (useFilter && i == 0)\n        curModeIsFiltered = True;\n      \n      curRes = LzmaEncode(dest + LZMA86_HEADER_SIZE, &outSizeProcessed,\n          curModeIsFiltered ? filteredStream : src, srcLen,\n          &props, dest + 1, &outPropsSize, 0,\n          NULL, &g_Alloc, &g_Alloc);\n      \n      if (curRes != SZ_ERROR_OUTPUT_EOF)\n      {\n        if (curRes != SZ_OK)\n        {\n          mainResult = curRes;\n          break;\n        }\n        if (outSizeProcessed <= minSize || mainResult != SZ_OK)\n        {\n          minSize = outSizeProcessed;\n          bestIsFiltered = curModeIsFiltered;\n          mainResult = SZ_OK;\n        }\n      }\n    }\n    dest[0] = (bestIsFiltered ? 1 : 0);\n    *destLen = LZMA86_HEADER_SIZE + minSize;\n  }\n  if (useFilter)\n    MyFree(filteredStream);\n  return mainResult;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/LzmaUtil/Lzma86Enc.h",
    "content": "/* Lzma86Enc.h -- LZMA + x86 (BCJ) Filter Encoder\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#ifndef __LZMA86ENC_H\n#define __LZMA86ENC_H\n\n#include \"../Types.h\"\n\n/*\nIt's an example for LZMA + x86 Filter use.\nYou can use .lzma86 extension, if you write that stream to file.\n.lzma86 header adds one additional byte to standard .lzma header.\n.lzma86 header (14 bytes):\n  Offset Size  Description\n    0     1    = 0 - no filter,\n               = 1 - x86 filter\n    1     1    lc, lp and pb in encoded form\n    2     4    dictSize (little endian)\n    6     8    uncompressed size (little endian)\n\n\nLzma86_Encode\n-------------\nlevel - compression level: 0 <= level <= 9, the default value for \"level\" is 5.\n\n\ndictSize - The dictionary size in bytes. The maximum value is\n        128 MB = (1 << 27) bytes for 32-bit version\n          1 GB = (1 << 30) bytes for 64-bit version\n     The default value is 16 MB = (1 << 24) bytes, for level = 5.\n     It's recommended to use the dictionary that is larger than 4 KB and\n     that can be calculated as (1 << N) or (3 << N) sizes.\n     For better compression ratio dictSize must be >= inSize.\n\nfilterMode:\n    SZ_FILTER_NO   - no Filter\n    SZ_FILTER_YES  - x86 Filter\n    SZ_FILTER_AUTO - it tries both alternatives to select best.\n              Encoder will use 2 or 3 passes:\n              2 passes when FILTER_NO provides better compression.\n              3 passes when FILTER_YES provides better compression.\n\nLzma86Encode allocates Data with MyAlloc functions.\nRAM Requirements for compressing:\n  RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize\n      filterMode     FilterBlockSize\n     SZ_FILTER_NO         0\n     SZ_FILTER_YES      inSize\n     SZ_FILTER_AUTO     inSize\n\n\nReturn code:\n  SZ_OK               - OK\n  SZ_ERROR_MEM        - Memory allocation error\n  SZ_ERROR_PARAM      - Incorrect paramater\n  SZ_ERROR_OUTPUT_EOF - output buffer overflow\n  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)\n*/\n\nenum ESzFilterMode\n{\n  SZ_FILTER_NO,\n  SZ_FILTER_YES,\n  SZ_FILTER_AUTO\n};\n\nSRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen,\n    int level, UInt32 dictSize, int filterMode);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/RotateDefs.h",
    "content": "/* RotateDefs.h -- Rotate functions\n2008-08-05\nIgor Pavlov\nPublic domain */\n\n#ifndef __ROTATEDEFS_H\n#define __ROTATEDEFS_H\n\n#ifdef _MSC_VER\n\n#include <stdlib.h>\n#define rotlFixed(x, n) _rotl((x), (n))\n#define rotrFixed(x, n) _rotr((x), (n))\n\n#else\n\n#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n))))\n#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n))))\n\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Sha256.c",
    "content": "/* Crypto/Sha256.c -- SHA-256 Hash function\n2008-11-06 : Igor Pavlov : Public domain\nThis code is based on public domain code from Wei Dai's Crypto++ library. */\n\n#include \"Sha256.h\"\n#include \"RotateDefs.h\"\n\n/* define it for speed optimization */\n/* #define _SHA256_UNROLL */\n/* #define _SHA256_UNROLL2 */\n\nvoid Sha256_Init(CSha256 *p)\n{\n  p->state[0] = 0x6a09e667;\n  p->state[1] = 0xbb67ae85;\n  p->state[2] = 0x3c6ef372;\n  p->state[3] = 0xa54ff53a;\n  p->state[4] = 0x510e527f;\n  p->state[5] = 0x9b05688c;\n  p->state[6] = 0x1f83d9ab;\n  p->state[7] = 0x5be0cd19;\n  p->count = 0;\n}\n\n#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x, 22))\n#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x, 25))\n#define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3))\n#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >> 10))\n\n#define blk0(i) (W[i] = data[i])\n#define blk2(i) (W[i&15] += s1(W[(i-2)&15]) + W[(i-7)&15] + s0(W[(i-15)&15]))\n\n#define Ch(x,y,z) (z^(x&(y^z)))\n#define Maj(x,y,z) ((x&y)|(z&(x|y)))\n\n#define a(i) T[(0-(i))&7]\n#define b(i) T[(1-(i))&7]\n#define c(i) T[(2-(i))&7]\n#define d(i) T[(3-(i))&7]\n#define e(i) T[(4-(i))&7]\n#define f(i) T[(5-(i))&7]\n#define g(i) T[(6-(i))&7]\n#define h(i) T[(7-(i))&7]\n\n\n#ifdef _SHA256_UNROLL2\n\n#define R(a,b,c,d,e,f,g,h, i) h += S1(e) + Ch(e,f,g) + K[i+j] + (j?blk2(i):blk0(i));\\\n  d += h; h += S0(a) + Maj(a, b, c)\n\n#define RX_8(i) \\\n  R(a,b,c,d,e,f,g,h, i); \\\n  R(h,a,b,c,d,e,f,g, i+1); \\\n  R(g,h,a,b,c,d,e,f, i+2); \\\n  R(f,g,h,a,b,c,d,e, i+3); \\\n  R(e,f,g,h,a,b,c,d, i+4); \\\n  R(d,e,f,g,h,a,b,c, i+5); \\\n  R(c,d,e,f,g,h,a,b, i+6); \\\n  R(b,c,d,e,f,g,h,a, i+7)\n\n#else\n\n#define R(i) h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[i+j] + (j?blk2(i):blk0(i));\\\n  d(i) += h(i); h(i) += S0(a(i)) + Maj(a(i), b(i), c(i))\n\n#ifdef _SHA256_UNROLL\n\n#define RX_8(i) R(i+0); R(i+1); R(i+2); R(i+3); R(i+4); R(i+5); R(i+6); R(i+7);\n\n#endif\n\n#endif\n\nconst UInt32 K[64] = {\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n  0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n  0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n  0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n  0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n  0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n};\n\nstatic void Sha256_Transform(UInt32 *state, const UInt32 *data)\n{\n  UInt32 W[16];\n  unsigned j;\n  #ifdef _SHA256_UNROLL2\n  UInt32 a,b,c,d,e,f,g,h;\n  a = state[0];\n  b = state[1];\n  c = state[2];\n  d = state[3];\n  e = state[4];\n  f = state[5];\n  g = state[6];\n  h = state[7];\n  #else\n  UInt32 T[8];\n  for (j = 0; j < 8; j++)\n    T[j] = state[j];\n  #endif\n\n  for (j = 0; j < 64; j += 16)\n  {\n    #if defined(_SHA256_UNROLL) || defined(_SHA256_UNROLL2)\n    RX_8(0); RX_8(8);\n    #else\n    unsigned i;\n    for (i = 0; i < 16; i++) { R(i); }\n    #endif\n  }\n\n  #ifdef _SHA256_UNROLL2\n  state[0] += a;\n  state[1] += b;\n  state[2] += c;\n  state[3] += d;\n  state[4] += e;\n  state[5] += f;\n  state[6] += g;\n  state[7] += h;\n  #else\n  for (j = 0; j < 8; j++)\n    state[j] += T[j];\n  #endif\n  \n  /* Wipe variables */\n  /* memset(W, 0, sizeof(W)); */\n  /* memset(T, 0, sizeof(T)); */\n}\n\n#undef S0\n#undef S1\n#undef s0\n#undef s1\n\nstatic void Sha256_WriteByteBlock(CSha256 *p)\n{\n  UInt32 data32[16];\n  unsigned i;\n  for (i = 0; i < 16; i++)\n    data32[i] =\n      ((UInt32)(p->buffer[i * 4    ]) << 24) +\n      ((UInt32)(p->buffer[i * 4 + 1]) << 16) +\n      ((UInt32)(p->buffer[i * 4 + 2]) <<  8) +\n      ((UInt32)(p->buffer[i * 4 + 3]));\n  Sha256_Transform(p->state, data32);\n}\n\nvoid Sha256_Update(CSha256 *p, const Byte *data, size_t size)\n{\n  UInt32 curBufferPos = (UInt32)p->count & 0x3F;\n  while (size > 0)\n  {\n    p->buffer[curBufferPos++] = *data++;\n    p->count++;\n    size--;\n    if (curBufferPos == 64)\n    {\n      curBufferPos = 0;\n      Sha256_WriteByteBlock(p);\n    }\n  }\n}\n\nvoid Sha256_Final(CSha256 *p, Byte *digest)\n{\n  UInt64 lenInBits = (p->count << 3);\n  UInt32 curBufferPos = (UInt32)p->count & 0x3F;\n  unsigned i;\n  p->buffer[curBufferPos++] = 0x80;\n  while (curBufferPos != (64 - 8))\n  {\n    curBufferPos &= 0x3F;\n    if (curBufferPos == 0)\n      Sha256_WriteByteBlock(p);\n    p->buffer[curBufferPos++] = 0;\n  }\n  for (i = 0; i < 8; i++)\n  {\n    p->buffer[curBufferPos++] = (Byte)(lenInBits >> 56);\n    lenInBits <<= 8;\n  }\n  Sha256_WriteByteBlock(p);\n\n  for (i = 0; i < 8; i++)\n  {\n    *digest++ = (Byte)(p->state[i] >> 24);\n    *digest++ = (Byte)(p->state[i] >> 16);\n    *digest++ = (Byte)(p->state[i] >> 8);\n    *digest++ = (Byte)(p->state[i]);\n  }\n  Sha256_Init(p);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Sha256.h",
    "content": "/* Crypto/Sha256.h -- SHA-256 Hash function\n2008-10-04 : Igor Pavlov : Public domain */\n\n#ifndef __CRYPTO_SHA256_H\n#define __CRYPTO_SHA256_H\n\n#include \"Types.h\"\n\n#define SHA256_DIGEST_SIZE 32\n\ntypedef struct\n{\n  UInt32 state[8];\n  UInt64 count;\n  Byte buffer[64];\n} CSha256;\n\nvoid Sha256_Init(CSha256 *p);\nvoid Sha256_Update(CSha256 *p, const Byte *data, size_t size);\nvoid Sha256_Final(CSha256 *p, Byte *digest);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Sort.c",
    "content": "/* Sort.c -- Sort functions\n2008-08-17\nIgor Pavlov\nPublic domain */\n\n#include \"Sort.h\"\n\n#define HeapSortDown(p, k, size, temp) \\\n  { for (;;) { \\\n    UInt32 s = (k << 1); \\\n    if (s > size) break; \\\n    if (s < size && p[s + 1] > p[s]) s++; \\\n    if (temp >= p[s]) break; \\\n    p[k] = p[s]; k = s; \\\n  } p[k] = temp; }\n\nvoid HeapSort(UInt32 *p, UInt32 size)\n{\n  if (size <= 1)\n    return;\n  p--;\n  {\n    UInt32 i = size / 2;\n    do\n    {\n      UInt32 temp = p[i];\n      UInt32 k = i;\n      HeapSortDown(p, k, size, temp)\n    }\n    while (--i != 0);\n  }\n  /*\n  do\n  {\n    UInt32 k = 1;\n    UInt32 temp = p[size];\n    p[size--] = p[1];\n    HeapSortDown(p, k, size, temp)\n  }\n  while (size > 1);\n  */\n  while (size > 3)\n  {\n    UInt32 temp = p[size];\n    UInt32 k = (p[3] > p[2]) ? 3 : 2;\n    p[size--] = p[1];\n    p[1] = p[k];\n    HeapSortDown(p, k, size, temp)\n  }\n  {\n    UInt32 temp = p[size];\n    p[size] = p[1];\n    if (size > 2 && p[2] < temp)\n    {\n      p[1] = p[2];\n      p[2] = temp;\n    }\n    else\n      p[1] = temp;\n  }\n}\n\n/*\n#define HeapSortRefDown(p, vals, n, size, temp) \\\n  { UInt32 k = n; UInt32 val = vals[temp]; for (;;) { \\\n    UInt32 s = (k << 1); \\\n    if (s > size) break; \\\n    if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \\\n    if (val >= vals[p[s]]) break; \\\n    p[k] = p[s]; k = s; \\\n  } p[k] = temp; }\n\nvoid HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size)\n{\n  if (size <= 1)\n    return;\n  p--;\n  {\n    UInt32 i = size / 2;\n    do\n    {\n      UInt32 temp = p[i];\n      HeapSortRefDown(p, vals, i, size, temp);\n    }\n    while (--i != 0);\n  }\n  do\n  {\n    UInt32 temp = p[size];\n    p[size--] = p[1];\n    HeapSortRefDown(p, vals, 1, size, temp);\n  }\n  while (size > 1);\n}\n*/"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Sort.h",
    "content": "/* Sort.h -- Sort functions\n2008-03-19\nIgor Pavlov\nPublic domain */\n\n#ifndef __7Z_SORT_H\n#define __7Z_SORT_H\n\n#include \"Types.h\"\n\nvoid HeapSort(UInt32 *p, UInt32 size);\n/* void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size); */\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Threads.c",
    "content": "/* Threads.c */\n\n#include \"Threads.h\"\n\n#ifdef ENV_BEOS\n#include <kernel/OS.h>\n#else\n#include <pthread.h>\n#include <stdlib.h>\n#endif\n\n#include <errno.h>\n\n#if defined(__linux__) \n#define PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_ERRORCHECK_NP\n#endif\n\n#ifdef ENV_BEOS\n\n/* TODO : optimize the code and verify the returned values */ \n\nWRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter)\n{ \n\tthread->_tid = spawn_thread((int32 (*)(void *))startAddress, \"CThread\", B_LOW_PRIORITY, parameter);\n\tif (thread->_tid >= B_OK) {\n\t\tresume_thread(thread->_tid);\n\t} else {\n\t\tthread->_tid = B_BAD_THREAD_ID;\n\t}\n\tthread->_created = 1;\n\treturn 0; // SZ_OK;\n}\n\nWRes Thread_Wait(CThread *thread)\n{\n  int ret;\n\n  if (thread->_created == 0)\n    return EINVAL;\n\n  if (thread->_tid >= B_OK) \n  {\n    status_t exit_value;\n    wait_for_thread(thread->_tid, &exit_value);\n    thread->_tid = B_BAD_THREAD_ID;\n  } else {\n    return EINVAL;\n  }\n  \n  thread->_created = 0;\n  \n  return 0;\n}\n\nWRes Thread_Close(CThread *thread)\n{\n    if (!thread->_created) return SZ_OK;\n    \n    thread->_tid = B_BAD_THREAD_ID;\n    thread->_created = 0;\n    return SZ_OK;\n}\n\n\nWRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled)\n{\n  p->_index_waiting = 0;\n  p->_manual_reset  = manualReset;\n  p->_state         = (initialSignaled ? TRUE : FALSE);\n  p->_created       = 1;\n  p->_sem           = create_sem(1,\"event\");\n  return 0;\n}\n\nWRes Event_Set(CEvent *p) {\n  int index;\n  acquire_sem(p->_sem);\n  p->_state = TRUE;\n  for(index = 0 ; index < p->_index_waiting ; index++)\n  {\n     send_data(p->_waiting[index], '7zCN', NULL, 0);\n  }\n  p->_index_waiting = 0;\n  release_sem(p->_sem);\n  return 0;\n}\n\nWRes Event_Reset(CEvent *p) {\n  acquire_sem(p->_sem);\n  p->_state = FALSE;\n  release_sem(p->_sem);\n  return 0;\n}\n \nWRes Event_Wait(CEvent *p) {\n  acquire_sem(p->_sem);\n  while (p->_state == FALSE)\n  {\n    thread_id sender; \n    p->_waiting[p->_index_waiting++] = find_thread(NULL);\n    release_sem(p->_sem);\n    /* int msg = */ receive_data(&sender, NULL, 0);\n    acquire_sem(p->_sem);\n  }\n  if (p->_manual_reset == FALSE)\n  {\n     p->_state = FALSE;\n  }\n  release_sem(p->_sem);\n  return 0;\n}\n\nWRes Event_Close(CEvent *p) { \n  if (p->_created)\n  {\n    p->_created = 0;\n    delete_sem(p->_sem);\n  }\n  return 0;\n}\n\nWRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount)\n{\n  p->_index_waiting = 0;\n  p->_count         = initiallyCount;\n  p->_maxCount      = maxCount;\n  p->_created       = 1;\n  p->_sem           = create_sem(1,\"sem\");\n  return 0;\n}\n\nWRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount)\n{\n  UInt32 newCount;\n  int index;\n  \n  if (releaseCount < 1) return EINVAL;\n\n  acquire_sem(p->_sem);\n  newCount = p->_count + releaseCount;\n  if (newCount > p->_maxCount)\n  {\n    release_sem(p->_sem);\n    return EINVAL;\n  }\n  p->_count = newCount;\n  for(index = 0 ; index < p->_index_waiting ; index++)\n  {\n     send_data(p->_waiting[index], '7zCN', NULL, 0);\n  }\n  p->_index_waiting = 0;\n  release_sem(p->_sem);\n  return 0;\n}\n\nWRes Semaphore_Wait(CSemaphore *p) {\n  acquire_sem(p->_sem);\n  while (p->_count < 1)\n  {\n    thread_id sender;  \n    p->_waiting[p->_index_waiting++] = find_thread(NULL);\n    release_sem(p->_sem);\n    /* int msg = */ receive_data(&sender, NULL, 0);\n    acquire_sem(p->_sem);\n  }\n  p->_count--;\n  release_sem(p->_sem); \n  return 0;\n}\n\nWRes Semaphore_Close(CSemaphore *p) {\n  if (p->_created)\n  {\n    p->_created = 0;\n    delete_sem(p->_sem);\n  }\n  return 0;\n}\n\nWRes CriticalSection_Init(CCriticalSection * lpCriticalSection)\n{\n  lpCriticalSection->_sem = create_sem(1,\"cc\");\n  return 0;\n}\n\n#else /* !ENV_BEOS */\n\nWRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter)\n{ \n\tpthread_attr_t attr;\n\tint ret;\n\n\tthread->_created = 0;\n\n\tret = pthread_attr_init(&attr);\n\tif (ret) return ret;\n\n\tret = pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);\n\tif (ret) return ret;\n\n\tret = pthread_create(&thread->_tid, &attr, (void * (*)(void *))startAddress, parameter);\n\n\t/* ret2 = */ pthread_attr_destroy(&attr);\n\n\tif (ret) return ret;\n\t\n\tthread->_created = 1;\n\n\treturn 0; // SZ_OK;\n}\n\nWRes Thread_Wait(CThread *thread)\n{\n  void *thread_return;\n  int ret;\n\n  if (thread->_created == 0)\n    return EINVAL;\n\n  ret = pthread_join(thread->_tid,&thread_return);\n  thread->_created = 0;\n  \n  return ret;\n}\n\nWRes Thread_Close(CThread *thread)\n{\n    if (!thread->_created) return SZ_OK;\n    \n    pthread_detach(thread->_tid);\n    thread->_tid = 0;\n    thread->_created = 0;\n    return SZ_OK;\n}\n\n#ifdef DEBUG_SYNCHRO\n\n#include <stdio.h>\n\nstatic void dump_error(int ligne,int ret,const char *text,void *param)\n{\n  printf(\"\\n##T%d#ERROR2 (l=%d) %s : param=%p ret = %d (%s)##\\n\",(int)pthread_self(),ligne,text,param,ret,strerror(ret));\n    // abort();\n}\n\nWRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled)\n{\n  int ret;\n  pthread_mutexattr_t mutexattr;\n  memset(&mutexattr,0,sizeof(mutexattr));\n  ret = pthread_mutexattr_init(&mutexattr);\n  if (ret != 0) dump_error(__LINE__,ret,\"Event_Create::pthread_mutexattr_init\",&mutexattr);\n  ret = pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK);\n  if (ret != 0) dump_error(__LINE__,ret,\"Event_Create::pthread_mutexattr_settype\",&mutexattr);\n  ret = pthread_mutex_init(&p->_mutex,&mutexattr);\n  if (ret != 0) dump_error(__LINE__,ret,\"Event_Create::pthread_mutexattr_init\",&p->_mutex);\n  if (ret == 0)\n  {\n    ret = pthread_cond_init(&p->_cond,0);\n    if (ret != 0) dump_error(__LINE__,ret,\"Event_Create::pthread_cond_init\",&p->_cond);\n    p->_manual_reset = manualReset;\n    p->_state        = (initialSignaled ? TRUE : FALSE);\n    p->_created = 1;\n  }\n  return ret;\n}\n\nWRes Event_Set(CEvent *p) {\n  int ret = pthread_mutex_lock(&p->_mutex);\n  if (ret != 0) dump_error(__LINE__,ret,\"ES::pthread_mutex_lock\",&p->_mutex);\n  if (ret == 0)\n  {\n    p->_state = TRUE;\n    ret = pthread_cond_broadcast(&p->_cond);\n    if (ret != 0) dump_error(__LINE__,ret,\"ES::pthread_cond_broadcast\",&p->_cond);\n    if (ret == 0)\n    {\n       ret = pthread_mutex_unlock(&p->_mutex);\n       if (ret != 0) dump_error(__LINE__,ret,\"ES::pthread_mutex_unlock\",&p->_mutex);\n    }\n  }\n  return ret;\n}\n\nWRes Event_Reset(CEvent *p) {\n  int ret = pthread_mutex_lock(&p->_mutex);\n  if (ret != 0) dump_error(__LINE__,ret,\"ER::pthread_mutex_lock\",&p->_mutex);\n  if (ret == 0)\n  {\n    p->_state = FALSE;\n    ret = pthread_mutex_unlock(&p->_mutex);\n    if (ret != 0) dump_error(__LINE__,ret,\"ER::pthread_mutex_unlock\",&p->_mutex);\n  }\n  return ret;\n}\n \nWRes Event_Wait(CEvent *p) {\n  int ret = pthread_mutex_lock(&p->_mutex);\n  if (ret != 0) dump_error(__LINE__,ret,\"EW::pthread_mutex_lock\",&p->_mutex);\n  if (ret == 0)\n  {\n    while ((p->_state == FALSE) && (ret == 0))\n    {\n       ret = pthread_cond_wait(&p->_cond, &p->_mutex);\n       if (ret != 0) dump_error(__LINE__,ret,\"EW::pthread_cond_wait\",&p->_mutex);\n    }\n    if (ret == 0)\n    {\n       if (p->_manual_reset == FALSE)\n       {\n         p->_state = FALSE;\n       }\n       ret = pthread_mutex_unlock(&p->_mutex);\n       if (ret != 0) dump_error(__LINE__,ret,\"EW::pthread_mutex_unlock\",&p->_mutex);\n    }\n  }\n  return ret;\n}\n\nWRes Event_Close(CEvent *p) { \n  if (p->_created)\n  {\n    int ret;\n    p->_created = 0;\n    ret = pthread_mutex_destroy(&p->_mutex);\n    if (ret != 0) dump_error(__LINE__,ret,\"EC::pthread_mutex_destroy\",&p->_mutex);\n    ret = pthread_cond_destroy(&p->_cond);\n    if (ret != 0) dump_error(__LINE__,ret,\"EC::pthread_cond_destroy\",&p->_cond);\n  }\n  return 0;\n}\n\nWRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount)\n{\n  int ret;\n  pthread_mutexattr_t mutexattr;\n  memset(&mutexattr,0,sizeof(mutexattr));\n  ret = pthread_mutexattr_init(&mutexattr);\n  if (ret != 0) dump_error(__LINE__,ret,\"SemC::pthread_mutexattr_init\",&mutexattr);\n  ret = pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK);\n  if (ret != 0) dump_error(__LINE__,ret,\"SemC::pthread_mutexattr_settype\",&mutexattr);\n  ret = pthread_mutex_init(&p->_mutex,&mutexattr);\n  if (ret != 0) dump_error(__LINE__,ret,\"SemC::pthread_mutexattr_init\",&p->_mutex);\n  if (ret == 0)\n  {\n    ret = pthread_cond_init(&p->_cond,0);\n    if (ret != 0) dump_error(__LINE__,ret,\"SemC::pthread_cond_init\",&p->_mutex);\n    p->_count    = initiallyCount;\n    p->_maxCount = maxCount;\n    p->_created = 1;\n  }\n  return ret;\n}\n\nWRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount)\n{\n  int ret;\n  if (releaseCount < 1) return EINVAL;\n\n  ret = pthread_mutex_lock(&p->_mutex);\n  if (ret != 0) dump_error(__LINE__,ret,\"SemR::pthread_mutex_lock\",&p->_mutex);\n  if (ret == 0)\n  {\n    UInt32 newCount = p->_count + releaseCount;\n    if (newCount > p->_maxCount)\n    {\n      ret = pthread_mutex_unlock(&p->_mutex);\n      if (ret != 0) dump_error(__LINE__,ret,\"SemR::pthread_mutex_unlock\",&p->_mutex);\n      return EINVAL;\n    }\n    p->_count = newCount;\n    ret = pthread_cond_broadcast(&p->_cond);\n    if (ret != 0) dump_error(__LINE__,ret,\"SemR::pthread_cond_broadcast\",&p->_cond);\n    if (ret == 0)\n    {\n       ret = pthread_mutex_unlock(&p->_mutex);\n       if (ret != 0) dump_error(__LINE__,ret,\"SemR::pthread_mutex_unlock\",&p->_mutex);\n    }\n  }\n  return ret;\n}\n\nWRes Semaphore_Wait(CSemaphore *p) {\n  int ret = pthread_mutex_lock(&p->_mutex);\n  if (ret != 0) dump_error(__LINE__,ret,\"SemW::pthread_mutex_lock\",&p->_mutex);\n  if (ret == 0)\n  {\n    while ((p->_count < 1) && (ret == 0))\n    {\n       ret = pthread_cond_wait(&p->_cond, &p->_mutex);\n       if (ret != 0) dump_error(__LINE__,ret,\"SemW::pthread_cond_wait\",&p->_mutex);\n    }\n    if (ret == 0)\n    {\n      p->_count--;\n      ret = pthread_mutex_unlock(&p->_mutex);\n      if (ret != 0) dump_error(__LINE__,ret,\"SemW::pthread_mutex_unlock\",&p->_mutex);\n    }\n  }\n  return ret;\n}\n\nWRes Semaphore_Close(CSemaphore *p) {\n  if (p->_created)\n  {\n    int ret;\n    p->_created = 0;\n    ret = pthread_mutex_destroy(&p->_mutex);\n    if (ret != 0) dump_error(__LINE__,ret,\"Semc::pthread_mutex_destroy\",&p->_mutex);\n    ret = pthread_cond_destroy(&p->_cond);\n    if (ret != 0) dump_error(__LINE__,ret,\"Semc::pthread_cond_destroy\",&p->_cond);\n  }\n  return 0;\n}\n\nWRes CriticalSection_Init(CCriticalSection * lpCriticalSection)\n{\n\tif (lpCriticalSection)\n\t{\n\t\tint ret;\n\t\tpthread_mutexattr_t mutexattr;\n\t\tmemset(&mutexattr,0,sizeof(mutexattr));\n\t\tret = pthread_mutexattr_init(&mutexattr);\n\t\tif (ret != 0) dump_error(__LINE__,ret,\"CS I::pthread_mutexattr_init\",&mutexattr);\n\t\tret = pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK);\n\t\tif (ret != 0) dump_error(__LINE__,ret,\"CS I::pthread_mutexattr_settype\",&mutexattr);\n\t\tret = pthread_mutex_init(&lpCriticalSection->_mutex,&mutexattr);\n\t\tif (ret != 0) dump_error(__LINE__,ret,\"CS I::pthread_mutexattr_init\",&lpCriticalSection->_mutex);\n\t\treturn ret;\n\t}\n\treturn EINTR;\n}\n\nvoid CriticalSection_Enter(CCriticalSection * lpCriticalSection)\n{\n\tif (lpCriticalSection)\n\t{\n\t\tint ret = pthread_mutex_lock(&(lpCriticalSection->_mutex));\n                if (ret != 0) dump_error(__LINE__,ret,\"CS::pthread_mutex_lock\",&(lpCriticalSection->_mutex));\n\t}\n}\n\nvoid CriticalSection_Leave(CCriticalSection * lpCriticalSection)\n{\n\tif (lpCriticalSection)\n\t{\n\t\tint ret = pthread_mutex_unlock(&(lpCriticalSection->_mutex));\n                if (ret != 0) dump_error(__LINE__,ret,\"CS::pthread_mutex_unlock\",&(lpCriticalSection->_mutex));\n\t}\n}\n\nvoid CriticalSection_Delete(CCriticalSection * lpCriticalSection)\n{\n\tif (lpCriticalSection)\n\t{\n\t\tint ret = pthread_mutex_destroy(&(lpCriticalSection->_mutex));\n                if (ret != 0) dump_error(__LINE__,ret,\"CS::pthread_mutex_destroy\",&(lpCriticalSection->_mutex));\n\t}\n}\n\n#else\n\nWRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled)\n{\n  pthread_mutex_init(&p->_mutex,0);\n  pthread_cond_init(&p->_cond,0);\n  p->_manual_reset = manualReset;\n  p->_state        = (initialSignaled ? TRUE : FALSE);\n  p->_created = 1;\n  return 0;\n}\n\nWRes Event_Set(CEvent *p) {\n  pthread_mutex_lock(&p->_mutex);\n  p->_state = TRUE;\n  pthread_cond_broadcast(&p->_cond);\n  pthread_mutex_unlock(&p->_mutex);\n  return 0;\n}\n\nWRes Event_Reset(CEvent *p) {\n  pthread_mutex_lock(&p->_mutex);\n  p->_state = FALSE;\n  pthread_mutex_unlock(&p->_mutex);\n  return 0;\n}\n \nWRes Event_Wait(CEvent *p) {\n  pthread_mutex_lock(&p->_mutex);\n  while (p->_state == FALSE)\n  {\n     pthread_cond_wait(&p->_cond, &p->_mutex);\n  }\n  if (p->_manual_reset == FALSE)\n  {\n     p->_state = FALSE;\n  }\n  pthread_mutex_unlock(&p->_mutex);\n  return 0;\n}\n\nWRes Event_Close(CEvent *p) { \n  if (p->_created)\n  {\n    p->_created = 0;\n    pthread_mutex_destroy(&p->_mutex);\n    pthread_cond_destroy(&p->_cond);\n  }\n  return 0;\n}\n\nWRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount)\n{\n  pthread_mutex_init(&p->_mutex,0);\n  pthread_cond_init(&p->_cond,0);\n  p->_count    = initiallyCount;\n  p->_maxCount = maxCount;\n  p->_created  = 1;\n  return 0;\n}\n\nWRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount)\n{\n  UInt32 newCount;\n\n  if (releaseCount < 1) return EINVAL;\n\n  pthread_mutex_lock(&p->_mutex);\n\n  newCount = p->_count + releaseCount;\n  if (newCount > p->_maxCount)\n  {\n    pthread_mutex_unlock(&p->_mutex);\n    return EINVAL;\n  }\n  p->_count = newCount;\n  pthread_cond_broadcast(&p->_cond);\n  pthread_mutex_unlock(&p->_mutex);\n  return 0;\n}\n\nWRes Semaphore_Wait(CSemaphore *p) {\n  pthread_mutex_lock(&p->_mutex);\n  while (p->_count < 1)\n  {\n     pthread_cond_wait(&p->_cond, &p->_mutex);\n  }\n  p->_count--;\n  pthread_mutex_unlock(&p->_mutex);\n  return 0;\n}\n\nWRes Semaphore_Close(CSemaphore *p) {\n  if (p->_created)\n  {\n    p->_created = 0;\n    pthread_mutex_destroy(&p->_mutex);\n    pthread_cond_destroy(&p->_cond);\n  }\n  return 0;\n}\n\nWRes CriticalSection_Init(CCriticalSection * lpCriticalSection)\n{\n\treturn pthread_mutex_init(&(lpCriticalSection->_mutex),0);\n}\n\n#endif /* DEBUG_SYNCHRO */\n\n#endif /* ENV_BEOS */\n\nWRes ManualResetEvent_Create(CManualResetEvent *p, int initialSignaled)\n  { return Event_Create(p, TRUE, initialSignaled); }\n\nWRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) \n  { return ManualResetEvent_Create(p, 0); }\n\nWRes AutoResetEvent_Create(CAutoResetEvent *p, int initialSignaled)\n  { return Event_Create(p, FALSE, initialSignaled); }\nWRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) \n  { return AutoResetEvent_Create(p, 0); }\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Threads.h",
    "content": "/* Threads.h -- multithreading library\n2008-11-22 : Igor Pavlov : Public domain */\n\n#ifndef __7Z_THRESDS_H\n#define __7Z_THRESDS_H\n\n#include \"Types.h\"\n#include \"windows.h\"\n\n#ifdef ENV_BEOS\n#include <kernel/OS.h>\n#define MAX_THREAD 256\n#else\n#include <pthread.h>\n#endif\n\n/* #define DEBUG_SYNCHRO 1 */\n\ntypedef struct _CThread\n{\n#ifdef ENV_BEOS\n\tthread_id _tid;\n#else\n\tpthread_t _tid;\n#endif\n\tint _created;\n\n} CThread;\n\n#define Thread_Construct(thread) (thread)->_created = 0\n#define Thread_WasCreated(thread) ((thread)->_created != 0)\n\ntypedef unsigned THREAD_FUNC_RET_TYPE;\n#define THREAD_FUNC_CALL_TYPE MY_STD_CALL\n#define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE\n\nWRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter);\nWRes Thread_Wait(CThread *thread);\nWRes Thread_Close(CThread *thread);\n\ntypedef struct _CEvent\n{\n  int _created;\n  int _manual_reset;\n  int _state;\n#ifdef ENV_BEOS\n  thread_id _waiting[MAX_THREAD];\n  int       _index_waiting;\n  sem_id    _sem;\n#else\n  pthread_mutex_t _mutex;\n  pthread_cond_t  _cond;\n#endif\n} CEvent;\n\ntypedef CEvent CAutoResetEvent;\ntypedef CEvent CManualResetEvent;\n\n#define Event_Construct(event) (event)->_created = 0\n#define Event_IsCreated(event) ((event)->_created)\n\nWRes ManualResetEvent_Create(CManualResetEvent *event, int initialSignaled);\nWRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *event);\nWRes AutoResetEvent_Create(CAutoResetEvent *event, int initialSignaled);\nWRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *event);\nWRes Event_Set(CEvent *event);\nWRes Event_Reset(CEvent *event);\nWRes Event_Wait(CEvent *event);\nWRes Event_Close(CEvent *event);\n\n\ntypedef struct _CSemaphore\n{\n  int _created;\n  UInt32 _count;\n  UInt32 _maxCount;\n#ifdef ENV_BEOS\n  thread_id _waiting[MAX_THREAD];\n  int       _index_waiting;\n  sem_id    _sem;\n#else\n  pthread_mutex_t _mutex;\n  pthread_cond_t  _cond;\n#endif\n} CSemaphore;\n\n#define Semaphore_Construct(p) (p)->_created = 0\n\nWRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount);\nWRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num);\n#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1)\nWRes Semaphore_Wait(CSemaphore *p);\nWRes Semaphore_Close(CSemaphore *p);\n\ntypedef struct {\n#ifdef ENV_BEOS\n\tsem_id _sem;\n#else\n        pthread_mutex_t _mutex;\n#endif\n} CCriticalSection;\n\nWRes CriticalSection_Init(CCriticalSection *p);\n#ifdef ENV_BEOS\n#define CriticalSection_Delete(p) delete_sem((p)->_sem)\n#define CriticalSection_Enter(p)  acquire_sem((p)->_sem)\n#define CriticalSection_Leave(p)  release_sem((p)->_sem)\n#else\n#ifdef DEBUG_SYNCHRO\nvoid CriticalSection_Delete(CCriticalSection *);\nvoid CriticalSection_Enter(CCriticalSection *);\nvoid CriticalSection_Leave(CCriticalSection *);\n#else\n#define CriticalSection_Delete(p) pthread_mutex_destroy(&((p)->_mutex))\n#define CriticalSection_Enter(p)  pthread_mutex_lock(&((p)->_mutex))\n#define CriticalSection_Leave(p)  pthread_mutex_unlock(&((p)->_mutex))\n#endif\n#endif\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/C/Types.h",
    "content": "/* Types.h -- Basic types\n2008-11-23 : Igor Pavlov : Public domain */\n\n#ifndef __7Z_TYPES_H\n#define __7Z_TYPES_H\n\n#include <stddef.h>\n\n#ifdef _WIN32\n#include <windows.h>\n#endif\n\n#define SZ_OK 0\n\n#define SZ_ERROR_DATA 1\n#define SZ_ERROR_MEM 2\n#define SZ_ERROR_CRC 3\n#define SZ_ERROR_UNSUPPORTED 4\n#define SZ_ERROR_PARAM 5\n#define SZ_ERROR_INPUT_EOF 6\n#define SZ_ERROR_OUTPUT_EOF 7\n#define SZ_ERROR_READ 8\n#define SZ_ERROR_WRITE 9\n#define SZ_ERROR_PROGRESS 10\n#define SZ_ERROR_FAIL 11\n#define SZ_ERROR_THREAD 12\n\n#define SZ_ERROR_ARCHIVE 16\n#define SZ_ERROR_NO_ARCHIVE 17\n\ntypedef int SRes;\n\n#ifdef _WIN32\ntypedef DWORD WRes;\n#else\ntypedef int WRes;\n#endif\n\n#ifndef RINOK\n#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }\n#endif\n\ntypedef unsigned char Byte;\ntypedef short Int16;\ntypedef unsigned short UInt16;\n\n#ifdef _LZMA_UINT32_IS_ULONG\ntypedef long Int32;\ntypedef unsigned long UInt32;\n#else\ntypedef int Int32;\ntypedef unsigned int UInt32;\n#endif\n\n#ifdef _SZ_NO_INT_64\n\n/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.\n   NOTES: Some code will work incorrectly in that case! */\n\ntypedef long Int64;\ntypedef unsigned long UInt64;\n\n#else\n\n#if defined(_MSC_VER) || defined(__BORLANDC__)\ntypedef __int64 Int64;\ntypedef unsigned __int64 UInt64;\n#else\ntypedef long long int Int64;\ntypedef unsigned long long int UInt64;\n#endif\n\n#endif\n\n#ifdef _LZMA_NO_SYSTEM_SIZE_T\ntypedef UInt32 SizeT;\n#else\ntypedef size_t SizeT;\n#endif\n\ntypedef int Bool;\n#define True 1\n#define False 0\n\n\n#ifdef _MSC_VER\n\n#if _MSC_VER >= 1300\n#define MY_NO_INLINE __declspec(noinline)\n#else\n#define MY_NO_INLINE\n#endif\n\n#define MY_CDECL __cdecl\n#define MY_STD_CALL __stdcall\n#define MY_FAST_CALL MY_NO_INLINE __fastcall\n\n#else\n\n#define MY_CDECL\n#define MY_STD_CALL\n#define MY_FAST_CALL\n\n#endif\n\n\n/* The following interfaces use first parameter as pointer to structure */\n\ntypedef struct\n{\n  SRes (*Read)(void *p, void *buf, size_t *size);\n    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n       (output(*size) < input(*size)) is allowed */\n} ISeqInStream;\n\n/* it can return SZ_ERROR_INPUT_EOF */\nSRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);\nSRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);\nSRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);\n\ntypedef struct\n{\n  size_t (*Write)(void *p, const void *buf, size_t size);\n    /* Returns: result - the number of actually written bytes.\n       (result < size) means error */\n} ISeqOutStream;\n\ntypedef enum\n{\n  SZ_SEEK_SET = 0,\n  SZ_SEEK_CUR = 1,\n  SZ_SEEK_END = 2\n} ESzSeek;\n\ntypedef struct\n{\n  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */\n  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n} ISeekInStream;\n\ntypedef struct\n{\n  SRes (*Look)(void *p, void **buf, size_t *size);\n    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n       (output(*size) > input(*size)) is not allowed\n       (output(*size) < input(*size)) is allowed */\n  SRes (*Skip)(void *p, size_t offset);\n    /* offset must be <= output(*size) of Look */\n\n  SRes (*Read)(void *p, void *buf, size_t *size);\n    /* reads directly (without buffer). It's same as ISeqInStream::Read */\n  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n} ILookInStream;\n\nSRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);\nSRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);\n\n/* reads via ILookInStream::Read */\nSRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);\nSRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);\n\n#define LookToRead_BUF_SIZE (1 << 14)\n\ntypedef struct\n{\n  ILookInStream s;\n  ISeekInStream *realStream;\n  size_t pos;\n  size_t size;\n  Byte buf[LookToRead_BUF_SIZE];\n} CLookToRead;\n\nvoid LookToRead_CreateVTable(CLookToRead *p, int lookahead);\nvoid LookToRead_Init(CLookToRead *p);\n\ntypedef struct\n{\n  ISeqInStream s;\n  ILookInStream *realStream;\n} CSecToLook;\n\nvoid SecToLook_CreateVTable(CSecToLook *p);\n\ntypedef struct\n{\n  ISeqInStream s;\n  ILookInStream *realStream;\n} CSecToRead;\n\nvoid SecToRead_CreateVTable(CSecToRead *p);\n\ntypedef struct\n{\n  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);\n    /* Returns: result. (result != SZ_OK) means break.\n       Value (UInt64)(Int64)-1 for size means unknown value. */\n} ICompressProgress;\n\ntypedef struct\n{\n  void *(*Alloc)(void *p, size_t size);\n  void (*Free)(void *p, void *address); /* address can be 0 */\n} ISzAlloc;\n\n#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)\n#define IAlloc_Free(p, a) (p)->Free((p), a)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zCompressionMode.cpp",
    "content": "// CompressionMethod.cpp\n\n#include \"StdAfx.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zCompressionMode.h",
    "content": "// 7zCompressionMode.h\n\n#ifndef __7Z_COMPRESSION_MODE_H\n#define __7Z_COMPRESSION_MODE_H\n\n#include \"../../../Common/MyString.h\"\n\n#include \"../../../Windows/PropVariant.h\"\n\n#include \"../../Common/MethodProps.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nstruct CMethodFull: public CMethod\n{\n  UInt32 NumInStreams;\n  UInt32 NumOutStreams;\n  bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); }\n};\n\nstruct CBind\n{\n  UInt32 InCoder;\n  UInt32 InStream;\n  UInt32 OutCoder;\n  UInt32 OutStream;\n};\n\nstruct CCompressionMethodMode\n{\n  CObjectVector<CMethodFull> Methods;\n  CRecordVector<CBind> Binds;\n  #ifdef COMPRESS_MT\n  UInt32 NumThreads;\n  #endif\n  bool PasswordIsDefined;\n  UString Password;\n\n  bool IsEmpty() const { return (Methods.IsEmpty() && !PasswordIsDefined); }\n  CCompressionMethodMode(): PasswordIsDefined(false)\n      #ifdef COMPRESS_MT\n      , NumThreads(1)\n      #endif\n  {}\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zDecode.cpp",
    "content": "// 7zDecode.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/LockedStream.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/StreamObjects.h\"\n\n#include \"7zDecode.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nstatic void ConvertFolderItemInfoToBindInfo(const CFolder &folder,\n    CBindInfoEx &bindInfo)\n{\n  bindInfo.Clear();\n  int i;\n  for (i = 0; i < folder.BindPairs.Size(); i++)\n  {\n    NCoderMixer::CBindPair bindPair;\n    bindPair.InIndex = (UInt32)folder.BindPairs[i].InIndex;\n    bindPair.OutIndex = (UInt32)folder.BindPairs[i].OutIndex;\n    bindInfo.BindPairs.Add(bindPair);\n  }\n  UInt32 outStreamIndex = 0;\n  for (i = 0; i < folder.Coders.Size(); i++)\n  {\n    NCoderMixer::CCoderStreamsInfo coderStreamsInfo;\n    const CCoderInfo &coderInfo = folder.Coders[i];\n    coderStreamsInfo.NumInStreams = (UInt32)coderInfo.NumInStreams;\n    coderStreamsInfo.NumOutStreams = (UInt32)coderInfo.NumOutStreams;\n    bindInfo.Coders.Add(coderStreamsInfo);\n    bindInfo.CoderMethodIDs.Add(coderInfo.MethodID);\n    for (UInt32 j = 0; j < coderStreamsInfo.NumOutStreams; j++, outStreamIndex++)\n      if (folder.FindBindPairForOutStream(outStreamIndex) < 0)\n        bindInfo.OutStreams.Add(outStreamIndex);\n  }\n  for (i = 0; i < folder.PackStreams.Size(); i++)\n    bindInfo.InStreams.Add((UInt32)folder.PackStreams[i]);\n}\n\nstatic bool AreCodersEqual(const NCoderMixer::CCoderStreamsInfo &a1,\n    const NCoderMixer::CCoderStreamsInfo &a2)\n{\n  return (a1.NumInStreams == a2.NumInStreams) &&\n    (a1.NumOutStreams == a2.NumOutStreams);\n}\n\nstatic bool AreBindPairsEqual(const NCoderMixer::CBindPair &a1, const NCoderMixer::CBindPair &a2)\n{\n  return (a1.InIndex == a2.InIndex) &&\n    (a1.OutIndex == a2.OutIndex);\n}\n\nstatic bool AreBindInfoExEqual(const CBindInfoEx &a1, const CBindInfoEx &a2)\n{\n  if (a1.Coders.Size() != a2.Coders.Size())\n    return false;\n  int i;\n  for (i = 0; i < a1.Coders.Size(); i++)\n    if (!AreCodersEqual(a1.Coders[i], a2.Coders[i]))\n      return false;\n  if (a1.BindPairs.Size() != a2.BindPairs.Size())\n    return false;\n  for (i = 0; i < a1.BindPairs.Size(); i++)\n    if (!AreBindPairsEqual(a1.BindPairs[i], a2.BindPairs[i]))\n      return false;\n  for (i = 0; i < a1.CoderMethodIDs.Size(); i++)\n    if (a1.CoderMethodIDs[i] != a2.CoderMethodIDs[i])\n      return false;\n  if (a1.InStreams.Size() != a2.InStreams.Size())\n    return false;\n  if (a1.OutStreams.Size() != a2.OutStreams.Size())\n    return false;\n  return true;\n}\n\nCDecoder::CDecoder(bool multiThread)\n{\n  #ifndef _ST_MODE\n  multiThread = true;\n  #endif\n  _multiThread = multiThread;\n  _bindInfoExPrevIsDefined = false;\n}\n\nHRESULT CDecoder::Decode(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream *inStream,\n    UInt64 startPos,\n    const UInt64 *packSizes,\n    const CFolder &folderInfo,\n    ISequentialOutStream *outStream,\n    ICompressProgressInfo *compressProgress\n    #ifndef _NO_CRYPTO\n    , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n    #endif\n    #ifdef COMPRESS_MT\n    , bool mtMode, UInt32 numThreads\n    #endif\n    )\n{\n  if (!folderInfo.CheckStructure())\n    return E_NOTIMPL;\n  #ifndef _NO_CRYPTO\n  passwordIsDefined = false;\n  #endif\n  CObjectVector< CMyComPtr<ISequentialInStream> > inStreams;\n  \n  CLockedInStream lockedInStream;\n  lockedInStream.Init(inStream);\n  \n  for (int j = 0; j < folderInfo.PackStreams.Size(); j++)\n  {\n    CLockedSequentialInStreamImp *lockedStreamImpSpec = new\n        CLockedSequentialInStreamImp;\n    CMyComPtr<ISequentialInStream> lockedStreamImp = lockedStreamImpSpec;\n    lockedStreamImpSpec->Init(&lockedInStream, startPos);\n    startPos += packSizes[j];\n    \n    CLimitedSequentialInStream *streamSpec = new\n        CLimitedSequentialInStream;\n    CMyComPtr<ISequentialInStream> inStream = streamSpec;\n    streamSpec->SetStream(lockedStreamImp);\n    streamSpec->Init(packSizes[j]);\n    inStreams.Add(inStream);\n  }\n  \n  int numCoders = folderInfo.Coders.Size();\n  \n  CBindInfoEx bindInfo;\n  ConvertFolderItemInfoToBindInfo(folderInfo, bindInfo);\n  bool createNewCoders;\n  if (!_bindInfoExPrevIsDefined)\n    createNewCoders = true;\n  else\n    createNewCoders = !AreBindInfoExEqual(bindInfo, _bindInfoExPrev);\n  if (createNewCoders)\n  {\n    int i;\n    _decoders.Clear();\n    // _decoders2.Clear();\n    \n    _mixerCoder.Release();\n\n    if (_multiThread)\n    {\n      _mixerCoderMTSpec = new NCoderMixer::CCoderMixer2MT;\n      _mixerCoder = _mixerCoderMTSpec;\n      _mixerCoderCommon = _mixerCoderMTSpec;\n    }\n    else\n    {\n      #ifdef _ST_MODE\n      _mixerCoderSTSpec = new NCoderMixer::CCoderMixer2ST;\n      _mixerCoder = _mixerCoderSTSpec;\n      _mixerCoderCommon = _mixerCoderSTSpec;\n      #endif\n    }\n    RINOK(_mixerCoderCommon->SetBindInfo(bindInfo));\n    \n    for (i = 0; i < numCoders; i++)\n    {\n      const CCoderInfo &coderInfo = folderInfo.Coders[i];\n\n  \n      CMyComPtr<ICompressCoder> decoder;\n      CMyComPtr<ICompressCoder2> decoder2;\n      RINOK(CreateCoder(\n          EXTERNAL_CODECS_LOC_VARS\n          coderInfo.MethodID, decoder, decoder2, false));\n      CMyComPtr<IUnknown> decoderUnknown;\n      if (coderInfo.IsSimpleCoder())\n      {\n        if (decoder == 0)\n          return E_NOTIMPL;\n\n        decoderUnknown = (IUnknown *)decoder;\n        \n        if (_multiThread)\n          _mixerCoderMTSpec->AddCoder(decoder);\n        #ifdef _ST_MODE\n        else\n          _mixerCoderSTSpec->AddCoder(decoder, false);\n        #endif\n      }\n      else\n      {\n        if (decoder2 == 0)\n          return E_NOTIMPL;\n        decoderUnknown = (IUnknown *)decoder2;\n        if (_multiThread)\n          _mixerCoderMTSpec->AddCoder2(decoder2);\n        #ifdef _ST_MODE\n        else\n          _mixerCoderSTSpec->AddCoder2(decoder2, false);\n        #endif\n      }\n      _decoders.Add(decoderUnknown);\n      #ifdef EXTERNAL_CODECS\n      CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;\n      decoderUnknown.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);\n      if (setCompressCodecsInfo)\n      {\n        RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecsInfo));\n      }\n      #endif\n    }\n    _bindInfoExPrev = bindInfo;\n    _bindInfoExPrevIsDefined = true;\n  }\n  int i;\n  _mixerCoderCommon->ReInit();\n  \n  UInt32 packStreamIndex = 0, unpackStreamIndex = 0;\n  UInt32 coderIndex = 0;\n  // UInt32 coder2Index = 0;\n  \n  for (i = 0; i < numCoders; i++)\n  {\n    const CCoderInfo &coderInfo = folderInfo.Coders[i];\n    CMyComPtr<IUnknown> &decoder = _decoders[coderIndex];\n    \n    {\n      CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;\n      decoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);\n      if (setDecoderProperties)\n      {\n        const CByteBuffer &props = coderInfo.Props;\n        size_t size = props.GetCapacity();\n        if (size > 0xFFFFFFFF)\n          return E_NOTIMPL;\n        if (size > 0)\n        {\n          RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)props, (UInt32)size));\n        }\n      }\n    }\n\n    #ifdef COMPRESS_MT\n    if (mtMode)\n    {\n      CMyComPtr<ICompressSetCoderMt> setCoderMt;\n      decoder.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt);\n      if (setCoderMt)\n      {\n        RINOK(setCoderMt->SetNumberOfThreads(numThreads));\n      }\n    }\n    #endif\n\n    #ifndef _NO_CRYPTO\n    {\n      CMyComPtr<ICryptoSetPassword> cryptoSetPassword;\n      decoder.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword);\n      if (cryptoSetPassword)\n      {\n        if (getTextPassword == 0)\n          return E_FAIL;\n        CMyComBSTR passwordBSTR;\n        RINOK(getTextPassword->CryptoGetTextPassword(&passwordBSTR));\n        CByteBuffer buffer;\n        passwordIsDefined = true;\n        const UString password(passwordBSTR);\n        const UInt32 sizeInBytes = password.Length() * 2;\n        buffer.SetCapacity(sizeInBytes);\n        for (int i = 0; i < password.Length(); i++)\n        {\n          wchar_t c = password[i];\n          ((Byte *)buffer)[i * 2] = (Byte)c;\n          ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);\n        }\n        RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, sizeInBytes));\n      }\n    }\n    #endif\n\n    coderIndex++;\n    \n    UInt32 numInStreams = (UInt32)coderInfo.NumInStreams;\n    UInt32 numOutStreams = (UInt32)coderInfo.NumOutStreams;\n    CRecordVector<const UInt64 *> packSizesPointers;\n    CRecordVector<const UInt64 *> unpackSizesPointers;\n    packSizesPointers.Reserve(numInStreams);\n    unpackSizesPointers.Reserve(numOutStreams);\n    UInt32 j;\n    for (j = 0; j < numOutStreams; j++, unpackStreamIndex++)\n      unpackSizesPointers.Add(&folderInfo.UnpackSizes[unpackStreamIndex]);\n    \n    for (j = 0; j < numInStreams; j++, packStreamIndex++)\n    {\n      int bindPairIndex = folderInfo.FindBindPairForInStream(packStreamIndex);\n      if (bindPairIndex >= 0)\n        packSizesPointers.Add(\n        &folderInfo.UnpackSizes[(UInt32)folderInfo.BindPairs[bindPairIndex].OutIndex]);\n      else\n      {\n        int index = folderInfo.FindPackStreamArrayIndex(packStreamIndex);\n        if (index < 0)\n          return E_FAIL;\n        packSizesPointers.Add(&packSizes[index]);\n      }\n    }\n    \n    _mixerCoderCommon->SetCoderInfo(i,\n        &packSizesPointers.Front(),\n        &unpackSizesPointers.Front());\n  }\n  UInt32 mainCoder, temp;\n  bindInfo.FindOutStream(bindInfo.OutStreams[0], mainCoder, temp);\n\n  if (_multiThread)\n    _mixerCoderMTSpec->SetProgressCoderIndex(mainCoder);\n  /*\n  else\n    _mixerCoderSTSpec->SetProgressCoderIndex(mainCoder);;\n  */\n  \n  if (numCoders == 0)\n    return 0;\n  CRecordVector<ISequentialInStream *> inStreamPointers;\n  inStreamPointers.Reserve(inStreams.Size());\n  for (i = 0; i < inStreams.Size(); i++)\n    inStreamPointers.Add(inStreams[i]);\n  ISequentialOutStream *outStreamPointer = outStream;\n  return _mixerCoder->Code(&inStreamPointers.Front(), NULL,\n    inStreams.Size(), &outStreamPointer, NULL, 1, compressProgress);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zDecode.h",
    "content": "// 7zDecode.h\n\n#ifndef __7Z_DECODE_H\n#define __7Z_DECODE_H\n\n#include \"../../IStream.h\"\n#include \"../../IPassword.h\"\n\n#include \"../Common/CoderMixer2.h\"\n#include \"../Common/CoderMixer2MT.h\"\n#ifdef _ST_MODE\n#include \"../Common/CoderMixer2ST.h\"\n#endif\n\n#include \"../../Common/CreateCoder.h\"\n\n#include \"7zItem.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nstruct CBindInfoEx: public NCoderMixer::CBindInfo\n{\n  CRecordVector<CMethodId> CoderMethodIDs;\n  void Clear()\n  {\n    CBindInfo::Clear();\n    CoderMethodIDs.Clear();\n  }\n};\n\nclass CDecoder\n{\n  bool _bindInfoExPrevIsDefined;\n  CBindInfoEx _bindInfoExPrev;\n  \n  bool _multiThread;\n  #ifdef _ST_MODE\n  NCoderMixer::CCoderMixer2ST *_mixerCoderSTSpec;\n  #endif\n  NCoderMixer::CCoderMixer2MT *_mixerCoderMTSpec;\n  NCoderMixer::CCoderMixer2 *_mixerCoderCommon;\n  \n  CMyComPtr<ICompressCoder2> _mixerCoder;\n  CObjectVector<CMyComPtr<IUnknown> > _decoders;\n  // CObjectVector<CMyComPtr<ICompressCoder2> > _decoders2;\npublic:\n  CDecoder(bool multiThread);\n  HRESULT Decode(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      IInStream *inStream,\n      UInt64 startPos,\n      const UInt64 *packSizes,\n      const CFolder &folder,\n      ISequentialOutStream *outStream,\n      ICompressProgressInfo *compressProgress\n      #ifndef _NO_CRYPTO\n      , ICryptoGetTextPassword *getTextPasswordSpec, bool &passwordIsDefined\n      #endif\n      #ifdef COMPRESS_MT\n      , bool mtMode, UInt32 numThreads\n      #endif\n      );\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zEncode.cpp",
    "content": "// Encode.cpp\n\n#include \"StdAfx.h\"\n\n#include \"7zEncode.h\"\n#include \"7zSpecStream.h\"\n\n#include \"../../IPassword.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/InOutTempBuffer.h\"\n#include \"../../Common/StreamObjects.h\"\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/FilterCoder.h\"\n\nstatic const UInt64 k_AES = 0x06F10701;\nstatic const UInt64 k_BCJ  = 0x03030103;\nstatic const UInt64 k_BCJ2 = 0x0303011B;\n\nnamespace NArchive {\nnamespace N7z {\n\nstatic void ConvertBindInfoToFolderItemInfo(const NCoderMixer::CBindInfo &bindInfo,\n    const CRecordVector<CMethodId> decompressionMethods,\n    CFolder &folder)\n{\n  folder.Coders.Clear();\n  // bindInfo.CoderMethodIDs.Clear();\n  // folder.OutStreams.Clear();\n  folder.PackStreams.Clear();\n  folder.BindPairs.Clear();\n  int i;\n  for (i = 0; i < bindInfo.BindPairs.Size(); i++)\n  {\n    CBindPair bindPair;\n    bindPair.InIndex = bindInfo.BindPairs[i].InIndex;\n    bindPair.OutIndex = bindInfo.BindPairs[i].OutIndex;\n    folder.BindPairs.Add(bindPair);\n  }\n  for (i = 0; i < bindInfo.Coders.Size(); i++)\n  {\n    CCoderInfo coderInfo;\n    const NCoderMixer::CCoderStreamsInfo &coderStreamsInfo = bindInfo.Coders[i];\n    coderInfo.NumInStreams = coderStreamsInfo.NumInStreams;\n    coderInfo.NumOutStreams = coderStreamsInfo.NumOutStreams;\n    coderInfo.MethodID = decompressionMethods[i];\n    folder.Coders.Add(coderInfo);\n  }\n  for (i = 0; i < bindInfo.InStreams.Size(); i++)\n    folder.PackStreams.Add(bindInfo.InStreams[i]);\n}\n\nHRESULT CEncoder::CreateMixerCoder(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    const UInt64 *inSizeForReduce)\n{\n  _mixerCoderSpec = new NCoderMixer::CCoderMixer2MT;\n  _mixerCoder = _mixerCoderSpec;\n  RINOK(_mixerCoderSpec->SetBindInfo(_bindInfo));\n  for (int i = 0; i < _options.Methods.Size(); i++)\n  {\n    const CMethodFull &methodFull = _options.Methods[i];\n    _codersInfo.Add(CCoderInfo());\n    CCoderInfo &encodingInfo = _codersInfo.Back();\n    encodingInfo.MethodID = methodFull.Id;\n    CMyComPtr<ICompressCoder> encoder;\n    CMyComPtr<ICompressCoder2> encoder2;\n    \n\n    RINOK(CreateCoder(\n        EXTERNAL_CODECS_LOC_VARS\n        methodFull.Id, encoder, encoder2, true));\n\n    if (!encoder && !encoder2)\n      return E_FAIL;\n\n    CMyComPtr<IUnknown> encoderCommon = encoder ? (IUnknown *)encoder : (IUnknown *)encoder2;\n   \n    #ifdef COMPRESS_MT\n    {\n      CMyComPtr<ICompressSetCoderMt> setCoderMt;\n      encoderCommon.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt);\n      if (setCoderMt)\n      {\n        RINOK(setCoderMt->SetNumberOfThreads(_options.NumThreads));\n      }\n    }\n    #endif\n        \n\n    RINOK(SetMethodProperties(methodFull, inSizeForReduce, encoderCommon));\n\n    /*\n    CMyComPtr<ICryptoResetSalt> resetSalt;\n    encoderCommon.QueryInterface(IID_ICryptoResetSalt, (void **)&resetSalt);\n    if (resetSalt != NULL)\n    {\n      resetSalt->ResetSalt();\n    }\n    */\n\n    #ifdef EXTERNAL_CODECS\n    CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;\n    encoderCommon.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);\n    if (setCompressCodecsInfo)\n    {\n      RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecsInfo));\n    }\n    #endif\n    \n    CMyComPtr<ICryptoSetPassword> cryptoSetPassword;\n    encoderCommon.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword);\n\n    if (cryptoSetPassword)\n    {\n      CByteBuffer buffer;\n      const UInt32 sizeInBytes = _options.Password.Length() * 2;\n      buffer.SetCapacity(sizeInBytes);\n      for (int i = 0; i < _options.Password.Length(); i++)\n      {\n        wchar_t c = _options.Password[i];\n        ((Byte *)buffer)[i * 2] = (Byte)c;\n        ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);\n      }\n      RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, sizeInBytes));\n    }\n\n    if (encoder)\n      _mixerCoderSpec->AddCoder(encoder);\n    else\n      _mixerCoderSpec->AddCoder2(encoder2);\n  }\n  return S_OK;\n}\n\nHRESULT CEncoder::Encode(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    ISequentialInStream *inStream,\n    const UInt64 *inStreamSize, const UInt64 *inSizeForReduce,\n    CFolder &folderItem,\n    ISequentialOutStream *outStream,\n    CRecordVector<UInt64> &packSizes,\n    ICompressProgressInfo *compressProgress)\n{\n  RINOK(EncoderConstr());\n\n  if (_mixerCoderSpec == NULL)\n  {\n    RINOK(CreateMixerCoder(EXTERNAL_CODECS_LOC_VARS inSizeForReduce));\n  }\n  _mixerCoderSpec->ReInit();\n  // _mixerCoderSpec->SetCoderInfo(0, NULL, NULL, progress);\n\n  CObjectVector<CInOutTempBuffer> inOutTempBuffers;\n  CObjectVector<CSequentialOutTempBufferImp *> tempBufferSpecs;\n  CObjectVector<CMyComPtr<ISequentialOutStream> > tempBuffers;\n  int numMethods = _bindInfo.Coders.Size();\n  int i;\n  for (i = 1; i < _bindInfo.OutStreams.Size(); i++)\n  {\n    inOutTempBuffers.Add(CInOutTempBuffer());\n    inOutTempBuffers.Back().Create();\n    inOutTempBuffers.Back().InitWriting();\n  }\n  for (i = 1; i < _bindInfo.OutStreams.Size(); i++)\n  {\n    CSequentialOutTempBufferImp *tempBufferSpec =\n        new CSequentialOutTempBufferImp;\n    CMyComPtr<ISequentialOutStream> tempBuffer = tempBufferSpec;\n    tempBufferSpec->Init(&inOutTempBuffers[i - 1]);\n    tempBuffers.Add(tempBuffer);\n    tempBufferSpecs.Add(tempBufferSpec);\n  }\n\n  for (i = 0; i < numMethods; i++)\n    _mixerCoderSpec->SetCoderInfo(i, NULL, NULL);\n\n  if (_bindInfo.InStreams.IsEmpty())\n    return E_FAIL;\n  UInt32 mainCoderIndex, mainStreamIndex;\n  _bindInfo.FindInStream(_bindInfo.InStreams[0], mainCoderIndex, mainStreamIndex);\n  \n  if (inStreamSize != NULL)\n  {\n    CRecordVector<const UInt64 *> sizePointers;\n    for (UInt32 i = 0; i < _bindInfo.Coders[mainCoderIndex].NumInStreams; i++)\n      if (i == mainStreamIndex)\n        sizePointers.Add(inStreamSize);\n      else\n        sizePointers.Add(NULL);\n    _mixerCoderSpec->SetCoderInfo(mainCoderIndex, &sizePointers.Front(), NULL);\n  }\n\n  \n  // UInt64 outStreamStartPos;\n  // RINOK(stream->Seek(0, STREAM_SEEK_CUR, &outStreamStartPos));\n  \n  CSequentialInStreamSizeCount2 *inStreamSizeCountSpec =\n      new CSequentialInStreamSizeCount2;\n  CMyComPtr<ISequentialInStream> inStreamSizeCount = inStreamSizeCountSpec;\n  CSequentialOutStreamSizeCount *outStreamSizeCountSpec =\n      new CSequentialOutStreamSizeCount;\n  CMyComPtr<ISequentialOutStream> outStreamSizeCount = outStreamSizeCountSpec;\n\n  inStreamSizeCountSpec->Init(inStream);\n  outStreamSizeCountSpec->SetStream(outStream);\n  outStreamSizeCountSpec->Init();\n\n  CRecordVector<ISequentialInStream *> inStreamPointers;\n  CRecordVector<ISequentialOutStream *> outStreamPointers;\n  inStreamPointers.Add(inStreamSizeCount);\n  outStreamPointers.Add(outStreamSizeCount);\n  for (i = 1; i < _bindInfo.OutStreams.Size(); i++)\n    outStreamPointers.Add(tempBuffers[i - 1]);\n\n  for (i = 0; i < _codersInfo.Size(); i++)\n  {\n    CCoderInfo &encodingInfo = _codersInfo[i];\n    \n    CMyComPtr<ICryptoResetInitVector> resetInitVector;\n    _mixerCoderSpec->_coders[i].QueryInterface(IID_ICryptoResetInitVector, (void **)&resetInitVector);\n    if (resetInitVector != NULL)\n    {\n      resetInitVector->ResetInitVector();\n    }\n\n    CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;\n    _mixerCoderSpec->_coders[i].QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties);\n    if (writeCoderProperties != NULL)\n    {\n      CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp;\n      CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n      outStreamSpec->Init();\n      writeCoderProperties->WriteCoderProperties(outStream);\n      size_t size = outStreamSpec->GetSize();\n      encodingInfo.Props.SetCapacity(size);\n      memmove(encodingInfo.Props, outStreamSpec->GetBuffer(), size);\n    }\n  }\n\n  UInt32 progressIndex = mainCoderIndex;\n\n  for (i = 0; i < _codersInfo.Size(); i++)\n  {\n    const CCoderInfo &e = _codersInfo[i];\n    if ((e.MethodID == k_BCJ || e.MethodID == k_BCJ2) && i + 1 < _codersInfo.Size())\n      progressIndex = i + 1;\n  }\n\n  _mixerCoderSpec->SetProgressCoderIndex(progressIndex);\n  \n  RINOK(_mixerCoder->Code(&inStreamPointers.Front(), NULL, 1,\n    &outStreamPointers.Front(), NULL, outStreamPointers.Size(), compressProgress));\n  \n  ConvertBindInfoToFolderItemInfo(_decompressBindInfo, _decompressionMethods,\n      folderItem);\n  \n  packSizes.Add(outStreamSizeCountSpec->GetSize());\n  \n  for (i = 1; i < _bindInfo.OutStreams.Size(); i++)\n  {\n    CInOutTempBuffer &inOutTempBuffer = inOutTempBuffers[i - 1];\n    inOutTempBuffer.FlushWrite();\n    inOutTempBuffer.InitReading();\n    inOutTempBuffer.WriteToStream(outStream);\n    packSizes.Add(inOutTempBuffer.GetDataSize());\n  }\n  \n  for (i = 0; i < (int)_bindReverseConverter->NumSrcInStreams; i++)\n  {\n    int binder = _bindInfo.FindBinderForInStream(\n        _bindReverseConverter->DestOutToSrcInMap[i]);\n    UInt64 streamSize;\n    if (binder < 0)\n      streamSize = inStreamSizeCountSpec->GetSize();\n    else\n      streamSize = _mixerCoderSpec->GetWriteProcessedSize(binder);\n    folderItem.UnpackSizes.Add(streamSize);\n  }\n  for (i = numMethods - 1; i >= 0; i--)\n    folderItem.Coders[numMethods - 1 - i].Props = _codersInfo[i].Props;\n  return S_OK;\n}\n\n\nCEncoder::CEncoder(const CCompressionMethodMode &options):\n  _bindReverseConverter(0),\n  _constructed(false)\n{\n\n  _options = options;\n  _mixerCoderSpec = NULL;\n}\n\nHRESULT CEncoder::EncoderConstr()\n{\n  if (_constructed)\n    return S_OK;\n  if (_options.Methods.IsEmpty())\n  {\n    // it has only password method;\n    if (!_options.PasswordIsDefined)\n      return -1;\n    if (!_options.Binds.IsEmpty())\n      return -1;\n    NCoderMixer::CCoderStreamsInfo coderStreamsInfo;\n    CMethodFull method;\n    \n    method.NumInStreams = 1;\n    method.NumOutStreams = 1;\n    coderStreamsInfo.NumInStreams = 1;\n    coderStreamsInfo.NumOutStreams = 1;\n    method.Id = k_AES;\n    \n    _options.Methods.Add(method);\n    _bindInfo.Coders.Add(coderStreamsInfo);\n  \n    _bindInfo.InStreams.Add(0);\n    _bindInfo.OutStreams.Add(0);\n  }\n  else\n  {\n\n  UInt32 numInStreams = 0, numOutStreams = 0;\n  int i;\n  for (i = 0; i < _options.Methods.Size(); i++)\n  {\n    const CMethodFull &methodFull = _options.Methods[i];\n    NCoderMixer::CCoderStreamsInfo coderStreamsInfo;\n    coderStreamsInfo.NumInStreams = methodFull.NumOutStreams;\n    coderStreamsInfo.NumOutStreams = methodFull.NumInStreams;\n    if (_options.Binds.IsEmpty())\n    {\n      if (i < _options.Methods.Size() - 1)\n      {\n        NCoderMixer::CBindPair bindPair;\n        bindPair.InIndex = numInStreams + coderStreamsInfo.NumInStreams;\n        bindPair.OutIndex = numOutStreams;\n        _bindInfo.BindPairs.Add(bindPair);\n      }\n      else\n        _bindInfo.OutStreams.Insert(0, numOutStreams);\n      for (UInt32 j = 1; j < coderStreamsInfo.NumOutStreams; j++)\n        _bindInfo.OutStreams.Add(numOutStreams + j);\n    }\n    \n    numInStreams += coderStreamsInfo.NumInStreams;\n    numOutStreams += coderStreamsInfo.NumOutStreams;\n\n    _bindInfo.Coders.Add(coderStreamsInfo);\n  }\n\n  if (!_options.Binds.IsEmpty())\n  {\n    for (i = 0; i < _options.Binds.Size(); i++)\n    {\n      NCoderMixer::CBindPair bindPair;\n      const CBind &bind = _options.Binds[i];\n      bindPair.InIndex = _bindInfo.GetCoderInStreamIndex(bind.InCoder) + bind.InStream;\n      bindPair.OutIndex = _bindInfo.GetCoderOutStreamIndex(bind.OutCoder) + bind.OutStream;\n      _bindInfo.BindPairs.Add(bindPair);\n    }\n    for (i = 0; i < (int)numOutStreams; i++)\n      if (_bindInfo.FindBinderForOutStream(i) == -1)\n        _bindInfo.OutStreams.Add(i);\n  }\n\n  for (i = 0; i < (int)numInStreams; i++)\n    if (_bindInfo.FindBinderForInStream(i) == -1)\n      _bindInfo.InStreams.Add(i);\n\n  if (_bindInfo.InStreams.IsEmpty())\n    return -1; // this is error\n\n  // Make main stream first in list\n  int inIndex = _bindInfo.InStreams[0];\n  for (;;)\n  {\n    UInt32 coderIndex, coderStreamIndex;\n    _bindInfo.FindInStream(inIndex, coderIndex, coderStreamIndex);\n    UInt32 outIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex);\n    int binder = _bindInfo.FindBinderForOutStream(outIndex);\n    if (binder >= 0)\n    {\n      inIndex = _bindInfo.BindPairs[binder].InIndex;\n      continue;\n    }\n    for (i = 0; i < _bindInfo.OutStreams.Size(); i++)\n      if (_bindInfo.OutStreams[i] == outIndex)\n      {\n        _bindInfo.OutStreams.Delete(i);\n        _bindInfo.OutStreams.Insert(0, outIndex);\n        break;\n      }\n    break;\n  }\n\n  if (_options.PasswordIsDefined)\n  {\n    int numCryptoStreams = _bindInfo.OutStreams.Size();\n\n    for (i = 0; i < numCryptoStreams; i++)\n    {\n      NCoderMixer::CBindPair bindPair;\n      bindPair.InIndex = numInStreams + i;\n      bindPair.OutIndex = _bindInfo.OutStreams[i];\n      _bindInfo.BindPairs.Add(bindPair);\n    }\n    _bindInfo.OutStreams.Clear();\n\n    /*\n    if (numCryptoStreams == 0)\n      numCryptoStreams = 1;\n    */\n\n    for (i = 0; i < numCryptoStreams; i++)\n    {\n      NCoderMixer::CCoderStreamsInfo coderStreamsInfo;\n      CMethodFull method;\n      method.NumInStreams = 1;\n      method.NumOutStreams = 1;\n      coderStreamsInfo.NumInStreams = method.NumOutStreams;\n      coderStreamsInfo.NumOutStreams = method.NumInStreams;\n      method.Id = k_AES;\n\n      _options.Methods.Add(method);\n      _bindInfo.Coders.Add(coderStreamsInfo);\n      _bindInfo.OutStreams.Add(numOutStreams + i);\n    }\n  }\n\n  }\n\n  for (int i = _options.Methods.Size() - 1; i >= 0; i--)\n  {\n    const CMethodFull &methodFull = _options.Methods[i];\n    _decompressionMethods.Add(methodFull.Id);\n  }\n\n  _bindReverseConverter = new NCoderMixer::CBindReverseConverter(_bindInfo);\n  _bindReverseConverter->CreateReverseBindInfo(_decompressBindInfo);\n  _constructed = true;\n  return S_OK;\n}\n\nCEncoder::~CEncoder()\n{\n  delete _bindReverseConverter;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zEncode.h",
    "content": "// 7zEncode.h\n\n#ifndef __7Z_ENCODE_H\n#define __7Z_ENCODE_H\n\n// #include \"../../Common/StreamObjects.h\"\n\n#include \"7zCompressionMode.h\"\n\n#include \"../Common/CoderMixer2.h\"\n#include \"../Common/CoderMixer2MT.h\"\n#ifdef _ST_MODE\n#include \"../Common/CoderMixer2ST.h\"\n#endif\n#include \"7zItem.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nclass CEncoder\n{\n  NCoderMixer::CCoderMixer2MT *_mixerCoderSpec;\n  CMyComPtr<ICompressCoder2> _mixerCoder;\n\n  CObjectVector<CCoderInfo> _codersInfo;\n\n  CCompressionMethodMode _options;\n  NCoderMixer::CBindInfo _bindInfo;\n  NCoderMixer::CBindInfo _decompressBindInfo;\n  NCoderMixer::CBindReverseConverter *_bindReverseConverter;\n  CRecordVector<CMethodId> _decompressionMethods;\n\n  HRESULT CreateMixerCoder(DECL_EXTERNAL_CODECS_LOC_VARS\n      const UInt64 *inSizeForReduce);\n\n  bool _constructed;\npublic:\n  CEncoder(const CCompressionMethodMode &options);\n  ~CEncoder();\n  HRESULT EncoderConstr();\n  HRESULT Encode(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      ISequentialInStream *inStream,\n      const UInt64 *inStreamSize, const UInt64 *inSizeForReduce,\n      CFolder &folderItem,\n      ISequentialOutStream *outStream,\n      CRecordVector<UInt64> &packSizes,\n      ICompressProgressInfo *compressProgress);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zExtract.cpp",
    "content": "// 7zExtract.cpp\n\n#include \"StdAfx.h\"\n\n#include \"7zHandler.h\"\n#include \"7zFolderOutStream.h\"\n#include \"7zDecode.h\"\n// #include \"7z1Decode.h\"\n\n#include \"../../../Common/ComTry.h\"\n#include \"../../Common/StreamObjects.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/LimitedStreams.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nstruct CExtractFolderInfo\n{\n  #ifdef _7Z_VOL\n  int VolumeIndex;\n  #endif\n  CNum FileIndex;\n  CNum FolderIndex;\n  CBoolVector ExtractStatuses;\n  UInt64 UnpackSize;\n  CExtractFolderInfo(\n    #ifdef _7Z_VOL\n    int volumeIndex,\n    #endif\n    CNum fileIndex, CNum folderIndex):\n    #ifdef _7Z_VOL\n    VolumeIndex(volumeIndex),\n    #endif\n    FileIndex(fileIndex),\n    FolderIndex(folderIndex),\n    UnpackSize(0)\n  {\n    if (fileIndex != kNumNoIndex)\n    {\n      ExtractStatuses.Reserve(1);\n      ExtractStatuses.Add(true);\n    }\n  };\n};\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 testModeSpec, IArchiveExtractCallback *extractCallbackSpec)\n{\n  COM_TRY_BEGIN\n  bool testMode = (testModeSpec != 0);\n  CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec;\n  UInt64 importantTotalUnpacked = 0;\n\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems =\n    #ifdef _7Z_VOL\n    _refs.Size();\n    #else\n    _db.Files.Size();\n    #endif\n\n  if(numItems == 0)\n    return S_OK;\n\n  /*\n  if(_volumes.Size() != 1)\n    return E_FAIL;\n  const CVolume &volume = _volumes.Front();\n  const CArchiveDatabaseEx &_db = volume.Database;\n  IInStream *_inStream = volume.Stream;\n  */\n  \n  CObjectVector<CExtractFolderInfo> extractFolderInfoVector;\n  for(UInt32 ii = 0; ii < numItems; ii++)\n  {\n    // UInt32 fileIndex = allFilesMode ? indexIndex : indices[indexIndex];\n    UInt32 ref2Index = allFilesMode ? ii : indices[ii];\n    // const CRef2 &ref2 = _refs[ref2Index];\n\n    // for(UInt32 ri = 0; ri < ref2.Refs.Size(); ri++)\n    {\n      #ifdef _7Z_VOL\n      // const CRef &ref = ref2.Refs[ri];\n      const CRef &ref = _refs[ref2Index];\n\n      int volumeIndex = ref.VolumeIndex;\n      const CVolume &volume = _volumes[volumeIndex];\n      const CArchiveDatabaseEx &db = volume.Database;\n      UInt32 fileIndex = ref.ItemIndex;\n      #else\n      const CArchiveDatabaseEx &db = _db;\n      UInt32 fileIndex = ref2Index;\n      #endif\n\n      CNum folderIndex = db.FileIndexToFolderIndexMap[fileIndex];\n      if (folderIndex == kNumNoIndex)\n      {\n        extractFolderInfoVector.Add(CExtractFolderInfo(\n            #ifdef _7Z_VOL\n            volumeIndex,\n            #endif\n            fileIndex, kNumNoIndex));\n        continue;\n      }\n      if (extractFolderInfoVector.IsEmpty() ||\n        folderIndex != extractFolderInfoVector.Back().FolderIndex\n        #ifdef _7Z_VOL\n        || volumeIndex != extractFolderInfoVector.Back().VolumeIndex\n        #endif\n        )\n      {\n        extractFolderInfoVector.Add(CExtractFolderInfo(\n            #ifdef _7Z_VOL\n            volumeIndex,\n            #endif\n            kNumNoIndex, folderIndex));\n        const CFolder &folderInfo = db.Folders[folderIndex];\n        UInt64 unpackSize = folderInfo.GetUnpackSize();\n        importantTotalUnpacked += unpackSize;\n        extractFolderInfoVector.Back().UnpackSize = unpackSize;\n      }\n      \n      CExtractFolderInfo &efi = extractFolderInfoVector.Back();\n      \n      // const CFolderInfo &folderInfo = m_dam_Folders[folderIndex];\n      CNum startIndex = db.FolderStartFileIndex[folderIndex];\n      for (CNum index = efi.ExtractStatuses.Size();\n          index <= fileIndex - startIndex; index++)\n      {\n        // UInt64 unpackSize = _db.Files[startIndex + index].UnpackSize;\n        // Count partial_folder_size\n        // efi.UnpackSize += unpackSize;\n        // importantTotalUnpacked += unpackSize;\n        efi.ExtractStatuses.Add(index == fileIndex - startIndex);\n      }\n    }\n  }\n\n  extractCallback->SetTotal(importantTotalUnpacked);\n\n  CDecoder decoder(\n    #ifdef _ST_MODE\n    false\n    #else\n    true\n    #endif\n    );\n  // CDecoder1 decoder;\n\n  UInt64 currentTotalPacked = 0;\n  UInt64 currentTotalUnpacked = 0;\n  UInt64 totalFolderUnpacked;\n  UInt64 totalFolderPacked;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  for(int i = 0; i < extractFolderInfoVector.Size(); i++,\n      currentTotalUnpacked += totalFolderUnpacked,\n      currentTotalPacked += totalFolderPacked)\n  {\n    lps->OutSize = currentTotalUnpacked;\n    lps->InSize = currentTotalPacked;\n    RINOK(lps->SetCur());\n    \n    const CExtractFolderInfo &efi = extractFolderInfoVector[i];\n    totalFolderUnpacked = efi.UnpackSize;\n\n    totalFolderPacked = 0;\n\n    CFolderOutStream *folderOutStream = new CFolderOutStream;\n    CMyComPtr<ISequentialOutStream> outStream(folderOutStream);\n\n    #ifdef _7Z_VOL\n    const CVolume &volume = _volumes[efi.VolumeIndex];\n    const CArchiveDatabaseEx &db = volume.Database;\n    #else\n    const CArchiveDatabaseEx &db = _db;\n    #endif\n\n    CNum startIndex;\n    if (efi.FileIndex != kNumNoIndex)\n      startIndex = efi.FileIndex;\n    else\n      startIndex = db.FolderStartFileIndex[efi.FolderIndex];\n\n\n    HRESULT result = folderOutStream->Init(&db,\n        #ifdef _7Z_VOL\n        volume.StartRef2Index,\n        #else\n        0,\n        #endif\n        startIndex,\n        &efi.ExtractStatuses, extractCallback, testMode, _crcSize != 0);\n\n    RINOK(result);\n\n    if (efi.FileIndex != kNumNoIndex)\n      continue;\n\n    CNum folderIndex = efi.FolderIndex;\n    const CFolder &folderInfo = db.Folders[folderIndex];\n\n    totalFolderPacked = _db.GetFolderFullPackSize(folderIndex);\n\n    CNum packStreamIndex = db.FolderStartPackStreamIndex[folderIndex];\n    UInt64 folderStartPackPos = db.GetFolderStreamPos(folderIndex, 0);\n\n    #ifndef _NO_CRYPTO\n    CMyComPtr<ICryptoGetTextPassword> getTextPassword;\n    if (extractCallback)\n      extractCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);\n    #endif\n\n      #ifndef _NO_CRYPTO\n      bool passwordIsDefined;\n      #endif\n\n      result = decoder.Decode(\n          EXTERNAL_CODECS_VARS\n          #ifdef _7Z_VOL\n          volume.Stream,\n          #else\n          _inStream,\n          #endif\n          folderStartPackPos,\n          &db.PackSizes[packStreamIndex],\n          folderInfo,\n          outStream,\n          progress\n          #ifndef _NO_CRYPTO\n          , getTextPassword, passwordIsDefined\n          #endif\n          #ifdef COMPRESS_MT\n          , true, _numThreads\n          #endif\n          );\n\n      if (result == S_FALSE)\n      {\n        RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError));\n        continue;\n      }\n      if (result == E_NOTIMPL)\n      {\n        RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n        continue;\n      }\n      if (result != S_OK)\n        return result;\n      if (folderOutStream->WasWritingFinished() != S_OK)\n      {\n        RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError));\n        continue;\n      }\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zFolderInStream.cpp",
    "content": "// 7zFolderInStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"7zFolderInStream.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nCFolderInStream::CFolderInStream()\n{\n  _inStreamWithHashSpec = new CSequentialInStreamWithCRC;\n  _inStreamWithHash = _inStreamWithHashSpec;\n}\n\nvoid CFolderInStream::Init(IArchiveUpdateCallback *updateCallback,\n    const UInt32 *fileIndices, UInt32 numFiles)\n{\n  _updateCallback = updateCallback;\n  _numFiles = numFiles;\n  _fileIndex = 0;\n  _fileIndices = fileIndices;\n  Processed.Clear();\n  CRCs.Clear();\n  Sizes.Clear();\n  _fileIsOpen = false;\n  _currentSizeIsDefined = false;\n}\n\nHRESULT CFolderInStream::OpenStream()\n{\n  _filePos = 0;\n  while (_fileIndex < _numFiles)\n  {\n    _currentSizeIsDefined = false;\n    CMyComPtr<ISequentialInStream> stream;\n    HRESULT result = _updateCallback->GetStream(_fileIndices[_fileIndex], &stream);\n    if (result != S_OK && result != S_FALSE)\n      return result;\n    _fileIndex++;\n    _inStreamWithHashSpec->SetStream(stream);\n    _inStreamWithHashSpec->Init();\n    if (!stream)\n    {\n      RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n      Sizes.Add(0);\n      Processed.Add(result == S_OK);\n      AddDigest();\n      continue;\n    }\n    CMyComPtr<IStreamGetSize> streamGetSize;\n    if (stream.QueryInterface(IID_IStreamGetSize, &streamGetSize) == S_OK)\n    {\n      if(streamGetSize)\n      {\n        _currentSizeIsDefined = true;\n        RINOK(streamGetSize->GetSize(&_currentSize));\n      }\n    }\n\n    _fileIsOpen = true;\n    return S_OK;\n  }\n  return S_OK;\n}\n\nvoid CFolderInStream::AddDigest()\n{\n  CRCs.Add(_inStreamWithHashSpec->GetCRC());\n}\n\nHRESULT CFolderInStream::CloseStream()\n{\n  RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n  _inStreamWithHashSpec->ReleaseStream();\n  _fileIsOpen = false;\n  Processed.Add(true);\n  Sizes.Add(_filePos);\n  AddDigest();\n  return S_OK;\n}\n\nSTDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize = 0;\n  while ((_fileIndex < _numFiles || _fileIsOpen) && size > 0)\n  {\n    if (_fileIsOpen)\n    {\n      UInt32 localProcessedSize;\n      RINOK(_inStreamWithHash->Read(\n          ((Byte *)data) + realProcessedSize, size, &localProcessedSize));\n      if (localProcessedSize == 0)\n      {\n        RINOK(CloseStream());\n        continue;\n      }\n      realProcessedSize += localProcessedSize;\n      _filePos += localProcessedSize;\n      size -= localProcessedSize;\n      break;\n    }\n    else\n    {\n      RINOK(OpenStream());\n    }\n  }\n  if (processedSize != 0)\n    *processedSize = realProcessedSize;\n  return S_OK;\n}\n\nSTDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value)\n{\n  *value = 0;\n  int subStreamIndex = (int)subStream;\n  if (subStreamIndex < 0 || subStream > Sizes.Size())\n    return E_FAIL;\n  if (subStreamIndex < Sizes.Size())\n  {\n    *value= Sizes[subStreamIndex];\n    return S_OK;\n  }\n  if (!_currentSizeIsDefined)\n    return S_FALSE;\n  *value = _currentSize;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zFolderInStream.h",
    "content": "// 7z/FolderInStream.h\n\n#ifndef __7Z_FOLDERINSTREAM_H\n#define __7Z_FOLDERINSTREAM_H\n\n#include \"7zItem.h\"\n#include \"7zHeader.h\"\n\n#include \"../IArchive.h\"\n#include \"../Common/InStreamWithCRC.h\"\n#include \"../../IStream.h\"\n#include \"../../ICoder.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nclass CFolderInStream:\n  public ISequentialInStream,\n  public ICompressGetSubStreamSize,\n  public CMyUnknownImp\n{\npublic:\n\n  MY_UNKNOWN_IMP1(ICompressGetSubStreamSize)\n\n  CFolderInStream();\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n\n  STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value);\nprivate:\n  CSequentialInStreamWithCRC *_inStreamWithHashSpec;\n  CMyComPtr<ISequentialInStream> _inStreamWithHash;\n  CMyComPtr<IArchiveUpdateCallback> _updateCallback;\n\n  bool _currentSizeIsDefined;\n  UInt64 _currentSize;\n\n  bool _fileIsOpen;\n  UInt64 _filePos;\n\n  const UInt32 *_fileIndices;\n  UInt32 _numFiles;\n  UInt32 _fileIndex;\n\n  HRESULT OpenStream();\n  HRESULT CloseStream();\n  void AddDigest();\npublic:\n  void Init(IArchiveUpdateCallback *updateCallback,\n      const UInt32 *fileIndices, UInt32 numFiles);\n  CRecordVector<bool> Processed;\n  CRecordVector<UInt32> CRCs;\n  CRecordVector<UInt64> Sizes;\n  UInt64 GetFullSize() const\n  {\n    UInt64 size = 0;\n    for (int i = 0; i < Sizes.Size(); i++)\n      size += Sizes[i];\n    return size;\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zFolderOutStream.cpp",
    "content": "// 7zFolderOutStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"7zFolderOutStream.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nCFolderOutStream::CFolderOutStream()\n{\n  _outStreamWithHashSpec = new COutStreamWithCRC;\n  _outStreamWithHash = _outStreamWithHashSpec;\n}\n\nHRESULT CFolderOutStream::Init(\n    const CArchiveDatabaseEx *archiveDatabase,\n    UInt32 ref2Offset,\n    UInt32 startIndex,\n    const CBoolVector *extractStatuses,\n    IArchiveExtractCallback *extractCallback,\n    bool testMode,\n    bool checkCrc)\n{\n  _archiveDatabase = archiveDatabase;\n  _ref2Offset = ref2Offset;\n  _startIndex = startIndex;\n\n  _extractStatuses = extractStatuses;\n  _extractCallback = extractCallback;\n  _testMode = testMode;\n\n  _checkCrc = checkCrc;\n\n  _currentIndex = 0;\n  _fileIsOpen = false;\n  return WriteEmptyFiles();\n}\n\nHRESULT CFolderOutStream::OpenFile()\n{\n  Int32 askMode;\n  if((*_extractStatuses)[_currentIndex])\n    askMode = _testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n  else\n    askMode = NArchive::NExtract::NAskMode::kSkip;\n  CMyComPtr<ISequentialOutStream> realOutStream;\n\n  UInt32 index = _startIndex + _currentIndex;\n  RINOK(_extractCallback->GetStream(_ref2Offset + index, &realOutStream, askMode));\n\n  _outStreamWithHashSpec->SetStream(realOutStream);\n  _outStreamWithHashSpec->Init(_checkCrc);\n  if (askMode == NArchive::NExtract::NAskMode::kExtract &&\n      (!realOutStream))\n  {\n    const CFileItem &fi = _archiveDatabase->Files[index];\n    if (!_archiveDatabase->IsItemAnti(index) && !fi.IsDir)\n      askMode = NArchive::NExtract::NAskMode::kSkip;\n  }\n  return _extractCallback->PrepareOperation(askMode);\n}\n\nHRESULT CFolderOutStream::WriteEmptyFiles()\n{\n  for(;_currentIndex < _extractStatuses->Size(); _currentIndex++)\n  {\n    UInt32 index = _startIndex + _currentIndex;\n    const CFileItem &fi = _archiveDatabase->Files[index];\n    if (!_archiveDatabase->IsItemAnti(index) && !fi.IsDir && fi.Size != 0)\n      return S_OK;\n    RINOK(OpenFile());\n    RINOK(_extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n    _outStreamWithHashSpec->ReleaseStream();\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CFolderOutStream::Write(const void *data,\n    UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize = 0;\n  while(_currentIndex < _extractStatuses->Size())\n  {\n    if (_fileIsOpen)\n    {\n      UInt32 index = _startIndex + _currentIndex;\n      const CFileItem &fi = _archiveDatabase->Files[index];\n      UInt64 fileSize = fi.Size;\n      \n      UInt32 numBytesToWrite = (UInt32)MyMin(fileSize - _filePos,\n          UInt64(size - realProcessedSize));\n      \n      UInt32 processedSizeLocal;\n      RINOK(_outStreamWithHash->Write((const Byte *)data + realProcessedSize,\n            numBytesToWrite, &processedSizeLocal));\n\n      _filePos += processedSizeLocal;\n      realProcessedSize += processedSizeLocal;\n      if (_filePos == fileSize)\n      {\n        bool digestsAreEqual;\n        if (fi.CrcDefined && _checkCrc)\n          digestsAreEqual = fi.Crc == _outStreamWithHashSpec->GetCRC();\n        else\n          digestsAreEqual = true;\n\n        RINOK(_extractCallback->SetOperationResult(\n            digestsAreEqual ?\n            NArchive::NExtract::NOperationResult::kOK :\n            NArchive::NExtract::NOperationResult::kCRCError));\n        _outStreamWithHashSpec->ReleaseStream();\n        _fileIsOpen = false;\n        _currentIndex++;\n      }\n      if (realProcessedSize == size)\n      {\n        if (processedSize != NULL)\n          *processedSize = realProcessedSize;\n        return WriteEmptyFiles();\n      }\n    }\n    else\n    {\n      RINOK(OpenFile());\n      _fileIsOpen = true;\n      _filePos = 0;\n    }\n  }\n  if (processedSize != NULL)\n    *processedSize = size;\n  return S_OK;\n}\n\nHRESULT CFolderOutStream::FlushCorrupted(Int32 resultEOperationResult)\n{\n  while(_currentIndex < _extractStatuses->Size())\n  {\n    if (_fileIsOpen)\n    {\n      RINOK(_extractCallback->SetOperationResult(resultEOperationResult));\n      _outStreamWithHashSpec->ReleaseStream();\n      _fileIsOpen = false;\n      _currentIndex++;\n    }\n    else\n    {\n      RINOK(OpenFile());\n      _fileIsOpen = true;\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CFolderOutStream::WasWritingFinished()\n{\n  if (_currentIndex == _extractStatuses->Size())\n    return S_OK;\n  return E_FAIL;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zFolderOutStream.h",
    "content": "// 7zFolderOutStream.h\n\n#ifndef __7Z_FOLDEROUTSTREAM_H\n#define __7Z_FOLDEROUTSTREAM_H\n\n#include \"7zIn.h\"\n\n#include \"../../IStream.h\"\n#include \"../IArchive.h\"\n#include \"../Common/OutStreamWithCRC.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nclass CFolderOutStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n  \n  CFolderOutStream();\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\nprivate:\n\n  COutStreamWithCRC *_outStreamWithHashSpec;\n  CMyComPtr<ISequentialOutStream> _outStreamWithHash;\n  const CArchiveDatabaseEx *_archiveDatabase;\n  const CBoolVector *_extractStatuses;\n  UInt32 _startIndex;\n  UInt32 _ref2Offset;\n  int _currentIndex;\n  // UInt64 _currentDataPos;\n  CMyComPtr<IArchiveExtractCallback> _extractCallback;\n  bool _testMode;\n\n  bool _fileIsOpen;\n\n  bool _checkCrc;\n  UInt64 _filePos;\n\n  HRESULT OpenFile();\n  HRESULT WriteEmptyFiles();\npublic:\n  HRESULT Init(\n      const CArchiveDatabaseEx *archiveDatabase,\n      UInt32 ref2Offset,\n      UInt32 startIndex,\n      const CBoolVector *extractStatuses,\n      IArchiveExtractCallback *extractCallback,\n      bool testMode,\n      bool checkCrc);\n  HRESULT FlushCorrupted(Int32 resultEOperationResult);\n  HRESULT WasWritingFinished();\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zHandler.cpp",
    "content": "// 7zHandler.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/CpuArch.h\"\n}\n\n#include \"../../../Common/ComTry.h\"\n#include \"../../../Common/IntToString.h\"\n\n#ifdef COMPRESS_MT\n#include \"../../../Windows/System.h\"\n#endif\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"7zHandler.h\"\n#include \"7zProperties.h\"\n\n#ifdef __7Z_SET_PROPERTIES\n#ifdef EXTRACT_ONLY\n#include \"../Common/ParseProperties.h\"\n#endif\n#endif\n\nusing namespace NWindows;\n\nextern UString ConvertMethodIdToString(UInt64 id);\n\nnamespace NArchive {\nnamespace N7z {\n\nCHandler::CHandler()\n{\n  _crcSize = 4;\n\n  #ifndef _NO_CRYPTO\n  _passwordIsDefined = false;\n  #endif\n\n  #ifdef EXTRACT_ONLY\n  #ifdef COMPRESS_MT\n  _numThreads = NSystem::GetNumberOfProcessors();\n  #endif\n  #else\n  Init();\n  #endif\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _db.Files.Size();\n  return S_OK;\n}\n\n#ifdef _SFX\n\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::GetNumberOfProperties(UInt32 * /* numProperties */)\n{\n  return E_NOTIMPL;\n}\n\nSTDMETHODIMP CHandler::GetPropertyInfo(UInt32 /* index */,\n      BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */)\n{\n  return E_NOTIMPL;\n}\n\n\n#else\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidSolid, VT_BOOL},\n  { NULL, kpidNumBlocks, VT_UI4},\n  { NULL, kpidPhySize, VT_UI8},\n  { NULL, kpidHeadersSize, VT_UI8},\n  { NULL, kpidOffset, VT_UI8}\n};\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidMethod:\n    {\n      UString resString;\n      CRecordVector<UInt64> ids;\n      int i;\n      for (i = 0; i < _db.Folders.Size(); i++)\n      {\n        const CFolder &f = _db.Folders[i];\n        for (int j = f.Coders.Size() - 1; j >= 0; j--)\n          ids.AddToUniqueSorted(f.Coders[j].MethodID);\n      }\n\n      for (i = 0; i < ids.Size(); i++)\n      {\n        UInt64 id = ids[i];\n        UString methodName;\n        /* bool methodIsKnown = */ FindMethod(EXTERNAL_CODECS_VARS id, methodName);\n        if (methodName.IsEmpty())\n          methodName = ConvertMethodIdToString(id);\n        if (!resString.IsEmpty())\n          resString += L' ';\n        resString += methodName;\n      }\n      prop = resString;\n      break;\n    }\n    case kpidSolid: prop = _db.IsSolid(); break;\n    case kpidNumBlocks: prop = (UInt32)_db.Folders.Size(); break;\n    case kpidHeadersSize:  prop = _db.HeadersSize; break;\n    case kpidPhySize:  prop = _db.PhySize; break;\n    case kpidOffset: if (_db.ArchiveInfo.StartPosition != 0) prop = _db.ArchiveInfo.StartPosition; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nIMP_IInArchive_ArcProps\n\n#endif\n\nstatic void SetPropFromUInt64Def(CUInt64DefVector &v, int index, NCOM::CPropVariant &prop)\n{\n  UInt64 value;\n  if (v.GetItem(index, value))\n  {\n    FILETIME ft;\n    ft.dwLowDateTime = (DWORD)value;\n    ft.dwHighDateTime = (DWORD)(value >> 32);\n    prop = ft;\n  }\n}\n\n#ifndef _SFX\n\nstatic UString ConvertUInt32ToString(UInt32 value)\n{\n  wchar_t buffer[32];\n  ConvertUInt64ToString(value, buffer);\n  return buffer;\n}\n\nstatic UString GetStringForSizeValue(UInt32 value)\n{\n  for (int i = 31; i >= 0; i--)\n    if ((UInt32(1) << i) == value)\n      return ConvertUInt32ToString(i);\n  UString result;\n  if (value % (1 << 20) == 0)\n  {\n    result += ConvertUInt32ToString(value >> 20);\n    result += L\"m\";\n  }\n  else if (value % (1 << 10) == 0)\n  {\n    result += ConvertUInt32ToString(value >> 10);\n    result += L\"k\";\n  }\n  else\n  {\n    result += ConvertUInt32ToString(value);\n    result += L\"b\";\n  }\n  return result;\n}\n\nstatic const UInt64 k_Copy = 0x0;\nstatic const UInt64 k_LZMA  = 0x030101;\nstatic const UInt64 k_PPMD  = 0x030401;\n\nstatic wchar_t GetHex(Byte value)\n{\n  return (wchar_t)((value < 10) ? (L'0' + value) : (L'A' + (value - 10)));\n}\nstatic inline UString GetHex2(Byte value)\n{\n  UString result;\n  result += GetHex((Byte)(value >> 4));\n  result += GetHex((Byte)(value & 0xF));\n  return result;\n}\n\n#endif\n\nstatic const UInt64 k_AES  = 0x06F10701;\n\nbool CHandler::IsEncrypted(UInt32 index2) const\n{\n  CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];\n  if (folderIndex != kNumNoIndex)\n  {\n    const CFolder &folderInfo = _db.Folders[folderIndex];\n    for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--)\n      if (folderInfo.Coders[i].MethodID == k_AES)\n        return true;\n  }\n  return false;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  \n  /*\n  const CRef2 &ref2 = _refs[index];\n  if (ref2.Refs.IsEmpty())\n    return E_FAIL;\n  const CRef &ref = ref2.Refs.Front();\n  */\n  \n  const CFileItem &item = _db.Files[index];\n  UInt32 index2 = index;\n\n  switch(propID)\n  {\n    case kpidPath:\n      if (!item.Name.IsEmpty())\n        prop = NItemName::GetOSName(item.Name);\n      break;\n    case kpidIsDir:  prop = item.IsDir; break;\n    case kpidSize:\n    {\n      prop = item.Size;\n      // prop = ref2.Size;\n      break;\n    }\n    case kpidPackSize:\n    {\n      // prop = ref2.PackSize;\n      {\n        CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];\n        if (folderIndex != kNumNoIndex)\n        {\n          if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2)\n            prop = _db.GetFolderFullPackSize(folderIndex);\n          /*\n          else\n            prop = (UInt64)0;\n          */\n        }\n        else\n          prop = (UInt64)0;\n      }\n      break;\n    }\n    case kpidPosition:  { UInt64 v; if (_db.StartPos.GetItem(index2, v)) prop = v; break; }\n    case kpidCTime:  SetPropFromUInt64Def(_db.CTime, index2, prop); break;\n    case kpidATime:  SetPropFromUInt64Def(_db.ATime, index2, prop); break;\n    case kpidMTime:  SetPropFromUInt64Def(_db.MTime, index2, prop); break;\n    case kpidAttrib:  if (item.AttribDefined) prop = item.Attrib; break;\n    case kpidCRC:  if (item.CrcDefined) prop = item.Crc; break;\n    case kpidEncrypted:  prop = IsEncrypted(index2); break;\n    case kpidIsAnti:  prop = _db.IsItemAnti(index2); break;\n    #ifndef _SFX\n    case kpidMethod:\n      {\n        CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];\n        if (folderIndex != kNumNoIndex)\n        {\n          const CFolder &folderInfo = _db.Folders[folderIndex];\n          UString methodsString;\n          for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--)\n          {\n            const CCoderInfo &coderInfo = folderInfo.Coders[i];\n            if (!methodsString.IsEmpty())\n              methodsString += L' ';\n\n            {\n              UString methodName;\n              bool methodIsKnown = FindMethod(\n                  EXTERNAL_CODECS_VARS\n                  coderInfo.MethodID, methodName);\n\n              if (methodIsKnown)\n              {\n                methodsString += methodName;\n                if (coderInfo.MethodID == k_LZMA)\n                {\n                  if (coderInfo.Props.GetCapacity() >= 5)\n                  {\n                    methodsString += L\":\";\n                    UInt32 dicSize = GetUi32((const Byte *)coderInfo.Props + 1);\n                    methodsString += GetStringForSizeValue(dicSize);\n                  }\n                }\n                else if (coderInfo.MethodID == k_PPMD)\n                {\n                  if (coderInfo.Props.GetCapacity() >= 5)\n                  {\n                    Byte order = *(const Byte *)coderInfo.Props;\n                    methodsString += L\":o\";\n                    methodsString += ConvertUInt32ToString(order);\n                    methodsString += L\":mem\";\n                    UInt32 dicSize = GetUi32((const Byte *)coderInfo.Props + 1);\n                    methodsString += GetStringForSizeValue(dicSize);\n                  }\n                }\n                else if (coderInfo.MethodID == k_AES)\n                {\n                  if (coderInfo.Props.GetCapacity() >= 1)\n                  {\n                    methodsString += L\":\";\n                    const Byte *data = (const Byte *)coderInfo.Props;\n                    Byte firstByte = *data++;\n                    UInt32 numCyclesPower = firstByte & 0x3F;\n                    methodsString += ConvertUInt32ToString(numCyclesPower);\n                    /*\n                    if ((firstByte & 0xC0) != 0)\n                    {\n                      methodsString += L\":\";\n                      return S_OK;\n                      UInt32 saltSize = (firstByte >> 7) & 1;\n                      UInt32 ivSize = (firstByte >> 6) & 1;\n                      if (coderInfo.Props.GetCapacity() >= 2)\n                      {\n                        Byte secondByte = *data++;\n                        saltSize += (secondByte >> 4);\n                        ivSize += (secondByte & 0x0F);\n                      }\n                    }\n                    */\n                  }\n                }\n                else\n                {\n                  if (coderInfo.Props.GetCapacity() > 0)\n                  {\n                    methodsString += L\":[\";\n                    for (size_t bi = 0; bi < coderInfo.Props.GetCapacity(); bi++)\n                    {\n                      if (bi > 5 && bi + 1 < coderInfo.Props.GetCapacity())\n                      {\n                        methodsString += L\"..\";\n                        break;\n                      }\n                      else\n                        methodsString += GetHex2(coderInfo.Props[bi]);\n                    }\n                    methodsString += L\"]\";\n                  }\n                }\n              }\n              else\n              {\n                methodsString += ConvertMethodIdToString(coderInfo.MethodID);\n              }\n            }\n          }\n          prop = methodsString;\n        }\n      }\n      break;\n    case kpidBlock:\n      {\n        CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];\n        if (folderIndex != kNumNoIndex)\n          prop = (UInt32)folderIndex;\n      }\n      break;\n    case kpidPackedSize0:\n    case kpidPackedSize1:\n    case kpidPackedSize2:\n    case kpidPackedSize3:\n    case kpidPackedSize4:\n      {\n        CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];\n        if (folderIndex != kNumNoIndex)\n        {\n          const CFolder &folderInfo = _db.Folders[folderIndex];\n          if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2 &&\n              folderInfo.PackStreams.Size() > (int)(propID - kpidPackedSize0))\n          {\n            prop = _db.GetFolderPackStreamSize(folderIndex, propID - kpidPackedSize0);\n          }\n          else\n            prop = (UInt64)0;\n        }\n        else\n          prop = (UInt64)0;\n      }\n      break;\n    #endif\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 *maxCheckStartPosition,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  Close();\n  #ifndef _SFX\n  _fileInfoPopIDs.Clear();\n  #endif\n\n    CMyComPtr<IArchiveOpenCallback> openArchiveCallbackTemp = openArchiveCallback;\n\n    #ifndef _NO_CRYPTO\n    CMyComPtr<ICryptoGetTextPassword> getTextPassword;\n    if (openArchiveCallback)\n    {\n      openArchiveCallbackTemp.QueryInterface(\n          IID_ICryptoGetTextPassword, &getTextPassword);\n    }\n    #endif\n    CInArchive archive;\n    RINOK(archive.Open(stream, maxCheckStartPosition));\n    #ifndef _NO_CRYPTO\n    _passwordIsDefined = false;\n    UString password;\n    #endif\n    HRESULT result = archive.ReadDatabase(\n      EXTERNAL_CODECS_VARS\n      _db\n      #ifndef _NO_CRYPTO\n      , getTextPassword, _passwordIsDefined\n      #endif\n      );\n    RINOK(result);\n    _db.Fill();\n    _inStream = stream;\n\n  // _inStream = stream;\n  #ifndef _SFX\n  FillPopIDs();\n  #endif\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  COM_TRY_BEGIN\n  _inStream.Release();\n  _db.Clear();\n  return S_OK;\n  COM_TRY_END\n}\n\n#ifdef __7Z_SET_PROPERTIES\n#ifdef EXTRACT_ONLY\n\nSTDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)\n{\n  COM_TRY_BEGIN\n  #ifdef COMPRESS_MT\n  const UInt32 numProcessors = NSystem::GetNumberOfProcessors();\n  _numThreads = numProcessors;\n  #endif\n\n  for (int i = 0; i < numProperties; i++)\n  {\n    UString name = names[i];\n    name.MakeUpper();\n    if (name.IsEmpty())\n      return E_INVALIDARG;\n    const PROPVARIANT &value = values[i];\n    UInt32 number;\n    int index = ParseStringToUInt32(name, number);\n    if (index == 0)\n    {\n      if(name.Left(2).CompareNoCase(L\"MT\") == 0)\n      {\n        #ifdef COMPRESS_MT\n        RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads));\n        #endif\n        continue;\n      }\n      else\n        return E_INVALIDARG;\n    }\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\n#endif\n#endif\n\nIMPL_ISetCompressCodecsInfo\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zHandler.h",
    "content": "// 7z/Handler.h\n\n#ifndef __7Z_HANDLER_H\n#define __7Z_HANDLER_H\n\n#include \"../../ICoder.h\"\n#include \"../IArchive.h\"\n#include \"7zIn.h\"\n\n#include \"7zCompressionMode.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\n#ifndef EXTRACT_ONLY\n#include \"../Common/HandlerOut.h\"\n#endif\n\nnamespace NArchive {\nnamespace N7z {\n\n#ifndef __7Z_SET_PROPERTIES\n\n#ifdef EXTRACT_ONLY\n#ifdef COMPRESS_MT\n#define __7Z_SET_PROPERTIES\n#endif\n#else\n#define __7Z_SET_PROPERTIES\n#endif\n\n#endif\n\n\nclass CHandler:\n  #ifndef EXTRACT_ONLY\n  public NArchive::COutHandler,\n  #endif\n  public IInArchive,\n  #ifdef __7Z_SET_PROPERTIES\n  public ISetProperties,\n  #endif\n  #ifndef EXTRACT_ONLY\n  public IOutArchive,\n  #endif\n  PUBLIC_ISetCompressCodecsInfo\n  public CMyUnknownImp\n{\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IInArchive)\n  #ifdef __7Z_SET_PROPERTIES\n  MY_QUERYINTERFACE_ENTRY(ISetProperties)\n  #endif\n  #ifndef EXTRACT_ONLY\n  MY_QUERYINTERFACE_ENTRY(IOutArchive)\n  #endif\n  QUERY_ENTRY_ISetCompressCodecsInfo\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  INTERFACE_IInArchive(;)\n\n  #ifdef __7Z_SET_PROPERTIES\n  STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties);\n  #endif\n\n  #ifndef EXTRACT_ONLY\n  INTERFACE_IOutArchive(;)\n  #endif\n\n  DECL_ISetCompressCodecsInfo\n\n  CHandler();\n\nprivate:\n  CMyComPtr<IInStream> _inStream;\n  NArchive::N7z::CArchiveDatabaseEx _db;\n  #ifndef _NO_CRYPTO\n  bool _passwordIsDefined;\n  #endif\n\n  #ifdef EXTRACT_ONLY\n  \n  #ifdef COMPRESS_MT\n  UInt32 _numThreads;\n  #endif\n\n  UInt32 _crcSize;\n\n  #else\n  \n  CRecordVector<CBind> _binds;\n\n  HRESULT SetPassword(CCompressionMethodMode &methodMode, IArchiveUpdateCallback *updateCallback);\n\n  HRESULT SetCompressionMethod(CCompressionMethodMode &method,\n      CObjectVector<COneMethodInfo> &methodsInfo\n      #ifdef COMPRESS_MT\n      , UInt32 numThreads\n      #endif\n      );\n\n  HRESULT SetCompressionMethod(\n      CCompressionMethodMode &method,\n      CCompressionMethodMode &headerMethod);\n\n  #endif\n\n  bool IsEncrypted(UInt32 index2) const;\n  #ifndef _SFX\n\n  CRecordVector<UInt64> _fileInfoPopIDs;\n  void FillPopIDs();\n\n  #endif\n\n  DECL_EXTERNAL_CODECS_VARS\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zHandlerOut.cpp",
    "content": "// 7zHandlerOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../Windows/PropVariant.h\"\n\n#include \"../../../Common/ComTry.h\"\n#include \"../../../Common/StringToInt.h\"\n\n#include \"../../ICoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n#include \"../Common/ParseProperties.h\"\n\n#include \"7zHandler.h\"\n#include \"7zOut.h\"\n#include \"7zUpdate.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace N7z {\n\nstatic const wchar_t *kLZMAMethodName = L\"LZMA\";\nstatic const wchar_t *kCopyMethod = L\"Copy\";\nstatic const wchar_t *kDefaultMethodName = kLZMAMethodName;\n\nstatic const UInt32 kLzmaAlgorithmX5 = 1;\nstatic const wchar_t *kLzmaMatchFinderForHeaders = L\"BT2\";\nstatic const UInt32 kDictionaryForHeaders = 1 << 20;\nstatic const UInt32 kNumFastBytesForHeaders = 273;\nstatic const UInt32 kAlgorithmForHeaders = kLzmaAlgorithmX5;\n\nstatic inline bool IsCopyMethod(const UString &methodName)\n  { return (methodName.CompareNoCase(kCopyMethod) == 0); }\n\nSTDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)\n{\n  *type = NFileTimeType::kWindows;\n  return S_OK;\n}\n\nHRESULT CHandler::SetPassword(CCompressionMethodMode &methodMode,\n    IArchiveUpdateCallback *updateCallback)\n{\n  CMyComPtr<ICryptoGetTextPassword2> getTextPassword;\n  if (!getTextPassword)\n  {\n    CMyComPtr<IArchiveUpdateCallback> udateCallback2(updateCallback);\n    udateCallback2.QueryInterface(IID_ICryptoGetTextPassword2, &getTextPassword);\n  }\n  \n  if (getTextPassword)\n  {\n    CMyComBSTR password;\n    Int32 passwordIsDefined;\n    RINOK(getTextPassword->CryptoGetTextPassword2(\n        &passwordIsDefined, &password));\n    methodMode.PasswordIsDefined = IntToBool(passwordIsDefined);\n    if (methodMode.PasswordIsDefined)\n      methodMode.Password = password;\n  }\n  else\n    methodMode.PasswordIsDefined = false;\n  return S_OK;\n}\n\nHRESULT CHandler::SetCompressionMethod(\n    CCompressionMethodMode &methodMode,\n    CCompressionMethodMode &headerMethod)\n{\n  HRESULT res = SetCompressionMethod(methodMode, _methods\n  #ifdef COMPRESS_MT\n  , _numThreads\n  #endif\n  );\n  RINOK(res);\n  methodMode.Binds = _binds;\n\n  if (_compressHeaders)\n  {\n    // headerMethod.Methods.Add(methodMode.Methods.Back());\n\n    CObjectVector<COneMethodInfo> headerMethodInfoVector;\n    COneMethodInfo oneMethodInfo;\n    oneMethodInfo.MethodName = kLZMAMethodName;\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kMatchFinder;\n      prop.Value = kLzmaMatchFinderForHeaders;\n      oneMethodInfo.Props.Add(prop);\n    }\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kAlgorithm;\n      prop.Value = kAlgorithmForHeaders;\n      oneMethodInfo.Props.Add(prop);\n    }\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kNumFastBytes;\n      prop.Value = (UInt32)kNumFastBytesForHeaders;\n      oneMethodInfo.Props.Add(prop);\n    }\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kDictionarySize;\n      prop.Value = (UInt32)kDictionaryForHeaders;\n      oneMethodInfo.Props.Add(prop);\n    }\n    headerMethodInfoVector.Add(oneMethodInfo);\n    HRESULT res = SetCompressionMethod(headerMethod, headerMethodInfoVector\n      #ifdef COMPRESS_MT\n      ,1\n      #endif\n    );\n    RINOK(res);\n  }\n  return S_OK;\n}\n\nHRESULT CHandler::SetCompressionMethod(\n    CCompressionMethodMode &methodMode,\n    CObjectVector<COneMethodInfo> &methodsInfo\n    #ifdef COMPRESS_MT\n    , UInt32 numThreads\n    #endif\n    )\n{\n  UInt32 level = _level;\n  \n  if (methodsInfo.IsEmpty())\n  {\n    COneMethodInfo oneMethodInfo;\n    oneMethodInfo.MethodName = ((level == 0) ? kCopyMethod : kDefaultMethodName);\n    methodsInfo.Add(oneMethodInfo);\n  }\n\n  bool needSolid = false;\n  for(int i = 0; i < methodsInfo.Size(); i++)\n  {\n    COneMethodInfo &oneMethodInfo = methodsInfo[i];\n    SetCompressionMethod2(oneMethodInfo\n      #ifdef COMPRESS_MT\n      , numThreads\n      #endif\n      );\n\n    if (!IsCopyMethod(oneMethodInfo.MethodName))\n      needSolid = true;\n\n    CMethodFull methodFull;\n\n    if (!FindMethod(\n        EXTERNAL_CODECS_VARS\n        oneMethodInfo.MethodName, methodFull.Id, methodFull.NumInStreams, methodFull.NumOutStreams))\n      return E_INVALIDARG;\n    methodFull.Props = oneMethodInfo.Props;\n    methodMode.Methods.Add(methodFull);\n\n    if (!_numSolidBytesDefined)\n    {\n      for (int j = 0; j < methodFull.Props.Size(); j++)\n      {\n        const CProp &prop = methodFull.Props[j];\n        if ((prop.Id == NCoderPropID::kDictionarySize ||\n             prop.Id == NCoderPropID::kUsedMemorySize) && prop.Value.vt == VT_UI4)\n        {\n          _numSolidBytes = ((UInt64)prop.Value.ulVal) << 7;\n          const UInt64 kMinSize = (1 << 24);\n          if (_numSolidBytes < kMinSize)\n            _numSolidBytes = kMinSize;\n          _numSolidBytesDefined = true;\n          break;\n        }\n      }\n    }\n  }\n\n  if (!needSolid && !_numSolidBytesDefined)\n  {\n    _numSolidBytesDefined = true;\n    _numSolidBytes  = 0;\n  }\n  return S_OK;\n}\n\nstatic HRESULT GetTime(IArchiveUpdateCallback *updateCallback, int index, bool writeTime, PROPID propID, UInt64 &ft, bool &ftDefined)\n{\n  ft = 0;\n  ftDefined = false;\n  if (!writeTime)\n    return S_OK;\n  NCOM::CPropVariant prop;\n  RINOK(updateCallback->GetProperty(index, propID, &prop));\n  if (prop.vt == VT_FILETIME)\n  {\n    ft = prop.filetime.dwLowDateTime | ((UInt64)prop.filetime.dwHighDateTime << 32);\n    ftDefined = true;\n  }\n  else if (prop.vt != VT_EMPTY)\n    return E_INVALIDARG;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,\n    IArchiveUpdateCallback *updateCallback)\n{\n  COM_TRY_BEGIN\n\n  const CArchiveDatabaseEx *db = 0;\n  #ifdef _7Z_VOL\n  if(_volumes.Size() > 1)\n    return E_FAIL;\n  const CVolume *volume = 0;\n  if (_volumes.Size() == 1)\n  {\n    volume = &_volumes.Front();\n    db = &volume->Database;\n  }\n  #else\n  if (_inStream != 0)\n    db = &_db;\n  #endif\n\n  CObjectVector<CUpdateItem> updateItems;\n  \n  for (UInt32 i = 0; i < numItems; i++)\n  {\n    Int32 newData;\n    Int32 newProperties;\n    UInt32 indexInArchive;\n    if (!updateCallback)\n      return E_FAIL;\n    RINOK(updateCallback->GetUpdateItemInfo(i, &newData, &newProperties, &indexInArchive));\n    CUpdateItem ui;\n    ui.NewProperties = IntToBool(newProperties);\n    ui.NewData = IntToBool(newData);\n    ui.IndexInArchive = indexInArchive;\n    ui.IndexInClient = i;\n    ui.IsAnti = false;\n    ui.Size = 0;\n\n    if (ui.IndexInArchive != -1)\n    {\n      const CFileItem &fi = db->Files[ui.IndexInArchive];\n      ui.Name = fi.Name;\n      ui.IsDir = fi.IsDir;\n      ui.Size = fi.Size;\n      ui.IsAnti = db->IsItemAnti(ui.IndexInArchive);\n      \n      ui.CTimeDefined = db->CTime.GetItem(ui.IndexInArchive, ui.CTime);\n      ui.ATimeDefined = db->ATime.GetItem(ui.IndexInArchive, ui.ATime);\n      ui.MTimeDefined = db->MTime.GetItem(ui.IndexInArchive, ui.MTime);\n    }\n\n    if (ui.NewProperties)\n    {\n      bool nameIsDefined;\n      bool folderStatusIsDefined;\n      {\n        NCOM::CPropVariant prop;\n        RINOK(updateCallback->GetProperty(i, kpidAttrib, &prop));\n        if (prop.vt == VT_EMPTY)\n          ui.AttribDefined = false;\n        else if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        else\n        {\n          ui.Attrib = prop.ulVal;\n          ui.AttribDefined = true;\n        }\n      }\n      \n      // we need MTime to sort files.\n      RINOK(GetTime(updateCallback, i, WriteCTime, kpidCTime, ui.CTime, ui.CTimeDefined));\n      RINOK(GetTime(updateCallback, i, WriteATime, kpidATime, ui.ATime, ui.ATimeDefined));\n      RINOK(GetTime(updateCallback, i, true,       kpidMTime, ui.MTime, ui.MTimeDefined));\n\n      {\n        NCOM::CPropVariant prop;\n        RINOK(updateCallback->GetProperty(i, kpidPath, &prop));\n        if (prop.vt == VT_EMPTY)\n          nameIsDefined = false;\n        else if (prop.vt != VT_BSTR)\n          return E_INVALIDARG;\n        else\n        {\n          ui.Name = NItemName::MakeLegalName(prop.bstrVal);\n          nameIsDefined = true;\n        }\n      }\n      {\n        NCOM::CPropVariant prop;\n        RINOK(updateCallback->GetProperty(i, kpidIsDir, &prop));\n        if (prop.vt == VT_EMPTY)\n          folderStatusIsDefined = false;\n        else if (prop.vt != VT_BOOL)\n          return E_INVALIDARG;\n        else\n        {\n          ui.IsDir = (prop.boolVal != VARIANT_FALSE);\n          folderStatusIsDefined = true;\n        }\n      }\n\n      {\n        NCOM::CPropVariant prop;\n        RINOK(updateCallback->GetProperty(i, kpidIsAnti, &prop));\n        if (prop.vt == VT_EMPTY)\n          ui.IsAnti = false;\n        else if (prop.vt != VT_BOOL)\n          return E_INVALIDARG;\n        else\n          ui.IsAnti = (prop.boolVal != VARIANT_FALSE);\n      }\n\n      if (ui.IsAnti)\n      {\n        ui.AttribDefined = false;\n\n        ui.CTimeDefined = false;\n        ui.ATimeDefined = false;\n        ui.MTimeDefined = false;\n        \n        ui.Size = 0;\n      }\n\n      if (!folderStatusIsDefined && ui.AttribDefined)\n        ui.SetDirStatusFromAttrib();\n    }\n\n    if (ui.NewData)\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(i, kpidSize, &prop));\n      if (prop.vt != VT_UI8)\n        return E_INVALIDARG;\n      ui.Size = (UInt64)prop.uhVal.QuadPart;\n      if (ui.Size != 0 && ui.IsAnti)\n        return E_INVALIDARG;\n    }\n    updateItems.Add(ui);\n  }\n\n  CCompressionMethodMode methodMode, headerMethod;\n  RINOK(SetCompressionMethod(methodMode, headerMethod));\n  #ifdef COMPRESS_MT\n  methodMode.NumThreads = _numThreads;\n  headerMethod.NumThreads = 1;\n  #endif\n\n  RINOK(SetPassword(methodMode, updateCallback));\n\n  bool compressMainHeader = _compressHeaders;  // check it\n\n  bool encryptHeaders = false;\n\n  if (methodMode.PasswordIsDefined)\n  {\n    if (_encryptHeadersSpecified)\n      encryptHeaders = _encryptHeaders;\n    #ifndef _NO_CRYPTO\n    else\n      encryptHeaders = _passwordIsDefined;\n    #endif\n    compressMainHeader = true;\n    if(encryptHeaders)\n      RINOK(SetPassword(headerMethod, updateCallback));\n  }\n\n  if (numItems < 2)\n    compressMainHeader = false;\n\n  CUpdateOptions options;\n  options.Method = &methodMode;\n  options.HeaderMethod = (_compressHeaders || encryptHeaders) ? &headerMethod : 0;\n  options.UseFilters = _level != 0 && _autoFilter;\n  options.MaxFilter = _level >= 8;\n\n  options.HeaderOptions.CompressMainHeader = compressMainHeader;\n  options.HeaderOptions.WriteCTime = WriteCTime;\n  options.HeaderOptions.WriteATime = WriteATime;\n  options.HeaderOptions.WriteMTime = WriteMTime;\n  \n  options.NumSolidFiles = _numSolidFiles;\n  options.NumSolidBytes = _numSolidBytes;\n  options.SolidExtension = _solidExtension;\n  options.RemoveSfxBlock = _removeSfxBlock;\n  options.VolumeMode = _volumeMode;\n\n  COutArchive archive;\n  CArchiveDatabase newDatabase;\n  HRESULT res = Update(\n      EXTERNAL_CODECS_VARS\n      #ifdef _7Z_VOL\n      volume ? volume->Stream: 0,\n      volume ? db : 0,\n      #else\n      _inStream,\n      db,\n      #endif\n      updateItems,\n      archive, newDatabase, outStream, updateCallback, options);\n\n  RINOK(res);\n\n  updateItems.ClearAndFree();\n\n  return archive.WriteDatabase(EXTERNAL_CODECS_VARS\n      newDatabase, options.HeaderMethod, options.HeaderOptions);\n\n  COM_TRY_END\n}\n\nstatic HRESULT GetBindInfoPart(UString &srcString, UInt32 &coder, UInt32 &stream)\n{\n  stream = 0;\n  int index = ParseStringToUInt32(srcString, coder);\n  if (index == 0)\n    return E_INVALIDARG;\n  srcString.Delete(0, index);\n  if (srcString[0] == 'S')\n  {\n    srcString.Delete(0);\n    int index = ParseStringToUInt32(srcString, stream);\n    if (index == 0)\n      return E_INVALIDARG;\n    srcString.Delete(0, index);\n  }\n  return S_OK;\n}\n\nstatic HRESULT GetBindInfo(UString &srcString, CBind &bind)\n{\n  RINOK(GetBindInfoPart(srcString, bind.OutCoder, bind.OutStream));\n  if (srcString[0] != ':')\n    return E_INVALIDARG;\n  srcString.Delete(0);\n  RINOK(GetBindInfoPart(srcString, bind.InCoder, bind.InStream));\n  if (!srcString.IsEmpty())\n    return E_INVALIDARG;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)\n{\n  COM_TRY_BEGIN\n  _binds.Clear();\n  BeforeSetProperty();\n\n  for (int i = 0; i < numProperties; i++)\n  {\n    UString name = names[i];\n    name.MakeUpper();\n    if (name.IsEmpty())\n      return E_INVALIDARG;\n\n    const PROPVARIANT &value = values[i];\n\n    if (name[0] == 'B')\n    {\n      name.Delete(0);\n      CBind bind;\n      RINOK(GetBindInfo(name, bind));\n      _binds.Add(bind);\n      continue;\n    }\n\n    RINOK(SetProperty(name, value));\n  }\n\n  return S_OK;\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zHeader.cpp",
    "content": "// 7z/Header.cpp\n\n#include \"StdAfx.h\"\n#include \"7zHeader.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nByte kSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C};\n#ifdef _7Z_VOL\nByte kFinishSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C + 1};\n#endif\n\nclass SignatureInitializer\n{\npublic:\n  SignatureInitializer()\n  {\n    kSignature[0]--;\n    #ifdef _7Z_VOL\n    kFinishSignature[0]--;\n    #endif\n  };\n} g_SignatureInitializer;\n\n}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zHeader.h",
    "content": "// 7z/7zHeader.h\n\n#ifndef __7Z_HEADER_H\n#define __7Z_HEADER_H\n\n#include \"../../../Common/Types.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nconst int kSignatureSize = 6;\nextern Byte kSignature[kSignatureSize];\n\n// #define _7Z_VOL\n// 7z-MultiVolume is not finished yet.\n// It can work already, but I still do not like some\n// things of that new multivolume format.\n// So please keep it commented.\n\n#ifdef _7Z_VOL\nextern Byte kFinishSignature[kSignatureSize];\n#endif\n\nstruct CArchiveVersion\n{\n  Byte Major;\n  Byte Minor;\n};\n\nconst Byte kMajorVersion = 0;\n\nstruct CStartHeader\n{\n  UInt64 NextHeaderOffset;\n  UInt64 NextHeaderSize;\n  UInt32 NextHeaderCRC;\n};\n\nconst UInt32 kStartHeaderSize = 20;\n\n#ifdef _7Z_VOL\nstruct CFinishHeader: public CStartHeader\n{\n  UInt64 ArchiveStartOffset;  // data offset from end if that struct\n  UInt64 AdditionalStartBlockSize; // start  signature & start header size\n};\n\nconst UInt32 kFinishHeaderSize = kStartHeaderSize + 16;\n#endif\n\nnamespace NID\n{\n  enum EEnum\n  {\n    kEnd,\n\n    kHeader,\n\n    kArchiveProperties,\n    \n    kAdditionalStreamsInfo,\n    kMainStreamsInfo,\n    kFilesInfo,\n    \n    kPackInfo,\n    kUnpackInfo,\n    kSubStreamsInfo,\n\n    kSize,\n    kCRC,\n\n    kFolder,\n\n    kCodersUnpackSize,\n    kNumUnpackStream,\n\n    kEmptyStream,\n    kEmptyFile,\n    kAnti,\n\n    kName,\n    kCTime,\n    kATime,\n    kMTime,\n    kWinAttributes,\n    kComment,\n\n    kEncodedHeader,\n\n    kStartPos,\n    kDummy\n  };\n}\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zIn.cpp",
    "content": "// 7zIn.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/7zCrc.h\"\n  #include \"../../../../C/CpuArch.h\"\n}\n\n#include \"../../Common/StreamObjects.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"7zDecode.h\"\n#include \"7zIn.h\"\n\n#define Get16(p) GetUi16(p)\n#define Get32(p) GetUi32(p)\n#define Get64(p) GetUi64(p)\n\n// define FORMAT_7Z_RECOVERY if you want to recover multivolume archives with empty StartHeader\n#ifndef _SFX\n#define FORMAT_7Z_RECOVERY\n#endif\n\nnamespace NArchive {\nnamespace N7z {\n\nstatic void BoolVector_Fill_False(CBoolVector &v, int size)\n{\n  v.Clear();\n  v.Reserve(size);\n  for (int i = 0; i < size; i++)\n    v.Add(false);\n}\n\nstatic bool BoolVector_GetAndSet(CBoolVector &v, UInt32 index)\n{\n  if (index >= (UInt32)v.Size())\n    return true;\n  bool res = v[index];\n  v[index] = true;\n  return res;\n}\n\nbool CFolder::CheckStructure() const\n{\n  const int kNumCodersMax = sizeof(UInt32) * 8; // don't change it\n  const int kMaskSize = sizeof(UInt32) * 8; // it must be >= kNumCodersMax\n  const int kNumBindsMax = 32;\n\n  if (Coders.Size() > kNumCodersMax || BindPairs.Size() > kNumBindsMax)\n    return false;\n\n  {\n    CBoolVector v;\n    BoolVector_Fill_False(v, BindPairs.Size() + PackStreams.Size());\n    \n    int i;\n    for (i = 0; i < BindPairs.Size(); i++)\n      if (BoolVector_GetAndSet(v, BindPairs[i].InIndex))\n        return false;\n    for (i = 0; i < PackStreams.Size(); i++)\n      if (BoolVector_GetAndSet(v, PackStreams[i]))\n        return false;\n    \n    BoolVector_Fill_False(v, UnpackSizes.Size());\n    for (i = 0; i < BindPairs.Size(); i++)\n      if (BoolVector_GetAndSet(v, BindPairs[i].OutIndex))\n        return false;\n  }\n  \n  UInt32 mask[kMaskSize];\n  int i;\n  for (i = 0; i < kMaskSize; i++)\n    mask[i] = 0;\n\n  {\n    CIntVector inStreamToCoder, outStreamToCoder;\n    for (i = 0; i < Coders.Size(); i++)\n    {\n      CNum j;\n      const CCoderInfo &coder = Coders[i];\n      for (j = 0; j < coder.NumInStreams; j++)\n        inStreamToCoder.Add(i);\n      for (j = 0; j < coder.NumOutStreams; j++)\n        outStreamToCoder.Add(i);\n    }\n    \n    for (i = 0; i < BindPairs.Size(); i++)\n    {\n      const CBindPair &bp = BindPairs[i];\n      mask[inStreamToCoder[bp.InIndex]] |= (1 << outStreamToCoder[bp.OutIndex]);\n    }\n  }\n  \n  for (i = 0; i < kMaskSize; i++)\n    for (int j = 0; j < kMaskSize; j++)\n      if (((1 << j) & mask[i]) != 0)\n        mask[i] |= mask[j];\n\n  for (i = 0; i < kMaskSize; i++)\n    if (((1 << i) & mask[i]) != 0)\n      return false;\n\n  return true;\n}\n\nclass CInArchiveException {};\n\nstatic void ThrowException() {  }\nstatic inline void ThrowEndOfData()   { ThrowException(); }\nstatic inline void ThrowUnsupported() { ThrowException(); }\nstatic inline void ThrowIncorrect()   { ThrowException(); }\nstatic inline void ThrowUnsupportedVersion() { ThrowException(); }\n\n/*\nclass CInArchiveException\n{\npublic:\n  enum CCauseType\n  {\n    kUnsupportedVersion = 0,\n    kUnsupported,\n    kIncorrect,\n    kEndOfData,\n  } Cause;\n  CInArchiveException(CCauseType cause): Cause(cause) {};\n};\n\nstatic void ThrowException(CInArchiveException::CCauseType c) { throw CInArchiveException(c); }\nstatic void ThrowEndOfData()   { ThrowException(CInArchiveException::kEndOfData); }\nstatic void ThrowUnsupported() { ThrowException(CInArchiveException::kUnsupported); }\nstatic void ThrowIncorrect()   { ThrowException(CInArchiveException::kIncorrect); }\nstatic void ThrowUnsupportedVersion() { ThrowException(CInArchiveException::kUnsupportedVersion); }\n*/\n\nclass CStreamSwitch\n{\n  CInArchive *_archive;\n  bool _needRemove;\npublic:\n  CStreamSwitch(): _needRemove(false) {}\n  ~CStreamSwitch() { Remove(); }\n  void Remove();\n  void Set(CInArchive *archive, const Byte *data, size_t size);\n  void Set(CInArchive *archive, const CByteBuffer &byteBuffer);\n  void Set(CInArchive *archive, const CObjectVector<CByteBuffer> *dataVector);\n};\n\nvoid CStreamSwitch::Remove()\n{\n  if (_needRemove)\n  {\n    _archive->DeleteByteStream();\n    _needRemove = false;\n  }\n}\n\nvoid CStreamSwitch::Set(CInArchive *archive, const Byte *data, size_t size)\n{\n  Remove();\n  _archive = archive;\n  _archive->AddByteStream(data, size);\n  _needRemove = true;\n}\n\nvoid CStreamSwitch::Set(CInArchive *archive, const CByteBuffer &byteBuffer)\n{\n  Set(archive, byteBuffer, byteBuffer.GetCapacity());\n}\n\nvoid CStreamSwitch::Set(CInArchive *archive, const CObjectVector<CByteBuffer> *dataVector)\n{\n  Remove();\n  Byte external = archive->ReadByte();\n  if (external != 0)\n  {\n    int dataIndex = (int)archive->ReadNum();\n    if (dataIndex < 0 || dataIndex >= dataVector->Size())\n      ThrowIncorrect();\n    Set(archive, (*dataVector)[dataIndex]);\n  }\n}\n\nByte CInByte2::ReadByte()\n{\n  if (_pos >= _size)\n    ThrowEndOfData();\n  return _buffer[_pos++];\n}\n\nvoid CInByte2::ReadBytes(Byte *data, size_t size)\n{\n  if (size > _size - _pos)\n    ThrowEndOfData();\n  for (size_t i = 0; i < size; i++)\n    data[i] = _buffer[_pos++];\n}\n\nvoid CInByte2::SkeepData(UInt64 size)\n{\n  if (size > _size - _pos)\n    ThrowEndOfData();\n  _pos += (size_t)size;\n}\n\nvoid CInByte2::SkeepData()\n{\n  SkeepData(ReadNumber());\n}\n\nUInt64 CInByte2::ReadNumber()\n{\n  if (_pos >= _size)\n    ThrowEndOfData();\n  Byte firstByte = _buffer[_pos++];\n  Byte mask = 0x80;\n  UInt64 value = 0;\n  for (int i = 0; i < 8; i++)\n  {\n    if ((firstByte & mask) == 0)\n    {\n      UInt64 highPart = firstByte & (mask - 1);\n      value += (highPart << (i * 8));\n      return value;\n    }\n    if (_pos >= _size)\n      ThrowEndOfData();\n    value |= ((UInt64)_buffer[_pos++] << (8 * i));\n    mask >>= 1;\n  }\n  return value;\n}\n\nCNum CInByte2::ReadNum()\n{\n  UInt64 value = ReadNumber();\n  if (value > kNumMax)\n    ThrowUnsupported();\n  return (CNum)value;\n}\n\nUInt32 CInByte2::ReadUInt32()\n{\n  if (_pos + 4 > _size)\n    ThrowEndOfData();\n  UInt32 res = Get32(_buffer + _pos);\n  _pos += 4;\n  return res;\n}\n\nUInt64 CInByte2::ReadUInt64()\n{\n  if (_pos + 8 > _size)\n    ThrowEndOfData();\n  UInt64 res = Get64(_buffer + _pos);\n  _pos += 8;\n  return res;\n}\n\nvoid CInByte2::ReadString(UString &s)\n{\n  const Byte *buf = _buffer + _pos;\n  size_t rem = (_size - _pos) / 2 * 2;\n  {\n    size_t i;\n    for (i = 0; i < rem; i += 2)\n      if (buf[i] == 0 && buf[i + 1] == 0)\n        break;\n    if (i == rem)\n      ThrowEndOfData();\n    rem = i;\n  }\n  int len = (int)(rem / 2);\n  if (len < 0 || (size_t)len * 2 != rem)\n    ThrowUnsupported();\n  wchar_t *p = s.GetBuffer(len);\n  int i;\n  for (i = 0; i < len; i++, buf += 2)\n    p[i] = (wchar_t)Get16(buf);\n  s.ReleaseBuffer(len);\n  _pos += rem + 2;\n}\n\nstatic inline bool TestSignatureCandidate(const Byte *p)\n{\n  for (int i = 0; i < kSignatureSize; i++)\n    if (p[i] != kSignature[i])\n      return false;\n  return (p[0x1A] == 0 && p[0x1B] == 0);\n}\n\nHRESULT CInArchive::FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit)\n{\n  RINOK(ReadStream_FALSE(stream, _header, kHeaderSize));\n\n  if (TestSignatureCandidate(_header))\n    return S_OK;\n\n  CByteBuffer byteBuffer;\n  const UInt32 kBufferSize = (1 << 16);\n  byteBuffer.SetCapacity(kBufferSize);\n  Byte *buffer = byteBuffer;\n  UInt32 numPrevBytes = kHeaderSize - 1;\n  memcpy(buffer, _header + 1, numPrevBytes);\n  UInt64 curTestPos = _arhiveBeginStreamPosition + 1;\n  for (;;)\n  {\n    if (searchHeaderSizeLimit != NULL)\n      if (curTestPos - _arhiveBeginStreamPosition > *searchHeaderSizeLimit)\n        break;\n    do\n    {\n      UInt32 numReadBytes = kBufferSize - numPrevBytes;\n      UInt32 processedSize;\n      RINOK(stream->Read(buffer + numPrevBytes, numReadBytes, &processedSize));\n      numPrevBytes += processedSize;\n      if (processedSize == 0)\n        return S_FALSE;\n    }\n    while (numPrevBytes < kHeaderSize);\n    UInt32 numTests = numPrevBytes - kHeaderSize + 1;\n    for (UInt32 pos = 0; pos < numTests; pos++)\n    {\n      for (; buffer[pos] != '7' && pos < numTests; pos++);\n      if (pos == numTests)\n        break;\n      if (TestSignatureCandidate(buffer + pos))\n      {\n        memcpy(_header, buffer + pos, kHeaderSize);\n        curTestPos += pos;\n        _arhiveBeginStreamPosition = curTestPos;\n        return stream->Seek(curTestPos + kHeaderSize, STREAM_SEEK_SET, NULL);\n      }\n    }\n    curTestPos += numTests;\n    numPrevBytes -= numTests;\n    memmove(buffer, buffer + numTests, numPrevBytes);\n  }\n  return S_FALSE;\n}\n\n// S_FALSE means that file is not archive\nHRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit)\n{\n  HeadersSize = 0;\n  Close();\n  RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_arhiveBeginStreamPosition))\n  RINOK(FindAndReadSignature(stream, searchHeaderSizeLimit));\n  _stream = stream;\n  return S_OK;\n}\n  \nvoid CInArchive::Close()\n{\n  _stream.Release();\n}\n\nvoid CInArchive::ReadArchiveProperties(CInArchiveInfo & /* archiveInfo */)\n{\n  for (;;)\n  {\n    if (ReadID() == NID::kEnd)\n      break;\n    SkeepData();\n  }\n}\n\nvoid CInArchive::GetNextFolderItem(CFolder &folder)\n{\n  CNum numCoders = ReadNum();\n\n  folder.Coders.Clear();\n  folder.Coders.Reserve((int)numCoders);\n  CNum numInStreams = 0;\n  CNum numOutStreams = 0;\n  CNum i;\n  for (i = 0; i < numCoders; i++)\n  {\n    folder.Coders.Add(CCoderInfo());\n    CCoderInfo &coder = folder.Coders.Back();\n\n    {\n      Byte mainByte = ReadByte();\n      int idSize = (mainByte & 0xF);\n      Byte longID[15];\n      ReadBytes(longID, idSize);\n      if (idSize > 8)\n        ThrowUnsupported();\n      UInt64 id = 0;\n      for (int j = 0; j < idSize; j++)\n        id |= (UInt64)longID[idSize - 1 - j] << (8 * j);\n      coder.MethodID = id;\n\n      if ((mainByte & 0x10) != 0)\n      {\n        coder.NumInStreams = ReadNum();\n        coder.NumOutStreams = ReadNum();\n      }\n      else\n      {\n        coder.NumInStreams = 1;\n        coder.NumOutStreams = 1;\n      }\n      if ((mainByte & 0x20) != 0)\n      {\n        CNum propsSize = ReadNum();\n        coder.Props.SetCapacity((size_t)propsSize);\n        ReadBytes((Byte *)coder.Props, (size_t)propsSize);\n      }\n      if ((mainByte & 0x80) != 0)\n        ThrowUnsupported();\n    }\n    numInStreams += coder.NumInStreams;\n    numOutStreams += coder.NumOutStreams;\n  }\n\n  CNum numBindPairs = numOutStreams - 1;\n  folder.BindPairs.Clear();\n  folder.BindPairs.Reserve(numBindPairs);\n  for (i = 0; i < numBindPairs; i++)\n  {\n    CBindPair bp;\n    bp.InIndex = ReadNum();\n    bp.OutIndex = ReadNum();\n    folder.BindPairs.Add(bp);\n  }\n\n  if (numInStreams < numBindPairs)\n    ThrowUnsupported();\n  CNum numPackStreams = numInStreams - numBindPairs;\n  folder.PackStreams.Reserve(numPackStreams);\n  if (numPackStreams == 1)\n  {\n    for (i = 0; i < numInStreams; i++)\n      if (folder.FindBindPairForInStream(i) < 0)\n      {\n        folder.PackStreams.Add(i);\n        break;\n      }\n    if (folder.PackStreams.Size() != 1)\n      ThrowUnsupported();\n  }\n  else\n    for (i = 0; i < numPackStreams; i++)\n      folder.PackStreams.Add(ReadNum());\n}\n\nvoid CInArchive::WaitAttribute(UInt64 attribute)\n{\n  for (;;)\n  {\n    UInt64 type = ReadID();\n    if (type == attribute)\n      return;\n    if (type == NID::kEnd)\n      ThrowIncorrect();\n    SkeepData();\n  }\n}\n\nvoid CInArchive::ReadHashDigests(int numItems,\n    CBoolVector &digestsDefined,\n    CRecordVector<UInt32> &digests)\n{\n  ReadBoolVector2(numItems, digestsDefined);\n  digests.Clear();\n  digests.Reserve(numItems);\n  for (int i = 0; i < numItems; i++)\n  {\n    UInt32 crc = 0;\n    if (digestsDefined[i])\n      crc = ReadUInt32();\n    digests.Add(crc);\n  }\n}\n\nvoid CInArchive::ReadPackInfo(\n    UInt64 &dataOffset,\n    CRecordVector<UInt64> &packSizes,\n    CBoolVector &packCRCsDefined,\n    CRecordVector<UInt32> &packCRCs)\n{\n  dataOffset = ReadNumber();\n  CNum numPackStreams = ReadNum();\n\n  WaitAttribute(NID::kSize);\n  packSizes.Clear();\n  packSizes.Reserve(numPackStreams);\n  for (CNum i = 0; i < numPackStreams; i++)\n    packSizes.Add(ReadNumber());\n\n  UInt64 type;\n  for (;;)\n  {\n    type = ReadID();\n    if (type == NID::kEnd)\n      break;\n    if (type == NID::kCRC)\n    {\n      ReadHashDigests(numPackStreams, packCRCsDefined, packCRCs);\n      continue;\n    }\n    SkeepData();\n  }\n  if (packCRCsDefined.IsEmpty())\n  {\n    BoolVector_Fill_False(packCRCsDefined, numPackStreams);\n    packCRCs.Reserve(numPackStreams);\n    packCRCs.Clear();\n    for (CNum i = 0; i < numPackStreams; i++)\n      packCRCs.Add(0);\n  }\n}\n\nvoid CInArchive::ReadUnpackInfo(\n    const CObjectVector<CByteBuffer> *dataVector,\n    CObjectVector<CFolder> &folders)\n{\n  WaitAttribute(NID::kFolder);\n  CNum numFolders = ReadNum();\n\n  {\n    CStreamSwitch streamSwitch;\n    streamSwitch.Set(this, dataVector);\n    folders.Clear();\n    folders.Reserve(numFolders);\n    for (CNum i = 0; i < numFolders; i++)\n    {\n      folders.Add(CFolder());\n      GetNextFolderItem(folders.Back());\n    }\n  }\n\n  WaitAttribute(NID::kCodersUnpackSize);\n\n  CNum i;\n  for (i = 0; i < numFolders; i++)\n  {\n    CFolder &folder = folders[i];\n    CNum numOutStreams = folder.GetNumOutStreams();\n    folder.UnpackSizes.Reserve(numOutStreams);\n    for (CNum j = 0; j < numOutStreams; j++)\n      folder.UnpackSizes.Add(ReadNumber());\n  }\n\n  for (;;)\n  {\n    UInt64 type = ReadID();\n    if (type == NID::kEnd)\n      return;\n    if (type == NID::kCRC)\n    {\n      CBoolVector crcsDefined;\n      CRecordVector<UInt32> crcs;\n      ReadHashDigests(numFolders, crcsDefined, crcs);\n      for (i = 0; i < numFolders; i++)\n      {\n        CFolder &folder = folders[i];\n        folder.UnpackCRCDefined = crcsDefined[i];\n        folder.UnpackCRC = crcs[i];\n      }\n      continue;\n    }\n    SkeepData();\n  }\n}\n\nvoid CInArchive::ReadSubStreamsInfo(\n    const CObjectVector<CFolder> &folders,\n    CRecordVector<CNum> &numUnpackStreamsInFolders,\n    CRecordVector<UInt64> &unpackSizes,\n    CBoolVector &digestsDefined,\n    CRecordVector<UInt32> &digests)\n{\n  numUnpackStreamsInFolders.Clear();\n  numUnpackStreamsInFolders.Reserve(folders.Size());\n  UInt64 type;\n  for (;;)\n  {\n    type = ReadID();\n    if (type == NID::kNumUnpackStream)\n    {\n      for (int i = 0; i < folders.Size(); i++)\n        numUnpackStreamsInFolders.Add(ReadNum());\n      continue;\n    }\n    if (type == NID::kCRC || type == NID::kSize)\n      break;\n    if (type == NID::kEnd)\n      break;\n    SkeepData();\n  }\n\n  if (numUnpackStreamsInFolders.IsEmpty())\n    for (int i = 0; i < folders.Size(); i++)\n      numUnpackStreamsInFolders.Add(1);\n\n  int i;\n  for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)\n  {\n    // v3.13 incorrectly worked with empty folders\n    // v4.07: we check that folder is empty\n    CNum numSubstreams = numUnpackStreamsInFolders[i];\n    if (numSubstreams == 0)\n      continue;\n    UInt64 sum = 0;\n    for (CNum j = 1; j < numSubstreams; j++)\n      if (type == NID::kSize)\n      {\n        UInt64 size = ReadNumber();\n        unpackSizes.Add(size);\n        sum += size;\n      }\n    unpackSizes.Add(folders[i].GetUnpackSize() - sum);\n  }\n  if (type == NID::kSize)\n    type = ReadID();\n\n  int numDigests = 0;\n  int numDigestsTotal = 0;\n  for (i = 0; i < folders.Size(); i++)\n  {\n    CNum numSubstreams = numUnpackStreamsInFolders[i];\n    if (numSubstreams != 1 || !folders[i].UnpackCRCDefined)\n      numDigests += numSubstreams;\n    numDigestsTotal += numSubstreams;\n  }\n\n  for (;;)\n  {\n    if (type == NID::kCRC)\n    {\n      CBoolVector digestsDefined2;\n      CRecordVector<UInt32> digests2;\n      ReadHashDigests(numDigests, digestsDefined2, digests2);\n      int digestIndex = 0;\n      for (i = 0; i < folders.Size(); i++)\n      {\n        CNum numSubstreams = numUnpackStreamsInFolders[i];\n        const CFolder &folder = folders[i];\n        if (numSubstreams == 1 && folder.UnpackCRCDefined)\n        {\n          digestsDefined.Add(true);\n          digests.Add(folder.UnpackCRC);\n        }\n        else\n          for (CNum j = 0; j < numSubstreams; j++, digestIndex++)\n          {\n            digestsDefined.Add(digestsDefined2[digestIndex]);\n            digests.Add(digests2[digestIndex]);\n          }\n      }\n    }\n    else if (type == NID::kEnd)\n    {\n      if (digestsDefined.IsEmpty())\n      {\n        BoolVector_Fill_False(digestsDefined, numDigestsTotal);\n        digests.Clear();\n        for (int i = 0; i < numDigestsTotal; i++)\n          digests.Add(0);\n      }\n      return;\n    }\n    else\n      SkeepData();\n    type = ReadID();\n  }\n}\n\nvoid CInArchive::ReadStreamsInfo(\n    const CObjectVector<CByteBuffer> *dataVector,\n    UInt64 &dataOffset,\n    CRecordVector<UInt64> &packSizes,\n    CBoolVector &packCRCsDefined,\n    CRecordVector<UInt32> &packCRCs,\n    CObjectVector<CFolder> &folders,\n    CRecordVector<CNum> &numUnpackStreamsInFolders,\n    CRecordVector<UInt64> &unpackSizes,\n    CBoolVector &digestsDefined,\n    CRecordVector<UInt32> &digests)\n{\n  for (;;)\n  {\n    UInt64 type = ReadID();\n    if (type > ((UInt32)1 << 30))\n      ThrowIncorrect();\n    switch((UInt32)type)\n    {\n      case NID::kEnd:\n        return;\n      case NID::kPackInfo:\n      {\n        ReadPackInfo(dataOffset, packSizes, packCRCsDefined, packCRCs);\n        break;\n      }\n      case NID::kUnpackInfo:\n      {\n        ReadUnpackInfo(dataVector, folders);\n        break;\n      }\n      case NID::kSubStreamsInfo:\n      {\n        ReadSubStreamsInfo(folders, numUnpackStreamsInFolders,\n            unpackSizes, digestsDefined, digests);\n        break;\n      }\n      default:\n        ThrowIncorrect();\n    }\n  }\n}\n\nvoid CInArchive::ReadBoolVector(int numItems, CBoolVector &v)\n{\n  v.Clear();\n  v.Reserve(numItems);\n  Byte b = 0;\n  Byte mask = 0;\n  for (int i = 0; i < numItems; i++)\n  {\n    if (mask == 0)\n    {\n      b = ReadByte();\n      mask = 0x80;\n    }\n    v.Add((b & mask) != 0);\n    mask >>= 1;\n  }\n}\n\nvoid CInArchive::ReadBoolVector2(int numItems, CBoolVector &v)\n{\n  Byte allAreDefined = ReadByte();\n  if (allAreDefined == 0)\n  {\n    ReadBoolVector(numItems, v);\n    return;\n  }\n  v.Clear();\n  v.Reserve(numItems);\n  for (int i = 0; i < numItems; i++)\n    v.Add(true);\n}\n\nvoid CInArchive::ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector,\n    CUInt64DefVector &v, int numFiles)\n{\n  ReadBoolVector2(numFiles, v.Defined);\n\n  CStreamSwitch streamSwitch;\n  streamSwitch.Set(this, &dataVector);\n  v.Values.Reserve(numFiles);\n\n  for (int i = 0; i < numFiles; i++)\n  {\n    UInt64 t = 0;\n    if (v.Defined[i])\n      t = ReadUInt64();\n    v.Values.Add(t);\n  }\n}\n\nHRESULT CInArchive::ReadAndDecodePackedStreams(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    UInt64 baseOffset,\n    UInt64 &dataOffset, CObjectVector<CByteBuffer> &dataVector\n    #ifndef _NO_CRYPTO\n    , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n    #endif\n    )\n{\n  CRecordVector<UInt64> packSizes;\n  CBoolVector packCRCsDefined;\n  CRecordVector<UInt32> packCRCs;\n  CObjectVector<CFolder> folders;\n  \n  CRecordVector<CNum> numUnpackStreamsInFolders;\n  CRecordVector<UInt64> unpackSizes;\n  CBoolVector digestsDefined;\n  CRecordVector<UInt32> digests;\n  \n  ReadStreamsInfo(NULL,\n    dataOffset,\n    packSizes,\n    packCRCsDefined,\n    packCRCs,\n    folders,\n    numUnpackStreamsInFolders,\n    unpackSizes,\n    digestsDefined,\n    digests);\n  \n  // db.ArchiveInfo.DataStartPosition2 += db.ArchiveInfo.StartPositionAfterHeader;\n  \n  CNum packIndex = 0;\n  CDecoder decoder(\n    #ifdef _ST_MODE\n    false\n    #else\n    true\n    #endif\n    );\n  UInt64 dataStartPos = baseOffset + dataOffset;\n  for (int i = 0; i < folders.Size(); i++)\n  {\n    const CFolder &folder = folders[i];\n    dataVector.Add(CByteBuffer());\n    CByteBuffer &data = dataVector.Back();\n    UInt64 unpackSize64 = folder.GetUnpackSize();\n    size_t unpackSize = (size_t)unpackSize64;\n    if (unpackSize != unpackSize64)\n      ThrowUnsupported();\n    data.SetCapacity(unpackSize);\n    \n    CSequentialOutStreamImp2 *outStreamSpec = new CSequentialOutStreamImp2;\n    CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;\n    outStreamSpec->Init(data, unpackSize);\n    \n    HRESULT result = decoder.Decode(\n      EXTERNAL_CODECS_LOC_VARS\n      _stream, dataStartPos,\n      &packSizes[packIndex], folder, outStream, NULL\n      #ifndef _NO_CRYPTO\n      , getTextPassword, passwordIsDefined\n      #endif\n      #ifdef COMPRESS_MT\n      , false, 1\n      #endif\n      );\n    RINOK(result);\n    \n    if (folder.UnpackCRCDefined)\n      if (CrcCalc(data, unpackSize) != folder.UnpackCRC)\n        ThrowIncorrect();\n    for (int j = 0; j < folder.PackStreams.Size(); j++)\n    {\n      UInt64 packSize = packSizes[packIndex++];\n      dataStartPos += packSize;\n      HeadersSize += packSize;\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadHeader(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    CArchiveDatabaseEx &db\n    #ifndef _NO_CRYPTO\n    , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n    #endif\n    )\n{\n  UInt64 type = ReadID();\n\n  if (type == NID::kArchiveProperties)\n  {\n    ReadArchiveProperties(db.ArchiveInfo);\n    type = ReadID();\n  }\n \n  CObjectVector<CByteBuffer> dataVector;\n  \n  if (type == NID::kAdditionalStreamsInfo)\n  {\n    HRESULT result = ReadAndDecodePackedStreams(\n        EXTERNAL_CODECS_LOC_VARS\n        db.ArchiveInfo.StartPositionAfterHeader,\n        db.ArchiveInfo.DataStartPosition2,\n        dataVector\n        #ifndef _NO_CRYPTO\n        , getTextPassword, passwordIsDefined\n        #endif\n        );\n    RINOK(result);\n    db.ArchiveInfo.DataStartPosition2 += db.ArchiveInfo.StartPositionAfterHeader;\n    type = ReadID();\n  }\n\n  CRecordVector<UInt64> unpackSizes;\n  CBoolVector digestsDefined;\n  CRecordVector<UInt32> digests;\n  \n  if (type == NID::kMainStreamsInfo)\n  {\n    ReadStreamsInfo(&dataVector,\n        db.ArchiveInfo.DataStartPosition,\n        db.PackSizes,\n        db.PackCRCsDefined,\n        db.PackCRCs,\n        db.Folders,\n        db.NumUnpackStreamsVector,\n        unpackSizes,\n        digestsDefined,\n        digests);\n    db.ArchiveInfo.DataStartPosition += db.ArchiveInfo.StartPositionAfterHeader;\n    type = ReadID();\n  }\n  else\n  {\n    for (int i = 0; i < db.Folders.Size(); i++)\n    {\n      db.NumUnpackStreamsVector.Add(1);\n      CFolder &folder = db.Folders[i];\n      unpackSizes.Add(folder.GetUnpackSize());\n      digestsDefined.Add(folder.UnpackCRCDefined);\n      digests.Add(folder.UnpackCRC);\n    }\n  }\n\n  db.Files.Clear();\n\n  if (type == NID::kEnd)\n    return S_OK;\n  if (type != NID::kFilesInfo)\n    ThrowIncorrect();\n  \n  CNum numFiles = ReadNum();\n  db.Files.Reserve(numFiles);\n  CNum i;\n  for (i = 0; i < numFiles; i++)\n    db.Files.Add(CFileItem());\n\n  db.ArchiveInfo.FileInfoPopIDs.Add(NID::kSize);\n  if (!db.PackSizes.IsEmpty())\n    db.ArchiveInfo.FileInfoPopIDs.Add(NID::kPackInfo);\n  if (numFiles > 0  && !digests.IsEmpty())\n    db.ArchiveInfo.FileInfoPopIDs.Add(NID::kCRC);\n\n  CBoolVector emptyStreamVector;\n  BoolVector_Fill_False(emptyStreamVector, (int)numFiles);\n  CBoolVector emptyFileVector;\n  CBoolVector antiFileVector;\n  CNum numEmptyStreams = 0;\n\n  for (;;)\n  {\n    UInt64 type = ReadID();\n    if (type == NID::kEnd)\n      break;\n    UInt64 size = ReadNumber();\n    size_t ppp = _inByteBack->_pos;\n    bool addPropIdToList = true;\n    bool isKnownType = true;\n    if (type > ((UInt32)1 << 30))\n      isKnownType = false;\n    else switch((UInt32)type)\n    {\n      case NID::kName:\n      {\n        CStreamSwitch streamSwitch;\n        streamSwitch.Set(this, &dataVector);\n        for (int i = 0; i < db.Files.Size(); i++)\n          _inByteBack->ReadString(db.Files[i].Name);\n        break;\n      }\n      case NID::kWinAttributes:\n      {\n        CBoolVector boolVector;\n        ReadBoolVector2(db.Files.Size(), boolVector);\n        CStreamSwitch streamSwitch;\n        streamSwitch.Set(this, &dataVector);\n        for (i = 0; i < numFiles; i++)\n        {\n          CFileItem &file = db.Files[i];\n          file.AttribDefined = boolVector[i];\n          if (file.AttribDefined)\n            file.Attrib = ReadUInt32();\n        }\n        break;\n      }\n      case NID::kEmptyStream:\n      {\n        ReadBoolVector(numFiles, emptyStreamVector);\n        for (i = 0; i < (CNum)emptyStreamVector.Size(); i++)\n          if (emptyStreamVector[i])\n            numEmptyStreams++;\n\n        BoolVector_Fill_False(emptyFileVector, numEmptyStreams);\n        BoolVector_Fill_False(antiFileVector, numEmptyStreams);\n\n        break;\n      }\n      case NID::kEmptyFile:  ReadBoolVector(numEmptyStreams, emptyFileVector); break;\n      case NID::kAnti:  ReadBoolVector(numEmptyStreams, antiFileVector); break;\n      case NID::kStartPos:  ReadUInt64DefVector(dataVector, db.StartPos, (int)numFiles); break;\n      case NID::kCTime:  ReadUInt64DefVector(dataVector, db.CTime, (int)numFiles); break;\n      case NID::kATime:  ReadUInt64DefVector(dataVector, db.ATime, (int)numFiles); break;\n      case NID::kMTime:  ReadUInt64DefVector(dataVector, db.MTime, (int)numFiles); break;\n      case NID::kDummy:\n      {\n        for (UInt64 j = 0; j < size; j++)\n          if (ReadByte() != 0)\n            ThrowIncorrect();\n        addPropIdToList = false;\n        break;\n      }\n      default:\n        addPropIdToList = isKnownType = false;\n    }\n    if (isKnownType)\n    {\n      if(addPropIdToList)\n        db.ArchiveInfo.FileInfoPopIDs.Add(type);\n    }\n    else\n      SkeepData(size);\n    bool checkRecordsSize = (db.ArchiveInfo.Version.Major > 0 ||\n        db.ArchiveInfo.Version.Minor > 2);\n    if (checkRecordsSize && _inByteBack->_pos - ppp != size)\n      ThrowIncorrect();\n  }\n\n  CNum emptyFileIndex = 0;\n  CNum sizeIndex = 0;\n\n  CNum numAntiItems = 0;\n  for (i = 0; i < numEmptyStreams; i++)\n    if (antiFileVector[i])\n      numAntiItems++;\n    \n  for (i = 0; i < numFiles; i++)\n  {\n    CFileItem &file = db.Files[i];\n    bool isAnti;\n    file.HasStream = !emptyStreamVector[i];\n    if (file.HasStream)\n    {\n      file.IsDir = false;\n      isAnti = false;\n      file.Size = unpackSizes[sizeIndex];\n      file.Crc = digests[sizeIndex];\n      file.CrcDefined = digestsDefined[sizeIndex];\n      sizeIndex++;\n    }\n    else\n    {\n      file.IsDir = !emptyFileVector[emptyFileIndex];\n      isAnti = antiFileVector[emptyFileIndex];\n      emptyFileIndex++;\n      file.Size = 0;\n      file.CrcDefined = false;\n    }\n    if (numAntiItems != 0)\n      db.IsAnti.Add(isAnti);\n  }\n  return S_OK;\n}\n\n\nvoid CArchiveDatabaseEx::FillFolderStartPackStream()\n{\n  FolderStartPackStreamIndex.Clear();\n  FolderStartPackStreamIndex.Reserve(Folders.Size());\n  CNum startPos = 0;\n  for (int i = 0; i < Folders.Size(); i++)\n  {\n    FolderStartPackStreamIndex.Add(startPos);\n    startPos += (CNum)Folders[i].PackStreams.Size();\n  }\n}\n\nvoid CArchiveDatabaseEx::FillStartPos()\n{\n  PackStreamStartPositions.Clear();\n  PackStreamStartPositions.Reserve(PackSizes.Size());\n  UInt64 startPos = 0;\n  for (int i = 0; i < PackSizes.Size(); i++)\n  {\n    PackStreamStartPositions.Add(startPos);\n    startPos += PackSizes[i];\n  }\n}\n\nvoid CArchiveDatabaseEx::FillFolderStartFileIndex()\n{\n  FolderStartFileIndex.Clear();\n  FolderStartFileIndex.Reserve(Folders.Size());\n  FileIndexToFolderIndexMap.Clear();\n  FileIndexToFolderIndexMap.Reserve(Files.Size());\n  \n  int folderIndex = 0;\n  CNum indexInFolder = 0;\n  for (int i = 0; i < Files.Size(); i++)\n  {\n    const CFileItem &file = Files[i];\n    bool emptyStream = !file.HasStream;\n    if (emptyStream && indexInFolder == 0)\n    {\n      FileIndexToFolderIndexMap.Add(kNumNoIndex);\n      continue;\n    }\n    if (indexInFolder == 0)\n    {\n      // v3.13 incorrectly worked with empty folders\n      // v4.07: Loop for skipping empty folders\n      for (;;)\n      {\n        if (folderIndex >= Folders.Size())\n          ThrowIncorrect();\n        FolderStartFileIndex.Add(i); // check it\n        if (NumUnpackStreamsVector[folderIndex] != 0)\n          break;\n        folderIndex++;\n      }\n    }\n    FileIndexToFolderIndexMap.Add(folderIndex);\n    if (emptyStream)\n      continue;\n    indexInFolder++;\n    if (indexInFolder >= NumUnpackStreamsVector[folderIndex])\n    {\n      folderIndex++;\n      indexInFolder = 0;\n    }\n  }\n}\n\nHRESULT CInArchive::ReadDatabase2(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    CArchiveDatabaseEx &db\n    #ifndef _NO_CRYPTO\n    , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n    #endif\n    )\n{\n  db.Clear();\n  db.ArchiveInfo.StartPosition = _arhiveBeginStreamPosition;\n\n  db.ArchiveInfo.Version.Major = _header[6];\n  db.ArchiveInfo.Version.Minor = _header[7];\n\n  if (db.ArchiveInfo.Version.Major != kMajorVersion)\n    ThrowUnsupportedVersion();\n\n  UInt32 crcFromArchive = Get32(_header + 8);\n  UInt64 nextHeaderOffset = Get64(_header + 0xC);\n  UInt64 nextHeaderSize = Get64(_header + 0x14);\n  UInt32 nextHeaderCRC = Get32(_header + 0x1C);\n  UInt32 crc = CrcCalc(_header + 0xC, 20);\n\n  #ifdef FORMAT_7Z_RECOVERY\n  if (crcFromArchive == 0 && nextHeaderOffset == 0 && nextHeaderSize == 0 && nextHeaderCRC == 0)\n  {\n    UInt64 cur, cur2;\n    RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &cur));\n    const int kCheckSize = 500;\n    Byte buf[kCheckSize];\n    RINOK(_stream->Seek(0, STREAM_SEEK_END, &cur2));\n    int checkSize = kCheckSize;\n    if (cur2 - cur < kCheckSize)\n      checkSize = (int)(cur2 - cur);\n    RINOK(_stream->Seek(-checkSize, STREAM_SEEK_END, &cur2));\n    \n    RINOK(ReadStream_FALSE(_stream, buf, (size_t)checkSize));\n\n    int i;\n    for (i = (int)checkSize - 2; i >= 0; i--)\n      if (buf[i] == 0x17 && buf[i + 1] == 0x6 || buf[i] == 0x01 && buf[i + 1] == 0x04)\n        break;\n    if (i < 0)\n      return S_FALSE;\n    nextHeaderSize = checkSize - i;\n    nextHeaderOffset = cur2 - cur + i;\n    nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize);\n    RINOK(_stream->Seek(cur, STREAM_SEEK_SET, NULL));\n  }\n  #endif\n\n  #ifdef FORMAT_7Z_RECOVERY\n  crcFromArchive = crc;\n  #endif\n\n  db.ArchiveInfo.StartPositionAfterHeader = _arhiveBeginStreamPosition + kHeaderSize;\n\n  if (crc != crcFromArchive)\n    ThrowIncorrect();\n\n  if (nextHeaderSize == 0)\n    return S_OK;\n\n  if (nextHeaderSize > (UInt64)0xFFFFFFFF)\n    return S_FALSE;\n\n  RINOK(_stream->Seek(nextHeaderOffset, STREAM_SEEK_CUR, NULL));\n\n  CByteBuffer buffer2;\n  buffer2.SetCapacity((size_t)nextHeaderSize);\n\n  RINOK(ReadStream_FALSE(_stream, buffer2, (size_t)nextHeaderSize));\n  HeadersSize += kHeaderSize + nextHeaderSize;\n  db.PhySize = kHeaderSize + nextHeaderOffset + nextHeaderSize;\n\n  if (CrcCalc(buffer2, (UInt32)nextHeaderSize) != nextHeaderCRC)\n    ThrowIncorrect();\n  \n  CStreamSwitch streamSwitch;\n  streamSwitch.Set(this, buffer2);\n  \n  CObjectVector<CByteBuffer> dataVector;\n  \n  UInt64 type = ReadID();\n  if (type != NID::kHeader)\n  {\n    if (type != NID::kEncodedHeader)\n      ThrowIncorrect();\n    HRESULT result = ReadAndDecodePackedStreams(\n        EXTERNAL_CODECS_LOC_VARS\n        db.ArchiveInfo.StartPositionAfterHeader,\n        db.ArchiveInfo.DataStartPosition2,\n        dataVector\n        #ifndef _NO_CRYPTO\n        , getTextPassword, passwordIsDefined\n        #endif\n        );\n    RINOK(result);\n    if (dataVector.Size() == 0)\n      return S_OK;\n    if (dataVector.Size() > 1)\n      ThrowIncorrect();\n    streamSwitch.Remove();\n    streamSwitch.Set(this, dataVector.Front());\n    if (ReadID() != NID::kHeader)\n      ThrowIncorrect();\n  }\n\n  db.HeadersSize = HeadersSize;\n\n  return ReadHeader(\n    EXTERNAL_CODECS_LOC_VARS\n    db\n    #ifndef _NO_CRYPTO\n    , getTextPassword, passwordIsDefined\n    #endif\n    );\n}\n\nHRESULT CInArchive::ReadDatabase(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    CArchiveDatabaseEx &db\n    #ifndef _NO_CRYPTO\n    , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n    #endif\n    )\n{\n\n    return ReadDatabase2(\n      EXTERNAL_CODECS_LOC_VARS db\n      #ifndef _NO_CRYPTO\n      , getTextPassword, passwordIsDefined\n      #endif\n      );\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zIn.h",
    "content": "// 7zIn.h\n\n#ifndef __7Z_IN_H\n#define __7Z_IN_H\n\n#include \"../../../Common/MyCom.h\"\n\n#include \"../../IPassword.h\"\n#include \"../../IStream.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/InBuffer.h\"\n\n#include \"7zItem.h\"\n \nnamespace NArchive {\nnamespace N7z {\n  \nstruct CInArchiveInfo\n{\n  CArchiveVersion Version;\n  UInt64 StartPosition;\n  UInt64 StartPositionAfterHeader;\n  UInt64 DataStartPosition;\n  UInt64 DataStartPosition2;\n  CRecordVector<UInt64> FileInfoPopIDs;\n  void Clear()\n  {\n    FileInfoPopIDs.Clear();\n  }\n};\n\nstruct CArchiveDatabaseEx: public CArchiveDatabase\n{\n  CInArchiveInfo ArchiveInfo;\n  CRecordVector<UInt64> PackStreamStartPositions;\n  CRecordVector<CNum> FolderStartPackStreamIndex;\n  CRecordVector<CNum> FolderStartFileIndex;\n  CRecordVector<CNum> FileIndexToFolderIndexMap;\n\n  UInt64 HeadersSize;\n  UInt64 PhySize;\n\n  void Clear()\n  {\n    CArchiveDatabase::Clear();\n    ArchiveInfo.Clear();\n    PackStreamStartPositions.Clear();\n    FolderStartPackStreamIndex.Clear();\n    FolderStartFileIndex.Clear();\n    FileIndexToFolderIndexMap.Clear();\n\n    HeadersSize = 0;\n    PhySize = 0;\n  }\n\n  void FillFolderStartPackStream();\n  void FillStartPos();\n  void FillFolderStartFileIndex();\n\n  void Fill()\n  {\n    FillFolderStartPackStream();\n    FillStartPos();\n    FillFolderStartFileIndex();\n  }\n  \n  UInt64 GetFolderStreamPos(int folderIndex, int indexInFolder) const\n  {\n    return ArchiveInfo.DataStartPosition +\n        PackStreamStartPositions[FolderStartPackStreamIndex[folderIndex] + indexInFolder];\n  }\n  \n  UInt64 GetFolderFullPackSize(int folderIndex) const\n  {\n    CNum packStreamIndex = FolderStartPackStreamIndex[folderIndex];\n    const CFolder &folder = Folders[folderIndex];\n    UInt64 size = 0;\n    for (int i = 0; i < folder.PackStreams.Size(); i++)\n      size += PackSizes[packStreamIndex + i];\n    return size;\n  }\n  \n  UInt64 GetFolderPackStreamSize(int folderIndex, int streamIndex) const\n  {\n    return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex];\n  }\n\n  UInt64 GetFilePackSize(CNum fileIndex) const\n  {\n    CNum folderIndex = FileIndexToFolderIndexMap[fileIndex];\n    if (folderIndex != kNumNoIndex)\n      if (FolderStartFileIndex[folderIndex] == fileIndex)\n        return GetFolderFullPackSize(folderIndex);\n    return 0;\n  }\n};\n\nclass CInByte2\n{\n  const Byte *_buffer;\n  size_t _size;\npublic:\n  size_t _pos;\n  void Init(const Byte *buffer, size_t size)\n  {\n    _buffer = buffer;\n    _size = size;\n    _pos = 0;\n  }\n  Byte ReadByte();\n  void ReadBytes(Byte *data, size_t size);\n  void SkeepData(UInt64 size);\n  void SkeepData();\n  UInt64 ReadNumber();\n  CNum ReadNum();\n  UInt32 ReadUInt32();\n  UInt64 ReadUInt64();\n  void ReadString(UString &s);\n};\n\nclass CStreamSwitch;\n\nconst UInt32 kHeaderSize = 32;\n\nclass CInArchive\n{\n  friend class CStreamSwitch;\n\n  CMyComPtr<IInStream> _stream;\n\n  CObjectVector<CInByte2> _inByteVector;\n  CInByte2 *_inByteBack;\n \n  UInt64 _arhiveBeginStreamPosition;\n\n  Byte _header[kHeaderSize];\n\n  UInt64 HeadersSize;\n\n  void AddByteStream(const Byte *buffer, size_t size)\n  {\n    _inByteVector.Add(CInByte2());\n    _inByteBack = &_inByteVector.Back();\n    _inByteBack->Init(buffer, size);\n  }\n  \n  void DeleteByteStream()\n  {\n    _inByteVector.DeleteBack();\n    if (!_inByteVector.IsEmpty())\n      _inByteBack = &_inByteVector.Back();\n  }\n\nprivate:\n  HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit);\n  \n  void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); }\n  Byte ReadByte() { return _inByteBack->ReadByte(); }\n  UInt64 ReadNumber() { return _inByteBack->ReadNumber(); }\n  CNum ReadNum() { return _inByteBack->ReadNum(); }\n  UInt64 ReadID() { return _inByteBack->ReadNumber(); }\n  UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); }\n  UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); }\n  void SkeepData(UInt64 size) { _inByteBack->SkeepData(size); }\n  void SkeepData() { _inByteBack->SkeepData(); }\n  void WaitAttribute(UInt64 attribute);\n\n  void ReadArchiveProperties(CInArchiveInfo &archiveInfo);\n  void GetNextFolderItem(CFolder &itemInfo);\n  void ReadHashDigests(int numItems,\n      CBoolVector &digestsDefined, CRecordVector<UInt32> &digests);\n  \n  void ReadPackInfo(\n      UInt64 &dataOffset,\n      CRecordVector<UInt64> &packSizes,\n      CBoolVector &packCRCsDefined,\n      CRecordVector<UInt32> &packCRCs);\n  \n  void ReadUnpackInfo(\n      const CObjectVector<CByteBuffer> *dataVector,\n      CObjectVector<CFolder> &folders);\n  \n  void ReadSubStreamsInfo(\n      const CObjectVector<CFolder> &folders,\n      CRecordVector<CNum> &numUnpackStreamsInFolders,\n      CRecordVector<UInt64> &unpackSizes,\n      CBoolVector &digestsDefined,\n      CRecordVector<UInt32> &digests);\n\n  void ReadStreamsInfo(\n      const CObjectVector<CByteBuffer> *dataVector,\n      UInt64 &dataOffset,\n      CRecordVector<UInt64> &packSizes,\n      CBoolVector &packCRCsDefined,\n      CRecordVector<UInt32> &packCRCs,\n      CObjectVector<CFolder> &folders,\n      CRecordVector<CNum> &numUnpackStreamsInFolders,\n      CRecordVector<UInt64> &unpackSizes,\n      CBoolVector &digestsDefined,\n      CRecordVector<UInt32> &digests);\n\n\n  void ReadBoolVector(int numItems, CBoolVector &v);\n  void ReadBoolVector2(int numItems, CBoolVector &v);\n  void ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector,\n      CUInt64DefVector &v, int numFiles);\n  HRESULT ReadAndDecodePackedStreams(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      UInt64 baseOffset, UInt64 &dataOffset,\n      CObjectVector<CByteBuffer> &dataVector\n      #ifndef _NO_CRYPTO\n      , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n      #endif\n      );\n  HRESULT ReadHeader(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      CArchiveDatabaseEx &db\n      #ifndef _NO_CRYPTO\n      ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n      #endif\n      );\n  HRESULT ReadDatabase2(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      CArchiveDatabaseEx &db\n      #ifndef _NO_CRYPTO\n      ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n      #endif\n      );\npublic:\n  HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive\n  void Close();\n\n  HRESULT ReadDatabase(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      CArchiveDatabaseEx &db\n      #ifndef _NO_CRYPTO\n      ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined\n      #endif\n      );\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zItem.h",
    "content": "// 7zItem.h\n\n#ifndef __7Z_ITEM_H\n#define __7Z_ITEM_H\n\n#include \"../../../Common/Buffer.h\"\n#include \"../../../Common/MyString.h\"\n\n#include \"../../Common/MethodId.h\"\n\n#include \"7zHeader.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\ntypedef UInt32 CNum;\nconst CNum kNumMax     = 0x7FFFFFFF;\nconst CNum kNumNoIndex = 0xFFFFFFFF;\n\nstruct CCoderInfo\n{\n  CMethodId MethodID;\n  CByteBuffer Props;\n  CNum NumInStreams;\n  CNum NumOutStreams;\n  bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); }\n};\n\nstruct CBindPair\n{\n  CNum InIndex;\n  CNum OutIndex;\n};\n\nstruct CFolder\n{\n  CObjectVector<CCoderInfo> Coders;\n  CRecordVector<CBindPair> BindPairs;\n  CRecordVector<CNum> PackStreams;\n  CRecordVector<UInt64> UnpackSizes;\n  UInt32 UnpackCRC;\n  bool UnpackCRCDefined;\n\n  CFolder(): UnpackCRCDefined(false) {}\n\n  UInt64 GetUnpackSize() const // test it\n  {\n    if (UnpackSizes.IsEmpty())\n      return 0;\n    for (int i = UnpackSizes.Size() - 1; i >= 0; i--)\n      if (FindBindPairForOutStream(i) < 0)\n        return UnpackSizes[i];\n  }\n\n  CNum GetNumOutStreams() const\n  {\n    CNum result = 0;\n    for (int i = 0; i < Coders.Size(); i++)\n      result += Coders[i].NumOutStreams;\n    return result;\n  }\n\n  int FindBindPairForInStream(CNum inStreamIndex) const\n  {\n    for(int i = 0; i < BindPairs.Size(); i++)\n      if (BindPairs[i].InIndex == inStreamIndex)\n        return i;\n    return -1;\n  }\n  int FindBindPairForOutStream(CNum outStreamIndex) const\n  {\n    for(int i = 0; i < BindPairs.Size(); i++)\n      if (BindPairs[i].OutIndex == outStreamIndex)\n        return i;\n    return -1;\n  }\n  int FindPackStreamArrayIndex(CNum inStreamIndex) const\n  {\n    for(int i = 0; i < PackStreams.Size(); i++)\n      if (PackStreams[i] == inStreamIndex)\n        return i;\n    return -1;\n  }\n\n  bool CheckStructure() const;\n};\n\nstruct CUInt64DefVector\n{\n  CRecordVector<UInt64> Values;\n  CRecordVector<bool> Defined;\n  \n  void Clear()\n  {\n    Values.Clear();\n    Defined.Clear();\n  }\n  \n  void ReserveDown()\n  {\n    Values.ReserveDown();\n    Values.ReserveDown();\n  }\n\n  bool GetItem(int index, UInt64 &value) const\n  {\n    if (index < Defined.Size() && Defined[index])\n    {\n      value = Values[index];\n      return true;\n    }\n    value = 0;\n    return false;\n  }\n  \n  void SetItem(int index, bool defined, UInt64 value)\n  {\n    while (index >= Defined.Size())\n      Defined.Add(false);\n    Defined[index] = defined;\n    if (!defined)\n      return;\n    while (index >= Values.Size())\n      Values.Add(0);\n    Values[index] = value;\n  }\n\n  bool CheckSize(int size) const { return Defined.Size() == size || Defined.Size() == 0; }\n};\n\nstruct CFileItem\n{\n  UInt64 Size;\n  UInt32 Attrib;\n  UInt32 Crc;\n  UString Name;\n\n  bool HasStream; // Test it !!! it means that there is\n                  // stream in some folder. It can be empty stream\n  bool IsDir;\n  bool CrcDefined;\n  bool AttribDefined;\n\n  CFileItem():\n    HasStream(true),\n    IsDir(false),\n    CrcDefined(false),\n    AttribDefined(false)\n      {}\n  void SetAttrib(UInt32 attrib)\n  {\n    AttribDefined = true;\n    Attrib = attrib;\n  }\n};\n\nstruct CFileItem2\n{\n  UInt64 CTime;\n  UInt64 ATime;\n  UInt64 MTime;\n  UInt64 StartPos;\n  bool CTimeDefined;\n  bool ATimeDefined;\n  bool MTimeDefined;\n  bool StartPosDefined;\n  bool IsAnti;\n};\n\nstruct CArchiveDatabase\n{\n  CRecordVector<UInt64> PackSizes;\n  CRecordVector<bool> PackCRCsDefined;\n  CRecordVector<UInt32> PackCRCs;\n  CObjectVector<CFolder> Folders;\n  CRecordVector<CNum> NumUnpackStreamsVector;\n  CObjectVector<CFileItem> Files;\n\n  CUInt64DefVector CTime;\n  CUInt64DefVector ATime;\n  CUInt64DefVector MTime;\n  CUInt64DefVector StartPos;\n  CRecordVector<bool> IsAnti;\n\n  void Clear()\n  {\n    PackSizes.Clear();\n    PackCRCsDefined.Clear();\n    PackCRCs.Clear();\n    Folders.Clear();\n    NumUnpackStreamsVector.Clear();\n    Files.Clear();\n    CTime.Clear();\n    ATime.Clear();\n    MTime.Clear();\n    StartPos.Clear();\n    IsAnti.Clear();\n  }\n\n  void ReserveDown()\n  {\n    PackSizes.ReserveDown();\n    PackCRCsDefined.ReserveDown();\n    PackCRCs.ReserveDown();\n    Folders.ReserveDown();\n    NumUnpackStreamsVector.ReserveDown();\n    Files.ReserveDown();\n    CTime.ReserveDown();\n    ATime.ReserveDown();\n    MTime.ReserveDown();\n    StartPos.ReserveDown();\n    IsAnti.ReserveDown();\n  }\n\n  bool IsEmpty() const\n  {\n    return (PackSizes.IsEmpty() &&\n      PackCRCsDefined.IsEmpty() &&\n      PackCRCs.IsEmpty() &&\n      Folders.IsEmpty() &&\n      NumUnpackStreamsVector.IsEmpty() &&\n      Files.IsEmpty());\n  }\n\n  bool CheckNumFiles() const\n  {\n    int size = Files.Size();\n    return (\n      CTime.CheckSize(size) &&\n      ATime.CheckSize(size) &&\n      MTime.CheckSize(size) &&\n      StartPos.CheckSize(size) &&\n      (size == IsAnti.Size() || IsAnti.Size() == 0));\n  }\n\n  bool IsSolid() const\n  {\n    for (int i = 0; i < NumUnpackStreamsVector.Size(); i++)\n      if (NumUnpackStreamsVector[i] > 1)\n        return true;\n    return false;\n  }\n  bool IsItemAnti(int index) const { return (index < IsAnti.Size() && IsAnti[index]); }\n  void SetItemAnti(int index, bool isAnti)\n  {\n    while (index >= IsAnti.Size())\n      IsAnti.Add(false);\n    IsAnti[index] = isAnti;\n  }\n\n  void GetFile(int index, CFileItem &file, CFileItem2 &file2) const;\n  void AddFile(const CFileItem &file, const CFileItem2 &file2);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zOut.cpp",
    "content": "// 7zOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../Common/AutoPtr.h\"\n#include \"../../Common/StreamObjects.h\"\n\n#include \"7zOut.h\"\n\nextern \"C\"\n{\n#include \"../../../../C/7zCrc.h\"\n}\n\nstatic HRESULT WriteBytes(ISequentialOutStream *stream, const void *data, size_t size)\n{\n  while (size > 0)\n  {\n    UInt32 curSize = (UInt32)MyMin(size, (size_t)0xFFFFFFFF);\n    UInt32 processedSize;\n    RINOK(stream->Write(data, curSize, &processedSize));\n    if (processedSize == 0)\n      return E_FAIL;\n    data = (const void *)((const Byte *)data + processedSize);\n    size -= processedSize;\n  }\n  return S_OK;\n}\n\nnamespace NArchive {\nnamespace N7z {\n\nHRESULT COutArchive::WriteDirect(const void *data, UInt32 size)\n{\n  return ::WriteBytes(SeqStream, data, size);\n}\n\nHRESULT COutArchive::WriteSignature()\n{\n  Byte buf[8];\n  memcpy(buf, kSignature, kSignatureSize);\n  buf[kSignatureSize] = kMajorVersion;\n  buf[kSignatureSize + 1] = 3;\n  return WriteDirect(buf, 8);\n}\n\n#ifdef _7Z_VOL\nHRESULT COutArchive::WriteFinishSignature()\n{\n  RINOK(WriteDirect(kFinishSignature, kSignatureSize));\n  CArchiveVersion av;\n  av.Major = kMajorVersion;\n  av.Minor = 2;\n  RINOK(WriteDirectByte(av.Major));\n  return WriteDirectByte(av.Minor);\n}\n#endif\n\nstatic void SetUInt32(Byte *p, UInt32 d)\n{\n  for (int i = 0; i < 4; i++, d >>= 8)\n    p[i] = (Byte)d;\n}\n\nstatic void SetUInt64(Byte *p, UInt64 d)\n{\n  for (int i = 0; i < 8; i++, d >>= 8)\n    p[i] = (Byte)d;\n}\n\nHRESULT COutArchive::WriteStartHeader(const CStartHeader &h)\n{\n  Byte buf[24];\n  SetUInt64(buf + 4, h.NextHeaderOffset);\n  SetUInt64(buf + 12, h.NextHeaderSize);\n  SetUInt32(buf + 20, h.NextHeaderCRC);\n  SetUInt32(buf, CrcCalc(buf + 4, 20));\n  return WriteDirect(buf, 24);\n}\n\n#ifdef _7Z_VOL\nHRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h)\n{\n  CCRC crc;\n  crc.UpdateUInt64(h.NextHeaderOffset);\n  crc.UpdateUInt64(h.NextHeaderSize);\n  crc.UpdateUInt32(h.NextHeaderCRC);\n  crc.UpdateUInt64(h.ArchiveStartOffset);\n  crc.UpdateUInt64(h.AdditionalStartBlockSize);\n  RINOK(WriteDirectUInt32(crc.GetDigest()));\n  RINOK(WriteDirectUInt64(h.NextHeaderOffset));\n  RINOK(WriteDirectUInt64(h.NextHeaderSize));\n  RINOK(WriteDirectUInt32(h.NextHeaderCRC));\n  RINOK(WriteDirectUInt64(h.ArchiveStartOffset));\n  return WriteDirectUInt64(h.AdditionalStartBlockSize);\n}\n#endif\n\nHRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker)\n{\n  Close();\n  #ifdef _7Z_VOL\n  // endMarker = false;\n  _endMarker = endMarker;\n  #endif\n  SeqStream = stream;\n  if (!endMarker)\n  {\n    SeqStream.QueryInterface(IID_IOutStream, &Stream);\n    if (!Stream)\n    {\n      return E_NOTIMPL;\n      // endMarker = true;\n    }\n  }\n  #ifdef _7Z_VOL\n  if (endMarker)\n  {\n    /*\n    CStartHeader sh;\n    sh.NextHeaderOffset = (UInt32)(Int32)-1;\n    sh.NextHeaderSize = (UInt32)(Int32)-1;\n    sh.NextHeaderCRC = 0;\n    WriteStartHeader(sh);\n    */\n  }\n  else\n  #endif\n  {\n    if (!Stream)\n      return E_FAIL;\n    RINOK(WriteSignature());\n    RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_prefixHeaderPos));\n  }\n  return S_OK;\n}\n\nvoid COutArchive::Close()\n{\n  SeqStream.Release();\n  Stream.Release();\n}\n\nHRESULT COutArchive::SkeepPrefixArchiveHeader()\n{\n  #ifdef _7Z_VOL\n  if (_endMarker)\n    return S_OK;\n  #endif\n  return Stream->Seek(24, STREAM_SEEK_CUR, NULL);\n}\n\nUInt64 COutArchive::GetPos() const\n{\n  if (_countMode)\n    return _countSize;\n  if (_writeToStream)\n    return _outByte.GetProcessedSize();\n  return _outByte2.GetPos();\n}\n\nvoid COutArchive::WriteBytes(const void *data, size_t size)\n{\n  if (_countMode)\n    _countSize += size;\n  else if (_writeToStream)\n  {\n    _outByte.WriteBytes(data, size);\n    _crc = CrcUpdate(_crc, data, size);\n  }\n  else\n    _outByte2.WriteBytes(data, size);\n}\n\nvoid COutArchive::WriteByte(Byte b)\n{\n  if (_countMode)\n    _countSize++;\n  else if (_writeToStream)\n  {\n    _outByte.WriteByte(b);\n    _crc = CRC_UPDATE_BYTE(_crc, b);\n  }\n  else\n    _outByte2.WriteByte(b);\n}\n\nvoid COutArchive::WriteUInt32(UInt32 value)\n{\n  for (int i = 0; i < 4; i++)\n  {\n    WriteByte((Byte)value);\n    value >>= 8;\n  }\n}\n\nvoid COutArchive::WriteUInt64(UInt64 value)\n{\n  for (int i = 0; i < 8; i++)\n  {\n    WriteByte((Byte)value);\n    value >>= 8;\n  }\n}\n\nvoid COutArchive::WriteNumber(UInt64 value)\n{\n  Byte firstByte = 0;\n  Byte mask = 0x80;\n  int i;\n  for (i = 0; i < 8; i++)\n  {\n    if (value < ((UInt64(1) << ( 7  * (i + 1)))))\n    {\n      firstByte |= Byte(value >> (8 * i));\n      break;\n    }\n    firstByte |= mask;\n    mask >>= 1;\n  }\n  WriteByte(firstByte);\n  for (;i > 0; i--)\n  {\n    WriteByte((Byte)value);\n    value >>= 8;\n  }\n}\n\nstatic UInt32 GetBigNumberSize(UInt64 value)\n{\n  int i;\n  for (i = 1; i < 9; i++)\n    if (value < (((UInt64)1 << (i * 7))))\n      break;\n  return i;\n}\n\n#ifdef _7Z_VOL\nUInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props)\n{\n  UInt32 result = GetBigNumberSize(dataSize) * 2 + 41;\n  if (nameLength != 0)\n  {\n    nameLength = (nameLength + 1) * 2;\n    result += nameLength + GetBigNumberSize(nameLength) + 2;\n  }\n  if (props)\n  {\n    result += 20;\n  }\n  if (result >= 128)\n    result++;\n  result += kSignatureSize + 2 + kFinishHeaderSize;\n  return result;\n}\n\nUInt64 COutArchive::GetVolPureSize(UInt64 volSize, int nameLength, bool props)\n{\n  UInt32 headersSizeBase = COutArchive::GetVolHeadersSize(1, nameLength, props);\n  int testSize;\n  if (volSize > headersSizeBase)\n    testSize = volSize - headersSizeBase;\n  else\n    testSize = 1;\n  UInt32 headersSize = COutArchive::GetVolHeadersSize(testSize, nameLength, props);\n  UInt64 pureSize = 1;\n  if (volSize > headersSize)\n    pureSize = volSize - headersSize;\n  return pureSize;\n}\n#endif\n\nvoid COutArchive::WriteFolder(const CFolder &folder)\n{\n  WriteNumber(folder.Coders.Size());\n  int i;\n  for (i = 0; i < folder.Coders.Size(); i++)\n  {\n    const CCoderInfo &coder = folder.Coders[i];\n    {\n      size_t propsSize = coder.Props.GetCapacity();\n      \n      UInt64 id = coder.MethodID;\n      int idSize;\n      for (idSize = 1; idSize < sizeof(id); idSize++)\n        if ((id >> (8 * idSize)) == 0)\n          break;\n      BYTE longID[15];\n      for (int t = idSize - 1; t >= 0 ; t--, id >>= 8)\n        longID[t] = (Byte)(id & 0xFF);\n      Byte b;\n      b = (Byte)(idSize & 0xF);\n      bool isComplex = !coder.IsSimpleCoder();\n      b |= (isComplex ? 0x10 : 0);\n      b |= ((propsSize != 0) ? 0x20 : 0 );\n      WriteByte(b);\n      WriteBytes(longID, idSize);\n      if (isComplex)\n      {\n        WriteNumber(coder.NumInStreams);\n        WriteNumber(coder.NumOutStreams);\n      }\n      if (propsSize == 0)\n        continue;\n      WriteNumber(propsSize);\n      WriteBytes(coder.Props, propsSize);\n    }\n  }\n  for (i = 0; i < folder.BindPairs.Size(); i++)\n  {\n    const CBindPair &bindPair = folder.BindPairs[i];\n    WriteNumber(bindPair.InIndex);\n    WriteNumber(bindPair.OutIndex);\n  }\n  if (folder.PackStreams.Size() > 1)\n    for (i = 0; i < folder.PackStreams.Size(); i++)\n    {\n      WriteNumber(folder.PackStreams[i]);\n    }\n}\n\nvoid COutArchive::WriteBoolVector(const CBoolVector &boolVector)\n{\n  Byte b = 0;\n  Byte mask = 0x80;\n  for (int i = 0; i < boolVector.Size(); i++)\n  {\n    if (boolVector[i])\n      b |= mask;\n    mask >>= 1;\n    if (mask == 0)\n    {\n      WriteByte(b);\n      mask = 0x80;\n      b = 0;\n    }\n  }\n  if (mask != 0x80)\n    WriteByte(b);\n}\n\n\nvoid COutArchive::WriteHashDigests(\n    const CRecordVector<bool> &digestsDefined,\n    const CRecordVector<UInt32> &digests)\n{\n  int numDefined = 0;\n  int i;\n  for (i = 0; i < digestsDefined.Size(); i++)\n    if (digestsDefined[i])\n      numDefined++;\n  if (numDefined == 0)\n    return;\n\n  WriteByte(NID::kCRC);\n  if (numDefined == digestsDefined.Size())\n    WriteByte(1);\n  else\n  {\n    WriteByte(0);\n    WriteBoolVector(digestsDefined);\n  }\n  for (i = 0; i < digests.Size(); i++)\n    if (digestsDefined[i])\n      WriteUInt32(digests[i]);\n}\n\nvoid COutArchive::WritePackInfo(\n    UInt64 dataOffset,\n    const CRecordVector<UInt64> &packSizes,\n    const CRecordVector<bool> &packCRCsDefined,\n    const CRecordVector<UInt32> &packCRCs)\n{\n  if (packSizes.IsEmpty())\n    return;\n  WriteByte(NID::kPackInfo);\n  WriteNumber(dataOffset);\n  WriteNumber(packSizes.Size());\n  WriteByte(NID::kSize);\n  for (int i = 0; i < packSizes.Size(); i++)\n    WriteNumber(packSizes[i]);\n\n  WriteHashDigests(packCRCsDefined, packCRCs);\n  \n  WriteByte(NID::kEnd);\n}\n\nvoid COutArchive::WriteUnpackInfo(const CObjectVector<CFolder> &folders)\n{\n  if (folders.IsEmpty())\n    return;\n\n  WriteByte(NID::kUnpackInfo);\n\n  WriteByte(NID::kFolder);\n  WriteNumber(folders.Size());\n  {\n    WriteByte(0);\n    for (int i = 0; i < folders.Size(); i++)\n      WriteFolder(folders[i]);\n  }\n  \n  WriteByte(NID::kCodersUnpackSize);\n  int i;\n  for (i = 0; i < folders.Size(); i++)\n  {\n    const CFolder &folder = folders[i];\n    for (int j = 0; j < folder.UnpackSizes.Size(); j++)\n      WriteNumber(folder.UnpackSizes[j]);\n  }\n\n  CRecordVector<bool> unpackCRCsDefined;\n  CRecordVector<UInt32> unpackCRCs;\n  for (i = 0; i < folders.Size(); i++)\n  {\n    const CFolder &folder = folders[i];\n    unpackCRCsDefined.Add(folder.UnpackCRCDefined);\n    unpackCRCs.Add(folder.UnpackCRC);\n  }\n  WriteHashDigests(unpackCRCsDefined, unpackCRCs);\n\n  WriteByte(NID::kEnd);\n}\n\nvoid COutArchive::WriteSubStreamsInfo(\n    const CObjectVector<CFolder> &folders,\n    const CRecordVector<CNum> &numUnpackStreamsInFolders,\n    const CRecordVector<UInt64> &unpackSizes,\n    const CRecordVector<bool> &digestsDefined,\n    const CRecordVector<UInt32> &digests)\n{\n  WriteByte(NID::kSubStreamsInfo);\n\n  int i;\n  for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)\n  {\n    if (numUnpackStreamsInFolders[i] != 1)\n    {\n      WriteByte(NID::kNumUnpackStream);\n      for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)\n        WriteNumber(numUnpackStreamsInFolders[i]);\n      break;\n    }\n  }\n \n\n  bool needFlag = true;\n  CNum index = 0;\n  for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)\n    for (CNum j = 0; j < numUnpackStreamsInFolders[i]; j++)\n    {\n      if (j + 1 != numUnpackStreamsInFolders[i])\n      {\n        if (needFlag)\n          WriteByte(NID::kSize);\n        needFlag = false;\n        WriteNumber(unpackSizes[index]);\n      }\n      index++;\n    }\n\n  CRecordVector<bool> digestsDefined2;\n  CRecordVector<UInt32> digests2;\n\n  int digestIndex = 0;\n  for (i = 0; i < folders.Size(); i++)\n  {\n    int numSubStreams = (int)numUnpackStreamsInFolders[i];\n    if (numSubStreams == 1 && folders[i].UnpackCRCDefined)\n      digestIndex++;\n    else\n      for (int j = 0; j < numSubStreams; j++, digestIndex++)\n      {\n        digestsDefined2.Add(digestsDefined[digestIndex]);\n        digests2.Add(digests[digestIndex]);\n      }\n  }\n  WriteHashDigests(digestsDefined2, digests2);\n  WriteByte(NID::kEnd);\n}\n\nvoid COutArchive::SkipAlign(unsigned /* pos */, unsigned /* alignSize */)\n{\n  return;\n}\n\n/*\n7-Zip 4.50 - 4.58 contain BUG, so they do not support .7z archives with Unknown field.\n\nvoid COutArchive::SkipAlign(unsigned pos, unsigned alignSize)\n{\n  pos += (unsigned)GetPos();\n  pos &= (alignSize - 1);\n  if (pos == 0)\n    return;\n  unsigned skip = alignSize - pos;\n  if (skip < 2)\n    skip += alignSize;\n  skip -= 2;\n  WriteByte(NID::kDummy);\n  WriteByte((Byte)skip);\n  for (unsigned i = 0; i < skip; i++)\n    WriteByte(0);\n}\n*/\n\nvoid COutArchive::WriteAlignedBoolHeader(const CBoolVector &v, int numDefined, Byte type, unsigned itemSize)\n{\n  const UInt64 bvSize = (numDefined == v.Size()) ? 0 : (v.Size() + 7) / 8;\n  const UInt64 dataSize = (UInt64)numDefined * itemSize + bvSize + 2;\n  SkipAlign(3 + (unsigned)bvSize + (unsigned)GetBigNumberSize(dataSize), itemSize);\n\n  WriteByte(type);\n  WriteNumber(dataSize);\n  if (numDefined == v.Size())\n    WriteByte(1);\n  else\n  {\n    WriteByte(0);\n    WriteBoolVector(v);\n  }\n  WriteByte(0);\n}\n\nvoid COutArchive::WriteUInt64DefVector(const CUInt64DefVector &v, Byte type)\n{\n  int numDefined = 0;\n\n  int i;\n  for (i = 0; i < v.Defined.Size(); i++)\n    if (v.Defined[i])\n      numDefined++;\n\n  if (numDefined == 0)\n    return;\n\n  WriteAlignedBoolHeader(v.Defined, numDefined, type, 8);\n  \n  for (i = 0; i < v.Defined.Size(); i++)\n    if (v.Defined[i])\n      WriteUInt64(v.Values[i]);\n}\n\nHRESULT COutArchive::EncodeStream(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    CEncoder &encoder, const Byte *data, size_t dataSize,\n    CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders)\n{\n  CSequentialInStreamImp *streamSpec = new CSequentialInStreamImp;\n  CMyComPtr<ISequentialInStream> stream = streamSpec;\n  streamSpec->Init(data, dataSize);\n  CFolder folderItem;\n  folderItem.UnpackCRCDefined = true;\n  folderItem.UnpackCRC = CrcCalc(data, dataSize);\n  UInt64 dataSize64 = dataSize;\n  RINOK(encoder.Encode(\n      EXTERNAL_CODECS_LOC_VARS\n      stream, NULL, &dataSize64, folderItem, SeqStream, packSizes, NULL))\n  folders.Add(folderItem);\n  return S_OK;\n}\n\nHRESULT COutArchive::EncodeStream(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    CEncoder &encoder, const CByteBuffer &data,\n    CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders)\n{\n  return EncodeStream(\n      EXTERNAL_CODECS_LOC_VARS\n      encoder, data, data.GetCapacity(), packSizes, folders);\n}\n\nvoid COutArchive::WriteHeader(\n    const CArchiveDatabase &db,\n    const CHeaderOptions &headerOptions,\n    UInt64 &headerOffset)\n{\n  int i;\n  \n  UInt64 packedSize = 0;\n  for (i = 0; i < db.PackSizes.Size(); i++)\n    packedSize += db.PackSizes[i];\n\n  headerOffset = packedSize;\n\n  WriteByte(NID::kHeader);\n\n  // Archive Properties\n\n  if (db.Folders.Size() > 0)\n  {\n    WriteByte(NID::kMainStreamsInfo);\n    WritePackInfo(0, db.PackSizes,\n        db.PackCRCsDefined,\n        db.PackCRCs);\n\n    WriteUnpackInfo(db.Folders);\n\n    CRecordVector<UInt64> unpackSizes;\n    CRecordVector<bool> digestsDefined;\n    CRecordVector<UInt32> digests;\n    for (i = 0; i < db.Files.Size(); i++)\n    {\n      const CFileItem &file = db.Files[i];\n      if (!file.HasStream)\n        continue;\n      unpackSizes.Add(file.Size);\n      digestsDefined.Add(file.CrcDefined);\n      digests.Add(file.Crc);\n    }\n\n    WriteSubStreamsInfo(\n        db.Folders,\n        db.NumUnpackStreamsVector,\n        unpackSizes,\n        digestsDefined,\n        digests);\n    WriteByte(NID::kEnd);\n  }\n\n  if (db.Files.IsEmpty())\n  {\n    WriteByte(NID::kEnd);\n    return;\n  }\n\n  WriteByte(NID::kFilesInfo);\n  WriteNumber(db.Files.Size());\n\n  {\n  /* ---------- Empty Streams ---------- */\n  CBoolVector emptyStreamVector;\n  emptyStreamVector.Reserve(db.Files.Size());\n  int numEmptyStreams = 0;\n  for (i = 0; i < db.Files.Size(); i++)\n    if (db.Files[i].HasStream)\n      emptyStreamVector.Add(false);\n    else\n    {\n      emptyStreamVector.Add(true);\n      numEmptyStreams++;\n    }\n  if (numEmptyStreams > 0)\n  {\n    WriteByte(NID::kEmptyStream);\n    WriteNumber((emptyStreamVector.Size() + 7) / 8);\n    WriteBoolVector(emptyStreamVector);\n\n    CBoolVector emptyFileVector, antiVector;\n    emptyFileVector.Reserve(numEmptyStreams);\n    antiVector.Reserve(numEmptyStreams);\n    CNum numEmptyFiles = 0, numAntiItems = 0;\n    for (i = 0; i < db.Files.Size(); i++)\n    {\n      const CFileItem &file = db.Files[i];\n      if (!file.HasStream)\n      {\n        emptyFileVector.Add(!file.IsDir);\n        if (!file.IsDir)\n          numEmptyFiles++;\n        bool isAnti = db.IsItemAnti(i);\n        antiVector.Add(isAnti);\n        if (isAnti)\n          numAntiItems++;\n      }\n    }\n\n    if (numEmptyFiles > 0)\n    {\n      WriteByte(NID::kEmptyFile);\n      WriteNumber((emptyFileVector.Size() + 7) / 8);\n      WriteBoolVector(emptyFileVector);\n    }\n\n    if (numAntiItems > 0)\n    {\n      WriteByte(NID::kAnti);\n      WriteNumber((antiVector.Size() + 7) / 8);\n      WriteBoolVector(antiVector);\n    }\n  }\n  }\n\n\n  {\n    /* ---------- Names ---------- */\n    \n    int numDefined = 0;\n    size_t namesDataSize = 0;\n    for (int i = 0; i < db.Files.Size(); i++)\n    {\n      const UString &name = db.Files[i].Name;\n      if (!name.IsEmpty())\n        numDefined++;\n      namesDataSize += (name.Length() + 1) * 2;\n    }\n    \n    if (numDefined > 0)\n    {\n      namesDataSize++;\n      SkipAlign(2 + GetBigNumberSize(namesDataSize), 2);\n\n      WriteByte(NID::kName);\n      WriteNumber(namesDataSize);\n      WriteByte(0);\n      for (int i = 0; i < db.Files.Size(); i++)\n      {\n        const UString &name = db.Files[i].Name;\n        for (int t = 0; t <= name.Length(); t++)\n        {\n          wchar_t c = name[t];\n          WriteByte((Byte)c);\n          WriteByte((Byte)(c >> 8));\n        }\n      }\n    }\n  }\n\n  if (headerOptions.WriteCTime) WriteUInt64DefVector(db.CTime, NID::kCTime);\n  if (headerOptions.WriteATime) WriteUInt64DefVector(db.ATime, NID::kATime);\n  if (headerOptions.WriteMTime) WriteUInt64DefVector(db.MTime, NID::kMTime);\n  WriteUInt64DefVector(db.StartPos, NID::kStartPos);\n  \n  {\n    /* ---------- Write Attrib ---------- */\n    CBoolVector boolVector;\n    boolVector.Reserve(db.Files.Size());\n    int numDefined = 0;\n    for (i = 0; i < db.Files.Size(); i++)\n    {\n      bool defined = db.Files[i].AttribDefined;\n      boolVector.Add(defined);\n      if (defined)\n        numDefined++;\n    }\n    if (numDefined > 0)\n    {\n      WriteAlignedBoolHeader(boolVector, numDefined, NID::kWinAttributes, 4);\n      for (i = 0; i < db.Files.Size(); i++)\n      {\n        const CFileItem &file = db.Files[i];\n        if (file.AttribDefined)\n          WriteUInt32(file.Attrib);\n      }\n    }\n  }\n\n  WriteByte(NID::kEnd); // for files\n  WriteByte(NID::kEnd); // for headers\n}\n\nHRESULT COutArchive::WriteDatabase(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    const CArchiveDatabase &db,\n    const CCompressionMethodMode *options,\n    const CHeaderOptions &headerOptions)\n{\n  if (!db.CheckNumFiles())\n    return E_FAIL;\n\n  UInt64 headerOffset;\n  UInt32 headerCRC;\n  UInt64 headerSize;\n  if (db.IsEmpty())\n  {\n    headerSize = 0;\n    headerOffset = 0;\n    headerCRC = CrcCalc(0, 0);\n  }\n  else\n  {\n    bool encodeHeaders = false;\n    if (options != 0)\n      if (options->IsEmpty())\n        options = 0;\n    if (options != 0)\n      if (options->PasswordIsDefined || headerOptions.CompressMainHeader)\n        encodeHeaders = true;\n\n    _outByte.SetStream(SeqStream);\n    _outByte.Init();\n    _crc = CRC_INIT_VAL;\n    _countMode = encodeHeaders;\n    _writeToStream = true;\n    _countSize = 0;\n    WriteHeader(db, headerOptions, headerOffset);\n\n    if (encodeHeaders)\n    {\n      CByteBuffer buf;\n      buf.SetCapacity(_countSize);\n      _outByte2.Init((Byte *)buf, _countSize);\n      \n      _countMode = false;\n      _writeToStream = false;\n      WriteHeader(db, headerOptions, headerOffset);\n      \n      if (_countSize != _outByte2.GetPos())\n        return E_FAIL;\n\n      CCompressionMethodMode encryptOptions;\n      encryptOptions.PasswordIsDefined = options->PasswordIsDefined;\n      encryptOptions.Password = options->Password;\n      CEncoder encoder(headerOptions.CompressMainHeader ? *options : encryptOptions);\n      CRecordVector<UInt64> packSizes;\n      CObjectVector<CFolder> folders;\n      RINOK(EncodeStream(\n          EXTERNAL_CODECS_LOC_VARS\n          encoder, (const Byte *)buf,\n          _countSize, packSizes, folders));\n\n      _writeToStream = true;\n      \n      if (folders.Size() == 0)\n        return -1;\n\n      WriteID(NID::kEncodedHeader);\n      WritePackInfo(headerOffset, packSizes,\n        CRecordVector<bool>(), CRecordVector<UInt32>());\n      WriteUnpackInfo(folders);\n      WriteByte(NID::kEnd);\n      for (int i = 0; i < packSizes.Size(); i++)\n        headerOffset += packSizes[i];\n    }\n    RINOK(_outByte.Flush());\n    headerCRC = CRC_GET_DIGEST(_crc);\n    headerSize = _outByte.GetProcessedSize();\n  }\n  #ifdef _7Z_VOL\n  if (_endMarker)\n  {\n    CFinishHeader h;\n    h.NextHeaderSize = headerSize;\n    h.NextHeaderCRC = headerCRC;\n    h.NextHeaderOffset =\n        UInt64(0) - (headerSize +\n        4 + kFinishHeaderSize);\n    h.ArchiveStartOffset = h.NextHeaderOffset - headerOffset;\n    h.AdditionalStartBlockSize = 0;\n    RINOK(WriteFinishHeader(h));\n    return WriteFinishSignature();\n  }\n  else\n  #endif\n  {\n    CStartHeader h;\n    h.NextHeaderSize = headerSize;\n    h.NextHeaderCRC = headerCRC;\n    h.NextHeaderOffset = headerOffset;\n    RINOK(Stream->Seek(_prefixHeaderPos, STREAM_SEEK_SET, NULL));\n    return WriteStartHeader(h);\n  }\n}\n\nvoid CArchiveDatabase::GetFile(int index, CFileItem &file, CFileItem2 &file2) const\n{\n  file = Files[index];\n  file2.CTimeDefined = CTime.GetItem(index, file2.CTime);\n  file2.ATimeDefined = ATime.GetItem(index, file2.ATime);\n  file2.MTimeDefined = MTime.GetItem(index, file2.MTime);\n  file2.StartPosDefined = StartPos.GetItem(index, file2.StartPos);\n  file2.IsAnti = IsItemAnti(index);\n}\n\nvoid CArchiveDatabase::AddFile(const CFileItem &file, const CFileItem2 &file2)\n{\n  int index = Files.Size();\n  CTime.SetItem(index, file2.CTimeDefined, file2.CTime);\n  ATime.SetItem(index, file2.ATimeDefined, file2.ATime);\n  MTime.SetItem(index, file2.MTimeDefined, file2.MTime);\n  StartPos.SetItem(index, file2.StartPosDefined, file2.StartPos);\n  SetItemAnti(index, file2.IsAnti);\n  Files.Add(file);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zOut.h",
    "content": "// 7z/Out.h\n\n#ifndef __7Z_OUT_H\n#define __7Z_OUT_H\n\n#include \"7zHeader.h\"\n#include \"7zItem.h\"\n#include \"7zCompressionMode.h\"\n#include \"7zEncode.h\"\n\n#include \"../../Common/OutBuffer.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nclass CWriteBufferLoc\n{\n  Byte *_data;\n  size_t _size;\n  size_t _pos;\npublic:\n  CWriteBufferLoc(): _size(0), _pos(0) {}\n  void Init(Byte *data, size_t size)\n  {\n    _data = data;\n    _size = size;\n    _pos = 0;\n  }\n  void WriteBytes(const void *data, size_t size)\n  {\n    if (size > _size - _pos)\n      return;\n    memcpy(_data + _pos, data, size);\n    _pos += size;\n  }\n  void WriteByte(Byte b)\n  {\n    if (_size == _pos)\n      return;\n    _data[_pos++] = b;\n  }\n  size_t GetPos() const { return _pos; }\n};\n\nstruct CHeaderOptions\n{\n  bool CompressMainHeader;\n  bool WriteCTime;\n  bool WriteATime;\n  bool WriteMTime;\n\n  CHeaderOptions():\n      CompressMainHeader(true),\n      WriteCTime(false),\n      WriteATime(false),\n      WriteMTime(true)\n      {}\n};\n\nclass COutArchive\n{\n  UInt64 _prefixHeaderPos;\n\n  HRESULT WriteDirect(const void *data, UInt32 size);\n  \n  UInt64 GetPos() const;\n  void WriteBytes(const void *data, size_t size);\n  void WriteBytes(const CByteBuffer &data) { WriteBytes(data, data.GetCapacity()); }\n  void WriteByte(Byte b);\n  void WriteUInt32(UInt32 value);\n  void WriteUInt64(UInt64 value);\n  void WriteNumber(UInt64 value);\n  void WriteID(UInt64 value) { WriteNumber(value); }\n\n  void WriteFolder(const CFolder &folder);\n  HRESULT WriteFileHeader(const CFileItem &itemInfo);\n  void WriteBoolVector(const CBoolVector &boolVector);\n  void WriteHashDigests(\n      const CRecordVector<bool> &digestsDefined,\n      const CRecordVector<UInt32> &hashDigests);\n\n  void WritePackInfo(\n      UInt64 dataOffset,\n      const CRecordVector<UInt64> &packSizes,\n      const CRecordVector<bool> &packCRCsDefined,\n      const CRecordVector<UInt32> &packCRCs);\n\n  void WriteUnpackInfo(const CObjectVector<CFolder> &folders);\n\n  void WriteSubStreamsInfo(\n      const CObjectVector<CFolder> &folders,\n      const CRecordVector<CNum> &numUnpackStreamsInFolders,\n      const CRecordVector<UInt64> &unpackSizes,\n      const CRecordVector<bool> &digestsDefined,\n      const CRecordVector<UInt32> &hashDigests);\n\n  void SkipAlign(unsigned pos, unsigned alignSize);\n  void WriteAlignedBoolHeader(const CBoolVector &v, int numDefined, Byte type, unsigned itemSize);\n  void WriteUInt64DefVector(const CUInt64DefVector &v, Byte type);\n\n  HRESULT EncodeStream(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      CEncoder &encoder, const Byte *data, size_t dataSize,\n      CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders);\n  HRESULT EncodeStream(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      CEncoder &encoder, const CByteBuffer &data,\n      CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders);\n  void WriteHeader(\n      const CArchiveDatabase &db,\n      const CHeaderOptions &headerOptions,\n      UInt64 &headerOffset);\n  \n  bool _countMode;\n  bool _writeToStream;\n  size_t _countSize;\n  UInt32 _crc;\n  COutBuffer _outByte;\n  CWriteBufferLoc _outByte2;\n\n  #ifdef _7Z_VOL\n  bool _endMarker;\n  #endif\n\n  HRESULT WriteSignature();\n  #ifdef _7Z_VOL\n  HRESULT WriteFinishSignature();\n  #endif\n  HRESULT WriteStartHeader(const CStartHeader &h);\n  #ifdef _7Z_VOL\n  HRESULT WriteFinishHeader(const CFinishHeader &h);\n  #endif\n  CMyComPtr<IOutStream> Stream;\npublic:\n\n  COutArchive() { _outByte.Create(1 << 16); }\n  CMyComPtr<ISequentialOutStream> SeqStream;\n  HRESULT Create(ISequentialOutStream *stream, bool endMarker);\n  void Close();\n  HRESULT SkeepPrefixArchiveHeader();\n  HRESULT WriteDatabase(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      const CArchiveDatabase &db,\n      const CCompressionMethodMode *options,\n      const CHeaderOptions &headerOptions);\n\n  #ifdef _7Z_VOL\n  static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false);\n  static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false);\n  #endif\n\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zProperties.cpp",
    "content": "// 7zProperties.cpp\n\n#include \"StdAfx.h\"\n\n#include \"7zProperties.h\"\n#include \"7zHeader.h\"\n#include \"7zHandler.h\"\n\n// #define _MULTI_PACK\n\nnamespace NArchive {\nnamespace N7z {\n\nstruct CPropMap\n{\n  UInt64 FilePropID;\n  STATPROPSTG StatPROPSTG;\n};\n\nCPropMap kPropMap[] =\n{\n  { NID::kName, NULL, kpidPath, VT_BSTR},\n  { NID::kSize, NULL, kpidSize, VT_UI8},\n  { NID::kPackInfo, NULL, kpidPackSize, VT_UI8},\n  \n  #ifdef _MULTI_PACK\n  { 100, L\"Pack0\", kpidPackedSize0, VT_UI8},\n  { 101, L\"Pack1\", kpidPackedSize1, VT_UI8},\n  { 102, L\"Pack2\", kpidPackedSize2, VT_UI8},\n  { 103, L\"Pack3\", kpidPackedSize3, VT_UI8},\n  { 104, L\"Pack4\", kpidPackedSize4, VT_UI8},\n  #endif\n\n  { NID::kCTime, NULL, kpidCTime, VT_FILETIME},\n  { NID::kMTime, NULL, kpidMTime, VT_FILETIME},\n  { NID::kATime, NULL, kpidATime, VT_FILETIME},\n  { NID::kWinAttributes, NULL, kpidAttrib, VT_UI4},\n  { NID::kStartPos, NULL, kpidPosition, VT_UI4},\n\n  { NID::kCRC, NULL, kpidCRC, VT_UI4},\n  \n  { NID::kAnti, NULL, kpidIsAnti, VT_BOOL},\n\n  #ifndef _SFX\n  { 97, NULL, kpidEncrypted, VT_BOOL},\n  { 98, NULL, kpidMethod, VT_BSTR},\n  { 99, NULL, kpidBlock, VT_UI4}\n  #endif\n};\n\nstatic const int kPropMapSize = sizeof(kPropMap) / sizeof(kPropMap[0]);\n\nstatic int FindPropInMap(UInt64 filePropID)\n{\n  for (int i = 0; i < kPropMapSize; i++)\n    if (kPropMap[i].FilePropID == filePropID)\n      return i;\n  return -1;\n}\n\nstatic void CopyOneItem(CRecordVector<UInt64> &src,\n    CRecordVector<UInt64> &dest, UInt32 item)\n{\n  for (int i = 0; i < src.Size(); i++)\n    if (src[i] == item)\n    {\n      dest.Add(item);\n      src.Delete(i);\n      return;\n    }\n}\n\nstatic void RemoveOneItem(CRecordVector<UInt64> &src, UInt32 item)\n{\n  for (int i = 0; i < src.Size(); i++)\n    if (src[i] == item)\n    {\n      src.Delete(i);\n      return;\n    }\n}\n\nstatic void InsertToHead(CRecordVector<UInt64> &dest, UInt32 item)\n{\n  for (int i = 0; i < dest.Size(); i++)\n    if (dest[i] == item)\n    {\n      dest.Delete(i);\n      break;\n    }\n  dest.Insert(0, item);\n}\n\nvoid CHandler::FillPopIDs()\n{\n  _fileInfoPopIDs.Clear();\n\n  #ifdef _7Z_VOL\n  if(_volumes.Size() < 1)\n    return;\n  const CVolume &volume = _volumes.Front();\n  const CArchiveDatabaseEx &_db = volume.Database;\n  #endif\n\n  CRecordVector<UInt64> fileInfoPopIDs = _db.ArchiveInfo.FileInfoPopIDs;\n\n  RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream);\n  RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile);\n\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kName);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kAnti);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kSize);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kPackInfo);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCTime);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kMTime);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kATime);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kWinAttributes);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCRC);\n  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kComment);\n  _fileInfoPopIDs += fileInfoPopIDs;\n \n  #ifndef _SFX\n  _fileInfoPopIDs.Add(97);\n  _fileInfoPopIDs.Add(98);\n  _fileInfoPopIDs.Add(99);\n  #endif\n  #ifdef _MULTI_PACK\n  _fileInfoPopIDs.Add(100);\n  _fileInfoPopIDs.Add(101);\n  _fileInfoPopIDs.Add(102);\n  _fileInfoPopIDs.Add(103);\n  _fileInfoPopIDs.Add(104);\n  #endif\n\n  #ifndef _SFX\n  InsertToHead(_fileInfoPopIDs, NID::kMTime);\n  InsertToHead(_fileInfoPopIDs, NID::kPackInfo);\n  InsertToHead(_fileInfoPopIDs, NID::kSize);\n  InsertToHead(_fileInfoPopIDs, NID::kName);\n  #endif\n}\n\nSTDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties)\n{\n  *numProperties = _fileInfoPopIDs.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)\n{\n  if ((int)index >= _fileInfoPopIDs.Size())\n    return E_INVALIDARG;\n  int indexInMap = FindPropInMap(_fileInfoPopIDs[index]);\n  if (indexInMap == -1)\n    return E_INVALIDARG;\n  const STATPROPSTG &srcItem = kPropMap[indexInMap].StatPROPSTG;\n  *propID = srcItem.propid;\n  *varType = srcItem.vt;\n  *name = 0;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zProperties.h",
    "content": "// 7zProperties.h\n\n#ifndef __7Z_PROPERTIES_H\n#define __7Z_PROPERTIES_H\n\n#include \"../../PropID.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nenum\n{\n  kpidPackedSize0 = kpidUserDefined,\n  kpidPackedSize1,\n  kpidPackedSize2,\n  kpidPackedSize3,\n  kpidPackedSize4\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zRegister.cpp",
    "content": "// 7zRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"7zHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::N7z::CHandler;  }\n#ifndef EXTRACT_ONLY\nstatic IOutArchive *CreateArcOut() { return new NArchive::N7z::CHandler;  }\n#else\n#define CreateArcOut 0\n#endif\n\nstatic CArcInfo g_ArcInfo =\n  { L\"7z\", L\"7z\", 0, 7, {'7' + 1 , 'z', 0xBC, 0xAF, 0x27, 0x1C}, 6, false, CreateArc, CreateArcOut };\n\nvoid Register7z()\n{\n\tg_ArcInfo.Signature[0]--; \n\tRegisterArc(&g_ArcInfo);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zSpecStream.cpp",
    "content": "// 7zSpecStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"7zSpecStream.h\"\n\nSTDMETHODIMP CSequentialInStreamSizeCount2::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result = _stream->Read(data, size, &realProcessedSize);\n  _size += realProcessedSize;\n  if (processedSize != 0)\n    *processedSize = realProcessedSize;\n  return result;\n}\n\nSTDMETHODIMP CSequentialInStreamSizeCount2::GetSubStreamSize(\n    UInt64 subStream, UInt64 *value)\n{\n  if (_getSubStreamSize == NULL)\n    return E_NOTIMPL;\n  return  _getSubStreamSize->GetSubStreamSize(subStream, value);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zSpecStream.h",
    "content": "// 7zSpecStream.h\n\n#ifndef __7Z_SPEC_STREAM_H\n#define __7Z_SPEC_STREAM_H\n\n#include \"../../IStream.h\"\n#include \"../../ICoder.h\"\n#include \"../../../Common/MyCom.h\"\n\nclass CSequentialInStreamSizeCount2:\n  public ISequentialInStream,\n  public ICompressGetSubStreamSize,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialInStream> _stream;\n  CMyComPtr<ICompressGetSubStreamSize> _getSubStreamSize;\n  UInt64 _size;\npublic:\n  void Init(ISequentialInStream *stream)\n  {\n    _stream = stream;\n    _getSubStreamSize = 0;\n    _stream.QueryInterface(IID_ICompressGetSubStreamSize, &_getSubStreamSize);\n    _size = 0;\n  }\n  UInt64 GetSize() const { return _size; }\n\n  MY_UNKNOWN_IMP1(ICompressGetSubStreamSize)\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n\n  STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zUpdate.cpp",
    "content": "// 7zUpdate.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"7zEncode.h\"\n#include \"7zFolderInStream.h\"\n#include \"7zHandler.h\"\n#include \"7zOut.h\"\n#include \"7zUpdate.h\"\n\n#ifndef WIN32\n#include \"Windows/FileIO.h\"\n#endif\n\nnamespace NArchive {\nnamespace N7z {\n\nstatic const wchar_t *kMatchFinderForBCJ2_LZMA = L\"BT2\";\nstatic const UInt32 kDictionaryForBCJ2_LZMA = 1 << 20;\nstatic const UInt32 kAlgorithmForBCJ2_LZMA = 1;\nstatic const UInt32 kNumFastBytesForBCJ2_LZMA = 64;\n\nstatic HRESULT WriteRange(IInStream *inStream, ISequentialOutStream *outStream,\n    UInt64 position, UInt64 size, ICompressProgressInfo *progress)\n{\n  RINOK(inStream->Seek(position, STREAM_SEEK_SET, 0));\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);\n  streamSpec->SetStream(inStream);\n  streamSpec->Init(size);\n\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n  RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress));\n  return (copyCoderSpec->TotalSize == size ? S_OK : E_FAIL);\n}\n\nstatic int GetReverseSlashPos(const UString &name)\n{\n  int slashPos = name.ReverseFind(L'/');\n  #ifdef _WIN32\n  int slash1Pos = name.ReverseFind(L'\\\\');\n  slashPos = MyMax(slashPos, slash1Pos);\n  #endif\n  return slashPos;\n}\n\nint CUpdateItem::GetExtensionPos() const\n{\n  int slashPos = GetReverseSlashPos(Name);\n  int dotPos = Name.ReverseFind(L'.');\n  if (dotPos < 0 || (dotPos < slashPos && slashPos >= 0))\n    return Name.Length();\n  return dotPos + 1;\n}\n\nUString CUpdateItem::GetExtension() const\n{\n  return Name.Mid(GetExtensionPos());\n}\n\n#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }\n\nstatic int CompareBuffers(const CByteBuffer &a1, const CByteBuffer &a2)\n{\n  size_t c1 = a1.GetCapacity();\n  size_t c2 = a2.GetCapacity();\n  RINOZ(MyCompare(c1, c2));\n  for (size_t i = 0; i < c1; i++)\n    RINOZ(MyCompare(a1[i], a2[i]));\n  return 0;\n}\n\nstatic int CompareCoders(const CCoderInfo &c1, const CCoderInfo &c2)\n{\n  RINOZ(MyCompare(c1.NumInStreams, c2.NumInStreams));\n  RINOZ(MyCompare(c1.NumOutStreams, c2.NumOutStreams));\n  RINOZ(MyCompare(c1.MethodID, c2.MethodID));\n  return CompareBuffers(c1.Props, c2.Props);\n}\n\nstatic int CompareBindPairs(const CBindPair &b1, const CBindPair &b2)\n{\n  RINOZ(MyCompare(b1.InIndex, b2.InIndex));\n  return MyCompare(b1.OutIndex, b2.OutIndex);\n}\n\nstatic int CompareFolders(const CFolder &f1, const CFolder &f2)\n{\n  int s1 = f1.Coders.Size();\n  int s2 = f2.Coders.Size();\n  RINOZ(MyCompare(s1, s2));\n  int i;\n  for (i = 0; i < s1; i++)\n    RINOZ(CompareCoders(f1.Coders[i], f2.Coders[i]));\n  s1 = f1.BindPairs.Size();\n  s2 = f2.BindPairs.Size();\n  RINOZ(MyCompare(s1, s2));\n  for (i = 0; i < s1; i++)\n    RINOZ(CompareBindPairs(f1.BindPairs[i], f2.BindPairs[i]));\n  return 0;\n}\n\nstatic int CompareFiles(const CFileItem &f1, const CFileItem &f2)\n{\n  return MyStringCompareNoCase(f1.Name, f2.Name);\n}\n\nstatic int CompareFolderRefs(const int *p1, const int *p2, void *param)\n{\n  int i1 = *p1;\n  int i2 = *p2;\n  const CArchiveDatabaseEx &db = *(const CArchiveDatabaseEx *)param;\n  RINOZ(CompareFolders(\n      db.Folders[i1],\n      db.Folders[i2]));\n  RINOZ(MyCompare(\n      db.NumUnpackStreamsVector[i1],\n      db.NumUnpackStreamsVector[i2]));\n  if (db.NumUnpackStreamsVector[i1] == 0)\n    return 0;\n  return CompareFiles(\n      db.Files[db.FolderStartFileIndex[i1]],\n      db.Files[db.FolderStartFileIndex[i2]]);\n}\n\n////////////////////////////////////////////////////////////\n\nstatic int CompareEmptyItems(const int *p1, const int *p2, void *param)\n{\n  const CObjectVector<CUpdateItem> &updateItems = *(const CObjectVector<CUpdateItem> *)param;\n  const CUpdateItem &u1 = updateItems[*p1];\n  const CUpdateItem &u2 = updateItems[*p2];\n  if (u1.IsDir != u2.IsDir)\n    return (u1.IsDir) ? 1 : -1;\n  if (u1.IsDir)\n  {\n    if (u1.IsAnti != u2.IsAnti)\n      return (u1.IsAnti ? 1 : -1);\n    int n = MyStringCompareNoCase(u1.Name, u2.Name);\n    return -n;\n  }\n  if (u1.IsAnti != u2.IsAnti)\n    return (u1.IsAnti ? 1 : -1);\n  return MyStringCompareNoCase(u1.Name, u2.Name);\n}\n\nstatic const char *g_Exts =\n  \" lzma 7z ace arc arj bz bz2 deb lzo lzx gz pak rpm sit tgz tbz tbz2 tgz cab ha lha lzh rar zoo\"\n  \" zip jar ear war msi\"\n  \" 3gp avi mov mpeg mpg mpe wmv\"\n  \" aac ape fla flac la mp3 m4a mp4 ofr ogg pac ra rm rka shn swa tta wv wma wav\"\n  \" swf \"\n  \" chm hxi hxs\"\n  \" gif jpeg jpg jp2 png tiff  bmp ico psd psp\"\n  \" awg ps eps cgm dxf svg vrml wmf emf ai md\"\n  \" cad dwg pps key sxi\"\n  \" max 3ds\"\n  \" iso bin nrg mdf img pdi tar cpio xpi\"\n  \" vfd vhd vud vmc vsv\"\n  \" vmdk dsk nvram vmem vmsd vmsn vmss vmtm\"\n  \" inl inc idl acf asa h hpp hxx c cpp cxx rc java cs pas bas vb cls ctl frm dlg def\"\n  \" f77 f f90 f95\"\n  \" asm sql manifest dep \"\n  \" mak clw csproj vcproj sln dsp dsw \"\n  \" class \"\n  \" bat cmd\"\n  \" xml xsd xsl xslt hxk hxc htm html xhtml xht mht mhtml htw asp aspx css cgi jsp shtml\"\n  \" awk sed hta js php php3 php4 php5 phptml pl pm py pyo rb sh tcl vbs\"\n  \" text txt tex ans asc srt reg ini doc docx mcw dot rtf hlp xls xlr xlt xlw ppt pdf\"\n  \" sxc sxd sxi sxg sxw stc sti stw stm odt ott odg otg odp otp ods ots odf\"\n  \" abw afp cwk lwp wpd wps wpt wrf wri\"\n  \" abf afm bdf fon mgf otf pcf pfa snf ttf\"\n  \" dbf mdb nsf ntf wdb db fdb gdb\"\n  \" exe dll ocx vbx sfx sys tlb awx com obj lib out o so \"\n  \" pdb pch idb ncb opt\";\n\nint GetExtIndex(const char *ext)\n{\n  int extIndex = 1;\n  const char *p = g_Exts;\n  for (;;)\n  {\n    char c = *p++;\n    if (c == 0)\n      return extIndex;\n    if (c == ' ')\n      continue;\n    int pos = 0;\n    for (;;)\n    {\n      char c2 = ext[pos++];\n      if (c2 == 0 && (c == 0 || c == ' '))\n        return extIndex;\n      if (c != c2)\n        break;\n      c = *p++;\n    }\n    extIndex++;\n    for (;;)\n    {\n      if (c == 0)\n        return extIndex;\n      if (c == ' ')\n        break;\n      c = *p++;\n    }\n  }\n}\n\nstruct CRefItem\n{\n  const CUpdateItem *UpdateItem;\n  UInt32 Index;\n  UInt32 ExtensionPos;\n  UInt32 NamePos;\n  int ExtensionIndex;\n  CRefItem(UInt32 index, const CUpdateItem &ui, bool sortByType):\n    UpdateItem(&ui),\n    Index(index),\n    ExtensionPos(0),\n    NamePos(0),\n    ExtensionIndex(0)\n  {\n    if (sortByType)\n    {\n      int slashPos = GetReverseSlashPos(ui.Name);\n      NamePos = ((slashPos >= 0) ? (slashPos + 1) : 0);\n      int dotPos = ui.Name.ReverseFind(L'.');\n      if (dotPos < 0 || (dotPos < slashPos && slashPos >= 0))\n        ExtensionPos = ui.Name.Length();\n      else\n      {\n        ExtensionPos = dotPos + 1;\n        UString us = ui.Name.Mid(ExtensionPos);\n        if (!us.IsEmpty())\n        {\n          us.MakeLower();\n          int i;\n          AString s;\n          for (i = 0; i < us.Length(); i++)\n          {\n            wchar_t c = us[i];\n            if (c >= 0x80)\n              break;\n            s += (char)c;\n          }\n          if (i == us.Length())\n            ExtensionIndex = GetExtIndex(s);\n          else\n            ExtensionIndex = 0;\n        }\n      }\n    }\n  }\n};\n\nstatic int CompareUpdateItems(const CRefItem *p1, const CRefItem *p2, void *param)\n{\n  const CRefItem &a1 = *p1;\n  const CRefItem &a2 = *p2;\n  const CUpdateItem &u1 = *a1.UpdateItem;\n  const CUpdateItem &u2 = *a2.UpdateItem;\n  int n;\n  if (u1.IsDir != u2.IsDir)\n    return (u1.IsDir) ? 1 : -1;\n  if (u1.IsDir)\n  {\n    if (u1.IsAnti != u2.IsAnti)\n      return (u1.IsAnti ? 1 : -1);\n    n = MyStringCompareNoCase(u1.Name, u2.Name);\n    return -n;\n  }\n  bool sortByType = *(bool *)param;\n  if (sortByType)\n  {\n    RINOZ(MyCompare(a1.ExtensionIndex, a2.ExtensionIndex))\n    RINOZ(MyStringCompareNoCase(u1.Name + a1.ExtensionPos, u2.Name + a2.ExtensionPos));\n    RINOZ(MyStringCompareNoCase(u1.Name + a1.NamePos, u2.Name + a2.NamePos));\n    if (!u1.MTimeDefined && u2.MTimeDefined) return 1;\n    if (u1.MTimeDefined && !u2.MTimeDefined) return -1;\n    if (u1.MTimeDefined && u2.MTimeDefined) RINOZ(MyCompare(u1.MTime, u2.MTime));\n    RINOZ(MyCompare(u1.Size, u2.Size))\n  }\n  return MyStringCompareNoCase(u1.Name, u2.Name);\n}\n\nstruct CSolidGroup\n{\n  CCompressionMethodMode Method;\n  CRecordVector<UInt32> Indices;\n};\n\n#ifdef _WIN32\nstatic wchar_t *g_ExeExts[] =\n{\n  L\"dll\",\n  L\"exe\",\n  L\"ocx\",\n  L\"sfx\",\n  L\"sys\"\n};\n\nstatic bool IsExeFile(const UString &ext)\n{\n  for (int i = 0; i < sizeof(g_ExeExts) / sizeof(g_ExeExts[0]); i++)\n    if (ext.CompareNoCase(g_ExeExts[i]) == 0)\n      return true;\n  return false;\n}\n#else\nstatic bool IsExeFile(const CUpdateItem &ui)\n{\n  if (ui.Attrib & FILE_ATTRIBUTE_UNIX_EXTENSION) {\n    unsigned short st_mode =  ui.Attrib >> 16;\n    if ((st_mode & 00111) && (ui.Size >= 2048))\n    {\n      // file has the execution flag and it's big enought\n      // try to find if the file is a script\n      NWindows::NFile::NIO::CInFile file;\n      if (file.Open(ui.Name))\n      {\n        char buffer[512];\n        UINT32 processedSize;\n        if (file.Read(buffer,sizeof(buffer),processedSize))\n        {\n          for(UInt32 i = 0; i < processedSize ; i++)\n          {\n            if (buffer[i] == 0) \n\t    {\n              return true; // this file is not a text (ascii, utf8, ...) !\n\t    }\n          }\n       }\n     }\n   }\n  } \n  return false;\n}\n#endif\n\nstatic const UInt64 k_LZMA  = 0x030101;\nstatic const UInt64 k_BCJ   = 0x03030103;\nstatic const UInt64 k_BCJ2  = 0x0303011B;\n\nstatic bool GetMethodFull(UInt64 methodID,\n    UInt32 numInStreams, CMethodFull &methodResult)\n{\n  methodResult.Id = methodID;\n  methodResult.NumInStreams = numInStreams;\n  methodResult.NumOutStreams = 1;\n  return true;\n}\n\nstatic bool MakeExeMethod(const CCompressionMethodMode &method,\n    bool bcj2Filter, CCompressionMethodMode &exeMethod)\n{\n  exeMethod = method;\n  if (bcj2Filter)\n  {\n    CMethodFull methodFull;\n    if (!GetMethodFull(k_BCJ2, 4, methodFull))\n      return false;\n    exeMethod.Methods.Insert(0, methodFull);\n    if (!GetMethodFull(k_LZMA, 1, methodFull))\n      return false;\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kAlgorithm;\n      prop.Value = kAlgorithmForBCJ2_LZMA;\n      methodFull.Props.Add(prop);\n    }\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kMatchFinder;\n      prop.Value = kMatchFinderForBCJ2_LZMA;\n      methodFull.Props.Add(prop);\n    }\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kDictionarySize;\n      prop.Value = kDictionaryForBCJ2_LZMA;\n      methodFull.Props.Add(prop);\n    }\n    {\n      CProp prop;\n      prop.Id = NCoderPropID::kNumFastBytes;\n      prop.Value = kNumFastBytesForBCJ2_LZMA;\n      methodFull.Props.Add(prop);\n    }\n\n    exeMethod.Methods.Add(methodFull);\n    exeMethod.Methods.Add(methodFull);\n    CBind bind;\n\n    bind.OutCoder = 0;\n    bind.InStream = 0;\n\n    bind.InCoder = 1;\n    bind.OutStream = 0;\n    exeMethod.Binds.Add(bind);\n\n    bind.InCoder = 2;\n    bind.OutStream = 1;\n    exeMethod.Binds.Add(bind);\n\n    bind.InCoder = 3;\n    bind.OutStream = 2;\n    exeMethod.Binds.Add(bind);\n  }\n  else\n  {\n    CMethodFull methodFull;\n    if (!GetMethodFull(k_BCJ, 1, methodFull))\n      return false;\n    exeMethod.Methods.Insert(0, methodFull);\n    CBind bind;\n    bind.OutCoder = 0;\n    bind.InStream = 0;\n    bind.InCoder = 1;\n    bind.OutStream = 0;\n    exeMethod.Binds.Add(bind);\n  }\n  return true;\n}\n\nstatic void SplitFilesToGroups(\n    const CCompressionMethodMode &method,\n    bool useFilters, bool maxFilter,\n    const CObjectVector<CUpdateItem> &updateItems,\n    CObjectVector<CSolidGroup> &groups)\n{\n  if (method.Methods.Size() != 1 || method.Binds.Size() != 0)\n    useFilters = false;\n  groups.Clear();\n  groups.Add(CSolidGroup());\n  groups.Add(CSolidGroup());\n  CSolidGroup &generalGroup = groups[0];\n  CSolidGroup &exeGroup = groups[1];\n  generalGroup.Method = method;\n  int i;\n  for (i = 0; i < updateItems.Size(); i++)\n  {\n    const CUpdateItem &ui = updateItems[i];\n    if (!ui.NewData)\n      continue;\n    if (!ui.HasStream())\n      continue;\n    if (useFilters)\n    {\n#ifdef _WIN32\n      const UString name = ui.Name;\n      int dotPos = name.ReverseFind(L'.');\n      if (dotPos >= 0)\n      {\n        UString ext = name.Mid(dotPos + 1);\n        if (IsExeFile(ext))\n        {\n          exeGroup.Indices.Add(i);\n          continue;\n        }\n      }\n#else\n      if (IsExeFile(ui))\n      {\n        exeGroup.Indices.Add(i);\n        continue;\n      }\n#endif\n    }\n    generalGroup.Indices.Add(i);\n  }\n  if (exeGroup.Indices.Size() > 0)\n    if (!MakeExeMethod(method, maxFilter, exeGroup.Method))\n      exeGroup.Method = method;\n  for (i = 0; i < groups.Size();)\n    if (groups[i].Indices.Size() == 0)\n      groups.Delete(i);\n    else\n      i++;\n}\n\nstatic void FromUpdateItemToFileItem(const CUpdateItem &ui,\n    CFileItem &file, CFileItem2 &file2)\n{\n  file.Name = NItemName::MakeLegalName(ui.Name);\n  if (ui.AttribDefined)\n    file.SetAttrib(ui.Attrib);\n  \n  file2.CTime = ui.CTime;  file2.CTimeDefined = ui.CTimeDefined;\n  file2.ATime = ui.ATime;  file2.ATimeDefined = ui.ATimeDefined;\n  file2.MTime = ui.MTime;  file2.MTimeDefined = ui.MTimeDefined;\n  file2.IsAnti = ui.IsAnti;\n  file2.StartPosDefined = false;\n\n  file.Size = ui.Size;\n  file.IsDir = ui.IsDir;\n  file.HasStream = ui.HasStream();\n}\n\nstatic HRESULT Update2(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream *inStream,\n    const CArchiveDatabaseEx *db,\n    const CObjectVector<CUpdateItem> &updateItems,\n    COutArchive &archive,\n    CArchiveDatabase &newDatabase,\n    ISequentialOutStream *seqOutStream,\n    IArchiveUpdateCallback *updateCallback,\n    const CUpdateOptions &options)\n{\n  UInt64 numSolidFiles = options.NumSolidFiles;\n  if (numSolidFiles == 0)\n    numSolidFiles = 1;\n  /*\n  CMyComPtr<IOutStream> outStream;\n  RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream));\n  if (!outStream)\n    return E_NOTIMPL;\n  */\n\n  UInt64 startBlockSize = db != 0 ? db->ArchiveInfo.StartPosition: 0;\n  if (startBlockSize > 0 && !options.RemoveSfxBlock)\n  {\n    RINOK(WriteRange(inStream, seqOutStream, 0, startBlockSize, NULL));\n  }\n\n  CRecordVector<int> fileIndexToUpdateIndexMap;\n  if (db != 0)\n  {\n    fileIndexToUpdateIndexMap.Reserve(db->Files.Size());\n    for (int i = 0; i < db->Files.Size(); i++)\n      fileIndexToUpdateIndexMap.Add(-1);\n  }\n  int i;\n  for(i = 0; i < updateItems.Size(); i++)\n  {\n    int index = updateItems[i].IndexInArchive;\n    if (index != -1)\n      fileIndexToUpdateIndexMap[index] = i;\n  }\n\n  CRecordVector<int> folderRefs;\n  if (db != 0)\n  {\n    for(i = 0; i < db->Folders.Size(); i++)\n    {\n      CNum indexInFolder = 0;\n      CNum numCopyItems = 0;\n      CNum numUnpackStreams = db->NumUnpackStreamsVector[i];\n      for (CNum fileIndex = db->FolderStartFileIndex[i];\n      indexInFolder < numUnpackStreams; fileIndex++)\n      {\n        if (db->Files[fileIndex].HasStream)\n        {\n          indexInFolder++;\n          int updateIndex = fileIndexToUpdateIndexMap[fileIndex];\n          if (updateIndex >= 0)\n            if (!updateItems[updateIndex].NewData)\n              numCopyItems++;\n        }\n      }\n      if (numCopyItems != numUnpackStreams && numCopyItems != 0)\n        return E_NOTIMPL; // It needs repacking !!!\n      if (numCopyItems > 0)\n        folderRefs.Add(i);\n    }\n    folderRefs.Sort(CompareFolderRefs, (void *)db);\n  }\n\n  ////////////////////////////\n\n  RINOK(archive.Create(seqOutStream, false));\n  RINOK(archive.SkeepPrefixArchiveHeader());\n  UInt64 complexity = 0;\n  for(i = 0; i < folderRefs.Size(); i++)\n    complexity += db->GetFolderFullPackSize(folderRefs[i]);\n  UInt64 inSizeForReduce = 0;\n  for(i = 0; i < updateItems.Size(); i++)\n  {\n    const CUpdateItem &ui = updateItems[i];\n    if (ui.NewData)\n    {\n      complexity += ui.Size;\n      if (numSolidFiles == 1)\n      {\n        if (ui.Size > inSizeForReduce)\n          inSizeForReduce = ui.Size;\n      }\n      else\n        inSizeForReduce += ui.Size;\n    }\n  }\n  RINOK(updateCallback->SetTotal(complexity));\n  complexity = 0;\n  RINOK(updateCallback->SetCompleted(&complexity));\n\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(updateCallback, true);\n\n  /////////////////////////////////////////\n  // Write Copy Items\n\n  for(i = 0; i < folderRefs.Size(); i++)\n  {\n    int folderIndex = folderRefs[i];\n    \n    lps->ProgressOffset = complexity;\n    UInt64 packSize = db->GetFolderFullPackSize(folderIndex);\n    RINOK(WriteRange(inStream, archive.SeqStream,\n        db->GetFolderStreamPos(folderIndex, 0), packSize, progress));\n    complexity += packSize;\n    \n    const CFolder &folder = db->Folders[folderIndex];\n    CNum startIndex = db->FolderStartPackStreamIndex[folderIndex];\n    for (int j = 0; j < folder.PackStreams.Size(); j++)\n    {\n      newDatabase.PackSizes.Add(db->PackSizes[startIndex + j]);\n      // newDatabase.PackCRCsDefined.Add(db.PackCRCsDefined[startIndex + j]);\n      // newDatabase.PackCRCs.Add(db.PackCRCs[startIndex + j]);\n    }\n    newDatabase.Folders.Add(folder);\n\n    CNum numUnpackStreams = db->NumUnpackStreamsVector[folderIndex];\n    newDatabase.NumUnpackStreamsVector.Add(numUnpackStreams);\n\n    CNum indexInFolder = 0;\n    for (CNum fi = db->FolderStartFileIndex[folderIndex];\n        indexInFolder < numUnpackStreams; fi++)\n    {\n      CFileItem file;\n      CFileItem2 file2;\n      db->GetFile(fi, file, file2);\n      if (file.HasStream)\n      {\n        indexInFolder++;\n        int updateIndex = fileIndexToUpdateIndexMap[fi];\n        if (updateIndex >= 0)\n        {\n          const CUpdateItem &ui = updateItems[updateIndex];\n          if (ui.NewProperties)\n          {\n            CFileItem uf;\n            FromUpdateItemToFileItem(ui, uf, file2);\n            uf.Size = file.Size;\n            uf.Crc = file.Crc;\n            uf.CrcDefined = file.CrcDefined;\n            uf.HasStream = file.HasStream;\n            file = uf;\n          }\n        }\n        newDatabase.AddFile(file, file2);\n      }\n    }\n  }\n\n  folderRefs.ClearAndFree();\n  fileIndexToUpdateIndexMap.ClearAndFree();\n\n  /////////////////////////////////////////\n  // Compress New Files\n\n  CObjectVector<CSolidGroup> groups;\n  SplitFilesToGroups(*options.Method, options.UseFilters, options.MaxFilter,\n      updateItems, groups);\n\n  const UInt32 kMinReduceSize = (1 << 16);\n  if (inSizeForReduce < kMinReduceSize)\n    inSizeForReduce = kMinReduceSize;\n\n  for (int groupIndex = 0; groupIndex < groups.Size(); groupIndex++)\n  {\n    const CSolidGroup &group = groups[groupIndex];\n    int numFiles = group.Indices.Size();\n    if (numFiles == 0)\n      continue;\n    CRecordVector<CRefItem> refItems;\n    refItems.Reserve(numFiles);\n    bool sortByType = (numSolidFiles > 1);\n    for (i = 0; i < numFiles; i++)\n      refItems.Add(CRefItem(group.Indices[i], updateItems[group.Indices[i]], sortByType));\n    refItems.Sort(CompareUpdateItems, (void *)&sortByType);\n    \n    CRecordVector<UInt32> indices;\n    indices.Reserve(numFiles);\n\n    for (i = 0; i < numFiles; i++)\n    {\n      UInt32 index = refItems[i].Index;\n      indices.Add(index);\n      /*\n      const CUpdateItem &ui = updateItems[index];\n      CFileItem file;\n      if (ui.NewProperties)\n        FromUpdateItemToFileItem(ui, file);\n      else\n        file = db.Files[ui.IndexInArchive];\n      if (file.IsAnti || file.IsDir)\n        return E_FAIL;\n      newDatabase.Files.Add(file);\n      */\n    }\n    \n    CEncoder encoder(group.Method);\n\n    for (i = 0; i < numFiles;)\n    {\n      UInt64 totalSize = 0;\n      int numSubFiles;\n      UString prevExtension;\n      for (numSubFiles = 0; i + numSubFiles < numFiles &&\n          numSubFiles < numSolidFiles; numSubFiles++)\n      {\n        const CUpdateItem &ui = updateItems[indices[i + numSubFiles]];\n        totalSize += ui.Size;\n        if (totalSize > options.NumSolidBytes)\n          break;\n        if (options.SolidExtension)\n        {\n          UString ext = ui.GetExtension();\n          if (numSubFiles == 0)\n            prevExtension = ext;\n          else\n            if (ext.CompareNoCase(prevExtension) != 0)\n              break;\n        }\n      }\n      if (numSubFiles < 1)\n        numSubFiles = 1;\n\n      CFolderInStream *inStreamSpec = new CFolderInStream;\n      CMyComPtr<ISequentialInStream> solidInStream(inStreamSpec);\n      inStreamSpec->Init(updateCallback, &indices[i], numSubFiles);\n      \n      CFolder folderItem;\n\n      int startPackIndex = newDatabase.PackSizes.Size();\n      RINOK(encoder.Encode(\n          EXTERNAL_CODECS_LOC_VARS\n          solidInStream, NULL, &inSizeForReduce, folderItem,\n          archive.SeqStream, newDatabase.PackSizes, progress));\n\n      for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++)\n        lps->OutSize += newDatabase.PackSizes[startPackIndex];\n\n      lps->InSize += folderItem.GetUnpackSize();\n      // for()\n      // newDatabase.PackCRCsDefined.Add(false);\n      // newDatabase.PackCRCs.Add(0);\n      \n      newDatabase.Folders.Add(folderItem);\n      \n      CNum numUnpackStreams = 0;\n      for (int subIndex = 0; subIndex < numSubFiles; subIndex++)\n      {\n        const CUpdateItem &ui = updateItems[indices[i + subIndex]];\n        CFileItem file;\n        CFileItem2 file2;\n        if (ui.NewProperties)\n          FromUpdateItemToFileItem(ui, file, file2);\n        else\n          db->GetFile(ui.IndexInArchive, file, file2);\n        if (file2.IsAnti || file.IsDir)\n          return E_FAIL;\n        \n        /*\n        CFileItem &file = newDatabase.Files[\n              startFileIndexInDatabase + i + subIndex];\n        */\n        if (!inStreamSpec->Processed[subIndex])\n        {\n          continue;\n          // file.Name += L\".locked\";\n        }\n\n        file.Crc = inStreamSpec->CRCs[subIndex];\n        file.Size = inStreamSpec->Sizes[subIndex];\n        if (file.Size != 0)\n        {\n          file.CrcDefined = true;\n          file.HasStream = true;\n          numUnpackStreams++;\n        }\n        else\n        {\n          file.CrcDefined = false;\n          file.HasStream = false;\n        }\n        newDatabase.AddFile(file, file2);\n      }\n      // numUnpackStreams = 0 is very bad case for locked files\n      // v3.13 doesn't understand it.\n      newDatabase.NumUnpackStreamsVector.Add(numUnpackStreams);\n      i += numSubFiles;\n    }\n  }\n\n  groups.ClearAndFree();\n\n  {\n    /////////////////////////////////////////\n    // Write Empty Files & Folders\n    \n    CRecordVector<int> emptyRefs;\n    for(i = 0; i < updateItems.Size(); i++)\n    {\n      const CUpdateItem &ui = updateItems[i];\n      if (ui.NewData)\n      {\n        if (ui.HasStream())\n          continue;\n      }\n      else\n        if (ui.IndexInArchive != -1)\n          if (db->Files[ui.IndexInArchive].HasStream)\n            continue;\n      emptyRefs.Add(i);\n    }\n    emptyRefs.Sort(CompareEmptyItems, (void *)&updateItems);\n    for (i = 0; i < emptyRefs.Size(); i++)\n    {\n      const CUpdateItem &ui = updateItems[emptyRefs[i]];\n      CFileItem file;\n      CFileItem2 file2;\n      if (ui.NewProperties)\n        FromUpdateItemToFileItem(ui, file, file2);\n      else\n        db->GetFile(ui.IndexInArchive, file, file2);\n      newDatabase.AddFile(file, file2);\n    }\n  }\n    \n  newDatabase.ReserveDown();\n  return S_OK;\n}\n\nHRESULT Update(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream *inStream,\n    const CArchiveDatabaseEx *db,\n    const CObjectVector<CUpdateItem> &updateItems,\n    COutArchive &archive,\n    CArchiveDatabase &newDatabase,\n    ISequentialOutStream *seqOutStream,\n    IArchiveUpdateCallback *updateCallback,\n    const CUpdateOptions &options)\n{\n  return Update2(\n        EXTERNAL_CODECS_LOC_VARS\n        inStream, db, updateItems,\n        archive, newDatabase, seqOutStream, updateCallback, options);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/7z/7zUpdate.h",
    "content": "// 7zUpdate.h\n\n#ifndef __7Z_UPDATE_H\n#define __7Z_UPDATE_H\n\n#include \"7zIn.h\"\n#include \"7zOut.h\"\n#include \"7zCompressionMode.h\"\n\n#include \"../IArchive.h\"\n\nnamespace NArchive {\nnamespace N7z {\n\nstruct CUpdateItem\n{\n  int IndexInArchive;\n  int IndexInClient;\n  \n  UInt64 CTime;\n  UInt64 ATime;\n  UInt64 MTime;\n\n  UInt64 Size;\n  UString Name;\n\n  UInt32 Attrib;\n  \n  bool NewData;\n  bool NewProperties;\n\n  bool IsAnti;\n  bool IsDir;\n\n  bool AttribDefined;\n  bool CTimeDefined;\n  bool ATimeDefined;\n  bool MTimeDefined;\n\n  bool HasStream() const { return !IsDir && !IsAnti && Size != 0; }\n\n  CUpdateItem():\n      IsAnti(false),\n      IsDir(false),\n      AttribDefined(false),\n      CTimeDefined(false),\n      ATimeDefined(false),\n      MTimeDefined(false)\n      {}\n  void SetDirStatusFromAttrib() { IsDir = ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0); };\n\n  int GetExtensionPos() const;\n  UString GetExtension() const;\n};\n\nstruct CUpdateOptions\n{\n  const CCompressionMethodMode *Method;\n  const CCompressionMethodMode *HeaderMethod;\n  bool UseFilters;\n  bool MaxFilter;\n\n  CHeaderOptions HeaderOptions;\n\n  UInt64 NumSolidFiles;\n  UInt64 NumSolidBytes;\n  bool SolidExtension;\n  bool RemoveSfxBlock;\n  bool VolumeMode;\n};\n\nHRESULT Update(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream *inStream,\n    const CArchiveDatabaseEx *db,\n    const CObjectVector<CUpdateItem> &updateItems,\n    COutArchive &archive,\n    CArchiveDatabase &newDatabase,\n    ISequentialOutStream *seqOutStream,\n    IArchiveUpdateCallback *updateCallback,\n    const CUpdateOptions &options);\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/ArchiveExports.cpp",
    "content": "// ArchiveExports.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/ComTry.h\"\n#include \"../../Common/Types.h\"\n#include \"../../Windows/PropVariant.h\"\n#include \"../Common/RegisterArc.h\"\n//#include \"../Common/InitializeStaticLib.h\" // important! (if using a static lib)\n\n#include \"IArchive.h\"\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\nstatic const unsigned int kNumArcsMax = 32;\nstatic unsigned int g_NumArcs = 0;\nstatic const CArcInfo *g_Arcs[kNumArcsMax];\nvoid RegisterArc(const CArcInfo *arcInfo)\n{\n  if (g_NumArcs < kNumArcsMax)\n    g_Arcs[g_NumArcs++] = arcInfo;\n}\n\nDEFINE_GUID(CLSID_CArchiveHandler,\n0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00);\n\n#define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5])\n\nstatic inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value)\n{\n  if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0)\n    value->vt = VT_BSTR;\n  return S_OK;\n}\n\nstatic inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value)\n{\n  return SetPropString((const char *)&guid, sizeof(GUID), value);\n}\n\nint FindFormatCalssId(const GUID *clsID)\n{\n  GUID cls = *clsID;\n  CLS_ARC_ID_ITEM(cls) = 0;\n  if (cls != CLSID_CArchiveHandler)\n    return -1;\n  Byte id = CLS_ARC_ID_ITEM(*clsID);\n  for (unsigned i = 0; i < g_NumArcs; i++)\n    if (g_Arcs[i]->ClassId == id)\n      return (int)i;\n  return -1;\n}\n\nSTDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject)\n{\n  COM_TRY_BEGIN\n  {\n    int needIn = (*iid == IID_IInArchive);\n    int needOut = (*iid == IID_IOutArchive);\n    if (!needIn && !needOut)\n      return E_NOINTERFACE;\n    int formatIndex = FindFormatCalssId(clsid);\n    if (formatIndex < 0)\n      return CLASS_E_CLASSNOTAVAILABLE;\n    \n    const CArcInfo &arc = *g_Arcs[formatIndex];\n    if (needIn)\n    {\n      *outObject = arc.CreateInArchive();\n      ((IInArchive *)*outObject)->AddRef();\n    }\n    else\n    {\n      if (!arc.CreateOutArchive)\n        return CLASS_E_CLASSNOTAVAILABLE;\n      *outObject = arc.CreateOutArchive();\n      ((IOutArchive *)*outObject)->AddRef();\n    }\n  }\n  COM_TRY_END\n  return S_OK;\n}\n\nSTDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value)\n{\n  if (formatIndex >= g_NumArcs)\n    return E_INVALIDARG;\n  const CArcInfo &arc = *g_Arcs[formatIndex];\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case NArchive::kName:\n      prop = arc.Name;\n      break;\n    case NArchive::kClassID:\n    {\n      GUID clsId = CLSID_CArchiveHandler;\n      CLS_ARC_ID_ITEM(clsId) = arc.ClassId;\n      return SetPropGUID(clsId, value);\n    }\n    case NArchive::kExtension:\n      if (arc.Ext != 0)\n        prop = arc.Ext;\n      break;\n    case NArchive::kAddExtension:\n      if (arc.AddExt != 0)\n        prop = arc.AddExt;\n      break;\n    case NArchive::kUpdate:\n      prop = (bool)(arc.CreateOutArchive != 0);\n      break;\n    case NArchive::kKeepName:\n      prop = arc.KeepName;\n      break;\n    case NArchive::kStartSignature:\n      return SetPropString((const char *)arc.Signature, arc.SignatureSize, value);\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nSTDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value)\n{\n  return GetHandlerProperty2(0, propID, value);\n}\n\nSTDAPI GetNumberOfFormats(UINT32 *numFormats)\n{\n  *numFormats = g_NumArcs;\n  return S_OK;\n}\n\nextern \"C\"\n{\n#include \"../../../C/7zCrc.h\"\n}\n\nvoid RegisterZip();\nvoid RegisterDeflate();\nvoid Register7z();\nvoid RegisterLzma();\nvoid RegisterRarCodecs();\nvoid RegisterRar();\nvoid RegisterBZip2();\nvoid RegisterBZip2Codec();\n\nvoid Do7ZipRegistration()\n{\n\tCrcGenerateTable();\n\tRegisterZip();\n\tRegisterDeflate();\n\tRegister7z();\n\tRegisterLzma();\n\tRegisterRar();\n\tRegisterRarCodecs();\n\tRegisterBZip2();\n\tRegisterBZip2Codec();\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/ArjHandler.cpp",
    "content": "// ArjHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamObjects.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/ArjDecoder1.h\"\n#include \"../Compress/ArjDecoder2.h\"\n#include \"../Compress/CopyCoder.h\"\n\n#include \"Common/ItemNameUtils.h\"\n#include \"Common/OutStreamWithCRC.h\"\n\nusing namespace NWindows;\n\n#define Get16(p) GetUi16(p)\n#define Get32(p) GetUi32(p)\n\nnamespace NArchive {\nnamespace NArj {\n\nconst int kBlockSizeMin = 30;\nconst int kBlockSizeMax = 2600;\n\nnamespace NSignature\n{\n  const Byte kSig0 = 0x60;\n  const Byte kSig1 = 0xEA;\n}\n\nnamespace NFileHeader\n{\n  namespace NCompressionMethod\n  {\n    enum\n    {\n      kStored = 0,\n      kCompressed1a = 1,\n      kCompressed1b = 2,\n      kCompressed1c = 3,\n      kCompressed2 = 4,\n      kNoDataNoCRC = 8,\n      kNoData = 9\n    };\n  }\n\n  namespace NFileType\n  {\n    enum\n    {\n      kBinary = 0,\n      k7BitText = 1,\n      kArchiveHeader = 2,\n      kDirectory = 3,\n      kVolumeLablel = 4,\n      kChapterLabel = 5\n    };\n  }\n  \n  namespace NFlags\n  {\n    const Byte kGarbled = 1;\n    const Byte kVolume = 4;\n    const Byte kExtFile = 8;\n    const Byte kPathSym = 0x10;\n    const Byte kBackup = 0x20;\n  }\n\n  namespace NHostOS\n  {\n    enum EEnum\n    {\n      kMSDOS = 0,  // filesystem used by MS-DOS, OS/2, Win32\n          // pkarj 2.50 (FAT / VFAT / FAT32 file systems)\n      kPRIMOS,\n      kUnix,\n      kAMIGA,\n      kMac,\n      kOS_2,\n      kAPPLE_GS,\n      kAtari_ST,\n      kNext,\n      kVAX_VMS,\n      kWIN95\n    };\n  }\n}\n\nstruct CArchiveHeader\n{\n  // Byte ArchiverVersion;\n  // Byte ExtractVersion;\n  Byte HostOS;\n  // Byte Flags;\n  // Byte SecuryVersion;\n  // Byte FileType;\n  // Byte Reserved;\n  UInt32 CTime;\n  UInt32 MTime;\n  UInt32 ArchiveSize;\n  // UInt32 SecurityEnvelopeFilePosition;\n  // UInt16 FilespecPositionInFilename;\n  // UInt16 LengthOfSecurityEnvelopeSata;\n  // Byte EncryptionVersion;\n  // Byte LastChapter;\n  AString Name;\n  AString Comment;\n  \n  HRESULT Parse(const Byte *p, unsigned size);\n};\n\nstatic HRESULT ReadString(const Byte *p, unsigned &size, AString &res)\n{\n  AString s;\n  for (unsigned i = 0; i < size;)\n  {\n    char c = (char)p[i++];\n    if (c == 0)\n    {\n      size = i;\n      res = s;\n      return S_OK;\n    }\n    s += c;\n  }\n  return S_FALSE;\n}\n\nHRESULT CArchiveHeader::Parse(const Byte *p, unsigned size)\n{\n  if (size < kBlockSizeMin)\n    return S_FALSE;\n  Byte firstHeaderSize = p[0];\n  if (firstHeaderSize > size)\n    return S_FALSE;\n  // ArchiverVersion = p[1];\n  // ExtractVersion = p[2];\n  HostOS = p[3];\n  // Flags = p[4];\n  // SecuryVersion = p[5];\n  if (p[6] != NFileHeader::NFileType::kArchiveHeader)\n    return S_FALSE;\n  // Reserved = p[7];\n  CTime = Get32(p + 8);\n  MTime = Get32(p + 12);\n  ArchiveSize = Get32(p + 16);\n  // SecurityEnvelopeFilePosition = Get32(p + 20);\n  // UInt16 filespecPositionInFilename = Get16(p + 24);\n  // LengthOfSecurityEnvelopeSata = Get16(p + 26);\n  // EncryptionVersion = p[28];\n  // LastChapter = p[29];\n  unsigned pos = firstHeaderSize;\n  unsigned size1 = size - pos;\n  RINOK(ReadString(p + pos, size1, Name));\n  pos += size1;\n  size1 = size - pos;\n  RINOK(ReadString(p + pos, size1, Comment));\n  pos += size1;\n  return S_OK;\n}\n\nstruct CItem\n{\n  AString Name;\n  AString Comment;\n\n  UInt32 MTime;\n  UInt32 PackSize;\n  UInt32 Size;\n  UInt32 FileCRC;\n\n  Byte Version;\n  Byte ExtractVersion;\n  Byte HostOS;\n  Byte Flags;\n  Byte Method;\n  Byte FileType;\n\n  // UInt16 FilespecPositionInFilename;\n  UInt16 FileAccessMode;\n  // Byte FirstChapter;\n  // Byte LastChapter;\n  \n  UInt64 DataPosition;\n  \n  bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kGarbled) != 0; }\n  bool IsDir() const { return (FileType == NFileHeader::NFileType::kDirectory); }\n  UInt32 GetWinAttributes() const\n  {\n    UInt32 winAtrributes;\n    switch(HostOS)\n    {\n      case NFileHeader::NHostOS::kMSDOS:\n      case NFileHeader::NHostOS::kWIN95:\n        winAtrributes = FileAccessMode;\n        break;\n      default:\n        winAtrributes = 0;\n    }\n    if (IsDir())\n      winAtrributes |= FILE_ATTRIBUTE_DIRECTORY;\n    return winAtrributes;\n  }\n\n  HRESULT Parse(const Byte *p, unsigned size);\n};\n\nHRESULT CItem::Parse(const Byte *p, unsigned size)\n{\n  if (size < kBlockSizeMin)\n    return S_FALSE;\n\n  Byte firstHeaderSize = p[0];\n\n  Version = p[1];\n  ExtractVersion = p[2];\n  HostOS = p[3];\n  Flags = p[4];\n  Method = p[5];\n  FileType = p[6];\n  // Reserved = p[7];\n  MTime = Get32(p + 8);\n  PackSize = Get32(p + 12);\n  Size = Get32(p + 16);\n  FileCRC = Get32(p + 20);\n  // FilespecPositionInFilename = Get16(p + 24);\n  FileAccessMode = Get16(p + 26);\n  // FirstChapter = p[28];\n  // FirstChapter = p[29];\n\n  unsigned pos = firstHeaderSize;\n  unsigned size1 = size - pos;\n  RINOK(ReadString(p + pos, size1, Name));\n  pos += size1;\n  size1 = size - pos;\n  RINOK(ReadString(p + pos, size1, Comment));\n  pos += size1;\n\n  return S_OK;\n}\n\nstruct CInArchiveException\n{\n  enum CCauseType\n  {\n    kUnexpectedEndOfArchive = 0,\n    kCRCError,\n    kIncorrectArchive,\n  }\n  Cause;\n  CInArchiveException(CCauseType cause): Cause(cause) {};\n};\n\nclass CInArchive\n{\n  UInt32 _blockSize;\n  Byte _block[kBlockSizeMax + 4];\n  \n  HRESULT ReadBlock(bool &filled);\n  HRESULT ReadSignatureAndBlock(bool &filled);\n  HRESULT SkeepExtendedHeaders();\n\n  HRESULT SafeReadBytes(void *data, UInt32 size);\n    \npublic:\n  CArchiveHeader Header;\n\n  IInStream *Stream;\n  IArchiveOpenCallback *Callback;\n  UInt64 NumFiles;\n  UInt64 NumBytes;\n\n  HRESULT Open(const UInt64 *searchHeaderSizeLimit);\n  HRESULT GetNextItem(bool &filled, CItem &item);\n};\n\nstatic inline bool TestMarkerCandidate(const Byte *p, unsigned maxSize)\n{\n  if (p[0] != NSignature::kSig0 || p[1] != NSignature::kSig1)\n    return false;\n  UInt32 blockSize = Get16(p + 2);\n  p += 4;\n  if (p[6] != NFileHeader::NFileType::kArchiveHeader ||\n      p[0] > blockSize ||\n      maxSize < 2 + 2 + blockSize + 4 ||\n      blockSize < kBlockSizeMin || blockSize > kBlockSizeMax ||\n      p[28] > 8) // EncryptionVersion\n    return false;\n  // return (Get32(p + blockSize) == CrcCalc(p, blockSize));\n  return true;\n}\n\nstatic HRESULT FindAndReadMarker(ISequentialInStream *stream, const UInt64 *searchHeaderSizeLimit, UInt64 &position)\n{\n  position = 0;\n\n  const int kMarkerSizeMin = 2 + 2 + kBlockSizeMin + 4;\n  const int kMarkerSizeMax = 2 + 2 + kBlockSizeMax + 4;\n\n  CByteBuffer byteBuffer;\n  const UInt32 kBufSize = 1 << 16;\n  byteBuffer.SetCapacity(kBufSize);\n  Byte *buf = byteBuffer;\n\n  size_t processedSize = kMarkerSizeMax;\n  RINOK(ReadStream(stream, buf, &processedSize));\n  if (processedSize < kMarkerSizeMin)\n    return S_FALSE;\n  if (TestMarkerCandidate(buf, (unsigned)processedSize))\n    return S_OK;\n\n  UInt32 numBytesPrev = (UInt32)processedSize - 1;\n  memmove(buf, buf + 1, numBytesPrev);\n  UInt64 curTestPos = 1;\n  for (;;)\n  {\n    if (searchHeaderSizeLimit != NULL)\n      if (curTestPos > *searchHeaderSizeLimit)\n        return S_FALSE;\n    processedSize = kBufSize - numBytesPrev;\n    RINOK(ReadStream(stream, buf + numBytesPrev, &processedSize));\n    UInt32 numBytesInBuffer = numBytesPrev + (UInt32)processedSize;\n    if (numBytesInBuffer < kMarkerSizeMin)\n      return S_FALSE;\n    UInt32 numTests = numBytesInBuffer - kMarkerSizeMin + 1;\n    UInt32 pos;\n    for (pos = 0; pos < numTests; pos++)\n    {\n      for (; buf[pos] != NSignature::kSig0 && pos < numTests; pos++);\n      if (pos == numTests)\n        break;\n      if (TestMarkerCandidate(buf + pos, numBytesInBuffer - pos))\n      {\n        position = curTestPos + pos;\n        return S_OK;\n      }\n    }\n    curTestPos += pos;\n    numBytesPrev = numBytesInBuffer - numTests;\n    memmove(buf, buf + numTests, numBytesPrev);\n  }\n}\n\nHRESULT CInArchive::SafeReadBytes(void *data, UInt32 size)\n{\n  size_t processed = size;\n  RINOK(ReadStream(Stream, data, &processed));\n  if (processed != size)\n    throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadBlock(bool &filled)\n{\n  filled = false;\n  Byte buf[2];\n  RINOK(SafeReadBytes(buf, 2));\n  _blockSize = Get16(buf);\n  if (_blockSize == 0)\n    return S_OK;\n  if (_blockSize > kBlockSizeMax)\n    throw CInArchiveException(CInArchiveException::kIncorrectArchive);\n  RINOK(SafeReadBytes(_block, _blockSize + 4));\n  NumBytes += _blockSize + 6;\n  if (Get32(_block + _blockSize) != CrcCalc(_block, _blockSize))\n    throw CInArchiveException(CInArchiveException::kCRCError);\n  filled = true;\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadSignatureAndBlock(bool &filled)\n{\n  Byte id[2];\n  RINOK(SafeReadBytes(id, 2));\n  if (id[0] != NSignature::kSig0 || id[1] != NSignature::kSig1)\n    throw CInArchiveException(CInArchiveException::kIncorrectArchive);\n  return ReadBlock(filled);\n}\n\nHRESULT CInArchive::SkeepExtendedHeaders()\n{\n  for (UInt32 i = 0;; i++)\n  {\n    bool filled;\n    RINOK(ReadBlock(filled));\n    if (!filled)\n      return S_OK;\n    if (Callback && (i & 0xFF) == 0)\n      RINOK(Callback->SetCompleted(&NumFiles, &NumBytes));\n  }\n}\n\nHRESULT CInArchive::Open(const UInt64 *searchHeaderSizeLimit)\n{\n  UInt64 position = 0;\n  RINOK(FindAndReadMarker(Stream, searchHeaderSizeLimit, position));\n  RINOK(Stream->Seek(position, STREAM_SEEK_SET, NULL));\n  bool filled;\n  RINOK(ReadSignatureAndBlock(filled));\n  if (!filled)\n    return S_FALSE;\n  RINOK(Header.Parse(_block, _blockSize));\n  return SkeepExtendedHeaders();\n}\n\nHRESULT CInArchive::GetNextItem(bool &filled, CItem &item)\n{\n  RINOK(ReadSignatureAndBlock(filled));\n  if (!filled)\n    return S_OK;\n  filled = false;\n  RINOK(item.Parse(_block, _blockSize));\n  /*\n  UInt32 extraData;\n  if ((header.Flags & NFileHeader::NFlags::kExtFile) != 0)\n    extraData = GetUi32(_block + pos);\n  */\n\n  RINOK(SkeepExtendedHeaders());\n  filled = true;\n  return S_OK;\n}\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n\n  INTERFACE_IInArchive(;)\n\n  HRESULT Open2(IInStream *inStream, const UInt64 *maxCheckStartPosition,\n      IArchiveOpenCallback *callback);\nprivate:\n  CInArchive _archive;\n  CObjectVector<CItem> _items;\n  CMyComPtr<IInStream> _stream;\n};\n\nconst wchar_t *kHostOS[] =\n{\n  L\"MSDOS\",\n  L\"PRIMOS\",\n  L\"UNIX\",\n  L\"AMIGA\",\n  L\"MAC\",\n  L\"OS/2\",\n  L\"APPLE GS\",\n  L\"ATARI ST\",\n  L\"NEXT\",\n  L\"VAX VMS\",\n  L\"WIN95\"\n};\n\nconst wchar_t *kUnknownOS = L\"Unknown\";\n\nconst int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidName, VT_BSTR},\n  { NULL, kpidCTime, VT_BSTR},\n  { NULL, kpidMTime, VT_BSTR},\n  { NULL, kpidHostOS, VT_BSTR},\n  { NULL, kpidComment, VT_BSTR}\n};\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidAttrib, VT_UI4},\n  { NULL, kpidEncrypted, VT_BOOL},\n  { NULL, kpidCRC, VT_UI4},\n  { NULL, kpidMethod, VT_UI1},\n  { NULL, kpidHostOS, VT_BSTR},\n  { NULL, kpidComment, VT_BSTR}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nstatic void SetTime(UInt32 dosTime, NWindows::NCOM::CPropVariant &prop)\n{\n  if (dosTime == 0)\n    return;\n  FILETIME localFileTime, utc;\n  if (NTime::DosTimeToFileTime(dosTime, localFileTime))\n  {\n    if (!LocalFileTimeToFileTime(&localFileTime, &utc))\n      utc.dwHighDateTime = utc.dwLowDateTime = 0;\n  }\n  else\n    utc.dwHighDateTime = utc.dwLowDateTime = 0;\n  prop = utc;\n}\n\nstatic void SetHostOS(Byte hostOS, NWindows::NCOM::CPropVariant &prop)\n{\n  prop = hostOS < kNumHostOSes ? kHostOS[hostOS] : kUnknownOS;\n}\n\nstatic void SetUnicodeString(const AString &s, NWindows::NCOM::CPropVariant &prop)\n{\n  if (!s.IsEmpty())\n    prop = MultiByteToUnicodeString(s, CP_OEMCP);\n}\n \nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidName:  SetUnicodeString(_archive.Header.Name, prop); break;\n    case kpidCTime:  SetTime(_archive.Header.CTime, prop); break;\n    case kpidMTime:  SetTime(_archive.Header.MTime, prop); break;\n    case kpidHostOS:  SetHostOS(_archive.Header.HostOS, prop); break;\n    case kpidComment:  SetUnicodeString(_archive.Header.Comment, prop); break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _items.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CItem &item = _items[index];\n  switch(propID)\n  {\n    case kpidPath:  prop = NItemName::GetOSName(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;\n    case kpidIsDir:  prop = item.IsDir(); break;\n    case kpidSize:  prop = item.Size; break;\n    case kpidPackSize:  prop = item.PackSize; break;\n    case kpidAttrib:  prop = item.GetWinAttributes(); break;\n    case kpidEncrypted:  prop = item.IsEncrypted(); break;\n    case kpidCRC:  prop = item.FileCRC; break;\n    case kpidMethod:  prop = item.Method; break;\n    case kpidHostOS:  SetHostOS(item.HostOS, prop); break;\n    case kpidMTime:  SetTime(item.MTime, prop); break;\n    case kpidComment:  SetUnicodeString(item.Comment, prop); break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nHRESULT CHandler::Open2(IInStream *inStream, const UInt64 *maxCheckStartPosition,\n      IArchiveOpenCallback *callback)\n{\n  Close();\n  \n  UInt64 endPos = 0;\n  if (callback != NULL)\n  {\n    RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos));\n    RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));\n  }\n  \n  _archive.Stream = inStream;\n  _archive.Callback = callback;\n  _archive.NumFiles = _archive.NumBytes = 0;\n\n  RINOK(_archive.Open(maxCheckStartPosition));\n  if (callback != NULL)\n    RINOK(callback->SetTotal(NULL, &endPos));\n  for (;;)\n  {\n    CItem item;\n    bool filled;\n\n\n    RINOK(_archive.GetNextItem(filled, item));\n    \n    RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &item.DataPosition));\n    \n    if (!filled)\n      break;\n    _items.Add(item);\n    \n    if (inStream->Seek(item.PackSize, STREAM_SEEK_CUR, NULL) != S_OK)\n      throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);\n\n    _archive.NumFiles = _items.Size();\n    _archive.NumBytes = item.DataPosition;\n    \n    if (callback != NULL && _items.Size() % 100 == 0)\n    {\n      RINOK(callback->SetCompleted(&_archive.NumFiles, &_archive.NumBytes));\n    }\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback)\n{\n  COM_TRY_BEGIN\n  HRESULT res;\n  try\n  {\n    res = Open2(inStream, maxCheckStartPosition, callback);\n    if (res == S_OK)\n    {\n      _stream = inStream;\n      return S_OK;\n    }\n  }\n  catch(const CInArchiveException &) { res = S_FALSE; }\n  Close();\n  return res;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _items.Clear();\n  _stream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 testModeSpec, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (testModeSpec != 0);\n  UInt64 totalUnpacked = 0, totalPacked = 0;\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _items.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n  {\n    const CItem &item = _items[allFilesMode ? i : indices[i]];\n    totalUnpacked += item.Size;\n    totalPacked += item.PackSize;\n  }\n  extractCallback->SetTotal(totalUnpacked);\n\n  totalUnpacked = totalPacked = 0;\n  UInt64 curUnpacked, curPacked;\n  \n  CMyComPtr<ICompressCoder> arj1Decoder;\n  CMyComPtr<ICompressCoder> arj2Decoder;\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *inStreamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(inStreamSpec);\n  inStreamSpec->SetStream(_stream);\n\n  for (i = 0; i < numItems; i++, totalUnpacked += curUnpacked, totalPacked += curPacked)\n  {\n    lps->InSize = totalPacked;\n    lps->OutSize = totalUnpacked;\n    RINOK(lps->SetCur());\n\n    curUnpacked = curPacked = 0;\n\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NExtract::NAskMode::kTest :\n        NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n    const CItem &item = _items[index];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    if (item.IsDir())\n    {\n      // if (!testMode)\n      {\n        RINOK(extractCallback->PrepareOperation(askMode));\n        RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));\n      }\n      continue;\n    }\n\n    if (!testMode && (!realOutStream))\n      continue;\n\n    RINOK(extractCallback->PrepareOperation(askMode));\n    curUnpacked = item.Size;\n    curPacked = item.PackSize;\n\n    {\n      COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;\n      CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n      outStreamSpec->SetStream(realOutStream);\n      realOutStream.Release();\n      outStreamSpec->Init();\n  \n      inStreamSpec->Init(item.PackSize);\n      \n      UInt64 pos;\n      _stream->Seek(item.DataPosition, STREAM_SEEK_SET, &pos);\n\n      HRESULT result = S_OK;\n      Int32 opRes = NExtract::NOperationResult::kOK;\n\n      if (item.IsEncrypted())\n        opRes = NExtract::NOperationResult::kUnSupportedMethod;\n      else\n      {\n        switch(item.Method)\n        {\n          case NFileHeader::NCompressionMethod::kStored:\n          {\n            result = copyCoder->Code(inStream, outStream, NULL, NULL, progress);\n            if (result == S_OK && copyCoderSpec->TotalSize != item.PackSize)\n              result = S_FALSE;\n            break;\n          }\n          case NFileHeader::NCompressionMethod::kCompressed1a:\n          case NFileHeader::NCompressionMethod::kCompressed1b:\n          case NFileHeader::NCompressionMethod::kCompressed1c:\n          {\n            if (!arj1Decoder)\n              arj1Decoder = new NCompress::NArj::NDecoder1::CCoder;\n            result = arj1Decoder->Code(inStream, outStream, NULL, &curUnpacked, progress);\n            break;\n          }\n          case NFileHeader::NCompressionMethod::kCompressed2:\n          {\n            if (!arj2Decoder)\n              arj2Decoder = new NCompress::NArj::NDecoder2::CCoder;\n            result = arj2Decoder->Code(inStream, outStream, NULL, &curUnpacked, progress);\n            break;\n          }\n          default:\n            opRes = NExtract::NOperationResult::kUnSupportedMethod;\n        }\n      }\n      if (opRes == NExtract::NOperationResult::kOK)\n      {\n        if (result == S_FALSE)\n          opRes = NExtract::NOperationResult::kDataError;\n        else\n        {\n          RINOK(result);\n          opRes = (outStreamSpec->GetCRC() == item.FileCRC) ?\n              NExtract::NOperationResult::kOK:\n              NExtract::NOperationResult::kCRCError;\n        }\n      }\n      outStream.Release();\n      RINOK(extractCallback->SetOperationResult(opRes));\n    }\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Arj\", L\"arj\", 0, 4, { 0x60, 0xEA }, 2, false, CreateArc, 0 };\n\nREGISTER_ARC(Arj)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/BZip2/BZip2Handler.cpp",
    "content": "// BZip2Handler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../Common/DummyOutStream.h\"\n\n#include \"BZip2Handler.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NBZip2 {\n\nstatic const CMethodId kMethodId_BZip2 = 0x040202;\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPackSize, VT_UI8}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = 1;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID,  PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidPackSize: prop = _item.PackSize; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n\n    RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_streamStartPosition));\n    const int kSignatureSize = 3;\n    Byte buffer[kSignatureSize];\n    RINOK(ReadStream_FALSE(stream, buffer, kSignatureSize));\n    if (buffer[0] != 'B' || buffer[1] != 'Z' || buffer[2] != 'h')\n      return S_FALSE;\n\n    UInt64 endPosition;\n    RINOK(stream->Seek(0, STREAM_SEEK_END, &endPosition));\n    _item.PackSize = endPosition - _streamStartPosition;\n    \n    _stream = stream;\n  \n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _stream.Release();\n  return S_OK;\n}\n\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 testModeSpec, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (!allFilesMode)\n  {\n    if (numItems == 0)\n      return S_OK;\n    if (numItems != 1)\n      return E_INVALIDARG;\n    if (indices[0] != 0)\n      return E_INVALIDARG;\n  }\n\n  bool testMode = (testModeSpec != 0);\n\n  extractCallback->SetTotal(_item.PackSize);\n\n  UInt64 currentTotalPacked = 0;\n  \n  RINOK(extractCallback->SetCompleted(&currentTotalPacked));\n  \n  CMyComPtr<ISequentialOutStream> realOutStream;\n  Int32 askMode;\n  askMode = testMode ? NExtract::NAskMode::kTest :\n  NExtract::NAskMode::kExtract;\n  \n  RINOK(extractCallback->GetStream(0, &realOutStream, askMode));\n    \n  if(!testMode && !realOutStream)\n    return S_OK;\n\n\n  extractCallback->PrepareOperation(askMode);\n\n  CMyComPtr<ICompressCoder> decoder;\n  HRESULT loadResult = CreateCoder(\n      EXTERNAL_CODECS_VARS\n      kMethodId_BZip2, decoder, false);\n  if (loadResult != S_OK || !decoder)\n  {\n    RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));\n    return S_OK;\n  }\n\n  #ifdef COMPRESS_MT\n  {\n    CMyComPtr<ICompressSetCoderMt> setCoderMt;\n    decoder.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt);\n    if (setCoderMt)\n    {\n      RINOK(setCoderMt->SetNumberOfThreads(_numThreads));\n    }\n  }\n  #endif\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n  outStreamSpec->SetStream(realOutStream);\n  outStreamSpec->Init();\n  \n  realOutStream.Release();\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, true);\n  \n  RINOK(_stream->Seek(_streamStartPosition, STREAM_SEEK_SET, NULL));\n\n  HRESULT result = S_OK;\n\n  bool firstItem = true;\n  for (;;)\n  {\n    lps->InSize = currentTotalPacked;\n    lps->OutSize = outStreamSpec->GetSize();\n\n    RINOK(lps->SetCur());\n\n    const int kSignatureSize = 3;\n    Byte buffer[kSignatureSize];\n    size_t processedSize = kSignatureSize;\n    RINOK(ReadStream(_stream, buffer, &processedSize));\n    if (processedSize != kSignatureSize)\n    {\n      if (firstItem)\n        return E_FAIL;\n      break;\n    }\n    if (buffer[0] != 'B' || buffer[1] != 'Z' || buffer[2] != 'h')\n    {\n      if (firstItem)\n        return E_FAIL;\n      break;\n    }\n    firstItem = false;\n\n    UInt64 dataStartPos;\n    RINOK(_stream->Seek((UInt64)(Int64)(-3), STREAM_SEEK_CUR, &dataStartPos));\n\n    result = decoder->Code(_stream, outStream, NULL, NULL, progress);\n\n    if (result != S_OK)\n      break;\n\n    CMyComPtr<ICompressGetInStreamProcessedSize> getInStreamProcessedSize;\n    decoder.QueryInterface(IID_ICompressGetInStreamProcessedSize, &getInStreamProcessedSize);\n    if (!getInStreamProcessedSize)\n      break;\n    UInt64 packSize;\n    RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(&packSize));\n    UInt64 pos;\n    RINOK(_stream->Seek(dataStartPos + packSize, STREAM_SEEK_SET, &pos));\n    currentTotalPacked = pos - _streamStartPosition;\n  }\n  outStream.Release();\n\n  Int32 retResult;\n  if (result == S_OK)\n    retResult = NExtract::NOperationResult::kOK;\n  else if (result == S_FALSE)\n    retResult = NExtract::NOperationResult::kDataError;\n  else\n    return result;\n  return extractCallback->SetOperationResult(retResult);\n\n  COM_TRY_END\n}\n\nIMPL_ISetCompressCodecsInfo\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/BZip2/BZip2Handler.h",
    "content": "// BZip2/Handler.h\n\n#ifndef __BZIP2_HANDLER_H\n#define __BZIP2_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n#include \"../../Common/CreateCoder.h\"\n#include \"BZip2Item.h\"\n\n#ifdef COMPRESS_MT\n#include \"../../../Windows/System.h\"\n#endif\n\nnamespace NArchive {\nnamespace NBZip2 {\n\nclass CHandler:\n  public IInArchive,\n  public IOutArchive,\n  public ISetProperties,\n  PUBLIC_ISetCompressCodecsInfo\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _stream;\n  NArchive::NBZip2::CItem _item;\n  UInt64 _streamStartPosition;\n\n  UInt32 _level;\n  UInt32 _dicSize;\n  UInt32 _numPasses;\n  #ifdef COMPRESS_MT\n  UInt32 _numThreads;\n  #endif\n\n  DECL_EXTERNAL_CODECS_VARS\n\n  void InitMethodProperties()\n  {\n    _level = 5;\n    _dicSize =\n    _numPasses = 0xFFFFFFFF;\n    #ifdef COMPRESS_MT\n    _numThreads = NWindows::NSystem::GetNumberOfProcessors();;\n    #endif\n  }\n\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IInArchive)\n  MY_QUERYINTERFACE_ENTRY(IOutArchive)\n  MY_QUERYINTERFACE_ENTRY(ISetProperties)\n  QUERY_ENTRY_ISetCompressCodecsInfo\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  INTERFACE_IInArchive(;)\n  INTERFACE_IOutArchive(;)\n\n  STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties);\n\n  DECL_ISetCompressCodecsInfo\n\n  CHandler() { InitMethodProperties(); }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/BZip2/BZip2HandlerOut.cpp",
    "content": "// BZip2HandlerOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"BZip2Handler.h\"\n#include \"BZip2Update.h\"\n\n#include \"Common/Defs.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/ParseProperties.h\"\n\nusing namespace NWindows;\n\nstatic const UInt32 kNumPassesX1 = 1;\nstatic const UInt32 kNumPassesX7 = 2;\nstatic const UInt32 kNumPassesX9 = 7;\n\nstatic const UInt32 kDicSizeX1 = 100000;\nstatic const UInt32 kDicSizeX3 = 500000;\nstatic const UInt32 kDicSizeX5 = 900000;\n\nnamespace NArchive {\nnamespace NBZip2 {\n\nSTDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)\n{\n  *type = NFileTimeType::kUnix;\n  return S_OK;\n}\n\nstatic HRESULT CopyStreams(ISequentialInStream *inStream, ISequentialOutStream *outStream)\n{\n  CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;\n  return copyCoder->Code(inStream, outStream, NULL, NULL, NULL);\n}\n\nSTDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,\n    IArchiveUpdateCallback *updateCallback)\n{\n  if (numItems != 1)\n    return E_INVALIDARG;\n\n  Int32 newData;\n  Int32 newProperties;\n  UInt32 indexInArchive;\n  if (!updateCallback)\n    return E_FAIL;\n  RINOK(updateCallback->GetUpdateItemInfo(0,&newData, &newProperties, &indexInArchive));\n \n  if (IntToBool(newProperties))\n  {\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop));\n      if (prop.vt == VT_BOOL)\n      {\n        if (prop.boolVal != VARIANT_FALSE)\n          return E_INVALIDARG;\n      }\n      else if (prop.vt != VT_EMPTY)\n        return E_INVALIDARG;\n    }\n  }\n  \n  if (IntToBool(newData))\n  {\n    UInt64 size;\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(0, kpidSize, &prop));\n      if (prop.vt != VT_UI8)\n        return E_INVALIDARG;\n      size = prop.uhVal.QuadPart;\n    }\n  \n    UInt32 dicSize = _dicSize;\n    if (dicSize == 0xFFFFFFFF)\n      dicSize = (_level >= 5 ? kDicSizeX5 :\n                (_level >= 3 ? kDicSizeX3 :\n                               kDicSizeX1));\n\n    UInt32 numPasses = _numPasses;\n    if (numPasses == 0xFFFFFFFF)\n      numPasses = (_level >= 9 ? kNumPassesX9 :\n                  (_level >= 7 ? kNumPassesX7 :\n                                 kNumPassesX1));\n\n    return UpdateArchive(\n        EXTERNAL_CODECS_VARS\n        size, outStream, 0, dicSize, numPasses,\n        #ifdef COMPRESS_MT\n        _numThreads,\n        #endif\n        updateCallback);\n  }\n  if (indexInArchive != 0)\n    return E_INVALIDARG;\n  RINOK(_stream->Seek(_streamStartPosition, STREAM_SEEK_SET, NULL));\n  return CopyStreams(_stream, outStream);\n}\n\nSTDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)\n{\n  InitMethodProperties();\n  #ifdef COMPRESS_MT\n  const UInt32 numProcessors = NSystem::GetNumberOfProcessors();\n  _numThreads = numProcessors;\n  #endif\n\n  for (int i = 0; i < numProperties; i++)\n  {\n    UString name = UString(names[i]);\n    name.MakeUpper();\n    if (name.IsEmpty())\n      return E_INVALIDARG;\n\n    const PROPVARIANT &prop = values[i];\n\n    if (name[0] == 'X')\n    {\n      UInt32 level = 9;\n      RINOK(ParsePropValue(name.Mid(1), prop, level));\n      _level = level;\n      continue;\n    }\n    if (name[0] == 'D')\n    {\n      UInt32 dicSize = kDicSizeX5;\n      RINOK(ParsePropDictionaryValue(name.Mid(1), prop, dicSize));\n      _dicSize = dicSize;\n      continue;\n    }\n    if (name.Left(4) == L\"PASS\")\n    {\n      UInt32 num = kNumPassesX9;\n      RINOK(ParsePropValue(name.Mid(4), prop, num));\n      _numPasses = num;\n      continue;\n    }\n    if (name.Left(2) == L\"MT\")\n    {\n      #ifdef COMPRESS_MT\n      RINOK(ParseMtProp(name.Mid(2), prop, numProcessors, _numThreads));\n      #endif\n      continue;\n    }\n    return E_INVALIDARG;\n  }\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/BZip2/BZip2Item.h",
    "content": "// Archive/BZip2Item.h\n\n#ifndef __ARCHIVE_BZIP2_ITEM_H\n#define __ARCHIVE_BZIP2_ITEM_H\n\nnamespace NArchive {\nnamespace NBZip2 {\n  \nstruct CItem\n{\n  UInt64 PackSize;\n  UInt64 UnPackSize;\n};\n\n}}\n\n#endif\n\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/BZip2/BZip2Update.cpp",
    "content": "// BZip2Update.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/CreateCoder.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"BZip2Update.h\"\n\nnamespace NArchive {\nnamespace NBZip2 {\n\nstatic const CMethodId kMethodId_BZip2 = 0x040202;\n\nHRESULT UpdateArchive(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    UInt64 unpackSize,\n    ISequentialOutStream *outStream,\n    int indexInClient,\n    UInt32 dictionary,\n    UInt32 numPasses,\n    #ifdef COMPRESS_MT\n    UInt32 numThreads,\n    #endif\n    IArchiveUpdateCallback *updateCallback)\n{\n  RINOK(updateCallback->SetTotal(unpackSize));\n  UInt64 complexity = 0;\n  RINOK(updateCallback->SetCompleted(&complexity));\n\n  CMyComPtr<ISequentialInStream> fileInStream;\n\n  RINOK(updateCallback->GetStream(indexInClient, &fileInStream));\n\n  CLocalProgress *localProgressSpec = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> localProgress = localProgressSpec;\n  localProgressSpec->Init(updateCallback, true);\n  \n  CMyComPtr<ICompressCoder> encoder;\n  RINOK(CreateCoder(\n      EXTERNAL_CODECS_LOC_VARS\n      kMethodId_BZip2, encoder, true));\n  if (!encoder)\n    return E_NOTIMPL;\n  CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n  encoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);\n  if (setCoderProperties)\n  {\n    NWindows::NCOM::CPropVariant properties[] =\n    {\n      dictionary,\n      numPasses\n      #ifdef COMPRESS_MT\n      , numThreads\n      #endif\n    };\n    PROPID propIDs[] =\n    {\n      NCoderPropID::kDictionarySize,\n      NCoderPropID::kNumPasses\n      #ifdef COMPRESS_MT\n      , NCoderPropID::kNumThreads\n      #endif\n    };\n    RINOK(setCoderProperties->SetCoderProperties(propIDs, properties, sizeof(propIDs) / sizeof(propIDs[0])));\n  }\n  \n  RINOK(encoder->Code(fileInStream, outStream, NULL, NULL, localProgress));\n  \n  return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/BZip2/BZip2Update.h",
    "content": "// BZip2Update.h\n\n#ifndef __BZIP2_UPDATE_H\n#define __BZIP2_UPDATE_H\n\n#include \"../IArchive.h\"\n#include \"../../Common/CreateCoder.h\"\n\nnamespace NArchive {\nnamespace NBZip2 {\n\nHRESULT UpdateArchive(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    UInt64 unpackSize,\n    ISequentialOutStream *outStream,\n    int indexInClient,\n    UInt32 dictionary,\n    UInt32 numPasses,\n    #ifdef COMPRESS_MT\n    UInt32 numThreads,\n    #endif\n    IArchiveUpdateCallback *updateCallback);\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/BZip2/bz2Register.cpp",
    "content": "// BZip2Register.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"BZip2Handler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NBZip2::CHandler;  }\n#ifndef EXTRACT_ONLY\nstatic IOutArchive *CreateArcOut() { return new NArchive::NBZip2::CHandler;  }\n#else\n#define CreateArcOut 0\n#endif\n\nstatic CArcInfo g_ArcInfo =\n  { L\"BZip2\", L\"bz2 bzip2 tbz2 tbz\", L\"* * .tar .tar\", 2, { 'B', 'Z', 'h' }, 3, true, CreateArc, CreateArcOut };\n\nvoid RegisterBZip2()\n{\n\tRegisterArc(&g_ArcInfo);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabBlockInStream.cpp",
    "content": "// CabBlockInStream.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../../C/Alloc.h\"\n}\n\n#include \"Common/Defs.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\n#include \"CabBlockInStream.h\"\n\nnamespace NArchive {\nnamespace NCab {\n\nstatic const UInt32 kBlockSize = (1 << 16);\n\nbool CCabBlockInStream::Create()\n{\n  if (!_buffer)\n    _buffer = (Byte *)::MyAlloc(kBlockSize);\n  return (_buffer != 0);\n}\n\nCCabBlockInStream::~CCabBlockInStream()\n{\n  MyFree(_buffer);\n}\n\nclass CCheckSum2\n{\n  UInt32 m_Value;\n  int m_Pos;\n  Byte m_Hist[4];\npublic:\n  CCheckSum2(): m_Value(0){};\n  void Init() { m_Value = 0;  m_Pos = 0; }\n  void Update(const void *data, UInt32 size);\n  void FinishDataUpdate()\n  {\n    for (int i = 0; i < m_Pos; i++)\n      m_Value ^= ((UInt32)(m_Hist[i])) << (8 * (m_Pos - i - 1));\n  }\n  void UpdateUInt32(UInt32 v) { m_Value ^= v; }\n  UInt32 GetResult() const {  return m_Value; }\n};\n\nvoid CCheckSum2::Update(const void *data, UInt32 size)\n{\n  UInt32 checkSum = m_Value;\n  const Byte *dataPointer = (const Byte *)data;\n\n  while (size != 0 && m_Pos != 0)\n  {\n    m_Hist[m_Pos] = *dataPointer++;\n    m_Pos = (m_Pos + 1) & 3;\n    size--;\n    if (m_Pos == 0)\n      for (int i = 0; i < 4; i++)\n        checkSum ^= ((UInt32)m_Hist[i]) << (8 * i);\n  }\n\n  int numWords = size / 4;\n  \n  while (numWords-- != 0)\n  {\n    UInt32 temp = *dataPointer++;\n    temp |= ((UInt32)(*dataPointer++)) <<  8;\n    temp |= ((UInt32)(*dataPointer++)) << 16;\n    temp |= ((UInt32)(*dataPointer++)) << 24;\n    checkSum ^= temp;\n  }\n  m_Value = checkSum;\n\n  size &= 3;\n  \n  while (size != 0)\n  {\n    m_Hist[m_Pos] = *dataPointer++;\n    m_Pos = (m_Pos + 1) & 3;\n    size--;\n  }\n}\n\nstatic const UInt32 kDataBlockHeaderSize = 8;\n\nclass CTempCabInBuffer2\n{\npublic:\n  Byte Buffer[kDataBlockHeaderSize];\n  UInt32 Pos;\n  Byte ReadByte()\n  {\n    return Buffer[Pos++];\n  }\n  UInt32 ReadUInt32()\n  {\n    UInt32 value = 0;\n    for (int i = 0; i < 4; i++)\n      value |= (((UInt32)ReadByte()) << (8 * i));\n    return value;\n  }\n  UInt16 ReadUInt16()\n  {\n    UInt16 value = 0;\n    for (int i = 0; i < 2; i++)\n      value |= (((UInt16)ReadByte()) << (8 * i));\n    return value;\n  }\n};\n\nHRESULT CCabBlockInStream::PreRead(UInt32 &packSize, UInt32 &unpackSize)\n{\n  CTempCabInBuffer2 inBuffer;\n  inBuffer.Pos = 0;\n  RINOK(ReadStream_FALSE(_stream, inBuffer.Buffer, kDataBlockHeaderSize))\n\n  UInt32 checkSum = inBuffer.ReadUInt32();\n  packSize = inBuffer.ReadUInt16();\n  unpackSize = inBuffer.ReadUInt16();\n  if (ReservedSize != 0)\n  {\n    RINOK(ReadStream_FALSE(_stream, _buffer, ReservedSize));\n  }\n  _pos = 0;\n  CCheckSum2 checkSumCalc;\n  checkSumCalc.Init();\n  UInt32 packSize2 = packSize;\n  if (MsZip && _size == 0)\n  {\n    if (packSize < 2)\n      return S_FALSE; // bad block;\n    Byte sig[2];\n    RINOK(ReadStream_FALSE(_stream, sig, 2));\n    if (sig[0] != 0x43 || sig[1] != 0x4B)\n      return S_FALSE;\n    packSize2 -= 2;\n    checkSumCalc.Update(sig, 2);\n  }\n\n  if (kBlockSize - _size < packSize2)\n    return S_FALSE;\n\n  UInt32 curSize = packSize2;\n  if (curSize != 0)\n  {\n    size_t processedSizeLoc = curSize;\n    RINOK(ReadStream(_stream, _buffer + _size, &processedSizeLoc));\n    checkSumCalc.Update(_buffer + _size, (UInt32)processedSizeLoc);\n    _size += (UInt32)processedSizeLoc;\n    if (processedSizeLoc != curSize)\n      return S_FALSE;\n  }\n  TotalPackSize = _size;\n\n  checkSumCalc.FinishDataUpdate();\n  \n  bool dataError;\n  if (checkSum == 0)\n    dataError = false;\n  else\n  {\n    checkSumCalc.UpdateUInt32(packSize | (((UInt32)unpackSize) << 16));\n    dataError = (checkSumCalc.GetResult() != checkSum);\n  }\n  DataError |= dataError;\n  return dataError ? S_FALSE : S_OK;\n}\n\nSTDMETHODIMP CCabBlockInStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  if (processedSize != 0)\n    *processedSize = 0;\n  if (size == 0)\n    return S_OK;\n  if (_size != 0)\n  {\n    size = MyMin(_size, size);\n    memmove(data, _buffer + _pos, size);\n    _pos += size;\n    _size -= size;\n    if (processedSize != 0)\n      *processedSize = size;\n    return S_OK;\n  }\n  return S_OK; // no blocks data\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabBlockInStream.h",
    "content": "// CabBlockInStream.cpp\n\n#ifndef __CABBLOCKINSTREAM_H\n#define __CABBLOCKINSTREAM_H\n\n#include \"Common/MyCom.h\"\n#include \"../../IStream.h\"\n\nnamespace NArchive {\nnamespace NCab {\n\nclass CCabBlockInStream:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialInStream> _stream;\n  Byte *_buffer;\n  UInt32 _pos;\n  UInt32 _size;\n\npublic:\n  UInt32 TotalPackSize;\n  UInt32 ReservedSize;\n  bool DataError;\n  bool MsZip;\n\n  CCabBlockInStream(): _buffer(0), ReservedSize(0), MsZip(false), DataError(false), TotalPackSize(0) {}\n  ~CCabBlockInStream();\n  bool Create();\n  void SetStream(ISequentialInStream *stream) {  _stream = stream; }\n\n  void InitForNewFolder() { TotalPackSize = 0; }\n  void InitForNewBlock() { _size = 0; }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n\n  HRESULT PreRead(UInt32 &packSize, UInt32 &unpackSize);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabHandler.cpp",
    "content": "// CabHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/UTFConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n#include \"../../Compress/DeflateDecoder.h\"\n#include \"../../Compress/LzxDecoder.h\"\n#include \"../../Compress/QuantumDecoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"CabBlockInStream.h\"\n#include \"CabHandler.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NCab {\n\n// #define _CAB_DETAILS\n\n#ifdef _CAB_DETAILS\nenum\n{\n  kpidBlockReal = kpidUserDefined\n};\n#endif\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidAttrib, VT_UI4},\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidBlock, VT_I4}\n  #ifdef _CAB_DETAILS\n  ,\n  { L\"BlockReal\", kpidBlockReal, VT_UI4},\n  { NULL, kpidOffset, VT_UI4},\n  { NULL, kpidVolume, VT_UI4}\n  #endif\n};\n\nstatic const wchar_t *kMethods[] =\n{\n  L\"None\",\n  L\"MSZip\",\n  L\"Quantum\",\n  L\"LZX\"\n};\n\nstatic const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);\nstatic const wchar_t *kUnknownMethod = L\"Unknown\";\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidMethod, VT_BSTR},\n  // { NULL, kpidSolid, VT_BOOL},\n  { NULL, kpidNumBlocks, VT_UI4},\n  { NULL, kpidNumVolumes, VT_UI4}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidMethod:\n    {\n      UString resString;\n      CRecordVector<Byte> ids;\n      int i;\n      for (int v = 0; v < m_Database.Volumes.Size(); v++)\n      {\n        const CDatabaseEx &de = m_Database.Volumes[v];\n        for (i = 0; i < de.Folders.Size(); i++)\n          ids.AddToUniqueSorted(de.Folders[i].GetCompressionMethod());\n      }\n      for (i = 0; i < ids.Size(); i++)\n      {\n        Byte id = ids[i];\n        UString method = (id < kNumMethods) ? kMethods[id] : kUnknownMethod;\n        if (!resString.IsEmpty())\n          resString += L' ';\n        resString += method;\n      }\n      prop = resString;\n      break;\n    }\n    // case kpidSolid: prop = _database.IsSolid(); break;\n    case kpidNumBlocks:\n    {\n      UInt32 numFolders = 0;\n      for (int v = 0; v < m_Database.Volumes.Size(); v++)\n        numFolders += m_Database.Volumes[v].Folders.Size();\n      prop = numFolders;\n      break;\n    }\n    case kpidNumVolumes:\n    {\n      prop = (UInt32)m_Database.Volumes.Size();\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  \n  const CMvItem &mvItem = m_Database.Items[index];\n  const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex];\n  int itemIndex = mvItem.ItemIndex;\n  const CItem &item = db.Items[itemIndex];\n  switch(propID)\n  {\n    case kpidPath:\n    {\n      UString unicodeName;\n      if (item.IsNameUTF())\n        ConvertUTF8ToUnicode(item.Name, unicodeName);\n      else\n        unicodeName = MultiByteToUnicodeString(item.Name, CP_ACP);\n      prop = (const wchar_t *)NItemName::WinNameToOSName(unicodeName);\n      break;\n    }\n    case kpidIsDir:  prop = item.IsDir(); break;\n    case kpidSize:  prop = item.Size; break;\n    case kpidAttrib:  prop = item.GetWinAttributes(); break;\n\n    case kpidMTime:\n    {\n      FILETIME localFileTime, utcFileTime;\n      if (NTime::DosTimeToFileTime(item.Time, localFileTime))\n      {\n        if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))\n          utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n      }\n      else\n        utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n      prop = utcFileTime;\n      break;\n    }\n\n    case kpidMethod:\n    {\n      UInt32 realFolderIndex = item.GetFolderIndex(db.Folders.Size());\n      const CFolder &folder = db.Folders[realFolderIndex];\n      int methodIndex = folder.GetCompressionMethod();\n      UString method = (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod;\n      if (methodIndex == NHeader::NCompressionMethodMajor::kLZX ||\n        methodIndex == NHeader::NCompressionMethodMajor::kQuantum)\n      {\n        method += L\":\";\n        wchar_t temp[32];\n        ConvertUInt64ToString(folder.CompressionTypeMinor, temp);\n        method += temp;\n      }\n      prop = method;\n      break;\n    }\n    case kpidBlock:  prop = (Int32)m_Database.GetFolderIndex(&mvItem); break;\n    \n    #ifdef _CAB_DETAILS\n    \n    case kpidBlockReal:  prop = (UInt32)item.FolderIndex; break;\n    case kpidOffset:  prop = (UInt32)item.Offset; break;\n    case kpidVolume:  prop = (UInt32)mvItem.VolumeIndex; break;\n\n    #endif\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\n/*\nclass CProgressImp: public CProgressVirt\n{\n  CMyComPtr<IArchiveOpenCallback> m_OpenArchiveCallback;\npublic:\n  STDMETHOD(SetTotal)(const UInt64 *numFiles);\n  STDMETHOD(SetCompleted)(const UInt64 *numFiles);\n  void Init(IArchiveOpenCallback *openArchiveCallback)\n    { m_OpenArchiveCallback = openArchiveCallback; }\n};\n\nSTDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles)\n{\n  if (m_OpenArchiveCallback)\n    return m_OpenArchiveCallback->SetCompleted(numFiles, NULL);\n  return S_OK;\n}\n\nSTDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)\n{\n  if (m_OpenArchiveCallback)\n    return m_OpenArchiveCallback->SetCompleted(numFiles, NULL);\n  return S_OK;\n}\n*/\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 *maxCheckStartPosition,\n    IArchiveOpenCallback *callback)\n{\n  COM_TRY_BEGIN\n  Close();\n  HRESULT res = S_FALSE;\n  CInArchive archive;\n  CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;\n  {\n    CMyComPtr<IArchiveOpenCallback> openArchiveCallbackWrap = callback;\n    openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback, &openVolumeCallback);\n  }\n\n  CMyComPtr<IInStream> nextStream = inStream;\n  bool prevChecked = false;\n  UInt64 numItems = 0;\n  try\n  {\n    while(nextStream != 0)\n    {\n      CDatabaseEx db;\n      db.Stream = nextStream;\n      res = archive.Open(maxCheckStartPosition, db);\n      if (res == S_OK)\n      {\n        if (!m_Database.Volumes.IsEmpty())\n        {\n          const CDatabaseEx &dbPrev = m_Database.Volumes[prevChecked ? m_Database.Volumes.Size() - 1 : 0];\n          if (dbPrev.ArchiveInfo.SetID != db.ArchiveInfo.SetID ||\n              dbPrev.ArchiveInfo.CabinetNumber + (prevChecked ? 1: - 1) !=\n              db.ArchiveInfo.CabinetNumber)\n            res = S_FALSE;\n        }\n      }\n      if (res == S_OK)\n        m_Database.Volumes.Insert(prevChecked ? m_Database.Volumes.Size() : 0, db);\n      else if (res != S_FALSE)\n        return res;\n      else\n      {\n        if (m_Database.Volumes.IsEmpty())\n          return S_FALSE;\n        if (prevChecked)\n          break;\n        prevChecked = true;\n      }\n\n      numItems += db.Items.Size();\n      RINOK(callback->SetCompleted(&numItems, NULL));\n        \n      nextStream = 0;\n      for (;;)\n      {\n        const COtherArchive *otherArchive = 0;\n        if (!prevChecked)\n        {\n          const CInArchiveInfo &ai = m_Database.Volumes.Front().ArchiveInfo;\n          if (ai.IsTherePrev())\n            otherArchive = &ai.PreviousArchive;\n          else\n            prevChecked = true;\n        }\n        if (otherArchive == 0)\n        {\n          const CInArchiveInfo &ai = m_Database.Volumes.Back().ArchiveInfo;\n          if (ai.IsThereNext())\n            otherArchive = &ai.NextArchive;\n        }\n        if (!otherArchive)\n          break;\n        const UString fullName = MultiByteToUnicodeString(otherArchive->FileName, CP_ACP);\n        HRESULT result = openVolumeCallback->GetStream(fullName, &nextStream);\n        if (result == S_OK)\n          break;\n        if (result != S_FALSE)\n          return result;\n        if (prevChecked)\n          break;\n        prevChecked = true;\n      }\n    }\n    if (res == S_OK)\n    {\n      m_Database.FillSortAndShrink();\n      if (!m_Database.Check())\n        res = S_FALSE;\n    }\n  }\n  catch(...)\n  {\n    res = S_FALSE;\n  }\n  if (res != S_OK)\n  {\n    Close();\n    return res;\n  }\n  COM_TRY_END\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  m_Database.Clear();\n  return S_OK;\n}\n\nclass CCabFolderOutStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\nprivate:\n  const CMvDatabaseEx *m_Database;\n  const CRecordVector<bool> *m_ExtractStatuses;\n  int m_StartIndex;\n  int m_CurrentIndex;\n  CMyComPtr<IArchiveExtractCallback> m_ExtractCallback;\n  bool m_TestMode;\n\n  CMyComPtr<ISequentialOutStream> m_RealOutStream;\n\n  bool m_IsOk;\n  bool m_FileIsOpen;\n  UInt64 m_RemainFileSize;\n  UInt64 m_FolderSize;\n  UInt64 m_PosInFolder;\n\n  HRESULT OpenFile();\n  HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK);\npublic:\n  HRESULT WriteEmptyFiles();\n\n  void Init(\n      const CMvDatabaseEx *database,\n      const CRecordVector<bool> *extractStatuses,\n      int startIndex,\n      UInt64 folderSize,\n      IArchiveExtractCallback *extractCallback,\n      bool testMode);\n  HRESULT FlushCorrupted();\n  HRESULT Unsupported();\n\n  UInt64 GetRemain() const { return m_FolderSize - m_PosInFolder; }\n  UInt64 GetPosInFolder() const { return m_PosInFolder; }\n};\n\nvoid CCabFolderOutStream::Init(\n    const CMvDatabaseEx *database,\n    const CRecordVector<bool> *extractStatuses,\n    int startIndex,\n    UInt64 folderSize,\n    IArchiveExtractCallback *extractCallback,\n    bool testMode)\n{\n  m_Database = database;\n  m_ExtractStatuses = extractStatuses;\n  m_StartIndex = startIndex;\n  m_FolderSize = folderSize;\n\n  m_ExtractCallback = extractCallback;\n  m_TestMode = testMode;\n\n  m_CurrentIndex = 0;\n  m_PosInFolder = 0;\n  m_FileIsOpen = false;\n  m_IsOk = true;\n}\n\nHRESULT CCabFolderOutStream::OpenFile()\n{\n  Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ?\n      NExtract::NAskMode::kTest :\n      NExtract::NAskMode::kExtract) :\n      NExtract::NAskMode::kSkip;\n  RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode));\n  if (!m_RealOutStream && !m_TestMode)\n    askMode = NArchive::NExtract::NAskMode::kSkip;\n  return m_ExtractCallback->PrepareOperation(askMode);\n}\n\nHRESULT CCabFolderOutStream::WriteEmptyFiles()\n{\n  if (m_FileIsOpen)\n    return S_OK;\n  for(;m_CurrentIndex < m_ExtractStatuses->Size(); m_CurrentIndex++)\n  {\n    const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];\n    const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];\n    UInt64 fileSize = item.Size;\n    if (fileSize != 0)\n      return S_OK;\n    HRESULT result = OpenFile();\n    m_RealOutStream.Release();\n    RINOK(result);\n    RINOK(m_ExtractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n  }\n  return S_OK;\n}\n\n// This is Write function\nHRESULT CCabFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK)\n{\n  UInt32 realProcessed = 0;\n  if (processedSize != NULL)\n   *processedSize = 0;\n  while(size != 0)\n  {\n    if (m_FileIsOpen)\n    {\n      UInt32 numBytesToWrite = (UInt32)MyMin(m_RemainFileSize, (UInt64)(size));\n      HRESULT res = S_OK;\n      if (numBytesToWrite > 0)\n      {\n        if (!isOK)\n          m_IsOk = false;\n        if (m_RealOutStream)\n        {\n          UInt32 processedSizeLocal = 0;\n          res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal);\n          numBytesToWrite = processedSizeLocal;\n        }\n      }\n      realProcessed += numBytesToWrite;\n      if (processedSize != NULL)\n        *processedSize = realProcessed;\n      data = (const void *)((const Byte *)data + numBytesToWrite);\n      size -= numBytesToWrite;\n      m_RemainFileSize -= numBytesToWrite;\n      m_PosInFolder += numBytesToWrite;\n      if (res != S_OK)\n        return res;\n      if (m_RemainFileSize == 0)\n      {\n        m_RealOutStream.Release();\n        RINOK(m_ExtractCallback->SetOperationResult(\n          m_IsOk ?\n            NArchive::NExtract::NOperationResult::kOK:\n            NArchive::NExtract::NOperationResult::kDataError));\n        m_FileIsOpen = false;\n      }\n      if (realProcessed > 0)\n        break; // with this break this function works as Write-Part\n    }\n    else\n    {\n      if (m_CurrentIndex >= m_ExtractStatuses->Size())\n        return E_FAIL;\n\n      const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];\n      const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];\n\n      m_RemainFileSize = item.Size;\n\n      UInt32 fileOffset = item.Offset;\n      if (fileOffset < m_PosInFolder)\n        return E_FAIL;\n      if (fileOffset > m_PosInFolder)\n      {\n        UInt32 numBytesToWrite = (UInt32)MyMin((UInt64)fileOffset - m_PosInFolder, UInt64(size));\n        realProcessed += numBytesToWrite;\n        if (processedSize != NULL)\n          *processedSize = realProcessed;\n        data = (const void *)((const Byte *)data + numBytesToWrite);\n        size -= numBytesToWrite;\n        m_PosInFolder += numBytesToWrite;\n      }\n      if (fileOffset == m_PosInFolder)\n      {\n        RINOK(OpenFile());\n        m_FileIsOpen = true;\n        m_CurrentIndex++;\n        m_IsOk = true;\n      }\n    }\n  }\n  return WriteEmptyFiles();\n}\n\nSTDMETHODIMP CCabFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  return Write2(data, size, processedSize, true);\n}\n\nHRESULT CCabFolderOutStream::FlushCorrupted()\n{\n  const UInt32 kBufferSize = (1 << 10);\n  Byte buffer[kBufferSize];\n  for (int i = 0; i < kBufferSize; i++)\n    buffer[i] = 0;\n  for (;;)\n  {\n    UInt64 remain = GetRemain();\n    if (remain == 0)\n      return S_OK;\n    UInt32 size = (UInt32)MyMin(remain, (UInt64)kBufferSize);\n    UInt32 processedSizeLocal = 0;\n    RINOK(Write2(buffer, size, &processedSizeLocal, false));\n  }\n}\n\nHRESULT CCabFolderOutStream::Unsupported()\n{\n  while(m_CurrentIndex < m_ExtractStatuses->Size())\n  {\n    HRESULT result = OpenFile();\n    if (result != S_FALSE && result != S_OK)\n      return result;\n    m_RealOutStream.Release();\n    RINOK(m_ExtractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n    m_CurrentIndex++;\n  }\n  return S_OK;\n}\n\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == (UInt32)(-1));\n  if (allFilesMode)\n    numItems = m_Database.Items.Size();\n  if(numItems == 0)\n    return S_OK;\n  bool testMode = (_aTestMode != 0);\n  UInt64 totalUnPacked = 0;\n\n  UInt32 i;\n  int lastFolder = -2;\n  UInt64 lastFolderSize = 0;\n  for(i = 0; i < numItems; i++)\n  {\n    int index = allFilesMode ? i : indices[i];\n    const CMvItem &mvItem = m_Database.Items[index];\n    const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];\n    if (item.IsDir())\n      continue;\n    int folderIndex = m_Database.GetFolderIndex(&mvItem);\n    if (folderIndex != lastFolder)\n      totalUnPacked += lastFolderSize;\n    lastFolder = folderIndex;\n    lastFolderSize = item.GetEndOffset();\n  }\n  totalUnPacked += lastFolderSize;\n\n  extractCallback->SetTotal(totalUnPacked);\n\n  totalUnPacked = 0;\n\n  UInt64 totalPacked = 0;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  NCompress::NDeflate::NDecoder::CCOMCoder *deflateDecoderSpec = NULL;\n  CMyComPtr<ICompressCoder> deflateDecoder;\n\n  NCompress::NLzx::CDecoder *lzxDecoderSpec = NULL;\n  CMyComPtr<ICompressCoder> lzxDecoder;\n\n  NCompress::NQuantum::CDecoder *quantumDecoderSpec = NULL;\n  CMyComPtr<ICompressCoder> quantumDecoder;\n\n  CCabBlockInStream *cabBlockInStreamSpec = new CCabBlockInStream();\n  CMyComPtr<ISequentialInStream> cabBlockInStream = cabBlockInStreamSpec;\n  if (!cabBlockInStreamSpec->Create())\n    return E_OUTOFMEMORY;\n\n  CRecordVector<bool> extractStatuses;\n  for(i = 0; i < numItems;)\n  {\n    int index = allFilesMode ? i : indices[i];\n\n    const CMvItem &mvItem = m_Database.Items[index];\n    const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex];\n    int itemIndex = mvItem.ItemIndex;\n    const CItem &item = db.Items[itemIndex];\n\n    i++;\n    if (item.IsDir())\n    {\n      Int32 askMode= testMode ?\n          NArchive::NExtract::NAskMode::kTest :\n          NArchive::NExtract::NAskMode::kExtract;\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      RINOK(extractCallback->PrepareOperation(askMode));\n      realOutStream.Release();\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    int folderIndex = m_Database.GetFolderIndex(&mvItem);\n    if (folderIndex < 0)\n    {\n      // If we need previous archive\n      Int32 askMode= testMode ?\n          NArchive::NExtract::NAskMode::kTest :\n          NArchive::NExtract::NAskMode::kExtract;\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      RINOK(extractCallback->PrepareOperation(askMode));\n      realOutStream.Release();\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kDataError));\n      continue;\n    }\n    int startIndex2 = m_Database.FolderStartFileIndex[folderIndex];\n    int startIndex = startIndex2;\n    extractStatuses.Clear();\n    for (; startIndex < index; startIndex++)\n      extractStatuses.Add(false);\n    extractStatuses.Add(true);\n    startIndex++;\n    UInt64 curUnpack = item.GetEndOffset();\n    for(;i < numItems; i++)\n    {\n      int indexNext = allFilesMode ? i : indices[i];\n      const CMvItem &mvItem = m_Database.Items[indexNext];\n      const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];\n      if (item.IsDir())\n        continue;\n      int newFolderIndex = m_Database.GetFolderIndex(&mvItem);\n\n      if (newFolderIndex != folderIndex)\n        break;\n      for (; startIndex < indexNext; startIndex++)\n        extractStatuses.Add(false);\n      extractStatuses.Add(true);\n      startIndex++;\n      curUnpack = item.GetEndOffset();\n    }\n\n    lps->OutSize = totalUnPacked;\n    lps->InSize = totalPacked;\n    RINOK(lps->SetCur());\n\n    CCabFolderOutStream *cabFolderOutStream = new CCabFolderOutStream;\n    CMyComPtr<ISequentialOutStream> outStream(cabFolderOutStream);\n\n    const CFolder &folder = db.Folders[item.GetFolderIndex(db.Folders.Size())];\n\n    cabFolderOutStream->Init(&m_Database, &extractStatuses, startIndex2,\n        curUnpack, extractCallback, testMode);\n\n    cabBlockInStreamSpec->MsZip = false;\n    switch(folder.GetCompressionMethod())\n    {\n      case NHeader::NCompressionMethodMajor::kNone:\n        break;\n      case NHeader::NCompressionMethodMajor::kMSZip:\n        if(deflateDecoderSpec == NULL)\n        {\n          deflateDecoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder;\n          deflateDecoder = deflateDecoderSpec;\n        }\n        cabBlockInStreamSpec->MsZip = true;\n        break;\n      case NHeader::NCompressionMethodMajor::kLZX:\n        if(lzxDecoderSpec == NULL)\n        {\n          lzxDecoderSpec = new NCompress::NLzx::CDecoder;\n          lzxDecoder = lzxDecoderSpec;\n        }\n        RINOK(lzxDecoderSpec->SetParams(folder.CompressionTypeMinor));\n        break;\n      case NHeader::NCompressionMethodMajor::kQuantum:\n        if(quantumDecoderSpec == NULL)\n        {\n          quantumDecoderSpec = new NCompress::NQuantum::CDecoder;\n          quantumDecoder = quantumDecoderSpec;\n        }\n        quantumDecoderSpec->SetParams(folder.CompressionTypeMinor);\n        break;\n      default:\n      {\n        RINOK(cabFolderOutStream->Unsupported());\n        totalUnPacked += curUnpack;\n        continue;\n      }\n    }\n\n    cabBlockInStreamSpec->InitForNewFolder();\n\n    HRESULT res = S_OK;\n\n    {\n      int volIndex = mvItem.VolumeIndex;\n      int locFolderIndex = item.GetFolderIndex(db.Folders.Size());\n      bool keepHistory = false;\n      bool keepInputBuffer = false;\n      for (UInt32 f = 0; cabFolderOutStream->GetRemain() != 0;)\n      {\n        if (volIndex >= m_Database.Volumes.Size())\n        {\n          res = S_FALSE;\n          break;\n        }\n\n        const CDatabaseEx &db = m_Database.Volumes[volIndex];\n        const CFolder &folder = db.Folders[locFolderIndex];\n        if (f == 0)\n        {\n          cabBlockInStreamSpec->SetStream(db.Stream);\n          cabBlockInStreamSpec->ReservedSize = db.ArchiveInfo.GetDataBlockReserveSize();\n          RINOK(db.Stream->Seek(db.StartPosition + folder.DataStart, STREAM_SEEK_SET, NULL));\n        }\n        if (f == folder.NumDataBlocks)\n        {\n          volIndex++;\n          locFolderIndex = 0;\n          f = 0;\n          continue;\n        }\n        f++;\n\n        cabBlockInStreamSpec->DataError = false;\n        \n        if (!keepInputBuffer)\n          cabBlockInStreamSpec->InitForNewBlock();\n\n        UInt32 packSize, unpackSize;\n        res = cabBlockInStreamSpec->PreRead(packSize, unpackSize);\n        if (res == S_FALSE)\n          break;\n        RINOK(res);\n        keepInputBuffer = (unpackSize == 0);\n        if (keepInputBuffer)\n          continue;\n\n        UInt64 totalUnPacked2 = totalUnPacked + cabFolderOutStream->GetPosInFolder();\n        totalPacked += packSize;\n\n        lps->OutSize = totalUnPacked2;\n        lps->InSize = totalPacked;\n        RINOK(lps->SetCur());\n\n        UInt64 unpackRemain = cabFolderOutStream->GetRemain();\n\n        const UInt32 kBlockSizeMax = (1 << 15);\n        if (unpackRemain > kBlockSizeMax)\n          unpackRemain = kBlockSizeMax;\n        if (unpackRemain > unpackSize)\n          unpackRemain  = unpackSize;\n   \n        switch(folder.GetCompressionMethod())\n        {\n          case NHeader::NCompressionMethodMajor::kNone:\n            res = copyCoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);\n            break;\n          case NHeader::NCompressionMethodMajor::kMSZip:\n            deflateDecoderSpec->SetKeepHistory(keepHistory);\n            res = deflateDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);\n            break;\n          case NHeader::NCompressionMethodMajor::kLZX:\n            lzxDecoderSpec->SetKeepHistory(keepHistory);\n            res = lzxDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);\n            break;\n          case NHeader::NCompressionMethodMajor::kQuantum:\n            quantumDecoderSpec->SetKeepHistory(keepHistory);\n            res = quantumDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);\n          break;\n        }\n        if (res != S_OK)\n        {\n          if (res != S_FALSE)\n            RINOK(res);\n          break;\n        }\n        keepHistory = true;\n      }\n      if (res == S_OK)\n      {\n        RINOK(cabFolderOutStream->WriteEmptyFiles());\n      }\n    }\n    if (res != S_OK || cabFolderOutStream->GetRemain() != 0)\n    {\n      RINOK(cabFolderOutStream->FlushCorrupted());\n    }\n    totalUnPacked += curUnpack;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = m_Database.Items.Size();\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabHandler.h",
    "content": "// CabHandler.h\n\n#ifndef __CAB_HANDLER_H\n#define __CAB_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n#include \"CabIn.h\"\n\nnamespace NArchive {\nnamespace NCab {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CMvDatabaseEx m_Database;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabHeader.cpp",
    "content": "// Archive/Cab/Header.h\n\n#include \"StdAfx.h\"\n\n#include \"CabHeader.h\"\n\nnamespace NArchive{\nnamespace NCab{\nnamespace NHeader{\n\nByte kMarker[kMarkerSize] = {'M' + 1, 'S', 'C', 'F', 0, 0, 0, 0 };\n\nstruct SignatureInitializer { SignatureInitializer() {  kMarker[0]--;  }; } g_SignatureInitializer;\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabHeader.h",
    "content": "// Archive/Cab/Header.h\n\n#ifndef __ARCHIVE_CAB_HEADER_H\n#define __ARCHIVE_CAB_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NCab {\nnamespace NHeader {\n\nconst unsigned kMarkerSize = 8;\nextern Byte kMarker[kMarkerSize];\n\nnamespace NArchive\n{\n  namespace NFlags\n  {\n    const int kPrevCabinet = 0x0001;\n    const int kNextCabinet = 0x0002;\n    const int kReservePresent = 0x0004;\n  }\n}\n\nnamespace NCompressionMethodMajor\n{\n  const Byte kNone = 0;\n  const Byte kMSZip = 1;\n  const Byte kQuantum = 2;\n  const Byte kLZX = 3;\n}\n\nconst int kFileNameIsUTFAttributeMask = 0x80;\n\nnamespace NFolderIndex\n{\n  const int kContinuedFromPrev    = 0xFFFD;\n  const int kContinuedToNext      = 0xFFFE;\n  const int kContinuedPrevAndNext = 0xFFFF;\n}\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabIn.cpp",
    "content": "// Archive/CabIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CabIn.h\"\n\n#include \"../Common/FindSignature.h\"\n\nnamespace NArchive {\nnamespace NCab {\n\nByte CInArchive::ReadByte()\n{\n  Byte b;\n  if (!inBuffer.ReadByte(b))\n    throw CInArchiveException(CInArchiveException::kUnsupported);\n  return b;\n}\n\nUInt16 CInArchive::ReadUInt16()\n{\n  UInt16 value = 0;\n  for (int i = 0; i < 2; i++)\n  {\n    Byte b = ReadByte();\n    value |= (UInt16(b) << (8 * i));\n  }\n  return value;\n}\n\nUInt32 CInArchive::ReadUInt32()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    Byte b = ReadByte();\n    value |= (UInt32(b) << (8 * i));\n  }\n  return value;\n}\n\nAString CInArchive::SafeReadName()\n{\n  AString name;\n  for (;;)\n  {\n    Byte b = ReadByte();\n    if (b == 0)\n      return name;\n    name += (char)b;\n  }\n}\n\nvoid CInArchive::ReadOtherArchive(COtherArchive &oa)\n{\n  oa.FileName = SafeReadName();\n  oa.DiskName = SafeReadName();\n}\n\nvoid CInArchive::Skeep(size_t size)\n{\n  while (size-- != 0)\n    ReadByte();\n}\n\nHRESULT CInArchive::Open2(IInStream *stream,\n    const UInt64 *searchHeaderSizeLimit,\n    CDatabase &database)\n{\n  database.Clear();\n  RINOK(stream->Seek(0, STREAM_SEEK_SET, &database.StartPosition));\n\n  RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize,\n      searchHeaderSizeLimit, database.StartPosition));\n\n  RINOK(stream->Seek(database.StartPosition + NHeader::kMarkerSize, STREAM_SEEK_SET, NULL));\n  if (!inBuffer.Create(1 << 17))\n    return E_OUTOFMEMORY;\n  inBuffer.SetStream(stream);\n  inBuffer.Init();\n\n  CInArchiveInfo &ai = database.ArchiveInfo;\n\n  ai.Size = ReadUInt32();\n  if (ReadUInt32() != 0)\n    return S_FALSE;\n  ai.FileHeadersOffset = ReadUInt32();\n  if (ReadUInt32() != 0)\n    return S_FALSE;\n\n  ai.VersionMinor = ReadByte();\n  ai.VersionMajor = ReadByte();\n  ai.NumFolders = ReadUInt16();\n  ai.NumFiles = ReadUInt16();\n  ai.Flags = ReadUInt16();\n  if (ai.Flags > 7)\n    return S_FALSE;\n  ai.SetID = ReadUInt16();\n  ai.CabinetNumber = ReadUInt16();\n\n  if (ai.ReserveBlockPresent())\n  {\n    ai.PerCabinetAreaSize = ReadUInt16();\n    ai.PerFolderAreaSize = ReadByte();\n    ai.PerDataBlockAreaSize = ReadByte();\n\n    Skeep(ai.PerCabinetAreaSize);\n  }\n\n  {\n    if (ai.IsTherePrev())\n      ReadOtherArchive(ai.PreviousArchive);\n    if (ai.IsThereNext())\n      ReadOtherArchive(ai.NextArchive);\n  }\n  \n  int i;\n  for (i = 0; i < ai.NumFolders; i++)\n  {\n    CFolder folder;\n\n    folder.DataStart = ReadUInt32();\n    folder.NumDataBlocks = ReadUInt16();\n    folder.CompressionTypeMajor = ReadByte();\n    folder.CompressionTypeMinor = ReadByte();\n\n    Skeep(ai.PerFolderAreaSize);\n    database.Folders.Add(folder);\n  }\n  \n  RINOK(stream->Seek(database.StartPosition + ai.FileHeadersOffset, STREAM_SEEK_SET, NULL));\n\n  inBuffer.SetStream(stream);\n  inBuffer.Init();\n  for (i = 0; i < ai.NumFiles; i++)\n  {\n    CItem item;\n    item.Size = ReadUInt32();\n    item.Offset = ReadUInt32();\n    item.FolderIndex = ReadUInt16();\n    UInt16 pureDate = ReadUInt16();\n    UInt16 pureTime = ReadUInt16();\n    item.Time = ((UInt32(pureDate) << 16)) | pureTime;\n    item.Attributes = ReadUInt16();\n    item.Name = SafeReadName();\n    int folderIndex = item.GetFolderIndex(database.Folders.Size());\n    if (folderIndex >= database.Folders.Size())\n      return S_FALSE;\n    database.Items.Add(item);\n  }\n  return S_OK;\n}\n\n#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }\n\nHRESULT CInArchive::Open(\n    const UInt64 *searchHeaderSizeLimit,\n    CDatabaseEx &database)\n{\n  return Open2(database.Stream, searchHeaderSizeLimit, database);\n}\n\n\nstatic int CompareMvItems2(const CMvItem *p1, const CMvItem *p2)\n{\n  RINOZ(MyCompare(p1->VolumeIndex, p2->VolumeIndex));\n  return MyCompare(p1->ItemIndex, p2->ItemIndex);\n}\n\nstatic int CompareMvItems(const CMvItem *p1, const CMvItem *p2, void *param)\n{\n  const CMvDatabaseEx &mvDb = *(const CMvDatabaseEx *)param;\n  const CDatabaseEx &db1 = mvDb.Volumes[p1->VolumeIndex];\n  const CDatabaseEx &db2 = mvDb.Volumes[p2->VolumeIndex];\n  const CItem &item1 = db1.Items[p1->ItemIndex];\n  const CItem &item2 = db2.Items[p2->ItemIndex];;\n  bool isDir1 = item1.IsDir();\n  bool isDir2 = item2.IsDir();\n  if (isDir1 && !isDir2)\n    return -1;\n  if (isDir2 && !isDir1)\n    return 1;\n  int f1 = mvDb.GetFolderIndex(p1);\n  int f2 = mvDb.GetFolderIndex(p2);\n  RINOZ(MyCompare(f1, f2));\n  RINOZ(MyCompare(item1.Offset, item2.Offset));\n  RINOZ(MyCompare(item1.Size, item2.Size));\n  return CompareMvItems2(p1, p2);\n}\n\nbool CMvDatabaseEx::AreItemsEqual(int i1, int i2)\n{\n  const CMvItem *p1 = &Items[i1];\n  const CMvItem *p2 = &Items[i2];\n  const CDatabaseEx &db1 = Volumes[p1->VolumeIndex];\n  const CDatabaseEx &db2 = Volumes[p2->VolumeIndex];\n  const CItem &item1 = db1.Items[p1->ItemIndex];\n  const CItem &item2 = db2.Items[p2->ItemIndex];;\n  return GetFolderIndex(p1) == GetFolderIndex(p2) &&\n    item1.Offset == item2.Offset &&\n    item1.Size == item2.Size &&\n    item1.Name == item2.Name;\n}\n\nvoid CMvDatabaseEx::FillSortAndShrink()\n{\n  Items.Clear();\n  StartFolderOfVol.Clear();\n  FolderStartFileIndex.Clear();\n  int offset = 0;\n  for (int v = 0; v < Volumes.Size(); v++)\n  {\n    const CDatabaseEx &db = Volumes[v];\n    int curOffset = offset;\n    if (db.IsTherePrevFolder())\n      curOffset--;\n    StartFolderOfVol.Add(curOffset);\n    offset += db.GetNumberOfNewFolders();\n\n    CMvItem mvItem;\n    mvItem.VolumeIndex = v;\n    for (int i = 0 ; i < db.Items.Size(); i++)\n    {\n      mvItem.ItemIndex = i;\n      Items.Add(mvItem);\n    }\n  }\n\n  Items.Sort(CompareMvItems, (void *)this);\n  int j = 1;\n  int i;\n  for (i = 1; i < Items.Size(); i++)\n    if (!AreItemsEqual(i, i -1))\n      Items[j++] = Items[i];\n  Items.DeleteFrom(j);\n\n  for (i = 0; i < Items.Size(); i++)\n  {\n    const CMvItem &mvItem = Items[i];\n    int folderIndex = GetFolderIndex(&mvItem);\n    if (folderIndex >= FolderStartFileIndex.Size())\n      FolderStartFileIndex.Add(i);\n  }\n}\n\nbool CMvDatabaseEx::Check()\n{\n  for (int v = 1; v < Volumes.Size(); v++)\n  {\n    const CDatabaseEx &db1 = Volumes[v];\n    if (db1.IsTherePrevFolder())\n    {\n      const CDatabaseEx &db0 = Volumes[v - 1];\n      if (db0.Folders.IsEmpty() || db1.Folders.IsEmpty())\n        return false;\n      const CFolder &f0 = db0.Folders.Back();\n      const CFolder &f1 = db1.Folders.Front();\n      if (f0.CompressionTypeMajor != f1.CompressionTypeMajor ||\n          f0.CompressionTypeMinor != f1.CompressionTypeMinor)\n        return false;\n    }\n  }\n  UInt64 maxPos = 0;\n  int prevFolder = -2;\n  for (int i = 0; i < Items.Size(); i++)\n  {\n    const CMvItem &mvItem = Items[i];\n    int fIndex = GetFolderIndex(&mvItem);\n    if (fIndex >= FolderStartFileIndex.Size())\n      return false;\n    const CItem &item = Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];\n    if (item.IsDir())\n      continue;\n    int folderIndex = GetFolderIndex(&mvItem);\n    if (folderIndex != prevFolder)\n    {\n      prevFolder = folderIndex;\n      maxPos = 0;\n      continue;\n    }\n    if (item.Offset < maxPos)\n      return false;\n    maxPos = item.GetEndOffset();\n    if (maxPos < item.Offset)\n      return false;\n  }\n  return true;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabIn.h",
    "content": "// Archive/CabIn.h\n\n#ifndef __ARCHIVE_CAB_IN_H\n#define __ARCHIVE_CAB_IN_H\n\n#include \"../../IStream.h\"\n#include \"../../Common/InBuffer.h\"\n#include \"CabHeader.h\"\n#include \"CabItem.h\"\n\nnamespace NArchive {\nnamespace NCab {\n\nclass CInArchiveException\n{\npublic:\n  enum CCauseType\n  {\n    kUnexpectedEndOfArchive = 0,\n    kIncorrectArchive,\n    kUnsupported\n  } Cause;\n  CInArchiveException(CCauseType cause) : Cause(cause) {}\n};\n\nstruct COtherArchive\n{\n  AString FileName;\n  AString DiskName;\n};\n\nstruct CArchiveInfo\n{\n  Byte VersionMinor; /* cabinet file format version, minor */\n  Byte VersionMajor; /* cabinet file format version, major */\n  UInt16 NumFolders; /* number of CFFOLDER entries in this cabinet */\n  UInt16 NumFiles;   /* number of CFFILE entries in this cabinet */\n  UInt16 Flags;      /* cabinet file option indicators */\n  UInt16 SetID;      /* must be the same for all cabinets in a set */\n  UInt16 CabinetNumber; /* number of this cabinet file in a set */\n\n  bool ReserveBlockPresent() const { return (Flags & NHeader::NArchive::NFlags::kReservePresent) != 0; }\n\n  bool IsTherePrev() const { return (Flags & NHeader::NArchive::NFlags::kPrevCabinet) != 0; }\n  bool IsThereNext() const { return (Flags & NHeader::NArchive::NFlags::kNextCabinet) != 0; }\n\n  UInt16 PerCabinetAreaSize; // (optional) size of per-cabinet reserved area\n  Byte PerFolderAreaSize;    // (optional) size of per-folder reserved area\n  Byte PerDataBlockAreaSize; // (optional) size of per-datablock reserved area\n\n  Byte GetDataBlockReserveSize() const { return (Byte)(ReserveBlockPresent() ? PerDataBlockAreaSize : 0); }\n\n  COtherArchive PreviousArchive;\n  COtherArchive NextArchive;\n\n  CArchiveInfo()\n  {\n    Clear();\n  }\n\n  void Clear()\n  {\n    PerCabinetAreaSize = 0;\n    PerFolderAreaSize = 0;\n    PerDataBlockAreaSize = 0;\n   }\n};\n\nstruct CInArchiveInfo: public CArchiveInfo\n{\n  UInt32 Size; /* size of this cabinet file in bytes */\n  UInt32 FileHeadersOffset; // offset of the first CFFILE entry\n};\n\n\nclass CDatabase\n{\npublic:\n  UInt64 StartPosition;\n  CInArchiveInfo ArchiveInfo;\n  CObjectVector<CFolder> Folders;\n  CObjectVector<CItem> Items;\n  void Clear()\n  {\n    ArchiveInfo.Clear();\n    Folders.Clear();\n    Items.Clear();\n  }\n  bool IsTherePrevFolder() const\n  {\n    for (int i = 0; i < Items.Size(); i++)\n      if (Items[i].ContinuedFromPrev())\n        return true;\n    return false;\n  }\n  int GetNumberOfNewFolders() const\n  {\n    int res = Folders.Size();\n    if (IsTherePrevFolder())\n      res--;\n    return res;\n  }\n  UInt32 GetFileOffset(int index) const { return Items[index].Offset; }\n  UInt32 GetFileSize(int index) const { return Items[index].Size; }\n};\n\nclass CDatabaseEx: public CDatabase\n{\npublic:\n  CMyComPtr<IInStream> Stream;\n};\n\nstruct CMvItem\n{\n  int VolumeIndex;\n  int ItemIndex;\n};\n\nclass CMvDatabaseEx\n{\n  bool AreItemsEqual(int i1, int i2);\npublic:\n  CObjectVector<CDatabaseEx> Volumes;\n  CRecordVector<CMvItem> Items;\n  CRecordVector<int> StartFolderOfVol;\n  CRecordVector<int> FolderStartFileIndex;\n  int GetFolderIndex(const CMvItem *mvi) const\n  {\n    const CDatabaseEx &db = Volumes[mvi->VolumeIndex];\n    return StartFolderOfVol[mvi->VolumeIndex] +\n        db.Items[mvi->ItemIndex].GetFolderIndex(db.Folders.Size());\n  }\n  void Clear()\n  {\n    Volumes.Clear();\n    Items.Clear();\n    StartFolderOfVol.Clear();\n    FolderStartFileIndex.Clear();\n  }\n  void FillSortAndShrink();\n  bool Check();\n};\n\nclass CInArchive\n{\n  CInBuffer inBuffer;\n\n  Byte ReadByte();\n  UInt16 ReadUInt16();\n  UInt32 ReadUInt32();\n  AString SafeReadName();\n  void Skeep(size_t size);\n  void ReadOtherArchive(COtherArchive &oa);\n\n  HRESULT Open2(IInStream *inStream,\n      const UInt64 *searchHeaderSizeLimit,\n      CDatabase &database);\npublic:\n  HRESULT Open(\n      const UInt64 *searchHeaderSizeLimit,\n      CDatabaseEx &database);\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabItem.h",
    "content": "// Archive/CabItem.h\n\n#ifndef __ARCHIVE_CAB_ITEM_H\n#define __ARCHIVE_CAB_ITEM_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n#include \"CabHeader.h\"\n\nnamespace NArchive {\nnamespace NCab {\n\nstruct CFolder\n{\n  UInt32 DataStart; // offset of the first CFDATA block in this folder\n  UInt16 NumDataBlocks; // number of CFDATA blocks in this folder\n  Byte CompressionTypeMajor;\n  Byte CompressionTypeMinor;\n  Byte GetCompressionMethod() const { return (Byte)(CompressionTypeMajor & 0xF); }\n};\n\nstruct CItem\n{\n  AString Name;\n  UInt32 Offset;\n  UInt32 Size;\n  UInt32 Time;\n  UInt16 FolderIndex;\n  UInt16 Flags;\n  UInt16 Attributes;\n  \n  UInt64 GetEndOffset() const { return (UInt64)Offset + Size; }\n  UInt32 GetWinAttributes() const { return (Attributes & ~NHeader::kFileNameIsUTFAttributeMask); }\n  bool IsNameUTF() const { return (Attributes & NHeader::kFileNameIsUTFAttributeMask) != 0; }\n  bool IsDir() const { return (Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; }\n\n  bool ContinuedFromPrev() const\n  {\n    return\n      (FolderIndex == NHeader::NFolderIndex::kContinuedFromPrev) ||\n      (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext);\n  }\n  \n  bool ContinuedToNext() const\n  {\n    return\n      (FolderIndex == NHeader::NFolderIndex::kContinuedToNext) ||\n      (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext);\n  }\n\n  int GetFolderIndex(int numFolders) const\n  {\n    if (ContinuedFromPrev())\n      return 0;\n    if (ContinuedToNext())\n      return (numFolders - 1);\n    return FolderIndex;\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cab/CabRegister.cpp",
    "content": "// CabRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"CabHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NCab::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Cab\", L\"cab\", 0, 8, { 0x4D, 0x53, 0x43, 0x46 }, 4, false, CreateArc, 0 };\n\nREGISTER_ARC(Cab)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Chm/ChmHandler.cpp",
    "content": "// ChmHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/UTFConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n#include \"../../Compress/LzxDecoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"ChmHandler.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NChm {\n\n// #define _CHM_DETAILS\n\n#ifdef _CHM_DETAILS\n\nenum\n{\n  kpidSection = kpidUserDefined\n};\n\n#endif\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidBlock, VT_UI4}\n  \n  #ifdef _CHM_DETAILS\n  ,\n  { L\"Section\", kpidSection, VT_UI4},\n  { NULL, kpidOffset, VT_UI4}\n  #endif\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidNumBlocks, VT_UI8}\n};\n\nIMP_IInArchive_Props\n\nIMP_IInArchive_ArcProps_NO\n/*\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidNumBlocks:\n    {\n      UInt64 numBlocks = 0;\n      for (int i = 0; i < m_Database.Sections.Size(); i++)\n      {\n        const CSectionInfo &s = m_Database.Sections[i];\n        for (int j = 0; j < s.Methods.Size(); j++)\n        {\n          const CMethodInfo &m = s.Methods[j];\n          if (m.IsLzx())\n            numBlocks += m.LzxInfo.ResetTable.GetNumBlocks();\n        }\n      }\n      prop = numBlocks;\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n*/\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  if (m_Database.NewFormat)\n  {\n    switch(propID)\n    {\n      case kpidSize:\n        prop = (UInt64)m_Database.NewFormatString.Length();\n      break;\n    }\n    prop.Detach(value);\n    return S_OK;\n  }\n  int entryIndex;\n  if (m_Database.LowLevel)\n    entryIndex = index;\n  else\n    entryIndex = m_Database.Indices[index];\n  const CItem &item = m_Database.Items[entryIndex];\n  switch(propID)\n  {\n    case kpidPath:\n    {\n      UString us;\n      if (ConvertUTF8ToUnicode(item.Name, us))\n      {\n        if (!m_Database.LowLevel)\n        {\n          if (us.Length() > 1)\n            if (us[0] == L'/')\n              us.Delete(0);\n        }\n        prop = NItemName::GetOSName2(us);\n      }\n      break;\n    }\n    case kpidIsDir:  prop = item.IsDir(); break;\n    case kpidSize:  prop = item.Size; break;\n    case kpidMethod:\n    {\n      if (!item.IsDir())\n        if (item.Section == 0)\n          prop = L\"Copy\";\n        else if (item.Section < m_Database.Sections.Size())\n          prop = m_Database.Sections[(int)item.Section].GetMethodName();\n      break;\n    }\n    case kpidBlock:\n      if (m_Database.LowLevel)\n        prop = item.Section;\n      else if (item.Section != 0)\n        prop = m_Database.GetFolder(index);\n      break;\n    \n    #ifdef _CHM_DETAILS\n    \n    case kpidSection:  prop = (UInt32)item.Section; break;\n    case kpidOffset:  prop = (UInt32)item.Offset; break;\n\n    #endif\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nclass CProgressImp: public CProgressVirt\n{\n  CMyComPtr<IArchiveOpenCallback> _callback;\npublic:\n  STDMETHOD(SetTotal)(const UInt64 *numFiles);\n  STDMETHOD(SetCompleted)(const UInt64 *numFiles);\n  CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {};\n};\n\nSTDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles)\n{\n  if (_callback)\n    return _callback->SetCompleted(numFiles, NULL);\n  return S_OK;\n}\n\nSTDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)\n{\n  if (_callback)\n    return _callback->SetCompleted(numFiles, NULL);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 *maxCheckStartPosition,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  m_Stream.Release();\n  try\n  {\n    CInArchive archive;\n    // CProgressImp progressImp(openArchiveCallback);\n    RINOK(archive.Open(inStream, maxCheckStartPosition, m_Database));\n    /*\n    if (m_Database.LowLevel)\n      return S_FALSE;\n    */\n    m_Stream = inStream;\n  }\n  catch(...)\n  {\n    return S_FALSE;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  m_Database.Clear();\n  m_Stream.Release();\n  return S_OK;\n}\n\nclass CChmFolderOutStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK);\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n\n  UInt64 m_FolderSize;\n  UInt64 m_PosInFolder;\n  UInt64 m_PosInSection;\n  const CRecordVector<bool> *m_ExtractStatuses;\n  int m_StartIndex;\n  int m_CurrentIndex;\n  int m_NumFiles;\n\nprivate:\n  const CFilesDatabase *m_Database;\n  CMyComPtr<IArchiveExtractCallback> m_ExtractCallback;\n  bool m_TestMode;\n\n  bool m_IsOk;\n  bool m_FileIsOpen;\n  UInt64 m_RemainFileSize;\n  CMyComPtr<ISequentialOutStream> m_RealOutStream;\n\n  HRESULT OpenFile();\n  HRESULT WriteEmptyFiles();\npublic:\n  void Init(\n    const CFilesDatabase *database,\n    IArchiveExtractCallback *extractCallback,\n    bool testMode);\n  HRESULT FlushCorrupted(UInt64 maxSize);\n};\n\nvoid CChmFolderOutStream::Init(\n    const CFilesDatabase *database,\n    IArchiveExtractCallback *extractCallback,\n    bool testMode)\n{\n  m_Database = database;\n  m_ExtractCallback = extractCallback;\n  m_TestMode = testMode;\n\n  m_CurrentIndex = 0;\n  m_FileIsOpen = false;\n}\n\nHRESULT CChmFolderOutStream::OpenFile()\n{\n  Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ?\n      NExtract::NAskMode::kTest :\n      NExtract::NAskMode::kExtract) :\n      NExtract::NAskMode::kSkip;\n  m_RealOutStream.Release();\n  RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode));\n  if (!m_RealOutStream && !m_TestMode)\n    askMode = NArchive::NExtract::NAskMode::kSkip;\n  return m_ExtractCallback->PrepareOperation(askMode);\n}\n\nHRESULT CChmFolderOutStream::WriteEmptyFiles()\n{\n  if (m_FileIsOpen)\n    return S_OK;\n  for (;m_CurrentIndex < m_NumFiles; m_CurrentIndex++)\n  {\n    UInt64 fileSize = m_Database->GetFileSize(m_StartIndex + m_CurrentIndex);\n    if (fileSize != 0)\n      return S_OK;\n    HRESULT result = OpenFile();\n    m_RealOutStream.Release();\n    RINOK(result);\n    RINOK(m_ExtractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n  }\n  return S_OK;\n}\n\n// This is WritePart function\nHRESULT CChmFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK)\n{\n  UInt32 realProcessed = 0;\n  if (processedSize != NULL)\n   *processedSize = 0;\n  while(size != 0)\n  {\n    if (m_FileIsOpen)\n    {\n      UInt32 numBytesToWrite = (UInt32)MyMin(m_RemainFileSize, (UInt64)(size));\n      HRESULT res = S_OK;\n      if (numBytesToWrite > 0)\n      {\n        if (!isOK)\n          m_IsOk = false;\n        if (m_RealOutStream)\n        {\n          UInt32 processedSizeLocal = 0;\n          res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal);\n          numBytesToWrite = processedSizeLocal;\n        }\n      }\n      realProcessed += numBytesToWrite;\n      if (processedSize != NULL)\n        *processedSize = realProcessed;\n      data = (const void *)((const Byte *)data + numBytesToWrite);\n      size -= numBytesToWrite;\n      m_RemainFileSize -= numBytesToWrite;\n      m_PosInSection += numBytesToWrite;\n      m_PosInFolder += numBytesToWrite;\n      if (res != S_OK)\n        return res;\n      if (m_RemainFileSize == 0)\n      {\n        m_RealOutStream.Release();\n        RINOK(m_ExtractCallback->SetOperationResult(\n          m_IsOk ?\n            NArchive::NExtract::NOperationResult::kOK:\n            NArchive::NExtract::NOperationResult::kDataError));\n        m_FileIsOpen = false;\n      }\n      if (realProcessed > 0)\n        break; // with this break this function works as write part\n    }\n    else\n    {\n      if (m_CurrentIndex >= m_NumFiles)\n        return E_FAIL;\n      int fullIndex = m_StartIndex + m_CurrentIndex;\n      m_RemainFileSize = m_Database->GetFileSize(fullIndex);\n      UInt64 fileOffset = m_Database->GetFileOffset(fullIndex);\n      if (fileOffset < m_PosInSection)\n        return E_FAIL;\n      if (fileOffset > m_PosInSection)\n      {\n        UInt32 numBytesToWrite = (UInt32)MyMin(fileOffset - m_PosInSection, UInt64(size));\n        realProcessed += numBytesToWrite;\n        if (processedSize != NULL)\n          *processedSize = realProcessed;\n        data = (const void *)((const Byte *)data + numBytesToWrite);\n        size -= numBytesToWrite;\n        m_PosInSection += numBytesToWrite;\n        m_PosInFolder += numBytesToWrite;\n      }\n      if (fileOffset == m_PosInSection)\n      {\n        RINOK(OpenFile());\n        m_FileIsOpen = true;\n        m_CurrentIndex++;\n        m_IsOk = true;\n      }\n    }\n  }\n  return WriteEmptyFiles();\n}\n\nSTDMETHODIMP CChmFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  return Write2(data, size, processedSize, true);\n}\n\nHRESULT CChmFolderOutStream::FlushCorrupted(UInt64 maxSize)\n{\n  const UInt32 kBufferSize = (1 << 10);\n  Byte buffer[kBufferSize];\n  for (int i = 0; i < kBufferSize; i++)\n    buffer[i] = 0;\n  if (maxSize > m_FolderSize)\n    maxSize = m_FolderSize;\n  while (m_PosInFolder < maxSize)\n  {\n    UInt32 size = (UInt32)MyMin(maxSize - m_PosInFolder, (UInt64)kBufferSize);\n    UInt32 processedSizeLocal = 0;\n    RINOK(Write2(buffer, size, &processedSizeLocal, false));\n    if (processedSizeLocal == 0)\n      return S_OK;\n  }\n  return S_OK;\n}\n\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == UInt32(-1));\n\n  if (allFilesMode)\n    numItems = m_Database.NewFormat ? 1:\n      (m_Database.LowLevel ?\n      m_Database.Items.Size():\n      m_Database.Indices.Size());\n  if (numItems == 0)\n    return S_OK;\n  bool testMode = (_aTestMode != 0);\n\n  UInt64 currentTotalSize = 0;\n\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n  UInt32 i;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(m_Stream);\n\n  if (m_Database.LowLevel)\n  {\n    UInt64 currentItemSize = 0;\n    UInt64 totalSize = 0;\n    if (m_Database.NewFormat)\n      totalSize = m_Database.NewFormatString.Length();\n    else\n      for (i = 0; i < numItems; i++)\n        totalSize += m_Database.Items[allFilesMode ? i : indices[i]].Size;\n    extractCallback->SetTotal(totalSize);\n    \n    for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n    {\n      currentItemSize = 0;\n      lps->InSize = currentTotalSize; // Change it\n      lps->OutSize = currentTotalSize;\n\n      RINOK(lps->SetCur());\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      Int32 askMode= testMode ?\n          NArchive::NExtract::NAskMode::kTest :\n          NArchive::NExtract::NAskMode::kExtract;\n      Int32 index = allFilesMode ? i : indices[i];\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n      if (m_Database.NewFormat)\n      {\n        if (index != 0)\n          return E_FAIL;\n        if (!testMode && (!realOutStream))\n          continue;\n        if (!testMode)\n        {\n          UInt32 size = m_Database.NewFormatString.Length();\n          RINOK(WriteStream(realOutStream, (const char *)m_Database.NewFormatString, size));\n        }\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n        continue;\n      }\n      const CItem &item = m_Database.Items[index];\n      \n      currentItemSize = item.Size;\n      \n      if (!testMode && (!realOutStream))\n        continue;\n      RINOK(extractCallback->PrepareOperation(askMode));\n      if (item.Section != 0)\n      {\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n        continue;\n      }\n\n      if (testMode)\n      {\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n        continue;\n      }\n      \n      RINOK(m_Stream->Seek(m_Database.ContentOffset + item.Offset, STREAM_SEEK_SET, NULL));\n      streamSpec->Init(item.Size);\n      \n      RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));\n      realOutStream.Release();\n      RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?\n          NArchive::NExtract::NOperationResult::kOK:\n          NArchive::NExtract::NOperationResult::kDataError));\n    }\n    return S_OK;\n  }\n  \n  UInt64 lastFolderIndex = ((UInt64)0 - 1);\n  for (i = 0; i < numItems; i++)\n  {\n    UInt32 index = allFilesMode ? i : indices[i];\n    int entryIndex = m_Database.Indices[index];\n    const CItem &item = m_Database.Items[entryIndex];\n    UInt64 sectionIndex = item.Section;\n    if (item.IsDir() || item.Size == 0)\n      continue;\n    if (sectionIndex == 0)\n    {\n      currentTotalSize += item.Size;\n      continue;\n    }\n    const CSectionInfo &section = m_Database.Sections[(int)item.Section];\n    if (section.IsLzx())\n    {\n      const CLzxInfo &lzxInfo = section.Methods[0].LzxInfo;\n      UInt64 folderIndex = m_Database.GetFolder(index);\n      if (lastFolderIndex == folderIndex)\n        folderIndex++;\n      lastFolderIndex = m_Database.GetLastFolder(index);\n      for (; folderIndex <= lastFolderIndex; folderIndex++)\n        currentTotalSize += lzxInfo.GetFolderSize();\n    }\n  }\n\n  RINOK(extractCallback->SetTotal(currentTotalSize));\n\n  NCompress::NLzx::CDecoder *lzxDecoderSpec = 0;\n  CMyComPtr<ICompressCoder> lzxDecoder;\n  CChmFolderOutStream *chmFolderOutStream = 0;\n  CMyComPtr<ISequentialOutStream> outStream;\n\n  currentTotalSize = 0;\n\n  CRecordVector<bool> extractStatuses;\n  for (i = 0; i < numItems;)\n  {\n    RINOK(extractCallback->SetCompleted(&currentTotalSize));\n    UInt32 index = allFilesMode ? i : indices[i];\n    i++;\n    int entryIndex = m_Database.Indices[index];\n    const CItem &item = m_Database.Items[entryIndex];\n    UInt64 sectionIndex = item.Section;\n    Int32 askMode= testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    if (item.IsDir())\n    {\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      RINOK(extractCallback->PrepareOperation(askMode));\n      realOutStream.Release();\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n\n    lps->InSize = currentTotalSize; // Change it\n    lps->OutSize = currentTotalSize;\n\n    if (item.Size == 0 || sectionIndex == 0)\n    {\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      if (!testMode && (!realOutStream))\n        continue;\n      RINOK(extractCallback->PrepareOperation(askMode));\n      Int32 opRes = NArchive::NExtract::NOperationResult::kOK;\n      if (!testMode && item.Size != 0)\n      {\n        RINOK(m_Stream->Seek(m_Database.ContentOffset + item.Offset, STREAM_SEEK_SET, NULL));\n        streamSpec->Init(item.Size);\n        RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));\n        if (copyCoderSpec->TotalSize != item.Size)\n          opRes = NArchive::NExtract::NOperationResult::kDataError;\n      }\n      realOutStream.Release();\n      RINOK(extractCallback->SetOperationResult(opRes));\n      currentTotalSize += item.Size;\n      continue;\n    }\n  \n    const CSectionInfo &section = m_Database.Sections[(int)sectionIndex];\n\n    if (!section.IsLzx())\n    {\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      if(!testMode && (!realOutStream))\n        continue;\n      RINOK(extractCallback->PrepareOperation(askMode));\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n      continue;\n    }\n\n    const CLzxInfo &lzxInfo = section.Methods[0].LzxInfo;\n\n    if (chmFolderOutStream == 0)\n    {\n      chmFolderOutStream = new CChmFolderOutStream;\n      outStream = chmFolderOutStream;\n    }\n\n    chmFolderOutStream->Init(&m_Database, extractCallback, testMode);\n\n    if(lzxDecoderSpec == NULL)\n    {\n      lzxDecoderSpec = new NCompress::NLzx::CDecoder;\n      lzxDecoder = lzxDecoderSpec;\n    }\n\n    UInt64 folderIndex = m_Database.GetFolder(index);\n\n    UInt64 compressedPos = m_Database.ContentOffset + section.Offset;\n    UInt32 numDictBits = lzxInfo.GetNumDictBits();\n    RINOK(lzxDecoderSpec->SetParams(numDictBits));\n\n    const CItem *lastItem = &item;\n    extractStatuses.Clear();\n    extractStatuses.Add(true);\n\n    for (;; folderIndex++)\n    {\n      RINOK(extractCallback->SetCompleted(&currentTotalSize));\n\n      UInt64 startPos = lzxInfo.GetFolderPos(folderIndex);\n      UInt64 finishPos = lastItem->Offset + lastItem->Size;\n      UInt64 limitFolderIndex = lzxInfo.GetFolder(finishPos);\n\n      lastFolderIndex = m_Database.GetLastFolder(index);\n      UInt64 folderSize = lzxInfo.GetFolderSize();\n      UInt64 unPackSize = folderSize;\n      if (extractStatuses.IsEmpty())\n        chmFolderOutStream->m_StartIndex = index + 1;\n      else\n        chmFolderOutStream->m_StartIndex = index;\n      if (limitFolderIndex == folderIndex)\n      {\n        for (; i < numItems; i++)\n        {\n          UInt32 nextIndex = allFilesMode ? i : indices[i];\n          int entryIndex = m_Database.Indices[nextIndex];\n          const CItem &nextItem = m_Database.Items[entryIndex];\n          if (nextItem.Section != sectionIndex)\n            break;\n          UInt64 nextFolderIndex = m_Database.GetFolder(nextIndex);\n          if (nextFolderIndex != folderIndex)\n            break;\n          for (index++; index < nextIndex; index++)\n            extractStatuses.Add(false);\n          extractStatuses.Add(true);\n          index = nextIndex;\n          lastItem = &nextItem;\n          if (nextItem.Size != 0)\n            finishPos = nextItem.Offset + nextItem.Size;\n          lastFolderIndex = m_Database.GetLastFolder(index);\n        }\n      }\n      unPackSize = MyMin(finishPos - startPos, unPackSize);\n\n      chmFolderOutStream->m_FolderSize = folderSize;\n      chmFolderOutStream->m_PosInFolder = 0;\n      chmFolderOutStream->m_PosInSection = startPos;\n      chmFolderOutStream->m_ExtractStatuses = &extractStatuses;\n      chmFolderOutStream->m_NumFiles = extractStatuses.Size();\n      chmFolderOutStream->m_CurrentIndex = 0;\n      try\n      {\n        UInt64 startBlock = lzxInfo.GetBlockIndexFromFolderIndex(folderIndex);\n        const CResetTable &rt = lzxInfo.ResetTable;\n        UInt32 numBlocks = (UInt32)rt.GetNumBlocks(unPackSize);\n        for (UInt32 b = 0; b < numBlocks; b++)\n        {\n          UInt64 completedSize = currentTotalSize + chmFolderOutStream->m_PosInSection - startPos;\n          RINOK(extractCallback->SetCompleted(&completedSize));\n          UInt64 bCur = startBlock + b;\n          if (bCur >= rt.ResetOffsets.Size())\n            return E_FAIL;\n          UInt64 offset = rt.ResetOffsets[(int)bCur];\n          UInt64 compressedSize;\n          rt.GetCompressedSizeOfBlock(bCur, compressedSize);\n          UInt64 rem = finishPos - chmFolderOutStream->m_PosInSection;\n          if (rem > rt.BlockSize)\n            rem = rt.BlockSize;\n          RINOK(m_Stream->Seek(compressedPos + offset, STREAM_SEEK_SET, NULL));\n          streamSpec->SetStream(m_Stream);\n          streamSpec->Init(compressedSize);\n          lzxDecoderSpec->SetKeepHistory(b > 0);\n          HRESULT res = lzxDecoder->Code(inStream, outStream, NULL, &rem, NULL);\n          if (res != S_OK)\n          {\n            if (res != S_FALSE)\n              return res;\n            throw 1;\n          }\n        }\n      }\n      catch(...)\n      {\n        RINOK(chmFolderOutStream->FlushCorrupted(unPackSize));\n      }\n      currentTotalSize += folderSize;\n      if (folderIndex == lastFolderIndex)\n        break;\n      extractStatuses.Clear();\n    }\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n    *numItems = m_Database.NewFormat ? 1:\n      (m_Database.LowLevel ?\n      m_Database.Items.Size():\n      m_Database.Indices.Size());\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Chm/ChmHandler.h",
    "content": "// ChmHandler.h\n\n#ifndef __ARCHIVE_CHM_HANDLER_H\n#define __ARCHIVE_CHM_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n#include \"ChmIn.h\"\n\nnamespace NArchive {\nnamespace NChm {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CFilesDatabase m_Database;\n  CMyComPtr<IInStream> m_Stream;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Chm/ChmHeader.cpp",
    "content": "// Archive/Chm/Header.h\n\n#include \"StdAfx.h\"\n\n#include \"ChmHeader.h\"\n\nnamespace NArchive{\nnamespace NChm{\nnamespace NHeader{\n\nUInt32 kItsfSignature = 0x46535449 + 1;\nUInt32 kItolSignature = 0x4C4F5449 + 1;\nstatic class CSignatureInitializer\n{\npublic:\n  CSignatureInitializer()\n  {\n    kItsfSignature--;\n    kItolSignature--;\n  }\n}g_SignatureInitializer;\n\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Chm/ChmHeader.h",
    "content": "// Archive/Chm/Header.h\n\n#ifndef __ARCHIVE_CHM_HEADER_H\n#define __ARCHIVE_CHM_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NChm {\nnamespace NHeader{\n\nconst UInt32 kItspSignature = 0x50535449;\nconst UInt32 kPmglSignature = 0x4C474D50;\nconst UInt32 kLzxcSignature = 0x43585A4C;\n\nconst UInt32 kIfcmSignature = 0x4D434649;\nconst UInt32 kAollSignature = 0x4C4C4F41;\nconst UInt32 kCaolSignature = 0x4C4F4143;\n\nextern UInt32 kItsfSignature;\n\nextern UInt32 kItolSignature;\nconst UInt32 kItlsSignature = 0x534C5449;\nUInt64 inline GetHxsSignature() { return ((UInt64)kItlsSignature << 32) | kItolSignature; }\n  \n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Chm/ChmIn.cpp",
    "content": "// Archive/ChmIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/MyCom.h\"\n#include \"Common/UTFConvert.h\"\n#include \"Common/IntToString.h\"\n#include \"Windows/Defs.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"ChmIn.h\"\n\nnamespace NArchive{\nnamespace NChm{\n\n// define CHM_LOW, if you want to see low level items\n// #define CHM_LOW\n\nstatic const GUID kChmLzxGuid =\n  { 0x7FC28940, 0x9D31, 0x11D0, 0x9B, 0x27, 0x00, 0xA0, 0xC9, 0x1E, 0x9C, 0x7C };\nstatic const GUID kHelp2LzxGuid =\n  { 0x0A9007C6, 0x4076, 0x11D3, 0x87, 0x89, 0x00, 0x00, 0xF8, 0x10, 0x57, 0x54 };\nstatic const GUID kDesGuid =\n  { 0x67F6E4A2, 0x60BF, 0x11D3, 0x85, 0x40, 0x00, 0xC0, 0x4F, 0x58, 0xC3, 0xCF };\n\nstatic bool AreGuidsEqual(REFGUID g1, REFGUID g2)\n{\n  if (g1.Data1 != g2.Data1 ||\n      g1.Data2 != g2.Data2 ||\n      g1.Data3 != g2.Data3)\n    return false;\n  for (int i = 0; i < 8; i++)\n    if (g1.Data4[i] != g2.Data4[i])\n      return false;\n  return true;\n}\n\nstatic char GetHex(Byte value)\n{\n  return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));\n}\n\nstatic void PrintByte(Byte b, AString &s)\n{\n  s += GetHex(b >> 4);\n  s += GetHex(b & 0xF);\n}\n\nstatic void PrintUInt16(UInt16 v, AString &s)\n{\n  PrintByte((Byte)(v >> 8), s);\n  PrintByte((Byte)v, s);\n}\n\nstatic void PrintUInt32(UInt32 v, AString &s)\n{\n  PrintUInt16((UInt16)(v >> 16), s);\n  PrintUInt16((UInt16)v, s);\n}\n\nAString CMethodInfo::GetGuidString() const\n{\n  AString s;\n  s += '{';\n  PrintUInt32(Guid.Data1, s);\n  s += '-';\n  PrintUInt16(Guid.Data2, s);\n  s += '-';\n  PrintUInt16(Guid.Data3, s);\n  s += '-';\n  PrintByte(Guid.Data4[0], s);\n  PrintByte(Guid.Data4[1], s);\n  s += '-';\n  for (int i = 2; i < 8; i++)\n    PrintByte(Guid.Data4[i], s);\n  s += '}';\n  return s;\n}\n\nbool CMethodInfo::IsLzx() const\n{\n  if (AreGuidsEqual(Guid, kChmLzxGuid))\n    return true;\n  return AreGuidsEqual(Guid, kHelp2LzxGuid);\n}\n\nbool CMethodInfo::IsDes() const\n{\n  return AreGuidsEqual(Guid, kDesGuid);\n}\n\nUString CMethodInfo::GetName() const\n{\n  UString s;\n  if (IsLzx())\n  {\n    s = L\"LZX:\";\n    UInt32 numDictBits = LzxInfo.GetNumDictBits();\n    wchar_t temp[32];\n    ConvertUInt64ToString(numDictBits, temp);\n    s += temp;\n  }\n  else\n  {\n    AString s2;\n    if (IsDes())\n      s2 = \"DES\";\n    else\n    {\n      s2 = GetGuidString();\n      if (ControlData.GetCapacity() > 0)\n      {\n        s2 += \":\";\n        for (size_t i = 0; i < ControlData.GetCapacity(); i++)\n          PrintByte(ControlData[i], s2);\n      }\n    }\n    ConvertUTF8ToUnicode(s2, s);\n  }\n  return s;\n}\n\nbool CSectionInfo::IsLzx() const\n{\n  if (Methods.Size() != 1)\n    return false;\n  return Methods[0].IsLzx();\n}\n\nUString CSectionInfo::GetMethodName() const\n{\n  UString s;\n  if (!IsLzx())\n  {\n    UString temp;\n    if (ConvertUTF8ToUnicode(Name, temp))\n      s += temp;\n    s += L\": \";\n  }\n  for (int i = 0; i < Methods.Size(); i++)\n  {\n    if (i != 0)\n      s += L\" \";\n    s += Methods[i].GetName();\n  }\n  return s;\n}\n\nByte CInArchive::ReadByte()\n{\n  Byte b;\n  if (!_inBuffer.ReadByte(b))\n    throw 1;\n  return b;\n}\n\nvoid CInArchive::Skeep(size_t size)\n{\n  while (size-- != 0)\n    ReadByte();\n}\n\nvoid CInArchive::ReadBytes(Byte *data, UInt32 size)\n{\n  for (UInt32 i = 0; i < size; i++)\n    data[i] = ReadByte();\n}\n\nUInt16 CInArchive::ReadUInt16()\n{\n  UInt16 value = 0;\n  for (int i = 0; i < 2; i++)\n    value |= ((UInt16)(ReadByte()) << (8 * i));\n  return value;\n}\n\nUInt32 CInArchive::ReadUInt32()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n    value |= ((UInt32)(ReadByte()) << (8 * i));\n  return value;\n}\n\nUInt64 CInArchive::ReadUInt64()\n{\n  UInt64 value = 0;\n  for (int i = 0; i < 8; i++)\n    value |= ((UInt64)(ReadByte()) << (8 * i));\n  return value;\n}\n\nUInt64 CInArchive::ReadEncInt()\n{\n  UInt64 val = 0;;\n  for (int i = 0; i < 10; i++)\n  {\n    Byte b = ReadByte();\n    val |= (b & 0x7F);\n    if (b < 0x80)\n      return val;\n    val <<= 7;\n  }\n  throw 1;\n}\n\nvoid CInArchive::ReadGUID(GUID &g)\n{\n  g.Data1 = ReadUInt32();\n  g.Data2 = ReadUInt16();\n  g.Data3 = ReadUInt16();\n  ReadBytes(g.Data4, 8);\n}\n\nvoid CInArchive::ReadString(int size, AString &s)\n{\n  s.Empty();\n  while(size-- != 0)\n  {\n    char c = (char)ReadByte();\n    if (c == 0)\n    {\n      Skeep(size);\n      return;\n    }\n    s += c;\n  }\n}\n\nvoid CInArchive::ReadUString(int size, UString &s)\n{\n  s.Empty();\n  while(size-- != 0)\n  {\n    wchar_t c = ReadUInt16();\n    if (c == 0)\n    {\n      Skeep(2 * size);\n      return;\n    }\n    s += c;\n  }\n}\n\nHRESULT CInArchive::ReadChunk(IInStream *inStream, UInt64 pos, UInt64 size)\n{\n  RINOK(inStream->Seek(pos, STREAM_SEEK_SET, NULL));\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> limitedStream(streamSpec);\n  streamSpec->SetStream(inStream);\n  streamSpec->Init(size);\n  _inBuffer.SetStream(limitedStream);\n  _inBuffer.Init();\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadDirEntry(CDatabase &database)\n{\n  CItem item;\n  UInt64 nameLength = ReadEncInt();\n  if (nameLength == 0 || nameLength >= 0x10000000)\n    return S_FALSE;\n  ReadString((int)nameLength, item.Name);\n  item.Section = ReadEncInt();\n  item.Offset = ReadEncInt();\n  item.Size = ReadEncInt();\n  database.Items.Add(item);\n  return S_OK;\n}\n\nHRESULT CInArchive::OpenChm(IInStream *inStream, CDatabase &database)\n{\n  UInt32 headerSize = ReadUInt32();\n  if (headerSize != 0x60)\n    return S_FALSE;\n  UInt32 unknown1 = ReadUInt32();\n  if (unknown1 != 0 && unknown1 != 1) // it's 0 in one .sll file\n    return S_FALSE;\n  /* UInt32 timeStamp = */ ReadUInt32();\n      // Considered as a big-endian DWORD, it appears to contain seconds (MSB) and\n      // fractional seconds (second byte).\n      // The third and fourth bytes may contain even more fractional bits.\n      // The 4 least significant bits in the last byte are constant.\n  /* UInt32 lang = */ ReadUInt32();\n  GUID g;\n  ReadGUID(g); // {7C01FD10-7BAA-11D0-9E0C-00A0-C922-E6EC}\n  ReadGUID(g); // {7C01FD11-7BAA-11D0-9E0C-00A0-C922-E6EC}\n  const int kNumSections = 2;\n  UInt64 sectionOffsets[kNumSections];\n  UInt64 sectionSizes[kNumSections];\n  int i;\n  for (i = 0; i < kNumSections; i++)\n  {\n    sectionOffsets[i] = ReadUInt64();\n    sectionSizes[i] = ReadUInt64();\n  }\n  // if (chmVersion == 3)\n    database.ContentOffset = ReadUInt64();\n  /*\n  else\n    database.ContentOffset = _startPosition + 0x58\n  */\n\n  /*\n  // Section 0\n  ReadChunk(inStream, sectionOffsets[0], sectionSizes[0]);\n  if (sectionSizes[0] != 0x18)\n    return S_FALSE;\n  ReadUInt32(); // unknown:  01FE\n  ReadUInt32(); // unknown:  0\n  UInt64 fileSize = ReadUInt64();\n  ReadUInt32(); // unknown:  0\n  ReadUInt32(); // unknown:  0\n  */\n\n  // Section 1: The Directory Listing\n  ReadChunk(inStream, sectionOffsets[1], sectionSizes[1]);\n  if (ReadUInt32() != NHeader::kItspSignature)\n    return S_FALSE;\n  if (ReadUInt32() != 1) // version\n    return S_FALSE;\n  /* UInt32 dirHeaderSize = */ ReadUInt32();\n  ReadUInt32(); // 0x0A (unknown)\n  UInt32 dirChunkSize = ReadUInt32(); // $1000\n  if (dirChunkSize < 32)\n    return S_FALSE;\n  /* UInt32 density = */ ReadUInt32(); //  \"Density\" of quickref section, usually 2.\n  /* UInt32 depth = */ ReadUInt32(); //  Depth of the index tree: 1 there is no index,\n                               // 2 if there is one level of PMGI chunks.\n\n  /* UInt32 chunkNumber = */ ReadUInt32(); //  Chunk number of root index chunk, -1 if there is none\n                                     // (though at least one file has 0 despite there being no\n                                     // index chunk, probably a bug.)\n  /* UInt32 firstPmglChunkNumber = */ ReadUInt32(); // Chunk number of first PMGL (listing) chunk\n  /* UInt32 lastPmglChunkNumber = */ ReadUInt32();  // Chunk number of last PMGL (listing) chunk\n  ReadUInt32(); // -1 (unknown)\n  UInt32 numDirChunks = ReadUInt32(); // Number of directory chunks (total)\n  /* UInt32 windowsLangId = */ ReadUInt32();\n  ReadGUID(g);  // {5D02926A-212E-11D0-9DF9-00A0C922E6EC}\n  ReadUInt32(); // 0x54 (This is the length again)\n  ReadUInt32(); // -1 (unknown)\n  ReadUInt32(); // -1 (unknown)\n  ReadUInt32(); // -1 (unknown)\n\n  for (UInt32 ci = 0; ci < numDirChunks; ci++)\n  {\n    UInt64 chunkPos = _inBuffer.GetProcessedSize();\n    if (ReadUInt32() == NHeader::kPmglSignature)\n    {\n      // The quickref area is written backwards from the end of the chunk.\n      // One quickref entry exists for every n entries in the file, where n\n      // is calculated as 1 + (1 << quickref density). So for density = 2, n = 5.\n\n      UInt32 quickrefLength = ReadUInt32(); // Length of free space and/or quickref area at end of directory chunk\n      if (quickrefLength > dirChunkSize || quickrefLength < 2)\n        return S_FALSE;\n      ReadUInt32(); // Always 0\n      ReadUInt32(); // Chunk number of previous listing chunk when reading\n                    // directory in sequence (-1 if this is the first listing chunk)\n      ReadUInt32(); // Chunk number of next  listing chunk when reading\n                    // directory in sequence (-1 if this is the last listing chunk)\n      int numItems = 0;\n      for (;;)\n      {\n        UInt64 offset = _inBuffer.GetProcessedSize() - chunkPos;\n        UInt32 offsetLimit = dirChunkSize - quickrefLength;\n        if (offset > offsetLimit)\n          return S_FALSE;\n        if (offset == offsetLimit)\n          break;\n        RINOK(ReadDirEntry(database));\n        numItems++;\n      }\n      Skeep(quickrefLength - 2);\n      if (ReadUInt16() != numItems)\n        return S_FALSE;\n    }\n    else\n      Skeep(dirChunkSize - 4);\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::OpenHelp2(IInStream *inStream, CDatabase &database)\n{\n  if (ReadUInt32() != 1) // version\n    return S_FALSE;\n  if (ReadUInt32() != 0x28) // Location of header section table\n    return S_FALSE;\n  UInt32 numHeaderSections = ReadUInt32();\n  const int kNumHeaderSectionsMax = 5;\n  if (numHeaderSections != kNumHeaderSectionsMax)\n    return S_FALSE;\n  ReadUInt32(); // Length of post-header table\n  GUID g;\n  ReadGUID(g);  // {0A9007C1-4076-11D3-8789-0000F8105754}\n\n  // header section table\n  UInt64 sectionOffsets[kNumHeaderSectionsMax];\n  UInt64 sectionSizes[kNumHeaderSectionsMax];\n  UInt32 i;\n  for (i = 0; i < numHeaderSections; i++)\n  {\n    sectionOffsets[i] = ReadUInt64();\n    sectionSizes[i] = ReadUInt64();\n  }\n  \n  // Post-Header\n  ReadUInt32(); // 2\n  ReadUInt32(); // 0x98: offset to CAOL from beginning of post-header)\n  // ----- Directory information\n  ReadUInt64(); // Chunk number of top-level AOLI chunk in directory, or -1\n  ReadUInt64(); // Chunk number of first AOLL chunk in directory\n  ReadUInt64(); // Chunk number of last AOLL chunk in directory\n  ReadUInt64(); // 0 (unknown)\n  ReadUInt32(); // $2000 (Directory chunk size of directory)\n  ReadUInt32(); // Quickref density for main directory, usually 2\n  ReadUInt32(); // 0 (unknown)\n  ReadUInt32(); // Depth of main directory index tree\n                // 1 there is no index, 2 if there is one level of AOLI chunks.\n  ReadUInt64(); // 0 (unknown)\n  UInt64 numDirEntries = ReadUInt64(); // Number of directory entries\n  // ----- Directory Index Information\n  ReadUInt64(); // -1 (unknown, probably chunk number of top-level AOLI in directory index)\n  ReadUInt64(); // Chunk number of first AOLL chunk in directory index\n  ReadUInt64(); // Chunk number of last AOLL chunk in directory index\n  ReadUInt64(); // 0 (unknown)\n  ReadUInt32(); // $200 (Directory chunk size of directory index)\n  ReadUInt32(); // Quickref density for directory index, usually 2\n  ReadUInt32(); // 0 (unknown)\n  ReadUInt32(); // Depth of directory index index tree.\n  ReadUInt64(); // Possibly flags -- sometimes 1, sometimes 0.\n  ReadUInt64(); // Number of directory index entries (same as number of AOLL\n               // chunks in main directory)\n  \n  // (The obvious guess for the following two fields, which recur in a number\n  // of places, is they are maximum sizes for the directory and directory index.\n  // However, I have seen no direct evidence that this is the case.)\n\n  ReadUInt32(); // $100000 (Same as field following chunk size in directory)\n  ReadUInt32(); // $20000 (Same as field following chunk size in directory index)\n\n  ReadUInt64(); // 0 (unknown)\n  if (ReadUInt32() != NHeader::kCaolSignature)\n    return S_FALSE;\n  if (ReadUInt32() != 2) // (Most likely a version number)\n    return S_FALSE;\n  UInt32 caolLength = ReadUInt32(); // $50 (Length of the CAOL section, which includes the ITSF section)\n  if (caolLength >= 0x2C)\n  {\n    /* UInt32 c7 = */ ReadUInt16(); // Unknown.  Remains the same when identical files are built.\n              // Does not appear to be a checksum.  Many files have\n              // 'HH' (HTML Help?) here, indicating this may be a compiler ID\n              //  field.  But at least one ITOL/ITLS compiler does not set this\n              // field to a constant value.\n    ReadUInt16(); // 0 (Unknown.  Possibly part of 00A4 field)\n    ReadUInt32(); // Unknown.  Two values have been seen -- $43ED, and 0.\n    ReadUInt32(); // $2000 (Directory chunk size of directory)\n    ReadUInt32(); // $200 (Directory chunk size of directory index)\n    ReadUInt32(); // $100000 (Same as field following chunk size in directory)\n    ReadUInt32(); // $20000 (Same as field following chunk size in directory index)\n    ReadUInt32(); // 0 (unknown)\n    ReadUInt32(); // 0 (Unknown)\n    if (caolLength == 0x2C)\n    {\n      database.ContentOffset = 0;\n      database.NewFormat = true;\n    }\n    else if (caolLength == 0x50)\n    {\n      ReadUInt32(); // 0 (Unknown)\n      if (ReadUInt32() != NHeader::kItsfSignature)\n        return S_FALSE;\n      if (ReadUInt32() != 4) // $4 (Version number -- CHM uses 3)\n        return S_FALSE;\n      if (ReadUInt32() != 0x20) // $20 (length of ITSF)\n        return S_FALSE;\n      UInt32 unknown = ReadUInt32();\n      if (unknown != 0 && unknown != 1) // = 0 for some HxW files, 1 in other cases;\n        return S_FALSE;\n      database.ContentOffset = _startPosition + ReadUInt64();\n      /* UInt32 timeStamp = */ ReadUInt32();\n          // A timestamp of some sort.\n          // Considered as a big-endian DWORD, it appears to contain\n          // seconds (MSB) and fractional seconds (second byte).\n          // The third and fourth bytes may contain even more fractional\n          // bits.  The 4 least significant bits in the last byte are constant.\n      /* UInt32 lang = */ ReadUInt32(); // BE?\n    }\n    else\n      return S_FALSE;\n  }\n\n  /*\n  // Section 0\n  ReadChunk(inStream, _startPosition + sectionOffsets[0], sectionSizes[0]);\n  if (sectionSizes[0] != 0x18)\n    return S_FALSE;\n  ReadUInt32(); // unknown:  01FE\n  ReadUInt32(); // unknown:  0\n  UInt64 fileSize = ReadUInt64();\n  ReadUInt32(); // unknown:  0\n  ReadUInt32(); // unknown:  0\n  */\n\n  // Section 1: The Directory Listing\n  ReadChunk(inStream, _startPosition + sectionOffsets[1], sectionSizes[1]);\n  if (ReadUInt32() != NHeader::kIfcmSignature)\n    return S_FALSE;\n  if (ReadUInt32() != 1) // (probably a version number)\n    return S_FALSE;\n  UInt32 dirChunkSize = ReadUInt32(); // $2000\n  if (dirChunkSize < 64)\n    return S_FALSE;\n  ReadUInt32(); // $100000  (unknown)\n  ReadUInt32(); // -1 (unknown)\n  ReadUInt32(); // -1 (unknown)\n  UInt32 numDirChunks = ReadUInt32();\n  ReadUInt32(); // 0 (unknown, probably high word of above)\n\n  for (UInt32 ci = 0; ci < numDirChunks; ci++)\n  {\n    UInt64 chunkPos = _inBuffer.GetProcessedSize();\n    if (ReadUInt32() == NHeader::kAollSignature)\n    {\n      UInt32 quickrefLength = ReadUInt32(); // Length of quickref area at end of directory chunk\n      if (quickrefLength > dirChunkSize || quickrefLength < 2)\n        return S_FALSE;\n      ReadUInt64(); // Directory chunk number\n            // This must match physical position in file, that is\n            // the chunk size times the chunk number must be the\n            // offset from the end of the directory header.\n      ReadUInt64(); // Chunk number of previous listing chunk when reading\n                    // directory in sequence (-1 if first listing chunk)\n      ReadUInt64(); // Chunk number of next listing chunk when reading\n                    // directory in sequence (-1 if last listing chunk)\n      ReadUInt64(); // Number of first listing entry in this chunk\n      ReadUInt32(); // 1 (unknown -- other values have also been seen here)\n      ReadUInt32(); // 0 (unknown)\n      \n      int numItems = 0;\n      for (;;)\n      {\n        UInt64 offset = _inBuffer.GetProcessedSize() - chunkPos;\n        UInt32 offsetLimit = dirChunkSize - quickrefLength;\n        if (offset > offsetLimit)\n          return S_FALSE;\n        if (offset == offsetLimit)\n          break;\n        if (database.NewFormat)\n        {\n          UInt16 nameLength = ReadUInt16();\n          if (nameLength == 0)\n            return S_FALSE;\n          UString name;\n          ReadUString((int)nameLength, name);\n          AString s;\n          ConvertUnicodeToUTF8(name, s);\n          Byte b = ReadByte();\n          s += ' ';\n          PrintByte(b, s);\n          s += ' ';\n          UInt64 len = ReadEncInt();\n          // then number of items ?\n          // then length ?\n          // then some data (binary encoding?)\n          while (len-- != 0)\n          {\n            b = ReadByte();\n            PrintByte(b, s);\n          }\n          database.NewFormatString += s;\n          database.NewFormatString += \"\\r\\n\";\n        }\n        else\n        {\n          RINOK(ReadDirEntry(database));\n        }\n        numItems++;\n      }\n      Skeep(quickrefLength - 2);\n      if (ReadUInt16() != numItems)\n        return S_FALSE;\n      if (numItems > numDirEntries)\n        return S_FALSE;\n      numDirEntries -= numItems;\n    }\n    else\n      Skeep(dirChunkSize - 4);\n  }\n  return numDirEntries == 0 ? S_OK : S_FALSE;\n}\n\nHRESULT CInArchive::DecompressStream(IInStream *inStream, const CDatabase &database, const AString &name)\n{\n  int index = database.FindItem(name);\n  if (index < 0)\n    return S_FALSE;\n  const CItem &item = database.Items[index];\n  _chunkSize = item.Size;\n  return ReadChunk(inStream, database.ContentOffset + item.Offset, item.Size);\n}\n\n\n#define DATA_SPACE \"::DataSpace/\"\nstatic const char *kNameList = DATA_SPACE \"NameList\";\nstatic const char *kStorage = DATA_SPACE \"Storage/\";\nstatic const char *kContent = \"Content\";\nstatic const char *kControlData = \"ControlData\";\nstatic const char *kSpanInfo = \"SpanInfo\";\nstatic const char *kTransform = \"Transform/\";\nstatic const char *kResetTable = \"/InstanceData/ResetTable\";\nstatic const char *kTransformList = \"List\";\n\nstatic AString GetSectionPrefix(const AString &name)\n{\n  return AString(kStorage) + name + AString(\"/\");\n}\n\n#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }\n\nstatic int CompareFiles(const int *p1, const int *p2, void *param)\n{\n  const CObjectVector<CItem> &items = *(const CObjectVector<CItem> *)param;\n  const CItem &item1 = items[*p1];\n  const CItem &item2 = items[*p2];\n  bool isDir1 = item1.IsDir();\n  bool isDir2 = item2.IsDir();\n  if (isDir1 && !isDir2)\n    return -1;\n  if (isDir2)\n  {\n    if (isDir1)\n      return MyCompare(*p1, *p2);\n    return 1;\n  }\n  RINOZ(MyCompare(item1.Section, item2.Section));\n  RINOZ(MyCompare(item1.Offset, item2.Offset));\n  RINOZ(MyCompare(item1.Size, item2.Size));\n  return MyCompare(*p1, *p2);\n}\n\nvoid CFilesDatabase::SetIndices()\n{\n  for (int i = 0; i < Items.Size(); i++)\n  {\n    const CItem &item = Items[i];\n    if (item.IsUserItem() && item.Name.Length() != 1)\n      Indices.Add(i);\n  }\n}\n\nvoid CFilesDatabase::Sort()\n{\n  Indices.Sort(CompareFiles, (void *)&Items);\n}\n\nbool CFilesDatabase::Check()\n{\n  UInt64 maxPos = 0;\n  UInt64 prevSection = 0;\n  for(int i = 0; i < Indices.Size(); i++)\n  {\n    const CItem &item = Items[Indices[i]];\n    if (item.Section == 0 || item.IsDir())\n      continue;\n    if (item.Section != prevSection)\n    {\n      prevSection = item.Section;\n      maxPos = 0;\n      continue;\n    }\n    if (item.Offset < maxPos)\n      return false;\n    maxPos = item.Offset + item.Size;\n    if (maxPos < item.Offset)\n      return false;\n  }\n  return true;\n}\n\nHRESULT CInArchive::OpenHighLevel(IInStream *inStream, CFilesDatabase &database)\n{\n  {\n    // The NameList file\n    RINOK(DecompressStream(inStream, database, kNameList));\n    /* UInt16 length = */ ReadUInt16();\n    UInt16 numSections = ReadUInt16();\n    for (int i = 0; i < numSections; i++)\n    {\n      CSectionInfo section;\n      UInt16 nameLength  = ReadUInt16();\n      UString name;\n      ReadUString(nameLength, name);\n      if (ReadUInt16() != 0)\n        return S_FALSE;\n      if (!ConvertUnicodeToUTF8(name, section.Name))\n        return S_FALSE;\n      database.Sections.Add(section);\n    }\n  }\n\n  int i;\n  for (i = 1; i < database.Sections.Size(); i++)\n  {\n    CSectionInfo &section = database.Sections[i];\n    AString sectionPrefix = GetSectionPrefix(section.Name);\n    {\n      // Content\n      int index = database.FindItem(sectionPrefix + kContent);\n      if (index < 0)\n        return S_FALSE;\n      const CItem &item = database.Items[index];\n      section.Offset = item.Offset;\n      section.CompressedSize = item.Size;\n    }\n    AString transformPrefix = sectionPrefix + kTransform;\n    if (database.Help2Format)\n    {\n      // Transform List\n      RINOK(DecompressStream(inStream, database, transformPrefix + kTransformList));\n      if ((_chunkSize & 0xF) != 0)\n        return S_FALSE;\n      int numGuids = (int)(_chunkSize / 0x10);\n      if (numGuids < 1)\n        return S_FALSE;\n      for (int i = 0; i < numGuids; i++)\n      {\n        CMethodInfo method;\n        ReadGUID(method.Guid);\n        section.Methods.Add(method);\n      }\n    }\n    else\n    {\n      CMethodInfo method;\n      method.Guid = kChmLzxGuid;\n      section.Methods.Add(method);\n    }\n\n    {\n      // Control Data\n      RINOK(DecompressStream(inStream, database, sectionPrefix + kControlData));\n      for (int mi = 0; mi < section.Methods.Size(); mi++)\n      {\n        CMethodInfo &method = section.Methods[mi];\n        UInt32 numDWORDS = ReadUInt32();\n        if (method.IsLzx())\n        {\n          if (numDWORDS < 5)\n            return S_FALSE;\n          if (ReadUInt32() != NHeader::kLzxcSignature)\n            return S_FALSE;\n          CLzxInfo &li = method.LzxInfo;\n          li.Version = ReadUInt32();\n          if (li.Version != 2 && li.Version != 3)\n            return S_FALSE;\n          li.ResetInterval = ReadUInt32();\n          li.WindowSize = ReadUInt32();\n          li.CacheSize = ReadUInt32();\n          if (\n              li.ResetInterval != 1 &&\n              li.ResetInterval != 2 &&\n              li.ResetInterval != 4 &&\n              li.ResetInterval != 8 &&\n              li.ResetInterval != 16 &&\n              li.ResetInterval != 32 &&\n              li.ResetInterval != 64)\n            return S_FALSE;\n          if (\n              li.WindowSize != 1 &&\n              li.WindowSize != 2 &&\n              li.WindowSize != 4 &&\n              li.WindowSize != 8 &&\n              li.WindowSize != 16 &&\n              li.WindowSize != 32 &&\n              li.WindowSize != 64)\n            return S_FALSE;\n          numDWORDS -= 5;\n          while (numDWORDS-- != 0)\n            ReadUInt32();\n        }\n        else\n        {\n          UInt32 numBytes = numDWORDS * 4;\n          method.ControlData.SetCapacity(numBytes);\n          ReadBytes(method.ControlData, numBytes);\n        }\n      }\n    }\n\n    {\n      // SpanInfo\n      RINOK(DecompressStream(inStream, database, sectionPrefix + kSpanInfo));\n      section.UncompressedSize = ReadUInt64();\n    }\n\n    // read ResetTable for LZX\n    for (int mi = 0; mi < section.Methods.Size(); mi++)\n    {\n      CMethodInfo &method = section.Methods[mi];\n      if (method.IsLzx())\n      {\n        // ResetTable;\n        RINOK(DecompressStream(inStream, database, transformPrefix +\n            method.GetGuidString() + kResetTable));\n        CResetTable &rt = method.LzxInfo.ResetTable;\n        if (_chunkSize < 4)\n        {\n          if (_chunkSize != 0)\n            return S_FALSE;\n          // ResetTable is empty in .chw files\n          if (section.UncompressedSize != 0)\n            return S_FALSE;\n          rt.UncompressedSize = 0;\n          rt.CompressedSize = 0;\n          rt.BlockSize = 0;\n        }\n        else\n        {\n          UInt32 ver = ReadUInt32(); // 2  unknown (possibly a version number)\n          if (ver != 2 && ver != 3)\n            return S_FALSE;\n          UInt32 numEntries = ReadUInt32();\n          if (ReadUInt32() != 8) // Size of table entry (bytes)\n            return S_FALSE;\n          if (ReadUInt32() != 0x28) // Length of table header\n            return S_FALSE;\n          rt.UncompressedSize = ReadUInt64();\n          rt.CompressedSize = ReadUInt64();\n          rt.BlockSize = ReadUInt64(); //  0x8000 block size for locations below\n          if (rt.BlockSize != 0x8000)\n            return S_FALSE;\n          rt.ResetOffsets.Reserve(numEntries);\n          for (UInt32 i = 0; i < numEntries; i++)\n            rt.ResetOffsets.Add(ReadUInt64());\n        }\n      }\n    }\n  }\n\n  database.SetIndices();\n  database.Sort();\n  return database.Check() ? S_OK : S_FALSE;\n}\n\nHRESULT CInArchive::Open2(IInStream *inStream,\n    const UInt64 *searchHeaderSizeLimit,\n    CFilesDatabase &database)\n{\n  database.Clear();\n\n  RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &_startPosition));\n\n  database.Help2Format = false;\n  const UInt32 chmVersion = 3;\n  {\n    if (!_inBuffer.Create(1 << 14))\n      return E_OUTOFMEMORY;\n    _inBuffer.SetStream(inStream);\n    _inBuffer.Init();\n    UInt64 value = 0;\n    const int kSignatureSize = 8;\n    UInt64 hxsSignature = NHeader::GetHxsSignature();\n    UInt64 chmSignature = ((UInt64)chmVersion << 32)| NHeader::kItsfSignature;\n    UInt64 limit = 1 << 18;\n    if (searchHeaderSizeLimit)\n      if (limit > *searchHeaderSizeLimit)\n        limit = *searchHeaderSizeLimit;\n\n    for (;;)\n    {\n      Byte b;\n      if (!_inBuffer.ReadByte(b))\n        return S_FALSE;\n      value >>= 8;\n      value |= ((UInt64)b) << ((kSignatureSize - 1) * 8);\n      if (_inBuffer.GetProcessedSize() >= kSignatureSize)\n      {\n        if (value == chmSignature)\n          break;\n        if (value == hxsSignature)\n        {\n          database.Help2Format = true;\n          break;\n        }\n        if (_inBuffer.GetProcessedSize() > limit)\n          return S_FALSE;\n      }\n    }\n    _startPosition += _inBuffer.GetProcessedSize() - kSignatureSize;\n  }\n\n  if (database.Help2Format)\n  {\n    RINOK(OpenHelp2(inStream, database));\n    if (database.NewFormat)\n      return S_OK;\n  }\n  else\n  {\n    RINOK(OpenChm(inStream, database));\n  }\n\n  #ifndef CHM_LOW\n  try\n  {\n    HRESULT res = OpenHighLevel(inStream, database);\n    if (res == S_FALSE)\n    {\n      database.HighLevelClear();\n      return S_OK;\n    }\n    RINOK(res);\n    database.LowLevel = false;\n  }\n  catch(...)\n  {\n    return S_OK;\n  }\n  #endif\n  return S_OK;\n}\n\nHRESULT CInArchive::Open(IInStream *inStream,\n    const UInt64 *searchHeaderSizeLimit,\n    CFilesDatabase &database)\n{\n  try\n  {\n    HRESULT res = Open2(inStream, searchHeaderSizeLimit, database);\n    _inBuffer.ReleaseStream();\n    return res;\n  }\n  catch(...)\n  {\n    _inBuffer.ReleaseStream();\n    throw;\n  }\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Chm/ChmIn.h",
    "content": "// Archive/ChmIn.h\n\n#ifndef __ARCHIVE_CHM_IN_H\n#define __ARCHIVE_CHM_IN_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n#include \"../../IStream.h\"\n#include \"../../Common/InBuffer.h\"\n#include \"ChmHeader.h\"\n\nnamespace NArchive {\nnamespace NChm {\n\nstruct CItem\n{\n  UInt64 Section;\n  UInt64 Offset;\n  UInt64 Size;\n  AString Name;\n\n  bool IsFormatRelatedItem() const\n  {\n    if (Name.Length() < 2)\n      return false;\n    return Name[0] == ':' && Name[1] == ':';\n  }\n  \n  bool IsUserItem() const\n  {\n    if (Name.Length() < 2)\n      return false;\n    return Name[0] == '/';\n  }\n  \n  bool IsDir() const\n  {\n    if (Name.Length() == 0)\n      return false;\n    return (Name[Name.Length() - 1] == '/');\n  }\n};\n\nstruct CDatabase\n{\n  UInt64 ContentOffset;\n  CObjectVector<CItem> Items;\n  AString NewFormatString;\n  bool Help2Format;\n  bool NewFormat;\n\n  int FindItem(const AString &name) const\n  {\n    for (int i = 0; i < Items.Size(); i++)\n      if (Items[i].Name == name)\n        return i;\n    return -1;\n  }\n\n  void Clear()\n  {\n    NewFormat = false;\n    NewFormatString.Empty();\n    Help2Format = false;\n    Items.Clear();\n  }\n};\n\nstruct CResetTable\n{\n  UInt64 UncompressedSize;\n  UInt64 CompressedSize;\n  UInt64 BlockSize;\n  CRecordVector<UInt64> ResetOffsets;\n  bool GetCompressedSizeOfBlocks(UInt64 blockIndex, UInt32 numBlocks, UInt64 &size) const\n  {\n    if (blockIndex >= ResetOffsets.Size())\n      return false;\n    UInt64 startPos = ResetOffsets[(int)blockIndex];\n    if (blockIndex + numBlocks >= ResetOffsets.Size())\n      size = CompressedSize - startPos;\n    else\n      size = ResetOffsets[(int)(blockIndex + numBlocks)] - startPos;\n    return true;\n  }\n  bool GetCompressedSizeOfBlock(UInt64 blockIndex, UInt64 &size) const\n  {\n    return GetCompressedSizeOfBlocks(blockIndex, 1, size);\n  }\n  UInt64 GetNumBlocks(UInt64 size) const\n  {\n    return (size + BlockSize - 1) / BlockSize;\n  }\n};\n\nstruct CLzxInfo\n{\n  UInt32 Version;\n  UInt32 ResetInterval;\n  UInt32 WindowSize;\n  UInt32 CacheSize;\n  CResetTable ResetTable;\n\n  UInt32 GetNumDictBits() const\n  {\n    if (Version == 2 || Version == 3)\n    {\n      for (int i = 0; i <= 31; i++)\n        if (((UInt32)1 << i) >= WindowSize)\n          return 15 + i;\n    }\n    return 0;\n  }\n\n  UInt64 GetFolderSize() const { return ResetTable.BlockSize * ResetInterval; };\n  UInt64 GetFolder(UInt64 offset) const { return offset / GetFolderSize(); };\n  UInt64 GetFolderPos(UInt64 folderIndex) const { return folderIndex * GetFolderSize(); };\n  UInt64 GetBlockIndexFromFolderIndex(UInt64 folderIndex) const { return folderIndex * ResetInterval; };\n  bool GetOffsetOfFolder(UInt64 folderIndex, UInt64 &offset) const\n  {\n    UInt64 blockIndex = GetBlockIndexFromFolderIndex(folderIndex);\n    if (blockIndex >= ResetTable.ResetOffsets.Size())\n      return false;\n    offset = ResetTable.ResetOffsets[(int)blockIndex];\n    return true;\n  }\n  bool GetCompressedSizeOfFolder(UInt64 folderIndex, UInt64 &size) const\n  {\n    UInt64 blockIndex = GetBlockIndexFromFolderIndex(folderIndex);\n    return ResetTable.GetCompressedSizeOfBlocks(blockIndex, ResetInterval, size);\n  }\n};\n\nstruct CMethodInfo\n{\n  GUID Guid;\n  CByteBuffer ControlData;\n  CLzxInfo LzxInfo;\n  bool IsLzx() const;\n  bool IsDes() const;\n  AString GetGuidString() const;\n  UString GetName() const;\n};\n\nstruct CSectionInfo\n{\n  UInt64 Offset;\n  UInt64 CompressedSize;\n  UInt64 UncompressedSize;\n\n  AString Name;\n  CObjectVector<CMethodInfo> Methods;\n\n  bool IsLzx() const;\n  UString GetMethodName() const;\n};\n\nclass CFilesDatabase: public CDatabase\n{\npublic:\n  bool LowLevel;\n  CRecordVector<int> Indices;\n  CObjectVector<CSectionInfo> Sections;\n\n  UInt64 GetFileSize(int fileIndex) const { return Items[Indices[fileIndex]].Size; }\n  UInt64 GetFileOffset(int fileIndex) const { return Items[Indices[fileIndex]].Offset; }\n\n  UInt64 GetFolder(int fileIndex) const\n  {\n    const CItem &item = Items[Indices[fileIndex]];\n    const CSectionInfo &section = Sections[(int)item.Section];\n    if (section.IsLzx())\n      return section.Methods[0].LzxInfo.GetFolder(item.Offset);\n    return 0;\n  }\n\n  UInt64 GetLastFolder(int fileIndex) const\n  {\n    const CItem &item = Items[Indices[fileIndex]];\n    const CSectionInfo &section = Sections[(int)item.Section];\n    if (section.IsLzx())\n      return section.Methods[0].LzxInfo.GetFolder(item.Offset + item.Size - 1);\n    return 0;\n  }\n\n  void HighLevelClear()\n  {\n    LowLevel = true;\n    Indices.Clear();\n    Sections.Clear();\n  }\n\n  void Clear()\n  {\n    CDatabase::Clear();\n    HighLevelClear();\n  }\n  void SetIndices();\n  void Sort();\n  bool Check();\n};\n\nclass CProgressVirt\n{\npublic:\n  STDMETHOD(SetTotal)(const UInt64 *numFiles) PURE;\n  STDMETHOD(SetCompleted)(const UInt64 *numFiles) PURE;\n};\n\nclass CInArchive\n{\n  UInt64 _startPosition;\n  ::CInBuffer _inBuffer;\n  UInt64 _chunkSize;\n\n  Byte ReadByte();\n  void ReadBytes(Byte *data, UInt32 size);\n  void Skeep(size_t size);\n  UInt16 ReadUInt16();\n  UInt32 ReadUInt32();\n  UInt64 ReadUInt64();\n  UInt64 ReadEncInt();\n  void ReadString(int size, AString &s);\n  void ReadUString(int size, UString &s);\n  void ReadGUID(GUID &g);\n\n  HRESULT ReadChunk(IInStream *inStream, UInt64 pos, UInt64 size);\n\n  HRESULT ReadDirEntry(CDatabase &database);\n  HRESULT DecompressStream(IInStream *inStream, const CDatabase &database, const AString &name);\n\npublic:\n  HRESULT OpenChm(IInStream *inStream, CDatabase &database);\n  HRESULT OpenHelp2(IInStream *inStream, CDatabase &database);\n  HRESULT OpenHighLevel(IInStream *inStream, CFilesDatabase &database);\n  HRESULT Open2(IInStream *inStream, const UInt64 *searchHeaderSizeLimit, CFilesDatabase &database);\n  HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit, CFilesDatabase &database);\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Chm/ChmRegister.cpp",
    "content": "// ChmRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"ChmHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NChm::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Chm\", L\"chm chi chq chw hxs hxi hxr hxq hxw lit\", 0, 0xE9, { 'I', 'T', 'S', 'F' }, 4, false, CreateArc, 0 };\n\nREGISTER_ARC(Chm)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Com/ComHandler.cpp",
    "content": "// ComHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Windows/PropVariant.h\"\n#include \"../../Common/StreamUtils.h\"\n#include \"ComHandler.h\"\n\nnamespace NArchive {\nnamespace NCom {\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  // { NULL, kpidAttributes, VT_UI4},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidMTime, VT_FILETIME}\n};\n\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidClusterSize, VT_UI4}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidClusterSize: prop = (UInt32)1 << _db.SectorSizeBits; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CRef &ref = _db.Refs[index];\n  const CItem &item = _db.Items[ref.Did];\n    \n  switch(propID)\n  {\n    case kpidPath:\n    {\n      UString name = _db.GetItemPath(index);\n      prop = name;\n      break;\n    }\n    case kpidIsDir:  prop = item.IsDir(); break;\n    case kpidCTime:  prop = item.CTime; break;\n    case kpidMTime:  prop = item.MTime; break;\n    /*\n    case kpidAttributes:\n      prop = item.Falgs;\n      break;\n    */\n    case kpidPackSize:\n      if (!item.IsDir())\n      {\n        int numBits = _db.IsLargeStream(item.Size) ?\n            _db.SectorSizeBits :\n            _db.MiniSectorSizeBits;\n        prop = (item.Size + ((UInt64)1 << numBits) - 1) >> numBits << numBits;\n        break;\n      }\n    case kpidSize:\n      if (!item.IsDir())\n        prop = (UInt64)item.Size;\n      break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  Close();\n  try\n  {\n    if (OpenArchive(inStream, _db) != S_OK)\n      return S_FALSE;\n    _stream = inStream;\n  }\n  catch(...) { return S_FALSE; }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _db.Clear();\n  _stream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _db.Refs.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt32 i;\n  UInt64 totalSize = 0;\n  for(i = 0; i < numItems; i++)\n  {\n    const CItem &item = _db.Items[_db.Refs[allFilesMode ? i : indices[i]].Did];\n    if (!item.IsDir())\n      totalSize += item.Size;\n  }\n  RINOK(extractCallback->SetTotal(totalSize));\n\n  UInt64 currentTotalSize = 0, currentItemSize = 0;\n  \n  CByteBuffer sect;\n  sect.SetCapacity((UInt32)1 << _db.SectorSizeBits);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    RINOK(extractCallback->SetCompleted(&currentTotalSize));\n    Int32 index = allFilesMode ? i : indices[i];\n    const CItem &item = _db.Items[_db.Refs[index].Did];\n    currentItemSize = 0;\n    if (!item.IsDir())\n      currentItemSize = item.Size;\n\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    if (item.IsDir())\n    {\n      RINOK(extractCallback->PrepareOperation(askMode));\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n    Int32 res = NArchive::NExtract::NOperationResult::kDataError;\n    {\n      UInt32 sid = item.Sid;\n      UInt64 prev = 0;\n      for (UInt64 pos = 0;;)\n      {\n        if (sid == NFatID::kEndOfChain)\n        {\n          if (pos != item.Size)\n            break;\n          res = NArchive::NExtract::NOperationResult::kOK;\n          break;\n        }\n        if (pos >= item.Size)\n          break;\n          \n        UInt64 offset;\n        UInt32 size;\n\n        if (_db.IsLargeStream(item.Size))\n        {\n          if (pos - prev > (1 << 20))\n          {\n            UInt64 processed = currentTotalSize + pos;\n            RINOK(extractCallback->SetCompleted(&processed));\n            prev = pos;\n          }\n          size = 1 << _db.SectorSizeBits;\n          offset = ((UInt64)sid + 1) << _db.SectorSizeBits;\n          if (sid >= _db.FatSize)\n            break;\n          sid = _db.Fat[sid];\n        }\n        else\n        {\n          int subBits = (_db.SectorSizeBits - _db.MiniSectorSizeBits);\n          UInt32 fid = sid >> subBits;\n          if (fid >= _db.NumSectorsInMiniStream)\n            break;\n          size = 1 << _db.MiniSectorSizeBits;\n          offset = (((UInt64)_db.MiniSids[fid] + 1) << _db.SectorSizeBits) +\n            ((sid & ((1 << subBits) - 1)) << _db.MiniSectorSizeBits);\n          if (sid >= _db.MatSize)\n            break;\n          sid = _db.Mat[sid];\n        }\n        \n        // last sector can be smaller than sector size (it can contain requied data only).\n        UInt64 rem = item.Size - pos;\n        if (size > rem)\n          size = (UInt32)rem;\n\n        RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));\n        size_t realProcessedSize = size;\n        RINOK(ReadStream(_stream, sect, &realProcessedSize));\n        if (realProcessedSize != size)\n          break;\n\n        if (realOutStream)\n        {\n          RINOK(WriteStream(realOutStream, sect, size));\n        }\n        pos += size;\n      }\n    }\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult(res));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _db.Refs.Size();\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Com/ComHandler.h",
    "content": "// ComHandler.h\n\n#ifndef __ARCHIVE_COM_HANDLER_H\n#define __ARCHIVE_COM_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n#include \"ComIn.h\"\n\nnamespace NArchive {\nnamespace NCom {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CMyComPtr<IInStream> _stream;\n  CDatabase _db;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Com/ComIn.cpp",
    "content": "// Archive/ComIn.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../../C/Alloc.h\"\n}\n\n#include \"../../../../C/CpuArch.h\"\n\n#include \"Common/MyCom.h\"\n#include \"../../Common/StreamUtils.h\"\n#include \"Common/IntToString.h\"\n\n#include \"ComIn.h\"\n\nnamespace NArchive{\nnamespace NCom{\n\nstatic const UInt32 kSignatureSize = 8;\nstatic const Byte kSignature[kSignatureSize] = { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 };\n\nvoid CUInt32Buf::Free()\n{\n  MyFree(_buf);\n  _buf = 0;\n}\n\nbool CUInt32Buf::Allocate(UInt32 numItems)\n{\n  Free();\n  if (numItems == 0)\n    return true;\n  size_t newSize = (size_t)numItems * sizeof(UInt32);\n  if (newSize / sizeof(UInt32) != numItems)\n    return false;\n  _buf = (UInt32 *)MyAlloc(newSize);\n  return (_buf != 0);\n}\n\nstatic HRESULT ReadSector(IInStream *inStream, Byte *buf, int sectorSizeBits, UInt32 sid)\n{\n  RINOK(inStream->Seek((((UInt64)sid + 1) << sectorSizeBits), STREAM_SEEK_SET, NULL));\n  return ReadStream_FALSE(inStream, buf, (UInt32)1 << sectorSizeBits);\n}\n\nstatic HRESULT ReadIDs(IInStream *inStream, Byte *buf, int sectorSizeBits, UInt32 sid, UInt32 *dest)\n{\n  RINOK(ReadSector(inStream, buf, sectorSizeBits, sid));\n  UInt32 sectorSize = (UInt32)1 << sectorSizeBits;\n  for (UInt32 t = 0; t < sectorSize; t += 4)\n    *dest++ = GetUi32(buf + t);\n  return S_OK;\n}\n\nstatic void GetFileTimeFromMem(const Byte *p, FILETIME *ft)\n{\n  ft->dwLowDateTime = GetUi32(p);\n  ft->dwHighDateTime = GetUi32(p + 4);\n}\n\nstatic void ReadItem(Byte *p, CItem &item, bool mode64bit)\n{\n  memcpy(item.Name, p, 64);\n  // item.NameSize = GetUi16(p + 64);\n  item.Type = p[66];\n  item.LeftDid = GetUi32(p + 68);\n  item.RightDid = GetUi32(p + 72);\n  item.SonDid = GetUi32(p + 76);\n  // item.Flags = GetUi32(p + 96);\n  GetFileTimeFromMem(p + 100, &item.CTime);\n  GetFileTimeFromMem(p + 108, &item.MTime);\n  item.Sid = GetUi32(p + 116);\n  item.Size = GetUi32(p + 120);\n  if (mode64bit)\n    item.Size |= ((UInt64)GetUi32(p + 124) << 32);\n}\n\nstatic const UInt32 kNoDid = 0xFFFFFFFF;\n\nHRESULT CDatabase::AddNode(int parent, UInt32 did)\n{\n  if (did == kNoDid)\n    return S_OK;\n  if (did >= (UInt32)Items.Size())\n    return S_FALSE;\n  const CItem &item = Items[did];\n  if (item.IsEmpty())\n    return S_FALSE;\n  CRef ref;\n  ref.Parent = parent;\n  ref.Did = did;\n  int index = Refs.Add(ref);\n  if (Refs.Size() > Items.Size())\n    return S_FALSE;\n  RINOK(AddNode(parent, item.LeftDid));\n  RINOK(AddNode(parent, item.RightDid));\n  if (item.IsDir())\n  {\n    RINOK(AddNode(index, item.SonDid));\n  }\n  return S_OK;\n}\n\nstatic const char kCharOpenBracket  = '[';\nstatic const char kCharCloseBracket = ']';\n\nUString DWORDToString(UInt32 val)\n{\n  wchar_t buf[32];\n  ConvertUInt64ToString(val, buf);\n  return buf;\n}\n\nstatic UString CompoundNameToFileName(const UString &s)\n{\n  UString res;\n  for (int i = 0; i < s.Length(); i++)\n  {\n    wchar_t c = s[i];\n    if (c < 0x20)\n    {\n      res += kCharOpenBracket;\n      res += DWORDToString(c);\n      res += kCharCloseBracket;\n    }\n    else\n      res += c;\n  }\n  return res;\n}\n\nstatic char g_MsiChars[] =\n\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._\";\n\nstatic const wchar_t *kMsi_ID = L\"\"; // L\"{msi}\";\n\nstatic const int kMsiNumBits = 6;\nstatic const UInt32 kMsiNumChars = 1 << kMsiNumBits;\nstatic const UInt32 kMsiCharMask = kMsiNumChars - 1;\nstatic const UInt32 kMsiStartUnicodeChar = 0x3800;\nstatic const UInt32 kMsiUnicodeRange = kMsiNumChars * (kMsiNumChars + 1);\n\nbool CompoundMsiNameToFileName(const UString &name, UString &resultName)\n{\n  resultName.Empty();\n  for (int i = 0; i < name.Length(); i++)\n  {\n    wchar_t c =  name[i];\n    if (c < kMsiStartUnicodeChar || c > kMsiStartUnicodeChar + kMsiUnicodeRange)\n      return false;\n    if (i == 0)\n      resultName += kMsi_ID;\n    c -= kMsiStartUnicodeChar;\n    \n    UInt32 c0 = c & kMsiCharMask;\n    UInt32 c1 = c >> kMsiNumBits;\n\n    if (c1 <= kMsiNumChars)\n    {\n      resultName += (wchar_t)g_MsiChars[c0];\n      if (c1 == kMsiNumChars)\n        break;\n      resultName += (wchar_t)g_MsiChars[c1];\n    }\n    else\n      resultName += L'!';\n  }\n  return true;\n}\n\nstatic UString ConvertName(const Byte *p)\n{\n  UString s;\n  for (int i = 0; i < kNameSizeMax; i += 2)\n  {\n    wchar_t c = (p[i] | (wchar_t)p[i + 1] << 8);\n    if (c == 0)\n      break;\n    s += c;\n  }\n  UString msiName;\n  if (CompoundMsiNameToFileName(s, msiName))\n    return msiName;\n  return CompoundNameToFileName(s);\n}\n\nUString CDatabase::GetItemPath(UInt32 index) const\n{\n  UString s;\n  while (index != kNoDid)\n  {\n    const CRef &ref = Refs[index];\n    const CItem &item = Items[ref.Did];\n    if (!s.IsEmpty())\n      s = (UString)WCHAR_PATH_SEPARATOR + s;\n    s = ConvertName(item.Name) + s;\n    index = ref.Parent;\n  }\n  return s;\n}\n\nHRESULT OpenArchive(IInStream *inStream, CDatabase &db)\n{\n  static const UInt32 kHeaderSize = 512;\n  Byte p[kHeaderSize];\n  RINOK(ReadStream_FALSE(inStream, p, kHeaderSize));\n  if (memcmp(p, kSignature, kSignatureSize) != 0)\n    return S_FALSE;\n  UInt16 majorVer = GetUi16(p + 0x1A);\n  if (majorVer > 4)\n    return S_FALSE;\n  if (GetUi16(p + 0x1C) != 0xFFFE)\n    return S_FALSE;\n  UInt16 sectorSizeBits = GetUi16(p + 0x1E);\n  bool mode64bit = (sectorSizeBits >= 12);\n  UInt16 miniSectorSizeBits = GetUi16(p + 0x20);\n  db.SectorSizeBits = sectorSizeBits;\n  db.MiniSectorSizeBits = miniSectorSizeBits;\n\n  if (sectorSizeBits > 28 || miniSectorSizeBits > 28 ||\n      sectorSizeBits < 7 || miniSectorSizeBits < 2 || miniSectorSizeBits > sectorSizeBits)\n    return S_FALSE;\n  UInt32 numSectorsForFAT = GetUi32(p + 0x2C);\n  db.LongStreamMinSize = GetUi32(p + 0x38);\n  \n  UInt32 sectSize = (UInt32)1 << (int)(sectorSizeBits);\n\n  CByteBuffer sect;\n  sect.SetCapacity(sectSize);\n\n  int ssb2 = (int)(sectorSizeBits - 2);\n  UInt32 numSidsInSec = (UInt32)1 << ssb2;\n  UInt32 numFatItems = numSectorsForFAT << ssb2;\n  if ((numFatItems >> ssb2) != numSectorsForFAT)\n    return S_FALSE;\n  db.FatSize = numFatItems;\n\n  {\n    CUInt32Buf bat;\n    UInt32 numSectorsForBat = GetUi32(p + 0x48);\n    const UInt32 kNumHeaderBatItems = 109;\n    UInt32 numBatItems = kNumHeaderBatItems + (numSectorsForBat << ssb2);\n    if (numBatItems < kNumHeaderBatItems || ((numBatItems - kNumHeaderBatItems) >> ssb2) != numSectorsForBat)\n      return S_FALSE;\n    if (!bat.Allocate(numBatItems))\n      return S_FALSE;\n    UInt32 i;\n    for (i = 0; i < kNumHeaderBatItems; i++)\n      bat[i] = GetUi32(p + 0x4c + i * 4);\n    UInt32 sid = GetUi32(p + 0x44);\n    for (UInt32 s = 0; s < numSectorsForBat; s++)\n    {\n      RINOK(ReadIDs(inStream, sect, sectorSizeBits, sid, bat + i));\n      i += numSidsInSec - 1;\n      sid = bat[i];\n    }\n    numBatItems = i;\n    \n    if (!db.Fat.Allocate(numFatItems))\n      return S_FALSE;\n    UInt32 j = 0;\n      \n    for (i = 0; i < numFatItems; j++, i += numSidsInSec)\n    {\n      if (j >= numBatItems)\n        return S_FALSE;\n      RINOK(ReadIDs(inStream, sect, sectorSizeBits, bat[j], db.Fat + i));\n    }\n  }\n\n  UInt32 numMatItems;\n  {\n    UInt32 numSectorsForMat = GetUi32(p + 0x40);\n    numMatItems = (UInt32)numSectorsForMat << ssb2;\n    if ((numMatItems >> ssb2) != numSectorsForMat)\n      return S_FALSE;\n    if (!db.Mat.Allocate(numMatItems))\n      return S_FALSE;\n    UInt32 i;\n    UInt32 sid = GetUi32(p + 0x3C);\n    for (i = 0; i < numMatItems; i += numSidsInSec)\n    {\n      RINOK(ReadIDs(inStream, sect, sectorSizeBits, sid, db.Mat + i));\n      if (sid >= numFatItems)\n        return S_FALSE;\n      sid = db.Fat[sid];\n    }\n    if (sid != NFatID::kEndOfChain)\n      return S_FALSE;\n  }\n\n  {\n    UInt32 sid = GetUi32(p + 0x30);\n    for (;;)\n    {\n      if (sid >= numFatItems)\n        return S_FALSE;\n      RINOK(ReadSector(inStream, sect, sectorSizeBits, sid));\n      for (UInt32 i = 0; i < sectSize; i += 128)\n      {\n        CItem item;\n        ReadItem(sect + i, item, mode64bit);\n        db.Items.Add(item);\n      }\n      sid = db.Fat[sid];\n      if (sid == NFatID::kEndOfChain)\n        break;\n    }\n  }\n\n  CItem root = db.Items[0];\n\n  {\n    UInt32 numSectorsInMiniStream;\n    {\n      UInt64 numSatSects64 = (root.Size + sectSize - 1) >> sectorSizeBits;\n      if (numSatSects64 > NFatID::kMaxValue)\n        return S_FALSE;\n      numSectorsInMiniStream = (UInt32)numSatSects64;\n    }\n    db.NumSectorsInMiniStream = numSectorsInMiniStream;\n    if (!db.MiniSids.Allocate(numSectorsInMiniStream))\n      return S_FALSE;\n    {\n      UInt64 matSize64 = (root.Size + ((UInt64)1 << miniSectorSizeBits) - 1) >> miniSectorSizeBits;\n      if (matSize64 > NFatID::kMaxValue)\n        return S_FALSE;\n      db.MatSize = (UInt32)matSize64;\n      if (numMatItems < db.MatSize)\n        return S_FALSE;\n    }\n\n\n    UInt32 sid = root.Sid;\n    for (UInt32 i = 0; ; i++)\n    {\n      if (sid == NFatID::kEndOfChain)\n      {\n        if (i != numSectorsInMiniStream)\n          return S_FALSE;\n        break;\n      }\n      if (i >= numSectorsInMiniStream)\n        return S_FALSE;\n      db.MiniSids[i] = sid;\n      if (sid >= numFatItems)\n        return S_FALSE;\n      sid = db.Fat[sid];\n    }\n  }\n\n  return db.AddNode(-1, root.SonDid);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Com/ComIn.h",
    "content": "// Archive/ComIn.h\n\n#ifndef __ARCHIVE_COM_IN_H\n#define __ARCHIVE_COM_IN_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n\nnamespace NArchive {\nnamespace NCom {\n\nstruct CUInt32Buf\n{\n  UInt32 *_buf;\npublic:\n  CUInt32Buf(): _buf(0) {}\n  ~CUInt32Buf() { Free(); }\n  void Free();\n  bool Allocate(UInt32 numItems);\n  operator UInt32 *() const { return _buf; };\n};\n\nnamespace NFatID\n{\n  const UInt32 kFree       = 0xFFFFFFFF;\n  const UInt32 kEndOfChain = 0xFFFFFFFE;\n  const UInt32 kFatSector  = 0xFFFFFFFD;\n  const UInt32 kMatSector  = 0xFFFFFFFC;\n  const UInt32 kMaxValue   = 0xFFFFFFFA;\n}\n\nnamespace NItemType\n{\n  const Byte kEmpty = 0;\n  const Byte kStorage = 1;\n  const Byte kStream = 2;\n  const Byte kLockBytes = 3;\n  const Byte kProperty = 4;\n  const Byte kRootStorage = 5;\n}\n\nconst UInt32 kNameSizeMax = 64;\n\nstruct CItem\n{\n  Byte Name[kNameSizeMax];\n  // UInt16 NameSize;\n  // UInt32 Flags;\n  FILETIME CTime;\n  FILETIME MTime;\n  UInt64 Size;\n  UInt32 LeftDid;\n  UInt32 RightDid;\n  UInt32 SonDid;\n  UInt32 Sid;\n  Byte Type;\n\n  bool IsEmpty() const { return Type == NItemType::kEmpty; }\n  bool IsDir() const { return Type == NItemType::kStorage || Type == NItemType::kRootStorage; }\n};\n\nstruct CRef\n{\n  int Parent;\n  UInt32 Did;\n};\n\nclass CDatabase\n{\npublic:\n  HRESULT AddNode(int parent, UInt32 did);\n\n  CUInt32Buf Fat;\n  UInt32 FatSize;\n  \n  CUInt32Buf MiniSids;\n  UInt32 NumSectorsInMiniStream;\n\n  CUInt32Buf Mat;\n  UInt32 MatSize;\n\n  CObjectVector<CItem> Items;\n  CRecordVector<CRef> Refs;\n\n  UInt32 LongStreamMinSize;\n  int SectorSizeBits;\n  int MiniSectorSizeBits;\n\n  void Clear()\n  {\n    Fat.Free();\n    MiniSids.Free();\n    Mat.Free();\n    Items.Clear();\n    Refs.Clear();\n  }\n\n  bool IsLargeStream(UInt64 size) { return size >= LongStreamMinSize; }\n  UString GetItemPath(UInt32 index) const;\n};\n\nHRESULT OpenArchive(IInStream *inStream, CDatabase &database);\n\n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Com/ComRegister.cpp",
    "content": "// ComRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"ComHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NCom::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Compound\", L\"msi doc xls ppt\", 0, 0xE5, { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 }, 8, false, CreateArc, 0 };\n\nREGISTER_ARC(Com)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CoderMixer2.cpp",
    "content": "// CoderMixer2.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CoderMixer2.h\"\n\nnamespace NCoderMixer {\n\nCBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo):\n  _srcBindInfo(srcBindInfo)\n{\n  srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams);\n\n  UInt32  j;\n  for (j = 0; j < NumSrcInStreams; j++)\n  {\n    _srcInToDestOutMap.Add(0);\n    DestOutToSrcInMap.Add(0);\n  }\n  for (j = 0; j < _numSrcOutStreams; j++)\n  {\n    _srcOutToDestInMap.Add(0);\n    _destInToSrcOutMap.Add(0);\n  }\n\n  UInt32 destInOffset = 0;\n  UInt32 destOutOffset = 0;\n  UInt32 srcInOffset = NumSrcInStreams;\n  UInt32 srcOutOffset = _numSrcOutStreams;\n\n  for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--)\n  {\n    const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i];\n\n    srcInOffset -= srcCoderInfo.NumInStreams;\n    srcOutOffset -= srcCoderInfo.NumOutStreams;\n    \n    UInt32 j;\n    for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++)\n    {\n      UInt32 index = srcInOffset + j;\n      _srcInToDestOutMap[index] = destOutOffset;\n      DestOutToSrcInMap[destOutOffset] = index;\n    }\n    for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++)\n    {\n      UInt32 index = srcOutOffset + j;\n      _srcOutToDestInMap[index] = destInOffset;\n      _destInToSrcOutMap[destInOffset] = index;\n    }\n  }\n}\n\nvoid CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo)\n{\n  destBindInfo.Coders.Clear();\n  destBindInfo.BindPairs.Clear();\n  destBindInfo.InStreams.Clear();\n  destBindInfo.OutStreams.Clear();\n\n  int i;\n  for (i = _srcBindInfo.Coders.Size() - 1; i >= 0; i--)\n  {\n    const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i];\n    CCoderStreamsInfo destCoderInfo;\n    destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams;\n    destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams;\n    destBindInfo.Coders.Add(destCoderInfo);\n  }\n  for (i = _srcBindInfo.BindPairs.Size() - 1; i >= 0; i--)\n  {\n    const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i];\n    CBindPair destBindPair;\n    destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex];\n    destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex];\n    destBindInfo.BindPairs.Add(destBindPair);\n  }\n  for (i = 0; i < _srcBindInfo.InStreams.Size(); i++)\n    destBindInfo.OutStreams.Add(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]);\n  for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++)\n    destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]);\n}\n\nCCoderInfo2::CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams):\n    NumInStreams(numInStreams),\n    NumOutStreams(numOutStreams)\n{\n  InSizes.Reserve(NumInStreams);\n  InSizePointers.Reserve(NumInStreams);\n  OutSizePointers.Reserve(NumOutStreams);\n  OutSizePointers.Reserve(NumOutStreams);\n}\n\nstatic void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,\n    CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems)\n{\n  sizes.Clear();\n  sizePointers.Clear();\n  for(UInt32 i = 0; i < numItems; i++)\n  {\n    if (srcSizes == 0 || srcSizes[i] == NULL)\n    {\n      sizes.Add(0);\n      sizePointers.Add(NULL);\n    }\n    else\n    {\n      sizes.Add(*srcSizes[i]);\n      sizePointers.Add(&sizes.Back());\n    }\n  }\n}\n\nvoid CCoderInfo2::SetCoderInfo(const UInt64 **inSizes,\n      const UInt64 **outSizes)\n{\n  SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);\n  SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CoderMixer2.h",
    "content": "// CoderMixer2.h\n\n#ifndef __CODER_MIXER2_H\n#define __CODER_MIXER2_H\n\n#include \"../../../Common/MyVector.h\"\n#include \"../../../Common/Types.h\"\n#include \"../../../Common/MyCom.h\"\n#include \"../../ICoder.h\"\n\nnamespace NCoderMixer {\n\nstruct CBindPair\n{\n  UInt32 InIndex;\n  UInt32 OutIndex;\n};\n\nstruct CCoderStreamsInfo\n{\n  UInt32 NumInStreams;\n  UInt32 NumOutStreams;\n};\n\nstruct CBindInfo\n{\n  CRecordVector<CCoderStreamsInfo> Coders;\n  CRecordVector<CBindPair> BindPairs;\n  CRecordVector<UInt32> InStreams;\n  CRecordVector<UInt32> OutStreams;\n\n  void Clear()\n  {\n    Coders.Clear();\n    BindPairs.Clear();\n    InStreams.Clear();\n    OutStreams.Clear();\n  }\n\n  /*\n  UInt32 GetCoderStartOutStream(UInt32 coderIndex) const\n  {\n    UInt32 numOutStreams = 0;\n    for (UInt32 i = 0; i < coderIndex; i++)\n      numOutStreams += Coders[i].NumOutStreams;\n    return numOutStreams;\n  }\n  */\n\n\n  void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const\n  {\n    numInStreams = 0;\n    numOutStreams = 0;\n    for (int i = 0; i < Coders.Size(); i++)\n    {\n      const CCoderStreamsInfo &coderStreamsInfo = Coders[i];\n      numInStreams += coderStreamsInfo.NumInStreams;\n      numOutStreams += coderStreamsInfo.NumOutStreams;\n    }\n  }\n\n  int FindBinderForInStream(UInt32 inStream) const\n  {\n    for (int i = 0; i < BindPairs.Size(); i++)\n      if (BindPairs[i].InIndex == inStream)\n        return i;\n    return -1;\n  }\n  int FindBinderForOutStream(UInt32 outStream) const\n  {\n    for (int i = 0; i < BindPairs.Size(); i++)\n      if (BindPairs[i].OutIndex == outStream)\n        return i;\n    return -1;\n  }\n\n  UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const\n  {\n    UInt32 streamIndex = 0;\n    for (UInt32 i = 0; i < coderIndex; i++)\n      streamIndex += Coders[i].NumInStreams;\n    return streamIndex;\n  }\n\n  UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const\n  {\n    UInt32 streamIndex = 0;\n    for (UInt32 i = 0; i < coderIndex; i++)\n      streamIndex += Coders[i].NumOutStreams;\n    return streamIndex;\n  }\n\n\n  void FindInStream(UInt32 streamIndex, UInt32 &coderIndex,\n      UInt32 &coderStreamIndex) const\n  {\n    for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)\n    {\n      UInt32 curSize = Coders[coderIndex].NumInStreams;\n      if (streamIndex < curSize)\n      {\n        coderStreamIndex = streamIndex;\n        return;\n      }\n      streamIndex -= curSize;\n    }\n  }\n  void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex,\n      UInt32 &coderStreamIndex) const\n  {\n    for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)\n    {\n      UInt32 curSize = Coders[coderIndex].NumOutStreams;\n      if (streamIndex < curSize)\n      {\n        coderStreamIndex = streamIndex;\n        return;\n      }\n      streamIndex -= curSize;\n    }\n  }\n};\n\nclass CBindReverseConverter\n{\n  UInt32 _numSrcOutStreams;\n  NCoderMixer::CBindInfo _srcBindInfo;\n  CRecordVector<UInt32> _srcInToDestOutMap;\n  CRecordVector<UInt32> _srcOutToDestInMap;\n  CRecordVector<UInt32> _destInToSrcOutMap;\npublic:\n  UInt32 NumSrcInStreams;\n  CRecordVector<UInt32> DestOutToSrcInMap;\n\n  CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo);\n  void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo);\n};\n\nstruct CCoderInfo2\n{\n  CMyComPtr<ICompressCoder> Coder;\n  CMyComPtr<ICompressCoder2> Coder2;\n  UInt32 NumInStreams;\n  UInt32 NumOutStreams;\n\n  CRecordVector<UInt64> InSizes;\n  CRecordVector<UInt64> OutSizes;\n  CRecordVector<const UInt64 *> InSizePointers;\n  CRecordVector<const UInt64 *> OutSizePointers;\n\n  CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams);\n  void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);\n\n  HRESULT QueryInterface(REFGUID iid, void** pp) const\n  {\n    IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2;\n    return p->QueryInterface(iid, pp);\n  }\n};\n\nclass CCoderMixer2\n{\npublic:\n  virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0;\n  virtual void ReInit() = 0;\n  virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0;\n};\n\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CoderMixer2MT.cpp",
    "content": "// CoderMixer2MT.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CoderMixer2MT.h\"\n\nnamespace NCoderMixer {\n\nCCoder2::CCoder2(UInt32 numInStreams, UInt32 numOutStreams):\n    CCoderInfo2(numInStreams, numOutStreams)\n{\n  InStreams.Reserve(NumInStreams);\n  InStreamPointers.Reserve(NumInStreams);\n  OutStreams.Reserve(NumOutStreams);\n  OutStreamPointers.Reserve(NumOutStreams);\n}\n\nvoid CCoder2::Execute() { Code(NULL); }\n\nvoid CCoder2::Code(ICompressProgressInfo *progress)\n{\n  InStreamPointers.Clear();\n  OutStreamPointers.Clear();\n  UInt32 i;\n  for (i = 0; i < NumInStreams; i++)\n  {\n    if (InSizePointers[i] != NULL)\n      InSizePointers[i] = &InSizes[i];\n    InStreamPointers.Add((ISequentialInStream *)InStreams[i]);\n  }\n  for (i = 0; i < NumOutStreams; i++)\n  {\n    if (OutSizePointers[i] != NULL)\n      OutSizePointers[i] = &OutSizes[i];\n    OutStreamPointers.Add((ISequentialOutStream *)OutStreams[i]);\n  }\n  if (Coder)\n    Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0],\n        InSizePointers[0], OutSizePointers[0], progress);\n  else\n    Result = Coder2->Code(&InStreamPointers.Front(), &InSizePointers.Front(), NumInStreams,\n      &OutStreamPointers.Front(), &OutSizePointers.Front(), NumOutStreams, progress);\n  {\n    int i;\n    for (i = 0; i < InStreams.Size(); i++)\n      InStreams[i].Release();\n    for (i = 0; i < OutStreams.Size(); i++)\n      OutStreams[i].Release();\n  }\n}\n\nstatic void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,\n    CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems)\n{\n  sizes.Clear();\n  sizePointers.Clear();\n  for(UInt32 i = 0; i < numItems; i++)\n  {\n    if (srcSizes == 0 || srcSizes[i] == NULL)\n    {\n      sizes.Add(0);\n      sizePointers.Add(NULL);\n    }\n    else\n    {\n      sizes.Add(*srcSizes[i]);\n      sizePointers.Add(&sizes.Back());\n    }\n  }\n}\n\n\nvoid CCoder2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes)\n{\n  SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);\n  SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);\n}\n\n//////////////////////////////////////\n// CCoderMixer2MT\n\nHRESULT CCoderMixer2MT::SetBindInfo(const CBindInfo &bindInfo)\n{\n  _bindInfo = bindInfo;\n  _streamBinders.Clear();\n  for(int i = 0; i < _bindInfo.BindPairs.Size(); i++)\n  {\n    _streamBinders.Add(CStreamBinder());\n    RINOK(_streamBinders.Back().CreateEvents());\n  }\n  return S_OK;\n}\n\nvoid CCoderMixer2MT::AddCoderCommon()\n{\n  const CCoderStreamsInfo &c = _bindInfo.Coders[_coders.Size()];\n  CCoder2 threadCoderInfo(c.NumInStreams, c.NumOutStreams);\n  _coders.Add(threadCoderInfo);\n}\n\nvoid CCoderMixer2MT::AddCoder(ICompressCoder *coder)\n{\n  AddCoderCommon();\n  _coders.Back().Coder = coder;\n}\n\nvoid CCoderMixer2MT::AddCoder2(ICompressCoder2 *coder)\n{\n  AddCoderCommon();\n  _coders.Back().Coder2 = coder;\n}\n\n\nvoid CCoderMixer2MT::ReInit()\n{\n  for(int i = 0; i < _streamBinders.Size(); i++)\n    _streamBinders[i].ReInit();\n}\n\n\nHRESULT CCoderMixer2MT::Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams)\n{\n  /*\n  if (_coders.Size() != _bindInfo.Coders.Size())\n    throw 0;\n  */\n  int i;\n  for(i = 0; i < _coders.Size(); i++)\n  {\n    CCoder2 &coderInfo = _coders[i];\n    const CCoderStreamsInfo &coderStreamsInfo = _bindInfo.Coders[i];\n    coderInfo.InStreams.Clear();\n    UInt32 j;\n    for(j = 0; j < coderStreamsInfo.NumInStreams; j++)\n      coderInfo.InStreams.Add(NULL);\n    coderInfo.OutStreams.Clear();\n    for(j = 0; j < coderStreamsInfo.NumOutStreams; j++)\n      coderInfo.OutStreams.Add(NULL);\n  }\n\n  for(i = 0; i < _bindInfo.BindPairs.Size(); i++)\n  {\n    const CBindPair &bindPair = _bindInfo.BindPairs[i];\n    UInt32 inCoderIndex, inCoderStreamIndex;\n    UInt32 outCoderIndex, outCoderStreamIndex;\n    _bindInfo.FindInStream(bindPair.InIndex, inCoderIndex, inCoderStreamIndex);\n    _bindInfo.FindOutStream(bindPair.OutIndex, outCoderIndex, outCoderStreamIndex);\n\n    _streamBinders[i].CreateStreams(\n        &_coders[inCoderIndex].InStreams[inCoderStreamIndex],\n        &_coders[outCoderIndex].OutStreams[outCoderStreamIndex]);\n  }\n\n  for(i = 0; i < _bindInfo.InStreams.Size(); i++)\n  {\n    UInt32 inCoderIndex, inCoderStreamIndex;\n    _bindInfo.FindInStream(_bindInfo.InStreams[i], inCoderIndex, inCoderStreamIndex);\n    _coders[inCoderIndex].InStreams[inCoderStreamIndex] = inStreams[i];\n  }\n  \n  for(i = 0; i < _bindInfo.OutStreams.Size(); i++)\n  {\n    UInt32 outCoderIndex, outCoderStreamIndex;\n    _bindInfo.FindOutStream(_bindInfo.OutStreams[i], outCoderIndex, outCoderStreamIndex);\n    _coders[outCoderIndex].OutStreams[outCoderStreamIndex] = outStreams[i];\n  }\n  return S_OK;\n}\n\nHRESULT CCoderMixer2MT::ReturnIfError(HRESULT code)\n{\n  for (int i = 0; i < _coders.Size(); i++)\n    if (_coders[i].Result == code)\n      return code;\n  return S_OK;\n}\n\nSTDMETHODIMP CCoderMixer2MT::Code(ISequentialInStream **inStreams,\n      const UInt64 ** /* inSizes */,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 ** /* outSizes */,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress)\n{\n  if (numInStreams != (UInt32)_bindInfo.InStreams.Size() ||\n      numOutStreams != (UInt32)_bindInfo.OutStreams.Size())\n    return E_INVALIDARG;\n\n  Init(inStreams, outStreams);\n\n  int i;\n  for (i = 0; i < _coders.Size(); i++)\n    if (i != _progressCoderIndex)\n    {\n      RINOK(_coders[i].Create());\n    }\n\n  for (i = 0; i < _coders.Size(); i++)\n    if (i != _progressCoderIndex)\n      _coders[i].Start();\n\n  _coders[_progressCoderIndex].Code(progress);\n\n  for (i = 0; i < _coders.Size(); i++)\n    if (i != _progressCoderIndex)\n      _coders[i].WaitFinish();\n\n  RINOK(ReturnIfError(E_ABORT));\n  RINOK(ReturnIfError(E_OUTOFMEMORY));\n\n  for (i = 0; i < _coders.Size(); i++)\n  {\n    HRESULT result = _coders[i].Result;\n    if (result != S_OK && result != E_FAIL && result != S_FALSE)\n      return result;\n  }\n\n  RINOK(ReturnIfError(S_FALSE));\n\n  for (i = 0; i < _coders.Size(); i++)\n  {\n    HRESULT result = _coders[i].Result;\n    if (result != S_OK)\n      return result;\n  }\n  return S_OK;\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CoderMixer2MT.h",
    "content": "// CoderMixer2MT.h\n\n#ifndef __CODER_MIXER2_MT_H\n#define __CODER_MIXER2_MT_H\n\n#include \"CoderMixer2.h\"\n#include \"../../../Common/MyCom.h\"\n#include \"../../Common/StreamBinder.h\"\n#include \"../../Common/VirtThread.h\"\n\nnamespace NCoderMixer {\n\nstruct CCoder2: public CCoderInfo2, public CVirtThread\n{\n  HRESULT Result;\n  CObjectVector< CMyComPtr<ISequentialInStream> > InStreams;\n  CObjectVector< CMyComPtr<ISequentialOutStream> > OutStreams;\n  CRecordVector<ISequentialInStream*> InStreamPointers;\n  CRecordVector<ISequentialOutStream*> OutStreamPointers;\n\n  CCoder2(UInt32 numInStreams, UInt32 numOutStreams);\n  void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);\n  virtual void Execute();\n  void Code(ICompressProgressInfo *progress);\n};\n\n\n/*\n  SetBindInfo()\n  for each coder\n    AddCoder[2]()\n  SetProgressIndex(UInt32 coderIndex);\n \n  for each file\n  {\n    ReInit()\n    for each coder\n      SetCoderInfo\n    Code\n  }\n*/\n\nclass CCoderMixer2MT:\n  public ICompressCoder2,\n  public CCoderMixer2,\n  public CMyUnknownImp\n{\n  CBindInfo _bindInfo;\n  CObjectVector<CStreamBinder> _streamBinders;\n  int _progressCoderIndex;\n\n  void AddCoderCommon();\n  HRESULT Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams);\n  HRESULT ReturnIfError(HRESULT code);\npublic:\n  CObjectVector<CCoder2> _coders;\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Code)(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress);\n\n  HRESULT SetBindInfo(const CBindInfo &bindInfo);\n  void AddCoder(ICompressCoder *coder);\n  void AddCoder2(ICompressCoder2 *coder);\n  void SetProgressCoderIndex(int coderIndex) {  _progressCoderIndex = coderIndex; }\n\n  void ReInit();\n  void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes)\n    {  _coders[coderIndex].SetCoderInfo(inSizes, outSizes); }\n  UInt64 GetWriteProcessedSize(UInt32 binderIndex) const\n    {  return _streamBinders[binderIndex].ProcessedSize; }\n};\n\n}\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CoderMixer2ST.cpp",
    "content": "// CoderMixer2ST.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CoderMixer2ST.h\"\n\nnamespace NCoderMixer2 {\n\nCCoderMixer2ST::CCoderMixer2ST() {}\n\nCCoderMixer2ST::~CCoderMixer2ST(){ }\n\nHRESULT CCoderMixer2ST::SetBindInfo(const CBindInfo &bindInfo)\n{\n  _bindInfo = bindInfo;\n  return S_OK;\n}\n\nvoid CCoderMixer2ST::AddCoderCommon(bool isMain)\n{\n  const CCoderStreamsInfo &csi = _bindInfo.Coders[_coders.Size()];\n  _coders.Add(CSTCoderInfo(csi.NumInStreams, csi.NumOutStreams, isMain));\n}\n\nvoid CCoderMixer2ST::AddCoder(ICompressCoder *coder, bool isMain)\n{\n  AddCoderCommon(isMain);\n  _coders.Back().Coder = coder;\n}\n\nvoid CCoderMixer2ST::AddCoder2(ICompressCoder2 *coder, bool isMain)\n{\n  AddCoderCommon(isMain);\n  _coders.Back().Coder2 = coder;\n}\n\nvoid CCoderMixer2ST::ReInit() { }\n\nHRESULT CCoderMixer2ST::GetInStream(\n    ISequentialInStream **inStreams, const UInt64 **inSizes,\n    UInt32 streamIndex, ISequentialInStream **inStreamRes)\n{\n  CMyComPtr<ISequentialInStream> seqInStream;\n  int i;\n  for(i = 0; i < _bindInfo.InStreams.Size(); i++)\n    if (_bindInfo.InStreams[i] == streamIndex)\n    {\n      seqInStream = inStreams[i];\n      *inStreamRes = seqInStream.Detach();\n      return  S_OK;\n    }\n  int binderIndex = _bindInfo.FindBinderForInStream(streamIndex);\n  if (binderIndex < 0)\n    return E_INVALIDARG;\n\n  UInt32 coderIndex, coderStreamIndex;\n  _bindInfo.FindOutStream(_bindInfo.BindPairs[binderIndex].OutIndex,\n      coderIndex, coderStreamIndex);\n\n  CCoderInfo &coder = _coders[coderIndex];\n  if (!coder.Coder)\n    return E_NOTIMPL;\n  coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream);\n  if (!seqInStream)\n    return E_NOTIMPL;\n\n  UInt32 startIndex = _bindInfo.GetCoderInStreamIndex(coderIndex);\n\n  CMyComPtr<ICompressSetInStream> setInStream;\n  if (!coder.Coder)\n    return E_NOTIMPL;\n  coder.Coder.QueryInterface(IID_ICompressSetInStream, &setInStream);\n  if (!setInStream)\n    return E_NOTIMPL;\n\n  if (coder.NumInStreams > 1)\n    return E_NOTIMPL;\n  for (i = 0; i < (int)coder.NumInStreams; i++)\n  {\n    CMyComPtr<ISequentialInStream> seqInStream2;\n    RINOK(GetInStream(inStreams, inSizes, startIndex + i, &seqInStream2));\n    RINOK(setInStream->SetInStream(seqInStream2));\n  }\n  *inStreamRes = seqInStream.Detach();\n  return S_OK;\n}\n\nHRESULT CCoderMixer2ST::GetOutStream(\n    ISequentialOutStream **outStreams, const UInt64 **outSizes,\n    UInt32 streamIndex, ISequentialOutStream **outStreamRes)\n{\n  CMyComPtr<ISequentialOutStream> seqOutStream;\n  int i;\n  for(i = 0; i < _bindInfo.OutStreams.Size(); i++)\n    if (_bindInfo.OutStreams[i] == streamIndex)\n    {\n      seqOutStream = outStreams[i];\n      *outStreamRes = seqOutStream.Detach();\n      return  S_OK;\n    }\n  int binderIndex = _bindInfo.FindBinderForOutStream(streamIndex);\n  if (binderIndex < 0)\n    return E_INVALIDARG;\n\n  UInt32 coderIndex, coderStreamIndex;\n  _bindInfo.FindInStream(_bindInfo.BindPairs[binderIndex].InIndex,\n      coderIndex, coderStreamIndex);\n\n  CCoderInfo &coder = _coders[coderIndex];\n  if (!coder.Coder)\n    return E_NOTIMPL;\n  coder.Coder.QueryInterface(IID_ISequentialOutStream, &seqOutStream);\n  if (!seqOutStream)\n    return E_NOTIMPL;\n\n  UInt32 startIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex);\n\n  CMyComPtr<ICompressSetOutStream> setOutStream;\n  if (!coder.Coder)\n    return E_NOTIMPL;\n  coder.Coder.QueryInterface(IID_ICompressSetOutStream, &setOutStream);\n  if (!setOutStream)\n    return E_NOTIMPL;\n\n  if (coder.NumOutStreams > 1)\n    return E_NOTIMPL;\n  for (i = 0; i < (int)coder.NumOutStreams; i++)\n  {\n    CMyComPtr<ISequentialOutStream> seqOutStream2;\n    RINOK(GetOutStream(outStreams, outSizes, startIndex + i, &seqOutStream2));\n    RINOK(setOutStream->SetOutStream(seqOutStream2));\n  }\n  *outStreamRes = seqOutStream.Detach();\n  return S_OK;\n}\n    \n\nSTDMETHODIMP CCoderMixer2ST::Code(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress)\n{\n  if (numInStreams != (UInt32)_bindInfo.InStreams.Size() ||\n      numOutStreams != (UInt32)_bindInfo.OutStreams.Size())\n    return E_INVALIDARG;\n\n  // Find main coder\n  int _mainCoderIndex = -1;\n  int i;\n  for (i = 0; i < _coders.Size(); i++)\n    if (_coders[i].IsMain)\n    {\n      _mainCoderIndex = i;\n      break;\n    }\n  if (_mainCoderIndex < 0)\n  for (i = 0; i < _coders.Size(); i++)\n    if (_coders[i].NumInStreams > 1)\n    {\n      if (_mainCoderIndex >= 0)\n        return E_NOTIMPL;\n      _mainCoderIndex = i;\n    }\n  if (_mainCoderIndex < 0)\n    _mainCoderIndex = 0;\n \n  // _mainCoderIndex = 0;\n  // _mainCoderIndex = _coders.Size() - 1;\n  CCoderInfo &mainCoder = _coders[_mainCoderIndex];\n\n  CObjectVector< CMyComPtr<ISequentialInStream> > seqInStreams;\n  CObjectVector< CMyComPtr<ISequentialOutStream> > seqOutStreams;\n  UInt32 startInIndex = _bindInfo.GetCoderInStreamIndex(_mainCoderIndex);\n  UInt32 startOutIndex = _bindInfo.GetCoderOutStreamIndex(_mainCoderIndex);\n  for (i = 0; i < (int)mainCoder.NumInStreams; i++)\n  {\n    CMyComPtr<ISequentialInStream> seqInStream;\n    RINOK(GetInStream(inStreams, inSizes, startInIndex + i, &seqInStream));\n    seqInStreams.Add(seqInStream);\n  }\n  for (i = 0; i < (int)mainCoder.NumOutStreams; i++)\n  {\n    CMyComPtr<ISequentialOutStream> seqOutStream;\n    RINOK(GetOutStream(outStreams, outSizes, startOutIndex + i, &seqOutStream));\n    seqOutStreams.Add(seqOutStream);\n  }\n  CRecordVector< ISequentialInStream * > seqInStreamsSpec;\n  CRecordVector< ISequentialOutStream * > seqOutStreamsSpec;\n  for (i = 0; i < (int)mainCoder.NumInStreams; i++)\n    seqInStreamsSpec.Add(seqInStreams[i]);\n  for (i = 0; i < (int)mainCoder.NumOutStreams; i++)\n    seqOutStreamsSpec.Add(seqOutStreams[i]);\n\n  for (i = 0; i < _coders.Size(); i++)\n  {\n    if (i == _mainCoderIndex)\n      continue;\n    CCoderInfo &coder = _coders[i];\n    CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;\n    coder.Coder.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);\n    if (setOutStreamSize)\n    {\n      RINOK(setOutStreamSize->SetOutStreamSize(coder.OutSizePointers[0]));\n    }\n  }\n  if (mainCoder.Coder)\n  {\n    RINOK(mainCoder.Coder->Code(\n        seqInStreamsSpec[0], seqOutStreamsSpec[0],\n        mainCoder.InSizePointers[0], mainCoder.OutSizePointers[0],\n        progress));\n  }\n  else\n  {\n    RINOK(mainCoder.Coder2->Code(\n        &seqInStreamsSpec.Front(),\n        &mainCoder.InSizePointers.Front(), mainCoder.NumInStreams,\n        &seqOutStreamsSpec.Front(),\n        &mainCoder.OutSizePointers.Front(), mainCoder.NumOutStreams,\n        progress));\n  }\n  CMyComPtr<IOutStreamFlush> flush;\n  seqOutStreams.Front().QueryInterface(IID_IOutStreamFlush, &flush);\n  if (flush)\n    return flush->Flush();\n  return S_OK;\n}\n\n/*\nUInt64 CCoderMixer2ST::GetWriteProcessedSize(UInt32 binderIndex) const\n{\n  return _streamBinders[binderIndex].ProcessedSize;\n}\n*/\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CoderMixer2ST.h",
    "content": "// CoderMixer2ST.h\n\n#ifndef __CODER_MIXER2_ST_H\n#define __CODER_MIXER2_ST_H\n\n#include \"CoderMixer2.h\"\n#include \"../../../Common/MyCom.h\"\n#include \"../../ICoder.h\"\n\nnamespace NCoderMixer {\n\n//  SetBindInfo()\n//  for each coder\n//  {\n//    AddCoder[2]()\n//  }\n//\n//  for each file\n//  {\n//    ReInit()\n//    for each coder\n//    {\n//      SetCoderInfo\n//    }\n//    SetProgressIndex(UInt32 coderIndex);\n//    Code\n//  }\n\nstruct CSTCoderInfo: public CCoderInfo2\n{\n  bool IsMain;\n  CSTCoderInfo(UInt32 numInStreams, UInt32 numOutStreams, bool isMain):\n    CCoderInfo2(numInStreams, numOutStreams),IsMain(isMain) {}\n};\n\nclass CCoderMixer2ST:\n  public ICompressCoder2,\n  public CCoderMixer2,\n  public CMyUnknownImp\n{\n  MY_UNKNOWN_IMP\n\n  HRESULT GetInStream(\n    ISequentialInStream **inStreams, const UInt64 **inSizes,\n    UInt32 streamIndex, ISequentialInStream **inStreamRes);\n  HRESULT GetOutStream(\n    ISequentialOutStream **outStreams, const UInt64 **outSizes,\n    UInt32 streamIndex, ISequentialOutStream **outStreamRes);\npublic:\n  STDMETHOD(Code)(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress);\n\n  CCoderMixer2ST();\n  ~CCoderMixer2ST();\n  void AddCoderCommon(bool isMain);\n  void AddCoder(ICompressCoder *coder, bool isMain);\n  void AddCoder2(ICompressCoder2 *coder, bool isMain);\n\n  void ReInit();\n  void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes)\n  {\n    {  _coders[coderIndex].SetCoderInfo(inSizes, outSizes); }\n  }\n\n  void SetProgressCoderIndex(UInt32 /*coderIndex*/)\n  {\n    // _progressCoderIndex = coderIndex;\n  }\n\n  // UInt64 GetWriteProcessedSize(UInt32 binderIndex) const;\n\nprivate:\n  CBindInfo _bindInfo;\n  CObjectVector<CSTCoderInfo> _coders;\n  int _mainCoderIndex;\npublic:\n  HRESULT SetBindInfo(const CBindInfo &bindInfo);\n\n};\n\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CrossThreadProgress.cpp",
    "content": "// CrossThreadProgress.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CrossThreadProgress.h\"\n\nSTDMETHODIMP CCrossThreadProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  InSize = inSize;\n  OutSize = outSize;\n  ProgressEvent.Set();\n  WaitEvent.Lock();\n  return Result;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/CrossThreadProgress.h",
    "content": "// CrossThreadProgress.h\n\n#ifndef __CROSSTHREADPROGRESS_H\n#define __CROSSTHREADPROGRESS_H\n\n#include \"../../ICoder.h\"\n#include \"../../../Windows/Synchronization.h\"\n#include \"../../../Common/MyCom.h\"\n\nclass CCrossThreadProgress:\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\npublic:\n  const UInt64 *InSize;\n  const UInt64 *OutSize;\n  HRESULT Result;\n  NWindows::NSynchronization::CAutoResetEvent ProgressEvent;\n  NWindows::NSynchronization::CAutoResetEvent WaitEvent;\n\n  HRes Create()\n  {\n    RINOK(ProgressEvent.CreateIfNotCreated());\n    return WaitEvent.CreateIfNotCreated();\n  }\n  void Init()\n  {\n    ProgressEvent.Reset();\n    WaitEvent.Reset();\n  }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/DummyOutStream.cpp",
    "content": "// DummyOutStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"DummyOutStream.h\"\n\nSTDMETHODIMP CDummyOutStream::Write(const void *data,  UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result;\n  if(!_stream)\n  {\n    realProcessedSize = size;\n    result = S_OK;\n  }\n  else\n    result = _stream->Write(data, size, &realProcessedSize);\n  _size += realProcessedSize;\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/DummyOutStream.h",
    "content": "// DummyOutStream.h\n\n#ifndef __DUMMYOUTSTREAM_H\n#define __DUMMYOUTSTREAM_H\n\n#include \"../../IStream.h\"\n#include \"Common/MyCom.h\"\n\nclass CDummyOutStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialOutStream> _stream;\n  UInt64 _size;\npublic:\n  void SetStream(ISequentialOutStream *outStream) { _stream = outStream; }\n  void ReleaseStream() { _stream.Release(); }\n  void Init() { _size = 0; }\n  MY_UNKNOWN_IMP\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  UInt64 GetSize() const { return _size; }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/FindSignature.cpp",
    "content": "// FindSignature.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/Buffer.h\"\n\n#include \"FindSignature.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\nHRESULT FindSignatureInStream(ISequentialInStream *stream,\n    const Byte *signature, unsigned signatureSize,\n    const UInt64 *limit, UInt64 &resPos)\n{\n  resPos = 0;\n  CByteBuffer byteBuffer2;\n  byteBuffer2.SetCapacity(signatureSize);\n  RINOK(ReadStream_FALSE(stream, byteBuffer2, signatureSize));\n\n  if (memcmp(byteBuffer2, signature, signatureSize) == 0)\n    return S_OK;\n\n  const UInt32 kBufferSize = (1 << 16);\n  CByteBuffer byteBuffer;\n  byteBuffer.SetCapacity(kBufferSize);\n  Byte *buffer = byteBuffer;\n  UInt32 numPrevBytes = signatureSize - 1;\n  memcpy(buffer, (const Byte *)byteBuffer2 + 1, numPrevBytes);\n  resPos = 1;\n  for (;;)\n  {\n    if (limit != NULL)\n      if (resPos > *limit)\n        return S_FALSE;\n    do\n    {\n      UInt32 numReadBytes = kBufferSize - numPrevBytes;\n      UInt32 processedSize;\n      RINOK(stream->Read(buffer + numPrevBytes, numReadBytes, &processedSize));\n      numPrevBytes += processedSize;\n      if (processedSize == 0)\n        return S_FALSE;\n    }\n    while (numPrevBytes < signatureSize);\n    UInt32 numTests = numPrevBytes - signatureSize + 1;\n    for (UInt32 pos = 0; pos < numTests; pos++)\n    {\n      Byte b = signature[0];\n      for (; buffer[pos] != b && pos < numTests; pos++);\n      if (pos == numTests)\n        break;\n      if (memcmp(buffer + pos, signature, signatureSize) == 0)\n      {\n        resPos += pos;\n        return S_OK;\n      }\n    }\n    resPos += numTests;\n    numPrevBytes -= numTests;\n    memmove(buffer, buffer + numTests, numPrevBytes);\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/FindSignature.h",
    "content": "// FindSignature.h\n\n#ifndef __FINDSIGNATURE_H\n#define __FINDSIGNATURE_H\n\n#include \"../../IStream.h\"\n\nHRESULT FindSignatureInStream(ISequentialInStream *stream,\n    const Byte *signature, unsigned signatureSize,\n    const UInt64 *limit, UInt64 &resPos);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/HandlerOut.cpp",
    "content": "// HandlerOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../Common/StringToInt.h\"\n\n#include \"../../../Windows/PropVariant.h\"\n\n#ifdef COMPRESS_MT\n#include \"../../../Windows/System.h\"\n#endif\n\n#include \"../../ICoder.h\"\n\n#include \"../Common/ParseProperties.h\"\n\n#include \"HandlerOut.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\n\nstatic const wchar_t *kCopyMethod = L\"Copy\";\nstatic const wchar_t *kLZMAMethodName = L\"LZMA\";\nstatic const wchar_t *kLZMA2MethodName = L\"LZMA2\";\nstatic const wchar_t *kBZip2MethodName = L\"BZip2\";\nstatic const wchar_t *kPpmdMethodName = L\"PPMd\";\nstatic const wchar_t *kDeflateMethodName = L\"Deflate\";\nstatic const wchar_t *kDeflate64MethodName = L\"Deflate64\";\n\nstatic const wchar_t *kLzmaMatchFinderX1 = L\"HC4\";\nstatic const wchar_t *kLzmaMatchFinderX5 = L\"BT4\";\n\nstatic const UInt32 kLzmaAlgoX1 = 0;\nstatic const UInt32 kLzmaAlgoX5 = 1;\n\nstatic const UInt32 kLzmaDicSizeX1 = 1 << 16;\nstatic const UInt32 kLzmaDicSizeX3 = 1 << 20;\nstatic const UInt32 kLzmaDicSizeX5 = 1 << 24;\nstatic const UInt32 kLzmaDicSizeX7 = 1 << 25;\nstatic const UInt32 kLzmaDicSizeX9 = 1 << 26;\n\nstatic const UInt32 kLzmaFastBytesX1 = 32;\nstatic const UInt32 kLzmaFastBytesX7 = 64;\n\nstatic const UInt32 kPpmdMemSizeX1 = (1 << 22);\nstatic const UInt32 kPpmdMemSizeX5 = (1 << 24);\nstatic const UInt32 kPpmdMemSizeX7 = (1 << 26);\nstatic const UInt32 kPpmdMemSizeX9 = (192 << 20);\n\nstatic const UInt32 kPpmdOrderX1 = 4;\nstatic const UInt32 kPpmdOrderX5 = 6;\nstatic const UInt32 kPpmdOrderX7 = 16;\nstatic const UInt32 kPpmdOrderX9 = 32;\n\nstatic const UInt32 kDeflateAlgoX1 = 0;\nstatic const UInt32 kDeflateAlgoX5 = 1;\n\nstatic const UInt32 kDeflateFastBytesX1 = 32;\nstatic const UInt32 kDeflateFastBytesX7 = 64;\nstatic const UInt32 kDeflateFastBytesX9 = 128;\n\nstatic const UInt32 kDeflatePassesX1 = 1;\nstatic const UInt32 kDeflatePassesX7 = 3;\nstatic const UInt32 kDeflatePassesX9 = 10;\n\nstatic const UInt32 kBZip2NumPassesX1 = 1;\nstatic const UInt32 kBZip2NumPassesX7 = 2;\nstatic const UInt32 kBZip2NumPassesX9 = 7;\n\nstatic const UInt32 kBZip2DicSizeX1 = 100000;\nstatic const UInt32 kBZip2DicSizeX3 = 500000;\nstatic const UInt32 kBZip2DicSizeX5 = 900000;\n\nstatic const wchar_t *kDefaultMethodName = kLZMAMethodName;\n\nstatic const wchar_t *kLzmaMatchFinderForHeaders = L\"BT2\";\nstatic const UInt32 kDictionaryForHeaders = 1 << 20;\nstatic const UInt32 kNumFastBytesForHeaders = 273;\nstatic const UInt32 kAlgorithmForHeaders = kLzmaAlgoX5;\n\nstatic bool AreEqual(const UString &methodName, const wchar_t *s)\n  { return (methodName.CompareNoCase(s) == 0); }\n\nstatic inline bool IsLZMAMethod(const UString &methodName)\n{\n  return\n    AreEqual(methodName, kLZMAMethodName) ||\n    AreEqual(methodName, kLZMA2MethodName);\n}\n\nstatic inline bool IsBZip2Method(const UString &methodName)\n  { return AreEqual(methodName, kBZip2MethodName); }\n\nstatic inline bool IsPpmdMethod(const UString &methodName)\n  { return AreEqual(methodName, kPpmdMethodName); }\n\nstatic inline bool IsDeflateMethod(const UString &methodName)\n{\n  return\n    AreEqual(methodName, kDeflateMethodName) ||\n    AreEqual(methodName, kDeflate64MethodName);\n}\n\nstruct CNameToPropID\n{\n  PROPID PropID;\n  VARTYPE VarType;\n  const wchar_t *Name;\n};\n\nCNameToPropID g_NameToPropID[] =\n{\n  { NCoderPropID::kOrder, VT_UI4, L\"O\" },\n  { NCoderPropID::kPosStateBits, VT_UI4, L\"PB\" },\n  { NCoderPropID::kLitContextBits, VT_UI4, L\"LC\" },\n  { NCoderPropID::kLitPosBits, VT_UI4, L\"LP\" },\n  { NCoderPropID::kEndMarker, VT_BOOL, L\"eos\" },\n\n  { NCoderPropID::kNumPasses, VT_UI4, L\"Pass\" },\n  { NCoderPropID::kNumFastBytes, VT_UI4, L\"fb\" },\n  { NCoderPropID::kMatchFinderCycles, VT_UI4, L\"mc\" },\n  { NCoderPropID::kAlgorithm, VT_UI4, L\"a\" },\n  { NCoderPropID::kMatchFinder, VT_BSTR, L\"mf\" },\n  { NCoderPropID::kNumThreads, VT_UI4, L\"mt\" }\n};\n\nstatic bool ConvertProperty(PROPVARIANT srcProp, VARTYPE varType, NCOM::CPropVariant &destProp)\n{\n  if (varType == srcProp.vt)\n  {\n    destProp = srcProp;\n    return true;\n  }\n  if (varType == VT_UI1)\n  {\n    if (srcProp.vt == VT_UI4)\n    {\n      UInt32 value = srcProp.ulVal;\n      if (value > 0xFF)\n        return false;\n      destProp = (Byte)value;\n      return true;\n    }\n  }\n  else if (varType == VT_BOOL)\n  {\n    bool res;\n    if (SetBoolProperty(res, srcProp) != S_OK)\n      return false;\n    destProp = res;\n    return true;\n  }\n  return false;\n}\n    \nstatic int FindPropIdFromStringName(const UString &name)\n{\n  for (int i = 0; i < sizeof(g_NameToPropID) / sizeof(g_NameToPropID[0]); i++)\n    if (name.CompareNoCase(g_NameToPropID[i].Name) == 0)\n      return i;\n  return -1;\n}\n\nstatic void SetOneMethodProp(COneMethodInfo &oneMethodInfo, PROPID propID,\n    const NWindows::NCOM::CPropVariant &value)\n{\n  for (int j = 0; j < oneMethodInfo.Props.Size(); j++)\n    if (oneMethodInfo.Props[j].Id == propID)\n      return;\n  CProp prop;\n  prop.Id = propID;\n  prop.Value = value;\n  oneMethodInfo.Props.Add(prop);\n}\n\nvoid COutHandler::SetCompressionMethod2(COneMethodInfo &oneMethodInfo\n    #ifdef COMPRESS_MT\n    , UInt32 numThreads\n    #endif\n    )\n{\n  UInt32 level = _level;\n  if (oneMethodInfo.MethodName.IsEmpty())\n    oneMethodInfo.MethodName = kDefaultMethodName;\n  \n  if (IsLZMAMethod(oneMethodInfo.MethodName))\n  {\n    UInt32 dicSize =\n      (level >= 9 ? kLzmaDicSizeX9 :\n      (level >= 7 ? kLzmaDicSizeX7 :\n      (level >= 5 ? kLzmaDicSizeX5 :\n      (level >= 3 ? kLzmaDicSizeX3 :\n                    kLzmaDicSizeX1))));\n    \n    UInt32 algo =\n      (level >= 5 ? kLzmaAlgoX5 :\n                    kLzmaAlgoX1);\n    \n    UInt32 fastBytes =\n      (level >= 7 ? kLzmaFastBytesX7 :\n                    kLzmaFastBytesX1);\n    \n    const wchar_t *matchFinder =\n      (level >= 5 ? kLzmaMatchFinderX5 :\n                    kLzmaMatchFinderX1);\n    \n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize);\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo);\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes);\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kMatchFinder, matchFinder);\n    #ifdef COMPRESS_MT\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads);\n    #endif\n  }\n  else if (IsDeflateMethod(oneMethodInfo.MethodName))\n  {\n    UInt32 fastBytes =\n      (level >= 9 ? kDeflateFastBytesX9 :\n      (level >= 7 ? kDeflateFastBytesX7 :\n                    kDeflateFastBytesX1));\n    \n    UInt32 numPasses =\n      (level >= 9 ? kDeflatePassesX9 :\n      (level >= 7 ? kDeflatePassesX7 :\n                    kDeflatePassesX1));\n    \n    UInt32 algo =\n      (level >= 5 ? kDeflateAlgoX5 :\n                    kDeflateAlgoX1);\n    \n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo);\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes);\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses);\n  }\n  else if (IsBZip2Method(oneMethodInfo.MethodName))\n  {\n    UInt32 numPasses =\n      (level >= 9 ? kBZip2NumPassesX9 :\n      (level >= 7 ? kBZip2NumPassesX7 :\n                    kBZip2NumPassesX1));\n    \n    UInt32 dicSize =\n      (level >= 5 ? kBZip2DicSizeX5 :\n      (level >= 3 ? kBZip2DicSizeX3 :\n                    kBZip2DicSizeX1));\n    \n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses);\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize);\n    #ifdef COMPRESS_MT\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads);\n    #endif\n  }\n  else if (IsPpmdMethod(oneMethodInfo.MethodName))\n  {\n    UInt32 useMemSize =\n      (level >= 9 ? kPpmdMemSizeX9 :\n      (level >= 7 ? kPpmdMemSizeX7 :\n      (level >= 5 ? kPpmdMemSizeX5 :\n                    kPpmdMemSizeX1)));\n    \n    UInt32 order =\n      (level >= 9 ? kPpmdOrderX9 :\n      (level >= 7 ? kPpmdOrderX7 :\n      (level >= 5 ? kPpmdOrderX5 :\n                    kPpmdOrderX1)));\n    \n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kUsedMemorySize, useMemSize);\n    SetOneMethodProp(oneMethodInfo, NCoderPropID::kOrder, order);\n  }\n}\n\nstatic void SplitParams(const UString &srcString, UStringVector &subStrings)\n{\n  subStrings.Clear();\n  UString name;\n  int len = srcString.Length();\n  if (len == 0)\n    return;\n  for (int i = 0; i < len; i++)\n  {\n    wchar_t c = srcString[i];\n    if (c == L':')\n    {\n      subStrings.Add(name);\n      name.Empty();\n    }\n    else\n      name += c;\n  }\n  subStrings.Add(name);\n}\n\nstatic void SplitParam(const UString &param, UString &name, UString &value)\n{\n  int eqPos = param.Find(L'=');\n  if (eqPos >= 0)\n  {\n    name = param.Left(eqPos);\n    value = param.Mid(eqPos + 1);\n    return;\n  }\n  for(int i = 0; i < param.Length(); i++)\n  {\n    wchar_t c = param[i];\n    if (c >= L'0' && c <= L'9')\n    {\n      name = param.Left(i);\n      value = param.Mid(i);\n      return;\n    }\n  }\n  name = param;\n}\n\nHRESULT COutHandler::SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value)\n{\n  CProp prop;\n  if (name.CompareNoCase(L\"D\") == 0 ||\n      name.CompareNoCase(L\"MEM\") == 0)\n  {\n    UInt32 dicSize;\n    RINOK(ParsePropDictionaryValue(value, dicSize));\n    prop.Id = (name.CompareNoCase(L\"D\") == 0) ?\n        NCoderPropID::kDictionarySize :\n        NCoderPropID::kUsedMemorySize;\n    prop.Value = dicSize;\n  }\n  else\n  {\n    int index = FindPropIdFromStringName(name);\n    if (index < 0)\n      return E_INVALIDARG;\n    \n    const CNameToPropID &nameToPropID = g_NameToPropID[index];\n    prop.Id = nameToPropID.PropID;\n    \n    NCOM::CPropVariant propValue;\n    \n    if (nameToPropID.VarType == VT_BSTR)\n      propValue = value;\n    else if (nameToPropID.VarType == VT_BOOL)\n    {\n      bool res;\n      if (!StringToBool(value, res))\n        return E_INVALIDARG;\n      propValue = res;\n    }\n    else\n    {\n      UInt32 number;\n      if (ParseStringToUInt32(value, number) == value.Length())\n        propValue = number;\n      else\n        propValue = value;\n    }\n    \n    if (!ConvertProperty(propValue, nameToPropID.VarType, prop.Value))\n      return E_INVALIDARG;\n  }\n  oneMethodInfo.Props.Add(prop);\n  return S_OK;\n}\n\nHRESULT COutHandler::SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString)\n{\n  UStringVector params;\n  SplitParams(srcString, params);\n  if (params.Size() > 0)\n    oneMethodInfo.MethodName = params[0];\n  for (int i = 1; i < params.Size(); i++)\n  {\n    const UString &param = params[i];\n    UString name, value;\n    SplitParam(param, name, value);\n    RINOK(SetParam(oneMethodInfo, name, value));\n  }\n  return S_OK;\n}\n\nHRESULT COutHandler::SetSolidSettings(const UString &s)\n{\n  UString s2 = s;\n  s2.MakeUpper();\n  for (int i = 0; i < s2.Length();)\n  {\n    const wchar_t *start = ((const wchar_t *)s2) + i;\n    const wchar_t *end;\n    UInt64 v = ConvertStringToUInt64(start, &end);\n    if (start == end)\n    {\n      if (s2[i++] != 'E')\n        return E_INVALIDARG;\n      _solidExtension = true;\n      continue;\n    }\n    i += (int)(end - start);\n    if (i == s2.Length())\n      return E_INVALIDARG;\n    wchar_t c = s2[i++];\n    switch(c)\n    {\n      case 'F':\n        if (v < 1)\n          v = 1;\n        _numSolidFiles = v;\n        break;\n      case 'B':\n        _numSolidBytes = v;\n        _numSolidBytesDefined = true;\n        break;\n      case 'K':\n        _numSolidBytes = (v << 10);\n        _numSolidBytesDefined = true;\n        break;\n      case 'M':\n        _numSolidBytes = (v << 20);\n        _numSolidBytesDefined = true;\n        break;\n      case 'G':\n        _numSolidBytes = (v << 30);\n        _numSolidBytesDefined = true;\n        break;\n      default:\n        return E_INVALIDARG;\n    }\n  }\n  return S_OK;\n}\n\nHRESULT COutHandler::SetSolidSettings(const PROPVARIANT &value)\n{\n  bool isSolid;\n  switch(value.vt)\n  {\n    case VT_EMPTY:\n      isSolid = true;\n      break;\n    case VT_BOOL:\n      isSolid = (value.boolVal != VARIANT_FALSE);\n      break;\n    case VT_BSTR:\n      if (StringToBool(value.bstrVal, isSolid))\n        break;\n      return SetSolidSettings(value.bstrVal);\n    default:\n      return E_INVALIDARG;\n  }\n  if (isSolid)\n    InitSolid();\n  else\n    _numSolidFiles = 1;\n  return S_OK;\n}\n\nvoid COutHandler::Init()\n{\n  _removeSfxBlock = false;\n  _compressHeaders = true;\n  _encryptHeadersSpecified = false;\n  _encryptHeaders = false;\n  \n  WriteCTime = false;\n  WriteATime = false;\n  WriteMTime = true;\n  \n  #ifdef COMPRESS_MT\n  _numThreads = NWindows::NSystem::GetNumberOfProcessors();\n  #endif\n  \n  _level = 5;\n  _autoFilter = true;\n  _volumeMode = false;\n  _crcSize = 4;\n  InitSolid();\n}\n\nvoid COutHandler::BeforeSetProperty()\n{\n  Init();\n  #ifdef COMPRESS_MT\n  numProcessors = NSystem::GetNumberOfProcessors();\n  #endif\n\n  mainDicSize = 0xFFFFFFFF;\n  mainDicMethodIndex = 0xFFFFFFFF;\n  minNumber = 0;\n  _crcSize = 4;\n}\n\nHRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value)\n{\n  UString name = nameSpec;\n  name.MakeUpper();\n  if (name.IsEmpty())\n    return E_INVALIDARG;\n  \n  if (name[0] == 'X')\n  {\n    name.Delete(0);\n    _level = 9;\n    return ParsePropValue(name, value, _level);\n  }\n  \n  if (name[0] == L'S')\n  {\n    name.Delete(0);\n    if (name.IsEmpty())\n      return SetSolidSettings(value);\n    if (value.vt != VT_EMPTY)\n      return E_INVALIDARG;\n    return SetSolidSettings(name);\n  }\n  \n  if (name == L\"CRC\")\n  {\n    _crcSize = 4;\n    name.Delete(0, 3);\n    return ParsePropValue(name, value, _crcSize);\n  }\n  \n  UInt32 number;\n  int index = ParseStringToUInt32(name, number);\n  UString realName = name.Mid(index);\n  if (index == 0)\n  {\n    if(name.Left(2).CompareNoCase(L\"MT\") == 0)\n    {\n      #ifdef COMPRESS_MT\n      RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads));\n      #endif\n      return S_OK;\n    }\n    if (name.CompareNoCase(L\"RSFX\") == 0)  return SetBoolProperty(_removeSfxBlock, value);\n    if (name.CompareNoCase(L\"F\") == 0) return SetBoolProperty(_autoFilter, value);\n    if (name.CompareNoCase(L\"HC\") == 0) return SetBoolProperty(_compressHeaders, value);\n    if (name.CompareNoCase(L\"HCF\") == 0)\n    {\n      bool compressHeadersFull = true;\n      RINOK(SetBoolProperty(compressHeadersFull, value));\n      if (!compressHeadersFull)\n        return E_INVALIDARG;\n      return S_OK;\n    }\n    if (name.CompareNoCase(L\"HE\") == 0)\n    {\n      RINOK(SetBoolProperty(_encryptHeaders, value));\n      _encryptHeadersSpecified = true;\n      return S_OK;\n    }\n    if (name.CompareNoCase(L\"TC\") == 0) return SetBoolProperty(WriteCTime, value);\n    if (name.CompareNoCase(L\"TA\") == 0) return SetBoolProperty(WriteATime, value);\n    if (name.CompareNoCase(L\"TM\") == 0) return SetBoolProperty(WriteMTime, value);\n    if (name.CompareNoCase(L\"V\") == 0) return SetBoolProperty(_volumeMode, value);\n    number = 0;\n  }\n  if (number > 10000)\n    return E_FAIL;\n  if (number < minNumber)\n    return E_INVALIDARG;\n  number -= minNumber;\n  for(int j = _methods.Size(); j <= (int)number; j++)\n  {\n    COneMethodInfo oneMethodInfo;\n    _methods.Add(oneMethodInfo);\n  }\n  \n  COneMethodInfo &oneMethodInfo = _methods[number];\n  \n  if (realName.Length() == 0)\n  {\n    if (value.vt != VT_BSTR)\n      return E_INVALIDARG;\n    \n    RINOK(SetParams(oneMethodInfo, value.bstrVal));\n  }\n  else\n  {\n    CProp prop;\n    if (realName.Left(1).CompareNoCase(L\"D\") == 0)\n    {\n      UInt32 dicSize;\n      RINOK(ParsePropDictionaryValue(realName.Mid(1), value, dicSize));\n      prop.Id = NCoderPropID::kDictionarySize;\n      prop.Value = dicSize;\n      if (number <= mainDicMethodIndex)\n        mainDicSize = dicSize;\n    }\n    else if (realName.Left(1).CompareNoCase(L\"C\") == 0)\n    {\n      UInt32 blockSize;\n      RINOK(ParsePropDictionaryValue(realName.Mid(1), value, blockSize));\n      prop.Id = NCoderPropID::kBlockSize;\n      prop.Value = blockSize;\n    }\n    else if (realName.Left(3).CompareNoCase(L\"MEM\") == 0)\n    {\n      UInt32 dicSize;\n      RINOK(ParsePropDictionaryValue(realName.Mid(3), value, dicSize));\n      prop.Id = NCoderPropID::kUsedMemorySize;\n      prop.Value = dicSize;\n      if (number <= mainDicMethodIndex)\n        mainDicSize = dicSize;\n    }\n    else\n    {\n      int index = FindPropIdFromStringName(realName);\n      if (index < 0)\n        return E_INVALIDARG;\n      const CNameToPropID &nameToPropID = g_NameToPropID[index];\n      prop.Id = nameToPropID.PropID;\n      if (!ConvertProperty(value, nameToPropID.VarType, prop.Value))\n        return E_INVALIDARG;\n    }\n    oneMethodInfo.Props.Add(prop);\n  }\n  return S_OK;\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/HandlerOut.h",
    "content": "// HandlerOut.h\n\n#ifndef __HANDLER_OUT_H\n#define __HANDLER_OUT_H\n\n#include \"../../../Common/MyString.h\"\n#include \"../../Common/MethodProps.h\"\n\nnamespace NArchive {\n\nstruct COneMethodInfo\n{\n  CObjectVector<CProp> Props;\n  UString MethodName;\n};\n\nclass COutHandler\n{\npublic:\n  HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value);\n  \n  HRESULT SetSolidSettings(const UString &s);\n  HRESULT SetSolidSettings(const PROPVARIANT &value);\n\n  #ifdef COMPRESS_MT\n  UInt32 _numThreads;\n  #endif\n\n  UInt32 _crcSize;\n\n  CObjectVector<COneMethodInfo> _methods;\n  bool _removeSfxBlock;\n  \n  UInt64 _numSolidFiles;\n  UInt64 _numSolidBytes;\n  bool _numSolidBytesDefined;\n  bool _solidExtension;\n\n  bool _compressHeaders;\n  bool _encryptHeadersSpecified;\n  bool _encryptHeaders;\n\n  bool WriteCTime;\n  bool WriteATime;\n  bool WriteMTime;\n\n  bool _autoFilter;\n  UInt32 _level;\n\n  bool _volumeMode;\n\n  HRESULT SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value);\n  HRESULT SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString);\n\n  void SetCompressionMethod2(COneMethodInfo &oneMethodInfo\n      #ifdef COMPRESS_MT\n      , UInt32 numThreads\n      #endif\n      );\n\n  void InitSolidFiles() { _numSolidFiles = (UInt64)(Int64)(-1); }\n  void InitSolidSize()  { _numSolidBytes = (UInt64)(Int64)(-1); }\n  void InitSolid()\n  {\n    InitSolidFiles();\n    InitSolidSize();\n    _solidExtension = false;\n    _numSolidBytesDefined = false;\n  }\n\n  void Init();\n\n  COutHandler() { Init(); }\n\n  void BeforeSetProperty();\n\n  UInt32 minNumber;\n  UInt32 numProcessors;\n  UInt32 mainDicSize;\n  UInt32 mainDicMethodIndex;\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/InStreamWithCRC.cpp",
    "content": "// InStreamWithCRC.cpp\n\n#include \"StdAfx.h\"\n\n#include \"InStreamWithCRC.h\"\n\nSTDMETHODIMP CSequentialInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result = _stream->Read(data, size, &realProcessedSize);\n  _size += realProcessedSize;\n  if (size > 0 && realProcessedSize == 0)\n    _wasFinished = true;\n  _crc = CrcUpdate(_crc, data, realProcessedSize);\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n\nSTDMETHODIMP CInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result = _stream->Read(data, size, &realProcessedSize);\n  if (size > 0 && realProcessedSize == 0)\n    _wasFinished = true;\n  _size += realProcessedSize;\n  _crc = CrcUpdate(_crc, data, realProcessedSize);\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n\nSTDMETHODIMP CInStreamWithCRC::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)\n{\n  if (seekOrigin != STREAM_SEEK_SET || offset != 0)\n    return E_FAIL;\n  _size = 0;\n  _crc = CRC_INIT_VAL;\n  return _stream->Seek(offset, seekOrigin, newPosition);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/InStreamWithCRC.h",
    "content": "// InStreamWithCRC.h\n\n#ifndef __INSTREAMWITHCRC_H\n#define __INSTREAMWITHCRC_H\n\n#include \"../../../Common/MyCom.h\"\n#include \"../../IStream.h\"\n\nextern \"C\"\n{\n#include \"../../../../C/7zCrc.h\"\n}\n\nclass CSequentialInStreamWithCRC:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\nprivate:\n  CMyComPtr<ISequentialInStream> _stream;\n  UInt64 _size;\n  UInt32 _crc;\n  bool _wasFinished;\npublic:\n  void SetStream(ISequentialInStream *stream) { _stream = stream;  }\n  void Init()\n  {\n    _size = 0;\n    _wasFinished = false;\n    _crc = CRC_INIT_VAL;\n  }\n  void ReleaseStream() { _stream.Release(); }\n  UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }\n  UInt64 GetSize() const { return _size; }\n  bool WasFinished() const { return _wasFinished; }\n};\n\nclass CInStreamWithCRC:\n  public IInStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInStream)\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\nprivate:\n  CMyComPtr<IInStream> _stream;\n  UInt64 _size;\n  UInt32 _crc;\n  bool _wasFinished;\npublic:\n  void SetStream(IInStream *stream) { _stream = stream;  }\n  void Init()\n  {\n    _size = 0;\n    _wasFinished = false;\n    _crc = CRC_INIT_VAL;\n  }\n  void ReleaseStream() { _stream.Release(); }\n  UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }\n  UInt64 GetSize() const { return _size; }\n  bool WasFinished() const { return _wasFinished; }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/ItemNameUtils.cpp",
    "content": "// Archive/Common/ItemNameUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ItemNameUtils.h\"\n\nnamespace NArchive {\nnamespace NItemName {\n\nstatic const wchar_t kOSDirDelimiter = WCHAR_PATH_SEPARATOR;\nstatic const wchar_t kDirDelimiter = L'/';\n\nUString MakeLegalName(const UString &name)\n{\n  UString zipName = name;\n  zipName.Replace(kOSDirDelimiter, kDirDelimiter);\n  return zipName;\n}\n\nUString GetOSName(const UString &name)\n{\n  UString newName = name;\n  newName.Replace(kDirDelimiter, kOSDirDelimiter);\n  return newName;\n}\n\nUString GetOSName2(const UString &name)\n{\n  if (name.IsEmpty())\n    return UString();\n  UString newName = GetOSName(name);\n  if (newName[newName.Length() - 1] == kOSDirDelimiter)\n    newName.Delete(newName.Length() - 1);\n  return newName;\n}\n\nbool HasTailSlash(const AString &name, UINT codePage)\n{\n  if (name.IsEmpty())\n    return false;\n  LPCSTR prev =\n  #ifdef _WIN32\n    CharPrevExA((WORD)codePage, name, &name[name.Length()], 0);\n  #else\n    (LPCSTR)(name) + (name.Length() - 1);\n  #endif\n  return (*prev == '/');\n}\n\n#ifndef _WIN32\nUString WinNameToOSName(const UString &name)\n{\n  UString newName = name;\n  newName.Replace(L'\\\\', kOSDirDelimiter);\n  return newName;\n}\n#endif\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/ItemNameUtils.h",
    "content": "// Archive/Common/ItemNameUtils.h\n\n#ifndef __ARCHIVE_ITEMNAMEUTILS_H\n#define __ARCHIVE_ITEMNAMEUTILS_H\n\n#include \"../../../Common/MyString.h\"\n\nnamespace NArchive {\nnamespace NItemName {\n\n  UString MakeLegalName(const UString &name);\n  UString GetOSName(const UString &name);\n  UString GetOSName2(const UString &name);\n  bool HasTailSlash(const AString &name, UINT codePage);\n\n  #ifdef _WIN32\n  inline UString WinNameToOSName(const UString &name)  { return name; }\n  #else\n  UString WinNameToOSName(const UString &name);\n  #endif\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/MultiStream.cpp",
    "content": "// MultiStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"MultiStream.h\"\n\nSTDMETHODIMP CMultiStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  if(processedSize != NULL)\n    *processedSize = 0;\n  while(_streamIndex < Streams.Size() && size > 0)\n  {\n    CSubStreamInfo &s = Streams[_streamIndex];\n    if (_pos == s.Size)\n    {\n      _streamIndex++;\n      _pos = 0;\n      continue;\n    }\n    RINOK(s.Stream->Seek(s.Pos + _pos, STREAM_SEEK_SET, 0));\n    UInt32 sizeToRead = UInt32(MyMin((UInt64)size, s.Size - _pos));\n    UInt32 realProcessed;\n    HRESULT result = s.Stream->Read(data, sizeToRead, &realProcessed);\n    data = (void *)((Byte *)data + realProcessed);\n    size -= realProcessed;\n    if(processedSize != NULL)\n      *processedSize += realProcessed;\n    _pos += realProcessed;\n    _seekPos += realProcessed;\n    RINOK(result);\n    break;\n  }\n  return S_OK;\n}\n  \nSTDMETHODIMP CMultiStream::Seek(Int64 offset, UInt32 seekOrigin,\n    UInt64 *newPosition)\n{\n  UInt64 newPos;\n  switch(seekOrigin)\n  {\n    case STREAM_SEEK_SET:\n      newPos = offset;\n      break;\n    case STREAM_SEEK_CUR:\n      newPos = _seekPos + offset;\n      break;\n    case STREAM_SEEK_END:\n      newPos = _totalLength + offset;\n      break;\n    default:\n      return STG_E_INVALIDFUNCTION;\n  }\n  _seekPos = 0;\n  for (_streamIndex = 0; _streamIndex < Streams.Size(); _streamIndex++)\n  {\n    UInt64 size = Streams[_streamIndex].Size;\n    if (newPos < _seekPos + size)\n    {\n      _pos = newPos - _seekPos;\n      _seekPos += _pos;\n      if (newPosition != 0)\n        *newPosition = newPos;\n      return S_OK;\n    }\n    _seekPos += size;\n  }\n  if (newPos == _seekPos)\n  {\n    if (newPosition != 0)\n      *newPosition = newPos;\n    return S_OK;\n  }\n  return E_FAIL;\n}\n\n\n/*\nclass COutVolumeStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  int _volIndex;\n  UInt64 _volSize;\n  UInt64 _curPos;\n  CMyComPtr<ISequentialOutStream> _volumeStream;\n  COutArchive _archive;\n  CCRC _crc;\n\npublic:\n  MY_UNKNOWN_IMP\n\n  CFileItem _file;\n  CUpdateOptions _options;\n  CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;\n  void Init(IArchiveUpdateCallback2 *volumeCallback,\n      const UString &name)\n  {\n    _file.Name = name;\n    _file.IsStartPosDefined = true;\n    _file.StartPos = 0;\n    \n    VolumeCallback = volumeCallback;\n    _volIndex = 0;\n    _volSize = 0;\n  }\n  \n  HRESULT Flush();\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\nHRESULT COutVolumeStream::Flush()\n{\n  if (_volumeStream)\n  {\n    _file.UnPackSize = _curPos;\n    _file.FileCRC = _crc.GetDigest();\n    RINOK(WriteVolumeHeader(_archive, _file, _options));\n    _archive.Close();\n    _volumeStream.Release();\n    _file.StartPos += _file.UnPackSize;\n  }\n  return S_OK;\n}\n*/\n\n/*\nSTDMETHODIMP COutMultiStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  if(processedSize != NULL)\n    *processedSize = 0;\n  while(size > 0)\n  {\n    if (_streamIndex >= Streams.Size())\n    {\n      CSubStreamInfo subStream;\n      RINOK(VolumeCallback->GetVolumeSize(Streams.Size(), &subStream.Size));\n      RINOK(VolumeCallback->GetVolumeStream(Streams.Size(), &subStream.Stream));\n      subStream.Pos = 0;\n      Streams.Add(subStream);\n      continue;\n    }\n    CSubStreamInfo &subStream = Streams[_streamIndex];\n    if (_offsetPos >= subStream.Size)\n    {\n      _offsetPos -= subStream.Size;\n      _streamIndex++;\n      continue;\n    }\n    if (_offsetPos != subStream.Pos)\n    {\n      CMyComPtr<IOutStream> outStream;\n      RINOK(subStream.Stream.QueryInterface(IID_IOutStream, &outStream));\n      RINOK(outStream->Seek(_offsetPos, STREAM_SEEK_SET, NULL));\n      subStream.Pos = _offsetPos;\n    }\n\n    UInt32 curSize = (UInt32)MyMin((UInt64)size, subStream.Size - subStream.Pos);\n    UInt32 realProcessed;\n    RINOK(subStream.Stream->Write(data, curSize, &realProcessed));\n    data = (void *)((Byte *)data + realProcessed);\n    size -= realProcessed;\n    subStream.Pos += realProcessed;\n    _offsetPos += realProcessed;\n    _absPos += realProcessed;\n    if (_absPos > _length)\n      _length = _absPos;\n    if(processedSize != NULL)\n      *processedSize += realProcessed;\n    if (subStream.Pos == subStream.Size)\n    {\n      _streamIndex++;\n      _offsetPos = 0;\n    }\n    if (realProcessed != curSize && realProcessed == 0)\n      return E_FAIL;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP COutMultiStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)\n{\n  if(seekOrigin >= 3)\n    return STG_E_INVALIDFUNCTION;\n  switch(seekOrigin)\n  {\n    case STREAM_SEEK_SET:\n      _absPos = offset;\n      break;\n    case STREAM_SEEK_CUR:\n      _absPos += offset;\n      break;\n    case STREAM_SEEK_END:\n      _absPos = _length + offset;\n      break;\n  }\n  _offsetPos = _absPos;\n  _streamIndex = 0;\n  return S_OK;\n}\n*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/MultiStream.h",
    "content": "// MultiStream.h\n\n#ifndef __MULTISTREAM_H\n#define __MULTISTREAM_H\n\n#include \"../../../Common/MyCom.h\"\n#include \"../../../Common/MyVector.h\"\n#include \"../../Archive/IArchive.h\"\n\nclass CMultiStream:\n  public IInStream,\n  public CMyUnknownImp\n{\n  int _streamIndex;\n  UInt64 _pos;\n  UInt64 _seekPos;\n  UInt64 _totalLength;\npublic:\n  struct CSubStreamInfo\n  {\n    CMyComPtr<IInStream> Stream;\n    UInt64 Pos;\n    UInt64 Size;\n  };\n  CObjectVector<CSubStreamInfo> Streams;\n  void Init()\n  {\n    _streamIndex = 0;\n    _pos = 0;\n    _seekPos = 0;\n    _totalLength = 0;\n    for (int i = 0; i < Streams.Size(); i++)\n      _totalLength += Streams[i].Size;\n  }\n\n  MY_UNKNOWN_IMP1(IInStream)\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\n};\n\n/*\nclass COutMultiStream:\n  public IOutStream,\n  public CMyUnknownImp\n{\n  int _streamIndex; // required stream\n  UInt64 _offsetPos; // offset from start of _streamIndex index\n  UInt64 _absPos;\n  UInt64 _length;\n\n  struct CSubStreamInfo\n  {\n    CMyComPtr<ISequentialOutStream> Stream;\n    UInt64 Size;\n    UInt64 Pos;\n };\n  CObjectVector<CSubStreamInfo> Streams;\npublic:\n  CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;\n  void Init()\n  {\n    _streamIndex = 0;\n    _offsetPos = 0;\n    _absPos = 0;\n    _length = 0;\n  }\n\n  MY_UNKNOWN_IMP1(IOutStream)\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\n};\n*/\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp",
    "content": "// OutStreamWithCRC.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OutStreamWithCRC.h\"\n\nSTDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result;\n  if(!_stream)\n  {\n    realProcessedSize = size;\n    result = S_OK;\n  }\n  else\n    result = _stream->Write(data, size, &realProcessedSize);\n  if (_calculate)\n    _crc = CrcUpdate(_crc, data, realProcessedSize);\n  _size += realProcessedSize;\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/OutStreamWithCRC.h",
    "content": "// OutStreamWithCRC.h\n\n#ifndef __OUT_STREAM_WITH_CRC_H\n#define __OUT_STREAM_WITH_CRC_H\n\n#include \"../../../Common/MyCom.h\"\n#include \"../../IStream.h\"\n\nextern \"C\"\n{\n#include \"../../../../C/7zCrc.h\"\n}\n\nclass COutStreamWithCRC:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialOutStream> _stream;\n  UInt64 _size;\n  UInt32 _crc;\n  bool _calculate;\npublic:\n  MY_UNKNOWN_IMP\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  void SetStream(ISequentialOutStream *stream) { _stream = stream; }\n  void ReleaseStream() { _stream.Release(); }\n  void Init(bool calculate = true)\n  {\n    _size = 0;\n    _calculate = calculate;\n    _crc = CRC_INIT_VAL;\n  }\n  void InitCRC() { _crc = CRC_INIT_VAL; }\n  UInt64 GetSize() const { return _size; }\n  UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp",
    "content": "// OutStreamWithSha1.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OutStreamWithSha1.h\"\n\nSTDMETHODIMP COutStreamWithSha1::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result;\n  if(!_stream)\n  {\n    realProcessedSize = size;\n    result = S_OK;\n  }\n  else\n    result = _stream->Write(data, size, &realProcessedSize);\n  if (_calculate)\n    _sha.Update((const Byte *)data, realProcessedSize);\n  _size += realProcessedSize;\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/OutStreamWithSha1.h",
    "content": "// OutStreamWithSha1.h\n\n#ifndef __OUT_STREAM_WITH_SHA1_H\n#define __OUT_STREAM_WITH_SHA1_H\n\n#include \"../../../Common/MyCom.h\"\n#include \"../../IStream.h\"\n\n\n\n#include \"../../Crypto/Sha1.h\"\n\n\nclass COutStreamWithSha1:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialOutStream> _stream;\n  UInt64 _size;\n  NCrypto::NSha1::CContext _sha;\n  bool _calculate;\npublic:\n  MY_UNKNOWN_IMP\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  void SetStream(ISequentialOutStream *stream) { _stream = stream; }\n  void ReleaseStream() { _stream.Release(); }\n  void Init(bool calculate = true)\n  {\n    _size = 0;\n    _calculate = calculate;\n    _sha.Init();\n  }\n  void InitSha1() { _sha.Init(); }\n  UInt64 GetSize() const { return _size; }\n  void Final(Byte *digest) { _sha.Final(digest); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/ParseProperties.cpp",
    "content": "// ParseProperties.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ParseProperties.h\"\n\n#include \"Common/StringToInt.h\"\n#include \"Common/MyCom.h\"\n\nHRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)\n{\n  if (prop.vt == VT_UI4)\n  {\n    if (!name.IsEmpty())\n      return E_INVALIDARG;\n    resValue = prop.ulVal;\n  }\n  else if (prop.vt == VT_EMPTY)\n  {\n    if(!name.IsEmpty())\n    {\n      const wchar_t *start = name;\n      const wchar_t *end;\n      UInt64 v = ConvertStringToUInt64(start, &end);\n      if (end - start != name.Length())\n        return E_INVALIDARG;\n      resValue = (UInt32)v;\n    }\n  }\n  else\n    return E_INVALIDARG;\n  return S_OK;\n}\n\nstatic const int kLogarithmicSizeLimit = 32;\nstatic const wchar_t kByteSymbol = L'B';\nstatic const wchar_t kKiloByteSymbol = L'K';\nstatic const wchar_t kMegaByteSymbol = L'M';\n\nHRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize)\n{\n  UString srcString = srcStringSpec;\n  srcString.MakeUpper();\n\n  const wchar_t *start = srcString;\n  const wchar_t *end;\n  UInt64 number = ConvertStringToUInt64(start, &end);\n  int numDigits = (int)(end - start);\n  if (numDigits == 0 || srcString.Length() > numDigits + 1)\n    return E_INVALIDARG;\n  if (srcString.Length() == numDigits)\n  {\n    if (number >= kLogarithmicSizeLimit)\n      return E_INVALIDARG;\n    dicSize = (UInt32)1 << (int)number;\n    return S_OK;\n  }\n  switch (srcString[numDigits])\n  {\n    case kByteSymbol:\n      if (number >= ((UInt64)1 << kLogarithmicSizeLimit))\n        return E_INVALIDARG;\n      dicSize = (UInt32)number;\n      break;\n    case kKiloByteSymbol:\n      if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10)))\n        return E_INVALIDARG;\n      dicSize = (UInt32)(number << 10);\n      break;\n    case kMegaByteSymbol:\n      if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20)))\n        return E_INVALIDARG;\n      dicSize = (UInt32)(number << 20);\n      break;\n    default:\n      return E_INVALIDARG;\n  }\n  return S_OK;\n}\n\nHRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)\n{\n  if (name.IsEmpty())\n  {\n    if (prop.vt == VT_UI4)\n    {\n      UInt32 logDicSize = prop.ulVal;\n      if (logDicSize >= 32)\n        return E_INVALIDARG;\n      resValue = (UInt32)1 << logDicSize;\n      return S_OK;\n    }\n    if (prop.vt == VT_BSTR)\n      return ParsePropDictionaryValue(prop.bstrVal, resValue);\n    return E_INVALIDARG;\n  }\n  return ParsePropDictionaryValue(name, resValue);\n}\n\nbool StringToBool(const UString &s, bool &res)\n{\n  if (s.IsEmpty() || s.CompareNoCase(L\"ON\") == 0 || s.Compare(L\"+\") == 0)\n  {\n    res = true;\n    return true;\n  }\n  if (s.CompareNoCase(L\"OFF\") == 0 || s.Compare(L\"-\") == 0)\n  {\n    res = false;\n    return true;\n  }\n  return false;\n}\n\nHRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value)\n{\n  switch(value.vt)\n  {\n    case VT_EMPTY:\n      dest = true;\n      return S_OK;\n    case VT_BOOL:\n      dest = (value.boolVal != VARIANT_FALSE);\n      return S_OK;\n    /*\n    case VT_UI4:\n      dest = (value.ulVal != 0);\n      break;\n    */\n    case VT_BSTR:\n      return StringToBool(value.bstrVal, dest) ?  S_OK : E_INVALIDARG;\n  }\n  return E_INVALIDARG;\n}\n\nint ParseStringToUInt32(const UString &srcString, UInt32 &number)\n{\n  const wchar_t *start = srcString;\n  const wchar_t *end;\n  UInt64 number64 = ConvertStringToUInt64(start, &end);\n  if (number64 > 0xFFFFFFFF)\n  {\n    number = 0;\n    return 0;\n  }\n  number = (UInt32)number64;\n  return (int)(end - start);\n}\n\nHRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads)\n{\n  if (name.IsEmpty())\n  {\n    switch(prop.vt)\n    {\n      case VT_UI4:\n        numThreads = prop.ulVal;\n        break;\n      default:\n      {\n        bool val;\n        RINOK(SetBoolProperty(val, prop));\n        numThreads = (val ? defaultNumThreads : 1);\n        break;\n      }\n    }\n  }\n  else\n  {\n    UInt32 number;\n    int index = ParseStringToUInt32(name, number);\n    if (index != name.Length())\n      return E_INVALIDARG;\n    numThreads = number;\n  }\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Common/ParseProperties.h",
    "content": "// ParseProperties.h\n\n#ifndef __PARSEPROPERTIES_H\n#define __PARSEPROPERTIES_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Types.h\"\n\nHRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue);\nHRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize);\nHRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue);\n\nbool StringToBool(const UString &s, bool &res);\nHRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value);\nint ParseStringToUInt32(const UString &srcString, UInt32 &number);\nHRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioHandler.cpp",
    "content": "// CpioHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/NewHandler.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"CpioHandler.h\"\n#include \"CpioIn.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NCpio {\n\n/*\nenum\n{\n  kpidinode = kpidUserDefined,\n  kpidiChkSum\n};\n*/\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  // { NULL, kpidUser, VT_BSTR},\n  // { NULL, kpidGroup, VT_BSTR},\n  // { L\"inode\", kpidinode, VT_UI4}\n  // { L\"CheckSum\", kpidiChkSum, VT_UI4}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback *callback)\n{\n  COM_TRY_BEGIN\n  // try\n  {\n    CInArchive archive;\n\n    UInt64 endPos = 0;\n    bool needSetTotal = true;\n\n    if (callback != NULL)\n    {\n      RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));\n      RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));\n    }\n\n    RINOK(archive.Open(stream));\n\n    _items.Clear();\n\n    for (;;)\n    {\n      CItemEx item;\n      bool filled;\n      HRESULT result = archive.GetNextItem(filled, item);\n      if (result == S_FALSE)\n        return S_FALSE;\n      if (result != S_OK)\n        return S_FALSE;\n      if (!filled)\n        break;\n      _items.Add(item);\n      archive.SkeepDataRecords(item.Size, item.Align);\n      if (callback != NULL)\n      {\n        if (needSetTotal)\n        {\n          RINOK(callback->SetTotal(NULL, &endPos));\n          needSetTotal = false;\n        }\n        if (_items.Size() % 100 == 0)\n        {\n          UInt64 numFiles = _items.Size();\n          UInt64 numBytes = item.HeaderPosition;\n          RINOK(callback->SetCompleted(&numFiles, &numBytes));\n        }\n      }\n    }\n    if (_items.Size() == 0)\n      return S_FALSE;\n\n    _inStream = stream;\n  }\n  /*\n  catch(...)\n  {\n    return S_FALSE;\n  }\n  */\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _items.Clear();\n  _inStream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _items.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CItemEx &item = _items[index];\n\n  switch(propID)\n  {\n    case kpidPath:\n      prop = NItemName::GetOSName(MultiByteToUnicodeString(item.Name, CP_OEMCP));\n      break;\n    case kpidIsDir:\n      prop = item.IsDir();\n      break;\n    case kpidSize:\n    case kpidPackSize:\n      prop = (UInt64)item.Size;\n      break;\n    case kpidMTime:\n    {\n      FILETIME utcFileTime;\n      if (item.ModificationTime != 0)\n        NTime::UnixTimeToFileTime(item.ModificationTime, utcFileTime);\n      else\n      {\n        utcFileTime.dwLowDateTime = 0;\n        utcFileTime.dwHighDateTime = 0;\n      }\n      prop = utcFileTime;\n      break;\n    }\n    /*\n    case kpidinode:  prop = item.inode; break;\n    case kpidiChkSum:  prop = item.ChkSum; break;\n    */\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _items.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n    totalSize += _items[allFilesMode ? i : indices[i]].Size;\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n    const CItemEx &item = _items[index];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n    currentItemSize = item.Size;\n    if (item.IsDir())\n    {\n      RINOK(extractCallback->PrepareOperation(askMode));\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n    if (testMode)\n    {\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    RINOK(_inStream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL));\n    streamSpec->Init(item.Size);\n    RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?\n        NArchive::NExtract::NOperationResult::kOK:\n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioHandler.h",
    "content": "// Archive/cpio/Handler.h\n\n#ifndef __ARCHIVE_CPIO_HANDLER_H\n#define __ARCHIVE_CPIO_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n\n#include \"CpioItem.h\"\n\nnamespace NArchive {\nnamespace NCpio {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CObjectVector<CItemEx> _items;\n  CMyComPtr<IInStream> _inStream;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioHeader.cpp",
    "content": "// Archive/cpio/Header.h\n\n#include \"StdAfx.h\"\n\n#include \"CpioHeader.h\"\n\nnamespace NArchive {\nnamespace NCpio {\nnamespace NFileHeader {\n\n  namespace NMagic\n  {\n    extern const char *kMagic1 = \"070701\";\n    extern const char *kMagic2 = \"070702\";\n    extern const char *kMagic3 = \"070707\";\n    extern const char *kEndName = \"TRAILER!!!\";\n\n    const Byte kMagicForRecord2[2] = { 0xC7, 0x71 };\n    // unsigned short kMagicForRecord2BE = 0xC771;\n  }\n\n}}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioHeader.h",
    "content": "// Archive/cpio/Header.h\n\n#ifndef __ARCHIVE_CPIO_HEADER_H\n#define __ARCHIVE_CPIO_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NCpio {\n\nnamespace NFileHeader\n{\n  namespace NMagic\n  {\n    extern const char *kMagic1;\n    extern const char *kMagic2;\n    extern const char *kMagic3;\n    extern const char *kEndName;\n    extern const Byte kMagicForRecord2[2];\n  }\n\n  const UInt32 kRecord2Size = 26;\n  /*\n  struct CRecord2\n  {\n    unsigned short c_magic;\n    short c_dev;\n    unsigned short c_ino;\n    unsigned short c_mode;\n    unsigned short c_uid;\n    unsigned short c_gid;\n    unsigned short c_nlink;\n    short c_rdev;\n    unsigned short c_mtimes[2];\n    unsigned short c_namesize;\n    unsigned short c_filesizes[2];\n  };\n  */\n \n  const UInt32 kRecordSize = 110;\n  /*\n  struct CRecord\n  {\n    char Magic[6];  // \"070701\" for \"new\" portable format, \"070702\" for CRC format\n    char inode[8];\n    char Mode[8];\n    char UID[8];\n    char GID[8];\n    char nlink[8];\n    char mtime[8];\n    char Size[8]; // must be 0 for FIFOs and directories\n    char DevMajor[8];\n    char DevMinor[8];\n    char RDevMajor[8];  //only valid for chr and blk special files\n    char RDevMinor[8];  //only valid for chr and blk special files\n    char NameSize[8]; // count includes terminating NUL in pathname\n    char ChkSum[8];  // 0 for \"new\" portable format; for CRC format the sum of all the bytes in the file\n    bool CheckMagic() const\n    { return memcmp(Magic, NMagic::kMagic1, 6) == 0 ||\n             memcmp(Magic, NMagic::kMagic2, 6) == 0;  };\n  };\n  */\n\n  const UInt32 kOctRecordSize = 76;\n  \n}\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioIn.cpp",
    "content": "// Archive/cpioIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CpioIn.h\"\n\n#include \"Common/StringToInt.h\"\n#include \"Windows/Defs.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\n#include \"CpioHeader.h\"\n\nnamespace NArchive {\nnamespace NCpio {\n \nHRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize)\n{\n  size_t realProcessedSize = size;\n  RINOK(ReadStream(m_Stream, data, &realProcessedSize));\n  processedSize = (UInt32)realProcessedSize;\n  m_Position += processedSize;\n  return S_OK;\n}\n\nByte CInArchive::ReadByte()\n{\n  if (_blockPos >= _blockSize)\n    throw \"Incorrect cpio archive\";\n  return _block[_blockPos++];\n}\n\nUInt16 CInArchive::ReadUInt16()\n{\n  UInt16 value = 0;\n  for (int i = 0; i < 2; i++)\n  {\n    Byte b = ReadByte();\n    value |= (UInt16(b) << (8 * i));\n  }\n  return value;\n}\n\nUInt32 CInArchive::ReadUInt32()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    Byte b = ReadByte();\n    value |= (UInt32(b) << (8 * i));\n  }\n  return value;\n}\n\nHRESULT CInArchive::Open(IInStream *inStream)\n{\n  RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));\n  m_Stream = inStream;\n  return S_OK;\n}\n\nbool CInArchive::ReadNumber(UInt32 &resultValue)\n{\n  resultValue = 0;\n  for (int i = 0; i < 8; i++)\n  {\n    char c = char(ReadByte());\n    int d;\n    if (c >= '0' && c <= '9')\n      d = c - '0';\n    else if (c >= 'A' && c <= 'F')\n      d = 10 + c - 'A';\n    else if (c >= 'a' && c <= 'f')\n      d = 10 + c - 'a';\n    else\n      return false;\n    resultValue *= 0x10;\n    resultValue += d;\n  }\n  return true;\n}\n\nstatic bool OctalToNumber(const char *s, UInt64 &res)\n{\n  const char *end;\n  res = ConvertOctStringToUInt64(s, &end);\n  return (*end == ' ' || *end == 0);\n}\n\nstatic bool OctalToNumber32(const char *s, UInt32 &res)\n{\n  UInt64 res64;\n  if (!OctalToNumber(s, res64))\n    return false;\n  res = (UInt32)res64;\n  return (res64 <= 0xFFFFFFFF);\n}\n\nbool CInArchive::ReadOctNumber(int size, UInt32 &resultValue)\n{\n  char sz[32 + 4];\n  int i;\n  for (i = 0; i < size && i < 32; i++)\n    sz[i] = (char)ReadByte();\n  sz[i] = 0;\n  return OctalToNumber32(sz, resultValue);\n}\n\n#define GetFromHex(y) { if (!ReadNumber(y)) return S_FALSE; }\n#define GetFromOct6(y) { if (!ReadOctNumber(6, y)) return S_FALSE; }\n#define GetFromOct11(y) { if (!ReadOctNumber(11, y)) return S_FALSE; }\n\nstatic unsigned short ConvertValue(unsigned short value, bool convert)\n{\n  if (!convert)\n    return value;\n  return (unsigned short)((((unsigned short)(value & 0xFF)) << 8) | (value >> 8));\n}\n\nstatic UInt32 GetAlignedSize(UInt32 size, UInt32 align)\n{\n  while ((size & (align - 1)) != 0)\n    size++;\n  return size;\n}\n\n\nHRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)\n{\n  filled = false;\n\n  UInt32 processedSize;\n  item.HeaderPosition = m_Position;\n\n  _blockSize = kMaxBlockSize;\n  RINOK(ReadBytes(_block, 2, processedSize));\n  if (processedSize != 2)\n    return S_FALSE;\n  _blockPos = 0;\n\n  UInt32 nameSize;\n\n  bool oldBE =\n    _block[0] == NFileHeader::NMagic::kMagicForRecord2[1] &&\n    _block[1] == NFileHeader::NMagic::kMagicForRecord2[0];\n\n  bool binMode = (_block[0] == NFileHeader::NMagic::kMagicForRecord2[0] &&\n    _block[1] == NFileHeader::NMagic::kMagicForRecord2[1]) ||\n    oldBE;\n\n  if (binMode)\n  {\n    RINOK(ReadBytes(_block + 2, NFileHeader::kRecord2Size - 2, processedSize));\n    if (processedSize != NFileHeader::kRecord2Size - 2)\n      return S_FALSE;\n    item.Align = 2;\n    _blockPos = 2;\n    item.DevMajor = 0;\n    item.DevMinor = ConvertValue(ReadUInt16(), oldBE);\n    item.inode = ConvertValue(ReadUInt16(), oldBE);\n    item.Mode = ConvertValue(ReadUInt16(), oldBE);\n    item.UID = ConvertValue(ReadUInt16(), oldBE);\n    item.GID = ConvertValue(ReadUInt16(), oldBE);\n    item.NumLinks = ConvertValue(ReadUInt16(), oldBE);\n    item.RDevMajor =0;\n    item.RDevMinor = ConvertValue(ReadUInt16(), oldBE);\n    UInt16 timeHigh = ConvertValue(ReadUInt16(), oldBE);\n    UInt16 timeLow = ConvertValue(ReadUInt16(), oldBE);\n    item.ModificationTime = (UInt32(timeHigh) << 16) + timeLow;\n    nameSize = ConvertValue(ReadUInt16(), oldBE);\n    UInt16 sizeHigh = ConvertValue(ReadUInt16(), oldBE);\n    UInt16 sizeLow = ConvertValue(ReadUInt16(), oldBE);\n    item.Size = (UInt32(sizeHigh) << 16) + sizeLow;\n\n    item.ChkSum = 0;\n    item.HeaderSize = GetAlignedSize(\n        nameSize + NFileHeader::kRecord2Size, item.Align);\n    nameSize = item.HeaderSize - NFileHeader::kRecord2Size;\n  }\n  else\n  {\n    RINOK(ReadBytes(_block + 2, 4, processedSize));\n    if (processedSize != 4)\n      return S_FALSE;\n\n    bool magicOK =\n        memcmp(_block, NFileHeader::NMagic::kMagic1, 6) == 0 ||\n        memcmp(_block, NFileHeader::NMagic::kMagic2, 6) == 0;\n    _blockPos = 6;\n    if (magicOK)\n    {\n      RINOK(ReadBytes(_block + 6, NFileHeader::kRecordSize - 6, processedSize));\n      if (processedSize != NFileHeader::kRecordSize - 6)\n        return S_FALSE;\n      item.Align = 4;\n\n      GetFromHex(item.inode);\n      GetFromHex(item.Mode);\n      GetFromHex(item.UID);\n      GetFromHex(item.GID);\n      GetFromHex(item.NumLinks);\n      UInt32 modificationTime;\n      GetFromHex(modificationTime);\n      item.ModificationTime = modificationTime;\n      GetFromHex(item.Size);\n      GetFromHex(item.DevMajor);\n      GetFromHex(item.DevMinor);\n      GetFromHex(item.RDevMajor);\n      GetFromHex(item.RDevMinor);\n      GetFromHex(nameSize);\n      GetFromHex(item.ChkSum);\n      item.HeaderSize = GetAlignedSize(\n          nameSize + NFileHeader::kRecordSize, item.Align);\n      nameSize = item.HeaderSize - NFileHeader::kRecordSize;\n    }\n    else\n    {\n      if (!memcmp(_block, NFileHeader::NMagic::kMagic3, 6) == 0)\n        return S_FALSE;\n      RINOK(ReadBytes(_block + 6, NFileHeader::kOctRecordSize - 6, processedSize));\n      if (processedSize != NFileHeader::kOctRecordSize - 6)\n        return S_FALSE;\n      item.Align = 1;\n      item.DevMajor = 0;\n      GetFromOct6(item.DevMinor);\n      GetFromOct6(item.inode);\n      GetFromOct6(item.Mode);\n      GetFromOct6(item.UID);\n      GetFromOct6(item.GID);\n      GetFromOct6(item.NumLinks);\n      item.RDevMajor = 0;\n      GetFromOct6(item.RDevMinor);\n      UInt32 modificationTime;\n      GetFromOct11(modificationTime);\n      item.ModificationTime = modificationTime;\n      GetFromOct6(nameSize);\n      GetFromOct11(item.Size);  // ?????\n      item.HeaderSize = GetAlignedSize(\n          nameSize + NFileHeader::kOctRecordSize, item.Align);\n      nameSize = item.HeaderSize - NFileHeader::kOctRecordSize;\n    }\n  }\n  if (nameSize == 0 || nameSize >= (1 << 27))\n    return E_FAIL;\n  RINOK(ReadBytes(item.Name.GetBuffer(nameSize), nameSize, processedSize));\n  if (processedSize != nameSize)\n    return E_FAIL;\n  item.Name.ReleaseBuffer();\n  if (strcmp(item.Name, NFileHeader::NMagic::kEndName) == 0)\n    return S_OK;\n  filled = true;\n  return S_OK;\n}\n\nHRESULT CInArchive::Skeep(UInt64 numBytes)\n{\n  UInt64 newPostion;\n  RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion));\n  m_Position += numBytes;\n  if (m_Position != newPostion)\n    return E_FAIL;\n  return S_OK;\n}\n\nHRESULT CInArchive::SkeepDataRecords(UInt64 dataSize, UInt32 align)\n{\n  while ((dataSize & (align - 1)) != 0)\n    dataSize++;\n  return Skeep(dataSize);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioIn.h",
    "content": "// CpioIn.h\n\n#ifndef __ARCHIVE_CPIO_IN_H\n#define __ARCHIVE_CPIO_IN_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/Types.h\"\n#include \"../../IStream.h\"\n#include \"CpioItem.h\"\n\nnamespace NArchive {\nnamespace NCpio {\n  \nconst UInt32 kMaxBlockSize = NFileHeader::kRecordSize;\n\nclass CInArchive\n{\n  CMyComPtr<IInStream> m_Stream;\n  UInt64 m_Position;\n\n  UInt16 _blockSize;\n  Byte _block[kMaxBlockSize];\n  UInt32 _blockPos;\n  Byte ReadByte();\n  UInt16 ReadUInt16();\n  UInt32 ReadUInt32();\n  \n  bool ReadNumber(UInt32 &resultValue);\n  bool ReadOctNumber(int size, UInt32 &resultValue);\n\n  HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize);\npublic:\n  HRESULT Open(IInStream *inStream);\n  HRESULT GetNextItem(bool &filled, CItemEx &itemInfo);\n  HRESULT Skeep(UInt64 numBytes);\n  HRESULT SkeepDataRecords(UInt64 dataSize, UInt32 align);\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioItem.h",
    "content": "// Archive/cpio/ItemInfo.h\n\n#ifndef __ARCHIVE_CPIO_ITEMINFO_H\n#define __ARCHIVE_CPIO_ITEMINFO_H\n\n#include <sys/stat.h>\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n#include \"CpioHeader.h\"\n\nnamespace NArchive {\nnamespace NCpio {\n\nstruct CItem\n{\n  AString Name;\n  UInt32 inode;\n  UInt32 Mode;\n  UInt32 UID;\n  UInt32 GID;\n  UInt32 Size;\n  UInt32 ModificationTime;\n\n  // char LinkFlag;\n  // AString LinkName; ?????\n  char Magic[8];\n  UInt32 NumLinks;\n  UInt32 DevMajor;\n  UInt32 DevMinor;\n  UInt32 RDevMajor;\n  UInt32 RDevMinor;\n  UInt32 ChkSum;\n\n  UInt32 Align;\n\n  bool IsDir() const\n#ifdef _WIN32\n    { return (Mode & _S_IFMT) == _S_IFDIR; }\n#else\n    { return (Mode & S_IFMT) == S_IFDIR; }\n#endif\n};\n\nclass CItemEx: public CItem\n{\npublic:\n  UInt64 HeaderPosition;\n  UInt32 HeaderSize;\n  UInt64 GetDataPosition() const { return HeaderPosition + HeaderSize; };\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Cpio/CpioRegister.cpp",
    "content": "// CpioRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"CpioHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NCpio::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Cpio\", L\"cpio\", 0, 0xED, { 0 }, 0, false, CreateArc, 0 };\n\nREGISTER_ARC(Cpio)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/DebHandler.cpp",
    "content": "// DebHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/NewHandler.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/StringToInt.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/CopyCoder.h\"\n\n#include \"Common/ItemNameUtils.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NDeb {\n\nnamespace NHeader\n{\n  const int kSignatureLen = 8;\n  \n  const char *kSignature  = \"!<arch>\\n\";\n\n  const int kNameSize = 16;\n  const int kTimeSize = 12;\n  const int kModeSize = 8;\n  const int kSizeSize = 10;\n\n  /*\n  struct CHeader\n  {\n    char Name[kNameSize];\n    char MTime[kTimeSize];\n    char Number0[6];\n    char Number1[6];\n    char Mode[kModeSize];\n    char Size[kSizeSize];\n    char Quote;\n    char NewLine;\n  };\n  */\n  const int kHeaderSize = kNameSize + kTimeSize + 6 + 6 + kModeSize + kSizeSize + 1 + 1;\n}\n\nclass CItem\n{\npublic:\n  AString Name;\n  UInt64 Size;\n  UInt32 MTime;\n  UInt32 Mode;\n};\n\nclass CItemEx: public CItem\n{\npublic:\n  UInt64 HeaderPosition;\n  UInt64 GetDataPosition() const { return HeaderPosition + NHeader::kHeaderSize; };\n  // UInt64 GetFullSize() const { return NFileHeader::kRecordSize + Size; };\n};\n\nclass CInArchive\n{\n  CMyComPtr<IInStream> m_Stream;\n  UInt64 m_Position;\n  \n  HRESULT GetNextItemReal(bool &filled, CItemEx &itemInfo);\n  HRESULT Skeep(UInt64 numBytes);\npublic:\n  HRESULT Open(IInStream *inStream);\n  HRESULT GetNextItem(bool &filled, CItemEx &itemInfo);\n  HRESULT SkeepData(UInt64 dataSize);\n};\n\nHRESULT CInArchive::Open(IInStream *inStream)\n{\n  RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));\n  char signature[NHeader::kSignatureLen];\n  RINOK(ReadStream_FALSE(inStream, signature, NHeader::kSignatureLen));\n  m_Position += NHeader::kSignatureLen;\n  if (memcmp(signature, NHeader::kSignature, NHeader::kSignatureLen) != 0)\n    return S_FALSE;\n  m_Stream = inStream;\n  return S_OK;\n}\n\nstatic void MyStrNCpy(char *dest, const char *src, int size)\n{\n  for (int i = 0; i < size; i++)\n  {\n    char c = src[i];\n    dest[i] = c;\n    if (c == 0)\n      break;\n  }\n}\n\nstatic bool OctalToNumber(const char *s, int size, UInt64 &res)\n{\n  char sz[32];\n  MyStrNCpy(sz, s, size);\n  sz[size] = 0;\n  const char *end;\n  int i;\n  for (i = 0; sz[i] == ' '; i++);\n  res = ConvertOctStringToUInt64(sz + i, &end);\n  return (*end == ' ' || *end == 0);\n}\n\nstatic bool OctalToNumber32(const char *s, int size, UInt32 &res)\n{\n  UInt64 res64;\n  if (!OctalToNumber(s, size, res64))\n    return false;\n  res = (UInt32)res64;\n  return (res64 <= 0xFFFFFFFF);\n}\n\nstatic bool DecimalToNumber(const char *s, int size, UInt64 &res)\n{\n  char sz[32];\n  MyStrNCpy(sz, s, size);\n  sz[size] = 0;\n  const char *end;\n  int i;\n  for (i = 0; sz[i] == ' '; i++);\n  res = ConvertStringToUInt64(sz + i, &end);\n  return (*end == ' ' || *end == 0);\n}\n\nstatic bool DecimalToNumber32(const char *s, int size, UInt32 &res)\n{\n  UInt64 res64;\n  if (!DecimalToNumber(s, size, res64))\n    return false;\n  res = (UInt32)res64;\n  return (res64 <= 0xFFFFFFFF);\n}\n\n#define RIF(x) { if (!(x)) return S_FALSE; }\n\n\nHRESULT CInArchive::GetNextItemReal(bool &filled, CItemEx &item)\n{\n  filled = false;\n\n  char header[NHeader::kHeaderSize];\n  const char *cur = header;\n\n  size_t processedSize = sizeof(header);\n  item.HeaderPosition = m_Position;\n  RINOK(ReadStream(m_Stream, header, &processedSize));\n  m_Position += processedSize;\n  if (processedSize != sizeof(header))\n    return S_OK;\n  \n  char tempString[NHeader::kNameSize + 1];\n  MyStrNCpy(tempString, cur, NHeader::kNameSize);\n  cur += NHeader::kNameSize;\n  tempString[NHeader::kNameSize] = '\\0';\n  item.Name = tempString;\n  item.Name.Trim();\n\n  for (int i = 0; i < item.Name.Length(); i++)\n    if (((Byte)item.Name[i]) < 0x20)\n      return S_FALSE;\n\n  RIF(DecimalToNumber32(cur, NHeader::kTimeSize, item.MTime));\n  cur += NHeader::kTimeSize;\n\n  cur += 6 + 6;\n  \n  RIF(OctalToNumber32(cur, NHeader::kModeSize, item.Mode));\n  cur += NHeader::kModeSize;\n\n  RIF(DecimalToNumber(cur, NHeader::kSizeSize, item.Size));\n  cur += NHeader::kSizeSize;\n\n  filled = true;\n  return S_OK;\n}\n\nHRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)\n{\n  for (;;)\n  {\n    RINOK(GetNextItemReal(filled, item));\n    if (!filled)\n      return S_OK;\n    if (item.Name.Compare(\"debian-binary\") != 0)\n      return S_OK;\n    if (item.Size != 4)\n      return S_OK;\n    SkeepData(item.Size);\n  }\n}\n\nHRESULT CInArchive::Skeep(UInt64 numBytes)\n{\n  UInt64 newPostion;\n  RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion));\n  m_Position += numBytes;\n  if (m_Position != newPostion)\n    return E_FAIL;\n  return S_OK;\n}\n\nHRESULT CInArchive::SkeepData(UInt64 dataSize)\n{\n  return Skeep((dataSize + 1) & (~((UInt64)0x1)));\n}\n\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CObjectVector<CItemEx> _items;\n  CMyComPtr<IInStream> _inStream;\n};\n\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  {\n    CInArchive archive;\n    if(archive.Open(stream) != S_OK)\n      return S_FALSE;\n    _items.Clear();\n\n    if (openArchiveCallback != NULL)\n    {\n      RINOK(openArchiveCallback->SetTotal(NULL, NULL));\n      UInt64 numFiles = _items.Size();\n      RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));\n    }\n\n    for (;;)\n    {\n      CItemEx item;\n      bool filled;\n      HRESULT result = archive.GetNextItem(filled, item);\n      if (result == S_FALSE)\n        return S_FALSE;\n      if (result != S_OK)\n        return S_FALSE;\n      if (!filled)\n        break;\n      _items.Add(item);\n      archive.SkeepData(item.Size);\n      if (openArchiveCallback != NULL)\n      {\n        UInt64 numFiles = _items.Size();\n        RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));\n      }\n    }\n    _inStream = stream;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _items.Clear();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _items.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CItemEx &item = _items[index];\n\n  switch(propID)\n  {\n    case kpidPath: prop = (const wchar_t *)NItemName::GetOSName2(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;\n    case kpidSize:\n    case kpidPackSize:\n      prop = item.Size;\n      break;\n    case kpidMTime:\n    {\n      if (item.MTime != 0)\n      {\n        FILETIME fileTime;\n        NTime::UnixTimeToFileTime(item.MTime, fileTime);\n        prop = fileTime;\n      }\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _items.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n    totalSize += _items[allFilesMode ? i : indices[i]].Size;\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n    const CItemEx &item = _items[index];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n    currentItemSize = item.Size;\n    \n    \n    \n    \n    \n    \n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n    if (testMode)\n    {\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    RINOK(_inStream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL));\n    streamSpec->Init(item.Size);\n    RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?\n        NArchive::NExtract::NOperationResult::kOK:\n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new NArchive::NDeb::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Deb\", L\"deb\", 0, 0xEC, { '!', '<', 'a', 'r', 'c', 'h', '>', '\\n'  }, 8, false, CreateArc, 0 };\n\nREGISTER_ARC(Deb)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/DllExports2.cpp",
    "content": "// DLLExports.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/MyInitGuid.h\"\n#include \"../../Common/ComTry.h\"\n#include \"../../Common/Types.h\"\n#include \"../../Windows/PropVariant.h\"\n#if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES)\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n#endif\n\n#include \"IArchive.h\"\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\n#ifndef _UNICODE\n#ifdef _WIN32\nbool g_IsNT = false;\nHINSTANCE g_hInstance;\nstatic bool IsItWindowsNT()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo))\n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);\n}\n#endif\n#endif\n\n#ifdef _WIN32\nextern \"C\"\nBOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)\n{\n  if (dwReason == DLL_PROCESS_ATTACH)\n  {\n    g_hInstance = hInstance;\n    #ifndef _UNICODE\n    #ifdef _WIN32\n    g_IsNT = IsItWindowsNT();\n    #endif\n    #endif\n  }\n  return TRUE;\n}\n#endif\n\nDEFINE_GUID(CLSID_CArchiveHandler,\n0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00);\n\nstatic const UInt16 kDecodeId = 0x2790;\n\nDEFINE_GUID(CLSID_CCodec,\n0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n\nSTDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);\nSTDAPI CreateArchiver(const GUID *classID, const GUID *iid, void **outObject);\n\nSTDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)\n{\n  // COM_TRY_BEGIN\n  *outObject = 0;\n  if (*iid == IID_ICompressCoder || *iid == IID_ICompressCoder2 || *iid == IID_ICompressFilter)\n  {\n    return CreateCoder(clsid, iid, outObject);\n  }\n  else\n  {\n    return CreateArchiver(clsid, iid, outObject);\n  }\n  // COM_TRY_END\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/DmgHandler.cpp",
    "content": "// DmgHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/Buffer.h\"\n#include \"Common/ComTry.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/MyXml.h\"\n#include \"Common/UTFConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/BZip2Decoder.h\"\n#include \"../Compress/CopyCoder.h\"\n#include \"../Compress/ZlibDecoder.h\"\n\n// #define DMG_SHOW_RAW\n\n// #include <stdio.h>\n#define PRF(x) // x\n\n#define Get32(p) GetBe32(p)\n#define Get64(p) GetBe64(p)\n\nstatic int Base64ToByte(char c)\n{\n  if (c >= 'A' && c <= 'Z') return c - 'A';\n  if (c >= 'a' && c <= 'z') return c - 'a' + 26;\n  if (c >= '0' && c <= '9') return c - '0' + 52;\n  if (c == '+') return 62;\n  if (c == '/') return 63;\n  if (c == '=') return 0;\n  return -1;\n}\n\nstatic int Base64ToBin(Byte *dest, const char *src, int srcLen)\n{\n  int srcPos = 0;\n  int destPos = 0;\n  while (srcPos < srcLen)\n  {\n    Byte buf[4];\n    int filled = 0;\n    while (srcPos < srcLen)\n    {\n      int n = Base64ToByte(src[srcPos++]);\n      if (n >= 0)\n      {\n        buf[filled++] = (Byte)n;\n        if (filled == 4)\n          break;\n      }\n    }\n    if (filled >= 2) { if (dest) dest[destPos] = (buf[0] << 2) | (buf[1] >> 4); destPos++; }\n    if (filled >= 3) { if (dest) dest[destPos] = (buf[1] << 4) | (buf[2] >> 2); destPos++; }\n    if (filled >= 4) { if (dest) dest[destPos] = (buf[2] << 6) | (buf[3]     ); destPos++; }\n  }\n  return destPos;\n}\n\nstatic UString GetSizeString(UInt64 value)\n{\n  wchar_t s[32];\n  wchar_t c;\n  if (value < (UInt64)20000) c = 0;\n  else if (value < ((UInt64)20000 << 10)) { value >>= 10; c = L'K'; }\n  else if (value < ((UInt64)20000 << 20)) { value >>= 20; c = L'M'; }\n  else                                    { value >>= 30; c = L'G'; }\n  ConvertUInt64ToString(value, s);\n  int p = MyStringLen(s);\n  s[p++] = c;\n  s[p++] = L'\\0';\n  return s;\n}\n\nnamespace NArchive {\nnamespace NDmg {\n\nstruct CBlock\n{\n  UInt32 Type;\n  UInt64 UnpPos;\n  UInt64 UnpSize;\n  UInt64 PackPos;\n  UInt64 PackSize;\n};\n\nstruct CFile\n{\n  CByteBuffer Raw;\n  // UInt64 StartPos;\n  CRecordVector<CBlock> Blocks;\n  UInt64 GetUnpackSize() const\n  {\n    UInt64 size = 0;\n    for (int i = 0; i < Blocks.Size(); i++)\n      size += Blocks[i].UnpSize;\n    return size;\n  };\n  UInt64 GetPackSize() const\n  {\n    UInt64 size = 0;\n    for (int i = 0; i < Blocks.Size(); i++)\n      size += Blocks[i].PackSize;\n    return size;\n  };\n\n  AString Name;\n};\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _inStream;\n\n  AString _xml;\n  CObjectVector<CFile> _files;\n  CRecordVector<int> _fileIndices;\n\n  HRESULT Open2(IInStream *stream);\n  HRESULT Extract(IInStream *stream);\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\nconst UInt32 kXmlSizeMax = ((UInt32)1 << 31) - (1 << 14);\n\nenum\n{\n  METHOD_ZERO_0 = 0,\n  METHOD_COPY   = 1,\n  METHOD_ZERO_2 = 2,\n  METHOD_ZLIB   = 0x80000005,\n  METHOD_BZIP2  = 0x80000006,\n  METHOD_DUMMY  = 0x7FFFFFFE,\n  METHOD_END    = 0xFFFFFFFF\n};\n\nstruct CMethodStat\n{\n  UInt32 NumBlocks;\n  UInt64 PackSize;\n  UInt64 UnpSize;\n  CMethodStat(): NumBlocks(0), PackSize(0), UnpSize(0) {}\n};\n\nstruct CMethods\n{\n  CRecordVector<CMethodStat> Stats;\n  CRecordVector<UInt32> Types;\n  void Update(const CFile &file);\n  UString GetString() const;\n};\n\nvoid CMethods::Update(const CFile &file)\n{\n  for (int i = 0; i < file.Blocks.Size(); i++)\n  {\n    const CBlock &b = file.Blocks[i];\n    int index = Types.FindInSorted(b.Type);\n    if (index < 0)\n    {\n      index = Types.AddToUniqueSorted(b.Type);\n      Stats.Insert(index, CMethodStat());\n    }\n    CMethodStat &m = Stats[index];\n    m.PackSize += b.PackSize;\n    m.UnpSize += b.UnpSize;\n    m.NumBlocks++;\n  }\n}\n\nUString CMethods::GetString() const\n{\n  UString res;\n  for (int i = 0; i < Types.Size(); i++)\n  {\n    if (i != 0)\n      res += L' ';\n    wchar_t buf[32];\n    const wchar_t *s;\n    const CMethodStat &m = Stats[i];\n    bool showPack = true;\n    UInt32 type = Types[i];\n    switch(type)\n    {\n      case METHOD_ZERO_0: s = L\"zero0\"; showPack = (m.PackSize != 0); break;\n      case METHOD_ZERO_2: s = L\"zero2\"; showPack = (m.PackSize != 0); break;\n      case METHOD_COPY:   s = L\"copy\"; showPack = (m.UnpSize != m.PackSize); break;\n      case METHOD_ZLIB:   s = L\"zlib\"; break;\n      case METHOD_BZIP2:  s = L\"bzip2\"; break;\n      default: ConvertUInt64ToString(type, buf); s = buf;\n    }\n    res += s;\n    if (m.NumBlocks != 1)\n    {\n      res += L'[';\n      ConvertUInt64ToString(m.NumBlocks, buf);\n      res += buf;\n      res += L']';\n    }\n    res += L'-';\n    res += GetSizeString(m.UnpSize);\n    if (showPack)\n    {\n      res += L'-';\n      res += GetSizeString(m.PackSize);\n    }\n  }\n  return res;\n}\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidComment, VT_BSTR},\n  { NULL, kpidMethod, VT_BSTR}\n};\n\nIMP_IInArchive_Props\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidNumBlocks, VT_UI4}\n};\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidMethod:\n    {\n      CMethods m;\n      for (int i = 0; i < _files.Size(); i++)\n        m.Update(_files[i]);\n      prop = m.GetString();\n      break;\n    }\n    case kpidNumBlocks:\n    {\n      UInt64 numBlocks = 0;\n      for (int i = 0; i < _files.Size(); i++)\n        numBlocks += _files[i].Blocks.Size();\n      prop = numBlocks;\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nIMP_IInArchive_ArcProps\n\nstatic int FindKeyPair(const CXmlItem &item, const AString &key, const AString &nextTag)\n{\n  for (int i = 0; i + 1 < item.SubItems.Size(); i++)\n  {\n    const CXmlItem &si = item.SubItems[i];\n    if (si.IsTagged(\"key\") && si.GetSubString() == key && item.SubItems[i + 1].IsTagged(nextTag))\n      return i + 1;\n  }\n  return -1;\n}\n\nstatic AString GetStringFromKeyPair(const CXmlItem &item, const AString &key, const AString &nextTag)\n{\n  int index = FindKeyPair(item, key, nextTag);\n  if (index >= 0)\n    return item.SubItems[index].GetSubString();\n  return AString();\n}\n\nHRESULT CHandler::Open2(IInStream *stream)\n{\n  const int HEADER_SIZE = 0x1E0;\n\n  UInt64 headerPos;\n  RINOK(stream->Seek(-HEADER_SIZE, STREAM_SEEK_END, &headerPos));\n  Byte buf[HEADER_SIZE];\n  RINOK(ReadStream_FALSE(stream, buf, HEADER_SIZE));\n  UInt64 address1 = Get64(buf + 0);\n  UInt64 address2 = Get64(buf + 0xB8);\n  UInt64 size64 = Get64(buf + 0xC0);\n  if (address1 != address2 || size64 >= kXmlSizeMax || size64 == 0 ||\n      address1 >= headerPos || address1 + size64 > headerPos)\n    return S_FALSE;\n  RINOK(stream->Seek(address1, STREAM_SEEK_SET, NULL));\n  size_t size = (size_t)size64;\n\n  char *ss = _xml.GetBuffer((int)size + 1);\n  RINOK(ReadStream_FALSE(stream, ss, size));\n  ss[size] = 0;\n  _xml.ReleaseBuffer();\n\n  CXml xml;\n  if (!xml.Parse(_xml))\n    return S_FALSE;\n  if (xml.Root.Name != \"plist\")\n    return S_FALSE;\n  \n  int dictIndex = xml.Root.FindSubTag(\"dict\");\n  if (dictIndex < 0)\n    return S_FALSE;\n  \n  const CXmlItem &dictItem = xml.Root.SubItems[dictIndex];\n  int rfDictIndex = FindKeyPair(dictItem, \"resource-fork\", \"dict\");\n  if (rfDictIndex < 0)\n    return S_FALSE;\n  \n  const CXmlItem &rfDictItem = dictItem.SubItems[rfDictIndex];\n  int arrIndex = FindKeyPair(rfDictItem, \"blkx\", \"array\");\n  if (arrIndex < 0)\n    return S_FALSE;\n\n  const CXmlItem &arrItem = rfDictItem.SubItems[arrIndex];\n\n  /* some DMG file has BUG:\n  PackPos for each new file is 0.\n  So we use additional \"StartPos\" to fix that BUG */\n\n  /*\n  UInt64 startPos = 0;\n  bool startPosIsDefined = false;\n  */\n\n\n  for (int i = 0; i < arrItem.SubItems.Size(); i++)\n  {\n    const CXmlItem &item = arrItem.SubItems[i];\n    if (!item.IsTagged(\"dict\"))\n      continue;\n\n    CFile file;\n    // file.StartPos = startPos;\n\n    int destLen;\n    {\n      AString dataString;\n      AString name = GetStringFromKeyPair(item, \"Name\", \"string\");\n      if (name.IsEmpty())\n        name = GetStringFromKeyPair(item, \"CFName\", \"string\");\n      file.Name = name;\n      dataString = GetStringFromKeyPair(item, \"Data\", \"data\");\n     \n      destLen = Base64ToBin(NULL, dataString, dataString.Length());\n      file.Raw.SetCapacity(destLen);\n      Base64ToBin(file.Raw, dataString, dataString.Length());\n    }\n\n    if (destLen > 0xCC && Get32(file.Raw) == 0x6D697368)\n    {\n      PRF(printf(\"\\n\\n index = %d\", _files.Size()));\n      const int kRecordSize = 40;\n      for (int offset = 0xCC; offset + kRecordSize <= destLen; offset += kRecordSize)\n      {\n        const Byte *p = (const Byte *)file.Raw + offset;\n        CBlock b;\n        b.Type = Get32(p);\n        if (b.Type == METHOD_END)\n          break;\n        if (b.Type == METHOD_DUMMY)\n          continue;\n\n        b.UnpPos   = Get64(p + 0x08) << 9;\n        b.UnpSize  = Get64(p + 0x10) << 9;\n        b.PackPos  = Get64(p + 0x18);\n        b.PackSize = Get64(p + 0x20);\n\n        /*\n        if (startPosIsdefined)\n        {\n        }\n        else\n        {\n          startPosIsdefined = true;\n          startPos = b.PackPos;\n        }\n        startPos += b.PackSize;\n        */\n\n        file.Blocks.Add(b);\n\n        PRF(printf(\"\\nType=%8x  m[1]=%8x  uPos=%8x  uSize=%7x  pPos=%8x  pSize=%7x\",\n            b.Type, Get32(p + 4), (UInt32)b.UnpPos, (UInt32)b.UnpSize, (UInt32)b.PackPos, (UInt32)b.PackSize));\n      }\n    }\n    int itemIndex = _files.Add(file);\n    if (file.Blocks.Size() > 0)\n    {\n      // if (file.Name.Find(\"HFS\") >= 0)\n        _fileIndices.Add(itemIndex);\n    }\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  {\n    Close();\n    if (Open2(stream) != S_OK)\n      return S_FALSE;\n    _inStream = stream;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _fileIndices.Clear();\n  _files.Clear();\n  _xml.Empty();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _fileIndices.Size()\n    #ifdef DMG_SHOW_RAW\n    + _files.Size() + 1;\n    #endif\n  ;\n  return S_OK;\n}\n\n#define RAW_PREFIX L\"raw\" WSTRING_PATH_SEPARATOR\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  \n  #ifdef DMG_SHOW_RAW\n  if ((int)index == _fileIndices.Size())\n  {\n    switch(propID)\n    {\n      case kpidPath:\n        prop = RAW_PREFIX L\"a.xml\";\n        break;\n      case kpidSize:\n      case kpidPackedSize:\n        prop = (UInt64)_xml.Length();\n        break;\n    }\n  }\n  else if ((int)index > _fileIndices.Size())\n  {\n    int rawIndex = (int)index - (_fileIndices.Size() + 1);\n    switch(propID)\n    {\n      case kpidPath:\n      {\n        wchar_t s[32] = RAW_PREFIX;\n        ConvertUInt64ToString(rawIndex, s + MyStringLen(s));\n        prop = s;\n        break;\n      }\n      case kpidSize:\n      case kpidPackedSize:\n        prop = (UInt64)_files[rawIndex].Raw.GetCapacity();\n        break;\n    }\n  }\n  else\n  #endif\n  {\n    int itemIndex = _fileIndices[index];\n    const CFile &item = _files[itemIndex];\n    switch(propID)\n    {\n      case kpidMethod:\n      {\n        CMethods m;\n        m.Update(item);\n        UString resString = m.GetString();\n        if (!resString.IsEmpty())\n          prop = resString;\n        break;\n      }\n      \n      // case kpidExtension: prop = L\"hfs\"; break;\n\n      case kpidPath:\n      {\n        // break;\n        UString name;\n        wchar_t s[32];\n        ConvertUInt64ToString(index, s);\n        name = s;\n        int num = 10;\n        int numDigits;\n        for (numDigits = 1; num < _fileIndices.Size(); numDigits++)\n          num *= 10;\n        while (name.Length() < numDigits)\n          name = L'0' + name;\n\n        AString subName;\n        int pos1 = item.Name.Find('(');\n        if (pos1 >= 0)\n        {\n          pos1++;\n          int pos2 = item.Name.Find(')', pos1);\n          if (pos2 >= 0)\n          {\n            subName = item.Name.Mid(pos1, pos2 - pos1);\n            pos1 = subName.Find(':');\n            if (pos1 >= 0)\n              subName = subName.Left(pos1);\n          }\n        }\n        subName.Trim();\n        if (!subName.IsEmpty())\n        {\n          if (subName == \"Apple_HFS\")\n            subName = \"hfs\";\n          else if (subName == \"Apple_HFSX\")\n            subName = \"hfsx\";\n          else if (subName == \"Apple_Free\")\n            subName = \"free\";\n          else if (subName == \"DDM\")\n            subName = \"ddm\";\n          UString name2;\n          ConvertUTF8ToUnicode(subName, name2);\n          name += L'.';\n          name += name2;\n        }\n        else\n        {\n          UString name2;\n          ConvertUTF8ToUnicode(item.Name, name2);\n          if (!name2.IsEmpty())\n            name += L\" - \";\n          name += name2;\n        }\n        prop = name;\n        break;\n      }\n      case kpidComment:\n      {\n        UString name;\n        ConvertUTF8ToUnicode(item.Name, name);\n        prop = name;\n        break;\n      }\n\n      case kpidSize:  prop = item.GetUnpackSize(); break;\n      case kpidPackSize:  prop = item.GetPackSize(); break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _files.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n  {\n    int index = (int)(allFilesMode ? i : indices[i]);\n    #ifdef DMG_SHOW_RAW\n    if (index == _fileIndices.Size())\n      totalSize += _xml.Length();\n    else if (index > _fileIndices.Size())\n      totalSize += _files[index - (_fileIndices.Size() + 1)].Raw.GetCapacity();\n    else\n    #endif\n      totalSize += _files[_fileIndices[index]].GetUnpackSize();\n  }\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentPackTotal = 0;\n  UInt64 currentUnpTotal = 0;\n  UInt64 currentPackSize = 0;\n  UInt64 currentUnpSize = 0;\n\n  const UInt32 kZeroBufSize = (1 << 14);\n  CByteBuffer zeroBuf;\n  zeroBuf.SetCapacity(kZeroBufSize);\n  memset(zeroBuf, 0, kZeroBufSize);\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  NCompress::NBZip2::CDecoder *bzip2CoderSpec = new NCompress::NBZip2::CDecoder();\n  CMyComPtr<ICompressCoder> bzip2Coder = bzip2CoderSpec;\n\n  NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();\n  CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  for (i = 0; i < numItems; i++, currentPackTotal += currentPackSize, currentUnpTotal += currentUnpSize)\n  {\n    lps->InSize = currentPackTotal;\n    lps->OutSize = currentUnpTotal;\n    currentPackSize = 0;\n    currentUnpSize = 0;\n    RINOK(lps->SetCur());\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n    // const CItemEx &item = _files[index];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n    \n    \n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n\n    CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;\n    CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n    outStreamSpec->SetStream(realOutStream);\n    \n    realOutStream.Release();\n\n    Int32 opRes = NArchive::NExtract::NOperationResult::kOK;\n    #ifdef DMG_SHOW_RAW\n    if (index > _fileIndices.Size())\n    {\n      const CByteBuffer &buf = _files[index - (_fileIndices.Size() + 1)].Raw;\n      outStreamSpec->Init(buf.GetCapacity());\n      RINOK(WriteStream(outStream, buf, buf.GetCapacity()));\n      currentPackSize = currentUnpSize = buf.GetCapacity();\n    }\n    else if (index == _fileIndices.Size())\n    {\n      outStreamSpec->Init(_xml.Length());\n      RINOK(WriteStream(outStream, (const char *)_xml, _xml.Length()));\n      currentPackSize = currentUnpSize = _xml.Length();\n    }\n    else\n    #endif\n    {\n      const CFile &item = _files[_fileIndices[index]];\n      currentPackSize = item.GetPackSize();\n      currentUnpSize = item.GetUnpackSize();\n\n      UInt64 unpPos = 0;\n      UInt64 packPos = 0;\n      {\n        for (int j = 0; j < item.Blocks.Size(); j++)\n        {\n          lps->InSize = currentPackTotal + packPos;\n          lps->OutSize = currentUnpTotal + unpPos;\n          RINOK(lps->SetCur());\n\n          const CBlock &block = item.Blocks[j];\n\n          packPos += block.PackSize;\n          if (block.UnpPos != unpPos)\n          {\n            opRes = NArchive::NExtract::NOperationResult::kDataError;\n            break;\n          }\n\n          RINOK(_inStream->Seek(block.PackPos, STREAM_SEEK_SET, NULL));\n          streamSpec->Init(block.PackSize);\n          // UInt64 startSize = outStreamSpec->GetSize();\n          bool realMethod = true;\n          outStreamSpec->Init(block.UnpSize);\n          HRESULT res = S_OK;\n\n          switch(block.Type)\n          {\n            case METHOD_ZERO_0:\n            case METHOD_ZERO_2:\n              realMethod = false;\n              if (block.PackSize != 0)\n                opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n              break;\n\n            case METHOD_COPY:\n              if (block.UnpSize != block.PackSize)\n              {\n                opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n                break;\n              }\n              res = copyCoder->Code(inStream, outStream, NULL, NULL, progress);\n              break;\n            \n            case METHOD_ZLIB:\n            {\n              res = zlibCoder->Code(inStream, outStream, NULL, NULL, progress);\n              if (res != S_OK)\n                break;\n              break;\n            }\n\n            case METHOD_BZIP2:\n            {\n              res = bzip2Coder->Code(inStream, outStream, NULL, NULL, progress);\n              if (res == S_OK)\n                if (streamSpec->GetSize() != block.PackSize)\n                  opRes = NArchive::NExtract::NOperationResult::kDataError;\n              break;\n            }\n            \n            default:\n              opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n              break;\n          }\n          if (res != S_OK)\n          {\n            if (res != S_FALSE)\n              return res;\n            if (opRes == NArchive::NExtract::NOperationResult::kOK)\n              opRes = NArchive::NExtract::NOperationResult::kDataError;\n          }\n          unpPos += block.UnpSize;\n          if (!outStreamSpec->IsFinishedOK())\n          {\n            if (realMethod && opRes == NArchive::NExtract::NOperationResult::kOK)\n              opRes = NArchive::NExtract::NOperationResult::kDataError;\n\n            while (outStreamSpec->GetRem() != 0)\n            {\n              UInt64 rem = outStreamSpec->GetRem();\n              UInt32 size = (UInt32)MyMin(rem, (UInt64)kZeroBufSize);\n              RINOK(WriteStream(outStream, zeroBuf, size));\n            }\n          }\n        }\n      }\n    }\n    outStream.Release();\n    RINOK(extractCallback->SetOperationResult(opRes));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new CHandler; }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Dmg\", L\"dmg\", 0, 0xE4, { 0 }, 0, false, CreateArc, 0 };\n\nREGISTER_ARC(Dmg)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/ElfHandler.cpp",
    "content": "// ElfHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/Buffer.h\"\n#include \"Common/ComTry.h\"\n#include \"Common/IntToString.h\"\n\n#include \"Windows/PropVariantUtils.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/CopyCoder.h\"\n\n#include \"Common/DummyOutStream.h\"\n\nstatic UInt16 Get16(const Byte *p, int be) { if (be) return GetBe16(p); return GetUi16(p); }\nstatic UInt32 Get32(const Byte *p, int be) { if (be) return GetBe32(p); return GetUi32(p); }\nstatic UInt64 Get64(const Byte *p, int be) { if (be) return GetBe64(p); return GetUi64(p); }\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NElf {\n\n#define\tELF_CLASS_32\t1\n#define\tELF_CLASS_64\t2\n\n#define\tELF_DATA_2LSB\t1\n#define\tELF_DATA_2MSB\t2\n\n#define NUM_SCAN_SECTIONS_MAX (1 << 6)\n\nstruct CHeader\n{\n  bool Mode64;\n  bool Be;\n  Byte Os;\n  Byte AbiVer;\n\n  UInt16 Type;\n  UInt16 Machine;\n  // UInt32 Version;\n\n  // UInt64 EntryVa;\n  UInt64 ProgOffset;\n  UInt64 SectOffset;\n  UInt32 Flags;\n  UInt16 ElfHeaderSize;\n  UInt16 SegmentEntrySize;\n  UInt16 NumSegments;\n  UInt16 SectEntrySize;\n  UInt16 NumSections;\n  // UInt16 SectNameStringTableIndex;\n\n  bool Parse(const Byte *buf);\n\n  bool CheckSegmentEntrySize() const\n  {\n    return (Mode64 && SegmentEntrySize == 0x38) || (!Mode64 && SegmentEntrySize == 0x20);\n  };\n\n  UInt64 GetHeadersSize() const\n    { return ElfHeaderSize +\n      (UInt64)SegmentEntrySize * NumSegments +\n      (UInt64)SectEntrySize * NumSections; }\n    \n};\n\nbool CHeader::Parse(const Byte *p)\n{\n  switch(p[4])\n  {\n    case ELF_CLASS_32: Mode64 = false; break;\n    case ELF_CLASS_64: Mode64 = true; break;\n    default: return false;\n  }\n  bool be;\n  switch(p[5])\n  {\n    case ELF_DATA_2LSB: be = false; break;\n    case ELF_DATA_2MSB: be = true; break;\n    default: return false;\n  }\n  Be = be;\n  if (p[6] != 1) // Version\n    return false;\n  Os = p[7];\n  AbiVer = p[8];\n  for (int i = 9; i < 16; i++)\n    if (p[i] != 0)\n      return false;\n\n  Type = Get16(p + 0x10, be);\n  Machine = Get16(p + 0x12, be);\n  if (Get32(p + 0x14, be) != 1) // Version\n    return false;\n\n  if (Mode64)\n  {\n    // EntryVa = Get64(p + 0x18, be);\n    ProgOffset = Get64(p + 0x20, be);\n    SectOffset = Get64(p + 0x28, be);\n    p += 0x30;\n  }\n  else\n  {\n    // EntryVa = Get32(p + 0x18, be);\n    ProgOffset = Get32(p + 0x1C, be);\n    SectOffset = Get32(p + 0x20, be);\n    p += 0x24;\n  }\n\n  Flags = Get32(p + 0, be);\n  ElfHeaderSize = Get16(p + 4, be);\n  SegmentEntrySize = Get16(p + 6, be);\n  NumSegments = Get16(p + 8, be);\n  SectEntrySize = Get16(p + 10, be);\n  NumSections = Get16(p + 12, be);\n  // SectNameStringTableIndex = Get16(p + 14, be);\n  return CheckSegmentEntrySize();\n}\n\nstruct CSegment\n{\n  UInt32 Type;\n  UInt32 Flags;\n  UInt64 Offset;\n  UInt64 Va;\n  // UInt64 Pa;\n  UInt64 PSize;\n  UInt64 VSize;\n  // UInt64 Align;\n\n  void UpdateTotalSize(UInt64 &totalSize)\n  {\n    UInt64 t = Offset + PSize;\n    if (t > totalSize)\n      totalSize = t;\n  }\n  void Parse(const Byte *p, bool mode64, bool be);\n};\n\nvoid CSegment::Parse(const Byte *p, bool mode64, bool be)\n{\n  Type = Get32(p, be);\n  if (mode64)\n  {\n    Flags = Get32(p + 4, be);\n    Offset = Get64(p + 8, be);\n    Va = Get64(p + 0x10, be);\n    // Pa = Get64(p + 0x18, be);\n    PSize = Get64(p + 0x20, be);\n    VSize = Get64(p + 0x28, be);\n    // Align = Get64(p + 0x30, be);\n  }\n  else\n  {\n    Offset = Get32(p + 4, be);\n    Va = Get32(p + 8, be);\n    // Pa = Get32(p + 12, be);\n    PSize = Get32(p + 16, be);\n    VSize = Get32(p + 20, be);\n    Flags = Get32(p + 24, be);\n    // Align = Get32(p + 28, be);\n  }\n}\n\nstatic const CUInt32PCharPair g_MachinePairs[] =\n{\n  { 0, \"None\" },\n  { 1, \"AT&T WE 32100\" },\n  { 2, \"SPARC\" },\n  { 3, \"Intel 386\" },\n  { 4, \"Motorola 68000\" },\n  { 5, \"Motorola 88000\" },\n  { 6, \"Intel 486\" },\n  { 7, \"Intel i860\" },\n  { 8, \"MIPS\" },\n  { 9, \"IBM S/370\" },\n  { 10, \"MIPS RS3000 LE\" },\n  { 11, \"RS6000\" },\n\n  { 15, \"PA-RISC\" },\n  { 16, \"nCUBE\" },\n  { 17, \"Fujitsu VPP500\" },\n  { 18, \"SPARC 32+\" },\n  { 19, \"Intel i960\" },\n  { 20, \"PowerPC\" },\n  { 21, \"PowerPC 64-bit\" },\n  { 22, \"IBM S/390\" },\n\n  { 36, \"NEX v800\" },\n  { 37, \"Fujitsu FR20\" },\n  { 38, \"TRW RH-32\" },\n  { 39, \"Motorola RCE\" },\n  { 40, \"ARM\" },\n  { 41, \"Alpha\" },\n  { 42, \"Hitachi SH\" },\n  { 43, \"SPARC-V9\" },\n  { 44, \"Siemens Tricore\" },\n  { 45, \"ARC\" },\n  { 46, \"H8/300\" },\n  { 47, \"H8/300H\" },\n  { 48, \"H8S\" },\n  { 49, \"H8/500\" },\n  { 50, \"IA-64\" },\n  { 51, \"Stanford MIPS-X\" },\n  { 52, \"Motorola ColdFire\" },\n  { 53, \"M68HC12\" },\n  { 54, \"Fujitsu MMA\" },\n  { 55, \"Siemens PCP\" },\n  { 56, \"Sony nCPU\" },\n  { 57, \"Denso NDR1\" },\n  { 58, \"Motorola StarCore\" },\n  { 59, \"Toyota ME16\" },\n  { 60, \"ST100\" },\n  { 61, \"Advanced Logic TinyJ\" },\n  { 62, \"AMD64\" },\n  { 63, \"Sony DSP\" },\n\n  { 66, \"Siemens FX66\" },\n  { 67, \"ST9+\" },\n  { 68, \"ST7\" },\n  { 69, \"MC68HC16\" },\n  { 70, \"MC68HC11\" },\n  { 71, \"MC68HC08\" },\n  { 72, \"MC68HC05\" },\n  { 73, \"Silicon Graphics SVx\" },\n  { 74, \"ST19\" },\n  { 75, \"Digital VAX\" },\n  { 76, \"Axis CRIS\" },\n  { 77, \"Infineon JAVELIN\" },\n  { 78, \"Element 14 FirePath\" },\n  { 79, \"LSI ZSP\" },\n  { 80, \"MMIX\" },\n  { 81, \"HUANY\" },\n  { 82, \"SiTera Prism\" },\n  { 83, \"Atmel AVR\" },\n  { 84, \"Fujitsu FR30\" },\n  { 85, \"Mitsubishi D10V\" },\n  { 86, \"Mitsubishi D30V\" },\n  { 87, \"NEC v850\" },\n  { 88, \"Mitsubishi M32R\" },\n  { 89, \"Matsushita MN10300\" },\n  { 90, \"Matsushita MN10200\" },\n  { 91, \"picoJava\" },\n  { 92, \"OpenRISC\" },\n  { 93, \"ARC Tangent-A5\" },\n  { 94, \"Tensilica Xtensa\" },\n  { 0x9026, \"Alpha\" }\n};\n\nstatic const CUInt32PCharPair g_AbiOS[] =\n{\n  { 0, \"None\" },\n  { 1, \"HP-UX\" },\n  { 2, \"NetBSD\" },\n  { 3, \"Linux\" },\n\n  { 6, \"Solaris\" },\n  { 7, \"AIX\" },\n  { 8, \"IRIX\" },\n  { 9, \"FreeBSD\" },\n  { 10, \"TRU64\" },\n  { 11, \"Novell Modesto\" },\n  { 12, \"OpenBSD\" },\n  { 13, \"OpenVMS\" },\n  { 14, \"HP NSK\" },\n  { 15, \"AROS\" },\n  { 97, \"ARM\" },\n  { 255, \"Standalone\" }\n};\n\nstatic const CUInt32PCharPair g_SegmentFlags[] =\n{\n  { 1 << 0, \"Execute\" },\n  { 1 << 1, \"Write\" },\n  { 1 << 2, \"Read\" }\n};\n\nstatic const char *g_Types[] =\n{\n  \"None\",\n  \"Relocatable file\",\n  \"Executable file\",\n  \"Shared object file\",\n  \"Core file\"\n};\n\nstatic const char *g_SegnmentTypes[] =\n{\n  \"Unused\",\n  \"Loadable segment\",\n  \"Dynamic linking tables\",\n  \"Program interpreter path name\",\n  \"Note section\",\n  \"SHLIB\",\n  \"Program header table\",\n  \"TLS\"\n};\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _inStream;\n  CObjectVector<CSegment> _sections;\n  UInt32 _peOffset;\n  CHeader _header;\n  UInt64 _totalSize;\n  HRESULT Open2(IInStream *stream);\n  bool Parse(const Byte *buf, UInt32 size);\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\n#define\tELF_PT_PHDR 6\n\nbool CHandler::Parse(const Byte *buf, UInt32 size)\n{\n  if (size < 64)\n    return false;\n  if (!_header.Parse(buf))\n    return false;\n  if (_header.ProgOffset > size ||\n      _header.ProgOffset + (UInt64)_header.SegmentEntrySize * _header.NumSegments > size ||\n      _header.NumSegments > NUM_SCAN_SECTIONS_MAX)\n    return false;\n  const Byte *p = buf + _header.ProgOffset;\n  _totalSize = _header.ProgOffset;\n  \n  for (int i = 0; i < _header.NumSegments; i++, p += _header.SegmentEntrySize)\n  {\n    CSegment sect;\n    sect.Parse(p, _header.Mode64, _header.Be);\n    sect.UpdateTotalSize(_totalSize);\n    if (sect.Type != ELF_PT_PHDR)\n      _sections.Add(sect);\n  }\n  UInt64 total2 = _header.SectOffset + (UInt64)_header.SectEntrySize * _header.NumSections;\n  if (total2 > _totalSize)\n    _totalSize = total2;\n  return true;\n}\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidCpu, VT_BSTR},\n  { NULL, kpidBit64, VT_BOOL},\n  { NULL, kpidBigEndian, VT_BOOL},\n  { NULL, kpidHostOS, VT_BSTR},\n  { NULL, kpidCharacts, VT_BSTR},\n  { NULL, kpidPhySize, VT_UI8},\n  { NULL, kpidHeadersSize, VT_UI8}\n };\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidType, VT_BSTR},\n  { NULL, kpidCharacts, VT_BSTR},\n  { NULL, kpidOffset, VT_UI8},\n  { NULL, kpidVa, VT_UI8}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidPhySize:  prop = _totalSize; break;\n    case kpidHeadersSize:  prop = _header.GetHeadersSize(); break;\n    case kpidBit64:  if (_header.Mode64) prop = _header.Mode64; break;\n    case kpidBigEndian:  if (_header.Be) prop = _header.Be; break;\n    case kpidCpu:  PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break;\n    case kpidHostOS:  PAIR_TO_PROP(g_AbiOS, _header.Os, prop); break;\n    case kpidCharacts:  TYPE_TO_PROP(g_Types, _header.Type, prop); break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  const CSegment &item = _sections[index];\n  switch(propID)\n  {\n    case kpidPath:\n    {\n      wchar_t sz[32];\n      ConvertUInt64ToString(index, sz);\n      prop = sz;\n      break;\n    }\n    case kpidSize:  prop = (UInt64)item.VSize; break;\n    case kpidPackSize:  prop = (UInt64)item.PSize; break;\n    case kpidOffset:  prop = item.Offset; break;\n    case kpidVa:  prop = item.Va; break;\n    case kpidType:  TYPE_TO_PROP(g_SegnmentTypes, item.Type, prop); break;\n    case kpidCharacts:  FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nHRESULT CHandler::Open2(IInStream *stream)\n{\n  const UInt32 kBufSize = 1 << 18;\n  const UInt32 kSigSize = 4;\n\n  CByteBuffer buffer;\n  buffer.SetCapacity(kBufSize);\n  Byte *buf = buffer;\n\n  size_t processed = kSigSize;\n  RINOK(ReadStream_FALSE(stream, buf, processed));\n  if (buf[0] != 0x7F || buf[1] != 'E' || buf[2] != 'L' || buf[3] != 'F')\n    return S_FALSE;\n  processed = kBufSize - kSigSize;\n  RINOK(ReadStream(stream, buf + kSigSize, &processed));\n  processed += kSigSize;\n  if (!Parse(buf, (UInt32)processed))\n    return S_FALSE;\n  UInt64 fileSize;\n  RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));\n  return (fileSize == _totalSize) ? S_OK : S_FALSE;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  Close();\n  RINOK(Open2(inStream));\n  _inStream = inStream;\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _sections.Clear();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _sections.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _sections.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n    totalSize += _sections[allFilesMode ? i : indices[i]].PSize;\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    UInt32 index = allFilesMode ? i : indices[i];\n    const CSegment &item = _sections[index];\n    currentItemSize = item.PSize;\n    {\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      if (!testMode && (!realOutStream))\n        continue;\n      outStreamSpec->SetStream(realOutStream);\n      outStreamSpec->Init();\n    }\n      \n    RINOK(extractCallback->PrepareOperation(askMode));\n    RINOK(_inStream->Seek(item.Offset, STREAM_SEEK_SET, NULL));\n    streamSpec->Init(currentItemSize);\n    RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));\n    outStreamSpec->ReleaseStream();\n    RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == currentItemSize ?\n        NArchive::NExtract::NOperationResult::kOK:\n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new CHandler; }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"ELF\", L\"\", 0, 0xDE, { 0 }, 0, false, CreateArc, 0 };\n\nREGISTER_ARC(Elf)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipHandler.cpp",
    "content": "// GZipHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"GZipHandler.h\"\n\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/ComTry.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../ICoder.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/CreateCoder.h\"\n#include \"../Common/OutStreamWithCRC.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NGZip {\n\nstatic const CMethodId kMethodId_Deflate = 0x040108;\n\nconst wchar_t *kHostOS[] =\n{\n  L\"FAT\",\n  L\"AMIGA\",\n  L\"VMS\",\n  L\"Unix\",\n  L\"VM_CMS\",\n  L\"Atari\",  // what if it's a minix filesystem? [cjh]\n  L\"HPFS\",  // filesystem used by OS/2 (and NT 3.x)\n  L\"Mac\",\n  L\"Z_System\",\n  L\"CPM\",\n  L\"TOPS20\", // pkzip 2.50 NTFS\n  L\"NTFS\", // filesystem used by Windows NT\n  L\"QDOS \", // SMS/QDOS\n  L\"Acorn\", // Archimedes Acorn RISC OS\n  L\"VFAT\", // filesystem used by Windows 95, NT\n  L\"MVS\",\n  L\"BeOS\", // hybrid POSIX/database filesystem\n                        // BeBOX or PowerMac\n  L\"Tandem\",\n  L\"THEOS\"\n};\n\nstatic const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);\n\nstatic const wchar_t *kUnknownOS = L\"Unknown\";\n\n/*\nenum // PropID\n{\n  kpidExtraIsPresent = kpidUserDefined,\n  kpidExtraFlags,\n  kpidIsText\n};\n*/\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  // { NULL, kpidMethod, VT_UI1},\n  { NULL, kpidHostOS, VT_BSTR},\n  { NULL, kpidCRC, VT_UI4}\n  // { L\"Extra\", kpidExtraIsPresent, VT_BOOL}\n  // { L\"Extra flags\", kpidExtraFlags, VT_UI1},\n  // { L\"Is Text\", kpidIsText, VT_BOOL},\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = 1;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID,  PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidPath:\n      if (m_Item.NameIsPresent())\n        prop = MultiByteToUnicodeString(m_Item.Name, CP_ACP);\n      break;\n    case kpidMTime:\n    {\n      FILETIME utcTime;\n      if (m_Item.Time != 0)\n      {\n        NTime::UnixTimeToFileTime((UInt32)m_Item.Time, utcTime);\n        prop = utcTime;\n      }\n      else\n      {\n        // utcTime.dwLowDateTime = utcTime.dwHighDateTime = 0;\n        // prop = utcTime;\n      }\n      break;\n    }\n    case kpidSize:  prop = UInt64(m_Item.UnPackSize32); break;\n    case kpidPackSize:  prop = m_PackSize; break;\n    case kpidCommented:  prop = m_Item.CommentIsPresent(); break;\n    case kpidHostOS:\n      prop = (m_Item.HostOS < kNumHostOSes) ?\n          kHostOS[m_Item.HostOS] : kUnknownOS;\n      break;\n    case kpidMethod:  prop = m_Item.CompressionMethod; break;\n    case kpidCRC:  prop = m_Item.FileCRC; break;\n    /*\n    case kpidExtraFlags:  prop = m_Item.ExtraFlags; break;\n    case kpidIsText:  prop = m_Item.IsText(); break;\n    case kpidExtraIsPresent:  prop = m_Item.ExtraFieldIsPresent(); break;\n    */\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  try\n  {\n    CInArchive archive;\n    RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition));\n    RINOK(archive.ReadHeader(inStream, m_Item));\n    m_DataOffset = archive.GetOffset();\n    UInt64 newPosition;\n    RINOK(inStream->Seek(-8, STREAM_SEEK_END, &newPosition));\n    m_PackSize = newPosition - (m_StreamStartPosition + m_DataOffset);\n    if (archive.ReadPostHeader(inStream, m_Item) != S_OK)\n      return S_FALSE;\n    m_Stream = inStream;\n  }\n  catch(...)\n  {\n    return S_FALSE;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  m_Stream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (!allFilesMode)\n  {\n    if (numItems == 0)\n      return S_OK;\n    if (numItems != 1)\n      return E_INVALIDARG;\n    if (indices[0] != 0)\n      return E_INVALIDARG;\n  }\n\n  bool testMode = (_aTestMode != 0);\n\n  extractCallback->SetTotal(m_PackSize);\n\n  UInt64 currentTotalPacked = 0;\n  \n  RINOK(extractCallback->SetCompleted(&currentTotalPacked));\n  CMyComPtr<ISequentialOutStream> realOutStream;\n  Int32 askMode;\n  askMode = testMode ? NArchive::NExtract::NAskMode::kTest :\n      NArchive::NExtract::NAskMode::kExtract;\n  \n  RINOK(extractCallback->GetStream(0, &realOutStream, askMode));\n  \n  if(!testMode && !realOutStream)\n    return S_OK;\n\n  extractCallback->PrepareOperation(askMode);\n\n  COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n  outStreamSpec->SetStream(realOutStream);\n  outStreamSpec->Init();\n  realOutStream.Release();\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, true);\n\n  CMyComPtr<ICompressCoder> deflateDecoder;\n  bool firstItem = true;\n  RINOK(m_Stream->Seek(m_StreamStartPosition, STREAM_SEEK_SET, NULL));\n  Int32 opRes;\n  for (;;)\n  {\n    lps->InSize = currentTotalPacked;\n    lps->OutSize = outStreamSpec->GetSize();\n\n    CInArchive archive;\n    CItem item;\n    HRESULT result = archive.ReadHeader(m_Stream, item);\n    if (result != S_OK)\n    {\n      if (firstItem)\n        return E_FAIL;\n      opRes = NArchive::NExtract::NOperationResult::kOK;\n      break;\n    }\n    firstItem = false;\n\n    UInt64 dataStartPos;\n    RINOK(m_Stream->Seek(0, STREAM_SEEK_CUR, &dataStartPos));\n\n    outStreamSpec->InitCRC();\n\n    if (item.CompressionMethod != NFileHeader::NCompressionMethod::kDeflate)\n    {\n      opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n      break;\n    }\n\n    if (!deflateDecoder)\n    {\n      RINOK(CreateCoder(\n          EXTERNAL_CODECS_VARS\n          kMethodId_Deflate, deflateDecoder, false));\n      if (!deflateDecoder)\n      {\n        opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n        break;\n      }\n    }\n    result = deflateDecoder->Code(m_Stream, outStream, NULL, NULL, progress);\n    if (result != S_OK)\n    {\n      if (result != S_FALSE)\n        return result;\n      opRes = NArchive::NExtract::NOperationResult::kDataError;\n      break;\n    }\n\n    CMyComPtr<ICompressGetInStreamProcessedSize> getInStreamProcessedSize;\n    RINOK(deflateDecoder.QueryInterface(IID_ICompressGetInStreamProcessedSize,\n        &getInStreamProcessedSize));\n    UInt64 packSize;\n    RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(&packSize));\n    UInt64 pos;\n    RINOK(m_Stream->Seek(dataStartPos + packSize, STREAM_SEEK_SET, &pos));\n\n    currentTotalPacked = pos - m_StreamStartPosition;\n    \n    CItem postItem;\n    if (archive.ReadPostHeader(m_Stream, postItem) != S_OK)\n      return E_FAIL;\n    if((outStreamSpec->GetCRC() != postItem.FileCRC))\n    {\n      opRes = NArchive::NExtract::NOperationResult::kCRCError;\n      break;\n    }\n  }\n  outStream.Release();\n  return extractCallback->SetOperationResult(opRes);\n  COM_TRY_END\n}\n\nIMPL_ISetCompressCodecsInfo\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipHandler.h",
    "content": "// GZip/Handler.h\n\n#ifndef __GZIP_HANDLER_H\n#define __GZIP_HANDLER_H\n\n#include \"Common/MyCom.h\"\n\n#include \"../IArchive.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\n#include \"GZipIn.h\"\n#include \"GZipUpdate.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nclass CHandler:\n  public IInArchive,\n  public IOutArchive,\n  public ISetProperties,\n  PUBLIC_ISetCompressCodecsInfo\n  public CMyUnknownImp\n{\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IInArchive)\n  MY_QUERYINTERFACE_ENTRY(IOutArchive)\n  MY_QUERYINTERFACE_ENTRY(ISetProperties)\n  QUERY_ENTRY_ISetCompressCodecsInfo\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  INTERFACE_IInArchive(;)\n  INTERFACE_IOutArchive(;)\n\n  STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties);\n\n  DECL_ISetCompressCodecsInfo\n\n  CHandler() { InitMethodProperties(); }\n\nprivate:\n  NArchive::NGZip::CItem m_Item;\n  UInt64 m_StreamStartPosition;\n  UInt64 m_DataOffset;\n  UInt64 m_PackSize;\n  CMyComPtr<IInStream> m_Stream;\n  CCompressionMethodMode m_Method;\n  UInt32 m_Level;\n\n  DECL_EXTERNAL_CODECS_VARS\n\n  void InitMethodProperties()\n  {\n    m_Method.NumMatchFinderCyclesDefined = false;\n    m_Level = m_Method.NumPasses = m_Method.NumFastBytes =\n        m_Method.NumMatchFinderCycles = m_Method.Algo = 0xFFFFFFFF;\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipHandlerOut.cpp",
    "content": "// GZipHandlerOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/StringToInt.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/ParseProperties.h\"\n\n#include \"GZipHandler.h\"\n#include \"GZipUpdate.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NGZip {\n\nstatic const UInt32 kAlgoX1 = 0;\nstatic const UInt32 kAlgoX5 = 1;\n\nstatic const UInt32 kNumPassesX1  = 1;\nstatic const UInt32 kNumPassesX7  = 3;\nstatic const UInt32 kNumPassesX9  = 10;\n\nstatic const UInt32 kNumFastBytesX1 = 32;\nstatic const UInt32 kNumFastBytesX7 = 64;\nstatic const UInt32 kNumFastBytesX9 = 128;\n\n\nSTDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)\n{\n  *timeType = NFileTimeType::kUnix;\n  return S_OK;\n}\n\nstatic HRESULT CopyStreams(ISequentialInStream *inStream, ISequentialOutStream *outStream)\n{\n  CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;\n  return copyCoder->Code(inStream, outStream, NULL, NULL, NULL);\n}\n\nSTDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,\n    IArchiveUpdateCallback *updateCallback)\n{\n  if (numItems != 1)\n    return E_INVALIDARG;\n\n  UInt64 size;\n  Int32 newData;\n  Int32 newProperties;\n  UInt32 indexInArchive;\n  UInt32 itemIndex = 0;\n  if (!updateCallback)\n    return E_FAIL;\n  RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProperties, &indexInArchive));\n\n  CItem newItem = m_Item;\n  newItem.ExtraFlags = 0;\n  newItem.Flags = 0;\n  if (IntToBool(newProperties))\n  {\n    FILETIME utcTime;\n    UString name;\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(itemIndex, kpidMTime, &prop));\n      if (prop.vt != VT_FILETIME)\n        return E_INVALIDARG;\n      utcTime = prop.filetime;\n    }\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(itemIndex, kpidPath, &prop));\n      if (prop.vt == VT_EMPTY)\n        name.Empty();\n      else if (prop.vt != VT_BSTR)\n        return E_INVALIDARG;\n      else\n        name = prop.bstrVal;\n    }\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(itemIndex, kpidIsDir, &prop));\n      if (prop.vt == VT_BOOL)\n      {\n        if (prop.boolVal != VARIANT_FALSE)\n          return E_INVALIDARG;\n      }\n      else if (prop.vt != VT_EMPTY)\n        return E_INVALIDARG;\n    }\n    if(!FileTimeToUnixTime(utcTime, newItem.Time))\n      return E_INVALIDARG;\n    newItem.Name = UnicodeStringToMultiByte(name, CP_ACP);\n    int dirDelimiterPos = newItem.Name.ReverseFind(CHAR_PATH_SEPARATOR);\n    if (dirDelimiterPos >= 0)\n      newItem.Name = newItem.Name.Mid(dirDelimiterPos + 1);\n    \n    newItem.SetNameIsPresentFlag(!newItem.Name.IsEmpty());\n  }\n\n  if (IntToBool(newData))\n  {\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(itemIndex, kpidSize, &prop));\n      if (prop.vt != VT_UI8)\n        return E_INVALIDARG;\n      size = prop.uhVal.QuadPart;\n    }\n    newItem.UnPackSize32 = (UInt32)size;\n\n    UInt32 level = m_Level;\n    if (level == 0xFFFFFFFF)\n      level = 5;\n    if (m_Method.NumPasses == 0xFFFFFFFF)\n      m_Method.NumPasses = (level >= 9 ? kNumPassesX9 :\n                           (level >= 7 ? kNumPassesX7 :\n                                         kNumPassesX1));\n    if (m_Method.NumFastBytes == 0xFFFFFFFF)\n      m_Method.NumFastBytes = (level >= 9 ? kNumFastBytesX9 :\n                              (level >= 7 ? kNumFastBytesX7 :\n                                            kNumFastBytesX1));\n    if (m_Method.Algo == 0xFFFFFFFF)\n      m_Method.Algo =\n                    (level >= 5 ? kAlgoX5 :\n                                  kAlgoX1);\n\n    return UpdateArchive(\n        EXTERNAL_CODECS_VARS\n        m_Stream, size, outStream, newItem, m_Method, itemIndex, updateCallback);\n  }\n    \n  if (indexInArchive != 0)\n    return E_INVALIDARG;\n\n  if (IntToBool(newProperties))\n  {\n    COutArchive outArchive;\n    outArchive.Create(outStream);\n    outArchive.WriteHeader(newItem);\n    RINOK(m_Stream->Seek(m_StreamStartPosition + m_DataOffset, STREAM_SEEK_SET, NULL));\n  }\n  else\n  {\n    RINOK(m_Stream->Seek(m_StreamStartPosition, STREAM_SEEK_SET, NULL));\n  }\n  return CopyStreams(m_Stream, outStream);\n}\n\nSTDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)\n{\n  InitMethodProperties();\n  for (int i = 0; i < numProperties; i++)\n  {\n    UString name = names[i];\n    name.MakeUpper();\n    const PROPVARIANT &prop = values[i];\n    if (name[0] == L'X')\n    {\n      UInt32 level = 9;\n      RINOK(ParsePropValue(name.Mid(1), prop, level));\n      m_Level = level;\n    }\n    else if (name.Left(4) == L\"PASS\")\n    {\n      UInt32 num = kNumPassesX9;\n      RINOK(ParsePropValue(name.Mid(4), prop, num));\n      m_Method.NumPasses = num;\n    }\n    else if (name.Left(2) == L\"FB\")\n    {\n      UInt32 num = kNumFastBytesX9;\n      RINOK(ParsePropValue(name.Mid(2), prop, num));\n      m_Method.NumFastBytes = num;\n    }\n    else if (name.Left(2) == L\"MC\")\n    {\n      UInt32 num = 0xFFFFFFFF;\n      RINOK(ParsePropValue(name.Mid(2), prop, num));\n      m_Method.NumMatchFinderCycles = num;\n      m_Method.NumMatchFinderCyclesDefined = true;\n    }\n    else if (name.Left(1) == L\"A\")\n    {\n      UInt32 num = kAlgoX5;\n      RINOK(ParsePropValue(name.Mid(1), prop, num));\n      m_Method.Algo = num;\n    }\n    else\n      return E_INVALIDARG;\n  }\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipHeader.cpp",
    "content": "// Archive/GZip/Header.h\n\n#include \"StdAfx.h\"\n\n#include \"GZipHeader.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nextern UInt16 kSignature = 0x8B1F + 1;\n\nstatic class CMarkersInitializer\n{\npublic:\n  CMarkersInitializer()\n    { kSignature--; }\n} g_MarkerInitializer;\n\n}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipHeader.h",
    "content": "// Archive/GZip/Header.h\n\n#ifndef __ARCHIVE_GZIP_HEADER_H\n#define __ARCHIVE_GZIP_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nextern UInt16 kSignature;\nstatic const UInt32 kSignatureSize = 2;\n\nnamespace NFileHeader\n{\n  /*\n  struct CBlock\n  {\n    UInt16 Id;\n    Byte CompressionMethod;\n    Byte Flags;\n    UInt32 Time;\n    Byte ExtraFlags;\n    Byte HostOS;\n  };\n  */\n  \n  namespace NFlags\n  {\n    const int kDataIsText = 1 << 0;\n    const int kHeaderCRCIsPresent = 1 << 1;\n    const int kExtraIsPresent = 1 << 2;\n    const int kNameIsPresent = 1 << 3;\n    const int kComentIsPresent = 1 << 4;\n  }\n  \n  namespace NExtraFlags\n  {\n    enum EEnum\n    {\n      kMaximum = 2,\n      kFastest = 4\n    };\n  }\n  \n  namespace NCompressionMethod\n  {\n    const Byte kDeflate = 8;\n  }\n\n  namespace NHostOS\n  {\n    enum EEnum\n    {\n      kFAT      = 0,  // filesystem used by MS-DOS, OS/2, Win32\n        // pkzip 2.50 (FAT / VFAT / FAT32 file systems)\n        kAMIGA    = 1,\n        kVMS      = 2,  // VAX/VMS\n        kUnix     = 3,\n        kVM_CMS   = 4,\n        kAtari    = 5,  // what if it's a minix filesystem? [cjh]\n        kHPFS     = 6,  // filesystem used by OS/2 (and NT 3.x)\n        kMac      = 7,\n        kZ_System = 8,\n        kCPM      = 9,\n        kTOPS20   = 10, // pkzip 2.50 NTFS\n        kNTFS     = 11, // filesystem used by Windows NT\n        kQDOS     = 12, // SMS/QDOS\n        kAcorn    = 13, // Archimedes Acorn RISC OS\n        kVFAT     = 14, // filesystem used by Windows 95, NT\n        kMVS      = 15,\n        kBeOS     = 16, // hybrid POSIX/database filesystem\n                        // BeBOX or PowerMac\n        kTandem   = 17,\n        kTHEOS    = 18,\n\n        kUnknown = 255\n    };\n    const int kNumHostSystems = 19;\n  }\n}\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipIn.cpp",
    "content": "// Archive/GZipIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"GZipIn.h\"\n\n#include \"Common/Defs.h\"\n#include \"Common/MyCom.h\"\n#include \"Windows/Defs.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/7zCrc.h\"\n}\n\nnamespace NArchive {\nnamespace NGZip {\n \nHRESULT CInArchive::ReadBytes(ISequentialInStream *inStream, void *data, UInt32 size)\n{\n  RINOK(ReadStream_FALSE(inStream, data, size));\n  m_Position += size;\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadByte(ISequentialInStream *inStream, Byte &value, UInt32 &crc)\n{\n  RINOK(ReadBytes(inStream, &value, 1));\n  crc = CRC_UPDATE_BYTE(crc, value);\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadUInt16(ISequentialInStream *inStream, UInt16 &value, UInt32 &crc)\n{\n  value = 0;\n  for (int i = 0; i < 2; i++)\n  {\n    Byte b;\n    RINOK(ReadByte(inStream, b, crc));\n    value |= (UInt16(b) << (8 * i));\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadUInt32(ISequentialInStream *inStream, UInt32 &value, UInt32 &crc)\n{\n  value = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    Byte b;\n    RINOK(ReadByte(inStream, b, crc));\n    value |= (UInt32(b) << (8 * i));\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadZeroTerminatedString(ISequentialInStream *inStream, AString &resString, UInt32 &crc)\n{\n  resString.Empty();\n  for (;;)\n  {\n    Byte c;\n    RINOK(ReadByte(inStream, c, crc));\n    if (c == 0)\n      return S_OK;\n    resString += char(c);\n  }\n}\n\nHRESULT CInArchive::ReadHeader(ISequentialInStream *inStream, CItem &item)\n{\n  item.Clear();\n  m_Position = 0;\n\n  UInt16 signature;\n  UInt32 crc = CRC_INIT_VAL;;\n  RINOK(ReadUInt16(inStream, signature, crc));\n  if (signature != kSignature)\n    return S_FALSE;\n  \n  RINOK(ReadByte(inStream, item.CompressionMethod, crc));\n  RINOK(ReadByte(inStream, item.Flags, crc));\n  RINOK(ReadUInt32(inStream, item.Time, crc));\n  RINOK(ReadByte(inStream, item.ExtraFlags, crc));\n  RINOK(ReadByte(inStream, item.HostOS, crc));\n  \n  if (item.ExtraFieldIsPresent())\n  {\n    UInt16 extraSize;\n    RINOK(ReadUInt16(inStream, extraSize, crc));\n    item.Extra.SetCapacity(extraSize);\n    RINOK(ReadBytes(inStream, item.Extra, extraSize));\n    crc = CrcUpdate(crc, item.Extra, extraSize);\n  }\n  if (item.NameIsPresent())\n    RINOK(ReadZeroTerminatedString(inStream, item.Name, crc));\n  if (item.CommentIsPresent())\n    RINOK(ReadZeroTerminatedString(inStream, item.Comment, crc));\n  if (item.HeaderCRCIsPresent())\n  {\n    UInt16 headerCRC;\n    UInt32 dummy = 0;\n    RINOK(ReadUInt16(inStream, headerCRC, dummy));\n    if ((UInt16)CRC_GET_DIGEST(crc) != headerCRC)\n      return S_FALSE;\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadPostHeader(ISequentialInStream *inStream, CItem &item)\n{\n  UInt32 dummy = 0;\n  RINOK(ReadUInt32(inStream, item.FileCRC, dummy));\n  return ReadUInt32(inStream, item.UnPackSize32, dummy);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipIn.h",
    "content": "// Archive/GZipIn.h\n\n#ifndef __ARCHIVE_GZIP_IN_H\n#define __ARCHIVE_GZIP_IN_H\n\n#include \"GZipHeader.h\"\n#include \"GZipItem.h\"\n#include \"../../IStream.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n  \nclass CInArchive\n{\n  UInt64 m_Position;\n  \n  HRESULT ReadBytes(ISequentialInStream *inStream, void *data, UInt32 size);\n  HRESULT ReadZeroTerminatedString(ISequentialInStream *inStream, AString &resString, UInt32 &crc);\n  HRESULT ReadByte(ISequentialInStream *inStream, Byte &value, UInt32 &crc);\n  HRESULT ReadUInt16(ISequentialInStream *inStream, UInt16 &value, UInt32 &crc);\n  HRESULT ReadUInt32(ISequentialInStream *inStream, UInt32 &value, UInt32 &crc);\npublic:\n  HRESULT ReadHeader(ISequentialInStream *inStream, CItem &item);\n  HRESULT ReadPostHeader(ISequentialInStream *inStream, CItem &item);\n  UInt64 GetOffset() const { return m_Position; }\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipItem.h",
    "content": "// Archive/GZipItem.h\n\n#ifndef __ARCHIVE_GZIP_ITEM_H\n#define __ARCHIVE_GZIP_ITEM_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nclass CItem\n{\nprivate:\n  bool TestFlag(Byte flag) const { return ((Flags & flag) != 0); }\npublic:\n  Byte CompressionMethod;\n  Byte Flags;\n  UInt32 Time;\n  Byte ExtraFlags;\n  Byte HostOS;\n  UInt32 FileCRC;\n  UInt32 UnPackSize32;\n\n  AString Name;\n  AString Comment;\n  CByteBuffer Extra;\n\n  bool IsText() const\n    {  return TestFlag(NFileHeader::NFlags::kDataIsText); }\n  bool HeaderCRCIsPresent() const\n    {  return TestFlag(NFileHeader::NFlags::kHeaderCRCIsPresent); }\n  bool ExtraFieldIsPresent() const\n    {  return TestFlag(NFileHeader::NFlags::kExtraIsPresent); }\n  bool NameIsPresent() const\n    {  return TestFlag(NFileHeader::NFlags::kNameIsPresent); }\n  bool CommentIsPresent() const\n    {  return TestFlag(NFileHeader::NFlags::kComentIsPresent); }\n\n  void SetNameIsPresentFlag(bool nameIsPresent)\n  {\n    if (nameIsPresent)\n      Flags |= NFileHeader::NFlags::kNameIsPresent;\n    else\n      Flags &= (~NFileHeader::NFlags::kNameIsPresent);\n  }\n\n  void Clear()\n  {\n    Name.Empty();\n    Comment.Empty();;\n    Extra.SetCapacity(0);\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipOut.cpp",
    "content": "// Archive/GZipOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"GZipOut.h\"\n\n#include \"Windows/Defs.h\"\n#include \"../../Common/StreamUtils.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nHRESULT COutArchive::WriteBytes(const void *buffer, UInt32 size)\n{\n  return WriteStream(m_Stream, buffer, size);\n}\n\nHRESULT COutArchive::WriteByte(Byte value)\n{\n  return WriteBytes(&value, 1);\n}\n\nHRESULT COutArchive::WriteUInt16(UInt16 value)\n{\n  for (int i = 0; i < 2; i++)\n  {\n    RINOK(WriteByte((Byte)value));\n    value >>= 8;\n  }\n  return S_OK;\n}\n\nHRESULT COutArchive::WriteUInt32(UInt32 value)\n{\n  for (int i = 0; i < 4; i++)\n  {\n    RINOK(WriteByte((Byte)value));\n    value >>= 8;\n  }\n  return S_OK;\n}\n\nHRESULT COutArchive::WriteHeader(const CItem &item)\n{\n  RINOK(WriteUInt16(kSignature));\n  RINOK(WriteByte(item.CompressionMethod));\n  RINOK(WriteByte((Byte)(item.Flags & NFileHeader::NFlags::kNameIsPresent)));\n  RINOK(WriteUInt32(item.Time));\n  RINOK(WriteByte(item.ExtraFlags));\n  RINOK(WriteByte(item.HostOS));\n  if (item.NameIsPresent())\n  {\n    RINOK(WriteBytes((const char *)item.Name, item.Name.Length()));\n    RINOK(WriteByte(0));\n  }\n  return S_OK;\n}\n\nHRESULT COutArchive::WritePostHeader(const CItem &item)\n{\n  RINOK(WriteUInt32(item.FileCRC));\n  return WriteUInt32(item.UnPackSize32);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipOut.h",
    "content": "// Archive/GZipOut.h\n\n#ifndef __ARCHIVE_GZIP_OUT_H\n#define __ARCHIVE_GZIP_OUT_H\n\n#include \"Common/MyCom.h\"\n#include \"GZipHeader.h\"\n#include \"GZipItem.h\"\n#include \"../../IStream.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nclass COutArchive\n{\n  CMyComPtr<ISequentialOutStream> m_Stream;\n  HRESULT WriteBytes(const void *buffer, UInt32 size);\n  HRESULT WriteByte(Byte value);\n  HRESULT WriteUInt16(UInt16 value);\n  HRESULT WriteUInt32(UInt32 value);\npublic:\n  void Create(ISequentialOutStream *outStream) {  m_Stream = outStream; }\n  HRESULT WriteHeader(const CItem &item);\n  HRESULT WritePostHeader(const CItem &item);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipRegister.cpp",
    "content": "// GZipRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"GZipHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NGZip::CHandler;  }\n#ifndef EXTRACT_ONLY\nstatic IOutArchive *CreateArcOut() { return new NArchive::NGZip::CHandler;  }\n#else\n#define CreateArcOut 0\n#endif\n\nstatic CArcInfo g_ArcInfo =\n  { L\"GZip\", L\"gz gzip tgz tpz\", L\"* * .tar .tar\", 0xEF, { 0x1F, 0x8B, 8 }, 3, true, CreateArc, CreateArcOut };\n\nREGISTER_ARC(GZip)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipUpdate.cpp",
    "content": "// GZipUpdate.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"../../ICoder.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/InStreamWithCRC.h\"\n\n#include \"GZipUpdate.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nstatic const CMethodId kMethodId_Deflate = 0x040108;\n\nstatic const Byte kHostOS =\n  #ifdef _WIN32\n  NFileHeader::NHostOS::kFAT;\n  #else\n  NFileHeader::NHostOS::kUnix;\n  #endif\n\nHRESULT UpdateArchive(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream * /* inStream */,\n    UInt64 unpackSize,\n    ISequentialOutStream *outStream,\n    const CItem &newItem,\n    const CCompressionMethodMode &compressionMethod,\n    int indexInClient,\n    IArchiveUpdateCallback *updateCallback)\n{\n  UInt64 complexity = unpackSize;\n\n  RINOK(updateCallback->SetTotal(complexity));\n\n  CMyComPtr<ICompressCoder> deflateEncoder;\n  \n  complexity = 0;\n  RINOK(updateCallback->SetCompleted(&complexity));\n\n  CMyComPtr<ISequentialInStream> fileInStream;\n\n  RINOK(updateCallback->GetStream(indexInClient, &fileInStream));\n\n  CSequentialInStreamWithCRC *inStreamSpec = new CSequentialInStreamWithCRC;\n  CMyComPtr<ISequentialInStream> crcStream(inStreamSpec);\n  inStreamSpec->SetStream(fileInStream);\n  inStreamSpec->Init();\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(updateCallback, true);\n  \n  COutArchive outArchive;\n  outArchive.Create(outStream);\n\n  CItem item = newItem;\n  item.CompressionMethod = NFileHeader::NCompressionMethod::kDeflate;\n  item.ExtraFlags = 0;\n  item.HostOS = kHostOS;\n\n  RINOK(outArchive.WriteHeader(item));\n\n  {\n    RINOK(CreateCoder(\n        EXTERNAL_CODECS_LOC_VARS\n        kMethodId_Deflate, deflateEncoder, true));\n    if (!deflateEncoder)\n      return E_NOTIMPL;\n\n    NWindows::NCOM::CPropVariant properties[] =\n    {\n      compressionMethod.Algo,\n      compressionMethod.NumPasses,\n      compressionMethod.NumFastBytes,\n      compressionMethod.NumMatchFinderCycles\n    };\n    PROPID propIDs[] =\n    {\n      NCoderPropID::kAlgorithm,\n      NCoderPropID::kNumPasses,\n      NCoderPropID::kNumFastBytes,\n      NCoderPropID::kMatchFinderCycles\n    };\n    int numProps = sizeof(propIDs) / sizeof(propIDs[0]);\n    if (!compressionMethod.NumMatchFinderCyclesDefined)\n      numProps--;\n    CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n    RINOK(deflateEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties));\n    RINOK(setCoderProperties->SetCoderProperties(propIDs, properties, numProps));\n  }\n  RINOK(deflateEncoder->Code(crcStream, outStream, NULL, NULL, progress));\n\n  item.FileCRC = inStreamSpec->GetCRC();\n  item.UnPackSize32 = (UInt32)inStreamSpec->GetSize();\n  RINOK(outArchive.WritePostHeader(item));\n  return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/GZip/GZipUpdate.h",
    "content": "// GZip/Update.h\n\n#ifndef __GZIP_UPDATE_H\n#define __GZIP_UPDATE_H\n\n#include \"../IArchive.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\n#include \"GZipOut.h\"\n#include \"GZipItem.h\"\n\nnamespace NArchive {\nnamespace NGZip {\n\nstruct CCompressionMethodMode\n{\n  UInt32 NumPasses;\n  UInt32 NumFastBytes;\n  UInt32 Algo;\n  bool NumMatchFinderCyclesDefined;\n  UInt32 NumMatchFinderCycles;\n};\n\nHRESULT UpdateArchive(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream *inStream,\n    UInt64 unpackSize,\n    ISequentialOutStream *outStream,\n    const CItem &newItem,\n    const CCompressionMethodMode &compressionMethod,\n    int indexInClient,\n    IArchiveUpdateCallback *updateCallback);\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Hfs/HfsHandler.cpp",
    "content": "// HfsHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Windows/PropVariant.h\"\n#include \"../../Common/StreamUtils.h\"\n#include \"HfsHandler.h\"\n\nnamespace NArchive {\nnamespace NHfs {\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME}\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidClusterSize, VT_UI4},\n  { NULL, kpidFreeSpace, VT_UI8},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidMTime, VT_FILETIME}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nstatic void HfsTimeToProp(UInt32 hfsTime, NWindows::NCOM::CPropVariant &prop)\n{\n  FILETIME ft;\n  HfsTimeToFileTime(hfsTime, ft);\n  prop = ft;\n}\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidMethod: prop = _db.Header.IsHfsX() ? L\"HFSX\" : L\"HFS+\"; break;\n    case kpidClusterSize: prop = (UInt32)1 << _db.Header.BlockSizeLog; break;\n    case kpidFreeSpace: prop = (UInt64)_db.Header.NumFreeBlocks << _db.Header.BlockSizeLog; break;\n    case kpidMTime: HfsTimeToProp(_db.Header.MTime, prop); break;\n    case kpidCTime:\n    {\n      FILETIME localFt, ft;\n      HfsTimeToFileTime(_db.Header.CTime, localFt);\n      if (LocalFileTimeToFileTime(&localFt, &ft))\n        prop = ft;\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CItem &item = _db.Items[index];\n  switch(propID)\n  {\n    case kpidPath: prop = _db.GetItemPath(index); break;\n    case kpidIsDir: prop = item.IsDir(); break;\n\n    case kpidCTime:  HfsTimeToProp(item.CTime, prop); break;\n    case kpidMTime:  HfsTimeToProp(item.MTime, prop); break;\n    case kpidATime:  HfsTimeToProp(item.ATime, prop); break;\n\n    case kpidPackSize: if (!item.IsDir()) prop = (UInt64)item.NumBlocks << _db.Header.BlockSizeLog; break;\n    case kpidSize:     if (!item.IsDir()) prop = item.Size; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nclass CProgressImp: public CProgressVirt\n{\n  CMyComPtr<IArchiveOpenCallback> _callback;\npublic:\n  HRESULT SetTotal(UInt64 numFiles);\n  HRESULT SetCompleted(UInt64 numFiles);\n  CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {}\n};\n\nHRESULT CProgressImp::SetTotal(UInt64 numFiles)\n{\n  if (_callback)\n    return _callback->SetTotal(&numFiles, NULL);\n  return S_OK;\n}\n\nHRESULT CProgressImp::SetCompleted(UInt64 numFiles)\n{\n  if (_callback)\n    return _callback->SetCompleted(&numFiles, NULL);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback *callback)\n{\n  COM_TRY_BEGIN\n  Close();\n  try\n  {\n    CProgressImp progressImp(callback);\n    HRESULT res = _db.Open(inStream, &progressImp);\n    if (res == E_ABORT)\n      return res;\n    if (res != S_OK)\n      return S_FALSE;\n    _stream = inStream;\n  }\n  catch(...) { return S_FALSE; }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _stream.Release();\n  _db.Clear();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _db.Items.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt32 i;\n  UInt64 totalSize = 0;\n  for (i = 0; i < numItems; i++)\n  {\n    const CItem &item = _db.Items[allFilesMode ? i : indices[i]];\n    if (!item.IsDir())\n      totalSize += item.Size;\n  }\n  RINOK(extractCallback->SetTotal(totalSize));\n\n  UInt64 currentTotalSize = 0, currentItemSize = 0;\n  \n  CByteBuffer buf;\n  const UInt32 kBufSize = (1 << 16);\n  buf.SetCapacity(kBufSize);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    RINOK(extractCallback->SetCompleted(&currentTotalSize));\n    Int32 index = allFilesMode ? i : indices[i];\n    const CItem &item = _db.Items[index];\n    currentItemSize = 0;\n    if (!item.IsDir())\n      currentItemSize = item.Size;\n\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    if (item.IsDir())\n    {\n      RINOK(extractCallback->PrepareOperation(askMode));\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n    UInt64 pos = 0;\n    int res = NArchive::NExtract::NOperationResult::kOK;\n    int i;\n    for (i = 0; i < item.Extents.Size(); i++)\n    {\n      if (item.Size == pos)\n        break;\n      if (res != NArchive::NExtract::NOperationResult::kOK)\n        break;\n      const CExtent &e = item.Extents[i];\n      RINOK(_stream->Seek((UInt64)e.Pos << _db.Header.BlockSizeLog, STREAM_SEEK_SET, NULL));\n      UInt64 extentSize = (UInt64)e.NumBlocks << _db.Header.BlockSizeLog;\n      for (;;)\n      {\n        if (extentSize == 0)\n          break;\n        UInt64 rem = item.Size - pos;\n        if (rem == 0)\n        {\n          if (extentSize >= (UInt64)((UInt32)1 << _db.Header.BlockSizeLog))\n            res = NArchive::NExtract::NOperationResult::kDataError;\n          break;\n        }\n        UInt32 curSize = kBufSize;\n        if (curSize > rem)\n          curSize = (UInt32)rem;\n        if (curSize > extentSize)\n          curSize = (UInt32)extentSize;\n        RINOK(ReadStream_FALSE(_stream, buf, curSize));\n        if (realOutStream)\n        {\n          RINOK(WriteStream(realOutStream, buf, curSize));\n        }\n        pos += curSize;\n        extentSize -= curSize;\n        UInt64 processed = currentTotalSize + pos;\n        RINOK(extractCallback->SetCompleted(&processed));\n      }\n    }\n    if (i != item.Extents.Size() || item.Size != pos)\n      res = NArchive::NExtract::NOperationResult::kDataError;\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult(res));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _db.Items.Size();\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Hfs/HfsHandler.h",
    "content": "// HfsHandler.h\n\n#ifndef __ARCHIVE_HFS_HANDLER_H\n#define __ARCHIVE_HFS_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n#include \"HfsIn.h\"\n\nnamespace NArchive {\nnamespace NHfs {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _stream;\n  CDatabase _db;\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Hfs/HfsIn.cpp",
    "content": "// HfsIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/StreamUtils.h\"\n#include \"Common/IntToString.h\"\n\n#include \"HfsIn.h\"\n\n#include \"../../../../C/CpuArch.h\"\n\n#define Get16(p) GetBe16(p)\n#define Get32(p) GetBe32(p)\n#define Get64(p) GetBe64(p)\n\nnamespace NArchive {\nnamespace NHfs {\n\n#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }\n\nstatic int CompareIdToIndex(const CIdIndexPair *p1, const CIdIndexPair *p2, void * /* param */)\n{\n  RINOZ(MyCompare(p1->ID, p2->ID));\n  return MyCompare(p1->Index, p2->Index);\n}\n\nbool operator< (const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID  < a2.ID); }\nbool operator> (const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID  > a2.ID); }\nbool operator==(const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID == a2.ID); }\nbool operator!=(const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID != a2.ID); }\n\nstatic UString GetSpecName(const UString &name, UInt32 /* id */)\n{\n  UString name2 = name;\n  name2.Trim();\n  if (name2.IsEmpty())\n  {\n    /*\n    wchar_t s[32];\n    ConvertUInt64ToString(id, s);\n    return L\"[\" + (UString)s + L\"]\";\n    */\n    return L\"[]\";\n  }\n  return name;\n}\n\nUString CDatabase::GetItemPath(int index) const\n{\n  const CItem *item = &Items[index];\n  UString name = GetSpecName(item->Name, item->ID);\n\n  for (int i = 0; i < 1000; i++)\n  {\n    if (item->ParentID < 16 && item->ParentID != 2)\n    {\n      if (item->ParentID != 1)\n        break;\n      return name;\n    }\n    CIdIndexPair pair;\n    pair.ID = item->ParentID;\n    pair.Index = 0;\n    int indexInMap = IdToIndexMap.FindInSorted(pair);\n    if (indexInMap < 0)\n      break;\n    item = &Items[IdToIndexMap[indexInMap].Index];\n    name = GetSpecName(item->Name, item->ID) + WCHAR_PATH_SEPARATOR + name;\n  }\n  return (UString)L\"Unknown\" + WCHAR_PATH_SEPARATOR + name;\n}\n\nvoid CFork::Parse(const Byte *p)\n{\n  Size = Get64(p);\n  // ClumpSize = Get32(p + 8);\n  NumBlocks = Get32(p + 0xC);\n  for (int i = 0; i < 8; i++)\n  {\n    CExtent &e = Extents[i];\n    e.Pos = Get32(p + 0x10 + i * 8);\n    e.NumBlocks = Get32(p + 0x10 + i * 8 + 4);\n  }\n}\n\nstatic HRESULT ReadExtent(int blockSizeLog, IInStream *inStream, Byte *buf, const CExtent &e)\n{\n  RINOK(inStream->Seek((UInt64)e.Pos << blockSizeLog, STREAM_SEEK_SET, NULL));\n  return ReadStream_FALSE(inStream, buf, (size_t)e.NumBlocks << blockSizeLog);\n}\n\nHRESULT CDatabase::ReadFile(const CFork &fork, CByteBuffer &buf, IInStream *inStream)\n{\n  if (fork.NumBlocks >= Header.NumBlocks)\n    return S_FALSE;\n  size_t totalSize = (size_t)fork.NumBlocks << Header.BlockSizeLog;\n  if ((totalSize >> Header.BlockSizeLog) != fork.NumBlocks)\n    return S_FALSE;\n  buf.SetCapacity(totalSize);\n  UInt32 curBlock = 0;\n  for (int i = 0; i < 8; i++)\n  {\n    if (curBlock >= fork.NumBlocks)\n      break;\n    const CExtent &e = fork.Extents[i];\n    if (fork.NumBlocks - curBlock < e.NumBlocks || e.Pos >= Header.NumBlocks)\n      return S_FALSE;\n    RINOK(ReadExtent(Header.BlockSizeLog, inStream,\n        (Byte *)buf + ((size_t)curBlock << Header.BlockSizeLog), e));\n    curBlock += e.NumBlocks;\n  }\n  return S_OK;\n}\n\nstruct CNodeDescriptor\n{\n  UInt32 fLink;\n  UInt32 bLink;\n  Byte Kind;\n  Byte Height;\n  UInt16 NumRecords;\n  // UInt16 Reserved;\n  void Parse(const Byte *p);\n};\n\nvoid CNodeDescriptor::Parse(const Byte *p)\n{\n  fLink = Get32(p);\n  bLink = Get32(p + 4);\n  Kind = p[8];\n  Height = p[9];\n  NumRecords = Get16(p + 10);\n}\n\nstruct CHeaderRec\n{\n  // UInt16 TreeDepth;\n  // UInt32 RootNode;\n  // UInt32 LeafRecords;\n  UInt32 FirstLeafNode;\n  // UInt32 LastLeafNode;\n  int NodeSizeLog;\n  // UInt16 MaxKeyLength;\n  UInt32 TotalNodes;\n  // UInt32 FreeNodes;\n  // UInt16 Reserved1;\n  // UInt32 ClumpSize;\n  // Byte BtreeType;\n  // Byte KeyCompareType;\n  // UInt32 Attributes;\n  // UInt32 Reserved3[16];\n  \n  HRESULT Parse(const Byte *p);\n};\n\nHRESULT CHeaderRec::Parse(const Byte *p)\n{\n  // TreeDepth = Get16(p);\n  // RootNode = Get32(p + 2);\n  // LeafRecords = Get32(p + 6);\n  FirstLeafNode = Get32(p + 0xA);\n  // LastLeafNode = Get32(p + 0xE);\n  UInt32 nodeSize = Get16(p + 0x12);\n\n  int i;\n  for (i = 9; ((UInt32)1 << i) != nodeSize; i++)\n    if (i == 16)\n      return S_FALSE;\n  NodeSizeLog = i;\n\n  // MaxKeyLength = Get16(p + 0x14);\n  TotalNodes = Get32(p + 0x16);\n  // FreeNodes = Get32(p + 0x1A);\n  // Reserved1 = Get16(p + 0x1E);\n  // ClumpSize = Get32(p + 0x20);\n  // BtreeType = p[0x24];\n  // KeyCompareType = p[0x25];\n  // Attributes = Get32(p + 0x26);\n  /*\n  for (int i = 0; i < 16; i++)\n    Reserved3[i] = Get32(p + 0x2A + i * 4);\n  */\n  return S_OK;\n}\n\n\nenum ENodeType\n{\n  NODE_TYPE_LEAF = 0xFF,\n  NODE_TYPE_INDEX = 0,\n  NODE_TYPE_HEADER = 1,\n  NODE_TYPE_MODE = 2\n};\n\nHRESULT CDatabase::LoadExtentFile(IInStream *inStream)\n{\n  // FileExtents.Clear();\n  // ResExtents.Clear();\n\n  CByteBuffer extents;\n  RINOK(ReadFile(Header.ExtentsFile, extents, inStream));\n\n  const Byte *p = (const Byte *)extents;\n\n  // CNodeDescriptor nodeDesc;\n  // nodeDesc.Parse(p);\n  CHeaderRec hr;\n  RINOK(hr.Parse(p + 14));\n\n  UInt32 node = hr.FirstLeafNode;\n  if (node != 0)\n    return S_FALSE;\n  /*\n  while (node != 0)\n  {\n    size_t nodeOffset = node * hr.NodeSize;\n    if ((node + 1)* hr.NodeSize > CatalogBuf.GetCapacity())\n      return S_FALSE;\n    CNodeDescriptor desc;\n    desc.Parse(p + nodeOffset);\n    if (desc.Kind != NODE_TYPE_LEAF)\n      return S_FALSE;\n    UInt32 ptr = hr.NodeSize;\n    for (int i = 0; i < desc.NumRecords; i++)\n    {\n      UInt32 offs = Get16(p + nodeOffset + hr.NodeSize - (i + 1) * 2);\n      UInt32 offsNext = Get16(p + nodeOffset + hr.NodeSize - (i + 2) * 2);\n\n      const Byte *r = p + nodeOffset + offs;\n      int keyLength = Get16(r);\n      Byte forkType = r[2];\n      UInt32 id = Get16(r + 4);\n      UInt32 startBlock = Get16(r + 4);\n      CObjectVector<CIdExtents> *extents = (forkType == 0) ? &FileExtents : &ResExtents;\n      if (extents->Size() == 0)\n        extents->Add(CIdExtents());\n      else\n      {\n        CIdExtents &e = extents->Back();\n        if (e.ID != id)\n        {\n          if (e.ID > id)\n            return S_FALSE;\n          extents->Add(CIdExtents());\n        }\n      }\n      CIdExtents &e = extents->Back();\n      for (UInt32 k = offs + 10 + 2; k + 8 <= offsNext; k += 8)\n      {\n        CExtent ee;\n        ee.Pos = Get32(p + nodeOffset + k);\n        ee.NumBlocks  = Get32(p + nodeOffset + k * 4);\n        e.Extents.Add(ee);\n      }\n    }\n    node = desc.fLink;\n  }\n  */\n  return S_OK;\n}\n\n\nHRESULT CDatabase::LoadCatalog(IInStream *inStream, CProgressVirt *progress)\n{\n  Items.Clear();\n  IdToIndexMap.ClearAndFree();\n\n  CByteBuffer catalogBuf;\n  RINOK(ReadFile(Header.CatalogFile, catalogBuf, inStream));\n  const Byte *p = (const Byte *)catalogBuf;\n\n  // CNodeDescriptor nodeDesc;\n  // nodeDesc.Parse(p);\n  CHeaderRec hr;\n  hr.Parse(p + 14);\n  \n  // CaseSensetive = (Header.IsHfsX() && hr.KeyCompareType == 0xBC);\n\n  if ((catalogBuf.GetCapacity() >> hr.NodeSizeLog) < hr.TotalNodes)\n    return S_FALSE;\n\n  CByteBuffer usedBuf;\n  usedBuf.SetCapacity(hr.TotalNodes);\n  for (UInt32 i = 0; i < hr.TotalNodes; i++)\n    usedBuf[i] = 0;\n\n  UInt32 node = hr.FirstLeafNode;\n  while (node != 0)\n  {\n    if (node >= hr.TotalNodes)\n      return S_FALSE;\n    if (usedBuf[node])\n      return S_FALSE;\n    usedBuf[node] = 1;\n    size_t nodeOffset = (size_t)node << hr.NodeSizeLog;\n    CNodeDescriptor desc;\n    desc.Parse(p + nodeOffset);\n    if (desc.Kind != NODE_TYPE_LEAF)\n      return S_FALSE;\n    for (int i = 0; i < desc.NumRecords; i++)\n    {\n      UInt32 nodeSize = (1 << hr.NodeSizeLog);\n      UInt32 offs = Get16(p + nodeOffset + nodeSize - (i + 1) * 2);\n      UInt32 offsNext = Get16(p + nodeOffset + nodeSize - (i + 2) * 2);\n      UInt32 recSize = offsNext - offs;\n      if (offsNext >= nodeSize || offsNext < offs || recSize < 6)\n        return S_FALSE;\n\n      CItem item;\n\n      const Byte *r = p + nodeOffset + offs;\n      UInt32 keyLength = Get16(r);\n      item.ParentID = Get32(r + 2);\n      UString name;\n      if (keyLength < 6 || (keyLength & 1) != 0 || keyLength + 2 > recSize)\n        return S_FALSE;\n      r += 6;\n      recSize -= 6;\n      keyLength -= 6;\n      \n      int nameLength = Get16(r);\n      if (nameLength * 2 != (int)keyLength)\n        return S_FALSE;\n      r += 2;\n      recSize -= 2;\n     \n      wchar_t *pp = name.GetBuffer(nameLength + 1);\n      \n      int j;\n      for (j = 0; j < nameLength; j++)\n        pp[j] = ((wchar_t)r[j * 2] << 8) | r[j * 2 + 1];\n      pp[j] = 0;\n      name.ReleaseBuffer();\n      r += j * 2;\n      recSize -= j * 2;\n\n      if (recSize < 2)\n        return S_FALSE;\n      item.Type = Get16(r);\n\n      if (item.Type != RECORD_TYPE_FOLDER && item.Type != RECORD_TYPE_FILE)\n        continue;\n      if (recSize < 0x58)\n        return S_FALSE;\n\n      // item.Flags = Get16(r + 2);\n      // item.Valence = Get32(r + 4);\n      item.ID = Get32(r + 8);\n      item.CTime = Get32(r + 0xC);\n      item.MTime = Get32(r + 0x10);\n      // item.AttrMTime = Get32(r + 0x14);\n      item.ATime = Get32(r + 0x18);\n      // item.BackupDate = Get32(r + 0x1C);\n      \n      /*\n      item.OwnerID = Get32(r + 0x20);\n      item.GroupID = Get32(r + 0x24);\n      item.AdminFlags = r[0x28];\n      item.OwnerFlags = r[0x29];\n      item.FileMode = Get16(r + 0x2A);\n      item.special.iNodeNum = Get16(r + 0x2C);\n      */\n\n      item.Name = name;\n\n      if (item.IsDir())\n      {\n        CIdIndexPair pair;\n        pair.ID = item.ID;\n        pair.Index = Items.Size();\n        IdToIndexMap.Add(pair);\n      }\n      else\n      {\n        CFork fd;\n        recSize -= 0x58;\n        r += 0x58;\n        if (recSize < 0x50 * 2)\n          return S_FALSE;\n        fd.Parse(r);\n        item.Size = fd.Size;\n        item.NumBlocks = fd.NumBlocks;\n        UInt32 curBlock = 0;\n        for (int j = 0; j < 8; j++)\n        {\n          if (curBlock >= fd.NumBlocks)\n            break;\n          const CExtent &e = fd.Extents[j];\n          item.Extents.Add(e);\n          curBlock += e.NumBlocks;\n        }\n      }\n      Items.Add(item);\n      if (progress && Items.Size() % 100 == 0)\n      {\n        RINOK(progress->SetCompleted(Items.Size()));\n      }\n    }\n    node = desc.fLink;\n  }\n  IdToIndexMap.Sort(CompareIdToIndex, NULL);\n  return S_OK;\n}\n\nHRESULT CDatabase::Open(IInStream *inStream, CProgressVirt *progress)\n{\n  static const UInt32 kHeaderSize = 1024 + 512;\n  Byte buf[kHeaderSize];\n  RINOK(ReadStream_FALSE(inStream, buf, kHeaderSize));\n  int i;\n  for (i = 0; i < 1024; i++)\n    if (buf[i] != 0)\n      return S_FALSE;\n  const Byte *p = buf + 1024;\n  CVolHeader &h = Header;\n\n  h.Header[0] = p[0];\n  h.Header[1] = p[1];\n  if (p[0] != 'H' || (p[1] != '+' && p[1] != 'X'))\n    return S_FALSE;\n  h.Version = Get16(p + 2);\n  if (h.Version < 4 || h.Version > 5)\n    return S_FALSE;\n\n  // h.Attr = Get32(p + 4);\n  // h.LastMountedVersion = Get32(p + 8);\n  // h.JournalInfoBlock = Get32(p + 0xC);\n\n  h.CTime = Get32(p + 0x10);\n  h.MTime = Get32(p + 0x14);\n  // h.BackupTime = Get32(p + 0x18);\n  // h.CheckedTime = Get32(p + 0x1C);\n\n  // h.NumFiles = Get32(p + 0x20);\n  // h.NumFolders = Get32(p + 0x24);\n  \n  UInt32 numFiles = Get32(p + 0x20);\n  UInt32 numFolders = Get32(p + 0x24);;\n  if (progress)\n  {\n    RINOK(progress->SetTotal(numFolders + numFiles));\n  }\n\n  UInt32 blockSize = Get32(p + 0x28);\n\n  for (i = 9; ((UInt32)1 << i) != blockSize; i++)\n    if (i == 31)\n      return S_FALSE;\n  h.BlockSizeLog = i;\n\n  h.NumBlocks = Get32(p + 0x2C);\n  h.NumFreeBlocks = Get32(p + 0x30);\n\n  /*\n  h.WriteCount = Get32(p + 0x44);\n  for (i = 0; i < 6; i++)\n    h.FinderInfo[i] = Get32(p + 0x50 + i * 4);\n  h.VolID = Get64(p + 0x68);\n  */\n\n  UInt64 endPos;\n  RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos));\n  if ((endPos >> h.BlockSizeLog) < h.NumBlocks)\n    return S_FALSE;\n\n  // h.AllocationFile.Parse(p + 0x70 + 0x50 * 0);\n  h.ExtentsFile.Parse(   p + 0x70 + 0x50 * 1);\n  h.CatalogFile.Parse(   p + 0x70 + 0x50 * 2);\n  // h.AttributesFile.Parse(p + 0x70 + 0x50 * 3);\n  // h.StartupFile.Parse(   p + 0x70 + 0x50 * 4);\n\n  RINOK(LoadExtentFile(inStream));\n  RINOK(LoadCatalog(inStream, progress));\n\n  // if (Header.NumFiles + Header.NumFolders != (UInt32)Items.Size()) return S_OK;\n\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Hfs/HfsIn.h",
    "content": "// HfsIn.h\n\n#ifndef __ARCHIVE_HFS_IN_H\n#define __ARCHIVE_HFS_IN_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n\nnamespace NArchive {\nnamespace NHfs {\n\nstruct CExtent\n{\n  UInt32 Pos;\n  UInt32 NumBlocks;\n};\n\nstruct CFork\n{\n  UInt64 Size;\n  // UInt32 ClumpSize;\n  UInt32 NumBlocks;\n  CExtent Extents[8];\n  void Parse(const Byte *p);\n};\n\nstruct CVolHeader\n{\n  Byte Header[2];\n  UInt16 Version;\n  // UInt32 Attr;\n  // UInt32 LastMountedVersion;\n  // UInt32 JournalInfoBlock;\n\n  UInt32 CTime;\n  UInt32 MTime;\n  // UInt32 BackupTime;\n  // UInt32 CheckedTime;\n  \n  // UInt32 NumFiles;\n  // UInt32 NumFolders;\n  int BlockSizeLog;\n  UInt32 NumBlocks;\n  UInt32 NumFreeBlocks;\n\n  // UInt32 WriteCount;\n  // UInt32 FinderInfo[8];\n  // UInt64 VolID;\n\n  // CFork AllocationFile;\n  CFork ExtentsFile;\n  CFork CatalogFile;\n  // CFork AttributesFile;\n  // CFork StartupFile;\n\n  bool IsHfsX() const { return Version > 4; }\n};\n\ninline void HfsTimeToFileTime(UInt32 hfsTime, FILETIME &ft)\n{\n  UInt64 v = ((UInt64)3600 * 24 * (365 * 303 + 24 * 3) + hfsTime) * 10000000;\n  ft.dwLowDateTime = (DWORD)v;\n  ft.dwHighDateTime = (DWORD)(v >> 32);\n}\n\nenum ERecordType\n{\n  RECORD_TYPE_FOLDER = 1,\n  RECORD_TYPE_FILE = 2,\n  RECORD_TYPE_FOLDER_THREAD = 3,\n  RECORD_TYPE_FILE_THREAD = 4\n};\n\nstruct CItem\n{\n  UString Name;\n  \n  UInt32 ParentID;\n\n  UInt16 Type;\n  // UInt16 Flags;\n  // UInt32 Valence;\n  UInt32 ID;\n  UInt32 CTime;\n  UInt32 MTime;\n  // UInt32 AttrMTime;\n  UInt32 ATime;\n  // UInt32 BackupDate;\n\n  /*\n  UInt32 OwnerID;\n  UInt32 GroupID;\n  Byte AdminFlags;\n  Byte OwnerFlags;\n  UInt16 FileMode;\n  union\n  {\n    UInt32  iNodeNum;\n    UInt32  LinkCount;\n    UInt32  RawDevice;\n  } special;\n  */\n\n  UInt64 Size;\n  UInt32 NumBlocks;\n  CRecordVector<CExtent> Extents;\n\n  bool IsDir() const { return Type == RECORD_TYPE_FOLDER; }\n  CItem(): Size(0), NumBlocks(0) {}\n};\n\nstruct CIdIndexPair\n{\n  UInt32 ID;\n  int Index;\n};\n\nstruct CProgressVirt\n{\n  virtual HRESULT SetTotal(UInt64 numFiles) PURE;\n  virtual HRESULT SetCompleted(UInt64 numFiles) PURE;\n};\n\nclass CDatabase\n{\n  // CObjectVector<CIdExtents> FileExtents;\n  // CObjectVector<CIdExtents> ResExtents;\n  CRecordVector<CIdIndexPair> IdToIndexMap;\n\n  HRESULT LoadExtentFile(IInStream *inStream);\n  HRESULT LoadCatalog(IInStream *inStream, CProgressVirt *progress);\n\n  HRESULT ReadFile(const CFork &fork, CByteBuffer &buf, IInStream *inStream);\npublic:\n  CVolHeader Header;\n  CObjectVector<CItem> Items;\n  // bool CaseSensetive;\n\n  void Clear()\n  {\n    // CaseSensetive = false;\n    Items.Clear();\n    // FileExtents.Clear();\n    // ResExtents.Clear();\n    IdToIndexMap.Clear();\n  }\n\n  UString GetItemPath(int index) const;\n  HRESULT Open(IInStream *inStream, CProgressVirt *progress);\n};\n\n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Hfs/HfsRegister.cpp",
    "content": "// HfsRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"HfsHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NHfs::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"HFS\", L\"hfs\", 0, 0xE3, { 'H', '+', 0, 4 }, 4, false, CreateArc, 0 };\n\nREGISTER_ARC(Hfs)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/IArchive.h",
    "content": "// IArchive.h\n\n#ifndef __IARCHIVE_H\n#define __IARCHIVE_H\n\n#include \"../IStream.h\"\n#include \"../IProgress.h\"\n#include \"../PropID.h\"\n\n#define ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 6, x)\n#define ARCHIVE_INTERFACE(i, x) ARCHIVE_INTERFACE_SUB(i, IUnknown, x)\n\nnamespace NFileTimeType\n{\n  enum EEnum\n  {\n    kWindows,\n    kUnix,\n    kDOS\n  };\n}\n\nnamespace NArchive\n{\n  enum\n  {\n    kName = 0,\n    kClassID,\n    kExtension,\n    kAddExtension,\n    kUpdate,\n    kKeepName,\n    kStartSignature,\n    kFinishSignature,\n    kAssociate\n  };\n\n  namespace NExtract\n  {\n    namespace NAskMode\n    {\n      enum\n      {\n        kExtract = 0,\n        kTest,\n        kSkip\n      };\n    }\n    namespace NOperationResult\n    {\n      enum\n      {\n        kOK = 0,\n        kUnSupportedMethod,\n        kDataError,\n        kCRCError\n      };\n    }\n  }\n  namespace NUpdate\n  {\n    namespace NOperationResult\n    {\n      enum\n      {\n        kOK = 0,\n        kError\n      };\n    }\n  }\n}\n\n#define INTERFACE_IArchiveOpenCallback(x) \\\n  STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) x; \\\n  STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) x; \\\n\nARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10)\n{\n  INTERFACE_IArchiveOpenCallback(PURE);\n};\n\n\n#define INTERFACE_IArchiveExtractCallback(x) \\\n  INTERFACE_IProgress(x) \\\n  /* GetStream OUT: S_OK - OK, S_FALSE - skeep this file */ \\\n  STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream,  Int32 askExtractMode) x; \\\n  STDMETHOD(PrepareOperation)(Int32 askExtractMode) x; \\\n  STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) x; \\\n\nARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20)\n{\n  INTERFACE_IArchiveExtractCallback(PURE)\n};\n\n\n#define INTERFACE_IArchiveOpenVolumeCallback(x) \\\n  STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) x; \\\n  STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) x; \\\n\nARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30)\n{\n  INTERFACE_IArchiveOpenVolumeCallback(PURE);\n};\n\n\nARCHIVE_INTERFACE(IInArchiveGetStream, 0x40)\n{\n  STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE;\n};\n\n\nARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50)\n{\n  STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE;\n};\n\n\n/*\nIInArchive::Extract:\n  indices must be sorted\n  numItems = 0xFFFFFFFF means \"all files\"\n  testMode != 0 means \"test files without writing to outStream\"\n*/\n\n#define INTERFACE_IInArchive(x) \\\n  STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openArchiveCallback) x; \\\n  STDMETHOD(Close)() x; \\\n  STDMETHOD(GetNumberOfItems)(UInt32 *numItems) x; \\\n  STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \\\n  STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) x; \\\n  STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) x; \\\n  STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \\\n  STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \\\n  STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) x; \\\n  STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x;\n\nARCHIVE_INTERFACE(IInArchive, 0x60)\n{\n  INTERFACE_IInArchive(PURE)\n};\n\n\n#define INTERFACE_IArchiveUpdateCallback(x) \\\n  INTERFACE_IProgress(x); \\\n  STDMETHOD(GetUpdateItemInfo)(UInt32 index,  \\\n      Int32 *newData, /*1 - new data, 0 - old data */ \\\n      Int32 *newProperties, /* 1 - new properties, 0 - old properties */ \\\n      UInt32 *indexInArchive /* -1 if there is no in archive, or if doesn't matter */ \\\n      )  x; \\\n  STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \\\n  STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) x; \\\n  STDMETHOD(SetOperationResult)(Int32 operationResult) x; \\\n\nARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80)\n{\n  INTERFACE_IArchiveUpdateCallback(PURE);\n};\n\n#define INTERFACE_IArchiveUpdateCallback2(x) \\\n  INTERFACE_IArchiveUpdateCallback(x) \\\n  STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) x; \\\n  STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) x; \\\n\nARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82)\n{\n  INTERFACE_IArchiveUpdateCallback2(PURE);\n};\n\n\n#define INTERFACE_IOutArchive(x) \\\n  STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \\\n  STDMETHOD(GetFileTimeType)(UInt32 *type) x;\n\nARCHIVE_INTERFACE(IOutArchive, 0xA0)\n{\n  INTERFACE_IOutArchive(PURE)\n};\n\n\nARCHIVE_INTERFACE(ISetProperties, 0x03)\n{\n  STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE;\n};\n\n\n#define IMP_IInArchive_GetProp(k) \\\n  (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \\\n    { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \\\n    const STATPROPSTG &srcItem = k[index]; \\\n    *propID = srcItem.propid; *varType = srcItem.vt; *name = 0; return S_OK; } \\\n\n#define IMP_IInArchive_GetProp_WITH_NAME(k) \\\n  (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \\\n    { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \\\n    const STATPROPSTG &srcItem = k[index]; \\\n    *propID = srcItem.propid; *varType = srcItem.vt; \\\n    if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \\\n\n#define IMP_IInArchive_Props \\\n  STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \\\n    { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \\\n  STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps)\n\n#define IMP_IInArchive_Props_WITH_NAME \\\n  STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \\\n    { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \\\n  STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps)\n\n\n#define IMP_IInArchive_ArcProps \\\n  STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \\\n    { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \\\n  STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps)\n\n#define IMP_IInArchive_ArcProps_WITH_NAME \\\n  STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \\\n    { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \\\n  STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kArcProps)\n\n#define IMP_IInArchive_ArcProps_NO \\\n  STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \\\n    { *numProperties = 0; return S_OK; } \\\n  STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \\\n    { return E_NOTIMPL; } \\\n  STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \\\n    { value->vt = VT_EMPTY; return S_OK; }\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoHandler.cpp",
    "content": "// IsoHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/NewHandler.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"IsoHandler.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NIso {\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  Close();\n  // try\n  {\n    if(_archive.Open(stream) != S_OK)\n      return S_FALSE;\n    _inStream = stream;\n  }\n  // catch(...) { return S_FALSE; }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _archive.Clear();\n  _inStream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _archive.Refs.Size() + _archive.BootEntries.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  if (index >= (UInt32)_archive.Refs.Size())\n  {\n    index -= _archive.Refs.Size();\n    const CBootInitialEntry &be = _archive.BootEntries[index];\n    switch(propID)\n    {\n      case kpidPath:\n      {\n        // wchar_t name[32];\n        // ConvertUInt64ToString(index + 1, name);\n        UString s = L\"[BOOT]\" WSTRING_PATH_SEPARATOR;\n        // s += name;\n        // s += L\"-\";\n        s += be.GetName();\n        prop = (const wchar_t *)s;\n        break;\n      }\n      case kpidIsDir:\n        prop = false;\n        break;\n      case kpidSize:\n      case kpidPackSize:\n        prop = (UInt64)_archive.GetBootItemSize(index);\n        break;\n    }\n  }\n  else\n  {\n    const CRef &ref = _archive.Refs[index];\n    const CDir &item = ref.Dir->_subItems[ref.Index];\n    switch(propID)\n    {\n      case kpidPath:\n        // if (item.FileId.GetCapacity() >= 0)\n        {\n          UString s;\n          if (_archive.IsJoliet())\n            s = item.GetPathU();\n          else\n            s = MultiByteToUnicodeString(item.GetPath(_archive.IsSusp, _archive.SuspSkipSize), CP_OEMCP);\n\n          int pos = s.ReverseFind(L';');\n          if (pos >= 0 && pos == s.Length() - 2)\n              if (s[s.Length() - 1] == L'1')\n                s = s.Left(pos);\n          if (!s.IsEmpty())\n            if (s[s.Length() - 1] == L'.')\n              s = s.Left(s.Length() - 1);\n          prop = (const wchar_t *)NItemName::GetOSName2(s);\n        }\n        break;\n      case kpidIsDir:\n        prop = item.IsDir();\n        break;\n      case kpidSize:\n      case kpidPackSize:\n        if (!item.IsDir())\n          prop = (UInt64)item.DataLength;\n        break;\n      case kpidMTime:\n      {\n        FILETIME utcFileTime;\n        if (item.DateTime.GetFileTime(utcFileTime))\n          prop = utcFileTime;\n        /*\n        else\n        {\n          utcFileTime.dwLowDateTime = 0;\n          utcFileTime.dwHighDateTime = 0;\n        }\n        */\n        break;\n      }\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _archive.Refs.Size();\n  if(numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for(i = 0; i < numItems; i++)\n  {\n    UInt32 index = (allFilesMode ? i : indices[i]);\n    if (index < (UInt32)_archive.Refs.Size())\n    {\n      const CRef &ref = _archive.Refs[index];\n      const CDir &item = ref.Dir->_subItems[ref.Index];\n      totalSize += item.DataLength;\n    }\n    else\n    {\n      totalSize += _archive.GetBootItemSize(index - _archive.Refs.Size());\n    }\n  }\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    currentItemSize = 0;\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode;\n    askMode = testMode ? NArchive::NExtract::NAskMode::kTest : NArchive::NExtract::NAskMode::kExtract;\n    UInt32 index = allFilesMode ? i : indices[i];\n    \n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    UInt64 blockIndex;\n    if (index < (UInt32)_archive.Refs.Size())\n    {\n      const CRef &ref = _archive.Refs[index];\n      const CDir &item = ref.Dir->_subItems[ref.Index];\n      if(item.IsDir())\n      {\n        RINOK(extractCallback->PrepareOperation(askMode));\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n        continue;\n      }\n      currentItemSize = item.DataLength;\n      blockIndex = item.ExtentLocation;\n    }\n    else\n    {\n      int bootIndex = index - _archive.Refs.Size();\n      const CBootInitialEntry &be = _archive.BootEntries[bootIndex];\n      currentItemSize = _archive.GetBootItemSize(bootIndex);\n      blockIndex = be.LoadRBA;\n    }\n   \n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n    if (testMode)\n    {\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    RINOK(_inStream->Seek(blockIndex * _archive.BlockSize, STREAM_SEEK_SET, NULL));\n    streamSpec->Init(currentItemSize);\n    RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == currentItemSize) ?\n        NArchive::NExtract::NOperationResult::kOK:\n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoHandler.h",
    "content": "// Iso/Handler.h\n\n#ifndef __ISO_HANDLER_H\n#define __ISO_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n\n#include \"IsoItem.h\"\n#include \"IsoIn.h\"\n\nnamespace NArchive {\nnamespace NIso {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(\n    IInArchive\n  )\n\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CMyComPtr<IInStream> _inStream;\n  CInArchive _archive;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoHeader.cpp",
    "content": "// Archive/Iso/Header.h\n\n#include \"StdAfx.h\"\n\n#include \"IsoHeader.h\"\n\nnamespace NArchive {\nnamespace NIso {\n\nconst char *kElToritoSpec = \"EL TORITO SPECIFICATION\\0\\0\\0\\0\\0\\0\\0\\0\\0\";\n\nconst wchar_t *kMediaTypes[5] =\n{\n  L\"NoEmulation\",\n  L\"1.2M\",\n  L\"1.44M\",\n  L\"2.88M\",\n  L\"HardDisk\"\n};\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoHeader.h",
    "content": "// Archive/IsoHeader.h\n\n#ifndef __ARCHIVE_ISO_HEADER_H\n#define __ARCHIVE_ISO_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NIso {\n\nnamespace NVolDescType\n{\n  const Byte kBootRecord = 0;\n  const Byte kPrimaryVol = 1;\n  const Byte kSupplementaryVol = 2;\n  const Byte kVolParttition = 3;\n  const Byte kTerminator = 255;\n}\n\nconst Byte kVersion = 1;\n\nnamespace NFileFlags\n{\n  const Byte kDirectory = 1 << 1;\n}\n\nextern const char *kElToritoSpec;\n\nconst UInt32 kStartPos = 0x8000;\n\nnamespace NBootEntryId\n{\n  const Byte kValidationEntry = 1;\n  const Byte kInitialEntryNotBootable = 0;\n  const Byte kInitialEntryBootable = 0x88;\n}\n\nnamespace NBootPlatformId\n{\n  const Byte kX86 = 0;\n  const Byte kPowerPC = 1;\n  const Byte kMac = 2;\n}\n\nconst BYTE kBootMediaTypeMask = 0xF;\n\nnamespace NBootMediaType\n{\n  const Byte kNoEmulation = 0;\n  const Byte k1d2Floppy = 1;\n  const Byte k1d44Floppy = 2;\n  const Byte k2d88Floppy = 3;\n  const Byte kHardDisk = 4;\n}\n\nconst int kNumBootMediaTypes = 5;\nextern const wchar_t *kMediaTypes[];\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoIn.cpp",
    "content": "// Archive/IsoIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"IsoIn.h\"\n#include \"IsoHeader.h\"\n\n#include \"Windows/Defs.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\nnamespace NArchive {\nnamespace NIso {\n \nByte CInArchive::ReadByte()\n{\n  if (m_BufferPos >= BlockSize)\n    m_BufferPos = 0;\n  if (m_BufferPos == 0)\n  {\n    size_t processedSize = BlockSize;\n    if (ReadStream(_stream, m_Buffer, &processedSize) != S_OK)\n      throw 1;\n    if (processedSize != BlockSize)\n      throw 1;\n  }\n  Byte b = m_Buffer[m_BufferPos++];\n  _position++;\n  return b;\n}\n\nvoid CInArchive::ReadBytes(Byte *data, UInt32 size)\n{\n  for (UInt32 i = 0; i < size; i++)\n    data[i] = ReadByte();\n}\n\nvoid CInArchive::Skeep(size_t size)\n{\n  while (size-- != 0)\n    ReadByte();\n}\n\nvoid CInArchive::SkeepZeros(size_t size)\n{\n  while (size-- != 0)\n  {\n    Byte b = ReadByte();\n    if (b != 0)\n      throw 1;\n  }\n}\n\nUInt16 CInArchive::ReadUInt16Spec()\n{\n  UInt16 value = 0;\n  for (int i = 0; i < 2; i++)\n    value |= ((UInt16)(ReadByte()) << (8 * i));\n  return value;\n}\n\n\nUInt16 CInArchive::ReadUInt16()\n{\n  Byte b[4];\n  ReadBytes(b, 4);\n  UInt32 value = 0;\n  for (int i = 0; i < 2; i++)\n  {\n    if (b[i] != b[3 - i])\n      throw 1;\n    value |= ((UInt16)(b[i]) << (8 * i));\n  }\n  return (UInt16)value;\n}\n\nUInt32 CInArchive::ReadUInt32Le()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n    value |= ((UInt32)(ReadByte()) << (8 * i));\n  return value;\n}\n\nUInt32 CInArchive::ReadUInt32Be()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    value <<= 8;\n    value |= ReadByte();\n  }\n  return value;\n}\n\nUInt32 CInArchive::ReadUInt32()\n{\n  Byte b[8];\n  ReadBytes(b, 8);\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    if (b[i] != b[7 - i])\n      throw 1;\n    value |= ((UInt32)(b[i]) << (8 * i));\n  }\n  return value;\n}\n\nUInt32 CInArchive::ReadDigits(int numDigits)\n{\n  UInt32 res = 0;\n  for (int i = 0; i < numDigits; i++)\n  {\n    Byte b = ReadByte();\n    if (b < '0' || b > '9')\n    {\n      if (b == 0) // it's bug in some CD's\n        b = '0';\n      else\n        throw 1;\n    }\n    UInt32 d = (UInt32)(b - '0');\n    res *= 10;\n    res += d;\n  }\n  return res;\n}\n\nvoid CInArchive::ReadDateTime(CDateTime &d)\n{\n  d.Year = (UInt16)ReadDigits(4);\n  d.Month = (Byte)ReadDigits(2);\n  d.Day = (Byte)ReadDigits(2);\n  d.Hour = (Byte)ReadDigits(2);\n  d.Minute = (Byte)ReadDigits(2);\n  d.Second = (Byte)ReadDigits(2);\n  d.Hundredths = (Byte)ReadDigits(2);\n  d.GmtOffset = (signed char)ReadByte();\n}\n\nvoid CInArchive::ReadBootRecordDescriptor(CBootRecordDescriptor &d)\n{\n  ReadBytes(d.BootSystemId, sizeof(d.BootSystemId));\n  ReadBytes(d.BootId, sizeof(d.BootId));\n  ReadBytes(d.BootSystemUse, sizeof(d.BootSystemUse));\n}\n\nvoid CInArchive::ReadRecordingDateTime(CRecordingDateTime &t)\n{\n  t.Year = ReadByte();\n  t.Month = ReadByte();\n  t.Day = ReadByte();\n  t.Hour = ReadByte();\n  t.Minute = ReadByte();\n  t.Second = ReadByte();\n  t.GmtOffset = (signed char)ReadByte();\n}\n\nvoid CInArchive::ReadDirRecord2(CDirRecord &r, Byte len)\n{\n  r.ExtendedAttributeRecordLen = ReadByte();\n  if (r.ExtendedAttributeRecordLen != 0)\n    throw 1;\n  r.ExtentLocation = ReadUInt32();\n  r.DataLength = ReadUInt32();\n  ReadRecordingDateTime(r.DateTime);\n  r.FileFlags = ReadByte();\n  r.FileUnitSize = ReadByte();\n  r.InterleaveGapSize = ReadByte();\n  r.VolSequenceNumber = ReadUInt16();\n  Byte idLen = ReadByte();\n  r.FileId.SetCapacity(idLen);\n  ReadBytes((Byte *)r.FileId, idLen);\n  int padSize = 1 - (idLen & 1);\n  \n  // SkeepZeros(1 - (idLen & 1));\n  Skeep(1 - (idLen & 1)); // it's bug in some cd's. Must be zeros\n\n  int curPos = 33 + idLen + padSize;\n  if (curPos > len)\n    throw 1;\n  int rem = len - curPos;\n  r.SystemUse.SetCapacity(rem);\n  ReadBytes((Byte *)r.SystemUse, rem);\n}\n\nvoid CInArchive::ReadDirRecord(CDirRecord &r)\n{\n  Byte len = ReadByte();\n  // Some CDs can have incorrect value len = 48 ('0') in VolumeDescriptor.\n  // But maybe we must use real \"len\" for other records.\n  len = 34;\n  ReadDirRecord2(r, len);\n}\n\nvoid CInArchive::ReadVolumeDescriptor(CVolumeDescriptor &d)\n{\n  d.VolFlags = ReadByte();\n  ReadBytes(d.SystemId, sizeof(d.SystemId));\n  ReadBytes(d.VolumeId, sizeof(d.VolumeId));\n  SkeepZeros(8);\n  d.VolumeSpaceSize = ReadUInt32();\n  ReadBytes(d.EscapeSequence, sizeof(d.EscapeSequence));\n  d.VolumeSetSize = ReadUInt16();\n  d.VolumeSequenceNumber = ReadUInt16();\n  d.LogicalBlockSize = ReadUInt16();\n  d.PathTableSize = ReadUInt32();\n  d.LPathTableLocation = ReadUInt32Le();\n  d.LOptionalPathTableLocation = ReadUInt32Le();\n  d.MPathTableLocation = ReadUInt32Be();\n  d.MOptionalPathTableLocation = ReadUInt32Be();\n  ReadDirRecord(d.RootDirRecord);\n  ReadBytes(d.VolumeSetId, sizeof(d.VolumeSetId));\n  ReadBytes(d.PublisherId, sizeof(d.PublisherId));\n  ReadBytes(d.DataPreparerId, sizeof(d.DataPreparerId));\n  ReadBytes(d.ApplicationId, sizeof(d.ApplicationId));\n  ReadBytes(d.CopyrightFileId, sizeof(d.CopyrightFileId));\n  ReadBytes(d.AbstractFileId, sizeof(d.AbstractFileId));\n  ReadBytes(d.BibFileId, sizeof(d.BibFileId));\n  ReadDateTime(d.CTime);\n  ReadDateTime(d.MTime);\n  ReadDateTime(d.ExpirationTime);\n  ReadDateTime(d.EffectiveTime);\n  d.FileStructureVersion = ReadByte(); // = 1\n  SkeepZeros(1);\n  ReadBytes(d.ApplicationUse, sizeof(d.ApplicationUse));\n  SkeepZeros(653);\n}\n\nstatic const Byte kSig_CD001[5] = { 'C', 'D', '0', '0', '1' };\n\nstatic const Byte kSig_NSR02[5] = { 'N', 'S', 'R', '0', '2' };\nstatic const Byte kSig_NSR03[5] = { 'N', 'S', 'R', '0', '3' };\nstatic const Byte kSig_BEA01[5] = { 'B', 'E', 'A', '0', '1' };\nstatic const Byte kSig_TEA01[5] = { 'T', 'E', 'A', '0', '1' };\n\nstatic inline bool CheckSignature(const Byte *sig, const Byte *data)\n{\n  for (int i = 0; i < 5; i++)\n    if (sig[i] != data[i])\n      return false;\n  return true;\n}\n\nvoid CInArchive::SeekToBlock(UInt32 blockIndex)\n{\n  if (_stream->Seek((UInt64)blockIndex * VolDescs[MainVolDescIndex].LogicalBlockSize, STREAM_SEEK_SET, &_position) != S_OK)\n    throw 1;\n  m_BufferPos = 0;\n}\n\nvoid CInArchive::ReadDir(CDir &d, int level)\n{\n  if (!d.IsDir())\n    return;\n  SeekToBlock(d.ExtentLocation);\n  UInt64 startPos = _position;\n\n  bool firstItem = true;\n  for (;;)\n  {\n    UInt64 offset = _position - startPos;\n    if (offset >= d.DataLength)\n      break;\n    Byte len = ReadByte();\n    if (len == 0)\n      continue;\n    CDir subItem;\n    ReadDirRecord2(subItem, len);\n    if (firstItem && level == 0)\n      IsSusp = subItem.CheckSusp(SuspSkipSize);\n      \n    if (!subItem.IsSystemItem())\n      d._subItems.Add(subItem);\n\n    firstItem = false;\n  }\n  for (int i = 0; i < d._subItems.Size(); i++)\n    ReadDir(d._subItems[i], level + 1);\n}\n\nvoid CInArchive::CreateRefs(CDir &d)\n{\n  if (!d.IsDir())\n    return;\n  for (int i = 0; i < d._subItems.Size(); i++)\n  {\n    CRef ref;\n    CDir &subItem = d._subItems[i];\n    subItem.Parent = &d;\n    ref.Dir = &d;\n    ref.Index = i;\n    Refs.Add(ref);\n    CreateRefs(subItem);\n  }\n}\n\nvoid CInArchive::ReadBootInfo()\n{\n  if (!_bootIsDefined)\n    return;\n  if (memcmp(_bootDesc.BootSystemId, kElToritoSpec, sizeof(_bootDesc.BootSystemId)) != 0)\n    return;\n  \n  const Byte *p = (const Byte *)_bootDesc.BootSystemUse;\n  UInt32 blockIndex = p[0] | ((UInt32)p[1] << 8) | ((UInt32)p[2] << 16) | ((UInt32)p[3] << 24);\n  SeekToBlock(blockIndex);\n  Byte b = ReadByte();\n  if (b != NBootEntryId::kValidationEntry)\n    return;\n  {\n    CBootValidationEntry e;\n    e.PlatformId = ReadByte();\n    if (ReadUInt16Spec() != 0)\n      throw 1;\n    ReadBytes(e.Id, sizeof(e.Id));\n    /* UInt16 checkSum = */ ReadUInt16Spec();\n    if (ReadByte() != 0x55)\n      throw 1;\n    if (ReadByte() != 0xAA)\n      throw 1;\n  }\n  b = ReadByte();\n  if (b == NBootEntryId::kInitialEntryBootable || b == NBootEntryId::kInitialEntryNotBootable)\n  {\n    CBootInitialEntry e;\n    e.Bootable = (b == NBootEntryId::kInitialEntryBootable);\n    e.BootMediaType = ReadByte();\n    e.LoadSegment = ReadUInt16Spec();\n    e.SystemType = ReadByte();\n    if (ReadByte() != 0)\n      throw 1;\n    e.SectorCount = ReadUInt16Spec();\n    e.LoadRBA = ReadUInt32Le();\n    if (ReadByte() != 0)\n      throw 1;\n    BootEntries.Add(e);\n  }\n  else\n    return;\n}\n\nHRESULT CInArchive::Open2()\n{\n  Clear();\n  RINOK(_stream->Seek(kStartPos, STREAM_SEEK_CUR, &_position));\n\n  m_BufferPos = 0;\n  BlockSize = kBlockSize;\n  for (;;)\n  {\n    Byte sig[7];\n    ReadBytes(sig, 7);\n    Byte ver = sig[6];\n    if (!CheckSignature(kSig_CD001, sig + 1))\n    {\n      return S_FALSE;\n      /*\n      if (sig[0] != 0 || ver != 1)\n        break;\n      if (CheckSignature(kSig_BEA01, sig + 1))\n      {\n      }\n      else if (CheckSignature(kSig_TEA01, sig + 1))\n      {\n        break;\n      }\n      else if (CheckSignature(kSig_NSR02, sig + 1))\n      {\n      }\n      else\n        break;\n      SkeepZeros(0x800 - 7);\n      continue;\n      */\n    }\n    // version = 2 for ISO 9660:1999?\n    if (ver > 2)\n      throw S_FALSE;\n\n    if (sig[0] == NVolDescType::kTerminator)\n    {\n      break;\n      // Skeep(0x800 - 7);\n      // continue;\n    }\n    switch(sig[0])\n    {\n      case NVolDescType::kBootRecord:\n      {\n        _bootIsDefined = true;\n        ReadBootRecordDescriptor(_bootDesc);\n        break;\n      }\n      case NVolDescType::kPrimaryVol:\n      case NVolDescType::kSupplementaryVol:\n      {\n        // some ISOs have two PrimaryVols.\n        CVolumeDescriptor vd;\n        ReadVolumeDescriptor(vd);\n        if (sig[0] == NVolDescType::kPrimaryVol)\n        {\n          // some burners write \"Joliet\" Escape Sequence to primary volume\n          memset(vd.EscapeSequence, 0, sizeof(vd.EscapeSequence));\n        }\n        VolDescs.Add(vd);\n        break;\n      }\n      default:\n        break;\n    }\n  }\n  if (VolDescs.IsEmpty())\n    return S_FALSE;\n  for (MainVolDescIndex = VolDescs.Size() - 1; MainVolDescIndex > 0; MainVolDescIndex--)\n    if (VolDescs[MainVolDescIndex].IsJoliet())\n      break;\n  // MainVolDescIndex = 0; // to read primary volume\n  const CVolumeDescriptor &vd = VolDescs[MainVolDescIndex];\n  if (vd.LogicalBlockSize != kBlockSize)\n    return S_FALSE;\n  (CDirRecord &)_rootDir = vd.RootDirRecord;\n  ReadDir(_rootDir, 0);\n  CreateRefs(_rootDir);\n  ReadBootInfo();\n  return S_OK;\n}\n\nHRESULT CInArchive::Open(IInStream *inStream)\n{\n  _stream = inStream;\n  UInt64 pos;\n  RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &pos));\n  RINOK(_stream->Seek(0, STREAM_SEEK_END, &_archiveSize));\n  RINOK(_stream->Seek(pos, STREAM_SEEK_SET, &_position));\n  HRESULT res = S_FALSE;\n  try { res = Open2(); }\n  catch(...) { Clear(); res = S_FALSE; }\n  _stream.Release();\n  return res;\n}\n\nvoid CInArchive::Clear()\n{\n  Refs.Clear();\n  _rootDir.Clear();\n  VolDescs.Clear();\n  _bootIsDefined = false;\n  BootEntries.Clear();\n  SuspSkipSize = 0;\n  IsSusp = false;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoIn.h",
    "content": "// Archive/IsoIn.h\n\n#ifndef __ARCHIVE_ISO_IN_H\n#define __ARCHIVE_ISO_IN_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/IntToString.h\"\n\n#include \"../../IStream.h\"\n\n#include \"IsoItem.h\"\n#include \"IsoHeader.h\"\n\nnamespace NArchive {\nnamespace NIso {\n\nstruct CDir: public CDirRecord\n{\n  CDir *Parent;\n  CObjectVector<CDir> _subItems;\n\n  void Clear()\n  {\n    Parent = 0;\n    _subItems.Clear();\n  }\n  \n  int GetLength(bool checkSusp, int skipSize) const\n  {\n    int len = GetLengthCur(checkSusp, skipSize);\n    if (Parent != 0)\n      if (Parent->Parent != 0)\n        len += 1 + Parent->GetLength(checkSusp, skipSize);\n    return len;\n  }\n\n  int GetLengthU() const\n  {\n    int len = (int)(FileId.GetCapacity() / 2);\n    if (Parent != 0)\n      if (Parent->Parent != 0)\n        len += 1 + Parent->GetLengthU();\n    return len;\n  }\n  \n  AString GetPath(bool checkSusp, int skipSize) const\n  {\n    AString s;\n    int len = GetLength(checkSusp, skipSize);\n    char *p = s.GetBuffer(len +  1);\n    p += len;\n    *p = 0;\n    const CDir *cur = this;\n    for (;;)\n    {\n      int curLen = cur->GetLengthCur(checkSusp, skipSize);\n      p -= curLen;\n      memmove(p, (const char *)(const Byte *)cur->GetNameCur(checkSusp, skipSize), curLen);\n      cur = cur->Parent;\n      if (cur == 0)\n        break;\n      if (cur->Parent == 0)\n        break;\n      p--;\n      *p = CHAR_PATH_SEPARATOR;\n    }\n    s.ReleaseBuffer();\n    return s;\n  }\n\n  UString GetPathU() const\n  {\n    UString s;\n    int len = GetLengthU();\n    wchar_t *p = s.GetBuffer(len +  1);\n    p += len;\n    *p = 0;\n    const CDir *cur = this;\n    for (;;)\n    {\n      int curLen = (int)(cur->FileId.GetCapacity() / 2);\n      p -= curLen;\n      for (int i = 0; i < curLen; i++)\n      {\n        Byte b0 = ((const Byte *)cur->FileId)[i * 2];\n        Byte b1 = ((const Byte *)cur->FileId)[i * 2 + 1];\n        p[i] = (wchar_t)(((wchar_t)b0 << 8) | b1);\n      }\n      cur = cur->Parent;\n      if (cur == 0)\n        break;\n      if (cur->Parent == 0)\n        break;\n      p--;\n      *p = WCHAR_PATH_SEPARATOR;\n    }\n    s.ReleaseBuffer();\n    return s;\n  }\n};\n\nstruct CDateTime\n{\n  UInt16 Year;\n  Byte Month;\n  Byte Day;\n  Byte Hour;\n  Byte Minute;\n  Byte Second;\n  Byte Hundredths;\n  signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.\n  bool NotSpecified() const { return Year == 0 && Month == 0 && Day == 0 &&\n      Hour == 0 && Minute == 0 && Second == 0 && GmtOffset == 0; }\n};\n\nstruct CBootRecordDescriptor\n{\n  Byte BootSystemId[32];  // a-characters\n  Byte BootId[32];        // a-characters\n  Byte BootSystemUse[1977];\n};\n\nstruct CBootValidationEntry\n{\n  Byte PlatformId;\n  Byte Id[24]; // to identify the manufacturer/developer of the CD-ROM.\n};\n\nstruct CBootInitialEntry\n{\n  bool Bootable;\n  Byte BootMediaType;\n  UInt16 LoadSegment;\n  /* This is the load segment for the initial boot image. If this\n     value is 0 the system will use the traditional segment of 7C0. If this value\n     is non-zero the system will use the specified segment. This applies to x86\n     architectures only. For \"flat\" model architectures (such as Motorola) this\n     is the address divided by 10. */\n  Byte SystemType;    // This must be a copy of byte 5 (System Type) from the\n                      // Partition Table found in the boot image.\n  UInt16 SectorCount; // This is the number of virtual/emulated sectors the system\n                      // will store at Load Segment during the initial boot procedure.\n  UInt32 LoadRBA;     // This is the start address of the virtual disk. CDs use\n                      // Relative/Logical block addressing.\n\n  UInt64 GetSize() const\n  {\n    // if (BootMediaType == NBootMediaType::k1d44Floppy) (1440 << 10);\n    return SectorCount * 512;\n  }\n\n  UString GetName() const\n  {\n    UString s;\n    if (Bootable)\n      s += L\"Bootable\";\n    else\n      s += L\"NotBootable\";\n    s += L\"_\";\n    if (BootMediaType >= kNumBootMediaTypes)\n    {\n      wchar_t name[32];\n      ConvertUInt64ToString(BootMediaType, name);\n      s += name;\n    }\n    else\n      s += kMediaTypes[BootMediaType];\n    s += L\".img\";\n    return s;\n  }\n};\n\nstruct CVolumeDescriptor\n{\n  Byte VolFlags;\n  Byte SystemId[32]; // a-characters. An identification of a system\n                     // which can recognize and act upon the content of the Logical\n                     // Sectors with logical Sector Numbers 0 to 15 of the volume.\n  Byte VolumeId[32]; // d-characters. An identification of the volume.\n  UInt32 VolumeSpaceSize; // the number of Logical Blocks in which the Volume Space of the volume is recorded\n  Byte EscapeSequence[32];\n  UInt16 VolumeSetSize;\n  UInt16 VolumeSequenceNumber; // the ordinal number of the volume in the Volume Set of which the volume is a member.\n  UInt16 LogicalBlockSize;\n  UInt32 PathTableSize;\n  UInt32 LPathTableLocation;\n  UInt32 LOptionalPathTableLocation;\n  UInt32 MPathTableLocation;\n  UInt32 MOptionalPathTableLocation;\n  CDirRecord RootDirRecord;\n  Byte VolumeSetId[128];\n  Byte PublisherId[128];\n  Byte DataPreparerId[128];\n  Byte ApplicationId[128];\n  Byte CopyrightFileId[37];\n  Byte AbstractFileId[37];\n  Byte BibFileId[37];\n  CDateTime CTime;\n  CDateTime MTime;\n  CDateTime ExpirationTime;\n  CDateTime EffectiveTime;\n  Byte FileStructureVersion; // = 1;\n  Byte ApplicationUse[512];\n\n  bool IsJoliet() const\n  {\n    if ((VolFlags & 1) != 0)\n      return false;\n    Byte b = EscapeSequence[2];\n    return (EscapeSequence[0] == 0x25 && EscapeSequence[1] == 0x2F &&\n      (b == 0x40 || b == 0x43 || b == 0x45));\n  }\n};\n\nstruct CRef\n{\n  CDir *Dir;\n  UInt32 Index;\n};\n\nconst UInt32 kBlockSize = 1 << 11;\n\nclass CInArchive\n{\n  CMyComPtr<IInStream> _stream;\n  UInt64 _position;\n\n  Byte m_Buffer[kBlockSize];\n  UInt32 m_BufferPos;\n  \n  CDir _rootDir;\n  bool _bootIsDefined;\n  CBootRecordDescriptor _bootDesc;\n\n  void Skeep(size_t size);\n  void SkeepZeros(size_t size);\n  Byte ReadByte();\n  void ReadBytes(Byte *data, UInt32 size);\n  UInt16 ReadUInt16Spec();\n  UInt16 ReadUInt16();\n  UInt32 ReadUInt32Le();\n  UInt32 ReadUInt32Be();\n  UInt32 ReadUInt32();\n  UInt64 ReadUInt64();\n  UInt32 ReadDigits(int numDigits);\n  void ReadDateTime(CDateTime &d);\n  void ReadRecordingDateTime(CRecordingDateTime &t);\n  void ReadDirRecord2(CDirRecord &r, Byte len);\n  void ReadDirRecord(CDirRecord &r);\n\n  void ReadBootRecordDescriptor(CBootRecordDescriptor &d);\n  void ReadVolumeDescriptor(CVolumeDescriptor &d);\n\n  void SeekToBlock(UInt32 blockIndex);\n  void ReadDir(CDir &d, int level);\n  void CreateRefs(CDir &d);\n\n  void ReadBootInfo();\n  HRESULT Open2();\npublic:\n  HRESULT Open(IInStream *inStream);\n  void Clear();\n\n  UInt64 _archiveSize;\n\n  CRecordVector<CRef> Refs;\n  CObjectVector<CVolumeDescriptor> VolDescs;\n  int MainVolDescIndex;\n  UInt32 BlockSize;\n  CObjectVector<CBootInitialEntry> BootEntries;\n\n\n  bool IsJoliet() const { return VolDescs[MainVolDescIndex].IsJoliet(); }\n\n  UInt64 GetBootItemSize(int index) const\n  {\n    const CBootInitialEntry &be = BootEntries[index];\n    UInt64 size = be.GetSize();\n    if (be.BootMediaType == NBootMediaType::k1d2Floppy)\n      size = (1200 << 10);\n    else if (be.BootMediaType == NBootMediaType::k1d44Floppy)\n      size = (1440 << 10);\n    else if (be.BootMediaType == NBootMediaType::k2d88Floppy)\n      size = (2880 << 10);\n    UInt64 startPos = be.LoadRBA * BlockSize;\n    if (startPos < _archiveSize)\n    {\n      if (_archiveSize - startPos < size)\n        size = _archiveSize - startPos;\n    }\n    return size;\n  }\n\n  bool IsSusp;\n  int SuspSkipSize;\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoItem.h",
    "content": "// Archive/IsoItem.h\n\n#ifndef __ARCHIVE_ISO_ITEM_H\n#define __ARCHIVE_ISO_ITEM_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n\n#include \"Windows/Time.h\"\n\n#include \"IsoHeader.h\"\n\nnamespace NArchive {\nnamespace NIso {\n\nstruct CRecordingDateTime\n{\n  Byte Year;\n  Byte Month;\n  Byte Day;\n  Byte Hour;\n  Byte Minute;\n  Byte Second;\n  signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.\n  \n  bool GetFileTime(FILETIME &ft) const\n  {\n    UInt64 value;\n    bool res = NWindows::NTime::GetSecondsSince1601(Year + 1900, Month, Day, Hour, Minute, Second, value);\n    if (res)\n    {\n      value -= (UInt64)((Int64)GmtOffset * 15 * 60);\n      value *= 10000000;\n    }\n    ft.dwLowDateTime = (DWORD)value;\n    ft.dwHighDateTime = (DWORD)(value >> 32);\n    return res;\n  }\n};\n\nstruct CDirRecord\n{\n  Byte ExtendedAttributeRecordLen;\n  UInt32 ExtentLocation;\n  UInt32 DataLength;\n  CRecordingDateTime DateTime;\n  Byte FileFlags;\n  Byte FileUnitSize;\n  Byte InterleaveGapSize;\n  UInt16 VolSequenceNumber;\n  CByteBuffer FileId;\n  CByteBuffer SystemUse;\n\n  bool IsDir() const { return  (FileFlags & NFileFlags::kDirectory) != 0; }\n  bool IsSystemItem() const\n  {\n    if (FileId.GetCapacity() != 1)\n      return false;\n    Byte b = *(const Byte *)FileId;\n    return (b == 0 || b == 1);\n  }\n\n  const Byte* FindSuspName(int skipSize, int &lenRes) const\n  {\n    lenRes = 0;\n    const Byte *p = (const Byte *)SystemUse + skipSize;\n    int length = (int)(SystemUse.GetCapacity() - skipSize);\n    while (length >= 5)\n    {\n      int len = p[2];\n      if (p[0] == 'N' && p[1] == 'M' && p[3] == 1)\n      {\n        lenRes = len - 5;\n        return p + 5;\n      }\n      p += len;\n      length -= len;\n    }\n    return 0;\n  }\n\n  int GetLengthCur(bool checkSusp, int skipSize) const\n  {\n    if (checkSusp)\n    {\n      int len;\n      const Byte *res = FindSuspName(skipSize, len);\n      if (res != 0)\n        return len;\n    }\n    return (int)FileId.GetCapacity();\n  }\n\n  const Byte* GetNameCur(bool checkSusp, int skipSize) const\n  {\n    if (checkSusp)\n    {\n      int len;\n      const Byte *res = FindSuspName(skipSize, len);\n      if (res != 0)\n        return res;\n    }\n    return (const Byte *)FileId;\n  }\n\n\n  bool CheckSusp(const Byte *p, int &startPos) const\n  {\n    if (p[0] == 'S' &&\n        p[1] == 'P' &&\n        p[2] == 0x7 &&\n        p[3] == 0x1 &&\n        p[4] == 0xBE &&\n        p[5] == 0xEF)\n    {\n      startPos = p[6];\n      return true;\n    }\n    return false;\n  }\n\n  bool CheckSusp(int &startPos) const\n  {\n    const Byte *p = (const Byte *)SystemUse;\n    int length = (int)SystemUse.GetCapacity();\n    const int kMinLen = 7;\n    if (length < kMinLen)\n      return false;\n    if (CheckSusp(p, startPos))\n      return true;\n    const int kOffset2 = 14;\n    if (length < kOffset2 + kMinLen)\n      return false;\n    return CheckSusp(p + kOffset2, startPos);\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Iso/IsoRegister.cpp",
    "content": "// IsoRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"IsoHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NIso::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Iso\", L\"iso\", 0, 0xE7, { 'C', 'D', '0', '0', '1', 0x1 }, 7, false, CreateArc, 0 };\n\nREGISTER_ARC(Iso)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhCRC.cpp",
    "content": "// LzhCRC.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzhCRC.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n\nstatic const UInt16 kCRCPoly = 0xA001;\n\nUInt16 CCRC::Table[256];\n\nvoid CCRC::InitTable()\n{\n  for (UInt32 i = 0; i < 256; i++)\n  {\n    UInt32 r = i;\n    for (int j = 0; j < 8; j++)\n      if (r & 1)\n        r = (r >> 1) ^ kCRCPoly;\n      else\n        r >>= 1;\n    CCRC::Table[i] = (UInt16)r;\n  }\n}\n\nclass CCRCTableInit\n{\npublic:\n  CCRCTableInit() { CCRC::InitTable(); }\n} g_CRCTableInit;\n\nvoid CCRC::Update(const void *data, size_t size)\n{\n  UInt16 v = _value;\n  const Byte *p = (const Byte *)data;\n  for (; size > 0; size--, p++)\n    v = (UInt16)(Table[((Byte)(v)) ^ *p] ^ (v >> 8));\n  _value = v;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhCRC.h",
    "content": "// LzhCRC.h\n\n#ifndef __LZH_CRC_H\n#define __LZH_CRC_H\n\n#include <stddef.h>\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n\nclass CCRC\n{\n  UInt16 _value;\npublic:\n  static UInt16 Table[256];\n  static void InitTable();\n  \n  CCRC():  _value(0){};\n  void Init() { _value = 0; }\n  void Update(const void *data, size_t size);\n  UInt16 GetDigest() const { return _value; }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhHandler.cpp",
    "content": "// LzhHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"LzhHandler.h\"\n#include \"LzhOutStreamWithCRC.h\"\n\n#include \"../../ICoder.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n#include \"../../Compress/LzhDecoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NLzh{\n\nstruct COsPair\n{\n  Byte Id;\n  const wchar_t *Name;\n};\n\nCOsPair g_OsPairs[] =\n{\n  { 'M', L\"MS-DOS\" },\n  { '2', L\"OS/2\" },\n  { '9', L\"OS9\" },\n  { 'K', L\"OS/68K\" },\n  { '3', L\"OS/386\" },\n  { 'H', L\"HUMAN\" },\n  { 'U', L\"UNIX\" },\n  { 'C', L\"CP/M\" },\n  { 'F', L\"FLEX\" },\n  { 'm', L\"Mac\" },\n  { 'R', L\"Runser\" },\n  { 'T', L\"TownsOS\" },\n  { 'X', L\"XOSK\" },\n  { 'w', L\"Windows95\" },\n  { 'W', L\"WindowsNT\" },\n  {  0,  L\"MS-DOS\" },\n  { 'J', L\"Java VM\" }\n};\n\nconst wchar_t *kUnknownOS = L\"Unknown\";\n\nconst int kNumHostOSes = sizeof(g_OsPairs) / sizeof(g_OsPairs[0]);\n\nstatic const wchar_t *GetOS(Byte osId)\n{\n  for (int i = 0; i < kNumHostOSes; i++)\n    if (g_OsPairs[i].Id == osId)\n      return g_OsPairs[i].Name;\n  return kUnknownOS;\n};\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidAttrib, VT_UI4},\n\n  // { NULL, kpidCommented, VT_BOOL},\n    \n  { NULL, kpidCRC, VT_UI4},\n\n  { NULL, kpidMethod, VT_UI1},\n  { NULL, kpidHostOS, VT_BSTR}\n\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nCHandler::CHandler() {}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _items.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CItemEx &item = _items[index];\n  switch(propID)\n  {\n    case kpidPath:\n    {\n      UString s = NItemName::WinNameToOSName(MultiByteToUnicodeString(item.GetName(), CP_OEMCP));\n      if (!s.IsEmpty())\n      {\n        if (s[s.Length() - 1] == WCHAR_PATH_SEPARATOR)\n           s.Delete(s.Length() - 1);\n        prop = s;\n      }\n      break;\n    }\n    case kpidIsDir:  prop = item.IsDir(); break;\n    case kpidSize:   prop = item.Size; break;\n    case kpidPackSize:  prop = item.PackSize; break;\n    case kpidCRC:  prop = (UInt32)item.CRC; break;\n    case kpidHostOS:  prop = GetOS(item.OsId); break;\n    case kpidMTime:\n    {\n      FILETIME utcFileTime;\n      UInt32 unixTime;\n      if (item.GetUnixTime(unixTime))\n        NTime::UnixTimeToFileTime(unixTime, utcFileTime);\n      else\n      {\n        FILETIME localFileTime;\n        if (DosTimeToFileTime(item.ModifiedTime, localFileTime))\n        {\n          if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))\n            utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n        }\n        else\n          utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n      }\n      prop = utcFileTime;\n      break;\n    }\n    /*\n    case kpidAttrib:  prop = (UInt32)item.Attributes; break;\n    case kpidCommented:  prop = item.IsCommented(); break;\n    */\n    case kpidMethod:\n    {\n      wchar_t method2[kMethodIdSize + 1];\n      method2[kMethodIdSize] = 0;\n      for (int i = 0; i < kMethodIdSize; i++)\n        method2[i] = item.Method[i];\n      prop = method2;\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\n/*\nclass CProgressImp: public CProgressVirt\n{\npublic:\n  CMyComPtr<IArchiveOpenCallback> Callback;\n  STDMETHOD(SetCompleted)(const UInt64 *numFiles);\n};\n\nSTDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)\n{\n  if (Callback)\n    return Callback->SetCompleted(numFiles, NULL);\n  return S_OK;\n}\n*/\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */, IArchiveOpenCallback *callback)\n{\n  COM_TRY_BEGIN\n  try\n  {\n    _items.Clear();\n    CInArchive archive;\n\n    UInt64 endPos = 0;\n    bool needSetTotal = true;\n\n    if (callback != NULL)\n    {\n      RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));\n      RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));\n    }\n\n    RINOK(archive.Open(stream));\n    for (;;)\n    {\n      CItemEx item;\n      bool filled;\n      HRESULT result = archive.GetNextItem(filled, item);\n      if (result == S_FALSE)\n        return S_FALSE;\n      if (result != S_OK)\n        return S_FALSE;\n      if (!filled)\n        break;\n      _items.Add(item);\n      archive.Skeep(item.PackSize);\n      if (callback != NULL)\n      {\n        if (needSetTotal)\n        {\n          RINOK(callback->SetTotal(NULL, &endPos));\n          needSetTotal = false;\n        }\n        if (_items.Size() % 100 == 0)\n        {\n          UInt64 numFiles = _items.Size();\n          UInt64 numBytes = item.DataPosition;\n          RINOK(callback->SetCompleted(&numFiles, &numBytes));\n        }\n      }\n    }\n    if (_items.IsEmpty())\n      return S_FALSE;\n\n    _stream = stream;\n  }\n  catch(...)\n  {\n    return S_FALSE;\n  }\n  COM_TRY_END\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _items.Clear();\n  _stream.Release();\n  return S_OK;\n}\n\n\n\n//////////////////////////////////////\n// CHandler::DecompressItems\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 testModeSpec, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (testModeSpec != 0);\n  UInt64 totalUnPacked = 0, totalPacked = 0;\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _items.Size();\n  if(numItems == 0)\n    return S_OK;\n  UInt32 i;\n  for(i = 0; i < numItems; i++)\n  {\n    const CItemEx &item = _items[allFilesMode ? i : indices[i]];\n    totalUnPacked += item.Size;\n    totalPacked += item.PackSize;\n  }\n  extractCallback->SetTotal(totalUnPacked);\n\n  UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0;\n  UInt64 currentItemUnPacked, currentItemPacked;\n  \n  NCompress::NLzh::NDecoder::CCoder *lzhDecoderSpec = 0;\n  CMyComPtr<ICompressCoder> lzhDecoder;\n  CMyComPtr<ICompressCoder> lzh1Decoder;\n  CMyComPtr<ICompressCoder> arj2Decoder;\n\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_stream);\n\n  for(i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked,\n      currentTotalPacked += currentItemPacked)\n  {\n    currentItemUnPacked = 0;\n    currentItemPacked = 0;\n\n    lps->InSize = currentTotalPacked;\n    lps->OutSize = currentTotalUnPacked;\n    RINOK(lps->SetCur());\n\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode;\n    askMode = testMode ? NExtract::NAskMode::kTest :\n        NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n    const CItemEx &item = _items[index];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    if (item.IsDir())\n    {\n      // if (!testMode)\n      {\n        RINOK(extractCallback->PrepareOperation(askMode));\n        RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));\n      }\n      continue;\n    }\n\n    if (!testMode && (!realOutStream))\n      continue;\n\n    RINOK(extractCallback->PrepareOperation(askMode));\n    currentItemUnPacked = item.Size;\n    currentItemPacked = item.PackSize;\n\n    {\n      COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;\n      CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n      outStreamSpec->Init(realOutStream);\n      realOutStream.Release();\n      \n      UInt64 pos;\n      _stream->Seek(item.DataPosition, STREAM_SEEK_SET, &pos);\n\n      streamSpec->Init(item.PackSize);\n\n      HRESULT result = S_OK;\n      Int32 opRes = NExtract::NOperationResult::kOK;\n\n      if (item.IsCopyMethod())\n      {\n        result = copyCoder->Code(inStream, outStream, NULL, NULL, progress);\n        if (result == S_OK && copyCoderSpec->TotalSize != item.PackSize)\n          result = S_FALSE;\n      }\n      else if (item.IsLh4GroupMethod())\n      {\n        if (!lzhDecoder)\n        {\n          lzhDecoderSpec = new NCompress::NLzh::NDecoder::CCoder;\n          lzhDecoder = lzhDecoderSpec;\n        }\n        lzhDecoderSpec->SetDictionary(item.GetNumDictBits());\n        result = lzhDecoder->Code(inStream, outStream, NULL, &currentItemUnPacked, progress);\n      }\n      /*\n      else if (item.IsLh1GroupMethod())\n      {\n        if (!lzh1Decoder)\n        {\n          lzh1DecoderSpec = new NCompress::NLzh1::NDecoder::CCoder;\n          lzh1Decoder = lzh1DecoderSpec;\n        }\n        lzh1DecoderSpec->SetDictionary(item.GetNumDictBits());\n        result = lzh1Decoder->Code(inStream, outStream, NULL, &currentItemUnPacked, progress);\n      }\n      */\n      else\n        opRes = NExtract::NOperationResult::kUnSupportedMethod;\n\n      if (opRes == NExtract::NOperationResult::kOK)\n      {\n        if (result == S_FALSE)\n          opRes = NExtract::NOperationResult::kDataError;\n        else\n        {\n          RINOK(result);\n          if (outStreamSpec->GetCRC() != item.CRC)\n            opRes = NExtract::NOperationResult::kCRCError;\n        }\n      }\n      outStream.Release();\n      RINOK(extractCallback->SetOperationResult(opRes));\n    }\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhHandler.h",
    "content": "// LzhHandler.h\n\n#ifndef __LZH_HANDLER_H\n#define __LZH_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n#include \"LzhIn.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n\n  INTERFACE_IInArchive(;)\n\n  CHandler();\nprivate:\n  CObjectVector<CItemEx> _items;\n  CMyComPtr<IInStream> _stream;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhHeader.h",
    "content": "// Archive/Lzh/Header.h\n\n#ifndef __ARCHIVE_LZH_HEADER_H\n#define __ARCHIVE_LZH_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n\nconst int kMethodIdSize = 5;\n\nconst Byte kExtIdFileName = 0x01;\nconst Byte kExtIdDirName  = 0x02;\nconst Byte kExtIdUnixTime = 0x54;\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhIn.cpp",
    "content": "// Archive/LzhIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/Buffer.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\n#include \"LzhIn.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n \nHRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize)\n{\n  size_t realProcessedSize = size;\n  RINOK(ReadStream(m_Stream, data, &realProcessedSize));\n  processedSize = (UInt32)realProcessedSize;\n  m_Position += processedSize;\n  return S_OK;\n}\n\nHRESULT CInArchive::CheckReadBytes(void *data, UInt32 size)\n{\n  UInt32 processedSize;\n  RINOK(ReadBytes(data, size, processedSize));\n  return (processedSize == size) ? S_OK: S_FALSE;\n}\n\nHRESULT CInArchive::Open(IInStream *inStream)\n{\n  RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));\n  m_Stream = inStream;\n  return S_OK;\n}\n\nstatic const Byte *ReadUInt32(const Byte *p, UInt32 &v)\n{\n  v = 0;\n  for (int i = 0; i < 4; i++)\n    v |= ((UInt32)(*p++) << (i * 8));\n  return p;\n}\n\nstatic const Byte *ReadUInt16(const Byte *p, UInt16 &v)\n{\n  v = 0;\n  for (int i = 0; i < 2; i++)\n    v |= ((UInt16)(*p++) << (i * 8));\n  return p;\n}\n\nstatic const Byte *ReadString(const Byte *p, size_t size, AString &s)\n{\n  s.Empty();\n  for (size_t i = 0; i < size; i++)\n  {\n    char c = p[i];\n    if (c == 0)\n      break;\n    s += c;\n  }\n  return p + size;\n}\n\nstatic Byte CalcSum(const Byte *data, size_t size)\n{\n  Byte sum = 0;\n  for (size_t i = 0; i < size; i++)\n    sum = (Byte)(sum + data[i]);\n  return sum;\n}\n\nHRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)\n{\n  filled = false;\n\n  UInt32 processedSize;\n  Byte startHeader[2];\n  RINOK(ReadBytes(startHeader, 2, processedSize))\n  if (processedSize == 0)\n    return S_OK;\n  if (processedSize == 1)\n    return (startHeader[0] == 0) ? S_OK: S_FALSE;\n  if (startHeader[0] == 0 && startHeader[1] == 0)\n    return S_OK;\n\n  Byte header[256];\n  const UInt32 kBasicPartSize = 22;\n  RINOK(ReadBytes(header, kBasicPartSize, processedSize));\n  if (processedSize != kBasicPartSize)\n    return (startHeader[0] == 0) ? S_OK: S_FALSE;\n\n  const Byte *p = header;\n  memmove(item.Method, p, kMethodIdSize);\n  if (!item.IsValidMethod())\n    return S_OK;\n  p += kMethodIdSize;\n  p = ReadUInt32(p, item.PackSize);\n  p = ReadUInt32(p, item.Size);\n  p = ReadUInt32(p, item.ModifiedTime);\n  item.Attributes = *p++;\n  item.Level = *p++;\n  if (item.Level > 2)\n    return S_FALSE;\n  UInt32 headerSize;\n  if (item.Level < 2)\n  {\n    headerSize = startHeader[0];\n    if (headerSize < kBasicPartSize)\n      return S_FALSE;\n    UInt32 remain = headerSize - kBasicPartSize;\n    RINOK(CheckReadBytes(header + kBasicPartSize, remain));\n    if (startHeader[1] != CalcSum(header, headerSize))\n      return S_FALSE;\n    size_t nameLength = *p++;\n    if ((p - header) + nameLength + 2 > headerSize)\n      return S_FALSE;\n    p = ReadString(p, nameLength, item.Name);\n  }\n  else\n   headerSize = startHeader[0] | ((UInt32)startHeader[1] << 8);\n  p = ReadUInt16(p, item.CRC);\n  if (item.Level != 0)\n  {\n    if (item.Level == 2)\n    {\n      RINOK(CheckReadBytes(header + kBasicPartSize, 2));\n    }\n    if ((size_t)(p - header) + 3 > headerSize)\n      return S_FALSE;\n    item.OsId = *p++;\n    UInt16 nextSize;\n    p = ReadUInt16(p, nextSize);\n    while (nextSize != 0)\n    {\n      if (nextSize < 3)\n        return S_FALSE;\n      if (item.Level == 1)\n      {\n        if (item.PackSize < nextSize)\n          return S_FALSE;\n        item.PackSize -= nextSize;\n      }\n      CExtension ext;\n      RINOK(CheckReadBytes(&ext.Type, 1))\n      nextSize -= 3;\n      ext.Data.SetCapacity(nextSize);\n      RINOK(CheckReadBytes((Byte *)ext.Data, nextSize))\n      item.Extensions.Add(ext);\n      Byte hdr2[2];\n      RINOK(CheckReadBytes(hdr2, 2));\n      ReadUInt16(hdr2, nextSize);\n    }\n  }\n  item.DataPosition = m_Position;\n  filled = true;\n  return S_OK;\n}\n\nHRESULT CInArchive::Skeep(UInt64 numBytes)\n{\n  UInt64 newPostion;\n  RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion));\n  m_Position += numBytes;\n  if (m_Position != newPostion)\n    return E_FAIL;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhIn.h",
    "content": "// Archive/LzhIn.h\n\n#ifndef __ARCHIVE_LZHIN_H\n#define __ARCHIVE_LZHIN_H\n\n#include \"Common/MyCom.h\"\n#include \"../../IStream.h\"\n\n#include \"LzhItem.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n  \nclass CInArchive\n{\n  CMyComPtr<IInStream> m_Stream;\n  UInt64 m_Position;\n  \n  HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize);\n  HRESULT CheckReadBytes(void *data, UInt32 size);\npublic:\n  HRESULT Open(IInStream *inStream);\n  HRESULT GetNextItem(bool &filled, CItemEx &itemInfo);\n  HRESULT Skeep(UInt64 numBytes);\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhItem.h",
    "content": "// Archive/LzhItem.h\n\n#ifndef __ARCHIVE_LZH_ITEM_H\n#define __ARCHIVE_LZH_ITEM_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n#include \"LzhHeader.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n\nstruct CExtension\n{\n  Byte Type;\n  CByteBuffer Data;\n  AString GetString() const\n  {\n    AString s;\n    for (size_t i = 0; i < Data.GetCapacity(); i++)\n    {\n      char c = (char)Data[i];\n      if (c == 0)\n        break;\n      s += c;\n    }\n    return s;\n  }\n};\n\nstruct CItem\n{\npublic:\n  AString Name;\n  Byte Method[kMethodIdSize];\n  UInt32 PackSize;\n  UInt32 Size;\n  UInt32 ModifiedTime;\n  Byte Attributes;\n  Byte Level;\n  UInt16 CRC;\n  Byte OsId;\n  CObjectVector<CExtension> Extensions;\n\n  bool IsValidMethod() const  { return (Method[0] == '-' && Method[1] == 'l' && Method[4] == '-'); }\n  bool IsLhMethod() const  {return (IsValidMethod() && Method[2] == 'h'); }\n  bool IsDir() const {return (IsLhMethod() && Method[3] == 'd'); }\n\n  bool IsCopyMethod() const\n  {\n    return (IsLhMethod() && Method[3] == '0') ||\n      (IsValidMethod() && Method[2] == 'z' && Method[3] == '4');\n  }\n  \n  bool IsLh1GroupMethod() const\n  {\n    if (!IsLhMethod())\n      return false;\n    switch(Method[3])\n    {\n      case '1':\n        return true;\n    }\n    return false;\n  }\n  \n  bool IsLh4GroupMethod() const\n  {\n    if (!IsLhMethod())\n      return false;\n    switch(Method[3])\n    {\n      case '4':\n      case '5':\n      case '6':\n      case '7':\n        return true;\n    }\n    return false;\n  }\n  \n  int GetNumDictBits() const\n  {\n    if (!IsLhMethod())\n      return 0;\n    switch(Method[3])\n    {\n      case '1':\n        return 12;\n      case '2':\n        return 13;\n      case '3':\n        return 13;\n      case '4':\n        return 12;\n      case '5':\n        return 13;\n      case '6':\n        return 15;\n      case '7':\n        return 16;\n    }\n    return 0;\n  }\n\n  int FindExt(Byte type) const\n  {\n    for (int i = 0; i < Extensions.Size(); i++)\n      if (Extensions[i].Type == type)\n        return i;\n    return -1;\n  }\n  bool GetUnixTime(UInt32 &value) const\n  {\n    int index = FindExt(kExtIdUnixTime);\n    if (index < 0)\n    {\n      if (Level == 2)\n      {\n        value = ModifiedTime;\n        return true;\n      }\n      return false;\n    }\n    const Byte *data = (const Byte *)(Extensions[index].Data);\n    value = data[0] |\n        ((UInt32)data[1] << 8) |\n        ((UInt32)data[2] << 16) |\n        ((UInt32)data[3] << 24);\n    return true;\n  }\n\n  AString GetDirName() const\n  {\n    int index = FindExt(kExtIdDirName);\n    if (index < 0)\n      return AString();\n    return Extensions[index].GetString();\n  }\n\n  AString GetFileName() const\n  {\n    int index = FindExt(kExtIdFileName);\n    if (index < 0)\n      return Name;\n    return Extensions[index].GetString();\n  }\n\n  AString GetName() const\n  {\n    AString dirName = GetDirName();\n    dirName.Replace((char)(unsigned char)0xFF, CHAR_PATH_SEPARATOR);\n    if (!dirName.IsEmpty())\n    {\n      char c = dirName[dirName.Length() - 1];\n      if (c != CHAR_PATH_SEPARATOR)\n        dirName += CHAR_PATH_SEPARATOR;\n    }\n    return dirName + GetFileName();\n  }\n};\n\nclass CItemEx: public CItem\n{\npublic:\n  UInt64 DataPosition;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.cpp",
    "content": "// LzhOutStreamWithCRC.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzhOutStreamWithCRC.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n\nSTDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result;\n  if(!_stream)\n  {\n    realProcessedSize = size;\n    result = S_OK;\n  }\n  else\n    result = _stream->Write(data, size, &realProcessedSize);\n  _crc.Update(data, realProcessedSize);\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhOutStreamWithCRC.h",
    "content": "// LzhOutStreamWithCRC.h\n\n#ifndef __LZHOUTSTREAMWITHCRC_H\n#define __LZHOUTSTREAMWITHCRC_H\n\n#include \"LzhCRC.h\"\n#include \"../../../Common/MyCom.h\"\n#include \"../../IStream.h\"\n\nnamespace NArchive {\nnamespace NLzh {\n\nclass COutStreamWithCRC:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\nprivate:\n  CCRC _crc;\n  CMyComPtr<ISequentialOutStream> _stream;\npublic:\n  void Init(ISequentialOutStream *stream)\n  {\n    _stream = stream;\n    _crc.Init();\n  }\n  void ReleaseStream() { _stream.Release(); }\n  UInt32 GetCRC() const { return _crc.GetDigest(); }\n  void InitCRC() { _crc.Init(); }\n\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzh/LzhRegister.cpp",
    "content": "// LzhRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"LzhHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NLzh::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Lzh\", L\"lzh lha\", 0, 6, { '-', 'l' }, 2, false, CreateArc, 0 };\n\nREGISTER_ARC(Lzh)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaArcRegister.cpp",
    "content": "// LzmaArcRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"LzmaHandler.h\"\n\nstatic IInArchive *CreateArc() { return new NArchive::NLzma::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Lzma\", L\"lzma lzma86\", 0, 0xA, {0 }, 0, true, CreateArc, NULL };\n\nREGISTER_ARC(Lzma)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.cpp",
    "content": "// LzmaFiltersDecode.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzmaFiltersDecode.h\"\n\nnamespace NArchive {\nnamespace NLzma {\n\nstatic const UInt64 k_LZMA = 0x030101;\nstatic const UInt64 k_BCJ = 0x03030103;\n  \nHRESULT CDecoder::Code(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    const CHeader &block,\n    ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    UInt64 *inProcessedSize, ICompressProgressInfo *progress)\n{\n  *inProcessedSize = (UInt64)(Int64)-1;\n\n  if (block.FilterMethod > 1)\n    return E_NOTIMPL;\n\n  if (!_lzmaDecoder)\n  {\n    RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS k_LZMA, _lzmaDecoder, false));\n    if (_lzmaDecoder == 0)\n      return E_NOTIMPL;\n  }\n\n  {\n    CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;\n    _lzmaDecoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);\n    if (!setDecoderProperties)\n      return E_NOTIMPL;\n    RINOK(setDecoderProperties->SetDecoderProperties2(block.LzmaProps, 5));\n  }\n\n  bool filteredMode = (block.FilterMethod == 1);\n\n  CMyComPtr<ICompressSetOutStream> setOutStream;\n\n  if (filteredMode)\n  {\n    if (!_bcjStream)\n    {\n      CMyComPtr<ICompressCoder> coder;\n      RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS k_BCJ, coder, false));\n      if (!coder)\n        return E_NOTIMPL;\n      coder.QueryInterface(IID_ISequentialOutStream, &_bcjStream);\n      if (!_bcjStream)\n        return E_NOTIMPL;\n    }\n\n    _bcjStream.QueryInterface(IID_ICompressSetOutStream, &setOutStream);\n    if (!setOutStream)\n      return E_NOTIMPL;\n    RINOK(setOutStream->SetOutStream(outStream));\n    outStream = _bcjStream;\n  }\n\n  const UInt64 *unpackSize = block.HasUnpackSize() ? &block.UnpackSize : NULL;\n  RINOK(_lzmaDecoder->Code(inStream, outStream, NULL, unpackSize, progress));\n\n  if (filteredMode)\n  {\n    CMyComPtr<IOutStreamFlush> flush;\n    _bcjStream.QueryInterface(IID_IOutStreamFlush, &flush);\n    if (flush)\n    {\n      RINOK(flush->Flush());\n    }\n    RINOK(setOutStream->ReleaseOutStream());\n  }\n\n  CMyComPtr<ICompressGetInStreamProcessedSize> getInStreamProcessedSize;\n  _lzmaDecoder.QueryInterface(IID_ICompressGetInStreamProcessedSize, &getInStreamProcessedSize);\n  if (getInStreamProcessedSize)\n  {\n    RINOK(getInStreamProcessedSize->GetInStreamProcessedSize(inProcessedSize));\n  }\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaFiltersDecode.h",
    "content": "// LzmaFiltersDecode.h\n\n#ifndef __LZMA_FILTERS_DECODE_H\n#define __LZMA_FILTERS_DECODE_H\n\n#include \"../../Common/CreateCoder.h\"\n\n#include \"LzmaItem.h\"\n\nnamespace NArchive {\nnamespace NLzma {\n\nclass CDecoder\n{\n  CMyComPtr<ICompressCoder> _lzmaDecoder;\n  CMyComPtr<ISequentialOutStream> _bcjStream;\npublic:\n  HRESULT Code(DECL_EXTERNAL_CODECS_LOC_VARS\n      const CHeader &block,\n      ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      UInt64 *inProcessedSize, ICompressProgressInfo *progress);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaHandler.cpp",
    "content": "// LzmaHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzmaHandler.h\"\n\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/ComTry.h\"\n#include \"Common/IntToString.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/StreamUtils.h\"\n#include \"../Common/DummyOutStream.h\"\n\n#include \"LzmaFiltersDecode.h\"\n\nnamespace NArchive {\nnamespace NLzma {\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMethod, VT_UI1}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = 1;\n  return S_OK;\n}\n\nstatic void ConvertUInt32ToString(UInt32 value, wchar_t *s)\n{\n  ConvertUInt64ToString(value, s + MyStringLen(s));\n}\n\nstatic void DictSizeToString(UInt32 value, wchar_t *s)\n{\n  for (int i = 0; i <= 31; i++)\n    if ((UInt32(1) << i) == value)\n    {\n      ConvertUInt32ToString(i, s);\n      return;\n    }\n  wchar_t c = L'b';\n  if ((value & ((1 << 20) - 1)) == 0)\n  {\n    value >>= 20;\n    c = L'm';\n  }\n  else if ((value & ((1 << 10) - 1)) == 0)\n  {\n    value >>= 10;\n    c = L'k';\n  }\n  ConvertUInt32ToString(value, s);\n  int p = MyStringLen(s);\n  s[p++] = c;\n  s[p++] = L'\\0';\n}\n\nstatic void MyStrCat(wchar_t *d, const wchar_t *s)\n{\n  MyStringCopy(d + MyStringLen(d), s);\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)\n{\n  if (index != 0)\n    return E_INVALIDARG;\n  NWindows::NCOM::CPropVariant propVariant;\n  switch(propID)\n  {\n    case kpidSize:\n      if (m_StreamInfo.HasUnpackSize())\n        propVariant = (UInt64)m_StreamInfo.UnpackSize;\n      break;\n    case kpidPackSize:\n      propVariant = (UInt64)m_PackSize;\n      break;\n    case kpidMethod:\n    {\n      wchar_t s[64];\n      s[0] = '\\0';\n      if (m_StreamInfo.IsThereFilter)\n      {\n        const wchar_t *f;\n        if (m_StreamInfo.FilterMethod == 0)\n          f = L\"Copy\";\n        else if (m_StreamInfo.FilterMethod == 1)\n          f = L\"BCJ\";\n        else\n          f = L\"Unknown\";\n        MyStrCat(s, f);\n        MyStrCat(s, L\" \");\n      }\n      MyStrCat(s, L\"LZMA:\");\n      DictSizeToString(m_StreamInfo.GetDicSize(), s);\n      propVariant = s;\n      break;\n    }\n  }\n  propVariant.Detach(value);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  {\n    RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition));\n\n    HRESULT res = ReadStreamHeader(inStream, m_StreamInfo);\n    if (res != S_OK)\n      return S_FALSE;\n    \n    Byte b;\n    RINOK(ReadStream_FALSE(inStream, &b, 1));\n    if (b != 0)\n      return S_FALSE;\n\n    UInt64 endPos;\n    RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos));\n    m_PackSize = endPos - m_StreamStartPosition - m_StreamInfo.GetHeaderSize();\n\n    m_Stream = inStream;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  m_Stream.Release();\n  return S_OK;\n}\n\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (!allFilesMode)\n  {\n    if (numItems == 0)\n      return S_OK;\n    if (numItems != 1)\n      return E_INVALIDARG;\n    if (indices[0] != 0)\n      return E_INVALIDARG;\n  }\n\n  bool testMode = (_aTestMode != 0);\n\n  RINOK(extractCallback->SetTotal(m_PackSize));\n    \n  UInt64 currentTotalPacked = 0;\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n\n  {\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    \n    RINOK(extractCallback->GetStream(0, &realOutStream, askMode));\n\n    outStreamSpec->SetStream(realOutStream);\n    outStreamSpec->Init();\n    if(!testMode && !realOutStream)\n      return S_OK;\n    extractCallback->PrepareOperation(askMode);\n  }\n  \n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, true);\n\n  CDecoder decoder;\n  RINOK(m_Stream->Seek(m_StreamStartPosition, STREAM_SEEK_SET, NULL));\n  UInt64 streamPos = m_StreamStartPosition;\n  Int32 opRes = NArchive::NExtract::NOperationResult::kOK;\n  bool firstItem = true;\n  for (;;)\n  {\n    CHeader st;\n    HRESULT result = ReadStreamHeader(m_Stream, st);\n    if (result != S_OK)\n    {\n      if (firstItem)\n        return E_FAIL;\n      break;\n    }\n    firstItem = false;\n\n    lps->OutSize = outStreamSpec->GetSize();\n    lps->InSize = currentTotalPacked;\n    RINOK(lps->SetCur());\n    \n    streamPos += st.GetHeaderSize();\n    UInt64 packProcessed;\n\n    {\n      result = decoder.Code(\n          EXTERNAL_CODECS_VARS\n          st, m_Stream, outStream, &packProcessed, progress);\n      if (result == E_NOTIMPL)\n      {\n        opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n        break;\n      }\n      if (result == S_FALSE)\n      {\n        opRes = NArchive::NExtract::NOperationResult::kDataError;\n        break;\n      }\n      RINOK(result);\n    }\n\n    if (packProcessed == (UInt64)(Int64)-1)\n      break;\n    RINOK(m_Stream->Seek(streamPos + packProcessed, STREAM_SEEK_SET, NULL));\n    currentTotalPacked += packProcessed;\n    streamPos += packProcessed;\n  }\n  outStream.Release();\n  return extractCallback->SetOperationResult(opRes);\n  COM_TRY_END\n}\n\nIMPL_ISetCompressCodecsInfo\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaHandler.h",
    "content": "// Lzma/Handler.h\n\n#ifndef __GZIP_HANDLER_H\n#define __GZIP_HANDLER_H\n\n#include \"Common/MyCom.h\"\n\n#include \"../IArchive.h\"\n#include \"../../Common/CreateCoder.h\"\n\n#include \"LzmaIn.h\"\n\nnamespace NArchive {\nnamespace NLzma {\n\n// const UInt64 k_LZMA = 0x030101;\n\nclass CHandler:\n  public IInArchive,\n  PUBLIC_ISetCompressCodecsInfo\n  public CMyUnknownImp\n{\npublic:\n  MY_QUERYINTERFACE_BEGIN\n  MY_QUERYINTERFACE_ENTRY(IInArchive)\n  QUERY_ENTRY_ISetCompressCodecsInfo\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  STDMETHOD(Open)(IInStream *inStream,\n      const UInt64 *maxCheckStartPosition,\n      IArchiveOpenCallback *openArchiveCallback);\n  STDMETHOD(Close)();\n  \n  STDMETHOD(GetNumberOfItems)(UInt32 *numItems);\n  STDMETHOD(GetProperty)(UInt32 index, PROPID propID,  PROPVARIANT *value);\n  STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems,\n      Int32 testMode, IArchiveExtractCallback *extractCallback);\n\n  STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value);\n\n  STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties);\n  STDMETHOD(GetPropertyInfo)(UInt32 index,\n      BSTR *name, PROPID *propID, VARTYPE *varType);\n\n  STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties);\n  STDMETHOD(GetArchivePropertyInfo)(UInt32 index,\n      BSTR *name, PROPID *propID, VARTYPE *varType);\n\n  UString GetMethodString();\npublic:\n  CHandler() {  }\n\nprivate:\n  CHeader m_StreamInfo;\n  UInt64 m_StreamStartPosition;\n  UInt64 m_PackSize;\n\n  CMyComPtr<IInStream> m_Stream;\n\n  DECL_EXTERNAL_CODECS_VARS\n\n  DECL_ISetCompressCodecsInfo\n\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaIn.cpp",
    "content": "// Archive/LzmaIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzmaIn.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\nnamespace NArchive {\nnamespace NLzma {\n \nstatic bool CheckDictSize(const Byte *p)\n{\n  UInt32 dicSize = GetUi32(p);\n  int i;\n  for (i = 1; i <= 30; i++)\n    if (dicSize == ((UInt32)2 << i) || dicSize == ((UInt32)3 << i))\n      return true;\n  return false;\n}\n\nHRESULT ReadStreamHeader(ISequentialInStream *inStream, CHeader &block)\n{\n  Byte sig[5 + 9];\n  RINOK(ReadStream_FALSE(inStream, sig, 5 + 8));\n\n  const Byte kMaxProp0Val = 5 * 5 * 9 - 1;\n  if (sig[0] > kMaxProp0Val)\n    return S_FALSE;\n\n  for (int i = 0; i < 5; i++)\n    block.LzmaProps[i] = sig[i];\n  \n  block.IsThereFilter = false;\n  block.FilterMethod = 0;\n\n  if (!CheckDictSize(sig + 1))\n  {\n    if (sig[0] > 1 || sig[1] > kMaxProp0Val)\n      return S_FALSE;\n    block.IsThereFilter = true;\n    block.FilterMethod = sig[0];\n    for (int i = 0; i < 5; i++)\n      block.LzmaProps[i] = sig[i + 1];\n    if (!CheckDictSize(block.LzmaProps + 1))\n      return S_FALSE;\n    RINOK(ReadStream_FALSE(inStream, sig + 5 + 8, 1));\n  }\n  UInt32 unpOffset = 5 + (block.IsThereFilter ? 1 : 0);\n  block.UnpackSize = GetUi64(sig + unpOffset);\n  if (block.HasUnpackSize() && block.UnpackSize >= ((UInt64)1 << 56))\n    return S_FALSE;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaIn.h",
    "content": "// Archive/LzmaIn.h\n\n#ifndef __ARCHIVE_LZMA_IN_H\n#define __ARCHIVE_LZMA_IN_H\n\n#include \"LzmaItem.h\"\n#include \"../../IStream.h\"\n\nnamespace NArchive {\nnamespace NLzma {\n\nHRESULT ReadStreamHeader(ISequentialInStream *inStream, CHeader &st);\n\n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Lzma/LzmaItem.h",
    "content": "// Archive/LzmaItem.h\n\n#ifndef __ARCHIVE_LZMA_ITEM_H\n#define __ARCHIVE_LZMA_ITEM_H\n\n#include \"Common/Types.h\"\n\n#include \"../../../../C/CpuArch.h\"\n\nnamespace NArchive {\nnamespace NLzma {\n\nstruct CHeader\n{\n  UInt64 UnpackSize;\n  bool IsThereFilter;\n  Byte FilterMethod;\n  Byte LzmaProps[5];\n\n  UInt32 GetDicSize() const { return GetUi32(LzmaProps + 1); }\n  bool HasUnpackSize() const { return (UnpackSize != (UInt64)(Int64)-1);  }\n  unsigned GetHeaderSize() const { return 5 + 8 + (IsThereFilter ? 1 : 0); }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/MachoHandler.cpp",
    "content": "// MachoHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/Buffer.h\"\n#include \"Common/ComTry.h\"\n\n#include \"Windows/PropVariantUtils.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/CopyCoder.h\"\n\n#include \"Common/DummyOutStream.h\"\n\nstatic UInt32 Get32(const Byte *p, int be) { if (be) return GetBe32(p); return GetUi32(p); }\nstatic UInt64 Get64(const Byte *p, int be) { if (be) return GetBe64(p); return GetUi64(p); }\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NMacho {\n\n#define MACH_ARCH_ABI64 (1 << 24)\n#define MACH_MACHINE_386 7\n#define MACH_MACHINE_ARM 12\n#define MACH_MACHINE_SPARC 14\n#define MACH_MACHINE_PPC 18\n\n#define MACH_MACHINE_PPC64 (MACH_ARCH_ABI64 | MACH_MACHINE_PPC)\n#define MACH_MACHINE_AMD64 (MACH_ARCH_ABI64 | MACH_MACHINE_386)\n\n#define\tMACH_CMD_SEGMENT_32 1\n#define\tMACH_CMD_SEGMENT_64 0x19\n\n#define MACH_SECT_TYPE_MASK 0x000000FF\n#define MACH_SECT_ATTR_MASK 0xFFFFFF00\n\n#define MACH_SECT_ATTR_ZEROFILL 1\n\nconst char *g_SectTypes[] =\n{\n  \"REGULAR\",\n  \"ZEROFILL\",\n  \"CSTRINGS\",\n  \"4BYTE_LITERALS\",\n  \"8BYTE_LITERALS\",\n  \"LITERAL_POINTERS\",\n  \"NON_LAZY_SYMBOL_POINTERS\",\n  \"LAZY_SYMBOL_POINTERS\",\n  \"SYMBOL_STUBS\",\n  \"MOD_INIT_FUNC_POINTERS\",\n  \"MOD_TERM_FUNC_POINTERS\",\n  \"COALESCED\",\n  \"GB_ZEROFILL\",\n  \"INTERPOSING\",\n  \"16BYTE_LITERALS\"\n};\n\nconst char *g_FileTypes[] =\n{\n  \"0\",\n  \"OBJECT\",\n  \"EXECUTE\",\n  \"FVMLIB\",\n  \"CORE\",\n  \"PRELOAD\",\n  \"DYLIB\",\n  \"DYLINKER\",\n  \"BUNDLE\",\n  \"DYLIB_STUB\",\n  \"DSYM\"\n};\n\nstatic const CUInt32PCharPair g_Flags[] =\n{\n  { (UInt32)1 << 31, \"PURE_INSTRUCTIONS\" },\n  { 1 << 30, \"NO_TOC\" },\n  { 1 << 29, \"STRIP_STATIC_SYMS\" },\n  { 1 << 28, \"NO_DEAD_STRIP\" },\n  { 1 << 27, \"LIVE_SUPPORT\" },\n  { 1 << 26, \"SELF_MODIFYING_CODE\" },\n  { 1 << 25, \"DEBUG\" },\n  { 1 << 10, \"SOME_INSTRUCTIONS\" },\n  { 1 <<  9, \"EXT_RELOC\" },\n  { 1 <<  8, \"LOC_RELOC\" }\n};\n\nstatic const CUInt32PCharPair g_MachinePairs[] =\n{\n  { MACH_MACHINE_386, \"x86\" },\n  { MACH_MACHINE_ARM, \"ARM\" },\n  { MACH_MACHINE_SPARC, \"SPARC\" },\n  { MACH_MACHINE_PPC, \"PowerPC\" },\n  { MACH_MACHINE_PPC64, \"PowerPC 64-bit\" },\n  { MACH_MACHINE_AMD64, \"x64\" }\n};\n\nstatic const int kNameSize = 16;\n\nstruct CSegment\n{\n  char Name[kNameSize];\n};\n\nstruct CSection\n{\n  char Name[kNameSize];\n  char SegName[kNameSize];\n  UInt64 Va;\n  UInt64 Size;\n  UInt32 Pa;\n  UInt32 Flags;\n  int SegmentIndex;\n  UInt64 GetPackSize() const { return Flags == MACH_SECT_ATTR_ZEROFILL ? 0 : Size; }\n};\n\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _inStream;\n  CObjectVector<CSegment> _segments;\n  CObjectVector<CSection> _sections;\n  bool _mode64;\n  bool _be;\n  UInt32 _machine;\n  UInt32 _type;\n  UInt32 _headersSize;\n  UInt64 _totalSize;\n  HRESULT Open2(ISequentialInStream *stream);\n  bool Parse(const Byte *buf, UInt32 size);\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\nbool CHandler::Parse(const Byte *buf, UInt32 size)\n{\n  bool mode64 = _mode64;\n  bool be = _be;\n\n  const Byte *bufStart = buf;\n  bool reduceCommands = false;\n  if (size < 512)\n    return false;\n\n  _machine = Get32(buf + 4, be);\n  _type = Get32(buf + 0xC, be);\n\n  UInt32 numCommands = Get32(buf + 0x10, be);\n  UInt32 commandsSize = Get32(buf + 0x14, be);\n  if (commandsSize > size)\n    return false;\n\n  if (commandsSize > (1 << 24) || numCommands > (1 << 18))\n    return false;\n\n  if (numCommands > 16)\n  {\n    reduceCommands = true;\n    numCommands = 16;\n  }\n\n  _headersSize = 0;\n\n  buf += 0x1C;\n  size -= 0x1C;\n\n  if (mode64)\n  {\n    buf += 4;\n    size -= 4;\n  }\n\n  _totalSize = (UInt32)(buf - bufStart);\n  if (commandsSize < size)\n    size = commandsSize;\n\n  for (UInt32 cmdIndex = 0; cmdIndex < numCommands; cmdIndex++)\n  {\n    if (size < 8)\n      return false;\n    UInt32 cmd = Get32(buf, be);\n    UInt32 cmdSize = Get32(buf + 4, be);\n    if (size < cmdSize)\n      return false;\n    if (cmd == MACH_CMD_SEGMENT_32 || cmd == MACH_CMD_SEGMENT_64)\n    {\n      UInt32 offs = (cmd == MACH_CMD_SEGMENT_64) ? 0x48 : 0x38;\n      if (cmdSize < offs)\n        break;\n\n      {\n        UInt64 vmAddr, vmSize, phAddr, phSize;\n        if (cmd == MACH_CMD_SEGMENT_64)\n        {\n          vmAddr = Get64(buf + 0x18, be);\n          vmSize = Get64(buf + 0x20, be);\n          phAddr = Get64(buf + 0x28, be);\n          phSize = Get64(buf + 0x30, be);\n        }\n        else\n        {\n          vmAddr = Get32(buf + 0x18, be);\n          vmSize = Get32(buf + 0x1C, be);\n          phAddr = Get32(buf + 0x20, be);\n          phSize = Get32(buf + 0x24, be);\n        }\n        {\n          UInt64 totalSize = phAddr + phSize;\n          if (totalSize > _totalSize)\n            _totalSize = totalSize;\n        }\n      }\n      \n      CSegment seg;\n      memcpy(seg.Name, buf + 8, kNameSize);\n      _segments.Add(seg);\n\n      UInt32 numSections = Get32(buf + offs - 8, be);\n      if (numSections > (1 << 8))\n        return false;\n\n      while (numSections-- != 0)\n      {\n        CSection section;\n        UInt32 headerSize = (cmd == MACH_CMD_SEGMENT_64) ? 0x50 : 0x44;\n        const Byte *p = buf + offs;\n        if (cmdSize - offs < headerSize)\n          break;\n        if (cmd == MACH_CMD_SEGMENT_64)\n        {\n          section.Va = Get64(p + 0x20, be);\n          section.Size = Get64(p + 0x28, be);\n          section.Pa = Get32(p + 0x30, be);\n          section.Flags = Get32(p + 0x40, be);\n        }\n        else\n        {\n          section.Va = Get32(p + 0x20, be);\n          section.Size = Get32(p + 0x24, be);\n          section.Pa = Get32(p + 0x28, be);\n          section.Flags = Get32(p + 0x38, be);\n        }\n        memcpy(section.Name, p, kNameSize);\n        memcpy(section.SegName, p + kNameSize, kNameSize);\n        section.SegmentIndex = _segments.Size() - 1;\n        _sections.Add(section);\n        offs += headerSize;\n      }\n      if (offs != cmdSize)\n        return false;\n    }\n    buf += cmdSize;\n    size -= cmdSize;\n  }\n  _headersSize = (UInt32)(buf - bufStart);\n  return reduceCommands || (size == 0);\n}\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidCpu, VT_BSTR},\n  { NULL, kpidBit64, VT_BOOL},\n  { NULL, kpidBigEndian, VT_BOOL},\n  { NULL, kpidCharacts, VT_BSTR},\n  { NULL, kpidPhySize, VT_UI8},\n  { NULL, kpidHeadersSize, VT_UI4}\n};\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidCharacts, VT_BSTR},\n  { NULL, kpidOffset, VT_UI8},\n  { NULL, kpidVa, VT_UI8}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidCpu:  PAIR_TO_PROP(g_MachinePairs, _machine, prop); break;\n    case kpidCharacts:  TYPE_TO_PROP(g_FileTypes, _type, prop); break;\n    case kpidPhySize:  prop = _totalSize; break;\n    case kpidHeadersSize:  prop = _headersSize; break;\n    case kpidBit64:  if (_mode64) prop = _mode64; break;\n    case kpidBigEndian:  if (_be) prop = _be; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic AString GetName(const char *name)\n{\n  char res[kNameSize + 1];\n  memcpy(res, name, kNameSize);\n  res[kNameSize] = 0;\n  return res;\n}\n\nstatic AString SectFlagsToString(UInt32 flags)\n{\n  AString res = TypeToString(g_SectTypes, sizeof(g_SectTypes) / sizeof(g_SectTypes[0]),\n      flags & MACH_SECT_TYPE_MASK);\n  AString s = FlagsToString(g_Flags, sizeof(g_Flags) / sizeof(g_Flags[0]),\n      flags & MACH_SECT_ATTR_MASK);\n  if (!s.IsEmpty())\n  {\n    res += ' ';\n    res += s;\n  }\n  return res;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  const CSection &item = _sections[index];\n  switch(propID)\n  {\n    case kpidPath:  StringToProp(GetName(_segments[item.SegmentIndex].Name) + GetName(item.Name), prop); break;\n    case kpidSize:  prop = (UInt64)item.Size; break;\n    case kpidPackSize:  prop = (UInt64)item.GetPackSize(); break;\n    case kpidCharacts:  StringToProp(SectFlagsToString(item.Flags), prop); break;\n    case kpidOffset:  prop = item.Pa; break;\n    case kpidVa:  prop = item.Va; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nHRESULT CHandler::Open2(ISequentialInStream *stream)\n{\n  const UInt32 kBufSize = 1 << 18;\n  const UInt32 kSigSize = 4;\n\n  CByteBuffer buffer;\n  buffer.SetCapacity(kBufSize);\n  Byte *buf = buffer;\n\n  size_t processed = kSigSize;\n  RINOK(ReadStream_FALSE(stream, buf, processed));\n  UInt32 sig = GetUi32(buf);\n  bool be, mode64;\n  switch(sig)\n  {\n    case 0xCEFAEDFE:  be = true; mode64 = false; break;\n    case 0xCFFAEDFE:  be = true; mode64 = true; break;\n    case 0xFEEDFACE:  be = false; mode64 = false; break;\n    case 0xFEEDFACF:  be = false; mode64 = true; break;\n    default: return S_FALSE;\n  }\n  processed = kBufSize - kSigSize;\n  RINOK(ReadStream(stream, buf + kSigSize, &processed));\n  _mode64 = mode64;\n  _be = be;\n  return Parse(buf, (UInt32)processed + kSigSize) ? S_OK : S_FALSE;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  Close();\n  RINOK(Open2(inStream));\n  _inStream = inStream;\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _sections.Clear();\n  _segments.Clear();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _sections.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _sections.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n    totalSize += _sections[allFilesMode ? i : indices[i]].GetPackSize();\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  \n  \n  \n  \n\n\n\n\n  \n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    UInt32 index = allFilesMode ? i : indices[i];\n    const CSection &item = _sections[index];\n    currentItemSize = item.GetPackSize();\n    {\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      if (!testMode && (!realOutStream))\n        continue;\n      outStreamSpec->SetStream(realOutStream);\n      outStreamSpec->Init();\n    }\n    \n    RINOK(extractCallback->PrepareOperation(askMode));\n    RINOK(_inStream->Seek(item.Pa, STREAM_SEEK_SET, NULL));\n    streamSpec->Init(currentItemSize);\n    RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));\n    outStreamSpec->ReleaseStream();\n    RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == currentItemSize) ?\n\n        NArchive::NExtract::NOperationResult::kOK:\n        \n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new CHandler; }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"MachO\", L\"\", 0, 0xDF, { 0 }, 0, false, CreateArc, 0 };\n\nREGISTER_ARC(Macho)\n\n}}\n  "
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/MubHandler.cpp",
    "content": "// MubHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/ComTry.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/CopyCoder.h\"\n\n#define Get32(p) GetBe32(p)\n\nnamespace NArchive {\nnamespace NMub {\n\nstruct CItem\n{\n  UInt32 Type;\n  UInt32 SubType;\n  UInt64 Offset;\n  UInt64 Size;\n  UInt32 Align;\n  bool IsTail;\n};\n\nconst UInt32 kNumFilesMax = 10;\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  UInt64 _startPos;\n  CMyComPtr<IInStream> _inStream;\n  UInt32 _numItems;\n  CItem _items[kNumFilesMax + 1];\n  HRESULT Open2(IInStream *stream);\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\n#define MACH_ARCH_ABI64  0x1000000\n#define MACH_MACHINE_386   7\n#define MACH_MACHINE_ARM   12\n#define MACH_MACHINE_SPARC 14\n#define MACH_MACHINE_PPC   18\n\n#define MACH_MACHINE_PPC64 (MACH_MACHINE_PPC | MACH_ARCH_ABI64)\n#define MACH_MACHINE_AMD64 (MACH_MACHINE_386 | MACH_ARCH_ABI64)\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  const CItem &item = _items[index];\n  switch(propID)\n  {\n    case kpidExtension:\n    {\n      const wchar_t *ext;\n      if (item.IsTail)\n        ext = L\"tail\";\n      else\n      {\n        switch(item.Type)\n        {\n          case MACH_MACHINE_386:   ext = L\"86\";    break;\n          case MACH_MACHINE_ARM:   ext = L\"arm\";   break;\n          case MACH_MACHINE_SPARC: ext = L\"sparc\"; break;\n          case MACH_MACHINE_PPC:   ext = L\"ppc\";   break;\n          case MACH_MACHINE_PPC64: ext = L\"ppc64\"; break;\n          case MACH_MACHINE_AMD64: ext = L\"x64\";   break;\n          default: ext = L\"unknown\"; break;\n        }\n      }\n      prop = ext;\n      break;\n    }\n    case kpidSize:\n    case kpidPackSize:\n      prop = (UInt64)item.Size;\n      break;\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\n#define MACH_TYPE_ABI64 (1 << 24)\n#define MACH_SUBTYPE_ABI64 (1 << 31)\n\nHRESULT CHandler::Open2(IInStream *stream)\n{\n  RINOK(stream->Seek(0, STREAM_SEEK_SET, &_startPos));\n\n  const UInt32 kHeaderSize = 8;\n  const UInt32 kRecordSize = 5 * 4;\n  const UInt32 kBufSize = kHeaderSize + kNumFilesMax * kRecordSize;\n  Byte buf[kBufSize];\n  size_t processed = kBufSize;\n  RINOK(ReadStream(stream, buf, &processed));\n  if (processed < kHeaderSize)\n    return S_FALSE;\n  UInt32 num = Get32(buf + 4);\n  if (Get32(buf) != 0xCAFEBABE || num > kNumFilesMax || processed < kHeaderSize + num * kRecordSize)\n    return S_FALSE;\n  UInt64 endPosMax = kHeaderSize;\n  for (UInt32 i = 0; i < num; i++)\n  {\n    const Byte *p = buf + kHeaderSize + i * kRecordSize;\n    CItem &sb = _items[i];\n    sb.IsTail = false;\n    sb.Type = Get32(p);\n    sb.SubType = Get32(p + 4);\n    sb.Offset = Get32(p + 8);\n    sb.Size = Get32(p + 12);\n    sb.Align = Get32(p + 16);\n\n    if ((sb.Type & ~MACH_TYPE_ABI64) >= 0x100 ||\n        (sb.SubType & ~MACH_SUBTYPE_ABI64) >= 0x100 ||\n        sb.Align > 31)\n      return S_FALSE;\n\n    UInt64 endPos = (UInt64)sb.Offset + sb.Size;\n    if (endPos > endPosMax)\n      endPosMax = endPos;\n  }\n  UInt64 fileSize;\n  RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));\n  fileSize -= _startPos;\n  _numItems = num;\n  if (fileSize > endPosMax)\n  {\n    CItem &sb = _items[_numItems++];\n    sb.IsTail = true;\n    sb.Type = 0;\n    sb.SubType = 0;\n    sb.Offset = endPosMax;\n    sb.Size = fileSize - endPosMax;\n    sb.Align = 0;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  Close();\n  try\n  {\n    if (Open2(inStream) != S_OK)\n      return S_FALSE;\n    _inStream = inStream;\n  }\n  catch(...) { return S_FALSE; }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _numItems = 0;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _numItems;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _numItems;\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n    totalSize += _items[allFilesMode ? i : indices[i]].Size;\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    UInt32 index = allFilesMode ? i : indices[i];\n    const CItem &item = _items[index];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n    currentItemSize = item.Size;\n    \n    \n    \n    \n    \n    \n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n    if (testMode)\n    {\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    RINOK(_inStream->Seek(_startPos + item.Offset, STREAM_SEEK_SET, NULL));\n    streamSpec->Init(item.Size);\n    RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?\n        NArchive::NExtract::NOperationResult::kOK:\n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new CHandler; }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Mub\", L\"\", 0, 0xE2, { 0xCA, 0xFE, 0xBA, 0xBE, 0, 0, 0 }, 7, false, CreateArc, 0 };\n\nREGISTER_ARC(Mub)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Nsis/NsisDecode.cpp",
    "content": "// NsisDecode.cpp\n\n#include \"StdAfx.h\"\n\n#include \"NsisDecode.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../../Common/MethodId.h\"\n#include \"../../Common/CreateCoder.h\"\n\nnamespace NArchive {\nnamespace NNsis {\n\nstatic const CMethodId k_Copy    = 0x0;\nstatic const CMethodId k_Deflate = 0x040901;\nstatic const CMethodId k_BZip2   = 0x040902;\nstatic const CMethodId k_LZMA    = 0x030101;\nstatic const CMethodId k_BCJ_X86 = 0x03030103;\n\nHRESULT CDecoder::Init(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter)\n{\n  useFilter = false;\n  CObjectVector< CMyComPtr<ISequentialInStream> > inStreams;\n\n  if (_decoderInStream)\n    if (method != _method)\n      Release();\n  _method = method;\n  if (!_codecInStream)\n  {\n    CMethodId methodID;\n    switch (method)\n    {\n      case NMethodType::kCopy: methodID = k_Copy; break;\n      case NMethodType::kDeflate: methodID = k_Deflate; break;\n      case NMethodType::kBZip2: methodID = k_BZip2; break;\n      case NMethodType::kLZMA: methodID = k_LZMA; break;\n      default: return E_NOTIMPL;\n    }\n    CMyComPtr<ICompressCoder> coder;\n    RINOK(CreateCoder(\n        EXTERNAL_CODECS_LOC_VARS\n        methodID, coder, false));\n    if (!coder)\n      return E_NOTIMPL;\n    coder.QueryInterface(IID_ISequentialInStream, &_codecInStream);\n    if (!_codecInStream)\n      return E_NOTIMPL;\n  }\n\n  if (thereIsFilterFlag)\n  {\n    UInt32 processedSize;\n    BYTE flag;\n    RINOK(inStream->Read(&flag, 1, &processedSize));\n    if (processedSize != 1)\n      return E_FAIL;\n    if (flag > 1)\n      return E_NOTIMPL;\n    useFilter = (flag != 0);\n  }\n  \n  if (useFilter)\n  {\n    if (!_filterInStream)\n    {\n      CMyComPtr<ICompressCoder> coder;\n      RINOK(CreateCoder(\n          EXTERNAL_CODECS_LOC_VARS\n          k_BCJ_X86, coder, false));\n      if (!coder)\n        return E_NOTIMPL;\n      coder.QueryInterface(IID_ISequentialInStream, &_filterInStream);\n      if (!_filterInStream)\n        return E_NOTIMPL;\n    }\n    CMyComPtr<ICompressSetInStream> setInStream;\n    _filterInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);\n    if (!setInStream)\n      return E_NOTIMPL;\n    RINOK(setInStream->SetInStream(_codecInStream));\n    _decoderInStream = _filterInStream;\n  }\n  else\n    _decoderInStream = _codecInStream;\n\n  if (method == NMethodType::kLZMA)\n  {\n    CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;\n    _codecInStream.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);\n    if (setDecoderProperties)\n    {\n      static const UInt32 kPropertiesSize = 5;\n      BYTE properties[kPropertiesSize];\n      UInt32 processedSize;\n      RINOK(inStream->Read(properties, kPropertiesSize, &processedSize));\n      if (processedSize != kPropertiesSize)\n        return E_FAIL;\n      RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)properties, kPropertiesSize));\n    }\n  }\n\n  {\n    CMyComPtr<ICompressSetInStream> setInStream;\n    _codecInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);\n    if (!setInStream)\n      return E_NOTIMPL;\n    RINOK(setInStream->SetInStream(inStream));\n  }\n\n  {\n    CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;\n    _codecInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);\n    if (!setOutStreamSize)\n      return E_NOTIMPL;\n    RINOK(setOutStreamSize->SetOutStreamSize(NULL));\n  }\n\n  if (useFilter)\n  {\n    /*\n    CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;\n    _filterInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);\n    if (!setOutStreamSize)\n      return E_NOTIMPL;\n    RINOK(setOutStreamSize->SetOutStreamSize(NULL));\n    */\n  }\n\n  return S_OK;\n}\n\nHRESULT CDecoder::Read(void *data, size_t *processedSize)\n{\n  return ReadStream(_decoderInStream, data, processedSize);;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Nsis/NsisDecode.h",
    "content": "// NsisDecode.h\n\n#ifndef __NSIS_DECODE_H\n#define __NSIS_DECODE_H\n\n#include \"../../IStream.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\nnamespace NArchive {\nnamespace NNsis {\n\nnamespace NMethodType\n{\n  enum EEnum\n  {\n    kCopy,\n    kDeflate,\n    kBZip2,\n    kLZMA\n  };\n}\n\nclass CDecoder\n{\n  NMethodType::EEnum _method;\n\n  CMyComPtr<ISequentialInStream> _filterInStream;\n  CMyComPtr<ISequentialInStream> _codecInStream;\n  CMyComPtr<ISequentialInStream> _decoderInStream;\n\npublic:\n  void Release()\n  {\n    _filterInStream.Release();\n    _codecInStream.Release();\n    _decoderInStream.Release();\n  }\n  HRESULT Init(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter);\n  HRESULT Read(void *data, size_t *processedSize);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Nsis/NsisHandler.cpp",
    "content": "// NSisHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../../C/CpuArch.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/NewHandler.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"NsisHandler.h\"\n\n#define Get32(p) GetUi32(p)\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NNsis {\n\nstatic const wchar_t *kBcjMethod = L\"BCJ\";\nstatic const wchar_t *kUnknownMethod = L\"Unknown\";\n\nstatic const wchar_t *kMethods[] =\n{\n  L\"Copy\",\n  L\"Deflate\",\n  L\"BZip2\",\n  L\"LZMA\"\n};\n\nstatic const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidSolid, VT_BOOL}\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidSolid, VT_BOOL}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidMethod:\n    {\n      UInt32 dict = 1;\n      bool filter = false;\n      for (int i = 0; i < _archive.Items.Size(); i++)\n      {\n        const CItem &item = _archive.Items[i];\n        filter |= item.UseFilter;\n        if (item.DictionarySize > dict)\n          dict = item.DictionarySize;\n      }\n      prop = GetMethod(filter, dict);\n      break;\n    }\n    case kpidSolid: prop = _archive.IsSolid; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\n\nSTDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * maxCheckStartPosition, IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  Close();\n  {\n    if(_archive.Open(\n        EXTERNAL_CODECS_VARS\n        stream, maxCheckStartPosition) != S_OK)\n      return S_FALSE;\n    _inStream = stream;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _archive.Clear();\n  _archive.Release();\n  _inStream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _archive.Items.Size()\n  #ifdef NSIS_SCRIPT\n    + 1\n  #endif\n  ;\n  return S_OK;\n}\n\nstatic UString ConvertUInt32ToString(UInt32 value)\n{\n  wchar_t buffer[32];\n  ConvertUInt64ToString(value, buffer);\n  return buffer;\n}\n\nstatic UString GetStringForSizeValue(UInt32 value)\n{\n  for (int i = 31; i >= 0; i--)\n    if ((UInt32(1) << i) == value)\n      return ConvertUInt32ToString(i);\n  UString result;\n  if (value % (1 << 20) == 0)\n  {\n    result += ConvertUInt32ToString(value >> 20);\n    result += L\"m\";\n  }\n  else if (value % (1 << 10) == 0)\n  {\n    result += ConvertUInt32ToString(value >> 10);\n    result += L\"k\";\n  }\n  else\n  {\n    result += ConvertUInt32ToString(value);\n    result += L\"b\";\n  }\n  return result;\n}\n\nUString CHandler::GetMethod(bool useItemFilter, UInt32 dictionary) const\n{\n  NMethodType::EEnum methodIndex = _archive.Method;\n  UString method;\n  if (_archive.IsSolid && _archive.UseFilter || !_archive.IsSolid && useItemFilter)\n  {\n    method += kBcjMethod;\n    method += L\" \";\n  }\n  method += (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod;\n  if (methodIndex == NMethodType::kLZMA)\n  {\n    method += L\":\";\n    method += GetStringForSizeValue(_archive.IsSolid ? _archive.DictionarySize: dictionary);\n  }\n  return method;\n}\n\nbool CHandler::GetUncompressedSize(int index, UInt32 &size)\n{\n  size = 0;\n  const CItem &item = _archive.Items[index];\n  if (item.SizeIsDefined)\n     size = item.Size;\n  else if (_archive.IsSolid && item.EstimatedSizeIsDefined)\n     size  = item.EstimatedSize;\n  else\n    return false;\n  return true;\n}\n\nbool CHandler::GetCompressedSize(int index, UInt32 &size)\n{\n  size = 0;\n  const CItem &item = _archive.Items[index];\n  if (item.CompressedSizeIsDefined)\n    size = item.CompressedSize;\n  else\n  {\n    if (_archive.IsSolid)\n    {\n      if (index == 0)\n        size = _archive.FirstHeader.GetDataSize();\n      else\n        return false;\n    }\n    else\n    {\n      if (!item.IsCompressed)\n        size = item.Size;\n      else\n        return false;\n    }\n  }\n  return true;\n}\n\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  #ifdef NSIS_SCRIPT\n  if (index >= (UInt32)_archive.Items.Size())\n  {\n    switch(propID)\n    {\n      case kpidPath:  prop = L\"[NSIS].nsi\"; break;\n      case kpidSize:\n      case kpidPackSize:  prop = (UInt64)_archive.Script.Length(); break;\n      case kpidSolid:  prop = false; break;\n    }\n  }\n  else\n  #endif\n  {\n    const CItem &item = _archive.Items[index];\n    switch(propID)\n    {\n      case kpidPath:\n      {\n        UString s = NItemName::WinNameToOSName(item.GetReducedName(_archive.IsUnicode));\n        if (!s.IsEmpty())\n          prop = (const wchar_t *)s;\n        break;\n      }\n      case kpidSize:\n      {\n        UInt32 size;\n        if (GetUncompressedSize(index, size))\n          prop = (UInt64)size;\n        break;\n      }\n      case kpidPackSize:\n      {\n        UInt32 size;\n        if (GetCompressedSize(index, size))\n          prop = (UInt64)size;\n        break;\n      }\n      case kpidMTime:\n      {\n        if (item.MTime.dwHighDateTime > 0x01000000 &&\n            item.MTime.dwHighDateTime < 0xFF000000)\n          prop = item.MTime;\n        break;\n      }\n      case kpidMethod:  prop = GetMethod(item.UseFilter, item.DictionarySize); break;\n      case kpidSolid:  prop = _archive.IsSolid; break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    GetNumberOfItems(&numItems);\n  if(numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n\n  UInt32 i;\n  for(i = 0; i < numItems; i++)\n  {\n    UInt32 index = (allFilesMode ? i : indices[i]);\n    #ifdef NSIS_SCRIPT\n    if (index >= (UInt32)_archive.Items.Size())\n      totalSize += _archive.Script.Length();\n    else\n    #endif\n    {\n      UInt32 size;\n      if (_archive.IsSolid)\n      {\n        GetUncompressedSize(index, size);\n        UInt64 pos = _archive.GetPosOfSolidItem(index);\n        if (pos > totalSize)\n          totalSize = pos + size;\n      }\n      else\n      {\n        GetCompressedSize(index, size);\n        totalSize += size;\n      }\n    }\n  }\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt32 currentItemSize = 0;\n\n  UInt64 streamPos = 0;\n  if (_archive.IsSolid)\n  {\n    RINOK(_inStream->Seek(_archive.StreamOffset, STREAM_SEEK_SET, NULL));\n    bool useFilter;\n    RINOK(_archive.Decoder.Init(\n        EXTERNAL_CODECS_VARS\n        _inStream, _archive.Method, _archive.FilterFlag, useFilter));\n  }\n\n  CByteBuffer byteBuf;\n  const UInt32 kBufferLength = 1 << 16;\n  byteBuf.SetCapacity(kBufferLength);\n  Byte *buffer = byteBuf;\n\n  bool dataError = false;\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    currentItemSize = 0;\n    RINOK(extractCallback->SetCompleted(&currentTotalSize));\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode;\n    askMode = testMode ? NArchive::NExtract::NAskMode::kTest : NArchive::NExtract::NAskMode::kExtract;\n    UInt32 index = allFilesMode ? i : indices[i];\n\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    #ifdef NSIS_SCRIPT\n    if (index >= (UInt32)_archive.Items.Size())\n    {\n      currentItemSize = _archive.Script.Length();\n      if(!testMode && (!realOutStream))\n        continue;\n      RINOK(extractCallback->PrepareOperation(askMode));\n      if (!testMode)\n        RINOK(WriteStream(realOutStream, (const char *)_archive.Script, (UInt32)_archive.Script.Length()));\n    }\n    else\n    #endif\n    {\n      const CItem &item = _archive.Items[index];\n      \n      if (_archive.IsSolid)\n        GetUncompressedSize(index, currentItemSize);\n      else\n        GetCompressedSize(index, currentItemSize);\n      \n      if(!testMode && (!realOutStream))\n        continue;\n      \n      RINOK(extractCallback->PrepareOperation(askMode));\n      \n      if (!dataError)\n      {\n        bool needDecompress = false;\n        bool sizeIsKnown = false;\n        UInt32 fullSize = 0;\n\n        if (_archive.IsSolid)\n        {\n          UInt64 pos = _archive.GetPosOfSolidItem(index);\n          while(streamPos < pos)\n          {\n            size_t processedSize = (UInt32)MyMin(pos - streamPos, (UInt64)kBufferLength);\n            HRESULT res = _archive.Decoder.Read(buffer, &processedSize);\n            if (res != S_OK)\n            {\n              if (res != S_FALSE)\n                return res;\n              dataError = true;\n              break;\n            }\n            if (processedSize == 0)\n            {\n              dataError = true;\n              break;\n            }\n            streamPos += processedSize;\n          }\n          if (streamPos == pos)\n          {\n            Byte buffer2[4];\n            size_t processedSize = 4;\n            RINOK(_archive.Decoder.Read(buffer2, &processedSize));\n            if (processedSize != 4)\n              return E_FAIL;\n            streamPos += processedSize;\n            fullSize = Get32(buffer2);\n            sizeIsKnown = true;\n            needDecompress = true;\n          }\n        }\n        else\n        {\n          RINOK(_inStream->Seek(_archive.GetPosOfNonSolidItem(index) + 4, STREAM_SEEK_SET, NULL));\n          if (item.IsCompressed)\n          {\n            needDecompress = true;\n            bool useFilter;\n            RINOK(_archive.Decoder.Init(\n                EXTERNAL_CODECS_VARS\n                _inStream, _archive.Method, _archive.FilterFlag, useFilter));\n            // fullSize = Get32(buffer); // It's bug !!!\n            // Test it: what is exact fullSize?\n            fullSize =  0xFFFFFFFF;\n          }\n          else\n            fullSize = item.Size;\n        }\n        if (!dataError)\n        {\n          if (needDecompress)\n          {\n            UInt64 offset = 0;\n            while(!sizeIsKnown || fullSize > 0)\n            {\n              UInt32 curSize = kBufferLength;\n              if (sizeIsKnown && curSize > fullSize)\n                curSize = fullSize;\n              size_t processedSize = curSize;\n              HRESULT res = _archive.Decoder.Read(buffer, &processedSize);\n              if (res != S_OK)\n              {\n                if (res != S_FALSE)\n                  return res;\n                dataError = true;\n                break;\n              }\n              if (processedSize == 0)\n              {\n                if (sizeIsKnown)\n                  dataError = true;\n                break;\n              }\n              \n              fullSize -= (UInt32)processedSize;\n              streamPos += processedSize;\n              offset += processedSize;\n              \n              UInt64 completed;\n              if (_archive.IsSolid)\n                completed = currentTotalSize + offset;\n              else\n                completed = streamPos;\n              RINOK(extractCallback->SetCompleted(&completed));\n              if (!testMode)\n                RINOK(WriteStream(realOutStream, buffer, processedSize));\n            }\n          }\n          else\n          {\n            while(fullSize > 0)\n            {\n              UInt32 curSize = MyMin(fullSize, kBufferLength);\n              UInt32 processedSize;\n              RINOK(_inStream->Read(buffer, curSize, &processedSize));\n              if (processedSize == 0)\n              {\n                dataError = true;\n                break;\n              }\n              fullSize -= processedSize;\n              streamPos += processedSize;\n              if (!testMode)\n                RINOK(WriteStream(realOutStream, buffer, processedSize));\n            }\n          }\n        }\n      }\n    }\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult(dataError ?\n        NArchive::NExtract::NOperationResult::kDataError :\n        NArchive::NExtract::NOperationResult::kOK));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nIMPL_ISetCompressCodecsInfo\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Nsis/NsisHandler.h",
    "content": "// NSisHandler.h\n\n#ifndef __NSIS_HANDLER_H\n#define __NSIS_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n\n#include \"NsisIn.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\nnamespace NArchive {\nnamespace NNsis {\n\nclass CHandler:\n  public IInArchive,\n  PUBLIC_ISetCompressCodecsInfo\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _inStream;\n  CInArchive _archive;\n\n  DECL_EXTERNAL_CODECS_VARS\n\n  bool GetUncompressedSize(int index, UInt32 &size);\n  bool GetCompressedSize(int index, UInt32 &size);\n\n  UString GetMethod(bool useItemFilter, UInt32 dictionary) const;\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IInArchive)\n  QUERY_ENTRY_ISetCompressCodecsInfo\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  INTERFACE_IInArchive(;)\n\n  DECL_ISetCompressCodecsInfo\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Nsis/NsisIn.cpp",
    "content": "// Archive/NsisIn.cpp\n\n#include \"StdAfx.h\"\n\n// #include <stdio.h>\n\n#include \"NsisIn.h\"\n#include \"NsisDecode.h\"\n\n#include \"Windows/Defs.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n\n#include \"../../../../C/CpuArch.h\"\n\n#define Get32(p) GetUi32(p)\n\nnamespace NArchive {\nnamespace NNsis {\n\nByte kSignature[kSignatureSize] = { 0xEF + 1, 0xBE, 0xAD, 0xDE,\n0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74};\n\nstruct CSignatureInit { CSignatureInit() { kSignature[0]--; } } g_SignatureInit;\n\n#ifdef NSIS_SCRIPT\nstatic const char *kCrLf = \"\\x0D\\x0A\";\n#endif\n\n#define NS_UN_SKIP_CODE  0xE000\n#define NS_UN_VAR_CODE   0xE001\n#define NS_UN_SHELL_CODE 0xE002\n#define NS_UN_LANG_CODE  0xE003\n#define NS_UN_CODES_START NS_UN_SKIP_CODE\n#define NS_UN_CODES_END   NS_UN_LANG_CODE\n\nByte CInArchive::ReadByte()\n{\n  if (_posInData >= _size)\n    throw 1;\n  return _data[_posInData++];\n}\n\nUInt32 CInArchive::ReadUInt32()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n    value |= ((UInt32)(ReadByte()) << (8 * i));\n  return value;\n}\n\nvoid CInArchive::ReadBlockHeader(CBlockHeader &bh)\n{\n  bh.Offset = ReadUInt32();\n  bh.Num = ReadUInt32();\n}\n\n#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }\n\nstatic int CompareItems(void *const *p1, void *const *p2, void * /* param */)\n{\n  const CItem &i1 = **(CItem **)p1;\n  const CItem &i2 = **(CItem **)p2;\n  RINOZ(MyCompare(i1.Pos, i2.Pos));\n  if (i1.IsUnicode)\n  {\n    RINOZ(i1.PrefixU.Compare(i2.PrefixU));\n    RINOZ(i1.NameU.Compare(i2.NameU));\n  }\n  else\n  {\n    RINOZ(i1.PrefixA.Compare(i2.PrefixA));\n    RINOZ(i1.NameA.Compare(i2.NameA));\n  }\n  return 0;\n}\n\nstatic AString UIntToString(UInt32 v)\n{\n  char sz[32];\n  ConvertUInt64ToString(v, sz);\n  return sz;\n}\n\nstatic AString IntToString(Int32 v)\n{\n  char sz[32];\n  ConvertInt64ToString(v, sz);\n  return sz;\n}\n\nAString CInArchive::ReadStringA(UInt32 pos) const\n{\n  AString s;\n  if (pos >= _size)\n    return IntToString((Int32)pos);\n  UInt32 offset = GetOffset() + _stringsPos + pos;\n  for (;;)\n  {\n    if (offset >= _size)\n      break; // throw 1;\n    char c = _data[offset++];\n    if (c == 0)\n      break;\n    s += c;\n  }\n  return s;\n}\n\nUString CInArchive::ReadStringU(UInt32 pos) const\n{\n  UString s;\n  UInt32 offset = GetOffset() + _stringsPos + (pos * 2);\n  for (;;)\n  {\n    if (offset >= _size || offset + 1 >= _size)\n      return s; // throw 1;\n    char c0 = _data[offset++];\n    char c1 = _data[offset++];\n    wchar_t c = (c0 | ((wchar_t)c1 << 8));\n    if (c == 0)\n      break;\n    s += c;\n  }\n  return s;\n}\n\n/*\nstatic AString ParsePrefix(const AString &prefix)\n{\n  AString res = prefix;\n  if (prefix.Length() >= 3)\n  {\n    if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x95 && (Byte)prefix[2] == 0x80)\n      res = \"$INSTDIR\" + prefix.Mid(3);\n    else if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x96 && (Byte)prefix[2] == 0x80)\n      res = \"$OUTDIR\" + prefix.Mid(3);\n  }\n  return res;\n}\n*/\n\n#define SYSREGKEY \"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\"\n\n/*\n#  define CSIDL_PROGRAMS 0x2\n#  define CSIDL_PRINTERS 0x4\n#  define CSIDL_PERSONAL 0x5\n#  define CSIDL_FAVORITES 0x6\n#  define CSIDL_STARTUP 0x7\n#  define CSIDL_RECENT 0x8\n#  define CSIDL_SENDTO 0x9\n#  define CSIDL_STARTMENU 0xB\n#  define CSIDL_MYMUSIC 0xD\n#  define CSIDL_MYVIDEO 0xE\n\n#  define CSIDL_DESKTOPDIRECTORY 0x10\n#  define CSIDL_NETHOOD 0x13\n#  define CSIDL_FONTS 0x14\n#  define CSIDL_TEMPLATES 0x15\n#  define CSIDL_COMMON_STARTMENU 0x16\n#  define CSIDL_COMMON_PROGRAMS 0x17\n#  define CSIDL_COMMON_STARTUP 0x18\n#  define CSIDL_COMMON_DESKTOPDIRECTORY 0x19\n#  define CSIDL_APPDATA 0x1A\n#  define CSIDL_PRINTHOOD 0x1B\n#  define CSIDL_LOCAL_APPDATA 0x1C\n#  define CSIDL_ALTSTARTUP 0x1D\n#  define CSIDL_COMMON_ALTSTARTUP 0x1E\n#  define CSIDL_COMMON_FAVORITES 0x1F\n\n#  define CSIDL_INTERNET_CACHE 0x20\n#  define CSIDL_COOKIES 0x21\n#  define CSIDL_HISTORY 0x22\n#  define CSIDL_COMMON_APPDATA 0x23\n#  define CSIDL_WINDOWS 0x24\n#  define CSIDL_SYSTEM 0x25\n#  define CSIDL_PROGRAM_FILES 0x26\n#  define CSIDL_MYPICTURES 0x27\n#  define CSIDL_PROFILE 0x28\n#  define CSIDL_PROGRAM_FILES_COMMON 0x2B\n#  define CSIDL_COMMON_TEMPLATES 0x2D\n#  define CSIDL_COMMON_DOCUMENTS 0x2E\n#  define CSIDL_COMMON_ADMINTOOLS 0x2F\n\n#  define CSIDL_ADMINTOOLS 0x30\n#  define CSIDL_COMMON_MUSIC 0x35\n#  define CSIDL_COMMON_PICTURES 0x36\n#  define CSIDL_COMMON_VIDEO 0x37\n#  define CSIDL_RESOURCES 0x38\n#  define CSIDL_RESOURCES_LOCALIZED 0x39\n#  define CSIDL_CDBURN_AREA 0x3B\n*/\n\nstruct CCommandPair\n{\n  int NumParams;\n  const char *Name;\n};\n\nenum\n{\n  // 0\n  EW_INVALID_OPCODE,    // zero is invalid. useful for catching errors. (otherwise an all zeroes instruction\n                        // does nothing, which is easily ignored but means something is wrong.\n  EW_RET,               // return from function call\n  EW_NOP,               // Nop/Jump, do nothing: 1, [?new address+1:advance one]\n  EW_ABORT,             // Abort: 1 [status]\n  EW_QUIT,              // Quit: 0\n  EW_CALL,              // Call: 1 [new address+1]\n  EW_UPDATETEXT,        // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this]\n  EW_SLEEP,             // Sleep: 1 [sleep time in milliseconds]\n  EW_BRINGTOFRONT,      // BringToFront: 0\n  EW_CHDETAILSVIEW,     // SetDetailsView: 2 [listaction,buttonaction]\n  \n  // 10\n  EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes]\n  EW_CREATEDIR,         // Create directory: 2, [path, ?update$INSTDIR]\n  EW_IFFILEEXISTS,      // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists]\n  EW_SETFLAG,           // Sets a flag: 2 [id, data]\n  EW_IFFLAG,            // If a flag: 4 [on, off, id, new value mask]\n  EW_GETFLAG,           // Gets a flag: 2 [output, id]\n  EW_RENAME,            // Rename: 3 [old, new, rebootok]\n  EW_GETFULLPATHNAME,   // GetFullPathName: 2 [output, input, ?lfn:sfn]\n  EW_SEARCHPATH,        // SearchPath: 2 [output, filename]\n  EW_GETTEMPFILENAME,   // GetTempFileName: 2 [output, base_dir]\n  \n  // 20\n  EW_EXTRACTFILE,       // File to extract: 6 [overwriteflag, output filename, compressed filedata, filedatetimelow, filedatetimehigh, allow ignore]\n                        //  overwriteflag: 0x1 = no. 0x0=force, 0x2=try, 0x3=if date is newer\n  EW_DELETEFILE,        // Delete File: 2, [filename, rebootok]\n  EW_MESSAGEBOX,        // MessageBox: 5,[MB_flags,text,retv1:retv2,moveonretv1:moveonretv2]\n  EW_RMDIR,             // RMDir: 2 [path, recursiveflag]\n  EW_STRLEN,            // StrLen: 2 [output, input]\n  EW_ASSIGNVAR,         // Assign: 4 [variable (0-9) to assign, string to assign, maxlen, startpos]\n  EW_STRCMP,            // StrCmp: 5 [str1, str2, jump_if_equal, jump_if_not_equal, case-sensitive?]\n  EW_READENVSTR,        // ReadEnvStr/ExpandEnvStrings: 3 [output, string_with_env_variables, IsRead]\n  EW_INTCMP,            // IntCmp: 6 [val1, val2, equal, val1<val2, val1>val2, unsigned?]\n  EW_INTOP,             // IntOp: 4 [output, input1, input2, op] where op: 0=add, 1=sub, 2=mul, 3=div, 4=bor, 5=band, 6=bxor, 7=bnot input1, 8=lnot input1, 9=lor, 10=land], 11=1%2\n  \n  // 30\n  EW_INTFMT,            // IntFmt: [output, format, input]\n  EW_PUSHPOP,           // Push/Pop/Exchange: 3 [variable/string, ?pop:push, ?exch]\n  EW_FINDWINDOW,        // FindWindow: 5, [outputvar, window class,window name, window_parent, window_after]\n  EW_SENDMESSAGE,       // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2]\n  EW_ISWINDOW,          // IsWindow: 3 [hwnd, jump_if_window, jump_if_notwindow]\n  EW_GETDLGITEM,        // GetDlgItem:        3: [outputvar, dialog, item_id]\n  EW_SETCTLCOLORS,      // SerCtlColors:      3: [hwnd, pointer to struct colors]\n  EW_SETBRANDINGIMAGE,  // SetBrandingImage:  1: [Bitmap file]\n  EW_CREATEFONT,        // CreateFont:        5: [handle output, face name, height, weight, flags]\n  EW_SHOWWINDOW,        // ShowWindow:        2: [hwnd, show state]\n  \n  // 40\n  EW_SHELLEXEC,         // ShellExecute program: 4, [shell action, complete commandline, parameters, showwindow]\n  EW_EXECUTE,           // Execute program: 3,[complete command line,waitflag,>=0?output errorcode]\n  EW_GETFILETIME,       // GetFileTime; 3 [file highout lowout]\n  EW_GETDLLVERSION,     // GetDLLVersion: 3 [file highout lowout]\n  EW_REGISTERDLL,       // Register DLL: 3,[DLL file name, string ptr of function to call, text to put in display (<0 if none/pass parms), 1 - no unload, 0 - unload]\n  EW_CREATESHORTCUT,    // Make Shortcut: 5, [link file, target file, parameters, icon file, iconindex|show mode<<8|hotkey<<16]\n  EW_COPYFILES,         // CopyFiles: 3 [source mask, destination location, flags]\n  EW_REBOOT,            // Reboot: 0\n  EW_WRITEINI,          // Write INI String: 4, [Section, Name, Value, INI File]\n  EW_READINISTR,        // ReadINIStr: 4 [output, section, name, ini_file]\n  \n  // 50\n  EW_DELREG,            // DeleteRegValue/DeleteRegKey: 4, [root key(int), KeyName, ValueName, delkeyonlyifempty]. ValueName is -1 if delete key\n  EW_WRITEREG,          // Write Registry value: 5, [RootKey(int),KeyName,ItemName,ItemData,typelen]\n                        //  typelen=1 for str, 2 for dword, 3 for binary, 0 for expanded str\n  EW_READREGSTR,        // ReadRegStr: 5 [output, rootkey(int), keyname, itemname, ==1?int::str]\n  EW_REGENUM,           // RegEnum: 5 [output, rootkey, keyname, index, ?key:value]\n  EW_FCLOSE,            // FileClose: 1 [handle]\n  EW_FOPEN,             // FileOpen: 4  [name, openmode, createmode, outputhandle]\n  EW_FPUTS,             // FileWrite: 3 [handle, string, ?int:string]\n  EW_FGETS,             // FileRead: 4  [handle, output, maxlen, ?getchar:gets]\n  EW_FSEEK,             // FileSeek: 4  [handle, offset, mode, >=0?positionoutput]\n  EW_FINDCLOSE,         // FindClose: 1 [handle]\n  \n  // 60\n  EW_FINDNEXT,          // FindNext: 2  [output, handle]\n  EW_FINDFIRST,         // FindFirst: 2 [filespec, output, handleoutput]\n  EW_WRITEUNINSTALLER,  // WriteUninstaller: 3 [name, offset, icon_size]\n  EW_LOG,               // LogText: 2 [0, text] / LogSet: [1, logstate]\n  EW_SECTIONSET,        // SectionSetText:    3: [idx, 0, text]\n                        // SectionGetText:    3: [idx, 1, output]\n                        // SectionSetFlags:   3: [idx, 2, flags]\n                        // SectionGetFlags:   3: [idx, 3, output]\n  EW_INSTTYPESET,       // InstTypeSetFlags:  3: [idx, 0, flags]\n                        // InstTypeGetFlags:  3: [idx, 1, output]\n  // instructions not actually implemented in exehead, but used in compiler.\n  EW_GETLABELADDR,      // both of these get converted to EW_ASSIGNVAR\n  EW_GETFUNCTIONADDR,\n\n  EW_LOCKWINDOW\n};\n\n#ifdef NSIS_SCRIPT\nstatic CCommandPair kCommandPairs[] =\n{\n  { 0, \"Invalid\" },\n  { 0, \"Return\" },\n  { 1, \"Goto\" },\n  { 0, \"Abort\" },\n  { 0, \"Quit\" },\n  { 1, \"Call\" },\n  { 2, \"UpdateSatusText\" },\n  { 1, \"Sleep\" },\n  { 0, \"BringToFront\" },\n  { 2, \"SetDetailsView\" },\n\n  { 2, \"SetFileAttributes\" },\n  { 2, \"SetOutPath\" },\n  { 3, \"IfFileExists\" },\n  { 2, \"SetFlag\" },\n  { 4, \"IfFlag\" },\n  { 2, \"GetFlag\" },\n  { 3, \"Rename\" },\n  { 2, \"GetFullPathName\" },\n  { 2, \"SearchPath\" },\n  { 2, \"GetTempFileName\" },\n\n  { 6, \"File\" },\n  { 2, \"Delete\" },\n  { 5, \"MessageBox\" },\n  { 2, \"RMDir\" },\n  { 2, \"StrLen\" },\n  { 4, \"StrCpy\" },\n  { 5, \"StrCmp\" },\n  { 3, \"ReadEnvStr\" },\n  { 6, \"IntCmp\" },\n  { 4, \"IntOp\" },\n\n  { 3, \"IntFmt\" },\n  { 3, \"PushPop\" },\n  { 5, \"FindWindow\" },\n  { 6, \"SendMessage\" },\n  { 3, \"IsWindow\" },\n  { 3, \"GetDlgItem\" },\n  { 3, \"SerCtlColors\" },\n  { 1, \"SetBrandingImage\" },\n  { 5, \"CreateFont\" },\n  { 2, \"ShowWindow\" },\n\n  { 4, \"ShellExecute\" },\n  { 3, \"Execute\" },\n  { 3, \"GetFileTime\" },\n  { 3, \"GetDLLVersion\" },\n  { 3, \"RegisterDLL\" },\n  { 5, \"CreateShortCut\" },\n  { 3, \"CopyFiles\" },\n  { 0, \"Reboot\" },\n  { 4, \"WriteINIStr\" },\n  { 4, \"ReadINIStr\" },\n\n  { 4, \"DelReg\" },\n  { 5, \"WriteReg\" },\n  { 5, \"ReadRegStr\" },\n  { 5, \"RegEnum\" },\n  { 1, \"FileClose\" },\n  { 4, \"FileOpen\" },\n  { 3, \"FileWrite\" },\n  { 4, \"FileRead\" },\n  { 4, \"FileSeek\" },\n  { 1, \"FindClose\" },\n\n  { 2, \"FindNext\" },\n  { 2, \"FindFirst\" },\n  { 3, \"WriteUninstaller\" },\n  { 2, \"LogText\" },\n  { 3, \"Section?etText\" },\n  { 3, \"InstType?etFlags\" },\n  { 6, \"GetLabelAddr\" },\n  { 2, \"GetFunctionAddress\" },\n  { 6, \"LockWindow\" }\n};\n\n#endif\n\nstatic const char *kShellStrings[] =\n{\n  \"\",\n  \"\",\n\n  \"SMPROGRAMS\",\n  \"\",\n  \"PRINTERS\",\n  \"DOCUMENTS\",\n  \"FAVORITES\",\n  \"SMSTARTUP\",\n  \"RECENT\",\n  \"SENDTO\",\n  \"\",\n  \"STARTMENU\",\n  \"\",\n  \"MUSIC\",\n  \"VIDEO\",\n  \"\",\n\n  \"DESKTOP\",\n  \"\",\n  \"\",\n  \"NETHOOD\",\n  \"FONTS\",\n  \"TEMPLATES\",\n  \"COMMONSTARTMENU\",\n  \"COMMONFILES\",\n  \"COMMON_STARTUP\",\n  \"COMMON_DESKTOPDIRECTORY\",\n  \"QUICKLAUNCH\",\n  \"PRINTHOOD\",\n  \"LOCALAPPDATA\",\n  \"ALTSTARTUP\",\n  \"ALTSTARTUP\",\n  \"FAVORITES\",\n\n  \"INTERNET_CACHE\",\n  \"COOKIES\",\n  \"HISTORY\",\n  \"APPDATA\",\n  \"WINDIR\",\n  \"SYSDIR\",\n  \"PROGRAMFILES\",\n  \"PICTURES\",\n  \"PROFILE\",\n  \"\",\n  \"\",\n  \"COMMONFILES\",\n  \"\",\n  \"TEMPLATES\",\n  \"DOCUMENTS\",\n  \"ADMINTOOLS\",\n\n  \"ADMINTOOLS\",\n  \"\",\n  \"\",\n  \"\",\n  \"\",\n  \"MUSIC\",\n  \"PICTURES\",\n  \"VIDEO\",\n  \"RESOURCES\",\n  \"RESOURCES_LOCALIZED\",\n  \"\",\n  \"CDBURN_AREA\"\n};\n\nstatic const int kNumShellStrings = sizeof(kShellStrings) / sizeof(kShellStrings[0]);\n\n/*\n# define CMDLINE 20 // everything before here doesn't have trailing slash removal\n# define INSTDIR 21\n# define OUTDIR 22\n# define EXEDIR 23\n# define LANGUAGE 24\n# define TEMP   25\n# define PLUGINSDIR 26\n# define HWNDPARENT 27\n# define _CLICK 28\n# define _OUTDIR 29\n*/\n\nstatic const char *kVarStrings[] =\n{\n  \"CMDLINE\",\n  \"INSTDIR\",\n  \"OUTDIR\",\n  \"EXEDIR\",\n  \"LANGUAGE\",\n  \"TEMP\",\n  \"PLUGINSDIR\",\n  \"EXEPATH\", // test it\n  \"EXEFILE\", // test it\n  \"HWNDPARENT\",\n  \"_CLICK\",\n  \"_OUTDIR\"\n};\n\nstatic const int kNumVarStrings = sizeof(kVarStrings) / sizeof(kVarStrings[0]);\n\n\nstatic AString GetVar(UInt32 index)\n{\n  AString res = \"$\";\n  if (index < 10)\n    res += UIntToString(index);\n  else if (index < 20)\n  {\n    res += \"R\";\n    res += UIntToString(index - 10);\n  }\n  else if (index < 20 + kNumVarStrings)\n    res += kVarStrings[index - 20];\n  else\n  {\n    res += \"[\";\n    res += UIntToString(index);\n    res += \"]\";\n  }\n  return res;\n}\n\n#define NS_SKIP_CODE  252\n#define NS_VAR_CODE   253\n#define NS_SHELL_CODE 254\n#define NS_LANG_CODE  255\n#define NS_CODES_START NS_SKIP_CODE\n\nstatic AString GetShellString(int index)\n{\n  AString res = \"$\";\n  if (index < kNumShellStrings)\n  {\n    const char *sz = kShellStrings[index];\n    if (sz[0] != 0)\n      return res + sz;\n  }\n  res += \"SHELL[\";\n  res += UIntToString(index);\n  res += \"]\";\n  return res;\n}\n\n// Based on Dave Laundon's simplified process_string\nAString GetNsisString(const AString &s)\n{\n  AString res;\n  for (int i = 0; i < s.Length();)\n  {\n    unsigned char nVarIdx = s[i++];\n    if (nVarIdx > NS_CODES_START && i + 2 <= s.Length())\n    {\n      int nData = s[i++] & 0x7F;\n      unsigned char c1 = s[i++];\n      nData |= (((int)(c1 & 0x7F)) << 7);\n\n      if (nVarIdx == NS_SHELL_CODE)\n        res += GetShellString(c1);\n      else if (nVarIdx == NS_VAR_CODE)\n        res += GetVar(nData);\n      else if (nVarIdx == NS_LANG_CODE)\n        res += \"NS_LANG_CODE\";\n    }\n    else if (nVarIdx == NS_SKIP_CODE)\n    {\n      if (i < s.Length())\n        res += s[i++];\n    }\n    else // Normal char\n      res += (char)nVarIdx;\n  }\n  return res;\n}\n\nUString GetNsisString(const UString &s)\n{\n  UString res;\n  for (int i = 0; i < s.Length();)\n  {\n    wchar_t nVarIdx = s[i++];\n    if (nVarIdx > NS_UN_CODES_START && nVarIdx <= NS_UN_CODES_END)\n    {\n      if (i == s.Length())\n        break;\n      int nData = s[i++] & 0x7FFF;\n\n      if (nVarIdx == NS_UN_SHELL_CODE)\n        res += GetUnicodeString(GetShellString(nData >> 8));\n      else if (nVarIdx == NS_UN_VAR_CODE)\n        res += GetUnicodeString(GetVar(nData));\n      else if (nVarIdx == NS_UN_LANG_CODE)\n        res += L\"NS_LANG_CODE\";\n    }\n    else if (nVarIdx == NS_UN_SKIP_CODE)\n    {\n      if (i == s.Length())\n        break;\n      res += s[i++];\n    }\n    else // Normal char\n      res += (char)nVarIdx;\n  }\n  return res;\n}\n\nAString CInArchive::ReadString2A(UInt32 pos) const\n{\n  return GetNsisString(ReadStringA(pos));\n}\n\nUString CInArchive::ReadString2U(UInt32 pos) const\n{\n  return GetNsisString(ReadStringU(pos));\n}\n\nAString CInArchive::ReadString2(UInt32 pos) const\n{\n  if (IsUnicode)\n    return UnicodeStringToMultiByte(ReadString2U(pos));\n  else\n    return ReadString2A(pos);\n}\n\nAString CInArchive::ReadString2Qw(UInt32 pos) const\n{\n  return \"\\\"\" + ReadString2(pos) + \"\\\"\";\n}\n\n#define DEL_DIR 1\n#define DEL_RECURSE 2\n#define DEL_REBOOT 4\n// #define DEL_SIMPLE 8\n\nstatic const int kNumEntryParams = 6;\n\nstruct CEntry\n{\n  UInt32 Which;\n  UInt32 Params[kNumEntryParams];\n  AString GetParamsString(int numParams);\n  CEntry()\n  {\n    Which = 0;\n    for (UInt32 j = 0; j < kNumEntryParams; j++)\n      Params[j] = 0;\n  }\n};\n\nAString CEntry::GetParamsString(int numParams)\n{\n  AString s;\n  for (int i = 0; i < numParams; i++)\n  {\n    s += \" \";\n    UInt32 v = Params[i];\n    if (v > 0xFFF00000)\n      s += IntToString((Int32)Params[i]);\n    else\n      s += UIntToString(Params[i]);\n  }\n  return s;\n}\n\n#ifdef NSIS_SCRIPT\n\nstatic AString GetRegRootID(UInt32 val)\n{\n  const char *s;\n  switch(val)\n  {\n    case 0:  s = \"SHCTX\"; break;\n    case 0x80000000:  s = \"HKCR\"; break;\n    case 0x80000001:  s = \"HKCU\"; break;\n    case 0x80000002:  s = \"HKLM\"; break;\n    case 0x80000003:  s = \"HKU\";  break;\n    case 0x80000004:  s = \"HKPD\"; break;\n    case 0x80000005:  s = \"HKCC\"; break;\n    case 0x80000006:  s = \"HKDD\"; break;\n    case 0x80000050:  s = \"HKPT\"; break;\n    case 0x80000060:  s = \"HKPN\"; break;\n    default:\n      return UIntToString(val); break;\n  }\n  return s;\n}\n\n#endif\n\nHRESULT CInArchive::ReadEntries(const CBlockHeader &bh)\n{\n  _posInData = bh.Offset + GetOffset();\n  AString prefixA;\n  UString prefixU;\n  for (UInt32 i = 0; i < bh.Num; i++)\n  {\n    CEntry e;\n    e.Which = ReadUInt32();\n    for (UInt32 j = 0; j < kNumEntryParams; j++)\n      e.Params[j] = ReadUInt32();\n    #ifdef NSIS_SCRIPT\n    if (e.Which != EW_PUSHPOP && e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0]))\n    {\n      const CCommandPair &pair = kCommandPairs[e.Which];\n      Script += pair.Name;\n    }\n    #endif\n\n    switch (e.Which)\n    {\n      case EW_CREATEDIR:\n      {\n        if (IsUnicode)\n        {\n          prefixU.Empty();\n          prefixU = ReadString2U(e.Params[0]);\n        }\n        else\n        {\n          prefixA.Empty();\n          prefixA = ReadString2A(e.Params[0]);\n        }\n        #ifdef NSIS_SCRIPT\n        Script += \" \";\n        if (IsUnicode)\n          Script += UnicodeStringToMultiByte(prefixU);\n        else\n          Script += prefixA;\n        #endif\n        break;\n      }\n\n      case EW_EXTRACTFILE:\n      {\n        CItem item;\n        item.IsUnicode = IsUnicode;\n        if (IsUnicode)\n        {\n          item.PrefixU = prefixU;\n          item.NameU = ReadString2U(e.Params[1]);\n        }\n        else\n        {\n          item.PrefixA = prefixA;\n          item.NameA = ReadString2A(e.Params[1]);\n        }\n        /* UInt32 overwriteFlag = e.Params[0]; */\n        item.Pos = e.Params[2];\n        item.MTime.dwLowDateTime = e.Params[3];\n        item.MTime.dwHighDateTime = e.Params[4];\n        /* UInt32 allowIgnore = e.Params[5]; */\n        if (Items.Size() > 0)\n        {\n          /*\n          if (item.Pos == Items.Back().Pos)\n            continue;\n          */\n        }\n        Items.Add(item);\n        #ifdef NSIS_SCRIPT\n        Script += \" \";\n\n        if (IsUnicode)\n          Script += UnicodeStringToMultiByte(item.NameU);\n        else\n          Script += item.NameA;\n        #endif\n        break;\n      }\n\n\n      #ifdef NSIS_SCRIPT\n      case EW_UPDATETEXT:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += UIntToString(e.Params[1]);\n        break;\n      }\n      case EW_SETFILEATTRIBUTES:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += UIntToString(e.Params[1]);\n        break;\n      }\n      case EW_IFFILEEXISTS:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += UIntToString(e.Params[1]);\n        Script += \" \";\n        Script += UIntToString(e.Params[2]);\n        break;\n      }\n      case EW_RENAME:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += ReadString2(e.Params[1]);\n        Script += \" \";\n        Script += UIntToString(e.Params[2]);\n        break;\n      }\n      case EW_GETFULLPATHNAME:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += ReadString2(e.Params[1]);\n        Script += \" \";\n        Script += UIntToString(e.Params[2]);\n        break;\n      }\n      case EW_SEARCHPATH:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += ReadString2(e.Params[1]);\n        break;\n      }\n      case EW_GETTEMPFILENAME:\n      {\n        AString s;\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += ReadString2(e.Params[1]);\n        break;\n      }\n\n      case EW_DELETEFILE:\n      {\n        UInt64 flag = e.Params[1];\n        if (flag != 0)\n        {\n          Script += \" \";\n          if (flag == DEL_REBOOT)\n            Script += \"/REBOOTOK\";\n          else\n            Script += UIntToString(e.Params[1]);\n        }\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        break;\n      }\n      case EW_RMDIR:\n      {\n        UInt64 flag = e.Params[1];\n        if (flag != 0)\n        {\n          if ((flag & DEL_REBOOT) != 0)\n            Script += \" /REBOOTOK\";\n          if ((flag & DEL_RECURSE) != 0)\n            Script += \" /r\";\n        }\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        break;\n      }\n      case EW_STRLEN:\n      {\n        Script += \" \";\n        Script += GetVar(e.Params[0]);;\n        Script += \" \";\n        Script += ReadString2Qw(e.Params[1]);\n        break;\n      }\n      case EW_ASSIGNVAR:\n      {\n        Script += \" \";\n        Script += GetVar(e.Params[0]);;\n        Script += \" \";\n        Script += ReadString2Qw(e.Params[1]);\n        AString maxLen, startOffset;\n        if (e.Params[2] != 0)\n          maxLen = ReadString2(e.Params[2]);\n        if (e.Params[3] != 0)\n          startOffset = ReadString2(e.Params[3]);\n        if (!maxLen.IsEmpty() || !startOffset.IsEmpty())\n        {\n          Script += \" \";\n          if (maxLen.IsEmpty())\n            Script += \"\\\"\\\"\";\n          else\n            Script += maxLen;\n          if (!startOffset.IsEmpty())\n          {\n            Script += \" \";\n            Script += startOffset;\n          }\n        }\n        break;\n      }\n      case EW_STRCMP:\n      {\n        Script += \" \";\n\n        Script += \" \";\n        Script += ReadString2Qw(e.Params[0]);\n        \n        Script += \" \";\n        Script += ReadString2Qw(e.Params[1]);\n\n        for (int j = 2; j < 5; j++)\n        {\n          Script += \" \";\n          Script += UIntToString(e.Params[j]);\n        }\n        break;\n      }\n      case EW_INTCMP:\n      {\n        if (e.Params[5] != 0)\n          Script += \"U\";\n\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += ReadString2(e.Params[1]);\n\n        for (int i = 2; i < 5; i++)\n        {\n          Script += \" \";\n          Script += UIntToString(e.Params[i]);\n        }\n        break;\n      }\n      case EW_INTOP:\n      {\n        Script += \" \";\n        Script += GetVar(e.Params[0]);\n        Script += \" \";\n        int numOps = 2;\n        AString op;\n        switch (e.Params[3])\n        {\n          case 0: op = '+'; break;\n          case 1: op = '-'; break;\n          case 2: op = '*'; break;\n          case 3: op = '/'; break;\n          case 4: op = '|'; break;\n          case 5: op = '&'; break;\n          case 6: op = '^'; break;\n          case 7: op = '~'; numOps = 1; break;\n          case 8: op = '!'; numOps = 1; break;\n          case 9: op = \"||\"; break;\n          case 10: op = \"&&\"; break;\n          case 11: op = '%'; break;\n          default: op = UIntToString(e.Params[3]);\n        }\n        AString p1 = ReadString2(e.Params[1]);\n        if (numOps == 1)\n        {\n          Script += op;\n          Script += p1;\n        }\n        else\n        {\n          Script += p1;\n          Script += \" \";\n          Script += op;\n          Script += \" \";\n          Script += ReadString2(e.Params[2]);\n        }\n        break;\n      }\n\n      case EW_PUSHPOP:\n      {\n        int isPop = (e.Params[1] != 0);\n        if (isPop)\n        {\n          Script += \"Pop\";\n          Script += \" \";\n          Script += GetVar(e.Params[0]);;\n        }\n        else\n        {\n          int isExch = (e.Params[2] != 0);\n          if (isExch)\n          {\n            Script += \"Exch\";\n          }\n          else\n          {\n            Script += \"Push\";\n            Script += \" \";\n            Script += ReadString2(e.Params[0]);\n          }\n        }\n        break;\n      }\n\n      case EW_SENDMESSAGE:\n      {\n        // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2]\n        Script += \" \";\n        // Script += ReadString2(e.Params[0]);\n        // Script += \" \";\n        Script += ReadString2(e.Params[1]);\n        Script += \" \";\n        Script += ReadString2(e.Params[2]);\n        \n        Script += \" \";\n        UInt32 spec = e.Params[5];\n        // if (spec & 1)\n          Script += IntToString(e.Params[3]);\n        // else\n        //   Script += ReadString2(e.Params[3]);\n        \n        Script += \" \";\n        // if (spec & 2)\n          Script += IntToString(e.Params[4]);\n        // else\n        //   Script += ReadString2(e.Params[4]);\n\n        if ((Int32)e.Params[0] >= 0)\n        {\n          Script += \" \";\n          Script += GetVar(e.Params[1]);\n        }\n\n        spec >>= 2;\n        if (spec != 0)\n        {\n          Script += \" /TIMEOUT=\";\n          Script += IntToString(spec);\n        }\n        break;\n      }\n\n      case EW_GETDLGITEM:\n      {\n        Script += \" \";\n        Script += GetVar(e.Params[0]);;\n        Script += \" \";\n        Script += ReadString2(e.Params[1]);\n        Script += \" \";\n        Script += ReadString2(e.Params[2]);\n        break;\n     }\n\n\n      case EW_REGISTERDLL:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        Script += \" \";\n        Script += ReadString2(e.Params[1]);\n        Script += \" \";\n        Script += UIntToString(e.Params[2]);\n        break;\n      }\n\n      case EW_CREATESHORTCUT:\n      {\n        AString s;\n\n        Script += \" \";\n        Script += ReadString2Qw(e.Params[0]);\n\n        Script += \" \";\n        Script += ReadString2Qw(e.Params[1]);\n\n        for (int j = 2; j < 5; j++)\n        {\n          Script += \" \";\n          Script += UIntToString(e.Params[j]);\n        }\n        break;\n      }\n\n      /*\n      case EW_DELREG:\n      {\n        AString keyName, valueName;\n        keyName = ReadString2(e.Params[1]);\n        bool isValue = (e.Params[2] != -1);\n        if (isValue)\n        {\n          valueName = ReadString2(e.Params[2]);\n          Script += \"Key\";\n        }\n        else\n          Script += \"Value\";\n        Script += \" \";\n        Script += UIntToString(e.Params[0]);\n        Script += \" \";\n        Script += keyName;\n        if (isValue)\n        {\n          Script += \" \";\n          Script += valueName;\n        }\n        Script += \" \";\n        Script += UIntToString(e.Params[3]);\n        break;\n      }\n      */\n\n      case EW_WRITEREG:\n      {\n        AString s;\n        switch(e.Params[4])\n        {\n          case 1:  s = \"Str\"; break;\n          case 2:  s = \"ExpandStr\"; break;\n          case 3:  s = \"Bin\"; break;\n          case 4:  s = \"DWORD\"; break;\n          default: s = \"?\" + UIntToString(e.Params[4]); break;\n        }\n        Script += s;\n        Script += \" \";\n        Script += GetRegRootID(e.Params[0]);\n        Script += \" \";\n\n        AString keyName, valueName;\n        keyName = ReadString2Qw(e.Params[1]);\n        Script += keyName;\n        Script += \" \";\n        \n        valueName = ReadString2Qw(e.Params[2]);\n        Script += valueName;\n        Script += \" \";\n\n        valueName = ReadString2Qw(e.Params[3]);\n        Script += valueName;\n        Script += \" \";\n\n        break;\n      }\n\n      case EW_WRITEUNINSTALLER:\n      {\n        Script += \" \";\n        Script += ReadString2(e.Params[0]);\n        for (int j = 1; j < 3; j++)\n        {\n          Script += \" \";\n          Script += UIntToString(e.Params[j]);\n        }\n        break;\n      }\n\n      default:\n      {\n        int numParams = kNumEntryParams;\n        if (e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0]))\n        {\n          const CCommandPair &pair = kCommandPairs[e.Which];\n          // Script += pair.Name;\n          numParams = pair.NumParams;\n        }\n        else\n        {\n          Script += \"Unknown\";\n          Script += UIntToString(e.Which);\n        }\n        Script += e.GetParamsString(numParams);\n      }\n      #endif\n    }\n    #ifdef NSIS_SCRIPT\n    Script += kCrLf;\n    #endif\n  }\n\n  {\n    Items.Sort(CompareItems, 0);\n    int i;\n    // if (IsSolid)\n    for (i = 0; i + 1 < Items.Size();)\n    {\n      bool sameName = IsUnicode ?\n        (Items[i].NameU == Items[i + 1].NameU) :\n        (Items[i].NameA == Items[i + 1].NameA);\n      if (Items[i].Pos == Items[i + 1].Pos && (IsSolid || sameName))\n        Items.Delete(i + 1);\n      else\n        i++;\n    }\n    for (i = 0; i + 1 < Items.Size(); i++)\n    {\n      CItem &item = Items[i];\n      item.EstimatedSizeIsDefined = true;\n      item.EstimatedSize = Items[i + 1].Pos - item.Pos - 4;\n    }\n    if (!IsSolid)\n    {\n      for (i = 0; i < Items.Size(); i++)\n      {\n        CItem &item = Items[i];\n        RINOK(_stream->Seek(GetPosOfNonSolidItem(i), STREAM_SEEK_SET, NULL));\n        const UInt32 kSigSize = 4 + 1 + 5;\n        BYTE sig[kSigSize];\n        size_t processedSize = kSigSize;\n        RINOK(ReadStream(_stream, sig, &processedSize));\n        if (processedSize < 4)\n          return S_FALSE;\n        UInt32 size = Get32(sig);\n        if ((size & 0x80000000) != 0)\n        {\n          item.IsCompressed = true;\n          // is compressed;\n          size &= ~0x80000000;\n          if (Method == NMethodType::kLZMA)\n          {\n            if (processedSize < 9)\n              return S_FALSE;\n            if (FilterFlag)\n              item.UseFilter = (sig[4] != 0);\n            item.DictionarySize = Get32(sig + 5 + (FilterFlag ? 1 : 0));\n          }\n        }\n        else\n        {\n          item.IsCompressed = false;\n          item.Size = size;\n          item.SizeIsDefined = true;\n        }\n        item.CompressedSize = size;\n        item.CompressedSizeIsDefined = true;\n      }\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::Parse()\n{\n  // UInt32 offset = ReadUInt32();\n  // ???? offset == FirstHeader.HeaderLength\n  /* UInt32 ehFlags = */ ReadUInt32();\n  CBlockHeader bhPages, bhSections, bhEntries, bhStrings, bhLangTables, bhCtlColors, bhData;\n  // CBlockHeader bgFont;\n  ReadBlockHeader(bhPages);\n  ReadBlockHeader(bhSections);\n  ReadBlockHeader(bhEntries);\n  ReadBlockHeader(bhStrings);\n  ReadBlockHeader(bhLangTables);\n  ReadBlockHeader(bhCtlColors);\n  // ReadBlockHeader(bgFont);\n  ReadBlockHeader(bhData);\n\n  _stringsPos = bhStrings.Offset;\n  UInt32 pos = GetOffset() + _stringsPos;\n  int numZeros0 = 0;\n  int numZeros1 = 0;\n  int i;\n  const int kBlockSize = 256;\n  for (i = 0; i < kBlockSize; i++)\n  {\n    if (pos >= _size || pos + 1 >= _size)\n      break;\n    char c0 = _data[pos++];\n    char c1 = _data[pos++];\n    wchar_t c = (c0 | ((wchar_t)c1 << 8));\n\n    if (c >= NS_UN_CODES_START && c < NS_UN_CODES_END)\n    {\n      if (pos >= _size || pos + 1 >= _size)\n        break;\n      pos += 2;\n      numZeros1++;\n    }\n    else\n    {\n      if (c0 == 0 && c1 != 0)\n        numZeros0++;\n      if (c1 == 0)\n        numZeros1++;\n    }\n    // printf(\"\\nnumZeros0 = %2x %2x\", _data[pos + 0],  _data[pos + 1]);\n  }\n  IsUnicode = (numZeros1 > numZeros0 * 3 + kBlockSize / 16);\n  // printf(\"\\nnumZeros0 = %3d    numZeros1 = %3d\", numZeros0,  numZeros1);\n  return ReadEntries(bhEntries);\n}\n\nstatic bool IsLZMA(const Byte *p, UInt32 &dictionary)\n{\n  dictionary = Get32(p + 1);\n  return (p[0] == 0x5D && p[1] == 0x00 && p[2] == 0x00 && p[5] == 0x00);\n}\n\nstatic bool IsLZMA(const Byte *p, UInt32 &dictionary, bool &thereIsFlag)\n{\n  if (IsLZMA(p, dictionary))\n  {\n    thereIsFlag = false;\n    return true;\n  }\n  if (IsLZMA(p + 1, dictionary))\n  {\n    thereIsFlag = true;\n    return true;\n  }\n  return false;\n}\n\nHRESULT CInArchive::Open2(\n      DECL_EXTERNAL_CODECS_LOC_VARS2\n      )\n{\n  RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &StreamOffset));\n\n  const UInt32 kSigSize = 4 + 1 + 5 + 1; // size, flag, lzma props, lzma first byte\n  BYTE sig[kSigSize];\n  RINOK(ReadStream_FALSE(_stream, sig, kSigSize));\n  UInt64 position;\n  RINOK(_stream->Seek(StreamOffset, STREAM_SEEK_SET, &position));\n\n  _headerIsCompressed = true;\n  IsSolid = true;\n  FilterFlag = false;\n\n  UInt32 compressedHeaderSize = Get32(sig);\n  \n  if (compressedHeaderSize == FirstHeader.HeaderLength)\n  {\n    _headerIsCompressed = false;\n    IsSolid = false;\n    Method = NMethodType::kCopy;\n  }\n  else if (IsLZMA(sig, DictionarySize, FilterFlag))\n  {\n    Method = NMethodType::kLZMA;\n  }\n  else if (IsLZMA(sig + 4, DictionarySize, FilterFlag))\n  {\n    IsSolid = false;\n    Method = NMethodType::kLZMA;\n  }\n  else if (sig[3] == 0x80)\n  {\n    IsSolid = false;\n    Method = NMethodType::kDeflate;\n  }\n  else\n  {\n    Method = NMethodType::kDeflate;\n  }\n\n  _posInData = 0;\n  if (!IsSolid)\n  {\n    _headerIsCompressed = ((compressedHeaderSize & 0x80000000) != 0);\n    if (_headerIsCompressed)\n      compressedHeaderSize &= ~0x80000000;\n    _nonSolidStartOffset = compressedHeaderSize;\n    RINOK(_stream->Seek(StreamOffset + 4, STREAM_SEEK_SET, NULL));\n  }\n  UInt32 unpackSize = FirstHeader.HeaderLength;\n  if (_headerIsCompressed)\n  {\n    // unpackSize = (1 << 23);\n    _data.SetCapacity(unpackSize);\n    RINOK(Decoder.Init(\n        EXTERNAL_CODECS_LOC_VARS\n        _stream, Method, FilterFlag, UseFilter));\n    size_t processedSize = unpackSize;\n    RINOK(Decoder.Read(_data, &processedSize));\n    if (processedSize != unpackSize)\n      return S_FALSE;\n    _size = processedSize;\n    if (IsSolid)\n    {\n      UInt32 size2 = ReadUInt32();\n      if (size2 < _size)\n        _size = size2;\n    }\n  }\n  else\n  {\n    _data.SetCapacity(unpackSize);\n    _size = (size_t)unpackSize;\n    RINOK(ReadStream_FALSE(_stream, (Byte *)_data, unpackSize));\n  }\n  return Parse();\n}\n\n/*\nNsisExe =\n{\n  ExeStub\n  Archive  // must start from 512 * N\n  #ifndef NSIS_CONFIG_CRC_ANAL\n  {\n    Some additional data\n  }\n}\n\nArchive\n{\n  FirstHeader\n  Data\n  #ifdef NSIS_CONFIG_CRC_SUPPORT && FirstHeader.ThereIsCrc()\n  {\n    CRC\n  }\n}\n\nFirstHeader\n{\n  UInt32 Flags;\n  Byte Signature[16];\n  // points to the header+sections+entries+stringtable in the datablock\n  UInt32 HeaderLength;\n  UInt32 ArchiveSize;\n}\n*/\n\nHRESULT CInArchive::Open(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    IInStream *inStream, const UInt64 *maxCheckStartPosition)\n{\n  Clear();\n  RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));\n  UInt64 maxSize = ((maxCheckStartPosition != 0) ? *maxCheckStartPosition : 0);\n  const UInt32 kStep = 512;\n  Byte buffer[kStep];\n  \n  UInt64 position = 0;\n  for (; position <= maxSize; position += kStep)\n  {\n    RINOK(ReadStream_FALSE(inStream, buffer, kStep));\n    if (memcmp(buffer + 4, kSignature, kSignatureSize) == 0)\n      break;\n  }\n  if (position > maxSize)\n    return S_FALSE;\n  const UInt32 kStartHeaderSize = 4 * 7;\n  RINOK(inStream->Seek(0, STREAM_SEEK_END, &_archiveSize));\n  RINOK(inStream->Seek(position + kStartHeaderSize, STREAM_SEEK_SET, 0));\n  FirstHeader.Flags = Get32(buffer);\n  FirstHeader.HeaderLength = Get32(buffer + kSignatureSize + 4);\n  FirstHeader.ArchiveSize = Get32(buffer + kSignatureSize + 8);\n  if (_archiveSize - position < FirstHeader.ArchiveSize)\n    return S_FALSE;\n\n  try\n  {\n    _stream = inStream;\n    HRESULT res = Open2(EXTERNAL_CODECS_LOC_VARS2);\n    if (res != S_OK)\n      Clear();\n    _stream.Release();\n    return res;\n  }\n  catch(...) { Clear(); return S_FALSE; }\n}\n\nvoid CInArchive::Clear()\n{\n  #ifdef NSIS_SCRIPT\n  Script.Empty();\n  #endif\n  Items.Clear();\n  _stream.Release();\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Nsis/NsisIn.h",
    "content": "// Archive/NsisIn.h\n\n#ifndef __ARCHIVE_NSIS_IN_H\n#define __ARCHIVE_NSIS_IN_H\n\n#include \"Common/Buffer.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/MyCom.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\n#include \"../../IStream.h\"\n\n#include \"NsisDecode.h\"\n\n// #define NSIS_SCRIPT\n\nnamespace NArchive {\nnamespace NNsis {\n\nconst int kSignatureSize = 16;\nextern Byte kSignature[kSignatureSize];\n\nconst UInt32 kFlagsMask = 0xF;\nnamespace NFlags\n{\n  const UInt32 kUninstall = 1;\n  const UInt32 kSilent = 2;\n  const UInt32 kNoCrc = 4;\n  const UInt32 kForceCrc = 8;\n}\n\nstruct CFirstHeader\n{\n  UInt32 Flags;\n  UInt32 HeaderLength;\n \n  UInt32 ArchiveSize;\n\n  bool ThereIsCrc() const\n  {\n    if ((Flags & NFlags::kForceCrc ) != 0)\n      return true;\n    return ((Flags & NFlags::kNoCrc) == 0);\n  }\n\n  UInt32 GetDataSize() const { return ArchiveSize - (ThereIsCrc() ? 4 : 0); }\n};\n\n\nstruct CBlockHeader\n{\n  UInt32 Offset;\n  UInt32 Num;\n};\n\nstruct CItem\n{\n  AString PrefixA;\n  UString PrefixU;\n  AString NameA;\n  UString NameU;\n  FILETIME MTime;\n  bool IsUnicode;\n  bool UseFilter;\n  bool IsCompressed;\n  bool SizeIsDefined;\n  bool CompressedSizeIsDefined;\n  bool EstimatedSizeIsDefined;\n  UInt32 Pos;\n  UInt32 Size;\n  UInt32 CompressedSize;\n  UInt32 EstimatedSize;\n  UInt32 DictionarySize;\n  \n  CItem(): IsUnicode(false), UseFilter(false), IsCompressed(true), SizeIsDefined(false),\n      CompressedSizeIsDefined(false), EstimatedSizeIsDefined(false), Size(0) {}\n\n  bool IsINSTDIR() const\n  {\n    return (PrefixA.Length() >= 3 || PrefixU.Length() >= 3);\n  }\n\n  UString GetReducedName(bool unicode) const\n  {\n    UString s;\n    if (unicode)\n      s = PrefixU;\n    else\n      s = MultiByteToUnicodeString(PrefixA);\n    if (s.Length() > 0)\n      if (s[s.Length() - 1] != L'\\\\')\n        s += L'\\\\';\n    if (unicode)\n      s += NameU;\n    else\n      s += MultiByteToUnicodeString(NameA);\n    const int len = 9;\n    if (s.Left(len).CompareNoCase(L\"$INSTDIR\\\\\") == 0)\n      s = s.Mid(len);\n    return s;\n  }\n};\n\nclass CInArchive\n{\n  UInt64 _archiveSize;\n  CMyComPtr<IInStream> _stream;\n\n  Byte ReadByte();\n  UInt32 ReadUInt32();\n  HRESULT Open2(\n      DECL_EXTERNAL_CODECS_LOC_VARS2\n      );\n  void ReadBlockHeader(CBlockHeader &bh);\n  AString ReadStringA(UInt32 pos) const;\n  UString ReadStringU(UInt32 pos) const;\n  AString ReadString2A(UInt32 pos) const;\n  UString ReadString2U(UInt32 pos) const;\n  AString ReadString2(UInt32 pos) const;\n  AString ReadString2Qw(UInt32 pos) const;\n  HRESULT ReadEntries(const CBlockHeader &bh);\n  HRESULT Parse();\n\n  CByteBuffer _data;\n  UInt64 _size;\n\n  size_t _posInData;\n\n  UInt32 _stringsPos;\n\n\n  bool _headerIsCompressed;\n  UInt32 _nonSolidStartOffset;\npublic:\n  HRESULT Open(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      IInStream *inStream, const UInt64 *maxCheckStartPosition);\n  void Clear();\n\n  UInt64 StreamOffset;\n  CDecoder Decoder;\n  CObjectVector<CItem> Items;\n  CFirstHeader FirstHeader;\n  NMethodType::EEnum Method;\n  UInt32 DictionarySize;\n  bool IsSolid;\n  bool UseFilter;\n  bool FilterFlag;\n  bool IsUnicode;\n\n  #ifdef NSIS_SCRIPT\n  AString Script;\n  #endif\n  UInt32 GetOffset() const { return IsSolid ? 4 : 0; }\n  UInt64 GetDataPos(int index)\n  {\n    const CItem &item = Items[index];\n    return GetOffset() + FirstHeader.HeaderLength + item.Pos;\n  }\n\n  UInt64 GetPosOfSolidItem(int index) const\n  {\n    const CItem &item = Items[index];\n    return 4 + FirstHeader.HeaderLength + item.Pos;\n  }\n  \n  UInt64 GetPosOfNonSolidItem(int index) const\n  {\n    const CItem &item = Items[index];\n    return StreamOffset + _nonSolidStartOffset + 4  + item.Pos;\n  }\n\n  void Release()\n  {\n    Decoder.Release();\n  }\n\n};\n\n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Nsis/NsisRegister.cpp",
    "content": "// NsisRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"NsisHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NNsis::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Nsis\", 0, 0, 0x9, { 0xEF, 0xBE, 0xAD, 0xDE,\n0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74}, 16, false, CreateArc, 0 };\n\nREGISTER_ARC(Nsis)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/PeHandler.cpp",
    "content": "// PeHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/Buffer.h\"\n#include \"Common/ComTry.h\"\n#include \"Common/IntToString.h\"\n\n#include \"Windows/PropVariantUtils.h\"\n#include \"Windows/Time.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/CopyCoder.h\"\n\n#include \"Common/DummyOutStream.h\"\n\n#define Get16(p) GetUi16(p)\n#define Get32(p) GetUi32(p)\n#define Get64(p) GetUi64(p)\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NPe {\n\n#define NUM_SCAN_SECTIONS_MAX (1 << 6)\n\n#define PE_SIG 0x00004550\n#define PE_OptHeader_Magic_32 0x10B\n#define PE_OptHeader_Magic_64 0x20B\n\nstatic AString GetDecString(UInt32 v)\n{\n  char sz[32];\n  ConvertUInt64ToString(v, sz);\n  return sz;\n}\n\nstruct CVersion\n{\n  UInt16 Major;\n  UInt16 Minor;\n\n  void Parse(const Byte *buf);\n  AString GetString() const { return GetDecString(Major) + '.' + GetDecString(Minor); }\n};\n\nvoid CVersion::Parse(const Byte *p)\n{\n  Major = Get16(p);\n  Minor = Get16(p + 2);\n}\n\nstatic const UInt32 kHeaderSize =  4 + 20;\n\nstruct CHeader\n{\n  UInt16 NumSections;\n  UInt32 Time;\n  UInt32 PointerToSymbolTable;\n  UInt32 NumSymbols;\n  UInt16 OptHeaderSize;\n  UInt16 Flags;\n  UInt16 Machine;\n\n  bool Parse(const Byte *buf);\n};\n\nbool CHeader::Parse(const Byte *p)\n{\n  if (Get32(p) != PE_SIG)\n    return false;\n  p += 4;\n  Machine = Get16(p + 0);\n  NumSections = Get16(p + 2);\n  Time = Get32(p + 4);\n  PointerToSymbolTable = Get32(p + 8);\n  NumSymbols = Get32(p + 12);\n  OptHeaderSize = Get16(p + 16);\n  Flags = Get16(p + 18);\n  return true;\n}\n\nstruct CDirLink\n{\n  UInt32 Va;\n  UInt32 Size;\n  void Parse(const Byte *p);\n};\n\nvoid CDirLink::Parse(const Byte *p)\n{\n  Va = Get32(p);\n  Size = Get32(p + 4);\n};\n\nenum\n{\n  kDirLink_Certificate = 4,\n  kDirLink_Debug = 6\n};\n\nstruct CDebugEntry\n{\n  UInt32 Flags;\n  UInt32 Time;\n  CVersion Ver;\n  UInt32 Type;\n  UInt32 Size;\n  UInt32 Va;\n  UInt32 Pa;\n  \n  void Parse(const Byte *p);\n};\n\nvoid CDebugEntry::Parse(const Byte *p)\n{\n  Flags = Get32(p);\n  Time = Get32(p + 4);\n  Ver.Parse(p + 8);\n  Type = Get32(p + 12);\n  Size = Get32(p + 16);\n  Va = Get32(p + 20);\n  Pa = Get32(p + 24);\n}\n\nstatic const UInt32 kNumDirItemsMax = 16;\n\nstruct COptHeader\n{\n  UInt16 Magic;\n  Byte LinkerVerMajor;\n  Byte LinkerVerMinor;\n\n  UInt32 CodeSize;\n  UInt32 InitDataSize;\n  UInt32 UninitDataSize;\n  \n  // UInt32 AddressOfEntryPoint;\n  // UInt32 BaseOfCode;\n  // UInt32 BaseOfData32;\n  // UInt64 ImageBase;\n\n  UInt32 SectAlign;\n  UInt32 FileAlign;\n\n  CVersion OsVer;\n  CVersion ImageVer;\n  CVersion SubsysVer;\n  \n  UInt32 ImageSize;\n  UInt32 HeadersSize;\n  UInt32 CheckSum;\n  UInt16 SubSystem;\n  UInt16 DllCharacts;\n\n  UInt64 StackReserve;\n  UInt64 StackCommit;\n  UInt64 HeapReserve;\n  UInt64 HeapCommit;\n\n  UInt32 NumDirItems;\n  CDirLink DirItems[kNumDirItemsMax];\n\n  bool Is64Bit() const { return Magic == PE_OptHeader_Magic_64; }\n  bool Parse(const Byte *p, UInt32 size);\n};\n\nbool COptHeader::Parse(const Byte *p, UInt32 size)\n{\n  Magic = Get16(p);\n  switch (Magic)\n  {\n    case PE_OptHeader_Magic_32:\n    case PE_OptHeader_Magic_64:\n      break;\n    default:\n      return false;\n  }\n  LinkerVerMajor = p[2];\n  LinkerVerMinor = p[3];\n  \n  bool hdr64 = Is64Bit();\n  \n  CodeSize = Get32(p + 4);\n  InitDataSize = Get32(p + 8);\n  UninitDataSize = Get32(p + 12);\n\n  // AddressOfEntryPoint = Get32(p + 16);\n  // BaseOfCode = Get32(p + 20);\n  // BaseOfData32 = Get32(p + 24);\n  // ImageBase = hdr64 ? GetUi64(p + 24) :Get32(p + 28);\n\n  SectAlign = Get32(p + 32);\n  FileAlign = Get32(p + 36);\n\n  OsVer.Parse(p + 40);\n  ImageVer.Parse(p + 44);\n  SubsysVer.Parse(p + 48);\n\n  // reserved = Get32(p + 52);\n\n  ImageSize = Get32(p + 56);\n  HeadersSize = Get32(p + 60);\n  CheckSum = Get32(p + 64);\n  SubSystem = Get16(p + 68);\n  DllCharacts = Get16(p + 70);\n\n  if (hdr64)\n  {\n    StackReserve = Get64(p + 72);\n    StackCommit = Get64(p + 80);\n    HeapReserve = Get64(p + 88);\n    HeapCommit = Get64(p + 96);\n  }\n  else\n  {\n    StackReserve = Get32(p + 72);\n    StackCommit = Get32(p + 76);\n    HeapReserve = Get32(p + 80);\n    HeapCommit = Get32(p + 84);\n  }\n  UInt32 pos = (hdr64 ? 108 : 92);\n  NumDirItems = Get32(p + pos);\n  pos += 4;\n  if (pos + 8 * NumDirItems != size)\n    return false;\n  for (UInt32 i = 0; i < NumDirItems && i < kNumDirItemsMax; i++)\n    DirItems[i].Parse(p + pos + i * 8);\n  return true;\n}\n\nstatic const UInt32 kSectionSize = 40;\n\nstruct CSection\n{\n  AString Name;\n\n  UInt32 VSize;\n  UInt32 Va;\n  UInt32 PSize;\n  UInt32 Pa;\n  UInt32 Flags;\n  UInt32 Time;\n  // UInt16 NumRelocs;\n  bool IsDebug;\n  bool IsRealSect;\n\n  CSection(): IsRealSect(false), IsDebug(false) {}\n  UInt64 GetPackSize() const { return PSize; }\n\n  void UpdateTotalSize(UInt32 &totalSize)\n  {\n    UInt32 t = Pa + PSize;\n    if (t > totalSize)\n      totalSize = t;\n  }\n  void Parse(const Byte *p);\n};\n\nstatic bool operator <(const CSection &a1, const CSection &a2) { return (a1.Pa < a2.Pa); }\nstatic bool operator ==(const CSection &a1, const CSection &a2) { return (a1.Pa == a2.Pa); }\n\nstatic AString GetName(const Byte *name)\n{\n  const int kNameSize = 8;\n  AString res;\n  char *p = res.GetBuffer(kNameSize);\n  memcpy(p, name, kNameSize);\n  p[kNameSize] = 0;\n  res.ReleaseBuffer();\n  return res;\n}\n\nvoid CSection::Parse(const Byte *p)\n{\n  Name = GetName(p);\n  VSize = Get32(p + 8);\n  Va = Get32(p + 12);\n  PSize = Get32(p + 16);\n  Pa = Get32(p + 20);\n  // NumRelocs = Get16(p + 32);\n  Flags = Get32(p + 36);\n}\n\nstatic const CUInt32PCharPair g_HeaderCharacts[] =\n{\n  { 1 << 1, \"Executable\" },\n  { 1 << 13, \"DLL\" },\n  { 1 << 8, \"32-bit\" },\n  { 1 << 5, \"LargeAddress\" },\n  { 1 << 0, \"NoRelocs\" },\n  { 1 << 2, \"NoLineNums\" },\n  { 1 << 3, \"NoLocalSyms\" },\n  { 1 << 4, \"AggressiveWsTrim\" },\n  { 1 << 9, \"NoDebugInfo\" },\n  { 1 << 10, \"RemovableRun\" },\n  { 1 << 11, \"NetRun\" },\n  { 1 << 12, \"System\" },\n  { 1 << 14, \"UniCPU\" },\n  { 1 << 7, \"Little-Endian\" },\n  { 1 << 15, \"Big-Endian\" }\n};\n\nstatic const CUInt32PCharPair g_DllCharacts[] =\n{\n  { 1 << 6, \"Relocated\" },\n  { 1 << 7, \"Integrity\" },\n  { 1 << 8, \"NX-Compatible\" },\n  { 1 << 9, \"NoIsolation\" },\n  { 1 << 10, \"NoSEH\" },\n  { 1 << 11, \"NoBind\" },\n  { 1 << 13, \"WDM\" },\n  { 1 << 15, \"TerminalServerAware\" }\n};\n\nstatic const CUInt32PCharPair g_SectFlags[] =\n{\n  { 1 << 3, \"NoPad\" },\n  { 1 << 5, \"Code\" },\n  { 1 << 6, \"InitializedData\" },\n  { 1 << 7, \"UninitializedData\" },\n  { 1 << 9, \"Comments\" },\n  { 1 << 11, \"Remove\" },\n  { 1 << 12, \"COMDAT\" },\n  { 1 << 15, \"GP\" },\n  { 1 << 24, \"ExtendedRelocations\" },\n  { 1 << 25, \"Discardable\" },\n  { 1 << 26, \"NotCached\" },\n  { 1 << 27, \"NotPaged\" },\n  { 1 << 28, \"Shared\" },\n  { 1 << 29, \"Execute\" },\n  { 1 << 30, \"Read\" },\n  { (UInt32)1 << 31, \"Write\" }\n};\n\nstatic const CUInt32PCharPair g_MachinePairs[] =\n{\n  { 0x014C, \"x86\" },\n  { 0x0162, \"MIPS-R3000\" },\n  { 0x0166, \"MIPS-R4000\" },\n  { 0x0168, \"MIPS-R10000\" },\n  { 0x0169, \"MIPS-V2\" },\n  { 0x0184, \"Alpha\" },\n  { 0x01A2, \"SH3\" },\n  { 0x01A3, \"SH3-DSP\" },\n  { 0x01A4, \"SH3E\" },\n  { 0x01A6, \"SH4\" },\n  { 0x01A8, \"SH5\" },\n  { 0x01C0, \"ARM\" },\n  { 0x01C2, \"ARM-Thumb\" },\n  { 0x01F0, \"PPC\" },\n  { 0x01F1, \"PPC-FP\" },\n  { 0x0200, \"IA-64\" },\n  { 0x0284, \"Alpha-64\" },\n  { 0x0200, \"IA-64\" },\n  { 0x0366, \"MIPSFPU\" },\n  { 0x8664, \"x64\" },\n  { 0x0EBC, \"EFI\" }\n};\n\nstatic const CUInt32PCharPair g_SubSystems[] =\n{\n  { 0, \"Unknown\" },\n  { 1, \"Native\" },\n  { 2, \"Windows GUI\" },\n  { 3, \"Windows CUI\" },\n  { 7, \"Posix\" },\n  { 9, \"Windows CE\" },\n  { 10, \"EFI\" },\n  { 11, \"EFI Boot\" },\n  { 12, \"EFI Runtime\" },\n  { 13, \"EFI ROM\" },\n  { 14, \"XBOX\" }\n};\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _inStream;\n  CObjectVector<CSection> _sections;\n  UInt32 _peOffset;\n  CHeader _header;\n  COptHeader _optHeader;\n  UInt32 _totalSize;\n  UInt32 _totalSizeLimited;\n  HRESULT LoadDebugSections(IInStream *stream, bool &thereIsSection);\n  HRESULT Open2(IInStream *stream);\n  bool Parse(const Byte *buf, UInt32 size);\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\nbool CHandler::Parse(const Byte *buf, UInt32 size)\n{\n  UInt32 i;\n  if (size < 512)\n    return false;\n  _peOffset = Get32(buf + 0x3C);\n  if (_peOffset >= 0x1000 || _peOffset + 512 > size || (_peOffset & 7) != 0)\n    return false;\n\n  UInt32 pos = _peOffset;\n  if (!_header.Parse(buf + pos))\n    return false;\n  if (_header.OptHeaderSize > 512 || _header.NumSections > NUM_SCAN_SECTIONS_MAX)\n    return false;\n  pos += kHeaderSize;\n\n  if (!_optHeader.Parse(buf + pos, _header.OptHeaderSize))\n    return false;\n\n  pos += _header.OptHeaderSize;\n  _totalSize = pos;\n\n  for (i = 0; i < _header.NumSections; i++, pos += kSectionSize)\n  {\n    CSection sect;\n    if (pos + kSectionSize > size)\n      return false;\n    sect.Parse(buf + pos);\n    sect.IsRealSect = true;\n    sect.UpdateTotalSize(_totalSize);\n    _sections.Add(sect);\n  }\n\n  return true;\n}\n\nenum\n{\n  kpidSectAlign = kpidUserDefined,\n  kpidFileAlign,\n  kpidLinkerVer,\n  kpidOsVer,\n  kpidImageVer,\n  kpidSubsysVer,\n  kpidCodeSize,\n  kpidImageSize,\n  kpidInitDataSize,\n  kpidUnInitDataSize,\n  kpidHeadersSizeUnInitDataSize,\n  kpidSubSystem,\n  kpidDllCharacts,\n  kpidStackReserve,\n  kpidStackCommit,\n  kpidHeapReserve,\n  kpidHeapCommit,\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidCpu, VT_BSTR},\n  { NULL, kpidBit64, VT_BOOL},\n  { NULL, kpidCharacts, VT_BSTR},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidPhySize, VT_UI4},\n  { NULL, kpidHeadersSize, VT_UI4},\n  { NULL, kpidChecksum, VT_UI4},\n  { L\"Image Size\", kpidImageSize, VT_UI4},\n  { L\"Section Alignment\", kpidSectAlign, VT_UI4},\n  { L\"File Alignment\", kpidFileAlign, VT_UI4},\n  { L\"Code Size\", kpidCodeSize, VT_UI4},\n  { L\"Initialized Data Size\", kpidInitDataSize, VT_UI4},\n  { L\"Uninitialized Data Size\", kpidUnInitDataSize, VT_UI4},\n  { L\"Linker Version\", kpidLinkerVer, VT_BSTR},\n  { L\"OS Version\", kpidOsVer, VT_BSTR},\n  { L\"Image Version\", kpidImageVer, VT_BSTR},\n  { L\"Subsystem Version\", kpidSubsysVer, VT_BSTR},\n  { L\"Subsystem\", kpidSubSystem, VT_BSTR},\n  { L\"DLL Characteristics\", kpidDllCharacts, VT_BSTR},\n  { L\"Stack Reserve\", kpidStackReserve, VT_UI8},\n  { L\"Stack Commit\", kpidStackCommit, VT_UI8},\n  { L\"Heap Reserve\", kpidHeapReserve, VT_UI8},\n  { L\"Heap Commit\", kpidHeapCommit, VT_UI8},\n };\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidCharacts, VT_BSTR},\n  { NULL, kpidOffset, VT_UI8},\n  { NULL, kpidVa, VT_UI8}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_WITH_NAME\n\nstatic void VerToProp(const CVersion &v, NCOM::CPropVariant &prop)\n{\n  StringToProp(v.GetString(), prop);\n}\n\nvoid TimeToProp(UInt32 unixTime, NCOM::CPropVariant &prop)\n{\n  if (unixTime != 0)\n  {\n    FILETIME ft;\n    NTime::UnixTimeToFileTime(unixTime, ft);\n    prop = ft;\n  }\n}\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidSectAlign: prop = _optHeader.SectAlign; break;\n    case kpidFileAlign: prop = _optHeader.FileAlign; break;\n    case kpidLinkerVer:\n    {\n      CVersion v = { _optHeader.LinkerVerMajor, _optHeader.LinkerVerMinor };\n      VerToProp(v, prop); break;\n      break;\n    }\n  \n    case kpidOsVer:  VerToProp(_optHeader.OsVer, prop); break;\n    case kpidImageVer:  VerToProp(_optHeader.ImageVer, prop); break;\n    case kpidSubsysVer:  VerToProp(_optHeader.SubsysVer, prop); break;\n    case kpidCodeSize:  prop = _optHeader.CodeSize; break;\n    case kpidInitDataSize:  prop = _optHeader.InitDataSize; break;\n    case kpidUnInitDataSize:  prop = _optHeader.UninitDataSize; break;\n    case kpidImageSize:  prop = _optHeader.ImageSize; break;\n    case kpidPhySize:  prop = _totalSize; break;\n    case kpidHeadersSize:  prop = _optHeader.HeadersSize; break;\n    case kpidChecksum:  prop = _optHeader.CheckSum; break;\n      \n    case kpidCpu:  PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break;\n    case kpidBit64:  if (_optHeader.Is64Bit()) prop = true; break;\n    case kpidSubSystem:  PAIR_TO_PROP(g_SubSystems, _optHeader.SubSystem, prop); break;\n\n    case kpidMTime:\n    case kpidCTime:  TimeToProp(_header.Time, prop); break;\n    case kpidCharacts:  FLAGS_TO_PROP(g_HeaderCharacts, _header.Flags, prop); break;\n    case kpidDllCharacts:  FLAGS_TO_PROP(g_DllCharacts, _optHeader.DllCharacts, prop); break;\n    case kpidStackReserve: prop = _optHeader.StackReserve; break;\n    case kpidStackCommit: prop = _optHeader.StackCommit; break;\n    case kpidHeapReserve: prop = _optHeader.HeapReserve; break;\n    case kpidHeapCommit: prop = _optHeader.HeapCommit; break;\n\n    /*\n    if (_optHeader.Is64Bit())\n      s += \" 64-bit\";\n    */\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  const CSection &item = _sections[index];\n  switch(propID)\n  {\n    case kpidPath:  StringToProp(item.Name, prop); break;\n    case kpidSize:  prop = (UInt64)item.VSize; break;\n    case kpidPackSize:  prop = (UInt64)item.GetPackSize(); break;\n    case kpidOffset:  prop = item.Pa; break;\n    case kpidVa:  if (item.IsRealSect) prop = item.Va; break;\n    case kpidMTime:\n    case kpidCTime:\n      TimeToProp(item.IsDebug ? item.Time : _header.Time, prop); break;\n    case kpidCharacts:  if (item.IsRealSect) FLAGS_TO_PROP(g_SectFlags, item.Flags, prop); break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nHRESULT CHandler::LoadDebugSections(IInStream *stream, bool &thereIsSection)\n{\n  thereIsSection = false;\n  const CDirLink &debugLink = _optHeader.DirItems[kDirLink_Debug];\n  if (debugLink.Size == 0)\n    return S_OK;\n  const unsigned kEntrySize = 28;\n  UInt32 numItems = debugLink.Size / kEntrySize;\n  if (numItems * kEntrySize != debugLink.Size || numItems > 16)\n    return S_FALSE;\n  \n  UInt64 pa = 0;\n  int i;\n  for (i = 0; i < _sections.Size(); i++)\n  {\n    const CSection &sect = _sections[i];\n    if (sect.Va < debugLink.Va && debugLink.Va + debugLink.Size <= sect.Va + sect.PSize)\n    {\n      pa = sect.Pa + (debugLink.Va - sect.Va);\n      break;\n    }\n  }\n  if (i == _sections.Size())\n  {\n    return S_OK;\n    // Exe for ARM requires S_OK\n    // return S_FALSE;\n  }\n  \n  CByteBuffer buffer;\n  buffer.SetCapacity(debugLink.Size);\n  Byte *buf = buffer;\n  \n  RINOK(stream->Seek(pa, STREAM_SEEK_SET, NULL));\n  RINOK(ReadStream_FALSE(stream, buf, debugLink.Size));\n\n  for (i = 0; i < (int)numItems; i++)\n  {\n    CDebugEntry de;\n    de.Parse(buf);\n\n    if (de.Size == 0)\n      continue;\n    \n    CSection sect;\n    sect.Name = \".debug\" + GetDecString(i);\n    \n    sect.IsDebug = true;\n    sect.Time = de.Time;\n    sect.Va = de.Va;\n    sect.Pa = de.Pa;\n    sect.PSize = sect.VSize = de.Size;\n    UInt32 totalSize = sect.Pa + sect.PSize;\n    if (totalSize > _totalSize)\n    {\n      _totalSize = totalSize;\n      _sections.Add(sect);\n      thereIsSection = true;\n    }\n    buf += kEntrySize;\n  }\n\n  return S_OK;\n}\n\nHRESULT CHandler::Open2(IInStream *stream)\n{\n  const UInt32 kBufSize = 1 << 18;\n  const UInt32 kSigSize = 2;\n\n  CByteBuffer buffer;\n  buffer.SetCapacity(kBufSize);\n  Byte *buf = buffer;\n\n  size_t processed = kSigSize;\n  RINOK(ReadStream_FALSE(stream, buf, processed));\n  if (buf[0] != 'M' || buf[1] != 'Z')\n    return S_FALSE;\n  processed = kBufSize - kSigSize;\n  RINOK(ReadStream(stream, buf + kSigSize, &processed));\n  processed += kSigSize;\n  if (!Parse(buf, (UInt32)processed))\n    return S_FALSE;\n  bool thereISDebug;\n  RINOK(LoadDebugSections(stream, thereISDebug));\n\n  const CDirLink &certLink = _optHeader.DirItems[kDirLink_Certificate];\n  if (certLink.Size != 0)\n  {\n    CSection sect;\n    sect.Name = \"CERTIFICATE\";\n    sect.Va = 0;\n    sect.Pa = certLink.Va;\n    sect.PSize = sect.VSize = certLink.Size;\n    sect.UpdateTotalSize(_totalSize);\n    _sections.Add(sect);\n  }\n\n  if (thereISDebug)\n  {\n    const UInt32 kAlign = 1 << 12;\n    UInt32 alignPos = _totalSize & (kAlign - 1);\n    if (alignPos != 0)\n    {\n      UInt32 size = kAlign - alignPos;\n      RINOK(stream->Seek(_totalSize, STREAM_SEEK_SET, NULL));\n      buffer.Free();\n      buffer.SetCapacity(kAlign);\n      Byte *buf = buffer;\n      size_t processed = size;\n      RINOK(ReadStream(stream, buf, &processed));\n      size_t i;\n      for (i = 0; i < processed; i++)\n      {\n        if (buf[i] != 0)\n          break;\n      }\n      if (processed < size && processed < 100)\n        _totalSize += (UInt32)processed;\n      else if (((_totalSize + i) & 0x1FF) == 0 || processed < size)\n        _totalSize += (UInt32)i;\n    }\n  }\n\n  if (_header.NumSymbols > 0 && _header.PointerToSymbolTable >= 512)\n  {\n    if (_header.NumSymbols >= (1 << 24))\n      return S_FALSE;\n    CSection sect;\n    sect.Name = \"COFF_SYMBOLS\";\n    UInt32 size = _header.NumSymbols * 18;\n    RINOK(stream->Seek((UInt64)_header.PointerToSymbolTable + size, STREAM_SEEK_SET, NULL));\n    Byte buf[4];\n    RINOK(ReadStream_FALSE(stream, buf, 4));\n    UInt32 size2 = Get32(buf);\n    if (size2 >= (1 << 28))\n      return S_FALSE;\n    size += size2;\n\n    sect.Va = 0;\n    sect.Pa = _header.PointerToSymbolTable;\n    sect.PSize = sect.VSize = size;\n    sect.UpdateTotalSize(_totalSize);\n    _sections.Add(sect);\n  }\n\n  UInt64 fileSize;\n  RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));\n  if (fileSize > _totalSize)\n    return S_FALSE;\n  _totalSizeLimited = (_totalSize < fileSize) ? _totalSize : (UInt32)fileSize;\n\n  {\n    CObjectVector<CSection> sections = _sections;\n    sections.Sort();\n    UInt32 limit = (1 << 12);\n    int num = 0;\n    for (int i = 0; i < sections.Size(); i++)\n    {\n      const CSection &s = sections[i];\n      if (s.Pa > limit)\n      {\n        CSection s2;\n        s2.Pa = s2.Va = limit;\n        s2.PSize = s2.VSize = s.Pa - limit;\n        char sz[32];\n        ConvertUInt64ToString(++num, sz);\n        s2.Name = \"[data-\";\n        s2.Name += sz;\n        s2.Name += \"]\";\n        _sections.Add(s2);\n      }\n      UInt32 next = s.Pa + s.PSize;\n      if (next < limit)\n        break;\n      limit = next;\n    }\n  }\n\n  return S_OK;\n}\n\nHRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos, UInt32 &res)\n{\n  // size &= ~1;\n  const UInt32 kBufSize = 1 << 23;\n  CByteBuffer buffer;\n  buffer.SetCapacity(kBufSize);\n  Byte *buf = buffer;\n\n  UInt32 sum = 0;\n  UInt32 pos;\n  for(pos = 0;;)\n  {\n    UInt32 rem = size - pos;\n    if (rem > kBufSize)\n      rem = kBufSize;\n    if (rem == 0)\n      break;\n    size_t processed = rem;\n    RINOK(ReadStream(stream, buf, &processed));\n    \n    /*\n    */\n    /*\n    for (; processed < rem; processed++)\n      buf[processed] = 0;\n    */\n\n    if ((processed & 1) != 0)\n      buf[processed] = 0;\n\n    for (int j = 0; j < 4; j++)\n    {\n      UInt32 p = excludePos + j;\n      if (pos <= p && p < pos + processed)\n        buf[p - pos] = 0;\n    }\n\n    for (size_t i = 0; i < processed; i += 2)\n    {\n      sum += Get16(buf + i);\n      sum = (sum + (sum >> 16)) & 0xFFFF;\n    }\n    pos += (UInt32)processed;\n    if (rem != processed)\n      break;\n  }\n  sum += pos;\n  res = sum;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  Close();\n  RINOK(Open2(inStream));\n  _inStream = inStream;\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _sections.Clear();\n\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _sections.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _sections.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n    totalSize += _sections[allFilesMode ? i : indices[i]].GetPackSize();\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  bool checkSumOK = true;\n  if (_optHeader.CheckSum != 0 && (int)numItems == _sections.Size())\n  {\n    UInt32 checkSum = 0;\n    RINOK(_inStream->Seek(0, STREAM_SEEK_SET, NULL));\n    CalcCheckSum(_inStream, _totalSizeLimited, _peOffset + kHeaderSize + 64, checkSum);\n    checkSumOK = (checkSum == _optHeader.CheckSum);\n  }\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    UInt32 index = allFilesMode ? i : indices[i];\n    const CSection &item = _sections[index];\n    currentItemSize = item.GetPackSize();\n    {\n      CMyComPtr<ISequentialOutStream> realOutStream;\n      RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n      if (!testMode && (!realOutStream))\n        continue;\n      outStreamSpec->SetStream(realOutStream);\n      outStreamSpec->Init();\n    }\n      \n    RINOK(extractCallback->PrepareOperation(askMode));\n    RINOK(_inStream->Seek(item.Pa, STREAM_SEEK_SET, NULL));\n    streamSpec->Init(currentItemSize);\n    RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));\n    outStreamSpec->ReleaseStream();\n    RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == currentItemSize) ?\n      checkSumOK ?\n        NArchive::NExtract::NOperationResult::kOK:\n        NArchive::NExtract::NOperationResult::kCRCError:\n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new CHandler; }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"PE\", L\"\", 0, 0xDD, { 0 }, 0, false, CreateArc, 0 };\n\nREGISTER_ARC(Pe)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarHandler.cpp",
    "content": "// RarHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../IPassword.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/FilterCoder.h\"\n#include \"../../Common/MethodId.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../../Crypto/Rar20Crypto.h\"\n#include \"../../Crypto/RarAes.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n#include \"../Common/OutStreamWithCRC.h\"\n\n#include \"RarHandler.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NRar {\n\nstatic const wchar_t *kHostOS[] =\n{\n  L\"MS DOS\",\n  L\"OS/2\",\n  L\"Win32\",\n  L\"Unix\",\n  L\"Mac OS\",\n  L\"BeOS\"\n};\n\nstatic const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);\n\nstatic const wchar_t *kUnknownOS = L\"Unknown\";\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME},\n  { NULL, kpidAttrib, VT_UI4},\n\n  { NULL, kpidEncrypted, VT_BOOL},\n  { NULL, kpidSolid, VT_BOOL},\n  { NULL, kpidCommented, VT_BOOL},\n  { NULL, kpidSplitBefore, VT_BOOL},\n  { NULL, kpidSplitAfter, VT_BOOL},\n  { NULL, kpidCRC, VT_UI4},\n  { NULL, kpidHostOS, VT_BSTR},\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidUnpackVer, VT_UI1}\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidSolid, VT_BOOL},\n  { NULL, kpidNumBlocks, VT_UI4},\n  // { NULL, kpidEncrypted, VT_BOOL},\n  { NULL, kpidIsVolume, VT_BOOL},\n  { NULL, kpidNumVolumes, VT_UI4},\n  { NULL, kpidPhySize, VT_UI8}\n  // { NULL, kpidCommented, VT_BOOL}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nUInt64 CHandler::GetPackSize(int refIndex) const\n{\n  const CRefItem &refItem = _refItems[refIndex];\n  UInt64 totalPackSize = 0;\n  for (int i = 0; i < refItem.NumItems; i++)\n    totalPackSize += _items[refItem.ItemIndex + i].PackSize;\n  return totalPackSize;\n}\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  // COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidSolid: prop = _archiveInfo.IsSolid(); break;\n    // case kpidEncrypted: prop = _archiveInfo.IsEncrypted(); break; // it's for encrypted names.\n    case kpidIsVolume: prop = _archiveInfo.IsVolume(); break;\n    case kpidNumVolumes: prop = (UInt32)_archives.Size(); break;\n    case kpidOffset: if (_archiveInfo.StartPosition != 0) prop = _archiveInfo.StartPosition; break;\n    // case kpidCommented: prop = _archiveInfo.IsCommented(); break;\n    case kpidNumBlocks:\n    {\n      UInt32 numBlocks = 0;\n      for (int i = 0; i < _refItems.Size(); i++)\n        if (!IsSolid(i))\n          numBlocks++;\n      prop = (UInt32)numBlocks;\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  // COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _refItems.Size();\n  return S_OK;\n}\n\nstatic bool RarTimeToFileTime(const CRarTime &rarTime, FILETIME &result)\n{\n  if (!DosTimeToFileTime(rarTime.DosTime, result))\n    return false;\n  UInt64 value =  (((UInt64)result.dwHighDateTime) << 32) + result.dwLowDateTime;\n  value += (UInt64)rarTime.LowSecond * 10000000;\n  value += ((UInt64)rarTime.SubTime[2] << 16) +\n    ((UInt64)rarTime.SubTime[1] << 8) +\n    ((UInt64)rarTime.SubTime[0]);\n  result.dwLowDateTime = (DWORD)value;\n  result.dwHighDateTime = DWORD(value >> 32);\n  return true;\n}\n\nstatic void RarTimeToProp(const CRarTime &rarTime, NWindows::NCOM::CPropVariant &prop)\n{\n  FILETIME localFileTime, utcFileTime;\n  if (RarTimeToFileTime(rarTime, localFileTime))\n  {\n    if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))\n      utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n  }\n  else\n    utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n  prop = utcFileTime;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CRefItem &refItem = _refItems[index];\n  const CItemEx &item = _items[refItem.ItemIndex];\n  switch(propID)\n  {\n    case kpidPath:\n    {\n      UString u;\n      if (item.HasUnicodeName() && !item.UnicodeName.IsEmpty())\n        u = item.UnicodeName;\n      else\n        u = MultiByteToUnicodeString(item.Name, CP_OEMCP);\n      prop = (const wchar_t *)NItemName::WinNameToOSName(u);\n      break;\n    }\n    case kpidIsDir: prop = item.IsDir(); break;\n    case kpidSize: prop = item.Size; break;\n    case kpidPackSize: prop = GetPackSize(index); break;\n    case kpidMTime: RarTimeToProp(item.MTime, prop); break;\n    case kpidCTime: if (item.CTimeDefined) RarTimeToProp(item.CTime, prop); break;\n    case kpidATime: if (item.ATimeDefined) RarTimeToProp(item.ATime, prop); break;\n    case kpidAttrib: prop = item.GetWinAttributes(); break;\n    case kpidEncrypted: prop = item.IsEncrypted(); break;\n    case kpidSolid: prop = IsSolid(index); break;\n    case kpidCommented: prop = item.IsCommented(); break;\n    case kpidSplitBefore: prop = item.IsSplitBefore(); break;\n    case kpidSplitAfter: prop = _items[refItem.ItemIndex + refItem.NumItems - 1].IsSplitAfter(); break;\n    case kpidCRC:\n    {\n      const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];\n      prop = ((lastItem.IsSplitAfter()) ? item.FileCRC : lastItem.FileCRC);\n      break;\n    }\n    case kpidUnpackVer: prop = item.UnPackVersion; break;\n    case kpidMethod:\n    {\n      UString method;\n      if (item.Method >= Byte('0') && item.Method <= Byte('5'))\n      {\n        method = L\"m\";\n        wchar_t temp[32];\n        ConvertUInt64ToString(item.Method - Byte('0'), temp);\n        method += temp;\n        if (!item.IsDir())\n        {\n          method += L\":\";\n          ConvertUInt64ToString(16 + item.GetDictSize(), temp);\n          method += temp;\n        }\n      }\n      else\n      {\n        wchar_t temp[32];\n        ConvertUInt64ToString(item.Method, temp);\n        method += temp;\n      }\n      prop = method;\n      break;\n    }\n    case kpidHostOS: prop = (item.HostOS < kNumHostOSes) ? (kHostOS[item.HostOS]) : kUnknownOS; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nclass CVolumeName\n{\n  bool _first;\n  bool _newStyle;\n  UString _unchangedPart;\n  UString _changedPart;\n  UString _afterPart;\npublic:\n  CVolumeName(): _newStyle(true) {};\n\n  bool InitName(const UString &name, bool newStyle)\n  {\n    _first = true;\n    _newStyle = newStyle;\n    int dotPos = name.ReverseFind('.');\n    UString basePart = name;\n    if (dotPos >= 0)\n    {\n      UString ext = name.Mid(dotPos + 1);\n      if (ext.CompareNoCase(L\"rar\") == 0)\n      {\n        _afterPart = name.Mid(dotPos);\n        basePart = name.Left(dotPos);\n      }\n      else if (ext.CompareNoCase(L\"exe\") == 0)\n      {\n        _afterPart = L\".rar\";\n        basePart = name.Left(dotPos);\n      }\n      else if (!_newStyle)\n      {\n        if (ext.CompareNoCase(L\"000\") == 0 || ext.CompareNoCase(L\"001\") == 0)\n        {\n          _afterPart.Empty();\n          _first = false;\n          _changedPart = ext;\n          _unchangedPart = name.Left(dotPos + 1);\n          return true;\n        }\n      }\n    }\n\n    if (!_newStyle)\n    {\n      _afterPart.Empty();\n      _unchangedPart = basePart + UString(L\".\");\n      _changedPart = L\"r00\";\n      return true;\n    }\n\n    int numLetters = 1;\n    if (basePart.Right(numLetters) == L\"1\" || basePart.Right(numLetters) == L\"0\")\n    {\n      while (numLetters < basePart.Length())\n      {\n        if (basePart[basePart.Length() - numLetters - 1] != '0')\n          break;\n        numLetters++;\n      }\n    }\n    else\n      return false;\n    _unchangedPart = basePart.Left(basePart.Length() - numLetters);\n    _changedPart = basePart.Right(numLetters);\n    return true;\n  }\n\n  UString GetNextName()\n  {\n    UString newName;\n    if (_newStyle || !_first)\n    {\n      int i;\n      int numLetters = _changedPart.Length();\n      for (i = numLetters - 1; i >= 0; i--)\n      {\n        wchar_t c = _changedPart[i];\n        if (c == L'9')\n        {\n          c = L'0';\n          newName = c + newName;\n          if (i == 0)\n            newName = UString(L'1') + newName;\n          continue;\n        }\n        c++;\n        newName = UString(c) + newName;\n        i--;\n        for (; i >= 0; i--)\n          newName = _changedPart[i] + newName;\n        break;\n      }\n      _changedPart = newName;\n    }\n    _first = false;\n    return _unchangedPart + _changedPart + _afterPart;\n  }\n};\n\nHRESULT CHandler::Open2(IInStream *stream,\n    const UInt64 *maxCheckStartPosition,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  {\n    CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;\n    CMyComPtr<ICryptoGetTextPassword> getTextPassword;\n    CMyComPtr<IArchiveOpenCallback> openArchiveCallbackWrap = openArchiveCallback;\n    \n    CVolumeName seqName;\n\n    UInt64 totalBytes = 0;\n    UInt64 curBytes = 0;\n\n    if (openArchiveCallback != NULL)\n    {\n      openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback, &openVolumeCallback);\n      openArchiveCallbackWrap.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);\n    }\n\n    for (;;)\n    {\n      CMyComPtr<IInStream> inStream;\n      if (!_archives.IsEmpty())\n      {\n        if (!openVolumeCallback)\n          break;\n        \n        if(_archives.Size() == 1)\n        {\n          if (!_archiveInfo.IsVolume())\n            break;\n          UString baseName;\n          {\n            NCOM::CPropVariant prop;\n            RINOK(openVolumeCallback->GetProperty(kpidName, &prop));\n            if (prop.vt != VT_BSTR)\n              break;\n            baseName = prop.bstrVal;\n          }\n          seqName.InitName(baseName, _archiveInfo.HaveNewVolumeName());\n        }\n\n        UString fullName = seqName.GetNextName();\n        HRESULT result = openVolumeCallback->GetStream(fullName, &inStream);\n        if (result == S_FALSE)\n          break;\n        if (result != S_OK)\n          return result;\n        if (!stream)\n          break;\n      }\n      else\n        inStream = stream;\n\n      UInt64 endPos = 0;\n      if (openArchiveCallback != NULL)\n      {\n        RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));\n        RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));\n        totalBytes += endPos;\n        RINOK(openArchiveCallback->SetTotal(NULL, &totalBytes));\n      }\n      \n      NArchive::NRar::CInArchive archive;\n      RINOK(archive.Open(inStream, maxCheckStartPosition));\n\n      if (_archives.IsEmpty())\n        archive.GetArchiveInfo(_archiveInfo);\n     \n      CItemEx item;\n      for (;;)\n      {\n        HRESULT result = archive.GetNextItem(item, getTextPassword);\n        if (result == S_FALSE)\n          break;\n        RINOK(result);\n        if (item.IgnoreItem())\n          continue;\n\n        bool needAdd = true;\n        if (item.IsSplitBefore())\n        {\n          if (!_refItems.IsEmpty())\n          {\n            CRefItem &refItem = _refItems.Back();\n            refItem.NumItems++;\n            needAdd = false;\n          }\n        }\n        if (needAdd)\n        {\n          CRefItem refItem;\n          refItem.ItemIndex = _items.Size();\n          refItem.NumItems = 1;\n          refItem.VolumeIndex = _archives.Size();\n          _refItems.Add(refItem);\n        }\n        _items.Add(item);\n        if (openArchiveCallback != NULL && _items.Size() % 100 == 0)\n        {\n          UInt64 numFiles = _items.Size();\n          UInt64 numBytes = curBytes + item.Position;\n          RINOK(openArchiveCallback->SetCompleted(&numFiles, &numBytes));\n        }\n      }\n      curBytes += endPos;\n      _archives.Add(archive);\n    }\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 *maxCheckStartPosition,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  Close();\n\n    HRESULT res = Open2(stream, maxCheckStartPosition, openArchiveCallback);\n    if (res != S_OK)\n      Close();\n    return res;\n  \n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  COM_TRY_BEGIN\n  _refItems.Clear();\n  _items.Clear();\n  _archives.Clear();\n  return S_OK;\n  COM_TRY_END\n}\n\nstruct CMethodItem\n{\n  Byte RarUnPackVersion;\n  CMyComPtr<ICompressCoder> Coder;\n};\n\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *_anExtractCallback)\n{\n  COM_TRY_BEGIN\n  CMyComPtr<ICryptoGetTextPassword> getTextPassword;\n  bool testMode = (_aTestMode != 0);\n  CMyComPtr<IArchiveExtractCallback> extractCallback = _anExtractCallback;\n  UInt64 censoredTotalUnPacked = 0,\n        // censoredTotalPacked = 0,\n        importantTotalUnPacked = 0;\n        // importantTotalPacked = 0;\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _refItems.Size();\n  if(numItems == 0)\n    return S_OK;\n  int lastIndex = 0;\n  CRecordVector<int> importantIndexes;\n  CRecordVector<bool> extractStatuses;\n\n  for(UInt32 t = 0; t < numItems; t++)\n  {\n    int index = allFilesMode ? t : indices[t];\n    const CRefItem &refItem = _refItems[index];\n    const CItemEx &item = _items[refItem.ItemIndex];\n    censoredTotalUnPacked += item.Size;\n    // censoredTotalPacked += item.PackSize;\n    int j;\n    for(j = lastIndex; j <= index; j++)\n      // if(!_items[_refItems[j].ItemIndex].IsSolid())\n      if(!IsSolid(j))\n        lastIndex = j;\n    for(j = lastIndex; j <= index; j++)\n    {\n      const CRefItem &refItem = _refItems[j];\n      const CItemEx &item = _items[refItem.ItemIndex];\n\n      // const CItemEx &item = _items[j];\n\n      importantTotalUnPacked += item.Size;\n      // importantTotalPacked += item.PackSize;\n      importantIndexes.Add(j);\n      extractStatuses.Add(j == index);\n    }\n    lastIndex = index + 1;\n  }\n\n  extractCallback->SetTotal(importantTotalUnPacked);\n  UInt64 currentImportantTotalUnPacked = 0;\n  UInt64 currentImportantTotalPacked = 0;\n  UInt64 currentUnPackSize, currentPackSize;\n\n  CObjectVector<CMethodItem> methodItems;\n\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CFilterCoder *filterStreamSpec = new CFilterCoder;\n  CMyComPtr<ISequentialInStream> filterStream = filterStreamSpec;\n\n  NCrypto::NRar20::CDecoder *rar20CryptoDecoderSpec = NULL;\n  CMyComPtr<ICompressFilter> rar20CryptoDecoder;\n  NCrypto::NRar29::CDecoder *rar29CryptoDecoderSpec = NULL;\n  CMyComPtr<ICompressFilter> rar29CryptoDecoder;\n\n  CFolderInStream *folderInStreamSpec = NULL;\n  CMyComPtr<ISequentialInStream> folderInStream;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  bool solidStart = true;\n  for(int i = 0; i < importantIndexes.Size(); i++,\n      currentImportantTotalUnPacked += currentUnPackSize,\n      currentImportantTotalPacked += currentPackSize)\n  {\n    lps->InSize = currentImportantTotalPacked;\n    lps->OutSize = currentImportantTotalUnPacked;\n    RINOK(lps->SetCur());\n    CMyComPtr<ISequentialOutStream> realOutStream;\n\n    Int32 askMode;\n    if(extractStatuses[i])\n      askMode = testMode ?\n          NArchive::NExtract::NAskMode::kTest :\n          NArchive::NExtract::NAskMode::kExtract;\n    else\n      askMode = NArchive::NExtract::NAskMode::kSkip;\n\n    UInt32 index = importantIndexes[i];\n\n    const CRefItem &refItem = _refItems[index];\n    const CItemEx &item = _items[refItem.ItemIndex];\n\n    currentUnPackSize = item.Size;\n\n    currentPackSize = GetPackSize(index);\n\n    if(item.IgnoreItem())\n      continue;\n\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    if (!IsSolid(index))\n      solidStart = true;\n    if(item.IsDir())\n    {\n      RINOK(extractCallback->PrepareOperation(askMode));\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n\n    bool mustBeProcessedAnywhere = false;\n    if(i < importantIndexes.Size() - 1)\n    {\n      // const CRefItem &nextRefItem = _refItems[importantIndexes[i + 1]];\n      // const CItemEx &nextItemInfo = _items[nextRefItem.ItemIndex];\n      // mustBeProcessedAnywhere = nextItemInfo.IsSolid();\n      mustBeProcessedAnywhere = IsSolid(importantIndexes[i + 1]);\n    }\n    \n    if (!mustBeProcessedAnywhere && !testMode && !realOutStream)\n      continue;\n    \n    if (!realOutStream && !testMode)\n      askMode = NArchive::NExtract::NAskMode::kSkip;\n\n    RINOK(extractCallback->PrepareOperation(askMode));\n\n    COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;\n    CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n    outStreamSpec->SetStream(realOutStream);\n    outStreamSpec->Init();\n    realOutStream.Release();\n    \n    /*\n    for (int partIndex = 0; partIndex < 1; partIndex++)\n    {\n    CMyComPtr<ISequentialInStream> inStream;\n\n    // item redefinition\n    const CItemEx &item = _items[refItem.ItemIndex + partIndex];\n\n    NArchive::NRar::CInArchive &archive = _archives[refItem.VolumeIndex + partIndex];\n\n    inStream.Attach(archive.CreateLimitedStream(item.GetDataPosition(),\n      item.PackSize));\n    */\n    if (!folderInStream)\n    {\n      folderInStreamSpec = new CFolderInStream;\n      folderInStream = folderInStreamSpec;\n    }\n\n    folderInStreamSpec->Init(&_archives, &_items, refItem);\n\n    UInt64 packSize = currentPackSize;\n\n    // packedPos += item.PackSize;\n    // unpackedPos += 0;\n    \n    CMyComPtr<ISequentialInStream> inStream;\n    if (item.IsEncrypted())\n    {\n      CMyComPtr<ICryptoSetPassword> cryptoSetPassword;\n      if (item.UnPackVersion >= 29)\n      {\n        if (!rar29CryptoDecoder)\n        {\n          rar29CryptoDecoderSpec = new NCrypto::NRar29::CDecoder;\n          rar29CryptoDecoder = rar29CryptoDecoderSpec;\n          // RINOK(rar29CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar29Decoder));\n        }\n        rar29CryptoDecoderSpec->SetRar350Mode(item.UnPackVersion < 36);\n        CMyComPtr<ICompressSetDecoderProperties2> cryptoProperties;\n        RINOK(rar29CryptoDecoder.QueryInterface(IID_ICompressSetDecoderProperties2,\n            &cryptoProperties));\n        RINOK(cryptoProperties->SetDecoderProperties2(item.Salt, item.HasSalt() ? sizeof(item.Salt) : 0));\n        filterStreamSpec->Filter = rar29CryptoDecoder;\n      }\n      else if (item.UnPackVersion >= 20)\n      {\n        if (!rar20CryptoDecoder)\n        {\n          rar20CryptoDecoderSpec = new NCrypto::NRar20::CDecoder;\n          rar20CryptoDecoder = rar20CryptoDecoderSpec;\n          // RINOK(rar20CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar20Decoder));\n        }\n        filterStreamSpec->Filter = rar20CryptoDecoder;\n      }\n      else\n      {\n        outStream.Release();\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n        continue;\n      }\n      RINOK(filterStreamSpec->Filter.QueryInterface(IID_ICryptoSetPassword,\n          &cryptoSetPassword));\n\n      if (!getTextPassword)\n        extractCallback.QueryInterface(IID_ICryptoGetTextPassword,\n          &getTextPassword);\n      if (getTextPassword)\n      {\n        CMyComBSTR password;\n        RINOK(getTextPassword->CryptoGetTextPassword(&password));\n        if (item.UnPackVersion >= 29)\n        {\n          CByteBuffer buffer;\n          UString unicodePassword(password);\n          const UInt32 sizeInBytes = unicodePassword.Length() * 2;\n          buffer.SetCapacity(sizeInBytes);\n          for (int i = 0; i < unicodePassword.Length(); i++)\n          {\n            wchar_t c = unicodePassword[i];\n            ((Byte *)buffer)[i * 2] = (Byte)c;\n            ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);\n          }\n          RINOK(cryptoSetPassword->CryptoSetPassword(\n            (const Byte *)buffer, sizeInBytes));\n        }\n        else\n        {\n          AString oemPassword = UnicodeStringToMultiByte(\n            (const wchar_t *)password, CP_OEMCP);\n          RINOK(cryptoSetPassword->CryptoSetPassword(\n            (const Byte *)(const char *)oemPassword, oemPassword.Length()));\n        }\n      }\n      else\n      {\n        RINOK(cryptoSetPassword->CryptoSetPassword(0, 0));\n      }\n      filterStreamSpec->SetInStream(folderInStream);\n      inStream = filterStream;\n    }\n    else\n    {\n      inStream = folderInStream;\n    }\n    CMyComPtr<ICompressCoder> commonCoder;\n    switch(item.Method)\n    {\n      case '0':\n      {\n        commonCoder = copyCoder;\n        break;\n      }\n      case '1':\n      case '2':\n      case '3':\n      case '4':\n      case '5':\n      {\n        /*\n        if (item.UnPackVersion >= 29)\n        {\n          outStream.Release();\n          RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n          continue;\n        }\n        */\n        int m;\n        for (m = 0; m < methodItems.Size(); m++)\n          if (methodItems[m].RarUnPackVersion == item.UnPackVersion)\n            break;\n        if (m == methodItems.Size())\n        {\n          CMethodItem mi;\n          mi.RarUnPackVersion = item.UnPackVersion;\n\n          mi.Coder.Release();\n          if (item.UnPackVersion <= 30)\n          {\n            UInt32 methodID = 0x040300;\n            if (item.UnPackVersion < 20)\n              methodID += 1;\n            else if (item.UnPackVersion < 29)\n              methodID += 2;\n            else\n              methodID += 3;\n            RINOK(CreateCoder(EXTERNAL_CODECS_VARS methodID, mi.Coder, false));\n          }\n         \n          if (mi.Coder == 0)\n          {\n            outStream.Release();\n            RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n            continue;\n          }\n\n          m = methodItems.Add(mi);\n        }\n        CMyComPtr<ICompressCoder> decoder = methodItems[m].Coder;\n\n        CMyComPtr<ICompressSetDecoderProperties2> compressSetDecoderProperties;\n        RINOK(decoder.QueryInterface(IID_ICompressSetDecoderProperties2,\n            &compressSetDecoderProperties));\n        \n        Byte isSolid = (Byte)((IsSolid(index) || item.IsSplitBefore()) ? 1: 0);\n        if (solidStart)\n        {\n          isSolid = false;\n          solidStart = false;\n        }\n\n\n        RINOK(compressSetDecoderProperties->SetDecoderProperties2(&isSolid, 1));\n          \n        commonCoder = decoder;\n        break;\n      }\n      default:\n        outStream.Release();\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n        continue;\n    }\n    HRESULT result = commonCoder->Code(inStream, outStream, &packSize, &item.Size, progress);\n    if (item.IsEncrypted())\n      filterStreamSpec->ReleaseInStream();\n    if (result == S_FALSE)\n    {\n      outStream.Release();\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kDataError));\n      continue;\n    }\n    if (result != S_OK)\n      return result;\n\n    /*\n    if (refItem.NumItems == 1 &&\n        !item.IsSplitBefore() && !item.IsSplitAfter())\n    */\n    {\n      const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];\n      bool crcOK = outStreamSpec->GetCRC() == lastItem.FileCRC;\n      outStream.Release();\n      RINOK(extractCallback->SetOperationResult(crcOK ? NArchive::NExtract::NOperationResult::kOK:\n          NArchive::NExtract::NOperationResult::kCRCError));\n    }\n    /*\n    else\n    {\n      bool crcOK = true;\n      for (int partIndex = 0; partIndex < refItem.NumItems; partIndex++)\n      {\n        const CItemEx &item = _items[refItem.ItemIndex + partIndex];\n        if (item.FileCRC != folderInStreamSpec->CRCs[partIndex])\n        {\n          crcOK = false;\n          break;\n        }\n      }\n      RINOK(extractCallback->SetOperationResult(crcOK ? NArchive::NExtract::NOperationResult::kOK:\n          NArchive::NExtract::NOperationResult::kCRCError));\n    }\n    */\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nIMPL_ISetCompressCodecsInfo\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarHandler.h",
    "content": "// Rar/Handler.h\n\n#ifndef __RAR_HANDLER_H\n#define __RAR_HANDLER_H\n\n#include \"../IArchive.h\"\n#include \"RarIn.h\"\n#include \"RarVolumeInStream.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\nnamespace NArchive {\nnamespace NRar {\n\nclass CHandler:\n  public IInArchive,\n  PUBLIC_ISetCompressCodecsInfo\n  public CMyUnknownImp\n{\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IInArchive)\n  QUERY_ENTRY_ISetCompressCodecsInfo\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n  \n  INTERFACE_IInArchive(;)\n\n  DECL_ISetCompressCodecsInfo\n\nprivate:\n  CRecordVector<CRefItem> _refItems;\n  CObjectVector<CItemEx> _items;\n  CObjectVector<CInArchive> _archives;\n  NArchive::NRar::CInArchiveInfo _archiveInfo;\n\n  DECL_EXTERNAL_CODECS_VARS\n\n  UInt64 GetPackSize(int refIndex) const;\n  // NArchive::NRar::CInArchive _archive;\n\n  bool IsSolid(int refIndex)\n  {\n    const CItemEx &item = _items[_refItems[refIndex].ItemIndex];\n    if (item.UnPackVersion < 20)\n    {\n      if (_archiveInfo.IsSolid())\n        return (refIndex > 0);\n      return false;\n    }\n    return item.IsSolid();\n  }\n\n  HRESULT Open2(IInStream *stream,\n      const UInt64 *maxCheckStartPosition,\n      IArchiveOpenCallback *openArchiveCallback);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarHeader.cpp",
    "content": "// Archive/Rar/Headers.cpp\n\n#include \"StdAfx.h\"\n\n#include \"RarHeader.h\"\n\nnamespace NArchive{\nnamespace NRar{\nnamespace NHeader{\n\nByte kMarker[kMarkerSize] = {0x52 + 1, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00};\n  \nclass CMarkerInitializer\n{\npublic:\n  CMarkerInitializer() { kMarker[0]--; };\n};\n\nstatic CMarkerInitializer markerInitializer;\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarHeader.h",
    "content": "// Archive/RarHeader.h\n\n#ifndef __ARCHIVE_RAR_HEADER_H\n#define __ARCHIVE_RAR_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive{\nnamespace NRar{\nnamespace NHeader{\n\nconst int kMarkerSize = 7;\nextern Byte kMarker[kMarkerSize];\n  \nconst int kArchiveSolid = 0x1;\n\nnamespace NBlockType\n{\n  enum EBlockType\n  {\n    kMarker        = 0x72,\n    kArchiveHeader = 0x73,\n    kFileHeader    = 0x74,\n    kCommentHeader = 0x75,\n    kOldAuthenticity = 0x76,\n    kSubBlock       = 0x77,\n    kRecoveryRecord = 0x78,\n    kAuthenticity   = 0x79,\n\n    kEndOfArchive   = 0x7B // Is not safe\n  };\n}\n\nnamespace NArchive\n{\n  const UInt16 kVolume  = 1;\n  const UInt16 kComment = 2;\n  const UInt16 kLock    = 4;\n  const UInt16 kSolid   = 8;\n  const UInt16 kNewVolName = 0x10; // ('volname.partN.rar')\n  const UInt16 kAuthenticity  = 0x20;\n  const UInt16 kRecovery = 0x40;\n  const UInt16 kBlockEncryption  = 0x80;\n  const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later)\n  const UInt16 kEncryptVer = 0x200; // RAR 3.6 there is EncryptVer Byte in End of MainHeader\n  \n  const int kHeaderSizeMin = 7;\n\n  struct CBlock\n  {\n    UInt16 CRC;\n    Byte Type;\n    UInt16 Flags;\n    UInt16 Size;\n    UInt16 Reserved1;\n    UInt32 Reserved2;\n    // UInt16 GetRealCRC() const;\n  };\n  \n  const int kArchiveHeaderSize = 13;\n\n  const int kBlockHeadersAreEncrypted = 0x80;\n\n  struct CHeader360: public CBlock\n  {\n    Byte EncryptVersion;\n    bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }\n    bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; }\n    bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); }\n    UInt32 GetBaseSize() const { return kArchiveHeaderSize + (IsEncryptOld() ? 0 : 1); }\n  };\n}\n\nnamespace NFile\n{\n  const int kSplitBefore = 1 << 0;\n  const int kSplitAfter  = 1 << 1;\n  const int kEncrypted   = 1 << 2;\n  const int kComment     = 1 << 3;\n  const int kSolid       = 1 << 4;\n  \n  const int kDictBitStart     = 5;\n  const int kNumDictBits  = 3;\n  const int kDictMask         = (1 << kNumDictBits) - 1;\n  const int kDictDirectoryValue  = 0x7;\n  \n  const int kSize64Bits    = 1 << 8;\n  const int kUnicodeName   = 1 << 9;\n  const int kSalt          = 1 << 10;\n  const int kOldVersion    = 1 << 11;\n  const int kExtTime       = 1 << 12;\n  // const int kExtFlags      = 1 << 13;\n  // const int kSkipIfUnknown = 1 << 14;\n\n  const int kLongBlock    = 1 << 15;\n  \n  /*\n  struct CBlock\n  {\n    // UInt16 HeadCRC;\n    // Byte Type;\n    // UInt16 Flags;\n    // UInt16 HeadSize;\n    UInt32 PackSize;\n    UInt32 UnPackSize;\n    Byte HostOS;\n    UInt32 FileCRC;\n    UInt32 Time;\n    Byte UnPackVersion;\n    Byte Method;\n    UInt16 NameSize;\n    UInt32 Attributes;\n  };\n  */\n\n  /*\n  struct CBlock32\n  {\n    UInt16 HeadCRC;\n    Byte Type;\n    UInt16 Flags;\n    UInt16 HeadSize;\n    UInt32 PackSize;\n    UInt32 UnPackSize;\n    Byte HostOS;\n    UInt32 FileCRC;\n    UInt32 Time;\n    Byte UnPackVersion;\n    Byte Method;\n    UInt16 NameSize;\n    UInt32 Attributes;\n    UInt16 GetRealCRC(const void *aName, UInt32 aNameSize,\n        bool anExtraDataDefined = false, Byte *anExtraData = 0) const;\n  };\n  struct CBlock64\n  {\n    UInt16 HeadCRC;\n    Byte Type;\n    UInt16 Flags;\n    UInt16 HeadSize;\n    UInt32 PackSizeLow;\n    UInt32 UnPackSizeLow;\n    Byte HostOS;\n    UInt32 FileCRC;\n    UInt32 Time;\n    Byte UnPackVersion;\n    Byte Method;\n    UInt16 NameSize;\n    UInt32 Attributes;\n    UInt32 PackSizeHigh;\n    UInt32 UnPackSizeHigh;\n    UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const;\n  };\n  */\n  \n  const int kLabelFileAttribute            = 0x08;\n  const int kWinFileDirectoryAttributeMask = 0x10;\n  \n  enum CHostOS\n  {\n    kHostMSDOS = 0,\n      kHostOS2   = 1,\n      kHostWin32 = 2,\n      kHostUnix  = 3,\n      kHostMacOS = 4,\n      kHostBeOS = 5\n  };\n}\n\nnamespace NBlock\n{\n  const UInt16 kLongBlock = 1 << 15;\n  struct CBlock\n  {\n    UInt16 CRC;\n    Byte Type;\n    UInt16 Flags;\n    UInt16 HeadSize;\n    //  UInt32 DataSize;\n  };\n}\n\n/*\nstruct CSubBlock\n{\n  UInt16 HeadCRC;\n  Byte HeadType;\n  UInt16 Flags;\n  UInt16 HeadSize;\n  UInt32 DataSize;\n  UInt16 SubType;\n  Byte Level; // Reserved : Must be 0\n};\n\nstruct CCommentBlock\n{\n  UInt16 HeadCRC;\n  Byte HeadType;\n  UInt16 Flags;\n  UInt16 HeadSize;\n  UInt16 UnpSize;\n  Byte UnpVer;\n  Byte Method;\n  UInt16 CommCRC;\n};\n\n\nstruct CProtectHeader\n{\n  UInt16 HeadCRC;\n  Byte HeadType;\n  UInt16 Flags;\n  UInt16 HeadSize;\n  UInt32 DataSize;\n  Byte Version;\n  UInt16 RecSectors;\n  UInt32 TotalBlocks;\n  Byte Mark[8];\n};\n*/\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarIn.cpp",
    "content": "// Archive/RarIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/UTFConvert.h\"\n\n#include \"RarIn.h\"\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../Common/FindSignature.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/7zCrc.h\"\n}\n\nnamespace NArchive {\nnamespace NRar {\n \nvoid CInArchive::ThrowExceptionWithCode(\n    CInArchiveException::CCauseType cause)\n{\n\n}\n\nHRESULT CInArchive::Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit)\n{\n\n    Close();\n    HRESULT res = Open2(inStream, searchHeaderSizeLimit);\n    if (res == S_OK)\n      return res;\n    Close();\n    return res;\n\n}\n\nvoid CInArchive::Close()\n{\n  m_Stream.Release();\n}\n\n\nstatic inline bool TestMarkerCandidate(const void *aTestBytes)\n{\n  for (UInt32 i = 0; i < NHeader::kMarkerSize; i++)\n    if (((const Byte *)aTestBytes)[i] != NHeader::kMarker[i])\n      return false;\n  return true;\n}\n\nHRESULT CInArchive::FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit)\n{\n  RINOK(FindSignatureInStream(stream,\n      NHeader::kMarker, NHeader::kMarkerSize,\n      searchHeaderSizeLimit, m_ArchiveStartPosition));\n  m_Stream = stream;\n  m_Position = m_ArchiveStartPosition + NHeader::kMarkerSize;\n  return m_Stream->Seek(m_Position, STREAM_SEEK_SET, NULL);\n}\n\nvoid CInArchive::ThrowUnexpectedEndOfArchiveException()\n{\n  ThrowExceptionWithCode(CInArchiveException::kUnexpectedEndOfArchive);\n}\n\nbool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size)\n{\n  if (m_CryptoMode)\n  {\n    const Byte *bufData = (const Byte *)m_DecryptedData;\n    UInt32 bufSize = m_DecryptedDataSize;\n    UInt32 i;\n    for (i = 0; i < size && m_CryptoPos < bufSize; i++)\n      ((Byte *)data)[i] = bufData[m_CryptoPos++];\n    return (i == size);\n  }\n  return (ReadStream_FALSE(m_Stream, data, size) == S_OK);\n}\n\nvoid CInArchive::ReadBytesAndTestResult(void *data, UInt32 size)\n{\n  if(!ReadBytesAndTestSize(data,size))\n    ThrowUnexpectedEndOfArchiveException();\n}\n\nHRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 *processedSize)\n{\n  size_t realProcessedSize = size;\n  HRESULT result = ReadStream(m_Stream, data, &realProcessedSize);\n  if (processedSize != NULL)\n    *processedSize = (UInt32)realProcessedSize;\n  AddToSeekValue(realProcessedSize);\n  return result;\n}\n\nstatic UInt32 CrcUpdateUInt16(UInt32 crc, UInt16 v)\n{\n  crc = CRC_UPDATE_BYTE(crc, (Byte)(v & 0xFF));\n  crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 8) & 0xFF));\n  return crc;\n}\n\nstatic UInt32 CrcUpdateUInt32(UInt32 crc, UInt32 v)\n{\n  crc = CRC_UPDATE_BYTE(crc, (Byte)(v & 0xFF));\n  crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 8) & 0xFF));\n  crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 16) & 0xFF));\n  crc = CRC_UPDATE_BYTE(crc, (Byte)((v >> 24) & 0xFF));\n  return crc;\n}\n\n\nHRESULT CInArchive::Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit)\n{\n  m_CryptoMode = false;\n  RINOK(stream->Seek(0, STREAM_SEEK_SET, &m_StreamStartPosition));\n  m_Position = m_StreamStartPosition;\n\n  RINOK(FindAndReadMarker(stream, searchHeaderSizeLimit));\n\n  Byte buf[NHeader::NArchive::kArchiveHeaderSize];\n  UInt32 processedSize;\n  ReadBytes(buf, sizeof(buf), &processedSize);\n  if (processedSize != sizeof(buf))\n    return S_FALSE;\n  m_CurData = buf;\n  m_CurPos = 0;\n  m_PosLimit = sizeof(buf);\n\n  m_ArchiveHeader.CRC = ReadUInt16();\n  m_ArchiveHeader.Type = ReadByte();\n  m_ArchiveHeader.Flags = ReadUInt16();\n  m_ArchiveHeader.Size = ReadUInt16();\n  m_ArchiveHeader.Reserved1 = ReadUInt16();\n  m_ArchiveHeader.Reserved2 = ReadUInt32();\n  m_ArchiveHeader.EncryptVersion = 0;\n\n  UInt32 crc = CRC_INIT_VAL;\n  crc = CRC_UPDATE_BYTE(crc, m_ArchiveHeader.Type);\n  crc = CrcUpdateUInt16(crc, m_ArchiveHeader.Flags);\n  crc = CrcUpdateUInt16(crc, m_ArchiveHeader.Size);\n  crc = CrcUpdateUInt16(crc, m_ArchiveHeader.Reserved1);\n  crc = CrcUpdateUInt32(crc, m_ArchiveHeader.Reserved2);\n\n  if (m_ArchiveHeader.IsThereEncryptVer() && m_ArchiveHeader.Size > NHeader::NArchive::kArchiveHeaderSize)\n  {\n    ReadBytes(&m_ArchiveHeader.EncryptVersion, 1, &processedSize);\n    if (processedSize != 1)\n      return S_FALSE;\n    crc = CRC_UPDATE_BYTE(crc, m_ArchiveHeader.EncryptVersion);\n  }\n\n  if(m_ArchiveHeader.CRC != (CRC_GET_DIGEST(crc) & 0xFFFF))\n    ThrowExceptionWithCode(CInArchiveException::kArchiveHeaderCRCError);\n  if (m_ArchiveHeader.Type != NHeader::NBlockType::kArchiveHeader)\n    return S_FALSE;\n  m_ArchiveCommentPosition = m_Position;\n  m_SeekOnArchiveComment = true;\n  return S_OK;\n}\n\nvoid CInArchive::SkipArchiveComment()\n{\n  if (!m_SeekOnArchiveComment)\n    return;\n  AddToSeekValue(m_ArchiveHeader.Size - m_ArchiveHeader.GetBaseSize());\n  m_SeekOnArchiveComment = false;\n}\n\nvoid CInArchive::GetArchiveInfo(CInArchiveInfo &archiveInfo) const\n{\n  archiveInfo.StartPosition = m_ArchiveStartPosition;\n  archiveInfo.Flags = m_ArchiveHeader.Flags;\n  archiveInfo.CommentPosition = m_ArchiveCommentPosition;\n  archiveInfo.CommentSize = (UInt16)(m_ArchiveHeader.Size - NHeader::NArchive::kArchiveHeaderSize);\n}\n\nstatic void DecodeUnicodeFileName(const char *name, const Byte *encName,\n    int encSize, wchar_t *unicodeName, int maxDecSize)\n{\n  int encPos = 0;\n  int decPos = 0;\n  int flagBits = 0;\n  Byte flags = 0;\n  Byte highByte = encName[encPos++];\n  while (encPos < encSize && decPos < maxDecSize)\n  {\n    if (flagBits == 0)\n    {\n      flags = encName[encPos++];\n      flagBits = 8;\n    }\n    switch(flags >> 6)\n    {\n      case 0:\n        unicodeName[decPos++] = encName[encPos++];\n        break;\n      case 1:\n        unicodeName[decPos++] = (wchar_t)(encName[encPos++] + (highByte << 8));\n        break;\n      case 2:\n        unicodeName[decPos++] = (wchar_t)(encName[encPos] + (encName[encPos + 1] << 8));\n        encPos += 2;\n        break;\n      case 3:\n        {\n          int length = encName[encPos++];\n          if (length & 0x80)\n          {\n            Byte correction = encName[encPos++];\n            for (length = (length & 0x7f) + 2;\n                length > 0 && decPos < maxDecSize; length--, decPos++)\n              unicodeName[decPos] = (wchar_t)(((name[decPos] + correction) & 0xff) + (highByte << 8));\n          }\n          else\n            for (length += 2; length > 0 && decPos < maxDecSize; length--, decPos++)\n              unicodeName[decPos] = name[decPos];\n        }\n        break;\n    }\n    flags <<= 2;\n    flagBits -= 2;\n  }\n  unicodeName[decPos < maxDecSize ? decPos : maxDecSize - 1] = 0;\n}\n\nvoid CInArchive::ReadName(CItemEx &item, int nameSize)\n{\n  item.UnicodeName.Empty();\n  if (nameSize > 0)\n  {\n    m_NameBuffer.EnsureCapacity(nameSize + 1);\n    char *buffer = (char *)m_NameBuffer;\n\n    for (int i = 0; i < nameSize; i++)\n      buffer[i] = ReadByte();\n\n    int mainLen;\n    for (mainLen = 0; mainLen < nameSize; mainLen++)\n      if (buffer[mainLen] == '\\0')\n        break;\n    buffer[mainLen] = '\\0';\n    item.Name = buffer;\n\n    if(item.HasUnicodeName())\n    {\n      if(mainLen < nameSize)\n      {\n        int unicodeNameSizeMax = MyMin(nameSize, (0x400));\n        _unicodeNameBuffer.EnsureCapacity(unicodeNameSizeMax + 1);\n        DecodeUnicodeFileName(buffer, (const Byte *)buffer + mainLen + 1,\n            nameSize - (mainLen + 1), _unicodeNameBuffer, unicodeNameSizeMax);\n        item.UnicodeName = _unicodeNameBuffer;\n      }\n      else if (!ConvertUTF8ToUnicode(item.Name, item.UnicodeName))\n        item.UnicodeName.Empty();\n    }\n  }\n  else\n    item.Name.Empty();\n}\n\nByte CInArchive::ReadByte()\n{\n  if (m_CurPos >= m_PosLimit)\n    return 0;\n  return m_CurData[m_CurPos++];\n}\n\nUInt16 CInArchive::ReadUInt16()\n{\n  UInt16 value = 0;\n  for (int i = 0; i < 2; i++)\n  {\n    Byte b = ReadByte();\n    value |= (UInt16(b) << (8 * i));\n  }\n  return value;\n}\n\nUInt32 CInArchive::ReadUInt32()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    Byte b = ReadByte();\n    value |= (UInt32(b) << (8 * i));\n  }\n  return value;\n}\n\nvoid CInArchive::ReadTime(Byte mask, CRarTime &rarTime)\n{\n  rarTime.LowSecond = (Byte)(((mask & 4) != 0) ? 1 : 0);\n  int numDigits = (mask & 3);\n  rarTime.SubTime[0] = rarTime.SubTime[1] = rarTime.SubTime[2] = 0;\n  for (int i = 0; i < numDigits; i++)\n    rarTime.SubTime[3 - numDigits + i] = ReadByte();\n}\n\nvoid CInArchive::ReadHeaderReal(CItemEx &item)\n{\n  item.Flags = m_BlockHeader.Flags;\n  item.PackSize = ReadUInt32();\n  item.Size = ReadUInt32();\n  item.HostOS = ReadByte();\n  item.FileCRC = ReadUInt32();\n  item.MTime.DosTime = ReadUInt32();\n  item.UnPackVersion = ReadByte();\n  item.Method = ReadByte();\n  int nameSize = ReadUInt16();\n  item.Attrib = ReadUInt32();\n\n  item.MTime.LowSecond = 0;\n  item.MTime.SubTime[0] =\n      item.MTime.SubTime[1] =\n      item.MTime.SubTime[2] = 0;\n\n  if((item.Flags & NHeader::NFile::kSize64Bits) != 0)\n  {\n    item.PackSize |= ((UInt64)ReadUInt32() << 32);\n    item.Size |= ((UInt64)ReadUInt32() << 32);\n  }\n\n  ReadName(item, nameSize);\n\n  if (item.HasSalt())\n    for (int i = 0; i < sizeof(item.Salt); i++)\n      item.Salt[i] = ReadByte();\n\n  // some rar archives have HasExtTime flag without field.\n  if (m_CurPos < m_PosLimit && item.HasExtTime())\n  {\n    Byte accessMask = (Byte)(ReadByte() >> 4);\n    Byte b = ReadByte();\n    Byte modifMask = (Byte)(b >> 4);\n    Byte createMask = (Byte)(b & 0xF);\n    if ((modifMask & 8) != 0)\n      ReadTime(modifMask, item.MTime);\n    item.CTimeDefined = ((createMask & 8) != 0);\n    if (item.CTimeDefined)\n    {\n      item.CTime.DosTime = ReadUInt32();\n      ReadTime(createMask, item.CTime);\n    }\n    item.ATimeDefined = ((accessMask & 8) != 0);\n    if (item.ATimeDefined)\n    {\n      item.ATime.DosTime = ReadUInt32();\n      ReadTime(accessMask, item.ATime);\n    }\n  }\n\n  UInt16 fileHeaderWithNameSize = (UInt16)m_CurPos;\n  \n  item.Position = m_Position;\n  item.MainPartSize = fileHeaderWithNameSize;\n  item.CommentSize = (UInt16)(m_BlockHeader.HeadSize - fileHeaderWithNameSize);\n\n  if (m_CryptoMode)\n    item.AlignSize = (UInt16)((16 - ((m_BlockHeader.HeadSize) & 0xF)) & 0xF);\n  else\n    item.AlignSize = 0;\n  AddToSeekValue(m_BlockHeader.HeadSize);\n}\n\nvoid CInArchive::AddToSeekValue(UInt64 addValue)\n{\n  m_Position += addValue;\n}\n\nHRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword)\n{\n  if (m_SeekOnArchiveComment)\n    SkipArchiveComment();\n  for (;;)\n  {\n    if(!SeekInArchive(m_Position))\n      return S_FALSE;\n    if (!m_CryptoMode && (m_ArchiveHeader.Flags &\n        NHeader::NArchive::kBlockHeadersAreEncrypted) != 0)\n    {\n      m_CryptoMode = false;\n      if (getTextPassword == 0)\n        return S_FALSE;\n      if(!SeekInArchive(m_Position))\n        return S_FALSE;\n      if (!m_RarAES)\n      {\n        m_RarAESSpec = new NCrypto::NRar29::CDecoder;\n        m_RarAES = m_RarAESSpec;\n      }\n      m_RarAESSpec->SetRar350Mode(m_ArchiveHeader.IsEncryptOld());\n\n      // Salt\n      const UInt32 kSaltSize = 8;\n      Byte salt[kSaltSize];\n      if(!ReadBytesAndTestSize(salt, kSaltSize))\n        return S_FALSE;\n      m_Position += kSaltSize;\n      RINOK(m_RarAESSpec->SetDecoderProperties2(salt, kSaltSize))\n      // Password\n      CMyComBSTR password;\n      RINOK(getTextPassword->CryptoGetTextPassword(&password))\n      UString unicodePassword(password);\n\n      CByteBuffer buffer;\n      const UInt32 sizeInBytes = unicodePassword.Length() * 2;\n      buffer.SetCapacity(sizeInBytes);\n      for (int i = 0; i < unicodePassword.Length(); i++)\n      {\n        wchar_t c = unicodePassword[i];\n        ((Byte *)buffer)[i * 2] = (Byte)c;\n        ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);\n      }\n\n      RINOK(m_RarAESSpec->CryptoSetPassword((const Byte *)buffer, sizeInBytes));\n\n      const UInt32 kDecryptedBufferSize = (1 << 12);\n      if (m_DecryptedData.GetCapacity() == 0)\n      {\n        m_DecryptedData.SetCapacity(kDecryptedBufferSize);\n      }\n      RINOK(m_RarAES->Init());\n      size_t decryptedDataSizeT = kDecryptedBufferSize;\n      RINOK(ReadStream(m_Stream, (Byte *)m_DecryptedData, &decryptedDataSizeT));\n      m_DecryptedDataSize = (UInt32)decryptedDataSizeT;\n      m_DecryptedDataSize = m_RarAES->Filter((Byte *)m_DecryptedData, m_DecryptedDataSize);\n\n      m_CryptoMode = true;\n      m_CryptoPos = 0;\n    }\n\n    m_FileHeaderData.EnsureCapacity(7);\n    if(!ReadBytesAndTestSize((Byte *)m_FileHeaderData, 7))\n      return S_FALSE;\n\n    m_CurData = (Byte *)m_FileHeaderData;\n    m_CurPos = 0;\n    m_PosLimit = 7;\n    m_BlockHeader.CRC = ReadUInt16();\n    m_BlockHeader.Type = ReadByte();\n    m_BlockHeader.Flags = ReadUInt16();\n    m_BlockHeader.HeadSize = ReadUInt16();\n\n    if (m_BlockHeader.HeadSize < 7)\n      ThrowExceptionWithCode(CInArchiveException::kIncorrectArchive);\n\n    if (m_BlockHeader.Type == NHeader::NBlockType::kEndOfArchive)\n      return S_FALSE;\n\n    if (m_BlockHeader.Type == NHeader::NBlockType::kFileHeader)\n    {\n      m_FileHeaderData.EnsureCapacity(m_BlockHeader.HeadSize);\n      m_CurData = (Byte *)m_FileHeaderData;\n      m_PosLimit = m_BlockHeader.HeadSize;\n      ReadBytesAndTestResult(m_CurData + m_CurPos, m_BlockHeader.HeadSize - 7);\n      ReadHeaderReal(item);\n      if ((CrcCalc(m_CurData + 2,\n          m_BlockHeader.HeadSize - item.CommentSize - 2) & 0xFFFF) != m_BlockHeader.CRC)\n        ThrowExceptionWithCode(CInArchiveException::kFileHeaderCRCError);\n\n      FinishCryptoBlock();\n      m_CryptoMode = false;\n      SeekInArchive(m_Position); // Move Position to compressed Data;\n      AddToSeekValue(item.PackSize);  // m_Position points to next header;\n      return S_OK;\n    }\n    if (m_CryptoMode && m_BlockHeader.HeadSize > (1 << 12))\n      return E_FAIL; // it's for bad passwords\n    if ((m_BlockHeader.Flags & NHeader::NBlock::kLongBlock) != 0)\n    {\n      m_FileHeaderData.EnsureCapacity(7 + 4);\n      m_CurData = (Byte *)m_FileHeaderData;\n      ReadBytesAndTestResult(m_CurData + m_CurPos, 4); // test it\n      m_PosLimit = 7 + 4;\n      UInt32 dataSize = ReadUInt32();\n      AddToSeekValue(dataSize);\n      if (m_CryptoMode && dataSize > (1 << 27))\n        return E_FAIL; // it's for bad passwords\n      m_CryptoPos = m_BlockHeader.HeadSize;\n    }\n    else\n      m_CryptoPos = 0;\n    AddToSeekValue(m_BlockHeader.HeadSize);\n    FinishCryptoBlock();\n    m_CryptoMode = false;\n  }\n}\n\nbool CInArchive::SeekInArchive(UInt64 position)\n{\n  UInt64 newPosition;\n  m_Stream->Seek(position, STREAM_SEEK_SET, &newPosition);\n  return newPosition == position;\n}\n\nISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size)\n{\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  SeekInArchive(position);\n  streamSpec->SetStream(m_Stream);\n  streamSpec->Init(size);\n  return inStream.Detach();\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarIn.h",
    "content": "// RarIn.h\n\n#ifndef __ARCHIVE_RAR_IN_H\n#define __ARCHIVE_RAR_IN_H\n\n#include \"Common/DynamicBuffer.h\"\n#include \"Common/MyCom.h\"\n\n#include \"../../ICoder.h\"\n#include \"../../IStream.h\"\n\n#include \"../../Common/StreamObjects.h\"\n\n#include \"../../Crypto/RarAes.h\"\n\n#include \"RarHeader.h\"\n#include \"RarItem.h\"\n\nnamespace NArchive {\nnamespace NRar {\n\nclass CInArchiveException\n{\npublic:\n  enum CCauseType\n  {\n    kUnexpectedEndOfArchive = 0,\n    kArchiveHeaderCRCError,\n    kFileHeaderCRCError,\n    kIncorrectArchive\n  }\n  Cause;\n  CInArchiveException(CCauseType cause) :   Cause(cause) {}\n};\n\nclass CInArchiveInfo\n{\npublic:\n  UInt64 StartPosition;\n  UInt16 Flags;\n  UInt64 CommentPosition;\n  UInt16 CommentSize;\n  bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; }\n  bool IsCommented() const {  return (Flags & NHeader::NArchive::kComment) != 0; }\n  bool IsVolume() const {  return (Flags & NHeader::NArchive::kVolume) != 0; }\n  bool HaveNewVolumeName() const {  return (Flags & NHeader::NArchive::kNewVolName) != 0; }\n  bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }\n};\n\nclass CInArchive\n{\n  CMyComPtr<IInStream> m_Stream;\n  \n  UInt64 m_StreamStartPosition;\n  UInt64 m_Position;\n  UInt64 m_ArchiveStartPosition;\n  \n  NHeader::NArchive::CHeader360 m_ArchiveHeader;\n  CDynamicBuffer<char> m_NameBuffer;\n  CDynamicBuffer<wchar_t> _unicodeNameBuffer;\n  bool m_SeekOnArchiveComment;\n  UInt64 m_ArchiveCommentPosition;\n  \n  void ReadName(CItemEx &item, int nameSize);\n  void ReadHeaderReal(CItemEx &item);\n  \n  HRESULT ReadBytes(void *data, UInt32 size, UInt32 *aProcessedSize);\n  bool ReadBytesAndTestSize(void *data, UInt32 size);\n  void ReadBytesAndTestResult(void *data, UInt32 size);\n  \n  HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);\n  HRESULT Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit);\n\n  void ThrowExceptionWithCode(CInArchiveException::CCauseType cause);\n  void ThrowUnexpectedEndOfArchiveException();\n  \n  void AddToSeekValue(UInt64 addValue);\n  \nprotected:\n\n  CDynamicBuffer<Byte> m_FileHeaderData;\n  \n  NHeader::NBlock::CBlock m_BlockHeader;\n\n  NCrypto::NRar29::CDecoder *m_RarAESSpec;\n  CMyComPtr<ICompressFilter> m_RarAES;\n  \n  Byte *m_CurData; // it must point to start of Rar::Block\n  UInt32 m_CurPos;\n  UInt32 m_PosLimit;\n  Byte ReadByte();\n  UInt16 ReadUInt16();\n  UInt32 ReadUInt32();\n  void ReadTime(Byte mask, CRarTime &rarTime);\n\n  CBuffer<Byte> m_DecryptedData;\n  UInt32 m_DecryptedDataSize;\n\n  bool m_CryptoMode;\n  UInt32 m_CryptoPos;\n  void FinishCryptoBlock()\n  {\n    if (m_CryptoMode)\n      while ((m_CryptoPos & 0xF) != 0)\n      {\n        m_CryptoPos++;\n        m_Position++;\n      }\n  }\n\npublic:\n  HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit);\n  void Close();\n  HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword);\n  \n  void SkipArchiveComment();\n  \n  void GetArchiveInfo(CInArchiveInfo &archiveInfo) const;\n  \n  bool SeekInArchive(UInt64 position);\n  ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarItem.cpp",
    "content": "// RarItem.cpp\n\n#include \"StdAfx.h\"\n\n#include \"RarItem.h\"\n\nnamespace NArchive{\nnamespace NRar{\n\nbool CItem::IgnoreItem() const\n{\n  switch(HostOS)\n  {\n    case NHeader::NFile::kHostMSDOS:\n    case NHeader::NFile::kHostOS2:\n    case NHeader::NFile::kHostWin32:\n      return ((Attrib & NHeader::NFile::kLabelFileAttribute) != 0);\n  }\n  return false;\n}\n\nbool CItem::IsDir() const\n{\n  if (GetDictSize() == NHeader::NFile::kDictDirectoryValue)\n    return true;\n  switch(HostOS)\n  {\n    case NHeader::NFile::kHostMSDOS:\n    case NHeader::NFile::kHostOS2:\n    case NHeader::NFile::kHostWin32:\n      if ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)\n        return true;\n  }\n  return false;\n}\n\nUInt32 CItem::GetWinAttributes() const\n{\n  UInt32 winAttributes;\n  switch(HostOS)\n  {\n    case NHeader::NFile::kHostMSDOS:\n    case NHeader::NFile::kHostOS2:\n    case NHeader::NFile::kHostWin32:\n      winAttributes = Attrib;\n      break;\n    default:\n      winAttributes = 0; // must be converted from unix value;\n  }\n  if (IsDir())\n    winAttributes |= NHeader::NFile::kWinFileDirectoryAttributeMask;\n  return winAttributes;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarItem.h",
    "content": "// RarItem.h\n\n#ifndef __ARCHIVE_RAR_ITEM_H\n#define __ARCHIVE_RAR_ITEM_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n\n#include \"RarHeader.h\"\n\nnamespace NArchive{\nnamespace NRar{\n\nstruct CRarTime\n{\n  UInt32 DosTime;\n  Byte LowSecond;\n  Byte SubTime[3];\n};\n\nstruct CItem\n{\n  UInt64 Size;\n  UInt64 PackSize;\n  \n  CRarTime CTime;\n  CRarTime ATime;\n  CRarTime MTime;\n\n  UInt32 FileCRC;\n  UInt32 Attrib;\n\n  UInt16 Flags;\n  Byte HostOS;\n  Byte UnPackVersion;\n  Byte Method;\n\n  bool CTimeDefined;\n  bool ATimeDefined;\n\n  AString Name;\n  UString UnicodeName;\n\n  Byte Salt[8];\n  \n  bool IsEncrypted()   const { return (Flags & NHeader::NFile::kEncrypted) != 0; }\n  bool IsSolid()       const { return (Flags & NHeader::NFile::kSolid) != 0; }\n  bool IsCommented()   const { return (Flags & NHeader::NFile::kComment) != 0; }\n  bool IsSplitBefore() const { return (Flags & NHeader::NFile::kSplitBefore) != 0; }\n  bool IsSplitAfter()  const { return (Flags & NHeader::NFile::kSplitAfter) != 0; }\n  bool HasSalt()       const { return (Flags & NHeader::NFile::kSalt) != 0; }\n  bool HasExtTime()    const { return (Flags & NHeader::NFile::kExtTime) != 0; }\n  bool HasUnicodeName()const { return (Flags & NHeader::NFile::kUnicodeName) != 0; }\n  bool IsOldVersion()  const { return (Flags & NHeader::NFile::kOldVersion) != 0; }\n  \n  UInt32 GetDictSize() const { return (Flags >> NHeader::NFile::kDictBitStart) & NHeader::NFile::kDictMask; }\n  bool IsDir() const;\n  bool IgnoreItem() const;\n  UInt32 GetWinAttributes() const;\n  \n  CItem(): CTimeDefined(false), ATimeDefined(false) {}\n};\n\nclass CItemEx: public CItem\n{\npublic:\n  UInt64 Position;\n  UInt16 MainPartSize;\n  UInt16 CommentSize;\n  UInt16 AlignSize;\n  UInt64 GetFullSize()  const { return MainPartSize + CommentSize + AlignSize + PackSize; };\n  //  DWORD GetHeaderWithCommentSize()  const { return MainPartSize + CommentSize; };\n  UInt64 GetCommentPosition() const { return Position + MainPartSize; };\n  UInt64 GetDataPosition()    const { return GetCommentPosition() + CommentSize + AlignSize; };\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarRegister.cpp",
    "content": "// RarRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"RarHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NRar::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Rar\", L\"rar r00\", 0, 3, {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, 7, false, CreateArc, 0,  };\n\nvoid RegisterRar()\n{\n\tRegisterArc(&g_ArcInfo);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp",
    "content": "// RarVolumeInStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"RarVolumeInStream.h\"\n\n#include \"Windows/Defs.h\"\n#include \"Common/Defs.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/7zCrc.h\"\n}\n\nnamespace NArchive {\nnamespace NRar {\n\nvoid CFolderInStream::Init(\n    CObjectVector<CInArchive> *archives,\n    const CObjectVector<CItemEx> *items,\n    const CRefItem &refItem)\n{\n  _archives = archives;\n  _items = items;\n  _refItem = refItem;\n  _curIndex = 0;\n  CRCs.Clear();\n  _fileIsOpen = false;\n}\n\nHRESULT CFolderInStream::OpenStream()\n{\n  while (_curIndex < _refItem.NumItems)\n  {\n    const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];\n    _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].\n        CreateLimitedStream(item.GetDataPosition(), item.PackSize));\n    _curIndex++;\n    _fileIsOpen = true;\n    _crc = CRC_INIT_VAL;\n    return S_OK;\n  }\n  return S_OK;\n}\n\nHRESULT CFolderInStream::CloseStream()\n{\n  CRCs.Add(CRC_GET_DIGEST(_crc));\n  _stream.Release();\n  _fileIsOpen = false;\n  return S_OK;\n}\n\nSTDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize = 0;\n  while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)\n  {\n    if (_fileIsOpen)\n    {\n      UInt32 localProcessedSize;\n      RINOK(_stream->Read(\n          ((Byte *)data) + realProcessedSize, size, &localProcessedSize));\n      _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);\n      if (localProcessedSize == 0)\n      {\n        RINOK(CloseStream());\n        continue;\n      }\n      realProcessedSize += localProcessedSize;\n      size -= localProcessedSize;\n      break;\n    }\n    else\n    {\n      RINOK(OpenStream());\n    }\n  }\n  if (processedSize != 0)\n    *processedSize = realProcessedSize;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.h",
    "content": "// RarVolumeInStream.h\n\n#ifndef __RAR_VOLUME_IN_STREAM_H\n#define __RAR_VOLUME_IN_STREAM_H\n\n#include \"../../IStream.h\"\n#include \"RarIn.h\"\n\nnamespace NArchive {\nnamespace NRar {\n\nstruct CRefItem\n{\n  int VolumeIndex;\n  int ItemIndex;\n  int NumItems;\n};\n\nclass CFolderInStream:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n\nprivate:\n  CObjectVector<CInArchive> *_archives;\n  const CObjectVector<CItemEx> *_items;\n  CRefItem _refItem;\n  int _curIndex;\n  UInt32 _crc;\n  bool _fileIsOpen;\n  CMyComPtr<ISequentialInStream> _stream;\n\n  HRESULT OpenStream();\n  HRESULT CloseStream();\npublic:\n  void Init(CObjectVector<CInArchive> *archives,\n      const CObjectVector<CItemEx> *items,\n      const CRefItem &refItem);\n\n  CRecordVector<UInt32> CRCs;\n};\n  \n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/RpmHandler.cpp",
    "content": "// RpmHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/MyString.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/CopyCoder.h\"\n\nusing namespace NWindows;\n\n#define Get16(p) GetBe16(p)\n#define Get32(p) GetBe32(p)\n\nnamespace NArchive {\nnamespace NRpm {\n\n/* Reference: lib/signature.h of rpm package */\n#define RPMSIG_NONE         0  /* Do not change! */\n/* The following types are no longer generated */\n#define RPMSIG_PGP262_1024  1  /* No longer generated */ /* 256 byte */\n/* These are the new-style signatures.  They are Header structures.    */\n/* Inside them we can put any number of any type of signature we like. */\n\n#define RPMSIG_HEADERSIG    5  /* New Header style signature */\n\nconst UInt32 kLeadSize = 96;\nstruct CLead\n{\n  unsigned char Magic[4];\n  unsigned char Major;  // not supported  ver1, only support 2,3 and lator\n  unsigned char Minor;\n  UInt16 Type;\n  UInt16 ArchNum;\n  char Name[66];\n  UInt16 OSNum;\n  UInt16 SignatureType;\n  char Reserved[16];  // pad to 96 bytes -- 8 byte aligned\n  bool MagicCheck() const\n    { return Magic[0] == 0xed && Magic[1] == 0xab && Magic[2] == 0xee && Magic[3] == 0xdb; };\n};\n  \nconst UInt32 kEntryInfoSize = 16;\n/*\nstruct CEntryInfo\n{\n  int Tag;\n  int Type;\n  int Offset; // Offset from beginning of data segment, only defined on disk\n  int Count;\n};\n*/\n\n// case: SignatureType == RPMSIG_HEADERSIG\nconst UInt32 kCSigHeaderSigSize = 16;\nstruct CSigHeaderSig\n{\n  unsigned char Magic[4];\n  UInt32 Reserved;\n  UInt32 IndexLen;  // count of index entries\n  UInt32 DataLen;   // number of bytes\n  bool MagicCheck()\n    { return Magic[0] == 0x8e && Magic[1] == 0xad && Magic[2] == 0xe8 && Magic[3] == 0x01; };\n  UInt32 GetLostHeaderLen()\n    { return IndexLen * kEntryInfoSize + DataLen;  };\n};\n\nstatic HRESULT RedSigHeaderSig(IInStream *inStream, CSigHeaderSig &h)\n{\n  char dat[kCSigHeaderSigSize];\n  char *cur = dat;\n  RINOK(ReadStream_FALSE(inStream, dat, kCSigHeaderSigSize));\n  memmove(h.Magic, cur, 4);\n  cur += 4;\n  cur += 4;\n  h.IndexLen = Get32(cur);\n  cur += 4;\n  h.DataLen = Get32(cur);\n  return S_OK;\n}\n\nHRESULT OpenArchive(IInStream *inStream)\n{\n  UInt64 pos;\n  char leadData[kLeadSize];\n  char *cur = leadData;\n  CLead lead;\n  RINOK(ReadStream_FALSE(inStream, leadData, kLeadSize));\n  memmove(lead.Magic, cur, 4);\n  cur += 4;\n  lead.Major = *cur++;\n  lead.Minor = *cur++;\n  lead.Type = Get16(cur);\n  cur += 2;\n  lead.ArchNum = Get16(cur);\n  cur += 2;\n  memmove(lead.Name, cur, sizeof(lead.Name));\n  cur += sizeof(lead.Name);\n  lead.OSNum = Get16(cur);\n  cur += 2;\n  lead.SignatureType = Get16(cur);\n  cur += 2;\n\n  if (!lead.MagicCheck() || lead.Major < 3)\n    return S_FALSE;\n\n  CSigHeaderSig sigHeader, header;\n  if(lead.SignatureType == RPMSIG_NONE)\n  {\n    ;\n  }\n  else if(lead.SignatureType == RPMSIG_PGP262_1024)\n  {\n    UInt64 pos;\n    RINOK(inStream->Seek(256, STREAM_SEEK_CUR, &pos));\n  }\n  else if(lead.SignatureType == RPMSIG_HEADERSIG)\n  {\n    RINOK(RedSigHeaderSig(inStream, sigHeader));\n    if(!sigHeader.MagicCheck())\n      return S_FALSE;\n    UInt32 len = sigHeader.GetLostHeaderLen();\n    RINOK(inStream->Seek(len, STREAM_SEEK_CUR, &pos));\n    if((pos % 8) != 0)\n    {\n      RINOK(inStream->Seek((pos / 8 + 1) * 8 - pos,\n          STREAM_SEEK_CUR, &pos));\n    }\n  }\n  else\n    return S_FALSE;\n\n  RINOK(RedSigHeaderSig(inStream, header));\n  if(!header.MagicCheck())\n    return S_FALSE;\n  int headerLen = header.GetLostHeaderLen();\n  if(headerLen == -1)\n    return S_FALSE;\n  RINOK(inStream->Seek(headerLen, STREAM_SEEK_CUR, &pos));\n  return S_OK;\n}\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CMyComPtr<IInStream> m_InStream;\n  UInt64 m_Pos;\n  UInt64 m_Size;\n  Byte _sig[4];\n};\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  try\n  {\n    if(OpenArchive(inStream) != S_OK)\n      return S_FALSE;\n    RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Pos));\n    UInt64 endPosition;\n    RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPosition));\n    m_Size = endPosition - m_Pos;\n    \n    RINOK(inStream->Seek(m_Pos, STREAM_SEEK_SET, NULL));\n    RINOK(ReadStream_FALSE(inStream, _sig, sizeof(_sig) / sizeof(_sig[0])));\n\n    m_InStream = inStream;\n    return S_OK;\n  }\n  catch(...)\n  {\n    return S_FALSE;\n  }\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  m_InStream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = 1;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidSize:\n    case kpidPackSize:\n      prop = m_Size;\n      break;\n    case kpidExtension:\n    {\n      wchar_t s[32];\n      MyStringCopy(s, L\"cpio.\");\n      const wchar_t *ext;\n      if (_sig[0] == 0x1F && _sig[1] == 0x8B)\n        ext = L\"gz\";\n      else if (_sig[0] == 'B' && _sig[1] == 'Z' && _sig[2] == 'h')\n        ext = L\"bz2\";\n      else\n        ext = L\"lzma\";\n      MyStringCopy(s + MyStringLen(s), ext);\n      prop = s;\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = 1;\n  if(numItems == 0)\n    return S_OK;\n  if(numItems != 1)\n    return E_FAIL;\n  if (indices[0] != 0)\n    return E_FAIL;\n\n  bool testMode = (_aTestMode != 0);\n  \n  UInt64 currentTotalSize = 0;\n  RINOK(extractCallback->SetTotal(m_Size));\n  RINOK(extractCallback->SetCompleted(&currentTotalSize));\n  CMyComPtr<ISequentialOutStream> realOutStream;\n  Int32 askMode = testMode ?\n      NArchive::NExtract::NAskMode::kTest :\n      NArchive::NExtract::NAskMode::kExtract;\n  Int32 index = 0;\n \n  RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n  if(!testMode && (!realOutStream))\n    return S_OK;\n\n  RINOK(extractCallback->PrepareOperation(askMode));\n\n  if (testMode)\n  {\n    RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n    return S_OK;\n  }\n\n  RINOK(m_InStream->Seek(m_Pos, STREAM_SEEK_SET, NULL));\n\n  CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n  \n  RINOK(copyCoder->Code(m_InStream, realOutStream, NULL, NULL, progress));\n  realOutStream.Release();\n  return extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK);\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new NArchive::NRpm::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Rpm\", L\"rpm\", 0, 0xEB, { 0}, 0, false, CreateArc, 0 };\n\nREGISTER_ARC(Rpm)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Split/SplitHandler.cpp",
    "content": "// SplitHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/NewHandler.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n#include \"../Common/MultiStream.h\"\n\n#include \"SplitHandler.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NSplit {\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nclass CSeqName\n{\npublic:\n  UString _unchangedPart;\n  UString _changedPart;\n  bool _splitStyle;\n  UString GetNextName()\n  {\n    UString newName;\n    if (_splitStyle)\n    {\n      int i;\n      int numLetters = _changedPart.Length();\n      for (i = numLetters - 1; i >= 0; i--)\n      {\n        wchar_t c = _changedPart[i];\n        if (c == 'z')\n        {\n          c = 'a';\n          newName = c + newName;\n          continue;\n        }\n        else if (c == 'Z')\n        {\n          c = 'A';\n          newName = c + newName;\n          continue;\n        }\n        c++;\n        if ((c == 'z' || c == 'Z') && i == 0)\n        {\n          _unchangedPart += c;\n          wchar_t newChar = (c == 'z') ? L'a' : L'A';\n          newName.Empty();\n          numLetters++;\n          for (int k = 0; k < numLetters; k++)\n            newName += newChar;\n          break;\n        }\n        newName = c + newName;\n        i--;\n        for (; i >= 0; i--)\n          newName = _changedPart[i] + newName;\n        break;\n      }\n    }\n    else\n    {\n      int i;\n      int numLetters = _changedPart.Length();\n      for (i = numLetters - 1; i >= 0; i--)\n      {\n        wchar_t c = _changedPart[i];\n        if (c == L'9')\n        {\n          c = L'0';\n          newName = c + newName;\n          if (i == 0)\n            newName = UString(L'1') + newName;\n          continue;\n        }\n        c++;\n        newName = c + newName;\n        i--;\n        for (; i >= 0; i--)\n          newName = _changedPart[i] + newName;\n        break;\n      }\n    }\n    _changedPart = newName;\n    return _unchangedPart + _changedPart;\n  }\n};\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  Close();\n  if (openArchiveCallback == 0)\n    return S_FALSE;\n  // try\n  {\n    CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;\n    CMyComPtr<IArchiveOpenCallback> openArchiveCallbackWrap = openArchiveCallback;\n    if (openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback,\n        &openVolumeCallback) != S_OK)\n      return S_FALSE;\n    \n    {\n      NCOM::CPropVariant prop;\n      RINOK(openVolumeCallback->GetProperty(kpidName, &prop));\n      if (prop.vt != VT_BSTR)\n        return S_FALSE;\n      _name = prop.bstrVal;\n    }\n    \n    int dotPos = _name.ReverseFind('.');\n    UString prefix, ext;\n    if (dotPos >= 0)\n    {\n      prefix = _name.Left(dotPos + 1);\n      ext = _name.Mid(dotPos + 1);\n    }\n    else\n      ext = _name;\n    UString extBig = ext;\n    extBig.MakeUpper();\n\n    CSeqName seqName;\n\n    int numLetters = 2;\n    bool splitStyle = false;\n    if (extBig.Right(2) == L\"AA\")\n    {\n      splitStyle = true;\n      while (numLetters < extBig.Length())\n      {\n        if (extBig[extBig.Length() - numLetters - 1] != 'A')\n          break;\n        numLetters++;\n      }\n    }\n    else if (ext.Right(2) == L\"01\")\n    {\n      while (numLetters < extBig.Length())\n      {\n        if (extBig[extBig.Length() - numLetters - 1] != '0')\n          break;\n        numLetters++;\n      }\n      if (numLetters != ext.Length())\n        return S_FALSE;\n    }\n    else\n      return S_FALSE;\n\n    _streams.Add(stream);\n\n    seqName._unchangedPart = prefix + ext.Left(extBig.Length() - numLetters);\n    seqName._changedPart = ext.Right(numLetters);\n    seqName._splitStyle = splitStyle;\n\n    if (prefix.Length() < 1)\n      _subName = L\"file\";\n    else\n      _subName = prefix.Left(prefix.Length() - 1);\n\n    _totalSize = 0;\n    UInt64 size;\n    {\n      NCOM::CPropVariant prop;\n      RINOK(openVolumeCallback->GetProperty(kpidSize, &prop));\n      if (prop.vt != VT_UI8)\n        return E_INVALIDARG;\n      size = prop.uhVal.QuadPart;\n    }\n    _totalSize += size;\n    _sizes.Add(size);\n    \n    if (openArchiveCallback != NULL)\n    {\n      UInt64 numFiles = _streams.Size();\n      RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));\n    }\n\n    for (;;)\n    {\n      UString fullName = seqName.GetNextName();\n      CMyComPtr<IInStream> nextStream;\n      HRESULT result = openVolumeCallback->GetStream(fullName, &nextStream);\n      if (result == S_FALSE)\n        break;\n      if (result != S_OK)\n        return result;\n      if (!stream)\n        break;\n      {\n        NCOM::CPropVariant prop;\n        RINOK(openVolumeCallback->GetProperty(kpidSize, &prop));\n        if (prop.vt != VT_UI8)\n          return E_INVALIDARG;\n        size = prop.uhVal.QuadPart;\n      }\n      _totalSize += size;\n      _sizes.Add(size);\n      _streams.Add(nextStream);\n      if (openArchiveCallback != NULL)\n      {\n        UInt64 numFiles = _streams.Size();\n        RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));\n      }\n    }\n  }\n  /*\n  catch(...)\n  {\n    return S_FALSE;\n  }\n  */\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _sizes.Clear();\n  _streams.Clear();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _streams.IsEmpty() ? 0 : 1;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidPath:\n      prop = _subName;\n      break;\n    case kpidSize:\n    case kpidPackSize:\n      prop = _totalSize;\n      break;\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *_anExtractCallback)\n{\n  COM_TRY_BEGIN\n\n  if (numItems != UInt32(-1))\n  {\n    if (numItems != 1)\n      return E_INVALIDARG;\n    if (indices[0] != 0)\n      return E_INVALIDARG;\n  }\n  bool testMode = (_aTestMode != 0);\n  CMyComPtr<IArchiveExtractCallback> extractCallback = _anExtractCallback;\n  extractCallback->SetTotal(_totalSize);\n  \n  /*\n  CMyComPtr<IArchiveVolumeExtractCallback> volumeExtractCallback;\n  if (extractCallback.QueryInterface(&volumeExtractCallback) != S_OK)\n    return E_FAIL;\n  */\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n\n  RINOK(extractCallback->SetCompleted(&currentTotalSize));\n  CMyComPtr<ISequentialOutStream> realOutStream;\n  Int32 askMode;\n  askMode = testMode ? NArchive::NExtract::NAskMode::kTest :\n  NArchive::NExtract::NAskMode::kExtract;\n  Int32 index = 0;\n  RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n  \n  RINOK(extractCallback->PrepareOperation(askMode));\n  if (testMode)\n  {\n    RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n    return S_OK;\n  }\n  \n  if (!testMode && (!realOutStream))\n    return S_OK;\n\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  for (int i = 0; i < _streams.Size(); i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    IInStream *inStream = _streams[i];\n    RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));\n    RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));\n    currentItemSize = copyCoderSpec->TotalSize;\n  }\n  realOutStream.Release();\n  return extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)\n{\n  if (index != 0)\n    return E_INVALIDARG;\n  *stream = 0;\n  CMultiStream *streamSpec = new CMultiStream;\n  CMyComPtr<ISequentialInStream> streamTemp = streamSpec;\n  for (int i = 0; i < _streams.Size(); i++)\n  {\n    CMultiStream::CSubStreamInfo subStreamInfo;\n    subStreamInfo.Stream = _streams[i];\n    subStreamInfo.Pos = 0;\n    subStreamInfo.Size = _sizes[i];\n    streamSpec->Streams.Add(subStreamInfo);\n  }\n  streamSpec->Init();\n  *stream = streamTemp.Detach();\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Split/SplitHandler.h",
    "content": "// Split/Handler.h\n\n#ifndef __SPLIT_HANDLER_H\n#define __SPLIT_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/MyString.h\"\n#include \"../IArchive.h\"\n\nnamespace NArchive {\nnamespace NSplit {\n\nclass CHandler:\n  public IInArchive,\n  public IInArchiveGetStream,\n  // public IOutArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)\n\n  INTERFACE_IInArchive(;)\n\n  STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);\n\nprivate:\n  UString _subName;\n  UString _name;\n  CObjectVector<CMyComPtr<IInStream> > _streams;\n  CRecordVector<UInt64> _sizes;\n\n  UInt64 _totalSize;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Split/SplitHandlerOut.cpp",
    "content": "// Split/OutHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"SplitHandler.h\"\n#include \"../../../Windows/PropVariant.h\"\n#include \"../../../Common/ComTry.h\"\n#include \"../../../Common/StringToInt.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NSplit {\n\n/*\nSTDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)\n{\n  *type = NFileTimeType::kWindows;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,\n    IArchiveUpdateCallback *updateCallback)\n{\n  COM_TRY_BEGIN\n\n  if (numItems != 1)\n    return E_INVALIDARG;\n\n  UInt64 volumeSize = 0;\n\n  CMyComPtr<IArchiveUpdateCallback2> callback2;\n  updateCallback->QueryInterface(IID_IArchiveUpdateCallback2,\n      (void **)&callback2);\n\n  RINOK(callback2->GetVolumeSize(0, &volumeSize));\n\n  Int32 newData;\n  Int32 newProperties;\n  UInt32 indexInArchive;\n  if (!updateCallback)\n    return E_FAIL;\n\n  UInt32 fileIndex = 0;\n  RINOK(updateCallback->GetUpdateItemInfo(fileIndex,\n    &newData, &newProperties, &indexInArchive));\n\n  if (newProperties != 0)\n  {\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(fileIndex, kpidIsFolder, &prop));\n      if (prop.vt == VT_EMPTY)\n      {\n      }\n      else if (prop.vt != VT_BOOL)\n        return E_INVALIDARG;\n      else\n      {\n        if (prop.boolVal != VARIANT_FALSE)\n          return E_INVALIDARG;\n      }\n    }\n    {\n      NCOM::CPropVariant prop;\n      RINOK(updateCallback->GetProperty(fileIndex, kpidIsAnti, &prop));\n      if (prop.vt == VT_EMPTY)\n      {\n      }\n      else if (prop.vt != VT_BOOL)\n        return E_INVALIDARG;\n      else\n      {\n        if (prop.boolVal != VARIANT_FALSE)\n          return E_INVALIDARG;\n      }\n    }\n  }\n  UInt64 newSize;\n  bool thereIsCopyData = false;\n  if (newData != 0)\n  {\n    NCOM::CPropVariant prop;\n    RINOK(updateCallback->GetProperty(fileIndex, kpidSize, &prop));\n    if (prop.vt != VT_UI8)\n      return E_INVALIDARG;\n    newSize = prop.uhVal.QuadPart;\n  }\n  else\n    thereIsCopyData = true;\n\n  UInt64 pos = 0;\n  while(pos < newSize)\n  {\n\n  }\n  return S_OK;\n  COM_TRY_END\n}\n*/\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Split/SplitRegister.cpp",
    "content": "// SplitRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"SplitHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NSplit::CHandler;  }\n/*\n#ifndef EXTRACT_ONLY\nstatic IOutArchive *CreateArcOut() { return new NArchive::NSplit::CHandler;  }\n#else\n#define CreateArcOut 0\n#endif\n*/\n\nstatic CArcInfo g_ArcInfo =\n{ L\"Split\", L\"001\", 0, 0xEA, { 0 }, 0, false, CreateArc, 0 };\n\nREGISTER_ARC(Split)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarHandler.cpp",
    "content": "// TarHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/NewHandler.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/DummyOutStream.h\"\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"TarHandler.h\"\n#include \"TarIn.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NTar {\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidUser, VT_BSTR},\n  { NULL, kpidGroup, VT_BSTR}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nHRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)\n{\n  UInt64 endPos = 0;\n  if (callback != NULL)\n  {\n    RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));\n    RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));\n  }\n  \n  UInt64 pos = 0;\n  for (;;)\n  {\n    CItemEx item;\n    bool filled;\n    item.HeaderPosition = pos;\n    RINOK(ReadItem(stream, filled, item));\n    if (!filled)\n      break;\n    _items.Add(item);\n    \n    RINOK(stream->Seek(item.GetPackSize(), STREAM_SEEK_CUR, &pos));\n    if (pos >= endPos)\n      return S_FALSE;\n    if (callback != NULL)\n    {\n      if (_items.Size() == 1)\n      {\n        RINOK(callback->SetTotal(NULL, &endPos));\n      }\n      if (_items.Size() % 100 == 0)\n      {\n        UInt64 numFiles = _items.Size();\n        RINOK(callback->SetCompleted(&numFiles, &pos));\n      }\n    }\n  }\n\n  if (_items.Size() == 0)\n  {\n    CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;\n    if (!callback)\n      return S_FALSE;\n    callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);\n    if (!openVolumeCallback)\n      return S_FALSE;\n    NCOM::CPropVariant prop;\n    if (openVolumeCallback->GetProperty(kpidName, &prop) != S_OK)\n      return S_FALSE;\n    if (prop.vt != VT_BSTR)\n      return S_FALSE;\n    UString baseName = prop.bstrVal;\n    baseName = baseName.Right(4);\n    if (baseName.CompareNoCase(L\".tar\") != 0)\n      return S_FALSE;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  {\n    Close();\n    RINOK(Open2(stream, openArchiveCallback));\n    _inStream = stream;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _items.Clear();\n  _inStream.Release();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _items.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CItemEx &item = _items[index];\n\n  switch(propID)\n  {\n    case kpidPath:  prop = NItemName::GetOSName2(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;\n    case kpidIsDir:  prop = item.IsDir(); break;\n    case kpidSize:  prop = item.Size; break;\n    case kpidPackSize:  prop = item.GetPackSize(); break;\n    case kpidMTime:\n      if (item.MTime != 0)\n      {\n        FILETIME ft;\n        NTime::UnixTimeToFileTime(item.MTime, ft);\n        prop = ft;\n      }\n      break;\n    case kpidUser:  prop = MultiByteToUnicodeString(item.UserName, CP_OEMCP); break;\n    case kpidGroup:  prop = MultiByteToUnicodeString(item.GroupName, CP_OEMCP); break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _items.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n    totalSize += _items[allFilesMode ? i : indices[i]].Size;\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 totalPackSize, curPackSize, curSize;\n  totalSize = totalPackSize = 0;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(streamSpec);\n  streamSpec->SetStream(_inStream);\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n\n  for (i = 0; i < numItems; i++, totalSize += curSize, totalPackSize += curPackSize)\n  {\n    lps->InSize = totalPackSize;\n    lps->OutSize = totalSize;\n    RINOK(lps->SetCur());\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n    const CItemEx &item = _items[index];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n    curSize = item.Size;\n    curPackSize = item.GetPackSize();\n    if (item.IsDir())\n    {\n      RINOK(extractCallback->PrepareOperation(askMode));\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n\n    outStreamSpec->SetStream(realOutStream);\n    realOutStream.Release();\n    outStreamSpec->Init();\n\n    RINOK(_inStream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL));\n    streamSpec->Init(item.Size);\n    RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));\n    outStreamSpec->ReleaseStream();\n    RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == item.Size ?\n        NArchive::NExtract::NOperationResult::kOK:\n        NArchive::NExtract::NOperationResult::kDataError));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarHandler.h",
    "content": "// Tar/Handler.h\n\n#ifndef __TAR_HANDLER_H\n#define __TAR_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n\n#include \"TarItem.h\"\n\nnamespace NArchive {\nnamespace NTar {\n\nclass CHandler:\n  public IInArchive,\n  public IOutArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP2(\n    IInArchive,\n    IOutArchive\n  )\n\n  INTERFACE_IInArchive(;)\n  INTERFACE_IOutArchive(;)\n\n  HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);\n\nprivate:\n  CObjectVector<CItemEx> _items;\n  CMyComPtr<IInStream> _inStream;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarHandlerOut.cpp",
    "content": "// Tar/HandlerOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/ComTry.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n\n#include \"TarHandler.h\"\n#include \"TarUpdate.h\"\n\nusing namespace NWindows;\nusing namespace NCOM;\n\nnamespace NArchive {\nnamespace NTar {\n\nSTDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)\n{\n  *type = NFileTimeType::kUnix;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,\n    IArchiveUpdateCallback *callback)\n{\n  COM_TRY_BEGIN\n  CObjectVector<CUpdateItem> updateItems;\n  for (UInt32 i = 0; i < numItems; i++)\n  {\n    CUpdateItem ui;\n    Int32 newData;\n    Int32 newProperties;\n    UInt32 indexInArchive;\n    if (!callback)\n      return E_FAIL;\n    RINOK(callback->GetUpdateItemInfo(i, &newData, &newProperties, &indexInArchive));\n    ui.NewProperties = IntToBool(newProperties);\n    ui.NewData = IntToBool(newData);\n    ui.IndexInArchive = indexInArchive;\n    ui.IndexInClient = i;\n\n    if (IntToBool(newProperties))\n    {\n      FILETIME utcTime;\n      UString name;\n      /*\n      UInt32 attributes;\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidAttrib, &prop));\n        if (prop.vt == VT_EMPTY)\n          attributes = 0;\n        else if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        else\n          attributes = prop.ulVal;\n      }\n      */\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidMTime, &prop));\n        if (prop.vt != VT_FILETIME)\n          return E_INVALIDARG;\n        utcTime = prop.filetime;\n      }\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidPath, &prop));\n        if (prop.vt == VT_EMPTY)\n          name.Empty();\n        else if (prop.vt != VT_BSTR)\n          return E_INVALIDARG;\n        else\n          name = prop.bstrVal;\n      }\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidIsDir, &prop));\n        if (prop.vt == VT_EMPTY)\n          ui.IsDir = false;\n        else if (prop.vt != VT_BOOL)\n          return E_INVALIDARG;\n        else\n          ui.IsDir = (prop.boolVal != VARIANT_FALSE);\n      }\n      ui.Name = UnicodeStringToMultiByte(NItemName::MakeLegalName(name), CP_OEMCP);\n      if (ui.IsDir)\n        ui.Name += '/';\n\n      if (!NTime::FileTimeToUnixTime(utcTime, ui.Time))\n      {\n        ui.Time = 0;\n        // return E_INVALIDARG;\n      }\n    }\n    if (IntToBool(newData))\n    {\n      UInt64 size;\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidSize, &prop));\n        if (prop.vt != VT_UI8)\n          return E_INVALIDARG;\n        size = prop.uhVal.QuadPart;\n      }\n      ui.Size = size;\n    }\n    updateItems.Add(ui);\n  }\n  return UpdateArchive(_inStream, outStream, _items, updateItems, callback);\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarHeader.cpp",
    "content": "// Archive/Tar/Header.h\n\n#include \"StdAfx.h\"\n\n#include \"TarHeader.h\"\n\nnamespace NArchive {\nnamespace NTar {\nnamespace NFileHeader {\n\n  // The checksum field is filled with this while the checksum is computed.\n  const char *kCheckSumBlanks = \"        \";   // 8 blanks, no null\n\n  const char *kLongLink = \"././@LongLink\";\n  const char *kLongLink2 = \"@LongLink\";\n\n  // The magic field is filled with this if uname and gname are valid.\n  namespace NMagic\n  {\n    const char *kUsTar  = \"ustar\"; // 5 chars\n    const char *kGNUTar = \"GNUtar \"; // 7 chars and a null\n    const char *kEmpty = \"\\0\\0\\0\\0\\0\\0\\0\\0\"; // 7 chars and a null\n  }\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarHeader.h",
    "content": "// Archive/Tar/Header.h\n\n#ifndef __ARCHIVE_TAR_HEADER_H\n#define __ARCHIVE_TAR_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NTar {\n\nnamespace NFileHeader\n{\n  const int kRecordSize = 512;\n  const int kNameSize = 100;\n  const int kUserNameSize = 32;\n  const int kGroupNameSize = 32;\n  const int kPrefixSize = 155;\n\n  /*\n  struct CHeader\n  {\n    char Name[kNameSize];\n    char Mode[8];\n    char UID[8];\n    char GID[8];\n    char Size[12];\n    char ModificationTime[12];\n    char CheckSum[8];\n    char LinkFlag;\n    char LinkName[kNameSize];\n    char Magic[8];\n    char UserName[kUserNameSize];\n    char GroupName[kGroupNameSize];\n    char DeviceMajor[8];\n    char DeviceMinor[8];\n    char Prefix[155];\n  };\n  union CRecord\n  {\n    CHeader Header;\n    Byte Padding[kRecordSize];\n  };\n  */\n\n  namespace NMode\n  {\n    const int kSetUID   = 04000;  // Set UID on execution\n    const int kSetGID   = 02000;  // Set GID on execution\n    const int kSaveText = 01000;  // Save text (sticky bit)\n  }\n\n  namespace NFilePermissions\n  {\n    const int kUserRead     = 00400;  // read by owner\n    const int kUserWrite    = 00200;  // write by owner\n    const int kUserExecute  = 00100;  // execute/search by owner\n    const int kGroupRead    = 00040;  // read by group\n    const int kGroupWrite   = 00020;  // write by group\n    const int kGroupExecute = 00010;  // execute/search by group\n    const int kOtherRead    = 00004;  // read by other\n    const int kOtherWrite   = 00002;  // write by other\n    const int kOtherExecute = 00001;  // execute/search by other\n  }\n\n\n  // The linkflag defines the type of file\n  namespace NLinkFlag\n  {\n    const char kOldNormal    = '\\0'; // Normal disk file, Unix compatible\n    const char kNormal       = '0'; // Normal disk file\n    const char kLink         = '1'; // Link to previously dumped file\n    const char kSymbolicLink = '2'; // Symbolic link\n    const char kCharacter    = '3'; // Character special file\n    const char kBlock        = '4'; // Block special file\n    const char kDirectory    = '5'; // Directory\n    const char kFIFO         = '6'; // FIFO special file\n    const char kContiguous   = '7'; // Contiguous file\n\n    const char kDumpDir       = 'D'; /* GNUTYPE_DUMPDIR.\n      data: list of files created by the --incremental (-G) option\n      Each file name is preceded by either\n        - 'Y' (file should be in this archive)\n        - 'N' (file is a directory, or is not stored in the archive.)\n        Each file name is terminated by a null + an additional null after\n        the last file name. */\n\n  }\n  // Further link types may be defined later.\n\n  // The checksum field is filled with this while the checksum is computed.\n  extern const char *kCheckSumBlanks;//   = \"        \";   // 8 blanks, no null\n\n  extern const char *kLongLink;  //   = \"././@LongLink\";\n  extern const char *kLongLink2; //   = \"@LongLink\";\n\n  // The magic field is filled with this if uname and gname are valid.\n  namespace NMagic\n  {\n    extern const char *kUsTar; //   = \"ustar\"; // 5 chars\n    extern const char *kGNUTar; //  = \"GNUtar \"; // 7 chars and a null\n    extern const char *kEmpty; //  = \"GNUtar \"; // 7 chars and a null\n  }\n\n}\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarIn.cpp",
    "content": "// Archive/TarIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"TarIn.h\"\n#include \"TarHeader.h\"\n\n#include \"Common/StringToInt.h\"\n#include \"Windows/Defs.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\nnamespace NArchive {\nnamespace NTar {\n \nstatic void MyStrNCpy(char *dest, const char *src, int size)\n{\n  for (int i = 0; i < size; i++)\n  {\n    char c = src[i];\n    dest[i] = c;\n    if (c == 0)\n      break;\n  }\n}\n\nstatic bool OctalToNumber(const char *srcString, int size, UInt64 &res)\n{\n  char sz[32];\n  MyStrNCpy(sz, srcString, size);\n  sz[size] = 0;\n  const char *end;\n  int i;\n  for (i = 0; sz[i] == ' '; i++);\n  res = ConvertOctStringToUInt64(sz + i, &end);\n  return (*end == ' ' || *end == 0);\n}\n\nstatic bool OctalToNumber32(const char *srcString, int size, UInt32 &res)\n{\n  UInt64 res64;\n  if (!OctalToNumber(srcString, size, res64))\n    return false;\n  res = (UInt32)res64;\n  return (res64 <= 0xFFFFFFFF);\n}\n\n#define RIF(x) { if (!(x)) return S_FALSE; }\n\nstatic bool IsRecordLast(const char *buf)\n{\n  for (int i = 0; i < NFileHeader::kRecordSize; i++)\n    if (buf[i] != 0)\n      return false;\n  return true;\n}\n\nstatic void ReadString(const char *s, int size, AString &result)\n{\n  char temp[NFileHeader::kRecordSize + 1];\n  MyStrNCpy(temp, s, size);\n  temp[size] = '\\0';\n  result = temp;\n}\n\nstatic HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemEx &item, size_t &processedSize)\n{\n  item.LongLinkSize = 0;\n  char buf[NFileHeader::kRecordSize];\n  char *p = buf;\n\n  filled = false;\n\n  processedSize = NFileHeader::kRecordSize;\n  RINOK(ReadStream(stream, buf, &processedSize));\n  if (processedSize == 0 || (processedSize == NFileHeader::kRecordSize && IsRecordLast(buf)))\n    return S_OK;\n  if (processedSize < NFileHeader::kRecordSize)\n    return S_FALSE;\n  \n  ReadString(p, NFileHeader::kNameSize, item.Name); p += NFileHeader::kNameSize;\n\n  RIF(OctalToNumber32(p, 8, item.Mode)); p += 8;\n\n  if (!OctalToNumber32(p, 8, item.UID)) item.UID = 0; p += 8;\n  if (!OctalToNumber32(p, 8, item.GID)) item.GID = 0; p += 8;\n\n  RIF(OctalToNumber(p, 12, item.Size)); p += 12;\n  RIF(OctalToNumber32(p, 12, item.MTime)); p += 12;\n  \n  UInt32 checkSum;\n  RIF(OctalToNumber32(p, 8, checkSum));\n  memcpy(p, NFileHeader::kCheckSumBlanks, 8); p += 8;\n\n  item.LinkFlag = *p++;\n\n  ReadString(p, NFileHeader::kNameSize, item.LinkName); p += NFileHeader::kNameSize;\n\n  memcpy(item.Magic, p, 8); p += 8;\n\n  ReadString(p, NFileHeader::kUserNameSize, item.UserName);  p += NFileHeader::kUserNameSize;\n  ReadString(p, NFileHeader::kUserNameSize, item.GroupName); p += NFileHeader::kUserNameSize;\n\n  item.DeviceMajorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMajor)); p += 8;\n  item.DeviceMinorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMinor)); p += 8;\n\n  AString prefix;\n  ReadString(p, NFileHeader::kPrefixSize, prefix);\n  p += NFileHeader::kPrefixSize;\n  if (!prefix.IsEmpty() && item.IsMagic() &&\n      (item.LinkFlag != 'L' /* || prefix != \"00000000000\" */ ))\n    item.Name = prefix + AString('/') + item.Name;\n\n  if (item.LinkFlag == NFileHeader::NLinkFlag::kLink)\n    item.Size = 0;\n \n  UInt32 checkSumReal = 0;\n  for (int i = 0; i < NFileHeader::kRecordSize; i++)\n    checkSumReal += (Byte)buf[i];\n  \n  if (checkSumReal != checkSum)\n    return S_FALSE;\n\n  filled = true;\n  return S_OK;\n}\n\nHRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item)\n{\n  size_t processedSize;\n  RINOK(GetNextItemReal(stream, filled, item, processedSize));\n  if (!filled)\n    return S_OK;\n  // GNUtar extension\n  if (item.LinkFlag == 'L')\n  {\n    if (item.Name.Compare(NFileHeader::kLongLink) != 0)\n      if (item.Name.Compare(NFileHeader::kLongLink2) != 0)\n        return S_FALSE;\n\n    AString fullName;\n    if (item.Size > (1 << 15))\n      return S_FALSE;\n    int packSize = (int)item.GetPackSize();\n    char *buffer = fullName.GetBuffer(packSize + 1);\n\n    RINOK(ReadStream_FALSE(stream, buffer, packSize));\n    processedSize += packSize;\n    buffer[item.Size] = '\\0';\n    fullName.ReleaseBuffer();\n\n    UInt64 headerPosition = item.HeaderPosition;\n    {\n      size_t processedSize2;\n      RINOK(GetNextItemReal(stream, filled, item, processedSize2));\n    }\n    item.LongLinkSize = (unsigned)processedSize;\n    item.Name = fullName;\n    item.HeaderPosition = headerPosition;\n  }\n  else if (item.LinkFlag == 'g' || item.LinkFlag == 'x' || item.LinkFlag == 'X')\n  {\n    // pax Extended Header\n    return S_OK;\n  }\n  else if (item.LinkFlag == NFileHeader::NLinkFlag::kDumpDir)\n  {\n    // GNU Extensions to the Archive Format\n    return S_OK;\n  }\n  else if (item.LinkFlag > '7' || (item.LinkFlag < '0' && item.LinkFlag != 0))\n    return S_FALSE;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarIn.h",
    "content": "// Archive/TarIn.h\n\n#ifndef __ARCHIVE_TAR_IN_H\n#define __ARCHIVE_TAR_IN_H\n\n#include \"Common/MyCom.h\"\n#include \"../../IStream.h\"\n\n#include \"TarItem.h\"\n\nnamespace NArchive {\nnamespace NTar {\n  \nHRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &itemInfo);\n\n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarItem.h",
    "content": "// Archive/Tar/Item.h\n\n#ifndef __ARCHIVE_TAR_ITEM_H\n#define __ARCHIVE_TAR_ITEM_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n#include \"TarHeader.h\"\n\nnamespace NArchive {\nnamespace NTar {\n\nstruct CItem\n{\n  AString Name;\n  UInt64 Size;\n\n  UInt32 Mode;\n  UInt32 UID;\n  UInt32 GID;\n  UInt32 MTime;\n  UInt32 DeviceMajor;\n  UInt32 DeviceMinor;\n\n  AString LinkName;\n  AString UserName;\n  AString GroupName;\n\n  char Magic[8];\n  char LinkFlag;\n  bool DeviceMajorDefined;\n  bool DeviceMinorDefined;\n\n  bool IsDir() const\n  {\n    switch(LinkFlag)\n    {\n      case NFileHeader::NLinkFlag::kDirectory:\n      case NFileHeader::NLinkFlag::kDumpDir:\n        return true;\n      case NFileHeader::NLinkFlag::kOldNormal:\n      case NFileHeader::NLinkFlag::kNormal:\n        return NItemName::HasTailSlash(Name, CP_OEMCP);\n    }\n    return false;\n  }\n\n  bool IsMagic() const\n  {\n    for (int i = 0; i < 5; i++)\n      if (Magic[i] != NFileHeader::NMagic::kUsTar[i])\n        return false;\n    return true;\n  }\n\n  UInt64 GetPackSize() const { return (Size + 0x1FF) & (~((UInt64)0x1FF)); }\n};\n\nstruct CItemEx: public CItem\n{\n  UInt64 HeaderPosition;\n  unsigned LongLinkSize;\n  UInt64 GetDataPosition() const { return HeaderPosition + LongLinkSize + NFileHeader::kRecordSize; }\n  UInt64 GetFullSize() const { return LongLinkSize + NFileHeader::kRecordSize + Size; }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarOut.cpp",
    "content": "// Archive/TarOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"TarOut.h\"\n#include \"TarHeader.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Windows/Defs.h\"\n#include \"../../Common/StreamUtils.h\"\n\nnamespace NArchive {\nnamespace NTar {\n\nHRESULT COutArchive::WriteBytes(const void *buffer, UInt32 size)\n{\n  return WriteStream(m_Stream, buffer, size);\n}\n\nvoid COutArchive::Create(ISequentialOutStream *outStream)\n{\n  m_Stream = outStream;\n}\n\nstatic AString MakeOctalString(UInt64 value)\n{\n  char s[32];\n  ConvertUInt64ToString(value, s, 8);\n  return AString(s) + ' ';\n}\n\nstatic void MyStrNCpy(char *dest, const char *src, int size)\n{\n  for (int i = 0; i < size; i++)\n  {\n    char c = src[i];\n    dest[i] = c;\n    if (c == 0)\n      break;\n  }\n}\n\nstatic bool MakeOctalString8(char *s, UInt32 value)\n{\n  AString tempString = MakeOctalString(value);\n\n  const int kMaxSize = 8;\n  if (tempString.Length() >= kMaxSize)\n    return false;\n  int numSpaces = kMaxSize - (tempString.Length() + 1);\n  for(int i = 0; i < numSpaces; i++)\n    s[i] = ' ';\n  MyStringCopy(s + numSpaces, (const char *)tempString);\n  return true;\n}\n\nstatic bool MakeOctalString12(char *s, UInt64 value)\n{\n  AString tempString  = MakeOctalString(value);\n  const int kMaxSize = 12;\n  if (tempString.Length() > kMaxSize)\n    return false;\n  int numSpaces = kMaxSize - tempString.Length();\n  for(int i = 0; i < numSpaces; i++)\n    s[i] = ' ';\n  memmove(s + numSpaces, (const char *)tempString, tempString.Length());\n  return true;\n}\n\nstatic bool CopyString(char *dest, const AString &src, int maxSize)\n{\n  if (src.Length() >= maxSize)\n    return false;\n  MyStringCopy(dest, (const char *)src);\n  return true;\n}\n\n#define RETURN_IF_NOT_TRUE(x) { if (!(x)) return E_FAIL; }\n\nHRESULT COutArchive::WriteHeaderReal(const CItem &item)\n{\n  char record[NFileHeader::kRecordSize];\n  char *cur = record;\n  int i;\n  for (i = 0; i < NFileHeader::kRecordSize; i++)\n    record[i] = 0;\n\n  // RETURN_IF_NOT_TRUE(CopyString(header.Name, item.Name, NFileHeader::kNameSize));\n  if (item.Name.Length() > NFileHeader::kNameSize)\n    return E_FAIL;\n  MyStrNCpy(cur, item.Name, NFileHeader::kNameSize);\n  cur += NFileHeader::kNameSize;\n\n  RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.Mode));\n  cur += 8;\n  RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.UID));\n  cur += 8;\n  RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.GID));\n  cur += 8;\n\n  RETURN_IF_NOT_TRUE(MakeOctalString12(cur, item.Size));\n  cur += 12;\n  RETURN_IF_NOT_TRUE(MakeOctalString12(cur, item.MTime));\n  cur += 12;\n  \n  memmove(cur, NFileHeader::kCheckSumBlanks, 8);\n  cur += 8;\n\n  *cur++ = item.LinkFlag;\n\n  RETURN_IF_NOT_TRUE(CopyString(cur, item.LinkName, NFileHeader::kNameSize));\n  cur += NFileHeader::kNameSize;\n\n  memmove(cur, item.Magic, 8);\n  cur += 8;\n\n  RETURN_IF_NOT_TRUE(CopyString(cur, item.UserName, NFileHeader::kUserNameSize));\n  cur += NFileHeader::kUserNameSize;\n  RETURN_IF_NOT_TRUE(CopyString(cur, item.GroupName, NFileHeader::kGroupNameSize));\n  cur += NFileHeader::kUserNameSize;\n\n\n  if (item.DeviceMajorDefined)\n    RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.DeviceMajor));\n  cur += 8;\n\n  if (item.DeviceMinorDefined)\n    RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.DeviceMinor));\n  cur += 8;\n\n\n  UInt32 checkSumReal = 0;\n  for(i = 0; i < NFileHeader::kRecordSize; i++)\n    checkSumReal += Byte(record[i]);\n\n  RETURN_IF_NOT_TRUE(MakeOctalString8(record + 148, checkSumReal));\n\n  return WriteBytes(record, NFileHeader::kRecordSize);\n}\n\nHRESULT COutArchive::WriteHeader(const CItem &item)\n{\n  int nameSize = item.Name.Length();\n  if (nameSize < NFileHeader::kNameSize)\n    return WriteHeaderReal(item);\n\n  CItem modifiedItem = item;\n  int nameStreamSize = nameSize + 1;\n  modifiedItem.Size = nameStreamSize;\n  modifiedItem.LinkFlag = 'L';\n  modifiedItem.Name = NFileHeader::kLongLink;\n  modifiedItem.LinkName.Empty();\n  RINOK(WriteHeaderReal(modifiedItem));\n  RINOK(WriteBytes(item.Name, nameStreamSize));\n  RINOK(FillDataResidual(nameStreamSize));\n\n  modifiedItem = item;\n  modifiedItem.Name = item.Name.Left(NFileHeader::kNameSize - 1);\n  return WriteHeaderReal(modifiedItem);\n}\n\nHRESULT COutArchive::FillDataResidual(UInt64 dataSize)\n{\n  UInt32 lastRecordSize = UInt32(dataSize & (NFileHeader::kRecordSize - 1));\n  if (lastRecordSize == 0)\n    return S_OK;\n  UInt32 residualSize = NFileHeader::kRecordSize - lastRecordSize;\n  Byte residualBytes[NFileHeader::kRecordSize];\n  for (UInt32 i = 0; i < residualSize; i++)\n    residualBytes[i] = 0;\n  return WriteBytes(residualBytes, residualSize);\n}\n\nHRESULT COutArchive::WriteFinishHeader()\n{\n  Byte record[NFileHeader::kRecordSize];\n  int i;\n  for (i = 0; i < NFileHeader::kRecordSize; i++)\n    record[i] = 0;\n  for (i = 0; i < 2; i++)\n  {\n    RINOK(WriteBytes(record, NFileHeader::kRecordSize));\n  }\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarOut.h",
    "content": "// Archive/TarOut.h\n\n#ifndef __ARCHIVE_TAR_OUT_H\n#define __ARCHIVE_TAR_OUT_H\n\n#include \"TarItem.h\"\n\n#include \"Common/MyCom.h\"\n#include \"../../IStream.h\"\n\nnamespace NArchive {\nnamespace NTar {\n\nclass COutArchive\n{\n  CMyComPtr<ISequentialOutStream> m_Stream;\n  HRESULT WriteBytes(const void *buffer, UInt32 size);\npublic:\n  void Create(ISequentialOutStream *outStream);\n  HRESULT WriteHeaderReal(const CItem &item);\n  HRESULT WriteHeader(const CItem &item);\n  HRESULT FillDataResidual(UInt64 dataSize);\n  HRESULT WriteFinishHeader();\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarRegister.cpp",
    "content": "// TarRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"TarHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NTar::CHandler;  }\n#ifndef EXTRACT_ONLY\nstatic IOutArchive *CreateArcOut() { return new NArchive::NTar::CHandler;  }\n#else\n#define CreateArcOut 0\n#endif\n\nstatic CArcInfo g_ArcInfo =\n{ L\"Tar\", L\"tar\", 0, 0xEE, { 'u', 's', 't', 'a', 'r' }, 5, false, CreateArc, CreateArcOut };\n\nREGISTER_ARC(Tar)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarUpdate.cpp",
    "content": "// TarUpdate.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"TarOut.h\"\n#include \"TarUpdate.h\"\n\nnamespace NArchive {\nnamespace NTar {\n\nHRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream,\n    const CObjectVector<NArchive::NTar::CItemEx> &inputItems,\n    const CObjectVector<CUpdateItem> &updateItems,\n    IArchiveUpdateCallback *updateCallback)\n{\n  COutArchive outArchive;\n  outArchive.Create(outStream);\n\n  UInt64 complexity = 0;\n\n  int i;\n  for(i = 0; i < updateItems.Size(); i++)\n  {\n    const CUpdateItem &ui = updateItems[i];\n    if (ui.NewData)\n      complexity += ui.Size;\n    else\n      complexity += inputItems[ui.IndexInArchive].GetFullSize();\n  }\n\n  RINOK(updateCallback->SetTotal(complexity));\n\n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(updateCallback, true);\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);\n  streamSpec->SetStream(inStream);\n\n  complexity = 0;\n\n  for(i = 0; i < updateItems.Size(); i++)\n  {\n    lps->InSize = lps->OutSize = complexity;\n    RINOK(lps->SetCur());\n\n    const CUpdateItem &ui = updateItems[i];\n    CItem item;\n    if (ui.NewProperties)\n    {\n      item.Mode = 0777;\n      item.Name = (ui.Name);\n      if (ui.IsDir)\n      {\n        item.LinkFlag = NFileHeader::NLinkFlag::kDirectory;\n        item.Size = 0;\n      }\n      else\n      {\n        item.LinkFlag = NFileHeader::NLinkFlag::kNormal;\n        item.Size = ui.Size;\n      }\n      item.MTime = ui.Time;\n      item.DeviceMajorDefined = false;\n      item.DeviceMinorDefined = false;\n      item.UID = 0;\n      item.GID = 0;\n      memmove(item.Magic, NFileHeader::NMagic::kEmpty, 8);\n    }\n    else\n    {\n      const CItemEx &existItemInfo = inputItems[ui.IndexInArchive];\n      item = existItemInfo;\n    }\n    if (ui.NewData)\n    {\n      item.Size = ui.Size;\n      if (item.Size == UInt64(Int64(-1)))\n        return E_INVALIDARG;\n    }\n    else\n    {\n      const CItemEx &existItemInfo = inputItems[ui.IndexInArchive];\n      item.Size = existItemInfo.Size;\n    }\n  \n    if (ui.NewData)\n    {\n      CMyComPtr<ISequentialInStream> fileInStream;\n      HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);\n      if (res != S_FALSE)\n      {\n        RINOK(res);\n        RINOK(outArchive.WriteHeader(item));\n        if (!ui.IsDir)\n        {\n          RINOK(copyCoder->Code(fileInStream, outStream, NULL, NULL, progress));\n          if (copyCoderSpec->TotalSize != item.Size)\n            return E_FAIL;\n          RINOK(outArchive.FillDataResidual(item.Size));\n        }\n      }\n      complexity += ui.Size;\n      RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n    }\n    else\n    {\n      const CItemEx &existItemInfo = inputItems[ui.IndexInArchive];\n      UInt64 size;\n      if (ui.NewProperties)\n      {\n        RINOK(outArchive.WriteHeader(item));\n        RINOK(inStream->Seek(existItemInfo.GetDataPosition(), STREAM_SEEK_SET, NULL));\n        size = existItemInfo.Size;\n      }\n      else\n      {\n        RINOK(inStream->Seek(existItemInfo.HeaderPosition, STREAM_SEEK_SET, NULL));\n        size = existItemInfo.GetFullSize();\n      }\n      streamSpec->Init(size);\n\n      RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress));\n      if (copyCoderSpec->TotalSize != size)\n        return E_FAIL;\n      RINOK(outArchive.FillDataResidual(existItemInfo.Size));\n      complexity += size;\n    }\n  }\n  return outArchive.WriteFinishHeader();\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Tar/TarUpdate.h",
    "content": "// Tar/Update.h\n\n#ifndef __TAR_UPDATE_H\n#define __TAR_UPDATE_H\n\n#include \"../IArchive.h\"\n#include \"TarItem.h\"\n\nnamespace NArchive {\nnamespace NTar {\n\nstruct CUpdateItem\n{\n  bool NewData;\n  bool NewProperties;\n  int IndexInArchive;\n  int IndexInClient;\n\n  UInt32 Time;\n  UInt64 Size;\n  AString Name;\n  bool IsDir;\n};\n\nHRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream,\n    const CObjectVector<CItemEx> &inputItems,\n    const CObjectVector<CUpdateItem> &updateItems,\n    IArchiveUpdateCallback *updateCallback);\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Udf/UdfHandler.cpp",
    "content": "// UdfHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/NewHandler.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/DummyOutStream.h\"\n\n#include \"UdfHandler.h\"\n\nnamespace NArchive {\nnamespace NUdf {\n\nvoid UdfTimeToFileTime(const CTime &t, NWindows::NCOM::CPropVariant &prop)\n{\n  UInt64 numSecs;\n  const Byte *d = t.Data;\n  if (!NWindows::NTime::GetSecondsSince1601(t.GetYear(), d[4], d[5], d[6], d[7], d[8], numSecs))\n    return;\n  if (t.IsLocal())\n    numSecs -= t.GetMinutesOffset() * 60;\n  FILETIME ft;\n  UInt64 v = (((numSecs * 100 + d[9]) * 100 + d[10]) * 100 + d[11]) * 10;\n  ft.dwLowDateTime = (UInt32)v;\n  ft.dwHighDateTime = (UInt32)(v >> 32);\n  prop = ft;\n}\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME}\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidComment, VT_BSTR},\n  { NULL, kpidClusterSize, VT_UI4},\n  { NULL, kpidCTime, VT_FILETIME}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidComment:\n    {\n      UString comment = _archive.GetComment();\n      if (!comment.IsEmpty())\n        prop = comment;\n      break;\n    }\n\n    case kpidClusterSize:\n      if (_archive.LogVols.Size() > 0)\n      {\n        UInt32 blockSize = _archive.LogVols[0].BlockSize;\n        int i;\n        for (i = 1; i < _archive.LogVols.Size(); i++)\n          if (_archive.LogVols[i].BlockSize != blockSize)\n            break;\n        if (i == _archive.LogVols.Size())\n          prop = blockSize;\n      }\n      break;\n\n    case kpidCTime:\n      if (_archive.LogVols.Size() == 1)\n      {\n        const CLogVol &vol = _archive.LogVols[0];\n        if (vol.FileSets.Size() >= 1)\n          UdfTimeToFileTime(vol.FileSets[0].RecodringTime, prop);\n      }\n      break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nclass CProgressImp: public CProgressVirt\n{\n  CMyComPtr<IArchiveOpenCallback> _callback;\n  UInt64 _numFiles;\n  UInt64 _numBytes;\npublic:\n  HRESULT SetTotal(UInt64 numBytes);\n  HRESULT SetCompleted(UInt64 numFiles, UInt64 numBytes);\n  HRESULT SetCompleted();\n  CProgressImp(IArchiveOpenCallback *callback): _callback(callback), _numFiles(0), _numBytes(0) {}\n};\n\nHRESULT CProgressImp::SetTotal(UInt64 numBytes)\n{\n  if (_callback)\n    return _callback->SetTotal(NULL, &numBytes);\n  return S_OK;\n}\n\nHRESULT CProgressImp::SetCompleted(UInt64 numFiles, UInt64 numBytes)\n{\n  _numFiles = numFiles;\n  _numBytes = numBytes;\n  return SetCompleted();\n}\n\nHRESULT CProgressImp::SetCompleted()\n{\n  if (_callback)\n    return _callback->SetCompleted(&_numFiles, &_numBytes);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback *callback)\n{\n  COM_TRY_BEGIN\n  {\n    Close();\n    CProgressImp progressImp(callback);\n    RINOK(_archive.Open(stream, &progressImp));\n    bool showVolName = (_archive.LogVols.Size() > 1);\n    for (int volIndex = 0; volIndex < _archive.LogVols.Size(); volIndex++)\n    {\n      const CLogVol &vol = _archive.LogVols[volIndex];\n      bool showFileSetName = (vol.FileSets.Size() > 1);\n      for (int fsIndex = 0; fsIndex < vol.FileSets.Size(); fsIndex++)\n      {\n        const CFileSet &fs = vol.FileSets[fsIndex];\n        for (int i = ((showVolName || showFileSetName) ? 0 : 1); i < fs.Refs.Size(); i++)\n        {\n          CRef2 ref2;\n          ref2.Vol = volIndex;\n          ref2.Fs = fsIndex;\n          ref2.Ref = i;\n          _refs2.Add(ref2);\n        }\n      }\n    }\n    _inStream = stream;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _archive.Clear();\n  _refs2.Clear();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _refs2.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  {\n    const CRef2 &ref2 = _refs2[index];\n    const CLogVol &vol = _archive.LogVols[ref2.Vol];\n    const CRef &ref = vol.FileSets[ref2.Fs].Refs[ref2.Ref];\n    const CFile &file = _archive.Files[ref.FileIndex];\n    const CItem &item = _archive.Items[file.ItemIndex];\n    switch(propID)\n    {\n      case kpidPath:  prop = _archive.GetItemPath(ref2.Vol, ref2.Fs, ref2.Ref,\n            _archive.LogVols.Size() > 1, vol.FileSets.Size() > 1); break;\n      case kpidIsDir:  prop = item.IsDir(); break;\n      case kpidSize:      if (!item.IsDir()) prop = (UInt64)item.Size; break;\n      case kpidPackSize:  if (!item.IsDir()) prop = (UInt64)item.NumLogBlockRecorded * vol.BlockSize; break;\n      case kpidMTime:  UdfTimeToFileTime(item.MTime, prop); break;\n      case kpidATime:  UdfTimeToFileTime(item.ATime, prop); break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nclass CUdfInStream:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  UInt64 _rem;\npublic:\n  CInArchive *_archive;\n  CMyComPtr<IInStream> _stream;\n  CRef2 _ref2;\n  int _extentIndex;\n  UInt32 _offsetInExtent;\n\n  void Init(UInt64 size)\n  {\n    _extentIndex = 0;\n    _offsetInExtent = 0;\n    _rem = size;\n  }\n  void ReleaseStream() { _stream.Release(); }\n};\n\nSTDMETHODIMP CUdfInStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  if (processedSize)\n    *processedSize = 0;\n  if (size > _rem)\n    size = (UInt32)_rem;\n  while (size > 0)\n  {\n    const CLogVol &vol = _archive->LogVols[_ref2.Vol];\n    const CRef &ref = vol.FileSets[_ref2.Fs].Refs[_ref2.Ref];\n    const CFile &file = _archive->Files[ref.FileIndex];\n    const CItem &item = _archive->Items[file.ItemIndex];\n\n    HRESULT res = S_OK;\n    if (item.IsInline)\n    {\n      size_t rem = item.InlineData.GetCapacity() - _offsetInExtent;\n      if (rem == 0)\n        return S_OK;\n      if (rem > _rem)\n        rem = (size_t)_rem;\n      memcpy(data, (const Byte *)item.InlineData + _offsetInExtent, rem);\n    }\n    else\n    {\n      if (_extentIndex >= item.Extents.Size())\n        return S_OK;\n      const CMyExtent &extent = item.Extents[_extentIndex];\n      UInt32 rem = extent.GetLen() - _offsetInExtent;\n      if (rem == 0)\n      {\n        _extentIndex++;\n        _offsetInExtent = 0;\n        continue;\n      }\n      if (size > rem)\n        size = rem;\n      \n      int partitionIndex = vol.PartitionMaps[extent.PartitionRef].PartitionIndex;\n      UInt32 logBlockNumber = extent.Pos;\n      const CPartition &partition = _archive->Partitions[partitionIndex];\n      UInt64 offset = ((UInt64)partition.Pos << _archive->SecLogSize) +\n        (UInt64)logBlockNumber * vol.BlockSize + _offsetInExtent;\n      \n      RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));\n      res = _stream->Read(data, size, &size);\n    }\n    _offsetInExtent += size;\n    _rem -= size;\n    if (processedSize)\n      *processedSize = size;\n    return res;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _refs2.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n\n  for (i = 0; i < numItems; i++)\n  {\n    UInt32 index = (allFilesMode ? i : indices[i]);\n    const CRef2 &ref2 = _refs2[index];\n    const CRef &ref = _archive.LogVols[ref2.Vol].FileSets[ref2.Fs].Refs[ref2.Ref];\n    const CFile &file = _archive.Files[ref.FileIndex];\n    const CItem &item = _archive.Items[file.ItemIndex];\n    if (!item.IsDir())\n      totalSize += item.Size;\n  }\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentTotalSize = 0;\n  UInt64 currentItemSize;\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CUdfInStream *udfInStreamSpec = new CUdfInStream();\n  CMyComPtr<ISequentialInStream> udfInStream = udfInStreamSpec;\n\n  udfInStreamSpec->_archive = &_archive;\n  udfInStreamSpec->_stream = _inStream;\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n\n  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)\n  {\n    lps->InSize = lps->OutSize = currentTotalSize;\n    RINOK(lps->SetCur());\n    currentItemSize = 0;\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    UInt32 index = allFilesMode ? i : indices[i];\n    \n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    const CRef2 &ref2 = _refs2[index];\n    const CRef &ref = _archive.LogVols[ref2.Vol].FileSets[ref2.Fs].Refs[ref2.Ref];\n    const CFile &file = _archive.Files[ref.FileIndex];\n    const CItem &item = _archive.Items[file.ItemIndex];\n\n    if (item.IsDir())\n    {\n      RINOK(extractCallback->PrepareOperation(askMode));\n      RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      continue;\n    }\n    currentItemSize = item.Size;\n\n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n\n    outStreamSpec->SetStream(realOutStream);\n    realOutStream.Release();\n    outStreamSpec->Init();\n    Int32 opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n    if (item.IsRecAndAlloc() && item.CheckChunkSizes() && _archive.CheckItemExtents(ref2.Vol, item))\n    {\n      udfInStreamSpec->_ref2 = ref2;\n      udfInStreamSpec->Init(item.Size);\n      RINOK(copyCoder->Code(udfInStream, outStream, NULL, NULL, progress));\n      opRes = (outStreamSpec->GetSize() == currentItemSize) ?\n          NArchive::NExtract::NOperationResult::kOK:\n          NArchive::NExtract::NOperationResult::kDataError;\n    }\n    outStreamSpec->ReleaseStream();\n    RINOK(extractCallback->SetOperationResult(opRes));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Udf/UdfHandler.h",
    "content": "// Udf/Handler.h\n\n#ifndef __UDF_HANDLER_H\n#define __UDF_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"../IArchive.h\"\n\n#include \"UdfIn.h\"\n\nnamespace NArchive {\nnamespace NUdf {\n\nstruct CRef2\n{\n  int Vol;\n  int Fs;\n  int Ref;\n};\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  CMyComPtr<IInStream> _inStream;\n  CInArchive _archive;\n  CRecordVector<CRef2> _refs2;\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\n}}\n\n#endif\n  "
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Udf/UdfIn.cpp",
    "content": "// Archive/UdfIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"UdfIn.h\"\n\n#include \"../../Common/StreamUtils.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/CpuArch.h\"\n}\n\n#define Get16(p) GetUi16(p)\n#define Get32(p) GetUi32(p)\n#define Get64(p) GetUi64(p)\n\nnamespace NArchive {\nnamespace NUdf {\n\nconst int kNumPartitionsMax = 64;\nconst int kNumLogVolumesMax = 64;\nconst int kNumRecureseLevelsMax = 1 << 10;\nconst int kNumItemsMax = 1 << 27;\nconst int kNumFilesMax = 1 << 28;\nconst int kNumRefsMax = 1 << 28;\nconst UInt32 kNumExtentsMax = (UInt32)1 << 30;\nconst UInt64 kFileNameLengthTotalMax = (UInt64)1 << 33;\nconst UInt64 kInlineExtentsSizeMax = (UInt64)1 << 33;\n\nvoid MY_FAST_CALL Crc16GenerateTable(void);\n\n#define CRC16_INIT_VAL 0\n#define CRC16_GET_DIGEST(crc) (crc)\n#define CRC16_UPDATE_BYTE(crc, b) (g_Crc16Table[(((crc) >> 8) ^ (b)) & 0xFF] ^ ((crc) << 8))\n\n#define kCrc16Poly 0x1021\nUInt16 g_Crc16Table[256];\n\nvoid MY_FAST_CALL Crc16GenerateTable(void)\n{\n  UInt32 i;\n  for (i = 0; i < 256; i++)\n  {\n    UInt32 r = (i << 8);\n    for (int j = 8; j > 0; j--)\n      r = ((r & 0x8000) ? ((r << 1) ^ kCrc16Poly) : (r << 1)) & 0xFFFF;\n    g_Crc16Table[i] = (UInt16)r;\n  }\n}\n\nUInt16 MY_FAST_CALL Crc16_Update(UInt16 v, const void *data, size_t size)\n{\n  const Byte *p = (const Byte *)data;\n  for (; size > 0 ; size--, p++)\n    v = CRC16_UPDATE_BYTE(v, *p);\n  return v;\n}\n\nUInt16 MY_FAST_CALL Crc16Calc(const void *data, size_t size)\n{\n  return Crc16_Update(CRC16_INIT_VAL, data, size);\n}\n\nstruct CCrc16TableInit { CCrc16TableInit() { Crc16GenerateTable(); } } g_Crc16TableInit;\n\nvoid CDString128::Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }\n\nvoid CDString::Parse(const Byte *p, unsigned size)\n{\n  Data.SetCapacity(size);\n  memcpy(Data, p, size);\n}\n\nstatic UString ParseDString(const Byte *data, int size)\n{\n  UString res;\n  wchar_t *p;\n  if (size > 0)\n  {\n    Byte type = data[0];\n    if (type == 8)\n    {\n      p = res.GetBuffer((int)size + 1);\n      for (int i = 1; i < size; i++)\n      {\n        wchar_t c = data[i];\n        if (c == 0)\n          break;\n        *p++ = c;\n      }\n    }\n    else if (type == 16)\n    {\n      p = res.GetBuffer((int)size / 2 + 1);\n      for (int i = 1; i + 2 <= size; i += 2)\n      {\n        wchar_t c = ((wchar_t)data[i] << 8) | data[i + 1];\n        if (c == 0)\n          break;\n        *p++ = c;\n      }\n    }\n    else\n      return L\"[unknow]\";\n    *p++ = 0;\n    res.ReleaseBuffer();\n  }\n  return res;\n}\n\nUString CDString::   GetString() const { return ParseDString(Data, (int)Data.GetCapacity()); }\nUString CDString128::GetString() const\n{\n  int size = Data[sizeof(Data) - 1];\n  return ParseDString(Data, MyMin(size, (int)(sizeof(Data) - 1)));\n}\n\nvoid CTime::Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }\n\n/*\nvoid CRegId::Parse(const Byte *buf)\n{\n  Flags = buf[0];\n  memcpy(Id, buf + 1, sizeof(Id));\n  memcpy(Suffix, buf + 24, sizeof(Suffix));\n}\n*/\n\n// ECMA 3/7.1\n\nstruct CExtent\n{\n  UInt32 Len;\n  UInt32 Pos;\n\n  void Parse(const Byte *buf);\n};\n\nvoid CExtent::Parse(const Byte *buf)\n{\n  Len = Get32(buf);\n  Pos = Get32(buf + 4);\n}\n\n// ECMA 3/7.2\n\nstruct CTag\n{\n  UInt16 Id;\n  UInt16 Version;\n  // Byte Checksum;\n  // UInt16 SerialNumber;\n  // UInt16 Crc;\n  // UInt16 CrcLen;\n  // UInt32 TagLocation;\n  \n  HRESULT Parse(const Byte *buf, size_t size);\n};\n\nHRESULT CTag::Parse(const Byte *buf, size_t size)\n{\n  if (size < 16)\n    return S_FALSE;\n  Byte sum = 0;\n  int i;\n  for (i = 0; i <  4; i++) sum = sum + buf[i];\n  for (i = 5; i < 16; i++) sum = sum + buf[i];\n  if (sum != buf[4] || buf[5] != 0) return S_FALSE;\n\n  Id = Get16(buf);\n  Version = Get16(buf + 2);\n  // SerialNumber = Get16(buf + 6);\n  UInt16 crc = Get16(buf + 8);\n  UInt16 crcLen = Get16(buf + 10);\n  // TagLocation = Get32(buf + 12);\n\n  if (size >= 16 + (size_t)crcLen)\n    if (crc == Crc16Calc(buf + 16, crcLen))\n      return S_OK;\n  return S_FALSE;\n}\n\n// ECMA 3/7.2.1\n\nenum EDescriptorType\n{\n  DESC_TYPE_SpoaringTable = 0, // UDF\n  DESC_TYPE_PrimVol = 1,\n  DESC_TYPE_AnchorVolPtr = 2,\n  DESC_TYPE_VolPtr = 3,\n  DESC_TYPE_ImplUseVol = 4,\n  DESC_TYPE_Partition = 5,\n  DESC_TYPE_LogicalVol = 6,\n  DESC_TYPE_UnallocSpace = 7,\n  DESC_TYPE_Terminating = 8,\n  DESC_TYPE_LogicalVolIntegrity = 9,\n  DESC_TYPE_FileSet = 256,\n  DESC_TYPE_FileId  = 257,\n  DESC_TYPE_AllocationExtent = 258,\n  DESC_TYPE_Indirect = 259,\n  DESC_TYPE_Terminal = 260,\n  DESC_TYPE_File = 261,\n  DESC_TYPE_ExtendedAttrHeader = 262,\n  DESC_TYPE_UnallocatedSpace = 263,\n  DESC_TYPE_SpaceBitmap = 264,\n  DESC_TYPE_PartitionIntegrity = 265,\n  DESC_TYPE_ExtendedFile = 266,\n};\n\n\nvoid CLogBlockAddr::Parse(const Byte *buf)\n{\n  Pos = Get32(buf);\n  PartitionRef = Get16(buf + 4);\n}\n\nvoid CShortAllocDesc::Parse(const Byte *buf)\n{\n  Len = Get32(buf);\n  Pos = Get32(buf + 4);\n}\n\n/*\nvoid CADImpUse::Parse(const Byte *buf)\n{\n  Flags = Get16(buf);\n  UdfUniqueId = Get32(buf + 2);\n}\n*/\n\nvoid CLongAllocDesc::Parse(const Byte *buf)\n{\n  Len = Get32(buf);\n  Location.Parse(buf + 4);\n  // memcpy(ImplUse, buf + 10, sizeof(ImplUse));\n  // adImpUse.Parse(ImplUse);\n}\n\nbool CInArchive::CheckExtent(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len) const\n{\n  const CLogVol &vol = LogVols[volIndex];\n  const CPartition &partition = Partitions[vol.PartitionMaps[partitionRef].PartitionIndex];\n  UInt64 offset = ((UInt64)partition.Pos << SecLogSize) + (UInt64)blockPos * vol.BlockSize;\n  return (offset + len) <= (((UInt64)partition.Pos + partition.Len) << SecLogSize);\n}\n\nbool CInArchive::CheckItemExtents(int volIndex, const CItem &item) const\n{\n  for (int i = 0; i < item.Extents.Size(); i++)\n  {\n    const CMyExtent &e = item.Extents[i];\n    if (!CheckExtent(volIndex, e.PartitionRef, e.Pos, e.GetLen()))\n      return false;\n  }\n  return true;\n}\n\nHRESULT CInArchive::Read(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len, Byte *buf)\n{\n  if (!CheckExtent(volIndex, partitionRef, blockPos, len))\n    return S_FALSE;\n  const CLogVol &vol = LogVols[volIndex];\n  const CPartition &partition = Partitions[vol.PartitionMaps[partitionRef].PartitionIndex];\n  RINOK(_stream->Seek(((UInt64)partition.Pos << SecLogSize) +\n      (UInt64)blockPos * vol.BlockSize, STREAM_SEEK_SET, NULL));\n  return ReadStream_FALSE(_stream, buf, len);\n}\n\nHRESULT CInArchive::Read(int volIndex, const CLongAllocDesc &lad, Byte *buf)\n{\n  return Read(volIndex, lad.Location.PartitionRef, lad.Location.Pos, lad.GetLen(), (Byte *)buf);\n}\n\nHRESULT CInArchive::ReadFromFile(int volIndex, const CItem &item, CByteBuffer &buf)\n{\n  if (item.Size >= (UInt32)1 << 30)\n    return S_FALSE;\n  if (item.IsInline)\n  {\n    buf = item.InlineData;\n    return S_OK;\n  }\n  buf.SetCapacity((size_t)item.Size);\n  size_t pos = 0;\n  for (int i = 0; i < item.Extents.Size(); i++)\n  {\n    const CMyExtent &e = item.Extents[i];\n    UInt32 len = e.GetLen();\n    RINOK(Read(volIndex, e.PartitionRef, e.Pos, len, (Byte *)buf + pos));\n    pos += len;\n  }\n  return S_OK;\n}\n\n\nvoid CIcbTag::Parse(const Byte *p)\n{\n  // PriorDirectNum = Get32(p);\n  // StrategyType = Get16(p + 4);\n  // StrategyParam = Get16(p + 6);\n  // MaxNumOfEntries = Get16(p + 8);\n  FileType = p[11];\n  // ParentIcb.Parse(p + 12);\n  Flags = Get16(p + 18);\n}\n\nvoid CItem::Parse(const Byte *p)\n{\n  // Uid = Get32(p + 36);\n  // Gid = Get32(p + 40);\n  // Permissions = Get32(p + 44);\n  // FileLinkCount = Get16(p + 48);\n  // RecordFormat = p[50];\n  // RecordDisplayAttr = p[51];\n  // RecordLen = Get32(p + 52);\n  Size = Get64(p + 56);\n  NumLogBlockRecorded = Get64(p + 64);\n  ATime.Parse(p + 72);\n  MTime.Parse(p + 84);\n  // AttrtTime.Parse(p + 96);\n  // CheckPoint = Get32(p + 108);\n  // ExtendedAttrIcb.Parse(p + 112);\n  // ImplId.Parse(p + 128);\n  // UniqueId = Get64(p + 160);\n}\n\n// 4/14.4\nstruct CFileId\n{\n  // UInt16 FileVersion;\n  Byte FileCharacteristics;\n  // CByteBuffer ImplUse;\n  CDString Id;\n  CLongAllocDesc Icb;\n\n  bool IsItLinkParent() const { return (FileCharacteristics & FILEID_CHARACS_Parent) != 0; }\n  HRESULT Parse(const Byte *p, size_t size, size_t &processed);\n};\n\nHRESULT CFileId::Parse(const Byte *p, size_t size, size_t &processed)\n{\n  processed = 0;\n  if (size < 38)\n    return S_FALSE;\n  CTag tag;\n  RINOK(tag.Parse(p, size));\n  if (tag.Id != DESC_TYPE_FileId)\n    return S_FALSE;\n  // FileVersion = Get16(p + 16);\n  FileCharacteristics = p[18];\n  unsigned idLen = p[19];\n  Icb.Parse(p + 20);\n  unsigned impLen = Get16(p + 36);\n  if (size < 38 + idLen + impLen)\n    return S_FALSE;\n  // ImplUse.SetCapacity(impLen);\n  processed = 38;\n  // memcpy(ImplUse, p + processed, impLen);\n  processed += impLen;\n  Id.Parse(p + processed, idLen);\n  processed += idLen;\n  for (;(processed & 3) != 0; processed++)\n    if (p[processed] != 0)\n      return S_FALSE;\n  return (processed <= size) ? S_OK : S_FALSE;\n}\n\nHRESULT CInArchive::ReadFileItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed)\n{\n  if (Files.Size() % 100 == 0)\n    RINOK(_progress->SetCompleted(Files.Size(), _processedProgressBytes));\n  if (numRecurseAllowed-- == 0)\n    return S_FALSE;\n  CFile &file = Files.Back();\n  const CLogVol &vol = LogVols[volIndex];\n  CPartition &partition = Partitions[vol.PartitionMaps[lad.Location.PartitionRef].PartitionIndex];\n\n  UInt32 key = lad.Location.Pos;\n  UInt32 value;\n  const UInt32 kRecursedErrorValue = (UInt32)(Int32)-1;\n  if (partition.Map.Find(key, value))\n  {\n    if (value == kRecursedErrorValue)\n      return S_FALSE;\n    file.ItemIndex = value;\n  }\n  else\n  {\n    value = Items.Size();\n    file.ItemIndex = (int)value;\n    if (partition.Map.Set(key, kRecursedErrorValue))\n      return S_FALSE;\n    RINOK(ReadItem(volIndex, fsIndex, lad, numRecurseAllowed));\n    if (!partition.Map.Set(key, value))\n      return S_FALSE;\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed)\n{\n  if (Items.Size() > kNumItemsMax)\n    return S_FALSE;\n  Items.Add(CItem());\n  CItem &item = Items.Back();\n  \n  const CLogVol &vol = LogVols[volIndex];\n \n  if (lad.GetLen() != vol.BlockSize)\n    return S_FALSE;\n\n  CByteBuffer buf;\n  size_t size = lad.GetLen();\n  buf.SetCapacity(size);\n  RINOK(Read(volIndex, lad, buf));\n\n  CTag tag;\n  const Byte *p = buf;\n  RINOK(tag.Parse(p, size));\n  if (tag.Id != DESC_TYPE_File)\n    return S_FALSE;\n\n  item.IcbTag.Parse(p + 16);\n  if (item.IcbTag.FileType != ICB_FILE_TYPE_DIR &&\n      item.IcbTag.FileType != ICB_FILE_TYPE_FILE)\n    return S_FALSE;\n\n  item.Parse(p);\n\n  _processedProgressBytes += (UInt64)item.NumLogBlockRecorded * vol.BlockSize + size;\n\n  UInt32 extendedAttrLen = Get32(p + 168);\n  UInt32 allocDescriptorsLen = Get32(p + 172);\n\n  if ((extendedAttrLen & 3) != 0)\n    return S_FALSE;\n  int pos = 176;\n  if (extendedAttrLen > size - pos)\n    return S_FALSE;\n  /*\n  if (extendedAttrLen != 16)\n  {\n    if (extendedAttrLen < 24)\n      return S_FALSE;\n    CTag attrTag;\n    RINOK(attrTag.Parse(p + pos, size));\n    if (attrTag.Id != DESC_TYPE_ExtendedAttrHeader)\n      return S_FALSE;\n    // UInt32 implAttrLocation = Get32(p + pos + 16);\n    // UInt32 applicationlAttrLocation = Get32(p + pos + 20);\n  }\n  */\n  pos += extendedAttrLen;\n\n  int desctType = item.IcbTag.GetDescriptorType();\n  if (allocDescriptorsLen > size - pos)\n    return S_FALSE;\n  if (desctType == ICB_DESC_TYPE_INLINE)\n  {\n    item.IsInline = true;\n    item.InlineData.SetCapacity(allocDescriptorsLen);\n    memcpy(item.InlineData, p + pos, allocDescriptorsLen);\n  }\n  else\n  {\n    item.IsInline = false;\n    if (desctType != ICB_DESC_TYPE_SHORT && desctType != ICB_DESC_TYPE_LONG)\n      return S_FALSE;\n    for (UInt32 i = 0; i < allocDescriptorsLen;)\n    {\n      CMyExtent e;\n      if (desctType == ICB_DESC_TYPE_SHORT)\n      {\n        if (i + 8 > allocDescriptorsLen)\n          return S_FALSE;\n        CShortAllocDesc sad;\n        sad.Parse(p + pos + i);\n        e.Pos = sad.Pos;\n        e.Len = sad.Len;\n        e.PartitionRef = lad.Location.PartitionRef;\n        i += 8;\n      }\n      else\n      {\n        if (i + 16 > allocDescriptorsLen)\n          return S_FALSE;\n        CLongAllocDesc ladNew;\n        ladNew.Parse(p + pos + i);\n        e.Pos = ladNew.Location.Pos;\n        e.PartitionRef = ladNew.Location.PartitionRef;\n        e.Len = ladNew.Len;\n        i += 16;\n      }\n      item.Extents.Add(e);\n    }\n  }\n\n  if (item.IcbTag.IsDir())\n  {\n    if (!item.CheckChunkSizes() || !CheckItemExtents(volIndex, item))\n      return S_FALSE;\n    CByteBuffer buf;\n    RINOK(ReadFromFile(volIndex, item, buf));\n    item.Size = 0;\n    item.Extents.ClearAndFree();\n    item.InlineData.Free();\n\n    const Byte *p = buf;\n    size = buf.GetCapacity();\n    size_t processedTotal = 0;\n    for (; processedTotal < size;)\n    {\n      size_t processedCur;\n      CFileId fileId;\n      RINOK(fileId.Parse(p + processedTotal, size - processedTotal, processedCur));\n      if (!fileId.IsItLinkParent())\n      {\n        CFile file;\n        // file.FileVersion = fileId.FileVersion;\n        // file.FileCharacteristics = fileId.FileCharacteristics;\n        // file.ImplUse = fileId.ImplUse;\n        file.Id = fileId.Id;\n        \n        _fileNameLengthTotal += file.Id.Data.GetCapacity();\n        if (_fileNameLengthTotal > kFileNameLengthTotalMax)\n          return S_FALSE;\n        \n        item.SubFiles.Add(Files.Size());\n        if (Files.Size() > kNumFilesMax)\n          return S_FALSE;\n        Files.Add(file);\n        RINOK(ReadFileItem(volIndex, fsIndex, fileId.Icb, numRecurseAllowed));\n      }\n      processedTotal += processedCur;\n    }\n  }\n  else\n  {\n    if ((UInt32)item.Extents.Size() > kNumExtentsMax - _numExtents)\n      return S_FALSE;\n    _numExtents += item.Extents.Size();\n\n    if (item.InlineData.GetCapacity() > kInlineExtentsSizeMax - _inlineExtentsSize)\n      return S_FALSE;\n    _inlineExtentsSize += item.InlineData.GetCapacity();\n  }\n\n  return S_OK;\n}\n\nHRESULT CInArchive::FillRefs(CFileSet &fs, int fileIndex, int parent, int numRecurseAllowed)\n{\n  if (_numRefs % 10000 == 0)\n  {\n    RINOK(_progress->SetCompleted());\n  }\n  if (numRecurseAllowed-- == 0)\n    return S_FALSE;\n  if (_numRefs >= kNumRefsMax)\n    return S_FALSE;\n  _numRefs++;\n  CRef ref;\n  ref.FileIndex = fileIndex;\n  ref.Parent = parent;\n  parent = fs.Refs.Size();\n  fs.Refs.Add(ref);\n  const CItem &item = Items[Files[fileIndex].ItemIndex];\n  for (int i = 0; i < item.SubFiles.Size(); i++)\n  {\n    RINOK(FillRefs(fs, item.SubFiles[i], parent, numRecurseAllowed));\n  }\n  return S_OK;\n}\n\nHRESULT CInArchive::Open2()\n{\n  Clear();\n\n  UInt64 fileSize;\n  RINOK(_stream->Seek(0, STREAM_SEEK_END, &fileSize));\n\n  const int kSecLogSizeMax = 11;\n  const int kSecLogSizeMin = 8;\n  Byte buf[1 << kSecLogSizeMax];\n  for (SecLogSize = kSecLogSizeMax; SecLogSize >= kSecLogSizeMin; SecLogSize -= 3)\n  {\n    Int32 bufSize = 1 << SecLogSize;\n    if (bufSize > fileSize)\n      return S_FALSE;\n    RINOK(_stream->Seek(-bufSize, STREAM_SEEK_END, NULL));\n    RINOK(ReadStream_FALSE(_stream, buf, bufSize));\n    CTag tag;\n    if (tag.Parse(buf, bufSize) == S_OK)\n      if (tag.Id == DESC_TYPE_AnchorVolPtr)\n        break;\n  }\n  if (SecLogSize < kSecLogSizeMin)\n    return S_FALSE;\n\n  CExtent extentVDS;\n  extentVDS.Parse(buf + 16);\n\n  for (UInt32 location = extentVDS.Pos; ; location++)\n  {\n    size_t bufSize = 1 << SecLogSize;\n    size_t pos = 0;\n    RINOK(_stream->Seek((UInt64)location << SecLogSize, STREAM_SEEK_SET, NULL));\n    RINOK(ReadStream_FALSE(_stream, buf, bufSize));\n    CTag tag;\n    RINOK(tag.Parse(buf + pos, bufSize - pos));\n    if (tag.Id == DESC_TYPE_Terminating)\n      break;\n    if (tag.Id == DESC_TYPE_Partition)\n    {\n      if (Partitions.Size() >= kNumPartitionsMax)\n        return S_FALSE;\n      CPartition partition;\n      // UInt32 volDescSeqNumer = Get32(buf + 16);\n      // partition.Flags = Get16(buf + 20);\n      partition.Number = Get16(buf + 22);\n      // partition.ContentsId.Parse(buf + 24);\n      \n      // memcpy(partition.ContentsUse, buf + 56, sizeof(partition.ContentsUse));\n      // ContentsUse is Partition Header Description.\n\n      // partition.AccessType = Get32(buf + 184);\n      partition.Pos = Get32(buf + 188);\n      partition.Len = Get32(buf + 192);\n      // partition.ImplId.Parse(buf + 196);\n      // memcpy(partition.ImplUse, buf + 228, sizeof(partition.ImplUse));\n\n      Partitions.Add(partition);\n    }\n    else if (tag.Id == DESC_TYPE_LogicalVol)\n    {\n      if (LogVols.Size() >= kNumLogVolumesMax)\n        return S_FALSE;\n      CLogVol vol;\n      vol.Id.Parse(buf + 84);\n      vol.BlockSize = Get32(buf + 212);\n      // vol.DomainId.Parse(buf + 216);\n\n      if (vol.BlockSize < 512 || vol.BlockSize > ((UInt32)1 << 30))\n        return S_FALSE;\n      \n      // memcpy(vol.ContentsUse, buf + 248, sizeof(vol.ContentsUse));\n      vol.FileSetLocation.Parse(buf + 248);\n\n      // UInt32 mapTableLength = Get32(buf + 264);\n      UInt32 numPartitionMaps = Get32(buf + 268);\n      if (numPartitionMaps > kNumPartitionsMax)\n        return S_FALSE;\n      // vol.ImplId.Parse(buf + 272);\n      // memcpy(vol.ImplUse, buf + 128, sizeof(vol.ImplUse));\n      size_t pos = 440;\n      for (UInt32 i = 0; i < numPartitionMaps; i++)\n      {\n        if (pos + 2 > bufSize)\n          return S_FALSE;\n        CPartitionMap pm;\n        pm.Type = buf[pos];\n        // pm.Length = buf[pos + 1];\n        Byte len = buf[pos + 1];\n\n        if (pos + len > bufSize)\n          return S_FALSE;\n        \n        // memcpy(pm.Data, buf + pos + 2, pm.Length - 2);\n        if (pm.Type == 1)\n        {\n          if (pos + 6 > bufSize)\n            return S_FALSE;\n          // pm.VolSeqNumber = Get16(buf + pos + 2);\n          pm.PartitionNumber = Get16(buf + pos + 4);\n        }\n        else\n          return S_FALSE;\n        pos += len;\n        vol.PartitionMaps.Add(pm);\n      }\n      LogVols.Add(vol);\n    }\n  }\n\n  UInt64 totalSize = 0;\n\n  int volIndex;\n  for (volIndex = 0; volIndex < LogVols.Size(); volIndex++)\n  {\n    CLogVol &vol = LogVols[volIndex];\n    for (int pmIndex = 0; pmIndex < vol.PartitionMaps.Size(); pmIndex++)\n    {\n      CPartitionMap &pm = vol.PartitionMaps[pmIndex];\n      int i;\n      for (i = 0; i < Partitions.Size(); i++)\n      {\n        CPartition &part = Partitions[i];\n        if (part.Number == pm.PartitionNumber)\n        {\n          if (part.VolIndex >= 0)\n            return S_FALSE;\n          pm.PartitionIndex = i;\n          part.VolIndex = volIndex;\n\n          totalSize += (UInt64)part.Len << SecLogSize;\n          break;\n        }\n      }\n      if (i == Partitions.Size())\n        return S_FALSE;\n    }\n  }\n\n  RINOK(_progress->SetTotal(totalSize));\n\n  for (volIndex = 0; volIndex < LogVols.Size(); volIndex++)\n  {\n    CLogVol &vol = LogVols[volIndex];\n\n    CLongAllocDesc nextExtent = vol.FileSetLocation;\n    // while (nextExtent.ExtentLen != 0)\n    // for (int i = 0; i < 1; i++)\n    {\n      if (nextExtent.GetLen() < 512)\n        return S_FALSE;\n      CByteBuffer buf;\n      buf.SetCapacity(nextExtent.GetLen());\n      RINOK(Read(volIndex, nextExtent, buf));\n      const Byte *p = buf;\n      size_t size = nextExtent.GetLen();\n\n      CTag tag;\n      RINOK(tag.Parse(p, size));\n      if (tag.Id != DESC_TYPE_FileSet)\n        return S_FALSE;\n      \n      CFileSet fs;\n      fs.RecodringTime.Parse(p + 16);\n      // fs.InterchangeLevel = Get16(p + 18);\n      // fs.MaxInterchangeLevel = Get16(p + 20);\n      // fs.FileSetNumber = Get32(p + 40);\n      // fs.FileSetDescNumber = Get32(p + 44);\n      \n      // fs.Id.Parse(p + 304);\n      // fs.CopyrightId.Parse(p + 336);\n      // fs.AbstractId.Parse(p + 368);\n      \n      fs.RootDirICB.Parse(p + 400);\n      // fs.DomainId.Parse(p + 416);\n      \n      // fs.SystemStreamDirICB.Parse(p + 464);\n      \n      vol.FileSets.Add(fs);\n\n      // nextExtent.Parse(p + 448);\n    }\n\n    for (int fsIndex = 0; fsIndex < vol.FileSets.Size(); fsIndex++)\n    {\n      CFileSet &fs = vol.FileSets[fsIndex];\n      int fileIndex = Files.Size();\n      Files.Add(CFile());\n      RINOK(ReadFileItem(volIndex, fsIndex, fs.RootDirICB, kNumRecureseLevelsMax));\n      RINOK(FillRefs(fs, fileIndex, -1, kNumRecureseLevelsMax));\n    }\n  }\n\n  return S_OK;\n}\n\nHRESULT CInArchive::Open(IInStream *inStream, CProgressVirt *progress)\n{\n  _progress = progress;\n  _stream = inStream;\n  HRESULT res;\n  try { res = Open2(); }\n  catch(...) { Clear(); res = S_FALSE; }\n  _stream.Release();\n  return res;\n}\n\nvoid CInArchive::Clear()\n{\n  Partitions.Clear();\n  LogVols.Clear();\n  Items.Clear();\n  Files.Clear();\n  _fileNameLengthTotal = 0;\n  _numRefs = 0;\n  _numExtents = 0;\n  _inlineExtentsSize = 0;\n  _processedProgressBytes = 0;\n}\n\nUString CInArchive::GetComment() const\n{\n  UString res;\n  for (int i = 0; i < LogVols.Size(); i++)\n  {\n    if (i > 0)\n      res += L\" \";\n    res += LogVols[i].GetName();\n  }\n  return res;\n}\n\nstatic UString GetSpecName(const UString &name)\n{\n  UString name2 = name;\n  name2.Trim();\n  if (name2.IsEmpty())\n  {\n    /*\n    wchar_t s[32];\n    ConvertUInt64ToString(id, s);\n    return L\"[\" + (UString)s + L\"]\";\n    */\n    return L\"[]\";\n  }\n  return name;\n}\n\nstatic void UpdateWithName(UString &res, const UString &addString)\n{\n  if (res.IsEmpty())\n    res = addString;\n  else\n    res = addString + WCHAR_PATH_SEPARATOR + res;\n}\n\nUString CInArchive::GetItemPath(int volIndex, int fsIndex, int refIndex,\n    bool showVolName, bool showFsName) const\n{\n  // showVolName = true;\n  const CLogVol &vol = LogVols[volIndex];\n  const CFileSet &fs = vol.FileSets[fsIndex];\n\n  UString name;\n\n  for (;;)\n  {\n    const CRef &ref = fs.Refs[refIndex];\n    refIndex = ref.Parent;\n    if (refIndex < 0)\n      break;\n    UpdateWithName(name, GetSpecName(Files[ref.FileIndex].GetName()));\n  }\n\n  if (showFsName)\n  {\n    wchar_t s[32];\n    ConvertUInt64ToString(fsIndex, s);\n    UString newName = L\"File Set \";\n    newName += s;\n    UpdateWithName(name, newName);\n  }\n\n  if (showVolName)\n  {\n    wchar_t s[32];\n    ConvertUInt64ToString(volIndex, s);\n    UString newName = s;\n    UString newName2 = vol.GetName();\n    if (newName2.IsEmpty())\n      newName2 = L\"Volume\";\n    newName += L'-';\n    newName += newName2;\n    UpdateWithName(name, newName);\n  }\n  return name;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Udf/UdfIn.h",
    "content": "// Archive/UdfIn.h -- UDF / ECMA-167\n\n#ifndef __ARCHIVE_UDF_IN_H\n#define __ARCHIVE_UDF_IN_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/Buffer.h\"\n#include \"Common/MyString.h\"\n#include \"Common/MyMap.h\"\n\n#include \"../../IStream.h\"\n\nnamespace NArchive {\nnamespace NUdf {\n\n// ---------- ECMA Part 1 ----------\n\n// ECMA 1/7.2.12\n\n/*\nstruct CDString32\n{\n  Byte Data[32];\n  void Parse(const Byte *buf);\n  // UString GetString() const;\n};\n*/\n\nstruct CDString128\n{\n  Byte Data[128];\n  void Parse(const Byte *buf);\n  UString GetString() const;\n};\n\nstruct CDString\n{\n  CByteBuffer Data;\n  void Parse(const Byte *p, unsigned size);\n  UString GetString() const;\n};\n\n\n// ECMA 1/7.3\n\nstruct CTime\n{\n  Byte Data[12];\n\n  unsigned GetType() const { return Data[1] >> 4; }\n  bool IsLocal() const { return GetType() == 1; }\n  int GetMinutesOffset() const\n  {\n    int t = (Data[0] | ((UInt16)Data[1] << 8)) & 0xFFF;\n    if ((t >> 11) != 0)\n      t -= (1 << 12);\n    return (t > (60 * 24) || t < -(60 * 24)) ? 0 : t;\n  }\n  unsigned GetYear() const { return (Data[2] | ((UInt16)Data[3] << 8)); }\n  void Parse(const Byte *buf);\n};\n\n\n// ECMA 1/7.4\n\n/*\nstruct CRegId\n{\n  Byte Flags;\n  char Id[23];\n  char Suffix[8];\n\n  void Parse(const Byte *buf);\n};\n*/\n\n// ---------- ECMA Part 3: Volume Structure ----------\n\n// ECMA 3/10.5\n\nstruct CPartition\n{\n  // UInt16 Flags;\n  UInt16 Number;\n  // CRegId ContentsId;\n  // Byte ContentsUse[128];\n  // UInt32 AccessType;\n\n  UInt32 Pos;\n  UInt32 Len;\n\n  // CRegId ImplId;\n  // Byte ImplUse[128];\n\n  int VolIndex;\n  CMap32 Map;\n\n  CPartition(): VolIndex(-1) {}\n\n  // bool IsNsr() const { return (strncmp(ContentsId.Id, \"+NSR0\", 5) == 0); }\n  // bool IsAllocated() const { return ((Flags & 1) != 0); }\n};\n\nstruct CLogBlockAddr\n{\n  UInt32 Pos;\n  UInt16 PartitionRef;\n  \n  void Parse(const Byte *buf);\n};\n\nenum EShortAllocDescType\n{\n  SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated = 0,\n  SHORT_ALLOC_DESC_TYPE_NotRecordedButAllocated = 1,\n  SHORT_ALLOC_DESC_TYPE_NotRecordedAndNotAllocated = 2,\n  SHORT_ALLOC_DESC_TYPE_NextExtent = 3\n};\n\nstruct CShortAllocDesc\n{\n  UInt32 Len;\n  UInt32 Pos;\n\n  // 4/14.14.1\n  // UInt32 GetLen() const { return Len & 0x3FFFFFFF; }\n  // UInt32 GetType() const { return Len >> 30; }\n  // bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }\n  void Parse(const Byte *buf);\n};\n\n/*\nstruct CADImpUse\n{\n  UInt16 Flags;\n  UInt32 UdfUniqueId;\n  void Parse(const Byte *buf);\n};\n*/\n\nstruct CLongAllocDesc\n{\n  UInt32 Len;\n  CLogBlockAddr Location;\n  \n  // Byte ImplUse[6];\n  // CADImpUse adImpUse; // UDF\n  \n  UInt32 GetLen() const { return Len & 0x3FFFFFFF; }\n  UInt32 GetType() const { return Len >> 30; }\n  bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }\n  void Parse(const Byte *buf);\n};\n\nstruct CPartitionMap\n{\n  Byte Type;\n  // Byte Len;\n\n  // Type - 1\n  // UInt16 VolSeqNumber;\n  UInt16 PartitionNumber;\n\n  // Byte Data[256];\n\n  int PartitionIndex;\n};\n\n// ECMA 4/14.6\n\nenum EIcbFileType\n{\n  ICB_FILE_TYPE_DIR = 4,\n  ICB_FILE_TYPE_FILE = 5\n};\n\nenum EIcbDescriptorType\n{\n  ICB_DESC_TYPE_SHORT = 0,\n  ICB_DESC_TYPE_LONG = 1,\n  ICB_DESC_TYPE_EXTENDED = 2,\n  ICB_DESC_TYPE_INLINE = 3\n};\n\nstruct CIcbTag\n{\n  // UInt32 PriorDirectNum;\n  // UInt16 StrategyType;\n  // UInt16 StrategyParam;\n  // UInt16 MaxNumOfEntries;\n  Byte FileType;\n  // CLogBlockAddr ParentIcb;\n  UInt16 Flags;\n\n  bool IsDir() const { return FileType == ICB_FILE_TYPE_DIR; }\n  int GetDescriptorType() const { return Flags & 3; }\n  void Parse(const Byte *p);\n};\n\n// const Byte FILEID_CHARACS_Existance = (1 << 0);\nconst Byte FILEID_CHARACS_Parent = (1 << 3);\n\nstruct CFile\n{\n  // UInt16 FileVersion;\n  // Byte FileCharacteristics;\n  // CByteBuffer ImplUse;\n  CDString Id;\n\n  CFile(): /* FileVersion(0), FileCharacteristics(0), */ ItemIndex(-1) {}\n  int ItemIndex;\n  UString GetName() const { return Id.GetString(); }\n};\n\nstruct CMyExtent\n{\n  UInt32 Pos;\n  UInt32 Len;\n  int PartitionRef;\n  \n  UInt32 GetLen() const { return Len & 0x3FFFFFFF; }\n  UInt32 GetType() const { return Len >> 30; }\n  bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }\n};\n\nstruct CItem\n{\n  CIcbTag IcbTag;\n\n  // UInt32 Uid;\n  // UInt32 Gid;\n  // UInt32 Permissions;\n  // UInt16 FileLinkCount;\n  // Byte RecordFormat;\n  // Byte RecordDisplayAttr;\n  // UInt32 RecordLen;\n  UInt64 Size;\n  UInt64 NumLogBlockRecorded;\n  CTime ATime;\n  CTime MTime;\n  // CTime AttrtTime;\n  // UInt32 CheckPoint;\n  // CLongAllocDesc ExtendedAttrIcb;\n  // CRegId ImplId;\n  // UInt64 UniqueId;\n\n  bool IsInline;\n  CByteBuffer InlineData;\n  CRecordVector<CMyExtent> Extents;\n  CRecordVector<int> SubFiles;\n\n  void Parse(const Byte *buf);\n\n  bool IsRecAndAlloc() const\n  {\n    for (int i = 0; i < Extents.Size(); i++)\n      if (!Extents[i].IsRecAndAlloc())\n        return false;\n    return true;\n  }\n\n  UInt64 GetChunksSumSize() const\n  {\n    if (IsInline)\n      return InlineData.GetCapacity();\n    UInt64 size = 0;\n    for (int i = 0; i < Extents.Size(); i++)\n      size += Extents[i].GetLen();\n    return size;\n  }\n\n  bool CheckChunkSizes() const  {  return GetChunksSumSize() == Size; }\n\n  bool IsDir() const { return IcbTag.IsDir(); }\n};\n \nstruct CRef\n{\n  int Parent;\n  int FileIndex;\n};\n\n\n// ECMA 4 / 14.1\nstruct CFileSet\n{\n  CTime RecodringTime;\n  // UInt16 InterchangeLevel;\n  // UInt16 MaxInterchangeLevel;\n  // UInt32 FileSetNumber;\n  // UInt32 FileSetDescNumber;\n  // CDString32 Id;\n  // CDString32 CopyrightId;\n  // CDString32 AbstractId;\n\n  CLongAllocDesc RootDirICB;\n  // CRegId DomainId;\n  // CLongAllocDesc SystemStreamDirICB;\n\n  CRecordVector<CRef> Refs;\n};\n\n\n// ECMA 3/10.6\n\nstruct CLogVol\n{\n  CDString128 Id;\n  UInt32 BlockSize;\n  // CRegId DomainId;\n  \n  // Byte ContentsUse[16];\n  CLongAllocDesc FileSetLocation; // UDF\n\n  // CRegId ImplId;\n  // Byte ImplUse[128];\n\n  CObjectVector<CPartitionMap> PartitionMaps;\n  CObjectVector<CFileSet> FileSets;\n\n  UString GetName() const { return Id.GetString(); }\n};\n\nstruct CProgressVirt\n{\n  virtual HRESULT SetTotal(UInt64 numBytes) PURE;\n  virtual HRESULT SetCompleted(UInt64 numFiles, UInt64 numBytes) PURE;\n  virtual HRESULT SetCompleted() PURE;\n};\n\nclass CInArchive\n{\n  CMyComPtr<IInStream> _stream;\n  CProgressVirt *_progress;\n\n  HRESULT Read(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len, Byte *buf);\n  HRESULT Read(int volIndex, const CLongAllocDesc &lad, Byte *buf);\n  HRESULT ReadFromFile(int volIndex, const CItem &item, CByteBuffer &buf);\n\n  HRESULT ReadFileItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed);\n  HRESULT ReadItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed);\n\n  HRESULT Open2();\n  HRESULT FillRefs(CFileSet &fs, int fileIndex, int parent, int numRecurseAllowed);\n\n  UInt64 _processedProgressBytes;\n\n  UInt64 _fileNameLengthTotal;\n  int _numRefs;\n  UInt32 _numExtents;\n  UInt64 _inlineExtentsSize;\n  bool CheckExtent(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len) const;\npublic:\n  HRESULT Open(IInStream *inStream, CProgressVirt *progress);\n  void Clear();\n\n  CObjectVector<CPartition> Partitions;\n  CObjectVector<CLogVol> LogVols;\n\n  CObjectVector<CItem> Items;\n  CObjectVector<CFile> Files;\n\n  int SecLogSize;\n\n  UString GetComment() const;\n  UString GetItemPath(int volIndex, int fsIndex, int refIndex,\n      bool showVolName, bool showFsName) const;\n\n  bool CheckItemExtents(int volIndex, const CItem &item) const;\n};\n\n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Udf/UdfRegister.cpp",
    "content": "// UdfRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"UdfHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NUdf::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Udf\", L\"iso\", 0, 0xE0, { 0, 'N', 'S', 'R', '0' }, 5, false, CreateArc, 0 };\n\nREGISTER_ARC(Udf)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Wim/WimHandler.cpp",
    "content": "// WimHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/Defs.h\"\n#include \"Common/ComTry.h\"\n#include \"Common/StringToInt.h\"\n#include \"Common/UTFConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/StreamUtils.h\"\n#include \"../../Common/ProgressUtils.h\"\n\n#include \"../../../../C/CpuArch.h\"\n\n#include \"WimHandler.h\"\n\n#define Get16(p) GetUi16(p)\n#define Get32(p) GetUi32(p)\n#define Get64(p) GetUi64(p)\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NWim {\n\n#define WIM_DETAILS\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidAttrib, VT_UI4},\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME}\n  \n  #ifdef WIM_DETAILS\n  , { NULL, kpidVolume, VT_UI4}\n  , { NULL, kpidOffset, VT_UI8}\n  , { NULL, kpidLinks, VT_UI4}\n  #endif\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidComment, VT_FILETIME},\n  { NULL, kpidIsVolume, VT_BOOL},\n  { NULL, kpidVolume, VT_UI4},\n  { NULL, kpidNumVolumes, VT_UI4}\n};\n\nstatic bool ParseNumber64(const AString &s, UInt64 &res)\n{\n  const char *end;\n  if (s.Left(2) == \"0x\")\n  {\n    if (s.Length() == 2)\n      return false;\n    res = ConvertHexStringToUInt64((const char *)s + 2, &end);\n  }\n  else\n  {\n    if (s.IsEmpty())\n      return false;\n    res = ConvertStringToUInt64(s, &end);\n  }\n  return *end == 0;\n}\n\nstatic bool ParseNumber32(const AString &s, UInt32 &res)\n{\n  UInt64 res64;\n  if (!ParseNumber64(s, res64) || res64 >= ((UInt64)1 << 32))\n    return false;\n  res = (UInt32)res64;\n  return true;\n}\n\nvoid ParseTime(const CXmlItem &item, bool &defined, FILETIME &ft, const AString &s)\n{\n  defined = false;\n  int cTimeIndex = item.FindSubTag(s);\n  if (cTimeIndex >= 0)\n  {\n    const CXmlItem &timeItem = item.SubItems[cTimeIndex];\n    UInt32 high = 0, low = 0;\n    if (ParseNumber32(timeItem.GetSubStringForTag(\"HIGHPART\"), high) &&\n      ParseNumber32(timeItem.GetSubStringForTag(\"LOWPART\"), low))\n    {\n      defined = true;\n      ft.dwHighDateTime = high;\n      ft.dwLowDateTime = low;\n    }\n  }\n}\n\nvoid CImageInfo::Parse(const CXmlItem &item)\n{\n  ParseTime(item, CTimeDefined, CTime, \"CREATIONTIME\");\n  ParseTime(item, MTimeDefined, MTime, \"LASTMODIFICATIONTIME\");\n  NameDefined = ConvertUTF8ToUnicode(item.GetSubStringForTag(\"NAME\"), Name);\n  // IndexDefined = ParseNumber32(item.GetPropertyValue(\"INDEX\"), Index);\n}\n\nvoid CXml::Parse()\n{\n  size_t size = Data.GetCapacity();\n  if (size < 2 || (size & 1) != 0 || (size > 1 << 24))\n    return;\n  const Byte *p = Data;\n  if (Get16(p) != 0xFEFF)\n    return;\n  UString s;\n  {\n    wchar_t *chars = s.GetBuffer((int)size / 2 + 1);\n    for (size_t i = 2; i < size; i += 2)\n      *chars++ = (wchar_t)Get16(p + i);\n    *chars = 0;\n    s.ReleaseBuffer();\n  }\n\n  AString utf;\n  if (!ConvertUnicodeToUTF8(s, utf))\n    return;\n  ::CXml xml;\n  if (!xml.Parse(utf))\n    return;\n  if (xml.Root.Name != \"WIM\")\n    return;\n\n  for (int i = 0; i < xml.Root.SubItems.Size(); i++)\n  {\n    const CXmlItem &item = xml.Root.SubItems[i];\n    if (item.IsTagged(\"IMAGE\"))\n    {\n      CImageInfo imageInfo;\n      imageInfo.Parse(item);\n      Images.Add(imageInfo);\n    }\n  }\n}\n\nstatic const wchar_t *kStreamsNamePrefix = L\"Files\" WSTRING_PATH_SEPARATOR;\nstatic const wchar_t *kMethodLZX = L\"LZX\";\nstatic const wchar_t *kMethodXpress = L\"XPress\";\nstatic const wchar_t *kMethodCopy = L\"Copy\";\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n\n  const CImageInfo *image = NULL;\n  if (m_Xmls.Size() == 1)\n  {\n    const CXml &xml = m_Xmls[0];\n    if (xml.Images.Size() == 1)\n      image = &xml.Images[0];\n  }\n\n  switch(propID)\n  {\n    case kpidSize: prop = m_Database.GetUnpackSize(); break;\n    case kpidPackSize: prop = m_Database.GetPackSize(); break;\n    \n    case kpidCTime:\n      if (m_Xmls.Size() == 1)\n      {\n        const CXml &xml = m_Xmls[0];\n        int index = -1;\n        for (int i = 0; i < xml.Images.Size(); i++)\n        {\n          const CImageInfo &image = xml.Images[i];\n          if (image.CTimeDefined)\n            if (index < 0 || ::CompareFileTime(&image.CTime, &xml.Images[index].CTime) < 0)\n              index = i;\n        }\n        if (index >= 0)\n          prop = xml.Images[index].CTime;\n      }\n      break;\n\n    case kpidMTime:\n      if (m_Xmls.Size() == 1)\n      {\n        const CXml &xml = m_Xmls[0];\n        int index = -1;\n        for (int i = 0; i < xml.Images.Size(); i++)\n        {\n          const CImageInfo &image = xml.Images[i];\n          if (image.MTimeDefined)\n            if (index < 0 || ::CompareFileTime(&image.MTime, &xml.Images[index].MTime) > 0)\n              index = i;\n        }\n        if (index >= 0)\n          prop = xml.Images[index].MTime;\n      }\n      break;\n\n    case kpidComment: if (image != NULL && image->NameDefined) prop = image->Name; break;\n\n    case kpidIsVolume:\n      if (m_Xmls.Size() > 0)\n      {\n        UInt16 volIndex = m_Xmls[0].VolIndex;\n        if (volIndex < m_Volumes.Size())\n          prop = (m_Volumes[volIndex].Header.NumParts > 1);\n      }\n      break;\n    case kpidVolume:\n      if (m_Xmls.Size() > 0)\n      {\n        UInt16 volIndex = m_Xmls[0].VolIndex;\n        if (volIndex < m_Volumes.Size())\n          prop = (UInt32)m_Volumes[volIndex].Header.PartNumber;\n      }\n      break;\n    case kpidNumVolumes: if (m_Volumes.Size() > 0) prop = (UInt32)(m_Volumes.Size() - 1); break;\n    case kpidMethod:\n    {\n      bool lzx = false, xpress = false, copy = false;\n      for (int i = 0; i < m_Xmls.Size(); i++)\n      {\n        const CVolume &vol = m_Volumes[m_Xmls[i].VolIndex];\n        const CHeader &header = vol.Header;\n        if (header.IsCompressed())\n          if (header.IsLzxMode())\n            lzx = true;\n          else\n            xpress = true;\n        else\n          copy = true;\n      }\n      UString res;\n      if (lzx)\n        res = kMethodLZX;\n      if (xpress)\n      {\n        if (!res.IsEmpty())\n          res += L' ';\n        res += kMethodXpress;\n      }\n      if (copy)\n      {\n        if (!res.IsEmpty())\n          res += L' ';\n        res += kMethodCopy;\n      }\n      prop = res;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  if (index < (UInt32)m_Database.Items.Size())\n  {\n    const CItem &item = m_Database.Items[index];\n    const CStreamInfo *si = NULL;\n    const CVolume *vol = NULL;\n    if (item.StreamIndex >= 0)\n    {\n      si = &m_Database.Streams[item.StreamIndex];\n      vol = &m_Volumes[si->PartNumber];\n    }\n\n    switch(propID)\n    {\n      case kpidPath:\n        if (item.HasMetadata)\n          prop = item.Name;\n        else\n        {\n          wchar_t sz[32];\n          ConvertUInt64ToString(item.StreamIndex, sz);\n          UString s = sz;\n          while (s.Length() < m_NameLenForStreams)\n            s = L'0' + s;\n          s = UString(kStreamsNamePrefix) + s;\n          prop = s;\n          break;\n        }\n        break;\n      case kpidIsDir: prop = item.isDir(); break;\n      case kpidAttrib: if (item.HasMetadata) prop = item.Attrib; break;\n      case kpidCTime: if (item.HasMetadata) prop = item.CTime; break;\n      case kpidATime: if (item.HasMetadata) prop = item.ATime; break;\n      case kpidMTime: if (item.HasMetadata) prop = item.MTime; break;\n      case kpidPackSize: prop = si ? si->Resource.PackSize : (UInt64)0; break;\n      case kpidSize: prop = si ? si->Resource.UnpackSize : (UInt64)0; break;\n      case kpidMethod: if (si) prop = si->Resource.IsCompressed() ?\n          (vol->Header.IsLzxMode() ? kMethodLZX : kMethodXpress) : kMethodCopy; break;\n      #ifdef WIM_DETAILS\n      case kpidVolume: if (si) prop = (UInt32)si->PartNumber; break;\n      case kpidOffset: if (si)  prop = (UInt64)si->Resource.Offset; break;\n      case kpidLinks: prop = si ? (UInt32)si->RefCount : (UInt32)0; break;\n      #endif\n    }\n  }\n  else\n  {\n    index -= m_Database.Items.Size();\n    {\n      switch(propID)\n      {\n        case kpidPath:\n        {\n          wchar_t sz[32];\n          ConvertUInt64ToString(m_Xmls[index].VolIndex, sz);\n          UString s = (UString)sz + L\".xml\";\n          prop = s;\n          break;\n        }\n        case kpidIsDir: prop = false; break;\n        case kpidPackSize:\n        case kpidSize: prop = (UInt64)m_Xmls[index].Data.GetCapacity(); break;\n        case kpidMethod: prop = L\"Copy\"; break;\n      }\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nclass CVolumeName\n{\n  // UInt32 _volIndex;\n  UString _before;\n  UString _after;\npublic:\n  CVolumeName() {};\n\n  void InitName(const UString &name)\n  {\n    // _volIndex = 1;\n    int dotPos = name.ReverseFind('.');\n    if (dotPos < 0)\n      dotPos = name.Length();\n    _before = name.Left(dotPos);\n    _after = name.Mid(dotPos);\n  }\n\n  UString GetNextName(UInt32 index)\n  {\n    wchar_t s[32];\n    ConvertUInt64ToString((index), s);\n    return _before + (UString)s + _after;\n  }\n};\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  Close();\n  try\n  {\n    CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;\n    \n    CVolumeName seqName;\n    if (openArchiveCallback != NULL)\n      openArchiveCallback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);\n\n    UInt32 numVolumes = 1;\n    int firstVolumeIndex = -1;\n    for (UInt32 i = 1; i <= numVolumes; i++)\n    {\n      CMyComPtr<IInStream> curStream;\n      if (i != 1)\n      {\n        UString fullName = seqName.GetNextName(i);\n        HRESULT result = openVolumeCallback->GetStream(fullName, &curStream);\n        if (result == S_FALSE)\n          continue;\n        if (result != S_OK)\n          return result;\n        if (!curStream)\n          break;\n      }\n      else\n        curStream = inStream;\n      CHeader header;\n      HRESULT res = NWim::ReadHeader(curStream, header);\n      if (res != S_OK)\n      {\n        if (i == 1)\n          return res;\n        if (res == S_FALSE)\n          continue;\n        return res;\n      }\n      if (firstVolumeIndex >= 0)\n        if (!header.AreFromOnArchive(m_Volumes[firstVolumeIndex].Header))\n          break;\n      if (m_Volumes.Size() > header.PartNumber && m_Volumes[header.PartNumber].Stream)\n        break;\n      CXml xml;\n      xml.VolIndex = header.PartNumber;\n      res = OpenArchive(curStream, header, xml.Data, m_Database);\n      if (res != S_OK)\n      {\n        if (i == 1)\n          return res;\n        if (res == S_FALSE)\n          continue;\n        return res;\n      }\n      \n      while (m_Volumes.Size() <= header.PartNumber)\n        m_Volumes.Add(CVolume());\n      CVolume &volume = m_Volumes[header.PartNumber];\n      volume.Header = header;\n      volume.Stream = curStream;\n      \n      firstVolumeIndex = header.PartNumber;\n      \n      bool needAddXml = true;\n      if (m_Xmls.Size() != 0)\n        if (xml.Data == m_Xmls[0].Data)\n          needAddXml = false;\n      if (needAddXml)\n      {\n        xml.Parse();\n        m_Xmls.Add(xml);\n      }\n      \n      if (i == 1)\n      {\n        if (header.PartNumber != 1)\n          break;\n        if (!openVolumeCallback)\n          break;\n        numVolumes = header.NumParts;\n        {\n          NCOM::CPropVariant prop;\n          RINOK(openVolumeCallback->GetProperty(kpidName, &prop));\n          if (prop.vt != VT_BSTR)\n            break;\n          seqName.InitName(prop.bstrVal);\n        }\n      }\n    }\n\n    RINOK(SortDatabase(m_Database));\n\n    wchar_t sz[32];\n    ConvertUInt64ToString(m_Database.Streams.Size(), sz);\n    m_NameLenForStreams = MyStringLen(sz);\n  }\n  catch(...)\n  {\n    return S_FALSE;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  m_Database.Clear();\n  m_Volumes.Clear();\n  m_Xmls.Clear();\n  m_NameLenForStreams = 0;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == UInt32(-1));\n\n  if (allFilesMode)\n    numItems = m_Database.Items.Size() + m_Xmls.Size();\n  if (numItems == 0)\n    return S_OK;\n  bool testMode = (_aTestMode != 0);\n\n  UInt32 i;\n  UInt64 totalSize = 0;\n  for (i = 0; i < numItems; i++)\n  {\n    UInt32 index = allFilesMode ? i : indices[i];\n    if (index < (UInt32)m_Database.Items.Size())\n    {\n      int streamIndex = m_Database.Items[index].StreamIndex;\n      if (streamIndex >= 0)\n      {\n        const CStreamInfo &si = m_Database.Streams[streamIndex];\n        totalSize += si.Resource.UnpackSize;\n      }\n    }\n    else\n      totalSize += m_Xmls[index - (UInt32)m_Database.Items.Size()].Data.GetCapacity();\n  }\n\n  RINOK(extractCallback->SetTotal(totalSize));\n\n  UInt64 currentTotalPacked = 0;\n  UInt64 currentTotalUnPacked = 0;\n  UInt64 currentItemUnPacked, currentItemPacked;\n  \n  int prevSuccessStreamIndex = -1;\n\n  CUnpacker unpacker;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  for (i = 0; i < numItems; currentTotalUnPacked += currentItemUnPacked,\n      currentTotalPacked += currentItemPacked)\n  {\n    currentItemUnPacked = 0;\n    currentItemPacked = 0;\n\n    lps->InSize = currentTotalPacked;\n    lps->OutSize = currentTotalUnPacked;\n\n    RINOK(lps->SetCur());\n    UInt32 index = allFilesMode ? i : indices[i];\n    i++;\n    Int32 askMode = testMode ?\n        NExtract::NAskMode::kTest :\n        NExtract::NAskMode::kExtract;\n\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n    if (index >= (UInt32)m_Database.Items.Size())\n    {\n      if(!testMode && (!realOutStream))\n        continue;\n      RINOK(extractCallback->PrepareOperation(askMode));\n      const CByteBuffer &data = m_Xmls[index - (UInt32)m_Database.Items.Size()].Data;\n      currentItemUnPacked = data.GetCapacity();\n      if (realOutStream)\n      {\n        RINOK(WriteStream(realOutStream, (const Byte *)data, data.GetCapacity()));\n        realOutStream.Release();\n      }\n      RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));\n      continue;\n    }\n\n    const CItem &item = m_Database.Items[index];\n    int streamIndex = item.StreamIndex;\n    if (streamIndex < 0)\n    {\n      if(!testMode && (!realOutStream))\n        continue;\n      RINOK(extractCallback->PrepareOperation(askMode));\n      realOutStream.Release();\n      RINOK(extractCallback->SetOperationResult(item.HasStream() ?\n            NExtract::NOperationResult::kDataError :\n            NExtract::NOperationResult::kOK));\n      continue;\n    }\n\n    const CStreamInfo &si = m_Database.Streams[streamIndex];\n    currentItemUnPacked = si.Resource.UnpackSize;\n    currentItemPacked = si.Resource.PackSize;\n\n    if(!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n    Int32 opRes = NExtract::NOperationResult::kOK;\n    if (streamIndex != prevSuccessStreamIndex || realOutStream)\n    {\n      Byte digest[20];\n      const CVolume &vol = m_Volumes[si.PartNumber];\n      HRESULT res = unpacker.Unpack(vol.Stream, si.Resource, vol.Header.IsLzxMode(),\n          realOutStream, progress, digest);\n      if (res == S_OK)\n      {\n        if (memcmp(digest, si.Hash, kHashSize) == 0)\n          prevSuccessStreamIndex = streamIndex;\n        else\n          opRes = NExtract::NOperationResult::kCRCError;\n      }\n      else if (res == S_FALSE)\n        opRes = NExtract::NOperationResult::kDataError;\n      else\n        return res;\n    }\n    realOutStream.Release();\n    RINOK(extractCallback->SetOperationResult(opRes));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = m_Database.Items.Size() + m_Xmls.Size();\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Wim/WimHandler.h",
    "content": "// WimHandler.h\n\n#ifndef __ARCHIVE_WIM_HANDLER_H\n#define __ARCHIVE_WIM_HANDLER_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/MyXml.h\"\n\n#include \"../IArchive.h\"\n#include \"WimIn.h\"\n\nnamespace NArchive {\nnamespace NWim {\n\nstruct CVolume\n{\n  CHeader Header;\n  CMyComPtr<IInStream> Stream;\n};\n\nstruct CImageInfo\n{\n  bool CTimeDefined;\n  bool MTimeDefined;\n  bool NameDefined;\n  // bool IndexDefined;\n  \n  FILETIME CTime;\n  FILETIME MTime;\n  UString Name;\n  // UInt32 Index;\n  \n  CImageInfo(): CTimeDefined(false), MTimeDefined(false), NameDefined(false)\n      // , IndexDefined(false)\n      {}\n  void Parse(const CXmlItem &item);\n};\n\nstruct CXml\n{\n  CByteBuffer Data;\n  UInt16 VolIndex;\n\n  CObjectVector<CImageInfo> Images;\n\n  void Parse();\n};\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CDatabase m_Database;\n  CObjectVector<CVolume> m_Volumes;\n  CObjectVector<CXml> m_Xmls;\n  int m_NameLenForStreams;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Wim/WimIn.cpp",
    "content": "// Archive/WimIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/MyCom.h\"\n#include \"Common/IntToString.h\"\n\n#include \"../../Common/StreamUtils.h\"\n#include \"../../Common/StreamObjects.h\"\n#include \"../../Common/LimitedStreams.h\"\n\n#include \"../Common/OutStreamWithSha1.h\"\n\n#include \"../../../../C/CpuArch.h\"\n\n#include \"WimIn.h\"\n\n#define Get16(p) GetUi16(p)\n#define Get32(p) GetUi32(p)\n#define Get64(p) GetUi64(p)\n\nnamespace NArchive{\nnamespace NWim{\n\nstatic const int kChunkSizeBits = 15;\nstatic const UInt32 kChunkSize = (1 << kChunkSizeBits);\n\nnamespace NXpress {\n\nclass CDecoderFlusher\n{\n  CDecoder *m_Decoder;\npublic:\n  bool NeedFlush;\n  CDecoderFlusher(CDecoder *decoder): m_Decoder(decoder), NeedFlush(true) {}\n  ~CDecoderFlusher()\n  {\n    if (NeedFlush)\n      m_Decoder->Flush();\n    m_Decoder->ReleaseStreams();\n  }\n};\n\nHRESULT CDecoder::CodeSpec(UInt32 outSize)\n{\n  {\n    Byte levels[kMainTableSize];\n    for (int i = 0; i < kMainTableSize; i += 2)\n    {\n      Byte b = m_InBitStream.DirectReadByte();\n      levels[i] = b & 0xF;\n      levels[i + 1] = b >> 4;\n    }\n    if (!m_MainDecoder.SetCodeLengths(levels))\n      return S_FALSE;\n  }\n\n  while (outSize > 0)\n  {\n    UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);\n    if (number < 256)\n    {\n      m_OutWindowStream.PutByte((Byte)number);\n      outSize--;\n    }\n    else\n    {\n      if (number >= kMainTableSize)\n        return S_FALSE;\n      UInt32 posLenSlot = number - 256;\n      UInt32 posSlot = posLenSlot / kNumLenSlots;\n      UInt32 len = posLenSlot % kNumLenSlots;\n      UInt32 distance = (1 << posSlot) - 1 + m_InBitStream.ReadBits(posSlot);\n      \n      if (len == kNumLenSlots - 1)\n      {\n        len = m_InBitStream.DirectReadByte();\n        if (len == 0xFF)\n        {\n          len = m_InBitStream.DirectReadByte();\n          len |= (UInt32)m_InBitStream.DirectReadByte() << 8;\n        }\n        else\n          len += kNumLenSlots - 1;\n      }\n      \n      len += kMatchMinLen;\n      UInt32 locLen = (len <= outSize ? len : outSize);\n\n      if (!m_OutWindowStream.CopyBlock(distance, locLen))\n        return S_FALSE;\n      \n      len -= locLen;\n      outSize -= locLen;\n      if (len != 0)\n        return S_FALSE;\n    }\n  }\n  return S_OK;\n}\n\nconst UInt32 kDictSize = (1 << kNumPosSlots);\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize)\n{\n  if (!m_OutWindowStream.Create(kDictSize) || !m_InBitStream.Create(1 << 16))\n    return E_OUTOFMEMORY;\n\n  CDecoderFlusher flusher(this);\n\n  m_InBitStream.SetStream(inStream);\n  m_OutWindowStream.SetStream(outStream);\n  m_InBitStream.Init();\n  m_OutWindowStream.Init(false);\n\n  RINOK(CodeSpec(outSize));\n\n  flusher.NeedFlush = false;\n  return Flush();\n}\n\nHRESULT CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize)\n{\n  try { return CodeReal(inStream, outStream, outSize); }\n  catch(const CInBufferException &e) { return e.ErrorCode; } \\\n  catch(const CLzOutWindowException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\n}\n\nstatic void GetFileTimeFromMem(const Byte *p, FILETIME *ft)\n{\n  ft->dwLowDateTime = Get32(p);\n  ft->dwHighDateTime = Get32(p + 4);\n}\n\nHRESULT CUnpacker::Unpack(IInStream *inStream, const CResource &resource, bool lzxMode,\n    ISequentialOutStream *outStream, ICompressProgressInfo *progress)\n{\n  RINOK(inStream->Seek(resource.Offset, STREAM_SEEK_SET, NULL));\n\n  CLimitedSequentialInStream *limitedStreamSpec = new CLimitedSequentialInStream();\n  CMyComPtr<ISequentialInStream> limitedStream = limitedStreamSpec;\n  limitedStreamSpec->SetStream(inStream);\n\n  if (!copyCoder)\n  {\n    copyCoderSpec = new NCompress::CCopyCoder;\n    copyCoder = copyCoderSpec;\n  }\n  if (!resource.IsCompressed())\n  {\n    if (resource.PackSize != resource.UnpackSize)\n      return S_FALSE;\n    limitedStreamSpec->Init(resource.PackSize);\n    return copyCoder->Code(limitedStreamSpec, outStream, NULL, NULL, progress);\n  }\n  if (resource.UnpackSize == 0)\n    return S_OK;\n  UInt64 numChunks = (resource.UnpackSize + kChunkSize - 1) >> kChunkSizeBits;\n  unsigned entrySize = ((resource.UnpackSize > (UInt64)1 << 32) ? 8 : 4);\n  UInt64 sizesBufSize64 = entrySize * (numChunks - 1);\n  size_t sizesBufSize = (size_t)sizesBufSize64;\n  if (sizesBufSize != sizesBufSize64)\n    return E_OUTOFMEMORY;\n  if (sizesBufSize > sizesBuf.GetCapacity())\n  {\n    sizesBuf.Free();\n    sizesBuf.SetCapacity(sizesBufSize);\n  }\n  RINOK(ReadStream_FALSE(inStream, (Byte *)sizesBuf, sizesBufSize));\n  const Byte *p = (const Byte *)sizesBuf;\n  \n  if (lzxMode && !lzxDecoder)\n  {\n    lzxDecoderSpec = new NCompress::NLzx::CDecoder(true);\n    lzxDecoder = lzxDecoderSpec;\n    RINOK(lzxDecoderSpec->SetParams(kChunkSizeBits));\n  }\n  \n  UInt64 baseOffset = resource.Offset + sizesBufSize64;\n  UInt64 outProcessed = 0;\n  for (UInt32 i = 0; i < (UInt32)numChunks; i++)\n  {\n    UInt64 offset = 0;\n    if (i > 0)\n    {\n      offset = (entrySize == 4) ? Get32(p): Get64(p);\n      p += entrySize;\n    }\n    UInt64 nextOffset = resource.PackSize - sizesBufSize64;\n    if (i + 1 < (UInt32)numChunks)\n      nextOffset = (entrySize == 4) ? Get32(p): Get64(p);\n    if (nextOffset < offset)\n      return S_FALSE;\n\n    RINOK(inStream->Seek(baseOffset + offset, STREAM_SEEK_SET, NULL));\n    UInt64 inSize = nextOffset - offset;\n    limitedStreamSpec->Init(inSize);\n\n    if (progress)\n    {\n      RINOK(progress->SetRatioInfo(&offset, &outProcessed));\n    }\n    \n    UInt32 outSize = kChunkSize;\n    if (outProcessed + outSize > resource.UnpackSize)\n      outSize = (UInt32)(resource.UnpackSize - outProcessed);\n    UInt64 outSize64 = outSize;\n    if (inSize == outSize)\n    {\n      RINOK(copyCoder->Code(limitedStreamSpec, outStream, NULL, &outSize64, NULL));\n    }\n    else\n    {\n      if (lzxMode)\n      {\n        lzxDecoderSpec->SetKeepHistory(false);\n        RINOK(lzxDecoder->Code(limitedStreamSpec, outStream, NULL, &outSize64, NULL));\n      }\n      else\n      {\n        RINOK(xpressDecoder.Code(limitedStreamSpec, outStream, outSize));\n      }\n    }\n    outProcessed += outSize;\n  }\n  return S_OK;\n}\n\nHRESULT CUnpacker::Unpack(IInStream *inStream, const CResource &resource, bool lzxMode,\n    ISequentialOutStream *outStream, ICompressProgressInfo *progress, Byte *digest)\n{\n  COutStreamWithSha1 *shaStreamSpec = new COutStreamWithSha1();\n  CMyComPtr<ISequentialOutStream> shaStream = shaStreamSpec;\n  shaStreamSpec->SetStream(outStream);\n  shaStreamSpec->Init(digest != NULL);\n  HRESULT result = Unpack(inStream, resource, lzxMode, shaStream, progress);\n  if (digest)\n    shaStreamSpec->Final(digest);\n  return result;\n}\n\nstatic HRESULT UnpackData(IInStream *inStream, const CResource &resource, bool lzxMode, CByteBuffer &buf, Byte *digest)\n{\n  size_t size = (size_t)resource.UnpackSize;\n  if (size != resource.UnpackSize)\n    return E_OUTOFMEMORY;\n  buf.Free();\n  buf.SetCapacity(size);\n\n  CSequentialOutStreamImp2 *outStreamSpec = new CSequentialOutStreamImp2();\n  CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;\n  outStreamSpec->Init((Byte *)buf, size);\n\n  CUnpacker unpacker;\n  return unpacker.Unpack(inStream, resource, lzxMode, outStream, NULL, digest);\n}\n\nstatic const UInt32 kSignatureSize = 8;\nstatic const Byte kSignature[kSignatureSize] = { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 };\n\nvoid CResource::Parse(const Byte *p)\n{\n  Flags = p[7];\n  PackSize = Get64(p) & (((UInt64)1 << 56) - 1);\n  Offset = Get64(p + 8);\n  UnpackSize = Get64(p + 16);\n}\n\n#define GetResource(p, res) res.Parse(p)\n\nstatic void GetStream(const Byte *p, CStreamInfo &s)\n{\n  s.Resource.Parse(p);\n  s.PartNumber = Get16(p + 24);\n  s.RefCount = Get32(p + 26);\n  memcpy(s.Hash, p + 30, kHashSize);\n}\n\nstatic HRESULT ParseDirItem(const Byte *base, size_t pos, size_t size,\n    const UString &prefix, CObjectVector<CItem> &items)\n{\n  for (;;)\n  {\n    if (pos + 8 > size)\n      return S_FALSE;\n    const Byte *p = base + pos;\n    UInt64 length = Get64(p);\n    if (length == 0)\n      return S_OK;\n    if (pos + 102 > size || pos + length + 8 > size || length > ((UInt64)1 << 62))\n      return S_FALSE;\n    CItem item;\n    item.Attrib = Get32(p + 8);\n    // item.SecurityId = Get32(p + 0xC);\n    UInt64 subdirOffset = Get64(p + 0x10);\n    GetFileTimeFromMem(p + 0x28, &item.CTime);\n    GetFileTimeFromMem(p + 0x30, &item.ATime);\n    GetFileTimeFromMem(p + 0x38, &item.MTime);\n    memcpy(item.Hash, p + 0x40, kHashSize);\n\n    // UInt16 shortNameLen = Get16(p + 98);\n    UInt16 fileNameLen = Get16(p + 100);\n    \n    size_t tempPos = pos + 102;\n    if (tempPos + fileNameLen > size)\n      return S_FALSE;\n    \n    wchar_t *sz = item.Name.GetBuffer(prefix.Length() + fileNameLen / 2 + 1);\n    MyStringCopy(sz, (const wchar_t *)prefix);\n    sz += prefix.Length();\n    for (UInt16 i = 0; i + 2 <= fileNameLen; i += 2)\n      *sz++ = Get16(base + tempPos + i);\n    *sz++ = '\\0';\n    item.Name.ReleaseBuffer();\n    if (fileNameLen == 0 && item.isDir() && !item.HasStream())\n    {\n      item.Attrib = 0x10; // some swm archives have system/hidden attributes for root\n      item.Name.Delete(item.Name.Length() - 1);\n    }\n    items.Add(item);\n    pos += (size_t)length;\n    if (item.isDir() && (subdirOffset != 0))\n    {\n      if (subdirOffset >= size)\n        return S_FALSE;\n      RINOK(ParseDirItem(base, (size_t)subdirOffset, size, item.Name + WCHAR_PATH_SEPARATOR, items));\n    }\n  }\n}\n\nstatic HRESULT ParseDir(const Byte *base, size_t size,\n    const UString &prefix, CObjectVector<CItem> &items)\n{\n  size_t pos = 0;\n  if (pos + 8 > size)\n    return S_FALSE;\n  const Byte *p = base + pos;\n  UInt32 totalLength = Get32(p);\n  // UInt32 numEntries = Get32(p + 4);\n  pos += 8;\n  {\n    /*\n    CRecordVector<UInt64> entryLens;\n    UInt64 sum = 0;\n    for (UInt32 i = 0; i < numEntries; i++)\n    {\n      if (pos + 8 > size)\n        return S_FALSE;\n      UInt64 len = Get64(p + pos);\n      entryLens.Add(len);\n      sum += len;\n      pos += 8;\n    }\n    pos += sum; // skeep security descriptors\n    while ((pos & 7) != 0)\n      pos++;\n    if (pos != totalLength)\n      return S_FALSE;\n    */\n    pos = totalLength;\n  }\n  return ParseDirItem(base, pos, size, prefix, items);\n}\n\nstatic int CompareHashRefs(const int *p1, const int *p2, void *param)\n{\n  const CRecordVector<CStreamInfo> &streams = *(const CRecordVector<CStreamInfo> *)param;\n  return memcmp(streams[*p1].Hash, streams[*p2].Hash, kHashSize);\n}\n\nstatic int CompareStreamsByPos(const CStreamInfo *p1, const CStreamInfo *p2, void * /* param */)\n{\n  int res = MyCompare(p1->PartNumber, p2->PartNumber);\n  if (res != 0)\n    return res;\n  return MyCompare(p1->Resource.Offset, p2->Resource.Offset);\n}\n\nint CompareItems(void *const *a1, void *const *a2, void * /* param */)\n{\n  const CItem &i1 = **((const CItem **)a1);\n  const CItem &i2 = **((const CItem **)a2);\n\n  if (i1.isDir() != i2.isDir())\n    return (i1.isDir()) ? 1 : -1;\n  if (i1.isDir())\n    return -MyStringCompareNoCase(i1.Name, i2.Name);\n\n  int res = MyCompare(i1.StreamIndex, i2.StreamIndex);\n  if (res != 0)\n    return res;\n  return MyStringCompareNoCase(i1.Name, i2.Name);\n}\n\nstatic int FindHash(const CRecordVector<CStreamInfo> &streams,\n    const CRecordVector<int> &sortedByHash, const Byte *hash)\n{\n  int left = 0, right = streams.Size();\n  while (left != right)\n  {\n    int mid = (left + right) / 2;\n    int streamIndex = sortedByHash[mid];\n    UInt32 i;\n    const Byte *hash2 = streams[streamIndex].Hash;\n    for (i = 0; i < kHashSize; i++)\n      if (hash[i] != hash2[i])\n        break;\n    if (i == kHashSize)\n      return streamIndex;\n    if (hash[i] < hash2[i])\n      right = mid;\n    else\n      left = mid + 1;\n  }\n  return -1;\n}\n\nHRESULT CHeader::Parse(const Byte *p)\n{\n  UInt32 haderSize = Get32(p + 8);\n  if (haderSize < 0x74)\n    return S_FALSE;\n  Version = Get32(p + 0x0C);\n  Flags = Get32(p + 0x10);\n  if (!IsSupported())\n    return S_FALSE;\n  UInt32 chunkSize = Get32(p + 0x14);\n  if (chunkSize != kChunkSize && chunkSize != 0)\n    return S_FALSE;\n  memcpy(Guid, p + 0x18, 16);\n  PartNumber = Get16(p + 0x28);\n  NumParts = Get16(p + 0x2A);\n  int offset = 0x2C;\n  if (IsNewVersion())\n  {\n    NumImages = Get32(p + offset);\n    offset += 4;\n  }\n  GetResource(p + offset, OffsetResource);\n  GetResource(p + offset + 0x18, XmlResource);\n  GetResource(p + offset + 0x30, MetadataResource);\n  /*\n  if (IsNewVersion())\n  {\n    if (haderSize < 0xD0)\n      return S_FALSE;\n    IntegrityResource.Parse(p + offset + 0x4C);\n    BootIndex = Get32(p + 0x48);\n  }\n  */\n  return S_OK;\n}\n\nHRESULT ReadHeader(IInStream *inStream, CHeader &h)\n{\n  const UInt32 kHeaderSizeMax = 0xD0;\n  Byte p[kHeaderSizeMax];\n  RINOK(ReadStream_FALSE(inStream, p, kHeaderSizeMax));\n  if (memcmp(p, kSignature, kSignatureSize) != 0)\n    return S_FALSE;\n  return h.Parse(p);\n}\n\nHRESULT ReadStreams(IInStream *inStream, const CHeader &h, CDatabase &db)\n{\n  CByteBuffer offsetBuf;\n  RINOK(UnpackData(inStream, h.OffsetResource, h.IsLzxMode(), offsetBuf, NULL));\n  for (size_t i = 0; i + kStreamInfoSize <= offsetBuf.GetCapacity(); i += kStreamInfoSize)\n  {\n    CStreamInfo s;\n    GetStream((const Byte *)offsetBuf + i, s);\n    if (s.PartNumber == h.PartNumber)\n      db.Streams.Add(s);\n  }\n  return S_OK;\n}\n\nHRESULT OpenArchive(IInStream *inStream, const CHeader &h, CByteBuffer &xml, CDatabase &db)\n{\n  RINOK(UnpackData(inStream, h.XmlResource, h.IsLzxMode(), xml, NULL));\n\n  RINOK(ReadStreams(inStream, h, db));\n  bool needBootMetadata = !h.MetadataResource.IsEmpty();\n  if (h.PartNumber == 1)\n  {\n    int imageIndex = 1;\n    for (int j = 0; j < db.Streams.Size(); j++)\n    {\n      // if (imageIndex > 1) break;\n      const CStreamInfo &si = db.Streams[j];\n      if (!si.Resource.IsMetadata() || si.PartNumber != h.PartNumber)\n        continue;\n      Byte hash[kHashSize];\n      CByteBuffer metadata;\n      RINOK(UnpackData(inStream, si.Resource, h.IsLzxMode(), metadata, hash));\n      if (memcmp(hash, si.Hash, kHashSize) != 0)\n        return S_FALSE;\n      wchar_t sz[32];\n      ConvertUInt64ToString(imageIndex++, sz);\n      UString s = sz;\n      s += WCHAR_PATH_SEPARATOR;\n      RINOK(ParseDir(metadata, metadata.GetCapacity(), s, db.Items));\n      if (needBootMetadata)\n        if (h.MetadataResource.Offset == si.Resource.Offset)\n          needBootMetadata = false;\n    }\n  }\n  \n  if (needBootMetadata)\n  {\n    CByteBuffer metadata;\n    RINOK(UnpackData(inStream, h.MetadataResource, h.IsLzxMode(), metadata, NULL));\n    RINOK(ParseDir(metadata, metadata.GetCapacity(), L\"0\" WSTRING_PATH_SEPARATOR, db.Items));\n  }\n  return S_OK;\n}\n\n\nHRESULT SortDatabase(CDatabase &db)\n{\n  db.Streams.Sort(CompareStreamsByPos, NULL);\n\n  {\n    CRecordVector<int> sortedByHash;\n    {\n      for (int j = 0; j < db.Streams.Size(); j++)\n        sortedByHash.Add(j);\n      sortedByHash.Sort(CompareHashRefs, &db.Streams);\n    }\n    \n    for (int i = 0; i < db.Items.Size(); i++)\n    {\n      CItem &item = db.Items[i];\n      item.StreamIndex = -1;\n      if (item.HasStream())\n        item.StreamIndex = FindHash(db.Streams, sortedByHash, item.Hash);\n    }\n  }\n\n  {\n    CRecordVector<bool> used;\n    int j;\n    for (j = 0; j < db.Streams.Size(); j++)\n    {\n      const CStreamInfo &s = db.Streams[j];\n      used.Add(s.Resource.IsMetadata() && s.PartNumber == 1);\n    }\n    for (int i = 0; i < db.Items.Size(); i++)\n    {\n      CItem &item = db.Items[i];\n      if (item.StreamIndex >= 0)\n        used[item.StreamIndex] = true;\n    }\n    for (j = 0; j < db.Streams.Size(); j++)\n      if (!used[j])\n      {\n        CItem item;\n        item.StreamIndex = j;\n        item.HasMetadata = false;\n        db.Items.Add(item);\n    }\n  }\n  \n  db.Items.Sort(CompareItems, NULL);\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Wim/WimIn.h",
    "content": "// Archive/WimIn.h\n\n#ifndef __ARCHIVE_WIM_IN_H\n#define __ARCHIVE_WIM_IN_H\n\n#include \"Common/Buffer.h\"\n#include \"Common/MyString.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n#include \"../../Compress/LzxDecoder.h\"\n\nnamespace NArchive {\nnamespace NWim {\n\nnamespace NXpress {\n\nclass CBitStream\n{\n  CInBuffer m_Stream;\n  UInt32 m_Value;\n  unsigned m_BitPos;\npublic:\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }\n  void ReleaseStream() { m_Stream.ReleaseStream(); }\n\n  void Init() { m_Stream.Init(); m_BitPos = 0; }\n  // UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - m_BitPos / 8; }\n  Byte DirectReadByte() { return m_Stream.ReadByte(); }\n\n  void Normalize()\n  {\n    if (m_BitPos < 16)\n    {\n      Byte b0 = m_Stream.ReadByte();\n      Byte b1 = m_Stream.ReadByte();\n      m_Value = (m_Value << 8) | b1;\n      m_Value = (m_Value << 8) | b0;\n      m_BitPos += 16;\n    }\n  }\n\n  UInt32 GetValue(unsigned numBits)\n  {\n    Normalize();\n    return (m_Value >> (m_BitPos - numBits)) & ((1 << numBits) - 1);\n  }\n  \n  void MovePos(unsigned numBits) { m_BitPos -= numBits; }\n  \n  UInt32 ReadBits(unsigned numBits)\n  {\n    UInt32 res = GetValue(numBits);\n    m_BitPos -= numBits;\n    return res;\n  }\n};\n\nconst int kNumHuffmanBits = 16;\nconst UInt32 kMatchMinLen = 3;\nconst UInt32 kNumLenSlots = 16;\nconst UInt32 kNumPosSlots = 16;\nconst UInt32 kNumPosLenSlots = kNumPosSlots * kNumLenSlots;\nconst UInt32 kMainTableSize = 256 + kNumPosLenSlots;\n\nclass CDecoder\n{\n  CBitStream m_InBitStream;\n  CLzOutWindow m_OutWindowStream;\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;\n\n  HRESULT CodeSpec(UInt32 size);\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);\npublic:\n  void ReleaseStreams()\n  {\n    m_OutWindowStream.ReleaseStream();\n    m_InBitStream.ReleaseStream();\n  }\n  HRESULT Flush() { return m_OutWindowStream.Flush(); }\n  HRESULT Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);\n};\n\n}\n\nnamespace NResourceFlags\n{\n  const Byte Compressed = 4;\n  const Byte kMetadata = 2;\n}\n\nstruct CResource\n{\n  UInt64 PackSize;\n  UInt64 Offset;\n  UInt64 UnpackSize;\n  Byte Flags;\n\n  void Parse(const Byte *p);\n  bool IsCompressed() const { return (Flags & NResourceFlags::Compressed) != 0; }\n  bool IsMetadata() const { return (Flags & NResourceFlags::kMetadata) != 0; }\n  bool IsEmpty() const { return (UnpackSize == 0); }\n};\n\nnamespace NHeaderFlags\n{\n  const UInt32 kCompression = 2;\n  const UInt32 kSpanned = 8;\n  const UInt32 kRpFix = 0x80;\n  const UInt32 kXPRESS = 0x20000;\n  const UInt32 kLZX = 0x40000;\n}\n\nstruct CHeader\n{\n  UInt32 Flags;\n  UInt32 Version;\n  // UInt32 ChunkSize;\n  UInt16 PartNumber;\n  UInt16 NumParts;\n  UInt32 NumImages;\n  Byte Guid[16];\n  \n  CResource OffsetResource;\n  CResource XmlResource;\n  CResource MetadataResource;\n  /*\n  CResource IntegrityResource;\n  UInt32 BootIndex;\n  */\n\n  HRESULT Parse(const Byte *p);\n  bool IsCompressed() const { return (Flags & NHeaderFlags::kCompression) != 0; }\n  bool IsSupported() const { return (!IsCompressed() || (Flags & NHeaderFlags::kLZX) != 0 || (Flags & NHeaderFlags::kXPRESS) != 0 ) ; }\n  bool IsLzxMode() const { return (Flags & NHeaderFlags::kLZX) != 0; }\n  bool IsSpanned() const { return (!IsCompressed() || (Flags & NHeaderFlags::kSpanned) != 0); }\n\n  bool IsNewVersion()const { return (Version > 0x010C00); }\n\n  bool AreFromOnArchive(const CHeader &h)\n  {\n    return (memcmp(Guid, h.Guid, sizeof(Guid)) == 0) && (h.NumParts == NumParts);\n  }\n};\n\nconst UInt32 kHashSize = 20;\nconst UInt32 kStreamInfoSize = 24 + 2 + 4 + kHashSize;\n\nstruct CStreamInfo\n{\n  CResource Resource;\n  UInt16 PartNumber;\n  UInt32 RefCount;\n  BYTE Hash[kHashSize];\n};\n\nstruct CItem\n{\n  UString Name;\n  UInt32 Attrib;\n  // UInt32 SecurityId;\n  BYTE Hash[kHashSize];\n  FILETIME CTime;\n  FILETIME ATime;\n  FILETIME MTime;\n  // UInt32 ReparseTag;\n  // UInt64 HardLink;\n  // UInt16 NumStreams;\n  // UInt16 ShortNameLen;\n  int StreamIndex;\n  bool HasMetadata;\n  CItem(): HasMetadata(true), StreamIndex(-1) {}\n  bool isDir() const { return HasMetadata && ((Attrib & 0x10) != 0); }\n  bool HasStream() const\n  {\n    for (int i = 0; i < kHashSize; i++)\n      if (Hash[i] != 0)\n        return true;\n    return false;\n  }\n};\n\nstruct CDatabase\n{\n  CRecordVector<CStreamInfo> Streams;\n  CObjectVector<CItem> Items;\n\n  UInt64 GetUnpackSize() const\n  {\n    UInt64 res = 0;\n    for (int i = 0; i < Streams.Size(); i++)\n      res += Streams[i].Resource.UnpackSize;\n    return res;\n  }\n\n  UInt64 GetPackSize() const\n  {\n    UInt64 res = 0;\n    for (int i = 0; i < Streams.Size(); i++)\n      res += Streams[i].Resource.PackSize;\n    return res;\n  }\n\n  void Clear()\n  {\n    Streams.Clear();\n    Items.Clear();\n  }\n};\n\nHRESULT ReadHeader(IInStream *inStream, CHeader &header);\nHRESULT OpenArchive(IInStream *inStream, const CHeader &header, CByteBuffer &xml, CDatabase &database);\nHRESULT SortDatabase(CDatabase &database);\n\nclass CUnpacker\n{\n  NCompress::CCopyCoder *copyCoderSpec;\n  CMyComPtr<ICompressCoder> copyCoder;\n\n  NCompress::NLzx::CDecoder *lzxDecoderSpec;\n  CMyComPtr<ICompressCoder> lzxDecoder;\n\n  NXpress::CDecoder xpressDecoder;\n\n  CByteBuffer sizesBuf;\n  HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,\n      ISequentialOutStream *outStream, ICompressProgressInfo *progress);\npublic:\n  HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,\n      ISequentialOutStream *outStream, ICompressProgressInfo *progress, Byte *digest);\n};\n\n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Wim/WimRegister.cpp",
    "content": "// WimRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"WimHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NWim::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Wim\", L\"wim swm\", 0, 0xE6, { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 }, 8, false, CreateArc, 0 };\n\nREGISTER_ARC(Wim)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/XarHandler.cpp",
    "content": "// XarHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/MyXml.h\"\n#include \"Common/StringToInt.h\"\n#include \"Common/UTFConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../Common/LimitedStreams.h\"\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamObjects.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/BZip2Decoder.h\"\n#include \"../Compress/CopyCoder.h\"\n#include \"../Compress/ZlibDecoder.h\"\n\n#include \"Common/OutStreamWithSha1.h\"\n\n#define XAR_SHOW_RAW\n\n#define Get16(p) GetBe16(p)\n#define Get32(p) GetBe32(p)\n#define Get64(p) GetBe64(p)\n\nnamespace NArchive {\nnamespace NXar {\n\nstruct CFile\n{\n  AString Name;\n  AString Method;\n  UInt64 Size;\n  UInt64 PackSize;\n  UInt64 Offset;\n  \n  // UInt32 mode;\n  UInt64 CTime;\n  UInt64 MTime;\n  UInt64 ATime;\n  \n  bool IsDir;\n  bool HasData;\n\n  bool Sha1IsDefined;\n  Byte Sha1[20];\n  // bool packSha1IsDefined;\n  // Byte packSha1[20];\n\n  int Parent;\n\n  CFile(): IsDir(false), HasData(false), Sha1IsDefined(false),\n    /* packSha1IsDefined(false), */\n    Parent(-1), Size(0), PackSize(0), CTime(0), MTime(0), ATime(0) {}\n};\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\n  UInt64 _dataStartPos;\n  CMyComPtr<IInStream> _inStream;\n  AString _xml;\n  CObjectVector<CFile> _files;\n\n  HRESULT Open2(IInStream *stream);\n  HRESULT Extract(IInStream *stream);\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n};\n\nconst UInt32 kXmlSizeMax = ((UInt32)1 << 30) - (1 << 14);\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME},\n  { NULL, kpidMethod, VT_BSTR}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nstatic bool ParseNumber(const char *s, int size, UInt32 &res)\n{\n  const char *end;\n  res = (UInt32)ConvertStringToUInt64(s, &end);\n  return (end - s == size);\n}\n\nstatic bool ParseUInt64(const CXmlItem &item, const char *name, UInt64 &res)\n{\n  AString s = item.GetSubStringForTag(name);\n  const char *end;\n  res = ConvertStringToUInt64(s, &end);\n  return (end - (const char *)s == s.Length());\n}\n\nstatic UInt64 ParseTime(const CXmlItem &item, const char *name)\n{\n  AString s = item.GetSubStringForTag(name);\n  if (s.Length() < 20)\n    return 0;\n  const char *p = s;\n  if (p[ 4] != '-' || p[ 7] != '-' || p[10] != 'T' ||\n      p[13] != ':' || p[16] != ':' || p[19] != 'Z')\n    return 0;\n  UInt32 year, month, day, hour, min, sec;\n  if (!ParseNumber(p,      4, year )) return 0;\n  if (!ParseNumber(p + 5,  2, month)) return 0;\n  if (!ParseNumber(p + 8,  2, day  )) return 0;\n  if (!ParseNumber(p + 11, 2, hour )) return 0;\n  if (!ParseNumber(p + 14, 2, min  )) return 0;\n  if (!ParseNumber(p + 17, 2, sec  )) return 0;\n  \n  UInt64 numSecs;\n  if (!NWindows::NTime::GetSecondsSince1601(year, month, day, hour, min, sec, numSecs))\n    return 0;\n  return numSecs * 10000000;\n}\n\nstatic bool HexToByte(char c, Byte &res)\n{\n  if      (c >= '0' && c <= '9') res = c - '0';\n  else if (c >= 'A' && c <= 'F') res = c - 'A' + 10;\n  else if (c >= 'a' && c <= 'f') res = c - 'a' + 10;\n  else return false;\n  return true;\n}\n\n#define METHOD_NAME_ZLIB \"zlib\"\n\nstatic bool ParseSha1(const CXmlItem &item, const char *name, Byte *digest)\n{\n  int index = item.FindSubTag(name);\n  if (index  < 0)\n    return false;\n  const CXmlItem &checkItem = item.SubItems[index];\n  AString style = checkItem.GetPropertyValue(\"style\");\n  if (style == \"SHA1\")\n  {\n    AString s = checkItem.GetSubString();\n    if (s.Length() != 40)\n      return false;\n    for (int i = 0; i < s.Length(); i += 2)\n    {\n      Byte b0, b1;\n      if (!HexToByte(s[i], b0) || !HexToByte(s[i + 1], b1))\n        return false;\n      digest[i / 2] = (b0 << 4) | b1;\n    }\n    return true;\n  }\n  return false;\n}\n\nstatic bool AddItem(const CXmlItem &item, CObjectVector<CFile> &files, int parent)\n{\n  if (!item.IsTag)\n    return true;\n  if (item.Name == \"file\")\n  {\n    CFile file;\n    file.Parent = parent;\n    parent = files.Size();\n    file.Name = item.GetSubStringForTag(\"name\");\n    AString type = item.GetSubStringForTag(\"type\");\n    if (type == \"directory\")\n      file.IsDir = true;\n    else if (type == \"file\")\n      file.IsDir = false;\n    else\n      return false;\n\n    int dataIndex = item.FindSubTag(\"data\");\n    if (dataIndex >= 0 && !file.IsDir)\n    {\n      file.HasData = true;\n      const CXmlItem &dataItem = item.SubItems[dataIndex];\n      if (!ParseUInt64(dataItem, \"size\", file.Size))\n        return false;\n      if (!ParseUInt64(dataItem, \"length\", file.PackSize))\n        return false;\n      if (!ParseUInt64(dataItem, \"offset\", file.Offset))\n        return false;\n      file.Sha1IsDefined = ParseSha1(dataItem, \"extracted-checksum\", file.Sha1);\n      // file.packSha1IsDefined = ParseSha1(dataItem, \"archived-checksum\",  file.packSha1);\n      int encodingIndex = dataItem.FindSubTag(\"encoding\");\n      const CXmlItem &encodingItem = dataItem.SubItems[encodingIndex];\n      if (encodingItem.IsTag)\n      {\n        AString s = encodingItem.GetPropertyValue(\"style\");\n        if (s.Length() >= 0)\n        {\n          AString appl = \"application/\";\n          if (s.Left(appl.Length()) == appl)\n          {\n            s = s.Mid(appl.Length());\n            AString xx = \"x-\";\n            if (s.Left(xx.Length()) == xx)\n            {\n              s = s.Mid(xx.Length());\n              if (s == \"gzip\")\n                s = METHOD_NAME_ZLIB;\n            }\n          }\n          file.Method = s;\n        }\n      }\n    }\n\n    file.CTime = ParseTime(item, \"ctime\");\n    file.MTime = ParseTime(item, \"mtime\");\n    file.ATime = ParseTime(item, \"atime\");\n    files.Add(file);\n  }\n  for (int i = 0; i < item.SubItems.Size(); i++)\n    if (!AddItem(item.SubItems[i], files, parent))\n      return false;\n  return true;\n}\n\nHRESULT CHandler::Open2(IInStream *stream)\n{\n  UInt64 archiveStartPos;\n  RINOK(stream->Seek(0, STREAM_SEEK_SET, &archiveStartPos));\n\n  const UInt32 kHeaderSize = 0x1C;\n  Byte buf[kHeaderSize];\n  RINOK(ReadStream_FALSE(stream, buf, kHeaderSize));\n\n  UInt32 size = Get16(buf + 4);\n  // UInt32 ver = Get16(buf + 6); // == 0\n  if (Get32(buf) != 0x78617221 || size != kHeaderSize)\n    return S_FALSE;\n\n  UInt64 packSize = Get64(buf + 8);\n  UInt64 unpackSize = Get64(buf + 0x10);\n  // UInt32 checkSumAlogo = Get32(buf + 0x18);\n\n  if (unpackSize >= kXmlSizeMax)\n    return S_FALSE;\n\n  _dataStartPos = archiveStartPos + kHeaderSize + packSize;\n\n  char *ss = _xml.GetBuffer((int)unpackSize + 1);\n\n  NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();\n  CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;\n\n  CLimitedSequentialInStream *inStreamLimSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStreamLim(inStreamLimSpec);\n  inStreamLimSpec->SetStream(stream);\n  inStreamLimSpec->Init(packSize);\n\n  CSequentialOutStreamImp2 *outStreamLimSpec = new CSequentialOutStreamImp2;\n  CMyComPtr<ISequentialOutStream> outStreamLim(outStreamLimSpec);\n  outStreamLimSpec->Init((Byte *)ss, (size_t)unpackSize);\n\n  RINOK(zlibCoder->Code(inStreamLim, outStreamLim, NULL, NULL, NULL));\n\n  if (outStreamLimSpec->GetPos() != (size_t)unpackSize)\n    return S_FALSE;\n\n  ss[(size_t)unpackSize] = 0;\n  _xml.ReleaseBuffer();\n\n  CXml xml;\n  if (!xml.Parse(_xml))\n    return S_FALSE;\n  \n  if (!xml.Root.IsTagged(\"xar\") || xml.Root.SubItems.Size() != 1)\n    return S_FALSE;\n  const CXmlItem &toc = xml.Root.SubItems[0];\n  if (!toc.IsTagged(\"toc\"))\n    return S_FALSE;\n  if (!AddItem(toc, _files, -1))\n    return S_FALSE;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  {\n    Close();\n    if (Open2(stream) != S_OK)\n      return S_FALSE;\n    _inStream = stream;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _inStream.Release();\n  _files.Clear();\n  _xml.Empty();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _files.Size()\n    #ifdef XAR_SHOW_RAW\n    + 1\n    #endif\n  ;\n  return S_OK;\n}\n\nstatic void TimeToProp(UInt64 t, NWindows::NCOM::CPropVariant &prop)\n{\n  if (t != 0)\n  {\n    FILETIME ft;\n    ft.dwLowDateTime = (UInt32)(t);\n    ft.dwHighDateTime = (UInt32)(t >> 32);\n    prop = ft;\n  }\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  \n  #ifdef XAR_SHOW_RAW\n  if ((int)index == _files.Size())\n  {\n    switch(propID)\n    {\n      case kpidPath: prop = L\"[TOC].xml\"; break;\n      case kpidSize:\n      case kpidPackSize: prop = (UInt64)_xml.Length(); break;\n    }\n  }\n  else\n  #endif\n  {\n    const CFile &item = _files[index];\n    switch(propID)\n    {\n      case kpidMethod:\n      {\n        UString name;\n        if (ConvertUTF8ToUnicode(item.Method, name))\n          prop = name;\n        break;\n      }\n      case kpidPath:\n      {\n        AString path;\n        int cur = index;\n        do\n        {\n          const CFile &item = _files[cur];\n          AString s = item.Name;\n          if (s.IsEmpty())\n            s = \"unknown\";\n          if (path.IsEmpty())\n            path = s;\n          else\n            path = s + CHAR_PATH_SEPARATOR + path;\n          cur = item.Parent;\n        }\n        while (cur >= 0);\n\n        UString name;\n        if (ConvertUTF8ToUnicode(path, name))\n          prop = name;\n        break;\n      }\n      \n      case kpidIsDir:  prop = item.IsDir; break;\n      case kpidSize:      if (!item.IsDir) prop = item.Size; break;\n      case kpidPackSize:  if (!item.IsDir) prop = item.PackSize; break;\n      \n      case kpidMTime:  TimeToProp(item.MTime, prop); break;\n      case kpidCTime:  TimeToProp(item.CTime, prop); break;\n      case kpidATime:  TimeToProp(item.ATime, prop); break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool testMode = (_aTestMode != 0);\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = _files.Size();\n  if (numItems == 0)\n    return S_OK;\n  UInt64 totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n  {\n    int index = (int)(allFilesMode ? i : indices[i]);\n    #ifdef XAR_SHOW_RAW\n    if (index == _files.Size())\n      totalSize += _xml.Length();\n    else\n    #endif\n      totalSize += _files[index].Size;\n  }\n  extractCallback->SetTotal(totalSize);\n\n  UInt64 currentPackTotal = 0;\n  UInt64 currentUnpTotal = 0;\n  UInt64 currentPackSize = 0;\n  UInt64 currentUnpSize = 0;\n\n  const UInt32 kZeroBufSize = (1 << 14);\n  CByteBuffer zeroBuf;\n  zeroBuf.SetCapacity(kZeroBufSize);\n  memset(zeroBuf, 0, kZeroBufSize);\n  \n  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();\n  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;\n\n  NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();\n  CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;\n  \n  NCompress::NBZip2::CDecoder *bzip2CoderSpec = new NCompress::NBZip2::CDecoder();\n  CMyComPtr<ICompressCoder> bzip2Coder = bzip2CoderSpec;\n\n  NCompress::NDeflate::NDecoder::CCOMCoder *deflateCoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder();\n  CMyComPtr<ICompressCoder> deflateCoder = deflateCoderSpec;\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  CLimitedSequentialInStream *inStreamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> inStream(inStreamSpec);\n  inStreamSpec->SetStream(_inStream);\n\n  \n  CLimitedSequentialOutStream *outStreamLimSpec = new CLimitedSequentialOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamLimSpec);\n\n  COutStreamWithSha1 *outStreamSha1Spec = new COutStreamWithSha1;\n  {\n    CMyComPtr<ISequentialOutStream> outStreamSha1(outStreamSha1Spec);\n    outStreamLimSpec->SetStream(outStreamSha1);\n  }\n\n  for (i = 0; i < numItems; i++, currentPackTotal += currentPackSize, currentUnpTotal += currentUnpSize)\n  {\n    lps->InSize = currentPackTotal;\n    lps->OutSize = currentUnpTotal;\n    currentPackSize = 0;\n    currentUnpSize = 0;\n    RINOK(lps->SetCur());\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n    \n    if (index < _files.Size())\n    {\n      const CFile &item = _files[index];\n      if (item.IsDir)\n      {\n        RINOK(extractCallback->PrepareOperation(askMode));\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n        continue;\n      }\n    }\n\n    if (!testMode && (!realOutStream))\n      continue;\n    RINOK(extractCallback->PrepareOperation(askMode));\n\n    outStreamSha1Spec->SetStream(realOutStream);\n    realOutStream.Release();\n\n    Int32 opRes = NArchive::NExtract::NOperationResult::kOK;\n    #ifdef XAR_SHOW_RAW\n    if (index == _files.Size())\n    {\n      outStreamSha1Spec->Init(false);\n      outStreamLimSpec->Init(_xml.Length());\n      RINOK(WriteStream(outStream, (const char *)_xml, _xml.Length()));\n      currentPackSize = currentUnpSize = _xml.Length();\n    }\n    else\n    #endif\n    {\n      const CFile &item = _files[index];\n      if (item.HasData)\n      {\n        currentPackSize = item.PackSize;\n        currentUnpSize = item.Size;\n        \n        RINOK(_inStream->Seek(_dataStartPos + item.Offset, STREAM_SEEK_SET, NULL));\n        inStreamSpec->Init(item.PackSize);\n        outStreamSha1Spec->Init(item.Sha1IsDefined);\n        outStreamLimSpec->Init(item.Size);\n        HRESULT res = S_OK;\n        \n        ICompressCoder *coder = NULL;\n        if (item.Method == \"octet-stream\")\n          if (item.PackSize == item.Size)\n            coder = copyCoder;\n          else\n            opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n        else if (item.Method == METHOD_NAME_ZLIB)\n          coder = zlibCoder;\n        else if (item.Method == \"bzip2\")\n          coder = bzip2Coder;\n        else\n          opRes = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n        \n        if (coder)\n          res = coder->Code(inStream, outStream, NULL, NULL, progress);\n        \n        if (res != S_OK)\n        {\n          if (!outStreamLimSpec->IsFinishedOK())\n            opRes = NArchive::NExtract::NOperationResult::kDataError;\n          else if (res != S_FALSE)\n            return res;\n          if (opRes == NArchive::NExtract::NOperationResult::kOK)\n            opRes = NArchive::NExtract::NOperationResult::kDataError;\n        }\n\n        if (opRes == NArchive::NExtract::NOperationResult::kOK)\n        {\n          if (outStreamLimSpec->IsFinishedOK() &&\n              outStreamSha1Spec->GetSize() == item.Size)\n          {\n            if (!outStreamLimSpec->IsFinishedOK())\n            {\n              opRes = NArchive::NExtract::NOperationResult::kDataError;\n            }\n            else if (item.Sha1IsDefined)\n            {\n              Byte digest[NCrypto::NSha1::kDigestSize];\n              outStreamSha1Spec->Final(digest);\n              if (memcmp(digest, item.Sha1, NCrypto::NSha1::kDigestSize) != 0)\n                opRes = NArchive::NExtract::NOperationResult::kCRCError;\n            }\n          }\n          else\n            opRes = NArchive::NExtract::NOperationResult::kDataError;\n        }\n      }\n    }\n    outStreamSha1Spec->ReleaseStream();\n    RINOK(extractCallback->SetOperationResult(opRes));\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic IInArchive *CreateArc() { return new NArchive::NXar::CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Xar\", L\"xar\", 0, 0xE1, { 'x', 'a', 'r', '!', 0, 0x1C }, 6, false, CreateArc, 0 };\n\nREGISTER_ARC(Xar)\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/ZHandler.cpp",
    "content": "// ZHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../Common/ProgressUtils.h\"\n#include \"../Common/RegisterArc.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"../Compress/ZDecoder.h\"\n\n#include \"Common/DummyOutStream.h\"\n\nnamespace NArchive {\nnamespace NZ {\n\nclass CHandler:\n  public IInArchive,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IInArchive)\n  INTERFACE_IInArchive(;)\n\nprivate:\n  CMyComPtr<IInStream> _stream;\n  UInt64 _streamStartPosition;\n  UInt64 _packSize;\n  Byte _properties;\n};\n\nstatic IInArchive *CreateArc() { return new CHandler;  }\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Z\", L\"z taz\", L\"* .tar\", 5, { 0x1F, 0x9D }, 2, false, CreateArc, 0 };\n\nREGISTER_ARC(Z)\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPackSize, VT_UI8}\n};\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps_NO\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = 1;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID,  PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidPackSize: prop = _packSize; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nstatic const int kSignatureSize = 3;\n\nSTDMETHODIMP CHandler::Open(IInStream *stream,\n    const UInt64 * /* maxCheckStartPosition */,\n    IArchiveOpenCallback * /* openArchiveCallback */)\n{\n  COM_TRY_BEGIN\n  {\n    RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_streamStartPosition));\n    Byte buffer[kSignatureSize];\n    RINOK(ReadStream_FALSE(stream, buffer, kSignatureSize));\n    if (buffer[0] != 0x1F || buffer[1] != 0x9D)\n      return S_FALSE;\n    _properties = buffer[2];\n\n    UInt64 endPosition;\n    RINOK(stream->Seek(0, STREAM_SEEK_END, &endPosition));\n    _packSize = endPosition - _streamStartPosition - kSignatureSize;\n    \n    _stream = stream;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  _stream.Release();\n  return S_OK;\n}\n\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 testModeSpec, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  bool allFilesMode = (numItems == (UInt32)(-1));\n  if (!allFilesMode)\n  {\n    if (numItems == 0)\n      return S_OK;\n    if (numItems != 1)\n      return E_INVALIDARG;\n    if (indices[0] != 0)\n      return E_INVALIDARG;\n  }\n\n  bool testMode = (testModeSpec != 0);\n\n  extractCallback->SetTotal(_packSize);\n\n  UInt64 currentTotalPacked = 0;\n  \n  RINOK(extractCallback->SetCompleted(&currentTotalPacked));\n  \n  CMyComPtr<ISequentialOutStream> realOutStream;\n  Int32 askMode = testMode ?\n      NExtract::NAskMode::kTest :\n      NExtract::NAskMode::kExtract;\n  \n  RINOK(extractCallback->GetStream(0, &realOutStream, askMode));\n    \n  if (!testMode && !realOutStream)\n    return S_OK;\n\n  extractCallback->PrepareOperation(askMode);\n\n  CDummyOutStream *outStreamSpec = new CDummyOutStream;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n  outStreamSpec->SetStream(realOutStream);\n  outStreamSpec->Init();\n  realOutStream.Release();\n\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, true);\n  \n  RINOK(_stream->Seek(_streamStartPosition + kSignatureSize, STREAM_SEEK_SET, NULL));\n\n  CMyComPtr<ICompressCoder> decoder;\n  NCompress::NZ::CDecoder *decoderSpec = new NCompress::NZ::CDecoder;\n  decoder = decoderSpec;\n\n  HRESULT result = decoderSpec->SetDecoderProperties2(&_properties, 1);\n\n  int opResult;\n  if (result != S_OK)\n    opResult = NExtract::NOperationResult::kUnSupportedMethod;\n  else\n  {\n    result = decoder->Code(_stream, outStream, NULL, NULL, progress);\n    if (result == S_FALSE)\n      opResult = NExtract::NOperationResult::kDataError;\n    else\n    {\n      RINOK(result);\n      opResult = NExtract::NOperationResult::kOK;\n    }\n  }\n  outStream.Release();\n  return extractCallback->SetOperationResult(opResult);\n  COM_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipAddCommon.cpp",
    "content": "// ZipAddCommon.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../../C/7zCrc.h\"\n}\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../ICoder.h\"\n#include \"../../IPassword.h\"\n#include \"../../MyVersion.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/StreamObjects.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../../Compress/LzmaEncoder.h\"\n\n#include \"../Common/InStreamWithCRC.h\"\n\n#include \"ZipAddCommon.h\"\n#include \"ZipHeader.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nstatic const CMethodId kMethodId_ZipBase   = 0x040100;\nstatic const CMethodId kMethodId_BZip2     = 0x040202;\n\nstatic const UInt32 kLzmaPropsSize = 5;\nstatic const UInt32 kLzmaHeaderSize = 4 + kLzmaPropsSize;\n\nclass CLzmaEncoder:\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  NCompress::NLzma::CEncoder *EncoderSpec;\n  CMyComPtr<ICompressCoder> Encoder;\n  Byte Header[kLzmaHeaderSize];\npublic:\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  HRESULT SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);\n\n  MY_UNKNOWN_IMP\n};\n\nHRESULT CLzmaEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)\n{\n  if (!Encoder)\n  {\n    EncoderSpec = new NCompress::NLzma::CEncoder;\n    Encoder = EncoderSpec;\n  }\n  CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp;\n  CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n  outStreamSpec->Init();\n  RINOK(EncoderSpec->SetCoderProperties(propIDs, props, numProps));\n  RINOK(EncoderSpec->WriteCoderProperties(outStream));\n  if (outStreamSpec->GetSize() != kLzmaPropsSize)\n    return E_FAIL;\n  Header[0] = MY_VER_MAJOR;\n  Header[1] = MY_VER_MINOR;\n  Header[2] = kLzmaPropsSize;\n  Header[3] = 0;\n  memcpy(Header + 4, outStreamSpec->GetBuffer(), kLzmaPropsSize);\n  return S_OK;\n}\n\nHRESULT CLzmaEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  RINOK(WriteStream(outStream, Header, kLzmaHeaderSize));\n  return Encoder->Code(inStream, outStream, inSize, outSize, progress);\n}\n\n\nCAddCommon::CAddCommon(const CCompressionMethodMode &options):\n  _options(options),\n  _copyCoderSpec(NULL),\n  _cryptoStreamSpec(0)\n  {}\n\nstatic HRESULT GetStreamCRC(ISequentialInStream *inStream, UInt32 &resultCRC)\n{\n  UInt32 crc = CRC_INIT_VAL;\n  const UInt32 kBufferSize = (1 << 14);\n  Byte buffer[kBufferSize];\n  for (;;)\n  {\n    UInt32 realProcessedSize;\n    RINOK(inStream->Read(buffer, kBufferSize, &realProcessedSize));\n    if (realProcessedSize == 0)\n    {\n      resultCRC = CRC_GET_DIGEST(crc);\n      return S_OK;\n    }\n    crc = CrcUpdate(crc, buffer, (size_t)realProcessedSize);\n  }\n}\n\nHRESULT CAddCommon::Compress(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    ISequentialInStream *inStream, IOutStream *outStream,\n    ICompressProgressInfo *progress, CCompressingResult &operationResult)\n{\n  CSequentialInStreamWithCRC *inSecCrcStreamSpec = 0;\n  CInStreamWithCRC *inCrcStreamSpec = 0;\n  CMyComPtr<ISequentialInStream> inCrcStream;\n  {\n    CMyComPtr<IInStream> inStream2;\n    // we don't support stdin, since stream from stdin can require 64-bit size header\n    RINOK(inStream->QueryInterface(IID_IInStream, (void **)&inStream2));\n    if (inStream2)\n    {\n      inCrcStreamSpec = new CInStreamWithCRC;\n      inCrcStream = inCrcStreamSpec;\n      inCrcStreamSpec->SetStream(inStream2);\n      inCrcStreamSpec->Init();\n    }\n    else\n    {\n      inSecCrcStreamSpec = new CSequentialInStreamWithCRC;\n      inCrcStream = inSecCrcStreamSpec;\n      inSecCrcStreamSpec->SetStream(inStream);\n      inSecCrcStreamSpec->Init();\n    }\n  }\n\n  int numTestMethods = _options.MethodSequence.Size();\n  if (numTestMethods > 1 || _options.PasswordIsDefined)\n  {\n    if (inCrcStreamSpec == 0)\n    {\n      if (_options.PasswordIsDefined)\n        return E_NOTIMPL;\n      numTestMethods = 1;\n    }\n  }\n  Byte method = 0;\n  COutStreamReleaser outStreamReleaser;\n  for (int i = 0; i < numTestMethods; i++)\n  {\n    if (inCrcStreamSpec != 0)\n      RINOK(inCrcStreamSpec->Seek(0, STREAM_SEEK_SET, NULL));\n    RINOK(outStream->Seek(0, STREAM_SEEK_SET, NULL));\n    if (_options.PasswordIsDefined)\n    {\n      if (!_cryptoStream)\n      {\n        _cryptoStreamSpec = new CFilterCoder;\n        _cryptoStream = _cryptoStreamSpec;\n      }\n      if (_options.IsAesMode)\n      {\n        _cryptoStreamSpec->Filter = _aesFilter = _filterAesSpec = new NCrypto::NWzAes::CEncoder;\n        _filterAesSpec->SetKeyMode(_options.AesKeyMode);\n        RINOK(_filterAesSpec->CryptoSetPassword(\n            (const Byte *)(const char *)_options.Password, _options.Password.Length()));\n        RINOK(_filterAesSpec->WriteHeader(outStream));\n      }\n      else\n      {\n        _cryptoStreamSpec->Filter = _zipCryptoFilter = _filterSpec = new NCrypto::NZip::CEncoder;\n        RINOK(_filterSpec->CryptoSetPassword(\n            (const Byte *)(const char *)_options.Password, _options.Password.Length()));\n        UInt32 crc = 0;\n        RINOK(GetStreamCRC(inStream, crc));\n        RINOK(inCrcStreamSpec->Seek(0, STREAM_SEEK_SET, NULL));\n        RINOK(_filterSpec->CryptoSetCRC(crc));\n        RINOK(_filterSpec->WriteHeader(outStream));\n      }\n      RINOK(_cryptoStreamSpec->SetOutStream(outStream));\n      outStreamReleaser.FilterCoder = _cryptoStreamSpec;\n    }\n\n    method = _options.MethodSequence[i];\n    switch(method)\n    {\n      case NFileHeader::NCompressionMethod::kStored:\n      {\n        if (_copyCoderSpec == NULL)\n        {\n          _copyCoderSpec = new NCompress::CCopyCoder;\n          _copyCoder = _copyCoderSpec;\n        }\n        CMyComPtr<ISequentialOutStream> outStreamNew;\n        if (_options.PasswordIsDefined)\n          outStreamNew = _cryptoStream;\n        else\n          outStreamNew = outStream;\n        RINOK(_copyCoder->Code(inCrcStream, outStreamNew, NULL, NULL, progress));\n        operationResult.ExtractVersion = NFileHeader::NCompressionMethod::kStoreExtractVersion;\n        break;\n      }\n      default:\n      {\n        if (!_compressEncoder)\n        {\n          if (method == NFileHeader::NCompressionMethod::kLZMA)\n          {\n            CLzmaEncoder *_lzmaEncoder = new CLzmaEncoder();\n            _compressEncoder = _lzmaEncoder;\n            NWindows::NCOM::CPropVariant props[] =\n            {\n              #ifdef COMPRESS_MT\n              _options.NumThreads,\n              #endif\n              _options.Algo,\n              _options.DicSize,\n              _options.NumFastBytes,\n              (BSTR)(const wchar_t *)_options.MatchFinder,\n              _options.NumMatchFinderCycles\n            };\n            PROPID propIDs[] =\n            {\n              #ifdef COMPRESS_MT\n              NCoderPropID::kNumThreads,\n              #endif\n              NCoderPropID::kAlgorithm,\n              NCoderPropID::kDictionarySize,\n              NCoderPropID::kNumFastBytes,\n              NCoderPropID::kMatchFinder,\n              NCoderPropID::kMatchFinderCycles\n            };\n            int numProps = sizeof(propIDs) / sizeof(propIDs[0]);\n            if (!_options.NumMatchFinderCyclesDefined)\n              numProps--;\n            RINOK(_lzmaEncoder->SetCoderProperties(propIDs, props, numProps));\n          }\n          else\n          {\n          CMethodId methodId;\n          switch(method)\n          {\n            case NFileHeader::NCompressionMethod::kBZip2:\n              methodId = kMethodId_BZip2;\n              break;\n            default:\n              methodId = kMethodId_ZipBase + method;\n              break;\n          }\n          RINOK(CreateCoder(\n              EXTERNAL_CODECS_LOC_VARS\n              methodId, _compressEncoder, true));\n          if (!_compressEncoder)\n            return E_NOTIMPL;\n\n          if (method == NFileHeader::NCompressionMethod::kDeflated ||\n              method == NFileHeader::NCompressionMethod::kDeflated64)\n          {\n            NWindows::NCOM::CPropVariant props[] =\n            {\n              _options.Algo,\n              _options.NumPasses,\n              _options.NumFastBytes,\n              _options.NumMatchFinderCycles\n            };\n            PROPID propIDs[] =\n            {\n              NCoderPropID::kAlgorithm,\n              NCoderPropID::kNumPasses,\n              NCoderPropID::kNumFastBytes,\n              NCoderPropID::kMatchFinderCycles\n            };\n            int numProps = sizeof(propIDs) / sizeof(propIDs[0]);\n            if (!_options.NumMatchFinderCyclesDefined)\n              numProps--;\n            CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n            _compressEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);\n            if (setCoderProperties)\n            {\n              RINOK(setCoderProperties->SetCoderProperties(propIDs, props, numProps));\n            }\n          }\n          else if (method == NFileHeader::NCompressionMethod::kBZip2)\n          {\n            NWindows::NCOM::CPropVariant props[] =\n            {\n              _options.DicSize,\n              _options.NumPasses\n              #ifdef COMPRESS_MT\n              , _options.NumThreads\n              #endif\n            };\n            PROPID propIDs[] =\n            {\n              NCoderPropID::kDictionarySize,\n              NCoderPropID::kNumPasses\n              #ifdef COMPRESS_MT\n              , NCoderPropID::kNumThreads\n              #endif\n            };\n            CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n            _compressEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);\n            if (setCoderProperties)\n            {\n              RINOK(setCoderProperties->SetCoderProperties(propIDs, props, sizeof(propIDs) / sizeof(propIDs[0])));\n            }\n          }\n          }\n        }\n        CMyComPtr<ISequentialOutStream> outStreamNew;\n        if (_options.PasswordIsDefined)\n          outStreamNew = _cryptoStream;\n        else\n          outStreamNew = outStream;\n        RINOK(_compressEncoder->Code(inCrcStream, outStreamNew, NULL, NULL, progress));\n        operationResult.ExtractVersion = NFileHeader::NCompressionMethod::kDeflateExtractVersion;\n        break;\n      }\n    }\n\n    RINOK(outStream->Seek(0, STREAM_SEEK_CUR, &operationResult.PackSize));\n\n    if (inCrcStreamSpec != 0)\n    {\n      operationResult.CRC = inCrcStreamSpec->GetCRC();\n      operationResult.UnpackSize = inCrcStreamSpec->GetSize();\n    }\n    else\n    {\n      operationResult.CRC = inSecCrcStreamSpec->GetCRC();\n      operationResult.UnpackSize = inSecCrcStreamSpec->GetSize();\n    }\n\n    if (_options.PasswordIsDefined)\n    {\n      if (operationResult.PackSize < operationResult.UnpackSize +\n          (_options.IsAesMode ? _filterAesSpec->GetHeaderSize() : NCrypto::NZip::kHeaderSize))\n        break;\n    }\n    else if (operationResult.PackSize < operationResult.UnpackSize)\n      break;\n  }\n  if (_options.IsAesMode)\n  {\n    RINOK(_filterAesSpec->WriteFooter(outStream));\n    RINOK(outStream->Seek(0, STREAM_SEEK_CUR, &operationResult.PackSize));\n  }\n  operationResult.Method = method;\n  return outStream->SetSize(operationResult.PackSize);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipAddCommon.h",
    "content": "// ZipAddCommon.h\n\n#ifndef __ZIP_ADD_COMMON_H\n#define __ZIP_ADD_COMMON_H\n\n#include \"../../ICoder.h\"\n#include \"../../IProgress.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/FilterCoder.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../../Crypto/ZipCrypto.h\"\n#include \"../../Crypto/WzAes.h\"\n\n#include \"ZipCompressionMode.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nstruct CCompressingResult\n{\n  UInt64 UnpackSize;\n  UInt64 PackSize;\n  UInt32 CRC;\n  UInt16 Method;\n  Byte ExtractVersion;\n};\n\nclass CAddCommon\n{\n  CCompressionMethodMode _options;\n  NCompress::CCopyCoder *_copyCoderSpec;\n  CMyComPtr<ICompressCoder> _copyCoder;\n\n  CMyComPtr<ICompressCoder> _compressEncoder;\n\n  CFilterCoder *_cryptoStreamSpec;\n  CMyComPtr<ISequentialOutStream> _cryptoStream;\n\n  NCrypto::NZip::CEncoder *_filterSpec;\n  NCrypto::NWzAes::CEncoder *_filterAesSpec;\n\n  CMyComPtr<ICompressFilter> _zipCryptoFilter;\n  CMyComPtr<ICompressFilter> _aesFilter;\n\n\npublic:\n  CAddCommon(const CCompressionMethodMode &options);\n  HRESULT Compress(\n      DECL_EXTERNAL_CODECS_LOC_VARS\n      ISequentialInStream *inStream, IOutStream *outStream,\n      ICompressProgressInfo *progress, CCompressingResult &operationResult);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipCompressionMode.h",
    "content": "// CompressionMode.h\n\n#ifndef __ZIP_COMPRESSIONMETHOD_H\n#define __ZIP_COMPRESSIONMETHOD_H\n\n#include \"Common/MyString.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nstruct CCompressionMethodMode\n{\n  CRecordVector<Byte> MethodSequence;\n  UString MatchFinder;\n  UInt32 Algo;\n  UInt32 NumPasses;\n  UInt32 NumFastBytes;\n  bool NumMatchFinderCyclesDefined;\n  UInt32 NumMatchFinderCycles;\n  UInt32 DicSize;\n  #ifdef COMPRESS_MT\n  UInt32 NumThreads;\n  #endif\n  bool PasswordIsDefined;\n  AString Password;\n  bool IsAesMode;\n  Byte AesKeyMode;\n  \n  CCompressionMethodMode():\n      NumMatchFinderCyclesDefined(false),\n      PasswordIsDefined(false),\n      IsAesMode(false),\n      AesKeyMode(3)\n      {}\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipHandler.cpp",
    "content": "// ZipHandler.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/Defs.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../IPassword.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/FilterCoder.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../Common/StreamObjects.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n#include \"../../Compress/LzmaDecoder.h\"\n#include \"../../Compress/ImplodeDecoder.h\"\n#include \"../../Compress/ShrinkDecoder.h\"\n#include \"../../Compress/DeflateDecoder.h\"\n\n#include \"../../Crypto/WzAes.h\"\n#include \"../../Crypto/ZipCrypto.h\"\n#include \"../../Crypto/ZipStrong.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n#include \"../Common/OutStreamWithCRC.h\"\n\n#include \"ZipHandler.h\"\n\nusing namespace NWindows;\n\nnamespace NArchive {\nnamespace NZip {\n\n// static const CMethodId kMethodId_Store = 0;\nstatic const CMethodId kMethodId_ZipBase = 0x040100;\nstatic const CMethodId kMethodId_BZip2 = 0x040202;\n\nconst wchar_t *kHostOS[] =\n{\n  L\"FAT\",\n  L\"AMIGA\",\n  L\"VMS\",\n  L\"Unix\",\n  L\"VM/CMS\",\n  L\"Atari\",\n  L\"HPFS\",\n  L\"Macintosh\",\n  L\"Z-System\",\n  L\"CP/M\",\n  L\"TOPS-20\",\n  L\"NTFS\",\n  L\"SMS/QDOS\",\n  L\"Acorn\",\n  L\"VFAT\",\n  L\"MVS\",\n  L\"BeOS\",\n  L\"Tandem\",\n  L\"OS/400\",\n  L\"OS/X\"\n};\n\n\nstatic const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);\n\nstatic const wchar_t *kUnknownOS = L\"Unknown\";\n\nSTATPROPSTG kProps[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME},\n  \n  { NULL, kpidAttrib, VT_UI4},\n\n  { NULL, kpidEncrypted, VT_BOOL},\n  { NULL, kpidComment, VT_BSTR},\n    \n  { NULL, kpidCRC, VT_UI4},\n\n  { NULL, kpidMethod, VT_BSTR},\n  { NULL, kpidHostOS, VT_BSTR}\n\n  // { NULL, kpidUnpackVer, VT_UI1},\n};\n\nconst wchar_t *kMethods[] =\n{\n  L\"Store\",\n  L\"Shrink\",\n  L\"Reduced1\",\n  L\"Reduced2\",\n  L\"Reduced2\",\n  L\"Reduced3\",\n  L\"Implode\",\n  L\"Tokenizing\",\n  L\"Deflate\",\n  L\"Deflate64\",\n  L\"PKImploding\"\n};\n\nconst int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);\nconst wchar_t *kBZip2Method = L\"BZip2\";\nconst wchar_t *kLZMAMethod = L\"LZMA\";\nconst wchar_t *kJpegMethod = L\"Jpeg\";\nconst wchar_t *kWavPackMethod = L\"WavPack\";\nconst wchar_t *kPPMdMethod = L\"PPMd\";\nconst wchar_t *kAESMethod = L\"AES\";\nconst wchar_t *kZipCryptoMethod = L\"ZipCrypto\";\nconst wchar_t *kStrongCryptoMethod = L\"StrongCrypto\";\n\nstruct CStrongCryptoPair\n{\n  UInt16 Id;\n  const wchar_t *Name;\n};\n\nCStrongCryptoPair g_StrongCryptoPairs[] =\n{\n  { NStrongCryptoFlags::kDES, L\"DES\" },\n  { NStrongCryptoFlags::kRC2old, L\"RC2a\" },\n  { NStrongCryptoFlags::k3DES168, L\"3DES-168\" },\n  { NStrongCryptoFlags::k3DES112, L\"3DES-112\" },\n  { NStrongCryptoFlags::kAES128, L\"pkAES-128\" },\n  { NStrongCryptoFlags::kAES192, L\"pkAES-192\" },\n  { NStrongCryptoFlags::kAES256, L\"pkAES-256\" },\n  { NStrongCryptoFlags::kRC2, L\"RC2\" },\n  { NStrongCryptoFlags::kBlowfish, L\"Blowfish\" },\n  { NStrongCryptoFlags::kTwofish, L\"Twofish\" },\n  { NStrongCryptoFlags::kRC4, L\"RC4\" }\n};\n\nSTATPROPSTG kArcProps[] =\n{\n  { NULL, kpidBit64, VT_BOOL},\n  { NULL, kpidComment, VT_BSTR}\n};\n\nCHandler::CHandler()\n{\n  InitMethodProperties();\n}\n\nstatic AString BytesToString(const CByteBuffer &data)\n{\n  AString s;\n  int size = (int)data.GetCapacity();\n  if (size > 0)\n  {\n    char *p = s.GetBuffer(size + 1);\n    memcpy(p, (const Byte *)data, size);\n    p[size] = '\\0';\n    s.ReleaseBuffer();\n  }\n  return s;\n}\n\nIMP_IInArchive_Props\nIMP_IInArchive_ArcProps\n\nSTDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidBit64:  if (m_Archive.IsZip64) prop = m_Archive.IsZip64; break;\n    case kpidComment:\n      prop = MultiByteToUnicodeString(BytesToString(m_Archive.m_ArchiveInfo.Comment), CP_ACP);\n      break;\n  }\n  prop.Detach(value);\n  COM_TRY_END\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = m_Items.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  const CItemEx &item = m_Items[index];\n  switch(propID)\n  {\n    case kpidPath:  prop = NItemName::GetOSName2(item.GetUnicodeString(item.Name)); break;\n    case kpidIsDir:  prop = item.IsDir(); break;\n    case kpidSize:  prop = item.UnPackSize; break;\n    case kpidPackSize:  prop = item.PackSize; break;\n    case kpidTimeType:\n    {\n      FILETIME utcFileTime;\n      if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kTagTime, utcFileTime))\n        prop = (UInt32)NFileTimeType::kWindows;\n      break;\n    }\n    case kpidCTime:\n    {\n      FILETIME ft;\n      if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kCTime, ft))\n        prop = ft;\n      break;\n    }\n    case kpidATime:\n    {\n      FILETIME ft;\n      if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kATime, ft))\n        prop = ft;\n      break;\n    }\n    case kpidMTime:\n    {\n      FILETIME utcFileTime;\n      if (!item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kMTime, utcFileTime))\n      {\n        FILETIME localFileTime;\n        if (NTime::DosTimeToFileTime(item.Time, localFileTime))\n        {\n          if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))\n            utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n        }\n        else\n          utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n      }\n      prop = utcFileTime;\n      break;\n    }\n    case kpidAttrib:  prop = item.GetWinAttributes(); break;\n    case kpidEncrypted:  prop = item.IsEncrypted(); break;\n    case kpidComment:  prop = item.GetUnicodeString(BytesToString(item.Comment)); break;\n    case kpidCRC:  if (item.IsThereCrc()) prop = item.FileCRC; break;\n    case kpidMethod:\n    {\n      UInt16 methodId = item.CompressionMethod;\n      UString method;\n      if (item.IsEncrypted())\n      {\n        if (methodId == NFileHeader::NCompressionMethod::kWzAES)\n        {\n          method = kAESMethod;\n          CWzAesExtraField aesField;\n          if (item.CentralExtra.GetWzAesField(aesField))\n          {\n            method += L\"-\";\n            wchar_t s[32];\n            ConvertUInt64ToString((aesField.Strength + 1) * 64 , s);\n            method += s;\n            method += L\" \";\n            methodId = aesField.Method;\n          }\n        }\n        else\n        {\n          if (item.IsStrongEncrypted())\n          {\n            CStrongCryptoField f;\n            bool finded = false;\n            if (item.CentralExtra.GetStrongCryptoField(f))\n            {\n              for (int i = 0; i < sizeof(g_StrongCryptoPairs) / sizeof(g_StrongCryptoPairs[0]); i++)\n              {\n                const CStrongCryptoPair &pair = g_StrongCryptoPairs[i];\n                if (f.AlgId == pair.Id)\n                {\n                  method += pair.Name;\n                  finded = true;\n                  break;\n                }\n              }\n            }\n            if (!finded)\n              method += kStrongCryptoMethod;\n          }\n          else\n            method += kZipCryptoMethod;\n          method += L\" \";\n        }\n      }\n      if (methodId < kNumMethods)\n        method += kMethods[methodId];\n      else switch (methodId)\n      {\n        case NFileHeader::NCompressionMethod::kLZMA:\n          method += kLZMAMethod;\n          if (item.IsLzmaEOS())\n            method += L\":EOS\";\n          break;\n        case NFileHeader::NCompressionMethod::kBZip2: method += kBZip2Method; break;\n        case NFileHeader::NCompressionMethod::kJpeg: method += kJpegMethod; break;\n        case NFileHeader::NCompressionMethod::kWavPack: method += kWavPackMethod; break;\n        case NFileHeader::NCompressionMethod::kPPMd: method += kPPMdMethod; break;\n        default:\n        {\n          wchar_t s[32];\n          ConvertUInt64ToString(methodId, s);\n          method += s;\n        }\n      }\n      prop = method;\n      break;\n    }\n    case kpidHostOS:\n      prop = (item.MadeByVersion.HostOS < kNumHostOSes) ?\n        (kHostOS[item.MadeByVersion.HostOS]) : kUnknownOS;\n      break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nclass CProgressImp: public CProgressVirt\n{\n  CMyComPtr<IArchiveOpenCallback> _callback;\npublic:\n  STDMETHOD(SetTotal)(UInt64 numFiles);\n  STDMETHOD(SetCompleted)(UInt64 numFiles);\n  CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {}\n};\n\nSTDMETHODIMP CProgressImp::SetTotal(UInt64 numFiles)\n{\n  if (_callback)\n    return _callback->SetTotal(&numFiles, NULL);\n  return S_OK;\n}\n\nSTDMETHODIMP CProgressImp::SetCompleted(UInt64 numFiles)\n{\n  if (_callback)\n    return _callback->SetCompleted(&numFiles, NULL);\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::Open(IInStream *inStream,\n    const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback)\n{\n  COM_TRY_BEGIN\n\n    Close();\n    RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));\n    RINOK(m_Archive.Open(inStream, maxCheckStartPosition));\n    CProgressImp progressImp(callback);\n    return m_Archive.ReadHeaders(m_Items, &progressImp);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CHandler::Close()\n{\n  m_Items.Clear();\n  m_Archive.Close();\n  return S_OK;\n}\n\n//////////////////////////////////////\n// CHandler::DecompressItems\n\nclass CLzmaDecoder:\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  NCompress::NLzma::CDecoder *DecoderSpec;\n  CMyComPtr<ICompressCoder> Decoder;\npublic:\n  CLzmaDecoder();\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  MY_UNKNOWN_IMP\n};\n\nCLzmaDecoder::CLzmaDecoder()\n{\n  DecoderSpec = new NCompress::NLzma::CDecoder;\n  Decoder = DecoderSpec;\n}\n\nHRESULT CLzmaDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  Byte buf[9];\n  RINOK(ReadStream_FALSE(inStream, buf, 9));\n  if (buf[2] != 5 || buf[3] != 0)\n    return E_NOTIMPL;\n  RINOK(DecoderSpec->SetDecoderProperties2(buf + 4, 5));\n  return Decoder->Code(inStream, outStream, NULL, outSize, progress);\n}\n\nstruct CMethodItem\n{\n  UInt16 ZipMethod;\n  CMyComPtr<ICompressCoder> Coder;\n};\n\nclass CZipDecoder\n{\n  NCrypto::NZip::CDecoder *_zipCryptoDecoderSpec;\n  NCrypto::NZipStrong::CDecoder *_pkAesDecoderSpec;\n  NCrypto::NWzAes::CDecoder *_wzAesDecoderSpec;\n\n  CMyComPtr<ICompressFilter> _zipCryptoDecoder;\n  CMyComPtr<ICompressFilter> _pkAesDecoder;\n  CMyComPtr<ICompressFilter> _wzAesDecoder;\n\n  CFilterCoder *filterStreamSpec;\n  CMyComPtr<ISequentialInStream> filterStream;\n  CMyComPtr<ICryptoGetTextPassword> getTextPassword;\n  CObjectVector<CMethodItem> methodItems;\n\npublic:\n  CZipDecoder():\n      _zipCryptoDecoderSpec(0),\n      _pkAesDecoderSpec(0),\n      _wzAesDecoderSpec(0),\n      filterStreamSpec(0) {}\n\n  HRESULT Decode(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    CInArchive &archive, const CItemEx &item,\n    ISequentialOutStream *realOutStream,\n    IArchiveExtractCallback *extractCallback,\n    ICompressProgressInfo *compressProgress,\n    UInt32 numThreads, Int32 &res);\n};\n\nHRESULT CZipDecoder::Decode(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    CInArchive &archive, const CItemEx &item,\n    ISequentialOutStream *realOutStream,\n    IArchiveExtractCallback *extractCallback,\n    ICompressProgressInfo *compressProgress,\n    UInt32 numThreads, Int32 &res)\n{\n  res = NArchive::NExtract::NOperationResult::kDataError;\n  CInStreamReleaser inStreamReleaser;\n\n  bool needCRC = true;\n  bool wzAesMode = false;\n  bool pkAesMode = false;\n  UInt16 methodId = item.CompressionMethod;\n  if (item.IsEncrypted())\n  {\n    if (item.IsStrongEncrypted())\n    {\n      CStrongCryptoField f;\n      if (item.CentralExtra.GetStrongCryptoField(f))\n      {\n        pkAesMode = true;\n      }\n      if (!pkAesMode)\n      {\n        res = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n        return S_OK;\n      }\n    }\n    if (methodId == NFileHeader::NCompressionMethod::kWzAES)\n    {\n      CWzAesExtraField aesField;\n      if (item.CentralExtra.GetWzAesField(aesField))\n      {\n        wzAesMode = true;\n        needCRC = aesField.NeedCrc();\n      }\n    }\n  }\n    \n  COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;\n  CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;\n  outStreamSpec->SetStream(realOutStream);\n  outStreamSpec->Init(needCRC);\n  \n  UInt64 authenticationPos;\n  \n  CMyComPtr<ISequentialInStream> inStream;\n  {\n    UInt64 packSize = item.PackSize;\n    if (wzAesMode)\n    {\n      if (packSize < NCrypto::NWzAes::kMacSize)\n        return S_OK;\n      packSize -= NCrypto::NWzAes::kMacSize;\n    }\n    UInt64 dataPos = item.GetDataPosition();\n    inStream.Attach(archive.CreateLimitedStream(dataPos, packSize));\n    authenticationPos = dataPos + packSize;\n  }\n  \n  CMyComPtr<ICompressFilter> cryptoFilter;\n  if (item.IsEncrypted())\n  {\n    if (wzAesMode)\n    {\n      CWzAesExtraField aesField;\n      if (!item.CentralExtra.GetWzAesField(aesField))\n        return S_OK;\n      methodId = aesField.Method;\n      if (!_wzAesDecoder)\n      {\n        _wzAesDecoderSpec = new NCrypto::NWzAes::CDecoder;\n        _wzAesDecoder = _wzAesDecoderSpec;\n      }\n      cryptoFilter = _wzAesDecoder;\n      Byte properties = aesField.Strength;\n      RINOK(_wzAesDecoderSpec->SetDecoderProperties2(&properties, 1));\n    }\n    else if (pkAesMode)\n    {\n      if (!_pkAesDecoder)\n      {\n        _pkAesDecoderSpec = new NCrypto::NZipStrong::CDecoder;\n        _pkAesDecoder = _pkAesDecoderSpec;\n      }\n      cryptoFilter = _pkAesDecoder;\n    }\n    else\n    {\n      if (!_zipCryptoDecoder)\n      {\n        _zipCryptoDecoderSpec = new NCrypto::NZip::CDecoder;\n        _zipCryptoDecoder = _zipCryptoDecoderSpec;\n      }\n      cryptoFilter = _zipCryptoDecoder;\n    }\n    CMyComPtr<ICryptoSetPassword> cryptoSetPassword;\n    RINOK(cryptoFilter.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword));\n    \n    if (!getTextPassword)\n      extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword);\n    \n    if (getTextPassword)\n    {\n      CMyComBSTR password;\n      RINOK(getTextPassword->CryptoGetTextPassword(&password));\n      AString charPassword;\n      if (wzAesMode || pkAesMode)\n      {\n        charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_ACP);\n        /*\n        for (int i = 0;; i++)\n        {\n          wchar_t c = password[i];\n          if (c == 0)\n            break;\n          if (c >= 0x80)\n          {\n            res = NArchive::NExtract::NOperationResult::kDataError;\n            return S_OK;\n          }\n          charPassword += (char)c;\n        }\n        */\n      }\n      else\n      {\n        // we use OEM. WinZip/Windows probably use ANSI for some files\n        charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP);\n      }\n      HRESULT result = cryptoSetPassword->CryptoSetPassword(\n        (const Byte *)(const char *)charPassword, charPassword.Length());\n      if (result != S_OK)\n        return S_OK;\n    }\n    else\n    {\n      RINOK(cryptoSetPassword->CryptoSetPassword(0, 0));\n    }\n  }\n  \n  int m;\n  for (m = 0; m < methodItems.Size(); m++)\n    if (methodItems[m].ZipMethod == methodId)\n      break;\n\n  if (m == methodItems.Size())\n  {\n    CMethodItem mi;\n    mi.ZipMethod = methodId;\n    if (methodId == NFileHeader::NCompressionMethod::kStored)\n      mi.Coder = new NCompress::CCopyCoder;\n    else if (methodId == NFileHeader::NCompressionMethod::kShrunk)\n      mi.Coder = new NCompress::NShrink::CDecoder;\n    else if (methodId == NFileHeader::NCompressionMethod::kImploded)\n      mi.Coder = new NCompress::NImplode::NDecoder::CCoder;\n    else if (methodId == NFileHeader::NCompressionMethod::kLZMA)\n      mi.Coder = new CLzmaDecoder;\n    else\n    {\n      CMethodId szMethodID;\n      if (methodId == NFileHeader::NCompressionMethod::kBZip2)\n        szMethodID = kMethodId_BZip2;\n      else\n      {\n        if (methodId > 0xFF)\n        {\n          res = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n          return S_OK;\n        }\n        szMethodID = kMethodId_ZipBase + (Byte)methodId;\n      }\n\n      RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS szMethodID, mi.Coder, false));\n\n      if (mi.Coder == 0)\n      {\n        res = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n        return S_OK;\n      }\n    }\n    m = methodItems.Add(mi);\n  }\n  ICompressCoder *coder = methodItems[m].Coder;\n  \n  {\n    CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;\n    coder->QueryInterface(IID_ICompressSetDecoderProperties2, (void **)&setDecoderProperties);\n    if (setDecoderProperties)\n    {\n      Byte properties = (Byte)item.Flags;\n      RINOK(setDecoderProperties->SetDecoderProperties2(&properties, 1));\n    }\n  }\n  \n  #ifdef COMPRESS_MT\n  {\n    CMyComPtr<ICompressSetCoderMt> setCoderMt;\n    coder->QueryInterface(IID_ICompressSetCoderMt, (void **)&setCoderMt);\n    if (setCoderMt)\n    {\n      RINOK(setCoderMt->SetNumberOfThreads(numThreads));\n    }\n  }\n  #endif\n  \n  {\n    HRESULT result = S_OK;\n    CMyComPtr<ISequentialInStream> inStreamNew;\n    if (item.IsEncrypted())\n    {\n      if (!filterStream)\n      {\n        filterStreamSpec = new CFilterCoder;\n        filterStream = filterStreamSpec;\n      }\n      filterStreamSpec->Filter = cryptoFilter;\n      if (wzAesMode)\n      {\n        result = _wzAesDecoderSpec->ReadHeader(inStream);\n      }\n      else if (pkAesMode)\n      {\n        result =_pkAesDecoderSpec->ReadHeader(inStream, item.FileCRC, item.UnPackSize);\n        if (result == S_OK)\n        {\n          bool passwOK;\n          result = _pkAesDecoderSpec->CheckPassword(passwOK);\n          if (result == S_OK && !passwOK)\n            result = S_FALSE;\n        }\n      }\n      else\n      {\n        result = _zipCryptoDecoderSpec->ReadHeader(inStream);\n      }\n\n      if (result == S_OK)\n      {\n        RINOK(filterStreamSpec->SetInStream(inStream));\n        inStreamReleaser.FilterCoder = filterStreamSpec;\n        inStreamNew = filterStream;\n        if (wzAesMode)\n        {\n          if (!_wzAesDecoderSpec->CheckPasswordVerifyCode())\n            result = S_FALSE;\n        }\n      }\n    }\n    else\n      inStreamNew = inStream;\n    if (result == S_OK)\n      result = coder->Code(inStreamNew, outStream, NULL, &item.UnPackSize, compressProgress);\n    if (result == S_FALSE)\n      return S_OK;\n    if (result == E_NOTIMPL)\n    {\n      res = NArchive::NExtract::NOperationResult::kUnSupportedMethod;\n      return S_OK;\n    }\n\n    RINOK(result);\n  }\n  bool crcOK = true;\n  bool authOk = true;\n  if (needCRC)\n    crcOK = (outStreamSpec->GetCRC() == item.FileCRC);\n  if (wzAesMode)\n  {\n    inStream.Attach(archive.CreateLimitedStream(authenticationPos, NCrypto::NWzAes::kMacSize));\n    if (_wzAesDecoderSpec->CheckMac(inStream, authOk) != S_OK)\n      authOk = false;\n  }\n  \n  res = ((crcOK && authOk) ?\n    NArchive::NExtract::NOperationResult::kOK :\n    NArchive::NExtract::NOperationResult::kCRCError);\n  return S_OK;\n}\n\n\nSTDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,\n    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)\n{\n  COM_TRY_BEGIN\n  CZipDecoder myDecoder;\n  bool testMode = (_aTestMode != 0);\n  UInt64 totalUnPacked = 0, totalPacked = 0;\n  bool allFilesMode = (numItems == UInt32(-1));\n  if (allFilesMode)\n    numItems = m_Items.Size();\n  if(numItems == 0)\n    return S_OK;\n  UInt32 i;\n  for(i = 0; i < numItems; i++)\n  {\n    const CItemEx &item = m_Items[allFilesMode ? i : indices[i]];\n    totalUnPacked += item.UnPackSize;\n    totalPacked += item.PackSize;\n  }\n  RINOK(extractCallback->SetTotal(totalUnPacked));\n\n  UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0;\n  UInt64 currentItemUnPacked, currentItemPacked;\n  \n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(extractCallback, false);\n\n  for (i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked,\n      currentTotalPacked += currentItemPacked)\n  {\n    currentItemUnPacked = 0;\n    currentItemPacked = 0;\n\n    lps->InSize = currentTotalPacked;\n    lps->OutSize = currentTotalUnPacked;\n    RINOK(lps->SetCur());\n\n    CMyComPtr<ISequentialOutStream> realOutStream;\n    Int32 askMode = testMode ?\n        NArchive::NExtract::NAskMode::kTest :\n        NArchive::NExtract::NAskMode::kExtract;\n    Int32 index = allFilesMode ? i : indices[i];\n\n    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));\n\n    CItemEx item = m_Items[index];\n    if (!item.FromLocal)\n    {\n      HRESULT res = m_Archive.ReadLocalItemAfterCdItem(item);\n      if (res == S_FALSE)\n      {\n        if (item.IsDir() || realOutStream || testMode)\n        {\n          RINOK(extractCallback->PrepareOperation(askMode));\n          realOutStream.Release();\n          RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kUnSupportedMethod));\n        }\n        continue;\n      }\n      RINOK(res);\n    }\n\n    if (item.IsDir() || item.IgnoreItem())\n    {\n      // if (!testMode)\n      {\n        RINOK(extractCallback->PrepareOperation(askMode));\n        realOutStream.Release();\n        RINOK(extractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));\n      }\n      continue;\n    }\n\n    currentItemUnPacked = item.UnPackSize;\n    currentItemPacked = item.PackSize;\n\n    if (!testMode && (!realOutStream))\n      continue;\n\n    RINOK(extractCallback->PrepareOperation(askMode));\n\n    Int32 res;\n    RINOK(myDecoder.Decode(\n        EXTERNAL_CODECS_VARS\n        m_Archive, item, realOutStream, extractCallback,\n        progress, _numThreads, res));\n    realOutStream.Release();\n    \n    RINOK(extractCallback->SetOperationResult(res))\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nIMPL_ISetCompressCodecsInfo\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipHandler.h",
    "content": "// Zip/Handler.h\n\n#ifndef __ZIP_HANDLER_H\n#define __ZIP_HANDLER_H\n\n#include \"Common/DynamicBuffer.h\"\n#include \"../../ICoder.h\"\n#include \"../IArchive.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\n#include \"ZipIn.h\"\n#include \"ZipCompressionMode.h\"\n\n#ifdef COMPRESS_MT\n#include \"../../../Windows/System.h\"\n#endif\n\nnamespace NArchive {\nnamespace NZip {\n\nclass CHandler:\n  public IInArchive,\n  public IOutArchive,\n  public ISetProperties,\n  PUBLIC_ISetCompressCodecsInfo\n  public CMyUnknownImp\n{\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IInArchive)\n  MY_QUERYINTERFACE_ENTRY(IOutArchive)\n  MY_QUERYINTERFACE_ENTRY(ISetProperties)\n  QUERY_ENTRY_ISetCompressCodecsInfo\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  INTERFACE_IInArchive(;)\n  INTERFACE_IOutArchive(;)\n\n  STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties);\n\n  DECL_ISetCompressCodecsInfo\n\n  CHandler();\nprivate:\n  CObjectVector<CItemEx> m_Items;\n  CInArchive m_Archive;\n\n  int m_Level;\n  int m_MainMethod;\n  UInt32 m_DicSize;\n  UInt32 m_Algo;\n  UInt32 m_NumPasses;\n  UInt32 m_NumFastBytes;\n  UInt32 m_NumMatchFinderCycles;\n  bool m_NumMatchFinderCyclesDefined;\n\n  bool m_ForceAesMode;\n  bool m_IsAesMode;\n  Byte m_AesKeyMode;\n\n  bool m_WriteNtfsTimeExtra;\n  bool m_ForseLocal;\n  bool m_ForseUtf8;\n\n  #ifdef COMPRESS_MT\n  UInt32 _numThreads;\n  #endif\n\n  DECL_EXTERNAL_CODECS_VARS\n\n  void InitMethodProperties()\n  {\n    m_Level = -1;\n    m_MainMethod = -1;\n    m_Algo =\n    m_DicSize =\n    m_NumPasses =\n    m_NumFastBytes =\n    m_NumMatchFinderCycles = 0xFFFFFFFF;\n    m_NumMatchFinderCyclesDefined = false;\n    m_ForceAesMode = false;\n    m_IsAesMode = false;\n    m_AesKeyMode = 3; // aes-256\n    m_WriteNtfsTimeExtra = false;\n    m_ForseLocal = false;\n    m_ForseUtf8 = false;\n    #ifdef COMPRESS_MT\n    _numThreads = NWindows::NSystem::GetNumberOfProcessors();;\n    #endif\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp",
    "content": "// ZipHandlerOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/StringToInt.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../IPassword.h\"\n\n#include \"../../Common/OutBuffer.h\"\n\n#include \"../../Crypto/WzAes.h\"\n\n#include \"../Common/ItemNameUtils.h\"\n#include \"../Common/ParseProperties.h\"\n\n#include \"ZipHandler.h\"\n#include \"ZipUpdate.h\"\n\nusing namespace NWindows;\nusing namespace NCOM;\nusing namespace NTime;\n\nnamespace NArchive {\nnamespace NZip {\n\nstatic const UInt32 kLzAlgoX1 = 0;\nstatic const UInt32 kLzAlgoX5 = 1;\n\nstatic const UInt32 kDeflateNumPassesX1  = 1;\nstatic const UInt32 kDeflateNumPassesX7  = 3;\nstatic const UInt32 kDeflateNumPassesX9  = 10;\n\nstatic const UInt32 kDeflateNumFastBytesX1 = 32;\nstatic const UInt32 kDeflateNumFastBytesX7 = 64;\nstatic const UInt32 kDeflateNumFastBytesX9 = 128;\n\nstatic const wchar_t *kLzmaMatchFinderX1 = L\"HC4\";\nstatic const wchar_t *kLzmaMatchFinderX5 = L\"BT4\";\n\nstatic const UInt32 kLzmaNumFastBytesX1 = 32;\nstatic const UInt32 kLzmaNumFastBytesX7 = 64;\n\nstatic const UInt32 kLzmaDicSizeX1 = 1 << 16;\nstatic const UInt32 kLzmaDicSizeX3 = 1 << 20;\nstatic const UInt32 kLzmaDicSizeX5 = 1 << 24;\nstatic const UInt32 kLzmaDicSizeX7 = 1 << 25;\nstatic const UInt32 kLzmaDicSizeX9 = 1 << 26;\n\nstatic const UInt32 kBZip2NumPassesX1 = 1;\nstatic const UInt32 kBZip2NumPassesX7 = 2;\nstatic const UInt32 kBZip2NumPassesX9 = 7;\n\nstatic const UInt32 kBZip2DicSizeX1 = 100000;\nstatic const UInt32 kBZip2DicSizeX3 = 500000;\nstatic const UInt32 kBZip2DicSizeX5 = 900000;\n\nSTDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)\n{\n  *timeType = NFileTimeType::kDOS;\n  return S_OK;\n}\n\nstatic bool IsAsciiString(const UString &s)\n{\n  for (int i = 0; i < s.Length(); i++)\n  {\n    wchar_t c = s[i];\n    if (c < 0x20 || c > 0x7F)\n      return false;\n  }\n  return true;\n}\n\n#define COM_TRY_BEGIN2 {\n#define COM_TRY_END2 }\n\n\nstatic HRESULT GetTime(IArchiveUpdateCallback *callback, int index, PROPID propID, FILETIME &filetime)\n{\n  filetime.dwHighDateTime = filetime.dwLowDateTime = 0;\n  NCOM::CPropVariant prop;\n  RINOK(callback->GetProperty(index, propID, &prop));\n  if (prop.vt == VT_FILETIME)\n    filetime = prop.filetime;\n  else if (prop.vt != VT_EMPTY)\n    return E_INVALIDARG;\n  return S_OK;\n}\n\nSTDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,\n    IArchiveUpdateCallback *callback)\n{\n  COM_TRY_BEGIN2\n  CObjectVector<CUpdateItem> updateItems;\n  bool thereAreAesUpdates = false;\n  for (UInt32 i = 0; i < numItems; i++)\n  {\n    CUpdateItem ui;\n    Int32 newData;\n    Int32 newProperties;\n    UInt32 indexInArchive;\n    if (!callback)\n      return E_FAIL;\n    RINOK(callback->GetUpdateItemInfo(i, &newData, &newProperties, &indexInArchive));\n    ui.NewProperties = IntToBool(newProperties);\n    ui.NewData = IntToBool(newData);\n    ui.IndexInArchive = indexInArchive;\n    ui.IndexInClient = i;\n    bool existInArchive = (indexInArchive != UInt32(-1));\n    if (existInArchive && newData)\n      if (m_Items[indexInArchive].IsAesEncrypted())\n        thereAreAesUpdates = true;\n\n    if (IntToBool(newProperties))\n    {\n      UString name;\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidAttrib, &prop));\n        if (prop.vt == VT_EMPTY)\n          ui.Attributes = 0;\n        else if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        else\n          ui.Attributes = prop.ulVal;\n      }\n\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidPath, &prop));\n        if (prop.vt == VT_EMPTY)\n          name.Empty();\n        else if (prop.vt != VT_BSTR)\n          return E_INVALIDARG;\n        else\n          name = prop.bstrVal;\n      }\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidIsDir, &prop));\n        if (prop.vt == VT_EMPTY)\n          ui.IsDir = false;\n        else if (prop.vt != VT_BOOL)\n          return E_INVALIDARG;\n        else\n          ui.IsDir = (prop.boolVal != VARIANT_FALSE);\n      }\n\n      {\n        CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidTimeType, &prop));\n        if (prop.vt == VT_UI4)\n          ui.NtfsTimeIsDefined = (prop.ulVal == NFileTimeType::kWindows);\n        else\n          ui.NtfsTimeIsDefined = m_WriteNtfsTimeExtra;\n      }\n      RINOK(GetTime(callback, i, kpidMTime, ui.NtfsMTime));\n      RINOK(GetTime(callback, i, kpidATime, ui.NtfsATime));\n      RINOK(GetTime(callback, i, kpidCTime, ui.NtfsCTime));\n\n      {\n        FILETIME localFileTime = { 0, 0 };\n        if (ui.NtfsMTime.dwHighDateTime != 0 ||\n            ui.NtfsMTime.dwLowDateTime != 0)\n          if (!FileTimeToLocalFileTime(&ui.NtfsMTime, &localFileTime))\n            return E_INVALIDARG;\n        FileTimeToDosTime(localFileTime, ui.Time);\n      }\n\n      name = NItemName::MakeLegalName(name);\n      bool needSlash = ui.IsDir;\n      const wchar_t kSlash = L'/';\n      if (!name.IsEmpty())\n      {\n        if (name[name.Length() - 1] == kSlash)\n        {\n          if (!ui.IsDir)\n            return E_INVALIDARG;\n          needSlash = false;\n        }\n      }\n      if (needSlash)\n        name += kSlash;\n\n      bool tryUtf8 = true;\n      if (m_ForseLocal || !m_ForseUtf8)\n      {\n#ifdef _WIN32\n        bool defaultCharWasUsed;\n        ui.Name = UnicodeStringToMultiByte(name, CP_OEMCP, '_', defaultCharWasUsed);\n        tryUtf8 = (!m_ForseLocal && (defaultCharWasUsed ||\n          MultiByteToUnicodeString(ui.Name, CP_OEMCP) != name));\n#else\n\t// FIXME\n        ui.Name = UnicodeStringToMultiByte(name, CP_OEMCP);\n        tryUtf8 = (!m_ForseLocal);\n#endif\n      }\n\n      if (tryUtf8)\n      {\n        int i;\n        for (i = 0; i < name.Length() && (unsigned)name[i] < 0x80; i++);\n        ui.IsUtf8 = (i != name.Length());\n        if (!ConvertUnicodeToUTF8(name, ui.Name))\n          return E_INVALIDARG;\n      }\n\n      if (ui.Name.Length() >= (1 << 16))\n        return E_INVALIDARG;\n\n      ui.IndexInClient = i;\n      /*\n      if (existInArchive)\n      {\n        const CItemEx &itemInfo = m_Items[indexInArchive];\n        // ui.Commented = itemInfo.IsCommented();\n        ui.Commented = false;\n        if (ui.Commented)\n        {\n          ui.CommentRange.Position = itemInfo.GetCommentPosition();\n          ui.CommentRange.Size  = itemInfo.CommentSize;\n        }\n      }\n      else\n        ui.Commented = false;\n      */\n    }\n    if (IntToBool(newData))\n    {\n      UInt64 size;\n      {\n        NCOM::CPropVariant prop;\n        RINOK(callback->GetProperty(i, kpidSize, &prop));\n        if (prop.vt != VT_UI8)\n          return E_INVALIDARG;\n        size = prop.uhVal.QuadPart;\n      }\n      ui.Size = size;\n    }\n    updateItems.Add(ui);\n  }\n\n  CMyComPtr<ICryptoGetTextPassword2> getTextPassword;\n  {\n    CMyComPtr<IArchiveUpdateCallback> udateCallBack2(callback);\n    udateCallBack2.QueryInterface(IID_ICryptoGetTextPassword2, &getTextPassword);\n  }\n  CCompressionMethodMode options;\n\n  if (getTextPassword)\n  {\n    CMyComBSTR password;\n    Int32 passwordIsDefined;\n    RINOK(getTextPassword->CryptoGetTextPassword2(&passwordIsDefined, &password));\n    options.PasswordIsDefined = IntToBool(passwordIsDefined);\n    if (options.PasswordIsDefined)\n    {\n      options.IsAesMode = (m_ForceAesMode ? m_IsAesMode : thereAreAesUpdates);\n      options.AesKeyMode = m_AesKeyMode;\n\n      if (!IsAsciiString((const wchar_t *)password))\n        return E_INVALIDARG;\n      if (options.IsAesMode)\n      {\n        if (options.Password.Length() > NCrypto::NWzAes::kPasswordSizeMax)\n          return E_INVALIDARG;\n      }\n      options.Password = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP);\n    }\n  }\n  else\n    options.PasswordIsDefined = false;\n\n  int level = m_Level;\n  if (level < 0)\n    level = 5;\n  \n  Byte mainMethod;\n  if (m_MainMethod < 0)\n    mainMethod = (Byte)(((level == 0) ?\n        NFileHeader::NCompressionMethod::kStored :\n        NFileHeader::NCompressionMethod::kDeflated));\n  else\n    mainMethod = (Byte)m_MainMethod;\n  options.MethodSequence.Add(mainMethod);\n  if (mainMethod != NFileHeader::NCompressionMethod::kStored)\n    options.MethodSequence.Add(NFileHeader::NCompressionMethod::kStored);\n  bool isDeflate = (mainMethod == NFileHeader::NCompressionMethod::kDeflated) ||\n      (mainMethod == NFileHeader::NCompressionMethod::kDeflated64);\n  bool isLZMA = (mainMethod == NFileHeader::NCompressionMethod::kLZMA);\n  bool isLz = (isLZMA || isDeflate);\n  bool isBZip2 = (mainMethod == NFileHeader::NCompressionMethod::kBZip2);\n  options.NumPasses = m_NumPasses;\n  options.DicSize = m_DicSize;\n  options.NumFastBytes = m_NumFastBytes;\n  options.NumMatchFinderCycles = m_NumMatchFinderCycles;\n  options.NumMatchFinderCyclesDefined = m_NumMatchFinderCyclesDefined;\n  options.Algo = m_Algo;\n  #ifdef COMPRESS_MT\n  options.NumThreads = _numThreads;\n  #endif\n  if (isLz)\n  {\n    if (isDeflate)\n    {\n      if (options.NumPasses == 0xFFFFFFFF)\n        options.NumPasses = (level >= 9 ? kDeflateNumPassesX9 :\n                            (level >= 7 ? kDeflateNumPassesX7 :\n                                          kDeflateNumPassesX1));\n      if (options.NumFastBytes == 0xFFFFFFFF)\n        options.NumFastBytes = (level >= 9 ? kDeflateNumFastBytesX9 :\n                               (level >= 7 ? kDeflateNumFastBytesX7 :\n                                             kDeflateNumFastBytesX1));\n    }\n    else if (isLZMA)\n    {\n      if (options.DicSize == 0xFFFFFFFF)\n        options.DicSize =\n          (level >= 9 ? kLzmaDicSizeX9 :\n          (level >= 7 ? kLzmaDicSizeX7 :\n          (level >= 5 ? kLzmaDicSizeX5 :\n          (level >= 3 ? kLzmaDicSizeX3 :\n                        kLzmaDicSizeX1))));\n\n      if (options.NumFastBytes == 0xFFFFFFFF)\n        options.NumFastBytes = (level >= 7 ? kLzmaNumFastBytesX7 :\n                                             kLzmaNumFastBytesX1);\n\n      options.MatchFinder =\n        (level >= 5 ? kLzmaMatchFinderX5 :\n                      kLzmaMatchFinderX1);\n    }\n\n    if (options.Algo == 0xFFFFFFFF)\n        options.Algo = (level >= 5 ? kLzAlgoX5 :\n                                     kLzAlgoX1);\n  }\n  if (isBZip2)\n  {\n    if (options.NumPasses == 0xFFFFFFFF)\n      options.NumPasses = (level >= 9 ? kBZip2NumPassesX9 :\n                          (level >= 7 ? kBZip2NumPassesX7 :\n                                        kBZip2NumPassesX1));\n    if (options.DicSize == 0xFFFFFFFF)\n      options.DicSize = (level >= 5 ? kBZip2DicSizeX5 :\n                        (level >= 3 ? kBZip2DicSizeX3 :\n                                      kBZip2DicSizeX1));\n  }\n\n  return Update(\n      EXTERNAL_CODECS_VARS\n      m_Items, updateItems, outStream,\n      m_Archive.IsOpen() ? &m_Archive : NULL, &options, callback);\n  COM_TRY_END2\n}\n\nSTDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)\n{\n  #ifdef COMPRESS_MT\n  const UInt32 numProcessors = NSystem::GetNumberOfProcessors();\n  _numThreads = numProcessors;\n  #endif\n  InitMethodProperties();\n  for (int i = 0; i < numProperties; i++)\n  {\n    UString name = UString(names[i]);\n    name.MakeUpper();\n    if (name.IsEmpty())\n      return E_INVALIDARG;\n\n    const PROPVARIANT &prop = values[i];\n\n    if (name[0] == L'X')\n    {\n      UInt32 level = 9;\n      RINOK(ParsePropValue(name.Mid(1), prop, level));\n      m_Level = level;\n      continue;\n    }\n    else if (name == L\"M\")\n    {\n      if (prop.vt == VT_BSTR)\n      {\n        UString m = prop.bstrVal;\n        m.MakeUpper();\n        if (m == L\"COPY\") m_MainMethod = NFileHeader::NCompressionMethod::kStored;\n        else if (m == L\"DEFLATE\") m_MainMethod = NFileHeader::NCompressionMethod::kDeflated;\n        else if (m == L\"DEFLATE64\") m_MainMethod = NFileHeader::NCompressionMethod::kDeflated64;\n        else if (m == L\"BZIP2\") m_MainMethod = NFileHeader::NCompressionMethod::kBZip2;\n        else if (m == L\"LZMA\") m_MainMethod = NFileHeader::NCompressionMethod::kLZMA;\n        else return E_INVALIDARG;\n      }\n      else if (prop.vt == VT_UI4)\n      {\n        switch(prop.ulVal)\n        {\n          case NFileHeader::NCompressionMethod::kStored:\n          case NFileHeader::NCompressionMethod::kDeflated:\n          case NFileHeader::NCompressionMethod::kDeflated64:\n          case NFileHeader::NCompressionMethod::kBZip2:\n          case NFileHeader::NCompressionMethod::kLZMA:\n            m_MainMethod = (Byte)prop.ulVal;\n            break;\n          default:\n            return E_INVALIDARG;\n        }\n      }\n      else\n        return E_INVALIDARG;\n    }\n    else if (name.Left(2) == L\"EM\")\n    {\n      if (prop.vt == VT_BSTR)\n      {\n        UString valueString = prop.bstrVal;\n        valueString.MakeUpper();\n        if (valueString.Left(3) == L\"AES\")\n        {\n          valueString = valueString.Mid(3);\n          if (valueString == L\"128\")\n            m_AesKeyMode = 1;\n          else if (valueString == L\"192\")\n            m_AesKeyMode = 2;\n          else if (valueString == L\"256\" || valueString.IsEmpty())\n            m_AesKeyMode = 3;\n          else\n            return E_INVALIDARG;\n          m_IsAesMode = true;\n          m_ForceAesMode = true;\n        }\n        else if (valueString == L\"ZIPCRYPTO\")\n        {\n          m_IsAesMode = false;\n          m_ForceAesMode = true;\n        }\n        else\n          return E_INVALIDARG;\n      }\n      else\n        return E_INVALIDARG;\n    }\n    else if (name[0] == L'D')\n    {\n      UInt32 dicSize = kBZip2DicSizeX5;\n      RINOK(ParsePropDictionaryValue(name.Mid(1), prop, dicSize));\n      m_DicSize = dicSize;\n    }\n    else if (name.Left(4) == L\"PASS\")\n    {\n      UInt32 num = kDeflateNumPassesX9;\n      RINOK(ParsePropValue(name.Mid(4), prop, num));\n      m_NumPasses = num;\n    }\n    else if (name.Left(2) == L\"FB\")\n    {\n      UInt32 num = kDeflateNumFastBytesX9;\n      RINOK(ParsePropValue(name.Mid(2), prop, num));\n      m_NumFastBytes = num;\n    }\n    else if (name.Left(2) == L\"MC\")\n    {\n      UInt32 num = 0xFFFFFFFF;\n      RINOK(ParsePropValue(name.Mid(2), prop, num));\n      m_NumMatchFinderCycles = num;\n      m_NumMatchFinderCyclesDefined = true;\n    }\n    else if (name.Left(2) == L\"MT\")\n    {\n      #ifdef COMPRESS_MT\n      RINOK(ParseMtProp(name.Mid(2), prop, numProcessors, _numThreads));\n      #endif\n    }\n    else if (name.Left(1) == L\"A\")\n    {\n      UInt32 num = kLzAlgoX5;\n      RINOK(ParsePropValue(name.Mid(1), prop, num));\n      m_Algo = num;\n    }\n    else if (name.CompareNoCase(L\"TC\") == 0)\n    {\n      RINOK(SetBoolProperty(m_WriteNtfsTimeExtra, prop));\n    }\n    else if (name.CompareNoCase(L\"CL\") == 0)\n    {\n      RINOK(SetBoolProperty(m_ForseLocal, prop));\n      if (m_ForseLocal)\n        m_ForseUtf8 = false;\n    }\n    else if (name.CompareNoCase(L\"CU\") == 0)\n    {\n      RINOK(SetBoolProperty(m_ForseUtf8, prop));\n      if (m_ForseUtf8)\n        m_ForseLocal = false;\n    }\n    else\n      return E_INVALIDARG;\n  }\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipHeader.cpp",
    "content": "// Archive/Zip/Header.h\n\n#include \"StdAfx.h\"\n\n#include \"ZipHeader.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nnamespace NSignature\n{\n  UInt32 kLocalFileHeader   = 0x04034B50 + 1;\n  UInt32 kDataDescriptor    = 0x08074B50 + 1;\n  UInt32 kCentralFileHeader = 0x02014B50 + 1;\n  UInt32 kEndOfCentralDir   = 0x06054B50 + 1;\n  UInt32 kZip64EndOfCentralDir   = 0x06064B50 + 1;\n  UInt32 kZip64EndOfCentralDirLocator   = 0x07064B50 + 1;\n  \n  class CMarkersInitializer\n  {\n  public:\n    CMarkersInitializer()\n    {\n      kLocalFileHeader--;\n      kDataDescriptor--;\n      kCentralFileHeader--;\n      kEndOfCentralDir--;\n      kZip64EndOfCentralDir--;\n      kZip64EndOfCentralDirLocator--;\n    }\n  };\n  static CMarkersInitializer g_MarkerInitializer;\n}\n\n}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipHeader.h",
    "content": "// Archive/Zip/Header.h\n\n#ifndef __ARCHIVE_ZIP_HEADER_H\n#define __ARCHIVE_ZIP_HEADER_H\n\n#include \"Common/Types.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nnamespace NSignature\n{\n  extern UInt32 kLocalFileHeader;\n  extern UInt32 kDataDescriptor;\n  extern UInt32 kCentralFileHeader;\n  extern UInt32 kEndOfCentralDir;\n  extern UInt32 kZip64EndOfCentralDir;\n  extern UInt32 kZip64EndOfCentralDirLocator;\n  \n  static const UInt32 kMarkerSize = 4;\n}\n\nconst UInt32 kEcdSize = 22;\nconst UInt32 kZip64EcdSize = 44;\nconst UInt32 kZip64EcdLocatorSize = 20;\n/*\nstruct CEndOfCentralDirectoryRecord\n{\n  UInt16 ThisDiskNumber;\n  UInt16 StartCentralDirectoryDiskNumber;\n  UInt16 NumEntriesInCentaralDirectoryOnThisDisk;\n  UInt16 NumEntriesInCentaralDirectory;\n  UInt32 CentralDirectorySize;\n  UInt32 CentralDirectoryStartOffset;\n  UInt16 CommentSize;\n};\n\nstruct CEndOfCentralDirectoryRecordFull\n{\n  UInt32 Signature;\n  CEndOfCentralDirectoryRecord Header;\n};\n*/\n\nnamespace NFileHeader\n{\n  /*\n  struct CVersion\n  {\n    Byte Version;\n    Byte HostOS;\n  };\n  */\n  \n  namespace NCompressionMethod\n  {\n    enum EType\n    {\n      kStored = 0,\n      kShrunk = 1,\n      kReduced1 = 2,\n      kReduced2 = 3,\n      kReduced3 = 4,\n      kReduced4 = 5,\n      kImploded = 6,\n      kReservedTokenizing = 7, // reserved for tokenizing\n      kDeflated = 8,\n      kDeflated64 = 9,\n      kPKImploding = 10,\n      \n      kBZip2 = 12,\n      kLZMA = 14,\n      kTerse = 18,\n      kLz77 = 19,\n      kJpeg = 0x60,\n      kWavPack = 0x61,\n      kPPMd = 0x62,\n      kWzAES = 0x63\n    };\n    const int kNumCompressionMethods = 11;\n    const Byte kMadeByProgramVersion = 20;\n    \n    const Byte kDeflateExtractVersion = 20;\n    const Byte kStoreExtractVersion = 10;\n    \n    const Byte kSupportedVersion   = 20;\n  }\n\n  namespace NExtraID\n  {\n    enum\n    {\n      kZip64 = 0x01,\n      kNTFS = 0x0A,\n      kStrongEncrypt = 0x17,\n      kWzAES = 0x9901\n    };\n  }\n\n  namespace NNtfsExtra\n  {\n    const UInt16 kTagTime = 1;\n    enum\n    {\n      kMTime = 0,\n      kATime = 1,\n      kCTime = 2\n    };\n  }\n\n  const UInt32 kLocalBlockSize = 26;\n  /*\n  struct CLocalBlock\n  {\n    CVersion ExtractVersion;\n    \n    UInt16 Flags;\n    UInt16 CompressionMethod;\n    UInt32 Time;\n    UInt32 FileCRC;\n    UInt32 PackSize;\n    UInt32 UnPackSize;\n    UInt16 NameSize;\n    UInt16 ExtraSize;\n  };\n  */\n\n  const UInt32 kDataDescriptorSize = 16;\n  // const UInt32 kDataDescriptor64Size = 16 + 8;\n  /*\n  struct CDataDescriptor\n  {\n    UInt32 Signature;\n    UInt32 FileCRC;\n    UInt32 PackSize;\n    UInt32 UnPackSize;\n  };\n\n  struct CLocalBlockFull\n  {\n    UInt32 Signature;\n    CLocalBlock Header;\n  };\n  */\n  \n  const UInt32 kCentralBlockSize = 42;\n  /*\n  struct CBlock\n  {\n    CVersion MadeByVersion;\n    CVersion ExtractVersion;\n    UInt16 Flags;\n    UInt16 CompressionMethod;\n    UInt32 Time;\n    UInt32 FileCRC;\n    UInt32 PackSize;\n    UInt32 UnPackSize;\n    UInt16 NameSize;\n    UInt16 ExtraSize;\n    UInt16 CommentSize;\n    UInt16 DiskNumberStart;\n    UInt16 InternalAttributes;\n    UInt32 ExternalAttributes;\n    UInt32 LocalHeaderOffset;\n  };\n  \n  struct CBlockFull\n  {\n    UInt32 Signature;\n    CBlock Header;\n  };\n  */\n\n  namespace NFlags\n  {\n    const int kEncrypted = 1 << 0;\n    const int kLzmaEOS = 1 << 1;\n    const int kDescriptorUsedMask = 1 << 3;\n    const int kStrongEncrypted = 1 << 6;\n    const int kUtf8 = 1 << 11;\n\n    const int kImplodeDictionarySizeMask = 1 << 1;\n    const int kImplodeLiteralsOnMask     = 1 << 2;\n    \n    const int kDeflateTypeBitStart = 1;\n    const int kNumDeflateTypeBits = 2;\n    const int kNumDeflateTypes = (1 << kNumDeflateTypeBits);\n    const int kDeflateTypeMask = (1 << kNumDeflateTypeBits) - 1;\n  }\n  \n  namespace NHostOS\n  {\n    enum EEnum\n    {\n        kFAT      = 0,\n        kAMIGA    = 1,\n        kVMS      = 2,  // VAX/VMS\n        kUnix     = 3,\n        kVM_CMS   = 4,\n        kAtari    = 5,  // what if it's a minix filesystem? [cjh]\n        kHPFS     = 6,  // filesystem used by OS/2 (and NT 3.x)\n        kMac      = 7,\n        kZ_System = 8,\n        kCPM      = 9,\n        kTOPS20   = 10, // pkzip 2.50 NTFS\n        kNTFS     = 11, // filesystem used by Windows NT\n        kQDOS     = 12, // SMS/QDOS\n        kAcorn    = 13, // Archimedes Acorn RISC OS\n        kVFAT     = 14, // filesystem used by Windows 95, NT\n        kMVS      = 15,\n        kBeOS     = 16, // hybrid POSIX/database filesystem\n        kTandem   = 17,\n        kOS400    = 18,\n        kOSX      = 19\n    };\n  }\n  namespace NUnixAttribute\n  {\n    const UInt32 kIFMT   =   0170000;     /* Unix file type mask */\n    \n    const UInt32 kIFDIR  =   0040000;     /* Unix directory */\n    const UInt32 kIFREG  =   0100000;     /* Unix regular file */\n    const UInt32 kIFSOCK =   0140000;     /* Unix socket (BSD, not SysV or Amiga) */\n    const UInt32 kIFLNK  =   0120000;     /* Unix symbolic link (not SysV, Amiga) */\n    const UInt32 kIFBLK  =   0060000;     /* Unix block special       (not Amiga) */\n    const UInt32 kIFCHR  =   0020000;     /* Unix character special   (not Amiga) */\n    const UInt32 kIFIFO  =   0010000;     /* Unix fifo    (BCC, not MSC or Amiga) */\n    \n    const UInt32 kISUID  =   04000;       /* Unix set user id on execution */\n    const UInt32 kISGID  =   02000;       /* Unix set group id on execution */\n    const UInt32 kISVTX  =   01000;       /* Unix directory permissions control */\n    const UInt32 kENFMT  =   kISGID;   /* Unix record locking enforcement flag */\n    const UInt32 kIRWXU  =   00700;       /* Unix read, write, execute: owner */\n    const UInt32 kIRUSR  =   00400;       /* Unix read permission: owner */\n    const UInt32 kIWUSR  =   00200;       /* Unix write permission: owner */\n    const UInt32 kIXUSR  =   00100;       /* Unix execute permission: owner */\n    const UInt32 kIRWXG  =   00070;       /* Unix read, write, execute: group */\n    const UInt32 kIRGRP  =   00040;       /* Unix read permission: group */\n    const UInt32 kIWGRP  =   00020;       /* Unix write permission: group */\n    const UInt32 kIXGRP  =   00010;       /* Unix execute permission: group */\n    const UInt32 kIRWXO  =   00007;       /* Unix read, write, execute: other */\n    const UInt32 kIROTH  =   00004;       /* Unix read permission: other */\n    const UInt32 kIWOTH  =   00002;       /* Unix write permission: other */\n    const UInt32 kIXOTH  =   00001;       /* Unix execute permission: other */\n  }\n  \n  namespace NAmigaAttribute\n  {\n    const UInt32 kIFMT     = 06000;       /* Amiga file type mask */\n    const UInt32 kIFDIR    = 04000;       /* Amiga directory */\n    const UInt32 kIFREG    = 02000;       /* Amiga regular file */\n    const UInt32 kIHIDDEN  = 00200;       /* to be supported in AmigaDOS 3.x */\n    const UInt32 kISCRIPT  = 00100;       /* executable script (text command file) */\n    const UInt32 kIPURE    = 00040;       /* allow loading into resident memory */\n    const UInt32 kIARCHIVE = 00020;       /* not modified since bit was last set */\n    const UInt32 kIREAD    = 00010;       /* can be opened for reading */\n    const UInt32 kIWRITE   = 00004;       /* can be opened for writing */\n    const UInt32 kIEXECUTE = 00002;       /* executable image, a loadable runfile */\n    const UInt32 kIDELETE  = 00001;      /* can be deleted */\n  }\n}\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipIn.cpp",
    "content": "// Archive/ZipIn.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ZipIn.h\"\n#include \"Windows/Defs.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/DynamicBuffer.h\"\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/StreamUtils.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/CpuArch.h\"\n}\n\n#define Get16(p) GetUi16(p)\n#define Get32(p) GetUi32(p)\n#define Get64(p) GetUi64(p)\n\nnamespace NArchive {\nnamespace NZip {\n \n// static const char kEndOfString = '\\0';\n\nHRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit)\n{\n  Close();\n  RINOK(stream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition));\n  m_Position = m_StreamStartPosition;\n  RINOK(FindAndReadMarker(stream, searchHeaderSizeLimit));\n  RINOK(stream->Seek(m_Position, STREAM_SEEK_SET, NULL));\n  m_Stream = stream;\n  return S_OK;\n}\n\nvoid CInArchive::Close()\n{\n  m_Stream.Release();\n}\n\nHRESULT CInArchive::Seek(UInt64 offset)\n{\n  return m_Stream->Seek(offset, STREAM_SEEK_SET, NULL);\n}\n\n//////////////////////////////////////\n// Markers\n\nstatic inline bool TestMarkerCandidate(const Byte *p, UInt32 &value)\n{\n  value = Get32(p);\n  return\n    (value == NSignature::kLocalFileHeader) ||\n    (value == NSignature::kEndOfCentralDir);\n}\n\nstatic const UInt32 kNumMarkerAddtionalBytes = 2;\nstatic inline bool TestMarkerCandidate2(const Byte *p, UInt32 &value)\n{\n  value = Get32(p);\n  if (value == NSignature::kEndOfCentralDir)\n    return (Get16(p + 4) == 0);\n  return (value == NSignature::kLocalFileHeader && p[4] < 128);\n}\n\nHRESULT CInArchive::FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit)\n{\n  m_ArchiveInfo.Clear();\n  m_Position = m_StreamStartPosition;\n\n  Byte marker[NSignature::kMarkerSize];\n  RINOK(ReadStream_FALSE(stream, marker, NSignature::kMarkerSize));\n  m_Position += NSignature::kMarkerSize;\n  if (TestMarkerCandidate(marker, m_Signature))\n    return S_OK;\n\n  CByteDynamicBuffer dynamicBuffer;\n  const UInt32 kSearchMarkerBufferSize = 0x10000;\n  dynamicBuffer.EnsureCapacity(kSearchMarkerBufferSize);\n  Byte *buffer = dynamicBuffer;\n  UInt32 numBytesPrev = NSignature::kMarkerSize - 1;\n  memcpy(buffer, marker + 1, numBytesPrev);\n  UInt64 curTestPos = m_StreamStartPosition + 1;\n  for (;;)\n  {\n    if (searchHeaderSizeLimit != NULL)\n      if (curTestPos - m_StreamStartPosition > *searchHeaderSizeLimit)\n        break;\n    size_t numReadBytes = kSearchMarkerBufferSize - numBytesPrev;\n    RINOK(ReadStream(stream, buffer + numBytesPrev, &numReadBytes));\n    m_Position += numReadBytes;\n    UInt32 numBytesInBuffer = numBytesPrev + (UInt32)numReadBytes;\n    const UInt32 kMarker2Size = NSignature::kMarkerSize + kNumMarkerAddtionalBytes;\n    if (numBytesInBuffer < kMarker2Size)\n      break;\n    UInt32 numTests = numBytesInBuffer - kMarker2Size + 1;\n    for (UInt32 pos = 0; pos < numTests; pos++)\n    {\n      if (buffer[pos] != 0x50)\n        continue;\n      if (TestMarkerCandidate2(buffer + pos, m_Signature))\n      {\n        curTestPos += pos;\n        m_ArchiveInfo.StartPosition = curTestPos;\n        m_Position = curTestPos + NSignature::kMarkerSize;\n        return S_OK;\n      }\n    }\n    curTestPos += numTests;\n    numBytesPrev = numBytesInBuffer - numTests;\n    memmove(buffer, buffer + numTests, numBytesPrev);\n  }\n  return S_FALSE;\n}\n\nHRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 *processedSize)\n{\n  size_t realProcessedSize = size;\n  HRESULT result = ReadStream(m_Stream, data, &realProcessedSize);\n  if (processedSize != NULL)\n    *processedSize = (UInt32)realProcessedSize;\n  m_Position += realProcessedSize;\n  return result;\n}\n\nvoid CInArchive::IncreaseRealPosition(UInt64 addValue)\n{\n  if (m_Stream->Seek(addValue, STREAM_SEEK_CUR, &m_Position) != S_OK);\n}\n\nbool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size)\n{\n  UInt32 realProcessedSize;\n  if (ReadBytes(data, size, &realProcessedSize) != S_OK)\n    return false;\n  return (realProcessedSize == size);\n}\n\nvoid CInArchive::SafeReadBytes(void *data, UInt32 size)\n{\n  if (!ReadBytesAndTestSize(data, size));\n}\n\nvoid CInArchive::ReadBuffer(CByteBuffer &buffer, UInt32 size)\n{\n  buffer.SetCapacity(size);\n  if (size > 0)\n    SafeReadBytes(buffer, size);\n}\n\nByte CInArchive::ReadByte()\n{\n  Byte b;\n  SafeReadBytes(&b, 1);\n  return b;\n}\n\nUInt16 CInArchive::ReadUInt16()\n{\n  UInt16 value = 0;\n  for (int i = 0; i < 2; i++)\n    value |= (((UInt16)ReadByte()) << (8 * i));\n  return value;\n}\n\nUInt32 CInArchive::ReadUInt32()\n{\n  UInt32 value = 0;\n  for (int i = 0; i < 4; i++)\n    value |= (((UInt32)ReadByte()) << (8 * i));\n  return value;\n}\n\nUInt64 CInArchive::ReadUInt64()\n{\n  UInt64 value = 0;\n  for (int i = 0; i < 8; i++)\n    value |= (((UInt64)ReadByte()) << (8 * i));\n  return value;\n}\n\nbool CInArchive::ReadUInt32(UInt32 &value)\n{\n  value = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    Byte b;\n    if (!ReadBytesAndTestSize(&b, 1))\n      return false;\n    value |= (UInt32(b) << (8 * i));\n  }\n  return true;\n}\n\n\nAString CInArchive::ReadFileName(UInt32 nameSize)\n{\n  if (nameSize == 0)\n    return AString();\n  char *p = m_NameBuffer.GetBuffer(nameSize);\n  SafeReadBytes(p, nameSize);\n  p[nameSize] = 0;\n  m_NameBuffer.ReleaseBuffer();\n  return m_NameBuffer;\n}\n\nvoid CInArchive::GetArchiveInfo(CInArchiveInfo &archiveInfo) const\n{\n  archiveInfo = m_ArchiveInfo;\n}\n\n/*\nvoid CInArchive::ThrowIncorrectArchiveException()\n{\n  throw CInArchiveException(CInArchiveException::kIncorrectArchive);\n}\n*/\n\nstatic UInt32 GetUInt32(const Byte *data)\n{\n  return\n      ((UInt32)(Byte)data[0]) |\n      (((UInt32)(Byte)data[1]) << 8) |\n      (((UInt32)(Byte)data[2]) << 16) |\n      (((UInt32)(Byte)data[3]) << 24);\n}\n\n/*\nstatic UInt16 GetUInt16(const Byte *data)\n{\n  return\n      ((UInt16)(Byte)data[0]) |\n      (((UInt16)(Byte)data[1]) << 8);\n}\n*/\n\nstatic UInt64 GetUInt64(const Byte *data)\n{\n  return GetUInt32(data) | ((UInt64)GetUInt32(data + 4) << 32);\n}\n\n\n\nvoid CInArchive::ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,\n    UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber)\n{\n  extraBlock.Clear();\n  UInt32 remain = extraSize;\n  while(remain >= 4)\n  {\n    CExtraSubBlock subBlock;\n    subBlock.ID = ReadUInt16();\n    UInt32 dataSize = ReadUInt16();\n    remain -= 4;\n    if (dataSize > remain) // it's bug\n      dataSize = remain;\n    if (subBlock.ID == NFileHeader::NExtraID::kZip64)\n    {\n      if (unpackSize == 0xFFFFFFFF)\n      {\n        if (dataSize < 8)\n          break;\n        unpackSize = ReadUInt64();\n        remain -= 8;\n        dataSize -= 8;\n      }\n      if (packSize == 0xFFFFFFFF)\n      {\n        if (dataSize < 8)\n          break;\n        packSize = ReadUInt64();\n        remain -= 8;\n        dataSize -= 8;\n      }\n      if (localHeaderOffset == 0xFFFFFFFF)\n      {\n        if (dataSize < 8)\n          break;\n        localHeaderOffset = ReadUInt64();\n        remain -= 8;\n        dataSize -= 8;\n      }\n      if (diskStartNumber == 0xFFFF)\n      {\n        if (dataSize < 4)\n          break;\n        diskStartNumber = ReadUInt32();\n        remain -= 4;\n        dataSize -= 4;\n      }\n      for (UInt32 i = 0; i < dataSize; i++)\n        ReadByte();\n    }\n    else\n    {\n      ReadBuffer(subBlock.Data, dataSize);\n      extraBlock.SubBlocks.Add(subBlock);\n    }\n    remain -= dataSize;\n  }\n  IncreaseRealPosition(remain);\n}\n\nHRESULT CInArchive::ReadLocalItem(CItemEx &item)\n{\n  item.ExtractVersion.Version = ReadByte();\n  item.ExtractVersion.HostOS = ReadByte();\n  item.Flags = ReadUInt16();\n  item.CompressionMethod = ReadUInt16();\n  item.Time =  ReadUInt32();\n  item.FileCRC = ReadUInt32();\n  item.PackSize = ReadUInt32();\n  item.UnPackSize = ReadUInt32();\n  UInt32 fileNameSize = ReadUInt16();\n  item.LocalExtraSize = ReadUInt16();\n  item.Name = ReadFileName(fileNameSize);\n  item.FileHeaderWithNameSize = 4 + NFileHeader::kLocalBlockSize + fileNameSize;\n  if (item.LocalExtraSize > 0)\n  {\n    UInt64 localHeaderOffset = 0;\n    UInt32 diskStartNumber = 0;\n    ReadExtra(item.LocalExtraSize, item.LocalExtra, item.UnPackSize, item.PackSize,\n      localHeaderOffset, diskStartNumber);\n  }\n  /*\n  if (item.IsDir())\n    item.UnPackSize = 0;       // check It\n  */\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadLocalItemAfterCdItem(CItemEx &item)\n{\n  if (item.FromLocal)\n    return S_OK;\n\n    RINOK(Seek(m_ArchiveInfo.Base + item.LocalHeaderPosition));\n    CItemEx localItem;\n    if (ReadUInt32() != NSignature::kLocalFileHeader)\n      return S_FALSE;\n    RINOK(ReadLocalItem(localItem));\n    if (item.Flags != localItem.Flags)\n    {\n      if (\n          (item.CompressionMethod != NFileHeader::NCompressionMethod::kDeflated ||\n            (item.Flags & 0x7FF9) != (localItem.Flags & 0x7FF9)) &&\n          (item.CompressionMethod != NFileHeader::NCompressionMethod::kStored ||\n            (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) &&\n          (item.CompressionMethod != NFileHeader::NCompressionMethod::kImploded ||\n            (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF))\n        )\n        return S_FALSE;\n    }\n\n    if (item.CompressionMethod != localItem.CompressionMethod ||\n        // item.Time != localItem.Time ||\n        (!localItem.HasDescriptor() &&\n          (\n            item.FileCRC != localItem.FileCRC ||\n            item.PackSize != localItem.PackSize ||\n            item.UnPackSize != localItem.UnPackSize\n          )\n        ) ||\n        item.Name.Length() != localItem.Name.Length()\n        )\n      return S_FALSE;\n    item.FileHeaderWithNameSize = localItem.FileHeaderWithNameSize;\n    item.LocalExtraSize = localItem.LocalExtraSize;\n    item.LocalExtra = localItem.LocalExtra;\n    item.FromLocal = true;\n\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadLocalItemDescriptor(CItemEx &item)\n{\n  if (item.HasDescriptor())\n  {\n    const int kBufferSize = (1 << 12);\n    Byte buffer[kBufferSize];\n    \n    UInt32 numBytesInBuffer = 0;\n    UInt32 packedSize = 0;\n    \n    bool descriptorWasFound = false;\n    for (;;)\n    {\n      UInt32 processedSize;\n      RINOK(ReadBytes(buffer + numBytesInBuffer, kBufferSize - numBytesInBuffer, &processedSize));\n      numBytesInBuffer += processedSize;\n      if (numBytesInBuffer < NFileHeader::kDataDescriptorSize)\n        return S_FALSE;\n      UInt32 i;\n      for (i = 0; i <= numBytesInBuffer - NFileHeader::kDataDescriptorSize; i++)\n      {\n        // descriptorSignature field is Info-ZIP's extension\n        // to Zip specification.\n        UInt32 descriptorSignature = GetUInt32(buffer + i);\n        \n        // !!!! It must be fixed for Zip64 archives\n        UInt32 descriptorPackSize = GetUInt32(buffer + i + 8);\n        if (descriptorSignature== NSignature::kDataDescriptor && descriptorPackSize == packedSize + i)\n        {\n          descriptorWasFound = true;\n          item.FileCRC = GetUInt32(buffer + i + 4);\n          item.PackSize = descriptorPackSize;\n          item.UnPackSize = GetUInt32(buffer + i + 12);\n          IncreaseRealPosition(Int64(Int32(0 - (numBytesInBuffer - i - NFileHeader::kDataDescriptorSize))));\n          break;\n        }\n      }\n      if (descriptorWasFound)\n        break;\n      packedSize += i;\n      int j;\n      for (j = 0; i < numBytesInBuffer; i++, j++)\n        buffer[j] = buffer[i];\n      numBytesInBuffer = j;\n    }\n  }\n  else\n    IncreaseRealPosition(item.PackSize);\n  return S_OK;\n}\n\nHRESULT CInArchive::ReadLocalItemAfterCdItemFull(CItemEx &item)\n{\n  if (item.FromLocal)\n    return S_OK;\n\n    RINOK(ReadLocalItemAfterCdItem(item));\n    if (item.HasDescriptor())\n    {\n      RINOK(Seek(m_ArchiveInfo.Base + item.GetDataPosition() + item.PackSize));\n      if (ReadUInt32() != NSignature::kDataDescriptor)\n        return S_FALSE;\n      UInt32 crc = ReadUInt32();\n      UInt64 packSize, unpackSize;\n\n      /*\n      if (IsZip64)\n      {\n        packSize = ReadUInt64();\n        unpackSize = ReadUInt64();\n      }\n      else\n      */\n      {\n        packSize = ReadUInt32();\n        unpackSize = ReadUInt32();\n      }\n\n      if (crc != item.FileCRC || item.PackSize != packSize || item.UnPackSize != unpackSize)\n        return S_FALSE;\n    }\n\n  return S_OK;\n}\n  \nHRESULT CInArchive::ReadCdItem(CItemEx &item)\n{\n  item.FromCentral = true;\n  const int kBufSize = 42;\n  Byte p[kBufSize];\n  SafeReadBytes(p, kBufSize);\n  item.MadeByVersion.Version = p[0];\n  item.MadeByVersion.HostOS = p[1];\n  item.ExtractVersion.Version = p[2];\n  item.ExtractVersion.HostOS = p[3];\n  item.Flags = Get16(p + 4);\n  item.CompressionMethod = Get16(p + 6);\n  item.Time = Get32(p + 8);\n  item.FileCRC = Get32(p + 12);\n  item.PackSize = Get32(p + 16);\n  item.UnPackSize = Get32(p + 20);\n  UInt16 headerNameSize = Get16(p + 24);\n  UInt16 headerExtraSize = Get16(p + 26);\n  UInt16 headerCommentSize = Get16(p + 28);\n  UInt32 headerDiskNumberStart = Get16(p + 30);\n  item.InternalAttributes = Get16(p + 32);\n  item.ExternalAttributes = Get32(p + 34);\n  item.LocalHeaderPosition = Get32(p + 38);\n  item.Name = ReadFileName(headerNameSize);\n  \n  if (headerExtraSize > 0)\n  {\n    ReadExtra(headerExtraSize, item.CentralExtra, item.UnPackSize, item.PackSize,\n        item.LocalHeaderPosition, headerDiskNumberStart);\n  }\n\n  if (headerDiskNumberStart != 0)\n    return -1;\n  \n  // May be these strings must be deleted\n  /*\n  if (item.IsDir())\n    item.UnPackSize = 0;\n  */\n  \n  ReadBuffer(item.Comment, headerCommentSize);\n  return S_OK;\n}\n\nHRESULT CInArchive::TryEcd64(UInt64 offset, CCdInfo &cdInfo)\n{\n  RINOK(Seek(offset));\n  const UInt32 kEcd64Size = 56;\n  Byte buf[kEcd64Size];\n  if (!ReadBytesAndTestSize(buf, kEcd64Size))\n    return S_FALSE;\n  if (GetUInt32(buf) != NSignature::kZip64EndOfCentralDir)\n    return S_FALSE;\n  // cdInfo.NumEntries = GetUInt64(buf + 24);\n  cdInfo.Size = GetUInt64(buf + 40);\n  cdInfo.Offset = GetUInt64(buf + 48);\n  return S_OK;\n}\n\nHRESULT CInArchive::FindCd(CCdInfo &cdInfo)\n{\n  UInt64 endPosition;\n  RINOK(m_Stream->Seek(0, STREAM_SEEK_END, &endPosition));\n  const UInt32 kBufSizeMax = (1 << 16) + kEcdSize + kZip64EcdLocatorSize;\n  Byte buf[kBufSizeMax];\n  UInt32 bufSize = (endPosition < kBufSizeMax) ? (UInt32)endPosition : kBufSizeMax;\n  if (bufSize < kEcdSize)\n    return S_FALSE;\n  UInt64 startPosition = endPosition - bufSize;\n  RINOK(m_Stream->Seek(startPosition, STREAM_SEEK_SET, &m_Position));\n  if (m_Position != startPosition)\n    return S_FALSE;\n  if (!ReadBytesAndTestSize(buf, bufSize))\n    return S_FALSE;\n  for (int i = (int)(bufSize - kEcdSize); i >= 0; i--)\n  {\n    if (GetUInt32(buf + i) == NSignature::kEndOfCentralDir)\n    {\n      if (i >= kZip64EcdLocatorSize)\n      {\n        const Byte *locator = buf + i - kZip64EcdLocatorSize;\n        if (GetUInt32(locator) == NSignature::kZip64EndOfCentralDirLocator)\n        {\n          UInt64 ecd64Offset = GetUInt64(locator + 8);\n          if (TryEcd64(ecd64Offset, cdInfo) == S_OK)\n            return S_OK;\n          if (TryEcd64(m_ArchiveInfo.StartPosition + ecd64Offset, cdInfo) == S_OK)\n          {\n            m_ArchiveInfo.Base = m_ArchiveInfo.StartPosition;\n            return S_OK;\n          }\n        }\n      }\n      if (GetUInt32(buf + i + 4) == 0)\n      {\n        // cdInfo.NumEntries = GetUInt16(buf + i + 10);\n        cdInfo.Size = GetUInt32(buf + i + 12);\n        cdInfo.Offset = GetUInt32(buf + i + 16);\n        UInt64 curPos = endPosition - bufSize + i;\n        UInt64 cdEnd = cdInfo.Size + cdInfo.Offset;\n        if (curPos > cdEnd)\n          m_ArchiveInfo.Base = curPos - cdEnd;\n        return S_OK;\n      }\n    }\n  }\n  return S_FALSE;\n}\n\nHRESULT CInArchive::TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress)\n{\n  items.Clear();\n  RINOK(m_Stream->Seek(cdOffset, STREAM_SEEK_SET, &m_Position));\n  if (m_Position != cdOffset)\n    return S_FALSE;\n  while(m_Position - cdOffset < cdSize)\n  {\n    if (ReadUInt32() != NSignature::kCentralFileHeader)\n      return S_FALSE;\n    CItemEx cdItem;\n    RINOK(ReadCdItem(cdItem));\n    items.Add(cdItem);\n    if (progress && items.Size() % 1000 == 0)\n      RINOK(progress->SetCompleted(items.Size()));\n  }\n  return (m_Position - cdOffset == cdSize) ? S_OK : S_FALSE;\n}\n\nHRESULT CInArchive::ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress)\n{\n  m_ArchiveInfo.Base = 0;\n  CCdInfo cdInfo;\n  RINOK(FindCd(cdInfo));\n  HRESULT res = S_FALSE;\n  cdSize = cdInfo.Size;\n  cdOffset = cdInfo.Offset;\n  res = TryReadCd(items, m_ArchiveInfo.Base + cdOffset, cdSize, progress);\n  if (res == S_FALSE && m_ArchiveInfo.Base == 0)\n  {\n    res = TryReadCd(items, cdInfo.Offset + m_ArchiveInfo.StartPosition, cdSize, progress);\n    if (res == S_OK)\n      m_ArchiveInfo.Base = m_ArchiveInfo.StartPosition;\n  }\n  if (!ReadUInt32(m_Signature))\n    return S_FALSE;\n  return res;\n}\n\nHRESULT CInArchive::ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset)\n{\n  items.Clear();\n  while (m_Signature == NSignature::kLocalFileHeader)\n  {\n    // FSeek points to next byte after signature\n    // NFileHeader::CLocalBlock localHeader;\n    CItemEx item;\n    item.LocalHeaderPosition = m_Position - m_StreamStartPosition - 4; // points to signature;\n    RINOK(ReadLocalItem(item));\n    item.FromLocal = true;\n    ReadLocalItemDescriptor(item);\n    items.Add(item);\n    if (progress && items.Size() % 100 == 0)\n      RINOK(progress->SetCompleted(items.Size()));\n    if (!ReadUInt32(m_Signature))\n      break;\n  }\n  cdOffset = m_Position - 4;\n  for (int i = 0; i < items.Size(); i++)\n  {\n    if (progress && i % 1000 == 0)\n      RINOK(progress->SetCompleted(items.Size()));\n    if (m_Signature != NSignature::kCentralFileHeader)\n      return S_FALSE;\n\n    CItemEx cdItem;\n    RINOK(ReadCdItem(cdItem));\n\n    if (i == 0)\n    {\n      if (cdItem.LocalHeaderPosition == 0)\n        m_ArchiveInfo.Base = m_ArchiveInfo.StartPosition;\n    }\n\n    int index;\n    int left = 0, right = items.Size();\n    for (;;)\n    {\n      if (left >= right)\n        return S_FALSE;\n      index = (left + right) / 2;\n      UInt64 position = items[index].LocalHeaderPosition - m_ArchiveInfo.Base;\n      if (cdItem.LocalHeaderPosition == position)\n        break;\n      if (cdItem.LocalHeaderPosition < position)\n        right = index;\n      else\n        left = index + 1;\n    }\n    CItemEx &item = items[index];\n    item.LocalHeaderPosition = cdItem.LocalHeaderPosition;\n    item.MadeByVersion = cdItem.MadeByVersion;\n    item.CentralExtra = cdItem.CentralExtra;\n\n    if (\n        // item.ExtractVersion != cdItem.ExtractVersion ||\n        item.Flags != cdItem.Flags ||\n        item.CompressionMethod != cdItem.CompressionMethod ||\n        // item.Time != cdItem.Time ||\n        item.FileCRC != cdItem.FileCRC)\n      return S_FALSE;\n\n    if (item.Name.Length() != cdItem.Name.Length() ||\n        item.PackSize != cdItem.PackSize ||\n        item.UnPackSize != cdItem.UnPackSize\n      )\n      return S_FALSE;\n    item.Name = cdItem.Name;\n    item.InternalAttributes = cdItem.InternalAttributes;\n    item.ExternalAttributes = cdItem.ExternalAttributes;\n    item.Comment = cdItem.Comment;\n    item.FromCentral = cdItem.FromCentral;\n    if (!ReadUInt32(m_Signature))\n      return S_FALSE;\n  }\n  return S_OK;\n}\n\nstruct CEcd\n{\n  UInt16 thisDiskNumber;\n  UInt16 startCDDiskNumber;\n  UInt16 numEntriesInCDOnThisDisk;\n  UInt16 numEntriesInCD;\n  UInt32 cdSize;\n  UInt32 cdStartOffset;\n  UInt16 commentSize;\n  void Parse(const Byte *p);\n};\n\nvoid CEcd::Parse(const Byte *p)\n{\n  thisDiskNumber = Get16(p);\n  startCDDiskNumber = Get16(p + 2);\n  numEntriesInCDOnThisDisk = Get16(p + 4);\n  numEntriesInCD = Get16(p + 6);\n  cdSize = Get32(p + 8);\n  cdStartOffset = Get32(p + 12);\n  commentSize = Get16(p + 16);\n}\n\nstruct CEcd64\n{\n  UInt16 versionMade;\n  UInt16 versionNeedExtract;\n  UInt32 thisDiskNumber;\n  UInt32 startCDDiskNumber;\n  UInt64 numEntriesInCDOnThisDisk;\n  UInt64 numEntriesInCD;\n  UInt64 cdSize;\n  UInt64 cdStartOffset;\n  void Parse(const Byte *p);\n  CEcd64() { memset(this, 0, sizeof(*this)); }\n};\n\nvoid CEcd64::Parse(const Byte *p)\n{\n  versionMade = Get16(p);\n  versionNeedExtract = Get16(p + 2);\n  thisDiskNumber = Get32(p + 4);\n  startCDDiskNumber = Get32(p + 8);\n  numEntriesInCDOnThisDisk = Get64(p + 12);\n  numEntriesInCD = Get64(p + 20);\n  cdSize = Get64(p + 28);\n  cdStartOffset = Get64(p + 36);\n}\n\n#define COPY_ECD_ITEM_16(n) if (!isZip64 || ecd. n != 0xFFFF)     ecd64. n = ecd. n;\n#define COPY_ECD_ITEM_32(n) if (!isZip64 || ecd. n != 0xFFFFFFFF) ecd64. n = ecd. n;\n\nHRESULT CInArchive::ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress)\n{\n  // m_Signature must be kLocalFileHeaderSignature or\n  // kEndOfCentralDirSignature\n  // m_Position points to next byte after signature\n\n  IsZip64 = false;\n  items.Clear();\n\n  UInt64 cdSize, cdStartOffset;\n  HRESULT res = ReadCd(items, cdStartOffset, cdSize, progress);\n  if (res != S_FALSE && res != S_OK)\n    return res;\n\n  /*\n  if (res != S_OK)\n    return res;\n  res = S_FALSE;\n  */\n\n  if (res == S_FALSE)\n  {\n    m_ArchiveInfo.Base = 0;\n    RINOK(m_Stream->Seek(m_ArchiveInfo.StartPosition, STREAM_SEEK_SET, &m_Position));\n    if (m_Position != m_ArchiveInfo.StartPosition)\n      return S_FALSE;\n    if (!ReadUInt32(m_Signature))\n      return S_FALSE;\n    RINOK(ReadLocalsAndCd(items, progress, cdStartOffset));\n    cdSize = (m_Position - 4) - cdStartOffset;\n    cdStartOffset -= m_ArchiveInfo.Base;\n  }\n\n  CEcd64 ecd64;\n  bool isZip64 = false;\n  UInt64 zip64EcdStartOffset = m_Position - 4 - m_ArchiveInfo.Base;\n  if (m_Signature == NSignature::kZip64EndOfCentralDir)\n  {\n    IsZip64 = isZip64 = true;\n    UInt64 recordSize = ReadUInt64();\n\n    const int kBufSize = kZip64EcdSize;\n    Byte buf[kBufSize];\n    SafeReadBytes(buf, kBufSize);\n    ecd64.Parse(buf);\n\n    IncreaseRealPosition(recordSize - kZip64EcdSize);\n    if (!ReadUInt32(m_Signature))\n      return S_FALSE;\n    if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0)\n      return S_FALSE;\n    if (ecd64.numEntriesInCDOnThisDisk != items.Size() ||\n        ecd64.numEntriesInCD != items.Size() ||\n        ecd64.cdSize != cdSize ||\n        (ecd64.cdStartOffset != cdStartOffset &&\n        (!items.IsEmpty())))\n      return S_FALSE;\n  }\n  if (m_Signature == NSignature::kZip64EndOfCentralDirLocator)\n  {\n    /* UInt32 startEndCDDiskNumber = */ ReadUInt32();\n    UInt64 endCDStartOffset = ReadUInt64();\n    /* UInt32 numberOfDisks = */ ReadUInt32();\n    if (zip64EcdStartOffset != endCDStartOffset)\n      return S_FALSE;\n    if (!ReadUInt32(m_Signature))\n      return S_FALSE;\n  }\n  if (m_Signature != NSignature::kEndOfCentralDir)\n      return S_FALSE;\n\n  const int kBufSize = kEcdSize - 4;\n  Byte buf[kBufSize];\n  SafeReadBytes(buf, kBufSize);\n  CEcd ecd;\n  ecd.Parse(buf);\n\n  COPY_ECD_ITEM_16(thisDiskNumber);\n  COPY_ECD_ITEM_16(startCDDiskNumber);\n  COPY_ECD_ITEM_16(numEntriesInCDOnThisDisk);\n  COPY_ECD_ITEM_16(numEntriesInCD);\n  COPY_ECD_ITEM_32(cdSize);\n  COPY_ECD_ITEM_32(cdStartOffset);\n\n  ReadBuffer(m_ArchiveInfo.Comment, ecd.commentSize);\n\n  if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0)\n    return S_FALSE;\n  if ((UInt16)ecd64.numEntriesInCDOnThisDisk != ((UInt16)items.Size()) ||\n      (UInt16)ecd64.numEntriesInCD != ((UInt16)items.Size()) ||\n      (UInt32)ecd64.cdSize != (UInt32)cdSize ||\n      ((UInt32)(ecd64.cdStartOffset) != (UInt32)cdStartOffset &&\n        (!items.IsEmpty())))\n      return S_FALSE;\n  \n  return S_OK;\n}\n\nISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size)\n{\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<ISequentialInStream> stream(streamSpec);\n  SeekInArchive(m_ArchiveInfo.Base + position);\n  streamSpec->SetStream(m_Stream);\n  streamSpec->Init(size);\n  return stream.Detach();\n}\n\nIInStream* CInArchive::CreateStream()\n{\n  CMyComPtr<IInStream> stream = m_Stream;\n  return stream.Detach();\n}\n\nbool CInArchive::SeekInArchive(UInt64 position)\n{\n  UInt64 newPosition;\n  if (m_Stream->Seek(position, STREAM_SEEK_SET, &newPosition) != S_OK)\n    return false;\n  return (newPosition == position);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipIn.h",
    "content": "// Archive/ZipIn.h\n\n#ifndef __ZIP_IN_H\n#define __ZIP_IN_H\n\n#include \"Common/MyCom.h\"\n#include \"../../IStream.h\"\n\n#include \"ZipHeader.h\"\n#include \"ZipItemEx.h\"\n\nnamespace NArchive {\nnamespace NZip {\n  \nclass CInArchiveException\n{\npublic:\n  enum ECauseType\n  {\n    kUnexpectedEndOfArchive = 0,\n    kArchiceHeaderCRCError,\n    kFileHeaderCRCError,\n    kIncorrectArchive,\n    kDataDescroptorsAreNotSupported,\n    kMultiVolumeArchiveAreNotSupported,\n    kReadStreamError,\n    kSeekStreamError\n  }\n  Cause;\n  CInArchiveException(ECauseType cause): Cause(cause) {}\n};\n\nclass CInArchiveInfo\n{\npublic:\n  UInt64 Base;\n  UInt64 StartPosition;\n  CByteBuffer Comment;\n  CInArchiveInfo(): Base(0), StartPosition(0) {}\n  void Clear()\n  {\n    Base = 0;\n    StartPosition = 0;\n    Comment.SetCapacity(0);\n  }\n};\n\nclass CProgressVirt\n{\npublic:\n  STDMETHOD(SetTotal)(UInt64 numFiles) PURE;\n  STDMETHOD(SetCompleted)(UInt64 numFiles) PURE;\n};\n\nstruct CCdInfo\n{\n  // UInt64 NumEntries;\n  UInt64 Size;\n  UInt64 Offset;\n};\n\nclass CInArchive\n{\n  CMyComPtr<IInStream> m_Stream;\n  UInt32 m_Signature;\n  UInt64 m_StreamStartPosition;\n  UInt64 m_Position;\n  AString m_NameBuffer;\n  \n  HRESULT Seek(UInt64 offset);\n\n  HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);\n  bool ReadUInt32(UInt32 &signature);\n  AString ReadFileName(UInt32 nameSize);\n  \n  HRESULT ReadBytes(void *data, UInt32 size, UInt32 *processedSize);\n  bool ReadBytesAndTestSize(void *data, UInt32 size);\n  void SafeReadBytes(void *data, UInt32 size);\n  void ReadBuffer(CByteBuffer &buffer, UInt32 size);\n  Byte ReadByte();\n  UInt16 ReadUInt16();\n  UInt32 ReadUInt32();\n  UInt64 ReadUInt64();\n  \n  void IncreaseRealPosition(UInt64 addValue);\n \n  void ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,\n      UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber);\n  HRESULT ReadLocalItem(CItemEx &item);\n  HRESULT ReadLocalItemDescriptor(CItemEx &item);\n  HRESULT ReadCdItem(CItemEx &item);\n  HRESULT TryEcd64(UInt64 offset, CCdInfo &cdInfo);\n  HRESULT FindCd(CCdInfo &cdInfo);\n  HRESULT TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress);\n  HRESULT ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress);\n  HRESULT ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset);\npublic:\n  CInArchiveInfo m_ArchiveInfo;\n  bool IsZip64;\n\n  HRESULT ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress);\n  HRESULT ReadLocalItemAfterCdItem(CItemEx &item);\n  HRESULT ReadLocalItemAfterCdItemFull(CItemEx &item);\n  HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit);\n  void Close();\n  void GetArchiveInfo(CInArchiveInfo &archiveInfo) const;\n  bool SeekInArchive(UInt64 position);\n  ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);\n  IInStream* CreateStream();\n\n  bool IsOpen() const { return m_Stream != NULL; }\n};\n  \n}}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipItem.cpp",
    "content": "// Archive/ZipItem.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ZipHeader.h\"\n#include \"ZipItem.h\"\n#include \"../Common/ItemNameUtils.h\"\n#include \"../../../../C/CpuArch.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nbool operator==(const CVersion &v1, const CVersion &v2)\n{\n  return (v1.Version == v2.Version) && (v1.HostOS == v2.HostOS);\n}\n\nbool operator!=(const CVersion &v1, const CVersion &v2)\n{\n  return !(v1 == v2);\n}\n\nbool CExtraSubBlock::ExtractNtfsTime(int index, FILETIME &ft) const\n{\n  ft.dwHighDateTime = ft.dwLowDateTime = 0;\n  UInt32 size = (UInt32)Data.GetCapacity();\n  if (ID != NFileHeader::NExtraID::kNTFS || size < 32)\n    return false;\n  const Byte *p = (const Byte *)Data;\n  p += 4; // for reserved\n  size -= 4;\n  while (size > 4)\n  {\n    UInt16 tag = GetUi16(p);\n    UInt32 attrSize = GetUi16(p + 2);\n    p += 4;\n    size -= 4;\n    if (attrSize > size)\n      attrSize = size;\n    \n    if (tag == NFileHeader::NNtfsExtra::kTagTime && attrSize >= 24)\n    {\n      p += 8 * index;\n      ft.dwLowDateTime = GetUi32(p);\n      ft.dwHighDateTime = GetUi32(p + 4);\n      return true;\n    }\n    p += attrSize;\n    size -= attrSize;\n  }\n  return false;\n}\n\nbool CLocalItem::IsDir() const\n{\n  return NItemName::HasTailSlash(Name, GetCodePage());\n}\n\nbool CItem::IsDir() const\n{\n  if (NItemName::HasTailSlash(Name, GetCodePage()))\n    return true;\n  if (!FromCentral)\n    return false;\n  WORD highAttributes = WORD((ExternalAttributes >> 16 ) & 0xFFFF);\n  switch(MadeByVersion.HostOS)\n  {\n    case NFileHeader::NHostOS::kAMIGA:\n      switch (highAttributes & NFileHeader::NAmigaAttribute::kIFMT)\n      {\n        case NFileHeader::NAmigaAttribute::kIFDIR: return true;\n        case NFileHeader::NAmigaAttribute::kIFREG: return false;\n        default: return false; // change it throw kUnknownAttributes;\n      }\n    case NFileHeader::NHostOS::kFAT:\n    case NFileHeader::NHostOS::kNTFS:\n    case NFileHeader::NHostOS::kHPFS:\n    case NFileHeader::NHostOS::kVFAT:\n      return ((ExternalAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0);\n    case NFileHeader::NHostOS::kAtari:\n    case NFileHeader::NHostOS::kMac:\n    case NFileHeader::NHostOS::kVMS:\n    case NFileHeader::NHostOS::kVM_CMS:\n    case NFileHeader::NHostOS::kAcorn:\n    case NFileHeader::NHostOS::kMVS:\n      return false; // change it throw kUnknownAttributes;\n    default:\n      /*\n      switch (highAttributes & NFileHeader::NUnixAttribute::kIFMT)\n      {\n        case NFileHeader::NUnixAttribute::kIFDIR:\n          return true;\n        default:\n          return false;\n      }\n      */\n      return false;\n  }\n}\n\n#ifndef FILE_ATTRIBUTE_UNIX_EXTENSION\nUInt32 CLocalItem::GetWinAttributes() const\n{\n  DWORD winAttributes = 0;\n  if (IsDir())\n    winAttributes |= FILE_ATTRIBUTE_DIRECTORY;\n  return winAttributes;\n}\n#endif\n\nUInt32 CItem::GetWinAttributes() const\n{\n  DWORD winAttributes = 0;\n  switch(MadeByVersion.HostOS)\n  {\n    case NFileHeader::NHostOS::kFAT:\n    case NFileHeader::NHostOS::kNTFS:\n      if (FromCentral)\n        winAttributes = ExternalAttributes;\n      break;\n#ifdef FILE_ATTRIBUTE_UNIX_EXTENSION\n    case NFileHeader::NHostOS::kUnix:\n        winAttributes = (ExternalAttributes & 0xFFFF0000) | FILE_ATTRIBUTE_UNIX_EXTENSION; \n        if (winAttributes & (NFileHeader::NUnixAttribute::kIFDIR << 16))\n\t\twinAttributes |= FILE_ATTRIBUTE_DIRECTORY;\n        return winAttributes;\n#endif\n    default:\n      winAttributes = 0; // must be converted from unix value;\n  }\n  if (IsDir())       // test it;\n    winAttributes |= FILE_ATTRIBUTE_DIRECTORY;\n  return winAttributes;\n}\n\nvoid CLocalItem::SetFlagBits(int startBitNumber, int numBits, int value)\n{\n  UInt16 mask = (UInt16)(((1 << numBits) - 1) << startBitNumber);\n  Flags &= ~mask;\n  Flags |= value << startBitNumber;\n}\n\nvoid CLocalItem::SetBitMask(int bitMask, bool enable)\n{\n  if(enable)\n    Flags |= bitMask;\n  else\n    Flags &= ~bitMask;\n}\n\nvoid CLocalItem::SetEncrypted(bool encrypted)\n  { SetBitMask(NFileHeader::NFlags::kEncrypted, encrypted); }\nvoid CLocalItem::SetUtf8(bool isUtf8)\n  { SetBitMask(NFileHeader::NFlags::kUtf8, isUtf8); }\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipItem.h",
    "content": "// Archive/ZipItem.h\n\n#ifndef __ARCHIVE_ZIP_ITEM_H\n#define __ARCHIVE_ZIP_ITEM_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n#include \"Common/UTFConvert.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"ZipHeader.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nstruct CVersion\n{\n  Byte Version;\n  Byte HostOS;\n};\n\nbool operator==(const CVersion &v1, const CVersion &v2);\nbool operator!=(const CVersion &v1, const CVersion &v2);\n\nstruct CExtraSubBlock\n{\n  UInt16 ID;\n  CByteBuffer Data;\n  bool ExtractNtfsTime(int index, FILETIME &ft) const;\n};\n\nstruct CWzAesExtraField\n{\n  UInt16 VendorVersion; // 0x0001 - AE-1, 0x0002 - AE-2,\n  // UInt16 VendorId; // \"AE\"\n  Byte Strength; // 1 - 128-bit , 2 - 192-bit , 3 - 256-bit\n  UInt16 Method;\n\n  CWzAesExtraField(): VendorVersion(2), Strength(3), Method(0) {}\n\n  bool NeedCrc() const { return (VendorVersion == 1); }\n\n  bool ParseFromSubBlock(const CExtraSubBlock &sb)\n  {\n    if (sb.ID != NFileHeader::NExtraID::kWzAES)\n      return false;\n    if (sb.Data.GetCapacity() < 7)\n      return false;\n    const Byte *p = (const Byte *)sb.Data;\n    VendorVersion = (((UInt16)p[1]) << 8) | p[0];\n    if (p[2] != 'A' || p[3] != 'E')\n      return false;\n    Strength = p[4];\n    Method = (((UInt16)p[6]) << 16) | p[5];\n    return true;\n  }\n  void SetSubBlock(CExtraSubBlock &sb) const\n  {\n    sb.Data.SetCapacity(7);\n    sb.ID = NFileHeader::NExtraID::kWzAES;\n    Byte *p = (Byte *)sb.Data;\n    p[0] = (Byte)VendorVersion;\n    p[1] = (Byte)(VendorVersion >> 8);\n    p[2] = 'A';\n    p[3] = 'E';\n    p[4] = Strength;\n    p[5] = (Byte)Method;\n    p[6] = (Byte)(Method >> 8);\n  }\n};\n\nnamespace NStrongCryptoFlags\n{\n  const UInt16 kDES = 0x6601;\n  const UInt16 kRC2old = 0x6602;\n  const UInt16 k3DES168 = 0x6603;\n  const UInt16 k3DES112 = 0x6609;\n  const UInt16 kAES128 = 0x660E;\n  const UInt16 kAES192 = 0x660F;\n  const UInt16 kAES256 = 0x6610;\n  const UInt16 kRC2 = 0x6702;\n  const UInt16 kBlowfish = 0x6720;\n  const UInt16 kTwofish = 0x6721;\n  const UInt16 kRC4 = 0x6801;\n}\n\nstruct CStrongCryptoField\n{\n  UInt16 Format;\n  UInt16 AlgId;\n  UInt16 BitLen;\n  UInt16 Flags;\n\n  bool ParseFromSubBlock(const CExtraSubBlock &sb)\n  {\n    if (sb.ID != NFileHeader::NExtraID::kStrongEncrypt)\n      return false;\n    const Byte *p = (const Byte *)sb.Data;\n    if (sb.Data.GetCapacity() < 8)\n      return false;\n    Format = (((UInt16)p[1]) << 8) | p[0];\n    AlgId  = (((UInt16)p[3]) << 8) | p[2];\n    BitLen = (((UInt16)p[5]) << 8) | p[4];\n    Flags  = (((UInt16)p[7]) << 8) | p[6];\n    return (Format == 2);\n  }\n};\n\nstruct CExtraBlock\n{\n  CObjectVector<CExtraSubBlock> SubBlocks;\n  void Clear() { SubBlocks.Clear(); }\n  size_t GetSize() const\n  {\n    size_t res = 0;\n    for (int i = 0; i < SubBlocks.Size(); i++)\n      res += SubBlocks[i].Data.GetCapacity() + 2 + 2;\n    return res;\n  }\n  bool GetWzAesField(CWzAesExtraField &aesField) const\n  {\n    for (int i = 0; i < SubBlocks.Size(); i++)\n      if (aesField.ParseFromSubBlock(SubBlocks[i]))\n        return true;\n    return false;\n  }\n\n  bool GetStrongCryptoField(CStrongCryptoField &f) const\n  {\n    for (int i = 0; i < SubBlocks.Size(); i++)\n      if (f.ParseFromSubBlock(SubBlocks[i]))\n        return true;\n    return false;\n  }\n\n  bool HasWzAesField() const\n  {\n    CWzAesExtraField aesField;\n    return GetWzAesField(aesField);\n  }\n\n  bool GetNtfsTime(int index, FILETIME &ft) const\n  {\n    for (int i = 0; i < SubBlocks.Size(); i++)\n    {\n      const CExtraSubBlock &sb = SubBlocks[i];\n      if (sb.ID == NFileHeader::NExtraID::kNTFS)\n        return sb.ExtractNtfsTime(index, ft);\n    }\n    return false;\n  }\n\n  /*\n  bool HasStrongCryptoField() const\n  {\n    CStrongCryptoField f;\n    return GetStrongCryptoField(f);\n  }\n  */\n\n  void RemoveUnknownSubBlocks()\n  {\n    for (int i = SubBlocks.Size() - 1; i >= 0; i--)\n      if (SubBlocks[i].ID != NFileHeader::NExtraID::kWzAES)\n        SubBlocks.Delete(i);\n  }\n};\n\n\nclass CLocalItem\n{\npublic:\n  CVersion ExtractVersion;\n  UInt16 Flags;\n  UInt16 CompressionMethod;\n  UInt32 Time;\n  UInt32 FileCRC;\n  UInt64 PackSize;\n  UInt64 UnPackSize;\n  \n  AString Name;\n\n  CExtraBlock LocalExtra;\n\n  bool IsUtf8() const { return (Flags & NFileHeader::NFlags::kUtf8) != 0; }\n  \n  bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kEncrypted) != 0; }\n  bool IsStrongEncrypted() const { return IsEncrypted() && (Flags & NFileHeader::NFlags::kStrongEncrypted) != 0; };\n  bool IsAesEncrypted() const { return IsEncrypted() && (IsStrongEncrypted() || CompressionMethod == NFileHeader::NCompressionMethod::kWzAES); };\n  \n  bool IsLzmaEOS() const { return (Flags & NFileHeader::NFlags::kLzmaEOS) != 0; }\n  \n  bool IsDir() const;\n  bool IgnoreItem() const { return false; }\n  UInt32 GetWinAttributes() const;\n  \n  bool HasDescriptor() const  { return (Flags & NFileHeader::NFlags::kDescriptorUsedMask) != 0; }\n\n  UString GetUnicodeString(const AString &s) const\n  {\n    UString res;\n    if (IsUtf8())\n      if (!ConvertUTF8ToUnicode(s, res))\n        res.Empty();\n    if (res.IsEmpty())\n      res = MultiByteToUnicodeString(s, GetCodePage());\n    return res;\n  }\n  \nprivate:\n  void SetFlagBits(int startBitNumber, int numBits, int value);\n  void SetBitMask(int bitMask, bool enable);\npublic:\n  void ClearFlags() { Flags = 0; }\n  void SetEncrypted(bool encrypted);\n  void SetUtf8(bool isUtf8);\n\n  WORD GetCodePage() const { return  CP_OEMCP; }\n};\n\nclass CItem: public CLocalItem\n{\npublic:\n  CVersion MadeByVersion;\n  UInt16 InternalAttributes;\n  UInt32 ExternalAttributes;\n  \n  UInt64 LocalHeaderPosition;\n  \n  FILETIME NtfsMTime;\n  FILETIME NtfsATime;\n  FILETIME NtfsCTime;\n\n  CExtraBlock CentralExtra;\n  CByteBuffer Comment;\n\n  bool FromLocal;\n  bool FromCentral;\n  bool NtfsTimeIsDefined;\n  \n  bool IsDir() const;\n  UInt32 GetWinAttributes() const;\n\n  bool IsThereCrc() const\n  {\n    if (CompressionMethod == NFileHeader::NCompressionMethod::kWzAES)\n    {\n      CWzAesExtraField aesField;\n      if (CentralExtra.GetWzAesField(aesField))\n        return aesField.NeedCrc();\n    }\n    return (FileCRC != 0 || !IsDir());\n  }\n  \n  WORD GetCodePage() const\n  {\n    return (WORD)((MadeByVersion.HostOS == NFileHeader::NHostOS::kFAT\n        || MadeByVersion.HostOS == NFileHeader::NHostOS::kNTFS\n        ) ? CP_OEMCP : CP_ACP);\n  }\n  CItem() : FromLocal(false), FromCentral(false), NtfsTimeIsDefined(false) {}\n};\n\n}}\n\n#endif\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipItemEx.h",
    "content": "// Archive/ZipItemEx.h\n\n#ifndef __ARCHIVE_ZIP_ITEMEX_H\n#define __ARCHIVE_ZIP_ITEMEX_H\n\n#include \"ZipHeader.h\"\n#include \"ZipItem.h\"\n\nnamespace NArchive {\nnamespace NZip {\n  \nclass CItemEx: public CItem\n{\npublic:\n  UInt32 FileHeaderWithNameSize;\n  UInt16 LocalExtraSize;\n  \n  UInt64 GetLocalFullSize() const\n    { return FileHeaderWithNameSize + LocalExtraSize + PackSize +\n      (HasDescriptor() ? NFileHeader::kDataDescriptorSize : 0); };\n  /*\n  UInt64 GetLocalFullSize(bool isZip64) const\n    { return FileHeaderWithNameSize + LocalExtraSize + PackSize +\n    (HasDescriptor() ? (isZip64 ? NFileHeader::kDataDescriptor64Size : NFileHeader::kDataDescriptorSize) : 0); };\n  */\n  UInt64 GetLocalExtraPosition() const\n    { return LocalHeaderPosition + FileHeaderWithNameSize; };\n  UInt64 GetDataPosition() const\n    { return GetLocalExtraPosition() + LocalExtraSize; };\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipOut.cpp",
    "content": "// ZipOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ZipOut.h\"\n#include \"Common/StringConvert.h\"\n#include \"../../Common/OffsetStream.h\"\n#include \"../../Common/StreamUtils.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nvoid COutArchive::Create(IOutStream *outStream)\n{\n  if (!m_OutBuffer.Create(1 << 16))\n    return;\n  m_Stream = outStream;\n  m_OutBuffer.SetStream(outStream);\n  m_OutBuffer.Init();\n  m_BasePosition = 0;\n}\n\nvoid COutArchive::MoveBasePosition(UInt64 distanceToMove)\n{\n  m_BasePosition += distanceToMove; // test overflow\n}\n\nvoid COutArchive::PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption)\n{\n  m_IsZip64 = isZip64;\n  m_ExtraSize = isZip64 ? (4 + 8 + 8) : 0;\n  if (aesEncryption)\n    m_ExtraSize += 4 + 7;\n  m_LocalFileHeaderSize = 4 + NFileHeader::kLocalBlockSize + fileNameLength + m_ExtraSize;\n}\n\nvoid COutArchive::PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption)\n{\n  // We test it to 0xF8000000 to support case when compressed size\n  // can be larger than uncompressed size.\n  PrepareWriteCompressedDataZip64(fileNameLength, unPackSize >= 0xF8000000, aesEncryption);\n}\n\nvoid COutArchive::PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption)\n{\n  bool isUnPack64 = unPackSize >= 0xFFFFFFFF;\n  bool isPack64 = packSize >= 0xFFFFFFFF;\n  bool isZip64 = isPack64 || isUnPack64;\n  PrepareWriteCompressedDataZip64(fileNameLength, isZip64, aesEncryption);\n}\n\nvoid COutArchive::WriteBytes(const void *buffer, UInt32 size)\n{\n  m_OutBuffer.WriteBytes(buffer, size);\n  m_BasePosition += size;\n}\n\nvoid COutArchive::WriteByte(Byte b)\n{\n  WriteBytes(&b, 1);\n}\n\nvoid COutArchive::WriteUInt16(UInt16 value)\n{\n  for (int i = 0; i < 2; i++)\n  {\n    WriteByte((Byte)value);\n    value >>= 8;\n  }\n}\n\nvoid COutArchive::WriteUInt32(UInt32 value)\n{\n  for (int i = 0; i < 4; i++)\n  {\n    WriteByte((Byte)value);\n    value >>= 8;\n  }\n}\n\nvoid COutArchive::WriteUInt64(UInt64 value)\n{\n  for (int i = 0; i < 8; i++)\n  {\n    WriteByte((Byte)value);\n    value >>= 8;\n  }\n}\n\nvoid COutArchive::WriteExtra(const CExtraBlock &extra)\n{\n  if (extra.SubBlocks.Size() != 0)\n  {\n    for (int i = 0; i < extra.SubBlocks.Size(); i++)\n    {\n      const CExtraSubBlock &subBlock = extra.SubBlocks[i];\n      WriteUInt16(subBlock.ID);\n      WriteUInt16((UInt16)subBlock.Data.GetCapacity());\n      WriteBytes(subBlock.Data, (UInt32)subBlock.Data.GetCapacity());\n    }\n  }\n}\n\nvoid COutArchive::SeekTo(UInt64 offset)\n{\n  HRESULT res = m_Stream->Seek(offset, STREAM_SEEK_SET, NULL);\n  if (res != S_OK);\n}\n\nvoid COutArchive::WriteLocalHeader(const CLocalItem &item)\n{\n  SeekTo(m_BasePosition);\n  \n  bool isZip64 = m_IsZip64 || item.PackSize >= 0xFFFFFFFF || item.UnPackSize >= 0xFFFFFFFF;\n  \n  WriteUInt32(NSignature::kLocalFileHeader);\n  WriteByte(item.ExtractVersion.Version);\n  WriteByte(item.ExtractVersion.HostOS);\n  WriteUInt16(item.Flags);\n  WriteUInt16(item.CompressionMethod);\n  WriteUInt32(item.Time);\n  WriteUInt32(item.FileCRC);\n  WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.PackSize);\n  WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);\n  WriteUInt16((UInt16)item.Name.Length());\n  {\n    UInt16 localExtraSize = (UInt16)((isZip64 ? (4 + 16): 0) + item.LocalExtra.GetSize());\n    if (localExtraSize > m_ExtraSize);\n  }\n  WriteUInt16((UInt16)m_ExtraSize); // test it;\n  WriteBytes((const char *)item.Name, item.Name.Length());\n\n  UInt32 extraPos = 0;\n  if (isZip64)\n  {\n    extraPos += 4 + 16;\n    WriteUInt16(NFileHeader::NExtraID::kZip64);\n    WriteUInt16(16);\n    WriteUInt64(item.UnPackSize);\n    WriteUInt64(item.PackSize);\n  }\n\n  WriteExtra(item.LocalExtra);\n  extraPos += (UInt32)item.LocalExtra.GetSize();\n  for (; extraPos < m_ExtraSize; extraPos++)\n    WriteByte(0);\n\n  m_OutBuffer.FlushWithCheck();\n  MoveBasePosition(item.PackSize);\n  SeekTo(m_BasePosition);\n}\n\nvoid COutArchive::WriteCentralHeader(const CItem &item)\n{\n  bool isUnPack64 = item.UnPackSize >= 0xFFFFFFFF;\n  bool isPack64 = item.PackSize >= 0xFFFFFFFF;\n  bool isPosition64 = item.LocalHeaderPosition >= 0xFFFFFFFF;\n  bool isZip64  = isPack64 || isUnPack64 || isPosition64;\n  \n  WriteUInt32(NSignature::kCentralFileHeader);\n  WriteByte(item.MadeByVersion.Version);\n  WriteByte(item.MadeByVersion.HostOS);\n  WriteByte(item.ExtractVersion.Version);\n  WriteByte(item.ExtractVersion.HostOS);\n  WriteUInt16(item.Flags);\n  WriteUInt16(item.CompressionMethod);\n  WriteUInt32(item.Time);\n  WriteUInt32(item.FileCRC);\n  WriteUInt32(isPack64 ? 0xFFFFFFFF: (UInt32)item.PackSize);\n  WriteUInt32(isUnPack64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);\n  WriteUInt16((UInt16)item.Name.Length());\n  UInt16 zip64ExtraSize = (UInt16)((isUnPack64 ? 8: 0) +  (isPack64 ? 8: 0) + (isPosition64 ? 8: 0));\n  const UInt16 kNtfsExtraSize = 4 + 2 + 2 + (3 * 8);\n  UInt16 centralExtraSize = (UInt16)(isZip64 ? (4 + zip64ExtraSize) : 0) + (item.NtfsTimeIsDefined ? (4 + kNtfsExtraSize) : 0);\n  centralExtraSize = (UInt16)(centralExtraSize + item.CentralExtra.GetSize());\n  WriteUInt16(centralExtraSize); // test it;\n  WriteUInt16((UInt16)item.Comment.GetCapacity());\n  WriteUInt16(0); // DiskNumberStart;\n  WriteUInt16(item.InternalAttributes);\n  WriteUInt32(item.ExternalAttributes);\n  WriteUInt32(isPosition64 ? 0xFFFFFFFF: (UInt32)item.LocalHeaderPosition);\n  WriteBytes((const char *)item.Name, item.Name.Length());\n  if (isZip64)\n  {\n    WriteUInt16(NFileHeader::NExtraID::kZip64);\n    WriteUInt16(zip64ExtraSize);\n    if(isUnPack64)\n      WriteUInt64(item.UnPackSize);\n    if(isPack64)\n      WriteUInt64(item.PackSize);\n    if(isPosition64)\n      WriteUInt64(item.LocalHeaderPosition);\n  }\n  if (item.NtfsTimeIsDefined)\n  {\n    WriteUInt16(NFileHeader::NExtraID::kNTFS);\n    WriteUInt16(kNtfsExtraSize);\n    WriteUInt32(0); // reserved\n    WriteUInt16(NFileHeader::NNtfsExtra::kTagTime);\n    WriteUInt16(8 * 3);\n    WriteUInt32(item.NtfsMTime.dwLowDateTime);\n    WriteUInt32(item.NtfsMTime.dwHighDateTime);\n    WriteUInt32(item.NtfsATime.dwLowDateTime);\n    WriteUInt32(item.NtfsATime.dwHighDateTime);\n    WriteUInt32(item.NtfsCTime.dwLowDateTime);\n    WriteUInt32(item.NtfsCTime.dwHighDateTime);\n  }\n  WriteExtra(item.CentralExtra);\n  if (item.Comment.GetCapacity() > 0)\n    WriteBytes(item.Comment, (UInt32)item.Comment.GetCapacity());\n}\n\nvoid COutArchive::WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer &comment)\n{\n  SeekTo(m_BasePosition);\n  \n  UInt64 cdOffset = GetCurrentPosition();\n  for(int i = 0; i < items.Size(); i++)\n    WriteCentralHeader(items[i]);\n  UInt64 cd64EndOffset = GetCurrentPosition();\n  UInt64 cdSize = cd64EndOffset - cdOffset;\n  bool cdOffset64 = cdOffset >= 0xFFFFFFFF;\n  bool cdSize64 = cdSize >= 0xFFFFFFFF;\n  bool items64 = items.Size() >= 0xFFFF;\n  bool isZip64 = (cdOffset64 || cdSize64 || items64);\n\n  if (isZip64)\n  {\n    WriteUInt32(NSignature::kZip64EndOfCentralDir);\n    WriteUInt64(kZip64EcdSize); // ThisDiskNumber = 0;\n    WriteUInt16(45); // version\n    WriteUInt16(45); // version\n    WriteUInt32(0); // ThisDiskNumber = 0;\n    WriteUInt32(0); // StartCentralDirectoryDiskNumber;;\n    WriteUInt64((UInt64)items.Size());\n    WriteUInt64((UInt64)items.Size());\n    WriteUInt64((UInt64)cdSize);\n    WriteUInt64((UInt64)cdOffset);\n\n    WriteUInt32(NSignature::kZip64EndOfCentralDirLocator);\n    WriteUInt32(0); // number of the disk with the start of the zip64 end of central directory\n    WriteUInt64(cd64EndOffset);\n    WriteUInt32(1); // total number of disks\n  }\n  WriteUInt32(NSignature::kEndOfCentralDir);\n  WriteUInt16(0); // ThisDiskNumber = 0;\n  WriteUInt16(0); // StartCentralDirectoryDiskNumber;\n  WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));\n  WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));\n  WriteUInt32(cdSize64 ? 0xFFFFFFFF: (UInt32)cdSize);\n  WriteUInt32(cdOffset64 ? 0xFFFFFFFF: (UInt32)cdOffset);\n  UInt16 commentSize = (UInt16)comment.GetCapacity();\n  WriteUInt16(commentSize);\n  if (commentSize > 0)\n    WriteBytes((const Byte *)comment, commentSize);\n  m_OutBuffer.FlushWithCheck();\n}\n\nvoid COutArchive::CreateStreamForCompressing(IOutStream **outStream)\n{\n  COffsetOutStream *streamSpec = new COffsetOutStream;\n  CMyComPtr<IOutStream> tempStream(streamSpec);\n  streamSpec->Init(m_Stream, m_BasePosition + m_LocalFileHeaderSize);\n  *outStream = tempStream.Detach();\n}\n\nvoid COutArchive::SeekToPackedDataPosition()\n{\n  SeekTo(m_BasePosition + m_LocalFileHeaderSize);\n}\n\nvoid COutArchive::CreateStreamForCopying(ISequentialOutStream **outStream)\n{\n  CMyComPtr<ISequentialOutStream> tempStream(m_Stream);\n  *outStream = tempStream.Detach();\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipOut.h",
    "content": "// ZipOut.h\n\n#ifndef __ZIP_OUT_H\n#define __ZIP_OUT_H\n\n#include \"Common/MyCom.h\"\n\n#include \"../../IStream.h\"\n#include \"../../Common/OutBuffer.h\"\n\n#include \"ZipItem.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\n// can throw CSystemException and COutBufferException\n  \nclass COutArchive\n{\n  CMyComPtr<IOutStream> m_Stream;\n  COutBuffer m_OutBuffer;\n\n  UInt64 m_BasePosition;\n  UInt32 m_LocalFileHeaderSize;\n  UInt32 m_ExtraSize;\n  bool m_IsZip64;\n\n  void WriteBytes(const void *buffer, UInt32 size);\n  void WriteByte(Byte b);\n  void WriteUInt16(UInt16 value);\n  void WriteUInt32(UInt32 value);\n  void WriteUInt64(UInt64 value);\n\n  void WriteExtraHeader(const CItem &item);\n  void WriteCentralHeader(const CItem &item);\n  void WriteExtra(const CExtraBlock &extra);\n  void SeekTo(UInt64 offset);\npublic:\n  void Create(IOutStream *outStream);\n  void MoveBasePosition(UInt64 distanceToMove);\n  UInt64 GetCurrentPosition() const { return m_BasePosition; };\n  void PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption);\n  void PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption);\n  void PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption);\n  void WriteLocalHeader(const CLocalItem &item);\n\n  void WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer &comment);\n\n  void CreateStreamForCompressing(IOutStream **outStream);\n  void CreateStreamForCopying(ISequentialOutStream **outStream);\n  void SeekToPackedDataPosition();\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipRegister.cpp",
    "content": "// ZipRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/RegisterArc.h\"\n\n#include \"ZipHandler.h\"\nstatic IInArchive *CreateArc() { return new NArchive::NZip::CHandler;  }\n#ifndef EXTRACT_ONLY\nstatic IOutArchive *CreateArcOut() { return new NArchive::NZip::CHandler;  }\n#else\n#define CreateArcOut 0\n#endif\n\nstatic CArcInfo g_ArcInfo =\n  { L\"Zip\", L\"zip jar xpi\", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, CreateArcOut };\n\n  \nvoid RegisterZip()\n{\n\tRegisterArc(&g_ArcInfo);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipUpdate.cpp",
    "content": "// ZipUpdate.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/AutoPtr.h\"\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/Defs.h\"\n#include \"Windows/Thread.h\"\n\n#include \"../../Common/CreateCoder.h\"\n#include \"../../Common/LimitedStreams.h\"\n#include \"../../Common/OutMemStream.h\"\n#include \"../../Common/ProgressUtils.h\"\n#ifdef COMPRESS_MT\n#include \"../../Common/ProgressMt.h\"\n#endif\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"ZipAddCommon.h\"\n#include \"ZipOut.h\"\n#include \"ZipUpdate.h\"\n\nusing namespace NWindows;\nusing namespace NSynchronization;\n\nnamespace NArchive {\nnamespace NZip {\n\nstatic const Byte kHostOS =\n  #ifdef _WIN32\n  NFileHeader::NHostOS::kFAT;\n  #else\n  NFileHeader::NHostOS::kUnix;\n  #endif\n\nstatic const Byte kMadeByHostOS = kHostOS;\nstatic const Byte kExtractHostOS = kHostOS;\n\nstatic const Byte kMethodForDirectory = NFileHeader::NCompressionMethod::kStored;\nstatic const Byte kExtractVersionForDirectory = NFileHeader::NCompressionMethod::kStoreExtractVersion;\n\nstatic HRESULT CopyBlockToArchive(ISequentialInStream *inStream,\n    COutArchive &outArchive, ICompressProgressInfo *progress)\n{\n  CMyComPtr<ISequentialOutStream> outStream;\n  outArchive.CreateStreamForCopying(&outStream);\n  CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;\n  return copyCoder->Code(inStream, outStream, NULL, NULL, progress);\n}\n\nstatic HRESULT WriteRange(IInStream *inStream, COutArchive &outArchive,\n    const CUpdateRange &range, ICompressProgressInfo *progress)\n{\n  UInt64 position;\n  RINOK(inStream->Seek(range.Position, STREAM_SEEK_SET, &position));\n\n  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;\n  CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);\n  streamSpec->SetStream(inStream);\n  streamSpec->Init(range.Size);\n\n  RINOK(CopyBlockToArchive(inStreamLimited, outArchive, progress));\n  return progress->SetRatioInfo(&range.Size, &range.Size);\n}\n\nstatic void SetFileHeader(\n    COutArchive &archive,\n    const CCompressionMethodMode &options,\n    const CUpdateItem &ui,\n    CItem &item)\n{\n  item.UnPackSize = ui.Size;\n  bool isDir;\n\n  item.ClearFlags();\n\n  if (ui.NewProperties)\n  {\n    isDir = ui.IsDir;\n    item.Name = ui.Name;\n    item.SetUtf8(ui.IsUtf8);\n    item.ExternalAttributes = ui.Attributes;\n    item.Time = ui.Time;\n    item.NtfsMTime = ui.NtfsMTime;\n    item.NtfsATime = ui.NtfsATime;\n    item.NtfsCTime = ui.NtfsCTime;\n    item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;\n  }\n  else\n    isDir = item.IsDir();\n\n  item.LocalHeaderPosition = archive.GetCurrentPosition();\n  item.MadeByVersion.HostOS = kMadeByHostOS;\n  item.MadeByVersion.Version = NFileHeader::NCompressionMethod::kMadeByProgramVersion;\n  \n  item.ExtractVersion.HostOS = kExtractHostOS;\n\n  item.InternalAttributes = 0; // test it\n  item.SetEncrypted(!isDir && options.PasswordIsDefined);\n  if (isDir)\n  {\n    item.ExtractVersion.Version = kExtractVersionForDirectory;\n    item.CompressionMethod = kMethodForDirectory;\n    item.PackSize = 0;\n    item.FileCRC = 0; // test it\n  }\n}\n\nstatic void SetItemInfoFromCompressingResult(const CCompressingResult &compressingResult,\n    bool isAesMode, Byte aesKeyMode, CItem &item)\n{\n  item.ExtractVersion.Version = compressingResult.ExtractVersion;\n  item.CompressionMethod = compressingResult.Method;\n  item.FileCRC = compressingResult.CRC;\n  item.UnPackSize = compressingResult.UnpackSize;\n  item.PackSize = compressingResult.PackSize;\n\n  item.LocalExtra.Clear();\n  item.CentralExtra.Clear();\n\n  if (isAesMode)\n  {\n    CWzAesExtraField wzAesField;\n    wzAesField.Strength = aesKeyMode;\n    wzAesField.Method = compressingResult.Method;\n    item.CompressionMethod = NFileHeader::NCompressionMethod::kWzAES;\n    item.FileCRC = 0;\n    CExtraSubBlock sb;\n    wzAesField.SetSubBlock(sb);\n    item.LocalExtra.SubBlocks.Add(sb);\n    item.CentralExtra.SubBlocks.Add(sb);\n  }\n}\n\n#ifdef COMPRESS_MT\n\nstatic THREAD_FUNC_DECL CoderThread(void *threadCoderInfo);\n\nstruct CThreadInfo\n{\n  #ifdef EXTERNAL_CODECS\n  CMyComPtr<ICompressCodecsInfo> _codecsInfo;\n  const CObjectVector<CCodecInfoEx> *_externalCodecs;\n  #endif\n\n  NWindows::CThread Thread;\n  NWindows::NSynchronization::CAutoResetEvent CompressEvent;\n  NWindows::NSynchronization::CAutoResetEventWFMO CompressionCompletedEvent;\n  bool ExitThread;\n\n  CMtCompressProgress *ProgressSpec;\n  CMyComPtr<ICompressProgressInfo> Progress;\n\n  COutMemStream *OutStreamSpec;\n  CMyComPtr<IOutStream> OutStream;\n  CMyComPtr<ISequentialInStream> InStream;\n\n  CAddCommon Coder;\n  HRESULT Result;\n  CCompressingResult CompressingResult;\n\n  bool IsFree;\n  UInt32 UpdateIndex;\n\n  CThreadInfo(const CCompressionMethodMode &options):\n      ExitThread(false),\n      ProgressSpec(0),\n      OutStreamSpec(0),\n      Coder(options)\n  {}\n  \n  HRESULT CreateEvents(CSynchro *sync)\n  {\n    RINOK(CompressEvent.CreateIfNotCreated());\n    return CompressionCompletedEvent.CreateIfNotCreated(sync);\n  }\n  HRes CreateThread() { return Thread.Create(CoderThread, this); }\n\n  void WaitAndCode();\n  void StopWaitClose()\n  {\n    ExitThread = true;\n    if (OutStreamSpec != 0)\n      OutStreamSpec->StopWriting(E_ABORT);\n    if (CompressEvent.IsCreated())\n      CompressEvent.Set();\n    Thread.Wait();\n    Thread.Close();\n  }\n\n};\n\nvoid CThreadInfo::WaitAndCode()\n{\n  for (;;)\n  {\n    CompressEvent.Lock();\n    if (ExitThread)\n      return;\n    Result = Coder.Compress(\n        #ifdef EXTERNAL_CODECS\n        _codecsInfo, _externalCodecs,\n        #endif\n        InStream, OutStream, Progress, CompressingResult);\n    if (Result == S_OK && Progress)\n      Result = Progress->SetRatioInfo(&CompressingResult.UnpackSize, &CompressingResult.PackSize);\n    CompressionCompletedEvent.Set();\n  }\n}\n\nstatic THREAD_FUNC_DECL CoderThread(void *threadCoderInfo)\n{\n  ((CThreadInfo *)threadCoderInfo)->WaitAndCode();\n  return 0;\n}\n\nclass CThreads\n{\npublic:\n  CObjectVector<CThreadInfo> Threads;\n  ~CThreads()\n  {\n    for (int i = 0; i < Threads.Size(); i++)\n      Threads[i].StopWaitClose();\n  }\n};\n\nstruct CMemBlocks2: public CMemLockBlocks\n{\n  CCompressingResult CompressingResult;\n  bool Defined;\n  bool Skip;\n  CMemBlocks2(): Defined(false), Skip(false) {}\n};\n\nclass CMemRefs\n{\npublic:\n  CMemBlockManagerMt *Manager;\n  CObjectVector<CMemBlocks2> Refs;\n  CMemRefs(CMemBlockManagerMt *manager): Manager(manager) {} ;\n  ~CMemRefs()\n  {\n    for (int i = 0; i < Refs.Size(); i++)\n      Refs[i].FreeOpt(Manager);\n  }\n};\n\nclass CMtProgressMixer2:\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\n  UInt64 ProgressOffset;\n  UInt64 InSizes[2];\n  UInt64 OutSizes[2];\n  CMyComPtr<IProgress> Progress;\n  CMyComPtr<ICompressProgressInfo> RatioProgress;\n  bool _inSizeIsMain;\npublic:\n  NWindows::NSynchronization::CCriticalSection CriticalSection;\n  MY_UNKNOWN_IMP\n  void Create(IProgress *progress, bool inSizeIsMain);\n  void SetProgressOffset(UInt64 progressOffset);\n  HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize);\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n};\n\nvoid CMtProgressMixer2::Create(IProgress *progress, bool inSizeIsMain)\n{\n  Progress = progress;\n  Progress.QueryInterface(IID_ICompressProgressInfo, &RatioProgress);\n  _inSizeIsMain = inSizeIsMain;\n  ProgressOffset = InSizes[0] = InSizes[1] = OutSizes[0] = OutSizes[1] = 0;\n}\n\nvoid CMtProgressMixer2::SetProgressOffset(UInt64 progressOffset)\n{\n  CriticalSection.Enter();\n  InSizes[1] = OutSizes[1] = 0;\n  ProgressOffset = progressOffset;\n  CriticalSection.Leave();\n}\n\nHRESULT CMtProgressMixer2::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize)\n{\n  NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);\n  if (index == 0 && RatioProgress)\n  {\n    RINOK(RatioProgress->SetRatioInfo(inSize, outSize));\n  }\n  if (inSize != 0)\n    InSizes[index] = *inSize;\n  if (outSize != 0)\n    OutSizes[index] = *outSize;\n  UInt64 v = ProgressOffset + (_inSizeIsMain  ?\n      (InSizes[0] + InSizes[1]) :\n      (OutSizes[0] + OutSizes[1]));\n  return Progress->SetCompleted(&v);\n}\n\nSTDMETHODIMP CMtProgressMixer2::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  return SetRatioInfo(0, inSize, outSize);\n}\n\nclass CMtProgressMixer:\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\npublic:\n  CMtProgressMixer2 *Mixer2;\n  CMyComPtr<ICompressProgressInfo> RatioProgress;\n  void Create(IProgress *progress, bool inSizeIsMain);\n  MY_UNKNOWN_IMP\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n};\n\nvoid CMtProgressMixer::Create(IProgress *progress, bool inSizeIsMain)\n{\n  Mixer2 = new CMtProgressMixer2;\n  RatioProgress = Mixer2;\n  Mixer2->Create(progress, inSizeIsMain);\n}\n\nSTDMETHODIMP CMtProgressMixer::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  return Mixer2->SetRatioInfo(1, inSize, outSize);\n}\n\n\n#endif\n\n\nstatic HRESULT UpdateItemOldData(COutArchive &archive,\n    IInStream *inStream,\n    const CUpdateItem &ui, CItemEx &item,\n    /* bool izZip64, */\n    ICompressProgressInfo *progress,\n    UInt64 &complexity)\n{\n  if (ui.NewProperties)\n  {\n    if (item.HasDescriptor())\n      return E_NOTIMPL;\n    \n    // use old name size.\n    // CUpdateRange range(item.GetLocalExtraPosition(), item.LocalExtraSize + item.PackSize);\n    CUpdateRange range(item.GetDataPosition(), item.PackSize);\n    \n    // item.ExternalAttributes = ui.Attributes;\n    // Test it\n    item.Name = ui.Name;\n    item.SetUtf8(ui.IsUtf8);\n    item.Time = ui.Time;\n    item.NtfsMTime = ui.NtfsMTime;\n    item.NtfsATime = ui.NtfsATime;\n    item.NtfsCTime = ui.NtfsCTime;\n    item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;\n\n    item.CentralExtra.RemoveUnknownSubBlocks();\n    item.LocalExtra.RemoveUnknownSubBlocks();\n    \n    archive.PrepareWriteCompressedData2((UInt16)item.Name.Length(), item.UnPackSize, item.PackSize, item.LocalExtra.HasWzAesField());\n    item.LocalHeaderPosition = archive.GetCurrentPosition();\n    archive.SeekToPackedDataPosition();\n    RINOK(WriteRange(inStream, archive, range, progress));\n    complexity += range.Size;\n    archive.WriteLocalHeader(item);\n  }\n  else\n  {\n    CUpdateRange range(item.LocalHeaderPosition, item.GetLocalFullSize());\n    \n    // set new header position\n    item.LocalHeaderPosition = archive.GetCurrentPosition();\n    \n    RINOK(WriteRange(inStream, archive, range, progress));\n    complexity += range.Size;\n    archive.MoveBasePosition(range.Size);\n  }\n  return S_OK;\n}\n\nstatic void WriteDirHeader(COutArchive &archive, const CCompressionMethodMode *options,\n    const CUpdateItem &ui, CItemEx &item)\n{\n  SetFileHeader(archive, *options, ui, item);\n  archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);\n  archive.WriteLocalHeader(item);\n}\n\nstatic HRESULT Update2St(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    COutArchive &archive,\n    CInArchive *inArchive,\n    IInStream *inStream,\n    const CObjectVector<CItemEx> &inputItems,\n    const CObjectVector<CUpdateItem> &updateItems,\n    const CCompressionMethodMode *options,\n    const CByteBuffer &comment,\n    IArchiveUpdateCallback *updateCallback)\n{\n  CLocalProgress *lps = new CLocalProgress;\n  CMyComPtr<ICompressProgressInfo> progress = lps;\n  lps->Init(updateCallback, true);\n\n  CAddCommon compressor(*options);\n  \n  CObjectVector<CItem> items;\n  UInt64 unpackSizeTotal = 0, packSizeTotal = 0;\n\n  for (int itemIndex = 0; itemIndex < updateItems.Size(); itemIndex++)\n  {\n    lps->InSize = unpackSizeTotal;\n    lps->OutSize = packSizeTotal;\n    RINOK(lps->SetCur());\n    const CUpdateItem &ui = updateItems[itemIndex];\n    CItemEx item;\n    if (!ui.NewProperties || !ui.NewData)\n    {\n      item = inputItems[ui.IndexInArchive];\n      if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)\n        return E_NOTIMPL;\n    }\n\n    if (ui.NewData)\n    {\n      bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());\n      if (isDir)\n      {\n        WriteDirHeader(archive, options, ui, item);\n      }\n      else\n      {\n        CMyComPtr<ISequentialInStream> fileInStream;\n        HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);\n        if (res == S_FALSE)\n        {\n          lps->ProgressOffset += ui.Size;\n          RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n          continue;\n        }\n        RINOK(res);\n\n        // file Size can be 64-bit !!!\n        SetFileHeader(archive, *options, ui, item);\n        archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);\n        CCompressingResult compressingResult;\n        CMyComPtr<IOutStream> outStream;\n        archive.CreateStreamForCompressing(&outStream);\n        RINOK(compressor.Compress(\n            EXTERNAL_CODECS_LOC_VARS\n            fileInStream, outStream, progress, compressingResult));\n        SetItemInfoFromCompressingResult(compressingResult, options->IsAesMode, options->AesKeyMode, item);\n        archive.WriteLocalHeader(item);\n        RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n        unpackSizeTotal += item.UnPackSize;\n        packSizeTotal += item.PackSize;\n      }\n    }\n    else\n    {\n      UInt64 complexity = 0;\n      lps->SendRatio = false;\n      RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));\n      lps->SendRatio = true;\n      lps->ProgressOffset += complexity;\n    }\n    items.Add(item);\n    lps->ProgressOffset += NFileHeader::kLocalBlockSize;\n  }\n  archive.WriteCentralDir(items, comment);\n  return S_OK;\n}\n\nstatic HRESULT Update2(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    COutArchive &archive,\n    CInArchive *inArchive,\n    IInStream *inStream,\n    const CObjectVector<CItemEx> &inputItems,\n    const CObjectVector<CUpdateItem> &updateItems,\n    const CCompressionMethodMode *options,\n    const CByteBuffer &comment,\n    IArchiveUpdateCallback *updateCallback)\n{\n  UInt64 complexity = 0;\n  UInt64 numFilesToCompress = 0;\n  UInt64 numBytesToCompress = 0;\n \n  int i;\n  for(i = 0; i < updateItems.Size(); i++)\n  {\n    const CUpdateItem &ui = updateItems[i];\n    if (ui.NewData)\n    {\n      complexity += ui.Size;\n      numBytesToCompress += ui.Size;\n      numFilesToCompress++;\n      /*\n      if (ui.Commented)\n        complexity += ui.CommentRange.Size;\n      */\n    }\n    else\n    {\n      CItemEx inputItem = inputItems[ui.IndexInArchive];\n      if (inArchive->ReadLocalItemAfterCdItemFull(inputItem) != S_OK)\n        return E_NOTIMPL;\n      complexity += inputItem.GetLocalFullSize();\n      // complexity += inputItem.GetCentralExtraPlusCommentSize();\n    }\n    complexity += NFileHeader::kLocalBlockSize;\n    complexity += NFileHeader::kCentralBlockSize;\n  }\n\n  if (comment != 0)\n    complexity += comment.GetCapacity();\n  complexity++; // end of central\n  updateCallback->SetTotal(complexity);\n\n  CAddCommon compressor(*options);\n  \n  complexity = 0;\n  \n  #ifdef COMPRESS_MT\n\n  const size_t kNumMaxThreads = (1 << 10);\n  UInt32 numThreads = options->NumThreads;\n  if (numThreads > kNumMaxThreads)\n    numThreads = kNumMaxThreads;\n  \n  const size_t kMemPerThread = (1 << 25);\n  const size_t kBlockSize = 1 << 16;\n\n  CCompressionMethodMode options2;\n  if (options != 0)\n    options2 = *options;\n\n  bool mtMode = ((options != 0) && (numThreads > 1));\n\n  if (numFilesToCompress <= 1)\n    mtMode = false;\n\n  if (mtMode)\n  {\n    Byte method = options->MethodSequence.Front();\n    if (method == NFileHeader::NCompressionMethod::kStored && !options->PasswordIsDefined)\n      mtMode = false;\n    if (method == NFileHeader::NCompressionMethod::kBZip2)\n    {\n      UInt64 averageSize = numBytesToCompress / numFilesToCompress;\n      UInt32 blockSize = options->DicSize;\n      if (blockSize == 0)\n        blockSize = 1;\n      UInt64 averageNumberOfBlocks = averageSize / blockSize;\n      UInt32 numBZip2Threads = 32;\n      if (averageNumberOfBlocks < numBZip2Threads)\n        numBZip2Threads = (UInt32)averageNumberOfBlocks;\n      if (numBZip2Threads < 1)\n        numBZip2Threads = 1;\n      numThreads = numThreads / numBZip2Threads;\n      options2.NumThreads = numBZip2Threads;\n      if (numThreads <= 1)\n        mtMode = false;\n    }\n    if (method == NFileHeader::NCompressionMethod::kLZMA)\n    {\n      UInt32 numLZMAThreads = (options->Algo > 0 ? 2 : 1);\n      numThreads /= numLZMAThreads;\n      options2.NumThreads = numLZMAThreads;\n      if (numThreads <= 1)\n        mtMode = false;\n    }\n  }\n\n  if (!mtMode)\n  #endif\n    return Update2St(\n        EXTERNAL_CODECS_LOC_VARS\n        archive, inArchive,inStream,\n        inputItems, updateItems, options, comment, updateCallback);\n\n\n  #ifdef COMPRESS_MT\n\n  // Warning : before memManager, threads and compressingCompletedEvents\n  // in order to have a \"good\" order for the destructor\n  NWindows::NSynchronization::CSynchro synchroForCompressingCompletedEvents;\n  synchroForCompressingCompletedEvents.Create();\n  NWindows::NSynchronization::CSynchro synchroForOutStreamSpec;\n  synchroForOutStreamSpec.Create();\n  \n\n  CObjectVector<CItem> items;\n\n  CMtProgressMixer *mtProgressMixerSpec = new CMtProgressMixer;\n  CMyComPtr<ICompressProgressInfo> progress = mtProgressMixerSpec;\n  mtProgressMixerSpec->Create(updateCallback, true);\n\n  CMtCompressProgressMixer mtCompressProgressMixer;\n  mtCompressProgressMixer.Init(numThreads, mtProgressMixerSpec->RatioProgress);\n\n  CMemBlockManagerMt memManager(kBlockSize);\n  CMemRefs refs(&memManager);\n\n  CThreads threads;\n  CRecordVector<HANDLE> compressingCompletedEvents;\n  CRecordVector<int> threadIndices;  // list threads in order of updateItems\n\n  {\n    RINOK(memManager.AllocateSpaceAlways(&synchroForOutStreamSpec,(size_t)numThreads * (kMemPerThread / kBlockSize)));\n    for(i = 0; i < updateItems.Size(); i++)\n      refs.Refs.Add(CMemBlocks2());\n\n    UInt32 i;\n    for (i = 0; i < numThreads; i++)\n      threads.Threads.Add(CThreadInfo(options2));\n\n    for (i = 0; i < numThreads; i++)\n    {\n      CThreadInfo &threadInfo = threads.Threads[i];\n      #ifdef EXTERNAL_CODECS\n      threadInfo._codecsInfo = codecsInfo;\n      threadInfo._externalCodecs = externalCodecs;\n      #endif\n      RINOK(threadInfo.CreateEvents(&synchroForCompressingCompletedEvents));\n      threadInfo.OutStreamSpec = new COutMemStream(&memManager);\n      RINOK(threadInfo.OutStreamSpec->CreateEvents(&synchroForOutStreamSpec));\n      threadInfo.OutStream = threadInfo.OutStreamSpec;\n      threadInfo.IsFree = true;\n      threadInfo.ProgressSpec = new CMtCompressProgress();\n      threadInfo.Progress = threadInfo.ProgressSpec;\n      threadInfo.ProgressSpec->Init(&mtCompressProgressMixer, (int)i);\n      RINOK(threadInfo.CreateThread());\n    }\n  }\n  int mtItemIndex = 0;\n\n  int itemIndex = 0;\n  int lastRealStreamItemIndex = -1;\n\n  while (itemIndex < updateItems.Size())\n  {\n    if ((UInt32)threadIndices.Size() < numThreads && mtItemIndex < updateItems.Size())\n    {\n      const CUpdateItem &ui = updateItems[mtItemIndex++];\n      if (!ui.NewData)\n        continue;\n      CItemEx item;\n      if (ui.NewProperties)\n      {\n        if (ui.IsDir)\n          continue;\n      }\n      else\n      {\n        item = inputItems[ui.IndexInArchive];\n        if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)\n          return E_NOTIMPL;\n        if (item.IsDir())\n          continue;\n      }\n      CMyComPtr<ISequentialInStream> fileInStream;\n      {\n        NWindows::NSynchronization::CCriticalSectionLock lock(mtProgressMixerSpec->Mixer2->CriticalSection);\n        HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);\n        if (res == S_FALSE)\n        {\n          complexity += ui.Size;\n          complexity += NFileHeader::kLocalBlockSize;\n          mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);\n          RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n          refs.Refs[mtItemIndex - 1].Skip = true;\n          continue;\n        }\n        RINOK(res);\n        RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n      }\n\n      for (UInt32 i = 0; i < numThreads; i++)\n      {\n        CThreadInfo &threadInfo = threads.Threads[i];\n        if (threadInfo.IsFree)\n        {\n          threadInfo.IsFree = false;\n          threadInfo.InStream = fileInStream;\n\n          // !!!!! we must release ref before sending event\n          // BUG was here in v4.43 and v4.44. It could change ref counter in two threads in same time\n          fileInStream.Release();\n\n          threadInfo.OutStreamSpec->Init();\n          threadInfo.ProgressSpec->Reinit();\n          threadInfo.CompressEvent.Set();\n          threadInfo.UpdateIndex = mtItemIndex - 1;\n\n          compressingCompletedEvents.Add(threadInfo.CompressionCompletedEvent);\n          threadIndices.Add(i);\n          break;\n        }\n      }\n      continue;\n    }\n    \n    if (refs.Refs[itemIndex].Skip)\n    {\n      itemIndex++;\n      continue;\n    }\n\n    const CUpdateItem &ui = updateItems[itemIndex];\n\n    CItemEx item;\n    if (!ui.NewProperties || !ui.NewData)\n    {\n      item = inputItems[ui.IndexInArchive];\n      if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)\n        return E_NOTIMPL;\n    }\n\n    if (ui.NewData)\n    {\n      bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());\n      if (isDir)\n      {\n        WriteDirHeader(archive, options, ui, item);\n      }\n      else\n      {\n        if (lastRealStreamItemIndex < itemIndex)\n        {\n          lastRealStreamItemIndex = itemIndex;\n          SetFileHeader(archive, *options, ui, item);\n          // file Size can be 64-bit !!!\n          archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);\n        }\n\n        CMemBlocks2 &memRef = refs.Refs[itemIndex];\n        if (memRef.Defined)\n        {\n          CMyComPtr<IOutStream> outStream;\n          archive.CreateStreamForCompressing(&outStream);\n          memRef.WriteToStream(memManager.GetBlockSize(), outStream);\n          SetItemInfoFromCompressingResult(memRef.CompressingResult,\n              options->IsAesMode, options->AesKeyMode, item);\n          SetFileHeader(archive, *options, ui, item);\n          archive.WriteLocalHeader(item);\n          // RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));\n          memRef.FreeOpt(&memManager);\n        }\n        else\n        {\n          {\n            CThreadInfo &thread = threads.Threads[threadIndices.Front()];\n            if (!thread.OutStreamSpec->WasUnlockEventSent())\n            {\n              CMyComPtr<IOutStream> outStream;\n              archive.CreateStreamForCompressing(&outStream);\n              thread.OutStreamSpec->SetOutStream(outStream);\n              thread.OutStreamSpec->SetRealStreamMode();\n            }\n          }\n\n          DWORD result = ::WaitForMultipleObjects(compressingCompletedEvents.Size(),\n              &compressingCompletedEvents.Front(), FALSE, INFINITE);\n          int t = (int)(result - WAIT_OBJECT_0);\n          CThreadInfo &threadInfo = threads.Threads[threadIndices[t]];\n          threadInfo.InStream.Release();\n          threadInfo.IsFree = true;\n          RINOK(threadInfo.Result);\n          threadIndices.Delete(t);\n          compressingCompletedEvents.Delete(t);\n          if (t == 0)\n          {\n            RINOK(threadInfo.OutStreamSpec->WriteToRealStream());\n            threadInfo.OutStreamSpec->ReleaseOutStream();\n            SetItemInfoFromCompressingResult(threadInfo.CompressingResult,\n                options->IsAesMode, options->AesKeyMode, item);\n            SetFileHeader(archive, *options, ui, item);\n            archive.WriteLocalHeader(item);\n          }\n          else\n          {\n            CMemBlocks2 &memRef = refs.Refs[threadInfo.UpdateIndex];\n            threadInfo.OutStreamSpec->DetachData(memRef);\n            memRef.CompressingResult = threadInfo.CompressingResult;\n            memRef.Defined = true;\n            continue;\n          }\n        }\n      }\n    }\n    else\n    {\n      RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));\n    }\n    items.Add(item);\n    complexity += NFileHeader::kLocalBlockSize;\n    mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);\n    itemIndex++;\n  }\n  archive.WriteCentralDir(items, comment);\n  return S_OK;\n  #endif\n}\n\nHRESULT Update(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    const CObjectVector<CItemEx> &inputItems,\n    const CObjectVector<CUpdateItem> &updateItems,\n    ISequentialOutStream *seqOutStream,\n    CInArchive *inArchive,\n    CCompressionMethodMode *compressionMethodMode,\n    IArchiveUpdateCallback *updateCallback)\n{\n  CMyComPtr<IOutStream> outStream;\n  RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream));\n  if (!outStream)\n    return E_NOTIMPL;\n\n  CInArchiveInfo archiveInfo;\n  if(inArchive != 0)\n  {\n    inArchive->GetArchiveInfo(archiveInfo);\n    if (archiveInfo.Base != 0)\n      return E_NOTIMPL;\n  }\n  else\n    archiveInfo.StartPosition = 0;\n  \n  COutArchive outArchive;\n  outArchive.Create(outStream);\n  if (archiveInfo.StartPosition > 0)\n  {\n    CMyComPtr<ISequentialInStream> inStream;\n    inStream.Attach(inArchive->CreateLimitedStream(0, archiveInfo.StartPosition));\n    RINOK(CopyBlockToArchive(inStream, outArchive, NULL));\n    outArchive.MoveBasePosition(archiveInfo.StartPosition);\n  }\n  CMyComPtr<IInStream> inStream;\n  if(inArchive != 0)\n    inStream.Attach(inArchive->CreateStream());\n\n  return Update2(\n      EXTERNAL_CODECS_LOC_VARS\n      outArchive, inArchive, inStream,\n      inputItems, updateItems,\n      compressionMethodMode,\n      archiveInfo.Comment, updateCallback);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/Zip/ZipUpdate.h",
    "content": "// Zip/Update.h\n\n#ifndef __ZIP_UPDATE_H\n#define __ZIP_UPDATE_H\n\n#include \"../../ICoder.h\"\n#include \"../IArchive.h\"\n\n#include \"../../Common/CreateCoder.h\"\n\n#include \"ZipCompressionMode.h\"\n#include \"ZipIn.h\"\n\nnamespace NArchive {\nnamespace NZip {\n\nstruct CUpdateRange\n{\n  UInt64 Position;\n  UInt64 Size;\n  CUpdateRange() {};\n  CUpdateRange(UInt64 position, UInt64 size): Position(position), Size(size) {};\n};\n\nstruct CUpdateItem\n{\n  bool NewData;\n  bool NewProperties;\n  bool IsDir;\n  bool NtfsTimeIsDefined;\n  bool IsUtf8;\n  int IndexInArchive;\n  int IndexInClient;\n  UInt32 Attributes;\n  UInt32 Time;\n  UInt64 Size;\n  AString Name;\n  // bool Commented;\n  // CUpdateRange CommentRange;\n  FILETIME NtfsMTime;\n  FILETIME NtfsATime;\n  FILETIME NtfsCTime;\n\n  CUpdateItem(): NtfsTimeIsDefined(false), IsUtf8(false), Size(0) {}\n};\n\nHRESULT Update(\n    DECL_EXTERNAL_CODECS_LOC_VARS\n    const CObjectVector<CItemEx> &inputItems,\n    const CObjectVector<CUpdateItem> &updateItems,\n    ISequentialOutStream *seqOutStream,\n    CInArchive *inArchive,\n    CCompressionMethodMode *compressionMethodMode,\n    IArchiveUpdateCallback *updateCallback);\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Archive/obj/local/armeabi-v7a/gdb.setup",
    "content": "file obj/local/armeabi-v7a/app_process\ntarget remote :5039\nfile obj/local/armeabi-v7a/app_process\ntarget remote :5039\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Alone/makefile",
    "content": "LOCAL_FLAGS= \\\n  -DCOMPRESS_MT \\\n  -DCOMPRESS_BZIP2_MT \\\n  -DCOMPRESS_MF_MT \\\n  -DBREAK_HANDLER \\\n  -DBENCH_MT\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nPROG=../../../../bin/7za$(BINSUFFIX)\n\nLIBS=$(LOCAL_LIBS)\n\nCONSOLE_OBJS = \\\n  ConsoleClose.o \\\n  ExtractCallbackConsole.o \\\n  List.o \\\n  Main.o \\\n  MainAr.o \\\n  OpenCallbackConsole.o \\\n  PercentPrinter.o \\\n  UpdateCallbackConsole.o \\\n  UserInputUtils.o\n\nCOMMON_OBJS = \\\n  CommandLineParser.o \\\n  CRC.o \\\n  IntToString.o \\\n  ListFileUtils.o \\\n  StdInStream.o \\\n  StdOutStream.o \\\n  MyString.o \\\n  StringConvert.o \\\n  StringToInt.o \\\n  UTFConvert.o \\\n  MyWindows.o \\\n  MyVector.o \\\n  Wildcard.o\n\n# DLL.o MemoryLock.o \nWIN_OBJS = \\\n  Error.o \\\n  FileDir.o \\\n  FileFind.o \\\n  FileIO.o \\\n  FileName.o \\\n  PropVariant.o \\\n  PropVariantConversions.o \\\n  Synchronization.o \\\n  System.o \\\n  Time.o\n\n7ZIP_COMMON_OBJS = \\\n  CreateCoder.o \\\n  FilePathAutoRename.o \\\n  FileStreams.o \\\n  FilterCoder.o \\\n  InBuffer.o \\\n  InOutTempBuffer.o \\\n  LimitedStreams.o \\\n  LockedStream.o \\\n  MemBlocks.o \\\n  MethodId.o \\\n  MethodProps.o \\\n  OffsetStream.o \\\n  OutBuffer.o \\\n  OutMemStream.o \\\n  ProgressMt.o \\\n  ProgressUtils.o \\\n  StreamBinder.o \\\n  StreamObjects.o \\\n  StreamUtils.o \\\n  VirtThread.o\n\n# WorkDir.o\nUI_COMMON_OBJS = \\\n  ArchiveCommandLine.o \\\n  ArchiveExtractCallback.o \\\n  ArchiveOpenCallback.o \\\n  DefaultName.o \\\n  EnumDirItems.o \\\n  Extract.o \\\n  ExtractingFilePath.o \\\n  LoadCodecs.o \\\n  OpenArchive.o \\\n  PropIDUtils.o \\\n  SetProperties.o \\\n  SortUtils.o \\\n  TempFiles.o \\\n  Update.o \\\n  UpdateAction.o \\\n  UpdateCallback.o \\\n  UpdatePair.o \\\n  UpdateProduce.o \\\n\nAR_OBJS = \\\n  ZHandler.o \\\n\nAR_COMMON_OBJS = \\\n  CoderMixer2.o \\\n  CoderMixer2MT.o \\\n  CrossThreadProgress.o \\\n  DummyOutStream.o \\\n  FindSignature.o \\\n  HandlerOut.o \\\n  InStreamWithCRC.o \\\n  ItemNameUtils.o \\\n  MultiStream.o \\\n  OutStreamWithCRC.o \\\n  ParseProperties.o\n\n\n7Z_OBJS = \\\n  7zCompressionMode.o \\\n  7zDecode.o \\\n  7zEncode.o \\\n  7zExtract.o \\\n  7zFolderInStream.o \\\n  7zFolderOutStream.o \\\n  7zHandler.o \\\n  7zHandlerOut.o \\\n  7zHeader.o \\\n  7zIn.o \\\n  7zOut.o \\\n  7zProperties.o \\\n  7zSpecStream.o \\\n  7zUpdate.o \\\n  7zRegister.o\n\nBZ2_OBJS = \\\n  BZip2Handler.o \\\n  BZip2HandlerOut.o \\\n  BZip2Update.o \\\n  bz2Register.o \\\n\nCAB_OBJS = \\\n  CabBlockInStream.o \\\n  CabHandler.o \\\n  CabHeader.o \\\n  CabIn.o \\\n  CabRegister.o \\\n\nGZ_OBJS = \\\n  GZipHandler.o \\\n  GZipHandlerOut.o \\\n  GZipHeader.o \\\n  GZipIn.o \\\n  GZipOut.o \\\n  GZipUpdate.o \\\n  GZipRegister.o \\\n\nLZM_OBJS = \\\n  LzmaArcRegister.o \\\n  LzmaFiltersDecode.o \\\n  LzmaHandler.o \\\n  LzmaIn.o \\\n\n# SplitHandlerOut.o\nSPLIT_OBJS = \\\n  SplitHandler.o \\\n  SplitRegister.o\n\nTAR_OBJS = \\\n  TarHandler.o \\\n  TarHandlerOut.o \\\n  TarHeader.o \\\n  TarIn.o \\\n  TarOut.o \\\n  TarUpdate.o \\\n  TarRegister.o\n\nZIP_OBJS = \\\n  ZipAddCommon.o \\\n  ZipHandler.o \\\n  ZipHandlerOut.o \\\n  ZipHeader.o \\\n  ZipIn.o \\\n  ZipItem.o \\\n  ZipOut.o \\\n  ZipUpdate.o \\\n  ZipRegister.o\n\nCOMPRESS_OBJS = \\\n  Bcj2Coder.o \\\n  Bcj2Register.o \\\n  BcjCoder.o \\\n  BcjRegister.o \\\n  BitlDecoder.o \\\n  BranchCoder.o \\\n  BranchMisc.o \\\n  BranchRegister.o \\\n  ByteSwap.o \\\n  ByteSwapRegister.o \\\n  BZip2Crc.o \\\n  BZip2Decoder.o \\\n  BZip2Encoder.o \\\n  BZip2Register.o \\\n  CopyCoder.o \\\n  CopyRegister.o \\\n  Deflate64Register.o \\\n  DeflateDecoder.o \\\n  DeflateEncoder.o \\\n  DeflateRegister.o \\\n  ImplodeDecoder.o \\\n  ImplodeHuffmanDecoder.o \\\n  LzmaDecoder.o \\\n  LzmaEncoder.o \\\n  LzmaRegister.o \\\n  LzOutWindow.o \\\n  Lzx86Converter.o \\\n  LzxDecoder.o \\\n  PpmdDecoder.o \\\n  PpmdEncoder.o \\\n  PpmdRegister.o \\\n  QuantumDecoder.o \\\n  ShrinkDecoder.o \\\n  ZDecoder.o \\\n\nLZMA_BENCH_OBJS = \\\n  LzmaBench.o \\\n  LzmaBenchCon.o \\\n\nCRYPTO_OBJS = \\\n  7zAes.o \\\n  7zAesRegister.o \\\n  HmacSha1.o \\\n  MyAes.o \\\n  Pbkdf2HmacSha1.o \\\n  RandGen.o \\\n  Sha1.o \\\n  WzAes.o \\\n  ZipCrypto.o \\\n  ZipStrong.o \\\n\n# Alloc.o\nC_OBJS = \\\n  Bra.o \\\n  Bra86.o \\\n  BraIA64.o \\\n  BwtSort.o \\\n  HuffEnc.o \\\n  LzFind.o \\\n  LzFindMt.o \\\n  LzmaDec.o \\\n  LzmaEnc.o \\\n  Sort.o \\\n  Threads.o \\\n  Aes.o \\\n  Sha256.o\n\nOBJS=\\\nmyGetTickCount.o \\\nwine_date_and_time.o \\\nmyAddExeFlag.o \\\nmySplitCommandLine.o \\\n  $(CONSOLE_OBJS) \\\n  $(COMMON_OBJS) \\\n  $(WIN_OBJS) \\\n  $(7ZIP_COMMON_OBJS) \\\n  $(UI_COMMON_OBJS) \\\n  $(AR_OBJS) \\\n  $(AR_COMMON_OBJS) \\\n  $(7Z_OBJS) \\\n  $(BZ2_OBJS) \\\n  $(CAB_OBJS) \\\n  $(GZ_OBJS) \\\n  $(LZM_OBJS) \\\n  $(SPLIT_OBJS) \\\n  $(TAR_OBJS) \\\n  $(ZIP_OBJS) \\\n  $(COMPRESS_OBJS) \\\n  $(LZMA_BENCH_OBJS) \\\n  $(CRYPTO_OBJS) \\\n  $(C_OBJS) \\\n  $(OBJ_CRC32)\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Alone/makefile.depend",
    "content": "myGetTickCount.o: ../../../myWindows/myGetTickCount.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\nwine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nmyAddExeFlag.o: ../../../myWindows/myAddExeFlag.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../myWindows/myPrivate.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nmySplitCommandLine.o: ../../../myWindows/mySplitCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../myWindows/../Common/StringConvert.h \\\n  ../../../myWindows/../Common/MyWindows.h \\\n  ../../../myWindows/../Common/MyString.h \\\n  ../../../myWindows/../Common/MyVector.h \\\n  ../../../myWindows/../Common/Defs.h \\\n  ../../../myWindows/../Common/Types.h ../../../myWindows/myPrivate.h\nConsoleClose.o: ../../UI/Console/ConsoleClose.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/ConsoleClose.h\nExtractCallbackConsole.o: ../../UI/Console/ExtractCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Console/ExtractCallbackConsole.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Console/../../Common/../IStream.h \\\n  ../../UI/Console/../../Common/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Common/../../Common/MyWindows.h \\\n  ../../UI/Console/../../Common/../../Common/Types.h \\\n  ../../UI/Console/../../Common/../IDecl.h \\\n  ../../UI/Console/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../../../Common/Types.h ../../UI/Console/../../IDecl.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../../Archive/../IStream.h \\\n  ../../UI/Console/../../Archive/../IProgress.h \\\n  ../../UI/Console/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../../Archive/../IDecl.h \\\n  ../../UI/Console/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../UI/Console/../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/UserInputUtils.h ../../UI/Console/ConsoleClose.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Error.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Console/../../Common/FilePathAutoRename.h \\\n  ../../UI/Console/../Common/ExtractingFilePath.h\nList.o: ../../UI/Console/List.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Console/List.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../../IStream.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/MyCom.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/Error.h ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/PropIDUtils.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/OpenArchive.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyCom.h ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h\nMain.o: ../../UI/Console/Main.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyInitGuid.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyException.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Common/ListFileUtils.h ../../../Common/StdInStream.h \\\n  ../../../Common/StdOutStream.h ../../../Common/StringConvert.h \\\n  ../../../Common/StringToInt.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../../../Common/MyWindows.h \\\n  ../../UI/Console/../../../Common/Types.h ../../UI/Console/../../IDecl.h \\\n  ../../UI/Console/../../ICoder.h ../../UI/Console/../../IStream.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/Extract.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/../Common/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/ArchiveCommandLine.h \\\n  ../../../Common/CommandLineParser.h \\\n  ../../UI/Console/../Common/Extract.h \\\n  ../../UI/Console/../Common/Update.h \\\n  ../../UI/Console/../Common/ExitCode.h \\\n  ../../UI/Console/../../Compress/LZMA_Alone/LzmaBenchCon.h \\\n  ../../UI/Console/../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../UI/Console/List.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Console/ExtractCallbackConsole.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/UpdateCallbackConsole.h \\\n  ../../UI/Console/PercentPrinter.h ../../../Common/Types.h \\\n  ../../UI/Console/../../MyVersion.h ../../../myWindows/myPrivate.h \\\n  ../../../Windows/System.h ../../../Windows/../Common/Types.h\nMainAr.o: ../../UI/Console/MainAr.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h ../../../Common/NewHandler.h \\\n  ../../../Common/MyException.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/ExitCode.h \\\n  ../../UI/Console/../Common/ArchiveCommandLine.h \\\n  ../../../Common/Wildcard.h ../../../Common/CommandLineParser.h \\\n  ../../UI/Console/../Common/Extract.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h ../../UI/Console/../Common/../../IDecl.h \\\n  ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/Update.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/LoadCodecs.h ../../UI/Console/ConsoleClose.h\nOpenCallbackConsole.o: ../../UI/Console/OpenCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/OpenCallbackConsole.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../UI/Console/UserInputUtils.h\nPercentPrinter.o: ../../UI/Console/PercentPrinter.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Console/PercentPrinter.h \\\n  ../../../Common/Types.h ../../../Common/StdOutStream.h\nUpdateCallbackConsole.o: ../../UI/Console/UpdateCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Console/UpdateCallbackConsole.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h ../../UI/Console/PercentPrinter.h \\\n  ../../../Common/Types.h ../../UI/Console/../Common/Update.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../../IStream.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../UI/Console/ConsoleClose.h ../../UI/Console/UserInputUtils.h\nUserInputUtils.o: ../../UI/Console/UserInputUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../UI/Console/UserInputUtils.h \\\n  ../../../Common/StdOutStream.h ../../../Common/MyException.h\nCommandLineParser.o: ../../../Common/CommandLineParser.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nCRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/../../C/7zCrc.h ../../../Common/../../C/Types.h\nIntToString.o: ../../../Common/IntToString.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h\nListFileUtils.o: ../../../Common/ListFileUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/MyWindows.h \\\n  ../../../Common/../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/ListFileUtils.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/UTFConvert.h\nStdInStream.o: ../../../Common/StdInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nStdOutStream.o: ../../../Common/StdOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nStringToInt.o: ../../../Common/StringToInt.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringToInt.h\nUTFConvert.o: ../../../Common/UTFConvert.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nError.o: ../../../Windows/Error.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileName.o: ../../../Windows/FileName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantConversions.o: ../../../Windows/PropVariantConversions.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h\nSynchronization.o: ../../../Windows/Synchronization.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nSystem.o: ../../../Windows/System.cpp ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h\nTime.o: ../../../Windows/Time.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h\nCreateCoder.o: ../../Common/CreateCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MethodId.h \\\n  ../../Common/../../Common/Types.h \\\n  ../../Common/../../Windows/PropVariant.h \\\n  ../../Common/../../Windows/../Common/MyWindows.h \\\n  ../../Common/../../Windows/../Common/Types.h \\\n  ../../Common/../../Windows/Defs.h ../../Common/FilterCoder.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../IPassword.h \\\n  ../../Common/RegisterCodec.h ../../Common/../Common/MethodId.h\nFilePathAutoRename.o: ../../Common/FilePathAutoRename.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h\nFileStreams.o: ../../Common/FileStreams.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FileStreams.h ../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h\nFilterCoder.o: ../../Common/FilterCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FilterCoder.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../ICoder.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../IPassword.h ../../Common/../../../C/Alloc.h \\\n  ../../Common/../../Common/Defs.h ../../Common/StreamUtils.h \\\n  ../../Common/../IStream.h\nInBuffer.o: ../../Common/InBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/InBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nInOutTempBuffer.o: ../../Common/InOutTempBuffer.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/InOutTempBuffer.h \\\n  ../../Common/../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Common/../../Windows/FileDir.h \\\n  ../../Common/../../Windows/../Common/MyString.h \\\n  ../../Common/../../Windows/Defs.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/Defs.h \\\n  ../../Common/StreamUtils.h\nLimitedStreams.o: ../../Common/LimitedStreams.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/LimitedStreams.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nLockedStream.o: ../../Common/LockedStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/LockedStream.h \\\n  ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h\nMemBlocks.o: ../../Common/MemBlocks.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MemBlocks.h \\\n  ../../Common/../../../C/Alloc.h ../../../Common/Types.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h\nMethodId.o: ../../Common/MethodId.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/MethodId.h ../../Common/../../Common/Types.h \\\n  ../../Common/../../Common/MyString.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h\nMethodProps.o: ../../Common/MethodProps.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MethodProps.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Windows/PropVariant.h \\\n  ../../Common/../../Windows/../Common/MyWindows.h \\\n  ../../Common/../../Windows/../Common/Types.h ../../Common/MethodId.h \\\n  ../../Common/../../Common/Types.h\nOffsetStream.o: ../../Common/OffsetStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../Common/OffsetStream.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nOutBuffer.o: ../../Common/OutBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nOutMemStream.o: ../../Common/OutMemStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutMemStream.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Common/MemBlocks.h \\\n  ../../Common/../../../C/Alloc.h ../../../Common/Types.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nProgressMt.o: ../../Common/ProgressMt.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/ProgressMt.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h ../../Common/../ICoder.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../IProgress.h\nProgressUtils.o: ../../Common/ProgressUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/ProgressUtils.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../IProgress.h\nStreamBinder.o: ../../Common/StreamBinder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamBinder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/Defs.h ../../Common/../../Common/MyCom.h\nStreamObjects.o: ../../Common/StreamObjects.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/StreamObjects.h \\\n  ../../Common/../../Common/DynamicBuffer.h \\\n  ../../Common/../../Common/Buffer.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nVirtThread.o: ../../Common/VirtThread.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/VirtThread.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Windows/Thread.h\nArchiveCommandLine.o: ../../UI/Common/ArchiveCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ListFileUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringToInt.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h \\\n  ../../UI/Common/ArchiveCommandLine.h ../../../Common/Wildcard.h \\\n  ../../../Common/CommandLineParser.h ../../UI/Common/Extract.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/Property.h ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/Update.h ../../UI/Common/UpdateAction.h \\\n  ../../UI/Common/UpdateCallback.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/SortUtils.h ../../UI/Common/EnumDirItems.h \\\n  ../../UI/Common/DirItem.h ../../../myWindows/myPrivate.h\nArchiveExtractCallback.o: ../../UI/Common/ArchiveExtractCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/ComTry.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Common/../../Common/FilePathAutoRename.h \\\n  ../../UI/Common/../Common/ExtractingFilePath.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/ArchiveOpenCallback.h\nArchiveOpenCallback.o: ../../UI/Common/ArchiveOpenCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h\nDefaultName.o: ../../UI/Common/DefaultName.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/DefaultName.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nEnumDirItems.o: ../../UI/Common/EnumDirItems.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyCom.h \\\n  ../../UI/Common/EnumDirItems.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h\nExtract.o: ../../UI/Common/Extract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/Extract.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/Property.h ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/SetProperties.h\nExtractingFilePath.o: ../../UI/Common/ExtractingFilePath.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ExtractingFilePath.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nLoadCodecs.o: ../../UI/Common/LoadCodecs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/LoadCodecs.h ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/MyVector.h \\\n  ../../UI/Common/../../../Common/Defs.h \\\n  ../../UI/Common/../../../Common/Buffer.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/../../../Windows/PropVariant.h \\\n  ../../UI/Common/../../../Windows/../Common/MyWindows.h \\\n  ../../UI/Common/../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/RegisterArc.h \\\n  ../../UI/Common/../../Common/../Archive/IArchive.h\nOpenArchive.o: ../../UI/Common/OpenArchive.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/OpenArchive.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyCom.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/StreamUtils.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../UI/Common/DefaultName.h\nPropIDUtils.o: ../../UI/Common/PropIDUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/PropIDUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariantConversions.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../PropID.h\nSetProperties.o: ../../UI/Common/SetProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/SetProperties.h \\\n  ../../UI/Common/Property.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Common/StringToInt.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h\nSortUtils.o: ../../UI/Common/SortUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/SortUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nTempFiles.o: ../../UI/Common/TempFiles.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/TempFiles.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h\nUpdate.o: ../../UI/Common/Update.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/UpdateCallback.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../UI/Common/Property.h \\\n  ../../UI/Common/LoadCodecs.h ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Windows/FileDir.h \\\n  ../../../Windows/FileName.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/Time.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Compress/CopyCoder.h \\\n  ../../UI/Common/../../Compress/../../Common/MyCom.h \\\n  ../../UI/Common/../../Compress/../ICoder.h \\\n  ../../UI/Common/../Common/DirItem.h \\\n  ../../UI/Common/../Common/EnumDirItems.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../UI/Common/../Common/OpenArchive.h \\\n  ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/EnumDirItems.h ../../UI/Common/SetProperties.h \\\n  ../../UI/Common/TempFiles.h\nUpdateAction.o: ../../UI/Common/UpdateAction.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateAction.h\nUpdateCallback.o: ../../UI/Common/UpdateCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateCallback.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../ICoder.h ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../Common/../../Archive/../PropID.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h\nUpdatePair.o: ../../UI/Common/UpdatePair.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Time.h ../../../Common/Types.h \\\n  ../../UI/Common/UpdatePair.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h ../../UI/Common/SortUtils.h\nUpdateProduce.o: ../../UI/Common/UpdateProduce.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateProduce.h \\\n  ../../UI/Common/UpdatePair.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h\nZHandler.o: ../../Archive/ZHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Compress/ZDecoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h ../../../Common/MyCom.h\nCoderMixer2.o: ../../Archive/Common/CoderMixer2.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h\nCoderMixer2MT.o: ../../Archive/Common/CoderMixer2MT.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2MT.h \\\n  ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../Common/StreamBinder.h \\\n  ../../Archive/Common/../../Common/../IStream.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../Common/VirtThread.h \\\n  ../../Archive/Common/../../Common/../../Windows/Thread.h\nCrossThreadProgress.o: ../../Archive/Common/CrossThreadProgress.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/CrossThreadProgress.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../../Windows/Defs.h \\\n  ../../Archive/Common/../../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../../Common/MyCom.h\nDummyOutStream.o: ../../Archive/Common/DummyOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h\nFindSignature.o: ../../Archive/Common/FindSignature.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../Archive/Common/FindSignature.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../Common/StreamUtils.h \\\n  ../../Archive/Common/../../Common/../IStream.h\nHandlerOut.o: ../../Archive/Common/HandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/../../../Common/StringToInt.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Windows/PropVariant.h \\\n  ../../Archive/Common/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Windows/../Common/Types.h \\\n  ../../Archive/Common/../../../Windows/System.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../Archive/Common/HandlerOut.h \\\n  ../../Archive/Common/../../../Common/MyString.h \\\n  ../../Archive/Common/../../Common/MethodProps.h \\\n  ../../Archive/Common/../../Common/../../Common/MyVector.h \\\n  ../../Archive/Common/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/Common/../../Common/MethodId.h \\\n  ../../Archive/Common/../../Common/../../Common/Types.h\nInStreamWithCRC.o: ../../Archive/Common/InStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/InStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\nItemNameUtils.o: ../../Archive/Common/ItemNameUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/ItemNameUtils.h \\\n  ../../Archive/Common/../../../Common/MyString.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h\nMultiStream.o: ../../Archive/Common/MultiStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/MultiStream.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../Archive/IArchive.h \\\n  ../../Archive/Common/../../Archive/../IStream.h \\\n  ../../Archive/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Common/../../Archive/../../Common/Types.h \\\n  ../../Archive/Common/../../Archive/../IDecl.h \\\n  ../../Archive/Common/../../Archive/../IProgress.h \\\n  ../../Archive/Common/../../Archive/../PropID.h\nOutStreamWithCRC.o: ../../Archive/Common/OutStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/OutStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\nParseProperties.o: ../../Archive/Common/ParseProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../../Common/StringToInt.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h\n7zCompressionMode.o: ../../Archive/7z/7zCompressionMode.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\n7zDecode.o: ../../Archive/7z/7zDecode.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/LockedStream.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h\n7zEncode.o: ../../Archive/7z/7zEncode.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zEncode.h ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/7zSpecStream.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/InOutTempBuffer.h \\\n  ../../Archive/7z/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/../../Windows/FileDir.h \\\n  ../../Archive/7z/../../Common/../../Windows/../Common/MyString.h \\\n  ../../Archive/7z/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/FilterCoder.h \\\n  ../../Archive/7z/../../Common/../IPassword.h\n7zExtract.o: ../../Archive/7z/7zExtract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h\n7zFolderInStream.o: ../../Archive/7z/7zFolderInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zFolderInStream.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/InStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h\n7zFolderOutStream.o: ../../Archive/7z/7zFolderOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IProgress.h \\\n  ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h\n7zHandler.o: ../../Archive/7z/7zHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/IntToString.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../../Windows/System.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zProperties.h ../../Archive/7z/../../PropID.h\n7zHandlerOut.o: ../../Archive/7z/7zHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/StringToInt.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/ParseProperties.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../../Archive/7z/7zHandler.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zOut.h ../../Archive/7z/7zEncode.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/OutBuffer.h ../../Archive/7z/7zUpdate.h\n7zHeader.o: ../../Archive/7z/7zHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h\n7zIn.o: ../../Archive/7z/7zIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../../../../C/Types.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/StreamUtils.h ../../Archive/7z/7zDecode.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/7zIn.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h\n7zOut.o: ../../Archive/7z/7zOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../Common/AutoPtr.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h ../../Archive/7z/7zOut.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zEncode.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/OutBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../../../../C/Types.h\n7zProperties.o: ../../Archive/7z/7zProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zProperties.h \\\n  ../../Archive/7z/../../PropID.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/7zHandler.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h\n7zSpecStream.o: ../../Archive/7z/7zSpecStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zSpecStream.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyCom.h\n7zUpdate.o: ../../Archive/7z/7zUpdate.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Compress/CopyCoder.h \\\n  ../../Archive/7z/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Compress/../ICoder.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/7zEncode.h ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/7zFolderInStream.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/InStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/7zIn.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zOut.h ../../Archive/7z/../../Common/OutBuffer.h \\\n  ../../Archive/7z/7zUpdate.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h\n7zRegister.o: ../../Archive/7z/7zRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/RegisterArc.h \\\n  ../../Archive/7z/../../Common/../Archive/IArchive.h \\\n  ../../Archive/7z/../../Common/../Archive/../IStream.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/7z/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/7z/../../Common/../Archive/../PropID.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h\nBZip2Handler.o: ../../Archive/BZip2/BZip2Handler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/../IDecl.h \\\n  ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/ProgressUtils.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyCom.h \\\n  ../../Archive/BZip2/../../Common/../IProgress.h \\\n  ../../Archive/BZip2/../../Common/StreamUtils.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../Common/DummyOutStream.h \\\n  ../../Archive/BZip2/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/BZip2/BZip2Handler.h ../../../Common/MyCom.h \\\n  ../../Archive/BZip2/../IArchive.h ../../Archive/BZip2/../../IStream.h \\\n  ../../Archive/BZip2/../../IProgress.h \\\n  ../../Archive/BZip2/../../PropID.h ../../Archive/BZip2/BZip2Item.h \\\n  ../../Archive/BZip2/../../../Windows/System.h \\\n  ../../Archive/BZip2/../../../Windows/../Common/Types.h\nBZip2HandlerOut.o: ../../Archive/BZip2/BZip2HandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/BZip2/BZip2Handler.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../IArchive.h ../../Archive/BZip2/../../IStream.h \\\n  ../../Archive/BZip2/../../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../../Common/Types.h \\\n  ../../Archive/BZip2/../../IDecl.h ../../Archive/BZip2/../../IProgress.h \\\n  ../../Archive/BZip2/../../PropID.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/BZip2Item.h \\\n  ../../Archive/BZip2/../../../Windows/System.h \\\n  ../../Archive/BZip2/../../../Windows/../Common/Types.h \\\n  ../../Archive/BZip2/BZip2Update.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/BZip2/../../Compress/CopyCoder.h \\\n  ../../Archive/BZip2/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/BZip2/../../Compress/../ICoder.h \\\n  ../../Archive/BZip2/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h\nBZip2Update.o: ../../Archive/BZip2/BZip2Update.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/BZip2/../../Common/ProgressUtils.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyCom.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/../IDecl.h \\\n  ../../Archive/BZip2/../../Common/../IProgress.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Archive/BZip2/BZip2Update.h \\\n  ../../Archive/BZip2/../IArchive.h ../../Archive/BZip2/../../IStream.h \\\n  ../../Archive/BZip2/../../IProgress.h \\\n  ../../Archive/BZip2/../../PropID.h\nbz2Register.o: ../../Archive/BZip2/bz2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/BZip2/../../Common/RegisterArc.h \\\n  ../../Archive/BZip2/../../Common/../Archive/IArchive.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../IStream.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../PropID.h \\\n  ../../Archive/BZip2/BZip2Handler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/BZip2/../IArchive.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/BZip2Item.h \\\n  ../../Archive/BZip2/../../../Windows/System.h \\\n  ../../Archive/BZip2/../../../Windows/../Common/Types.h\nCabBlockInStream.o: ../../Archive/Cab/CabBlockInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/../../../../C/Alloc.h ../../../Common/Defs.h \\\n  ../../Archive/Cab/../../Common/StreamUtils.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../../Common/Types.h \\\n  ../../Archive/Cab/../../Common/../IDecl.h \\\n  ../../Archive/Cab/CabBlockInStream.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Cab/../../IStream.h\nCabHandler.o: ../../Archive/Cab/CabHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/UTFConvert.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Cab/../../Common/ProgressUtils.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../ICoder.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../Common/../../Common/Types.h \\\n  ../../Archive/Cab/../../Common/../IDecl.h \\\n  ../../Archive/Cab/../../Common/../IProgress.h \\\n  ../../Archive/Cab/../../Compress/CopyCoder.h \\\n  ../../Archive/Cab/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Compress/../ICoder.h \\\n  ../../Archive/Cab/../../Compress/DeflateDecoder.h \\\n  ../../Archive/Cab/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Cab/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Cab/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Cab/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Compress/BitlDecoder.h \\\n  ../../Archive/Cab/../../Compress/../IStream.h \\\n  ../../Archive/Cab/../../Compress/DeflateConst.h \\\n  ../../Archive/Cab/../../Compress/HuffmanDecoder.h \\\n  ../../Archive/Cab/../../Compress/../../Common/Types.h \\\n  ../../Archive/Cab/../../Compress/LzOutWindow.h \\\n  ../../Archive/Cab/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Cab/../../Compress/LzxDecoder.h \\\n  ../../Archive/Cab/../../Compress/Lzx.h \\\n  ../../Archive/Cab/../../Compress/Lzx86Converter.h \\\n  ../../Archive/Cab/../../Compress/QuantumDecoder.h \\\n  ../../Archive/Cab/../Common/ItemNameUtils.h \\\n  ../../Archive/Cab/../Common/../../../Common/MyString.h \\\n  ../../Archive/Cab/CabBlockInStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Cab/../../IStream.h ../../Archive/Cab/CabHandler.h \\\n  ../../Archive/Cab/../IArchive.h ../../Archive/Cab/../../IStream.h \\\n  ../../Archive/Cab/../../IProgress.h ../../Archive/Cab/../../PropID.h \\\n  ../../Archive/Cab/CabIn.h ../../Archive/Cab/../../Common/InBuffer.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h \\\n  ../../Archive/Cab/CabItem.h ../../../Common/MyString.h\nCabHeader.o: ../../Archive/Cab/CabHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h\nCabIn.o: ../../Archive/Cab/CabIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/CabIn.h ../../Archive/Cab/../../IStream.h \\\n  ../../Archive/Cab/../../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../../Common/Types.h \\\n  ../../Archive/Cab/../../IDecl.h \\\n  ../../Archive/Cab/../../Common/InBuffer.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyException.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h \\\n  ../../Archive/Cab/CabItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Cab/../Common/FindSignature.h \\\n  ../../Archive/Cab/../Common/../../IStream.h\nCabRegister.o: ../../Archive/Cab/CabRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/../../Common/RegisterArc.h \\\n  ../../Archive/Cab/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Cab/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Cab/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Cab/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Cab/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Cab/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Cab/CabHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Cab/../IArchive.h \\\n  ../../Archive/Cab/CabIn.h ../../Archive/Cab/../../IStream.h \\\n  ../../Archive/Cab/../../Common/InBuffer.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyException.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h \\\n  ../../Archive/Cab/CabItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nGZipHandler.o: ../../Archive/GZip/GZipHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/GZip/GZipHandler.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../IArchive.h ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../Archive/GZip/../../IProgress.h \\\n  ../../Archive/GZip/../../PropID.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/../IStream.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/GZipUpdate.h \\\n  ../../Archive/GZip/GZipOut.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/GZip/../../ICoder.h \\\n  ../../Archive/GZip/../../Common/ProgressUtils.h \\\n  ../../Archive/GZip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Common/../IProgress.h \\\n  ../../Archive/GZip/../Common/OutStreamWithCRC.h \\\n  ../../Archive/GZip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/GZip/../Common/../../IStream.h \\\n  ../../Archive/GZip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/GZip/../Common/../../../../C/Types.h\nGZipHandlerOut.o: ../../Archive/GZip/GZipHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringToInt.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/GZip/../../Compress/CopyCoder.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../Compress/../ICoder.h \\\n  ../../Archive/GZip/../../Compress/../IStream.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../Compress/../../Common/Types.h \\\n  ../../Archive/GZip/../../Compress/../IDecl.h \\\n  ../../Archive/GZip/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../Archive/GZip/GZipHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/GZip/../IArchive.h ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../IProgress.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../Archive/GZip/../../PropID.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/GZipUpdate.h \\\n  ../../Archive/GZip/GZipOut.h\nGZipHeader.o: ../../Archive/GZip/GZipHeader.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h\nGZipIn.o: ../../Archive/GZip/GZipIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../../Common/Defs.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/Defs.h ../../Archive/GZip/../../Common/StreamUtils.h \\\n  ../../Archive/GZip/../../Common/../IStream.h \\\n  ../../Archive/GZip/../../../../C/7zCrc.h \\\n  ../../Archive/GZip/../../../../C/Types.h\nGZipOut.o: ../../Archive/GZip/GZipOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/GZip/GZipOut.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../../Windows/Defs.h \\\n  ../../Archive/GZip/../../Common/StreamUtils.h \\\n  ../../Archive/GZip/../../Common/../IStream.h\nGZipRegister.o: ../../Archive/GZip/GZipRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/GZip/../../Common/RegisterArc.h \\\n  ../../Archive/GZip/../../Common/../Archive/IArchive.h \\\n  ../../Archive/GZip/../../Common/../Archive/../IStream.h \\\n  ../../Archive/GZip/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/GZip/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/GZip/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/GZip/../../Common/../Archive/../PropID.h \\\n  ../../Archive/GZip/GZipHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/GZip/../IArchive.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/../IStream.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/GZipUpdate.h \\\n  ../../Archive/GZip/GZipOut.h\nGZipUpdate.o: ../../Archive/GZip/GZipUpdate.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Archive/GZip/../../ICoder.h \\\n  ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/../../Common/ProgressUtils.h \\\n  ../../Archive/GZip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Common/../IProgress.h \\\n  ../../Archive/GZip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/../../Common/../IDecl.h \\\n  ../../Archive/GZip/../../Compress/CopyCoder.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Compress/../ICoder.h \\\n  ../../Archive/GZip/../Common/InStreamWithCRC.h \\\n  ../../Archive/GZip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/GZip/../Common/../../IStream.h \\\n  ../../Archive/GZip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/GZip/../Common/../../../../C/Types.h \\\n  ../../Archive/GZip/GZipUpdate.h ../../Archive/GZip/../IArchive.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/../../IProgress.h \\\n  ../../Archive/GZip/../../PropID.h ../../Archive/GZip/GZipOut.h \\\n  ../../../Common/MyCom.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h\nLzmaArcRegister.o: ../../Archive/Lzma/LzmaArcRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Lzma/../../Common/RegisterArc.h \\\n  ../../Archive/Lzma/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Lzma/LzmaHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Lzma/../IArchive.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h\nLzmaFiltersDecode.o: ../../Archive/Lzma/LzmaFiltersDecode.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Lzma/LzmaFiltersDecode.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/../IDecl.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaItem.h ../../../Common/Types.h \\\n  ../../Archive/Lzma/../../../../C/CpuArch.h\nLzmaHandler.o: ../../Archive/Lzma/LzmaHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Lzma/LzmaHandler.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../IArchive.h ../../Archive/Lzma/../../IStream.h \\\n  ../../Archive/Lzma/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../../Common/Types.h \\\n  ../../Archive/Lzma/../../IDecl.h ../../Archive/Lzma/../../IProgress.h \\\n  ../../Archive/Lzma/../../PropID.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Common/IntToString.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/ProgressUtils.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Lzma/../../Common/../IProgress.h \\\n  ../../Archive/Lzma/../../Common/StreamUtils.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../Common/DummyOutStream.h \\\n  ../../Archive/Lzma/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Lzma/LzmaFiltersDecode.h\nLzmaIn.o: ../../Archive/Lzma/LzmaIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h \\\n  ../../Archive/Lzma/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../../Common/Types.h \\\n  ../../Archive/Lzma/../../IDecl.h \\\n  ../../Archive/Lzma/../../Common/StreamUtils.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h\nSplitHandler.o: ../../Archive/Split/SplitHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/NewHandler.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h \\\n  ../../Archive/Split/../../Common/ProgressUtils.h \\\n  ../../Archive/Split/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Split/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Split/../../Common/../ICoder.h \\\n  ../../Archive/Split/../../Common/../IStream.h \\\n  ../../Archive/Split/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Split/../../Common/../../Common/Types.h \\\n  ../../Archive/Split/../../Common/../IDecl.h \\\n  ../../Archive/Split/../../Common/../IProgress.h \\\n  ../../Archive/Split/../../Compress/CopyCoder.h \\\n  ../../Archive/Split/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Split/../../Compress/../ICoder.h \\\n  ../../Archive/Split/../Common/ItemNameUtils.h \\\n  ../../Archive/Split/../Common/../../../Common/MyString.h \\\n  ../../Archive/Split/../Common/MultiStream.h \\\n  ../../Archive/Split/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Split/../Common/../../../Common/MyVector.h \\\n  ../../Archive/Split/../Common/../../Archive/IArchive.h \\\n  ../../Archive/Split/../Common/../../Archive/../IStream.h \\\n  ../../Archive/Split/../Common/../../Archive/../IProgress.h \\\n  ../../Archive/Split/../Common/../../Archive/../PropID.h \\\n  ../../Archive/Split/SplitHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Split/../IArchive.h\nSplitRegister.o: ../../Archive/Split/SplitRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Split/../../Common/RegisterArc.h \\\n  ../../Archive/Split/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Split/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Split/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Split/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Split/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Split/SplitHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Split/../IArchive.h\nTarHandler.o: ../../Archive/Tar/TarHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/NewHandler.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Tar/../../Common/LimitedStreams.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../Common/../../Common/Types.h \\\n  ../../Archive/Tar/../../Common/../IDecl.h \\\n  ../../Archive/Tar/../../Common/ProgressUtils.h \\\n  ../../Archive/Tar/../../Common/../ICoder.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../IProgress.h \\\n  ../../Archive/Tar/../../Compress/CopyCoder.h \\\n  ../../Archive/Tar/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Compress/../ICoder.h \\\n  ../../Archive/Tar/../Common/DummyOutStream.h \\\n  ../../Archive/Tar/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../IArchive.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../IProgress.h ../../Archive/Tar/../../PropID.h \\\n  ../../Archive/Tar/TarItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../Archive/Tar/TarHeader.h \\\n  ../../Archive/Tar/TarIn.h ../../Archive/Tar/../../IStream.h\nTarHandlerOut.o: ../../Archive/Tar/TarHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../IArchive.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../../Common/Types.h \\\n  ../../Archive/Tar/../../IDecl.h ../../Archive/Tar/../../IProgress.h \\\n  ../../Archive/Tar/../../PropID.h ../../Archive/Tar/TarItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../Archive/Tar/TarUpdate.h\nTarHeader.o: ../../Archive/Tar/TarHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/Types.h\nTarIn.o: ../../Archive/Tar/TarIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/TarIn.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../../Common/Types.h \\\n  ../../Archive/Tar/../../IDecl.h ../../Archive/Tar/TarItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/StringToInt.h \\\n  ../../../Windows/Defs.h ../../Archive/Tar/../../Common/StreamUtils.h \\\n  ../../Archive/Tar/../../Common/../IStream.h\nTarOut.o: ../../Archive/Tar/TarOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/TarOut.h ../../Archive/Tar/TarItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../../Common/Types.h \\\n  ../../Archive/Tar/../../IDecl.h ../../../Common/IntToString.h \\\n  ../../../Windows/Defs.h ../../Archive/Tar/../../Common/StreamUtils.h \\\n  ../../Archive/Tar/../../Common/../IStream.h\nTarRegister.o: ../../Archive/Tar/TarRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/../../Common/RegisterArc.h \\\n  ../../Archive/Tar/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Tar/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Tar/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Tar/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Tar/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Tar/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Tar/TarHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Tar/../IArchive.h \\\n  ../../Archive/Tar/TarItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h\nTarUpdate.o: ../../Archive/Tar/TarUpdate.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/../../Common/LimitedStreams.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../Common/../../Common/Types.h \\\n  ../../Archive/Tar/../../Common/../IDecl.h \\\n  ../../Archive/Tar/../../Common/ProgressUtils.h \\\n  ../../Archive/Tar/../../Common/../ICoder.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../IProgress.h \\\n  ../../Archive/Tar/../../Compress/CopyCoder.h \\\n  ../../Archive/Tar/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Compress/../ICoder.h ../../Archive/Tar/TarOut.h \\\n  ../../Archive/Tar/TarItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../../IStream.h ../../Archive/Tar/TarUpdate.h \\\n  ../../Archive/Tar/../IArchive.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../IProgress.h ../../Archive/Tar/../../PropID.h\nZipAddCommon.o: ../../Archive/Zip/ZipAddCommon.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/../../../../C/7zCrc.h \\\n  ../../Archive/Zip/../../../../C/Types.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Archive/Zip/../../ICoder.h \\\n  ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h ../../Archive/Zip/../../IPassword.h \\\n  ../../Archive/Zip/../../MyVersion.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/StreamObjects.h \\\n  ../../Archive/Zip/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Buffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Defs.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h \\\n  ../../Archive/Zip/../../Compress/LzmaEncoder.h \\\n  ../../Archive/Zip/../../Compress/../../../C/LzmaEnc.h \\\n  ../../Archive/Zip/../../Compress/../../../C/Types.h \\\n  ../../Archive/Zip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../ICoder.h \\\n  ../../Archive/Zip/../Common/InStreamWithCRC.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Zip/../Common/../../IStream.h \\\n  ../../Archive/Zip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/Zip/ZipAddCommon.h ../../Archive/Zip/../../IProgress.h \\\n  ../../Archive/Zip/../../Common/FilterCoder.h \\\n  ../../Archive/Zip/../../Common/../IPassword.h \\\n  ../../Archive/Zip/../../Compress/CopyCoder.h \\\n  ../../Archive/Zip/../../Crypto/ZipCrypto.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyVector.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/ZipCompressionMode.h ../../../Common/MyString.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h\nZipHandler.o: ../../Archive/Zip/ZipHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Zip/../../IPassword.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../IDecl.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/FilterCoder.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IPassword.h \\\n  ../../Archive/Zip/../../Common/ProgressUtils.h \\\n  ../../Archive/Zip/../../Common/../IProgress.h \\\n  ../../Archive/Zip/../../Common/StreamObjects.h \\\n  ../../Archive/Zip/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Buffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Defs.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h \\\n  ../../Archive/Zip/../../Compress/CopyCoder.h \\\n  ../../Archive/Zip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../ICoder.h \\\n  ../../Archive/Zip/../../Compress/LzmaDecoder.h \\\n  ../../Archive/Zip/../../Compress/../../../C/LzmaDec.h \\\n  ../../Archive/Zip/../../Compress/../../../C/Types.h \\\n  ../../Archive/Zip/../../Compress/ImplodeDecoder.h \\\n  ../../Archive/Zip/../../Compress/ImplodeHuffmanDecoder.h \\\n  ../../Archive/Zip/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Zip/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Zip/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Compress/BitlDecoder.h \\\n  ../../Archive/Zip/../../Compress/../IStream.h \\\n  ../../Archive/Zip/../../Compress/LzOutWindow.h \\\n  ../../Archive/Zip/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Compress/ShrinkDecoder.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/../../Crypto/ZipCrypto.h \\\n  ../../Archive/Zip/../../Crypto/ZipStrong.h \\\n  ../../Archive/Zip/../Common/ItemNameUtils.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyString.h \\\n  ../../Archive/Zip/../Common/OutStreamWithCRC.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Zip/../Common/../../IStream.h \\\n  ../../Archive/Zip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/Zip/../Common/../../../../C/Types.h \\\n  ../../Archive/Zip/ZipHandler.h ../../../Common/DynamicBuffer.h \\\n  ../../Archive/Zip/../../ICoder.h ../../Archive/Zip/../IArchive.h \\\n  ../../Archive/Zip/../../IStream.h ../../Archive/Zip/../../IProgress.h \\\n  ../../Archive/Zip/../../PropID.h ../../Archive/Zip/ZipIn.h \\\n  ../../../Common/MyCom.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h \\\n  ../../Archive/Zip/ZipItemEx.h ../../Archive/Zip/ZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../../Common/UTFConvert.h ../../Archive/Zip/ZipCompressionMode.h \\\n  ../../Archive/Zip/../../../Windows/System.h \\\n  ../../Archive/Zip/../../../Windows/../Common/Types.h\nZipHandlerOut.o: ../../Archive/Zip/ZipHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringToInt.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Zip/../../IPassword.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h \\\n  ../../Archive/Zip/../../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../IDecl.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IStream.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/../Common/ItemNameUtils.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyString.h \\\n  ../../Archive/Zip/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../Archive/Zip/ZipHandler.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h ../../Archive/Zip/../../ICoder.h \\\n  ../../Archive/Zip/../IArchive.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../IProgress.h ../../Archive/Zip/../../PropID.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/ZipIn.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../IStream.h ../../Archive/Zip/ZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/Zip/ZipItemEx.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../Archive/Zip/ZipCompressionMode.h \\\n  ../../Archive/Zip/../../../Windows/System.h \\\n  ../../Archive/Zip/../../../Windows/../Common/Types.h \\\n  ../../Archive/Zip/ZipUpdate.h\nZipHeader.o: ../../Archive/Zip/ZipHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h\nZipIn.o: ../../Archive/Zip/ZipIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipIn.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h ../../Archive/Zip/ZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/Zip/ZipItemEx.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Windows/Defs.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h \\\n  ../../Archive/Zip/../../Common/LimitedStreams.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h \\\n  ../../Archive/Zip/../../../../C/CpuArch.h\nZipItem.o: ../../Archive/Zip/ZipItem.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../Archive/Zip/../Common/ItemNameUtils.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyString.h \\\n  ../../Archive/Zip/../../../../C/CpuArch.h\nZipOut.o: ../../Archive/Zip/ZipOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipOut.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h \\\n  ../../Archive/Zip/../../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../Archive/Zip/ZipHeader.h \\\n  ../../Archive/Zip/../../Common/OffsetStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h\nZipUpdate.o: ../../Archive/Zip/ZipUpdate.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/AutoPtr.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Windows/Thread.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../IDecl.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/LimitedStreams.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/OutMemStream.h \\\n  ../../Archive/Zip/../../Common/MemBlocks.h \\\n  ../../Archive/Zip/../../Common/../../../C/Alloc.h \\\n  ../../../Common/Types.h ../../../Common/MyVector.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Synchronization2.h \\\n  ../../Archive/Zip/../../Common/ProgressUtils.h \\\n  ../../Archive/Zip/../../Common/../IProgress.h \\\n  ../../Archive/Zip/../../Common/ProgressMt.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyVector.h \\\n  ../../Archive/Zip/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/Zip/../../Compress/CopyCoder.h \\\n  ../../Archive/Zip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../ICoder.h \\\n  ../../Archive/Zip/ZipAddCommon.h ../../Archive/Zip/../../ICoder.h \\\n  ../../Archive/Zip/../../IProgress.h \\\n  ../../Archive/Zip/../../Common/FilterCoder.h \\\n  ../../Archive/Zip/../../Common/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/ZipCrypto.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyVector.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/ZipCompressionMode.h ../../../Common/MyString.h \\\n  ../../Archive/Zip/ZipOut.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../Archive/Zip/ZipHeader.h ../../Archive/Zip/ZipUpdate.h \\\n  ../../Archive/Zip/../IArchive.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../IProgress.h ../../Archive/Zip/../../PropID.h \\\n  ../../Archive/Zip/ZipIn.h ../../Archive/Zip/ZipItemEx.h\nZipRegister.o: ../../Archive/Zip/ZipRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/../../Common/RegisterArc.h \\\n  ../../Archive/Zip/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Zip/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Zip/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Zip/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Zip/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Zip/ZipHandler.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../Archive/Zip/../../ICoder.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../IArchive.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/ZipIn.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../IStream.h ../../Archive/Zip/ZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/Zip/ZipItemEx.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../Archive/Zip/ZipCompressionMode.h \\\n  ../../Archive/Zip/../../../Windows/System.h \\\n  ../../Archive/Zip/../../../Windows/../Common/Types.h\nBcj2Coder.o: ../../Compress/Bcj2Coder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/Bcj2Coder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcj2Register.o: ../../Compress/Bcj2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/Bcj2Coder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcjCoder.o: ../../Compress/BcjCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBcjRegister.o: ../../Compress/BcjRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBitlDecoder.o: ../../Compress/BitlDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchCoder.o: ../../Compress/BranchCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BranchCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchMisc.o: ../../Compress/BranchMisc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Bra.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/BranchMisc.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchRegister.o: ../../Compress/BranchRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BranchMisc.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nByteSwap.o: ../../Compress/ByteSwap.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/ByteSwap.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nByteSwapRegister.o: ../../Compress/ByteSwapRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/ByteSwap.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBZip2Crc.o: ../../Compress/BZip2Crc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BZip2Crc.h ../../../Common/Types.h\nBZip2Decoder.o: ../../Compress/BZip2Decoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../../Common/Defs.h ../../Compress/BZip2Crc.h \\\n  ../../../Common/Types.h ../../Compress/BZip2Decoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Windows/Synchronization.h \\\n  ../../Compress/../../Windows/Defs.h \\\n  ../../Compress/../../Windows/../../C/Threads.h \\\n  ../../Compress/../../Windows/../../C/Types.h \\\n  ../../Compress/../../Windows/Synchronization2.h \\\n  ../../Compress/../../Windows/Thread.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitmDecoder.h \\\n  ../../Compress/../IStream.h ../../Compress/BZip2Const.h \\\n  ../../Compress/HuffmanDecoder.h ../../Compress/../../Common/Types.h \\\n  ../../Compress/Mtf8.h\nBZip2Encoder.o: ../../Compress/BZip2Encoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../../../C/BwtSort.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../../C/HuffEnc.h ../../Compress/BZip2Crc.h \\\n  ../../../Common/Types.h ../../Compress/BZip2Encoder.h \\\n  ../../Compress/../../Common/Defs.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Windows/Synchronization.h \\\n  ../../Compress/../../Windows/Defs.h \\\n  ../../Compress/../../Windows/../../C/Threads.h \\\n  ../../Compress/../../Windows/../../C/Types.h \\\n  ../../Compress/../../Windows/Synchronization2.h \\\n  ../../Compress/../../Windows/Thread.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitmEncoder.h \\\n  ../../Compress/../IStream.h ../../Compress/BZip2Const.h \\\n  ../../Compress/Mtf8.h ../../Compress/../../Common/Types.h\nBZip2Register.o: ../../Compress/BZip2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BZip2Decoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Windows/Synchronization.h \\\n  ../../Compress/../../Windows/Defs.h \\\n  ../../Compress/../../Windows/../../C/Threads.h \\\n  ../../Compress/../../Windows/../../C/Types.h \\\n  ../../Compress/../../Windows/Synchronization2.h \\\n  ../../Compress/../../Windows/Thread.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitmDecoder.h \\\n  ../../Compress/../IStream.h ../../Compress/BZip2Const.h \\\n  ../../Compress/BZip2Crc.h ../../../Common/Types.h \\\n  ../../Compress/HuffmanDecoder.h ../../Compress/../../Common/Types.h \\\n  ../../Compress/BZip2Encoder.h ../../Compress/../../Common/Defs.h \\\n  ../../Compress/BitmEncoder.h\nCopyCoder.o: ../../Compress/CopyCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/CopyCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nCopyRegister.o: ../../Compress/CopyRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/CopyCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nDeflate64Register.o: ../../Compress/Deflate64Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/DeflateDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/DeflateEncoder.h \\\n  ../../Compress/../../../C/LzFind.h ../../Compress/../../../C/Types.h \\\n  ../../../Common/MyCom.h ../../Compress/BitlEncoder.h\nDeflateDecoder.o: ../../Compress/DeflateDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/DeflateDecoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h\nDeflateEncoder.o: ../../Compress/DeflateEncoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../../../C/HuffEnc.h ../../Compress/../../../C/Types.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../Compress/DeflateEncoder.h ../../Compress/../../../C/LzFind.h \\\n  ../../../Common/MyCom.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/BitlEncoder.h ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/DeflateConst.h\nDeflateRegister.o: ../../Compress/DeflateRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/DeflateDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/DeflateEncoder.h \\\n  ../../Compress/../../../C/LzFind.h ../../Compress/../../../C/Types.h \\\n  ../../../Common/MyCom.h ../../Compress/BitlEncoder.h\nImplodeDecoder.o: ../../Compress/ImplodeDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/ImplodeDecoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/ImplodeHuffmanDecoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../Common/OutBuffer.h \\\n  ../../../Common/Defs.h\nImplodeHuffmanDecoder.o: ../../Compress/ImplodeHuffmanDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/ImplodeHuffmanDecoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h\nLzmaDecoder.o: ../../Compress/LzmaDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/LzmaDecoder.h \\\n  ../../Compress/../../../C/LzmaDec.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaEncoder.o: ../../Compress/LzmaEncoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/LzmaEncoder.h \\\n  ../../Compress/../../../C/LzmaEnc.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaRegister.o: ../../Compress/LzmaRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/LzmaDecoder.h ../../Compress/../../../C/LzmaDec.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/LzmaEncoder.h ../../Compress/../../../C/LzmaEnc.h\nLzOutWindow.o: ../../Compress/LzOutWindow.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/MyException.h\nLzx86Converter.o: ../../Compress/Lzx86Converter.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../Common/Defs.h \\\n  ../../Compress/Lzx86Converter.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nLzxDecoder.o: ../../Compress/LzxDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../Common/Defs.h ../../Compress/LzxDecoder.h \\\n  ../../Compress/../ICoder.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/HuffmanDecoder.h ../../Compress/../../Common/Types.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../IStream.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/Lzx.h \\\n  ../../Compress/Lzx86Converter.h ../../Compress/../../Common/MyCom.h\nPpmdDecoder.o: ../../Compress/PpmdDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../Compress/PpmdDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/PpmdDecode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/InBuffer.h\nPpmdEncoder.o: ../../Compress/PpmdEncoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/PpmdEncoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/PpmdEncode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/OutBuffer.h\nPpmdRegister.o: ../../Compress/PpmdRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/PpmdDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/PpmdDecode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/PpmdEncoder.h ../../Compress/PpmdEncode.h\nQuantumDecoder.o: ../../Compress/QuantumDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../Common/Defs.h \\\n  ../../Compress/QuantumDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../IStream.h \\\n  ../../Compress/../Common/OutBuffer.h\nShrinkDecoder.o: ../../Compress/ShrinkDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitlDecoder.h \\\n  ../../Compress/../IStream.h ../../Compress/ShrinkDecoder.h \\\n  ../../Compress/../../Common/MyCom.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nZDecoder.o: ../../Compress/ZDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/ZDecoder.h \\\n  ../../Compress/../../Common/MyCom.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaBench.o: ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/7zCrc.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Alloc.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Defs.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Threads.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization2.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Thread.h \\\n  ../../Compress/LZMA_Alone/../LzmaDecoder.h \\\n  ../../Compress/LZMA_Alone/../../../../C/LzmaDec.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../ICoder.h \\\n  ../../Compress/LZMA_Alone/../../IStream.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../IDecl.h \\\n  ../../Compress/LZMA_Alone/../LzmaEncoder.h \\\n  ../../Compress/LZMA_Alone/../../../../C/LzmaEnc.h\nLzmaBenchCon.o: ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/LzmaBenchCon.h \\\n  ../../Compress/LZMA_Alone/../../../Common/IntToString.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/System.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Console/ConsoleClose.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyWindows.h\n7zAes.o: ../../Crypto/7zAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/Sha256.h ../../Crypto/../../../C/Types.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h \\\n  ../../Crypto/../Common/StreamObjects.h \\\n  ../../Crypto/../Common/../../Common/DynamicBuffer.h \\\n  ../../Crypto/../Common/../../Common/Buffer.h \\\n  ../../Crypto/../Common/../../Common/Defs.h \\\n  ../../Crypto/../Common/../../Common/MyCom.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/7zAes.h ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../IPassword.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/Types.h ../../Crypto/../IDecl.h \\\n  ../../Crypto/MyAes.h ../../Crypto/../../../C/Aes.h \\\n  ../../Crypto/../../Common/MyCom.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/RandGen.h ../../Crypto/Sha1.h\n7zAesRegister.o: ../../Crypto/7zAesRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Crypto/../Common/RegisterCodec.h \\\n  ../../Crypto/../Common/../Common/MethodId.h \\\n  ../../Crypto/../Common/../Common/../../Common/Types.h \\\n  ../../Crypto/7zAes.h ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyVector.h ../../Crypto/../ICoder.h \\\n  ../../Crypto/../IStream.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h ../../Crypto/../IPassword.h\nHmacSha1.o: ../../Crypto/HmacSha1.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/HmacSha1.h ../../Crypto/Sha1.h \\\n  ../../Crypto/../../Common/Types.h\nMyAes.o: ../../Crypto/MyAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/MyAes.h ../../Crypto/../../../C/Aes.h \\\n  ../../Crypto/../../../C/Types.h ../../Crypto/../../Common/MyCom.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../../Common/MyUnknown.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h\nPbkdf2HmacSha1.o: ../../Crypto/Pbkdf2HmacSha1.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Crypto/HmacSha1.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h\nRandGen.o: ../../Crypto/RandGen.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../Crypto/RandGen.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h\nSha1.o: ../../Crypto/Sha1.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../../../C/RotateDefs.h\nWzAes.o: ../../Crypto/WzAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../Common/StreamObjects.h \\\n  ../../Crypto/../Common/../../Common/DynamicBuffer.h \\\n  ../../Crypto/../Common/../../Common/Buffer.h \\\n  ../../Crypto/../Common/../../Common/Defs.h \\\n  ../../Crypto/../Common/../../Common/MyCom.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/Pbkdf2HmacSha1.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/RandGen.h ../../Crypto/Sha1.h ../../Crypto/WzAes.h \\\n  ../../Crypto/../../../C/Aes.h ../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../IPassword.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/Types.h ../../Crypto/../IDecl.h \\\n  ../../Crypto/HmacSha1.h\nZipCrypto.o: ../../Crypto/ZipCrypto.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/7zCrc.h ../../Crypto/../../../C/Types.h \\\n  ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/RandGen.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/ZipCrypto.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Crypto/../ICoder.h \\\n  ../../Crypto/../IStream.h ../../Crypto/../IPassword.h \\\n  ../../Crypto/../../Common/MyUnknown.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h\nZipStrong.o: ../../Crypto/ZipStrong.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/7zCrc.h ../../Crypto/../../../C/Types.h \\\n  ../../Crypto/../../../C/CpuArch.h ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/MyAes.h \\\n  ../../Crypto/../../../C/Aes.h ../../Crypto/../../Common/MyCom.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h ../../Crypto/Sha1.h \\\n  ../../Crypto/ZipStrong.h ../../../Common/MyCom.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../Crypto/../IPassword.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/Types.h ../../Crypto/../IDecl.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Alone/makefile.list",
    "content": "SRCS=\\\n ../../../myWindows/myGetTickCount.cpp \\\n ../../../myWindows/wine_date_and_time.cpp \\\n ../../../myWindows/myAddExeFlag.cpp \\\n ../../../myWindows/mySplitCommandLine.cpp \\\n \\\n ../../UI/Console/ConsoleClose.cpp \\\n ../../UI/Console/ExtractCallbackConsole.cpp \\\n ../../UI/Console/List.cpp \\\n ../../UI/Console/Main.cpp \\\n ../../UI/Console/MainAr.cpp \\\n ../../UI/Console/OpenCallbackConsole.cpp \\\n ../../UI/Console/PercentPrinter.cpp \\\n ../../UI/Console/UpdateCallbackConsole.cpp \\\n ../../UI/Console/UserInputUtils.cpp \\\n \\\n ../../../Common/CommandLineParser.cpp \\\n ../../../Common/CRC.cpp \\\n ../../../Common/IntToString.cpp \\\n ../../../Common/ListFileUtils.cpp \\\n ../../../Common/StdInStream.cpp \\\n ../../../Common/StdOutStream.cpp \\\n ../../../Common/MyString.cpp \\\n ../../../Common/MyWindows.cpp \\\n ../../../Common/StringConvert.cpp \\\n ../../../Common/StringToInt.cpp \\\n ../../../Common/UTFConvert.cpp \\\n ../../../Common/MyVector.cpp \\\n ../../../Common/Wildcard.cpp \\\n \\\n ../../../Windows/Error.cpp \\\n ../../../Windows/FileDir.cpp \\\n ../../../Windows/FileFind.cpp \\\n ../../../Windows/FileIO.cpp \\\n ../../../Windows/FileName.cpp \\\n ../../../Windows/PropVariant.cpp \\\n ../../../Windows/PropVariantConversions.cpp \\\n ../../../Windows/Synchronization.cpp \\\n ../../../Windows/System.cpp \\\n ../../../Windows/Time.cpp \\\n \\\n ../../Common/CreateCoder.cpp \\\n ../../Common/FilePathAutoRename.cpp \\\n ../../Common/FileStreams.cpp \\\n ../../Common/FilterCoder.cpp \\\n ../../Common/InBuffer.cpp \\\n ../../Common/InOutTempBuffer.cpp \\\n ../../Common/LimitedStreams.cpp \\\n ../../Common/LockedStream.cpp \\\n ../../Common/MemBlocks.cpp \\\n ../../Common/MethodId.cpp \\\n ../../Common/MethodProps.cpp \\\n ../../Common/OffsetStream.cpp \\\n ../../Common/OutBuffer.cpp \\\n ../../Common/OutMemStream.cpp \\\n ../../Common/ProgressMt.cpp \\\n ../../Common/ProgressUtils.cpp \\\n ../../Common/StreamBinder.cpp \\\n ../../Common/StreamObjects.cpp \\\n ../../Common/StreamUtils.cpp \\\n ../../Common/VirtThread.cpp \\\n \\\n ../../UI/Common/ArchiveCommandLine.cpp \\\n ../../UI/Common/ArchiveExtractCallback.cpp \\\n ../../UI/Common/ArchiveOpenCallback.cpp \\\n ../../UI/Common/DefaultName.cpp \\\n ../../UI/Common/EnumDirItems.cpp \\\n ../../UI/Common/Extract.cpp \\\n ../../UI/Common/ExtractingFilePath.cpp \\\n ../../UI/Common/LoadCodecs.cpp \\\n ../../UI/Common/OpenArchive.cpp \\\n ../../UI/Common/PropIDUtils.cpp \\\n ../../UI/Common/SetProperties.cpp \\\n ../../UI/Common/SortUtils.cpp \\\n ../../UI/Common/TempFiles.cpp \\\n ../../UI/Common/Update.cpp \\\n ../../UI/Common/UpdateAction.cpp \\\n ../../UI/Common/UpdateCallback.cpp \\\n ../../UI/Common/UpdatePair.cpp \\\n ../../UI/Common/UpdateProduce.cpp \\\n \\\n ../../Archive/ZHandler.cpp \\\n \\\n ../../Archive/Common/CoderMixer2.cpp \\\n ../../Archive/Common/CoderMixer2MT.cpp \\\n ../../Archive/Common/CrossThreadProgress.cpp \\\n ../../Archive/Common/DummyOutStream.cpp \\\n ../../Archive/Common/FindSignature.cpp \\\n ../../Archive/Common/HandlerOut.cpp \\\n ../../Archive/Common/InStreamWithCRC.cpp \\\n ../../Archive/Common/ItemNameUtils.cpp \\\n ../../Archive/Common/MultiStream.cpp \\\n ../../Archive/Common/OutStreamWithCRC.cpp \\\n ../../Archive/Common/ParseProperties.cpp \\\n \\\n ../../Archive/7z/7zCompressionMode.cpp \\\n ../../Archive/7z/7zDecode.cpp \\\n ../../Archive/7z/7zEncode.cpp \\\n ../../Archive/7z/7zExtract.cpp \\\n ../../Archive/7z/7zFolderInStream.cpp \\\n ../../Archive/7z/7zFolderOutStream.cpp \\\n ../../Archive/7z/7zHandler.cpp \\\n ../../Archive/7z/7zHandlerOut.cpp \\\n ../../Archive/7z/7zHeader.cpp \\\n ../../Archive/7z/7zIn.cpp \\\n ../../Archive/7z/7zOut.cpp \\\n ../../Archive/7z/7zProperties.cpp \\\n ../../Archive/7z/7zSpecStream.cpp \\\n ../../Archive/7z/7zUpdate.cpp \\\n ../../Archive/7z/7zRegister.cpp \\\n \\\n ../../Archive/BZip2/BZip2Handler.cpp \\\n ../../Archive/BZip2/BZip2HandlerOut.cpp \\\n ../../Archive/BZip2/BZip2Update.cpp \\\n ../../Archive/BZip2/bz2Register.cpp \\\n \\\n ../../Archive/Cab/CabBlockInStream.cpp \\\n ../../Archive/Cab/CabHandler.cpp \\\n ../../Archive/Cab/CabHeader.cpp \\\n ../../Archive/Cab/CabIn.cpp \\\n ../../Archive/Cab/CabRegister.cpp \\\n \\\n ../../Archive/GZip/GZipHandler.cpp \\\n ../../Archive/GZip/GZipHandlerOut.cpp \\\n ../../Archive/GZip/GZipHeader.cpp \\\n ../../Archive/GZip/GZipIn.cpp \\\n ../../Archive/GZip/GZipOut.cpp \\\n ../../Archive/GZip/GZipRegister.cpp \\\n ../../Archive/GZip/GZipUpdate.cpp \\\n \\\n ../../Archive/Lzma/LzmaArcRegister.cpp \\\n ../../Archive/Lzma/LzmaFiltersDecode.cpp \\\n ../../Archive/Lzma/LzmaHandler.cpp \\\n ../../Archive/Lzma/LzmaIn.cpp \\\n \\\n ../../Archive/Split/SplitHandler.cpp \\\n ../../Archive/Split/SplitRegister.cpp \\\n \\\n ../../Archive/Tar/TarHandler.cpp \\\n ../../Archive/Tar/TarHandlerOut.cpp \\\n ../../Archive/Tar/TarHeader.cpp \\\n ../../Archive/Tar/TarIn.cpp \\\n ../../Archive/Tar/TarOut.cpp \\\n ../../Archive/Tar/TarRegister.cpp \\\n ../../Archive/Tar/TarUpdate.cpp \\\n \\\n ../../Archive/Zip/ZipAddCommon.cpp \\\n ../../Archive/Zip/ZipHandler.cpp \\\n ../../Archive/Zip/ZipHandlerOut.cpp \\\n ../../Archive/Zip/ZipHeader.cpp \\\n ../../Archive/Zip/ZipIn.cpp \\\n ../../Archive/Zip/ZipItem.cpp \\\n ../../Archive/Zip/ZipOut.cpp \\\n ../../Archive/Zip/ZipUpdate.cpp \\\n ../../Archive/Zip/ZipRegister.cpp \\\n \\\n ../../Compress/Bcj2Coder.cpp \\\n ../../Compress/Bcj2Register.cpp \\\n ../../Compress/BcjCoder.cpp \\\n ../../Compress/BcjRegister.cpp \\\n ../../Compress/BitlDecoder.cpp \\\n ../../Compress/BranchCoder.cpp \\\n ../../Compress/BranchMisc.cpp \\\n ../../Compress/BranchRegister.cpp \\\n ../../Compress/ByteSwap.cpp \\\n ../../Compress/ByteSwapRegister.cpp \\\n ../../Compress/BZip2Crc.cpp \\\n ../../Compress/BZip2Decoder.cpp \\\n ../../Compress/BZip2Encoder.cpp \\\n ../../Compress/BZip2Register.cpp \\\n ../../Compress/CopyCoder.cpp \\\n ../../Compress/CopyRegister.cpp \\\n ../../Compress/Deflate64Register.cpp \\\n ../../Compress/DeflateDecoder.cpp \\\n ../../Compress/DeflateEncoder.cpp \\\n ../../Compress/DeflateRegister.cpp \\\n ../../Compress/ImplodeDecoder.cpp \\\n ../../Compress/ImplodeHuffmanDecoder.cpp \\\n ../../Compress/LzmaDecoder.cpp \\\n ../../Compress/LzmaEncoder.cpp \\\n ../../Compress/LzmaRegister.cpp \\\n ../../Compress/LzOutWindow.cpp \\\n ../../Compress/Lzx86Converter.cpp \\\n ../../Compress/LzxDecoder.cpp \\\n ../../Compress/PpmdDecoder.cpp \\\n ../../Compress/PpmdEncoder.cpp \\\n ../../Compress/PpmdRegister.cpp \\\n ../../Compress/QuantumDecoder.cpp \\\n ../../Compress/ShrinkDecoder.cpp \\\n ../../Compress/ZDecoder.cpp \\\n \\\n ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n \\\n ../../Crypto/7zAes.cpp \\\n ../../Crypto/7zAesRegister.cpp \\\n ../../Crypto/HmacSha1.cpp \\\n ../../Crypto/MyAes.cpp \\\n ../../Crypto/Pbkdf2HmacSha1.cpp \\\n ../../Crypto/RandGen.cpp \\\n ../../Crypto/Sha1.cpp \\\n ../../Crypto/WzAes.cpp \\\n ../../Crypto/ZipCrypto.cpp \\\n ../../Crypto/ZipStrong.cpp\n\nSRCS_C=\\\n ../../../../C/Bra.c \\\n ../../../../C/Bra86.c \\\n ../../../../C/BraIA64.c \\\n ../../../../C/BwtSort.c \\\n ../../../../C/HuffEnc.c \\\n ../../../../C/LzFind.c \\\n ../../../../C/LzFindMt.c \\\n ../../../../C/LzmaDec.c \\\n ../../../../C/LzmaEnc.c \\\n ../../../../C/Sort.c \\\n ../../../../C/Threads.c \\\n ../../../../C/Aes.c \\\n ../../../../C/Sha256.c\n\ninclude ../../../../makefile.rules\n\nMain.o : ../../UI/Console/Main.cpp\n\t$(CXX) $(CXXFLAGS) ../../UI/Console/Main.cpp\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Alone7z/makefile",
    "content": "LOCAL_FLAGS= \\\n  -D_NO_CRYPTO \\\n  -DCOMPRESS_MT \\\n  -DCOMPRESS_MF_MT \\\n  -D_NO_CRYPTO \\\n  -DBREAK_HANDLER \\\n  -DBENCH_MT\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nPROG=../../../../bin/7zr$(BINSUFFIX)\n\nLIBS=$(LOCAL_LIBS)\n\n\nCONSOLE_OBJS = \\\n  ConsoleClose.o \\\n  ExtractCallbackConsole.o \\\n  List.o \\\n  Main.o \\\n  MainAr.o \\\n  OpenCallbackConsole.o \\\n  PercentPrinter.o \\\n  UpdateCallbackConsole.o \\\n  UserInputUtils.o \\\n\n# NewHandler.o StringConvert.o\nCOMMON_OBJS = \\\n  CommandLineParser.o \\\n  CRC.o \\\n  IntToString.o \\\n  ListFileUtils.o \\\n  StdInStream.o \\\n  StdOutStream.o \\\n  MyString.o \\\n  MyWindows.o \\\n  StringConvert.o \\\n  StringToInt.o \\\n  UTFConvert.o \\\n  MyVector.o \\\n  Wildcard.o \\\n\n# DLL.o MemoryLock.o\nWIN_OBJS = \\\n  Error.o \\\n  FileDir.o \\\n  FileFind.o \\\n  FileIO.o \\\n  FileName.o \\\n  PropVariant.o \\\n  PropVariantConversions.o \\\n  Synchronization.o \\\n  System.o \\\n  Time.o \\\n\n7ZIP_COMMON_OBJS = \\\n  CreateCoder.o \\\n  FilePathAutoRename.o \\\n  FileStreams.o \\\n  FilterCoder.o \\\n  InBuffer.o \\\n  InOutTempBuffer.o \\\n  LimitedStreams.o \\\n  LockedStream.o \\\n  MethodId.o \\\n  MethodProps.o \\\n  OffsetStream.o \\\n  OutBuffer.o \\\n  ProgressUtils.o \\\n  StreamBinder.o \\\n  StreamObjects.o \\\n  StreamUtils.o \\\n  VirtThread.o \\\n\n# WorkDir.o\nUI_COMMON_OBJS = \\\n  ArchiveCommandLine.o \\\n  ArchiveExtractCallback.o \\\n  ArchiveOpenCallback.o \\\n  DefaultName.o \\\n  EnumDirItems.o \\\n  Extract.o \\\n  ExtractingFilePath.o \\\n  LoadCodecs.o \\\n  OpenArchive.o \\\n  PropIDUtils.o \\\n  SetProperties.o \\\n  SortUtils.o \\\n  TempFiles.o \\\n  Update.o \\\n  UpdateAction.o \\\n  UpdateCallback.o \\\n  UpdatePair.o \\\n  UpdateProduce.o \\\n\nAR_COMMON_OBJS = \\\n  CoderMixer2.o \\\n  CoderMixer2MT.o \\\n  CrossThreadProgress.o \\\n  DummyOutStream.o \\\n  HandlerOut.o \\\n  InStreamWithCRC.o \\\n  ItemNameUtils.o \\\n  MultiStream.o \\\n  OutStreamWithCRC.o \\\n  ParseProperties.o \\\n\n7Z_OBJS = \\\n  7zCompressionMode.o \\\n  7zDecode.o \\\n  7zEncode.o \\\n  7zExtract.o \\\n  7zFolderInStream.o \\\n  7zFolderOutStream.o \\\n  7zHandler.o \\\n  7zHandlerOut.o \\\n  7zHeader.o \\\n  7zIn.o \\\n  7zOut.o \\\n  7zProperties.o \\\n  7zRegister.o \\\n  7zSpecStream.o \\\n  7zUpdate.o \\\n\nLZM_OBJS = \\\n  LzmaArcRegister.o \\\n  LzmaFiltersDecode.o \\\n  LzmaHandler.o \\\n  LzmaIn.o \\\n\n# SplitHandlerOut.o\nSPLIT_OBJS = \\\n  SplitHandler.o \\\n  SplitRegister.o \\\n\nCOMPRESS_OBJS = \\\n  Bcj2Coder.o \\\n  Bcj2Register.o \\\n  BcjCoder.o \\\n  BcjRegister.o \\\n  BranchCoder.o \\\n  BranchMisc.o \\\n  BranchRegister.o \\\n  ByteSwap.o \\\n  ByteSwapRegister.o \\\n  CopyCoder.o \\\n  CopyRegister.o \\\n  LzmaDecoder.o \\\n  LzmaEncoder.o \\\n  LzmaRegister.o \\\n\nLZMA_BENCH_OBJS = \\\n  LzmaBench.o \\\n  LzmaBenchCon.o \\\n\n# 7zCrc.o Alloc.o\nC_OBJS = \\\n  Bra.o \\\n  Bra86.o \\\n  BraIA64.o \\\n  LzmaDec.o \\\n  LzmaEnc.o \\\n  LzFind.o \\\n  LzFindMt.o \\\n  Threads.o \\\n\nOBJS = \\\n  wine_date_and_time.o \\\n  myAddExeFlag.o \\\n  mySplitCommandLine.o \\\n  $(CONSOLE_OBJS) \\\n  $(COMMON_OBJS) \\\n  $(WIN_OBJS) \\\n  $(7ZIP_COMMON_OBJS) \\\n  $(UI_COMMON_OBJS) \\\n  $(AR_COMMON_OBJS) \\\n  $(7Z_OBJS) \\\n  $(LZM_OBJS) \\\n  $(SPLIT_OBJS) \\\n  $(COMPRESS_OBJS) \\\n  $(LZMA_BENCH_OBJS) \\\n  $(C_OBJS) \\\n$(OBJ_CRC32) \\\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Alone7z/makefile.depend",
    "content": "wine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nmyAddExeFlag.o: ../../../myWindows/myAddExeFlag.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../myWindows/myPrivate.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nmySplitCommandLine.o: ../../../myWindows/mySplitCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../myWindows/../Common/StringConvert.h \\\n  ../../../myWindows/../Common/MyWindows.h \\\n  ../../../myWindows/../Common/MyString.h \\\n  ../../../myWindows/../Common/MyVector.h \\\n  ../../../myWindows/../Common/Defs.h \\\n  ../../../myWindows/../Common/Types.h ../../../myWindows/myPrivate.h\nConsoleClose.o: ../../UI/Console/ConsoleClose.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/ConsoleClose.h\nExtractCallbackConsole.o: ../../UI/Console/ExtractCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Console/ExtractCallbackConsole.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Console/../../Common/../IStream.h \\\n  ../../UI/Console/../../Common/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Common/../../Common/MyWindows.h \\\n  ../../UI/Console/../../Common/../../Common/Types.h \\\n  ../../UI/Console/../../Common/../IDecl.h \\\n  ../../UI/Console/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../../../Common/Types.h ../../UI/Console/../../IDecl.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../../Archive/../IStream.h \\\n  ../../UI/Console/../../Archive/../IProgress.h \\\n  ../../UI/Console/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../../Archive/../IDecl.h \\\n  ../../UI/Console/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../UI/Console/../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/UserInputUtils.h ../../UI/Console/ConsoleClose.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Error.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Console/../../Common/FilePathAutoRename.h \\\n  ../../UI/Console/../Common/ExtractingFilePath.h\nList.o: ../../UI/Console/List.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Console/List.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../../IStream.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/MyCom.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/Error.h ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/PropIDUtils.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/OpenArchive.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyCom.h ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h\nMain.o: ../../UI/Console/Main.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyInitGuid.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyException.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Common/ListFileUtils.h ../../../Common/StdInStream.h \\\n  ../../../Common/StdOutStream.h ../../../Common/StringConvert.h \\\n  ../../../Common/StringToInt.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../../../Common/MyWindows.h \\\n  ../../UI/Console/../../../Common/Types.h ../../UI/Console/../../IDecl.h \\\n  ../../UI/Console/../../ICoder.h ../../UI/Console/../../IStream.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/Extract.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/../Common/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/ArchiveCommandLine.h \\\n  ../../../Common/CommandLineParser.h \\\n  ../../UI/Console/../Common/Extract.h \\\n  ../../UI/Console/../Common/Update.h \\\n  ../../UI/Console/../Common/ExitCode.h \\\n  ../../UI/Console/../../Compress/LZMA_Alone/LzmaBenchCon.h \\\n  ../../UI/Console/../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../UI/Console/List.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Console/ExtractCallbackConsole.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/UpdateCallbackConsole.h \\\n  ../../UI/Console/PercentPrinter.h ../../../Common/Types.h \\\n  ../../UI/Console/../../MyVersion.h ../../../myWindows/myPrivate.h \\\n  ../../../Windows/System.h ../../../Windows/../Common/Types.h\nMainAr.o: ../../UI/Console/MainAr.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h ../../../Common/NewHandler.h \\\n  ../../../Common/MyException.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/ExitCode.h \\\n  ../../UI/Console/../Common/ArchiveCommandLine.h \\\n  ../../../Common/Wildcard.h ../../../Common/CommandLineParser.h \\\n  ../../UI/Console/../Common/Extract.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h ../../UI/Console/../Common/../../IDecl.h \\\n  ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/Update.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/LoadCodecs.h ../../UI/Console/ConsoleClose.h\nOpenCallbackConsole.o: ../../UI/Console/OpenCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/OpenCallbackConsole.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../UI/Console/UserInputUtils.h\nPercentPrinter.o: ../../UI/Console/PercentPrinter.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Console/PercentPrinter.h \\\n  ../../../Common/Types.h ../../../Common/StdOutStream.h\nUpdateCallbackConsole.o: ../../UI/Console/UpdateCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Console/UpdateCallbackConsole.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h ../../UI/Console/PercentPrinter.h \\\n  ../../../Common/Types.h ../../UI/Console/../Common/Update.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../../IStream.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../UI/Console/ConsoleClose.h ../../UI/Console/UserInputUtils.h\nUserInputUtils.o: ../../UI/Console/UserInputUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../UI/Console/UserInputUtils.h \\\n  ../../../Common/StdOutStream.h ../../../Common/MyException.h\nCommandLineParser.o: ../../../Common/CommandLineParser.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nCRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/../../C/7zCrc.h ../../../Common/../../C/Types.h\nIntToString.o: ../../../Common/IntToString.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h\nListFileUtils.o: ../../../Common/ListFileUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/MyWindows.h \\\n  ../../../Common/../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/ListFileUtils.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/UTFConvert.h\nStdInStream.o: ../../../Common/StdInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nStdOutStream.o: ../../../Common/StdOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nStringToInt.o: ../../../Common/StringToInt.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringToInt.h\nUTFConvert.o: ../../../Common/UTFConvert.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nError.o: ../../../Windows/Error.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileName.o: ../../../Windows/FileName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantConversions.o: ../../../Windows/PropVariantConversions.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h\nSynchronization.o: ../../../Windows/Synchronization.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nSystem.o: ../../../Windows/System.cpp ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h\nTime.o: ../../../Windows/Time.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h\nCreateCoder.o: ../../Common/CreateCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MethodId.h \\\n  ../../Common/../../Common/Types.h \\\n  ../../Common/../../Windows/PropVariant.h \\\n  ../../Common/../../Windows/../Common/MyWindows.h \\\n  ../../Common/../../Windows/../Common/Types.h \\\n  ../../Common/../../Windows/Defs.h ../../Common/FilterCoder.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../IPassword.h \\\n  ../../Common/RegisterCodec.h ../../Common/../Common/MethodId.h\nFilePathAutoRename.o: ../../Common/FilePathAutoRename.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h\nFileStreams.o: ../../Common/FileStreams.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FileStreams.h ../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h\nFilterCoder.o: ../../Common/FilterCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FilterCoder.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../ICoder.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../IPassword.h ../../Common/../../../C/Alloc.h \\\n  ../../Common/../../Common/Defs.h ../../Common/StreamUtils.h \\\n  ../../Common/../IStream.h\nInBuffer.o: ../../Common/InBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/InBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nInOutTempBuffer.o: ../../Common/InOutTempBuffer.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/InOutTempBuffer.h \\\n  ../../Common/../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Common/../../Windows/FileDir.h \\\n  ../../Common/../../Windows/../Common/MyString.h \\\n  ../../Common/../../Windows/Defs.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/Defs.h \\\n  ../../Common/StreamUtils.h\nLimitedStreams.o: ../../Common/LimitedStreams.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/LimitedStreams.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nLockedStream.o: ../../Common/LockedStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/LockedStream.h \\\n  ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h\nMethodId.o: ../../Common/MethodId.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/MethodId.h ../../Common/../../Common/Types.h \\\n  ../../Common/../../Common/MyString.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h\nMethodProps.o: ../../Common/MethodProps.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MethodProps.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Windows/PropVariant.h \\\n  ../../Common/../../Windows/../Common/MyWindows.h \\\n  ../../Common/../../Windows/../Common/Types.h ../../Common/MethodId.h \\\n  ../../Common/../../Common/Types.h\nOffsetStream.o: ../../Common/OffsetStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../Common/OffsetStream.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nOutBuffer.o: ../../Common/OutBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nOutMemStream.o: ../../Common/OutMemStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutMemStream.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Common/MemBlocks.h \\\n  ../../Common/../../../C/Alloc.h ../../../Common/Types.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nProgressUtils.o: ../../Common/ProgressUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/ProgressUtils.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../IProgress.h\nStreamBinder.o: ../../Common/StreamBinder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamBinder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/Defs.h ../../Common/../../Common/MyCom.h\nStreamObjects.o: ../../Common/StreamObjects.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/StreamObjects.h \\\n  ../../Common/../../Common/DynamicBuffer.h \\\n  ../../Common/../../Common/Buffer.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nVirtThread.o: ../../Common/VirtThread.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/VirtThread.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Windows/Thread.h\nArchiveCommandLine.o: ../../UI/Common/ArchiveCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ListFileUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringToInt.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h \\\n  ../../UI/Common/ArchiveCommandLine.h ../../../Common/Wildcard.h \\\n  ../../../Common/CommandLineParser.h ../../UI/Common/Extract.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/Property.h ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/Update.h ../../UI/Common/UpdateAction.h \\\n  ../../UI/Common/UpdateCallback.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/SortUtils.h ../../UI/Common/EnumDirItems.h \\\n  ../../UI/Common/DirItem.h ../../../myWindows/myPrivate.h\nArchiveExtractCallback.o: ../../UI/Common/ArchiveExtractCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/ComTry.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Common/../../Common/FilePathAutoRename.h \\\n  ../../UI/Common/../Common/ExtractingFilePath.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/ArchiveOpenCallback.h\nArchiveOpenCallback.o: ../../UI/Common/ArchiveOpenCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h\nDefaultName.o: ../../UI/Common/DefaultName.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/DefaultName.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nEnumDirItems.o: ../../UI/Common/EnumDirItems.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyCom.h \\\n  ../../UI/Common/EnumDirItems.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h\nExtract.o: ../../UI/Common/Extract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/Extract.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/Property.h ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/SetProperties.h\nExtractingFilePath.o: ../../UI/Common/ExtractingFilePath.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ExtractingFilePath.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nLoadCodecs.o: ../../UI/Common/LoadCodecs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/LoadCodecs.h ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/MyVector.h \\\n  ../../UI/Common/../../../Common/Defs.h \\\n  ../../UI/Common/../../../Common/Buffer.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/../../../Windows/PropVariant.h \\\n  ../../UI/Common/../../../Windows/../Common/MyWindows.h \\\n  ../../UI/Common/../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/RegisterArc.h \\\n  ../../UI/Common/../../Common/../Archive/IArchive.h\nOpenArchive.o: ../../UI/Common/OpenArchive.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/OpenArchive.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyCom.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/StreamUtils.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../UI/Common/DefaultName.h\nPropIDUtils.o: ../../UI/Common/PropIDUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/PropIDUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariantConversions.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../PropID.h\nSetProperties.o: ../../UI/Common/SetProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/SetProperties.h \\\n  ../../UI/Common/Property.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Common/StringToInt.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h\nSortUtils.o: ../../UI/Common/SortUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/SortUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nTempFiles.o: ../../UI/Common/TempFiles.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/TempFiles.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h\nUpdate.o: ../../UI/Common/Update.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/UpdateCallback.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../ICoder.h ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../UI/Common/Property.h \\\n  ../../UI/Common/LoadCodecs.h ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Windows/FileDir.h \\\n  ../../../Windows/FileName.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/Time.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Compress/CopyCoder.h \\\n  ../../UI/Common/../../Compress/../../Common/MyCom.h \\\n  ../../UI/Common/../../Compress/../ICoder.h \\\n  ../../UI/Common/../Common/DirItem.h \\\n  ../../UI/Common/../Common/EnumDirItems.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../UI/Common/../Common/OpenArchive.h \\\n  ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/EnumDirItems.h ../../UI/Common/SetProperties.h \\\n  ../../UI/Common/TempFiles.h\nUpdateAction.o: ../../UI/Common/UpdateAction.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateAction.h\nUpdateCallback.o: ../../UI/Common/UpdateCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateCallback.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../ICoder.h ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../Common/../../Archive/../PropID.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h\nUpdatePair.o: ../../UI/Common/UpdatePair.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Time.h ../../../Common/Types.h \\\n  ../../UI/Common/UpdatePair.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h ../../UI/Common/SortUtils.h\nUpdateProduce.o: ../../UI/Common/UpdateProduce.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateProduce.h \\\n  ../../UI/Common/UpdatePair.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h\nZHandler.o: ../../Archive/ZHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Compress/ZDecoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h ../../../Common/MyCom.h\nCoderMixer2.o: ../../Archive/Common/CoderMixer2.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h\nCoderMixer2MT.o: ../../Archive/Common/CoderMixer2MT.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2MT.h \\\n  ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../Common/StreamBinder.h \\\n  ../../Archive/Common/../../Common/../IStream.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../Common/VirtThread.h \\\n  ../../Archive/Common/../../Common/../../Windows/Thread.h\nCrossThreadProgress.o: ../../Archive/Common/CrossThreadProgress.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/CrossThreadProgress.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../../Windows/Defs.h \\\n  ../../Archive/Common/../../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../../Common/MyCom.h\nDummyOutStream.o: ../../Archive/Common/DummyOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h\nHandlerOut.o: ../../Archive/Common/HandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/../../../Common/StringToInt.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Windows/PropVariant.h \\\n  ../../Archive/Common/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Windows/../Common/Types.h \\\n  ../../Archive/Common/../../../Windows/System.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../Archive/Common/HandlerOut.h \\\n  ../../Archive/Common/../../../Common/MyString.h \\\n  ../../Archive/Common/../../Common/MethodProps.h \\\n  ../../Archive/Common/../../Common/../../Common/MyVector.h \\\n  ../../Archive/Common/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/Common/../../Common/MethodId.h \\\n  ../../Archive/Common/../../Common/../../Common/Types.h\nInStreamWithCRC.o: ../../Archive/Common/InStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/InStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\nItemNameUtils.o: ../../Archive/Common/ItemNameUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/ItemNameUtils.h \\\n  ../../Archive/Common/../../../Common/MyString.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h\nMultiStream.o: ../../Archive/Common/MultiStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/MultiStream.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../Archive/IArchive.h \\\n  ../../Archive/Common/../../Archive/../IStream.h \\\n  ../../Archive/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Common/../../Archive/../../Common/Types.h \\\n  ../../Archive/Common/../../Archive/../IDecl.h \\\n  ../../Archive/Common/../../Archive/../IProgress.h \\\n  ../../Archive/Common/../../Archive/../PropID.h\nOutStreamWithCRC.o: ../../Archive/Common/OutStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/OutStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\nParseProperties.o: ../../Archive/Common/ParseProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../../Common/StringToInt.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h\n7zCompressionMode.o: ../../Archive/7z/7zCompressionMode.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\n7zDecode.o: ../../Archive/7z/7zDecode.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/LockedStream.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h\n7zEncode.o: ../../Archive/7z/7zEncode.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zEncode.h ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/7zSpecStream.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/InOutTempBuffer.h \\\n  ../../Archive/7z/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/../../Windows/FileDir.h \\\n  ../../Archive/7z/../../Common/../../Windows/../Common/MyString.h \\\n  ../../Archive/7z/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/FilterCoder.h \\\n  ../../Archive/7z/../../Common/../IPassword.h\n7zExtract.o: ../../Archive/7z/7zExtract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h\n7zFolderInStream.o: ../../Archive/7z/7zFolderInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zFolderInStream.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/InStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h\n7zFolderOutStream.o: ../../Archive/7z/7zFolderOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IProgress.h \\\n  ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h\n7zHandler.o: ../../Archive/7z/7zHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/IntToString.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../../Windows/System.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zProperties.h ../../Archive/7z/../../PropID.h\n7zHandlerOut.o: ../../Archive/7z/7zHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/StringToInt.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/ParseProperties.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../../Archive/7z/7zHandler.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zOut.h ../../Archive/7z/7zEncode.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/OutBuffer.h ../../Archive/7z/7zUpdate.h\n7zHeader.o: ../../Archive/7z/7zHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h\n7zIn.o: ../../Archive/7z/7zIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../../../../C/Types.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/StreamUtils.h ../../Archive/7z/7zDecode.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/7zIn.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h\n7zOut.o: ../../Archive/7z/7zOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../Common/AutoPtr.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h ../../Archive/7z/7zOut.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zEncode.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/OutBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../../../../C/Types.h\n7zProperties.o: ../../Archive/7z/7zProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zProperties.h \\\n  ../../Archive/7z/../../PropID.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/7zHandler.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h\n7zSpecStream.o: ../../Archive/7z/7zSpecStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zSpecStream.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyCom.h\n7zUpdate.o: ../../Archive/7z/7zUpdate.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Compress/CopyCoder.h \\\n  ../../Archive/7z/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Compress/../ICoder.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/7zEncode.h ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/7zFolderInStream.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/InStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/7zIn.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zOut.h ../../Archive/7z/../../Common/OutBuffer.h \\\n  ../../Archive/7z/7zUpdate.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h\n7zRegister.o: ../../Archive/7z/7zRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/RegisterArc.h \\\n  ../../Archive/7z/../../Common/../Archive/IArchive.h \\\n  ../../Archive/7z/../../Common/../Archive/../IStream.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/7z/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/7z/../../Common/../Archive/../PropID.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h\nLzmaArcRegister.o: ../../Archive/Lzma/LzmaArcRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Lzma/../../Common/RegisterArc.h \\\n  ../../Archive/Lzma/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Lzma/LzmaHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Lzma/../IArchive.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h\nLzmaFiltersDecode.o: ../../Archive/Lzma/LzmaFiltersDecode.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Lzma/LzmaFiltersDecode.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/../IDecl.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaItem.h ../../../Common/Types.h \\\n  ../../Archive/Lzma/../../../../C/CpuArch.h\nLzmaHandler.o: ../../Archive/Lzma/LzmaHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Lzma/LzmaHandler.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../IArchive.h ../../Archive/Lzma/../../IStream.h \\\n  ../../Archive/Lzma/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../../Common/Types.h \\\n  ../../Archive/Lzma/../../IDecl.h ../../Archive/Lzma/../../IProgress.h \\\n  ../../Archive/Lzma/../../PropID.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Common/IntToString.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/ProgressUtils.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Lzma/../../Common/../IProgress.h \\\n  ../../Archive/Lzma/../../Common/StreamUtils.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../Common/DummyOutStream.h \\\n  ../../Archive/Lzma/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Lzma/LzmaFiltersDecode.h\nLzmaIn.o: ../../Archive/Lzma/LzmaIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h \\\n  ../../Archive/Lzma/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../../Common/Types.h \\\n  ../../Archive/Lzma/../../IDecl.h \\\n  ../../Archive/Lzma/../../Common/StreamUtils.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h\nSplitHandler.o: ../../Archive/Split/SplitHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/NewHandler.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h \\\n  ../../Archive/Split/../../Common/ProgressUtils.h \\\n  ../../Archive/Split/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Split/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Split/../../Common/../ICoder.h \\\n  ../../Archive/Split/../../Common/../IStream.h \\\n  ../../Archive/Split/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Split/../../Common/../../Common/Types.h \\\n  ../../Archive/Split/../../Common/../IDecl.h \\\n  ../../Archive/Split/../../Common/../IProgress.h \\\n  ../../Archive/Split/../../Compress/CopyCoder.h \\\n  ../../Archive/Split/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Split/../../Compress/../ICoder.h \\\n  ../../Archive/Split/../Common/ItemNameUtils.h \\\n  ../../Archive/Split/../Common/../../../Common/MyString.h \\\n  ../../Archive/Split/../Common/MultiStream.h \\\n  ../../Archive/Split/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Split/../Common/../../../Common/MyVector.h \\\n  ../../Archive/Split/../Common/../../Archive/IArchive.h \\\n  ../../Archive/Split/../Common/../../Archive/../IStream.h \\\n  ../../Archive/Split/../Common/../../Archive/../IProgress.h \\\n  ../../Archive/Split/../Common/../../Archive/../PropID.h \\\n  ../../Archive/Split/SplitHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Split/../IArchive.h\nSplitRegister.o: ../../Archive/Split/SplitRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Split/../../Common/RegisterArc.h \\\n  ../../Archive/Split/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Split/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Split/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Split/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Split/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Split/SplitHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Split/../IArchive.h\nBcj2Coder.o: ../../Compress/Bcj2Coder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/Bcj2Coder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcj2Register.o: ../../Compress/Bcj2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/Bcj2Coder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcjCoder.o: ../../Compress/BcjCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBcjRegister.o: ../../Compress/BcjRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchCoder.o: ../../Compress/BranchCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BranchCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchMisc.o: ../../Compress/BranchMisc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Bra.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/BranchMisc.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchRegister.o: ../../Compress/BranchRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BranchMisc.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nByteSwap.o: ../../Compress/ByteSwap.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/ByteSwap.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nByteSwapRegister.o: ../../Compress/ByteSwapRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/ByteSwap.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nCopyCoder.o: ../../Compress/CopyCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/CopyCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nCopyRegister.o: ../../Compress/CopyRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/CopyCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nLzmaDecoder.o: ../../Compress/LzmaDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/LzmaDecoder.h \\\n  ../../Compress/../../../C/LzmaDec.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaEncoder.o: ../../Compress/LzmaEncoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/LzmaEncoder.h \\\n  ../../Compress/../../../C/LzmaEnc.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaRegister.o: ../../Compress/LzmaRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/LzmaDecoder.h ../../Compress/../../../C/LzmaDec.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/LzmaEncoder.h ../../Compress/../../../C/LzmaEnc.h\nLzmaBench.o: ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/7zCrc.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Alloc.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Defs.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Threads.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization2.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Thread.h \\\n  ../../Compress/LZMA_Alone/../LzmaDecoder.h \\\n  ../../Compress/LZMA_Alone/../../../../C/LzmaDec.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../ICoder.h \\\n  ../../Compress/LZMA_Alone/../../IStream.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../IDecl.h \\\n  ../../Compress/LZMA_Alone/../LzmaEncoder.h \\\n  ../../Compress/LZMA_Alone/../../../../C/LzmaEnc.h\nLzmaBenchCon.o: ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/LzmaBenchCon.h \\\n  ../../Compress/LZMA_Alone/../../../Common/IntToString.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/System.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Console/ConsoleClose.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyWindows.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Alone7z/makefile.list",
    "content": "SRCS=\\\n ../../../myWindows/wine_date_and_time.cpp \\\n ../../../myWindows/myAddExeFlag.cpp \\\n ../../../myWindows/mySplitCommandLine.cpp \\\n \\\n ../../UI/Console/ConsoleClose.cpp \\\n ../../UI/Console/ExtractCallbackConsole.cpp \\\n ../../UI/Console/List.cpp \\\n ../../UI/Console/Main.cpp \\\n ../../UI/Console/MainAr.cpp \\\n ../../UI/Console/OpenCallbackConsole.cpp \\\n ../../UI/Console/PercentPrinter.cpp \\\n ../../UI/Console/UpdateCallbackConsole.cpp \\\n ../../UI/Console/UserInputUtils.cpp \\\n \\\n ../../../Common/CommandLineParser.cpp \\\n ../../../Common/CRC.cpp \\\n ../../../Common/IntToString.cpp \\\n ../../../Common/ListFileUtils.cpp \\\n ../../../Common/StdInStream.cpp \\\n ../../../Common/StdOutStream.cpp \\\n ../../../Common/MyString.cpp \\\n ../../../Common/MyWindows.cpp \\\n ../../../Common/StringConvert.cpp \\\n ../../../Common/StringToInt.cpp \\\n ../../../Common/UTFConvert.cpp \\\n ../../../Common/MyVector.cpp \\\n ../../../Common/Wildcard.cpp \\\n \\\n ../../../Windows/Error.cpp \\\n ../../../Windows/FileDir.cpp \\\n ../../../Windows/FileFind.cpp \\\n ../../../Windows/FileIO.cpp \\\n ../../../Windows/FileName.cpp \\\n ../../../Windows/PropVariant.cpp \\\n ../../../Windows/PropVariantConversions.cpp \\\n ../../../Windows/Synchronization.cpp \\\n ../../../Windows/System.cpp \\\n ../../../Windows/Time.cpp \\\n \\\n ../../Common/CreateCoder.cpp \\\n ../../Common/FilePathAutoRename.cpp \\\n ../../Common/FileStreams.cpp \\\n ../../Common/FilterCoder.cpp \\\n ../../Common/InBuffer.cpp \\\n ../../Common/InOutTempBuffer.cpp \\\n ../../Common/LimitedStreams.cpp \\\n ../../Common/LockedStream.cpp \\\n ../../Common/MethodId.cpp \\\n ../../Common/MethodProps.cpp \\\n ../../Common/OffsetStream.cpp \\\n ../../Common/OutBuffer.cpp \\\n ../../Common/OutMemStream.cpp \\\n ../../Common/ProgressUtils.cpp \\\n ../../Common/StreamBinder.cpp \\\n ../../Common/StreamObjects.cpp \\\n ../../Common/StreamUtils.cpp \\\n ../../Common/VirtThread.cpp \\\n \\\n ../../UI/Common/ArchiveCommandLine.cpp \\\n ../../UI/Common/ArchiveExtractCallback.cpp \\\n ../../UI/Common/ArchiveOpenCallback.cpp \\\n ../../UI/Common/DefaultName.cpp \\\n ../../UI/Common/EnumDirItems.cpp \\\n ../../UI/Common/Extract.cpp \\\n ../../UI/Common/ExtractingFilePath.cpp \\\n ../../UI/Common/LoadCodecs.cpp \\\n ../../UI/Common/OpenArchive.cpp \\\n ../../UI/Common/PropIDUtils.cpp \\\n ../../UI/Common/SetProperties.cpp \\\n ../../UI/Common/SortUtils.cpp \\\n ../../UI/Common/TempFiles.cpp \\\n ../../UI/Common/Update.cpp \\\n ../../UI/Common/UpdateAction.cpp \\\n ../../UI/Common/UpdateCallback.cpp \\\n ../../UI/Common/UpdatePair.cpp \\\n ../../UI/Common/UpdateProduce.cpp \\\n \\\n ../../Archive/ZHandler.cpp \\\n \\\n ../../Archive/Common/CoderMixer2.cpp \\\n ../../Archive/Common/CoderMixer2MT.cpp \\\n ../../Archive/Common/CrossThreadProgress.cpp \\\n ../../Archive/Common/DummyOutStream.cpp \\\n ../../Archive/Common/HandlerOut.cpp \\\n ../../Archive/Common/InStreamWithCRC.cpp \\\n ../../Archive/Common/ItemNameUtils.cpp \\\n ../../Archive/Common/MultiStream.cpp \\\n ../../Archive/Common/OutStreamWithCRC.cpp \\\n ../../Archive/Common/ParseProperties.cpp \\\n \\\n ../../Archive/7z/7zCompressionMode.cpp \\\n ../../Archive/7z/7zDecode.cpp \\\n ../../Archive/7z/7zEncode.cpp \\\n ../../Archive/7z/7zExtract.cpp \\\n ../../Archive/7z/7zFolderInStream.cpp \\\n ../../Archive/7z/7zFolderOutStream.cpp \\\n ../../Archive/7z/7zHandler.cpp \\\n ../../Archive/7z/7zHandlerOut.cpp \\\n ../../Archive/7z/7zHeader.cpp \\\n ../../Archive/7z/7zIn.cpp \\\n ../../Archive/7z/7zOut.cpp \\\n ../../Archive/7z/7zProperties.cpp \\\n ../../Archive/7z/7zSpecStream.cpp \\\n ../../Archive/7z/7zUpdate.cpp \\\n ../../Archive/7z/7zRegister.cpp \\\n \\\n ../../Archive/Lzma/LzmaArcRegister.cpp \\\n ../../Archive/Lzma/LzmaFiltersDecode.cpp \\\n ../../Archive/Lzma/LzmaHandler.cpp \\\n ../../Archive/Lzma/LzmaIn.cpp \\\n \\\n ../../Archive/Split/SplitHandler.cpp \\\n ../../Archive/Split/SplitRegister.cpp \\\n \\\n ../../Compress/Bcj2Coder.cpp \\\n ../../Compress/Bcj2Register.cpp \\\n ../../Compress/BcjCoder.cpp \\\n ../../Compress/BcjRegister.cpp \\\n ../../Compress/BranchCoder.cpp \\\n ../../Compress/BranchMisc.cpp \\\n ../../Compress/BranchRegister.cpp \\\n ../../Compress/ByteSwap.cpp \\\n ../../Compress/ByteSwapRegister.cpp \\\n ../../Compress/CopyCoder.cpp \\\n ../../Compress/CopyRegister.cpp \\\n ../../Compress/LzmaDecoder.cpp \\\n ../../Compress/LzmaEncoder.cpp \\\n ../../Compress/LzmaRegister.cpp \\\n \\\n ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n\n\nSRCS_C=\\\n ../../../../C/Bra.c \\\n ../../../../C/Bra86.c \\\n ../../../../C/BraIA64.c \\\n ../../../../C/LzmaDec.c \\\n ../../../../C/LzmaEnc.c \\\n ../../../../C/LzFind.c \\\n ../../../../C/LzFindMt.c \\\n ../../../../C/Threads.c \\\n\ninclude ../../../../makefile.rules\n\nMain.o : ../../UI/Console/Main.cpp\n\t$(CXX) $(CXXFLAGS) ../../UI/Console/Main.cpp\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/AloneGCOV/makefile",
    "content": "\n# gcov *.c *.cpp\n\n\nALLFLAGS=-fprofile-arcs -ftest-coverage \\\n    \t-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \\\n\t-DNDEBUG -D_REENTRANT -DENV_UNIX \\\n  -DCOMPRESS_MT \\\n  -DCOMPRESS_BZIP2_MT \\\n  -DCOMPRESS_MF_MT \\\n  -DBREAK_HANDLER \\\n  -DBENCH_MT \\\n\t-I../../Archive \\\n\t-I../../Archive/7z \\\n\t-I../../Archive/BZip2 \\\n\t-I../../Archive/Common \\\n\t-I../../Archive/GZip \\\n\t-I../../Archive/Cab \\\n\t-I../../Archive/Lzma \\\n\t-I../../Archive/Tar \\\n\t-I../../Archive/Zip \\\n\t-I../../Archive/Split \\\n\t-I../../Archive/Z \\\n\t-I../../Compress \\\n       \t-I../../Crypto \\\n\t-I../../UI/Console \\\n\t-I../../UI/Common \\\n\t-I../../../Windows \\\n\t-I../../../Common \\\n\t-I../../../7zip/Common \\\n\t-I../../../../C \\\n\t-I../../Compress/LZMA_Alone \\\n-I../../../myWindows \\\n-I../../../ \\\n-I../../../include_windows\n\nCXX=g++ $(ALLFLAGS)\nCC=gcc $(ALLFLAGS)\n\nSRCS=\\\n ../../../myWindows/myGetTickCount.cpp \\\n ../../../myWindows/wine_date_and_time.cpp \\\n ../../../myWindows/myAddExeFlag.cpp \\\n ../../../myWindows/mySplitCommandLine.cpp \\\n \\\n ../../UI/Console/ConsoleClose.cpp \\\n ../../UI/Console/ExtractCallbackConsole.cpp \\\n ../../UI/Console/List.cpp \\\n ../../UI/Console/Main.cpp \\\n ../../UI/Console/MainAr.cpp \\\n ../../UI/Console/OpenCallbackConsole.cpp \\\n ../../UI/Console/PercentPrinter.cpp \\\n ../../UI/Console/UpdateCallbackConsole.cpp \\\n ../../UI/Console/UserInputUtils.cpp \\\n \\\n ../../../Common/CommandLineParser.cpp \\\n ../../../Common/CRC.cpp \\\n ../../../Common/IntToString.cpp \\\n ../../../Common/ListFileUtils.cpp \\\n ../../../Common/StdInStream.cpp \\\n ../../../Common/StdOutStream.cpp \\\n ../../../Common/MyString.cpp \\\n ../../../Common/MyWindows.cpp \\\n ../../../Common/StringConvert.cpp \\\n ../../../Common/StringToInt.cpp \\\n ../../../Common/UTFConvert.cpp \\\n ../../../Common/MyVector.cpp \\\n ../../../Common/Wildcard.cpp \\\n \\\n ../../../Windows/Error.cpp \\\n ../../../Windows/FileDir.cpp \\\n ../../../Windows/FileFind.cpp \\\n ../../../Windows/FileIO.cpp \\\n ../../../Windows/FileName.cpp \\\n ../../../Windows/PropVariant.cpp \\\n ../../../Windows/PropVariantConversions.cpp \\\n ../../../Windows/Synchronization.cpp \\\n ../../../Windows/System.cpp \\\n ../../../Windows/Time.cpp \\\n \\\n ../../Common/CreateCoder.cpp \\\n ../../Common/FilePathAutoRename.cpp \\\n ../../Common/FileStreams.cpp \\\n ../../Common/FilterCoder.cpp \\\n ../../Common/InBuffer.cpp \\\n ../../Common/InOutTempBuffer.cpp \\\n ../../Common/LimitedStreams.cpp \\\n ../../Common/LockedStream.cpp \\\n ../../Common/MemBlocks.cpp \\\n ../../Common/MethodId.cpp \\\n ../../Common/MethodProps.cpp \\\n ../../Common/OffsetStream.cpp \\\n ../../Common/OutBuffer.cpp \\\n ../../Common/OutMemStream.cpp \\\n ../../Common/ProgressMt.cpp \\\n ../../Common/ProgressUtils.cpp \\\n ../../Common/StreamBinder.cpp \\\n ../../Common/StreamObjects.cpp \\\n ../../Common/StreamUtils.cpp \\\n ../../Common/VirtThread.cpp \\\n \\\n ../../UI/Common/ArchiveCommandLine.cpp \\\n ../../UI/Common/ArchiveExtractCallback.cpp \\\n ../../UI/Common/ArchiveOpenCallback.cpp \\\n ../../UI/Common/DefaultName.cpp \\\n ../../UI/Common/EnumDirItems.cpp \\\n ../../UI/Common/Extract.cpp \\\n ../../UI/Common/ExtractingFilePath.cpp \\\n ../../UI/Common/LoadCodecs.cpp \\\n ../../UI/Common/OpenArchive.cpp \\\n ../../UI/Common/PropIDUtils.cpp \\\n ../../UI/Common/SetProperties.cpp \\\n ../../UI/Common/SortUtils.cpp \\\n ../../UI/Common/TempFiles.cpp \\\n ../../UI/Common/Update.cpp \\\n ../../UI/Common/UpdateAction.cpp \\\n ../../UI/Common/UpdateCallback.cpp \\\n ../../UI/Common/UpdatePair.cpp \\\n ../../UI/Common/UpdateProduce.cpp \\\n \\\n ../../Archive/ZHandler.cpp \\\n \\\n ../../Archive/Common/CoderMixer2.cpp \\\n ../../Archive/Common/CoderMixer2MT.cpp \\\n ../../Archive/Common/CrossThreadProgress.cpp \\\n ../../Archive/Common/DummyOutStream.cpp \\\n ../../Archive/Common/FindSignature.cpp \\\n ../../Archive/Common/HandlerOut.cpp \\\n ../../Archive/Common/InStreamWithCRC.cpp \\\n ../../Archive/Common/ItemNameUtils.cpp \\\n ../../Archive/Common/MultiStream.cpp \\\n ../../Archive/Common/OutStreamWithCRC.cpp \\\n ../../Archive/Common/ParseProperties.cpp \\\n \\\n ../../Archive/7z/7zCompressionMode.cpp \\\n ../../Archive/7z/7zDecode.cpp \\\n ../../Archive/7z/7zEncode.cpp \\\n ../../Archive/7z/7zExtract.cpp \\\n ../../Archive/7z/7zFolderInStream.cpp \\\n ../../Archive/7z/7zFolderOutStream.cpp \\\n ../../Archive/7z/7zHandler.cpp \\\n ../../Archive/7z/7zHandlerOut.cpp \\\n ../../Archive/7z/7zHeader.cpp \\\n ../../Archive/7z/7zIn.cpp \\\n ../../Archive/7z/7zOut.cpp \\\n ../../Archive/7z/7zProperties.cpp \\\n ../../Archive/7z/7zSpecStream.cpp \\\n ../../Archive/7z/7zUpdate.cpp \\\n ../../Archive/7z/7zRegister.cpp \\\n \\\n ../../Archive/BZip2/BZip2Handler.cpp \\\n ../../Archive/BZip2/BZip2HandlerOut.cpp \\\n ../../Archive/BZip2/BZip2Update.cpp \\\n ../../Archive/BZip2/bz2Register.cpp \\\n \\\n ../../Archive/Cab/CabBlockInStream.cpp \\\n ../../Archive/Cab/CabHandler.cpp \\\n ../../Archive/Cab/CabHeader.cpp \\\n ../../Archive/Cab/CabIn.cpp \\\n ../../Archive/Cab/CabRegister.cpp \\\n \\\n ../../Archive/GZip/GZipHandler.cpp \\\n ../../Archive/GZip/GZipHandlerOut.cpp \\\n ../../Archive/GZip/GZipHeader.cpp \\\n ../../Archive/GZip/GZipIn.cpp \\\n ../../Archive/GZip/GZipOut.cpp \\\n ../../Archive/GZip/GZipRegister.cpp \\\n ../../Archive/GZip/GZipUpdate.cpp \\\n \\\n ../../Archive/Lzma/LzmaArcRegister.cpp \\\n ../../Archive/Lzma/LzmaFiltersDecode.cpp \\\n ../../Archive/Lzma/LzmaHandler.cpp \\\n ../../Archive/Lzma/LzmaIn.cpp \\\n \\\n ../../Archive/Split/SplitHandler.cpp \\\n ../../Archive/Split/SplitRegister.cpp \\\n \\\n ../../Archive/Tar/TarHandler.cpp \\\n ../../Archive/Tar/TarHandlerOut.cpp \\\n ../../Archive/Tar/TarHeader.cpp \\\n ../../Archive/Tar/TarIn.cpp \\\n ../../Archive/Tar/TarOut.cpp \\\n ../../Archive/Tar/TarRegister.cpp \\\n ../../Archive/Tar/TarUpdate.cpp \\\n \\\n ../../Archive/Zip/ZipAddCommon.cpp \\\n ../../Archive/Zip/ZipHandler.cpp \\\n ../../Archive/Zip/ZipHandlerOut.cpp \\\n ../../Archive/Zip/ZipHeader.cpp \\\n ../../Archive/Zip/ZipIn.cpp \\\n ../../Archive/Zip/ZipItem.cpp \\\n ../../Archive/Zip/ZipOut.cpp \\\n ../../Archive/Zip/ZipUpdate.cpp \\\n ../../Archive/Zip/ZipRegister.cpp \\\n \\\n ../../Compress/Bcj2Coder.cpp \\\n ../../Compress/Bcj2Register.cpp \\\n ../../Compress/BcjCoder.cpp \\\n ../../Compress/BcjRegister.cpp \\\n ../../Compress/BitlDecoder.cpp \\\n ../../Compress/BranchCoder.cpp \\\n ../../Compress/BranchMisc.cpp \\\n ../../Compress/BranchRegister.cpp \\\n ../../Compress/ByteSwap.cpp \\\n ../../Compress/ByteSwapRegister.cpp \\\n ../../Compress/BZip2Crc.cpp \\\n ../../Compress/BZip2Decoder.cpp \\\n ../../Compress/BZip2Encoder.cpp \\\n ../../Compress/BZip2Register.cpp \\\n ../../Compress/CopyCoder.cpp \\\n ../../Compress/CopyRegister.cpp \\\n ../../Compress/Deflate64Register.cpp \\\n ../../Compress/DeflateDecoder.cpp \\\n ../../Compress/DeflateEncoder.cpp \\\n ../../Compress/DeflateRegister.cpp \\\n ../../Compress/ImplodeDecoder.cpp \\\n ../../Compress/ImplodeHuffmanDecoder.cpp \\\n ../../Compress/LzmaDecoder.cpp \\\n ../../Compress/LzmaEncoder.cpp \\\n ../../Compress/LzmaRegister.cpp \\\n ../../Compress/LzOutWindow.cpp \\\n ../../Compress/Lzx86Converter.cpp \\\n ../../Compress/LzxDecoder.cpp \\\n ../../Compress/PpmdDecoder.cpp \\\n ../../Compress/PpmdEncoder.cpp \\\n ../../Compress/PpmdRegister.cpp \\\n ../../Compress/QuantumDecoder.cpp \\\n ../../Compress/ShrinkDecoder.cpp \\\n ../../Compress/ZDecoder.cpp \\\n \\\n ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n \\\n ../../Crypto/7zAes.cpp \\\n ../../Crypto/7zAesRegister.cpp \\\n ../../Crypto/HmacSha1.cpp \\\n ../../Crypto/MyAes.cpp \\\n ../../Crypto/Pbkdf2HmacSha1.cpp \\\n ../../Crypto/RandGen.cpp \\\n ../../Crypto/Sha1.cpp \\\n ../../Crypto/WzAes.cpp \\\n ../../Crypto/ZipCrypto.cpp \\\n ../../Crypto/ZipStrong.cpp\n\nSRCS_C=\\\n ../../../../C/Bra.c \\\n ../../../../C/Bra86.c \\\n ../../../../C/BraIA64.c \\\n ../../../../C/BwtSort.c \\\n ../../../../C/HuffEnc.c \\\n ../../../../C/LzFind.c \\\n ../../../../C/LzFindMt.c \\\n ../../../../C/LzmaDec.c \\\n ../../../../C/LzmaEnc.c \\\n ../../../../C/Sort.c \\\n ../../../../C/Threads.c \\\n ../../../../C/Aes.c \\\n ../../../../C/Sha256.c \\\n../../../../C/7zCrc.c\n\nall : copy 7za.exe\n\t\n7za.exe:\n\t$(CXX) -c *.cpp \n\t$(CC)  -c *.c\n\t$(CXX) *.o -o 7za.exe -lpthread\n\tld -r *.o -o  7za.ld\n\tnm -u -C 7za.ld > 7za.undefined\ncopy:\n\trm -f *.cpp *.c\n\tcp -p $(SRCS) $(SRCS_C) .\n\nclean:\n\trm -f 7za.exe 7za.ld 7za.undefined *.cpp *.c *.gcov *.gcda *.gcno *.o core *~\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Format7zFree/makefile",
    "content": "PROG=../../../../bin/7z.so\n\nLOCAL_FLAGS=\\\n  $(CC_SHARED) \\\n  -DEXTERNAL_CODECS \\\n  -DCOMPRESS_MT \\\n  -DCOMPRESS_BZIP2_MT \\\n  -DCOMPRESS_MF_MT\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLOCAL_SHARED=$(LINK_SHARED)\nLIBS=$(LOCAL_LIBS_DLL)\n\n# NewHandler.o\nCOMMON_OBJS = \\\n  CRC.o \\\n  IntToString.o \\\n  MyMap.o \\\n  MyString.o \\\n  MyWindows.o \\\n  MyXml.o \\\n  StringConvert.o \\\n  StringToInt.o \\\n  MyVector.o \\\n  UTFConvert.o \\\n  Wildcard.o \\\n\nWIN_OBJS = \\\n  FileDir.o \\\n  FileFind.o \\\n  FileIO.o \\\n  PropVariant.o \\\n  PropVariantUtils.o \\\n  Synchronization.o \\\n  System.o \\\n  Time.o \\\n\n7ZIP_COMMON_OBJS = \\\n  InBuffer.o \\\n  InOutTempBuffer.o \\\n  CreateCoder.o \\\n  FilterCoder.o \\\n  LimitedStreams.o \\\n  LockedStream.o \\\n  MethodId.o \\\n  MethodProps.o \\\n  MemBlocks.o \\\n  OffsetStream.o \\\n  OutBuffer.o \\\n  OutMemStream.o \\\n  ProgressMt.o \\\n  ProgressUtils.o \\\n  StreamBinder.o \\\n  StreamObjects.o \\\n  StreamUtils.o \\\n  VirtThread.o \\\n\nAR_OBJS = \\\n  ArchiveExports.o \\\n  DllExports2.o \\\n  ArjHandler.o \\\n  DebHandler.o \\\n  DmgHandler.o \\\n  ElfHandler.o \\\n  MachoHandler.o \\\n  MubHandler.o \\\n  PeHandler.o \\\n  RpmHandler.o \\\n  XarHandler.o \\\n  ZHandler.o \\\n\nAR_COMMON_OBJS = \\\n  CoderMixer2.o \\\n  CoderMixer2MT.o \\\n  CrossThreadProgress.o \\\n  DummyOutStream.o \\\n  FindSignature.o \\\n  InStreamWithCRC.o \\\n  ItemNameUtils.o \\\n  MultiStream.o \\\n  OutStreamWithCRC.o \\\n  OutStreamWithSha1.o \\\n  HandlerOut.o \\\n  ParseProperties.o \\\n\n\n7Z_OBJS = \\\n  7zCompressionMode.o \\\n  7zDecode.o \\\n  7zEncode.o \\\n  7zExtract.o \\\n  7zFolderInStream.o \\\n  7zFolderOutStream.o \\\n  7zHandler.o \\\n  7zHandlerOut.o \\\n  7zHeader.o \\\n  7zIn.o \\\n  7zOut.o \\\n  7zProperties.o \\\n  7zSpecStream.o \\\n  7zUpdate.o \\\n  7zRegister.o \\\n\nBZ2_OBJS = \\\n  BZip2Handler.o \\\n  BZip2HandlerOut.o \\\n  BZip2Update.o \\\n  bz2Register.o \\\n\nCAB_OBJS = \\\n  CabBlockInStream.o \\\n  CabHandler.o \\\n  CabHeader.o \\\n  CabIn.o \\\n  CabRegister.o \\\n\nCHM_OBJS = \\\n  ChmHandler.o \\\n  ChmHeader.o \\\n  ChmIn.o \\\n  ChmRegister.o \\\n\nCOM_OBJS = \\\n  ComHandler.o \\\n  ComIn.o \\\n  ComRegister.o \\\n\nCPIO_OBJS = \\\n  CpioHandler.o \\\n  CpioHeader.o \\\n  CpioIn.o \\\n  CpioRegister.o \\\n\nGZ_OBJS = \\\n  GZipHandler.o \\\n  GZipHandlerOut.o \\\n  GZipHeader.o \\\n  GZipIn.o \\\n  GZipOut.o \\\n  GZipUpdate.o \\\n  GZipRegister.o \\\n\nHFS_OBJS = \\\n  HfsHandler.o \\\n  HfsIn.o \\\n  HfsRegister.o \\\n\nISO_OBJS = \\\n  IsoHandler.o \\\n  IsoHeader.o \\\n  IsoIn.o \\\n  IsoRegister.o \\\n\nLZH_OBJS = \\\n  LzhCRC.o \\\n  LzhHandler.o \\\n  LzhIn.o \\\n  LzhOutStreamWithCRC.o \\\n  LzhRegister.o \\\n\nLZM_OBJS = \\\n  LzmaArcRegister.o \\\n  LzmaFiltersDecode.o \\\n  LzmaHandler.o \\\n  LzmaIn.o \\\n\nNSIS_OBJS = \\\n  NsisDecode.o \\\n  NsisHandler.o \\\n  NsisIn.o \\\n  NsisRegister.o \\\n\nRAR_OBJS = \\\n  RarHandler.o \\\n  RarHeader.o \\\n  RarIn.o \\\n  RarItem.o \\\n  RarVolumeInStream.o \\\n  RarRegister.o \\\n\n# SplitHandlerOut.o\nSPLIT_OBJS = \\\n  SplitHandler.o \\\n  SplitRegister.o \\\n\nTAR_OBJS = \\\n  TarHandler.o \\\n  TarHandlerOut.o \\\n  TarHeader.o \\\n  TarIn.o \\\n  TarOut.o \\\n  TarUpdate.o \\\n  TarRegister.o \\\n\nUDF_OBJS = \\\n  UdfHandler.o \\\n  UdfIn.o \\\n  UdfRegister.o \\\n\nWIM_OBJS = \\\n  WimHandler.o \\\n  WimIn.o \\\n  WimRegister.o \\\n\nZIP_OBJS = \\\n  ZipAddCommon.o \\\n  ZipHandler.o \\\n  ZipHandlerOut.o \\\n  ZipHeader.o \\\n  ZipIn.o \\\n  ZipItem.o \\\n  ZipOut.o \\\n  ZipUpdate.o \\\n  ZipRegister.o \\\n\nCOMPRESS_OBJS = \\\n  CodecExports.o \\\n  ArjDecoder1.o \\\n  ArjDecoder2.o \\\n  Bcj2Coder.o \\\n  Bcj2Register.o \\\n  BcjCoder.o \\\n  BcjRegister.o \\\n  BitlDecoder.o \\\n  BranchCoder.o \\\n  BranchMisc.o \\\n  BranchRegister.o \\\n  ByteSwap.o \\\n  ByteSwapRegister.o \\\n  BZip2Crc.o \\\n  BZip2Decoder.o \\\n  BZip2Encoder.o \\\n  BZip2Register.o \\\n  CopyCoder.o \\\n  CopyRegister.o \\\n  Deflate64Register.o \\\n  DeflateDecoder.o \\\n  DeflateEncoder.o \\\n  DeflateNsisRegister.o \\\n  DeflateRegister.o \\\n  ImplodeDecoder.o \\\n  ImplodeHuffmanDecoder.o \\\n  LzhDecoder.o \\\n  LzmaDecoder.o \\\n  LzmaEncoder.o \\\n  LzmaRegister.o \\\n  LzOutWindow.o \\\n  Lzx86Converter.o \\\n  LzxDecoder.o \\\n  PpmdDecoder.o \\\n  PpmdEncoder.o \\\n  PpmdRegister.o \\\n  QuantumDecoder.o \\\n  ShrinkDecoder.o \\\n  ZlibDecoder.o \\\n  ZDecoder.o \\\n\nCOMPRESS_OBJS_NON_FREE = \\\n  Rar1Decoder.o \\\n  Rar2Decoder.o \\\n  Rar3Decoder.o \\\n  Rar3Vm.o \\\n  RarCodecsRegister.o \\\n\nCRYPTO_OBJS = \\\n  7zAes.o \\\n  7zAesRegister.o \\\n  HmacSha1.o \\\n  MyAes.o \\\n  Pbkdf2HmacSha1.o \\\n  RandGen.o \\\n  Rar20Crypto.o \\\n  RarAes.o \\\n  Sha1.o \\\n  WzAes.o \\\n  ZipCrypto.o \\\n  ZipStrong.o \\\n\n\n# Alloc.o\nC_OBJS = \\\n  Bra.o \\\n  Bra86.o \\\n  BraIA64.o \\\n  BwtSort.o \\\n  HuffEnc.o \\\n  LzFind.o \\\n  LzFindMt.o \\\n  LzmaDec.o \\\n  LzmaEnc.o \\\n  Sort.o \\\n  Threads.o \\\n  Aes.o \\\n  Sha256.o \\\n\nOBJS = \\\n  wine_date_and_time.o \\\n  myGetTickCount.o \\\n  $(COMMON_OBJS) \\\n  $(WIN_OBJS) \\\n  $(7ZIP_COMMON_OBJS) \\\n  $(AR_OBJS) \\\n  $(AR_COMMON_OBJS) \\\n  $(7Z_OBJS) \\\n  $(BZ2_OBJS) \\\n  $(CAB_OBJS) \\\n  $(CHM_OBJS) \\\n  $(COM_OBJS) \\\n  $(CPIO_OBJS) \\\n  $(GZ_OBJS) \\\n  $(HFS_OBJS) \\\n  $(ISO_OBJS) \\\n  $(LZH_OBJS) \\\n  $(LZM_OBJS) \\\n  $(NSIS_OBJS) \\\n  $(RAR_OBJS) \\\n  $(SPLIT_OBJS) \\\n  $(TAR_OBJS) \\\n  $(UDF_OBJS) \\\n  $(WIM_OBJS) \\\n  $(ZIP_OBJS) \\\n  $(COMPRESS_OBJS) \\\n  $(CRYPTO_OBJS) \\\n  $(C_OBJS) \\\n  $(OBJ_CRC32)  \\\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Format7zFree/makefile.depend",
    "content": "myGetTickCount.o: ../../../myWindows/myGetTickCount.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\nwine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nIntToString.o: ../../../Common/IntToString.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h\nMyMap.o: ../../../Common/MyMap.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyMap.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nMyXml.o: ../../../Common/MyXml.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyXml.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nStringToInt.o: ../../../Common/StringToInt.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringToInt.h\nUTFConvert.o: ../../../Common/UTFConvert.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantUtils.o: ../../../Windows/PropVariantUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariantUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/IntToString.h\nSynchronization.o: ../../../Windows/Synchronization.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nSystem.o: ../../../Windows/System.cpp ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h\nTime.o: ../../../Windows/Time.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h\nInBuffer.o: ../../Common/InBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/InBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nInOutTempBuffer.o: ../../Common/InOutTempBuffer.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/InOutTempBuffer.h \\\n  ../../Common/../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Common/../../Windows/FileDir.h \\\n  ../../Common/../../Windows/../Common/MyString.h \\\n  ../../Common/../../Windows/Defs.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/Defs.h \\\n  ../../Common/StreamUtils.h\nCreateCoder.o: ../../Common/CreateCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MethodId.h \\\n  ../../Common/../../Common/Types.h \\\n  ../../Common/../../Windows/PropVariant.h \\\n  ../../Common/../../Windows/../Common/MyWindows.h \\\n  ../../Common/../../Windows/../Common/Types.h \\\n  ../../Common/../../Windows/Defs.h ../../Common/FilterCoder.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../IPassword.h \\\n  ../../Common/RegisterCodec.h ../../Common/../Common/MethodId.h\nFilterCoder.o: ../../Common/FilterCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FilterCoder.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../ICoder.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../IPassword.h ../../Common/../../../C/Alloc.h \\\n  ../../Common/../../Common/Defs.h ../../Common/StreamUtils.h \\\n  ../../Common/../IStream.h\nLimitedStreams.o: ../../Common/LimitedStreams.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/LimitedStreams.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nLockedStream.o: ../../Common/LockedStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/LockedStream.h \\\n  ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h\nMethodId.o: ../../Common/MethodId.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/MethodId.h ../../Common/../../Common/Types.h \\\n  ../../Common/../../Common/MyString.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h\nMethodProps.o: ../../Common/MethodProps.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MethodProps.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Windows/PropVariant.h \\\n  ../../Common/../../Windows/../Common/MyWindows.h \\\n  ../../Common/../../Windows/../Common/Types.h ../../Common/MethodId.h \\\n  ../../Common/../../Common/Types.h\nMemBlocks.o: ../../Common/MemBlocks.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MemBlocks.h \\\n  ../../Common/../../../C/Alloc.h ../../../Common/Types.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h\nOffsetStream.o: ../../Common/OffsetStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../Common/OffsetStream.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nOutBuffer.o: ../../Common/OutBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nOutMemStream.o: ../../Common/OutMemStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutMemStream.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Common/MemBlocks.h \\\n  ../../Common/../../../C/Alloc.h ../../../Common/Types.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nProgressMt.o: ../../Common/ProgressMt.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/ProgressMt.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../../Common/MyVector.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h ../../Common/../ICoder.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../IProgress.h\nProgressUtils.o: ../../Common/ProgressUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/ProgressUtils.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../IProgress.h\nStreamBinder.o: ../../Common/StreamBinder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamBinder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/Defs.h ../../Common/../../Common/MyCom.h\nStreamObjects.o: ../../Common/StreamObjects.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/StreamObjects.h \\\n  ../../Common/../../Common/DynamicBuffer.h \\\n  ../../Common/../../Common/Buffer.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nVirtThread.o: ../../Common/VirtThread.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/VirtThread.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Windows/Thread.h\nArchiveExports.o: ../../Archive/ArchiveExports.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/../../Common/ComTry.h \\\n  ../../Archive/../../Common/MyWindows.h \\\n  ../../Archive/../../Common/Types.h \\\n  ../../Archive/../../Windows/PropVariant.h \\\n  ../../Archive/../../Windows/../Common/MyWindows.h \\\n  ../../Archive/../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/../Common/../Archive/../IDecl.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h ../../Archive/IArchive.h \\\n  ../../Archive/../ICoder.h ../../Archive/../IStream.h \\\n  ../../Archive/../IPassword.h ../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/../../Common/Types.h ../../Archive/../IDecl.h\nDllExports2.o: ../../Archive/DllExports2.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/../../Common/MyInitGuid.h \\\n  ../../Archive/../../Common/MyGuidDef.h \\\n  ../../Archive/../../Common/ComTry.h \\\n  ../../Archive/../../Common/MyWindows.h \\\n  ../../Archive/../../Common/Types.h \\\n  ../../Archive/../../Windows/PropVariant.h \\\n  ../../Archive/../../Windows/../Common/MyWindows.h \\\n  ../../Archive/../../Windows/../Common/Types.h ../../Archive/IArchive.h \\\n  ../../Archive/../IStream.h ../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/../../Common/Types.h ../../Archive/../IDecl.h \\\n  ../../Archive/../IProgress.h ../../Archive/../PropID.h \\\n  ../../Archive/../ICoder.h ../../Archive/../IStream.h \\\n  ../../Archive/../IPassword.h\nArjHandler.o: ../../Archive/ArjHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/../../../C/CpuArch.h \\\n  ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamObjects.h \\\n  ../../Archive/../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/../Common/../../Common/Buffer.h \\\n  ../../Archive/../Common/../../Common/Defs.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/ArjDecoder1.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/../Compress/../Common/InBuffer.h \\\n  ../../Archive/../Compress/../Common/../IStream.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Compress/BitmDecoder.h \\\n  ../../Archive/../Compress/../IStream.h \\\n  ../../Archive/../Compress/LzOutWindow.h \\\n  ../../Archive/../Compress/../Common/OutBuffer.h \\\n  ../../Archive/../Compress/ArjDecoder2.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/Common/ItemNameUtils.h \\\n  ../../Archive/Common/../../../Common/MyString.h \\\n  ../../Archive/Common/OutStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\nDebHandler.o: ../../Archive/DebHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Common/Defs.h ../../../Common/NewHandler.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringToInt.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/Common/ItemNameUtils.h \\\n  ../../Archive/Common/../../../Common/MyString.h\nDmgHandler.o: ../../Archive/DmgHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/../../../C/CpuArch.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Common/MyXml.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/UTFConvert.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/BZip2Decoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../../Windows/Synchronization.h \\\n  ../../Archive/../Compress/../../Windows/Defs.h \\\n  ../../Archive/../Compress/../../Windows/../../C/Threads.h \\\n  ../../Archive/../Compress/../../Windows/../../C/Types.h \\\n  ../../Archive/../Compress/../../Windows/Synchronization2.h \\\n  ../../Archive/../Compress/../../Windows/Thread.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/../Compress/../Common/InBuffer.h \\\n  ../../Archive/../Compress/../Common/../IStream.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Compress/../Common/OutBuffer.h \\\n  ../../Archive/../Compress/BitmDecoder.h \\\n  ../../Archive/../Compress/../IStream.h \\\n  ../../Archive/../Compress/BZip2Const.h \\\n  ../../Archive/../Compress/BZip2Crc.h ../../../Common/Types.h \\\n  ../../Archive/../Compress/HuffmanDecoder.h \\\n  ../../Archive/../Compress/../../Common/Types.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/ZlibDecoder.h \\\n  ../../Archive/../Compress/DeflateDecoder.h \\\n  ../../Archive/../Compress/BitlDecoder.h \\\n  ../../Archive/../Compress/DeflateConst.h \\\n  ../../Archive/../Compress/LzOutWindow.h\nElfHandler.o: ../../Archive/ElfHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/../../../C/CpuArch.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Windows/PropVariantUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h ../../../Common/MyCom.h\nMachoHandler.o: ../../Archive/MachoHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/../../../C/CpuArch.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Windows/PropVariantUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h ../../../Common/MyCom.h\nMubHandler.o: ../../Archive/MubHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/../../../C/CpuArch.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h\nPeHandler.o: ../../Archive/PeHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/../../../C/CpuArch.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Windows/PropVariantUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h ../../../Common/MyCom.h\nRpmHandler.o: ../../Archive/RpmHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/../../../C/CpuArch.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h\nXarHandler.o: ../../Archive/XarHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/../../../C/CpuArch.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyXml.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringToInt.h \\\n  ../../../Common/UTFConvert.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/../Common/LimitedStreams.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamObjects.h \\\n  ../../Archive/../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/../Common/../../Common/Buffer.h \\\n  ../../Archive/../Common/../../Common/Defs.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Compress/BZip2Decoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../../Windows/Synchronization.h \\\n  ../../Archive/../Compress/../../Windows/Defs.h \\\n  ../../Archive/../Compress/../../Windows/../../C/Threads.h \\\n  ../../Archive/../Compress/../../Windows/../../C/Types.h \\\n  ../../Archive/../Compress/../../Windows/Synchronization2.h \\\n  ../../Archive/../Compress/../../Windows/Thread.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/../Compress/../Common/InBuffer.h \\\n  ../../Archive/../Compress/../Common/../IStream.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Compress/../Common/OutBuffer.h \\\n  ../../Archive/../Compress/BitmDecoder.h \\\n  ../../Archive/../Compress/../IStream.h \\\n  ../../Archive/../Compress/BZip2Const.h \\\n  ../../Archive/../Compress/BZip2Crc.h ../../../Common/Types.h \\\n  ../../Archive/../Compress/HuffmanDecoder.h \\\n  ../../Archive/../Compress/../../Common/Types.h \\\n  ../../Archive/../Compress/CopyCoder.h \\\n  ../../Archive/../Compress/ZlibDecoder.h \\\n  ../../Archive/../Compress/DeflateDecoder.h \\\n  ../../Archive/../Compress/BitlDecoder.h \\\n  ../../Archive/../Compress/DeflateConst.h \\\n  ../../Archive/../Compress/LzOutWindow.h \\\n  ../../Archive/Common/OutStreamWithSha1.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../Crypto/Sha1.h \\\n  ../../Archive/Common/../../Crypto/../../Common/Types.h\nZHandler.o: ../../Archive/ZHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/../Common/ProgressUtils.h \\\n  ../../Archive/../Common/../../Common/MyCom.h \\\n  ../../Archive/../Common/../../Common/MyWindows.h \\\n  ../../Archive/../Common/../ICoder.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Common/../../Common/MyUnknown.h \\\n  ../../Archive/../Common/../../Common/Types.h \\\n  ../../Archive/../Common/../IDecl.h \\\n  ../../Archive/../Common/../IProgress.h \\\n  ../../Archive/../Common/RegisterArc.h \\\n  ../../Archive/../Common/../Archive/IArchive.h \\\n  ../../Archive/../Common/../Archive/../IStream.h \\\n  ../../Archive/../Common/../Archive/../IProgress.h \\\n  ../../Archive/../Common/../Archive/../PropID.h \\\n  ../../Archive/../Common/StreamUtils.h \\\n  ../../Archive/../Common/../IStream.h \\\n  ../../Archive/../Compress/ZDecoder.h \\\n  ../../Archive/../Compress/../../Common/MyCom.h \\\n  ../../Archive/../Compress/../ICoder.h \\\n  ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h ../../../Common/MyCom.h\nCoderMixer2.o: ../../Archive/Common/CoderMixer2.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h\nCoderMixer2MT.o: ../../Archive/Common/CoderMixer2MT.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2MT.h \\\n  ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../Common/StreamBinder.h \\\n  ../../Archive/Common/../../Common/../IStream.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../Common/VirtThread.h \\\n  ../../Archive/Common/../../Common/../../Windows/Thread.h\nCrossThreadProgress.o: ../../Archive/Common/CrossThreadProgress.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/CrossThreadProgress.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../../Windows/Defs.h \\\n  ../../Archive/Common/../../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../../Common/MyCom.h\nDummyOutStream.o: ../../Archive/Common/DummyOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/DummyOutStream.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h\nFindSignature.o: ../../Archive/Common/FindSignature.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../Archive/Common/FindSignature.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../Common/StreamUtils.h \\\n  ../../Archive/Common/../../Common/../IStream.h\nInStreamWithCRC.o: ../../Archive/Common/InStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/InStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\nItemNameUtils.o: ../../Archive/Common/ItemNameUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/ItemNameUtils.h \\\n  ../../Archive/Common/../../../Common/MyString.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h\nMultiStream.o: ../../Archive/Common/MultiStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/MultiStream.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../Archive/IArchive.h \\\n  ../../Archive/Common/../../Archive/../IStream.h \\\n  ../../Archive/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Common/../../Archive/../../Common/Types.h \\\n  ../../Archive/Common/../../Archive/../IDecl.h \\\n  ../../Archive/Common/../../Archive/../IProgress.h \\\n  ../../Archive/Common/../../Archive/../PropID.h\nOutStreamWithCRC.o: ../../Archive/Common/OutStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/OutStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\nOutStreamWithSha1.o: ../../Archive/Common/OutStreamWithSha1.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/OutStreamWithSha1.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../Crypto/Sha1.h \\\n  ../../Archive/Common/../../Crypto/../../Common/Types.h\nHandlerOut.o: ../../Archive/Common/HandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/../../../Common/StringToInt.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Windows/PropVariant.h \\\n  ../../Archive/Common/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Windows/../Common/Types.h \\\n  ../../Archive/Common/../../../Windows/System.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../Archive/Common/HandlerOut.h \\\n  ../../Archive/Common/../../../Common/MyString.h \\\n  ../../Archive/Common/../../Common/MethodProps.h \\\n  ../../Archive/Common/../../Common/../../Common/MyVector.h \\\n  ../../Archive/Common/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/Common/../../Common/MethodId.h \\\n  ../../Archive/Common/../../Common/../../Common/Types.h\nParseProperties.o: ../../Archive/Common/ParseProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../../Common/StringToInt.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h\n7zCompressionMode.o: ../../Archive/7z/7zCompressionMode.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\n7zDecode.o: ../../Archive/7z/7zDecode.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/LockedStream.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h\n7zEncode.o: ../../Archive/7z/7zEncode.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zEncode.h ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/7zSpecStream.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/InOutTempBuffer.h \\\n  ../../Archive/7z/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/../../Windows/FileDir.h \\\n  ../../Archive/7z/../../Common/../../Windows/../Common/MyString.h \\\n  ../../Archive/7z/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/FilterCoder.h \\\n  ../../Archive/7z/../../Common/../IPassword.h\n7zExtract.o: ../../Archive/7z/7zExtract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h\n7zFolderInStream.o: ../../Archive/7z/7zFolderInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zFolderInStream.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/InStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h\n7zFolderOutStream.o: ../../Archive/7z/7zFolderOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IProgress.h \\\n  ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h\n7zHandler.o: ../../Archive/7z/7zHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/IntToString.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../../Windows/System.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zProperties.h ../../Archive/7z/../../PropID.h\n7zHandlerOut.o: ../../Archive/7z/7zHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/StringToInt.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/ParseProperties.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../../Archive/7z/7zHandler.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zOut.h ../../Archive/7z/7zEncode.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/OutBuffer.h ../../Archive/7z/7zUpdate.h\n7zHeader.o: ../../Archive/7z/7zHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h\n7zIn.o: ../../Archive/7z/7zIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../../../../C/Types.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/StreamUtils.h ../../Archive/7z/7zDecode.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/7zIn.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h\n7zOut.o: ../../Archive/7z/7zOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../Common/AutoPtr.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h ../../Archive/7z/7zOut.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Common/MyVector.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zEncode.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/OutBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../../../../C/Types.h\n7zProperties.o: ../../Archive/7z/7zProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zProperties.h \\\n  ../../Archive/7z/../../PropID.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/7zHandler.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h\n7zSpecStream.o: ../../Archive/7z/7zSpecStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zSpecStream.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../ICoder.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyCom.h\n7zUpdate.o: ../../Archive/7z/7zUpdate.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Compress/CopyCoder.h \\\n  ../../Archive/7z/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Compress/../ICoder.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/7zEncode.h ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/7zFolderInStream.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/InStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/7zIn.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h \\\n  ../../Archive/7z/7zOut.h ../../Archive/7z/../../Common/OutBuffer.h \\\n  ../../Archive/7z/7zUpdate.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h\n7zRegister.o: ../../Archive/7z/7zRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/RegisterArc.h \\\n  ../../Archive/7z/../../Common/../Archive/IArchive.h \\\n  ../../Archive/7z/../../Common/../Archive/../IStream.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/7z/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/7z/../../Common/../Archive/../PropID.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/../Common/HandlerOut.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../Common/MethodProps.h\nBZip2Handler.o: ../../Archive/BZip2/BZip2Handler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/../IDecl.h \\\n  ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/ProgressUtils.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyCom.h \\\n  ../../Archive/BZip2/../../Common/../IProgress.h \\\n  ../../Archive/BZip2/../../Common/StreamUtils.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../Common/DummyOutStream.h \\\n  ../../Archive/BZip2/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/BZip2/BZip2Handler.h ../../../Common/MyCom.h \\\n  ../../Archive/BZip2/../IArchive.h ../../Archive/BZip2/../../IStream.h \\\n  ../../Archive/BZip2/../../IProgress.h \\\n  ../../Archive/BZip2/../../PropID.h ../../Archive/BZip2/BZip2Item.h \\\n  ../../Archive/BZip2/../../../Windows/System.h \\\n  ../../Archive/BZip2/../../../Windows/../Common/Types.h\nBZip2HandlerOut.o: ../../Archive/BZip2/BZip2HandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/BZip2/BZip2Handler.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../IArchive.h ../../Archive/BZip2/../../IStream.h \\\n  ../../Archive/BZip2/../../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../../Common/Types.h \\\n  ../../Archive/BZip2/../../IDecl.h ../../Archive/BZip2/../../IProgress.h \\\n  ../../Archive/BZip2/../../PropID.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/BZip2Item.h \\\n  ../../Archive/BZip2/../../../Windows/System.h \\\n  ../../Archive/BZip2/../../../Windows/../Common/Types.h \\\n  ../../Archive/BZip2/BZip2Update.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/BZip2/../../Compress/CopyCoder.h \\\n  ../../Archive/BZip2/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/BZip2/../../Compress/../ICoder.h \\\n  ../../Archive/BZip2/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h\nBZip2Update.o: ../../Archive/BZip2/BZip2Update.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/BZip2/../../Common/ProgressUtils.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyCom.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/../IDecl.h \\\n  ../../Archive/BZip2/../../Common/../IProgress.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Archive/BZip2/BZip2Update.h \\\n  ../../Archive/BZip2/../IArchive.h ../../Archive/BZip2/../../IStream.h \\\n  ../../Archive/BZip2/../../IProgress.h \\\n  ../../Archive/BZip2/../../PropID.h\nbz2Register.o: ../../Archive/BZip2/bz2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/BZip2/../../Common/RegisterArc.h \\\n  ../../Archive/BZip2/../../Common/../Archive/IArchive.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../IStream.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/BZip2/../../Common/../Archive/../PropID.h \\\n  ../../Archive/BZip2/BZip2Handler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/BZip2/../IArchive.h \\\n  ../../Archive/BZip2/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/BZip2/../../Common/../ICoder.h \\\n  ../../Archive/BZip2/../../Common/../IStream.h \\\n  ../../Archive/BZip2/../../Common/MethodId.h \\\n  ../../Archive/BZip2/../../Common/../../Common/Types.h \\\n  ../../Archive/BZip2/BZip2Item.h \\\n  ../../Archive/BZip2/../../../Windows/System.h \\\n  ../../Archive/BZip2/../../../Windows/../Common/Types.h\nCabBlockInStream.o: ../../Archive/Cab/CabBlockInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/../../../../C/Alloc.h ../../../Common/Defs.h \\\n  ../../Archive/Cab/../../Common/StreamUtils.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../../Common/Types.h \\\n  ../../Archive/Cab/../../Common/../IDecl.h \\\n  ../../Archive/Cab/CabBlockInStream.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Cab/../../IStream.h\nCabHandler.o: ../../Archive/Cab/CabHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/UTFConvert.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Cab/../../Common/ProgressUtils.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../ICoder.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../Common/../../Common/Types.h \\\n  ../../Archive/Cab/../../Common/../IDecl.h \\\n  ../../Archive/Cab/../../Common/../IProgress.h \\\n  ../../Archive/Cab/../../Compress/CopyCoder.h \\\n  ../../Archive/Cab/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Compress/../ICoder.h \\\n  ../../Archive/Cab/../../Compress/DeflateDecoder.h \\\n  ../../Archive/Cab/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Cab/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Cab/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Cab/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Compress/BitlDecoder.h \\\n  ../../Archive/Cab/../../Compress/../IStream.h \\\n  ../../Archive/Cab/../../Compress/DeflateConst.h \\\n  ../../Archive/Cab/../../Compress/HuffmanDecoder.h \\\n  ../../Archive/Cab/../../Compress/../../Common/Types.h \\\n  ../../Archive/Cab/../../Compress/LzOutWindow.h \\\n  ../../Archive/Cab/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Cab/../../Compress/LzxDecoder.h \\\n  ../../Archive/Cab/../../Compress/Lzx.h \\\n  ../../Archive/Cab/../../Compress/Lzx86Converter.h \\\n  ../../Archive/Cab/../../Compress/QuantumDecoder.h \\\n  ../../Archive/Cab/../Common/ItemNameUtils.h \\\n  ../../Archive/Cab/../Common/../../../Common/MyString.h \\\n  ../../Archive/Cab/CabBlockInStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Cab/../../IStream.h ../../Archive/Cab/CabHandler.h \\\n  ../../Archive/Cab/../IArchive.h ../../Archive/Cab/../../IStream.h \\\n  ../../Archive/Cab/../../IProgress.h ../../Archive/Cab/../../PropID.h \\\n  ../../Archive/Cab/CabIn.h ../../Archive/Cab/../../Common/InBuffer.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h \\\n  ../../Archive/Cab/CabItem.h ../../../Common/MyString.h\nCabHeader.o: ../../Archive/Cab/CabHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h\nCabIn.o: ../../Archive/Cab/CabIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/CabIn.h ../../Archive/Cab/../../IStream.h \\\n  ../../Archive/Cab/../../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../../Common/Types.h \\\n  ../../Archive/Cab/../../IDecl.h \\\n  ../../Archive/Cab/../../Common/InBuffer.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyException.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h \\\n  ../../Archive/Cab/CabItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Cab/../Common/FindSignature.h \\\n  ../../Archive/Cab/../Common/../../IStream.h\nCabRegister.o: ../../Archive/Cab/CabRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Cab/../../Common/RegisterArc.h \\\n  ../../Archive/Cab/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Cab/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Cab/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Cab/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Cab/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Cab/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Cab/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Cab/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Cab/CabHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Cab/../IArchive.h \\\n  ../../Archive/Cab/CabIn.h ../../Archive/Cab/../../IStream.h \\\n  ../../Archive/Cab/../../Common/InBuffer.h \\\n  ../../Archive/Cab/../../Common/../IStream.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyException.h \\\n  ../../Archive/Cab/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cab/CabHeader.h ../../../Common/Types.h \\\n  ../../Archive/Cab/CabItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nChmHandler.o: ../../Archive/Chm/ChmHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Chm/../../Common/LimitedStreams.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Chm/../../Common/../IStream.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Chm/../../Common/../../Common/Types.h \\\n  ../../Archive/Chm/../../Common/../IDecl.h \\\n  ../../Archive/Chm/../../Common/ProgressUtils.h \\\n  ../../Archive/Chm/../../Common/../ICoder.h \\\n  ../../Archive/Chm/../../Common/../IStream.h \\\n  ../../Archive/Chm/../../Common/../IProgress.h \\\n  ../../Archive/Chm/../../Common/StreamUtils.h \\\n  ../../Archive/Chm/../../Compress/CopyCoder.h \\\n  ../../Archive/Chm/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Chm/../../Compress/../ICoder.h \\\n  ../../Archive/Chm/../../Compress/LzxDecoder.h \\\n  ../../Archive/Chm/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Chm/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Chm/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Chm/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Chm/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Chm/../../Compress/HuffmanDecoder.h \\\n  ../../Archive/Chm/../../Compress/../../Common/Types.h \\\n  ../../Archive/Chm/../../Compress/LzOutWindow.h \\\n  ../../Archive/Chm/../../Compress/../IStream.h \\\n  ../../Archive/Chm/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Chm/../../Compress/Lzx.h \\\n  ../../Archive/Chm/../../Compress/Lzx86Converter.h \\\n  ../../Archive/Chm/../Common/ItemNameUtils.h \\\n  ../../Archive/Chm/../Common/../../../Common/MyString.h \\\n  ../../Archive/Chm/ChmHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Chm/../IArchive.h ../../Archive/Chm/../../IStream.h \\\n  ../../Archive/Chm/../../IProgress.h ../../Archive/Chm/../../PropID.h \\\n  ../../Archive/Chm/ChmIn.h ../../../Common/MyString.h \\\n  ../../../Common/Buffer.h ../../Archive/Chm/../../IStream.h \\\n  ../../Archive/Chm/../../Common/InBuffer.h ../../Archive/Chm/ChmHeader.h \\\n  ../../../Common/Types.h\nChmHeader.o: ../../Archive/Chm/ChmHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Chm/ChmHeader.h ../../../Common/Types.h\nChmIn.o: ../../Archive/Chm/ChmIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/UTFConvert.h ../../../Common/IntToString.h \\\n  ../../../Windows/Defs.h ../../Archive/Chm/../../Common/LimitedStreams.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Chm/../../Common/../IStream.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Chm/../../Common/../../Common/Types.h \\\n  ../../Archive/Chm/../../Common/../IDecl.h ../../Archive/Chm/ChmIn.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/Chm/../../IStream.h \\\n  ../../Archive/Chm/../../Common/InBuffer.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyException.h \\\n  ../../Archive/Chm/ChmHeader.h ../../../Common/Types.h\nChmRegister.o: ../../Archive/Chm/ChmRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Chm/../../Common/RegisterArc.h \\\n  ../../Archive/Chm/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Chm/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Chm/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Chm/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Chm/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Chm/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Chm/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Chm/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Chm/ChmHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Chm/../IArchive.h \\\n  ../../Archive/Chm/ChmIn.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h ../../Archive/Chm/../../IStream.h \\\n  ../../Archive/Chm/../../Common/InBuffer.h \\\n  ../../Archive/Chm/../../Common/../IStream.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyException.h \\\n  ../../Archive/Chm/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Chm/ChmHeader.h ../../../Common/Types.h\nComHandler.o: ../../Archive/Com/ComHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/Com/../../Common/StreamUtils.h \\\n  ../../Archive/Com/../../Common/../IStream.h \\\n  ../../Archive/Com/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Com/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Com/../../Common/../../Common/Types.h \\\n  ../../Archive/Com/../../Common/../IDecl.h \\\n  ../../Archive/Com/ComHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Com/../IArchive.h ../../Archive/Com/../../IStream.h \\\n  ../../Archive/Com/../../IProgress.h \\\n  ../../Archive/Com/../../../Common/MyUnknown.h \\\n  ../../Archive/Com/../../../Common/Types.h \\\n  ../../Archive/Com/../../IDecl.h ../../Archive/Com/../../PropID.h \\\n  ../../Archive/Com/ComIn.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h\nComIn.o: ../../Archive/Com/ComIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Com/../../../../C/Alloc.h \\\n  ../../Archive/Com/../../../../C/CpuArch.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h \\\n  ../../Archive/Com/../../Common/StreamUtils.h \\\n  ../../Archive/Com/../../Common/../IStream.h \\\n  ../../Archive/Com/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Com/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Com/../../Common/../../Common/Types.h \\\n  ../../Archive/Com/../../Common/../IDecl.h ../../../Common/IntToString.h \\\n  ../../Archive/Com/ComIn.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h\nComRegister.o: ../../Archive/Com/ComRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Com/../../Common/RegisterArc.h \\\n  ../../Archive/Com/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Com/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Com/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Com/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Com/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Com/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Com/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Com/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Com/ComHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Com/../IArchive.h \\\n  ../../Archive/Com/ComIn.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h\nCpioHandler.o: ../../Archive/Cpio/CpioHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/NewHandler.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h \\\n  ../../Archive/Cpio/../../Common/LimitedStreams.h \\\n  ../../Archive/Cpio/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Cpio/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Cpio/../../Common/../IStream.h \\\n  ../../Archive/Cpio/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Cpio/../../Common/../../Common/Types.h \\\n  ../../Archive/Cpio/../../Common/../IDecl.h \\\n  ../../Archive/Cpio/../../Common/ProgressUtils.h \\\n  ../../Archive/Cpio/../../Common/../ICoder.h \\\n  ../../Archive/Cpio/../../Common/../IStream.h \\\n  ../../Archive/Cpio/../../Common/../IProgress.h \\\n  ../../Archive/Cpio/../../Compress/CopyCoder.h \\\n  ../../Archive/Cpio/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Cpio/../../Compress/../ICoder.h \\\n  ../../Archive/Cpio/../Common/ItemNameUtils.h \\\n  ../../Archive/Cpio/../Common/../../../Common/MyString.h \\\n  ../../Archive/Cpio/CpioHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Cpio/../IArchive.h ../../Archive/Cpio/../../IStream.h \\\n  ../../Archive/Cpio/../../IProgress.h ../../Archive/Cpio/../../PropID.h \\\n  ../../Archive/Cpio/CpioItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../Archive/Cpio/CpioHeader.h \\\n  ../../Archive/Cpio/CpioIn.h ../../Archive/Cpio/../../IStream.h\nCpioHeader.o: ../../Archive/Cpio/CpioHeader.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Cpio/CpioHeader.h \\\n  ../../../Common/Types.h\nCpioIn.o: ../../Archive/Cpio/CpioIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Cpio/CpioIn.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/Types.h \\\n  ../../Archive/Cpio/../../IStream.h \\\n  ../../Archive/Cpio/../../../Common/MyUnknown.h \\\n  ../../Archive/Cpio/../../../Common/MyWindows.h \\\n  ../../Archive/Cpio/../../../Common/Types.h \\\n  ../../Archive/Cpio/../../IDecl.h ../../Archive/Cpio/CpioItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Cpio/CpioHeader.h \\\n  ../../../Common/StringToInt.h ../../../Windows/Defs.h \\\n  ../../Archive/Cpio/../../Common/StreamUtils.h \\\n  ../../Archive/Cpio/../../Common/../IStream.h\nCpioRegister.o: ../../Archive/Cpio/CpioRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Cpio/../../Common/RegisterArc.h \\\n  ../../Archive/Cpio/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Cpio/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Cpio/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Cpio/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Cpio/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Cpio/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Cpio/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Cpio/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Cpio/CpioHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Cpio/../IArchive.h \\\n  ../../Archive/Cpio/CpioItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Cpio/CpioHeader.h\nGZipHandler.o: ../../Archive/GZip/GZipHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/GZip/GZipHandler.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../IArchive.h ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../Archive/GZip/../../IProgress.h \\\n  ../../Archive/GZip/../../PropID.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/../IStream.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/GZipUpdate.h \\\n  ../../Archive/GZip/GZipOut.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/GZip/../../ICoder.h \\\n  ../../Archive/GZip/../../Common/ProgressUtils.h \\\n  ../../Archive/GZip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Common/../IProgress.h \\\n  ../../Archive/GZip/../Common/OutStreamWithCRC.h \\\n  ../../Archive/GZip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/GZip/../Common/../../IStream.h \\\n  ../../Archive/GZip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/GZip/../Common/../../../../C/Types.h\nGZipHandlerOut.o: ../../Archive/GZip/GZipHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringToInt.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/GZip/../../Compress/CopyCoder.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../Compress/../ICoder.h \\\n  ../../Archive/GZip/../../Compress/../IStream.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../Compress/../../Common/Types.h \\\n  ../../Archive/GZip/../../Compress/../IDecl.h \\\n  ../../Archive/GZip/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../Archive/GZip/GZipHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/GZip/../IArchive.h ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../IProgress.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../Archive/GZip/../../PropID.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/GZipUpdate.h \\\n  ../../Archive/GZip/GZipOut.h\nGZipHeader.o: ../../Archive/GZip/GZipHeader.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h\nGZipIn.o: ../../Archive/GZip/GZipIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../../Common/Defs.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/Defs.h ../../Archive/GZip/../../Common/StreamUtils.h \\\n  ../../Archive/GZip/../../Common/../IStream.h \\\n  ../../Archive/GZip/../../../../C/7zCrc.h \\\n  ../../Archive/GZip/../../../../C/Types.h\nGZipOut.o: ../../Archive/GZip/GZipOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/GZip/GZipOut.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h ../../../Windows/Defs.h \\\n  ../../Archive/GZip/../../Common/StreamUtils.h \\\n  ../../Archive/GZip/../../Common/../IStream.h\nGZipRegister.o: ../../Archive/GZip/GZipRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/GZip/../../Common/RegisterArc.h \\\n  ../../Archive/GZip/../../Common/../Archive/IArchive.h \\\n  ../../Archive/GZip/../../Common/../Archive/../IStream.h \\\n  ../../Archive/GZip/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/GZip/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/GZip/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/GZip/../../Common/../Archive/../PropID.h \\\n  ../../Archive/GZip/GZipHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/GZip/../IArchive.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/../IStream.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/GZipIn.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/GZipUpdate.h \\\n  ../../Archive/GZip/GZipOut.h\nGZipUpdate.o: ../../Archive/GZip/GZipUpdate.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Archive/GZip/../../ICoder.h \\\n  ../../Archive/GZip/../../IStream.h \\\n  ../../Archive/GZip/../../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../../Common/MyWindows.h \\\n  ../../Archive/GZip/../../../Common/Types.h \\\n  ../../Archive/GZip/../../IDecl.h \\\n  ../../Archive/GZip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/GZip/../../Common/../ICoder.h \\\n  ../../Archive/GZip/../../Common/MethodId.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/../../Common/ProgressUtils.h \\\n  ../../Archive/GZip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Common/../IProgress.h \\\n  ../../Archive/GZip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/GZip/../../Common/../../Common/Types.h \\\n  ../../Archive/GZip/../../Common/../IDecl.h \\\n  ../../Archive/GZip/../../Compress/CopyCoder.h \\\n  ../../Archive/GZip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/GZip/../../Compress/../ICoder.h \\\n  ../../Archive/GZip/../Common/InStreamWithCRC.h \\\n  ../../Archive/GZip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/GZip/../Common/../../IStream.h \\\n  ../../Archive/GZip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/GZip/../Common/../../../../C/Types.h \\\n  ../../Archive/GZip/GZipUpdate.h ../../Archive/GZip/../IArchive.h \\\n  ../../Archive/GZip/../../IStream.h ../../Archive/GZip/../../IProgress.h \\\n  ../../Archive/GZip/../../PropID.h ../../Archive/GZip/GZipOut.h \\\n  ../../../Common/MyCom.h ../../Archive/GZip/GZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/GZip/GZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/GZip/../../IStream.h\nHfsHandler.o: ../../Archive/Hfs/HfsHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/Hfs/../../Common/StreamUtils.h \\\n  ../../Archive/Hfs/../../Common/../IStream.h \\\n  ../../Archive/Hfs/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Hfs/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Hfs/../../Common/../../Common/Types.h \\\n  ../../Archive/Hfs/../../Common/../IDecl.h \\\n  ../../Archive/Hfs/HfsHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Hfs/../IArchive.h ../../Archive/Hfs/../../IStream.h \\\n  ../../Archive/Hfs/../../IProgress.h \\\n  ../../Archive/Hfs/../../../Common/MyUnknown.h \\\n  ../../Archive/Hfs/../../../Common/Types.h \\\n  ../../Archive/Hfs/../../IDecl.h ../../Archive/Hfs/../../PropID.h \\\n  ../../Archive/Hfs/HfsIn.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h\nHfsIn.o: ../../Archive/Hfs/HfsIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Hfs/../../Common/StreamUtils.h \\\n  ../../Archive/Hfs/../../Common/../IStream.h \\\n  ../../Archive/Hfs/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Hfs/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Hfs/../../Common/../../Common/Types.h \\\n  ../../Archive/Hfs/../../Common/../IDecl.h ../../../Common/IntToString.h \\\n  ../../Archive/Hfs/HfsIn.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h ../../Archive/Hfs/../../../../C/CpuArch.h\nHfsRegister.o: ../../Archive/Hfs/HfsRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Hfs/../../Common/RegisterArc.h \\\n  ../../Archive/Hfs/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Hfs/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Hfs/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Hfs/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Hfs/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Hfs/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Hfs/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Hfs/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Hfs/HfsHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Hfs/../IArchive.h \\\n  ../../Archive/Hfs/HfsIn.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h\nIsoHandler.o: ../../Archive/Iso/IsoHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Common/NewHandler.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Iso/../../Common/LimitedStreams.h \\\n  ../../Archive/Iso/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Iso/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Iso/../../Common/../IStream.h \\\n  ../../Archive/Iso/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Iso/../../Common/../../Common/Types.h \\\n  ../../Archive/Iso/../../Common/../IDecl.h \\\n  ../../Archive/Iso/../../Common/ProgressUtils.h \\\n  ../../Archive/Iso/../../Common/../ICoder.h \\\n  ../../Archive/Iso/../../Common/../IStream.h \\\n  ../../Archive/Iso/../../Common/../IProgress.h \\\n  ../../Archive/Iso/../../Compress/CopyCoder.h \\\n  ../../Archive/Iso/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Iso/../../Compress/../ICoder.h \\\n  ../../Archive/Iso/../Common/ItemNameUtils.h \\\n  ../../Archive/Iso/../Common/../../../Common/MyString.h \\\n  ../../Archive/Iso/IsoHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Iso/../IArchive.h ../../Archive/Iso/../../IStream.h \\\n  ../../Archive/Iso/../../IProgress.h ../../Archive/Iso/../../PropID.h \\\n  ../../Archive/Iso/IsoItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../Archive/Iso/IsoHeader.h ../../Archive/Iso/IsoIn.h \\\n  ../../Archive/Iso/../../IStream.h\nIsoHeader.o: ../../Archive/Iso/IsoHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Iso/IsoHeader.h ../../../Common/Types.h\nIsoIn.o: ../../Archive/Iso/IsoIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Iso/IsoIn.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../Archive/Iso/../../IStream.h \\\n  ../../Archive/Iso/../../../Common/MyUnknown.h \\\n  ../../Archive/Iso/../../../Common/MyWindows.h \\\n  ../../Archive/Iso/../../../Common/Types.h \\\n  ../../Archive/Iso/../../IDecl.h ../../Archive/Iso/IsoItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Iso/IsoHeader.h \\\n  ../../../Windows/Defs.h ../../Archive/Iso/../../Common/StreamUtils.h \\\n  ../../Archive/Iso/../../Common/../IStream.h\nIsoRegister.o: ../../Archive/Iso/IsoRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Iso/../../Common/RegisterArc.h \\\n  ../../Archive/Iso/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Iso/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Iso/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Iso/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Iso/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Iso/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Iso/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Iso/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Iso/IsoHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Iso/../IArchive.h \\\n  ../../Archive/Iso/IsoItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Iso/IsoHeader.h \\\n  ../../Archive/Iso/IsoIn.h ../../../Common/IntToString.h \\\n  ../../Archive/Iso/../../IStream.h\nLzhCRC.o: ../../Archive/Lzh/LzhCRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Lzh/LzhCRC.h ../../../Common/Types.h\nLzhHandler.o: ../../Archive/Lzh/LzhHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Lzh/LzhHandler.h \\\n  ../../../Common/MyCom.h ../../Archive/Lzh/../IArchive.h \\\n  ../../Archive/Lzh/../../IStream.h \\\n  ../../Archive/Lzh/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzh/../../../Common/MyWindows.h \\\n  ../../Archive/Lzh/../../../Common/Types.h \\\n  ../../Archive/Lzh/../../IDecl.h ../../Archive/Lzh/../../IProgress.h \\\n  ../../Archive/Lzh/../../PropID.h ../../Archive/Lzh/LzhIn.h \\\n  ../../Archive/Lzh/../../IStream.h ../../Archive/Lzh/LzhItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../../Common/Buffer.h ../../Archive/Lzh/LzhHeader.h \\\n  ../../Archive/Lzh/LzhOutStreamWithCRC.h ../../Archive/Lzh/LzhCRC.h \\\n  ../../Archive/Lzh/../../../Common/MyCom.h \\\n  ../../Archive/Lzh/../../ICoder.h ../../Archive/Lzh/../../IStream.h \\\n  ../../Archive/Lzh/../../Common/LimitedStreams.h \\\n  ../../Archive/Lzh/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Lzh/../../Common/../IStream.h \\\n  ../../Archive/Lzh/../../Common/ProgressUtils.h \\\n  ../../Archive/Lzh/../../Common/../ICoder.h \\\n  ../../Archive/Lzh/../../Common/../IProgress.h \\\n  ../../Archive/Lzh/../../Compress/CopyCoder.h \\\n  ../../Archive/Lzh/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Lzh/../../Compress/../ICoder.h \\\n  ../../Archive/Lzh/../../Compress/LzhDecoder.h \\\n  ../../Archive/Lzh/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Lzh/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Lzh/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Lzh/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Lzh/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Lzh/../../Compress/BitmDecoder.h \\\n  ../../Archive/Lzh/../../Compress/../IStream.h \\\n  ../../Archive/Lzh/../../Compress/HuffmanDecoder.h \\\n  ../../Archive/Lzh/../../Compress/../../Common/Types.h \\\n  ../../Archive/Lzh/../../Compress/LzOutWindow.h \\\n  ../../Archive/Lzh/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Lzh/../Common/ItemNameUtils.h \\\n  ../../Archive/Lzh/../Common/../../../Common/MyString.h\nLzhIn.o: ../../Archive/Lzh/LzhIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../Archive/Lzh/../../Common/StreamUtils.h \\\n  ../../Archive/Lzh/../../Common/../IStream.h \\\n  ../../Archive/Lzh/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Lzh/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Lzh/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzh/../../Common/../IDecl.h ../../Archive/Lzh/LzhIn.h \\\n  ../../../Common/MyCom.h ../../Archive/Lzh/../../IStream.h \\\n  ../../Archive/Lzh/LzhItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../Archive/Lzh/LzhHeader.h\nLzhOutStreamWithCRC.o: ../../Archive/Lzh/LzhOutStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Lzh/LzhOutStreamWithCRC.h ../../Archive/Lzh/LzhCRC.h \\\n  ../../../Common/Types.h ../../Archive/Lzh/../../../Common/MyCom.h \\\n  ../../Archive/Lzh/../../../Common/MyWindows.h \\\n  ../../Archive/Lzh/../../IStream.h \\\n  ../../Archive/Lzh/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzh/../../../Common/Types.h \\\n  ../../Archive/Lzh/../../IDecl.h\nLzhRegister.o: ../../Archive/Lzh/LzhRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Lzh/../../Common/RegisterArc.h \\\n  ../../Archive/Lzh/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Lzh/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Lzh/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Lzh/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Lzh/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Lzh/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Lzh/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Lzh/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Lzh/LzhHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Lzh/../IArchive.h \\\n  ../../Archive/Lzh/LzhIn.h ../../Archive/Lzh/../../IStream.h \\\n  ../../Archive/Lzh/LzhItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../Archive/Lzh/LzhHeader.h\nLzmaArcRegister.o: ../../Archive/Lzma/LzmaArcRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Lzma/../../Common/RegisterArc.h \\\n  ../../Archive/Lzma/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Lzma/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Lzma/LzmaHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Lzma/../IArchive.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h\nLzmaFiltersDecode.o: ../../Archive/Lzma/LzmaFiltersDecode.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Lzma/LzmaFiltersDecode.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/../IDecl.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaItem.h ../../../Common/Types.h \\\n  ../../Archive/Lzma/../../../../C/CpuArch.h\nLzmaHandler.o: ../../Archive/Lzma/LzmaHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Lzma/LzmaHandler.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../IArchive.h ../../Archive/Lzma/../../IStream.h \\\n  ../../Archive/Lzma/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../../Common/Types.h \\\n  ../../Archive/Lzma/../../IDecl.h ../../Archive/Lzma/../../IProgress.h \\\n  ../../Archive/Lzma/../../PropID.h \\\n  ../../Archive/Lzma/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Lzma/../../Common/../ICoder.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../../Common/MethodId.h \\\n  ../../Archive/Lzma/../../Common/../../Common/Types.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Common/IntToString.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/Lzma/../../Common/ProgressUtils.h \\\n  ../../Archive/Lzma/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Lzma/../../Common/../IProgress.h \\\n  ../../Archive/Lzma/../../Common/StreamUtils.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h \\\n  ../../Archive/Lzma/../Common/DummyOutStream.h \\\n  ../../Archive/Lzma/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Lzma/LzmaFiltersDecode.h\nLzmaIn.o: ../../Archive/Lzma/LzmaIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Lzma/LzmaIn.h ../../Archive/Lzma/LzmaItem.h \\\n  ../../../Common/Types.h ../../Archive/Lzma/../../../../C/CpuArch.h \\\n  ../../Archive/Lzma/../../IStream.h \\\n  ../../Archive/Lzma/../../../Common/MyUnknown.h \\\n  ../../Archive/Lzma/../../../Common/MyWindows.h \\\n  ../../Archive/Lzma/../../../Common/Types.h \\\n  ../../Archive/Lzma/../../IDecl.h \\\n  ../../Archive/Lzma/../../Common/StreamUtils.h \\\n  ../../Archive/Lzma/../../Common/../IStream.h\nNsisDecode.o: ../../Archive/Nsis/NsisDecode.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Nsis/NsisDecode.h \\\n  ../../Archive/Nsis/../../IStream.h \\\n  ../../Archive/Nsis/../../../Common/MyUnknown.h \\\n  ../../Archive/Nsis/../../../Common/MyWindows.h \\\n  ../../Archive/Nsis/../../../Common/Types.h \\\n  ../../Archive/Nsis/../../IDecl.h \\\n  ../../Archive/Nsis/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Nsis/../../Common/../ICoder.h \\\n  ../../Archive/Nsis/../../Common/../IStream.h \\\n  ../../Archive/Nsis/../../Common/MethodId.h \\\n  ../../Archive/Nsis/../../Common/../../Common/Types.h \\\n  ../../Archive/Nsis/../../Common/StreamUtils.h \\\n  ../../Archive/Nsis/../../Common/../IStream.h \\\n  ../../Archive/Nsis/../../Common/MethodId.h\nNsisHandler.o: ../../Archive/Nsis/NsisHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Nsis/../../../../C/CpuArch.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Common/NewHandler.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/Nsis/../../Common/StreamUtils.h \\\n  ../../Archive/Nsis/../../Common/../IStream.h \\\n  ../../Archive/Nsis/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Nsis/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Nsis/../../Common/../../Common/Types.h \\\n  ../../Archive/Nsis/../../Common/../IDecl.h \\\n  ../../Archive/Nsis/../Common/ItemNameUtils.h \\\n  ../../Archive/Nsis/../Common/../../../Common/MyString.h \\\n  ../../Archive/Nsis/../Common/../../../Common/MyVector.h \\\n  ../../Archive/Nsis/../Common/../../../Common/Defs.h \\\n  ../../Archive/Nsis/NsisHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Nsis/../IArchive.h ../../Archive/Nsis/../../IStream.h \\\n  ../../Archive/Nsis/../../IProgress.h \\\n  ../../Archive/Nsis/../../../Common/MyUnknown.h \\\n  ../../Archive/Nsis/../../../Common/Types.h \\\n  ../../Archive/Nsis/../../IDecl.h ../../Archive/Nsis/../../PropID.h \\\n  ../../Archive/Nsis/NsisIn.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h \\\n  ../../Archive/Nsis/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Nsis/../../Common/../ICoder.h \\\n  ../../Archive/Nsis/../../Common/../IStream.h \\\n  ../../Archive/Nsis/../../Common/MethodId.h \\\n  ../../Archive/Nsis/../../Common/../../Common/Types.h \\\n  ../../Archive/Nsis/../../IStream.h ../../Archive/Nsis/NsisDecode.h\nNsisIn.o: ../../Archive/Nsis/NsisIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Nsis/NsisIn.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h \\\n  ../../Archive/Nsis/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Nsis/../../Common/../ICoder.h \\\n  ../../Archive/Nsis/../../Common/../IStream.h \\\n  ../../Archive/Nsis/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Nsis/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Nsis/../../Common/../../Common/Types.h \\\n  ../../Archive/Nsis/../../Common/../IDecl.h \\\n  ../../Archive/Nsis/../../Common/MethodId.h \\\n  ../../Archive/Nsis/../../Common/../../Common/Types.h \\\n  ../../Archive/Nsis/../../IStream.h ../../Archive/Nsis/NsisDecode.h \\\n  ../../../Windows/Defs.h ../../Archive/Nsis/../../Common/StreamUtils.h \\\n  ../../Archive/Nsis/../../Common/../IStream.h \\\n  ../../Archive/Nsis/../../../../C/CpuArch.h\nNsisRegister.o: ../../Archive/Nsis/NsisRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Nsis/../../Common/RegisterArc.h \\\n  ../../Archive/Nsis/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Nsis/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Nsis/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Nsis/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Nsis/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Nsis/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Nsis/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Nsis/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Nsis/NsisHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Nsis/../IArchive.h \\\n  ../../Archive/Nsis/NsisIn.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h \\\n  ../../Archive/Nsis/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Nsis/../../Common/../ICoder.h \\\n  ../../Archive/Nsis/../../Common/../IStream.h \\\n  ../../Archive/Nsis/../../Common/MethodId.h \\\n  ../../Archive/Nsis/../../Common/../../Common/Types.h \\\n  ../../Archive/Nsis/../../IStream.h ../../Archive/Nsis/NsisDecode.h\nRarHandler.o: ../../Archive/Rar/RarHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Rar/../../IPassword.h \\\n  ../../Archive/Rar/../../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../../Common/MyWindows.h \\\n  ../../Archive/Rar/../../../Common/Types.h \\\n  ../../Archive/Rar/../../IDecl.h \\\n  ../../Archive/Rar/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Rar/../../Common/../ICoder.h \\\n  ../../Archive/Rar/../../Common/../IStream.h \\\n  ../../Archive/Rar/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../Common/../../Common/Types.h \\\n  ../../Archive/Rar/../../Common/../IDecl.h \\\n  ../../Archive/Rar/../../Common/MethodId.h \\\n  ../../Archive/Rar/../../Common/../../Common/Types.h \\\n  ../../Archive/Rar/../../Common/FilterCoder.h \\\n  ../../Archive/Rar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Common/../IPassword.h \\\n  ../../Archive/Rar/../../Common/MethodId.h \\\n  ../../Archive/Rar/../../Common/ProgressUtils.h \\\n  ../../Archive/Rar/../../Common/../IProgress.h \\\n  ../../Archive/Rar/../../Compress/CopyCoder.h \\\n  ../../Archive/Rar/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Compress/../ICoder.h \\\n  ../../Archive/Rar/../../Crypto/Rar20Crypto.h ../../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Crypto/../ICoder.h \\\n  ../../Archive/Rar/../../Crypto/../IPassword.h \\\n  ../../Archive/Rar/../../Crypto/RarAes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../Archive/Rar/../Common/ItemNameUtils.h \\\n  ../../Archive/Rar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Rar/../Common/OutStreamWithCRC.h \\\n  ../../Archive/Rar/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Rar/../Common/../../IStream.h \\\n  ../../Archive/Rar/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/Rar/../Common/../../../../C/Types.h \\\n  ../../Archive/Rar/RarHandler.h ../../Archive/Rar/../IArchive.h \\\n  ../../Archive/Rar/../../IStream.h ../../Archive/Rar/../../IProgress.h \\\n  ../../Archive/Rar/../../PropID.h ../../Archive/Rar/RarIn.h \\\n  ../../../Common/DynamicBuffer.h ../../../Common/Buffer.h \\\n  ../../../Common/MyCom.h ../../Archive/Rar/../../ICoder.h \\\n  ../../Archive/Rar/../../IStream.h \\\n  ../../Archive/Rar/../../Common/StreamObjects.h \\\n  ../../Archive/Rar/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Rar/../../Common/../IStream.h \\\n  ../../Archive/Rar/RarHeader.h ../../../Common/Types.h \\\n  ../../Archive/Rar/RarItem.h ../../../Common/MyString.h \\\n  ../../Archive/Rar/RarVolumeInStream.h\nRarHeader.o: ../../Archive/Rar/RarHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Rar/RarHeader.h ../../../Common/Types.h\nRarIn.o: ../../Archive/Rar/RarIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/UTFConvert.h \\\n  ../../Archive/Rar/RarIn.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../Archive/Rar/../../ICoder.h ../../Archive/Rar/../../IStream.h \\\n  ../../Archive/Rar/../../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../../Common/MyWindows.h \\\n  ../../Archive/Rar/../../../Common/Types.h \\\n  ../../Archive/Rar/../../IDecl.h ../../Archive/Rar/../../IStream.h \\\n  ../../Archive/Rar/../../Common/StreamObjects.h \\\n  ../../Archive/Rar/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Rar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Common/../IStream.h \\\n  ../../Archive/Rar/../../Crypto/RarAes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Crypto/../ICoder.h \\\n  ../../Archive/Rar/../../Crypto/../IPassword.h \\\n  ../../Archive/Rar/../../Crypto/../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Rar/../../Crypto/../IDecl.h ../../Archive/Rar/RarHeader.h \\\n  ../../../Common/Types.h ../../Archive/Rar/RarItem.h \\\n  ../../../Common/MyString.h \\\n  ../../Archive/Rar/../../Common/LimitedStreams.h \\\n  ../../Archive/Rar/../../Common/StreamUtils.h \\\n  ../../Archive/Rar/../Common/FindSignature.h \\\n  ../../Archive/Rar/../Common/../../IStream.h \\\n  ../../Archive/Rar/../../../../C/7zCrc.h \\\n  ../../Archive/Rar/../../../../C/Types.h\nRarItem.o: ../../Archive/Rar/RarItem.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Rar/RarItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Rar/RarHeader.h\nRarVolumeInStream.o: ../../Archive/Rar/RarVolumeInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Rar/RarVolumeInStream.h \\\n  ../../Archive/Rar/../../IStream.h \\\n  ../../Archive/Rar/../../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../../Common/MyWindows.h \\\n  ../../Archive/Rar/../../../Common/Types.h \\\n  ../../Archive/Rar/../../IDecl.h ../../Archive/Rar/RarIn.h \\\n  ../../../Common/DynamicBuffer.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Rar/../../ICoder.h \\\n  ../../Archive/Rar/../../IStream.h \\\n  ../../Archive/Rar/../../Common/StreamObjects.h \\\n  ../../Archive/Rar/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Rar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Common/../IStream.h \\\n  ../../Archive/Rar/../../Crypto/RarAes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Crypto/../ICoder.h \\\n  ../../Archive/Rar/../../Crypto/../IPassword.h \\\n  ../../Archive/Rar/../../Crypto/../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Rar/../../Crypto/../IDecl.h ../../Archive/Rar/RarHeader.h \\\n  ../../../Common/Types.h ../../Archive/Rar/RarItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Windows/Defs.h ../../../Common/Defs.h \\\n  ../../Archive/Rar/../../../../C/7zCrc.h \\\n  ../../Archive/Rar/../../../../C/Types.h\nRarRegister.o: ../../Archive/Rar/RarRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Rar/../../Common/RegisterArc.h \\\n  ../../Archive/Rar/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Rar/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Rar/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Rar/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Rar/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Rar/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Rar/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Rar/RarHandler.h ../../Archive/Rar/../IArchive.h \\\n  ../../Archive/Rar/RarIn.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Rar/../../ICoder.h \\\n  ../../Archive/Rar/../../IStream.h ../../Archive/Rar/../../IStream.h \\\n  ../../Archive/Rar/../../Common/StreamObjects.h \\\n  ../../Archive/Rar/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Rar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Common/../IStream.h \\\n  ../../Archive/Rar/../../Crypto/RarAes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Rar/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../Archive/Rar/../../Crypto/../ICoder.h \\\n  ../../Archive/Rar/../../Crypto/../IPassword.h \\\n  ../../Archive/Rar/../../Crypto/../../Common/MyUnknown.h \\\n  ../../Archive/Rar/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Rar/../../Crypto/../IDecl.h ../../Archive/Rar/RarHeader.h \\\n  ../../../Common/Types.h ../../Archive/Rar/RarItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/Rar/RarVolumeInStream.h \\\n  ../../Archive/Rar/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Rar/../../Common/../ICoder.h \\\n  ../../Archive/Rar/../../Common/MethodId.h \\\n  ../../Archive/Rar/../../Common/../../Common/Types.h\nSplitHandler.o: ../../Archive/Split/SplitHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/NewHandler.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h \\\n  ../../Archive/Split/../../Common/ProgressUtils.h \\\n  ../../Archive/Split/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Split/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Split/../../Common/../ICoder.h \\\n  ../../Archive/Split/../../Common/../IStream.h \\\n  ../../Archive/Split/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Split/../../Common/../../Common/Types.h \\\n  ../../Archive/Split/../../Common/../IDecl.h \\\n  ../../Archive/Split/../../Common/../IProgress.h \\\n  ../../Archive/Split/../../Compress/CopyCoder.h \\\n  ../../Archive/Split/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Split/../../Compress/../ICoder.h \\\n  ../../Archive/Split/../Common/ItemNameUtils.h \\\n  ../../Archive/Split/../Common/../../../Common/MyString.h \\\n  ../../Archive/Split/../Common/MultiStream.h \\\n  ../../Archive/Split/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Split/../Common/../../../Common/MyVector.h \\\n  ../../Archive/Split/../Common/../../Archive/IArchive.h \\\n  ../../Archive/Split/../Common/../../Archive/../IStream.h \\\n  ../../Archive/Split/../Common/../../Archive/../IProgress.h \\\n  ../../Archive/Split/../Common/../../Archive/../PropID.h \\\n  ../../Archive/Split/SplitHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Split/../IArchive.h\nSplitRegister.o: ../../Archive/Split/SplitRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Split/../../Common/RegisterArc.h \\\n  ../../Archive/Split/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Split/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Split/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Split/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Split/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Split/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Split/SplitHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Split/../IArchive.h\nTarHandler.o: ../../Archive/Tar/TarHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/NewHandler.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Tar/../../Common/LimitedStreams.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../Common/../../Common/Types.h \\\n  ../../Archive/Tar/../../Common/../IDecl.h \\\n  ../../Archive/Tar/../../Common/ProgressUtils.h \\\n  ../../Archive/Tar/../../Common/../ICoder.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../IProgress.h \\\n  ../../Archive/Tar/../../Compress/CopyCoder.h \\\n  ../../Archive/Tar/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Compress/../ICoder.h \\\n  ../../Archive/Tar/../Common/DummyOutStream.h \\\n  ../../Archive/Tar/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../IArchive.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../IProgress.h ../../Archive/Tar/../../PropID.h \\\n  ../../Archive/Tar/TarItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../Archive/Tar/TarHeader.h \\\n  ../../Archive/Tar/TarIn.h ../../Archive/Tar/../../IStream.h\nTarHandlerOut.o: ../../Archive/Tar/TarHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../IArchive.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../../Common/Types.h \\\n  ../../Archive/Tar/../../IDecl.h ../../Archive/Tar/../../IProgress.h \\\n  ../../Archive/Tar/../../PropID.h ../../Archive/Tar/TarItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../Archive/Tar/TarUpdate.h\nTarHeader.o: ../../Archive/Tar/TarHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/Types.h\nTarIn.o: ../../Archive/Tar/TarIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/TarIn.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../../Common/Types.h \\\n  ../../Archive/Tar/../../IDecl.h ../../Archive/Tar/TarItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/StringToInt.h \\\n  ../../../Windows/Defs.h ../../Archive/Tar/../../Common/StreamUtils.h \\\n  ../../Archive/Tar/../../Common/../IStream.h\nTarOut.o: ../../Archive/Tar/TarOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/TarOut.h ../../Archive/Tar/TarItem.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../../Common/Types.h \\\n  ../../Archive/Tar/../../IDecl.h ../../../Common/IntToString.h \\\n  ../../../Windows/Defs.h ../../Archive/Tar/../../Common/StreamUtils.h \\\n  ../../Archive/Tar/../../Common/../IStream.h\nTarRegister.o: ../../Archive/Tar/TarRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/../../Common/RegisterArc.h \\\n  ../../Archive/Tar/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Tar/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Tar/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Tar/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Tar/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Tar/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Tar/TarHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Tar/../IArchive.h \\\n  ../../Archive/Tar/TarItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h\nTarUpdate.o: ../../Archive/Tar/TarUpdate.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Tar/../../Common/LimitedStreams.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Tar/../../Common/../../Common/Types.h \\\n  ../../Archive/Tar/../../Common/../IDecl.h \\\n  ../../Archive/Tar/../../Common/ProgressUtils.h \\\n  ../../Archive/Tar/../../Common/../ICoder.h \\\n  ../../Archive/Tar/../../Common/../IStream.h \\\n  ../../Archive/Tar/../../Common/../IProgress.h \\\n  ../../Archive/Tar/../../Compress/CopyCoder.h \\\n  ../../Archive/Tar/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Tar/../../Compress/../ICoder.h ../../Archive/Tar/TarOut.h \\\n  ../../Archive/Tar/TarItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Tar/../Common/ItemNameUtils.h \\\n  ../../Archive/Tar/../Common/../../../Common/MyString.h \\\n  ../../Archive/Tar/TarHeader.h ../../../Common/MyCom.h \\\n  ../../Archive/Tar/../../IStream.h ../../Archive/Tar/TarUpdate.h \\\n  ../../Archive/Tar/../IArchive.h ../../Archive/Tar/../../IStream.h \\\n  ../../Archive/Tar/../../IProgress.h ../../Archive/Tar/../../PropID.h\nUdfHandler.o: ../../Archive/Udf/UdfHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/NewHandler.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Udf/../../Common/ProgressUtils.h \\\n  ../../Archive/Udf/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Udf/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Udf/../../Common/../ICoder.h \\\n  ../../Archive/Udf/../../Common/../IStream.h \\\n  ../../Archive/Udf/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Udf/../../Common/../../Common/Types.h \\\n  ../../Archive/Udf/../../Common/../IDecl.h \\\n  ../../Archive/Udf/../../Common/../IProgress.h \\\n  ../../Archive/Udf/../../Compress/CopyCoder.h \\\n  ../../Archive/Udf/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Udf/../../Compress/../ICoder.h \\\n  ../../Archive/Udf/../Common/DummyOutStream.h \\\n  ../../Archive/Udf/../Common/../../IStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Udf/UdfHandler.h ../../../Common/MyCom.h \\\n  ../../Archive/Udf/../IArchive.h ../../Archive/Udf/../../IStream.h \\\n  ../../Archive/Udf/../../IProgress.h ../../Archive/Udf/../../PropID.h \\\n  ../../Archive/Udf/UdfIn.h ../../../Common/IntToString.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/MyMap.h ../../Archive/Udf/../../IStream.h\nUdfIn.o: ../../Archive/Udf/UdfIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Udf/UdfIn.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/MyMap.h ../../Archive/Udf/../../IStream.h \\\n  ../../Archive/Udf/../../../Common/MyUnknown.h \\\n  ../../Archive/Udf/../../../Common/MyWindows.h \\\n  ../../Archive/Udf/../../../Common/Types.h \\\n  ../../Archive/Udf/../../IDecl.h \\\n  ../../Archive/Udf/../../Common/StreamUtils.h \\\n  ../../Archive/Udf/../../Common/../IStream.h \\\n  ../../Archive/Udf/../../../../C/CpuArch.h\nUdfRegister.o: ../../Archive/Udf/UdfRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Udf/../../Common/RegisterArc.h \\\n  ../../Archive/Udf/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Udf/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Udf/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Udf/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Udf/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Udf/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Udf/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Udf/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Udf/UdfHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Udf/../IArchive.h \\\n  ../../Archive/Udf/UdfIn.h ../../../Common/IntToString.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/MyMap.h ../../Archive/Udf/../../IStream.h\nWimHandler.o: ../../Archive/Wim/WimHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringToInt.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../Archive/Wim/../../Common/StreamUtils.h \\\n  ../../Archive/Wim/../../Common/../IStream.h \\\n  ../../Archive/Wim/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Wim/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Wim/../../Common/../../Common/Types.h \\\n  ../../Archive/Wim/../../Common/../IDecl.h \\\n  ../../Archive/Wim/../../Common/ProgressUtils.h \\\n  ../../Archive/Wim/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Common/../ICoder.h \\\n  ../../Archive/Wim/../../Common/../IStream.h \\\n  ../../Archive/Wim/../../Common/../IProgress.h \\\n  ../../Archive/Wim/../../../../C/CpuArch.h \\\n  ../../Archive/Wim/WimHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyXml.h ../../Archive/Wim/../IArchive.h \\\n  ../../Archive/Wim/../../IStream.h ../../Archive/Wim/../../IProgress.h \\\n  ../../Archive/Wim/../../PropID.h ../../Archive/Wim/WimIn.h \\\n  ../../../Common/Buffer.h ../../../Common/MyString.h \\\n  ../../Archive/Wim/../../Compress/CopyCoder.h \\\n  ../../Archive/Wim/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Compress/../ICoder.h \\\n  ../../Archive/Wim/../../Compress/LzxDecoder.h \\\n  ../../Archive/Wim/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Wim/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Wim/../../Compress/HuffmanDecoder.h \\\n  ../../Archive/Wim/../../Compress/../../Common/Types.h \\\n  ../../Archive/Wim/../../Compress/LzOutWindow.h \\\n  ../../Archive/Wim/../../Compress/../IStream.h \\\n  ../../Archive/Wim/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Wim/../../Compress/Lzx.h \\\n  ../../Archive/Wim/../../Compress/Lzx86Converter.h\nWimIn.o: ../../Archive/Wim/WimIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/IntToString.h \\\n  ../../Archive/Wim/../../Common/StreamUtils.h \\\n  ../../Archive/Wim/../../Common/../IStream.h \\\n  ../../Archive/Wim/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Wim/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Wim/../../Common/../../Common/Types.h \\\n  ../../Archive/Wim/../../Common/../IDecl.h \\\n  ../../Archive/Wim/../../Common/StreamObjects.h \\\n  ../../Archive/Wim/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Wim/../../Common/../../Common/Buffer.h \\\n  ../../Archive/Wim/../../Common/../../Common/Defs.h \\\n  ../../Archive/Wim/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Common/LimitedStreams.h \\\n  ../../Archive/Wim/../Common/OutStreamWithSha1.h \\\n  ../../Archive/Wim/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Wim/../Common/../../IStream.h \\\n  ../../Archive/Wim/../Common/../../Crypto/Sha1.h \\\n  ../../Archive/Wim/../Common/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Wim/../../../../C/CpuArch.h ../../Archive/Wim/WimIn.h \\\n  ../../../Common/Buffer.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Wim/../../Compress/CopyCoder.h \\\n  ../../Archive/Wim/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Compress/../ICoder.h \\\n  ../../Archive/Wim/../../Compress/../IStream.h \\\n  ../../Archive/Wim/../../Compress/LzxDecoder.h \\\n  ../../Archive/Wim/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Wim/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Wim/../../Compress/HuffmanDecoder.h \\\n  ../../Archive/Wim/../../Compress/../../Common/Types.h \\\n  ../../Archive/Wim/../../Compress/LzOutWindow.h \\\n  ../../Archive/Wim/../../Compress/../IStream.h \\\n  ../../Archive/Wim/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Wim/../../Compress/Lzx.h \\\n  ../../Archive/Wim/../../Compress/Lzx86Converter.h\nWimRegister.o: ../../Archive/Wim/WimRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Wim/../../Common/RegisterArc.h \\\n  ../../Archive/Wim/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Wim/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Wim/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Wim/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Wim/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Wim/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Wim/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Wim/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Wim/WimHandler.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyXml.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/Wim/../IArchive.h \\\n  ../../Archive/Wim/WimIn.h ../../../Common/Buffer.h \\\n  ../../../Common/MyString.h ../../Archive/Wim/../../Compress/CopyCoder.h \\\n  ../../Archive/Wim/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Compress/../ICoder.h \\\n  ../../Archive/Wim/../../Compress/../IStream.h \\\n  ../../Archive/Wim/../../Compress/LzxDecoder.h \\\n  ../../Archive/Wim/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Wim/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Wim/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Wim/../../Compress/HuffmanDecoder.h \\\n  ../../Archive/Wim/../../Compress/../../Common/Types.h \\\n  ../../Archive/Wim/../../Compress/LzOutWindow.h \\\n  ../../Archive/Wim/../../Compress/../IStream.h \\\n  ../../Archive/Wim/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Wim/../../Compress/Lzx.h \\\n  ../../Archive/Wim/../../Compress/Lzx86Converter.h\nZipAddCommon.o: ../../Archive/Zip/ZipAddCommon.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/../../../../C/7zCrc.h \\\n  ../../Archive/Zip/../../../../C/Types.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Archive/Zip/../../ICoder.h \\\n  ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h ../../Archive/Zip/../../IPassword.h \\\n  ../../Archive/Zip/../../MyVersion.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/StreamObjects.h \\\n  ../../Archive/Zip/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Buffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Defs.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h \\\n  ../../Archive/Zip/../../Compress/LzmaEncoder.h \\\n  ../../Archive/Zip/../../Compress/../../../C/LzmaEnc.h \\\n  ../../Archive/Zip/../../Compress/../../../C/Types.h \\\n  ../../Archive/Zip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../ICoder.h \\\n  ../../Archive/Zip/../Common/InStreamWithCRC.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Zip/../Common/../../IStream.h \\\n  ../../Archive/Zip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/Zip/ZipAddCommon.h ../../Archive/Zip/../../IProgress.h \\\n  ../../Archive/Zip/../../Common/FilterCoder.h \\\n  ../../Archive/Zip/../../Common/../IPassword.h \\\n  ../../Archive/Zip/../../Compress/CopyCoder.h \\\n  ../../Archive/Zip/../../Crypto/ZipCrypto.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyVector.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/ZipCompressionMode.h ../../../Common/MyString.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h\nZipHandler.o: ../../Archive/Zip/ZipHandler.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Zip/../../IPassword.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../IDecl.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/FilterCoder.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IPassword.h \\\n  ../../Archive/Zip/../../Common/ProgressUtils.h \\\n  ../../Archive/Zip/../../Common/../IProgress.h \\\n  ../../Archive/Zip/../../Common/StreamObjects.h \\\n  ../../Archive/Zip/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Buffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/Defs.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h \\\n  ../../Archive/Zip/../../Compress/CopyCoder.h \\\n  ../../Archive/Zip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../ICoder.h \\\n  ../../Archive/Zip/../../Compress/LzmaDecoder.h \\\n  ../../Archive/Zip/../../Compress/../../../C/LzmaDec.h \\\n  ../../Archive/Zip/../../Compress/../../../C/Types.h \\\n  ../../Archive/Zip/../../Compress/ImplodeDecoder.h \\\n  ../../Archive/Zip/../../Compress/ImplodeHuffmanDecoder.h \\\n  ../../Archive/Zip/../../Compress/../Common/InBuffer.h \\\n  ../../Archive/Zip/../../Compress/../Common/../IStream.h \\\n  ../../Archive/Zip/../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Compress/BitlDecoder.h \\\n  ../../Archive/Zip/../../Compress/../IStream.h \\\n  ../../Archive/Zip/../../Compress/LzOutWindow.h \\\n  ../../Archive/Zip/../../Compress/../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Compress/ShrinkDecoder.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/../../Crypto/ZipCrypto.h \\\n  ../../Archive/Zip/../../Crypto/ZipStrong.h \\\n  ../../Archive/Zip/../Common/ItemNameUtils.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyString.h \\\n  ../../Archive/Zip/../Common/OutStreamWithCRC.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyCom.h \\\n  ../../Archive/Zip/../Common/../../IStream.h \\\n  ../../Archive/Zip/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/Zip/../Common/../../../../C/Types.h \\\n  ../../Archive/Zip/ZipHandler.h ../../../Common/DynamicBuffer.h \\\n  ../../Archive/Zip/../../ICoder.h ../../Archive/Zip/../IArchive.h \\\n  ../../Archive/Zip/../../IStream.h ../../Archive/Zip/../../IProgress.h \\\n  ../../Archive/Zip/../../PropID.h ../../Archive/Zip/ZipIn.h \\\n  ../../../Common/MyCom.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h \\\n  ../../Archive/Zip/ZipItemEx.h ../../Archive/Zip/ZipItem.h \\\n  ../../../Common/MyString.h ../../../Common/Buffer.h \\\n  ../../../Common/UTFConvert.h ../../Archive/Zip/ZipCompressionMode.h \\\n  ../../Archive/Zip/../../../Windows/System.h \\\n  ../../Archive/Zip/../../../Windows/../Common/Types.h\nZipHandlerOut.o: ../../Archive/Zip/ZipHandlerOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ComTry.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringToInt.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../Archive/Zip/../../IPassword.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h \\\n  ../../Archive/Zip/../../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../IDecl.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IStream.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/../Common/ItemNameUtils.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyString.h \\\n  ../../Archive/Zip/../Common/ParseProperties.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../Archive/Zip/ZipHandler.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h ../../Archive/Zip/../../ICoder.h \\\n  ../../Archive/Zip/../IArchive.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../IProgress.h ../../Archive/Zip/../../PropID.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/ZipIn.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../IStream.h ../../Archive/Zip/ZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/Zip/ZipItemEx.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../Archive/Zip/ZipCompressionMode.h \\\n  ../../Archive/Zip/../../../Windows/System.h \\\n  ../../Archive/Zip/../../../Windows/../Common/Types.h \\\n  ../../Archive/Zip/ZipUpdate.h\nZipHeader.o: ../../Archive/Zip/ZipHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h\nZipIn.o: ../../Archive/Zip/ZipIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipIn.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h ../../Archive/Zip/ZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/Zip/ZipItemEx.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Windows/Defs.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h \\\n  ../../Archive/Zip/../../Common/LimitedStreams.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h \\\n  ../../Archive/Zip/../../../../C/CpuArch.h\nZipItem.o: ../../Archive/Zip/ZipItem.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipHeader.h ../../../Common/Types.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../Archive/Zip/../Common/ItemNameUtils.h \\\n  ../../Archive/Zip/../Common/../../../Common/MyString.h \\\n  ../../Archive/Zip/../../../../C/CpuArch.h\nZipOut.o: ../../Archive/Zip/ZipOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/ZipOut.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../../Common/Types.h \\\n  ../../Archive/Zip/../../IDecl.h \\\n  ../../Archive/Zip/../../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Buffer.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../Archive/Zip/ZipHeader.h \\\n  ../../Archive/Zip/../../Common/OffsetStream.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/StreamUtils.h\nZipUpdate.o: ../../Archive/Zip/ZipUpdate.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/AutoPtr.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Windows/Thread.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../IDecl.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/LimitedStreams.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Common/../IStream.h \\\n  ../../Archive/Zip/../../Common/OutMemStream.h \\\n  ../../Archive/Zip/../../Common/MemBlocks.h \\\n  ../../Archive/Zip/../../Common/../../../C/Alloc.h \\\n  ../../../Common/Types.h ../../../Common/MyVector.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Synchronization2.h \\\n  ../../Archive/Zip/../../Common/ProgressUtils.h \\\n  ../../Archive/Zip/../../Common/../IProgress.h \\\n  ../../Archive/Zip/../../Common/ProgressMt.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyVector.h \\\n  ../../Archive/Zip/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/Zip/../../Compress/CopyCoder.h \\\n  ../../Archive/Zip/../../Compress/../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Compress/../ICoder.h \\\n  ../../Archive/Zip/ZipAddCommon.h ../../Archive/Zip/../../ICoder.h \\\n  ../../Archive/Zip/../../IProgress.h \\\n  ../../Archive/Zip/../../Common/FilterCoder.h \\\n  ../../Archive/Zip/../../Common/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/ZipCrypto.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../Crypto/../ICoder.h \\\n  ../../Archive/Zip/../../Crypto/../IPassword.h \\\n  ../../Archive/Zip/../../Crypto/WzAes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Aes.h \\\n  ../../Archive/Zip/../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyVector.h \\\n  ../../Archive/Zip/../../Crypto/HmacSha1.h \\\n  ../../Archive/Zip/../../Crypto/Sha1.h \\\n  ../../Archive/Zip/../../Crypto/../../Common/Types.h \\\n  ../../Archive/Zip/ZipCompressionMode.h ../../../Common/MyString.h \\\n  ../../Archive/Zip/ZipOut.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../Common/OutBuffer.h \\\n  ../../Archive/Zip/../../Common/../../Common/MyException.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../Archive/Zip/ZipHeader.h ../../Archive/Zip/ZipUpdate.h \\\n  ../../Archive/Zip/../IArchive.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../../IProgress.h ../../Archive/Zip/../../PropID.h \\\n  ../../Archive/Zip/ZipIn.h ../../Archive/Zip/ZipItemEx.h\nZipRegister.o: ../../Archive/Zip/ZipRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Zip/../../Common/RegisterArc.h \\\n  ../../Archive/Zip/../../Common/../Archive/IArchive.h \\\n  ../../Archive/Zip/../../Common/../Archive/../IStream.h \\\n  ../../Archive/Zip/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/Zip/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/Zip/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/Zip/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/Zip/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/Zip/../../Common/../Archive/../PropID.h \\\n  ../../Archive/Zip/ZipHandler.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../Archive/Zip/../../ICoder.h ../../Archive/Zip/../../IStream.h \\\n  ../../Archive/Zip/../IArchive.h \\\n  ../../Archive/Zip/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../Archive/Zip/../../Common/../ICoder.h \\\n  ../../Archive/Zip/../../Common/MethodId.h \\\n  ../../Archive/Zip/../../Common/../../Common/Types.h \\\n  ../../Archive/Zip/ZipIn.h ../../../Common/MyCom.h \\\n  ../../Archive/Zip/../../IStream.h ../../Archive/Zip/ZipHeader.h \\\n  ../../../Common/Types.h ../../Archive/Zip/ZipItemEx.h \\\n  ../../Archive/Zip/ZipItem.h ../../../Common/MyString.h \\\n  ../../../Common/Buffer.h ../../../Common/UTFConvert.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../Archive/Zip/ZipCompressionMode.h \\\n  ../../Archive/Zip/../../../Windows/System.h \\\n  ../../Archive/Zip/../../../Windows/../Common/Types.h\nCodecExports.o: ../../Compress/CodecExports.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../Common/ComTry.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Windows/PropVariant.h \\\n  ../../Compress/../../Windows/../Common/MyWindows.h \\\n  ../../Compress/../../Windows/../Common/Types.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/../ICoder.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nArjDecoder1.o: ../../Compress/ArjDecoder1.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/ArjDecoder1.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitmDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../Common/OutBuffer.h\nArjDecoder2.o: ../../Compress/ArjDecoder2.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/ArjDecoder2.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitmDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../Common/OutBuffer.h\nBcj2Coder.o: ../../Compress/Bcj2Coder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/Bcj2Coder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcj2Register.o: ../../Compress/Bcj2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/Bcj2Coder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcjCoder.o: ../../Compress/BcjCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBcjRegister.o: ../../Compress/BcjRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBitlDecoder.o: ../../Compress/BitlDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchCoder.o: ../../Compress/BranchCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BranchCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchMisc.o: ../../Compress/BranchMisc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Bra.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/BranchMisc.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBranchRegister.o: ../../Compress/BranchRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BranchMisc.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nByteSwap.o: ../../Compress/ByteSwap.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/ByteSwap.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nByteSwapRegister.o: ../../Compress/ByteSwapRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/ByteSwap.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBZip2Crc.o: ../../Compress/BZip2Crc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BZip2Crc.h ../../../Common/Types.h\nBZip2Decoder.o: ../../Compress/BZip2Decoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../../Common/Defs.h ../../Compress/BZip2Crc.h \\\n  ../../../Common/Types.h ../../Compress/BZip2Decoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Windows/Synchronization.h \\\n  ../../Compress/../../Windows/Defs.h \\\n  ../../Compress/../../Windows/../../C/Threads.h \\\n  ../../Compress/../../Windows/../../C/Types.h \\\n  ../../Compress/../../Windows/Synchronization2.h \\\n  ../../Compress/../../Windows/Thread.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitmDecoder.h \\\n  ../../Compress/../IStream.h ../../Compress/BZip2Const.h \\\n  ../../Compress/HuffmanDecoder.h ../../Compress/../../Common/Types.h \\\n  ../../Compress/Mtf8.h\nBZip2Encoder.o: ../../Compress/BZip2Encoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../../../C/BwtSort.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../../C/HuffEnc.h ../../Compress/BZip2Crc.h \\\n  ../../../Common/Types.h ../../Compress/BZip2Encoder.h \\\n  ../../Compress/../../Common/Defs.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Windows/Synchronization.h \\\n  ../../Compress/../../Windows/Defs.h \\\n  ../../Compress/../../Windows/../../C/Threads.h \\\n  ../../Compress/../../Windows/../../C/Types.h \\\n  ../../Compress/../../Windows/Synchronization2.h \\\n  ../../Compress/../../Windows/Thread.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitmEncoder.h \\\n  ../../Compress/../IStream.h ../../Compress/BZip2Const.h \\\n  ../../Compress/Mtf8.h ../../Compress/../../Common/Types.h\nBZip2Register.o: ../../Compress/BZip2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BZip2Decoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Windows/Synchronization.h \\\n  ../../Compress/../../Windows/Defs.h \\\n  ../../Compress/../../Windows/../../C/Threads.h \\\n  ../../Compress/../../Windows/../../C/Types.h \\\n  ../../Compress/../../Windows/Synchronization2.h \\\n  ../../Compress/../../Windows/Thread.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitmDecoder.h \\\n  ../../Compress/../IStream.h ../../Compress/BZip2Const.h \\\n  ../../Compress/BZip2Crc.h ../../../Common/Types.h \\\n  ../../Compress/HuffmanDecoder.h ../../Compress/../../Common/Types.h \\\n  ../../Compress/BZip2Encoder.h ../../Compress/../../Common/Defs.h \\\n  ../../Compress/BitmEncoder.h\nCopyCoder.o: ../../Compress/CopyCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/CopyCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nCopyRegister.o: ../../Compress/CopyRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/CopyCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nDeflate64Register.o: ../../Compress/Deflate64Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/DeflateDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/DeflateEncoder.h \\\n  ../../Compress/../../../C/LzFind.h ../../Compress/../../../C/Types.h \\\n  ../../../Common/MyCom.h ../../Compress/BitlEncoder.h\nDeflateDecoder.o: ../../Compress/DeflateDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/DeflateDecoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h\nDeflateEncoder.o: ../../Compress/DeflateEncoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../../../C/HuffEnc.h ../../Compress/../../../C/Types.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../Compress/DeflateEncoder.h ../../Compress/../../../C/LzFind.h \\\n  ../../../Common/MyCom.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/BitlEncoder.h ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/DeflateConst.h\nDeflateNsisRegister.o: ../../Compress/DeflateNsisRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/DeflateDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h\nDeflateRegister.o: ../../Compress/DeflateRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/DeflateDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/DeflateEncoder.h \\\n  ../../Compress/../../../C/LzFind.h ../../Compress/../../../C/Types.h \\\n  ../../../Common/MyCom.h ../../Compress/BitlEncoder.h\nImplodeDecoder.o: ../../Compress/ImplodeDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/ImplodeDecoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/ImplodeHuffmanDecoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../Common/OutBuffer.h \\\n  ../../../Common/Defs.h\nImplodeHuffmanDecoder.o: ../../Compress/ImplodeHuffmanDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/ImplodeHuffmanDecoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h\nLzhDecoder.o: ../../Compress/LzhDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/LzhDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/BitmDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/HuffmanDecoder.h ../../Compress/../../Common/Types.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../Common/OutBuffer.h \\\n  ../../../Windows/Defs.h\nLzmaDecoder.o: ../../Compress/LzmaDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/LzmaDecoder.h \\\n  ../../Compress/../../../C/LzmaDec.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaEncoder.o: ../../Compress/LzmaEncoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/LzmaEncoder.h \\\n  ../../Compress/../../../C/LzmaEnc.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaRegister.o: ../../Compress/LzmaRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/LzmaDecoder.h ../../Compress/../../../C/LzmaDec.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/LzmaEncoder.h ../../Compress/../../../C/LzmaEnc.h\nLzOutWindow.o: ../../Compress/LzOutWindow.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/MyException.h\nLzx86Converter.o: ../../Compress/Lzx86Converter.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../Common/Defs.h \\\n  ../../Compress/Lzx86Converter.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nLzxDecoder.o: ../../Compress/LzxDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../Common/Defs.h ../../Compress/LzxDecoder.h \\\n  ../../Compress/../ICoder.h ../../Compress/../IStream.h \\\n  ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/MyWindows.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/HuffmanDecoder.h ../../Compress/../../Common/Types.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../IStream.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/Lzx.h \\\n  ../../Compress/Lzx86Converter.h ../../Compress/../../Common/MyCom.h\nPpmdDecoder.o: ../../Compress/PpmdDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../Compress/PpmdDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/PpmdDecode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/InBuffer.h\nPpmdEncoder.o: ../../Compress/PpmdEncoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/PpmdEncoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/PpmdEncode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/OutBuffer.h\nPpmdRegister.o: ../../Compress/PpmdRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/PpmdDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/PpmdDecode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/PpmdEncoder.h ../../Compress/PpmdEncode.h\nQuantumDecoder.o: ../../Compress/QuantumDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../Common/Defs.h \\\n  ../../Compress/QuantumDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/LzOutWindow.h ../../Compress/../IStream.h \\\n  ../../Compress/../Common/OutBuffer.h\nShrinkDecoder.o: ../../Compress/ShrinkDecoder.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/BitlDecoder.h \\\n  ../../Compress/../IStream.h ../../Compress/ShrinkDecoder.h \\\n  ../../Compress/../../Common/MyCom.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nZlibDecoder.o: ../../Compress/ZlibDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/DeflateDecoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/BitlDecoder.h ../../Compress/../IStream.h \\\n  ../../Compress/DeflateConst.h ../../Compress/HuffmanDecoder.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/LzOutWindow.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/ZlibDecoder.h\nZDecoder.o: ../../Compress/ZDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/OutBuffer.h ../../Compress/ZDecoder.h \\\n  ../../Compress/../../Common/MyCom.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaBench.o: ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/7zCrc.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Alloc.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../LzmaDecoder.h \\\n  ../../Compress/LZMA_Alone/../../../../C/LzmaDec.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../ICoder.h \\\n  ../../Compress/LZMA_Alone/../../IStream.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../IDecl.h \\\n  ../../Compress/LZMA_Alone/../LzmaEncoder.h \\\n  ../../Compress/LZMA_Alone/../../../../C/LzmaEnc.h\nLzmaBenchCon.o: ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/LzmaBenchCon.h \\\n  ../../Compress/LZMA_Alone/../../../Common/IntToString.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyWindows.h\n7zAes.o: ../../Crypto/7zAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/Sha256.h ../../Crypto/../../../C/Types.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h \\\n  ../../Crypto/../Common/StreamObjects.h \\\n  ../../Crypto/../Common/../../Common/DynamicBuffer.h \\\n  ../../Crypto/../Common/../../Common/Buffer.h \\\n  ../../Crypto/../Common/../../Common/Defs.h \\\n  ../../Crypto/../Common/../../Common/MyCom.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/7zAes.h ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../IPassword.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/Types.h ../../Crypto/../IDecl.h \\\n  ../../Crypto/MyAes.h ../../Crypto/../../../C/Aes.h \\\n  ../../Crypto/../../Common/MyCom.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/RandGen.h ../../Crypto/Sha1.h\n7zAesRegister.o: ../../Crypto/7zAesRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Crypto/../Common/RegisterCodec.h \\\n  ../../Crypto/../Common/../Common/MethodId.h \\\n  ../../Crypto/../Common/../Common/../../Common/Types.h \\\n  ../../Crypto/7zAes.h ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyVector.h ../../Crypto/../ICoder.h \\\n  ../../Crypto/../IStream.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h ../../Crypto/../IPassword.h\nHmacSha1.o: ../../Crypto/HmacSha1.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/HmacSha1.h ../../Crypto/Sha1.h \\\n  ../../Crypto/../../Common/Types.h\nMyAes.o: ../../Crypto/MyAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/MyAes.h ../../Crypto/../../../C/Aes.h \\\n  ../../Crypto/../../../C/Types.h ../../Crypto/../../Common/MyCom.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../../Common/MyUnknown.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h\nPbkdf2HmacSha1.o: ../../Crypto/Pbkdf2HmacSha1.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Crypto/HmacSha1.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h\nRandGen.o: ../../Crypto/RandGen.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../Crypto/RandGen.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h\nSha1.o: ../../Crypto/Sha1.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../../../C/RotateDefs.h\nWzAes.o: ../../Crypto/WzAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../Common/StreamObjects.h \\\n  ../../Crypto/../Common/../../Common/DynamicBuffer.h \\\n  ../../Crypto/../Common/../../Common/Buffer.h \\\n  ../../Crypto/../Common/../../Common/Defs.h \\\n  ../../Crypto/../Common/../../Common/MyCom.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/Pbkdf2HmacSha1.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/RandGen.h ../../Crypto/Sha1.h ../../Crypto/WzAes.h \\\n  ../../Crypto/../../../C/Aes.h ../../Crypto/../../../C/Types.h \\\n  ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../IPassword.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/Types.h ../../Crypto/../IDecl.h \\\n  ../../Crypto/HmacSha1.h\nRar20Crypto.o: ../../Crypto/Rar20Crypto.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/7zCrc.h ../../Crypto/../../../C/Types.h \\\n  ../../Crypto/../../../C/CpuArch.h ../../Crypto/../../../C/RotateDefs.h \\\n  ../../Crypto/Rar20Crypto.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Crypto/../ICoder.h \\\n  ../../Crypto/../IStream.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h ../../Crypto/../IPassword.h\nRarAes.o: ../../Crypto/RarAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/RarAes.h ../../Crypto/../../../C/Aes.h \\\n  ../../Crypto/../../../C/Types.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Crypto/../ICoder.h \\\n  ../../Crypto/../IStream.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h ../../Crypto/../IPassword.h ../../Crypto/Sha1.h \\\n  ../../Crypto/../../Common/Types.h\nZipCrypto.o: ../../Crypto/ZipCrypto.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/7zCrc.h ../../Crypto/../../../C/Types.h \\\n  ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/RandGen.h \\\n  ../../Crypto/Sha1.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/ZipCrypto.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../Crypto/../ICoder.h \\\n  ../../Crypto/../IStream.h ../../Crypto/../IPassword.h \\\n  ../../Crypto/../../Common/MyUnknown.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h\nZipStrong.o: ../../Crypto/ZipStrong.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/7zCrc.h ../../Crypto/../../../C/Types.h \\\n  ../../Crypto/../../../C/CpuArch.h ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/MyAes.h \\\n  ../../Crypto/../../../C/Aes.h ../../Crypto/../../Common/MyCom.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h ../../Crypto/Sha1.h \\\n  ../../Crypto/ZipStrong.h ../../../Common/MyCom.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../Crypto/../IPassword.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/Types.h ../../Crypto/../IDecl.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/Format7zFree/makefile.list",
    "content": "SRCS=\\\n ../../../myWindows/myGetTickCount.cpp \\\n ../../../myWindows/wine_date_and_time.cpp \\\n \\\n ../../../Common/IntToString.cpp \\\n ../../../Common/MyMap.cpp \\\n ../../../Common/MyString.cpp \\\n ../../../Common/MyWindows.cpp \\\n ../../../Common/MyXml.cpp \\\n ../../../Common/StringConvert.cpp \\\n ../../../Common/StringToInt.cpp \\\n ../../../Common/UTFConvert.cpp \\\n ../../../Common/MyVector.cpp \\\n ../../../Common/Wildcard.cpp \\\n \\\n ../../../Windows/FileDir.cpp \\\n ../../../Windows/FileFind.cpp \\\n ../../../Windows/FileIO.cpp \\\n ../../../Windows/PropVariant.cpp \\\n ../../../Windows/PropVariantUtils.cpp \\\n ../../../Windows/Synchronization.cpp \\\n ../../../Windows/System.cpp \\\n ../../../Windows/Time.cpp \\\n \\\n ../../Common/InBuffer.cpp \\\n ../../Common/InOutTempBuffer.cpp \\\n ../../Common/CreateCoder.cpp \\\n ../../Common/FilterCoder.cpp \\\n ../../Common/LimitedStreams.cpp \\\n ../../Common/LockedStream.cpp \\\n ../../Common/MethodId.cpp \\\n ../../Common/MethodProps.cpp \\\n ../../Common/MemBlocks.cpp \\\n ../../Common/OffsetStream.cpp \\\n ../../Common/OutBuffer.cpp \\\n ../../Common/OutMemStream.cpp \\\n ../../Common/ProgressMt.cpp \\\n ../../Common/ProgressUtils.cpp \\\n ../../Common/StreamBinder.cpp \\\n ../../Common/StreamObjects.cpp \\\n ../../Common/StreamUtils.cpp \\\n ../../Common/VirtThread.cpp \\\n \\\n ../../Archive/ArchiveExports.cpp \\\n ../../Archive/DllExports2.cpp \\\n ../../Archive/ArjHandler.cpp \\\n ../../Archive/DebHandler.cpp \\\n ../../Archive/DmgHandler.cpp \\\n ../../Archive/ElfHandler.cpp \\\n ../../Archive/MachoHandler.cpp \\\n ../../Archive/MubHandler.cpp \\\n ../../Archive/PeHandler.cpp \\\n ../../Archive/RpmHandler.cpp \\\n ../../Archive/XarHandler.cpp \\\n ../../Archive/ZHandler.cpp \\\n \\\n ../../Archive/Common/CoderMixer2.cpp \\\n ../../Archive/Common/CoderMixer2MT.cpp \\\n ../../Archive/Common/CrossThreadProgress.cpp \\\n ../../Archive/Common/DummyOutStream.cpp \\\n ../../Archive/Common/FindSignature.cpp \\\n ../../Archive/Common/InStreamWithCRC.cpp \\\n ../../Archive/Common/ItemNameUtils.cpp \\\n ../../Archive/Common/MultiStream.cpp \\\n ../../Archive/Common/OutStreamWithCRC.cpp \\\n ../../Archive/Common/OutStreamWithSha1.cpp \\\n ../../Archive/Common/HandlerOut.cpp \\\n ../../Archive/Common/ParseProperties.cpp \\\n \\\n ../../Archive/7z/7zCompressionMode.cpp \\\n ../../Archive/7z/7zDecode.cpp \\\n ../../Archive/7z/7zEncode.cpp \\\n ../../Archive/7z/7zExtract.cpp \\\n ../../Archive/7z/7zFolderInStream.cpp \\\n ../../Archive/7z/7zFolderOutStream.cpp \\\n ../../Archive/7z/7zHandler.cpp \\\n ../../Archive/7z/7zHandlerOut.cpp \\\n ../../Archive/7z/7zHeader.cpp \\\n ../../Archive/7z/7zIn.cpp \\\n ../../Archive/7z/7zOut.cpp \\\n ../../Archive/7z/7zProperties.cpp \\\n ../../Archive/7z/7zSpecStream.cpp \\\n ../../Archive/7z/7zUpdate.cpp \\\n ../../Archive/7z/7zRegister.cpp \\\n \\\n ../../Archive/BZip2/BZip2Handler.cpp \\\n ../../Archive/BZip2/BZip2HandlerOut.cpp \\\n ../../Archive/BZip2/BZip2Update.cpp \\\n ../../Archive/BZip2/bz2Register.cpp \\\n \\\n ../../Archive/Cab/CabBlockInStream.cpp \\\n ../../Archive/Cab/CabHandler.cpp \\\n ../../Archive/Cab/CabHeader.cpp \\\n ../../Archive/Cab/CabIn.cpp \\\n ../../Archive/Cab/CabRegister.cpp \\\n \\\n ../../Archive/Chm/ChmHandler.cpp \\\n ../../Archive/Chm/ChmHeader.cpp \\\n ../../Archive/Chm/ChmIn.cpp \\\n ../../Archive/Chm/ChmRegister.cpp \\\n \\\n ../../Archive/Com/ComHandler.cpp \\\n ../../Archive/Com/ComIn.cpp \\\n ../../Archive/Com/ComRegister.cpp \\\n \\\n ../../Archive/Cpio/CpioHandler.cpp \\\n ../../Archive/Cpio/CpioHeader.cpp \\\n ../../Archive/Cpio/CpioIn.cpp \\\n ../../Archive/Cpio/CpioRegister.cpp \\\n \\\n ../../Archive/GZip/GZipHandler.cpp \\\n ../../Archive/GZip/GZipHandlerOut.cpp \\\n ../../Archive/GZip/GZipHeader.cpp \\\n ../../Archive/GZip/GZipIn.cpp \\\n ../../Archive/GZip/GZipOut.cpp \\\n ../../Archive/GZip/GZipRegister.cpp \\\n ../../Archive/GZip/GZipUpdate.cpp \\\n \\\n ../../Archive/Hfs/HfsHandler.cpp \\\n ../../Archive/Hfs/HfsIn.cpp \\\n ../../Archive/Hfs/HfsRegister.cpp \\\n \\\n ../../Archive/Iso/IsoHandler.cpp \\\n ../../Archive/Iso/IsoHeader.cpp \\\n ../../Archive/Iso/IsoIn.cpp \\\n ../../Archive/Iso/IsoRegister.cpp \\\n \\\n ../../Archive/Lzh/LzhCRC.cpp \\\n ../../Archive/Lzh/LzhHandler.cpp \\\n ../../Archive/Lzh/LzhIn.cpp \\\n ../../Archive/Lzh/LzhOutStreamWithCRC.cpp \\\n ../../Archive/Lzh/LzhRegister.cpp \\\n \\\n ../../Archive/Lzma/LzmaArcRegister.cpp \\\n ../../Archive/Lzma/LzmaFiltersDecode.cpp \\\n ../../Archive/Lzma/LzmaHandler.cpp \\\n ../../Archive/Lzma/LzmaIn.cpp \\\n \\\n ../../Archive/Nsis/NsisDecode.cpp \\\n ../../Archive/Nsis/NsisHandler.cpp \\\n ../../Archive/Nsis/NsisIn.cpp \\\n ../../Archive/Nsis/NsisRegister.cpp \\\n \\\n ../../Archive/Rar/RarHandler.cpp \\\n ../../Archive/Rar/RarHeader.cpp \\\n ../../Archive/Rar/RarIn.cpp \\\n ../../Archive/Rar/RarItem.cpp \\\n ../../Archive/Rar/RarVolumeInStream.cpp \\\n ../../Archive/Rar/RarRegister.cpp \\\n \\\n ../../Archive/Split/SplitHandler.cpp \\\n ../../Archive/Split/SplitRegister.cpp \\\n \\\n ../../Archive/Tar/TarHandler.cpp \\\n ../../Archive/Tar/TarHandlerOut.cpp \\\n ../../Archive/Tar/TarHeader.cpp \\\n ../../Archive/Tar/TarIn.cpp \\\n ../../Archive/Tar/TarOut.cpp \\\n ../../Archive/Tar/TarRegister.cpp \\\n ../../Archive/Tar/TarUpdate.cpp \\\n \\\n ../../Archive/Udf/UdfHandler.cpp \\\n ../../Archive/Udf/UdfIn.cpp \\\n ../../Archive/Udf/UdfRegister.cpp \\\n \\\n ../../Archive/Wim/WimHandler.cpp \\\n ../../Archive/Wim/WimIn.cpp \\\n ../../Archive/Wim/WimRegister.cpp \\\n \\\n ../../Archive/Zip/ZipAddCommon.cpp \\\n ../../Archive/Zip/ZipHandler.cpp \\\n ../../Archive/Zip/ZipHandlerOut.cpp \\\n ../../Archive/Zip/ZipHeader.cpp \\\n ../../Archive/Zip/ZipIn.cpp \\\n ../../Archive/Zip/ZipItem.cpp \\\n ../../Archive/Zip/ZipOut.cpp \\\n ../../Archive/Zip/ZipUpdate.cpp \\\n ../../Archive/Zip/ZipRegister.cpp \\\n \\\n ../../Compress/CodecExports.cpp \\\n ../../Compress/ArjDecoder1.cpp \\\n ../../Compress/ArjDecoder2.cpp \\\n ../../Compress/Bcj2Coder.cpp \\\n ../../Compress/Bcj2Register.cpp \\\n ../../Compress/BcjCoder.cpp \\\n ../../Compress/BcjRegister.cpp \\\n ../../Compress/BitlDecoder.cpp \\\n ../../Compress/BranchCoder.cpp \\\n ../../Compress/BranchMisc.cpp \\\n ../../Compress/BranchRegister.cpp \\\n ../../Compress/ByteSwap.cpp \\\n ../../Compress/ByteSwapRegister.cpp \\\n ../../Compress/BZip2Crc.cpp \\\n ../../Compress/BZip2Decoder.cpp \\\n ../../Compress/BZip2Encoder.cpp \\\n ../../Compress/BZip2Register.cpp \\\n ../../Compress/CopyCoder.cpp \\\n ../../Compress/CopyRegister.cpp \\\n ../../Compress/Deflate64Register.cpp \\\n ../../Compress/DeflateDecoder.cpp \\\n ../../Compress/DeflateEncoder.cpp \\\n ../../Compress/DeflateNsisRegister.cpp \\\n ../../Compress/DeflateRegister.cpp \\\n ../../Compress/ImplodeDecoder.cpp \\\n ../../Compress/ImplodeHuffmanDecoder.cpp \\\n ../../Compress/LzhDecoder.cpp \\\n ../../Compress/LzmaDecoder.cpp \\\n ../../Compress/LzmaEncoder.cpp \\\n ../../Compress/LzmaRegister.cpp \\\n ../../Compress/LzOutWindow.cpp \\\n ../../Compress/Lzx86Converter.cpp \\\n ../../Compress/LzxDecoder.cpp \\\n ../../Compress/PpmdDecoder.cpp \\\n ../../Compress/PpmdEncoder.cpp \\\n ../../Compress/PpmdRegister.cpp \\\n ../../Compress/QuantumDecoder.cpp \\\n ../../Compress/ShrinkDecoder.cpp \\\n ../../Compress/ZlibDecoder.cpp \\\n ../../Compress/ZDecoder.cpp \\\n \\\n ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n \\\n ../../Crypto/7zAes.cpp \\\n ../../Crypto/7zAesRegister.cpp \\\n ../../Crypto/HmacSha1.cpp \\\n ../../Crypto/MyAes.cpp \\\n ../../Crypto/Pbkdf2HmacSha1.cpp \\\n ../../Crypto/RandGen.cpp \\\n ../../Crypto/Sha1.cpp \\\n ../../Crypto/WzAes.cpp \\\n ../../Crypto/Rar20Crypto.cpp \\\n ../../Crypto/RarAes.cpp \\\n ../../Crypto/ZipCrypto.cpp \\\n ../../Crypto/ZipStrong.cpp\n\nSRCS_C=\\\n ../../../../C/Bra.c \\\n ../../../../C/Bra86.c \\\n ../../../../C/BraIA64.c \\\n ../../../../C/BwtSort.c \\\n ../../../../C/HuffEnc.c \\\n ../../../../C/LzFind.c \\\n ../../../../C/LzFindMt.c \\\n ../../../../C/LzmaDec.c \\\n ../../../../C/LzmaEnc.c \\\n ../../../../C/Sort.c \\\n ../../../../C/Threads.c \\\n ../../../../C/Aes.c \\\n ../../../../C/Sha256.c\n\ninclude ../../../../makefile.rules\n\nMain.o : ../../UI/Console/Main.cpp\n\t$(CXX) $(CXXFLAGS) ../../UI/Console/Main.cpp\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/SFXCon/Main.cpp",
    "content": "// Main.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/MyInitGuid.h\"\n\n#include \"Common/CommandLineParser.h\"\n#include \"Common/MyCom.h\"\n#include \"Common/MyException.h\"\n#include \"Common/StdOutStream.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/Wildcard.h\"\n\n#include \"Windows/Defs.h\"\n#include \"Windows/FileName.h\"\n#ifdef _WIN32\n#include \"Windows/DLL.h\"\n#include \"Windows/FileDir.h\"\n#else\n#include \"Windows/System.h\"\n#endif\n\n#include \"../../IPassword.h\"\n#include \"../../ICoder.h\"\n\n#include \"../../UI/Common/DefaultName.h\"\n#include \"../../UI/Common/ExitCode.h\"\n#include \"../../UI/Common/Extract.h\"\n#include \"../../UI/Common/OpenArchive.h\"\n\n#include \"../../UI/Console/ExtractCallbackConsole.h\"\n#include \"../../UI/Console/List.h\"\n#include \"../../UI/Console/OpenCallbackConsole.h\"\n\n#include \"../../MyVersion.h\"\n\n#include \"myPrivate.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NCommandLineParser;\n\nextern CStdOutStream *g_StdStream;\n\nstatic const char *kCopyrightString =\n\"\\n7-Zip SFX \" MY_VERSION_COPYRIGHT_DATE \"\\n\"\n\"p7zip Version \" P7ZIP_VERSION ;\n\nstatic const int kNumSwitches = 6;\n\nnamespace NKey {\nenum Enum\n{\n  kHelp1 = 0,\n  kHelp2,\n  kDisablePercents,\n  kYes,\n  kPassword,\n  kOutputDir\n};\n\n}\n\nnamespace NRecursedType {\nenum EEnum\n{\n  kRecursed,\n  kWildCardOnlyRecursed,\n  kNonRecursed\n};\n}\n/*\nstatic const char kRecursedIDChar = 'R';\nstatic const wchar_t *kRecursedPostCharSet = L\"0-\";\n\nnamespace NRecursedPostCharIndex {\n  enum EEnum\n  {\n    kWildCardRecursionOnly = 0,\n    kNoRecursion = 1\n  };\n}\n\nstatic const char kFileListID = '@';\nstatic const char kImmediateNameID = '!';\n\nstatic const char kSomeCludePostStringMinSize = 2; // at least <@|!><N>ame must be\nstatic const char kSomeCludeAfterRecursedPostStringMinSize = 2; // at least <@|!><N>ame must be\n*/\nstatic const CSwitchForm kSwitchForms[kNumSwitches] =\n  {\n    { L\"?\",  NSwitchType::kSimple, false },\n    { L\"H\",  NSwitchType::kSimple, false },\n    { L\"BD\", NSwitchType::kSimple, false },\n    { L\"Y\",  NSwitchType::kSimple, false },\n    { L\"P\",  NSwitchType::kUnLimitedPostString, false, 1 },\n    { L\"O\",  NSwitchType::kUnLimitedPostString, false, 1 },\n  };\n\nstatic const int kNumCommandForms = 3;\n\nnamespace NCommandType {\nenum EEnum\n{\n  kTest = 0,\n  // kExtract,\n  kFullExtract,\n  kList\n};\n\n}\n\nstatic const CCommandForm commandForms[kNumCommandForms] =\n{\n  { L\"T\", false },\n  // { \"E\", false },\n  { L\"X\", false },\n  { L\"L\", false }\n};\n\nstatic const NRecursedType::EEnum kCommandRecursedDefault[kNumCommandForms] =\n{\n  NRecursedType::kRecursed\n};\n\n// static const bool kTestExtractRecursedDefault = true;\n// static const bool kAddRecursedDefault = false;\n\nstatic const wchar_t *kUniversalWildcard = L\"*\";\nstatic const int kCommandIndex = 0;\n\nstatic const char *kHelpString =\n    \"\\nUsage: 7zSFX [<command>] [<switches>...]\\n\"\n    \"\\n\"\n    \"<Commands>\\n\"\n    \"  l: List contents of archive\\n\"\n    \"  t: Test integrity of archive\\n\"\n    \"  x: eXtract files with full pathname (default)\\n\"\n    \"<Switches>\\n\"\n    // \"  -bd Disable percentage indicator\\n\"\n    \"  -o{Directory}: set Output directory\\n\"\n    \"  -p{Password}: set Password\\n\"\n    \"  -y: assume Yes on all queries\\n\";\n\n\n// ---------------------------\n// exception messages\n\nstatic const char *kUserErrorMessage  = \"Incorrect command line\"; // NExitCode::kUserError\n// static const char *kIncorrectListFile = \"Incorrect wildcard in listfile\";\nstatic const char *kIncorrectWildCardInCommandLine  = \"Incorrect wildcard in command line\";\n\n// static const CSysString kFileIsNotArchiveMessageBefore = \"File \\\"\";\n// static const CSysString kFileIsNotArchiveMessageAfter = \"\\\" is not archive\";\n\n// static const char *kProcessArchiveMessage = \" archive: \";\n\nstatic const char *kCantFindSFX = \" cannot find sfx\";\n\n\nstruct CArchiveCommand\n{\n  NCommandType::EEnum CommandType;\n  NRecursedType::EEnum DefaultRecursedType() const;\n};\n\nNRecursedType::EEnum CArchiveCommand::DefaultRecursedType() const\n{\n  return kCommandRecursedDefault[CommandType];\n}\n\nvoid PrintHelp(void)\n{\n  g_StdOut << kHelpString;\n}\n\nstatic void ShowMessageAndThrowException(const char *message, NExitCode::EEnum code)\n{\n  g_StdOut << message << endl;\n  throw code;\n}\n\nstatic void PrintHelpAndExit() // yyy\n{\n  PrintHelp();\n  ShowMessageAndThrowException(kUserErrorMessage, NExitCode::kUserError);\n}\n\nbool ParseArchiveCommand(const UString &commandString, CArchiveCommand &command)\n{\n  UString commandStringUpper = commandString;\n  commandStringUpper.MakeUpper();\n  UString postString;\n  int commandIndex = ParseCommand(kNumCommandForms, commandForms, commandStringUpper,\n      postString) ;\n  if (commandIndex < 0)\n    return false;\n  command.CommandType = (NCommandType::EEnum)commandIndex;\n  return true;\n}\n\n// ------------------------------------------------------------------\n// filenames functions\n\nstatic bool AddNameToCensor(NWildcard::CCensor &wildcardCensor,\n    const UString &name, bool include, NRecursedType::EEnum type)\n{\n  /*\n  if(!IsWildCardFilePathLegal(name))\n    return false;\n  */\n  bool isWildCard = DoesNameContainWildCard(name);\n  bool recursed = false;\n\n  switch (type)\n  {\n    case NRecursedType::kWildCardOnlyRecursed:\n      recursed = isWildCard;\n      break;\n    case NRecursedType::kRecursed:\n      recursed = true;\n      break;\n    case NRecursedType::kNonRecursed:\n      recursed = false;\n      break;\n  }\n  wildcardCensor.AddItem(include, name, recursed);\n  return true;\n}\n\nvoid AddCommandLineWildCardToCensor(NWildcard::CCensor &wildcardCensor,\n    const UString &name, bool include, NRecursedType::EEnum type)\n{\n  if (!AddNameToCensor(wildcardCensor, name, include, type))\n    ShowMessageAndThrowException(kIncorrectWildCardInCommandLine, NExitCode::kUserError);\n}\n\nvoid AddToCensorFromNonSwitchesStrings(NWildcard::CCensor &wildcardCensor,\n    const UStringVector & /* nonSwitchStrings */, NRecursedType::EEnum type,\n    bool /* thereAreSwitchIncludeWildCards */)\n{\n  AddCommandLineWildCardToCensor(wildcardCensor, kUniversalWildcard, true, type);\n}\n\n\n#ifndef _WIN32\nstatic void GetArguments(int numArguments, const char *arguments[], UStringVector &parts)\n{\n  parts.Clear();\n  for(int i = 0; i < numArguments; i++)\n  {\n    UString s = MultiByteToUnicodeString(arguments[i]);\n    parts.Add(s);\n  }\n}\n#endif\n\nint Main2(\n  #ifndef _WIN32\n  int numArguments, const char *arguments[]\n  #endif\n)\n{\n  #ifdef _WIN32\n  SetFileApisToOEM();\n  #endif\n  \n  UStringVector commandStrings;\n  #ifdef _WIN32\n  NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);\n  #else\n  extern void mySplitCommandLine(int numArguments,const char *arguments[],UStringVector &parts);\n  mySplitCommandLine(numArguments,arguments,commandStrings);\n  #endif\n\n  // After mySplitCommandLine\n  g_StdOut << kCopyrightString << \" (locale=\" << my_getlocale() <<\",Utf16=\";\n  if (global_use_utf16_conversion) g_StdOut << \"on\";\n  else                             g_StdOut << \"off\";\n  g_StdOut << \",HugeFiles=\";\n  if (sizeof(off_t) >= 8) g_StdOut << \"on,\";\n  else                    g_StdOut << \"off,\";\n  int nbcpu = NWindows::NSystem::GetNumberOfProcessors();\n  if (nbcpu > 1) g_StdOut << nbcpu << \" CPUs)\\n\";\n  else           g_StdOut << nbcpu << \" CPU)\\n\";\n \n  UString arcPath = commandStrings.Front();\n\n  commandStrings.Delete(0);\n\n  NCommandLineParser::CParser parser(kNumSwitches);\n  try\n  {\n    parser.ParseStrings(kSwitchForms, commandStrings);\n  }\n  catch(...)\n  {\n    PrintHelpAndExit();\n  }\n\n  if(parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs)\n  {\n    PrintHelp();\n    return 0;\n  }\n  const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;\n\n  int numNonSwitchStrings = nonSwitchStrings.Size();\n\n  CArchiveCommand command;\n  if (numNonSwitchStrings == 0)\n    command.CommandType = NCommandType::kFullExtract;\n  else\n  {\n    if (numNonSwitchStrings > 1)\n      PrintHelpAndExit();\n    if (!ParseArchiveCommand(nonSwitchStrings[kCommandIndex], command))\n      PrintHelpAndExit();\n  }\n\n\n  NRecursedType::EEnum recursedType;\n  recursedType = command.DefaultRecursedType();\n\n  NWildcard::CCensor wildcardCensor;\n  \n  bool thereAreSwitchIncludeWildCards;\n  thereAreSwitchIncludeWildCards = false;\n  AddToCensorFromNonSwitchesStrings(wildcardCensor, nonSwitchStrings, recursedType,\n      thereAreSwitchIncludeWildCards);\n\n  bool yesToAll = parser[NKey::kYes].ThereIs;\n\n  #ifdef _WIN32\n  if (archiveName.Right(kDefaultExtLength).CompareNoCase(kDefaultExt) != 0)\n    archiveName += kDefaultExt;\n  #endif\n\n  // NExtractMode::EEnum extractMode;\n  // bool isExtractGroupCommand = command.IsFromExtractGroup(extractMode);\n\n  bool passwordEnabled = parser[NKey::kPassword].ThereIs;\n\n  UString password;\n  if(passwordEnabled)\n    password = parser[NKey::kPassword].PostStrings[0];\n\n  NFind::CFileInfoW archiveFileInfo;\n  if (!NFind::FindFile(arcPath, archiveFileInfo))\n    throw kCantFindSFX;\n  if (archiveFileInfo.IsDir())\n    throw kCantFindSFX;\n  \n  UString outputDir;\n  if (parser[NKey::kOutputDir].ThereIs)\n  {\n    outputDir = parser[NKey::kOutputDir].PostStrings[0];\n    NName::NormalizeDirPathPrefix(outputDir);\n  }\n\n  {\n    UStringVector v1, v2;\n    v1.Add(arcPath);\n    v2.Add(arcPath);\n    const NWildcard::CCensorNode &wildcardCensorHead =\n      wildcardCensor.Pairs.Front().Head;\n\n    CCodecs *codecs = new CCodecs;\n    CMyComPtr<\n      #ifdef EXTERNAL_CODECS\n      ICompressCodecsInfo\n      #else\n      IUnknown\n      #endif\n      > compressCodecsInfo = codecs;\n    HRESULT result = codecs->Load();\n    if (result != S_OK)\n      throw CSystemException(result);\n\n    if(command.CommandType != NCommandType::kList)\n    {\n      CExtractCallbackConsole *ecs = new CExtractCallbackConsole;\n      CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;\n      ecs->OutStream = g_StdStream;\n      ecs->PasswordIsDefined = passwordEnabled;\n      ecs->Password = password;\n      ecs->Init();\n\n      COpenCallbackConsole openCallback;\n      openCallback.OutStream = g_StdStream;\n      openCallback.PasswordIsDefined = passwordEnabled;\n      openCallback.Password = password;\n\n      CExtractOptions eo;\n      eo.StdOutMode = false;\n      eo.PathMode = NExtract::NPathMode::kFullPathnames;\n      eo.TestMode = command.CommandType == NCommandType::kTest;\n      eo.OverwriteMode = yesToAll ?\n          NExtract::NOverwriteMode::kWithoutPrompt :\n          NExtract::NOverwriteMode::kAskBefore;\n      eo.OutputDir = outputDir;\n      eo.YesToAll = yesToAll;\n\n      UString errorMessage;\n      CDecompressStat stat;\n      HRESULT result = DecompressArchives(\n          codecs, CIntVector(),\n          v1, v2,\n          wildcardCensorHead,\n          eo, &openCallback, ecs, errorMessage, stat);\n      if (!errorMessage.IsEmpty())\n      {\n        (*g_StdStream) << endl << \"Error: \" << errorMessage;;\n        if (result == S_OK)\n          result = E_FAIL;\n      }\n\n      if (ecs->NumArchiveErrors != 0 || ecs->NumFileErrors != 0)\n      {\n        if (ecs->NumArchiveErrors != 0)\n          (*g_StdStream) << endl << \"Archive Errors: \" << ecs->NumArchiveErrors << endl;\n        if (ecs->NumFileErrors != 0)\n          (*g_StdStream) << endl << \"Sub items Errors: \" << ecs->NumFileErrors << endl;\n        return NExitCode::kFatalError;\n      }\n      if (result != S_OK)\n        throw CSystemException(result);\n    }\n    else\n    {\n      UInt64 numErrors = 0;\n      HRESULT result = ListArchives(\n          codecs, CIntVector(),\n          v1, v2,\n          wildcardCensorHead,\n          true, false,\n          passwordEnabled,\n          password, numErrors);\n      if (numErrors > 0)\n      {\n        g_StdOut << endl << \"Errors: \" << numErrors;\n        return NExitCode::kFatalError;\n      }\n      if (result != S_OK)\n        throw CSystemException(result);\n    }\n  }\n  return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/SFXCon/makefile",
    "content": "PROG=../../../../bin/7zCon.sfx\n\nLOCAL_FLAGS= \\\n  -DEXTRACT_ONLY \\\n  -DNO_READ_FROM_CODER \\\n  -D_SFX\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLIBS=$(LOCAL_LIBS)\n\nSFX_CONSOLE_OBJS = \\\n  Main.o \\\n\nCONSOLE_OBJS = \\\n  ConsoleClose.o \\\n  ExtractCallbackConsole.o \\\n  List.o \\\n  MainAr.o \\\n  OpenCallbackConsole.o \\\n  UserInputUtils.o \\\n\n# NewHandler.o\nCOMMON_OBJS = \\\n  CommandLineParser.o \\\n  CRC.o \\\n  IntToString.o \\\n  StdInStream.o \\\n  StdOutStream.o \\\n  MyString.o \\\n  MyWindows.o\\\n  StringConvert.o \\\n  MyVector.o \\\n  Wildcard.o \\\n\n# DLL.o \nWIN_OBJS = \\\n  Error.o \\\n  FileDir.o \\\n  FileFind.o \\\n  FileIO.o \\\n  FileName.o \\\n  PropVariant.o \\\n  PropVariantConversions.o \\\n  Synchronization.o \\\n  System.o\n\n7ZIP_COMMON_OBJS = \\\n  CreateCoder.o \\\n  FilePathAutoRename.o \\\n  FileStreams.o \\\n  InBuffer.o \\\n  FilterCoder.o \\\n  LimitedStreams.o \\\n  LockedStream.o \\\n  OutBuffer.o \\\n  ProgressUtils.o \\\n  StreamBinder.o \\\n  StreamObjects.o \\\n  StreamUtils.o \\\n  VirtThread.o \\\n\nUI_COMMON_OBJS = \\\n  ArchiveExtractCallback.o \\\n  ArchiveOpenCallback.o \\\n  DefaultName.o \\\n  LoadCodecs.o \\\n  Extract.o \\\n  ExtractingFilePath.o \\\n  OpenArchive.o \\\n  PropIDUtils.o \\\n\nAR_COMMON_OBJS = \\\n  CoderMixer2.o \\\n  CoderMixer2MT.o \\\n  CrossThreadProgress.o \\\n  ItemNameUtils.o \\\n  OutStreamWithCRC.o \\\n\n\n7Z_OBJS = \\\n  7zDecode.o \\\n  7zExtract.o \\\n  7zFolderOutStream.o \\\n  7zHandler.o \\\n  7zHeader.o \\\n  7zIn.o \\\n  7zRegister.o \\\n\nCOMPRESS_OBJS = \\\n  BranchCoder.o \\\n  Bcj2Coder.o \\\n  Bcj2Register.o \\\n  BcjCoder.o \\\n  BcjRegister.o \\\n  CopyCoder.o \\\n  CopyRegister.o \\\n  LzmaDecoder.o \\\n  LzmaRegister.o \\\n  PpmdDecoder.o \\\n  PpmdRegister.o \\\n\nCRYPTO_OBJS = \\\n  7zAes.o \\\n  7zAesRegister.o \\\n  MyAes.o \\\n\n# Alloc.o\nC_OBJS = \\\n  Bra86.o \\\n  LzmaDec.o \\\n  Threads.o \\\n  Aes.o \\\n  Sha256.o \\\n\nOBJS = \\\n  myGetTickCount.o\\\n  wine_date_and_time.o\\\n  mySplitCommandLine.o\\\n  $(SFX_CONSOLE_OBJS) \\\n  $(CONSOLE_OBJS) \\\n  $(COMMON_OBJS) \\\n  $(WIN_OBJS) \\\n  $(7ZIP_COMMON_OBJS) \\\n  $(UI_COMMON_OBJS) \\\n  $(AR_COMMON_OBJS) \\\n  $(7Z_OBJS) \\\n  $(COMPRESS_OBJS) \\\n  $(CRYPTO_OBJS) \\\n  $(C_OBJS) \\\n  $(OBJ_CRC32)\n\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/SFXCon/makefile.depend",
    "content": "myGetTickCount.o: ../../../myWindows/myGetTickCount.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\nwine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nmySplitCommandLine.o: ../../../myWindows/mySplitCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../myWindows/../Common/StringConvert.h \\\n  ../../../myWindows/../Common/MyWindows.h \\\n  ../../../myWindows/../Common/MyString.h \\\n  ../../../myWindows/../Common/MyVector.h \\\n  ../../../myWindows/../Common/Defs.h \\\n  ../../../myWindows/../Common/Types.h ../../../myWindows/myPrivate.h\nMain.o: Main.cpp ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/MyInitGuid.h \\\n  ../../../Common/CommandLineParser.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyException.h ../../../Common/StdOutStream.h \\\n  ../../../Common/StringConvert.h ../../../Common/Wildcard.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/System.h \\\n  ../../../Windows/../Common/Types.h ../../IPassword.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ../../ICoder.h ../../IStream.h ../../UI/Common/DefaultName.h \\\n  ../../../Common/MyString.h ../../UI/Common/ExitCode.h \\\n  ../../UI/Common/Extract.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../UI/Common/../../IDecl.h \\\n  ../../../Common/MyCom.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h ../../UI/Common/ExtractMode.h \\\n  ../../UI/Common/ArchiveOpenCallback.h ../../UI/Common/Property.h \\\n  ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Console/ExtractCallbackConsole.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/List.h ../../../Common/Wildcard.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h ../../MyVersion.h \\\n  ../../../myWindows/myPrivate.h\nConsoleClose.o: ../../UI/Console/ConsoleClose.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/ConsoleClose.h\nExtractCallbackConsole.o: ../../UI/Console/ExtractCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Console/ExtractCallbackConsole.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Console/../../Common/../IStream.h \\\n  ../../UI/Console/../../Common/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Common/../../Common/MyWindows.h \\\n  ../../UI/Console/../../Common/../../Common/Types.h \\\n  ../../UI/Console/../../Common/../IDecl.h \\\n  ../../UI/Console/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../../../Common/Types.h ../../UI/Console/../../IDecl.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../../Archive/../IStream.h \\\n  ../../UI/Console/../../Archive/../IProgress.h \\\n  ../../UI/Console/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../../Archive/../IDecl.h \\\n  ../../UI/Console/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../UI/Console/../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/UserInputUtils.h ../../UI/Console/ConsoleClose.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Error.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Console/../../Common/FilePathAutoRename.h \\\n  ../../UI/Console/../Common/ExtractingFilePath.h\nList.o: ../../UI/Console/List.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Console/List.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../../IStream.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/MyCom.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/Error.h ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/PropIDUtils.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/OpenArchive.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyCom.h ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h\nMainAr.o: ../../UI/Console/MainAr.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h ../../../Common/NewHandler.h \\\n  ../../../Common/MyException.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/ExitCode.h \\\n  ../../UI/Console/../Common/ArchiveCommandLine.h \\\n  ../../../Common/Wildcard.h ../../../Common/CommandLineParser.h \\\n  ../../UI/Console/../Common/Extract.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h ../../UI/Console/../Common/../../IDecl.h \\\n  ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/Update.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/LoadCodecs.h ../../UI/Console/ConsoleClose.h\nOpenCallbackConsole.o: ../../UI/Console/OpenCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/OpenCallbackConsole.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../UI/Console/UserInputUtils.h\nUserInputUtils.o: ../../UI/Console/UserInputUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../UI/Console/UserInputUtils.h \\\n  ../../../Common/StdOutStream.h ../../../Common/MyException.h\nCommandLineParser.o: ../../../Common/CommandLineParser.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nCRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/../../C/7zCrc.h ../../../Common/../../C/Types.h\nIntToString.o: ../../../Common/IntToString.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h\nStdInStream.o: ../../../Common/StdInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nStdOutStream.o: ../../../Common/StdOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nError.o: ../../../Windows/Error.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileName.o: ../../../Windows/FileName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantConversions.o: ../../../Windows/PropVariantConversions.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h\nSynchronization.o: ../../../Windows/Synchronization.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nSystem.o: ../../../Windows/System.cpp ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h\nCreateCoder.o: ../../Common/CreateCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/MethodId.h \\\n  ../../Common/../../Common/Types.h \\\n  ../../Common/../../Windows/PropVariant.h \\\n  ../../Common/../../Windows/../Common/MyWindows.h \\\n  ../../Common/../../Windows/../Common/Types.h \\\n  ../../Common/../../Windows/Defs.h ../../Common/FilterCoder.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../IPassword.h \\\n  ../../Common/RegisterCodec.h ../../Common/../Common/MethodId.h\nFilePathAutoRename.o: ../../Common/FilePathAutoRename.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h\nFileStreams.o: ../../Common/FileStreams.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FileStreams.h ../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h\nInBuffer.o: ../../Common/InBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/InBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nFilterCoder.o: ../../Common/FilterCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FilterCoder.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../ICoder.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../IPassword.h ../../Common/../../../C/Alloc.h \\\n  ../../Common/../../Common/Defs.h ../../Common/StreamUtils.h \\\n  ../../Common/../IStream.h\nLimitedStreams.o: ../../Common/LimitedStreams.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/LimitedStreams.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nLockedStream.o: ../../Common/LockedStream.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/LockedStream.h \\\n  ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h\nOutBuffer.o: ../../Common/OutBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nProgressUtils.o: ../../Common/ProgressUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/ProgressUtils.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../IProgress.h\nStreamBinder.o: ../../Common/StreamBinder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamBinder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Common/Defs.h ../../Common/../../Common/MyCom.h\nStreamObjects.o: ../../Common/StreamObjects.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/StreamObjects.h \\\n  ../../Common/../../Common/DynamicBuffer.h \\\n  ../../Common/../../Common/Buffer.h ../../Common/../../Common/Defs.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/Types.h ../../Common/../IDecl.h \\\n  ../../Common/../../Common/Defs.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nVirtThread.o: ../../Common/VirtThread.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/VirtThread.h ../../Common/../../Windows/Synchronization.h \\\n  ../../Common/../../Windows/Defs.h \\\n  ../../Common/../../Windows/../../C/Threads.h \\\n  ../../Common/../../Windows/../../C/Types.h \\\n  ../../Common/../../Windows/Synchronization2.h \\\n  ../../Common/../../Windows/Thread.h\nArchiveExtractCallback.o: ../../UI/Common/ArchiveExtractCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/ComTry.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Common/../../Common/FilePathAutoRename.h \\\n  ../../UI/Common/../Common/ExtractingFilePath.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/ArchiveOpenCallback.h\nArchiveOpenCallback.o: ../../UI/Common/ArchiveOpenCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h\nDefaultName.o: ../../UI/Common/DefaultName.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/DefaultName.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nExtract.o: ../../UI/Common/Extract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/Extract.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/Property.h ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/SetProperties.h\nExtractingFilePath.o: ../../UI/Common/ExtractingFilePath.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ExtractingFilePath.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nLoadCodecs.o: ../../UI/Common/LoadCodecs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/LoadCodecs.h ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/MyVector.h \\\n  ../../UI/Common/../../../Common/Defs.h \\\n  ../../UI/Common/../../../Common/Buffer.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/../../../Windows/PropVariant.h \\\n  ../../UI/Common/../../../Windows/../Common/MyWindows.h \\\n  ../../UI/Common/../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/RegisterArc.h \\\n  ../../UI/Common/../../Common/../Archive/IArchive.h\nOpenArchive.o: ../../UI/Common/OpenArchive.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/OpenArchive.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyCom.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/StreamUtils.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../UI/Common/DefaultName.h\nPropIDUtils.o: ../../UI/Common/PropIDUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/PropIDUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariantConversions.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../PropID.h\nCoderMixer2.o: ../../Archive/Common/CoderMixer2.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h\nCoderMixer2MT.o: ../../Archive/Common/CoderMixer2MT.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/Common/CoderMixer2MT.h \\\n  ../../Archive/Common/CoderMixer2.h \\\n  ../../Archive/Common/../../../Common/MyVector.h \\\n  ../../Archive/Common/../../../Common/Defs.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../Common/StreamBinder.h \\\n  ../../Archive/Common/../../Common/../IStream.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../Common/VirtThread.h \\\n  ../../Archive/Common/../../Common/../../Windows/Thread.h\nCrossThreadProgress.o: ../../Archive/Common/CrossThreadProgress.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/CrossThreadProgress.h \\\n  ../../Archive/Common/../../ICoder.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../Windows/Synchronization.h \\\n  ../../Archive/Common/../../../Windows/Defs.h \\\n  ../../Archive/Common/../../../Windows/../../C/Threads.h \\\n  ../../Archive/Common/../../../Windows/../../C/Types.h \\\n  ../../Archive/Common/../../../Windows/Synchronization2.h \\\n  ../../Archive/Common/../../../Common/MyCom.h\nOutStreamWithCRC.o: ../../Archive/Common/OutStreamWithCRC.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Archive/Common/OutStreamWithCRC.h \\\n  ../../Archive/Common/../../../Common/MyCom.h \\\n  ../../Archive/Common/../../../Common/MyWindows.h \\\n  ../../Archive/Common/../../IStream.h \\\n  ../../Archive/Common/../../../Common/MyUnknown.h \\\n  ../../Archive/Common/../../../Common/Types.h \\\n  ../../Archive/Common/../../IDecl.h \\\n  ../../Archive/Common/../../../../C/7zCrc.h \\\n  ../../Archive/Common/../../../../C/Types.h\n7zDecode.o: ../../Archive/7z/7zDecode.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/LockedStream.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h\n7zExtract.o: ../../Archive/7z/7zExtract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h \\\n  ../../Archive/7z/7zDecode.h ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/ProgressUtils.h \\\n  ../../Archive/7z/../../Common/../IProgress.h \\\n  ../../Archive/7z/../../Common/LimitedStreams.h\n7zFolderOutStream.o: ../../Archive/7z/7zFolderOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Archive/7z/7zFolderOutStream.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IProgress.h \\\n  ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/../Common/OutStreamWithCRC.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../Common/../../../../C/Types.h\n7zHandler.o: ../../Archive/7z/7zHandler.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../../Common/ComTry.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Common/IntToString.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/ItemNameUtils.h \\\n  ../../Archive/7z/../Common/../../../Common/MyString.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../IArchive.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../IProgress.h ../../Archive/7z/../../PropID.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../IPassword.h ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h \\\n  ../../Archive/7z/7zProperties.h ../../Archive/7z/../../PropID.h\n7zHeader.o: ../../Archive/7z/7zHeader.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/7zHeader.h ../../Archive/7z/../../../Common/Types.h\n7zIn.o: ../../Archive/7z/7zIn.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../../../C/7zCrc.h \\\n  ../../Archive/7z/../../../../C/Types.h \\\n  ../../Archive/7z/../../../../C/CpuArch.h \\\n  ../../Archive/7z/../../Common/StreamObjects.h \\\n  ../../Archive/7z/../../Common/../../Common/DynamicBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Buffer.h \\\n  ../../Archive/7z/../../Common/../../Common/Defs.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../IDecl.h \\\n  ../../Archive/7z/../../Common/StreamUtils.h ../../Archive/7z/7zDecode.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../../Common/MyVector.h \\\n  ../../Archive/7z/../Common/../../../Common/Defs.h \\\n  ../../Archive/7z/../Common/../../../Common/Types.h \\\n  ../../Archive/7z/../Common/../../../Common/MyCom.h \\\n  ../../Archive/7z/../Common/../../ICoder.h \\\n  ../../Archive/7z/../Common/../../IStream.h \\\n  ../../Archive/7z/../Common/CoderMixer2MT.h \\\n  ../../Archive/7z/../Common/CoderMixer2.h \\\n  ../../Archive/7z/../Common/../../Common/StreamBinder.h \\\n  ../../Archive/7z/../Common/../../Common/../IStream.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Defs.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Threads.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/../../C/Types.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Synchronization2.h \\\n  ../../Archive/7z/../Common/../../Common/VirtThread.h \\\n  ../../Archive/7z/../Common/../../Common/../../Windows/Thread.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/7zIn.h \\\n  ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h\n7zRegister.o: ../../Archive/7z/7zRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Archive/7z/../../Common/RegisterArc.h \\\n  ../../Archive/7z/../../Common/../Archive/IArchive.h \\\n  ../../Archive/7z/../../Common/../Archive/../IStream.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/MyWindows.h \\\n  ../../Archive/7z/../../Common/../Archive/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/../Archive/../IDecl.h \\\n  ../../Archive/7z/../../Common/../Archive/../IProgress.h \\\n  ../../Archive/7z/../../Common/../Archive/../PropID.h \\\n  ../../Archive/7z/7zHandler.h ../../Archive/7z/../../ICoder.h \\\n  ../../Archive/7z/../../IStream.h ../../Archive/7z/../IArchive.h \\\n  ../../Archive/7z/7zIn.h ../../Archive/7z/../../../Common/MyCom.h \\\n  ../../Archive/7z/../../../Common/MyWindows.h \\\n  ../../Archive/7z/../../IPassword.h \\\n  ../../Archive/7z/../../../Common/MyUnknown.h \\\n  ../../Archive/7z/../../../Common/Types.h ../../Archive/7z/../../IDecl.h \\\n  ../../Archive/7z/../../IStream.h \\\n  ../../Archive/7z/../../Common/CreateCoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Archive/7z/../../Common/../ICoder.h \\\n  ../../Archive/7z/../../Common/MethodId.h \\\n  ../../Archive/7z/../../Common/../../Common/Types.h \\\n  ../../Archive/7z/../../Common/InBuffer.h \\\n  ../../Archive/7z/../../Common/../IStream.h \\\n  ../../Archive/7z/../../Common/../../Common/MyCom.h \\\n  ../../Archive/7z/../../Common/../../Common/MyException.h \\\n  ../../Archive/7z/../../Common/../../Common/MyWindows.h \\\n  ../../Archive/7z/7zItem.h ../../Archive/7z/../../../Common/Buffer.h \\\n  ../../Archive/7z/../../../Common/Defs.h \\\n  ../../Archive/7z/../../../Common/MyString.h \\\n  ../../Archive/7z/../../Common/MethodId.h ../../Archive/7z/7zHeader.h \\\n  ../../Archive/7z/../../../Common/Types.h \\\n  ../../Archive/7z/7zCompressionMode.h \\\n  ../../Archive/7z/../../../Windows/PropVariant.h \\\n  ../../Archive/7z/../../../Windows/../Common/MyWindows.h \\\n  ../../Archive/7z/../../../Windows/../Common/Types.h \\\n  ../../Archive/7z/../../Common/MethodProps.h \\\n  ../../Archive/7z/../../Common/../../Common/MyVector.h \\\n  ../../Archive/7z/../../Common/../../Windows/PropVariant.h\nBranchCoder.o: ../../Compress/BranchCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BranchCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBcj2Coder.o: ../../Compress/Bcj2Coder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/Bcj2Coder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcj2Register.o: ../../Compress/Bcj2Register.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/Bcj2Coder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/RangeCoderBit.h ../../Compress/RangeCoder.h \\\n  ../../Compress/../Common/InBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/OutBuffer.h\nBcjCoder.o: ../../Compress/BcjCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nBcjRegister.o: ../../Compress/BcjRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/BcjCoder.h ../../Compress/../../../C/Bra.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/BranchCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nCopyCoder.o: ../../Compress/CopyCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/CopyCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nCopyRegister.o: ../../Compress/CopyRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/CopyCoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nLzmaDecoder.o: ../../Compress/LzmaDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/LzmaDecoder.h \\\n  ../../Compress/../../../C/LzmaDec.h ../../Compress/../../../C/Types.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaRegister.o: ../../Compress/LzmaRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/LzmaDecoder.h ../../Compress/../../../C/LzmaDec.h \\\n  ../../Compress/../../../C/Types.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h\nPpmdDecoder.o: ../../Compress/PpmdDecoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../Compress/PpmdDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/PpmdDecode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/InBuffer.h\nPpmdRegister.o: ../../Compress/PpmdRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../Compress/../Common/RegisterCodec.h \\\n  ../../Compress/../Common/../Common/MethodId.h \\\n  ../../Compress/../Common/../Common/../../Common/Types.h \\\n  ../../Compress/PpmdDecoder.h ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h ../../Compress/../../Common/MyUnknown.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/../IDecl.h \\\n  ../../Compress/../Common/OutBuffer.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyCom.h \\\n  ../../Compress/../Common/../../Common/MyException.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/PpmdDecode.h ../../Compress/PpmdContext.h \\\n  ../../Compress/../../Common/Types.h ../../Compress/PpmdSubAlloc.h \\\n  ../../Compress/../../../C/Alloc.h ../../Compress/PpmdType.h \\\n  ../../Compress/RangeCoder.h ../../Compress/../Common/InBuffer.h\n7zAes.o: ../../Crypto/7zAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/../../../C/Sha256.h ../../Crypto/../../../C/Types.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h \\\n  ../../Crypto/../Common/StreamObjects.h \\\n  ../../Crypto/../Common/../../Common/DynamicBuffer.h \\\n  ../../Crypto/../Common/../../Common/Buffer.h \\\n  ../../Crypto/../Common/../../Common/Defs.h \\\n  ../../Crypto/../Common/../../Common/MyCom.h \\\n  ../../Crypto/../Common/../../Common/MyWindows.h \\\n  ../../Crypto/../Common/../IStream.h \\\n  ../../Crypto/../Common/../../Common/MyUnknown.h \\\n  ../../Crypto/../Common/../../Common/Types.h \\\n  ../../Crypto/../Common/../IDecl.h ../../Crypto/../Common/StreamUtils.h \\\n  ../../Crypto/7zAes.h ../../../Common/Buffer.h ../../../Common/MyCom.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../IPassword.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/Types.h ../../Crypto/../IDecl.h \\\n  ../../Crypto/MyAes.h ../../Crypto/../../../C/Aes.h \\\n  ../../Crypto/../../Common/MyCom.h ../../Crypto/../../Common/Types.h\n7zAesRegister.o: ../../Crypto/7zAesRegister.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Crypto/../Common/RegisterCodec.h \\\n  ../../Crypto/../Common/../Common/MethodId.h \\\n  ../../Crypto/../Common/../Common/../../Common/Types.h \\\n  ../../Crypto/7zAes.h ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyVector.h ../../Crypto/../ICoder.h \\\n  ../../Crypto/../IStream.h ../../Crypto/../../Common/MyUnknown.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h ../../Crypto/../IPassword.h\nMyAes.o: ../../Crypto/MyAes.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Crypto/MyAes.h ../../Crypto/../../../C/Aes.h \\\n  ../../Crypto/../../../C/Types.h ../../Crypto/../../Common/MyCom.h \\\n  ../../Crypto/../../Common/MyWindows.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../ICoder.h ../../Crypto/../IStream.h \\\n  ../../Crypto/../../Common/MyUnknown.h ../../Crypto/../../Common/Types.h \\\n  ../../Crypto/../IDecl.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Bundles/SFXCon/makefile.list",
    "content": "SRCS=\\\n ../../../myWindows/myGetTickCount.cpp \\\n ../../../myWindows/wine_date_and_time.cpp \\\n ../../../myWindows/mySplitCommandLine.cpp \\\n \\\n Main.cpp \\\n \\\n ../../UI/Console/ConsoleClose.cpp \\\n ../../UI/Console/ExtractCallbackConsole.cpp \\\n ../../UI/Console/List.cpp \\\n ../../UI/Console/MainAr.cpp \\\n ../../UI/Console/OpenCallbackConsole.cpp \\\n ../../UI/Console/UserInputUtils.cpp \\\n \\\n ../../../Common/CommandLineParser.cpp \\\n ../../../Common/CRC.cpp \\\n ../../../Common/IntToString.cpp \\\n ../../../Common/StdInStream.cpp \\\n ../../../Common/StdOutStream.cpp \\\n ../../../Common/MyString.cpp \\\n ../../../Common/MyWindows.cpp \\\n ../../../Common/StringConvert.cpp \\\n ../../../Common/MyVector.cpp \\\n ../../../Common/Wildcard.cpp \\\n \\\n ../../../Windows/Error.cpp \\\n ../../../Windows/FileDir.cpp \\\n ../../../Windows/FileFind.cpp \\\n ../../../Windows/FileIO.cpp \\\n ../../../Windows/FileName.cpp \\\n ../../../Windows/PropVariant.cpp \\\n ../../../Windows/PropVariantConversions.cpp \\\n ../../../Windows/Synchronization.cpp \\\n ../../../Windows/System.cpp \\\n \\\n ../../Common/CreateCoder.cpp \\\n ../../Common/FilePathAutoRename.cpp \\\n ../../Common/FileStreams.cpp \\\n ../../Common/InBuffer.cpp \\\n ../../Common/FilterCoder.cpp \\\n ../../Common/LimitedStreams.cpp \\\n ../../Common/LockedStream.cpp \\\n ../../Common/OutBuffer.cpp \\\n ../../Common/ProgressUtils.cpp \\\n ../../Common/StreamBinder.cpp \\\n ../../Common/StreamObjects.cpp \\\n ../../Common/StreamUtils.cpp \\\n ../../Common/VirtThread.cpp \\\n \\\n ../../UI/Common/ArchiveExtractCallback.cpp \\\n ../../UI/Common/ArchiveOpenCallback.cpp \\\n ../../UI/Common/DefaultName.cpp \\\n ../../UI/Common/Extract.cpp \\\n ../../UI/Common/ExtractingFilePath.cpp \\\n ../../UI/Common/LoadCodecs.cpp \\\n ../../UI/Common/OpenArchive.cpp \\\n ../../UI/Common/PropIDUtils.cpp \\\n \\\n ../../Archive/Common/CoderMixer2.cpp \\\n ../../Archive/Common/CoderMixer2MT.cpp \\\n ../../Archive/Common/CrossThreadProgress.cpp \\\n ../../Archive/Common/OutStreamWithCRC.cpp \\\n \\\n ../../Archive/7z/7zDecode.cpp \\\n ../../Archive/7z/7zExtract.cpp \\\n ../../Archive/7z/7zFolderOutStream.cpp \\\n ../../Archive/7z/7zHandler.cpp \\\n ../../Archive/7z/7zHeader.cpp \\\n ../../Archive/7z/7zIn.cpp \\\n ../../Archive/7z/7zRegister.cpp \\\n \\\n ../../Compress/BranchCoder.cpp \\\n ../../Compress/Bcj2Coder.cpp \\\n ../../Compress/Bcj2Register.cpp \\\n ../../Compress/BcjCoder.cpp \\\n ../../Compress/BcjRegister.cpp \\\n ../../Compress/CopyCoder.cpp \\\n ../../Compress/CopyRegister.cpp \\\n ../../Compress/LzmaDecoder.cpp \\\n ../../Compress/LzmaRegister.cpp \\\n ../../Compress/PpmdDecoder.cpp \\\n ../../Compress/PpmdRegister.cpp \\\n \\\n ../../Crypto/7zAes.cpp \\\n ../../Crypto/7zAesRegister.cpp \\\n ../../Crypto/MyAes.cpp \\\n\nSRCS_C=\\\n ../../../../C/Bra86.c \\\n ../../../../C/LzmaDec.c \\\n ../../../../C/Threads.c \\\n ../../../../C/Aes.c \\\n ../../../../C/Sha256.c\n\ninclude ../../../../makefile.rules\n\nMain.o : Main.cpp\n\t$(CXX) $(CXXFLAGS) Main.cpp\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/CMAKE/CMakeLists_Alone.txt",
    "content": "cmake_minimum_required(VERSION 2.6)\n\nproject(p7zip)\n\nIF(HAVE_WCHAR_H)\n  OPTION(HAVE_UNICODE_WCHAR \"Enable Unicode Support\" YES)\n  MARK_AS_ADVANCED(HAVE_UNICODE_WCHAR)\nELSE(HAVE_WCHAR_H)\n  SET(HAVE_UNICODE_WCHAR 0)\nENDIF(HAVE_WCHAR_H)\n\nSET(HAVE_PTHREADS 0)\nFIND_PACKAGE(Threads)\nIF(WIN32 OR CMAKE_USE_PTHREADS_INIT)\n  SET(HAVE_PTHREADS 1)\nENDIF(WIN32 OR CMAKE_USE_PTHREADS_INIT)\n\ninclude_directories(\n\t../../../myWindows\n\t../../../\n\t../../../include_windows\n)\n\nadd_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DNDEBUG -D_REENTRANT -DENV_UNIX -DCOMPRESS_MT -DCOMPRESS_BZIP2_MT -DCOMPRESS_MF_MT -DBREAK_HANDLER -DBENCH_MT)  \n\nadd_executable(7za\n ../../../myWindows/myGetTickCount.cpp\n ../../../myWindows/wine_date_and_time.cpp\n ../../../myWindows/myAddExeFlag.cpp\n ../../../myWindows/mySplitCommandLine.cpp\n\n ../../UI/Console/ConsoleClose.cpp\n ../../UI/Console/ExtractCallbackConsole.cpp\n ../../UI/Console/List.cpp\n ../../UI/Console/Main.cpp\n ../../UI/Console/MainAr.cpp\n ../../UI/Console/OpenCallbackConsole.cpp\n ../../UI/Console/PercentPrinter.cpp\n ../../UI/Console/UpdateCallbackConsole.cpp\n ../../UI/Console/UserInputUtils.cpp\n\n ../../../Common/CommandLineParser.cpp\n ../../../Common/CRC.cpp\n ../../../Common/IntToString.cpp\n ../../../Common/ListFileUtils.cpp\n ../../../Common/StdInStream.cpp\n ../../../Common/StdOutStream.cpp\n ../../../Common/MyString.cpp\n ../../../Common/MyWindows.cpp\n ../../../Common/StringConvert.cpp\n ../../../Common/StringToInt.cpp\n ../../../Common/UTFConvert.cpp\n ../../../Common/MyVector.cpp\n ../../../Common/Wildcard.cpp\n\n ../../../Windows/Error.cpp\n ../../../Windows/FileDir.cpp\n ../../../Windows/FileFind.cpp\n ../../../Windows/FileIO.cpp\n ../../../Windows/FileName.cpp\n ../../../Windows/PropVariant.cpp\n ../../../Windows/PropVariantConversions.cpp\n ../../../Windows/Synchronization.cpp\n ../../../Windows/System.cpp\n ../../../Windows/Time.cpp\n\n ../../Common/CreateCoder.cpp\n ../../Common/FilePathAutoRename.cpp\n ../../Common/FileStreams.cpp\n ../../Common/FilterCoder.cpp\n ../../Common/InBuffer.cpp\n ../../Common/InOutTempBuffer.cpp\n ../../Common/LimitedStreams.cpp\n ../../Common/LockedStream.cpp\n ../../Common/MemBlocks.cpp\n ../../Common/MethodId.cpp\n ../../Common/MethodProps.cpp\n ../../Common/OffsetStream.cpp\n ../../Common/OutBuffer.cpp\n ../../Common/OutMemStream.cpp\n ../../Common/ProgressMt.cpp\n ../../Common/ProgressUtils.cpp\n ../../Common/StreamBinder.cpp\n ../../Common/StreamObjects.cpp\n ../../Common/StreamUtils.cpp\n ../../Common/VirtThread.cpp\n\n ../../UI/Common/ArchiveCommandLine.cpp\n ../../UI/Common/ArchiveExtractCallback.cpp\n ../../UI/Common/ArchiveOpenCallback.cpp\n ../../UI/Common/DefaultName.cpp\n ../../UI/Common/EnumDirItems.cpp\n ../../UI/Common/Extract.cpp\n ../../UI/Common/ExtractingFilePath.cpp\n ../../UI/Common/LoadCodecs.cpp\n ../../UI/Common/OpenArchive.cpp\n ../../UI/Common/PropIDUtils.cpp\n ../../UI/Common/SetProperties.cpp\n ../../UI/Common/SortUtils.cpp\n ../../UI/Common/TempFiles.cpp\n ../../UI/Common/Update.cpp\n ../../UI/Common/UpdateAction.cpp\n ../../UI/Common/UpdateCallback.cpp\n ../../UI/Common/UpdatePair.cpp\n ../../UI/Common/UpdateProduce.cpp\n\n ../../Archive/ZHandler.cpp\n\n ../../Archive/Common/CoderMixer2.cpp\n ../../Archive/Common/CoderMixer2MT.cpp\n ../../Archive/Common/CrossThreadProgress.cpp\n ../../Archive/Common/DummyOutStream.cpp\n ../../Archive/Common/FindSignature.cpp\n ../../Archive/Common/HandlerOut.cpp\n ../../Archive/Common/InStreamWithCRC.cpp\n ../../Archive/Common/ItemNameUtils.cpp\n ../../Archive/Common/MultiStream.cpp\n ../../Archive/Common/OutStreamWithCRC.cpp\n ../../Archive/Common/ParseProperties.cpp\n\n ../../Archive/7z/7zCompressionMode.cpp\n ../../Archive/7z/7zDecode.cpp\n ../../Archive/7z/7zEncode.cpp\n ../../Archive/7z/7zExtract.cpp\n ../../Archive/7z/7zFolderInStream.cpp\n ../../Archive/7z/7zFolderOutStream.cpp\n ../../Archive/7z/7zHandler.cpp\n ../../Archive/7z/7zHandlerOut.cpp\n ../../Archive/7z/7zHeader.cpp\n ../../Archive/7z/7zIn.cpp\n ../../Archive/7z/7zOut.cpp\n ../../Archive/7z/7zProperties.cpp\n ../../Archive/7z/7zSpecStream.cpp\n ../../Archive/7z/7zUpdate.cpp\n ../../Archive/7z/7zRegister.cpp\n\n ../../Archive/BZip2/BZip2Handler.cpp\n ../../Archive/BZip2/BZip2HandlerOut.cpp\n ../../Archive/BZip2/BZip2Update.cpp\n ../../Archive/BZip2/bz2Register.cpp\n\n ../../Archive/Cab/CabBlockInStream.cpp\n ../../Archive/Cab/CabHandler.cpp\n ../../Archive/Cab/CabHeader.cpp\n ../../Archive/Cab/CabIn.cpp\n ../../Archive/Cab/CabRegister.cpp\n\n ../../Archive/GZip/GZipHandler.cpp\n ../../Archive/GZip/GZipHandlerOut.cpp\n ../../Archive/GZip/GZipHeader.cpp\n ../../Archive/GZip/GZipIn.cpp\n ../../Archive/GZip/GZipOut.cpp\n ../../Archive/GZip/GZipRegister.cpp\n ../../Archive/GZip/GZipUpdate.cpp\n\n ../../Archive/Lzma/LzmaArcRegister.cpp\n ../../Archive/Lzma/LzmaFiltersDecode.cpp\n ../../Archive/Lzma/LzmaHandler.cpp\n ../../Archive/Lzma/LzmaIn.cpp\n\n ../../Archive/Split/SplitHandler.cpp\n ../../Archive/Split/SplitRegister.cpp\n\n ../../Archive/Tar/TarHandler.cpp\n ../../Archive/Tar/TarHandlerOut.cpp\n ../../Archive/Tar/TarHeader.cpp\n ../../Archive/Tar/TarIn.cpp\n ../../Archive/Tar/TarOut.cpp\n ../../Archive/Tar/TarRegister.cpp\n ../../Archive/Tar/TarUpdate.cpp\n\n ../../Archive/Zip/ZipAddCommon.cpp\n ../../Archive/Zip/ZipHandler.cpp\n ../../Archive/Zip/ZipHandlerOut.cpp\n ../../Archive/Zip/ZipHeader.cpp\n ../../Archive/Zip/ZipIn.cpp\n ../../Archive/Zip/ZipItem.cpp\n ../../Archive/Zip/ZipOut.cpp\n ../../Archive/Zip/ZipUpdate.cpp\n ../../Archive/Zip/ZipRegister.cpp\n\n ../../Compress/Bcj2Coder.cpp\n ../../Compress/Bcj2Register.cpp\n ../../Compress/BcjCoder.cpp\n ../../Compress/BcjRegister.cpp\n ../../Compress/BitlDecoder.cpp\n ../../Compress/BranchCoder.cpp\n ../../Compress/BranchMisc.cpp\n ../../Compress/BranchRegister.cpp\n ../../Compress/ByteSwap.cpp\n ../../Compress/ByteSwapRegister.cpp\n ../../Compress/BZip2Crc.cpp\n ../../Compress/BZip2Decoder.cpp\n ../../Compress/BZip2Encoder.cpp\n ../../Compress/BZip2Register.cpp\n ../../Compress/CopyCoder.cpp\n ../../Compress/CopyRegister.cpp\n ../../Compress/Deflate64Register.cpp\n ../../Compress/DeflateDecoder.cpp\n ../../Compress/DeflateEncoder.cpp\n ../../Compress/DeflateRegister.cpp\n ../../Compress/ImplodeDecoder.cpp\n ../../Compress/ImplodeHuffmanDecoder.cpp\n ../../Compress/LzmaDecoder.cpp\n ../../Compress/LzmaEncoder.cpp\n ../../Compress/LzmaRegister.cpp\n ../../Compress/LzOutWindow.cpp\n ../../Compress/Lzx86Converter.cpp\n ../../Compress/LzxDecoder.cpp\n ../../Compress/PpmdDecoder.cpp\n ../../Compress/PpmdEncoder.cpp\n ../../Compress/PpmdRegister.cpp\n ../../Compress/QuantumDecoder.cpp\n ../../Compress/ShrinkDecoder.cpp\n ../../Compress/ZDecoder.cpp\n ../../Compress/LZMA_Alone/LzmaBench.cpp\n ../../Compress/LZMA_Alone/LzmaBenchCon.cpp\n ../../Crypto/7zAes.cpp\n ../../Crypto/7zAesRegister.cpp\n ../../Crypto/HmacSha1.cpp\n ../../Crypto/MyAes.cpp\n ../../Crypto/Pbkdf2HmacSha1.cpp\n ../../Crypto/RandGen.cpp\n ../../Crypto/Sha1.cpp\n ../../Crypto/WzAes.cpp\n ../../Crypto/ZipCrypto.cpp\n ../../Crypto/ZipStrong.cpp\n ../../../../C/Bra.c\n ../../../../C/Bra86.c\n ../../../../C/BraIA64.c\n ../../../../C/BwtSort.c\n ../../../../C/HuffEnc.c\n ../../../../C/LzFind.c\n ../../../../C/LzFindMt.c\n ../../../../C/LzmaDec.c\n ../../../../C/LzmaEnc.c\n ../../../../C/Sort.c\n ../../../../C/Threads.c\n ../../../../C/Aes.c\n ../../../../C/Sha256.c\n ../../../../C/7zCrc.c\n\n )\n\nIF(HAVE_PTHREADS)\n  TARGET_LINK_LIBRARIES(7za ${CMAKE_THREAD_LIBS_INIT})\nENDIF(HAVE_PTHREADS)\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/CMAKE/generate.sh",
    "content": "\n#TARGET=\"Unix Makefiles\"\nTARGET=\"CodeBlocks - Unix Makefiles\"\n#TARGET=\"KDevelop3\"\n#TARGET=\"Eclipse CDT4 - Unix Makefiles\"\n\nrm -fr Alone\nmkdir Alone\ncd Alone\ncp ../CMakeLists_Alone.txt CMakeLists.txt\n\ncmake -G \"${TARGET}\" -DCMAKE_BUILD_TYPE=Debug \n#cmake -G \"${TARGET}\" -DCMAKE_BUILD_TYPE=Release \n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/CreateCoder.cpp",
    "content": "// CreateCoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CreateCoder.h\"\n\n#include \"../../Windows/PropVariant.h\"\n#include \"../../Windows/Defs.h\"\n#include \"FilterCoder.h\"\n#include \"RegisterCodec.h\"\n\nstatic const unsigned int kNumCodecsMax = 64;\nunsigned int g_NumCodecs = 0;\nconst CCodecInfo *g_Codecs[kNumCodecsMax];\nvoid RegisterCodec(const CCodecInfo *codecInfo)\n{\n  if (g_NumCodecs < kNumCodecsMax)\n    g_Codecs[g_NumCodecs++] = codecInfo;\n}\n\n#ifdef EXTERNAL_CODECS\nstatic HRESULT ReadNumberOfStreams(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, UInt32 &res)\n{\n  NWindows::NCOM::CPropVariant prop;\n  RINOK(codecsInfo->GetProperty(index, propID, &prop));\n  if (prop.vt == VT_EMPTY)\n    res = 1;\n  else if (prop.vt == VT_UI4)\n    res = prop.ulVal;\n  else\n    return E_INVALIDARG;\n  return S_OK;\n}\n\nstatic HRESULT ReadIsAssignedProp(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, bool &res)\n{\n  NWindows::NCOM::CPropVariant prop;\n  RINOK(codecsInfo->GetProperty(index, propID, &prop));\n  if (prop.vt == VT_EMPTY)\n    res = true;\n  else if (prop.vt == VT_BOOL)\n    res = VARIANT_BOOLToBool(prop.boolVal);\n  else\n    return E_INVALIDARG;\n  return S_OK;\n}\n\nHRESULT LoadExternalCodecs(ICompressCodecsInfo *codecsInfo, CObjectVector<CCodecInfoEx> &externalCodecs)\n{\n  UInt32 num;\n  RINOK(codecsInfo->GetNumberOfMethods(&num));\n  for (UInt32 i = 0; i < num; i++)\n  {\n    CCodecInfoEx info;\n    NWindows::NCOM::CPropVariant prop;\n    RINOK(codecsInfo->GetProperty(i, NMethodPropID::kID, &prop));\n    // if (prop.vt != VT_BSTR)\n    // info.Id.IDSize = (Byte)SysStringByteLen(prop.bstrVal);\n    // memmove(info.Id.ID, prop.bstrVal, info.Id.IDSize);\n    if (prop.vt != VT_UI8)\n    {\n      continue; // old Interface\n      // return E_INVALIDARG;\n    }\n    info.Id = prop.uhVal.QuadPart;\n    prop.Clear();\n    \n    RINOK(codecsInfo->GetProperty(i, NMethodPropID::kName, &prop));\n    if (prop.vt == VT_BSTR)\n      info.Name = prop.bstrVal;\n    else if (prop.vt != VT_EMPTY)\n      return E_INVALIDARG;;\n    \n    RINOK(ReadNumberOfStreams(codecsInfo, i, NMethodPropID::kInStreams, info.NumInStreams));\n    RINOK(ReadNumberOfStreams(codecsInfo, i, NMethodPropID::kOutStreams, info.NumOutStreams));\n    RINOK(ReadIsAssignedProp(codecsInfo, i, NMethodPropID::kEncoderIsAssigned, info.EncoderIsAssigned));\n    RINOK(ReadIsAssignedProp(codecsInfo, i, NMethodPropID::kDecoderIsAssigned, info.DecoderIsAssigned));\n    \n    externalCodecs.Add(info);\n  }\n  return S_OK;\n}\n\n#endif\n\nbool FindMethod(\n  #ifdef EXTERNAL_CODECS\n  ICompressCodecsInfo * /* codecsInfo */, const CObjectVector<CCodecInfoEx> *externalCodecs,\n  #endif\n  const UString &name,\n  CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams)\n{\n  UInt32 i;\n  for (i = 0; i < g_NumCodecs; i++)\n  {\n    const CCodecInfo &codec = *g_Codecs[i];\n    if (name.CompareNoCase(codec.Name) == 0)\n    {\n      methodId = codec.Id;\n      numInStreams = codec.NumInStreams;\n      numOutStreams = 1;\n      return true;\n    }\n  }\n  #ifdef EXTERNAL_CODECS\n  if (externalCodecs)\n    for (i = 0; i < (UInt32)externalCodecs->Size(); i++)\n    {\n      const CCodecInfoEx &codec = (*externalCodecs)[i];\n      if (codec.Name.CompareNoCase(name) == 0)\n      {\n        methodId = codec.Id;\n        numInStreams = codec.NumInStreams;\n        numOutStreams = codec.NumOutStreams;\n        return true;\n      }\n    }\n  #endif\n  return false;\n}\n\nbool FindMethod(\n  #ifdef EXTERNAL_CODECS\n  ICompressCodecsInfo * /* codecsInfo */, const CObjectVector<CCodecInfoEx> *externalCodecs,\n  #endif\n  CMethodId methodId, UString &name)\n{\n  UInt32 i;\n  for (i = 0; i < g_NumCodecs; i++)\n  {\n    const CCodecInfo &codec = *g_Codecs[i];\n    if (methodId == codec.Id)\n    {\n      name = codec.Name;\n      return true;\n    }\n  }\n  #ifdef EXTERNAL_CODECS\n  if (externalCodecs)\n    for (i = 0; i < (UInt32)externalCodecs->Size(); i++)\n    {\n      const CCodecInfoEx &codec = (*externalCodecs)[i];\n      if (methodId == codec.Id)\n      {\n        name = codec.Name;\n        return true;\n      }\n    }\n  #endif\n  return false;\n}\n\nHRESULT CreateCoder(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressFilter> &filter,\n  CMyComPtr<ICompressCoder> &coder,\n  CMyComPtr<ICompressCoder2> &coder2,\n  bool encode, bool onlyCoder)\n{\n  bool created = false;\n  UInt32 i;\n  for (i = 0; i < g_NumCodecs; i++)\n  {\n    const CCodecInfo &codec = *g_Codecs[i];\n    if (codec.Id == methodId)\n    {\n      if (encode)\n      {\n        if (codec.CreateEncoder)\n        {\n          void *p = codec.CreateEncoder();\n          if (codec.IsFilter) filter = (ICompressFilter *)p;\n          else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p;\n          else coder2 = (ICompressCoder2 *)p;\n          created = (p != 0);\n          break;\n        }\n      }\n      else\n        if (codec.CreateDecoder)\n        {\n          void *p = codec.CreateDecoder();\n          if (codec.IsFilter) filter = (ICompressFilter *)p;\n          else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p;\n          else coder2 = (ICompressCoder2 *)p;\n          created = (p != 0);\n          break;\n        }\n    }\n  }\n\n  #ifdef EXTERNAL_CODECS\n  if (!created && externalCodecs)\n    for (i = 0; i < (UInt32)externalCodecs->Size(); i++)\n    {\n      const CCodecInfoEx &codec = (*externalCodecs)[i];\n      if (codec.Id == methodId)\n      {\n        if (encode)\n        {\n          if (codec.EncoderIsAssigned)\n          {\n            if (codec.IsSimpleCodec())\n            {\n              HRESULT result = codecsInfo->CreateEncoder(i, &IID_ICompressCoder, (void **)&coder);\n              if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE)\n                return result;\n              if (!coder)\n              {\n                RINOK(codecsInfo->CreateEncoder(i, &IID_ICompressFilter, (void **)&filter));\n              }\n            }\n            else\n            {\n              RINOK(codecsInfo->CreateEncoder(i, &IID_ICompressCoder2, (void **)&coder2));\n            }\n            break;\n          }\n        }\n        else\n          if (codec.DecoderIsAssigned)\n          {\n            if (codec.IsSimpleCodec())\n            {\n              HRESULT result = codecsInfo->CreateDecoder(i, &IID_ICompressCoder, (void **)&coder);\n              if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE)\n                return result;\n              if (!coder)\n              {\n                RINOK(codecsInfo->CreateDecoder(i, &IID_ICompressFilter, (void **)&filter));\n              }\n            }\n            else\n            {\n              RINOK(codecsInfo->CreateDecoder(i, &IID_ICompressCoder2, (void **)&coder2));\n            }\n            break;\n          }\n      }\n    }\n  #endif\n\n  if (onlyCoder && filter)\n  {\n    CFilterCoder *coderSpec = new CFilterCoder;\n    coder = coderSpec;\n    coderSpec->Filter = filter;\n  }\n  return S_OK;\n}\n\nHRESULT CreateCoder(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressCoder> &coder,\n  CMyComPtr<ICompressCoder2> &coder2,\n  bool encode)\n{\n  CMyComPtr<ICompressFilter> filter;\n  return CreateCoder(\n    EXTERNAL_CODECS_LOC_VARS\n    methodId,\n    filter, coder, coder2, encode, true);\n}\n\nHRESULT CreateCoder(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressCoder> &coder, bool encode)\n{\n  CMyComPtr<ICompressFilter> filter;\n  CMyComPtr<ICompressCoder2> coder2;\n  return CreateCoder(\n    EXTERNAL_CODECS_LOC_VARS\n    methodId,\n    coder, coder2, encode);\n}\n\nHRESULT CreateFilter(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressFilter> &filter,\n  bool encode)\n{\n  CMyComPtr<ICompressCoder> coder;\n  CMyComPtr<ICompressCoder2> coder2;\n  return CreateCoder(\n    EXTERNAL_CODECS_LOC_VARS\n    methodId,\n    filter, coder, coder2, encode, false);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/CreateCoder.h",
    "content": "// CreateCoder.h\n\n#ifndef __CREATECODER_H\n#define __CREATECODER_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/MyString.h\"\n#include \"../ICoder.h\"\n\n#include \"MethodId.h\"\n\n#ifdef EXTERNAL_CODECS\n\nstruct CCodecInfoEx\n{\n  UString Name;\n  CMethodId Id;\n  UInt32 NumInStreams;\n  UInt32 NumOutStreams;\n  bool EncoderIsAssigned;\n  bool DecoderIsAssigned;\n  bool IsSimpleCodec() const { return NumOutStreams == 1 && NumInStreams == 1; }\n  CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {}\n};\n\nHRESULT LoadExternalCodecs(ICompressCodecsInfo *codecsInfo, CObjectVector<CCodecInfoEx> &externalCodecs);\n\n#define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo,\n#define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo)\n#define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo);\n#define IMPL_ISetCompressCodecsInfo2(x) \\\nSTDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \\\n  COM_TRY_BEGIN _codecsInfo = compressCodecsInfo;  return LoadExternalCodecs(_codecsInfo, _externalCodecs); COM_TRY_END }\n#define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler)\n\n#define EXTERNAL_CODECS_VARS2 _codecsInfo, &_externalCodecs\n\n#define DECL_EXTERNAL_CODECS_VARS CMyComPtr<ICompressCodecsInfo> _codecsInfo; CObjectVector<CCodecInfoEx> _externalCodecs;\n#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2,\n\n#define DECL_EXTERNAL_CODECS_LOC_VARS2 ICompressCodecsInfo *codecsInfo, const CObjectVector<CCodecInfoEx> *externalCodecs\n#define EXTERNAL_CODECS_LOC_VARS2 codecsInfo, externalCodecs\n\n#define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2,\n#define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2,\n\n#else\n\n#define PUBLIC_ISetCompressCodecsInfo\n#define QUERY_ENTRY_ISetCompressCodecsInfo\n#define DECL_ISetCompressCodecsInfo\n#define IMPL_ISetCompressCodecsInfo\n#define EXTERNAL_CODECS_VARS2\n#define DECL_EXTERNAL_CODECS_VARS\n#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2\n#define DECL_EXTERNAL_CODECS_LOC_VARS2\n#define EXTERNAL_CODECS_LOC_VARS2\n#define DECL_EXTERNAL_CODECS_LOC_VARS\n#define EXTERNAL_CODECS_LOC_VARS\n\n#endif\n\nbool FindMethod(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  const UString &name, CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams);\n\nbool FindMethod(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId, UString &name);\n\n\nHRESULT CreateCoder(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressFilter> &filter,\n  CMyComPtr<ICompressCoder> &coder,\n  CMyComPtr<ICompressCoder2> &coder2,\n  bool encode, bool onlyCoder);\n\nHRESULT CreateCoder(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressCoder> &coder,\n  CMyComPtr<ICompressCoder2> &coder2,\n  bool encode);\n\nHRESULT CreateCoder(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressCoder> &coder, bool encode);\n\nHRESULT CreateFilter(\n  DECL_EXTERNAL_CODECS_LOC_VARS\n  CMethodId methodId,\n  CMyComPtr<ICompressFilter> &filter,\n  bool encode);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/FilePathAutoRename.cpp",
    "content": "// FilePathAutoRename.cpp\n\n#include \"StdAfx.h\"\n#include \"FilePathAutoRename.h\"\n\n#include \"Common/Defs.h\"\n#include \"Common/IntToString.h\"\n\n#include \"Windows/FileName.h\"\n#include \"Windows/FileFind.h\"\n\nusing namespace NWindows;\n\nstatic bool MakeAutoName(const UString &name,\n    const UString &extension, int value, UString &path)\n{\n  wchar_t number[32];\n  ConvertUInt64ToString(value, number);\n  path = name;\n  path += number;\n  path += extension;\n  return NFile::NFind::DoesFileExist(path);\n}\n\nbool AutoRenamePath(UString &fullProcessedPath)\n{\n  UString path;\n  int dotPos = fullProcessedPath.ReverseFind(L'.');\n\n  int slashPos = fullProcessedPath.ReverseFind(L'/');\n  #ifdef _WIN32\n  int slash1Pos = fullProcessedPath.ReverseFind(L'\\\\');\n  slashPos = MyMax(slashPos, slash1Pos);\n  #endif\n\n  UString name, extension;\n  if (dotPos > slashPos &&  dotPos > 0)\n  {\n    name = fullProcessedPath.Left(dotPos);\n    extension = fullProcessedPath.Mid(dotPos);\n  }\n  else\n    name = fullProcessedPath;\n  name += L'_';\n  int indexLeft = 1, indexRight = (1 << 30);\n  while (indexLeft != indexRight)\n  {\n    int indexMid = (indexLeft + indexRight) / 2;\n    if (MakeAutoName(name, extension, indexMid, path))\n      indexLeft = indexMid + 1;\n    else\n      indexRight = indexMid;\n  }\n  if (MakeAutoName(name, extension, indexRight, fullProcessedPath))\n    return false;\n  return true;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/FilePathAutoRename.h",
    "content": "// Util/FilePathAutoRename.h\n\n#ifndef __FILEPATHAUTORENAME_H\n#define __FILEPATHAUTORENAME_H\n\n#include \"Common/MyString.h\"\n\nbool AutoRenamePath(UString &fullProcessedPath);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/FileStreams.cpp",
    "content": "// FileStreams.cpp\n\n#include \"StdAfx.h\"\n\n#ifndef _WIN32\n#include <fcntl.h>\n#include <unistd.h>\n#include <errno.h>\n#endif\n\n#include \"FileStreams.h\"\n\nstatic inline HRESULT ConvertBoolToHRESULT(bool result)\n{\n  #ifdef _WIN32\n  if (result)\n    return S_OK;\n  DWORD lastError = ::GetLastError();\n  if (lastError == 0)\n    return E_FAIL;\n  return HRESULT_FROM_WIN32(lastError);\n  #else\n  return result ? S_OK: E_FAIL;\n  #endif\n}\n\nbool CInFileStream::Open(LPCTSTR fileName)\n{\n#ifdef ENV_UNIX\n  return File.Open(fileName,_ignoreSymbolicLink);\n#else\n  return File.Open(fileName);\n#endif\n}\n\n#ifdef USE_WIN_FILE\n#ifndef _UNICODE\nbool CInFileStream::Open(LPCWSTR fileName)\n{\n#ifdef ENV_UNIX\n  return File.Open(fileName,_ignoreSymbolicLink);\n#else\n  return File.Open(fileName);\n#endif\n}\n#endif\n#endif\n\nbool CInFileStream::OpenShared(LPCTSTR fileName, bool shareForWrite)\n{\n#ifdef ENV_UNIX\n  return File.Open(fileName,_ignoreSymbolicLink);\n#else\n  return File.OpenShared(fileName, shareForWrite);\n#endif\n}\n\n#ifdef USE_WIN_FILE\n#ifndef _UNICODE\nbool CInFileStream::OpenShared(LPCWSTR fileName, bool shareForWrite)\n{\n  return File.OpenShared(fileName, shareForWrite);\n}\n#endif\n#endif\n\nSTDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  #ifdef USE_WIN_FILE\n  \n  UInt32 realProcessedSize;\n  bool result = File.ReadPart(data, size, realProcessedSize);\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return ConvertBoolToHRESULT(result);\n  \n  #else\n  \n  if(processedSize != NULL)\n    *processedSize = 0;\n  ssize_t res = File.Read(data, (size_t)size);\n  if (res == -1)\n    return E_FAIL;\n  if(processedSize != NULL)\n    *processedSize = (UInt32)res;\n  return S_OK;\n\n  #endif\n}\n\n#ifndef _WIN32_WCE\nSTDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  #ifdef _WIN32\n  UInt32 realProcessedSize;\n  BOOL res = ::ReadFile(GetStdHandle(STD_INPUT_HANDLE),\n      data, size, (DWORD *)&realProcessedSize, NULL);\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  if (res == FALSE && GetLastError() == ERROR_BROKEN_PIPE)\n    return S_OK;\n  return ConvertBoolToHRESULT(res != FALSE);\n  \n  #else\n\n  if(processedSize != NULL)\n    *processedSize = 0;\n  ssize_t res;\n  do\n  {\n    res = read(0, data, (size_t)size);\n  }\n  while (res < 0 && (errno == EINTR));\n  if (res == -1)\n    return E_FAIL;\n  if(processedSize != NULL)\n    *processedSize = (UInt32)res;\n  return S_OK;\n  \n  #endif\n}\n  \n#endif\n\nSTDMETHODIMP CInFileStream::Seek(Int64 offset, UInt32 seekOrigin,\n    UInt64 *newPosition)\n{\n  if(seekOrigin >= 3)\n    return STG_E_INVALIDFUNCTION;\n\n  #ifdef USE_WIN_FILE\n\n  UInt64 realNewPosition;\n  bool result = File.Seek(offset, seekOrigin, realNewPosition);\n  if(newPosition != NULL)\n    *newPosition = realNewPosition;\n  return ConvertBoolToHRESULT(result);\n  \n  #else\n  \n  off_t res = File.Seek(offset, seekOrigin);\n  if (res == -1)\n    return E_FAIL;\n  if(newPosition != NULL)\n    *newPosition = (UInt64)res;\n  return S_OK;\n  \n  #endif\n}\n\nSTDMETHODIMP CInFileStream::GetSize(UInt64 *size)\n{\n  return ConvertBoolToHRESULT(File.GetLength(*size));\n}\n\n\n//////////////////////////\n// COutFileStream\n\nHRESULT COutFileStream::Close()\n{\n  return ConvertBoolToHRESULT(File.Close());\n}\n\nSTDMETHODIMP COutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  #ifdef USE_WIN_FILE\n\n  UInt32 realProcessedSize;\n  bool result = File.WritePart(data, size, realProcessedSize);\n  ProcessedSize += realProcessedSize;\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return ConvertBoolToHRESULT(result);\n  \n  #else\n  \n  if(processedSize != NULL)\n    *processedSize = 0;\n  ssize_t res = File.Write(data, (size_t)size);\n  if (res == -1)\n    return E_FAIL;\n  if(processedSize != NULL)\n    *processedSize = (UInt32)res;\n  ProcessedSize += res;\n  return S_OK;\n  \n  #endif\n}\n  \nSTDMETHODIMP COutFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)\n{\n  if(seekOrigin >= 3)\n    return STG_E_INVALIDFUNCTION;\n  #ifdef USE_WIN_FILE\n\n  UInt64 realNewPosition;\n  bool result = File.Seek(offset, seekOrigin, realNewPosition);\n  if(newPosition != NULL)\n    *newPosition = realNewPosition;\n  return ConvertBoolToHRESULT(result);\n  \n  #else\n  \n  off_t res = File.Seek(offset, seekOrigin);\n  if (res == -1)\n    return E_FAIL;\n  if(newPosition != NULL)\n    *newPosition = (UInt64)res;\n  return S_OK;\n  \n  #endif\n}\n\nSTDMETHODIMP COutFileStream::SetSize(Int64 newSize)\n{\n  #ifdef USE_WIN_FILE\n  UInt64 currentPos;\n  if(!File.Seek(0, FILE_CURRENT, currentPos))\n    return E_FAIL;\n  bool result = File.SetLength(newSize);\n  UInt64 currentPos2;\n  result = result && File.Seek(currentPos, currentPos2);\n  return result ? S_OK : E_FAIL;\n  #else\n  return E_FAIL;\n  #endif\n}\n\n#ifndef _WIN32_WCE\nSTDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  if(processedSize != NULL)\n    *processedSize = 0;\n\n  #ifdef _WIN32\n  UInt32 realProcessedSize;\n  BOOL res = TRUE;\n  if (size > 0)\n  {\n    // Seems that Windows doesn't like big amounts writing to stdout.\n    // So we limit portions by 32KB.\n    UInt32 sizeTemp = (1 << 15);\n    if (sizeTemp > size)\n      sizeTemp = size;\n    res = ::WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),\n        data, sizeTemp, (DWORD *)&realProcessedSize, NULL);\n    size -= realProcessedSize;\n    data = (const void *)((const Byte *)data + realProcessedSize);\n    if(processedSize != NULL)\n      *processedSize += realProcessedSize;\n  }\n  return ConvertBoolToHRESULT(res != FALSE);\n\n  #else\n  \n  ssize_t res;\n  do\n  {\n    res = write(1, data, (size_t)size);\n  }\n  while (res < 0 && (errno == EINTR));\n  if (res == -1)\n    return E_FAIL;\n  if(processedSize != NULL)\n    *processedSize = (UInt32)res;\n  return S_OK;\n  \n  return S_OK;\n  #endif\n}\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/FileStreams.h",
    "content": "// FileStreams.h\n\n#ifndef __FILESTREAMS_H\n#define __FILESTREAMS_H\n\n#if defined(_WIN32) || defined(ENV_UNIX)\n#define USE_WIN_FILE\n#endif\n\n#ifdef USE_WIN_FILE\n#include \"../../Windows/FileIO.h\"\n#else\n#include \"../../Common/C_FileIO.h\"\n#endif\n\n#include \"../IStream.h\"\n#include \"../../Common/MyCom.h\"\n\nclass CInFileStream:\n  public IInStream,\n  public IStreamGetSize,\n  public CMyUnknownImp\n{\n  bool _ignoreSymbolicLink;\npublic:\n  #ifdef USE_WIN_FILE\n  NWindows::NFile::NIO::CInFile File;\n  #else\n  NC::NFile::NIO::CInFile File;\n  #endif\n  CInFileStream(bool b=false) { _ignoreSymbolicLink = b; }\n  virtual ~CInFileStream() {}\n\n  bool Open(LPCTSTR fileName);\n  #ifdef USE_WIN_FILE\n  #ifndef _UNICODE\n  bool Open(LPCWSTR fileName);\n  #endif\n  #endif\n\n  bool OpenShared(LPCTSTR fileName, bool shareForWrite);\n  #ifdef USE_WIN_FILE\n  #ifndef _UNICODE\n  bool OpenShared(LPCWSTR fileName, bool shareForWrite);\n  #endif\n  #endif\n\n  MY_UNKNOWN_IMP2(IInStream, IStreamGetSize)\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\n\n  STDMETHOD(GetSize)(UInt64 *size);\n};\n\n#ifndef _WIN32_WCE\nclass CStdInFileStream:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\npublic:\n  // HANDLE File;\n  // CStdInFileStream() File(INVALID_HANDLE_VALUE): {}\n  // void Open() { File = GetStdHandle(STD_INPUT_HANDLE); };\n  MY_UNKNOWN_IMP\n\n  virtual ~CStdInFileStream() {}\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n};\n#endif\n\nclass COutFileStream:\n  public IOutStream,\n  public CMyUnknownImp\n{\n  #ifdef USE_WIN_FILE\n  NWindows::NFile::NIO::COutFile File;\n  #else\n  NC::NFile::NIO::COutFile File;\n  #endif\npublic:\n  virtual ~COutFileStream() {}\n  bool Create(LPCTSTR fileName, bool createAlways)\n  {\n    ProcessedSize = 0;\n    return File.Create(fileName, createAlways);\n  }\n  bool Open(LPCTSTR fileName, DWORD creationDisposition)\n  {\n    ProcessedSize = 0;\n    return File.Open(fileName, creationDisposition);\n  }\n  #ifdef USE_WIN_FILE\n  #ifndef _UNICODE\n  bool Create(LPCWSTR fileName, bool createAlways)\n  {\n    ProcessedSize = 0;\n    return File.Create(fileName, createAlways);\n  }\n  bool Open(LPCWSTR fileName, DWORD creationDisposition)\n  {\n    ProcessedSize = 0;\n    return File.Open(fileName, creationDisposition);\n  }\n  #endif\n  #endif\n\n  HRESULT Close();\n  \n  UInt64 ProcessedSize;\n\n  #ifdef USE_WIN_FILE\n  bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)\n  {\n    return File.SetTime(cTime, aTime, mTime);\n  }\n  bool SetMTime(const FILETIME *mTime) {  return File.SetMTime(mTime); }\n  #endif\n\n\n  MY_UNKNOWN_IMP1(IOutStream)\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\n  STDMETHOD(SetSize)(Int64 newSize);\n};\n\n#ifndef _WIN32_WCE\nclass CStdOutFileStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  virtual ~CStdOutFileStream() {}\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/FilterCoder.cpp",
    "content": "// FilterCoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"FilterCoder.h\"\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n#include \"../../Common/Defs.h\"\n#include \"StreamUtils.h\"\n\nstatic const UInt32 kBufferSize = 1 << 17;\n\nCFilterCoder::CFilterCoder()\n{\n  _buffer = (Byte *)::MidAlloc(kBufferSize);\n}\n\nCFilterCoder::~CFilterCoder()\n{\n  ::MidFree(_buffer);\n}\n\nHRESULT CFilterCoder::WriteWithLimit(ISequentialOutStream *outStream, UInt32 size)\n{\n  if (_outSizeIsDefined)\n  {\n    UInt64 remSize = _outSize - _nowPos64;\n    if (size > remSize)\n      size = (UInt32)remSize;\n  }\n  RINOK(WriteStream(outStream, _buffer, size));\n  _nowPos64 += size;\n  return S_OK;\n}\n\n\nSTDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream,\n      ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 *outSize,\n      ICompressProgressInfo *progress)\n{\n  RINOK(Init());\n  UInt32 bufferPos = 0;\n  _outSizeIsDefined = (outSize != 0);\n  if (_outSizeIsDefined)\n    _outSize = *outSize;\n\n  while(NeedMore())\n  {\n    size_t processedSize = kBufferSize - bufferPos;\n    \n    // Change it: It can be optimized using ReadPart\n    RINOK(ReadStream(inStream, _buffer + bufferPos, &processedSize));\n    \n    UInt32 endPos = bufferPos + (UInt32)processedSize;\n\n    bufferPos = Filter->Filter(_buffer, endPos);\n    if (bufferPos > endPos)\n    {\n      for (; endPos< bufferPos; endPos++)\n        _buffer[endPos] = 0;\n      bufferPos = Filter->Filter(_buffer, endPos);\n    }\n\n    if (bufferPos == 0)\n    {\n      if (endPos > 0)\n        return WriteWithLimit(outStream, endPos);\n      return S_OK;\n    }\n    RINOK(WriteWithLimit(outStream, bufferPos));\n    if (progress != NULL)\n    {\n      RINOK(progress->SetRatioInfo(&_nowPos64, &_nowPos64));\n    }\n    UInt32 i = 0;\n    while(bufferPos < endPos)\n      _buffer[i++] = _buffer[bufferPos++];\n    bufferPos = i;\n  }\n  return S_OK;\n}\n\n// #ifdef _ST_MODE\nSTDMETHODIMP CFilterCoder::SetOutStream(ISequentialOutStream *outStream)\n{\n  _bufferPos = 0;\n  _outStream = outStream;\n  return Init();\n}\n\nSTDMETHODIMP CFilterCoder::ReleaseOutStream()\n{\n  _outStream.Release();\n  return S_OK;\n};\n\n\nSTDMETHODIMP CFilterCoder::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 processedSizeTotal = 0;\n  while(size > 0)\n  {\n    UInt32 sizeMax = kBufferSize - _bufferPos;\n    UInt32 sizeTemp = size;\n    if (sizeTemp > sizeMax)\n      sizeTemp = sizeMax;\n    memmove(_buffer + _bufferPos, data, sizeTemp);\n    size -= sizeTemp;\n    processedSizeTotal += sizeTemp;\n    data = (const Byte *)data + sizeTemp;\n    UInt32 endPos = _bufferPos + sizeTemp;\n    _bufferPos = Filter->Filter(_buffer, endPos);\n    if (_bufferPos == 0)\n    {\n      _bufferPos = endPos;\n      break;\n    }\n    if (_bufferPos > endPos)\n    {\n      if (size != 0)\n        return E_FAIL;\n      break;\n    }\n    RINOK(WriteWithLimit(_outStream, _bufferPos));\n    UInt32 i = 0;\n    while(_bufferPos < endPos)\n      _buffer[i++] = _buffer[_bufferPos++];\n    _bufferPos = i;\n  }\n  if (processedSize != NULL)\n    *processedSize = processedSizeTotal;\n  return S_OK;\n}\n\nSTDMETHODIMP CFilterCoder::Flush()\n{\n  if (_bufferPos != 0)\n  {\n    UInt32 endPos = Filter->Filter(_buffer, _bufferPos);\n    if (endPos > _bufferPos)\n    {\n      for (; _bufferPos < endPos; _bufferPos++)\n        _buffer[_bufferPos] = 0;\n      if (Filter->Filter(_buffer, endPos) != endPos)\n        return E_FAIL;\n    }\n    RINOK(WriteStream(_outStream, _buffer, _bufferPos));\n    _bufferPos = 0;\n  }\n  CMyComPtr<IOutStreamFlush> flush;\n  _outStream.QueryInterface(IID_IOutStreamFlush, &flush);\n  if (flush)\n    return  flush->Flush();\n  return S_OK;\n}\n\n\nSTDMETHODIMP CFilterCoder::SetInStream(ISequentialInStream *inStream)\n{\n  _convertedPosBegin = _convertedPosEnd = _bufferPos = 0;\n  _inStream = inStream;\n  return Init();\n}\n\nSTDMETHODIMP CFilterCoder::ReleaseInStream()\n{\n  _inStream.Release();\n  return S_OK;\n};\n\nSTDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 processedSizeTotal = 0;\n  while(size > 0)\n  {\n    if (_convertedPosBegin != _convertedPosEnd)\n    {\n      UInt32 sizeTemp = MyMin(size, _convertedPosEnd - _convertedPosBegin);\n      memmove(data, _buffer + _convertedPosBegin, sizeTemp);\n      _convertedPosBegin += sizeTemp;\n      data = (void *)((Byte *)data + sizeTemp);\n      size -= sizeTemp;\n      processedSizeTotal += sizeTemp;\n      break;\n    }\n    int i;\n    for (i = 0; _convertedPosEnd + i < _bufferPos; i++)\n      _buffer[i] = _buffer[i + _convertedPosEnd];\n    _bufferPos = i;\n    _convertedPosBegin = _convertedPosEnd = 0;\n    size_t processedSizeTemp = kBufferSize - _bufferPos;\n    RINOK(ReadStream(_inStream, _buffer + _bufferPos, &processedSizeTemp));\n    _bufferPos = _bufferPos + (UInt32)processedSizeTemp;\n    _convertedPosEnd = Filter->Filter(_buffer, _bufferPos);\n    if (_convertedPosEnd == 0)\n    {\n      if (_bufferPos == 0)\n        break;\n      else\n      {\n        _convertedPosEnd = _bufferPos; // check it\n        continue;\n      }\n    }\n    if (_convertedPosEnd > _bufferPos)\n    {\n      for (; _bufferPos < _convertedPosEnd; _bufferPos++)\n        _buffer[_bufferPos] = 0;\n      _convertedPosEnd = Filter->Filter(_buffer, _bufferPos);\n    }\n  }\n  if (processedSize != NULL)\n    *processedSize = processedSizeTotal;\n  return S_OK;\n}\n\n// #endif // _ST_MODE\n\n#ifndef _NO_CRYPTO\nSTDMETHODIMP CFilterCoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  return _setPassword->CryptoSetPassword(data, size);\n}\n#endif\n\n#ifndef EXTRACT_ONLY\nSTDMETHODIMP CFilterCoder::SetCoderProperties(const PROPID *propIDs,\n      const PROPVARIANT *properties, UInt32 numProperties)\n{\n  return _SetCoderProperties->SetCoderProperties(propIDs, properties, numProperties);\n}\n\nSTDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream)\n{\n  return _writeCoderProperties->WriteCoderProperties(outStream);\n}\n\n/*\nSTDMETHODIMP CFilterCoder::ResetSalt()\n{\n  return _CryptoResetSalt->ResetSalt();\n}\n*/\n\nSTDMETHODIMP CFilterCoder::ResetInitVector()\n{\n  return _CryptoResetInitVector->ResetInitVector();\n}\n#endif\n\nSTDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  return _setDecoderProperties->SetDecoderProperties2(data, size);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/FilterCoder.h",
    "content": "// FilterCoder.h\n\n#ifndef __FILTERCODER_H\n#define __FILTERCODER_H\n\n#include \"../../Common/MyCom.h\"\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\n#define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) if (iid == IID_ ## i) \\\n{ if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \\\n*outObject = (void *)(i *)this; AddRef(); return S_OK; }\n\nclass CFilterCoder:\n  public ICompressCoder,\n  // #ifdef _ST_MODE\n  public ICompressSetInStream,\n  public ISequentialInStream,\n  public ICompressSetOutStream,\n  public ISequentialOutStream,\n  public IOutStreamFlush,\n  // #endif\n\n  #ifndef _NO_CRYPTO\n  public ICryptoSetPassword,\n  #endif\n  #ifndef EXTRACT_ONLY\n  public ICompressSetCoderProperties,\n  public ICompressWriteCoderProperties,\n  // public ICryptoResetSalt,\n  public ICryptoResetInitVector,\n  #endif\n  public ICompressSetDecoderProperties2,\n  public CMyUnknownImp\n{\nprotected:\n  Byte *_buffer;\n  // #ifdef _ST_MODE\n  CMyComPtr<ISequentialInStream> _inStream;\n  CMyComPtr<ISequentialOutStream> _outStream;\n  UInt32 _bufferPos;\n  UInt32 _convertedPosBegin;\n  UInt32 _convertedPosEnd;\n  // #endif\n  bool _outSizeIsDefined;\n  UInt64 _outSize;\n  UInt64 _nowPos64;\n\n  HRESULT Init()\n  {\n    _nowPos64 = 0;\n    _outSizeIsDefined = false;\n    return Filter->Init();\n  }\n\n  CMyComPtr<ICryptoSetPassword> _setPassword;\n  #ifndef EXTRACT_ONLY\n  CMyComPtr<ICompressSetCoderProperties> _SetCoderProperties;\n  CMyComPtr<ICompressWriteCoderProperties> _writeCoderProperties;\n  // CMyComPtr<ICryptoResetSalt> _CryptoResetSalt;\n  CMyComPtr<ICryptoResetInitVector> _CryptoResetInitVector;\n  #endif\n  CMyComPtr<ICompressSetDecoderProperties2> _setDecoderProperties;\npublic:\n  CMyComPtr<ICompressFilter> Filter;\n\n  CFilterCoder();\n  ~CFilterCoder();\n  HRESULT WriteWithLimit(ISequentialOutStream *outStream, UInt32 size);\n  bool NeedMore() const\n    { return (!_outSizeIsDefined || (_nowPos64 < _outSize)); }\n\npublic:\n  MY_QUERYINTERFACE_BEGIN\n    MY_QUERYINTERFACE_ENTRY(ICompressCoder)\n    // #ifdef _ST_MODE\n    MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)\n    MY_QUERYINTERFACE_ENTRY(ISequentialInStream)\n\n    MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream)\n    MY_QUERYINTERFACE_ENTRY(ISequentialOutStream)\n    MY_QUERYINTERFACE_ENTRY(IOutStreamFlush)\n    // #endif\n\n    #ifndef _NO_CRYPTO\n    MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _setPassword)\n    #endif\n\n    #ifndef EXTRACT_ONLY\n    MY_QUERYINTERFACE_ENTRY_AG(ICompressSetCoderProperties, Filter, _SetCoderProperties)\n    MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties)\n    // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt)\n    MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector)\n    #endif\n\n    MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties)\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n  STDMETHOD(Code)(ISequentialInStream *inStream,\n      ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,\n      ICompressProgressInfo *progress);\n  // #ifdef _ST_MODE\n  STDMETHOD(ReleaseInStream)();\n  STDMETHOD(SetInStream)(ISequentialInStream *inStream);\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); \\\n  STDMETHOD(SetOutStream)(ISequentialOutStream *outStream);\n  STDMETHOD(ReleaseOutStream)();\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Flush)();\n  // #endif\n\n  #ifndef _NO_CRYPTO\n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);\n  #endif\n  #ifndef EXTRACT_ONLY\n  STDMETHOD(SetCoderProperties)(const PROPID *propIDs,\n      const PROPVARIANT *properties, UInt32 numProperties);\n  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);\n  // STDMETHOD(ResetSalt)();\n  STDMETHOD(ResetInitVector)();\n  #endif\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n};\n\n// #ifdef _ST_MODE\nclass CInStreamReleaser\n{\npublic:\n  CFilterCoder *FilterCoder;\n  CInStreamReleaser(): FilterCoder(0) {}\n  ~CInStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); }\n};\n\nclass COutStreamReleaser\n{\npublic:\n  CFilterCoder *FilterCoder;\n  COutStreamReleaser(): FilterCoder(0) {}\n  ~COutStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); }\n};\n// #endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/InBuffer.cpp",
    "content": "// InBuffer.cpp\n\n#include \"StdAfx.h\"\n\n#include \"InBuffer.h\"\n\nextern \"C\"\n{\n  #include \"../../../C/Alloc.h\"\n}\n\nCInBuffer::CInBuffer():\n  _buffer(0),\n  _bufferLimit(0),\n  _bufferBase(0),\n  _stream(0),\n  _bufferSize(0)\n{}\n\nbool CInBuffer::Create(UInt32 bufferSize)\n{\n  const UInt32 kMinBlockSize = 1;\n  if (bufferSize < kMinBlockSize)\n    bufferSize = kMinBlockSize;\n  if (_bufferBase != 0 && _bufferSize == bufferSize)\n    return true;\n  Free();\n  _bufferSize = bufferSize;\n  _bufferBase = (Byte *)::MidAlloc(bufferSize);\n  return (_bufferBase != 0);\n}\n\nvoid CInBuffer::Free()\n{\n  ::MidFree(_bufferBase);\n  _bufferBase = 0;\n}\n\nvoid CInBuffer::SetStream(ISequentialInStream *stream)\n{\n  _stream = stream;\n}\n\nvoid CInBuffer::Init()\n{\n  _processedSize = 0;\n  _buffer = _bufferBase;\n  _bufferLimit = _buffer;\n  _wasFinished = false;\n  #ifdef _NO_EXCEPTIONS\n  ErrorCode = S_OK;\n  #endif\n}\n\nbool CInBuffer::ReadBlock()\n{\n  #ifdef _NO_EXCEPTIONS\n  if (ErrorCode != S_OK)\n    return false;\n  #endif\n  if (_wasFinished)\n    return false;\n  _processedSize += (_buffer - _bufferBase);\n  UInt32 numProcessedBytes;\n  HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes);\n  #ifdef _NO_EXCEPTIONS\n  ErrorCode = result;\n  #else\n  if (result != S_OK)\n    return false;\n  #endif\n  _buffer = _bufferBase;\n  _bufferLimit = _buffer + numProcessedBytes;\n  _wasFinished = (numProcessedBytes == 0);\n  return (!_wasFinished);\n}\n\nByte CInBuffer::ReadBlock2()\n{\n  if(!ReadBlock())\n    return 0xFF;\n  return *_buffer++;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/InBuffer.h",
    "content": "// InBuffer.h\n\n#ifndef __INBUFFER_H\n#define __INBUFFER_H\n\n#include \"../IStream.h\"\n#include \"../../Common/MyCom.h\"\n#include \"../../Common/MyException.h\"\n\n#ifndef _NO_EXCEPTIONS\nstruct CInBufferException: public CSystemException\n{\n  CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}\n};\n#endif\n\nclass CInBuffer\n{\n  Byte *_buffer;\n  Byte *_bufferLimit;\n  Byte *_bufferBase;\n  CMyComPtr<ISequentialInStream> _stream;\n  UInt64 _processedSize;\n  UInt32 _bufferSize;\n  bool _wasFinished;\n\n  bool ReadBlock();\n  Byte ReadBlock2();\n\npublic:\n  #ifdef _NO_EXCEPTIONS\n  HRESULT ErrorCode;\n  #endif\n\n  CInBuffer();\n  ~CInBuffer() { Free(); }\n\n  bool Create(UInt32 bufferSize);\n  void Free();\n  \n  void SetStream(ISequentialInStream *stream);\n  void Init();\n  void ReleaseStream() { _stream.Release(); }\n\n  bool ReadByte(Byte &b)\n  {\n    if (_buffer >= _bufferLimit)\n      if (!ReadBlock())\n        return false;\n    b = *_buffer++;\n    return true;\n  }\n  Byte ReadByte()\n  {\n    if (_buffer >= _bufferLimit)\n      return ReadBlock2();\n    return *_buffer++;\n  }\n  UInt32 ReadBytes(Byte *buf, UInt32 size)\n  {\n    if ((UInt32)(_bufferLimit - _buffer) >= size)\n    {\n      for (UInt32 i = 0; i < size; i++)\n        buf[i] = _buffer[i];\n      _buffer += size;\n      return size;\n    }\n    for (UInt32 i = 0; i < size; i++)\n    {\n      if (_buffer >= _bufferLimit)\n        if (!ReadBlock())\n          return i;\n      buf[i] = *_buffer++;\n    }\n    return size;\n  }\n  UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); }\n  bool WasFinished() const { return _wasFinished; }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/InOutTempBuffer.cpp",
    "content": "// InOutTempBuffer.cpp\n\n#include \"StdAfx.h\"\n\n#include \"InOutTempBuffer.h\"\n#include \"../../Common/Defs.h\"\n// #include \"Windows/Defs.h\"\n\n#include \"StreamUtils.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NDirectory;\n\nstatic UInt32 kTmpBufferMemorySize = (1 << 20);\n\nstatic LPCTSTR kTempFilePrefixString = TEXT(\"iot\");\n\nCInOutTempBuffer::CInOutTempBuffer():\n  _buffer(NULL)\n{\n}\n\nvoid CInOutTempBuffer::Create()\n{\n  _buffer = new Byte[kTmpBufferMemorySize];\n}\n\nCInOutTempBuffer::~CInOutTempBuffer()\n{\n  delete []_buffer;\n}\nvoid CInOutTempBuffer::InitWriting()\n{\n  _bufferPosition = 0;\n  _tmpFileCreated = false;\n  _fileSize = 0;\n}\n\nbool CInOutTempBuffer::WriteToFile(const void *data, UInt32 size)\n{\n  if (size == 0)\n    return true;\n  if(!_tmpFileCreated)\n  {\n    CSysString tempDirPath;\n    if(!MyGetTempPath(tempDirPath))\n      return false;\n    if (_tempFile.Create(tempDirPath, kTempFilePrefixString, _tmpFileName) == 0)\n      return false;\n    // _outFile.SetOpenCreationDispositionCreateAlways();\n    if(!_outFile.Create(_tmpFileName, true))\n      return false;\n    _tmpFileCreated = true;\n  }\n  UInt32 processedSize;\n  if(!_outFile.Write(data, size, processedSize))\n    return false;\n  _fileSize += processedSize;\n  return (processedSize == size);\n}\n\nbool CInOutTempBuffer::FlushWrite()\n{\n  return _outFile.Close();\n}\n\nbool CInOutTempBuffer::Write(const void *data, UInt32 size)\n{\n  if(_bufferPosition < kTmpBufferMemorySize)\n  {\n    UInt32 curSize = MyMin(kTmpBufferMemorySize - _bufferPosition, size);\n    memmove(_buffer + _bufferPosition, (const Byte *)data, curSize);\n    _bufferPosition += curSize;\n    size -= curSize;\n    data = ((const Byte *)data) + curSize;\n    _fileSize += curSize;\n  }\n  return WriteToFile(data, size);\n}\n\nbool CInOutTempBuffer::InitReading()\n{\n  _currentPositionInBuffer = 0;\n  if(_tmpFileCreated)\n    return _inFile.Open(_tmpFileName);\n  return true;\n}\n\nHRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream)\n{\n  if (_currentPositionInBuffer < _bufferPosition)\n  {\n    UInt32 sizeToWrite = _bufferPosition - _currentPositionInBuffer;\n    RINOK(WriteStream(stream, _buffer + _currentPositionInBuffer, sizeToWrite));\n    _currentPositionInBuffer += sizeToWrite;\n  }\n  if (!_tmpFileCreated)\n    return true;\n  for (;;)\n  {\n    UInt32 localProcessedSize;\n    if (!_inFile.ReadPart(_buffer, kTmpBufferMemorySize, localProcessedSize))\n      return E_FAIL;\n    if (localProcessedSize == 0)\n      return S_OK;\n    RINOK(WriteStream(stream, _buffer, localProcessedSize));\n  }\n}\n\nSTDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  if (!_buffer->Write(data, size))\n  {\n    if (processedSize != NULL)\n      *processedSize = 0;\n    return E_FAIL;\n  }\n  if (processedSize != NULL)\n    *processedSize = size;\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/InOutTempBuffer.h",
    "content": "// Util/InOutTempBuffer.h\n\n#ifndef __IN_OUT_TEMP_BUFFER_H\n#define __IN_OUT_TEMP_BUFFER_H\n\n#include \"../../Windows/FileIO.h\"\n#include \"../../Windows/FileDir.h\"\n#include \"../../Common/MyCom.h\"\n\n#include \"../IStream.h\"\n\nclass CInOutTempBuffer\n{\n  NWindows::NFile::NDirectory::CTempFile _tempFile;\n  NWindows::NFile::NIO::COutFile _outFile;\n  NWindows::NFile::NIO::CInFile _inFile;\n  Byte *_buffer;\n  UInt32 _bufferPosition;\n  UInt32 _currentPositionInBuffer;\n  CSysString _tmpFileName;\n  bool _tmpFileCreated;\n\n  UInt64 _fileSize;\n\n  bool WriteToFile(const void *data, UInt32 size);\npublic:\n  CInOutTempBuffer();\n  ~CInOutTempBuffer();\n  void Create();\n\n  void InitWriting();\n  bool Write(const void *data, UInt32 size);\n  UInt64 GetDataSize() const { return _fileSize; }\n  bool FlushWrite();\n  bool InitReading();\n  HRESULT WriteToStream(ISequentialOutStream *stream);\n};\n\nclass CSequentialOutTempBufferImp:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CInOutTempBuffer *_buffer;\npublic:\n  // CSequentialOutStreamImp(): _size(0) {}\n  // UInt32 _size;\n  void Init(CInOutTempBuffer *buffer)  { _buffer = buffer; }\n  // UInt32 GetSize() const { return _size; }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/LimitedStreams.cpp",
    "content": "// LimitedStreams.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LimitedStreams.h\"\n#include \"../../Common/Defs.h\"\n\nSTDMETHODIMP CLimitedSequentialInStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize = 0;\n  UInt32 sizeToRead = (UInt32)MyMin((_size - _pos), (UInt64)size);\n  HRESULT result = S_OK;\n  if (sizeToRead > 0)\n  {\n    result = _stream->Read(data, sizeToRead, &realProcessedSize);\n    _pos += realProcessedSize;\n    if (realProcessedSize == 0)\n      _wasFinished = true;\n  }\n  if(processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n\nSTDMETHODIMP CLimitedSequentialOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  HRESULT result = S_OK;\n  if (processedSize != NULL)\n    *processedSize = 0;\n  if (size > _size)\n  {\n    size = (UInt32)_size;\n    if (size == 0)\n    {\n      _overflow = true;\n      return E_FAIL;\n    }\n  }\n  if (_stream)\n    result = _stream->Write(data, size, &size);\n  _size -= size;\n  if (processedSize != NULL)\n    *processedSize = size;\n  return result;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/LimitedStreams.h",
    "content": "// LimitedStreams.h\n\n#ifndef __LIMITEDSTREAMS_H\n#define __LIMITEDSTREAMS_H\n\n#include \"../../Common/MyCom.h\"\n#include \"../IStream.h\"\n\nclass CLimitedSequentialInStream:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialInStream> _stream;\n  UInt64 _size;\n  UInt64 _pos;\n  bool _wasFinished;\npublic:\n  void SetStream(ISequentialInStream *stream) { _stream = stream; }\n  void Init(UInt64 streamSize)\n  {\n    _size = streamSize;\n    _pos = 0;\n    _wasFinished = false;\n  }\n \n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  UInt64 GetSize() const { return _pos; }\n  bool WasFinished() const { return _wasFinished; }\n};\n\nclass CLimitedSequentialOutStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialOutStream> _stream;\n  UInt64 _size;\n  bool _overflow;\npublic:\n  MY_UNKNOWN_IMP\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  void SetStream(ISequentialOutStream *stream) { _stream = stream; }\n  void ReleaseStream() { _stream.Release(); }\n  void Init(UInt64 size)\n  {\n    _size = size;\n    _overflow = false;\n  }\n  bool IsFinishedOK() const { return (_size == 0 && !_overflow); }\n  UInt64 GetRem() const { return _size; }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/LockedStream.cpp",
    "content": "// LockedStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LockedStream.h\"\n\nHRESULT CLockedInStream::Read(UInt64 startPos, void *data, UInt32 size,\n  UInt32 *processedSize)\n{\n  NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n  RINOK(_stream->Seek(startPos, STREAM_SEEK_SET, NULL));\n  return _stream->Read(data, size, processedSize);\n}\n\nSTDMETHODIMP CLockedSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize = 0;\n  HRESULT result = _lockedInStream->Read(_pos, data, size, &realProcessedSize);\n  _pos += realProcessedSize;\n  if (processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return result;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/LockedStream.h",
    "content": "// LockedStream.h\n\n#ifndef __LOCKEDSTREAM_H\n#define __LOCKEDSTREAM_H\n\n#include \"../../Windows/Synchronization.h\"\n#include \"../../Common/MyCom.h\"\n#include \"../IStream.h\"\n\nclass CLockedInStream\n{\n  CMyComPtr<IInStream> _stream;\n  NWindows::NSynchronization::CCriticalSection _criticalSection;\npublic:\n  void Init(IInStream *stream)\n    { _stream = stream; }\n  HRESULT Read(UInt64 startPos, void *data, UInt32 size, UInt32 *processedSize);\n};\n\nclass CLockedSequentialInStreamImp:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\n  CLockedInStream *_lockedInStream;\n  UInt64 _pos;\npublic:\n  void Init(CLockedInStream *lockedInStream, UInt64 startPos)\n  {\n    _lockedInStream = lockedInStream;\n    _pos = startPos;\n  }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MSBFDecoder.h",
    "content": "// MSBFDecoder.h\n// the Most Significant Bit of byte is First\n\n#ifndef __STREAM_MSBFDECODER_H\n#define __STREAM_MSBFDECODER_H\n\n#include \"../../Common/Types.h\"\n#include \"../IStream.h\"\n\nnamespace NStream {\nnamespace NMSBF {\n\nconst int kNumBigValueBits = 8 * 4;\nconst int kNumValueBytes = 3;\nconst int kNumValueBits = 8  * kNumValueBytes;\n\nconst UInt32 kMask = (1 << kNumValueBits) - 1;\n\ntemplate<class TInByte>\nclass CDecoder\n{\n  UInt32 m_BitPos;\n  UInt32 m_Value;\npublic:\n  TInByte m_Stream;\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}\n  void ReleaseStream() { m_Stream.ReleaseStream();}\n\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = kNumBigValueBits;\n    Normalize();\n  }\n  \n  UInt64 GetProcessedSize() const\n    { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }\n  UInt32 GetBitPosition() const { return (m_BitPos & 7); }\n  \n  void Normalize()\n  {\n    for (;m_BitPos >= 8; m_BitPos -= 8)\n      m_Value = (m_Value << 8) | m_Stream.ReadByte();\n  }\n\n  UInt32 GetValue(UInt32 numBits) const\n  {\n    // return (m_Value << m_BitPos) >> (kNumBigValueBits - numBits);\n    return ((m_Value >> (8 - m_BitPos)) & kMask) >> (kNumValueBits - numBits);\n  }\n  \n  void MovePos(UInt32 numBits)\n  {\n    m_BitPos += numBits;\n    Normalize();\n  }\n  \n  UInt32 ReadBits(UInt32 numBits)\n  {\n    UInt32 res = GetValue(numBits);\n    MovePos(numBits);\n    return res;\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MSBFEncoder.h",
    "content": "// Stream/MSBFEncoder.h\n\n#ifndef __STREAM_MSBFENCODER_H\n#define __STREAM_MSBFENCODER_H\n\n#include \"Common/Defs.h\"\n#include \"../IStream.h\"\n#include \"OutBuffer.h\"\n\nnamespace NStream {\nnamespace NMSBF {\n\ntemplate<class TOutByte>\nclass CEncoder\n{\n  TOutByte m_Stream;\n  int m_BitPos;\n  Byte m_CurByte;\npublic:\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream);}\n  void ReleaseStream() { m_Stream.ReleaseStream(); }\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = 8;\n    m_CurByte = 0;\n  }\n  HRESULT Flush()\n  {\n    if(m_BitPos < 8)\n      WriteBits(0, m_BitPos);\n    return m_Stream.Flush();\n  }\n\n  void WriteBits(UInt32 value, int numBits)\n  {\n    while(numBits > 0)\n    {\n      if (numBits < m_BitPos)\n      {\n        m_CurByte |= ((Byte)value << (m_BitPos -= numBits));\n        return;\n      }\n      numBits -= m_BitPos;\n      UInt32 newBits = (value >> numBits);\n      value -= (newBits << numBits);\n      m_Stream.WriteByte((Byte)(m_CurByte | newBits));\n      m_BitPos = 8;\n      m_CurByte = 0;\n    }\n  }\n  UInt64 GetProcessedSize() const {\n      return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) / 8; }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MemBlocks.cpp",
    "content": "// MemBlocks.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/MyCom.h\"\n\n#include \"StreamUtils.h\"\n#include \"MemBlocks.h\"\n\nbool CMemBlockManager::AllocateSpace(size_t numBlocks)\n{\n  FreeSpace();\n  if (_blockSize < sizeof(void *) || numBlocks < 1)\n    return false;\n  size_t totalSize = numBlocks * _blockSize;\n  if (totalSize / _blockSize != numBlocks)\n    return false;\n  _data = ::MidAlloc(totalSize);\n  if (_data == 0)\n    return false;\n  Byte *p = (Byte *)_data;\n  for (size_t i = 0; i + 1 < numBlocks; i++, p += _blockSize)\n    *(Byte **)p = (p + _blockSize);\n  *(Byte **)p = 0;\n  _headFree = _data;\n  return true;\n}\n\nvoid CMemBlockManager::FreeSpace()\n{\n  ::MidFree(_data);\n  _data = 0;\n  _headFree= 0;\n}\n\nvoid *CMemBlockManager::AllocateBlock()\n{\n  if (_headFree == 0)\n    return 0;\n  void *p = _headFree;\n  _headFree = *(void **)_headFree;\n  return p;\n}\n\nvoid CMemBlockManager::FreeBlock(void *p)\n{\n  if (p == 0)\n    return;\n  *(void **)p = _headFree;\n  _headFree = p;\n}\n\n\nHRes CMemBlockManagerMt::AllocateSpace(NWindows::NSynchronization::CSynchro *sync,size_t numBlocks, size_t numNoLockBlocks)\n{\n  if (numNoLockBlocks > numBlocks)\n    return E_INVALIDARG;\n  if (!CMemBlockManager::AllocateSpace(numBlocks))\n    return E_OUTOFMEMORY;\n  size_t numLockBlocks = numBlocks - numNoLockBlocks;\n  Semaphore.Close();\n  return Semaphore.Create(sync,(LONG)numLockBlocks, (LONG)numLockBlocks);\n}\n\nHRes CMemBlockManagerMt::AllocateSpaceAlways(NWindows::NSynchronization::CSynchro *sync,size_t desiredNumberOfBlocks, size_t numNoLockBlocks)\n{\n  if (numNoLockBlocks > desiredNumberOfBlocks)\n    return E_INVALIDARG;\n  for (;;)\n  {\n    if (AllocateSpace(sync,desiredNumberOfBlocks, numNoLockBlocks) == 0)\n      return 0;\n    if (desiredNumberOfBlocks == numNoLockBlocks)\n      return E_OUTOFMEMORY;\n    desiredNumberOfBlocks = numNoLockBlocks + ((desiredNumberOfBlocks - numNoLockBlocks) >> 1);\n  }\n}\n\nvoid CMemBlockManagerMt::FreeSpace()\n{\n  Semaphore.Close();\n  CMemBlockManager::FreeSpace();\n}\n\nvoid *CMemBlockManagerMt::AllocateBlock()\n{\n  // Semaphore.Lock();\n  NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n  return CMemBlockManager::AllocateBlock();\n}\n\nvoid CMemBlockManagerMt::FreeBlock(void *p, bool lockMode)\n{\n  if (p == 0)\n    return;\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    CMemBlockManager::FreeBlock(p);\n  }\n  if (lockMode)\n    Semaphore.Release();\n}\n\nvoid CMemBlocks::Free(CMemBlockManagerMt *manager)\n{\n  while(Blocks.Size() > 0)\n  {\n    manager->FreeBlock(Blocks.Back());\n    Blocks.DeleteBack();\n  }\n  TotalSize = 0;\n}\n\nvoid CMemBlocks::FreeOpt(CMemBlockManagerMt *manager)\n{\n  Free(manager);\n  Blocks.ClearAndFree();\n}\n\nHRESULT CMemBlocks::WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const\n{\n  UInt64 totalSize = TotalSize;\n  for (int blockIndex = 0; totalSize > 0; blockIndex++)\n  {\n    UInt32 curSize = (UInt32)blockSize;\n    if (totalSize < curSize)\n      curSize = (UInt32)totalSize;\n    if (blockIndex >= Blocks.Size())\n      return E_FAIL;\n    RINOK(WriteStream(outStream, Blocks[blockIndex], curSize));\n    totalSize -= curSize;\n  }\n  return S_OK;\n}\n\n\nvoid CMemLockBlocks::FreeBlock(int index, CMemBlockManagerMt *memManager)\n{\n  memManager->FreeBlock(Blocks[index], LockMode);\n  Blocks[index] = 0;\n}\n\nvoid CMemLockBlocks::Free(CMemBlockManagerMt *memManager)\n{\n  while (Blocks.Size() > 0)\n  {\n    FreeBlock(Blocks.Size() - 1, memManager);\n    Blocks.DeleteBack();\n  }\n  TotalSize = 0;\n}\n\nHRes CMemLockBlocks::SwitchToNoLockMode(CMemBlockManagerMt *memManager)\n{\n  if (LockMode)\n  {\n    if (Blocks.Size() > 0)\n    {\n      RINOK(memManager->ReleaseLockedBlocks(Blocks.Size()));\n    }\n    LockMode = false;\n  }\n  return 0;\n}\n\nvoid CMemLockBlocks::Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager)\n{\n  blocks.Free(memManager);\n  blocks.LockMode = LockMode;\n  UInt64 totalSize = 0;\n  size_t blockSize = memManager->GetBlockSize();\n  for (int i = 0; i < Blocks.Size(); i++)\n  {\n    if (totalSize < TotalSize)\n      blocks.Blocks.Add(Blocks[i]);\n    else\n      FreeBlock(i, memManager);\n    Blocks[i] = 0;\n    totalSize += blockSize;\n  }\n  blocks.TotalSize = TotalSize;\n  Free(memManager);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MemBlocks.h",
    "content": "// MemBlocks.h\n\n#ifndef __MEMBLOCKS_H\n#define __MEMBLOCKS_H\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"Common/Types.h\"\n#include \"Common/MyVector.h\"\n\n#include \"Windows/Synchronization.h\"\n\n#include \"../IStream.h\"\n\nclass CMemBlockManager\n{\n  void *_data;\n  size_t _blockSize;\n  void *_headFree;\npublic:\n  CMemBlockManager(size_t blockSize = (1 << 20)): _data(0), _blockSize(blockSize), _headFree(0) {}\n  ~CMemBlockManager() { FreeSpace(); }\n\n  bool AllocateSpace(size_t numBlocks);\n  void FreeSpace();\n  size_t GetBlockSize() const { return _blockSize; }\n  void *AllocateBlock();\n  void FreeBlock(void *p);\n};\n\n\nclass CMemBlockManagerMt: public CMemBlockManager\n{\n  NWindows::NSynchronization::CCriticalSection _criticalSection;\npublic:\n  NWindows::NSynchronization::CSemaphoreWFMO Semaphore;\n\n  CMemBlockManagerMt(size_t blockSize = (1 << 20)): CMemBlockManager(blockSize) {}\n  ~CMemBlockManagerMt() { FreeSpace(); }\n\n  HRes AllocateSpace(NWindows::NSynchronization::CSynchro *sync, size_t numBlocks, size_t numNoLockBlocks = 0);\n  HRes AllocateSpaceAlways(NWindows::NSynchronization::CSynchro *sync, size_t desiredNumberOfBlocks, size_t numNoLockBlocks = 0);\n  void FreeSpace();\n  void *AllocateBlock();\n  void FreeBlock(void *p, bool lockMode = true);\n  HRes ReleaseLockedBlocks(int number) { return Semaphore.Release(number); }\n};\n\n\nclass CMemBlocks\n{\n  void Free(CMemBlockManagerMt *manager);\npublic:\n  CRecordVector<void *> Blocks;\n  UInt64 TotalSize;\n  \n  CMemBlocks(): TotalSize(0) {}\n\n  void FreeOpt(CMemBlockManagerMt *manager);\n  HRESULT WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const;\n};\n\nstruct CMemLockBlocks: public CMemBlocks\n{\n  bool LockMode;\n\n  CMemLockBlocks(): LockMode(true) {};\n  void Free(CMemBlockManagerMt *memManager);\n  void FreeBlock(int index, CMemBlockManagerMt *memManager);\n  HRes SwitchToNoLockMode(CMemBlockManagerMt *memManager);\n  void Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MethodId.cpp",
    "content": "// MethodId.cpp\n\n#include \"StdAfx.h\"\n\n#include \"MethodId.h\"\n#include \"../../Common/MyString.h\"\n\nstatic inline wchar_t GetHex(Byte value)\n{\n  return (wchar_t)((value < 10) ? ('0' + value) : ('A' + (value - 10)));\n}\n\nUString ConvertMethodIdToString(UInt64 id)\n{\n  wchar_t s[32];\n  int len = 32;\n  s[--len] = 0;\n  do\n  {\n    s[--len] = GetHex((Byte)id & 0xF);\n    id >>= 4;\n    s[--len] = GetHex((Byte)id & 0xF);\n    id >>= 4;\n  }\n  while (id != 0);\n  return s + len;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MethodId.h",
    "content": "// MethodId.h\n\n#ifndef __7Z_METHOD_ID_H\n#define __7Z_METHOD_ID_H\n\n#include \"../../Common/Types.h\"\n\ntypedef UInt64 CMethodId;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MethodProps.cpp",
    "content": "// MethodProps.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"MethodProps.h\"\n\nstatic UInt64 k_LZMA = 0x030101;\n// static UInt64 k_LZMA2 = 0x030102;\n\nHRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder)\n{\n  bool tryReduce = false;\n  UInt32 reducedDictionarySize = 1 << 10;\n  if (inSizeForReduce != 0 && (method.Id == k_LZMA /* || methodFull.MethodID == k_LZMA2 */))\n  {\n    for (;;)\n    {\n      const UInt32 step = (reducedDictionarySize >> 1);\n      if (reducedDictionarySize >= *inSizeForReduce)\n      {\n        tryReduce = true;\n        break;\n      }\n      reducedDictionarySize += step;\n      if (reducedDictionarySize >= *inSizeForReduce)\n      {\n        tryReduce = true;\n        break;\n      }\n      if (reducedDictionarySize >= ((UInt32)3 << 30))\n        break;\n      reducedDictionarySize += step;\n    }\n  }\n\n  {\n    int numProps = method.Props.Size();\n    CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n    coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties);\n    if (setCoderProperties == NULL)\n    {\n      if (numProps != 0)\n        return E_INVALIDARG;\n    }\n    else\n    {\n      CRecordVector<PROPID> propIDs;\n      NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[numProps];\n      HRESULT res = S_OK;\n\n        for (int i = 0; i < numProps; i++)\n        {\n          const CProp &prop = method.Props[i];\n          propIDs.Add(prop.Id);\n          NWindows::NCOM::CPropVariant &value = values[i];\n          value = prop.Value;\n          // if (tryReduce && prop.Id == NCoderPropID::kDictionarySize && value.vt == VT_UI4 && reducedDictionarySize < value.ulVal)\n          if (tryReduce)\n            if (prop.Id == NCoderPropID::kDictionarySize)\n              if (value.vt == VT_UI4)\n                if (reducedDictionarySize < value.ulVal)\n            value.ulVal = reducedDictionarySize;\n        }\n        CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n        coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties);\n        res = setCoderProperties->SetCoderProperties(&propIDs.Front(), values, numProps);\n     \n      delete []values;\n      RINOK(res);\n    }\n  }\n \n  /*\n  CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;\n  coder->QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties);\n  if (writeCoderProperties != NULL)\n  {\n    CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp;\n    CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n    outStreamSpec->Init();\n    RINOK(writeCoderProperties->WriteCoderProperties(outStream));\n    size_t size = outStreamSpec->GetSize();\n    filterProps.SetCapacity(size);\n    memmove(filterProps, outStreamSpec->GetBuffer(), size);\n  }\n  */\n  return S_OK;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/MethodProps.h",
    "content": "// MethodProps.h\n\n#ifndef __7Z_METHOD_PROPS_H\n#define __7Z_METHOD_PROPS_H\n\n#include \"../../Common/MyVector.h\"\n\n#include \"../../Windows/PropVariant.h\"\n\n#include \"MethodId.h\"\n\nstruct CProp\n{\n  PROPID Id;\n  NWindows::NCOM::CPropVariant Value;\n};\n\nstruct CMethod\n{\n  CMethodId Id;\n  CObjectVector<CProp> Props;\n};\n\nstruct CMethodsMode\n{\n  CObjectVector<CMethod> Methods;\n  #ifdef COMPRESS_MT\n  UInt32 NumThreads;\n  #endif\n\n  CMethodsMode()\n      #ifdef COMPRESS_MT\n      : NumThreads(1)\n      #endif\n  {}\n  bool IsEmpty() const { return Methods.IsEmpty() ; }\n};\n\nHRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/OffsetStream.cpp",
    "content": "// OffsetStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/Defs.h\"\n#include \"OffsetStream.h\"\n\nHRESULT COffsetOutStream::Init(IOutStream *stream, UInt64 offset)\n{\n  _offset = offset;\n  _stream = stream;\n  return _stream->Seek(offset, STREAM_SEEK_SET, NULL);\n}\n\nSTDMETHODIMP COffsetOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  return _stream->Write(data, size, processedSize);\n}\n\nSTDMETHODIMP COffsetOutStream::Seek(Int64 offset, UInt32 seekOrigin,\n    UInt64 *newPosition)\n{\n  UInt64 absoluteNewPosition;\n  if (seekOrigin == STREAM_SEEK_SET)\n    offset += _offset;\n  HRESULT result = _stream->Seek(offset, seekOrigin, &absoluteNewPosition);\n  if (newPosition != NULL)\n    *newPosition = absoluteNewPosition - _offset;\n  return result;\n}\n\nSTDMETHODIMP COffsetOutStream::SetSize(Int64 newSize)\n{\n  return _stream->SetSize(_offset + newSize);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/OffsetStream.h",
    "content": "// OffsetStream.h\n\n#ifndef __OFFSETSTREAM_H\n#define __OFFSETSTREAM_H\n\n#include \"Common/MyCom.h\"\n#include \"../IStream.h\"\n\nclass COffsetOutStream:\n  public IOutStream,\n  public CMyUnknownImp\n{\n  UInt64 _offset;\n  CMyComPtr<IOutStream> _stream;\npublic:\n  HRESULT Init(IOutStream *stream, UInt64 offset);\n  \n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\n  STDMETHOD(SetSize)(Int64 newSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/OutBuffer.cpp",
    "content": "// OutByte.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OutBuffer.h\"\n\nextern \"C\"\n{\n  #include \"../../../C/Alloc.h\"\n}\n\nbool COutBuffer::Create(UInt32 bufferSize)\n{\n  const UInt32 kMinBlockSize = 1;\n  if (bufferSize < kMinBlockSize)\n    bufferSize = kMinBlockSize;\n  if (_buffer != 0 && _bufferSize == bufferSize)\n    return true;\n  Free();\n  _bufferSize = bufferSize;\n  _buffer = (Byte *)::MidAlloc(bufferSize);\n  return (_buffer != 0);\n}\n\nvoid COutBuffer::Free()\n{\n  ::MidFree(_buffer);\n  _buffer = 0;\n}\n\nvoid COutBuffer::SetStream(ISequentialOutStream *stream)\n{\n  _stream = stream;\n}\n\nvoid COutBuffer::Init()\n{\n  _streamPos = 0;\n  _limitPos = _bufferSize;\n  _pos = 0;\n  _processedSize = 0;\n  _overDict = false;\n  #ifdef _NO_EXCEPTIONS\n  ErrorCode = S_OK;\n  #endif\n}\n\nUInt64 COutBuffer::GetProcessedSize() const\n{\n  UInt64 res = _processedSize + _pos - _streamPos;\n  if (_streamPos > _pos)\n    res += _bufferSize;\n  return res;\n}\n\n\nHRESULT COutBuffer::FlushPart()\n{\n  // _streamPos < _bufferSize\n  UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos);\n  HRESULT result = S_OK;\n  #ifdef _NO_EXCEPTIONS\n  result = ErrorCode;\n  #endif\n  if (_buffer2 != 0)\n  {\n    memmove(_buffer2, _buffer + _streamPos, size);\n    _buffer2 += size;\n  }\n\n  if (_stream != 0\n      #ifdef _NO_EXCEPTIONS\n      && (ErrorCode == S_OK)\n      #endif\n     )\n  {\n    UInt32 processedSize = 0;\n    result = _stream->Write(_buffer + _streamPos, size, &processedSize);\n    size = processedSize;\n  }\n  _streamPos += size;\n  if (_streamPos == _bufferSize)\n    _streamPos = 0;\n  if (_pos == _bufferSize)\n  {\n    _overDict = true;\n    _pos = 0;\n  }\n  _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize;\n  _processedSize += size;\n  return result;\n}\n\nHRESULT COutBuffer::Flush()\n{\n  #ifdef _NO_EXCEPTIONS\n  if (ErrorCode != S_OK)\n    return ErrorCode;\n  #endif\n\n  while(_streamPos != _pos)\n  {\n    HRESULT result = FlushPart();\n    if (result != S_OK)\n      return result;\n  }\n  return S_OK;\n}\n\nvoid COutBuffer::FlushWithCheck()\n{\n  HRESULT result = Flush();\n  #ifdef _NO_EXCEPTIONS\n  ErrorCode = result;\n  #else\n\n  #endif\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/OutBuffer.h",
    "content": "// OutBuffer.h\n\n#ifndef __OUTBUFFER_H\n#define __OUTBUFFER_H\n\n#include \"../IStream.h\"\n#include \"../../Common/MyCom.h\"\n#include \"../../Common/MyException.h\"\n\n#ifndef _NO_EXCEPTIONS\nstruct COutBufferException: public CSystemException\n{\n  COutBufferException(HRESULT errorCode): CSystemException(errorCode) {}\n};\n#endif\n\nclass COutBuffer\n{\nprotected:\n  Byte *_buffer;\n  UInt32 _pos;\n  UInt32 _limitPos;\n  UInt32 _streamPos;\n  UInt32 _bufferSize;\n  CMyComPtr<ISequentialOutStream> _stream;\n  UInt64 _processedSize;\n  Byte  *_buffer2;\n  bool _overDict;\n\n  HRESULT FlushPart();\npublic:\n  #ifdef _NO_EXCEPTIONS\n  HRESULT ErrorCode;\n  #endif\n\n  COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {}\n  ~COutBuffer() { Free(); }\n  \n  bool Create(UInt32 bufferSize);\n  void Free();\n\n  void SetMemStream(Byte *buffer) { _buffer2 = buffer; }\n  void SetStream(ISequentialOutStream *stream);\n  void Init();\n  HRESULT Flush();\n  void FlushWithCheck();\n  void ReleaseStream() {  _stream.Release(); }\n\n  void WriteByte(Byte b)\n  {\n    _buffer[_pos++] = b;\n    if(_pos == _limitPos)\n      FlushWithCheck();\n  }\n  void WriteBytes(const void *data, size_t size)\n  {\n    for (size_t i = 0; i < size; i++)\n      WriteByte(((const Byte *)data)[i]);\n  }\n\n  UInt64 GetProcessedSize() const;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/OutMemStream.cpp",
    "content": "// OutMemStream.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OutMemStream.h\"\n\nvoid COutMemStream::Free()\n{\n  Blocks.Free(_memManager);\n  Blocks.LockMode = true;\n}\n\nvoid COutMemStream::Init()\n{\n  WriteToRealStreamEvent.Reset();\n  _unlockEventWasSent = false;\n  _realStreamMode = false;\n  Free();\n  _curBlockPos = 0;\n  _curBlockIndex = 0;\n}\n\nvoid COutMemStream::DetachData(CMemLockBlocks &blocks)\n{\n  Blocks.Detach(blocks, _memManager);\n  Free();\n}\n\n\nHRESULT COutMemStream::WriteToRealStream()\n{\n  RINOK(Blocks.WriteToStream(_memManager->GetBlockSize(), OutSeqStream));\n  Blocks.Free(_memManager);\n  return S_OK;\n}\n\nSTDMETHODIMP COutMemStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  if (_realStreamMode)\n    return OutSeqStream->Write(data, size, processedSize);\n  if (processedSize != 0)\n    *processedSize = 0;\n  while(size != 0)\n  {\n    if ((int)_curBlockIndex < Blocks.Blocks.Size())\n    {\n      Byte *p = (Byte *)Blocks.Blocks[(int)_curBlockIndex] + _curBlockPos;\n      size_t curSize = _memManager->GetBlockSize() - _curBlockPos;\n      if (size < curSize)\n        curSize = size;\n      memmove(p, data, curSize);\n      if (processedSize != 0)\n        *processedSize += (UInt32)curSize;\n      data = (const void *)((const Byte *)data + curSize);\n      size -= (UInt32)curSize;\n      _curBlockPos += curSize;\n\n      UInt64 pos64 = GetPos();\n      if (pos64 > Blocks.TotalSize)\n        Blocks.TotalSize = pos64;\n      if (_curBlockPos == _memManager->GetBlockSize())\n      {\n        _curBlockIndex++;\n        _curBlockPos = 0;\n      }\n      continue;\n    }\n    HANDLE events[3] = { StopWritingEvent, WriteToRealStreamEvent, /* NoLockEvent, */ _memManager->Semaphore };\n    DWORD waitResult = ::WaitForMultipleObjects((Blocks.LockMode ? 3 : 2), events, FALSE, INFINITE);\n    switch (waitResult)\n    {\n      case (WAIT_OBJECT_0 + 0):\n        return StopWriteResult;\n      case (WAIT_OBJECT_0 + 1):\n      {\n        _realStreamMode = true;\n        RINOK(WriteToRealStream());\n        UInt32 processedSize2;\n        HRESULT res = OutSeqStream->Write(data, size, &processedSize2);\n        if (processedSize != 0)\n          *processedSize += processedSize2;\n        return res;\n      }\n      /*\n      case (WAIT_OBJECT_0 + 2):\n      {\n        // it has bug: no write.\n        if (!Blocks.SwitchToNoLockMode(_memManager))\n          return E_FAIL;\n        break;\n      }\n      */\n      case (WAIT_OBJECT_0 + 2):\n        break;\n      default:\n        return E_FAIL;\n    }\n    Blocks.Blocks.Add(_memManager->AllocateBlock());\n    if (Blocks.Blocks.Back() == 0)\n      return E_FAIL;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP COutMemStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)\n{\n  if (_realStreamMode)\n  {\n    if (!OutStream)\n      return E_FAIL;\n    return OutStream->Seek(offset, seekOrigin, newPosition);\n  }\n  if (seekOrigin == STREAM_SEEK_CUR)\n  {\n    if (offset != 0)\n      return E_NOTIMPL;\n  }\n  else if (seekOrigin == STREAM_SEEK_SET)\n  {\n    if (offset != 0)\n      return E_NOTIMPL;\n    _curBlockIndex = 0;\n    _curBlockPos = 0;\n  }\n  else\n    return E_NOTIMPL;\n  if (newPosition != 0)\n    *newPosition = GetPos();\n  return S_OK;\n}\n\nSTDMETHODIMP COutMemStream::SetSize(Int64 newSize)\n{\n  if (_realStreamMode)\n  {\n    if (!OutStream)\n      return E_FAIL;\n    return OutStream->SetSize(newSize);\n  }\n  Blocks.TotalSize = newSize;\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/OutMemStream.h",
    "content": "// OutMemStream.h\n\n#ifndef __OUTMEMSTREAM_H\n#define __OUTMEMSTREAM_H\n\n#include \"Common/MyCom.h\"\n#include \"MemBlocks.h\"\n\nclass COutMemStream:\n  public IOutStream,\n  public CMyUnknownImp\n{\n  CMemBlockManagerMt *_memManager;\n  size_t _curBlockIndex;\n  size_t _curBlockPos;\n  bool _realStreamMode;\n\n  bool _unlockEventWasSent;\n  NWindows::NSynchronization::CAutoResetEventWFMO StopWritingEvent;\n  NWindows::NSynchronization::CAutoResetEventWFMO WriteToRealStreamEvent;\n  // NWindows::NSynchronization::CAutoResetEvent NoLockEvent;\n\n  HRESULT StopWriteResult;\n  CMemLockBlocks Blocks;\n\n  UInt64 GetPos() const { return (UInt64)_curBlockIndex * _memManager->GetBlockSize() + _curBlockPos; }\n\n  CMyComPtr<ISequentialOutStream> OutSeqStream;\n  CMyComPtr<IOutStream> OutStream;\n\npublic:\n\n  HRes CreateEvents(NWindows::NSynchronization::CSynchro *sync)\n  {\n    RINOK(StopWritingEvent.CreateIfNotCreated(sync));\n    return WriteToRealStreamEvent.CreateIfNotCreated(sync);\n  }\n\n  void SetOutStream(IOutStream *outStream)\n  {\n    OutStream = outStream;\n    OutSeqStream = outStream;\n  }\n\n  void SetSeqOutStream(ISequentialOutStream *outStream)\n  {\n    OutStream = NULL;\n    OutSeqStream = outStream;\n  }\n\n  void ReleaseOutStream()\n  {\n    OutStream.Release();\n    OutSeqStream.Release();\n  }\n\n  COutMemStream(CMemBlockManagerMt *memManager): _memManager(memManager)  { }\n\n  ~COutMemStream() { Free(); }\n  void Free();\n\n  void Init();\n  HRESULT WriteToRealStream();\n\n  void DetachData(CMemLockBlocks &blocks);\n\n  bool WasUnlockEventSent() const { return _unlockEventWasSent; }\n\n  void SetRealStreamMode()\n  {\n    _unlockEventWasSent = true;\n    WriteToRealStreamEvent.Set();\n  }\n\n  /*\n  void SetNoLockMode()\n  {\n    _unlockEventWasSent = true;\n    NoLockEvent.Set();\n  }\n  */\n\n  void StopWriting(HRESULT res)\n  {\n    StopWriteResult = res;\n    StopWritingEvent.Set();\n  }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\n  STDMETHOD(SetSize)(Int64 newSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/ProgressMt.cpp",
    "content": "// ProgressMt.h\n\n#include \"StdAfx.h\"\n\n#include \"ProgressMt.h\"\n\nvoid CMtCompressProgressMixer::Init(int numItems, ICompressProgressInfo *progress)\n{\n  NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);\n  InSizes.Clear();\n  OutSizes.Clear();\n  for (int i = 0; i < numItems; i++)\n  {\n    InSizes.Add(0);\n    OutSizes.Add(0);\n  }\n  TotalInSize = 0;\n  TotalOutSize = 0;\n  _progress = progress;\n}\n\nvoid CMtCompressProgressMixer::Reinit(int index)\n{\n  NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);\n  InSizes[index] = 0;\n  OutSizes[index] = 0;\n}\n\nHRESULT CMtCompressProgressMixer::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize)\n{\n  NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);\n  if (inSize != 0)\n  {\n    UInt64 diff = *inSize - InSizes[index];\n    InSizes[index] = *inSize;\n    TotalInSize += diff;\n  }\n  if (outSize != 0)\n  {\n    UInt64 diff = *outSize - OutSizes[index];\n    OutSizes[index] = *outSize;\n    TotalOutSize += diff;\n  }\n  if (_progress)\n    return _progress->SetRatioInfo(&TotalInSize, &TotalOutSize);\n  return S_OK;\n}\n\n\nSTDMETHODIMP CMtCompressProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  return _progress->SetRatioInfo(_index, inSize, outSize);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/ProgressMt.h",
    "content": "// ProgressMt.h\n\n#ifndef __PROGRESSMT_H\n#define __PROGRESSMT_H\n\n#include \"../../Common/MyCom.h\"\n#include \"../../Common/MyVector.h\"\n#include \"../../Windows/Synchronization.h\"\n\n#include \"../ICoder.h\"\n#include \"../IProgress.h\"\n\nclass CMtCompressProgressMixer\n{\n  CMyComPtr<ICompressProgressInfo> _progress;\n  CRecordVector<UInt64> InSizes;\n  CRecordVector<UInt64> OutSizes;\n  UInt64 TotalInSize;\n  UInt64 TotalOutSize;\npublic:\n  NWindows::NSynchronization::CCriticalSection CriticalSection;\n  void Init(int numItems, ICompressProgressInfo *progress);\n  void Reinit(int index);\n  HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize);\n};\n\nclass CMtCompressProgress:\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\n  CMtCompressProgressMixer *_progress;\n  int _index;\npublic:\n  void Init(CMtCompressProgressMixer *progress, int index)\n  {\n    _progress = progress;\n    _index = index;\n  }\n  void Reinit() { _progress->Reinit(_index); }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/ProgressUtils.cpp",
    "content": "// ProgressUtils.h\n\n#include \"StdAfx.h\"\n\n#include \"ProgressUtils.h\"\n\nCLocalProgress::CLocalProgress()\n{\n  ProgressOffset = InSize = OutSize = 0;\n  SendRatio = SendProgress = true;\n}\n\nvoid CLocalProgress::Init(IProgress *progress, bool inSizeIsMain)\n{\n  _ratioProgress.Release();\n  _progress = progress;\n  _progress.QueryInterface(IID_ICompressProgressInfo, &_ratioProgress);\n  _inSizeIsMain = inSizeIsMain;\n}\n\nSTDMETHODIMP CLocalProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  UInt64 inSizeNew = InSize, outSizeNew = OutSize;\n  if (inSize)\n    inSizeNew += (*inSize);\n  if (outSize)\n    outSizeNew += (*outSize);\n  if (SendRatio && _ratioProgress)\n  {\n    RINOK(_ratioProgress->SetRatioInfo(&inSizeNew, &outSizeNew));\n  }\n  inSizeNew += ProgressOffset;\n  outSizeNew += ProgressOffset;\n  if (SendProgress)\n    return _progress->SetCompleted(_inSizeIsMain ? &inSizeNew : &outSizeNew);\n  return S_OK;\n}\n\nHRESULT CLocalProgress::SetCur()\n{\n  return SetRatioInfo(NULL, NULL);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/ProgressUtils.h",
    "content": "// ProgressUtils.h\n\n#ifndef __PROGRESSUTILS_H\n#define __PROGRESSUTILS_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n#include \"../IProgress.h\"\n\nclass CLocalProgress:\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\n  CMyComPtr<IProgress> _progress;\n  CMyComPtr<ICompressProgressInfo> _ratioProgress;\n  bool _inSizeIsMain;\npublic:\n  UInt64 ProgressOffset;\n  UInt64 InSize;\n  UInt64 OutSize;\n  bool SendRatio;\n  bool SendProgress;\n\n  CLocalProgress();\n  void Init(IProgress *progress, bool inSizeIsMain);\n  HRESULT SetCur();\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/RegisterArc.h",
    "content": "// RegisterArc.h\n\n#ifndef __REGISTERARC_H\n#define __REGISTERARC_H\n\n#include \"../Archive/IArchive.h\"\n\ntypedef IInArchive * (*CreateInArchiveP)();\ntypedef IOutArchive * (*CreateOutArchiveP)();\n\nstruct CArcInfo\n{\n  const wchar_t *Name;\n  const wchar_t *Ext;\n  const wchar_t *AddExt;\n  Byte ClassId;\n  Byte Signature[16];\n  int SignatureSize;\n  bool KeepName;\n  CreateInArchiveP CreateInArchive;\n  CreateOutArchiveP CreateOutArchive;\n};\n\nvoid RegisterArc(const CArcInfo *arcInfo);\n\n#define FORCE_REF(dec, var) extern dec var; void* var##ref = (void*)&var;\n\n#define REGISTER_ARC_NAME(x) CRegister ## x\n\n#define REGISTER_ARC_DEC_SIG(x) struct REGISTER_ARC_NAME(x) { \\\n    REGISTER_ARC_NAME(x)() { g_ArcInfo.Signature[0]--; RegisterArc(&g_ArcInfo); }}; \\\n    static REGISTER_ARC_NAME(x) g_RegisterArc;\n\n#define REGISTER_ARC(x) struct REGISTER_ARC_NAME(x) { \\\n    REGISTER_ARC_NAME(x)() { RegisterArc(&g_ArcInfo); }}; \\\n    static REGISTER_ARC_NAME(x) g_RegisterArc; \\\n\tFORCE_REF(REGISTER_ARC_NAME(x), g_RegisterArc)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/RegisterCodec.h",
    "content": "// RegisterCodec.h\n\n#ifndef __REGISTERCODEC_H\n#define __REGISTERCODEC_H\n\n#include \"../Common/MethodId.h\"\n\ntypedef void * (*CreateCodecP)();\nstruct CCodecInfo\n{\n  CreateCodecP CreateDecoder;\n  CreateCodecP CreateEncoder;\n  CMethodId Id;\n  const wchar_t *Name;\n  UInt32 NumInStreams;\n  bool IsFilter;\n};\n\nvoid RegisterCodec(const CCodecInfo *codecInfo);\n\n#define REGISTER_CODEC_NAME(x) CRegisterCodec ## x\n\n#define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) { \\\n    REGISTER_CODEC_NAME(x)() { RegisterCodec(&g_CodecInfo); }}; \\\n    static REGISTER_CODEC_NAME(x) g_RegisterCodec;\n\n#define REGISTER_CODECS_NAME(x) CRegisterCodecs ## x\n#define REGISTER_CODECS(x) struct REGISTER_CODECS_NAME(x) { \\\n    REGISTER_CODECS_NAME(x)() { for (int i = 0; i < sizeof(g_CodecsInfo) / sizeof(g_CodecsInfo[0]); i++) \\\n    RegisterCodec(&g_CodecsInfo[i]); }}; \\\n    static REGISTER_CODECS_NAME(x) g_RegisterCodecs;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/StreamBinder.cpp",
    "content": "// StreamBinder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"StreamBinder.h\"\n#include \"../../Common/Defs.h\"\n#include \"../../Common/MyCom.h\"\n\nusing namespace NWindows;\nusing namespace NSynchronization;\n\nclass CSequentialInStreamForBinder:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\nprivate:\n  CStreamBinder *m_StreamBinder;\npublic:\n  ~CSequentialInStreamForBinder() { m_StreamBinder->CloseRead(); }\n  void SetBinder(CStreamBinder *streamBinder) { m_StreamBinder = streamBinder; }\n};\n\nSTDMETHODIMP CSequentialInStreamForBinder::Read(void *data, UInt32 size, UInt32 *processedSize)\n  { return m_StreamBinder->Read(data, size, processedSize); }\n\nclass CSequentialOutStreamForBinder:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n\nprivate:\n  CStreamBinder *m_StreamBinder;\npublic:\n  ~CSequentialOutStreamForBinder() {  m_StreamBinder->CloseWrite(); }\n  void SetBinder(CStreamBinder *streamBinder) { m_StreamBinder = streamBinder; }\n};\n\nSTDMETHODIMP CSequentialOutStreamForBinder::Write(const void *data, UInt32 size, UInt32 *processedSize)\n  { return m_StreamBinder->Write(data, size, processedSize); }\n\n\n//////////////////////////\n// CStreamBinder\n// (_thereAreBytesToReadEvent && _bufferSize == 0) means that stream is finished.\n\nHRes CStreamBinder::CreateEvents()\n{\n  _synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent = new NWindows::NSynchronization::CSynchro();\n  _synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent->Create();\n  RINOK(_allBytesAreWritenEvent.Create(_synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent,true));\n  RINOK(_thereAreBytesToReadEvent.Create());\n  return _readStreamIsClosedEvent.Create(_synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent);\n}\n\nvoid CStreamBinder::ReInit()\n{\n  _thereAreBytesToReadEvent.Reset();\n  _readStreamIsClosedEvent.Reset();\n  ProcessedSize = 0;\n}\n\n\n  \nvoid CStreamBinder::CreateStreams(ISequentialInStream **inStream,\n      ISequentialOutStream **outStream)\n{\n  CSequentialInStreamForBinder *inStreamSpec = new\n      CSequentialInStreamForBinder;\n  CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);\n  inStreamSpec->SetBinder(this);\n  *inStream = inStreamLoc.Detach();\n\n  CSequentialOutStreamForBinder *outStreamSpec = new\n      CSequentialOutStreamForBinder;\n  CMyComPtr<ISequentialOutStream> outStreamLoc(outStreamSpec);\n  outStreamSpec->SetBinder(this);\n  *outStream = outStreamLoc.Detach();\n\n  _buffer = NULL;\n  _bufferSize= 0;\n  ProcessedSize = 0;\n}\n\nHRESULT CStreamBinder::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 sizeToRead = size;\n  if (size > 0)\n  {\n    RINOK(_thereAreBytesToReadEvent.Lock());\n    sizeToRead = MyMin(_bufferSize, size);\n    if (_bufferSize > 0)\n    {\n      memcpy(data, _buffer, sizeToRead);\n      _buffer = ((const Byte *)_buffer) + sizeToRead;\n      _bufferSize -= sizeToRead;\n      if (_bufferSize == 0)\n      {\n        _thereAreBytesToReadEvent.Reset();\n        _allBytesAreWritenEvent.Set();\n      }\n    }\n  }\n  if (processedSize != NULL)\n    *processedSize = sizeToRead;\n  ProcessedSize += sizeToRead;\n  return S_OK;\n}\n\nvoid CStreamBinder::CloseRead()\n{\n  _readStreamIsClosedEvent.Set();\n}\n\nHRESULT CStreamBinder::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  if (size > 0)\n  {\n    _buffer = data;\n    _bufferSize = size;\n    _allBytesAreWritenEvent.Reset();\n    _thereAreBytesToReadEvent.Set();\n\n    HANDLE events[2];\n    events[0] = _allBytesAreWritenEvent;\n    events[1] = _readStreamIsClosedEvent;\n    DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE);\n    if (waitResult != WAIT_OBJECT_0 + 0)\n    {\n      // ReadingWasClosed = true;\n      return S_FALSE;\n    }\n    // if(!_allBytesAreWritenEvent.Lock())\n    //   return E_FAIL;\n  }\n  if (processedSize != NULL)\n    *processedSize = size;\n  return S_OK;\n}\n\nvoid CStreamBinder::CloseWrite()\n{\n  // _bufferSize must be = 0\n  _thereAreBytesToReadEvent.Set();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/StreamBinder.h",
    "content": "// StreamBinder.h\n\n#ifndef __STREAMBINDER_H\n#define __STREAMBINDER_H\n\n#include \"../IStream.h\"\n#include \"../../Windows/Synchronization.h\"\n\nclass CStreamBinder\n{\n  NWindows::NSynchronization::CManualResetEventWFMO _allBytesAreWritenEvent;\n  NWindows::NSynchronization::CManualResetEvent _thereAreBytesToReadEvent;\n  NWindows::NSynchronization::CManualResetEventWFMO _readStreamIsClosedEvent;\n  NWindows::NSynchronization::CSynchro * _synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent;\n  UInt32 _bufferSize;\n  const void *_buffer;\npublic:\n  // bool ReadingWasClosed;\n  UInt64 ProcessedSize;\n  CStreamBinder() { _synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent = 0; }\n  ~CStreamBinder() {\n\tif (_synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent)\n\t\tdelete _synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent;\n\t_synchroFor_allBytesAreWritenEvent_and_readStreamIsClosedEvent = 0;\n  }\n  HRes CreateEvents();\n\n  void CreateStreams(ISequentialInStream **inStream,\n      ISequentialOutStream **outStream);\n  HRESULT Read(void *data, UInt32 size, UInt32 *processedSize);\n  void CloseRead();\n\n  HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize);\n  void CloseWrite();\n  void ReInit();\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/StreamObjects.cpp",
    "content": "// StreamObjects.cpp\n\n#include \"StdAfx.h\"\n\n#include \"StreamObjects.h\"\n#include \"../../Common/Defs.h\"\n\n\nSTDMETHODIMP CSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  size_t rem = _size - _pos;\n  if (size < rem)\n    rem = (size_t)size;\n  memcpy(data, _dataPointer + _pos, rem);\n  _pos += rem;\n  if (processedSize != NULL)\n    *processedSize = (UInt32)rem;\n  return S_OK;\n}\n\n\nvoid CWriteBuffer::Write(const void *data, size_t size)\n{\n  size_t newCapacity = _size + size;\n  _buffer.EnsureCapacity(newCapacity);\n  memcpy(_buffer + _size, data, size);\n  _size += size;\n}\n\nSTDMETHODIMP CSequentialOutStreamImp::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  _writeBuffer.Write(data, (size_t)size);\n  if(processedSize != NULL)\n    *processedSize = size;\n  return S_OK;\n}\n\nSTDMETHODIMP CSequentialOutStreamImp2::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  size_t rem = _size - _pos;\n  if (size < rem)\n    rem = (size_t)size;\n  memcpy(_buffer + _pos, data, rem);\n  _pos += rem;\n  if (processedSize != NULL)\n    *processedSize = (UInt32)rem;\n  return (rem == size ? S_OK : E_FAIL);\n}\n\nSTDMETHODIMP CSequentialInStreamSizeCount::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result = _stream->Read(data, size, &realProcessedSize);\n  _size += realProcessedSize;\n  if (processedSize != 0)\n    *processedSize = realProcessedSize;\n  return result;\n}\n\nSTDMETHODIMP CSequentialOutStreamSizeCount::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  UInt32 realProcessedSize;\n  HRESULT result = _stream->Write(data, size, &realProcessedSize);\n  _size += realProcessedSize;\n  if (processedSize != 0)\n    *processedSize = realProcessedSize;\n  return result;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/StreamObjects.h",
    "content": "// StreamObjects.h\n\n#ifndef __STREAMOBJECTS_H\n#define __STREAMOBJECTS_H\n\n#include \"../../Common/DynamicBuffer.h\"\n#include \"../../Common/MyCom.h\"\n#include \"../IStream.h\"\n\nclass CSequentialInStreamImp:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\n  const Byte *_dataPointer;\n  size_t _size;\n  size_t _pos;\n\npublic:\n  void Init(const Byte *dataPointer, size_t size)\n  {\n    _dataPointer = dataPointer;\n    _size = size;\n    _pos = 0;\n  }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n};\n\n\nclass CWriteBuffer\n{\n  CByteDynamicBuffer _buffer;\n  size_t _size;\npublic:\n  CWriteBuffer(): _size(0) {}\n  void Init() { _size = 0;  }\n  void Write(const void *data, size_t size);\n  size_t GetSize() const { return _size; }\n  const CByteDynamicBuffer& GetBuffer() const { return _buffer; }\n};\n\nclass CSequentialOutStreamImp:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CWriteBuffer _writeBuffer;\npublic:\n  void Init() { _writeBuffer.Init(); }\n  size_t GetSize() const { return _writeBuffer.GetSize(); }\n  const CByteDynamicBuffer& GetBuffer() const { return _writeBuffer.GetBuffer(); }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\nclass CSequentialOutStreamImp2:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  Byte *_buffer;\n  size_t _size;\n  size_t _pos;\npublic:\n\n  void Init(Byte *buffer, size_t size)\n  {\n    _buffer = buffer;\n    _pos = 0;\n    _size = size;\n  }\n\n  size_t GetPos() const { return _pos; }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\nclass CSequentialInStreamSizeCount:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialInStream> _stream;\n  UInt64 _size;\npublic:\n  void Init(ISequentialInStream *stream)\n  {\n    _stream = stream;\n    _size = 0;\n  }\n  UInt64 GetSize() const { return _size; }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n};\n\nclass CSequentialOutStreamSizeCount:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialOutStream> _stream;\n  UInt64 _size;\npublic:\n  void SetStream(ISequentialOutStream *stream) { _stream = stream; }\n  void Init() { _size = 0; }\n  UInt64 GetSize() const { return _size; }\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/StreamUtils.cpp",
    "content": "// StreamUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"StreamUtils.h\"\n\nstatic const UInt32 kBlockSize = ((UInt32)1 << 31);\n\nHRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize)\n{\n  size_t size = *processedSize;\n  *processedSize = 0;\n  while (size != 0)\n  {\n    UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;\n    UInt32 processedSizeLoc;\n    HRESULT res = stream->Read(data, curSize, &processedSizeLoc);\n    *processedSize += processedSizeLoc;\n    data = (void *)((Byte *)data + processedSizeLoc);\n    size -= processedSizeLoc;\n    RINOK(res);\n    if (processedSizeLoc == 0)\n      return S_OK;\n  }\n  return S_OK;\n}\n\nHRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size)\n{\n  size_t processedSize = size;\n  RINOK(ReadStream(stream, data, &processedSize));\n  return (size == processedSize) ? S_OK : S_FALSE;\n}\n\nHRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size)\n{\n  size_t processedSize = size;\n  RINOK(ReadStream(stream, data, &processedSize));\n  return (size == processedSize) ? S_OK : E_FAIL;\n}\n\nHRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size)\n{\n  while (size != 0)\n  {\n    UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;\n    UInt32 processedSizeLoc;\n    HRESULT res = stream->Write(data, curSize, &processedSizeLoc);\n    data = (const void *)((const Byte *)data + processedSizeLoc);\n    size -= processedSizeLoc;\n    RINOK(res);\n    if (processedSizeLoc == 0)\n      return E_FAIL;\n  }\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/StreamUtils.h",
    "content": "// StreamUtils.h\n\n#ifndef __STREAMUTILS_H\n#define __STREAMUTILS_H\n\n#include \"../IStream.h\"\n\nHRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *size);\nHRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size);\nHRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size);\nHRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/VirtThread.cpp",
    "content": "// VirtThread.cpp\n\n#include \"StdAfx.h\"\n\n#include \"VirtThread.h\"\n\nstatic THREAD_FUNC_DECL CoderThread(void *p)\n{\n  for (;;)\n  {\n    CVirtThread *t = (CVirtThread *)p;\n    t->StartEvent.Lock();\n    if (t->ExitEvent)\n      return 0;\n    t->Execute();\n    t->FinishedEvent.Set();\n  }\n}\n\nWRes CVirtThread::Create()\n{\n  RINOK(StartEvent.CreateIfNotCreated());\n  RINOK(FinishedEvent.CreateIfNotCreated());\n  StartEvent.Reset();\n  FinishedEvent.Reset();\n  ExitEvent = false;\n  if (Thread.IsCreated())\n    return S_OK;\n  return Thread.Create(CoderThread, this);\n}\n\nvoid CVirtThread::Start()\n{\n  ExitEvent = false;\n  StartEvent.Set();\n}\n\nCVirtThread::~CVirtThread()\n{\n  ExitEvent = true;\n  if (StartEvent.IsCreated())\n    StartEvent.Set();\n  Thread.Wait();\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Common/VirtThread.h",
    "content": "// VirtThread.h\n\n#ifndef __VIRTTHREAD_H\n#define __VIRTTHREAD_H\n\n#include \"../../Windows/Synchronization.h\"\n#include \"../../Windows/Thread.h\"\n\nstruct CVirtThread\n{\n  NWindows::NSynchronization::CAutoResetEvent StartEvent;\n  NWindows::NSynchronization::CAutoResetEvent FinishedEvent;\n  NWindows::CThread Thread;\n  bool ExitEvent;\n\n  ~CVirtThread();\n  WRes Create();\n  void Start();\n  void WaitFinish() { FinishedEvent.Lock(); }\n  virtual void Execute() = 0;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ArjDecoder1.cpp",
    "content": "// ArjDecoder1.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ArjDecoder1.h\"\n\nnamespace NCompress{\nnamespace NArj {\nnamespace NDecoder1 {\n\nstatic const UInt32 kHistorySize = 26624;\nstatic const UInt32 kMatchMinLen = 3;\nstatic const UInt32 kMatchMaxLen = 256;\n\n// static const UInt32 kNC = 255 + kMatchMaxLen + 2 - kMatchMinLen;\n\nvoid CCoder::MakeTable(int nchar, Byte *bitlen, int tablebits,\n    UInt32 *table, int tablesize)\n{\n  UInt32 count[17], weight[17], start[18], *p;\n  UInt32 i, k, len, ch, jutbits, avail, nextcode, mask;\n  \n  for (i = 1; i <= 16; i++)\n    count[i] = 0;\n  for (i = 0; (int)i < nchar; i++)\n    count[bitlen[i]]++;\n  \n  start[1] = 0;\n  for (i = 1; i <= 16; i++)\n    start[i + 1] = start[i] + (count[i] << (16 - i));\n  if (start[17] != (UInt32) (1 << 16))\n    throw \"Data error\";\n  \n  jutbits = 16 - tablebits;\n  for (i = 1; (int)i <= tablebits; i++)\n  {\n    start[i] >>= jutbits;\n    weight[i] = 1 << (tablebits - i);\n  }\n  while (i <= 16)\n  {\n    weight[i] = 1 << (16 - i);\n    i++;\n  }\n  \n  i = start[tablebits + 1] >> jutbits;\n  if (i != (UInt32) (1 << 16))\n  {\n    k = 1 << tablebits;\n    while (i != k)\n      table[i++] = 0;\n  }\n  \n  avail = nchar;\n  mask = 1 << (15 - tablebits);\n  for (ch = 0; (int)ch < nchar; ch++)\n  {\n    if ((len = bitlen[ch]) == 0)\n      continue;\n    k = start[len];\n    nextcode = k + weight[len];\n    if ((int)len <= tablebits)\n    {\n      if (nextcode > (UInt32)tablesize)\n        throw \"Data error\";\n      for (i = start[len]; i < nextcode; i++)\n        table[i] = ch;\n    }\n    else\n    {\n      p = &table[k >> jutbits];\n      i = len - tablebits;\n      while (i != 0)\n      {\n        if (*p == 0)\n        {\n          right[avail] = left[avail] = 0;\n          *p = avail++;\n        }\n        if (k & mask)\n          p = &right[*p];\n        else\n          p = &left[*p];\n        k <<= 1;\n        i--;\n      }\n      *p = ch;\n    }\n    start[len] = nextcode;\n  }\n}\n\nvoid CCoder::read_pt_len(int nn, int nbit, int i_special)\n{\n  UInt32 n = m_InBitStream.ReadBits(nbit);\n  if (n == 0)\n  {\n    UInt32 c = m_InBitStream.ReadBits(nbit);\n    int i;\n    for (i = 0; i < nn; i++)\n      pt_len[i] = 0;\n    for (i = 0; i < 256; i++)\n      pt_table[i] = c;\n  }\n  else\n  {\n    UInt32 i = 0;\n    while (i < n)\n    {\n      UInt32 bitBuf = m_InBitStream.GetValue(16);\n      int c = bitBuf >> 13;\n      if (c == 7)\n      {\n        UInt32 mask = 1 << (12);\n        while (mask & bitBuf)\n        {\n          mask >>= 1;\n          c++;\n        }\n      }\n      m_InBitStream.MovePos((c < 7) ? 3 : (int)(c - 3));\n      pt_len[i++] = (Byte)c;\n      if (i == (UInt32)i_special)\n      {\n        c = m_InBitStream.ReadBits(2);\n        while (--c >= 0)\n          pt_len[i++] = 0;\n      }\n    }\n    while (i < (UInt32)nn)\n      pt_len[i++] = 0;\n    MakeTable(nn, pt_len, 8, pt_table, PTABLESIZE);\n  }\n}\n\nvoid CCoder::read_c_len()\n{\n  int i, c, n;\n  UInt32 mask;\n  \n  n = m_InBitStream.ReadBits(CBIT);\n  if (n == 0)\n  {\n    c = m_InBitStream.ReadBits(CBIT);\n    for (i = 0; i < NC; i++)\n      c_len[i] = 0;\n    for (i = 0; i < CTABLESIZE; i++)\n      c_table[i] = c;\n  }\n  else\n  {\n    i = 0;\n    while (i < n)\n    {\n      UInt32 bitBuf = m_InBitStream.GetValue(16);\n      c = pt_table[bitBuf >> (8)];\n      if (c >= NT)\n      {\n        mask = 1 << (7);\n        do\n        {\n          if (bitBuf & mask)\n            c = right[c];\n          else\n            c = left[c];\n          mask >>= 1;\n        } while (c >= NT);\n      }\n      m_InBitStream.MovePos((int)(pt_len[c]));\n      if (c <= 2)\n      {\n        if (c == 0)\n          c = 1;\n        else if (c == 1)\n          c = m_InBitStream.ReadBits(4) + 3;\n        else\n          c = m_InBitStream.ReadBits(CBIT) + 20;\n        while (--c >= 0)\n          c_len[i++] = 0;\n      }\n      else\n        c_len[i++] = (Byte)(c - 2);\n    }\n    while (i < NC)\n      c_len[i++] = 0;\n    MakeTable(NC, c_len, 12, c_table, CTABLESIZE);\n  }\n}\n\nUInt32 CCoder::decode_c()\n{\n  UInt32 j, mask;\n  UInt32 bitbuf = m_InBitStream.GetValue(16);\n  j = c_table[bitbuf >> 4];\n  if (j >= NC)\n  {\n    mask = 1 << (3);\n    do\n    {\n      if (bitbuf & mask)\n        j = right[j];\n      else\n        j = left[j];\n      mask >>= 1;\n    } while (j >= NC);\n  }\n  m_InBitStream.MovePos((int)(c_len[j]));\n  return j;\n}\n\nUInt32 CCoder::decode_p()\n{\n  UInt32 j, mask;\n  UInt32 bitbuf = m_InBitStream.GetValue(16);\n  j = pt_table[bitbuf >> (8)];\n  if (j >= NP)\n  {\n    mask = 1 << (7);\n    do\n    {\n      if (bitbuf & mask)\n        j = right[j];\n      else\n        j = left[j];\n      mask >>= 1;\n    } while (j >= NP);\n  }\n  m_InBitStream.MovePos((int)(pt_len[j]));\n  if (j != 0)\n  {\n    j--;\n    j = (1 << j) + m_InBitStream.ReadBits((int)j);\n  }\n  return j;\n}\n\n\nHRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  if (outSize == NULL)\n    return E_INVALIDARG;\n\n  if (!m_OutWindowStream.Create(kHistorySize))\n    return E_OUTOFMEMORY;\n  if (!m_InBitStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n\n  int size1 = sizeof(c_table) / sizeof(c_table[0]);\n  for (int i = 0; i < size1; i++)\n  {\n    if (i % 100 == 0)\n      c_table[i] = 0;\n\n    c_table[i] = 0;\n  }\n\n\n  UInt64 pos = 0;\n  m_OutWindowStream.SetStream(outStream);\n  m_OutWindowStream.Init(false);\n  m_InBitStream.SetStream(inStream);\n  m_InBitStream.Init();\n  \n  CCoderReleaser coderReleaser(this);\n\n  UInt32 blockSize = 0;\n\n  while(pos < *outSize)\n  {\n    if (blockSize == 0)\n    {\n      if (progress != NULL)\n      {\n        UInt64 packSize = m_InBitStream.GetProcessedSize();\n        RINOK(progress->SetRatioInfo(&packSize, &pos));\n      }\n      blockSize = m_InBitStream.ReadBits(16);\n      read_pt_len(NT, TBIT, 3);\n      read_c_len();\n      read_pt_len(NP, PBIT, -1);\n    }\n    blockSize--;\n\n    UInt32 number = decode_c();\n    if (number < 256)\n    {\n      m_OutWindowStream.PutByte((Byte)number);\n      pos++;\n      continue;\n    }\n    else\n    {\n      UInt32 len = number - 256 + kMatchMinLen;\n      UInt32 distance = decode_p();\n      if (distance >= pos)\n        return S_FALSE;\n      m_OutWindowStream.CopyBlock(distance, len);\n        pos += len;\n    }\n  }\n  coderReleaser.NeedFlush = false;\n  return m_OutWindowStream.Flush();\n}\n\nSTDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  try { return CodeReal(inStream, outStream, inSize, outSize, progress);}\n  catch(const CInBufferException &e) { return e.ErrorCode; }\n  catch(const CLzOutWindowException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ArjDecoder1.h",
    "content": "// ArjDecoder1.h\n\n#ifndef __COMPRESS_ARJ_DECODER1_H\n#define __COMPRESS_ARJ_DECODER1_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitmDecoder.h\"\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NArj {\nnamespace NDecoder1 {\n\n#define CODE_BIT          16\n\n#define THRESHOLD    3\n#define DDICSIZ      26624\n#define MAXDICBIT   16\n#define MATCHBIT     8\n#define MAXMATCH   256\n#define NC          (0xFF + MAXMATCH + 2 - THRESHOLD)\n#define NP          (MAXDICBIT + 1)\n#define CBIT         9\n#define NT          (CODE_BIT + 3)\n#define PBIT         5\n#define TBIT         5\n\n#if NT > NP\n#define NPT NT\n#else\n#define NPT NP\n#endif\n\n#define CTABLESIZE  4096\n#define PTABLESIZE   256\n\n\nclass CCoder :\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  CLzOutWindow m_OutWindowStream;\n  NBitm::CDecoder<CInBuffer> m_InBitStream;\n\n  UInt32 left[2 * NC - 1];\n  UInt32 right[2 * NC - 1];\n  Byte c_len[NC];\n  Byte pt_len[NPT];\n\n  UInt32 c_table[CTABLESIZE];\n  UInt32 pt_table[PTABLESIZE];\n  \n  void ReleaseStreams()\n  {\n    m_OutWindowStream.ReleaseStream();\n    m_InBitStream.ReleaseStream();\n  }\n\n  class CCoderReleaser\n  {\n    CCoder *m_Coder;\n  public:\n    bool NeedFlush;\n    CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}\n    ~CCoderReleaser()\n    {\n      if (NeedFlush)\n        m_Coder->m_OutWindowStream.Flush();\n      m_Coder->ReleaseStreams();\n    }\n  };\n  friend class CCoderReleaser;\n\n  void MakeTable(int nchar, Byte *bitlen, int tablebits, UInt32 *table, int tablesize);\n  \n  void read_c_len();\n  void read_pt_len(int nn, int nbit, int i_special);\n  UInt32 decode_c();\n  UInt32 decode_p();\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ArjDecoder2.cpp",
    "content": "// ArjDecoder2.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ArjDecoder2.h\"\n\nnamespace NCompress{\nnamespace NArj {\nnamespace NDecoder2 {\n\nstatic const UInt32 kHistorySize = 26624;\nstatic const UInt32 kMatchMinLen = 3;\n\nHRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo * /* progress */)\n{\n  if (outSize == NULL)\n    return E_INVALIDARG;\n\n  if (!m_OutWindowStream.Create(kHistorySize))\n    return E_OUTOFMEMORY;\n  if (!m_InBitStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n\n  UInt64 pos = 0;\n  m_OutWindowStream.SetStream(outStream);\n  m_OutWindowStream.Init(false);\n  m_InBitStream.SetStream(inStream);\n  m_InBitStream.Init();\n  CCoderReleaser coderReleaser(this);\n\n  while(pos < *outSize)\n  {\n    const UInt32 kStartWidth = 0;\n    const UInt32 kStopWidth = 7;\n    UInt32 power = 1 << kStartWidth;\n    UInt32 width;\n    UInt32 len = 0;\n    for (width = kStartWidth; width < kStopWidth; width++)\n    {\n      if (m_InBitStream.ReadBits(1) == 0)\n        break;\n      len += power;\n      power <<= 1;\n    }\n    if (width != 0)\n      len += m_InBitStream.ReadBits(width);\n    if (len == 0)\n    {\n      m_OutWindowStream.PutByte((Byte)m_InBitStream.ReadBits(8));\n      pos++;\n      continue;\n    }\n    else\n    {\n      len = len - 1 + kMatchMinLen;\n      const UInt32 kStartWidth = 9;\n      const UInt32 kStopWidth = 13;\n      UInt32 power = 1 << kStartWidth;\n      UInt32 width;\n      UInt32 distance = 0;\n      for (width = kStartWidth; width < kStopWidth; width++)\n      {\n        if (m_InBitStream.ReadBits(1) == 0)\n          break;\n        distance += power;\n        power <<= 1;\n      }\n      if (width != 0)\n        distance += m_InBitStream.ReadBits(width);\n      if (distance >= pos)\n        return S_FALSE;\n      m_OutWindowStream.CopyBlock(distance, len);\n        pos += len;\n    }\n  }\n  coderReleaser.NeedFlush = false;\n  return m_OutWindowStream.Flush();\n}\n\nSTDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  try { return CodeReal(inStream, outStream, inSize, outSize, progress);}\n  catch(const CInBufferException &e) { return e.ErrorCode; }\n  catch(const CLzOutWindowException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ArjDecoder2.h",
    "content": "// ArjDecoder2.h\n\n#ifndef __COMPRESS_ARJ_DECODER2_H\n#define __COMPRESS_ARJ_DECODER2_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitmDecoder.h\"\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NArj {\nnamespace NDecoder2 {\n\nclass CCoder :\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  CLzOutWindow m_OutWindowStream;\n  NBitm::CDecoder<CInBuffer> m_InBitStream;\n  \n  void ReleaseStreams()\n  {\n    m_OutWindowStream.ReleaseStream();\n    m_InBitStream.ReleaseStream();\n  }\n\n  class CCoderReleaser\n  {\n    CCoder *m_Coder;\n  public:\n    bool NeedFlush;\n    CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}\n    ~CCoderReleaser()\n    {\n      if (NeedFlush)\n        m_Coder->m_OutWindowStream.Flush();\n      m_Coder->ReleaseStreams();\n    }\n  };\n  friend class CCoderReleaser;\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\npublic:\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Const.h",
    "content": "// Compress/BZip2Const.h\n\n#ifndef __COMPRESS_BZIP2_CONST_H\n#define __COMPRESS_BZIP2_CONST_H\n\nnamespace NCompress {\nnamespace NBZip2 {\n\nconst Byte kArSig0 = 'B';\nconst Byte kArSig1 = 'Z';\nconst Byte kArSig2 = 'h';\nconst Byte kArSig3 = '0';\n\nconst Byte kFinSig0 = 0x17;\nconst Byte kFinSig1 = 0x72;\nconst Byte kFinSig2 = 0x45;\nconst Byte kFinSig3 = 0x38;\nconst Byte kFinSig4 = 0x50;\nconst Byte kFinSig5 = 0x90;\n\nconst Byte kBlockSig0 = 0x31;\nconst Byte kBlockSig1 = 0x41;\nconst Byte kBlockSig2 = 0x59;\nconst Byte kBlockSig3 = 0x26;\nconst Byte kBlockSig4 = 0x53;\nconst Byte kBlockSig5 = 0x59;\n\nconst int kNumOrigBits = 24;\n\nconst int kNumTablesBits = 3;\nconst int kNumTablesMin = 2;\nconst int kNumTablesMax = 6;\n\nconst int kNumLevelsBits = 5;\n\nconst int kMaxHuffmanLen = 20; // Check it\n\nconst int kMaxAlphaSize = 258;\n\nconst int kGroupSize = 50;\n\nconst int kBlockSizeMultMin = 1;\nconst int kBlockSizeMultMax = 9;\nconst UInt32 kBlockSizeStep = 100000;\nconst UInt32 kBlockSizeMax = kBlockSizeMultMax * kBlockSizeStep;\n\nconst int kNumSelectorsBits = 15;\nconst UInt32 kNumSelectorsMax = (2 + (kBlockSizeMax / kGroupSize));\n\nconst int kRleModeRepSize = 4;\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Crc.cpp",
    "content": "// BZip2Crc.cpp\n\n#include \"StdAfx.h\"\n\n#include \"BZip2Crc.h\"\n\nUInt32 CBZip2Crc::Table[256];\n\nstatic const UInt32 kBZip2CrcPoly = 0x04c11db7;  /* AUTODIN II, Ethernet, & FDDI */\n\nvoid CBZip2Crc::InitTable()\n{\n  for (UInt32 i = 0; i < 256; i++)\n  {\n    UInt32 r = (i << 24);\n    for (int j = 8; j > 0; j--)\n      r = (r & 0x80000000) ? ((r << 1) ^ kBZip2CrcPoly) : (r << 1);\n    Table[i] = r;\n  }\n}\n\nclass CBZip2CrcTableInit\n{\npublic:\n  CBZip2CrcTableInit() { CBZip2Crc::InitTable(); }\n} g_BZip2CrcTableInit;\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Crc.h",
    "content": "// BZip2Crc.h\n\n#ifndef __BZIP2_CRC_H\n#define __BZIP2_CRC_H\n\n#include \"Common/Types.h\"\n\nclass CBZip2Crc\n{\n  UInt32 _value;\n  static UInt32 Table[256];\npublic:\n  static void InitTable();\n  CBZip2Crc(): _value(0xFFFFFFFF) {};\n  void Init() { _value = 0xFFFFFFFF; }\n  void UpdateByte(Byte b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); }\n  void UpdateByte(unsigned int b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); }\n  UInt32 GetDigest() const { return _value ^ 0xFFFFFFFF; }\n};\n\nclass CBZip2CombinedCrc\n{\n  UInt32 _value;\npublic:\n  CBZip2CombinedCrc():  _value(0){};\n  void Init() { _value = 0; }\n  void Update(UInt32 v) { _value = ((_value << 1) | (_value >> 31)) ^ v; }\n  UInt32 GetDigest() const { return _value ; }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Decoder.cpp",
    "content": "// BZip2Decoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"../../Common/Defs.h\"\n\n#include \"BZip2Crc.h\"\n#include \"BZip2Decoder.h\"\n#include \"Mtf8.h\"\n\nnamespace NCompress {\nnamespace NBZip2 {\n\n#define NO_INLINE MY_FAST_CALL\n\nconst UInt32 kNumThreadsMax = 4;\n\nstatic const UInt32 kBufferSize = (1 << 17);\n\nstatic Int16 kRandNums[512] = {\n   619, 720, 127, 481, 931, 816, 813, 233, 566, 247,\n   985, 724, 205, 454, 863, 491, 741, 242, 949, 214,\n   733, 859, 335, 708, 621, 574, 73, 654, 730, 472,\n   419, 436, 278, 496, 867, 210, 399, 680, 480, 51,\n   878, 465, 811, 169, 869, 675, 611, 697, 867, 561,\n   862, 687, 507, 283, 482, 129, 807, 591, 733, 623,\n   150, 238, 59, 379, 684, 877, 625, 169, 643, 105,\n   170, 607, 520, 932, 727, 476, 693, 425, 174, 647,\n   73, 122, 335, 530, 442, 853, 695, 249, 445, 515,\n   909, 545, 703, 919, 874, 474, 882, 500, 594, 612,\n   641, 801, 220, 162, 819, 984, 589, 513, 495, 799,\n   161, 604, 958, 533, 221, 400, 386, 867, 600, 782,\n   382, 596, 414, 171, 516, 375, 682, 485, 911, 276,\n   98, 553, 163, 354, 666, 933, 424, 341, 533, 870,\n   227, 730, 475, 186, 263, 647, 537, 686, 600, 224,\n   469, 68, 770, 919, 190, 373, 294, 822, 808, 206,\n   184, 943, 795, 384, 383, 461, 404, 758, 839, 887,\n   715, 67, 618, 276, 204, 918, 873, 777, 604, 560,\n   951, 160, 578, 722, 79, 804, 96, 409, 713, 940,\n   652, 934, 970, 447, 318, 353, 859, 672, 112, 785,\n   645, 863, 803, 350, 139, 93, 354, 99, 820, 908,\n   609, 772, 154, 274, 580, 184, 79, 626, 630, 742,\n   653, 282, 762, 623, 680, 81, 927, 626, 789, 125,\n   411, 521, 938, 300, 821, 78, 343, 175, 128, 250,\n   170, 774, 972, 275, 999, 639, 495, 78, 352, 126,\n   857, 956, 358, 619, 580, 124, 737, 594, 701, 612,\n   669, 112, 134, 694, 363, 992, 809, 743, 168, 974,\n   944, 375, 748, 52, 600, 747, 642, 182, 862, 81,\n   344, 805, 988, 739, 511, 655, 814, 334, 249, 515,\n   897, 955, 664, 981, 649, 113, 974, 459, 893, 228,\n   433, 837, 553, 268, 926, 240, 102, 654, 459, 51,\n   686, 754, 806, 760, 493, 403, 415, 394, 687, 700,\n   946, 670, 656, 610, 738, 392, 760, 799, 887, 653,\n   978, 321, 576, 617, 626, 502, 894, 679, 243, 440,\n   680, 879, 194, 572, 640, 724, 926, 56, 204, 700,\n   707, 151, 457, 449, 797, 195, 791, 558, 945, 679,\n   297, 59, 87, 824, 713, 663, 412, 693, 342, 606,\n   134, 108, 571, 364, 631, 212, 174, 643, 304, 329,\n   343, 97, 430, 751, 497, 314, 983, 374, 822, 928,\n   140, 206, 73, 263, 980, 736, 876, 478, 430, 305,\n   170, 514, 364, 692, 829, 82, 855, 953, 676, 246,\n   369, 970, 294, 750, 807, 827, 150, 790, 288, 923,\n   804, 378, 215, 828, 592, 281, 565, 555, 710, 82,\n   896, 831, 547, 261, 524, 462, 293, 465, 502, 56,\n   661, 821, 976, 991, 658, 869, 905, 758, 745, 193,\n   768, 550, 608, 933, 378, 286, 215, 979, 792, 961,\n   61, 688, 793, 644, 986, 403, 106, 366, 905, 644,\n   372, 567, 466, 434, 645, 210, 389, 550, 919, 135,\n   780, 773, 635, 389, 707, 100, 626, 958, 165, 504,\n   920, 176, 193, 713, 857, 265, 203, 50, 668, 108,\n   645, 990, 626, 197, 510, 357, 358, 850, 858, 364,\n   936, 638\n};\n\nbool CState::Alloc()\n{\n  if (Counters == 0)\n    Counters = (UInt32 *)BigAlloc((256 + kBlockSizeMax) * sizeof(UInt32));\n  return (Counters != 0);\n}\n\nvoid CState::Free()\n{\n  ::BigFree(Counters);\n  Counters = 0;\n}\n\nUInt32 CDecoder::ReadBits(int numBits) {  return m_InStream.ReadBits(numBits); }\nByte CDecoder::ReadByte() {return (Byte)ReadBits(8); }\nbool CDecoder::ReadBit() { return ReadBits(1) != 0; }\n\nUInt32 CDecoder::ReadCrc()\n{\n  UInt32 crc = 0;\n  for (int i = 0; i < 4; i++)\n  {\n    crc <<= 8;\n    crc |= ReadByte();\n  }\n  return crc;\n}\n\nUInt32 NO_INLINE ReadBits(NBitm::CDecoder<CInBuffer> *m_InStream, int num)\n{\n  return m_InStream->ReadBits(num);\n}\n\nUInt32 NO_INLINE ReadBit(NBitm::CDecoder<CInBuffer> *m_InStream)\n{\n  return m_InStream->ReadBits(1);\n}\n\nstatic HRESULT NO_INLINE ReadBlock(NBitm::CDecoder<CInBuffer> *m_InStream,\n  UInt32 *CharCounters, UInt32 blockSizeMax, Byte *m_Selectors, CHuffmanDecoder *m_HuffmanDecoders,\n  UInt32 *blockSizeRes, UInt32 *origPtrRes, bool *randRes)\n{\n  *randRes = ReadBit(m_InStream) ? true : false;\n  *origPtrRes = ReadBits(m_InStream, kNumOrigBits);\n  \n  // in original code it compares OrigPtr to (UInt32)(10 + blockSizeMax)) : why ?\n  if (*origPtrRes >= blockSizeMax)\n    return S_FALSE;\n\n  CMtf8Decoder mtf;\n  mtf.StartInit();\n  \n  int numInUse = 0;\n  {\n    Byte inUse16[16];\n    int i;\n    for (i = 0; i < 16; i++)\n      inUse16[i] = (Byte)ReadBit(m_InStream);\n    for (i = 0; i < 256; i++)\n      if (inUse16[i >> 4])\n      {\n        if (ReadBit(m_InStream))\n          mtf.Add(numInUse++, (Byte)i);\n      }\n    if (numInUse == 0)\n      return S_FALSE;\n    // mtf.Init(numInUse);\n  }\n  int alphaSize = numInUse + 2;\n\n  int numTables = ReadBits(m_InStream, kNumTablesBits);\n  if (numTables < kNumTablesMin || numTables > kNumTablesMax)\n    return S_FALSE;\n  \n  UInt32 numSelectors = ReadBits(m_InStream, kNumSelectorsBits);\n  if (numSelectors < 1 || numSelectors > kNumSelectorsMax)\n    return S_FALSE;\n\n  {\n    Byte mtfPos[kNumTablesMax];\n    int t = 0;\n    do\n      mtfPos[t] = (Byte)t;\n    while(++t < numTables);\n    UInt32 i = 0;\n    do\n    {\n      int j = 0;\n      while (ReadBit(m_InStream))\n        if (++j >= numTables)\n          return S_FALSE;\n      Byte tmp = mtfPos[j];\n      for (;j > 0; j--)\n        mtfPos[j] = mtfPos[j - 1];\n      m_Selectors[i] = mtfPos[0] = tmp;\n    }\n    while(++i < numSelectors);\n  }\n\n  int t = 0;\n  do\n  {\n    Byte lens[kMaxAlphaSize];\n    int len = (int)ReadBits(m_InStream, kNumLevelsBits);\n    int i;\n    for (i = 0; i < alphaSize; i++)\n    {\n      for (;;)\n      {\n        if (len < 1 || len > kMaxHuffmanLen)\n          return S_FALSE;\n        if (!ReadBit(m_InStream))\n          break;\n        len += 1 - (int)(ReadBit(m_InStream) << 1);\n      }\n      lens[i] = (Byte)len;\n    }\n    for (; i < kMaxAlphaSize; i++)\n      lens[i] = 0;\n    if(!m_HuffmanDecoders[t].SetCodeLengths(lens))\n      return S_FALSE;\n  }\n  while(++t < numTables);\n\n  {\n    for (int i = 0; i < 256; i++)\n      CharCounters[i] = 0;\n  }\n  \n  UInt32 blockSize = 0;\n  {\n    UInt32 groupIndex = 0;\n    UInt32 groupSize = 0;\n    CHuffmanDecoder *huffmanDecoder = 0;\n    int runPower = 0;\n    UInt32 runCounter = 0;\n    \n    for (;;)\n    {\n      if (groupSize == 0)\n      {\n        if (groupIndex >= numSelectors)\n          return S_FALSE;\n        groupSize = kGroupSize;\n        huffmanDecoder = &m_HuffmanDecoders[m_Selectors[groupIndex++]];\n      }\n      groupSize--;\n        \n      UInt32 nextSym = huffmanDecoder->DecodeSymbol(m_InStream);\n      \n      if (nextSym < 2)\n      {\n        runCounter += ((UInt32)(nextSym + 1) << runPower++);\n        if (blockSizeMax - blockSize < runCounter)\n          return S_FALSE;\n        continue;\n      }\n      if (runCounter != 0)\n      {\n        UInt32 b = (UInt32)mtf.GetHead();\n        CharCounters[b] += runCounter;\n        do\n          CharCounters[256 + blockSize++] = b;\n        while(--runCounter != 0);\n        runPower = 0;\n      }\n      if (nextSym <= (UInt32)numInUse)\n      {\n        UInt32 b = (UInt32)mtf.GetAndMove((int)nextSym - 1);\n        if (blockSize >= blockSizeMax)\n          return S_FALSE;\n        CharCounters[b]++;\n        CharCounters[256 + blockSize++] = b;\n      }\n      else if (nextSym == (UInt32)numInUse + 1)\n        break;\n      else\n        return S_FALSE;\n    }\n  }\n  *blockSizeRes = blockSize;\n  return (*origPtrRes < blockSize) ? S_OK : S_FALSE;\n}\n\nvoid NO_INLINE DecodeBlock1(UInt32 *charCounters, UInt32 blockSize)\n{\n  {\n    UInt32 sum = 0;\n    for (UInt32 i = 0; i < 256; i++)\n    {\n      sum += charCounters[i];\n      charCounters[i] = sum - charCounters[i];\n    }\n  }\n  \n  UInt32 *tt = charCounters + 256;\n  // Compute the T^(-1) vector\n  UInt32 i = 0;\n  do\n    tt[charCounters[tt[i] & 0xFF]++] |= (i << 8);\n  while(++i < blockSize);\n}\n\nstatic UInt32 NO_INLINE DecodeBlock2(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream)\n{\n  CBZip2Crc crc;\n\n  // it's for speed optimization: prefetch & prevByte_init;\n  UInt32 tPos = tt[tt[OrigPtr] >> 8];\n  unsigned int prevByte = (unsigned int)(tPos & 0xFF);\n  \n  int numReps = 0;\n\n  do\n  {\n    unsigned int b = (unsigned int)(tPos & 0xFF);\n    tPos = tt[tPos >> 8];\n    \n    if (numReps == kRleModeRepSize)\n    {\n      for (; b > 0; b--)\n      {\n        crc.UpdateByte(prevByte);\n        m_OutStream.WriteByte((Byte)prevByte);\n      }\n      numReps = 0;\n      continue;\n    }\n    if (b != prevByte)\n      numReps = 0;\n    numReps++;\n    prevByte = b;\n    crc.UpdateByte(b);\n    m_OutStream.WriteByte((Byte)b);\n\n    /*\n    prevByte = b;\n    crc.UpdateByte(b);\n    m_OutStream.WriteByte((Byte)b);\n    for (; --blockSize != 0;)\n    {\n      b = (unsigned int)(tPos & 0xFF);\n      tPos = tt[tPos >> 8];\n      crc.UpdateByte(b);\n      m_OutStream.WriteByte((Byte)b);\n      if (b != prevByte)\n      {\n        prevByte = b;\n        continue;\n      }\n      if (--blockSize == 0)\n        break;\n      \n      b = (unsigned int)(tPos & 0xFF);\n      tPos = tt[tPos >> 8];\n      crc.UpdateByte(b);\n      m_OutStream.WriteByte((Byte)b);\n      if (b != prevByte)\n      {\n        prevByte = b;\n        continue;\n      }\n      if (--blockSize == 0)\n        break;\n      \n      b = (unsigned int)(tPos & 0xFF);\n      tPos = tt[tPos >> 8];\n      crc.UpdateByte(b);\n      m_OutStream.WriteByte((Byte)b);\n      if (b != prevByte)\n      {\n        prevByte = b;\n        continue;\n      }\n      --blockSize;\n      break;\n    }\n    if (blockSize == 0)\n      break;\n\n    b = (unsigned int)(tPos & 0xFF);\n    tPos = tt[tPos >> 8];\n    \n    for (; b > 0; b--)\n    {\n      crc.UpdateByte(prevByte);\n      m_OutStream.WriteByte((Byte)prevByte);\n    }\n    */\n  }\n  while(--blockSize != 0);\n  return crc.GetDigest();\n}\n\nstatic UInt32 NO_INLINE DecodeBlock2Rand(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream)\n{\n  CBZip2Crc crc;\n  \n  UInt32 randIndex = 1;\n  UInt32 randToGo = kRandNums[0] - 2;\n  \n  int numReps = 0;\n\n  // it's for speed optimization: prefetch & prevByte_init;\n  UInt32 tPos = tt[tt[OrigPtr] >> 8];\n  unsigned int prevByte = (unsigned int)(tPos & 0xFF);\n  \n  do\n  {\n    unsigned int b = (unsigned int)(tPos & 0xFF);\n    tPos = tt[tPos >> 8];\n    \n    {\n      if (randToGo == 0)\n      {\n        b ^= 1;\n        randToGo = kRandNums[randIndex++];\n        randIndex &= 0x1FF;\n      }\n      randToGo--;\n    }\n    \n    if (numReps == kRleModeRepSize)\n    {\n      for (; b > 0; b--)\n      {\n        crc.UpdateByte(prevByte);\n        m_OutStream.WriteByte((Byte)prevByte);\n      }\n      numReps = 0;\n      continue;\n    }\n    if (b != prevByte)\n      numReps = 0;\n    numReps++;\n    prevByte = b;\n    crc.UpdateByte(b);\n    m_OutStream.WriteByte((Byte)b);\n  }\n  while(--blockSize != 0);\n  return crc.GetDigest();\n}\n\n#ifdef COMPRESS_BZIP2_MT\n\nCDecoder::CDecoder():\n  m_States(0)\n{\n  m_NumThreadsPrev = 0;\n  NumThreads = 1;\n}\n\nCDecoder::~CDecoder()\n{\n  Free();\n}\n\n#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; }\n\nHRESULT CDecoder::Create()\n{\n  RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());\n  RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());\n  if (m_States != 0 && m_NumThreadsPrev == NumThreads)\n    return S_OK;\n  Free();\n  MtMode = (NumThreads > 1);\n  m_NumThreadsPrev = NumThreads;\n  try\n  {\n    m_States = new CState[NumThreads];\n    if (m_States == 0)\n      return E_OUTOFMEMORY;\n  }\n  catch(...) { return E_OUTOFMEMORY; }\n  for (UInt32 t = 0; t < NumThreads; t++)\n  {\n    CState &ti = m_States[t];\n    ti.Decoder = this;\n    if (MtMode)\n    {\n      HRESULT res = ti.Create();\n      if (res != S_OK)\n      {\n        NumThreads = t;\n        Free();\n        return res;\n      }\n    }\n  }\n  return S_OK;\n}\n\nvoid CDecoder::Free()\n{\n  if (!m_States)\n    return;\n  CloseThreads = true;\n  CanProcessEvent.Set();\n  for (UInt32 t = 0; t < NumThreads; t++)\n  {\n    CState &s = m_States[t];\n    if (MtMode)\n      s.Thread.Wait();\n    s.Free();\n  }\n  delete []m_States;\n  m_States = 0;\n}\n#endif\n\nHRESULT CDecoder::ReadSignatures(bool &wasFinished, UInt32 &crc)\n{\n  wasFinished = false;\n  Byte s[6];\n  for (int i = 0; i < 6; i++)\n    s[i] = ReadByte();\n  crc = ReadCrc();\n  if (s[0] == kFinSig0)\n  {\n    if (s[1] != kFinSig1 ||\n        s[2] != kFinSig2 ||\n        s[3] != kFinSig3 ||\n        s[4] != kFinSig4 ||\n        s[5] != kFinSig5)\n      return S_FALSE;\n    \n    wasFinished = true;\n    return (crc == CombinedCrc.GetDigest()) ? S_OK : S_FALSE;\n  }\n  if (s[0] != kBlockSig0 ||\n      s[1] != kBlockSig1 ||\n      s[2] != kBlockSig2 ||\n      s[3] != kBlockSig3 ||\n      s[4] != kBlockSig4 ||\n      s[5] != kBlockSig5)\n    return S_FALSE;\n  CombinedCrc.Update(crc);\n  return S_OK;\n}\n\nHRESULT CDecoder::DecodeFile(bool &isBZ, ICompressProgressInfo *progress)\n{\n  #ifdef COMPRESS_BZIP2_MT\n  Progress = progress;\n  RINOK(Create());\n  for (UInt32 t = 0; t < NumThreads; t++)\n  {\n    CState &s = m_States[t];\n    if (!s.Alloc())\n      return E_OUTOFMEMORY;\n    if (MtMode)\n    {\n      RINOK(s.StreamWasFinishedEvent.Reset());\n      RINOK(s.WaitingWasStartedEvent.Reset());\n      RINOK(s.CanWriteEvent.Reset());\n    }\n  }\n  #else\n  if (!m_States[0].Alloc())\n    return E_OUTOFMEMORY;\n  #endif\n\n  isBZ = false;\n  Byte s[6];\n  int i;\n  for (i = 0; i < 4; i++)\n    s[i] = ReadByte();\n  if (s[0] != kArSig0 ||\n      s[1] != kArSig1 ||\n      s[2] != kArSig2 ||\n      s[3] <= kArSig3 ||\n      s[3] > kArSig3 + kBlockSizeMultMax)\n    return S_OK;\n  isBZ = true;\n  UInt32 dicSize = (UInt32)(s[3] - kArSig3) * kBlockSizeStep;\n\n  CombinedCrc.Init();\n  #ifdef COMPRESS_BZIP2_MT\n  if (MtMode)\n  {\n    NextBlockIndex = 0;\n    StreamWasFinished1 = StreamWasFinished2 = false;\n    CloseThreads = false;\n    CanStartWaitingEvent.Reset();\n    m_States[0].CanWriteEvent.Set();\n    BlockSizeMax = dicSize;\n    Result1 = Result2 = S_OK;\n    CanProcessEvent.Set();\n    UInt32 t;\n    for (t = 0; t < NumThreads; t++)\n      m_States[t].StreamWasFinishedEvent.Lock();\n    CanProcessEvent.Reset();\n    CanStartWaitingEvent.Set();\n    for (t = 0; t < NumThreads; t++)\n      m_States[t].WaitingWasStartedEvent.Lock();\n    CanStartWaitingEvent.Reset();\n    RINOK(Result2);\n    RINOK(Result1);\n  }\n  else\n  #endif\n  {\n    CState &state = m_States[0];\n    for (;;)\n    {\n      if (progress)\n      {\n        UInt64 packSize = m_InStream.GetProcessedSize();\n        UInt64 unpackSize = m_OutStream.GetProcessedSize();\n        RINOK(progress->SetRatioInfo(&packSize, &unpackSize));\n      }\n      bool wasFinished;\n      UInt32 crc;\n      RINOK(ReadSignatures(wasFinished, crc));\n      if (wasFinished)\n        return S_OK;\n\n      UInt32 blockSize, origPtr;\n      bool randMode;\n      RINOK(ReadBlock(&m_InStream, state.Counters, dicSize,\n        m_Selectors, m_HuffmanDecoders,\n        &blockSize, &origPtr, &randMode));\n      DecodeBlock1(state.Counters, blockSize);\n      if ((randMode ?\n          DecodeBlock2Rand(state.Counters + 256, blockSize, origPtr, m_OutStream) :\n          DecodeBlock2(state.Counters + 256, blockSize, origPtr, m_OutStream)) != crc)\n        return S_FALSE;\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)\n{\n  if (!m_InStream.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n  if (!m_OutStream.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n\n  m_InStream.SetStream(inStream);\n  m_InStream.Init();\n\n  m_OutStream.SetStream(outStream);\n  m_OutStream.Init();\n\n  CDecoderFlusher flusher(this);\n\n  bool isBZ;\n  RINOK(DecodeFile(isBZ, progress));\n  return isBZ ? S_OK: S_FALSE;\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  return CodeReal(inStream, outStream, inSize, outSize, progress); \n}\n\nSTDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value)\n{\n  if (value == NULL)\n    return E_INVALIDARG;\n  *value = m_InStream.GetProcessedSize();\n  return S_OK;\n}\n\n#ifdef COMPRESS_BZIP2_MT\n\nstatic THREAD_FUNC_DECL MFThread(void *p) { ((CState *)p)->ThreadFunc(); return 0; }\n\nHRESULT CState::Create()\n{\n  RINOK_THREAD(StreamWasFinishedEvent.CreateIfNotCreated());\n  RINOK_THREAD(WaitingWasStartedEvent.CreateIfNotCreated());\n  RINOK_THREAD(CanWriteEvent.CreateIfNotCreated());\n  RINOK_THREAD(Thread.Create(MFThread, this));\n  return S_OK;\n}\n\nvoid CState::FinishStream()\n{\n  Decoder->StreamWasFinished1 = true;\n  StreamWasFinishedEvent.Set();\n  Decoder->CS.Leave();\n  Decoder->CanStartWaitingEvent.Lock();\n  WaitingWasStartedEvent.Set();\n}\n\nvoid CState::ThreadFunc()\n{\n  for (;;)\n  {\n    Decoder->CanProcessEvent.Lock();\n    Decoder->CS.Enter();\n    if (Decoder->CloseThreads)\n    {\n      Decoder->CS.Leave();\n      return;\n    }\n    if (Decoder->StreamWasFinished1)\n    {\n      FinishStream();\n      continue;\n    }\n    HRESULT res = S_OK;\n\n    UInt32 blockIndex = Decoder->NextBlockIndex;\n    UInt32 nextBlockIndex = blockIndex + 1;\n    if (nextBlockIndex == Decoder->NumThreads)\n      nextBlockIndex = 0;\n    Decoder->NextBlockIndex = nextBlockIndex;\n    UInt32 crc;\n    UInt64 packSize;\n    UInt32 blockSize = 0, origPtr = 0;\n    bool randMode = false;\n\n    try\n    {\n      bool wasFinished;\n      res = Decoder->ReadSignatures(wasFinished, crc);\n      if (res != S_OK)\n      {\n        Decoder->Result1 = res;\n        FinishStream();\n        continue;\n      }\n      if (wasFinished)\n      {\n        Decoder->Result1 = res;\n        FinishStream();\n        continue;\n      }\n\n      res = ReadBlock(&Decoder->m_InStream, Counters, Decoder->BlockSizeMax,\n          Decoder->m_Selectors, Decoder->m_HuffmanDecoders,\n          &blockSize, &origPtr, &randMode);\n      if (res != S_OK)\n      {\n        Decoder->Result1 = res;\n        FinishStream();\n        continue;\n      }\n      packSize = Decoder->m_InStream.GetProcessedSize();\n    }\n    catch(const CInBufferException &e) { res = e.ErrorCode;  if (res != S_OK) res = E_FAIL; }\n    catch(...) { res = E_FAIL; }\n    if (res != S_OK)\n    {\n      Decoder->Result1 = res;\n      FinishStream();\n      continue;\n    }\n\n    Decoder->CS.Leave();\n\n    DecodeBlock1(Counters, blockSize);\n\n    bool needFinish = true;\n    try\n    {\n      Decoder->m_States[blockIndex].CanWriteEvent.Lock();\n      needFinish = Decoder->StreamWasFinished2;\n      if (!needFinish)\n      {\n        if ((randMode ?\n          DecodeBlock2Rand(Counters + 256, blockSize, origPtr, Decoder->m_OutStream) :\n          DecodeBlock2(Counters + 256, blockSize, origPtr, Decoder->m_OutStream)) == crc)\n        {\n          if (Decoder->Progress)\n          {\n            UInt64 unpackSize = Decoder->m_OutStream.GetProcessedSize();\n            res = Decoder->Progress->SetRatioInfo(&packSize, &unpackSize);\n          }\n        }\n        else\n          res = S_FALSE;\n      }\n    }\n    catch(const COutBufferException &e) { res = e.ErrorCode; if (res != S_OK) res = E_FAIL; }\n    catch(...) { res = E_FAIL; }\n    if (res != S_OK)\n    {\n      Decoder->Result2 = res;\n      Decoder->StreamWasFinished2 = true;\n    }\n    Decoder->m_States[nextBlockIndex].CanWriteEvent.Set();\n    if (res != S_OK || needFinish)\n    {\n      StreamWasFinishedEvent.Set();\n      Decoder->CanStartWaitingEvent.Lock();\n      WaitingWasStartedEvent.Set();\n    }\n  }\n}\n\nSTDMETHODIMP CDecoder::SetNumberOfThreads(UInt32 numThreads)\n{\n  NumThreads = numThreads;\n  if (NumThreads < 1)\n    NumThreads = 1;\n  if (NumThreads > kNumThreadsMax)\n    NumThreads = kNumThreadsMax;\n  return S_OK;\n}\n#endif\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Decoder.h",
    "content": "// Compress/BZip2Decoder.h\n\n#ifndef __COMPRESS_BZIP2_DECODER_H\n#define __COMPRESS_BZIP2_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#ifdef COMPRESS_BZIP2_MT\n#include \"../../Windows/Synchronization.h\"\n#include \"../../Windows/Thread.h\"\n#endif\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n#include \"../Common/OutBuffer.h\"\n\n#include \"BitmDecoder.h\"\n#include \"BZip2Const.h\"\n#include \"BZip2Crc.h\"\n#include \"HuffmanDecoder.h\"\n\nnamespace NCompress {\nnamespace NBZip2 {\n\ntypedef NCompress::NHuffman::CDecoder<kMaxHuffmanLen, kMaxAlphaSize> CHuffmanDecoder;\n\nclass CDecoder;\n\nstruct CState\n{\n  UInt32 *Counters;\n\n  #ifdef COMPRESS_BZIP2_MT\n\n  CDecoder *Decoder;\n  NWindows::CThread Thread;\n  bool m_OptimizeNumTables;\n\n  NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;\n  NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;\n\n  // it's not member of this thread. We just need one event per thread\n  NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;\n\n  Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.\n\n  HRESULT Create();\n  void FinishStream();\n  void ThreadFunc();\n\n  #endif\n\n  CState(): Counters(0) {}\n  ~CState() { Free(); }\n  bool Alloc();\n  void Free();\n};\n\nclass CDecoder :\n  public ICompressCoder,\n  #ifdef COMPRESS_BZIP2_MT\n  public ICompressSetCoderMt,\n  #endif\n  public ICompressGetInStreamProcessedSize,\n  public CMyUnknownImp\n{\npublic:\n  COutBuffer m_OutStream;\n  Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.\n  NBitm::CDecoder<CInBuffer> m_InStream;\n  Byte m_Selectors[kNumSelectorsMax];\n  CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax];\nprivate:\n\n  UInt32 m_NumThreadsPrev;\n\n  UInt32 ReadBits(int numBits);\n  Byte ReadByte();\n  bool ReadBit();\n  UInt32 ReadCrc();\n  HRESULT PrepareBlock(CState &state);\n  HRESULT DecodeFile(bool &isBZ, ICompressProgressInfo *progress);\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  class CDecoderFlusher\n  {\n    CDecoder *_decoder;\n  public:\n    bool NeedFlush;\n    CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {}\n    ~CDecoderFlusher()\n    {\n      if (NeedFlush)\n        _decoder->Flush();\n      _decoder->ReleaseStreams();\n    }\n  };\n\npublic:\n  CBZip2CombinedCrc CombinedCrc;\n\n  #ifdef COMPRESS_BZIP2_MT\n  ICompressProgressInfo *Progress;\n  CState *m_States;\n\n  NWindows::NSynchronization::CManualResetEvent CanProcessEvent;\n  NWindows::NSynchronization::CCriticalSection CS;\n  UInt32 NumThreads;\n  bool MtMode;\n  UInt32 NextBlockIndex;\n  bool CloseThreads;\n  bool StreamWasFinished1;\n  bool StreamWasFinished2;\n  NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;\n\n  HRESULT Result1;\n  HRESULT Result2;\n\n  UInt32 BlockSizeMax;\n  CDecoder();\n  ~CDecoder();\n  HRESULT Create();\n  void Free();\n\n  #else\n  CState m_States[1];\n  #endif\n\n  HRESULT ReadSignatures(bool &wasFinished, UInt32 &crc);\n\n\n  HRESULT Flush() { return m_OutStream.Flush(); }\n  void ReleaseStreams()\n  {\n    m_InStream.ReleaseStream();\n    m_OutStream.ReleaseStream();\n  }\n\n  #ifdef COMPRESS_BZIP2_MT\n  MY_UNKNOWN_IMP2(ICompressSetCoderMt, ICompressGetInStreamProcessedSize)\n  #else\n  MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize)\n  #endif\n\n  \n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);\n\n  #ifdef COMPRESS_BZIP2_MT\n  STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);\n  #endif\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Encoder.cpp",
    "content": "// BZip2Encoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n#include \"../../../C/BwtSort.h\"\n#include \"../../../C/HuffEnc.h\"\n}\n\n#include \"BZip2Crc.h\"\n#include \"BZip2Encoder.h\"\n#include \"Mtf8.h\"\n\nnamespace NCompress {\nnamespace NBZip2 {\n\nconst int kMaxHuffmanLenForEncoding = 16; // it must be < kMaxHuffmanLen = 20\n\nstatic const UInt32 kBufferSize = (1 << 17);\nstatic const int kNumHuffPasses = 4;\n\nbool CThreadInfo::Alloc()\n{\n  if (m_BlockSorterIndex == 0)\n  {\n    m_BlockSorterIndex = (UInt32 *)::BigAlloc(BLOCK_SORT_BUF_SIZE(kBlockSizeMax) * sizeof(UInt32));\n    if (m_BlockSorterIndex == 0)\n      return false;\n  }\n\n  if (m_Block == 0)\n  {\n    m_Block = (Byte *)::MidAlloc(kBlockSizeMax * 5 + kBlockSizeMax / 10 + (20 << 10));\n    if (m_Block == 0)\n      return false;\n    m_MtfArray = m_Block + kBlockSizeMax;\n    m_TempArray = m_MtfArray + kBlockSizeMax * 2 + 2;\n  }\n  return true;\n}\n\nvoid CThreadInfo::Free()\n{\n  ::BigFree(m_BlockSorterIndex);\n  m_BlockSorterIndex = 0;\n  ::MidFree(m_Block);\n  m_Block = 0;\n}\n\n#ifdef COMPRESS_BZIP2_MT\n\nstatic THREAD_FUNC_DECL MFThread(void *threadCoderInfo)\n{\n  return ((CThreadInfo *)threadCoderInfo)->ThreadFunc();\n}\n\n#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; }\n\nHRESULT CThreadInfo::Create()\n{\n  RINOK_THREAD(StreamWasFinishedEvent.Create());\n  RINOK_THREAD(WaitingWasStartedEvent.Create());\n  RINOK_THREAD(CanWriteEvent.Create());\n  RINOK_THREAD(Thread.Create(MFThread, this));\n  return S_OK;\n}\n\nvoid CThreadInfo::FinishStream(bool needLeave)\n{\n  Encoder->StreamWasFinished = true;\n  StreamWasFinishedEvent.Set();\n  if (needLeave)\n    Encoder->CS.Leave();\n  Encoder->CanStartWaitingEvent.Lock();\n  WaitingWasStartedEvent.Set();\n}\n\nDWORD CThreadInfo::ThreadFunc()\n{\n  for (;;)\n  {\n    Encoder->CanProcessEvent.Lock();\n    Encoder->CS.Enter();\n    if (Encoder->CloseThreads)\n    {\n      Encoder->CS.Leave();\n      return 0;\n    }\n    if (Encoder->StreamWasFinished)\n    {\n      FinishStream(true);\n      continue;\n    }\n    HRESULT res = S_OK;\n    bool needLeave = true;\n    try\n    {\n      UInt32 blockSize = Encoder->ReadRleBlock(m_Block);\n      m_PackSize = Encoder->m_InStream.GetProcessedSize();\n      m_BlockIndex = Encoder->NextBlockIndex;\n      if (++Encoder->NextBlockIndex == Encoder->NumThreads)\n        Encoder->NextBlockIndex = 0;\n      if (blockSize == 0)\n      {\n        FinishStream(true);\n        continue;\n      }\n      Encoder->CS.Leave();\n      needLeave = false;\n      res = EncodeBlock3(blockSize);\n    }\n    catch(const CInBufferException &e)  { res = e.ErrorCode; }\n    catch(const COutBufferException &e) { res = e.ErrorCode; }\n    catch(...) { res = E_FAIL; }\n    if (res != S_OK)\n    {\n      Encoder->Result = res;\n      FinishStream(needLeave);\n      continue;\n    }\n  }\n}\n\n#endif\n\nCEncoder::CEncoder():\n  NumPasses(1),\n  m_OptimizeNumTables(false),\n  m_BlockSizeMult(kBlockSizeMultMax)\n{\n  #ifdef COMPRESS_BZIP2_MT\n  ThreadsInfo = 0;\n  m_NumThreadsPrev = 0;\n  NumThreads = 1;\n  #endif\n}\n\n#ifdef COMPRESS_BZIP2_MT\nCEncoder::~CEncoder()\n{\n  Free();\n}\n\nHRESULT CEncoder::Create()\n{\n  RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());\n  RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());\n  if (ThreadsInfo != 0 && m_NumThreadsPrev == NumThreads)\n    return S_OK;\n  try\n  {\n    Free();\n    MtMode = (NumThreads > 1);\n    m_NumThreadsPrev = NumThreads;\n    ThreadsInfo = new CThreadInfo[NumThreads];\n    if (ThreadsInfo == 0)\n      return E_OUTOFMEMORY;\n  }\n  catch(...) { return E_OUTOFMEMORY; }\n  for (UInt32 t = 0; t < NumThreads; t++)\n  {\n    CThreadInfo &ti = ThreadsInfo[t];\n    ti.Encoder = this;\n    if (MtMode)\n    {\n      HRESULT res = ti.Create();\n      if (res != S_OK)\n      {\n        NumThreads = t;\n        Free();\n        return res;\n      }\n    }\n  }\n  return S_OK;\n}\n\nvoid CEncoder::Free()\n{\n  if (!ThreadsInfo)\n    return;\n  CloseThreads = true;\n  CanProcessEvent.Set();\n  for (UInt32 t = 0; t < NumThreads; t++)\n  {\n    CThreadInfo &ti = ThreadsInfo[t];\n    if (MtMode)\n      ti.Thread.Wait();\n    ti.Free();\n  }\n  delete []ThreadsInfo;\n  ThreadsInfo = 0;\n}\n#endif\n\nUInt32 CEncoder::ReadRleBlock(Byte *buffer)\n{\n  UInt32 i = 0;\n  Byte prevByte;\n  if (m_InStream.ReadByte(prevByte))\n  {\n    UInt32 blockSize = m_BlockSizeMult * kBlockSizeStep - 1;\n    int numReps = 1;\n    buffer[i++] = prevByte;\n    while (i < blockSize) // \"- 1\" to support RLE\n    {\n      Byte b;\n      if (!m_InStream.ReadByte(b))\n        break;\n      if (b != prevByte)\n      {\n        if (numReps >= kRleModeRepSize)\n          buffer[i++] = (Byte)(numReps - kRleModeRepSize);\n        buffer[i++] = b;\n        numReps = 1;\n        prevByte = b;\n        continue;\n      }\n      numReps++;\n      if (numReps <= kRleModeRepSize)\n        buffer[i++] = b;\n      else if (numReps == kRleModeRepSize + 255)\n      {\n        buffer[i++] = (Byte)(numReps - kRleModeRepSize);\n        numReps = 0;\n      }\n    }\n    // it's to support original BZip2 decoder\n    if (numReps >= kRleModeRepSize)\n      buffer[i++] = (Byte)(numReps - kRleModeRepSize);\n  }\n  return i;\n}\n\nvoid CThreadInfo::WriteBits2(UInt32 value, UInt32 numBits)\n  { m_OutStreamCurrent->WriteBits(value, numBits); }\nvoid CThreadInfo::WriteByte2(Byte b) { WriteBits2(b , 8); }\nvoid CThreadInfo::WriteBit2(bool v) { WriteBits2((v ? 1 : 0), 1); }\nvoid CThreadInfo::WriteCrc2(UInt32 v)\n{\n  for (int i = 0; i < 4; i++)\n    WriteByte2(((Byte)(v >> (24 - i * 8))));\n}\n\nvoid CEncoder::WriteBits(UInt32 value, UInt32 numBits)\n  { m_OutStream.WriteBits(value, numBits); }\nvoid CEncoder::WriteByte(Byte b) { WriteBits(b , 8); }\nvoid CEncoder::WriteBit(bool v) { WriteBits((v ? 1 : 0), 1); }\nvoid CEncoder::WriteCrc(UInt32 v)\n{\n  for (int i = 0; i < 4; i++)\n    WriteByte(((Byte)(v >> (24 - i * 8))));\n}\n\n\n// blockSize > 0\nvoid CThreadInfo::EncodeBlock(const Byte *block, UInt32 blockSize)\n{\n  WriteBit2(false); // Randomised = false\n  \n  {\n    UInt32 origPtr = BlockSort(m_BlockSorterIndex, block, blockSize);\n    // if (m_BlockSorterIndex[origPtr] != 0) throw 1;\n    m_BlockSorterIndex[origPtr] = blockSize;\n    WriteBits2(origPtr, kNumOrigBits);\n  }\n\n  CMtf8Encoder mtf;\n  int numInUse = 0;\n  {\n    bool inUse[256];\n    bool inUse16[16];\n    UInt32 i;\n    for (i = 0; i < 256; i++)\n      inUse[i] = false;\n    for (i = 0; i < 16; i++)\n      inUse16[i] = false;\n    for (i = 0; i < blockSize; i++)\n      inUse[block[i]] = true;\n    for (i = 0; i < 256; i++)\n      if (inUse[i])\n      {\n        inUse16[i >> 4] = true;\n        mtf.Buf[numInUse++] = (Byte)i;\n      }\n    for (i = 0; i < 16; i++)\n      WriteBit2(inUse16[i]);\n    for (i = 0; i < 256; i++)\n      if (inUse16[i >> 4])\n        WriteBit2(inUse[i]);\n  }\n  int alphaSize = numInUse + 2;\n\n  Byte *mtfs = m_MtfArray;\n  UInt32 mtfArraySize = 0;\n  UInt32 symbolCounts[kMaxAlphaSize];\n  {\n    for (int i = 0; i < kMaxAlphaSize; i++)\n      symbolCounts[i] = 0;\n  }\n\n  {\n    UInt32 rleSize = 0;\n    UInt32 i = 0;\n    const UInt32 *bsIndex = m_BlockSorterIndex;\n    block--;\n    do\n    {\n      int pos = mtf.FindAndMove(block[bsIndex[i]]);\n      if (pos == 0)\n        rleSize++;\n      else\n      {\n        while (rleSize != 0)\n        {\n          rleSize--;\n          mtfs[mtfArraySize++] = (Byte)(rleSize & 1);\n          symbolCounts[rleSize & 1]++;\n          rleSize >>= 1;\n        }\n        if (pos >= 0xFE)\n        {\n          mtfs[mtfArraySize++] = 0xFF;\n          mtfs[mtfArraySize++] = (Byte)(pos - 0xFE);\n        }\n        else\n          mtfs[mtfArraySize++] = (Byte)(pos + 1);\n        symbolCounts[pos + 1]++;\n      }\n    }\n    while (++i < blockSize);\n\n    while (rleSize != 0)\n    {\n      rleSize--;\n      mtfs[mtfArraySize++] = (Byte)(rleSize & 1);\n      symbolCounts[rleSize & 1]++;\n      rleSize >>= 1;\n    }\n\n    if (alphaSize < 256)\n      mtfs[mtfArraySize++] = (Byte)(alphaSize - 1);\n    else\n    {\n      mtfs[mtfArraySize++] = 0xFF;\n      mtfs[mtfArraySize++] = (Byte)(alphaSize - 256);\n    }\n    symbolCounts[alphaSize - 1]++;\n  }\n\n  UInt32 numSymbols = 0;\n  {\n    for (int i = 0; i < kMaxAlphaSize; i++)\n      numSymbols += symbolCounts[i];\n  }\n\n  int bestNumTables = kNumTablesMin;\n  UInt32 bestPrice = 0xFFFFFFFF;\n  UInt32 startPos = m_OutStreamCurrent->GetPos();\n  Byte startCurByte = m_OutStreamCurrent->GetCurByte();\n  for (int nt = kNumTablesMin; nt <= kNumTablesMax + 1; nt++)\n  {\n    int numTables;\n\n    if(m_OptimizeNumTables)\n    {\n      m_OutStreamCurrent->SetPos(startPos);\n      m_OutStreamCurrent->SetCurState((startPos & 7), startCurByte);\n      if (nt <= kNumTablesMax)\n        numTables = nt;\n      else\n        numTables = bestNumTables;\n    }\n    else\n    {\n      if (numSymbols < 200)  numTables = 2;\n      else if (numSymbols < 600) numTables = 3;\n      else if (numSymbols < 1200) numTables = 4;\n      else if (numSymbols < 2400) numTables = 5;\n      else numTables = 6;\n    }\n\n    WriteBits2(numTables, kNumTablesBits);\n    \n    UInt32 numSelectors = (numSymbols + kGroupSize - 1) / kGroupSize;\n    WriteBits2(numSelectors, kNumSelectorsBits);\n    \n    {\n      UInt32 remFreq = numSymbols;\n      int gs = 0;\n      int t = numTables;\n      do\n      {\n        UInt32 tFreq = remFreq / t;\n        int ge = gs;\n        UInt32 aFreq = 0;\n        while (aFreq < tFreq) //  && ge < alphaSize)\n          aFreq += symbolCounts[ge++];\n        \n        if (ge - 1 > gs && t != numTables && t != 1 && (((numTables - t) & 1) == 1))\n          aFreq -= symbolCounts[--ge];\n        \n        Byte *lens = Lens[t - 1];\n        int i = 0;\n        do\n          lens[i] = (i >= gs && i < ge) ? 0 : 1;\n        while (++i < alphaSize);\n        gs = ge;\n        remFreq -= aFreq;\n      }\n      while(--t != 0);\n    }\n    \n    \n    for (int pass = 0; pass < kNumHuffPasses; pass++)\n    {\n      {\n        int t = 0;\n        do\n          memset(Freqs[t], 0, sizeof(Freqs[t]));\n        while(++t < numTables);\n      }\n      \n      {\n        UInt32 mtfPos = 0;\n        UInt32 g = 0;\n        do\n        {\n          UInt32 symbols[kGroupSize];\n          int i = 0;\n          do\n          {\n            UInt32 symbol = mtfs[mtfPos++];\n            if (symbol >= 0xFF)\n              symbol += mtfs[mtfPos++];\n            symbols[i] = symbol;\n          }\n          while (++i < kGroupSize && mtfPos < mtfArraySize);\n          \n          UInt32 bestPrice = 0xFFFFFFFF;\n          int t = 0;\n          do\n          {\n            const Byte *lens = Lens[t];\n            UInt32 price = 0;\n            int j = 0;\n            do\n              price += lens[symbols[j]];\n            while (++j < i);\n            if (price < bestPrice)\n            {\n              m_Selectors[g] = (Byte)t;\n              bestPrice = price;\n            }\n          }\n          while(++t < numTables);\n          UInt32 *freqs = Freqs[m_Selectors[g++]];\n          int j = 0;\n          do\n            freqs[symbols[j]]++;\n          while (++j < i);\n        }\n        while (mtfPos < mtfArraySize);\n      }\n      \n      int t = 0;\n      do\n      {\n        UInt32 *freqs = Freqs[t];\n        int i = 0;\n        do\n          if (freqs[i] == 0)\n            freqs[i] = 1;\n        while(++i < alphaSize);\n        Huffman_Generate(freqs, Codes[t], Lens[t], kMaxAlphaSize, kMaxHuffmanLenForEncoding);\n      }\n      while(++t < numTables);\n    }\n    \n    {\n      Byte mtfSel[kNumTablesMax];\n      {\n        int t = 0;\n        do\n          mtfSel[t] = (Byte)t;\n        while(++t < numTables);\n      }\n      \n      UInt32 i = 0;\n      do\n      {\n        Byte sel = m_Selectors[i];\n        int pos;\n        for (pos = 0; mtfSel[pos] != sel; pos++)\n          WriteBit2(true);\n        WriteBit2(false);\n        for (; pos > 0; pos--)\n          mtfSel[pos] = mtfSel[pos - 1];\n        mtfSel[0] = sel;\n      }\n      while(++i < numSelectors);\n    }\n    \n    {\n      int t = 0;\n      do\n      {\n        const Byte *lens = Lens[t];\n        UInt32 len = lens[0];\n        WriteBits2(len, kNumLevelsBits);\n        int i = 0;\n        do\n        {\n          UInt32 level = lens[i];\n          while (len != level)\n          {\n            WriteBit2(true);\n            if (len < level)\n            {\n              WriteBit2(false);\n              len++;\n            }\n            else\n            {\n              WriteBit2(true);\n              len--;\n            }\n          }\n          WriteBit2(false);\n        }\n        while (++i < alphaSize);\n      }\n      while(++t < numTables);\n    }\n    \n    {\n      UInt32 groupSize = 0;\n      UInt32 groupIndex = 0;\n      const Byte *lens = 0;\n      const UInt32 *codes = 0;\n      UInt32 mtfPos = 0;\n      do\n      {\n        UInt32 symbol = mtfs[mtfPos++];\n        if (symbol >= 0xFF)\n          symbol += mtfs[mtfPos++];\n        if (groupSize == 0)\n        {\n          groupSize = kGroupSize;\n          int t = m_Selectors[groupIndex++];\n          lens = Lens[t];\n          codes = Codes[t];\n        }\n        groupSize--;\n        m_OutStreamCurrent->WriteBits(codes[symbol], lens[symbol]);\n      }\n      while (mtfPos < mtfArraySize);\n    }\n\n    if (!m_OptimizeNumTables)\n      break;\n    UInt32 price = m_OutStreamCurrent->GetPos() - startPos;\n    if (price <= bestPrice)\n    {\n      if (nt == kNumTablesMax)\n        break;\n      bestPrice = price;\n      bestNumTables = nt;\n    }\n  }\n}\n\n// blockSize > 0\nUInt32 CThreadInfo::EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize)\n{\n  WriteByte2(kBlockSig0);\n  WriteByte2(kBlockSig1);\n  WriteByte2(kBlockSig2);\n  WriteByte2(kBlockSig3);\n  WriteByte2(kBlockSig4);\n  WriteByte2(kBlockSig5);\n\n  CBZip2Crc crc;\n  int numReps = 0;\n  Byte prevByte = block[0];\n  UInt32 i = 0;\n  do\n  {\n    Byte b = block[i];\n    if (numReps == kRleModeRepSize)\n    {\n      for (; b > 0; b--)\n        crc.UpdateByte(prevByte);\n      numReps = 0;\n      continue;\n    }\n    if (prevByte == b)\n      numReps++;\n    else\n    {\n      numReps = 1;\n      prevByte = b;\n    }\n    crc.UpdateByte(b);\n  }\n  while (++i < blockSize);\n  UInt32 crcRes = crc.GetDigest();\n  WriteCrc2(crcRes);\n  EncodeBlock(block, blockSize);\n  return crcRes;\n}\n\nvoid CThreadInfo::EncodeBlock2(const Byte *block, UInt32 blockSize, UInt32 numPasses)\n{\n  UInt32 numCrcs = m_NumCrcs;\n  bool needCompare = false;\n\n  UInt32 startBytePos = m_OutStreamCurrent->GetBytePos();\n  UInt32 startPos = m_OutStreamCurrent->GetPos();\n  Byte startCurByte = m_OutStreamCurrent->GetCurByte();\n  Byte endCurByte = 0;\n  UInt32 endPos = 0;\n  if (numPasses > 1 && blockSize >= (1 << 10))\n  {\n    UInt32 blockSize0 = blockSize / 2;\n    for (;(block[blockSize0] == block[blockSize0 - 1] ||\n          block[blockSize0 - 1] == block[blockSize0 - 2]) &&\n          blockSize0 < blockSize; blockSize0++);\n    if (blockSize0 < blockSize)\n    {\n      EncodeBlock2(block, blockSize0, numPasses - 1);\n      EncodeBlock2(block + blockSize0, blockSize - blockSize0, numPasses - 1);\n      endPos = m_OutStreamCurrent->GetPos();\n      endCurByte = m_OutStreamCurrent->GetCurByte();\n      if ((endPos & 7) > 0)\n        WriteBits2(0, 8 - (endPos & 7));\n      m_OutStreamCurrent->SetCurState((startPos & 7), startCurByte);\n      needCompare = true;\n    }\n  }\n\n  UInt32 startBytePos2 = m_OutStreamCurrent->GetBytePos();\n  UInt32 startPos2 = m_OutStreamCurrent->GetPos();\n  UInt32 crcVal = EncodeBlockWithHeaders(block, blockSize);\n  UInt32 endPos2 = m_OutStreamCurrent->GetPos();\n\n  if (needCompare)\n  {\n    UInt32 size2 = endPos2 - startPos2;\n    if (size2 < endPos - startPos)\n    {\n      UInt32 numBytes = m_OutStreamCurrent->GetBytePos() - startBytePos2;\n      Byte *buffer = m_OutStreamCurrent->GetStream();\n      for (UInt32 i = 0; i < numBytes; i++)\n        buffer[startBytePos + i] = buffer[startBytePos2 + i];\n      m_OutStreamCurrent->SetPos(startPos + endPos2 - startPos2);\n      m_NumCrcs = numCrcs;\n      m_CRCs[m_NumCrcs++] = crcVal;\n    }\n    else\n    {\n      m_OutStreamCurrent->SetPos(endPos);\n      m_OutStreamCurrent->SetCurState((endPos & 7), endCurByte);\n    }\n  }\n  else\n  {\n    m_NumCrcs = numCrcs;\n    m_CRCs[m_NumCrcs++] = crcVal;\n  }\n}\n\nHRESULT CThreadInfo::EncodeBlock3(UInt32 blockSize)\n{\n  CMsbfEncoderTemp outStreamTemp;\n  outStreamTemp.SetStream(m_TempArray);\n  outStreamTemp.Init();\n  m_OutStreamCurrent = &outStreamTemp;\n\n  m_NumCrcs = 0;\n\n  EncodeBlock2(m_Block, blockSize, Encoder->NumPasses);\n\n  #ifdef COMPRESS_BZIP2_MT\n  if (Encoder->MtMode)\n    Encoder->ThreadsInfo[m_BlockIndex].CanWriteEvent.Lock();\n  #endif\n  for (UInt32 i = 0; i < m_NumCrcs; i++)\n    Encoder->CombinedCrc.Update(m_CRCs[i]);\n  Encoder->WriteBytes(m_TempArray, outStreamTemp.GetPos(), outStreamTemp.GetCurByte());\n  HRESULT res = S_OK;\n  #ifdef COMPRESS_BZIP2_MT\n  if (Encoder->MtMode)\n  {\n    UInt32 blockIndex = m_BlockIndex + 1;\n    if (blockIndex == Encoder->NumThreads)\n      blockIndex = 0;\n\n    if (Encoder->Progress)\n    {\n      UInt64 unpackSize = Encoder->m_OutStream.GetProcessedSize();\n      res = Encoder->Progress->SetRatioInfo(&m_PackSize, &unpackSize);\n    }\n\n    Encoder->ThreadsInfo[blockIndex].CanWriteEvent.Set();\n  }\n  #endif\n  return res;\n}\n\nvoid CEncoder::WriteBytes(const Byte *data, UInt32 sizeInBits, Byte lastByte)\n{\n  UInt32 bytesSize = (sizeInBits / 8);\n  for (UInt32 i = 0; i < bytesSize; i++)\n    m_OutStream.WriteBits(data[i], 8);\n  WriteBits(lastByte, (sizeInBits & 7));\n}\n\n\nHRESULT CEncoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)\n{\n  #ifdef COMPRESS_BZIP2_MT\n  Progress = progress;\n  RINOK(Create());\n  for (UInt32 t = 0; t < NumThreads; t++)\n  #endif\n  {\n    #ifdef COMPRESS_BZIP2_MT\n    CThreadInfo &ti = ThreadsInfo[t];\n    if (MtMode)\n    {\n      RINOK(ti.StreamWasFinishedEvent.Reset());\n      RINOK(ti.WaitingWasStartedEvent.Reset());\n      RINOK(ti.CanWriteEvent.Reset());\n    }\n    #else\n    CThreadInfo &ti = ThreadsInfo;\n    ti.Encoder = this;\n    #endif\n\n    ti.m_OptimizeNumTables = m_OptimizeNumTables;\n\n    if (!ti.Alloc())\n      return E_OUTOFMEMORY;\n  }\n\n\n  if (!m_InStream.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n  if (!m_OutStream.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n\n\n  m_InStream.SetStream(inStream);\n  m_InStream.Init();\n\n  m_OutStream.SetStream(outStream);\n  m_OutStream.Init();\n\n  CFlusher flusher(this);\n\n  CombinedCrc.Init();\n  #ifdef COMPRESS_BZIP2_MT\n  NextBlockIndex = 0;\n  StreamWasFinished = false;\n  CloseThreads = false;\n  CanStartWaitingEvent.Reset();\n  #endif\n\n  WriteByte(kArSig0);\n  WriteByte(kArSig1);\n  WriteByte(kArSig2);\n  WriteByte((Byte)(kArSig3 + m_BlockSizeMult));\n\n  #ifdef COMPRESS_BZIP2_MT\n\n  if (MtMode)\n  {\n    ThreadsInfo[0].CanWriteEvent.Set();\n    Result = S_OK;\n    CanProcessEvent.Set();\n    UInt32 t;\n    for (t = 0; t < NumThreads; t++)\n      ThreadsInfo[t].StreamWasFinishedEvent.Lock();\n    CanProcessEvent.Reset();\n    CanStartWaitingEvent.Set();\n    for (t = 0; t < NumThreads; t++)\n      ThreadsInfo[t].WaitingWasStartedEvent.Lock();\n    CanStartWaitingEvent.Reset();\n    RINOK(Result);\n  }\n  else\n  #endif\n  {\n    for (;;)\n    {\n      CThreadInfo &ti =\n      #ifdef COMPRESS_BZIP2_MT\n      ThreadsInfo[0];\n      #else\n      ThreadsInfo;\n      #endif\n      UInt32 blockSize = ReadRleBlock(ti.m_Block);\n      if (blockSize == 0)\n        break;\n      RINOK(ti.EncodeBlock3(blockSize));\n      if (progress)\n      {\n        UInt64 packSize = m_InStream.GetProcessedSize();\n        UInt64 unpackSize = m_OutStream.GetProcessedSize();\n        RINOK(progress->SetRatioInfo(&packSize, &unpackSize));\n      }\n    }\n  }\n  WriteByte(kFinSig0);\n  WriteByte(kFinSig1);\n  WriteByte(kFinSig2);\n  WriteByte(kFinSig3);\n  WriteByte(kFinSig4);\n  WriteByte(kFinSig5);\n\n  WriteCrc(CombinedCrc.GetDigest());\n  return S_OK;\n}\n\nSTDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  return CodeReal(inStream, outStream, inSize, outSize, progress); \n}\n\nHRESULT CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)\n{\n  for(UInt32 i = 0; i < numProps; i++)\n  {\n    const PROPVARIANT &prop = props[i];\n    switch(propIDs[i])\n    {\n      case NCoderPropID::kNumPasses:\n      {\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        UInt32 numPasses = prop.ulVal;\n        if (numPasses == 0)\n          numPasses = 1;\n        if (numPasses > kNumPassesMax)\n          numPasses = kNumPassesMax;\n        NumPasses = numPasses;\n        m_OptimizeNumTables = (NumPasses > 1);\n        break;\n      }\n      case NCoderPropID::kDictionarySize:\n      {\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        UInt32 dictionary = prop.ulVal / kBlockSizeStep;\n        if (dictionary < kBlockSizeMultMin)\n          dictionary = kBlockSizeMultMin;\n        else if (dictionary > kBlockSizeMultMax)\n          dictionary = kBlockSizeMultMax;\n        m_BlockSizeMult = dictionary;\n        break;\n      }\n      case NCoderPropID::kNumThreads:\n      {\n        #ifdef COMPRESS_BZIP2_MT\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        NumThreads = prop.ulVal;\n        if (NumThreads < 1)\n          NumThreads = 1;\n        #endif\n        break;\n      }\n      default:\n        return E_INVALIDARG;\n    }\n  }\n  return S_OK;\n}\n\n#ifdef COMPRESS_BZIP2_MT\nSTDMETHODIMP CEncoder::SetNumberOfThreads(UInt32 numThreads)\n{\n  NumThreads = numThreads;\n  if (NumThreads < 1)\n    NumThreads = 1;\n  return S_OK;\n}\n#endif\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Encoder.h",
    "content": "// Compress/BZip2Encoder.h\n\n#ifndef __COMPRESS_BZIP2_ENCODER_H\n#define __COMPRESS_BZIP2_ENCODER_H\n\n#include \"../../Common/Defs.h\"\n#include \"../../Common/MyCom.h\"\n\n#ifdef COMPRESS_BZIP2_MT\n#include \"../../Windows/Synchronization.h\"\n#include \"../../Windows/Thread.h\"\n#endif\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n#include \"../Common/OutBuffer.h\"\n\n#include \"BitmEncoder.h\"\n#include \"BZip2Const.h\"\n#include \"BZip2Crc.h\"\n\nnamespace NCompress {\nnamespace NBZip2 {\n\nclass CMsbfEncoderTemp\n{\n  UInt32 m_Pos;\n  int m_BitPos;\n  Byte m_CurByte;\n  Byte *Buffer;\npublic:\n  void SetStream(Byte *buffer) { Buffer = buffer;  }\n  Byte *GetStream() const { return Buffer; }\n\n  void Init()\n  {\n    m_Pos = 0;\n    m_BitPos = 8;\n    m_CurByte = 0;\n  }\n\n  void Flush()\n  {\n    if (m_BitPos < 8)\n      WriteBits(0, m_BitPos);\n  }\n\n  void WriteBits(UInt32 value, int numBits)\n  {\n    while (numBits > 0)\n    {\n      int numNewBits = MyMin(numBits, m_BitPos);\n      numBits -= numNewBits;\n      \n      m_CurByte <<= numNewBits;\n      UInt32 newBits = value >> numBits;\n      m_CurByte |= Byte(newBits);\n      value -= (newBits << numBits);\n      \n      m_BitPos -= numNewBits;\n      \n      if (m_BitPos == 0)\n      {\n       Buffer[m_Pos++] = m_CurByte;\n        m_BitPos = 8;\n      }\n    }\n  }\n  \n  UInt32 GetBytePos() const { return m_Pos ; }\n  UInt32 GetPos() const { return m_Pos * 8 + (8 - m_BitPos); }\n  Byte GetCurByte() const { return m_CurByte; }\n  void SetPos(UInt32 bitPos)\n  {\n    m_Pos = bitPos / 8;\n    m_BitPos = 8 - ((int)bitPos & 7);\n  }\n  void SetCurState(int bitPos, Byte curByte)\n  {\n    m_BitPos = 8 - bitPos;\n    m_CurByte = curByte;\n  }\n};\n\nclass CEncoder;\n\nconst int kNumPassesMax = 10;\n\nclass CThreadInfo\n{\npublic:\n  Byte *m_Block;\nprivate:\n  Byte *m_MtfArray;\n  Byte *m_TempArray;\n  UInt32 *m_BlockSorterIndex;\n\n  CMsbfEncoderTemp *m_OutStreamCurrent;\n\n  Byte Lens[kNumTablesMax][kMaxAlphaSize];\n  UInt32 Freqs[kNumTablesMax][kMaxAlphaSize];\n  UInt32 Codes[kNumTablesMax][kMaxAlphaSize];\n\n  Byte m_Selectors[kNumSelectorsMax];\n\n  UInt32 m_CRCs[1 << kNumPassesMax];\n  UInt32 m_NumCrcs;\n\n  UInt32 m_BlockIndex;\n\n  void WriteBits2(UInt32 value, UInt32 numBits);\n  void WriteByte2(Byte b);\n  void WriteBit2(bool v);\n  void WriteCrc2(UInt32 v);\n\n  void EncodeBlock(const Byte *block, UInt32 blockSize);\n  UInt32 EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize);\n  void EncodeBlock2(const Byte *block, UInt32 blockSize, UInt32 numPasses);\npublic:\n  bool m_OptimizeNumTables;\n  CEncoder *Encoder;\n  #ifdef COMPRESS_BZIP2_MT\n  NWindows::CThread Thread;\n\n  NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;\n  NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;\n\n  // it's not member of this thread. We just need one event per thread\n  NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;\n\n  UInt64 m_PackSize;\n\n  Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.\n  HRESULT Create();\n  void FinishStream(bool needLeave);\n  DWORD ThreadFunc();\n  #endif\n\n  CThreadInfo(): m_BlockSorterIndex(0), m_Block(0) {}\n  ~CThreadInfo() { Free(); }\n  bool Alloc();\n  void Free();\n\n  HRESULT EncodeBlock3(UInt32 blockSize);\n};\n\nclass CEncoder :\n  public ICompressCoder,\n  public ICompressSetCoderProperties,\n  #ifdef COMPRESS_BZIP2_MT\n  public ICompressSetCoderMt,\n  #endif\n  public CMyUnknownImp\n{\n  UInt32 m_BlockSizeMult;\n  bool m_OptimizeNumTables;\n\n  UInt32 m_NumPassesPrev;\n\n  UInt32 m_NumThreadsPrev;\npublic:\n  CInBuffer m_InStream;\n  Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.\n  CBitmEncoder<COutBuffer> m_OutStream;\n  UInt32 NumPasses;\n  CBZip2CombinedCrc CombinedCrc;\n\n  #ifdef COMPRESS_BZIP2_MT\n  CThreadInfo *ThreadsInfo;\n  NWindows::NSynchronization::CManualResetEvent CanProcessEvent;\n  NWindows::NSynchronization::CCriticalSection CS;\n  UInt32 NumThreads;\n  bool MtMode;\n  UInt32 NextBlockIndex;\n\n  bool CloseThreads;\n  bool StreamWasFinished;\n  NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;\n\n  HRESULT Result;\n  ICompressProgressInfo *Progress;\n  #else\n  CThreadInfo ThreadsInfo;\n  #endif\n\n  UInt32 ReadRleBlock(Byte *buffer);\n  void WriteBytes(const Byte *data, UInt32 sizeInBits, Byte lastByte);\n\n  void WriteBits(UInt32 value, UInt32 numBits);\n  void WriteByte(Byte b);\n  void WriteBit(bool v);\n  void WriteCrc(UInt32 v);\n\n  #ifdef COMPRESS_BZIP2_MT\n  HRESULT Create();\n  void Free();\n  #endif\n\npublic:\n  CEncoder();\n  #ifdef COMPRESS_BZIP2_MT\n  ~CEncoder();\n  #endif\n\n  HRESULT Flush() { return m_OutStream.Flush(); }\n  \n  void ReleaseStreams()\n  {\n    m_InStream.ReleaseStream();\n    m_OutStream.ReleaseStream();\n  }\n\n  class CFlusher\n  {\n    CEncoder *_coder;\n  public:\n    bool NeedFlush;\n    CFlusher(CEncoder *coder): _coder(coder), NeedFlush(true) {}\n    ~CFlusher()\n    {\n      if (NeedFlush)\n        _coder->Flush();\n      _coder->ReleaseStreams();\n    }\n  };\n\n  #ifdef COMPRESS_BZIP2_MT\n  MY_UNKNOWN_IMP2(ICompressSetCoderMt, ICompressSetCoderProperties)\n  #else\n  MY_UNKNOWN_IMP1(ICompressSetCoderProperties)\n  #endif\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);\n\n  #ifdef COMPRESS_BZIP2_MT\n  STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);\n  #endif\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BZip2Register.cpp",
    "content": "// BZip2Register.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"BZip2Decoder.h\"\n\nstatic void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CDecoder); }\n#if !defined(EXTRACT_ONLY) && !defined(BZIP2_EXTRACT_ONLY)\n#include \"BZip2Encoder.h\"\nstatic void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CEncoder);  }\n#else\n#define CreateCodecOut 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodec, CreateCodecOut, 0x040202, L\"BZip2\", 1, false };\n\nvoid RegisterBZip2Codec()\n{\n\tRegisterCodec(&g_CodecInfo);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Bcj2Coder.cpp",
    "content": "// Bcj2Coder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"Bcj2Coder.h\"\n\nnamespace NCompress {\nnamespace NBcj2 {\n\ninline bool IsJcc(Byte b0, Byte b1) { return (b0 == 0x0F && (b1 & 0xF0) == 0x80); }\ninline bool IsJ(Byte b0, Byte b1) { return ((b1 & 0xFE) == 0xE8 || IsJcc(b0, b1)); }\ninline unsigned GetIndex(Byte b0, Byte b1) { return ((b1 == 0xE8) ? b0 : ((b1 == 0xE9) ? 256 : 257)); }\n\n#ifndef EXTRACT_ONLY\n\nstatic const int kBufferSize = 1 << 17;\n\nstatic bool inline Test86MSByte(Byte b)\n{\n  return (b == 0 || b == 0xFF);\n}\n\nbool CEncoder::Create()\n{\n  if (!_mainStream.Create(1 << 16))\n    return false;\n  if (!_callStream.Create(1 << 20))\n    return false;\n  if (!_jumpStream.Create(1 << 20))\n    return false;\n  if (!_rangeEncoder.Create(1 << 20))\n    return false;\n  if (_buffer == 0)\n  {\n    _buffer = (Byte *)MidAlloc(kBufferSize);\n    if (_buffer == 0)\n      return false;\n  }\n  return true;\n}\n\nCEncoder::~CEncoder()\n{\n  ::MidFree(_buffer);\n}\n\nHRESULT CEncoder::Flush()\n{\n  RINOK(_mainStream.Flush());\n  RINOK(_callStream.Flush());\n  RINOK(_jumpStream.Flush());\n  _rangeEncoder.FlushData();\n  return _rangeEncoder.FlushStream();\n}\n\nconst UInt32 kDefaultLimit = (1 << 24);\n\nHRESULT CEncoder::CodeReal(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 ** /* outSizes */,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress)\n{\n  if (numInStreams != 1 || numOutStreams != 4)\n    return E_INVALIDARG;\n\n  if (!Create())\n    return E_OUTOFMEMORY;\n\n  bool sizeIsDefined = false;\n  UInt64 inSize = 0;\n  if (inSizes != NULL)\n    if (inSizes[0] != NULL)\n    {\n      inSize = *inSizes[0];\n      if (inSize <= kDefaultLimit)\n        sizeIsDefined = true;\n    }\n\n  ISequentialInStream *inStream = inStreams[0];\n\n  _mainStream.SetStream(outStreams[0]);\n  _mainStream.Init();\n  _callStream.SetStream(outStreams[1]);\n  _callStream.Init();\n  _jumpStream.SetStream(outStreams[2]);\n  _jumpStream.Init();\n  _rangeEncoder.SetStream(outStreams[3]);\n  _rangeEncoder.Init();\n  for (int i = 0; i < 256 + 2; i++)\n    _statusEncoder[i].Init();\n  CCoderReleaser releaser(this);\n\n  CMyComPtr<ICompressGetSubStreamSize> getSubStreamSize;\n  {\n    inStream->QueryInterface(IID_ICompressGetSubStreamSize, (void **)&getSubStreamSize);\n  }\n\n  UInt32 nowPos = 0;\n  UInt64 nowPos64 = 0;\n  UInt32 bufferPos = 0;\n\n  Byte prevByte = 0;\n\n  UInt64 subStreamIndex = 0;\n  UInt64 subStreamStartPos  = 0;\n  UInt64 subStreamEndPos = 0;\n\n  for (;;)\n  {\n    UInt32 processedSize = 0;\n    for (;;)\n    {\n      UInt32 size = kBufferSize - (bufferPos + processedSize);\n      UInt32 processedSizeLoc;\n      if (size == 0)\n        break;\n      RINOK(inStream->Read(_buffer + bufferPos + processedSize, size, &processedSizeLoc));\n      if (processedSizeLoc == 0)\n        break;\n      processedSize += processedSizeLoc;\n    }\n    UInt32 endPos = bufferPos + processedSize;\n    \n    if (endPos < 5)\n    {\n      // change it\n      for (bufferPos = 0; bufferPos < endPos; bufferPos++)\n      {\n        Byte b = _buffer[bufferPos];\n        _mainStream.WriteByte(b);\n        UInt32 index;\n        if (b == 0xE8)\n          index = prevByte;\n        else if (b == 0xE9)\n          index = 256;\n        else if (IsJcc(prevByte, b))\n          index = 257;\n        else\n        {\n          prevByte = b;\n          continue;\n        }\n        _statusEncoder[index].Encode(&_rangeEncoder, 0);\n        prevByte = b;\n      }\n      return Flush();\n    }\n\n    bufferPos = 0;\n\n    UInt32 limit = endPos - 5;\n    while(bufferPos <= limit)\n    {\n      Byte b = _buffer[bufferPos];\n      _mainStream.WriteByte(b);\n      if (!IsJ(prevByte, b))\n      {\n        bufferPos++;\n        prevByte = b;\n        continue;\n      }\n      Byte nextByte = _buffer[bufferPos + 4];\n      UInt32 src =\n        (UInt32(nextByte) << 24) |\n        (UInt32(_buffer[bufferPos + 3]) << 16) |\n        (UInt32(_buffer[bufferPos + 2]) << 8) |\n        (_buffer[bufferPos + 1]);\n      UInt32 dest = (nowPos + bufferPos + 5) + src;\n      // if (Test86MSByte(nextByte))\n      bool convert;\n      if (getSubStreamSize != NULL)\n      {\n        UInt64 currentPos = (nowPos64 + bufferPos);\n        while (subStreamEndPos < currentPos)\n        {\n          UInt64 subStreamSize;\n          HRESULT result = getSubStreamSize->GetSubStreamSize(subStreamIndex, &subStreamSize);\n          if (result == S_OK)\n          {\n            subStreamStartPos = subStreamEndPos;\n            subStreamEndPos += subStreamSize;\n            subStreamIndex++;\n          }\n          else if (result == S_FALSE || result == E_NOTIMPL)\n          {\n            getSubStreamSize.Release();\n            subStreamStartPos = 0;\n            subStreamEndPos = subStreamStartPos - 1;\n          }\n          else\n            return result;\n        }\n        if (getSubStreamSize == NULL)\n        {\n          if (sizeIsDefined)\n            convert = (dest < inSize);\n          else\n            convert = Test86MSByte(nextByte);\n        }\n        else if (subStreamEndPos - subStreamStartPos > kDefaultLimit)\n          convert = Test86MSByte(nextByte);\n        else\n        {\n          UInt64 dest64 = (currentPos + 5) + Int64(Int32(src));\n          convert = (dest64 >= subStreamStartPos && dest64 < subStreamEndPos);\n        }\n      }\n      else if (sizeIsDefined)\n        convert = (dest < inSize);\n      else\n        convert = Test86MSByte(nextByte);\n      unsigned index = GetIndex(prevByte, b);\n      if (convert)\n      {\n        _statusEncoder[index].Encode(&_rangeEncoder, 1);\n        bufferPos += 5;\n        COutBuffer &s = (b == 0xE8) ? _callStream : _jumpStream;\n        for (int i = 24; i >= 0; i -= 8)\n          s.WriteByte((Byte)(dest >> i));\n        prevByte = nextByte;\n      }\n      else\n      {\n        _statusEncoder[index].Encode(&_rangeEncoder, 0);\n        bufferPos++;\n        prevByte = b;\n      }\n    }\n    nowPos += bufferPos;\n    nowPos64 += bufferPos;\n\n    if (progress != NULL)\n    {\n      /*\n      const UInt64 compressedSize =\n        _mainStream.GetProcessedSize() +\n        _callStream.GetProcessedSize() +\n        _jumpStream.GetProcessedSize() +\n        _rangeEncoder.GetProcessedSize();\n      */\n      RINOK(progress->SetRatioInfo(&nowPos64, NULL));\n    }\n \n    UInt32 i = 0;\n    while(bufferPos < endPos)\n      _buffer[i++] = _buffer[bufferPos++];\n    bufferPos = i;\n  }\n}\n\nSTDMETHODIMP CEncoder::Code(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress)\n{\n  try\n  {\n    return CodeReal(inStreams, inSizes, numInStreams,\n      outStreams, outSizes,numOutStreams, progress);\n  }\n  catch(const COutBufferException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\n#endif\n\nHRESULT CDecoder::CodeReal(ISequentialInStream **inStreams,\n      const UInt64 ** /* inSizes */,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 ** /* outSizes */,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress)\n{\n  if (numInStreams != 4 || numOutStreams != 1)\n    return E_INVALIDARG;\n\n  if (!_mainInStream.Create(1 << 16))\n    return E_OUTOFMEMORY;\n  if (!_callStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n  if (!_jumpStream.Create(1 << 16))\n    return E_OUTOFMEMORY;\n  if (!_rangeDecoder.Create(1 << 20))\n    return E_OUTOFMEMORY;\n  if (!_outStream.Create(1 << 16))\n    return E_OUTOFMEMORY;\n\n  _mainInStream.SetStream(inStreams[0]);\n  _callStream.SetStream(inStreams[1]);\n  _jumpStream.SetStream(inStreams[2]);\n  _rangeDecoder.SetStream(inStreams[3]);\n  _outStream.SetStream(outStreams[0]);\n\n  _mainInStream.Init();\n  _callStream.Init();\n  _jumpStream.Init();\n  _rangeDecoder.Init();\n  _outStream.Init();\n\n  for (int i = 0; i < 256 + 2; i++)\n    _statusDecoder[i].Init();\n\n  CCoderReleaser releaser(this);\n\n  Byte prevByte = 0;\n  UInt32 processedBytes = 0;\n  for (;;)\n  {\n    if (processedBytes >= (1 << 20) && progress != NULL)\n    {\n      /*\n      const UInt64 compressedSize =\n        _mainInStream.GetProcessedSize() +\n        _callStream.GetProcessedSize() +\n        _jumpStream.GetProcessedSize() +\n        _rangeDecoder.GetProcessedSize();\n      */\n      const UInt64 nowPos64 = _outStream.GetProcessedSize();\n      RINOK(progress->SetRatioInfo(NULL, &nowPos64));\n      processedBytes = 0;\n    }\n    UInt32 i;\n    Byte b = 0;\n    const UInt32 kBurstSize = (1 << 18);\n    for (i = 0; i < kBurstSize; i++)\n    {\n      if (!_mainInStream.ReadByte(b))\n        return Flush();\n      _outStream.WriteByte(b);\n      if (IsJ(prevByte, b))\n        break;\n      prevByte = b;\n    }\n    processedBytes += i;\n    if (i == kBurstSize)\n      continue;\n    unsigned index = GetIndex(prevByte, b);\n    if (_statusDecoder[index].Decode(&_rangeDecoder) == 1)\n    {\n      UInt32 src = 0;\n      CInBuffer &s = (b == 0xE8) ? _callStream : _jumpStream;\n      for (int i = 0; i < 4; i++)\n      {\n        Byte b0;\n        if(!s.ReadByte(b0))\n          return S_FALSE;\n        src <<= 8;\n        src |= ((UInt32)b0);\n      }\n      UInt32 dest = src - (UInt32(_outStream.GetProcessedSize()) + 4) ;\n      _outStream.WriteByte((Byte)(dest));\n      _outStream.WriteByte((Byte)(dest >> 8));\n      _outStream.WriteByte((Byte)(dest >> 16));\n      _outStream.WriteByte((Byte)(dest >> 24));\n      prevByte = (Byte)(dest >> 24);\n      processedBytes += 4;\n    }\n    else\n      prevByte = b;\n  }\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress)\n{\n  try\n  {\n    return CodeReal(inStreams, inSizes, numInStreams,\n        outStreams, outSizes,numOutStreams, progress);\n  }\n  catch(const CInBufferException &e) { return e.ErrorCode; }\n  catch(const COutBufferException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Bcj2Coder.h",
    "content": "// Bcj2Coder.h\n\n#ifndef __COMPRESS_BCJ2_CODER_H\n#define __COMPRESS_BCJ2_CODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"RangeCoderBit.h\"\n\nnamespace NCompress {\nnamespace NBcj2 {\n\nconst int kNumMoveBits = 5;\n\n#ifndef EXTRACT_ONLY\n\nclass CEncoder:\n  public ICompressCoder2,\n  public CMyUnknownImp\n{\n  Byte *_buffer;\npublic:\n  CEncoder(): _buffer(0) {};\n  ~CEncoder();\n  bool Create();\n\n  COutBuffer _mainStream;\n  COutBuffer _callStream;\n  COutBuffer _jumpStream;\n  NCompress::NRangeCoder::CEncoder _rangeEncoder;\n  NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2];\n\n  HRESULT Flush();\n  void ReleaseStreams()\n  {\n    _mainStream.ReleaseStream();\n    _callStream.ReleaseStream();\n    _jumpStream.ReleaseStream();\n    _rangeEncoder.ReleaseStream();\n  }\n\n  class CCoderReleaser\n  {\n    CEncoder *_coder;\n  public:\n    CCoderReleaser(CEncoder *coder): _coder(coder) {}\n    ~CCoderReleaser() {  _coder->ReleaseStreams(); }\n  };\n\npublic:\n\n  MY_UNKNOWN_IMP\n\n  HRESULT CodeReal(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress);\n  STDMETHOD(Code)(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress);\n};\n\n#endif\n\nclass CDecoder:\n  public ICompressCoder2,\n  public CMyUnknownImp\n{\npublic:\n  CInBuffer _mainInStream;\n  CInBuffer _callStream;\n  CInBuffer _jumpStream;\n  NCompress::NRangeCoder::CDecoder _rangeDecoder;\n  NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2];\n\n  COutBuffer _outStream;\n\n  void ReleaseStreams()\n  {\n    _mainInStream.ReleaseStream();\n    _callStream.ReleaseStream();\n    _jumpStream.ReleaseStream();\n    _rangeDecoder.ReleaseStream();\n    _outStream.ReleaseStream();\n  }\n\n  HRESULT Flush() { return _outStream.Flush(); }\n  class CCoderReleaser\n  {\n    CDecoder *_coder;\n  public:\n    CCoderReleaser(CDecoder *coder): _coder(coder) {}\n    ~CCoderReleaser()  { _coder->ReleaseStreams(); }\n  };\n\npublic:\n  MY_UNKNOWN_IMP\n  HRESULT CodeReal(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress);\n  STDMETHOD(Code)(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Bcj2Register.cpp",
    "content": "// Bcj2Register.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"Bcj2Coder.h\"\n\nstatic void *CreateCodec() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CDecoder()); }\n#ifndef EXTRACT_ONLY\nstatic void *CreateCodecOut() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CEncoder());  }\n#else\n#define CreateCodecOut 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodec, CreateCodecOut, 0x0303011B, L\"BCJ2\", 4, false };\n\nREGISTER_CODEC(BCJ2)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BcjCoder.cpp",
    "content": "// BcjCoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"BcjCoder.h\"\n\nUInt32 CBCJ_x86_Encoder::SubFilter(Byte *data, UInt32 size)\n{\n  return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 1);\n}\n\nUInt32 CBCJ_x86_Decoder::SubFilter(Byte *data, UInt32 size)\n{\n  return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 0);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BcjCoder.h",
    "content": "// BcjCoder.h\n\n#ifndef __COMPRESS_BCJ_CODER_H\n#define __COMPRESS_BCJ_CODER_H\n\nextern \"C\"\n{\n#include \"../../../C/Bra.h\"\n}\n\n#include \"BranchCoder.h\"\n\nstruct CBranch86\n{\n  UInt32 _prevMask;\n  void x86Init() { x86_Convert_Init(_prevMask); }\n};\n\nMyClassB(BCJ_x86, 0x01, 3, CBranch86 ,\n    virtual void SubInit() { x86Init(); })\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BcjRegister.cpp",
    "content": "// BcjRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"BcjCoder.h\"\n\nstatic void *CreateCodec() { return (void *)(ICompressFilter *)(new CBCJ_x86_Decoder()); }\n#ifndef EXTRACT_ONLY\nstatic void *CreateCodecOut() { return (void *)(ICompressFilter *)(new CBCJ_x86_Encoder());  }\n#else\n#define CreateCodecOut 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodec, CreateCodecOut, 0x03030103, L\"BCJ\", 1, true };\n\nREGISTER_CODEC(BCJ)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BitlDecoder.cpp",
    "content": "// BitlDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"BitlDecoder.h\"\n\nnamespace NBitl {\n\nByte kInvertTable[256];\n\nstruct CInverterTableInitializer\n{\n  CInverterTableInitializer()\n  {\n    for (int i = 0; i < 256; i++)\n    {\n      int x = ((i & 0x55) << 1) | ((i & 0xAA) >> 1);\n      x = ((x & 0x33) << 2) | ((x & 0xCC) >> 2);\n      kInvertTable[i] = (Byte)(((x & 0x0F) << 4) | ((x & 0xF0) >> 4));\n    }\n  }\n} g_InverterTableInitializer;\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BitlDecoder.h",
    "content": "// BitlDecoder.h -- the Least Significant Bit of byte is First\n\n#ifndef __BITL_DECODER_H\n#define __BITL_DECODER_H\n\n#include \"../IStream.h\"\n\nnamespace NBitl {\n\nconst int kNumBigValueBits = 8 * 4;\n\nconst int kNumValueBytes = 3;\nconst int kNumValueBits = 8  * kNumValueBytes;\n\nconst UInt32 kMask = (1 << kNumValueBits) - 1;\n\nextern Byte kInvertTable[256];\n\ntemplate<class TInByte>\nclass CBaseDecoder\n{\nprotected:\n  int m_BitPos;\n  UInt32 m_Value;\n  TInByte m_Stream;\npublic:\n  UInt32 NumExtraBytes;\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream); }\n  void ReleaseStream() { m_Stream.ReleaseStream(); }\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = kNumBigValueBits;\n    m_Value = 0;\n    NumExtraBytes = 0;\n  }\n  UInt64 GetProcessedSize() const\n    { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }\n  UInt64 GetProcessedBitsSize() const\n    { return (m_Stream.GetProcessedSize() << 3) - (kNumBigValueBits - m_BitPos); }\n  int GetBitPosition() const { return (m_BitPos & 7); }\n\n  void Normalize()\n  {\n    for (;m_BitPos >= 8; m_BitPos -= 8)\n    {\n      Byte b = 0;\n      if (!m_Stream.ReadByte(b))\n      {\n        b = 0xFF; // check it\n        NumExtraBytes++;\n      }\n      m_Value = (b << (kNumBigValueBits - m_BitPos)) | m_Value;\n    }\n  }\n  \n  UInt32 ReadBits(int numBits)\n  {\n    Normalize();\n    UInt32 res = m_Value & ((1 << numBits) - 1);\n    m_BitPos += numBits;\n    m_Value >>= numBits;\n    return res;\n  }\n\n  bool ExtraBitsWereRead() const\n  {\n    if (NumExtraBytes == 0)\n      return false;\n    return ((UInt32)(kNumBigValueBits - m_BitPos) < (NumExtraBytes << 3));\n  }\n};\n\ntemplate<class TInByte>\nclass CDecoder: public CBaseDecoder<TInByte>\n{\n  UInt32 m_NormalValue;\n\npublic:\n  void Init()\n  {\n    CBaseDecoder<TInByte>::Init();\n    m_NormalValue = 0;\n  }\n\n  void Normalize()\n  {\n    for (; this->m_BitPos >= 8; this->m_BitPos -= 8)\n    {\n      Byte b = 0;\n      if (!this->m_Stream.ReadByte(b))\n      {\n        b = 0xFF; // check it\n        this->NumExtraBytes++;\n      }\n      m_NormalValue = (b << (kNumBigValueBits - this->m_BitPos)) | m_NormalValue;\n      this->m_Value = (this->m_Value << 8) | kInvertTable[b];\n    }\n  }\n  \n  UInt32 GetValue(int numBits)\n  {\n    Normalize();\n    return ((this->m_Value >> (8 - this->m_BitPos)) & kMask) >> (kNumValueBits - numBits);\n  }\n\n  void MovePos(int numBits)\n  {\n    this->m_BitPos += numBits;\n    m_NormalValue >>= numBits;\n  }\n  \n  UInt32 ReadBits(int numBits)\n  {\n    Normalize();\n    UInt32 res = m_NormalValue & ( (1 << numBits) - 1);\n    MovePos(numBits);\n    return res;\n  }\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BitlEncoder.h",
    "content": "// BitlEncoder.h -- the Least Significant Bit of byte is First\n\n#ifndef __BITL_ENCODER_H\n#define __BITL_ENCODER_H\n\n#include \"../Common/OutBuffer.h\"\n\nclass CBitlEncoder\n{\n  COutBuffer m_Stream;\n  int m_BitPos;\n  Byte m_CurByte;\npublic:\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream); }\n  void ReleaseStream() { m_Stream.ReleaseStream(); }\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = 8;\n    m_CurByte = 0;\n  }\n  HRESULT Flush()\n  {\n    FlushByte();\n    return m_Stream.Flush();\n  }\n  \n  void FlushByte()\n  {\n    if(m_BitPos < 8)\n      m_Stream.WriteByte(m_CurByte);\n    m_BitPos = 8;\n    m_CurByte = 0;\n  }\n\n  void WriteBits(UInt32 value, int numBits)\n  {\n    while(numBits > 0)\n    {\n      if (numBits < m_BitPos)\n      {\n        m_CurByte |= (value & ((1 << numBits) - 1)) << (8 - m_BitPos);\n        m_BitPos -= numBits;\n        return;\n      }\n      numBits -= m_BitPos;\n      m_Stream.WriteByte((Byte)(m_CurByte | (value << (8 - m_BitPos))));\n      value >>= m_BitPos;\n      m_BitPos = 8;\n      m_CurByte = 0;\n    }\n  }\n  UInt32 GetBitPosition() const {  return (8 - m_BitPos); }\n  UInt64 GetProcessedSize() const {\n      return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) /8; }\n  void WriteByte(Byte b) { m_Stream.WriteByte(b);}\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BitmDecoder.h",
    "content": "// BitmDecoder.h -- the Most Significant Bit of byte is First\n\n#ifndef __BITM_DECODER_H\n#define __BITM_DECODER_H\n\n#include \"../IStream.h\"\n\nnamespace NBitm {\n\nconst int kNumBigValueBits = 8 * 4;\nconst int kNumValueBytes = 3;\nconst int kNumValueBits = 8  * kNumValueBytes;\n\nconst UInt32 kMask = (1 << kNumValueBits) - 1;\n\ntemplate<class TInByte>\nclass CDecoder\n{\n  UInt32 m_BitPos;\n  UInt32 m_Value;\npublic:\n  TInByte m_Stream;\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}\n  void ReleaseStream() { m_Stream.ReleaseStream();}\n\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = kNumBigValueBits;\n    Normalize();\n  }\n  \n  UInt64 GetProcessedSize() const\n    { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }\n  UInt32 GetBitPosition() const { return (m_BitPos & 7); }\n  \n  void Normalize()\n  {\n    for (;m_BitPos >= 8; m_BitPos -= 8)\n      m_Value = (m_Value << 8) | m_Stream.ReadByte();\n  }\n\n  UInt32 GetValue(UInt32 numBits) const\n  {\n    // return (m_Value << m_BitPos) >> (kNumBigValueBits - numBits);\n    return ((m_Value >> (8 - m_BitPos)) & kMask) >> (kNumValueBits - numBits);\n  }\n  \n  void MovePos(UInt32 numBits)\n  {\n    m_BitPos += numBits;\n    Normalize();\n  }\n  \n  UInt32 ReadBits(UInt32 numBits)\n  {\n    UInt32 res = GetValue(numBits);\n    MovePos(numBits);\n    return res;\n  }\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BitmEncoder.h",
    "content": "// BitmEncoder.h -- the Most Significant Bit of byte is First\n\n#ifndef __BITM_ENCODER_H\n#define __BITM_ENCODER_H\n\n#include \"../IStream.h\"\n\ntemplate<class TOutByte>\nclass CBitmEncoder\n{\n  TOutByte m_Stream;\n  int m_BitPos;\n  Byte m_CurByte;\npublic:\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream);}\n  void ReleaseStream() { m_Stream.ReleaseStream(); }\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = 8;\n    m_CurByte = 0;\n  }\n  HRESULT Flush()\n  {\n    if(m_BitPos < 8)\n      WriteBits(0, m_BitPos);\n    return m_Stream.Flush();\n  }\n\n  void WriteBits(UInt32 value, int numBits)\n  {\n    while(numBits > 0)\n    {\n      if (numBits < m_BitPos)\n      {\n        m_CurByte |= ((Byte)value << (m_BitPos -= numBits));\n        return;\n      }\n      numBits -= m_BitPos;\n      UInt32 newBits = (value >> numBits);\n      value -= (newBits << numBits);\n      m_Stream.WriteByte((Byte)(m_CurByte | newBits));\n      m_BitPos = 8;\n      m_CurByte = 0;\n    }\n  }\n  UInt64 GetProcessedSize() const {\n      return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) / 8; }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BranchCoder.cpp",
    "content": "// BranchCoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"BranchCoder.h\"\n\nSTDMETHODIMP CBranchConverter::Init()\n{\n  _bufferPos = 0;\n  SubInit();\n  return S_OK;\n}\n\nSTDMETHODIMP_(UInt32) CBranchConverter::Filter(Byte *data, UInt32 size)\n{\n  UInt32 processedSize = SubFilter(data, size);\n  _bufferPos += processedSize;\n  return processedSize;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BranchCoder.h",
    "content": "// BranchCoder.h\n\n#ifndef __COMPRESS_BRANCH_CODER_H\n#define __COMPRESS_BRANCH_CODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\nclass CBranchConverter:\n  public ICompressFilter,\n  public CMyUnknownImp\n{\nprotected:\n  UInt32 _bufferPos;\n  virtual void SubInit() {}\n  virtual UInt32 SubFilter(Byte *data, UInt32 size) = 0;\npublic:\n  MY_UNKNOWN_IMP;\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n};\n\n#define MyClassEncoderA(Name) class C ## Name: public CBranchConverter \\\n  { public: UInt32 SubFilter(Byte *data, UInt32 size); };\n\n#define MyClassDecoderA(Name) class C ## Name: public CBranchConverter \\\n  { public: UInt32 SubFilter(Byte *data, UInt32 size); };\n\n#define MyClassEncoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \\\n  { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT};\n\n#define MyClassDecoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \\\n  { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT};\n\n#define MyClassA(Name, id, subId)  \\\nMyClassEncoderA(Name ## _Encoder) \\\nMyClassDecoderA(Name ## _Decoder)\n\n#define MyClassB(Name, id, subId, ADD_ITEMS, ADD_INIT)  \\\nMyClassEncoderB(Name ## _Encoder, ADD_ITEMS, ADD_INIT) \\\nMyClassDecoderB(Name ## _Decoder, ADD_ITEMS, ADD_INIT)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BranchMisc.cpp",
    "content": "// BranchMisc.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Bra.h\"\n}\n\n#include \"BranchMisc.h\"\n\nUInt32 CBC_ARM_Encoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::ARM_Convert(data, size, _bufferPos, 1); }\n\nUInt32 CBC_ARM_Decoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::ARM_Convert(data, size, _bufferPos, 0); }\n\nUInt32 CBC_ARMT_Encoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::ARMT_Convert(data, size, _bufferPos, 1); }\n\nUInt32 CBC_ARMT_Decoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::ARMT_Convert(data, size, _bufferPos, 0); }\n\nUInt32 CBC_PPC_Encoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::PPC_Convert(data, size, _bufferPos, 1); }\n\nUInt32 CBC_PPC_Decoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::PPC_Convert(data, size, _bufferPos, 0); }\n\nUInt32 CBC_SPARC_Encoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::SPARC_Convert(data, size, _bufferPos, 1); }\n\nUInt32 CBC_SPARC_Decoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::SPARC_Convert(data, size, _bufferPos, 0); }\n\nUInt32 CBC_IA64_Encoder::SubFilter(Byte *data, UInt32 size)\n  { return (UInt32)::IA64_Convert(data, size, _bufferPos, 1); }\n\nUInt32 CBC_IA64_Decoder::SubFilter(Byte *data, UInt32 size)\n  {  return (UInt32)::IA64_Convert(data, size, _bufferPos, 0); }\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BranchMisc.h",
    "content": "// BranchMisc.h\n\n#ifndef __COMPRESS_BRANCH_MISC_H\n#define __COMPRESS_BRANCH_MISC_H\n\n#include \"BranchCoder.h\"\n\nMyClassA(BC_ARM,   0x05, 1)\nMyClassA(BC_ARMT,  0x07, 1)\nMyClassA(BC_PPC,   0x02, 5)\nMyClassA(BC_SPARC, 0x08, 5)\nMyClassA(BC_IA64,  0x04, 1)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/BranchRegister.cpp",
    "content": "// BranchRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"BranchMisc.h\"\n\n#define CREATE_CODEC(x) \\\n  static void *CreateCodec ## x() { return (void *)(ICompressFilter *)(new C ## x ## _Decoder); } \\\n  static void *CreateCodec ## x ## Out() { return (void *)(ICompressFilter *)(new C ## x ## _Encoder); }\n\nCREATE_CODEC(BC_PPC)\nCREATE_CODEC(BC_IA64)\nCREATE_CODEC(BC_ARM)\nCREATE_CODEC(BC_ARMT)\nCREATE_CODEC(BC_SPARC)\n\n#define METHOD_ITEM(x, id1, id2, name) { CreateCodec ## x, CreateCodec ## x ## Out, 0x03030000 + (id1 * 256) + id2, name, 1, true  }\n\nstatic CCodecInfo g_CodecsInfo[] =\n{\n  METHOD_ITEM(BC_PPC,   0x02, 0x05, L\"PPC\"),\n  METHOD_ITEM(BC_IA64,  0x04, 1, L\"IA64\"),\n  METHOD_ITEM(BC_ARM,   0x05, 1, L\"ARM\"),\n  METHOD_ITEM(BC_ARMT,  0x07, 1, L\"ARMT\"),\n  METHOD_ITEM(BC_SPARC, 0x08, 0x05, L\"SPARC\")\n};\n\nREGISTER_CODECS(Branch)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ByteSwap.cpp",
    "content": "// ByteSwap.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ByteSwap.h\"\n\nSTDMETHODIMP CByteSwap2::Init() { return S_OK; }\n\nSTDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size)\n{\n  const UInt32 kStep = 2;\n  UInt32 i;\n  for (i = 0; i + kStep <= size; i += kStep)\n  {\n    Byte b = data[i];\n    data[i] = data[i + 1];\n    data[i + 1] = b;\n  }\n  return i;\n}\n\nSTDMETHODIMP CByteSwap4::Init() { return S_OK; }\n\nSTDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size)\n{\n  const UInt32 kStep = 4;\n  UInt32 i;\n  for (i = 0; i + kStep <= size; i += kStep)\n  {\n    Byte b0 = data[i];\n    Byte b1 = data[i + 1];\n    data[i] = data[i + 3];\n    data[i + 1] = data[i + 2];\n    data[i + 2] = b1;\n    data[i + 3] = b0;\n  }\n  return i;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ByteSwap.h",
    "content": "// ByteSwap.h\n\n#ifndef __COMPRESS_BYTE_SWAP_H\n#define __COMPRESS_BYTE_SWAP_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\nclass CByteSwap2:\n  public ICompressFilter,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n};\n\nclass CByteSwap4:\n  public ICompressFilter,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ByteSwapRegister.cpp",
    "content": "// ByteSwapRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"ByteSwap.h\"\n\nstatic void *CreateCodec2() { return (void *)(ICompressFilter *)(new CByteSwap2); }\nstatic void *CreateCodec4() { return (void *)(ICompressFilter *)(new CByteSwap4); }\n\nstatic CCodecInfo g_CodecsInfo[] =\n{\n  { CreateCodec2, CreateCodec4, 0x020302, L\"Swap2\", 1, true },\n  { CreateCodec4, CreateCodec4, 0x020304, L\"Swap4\", 1, true }\n};\n\nREGISTER_CODECS(ByteSwap)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/CodecExports.cpp",
    "content": "// CodecExports.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/ComTry.h\"\n#include \"../../Windows/PropVariant.h\"\n#include \"../Common/RegisterCodec.h\"\n#include \"../ICoder.h\"\n\nextern unsigned int g_NumCodecs;\nextern const CCodecInfo *g_Codecs[];\n\nstatic const UInt16 kDecodeId = 0x2790;\n\nDEFINE_GUID(CLSID_CCodec,\n0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n\nstatic inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value)\n{\n  if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0)\n    value->vt = VT_BSTR;\n  return S_OK;\n}\n\nstatic inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value)\n{\n  return SetPropString((const char *)&guid, sizeof(GUID), value);\n}\n\nstatic HRESULT SetClassID(CMethodId id, bool encode, PROPVARIANT *value)\n{\n  GUID clsId = CLSID_CCodec;\n  for (int i = 0; i < sizeof(id); i++, id >>= 8)\n    clsId.Data4[i] = (Byte)(id & 0xFF);\n  if (encode)\n    clsId.Data3++;\n  return SetPropGUID(clsId, value);\n}\n\nstatic HRESULT FindCodecClassId(const GUID *clsID, UInt32 isCoder2, bool isFilter, bool &encode, int &index)\n{\n  index = -1;\n  if (clsID->Data1 != CLSID_CCodec.Data1 ||\n      clsID->Data2 != CLSID_CCodec.Data2 ||\n      (clsID->Data3 & ~1) != kDecodeId)\n    return S_OK;\n  encode = (clsID->Data3 != kDecodeId);\n  UInt64 id = 0;\n  for (int j = 0; j < 8; j++)\n    id |= ((UInt64)clsID->Data4[j]) << (8 * j);\n  for (unsigned i = 0; i < g_NumCodecs; i++)\n  {\n    const CCodecInfo &codec = *g_Codecs[i];\n    if (id != codec.Id || encode && !codec.CreateEncoder || !encode && !codec.CreateDecoder)\n      continue;\n    if (!isFilter && codec.IsFilter || isFilter && !codec.IsFilter ||\n        codec.NumInStreams != 1 && !isCoder2 || codec.NumInStreams == 1 && isCoder2)\n      return E_NOINTERFACE;\n    index = i;\n    return S_OK;\n  }\n  return S_OK;\n}\n\nSTDAPI CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject)\n{\n  COM_TRY_BEGIN\n  *outObject = 0;\n  bool isCoder = (*iid == IID_ICompressCoder) != 0;\n  bool isCoder2 = (*iid == IID_ICompressCoder2) != 0;\n  bool isFilter = (*iid == IID_ICompressFilter) != 0;\n  const CCodecInfo &codec = *g_Codecs[index];\n  if (!isFilter && codec.IsFilter || isFilter && !codec.IsFilter ||\n      codec.NumInStreams != 1 && !isCoder2 || codec.NumInStreams == 1 && isCoder2)\n    return E_NOINTERFACE;\n  if (encode)\n  {\n    if (!codec.CreateEncoder)\n      return CLASS_E_CLASSNOTAVAILABLE;\n    *outObject = codec.CreateEncoder();\n  }\n  else\n  {\n    if (!codec.CreateDecoder)\n      return CLASS_E_CLASSNOTAVAILABLE;\n    *outObject = codec.CreateDecoder();\n  }\n  if (isCoder)\n    ((ICompressCoder *)*outObject)->AddRef();\n  else if (isCoder2)\n    ((ICompressCoder2 *)*outObject)->AddRef();\n  else\n    ((ICompressFilter *)*outObject)->AddRef();\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject)\n{\n  *outObject = 0;\n  bool isCoder = (*iid == IID_ICompressCoder) != 0;\n  bool isCoder2 = (*iid == IID_ICompressCoder2) != 0;\n  bool isFilter = (*iid == IID_ICompressFilter) != 0;\n  if (!isCoder && !isCoder2 && !isFilter)\n    return E_NOINTERFACE;\n  bool encode;\n  int codecIndex;\n  HRESULT res = FindCodecClassId(clsid, isCoder2, isFilter, encode, codecIndex);\n  if (res != S_OK)\n    return res;\n  if (codecIndex < 0)\n    return CLASS_E_CLASSNOTAVAILABLE;\n  return CreateCoder2(encode, codecIndex, iid, outObject);\n}\n\nSTDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value)\n{\n  ::VariantClear((VARIANTARG *)value);\n  const CCodecInfo &codec = *g_Codecs[codecIndex];\n  switch(propID)\n  {\n    case NMethodPropID::kID:\n    {\n      value->uhVal.QuadPart = (UInt64)codec.Id;\n      value->vt = VT_UI8;\n      break;\n    }\n    case NMethodPropID::kName:\n      if ((value->bstrVal = ::SysAllocString(codec.Name)) != 0)\n        value->vt = VT_BSTR;\n      break;\n    case NMethodPropID::kDecoder:\n      if (codec.CreateDecoder)\n        return SetClassID(codec.Id, false, value);\n      break;\n    case NMethodPropID::kEncoder:\n      if (codec.CreateEncoder)\n        return SetClassID(codec.Id, true, value);\n      break;\n    case NMethodPropID::kInStreams:\n    {\n      if (codec.NumInStreams != 1)\n      {\n        value->vt = VT_UI4;\n        value->ulVal = (ULONG)codec.NumInStreams;\n      }\n      break;\n    }\n  }\n  return S_OK;\n}\n\nSTDAPI GetNumberOfMethods(UINT32 *numCodecs)\n{\n  *numCodecs = g_NumCodecs;\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/CopyCoder.cpp",
    "content": "// Compress/CopyCoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"CopyCoder.h\"\n\nnamespace NCompress {\n\nstatic const UInt32 kBufferSize = 1 << 17;\n\nCCopyCoder::~CCopyCoder()\n{\n  ::MidFree(_buffer);\n}\n\nSTDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream,\n    ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 *outSize,\n    ICompressProgressInfo *progress)\n{\n  if (_buffer == 0)\n  {\n    _buffer = (Byte *)::MidAlloc(kBufferSize);\n    if (_buffer == 0)\n      return E_OUTOFMEMORY;\n  }\n\n  TotalSize = 0;\n  for (;;)\n  {\n    UInt32 realProcessedSize;\n    UInt32 size = kBufferSize;\n    if (outSize != 0)\n      if (size > *outSize - TotalSize)\n        size = (UInt32)(*outSize - TotalSize);\n    RINOK(inStream->Read(_buffer, size, &realProcessedSize));\n    if (realProcessedSize == 0)\n      break;\n    RINOK(WriteStream(outStream, _buffer, realProcessedSize));\n    TotalSize += realProcessedSize;\n    if (progress != NULL)\n    {\n      RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize));\n    }\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value)\n{\n  *value = TotalSize;\n  return S_OK;\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/CopyCoder.h",
    "content": "// Compress/CopyCoder.h\n\n#ifndef __COMPRESS_COPY_CODER_H\n#define __COMPRESS_COPY_CODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\nnamespace NCompress {\n\nclass CCopyCoder:\n  public ICompressCoder,\n  public ICompressGetInStreamProcessedSize,\n  public CMyUnknownImp\n{\n  Byte *_buffer;\npublic:\n  UInt64 TotalSize;\n  CCopyCoder(): TotalSize(0) , _buffer(0) {};\n  ~CCopyCoder();\n\n  MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize)\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/CopyRegister.cpp",
    "content": "// CopyRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"CopyCoder.h\"\n\nstatic void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::CCopyCoder); }\n\nstatic CCodecInfo g_CodecInfo =\n{ CreateCodec, CreateCodec, 0x00, L\"Copy\", 1, false };\n\nREGISTER_CODEC(Copy)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Deflate64Register.cpp",
    "content": "// Deflate64Register.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"DeflateDecoder.h\"\n\nstatic void *CreateCodecDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder64); }\n#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY)\n#include \"DeflateEncoder.h\"\nstatic void *CreateCodecOutDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder64);  }\n#else\n#define CreateCodecOutDeflate64 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodecDeflate64, CreateCodecOutDeflate64, 0x040109, L\"Deflate64\", 1, false };\n\nREGISTER_CODEC(Deflate64)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DeflateConst.h",
    "content": "// DeflateConst.h\n\n#ifndef __DEFLATE_CONST_H\n#define __DEFLATE_CONST_H\n\nnamespace NCompress {\nnamespace NDeflate {\n\nconst int kNumHuffmanBits = 15;\n\nconst UInt32 kHistorySize32 = (1 << 15);\nconst UInt32 kHistorySize64 = (1 << 16);\n\nconst UInt32 kDistTableSize32 = 30;\nconst UInt32 kDistTableSize64 = 32;\n  \nconst UInt32 kNumLenSymbols32 = 256;\nconst UInt32 kNumLenSymbols64 = 255; // don't change it. It must be <= 255.\nconst UInt32 kNumLenSymbolsMax = kNumLenSymbols32;\n  \nconst UInt32 kNumLenSlots = 29;\n\nconst UInt32 kFixedDistTableSize = 32;\nconst UInt32 kFixedLenTableSize = 31;\n\nconst UInt32 kSymbolEndOfBlock = 0x100;\nconst UInt32 kSymbolMatch = kSymbolEndOfBlock + 1;\n\nconst UInt32 kMainTableSize = kSymbolMatch + kNumLenSlots;\nconst UInt32 kFixedMainTableSize = kSymbolMatch + kFixedLenTableSize;\n\nconst UInt32 kLevelTableSize = 19;\n\nconst UInt32 kTableDirectLevels = 16;\nconst UInt32 kTableLevelRepNumber = kTableDirectLevels;\nconst UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;\nconst UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;\n\nconst UInt32 kLevelMask = 0xF;\n\nconst Byte kLenStart32[kFixedLenTableSize] =\n  {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 255, 0, 0};\nconst Byte kLenStart64[kFixedLenTableSize] =\n  {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 0, 0, 0};\n\nconst Byte kLenDirectBits32[kFixedLenTableSize] =\n  {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5, 0, 0, 0};\nconst Byte kLenDirectBits64[kFixedLenTableSize] =\n  {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5, 16, 0, 0};\n\nconst UInt32 kDistStart[kDistTableSize64]  =\n  {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,\n  1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768,49152};\nconst Byte kDistDirectBits[kDistTableSize64] =\n  {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14};\n\nconst Byte kLevelDirectBits[3] = {2, 3, 7};\n\nconst Byte kCodeLengthAlphabetOrder[kLevelTableSize] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\n\nconst UInt32 kMatchMinLen = 3;\nconst UInt32 kMatchMaxLen32 = kNumLenSymbols32 + kMatchMinLen - 1; //256 + 2\nconst UInt32 kMatchMaxLen64 = kNumLenSymbols64 + kMatchMinLen - 1; //255 + 2\nconst UInt32 kMatchMaxLen = kMatchMaxLen32;\n\nconst int kFinalBlockFieldSize = 1;\n\nnamespace NFinalBlockField\n{\n  enum\n  {\n    kNotFinalBlock = 0,\n    kFinalBlock = 1\n  };\n}\n\nconst int kBlockTypeFieldSize = 2;\n\nnamespace NBlockType\n{\n  enum\n  {\n    kStored = 0,\n    kFixedHuffman = 1,\n    kDynamicHuffman = 2\n  };\n}\n\nconst int kNumLenCodesFieldSize = 5;\nconst int kNumDistCodesFieldSize = 5;\nconst int kNumLevelCodesFieldSize = 4;\n\nconst UInt32 kNumLitLenCodesMin = 257;\nconst UInt32 kNumDistCodesMin = 1;\nconst UInt32 kNumLevelCodesMin = 4;\n\nconst int kLevelFieldSize = 3;\n\nconst int kStoredBlockLengthFieldSize = 16;\n\nstruct CLevels\n{\n  Byte litLenLevels[kFixedMainTableSize];\n  Byte distLevels[kFixedDistTableSize];\n\n  void SubClear()\n  {\n    UInt32 i;\n    for(i = kNumLitLenCodesMin; i < kFixedMainTableSize; i++)\n      litLenLevels[i] = 0;\n    for(i = 0; i < kFixedDistTableSize; i++)\n      distLevels[i] = 0;\n  }\n\n  void SetFixedLevels()\n  {\n    int i;\n    \n    for (i = 0; i < 144; i++)\n      litLenLevels[i] = 8;\n    for (; i < 256; i++)\n      litLenLevels[i] = 9;\n    for (; i < 280; i++)\n      litLenLevels[i] = 7;\n    for (; i < 288; i++)\n      litLenLevels[i] = 8;\n    for (i = 0; i < kFixedDistTableSize; i++)  // test it: InfoZip only uses kDistTableSize\n      distLevels[i] = 5;\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DeflateDecoder.cpp",
    "content": "// DeflateDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"DeflateDecoder.h\"\n\nnamespace NCompress {\nnamespace NDeflate {\nnamespace NDecoder {\n\nstatic const int kLenIdFinished = -1;\nstatic const int kLenIdNeedInit = -2;\n\nCCoder::CCoder(bool deflate64Mode, bool deflateNSIS):\n    _deflate64Mode(deflate64Mode),\n    _deflateNSIS(deflateNSIS),\n    _keepHistory(false),\n    ZlibMode(false) {}\n\nUInt32 CCoder::ReadBits(int numBits)\n{\n  return m_InBitStream.ReadBits(numBits);\n}\n\nbool CCoder::DeCodeLevelTable(Byte *values, int numSymbols)\n{\n  int i = 0;\n  do\n  {\n    UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);\n    if (number < kTableDirectLevels)\n      values[i++] = (Byte)number;\n    else if (number < kLevelTableSize)\n    {\n      if (number == kTableLevelRepNumber)\n      {\n        if (i == 0)\n          return false;\n        int num = ReadBits(2) + 3;\n        for (; num > 0 && i < numSymbols; num--, i++)\n          values[i] = values[i - 1];\n      }\n      else\n      {\n        int num;\n        if (number == kTableLevel0Number)\n          num = ReadBits(3) + 3;\n        else\n          num = ReadBits(7) + 11;\n        for (;num > 0 && i < numSymbols; num--)\n          values[i++] = 0;\n      }\n    }\n    else\n      return false;\n  }\n  while(i < numSymbols);\n  return true;\n}\n\n#define RIF(x) { if (!(x)) return false; }\n\nbool CCoder::ReadTables(void)\n{\n  m_FinalBlock = (ReadBits(kFinalBlockFieldSize) == NFinalBlockField::kFinalBlock);\n  UInt32 blockType = ReadBits(kBlockTypeFieldSize);\n  if (blockType > NBlockType::kDynamicHuffman)\n    return false;\n\n  if (blockType == NBlockType::kStored)\n  {\n    m_StoredMode = true;\n    UInt32 currentBitPosition = m_InBitStream.GetBitPosition();\n    int numBitsForAlign = (int)(currentBitPosition > 0 ? (8 - currentBitPosition): 0);\n    ReadBits(numBitsForAlign);\n    m_StoredBlockSize = ReadBits(kStoredBlockLengthFieldSize);\n    if (_deflateNSIS)\n      return true;\n    return (m_StoredBlockSize == (UInt16)~ReadBits(kStoredBlockLengthFieldSize));\n  }\n\n  m_StoredMode = false;\n\n  CLevels levels;\n  if (blockType == NBlockType::kFixedHuffman)\n  {\n    levels.SetFixedLevels();\n    _numDistLevels = _deflate64Mode ? kDistTableSize64 : kDistTableSize32;\n  }\n  else\n  {\n    int numLitLenLevels = ReadBits(kNumLenCodesFieldSize) + kNumLitLenCodesMin;\n    _numDistLevels = ReadBits(kNumDistCodesFieldSize) + kNumDistCodesMin;\n    int numLevelCodes = ReadBits(kNumLevelCodesFieldSize) + kNumLevelCodesMin;\n\n    if (!_deflate64Mode)\n      if (_numDistLevels > kDistTableSize32)\n        return false;\n    \n    Byte levelLevels[kLevelTableSize];\n    for (int i = 0; i < kLevelTableSize; i++)\n    {\n      int position = kCodeLengthAlphabetOrder[i];\n      if(i < numLevelCodes)\n        levelLevels[position] = (Byte)ReadBits(kLevelFieldSize);\n      else\n        levelLevels[position] = 0;\n    }\n    \n    RIF(m_LevelDecoder.SetCodeLengths(levelLevels));\n    \n    Byte tmpLevels[kFixedMainTableSize + kFixedDistTableSize];\n    if (!DeCodeLevelTable(tmpLevels, numLitLenLevels + _numDistLevels))\n      return false;\n\n    levels.SubClear();\n    memcpy(levels.litLenLevels, tmpLevels, numLitLenLevels);\n    memcpy(levels.distLevels, tmpLevels + numLitLenLevels, _numDistLevels);\n  }\n  RIF(m_MainDecoder.SetCodeLengths(levels.litLenLevels));\n  return m_DistDecoder.SetCodeLengths(levels.distLevels);\n}\n\nHRESULT CCoder::CodeSpec(UInt32 curSize)\n{\n  if (_remainLen == kLenIdFinished)\n    return S_OK;\n  if (_remainLen == kLenIdNeedInit)\n  {\n    if (!_keepHistory)\n      if (!m_OutWindowStream.Create(_deflate64Mode ? kHistorySize64: kHistorySize32))\n        return E_OUTOFMEMORY;\n    if (!m_InBitStream.Create(1 << 17))\n      return E_OUTOFMEMORY;\n    m_OutWindowStream.Init(_keepHistory);\n    m_InBitStream.Init();\n    m_FinalBlock = false;\n    _remainLen = 0;\n    _needReadTable = true;\n  }\n\n  if (curSize == 0)\n    return S_OK;\n\n  while(_remainLen > 0 && curSize > 0)\n  {\n    _remainLen--;\n    Byte b = m_OutWindowStream.GetByte(_rep0);\n    m_OutWindowStream.PutByte(b);\n    curSize--;\n  }\n\n  while(curSize > 0)\n  {\n    if (_needReadTable)\n    {\n      if (m_FinalBlock)\n      {\n        _remainLen = kLenIdFinished;\n        break;\n      }\n      if (!ReadTables())\n        return S_FALSE;\n      _needReadTable = false;\n    }\n\n    if(m_StoredMode)\n    {\n      for (; m_StoredBlockSize > 0 && curSize > 0; m_StoredBlockSize--, curSize--)\n        m_OutWindowStream.PutByte((Byte)m_InBitStream.ReadBits(8));\n      _needReadTable = (m_StoredBlockSize == 0);\n      continue;\n    }\n    while(curSize > 0)\n    {\n      if (m_InBitStream.NumExtraBytes > 4)\n        return S_FALSE;\n\n      UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);\n      if (number < 0x100)\n      {\n        m_OutWindowStream.PutByte((Byte)number);\n        curSize--;\n        continue;\n      }\n      else if (number == kSymbolEndOfBlock)\n      {\n        _needReadTable = true;\n        break;\n      }\n      else if (number < kMainTableSize)\n      {\n        number -= kSymbolMatch;\n        UInt32 len;\n        {\n          int numBits;\n          if (_deflate64Mode)\n          {\n            len = kLenStart64[number];\n            numBits = kLenDirectBits64[number];\n          }\n          else\n          {\n            len = kLenStart32[number];\n            numBits = kLenDirectBits32[number];\n          }\n          len += kMatchMinLen + m_InBitStream.ReadBits(numBits);\n        }\n        UInt32 locLen = len;\n        if (locLen > curSize)\n          locLen = (UInt32)curSize;\n        number = m_DistDecoder.DecodeSymbol(&m_InBitStream);\n        if (number >= _numDistLevels)\n          return S_FALSE;\n        UInt32 distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]);\n        if (!m_OutWindowStream.CopyBlock(distance, locLen))\n          return S_FALSE;\n        curSize -= locLen;\n        len -= locLen;\n        if (len != 0)\n        {\n          _remainLen = (Int32)len;\n          _rep0 = distance;\n          break;\n        }\n      }\n      else\n        return S_FALSE;\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  SetInStream(inStream);\n  m_OutWindowStream.SetStream(outStream);\n  SetOutStreamSize(outSize);\n  CCoderReleaser flusher(this);\n\n  const UInt64 start = m_OutWindowStream.GetProcessedSize();\n  for (;;)\n  {\n    UInt32 curSize = 1 << 18;\n    if (outSize != 0)\n    {\n      const UInt64 rem = *outSize - (m_OutWindowStream.GetProcessedSize() - start);\n      if (curSize > rem)\n        curSize = (UInt32)rem;\n    }\n    if (curSize == 0)\n      break;\n    RINOK(CodeSpec(curSize));\n    if (_remainLen == kLenIdFinished)\n      break;\n    if (progress != NULL)\n    {\n      const UInt64 inSize = m_InBitStream.GetProcessedSize();\n      const UInt64 nowPos64 = m_OutWindowStream.GetProcessedSize() - start;\n      RINOK(progress->SetRatioInfo(&inSize, &nowPos64));\n    }\n  }\n  if (_remainLen == kLenIdFinished && ZlibMode)\n  {\n    UInt32 currentBitPosition = m_InBitStream.GetBitPosition();\n    int numBitsForAlign = (int)(currentBitPosition > 0 ? (8 - currentBitPosition): 0);\n    ReadBits(numBitsForAlign);\n    for (int i = 0; i < 4; i++)\n      ZlibFooter[i] = (Byte)m_InBitStream.ReadBits(8);\n  }\n  flusher.NeedFlush = false;\n  return Flush();\n}\n\n\n#ifdef _NO_EXCEPTIONS\n\n#define DEFLATE_TRY_BEGIN\n#define DEFLATE_TRY_END\n\n#else\n\n#define DEFLATE_TRY_BEGIN {\n#define DEFLATE_TRY_END }\n\n#endif\n\nHRESULT CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  DEFLATE_TRY_BEGIN\n  return CodeReal(inStream, outStream, inSize, outSize, progress);\n  DEFLATE_TRY_END\n}\n\nSTDMETHODIMP CCoder::GetInStreamProcessedSize(UInt64 *value)\n{\n  if (value == NULL)\n    return E_INVALIDARG;\n  *value = m_InBitStream.GetProcessedSize();\n  return S_OK;\n}\n\nSTDMETHODIMP CCoder::SetInStream(ISequentialInStream *inStream)\n{\n  m_InBitStream.SetStream(inStream);\n  return S_OK;\n}\n\nSTDMETHODIMP CCoder::ReleaseInStream()\n{\n  m_InBitStream.ReleaseStream();\n  return S_OK;\n}\n\nSTDMETHODIMP CCoder::SetOutStreamSize(const UInt64 * /* outSize */)\n{\n  _remainLen = kLenIdNeedInit;\n  m_OutWindowStream.Init(_keepHistory);\n  return S_OK;\n}\n\n#ifndef NO_READ_FROM_CODER\n\nSTDMETHODIMP CCoder::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  DEFLATE_TRY_BEGIN\n  if (processedSize)\n    *processedSize = 0;\n  const UInt64 startPos = m_OutWindowStream.GetProcessedSize();\n  m_OutWindowStream.SetMemStream((Byte *)data);\n  RINOK(CodeSpec(size));\n  if (processedSize)\n    *processedSize = (UInt32)(m_OutWindowStream.GetProcessedSize() - startPos);\n  return Flush();\n  DEFLATE_TRY_END\n}\n\n#endif\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DeflateDecoder.h",
    "content": "// DeflateDecoder.h\n\n#ifndef __DEFLATE_DECODER_H\n#define __DEFLATE_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitlDecoder.h\"\n#include \"DeflateConst.h\"\n#include \"HuffmanDecoder.h\"\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NDeflate {\nnamespace NDecoder {\n\nclass CCoder:\n  public ICompressCoder,\n  public ICompressGetInStreamProcessedSize,\n  #ifndef NO_READ_FROM_CODER\n  public ICompressSetInStream,\n  public ICompressSetOutStreamSize,\n  public ISequentialInStream,\n  #endif\n  public CMyUnknownImp\n{\n  CLzOutWindow m_OutWindowStream;\n  NBitl::CDecoder<CInBuffer> m_InBitStream;\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedMainTableSize> m_MainDecoder;\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedDistTableSize> m_DistDecoder;\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;\n\n  UInt32 m_StoredBlockSize;\n\n  bool m_FinalBlock;\n  bool m_StoredMode;\n  UInt32 _numDistLevels;\n\n\n  bool _deflateNSIS;\n  bool _deflate64Mode;\n  bool _keepHistory;\n  Int32 _remainLen;\n  UInt32 _rep0;\n  bool _needReadTable;\n\n  UInt32 ReadBits(int numBits);\n\n  bool DeCodeLevelTable(Byte *values, int numSymbols);\n  bool ReadTables();\n  \n  void ReleaseStreams()\n  {\n    m_OutWindowStream.ReleaseStream();\n    ReleaseInStream();\n  }\n\n  HRESULT Flush() { return m_OutWindowStream.Flush(); }\n  class CCoderReleaser\n  {\n    CCoder *m_Coder;\n  public:\n    bool NeedFlush;\n    CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}\n    ~CCoderReleaser()\n    {\n      if (NeedFlush)\n        m_Coder->Flush();\n      m_Coder->ReleaseStreams();\n    }\n  };\n  friend class CCoderReleaser;\n\n  HRESULT CodeSpec(UInt32 curSize);\npublic:\n  bool ZlibMode;\n  Byte ZlibFooter[4];\n\n  CCoder(bool deflate64Mode, bool deflateNSIS = false);\n  void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  #ifndef NO_READ_FROM_CODER\n  MY_UNKNOWN_IMP4(\n      ICompressGetInStreamProcessedSize,\n      ICompressSetInStream,\n      ICompressSetOutStreamSize,\n      ISequentialInStream\n      )\n  #else\n  MY_UNKNOWN_IMP1(\n      ICompressGetInStreamProcessedSize)\n  #endif\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetInStream)(ISequentialInStream *inStream);\n  STDMETHOD(ReleaseInStream)();\n  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);\n  \n  #ifndef NO_READ_FROM_CODER\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  #endif\n\n  // IGetInStreamProcessedSize\n  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);\n};\n\nclass CCOMCoder : public CCoder\n{\npublic:\n  CCOMCoder(): CCoder(false) {}\n};\n\nclass CNsisCOMCoder : public CCoder\n{\npublic:\n  CNsisCOMCoder(): CCoder(false, true) {}\n};\n\nclass CCOMCoder64 : public CCoder\n{\npublic:\n  CCOMCoder64(): CCoder(true) {}\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DeflateEncoder.cpp",
    "content": "// DeflateEncoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n#include \"../../../C/HuffEnc.h\"\n}\n\n#include \"Common/ComTry.h\"\n\n#include \"DeflateEncoder.h\"\n\n#if _MSC_VER >= 1300\n#define NO_INLINE __declspec(noinline)\n#else\n#define NO_INLINE\n#endif\n\nnamespace NCompress {\nnamespace NDeflate {\nnamespace NEncoder {\n\nconst int kNumDivPassesMax = 10; // [0, 16); ratio/speed/ram tradeoff; use big value for better compression ratio.\nconst UInt32 kNumTables = (1 << kNumDivPassesMax);\n\nstatic UInt32 kFixedHuffmanCodeBlockSizeMax = (1 << 8); // [0, (1 << 32)); ratio/speed tradeoff; use big value for better compression ratio.\nstatic UInt32 kDivideCodeBlockSizeMin = (1 << 7); // [1, (1 << 32)); ratio/speed tradeoff; use small value for better compression ratio.\nstatic UInt32 kDivideBlockSizeMin = (1 << 6); // [1, (1 << 32)); ratio/speed tradeoff; use small value for better compression ratio.\n\nstatic const UInt32 kMaxUncompressedBlockSize = ((1 << 16) - 1) * 1; // [1, (1 << 32))\nstatic const UInt32 kMatchArraySize = kMaxUncompressedBlockSize * 10; // [kMatchMaxLen * 2, (1 << 32))\nstatic const UInt32 kMatchArrayLimit = kMatchArraySize - kMatchMaxLen * 4 * sizeof(UInt16);\nstatic const UInt32 kBlockUncompressedSizeThreshold = kMaxUncompressedBlockSize -\n    kMatchMaxLen - kNumOpts;\n\nstatic const int kMaxCodeBitLength = 11;\nstatic const int kMaxLevelBitLength = 7;\n\nstatic Byte kNoLiteralStatPrice = 11;\nstatic Byte kNoLenStatPrice = 11;\nstatic Byte kNoPosStatPrice = 6;\n\nstatic Byte g_LenSlots[kNumLenSymbolsMax];\nstatic Byte g_FastPos[1 << 9];\n\nclass CFastPosInit\n{\npublic:\n  CFastPosInit()\n  {\n    int i;\n    for(i = 0; i < kNumLenSlots; i++)\n    {\n      int c = kLenStart32[i];\n      int j = 1 << kLenDirectBits32[i];\n      for(int k = 0; k < j; k++, c++)\n        g_LenSlots[c] = (Byte)i;\n    }\n    \n    const int kFastSlots = 18;\n    int c = 0;\n    for (Byte slotFast = 0; slotFast < kFastSlots; slotFast++)\n    {\n      UInt32 k = (1 << kDistDirectBits[slotFast]);\n      for (UInt32 j = 0; j < k; j++, c++)\n        g_FastPos[c] = slotFast;\n    }\n  }\n};\n\nstatic CFastPosInit g_FastPosInit;\n\n\ninline UInt32 GetPosSlot(UInt32 pos)\n{\n  if (pos < 0x200)\n    return g_FastPos[pos];\n  return g_FastPos[pos >> 8] + 16;\n}\n\nstatic void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }\nstatic void SzFree(void *p, void *address) { p = p; MyFree(address); }\nstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };\n\nCCoder::CCoder(bool deflate64Mode):\n  m_Deflate64Mode(deflate64Mode),\n  m_NumPasses(1),\n  m_NumDivPasses(1),\n  m_NumFastBytes(32),\n  _fastMode(false),\n  _btMode(true),\n  m_OnePosMatchesMemory(0),\n  m_DistanceMemory(0),\n  m_Created(false),\n  m_Values(0),\n  m_Tables(0),\n  m_MatchFinderCycles(0)\n  // m_SetMfPasses(0)\n{\n  m_MatchMaxLen = deflate64Mode ? kMatchMaxLen64 : kMatchMaxLen32;\n  m_NumLenCombinations = deflate64Mode ? kNumLenSymbols64 : kNumLenSymbols32;\n  m_LenStart = deflate64Mode ? kLenStart64 : kLenStart32;\n  m_LenDirectBits = deflate64Mode ? kLenDirectBits64 : kLenDirectBits32;\n  MatchFinder_Construct(&_lzInWindow);\n}\n\nHRESULT CCoder::Create()\n{\n  COM_TRY_BEGIN\n  if (m_Values == 0)\n  {\n    m_Values = (CCodeValue *)MyAlloc((kMaxUncompressedBlockSize) * sizeof(CCodeValue));\n    if (m_Values == 0)\n      return E_OUTOFMEMORY;\n  }\n  if (m_Tables == 0)\n  {\n    m_Tables = (CTables *)MyAlloc((kNumTables) * sizeof(CTables));\n    if (m_Tables == 0)\n      return E_OUTOFMEMORY;\n  }\n\n  if (m_IsMultiPass)\n  {\n    if (m_OnePosMatchesMemory == 0)\n    {\n      m_OnePosMatchesMemory = (UInt16 *)::MidAlloc(kMatchArraySize * sizeof(UInt16));\n      if (m_OnePosMatchesMemory == 0)\n        return E_OUTOFMEMORY;\n    }\n  }\n  else\n  {\n    if (m_DistanceMemory == 0)\n    {\n      m_DistanceMemory = (UInt16 *)MyAlloc((kMatchMaxLen + 2) * 2 * sizeof(UInt16));\n      if (m_DistanceMemory == 0)\n        return E_OUTOFMEMORY;\n      m_MatchDistances = m_DistanceMemory;\n    }\n  }\n\n  if (!m_Created)\n  {\n    _lzInWindow.btMode = _btMode ? 1 : 0;\n    _lzInWindow.numHashBytes = 3;\n    if (!MatchFinder_Create(&_lzInWindow,\n        m_Deflate64Mode ? kHistorySize64 : kHistorySize32,\n        kNumOpts + kMaxUncompressedBlockSize,\n        m_NumFastBytes, m_MatchMaxLen - m_NumFastBytes, &g_Alloc))\n      return E_OUTOFMEMORY;\n    if (!m_OutStream.Create(1 << 20))\n      return E_OUTOFMEMORY;\n  }\n  if (m_MatchFinderCycles != 0)\n    _lzInWindow.cutValue = m_MatchFinderCycles;\n  m_Created = true;\n  return S_OK;\n  COM_TRY_END\n}\n\nHRESULT CCoder::BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)\n{\n  for (UInt32 i = 0; i < numProps; i++)\n  {\n    const PROPVARIANT &prop = props[i];\n    switch(propIDs[i])\n    {\n      case NCoderPropID::kNumPasses:\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        m_NumDivPasses = prop.ulVal;\n        if (m_NumDivPasses == 0)\n          m_NumDivPasses = 1;\n        if (m_NumDivPasses == 1)\n          m_NumPasses = 1;\n        else if (m_NumDivPasses <= kNumDivPassesMax)\n          m_NumPasses = 2;\n        else\n        {\n          m_NumPasses = 2 + (m_NumDivPasses - kNumDivPassesMax);\n          m_NumDivPasses = kNumDivPassesMax;\n        }\n        break;\n      case NCoderPropID::kNumFastBytes:\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        m_NumFastBytes = prop.ulVal;\n        if(m_NumFastBytes < kMatchMinLen || m_NumFastBytes > m_MatchMaxLen)\n          return E_INVALIDARG;\n        break;\n      case NCoderPropID::kMatchFinderCycles:\n      {\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        m_MatchFinderCycles = prop.ulVal;\n        break;\n      }\n      case NCoderPropID::kAlgorithm:\n      {\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        UInt32 maximize = prop.ulVal;\n        _fastMode = (maximize == 0);\n        _btMode = !_fastMode;\n        break;\n      }\n      default:\n        return E_INVALIDARG;\n    }\n  }\n  return S_OK;\n}\n  \nvoid CCoder::Free()\n{\n  ::MidFree(m_OnePosMatchesMemory); m_OnePosMatchesMemory = 0;\n  ::MyFree(m_DistanceMemory); m_DistanceMemory = 0;\n  ::MyFree(m_Values); m_Values = 0;\n  ::MyFree(m_Tables); m_Tables = 0;\n}\n\nCCoder::~CCoder()\n{\n  Free();\n  MatchFinder_Free(&_lzInWindow, &g_Alloc);\n}\n\nNO_INLINE void CCoder::GetMatches()\n{\n  if (m_IsMultiPass)\n  {\n    m_MatchDistances = m_OnePosMatchesMemory + m_Pos;\n    if (m_SecondPass)\n    {\n      m_Pos += *m_MatchDistances + 1;\n      return;\n    }\n  }\n\n  UInt32 distanceTmp[kMatchMaxLen * 2 + 3];\n  \n  UInt32 numPairs = (_btMode) ?\n      Bt3Zip_MatchFinder_GetMatches(&_lzInWindow, distanceTmp):\n      Hc3Zip_MatchFinder_GetMatches(&_lzInWindow, distanceTmp);\n\n  *m_MatchDistances = (UInt16)numPairs;\n   \n  if (numPairs > 0)\n  {\n    UInt32 i;\n    for(i = 0; i < numPairs; i += 2)\n    {\n      m_MatchDistances[i + 1] = (UInt16)distanceTmp[i];\n      m_MatchDistances[i + 2] = (UInt16)distanceTmp[i + 1];\n    }\n    UInt32 len = distanceTmp[numPairs - 2];\n    if (len == m_NumFastBytes && m_NumFastBytes != m_MatchMaxLen)\n    {\n      UInt32 numAvail = Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) + 1;\n      const Byte *pby = Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow) - 1;\n      const Byte *pby2 = pby - (distanceTmp[numPairs - 1] + 1);\n      if (numAvail > m_MatchMaxLen)\n        numAvail = m_MatchMaxLen;\n      for (; len < numAvail && pby[len] == pby2[len]; len++);\n      m_MatchDistances[i - 1] = (UInt16)len;\n    }\n  }\n  if (m_IsMultiPass)\n    m_Pos += numPairs + 1;\n  if (!m_SecondPass)\n    m_AdditionalOffset++;\n}\n\nvoid CCoder::MovePos(UInt32 num)\n{\n  if (!m_SecondPass && num > 0)\n  {\n    if (_btMode)\n      Bt3Zip_MatchFinder_Skip(&_lzInWindow, num);\n    else\n      Hc3Zip_MatchFinder_Skip(&_lzInWindow, num);\n    m_AdditionalOffset += num;\n  }\n}\n\nstatic const UInt32 kIfinityPrice = 0xFFFFFFF;\n\nNO_INLINE UInt32 CCoder::Backward(UInt32 &backRes, UInt32 cur)\n{\n  m_OptimumEndIndex = cur;\n  UInt32 posMem = m_Optimum[cur].PosPrev;\n  UInt16 backMem = m_Optimum[cur].BackPrev;\n  do\n  {\n    UInt32 posPrev = posMem;\n    UInt16 backCur = backMem;\n    backMem = m_Optimum[posPrev].BackPrev;\n    posMem = m_Optimum[posPrev].PosPrev;\n    m_Optimum[posPrev].BackPrev = backCur;\n    m_Optimum[posPrev].PosPrev = (UInt16)cur;\n    cur = posPrev;\n  }\n  while(cur > 0);\n  backRes = m_Optimum[0].BackPrev;\n  m_OptimumCurrentIndex = m_Optimum[0].PosPrev;\n  return m_OptimumCurrentIndex;\n}\n\nNO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)\n{\n  if(m_OptimumEndIndex != m_OptimumCurrentIndex)\n  {\n    UInt32 len = m_Optimum[m_OptimumCurrentIndex].PosPrev - m_OptimumCurrentIndex;\n    backRes = m_Optimum[m_OptimumCurrentIndex].BackPrev;\n    m_OptimumCurrentIndex = m_Optimum[m_OptimumCurrentIndex].PosPrev;\n    return len;\n  }\n  m_OptimumCurrentIndex = m_OptimumEndIndex = 0;\n  \n  GetMatches();\n\n  UInt32 numDistancePairs = m_MatchDistances[0];\n  if(numDistancePairs == 0)\n    return 1;\n\n  const UInt16 *matchDistances = m_MatchDistances + 1;\n  UInt32 lenMain = matchDistances[numDistancePairs - 2];\n\n  if(lenMain > m_NumFastBytes)\n  {\n    backRes = matchDistances[numDistancePairs - 1];\n    MovePos(lenMain - 1);\n    return lenMain;\n  }\n  m_Optimum[1].Price = m_LiteralPrices[Inline_MatchFinder_GetIndexByte(&_lzInWindow, 0 - m_AdditionalOffset)];\n  m_Optimum[1].PosPrev = 0;\n\n  m_Optimum[2].Price = kIfinityPrice;\n  m_Optimum[2].PosPrev = 1;\n\n\n  UInt32 offs = 0;\n  for(UInt32 i = kMatchMinLen; i <= lenMain; i++)\n  {\n    UInt32 distance = matchDistances[offs + 1];\n    m_Optimum[i].PosPrev = 0;\n    m_Optimum[i].BackPrev = (UInt16)distance;\n    m_Optimum[i].Price = m_LenPrices[i - kMatchMinLen] + m_PosPrices[GetPosSlot(distance)];\n    if (i == matchDistances[offs])\n      offs += 2;\n  }\n\n  UInt32 cur = 0;\n  UInt32 lenEnd = lenMain;\n  for (;;)\n  {\n    ++cur;\n    if(cur == lenEnd || cur == kNumOptsBase || m_Pos >= kMatchArrayLimit)\n      return Backward(backRes, cur);\n    GetMatches();\n    matchDistances = m_MatchDistances + 1;\n\n    UInt32 numDistancePairs = m_MatchDistances[0];\n    UInt32 newLen = 0;\n    if(numDistancePairs != 0)\n    {\n      newLen = matchDistances[numDistancePairs - 2];\n      if(newLen > m_NumFastBytes)\n      {\n        UInt32 len = Backward(backRes, cur);\n        m_Optimum[cur].BackPrev = matchDistances[numDistancePairs - 1];\n        m_OptimumEndIndex = cur + newLen;\n        m_Optimum[cur].PosPrev = (UInt16)m_OptimumEndIndex;\n        MovePos(newLen - 1);\n        return len;\n      }\n    }\n    UInt32 curPrice = m_Optimum[cur].Price;\n    UInt32 curAnd1Price = curPrice + m_LiteralPrices[Inline_MatchFinder_GetIndexByte(&_lzInWindow, cur - m_AdditionalOffset)];\n    COptimal &optimum = m_Optimum[cur + 1];\n    if (curAnd1Price < optimum.Price)\n    {\n      optimum.Price = curAnd1Price;\n      optimum.PosPrev = (UInt16)cur;\n    }\n    if(numDistancePairs == 0)\n      continue;\n    while(lenEnd < cur + newLen)\n      m_Optimum[++lenEnd].Price = kIfinityPrice;\n    offs = 0;\n    UInt32 distance = matchDistances[offs + 1];\n    curPrice += m_PosPrices[GetPosSlot(distance)];\n    for(UInt32 lenTest = kMatchMinLen; ; lenTest++)\n    {\n      UInt32 curAndLenPrice = curPrice + m_LenPrices[lenTest - kMatchMinLen];\n      COptimal &optimum = m_Optimum[cur + lenTest];\n      if (curAndLenPrice < optimum.Price)\n      {\n        optimum.Price = curAndLenPrice;\n        optimum.PosPrev = (UInt16)cur;\n        optimum.BackPrev = (UInt16)distance;\n      }\n      if (lenTest == matchDistances[offs])\n      {\n        offs += 2;\n        if (offs == numDistancePairs)\n          break;\n        curPrice -= m_PosPrices[GetPosSlot(distance)];\n        distance = matchDistances[offs + 1];\n        curPrice += m_PosPrices[GetPosSlot(distance)];\n      }\n    }\n  }\n}\n\nUInt32 CCoder::GetOptimalFast(UInt32 &backRes)\n{\n  GetMatches();\n  UInt32 numDistancePairs = m_MatchDistances[0];\n  if (numDistancePairs == 0)\n    return 1;\n  UInt32 lenMain = m_MatchDistances[numDistancePairs - 1];\n  backRes = m_MatchDistances[numDistancePairs];\n  MovePos(lenMain - 1);\n  return lenMain;\n}\n\nvoid CTables::InitStructures()\n{\n  UInt32 i;\n  for(i = 0; i < 256; i++)\n    litLenLevels[i] = 8;\n  litLenLevels[i++] = 13;\n  for(;i < kFixedMainTableSize; i++)\n    litLenLevels[i] = 5;\n  for(i = 0; i < kFixedDistTableSize; i++)\n    distLevels[i] = 5;\n}\n\nNO_INLINE void CCoder::LevelTableDummy(const Byte *levels, int numLevels, UInt32 *freqs)\n{\n  int prevLen = 0xFF;\n  int nextLen = levels[0];\n  int count = 0;\n  int maxCount = 7;\n  int minCount = 4;\n  if (nextLen == 0)\n  {\n    maxCount = 138;\n    minCount = 3;\n  }\n  for (int n = 0; n < numLevels; n++)\n  {\n    int curLen = nextLen;\n    nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;\n    count++;\n    if (count < maxCount && curLen == nextLen)\n      continue;\n    \n    if (count < minCount)\n      freqs[curLen] += (UInt32)count;\n    else if (curLen != 0)\n    {\n      if (curLen != prevLen)\n      {\n        freqs[curLen]++;\n        count--;\n      }\n      freqs[kTableLevelRepNumber]++;\n    }\n    else if (count <= 10)\n      freqs[kTableLevel0Number]++;\n    else\n      freqs[kTableLevel0Number2]++;\n\n    count = 0;\n    prevLen = curLen;\n    \n    if (nextLen == 0)\n    {\n      maxCount = 138;\n      minCount = 3;\n    }\n    else if (curLen == nextLen)\n    {\n      maxCount = 6;\n      minCount = 3;\n    }\n    else\n    {\n      maxCount = 7;\n      minCount = 4;\n    }\n  }\n}\n\nNO_INLINE void CCoder::WriteBits(UInt32 value, int numBits)\n{\n  m_OutStream.WriteBits(value, numBits);\n}\n\n#define WRITE_HF2(codes, lens, i) m_OutStream.WriteBits(codes[i], lens[i])\n#define WRITE_HF(i) WriteBits(codes[i], lens[i])\n\nNO_INLINE void CCoder::LevelTableCode(const Byte *levels, int numLevels, const Byte *lens, const UInt32 *codes)\n{\n  int prevLen = 0xFF;\n  int nextLen = levels[0];\n  int count = 0;\n  int maxCount = 7;\n  int minCount = 4;\n  if (nextLen == 0)\n  {\n    maxCount = 138;\n    minCount = 3;\n  }\n  for (int n = 0; n < numLevels; n++)\n  {\n    int curLen = nextLen;\n    nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;\n    count++;\n    if (count < maxCount && curLen == nextLen)\n      continue;\n    \n    if (count < minCount)\n      for(int i = 0; i < count; i++)\n        WRITE_HF(curLen);\n    else if (curLen != 0)\n    {\n      if (curLen != prevLen)\n      {\n        WRITE_HF(curLen);\n        count--;\n      }\n      WRITE_HF(kTableLevelRepNumber);\n      WriteBits(count - 3, 2);\n    }\n    else if (count <= 10)\n    {\n      WRITE_HF(kTableLevel0Number);\n      WriteBits(count - 3, 3);\n    }\n    else\n    {\n      WRITE_HF(kTableLevel0Number2);\n      WriteBits(count - 11, 7);\n    }\n\n    count = 0;\n    prevLen = curLen;\n    \n    if (nextLen == 0)\n    {\n      maxCount = 138;\n      minCount = 3;\n    }\n    else if (curLen == nextLen)\n    {\n      maxCount = 6;\n      minCount = 3;\n    }\n    else\n    {\n      maxCount = 7;\n      minCount = 4;\n    }\n  }\n}\n\nNO_INLINE void CCoder::MakeTables(unsigned maxHuffLen)\n{\n  Huffman_Generate(mainFreqs, mainCodes, m_NewLevels.litLenLevels, kFixedMainTableSize, maxHuffLen);\n  Huffman_Generate(distFreqs, distCodes, m_NewLevels.distLevels, kDistTableSize64, maxHuffLen);\n}\n\nNO_INLINE UInt32 Huffman_GetPrice(const UInt32 *freqs, const Byte *lens, UInt32 num)\n{\n  UInt32 price = 0;\n  UInt32 i;\n  for (i = 0; i < num; i++)\n    price += lens[i] * freqs[i];\n  return price;\n};\n\nNO_INLINE UInt32 Huffman_GetPrice_Spec(const UInt32 *freqs, const Byte *lens, UInt32 num, const Byte *extraBits, UInt32 extraBase)\n{\n  return Huffman_GetPrice(freqs, lens, num) +\n    Huffman_GetPrice(freqs + extraBase, extraBits, num - extraBase);\n}\n\nNO_INLINE UInt32 CCoder::GetLzBlockPrice() const\n{\n  return\n    Huffman_GetPrice_Spec(mainFreqs, m_NewLevels.litLenLevels, kFixedMainTableSize, m_LenDirectBits, kSymbolMatch) +\n    Huffman_GetPrice_Spec(distFreqs, m_NewLevels.distLevels, kDistTableSize64, kDistDirectBits, 0);\n}\n\nNO_INLINE void CCoder::TryBlock()\n{\n  memset(mainFreqs, 0, sizeof(mainFreqs));\n  memset(distFreqs, 0, sizeof(distFreqs));\n\n  m_ValueIndex = 0;\n  UInt32 blockSize = BlockSizeRes;\n  BlockSizeRes = 0;\n  for (;;)\n  {\n    if (m_OptimumCurrentIndex == m_OptimumEndIndex)\n    {\n      if (m_Pos >= kMatchArrayLimit || BlockSizeRes >= blockSize || !m_SecondPass &&\n          ((Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) == 0) || m_ValueIndex >= m_ValueBlockSize))\n        break;\n    }\n    UInt32 pos;\n    UInt32 len;\n    if (_fastMode)\n      len = GetOptimalFast(pos);\n    else\n      len = GetOptimal(pos);\n    CCodeValue &codeValue = m_Values[m_ValueIndex++];\n    if (len >= kMatchMinLen)\n    {\n      UInt32 newLen = len - kMatchMinLen;\n      codeValue.Len = (UInt16)newLen;\n      mainFreqs[kSymbolMatch + g_LenSlots[newLen]]++;\n      codeValue.Pos = (UInt16)pos;\n      distFreqs[GetPosSlot(pos)]++;\n    }\n    else\n    {\n      Byte b = Inline_MatchFinder_GetIndexByte(&_lzInWindow, 0 - m_AdditionalOffset);\n      mainFreqs[b]++;\n      codeValue.SetAsLiteral();\n      codeValue.Pos = b;\n    }\n    m_AdditionalOffset -= len;\n    BlockSizeRes += len;\n  }\n  mainFreqs[kSymbolEndOfBlock]++;\n  m_AdditionalOffset += BlockSizeRes;\n  m_SecondPass = true;\n}\n\nNO_INLINE void CCoder::SetPrices(const CLevels &levels)\n{\n  if (_fastMode)\n    return;\n  UInt32 i;\n  for(i = 0; i < 256; i++)\n  {\n    Byte price = levels.litLenLevels[i];\n    m_LiteralPrices[i] = ((price != 0) ? price : kNoLiteralStatPrice);\n  }\n  \n  for(i = 0; i < m_NumLenCombinations; i++)\n  {\n    UInt32 slot = g_LenSlots[i];\n    Byte price = levels.litLenLevels[kSymbolMatch + slot];\n    m_LenPrices[i] = (Byte)(((price != 0) ? price : kNoLenStatPrice) + m_LenDirectBits[slot]);\n  }\n  \n  for(i = 0; i < kDistTableSize64; i++)\n  {\n    Byte price = levels.distLevels[i];\n    m_PosPrices[i] = (Byte)(((price != 0) ? price: kNoPosStatPrice) + kDistDirectBits[i]);\n  }\n}\n\nNO_INLINE void Huffman_ReverseBits(UInt32 *codes, const Byte *lens, UInt32 num)\n{\n  for (UInt32 i = 0; i < num; i++)\n  {\n    UInt32 x = codes[i];\n    x = ((x & 0x5555) << 1) | ((x & 0xAAAA) >> 1);\n    x = ((x & 0x3333) << 2) | ((x & 0xCCCC) >> 2);\n    x = ((x & 0x0F0F) << 4) | ((x & 0xF0F0) >> 4);\n    codes[i] = (((x & 0x00FF) << 8) | ((x & 0xFF00) >> 8)) >> (16 - lens[i]);\n  }\n}\n\nNO_INLINE void CCoder::WriteBlock()\n{\n  Huffman_ReverseBits(mainCodes, m_NewLevels.litLenLevels, kFixedMainTableSize);\n  Huffman_ReverseBits(distCodes, m_NewLevels.distLevels, kDistTableSize64);\n\n  for (UInt32 i = 0; i < m_ValueIndex; i++)\n  {\n    const CCodeValue &codeValue = m_Values[i];\n    if (codeValue.IsLiteral())\n      WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, codeValue.Pos);\n    else\n    {\n      UInt32 len = codeValue.Len;\n      UInt32 lenSlot = g_LenSlots[len];\n      WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, kSymbolMatch + lenSlot);\n      m_OutStream.WriteBits(len - m_LenStart[lenSlot], m_LenDirectBits[lenSlot]);\n      UInt32 dist = codeValue.Pos;\n      UInt32 posSlot = GetPosSlot(dist);\n      WRITE_HF2(distCodes, m_NewLevels.distLevels, posSlot);\n      m_OutStream.WriteBits(dist - kDistStart[posSlot], kDistDirectBits[posSlot]);\n    }\n  }\n  WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, kSymbolEndOfBlock);\n}\n\nstatic UInt32 GetStorePrice(UInt32 blockSize, int bitPosition)\n{\n  UInt32 price = 0;\n  do\n  {\n    UInt32 nextBitPosition = (bitPosition + kFinalBlockFieldSize + kBlockTypeFieldSize) & 7;\n    int numBitsForAlign = nextBitPosition > 0 ? (8 - nextBitPosition): 0;\n    UInt32 curBlockSize = (blockSize < (1 << 16)) ? blockSize : (1 << 16) - 1;\n    price += kFinalBlockFieldSize + kBlockTypeFieldSize + numBitsForAlign + (2 + 2) * 8 + curBlockSize * 8;\n    bitPosition = 0;\n    blockSize -= curBlockSize;\n  }\n  while(blockSize != 0);\n  return price;\n}\n\nvoid CCoder::WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock)\n{\n  do\n  {\n    UInt32 curBlockSize = (blockSize < (1 << 16)) ? blockSize : (1 << 16) - 1;\n    blockSize -= curBlockSize;\n    WriteBits((finalBlock && (blockSize == 0) ? NFinalBlockField::kFinalBlock: NFinalBlockField::kNotFinalBlock), kFinalBlockFieldSize);\n    WriteBits(NBlockType::kStored, kBlockTypeFieldSize);\n    m_OutStream.FlushByte();\n    WriteBits((UInt16)curBlockSize, kStoredBlockLengthFieldSize);\n    WriteBits((UInt16)~curBlockSize, kStoredBlockLengthFieldSize);\n    const Byte *data = Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow)- additionalOffset;\n    for(UInt32 i = 0; i < curBlockSize; i++)\n      m_OutStream.WriteByte(data[i]);\n    additionalOffset -= curBlockSize;\n  }\n  while(blockSize != 0);\n}\n\nNO_INLINE UInt32 CCoder::TryDynBlock(int tableIndex, UInt32 numPasses)\n{\n  CTables &t = m_Tables[tableIndex];\n  BlockSizeRes = t.BlockSizeRes;\n  UInt32 posTemp = t.m_Pos;\n  SetPrices(t);\n\n  for (UInt32 p = 0; p < numPasses; p++)\n  {\n    m_Pos = posTemp;\n    TryBlock();\n    unsigned numHuffBits =\n        (m_ValueIndex > 18000 ? 12 :\n        (m_ValueIndex >  7000 ? 11 :\n        (m_ValueIndex >  2000 ? 10 : 9)));\n    MakeTables(numHuffBits);\n    SetPrices(m_NewLevels);\n  }\n\n  (CLevels &)t = m_NewLevels;\n\n  m_NumLitLenLevels = kMainTableSize;\n  while(m_NumLitLenLevels > kNumLitLenCodesMin && m_NewLevels.litLenLevels[m_NumLitLenLevels - 1] == 0)\n    m_NumLitLenLevels--;\n  \n  m_NumDistLevels = kDistTableSize64;\n  while(m_NumDistLevels > kNumDistCodesMin && m_NewLevels.distLevels[m_NumDistLevels - 1] == 0)\n    m_NumDistLevels--;\n  \n  UInt32 levelFreqs[kLevelTableSize];\n  memset(levelFreqs, 0, sizeof(levelFreqs));\n\n  LevelTableDummy(m_NewLevels.litLenLevels, m_NumLitLenLevels, levelFreqs);\n  LevelTableDummy(m_NewLevels.distLevels, m_NumDistLevels, levelFreqs);\n  \n  Huffman_Generate(levelFreqs, levelCodes, levelLens, kLevelTableSize, kMaxLevelBitLength);\n  \n  m_NumLevelCodes = kNumLevelCodesMin;\n  for (UInt32 i = 0; i < kLevelTableSize; i++)\n  {\n    Byte level = levelLens[kCodeLengthAlphabetOrder[i]];\n    if (level > 0 && i >= m_NumLevelCodes)\n      m_NumLevelCodes = i + 1;\n    m_LevelLevels[i] = level;\n  }\n  \n  return GetLzBlockPrice() +\n      Huffman_GetPrice_Spec(levelFreqs, levelLens, kLevelTableSize, kLevelDirectBits, kTableDirectLevels) +\n      kNumLenCodesFieldSize + kNumDistCodesFieldSize + kNumLevelCodesFieldSize +\n      m_NumLevelCodes * kLevelFieldSize + kFinalBlockFieldSize + kBlockTypeFieldSize;\n}\n\nNO_INLINE UInt32 CCoder::TryFixedBlock(int tableIndex)\n{\n  CTables &t = m_Tables[tableIndex];\n  BlockSizeRes = t.BlockSizeRes;\n  m_Pos = t.m_Pos;\n  m_NewLevels.SetFixedLevels();\n  SetPrices(m_NewLevels);\n  TryBlock();\n  return kFinalBlockFieldSize + kBlockTypeFieldSize + GetLzBlockPrice();\n}\n\nNO_INLINE UInt32 CCoder::GetBlockPrice(int tableIndex, int numDivPasses)\n{\n  CTables &t = m_Tables[tableIndex];\n  t.StaticMode = false;\n  UInt32 price = TryDynBlock(tableIndex, m_NumPasses);\n  t.BlockSizeRes = BlockSizeRes;\n  UInt32 numValues = m_ValueIndex;\n  UInt32 posTemp = m_Pos;\n  UInt32 additionalOffsetEnd = m_AdditionalOffset;\n  \n  if (m_CheckStatic && m_ValueIndex <= kFixedHuffmanCodeBlockSizeMax)\n  {\n    const UInt32 fixedPrice = TryFixedBlock(tableIndex);\n    t.StaticMode = (fixedPrice < price);\n    if (t.StaticMode)\n      price = fixedPrice;\n  }\n\n  const UInt32 storePrice = GetStorePrice(BlockSizeRes, 0); // bitPosition\n  t.StoreMode = (storePrice <= price);\n  if (t.StoreMode)\n    price = storePrice;\n\n  t.UseSubBlocks = false;\n\n  if (numDivPasses > 1 && numValues >= kDivideCodeBlockSizeMin)\n  {\n    CTables &t0 = m_Tables[(tableIndex << 1)];\n    (CLevels &)t0 = t;\n    t0.BlockSizeRes = t.BlockSizeRes >> 1;\n    t0.m_Pos = t.m_Pos;\n    UInt32 subPrice = GetBlockPrice((tableIndex << 1), numDivPasses - 1);\n\n    UInt32 blockSize2 = t.BlockSizeRes - t0.BlockSizeRes;\n    if (t0.BlockSizeRes >= kDivideBlockSizeMin && blockSize2 >= kDivideBlockSizeMin)\n    {\n      CTables &t1 = m_Tables[(tableIndex << 1) + 1];\n      (CLevels &)t1 = t;\n      t1.BlockSizeRes = blockSize2;\n      t1.m_Pos = m_Pos;\n      m_AdditionalOffset -= t0.BlockSizeRes;\n      subPrice += GetBlockPrice((tableIndex << 1) + 1, numDivPasses - 1);\n      t.UseSubBlocks = (subPrice < price);\n      if (t.UseSubBlocks)\n        price = subPrice;\n    }\n  }\n  m_AdditionalOffset = additionalOffsetEnd;\n  m_Pos = posTemp;\n  return price;\n}\n\nvoid CCoder::CodeBlock(int tableIndex, bool finalBlock)\n{\n  CTables &t = m_Tables[tableIndex];\n  if (t.UseSubBlocks)\n  {\n    CodeBlock((tableIndex << 1), false);\n    CodeBlock((tableIndex << 1) + 1, finalBlock);\n  }\n  else\n  {\n    if (t.StoreMode)\n      WriteStoreBlock(t.BlockSizeRes, m_AdditionalOffset, finalBlock);\n    else\n    {\n      WriteBits((finalBlock ? NFinalBlockField::kFinalBlock: NFinalBlockField::kNotFinalBlock), kFinalBlockFieldSize);\n      if (t.StaticMode)\n      {\n        WriteBits(NBlockType::kFixedHuffman, kBlockTypeFieldSize);\n        TryFixedBlock(tableIndex);\n        int i;\n        const int kMaxStaticHuffLen = 9;\n        for (i = 0; i < kFixedMainTableSize; i++)\n          mainFreqs[i] = (UInt32)1 << (kMaxStaticHuffLen - m_NewLevels.litLenLevels[i]);\n        for (i = 0; i < kFixedDistTableSize; i++)\n          distFreqs[i] = (UInt32)1 << (kMaxStaticHuffLen - m_NewLevels.distLevels[i]);\n        MakeTables(kMaxStaticHuffLen);\n      }\n      else\n      {\n        if (m_NumDivPasses > 1 || m_CheckStatic)\n          TryDynBlock(tableIndex, 1);\n        WriteBits(NBlockType::kDynamicHuffman, kBlockTypeFieldSize);\n        WriteBits(m_NumLitLenLevels - kNumLitLenCodesMin, kNumLenCodesFieldSize);\n        WriteBits(m_NumDistLevels - kNumDistCodesMin, kNumDistCodesFieldSize);\n        WriteBits(m_NumLevelCodes - kNumLevelCodesMin, kNumLevelCodesFieldSize);\n        \n        for (UInt32 i = 0; i < m_NumLevelCodes; i++)\n          WriteBits(m_LevelLevels[i], kLevelFieldSize);\n        \n        Huffman_ReverseBits(levelCodes, levelLens, kLevelTableSize);\n        LevelTableCode(m_NewLevels.litLenLevels, m_NumLitLenLevels, levelLens, levelCodes);\n        LevelTableCode(m_NewLevels.distLevels, m_NumDistLevels, levelLens, levelCodes);\n      }\n      WriteBlock();\n    }\n    m_AdditionalOffset -= t.BlockSizeRes;\n  }\n}\n\nSRes Read(void *object, void *data, size_t *size)\n{\n  const UInt32 kStepSize = (UInt32)1 << 31;\n  UInt32 curSize = ((*size < kStepSize) ? (UInt32)*size : kStepSize);\n  HRESULT res = ((CSeqInStream *)object)->RealStream->Read(data, curSize, &curSize);\n  *size = curSize;\n  return (SRes)res;\n}\n\nHRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */ , const UInt64 * /* outSize */ , ICompressProgressInfo *progress)\n{\n  m_CheckStatic = (m_NumPasses != 1 || m_NumDivPasses != 1);\n  m_IsMultiPass = (m_CheckStatic || (m_NumPasses != 1 || m_NumDivPasses != 1));\n\n  RINOK(Create());\n\n  m_ValueBlockSize = (7 << 10) + (1 << 12) * m_NumDivPasses;\n\n  UInt64 nowPos = 0;\n\n  _seqInStream.RealStream = inStream;\n  _seqInStream.SeqInStream.Read = Read;\n  _lzInWindow.stream = &_seqInStream.SeqInStream;\n\n  MatchFinder_Init(&_lzInWindow);\n  m_OutStream.SetStream(outStream);\n  m_OutStream.Init();\n\n  CCoderReleaser coderReleaser(this);\n\n  m_OptimumEndIndex = m_OptimumCurrentIndex = 0;\n\n  CTables &t = m_Tables[1];\n  t.m_Pos = 0;\n  t.InitStructures();\n\n  m_AdditionalOffset = 0;\n  do\n  {\n    t.BlockSizeRes = kBlockUncompressedSizeThreshold;\n    m_SecondPass = false;\n    GetBlockPrice(1, m_NumDivPasses);\n    CodeBlock(1, Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) == 0);\n    nowPos += m_Tables[1].BlockSizeRes;\n    if (progress != NULL)\n    {\n      UInt64 packSize = m_OutStream.GetProcessedSize();\n      RINOK(progress->SetRatioInfo(&nowPos, &packSize));\n    }\n  }\n  while (Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) != 0);\n  if (_lzInWindow.result != SZ_OK)\n    return _lzInWindow.result;\n  return m_OutStream.Flush();\n}\n\nHRESULT CCoder::BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  return CodeReal(inStream, outStream, inSize, outSize, progress); \n}\n\nSTDMETHODIMP CCOMCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n  { return BaseCode(inStream, outStream, inSize, outSize, progress); }\n\nSTDMETHODIMP CCOMCoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)\n  { return BaseSetEncoderProperties2(propIDs, props, numProps); }\n\nSTDMETHODIMP CCOMCoder64::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n  { return BaseCode(inStream, outStream, inSize, outSize, progress); }\n\nSTDMETHODIMP CCOMCoder64::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)\n  { return BaseSetEncoderProperties2(propIDs, props, numProps); }\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DeflateEncoder.h",
    "content": "// DeflateEncoder.h\n\n#ifndef __DEFLATE_ENCODER_H\n#define __DEFLATE_ENCODER_H\n\nextern \"C\"\n{\n  #include \"../../../C/LzFind.h\"\n}\n\n#include \"Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"BitlEncoder.h\"\n#include \"DeflateConst.h\"\n\nnamespace NCompress {\nnamespace NDeflate {\nnamespace NEncoder {\n\nstruct CCodeValue\n{\n  UInt16 Len;\n  UInt16 Pos;\n  void SetAsLiteral() { Len = (1 << 15); }\n  bool IsLiteral() const { return (Len >= (1 << 15)); }\n};\n\nstruct COptimal\n{\n  UInt32 Price;\n  UInt16 PosPrev;\n  UInt16 BackPrev;\n};\n\nconst UInt32 kNumOptsBase = 1 << 12;\nconst UInt32 kNumOpts = kNumOptsBase + kMatchMaxLen;\n\nclass CCoder;\n\nstruct CTables: public CLevels\n{\n  bool UseSubBlocks;\n  bool StoreMode;\n  bool StaticMode;\n  UInt32 BlockSizeRes;\n  UInt32 m_Pos;\n  void InitStructures();\n};\n\ntypedef struct _CSeqInStream\n{\n  ISeqInStream SeqInStream;\n  CMyComPtr<ISequentialInStream> RealStream;\n} CSeqInStream;\n\nclass CCoder\n{\n  CMatchFinder _lzInWindow;\n  CBitlEncoder m_OutStream;\n\n  CSeqInStream _seqInStream;\n\npublic:\n  CCodeValue *m_Values;\n\n  UInt16 *m_MatchDistances;\n  UInt32 m_NumFastBytes;\n  bool _fastMode;\n  bool _btMode;\n\n  UInt16 *m_OnePosMatchesMemory;\n  UInt16 *m_DistanceMemory;\n\n  UInt32 m_Pos;\n\n  int m_NumPasses;\n  int m_NumDivPasses;\n  bool m_CheckStatic;\n  bool m_IsMultiPass;\n  UInt32 m_ValueBlockSize;\n\n  UInt32 m_NumLenCombinations;\n  UInt32 m_MatchMaxLen;\n  const Byte *m_LenStart;\n  const Byte *m_LenDirectBits;\n\n  bool m_Created;\n  bool m_Deflate64Mode;\n\n  Byte m_LevelLevels[kLevelTableSize];\n  int m_NumLitLenLevels;\n  int m_NumDistLevels;\n  UInt32 m_NumLevelCodes;\n  UInt32 m_ValueIndex;\n\n  bool m_SecondPass;\n  UInt32 m_AdditionalOffset;\n\n  UInt32 m_OptimumEndIndex;\n  UInt32 m_OptimumCurrentIndex;\n  \n  Byte  m_LiteralPrices[256];\n  Byte  m_LenPrices[kNumLenSymbolsMax];\n  Byte  m_PosPrices[kDistTableSize64];\n\n  CLevels m_NewLevels;\n  UInt32 mainFreqs[kFixedMainTableSize];\n  UInt32 distFreqs[kDistTableSize64];\n  UInt32 mainCodes[kFixedMainTableSize];\n  UInt32 distCodes[kDistTableSize64];\n  UInt32 levelCodes[kLevelTableSize];\n  Byte levelLens[kLevelTableSize];\n\n  UInt32 BlockSizeRes;\n\n  CTables *m_Tables;\n  COptimal m_Optimum[kNumOpts];\n\n  UInt32 m_MatchFinderCycles;\n  // IMatchFinderSetNumPasses *m_SetMfPasses;\n\n  void GetMatches();\n  void MovePos(UInt32 num);\n  UInt32 Backward(UInt32 &backRes, UInt32 cur);\n  UInt32 GetOptimal(UInt32 &backRes);\n  UInt32 GetOptimalFast(UInt32 &backRes);\n\n  void LevelTableDummy(const Byte *levels, int numLevels, UInt32 *freqs);\n\n  void WriteBits(UInt32 value, int numBits);\n  void LevelTableCode(const Byte *levels, int numLevels, const Byte *lens, const UInt32 *codes);\n\n  void MakeTables(unsigned maxHuffLen);\n  UInt32 GetLzBlockPrice() const;\n  void TryBlock();\n  UInt32 TryDynBlock(int tableIndex, UInt32 numPasses);\n\n  UInt32 TryFixedBlock(int tableIndex);\n\n  void SetPrices(const CLevels &levels);\n  void WriteBlock();\n\n  HRESULT Create();\n  void Free();\n\n  void WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock);\n  void WriteTables(bool writeMode, bool finalBlock);\n  \n  void WriteBlockData(bool writeMode, bool finalBlock);\n\n  void ReleaseStreams()\n  {\n    _seqInStream.RealStream.Release();\n    m_OutStream.ReleaseStream();\n  }\n  class CCoderReleaser\n  {\n    CCoder *m_Coder;\n  public:\n    CCoderReleaser(CCoder *coder): m_Coder(coder) {}\n    ~CCoderReleaser() { m_Coder->ReleaseStreams(); }\n  };\n  friend class CCoderReleaser;\n\n  UInt32 GetBlockPrice(int tableIndex, int numDivPasses);\n  void CodeBlock(int tableIndex, bool finalBlock);\n\npublic:\n  CCoder(bool deflate64Mode = false);\n  ~CCoder();\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  HRESULT BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  HRESULT BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);\n};\n\n\nclass CCOMCoder :\n  public ICompressCoder,\n  public ICompressSetCoderProperties,\n  public CMyUnknownImp,\n  public CCoder\n{\npublic:\n  MY_UNKNOWN_IMP1(ICompressSetCoderProperties)\n  CCOMCoder(): CCoder(false) {};\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);\n};\n\nclass CCOMCoder64 :\n  public ICompressCoder,\n  public ICompressSetCoderProperties,\n  public CMyUnknownImp,\n  public CCoder\n{\npublic:\n  MY_UNKNOWN_IMP1(ICompressSetCoderProperties)\n  CCOMCoder64(): CCoder(true) {};\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DeflateNsisRegister.cpp",
    "content": "// DeflateNsisRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"DeflateDecoder.h\"\n\nstatic void *CreateCodecDeflateNsis() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CNsisCOMCoder); }\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodecDeflateNsis, 0,   0x040901, L\"DeflateNSIS\", 1, false };\n\nREGISTER_CODEC(DeflateNsis)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DeflateRegister.cpp",
    "content": "// DeflateRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"DeflateDecoder.h\"\n\nstatic void *CreateCodecDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder); }\n\n#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY)\n#include \"DeflateEncoder.h\"\nstatic void *CreateCodecOutDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder);  }\n#else\n#define CreateCodecOutDeflate 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodecDeflate,   CreateCodecOutDeflate,   0x040108, L\"Deflate\", 1, false };\n\nvoid RegisterDeflate()\n{\n\tRegisterCodec(&g_CodecInfo);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DllExports.cpp",
    "content": "// DllExports.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/MyInitGuid.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\nstatic const unsigned int kNumCodecsMax = 32;\nunsigned int g_NumCodecs = 0;\nconst CCodecInfo *g_Codecs[kNumCodecsMax];\nvoid RegisterCodec(const CCodecInfo *codecInfo)\n{\n  if (g_NumCodecs < kNumCodecsMax)\n    g_Codecs[g_NumCodecs++] = codecInfo;\n}\n\n#ifdef _WIN32\nextern \"C\"\nBOOL WINAPI DllMain(HINSTANCE /* hInstance */, DWORD /* dwReason */, LPVOID /*lpReserved*/)\n{\n  return TRUE;\n}\n#endif\n\nstatic const UInt16 kDecodeId = 0x2790;\n\nDEFINE_GUID(CLSID_CCodec,\n0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n\nSTDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);\n\nSTDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)\n{\n  return CreateCoder(clsid, iid, outObject);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/DllExports2.cpp",
    "content": "// DllExports.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/MyInitGuid.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\nextern \"C\"\nBOOL WINAPI DllMain(HINSTANCE /* hInstance */, DWORD /* dwReason */, LPVOID /*lpReserved*/)\n{\n  return TRUE;\n}\n\nstatic const UInt16 kDecodeId = 0x2790;\n\nDEFINE_GUID(CLSID_CCodec,\n0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n\nSTDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);\n\nSTDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)\n{\n  return CreateCoder(clsid, iid, outObject);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/HuffmanDecoder.h",
    "content": "// Compress/HuffmanDecoder.h\n\n#ifndef __COMPRESS_HUFFMAN_DECODER_H\n#define __COMPRESS_HUFFMAN_DECODER_H\n\n#include \"../../Common/Types.h\"\n\nnamespace NCompress {\nnamespace NHuffman {\n\nconst int kNumTableBits = 9;\n\ntemplate <int kNumBitsMax, UInt32 m_NumSymbols>\nclass CDecoder\n{\n  UInt32 m_Limits[kNumBitsMax + 1];     // m_Limits[i] = value limit for symbols with length = i\n  UInt32 m_Positions[kNumBitsMax + 1];  // m_Positions[i] = index in m_Symbols[] of first symbol with length = i\n  UInt32 m_Symbols[m_NumSymbols];\n  Byte m_Lengths[1 << kNumTableBits];   // Table oh length for short codes.\n\npublic:\n  \n  bool SetCodeLengths(const Byte *codeLengths)\n  {\n    int lenCounts[kNumBitsMax + 1];\n    UInt32 tmpPositions[kNumBitsMax + 1];\n    int i;\n    for(i = 1; i <= kNumBitsMax; i++)\n      lenCounts[i] = 0;\n    UInt32 symbol;\n    for (symbol = 0; symbol < m_NumSymbols; symbol++)\n    {\n      int len = codeLengths[symbol];\n      if (len > kNumBitsMax)\n        return false;\n      lenCounts[len]++;\n      m_Symbols[symbol] = 0xFFFFFFFF;\n    }\n    lenCounts[0] = 0;\n    m_Positions[0] = m_Limits[0] = 0;\n    UInt32 startPos = 0;\n    UInt32 index = 0;\n    const UInt32 kMaxValue = (1 << kNumBitsMax);\n    for (i = 1; i <= kNumBitsMax; i++)\n    {\n      startPos += lenCounts[i] << (kNumBitsMax - i);\n      if (startPos > kMaxValue)\n        return false;\n      m_Limits[i] = (i == kNumBitsMax) ? kMaxValue : startPos;\n      m_Positions[i] = m_Positions[i - 1] + lenCounts[i - 1];\n      tmpPositions[i] = m_Positions[i];\n      if(i <= kNumTableBits)\n      {\n        UInt32 limit = (m_Limits[i] >> (kNumBitsMax - kNumTableBits));\n        for (; index < limit; index++)\n          m_Lengths[index] = (Byte)i;\n      }\n    }\n    for (symbol = 0; symbol < m_NumSymbols; symbol++)\n    {\n      int len = codeLengths[symbol];\n      if (len != 0)\n        m_Symbols[tmpPositions[len]++] = symbol;\n    }\n    return true;\n  }\n\n  template <class TBitDecoder>\n  UInt32 DecodeSymbol(TBitDecoder *bitStream)\n  {\n    int numBits;\n    UInt32 value = bitStream->GetValue(kNumBitsMax);\n    if (value < m_Limits[kNumTableBits])\n      numBits = m_Lengths[value >> (kNumBitsMax - kNumTableBits)];\n    else\n      for (numBits = kNumTableBits + 1; value >= m_Limits[numBits]; numBits++);\n    bitStream->MovePos(numBits);\n    UInt32 index = m_Positions[numBits] +\n      ((value - m_Limits[numBits - 1]) >> (kNumBitsMax - numBits));\n    if (index >= m_NumSymbols)\n      // throw CDecoderException(); // test it\n      return 0xFFFFFFFF;\n    return m_Symbols[index];\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ImplodeDecoder.cpp",
    "content": "// Implode/Decoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ImplodeDecoder.h\"\n#include \"Common/Defs.h\"\n\nnamespace NCompress {\nnamespace NImplode {\nnamespace NDecoder {\n\nclass CException\n{\npublic:\n  enum ECauseType\n  {\n    kData\n  } m_Cause;\n  CException(ECauseType cause): m_Cause(cause) {}\n};\n\nstatic const int kNumDistanceLowDirectBitsForBigDict = 7;\nstatic const int kNumDistanceLowDirectBitsForSmallDict = 6;\n\nstatic const int kNumBitsInByte = 8;\n\n// static const int kLevelStructuresNumberFieldSize = kNumBitsInByte;\nstatic const int kLevelStructuresNumberAdditionalValue = 1;\n\nstatic const int kNumLevelStructureLevelBits = 4;\nstatic const int kLevelStructureLevelAdditionalValue = 1;\n\nstatic const int kNumLevelStructureRepNumberBits = 4;\nstatic const int kLevelStructureRepNumberAdditionalValue = 1;\n\n\nstatic const int kLiteralTableSize = (1 << kNumBitsInByte);\nstatic const int kDistanceTableSize = 64;\nstatic const int kLengthTableSize = 64;\n\nstatic const UInt32 kHistorySize =\n    (1 << MyMax(kNumDistanceLowDirectBitsForBigDict,\n                kNumDistanceLowDirectBitsForSmallDict)) *\n    kDistanceTableSize; // = 8 KB;\n\nstatic const int kNumAdditionalLengthBits = 8;\n\nstatic const UInt32 kMatchMinLenWhenLiteralsOn = 3;\nstatic const UInt32 kMatchMinLenWhenLiteralsOff = 2;\n\nstatic const UInt32 kMatchMinLenMax = MyMax(kMatchMinLenWhenLiteralsOn,\n    kMatchMinLenWhenLiteralsOff);  // 3\n\n// static const UInt32 kMatchMaxLenMax = kMatchMinLenMax + (kLengthTableSize - 1) + (1 << kNumAdditionalLengthBits) - 1;  // or 2\n\nenum\n{\n  kMatchId = 0,\n  kLiteralId = 1\n};\n\n\nCCoder::CCoder():\n  m_LiteralDecoder(kLiteralTableSize),\n  m_LengthDecoder(kLengthTableSize),\n  m_DistanceDecoder(kDistanceTableSize)\n{\n}\n\nvoid CCoder::ReleaseStreams()\n{\n  m_OutWindowStream.ReleaseStream();\n  m_InBitStream.ReleaseStream();\n}\n\nbool CCoder::ReadLevelItems(NImplode::NHuffman::CDecoder &decoder,\n    Byte *levels, int numLevelItems)\n{\n  int numCodedStructures = m_InBitStream.ReadBits(kNumBitsInByte) +\n      kLevelStructuresNumberAdditionalValue;\n  int currentIndex = 0;\n  for(int i = 0; i < numCodedStructures; i++)\n  {\n    int level = m_InBitStream.ReadBits(kNumLevelStructureLevelBits) +\n      kLevelStructureLevelAdditionalValue;\n    int rep = m_InBitStream.ReadBits(kNumLevelStructureRepNumberBits) +\n      kLevelStructureRepNumberAdditionalValue;\n    if (currentIndex + rep > numLevelItems)\n      return false;\n    for(int j = 0; j < rep; j++)\n      levels[currentIndex++] = (Byte)level;\n  }\n  if (currentIndex != numLevelItems)\n    return false;\n  return decoder.SetCodeLengths(levels);\n}\n\n\nbool CCoder::ReadTables(void)\n{\n  if (m_LiteralsOn)\n  {\n    Byte literalLevels[kLiteralTableSize];\n    if (!ReadLevelItems(m_LiteralDecoder, literalLevels, kLiteralTableSize))\n      return false;\n  }\n\n  Byte lengthLevels[kLengthTableSize];\n  if (!ReadLevelItems(m_LengthDecoder, lengthLevels, kLengthTableSize))\n    return false;\n\n  Byte distanceLevels[kDistanceTableSize];\n  return ReadLevelItems(m_DistanceDecoder, distanceLevels, kDistanceTableSize);\n}\n\nclass CCoderReleaser\n{\n  CCoder *m_Coder;\npublic:\n  CCoderReleaser(CCoder *coder): m_Coder(coder) {}\n  ~CCoderReleaser() { m_Coder->ReleaseStreams(); }\n};\n\nHRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  if (!m_InBitStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n  if (!m_OutWindowStream.Create(kHistorySize))\n    return E_OUTOFMEMORY;\n  if (outSize == NULL)\n    return E_INVALIDARG;\n  UInt64 pos = 0, unPackSize = *outSize;\n\n  m_OutWindowStream.SetStream(outStream);\n  m_OutWindowStream.Init(false);\n  m_InBitStream.SetStream(inStream);\n  m_InBitStream.Init();\n  CCoderReleaser coderReleaser(this);\n\n  if (!ReadTables())\n    return S_FALSE;\n  \n  while(pos < unPackSize)\n  {\n    if (progress != NULL && pos % (1 << 16) == 0)\n    {\n      UInt64 packSize = m_InBitStream.GetProcessedSize();\n      RINOK(progress->SetRatioInfo(&packSize, &pos));\n    }\n    if(m_InBitStream.ReadBits(1) == kMatchId) // match\n    {\n      UInt32 lowDistBits = m_InBitStream.ReadBits(m_NumDistanceLowDirectBits);\n      UInt32 distance = m_DistanceDecoder.DecodeSymbol(&m_InBitStream);\n      if (distance >= kDistanceTableSize)\n        return S_FALSE;\n      distance = (distance << m_NumDistanceLowDirectBits) + lowDistBits;\n      UInt32 lengthSymbol = m_LengthDecoder.DecodeSymbol(&m_InBitStream);\n      if (lengthSymbol >= kLengthTableSize)\n        return S_FALSE;\n      UInt32 length = lengthSymbol + m_MinMatchLength;\n      if (lengthSymbol == kLengthTableSize - 1) // special symbol  = 63\n        length += m_InBitStream.ReadBits(kNumAdditionalLengthBits);\n      while(distance >= pos && length > 0)\n      {\n        m_OutWindowStream.PutByte(0);\n        pos++;\n        length--;\n      }\n      if (length > 0)\n        m_OutWindowStream.CopyBlock(distance, length);\n      pos += length;\n    }\n    else\n    {\n      Byte b;\n      if (m_LiteralsOn)\n      {\n        UInt32 temp = m_LiteralDecoder.DecodeSymbol(&m_InBitStream);\n        if (temp >= kLiteralTableSize)\n          return S_FALSE;\n        b = (Byte)temp;\n      }\n      else\n        b = (Byte)m_InBitStream.ReadBits(kNumBitsInByte);\n      m_OutWindowStream.PutByte(b);\n      pos++;\n    }\n  }\n  if (pos > unPackSize)\n    return S_FALSE;\n  return m_OutWindowStream.Flush();\n}\n\nSTDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  return CodeReal(inStream, outStream, inSize, outSize, progress);  \n}\n\nSTDMETHODIMP CCoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  if (size < 1)\n    return E_INVALIDARG;\n  Byte flag = data[0];\n  m_BigDictionaryOn = ((flag & 2) != 0);\n  m_NumDistanceLowDirectBits = m_BigDictionaryOn ?\n      kNumDistanceLowDirectBitsForBigDict:\n      kNumDistanceLowDirectBitsForSmallDict;\n  m_LiteralsOn = ((flag & 4) != 0);\n  m_MinMatchLength = m_LiteralsOn ?\n      kMatchMinLenWhenLiteralsOn :\n      kMatchMinLenWhenLiteralsOff;\n  return S_OK;\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ImplodeDecoder.h",
    "content": "// ImplodeDecoder.h\n\n#ifndef __COMPRESS_IMPLODE_DECODER_H\n#define __COMPRESS_IMPLODE_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"ImplodeHuffmanDecoder.h\"\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NImplode {\nnamespace NDecoder {\n\nclass CCoder:\n  public ICompressCoder,\n  public ICompressSetDecoderProperties2,\n  public CMyUnknownImp\n{\n  CLzOutWindow m_OutWindowStream;\n  NBitl::CDecoder<CInBuffer> m_InBitStream;\n  \n  NImplode::NHuffman::CDecoder m_LiteralDecoder;\n  NImplode::NHuffman::CDecoder m_LengthDecoder;\n  NImplode::NHuffman::CDecoder m_DistanceDecoder;\n\n  bool m_BigDictionaryOn;\n  bool m_LiteralsOn;\n\n  int m_NumDistanceLowDirectBits;\n  UInt32 m_MinMatchLength;\n\n  bool ReadLevelItems(NImplode::NHuffman::CDecoder &table, Byte *levels, int numLevelItems);\n  bool ReadTables();\n  void DeCodeLevelTable(Byte *newLevels, int numLevels);\npublic:\n  CCoder();\n\n  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)\n\n  void ReleaseStreams();\n  HRESULT Flush() { return m_OutWindowStream.Flush(); }\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp",
    "content": "// ImplodeHuffmanDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ImplodeHuffmanDecoder.h\"\n\nnamespace NCompress {\nnamespace NImplode {\nnamespace NHuffman {\n\nCDecoder::CDecoder(UInt32 numSymbols):\n  m_NumSymbols(numSymbols)\n{\n  m_Symbols = new UInt32[m_NumSymbols];\n}\n\nCDecoder::~CDecoder()\n{\n  delete []m_Symbols;\n}\n\nbool CDecoder::SetCodeLengths(const Byte *codeLengths)\n{\n  // int lenCounts[kNumBitsInLongestCode + 1], tmpPositions[kNumBitsInLongestCode + 1];\n  int lenCounts[kNumBitsInLongestCode + 2], tmpPositions[kNumBitsInLongestCode + 1];\n  int i;\n  for(i = 0; i <= kNumBitsInLongestCode; i++)\n    lenCounts[i] = 0;\n  UInt32 symbolIndex;\n  for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)\n    lenCounts[codeLengths[symbolIndex]]++;\n  // lenCounts[0] = 0;\n  \n  // tmpPositions[0] = m_Positions[0] = m_Limitits[0] = 0;\n  m_Limitits[kNumBitsInLongestCode + 1] = 0;\n  m_Positions[kNumBitsInLongestCode + 1] = 0;\n  lenCounts[kNumBitsInLongestCode + 1] =  0;\n\n\n  UInt32 startPos = 0;\n  static const UInt32 kMaxValue = (1 << kNumBitsInLongestCode);\n\n  for (i = kNumBitsInLongestCode; i > 0; i--)\n  {\n    startPos += lenCounts[i] << (kNumBitsInLongestCode - i);\n    if (startPos > kMaxValue)\n      return false;\n    m_Limitits[i] = startPos;\n    m_Positions[i] = m_Positions[i + 1] + lenCounts[i + 1];\n    tmpPositions[i] = m_Positions[i] + lenCounts[i];\n\n  }\n\n  // if _ZIP_MODE do not throw exception for trees containing only one node\n  // #ifndef _ZIP_MODE\n  if (startPos != kMaxValue)\n    return false;\n  // #endif\n\n  for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)\n    if (codeLengths[symbolIndex] != 0)\n      m_Symbols[--tmpPositions[codeLengths[symbolIndex]]] = symbolIndex;\n  return true;\n}\n\nUInt32 CDecoder::DecodeSymbol(CInBit *inStream)\n{\n  UInt32 numBits = 0;\n  UInt32 value = inStream->GetValue(kNumBitsInLongestCode);\n  int i;\n  for(i = kNumBitsInLongestCode; i > 0; i--)\n  {\n    if (value < m_Limitits[i])\n    {\n      numBits = i;\n      break;\n    }\n  }\n  if (i == 0)\n    return 0xFFFFFFFF;\n  inStream->MovePos(numBits);\n  UInt32 index = m_Positions[numBits] +\n      ((value - m_Limitits[numBits + 1]) >> (kNumBitsInLongestCode - numBits));\n  if (index >= m_NumSymbols)\n    return 0xFFFFFFFF;\n  return m_Symbols[index];\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ImplodeHuffmanDecoder.h",
    "content": "// ImplodeHuffmanDecoder.h\n\n#ifndef __IMPLODE_HUFFMAN_DECODER_H\n#define __IMPLODE_HUFFMAN_DECODER_H\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitlDecoder.h\"\n\nnamespace NCompress {\nnamespace NImplode {\nnamespace NHuffman {\n\nconst int kNumBitsInLongestCode = 16;\n\ntypedef NBitl::CDecoder<CInBuffer> CInBit;\n\nclass CDecoder\n{\n  UInt32 m_Limitits[kNumBitsInLongestCode + 2]; // m_Limitits[i] = value limit for symbols with length = i\n  UInt32 m_Positions[kNumBitsInLongestCode + 2];   // m_Positions[i] = index in m_Symbols[] of first symbol with length = i\n  UInt32 m_NumSymbols; // number of symbols in m_Symbols\n  UInt32 *m_Symbols; // symbols: at first with len=1 then 2, ... 15.\npublic:\n  CDecoder(UInt32 numSymbols);\n  ~CDecoder();\n  \n  bool SetCodeLengths(const Byte *codeLengths);\n  UInt32 DecodeSymbol(CInBit *inStream);\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp",
    "content": "// LzmaAlone.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../Common/MyWindows.h\"\n#include \"../../../Common/MyInitGuid.h\"\n\n#include <stdio.h>\n\n#if defined(_WIN32) || defined(OS2) || defined(MSDOS)\n#include <fcntl.h>\n#include <io.h>\n#define MY_SET_BINARY_MODE(file) _setmode(_fileno(file), O_BINARY)\n#else\n#define MY_SET_BINARY_MODE(file)\n#endif\n\n#include \"../../../Common/CommandLineParser.h\"\n#include \"../../../Common/StringConvert.h\"\n#include \"../../../Common/StringToInt.h\"\n\n#include \"../../Common/FileStreams.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../LzmaDecoder.h\"\n#include \"../LzmaEncoder.h\"\n\n#include \"LzmaBenchCon.h\"\n\n#ifdef COMPRESS_MF_MT\n#include \"../../../Windows/System.h\"\n#endif\n\nextern \"C\"\n{\n  #include \"../../../../C/7zVersion.h\"\n  #include \"../../../../C/Alloc.h\"\n  #include \"../../../../C/LzmaUtil/Lzma86Dec.h\"\n  #include \"../../../../C/LzmaUtil/Lzma86Enc.h\"\n}\n\nusing namespace NCommandLineParser;\n\n#ifdef _WIN32\nbool g_IsNT = false;\nstatic inline bool IsItWindowsNT()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo))\n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);\n}\n#endif\n\nstatic const char *kCantAllocate = \"Can not allocate memory\";\nstatic const char *kReadError = \"Read error\";\nstatic const char *kWriteError = \"Write error\";\n\nnamespace NKey {\nenum Enum\n{\n  kHelp1 = 0,\n  kHelp2,\n  kAlgo,\n  kDict,\n  kFb,\n  kMc,\n  kLc,\n  kLp,\n  kPb,\n  kMatchFinder,\n  kMultiThread,\n  kEOS,\n  kStdIn,\n  kStdOut,\n  kFilter86\n};\n}\n\nstatic const CSwitchForm kSwitchForms[] =\n{\n  { L\"?\",  NSwitchType::kSimple, false },\n  { L\"H\",  NSwitchType::kSimple, false },\n  { L\"A\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"D\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"FB\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"MC\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"LC\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"LP\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"PB\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"MF\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"MT\", NSwitchType::kUnLimitedPostString, false, 0 },\n  { L\"EOS\", NSwitchType::kSimple, false },\n  { L\"SI\",  NSwitchType::kSimple, false },\n  { L\"SO\",  NSwitchType::kSimple, false },\n  { L\"F86\",  NSwitchType::kPostChar, false, 0, 0, L\"+\" }\n};\n\nstatic const int kNumSwitches = sizeof(kSwitchForms) / sizeof(kSwitchForms[0]);\n\nstatic void PrintHelp()\n{\n  fprintf(stderr, \"\\nUsage:  LZMA <e|d> inputFile outputFile [<switches>...]\\n\"\n             \"  e: encode file\\n\"\n             \"  d: decode file\\n\"\n             \"  b: Benchmark\\n\"\n    \"<Switches>\\n\"\n    \"  -a{N}:  set compression mode - [0, 1], default: 1 (max)\\n\"\n    \"  -d{N}:  set dictionary size - [12, 30], default: 23 (8MB)\\n\"\n    \"  -fb{N}: set number of fast bytes - [5, 273], default: 128\\n\"\n    \"  -mc{N}: set number of cycles for match finder\\n\"\n    \"  -lc{N}: set number of literal context bits - [0, 8], default: 3\\n\"\n    \"  -lp{N}: set number of literal pos bits - [0, 4], default: 0\\n\"\n    \"  -pb{N}: set number of pos bits - [0, 4], default: 2\\n\"\n    \"  -mf{MF_ID}: set Match Finder: [bt2, bt3, bt4, hc4], default: bt4\\n\"\n    \"  -mt{N}: set number of CPU threads\\n\"\n    \"  -eos:   write End Of Stream marker\\n\"\n    \"  -si:    read data from stdin\\n\"\n    \"  -so:    write data to stdout\\n\"\n    );\n}\n\nstatic void PrintHelpAndExit(const char *s)\n{\n  fprintf(stderr, \"\\nError: %s\\n\\n\", s);\n  PrintHelp();\n  throw -1;\n}\n\nstatic void IncorrectCommand()\n{\n  PrintHelpAndExit(\"Incorrect command\");\n}\n\nstatic void WriteArgumentsToStringList(int numArguments, const char *arguments[],\n    UStringVector &strings)\n{\n  for(int i = 1; i < numArguments; i++)\n    strings.Add(MultiByteToUnicodeString(arguments[i]));\n}\n\nstatic bool GetNumber(const wchar_t *s, UInt32 &value)\n{\n  value = 0;\n  if (MyStringLen(s) == 0)\n    return false;\n  const wchar_t *end;\n  UInt64 res = ConvertStringToUInt64(s, &end);\n  if (*end != L'\\0')\n    return false;\n  if (res > 0xFFFFFFFF)\n    return false;\n  value = UInt32(res);\n  return true;\n}\n\nstatic void ParseUInt32(const CParser &parser, int index, UInt32 &res)\n{\n  if (parser[index].ThereIs)\n    if (!GetNumber(parser[index].PostStrings[0], res))\n      IncorrectCommand();\n}\n\nint main2(int n, const char *args[])\n{\n  #ifdef _WIN32\n  g_IsNT = IsItWindowsNT();\n  #endif\n\n  fprintf(stderr, \"\\nLZMA \" MY_VERSION_COPYRIGHT_DATE \"\\n\");\n\n  if (n == 1)\n  {\n    PrintHelp();\n    return 0;\n  }\n\n  bool unsupportedTypes = (sizeof(Byte) != 1 || sizeof(UInt32) < 4 || sizeof(UInt64) < 4);\n  if (unsupportedTypes)\n  {\n    fprintf(stderr, \"Unsupported base types. Edit Common/Types.h and recompile\");\n    return 1;\n  }\n\n  UStringVector commandStrings;\n  WriteArgumentsToStringList(n, args, commandStrings);\n  CParser parser(kNumSwitches);\n  try\n  {\n    parser.ParseStrings(kSwitchForms, commandStrings);\n  }\n  catch(...)\n  {\n    IncorrectCommand();\n  }\n\n  if(parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs)\n  {\n    PrintHelp();\n    return 0;\n  }\n  const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;\n\n  int paramIndex = 0;\n  if (paramIndex >= nonSwitchStrings.Size())\n    IncorrectCommand();\n  const UString &command = nonSwitchStrings[paramIndex++];\n\n  bool dictDefined = false;\n  UInt32 dict = (UInt32)-1;\n  if(parser[NKey::kDict].ThereIs)\n  {\n    UInt32 dicLog;\n    if (!GetNumber(parser[NKey::kDict].PostStrings[0], dicLog))\n      IncorrectCommand();\n    dict = 1 << dicLog;\n    dictDefined = true;\n  }\n  UString mf = L\"BT4\";\n  if (parser[NKey::kMatchFinder].ThereIs)\n    mf = parser[NKey::kMatchFinder].PostStrings[0];\n\n  UInt32 numThreads = (UInt32)-1;\n\n  #ifdef COMPRESS_MF_MT\n  if (parser[NKey::kMultiThread].ThereIs)\n  {\n    UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors();\n    const UString &s = parser[NKey::kMultiThread].PostStrings[0];\n    if (s.IsEmpty())\n      numThreads = numCPUs;\n    else\n      if (!GetNumber(s, numThreads))\n        IncorrectCommand();\n  }\n  #endif\n\n  if (command.CompareNoCase(L\"b\") == 0)\n  {\n    const UInt32 kNumDefaultItereations = 1;\n    UInt32 numIterations = kNumDefaultItereations;\n    {\n      if (paramIndex < nonSwitchStrings.Size())\n        if (!GetNumber(nonSwitchStrings[paramIndex++], numIterations))\n          numIterations = kNumDefaultItereations;\n    }\n    return LzmaBenchCon(stderr, numIterations, numThreads, dict);\n  }\n\n  if (numThreads == (UInt32)-1)\n    numThreads = 1;\n\n  bool encodeMode = false;\n  if (command.CompareNoCase(L\"e\") == 0)\n    encodeMode = true;\n  else if (command.CompareNoCase(L\"d\") == 0)\n    encodeMode = false;\n  else\n    IncorrectCommand();\n\n  bool stdInMode = parser[NKey::kStdIn].ThereIs;\n  bool stdOutMode = parser[NKey::kStdOut].ThereIs;\n\n  CMyComPtr<ISequentialInStream> inStream;\n  CInFileStream *inStreamSpec = 0;\n  if (stdInMode)\n  {\n    inStream = new CStdInFileStream;\n    MY_SET_BINARY_MODE(stdin);\n  }\n  else\n  {\n    if (paramIndex >= nonSwitchStrings.Size())\n      IncorrectCommand();\n    const UString &inputName = nonSwitchStrings[paramIndex++];\n    inStreamSpec = new CInFileStream;\n    inStream = inStreamSpec;\n    if (!inStreamSpec->Open(GetSystemString(inputName)))\n    {\n      fprintf(stderr, \"\\nError: can not open input file %s\\n\",\n          (const char *)GetOemString(inputName));\n      return 1;\n    }\n  }\n\n  CMyComPtr<ISequentialOutStream> outStream;\n  COutFileStream *outStreamSpec = NULL;\n  if (stdOutMode)\n  {\n    outStream = new CStdOutFileStream;\n    MY_SET_BINARY_MODE(stdout);\n  }\n  else\n  {\n    if (paramIndex >= nonSwitchStrings.Size())\n      IncorrectCommand();\n    const UString &outputName = nonSwitchStrings[paramIndex++];\n    outStreamSpec = new COutFileStream;\n    outStream = outStreamSpec;\n    if (!outStreamSpec->Create(GetSystemString(outputName), true))\n    {\n      fprintf(stderr, \"\\nError: can not open output file %s\\n\",\n        (const char *)GetOemString(outputName));\n      return 1;\n    }\n  }\n\n  if (parser[NKey::kFilter86].ThereIs)\n  {\n    // -f86 switch is for x86 filtered mode: BCJ + LZMA.\n    if (parser[NKey::kEOS].ThereIs || stdInMode)\n      throw \"Can not use stdin in this mode\";\n    UInt64 fileSize;\n    inStreamSpec->File.GetLength(fileSize);\n    if (fileSize > 0xF0000000)\n      throw \"File is too big\";\n    size_t inSize = (size_t)fileSize;\n    Byte *inBuffer = 0;\n    if (inSize != 0)\n    {\n      inBuffer = (Byte *)MyAlloc((size_t)inSize);\n      if (inBuffer == 0)\n        throw kCantAllocate;\n    }\n    \n    if (ReadStream_FAIL(inStream, inBuffer, inSize) != S_OK)\n      throw \"Can not read\";\n\n    Byte *outBuffer = 0;\n    size_t outSize;\n    if (encodeMode)\n    {\n      // we allocate 105% of original size for output buffer\n      outSize = (size_t)fileSize / 20 * 21 + (1 << 16);\n      if (outSize != 0)\n      {\n        outBuffer = (Byte *)MyAlloc((size_t)outSize);\n        if (outBuffer == 0)\n          throw kCantAllocate;\n      }\n      if (!dictDefined)\n        dict = 1 << 23;\n      int res = Lzma86_Encode(outBuffer, &outSize, inBuffer, inSize,\n          5, dict, parser[NKey::kFilter86].PostCharIndex == 0 ? SZ_FILTER_YES : SZ_FILTER_AUTO);\n      if (res != 0)\n      {\n        fprintf(stderr, \"\\nEncoder error = %d\\n\", (int)res);\n        return 1;\n      }\n    }\n    else\n    {\n      UInt64 outSize64;\n      if (Lzma86_GetUnpackSize(inBuffer, inSize, &outSize64) != 0)\n        throw \"data error\";\n      outSize = (size_t)outSize64;\n      if (outSize != outSize64)\n        throw \"too big\";\n      if (outSize != 0)\n      {\n        outBuffer = (Byte *)MyAlloc(outSize);\n        if (outBuffer == 0)\n          throw kCantAllocate;\n      }\n      int res = Lzma86_Decode(outBuffer, &outSize, inBuffer, &inSize);\n      if (inSize != (size_t)fileSize)\n        throw \"incorrect processed size\";\n      if (res != 0)\n        throw \"LzmaDecoder error\";\n    }\n    if (WriteStream(outStream, outBuffer, outSize) != S_OK)\n      throw kWriteError;\n    MyFree(outBuffer);\n    MyFree(inBuffer);\n    return 0;\n  }\n\n\n  UInt64 fileSize;\n  if (encodeMode)\n  {\n    NCompress::NLzma::CEncoder *encoderSpec = new NCompress::NLzma::CEncoder;\n    CMyComPtr<ICompressCoder> encoder = encoderSpec;\n\n    if (!dictDefined)\n      dict = 1 << 23;\n\n    UInt32 pb = 2;\n    UInt32 lc = 3; // = 0; for 32-bit data\n    UInt32 lp = 0; // = 2; for 32-bit data\n    UInt32 algo = 1;\n    UInt32 fb = 128;\n    UInt32 mc = 16 + fb / 2;\n    bool mcDefined = false;\n\n    bool eos = parser[NKey::kEOS].ThereIs || stdInMode;\n \n    ParseUInt32(parser, NKey::kAlgo, algo);\n    ParseUInt32(parser, NKey::kFb, fb);\n    ParseUInt32(parser, NKey::kLc, lc);\n    ParseUInt32(parser, NKey::kLp, lp);\n    ParseUInt32(parser, NKey::kPb, pb);\n\n    mcDefined = parser[NKey::kMc].ThereIs;\n    if (mcDefined)\n      if (!GetNumber(parser[NKey::kMc].PostStrings[0], mc))\n        IncorrectCommand();\n    \n    PROPID propIDs[] =\n    {\n      NCoderPropID::kDictionarySize,\n      NCoderPropID::kPosStateBits,\n      NCoderPropID::kLitContextBits,\n      NCoderPropID::kLitPosBits,\n      NCoderPropID::kAlgorithm,\n      NCoderPropID::kNumFastBytes,\n      NCoderPropID::kMatchFinder,\n      NCoderPropID::kEndMarker,\n      NCoderPropID::kNumThreads,\n      NCoderPropID::kMatchFinderCycles,\n    };\n    const int kNumPropsMax = sizeof(propIDs) / sizeof(propIDs[0]);\n\n    PROPVARIANT props[kNumPropsMax];\n    for (int p = 0; p < 6; p++)\n      props[p].vt = VT_UI4;\n\n    props[0].ulVal = (UInt32)dict;\n    props[1].ulVal = (UInt32)pb;\n    props[2].ulVal = (UInt32)lc;\n    props[3].ulVal = (UInt32)lp;\n    props[4].ulVal = (UInt32)algo;\n    props[5].ulVal = (UInt32)fb;\n\n    props[6].vt = VT_BSTR;\n    props[6].bstrVal = (BSTR)(const wchar_t *)mf;\n\n    props[7].vt = VT_BOOL;\n    props[7].boolVal = eos ? VARIANT_TRUE : VARIANT_FALSE;\n\n    props[8].vt = VT_UI4;\n    props[8].ulVal = (UInt32)numThreads;\n\n    // it must be last in property list\n    props[9].vt = VT_UI4;\n    props[9].ulVal = (UInt32)mc;\n\n    int numProps = kNumPropsMax;\n    if (!mcDefined)\n      numProps--;\n\n    if (encoderSpec->SetCoderProperties(propIDs, props, numProps) != S_OK)\n      IncorrectCommand();\n    encoderSpec->WriteCoderProperties(outStream);\n\n    if (eos || stdInMode)\n      fileSize = (UInt64)(Int64)-1;\n    else\n      inStreamSpec->File.GetLength(fileSize);\n\n    for (int i = 0; i < 8; i++)\n    {\n      Byte b = Byte(fileSize >> (8 * i));\n      if (outStream->Write(&b, 1, 0) != S_OK)\n      {\n        fprintf(stderr, kWriteError);\n        return 1;\n      }\n    }\n    HRESULT result = encoder->Code(inStream, outStream, 0, 0, 0);\n    if (result == E_OUTOFMEMORY)\n    {\n      fprintf(stderr, \"\\nError: Can not allocate memory\\n\");\n      return 1;\n    }\n    else if (result != S_OK)\n    {\n      fprintf(stderr, \"\\nEncoder error = %X\\n\", (unsigned int)result);\n      return 1;\n    }\n  }\n  else\n  {\n    NCompress::NLzma::CDecoder *decoderSpec = new NCompress::NLzma::CDecoder;\n    CMyComPtr<ICompressCoder> decoder = decoderSpec;\n    decoderSpec->FinishStream = true;\n    const UInt32 kPropertiesSize = 5;\n    Byte header[kPropertiesSize + 8];\n    if (ReadStream_FALSE(inStream, header, kPropertiesSize + 8) != S_OK)\n    {\n      fprintf(stderr, kReadError);\n      return 1;\n    }\n    if (decoderSpec->SetDecoderProperties2(header, kPropertiesSize) != S_OK)\n    {\n      fprintf(stderr, \"SetDecoderProperties error\");\n      return 1;\n    }\n    fileSize = 0;\n    for (int i = 0; i < 8; i++)\n      fileSize |= ((UInt64)header[kPropertiesSize + i]) << (8 * i);\n\n    if (decoder->Code(inStream, outStream, 0, (fileSize == (UInt64)(Int64)-1) ? 0 : &fileSize, 0) != S_OK)\n    {\n      fprintf(stderr, \"Decoder error\");\n      return 1;\n    }\n  }\n  if (outStreamSpec != NULL)\n  {\n    if (outStreamSpec->Close() != S_OK)\n    {\n      fprintf(stderr, \"File closing error\");\n      return 1;\n    }\n  }\n  return 0;\n}\n\nint MY_CDECL main(int n, const char *args[])\n{\n  try { return main2(n, args); }\n  catch(const char *s)\n  {\n    fprintf(stderr, \"\\nError: %s\\n\", s);\n    return 1;\n  }\n  catch(...)\n  {\n    fprintf(stderr, \"\\nError\\n\");\n    return 1;\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp",
    "content": "// LzmaBench.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzmaBench.h\"\n\n#ifndef _WIN32\n#define USE_POSIX_TIME\n#define USE_POSIX_TIME2\n#endif\n\n#ifdef USE_POSIX_TIME\n#include <time.h>\n#ifdef USE_POSIX_TIME2\n#include <sys/time.h>\n#endif\n#endif\n\n#ifdef _WIN32\n#define USE_ALLOCA\n#endif\n\n#ifdef USE_ALLOCA\n#ifdef _WIN32\n#include <malloc.h>\n#else\n#include <stdlib.h>\n#endif\n#endif\n\nextern \"C\"\n{\n#include \"../../../../C/7zCrc.h\"\n#include \"../../../../C/Alloc.h\"\n}\n\n#include \"../../../Common/MyCom.h\"\n\n#ifdef BENCH_MT\n#include \"../../../Windows/Synchronization.h\"\n#include \"../../../Windows/Thread.h\"\n#endif\n\n#ifdef EXTERNAL_LZMA\n#include \"../../../Windows/PropVariant.h\"\n#include \"../../ICoder.h\"\n#else\n#include \"../LzmaDecoder.h\"\n#include \"../LzmaEncoder.h\"\n#endif\n\nstatic const UInt32 kUncompressMinBlockSize = 1 << 26;\nstatic const UInt32 kAdditionalSize = (1 << 16);\nstatic const UInt32 kCompressedAdditionalSize = (1 << 10);\nstatic const UInt32 kMaxLzmaPropSize = 5;\n\nclass CBaseRandomGenerator\n{\n  UInt32 A1;\n  UInt32 A2;\npublic:\n  CBaseRandomGenerator() { Init(); }\n  void Init() { A1 = 362436069; A2 = 521288629;}\n  UInt32 GetRnd()\n  {\n    return\n      ((A1 = 36969 * (A1 & 0xffff) + (A1 >> 16)) << 16) +\n      ((A2 = 18000 * (A2 & 0xffff) + (A2 >> 16)) );\n  }\n};\n\nclass CBenchBuffer\n{\npublic:\n  size_t BufferSize;\n  Byte *Buffer;\n  CBenchBuffer(): Buffer(0) {}\n  virtual ~CBenchBuffer() { Free(); }\n  void Free()\n  {\n    ::MidFree(Buffer);\n    Buffer = 0;\n  }\n  bool Alloc(size_t bufferSize)\n  {\n    if (Buffer != 0 && BufferSize == bufferSize)\n      return true;\n    Free();\n    Buffer = (Byte *)::MidAlloc(bufferSize);\n    BufferSize = bufferSize;\n    return (Buffer != 0);\n  }\n};\n\nclass CBenchRandomGenerator: public CBenchBuffer\n{\n  CBaseRandomGenerator *RG;\npublic:\n  void Set(CBaseRandomGenerator *rg) { RG = rg; }\n  UInt32 GetVal(UInt32 &res, int numBits)\n  {\n    UInt32 val = res & (((UInt32)1 << numBits) - 1);\n    res >>= numBits;\n    return val;\n  }\n  UInt32 GetLen(UInt32 &res)\n  {\n    UInt32 len = GetVal(res, 2);\n    return GetVal(res, 1 + len);\n  }\n  void Generate()\n  {\n    UInt32 pos = 0;\n    UInt32 rep0 = 1;\n    while (pos < BufferSize)\n    {\n      UInt32 res = RG->GetRnd();\n      res >>= 1;\n      if (GetVal(res, 1) == 0 || pos < 1024)\n        Buffer[pos++] = (Byte)(res & 0xFF);\n      else\n      {\n        UInt32 len;\n        len = 1 + GetLen(res);\n        if (GetVal(res, 3) != 0)\n        {\n          len += GetLen(res);\n          do\n          {\n            UInt32 ppp = GetVal(res, 5) + 6;\n            res = RG->GetRnd();\n            if (ppp > 30)\n              continue;\n            rep0 = /* (1 << ppp) +*/  GetVal(res, ppp);\n            res = RG->GetRnd();\n          }\n          while (rep0 >= pos);\n          rep0++;\n        }\n\n        for (UInt32 i = 0; i < len && pos < BufferSize; i++, pos++)\n          Buffer[pos] = Buffer[pos - rep0];\n      }\n    }\n  }\n};\n\n\nclass CBenchmarkInStream:\n  public ISequentialInStream,\n  public CMyUnknownImp\n{\n  const Byte *Data;\n  size_t Pos;\n  size_t Size;\npublic:\n  MY_UNKNOWN_IMP\n  void Init(const Byte *data, size_t size)\n  {\n    Data = data;\n    Size = size;\n    Pos = 0;\n  }\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n};\n\nSTDMETHODIMP CBenchmarkInStream::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  size_t remain = Size - Pos;\n  UInt32 kMaxBlockSize = (1 << 20);\n  if (size > kMaxBlockSize)\n    size = kMaxBlockSize;\n  if (size > remain)\n    size = (UInt32)remain;\n  for (UInt32 i = 0; i < size; i++)\n    ((Byte *)data)[i] = Data[Pos + i];\n  Pos += size;\n  if(processedSize != NULL)\n    *processedSize = size;\n  return S_OK;\n}\n  \nclass CBenchmarkOutStream:\n  public ISequentialOutStream,\n  public CBenchBuffer,\n  public CMyUnknownImp\n{\n  // bool _overflow;\npublic:\n  UInt32 Pos;\n  // CBenchmarkOutStream(): _overflow(false) {}\n  void Init()\n  {\n    // _overflow = false;\n    Pos = 0;\n  }\n  MY_UNKNOWN_IMP\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\nSTDMETHODIMP CBenchmarkOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  size_t curSize = BufferSize - Pos;\n  if (curSize > size)\n    curSize = size;\n  memcpy(Buffer + Pos, data, curSize);\n  Pos += (UInt32)curSize;\n  if(processedSize != NULL)\n    *processedSize = (UInt32)curSize;\n  if (curSize != size)\n  {\n    // _overflow = true;\n    return E_FAIL;\n  }\n  return S_OK;\n}\n  \nclass CCrcOutStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\npublic:\n  UInt32 Crc;\n  MY_UNKNOWN_IMP\n  void Init() { Crc = CRC_INIT_VAL; }\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\nSTDMETHODIMP CCrcOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  Crc = CrcUpdate(Crc, data, size);\n  if (processedSize != NULL)\n    *processedSize = size;\n  return S_OK;\n}\n  \nstatic UInt64 GetTimeCount()\n{\n  #ifdef USE_POSIX_TIME\n  #ifdef USE_POSIX_TIME2\n  timeval v;\n  if (gettimeofday(&v, 0) == 0)\n    return (UInt64)(v.tv_sec) * 1000000 + v.tv_usec;\n  return (UInt64)time(NULL) * 1000000;\n  #else\n  return time(NULL);\n  #endif\n  #else\n  /*\n  LARGE_INTEGER value;\n  if (::QueryPerformanceCounter(&value))\n    return value.QuadPart;\n  */\n  return GetTickCount();\n  #endif\n}\n\nstatic UInt64 GetFreq()\n{\n  #ifdef USE_POSIX_TIME\n  #ifdef USE_POSIX_TIME2\n  return 1000000;\n  #else\n  return 1;\n  #endif\n  #else\n  /*\n  LARGE_INTEGER value;\n  if (::QueryPerformanceFrequency(&value))\n    return value.QuadPart;\n  */\n  return 1000;\n  #endif\n}\n\n#ifndef USE_POSIX_TIME\nstatic inline UInt64 GetTime64(const FILETIME &t) { return ((UInt64)t.dwHighDateTime << 32) | t.dwLowDateTime; }\n#endif\nstatic UInt64 GetUserTime()\n{\n  #ifdef USE_POSIX_TIME\n  return clock();\n  #else\n  FILETIME creationTime, exitTime, kernelTime, userTime;\n  if (::GetProcessTimes(::GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime) != 0)\n    return GetTime64(userTime) + GetTime64(kernelTime);\n  return (UInt64)GetTickCount() * 10000;\n  #endif\n}\n\nstatic UInt64 GetUserFreq()\n{\n  #ifdef USE_POSIX_TIME\n  return CLOCKS_PER_SEC;\n  #else\n  return 10000000;\n  #endif\n}\n\nclass CBenchProgressStatus\n{\n  #ifdef BENCH_MT\n  NWindows::NSynchronization::CCriticalSection CS;\n  #endif\npublic:\n  HRESULT Res;\n  bool EncodeMode;\n  void SetResult(HRESULT res)\n  {\n    #ifdef BENCH_MT\n    NWindows::NSynchronization::CCriticalSectionLock lock(CS);\n    #endif\n    Res = res;\n  }\n  HRESULT GetResult()\n  {\n    #ifdef BENCH_MT\n    NWindows::NSynchronization::CCriticalSectionLock lock(CS);\n    #endif\n    return Res;\n  }\n};\n\nclass CBenchProgressInfo:\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\npublic:\n  CBenchProgressStatus *Status;\n  CBenchInfo BenchInfo;\n  HRESULT Res;\n  IBenchCallback *callback;\n  CBenchProgressInfo(): callback(0) {}\n  MY_UNKNOWN_IMP\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n};\n\nvoid SetStartTime(CBenchInfo &bi)\n{\n  bi.GlobalFreq = GetFreq();\n  bi.UserFreq = GetUserFreq();\n  bi.GlobalTime = ::GetTimeCount();\n  bi.UserTime = ::GetUserTime();\n}\n\nvoid SetFinishTime(const CBenchInfo &biStart, CBenchInfo &dest)\n{\n  dest.GlobalFreq = GetFreq();\n  dest.UserFreq = GetUserFreq();\n  dest.GlobalTime = ::GetTimeCount() - biStart.GlobalTime;\n  dest.UserTime = ::GetUserTime() - biStart.UserTime;\n}\n\nSTDMETHODIMP CBenchProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  HRESULT res = Status->GetResult();\n  if (res != S_OK)\n    return res;\n  if (!callback)\n    return res;\n  CBenchInfo info = BenchInfo;\n  SetFinishTime(BenchInfo, info);\n  if (Status->EncodeMode)\n  {\n    info.UnpackSize = *inSize;\n    info.PackSize = *outSize;\n    res = callback->SetEncodeResult(info, false);\n  }\n  else\n  {\n    info.PackSize = BenchInfo.PackSize + *inSize;\n    info.UnpackSize = BenchInfo.UnpackSize + *outSize;\n    res = callback->SetDecodeResult(info, false);\n  }\n  if (res != S_OK)\n    Status->SetResult(res);\n  return res;\n}\n\nstatic const int kSubBits = 8;\n\nstatic UInt32 GetLogSize(UInt32 size)\n{\n  for (int i = kSubBits; i < 32; i++)\n    for (UInt32 j = 0; j < (1 << kSubBits); j++)\n      if (size <= (((UInt32)1) << i) + (j << (i - kSubBits)))\n        return (i << kSubBits) + j;\n  return (32 << kSubBits);\n}\n\nstatic void NormalizeVals(UInt64 &v1, UInt64 &v2)\n{\n  while (v1 > 1000000)\n  {\n    v1 >>= 1;\n    v2 >>= 1;\n  }\n}\n\nUInt64 GetUsage(const CBenchInfo &info)\n{\n  UInt64 userTime = info.UserTime;\n  UInt64 userFreq = info.UserFreq;\n  UInt64 globalTime = info.GlobalTime;\n  UInt64 globalFreq = info.GlobalFreq;\n  NormalizeVals(userTime, userFreq);\n  NormalizeVals(globalFreq, globalTime);\n  if (userFreq == 0)\n    userFreq = 1;\n  if (globalTime == 0)\n    globalTime = 1;\n  return userTime * globalFreq * 1000000 / userFreq / globalTime;\n}\n\nUInt64 GetRatingPerUsage(const CBenchInfo &info, UInt64 rating)\n{\n  UInt64 userTime = info.UserTime;\n  UInt64 userFreq = info.UserFreq;\n  UInt64 globalTime = info.GlobalTime;\n  UInt64 globalFreq = info.GlobalFreq;\n  NormalizeVals(userFreq, userTime);\n  NormalizeVals(globalTime, globalFreq);\n  if (globalFreq == 0)\n    globalFreq = 1;\n  if (userTime == 0)\n    userTime = 1;\n  return userFreq * globalTime / globalFreq *  rating / userTime;\n}\n\nstatic UInt64 MyMultDiv64(UInt64 value, UInt64 elapsedTime, UInt64 freq)\n{\n  UInt64 elTime = elapsedTime;\n  NormalizeVals(freq, elTime);\n  if (elTime == 0)\n    elTime = 1;\n  return value * freq / elTime;\n}\n\nUInt64 GetCompressRating(UInt32 dictionarySize, UInt64 elapsedTime, UInt64 freq, UInt64 size)\n{\n  UInt64 t = GetLogSize(dictionarySize) - (kBenchMinDicLogSize << kSubBits);\n  UInt64 numCommandsForOne = 870 + ((t * t * 5) >> (2 * kSubBits));\n  UInt64 numCommands = (UInt64)(size) * numCommandsForOne;\n  return MyMultDiv64(numCommands, elapsedTime, freq);\n}\n\nUInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 freq, UInt64 outSize, UInt64 inSize, UInt32 numIterations)\n{\n  UInt64 numCommands = (inSize * 200 + outSize * 4) * numIterations;\n  return MyMultDiv64(numCommands, elapsedTime, freq);\n}\n\n#ifdef EXTERNAL_LZMA\ntypedef UInt32 (WINAPI * CreateObjectPointer)(const GUID *clsID,\n    const GUID *interfaceID, void **outObject);\n#endif\n\nstruct CEncoderInfo;\n\nstruct CEncoderInfo\n{\n  #ifdef BENCH_MT\n  NWindows::CThread thread[2];\n  #endif\n  CMyComPtr<ICompressCoder> encoder;\n  CBenchProgressInfo *progressInfoSpec[2];\n  CMyComPtr<ICompressProgressInfo> progressInfo[2];\n  UInt32 NumIterations;\n  #ifdef USE_ALLOCA\n  size_t AllocaSize;\n  #endif\n\n  struct CDecoderInfo\n  {\n    CEncoderInfo *Encoder;\n    UInt32 DecoderIndex;\n    #ifdef USE_ALLOCA\n    size_t AllocaSize;\n    #endif\n    bool CallbackMode;\n  };\n  CDecoderInfo decodersInfo[2];\n\n  CMyComPtr<ICompressCoder> decoders[2];\n  HRESULT Results[2];\n  CBenchmarkOutStream *outStreamSpec;\n  CMyComPtr<ISequentialOutStream> outStream;\n  IBenchCallback *callback;\n  UInt32 crc;\n  UInt32 kBufferSize;\n  UInt32 compressedSize;\n  CBenchRandomGenerator rg;\n  CBenchmarkOutStream *propStreamSpec;\n  CMyComPtr<ISequentialOutStream> propStream;\n  HRESULT Init(UInt32 dictionarySize, UInt32 numThreads, CBaseRandomGenerator *rg);\n  HRESULT Encode();\n  HRESULT Decode(UInt32 decoderIndex);\n\n  CEncoderInfo(): outStreamSpec(0), callback(0), propStreamSpec(0) {}\n\n  #ifdef BENCH_MT\n  static THREAD_FUNC_DECL EncodeThreadFunction(void *param)\n  {\n    CEncoderInfo *encoder = (CEncoderInfo *)param;\n    #ifdef USE_ALLOCA\n    alloca(encoder->AllocaSize);\n    #endif\n    HRESULT res = encoder->Encode();\n    encoder->Results[0] = res;\n    if (res != S_OK)\n      encoder->progressInfoSpec[0]->Status->SetResult(res);\n\n    return 0;\n  }\n  static THREAD_FUNC_DECL DecodeThreadFunction(void *param)\n  {\n    CDecoderInfo *decoder = (CDecoderInfo *)param;\n    #ifdef USE_ALLOCA\n    alloca(decoder->AllocaSize);\n    #endif\n    CEncoderInfo *encoder = decoder->Encoder;\n    encoder->Results[decoder->DecoderIndex] = encoder->Decode(decoder->DecoderIndex);\n    return 0;\n  }\n\n  HRESULT CreateEncoderThread()\n  {\n    return thread[0].Create(EncodeThreadFunction, this);\n  }\n\n  HRESULT CreateDecoderThread(int index, bool callbackMode\n      #ifdef USE_ALLOCA\n      , size_t allocaSize\n      #endif\n      )\n  {\n    CDecoderInfo &decoder = decodersInfo[index];\n    decoder.DecoderIndex = index;\n    decoder.Encoder = this;\n    #ifdef USE_ALLOCA\n    decoder.AllocaSize = allocaSize;\n    #endif\n    decoder.CallbackMode = callbackMode;\n    return thread[index].Create(DecodeThreadFunction, &decoder);\n  }\n  #endif\n};\n\nHRESULT CEncoderInfo::Init(UInt32 dictionarySize, UInt32 numThreads, CBaseRandomGenerator *rgLoc)\n{\n  rg.Set(rgLoc);\n  kBufferSize = dictionarySize + kAdditionalSize;\n  UInt32 kCompressedBufferSize = (kBufferSize / 2) + kCompressedAdditionalSize;\n  if (!rg.Alloc(kBufferSize))\n    return E_OUTOFMEMORY;\n  rg.Generate();\n  crc = CrcCalc(rg.Buffer, rg.BufferSize);\n\n  outStreamSpec = new CBenchmarkOutStream;\n  if (!outStreamSpec->Alloc(kCompressedBufferSize))\n    return E_OUTOFMEMORY;\n\n  outStream = outStreamSpec;\n\n  propStreamSpec = 0;\n  if (!propStream)\n  {\n    propStreamSpec = new CBenchmarkOutStream;\n    propStream = propStreamSpec;\n  }\n  if (!propStreamSpec->Alloc(kMaxLzmaPropSize))\n    return E_OUTOFMEMORY;\n  propStreamSpec->Init();\n  \n  PROPID propIDs[] =\n  {\n    NCoderPropID::kDictionarySize,\n    NCoderPropID::kMultiThread\n  };\n  const int kNumProps = sizeof(propIDs) / sizeof(propIDs[0]);\n  PROPVARIANT properties[kNumProps];\n  properties[0].vt = VT_UI4;\n  properties[0].ulVal = (UInt32)dictionarySize;\n\n  properties[1].vt = VT_BOOL;\n  properties[1].boolVal = (numThreads > 1) ? VARIANT_TRUE : VARIANT_FALSE;\n\n  {\n    CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n    RINOK(encoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties));\n    if (!setCoderProperties)\n      return E_FAIL;\n    RINOK(setCoderProperties->SetCoderProperties(propIDs, properties, kNumProps));\n\n    CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;\n    encoder.QueryInterface(IID_ICompressWriteCoderProperties, &writeCoderProperties);\n    if (writeCoderProperties)\n    {\n      RINOK(writeCoderProperties->WriteCoderProperties(propStream));\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CEncoderInfo::Encode()\n{\n  CBenchmarkInStream *inStreamSpec = new CBenchmarkInStream;\n  CMyComPtr<ISequentialInStream> inStream = inStreamSpec;\n  inStreamSpec->Init(rg.Buffer, rg.BufferSize);\n  outStreamSpec->Init();\n\n  RINOK(encoder->Code(inStream, outStream, 0, 0, progressInfo[0]));\n  compressedSize = outStreamSpec->Pos;\n  encoder.Release();\n  return S_OK;\n}\n\nHRESULT CEncoderInfo::Decode(UInt32 decoderIndex)\n{\n  CBenchmarkInStream *inStreamSpec = new CBenchmarkInStream;\n  CMyComPtr<ISequentialInStream> inStream = inStreamSpec;\n  CMyComPtr<ICompressCoder> &decoder = decoders[decoderIndex];\n\n  CMyComPtr<ICompressSetDecoderProperties2> compressSetDecoderProperties;\n  decoder.QueryInterface(IID_ICompressSetDecoderProperties2, &compressSetDecoderProperties);\n  if (!compressSetDecoderProperties)\n    return E_FAIL;\n\n  CCrcOutStream *crcOutStreamSpec = new CCrcOutStream;\n  CMyComPtr<ISequentialOutStream> crcOutStream = crcOutStreamSpec;\n    \n  CBenchProgressInfo *pi = progressInfoSpec[decoderIndex];\n  pi->BenchInfo.UnpackSize = 0;\n  pi->BenchInfo.PackSize = 0;\n\n  for (UInt32 j = 0; j < NumIterations; j++)\n  {\n    inStreamSpec->Init(outStreamSpec->Buffer, compressedSize);\n    crcOutStreamSpec->Init();\n    \n    RINOK(compressSetDecoderProperties->SetDecoderProperties2(propStreamSpec->Buffer, propStreamSpec->Pos));\n    UInt64 outSize = kBufferSize;\n    RINOK(decoder->Code(inStream, crcOutStream, 0, &outSize, progressInfo[decoderIndex]));\n    if (CRC_GET_DIGEST(crcOutStreamSpec->Crc) != crc)\n      return S_FALSE;\n    pi->BenchInfo.UnpackSize += kBufferSize;\n    pi->BenchInfo.PackSize += compressedSize;\n  }\n  decoder.Release();\n  return S_OK;\n}\n\nstatic const UInt32 kNumThreadsMax = (1 << 16);\n\nstruct CBenchEncoders\n{\n  CEncoderInfo *encoders;\n  CBenchEncoders(UInt32 num): encoders(0) { encoders = new CEncoderInfo[num]; }\n  ~CBenchEncoders() { delete []encoders; }\n};\n\nHRESULT LzmaBench(\n  #ifdef EXTERNAL_LZMA\n  CCodecs *codecs,\n  #endif\n  UInt32 numThreads, UInt32 dictionarySize, IBenchCallback *callback)\n{\n  UInt32 numEncoderThreads =\n    #ifdef BENCH_MT\n    (numThreads > 1 ? numThreads / 2 : 1);\n    #else\n    1;\n    #endif\n  UInt32 numSubDecoderThreads =\n    #ifdef BENCH_MT\n    (numThreads > 1 ? 2 : 1);\n    #else\n    1;\n    #endif\n  if (dictionarySize < (1 << kBenchMinDicLogSize) || numThreads < 1 || numEncoderThreads > kNumThreadsMax)\n  {\n    return E_INVALIDARG;\n  }\n\n  CBenchEncoders encodersSpec(numEncoderThreads);\n  CEncoderInfo *encoders = encodersSpec.encoders;\n\n  #ifdef EXTERNAL_LZMA\n  UString name = L\"LZMA\";\n  #endif\n\n  UInt32 i;\n  for (i = 0; i < numEncoderThreads; i++)\n  {\n    CEncoderInfo &encoder = encoders[i];\n    encoder.callback = (i == 0) ? callback : 0;\n\n    #ifdef EXTERNAL_LZMA\n    RINOK(codecs->CreateCoder(name, true, encoder.encoder));\n    #else\n    encoder.encoder = new NCompress::NLzma::CEncoder;\n    #endif\n    for (UInt32 j = 0; j < numSubDecoderThreads; j++)\n    {\n      #ifdef EXTERNAL_LZMA\n      RINOK(codecs->CreateCoder(name, false, encoder.decoders[j]));\n      #else\n      encoder.decoders[j] = new NCompress::NLzma::CDecoder;\n      #endif\n    }\n  }\n\n  CBaseRandomGenerator rg;\n  rg.Init();\n  for (i = 0; i < numEncoderThreads; i++)\n  {\n    RINOK(encoders[i].Init(dictionarySize, numThreads, &rg));\n  }\n\n  CBenchProgressStatus status;\n  status.Res = S_OK;\n  status.EncodeMode = true;\n\n  for (i = 0; i < numEncoderThreads; i++)\n  {\n    CEncoderInfo &encoder = encoders[i];\n    for (int j = 0; j < 2; j++)\n    {\n      encoder.progressInfo[j] = encoder.progressInfoSpec[j] = new CBenchProgressInfo;\n      encoder.progressInfoSpec[j]->Status = &status;\n    }\n    if (i == 0)\n    {\n      encoder.progressInfoSpec[0]->callback = callback;\n      encoder.progressInfoSpec[0]->BenchInfo.NumIterations = numEncoderThreads;\n      SetStartTime(encoder.progressInfoSpec[0]->BenchInfo);\n    }\n\n    #ifdef BENCH_MT\n    if (numEncoderThreads > 1)\n    {\n      #ifdef USE_ALLOCA\n      encoder.AllocaSize = (i * 16 * 21) & 0x7FF;\n      #endif\n      RINOK(encoder.CreateEncoderThread())\n    }\n    else\n    #endif\n    {\n      RINOK(encoder.Encode());\n    }\n  }\n  #ifdef BENCH_MT\n  if (numEncoderThreads > 1)\n    for (i = 0; i < numEncoderThreads; i++)\n      encoders[i].thread[0].Wait();\n  #endif\n\n  RINOK(status.Res);\n\n  CBenchInfo info;\n\n  SetFinishTime(encoders[0].progressInfoSpec[0]->BenchInfo, info);\n  info.UnpackSize = 0;\n  info.PackSize = 0;\n  info.NumIterations = 1; // progressInfoSpec->NumIterations;\n  for (i = 0; i < numEncoderThreads; i++)\n  {\n    CEncoderInfo &encoder = encoders[i];\n    info.UnpackSize += encoder.kBufferSize;\n    info.PackSize += encoder.compressedSize;\n  }\n  RINOK(callback->SetEncodeResult(info, true));\n\n\n  status.Res = S_OK;\n  status.EncodeMode = false;\n\n  UInt32 numDecoderThreads = numEncoderThreads * numSubDecoderThreads;\n  for (i = 0; i < numEncoderThreads; i++)\n  {\n    CEncoderInfo &encoder = encoders[i];\n    encoder.NumIterations = 2 + kUncompressMinBlockSize / encoder.kBufferSize;\n\n    if (i == 0)\n    {\n      encoder.progressInfoSpec[0]->callback = callback;\n      encoder.progressInfoSpec[0]->BenchInfo.NumIterations = numDecoderThreads;\n      SetStartTime(encoder.progressInfoSpec[0]->BenchInfo);\n    }\n\n    #ifdef BENCH_MT\n    if (numDecoderThreads > 1)\n    {\n      for (UInt32 j = 0; j < numSubDecoderThreads; j++)\n      {\n        HRESULT res = encoder.CreateDecoderThread(j, (i == 0 && j == 0)\n            #ifdef USE_ALLOCA\n            , ((i * numSubDecoderThreads + j) * 16 * 21) & 0x7FF\n            #endif\n            );\n        RINOK(res);\n      }\n    }\n    else\n    #endif\n    {\n      RINOK(encoder.Decode(0));\n    }\n  }\n  #ifdef BENCH_MT\n  HRESULT res = S_OK;\n  if (numDecoderThreads > 1)\n    for (i = 0; i < numEncoderThreads; i++)\n      for (UInt32 j = 0; j < numSubDecoderThreads; j++)\n      {\n        CEncoderInfo &encoder = encoders[i];\n        encoder.thread[j].Wait();\n        if (encoder.Results[j] != S_OK)\n          res = encoder.Results[j];\n      }\n  RINOK(res);\n  #endif\n  RINOK(status.Res);\n  SetFinishTime(encoders[0].progressInfoSpec[0]->BenchInfo, info);\n  info.UnpackSize = 0;\n  info.PackSize = 0;\n  info.NumIterations = numSubDecoderThreads * encoders[0].NumIterations;\n  for (i = 0; i < numEncoderThreads; i++)\n  {\n    CEncoderInfo &encoder = encoders[i];\n    info.UnpackSize += encoder.kBufferSize;\n    info.PackSize += encoder.compressedSize;\n  }\n  RINOK(callback->SetDecodeResult(info, false));\n  RINOK(callback->SetDecodeResult(info, true));\n  return S_OK;\n}\n\n\ninline UInt64 GetLZMAUsage(bool multiThread, UInt32 dictionary)\n{\n  UInt32 hs = dictionary - 1;\n  hs |= (hs >> 1);\n  hs |= (hs >> 2);\n  hs |= (hs >> 4);\n  hs |= (hs >> 8);\n  hs >>= 1;\n  hs |= 0xFFFF;\n  if (hs > (1 << 24))\n    hs >>= 1;\n  hs++;\n  return ((hs + (1 << 16)) + (UInt64)dictionary * 2) * 4 + (UInt64)dictionary * 3 / 2 +\n      (1 << 20) + (multiThread ? (6 << 20) : 0);\n}\n\nUInt64 GetBenchMemoryUsage(UInt32 numThreads, UInt32 dictionary)\n{\n  const UInt32 kBufferSize = dictionary;\n  const UInt32 kCompressedBufferSize = (kBufferSize / 2);\n  UInt32 numSubThreads = (numThreads > 1) ? 2 : 1;\n  UInt32 numBigThreads = numThreads / numSubThreads;\n  return (kBufferSize + kCompressedBufferSize +\n    GetLZMAUsage((numThreads > 1), dictionary) + (2 << 20)) * numBigThreads;\n}\n\nstatic bool CrcBig(const void *data, UInt32 size, UInt32 numCycles, UInt32 crcBase)\n{\n  for (UInt32 i = 0; i < numCycles; i++)\n    if (CrcCalc(data, size) != crcBase)\n      return false;\n  return true;\n}\n\n#ifdef BENCH_MT\nstruct CCrcInfo\n{\n  NWindows::CThread Thread;\n  const Byte *Data;\n  UInt32 Size;\n  UInt32 NumCycles;\n  UInt32 Crc;\n  bool Res;\n  void Wait()\n  {\n    Thread.Wait();\n    Thread.Close();\n  }\n};\n\nstatic THREAD_FUNC_DECL CrcThreadFunction(void *param)\n{\n  CCrcInfo *p = (CCrcInfo *)param;\n  p->Res = CrcBig(p->Data, p->Size, p->NumCycles, p->Crc);\n  return 0;\n}\n\nstruct CCrcThreads\n{\n  UInt32 NumThreads;\n  CCrcInfo *Items;\n  CCrcThreads(): Items(0), NumThreads(0) {}\n  void WaitAll()\n  {\n    for (UInt32 i = 0; i < NumThreads; i++)\n      Items[i].Wait();\n    NumThreads = 0;\n  }\n  ~CCrcThreads()\n  {\n    WaitAll();\n    delete []Items;\n  }\n};\n#endif\n\nstatic UInt32 CrcCalc1(const Byte *buf, UInt32 size)\n{\n  UInt32 crc = CRC_INIT_VAL;;\n  for (UInt32 i = 0; i < size; i++)\n    crc = CRC_UPDATE_BYTE(crc, buf[i]);\n  return CRC_GET_DIGEST(crc);\n}\n\nstatic void RandGen(Byte *buf, UInt32 size, CBaseRandomGenerator &RG)\n{\n  for (UInt32 i = 0; i < size; i++)\n    buf[i] = (Byte)RG.GetRnd();\n}\n\nstatic UInt32 RandGenCrc(Byte *buf, UInt32 size, CBaseRandomGenerator &RG)\n{\n  RandGen(buf, size, RG);\n  return CrcCalc1(buf, size);\n}\n\nbool CrcInternalTest()\n{\n  CBenchBuffer buffer;\n  const UInt32 kBufferSize0 = (1 << 8);\n  const UInt32 kBufferSize1 = (1 << 10);\n  const UInt32 kCheckSize = (1 << 5);\n  if (!buffer.Alloc(kBufferSize0 + kBufferSize1))\n    return false;\n  Byte *buf = buffer.Buffer;\n  UInt32 i;\n  for (i = 0; i < kBufferSize0; i++)\n    buf[i] = (Byte)i;\n  UInt32 crc1 = CrcCalc1(buf, kBufferSize0);\n  if (crc1 != 0x29058C73)\n    return false;\n  CBaseRandomGenerator RG;\n  RandGen(buf + kBufferSize0, kBufferSize1, RG);\n  for (i = 0; i < kBufferSize0 + kBufferSize1 - kCheckSize; i++)\n    for (UInt32 j = 0; j < kCheckSize; j++)\n      if (CrcCalc1(buf + i, j) != CrcCalc(buf + i, j))\n        return false;\n  return true;\n}\n\nHRESULT CrcBench(UInt32 numThreads, UInt32 bufferSize, UInt64 &speed)\n{\n  if (numThreads == 0)\n    numThreads = 1;\n\n  CBenchBuffer buffer;\n  size_t totalSize = (size_t)bufferSize * numThreads;\n  if (totalSize / numThreads != bufferSize)\n    return E_OUTOFMEMORY;\n  if (!buffer.Alloc(totalSize))\n    return E_OUTOFMEMORY;\n\n  Byte *buf = buffer.Buffer;\n  CBaseRandomGenerator RG;\n  UInt32 numCycles = ((UInt32)1 << 30) / ((bufferSize >> 2) + 1) + 1;\n\n  UInt64 timeVal;\n  #ifdef BENCH_MT\n  CCrcThreads threads;\n  if (numThreads > 1)\n  {\n    threads.Items = new CCrcInfo[numThreads];\n    UInt32 i;\n    for (i = 0; i < numThreads; i++)\n    {\n      CCrcInfo &info = threads.Items[i];\n      Byte *data = buf + (size_t)bufferSize * i;\n      info.Data = data;\n      info.NumCycles = numCycles;\n      info.Size = bufferSize;\n      info.Crc = RandGenCrc(data, bufferSize, RG);\n    }\n    timeVal = GetTimeCount();\n    for (i = 0; i < numThreads; i++)\n    {\n      CCrcInfo &info = threads.Items[i];\n      RINOK(info.Thread.Create(CrcThreadFunction, &info));\n      threads.NumThreads++;\n    }\n    threads.WaitAll();\n    for (i = 0; i < numThreads; i++)\n      if (!threads.Items[i].Res)\n        return S_FALSE;\n  }\n  else\n  #endif\n  {\n    UInt32 crc = RandGenCrc(buf, bufferSize, RG);\n    timeVal = GetTimeCount();\n    if (!CrcBig(buf, bufferSize, numCycles, crc))\n      return S_FALSE;\n  }\n  timeVal = GetTimeCount() - timeVal;\n  if (timeVal == 0)\n    timeVal = 1;\n\n  UInt64 size = (UInt64)numCycles * totalSize;\n  speed = MyMultDiv64(size, timeVal, GetFreq());\n  return S_OK;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h",
    "content": "// LzmaBench.h\n\n#ifndef __LZMABENCH_H\n#define __LZMABENCH_H\n\n#include <stdio.h>\n#include \"../../../Common/Types.h\"\n#ifdef EXTERNAL_LZMA\n#include \"../../UI/Common/LoadCodecs.h\"\n#endif\n\nstruct CBenchInfo\n{\n  UInt64 GlobalTime;\n  UInt64 GlobalFreq;\n  UInt64 UserTime;\n  UInt64 UserFreq;\n  UInt64 UnpackSize;\n  UInt64 PackSize;\n  UInt32 NumIterations;\n  CBenchInfo(): NumIterations(0) {}\n};\n\nstruct IBenchCallback\n{\n  virtual HRESULT SetEncodeResult(const CBenchInfo &info, bool final) = 0;\n  virtual HRESULT SetDecodeResult(const CBenchInfo &info, bool final) = 0;\n};\n\nUInt64 GetUsage(const CBenchInfo &benchOnfo);\nUInt64 GetRatingPerUsage(const CBenchInfo &info, UInt64 rating);\nUInt64 GetCompressRating(UInt32 dictionarySize, UInt64 elapsedTime, UInt64 freq, UInt64 size);\nUInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 freq, UInt64 outSize, UInt64 inSize, UInt32 numIterations);\n\nHRESULT LzmaBench(\n  #ifdef EXTERNAL_LZMA\n  CCodecs *codecs,\n  #endif\n  UInt32 numThreads, UInt32 dictionarySize, IBenchCallback *callback);\n\nconst int kBenchMinDicLogSize = 18;\n\nUInt64 GetBenchMemoryUsage(UInt32 numThreads, UInt32 dictionary);\n\nbool CrcInternalTest();\nHRESULT CrcBench(UInt32 numThreads, UInt32 bufferSize, UInt64 &speed);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp",
    "content": "// LzmaBenchCon.cpp\n\n#include \"StdAfx.h\"\n\n#include <stdio.h>\n\n#include \"LzmaBench.h\"\n#include \"LzmaBenchCon.h\"\n#include \"../../../Common/IntToString.h\"\n\n#if defined(BENCH_MT) || defined(_WIN32)\n#include \"../../../Windows/System.h\"\n#endif\n\n#ifdef BREAK_HANDLER\n#include \"../../UI/Console/ConsoleClose.h\"\n#endif\n#include \"../../../Common/MyCom.h\"\n\nstruct CTotalBenchRes\n{\n  UInt64 NumIterations;\n  UInt64 Rating;\n  UInt64 Usage;\n  UInt64 RPU;\n  void Init() { NumIterations = 0; Rating = 0; Usage = 0; RPU = 0; }\n  void Normalize()\n  {\n    if (NumIterations == 0)\n      return;\n    Rating /= NumIterations;\n    Usage /= NumIterations;\n    RPU /= NumIterations;\n    NumIterations = 1;\n  }\n  void SetMid(const CTotalBenchRes &r1, const CTotalBenchRes &r2)\n  {\n    Rating = (r1.Rating + r2.Rating) / 2;\n    Usage = (r1.Usage + r2.Usage) / 2;\n    RPU = (r1.RPU + r2.RPU) / 2;\n    NumIterations = (r1.NumIterations + r2.NumIterations) / 2;\n  }\n};\n\nstruct CBenchCallback: public IBenchCallback\n{\n  CTotalBenchRes EncodeRes;\n  CTotalBenchRes DecodeRes;\n  FILE *f;\n  void Init() { EncodeRes.Init(); DecodeRes.Init(); }\n  void Normalize() { EncodeRes.Normalize(); DecodeRes.Normalize(); }\n  UInt32 dictionarySize;\n  HRESULT SetEncodeResult(const CBenchInfo &info, bool final);\n  HRESULT SetDecodeResult(const CBenchInfo &info, bool final);\n};\n\nstatic void NormalizeVals(UInt64 &v1, UInt64 &v2)\n{\n  while (v1 > 1000000)\n  {\n    v1 >>= 1;\n    v2 >>= 1;\n  }\n}\n\nstatic UInt64 MyMultDiv64(UInt64 value, UInt64 elapsedTime, UInt64 freq)\n{\n  UInt64 elTime = elapsedTime;\n  NormalizeVals(freq, elTime);\n  if (elTime == 0)\n    elTime = 1;\n  return value * freq / elTime;\n}\n\nstatic void PrintNumber(FILE *f, UInt64 value, int size)\n{\n  char s[32];\n  ConvertUInt64ToString(value, s);\n  fprintf(f, \" \");\n  for (int len = (int)strlen(s); len < size; len++)\n    fprintf(f, \" \");\n  fprintf(f, \"%s\", s);\n}\n\nstatic void PrintRating(FILE *f, UInt64 rating)\n{\n  PrintNumber(f, rating / 1000000, 6);\n}\n\nstatic void PrintResults(FILE *f, UInt64 usage, UInt64 rpu, UInt64 rating)\n{\n  PrintNumber(f, (usage + 5000) / 10000, 5);\n  PrintRating(f, rpu);\n  PrintRating(f, rating);\n}\n\n\nstatic void PrintResults(FILE *f, const CBenchInfo &info, UInt64 rating, CTotalBenchRes &res)\n{\n  UInt64 speed = MyMultDiv64(info.UnpackSize, info.GlobalTime, info.GlobalFreq);\n  PrintNumber(f, speed / 1024, 7);\n  UInt64 usage = GetUsage(info);\n  UInt64 rpu = GetRatingPerUsage(info, rating);\n  PrintResults(f, usage, rpu, rating);\n  res.NumIterations++;\n  res.RPU += rpu;\n  res.Rating += rating;\n  res.Usage += usage;\n}\n\nstatic void PrintTotals(FILE *f, const CTotalBenchRes &res)\n{\n  fprintf(f, \"       \");\n  PrintResults(f, res.Usage, res.RPU, res.Rating);\n}\n\n\nHRESULT CBenchCallback::SetEncodeResult(const CBenchInfo &info, bool final)\n{\n  #ifdef BREAK_HANDLER\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  #endif\n\n  if (final)\n  {\n    UInt64 rating = GetCompressRating(dictionarySize, info.GlobalTime, info.GlobalFreq, info.UnpackSize);\n    PrintResults(f, info, rating, EncodeRes);\n  }\n  return S_OK;\n}\n\nstatic const char *kSep = \"  | \";\n\n\nHRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final)\n{\n  #ifdef BREAK_HANDLER\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  #endif\n  if (final)\n  {\n    UInt64 rating = GetDecompressRating(info.GlobalTime, info.GlobalFreq, info.UnpackSize, info.PackSize, info.NumIterations);\n    fprintf(f, kSep);\n    CBenchInfo info2 = info;\n    info2.UnpackSize *= info2.NumIterations;\n    info2.PackSize *= info2.NumIterations;\n    info2.NumIterations = 1;\n    PrintResults(f, info2, rating, DecodeRes);\n  }\n  return S_OK;\n}\n\nstatic void PrintRequirements(FILE *f, const char *sizeString, UInt64 size, const char *threadsString, UInt32 numThreads)\n{\n  fprintf(f, \"\\nRAM %s \", sizeString);\n  PrintNumber(f, (size >> 20), 5);\n  fprintf(f, \" MB,  # %s %3d\", threadsString, (unsigned int)numThreads);\n}\n\nHRESULT LzmaBenchCon(\n  #ifdef EXTERNAL_LZMA\n  CCodecs *codecs,\n  #endif\n  FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary)\n{\n  if (!CrcInternalTest())\n    return S_FALSE;\n  #ifdef BENCH_MT\n  UInt64 ramSize = NWindows::NSystem::GetRamSize();  //\n  UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors();\n  PrintRequirements(f, \"size: \", ramSize, \"CPU hardware threads:\", numCPUs);\n  if (numThreads == (UInt32)-1)\n    numThreads = numCPUs;\n  if (numThreads > 1)\n    numThreads &= ~1;\n  if (dictionary == (UInt32)-1)\n  {\n    int dicSizeLog;\n    for (dicSizeLog = 25; dicSizeLog > kBenchMinDicLogSize; dicSizeLog--)\n      if (GetBenchMemoryUsage(numThreads, ((UInt32)1 << dicSizeLog)) + (8 << 20) <= ramSize)\n        break;\n    dictionary = (1 << dicSizeLog);\n  }\n  #else\n  if (dictionary == (UInt32)-1)\n    dictionary = (1 << 22);\n  numThreads = 1;\n  #endif\n\n  PrintRequirements(f, \"usage:\", GetBenchMemoryUsage(numThreads, dictionary), \"Benchmark threads:   \", numThreads);\n\n  CBenchCallback callback;\n  callback.Init();\n  callback.f = f;\n  \n  fprintf(f, \"\\n\\nDict        Compressing          |        Decompressing\\n   \");\n  int j;\n  for (j = 0; j < 2; j++)\n  {\n    fprintf(f, \"   Speed Usage    R/U Rating\");\n    if (j == 0)\n      fprintf(f, kSep);\n  }\n  fprintf(f, \"\\n   \");\n  for (j = 0; j < 2; j++)\n  {\n    fprintf(f, \"    KB/s     %%   MIPS   MIPS\");\n    if (j == 0)\n      fprintf(f, kSep);\n  }\n  fprintf(f, \"\\n\\n\");\n  for (UInt32 i = 0; i < numIterations; i++)\n  {\n    const int kStartDicLog = 22;\n    int pow = (dictionary < ((UInt32)1 << kStartDicLog)) ? kBenchMinDicLogSize : kStartDicLog;\n    while (((UInt32)1 << pow) > dictionary)\n      pow--;\n    for (; ((UInt32)1 << pow) <= dictionary; pow++)\n    {\n      fprintf(f, \"%2d:\", pow);\n      callback.dictionarySize = (UInt32)1 << pow;\n      HRESULT res = LzmaBench(\n        #ifdef EXTERNAL_LZMA\n        codecs,\n        #endif\n        numThreads, callback.dictionarySize, &callback);\n      fprintf(f, \"\\n\");\n      RINOK(res);\n    }\n  }\n  callback.Normalize();\n  fprintf(f, \"----------------------------------------------------------------\\nAvr:\");\n  PrintTotals(f, callback.EncodeRes);\n  fprintf(f, \"     \");\n  PrintTotals(f, callback.DecodeRes);\n  fprintf(f, \"\\nTot:\");\n  CTotalBenchRes midRes;\n  midRes.SetMid(callback.EncodeRes, callback.DecodeRes);\n  PrintTotals(f, midRes);\n  fprintf(f, \"\\n\");\n  return S_OK;\n}\n\nstruct CTempValues\n{\n  UInt64 *Values;\n  CTempValues(UInt32 num) { Values = new UInt64[num]; }\n  ~CTempValues() { delete []Values; }\n};\n\nHRESULT CrcBenchCon(FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary)\n{\n  if (!CrcInternalTest())\n    return S_FALSE;\n\n  #ifdef BENCH_MT\n  UInt64 ramSize = NWindows::NSystem::GetRamSize();\n  UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors();\n  PrintRequirements(f, \"size: \", ramSize, \"CPU hardware threads:\", numCPUs);\n  if (numThreads == (UInt32)-1)\n    numThreads = numCPUs;\n  #else\n  numThreads = 1;\n  #endif\n  if (dictionary == (UInt32)-1)\n    dictionary = (1 << 24);\n\n  CTempValues speedTotals(numThreads);\n  fprintf(f, \"\\n\\nSize\");\n  for (UInt32 ti = 0; ti < numThreads; ti++)\n  {\n    fprintf(f, \" %5d\", ti + 1);\n    speedTotals.Values[ti] = 0;\n  }\n  fprintf(f, \"\\n\\n\");\n\n  UInt64 numSteps = 0;\n  for (UInt32 i = 0; i < numIterations; i++)\n  {\n    for (int pow = 10; pow < 32; pow++)\n    {\n      UInt32 bufSize = (UInt32)1 << pow;\n      if (bufSize > dictionary)\n        break;\n      fprintf(f, \"%2d: \", pow);\n      UInt64 speed;\n      for (UInt32 ti = 0; ti < numThreads; ti++)\n      {\n        #ifdef BREAK_HANDLER\n        if (NConsoleClose::TestBreakSignal())\n          return E_ABORT;\n        #endif\n        RINOK(CrcBench(ti + 1, bufSize, speed));\n        PrintNumber(f, (speed >> 20), 5);\n        speedTotals.Values[ti] += speed;\n      }\n      fprintf(f, \"\\n\");\n      numSteps++;\n    }\n  }\n  if (numSteps != 0)\n  {\n    fprintf(f, \"\\nAvg:\");\n    for (UInt32 ti = 0; ti < numThreads; ti++)\n      PrintNumber(f, ((speedTotals.Values[ti] / numSteps) >> 20), 5);\n    fprintf(f, \"\\n\");\n  }\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h",
    "content": "// LzmaBenchCon.h\n\n#ifndef __LZMABENCHCON_H\n#define __LZMABENCHCON_H\n\n#include <stdio.h>\n#include \"../../../Common/Types.h\"\n#ifdef EXTERNAL_LZMA\n#include \"../../UI/Common/LoadCodecs.h\"\n#endif\nHRESULT LzmaBenchCon(\n  #ifdef EXTERNAL_LZMA\n  CCodecs *codecs,\n  #endif\n  FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary);\n\nHRESULT CrcBenchCon(FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary);\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LZMA_Alone/makefile",
    "content": "include ../../../../makefile.machine\n\nPROG = lzma\nLIB = $(LOCAL_LIBS)\nRM = rm -f\nCFLAGS = -c -I. -I../../../  -I../../../myWindows  -I../../../include_windows \\\n         -UENV_UNIX -DCOMPRESS_MF_MT -DBENCH_MT\n\nCXXFLAGS=$(CFLAGS)\n\nOBJS = \\\n  LzmaAlone.o \\\n  LzmaBench.o \\\n  LzmaBenchCon.o \\\n  LzmaDecoder.o \\\n  LzmaEncoder.o \\\n  InBuffer.o \\\n  OutBuffer.o \\\n  FileStreams.o \\\n  StreamUtils.o \\\n  C_FileIO.o \\\n  CommandLineParser.o \\\n  CRC.o \\\n  IntToString.o \\\n  MyString.o \\\n  StringConvert.o \\\n  StringToInt.o \\\n  MyVector.o \\\n  7zCrc.o \\\n  Bra86.o \\\n  LzFind.o \\\n  LzFindMt.o \\\n  LzmaDec.o \\\n  LzmaEnc.o \\\n  Lzma86Dec.o \\\n  Lzma86Enc.o \\\n  System.o \\\n  Threads.o\n\nall: $(PROG)\n\n$(PROG): $(OBJS)\n\t$(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB)\n\nLzmaAlone.o: LzmaAlone.cpp\n\t$(CXX) $(CXXFLAGS) LzmaAlone.cpp\n\nLzmaBench.o: LzmaBench.cpp\n\t$(CXX) $(CXXFLAGS) LzmaBench.cpp\n\nLzmaBenchCon.o: LzmaBenchCon.cpp\n\t$(CXX) $(CXXFLAGS) LzmaBenchCon.cpp\n\nLzmaRam.o: LzmaRam.cpp\n\t$(CXX) $(CXXFLAGS) LzmaRam.cpp\n\nLzmaDecoder.o: ../LzmaDecoder.cpp\n\t$(CXX) $(CXXFLAGS) ../LzmaDecoder.cpp\n\nLzmaEncoder.o: ../LzmaEncoder.cpp\n\t$(CXX) $(CXXFLAGS) ../LzmaEncoder.cpp\n\nRangeCoderBit.o: ../RangeCoderBit.cpp\n\t$(CXX) $(CXXFLAGS) ../RangeCoderBit.cpp\n\nInBuffer.o: ../../Common/InBuffer.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/InBuffer.cpp\n\nOutBuffer.o: ../../Common/OutBuffer.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/OutBuffer.cpp\n\nFileStreams.o: ../../Common/FileStreams.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/FileStreams.cpp\n\nStreamUtils.o: ../../Common/StreamUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/StreamUtils.cpp\n\nC_FileIO.o: ../../../Common/C_FileIO.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/C_FileIO.cpp\n\nCommandLineParser.o: ../../../Common/CommandLineParser.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/CommandLineParser.cpp\n\nCRC.o: ../../../Common/CRC.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/CRC.cpp\n\nMyWindows.o: ../../../Common/MyWindows.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyWindows.cpp\n\nIntToString.o: ../../../Common/IntToString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/IntToString.cpp\n\nMyString.o: ../../../Common/MyString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyString.cpp\n\nStringConvert.o: ../../../Common/StringConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringConvert.cpp\n\nStringToInt.o: ../../../Common/StringToInt.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringToInt.cpp\n\nMyVector.o: ../../../Common/MyVector.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyVector.cpp\n\n7zCrc.o: ../../../../C/7zCrc.c\n\t$(CC) $(CFLAGS) ../../../../C/7zCrc.c\n\nLzmaRamDecode.o: LzmaRamDecode.c\n\t$(CC) $(CFLAGS) LzmaRamDecode.c\n\nSystem.o : ../../../Windows/System.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/System.cpp\n\nThreads.o : ../../../../C/Threads.c\n\t$(CC) $(CFLAGS) ../../../../C/Threads.c\n\nBra86.o: ../../../../C/Bra86.c\n\t$(CC) $(CFLAGS) ../../../../C/Bra86.c\n\nLzFind.o: ../../../../C/LzFind.c\n\t$(CC) $(CFLAGS) ../../../../C/LzFind.c\n\nLzFindMt.o: ../../../../C/LzFindMt.c\n\t$(CC) $(CFLAGS) ../../../../C/LzFindMt.c\n\nLzmaDec.o: ../../../../C/LzmaDec.c\n\t$(CC) $(CFLAGS) ../../../../C/LzmaDec.c\n\nLzmaEnc.o: ../../../../C/LzmaEnc.c\n\t$(CC) $(CFLAGS) ../../../../C/LzmaEnc.c\n\nLzma86Dec.o: ../../../../C/LzmaUtil/Lzma86Dec.c\n\t$(CC) $(CFLAGS) ../../../../C/LzmaUtil/Lzma86Dec.c\n\nLzma86Enc.o: ../../../../C/LzmaUtil/Lzma86Enc.c\n\t$(CC) $(CFLAGS) ../../../../C/LzmaUtil/Lzma86Enc.c\n\nclean:\n\t-$(RM) $(PROG) $(OBJS) testfile* *.exe ir.out\n\t-$(RM) -fr SunWS_cache\n\ntest: $(PROG)\n\tcp LzmaAlone.cpp testfile\n\t./$(PROG) e testfile testfile.lzma\n\t./$(PROG) d testfile.lzma testfile.lzma.d \n\tdiff -s testfile testfile.lzma.d\n\t./$(PROG) e testfile testfile.lzma\n\t./$(PROG) d testfile.lzma testfile.lzma.d \n\tdiff -s testfile testfile.lzma.d\n\t./$(PROG) e -si -so < testfile > testfile.lzma.2\n\t./$(PROG) d -si -so < testfile.lzma.2 > testfile.lzma.2.d \n\tdiff -s testfile testfile.lzma.2.d\n\t@echo =========\n\t@echo All Done \n\t@echo =========\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzOutWindow.cpp",
    "content": "// LzOutWindow.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzOutWindow.h\"\n\nvoid CLzOutWindow::Init(bool solid)\n{\n  if (!solid)\n    COutBuffer::Init();\n  #ifdef _NO_EXCEPTIONS\n  ErrorCode = S_OK;\n  #endif\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzOutWindow.h",
    "content": "// LzOutWindow.h\n\n#ifndef __LZ_OUT_WINDOW_H\n#define __LZ_OUT_WINDOW_H\n\n#include \"../IStream.h\"\n\n#include \"../Common/OutBuffer.h\"\n\n#ifndef _NO_EXCEPTIONS\ntypedef COutBufferException CLzOutWindowException;\n#endif\n\nclass CLzOutWindow: public COutBuffer\n{\npublic:\n  void Init(bool solid = false);\n  \n  // distance >= 0, len > 0,\n  bool CopyBlock(UInt32 distance, UInt32 len)\n  {\n    UInt32 pos = _pos - distance - 1;\n    if (distance >= _pos)\n    {\n      if (!_overDict || distance >= _bufferSize)\n        return false;\n      pos += _bufferSize;\n    }\n    if (_limitPos - _pos > len && _bufferSize - pos > len)\n    {\n      const Byte *src = _buffer + pos;\n      Byte *dest = _buffer + _pos;\n      _pos += len;\n      do\n        *dest++ = *src++;\n      while(--len != 0);\n    }\n    else do\n    {\n      if (pos == _bufferSize)\n        pos = 0;\n      _buffer[_pos++] = _buffer[pos++];\n      if (_pos == _limitPos)\n        FlushWithCheck();\n    }\n    while(--len != 0);\n    return true;\n  }\n  \n  void PutByte(Byte b)\n  {\n    _buffer[_pos++] = b;\n    if (_pos == _limitPos)\n      FlushWithCheck();\n  }\n  \n  Byte GetByte(UInt32 distance) const\n  {\n    UInt32 pos = _pos - distance - 1;\n    if (pos >= _bufferSize)\n      pos += _bufferSize;\n    return _buffer[pos];\n  }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzhDecoder.cpp",
    "content": "// LzhDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LzhDecoder.h\"\n\n#include \"Windows/Defs.h\"\n\nnamespace NCompress{\nnamespace NLzh {\nnamespace NDecoder {\n\nstatic const UInt32 kHistorySize = (1 << 16);\n\nstatic const int kBlockSizeBits = 16;\nstatic const int kNumCBits = 9;\nstatic const int kNumLevelBits = 5; // smallest integer such that (1 << kNumLevelBits) > kNumLevelSymbols/\n\nUInt32 CCoder::ReadBits(int numBits) {  return m_InBitStream.ReadBits(numBits); }\n\nHRESULT CCoder::ReadLevelTable()\n{\n  int n = ReadBits(kNumLevelBits);\n  if (n == 0)\n  {\n    m_LevelHuffman.Symbol = ReadBits(kNumLevelBits);\n    if (m_LevelHuffman.Symbol >= kNumLevelSymbols)\n      return S_FALSE;\n  }\n  else\n  {\n    if (n > kNumLevelSymbols)\n      return S_FALSE;\n    m_LevelHuffman.Symbol = -1;\n    Byte lens[kNumLevelSymbols];\n    int i = 0;\n    while (i < n)\n    {\n      int c = m_InBitStream.ReadBits(3);\n      if (c == 7)\n        while (ReadBits(1))\n          if (c++ > kMaxHuffmanLen)\n            return S_FALSE;\n      lens[i++] = (Byte)c;\n      if (i == kNumSpecLevelSymbols)\n      {\n        c = ReadBits(2);\n        while (--c >= 0)\n          lens[i++] = 0;\n      }\n    }\n    while (i < kNumLevelSymbols)\n      lens[i++] = 0;\n    m_LevelHuffman.SetCodeLengths(lens);\n  }\n  return S_OK;\n}\n\nHRESULT CCoder::ReadPTable(int numBits)\n{\n  int n = ReadBits(numBits);\n  if (n == 0)\n  {\n    m_PHuffmanDecoder.Symbol = ReadBits(numBits);\n    if (m_PHuffmanDecoder.Symbol >= kNumDistanceSymbols)\n      return S_FALSE;\n  }\n  else\n  {\n    if (n > kNumDistanceSymbols)\n      return S_FALSE;\n    m_PHuffmanDecoder.Symbol = -1;\n    Byte lens[kNumDistanceSymbols];\n    int i = 0;\n    while (i < n)\n    {\n      int c = m_InBitStream.ReadBits(3);\n      if (c == 7)\n        while (ReadBits(1))\n        {\n          if (c > kMaxHuffmanLen)\n            return S_FALSE;\n          c++;\n        }\n      lens[i++] = (Byte)c;\n    }\n    while (i < kNumDistanceSymbols)\n      lens[i++] = 0;\n    m_PHuffmanDecoder.SetCodeLengths(lens);\n  }\n  return S_OK;\n}\n\nHRESULT CCoder::ReadCTable()\n{\n  int n = ReadBits(kNumCBits);\n  if (n == 0)\n  {\n    m_CHuffmanDecoder.Symbol = ReadBits(kNumCBits);\n    if (m_CHuffmanDecoder.Symbol >= kNumCSymbols)\n      return S_FALSE;\n  }\n  else\n  {\n    if (n > kNumCSymbols)\n      return S_FALSE;\n    m_CHuffmanDecoder.Symbol = -1;\n    Byte lens[kNumCSymbols];\n    int i = 0;\n    while (i < n)\n    {\n      int c = m_LevelHuffman.Decode(&m_InBitStream);\n      if (c < kNumSpecLevelSymbols)\n      {\n        if (c == 0)\n          c = 1;\n        else if (c == 1)\n          c = ReadBits(4) + 3;\n        else\n          c = ReadBits(kNumCBits) + 20;\n        while (--c >= 0)\n        {\n          if (i > kNumCSymbols)\n            return S_FALSE;\n          lens[i++] = 0;\n        }\n      }\n      else\n        lens[i++] = (Byte)(c - 2);\n    }\n    while (i < kNumCSymbols)\n      lens[i++] = 0;\n    m_CHuffmanDecoder.SetCodeLengths(lens);\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CCoder::CodeReal(ISequentialInStream *inStream,\n    ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 *outSize,\n    ICompressProgressInfo *progress)\n{\n  if (outSize == NULL)\n    return E_INVALIDARG;\n\n  if (!m_OutWindowStream.Create(kHistorySize))\n    return E_OUTOFMEMORY;\n  if (!m_InBitStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n\n  UInt64 pos = 0;\n  m_OutWindowStream.SetStream(outStream);\n  m_OutWindowStream.Init(false);\n  m_InBitStream.SetStream(inStream);\n  m_InBitStream.Init();\n  \n  CCoderReleaser coderReleaser(this);\n\n  int pbit;\n  if (m_NumDictBits <= 13)\n    pbit = 4;\n  else\n    pbit = 5;\n\n  UInt32 blockSize = 0;\n\n  while(pos < *outSize)\n  {\n    // for (i = 0; i < dictSize; i++) dtext[i] = 0x20;\n    \n    if (blockSize == 0)\n    {\n      if (progress != NULL)\n      {\n        UInt64 packSize = m_InBitStream.GetProcessedSize();\n        RINOK(progress->SetRatioInfo(&packSize, &pos));\n      }\n      blockSize = ReadBits(kBlockSizeBits);\n      ReadLevelTable();\n      ReadCTable();\n      RINOK(ReadPTable(pbit));\n    }\n    blockSize--;\n    UInt32 c = m_CHuffmanDecoder.Decode(&m_InBitStream);\n    if (c < 256)\n    {\n      m_OutWindowStream.PutByte((Byte)c);\n      pos++;\n    }\n    else if (c >= kNumCSymbols)\n      return S_FALSE;\n    else\n    {\n      // offset = (interface->method == LARC_METHOD_NUM) ? 0x100 - 2 : 0x100 - 3;\n      UInt32 len  = c - 256 + kMinMatch;\n      UInt32 distance = m_PHuffmanDecoder.Decode(&m_InBitStream);\n      if (distance != 0)\n        distance = (1 << (distance - 1)) + ReadBits(distance - 1);\n      if (distance >= pos)\n        return S_FALSE;\n      if (pos + len > *outSize)\n        len = (UInt32)(*outSize - pos);\n      pos += len;\n      m_OutWindowStream.CopyBlock(distance, len);\n    }\n  }\n  coderReleaser.NeedFlush = false;\n  return m_OutWindowStream.Flush();\n}\n\nSTDMETHODIMP CCoder::Code(ISequentialInStream *inStream,\n    ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,\n    ICompressProgressInfo *progress)\n{\n  try { return CodeReal(inStream, outStream, inSize, outSize, progress);}\n  catch(const CInBufferException &e) { return e.ErrorCode; }\n  catch(const CLzOutWindowException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzhDecoder.h",
    "content": "// LzhDecoder.h\n\n#ifndef __COMPRESS_LZH_DECODER_H\n#define __COMPRESS_LZH_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitmDecoder.h\"\n#include \"HuffmanDecoder.h\"\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NLzh {\nnamespace NDecoder {\n\nconst int kMaxHuffmanLen = 16; // Check it\n\nconst int kNumSpecLevelSymbols = 3;\nconst int kNumLevelSymbols = kNumSpecLevelSymbols + kMaxHuffmanLen;\n\nconst int kDictBitsMax = 16;\nconst int kNumDistanceSymbols = kDictBitsMax + 1;\n\nconst int kMaxMatch = 256;\nconst int kMinMatch = 3;\nconst int kNumCSymbols = 256 + kMaxMatch + 2 - kMinMatch;\n\ntemplate <UInt32 m_NumSymbols>\nclass CHuffmanDecoder:public NCompress::NHuffman::CDecoder<kMaxHuffmanLen, m_NumSymbols>\n{\npublic:\n  int Symbol;\n  template <class TBitDecoder>\n  UInt32 Decode(TBitDecoder *bitStream)\n  {\n    if (Symbol >= 0)\n      return (UInt32)Symbol;\n    return DecodeSymbol(bitStream);\n  }\n};\n\nclass CCoder :\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  CLzOutWindow m_OutWindowStream;\n  NBitm::CDecoder<CInBuffer> m_InBitStream;\n\n  int m_NumDictBits;\n\n  CHuffmanDecoder<kNumLevelSymbols> m_LevelHuffman;\n  CHuffmanDecoder<kNumDistanceSymbols> m_PHuffmanDecoder;\n  CHuffmanDecoder<kNumCSymbols> m_CHuffmanDecoder;\n\n  void ReleaseStreams()\n  {\n    m_OutWindowStream.ReleaseStream();\n    m_InBitStream.ReleaseStream();\n  }\n\n  class CCoderReleaser\n  {\n    CCoder *m_Coder;\n  public:\n    bool NeedFlush;\n    CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}\n    ~CCoderReleaser()\n    {\n      if (NeedFlush)\n        m_Coder->m_OutWindowStream.Flush();\n      m_Coder->ReleaseStreams();\n    }\n  };\n  friend class CCoderReleaser;\n\n  void MakeTable(int nchar, Byte *bitlen, int tablebits,\n      UInt32 *table, int tablesize);\n  \n  UInt32 ReadBits(int numBits);\n  HRESULT ReadLevelTable();\n  HRESULT ReadPTable(int numBits);\n  HRESULT ReadCTable();\n\npublic:\n  \n  MY_UNKNOWN_IMP\n\n  STDMETHOD(CodeReal)(ISequentialInStream *inStream,\n      ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,\n      ICompressProgressInfo *progress);\n\n  STDMETHOD(Code)(ISequentialInStream *inStream,\n      ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,\n      ICompressProgressInfo *progress);\n\n  void SetDictionary(int numDictBits) { m_NumDictBits = numDictBits; }\n  CCoder(): m_NumDictBits(0) {}\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzmaDecoder.cpp",
    "content": "// LzmaDecoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"LzmaDecoder.h\"\n\nstatic HRESULT SResToHRESULT(SRes res)\n{\n  switch(res)\n  {\n    case SZ_OK: return S_OK;\n    case SZ_ERROR_MEM: return E_OUTOFMEMORY;\n    case SZ_ERROR_PARAM: return E_INVALIDARG;\n    case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;\n    // case SZ_ERROR_PROGRESS: return E_ABORT;\n    case SZ_ERROR_DATA: return S_FALSE;\n  }\n  return E_FAIL;\n}\n\nnamespace NCompress {\nnamespace NLzma {\n\nstatic const UInt32 kInBufSize = 1 << 20;\n\nCDecoder::CDecoder(): _inBuf(0), _outSizeDefined(false), FinishStream(false)\n{\n  LzmaDec_Construct(&_state);\n}\n\nstatic void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }\nstatic void SzFree(void *p, void *address) { p = p; MyFree(address); }\nstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };\n\nCDecoder::~CDecoder()\n{\n  LzmaDec_Free(&_state, &g_Alloc);\n  MyFree(_inBuf);\n}\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *prop, UInt32 size)\n{\n  RINOK(SResToHRESULT(LzmaDec_Allocate(&_state, prop, size, &g_Alloc)));\n\n  if (_inBuf == 0)\n  {\n    _inBuf = (Byte *)MyAlloc(kInBufSize);\n    if (_inBuf == 0)\n      return E_OUTOFMEMORY;\n  }\n\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value) { *value = _inSizeProcessed; return S_OK; }\nSTDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { _inStream = inStream; return S_OK; }\nSTDMETHODIMP CDecoder::ReleaseInStream() { _inStream.Release(); return S_OK; }\n\nSTDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)\n{\n  _outSizeDefined = (outSize != NULL);\n  if (_outSizeDefined)\n    _outSize = *outSize;\n\n  LzmaDec_Init(&_state);\n  \n  _inPos = _inSize = 0;\n  _inSizeProcessed = _outSizeProcessed = 0;\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  if (_inBuf == 0)\n    return S_FALSE;\n  SetOutStreamSize(outSize);\n\n  for (;;)\n  {\n    if (_inPos == _inSize)\n    {\n      _inPos = _inSize = 0;\n      RINOK(inStream->Read(_inBuf, kInBufSize, &_inSize));\n    }\n\n    SizeT dicPos = _state.dicPos;\n    SizeT curSize = _state.dicBufSize - dicPos;\n    const UInt32 kStepSize = ((UInt32)1 << 22);\n    if (curSize > kStepSize)\n      curSize = (SizeT)kStepSize;\n    \n    ELzmaFinishMode finishMode = LZMA_FINISH_ANY;\n    if (_outSizeDefined)\n    {\n      const UInt64 rem = _outSize - _outSizeProcessed;\n      if (rem < curSize)\n      {\n        curSize = (SizeT)rem;\n        if (FinishStream)\n          finishMode = LZMA_FINISH_END;\n      }\n    }\n\n    SizeT inSizeProcessed = _inSize - _inPos;\n    ELzmaStatus status;\n    SRes res = LzmaDec_DecodeToDic(&_state, dicPos + curSize, _inBuf + _inPos, &inSizeProcessed, finishMode, &status);\n\n    _inPos += (UInt32)inSizeProcessed;\n    _inSizeProcessed += inSizeProcessed;\n    SizeT outSizeProcessed = _state.dicPos - dicPos;\n    _outSizeProcessed += outSizeProcessed;\n\n    bool finished = (inSizeProcessed == 0 && outSizeProcessed == 0);\n    bool stopDecoding = (_outSizeDefined && _outSizeProcessed >= _outSize);\n\n    if (res != 0 || _state.dicPos == _state.dicBufSize || finished || stopDecoding)\n    {\n      HRESULT res2 = WriteStream(outStream, _state.dic, _state.dicPos);\n      if (res != 0)\n        return S_FALSE;\n      RINOK(res2);\n      if (stopDecoding)\n        return S_OK;\n      if (finished)\n        return (status == LZMA_STATUS_FINISHED_WITH_MARK ? S_OK : S_FALSE);\n    }\n    if (_state.dicPos == _state.dicBufSize)\n      _state.dicPos = 0;\n\n    if (progress != NULL)\n    {\n      RINOK(progress->SetRatioInfo(&_inSizeProcessed, &_outSizeProcessed));\n    }\n  }\n}\n\n#ifndef NO_READ_FROM_CODER\n\nSTDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  if (processedSize)\n    *processedSize = 0;\n  do\n  {\n    if (_inPos == _inSize)\n    {\n      _inPos = _inSize = 0;\n      RINOK(_inStream->Read(_inBuf, kInBufSize, &_inSize));\n    }\n    {\n      SizeT inProcessed = _inSize - _inPos;\n\n      if (_outSizeDefined)\n      {\n        const UInt64 rem = _outSize - _outSizeProcessed;\n        if (rem < size)\n          size = (UInt32)rem;\n      }\n\n      SizeT outProcessed = size;\n      ELzmaStatus status;\n      SRes res = LzmaDec_DecodeToBuf(&_state, (Byte *)data, &outProcessed,\n          _inBuf + _inPos, &inProcessed, LZMA_FINISH_ANY, &status);\n      _inPos += (UInt32)inProcessed;\n      _inSizeProcessed += inProcessed;\n      _outSizeProcessed += outProcessed;\n      size -= (UInt32)outProcessed;\n      data = (Byte *)data + outProcessed;\n      if (processedSize)\n        *processedSize += (UInt32)outProcessed;\n      RINOK(SResToHRESULT(res));\n      if (inProcessed == 0 && outProcessed == 0)\n        return S_OK;\n    }\n  }\n  while (size != 0);\n  return S_OK;\n}\n\n#endif\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzmaDecoder.h",
    "content": "// LzmaDecoder.h\n\n#ifndef __LZMA_DECODER_H\n#define __LZMA_DECODER_H\n\nextern \"C\"\n{\n#include \"../../../C/LzmaDec.h\"\n}\n\n#include \"../../Common/MyCom.h\"\n#include \"../ICoder.h\"\n\nnamespace NCompress {\nnamespace NLzma {\n\nclass CDecoder:\n  public ICompressCoder,\n  public ICompressSetDecoderProperties2,\n  public ICompressGetInStreamProcessedSize,\n  #ifndef NO_READ_FROM_CODER\n  public ICompressSetInStream,\n  public ICompressSetOutStreamSize,\n  public ISequentialInStream,\n  #endif\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialInStream> _inStream;\n  Byte *_inBuf;\n  UInt32 _inPos;\n  UInt32 _inSize;\n  CLzmaDec _state;\n  bool _outSizeDefined;\n  UInt64 _outSize;\n  UInt64 _inSizeProcessed;\n  UInt64 _outSizeProcessed;\npublic:\n\n  #ifndef NO_READ_FROM_CODER\n  MY_UNKNOWN_IMP5(\n      ICompressSetDecoderProperties2,\n      ICompressGetInStreamProcessedSize,\n      ICompressSetInStream,\n      ICompressSetOutStreamSize,\n      ISequentialInStream)\n  #else\n  MY_UNKNOWN_IMP2(\n      ICompressSetDecoderProperties2,\n      ICompressGetInStreamProcessedSize)\n  #endif\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);\n  STDMETHOD(SetInStream)(ISequentialInStream *inStream);\n  STDMETHOD(ReleaseInStream)();\n  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);\n\n  #ifndef NO_READ_FROM_CODER\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  #endif\n\n  bool FinishStream;\n\n  CDecoder();\n  virtual ~CDecoder();\n\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzmaEncoder.cpp",
    "content": "// LzmaEncoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"LzmaEncoder.h\"\n\nstatic HRESULT SResToHRESULT(SRes res)\n{\n  switch(res)\n  {\n    case SZ_OK: return S_OK;\n    case SZ_ERROR_MEM: return E_OUTOFMEMORY;\n    case SZ_ERROR_PARAM: return E_INVALIDARG;\n    // case SZ_ERROR_THREAD: return E_FAIL;\n  }\n  return E_FAIL;\n}\n\nnamespace NCompress {\nnamespace NLzma {\n\nstatic const UInt32 kStreamStepSize = (UInt32)1 << 31;\n\nstatic SRes MyRead(void *object, void *data, size_t *size)\n{\n  UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize);\n  HRESULT res = ((CSeqInStream *)object)->RealStream->Read(data, curSize, &curSize);\n  *size = curSize;\n  return (SRes)res;\n}\n\nstatic size_t MyWrite(void *object, const void *data, size_t size)\n{\n  CSeqOutStream *p = (CSeqOutStream *)object;\n  p->Res = WriteStream(p->RealStream, data, size);\n  if (p->Res != 0)\n    return 0;\n  return size;\n}\n\nstatic void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }\nstatic void SzBigFree(void *, void *address) { BigFree(address); }\nstatic ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };\n\nstatic void *SzAlloc(void *, size_t size) { return MyAlloc(size); }\nstatic void SzFree(void *, void *address) { MyFree(address); }\nstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };\n\nCEncoder::CEncoder()\n{\n  _seqInStream.SeqInStream.Read = MyRead;\n  _seqOutStream.SeqOutStream.Write = MyWrite;\n  _encoder = 0;\n  _encoder = LzmaEnc_Create(&g_Alloc);\n\n}\n\nCEncoder::~CEncoder()\n{\n  if (_encoder != 0)\n    LzmaEnc_Destroy(_encoder, &g_Alloc, &g_BigAlloc);\n}\n\ninline wchar_t GetUpperChar(wchar_t c)\n{\n  if (c >= 'a' && c <= 'z')\n    c -= 0x20;\n  return c;\n}\n\nstatic int ParseMatchFinder(const wchar_t *s, int *btMode, int *numHashBytes)\n{\n  wchar_t c = GetUpperChar(*s++);\n  if (c == L'H')\n  {\n    if (GetUpperChar(*s++) != L'C')\n      return 0;\n    int numHashBytesLoc = (int)(*s++ - L'0');\n    if (numHashBytesLoc < 4 || numHashBytesLoc > 4)\n      return 0;\n    if (*s++ != 0)\n      return 0;\n    *btMode = 0;\n    *numHashBytes = numHashBytesLoc;\n    return 1;\n  }\n  if (c != L'B')\n    return 0;\n\n  if (GetUpperChar(*s++) != L'T')\n    return 0;\n  int numHashBytesLoc = (int)(*s++ - L'0');\n  if (numHashBytesLoc < 2 || numHashBytesLoc > 4)\n    return 0;\n  c = GetUpperChar(*s++);\n  if (c != L'\\0')\n    return 0;\n  *btMode = 1;\n  *numHashBytes = numHashBytesLoc;\n  return 1;\n}\n\nSTDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,\n    const PROPVARIANT *coderProps, UInt32 numProps)\n{\n  CLzmaEncProps props;\n  LzmaEncProps_Init(&props);\n\n  for (UInt32 i = 0; i < numProps; i++)\n  {\n    const PROPVARIANT &prop = coderProps[i];\n    switch (propIDs[i])\n    {\n      case NCoderPropID::kNumFastBytes:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.fb = prop.ulVal; break;\n      case NCoderPropID::kMatchFinderCycles:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.mc = prop.ulVal; break;\n      case NCoderPropID::kAlgorithm:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.algo = prop.ulVal; break;\n      case NCoderPropID::kDictionarySize:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.dictSize = prop.ulVal; break;\n      case NCoderPropID::kPosStateBits:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.pb = prop.ulVal; break;\n      case NCoderPropID::kLitPosBits:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.lp = prop.ulVal; break;\n      case NCoderPropID::kLitContextBits:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.lc = prop.ulVal; break;\n      case NCoderPropID::kNumThreads:\n        if (prop.vt != VT_UI4) return E_INVALIDARG; props.numThreads = prop.ulVal; break;\n      case NCoderPropID::kMultiThread:\n        if (prop.vt != VT_BOOL) return E_INVALIDARG; props.numThreads = ((prop.boolVal == VARIANT_TRUE) ? 2 : 1); break;\n      case NCoderPropID::kEndMarker:\n        if (prop.vt != VT_BOOL) return E_INVALIDARG; props.writeEndMark = (prop.boolVal == VARIANT_TRUE); break;\n      case NCoderPropID::kMatchFinder:\n        if (prop.vt != VT_BSTR) return E_INVALIDARG;\n        if (!ParseMatchFinder(prop.bstrVal, &props.btMode, &props.numHashBytes /* , &_matchFinderBase.skipModeBits */))\n          return E_INVALIDARG; break;\n      default:\n        return E_INVALIDARG;\n    }\n  }\n  return SResToHRESULT(LzmaEnc_SetProps(_encoder, &props));\n}\n\nSTDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)\n{\n  Byte props[LZMA_PROPS_SIZE];\n  size_t size = LZMA_PROPS_SIZE;\n  RINOK(LzmaEnc_WriteProperties(_encoder, props, &size));\n  return WriteStream(outStream, props, size);\n}\n\nSTDMETHODIMP CEncoder::SetOutStream(ISequentialOutStream *outStream)\n{\n  _seqOutStream.RealStream = outStream;\n  _seqOutStream.Res = S_OK;\n  return S_OK;\n}\n\nSTDMETHODIMP CEncoder::ReleaseOutStream()\n{\n  _seqOutStream.RealStream.Release();\n  return S_OK;\n}\n\ntypedef struct _CCompressProgressImp\n{\n  ICompressProgress p;\n  ICompressProgressInfo *Progress;\n  HRESULT Res;\n} CCompressProgressImp;\n\n#define PROGRESS_UNKNOWN_VALUE ((UInt64)(Int64)-1)\n\n#define CONVERT_PR_VAL(x) (x == PROGRESS_UNKNOWN_VALUE ? NULL : &x)\n\nSRes CompressProgress(void *pp, UInt64 inSize, UInt64 outSize)\n{\n  CCompressProgressImp *p = (CCompressProgressImp *)pp;\n  p->Res = p->Progress->SetRatioInfo(CONVERT_PR_VAL(inSize), CONVERT_PR_VAL(outSize));\n  return (SRes)p->Res;\n}\n\nSTDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)\n{\n  CCompressProgressImp progressImp;\n  progressImp.p.Progress = CompressProgress;\n  progressImp.Progress = progress;\n  progressImp.Res = SZ_OK;\n\n  _seqInStream.RealStream = inStream;\n  SetOutStream(outStream);\n  SRes res = LzmaEnc_Encode(_encoder, &_seqOutStream.SeqOutStream, &_seqInStream.SeqInStream, progress ? &progressImp.p : NULL, &g_Alloc, &g_BigAlloc);\n  ReleaseOutStream();\n  if (res == SZ_ERROR_WRITE && _seqOutStream.Res != S_OK)\n    return _seqOutStream.Res;\n  if (res == SZ_ERROR_PROGRESS && progressImp.Res != S_OK)\n    return progressImp.Res;\n  return SResToHRESULT(res);\n}\n  \n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzmaEncoder.h",
    "content": "// LzmaEncoder.h\n\n#ifndef __LZMA_ENCODER_H\n#define __LZMA_ENCODER_H\n\nextern \"C\"\n{\n#include \"../../../C/LzmaEnc.h\"\n}\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\nnamespace NCompress {\nnamespace NLzma {\n\nstruct CSeqInStream\n{\n  ISeqInStream SeqInStream;\n  ISequentialInStream *RealStream;\n};\n\nstruct CSeqOutStream\n{\n  ISeqOutStream SeqOutStream;\n  CMyComPtr<ISequentialOutStream> RealStream;\n  HRESULT Res;\n};\n\nclass CEncoder :\n  public ICompressCoder,\n  public ICompressSetOutStream,\n  public ICompressSetCoderProperties,\n  public ICompressWriteCoderProperties,\n  public CMyUnknownImp\n{\n  CLzmaEncHandle _encoder;\n \n  CSeqInStream _seqInStream;\n  CSeqOutStream _seqOutStream;\n\npublic:\n  CEncoder();\n\n  MY_UNKNOWN_IMP3(\n      ICompressSetOutStream,\n      ICompressSetCoderProperties,\n      ICompressWriteCoderProperties\n      )\n    \n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);\n  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);\n  STDMETHOD(SetOutStream)(ISequentialOutStream *outStream);\n  STDMETHOD(ReleaseOutStream)();\n\n  virtual ~CEncoder();\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzmaRegister.cpp",
    "content": "// LzmaRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"LzmaDecoder.h\"\n\nstatic void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NLzma::CDecoder); }\n#ifndef EXTRACT_ONLY\n#include \"LzmaEncoder.h\"\nstatic void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NLzma::CEncoder);  }\n#else\n#define CreateCodecOut 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodec, CreateCodecOut, 0x030101, L\"LZMA\", 1, false };\n\nvoid RegisterLzma()\n{\n\tRegisterCodec(&g_CodecInfo);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Lzx.h",
    "content": "// Lzx.h\n\n#ifndef __COMPRESS_LZX_H\n#define __COMPRESS_LZX_H\n\nnamespace NCompress {\nnamespace NLzx {\n\nconst int kNumHuffmanBits = 16;\nconst UInt32 kNumRepDistances = 3;\n\nconst UInt32 kNumLenSlots = 8;\nconst UInt32 kMatchMinLen = 2;\nconst UInt32 kNumLenSymbols = 249;\nconst UInt32 kMatchMaxLen = kMatchMinLen + (kNumLenSlots - 1) + kNumLenSymbols - 1;\n\nconst int kNumAlignBits = 3;\nconst UInt32 kAlignTableSize = 1 << kNumAlignBits;\n\nconst UInt32 kNumPosSlots = 50;\nconst UInt32 kNumPosLenSlots = kNumPosSlots * kNumLenSlots;\n\nconst UInt32 kMainTableSize = 256 + kNumPosLenSlots;\nconst UInt32 kLevelTableSize = 20;\nconst UInt32 kMaxTableSize = kMainTableSize;\n\nconst int kNumBlockTypeBits = 3;\nconst int kBlockTypeVerbatim = 1;\nconst int kBlockTypeAligned = 2;\nconst int kBlockTypeUncompressed = 3;\n\nconst int kUncompressedBlockSizeNumBits = 24;\n\nconst int kNumBitsForPreTreeLevel = 4;\n\nconst int kLevelSymbolZeros = 17;\nconst int kLevelSymbolZerosBig = 18;\nconst int kLevelSymbolSame = 19;\n\nconst int kLevelSymbolZerosStartValue = 4;\nconst int kLevelSymbolZerosNumBits = 4;\n\nconst int kLevelSymbolZerosBigStartValue = kLevelSymbolZerosStartValue +\n    (1 << kLevelSymbolZerosNumBits);\nconst int kLevelSymbolZerosBigNumBits = 5;\n\nconst int kLevelSymbolSameNumBits = 1;\nconst int kLevelSymbolSameStartValue = 4;\n\nconst int kNumBitsForAlignLevel = 3;\n  \nconst int kNumDictionaryBitsMin = 15;\nconst int kNumDictionaryBitsMax = 21;\nconst UInt32 kDictionarySizeMax = (1 << kNumDictionaryBitsMax);\n\nconst int kNumLinearPosSlotBits = 17;\nconst UInt32 kNumPowerPosSlots = 0x26;\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Lzx86Converter.cpp",
    "content": "// Lzx86Converter.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/Defs.h\"\n\n#include \"Lzx86Converter.h\"\n\nnamespace NCompress {\nnamespace NLzx {\n\nstatic const int kResidue = 6 + 4;\n\nvoid Cx86ConvertOutStream::MakeTranslation()\n{\n  if (m_Pos <= kResidue)\n    return;\n  UInt32 numBytes = m_Pos - kResidue;\n  Byte *buffer = m_Buffer;\n  for (UInt32 i = 0; i < numBytes;)\n  {\n    if (buffer[i++] == 0xE8)\n    {\n      Int32 absValue = 0;\n      int j;\n      for(j = 0; j < 4; j++)\n        absValue += (UInt32)buffer[i + j] << (j * 8);\n      Int32 pos = (Int32)(m_ProcessedSize + i - 1);\n      if (absValue >= -pos && absValue < (Int32)m_TranslationSize)\n      {\n        UInt32 offset = (absValue >= 0) ?\n            absValue - pos :\n            absValue + m_TranslationSize;\n        for(j = 0; j < 4; j++)\n        {\n          buffer[i + j] = (Byte)(offset & 0xFF);\n          offset >>= 8;\n        }\n      }\n      i += 4;\n    }\n  }\n}\n\nSTDMETHODIMP Cx86ConvertOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  if (processedSize != NULL)\n    *processedSize = 0;\n  if (!m_TranslationMode)\n    return m_Stream->Write(data, size, processedSize);\n  UInt32 realProcessedSize = 0;\n  while (realProcessedSize < size)\n  {\n    UInt32 writeSize = MyMin(size - realProcessedSize, kUncompressedBlockSize - m_Pos);\n    memmove(m_Buffer + m_Pos, (const Byte *)data + realProcessedSize, writeSize);\n    m_Pos += writeSize;\n    realProcessedSize += writeSize;\n    if (m_Pos == kUncompressedBlockSize)\n    {\n      RINOK(Flush());\n    }\n  }\n  if (processedSize != NULL)\n    *processedSize = realProcessedSize;\n  return S_OK;\n}\n\nHRESULT Cx86ConvertOutStream::Flush()\n{\n  if (m_Pos == 0)\n    return S_OK;\n  if (m_TranslationMode)\n    MakeTranslation();\n  UInt32 pos = 0;\n  do\n  {\n    UInt32 processed;\n    RINOK(m_Stream->Write(m_Buffer + pos, m_Pos - pos, &processed));\n    if (processed == 0)\n      return E_FAIL;\n    pos += processed;\n  }\n  while(pos < m_Pos);\n  m_ProcessedSize += m_Pos;\n  m_Pos = 0;\n  m_TranslationMode = (m_TranslationMode && (m_ProcessedSize < (1 << 30)));\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Lzx86Converter.h",
    "content": "// Lzx86Converter.h\n\n#ifndef __LZX_86_CONVERTER_H\n#define __LZX_86_CONVERTER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../IStream.h\"\n\nnamespace NCompress {\nnamespace NLzx {\n\nconst int kUncompressedBlockSize = 1 << 15;\n\nclass Cx86ConvertOutStream:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialOutStream> m_Stream;\n  UInt32 m_ProcessedSize;\n  UInt32 m_Pos;\n  UInt32 m_TranslationSize;\n  bool m_TranslationMode;\n  Byte m_Buffer[kUncompressedBlockSize];\n\n  void MakeTranslation();\npublic:\n  void SetStream(ISequentialOutStream *outStream) { m_Stream = outStream; }\n  void ReleaseStream() { m_Stream.Release(); }\n  void Init(bool translationMode, UInt32 translationSize)\n  {\n    m_TranslationMode = translationMode;\n    m_TranslationSize = translationSize;\n    m_ProcessedSize = 0;\n    m_Pos = 0;\n  }\n  HRESULT Flush();\n\n  MY_UNKNOWN_IMP\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzxDecoder.cpp",
    "content": "// LzxDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/Defs.h\"\n\n#include \"LzxDecoder.h\"\n\nnamespace NCompress {\nnamespace NLzx {\n\nconst int kLenIdNeedInit = -2;\n\nCDecoder::CDecoder(bool wimMode):\n  _keepHistory(false),\n  _skipByte(false),\n  _wimMode(wimMode)\n{\n  m_x86ConvertOutStreamSpec = new Cx86ConvertOutStream;\n  m_x86ConvertOutStream = m_x86ConvertOutStreamSpec;\n}\n\nvoid CDecoder::ReleaseStreams()\n{\n  m_OutWindowStream.ReleaseStream();\n  m_InBitStream.ReleaseStream();\n  m_x86ConvertOutStreamSpec->ReleaseStream();\n}\n\nSTDMETHODIMP CDecoder::Flush()\n{\n  RINOK(m_OutWindowStream.Flush());\n  return m_x86ConvertOutStreamSpec->Flush();\n}\n\nUInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }\n\n#define RIF(x) { if (!(x)) return false; }\n\nbool CDecoder::ReadTable(Byte *lastLevels, Byte *newLevels, UInt32 numSymbols)\n{\n  Byte levelLevels[kLevelTableSize];\n  UInt32 i;\n  for (i = 0; i < kLevelTableSize; i++)\n    levelLevels[i] = (Byte)ReadBits(kNumBitsForPreTreeLevel);\n  RIF(m_LevelDecoder.SetCodeLengths(levelLevels));\n  int num = 0;\n  Byte symbol = 0;\n  for (i = 0; i < numSymbols;)\n  {\n    if (num != 0)\n    {\n      lastLevels[i] = newLevels[i] = symbol;\n      i++;\n      num--;\n      continue;\n    }\n    UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);\n    if (number == kLevelSymbolZeros)\n    {\n      num = kLevelSymbolZerosStartValue + (int)ReadBits(kLevelSymbolZerosNumBits);\n      symbol = 0;\n    }\n    else if (number == kLevelSymbolZerosBig)\n    {\n      num = kLevelSymbolZerosBigStartValue + (int)ReadBits(kLevelSymbolZerosBigNumBits);\n      symbol = 0;\n    }\n    else if (number == kLevelSymbolSame || number <= kNumHuffmanBits)\n    {\n      if (number <= kNumHuffmanBits)\n        num = 1;\n      else\n      {\n        num = kLevelSymbolSameStartValue + (int)ReadBits(kLevelSymbolSameNumBits);\n        number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);\n        if (number > kNumHuffmanBits)\n          return false;\n      }\n      symbol = Byte((17 + lastLevels[i] - number) % (kNumHuffmanBits + 1));\n    }\n    else\n      return false;\n  }\n  return true;\n}\n\nbool CDecoder::ReadTables(void)\n{\n  Byte newLevels[kMaxTableSize];\n  {\n    if (_skipByte)\n      m_InBitStream.DirectReadByte();\n    m_InBitStream.Normalize();\n\n    int blockType = (int)ReadBits(kNumBlockTypeBits);\n    if (blockType > kBlockTypeUncompressed)\n      return false;\n    if (_wimMode)\n      if (ReadBits(1) == 1)\n        m_UnCompressedBlockSize = (1 << 15);\n      else\n        m_UnCompressedBlockSize = ReadBits(16);\n    else\n      m_UnCompressedBlockSize = m_InBitStream.ReadBitsBig(kUncompressedBlockSizeNumBits);\n\n    m_IsUncompressedBlock = (blockType == kBlockTypeUncompressed);\n\n    _skipByte = (m_IsUncompressedBlock && ((m_UnCompressedBlockSize & 1) != 0));\n\n    if (m_IsUncompressedBlock)\n    {\n      ReadBits(16 - m_InBitStream.GetBitPosition());\n      if (!m_InBitStream.ReadUInt32(m_RepDistances[0]))\n        return false;\n      m_RepDistances[0]--;\n      for (int i = 1; i < kNumRepDistances; i++)\n      {\n        UInt32 rep = 0;\n        for (int j = 0; j < 4; j++)\n          rep |= (UInt32)m_InBitStream.DirectReadByte() << (8 * j);\n        m_RepDistances[i] = rep - 1;\n      }\n      return true;\n    }\n    m_AlignIsUsed = (blockType == kBlockTypeAligned);\n    if (m_AlignIsUsed)\n    {\n      for(int i = 0; i < kAlignTableSize; i++)\n        newLevels[i] = (Byte)ReadBits(kNumBitsForAlignLevel);\n      RIF(m_AlignDecoder.SetCodeLengths(newLevels));\n    }\n  }\n\n  RIF(ReadTable(m_LastMainLevels, newLevels, 256));\n  RIF(ReadTable(m_LastMainLevels + 256, newLevels + 256, m_NumPosLenSlots));\n  for (UInt32 i = 256 + m_NumPosLenSlots; i < kMainTableSize; i++)\n    newLevels[i] = 0;\n  RIF(m_MainDecoder.SetCodeLengths(newLevels));\n\n  RIF(ReadTable(m_LastLenLevels, newLevels, kNumLenSymbols));\n  return m_LenDecoder.SetCodeLengths(newLevels);\n}\n\nclass CDecoderFlusher\n{\n  CDecoder *m_Decoder;\npublic:\n  bool NeedFlush;\n  CDecoderFlusher(CDecoder *decoder): m_Decoder(decoder), NeedFlush(true) {}\n  ~CDecoderFlusher()\n  {\n    if (NeedFlush)\n      m_Decoder->Flush();\n    m_Decoder->ReleaseStreams();\n  }\n};\n\n\nvoid CDecoder::ClearPrevLevels()\n{\n  int i;\n  for (i = 0; i < kMainTableSize; i++)\n    m_LastMainLevels[i] = 0;\n  for (i = 0; i < kNumLenSymbols; i++)\n    m_LastLenLevels[i] = 0;\n};\n\n\nHRESULT CDecoder::CodeSpec(UInt32 curSize)\n{\n  if (_remainLen == kLenIdNeedInit)\n  {\n    _remainLen = 0;\n    m_InBitStream.Init();\n    if (!_keepHistory || !m_IsUncompressedBlock)\n      m_InBitStream.Normalize();\n    if (!_keepHistory)\n    {\n      _skipByte = false;\n      m_UnCompressedBlockSize = 0;\n      ClearPrevLevels();\n      UInt32 i86TranslationSize = 12000000;\n      bool translationMode = true;\n      if (!_wimMode)\n      {\n        translationMode = (ReadBits(1) != 0);\n        if (translationMode)\n        {\n          i86TranslationSize = ReadBits(16) << 16;\n          i86TranslationSize |= ReadBits(16);\n        }\n      }\n      m_x86ConvertOutStreamSpec->Init(translationMode, i86TranslationSize);\n      \n      for(int i = 0 ; i < kNumRepDistances; i++)\n        m_RepDistances[i] = 0;\n    }\n  }\n\n  while(_remainLen > 0 && curSize > 0)\n  {\n    m_OutWindowStream.PutByte(m_OutWindowStream.GetByte(m_RepDistances[0]));\n    _remainLen--;\n    curSize--;\n  }\n\n  while(curSize > 0)\n  {\n    if (m_UnCompressedBlockSize == 0)\n      if (!ReadTables())\n        return S_FALSE;\n    UInt32 next = (Int32)MyMin(m_UnCompressedBlockSize, curSize);\n    curSize -= next;\n    m_UnCompressedBlockSize -= next;\n    if (m_IsUncompressedBlock)\n    {\n      while(next > 0)\n      {\n        m_OutWindowStream.PutByte(m_InBitStream.DirectReadByte());\n        next--;\n      }\n    }\n    else while(next > 0)\n    {\n      UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);\n      if (number < 256)\n      {\n        m_OutWindowStream.PutByte((Byte)number);\n        next--;\n      }\n      else\n      {\n        UInt32 posLenSlot = number - 256;\n        if (posLenSlot >= m_NumPosLenSlots)\n          return S_FALSE;\n        UInt32 posSlot = posLenSlot / kNumLenSlots;\n        UInt32 lenSlot = posLenSlot % kNumLenSlots;\n        UInt32 len = kMatchMinLen + lenSlot;\n        if (lenSlot == kNumLenSlots - 1)\n        {\n          UInt32 lenTemp = m_LenDecoder.DecodeSymbol(&m_InBitStream);\n          if (lenTemp >= kNumLenSymbols)\n            return S_FALSE;\n          len += lenTemp;\n        }\n        \n        if (posSlot < kNumRepDistances)\n        {\n          UInt32 distance = m_RepDistances[posSlot];\n          m_RepDistances[posSlot] = m_RepDistances[0];\n          m_RepDistances[0] = distance;\n        }\n        else\n        {\n          UInt32 distance;\n          int numDirectBits;\n          if (posSlot < kNumPowerPosSlots)\n          {\n            numDirectBits = (int)(posSlot >> 1) - 1;\n            distance = ((2 | (posSlot & 1)) << numDirectBits);\n          }\n          else\n          {\n            numDirectBits = kNumLinearPosSlotBits;\n            distance = ((posSlot - 0x22) << kNumLinearPosSlotBits);\n          }\n\n          if (m_AlignIsUsed && numDirectBits >= kNumAlignBits)\n          {\n            distance += (m_InBitStream.ReadBits(numDirectBits - kNumAlignBits) << kNumAlignBits);\n            UInt32 alignTemp = m_AlignDecoder.DecodeSymbol(&m_InBitStream);\n            if (alignTemp >= kAlignTableSize)\n              return S_FALSE;\n            distance += alignTemp;\n          }\n          else\n            distance += m_InBitStream.ReadBits(numDirectBits);\n          m_RepDistances[2] = m_RepDistances[1];\n          m_RepDistances[1] = m_RepDistances[0];\n          m_RepDistances[0] = distance - kNumRepDistances;\n        }\n\n        UInt32 locLen = len;\n        if (locLen > next)\n          locLen = next;\n\n        if (!m_OutWindowStream.CopyBlock(m_RepDistances[0], locLen))\n          return S_FALSE;\n\n        len -= locLen;\n        next -= locLen;\n        if (len != 0)\n        {\n          _remainLen = (int)len;\n          return S_OK;\n        }\n      }\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  if (outSize == NULL)\n    return E_INVALIDARG;\n  UInt64 size = *outSize;\n\n  RINOK(SetInStream(inStream));\n  m_x86ConvertOutStreamSpec->SetStream(outStream);\n  m_OutWindowStream.SetStream(m_x86ConvertOutStream);\n  RINOK(SetOutStreamSize(outSize));\n\n  CDecoderFlusher flusher(this);\n\n  const UInt64 start = m_OutWindowStream.GetProcessedSize();\n  for (;;)\n  {\n    UInt32 curSize = 1 << 18;\n    UInt64 rem = size - (m_OutWindowStream.GetProcessedSize() - start);\n    if (curSize > rem)\n      curSize = (UInt32)rem;\n    if (curSize == 0)\n      break;\n    RINOK(CodeSpec(curSize));\n    if (progress != NULL)\n    {\n      UInt64 inSize = m_InBitStream.GetProcessedSize();\n      UInt64 nowPos64 = m_OutWindowStream.GetProcessedSize() - start;\n      RINOK(progress->SetRatioInfo(&inSize, &nowPos64));\n    }\n  }\n  flusher.NeedFlush = false;\n  return Flush();\n}\n\nHRESULT CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  try { return CodeReal(inStream, outStream, inSize, outSize, progress); }\n  catch(const CLzOutWindowException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\nSTDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)\n{\n  m_InBitStream.SetStream(inStream);\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::ReleaseInStream()\n{\n  m_InBitStream.ReleaseStream();\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)\n{\n  if (outSize == NULL)\n    return E_FAIL;\n  _remainLen = kLenIdNeedInit;\n  m_OutWindowStream.Init(_keepHistory);\n  return S_OK;\n}\n\nHRESULT CDecoder::SetParams(int numDictBits)\n{\n  if (numDictBits < kNumDictionaryBitsMin || numDictBits > kNumDictionaryBitsMax)\n    return E_INVALIDARG;\n  UInt32 numPosSlots;\n  if (numDictBits < 20)\n    numPosSlots = 30 + (numDictBits - 15) * 2;\n  else if (numDictBits == 20)\n    numPosSlots = 42;\n  else\n    numPosSlots = 50;\n  m_NumPosLenSlots = numPosSlots * kNumLenSlots;\n  if (!m_OutWindowStream.Create(kDictionarySizeMax))\n    return E_OUTOFMEMORY;\n  if (!m_InBitStream.Create(1 << 16))\n    return E_OUTOFMEMORY;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/LzxDecoder.h",
    "content": "// LzxDecoder.h\n\n#ifndef __LZX_DECODER_H\n#define __LZX_DECODER_H\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"HuffmanDecoder.h\"\n#include \"LzOutWindow.h\"\n#include \"Lzx.h\"\n#include \"Lzx86Converter.h\"\n\nnamespace NCompress {\nnamespace NLzx {\n\nnamespace NBitStream {\n\nconst int kNumBigValueBits = 8 * 4;\nconst int kNumValueBits = 17;\nconst UInt32 kBitDecoderValueMask = (1 << kNumValueBits) - 1;\n\nclass CDecoder\n{\n  CInBuffer m_Stream;\n  UInt32 m_Value;\n  int m_BitPos;\npublic:\n  CDecoder() {}\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n\n  void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }\n  void ReleaseStream() { m_Stream.ReleaseStream(); }\n\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = kNumBigValueBits;\n  }\n\n  UInt64 GetProcessedSize() const\n    { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }\n  \n  int GetBitPosition() const { return m_BitPos & 0xF; }\n\n  void Normalize()\n  {\n    for (;m_BitPos >= 16; m_BitPos -= 16)\n    {\n      Byte b0 = m_Stream.ReadByte();\n      Byte b1 = m_Stream.ReadByte();\n      m_Value = (m_Value << 8) | b1;\n      m_Value = (m_Value << 8) | b0;\n    }\n  }\n\n  UInt32 GetValue(int numBits) const\n  {\n    return ((m_Value >> ((32 - kNumValueBits) - m_BitPos)) & kBitDecoderValueMask) >>\n        (kNumValueBits - numBits);\n  }\n  \n  void MovePos(UInt32 numBits)\n  {\n    m_BitPos += (int)numBits;\n    Normalize();\n  }\n\n  UInt32 ReadBits(int numBits)\n  {\n    UInt32 res = GetValue(numBits);\n    MovePos(numBits);\n    return res;\n  }\n\n  UInt32 ReadBitsBig(int numBits)\n  {\n    int numBits0 = numBits / 2;\n    int numBits1 = numBits - numBits0;\n    UInt32 res = ReadBits(numBits0) << numBits1;\n    return res + ReadBits(numBits1);\n  }\n\n  bool ReadUInt32(UInt32 &v)\n  {\n    if (m_BitPos != 0)\n      return false;\n    v = ((m_Value >> 16) & 0xFFFF) | ((m_Value << 16) & 0xFFFF0000);\n    m_BitPos = kNumBigValueBits;\n    return true;\n  }\n\n  Byte DirectReadByte() { return m_Stream.ReadByte(); }\n\n};\n}\n\nclass CDecoder :\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  NBitStream::CDecoder m_InBitStream;\n  CLzOutWindow m_OutWindowStream;\n\n  UInt32 m_RepDistances[kNumRepDistances];\n  UInt32 m_NumPosLenSlots;\n\n  bool m_IsUncompressedBlock;\n  bool m_AlignIsUsed;\n\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kNumLenSymbols> m_LenDecoder;\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;\n  NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;\n\n  Byte m_LastMainLevels[kMainTableSize];\n  Byte m_LastLenLevels[kNumLenSymbols];\n\n  Cx86ConvertOutStream *m_x86ConvertOutStreamSpec;\n  CMyComPtr<ISequentialOutStream> m_x86ConvertOutStream;\n\n  UInt32 m_UnCompressedBlockSize;\n\n  bool _keepHistory;\n  int _remainLen;\n  bool _skipByte;\n\n  bool _wimMode;\n\n  UInt32 ReadBits(int numBits);\n  bool ReadTable(Byte *lastLevels, Byte *newLevels, UInt32 numSymbols);\n  bool ReadTables();\n  void ClearPrevLevels();\n\n  HRESULT CodeSpec(UInt32 size);\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\npublic:\n  CDecoder(bool wimMode = false);\n\n  MY_UNKNOWN_IMP\n\n  void ReleaseStreams();\n  STDMETHOD(Flush)();\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetInStream)(ISequentialInStream *inStream);\n  STDMETHOD(ReleaseInStream)();\n  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);\n\n  HRESULT SetParams(int numDictBits);\n  void SetKeepHistory(bool keepHistory) {  _keepHistory = keepHistory; }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Mtf8.h",
    "content": "// Mtf8.h\n\n#ifndef __COMPRESS_MTF8_H\n#define __COMPRESS_MTF8_H\n\n#include \"../../Common/Types.h\"\n\nnamespace NCompress {\n\nstruct CMtf8Encoder\n{\n  Byte Buf[256];\n\n  int FindAndMove(Byte v)\n  {\n    int pos;\n    for (pos = 0; Buf[pos] != v; pos++);\n    int resPos = pos;\n    for (; pos >= 8; pos -= 8)\n    {\n      Buf[pos] = Buf[pos - 1];\n      Buf[pos - 1] = Buf[pos - 2];\n      Buf[pos - 2] = Buf[pos - 3];\n      Buf[pos - 3] = Buf[pos - 4];\n      Buf[pos - 4] = Buf[pos - 5];\n      Buf[pos - 5] = Buf[pos - 6];\n      Buf[pos - 6] = Buf[pos - 7];\n      Buf[pos - 7] = Buf[pos - 8];\n    }\n    for (; pos > 0; pos--)\n      Buf[pos] = Buf[pos - 1];\n    Buf[0] = v;\n    return resPos;\n  }\n};\n\n/*\nstruct CMtf8Decoder\n{\n  Byte Buf[256];\n\n  void Init(int) {};\n  Byte GetHead() const { return Buf[0]; }\n  Byte GetAndMove(int pos)\n  {\n    Byte res = Buf[pos];\n    for (; pos >= 8; pos -= 8)\n    {\n      Buf[pos] = Buf[pos - 1];\n      Buf[pos - 1] = Buf[pos - 2];\n      Buf[pos - 2] = Buf[pos - 3];\n      Buf[pos - 3] = Buf[pos - 4];\n      Buf[pos - 4] = Buf[pos - 5];\n      Buf[pos - 5] = Buf[pos - 6];\n      Buf[pos - 6] = Buf[pos - 7];\n      Buf[pos - 7] = Buf[pos - 8];\n    }\n    for (; pos > 0; pos--)\n      Buf[pos] = Buf[pos - 1];\n    Buf[0] = res;\n    return res;\n  }\n};\n*/\n\n#ifdef _WIN64\n#define MODE_64BIT\n#endif\n\n#ifdef MODE_64BIT\ntypedef UInt64 CMtfVar;\n#define MTF_MOVS 3\n#else\ntypedef UInt32 CMtfVar;\n#define MTF_MOVS 2\n#endif\n\n#define MTF_MASK ((1 << MTF_MOVS) - 1)\n\n\nstruct CMtf8Decoder\n{\n  CMtfVar Buf[256 >> MTF_MOVS];\n\n  void StartInit() { memset(Buf, 0, sizeof(Buf)); }\n  void Add(unsigned int pos, Byte val) { Buf[pos >> MTF_MOVS] |= ((CMtfVar)val << ((pos & MTF_MASK) << 3));  }\n  Byte GetHead() const { return (Byte)Buf[0]; }\n  Byte GetAndMove(unsigned int pos)\n  {\n    UInt32 lim = ((UInt32)pos >> MTF_MOVS);\n    pos = (pos & MTF_MASK) << 3;\n    CMtfVar prev = (Buf[lim] >> pos) & 0xFF;\n\n    UInt32 i = 0;\n    if ((lim & 1) != 0)\n    {\n      CMtfVar next = Buf[0];\n      Buf[0] = (next << 8) | prev;\n      prev = (next >> (MTF_MASK << 3));\n      i = 1;\n      lim -= 1;\n    }\n    for (; i < lim; i += 2)\n    {\n      CMtfVar next = Buf[i];\n      Buf[i] = (next << 8) | prev;\n      prev = (next >> (MTF_MASK << 3));\n      next = Buf[i + 1];\n      Buf[i + 1] = (next << 8) | prev;\n      prev = (next >> (MTF_MASK << 3));\n    }\n    CMtfVar next = Buf[i];\n    CMtfVar mask = (((CMtfVar)0x100 << pos) - 1);\n    Buf[i] = (next & ~mask) | (((next << 8) | prev) & mask);\n    return (Byte)Buf[0];\n  }\n};\n\n/*\nconst int kSmallSize = 64;\nclass CMtf8Decoder\n{\n  Byte SmallBuffer[kSmallSize];\n  int SmallSize;\n  Byte Counts[16];\n  int Size;\npublic:\n  Byte Buf[256];\n\n  Byte GetHead() const\n  {\n    if (SmallSize > 0)\n      return SmallBuffer[kSmallSize - SmallSize];\n    return Buf[0];\n  }\n\n  void Init(int size)\n  {\n    Size = size;\n    SmallSize = 0;\n    for (int i = 0; i < 16; i++)\n    {\n      Counts[i] = ((size >= 16) ? 16 : size);\n      size -= Counts[i];\n    }\n  }\n\n  Byte GetAndMove(int pos)\n  {\n    if (pos < SmallSize)\n    {\n      Byte *p = SmallBuffer + kSmallSize - SmallSize;\n      Byte res = p[pos];\n      for (; pos > 0; pos--)\n        p[pos] = p[pos - 1];\n      SmallBuffer[kSmallSize - SmallSize] = res;\n      return res;\n    }\n    if (SmallSize == kSmallSize)\n    {\n      int i = Size - 1;\n      int g = 16;\n      do\n      {\n        g--;\n        int offset = (g << 4);\n        for (int t = Counts[g] - 1; t >= 0; t--, i--)\n          Buf[i] = Buf[offset + t];\n      }\n      while(g != 0);\n      \n      for (i = kSmallSize - 1; i >= 0; i--)\n        Buf[i] = SmallBuffer[i];\n      Init(Size);\n    }\n    pos -= SmallSize;\n    int g;\n    for (g = 0; pos >= Counts[g]; g++)\n      pos -= Counts[g];\n    int offset = (g << 4);\n    Byte res = Buf[offset + pos];\n    for (pos; pos < 16 - 1; pos++)\n      Buf[offset + pos] = Buf[offset + pos + 1];\n    \n    SmallSize++;\n    SmallBuffer[kSmallSize - SmallSize] = res;\n\n    Counts[g]--;\n    return res;\n  }\n};\n*/\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PPMD_Alone/PpmdAlone.cpp",
    "content": "// PpmdAlone.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../../Common/MyWindows.h\"\n#include \"../../../Common/MyInitGuid.h\"\n\n#include <stdio.h>\n\n#if defined(_WIN32) || defined(OS2) || defined(MSDOS)\n#include <fcntl.h>\n#include <io.h>\n#define MY_SET_BINARY_MODE(file) _setmode(_fileno(file), O_BINARY)\n#else\n#define MY_SET_BINARY_MODE(file)\n#endif\n\n#include \"../../../Common/CommandLineParser.h\"\n#include \"../../../Common/StringConvert.h\"\n#include \"../../../Common/StringToInt.h\"\n\n#include \"../../Common/FileStreams.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"../PpmdDecoder.h\"\n#include \"../PpmdEncoder.h\"\n\nusing namespace NCommandLineParser;\n\n#ifdef _WIN32\nbool g_IsNT = false;\nstatic inline bool IsItWindowsNT()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo)) \n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);\n}\n#endif\n\nstatic const char *kCantAllocate = \"Can not allocate memory\";\nstatic const char *kReadError = \"Read error\";\nstatic const char *kWriteError = \"Write error\";\n\nnamespace NKey {\nenum Enum\n{\n  kHelp1 = 0,\n  kHelp2,\n  kOrder,\n  kUsedMemorySize,\n  kStdIn,\n  kStdOut\n};\n}\n\nstatic const CSwitchForm kSwitchForms[] = \n{\n  { L\"?\",  NSwitchType::kSimple, false },\n  { L\"H\",  NSwitchType::kSimple, false },\n  { L\"O\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"M\", NSwitchType::kUnLimitedPostString, false, 1 },\n  { L\"SI\",  NSwitchType::kSimple, false },\n  { L\"SO\",  NSwitchType::kSimple, false }\n};\n\nstatic const int kNumSwitches = sizeof(kSwitchForms) / sizeof(kSwitchForms[0]);\n\nstatic void PrintHelp()\n{\n  fprintf(stderr, \"\\nUsage:  PPMD <e|d> inputFile outputFile [<switches>...]\\n\"\n             \"  e: encode file\\n\"\n             \"  d: decode file\\n\"\n/*\n             \"  b: Benchmark\\n\"\n*/\n    \"<Switches>\\n\"\n    \"  -o{N}:  set order - [4, 32], default: 4\\n\"\n    \"  -m{N}:  set memory size - [4,512], default: 4 (4 MB)\\n\"\n    \"  -si:    read data from stdin (only with d)\\n\"\n    \"  -so:    write data to stdout\\n\"\n    );\n}\n\nstatic void PrintHelpAndExit(const char *s)\n{\n  fprintf(stderr, \"\\nError: %s\\n\\n\", s);\n  PrintHelp();\n  throw -1;\n}\n\nstatic void IncorrectCommand()\n{\n  PrintHelpAndExit(\"Incorrect command\");\n}\n\nstatic void WriteArgumentsToStringList(int numArguments, const char *arguments[], \n    UStringVector &strings)\n{\n  for(int i = 1; i < numArguments; i++)\n    strings.Add(MultiByteToUnicodeString(arguments[i]));\n}\n\nstatic bool GetNumber(const wchar_t *s, UInt32 &value)\n{\n  value = 0;\n  if (MyStringLen(s) == 0)\n    return false;\n  const wchar_t *end;\n  UInt64 res = ConvertStringToUInt64(s, &end);\n  if (*end != L'\\0')\n    return false;\n  if (res > 0xFFFFFFFF)\n    return false;\n  value = UInt32(res);\n  return true;\n}\n\nint main2(int n, const char *args[])\n{\n  #ifdef _WIN32\n  g_IsNT = IsItWindowsNT();\n  #endif\n\n  fprintf(stderr, \"\\nPPMD 4.49 Copyright (c) 1999-2007 Igor Pavlov  2007-07-05\\n\");\n\n  if (n == 1)\n  {\n    PrintHelp();\n    return 0;\n  }\n\n  bool unsupportedTypes = (sizeof(Byte) != 1 || sizeof(UInt32) < 4 || sizeof(UInt64) < 4);\n  if (unsupportedTypes)\n  {\n    fprintf(stderr, \"Unsupported base types. Edit Common/Types.h and recompile\");\n    return 1;\n  }   \n\n  UStringVector commandStrings;\n  WriteArgumentsToStringList(n, args, commandStrings);\n  CParser parser(kNumSwitches);\n  try\n  {\n    parser.ParseStrings(kSwitchForms, commandStrings);\n  }\n  catch(...) \n  {\n    IncorrectCommand();\n  }\n\n  if(parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs)\n  {\n    PrintHelp();\n    return 0;\n  }\n  const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;\n\n  int paramIndex = 0;\n  if (paramIndex >= nonSwitchStrings.Size())\n    IncorrectCommand();\n  const UString &command = nonSwitchStrings[paramIndex++]; \n\n/* FIXME\n  if (command.CompareNoCase(L\"b\") == 0)\n  {\n    const UInt32 kNumDefaultItereations = 1;\n    UInt32 numIterations = kNumDefaultItereations;\n    {\n      if (paramIndex < nonSwitchStrings.Size())\n        if (!GetNumber(nonSwitchStrings[paramIndex++], numIterations))\n          numIterations = kNumDefaultItereations;\n    }\n    return LzmaBenchCon(stderr, numIterations, numThreads, dictionary);\n  }\n*/\n\n  bool encodeMode = false;\n  if (command.CompareNoCase(L\"e\") == 0)\n    encodeMode = true;\n  else if (command.CompareNoCase(L\"d\") == 0)\n    encodeMode = false;\n  else\n    IncorrectCommand();\n\n  bool stdInMode = parser[NKey::kStdIn].ThereIs;\n  bool stdOutMode = parser[NKey::kStdOut].ThereIs;\n\n  CMyComPtr<ISequentialInStream> inStream;\n  CInFileStream *inStreamSpec = 0;\n  if (stdInMode)\n  {\n    inStream = new CStdInFileStream;\n    MY_SET_BINARY_MODE(stdin);\n  }\n  else\n  {\n    if (paramIndex >= nonSwitchStrings.Size())\n      IncorrectCommand();\n    const UString &inputName = nonSwitchStrings[paramIndex++]; \n    inStreamSpec = new CInFileStream;\n    inStream = inStreamSpec;\n    if (!inStreamSpec->Open(GetSystemString(inputName)))\n    {\n      fprintf(stderr, \"\\nError: can not open input file %s\\n\", \n          (const char *)GetOemString(inputName));\n      return 1;\n    }\n  }\n\n  CMyComPtr<ISequentialOutStream> outStream;\n  if (stdOutMode)\n  {\n    outStream = new CStdOutFileStream;\n    MY_SET_BINARY_MODE(stdout);\n  }\n  else\n  {\n    if (paramIndex >= nonSwitchStrings.Size())\n      IncorrectCommand();\n    const UString &outputName = nonSwitchStrings[paramIndex++]; \n    COutFileStream *outStreamSpec = new COutFileStream;\n    outStream = outStreamSpec;\n    if (!outStreamSpec->Create(GetSystemString(outputName), true))\n    {\n      fprintf(stderr, \"\\nError: can not open output file %s\\n\", \n        (const char *)GetOemString(outputName));\n      return 1;\n    }\n  }\n\n  UInt64 fileSize;\n  if (encodeMode)\n  {\n    // NCompress::NLZMA::CEncoder *encoderSpec = new NCompress::NLZMA::CEncoder;\n    NCompress::NPpmd::CEncoder *encoderSpec = new NCompress::NPpmd::CEncoder;\n    CMyComPtr<ICompressCoder> encoder = encoderSpec;\n\n    if (stdInMode)\n      IncorrectCommand();\n\n    UInt32 order = 4;\n    if(parser[NKey::kOrder].ThereIs)\n      if (!GetNumber(parser[NKey::kOrder].PostStrings[0], order))\n        IncorrectCommand();\n   if (order < 4) order = 4;\n    \n    UInt32 memSize = 4;\n    if(parser[NKey::kUsedMemorySize].ThereIs)\n      if (!GetNumber(parser[NKey::kUsedMemorySize].PostStrings[0], memSize))\n        IncorrectCommand();\n   if (memSize < 4 ) memSize = 4; \n    \n \n    PROPID propIDs[] = \n\n    {\n\tNCoderPropID::kUsedMemorySize,\n\tNCoderPropID::kOrder\n    };\n    const int kNumPropsMax = sizeof(propIDs) / sizeof(propIDs[0]);\n\n    PROPVARIANT properties[kNumPropsMax];\n    for (int p = 0; p < kNumPropsMax; p++)\n      properties[p].vt = VT_UI4;\n\n    properties[0].ulVal = memSize * 1024 * 1024; // memory\n    properties[1].ulVal = order;\n\n    int numProps = kNumPropsMax;\n\n    if (encoderSpec->SetCoderProperties(propIDs, properties, numProps) != S_OK)\n      IncorrectCommand();\n    encoderSpec->WriteCoderProperties(outStream);\n\n/* \n    if (eos || stdInMode)\n      fileSize = (UInt64)(Int64)-1;\n    else\n*/\n      inStreamSpec->File.GetLength(fileSize);\n\n    for (int i = 0; i < 8; i++)\n    {\n      Byte b = Byte(fileSize >> (8 * i));\n      if (outStream->Write(&b, 1, 0) != S_OK)\n      {\n        fprintf(stderr, kWriteError);\n        return 1;\n      }\n    }\n    HRESULT result = encoder->Code(inStream, outStream, 0, 0, 0);\n    if (result == E_OUTOFMEMORY)\n    {\n      fprintf(stderr, \"\\nError: Can not allocate memory\\n\");\n      return 1;\n    }   \n    else if (result != S_OK)\n    {\n      fprintf(stderr, \"\\nEncoder error = %X\\n\", (unsigned int)result);\n      return 1;\n    }   \n  }\n  else\n  {\n    // NCompress::NLZMA::CDecoder *decoderSpec = new NCompress::NLZMA::CDecoder;\n    NCompress::NPpmd::CDecoder *decoderSpec = new NCompress::NPpmd::CDecoder;\n    CMyComPtr<ICompressCoder> decoder = decoderSpec;\n    const UInt32 kPropertiesSize = 5;\n    Byte header[kPropertiesSize + 8];\n    if (ReadStream_FALSE(inStream, header, kPropertiesSize + 8) != S_OK)\n    {\n      fprintf(stderr, kReadError);\n      return 1;\n    }\n    if (decoderSpec->SetDecoderProperties2(header, kPropertiesSize) != S_OK)\n    {\n      fprintf(stderr, \"SetDecoderProperties error\");\n      return 1;\n    }\n    fileSize = 0;\n    for (int i = 0; i < 8; i++)\n      fileSize |= ((UInt64)header[kPropertiesSize + i]) << (8 * i);\n\n    if (decoder->Code(inStream, outStream, 0, &fileSize, 0) != S_OK)\n    {\n      fprintf(stderr, \"Decoder error\");\n      return 1;\n    }   \n  }\n  return 0;\n}\n\nint main(int n, const char *args[])\n{\n  try { return main2(n, args); }\n  catch(const char *s) \n  { \n    fprintf(stderr, \"\\nError: %s\\n\", s);\n    return 1; \n  }\n  catch(...) \n  { \n    fprintf(stderr, \"\\nError\\n\");\n    return 1; \n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PPMD_Alone/makefile",
    "content": "include ../../../../makefile.machine\n\nPROG = ppmd.exe\n\nLIB = $(LOCAL_LIBS)\nRM = rm -f\nCFLAGS = -c -I. -I../../../  -I../../../myWindows  -I../../../include_windows -UENV_UNIX\nCXXFLAGS=$(CFLAGS)\n\nOBJS = \\\n  PpmdAlone.o \\\n  PpmdDecoder.o \\\n  PpmdEncoder.o \\\n  CommandLineParser.o \\\n  MyString.o \\\n  StringConvert.o \\\n  MyVector.o \\\n  InBuffer.o \\\n  OutBuffer.o \\\n  FileStreams.o \\\n  C_FileIO.o \\\n  StreamUtils.o \\\n  StringToInt.o\n\nall: $(PROG)\n\n$(PROG): $(OBJS)\n\t$(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB)\n\nPpmdAlone.o: PpmdAlone.cpp\n\t$(CXX) $(CXXFLAGS) PpmdAlone.cpp\n\nPpmdDecoder.o: ../PpmdDecoder.cpp\n\t$(CXX) $(CXXFLAGS) ../PpmdDecoder.cpp\n\nPpmdEncoder.o: ../PpmdEncoder.cpp\n\t$(CXX) $(CXXFLAGS) ../PpmdEncoder.cpp\n\nInBuffer.o: ../../Common/InBuffer.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/InBuffer.cpp\n\nOutBuffer.o: ../../Common/OutBuffer.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/OutBuffer.cpp\n\nFileStreams.o: ../../Common/FileStreams.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/FileStreams.cpp\n\nStreamUtils.o: ../../Common/StreamUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/StreamUtils.cpp\n\nC_FileIO.o: ../../../Common/C_FileIO.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/C_FileIO.cpp\n\nCommandLineParser.o: ../../../Common/CommandLineParser.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/CommandLineParser.cpp\n\nMyWindows.o: ../../../Common/MyWindows.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyWindows.cpp\n\nMyString.o: ../../../Common/MyString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyString.cpp\n\nStringConvert.o: ../../../Common/StringConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringConvert.cpp\n\nStringToInt.o: ../../../Common/StringToInt.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringToInt.cpp\n\nMyVector.o: ../../../Common/MyVector.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyVector.cpp\n\nclean:\n\t-$(RM) $(PROG) $(OBJS) testfile* *.exe ir.out\n\t-$(RM) -fr SunWS_cache\n\n\ntest: $(PROG)\n\tcp PpmdAlone.cpp testfile\n\t./$(PROG) e testfile testfile.ppmd\n\t./$(PROG) d testfile.ppmd testfile.ppmd.d \n\tdiff -s testfile testfile.ppmd.d\n\t./$(PROG) e -so testfile > testfile.ppmd.2\n\t./$(PROG) d -si -so < testfile.ppmd.2 > testfile.ppmd.2.d\n\tdiff -s testfile testfile.ppmd.2.d\n\t./$(PROG) e -o32 -m256 testfile testfile.ppmd.3\n\t./$(PROG) d testfile.ppmd.3 testfile.ppmd.3.d \n\tdiff -s testfile testfile.ppmd.3.d\n\t@echo =========\n\t@echo All Done \n\t@echo =========\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdContext.h",
    "content": "// PpmdContext.h\n// This code is based on Dmitry Shkarin's PPMdH code\n\n#ifndef __COMPRESS_PPMD_CONTEXT_H\n#define __COMPRESS_PPMD_CONTEXT_H\n\n#include \"../../Common/Types.h\"\n\n#include \"PpmdSubAlloc.h\"\n#include \"RangeCoder.h\"\n\nnamespace NCompress {\nnamespace NPpmd {\n\nconst int INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS,\n        INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124;\n\nstruct SEE2_CONTEXT\n{\n  // SEE-contexts for PPM-contexts with masked symbols\n  UInt16 Summ;\n  Byte Shift, Count;\n  void init(int InitVal) { Summ = (UInt16)(InitVal << (Shift=PERIOD_BITS-4)); Count=4; }\n  unsigned int getMean()\n  {\n    unsigned int RetVal=(Summ >> Shift);\n    Summ = (UInt16)(Summ - RetVal);\n    return RetVal+(RetVal == 0);\n  }\n  void update()\n  {\n    if (Shift < PERIOD_BITS && --Count == 0)\n    {\n      Summ <<= 1;\n      Count = (Byte)(3 << Shift++);\n    }\n  }\n};\n\nstruct PPM_CONTEXT\n{\n  UInt16 NumStats; // sizeof(UInt16) > sizeof(Byte)\n  UInt16 SummFreq;\n  \n  struct STATE\n  {\n    Byte Symbol, Freq;\n    UInt16 SuccessorLow;\n    UInt16 SuccessorHigh;\n\n    UInt32 GetSuccessor() const { return SuccessorLow | ((UInt32)SuccessorHigh << 16); }\n    void SetSuccessor(UInt32 v)\n    {\n      SuccessorLow = (UInt16)(v & 0xFFFF);\n      SuccessorHigh = (UInt16)((v >> 16) & 0xFFFF);\n    }\n  };\n  \n  UInt32 Stats;\n  UInt32 Suffix;\n  \n  PPM_CONTEXT* createChild(CSubAllocator &subAllocator, STATE* pStats, STATE& FirstState)\n  {\n    PPM_CONTEXT* pc = (PPM_CONTEXT*) subAllocator.AllocContext();\n    if (pc)\n    {\n      pc->NumStats = 1;\n      pc->oneState() = FirstState;\n      pc->Suffix = subAllocator.GetOffset(this);\n      pStats->SetSuccessor(subAllocator.GetOffsetNoCheck(pc));\n    }\n    return pc;\n  }\n\n  STATE& oneState() const { return (STATE&) SummFreq; }\n};\n\n/////////////////////////////////\n\nconst UInt16 InitBinEsc[] =\n  {0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};\n\nstruct CInfo\n{\n  CSubAllocator SubAllocator;\n  SEE2_CONTEXT SEE2Cont[25][16], DummySEE2Cont;\n  PPM_CONTEXT * MinContext, * MaxContext;\n\n  PPM_CONTEXT::STATE* FoundState;      // found next state transition\n  int NumMasked, InitEsc, OrderFall, RunLength, InitRL, MaxOrder;\n  Byte CharMask[256], NS2Indx[256], NS2BSIndx[256], HB2Flag[256];\n  Byte EscCount, PrintCount, PrevSuccess, HiBitsFlag;\n  UInt16 BinSumm[128][64];               // binary SEE-contexts\n\n  UInt16 &GetBinSumm(const PPM_CONTEXT::STATE &rs, int numStates)\n  {\n    HiBitsFlag = HB2Flag[FoundState->Symbol];\n    return BinSumm[rs.Freq - 1][\n         PrevSuccess + NS2BSIndx[numStates - 1] +\n         HiBitsFlag + 2 * HB2Flag[rs.Symbol] +\n         ((RunLength >> 26) & 0x20)];\n  }\n\n  PPM_CONTEXT *GetContext(UInt32 offset) const { return (PPM_CONTEXT *)SubAllocator.GetPtr(offset); }\n  PPM_CONTEXT *GetContextNoCheck(UInt32 offset) const { return (PPM_CONTEXT *)SubAllocator.GetPtrNoCheck(offset); }\n  PPM_CONTEXT::STATE *GetState(UInt32 offset) const { return (PPM_CONTEXT::STATE *)SubAllocator.GetPtr(offset); }\n  PPM_CONTEXT::STATE *GetStateNoCheck(UInt32 offset) const { return (PPM_CONTEXT::STATE *)SubAllocator.GetPtr(offset); }\n\n  void RestartModelRare()\n  {\n    int i, k, m;\n    memset(CharMask,0,sizeof(CharMask));\n    SubAllocator.InitSubAllocator();\n    InitRL = -((MaxOrder < 12) ? MaxOrder : 12) - 1;\n    MinContext = MaxContext = (PPM_CONTEXT*) SubAllocator.AllocContext();\n    MinContext->Suffix = 0;\n    OrderFall = MaxOrder;\n    MinContext->SummFreq = (UInt16)((MinContext->NumStats = 256) + 1);\n    FoundState = (PPM_CONTEXT::STATE*)SubAllocator.AllocUnits(256 / 2);\n    MinContext->Stats = SubAllocator.GetOffsetNoCheck(FoundState);\n    PrevSuccess = 0;\n    for (RunLength = InitRL, i = 0; i < 256; i++)\n    {\n      PPM_CONTEXT::STATE &state = FoundState[i];\n      state.Symbol = (Byte)i;\n      state.Freq = 1;\n      state.SetSuccessor(0);\n    }\n    for (i = 0; i < 128; i++)\n        for (k = 0; k < 8; k++)\n            for ( m=0; m < 64; m += 8)\n                BinSumm[i][k + m] = (UInt16)(BIN_SCALE - InitBinEsc[k] / (i + 2));\n    for (i = 0; i < 25; i++)\n        for (k = 0; k < 16; k++)\n            SEE2Cont[i][k].init(5*i+10);\n  }\n\n  void StartModelRare(int maxOrder)\n  {\n    int i, k, m ,Step;\n    EscCount=PrintCount=1;\n    if (maxOrder < 2)\n    {\n        memset(CharMask,0,sizeof(CharMask));\n        OrderFall = MaxOrder;\n        MinContext = MaxContext;\n        while (MinContext->Suffix != 0)\n        {\n          MinContext = GetContextNoCheck(MinContext->Suffix);\n          OrderFall--;\n        }\n        FoundState = GetState(MinContext->Stats);\n        MinContext = MaxContext;\n    }\n    else\n    {\n        MaxOrder = maxOrder;\n        RestartModelRare();\n        NS2BSIndx[0] = 2 * 0;\n        NS2BSIndx[1] = 2 * 1;\n        memset(NS2BSIndx + 2, 2 * 2, 9);\n        memset(NS2BSIndx + 11, 2 * 3, 256 - 11);\n        for (i = 0; i < 3; i++)\n          NS2Indx[i] = (Byte)i;\n        for (m = i, k = Step = 1; i < 256; i++)\n        {\n            NS2Indx[i] = (Byte)m;\n            if ( !--k )\n            {\n              k = ++Step;\n              m++;\n            }\n        }\n        memset(HB2Flag, 0, 0x40);\n        memset(HB2Flag + 0x40, 0x08, 0x100 - 0x40);\n        DummySEE2Cont.Shift = PERIOD_BITS;\n    }\n  }\n\n  PPM_CONTEXT* CreateSuccessors(bool skip, PPM_CONTEXT::STATE* p1)\n  {\n    // static UpState declaration bypasses IntelC bug\n    // static PPM_CONTEXT::STATE UpState;\n    PPM_CONTEXT::STATE UpState;\n\n    PPM_CONTEXT *pc = MinContext;\n    PPM_CONTEXT *UpBranch = GetContext(FoundState->GetSuccessor());\n    PPM_CONTEXT::STATE * p, * ps[MAX_O], ** pps = ps;\n    if ( !skip )\n    {\n        *pps++ = FoundState;\n        if ( !pc->Suffix )\n          goto NO_LOOP;\n    }\n    if ( p1 )\n    {\n        p = p1;\n        pc = GetContext(pc->Suffix);\n        goto LOOP_ENTRY;\n    }\n    do\n    {\n        pc = GetContext(pc->Suffix);\n        if (pc->NumStats != 1)\n        {\n            if ((p = GetStateNoCheck(pc->Stats))->Symbol != FoundState->Symbol)\n                do { p++; } while (p->Symbol != FoundState->Symbol);\n        }\n        else\n          p = &(pc->oneState());\nLOOP_ENTRY:\n        if (GetContext(p->GetSuccessor()) != UpBranch)\n        {\n            pc = GetContext(p->GetSuccessor());\n            break;\n        }\n        *pps++ = p;\n    }\n    while ( pc->Suffix );\nNO_LOOP:\n    if (pps == ps)\n      return pc;\n    UpState.Symbol = *(Byte*) UpBranch;\n    UpState.SetSuccessor(SubAllocator.GetOffset(UpBranch) + 1);\n    if (pc->NumStats != 1)\n    {\n        if ((p = GetStateNoCheck(pc->Stats))->Symbol != UpState.Symbol)\n                do { p++; } while (p->Symbol != UpState.Symbol);\n        unsigned int cf = p->Freq-1;\n        unsigned int s0 = pc->SummFreq - pc->NumStats - cf;\n        UpState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) :\n            ((2 * cf + 3 * s0 - 1) / (2 * s0))));\n    }\n    else\n      UpState.Freq = pc->oneState().Freq;\n    do\n    {\n        pc = pc->createChild(SubAllocator, *--pps, UpState);\n        if ( !pc )\n          return NULL;\n    }\n    while (pps != ps);\n    return pc;\n  }\n\n  void UpdateModel()\n  {\n    PPM_CONTEXT::STATE fs = *FoundState, * p = NULL;\n    PPM_CONTEXT* pc, * Successor;\n    unsigned int ns1, ns, cf, sf, s0;\n    if (fs.Freq < MAX_FREQ / 4 && MinContext->Suffix != 0)\n    {\n        pc = GetContextNoCheck(MinContext->Suffix);\n      \n        if (pc->NumStats != 1)\n        {\n            if ((p = GetStateNoCheck(pc->Stats))->Symbol != fs.Symbol)\n            {\n                do { p++; } while (p->Symbol != fs.Symbol);\n                if (p[0].Freq >= p[-1].Freq)\n                {\n                    _PPMD_SWAP(p[0],p[-1]);\n                    p--;\n                }\n            }\n            if (p->Freq < MAX_FREQ-9)\n            {\n                p->Freq += 2;\n                pc->SummFreq += 2;\n            }\n        }\n        else\n        {\n            p = &(pc->oneState());\n            p->Freq = (Byte)(p->Freq + ((p->Freq < 32) ? 1 : 0));\n        }\n    }\n    if ( !OrderFall )\n    {\n        MinContext = MaxContext = CreateSuccessors(true, p);\n        FoundState->SetSuccessor(SubAllocator.GetOffset(MinContext));\n        if (MinContext == 0)\n          goto RESTART_MODEL;\n        return;\n    }\n    *SubAllocator.pText++ = fs.Symbol;\n    Successor = (PPM_CONTEXT*) SubAllocator.pText;\n    if (SubAllocator.pText >= SubAllocator.UnitsStart)\n      goto RESTART_MODEL;\n    if (fs.GetSuccessor() != 0)\n    {\n        if ((Byte *)GetContext(fs.GetSuccessor()) <= SubAllocator.pText)\n        {\n          PPM_CONTEXT* cs = CreateSuccessors(false, p);\n          fs.SetSuccessor(SubAllocator.GetOffset(cs));\n          if (cs == NULL)\n            goto RESTART_MODEL;\n        }\n        if ( !--OrderFall )\n        {\n            Successor = GetContext(fs.GetSuccessor());\n            SubAllocator.pText -= (MaxContext != MinContext);\n        }\n    }\n    else\n    {\n        FoundState->SetSuccessor(SubAllocator.GetOffsetNoCheck(Successor));\n        fs.SetSuccessor(SubAllocator.GetOffsetNoCheck(MinContext));\n    }\n    s0 = MinContext->SummFreq - (ns = MinContext->NumStats) - (fs.Freq - 1);\n    for (pc = MaxContext; pc != MinContext; pc = GetContext(pc->Suffix))\n    {\n        if ((ns1 = pc->NumStats) != 1)\n        {\n            if ((ns1 & 1) == 0)\n            {\n                void *ppp = SubAllocator.ExpandUnits(GetState(pc->Stats), ns1 >> 1);\n                pc->Stats = SubAllocator.GetOffset(ppp);\n                if (!ppp)\n                  goto RESTART_MODEL;\n            }\n            pc->SummFreq = (UInt16)(pc->SummFreq + (2 * ns1 < ns) + 2 * ((4 * ns1 <= ns) &\n                    (pc->SummFreq <= 8 * ns1)));\n        }\n        else\n        {\n            p = (PPM_CONTEXT::STATE*) SubAllocator.AllocUnits(1);\n            if ( !p )\n              goto RESTART_MODEL;\n            *p = pc->oneState();\n            pc->Stats = SubAllocator.GetOffsetNoCheck(p);\n            if (p->Freq < MAX_FREQ / 4 - 1)\n              p->Freq <<= 1;\n            else\n              p->Freq  = MAX_FREQ - 4;\n            pc->SummFreq = (UInt16)(p->Freq + InitEsc + (ns > 3));\n        }\n        cf = 2 * fs.Freq * (pc->SummFreq+6);\n        sf = s0 + pc->SummFreq;\n        if (cf < 6 * sf)\n        {\n            cf = 1 + (cf > sf)+(cf >= 4 * sf);\n            pc->SummFreq += 3;\n        }\n        else\n        {\n            cf = 4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf);\n            pc->SummFreq = (UInt16)(pc->SummFreq + cf);\n        }\n        p = GetState(pc->Stats) + ns1;\n        p->SetSuccessor(SubAllocator.GetOffset(Successor));\n        p->Symbol = fs.Symbol;\n        p->Freq = (Byte)cf;\n        pc->NumStats = (UInt16)++ns1;\n    }\n    MaxContext = MinContext = GetContext(fs.GetSuccessor());\n    return;\nRESTART_MODEL:\n    RestartModelRare();\n    EscCount = 0;\n    PrintCount = 0xFF;\n  }\n\n  void ClearMask()\n  {\n    EscCount = 1;\n    memset(CharMask, 0, sizeof(CharMask));\n    // if (++PrintCount == 0)\n    //   PrintInfo(DecodedFile,EncodedFile);\n  }\n\n  void update1(PPM_CONTEXT::STATE* p)\n  {\n    (FoundState = p)->Freq += 4;\n    MinContext->SummFreq += 4;\n    if (p[0].Freq > p[-1].Freq)\n    {\n        _PPMD_SWAP(p[0],p[-1]);\n        FoundState = --p;\n        if (p->Freq > MAX_FREQ)\n          rescale();\n    }\n  }\n\n\n  void update2(PPM_CONTEXT::STATE* p)\n  {\n    (FoundState = p)->Freq += 4;\n    MinContext->SummFreq += 4;\n    if (p->Freq > MAX_FREQ)\n      rescale();\n    EscCount++;\n    RunLength = InitRL;\n  }\n  \n  SEE2_CONTEXT* makeEscFreq2(int Diff, UInt32 &scale)\n  {\n    SEE2_CONTEXT* psee2c;\n    if (MinContext->NumStats != 256)\n    {\n      psee2c = SEE2Cont[NS2Indx[Diff-1]] +\n        (Diff < (GetContext(MinContext->Suffix))->NumStats - MinContext->NumStats) +\n        2 * (MinContext->SummFreq < 11 * MinContext->NumStats) +\n        4 * (NumMasked > Diff) +\n        HiBitsFlag;\n      scale = psee2c->getMean();\n    }\n    else\n    {\n      psee2c = &DummySEE2Cont;\n      scale = 1;\n    }\n    return psee2c;\n  }\n\n\n\n  void rescale()\n  {\n    int OldNS = MinContext->NumStats, i = MinContext->NumStats - 1, Adder, EscFreq;\n    PPM_CONTEXT::STATE* p1, * p;\n    PPM_CONTEXT::STATE *stats = GetStateNoCheck(MinContext->Stats);\n    for (p = FoundState; p != stats; p--)\n      _PPMD_SWAP(p[0], p[-1]);\n    stats->Freq += 4;\n    MinContext->SummFreq += 4;\n    EscFreq = MinContext->SummFreq - p->Freq;\n    Adder = (OrderFall != 0);\n    p->Freq = (Byte)((p->Freq + Adder) >> 1);\n    MinContext->SummFreq = p->Freq;\n    do\n    {\n        EscFreq -= (++p)->Freq;\n        p->Freq = (Byte)((p->Freq + Adder) >> 1);\n        MinContext->SummFreq = (UInt16)(MinContext->SummFreq + p->Freq);\n        if (p[0].Freq > p[-1].Freq)\n        {\n            PPM_CONTEXT::STATE tmp = *(p1 = p);\n            do\n            {\n              p1[0] = p1[-1];\n            }\n            while (--p1 != stats && tmp.Freq > p1[-1].Freq);\n            *p1 = tmp;\n        }\n    }\n    while ( --i );\n    if (p->Freq == 0)\n    {\n        do { i++; } while ((--p)->Freq == 0);\n        EscFreq += i;\n        MinContext->NumStats = (UInt16)(MinContext->NumStats - i);\n        if (MinContext->NumStats == 1)\n        {\n            PPM_CONTEXT::STATE tmp = *stats;\n            do { tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1)); EscFreq >>= 1; } while (EscFreq > 1);\n            SubAllocator.FreeUnits(stats, (OldNS+1) >> 1);\n            *(FoundState = &MinContext->oneState()) = tmp;  return;\n        }\n    }\n    EscFreq -= (EscFreq >> 1);\n    MinContext->SummFreq = (UInt16)(MinContext->SummFreq + EscFreq);\n    int n0 = (OldNS+1) >> 1, n1 = (MinContext->NumStats + 1) >> 1;\n    if (n0 != n1)\n      MinContext->Stats = SubAllocator.GetOffset(SubAllocator.ShrinkUnits(stats, n0, n1));\n    FoundState = GetState(MinContext->Stats);\n  }\n\n  void NextContext()\n  {\n    PPM_CONTEXT *c = GetContext(FoundState->GetSuccessor());\n    if (!OrderFall && (Byte *)c > SubAllocator.pText)\n      MinContext = MaxContext = c;\n    else\n    {\n      UpdateModel();\n      if (EscCount == 0)\n        ClearMask();\n    }\n  }\n};\n\n// Tabulated escapes for exponential symbol distribution\nconst Byte ExpEscape[16]={ 25,14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };\n#define GET_MEAN(SUMM,SHIFT,ROUND) ((SUMM+(1 << (SHIFT-ROUND))) >> (SHIFT))\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdDecode.h",
    "content": "// PpmdDecode.h\n// This code is based on Dmitry Shkarin's PPMdH code\n\n#ifndef __COMPRESS_PPMD_DECODE_H\n#define __COMPRESS_PPMD_DECODE_H\n\n#include \"PpmdContext.h\"\n\nnamespace NCompress {\nnamespace NPpmd {\n\nclass CRangeDecoderVirt\n{\npublic:\n  virtual UInt32 GetThreshold(UInt32 total) = 0;\n  virtual void Decode(UInt32 start, UInt32 size) = 0;\n  virtual UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) = 0;\n};\n\ntypedef NRangeCoder::CDecoder CRangeDecoderMy;\n\nclass CRangeDecoder:public CRangeDecoderVirt, public CRangeDecoderMy\n{\n  UInt32 GetThreshold(UInt32 total) { return CRangeDecoderMy::GetThreshold(total); }\n  void Decode(UInt32 start, UInt32 size) { CRangeDecoderMy::Decode(start, size); }\n  UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) { return CRangeDecoderMy::DecodeBit(size0, numTotalBits); }\n};\n\nstruct CDecodeInfo: public CInfo\n{\n  void DecodeBinSymbol(CRangeDecoderVirt *rangeDecoder)\n  {\n    PPM_CONTEXT::STATE& rs = MinContext->oneState();\n    UInt16& bs = GetBinSumm(rs, GetContextNoCheck(MinContext->Suffix)->NumStats);\n    if (rangeDecoder->DecodeBit(bs, TOT_BITS) == 0)\n    {\n      FoundState = &rs;\n      rs.Freq = (Byte)(rs.Freq + (rs.Freq < 128 ? 1: 0));\n      bs = (UInt16)(bs + INTERVAL - GET_MEAN(bs, PERIOD_BITS, 2));\n      PrevSuccess = 1;\n      RunLength++;\n    }\n    else\n    {\n      bs = (UInt16)(bs - GET_MEAN(bs, PERIOD_BITS, 2));\n      InitEsc = ExpEscape[bs >> 10];\n      NumMasked = 1;\n      CharMask[rs.Symbol] = EscCount;\n      PrevSuccess = 0;\n      FoundState = NULL;\n    }\n  }\n\n  void DecodeSymbol1(CRangeDecoderVirt *rangeDecoder)\n  {\n    PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats);\n    int i, count, hiCnt;\n    if ((count = rangeDecoder->GetThreshold(MinContext->SummFreq)) < (hiCnt = p->Freq))\n    {\n      PrevSuccess = (2 * hiCnt > MinContext->SummFreq);\n      RunLength += PrevSuccess;\n      rangeDecoder->Decode(0, p->Freq); // MinContext->SummFreq);\n      (FoundState = p)->Freq = (Byte)(hiCnt += 4);\n      MinContext->SummFreq += 4;\n      if (hiCnt > MAX_FREQ)\n        rescale();\n      return;\n    }\n    PrevSuccess = 0;\n    i = MinContext->NumStats - 1;\n    while ((hiCnt += (++p)->Freq) <= count)\n      if (--i == 0)\n      {\n        HiBitsFlag = HB2Flag[FoundState->Symbol];\n        rangeDecoder->Decode(hiCnt, MinContext->SummFreq - hiCnt); // , MinContext->SummFreq);\n        CharMask[p->Symbol] = EscCount;\n        i = (NumMasked = MinContext->NumStats)-1;\n        FoundState = NULL;\n        do { CharMask[(--p)->Symbol] = EscCount; } while ( --i );\n        return;\n      }\n    rangeDecoder->Decode(hiCnt - p->Freq, p->Freq); // , MinContext->SummFreq);\n    update1(p);\n  }\n\n\n  void DecodeSymbol2(CRangeDecoderVirt *rangeDecoder)\n  {\n    int count, hiCnt, i = MinContext->NumStats - NumMasked;\n    UInt32 freqSum;\n    SEE2_CONTEXT* psee2c = makeEscFreq2(i, freqSum);\n    PPM_CONTEXT::STATE* ps[256], ** pps = ps, * p = GetStateNoCheck(MinContext->Stats)-1;\n    hiCnt = 0;\n    do\n    {\n      do { p++; } while (CharMask[p->Symbol] == EscCount);\n      hiCnt += p->Freq;\n      *pps++ = p;\n    }\n    while ( --i );\n    \n    freqSum += hiCnt;\n    count = rangeDecoder->GetThreshold(freqSum);\n    \n    p = *(pps = ps);\n    if (count < hiCnt)\n    {\n      hiCnt = 0;\n      while ((hiCnt += p->Freq) <= count)\n        p=*++pps;\n      rangeDecoder->Decode(hiCnt - p->Freq, p->Freq); // , freqSum);\n      \n      psee2c->update();\n      update2(p);\n    }\n    else\n    {\n      rangeDecoder->Decode(hiCnt, freqSum - hiCnt); // , freqSum);\n      \n      i = MinContext->NumStats - NumMasked;\n      pps--;\n      do { CharMask[(*++pps)->Symbol] = EscCount; } while ( --i );\n      psee2c->Summ = (UInt16)(psee2c->Summ + freqSum);\n      NumMasked = MinContext->NumStats;\n    }\n  }\n\n  int DecodeSymbol(CRangeDecoderVirt *rangeDecoder)\n  {\n    if (MinContext->NumStats != 1)\n      DecodeSymbol1(rangeDecoder);\n    else\n      DecodeBinSymbol(rangeDecoder);\n    while ( !FoundState )\n    {\n      do\n      {\n        OrderFall++;\n        MinContext = GetContext(MinContext->Suffix);\n        if (MinContext == 0)\n          return -1;\n      }\n      while (MinContext->NumStats == NumMasked);\n      DecodeSymbol2(rangeDecoder);\n    }\n    Byte symbol = FoundState->Symbol;\n    NextContext();\n    return symbol;\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdDecoder.cpp",
    "content": "// PpmdDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/Defs.h\"\n#include \"Windows/Defs.h\"\n\n#include \"PpmdDecoder.h\"\n\nnamespace NCompress {\nnamespace NPpmd {\n\nconst int kLenIdFinished = -1;\nconst int kLenIdNeedInit = -2;\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *properties, UInt32 size)\n{\n  if (size < 5)\n    return E_INVALIDARG;\n  _order = properties[0];\n  _usedMemorySize = 0;\n  for (int i = 0; i < 4; i++)\n    _usedMemorySize += ((UInt32)(properties[1 + i])) << (i * 8);\n\n  if (_usedMemorySize > kMaxMemBlockSize)\n    return E_NOTIMPL;\n\n  if (!_rangeDecoder.Create(1 << 20))\n    return E_OUTOFMEMORY;\n  if (!_info.SubAllocator.StartSubAllocator(_usedMemorySize))\n    return E_OUTOFMEMORY;\n\n  return S_OK;\n}\n\nclass CDecoderFlusher\n{\n  CDecoder *_coder;\npublic:\n  bool NeedFlush;\n  CDecoderFlusher(CDecoder *coder): _coder(coder), NeedFlush(true) {}\n  ~CDecoderFlusher()\n  {\n    if (NeedFlush)\n      _coder->Flush();\n    _coder->ReleaseStreams();\n  }\n};\n\nHRESULT CDecoder::CodeSpec(UInt32 size, Byte *memStream)\n{\n  if (_outSizeDefined)\n  {\n    const UInt64 rem = _outSize - _processedSize;\n    if (size > rem)\n      size = (UInt32)rem;\n  }\n  const UInt32 startSize = size;\n\n  if (_remainLen == kLenIdFinished)\n    return S_OK;\n  if (_remainLen == kLenIdNeedInit)\n  {\n    _rangeDecoder.Init();\n    _remainLen = 0;\n    _info.MaxOrder = 0;\n    _info.StartModelRare(_order);\n  }\n  while (size != 0)\n  {\n    int symbol = _info.DecodeSymbol(&_rangeDecoder);\n    if (symbol < 0)\n    {\n      _remainLen = kLenIdFinished;\n      break;\n    }\n    if (memStream != 0)\n      *memStream++ = (Byte)symbol;\n    else\n      _outStream.WriteByte((Byte)symbol);\n    size--;\n  }\n  _processedSize += startSize - size;\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  if (!_outStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n  \n  SetInStream(inStream);\n  _outStream.SetStream(outStream);\n  SetOutStreamSize(outSize);\n  CDecoderFlusher flusher(this);\n\n  for (;;)\n  {\n    _processedSize = _outStream.GetProcessedSize();\n    UInt32 curSize = (1 << 18);\n    RINOK(CodeSpec(curSize, NULL));\n    if (_remainLen == kLenIdFinished)\n      break;\n    if (progress != NULL)\n    {\n      UInt64 inSize = _rangeDecoder.GetProcessedSize();\n      RINOK(progress->SetRatioInfo(&inSize, &_processedSize));\n    }\n    if (_outSizeDefined)\n      if (_outStream.GetProcessedSize() >= _outSize)\n        break;\n  }\n  flusher.NeedFlush = false;\n  return Flush();\n}\n\n#ifdef _NO_EXCEPTIONS\n\n#define PPMD_TRY_BEGIN\n#define PPMD_TRY_END\n\n#else\n\n#define PPMD_TRY_BEGIN try {\n#define PPMD_TRY_END } \\\n  catch(const CInBufferException &e)  { return e.ErrorCode; } \\\n  catch(const COutBufferException &e)  { return e.ErrorCode; } \\\n  catch(...) { return S_FALSE; }\n\n#endif\n\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  PPMD_TRY_BEGIN\n  return CodeReal(inStream, outStream, inSize, outSize, progress);\n  PPMD_TRY_END\n}\n\nSTDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)\n{\n  _rangeDecoder.SetStream(inStream);\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::ReleaseInStream()\n{\n  _rangeDecoder.ReleaseStream();\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)\n{\n  _outSizeDefined = (outSize != NULL);\n  if (_outSizeDefined)\n    _outSize = *outSize;\n  _processedSize = 0;\n  _remainLen = kLenIdNeedInit;\n  _outStream.Init();\n  return S_OK;\n}\n\n#ifndef NO_READ_FROM_CODER\n\nSTDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)\n{\n  PPMD_TRY_BEGIN\n  if (processedSize)\n    *processedSize = 0;\n  const UInt64 startPos = _processedSize;\n  RINOK(CodeSpec(size, (Byte *)data));\n  if (processedSize)\n    *processedSize = (UInt32)(_processedSize - startPos);\n  return Flush();\n  PPMD_TRY_END\n}\n\n#endif\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdDecoder.h",
    "content": "// PpmdDecoder.h\n\n#ifndef __COMPRESS_PPMD_DECODER_H\n#define __COMPRESS_PPMD_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/OutBuffer.h\"\n\n#include \"PpmdDecode.h\"\n#include \"RangeCoder.h\"\n\nnamespace NCompress {\nnamespace NPpmd {\n\nclass CDecoder :\n  public ICompressCoder,\n  public ICompressSetDecoderProperties2,\n  #ifndef NO_READ_FROM_CODER\n  public ICompressSetInStream,\n  public ICompressSetOutStreamSize,\n  public ISequentialInStream,\n  #endif\n  public CMyUnknownImp\n{\n  CRangeDecoder _rangeDecoder;\n\n  COutBuffer _outStream;\n\n  CDecodeInfo _info;\n\n  Byte _order;\n  UInt32 _usedMemorySize;\n\n  int _remainLen;\n  UInt64 _outSize;\n  bool _outSizeDefined;\n  UInt64 _processedSize;\n\n  HRESULT CodeSpec(UInt32 num, Byte *memStream);\n\npublic:\n\n  #ifndef NO_READ_FROM_CODER\n  MY_UNKNOWN_IMP4(\n      ICompressSetDecoderProperties2,\n      ICompressSetInStream,\n      ICompressSetOutStreamSize,\n      ISequentialInStream)\n  #else\n  MY_UNKNOWN_IMP1(\n      ICompressSetDecoderProperties2)\n  #endif\n\n  void ReleaseStreams()\n  {\n    ReleaseInStream();\n    _outStream.ReleaseStream();\n  }\n\n  HRESULT Flush() { return _outStream.Flush(); }\n\n  STDMETHOD(CodeReal)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n\n  STDMETHOD(SetInStream)(ISequentialInStream *inStream);\n  STDMETHOD(ReleaseInStream)();\n  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);\n\n  #ifndef NO_READ_FROM_CODER\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);\n  #endif\n\n  CDecoder(): _outSizeDefined(false) {}\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdEncode.h",
    "content": "// PpmdEncode.h\n// This code is based on Dmitry Shkarin's PPMdH code\n\n#ifndef __COMPRESS_PPMD_ENCODE_H\n#define __COMPRESS_PPMD_ENCODE_H\n\n#include \"PpmdContext.h\"\n\nnamespace NCompress {\nnamespace NPpmd {\n\nstruct CEncodeInfo: public CInfo\n{\n  void EncodeBinSymbol(int symbol, NRangeCoder::CEncoder *rangeEncoder)\n  {\n    PPM_CONTEXT::STATE& rs = MinContext->oneState();\n    UInt16 &bs = GetBinSumm(rs, GetContextNoCheck(MinContext->Suffix)->NumStats);\n    if (rs.Symbol == symbol)\n    {\n      FoundState = &rs;\n      rs.Freq = (Byte)(rs.Freq + (rs.Freq < 128 ? 1: 0));\n      rangeEncoder->EncodeBit(bs, TOT_BITS, 0);\n      bs = (UInt16)(bs + INTERVAL - GET_MEAN(bs, PERIOD_BITS, 2));\n      PrevSuccess = 1;\n      RunLength++;\n    }\n    else\n    {\n      rangeEncoder->EncodeBit(bs, TOT_BITS, 1);\n      bs = (UInt16)(bs - GET_MEAN(bs, PERIOD_BITS, 2));\n      InitEsc = ExpEscape[bs >> 10];\n      NumMasked = 1;\n      CharMask[rs.Symbol] = EscCount;\n      PrevSuccess = 0;\n      FoundState = NULL;\n    }\n  }\n\n  void EncodeSymbol1(int symbol, NRangeCoder::CEncoder *rangeEncoder)\n  {\n    PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats);\n    if (p->Symbol == symbol)\n    {\n      PrevSuccess = (2 * (p->Freq) > MinContext->SummFreq);\n      RunLength += PrevSuccess;\n      rangeEncoder->Encode(0, p->Freq, MinContext->SummFreq);\n      (FoundState = p)->Freq += 4;\n      MinContext->SummFreq += 4;\n      if (p->Freq > MAX_FREQ)\n        rescale();\n      return;\n    }\n    PrevSuccess = 0;\n    int LoCnt = p->Freq, i = MinContext->NumStats - 1;\n    while ((++p)->Symbol != symbol)\n    {\n      LoCnt += p->Freq;\n      if (--i == 0)\n      {\n        HiBitsFlag = HB2Flag[FoundState->Symbol];\n        CharMask[p->Symbol] = EscCount;\n        i=(NumMasked = MinContext->NumStats)-1;\n        FoundState = NULL;\n        do { CharMask[(--p)->Symbol] = EscCount; } while ( --i );\n        rangeEncoder->Encode(LoCnt, MinContext->SummFreq - LoCnt, MinContext->SummFreq);\n        return;\n      }\n    }\n    rangeEncoder->Encode(LoCnt, p->Freq, MinContext->SummFreq);\n    update1(p);\n  }\n\n  void EncodeSymbol2(int symbol, NRangeCoder::CEncoder *rangeEncoder)\n  {\n    int hiCnt, i = MinContext->NumStats - NumMasked;\n    UInt32 scale;\n    SEE2_CONTEXT* psee2c = makeEscFreq2(i, scale);\n    PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats) - 1;\n    hiCnt = 0;\n    do\n    {\n      do { p++; } while (CharMask[p->Symbol] == EscCount);\n      hiCnt += p->Freq;\n      if (p->Symbol == symbol)\n        goto SYMBOL_FOUND;\n      CharMask[p->Symbol] = EscCount;\n    }\n    while ( --i );\n    \n    rangeEncoder->Encode(hiCnt, scale, hiCnt + scale);\n    scale += hiCnt;\n    \n    psee2c->Summ = (UInt16)(psee2c->Summ + scale);\n    NumMasked = MinContext->NumStats;\n    return;\nSYMBOL_FOUND:\n    \n    UInt32 highCount = hiCnt;\n    UInt32 lowCount = highCount - p->Freq;\n    if ( --i )\n    {\n      PPM_CONTEXT::STATE* p1 = p;\n      do\n      {\n        do { p1++; } while (CharMask[p1->Symbol] == EscCount);\n        hiCnt += p1->Freq;\n      }\n      while ( --i );\n    }\n    // SubRange.scale += hiCnt;\n    scale += hiCnt;\n    rangeEncoder->Encode(lowCount, highCount - lowCount, scale);\n    psee2c->update();\n    update2(p);\n  }\n\n  void EncodeSymbol(int c, NRangeCoder::CEncoder *rangeEncoder)\n  {\n    if (MinContext->NumStats != 1)\n      EncodeSymbol1(c, rangeEncoder);\n    else\n      EncodeBinSymbol(c, rangeEncoder);\n    while ( !FoundState )\n    {\n      do\n      {\n        OrderFall++;\n        MinContext = GetContext(MinContext->Suffix);\n        if (MinContext == 0)\n          return; //  S_OK;\n      }\n      while (MinContext->NumStats == NumMasked);\n      EncodeSymbol2(c, rangeEncoder);\n    }\n    NextContext();\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdEncoder.cpp",
    "content": "// PpmdEncoder.cpp\n\n#include \"StdAfx.h\"\n\n// #include <fstream.h>\n// #include <iomanip.h>\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"PpmdEncoder.h\"\n\nnamespace NCompress {\nnamespace NPpmd {\n\nconst UInt32 kMinMemSize = (1 << 11);\nconst UInt32 kMinOrder = 2;\n\n/*\nUInt32 g_NumInner = 0;\nUInt32 g_InnerCycles = 0;\n\nUInt32 g_Encode2 = 0;\nUInt32 g_Encode2Cycles = 0;\nUInt32 g_Encode2Cycles2 = 0;\n\nclass CCounter\n{\npublic:\n  CCounter() {}\n  ~CCounter()\n  {\n    ofstream ofs(\"Res.dat\");\n    ofs << \"innerEncode1    = \" << setw(10) << g_NumInner << endl;\n    ofs << \"g_InnerCycles   = \" << setw(10) << g_InnerCycles << endl;\n    ofs << \"g_Encode2       = \" << setw(10) << g_Encode2 << endl;\n    ofs << \"g_Encode2Cycles = \" << setw(10) << g_Encode2Cycles << endl;\n    ofs << \"g_Encode2Cycles2= \" << setw(10) << g_Encode2Cycles2 << endl;\n    \n  }\n};\nCCounter g_Counter;\n*/\n\nSTDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)\n{\n  for (UInt32 i = 0; i < numProps; i++)\n  {\n    const PROPVARIANT &prop = props[i];\n    switch(propIDs[i])\n    {\n      case NCoderPropID::kUsedMemorySize:\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        if (prop.ulVal < kMinMemSize || prop.ulVal > kMaxMemBlockSize)\n          return E_INVALIDARG;\n        _usedMemorySize = (UInt32)prop.ulVal;\n        break;\n      case NCoderPropID::kOrder:\n        if (prop.vt != VT_UI4)\n          return E_INVALIDARG;\n        if (prop.ulVal < kMinOrder || prop.ulVal > kMaxOrderCompress)\n          return E_INVALIDARG;\n        _order = (Byte)prop.ulVal;\n        break;\n      default:\n        return E_INVALIDARG;\n    }\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)\n{\n  const UInt32 kPropSize = 5;\n  Byte props[kPropSize];\n  props[0] = _order;\n  for (int i = 0; i < 4; i++)\n    props[1 + i] = Byte(_usedMemorySize >> (8 * i));\n  return WriteStream(outStream, props, kPropSize);\n}\n\nconst UInt32 kUsedMemorySizeDefault = (1 << 24);\nconst int kOrderDefault = 6;\n\nCEncoder::CEncoder():\n  _usedMemorySize(kUsedMemorySizeDefault),\n  _order(kOrderDefault)\n{\n}\n\n\nHRESULT CEncoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)\n{\n  if (!_inStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n  if (!_rangeEncoder.Create(1 << 20))\n    return E_OUTOFMEMORY;\n  if (!_info.SubAllocator.StartSubAllocator(_usedMemorySize))\n    return E_OUTOFMEMORY;\n\n  _inStream.SetStream(inStream);\n  _inStream.Init();\n\n  _rangeEncoder.SetStream(outStream);\n  _rangeEncoder.Init();\n\n  CEncoderFlusher flusher(this);\n\n  _info.MaxOrder = 0;\n  _info.StartModelRare(_order);\n\n  for (;;)\n  {\n    UInt32 size = (1 << 18);\n    do\n    {\n      Byte symbol;\n      if (!_inStream.ReadByte(symbol))\n      {\n        // here we can write End Mark for stream version.\n        // In current version this feature is not used.\n        // _info.EncodeSymbol(-1, &_rangeEncoder);\n        return S_OK;\n      }\n      _info.EncodeSymbol(symbol, &_rangeEncoder);\n    }\n    while (--size != 0);\n    if (progress != NULL)\n    {\n      UInt64 inSize = _inStream.GetProcessedSize();\n      UInt64 outSize = _rangeEncoder.GetProcessedSize();\n      RINOK(progress->SetRatioInfo(&inSize, &outSize));\n    }\n  }\n}\n\nSTDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  try { return CodeReal(inStream, outStream, inSize, outSize, progress); }\n  catch(const COutBufferException &e) { return e.ErrorCode; }\n  catch(const CInBufferException &e) { return e.ErrorCode; }\n  catch(...) { return E_FAIL; }\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdEncoder.h",
    "content": "// PpmdEncoder.h\n\n#ifndef __COMPRESS_PPMD_ENCODER_H\n#define __COMPRESS_PPMD_ENCODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"PpmdEncode.h\"\n#include \"RangeCoder.h\"\n\nnamespace NCompress {\nnamespace NPpmd {\n\nclass CEncoder :\n  public ICompressCoder,\n  public ICompressSetCoderProperties,\n  public ICompressWriteCoderProperties,\n  public CMyUnknownImp\n{\npublic:\n  CInBuffer _inStream;\n\n  NRangeCoder::CEncoder _rangeEncoder;\n\n  CEncodeInfo _info;\n  UInt32 _usedMemorySize;\n  Byte _order;\n\n  HRESULT Flush()\n  {\n    _rangeEncoder.FlushData();\n    return _rangeEncoder.FlushStream();\n  }\n\n  void ReleaseStreams()\n  {\n    _inStream.ReleaseStream();\n    _rangeEncoder.ReleaseStream();\n  }\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  class CEncoderFlusher\n  {\n    CEncoder *_encoder;\n  public:\n    CEncoderFlusher(CEncoder *encoder): _encoder(encoder) {}\n    ~CEncoderFlusher()\n    {\n      _encoder->Flush();\n      _encoder->ReleaseStreams();\n    }\n  };\n\npublic:\n\n  MY_UNKNOWN_IMP2(\n      ICompressSetCoderProperties,\n      ICompressWriteCoderProperties)\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);\n\n  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);\n\n  CEncoder();\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdRegister.cpp",
    "content": "// PpmdRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"PpmdDecoder.h\"\n\nstatic void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CDecoder); }\n#ifndef EXTRACT_ONLY\n#include \"PpmdEncoder.h\"\nstatic void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CEncoder);  }\n#else\n#define CreateCodecOut 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodec, CreateCodecOut, 0x030401, L\"PPMD\", 1, false };\n\nREGISTER_CODEC(PPMD)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdSubAlloc.h",
    "content": "// PpmdSubAlloc.h\n// This code is based on Dmitry Shkarin's PPMdH code\n\n#ifndef __COMPRESS_PPMD_SUB_ALLOC_H\n#define __COMPRESS_PPMD_SUB_ALLOC_H\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"PpmdType.h\"\n\nconst UINT N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4;\nconst UINT UNIT_SIZE=12, N_INDEXES=N1+N2+N3+N4;\n\n// Extra 1 * UNIT_SIZE for NULL support\n// Extra 2 * UNIT_SIZE for s0 in GlueFreeBlocks()\nconst UInt32 kExtraSize = (UNIT_SIZE * 3);\nconst UInt32 kMaxMemBlockSize = 0xFFFFFFFF - kExtraSize;\n\nstruct MEM_BLK\n{\n  UInt16 Stamp, NU;\n  UInt32 Next, Prev;\n  void InsertAt(Byte *Base, UInt32 p)\n  {\n    Prev = p;\n    MEM_BLK *pp = (MEM_BLK *)(Base + p);\n    Next = pp->Next;\n    pp->Next = ((MEM_BLK *)(Base + Next))->Prev = (UInt32)((Byte *)this - Base);\n  }\n  void Remove(Byte *Base)\n  {\n    ((MEM_BLK *)(Base + Prev))->Next = Next;\n    ((MEM_BLK *)(Base + Next))->Prev = Prev;\n  }\n};\n\n\nclass CSubAllocator\n{\n  UInt32 SubAllocatorSize;\n  Byte Indx2Units[N_INDEXES], Units2Indx[128], GlueCount;\n  UInt32 FreeList[N_INDEXES];\n\n  Byte *Base;\n  Byte *HeapStart, *LoUnit, *HiUnit;\npublic:\n  Byte *pText, *UnitsStart;\n  CSubAllocator():\n    SubAllocatorSize(0),\n    GlueCount(0),\n    LoUnit(0),\n    HiUnit(0),\n    pText(0),\n    UnitsStart(0)\n  {\n    memset(Indx2Units, 0, sizeof(Indx2Units));\n    memset(FreeList, 0, sizeof(FreeList));\n  }\n  ~CSubAllocator()\n  {\n    StopSubAllocator();\n  };\n\n  void *GetPtr(UInt32 offset) const { return (offset == 0) ? 0 : (void *)(Base + offset); }\n  void *GetPtrNoCheck(UInt32 offset) const { return (void *)(Base + offset); }\n  UInt32 GetOffset(void *ptr) const { return (ptr == 0) ? 0 : (UInt32)((Byte *)ptr - Base); }\n  UInt32 GetOffsetNoCheck(void *ptr) const { return (UInt32)((Byte *)ptr - Base); }\n  MEM_BLK *GetBlk(UInt32 offset) const { return (MEM_BLK *)(Base + offset); }\n  UInt32 *GetNode(UInt32 offset) const { return (UInt32 *)(Base + offset); }\n\n  void InsertNode(void* p, int indx)\n  {\n    *(UInt32 *)p = FreeList[indx];\n    FreeList[indx] = GetOffsetNoCheck(p);\n  }\n\n  void* RemoveNode(int indx)\n  {\n    UInt32 offset = FreeList[indx];\n    UInt32 *p = GetNode(offset);\n    FreeList[indx] = *p;\n    return (void *)p;\n  }\n  \n  UINT U2B(int NU) const { return (UINT)(NU) * UNIT_SIZE; }\n  \n  void SplitBlock(void* pv, int oldIndx, int newIndx)\n  {\n    int i, UDiff = Indx2Units[oldIndx] - Indx2Units[newIndx];\n    Byte* p = ((Byte*)pv) + U2B(Indx2Units[newIndx]);\n    if (Indx2Units[i = Units2Indx[UDiff-1]] != UDiff)\n    {\n      InsertNode(p, --i);\n      p += U2B(i = Indx2Units[i]);\n      UDiff -= i;\n    }\n    InsertNode(p, Units2Indx[UDiff - 1]);\n  }\n  \n  UInt32 GetUsedMemory() const\n  {\n    UInt32 RetVal = SubAllocatorSize - (UInt32)(HiUnit - LoUnit) - (UInt32)(UnitsStart - pText);\n    for (UInt32 i = 0; i < N_INDEXES; i++)\n      for (UInt32 pn = FreeList[i]; pn != 0; RetVal -= (UInt32)Indx2Units[i] * UNIT_SIZE)\n        pn = *GetNode(pn);\n    return (RetVal >> 2);\n  }\n  \n  UInt32 GetSubAllocatorSize() const { return SubAllocatorSize; }\n\n  void StopSubAllocator()\n  {\n    if (SubAllocatorSize != 0)\n    {\n      BigFree(Base);\n      SubAllocatorSize = 0;\n      Base = 0;\n    }\n  }\n\n  bool StartSubAllocator(UInt32 size)\n  {\n    if (SubAllocatorSize == size)\n      return true;\n    StopSubAllocator();\n    if (size == 0)\n      Base = 0;\n    else\n    {\n      if ((Base = (Byte *)::BigAlloc(size + kExtraSize)) == 0)\n        return false;\n      HeapStart = Base + UNIT_SIZE; // we need such code to support NULL;\n    }\n    SubAllocatorSize = size;\n    return true;\n  }\n\n  void InitSubAllocator()\n  {\n    int i, k;\n    memset(FreeList, 0, sizeof(FreeList));\n    HiUnit = (pText = HeapStart) + SubAllocatorSize;\n    UINT Diff = UNIT_SIZE * (SubAllocatorSize / 8 / UNIT_SIZE * 7);\n    LoUnit = UnitsStart = HiUnit - Diff;\n    for (i = 0, k=1; i < N1 ; i++, k += 1)        Indx2Units[i] = (Byte)k;\n    for (k++; i < N1 + N2      ;i++, k += 2)      Indx2Units[i] = (Byte)k;\n    for (k++; i < N1 + N2 + N3   ;i++,k += 3)     Indx2Units[i] = (Byte)k;\n    for (k++; i < N1 + N2 + N3 + N4; i++, k += 4) Indx2Units[i] = (Byte)k;\n    GlueCount = 0;\n    for (k = i = 0; k < 128; k++)\n    {\n      i += (Indx2Units[i] < k+1);\n        Units2Indx[k] = (Byte)i;\n    }\n  }\n  \n  void GlueFreeBlocks()\n  {\n    UInt32 s0 = (UInt32)(HeapStart + SubAllocatorSize - Base);\n\n    // We need add exta MEM_BLK with Stamp=0\n    GetBlk(s0)->Stamp = 0;\n    s0 += UNIT_SIZE;\n    MEM_BLK *ps0 = GetBlk(s0);\n\n    UInt32 p;\n    int i;\n    if (LoUnit != HiUnit)\n      *LoUnit=0;\n    ps0->Next = ps0->Prev = s0;\n\n    for (i = 0; i < N_INDEXES; i++)\n      while (FreeList[i] != 0)\n      {\n        MEM_BLK *pp = (MEM_BLK *)RemoveNode(i);\n        pp->InsertAt(Base, s0);\n        pp->Stamp = 0xFFFF;\n        pp->NU = Indx2Units[i];\n      }\n    for (p = ps0->Next; p != s0; p = GetBlk(p)->Next)\n    {\n      for (;;)\n      {\n        MEM_BLK *pp = GetBlk(p);\n        MEM_BLK *pp1 = GetBlk(p + pp->NU * UNIT_SIZE);\n        if (pp1->Stamp != 0xFFFF || int(pp->NU) + pp1->NU >= 0x10000)\n          break;\n        pp1->Remove(Base);\n        pp->NU = (UInt16)(pp->NU + pp1->NU);\n      }\n    }\n    while ((p = ps0->Next) != s0)\n    {\n      MEM_BLK *pp = GetBlk(p);\n      pp->Remove(Base);\n      int sz;\n      for (sz = pp->NU; sz > 128; sz -= 128, p += 128 * UNIT_SIZE)\n        InsertNode(Base + p, N_INDEXES - 1);\n      if (Indx2Units[i = Units2Indx[sz-1]] != sz)\n      {\n        int k = sz - Indx2Units[--i];\n        InsertNode(Base + p + (sz - k) * UNIT_SIZE, k - 1);\n      }\n      InsertNode(Base + p, i);\n    }\n  }\n  void* AllocUnitsRare(int indx)\n  {\n    if ( !GlueCount )\n    {\n      GlueCount = 255;\n      GlueFreeBlocks();\n      if (FreeList[indx] != 0)\n        return RemoveNode(indx);\n    }\n    int i = indx;\n    do\n    {\n      if (++i == N_INDEXES)\n      {\n        GlueCount--;\n        i = U2B(Indx2Units[indx]);\n        return (UnitsStart - pText > i) ? (UnitsStart -= i) : (NULL);\n      }\n    } while (FreeList[i] == 0);\n    void* RetVal = RemoveNode(i);\n    SplitBlock(RetVal, i, indx);\n    return RetVal;\n  }\n  \n  void* AllocUnits(int NU)\n  {\n    int indx = Units2Indx[NU - 1];\n    if (FreeList[indx] != 0)\n      return RemoveNode(indx);\n    void* RetVal = LoUnit;\n    LoUnit += U2B(Indx2Units[indx]);\n    if (LoUnit <= HiUnit)\n      return RetVal;\n    LoUnit -= U2B(Indx2Units[indx]);\n    return AllocUnitsRare(indx);\n  }\n  \n  void* AllocContext()\n  {\n    if (HiUnit != LoUnit)\n      return (HiUnit -= UNIT_SIZE);\n    if (FreeList[0] != 0)\n      return RemoveNode(0);\n    return AllocUnitsRare(0);\n  }\n  \n  void* ExpandUnits(void* oldPtr, int oldNU)\n  {\n    int i0=Units2Indx[oldNU - 1], i1=Units2Indx[oldNU - 1 + 1];\n    if (i0 == i1)\n      return oldPtr;\n    void* ptr = AllocUnits(oldNU + 1);\n    if (ptr)\n    {\n      memcpy(ptr, oldPtr, U2B(oldNU));\n      InsertNode(oldPtr, i0);\n    }\n    return ptr;\n  }\n  \n  void* ShrinkUnits(void* oldPtr, int oldNU, int newNU)\n  {\n    int i0 = Units2Indx[oldNU - 1], i1 = Units2Indx[newNU - 1];\n    if (i0 == i1)\n      return oldPtr;\n    if (FreeList[i1] != 0)\n    {\n      void* ptr = RemoveNode(i1);\n      memcpy(ptr, oldPtr, U2B(newNU));\n      InsertNode(oldPtr,i0);\n      return ptr;\n    }\n    else\n    {\n      SplitBlock(oldPtr, i0, i1);\n      return oldPtr;\n    }\n  }\n  \n  void FreeUnits(void* ptr, int oldNU)\n  {\n    InsertNode(ptr, Units2Indx[oldNU - 1]);\n  }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/PpmdType.h",
    "content": "/****************************************************************************\n *  This file is part of PPMd project                                       *\n *  Written and distributed to public domain by Dmitry Shkarin 1997,        *\n *  1999-2001                                                               *\n *  Contents: compilation parameters and miscelaneous definitions           *\n *  Comments: system & compiler dependent file\n \n *  modified by Igor Pavlov (2004-08-29).\n ****************************************************************************/\n\n#ifndef __COMPRESS_PPMD_TYPE_H\n#define __COMPRESS_PPMD_TYPE_H\n\nconst int kMaxOrderCompress = 32;\nconst int MAX_O = 255; /* maximum allowed model order */\n\ntemplate <class T>\ninline void _PPMD_SWAP(T& t1,T& t2) { T tmp = t1; t1 = t2; t2 = tmp; }\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/QuantumDecoder.cpp",
    "content": "// QuantumDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../../Common/Defs.h\"\n\n#include \"QuantumDecoder.h\"\n\nnamespace NCompress {\nnamespace NQuantum {\n\n// const UInt32 kDictionarySizeMax = (1 << 21);\n\nconst int kLenIdNeedInit = -2;\n\nvoid CDecoder::Init()\n{\n  m_Selector.Init(kNumSelectors);\n  for (unsigned int i = 0; i < kNumLitSelectors; i++)\n    m_Literals[i].Init(kNumLitSymbols);\n  unsigned int numItems = _numDictBits << 1;\n  m_PosSlot[0].Init(MyMin(numItems, kNumLen3PosSymbolsMax));\n  m_PosSlot[1].Init(MyMin(numItems, kNumLen4PosSymbolsMax));\n  m_PosSlot[2].Init(MyMin(numItems, kNumLen5PosSymbolsMax));\n  m_LenSlot.Init(kNumLenSymbols);\n}\n\nHRESULT CDecoder::CodeSpec(UInt32 curSize)\n{\n  if (_remainLen == kLenIdNeedInit)\n  {\n    if (!_keepHistory)\n    {\n      if (!_outWindowStream.Create(_dictionarySize))\n        return E_OUTOFMEMORY;\n      Init();\n    }\n    if (!_rangeDecoder.Create(1 << 20))\n      return E_OUTOFMEMORY;\n    _rangeDecoder.Init();\n    _remainLen = 0;\n  }\n  if (curSize == 0)\n    return S_OK;\n\n  while(_remainLen > 0 && curSize > 0)\n  {\n    _remainLen--;\n    Byte b = _outWindowStream.GetByte(_rep0);\n    _outWindowStream.PutByte(b);\n    curSize--;\n  }\n\n  while(curSize > 0)\n  {\n    if (_rangeDecoder.Stream.WasFinished())\n      return S_FALSE;\n\n    unsigned int selector = m_Selector.Decode(&_rangeDecoder);\n    if (selector < kNumLitSelectors)\n    {\n      Byte b = (Byte)((selector << (8 - kNumLitSelectorBits)) + m_Literals[selector].Decode(&_rangeDecoder));\n      _outWindowStream.PutByte(b);\n      curSize--;\n    }\n    else\n    {\n      selector -= kNumLitSelectors;\n      unsigned int len = selector + kMatchMinLen;\n      if (selector == 2)\n      {\n        unsigned int lenSlot = m_LenSlot.Decode(&_rangeDecoder);;\n        if (lenSlot >= kNumSimpleLenSlots)\n        {\n          lenSlot -= 2;\n          int numDirectBits = (int)(lenSlot >> 2);\n          len +=  ((4 | (lenSlot & 3)) << numDirectBits) - 2;\n          if (numDirectBits < 6)\n            len += _rangeDecoder.Stream.ReadBits(numDirectBits);\n        }\n        else\n          len += lenSlot;\n      }\n      UInt32 rep0 = m_PosSlot[selector].Decode(&_rangeDecoder);;\n      if (rep0 >= kNumSimplePosSlots)\n      {\n        int numDirectBits = (int)((rep0 >> 1) - 1);\n        rep0 = ((2 | (rep0 & 1)) << numDirectBits) + _rangeDecoder.Stream.ReadBits(numDirectBits);\n      }\n      unsigned int locLen = len;\n      if (len > curSize)\n        locLen = (unsigned int)curSize;\n      if (!_outWindowStream.CopyBlock(rep0, locLen))\n        return S_FALSE;\n      curSize -= locLen;\n      len -= locLen;\n      if (len != 0)\n      {\n        _remainLen = (int)len;\n        _rep0 = rep0;\n        break;\n      }\n    }\n  }\n  return _rangeDecoder.Stream.WasFinished() ? S_FALSE : S_OK;\n}\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  if (outSize == NULL)\n    return E_INVALIDARG;\n  UInt64 size = *outSize;\n\n  SetInStream(inStream);\n  _outWindowStream.SetStream(outStream);\n  SetOutStreamSize(outSize);\n  CDecoderFlusher flusher(this);\n\n  const UInt64 start = _outWindowStream.GetProcessedSize();\n  for (;;)\n  {\n    UInt32 curSize = 1 << 18;\n    UInt64 rem = size - (_outWindowStream.GetProcessedSize() - start);\n    if (curSize > rem)\n      curSize = (UInt32)rem;\n    if (curSize == 0)\n      break;\n    RINOK(CodeSpec(curSize));\n    if (progress != NULL)\n    {\n      UInt64 inSize = _rangeDecoder.GetProcessedSize();\n      UInt64 nowPos64 = _outWindowStream.GetProcessedSize() - start;\n      RINOK(progress->SetRatioInfo(&inSize, &nowPos64));\n    }\n  }\n  flusher.NeedFlush = false;\n  return Flush();\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  try  { return CodeReal(inStream, outStream, inSize, outSize, progress); }\n  catch(const CInBufferException &e)  { return e.ErrorCode; }\n  catch(const CLzOutWindowException &e)  { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\nSTDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)\n{\n  _rangeDecoder.SetStream(inStream);\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::ReleaseInStream()\n{\n  _rangeDecoder.ReleaseStream();\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)\n{\n  if (outSize == NULL)\n    return E_FAIL;\n  _remainLen = kLenIdNeedInit;\n  _outWindowStream.Init(_keepHistory);\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/QuantumDecoder.h",
    "content": "// QuantumDecoder.h\n\n#ifndef __COMPRESS_QUANTUM_DECODER_H\n#define __COMPRESS_QUANTUM_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NQuantum {\n\nclass CStreamBitDecoder\n{\n  UInt32 m_Value;\n  CInBuffer m_Stream;\npublic:\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}\n  void ReleaseStream() { m_Stream.ReleaseStream();}\n\n  void Finish() { m_Value = 0x10000; }\n\n  void Init()\n  {\n    m_Stream.Init();\n    m_Value = 0x10000;\n  }\n\n  UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize(); }\n  bool WasFinished() const { return m_Stream.WasFinished(); };\n  \n  UInt32 ReadBit()\n  {\n    if (m_Value >= 0x10000)\n      m_Value = 0x100 | m_Stream.ReadByte();\n    UInt32 res = (m_Value >> 7) & 1;\n    m_Value <<= 1;\n    return res;\n  }\n\n  UInt32 ReadBits(int numBits) // numBits > 0\n  {\n    UInt32 res = 0;\n    do\n      res = (res << 1) | ReadBit();\n    while(--numBits != 0);\n    return res;\n  }\n};\n\nconst int kNumLitSelectorBits = 2;\nconst unsigned int kNumLitSelectors = (1 << kNumLitSelectorBits);\nconst unsigned int kNumLitSymbols = 1 << (8 - kNumLitSelectorBits);\nconst unsigned int kNumMatchSelectors = 3;\nconst unsigned int kNumSelectors = kNumLitSelectors + kNumMatchSelectors;\nconst unsigned int kNumLen3PosSymbolsMax = 24;\nconst unsigned int kNumLen4PosSymbolsMax = 36;\nconst unsigned int kNumLen5PosSymbolsMax = 42;\nconst unsigned int kNumLenSymbols = 27;\n\nconst unsigned int kNumSymbolsMax = kNumLitSymbols; // 64\n\nconst unsigned int kMatchMinLen = 3;\nconst unsigned int kNumSimplePosSlots = 4;\nconst unsigned int kNumSimpleLenSlots = 6;\n\nnamespace NRangeCoder {\n\nclass CDecoder\n{\n  UInt32 Low;\n  UInt32 Range;\n  UInt32 Code;\npublic:\n  CStreamBitDecoder Stream;\n  bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }\n  void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }\n  void ReleaseStream() { Stream.ReleaseStream(); }\n\n  void Init()\n  {\n    Stream.Init();\n    Low = 0;\n    Range = 0x10000;\n    Code = Stream.ReadBits(16);\n  }\n\n  void Finish()\n  {\n    // we need these extra two Bit_reads\n    Stream.ReadBit();\n    Stream.ReadBit();\n    Stream.Finish();\n  }\n\n  UInt64 GetProcessedSize() const { return Stream.GetProcessedSize(); }\n\n  UInt32 GetThreshold(UInt32 total) const\n  {\n    return ((Code + 1) * total - 1) / Range; // & 0xFFFF is not required;\n  }\n\n  void Decode(UInt32 start, UInt32 end, UInt32 total)\n  {\n    UInt32 high = Low + end * Range / total - 1;\n    UInt32 offset = start * Range / total;\n    Code -= offset;\n    Low += offset;\n    for (;;)\n    {\n      if ((Low & 0x8000) != (high & 0x8000))\n      {\n        if ((Low & 0x4000) == 0 || (high & 0x4000) != 0)\n          break;\n        Low &= 0x3FFF;\n        high |= 0x4000;\n      }\n      Low = (Low << 1) & 0xFFFF;\n      high = ((high << 1) | 1) & 0xFFFF;\n      Code = ((Code << 1) | Stream.ReadBit());\n    }\n    Range = high - Low + 1;\n  }\n};\n\nconst UInt16 kUpdateStep = 8;\nconst UInt16 kFreqSumMax = 3800;\nconst UInt16 kReorderCountStart = 4;\nconst UInt16 kReorderCount = 50;\n\nclass CModelDecoder\n{\n  unsigned int NumItems;\n  unsigned int ReorderCount;\n  UInt16 Freqs[kNumSymbolsMax + 1];\n  Byte Values[kNumSymbolsMax];\npublic:\n  void Init(unsigned int numItems)\n  {\n    NumItems = numItems;\n    ReorderCount = kReorderCountStart;\n    for(unsigned int i = 0; i < numItems; i++)\n    {\n      Freqs[i] = (UInt16)(numItems - i);\n      Values[i] = (Byte)i;\n    }\n    Freqs[numItems] = 0;\n  }\n  \n  unsigned int Decode(CDecoder *rangeDecoder)\n  {\n    UInt32 threshold = rangeDecoder->GetThreshold(Freqs[0]);\n    unsigned int i;\n    for (i = 1; Freqs[i] > threshold; i++);\n    rangeDecoder->Decode(Freqs[i], Freqs[i - 1], Freqs[0]);\n    unsigned int res = Values[--i];\n    do\n      Freqs[i] += kUpdateStep;\n    while(i-- != 0);\n\n    if (Freqs[0] > kFreqSumMax)\n    {\n      if (--ReorderCount == 0)\n      {\n        ReorderCount = kReorderCount;\n        for(i = 0; i < NumItems; i++)\n          Freqs[i] = (UInt16)(((Freqs[i] - Freqs[i + 1]) + 1) >> 1);\n        for(i = 0; i < NumItems - 1; i++)\n          for(unsigned int j = i + 1; j < NumItems; j++)\n            if (Freqs[i] < Freqs[j])\n            {\n              UInt16 tmpFreq = Freqs[i];\n              Byte tmpVal = Values[i];\n              Freqs[i] = Freqs[j];\n              Values[i] = Values[j];\n              Freqs[j] = tmpFreq;\n              Values[j] = tmpVal;\n            }\n        do\n          Freqs[i] = (UInt16)(Freqs[i] + Freqs[i + 1]);\n        while(i-- != 0);\n      }\n      else\n      {\n        i = NumItems - 1;\n        do\n        {\n          Freqs[i] >>= 1;\n          if (Freqs[i] <= Freqs[i + 1])\n            Freqs[i] = (UInt16)(Freqs[i + 1] + 1);\n        }\n        while(i-- != 0);\n      }\n    }\n    return res;\n  };\n};\n\n}\n\nclass CDecoder:\n  public ICompressCoder,\n  public ICompressSetInStream,\n  public ICompressSetOutStreamSize,\n  public CMyUnknownImp\n{\n  CLzOutWindow _outWindowStream;\n  NRangeCoder::CDecoder _rangeDecoder;\n\n  ///////////////////\n  // State\n  UInt64 _outSize;\n  // UInt64 _nowPos64;\n  int _remainLen; // -1 means end of stream. // -2 means need Init\n  UInt32 _rep0;\n\n  int _numDictBits;\n  UInt32 _dictionarySize;\n\n  NRangeCoder::CModelDecoder m_Selector;\n  NRangeCoder::CModelDecoder m_Literals[kNumLitSelectors];\n  NRangeCoder::CModelDecoder m_PosSlot[kNumMatchSelectors];\n  NRangeCoder::CModelDecoder m_LenSlot;\n\n  bool _keepHistory;\n  \n  void Init();\n  HRESULT CodeSpec(UInt32 size);\npublic:\n  MY_UNKNOWN_IMP2(\n      ICompressSetInStream,\n      ICompressSetOutStreamSize)\n\n  void ReleaseStreams()\n  {\n    _outWindowStream.ReleaseStream();\n    ReleaseInStream();\n  }\n\n  class CDecoderFlusher\n  {\n    CDecoder *_decoder;\n  public:\n    bool NeedFlush;\n    CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {}\n    ~CDecoderFlusher()\n    {\n      if (NeedFlush)\n        _decoder->Flush();\n      _decoder->ReleaseStreams();\n    }\n  };\n\n  HRESULT Flush() {  return _outWindowStream.Flush(); }\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  \n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetInStream)(ISequentialInStream *inStream);\n  STDMETHOD(ReleaseInStream)();\n  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);\n\n  void SetParams(int numDictBits)\n  {\n    _numDictBits = numDictBits;\n    _dictionarySize = (UInt32)1 << numDictBits;\n  }\n  void SetKeepHistory(bool keepHistory)\n  {\n    _keepHistory = keepHistory;\n  }\n\n  CDecoder(): _keepHistory(false) {}\n  virtual ~CDecoder() {}\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/RangeCoder.h",
    "content": "// Compress/RangeCoder.h\n\n#ifndef __COMPRESS_RANGE_CODER_H\n#define __COMPRESS_RANGE_CODER_H\n\n#include \"../Common/InBuffer.h\"\n#include \"../Common/OutBuffer.h\"\n\nnamespace NCompress {\nnamespace NRangeCoder {\n\nconst int kNumTopBits = 24;\nconst UInt32 kTopValue = (1 << kNumTopBits);\n\nclass CEncoder\n{\n  UInt32 _cacheSize;\n  Byte _cache;\npublic:\n  UInt64 Low;\n  UInt32 Range;\n  COutBuffer Stream;\n  bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }\n\n  void SetStream(ISequentialOutStream *stream) { Stream.SetStream(stream); }\n  void Init()\n  {\n    Stream.Init();\n    Low = 0;\n    Range = 0xFFFFFFFF;\n    _cacheSize = 1;\n    _cache = 0;\n  }\n\n  void FlushData()\n  {\n    // Low += 1;\n    for(int i = 0; i < 5; i++)\n      ShiftLow();\n  }\n\n  HRESULT FlushStream() { return Stream.Flush();  }\n\n  void ReleaseStream() { Stream.ReleaseStream(); }\n\n  void Encode(UInt32 start, UInt32 size, UInt32 total)\n  {\n    Low += start * (Range /= total);\n    Range *= size;\n    while (Range < kTopValue)\n    {\n      Range <<= 8;\n      ShiftLow();\n    }\n  }\n\n  void ShiftLow()\n  {\n    if ((UInt32)Low < (UInt32)0xFF000000 || (int)(Low >> 32) != 0)\n    {\n      Byte temp = _cache;\n      do\n      {\n        Stream.WriteByte((Byte)(temp + (Byte)(Low >> 32)));\n        temp = 0xFF;\n      }\n      while(--_cacheSize != 0);\n      _cache = (Byte)((UInt32)Low >> 24);\n    }\n    _cacheSize++;\n    Low = (UInt32)Low << 8;\n  }\n  \n  void EncodeDirectBits(UInt32 value, int numBits)\n  {\n    for (numBits--; numBits >= 0; numBits--)\n    {\n      Range >>= 1;\n      Low += Range & (0 - ((value >> numBits) & 1));\n      if (Range < kTopValue)\n      {\n        Range <<= 8;\n        ShiftLow();\n      }\n    }\n  }\n\n  void EncodeBit(UInt32 size0, UInt32 numTotalBits, UInt32 symbol)\n  {\n    UInt32 newBound = (Range >> numTotalBits) * size0;\n    if (symbol == 0)\n      Range = newBound;\n    else\n    {\n      Low += newBound;\n      Range -= newBound;\n    }\n    while (Range < kTopValue)\n    {\n      Range <<= 8;\n      ShiftLow();\n    }\n  }\n\n  UInt64 GetProcessedSize() {  return Stream.GetProcessedSize() + _cacheSize + 4; }\n};\n\nclass CDecoder\n{\npublic:\n  CInBuffer Stream;\n  UInt32 Range;\n  UInt32 Code;\n  bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }\n\n  void Normalize()\n  {\n    while (Range < kTopValue)\n    {\n      Code = (Code << 8) | Stream.ReadByte();\n      Range <<= 8;\n    }\n  }\n  \n  void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }\n  void Init()\n  {\n    Stream.Init();\n    Code = 0;\n    Range = 0xFFFFFFFF;\n    for(int i = 0; i < 5; i++)\n      Code = (Code << 8) | Stream.ReadByte();\n  }\n\n  void ReleaseStream() { Stream.ReleaseStream(); }\n\n  UInt32 GetThreshold(UInt32 total)\n  {\n    return (Code) / ( Range /= total);\n  }\n\n  void Decode(UInt32 start, UInt32 size)\n  {\n    Code -= start * Range;\n    Range *= size;\n    Normalize();\n  }\n\n  UInt32 DecodeDirectBits(int numTotalBits)\n  {\n    UInt32 range = Range;\n    UInt32 code = Code;\n    UInt32 result = 0;\n    for (int i = numTotalBits; i != 0; i--)\n    {\n      range >>= 1;\n      /*\n      result <<= 1;\n      if (code >= range)\n      {\n        code -= range;\n        result |= 1;\n      }\n      */\n      UInt32 t = (code - range) >> 31;\n      code -= range & (t - 1);\n      result = (result << 1) | (1 - t);\n\n      if (range < kTopValue)\n      {\n        code = (code << 8) | Stream.ReadByte();\n        range <<= 8;\n      }\n    }\n    Range = range;\n    Code = code;\n    return result;\n  }\n\n  UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits)\n  {\n    UInt32 newBound = (Range >> numTotalBits) * size0;\n    UInt32 symbol;\n    if (Code < newBound)\n    {\n      symbol = 0;\n      Range = newBound;\n    }\n    else\n    {\n      symbol = 1;\n      Code -= newBound;\n      Range -= newBound;\n    }\n    Normalize();\n    return symbol;\n  }\n\n  UInt64 GetProcessedSize() {return Stream.GetProcessedSize(); }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/RangeCoderBit.h",
    "content": "// Compress/RangeCoderBit.h\n\n#ifndef __COMPRESS_RANGE_CODER_BIT_H\n#define __COMPRESS_RANGE_CODER_BIT_H\n\n#include \"RangeCoder.h\"\n\nnamespace NCompress {\nnamespace NRangeCoder {\n\nconst int kNumBitModelTotalBits  = 11;\nconst UInt32 kBitModelTotal = (1 << kNumBitModelTotalBits);\n\nconst int kNumMoveReducingBits = 4;\n\nconst int kNumBitPriceShiftBits = 4;\nconst UInt32 kBitPrice = 1 << kNumBitPriceShiftBits;\n\nextern UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];\n\ntemplate <int numMoveBits>\nclass CBitModel\n{\npublic:\n  UInt32 Prob;\n  void UpdateModel(UInt32 symbol)\n  {\n    /*\n    Prob -= (Prob + ((symbol - 1) & ((1 << numMoveBits) - 1))) >> numMoveBits;\n    Prob += (1 - symbol) << (kNumBitModelTotalBits - numMoveBits);\n    */\n    if (symbol == 0)\n      Prob += (kBitModelTotal - Prob) >> numMoveBits;\n    else\n      Prob -= (Prob) >> numMoveBits;\n  }\npublic:\n  void Init() { Prob = kBitModelTotal / 2; }\n};\n\ntemplate <int numMoveBits>\nclass CBitEncoder: public CBitModel<numMoveBits>\n{\npublic:\n  void Encode(CEncoder *encoder, UInt32 symbol)\n  {\n    /*\n    encoder->EncodeBit(this->Prob, kNumBitModelTotalBits, symbol);\n    this->UpdateModel(symbol);\n    */\n    UInt32 newBound = (encoder->Range >> kNumBitModelTotalBits) * this->Prob;\n    if (symbol == 0)\n    {\n      encoder->Range = newBound;\n      this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;\n    }\n    else\n    {\n      encoder->Low += newBound;\n      encoder->Range -= newBound;\n      this->Prob -= (this->Prob) >> numMoveBits;\n    }\n    if (encoder->Range < kTopValue)\n    {\n      encoder->Range <<= 8;\n      encoder->ShiftLow();\n    }\n  }\n  UInt32 GetPrice(UInt32 symbol) const\n  {\n    return ProbPrices[(this->Prob ^ ((-(int)symbol)) & (kBitModelTotal - 1)) >> kNumMoveReducingBits];\n  }\n  UInt32 GetPrice0() const { return ProbPrices[this->Prob >> kNumMoveReducingBits]; }\n  UInt32 GetPrice1() const { return ProbPrices[(this->Prob ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]; }\n};\n\n\ntemplate <int numMoveBits>\nclass CBitDecoder: public CBitModel<numMoveBits>\n{\npublic:\n  UInt32 Decode(CDecoder *decoder)\n  {\n    UInt32 newBound = (decoder->Range >> kNumBitModelTotalBits) * this->Prob;\n    if (decoder->Code < newBound)\n    {\n      decoder->Range = newBound;\n      this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;\n      if (decoder->Range < kTopValue)\n      {\n        decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();\n        decoder->Range <<= 8;\n      }\n      return 0;\n    }\n    else\n    {\n      decoder->Range -= newBound;\n      decoder->Code -= newBound;\n      this->Prob -= (this->Prob) >> numMoveBits;\n      if (decoder->Range < kTopValue)\n      {\n        decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();\n        decoder->Range <<= 8;\n      }\n      return 1;\n    }\n  }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar/makefile",
    "content": "PROG=../../../../bin/Codecs/Rar29.so\n\nLOCAL_FLAGS=$(CC_SHARED)\n\nMY_WINDOWS=\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLOCAL_SHARED=$(LINK_SHARED)\nLIBS=$(LOCAL_LIBS)\n\nOBJS = \\\nMyWindows.o \\\nCRC.o\\\nMyVector.o\\\nCodecExports.o \\\nDllExports.o \\\nRar1Decoder.o \\\nRar2Decoder.o \\\nRar3Decoder.o \\\nRar3Vm.o \\\nRarCodecsRegister.o \\\n$(OBJ_CRC32) \\\nInBuffer.o \\\nOutBuffer.o \\\nStreamUtils.o \\\nLzOutWindow.o\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar/makefile.depend",
    "content": "CRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/../../C/7zCrc.h ../../../Common/../../C/Types.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nInBuffer.o: ../../Common/InBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/InBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nOutBuffer.o: ../../Common/OutBuffer.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/OutBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../../Common/../../../C/Alloc.h\nLzOutWindow.o: ../LzOutWindow.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../LzOutWindow.h ../../IStream.h ../../../Common/MyUnknown.h \\\n  ../../../Common/MyWindows.h ../../../Common/Types.h ../../IDecl.h \\\n  ../../Common/OutBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../../Common/MyException.h\nCodecExports.o: ../CodecExports.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Common/RegisterCodec.h \\\n  ../../Common/../Common/MethodId.h \\\n  ../../Common/../Common/../../Common/Types.h ../../ICoder.h \\\n  ../../IStream.h ../../../Common/MyUnknown.h ../../../Common/Types.h \\\n  ../../IDecl.h\nDllExports.o: ../DllExports.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyInitGuid.h ../../ICoder.h ../../IStream.h \\\n  ../../../Common/MyUnknown.h ../../../Common/MyWindows.h \\\n  ../../../Common/Types.h ../../IDecl.h ../../Common/RegisterCodec.h \\\n  ../../Common/../Common/MethodId.h \\\n  ../../Common/../Common/../../Common/Types.h\nRar1Decoder.o: ../Rar1Decoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Rar1Decoder.h ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../ICoder.h ../../IStream.h ../../../Common/MyUnknown.h \\\n  ../../../Common/Types.h ../../IDecl.h ../../Common/InBuffer.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h \\\n  ../../Common/../../Common/MyWindows.h ../BitmDecoder.h ../../IStream.h \\\n  ../HuffmanDecoder.h ../../../Common/Types.h ../LzOutWindow.h \\\n  ../../Common/OutBuffer.h\nRar2Decoder.o: ../Rar2Decoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Rar2Decoder.h ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../ICoder.h ../../IStream.h ../../../Common/MyUnknown.h \\\n  ../../../Common/Types.h ../../IDecl.h ../../Common/InBuffer.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h \\\n  ../../Common/../../Common/MyWindows.h ../BitmDecoder.h ../../IStream.h \\\n  ../HuffmanDecoder.h ../../../Common/Types.h ../LzOutWindow.h \\\n  ../../Common/OutBuffer.h\nRar3Decoder.o: ../Rar3Decoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../Rar3Decoder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../ICoder.h ../../IStream.h \\\n  ../../Common/InBuffer.h ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h ../BitmDecoder.h \\\n  ../../IStream.h ../HuffmanDecoder.h ../../../Common/Types.h \\\n  ../PpmdDecode.h ../PpmdContext.h ../PpmdSubAlloc.h \\\n  ../../../../C/Alloc.h ../PpmdType.h ../RangeCoder.h \\\n  ../../Common/OutBuffer.h ../Rar3Vm.h ../../../../C/CpuArch.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Types.h\nRar3Vm.o: ../Rar3Vm.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../../C/7zCrc.h ../../../../C/Types.h ../../../../C/Alloc.h \\\n  ../Rar3Vm.h ../../../../C/CpuArch.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h\nRarCodecsRegister.o: ../RarCodecsRegister.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/RegisterCodec.h ../../Common/../Common/MethodId.h \\\n  ../../Common/../Common/../../Common/Types.h ../Rar1Decoder.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h ../../ICoder.h \\\n  ../../IStream.h ../../../Common/MyUnknown.h ../../../Common/Types.h \\\n  ../../IDecl.h ../../Common/InBuffer.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyCom.h \\\n  ../../Common/../../Common/MyException.h \\\n  ../../Common/../../Common/MyWindows.h ../BitmDecoder.h ../../IStream.h \\\n  ../HuffmanDecoder.h ../../../Common/Types.h ../LzOutWindow.h \\\n  ../../Common/OutBuffer.h ../Rar2Decoder.h ../Rar3Decoder.h \\\n  ../PpmdDecode.h ../PpmdContext.h ../PpmdSubAlloc.h \\\n  ../../../../C/Alloc.h ../PpmdType.h ../RangeCoder.h ../Rar3Vm.h \\\n  ../../../../C/CpuArch.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar/makefile.list",
    "content": "SRCS=\\\n ../../../Common/CRC.cpp \\\n ../../../Common/MyWindows.cpp \\\n ../../../Common/MyVector.cpp \\\n ../../Common/InBuffer.cpp \\\n ../../Common/StreamUtils.cpp \\\n ../../Common/OutBuffer.cpp \\\n../LzOutWindow.cpp \\\n../CodecExports.cpp \\\n../DllExports.cpp \\\n../Rar1Decoder.cpp \\\n../Rar2Decoder.cpp \\\n../Rar3Decoder.cpp \\\n../Rar3Vm.cpp \\\n../RarCodecsRegister.cpp\n\nSRCS_C=\n\nCRC.o : ../../../Common/CRC.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../../Common/CRC.cpp\nMyWindows.o : ../../../Common/MyWindows.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../../Common/MyWindows.cpp\nMyVector.o : ../../../Common/MyVector.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../../Common/MyVector.cpp\nDllExports.o : ../DllExports.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../DllExports.cpp\nCodecExports.o : ../CodecExports.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../CodecExports.cpp\nInBuffer.o : ../../Common/InBuffer.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../Common/InBuffer.cpp\nLzOutWindow.o : ../LzOutWindow.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../LzOutWindow.cpp\nStreamUtils.o : ../../Common/StreamUtils.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../Common/StreamUtils.cpp\nOutBuffer.o : ../../Common/OutBuffer.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../Common/OutBuffer.cpp\nRar1Decoder.o : ../Rar1Decoder.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar1Decoder.cpp\nRar2Decoder.o : ../Rar2Decoder.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar2Decoder.cpp\nRar3Decoder.o : ../Rar3Decoder.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar3Decoder.cpp\nRar3Vm.o : ../Rar3Vm.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar3Vm.cpp\nRarCodecsRegister.o : ../RarCodecsRegister.cpp\n\t$(CXX) $(CC_SHARED) $(CXXFLAGS) ../RarCodecsRegister.cpp\n# CRC32, C version\n7zCrc.o : ../../../../C/7zCrc.c\n\t$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/7zCrc.c\n# CRC32, ASM version\n7zCrcT8.o : ../../../../C/7zCrcT8.c\n\t$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/7zCrcT8.c\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar1Decoder.cpp",
    "content": "// Rar1Decoder.cpp\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n \n#include \"StdAfx.h\"\n\n#include \"Rar1Decoder.h\"\n\nnamespace NCompress {\nnamespace NRar1 {\n\nstatic UInt32 PosL1[]={0,0,0,2,3,5,7,11,16,20,24,32,32, 256};\nstatic UInt32 PosL2[]={0,0,0,0,5,7,9,13,18,22,26,34,36, 256};\nstatic UInt32 PosHf0[]={0,0,0,0,0,8,16,24,33,33,33,33,33, 257};\nstatic UInt32 PosHf1[]={0,0,0,0,0,0,4,44,60,76,80,80,127, 257};\nstatic UInt32 PosHf2[]={0,0,0,0,0,0,2,7,53,117,233, 257,0};\nstatic UInt32 PosHf3[]={0,0,0,0,0,0,0,2,16,218,251, 257,0};\nstatic UInt32 PosHf4[]={0,0,0,0,0,0,0,0,0,255, 257,0,0};\n\nstatic const UInt32 kHistorySize = (1 << 16);\n\nclass CCoderReleaser\n{\n  CDecoder *m_Coder;\npublic:\n  CCoderReleaser(CDecoder *coder): m_Coder(coder) {}\n  ~CCoderReleaser() { m_Coder->ReleaseStreams(); }\n};\n\nCDecoder::CDecoder(): m_IsSolid(false) { }\n\nvoid CDecoder::InitStructures()\n{\n  for(int i = 0; i < kNumRepDists; i++)\n    m_RepDists[i] = 0;\n  m_RepDistPtr = 0;\n  LastLength = 0;\n  LastDist = 0;\n}\n\nUInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }\n\nHRESULT CDecoder::CopyBlock(UInt32 distance, UInt32 len)\n{\n  m_UnpackSize -= len;\n  return m_OutWindowStream.CopyBlock(distance, len) ? S_OK : S_FALSE;\n}\n\n\nUInt32 CDecoder::DecodeNum(const UInt32 *posTab)\n{\n  UInt32 startPos = 2;\n  UInt32 num = m_InBitStream.GetValue(12);\n  for (;;)\n  {\n    UInt32 cur = (posTab[startPos + 1] - posTab[startPos]) << (12 - startPos);\n    if (num < cur)\n      break;\n    startPos++;\n    num -= cur;\n  }\n  m_InBitStream.MovePos(startPos);\n  return((num >> (12 - startPos)) + posTab[startPos]);\n}\n\nstatic Byte kShortLen1[]  = {1,3,4,4,5,6,7,8,8,4,4,5,6,6 };\nstatic Byte kShortLen1a[] = {1,4,4,4,5,6,7,8,8,4,4,5,6,6,4 };\nstatic Byte kShortLen2[]  = {2,3,3,3,4,4,5,6,6,4,4,5,6,6 };\nstatic Byte kShortLen2a[] = {2,3,3,4,4,4,5,6,6,4,4,5,6,6,4 };\nstatic UInt32 kShortXor1[] = {0,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xc0,0x80,0x90,0x98,0x9c,0xb0};\nstatic UInt32 kShortXor2[] = {0,0x40,0x60,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xc0,0x80,0x90,0x98,0x9c,0xb0};\n\nHRESULT CDecoder::ShortLZ()\n{\n  UInt32 len, saveLen, dist;\n  int distancePlace;\n  Byte *kShortLen;\n  const UInt32 *kShortXor;\n  NumHuf = 0;\n\n  if (LCount == 2)\n  {\n    if (ReadBits(1))\n      return CopyBlock(LastDist, LastLength);\n    LCount = 0;\n  }\n\n  UInt32 bitField = m_InBitStream.GetValue(8);\n\n  if (AvrLn1 < 37)\n  {\n    kShortLen = Buf60 ? kShortLen1a : kShortLen1;\n    kShortXor = kShortXor1;\n  }\n  else\n  {\n    kShortLen = Buf60 ? kShortLen2a : kShortLen2;\n    kShortXor = kShortXor2;\n  }\n\n  for (len = 0; ((bitField ^ kShortXor[len]) & (~(0xff >> kShortLen[len]))) != 0; len++);\n  m_InBitStream.MovePos(kShortLen[len]);\n\n  if (len >= 9)\n  {\n    if (len == 9)\n    {\n      LCount++;\n      return CopyBlock(LastDist, LastLength);\n    }\n    if (len == 14)\n    {\n      LCount = 0;\n      len = DecodeNum(PosL2) + 5;\n      dist = 0x8000 + ReadBits(15) - 1;\n      LastLength = len;\n      LastDist = dist;\n      return CopyBlock(dist, len);\n    }\n\n    LCount = 0;\n    saveLen = len;\n    dist = m_RepDists[(m_RepDistPtr - (len - 9)) & 3];\n    len = DecodeNum(PosL1) + 2;\n    if (len == 0x101 && saveLen == 10)\n    {\n      Buf60 ^= 1;\n      return S_OK;\n    }\n    if (dist >= 256)\n      len++;\n    if (dist >= MaxDist3 - 1)\n      len++;\n  }\n  else\n  {\n    LCount = 0;\n    AvrLn1 += len;\n    AvrLn1 -= AvrLn1 >> 4;\n    \n    distancePlace = DecodeNum(PosHf2) & 0xff;\n    dist = ChSetA[distancePlace];\n    if (--distancePlace != -1)\n    {\n      PlaceA[dist]--;\n      UInt32 lastDistance = ChSetA[distancePlace];\n      PlaceA[lastDistance]++;\n      ChSetA[distancePlace + 1] = lastDistance;\n      ChSetA[distancePlace] = dist;\n    }\n    len += 2;\n  }\n  m_RepDists[m_RepDistPtr++] = dist;\n  m_RepDistPtr &= 3;\n  LastLength = len;\n  LastDist = dist;\n  return CopyBlock(dist, len);\n}\n\n\nHRESULT CDecoder::LongLZ()\n{\n  UInt32 len;\n  UInt32 dist;\n  UInt32 distancePlace, newDistancePlace;\n  UInt32 oldAvr2, oldAvr3;\n\n  NumHuf = 0;\n  Nlzb += 16;\n  if (Nlzb > 0xff)\n  {\n    Nlzb = 0x90;\n    Nhfb >>= 1;\n  }\n  oldAvr2=AvrLn2;\n\n  if (AvrLn2 >= 122)\n    len = DecodeNum(PosL2);\n  else if (AvrLn2 >= 64)\n    len = DecodeNum(PosL1);\n  else\n  {\n    UInt32 bitField = m_InBitStream.GetValue(16);\n    if (bitField < 0x100)\n    {\n      len = bitField;\n      m_InBitStream.MovePos(16);\n    }\n    else\n    {\n      for (len = 0; ((bitField << len) & 0x8000) == 0; len++)\n        ;\n      m_InBitStream.MovePos(len + 1);\n    }\n  }\n\n  AvrLn2 += len;\n  AvrLn2 -= AvrLn2 >> 5;\n\n  if (AvrPlcB > 0x28ff)\n    distancePlace = DecodeNum(PosHf2);\n  else if (AvrPlcB > 0x6ff)\n    distancePlace = DecodeNum(PosHf1);\n  else\n    distancePlace = DecodeNum(PosHf0);\n\n  AvrPlcB += distancePlace;\n  AvrPlcB -= AvrPlcB >> 8;\n  for (;;)\n  {\n    dist = ChSetB[distancePlace & 0xff];\n    newDistancePlace = NToPlB[dist++ & 0xff]++;\n    if (!(dist & 0xff))\n      CorrHuff(ChSetB,NToPlB);\n    else\n      break;\n  }\n\n  ChSetB[distancePlace] = ChSetB[newDistancePlace];\n  ChSetB[newDistancePlace] = dist;\n\n  dist = ((dist & 0xff00) >> 1) | ReadBits(7);\n\n  oldAvr3 = AvrLn3;\n  if (len != 1 && len != 4)\n    if (len == 0 && dist <= MaxDist3)\n    {\n      AvrLn3++;\n      AvrLn3 -= AvrLn3 >> 8;\n    }\n    else\n      if (AvrLn3 > 0)\n        AvrLn3--;\n  len += 3;\n  if (dist >= MaxDist3)\n    len++;\n  if (dist <= 256)\n    len += 8;\n  if (oldAvr3 > 0xb0 || AvrPlc >= 0x2a00 && oldAvr2 < 0x40)\n    MaxDist3 = 0x7f00;\n  else\n    MaxDist3 = 0x2001;\n  m_RepDists[m_RepDistPtr++] = --dist;\n  m_RepDistPtr &= 3;\n  LastLength = len;\n  LastDist = dist;\n  return CopyBlock(dist, len);\n}\n\n\nHRESULT CDecoder::HuffDecode()\n{\n  UInt32 curByte, newBytePlace;\n  UInt32 len;\n  UInt32 dist;\n  int bytePlace;\n\n  if      (AvrPlc > 0x75ff)  bytePlace = DecodeNum(PosHf4);\n  else if (AvrPlc > 0x5dff)  bytePlace = DecodeNum(PosHf3);\n  else if (AvrPlc > 0x35ff)  bytePlace = DecodeNum(PosHf2);\n  else if (AvrPlc > 0x0dff)  bytePlace = DecodeNum(PosHf1);\n  else                       bytePlace = DecodeNum(PosHf0);\n  if (StMode)\n  {\n    if (--bytePlace == -1)\n    {\n      if (ReadBits(1))\n      {\n        NumHuf = StMode = 0;\n        return S_OK;\n      }\n      else\n      {\n        len = (ReadBits(1)) ? 4 : 3;\n        dist = DecodeNum(PosHf2);\n        dist = (dist << 5) | ReadBits(5);\n        return CopyBlock(dist - 1, len);\n      }\n    }\n  }\n  else if (NumHuf++ >= 16 && FlagsCnt == 0)\n    StMode = 1;\n  bytePlace &= 0xff;\n  AvrPlc += bytePlace;\n  AvrPlc -= AvrPlc >> 8;\n  Nhfb+=16;\n  if (Nhfb > 0xff)\n  {\n    Nhfb=0x90;\n    Nlzb >>= 1;\n  }\n\n  m_UnpackSize --;\n  m_OutWindowStream.PutByte((Byte)(ChSet[bytePlace] >> 8));\n\n  for (;;)\n  {\n    curByte = ChSet[bytePlace];\n    newBytePlace = NToPl[curByte++ & 0xff]++;\n    if ((curByte & 0xff) > 0xa1)\n      CorrHuff(ChSet, NToPl);\n    else\n      break;\n  }\n\n  ChSet[bytePlace] = ChSet[newBytePlace];\n  ChSet[newBytePlace] = curByte;\n  return S_OK;\n}\n\n\nvoid CDecoder::GetFlagsBuf()\n{\n  UInt32 flags, newFlagsPlace;\n  UInt32 flagsPlace = DecodeNum(PosHf2);\n\n  for (;;)\n  {\n    flags = ChSetC[flagsPlace];\n    FlagBuf = flags >> 8;\n    newFlagsPlace = NToPlC[flags++ & 0xff]++;\n    if ((flags & 0xff) != 0)\n      break;\n    CorrHuff(ChSetC, NToPlC);\n  }\n\n  ChSetC[flagsPlace] = ChSetC[newFlagsPlace];\n  ChSetC[newFlagsPlace] = flags;\n}\n\nvoid CDecoder::InitData()\n{\n  if (!m_IsSolid)\n  {\n    AvrPlcB = AvrLn1 = AvrLn2 = AvrLn3 = NumHuf = Buf60 = 0;\n    AvrPlc = 0x3500;\n    MaxDist3 = 0x2001;\n    Nhfb = Nlzb = 0x80;\n  }\n  FlagsCnt = 0;\n  FlagBuf = 0;\n  StMode = 0;\n  LCount = 0;\n}\n\nvoid CDecoder::CorrHuff(UInt32 *CharSet,UInt32 *NumToPlace)\n{\n  int i;\n  for (i = 7; i >= 0; i--)\n    for (int j = 0; j < 32; j++, CharSet++)\n      *CharSet = (*CharSet & ~0xff) | i;\n  memset(NumToPlace, 0, sizeof(NToPl));\n  for (i = 6; i >= 0; i--)\n    NumToPlace[i] = (7 - i) * 32;\n}\n\nvoid CDecoder::InitHuff()\n{\n  for (UInt32 i = 0; i < 256; i++)\n  {\n    Place[i] = PlaceA[i] = PlaceB[i] = i;\n    PlaceC[i] = (~i + 1) & 0xff;\n    ChSet[i] = ChSetB[i] = i << 8;\n    ChSetA[i] = i;\n    ChSetC[i] = ((~i + 1) & 0xff) << 8;\n  }\n  memset(NToPl, 0, sizeof(NToPl));\n  memset(NToPlB, 0, sizeof(NToPlB));\n  memset(NToPlC, 0, sizeof(NToPlC));\n  CorrHuff(ChSetB, NToPlB);\n}\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo * /* progress */)\n{\n  if (inSize == NULL || outSize == NULL)\n    return E_INVALIDARG;\n\n  if (!m_OutWindowStream.Create(kHistorySize))\n    return E_OUTOFMEMORY;\n  if (!m_InBitStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n\n  m_UnpackSize = (Int64)*outSize;\n  m_OutWindowStream.SetStream(outStream);\n  m_OutWindowStream.Init(m_IsSolid);\n  m_InBitStream.SetStream(inStream);\n  m_InBitStream.Init();\n\n  CCoderReleaser coderReleaser(this);\n  InitData();\n  if (!m_IsSolid)\n  {\n    InitStructures();\n    InitHuff();\n  }\n  if (m_UnpackSize > 0)\n  {\n    GetFlagsBuf();\n    FlagsCnt = 8;\n  }\n\n  while (m_UnpackSize > 0)\n  {\n    if (StMode)\n    {\n      RINOK(HuffDecode());\n      continue;\n    }\n\n    if (--FlagsCnt < 0)\n    {\n      GetFlagsBuf();\n      FlagsCnt=7;\n    }\n\n    if (FlagBuf & 0x80)\n    {\n      FlagBuf <<= 1;\n      if (Nlzb > Nhfb)\n      {\n        RINOK(LongLZ());\n      }\n      else\n      {\n        RINOK(HuffDecode());\n      }\n    }\n    else\n    {\n      FlagBuf <<= 1;\n      if (--FlagsCnt < 0)\n      {\n        GetFlagsBuf();\n        FlagsCnt = 7;\n      }\n      if (FlagBuf & 0x80)\n      {\n        FlagBuf <<= 1;\n        if (Nlzb > Nhfb)\n        {\n          RINOK(HuffDecode());\n        }\n        else\n        {\n          RINOK(LongLZ());\n        }\n      }\n      else\n      {\n        FlagBuf <<= 1;\n        RINOK(ShortLZ());\n      }\n    }\n  }\n  if (m_UnpackSize < 0)\n    return S_FALSE;\n  return m_OutWindowStream.Flush();\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  return CodeReal(inStream, outStream, inSize, outSize, progress); \n}\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  if (size < 1)\n    return E_INVALIDARG;\n  m_IsSolid = (data[0] != 0);\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar1Decoder.h",
    "content": "// Rar1Decoder.h\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n\n#ifndef __COMPRESS_RAR1_DECODER_H\n#define __COMPRESS_RAR1_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitmDecoder.h\"\n#include \"HuffmanDecoder.h\"\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NRar1 {\n\nconst UInt32 kNumRepDists = 4;\n\ntypedef NBitm::CDecoder<CInBuffer> CBitDecoder;\n\nclass CDecoder :\n  public ICompressCoder,\n  public ICompressSetDecoderProperties2,\n  public CMyUnknownImp\n{\npublic:\n  CLzOutWindow m_OutWindowStream;\n  CBitDecoder m_InBitStream;\n\n  UInt32 m_RepDists[kNumRepDists];\n  UInt32 m_RepDistPtr;\n\n  UInt32 LastDist;\n  UInt32 LastLength;\n\n  Int64 m_UnpackSize;\n  bool m_IsSolid;\n\n  UInt32 ReadBits(int numBits);\n  HRESULT CopyBlock(UInt32 distance, UInt32 len);\n\n  UInt32 DecodeNum(const UInt32 *posTab);\n  HRESULT ShortLZ();\n  HRESULT LongLZ();\n  HRESULT HuffDecode();\n  void GetFlagsBuf();\n  void InitData();\n  void InitHuff();\n  void CorrHuff(UInt32 *CharSet, UInt32 *NumToPlace);\n  void OldUnpWriteBuf();\n  \n  UInt32 ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256];\n  UInt32 Place[256],PlaceA[256],PlaceB[256],PlaceC[256];\n  UInt32 NToPl[256],NToPlB[256],NToPlC[256];\n  UInt32 FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3;\n  int Buf60,NumHuf,StMode,LCount,FlagsCnt;\n  UInt32 Nhfb,Nlzb,MaxDist3;\n\n  void InitStructures();\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\npublic:\n  CDecoder();\n\n  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)\n\n  void ReleaseStreams()\n  {\n    m_OutWindowStream.ReleaseStream();\n    m_InBitStream.ReleaseStream();\n  }\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar2Decoder.cpp",
    "content": "// Rar2Decoder.cpp\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n \n#include \"StdAfx.h\"\n\n#include \"Rar2Decoder.h\"\n\nnamespace NCompress {\nnamespace NRar2 {\n\nnamespace NMultimedia {\n\nByte CFilter::Decode(int &channelDelta, Byte deltaByte)\n{\n  D4 = D3;\n  D3 = D2;\n  D2 = LastDelta - D1;\n  D1 = LastDelta;\n  int predictedValue = ((8 * LastChar + K1 * D1 + K2 * D2 + K3 * D3 + K4 * D4 + K5 * channelDelta) >> 3);\n\n  Byte realValue = (Byte)(predictedValue - deltaByte);\n  int i = ((int)(signed char)deltaByte) << 3;\n\n  Dif[0] += abs(i);\n  Dif[1] += abs(i - D1);\n  Dif[2] += abs(i + D1);\n  Dif[3] += abs(i - D2);\n  Dif[4] += abs(i + D2);\n  Dif[5] += abs(i - D3);\n  Dif[6] += abs(i + D3);\n  Dif[7] += abs(i - D4);\n  Dif[8] += abs(i + D4);\n  Dif[9] += abs(i - channelDelta);\n  Dif[10] += abs(i + channelDelta);\n\n  channelDelta = LastDelta = (signed char)(realValue - LastChar);\n  LastChar = realValue;\n\n  if (((++ByteCount) & 0x1F) == 0)\n  {\n    UInt32 minDif = Dif[0];\n    UInt32 numMinDif = 0;\n    Dif[0] = 0;\n    for (i = 1; i < sizeof(Dif) / sizeof(Dif[0]); i++)\n    {\n      if (Dif[i] < minDif)\n      {\n        minDif = Dif[i];\n        numMinDif = i;\n      }\n      Dif[i] = 0;\n    }\n    switch(numMinDif)\n    {\n      case 1: if (K1 >= -16) K1--; break;\n      case 2: if (K1 <   16) K1++; break;\n      case 3: if (K2 >= -16) K2--; break;\n      case 4: if (K2 <   16) K2++; break;\n      case 5: if (K3 >= -16) K3--; break;\n      case 6: if (K3 <   16) K3++; break;\n      case 7: if (K4 >= -16) K4--; break;\n      case 8: if (K4 <   16) K4++; break;\n      case 9: if (K5 >= -16) K5--; break;\n      case 10:if (K5 <   16) K5++; break;\n    }\n  }\n  return realValue;\n}\n}\n\nstatic const char *kNumberErrorMessage = \"Number error\";\n\nstatic const UInt32 kHistorySize = 1 << 20;\n\nstatic const int kNumStats = 11;\n\nstatic const UInt32 kWindowReservSize = (1 << 22) + 256;\n\nCDecoder::CDecoder():\n  m_IsSolid(false)\n{\n}\n\nvoid CDecoder::InitStructures()\n{\n  m_MmFilter.Init();\n  for(int i = 0; i < kNumRepDists; i++)\n    m_RepDists[i] = 0;\n  m_RepDistPtr = 0;\n  m_LastLength = 0;\n  memset(m_LastLevels, 0, kMaxTableSize);\n}\n\nUInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }\n\n#define RIF(x) { if (!(x)) return false; }\n\nbool CDecoder::ReadTables(void)\n{\n  Byte levelLevels[kLevelTableSize];\n  Byte newLevels[kMaxTableSize];\n  m_AudioMode = (ReadBits(1) == 1);\n\n  if (ReadBits(1) == 0)\n    memset(m_LastLevels, 0, kMaxTableSize);\n  int numLevels;\n  if (m_AudioMode)\n  {\n    m_NumChannels = ReadBits(2) + 1;\n    if (m_MmFilter.CurrentChannel >= m_NumChannels)\n      m_MmFilter.CurrentChannel = 0;\n    numLevels = m_NumChannels * kMMTableSize;\n  }\n  else\n    numLevels = kHeapTablesSizesSum;\n \n  int i;\n  for (i = 0; i < kLevelTableSize; i++)\n    levelLevels[i] = (Byte)ReadBits(4);\n  RIF(m_LevelDecoder.SetCodeLengths(levelLevels));\n  i = 0;\n  while (i < numLevels)\n  {\n    UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);\n    if (number < kTableDirectLevels)\n    {\n      newLevels[i] = (Byte)((number + m_LastLevels[i]) & kLevelMask);\n      i++;\n    }\n    else\n    {\n      if (number == kTableLevelRepNumber)\n      {\n        int t = ReadBits(2) + 3;\n        for (int reps = t; reps > 0 && i < numLevels ; reps--, i++)\n          newLevels[i] = newLevels[i - 1];\n      }\n      else\n      {\n        int num;\n        if (number == kTableLevel0Number)\n          num = ReadBits(3) + 3;\n        else if (number == kTableLevel0Number2)\n          num = ReadBits(7) + 11;\n        else\n          return false;\n        for (;num > 0 && i < numLevels; num--)\n          newLevels[i++] = 0;\n      }\n    }\n  }\n  if (m_AudioMode)\n    for (i = 0; i < m_NumChannels; i++)\n    {\n      RIF(m_MMDecoders[i].SetCodeLengths(&newLevels[i * kMMTableSize]));\n    }\n  else\n  {\n    RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));\n    RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));\n    RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));\n  }\n  memcpy(m_LastLevels, newLevels, kMaxTableSize);\n  return true;\n}\n\nbool CDecoder::ReadLastTables()\n{\n  // it differs a little from pure RAR sources;\n  // UInt64 ttt = m_InBitStream.GetProcessedSize() + 2;\n  // + 2 works for: return 0xFF; in CInBuffer::ReadByte.\n  if (m_InBitStream.GetProcessedSize() + 7 <= m_PackSize) // test it: probably incorrect;\n  // if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;\n    if (m_AudioMode)\n    {\n      UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);\n      if (symbol == 256)\n        return ReadTables();\n      if (symbol >= kMMTableSize)\n        return false;\n    }\n    else\n    {\n      UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);\n      if (number == kReadTableNumber)\n        return ReadTables();\n      if (number >= kMainTableSize)\n        return false;\n    }\n  return true;\n}\n\nclass CCoderReleaser\n{\n  CDecoder *m_Coder;\npublic:\n  CCoderReleaser(CDecoder *coder): m_Coder(coder) {}\n  ~CCoderReleaser()\n  {\n    m_Coder->ReleaseStreams();\n  }\n};\n\nbool CDecoder::DecodeMm(UInt32 pos)\n{\n  while (pos-- > 0)\n  {\n    UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);\n    if (symbol == 256)\n      return true;\n    if (symbol >= kMMTableSize)\n      return false;\n    /*\n    Byte byPredict = m_Predictor.Predict();\n    Byte byReal = (Byte)(byPredict - (Byte)symbol);\n    m_Predictor.Update(byReal, byPredict);\n    */\n    Byte byReal = m_MmFilter.Decode((Byte)symbol);\n    m_OutWindowStream.PutByte(byReal);\n    if (++m_MmFilter.CurrentChannel == m_NumChannels)\n      m_MmFilter.CurrentChannel = 0;\n  }\n  return true;\n}\n\nbool CDecoder::DecodeLz(Int32 pos)\n{\n  while (pos > 0)\n  {\n    UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);\n    UInt32 length, distance;\n    if (number < 256)\n    {\n      m_OutWindowStream.PutByte(Byte(number));\n      pos--;\n      continue;\n    }\n    else if (number >= kMatchNumber)\n    {\n      number -= kMatchNumber;\n      length = kNormalMatchMinLen + UInt32(kLenStart[number]) +\n        m_InBitStream.ReadBits(kLenDirectBits[number]);\n      number = m_DistDecoder.DecodeSymbol(&m_InBitStream);\n      if (number >= kDistTableSize)\n        return false;\n      distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]);\n      if (distance >= kDistLimit3)\n      {\n        length += 2 - ((distance - kDistLimit4) >> 31);\n        // length++;\n        // if (distance >= kDistLimit4)\n        //  length++;\n      }\n    }\n    else if (number == kRepBothNumber)\n    {\n      length = m_LastLength;\n      distance = m_RepDists[(m_RepDistPtr + 4 - 1) & 3];\n    }\n    else if (number < kLen2Number)\n    {\n      distance = m_RepDists[(m_RepDistPtr - (number - kRepNumber + 1)) & 3];\n      number = m_LenDecoder.DecodeSymbol(&m_InBitStream);\n      if (number >= kLenTableSize)\n        return false;\n      length = 2 + kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]);\n      if (distance >= kDistLimit2)\n      {\n        length++;\n        if (distance >= kDistLimit3)\n        {\n          length += 2 - ((distance - kDistLimit4) >> 31);\n          // length++;\n          // if (distance >= kDistLimit4)\n          //   length++;\n        }\n      }\n    }\n    else if (number < kReadTableNumber)\n    {\n      number -= kLen2Number;\n      distance = kLen2DistStarts[number] +\n        m_InBitStream.ReadBits(kLen2DistDirectBits[number]);\n      length = 2;\n    }\n    else if (number == kReadTableNumber)\n      return true;\n    else\n      return false;\n    m_RepDists[m_RepDistPtr++ & 3] = distance;\n    m_LastLength = length;\n    if (!m_OutWindowStream.CopyBlock(distance, length))\n      return false;\n    pos -= length;\n  }\n  return true;\n}\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  if (inSize == NULL || outSize == NULL)\n    return E_INVALIDARG;\n\n  if (!m_OutWindowStream.Create(kHistorySize))\n    return E_OUTOFMEMORY;\n  if (!m_InBitStream.Create(1 << 20))\n    return E_OUTOFMEMORY;\n\n  m_PackSize = *inSize;\n\n  UInt64 pos = 0, unPackSize = *outSize;\n  \n  m_OutWindowStream.SetStream(outStream);\n  m_OutWindowStream.Init(m_IsSolid);\n  m_InBitStream.SetStream(inStream);\n  m_InBitStream.Init();\n\n  CCoderReleaser coderReleaser(this);\n  if (!m_IsSolid)\n  {\n    InitStructures();\n    if (unPackSize == 0)\n    {\n      if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;\n        if (!ReadTables())\n          return S_FALSE;\n      return S_OK;\n    }\n    if (!ReadTables())\n      return S_FALSE;\n  }\n\n  UInt64 startPos = m_OutWindowStream.GetProcessedSize();\n  while(pos < unPackSize)\n  {\n    UInt32 blockSize = 1 << 20;\n    if (blockSize > unPackSize - pos)\n      blockSize = (UInt32)(unPackSize - pos);\n    UInt64 blockStartPos = m_OutWindowStream.GetProcessedSize();\n    if (m_AudioMode)\n    {\n      if (!DecodeMm(blockSize))\n        return S_FALSE;\n    }\n    else\n    {\n      if (!DecodeLz((Int32)blockSize))\n        return S_FALSE;\n    }\n    UInt64 globalPos = m_OutWindowStream.GetProcessedSize();\n    pos = globalPos - blockStartPos;\n    if (pos < blockSize)\n      if (!ReadTables())\n        return S_FALSE;\n    pos = globalPos - startPos;\n    if (progress != 0)\n    {\n      UInt64 packSize = m_InBitStream.GetProcessedSize();\n      RINOK(progress->SetRatioInfo(&packSize, &pos));\n    }\n  }\n  if (pos > unPackSize)\n    return S_FALSE;\n\n  if (!ReadLastTables())\n    return S_FALSE;\n  return m_OutWindowStream.Flush();\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  return CodeReal(inStream, outStream, inSize, outSize, progress);\n}\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  if (size < 1)\n    return E_INVALIDARG;\n  m_IsSolid = (data[0] != 0);\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar2Decoder.h",
    "content": "// Rar2Decoder.h\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n\n#ifndef __COMPRESS_RAR2_DECODER_H\n#define __COMPRESS_RAR2_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitmDecoder.h\"\n#include \"HuffmanDecoder.h\"\n#include \"LzOutWindow.h\"\n\nnamespace NCompress {\nnamespace NRar2 {\n\nconst UInt32 kNumRepDists = 4;\nconst UInt32 kDistTableSize = 48;\n\nconst int kMMTableSize = 256 + 1;\n\nconst UInt32 kMainTableSize = 298;\nconst UInt32 kLenTableSize = 28;\n\nconst UInt32 kDistTableStart = kMainTableSize;\nconst UInt32 kLenTableStart = kDistTableStart + kDistTableSize;\n\nconst UInt32 kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize;\n\nconst UInt32 kLevelTableSize = 19;\n\nconst UInt32 kMMTablesSizesSum = kMMTableSize * 4;\n\nconst UInt32 kMaxTableSize = kMMTablesSizesSum;\n\nconst UInt32 kTableDirectLevels = 16;\nconst UInt32 kTableLevelRepNumber = kTableDirectLevels;\nconst UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;\nconst UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;\n\nconst UInt32 kLevelMask = 0xF;\n\n\nconst UInt32 kRepBothNumber = 256;\nconst UInt32 kRepNumber = kRepBothNumber + 1;\nconst UInt32 kLen2Number = kRepNumber + 4;\n\nconst UInt32 kLen2NumNumbers = 8;\nconst UInt32 kReadTableNumber = kLen2Number + kLen2NumNumbers;\nconst UInt32 kMatchNumber = kReadTableNumber + 1;\n\nconst Byte kLenStart[kLenTableSize]      = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};\nconst Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5};\n\nconst UInt32 kDistStart[kDistTableSize]     = {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768U,49152U,65536,98304,131072,196608,262144,327680,393216,458752,524288,589824,655360,720896,786432,851968,917504,983040};\nconst Byte kDistDirectBits[kDistTableSize] = {0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5,  6,  6,  7,  7,  8,  8,   9,   9,  10,  10,  11,  11,  12,   12,   13,   13,    14,    14,   15,   15,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16};\n\nconst Byte kLevelDirectBits[kLevelTableSize] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7};\n\nconst Byte kLen2DistStarts[kLen2NumNumbers]={0,4,8,16,32,64,128,192};\nconst Byte kLen2DistDirectBits[kLen2NumNumbers]={2,2,3, 4, 5, 6,  6,  6};\n\nconst UInt32 kDistLimit2 = 0x101 - 1;\nconst UInt32 kDistLimit3 = 0x2000 - 1;\nconst UInt32 kDistLimit4 = 0x40000 - 1;\n\nconst UInt32 kMatchMaxLen = 255 + 2;\nconst UInt32 kMatchMaxLenMax = 255 + 5;\nconst UInt32 kNormalMatchMinLen = 3;\n\nnamespace NMultimedia {\n\nstruct CFilter\n{\n  int K1,K2,K3,K4,K5;\n  int D1,D2,D3,D4;\n  int LastDelta;\n  UInt32 Dif[11];\n  UInt32 ByteCount;\n  int LastChar;\n\n  Byte Decode(int &channelDelta, Byte delta);\n\n  void Init() { memset(this, 0, sizeof(*this)); }\n\n};\n\nconst int kNumChanelsMax = 4;\n\nclass CFilter2\n{\npublic:\n  CFilter  m_Filters[kNumChanelsMax];\n  int m_ChannelDelta;\n  int CurrentChannel;\n\n  void Init() { memset(this, 0, sizeof(*this)); }\n  Byte Decode(Byte delta)\n  {\n    return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta);\n  }\n\n};\n\n}\n\ntypedef NBitm::CDecoder<CInBuffer> CBitDecoder;\n\nconst int kNumHuffmanBits = 15;\n\nclass CDecoder :\n  public ICompressCoder,\n  public ICompressSetDecoderProperties2,\n  public CMyUnknownImp\n{\n  CLzOutWindow m_OutWindowStream;\n  CBitDecoder m_InBitStream;\n  NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;\n  NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;\n  NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;\n  NHuffman::CDecoder<kNumHuffmanBits, kMMTableSize> m_MMDecoders[NMultimedia::kNumChanelsMax];\n  NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;\n\n  bool m_AudioMode;\n\n  NMultimedia::CFilter2 m_MmFilter;\n  int m_NumChannels;\n\n  UInt32 m_RepDists[kNumRepDists];\n  UInt32 m_RepDistPtr;\n\n  UInt32 m_LastLength;\n  \n  Byte m_LastLevels[kMaxTableSize];\n\n  UInt64 m_PackSize;\n  bool m_IsSolid;\n\n  void InitStructures();\n  UInt32 ReadBits(int numBits);\n  bool ReadTables();\n  bool ReadLastTables();\n\n  bool DecodeMm(UInt32 pos);\n  bool DecodeLz(Int32 pos);\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\npublic:\n  CDecoder();\n\n  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)\n\n  void ReleaseStreams()\n  {\n    m_OutWindowStream.ReleaseStream();\n    m_InBitStream.ReleaseStream();\n  }\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar3Decoder.cpp",
    "content": "// Rar3Decoder.cpp\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n \n#include \"StdAfx.h\"\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"Rar3Decoder.h\"\n\nnamespace NCompress {\nnamespace NRar3 {\n\nstatic const UInt32 kNumAlignReps = 15;\n\nstatic const UInt32 kSymbolReadTable = 256;\nstatic const UInt32 kSymbolRep = 259;\nstatic const UInt32 kSymbolLen2 = kSymbolRep + kNumReps;\n\nstatic const Byte kLenStart[kLenTableSize]      = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};\nstatic const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5};\n\nstatic const Byte kDistDirectBits[kDistTableSize] =\n  {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,\n  16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n  18,18,18,18,18,18,18,18,18,18,18,18};\n\nstatic const Byte kLevelDirectBits[kLevelTableSize] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};\n\nstatic const Byte kLen2DistStarts[kNumLen2Symbols]={0,4,8,16,32,64,128,192};\nstatic const Byte kLen2DistDirectBits[kNumLen2Symbols]={2,2,3, 4, 5, 6,  6,  6};\n\nstatic const UInt32 kDistLimit3 = 0x2000 - 2;\nstatic const UInt32 kDistLimit4 = 0x40000 - 2;\n\nstatic const UInt32 kNormalMatchMinLen = 3;\n\nstatic const UInt32 kVmDataSizeMax = 1 << 16;\nstatic const UInt32 kVmCodeSizeMax = 1 << 16;\n\nCDecoder::CDecoder():\n  _window(0),\n  _winPos(0),\n  _wrPtr(0),\n  _lzSize(0),\n  _writtenFileSize(0),\n  _vmData(0),\n  _vmCode(0),\n  m_IsSolid(false)\n{\n}\n\nCDecoder::~CDecoder()\n{\n  InitFilters();\n  ::MidFree(_vmData);\n  ::MidFree(_window);\n}\n\nHRESULT CDecoder::WriteDataToStream(const Byte *data, UInt32 size)\n{\n  return WriteStream(_outStream, data, size);\n}\n\nHRESULT CDecoder::WriteData(const Byte *data, UInt32 size)\n{\n  HRESULT res = S_OK;\n  if (_writtenFileSize < _unpackSize)\n  {\n    UInt32 curSize = size;\n    UInt64 remain = _unpackSize - _writtenFileSize;\n    if (remain < curSize)\n      curSize = (UInt32)remain;\n    res = WriteDataToStream(data, curSize);\n  }\n  _writtenFileSize += size;\n  return res;\n}\n\nHRESULT CDecoder::WriteArea(UInt32 startPtr, UInt32 endPtr)\n{\n  if (startPtr <= endPtr)\n    return WriteData(_window + startPtr, endPtr - startPtr);\n  RINOK(WriteData(_window + startPtr, kWindowSize - startPtr));\n  return WriteData(_window, endPtr);\n}\n\nvoid CDecoder::ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef)\n{\n  CTempFilter *tempFilter = _tempFilters[tempFilterIndex];\n  tempFilter->InitR[6] = (UInt32)_writtenFileSize;\n  NVm::SetValue32(&tempFilter->GlobalData[0x24], (UInt32)_writtenFileSize);\n  NVm::SetValue32(&tempFilter->GlobalData[0x28], (UInt32)(_writtenFileSize >> 32));\n  CFilter *filter = _filters[tempFilter->FilterIndex];\n  _vm.Execute(filter, tempFilter, outBlockRef, filter->GlobalData);\n  delete tempFilter;\n  _tempFilters[tempFilterIndex] = 0;\n}\n\nHRESULT CDecoder::WriteBuf()\n{\n  UInt32 writtenBorder = _wrPtr;\n  UInt32 writeSize = (_winPos - writtenBorder) & kWindowMask;\n  for (int i = 0; i < _tempFilters.Size(); i++)\n  {\n    CTempFilter *filter = _tempFilters[i];\n    if (filter == NULL)\n      continue;\n    if (filter->NextWindow)\n    {\n      filter->NextWindow = false;\n      continue;\n    }\n    UInt32 blockStart = filter->BlockStart;\n    UInt32 blockSize = filter->BlockSize;\n    if (((blockStart - writtenBorder) & kWindowMask) < writeSize)\n    {\n      if (writtenBorder != blockStart)\n      {\n        RINOK(WriteArea(writtenBorder, blockStart));\n        writtenBorder = blockStart;\n        writeSize = (_winPos - writtenBorder) & kWindowMask;\n      }\n      if (blockSize <= writeSize)\n      {\n        UInt32 blockEnd = (blockStart + blockSize) & kWindowMask;\n        if (blockStart < blockEnd || blockEnd == 0)\n          _vm.SetMemory(0, _window + blockStart, blockSize);\n        else\n        {\n          UInt32 tailSize = kWindowSize - blockStart;\n          _vm.SetMemory(0, _window + blockStart, tailSize);\n          _vm.SetMemory(tailSize, _window, blockEnd);\n        }\n        NVm::CBlockRef outBlockRef;\n        ExecuteFilter(i, outBlockRef);\n        while (i + 1 < _tempFilters.Size())\n        {\n          CTempFilter *nextFilter = _tempFilters[i + 1];\n          if (nextFilter == NULL || nextFilter->BlockStart != blockStart ||\n              nextFilter->BlockSize != outBlockRef.Size || nextFilter->NextWindow)\n            break;\n          _vm.SetMemory(0, _vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);\n          ExecuteFilter(++i, outBlockRef);\n        }\n        WriteDataToStream(_vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);\n        _writtenFileSize += outBlockRef.Size;\n        writtenBorder = blockEnd;\n        writeSize = (_winPos - writtenBorder) & kWindowMask;\n      }\n      else\n      {\n        for (int j = i; j < _tempFilters.Size(); j++)\n        {\n          CTempFilter *filter = _tempFilters[j];\n          if (filter != NULL && filter->NextWindow)\n            filter->NextWindow = false;\n        }\n        _wrPtr = writtenBorder;\n        return S_OK; // check it\n      }\n    }\n  }\n      \n  _wrPtr = _winPos;\n  return WriteArea(writtenBorder, _winPos);\n}\n\nvoid CDecoder::InitFilters()\n{\n  _lastFilter = 0;\n  int i;\n  for (i = 0; i < _tempFilters.Size(); i++)\n    delete _tempFilters[i];\n  _tempFilters.Clear();\n  for (i = 0; i < _filters.Size(); i++)\n    delete _filters[i];\n  _filters.Clear();\n}\n\nbool CDecoder::AddVmCode(UInt32 firstByte, UInt32 codeSize)\n{\n  CMemBitDecoder inp;\n  inp.Init(_vmData, codeSize);\n\n  UInt32 filterIndex;\n  if (firstByte & 0x80)\n  {\n    filterIndex = NVm::ReadEncodedUInt32(inp);\n    if (filterIndex == 0)\n      InitFilters();\n    else\n      filterIndex--;\n  }\n  else\n    filterIndex = _lastFilter;\n  if (filterIndex > (UInt32)_filters.Size())\n    return false;\n  _lastFilter = filterIndex;\n  bool newFilter = (filterIndex == (UInt32)_filters.Size());\n\n  CFilter *filter;\n  if (newFilter)\n  {\n    // check if too many filters\n    if (filterIndex > 1024)\n      return false;\n    filter = new CFilter;\n    _filters.Add(filter);\n  }\n  else\n  {\n    filter = _filters[filterIndex];\n    filter->ExecCount++;\n  }\n\n  int numEmptyItems = 0;\n  int i;\n  for (i = 0; i < _tempFilters.Size(); i++)\n  {\n    _tempFilters[i - numEmptyItems] = _tempFilters[i];\n    if (_tempFilters[i] == NULL)\n      numEmptyItems++;\n    if (numEmptyItems > 0)\n      _tempFilters[i] = NULL;\n  }\n  if (numEmptyItems == 0)\n  {\n    _tempFilters.Add(NULL);\n    numEmptyItems = 1;\n  }\n  CTempFilter *tempFilter = new CTempFilter;\n  _tempFilters[_tempFilters.Size() - numEmptyItems] = tempFilter;\n  tempFilter->FilterIndex = filterIndex;\n  tempFilter->ExecCount = filter->ExecCount;\n \n  UInt32 blockStart = NVm::ReadEncodedUInt32(inp);\n  if (firstByte & 0x40)\n    blockStart += 258;\n  tempFilter->BlockStart = (blockStart + _winPos) & kWindowMask;\n  if (firstByte & 0x20)\n    filter->BlockSize = NVm::ReadEncodedUInt32(inp);\n  tempFilter->BlockSize = filter->BlockSize;\n  tempFilter->NextWindow = _wrPtr != _winPos && ((_wrPtr - _winPos) & kWindowMask) <= blockStart;\n\n  memset(tempFilter->InitR, 0, sizeof(tempFilter->InitR));\n  tempFilter->InitR[3] = NVm::kGlobalOffset;\n  tempFilter->InitR[4] = tempFilter->BlockSize;\n  tempFilter->InitR[5] = tempFilter->ExecCount;\n  if (firstByte & 0x10)\n  {\n    UInt32 initMask = inp.ReadBits(NVm::kNumGpRegs);\n    for (int i = 0; i < NVm::kNumGpRegs; i++)\n      if (initMask & (1 << i))\n        tempFilter->InitR[i] = NVm::ReadEncodedUInt32(inp);\n  }\n  if (newFilter)\n  {\n    UInt32 vmCodeSize = NVm::ReadEncodedUInt32(inp);\n    if (vmCodeSize >= kVmCodeSizeMax || vmCodeSize == 0)\n      return false;\n    for (UInt32 i = 0; i < vmCodeSize; i++)\n      _vmCode[i] = (Byte)inp.ReadBits(8);\n    _vm.PrepareProgram(_vmCode, vmCodeSize, filter);\n  }\n\n  tempFilter->AllocateEmptyFixedGlobal();\n\n  Byte *globalData = &tempFilter->GlobalData[0];\n  for (i = 0; i < NVm::kNumGpRegs; i++)\n    NVm::SetValue32(&globalData[i * 4], tempFilter->InitR[i]);\n  NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockSize], tempFilter->BlockSize);\n  NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockPos], 0); // It was commented. why?\n  NVm::SetValue32(&globalData[NVm::NGlobalOffset::kExecCount], tempFilter->ExecCount);\n\n  if (firstByte & 8)\n  {\n    UInt32 dataSize = NVm::ReadEncodedUInt32(inp);\n    if (dataSize > NVm::kGlobalSize - NVm::kFixedGlobalSize)\n      return false;\n    CRecordVector<Byte> &globalData = tempFilter->GlobalData;\n    int requredSize = (int)(dataSize + NVm::kFixedGlobalSize);\n    if (globalData.Size() < requredSize)\n    {\n      globalData.Reserve(requredSize);\n      for (; globalData.Size() < requredSize; i++)\n        globalData.Add(0);\n    }\n    for (UInt32 i = 0; i < dataSize; i++)\n      globalData[NVm::kFixedGlobalSize + i] = (Byte)inp.ReadBits(8);\n  }\n  return true;\n}\n\nbool CDecoder::ReadVmCodeLZ()\n{\n  UInt32 firstByte = m_InBitStream.ReadBits(8);\n  UInt32 length = (firstByte & 7) + 1;\n  if (length == 7)\n    length = m_InBitStream.ReadBits(8) + 7;\n  else if (length == 8)\n    length = m_InBitStream.ReadBits(16);\n  if (length > kVmDataSizeMax)\n    return false;\n  for (UInt32 i = 0; i < length; i++)\n    _vmData[i] = (Byte)m_InBitStream.ReadBits(8);\n  return AddVmCode(firstByte, length);\n}\n\nbool CDecoder::ReadVmCodePPM()\n{\n  int firstByte = DecodePpmSymbol();\n  if (firstByte == -1)\n    return false;\n  UInt32 length = (firstByte & 7) + 1;\n  if (length == 7)\n  {\n    int b1 = DecodePpmSymbol();\n    if (b1 == -1)\n      return false;\n    length = b1 + 7;\n  }\n  else if (length == 8)\n  {\n    int b1 = DecodePpmSymbol();\n    if (b1 == -1)\n      return false;\n    int b2 = DecodePpmSymbol();\n    if (b2 == -1)\n      return false;\n    length = b1 * 256 + b2;\n  }\n  if (length > kVmDataSizeMax)\n    return false;\n  for (UInt32 i = 0; i < length; i++)\n  {\n    int b = DecodePpmSymbol();\n    if (b == -1)\n      return false;\n    _vmData[i] = (Byte)b;\n  }\n  return AddVmCode(firstByte, length);\n}\n\n#define RIF(x) { if (!(x)) return S_FALSE; }\n\nUInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }\n\n/////////////////////////////////////////////////\n// PPM\n\nHRESULT CDecoder::InitPPM()\n{\n  Byte maxOrder = (Byte)ReadBits(7);\n\n  bool reset = ((maxOrder & 0x20) != 0);\n  int maxMB = 0;\n  if (reset)\n    maxMB = (Byte)ReadBits(8);\n  else\n  {\n    if (_ppm.SubAllocator.GetSubAllocatorSize()== 0)\n      return S_FALSE;\n  }\n  if (maxOrder & 0x40)\n    PpmEscChar = (Byte)ReadBits(8);\n  m_InBitStream.InitRangeCoder();\n  /*\n  if (m_InBitStream.m_BitPos != 0)\n    return S_FALSE;\n  */\n  if (reset)\n  {\n    maxOrder = (maxOrder & 0x1F) + 1;\n    if (maxOrder > 16)\n      maxOrder = 16 + (maxOrder - 16) * 3;\n    if (maxOrder == 1)\n    {\n      // SubAlloc.StopSubAllocator();\n      _ppm.SubAllocator.StopSubAllocator();\n      return S_FALSE;\n    }\n    // SubAlloc.StartSubAllocator(MaxMB+1);\n    // StartModelRare(maxOrder);\n\n    if (!_ppm.SubAllocator.StartSubAllocator((maxMB + 1) << 20))\n      return E_OUTOFMEMORY;\n    _ppm.MaxOrder = 0;\n    _ppm.StartModelRare(maxOrder);\n\n  }\n  // return (minContext != NULL);\n\n  return S_OK;\n}\n\nint CDecoder::DecodePpmSymbol() { return _ppm.DecodeSymbol(&m_InBitStream); }\n\nHRESULT CDecoder::DecodePPM(Int32 num, bool &keepDecompressing)\n{\n  keepDecompressing = false;\n  do\n  {\n    if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)\n    {\n      RINOK(WriteBuf());\n      if (_writtenFileSize > _unpackSize)\n      {\n        keepDecompressing = false;\n        return S_OK;\n      }\n    }\n    int c = DecodePpmSymbol();\n    if (c == -1)\n    {\n      // Original code sets PPMError=true here and then it returns S_OK. Why ???\n      // return S_OK;\n      return S_FALSE;\n    }\n    if (c == PpmEscChar)\n    {\n      int nextCh = DecodePpmSymbol();\n      if (nextCh == 0)\n        return ReadTables(keepDecompressing);\n      if (nextCh == 2 || nextCh == -1)\n        return S_OK;\n      if (nextCh == 3)\n      {\n        if (!ReadVmCodePPM())\n          return S_FALSE;\n        continue;\n      }\n      if (nextCh == 4 || nextCh == 5)\n      {\n        UInt32 distance = 0;\n        UInt32 length = 4;\n        if (nextCh == 4)\n        {\n          for (int i = 0; i < 3; i++)\n          {\n            int c = DecodePpmSymbol();\n            if (c == -1)\n              return S_OK;\n            distance = (distance << 8) + (Byte)c;\n          }\n          distance++;\n          length += 28;\n        }\n        int c = DecodePpmSymbol();\n        if (c == -1)\n          return S_OK;\n        length += c;\n        if (distance >= _lzSize)\n          return S_FALSE;\n        CopyBlock(distance, length);\n        num -= (Int32)length;\n        continue;\n      }\n    }\n    PutByte((Byte)c);\n    num--;\n  }\n  while (num >= 0);\n  keepDecompressing = true;\n  return S_OK;\n}\n\n/////////////////////////////////////////////////\n// LZ\n\nHRESULT CDecoder::ReadTables(bool &keepDecompressing)\n{\n  keepDecompressing = true;\n  ReadBits((8 - m_InBitStream.GetBitPosition()) & 7);\n  if (ReadBits(1) != 0)\n  {\n    _lzMode = false;\n    return InitPPM();\n  }\n\n  _lzMode = true;\n  PrevAlignBits = 0;\n  PrevAlignCount = 0;\n\n  Byte levelLevels[kLevelTableSize];\n  Byte newLevels[kTablesSizesSum];\n\n  if (ReadBits(1) == 0)\n    memset(m_LastLevels, 0, kTablesSizesSum);\n\n  int i;\n  for (i = 0; i < kLevelTableSize; i++)\n  {\n    UInt32 length = ReadBits(4);\n    if (length == 15)\n    {\n      UInt32 zeroCount = ReadBits(4);\n      if (zeroCount != 0)\n      {\n        zeroCount += 2;\n        while (zeroCount-- > 0 && i < kLevelTableSize)\n          levelLevels[i++]=0;\n        i--;\n        continue;\n      }\n    }\n    levelLevels[i] = (Byte)length;\n  }\n  RIF(m_LevelDecoder.SetCodeLengths(levelLevels));\n  i = 0;\n  while (i < kTablesSizesSum)\n  {\n    UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);\n    if (number < 16)\n    {\n      newLevels[i] = Byte((number + m_LastLevels[i]) & 15);\n      i++;\n    }\n    else if (number > kLevelTableSize)\n      return S_FALSE;\n    else\n    {\n      int num;\n      if (((number - 16) & 1) == 0)\n        num = ReadBits(3) + 3;\n      else\n        num = ReadBits(7) + 11;\n      if (number < 18)\n      {\n        if (i == 0)\n          return S_FALSE;\n        for (; num > 0 && i < kTablesSizesSum; num--, i++)\n          newLevels[i] = newLevels[i - 1];\n      }\n      else\n      {\n        for (; num > 0 && i < kTablesSizesSum; num--)\n          newLevels[i++] = 0;\n      }\n    }\n  }\n  TablesRead = true;\n\n  // original code has check here:\n  /*\n  if (InAddr > ReadTop)\n  {\n    keepDecompressing = false;\n    return true;\n  }\n  */\n\n  RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));\n  RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));\n  RIF(m_AlignDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));\n  RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize]));\n\n  memcpy(m_LastLevels, newLevels, kTablesSizesSum);\n  return S_OK;\n}\n\nclass CCoderReleaser\n{\n  CDecoder *m_Coder;\npublic:\n  CCoderReleaser(CDecoder *coder): m_Coder(coder) {}\n  ~CCoderReleaser()\n  {\n    // m_Coder->m_OutWindowStream.Flush();\n    m_Coder->ReleaseStreams();\n  }\n};\n\nHRESULT CDecoder::ReadEndOfBlock(bool &keepDecompressing)\n{\n  if (ReadBits(1) != 0)\n  {\n    // old file\n    TablesRead = false;\n    return ReadTables(keepDecompressing);\n  }\n  // new file\n  keepDecompressing = false;\n  TablesRead = (ReadBits(1) == 0);\n  return S_OK;\n}\n\nUInt32 kDistStart[kDistTableSize];\n\nclass CDistInit\n{\npublic:\n  CDistInit() { Init(); }\n  void Init()\n  {\n    UInt32 start = 0;\n    for (UInt32 i = 0; i < kDistTableSize; i++)\n    {\n      kDistStart[i] = start;\n      start += (1 << kDistDirectBits[i]);\n    }\n  }\n} g_DistInit;\n\nHRESULT CDecoder::DecodeLZ(bool &keepDecompressing)\n{\n  UInt32 rep0 = _reps[0];\n  UInt32 rep1 = _reps[1];\n  UInt32 rep2 = _reps[2];\n  UInt32 rep3 = _reps[3];\n  UInt32 length = _lastLength;\n  for (;;)\n  {\n    if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)\n    {\n      RINOK(WriteBuf());\n      if (_writtenFileSize > _unpackSize)\n      {\n        keepDecompressing = false;\n        return S_OK;\n      }\n    }\n    UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);\n    if (number < 256)\n    {\n      PutByte(Byte(number));\n\n      continue;\n    }\n    else if (number == kSymbolReadTable)\n    {\n      RINOK(ReadEndOfBlock(keepDecompressing));\n      break;\n    }\n    else if (number == 257)\n    {\n      if (!ReadVmCodeLZ())\n        return S_FALSE;\n      continue;\n    }\n    else if (number == 258)\n    {\n    }\n    else if (number < kSymbolRep + 4)\n    {\n      if (number != kSymbolRep)\n      {\n        UInt32 distance;\n        if (number == kSymbolRep + 1)\n          distance = rep1;\n        else\n        {\n          if (number == kSymbolRep + 2)\n            distance = rep2;\n          else\n          {\n            distance = rep3;\n            rep3 = rep2;\n          }\n          rep2 = rep1;\n        }\n        rep1 = rep0;\n        rep0 = distance;\n      }\n\n      UInt32 number = m_LenDecoder.DecodeSymbol(&m_InBitStream);\n      if (number >= kLenTableSize)\n        return S_FALSE;\n      length = 2 + kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]);\n    }\n    else\n    {\n      rep3 = rep2;\n      rep2 = rep1;\n      rep1 = rep0;\n      if (number < 271)\n      {\n        number -= 263;\n        rep0 = kLen2DistStarts[number] + m_InBitStream.ReadBits(kLen2DistDirectBits[number]);\n        length = 2;\n      }\n      else if (number < 299)\n      {\n        number -= 271;\n        length = kNormalMatchMinLen + (UInt32)kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]);\n        UInt32 number = m_DistDecoder.DecodeSymbol(&m_InBitStream);\n        if (number >= kDistTableSize)\n          return S_FALSE;\n        rep0 = kDistStart[number];\n        int numBits = kDistDirectBits[number];\n        if (number >= (kNumAlignBits * 2) + 2)\n        {\n          if (numBits > kNumAlignBits)\n            rep0 += (m_InBitStream.ReadBits(numBits - kNumAlignBits) << kNumAlignBits);\n          if (PrevAlignCount > 0)\n          {\n            PrevAlignCount--;\n            rep0 += PrevAlignBits;\n          }\n          else\n          {\n            UInt32 number = m_AlignDecoder.DecodeSymbol(&m_InBitStream);\n            if (number < (1 << kNumAlignBits))\n            {\n              rep0 += number;\n              PrevAlignBits = number;\n            }\n            else if (number  == (1 << kNumAlignBits))\n            {\n              PrevAlignCount = kNumAlignReps;\n              rep0 += PrevAlignBits;\n            }\n            else\n              return S_FALSE;\n          }\n        }\n        else\n          rep0 += m_InBitStream.ReadBits(numBits);\n        length += ((kDistLimit4 - rep0) >> 31) + ((kDistLimit3 - rep0) >> 31);\n      }\n      else\n        return S_FALSE;\n    }\n    if (rep0 >= _lzSize)\n      return S_FALSE;\n    CopyBlock(rep0, length);\n  }\n  _reps[0] = rep0;\n  _reps[1] = rep1;\n  _reps[2] = rep2;\n  _reps[3] = rep3;\n  _lastLength = length;\n\n  return S_OK;\n}\n\nHRESULT CDecoder::CodeReal(ICompressProgressInfo *progress)\n{\n  _writtenFileSize = 0;\n  if (!m_IsSolid)\n  {\n    _lzSize = 0;\n    _winPos = 0;\n    _wrPtr = 0;\n    for (int i = 0; i < kNumReps; i++)\n      _reps[i] = 0;\n    _lastLength = 0;\n    memset(m_LastLevels, 0, kTablesSizesSum);\n    TablesRead = false;\n    PpmEscChar = 2;\n    InitFilters();\n  }\n  if (!m_IsSolid || !TablesRead)\n  {\n    bool keepDecompressing;\n    RINOK(ReadTables(keepDecompressing));\n    if (!keepDecompressing)\n      return S_OK;\n  }\n\n  for(;;)\n  {\n    bool keepDecompressing;\n    if (_lzMode)\n    {\n      RINOK(DecodeLZ(keepDecompressing))\n    }\n    else\n    {\n      RINOK(DecodePPM(1 << 18, keepDecompressing))\n    }\n    UInt64 packSize = m_InBitStream.GetProcessedSize();\n    RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));\n    if (!keepDecompressing)\n      break;\n  }\n  RINOK(WriteBuf());\n  if (_writtenFileSize < _unpackSize)\n    return S_FALSE;\n  // return m_OutWindowStream.Flush();\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n\n    if (inSize == NULL || outSize == NULL)\n      return E_INVALIDARG;\n\n    if (_vmData == 0)\n    {\n      _vmData = (Byte *)::MidAlloc(kVmDataSizeMax + kVmCodeSizeMax);\n      if (_vmData == 0)\n        return E_OUTOFMEMORY;\n      _vmCode = _vmData + kVmDataSizeMax;\n    }\n    \n    if (_window == 0)\n    {\n      _window = (Byte *)::MidAlloc(kWindowSize);\n      if (_window == 0)\n        return E_OUTOFMEMORY;\n    }\n    if (!m_InBitStream.Create(1 << 20))\n      return E_OUTOFMEMORY;\n    if (!_vm.Create())\n      return E_OUTOFMEMORY;\n\n    \n    m_InBitStream.SetStream(inStream);\n    m_InBitStream.Init();\n    _outStream = outStream;\n   \n    CCoderReleaser coderReleaser(this);\n    _unpackSize = *outSize;\n    return CodeReal(progress);\n  \n}\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  if (size < 1)\n    return E_INVALIDARG;\n  m_IsSolid = (data[0] != 0);\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar3Decoder.h",
    "content": "// Rar3Decoder.h\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n\n#ifndef __COMPRESS_RAR3_DECODER_H\n#define __COMPRESS_RAR3_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\n#include \"../Common/InBuffer.h\"\n\n#include \"BitmDecoder.h\"\n#include \"HuffmanDecoder.h\"\n#include \"PpmdDecode.h\"\n#include \"Rar3Vm.h\"\n\nnamespace NCompress {\nnamespace NRar3 {\n\nconst UInt32 kWindowSize = 1 << 22;\nconst UInt32 kWindowMask = (kWindowSize - 1);\n\nconst UInt32 kNumReps = 4;\nconst UInt32 kNumLen2Symbols = 8;\nconst UInt32 kLenTableSize = 28;\nconst UInt32 kMainTableSize = 256 + 1 + 1 + 1 + kNumReps + kNumLen2Symbols + kLenTableSize;\nconst UInt32 kDistTableSize = 60;\n\nconst int kNumAlignBits = 4;\nconst UInt32 kAlignTableSize = (1 << kNumAlignBits) + 1;\n\nconst UInt32 kLevelTableSize = 20;\n\nconst UInt32 kTablesSizesSum = kMainTableSize + kDistTableSize + kAlignTableSize + kLenTableSize;\n\nclass CBitDecoder\n{\n  UInt32 m_Value;\npublic:\n  UInt32 m_BitPos;\n  CInBuffer m_Stream;\n  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }\n  void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}\n  void ReleaseStream() { m_Stream.ReleaseStream();}\n\n  void Init()\n  {\n    m_Stream.Init();\n    m_BitPos = 0;\n    m_Value = 0;\n    // m_BitPos = kNumBigValueBits;\n    // Normalize();\n  }\n  \n  UInt64 GetProcessedSize() const\n    { return m_Stream.GetProcessedSize() - (m_BitPos) / 8; }\n  UInt32 GetBitPosition() const { return ((8 - m_BitPos) & 7); }\n  \n  /*\n  void Normalize()\n  {\n    for (;m_BitPos >= 8; m_BitPos -= 8)\n      m_Value = (m_Value << 8) | m_Stream.ReadByte();\n  }\n  */\n\n  UInt32 GetValue(UInt32 numBits)\n  {\n    // return (m_Value << m_BitPos) >> (kNumBigValueBits - numBits);\n    // return ((m_Value >> (8 - m_BitPos)) & kMask) >> (kNumValueBits - numBits);\n    if (m_BitPos < numBits)\n    {\n      m_BitPos += 8;\n      m_Value = (m_Value << 8) | m_Stream.ReadByte();\n      if (m_BitPos < numBits)\n      {\n        m_BitPos += 8;\n        m_Value = (m_Value << 8) | m_Stream.ReadByte();\n      }\n    }\n    return m_Value >> (m_BitPos - numBits);\n  }\n  \n  void MovePos(UInt32 numBits)\n  {\n    m_BitPos -= numBits;\n    m_Value = m_Value & ((1 << m_BitPos) - 1);\n  }\n  \n  UInt32 ReadBits(UInt32 numBits)\n  {\n    UInt32 res = GetValue(numBits);\n    MovePos(numBits);\n    return res;\n  }\n};\n\nconst int kNumTopBits = 24;\nconst UInt32 kTopValue = (1 << kNumTopBits);\nconst UInt32 kBot = (1 << 15);\n\nclass CRangeDecoder:public NPpmd::CRangeDecoderVirt, public CBitDecoder\n{\npublic:\n  UInt32 Range;\n  UInt32 Low;\n  UInt32 Code;\n\n  void Normalize()\n  {\n    while ((Low ^ (Low + Range)) < kTopValue ||\n       Range < kBot && ((Range = (0 - Low) & (kBot - 1)), 1))\n    {\n      Code = (Code << 8) | m_Stream.ReadByte();\n      Range <<= 8;\n      Low <<= 8;\n    }\n  }\n  \n  void InitRangeCoder()\n  {\n    Code = 0;\n    Low = 0;\n    Range = 0xFFFFFFFF;\n    for(int i = 0; i < 4; i++)\n      Code = (Code << 8) | ReadBits(8);\n  }\n\n  virtual UInt32 GetThreshold(UInt32 total)\n  {\n    return (Code - Low) / ( Range /= total);\n  }\n\n  virtual void Decode(UInt32 start, UInt32 size)\n  {\n    Low += start * Range;\n    Range *= size;\n    Normalize();\n  }\n\n  virtual UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits)\n  {\n    if (((Code - Low) / (Range >>= numTotalBits)) < size0)\n    {\n      Decode(0, size0);\n      return 0;\n    }\n    else\n    {\n      Decode(size0, (1 << numTotalBits) - size0);\n      return 1;\n    }\n  }\n\n  // UInt64 GetProcessedSizeRangeCoder() {return Stream.GetProcessedSize(); }\n};\n\n\nstruct CFilter: public NVm::CProgram\n{\n  CRecordVector<Byte> GlobalData;\n  UInt32 BlockStart;\n  UInt32 BlockSize;\n  UInt32 ExecCount;\n  CFilter(): BlockStart(0), BlockSize(0), ExecCount(0) {}\n};\n\nstruct CTempFilter: public NVm::CProgramInitState\n{\n  UInt32 BlockStart;\n  UInt32 BlockSize;\n  UInt32 ExecCount;\n  bool NextWindow;\n  \n  UInt32 FilterIndex;\n};\n\nconst int kNumHuffmanBits = 15;\n\nclass CDecoder:\n  public ICompressCoder,\n  public ICompressSetDecoderProperties2,\n  public CMyUnknownImp\n{\n  CRangeDecoder m_InBitStream;\n  Byte *_window;\n  UInt32 _winPos;\n  UInt32 _wrPtr;\n  UInt64 _lzSize;\n  UInt64 _unpackSize;\n  UInt64 _writtenFileSize; // if it's > _unpackSize, then _unpackSize only written\n  CMyComPtr<ISequentialOutStream> _outStream;\n  NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;\n  NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;\n  NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;\n  NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;\n  NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;\n\n  UInt32 _reps[kNumReps];\n  UInt32 _lastLength;\n  \n  Byte m_LastLevels[kTablesSizesSum];\n\n  Byte *_vmData;\n  Byte *_vmCode;\n  NVm::CVm _vm;\n  CRecordVector<CFilter *> _filters;\n  CRecordVector<CTempFilter *>  _tempFilters;\n  UInt32 _lastFilter;\n\n  bool m_IsSolid;\n\n  bool _lzMode;\n\n  UInt32 PrevAlignBits;\n  UInt32 PrevAlignCount;\n\n  bool TablesRead;\n\n  NPpmd::CDecodeInfo _ppm;\n  int PpmEscChar;\n  \n  HRESULT WriteDataToStream(const Byte *data, UInt32 size);\n  HRESULT WriteData(const Byte *data, UInt32 size);\n  HRESULT WriteArea(UInt32 startPtr, UInt32 endPtr);\n  void ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef);\n  HRESULT WriteBuf();\n\n  void InitFilters();\n  bool AddVmCode(UInt32 firstByte, UInt32 codeSize);\n  bool ReadVmCodeLZ();\n  bool ReadVmCodePPM();\n  \n  UInt32 ReadBits(int numBits);\n\n  HRESULT InitPPM();\n  int DecodePpmSymbol();\n  HRESULT DecodePPM(Int32 num, bool &keepDecompressing);\n\n  HRESULT ReadTables(bool &keepDecompressing);\n  HRESULT ReadEndOfBlock(bool &keepDecompressing);\n  HRESULT DecodeLZ(bool &keepDecompressing);\n  HRESULT CodeReal(ICompressProgressInfo *progress);\npublic:\n  CDecoder();\n  ~CDecoder();\n\n  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)\n\n  void ReleaseStreams()\n  {\n    _outStream.Release();\n    m_InBitStream.ReleaseStream();\n  }\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n\n  void CopyBlock(UInt32 distance, UInt32 len)\n  {\n    _lzSize += len;\n    UInt32 pos = (_winPos - distance - 1) & kWindowMask;\n    Byte *window = _window;\n    UInt32 winPos = _winPos;\n    if (kWindowSize - winPos > len && kWindowSize - pos > len)\n    {\n      const Byte *src = window + pos;\n      Byte *dest = window + winPos;\n      _winPos += len;\n      do\n        *dest++ = *src++;\n      while(--len != 0);\n      return;\n    }\n    do\n    {\n      window[winPos] = window[pos];\n      winPos = (winPos + 1) & kWindowMask;\n      pos = (pos + 1) & kWindowMask;\n    }\n    while(--len != 0);\n    _winPos = winPos;\n  }\n  \n  void PutByte(Byte b)\n  {\n    _window[_winPos] = b;\n    _winPos = (_winPos + 1) & kWindowMask;\n    _lzSize++;\n  }\n\n\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar3Vm.cpp",
    "content": "// Rar3Vm.cpp\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n\n/*\nNote:\n  Due to performance considerations Rar VM may set Flags C incorrectly\n  for some operands (SHL x, 0, ... ).\n  Check implementation of concrete VM command\n  to see if it sets flags right.\n*/\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/7zCrc.h\"\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"Rar3Vm.h\"\n\nnamespace NCompress {\nnamespace NRar3 {\n\nUInt32 CMemBitDecoder::ReadBits(int numBits)\n{\n  UInt32 res = 0;\n  for (;;)\n  {\n    Byte b = _bitPos < _bitSize ? _data[_bitPos >> 3] : 0;\n    int avail = (int)(8 - (_bitPos & 7));\n    if (numBits <= avail)\n    {\n      _bitPos += numBits;\n      return res | (b >> (avail - numBits)) & ((1 << numBits) - 1);\n    }\n    numBits -= avail;\n    res |= (UInt32)(b & ((1 << avail) - 1)) << numBits;\n    _bitPos += avail;\n  }\n}\n\nUInt32 CMemBitDecoder::ReadBit() { return ReadBits(1); }\n\nnamespace NVm {\n\nstatic const UInt32 kStackRegIndex = kNumRegs - 1;\n\nstatic const UInt32 FLAG_C = 1;\nstatic const UInt32 FLAG_Z = 2;\nstatic const UInt32 FLAG_S = 0x80000000;\n\nstatic const Byte CF_OP0 = 0;\nstatic const Byte CF_OP1 = 1;\nstatic const Byte CF_OP2 = 2;\nstatic const Byte CF_OPMASK = 3;\nstatic const Byte CF_BYTEMODE = 4;\nstatic const Byte CF_JUMP = 8;\nstatic const Byte CF_PROC = 16;\nstatic const Byte CF_USEFLAGS = 32;\nstatic const Byte CF_CHFLAGS = 64;\n\nstatic Byte kCmdFlags[]=\n{\n  /* CMD_MOV   */ CF_OP2 | CF_BYTEMODE,\n  /* CMD_CMP   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_ADD   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_SUB   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_JZ    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_JNZ   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_INC   */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_DEC   */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_JMP   */ CF_OP1 | CF_JUMP,\n  /* CMD_XOR   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_AND   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_OR    */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_TEST  */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_JS    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_JNS   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_JB    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_JBE   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_JA    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_JAE   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,\n  /* CMD_PUSH  */ CF_OP1,\n  /* CMD_POP   */ CF_OP1,\n  /* CMD_CALL  */ CF_OP1 | CF_PROC,\n  /* CMD_RET   */ CF_OP0 | CF_PROC,\n  /* CMD_NOT   */ CF_OP1 | CF_BYTEMODE,\n  /* CMD_SHL   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_SHR   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_SAR   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_NEG   */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,\n  /* CMD_PUSHA */ CF_OP0,\n  /* CMD_POPA  */ CF_OP0,\n  /* CMD_PUSHF */ CF_OP0 | CF_USEFLAGS,\n  /* CMD_POPF  */ CF_OP0 | CF_CHFLAGS,\n  /* CMD_MOVZX */ CF_OP2,\n  /* CMD_MOVSX */ CF_OP2,\n  /* CMD_XCHG  */ CF_OP2 | CF_BYTEMODE,\n  /* CMD_MUL   */ CF_OP2 | CF_BYTEMODE,\n  /* CMD_DIV   */ CF_OP2 | CF_BYTEMODE,\n  /* CMD_ADC   */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,\n  /* CMD_SBB   */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,\n  /* CMD_PRINT */ CF_OP0\n};\n\nCVm::CVm(): Mem(NULL) {}\n\nbool CVm::Create()\n{\n  if (Mem == NULL)\n    Mem = (Byte *)::MyAlloc(kSpaceSize + 4);\n  return (Mem != NULL);\n}\n\nCVm::~CVm()\n{\n  ::MyFree(Mem);\n}\n\n// CVm::Execute can change CProgram object: it clears progarm if VM returns error.\n\nbool CVm::Execute(CProgram *prg, const CProgramInitState *initState,\n    CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData)\n{\n  memcpy(R, initState->InitR, sizeof(initState->InitR));\n  R[kStackRegIndex] = kSpaceSize;\n  R[kNumRegs] = 0;\n  Flags = 0;\n\n  UInt32 globalSize = MyMin((UInt32)initState->GlobalData.Size(), kGlobalSize);\n  if (globalSize != 0)\n    memcpy(Mem + kGlobalOffset, &initState->GlobalData[0], globalSize);\n  UInt32 staticSize = MyMin((UInt32)prg->StaticData.Size(), kGlobalSize - globalSize);\n  if (staticSize != 0)\n    memcpy(Mem + kGlobalOffset + globalSize, &prg->StaticData[0], staticSize);\n\n  bool res = true;\n  #ifdef RARVM_STANDARD_FILTERS\n  if (prg->StandardFilterIndex >= 0)\n    ExecuteStandardFilter(prg->StandardFilterIndex);\n  else\n  #endif\n  {\n    res = ExecuteCode(prg);\n    if (!res)\n      prg->Commands[0].OpCode = CMD_RET;\n  }\n  UInt32 newBlockPos = GetFixedGlobalValue32(NGlobalOffset::kBlockPos) & kSpaceMask;\n  UInt32 newBlockSize = GetFixedGlobalValue32(NGlobalOffset::kBlockSize) & kSpaceMask;\n  if (newBlockPos + newBlockSize >= kSpaceSize)\n    newBlockPos = newBlockSize = 0;\n  outBlockRef.Offset = newBlockPos;\n  outBlockRef.Size = newBlockSize;\n\n  outGlobalData.Clear();\n  UInt32 dataSize = GetFixedGlobalValue32(NGlobalOffset::kGlobalMemOutSize);\n  dataSize = MyMin(dataSize, kGlobalSize - kFixedGlobalSize);\n  if (dataSize != 0)\n  {\n    dataSize += kFixedGlobalSize;\n    outGlobalData.Reserve(dataSize);\n    for (UInt32 i = 0; i < dataSize; i++)\n      outGlobalData.Add(Mem[kGlobalOffset + i]);\n  }\n  return res;\n}\n\n\n#define SET_IP(IP) \\\n  if ((IP) >= numCommands) return true; \\\n  if (--maxOpCount <= 0) return false; \\\n  cmd = commands + (IP);\n\n#define GET_FLAG_S_B(res) (((res) & 0x80) ? FLAG_S : 0)\n#define SET_IP_OP1 { UInt32 val = GetOperand32(&cmd->Op1); SET_IP(val); }\n#define FLAGS_UPDATE_SZ Flags = res == 0 ? FLAG_Z : res & FLAG_S\n#define FLAGS_UPDATE_SZ_B Flags = (res & 0xFF) == 0 ? FLAG_Z : GET_FLAG_S_B(res)\n\nUInt32 CVm::GetOperand32(const COperand *op) const\n{\n  switch(op->Type)\n  {\n    case OP_TYPE_REG: return R[op->Data];\n    case OP_TYPE_REGMEM: return GetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask]);\n    default: return op->Data;\n  }\n}\n\nvoid CVm::SetOperand32(const COperand *op, UInt32 val)\n{\n  switch(op->Type)\n  {\n    case OP_TYPE_REG: R[op->Data] = val; return;\n    case OP_TYPE_REGMEM: SetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask], val); return;\n  }\n}\n\nByte CVm::GetOperand8(const COperand *op) const\n{\n  switch(op->Type)\n  {\n    case OP_TYPE_REG: return (Byte)R[op->Data];\n    case OP_TYPE_REGMEM: return Mem[(op->Base + R[op->Data]) & kSpaceMask];;\n    default: return (Byte)op->Data;\n  }\n}\n\nvoid CVm::SetOperand8(const COperand *op, Byte val)\n{\n  switch(op->Type)\n  {\n    case OP_TYPE_REG: R[op->Data] = (R[op->Data] & 0xFFFFFF00) | val; return;\n    case OP_TYPE_REGMEM: Mem[(op->Base + R[op->Data]) & kSpaceMask] = val; return;\n  }\n}\n\nUInt32 CVm::GetOperand(bool byteMode, const COperand *op) const\n{\n  if (byteMode)\n    return GetOperand8(op);\n  return GetOperand32(op);\n}\n\nvoid CVm::SetOperand(bool byteMode, const COperand *op, UInt32 val)\n{\n  if (byteMode)\n    SetOperand8(op, (Byte)(val & 0xFF));\n  else\n    SetOperand32(op, val);\n}\n\nbool CVm::ExecuteCode(const CProgram *prg)\n{\n  Int32 maxOpCount = 25000000;\n  const CCommand *commands = &prg->Commands[0];\n  const CCommand *cmd = commands;\n  UInt32 numCommands = prg->Commands.Size();\n  for (;;)\n  {\n    switch(cmd->OpCode)\n    {\n      #ifndef RARVM_NO_VM\n      \n      case CMD_MOV:\n        SetOperand32(&cmd->Op1, GetOperand32(&cmd->Op2));\n        break;\n      case CMD_MOVB:\n        SetOperand8(&cmd->Op1, GetOperand8(&cmd->Op2));\n        break;\n      case CMD_CMP:\n        {\n          UInt32 v1 = GetOperand32(&cmd->Op1);\n          UInt32 res = v1 - GetOperand32(&cmd->Op2);\n          Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);\n        }\n        break;\n      case CMD_CMPB:\n        {\n          Byte v1 = GetOperand8(&cmd->Op1);\n          Byte res = v1 - GetOperand8(&cmd->Op2);\n          res &= 0xFF;\n          Flags = res == 0 ? FLAG_Z : (res > v1) | GET_FLAG_S_B(res);\n        }\n        break;\n      case CMD_ADD:\n        {\n          UInt32 v1 = GetOperand32(&cmd->Op1);\n          UInt32 res = v1 + GetOperand32(&cmd->Op2);\n          SetOperand32(&cmd->Op1, res);\n          Flags = (res < v1) | (res == 0 ? FLAG_Z : (res & FLAG_S));\n        }\n        break;\n      case CMD_ADDB:\n        {\n          Byte v1 = GetOperand8(&cmd->Op1);\n          Byte res = v1 + GetOperand8(&cmd->Op2);\n          res &= 0xFF;\n          SetOperand8(&cmd->Op1, (Byte)res);\n          Flags = (res < v1) | (res == 0 ? FLAG_Z : GET_FLAG_S_B(res));\n        }\n        break;\n      case CMD_ADC:\n        {\n          UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);\n          UInt32 FC = (Flags & FLAG_C);\n          UInt32 res = v1 + GetOperand(cmd->ByteMode, &cmd->Op2) + FC;\n          if (cmd->ByteMode)\n            res &= 0xFF;\n          SetOperand(cmd->ByteMode, &cmd->Op1, res);\n          Flags = (res < v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));\n        }\n        break;\n      case CMD_SUB:\n        {\n          UInt32 v1 = GetOperand32(&cmd->Op1);\n          UInt32 res = v1 - GetOperand32(&cmd->Op2);\n          SetOperand32(&cmd->Op1, res);\n          Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);\n        }\n        break;\n      case CMD_SUBB:\n        {\n          UInt32 v1 = GetOperand8(&cmd->Op1);\n          UInt32 res = v1 - GetOperand8(&cmd->Op2);\n          SetOperand8(&cmd->Op1, (Byte)res);\n          Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);\n        }\n        break;\n      case CMD_SBB:\n        {\n          UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);\n          UInt32 FC = (Flags & FLAG_C);\n          UInt32 res = v1 - GetOperand(cmd->ByteMode, &cmd->Op2) - FC;\n          // Flags = res == 0 ? FLAG_Z : (res > v1 || res == v1 && FC) | (res & FLAG_S);\n          if (cmd->ByteMode)\n            res &= 0xFF;\n          SetOperand(cmd->ByteMode, &cmd->Op1, res);\n          Flags = (res > v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));\n        }\n        break;\n      case CMD_INC:\n        {\n          UInt32 res = GetOperand32(&cmd->Op1) + 1;\n          SetOperand32(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ;\n        }\n        break;\n      case CMD_INCB:\n        {\n          Byte res = GetOperand8(&cmd->Op1) + 1;\n          SetOperand8(&cmd->Op1, res);;\n          FLAGS_UPDATE_SZ_B;\n        }\n        break;\n      case CMD_DEC:\n        {\n          UInt32 res = GetOperand32(&cmd->Op1) - 1;\n          SetOperand32(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ;\n        }\n        break;\n      case CMD_DECB:\n        {\n          Byte res = GetOperand8(&cmd->Op1) - 1;\n          SetOperand8(&cmd->Op1, res);;\n          FLAGS_UPDATE_SZ_B;\n        }\n        break;\n      case CMD_XOR:\n        {\n          UInt32 res = GetOperand32(&cmd->Op1) ^ GetOperand32(&cmd->Op2);\n          SetOperand32(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ;\n        }\n        break;\n      case CMD_XORB:\n        {\n          Byte res = GetOperand8(&cmd->Op1) ^ GetOperand8(&cmd->Op2);\n          SetOperand8(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ_B;\n        }\n        break;\n      case CMD_AND:\n        {\n          UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);\n          SetOperand32(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ;\n        }\n        break;\n      case CMD_ANDB:\n        {\n          Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);\n          SetOperand8(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ_B;\n        }\n        break;\n      case CMD_OR:\n        {\n          UInt32 res = GetOperand32(&cmd->Op1) | GetOperand32(&cmd->Op2);\n          SetOperand32(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ;\n        }\n        break;\n      case CMD_ORB:\n        {\n          Byte res = GetOperand8(&cmd->Op1) | GetOperand8(&cmd->Op2);\n          SetOperand8(&cmd->Op1, res);\n          FLAGS_UPDATE_SZ_B;\n        }\n        break;\n      case CMD_TEST:\n        {\n          UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);\n          FLAGS_UPDATE_SZ;\n        }\n        break;\n      case CMD_TESTB:\n        {\n          Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);\n          FLAGS_UPDATE_SZ_B;\n        }\n        break;\n      case CMD_NOT:\n        SetOperand(cmd->ByteMode, &cmd->Op1, ~GetOperand(cmd->ByteMode, &cmd->Op1));\n        break;\n      case CMD_NEG:\n        {\n          UInt32 res = 0 - GetOperand32(&cmd->Op1);\n          SetOperand32(&cmd->Op1, res);\n          Flags = res == 0 ? FLAG_Z : FLAG_C | (res & FLAG_S);\n        }\n        break;\n      case CMD_NEGB:\n        {\n          Byte res = (Byte)(0 - GetOperand8(&cmd->Op1));\n          SetOperand8(&cmd->Op1, res);\n          Flags = res == 0 ? FLAG_Z : FLAG_C | GET_FLAG_S_B(res);\n        }\n        break;\n\n      case CMD_SHL:\n        {\n          UInt32 v1 = GetOperand32(&cmd->Op1);\n          int v2 = (int)GetOperand32(&cmd->Op2);\n          UInt32 res = v1 << v2;\n          SetOperand32(&cmd->Op1, res);\n          Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 << (v2 - 1)) & 0x80000000 ? FLAG_C : 0);\n        }\n        break;\n      case CMD_SHLB:\n        {\n          Byte v1 = GetOperand8(&cmd->Op1);\n          int v2 = (int)GetOperand8(&cmd->Op2);\n          Byte res = (Byte)(v1 << v2);\n          SetOperand8(&cmd->Op1, res);\n          Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 << (v2 - 1)) & 0x80 ? FLAG_C : 0);\n        }\n        break;\n      case CMD_SHR:\n        {\n          UInt32 v1 = GetOperand32(&cmd->Op1);\n          int v2 = (int)GetOperand32(&cmd->Op2);\n          UInt32 res = v1 >> v2;\n          SetOperand32(&cmd->Op1, res);\n          Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);\n        }\n        break;\n      case CMD_SHRB:\n        {\n          Byte v1 = GetOperand8(&cmd->Op1);\n          int v2 = (int)GetOperand8(&cmd->Op2);\n          Byte res = (Byte)(v1 >> v2);\n          SetOperand8(&cmd->Op1, res);\n          Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);\n        }\n        break;\n      case CMD_SAR:\n        {\n          UInt32 v1 = GetOperand32(&cmd->Op1);\n          int v2 = (int)GetOperand32(&cmd->Op2);\n          UInt32 res = UInt32(((Int32)v1) >> v2);\n          SetOperand32(&cmd->Op1, res);\n          Flags= (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);\n        }\n        break;\n      case CMD_SARB:\n        {\n          Byte v1 = GetOperand8(&cmd->Op1);\n          int v2 = (int)GetOperand8(&cmd->Op2);\n          Byte res = (Byte)(((signed char)v1) >> v2);\n          SetOperand8(&cmd->Op1, res);\n          Flags= (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);\n        }\n        break;\n\n      case CMD_JMP:\n        SET_IP_OP1;\n        continue;\n      case CMD_JZ:\n        if ((Flags & FLAG_Z) != 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      case CMD_JNZ:\n        if ((Flags & FLAG_Z) == 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      case CMD_JS:\n        if ((Flags & FLAG_S) != 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      case CMD_JNS:\n        if ((Flags & FLAG_S) == 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      case CMD_JB:\n        if ((Flags & FLAG_C) != 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      case CMD_JBE:\n        if ((Flags & (FLAG_C | FLAG_Z)) != 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      case CMD_JA:\n        if ((Flags & (FLAG_C | FLAG_Z)) == 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      case CMD_JAE:\n        if ((Flags & FLAG_C) == 0)\n        {\n          SET_IP_OP1;\n          continue;\n        }\n        break;\n      \n      case CMD_PUSH:\n        R[kStackRegIndex] -= 4;\n        SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], GetOperand32(&cmd->Op1));\n        break;\n      case CMD_POP:\n        SetOperand32(&cmd->Op1, GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]));\n        R[kStackRegIndex] += 4;\n        break;\n      case CMD_CALL:\n        R[kStackRegIndex] -= 4;\n        SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], (UInt32)(cmd - commands + 1));\n        SET_IP_OP1;\n        continue;\n\n      case CMD_PUSHA:\n        {\n          for (UInt32 i = 0, SP = R[kStackRegIndex] - 4; i < kNumRegs; i++, SP -= 4)\n            SetValue32(&Mem[SP & kSpaceMask], R[i]);\n          R[kStackRegIndex] -= kNumRegs * 4;\n        }\n        break;\n      case CMD_POPA:\n        {\n          for (UInt32 i = 0, SP = R[kStackRegIndex]; i < kNumRegs; i++, SP += 4)\n            R[kStackRegIndex - i] = GetValue32(&Mem[SP & kSpaceMask]);\n        }\n        break;\n      case CMD_PUSHF:\n        R[kStackRegIndex] -= 4;\n        SetValue32(&Mem[R[kStackRegIndex]&kSpaceMask], Flags);\n        break;\n      case CMD_POPF:\n        Flags = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);\n        R[kStackRegIndex] += 4;\n        break;\n      \n      case CMD_MOVZX:\n        SetOperand32(&cmd->Op1, GetOperand8(&cmd->Op2));\n        break;\n      case CMD_MOVSX:\n        SetOperand32(&cmd->Op1, (UInt32)(Int32)(signed char)GetOperand8(&cmd->Op2));\n        break;\n      case CMD_XCHG:\n        {\n          UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);\n          SetOperand(cmd->ByteMode, &cmd->Op1, GetOperand(cmd->ByteMode, &cmd->Op2));\n          SetOperand(cmd->ByteMode, &cmd->Op2, v1);\n        }\n        break;\n      case CMD_MUL:\n        {\n          UInt32 res = GetOperand32(&cmd->Op1) * GetOperand32(&cmd->Op2);\n          SetOperand32(&cmd->Op1, res);\n        }\n        break;\n      case CMD_MULB:\n        {\n          Byte res = GetOperand8(&cmd->Op1) * GetOperand8(&cmd->Op2);\n          SetOperand8(&cmd->Op1, res);\n        }\n        break;\n      case CMD_DIV:\n        {\n          UInt32 divider = GetOperand(cmd->ByteMode, &cmd->Op2);\n          if (divider != 0)\n          {\n            UInt32 res = GetOperand(cmd->ByteMode, &cmd->Op1) / divider;\n            SetOperand(cmd->ByteMode, &cmd->Op1, res);\n          }\n        }\n        break;\n      \n      #endif\n      \n      case CMD_RET:\n        {\n          if (R[kStackRegIndex] >= kSpaceSize)\n            return true;\n          UInt32 ip = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);\n          SET_IP(ip);\n          R[kStackRegIndex] += 4;\n          continue;\n        }\n      case CMD_PRINT:\n        break;\n    }\n    cmd++;\n    --maxOpCount;\n  }\n}\n\n\n//////////////////////////////////////////////////////\n// Read program\n\nUInt32 ReadEncodedUInt32(CMemBitDecoder &inp)\n{\n  switch(inp.ReadBits(2))\n  {\n    case 0:\n      return inp.ReadBits(4);\n    case 1:\n    {\n      UInt32 v = inp.ReadBits(4);\n      if (v == 0)\n        return 0xFFFFFF00 | inp.ReadBits(8);\n      else\n        return (v << 4) | inp.ReadBits(4);\n    }\n    case 2:\n      return inp.ReadBits(16);\n    default:\n      return inp.ReadBits(32);\n  }\n}\n\nvoid CVm::DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode)\n{\n  if (inp.ReadBit())\n  {\n    op.Type = OP_TYPE_REG;\n    op.Data = inp.ReadBits(kNumRegBits);\n  }\n  else if (inp.ReadBit() == 0)\n  {\n    op.Type = OP_TYPE_INT;\n    if (byteMode)\n      op.Data = inp.ReadBits(8);\n    else\n      op.Data = ReadEncodedUInt32(inp);\n  }\n  else\n  {\n    op.Type = OP_TYPE_REGMEM;\n    if (inp.ReadBit() == 0)\n    {\n      op.Data = inp.ReadBits(kNumRegBits);\n      op.Base = 0;\n    }\n    else\n    {\n      if (inp.ReadBit() == 0)\n        op.Data = inp.ReadBits(kNumRegBits);\n      else\n        op.Data = kNumRegs;\n      op.Base = ReadEncodedUInt32(inp);\n    }\n  }\n}\n\nvoid CVm::ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg)\n{\n  CMemBitDecoder inp;\n  inp.Init(code, codeSize);\n\n  prg->StaticData.Clear();\n  if (inp.ReadBit())\n  {\n    UInt32 dataSize = ReadEncodedUInt32(inp) + 1;\n    for (UInt32 i = 0; inp.Avail() && i < dataSize; i++)\n      prg->StaticData.Add((Byte)inp.ReadBits(8));\n  }\n  while (inp.Avail())\n  {\n    prg->Commands.Add(CCommand());\n    CCommand *cmd = &prg->Commands.Back();\n    if (inp.ReadBit() == 0)\n      cmd->OpCode = (ECommand)inp.ReadBits(3);\n    else\n      cmd->OpCode = (ECommand)(8 + inp.ReadBits(5));\n    if (kCmdFlags[cmd->OpCode] & CF_BYTEMODE)\n      cmd->ByteMode = (inp.ReadBit()) ? true : false;\n    else\n      cmd->ByteMode = 0;\n    int opNum = (kCmdFlags[cmd->OpCode] & CF_OPMASK);\n    if (opNum > 0)\n    {\n      DecodeArg(inp, cmd->Op1, cmd->ByteMode);\n      if (opNum == 2)\n        DecodeArg(inp, cmd->Op2, cmd->ByteMode);\n      else\n      {\n        if (cmd->Op1.Type == OP_TYPE_INT && (kCmdFlags[cmd->OpCode] & (CF_JUMP | CF_PROC)))\n        {\n          int Distance = cmd->Op1.Data;\n          if (Distance >= 256)\n            Distance -= 256;\n          else\n          {\n            if (Distance >= 136)\n              Distance -= 264;\n            else if (Distance >= 16)\n              Distance -= 8;\n            else if (Distance >= 8)\n              Distance -= 16;\n            Distance += prg->Commands.Size() - 1;\n          }\n          cmd->Op1.Data = Distance;\n        }\n      }\n    }\n    if (cmd->ByteMode)\n    {\n      switch (cmd->OpCode)\n      {\n        case CMD_MOV: cmd->OpCode = CMD_MOVB; break;\n        case CMD_CMP: cmd->OpCode = CMD_CMPB; break;\n        case CMD_ADD: cmd->OpCode = CMD_ADDB; break;\n        case CMD_SUB: cmd->OpCode = CMD_SUBB; break;\n        case CMD_INC: cmd->OpCode = CMD_INCB; break;\n        case CMD_DEC: cmd->OpCode = CMD_DECB; break;\n        case CMD_XOR: cmd->OpCode = CMD_XORB; break;\n        case CMD_AND: cmd->OpCode = CMD_ANDB; break;\n        case CMD_OR: cmd->OpCode = CMD_ORB; break;\n        case CMD_TEST: cmd->OpCode = CMD_TESTB; break;\n        case CMD_NEG: cmd->OpCode = CMD_NEGB; break;\n        case CMD_SHL: cmd->OpCode = CMD_SHLB; break;\n        case CMD_SHR: cmd->OpCode = CMD_SHRB; break;\n        case CMD_SAR: cmd->OpCode = CMD_SARB; break;\n        case CMD_MUL: cmd->OpCode = CMD_MULB; break;\n      }\n    }\n  }\n}\n\n#ifdef RARVM_STANDARD_FILTERS\n\nenum EStandardFilter\n{\n  SF_E8,\n  SF_E8E9,\n  SF_ITANIUM,\n  SF_RGB,\n  SF_AUDIO,\n  SF_DELTA,\n  SF_UPCASE\n};\n\nstruct StandardFilterSignature\n{\n  UInt32 Length;\n  UInt32 CRC;\n  EStandardFilter Type;\n}\nkStdFilters[]=\n{\n   53, 0xad576887, SF_E8,\n   57, 0x3cd7e57e, SF_E8E9,\n  120, 0x3769893f, SF_ITANIUM,\n   29, 0x0e06077d, SF_DELTA,\n  149, 0x1c2c5dc8, SF_RGB,\n  216, 0xbc85e701, SF_AUDIO,\n   40, 0x46b9c560, SF_UPCASE\n};\n\nstatic int FindStandardFilter(const Byte *code, UInt32 codeSize)\n{\n  UInt32 crc = CrcCalc(code, codeSize);\n  for (int i = 0; i < sizeof(kStdFilters) / sizeof(kStdFilters[0]); i++)\n  {\n    StandardFilterSignature &sfs = kStdFilters[i];\n    if (sfs.CRC == crc && sfs.Length == codeSize)\n      return i;\n  }\n  return -1;\n}\n\n#endif\n\nvoid CVm::PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg)\n{\n  Byte xorSum = 0;\n  for (UInt32 i = 1; i < codeSize; i++)\n    xorSum ^= code[i];\n\n  prg->Commands.Clear();\n  #ifdef RARVM_STANDARD_FILTERS\n  prg->StandardFilterIndex = -1;\n  #endif\n\n  if (xorSum == code[0] && codeSize > 0)\n  {\n    #ifdef RARVM_STANDARD_FILTERS\n    prg->StandardFilterIndex = FindStandardFilter(code, codeSize);\n    if (prg->StandardFilterIndex >= 0)\n      return;\n    #endif\n    // 1 byte for checksum\n    ReadVmProgram(code + 1, codeSize - 1, prg);\n  }\n  prg->Commands.Add(CCommand());\n  CCommand *cmd = &prg->Commands.Back();\n  cmd->OpCode = CMD_RET;\n}\n\nvoid CVm::SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize)\n{\n  if (pos < kSpaceSize && data != Mem + pos)\n    memmove(Mem + pos, data, MyMin(dataSize, kSpaceSize - pos));\n}\n\n#ifdef RARVM_STANDARD_FILTERS\n\nstatic void E8E9Decode(Byte *data, UInt32 dataSize, UInt32 fileOffset, bool e9)\n{\n  if (dataSize <= 4)\n    return;\n  dataSize -= 4;\n  const UInt32 kFileSize = 0x1000000;\n  Byte cmpByte2 = (e9 ? 0xE9 : 0xE8);\n  for (UInt32 curPos = 0; curPos < dataSize;)\n  {\n    Byte curByte = *(data++);\n    curPos++;\n    if (curByte == 0xE8 || curByte == cmpByte2)\n    {\n      UInt32 offset = curPos + fileOffset;\n      UInt32 addr = (Int32)GetValue32(data);\n      if (addr < kFileSize)\n        SetValue32(data, addr - offset);\n      else if ((Int32)addr < 0 && (Int32)(addr + offset) >= 0)\n        SetValue32(data, addr + kFileSize);\n      data += 4;\n      curPos += 4;\n    }\n  }\n}\n\nstatic inline UInt32 ItaniumGetOpType(const Byte *data, int bitPos)\n{\n  return (data[(unsigned int)bitPos >> 3] >> (bitPos & 7)) & 0xF;\n}\n\n\nstatic void ItaniumDecode(Byte *data, UInt32 dataSize, UInt32 fileOffset)\n{\n  UInt32 curPos = 0;\n  fileOffset >>= 4;\n  while (curPos < dataSize - 21)\n  {\n    int b = (data[0] & 0x1F) - 0x10;\n    if (b >= 0)\n    {\n      static Byte kCmdMasks[16] = {4,4,6,6,0,0,7,7,4,4,0,0,4,4,0,0};\n      Byte cmdMask = kCmdMasks[b];\n      if (cmdMask != 0)\n        for (int i = 0; i < 3; i++)\n          if (cmdMask & (1 << i))\n          {\n            int startPos = i * 41 + 18;\n            if (ItaniumGetOpType(data, startPos + 24) == 5)\n            {\n              const UInt32 kMask = 0xFFFFF;\n              Byte *p = data + ((unsigned int)startPos >> 3);\n              UInt32 bitField =  ((UInt32)p[0]) | ((UInt32)p[1] <<  8) | ((UInt32)p[2] << 16);\n              int inBit = (startPos & 7);\n              UInt32 offset = (bitField >> inBit) & kMask;\n              UInt32 andMask = ~(kMask << inBit);\n              bitField = ((offset - fileOffset) & kMask) << inBit;\n              for (int j = 0; j < 3; j++)\n              {\n                p[j] &= andMask;\n                p[j] |= bitField;\n                andMask >>= 8;\n                bitField >>= 8;\n              }\n            }\n          }\n    }\n    data += 16;\n    curPos += 16;\n    fileOffset++;\n  }\n}\n\nstatic void DeltaDecode(Byte *data, UInt32 dataSize, UInt32 numChannels)\n{\n  UInt32 srcPos = 0;\n  UInt32 border = dataSize * 2;\n  for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)\n  {\n    Byte prevByte = 0;\n    for (UInt32 destPos = dataSize + curChannel; destPos < border; destPos += numChannels)\n      data[destPos] = (prevByte = prevByte - data[srcPos++]);\n  }\n}\n\nstatic void RgbDecode(Byte *srcData, UInt32 dataSize, UInt32 width, UInt32 posR)\n{\n  Byte *destData = srcData + dataSize;\n  const UInt32 numChannels = 3;\n  for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)\n  {\n    Byte prevByte = 0;\n    \n    for (UInt32 i = curChannel; i < dataSize; i+= numChannels)\n    {\n      unsigned int predicted;\n      if (i < width)\n        predicted = prevByte;\n      else\n      {\n        unsigned int upperLeftByte = destData[i - width];\n        unsigned int upperByte = destData[i - width + 3];\n        predicted = prevByte + upperByte - upperLeftByte;\n        int pa = abs((int)(predicted - prevByte));\n        int pb = abs((int)(predicted - upperByte));\n        int pc = abs((int)(predicted - upperLeftByte));\n        if (pa <= pb && pa <= pc)\n          predicted = prevByte;\n        else\n          if (pb <= pc)\n            predicted = upperByte;\n          else\n            predicted = upperLeftByte;\n      }\n      destData[i] = prevByte = (Byte)(predicted - *(srcData++));\n    }\n  }\n  if (dataSize < 3)\n    return;\n  for (UInt32 i = posR, border = dataSize - 2; i < border; i += 3)\n  {\n    Byte g = destData[i + 1];\n    destData[i] = destData[i] + g;\n    destData[i + 2] = destData[i + 2] + g;\n  }\n}\n\nstatic void AudioDecode(Byte *srcData, UInt32 dataSize, UInt32 numChannels)\n{\n  Byte *destData = srcData + dataSize;\n  for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)\n  {\n    UInt32 prevByte = 0, prevDelta = 0, dif[7];\n    Int32 D1 = 0, D2 = 0, D3;\n    Int32 K1 = 0, K2 = 0, K3 = 0;\n    memset(dif, 0, sizeof(dif));\n    \n    for (UInt32 i = curChannel, byteCount = 0; i < dataSize; i += numChannels, byteCount++)\n    {\n      D3 = D2;\n      D2 = prevDelta - D1;\n      D1 = prevDelta;\n      \n      UInt32 predicted = 8 * prevByte + K1 * D1 + K2 * D2 + K3 * D3;\n      predicted = (predicted >> 3) & 0xFF;\n      \n      UInt32 curByte = *(srcData++);\n      \n      predicted -= curByte;\n      destData[i] = (Byte)predicted;\n      prevDelta = (UInt32)(Int32)(signed char)(predicted - prevByte);\n      prevByte = predicted;\n      \n      Int32 D = ((Int32)(signed char)curByte) << 3;\n      \n      dif[0] += abs(D);\n      dif[1] += abs(D - D1);\n      dif[2] += abs(D + D1);\n      dif[3] += abs(D - D2);\n      dif[4] += abs(D + D2);\n      dif[5] += abs(D - D3);\n      dif[6] += abs(D + D3);\n      \n      if ((byteCount & 0x1F) == 0)\n      {\n        UInt32 minDif = dif[0], numMinDif = 0;\n        dif[0] = 0;\n        for (int j = 1; j < sizeof(dif) / sizeof(dif[0]); j++)\n        {\n          if (dif[j] < minDif)\n          {\n            minDif = dif[j];\n            numMinDif = j;\n          }\n          dif[j] = 0;\n        }\n        switch (numMinDif)\n        {\n          case 1: if (K1 >= -16) K1--; break;\n          case 2: if (K1 <   16) K1++; break;\n          case 3: if (K2 >= -16) K2--; break;\n          case 4: if (K2 <   16) K2++; break;\n          case 5: if (K3 >= -16) K3--; break;\n          case 6: if (K3 <   16) K3++; break;\n        }\n      }\n    }\n  }\n}\n\nstatic UInt32 UpCaseDecode(Byte *data, UInt32 dataSize)\n{\n  UInt32 srcPos = 0, destPos = dataSize;\n  while (srcPos < dataSize)\n  {\n    Byte curByte = data[srcPos++];\n    if (curByte == 2 && (curByte = data[srcPos++]) != 2)\n      curByte -= 32;\n    data[destPos++] = curByte;\n  }\n  return destPos - dataSize;\n}\n\nvoid CVm::ExecuteStandardFilter(int filterIndex)\n{\n  UInt32 dataSize = R[4];\n  if (dataSize >= kGlobalOffset)\n    return;\n  EStandardFilter filterType = kStdFilters[filterIndex].Type;\n\n  switch (filterType)\n  {\n    case SF_E8:\n    case SF_E8E9:\n      E8E9Decode(Mem, dataSize, R[6], (filterType == SF_E8E9));\n      break;\n    case SF_ITANIUM:\n      ItaniumDecode(Mem, dataSize, R[6]);\n      break;\n    case SF_DELTA:\n      if (dataSize >= kGlobalOffset / 2)\n        break;\n      SetBlockPos(dataSize);\n      DeltaDecode(Mem, dataSize, R[0]);\n      break;\n    case SF_RGB:\n      if (dataSize >= kGlobalOffset / 2)\n        break;\n      {\n        UInt32 width = R[0];\n        if (width <= 3)\n          break;\n        SetBlockPos(dataSize);\n        RgbDecode(Mem, dataSize, width, R[1]);\n      }\n      break;\n    case SF_AUDIO:\n      if (dataSize >= kGlobalOffset / 2)\n        break;\n      SetBlockPos(dataSize);\n      AudioDecode(Mem, dataSize, R[0]);\n      break;\n    case SF_UPCASE:\n      if (dataSize >= kGlobalOffset / 2)\n        break;\n      UInt32 destSize = UpCaseDecode(Mem, dataSize);\n      SetBlockSize(destSize);\n      SetBlockPos(dataSize);\n      break;\n  }\n}\n\n#endif\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/Rar3Vm.h",
    "content": "// Rar3Vm.h\n// According to unRAR license, this code may not be used to develop\n// a program that creates RAR archives\n\n#ifndef __COMPRESS_RAR3_VM_H\n#define __COMPRESS_RAR3_VM_H\n\n#include \"../../../C/CpuArch.h\"\n\n#include \"Common/MyVector.h\"\n#include \"Common/Types.h\"\n\n#define RARVM_STANDARD_FILTERS\n\nnamespace NCompress {\nnamespace NRar3 {\n\nclass CMemBitDecoder\n{\n  const Byte *_data;\n  UInt32 _bitSize;\n  UInt32 _bitPos;\npublic:\n  void Init(const Byte *data, UInt32 byteSize)\n  {\n    _data = data;\n    _bitSize = (byteSize << 3);\n    _bitPos = 0;\n  }\n  UInt32 ReadBits(int numBits);\n  UInt32 ReadBit();\n  bool Avail() const { return (_bitPos < _bitSize); }\n};\n\nnamespace NVm {\n\ninline UInt32 GetValue32(const void *addr) { return GetUi32(addr); }\ninline void SetValue32(void *addr, UInt32 value) { SetUi32(addr, value); }\n\nUInt32 ReadEncodedUInt32(CMemBitDecoder &inp);\n\nconst int kNumRegBits = 3;\nconst UInt32 kNumRegs = 1 << kNumRegBits;\nconst UInt32 kNumGpRegs = kNumRegs - 1;\n\nconst UInt32 kSpaceSize = 0x40000;\nconst UInt32 kSpaceMask = kSpaceSize -1;\nconst UInt32 kGlobalOffset = 0x3C000;\nconst UInt32 kGlobalSize = 0x2000;\nconst UInt32 kFixedGlobalSize = 64;\n\nnamespace NGlobalOffset\n{\n  const UInt32 kBlockSize = 0x1C;\n  const UInt32 kBlockPos  = 0x20;\n  const UInt32 kExecCount = 0x2C;\n  const UInt32 kGlobalMemOutSize = 0x30;\n}\n\nenum ECommand\n{\n  CMD_MOV,  CMD_CMP,  CMD_ADD,  CMD_SUB,  CMD_JZ,   CMD_JNZ,  CMD_INC,  CMD_DEC,\n  CMD_JMP,  CMD_XOR,  CMD_AND,  CMD_OR,   CMD_TEST, CMD_JS,   CMD_JNS,  CMD_JB,\n  CMD_JBE,  CMD_JA,   CMD_JAE,  CMD_PUSH, CMD_POP,  CMD_CALL, CMD_RET,  CMD_NOT,\n  CMD_SHL,  CMD_SHR,  CMD_SAR,  CMD_NEG,  CMD_PUSHA,CMD_POPA, CMD_PUSHF,CMD_POPF,\n  CMD_MOVZX,CMD_MOVSX,CMD_XCHG, CMD_MUL,  CMD_DIV,  CMD_ADC,  CMD_SBB,  CMD_PRINT,\n\n  CMD_MOVB, CMD_CMPB, CMD_ADDB, CMD_SUBB, CMD_INCB, CMD_DECB,\n  CMD_XORB, CMD_ANDB, CMD_ORB,  CMD_TESTB,CMD_NEGB,\n  CMD_SHLB, CMD_SHRB, CMD_SARB, CMD_MULB\n};\n\nenum EOpType {OP_TYPE_REG, OP_TYPE_INT, OP_TYPE_REGMEM, OP_TYPE_NONE};\n\n// Addr in COperand object can link (point) to CVm object!!!\n\nstruct COperand\n{\n  EOpType Type;\n  UInt32 Data;\n  UInt32 Base;\n  COperand(): Type(OP_TYPE_NONE), Data(0), Base(0) {}\n};\n\nstruct CCommand\n{\n  ECommand OpCode;\n  bool ByteMode;\n  COperand Op1, Op2;\n};\n\nstruct CBlockRef\n{\n  UInt32 Offset;\n  UInt32 Size;\n};\n\nstruct CProgram\n{\n  CRecordVector<CCommand> Commands;\n  #ifdef RARVM_STANDARD_FILTERS\n  int StandardFilterIndex;\n  #endif\n  CRecordVector<Byte> StaticData;\n};\n\nstruct CProgramInitState\n{\n  UInt32 InitR[kNumGpRegs];\n  CRecordVector<Byte> GlobalData;\n\n  void AllocateEmptyFixedGlobal()\n  {\n    GlobalData.Clear();\n    GlobalData.Reserve(NVm::kFixedGlobalSize);\n    for (UInt32 i = 0; i < NVm::kFixedGlobalSize; i++)\n      GlobalData.Add(0);\n  }\n};\n\nclass CVm\n{\n  static UInt32 GetValue(bool byteMode, const void *addr)\n  {\n    if (byteMode)\n      return(*(const Byte *)addr);\n    else\n      return GetUi32(addr);\n  }\n\n  static void SetValue(bool byteMode, void *addr, UInt32 value)\n  {\n    if (byteMode)\n      *(Byte *)addr = (Byte)value;\n    else\n      SetUi32(addr, value);\n  }\n\n  UInt32 GetFixedGlobalValue32(UInt32 globalOffset) { return GetValue(false, &Mem[kGlobalOffset + globalOffset]); }\n\n  void SetBlockSize(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockSize], v); }\n  void SetBlockPos(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockPos], v); }\npublic:\n  static void SetValue(void *addr, UInt32 value) { SetValue(false, addr, value); }\nprivate:\n  UInt32 GetOperand32(const COperand *op) const;\n  void SetOperand32(const COperand *op, UInt32 val);\n  Byte GetOperand8(const COperand *op) const;\n  void SetOperand8(const COperand *op, Byte val);\n  UInt32 GetOperand(bool byteMode, const COperand *op) const;\n  void SetOperand(bool byteMode, const COperand *op, UInt32 val);\n\n  void DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode);\n  \n  bool ExecuteCode(const CProgram *prg);\n  \n  #ifdef RARVM_STANDARD_FILTERS\n  void ExecuteStandardFilter(int filterIndex);\n  #endif\n  \n  Byte *Mem;\n  UInt32 R[kNumRegs + 1]; // R[kNumRegs] = 0 always (speed optimization)\n  UInt32 Flags;\n  void ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg);\npublic:\n  CVm();\n  ~CVm();\n  bool Create();\n  void PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg);\n  void SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize);\n  bool Execute(CProgram *prg, const CProgramInitState *initState,\n      CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData);\n  const Byte *GetDataPointer(UInt32 offset) const { return Mem + offset; }\n\n};\n\n#endif\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/RarCodecsRegister.cpp",
    "content": "// RarCodecsRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n\n#include \"Rar1Decoder.h\"\n#include \"Rar2Decoder.h\"\n#include \"Rar3Decoder.h\"\n\n#define CREATE_CODEC(x) static void *CreateCodec ## x() { return (void *)(ICompressCoder *)(new NCompress::NRar ## x::CDecoder); }\n\nCREATE_CODEC(1)\nCREATE_CODEC(2)\nCREATE_CODEC(3)\n\n#define RAR_CODEC(x, name) { CreateCodec ## x, 0, 0x040300 + x, L\"Rar\" name, 1, false }\n\nstatic CCodecInfo g_CodecsInfo[] =\n{\n  RAR_CODEC(1, L\"1\"),\n  RAR_CODEC(2, L\"2\"),\n  RAR_CODEC(3, L\"3\"),\n};\n\nvoid RegisterRarCodecs()\n{\n\tRegisterCodec(&g_CodecsInfo[0]);\n\tRegisterCodec(&g_CodecsInfo[1]);\n\tRegisterCodec(&g_CodecsInfo[2]);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ShrinkDecoder.cpp",
    "content": "// ShrinkDecoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"../Common/InBuffer.h\"\n#include \"../Common/OutBuffer.h\"\n\n#include \"BitlDecoder.h\"\n#include \"ShrinkDecoder.h\"\n\nnamespace NCompress {\nnamespace NShrink {\n\nstatic const UInt32 kBufferSize = (1 << 20);\nstatic const int kNumMinBits = 9;\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)\n{\n  NBitl::CBaseDecoder<CInBuffer> inBuffer;\n  COutBuffer outBuffer;\n\n  if (!inBuffer.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n  inBuffer.SetStream(inStream);\n  inBuffer.Init();\n\n  if (!outBuffer.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n  outBuffer.SetStream(outStream);\n  outBuffer.Init();\n\n  UInt64 prevPos = 0;\n  int numBits = kNumMinBits;\n  UInt32 head = 257;\n  bool needPrev = false;\n  UInt32 lastSymbol = 0;\n\n  int i;\n  for (i = 0; i < kNumItems; i++)\n    _parents[i] = 0;\n  for (i = 0; i < kNumItems; i++)\n    _suffixes[i] = 0;\n  for (i = 0; i < 257; i++)\n    _isFree[i] = false;\n  for (; i < kNumItems; i++)\n    _isFree[i] = true;\n\n  for (;;)\n  {\n    UInt32 symbol = inBuffer.ReadBits(numBits);\n    if (inBuffer.ExtraBitsWereRead())\n      break;\n    if (_isFree[symbol])\n      return S_FALSE;\n    if (symbol == 256)\n    {\n      UInt32 symbol = inBuffer.ReadBits(numBits);\n      if (symbol == 1)\n      {\n        if (numBits < kNumMaxBits)\n          numBits++;\n      }\n      else if (symbol == 2)\n      {\n        if (needPrev)\n          _isFree[head - 1] = true;\n        for (i = 257; i < kNumItems; i++)\n          _isParent[i] = false;\n        for (i = 257; i < kNumItems; i++)\n          if (!_isFree[i])\n            _isParent[_parents[i]] = true;\n        for (i = 257; i < kNumItems; i++)\n          if (!_isParent[i])\n            _isFree[i] = true;\n        head = 257;\n        while (head < kNumItems && !_isFree[head])\n          head++;\n        if (head < kNumItems)\n        {\n          needPrev = true;\n          _isFree[head] = false;\n          _parents[head] = (UInt16)lastSymbol;\n          head++;\n        }\n      }\n      else\n        return S_FALSE;\n      continue;\n    }\n    UInt32 cur = symbol;\n    i = 0;\n    int corectionIndex = -1;\n    while (cur >= 256)\n    {\n      if (cur == head - 1)\n        corectionIndex = i;\n      _stack[i++] = _suffixes[cur];\n      cur = _parents[cur];\n    }\n    _stack[i++] = (Byte)cur;\n    if (needPrev)\n    {\n      _suffixes[head - 1] = (Byte)cur;\n      if (corectionIndex >= 0)\n        _stack[corectionIndex] = (Byte)cur;\n    }\n    while (i > 0)\n      outBuffer.WriteByte((_stack[--i]));\n    while (head < kNumItems && !_isFree[head])\n      head++;\n    if (head < kNumItems)\n    {\n      needPrev = true;\n      _isFree[head] = false;\n      _parents[head] = (UInt16)symbol;\n      head++;\n    }\n    else\n      needPrev = false;\n    lastSymbol = symbol;\n\n    UInt64 nowPos = outBuffer.GetProcessedSize();\n    if (progress != NULL && nowPos - prevPos > (1 << 18))\n    {\n      prevPos = nowPos;\n      UInt64 packSize = inBuffer.GetProcessedSize();\n      RINOK(progress->SetRatioInfo(&packSize, &nowPos));\n    }\n  }\n  return outBuffer.Flush();\n}\n\nSTDMETHODIMP CDecoder ::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize,    ICompressProgressInfo *progress)\n{\n  return CodeReal(inStream, outStream, inSize, outSize, progress); \n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ShrinkDecoder.h",
    "content": "// ShrinkDecoder.h\n\n#ifndef __COMPRESS_SHRINK_DECODER_H\n#define __COMPRESS_SHRINK_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\nnamespace NCompress {\nnamespace NShrink {\n\nconst int kNumMaxBits = 13;\nconst UInt32 kNumItems = 1 << kNumMaxBits;\n\nclass CDecoder :\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  UInt16 _parents[kNumItems];\n  Byte _suffixes[kNumItems];\n  Byte _stack[kNumItems];\n  bool _isFree[kNumItems];\n  bool _isParent[kNumItems];\n\npublic:\n  MY_UNKNOWN_IMP\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n  \n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ZDecoder.cpp",
    "content": "// ZDecoder.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Alloc.h\"\n}\n\n#include \"../Common/InBuffer.h\"\n#include \"../Common/OutBuffer.h\"\n\n#include \"ZDecoder.h\"\n\nnamespace NCompress {\nnamespace NZ {\n\nstatic const UInt32 kBufferSize = (1 << 20);\nstatic const Byte kNumBitsMask = 0x1F;\nstatic const Byte kBlockModeMask = 0x80;\nstatic const int kNumMinBits = 9;\nstatic const int kNumMaxBits = 16;\n\nvoid CDecoder::Free()\n{\n  MyFree(_parents); _parents = 0;\n  MyFree(_suffixes); _suffixes = 0;\n  MyFree(_stack); _stack = 0;\n}\n\nCDecoder::~CDecoder() { Free(); }\n\nHRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)\n{\n  CInBuffer inBuffer;\n  COutBuffer outBuffer;\n\n  if (!inBuffer.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n  inBuffer.SetStream(inStream);\n  inBuffer.Init();\n\n  if (!outBuffer.Create(kBufferSize))\n    return E_OUTOFMEMORY;\n  outBuffer.SetStream(outStream);\n  outBuffer.Init();\n\n  int maxbits = _properties & kNumBitsMask;\n  if (maxbits < kNumMinBits || maxbits > kNumMaxBits)\n    return S_FALSE;\n  UInt32 numItems = 1 << maxbits;\n  bool blockMode = ((_properties & kBlockModeMask) != 0);\n\n  if (maxbits != _numMaxBits || _parents == 0 || _suffixes == 0 || _stack == 0)\n  {\n    Free();\n    _parents = (UInt16 *)MyAlloc(numItems * sizeof(UInt16)); if (_parents == 0) return E_OUTOFMEMORY;\n    _suffixes = (Byte *)MyAlloc(numItems * sizeof(Byte)); if (_suffixes == 0) return E_OUTOFMEMORY;\n    _stack = (Byte *)MyAlloc(numItems * sizeof(Byte)); if (_stack == 0) return E_OUTOFMEMORY;\n    _numMaxBits = maxbits;\n  }\n\n  UInt64 prevPos = 0;\n  int numBits = kNumMinBits;\n  UInt32 head = blockMode ? 257 : 256;\n\n  bool needPrev = false;\n\n  unsigned bitPos = 0;\n  unsigned numBufBits = 0;\n\n  Byte buf[kNumMaxBits + 4];\n\n  _parents[256] = 0; // virus protection\n  _suffixes[256] = 0;\n\n  for (;;)\n  {\n    if (numBufBits == bitPos)\n    {\n      numBufBits = (unsigned)inBuffer.ReadBytes(buf, numBits) * 8;\n      bitPos = 0;\n      UInt64 nowPos = outBuffer.GetProcessedSize();\n      if (progress != NULL && nowPos - prevPos >= (1 << 18))\n      {\n        prevPos = nowPos;\n        UInt64 packSize = inBuffer.GetProcessedSize();\n        RINOK(progress->SetRatioInfo(&packSize, &nowPos));\n      }\n    }\n    unsigned bytePos = bitPos >> 3;\n    UInt32 symbol = buf[bytePos] | ((UInt32)buf[bytePos + 1] << 8) | ((UInt32)buf[bytePos + 2] << 16);\n    symbol >>= (bitPos & 7);\n    symbol &= (1 << numBits) - 1;\n    bitPos += numBits;\n    if (bitPos > numBufBits)\n      break;\n    if (symbol >= head)\n      return S_FALSE;\n    if (blockMode && symbol == 256)\n    {\n      numBufBits = bitPos = 0;\n      numBits = kNumMinBits;\n      head = 257;\n      needPrev = false;\n      continue;\n    }\n    UInt32 cur = symbol;\n    int i = 0;\n    while (cur >= 256)\n    {\n      _stack[i++] = _suffixes[cur];\n      cur = _parents[cur];\n    }\n    _stack[i++] = (Byte)cur;\n    if (needPrev)\n    {\n      _suffixes[head - 1] = (Byte)cur;\n      if (symbol == head - 1)\n        _stack[0] = (Byte)cur;\n    }\n    do\n      outBuffer.WriteByte((_stack[--i]));\n    while (i > 0);\n    if (head < numItems)\n    {\n      needPrev = true;\n      _parents[head++] = (UInt16)symbol;\n      if (head > ((UInt32)1 << numBits))\n      {\n        if (numBits < maxbits)\n        {\n          numBufBits = bitPos = 0;\n          numBits++;\n        }\n      }\n    }\n    else\n      needPrev = false;\n  }\n  return outBuffer.Flush();\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  try { return CodeReal(inStream, outStream, inSize, outSize, progress); }\n  catch(const CInBufferException &e) { return e.ErrorCode; }\n  catch(const COutBufferException &e) { return e.ErrorCode; }\n  catch(...) { return S_FALSE; }\n}\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  if (size < 1)\n    return E_INVALIDARG;\n  _properties = data[0];\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ZDecoder.h",
    "content": "// ZDecoder.h\n\n#ifndef __COMPRESS_Z_DECODER_H\n#define __COMPRESS_Z_DECODER_H\n\n#include \"../../Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n\nnamespace NCompress {\nnamespace NZ {\n\nclass CDecoder:\n  public ICompressCoder,\n  public ICompressSetDecoderProperties2,\n  public CMyUnknownImp\n{\n  UInt16 *_parents;\n  Byte *_suffixes;\n  Byte *_stack;\n  Byte _properties;\n  int _numMaxBits;\n\npublic:\n  CDecoder(): _parents(0), _suffixes(0), _stack(0), _properties(0), _numMaxBits(0) {};\n  ~CDecoder();\n  void Free();\n\n  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)\n\n  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ZlibDecoder.cpp",
    "content": "// ZlibDecoder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"DeflateDecoder.h\"\n#include \"ZlibDecoder.h\"\n\nnamespace NCompress {\nnamespace NZlib {\n\n#define DEFLATE_TRY_BEGIN try {\n#define DEFLATE_TRY_END } \\\n  catch(...) { return S_FALSE; }\n\n#define ADLER_MOD 65521\n#define ADLER_LOOP_MAX 5550\n\nstatic UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size)\n{\n  UInt32 a = adler & 0xFFFF;\n  UInt32 b = (adler >> 16) & 0xFFFF;\n  while (size > 0)\n  {\n    unsigned curSize = (size > ADLER_LOOP_MAX) ? ADLER_LOOP_MAX : (unsigned )size;\n    unsigned i;\n    for (i = 0; i < curSize; i++)\n    {\n      a += buf[i];\n      b += a;\n    }\n    buf += curSize;\n    size -= curSize;\n    a %= ADLER_MOD;\n    b %= ADLER_MOD;\n  }\n  return (b << 16) + a;\n}\n\nSTDMETHODIMP COutStreamWithAdler::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  HRESULT result = _stream->Write(data, size, &size);\n  _adler = Adler32_Update(_adler, (const Byte *)data, size);\n  if (processedSize != NULL)\n    *processedSize = size;\n  return result;\n}\n\nSTDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)\n{\n  DEFLATE_TRY_BEGIN\n  if (!AdlerStream)\n  {\n    AdlerSpec = new COutStreamWithAdler;\n    AdlerStream = AdlerSpec;\n  }\n  if (!DeflateDecoder)\n  {\n    DeflateDecoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder;\n    DeflateDecoderSpec->ZlibMode = true;\n    DeflateDecoder = DeflateDecoderSpec;\n  }\n\n  Byte buf[2];\n  RINOK(ReadStream_FALSE(inStream, buf, 2));\n  int method = buf[0] & 0xF;\n  if (method != 8)\n    return S_FALSE;\n  // int dicSize = buf[0] >> 4;\n  if ((((UInt32)buf[0] << 8) + buf[1]) % 31 != 0)\n    return S_FALSE;\n  if ((buf[1] & 0x20) != 0) // dictPresent\n    return S_FALSE;\n  // int level = (buf[1] >> 6);\n\n  AdlerSpec->SetStream(outStream);\n  AdlerSpec->Init();\n  HRESULT res = DeflateDecoder->Code(inStream, AdlerStream, inSize, outSize, progress);\n  AdlerSpec->ReleaseStream();\n\n  if (res == S_OK)\n  {\n    const Byte *p = DeflateDecoderSpec->ZlibFooter;\n    UInt32 adler = ((UInt32)p[0] << 24) | ((UInt32)p[1] << 16) | ((UInt32)p[2] << 8) | p[3];\n    if (adler != AdlerSpec->GetAdler())\n      return S_FALSE;\n  }\n  return res;\n  DEFLATE_TRY_END\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Compress/ZlibDecoder.h",
    "content": "// ZlibDecoder.h\n\n#ifndef __ZLIB_DECODER_H\n#define __ZLIB_DECODER_H\n\n#include \"DeflateDecoder.h\"\n\nnamespace NCompress {\nnamespace NZlib {\n\nconst UInt32 ADLER_INIT_VAL = 1;\n\nclass COutStreamWithAdler:\n  public ISequentialOutStream,\n  public CMyUnknownImp\n{\n  CMyComPtr<ISequentialOutStream> _stream;\n  UInt32 _adler;\npublic:\n  MY_UNKNOWN_IMP\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  void SetStream(ISequentialOutStream *stream) { _stream = stream; }\n  void ReleaseStream() { _stream.Release(); }\n  void Init() { _adler = ADLER_INIT_VAL; }\n  UInt32 GetAdler() const { return _adler; }\n};\n\nclass CDecoder:\n  public ICompressCoder,\n  public CMyUnknownImp\n{\n  COutStreamWithAdler *AdlerSpec;\n  CMyComPtr<ISequentialOutStream> AdlerStream;\n  \n  NCompress::NDeflate::NDecoder::CCOMCoder *DeflateDecoderSpec;\n  CMyComPtr<ICompressCoder> DeflateDecoder;\npublic:\n  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,\n      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);\n\n  MY_UNKNOWN_IMP\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/7zAes.cpp",
    "content": "// 7zAes.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/Sha256.h\"\n}\n\n#include \"Windows/Synchronization.h\"\n#include \"../Common/StreamObjects.h\"\n#include \"../Common/StreamUtils.h\"\n#include \"7zAes.h\"\n#include \"MyAes.h\"\n\n#ifndef EXTRACT_ONLY\n#include \"RandGen.h\"\n#endif\n\nusing namespace NWindows;\n\nnamespace NCrypto {\nnamespace NSevenZ {\n\nbool CKeyInfo::IsEqualTo(const CKeyInfo &a) const\n{\n  if (SaltSize != a.SaltSize || NumCyclesPower != a.NumCyclesPower)\n    return false;\n  for (UInt32 i = 0; i < SaltSize; i++)\n    if (Salt[i] != a.Salt[i])\n      return false;\n  return (Password == a.Password);\n}\n\nvoid CKeyInfo::CalculateDigest()\n{\n  if (NumCyclesPower == 0x3F)\n  {\n    UInt32 pos;\n    for (pos = 0; pos < SaltSize; pos++)\n      Key[pos] = Salt[pos];\n    for (UInt32 i = 0; i < Password.GetCapacity() && pos < kKeySize; i++)\n      Key[pos++] = Password[i];\n    for (; pos < kKeySize; pos++)\n      Key[pos] = 0;\n  }\n  else\n  {\n    CSha256 sha;\n    Sha256_Init(&sha);\n    const UInt64 numRounds = UInt64(1) << (NumCyclesPower);\n    Byte temp[8] = { 0,0,0,0,0,0,0,0 };\n    for (UInt64 round = 0; round < numRounds; round++)\n    {\n      Sha256_Update(&sha, Salt, (size_t)SaltSize);\n      Sha256_Update(&sha, Password, Password.GetCapacity());\n      Sha256_Update(&sha, temp, 8);\n      for (int i = 0; i < 8; i++)\n        if (++(temp[i]) != 0)\n          break;\n    }\n    Sha256_Final(&sha, Key);\n  }\n}\n\nbool CKeyInfoCache::Find(CKeyInfo &key)\n{\n  for (int i = 0; i < Keys.Size(); i++)\n  {\n    const CKeyInfo &cached = Keys[i];\n    if (key.IsEqualTo(cached))\n    {\n      for (int j = 0; j < kKeySize; j++)\n        key.Key[j] = cached.Key[j];\n      if (i != 0)\n      {\n        Keys.Insert(0, cached);\n        Keys.Delete(i+1);\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\nvoid CKeyInfoCache::Add(CKeyInfo &key)\n{\n  if (Find(key))\n    return;\n  if (Keys.Size() >= Size)\n    Keys.DeleteBack();\n  Keys.Insert(0, key);\n}\n\nstatic CKeyInfoCache g_GlobalKeyCache(32);\nstatic NSynchronization::CCriticalSection g_GlobalKeyCacheCriticalSection;\n\nCBase::CBase():\n  _cachedKeys(16),\n  _ivSize(0)\n{\n  for (int i = 0; i < sizeof(_iv); i++)\n    _iv[i] = 0;\n}\n\nvoid CBase::CalculateDigest()\n{\n  NSynchronization::CCriticalSectionLock lock(g_GlobalKeyCacheCriticalSection);\n  if (_cachedKeys.Find(_key))\n    g_GlobalKeyCache.Add(_key);\n  else\n  {\n    if (!g_GlobalKeyCache.Find(_key))\n    {\n      _key.CalculateDigest();\n      g_GlobalKeyCache.Add(_key);\n    }\n    _cachedKeys.Add(_key);\n  }\n}\n\n#ifndef EXTRACT_ONLY\n\n/*\nSTDMETHODIMP CEncoder::ResetSalt()\n{\n  _key.SaltSize = 4;\n  g_RandomGenerator.Generate(_key.Salt, _key.SaltSize);\n  return S_OK;\n}\n*/\n\nSTDMETHODIMP CEncoder::ResetInitVector()\n{\n  _ivSize = 8;\n  g_RandomGenerator.Generate(_iv, (unsigned)_ivSize);\n  return S_OK;\n}\n\nSTDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)\n{\n   // _key.Init();\n   for (UInt32 i = _ivSize; i < sizeof(_iv); i++)\n    _iv[i] = 0;\n\n  UInt32 ivSize = _ivSize;\n  \n  // _key.NumCyclesPower = 0x3F;\n  _key.NumCyclesPower = 19;\n\n  Byte firstByte = (Byte)(_key.NumCyclesPower |\n    (((_key.SaltSize == 0) ? 0 : 1) << 7) |\n    (((ivSize == 0) ? 0 : 1) << 6));\n  RINOK(outStream->Write(&firstByte, 1, NULL));\n  if (_key.SaltSize == 0 && ivSize == 0)\n    return S_OK;\n  Byte saltSizeSpec = (Byte)((_key.SaltSize == 0) ? 0 : (_key.SaltSize - 1));\n  Byte ivSizeSpec = (Byte)((ivSize == 0) ? 0 : (ivSize - 1));\n  Byte secondByte = (Byte)(((saltSizeSpec) << 4) | ivSizeSpec);\n  RINOK(outStream->Write(&secondByte, 1, NULL));\n  if (_key.SaltSize > 0)\n  {\n    RINOK(WriteStream(outStream, _key.Salt, _key.SaltSize));\n  }\n  if (ivSize > 0)\n  {\n    RINOK(WriteStream(outStream, _iv, ivSize));\n  }\n  return S_OK;\n}\n\nHRESULT CEncoder::CreateFilter()\n{\n  _aesFilter = new CAesCbcEncoder;\n  return S_OK;\n}\n\n#endif\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  _key.Init();\n  UInt32 i;\n  for (i = 0; i < sizeof(_iv); i++)\n    _iv[i] = 0;\n  if (size == 0)\n    return S_OK;\n  UInt32 pos = 0;\n  Byte firstByte = data[pos++];\n\n  _key.NumCyclesPower = firstByte & 0x3F;\n  if ((firstByte & 0xC0) == 0)\n    return S_OK;\n  _key.SaltSize = (firstByte >> 7) & 1;\n  UInt32 ivSize = (firstByte >> 6) & 1;\n\n  if (pos >= size)\n    return E_INVALIDARG;\n  Byte secondByte = data[pos++];\n  \n  _key.SaltSize += (secondByte >> 4);\n  ivSize += (secondByte & 0x0F);\n  \n  if (pos + _key.SaltSize + ivSize > size)\n    return E_INVALIDARG;\n  for (i = 0; i < _key.SaltSize; i++)\n    _key.Salt[i] = data[pos++];\n  for (i = 0; i < ivSize; i++)\n    _iv[i] = data[pos++];\n  return S_OK;\n}\n\nSTDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  _key.Password.SetCapacity((size_t)size);\n  memcpy(_key.Password, data, (size_t)size);\n  return S_OK;\n}\n\nSTDMETHODIMP CBaseCoder::Init()\n{\n  CalculateDigest();\n  if (_aesFilter == 0)\n  {\n    RINOK(CreateFilter());\n  }\n  CMyComPtr<ICryptoProperties> cp;\n  RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp));\n  RINOK(cp->SetKey(_key.Key, sizeof(_key.Key)));\n  RINOK(cp->SetInitVector(_iv, sizeof(_iv)));\n  return S_OK;\n}\n\nSTDMETHODIMP_(UInt32) CBaseCoder::Filter(Byte *data, UInt32 size)\n{\n  return _aesFilter->Filter(data, size);\n}\n\nHRESULT CDecoder::CreateFilter()\n{\n  _aesFilter = new CAesCbcDecoder;\n  return S_OK;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/7zAes.h",
    "content": "// 7zAes.h\n\n#ifndef __CRYPTO_7Z_AES_H\n#define __CRYPTO_7Z_AES_H\n\n#include \"Common/Buffer.h\"\n#include \"Common/MyCom.h\"\n#include \"Common/MyVector.h\"\n\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\nnamespace NCrypto {\nnamespace NSevenZ {\n\nconst int kKeySize = 32;\n\nclass CKeyInfo\n{\npublic:\n  int NumCyclesPower;\n  UInt32 SaltSize;\n  Byte Salt[16];\n  CByteBuffer Password;\n  Byte Key[kKeySize];\n\n  bool IsEqualTo(const CKeyInfo &a) const;\n  void CalculateDigest();\n\n  CKeyInfo() { Init(); }\n  void Init()\n  {\n    NumCyclesPower = 0;\n    SaltSize = 0;\n    for (int i = 0; i < sizeof(Salt); i++)\n      Salt[i] = 0;\n  }\n};\n\nclass CKeyInfoCache\n{\n  int Size;\n  CObjectVector<CKeyInfo> Keys;\npublic:\n  CKeyInfoCache(int size): Size(size) {}\n  bool Find(CKeyInfo &key);\n  // HRESULT Calculate(CKeyInfo &key);\n  void Add(CKeyInfo &key);\n};\n\nclass CBase\n{\n  CKeyInfoCache _cachedKeys;\nprotected:\n  CKeyInfo _key;\n  Byte _iv[16];\n  UInt32 _ivSize;\n  void CalculateDigest();\n  CBase();\n};\n\nclass CBaseCoder:\n  public ICompressFilter,\n  public ICryptoSetPassword,\n  public CMyUnknownImp,\n  public CBase\n{\nprotected:\n  CMyComPtr<ICompressFilter> _aesFilter;\n\n  virtual HRESULT CreateFilter() = 0;\n  #ifndef CRYPTO_AES\n  HRESULT CreateFilterFromDLL(REFCLSID clsID);\n  #endif\npublic:\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  \n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);\n};\n\n#ifndef EXTRACT_ONLY\n\nclass CEncoder:\n  public CBaseCoder,\n  public ICompressWriteCoderProperties,\n  // public ICryptoResetSalt,\n  public ICryptoResetInitVector\n{\n  virtual HRESULT CreateFilter();\npublic:\n  MY_UNKNOWN_IMP3(\n      ICryptoSetPassword,\n      ICompressWriteCoderProperties,\n      // ICryptoResetSalt,\n      ICryptoResetInitVector)\n  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);\n  // STDMETHOD(ResetSalt)();\n  STDMETHOD(ResetInitVector)();\n};\n#endif\n\nclass CDecoder:\n  public CBaseCoder,\n  public ICompressSetDecoderProperties2\n{\n  virtual HRESULT CreateFilter();\npublic:\n  MY_UNKNOWN_IMP2(\n      ICryptoSetPassword,\n      ICompressSetDecoderProperties2)\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/7zAesRegister.cpp",
    "content": "// 7zAesRegister.cpp\n\n#include \"StdAfx.h\"\n\n#include \"../Common/RegisterCodec.h\"\n#include \"7zAes.h\"\n\nstatic void *CreateCodec() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CDecoder()); }\n#ifndef EXTRACT_ONLY\nstatic void *CreateCodecOut() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CEncoder()); }\n#else\n#define CreateCodecOut 0\n#endif\n\nstatic CCodecInfo g_CodecInfo =\n  { CreateCodec, CreateCodecOut, 0x06F10701, L\"7zAES\", 1, true };\n\nREGISTER_CODEC(7zAES)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/HmacSha1.cpp",
    "content": "// HmacSha1.cpp\n\n#include \"StdAfx.h\"\n\n#include \"HmacSha1.h\"\n\nnamespace NCrypto {\nnamespace NSha1 {\n\nvoid CHmac::SetKey(const Byte *key, size_t keySize)\n{\n  Byte keyTemp[kBlockSize];\n  size_t i;\n  for (i = 0; i < kBlockSize; i++)\n    keyTemp[i] = 0;\n  if(keySize > kBlockSize)\n  {\n    _sha.Init();\n    _sha.Update(key, keySize);\n    _sha.Final(keyTemp);\n    keySize = kDigestSize;\n  }\n  else\n    for (i = 0; i < keySize; i++)\n      keyTemp[i] = key[i];\n  for (i = 0; i < kBlockSize; i++)\n    keyTemp[i] ^= 0x36;\n  _sha.Init();\n  _sha.Update(keyTemp, kBlockSize);\n  for (i = 0; i < kBlockSize; i++)\n    keyTemp[i] ^= 0x36 ^ 0x5C;\n  _sha2.Init();\n  _sha2.Update(keyTemp, kBlockSize);\n}\n\nvoid CHmac::Final(Byte *mac, size_t macSize)\n{\n  Byte digest[kDigestSize];\n  _sha.Final(digest);\n  _sha2.Update(digest, kDigestSize);\n  _sha2.Final(digest);\n  for(size_t i = 0; i < macSize; i++)\n    mac[i] = digest[i];\n}\n\n\nvoid CHmac32::SetKey(const Byte *key, size_t keySize)\n{\n  UInt32 keyTemp[kBlockSizeInWords];\n  size_t i;\n  for (i = 0; i < kBlockSizeInWords; i++)\n    keyTemp[i] = 0;\n  if(keySize > kBlockSize)\n  {\n    CContext sha;\n    sha.Init();\n    sha.Update(key, keySize);\n    Byte digest[kDigestSize];\n    sha.Final(digest);\n    \n    for (int i = 0 ; i < kDigestSizeInWords; i++)\n      keyTemp[i] =\n          ((UInt32)(digest[i * 4 + 0]) << 24) |\n          ((UInt32)(digest[i * 4 + 1]) << 16) |\n          ((UInt32)(digest[i * 4 + 2]) <<  8) |\n          ((UInt32)(digest[i * 4 + 3]));\n    keySize = kDigestSizeInWords;\n  }\n  else\n    for (size_t i = 0; i < keySize; i++)\n      keyTemp[i / 4] |= (key[i] << (24 - 8 * (i & 3)));\n  for (i = 0; i < kBlockSizeInWords; i++)\n    keyTemp[i] ^= 0x36363636;\n  _sha.Init();\n  _sha.Update(keyTemp, kBlockSizeInWords);\n  for (i = 0; i < kBlockSizeInWords; i++)\n    keyTemp[i] ^= 0x36363636 ^ 0x5C5C5C5C;\n  _sha2.Init();\n  _sha2.Update(keyTemp, kBlockSizeInWords);\n}\n\nvoid CHmac32::Final(UInt32 *mac, size_t macSize)\n{\n  UInt32 digest[kDigestSizeInWords];\n  _sha.Final(digest);\n  _sha2.Update(digest, kDigestSizeInWords);\n  _sha2.Final(digest);\n  for(size_t i = 0; i < macSize; i++)\n    mac[i] = digest[i];\n}\n\nvoid CHmac32::GetLoopXorDigest(UInt32 *mac, UInt32 numIteration)\n{\n  UInt32 block[kBlockSizeInWords];\n  UInt32 block2[kBlockSizeInWords];\n  _sha.PrepareBlock(block, kDigestSizeInWords);\n  _sha2.PrepareBlock(block2, kDigestSizeInWords);\n  for(unsigned int s = 0; s < kDigestSizeInWords; s++)\n    block[s] = mac[s];\n  for(UInt32 i = 0; i < numIteration; i++)\n  {\n    _sha.GetBlockDigest(block, block2);\n    _sha2.GetBlockDigest(block2, block);\n    for (unsigned int s = 0; s < kDigestSizeInWords; s++)\n      mac[s] ^= block[s];\n  }\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/HmacSha1.h",
    "content": "// HmacSha1.h\n// Implements HMAC-SHA-1 (RFC2104, FIPS-198)\n\n#ifndef __CRYPTO_HMAC_SHA1_H\n#define __CRYPTO_HMAC_SHA1_H\n\n#include \"Sha1.h\"\n\nnamespace NCrypto {\nnamespace NSha1 {\n\n// Use:  SetKey(key, keySize); for () Update(data, size); Final(mac, macSize);\n\nclass CHmac\n{\n  CContext _sha;\n  CContext _sha2;\npublic:\n  void SetKey(const Byte *key, size_t keySize);\n  void Update(const Byte *data, size_t dataSize) { _sha.Update(data, dataSize); }\n  void Final(Byte *mac, size_t macSize = kDigestSize);\n};\n\nclass CHmac32\n{\n  CContext32 _sha;\n  CContext32 _sha2;\npublic:\n  void SetKey(const Byte *key, size_t keySize);\n  void Update(const UInt32 *data, size_t dataSize) { _sha.Update(data, dataSize); }\n  void Final(UInt32 *mac, size_t macSize = kDigestSizeInWords);\n  \n  // It'sa for hmac function. in,out: mac[kDigestSizeInWords].\n  void GetLoopXorDigest(UInt32 *mac, UInt32 numIteration);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/MyAes.cpp",
    "content": "// Crypto/MyAes.cpp\n\n#include \"StdAfx.h\"\n\n#include \"MyAes.h\"\n\nnamespace NCrypto {\n\nstruct CAesTabInit { CAesTabInit() { AesGenTables();} } g_AesTabInit;\n\nSTDMETHODIMP CAesCbcEncoder::Init() { return S_OK; }\n\nSTDMETHODIMP_(UInt32) CAesCbcEncoder::Filter(Byte *data, UInt32 size)\n{\n  return (UInt32)AesCbc_Encode(&Aes, data, size);\n}\n\nSTDMETHODIMP CAesCbcEncoder::SetKey(const Byte *data, UInt32 size)\n{\n  if ((size & 0x7) != 0 || size < 16 || size > 32)\n    return E_INVALIDARG;\n  Aes_SetKeyEncode(&Aes.aes, data, size);\n  return S_OK;\n}\n\nSTDMETHODIMP CAesCbcEncoder::SetInitVector(const Byte *data, UInt32 size)\n{\n  if (size != AES_BLOCK_SIZE)\n    return E_INVALIDARG;\n  AesCbc_Init(&Aes, data);\n  return S_OK;\n}\n\nSTDMETHODIMP CAesCbcDecoder::Init() { return S_OK; }\n\nSTDMETHODIMP_(UInt32) CAesCbcDecoder::Filter(Byte *data, UInt32 size)\n{\n  return (UInt32)AesCbc_Decode(&Aes, data, size);\n}\n\nSTDMETHODIMP CAesCbcDecoder::SetKey(const Byte *data, UInt32 size)\n{\n  if ((size & 0x7) != 0 || size < 16 || size > 32)\n    return E_INVALIDARG;\n  Aes_SetKeyDecode(&Aes.aes, data, size);\n  return S_OK;\n}\n\nSTDMETHODIMP CAesCbcDecoder::SetInitVector(const Byte *data, UInt32 size)\n{\n  if (size != AES_BLOCK_SIZE)\n    return E_INVALIDARG;\n  AesCbc_Init(&Aes, data);\n  return S_OK;\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/MyAes.h",
    "content": "// Crypto/MyAes.h\n\n#ifndef __CRYPTO_MY_AES_H\n#define __CRYPTO_MY_AES_H\n\nextern \"C\"\n{\n#include \"../../../C/Aes.h\"\n}\n\n#include \"../../Common/MyCom.h\"\n#include \"../../Common/Types.h\"\n\n#include \"../ICoder.h\"\n\nnamespace NCrypto {\n\nclass CAesCbcEncoder:\n  public ICompressFilter,\n  public ICryptoProperties,\n  public CMyUnknownImp\n{\n  CAesCbc Aes;\npublic:\n  MY_UNKNOWN_IMP1(ICryptoProperties)\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  STDMETHOD(SetKey)(const Byte *data, UInt32 size);\n  STDMETHOD(SetInitVector)(const Byte *data, UInt32 size);\n};\n\nclass CAesCbcDecoder:\n  public ICompressFilter,\n  public ICryptoProperties,\n  public CMyUnknownImp\n{\n  CAesCbc Aes;\npublic:\n  MY_UNKNOWN_IMP1(ICryptoProperties)\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  STDMETHOD(SetKey)(const Byte *data, UInt32 size);\n  STDMETHOD(SetInitVector)(const Byte *data, UInt32 size);\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp",
    "content": "// Pbkdf2HmacSha1.cpp\n\n#include \"StdAfx.h\"\n\n#include \"HmacSha1.h\"\n\nnamespace NCrypto {\nnamespace NSha1 {\n\nvoid Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,\n    UInt32 numIterations, Byte *key, size_t keySize)\n{\n  CHmac baseCtx;\n  baseCtx.SetKey(pwd, pwdSize);\n  for (UInt32 i = 1; keySize > 0; i++)\n  {\n    CHmac ctx = baseCtx;\n    ctx.Update(salt, saltSize);\n    Byte u[kDigestSize] = { (Byte)(i >> 24), (Byte)(i >> 16), (Byte)(i >> 8), (Byte)(i) };\n    const unsigned int curSize = (keySize < kDigestSize) ? (unsigned int)keySize : kDigestSize;\n    ctx.Update(u, 4);\n    ctx.Final(u, kDigestSize);\n\n    unsigned int s;\n    for (s = 0; s < curSize; s++)\n      key[s] = u[s];\n    \n    for (UInt32 j = numIterations; j > 1; j--)\n    {\n      ctx = baseCtx;\n      ctx.Update(u, kDigestSize);\n      ctx.Final(u, kDigestSize);\n      for (s = 0; s < curSize; s++)\n        key[s] ^= u[s];\n    }\n\n    key += curSize;\n    keySize -= curSize;\n  }\n}\n\nvoid Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,\n    UInt32 numIterations, UInt32 *key, size_t keySize)\n{\n  CHmac32 baseCtx;\n  baseCtx.SetKey(pwd, pwdSize);\n  for (UInt32 i = 1; keySize > 0; i++)\n  {\n    CHmac32 ctx = baseCtx;\n    ctx.Update(salt, saltSize);\n    UInt32 u[kDigestSizeInWords] = { i };\n    const unsigned int curSize = (keySize < kDigestSizeInWords) ? (unsigned int)keySize : kDigestSizeInWords;\n    ctx.Update(u, 1);\n    ctx.Final(u, kDigestSizeInWords);\n\n    // Speed-optimized code start\n    ctx = baseCtx;\n    ctx.GetLoopXorDigest(u, numIterations - 1);\n    // Speed-optimized code end\n    \n    unsigned int s;\n    for (s = 0; s < curSize; s++)\n      key[s] = u[s];\n    \n    /*\n    // Default code start\n    for (UInt32 j = numIterations; j > 1; j--)\n    {\n      ctx = baseCtx;\n      ctx.Update(u, kDigestSizeInWords);\n      ctx.Final(u, kDigestSizeInWords);\n      for (s = 0; s < curSize; s++)\n        key[s] ^= u[s];\n    }\n    // Default code end\n    */\n\n    key += curSize;\n    keySize -= curSize;\n  }\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/Pbkdf2HmacSha1.h",
    "content": "// Pbkdf2HmacSha1.h\n// Password-Based Key Derivation Function (RFC 2898, PKCS #5) based on HMAC-SHA-1\n\n#ifndef __CRYPTO_PBKDF2_HMAC_SHA1_H\n#define __CRYPTO_PBKDF2_HMAC_SHA1_H\n\n#include <stddef.h>\n#include \"../../Common/Types.h\"\n\nnamespace NCrypto {\nnamespace NSha1 {\n\nvoid Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,\n    UInt32 numIterations, Byte *key, size_t keySize);\n\nvoid Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,\n    UInt32 numIterations, UInt32 *key, size_t keySize);\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/RandGen.cpp",
    "content": "// RandGen.cpp\n\n#include \"StdAfx.h\"\n\n#include <stdio.h>\n#include \"Windows/Synchronization.h\"\n#include \"RandGen.h\"\n\n#ifndef _WIN32\n#include <unistd.h>\n#define USE_POSIX_TIME\n#define USE_POSIX_TIME2\n#endif\n\n#ifdef USE_POSIX_TIME\n#include <time.h>\n#ifdef USE_POSIX_TIME2\n#include <sys/time.h>\n#endif\n#endif\n\n// This is not very good random number generator.\n// Please use it only for salt.\n// First generated data block depends from timer and processID.\n// Other generated data blocks depend from previous state\n// Maybe it's possible to restore original timer value from generated value.\n\nvoid CRandomGenerator::Init()\n{\n  NCrypto::NSha1::CContext hash;\n  hash.Init();\n\n  #ifdef _WIN32\n  DWORD w = ::GetCurrentProcessId();\n  hash.Update((const Byte *)&w, sizeof(w));\n  w = ::GetCurrentThreadId();\n  hash.Update((const Byte *)&w, sizeof(w));\n  #else\n  pid_t pid = getpid();\n  hash.Update((const Byte *)&pid, sizeof(pid));\n  pid = getppid();\n  hash.Update((const Byte *)&pid, sizeof(pid));\n  #endif\n\n  for (int i = 0; i < 1000; i++)\n  {\n    #ifdef _WIN32\n    LARGE_INTEGER v;\n    if (::QueryPerformanceCounter(&v))\n      hash.Update((const Byte *)&v.QuadPart, sizeof(v.QuadPart));\n    #endif\n\n    #ifdef USE_POSIX_TIME\n    #ifdef USE_POSIX_TIME2\n    timeval v;\n    if (gettimeofday(&v, 0) == 0)\n    {\n      hash.Update((const Byte *)&v.tv_sec, sizeof(v.tv_sec));\n      hash.Update((const Byte *)&v.tv_usec, sizeof(v.tv_usec));\n    }\n    #endif\n    time_t v2 = time(NULL);\n    hash.Update((const Byte *)&v2, sizeof(v2));\n    #endif\n\n    DWORD tickCount = ::GetTickCount();\n    hash.Update((const Byte *)&tickCount, sizeof(tickCount));\n    \n    for (int j = 0; j < 100; j++)\n    {\n      hash.Final(_buff);\n      hash.Init();\n      hash.Update(_buff, NCrypto::NSha1::kDigestSize);\n    }\n  }\n  hash.Final(_buff);\n  _needInit = false;\n}\n\nstatic NWindows::NSynchronization::CCriticalSection g_CriticalSection;\n\nvoid CRandomGenerator::Generate(Byte *data, unsigned int size)\n{\n  g_CriticalSection.Enter();\n  if (_needInit)\n    Init();\n  while (size > 0)\n  {\n    NCrypto::NSha1::CContext hash;\n    \n    hash.Init();\n    hash.Update(_buff, NCrypto::NSha1::kDigestSize);\n    hash.Final(_buff);\n    \n    hash.Init();\n    UInt32 salt = 0xF672ABD1;\n    hash.Update((const Byte *)&salt, sizeof(salt));\n    hash.Update(_buff, NCrypto::NSha1::kDigestSize);\n    Byte buff[NCrypto::NSha1::kDigestSize];\n    hash.Final(buff);\n    for (unsigned int i = 0; i < NCrypto::NSha1::kDigestSize && size > 0; i++, size--)\n      *data++ = buff[i];\n  }\n  g_CriticalSection.Leave();\n}\n\nCRandomGenerator g_RandomGenerator;\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/RandGen.h",
    "content": "// RandGen.h\n\n#ifndef __CRYPTO_RAND_GEN_H\n#define __CRYPTO_RAND_GEN_H\n\n#include \"Sha1.h\"\n\nclass CRandomGenerator\n{\n  Byte _buff[NCrypto::NSha1::kDigestSize];\n  bool _needInit;\n\n  void Init();\npublic:\n  CRandomGenerator(): _needInit(true) {};\n  void Generate(Byte *data, unsigned size);\n};\n\nextern CRandomGenerator g_RandomGenerator;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/Rar20Crypto.cpp",
    "content": "// Crypto/Rar20Crypto.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n  #include \"../../../C/7zCrc.h\"\n  #include \"../../../C/CpuArch.h\"\n  #include \"../../../C/RotateDefs.h\"\n}\n\n#include \"Rar20Crypto.h\"\n\nnamespace NCrypto {\nnamespace NRar20 {\n\nstatic const int kNumRounds = 32;\n\nstatic const Byte InitSubstTable[256] = {\n  215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221,  2, 42,\n  232,  1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137,\n  255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86,  6,\n   71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235,\n  107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36,\n  158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251,\n   97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11,\n  164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51,\n  207,120,189,210,  8,226, 41, 72,183,203,135,165,166, 60, 98,  7,\n  122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80,\n  131,  3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129,\n  224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10,\n  118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45,  4,148,108,\n  161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225,\n    0, 46,169,186, 68, 95,237, 65, 53,208,253,168,  9, 18,100, 52,\n  116,184,160, 96,109, 37, 30,106,140,104,150,  5,204,117,112, 84\n};\n\nvoid CData::UpdateKeys(const Byte *data)\n{\n  for (int i = 0; i < 16; i += 4)\n    for (int j = 0; j < 4; j++)\n      Keys[j] ^= g_CrcTable[data[i + j]];\n}\n\nstatic void Swap(Byte *b1, Byte *b2)\n{\n  Byte b = *b1;\n  *b1 = *b2;\n  *b2 = b;\n}\n\nvoid CData::SetPassword(const Byte *password, UInt32 passwordLen)\n{\n  Keys[0] = 0xD3A3B879L;\n  Keys[1] = 0x3F6D12F7L;\n  Keys[2] = 0x7515A235L;\n  Keys[3] = 0xA4E7F123L;\n  \n  Byte psw[256];\n  memset(psw, 0, sizeof(psw));\n  memcpy(psw, password, passwordLen);\n  memcpy(SubstTable, InitSubstTable, sizeof(SubstTable));\n\n  for (UInt32 j = 0; j < 256; j++)\n    for (UInt32 i = 0; i < passwordLen; i += 2)\n    {\n      UInt32 n2 = (Byte)g_CrcTable[(psw[i + 1] + j) & 0xFF];\n      UInt32 n1 = (Byte)g_CrcTable[(psw[i] - j) & 0xFF];\n      for (UInt32 k = 1; (n1 & 0xFF) != n2; n1++, k++)\n        Swap(&SubstTable[n1 & 0xFF], &SubstTable[(n1 + i + k) & 0xFF]);\n    }\n  for (UInt32 i = 0; i < passwordLen; i+= 16)\n    EncryptBlock(&psw[i]);\n}\n\nvoid CData::CryptBlock(Byte *buf, bool encrypt)\n{\n  Byte inBuf[16];\n  UInt32 A, B, C, D, T, TA, TB;\n\n  A = GetUi32(buf +  0) ^ Keys[0];\n  B = GetUi32(buf +  4) ^ Keys[1];\n  C = GetUi32(buf +  8) ^ Keys[2];\n  D = GetUi32(buf + 12) ^ Keys[3];\n\n  if (!encrypt)\n    memcpy(inBuf, buf, sizeof(inBuf));\n  \n  for (int i = 0; i < kNumRounds; i++)\n  {\n    UInt32 key = Keys[(encrypt ? i : (kNumRounds - 1 - i)) & 3];\n    T = ((C + rotlFixed(D, 11)) ^ key);\n    TA = A ^ SubstLong(T);\n    T = ((D ^ rotlFixed(C, 17)) + key);\n    TB = B ^ SubstLong(T);\n    A = C;\n    B = D;\n    C = TA;\n    D = TB;\n  }\n\n  SetUi32(buf +  0, C ^ Keys[0]);\n  SetUi32(buf +  4, D ^ Keys[1]);\n  SetUi32(buf +  8, A ^ Keys[2]);\n  SetUi32(buf + 12, B ^ Keys[3]);\n\n  UpdateKeys(encrypt ? buf : inBuf);\n}\n\nSTDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  _cipher.SetPassword(data, size);\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::Init()\n{\n  return S_OK;\n}\n\nstatic const UInt32 kBlockSize = 16;\n\nSTDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)\n{\n  if (size == 0)\n    return 0;\n  if (size < kBlockSize)\n    return kBlockSize;\n  UInt32 i;\n  size -= kBlockSize;\n  for (i = 0; i <= size; i += kBlockSize)\n    _cipher.DecryptBlock(data + i);\n  return i;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/Rar20Crypto.h",
    "content": "// Crypto/Rar20Crypto.h\n\n#ifndef __CRYPTO_RAR20_CRYPTO_H\n#define __CRYPTO_RAR20_CRYPTO_H\n\n#include \"Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\nnamespace NCrypto {\nnamespace NRar20 {\n\nclass CData\n{\n  Byte SubstTable[256];\n  UInt32 Keys[4];\n  \n  UInt32 SubstLong(UInt32 t)\n  {\n    return (UInt32)SubstTable[(int)t & 255] |\n           ((UInt32)SubstTable[(int)(t >> 8) & 255] << 8) |\n           ((UInt32)SubstTable[(int)(t >> 16) & 255] << 16) |\n           ((UInt32)SubstTable[(int)(t >> 24) & 255] << 24);\n  }\n  void UpdateKeys(const Byte *data);\n  void CryptBlock(Byte *buf, bool encrypt);\npublic:\n  void EncryptBlock(Byte *buf) { CryptBlock(buf, true); }\n  void DecryptBlock(Byte *buf) { CryptBlock(buf, false); }\n  void SetPassword(const Byte *password, UInt32 passwordLen);\n};\n\nclass CDecoder:\n  public ICompressFilter,\n  public ICryptoSetPassword,\n  public CMyUnknownImp\n{\n  CData _cipher;\npublic:\n  MY_UNKNOWN_IMP1(ICryptoSetPassword)\n\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/RarAes.cpp",
    "content": "// Crypto/RarAes.cpp\n// Note: you must include MyAes.cpp to project to initialize AES tables\n\n#include \"StdAfx.h\"\n\n#include \"RarAes.h\"\n#include \"Sha1.h\"\n\nnamespace NCrypto {\nnamespace NRar29 {\n\nCDecoder::CDecoder():\n  _thereIsSalt(false),\n  _needCalculate(true),\n  _rar350Mode(false)\n{\n  for (int i = 0; i < sizeof(_salt); i++)\n    _salt[i] = 0;\n}\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  bool thereIsSaltPrev = _thereIsSalt;\n  _thereIsSalt = false;\n  if (size == 0)\n    return S_OK;\n  if (size < 8)\n    return E_INVALIDARG;\n  _thereIsSalt = true;\n  bool same = false;\n  if (_thereIsSalt == thereIsSaltPrev)\n  {\n    same = true;\n    if (_thereIsSalt)\n    {\n      for (int i = 0; i < sizeof(_salt); i++)\n        if (_salt[i] != data[i])\n        {\n          same = false;\n          break;\n        }\n    }\n  }\n  for (int i = 0; i < sizeof(_salt); i++)\n    _salt[i] = data[i];\n  if (!_needCalculate && !same)\n    _needCalculate = true;\n  return S_OK;\n}\n\nstatic const int kMaxPasswordLength = 127 * 2;\n\nSTDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  if (size > kMaxPasswordLength)\n    size = kMaxPasswordLength;\n  bool same = false;\n  if (size == buffer.GetCapacity())\n  {\n    same = true;\n    for (UInt32 i = 0; i < size; i++)\n      if (data[i] != buffer[i])\n      {\n        same = false;\n        break;\n      }\n  }\n  if (!_needCalculate && !same)\n    _needCalculate = true;\n  buffer.SetCapacity(size);\n  memcpy(buffer, data, size);\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::Init()\n{\n  Calculate();\n  Aes_SetKeyDecode(&Aes.aes, aesKey, kRarAesKeySize);\n  AesCbc_Init(&Aes, aesInit);\n  return S_OK;\n}\n\nSTDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)\n{\n  return (UInt32)AesCbc_Decode(&Aes, data, size);\n}\n\nvoid CDecoder::Calculate()\n{\n  if (_needCalculate)\n  {\n    const int kSaltSize = 8;\n    \n    Byte rawPassword[kMaxPasswordLength + kSaltSize];\n    \n    memcpy(rawPassword, buffer, buffer.GetCapacity());\n    \n    size_t rawLength = buffer.GetCapacity();\n    \n    if (_thereIsSalt)\n    {\n      memcpy(rawPassword + rawLength, _salt, kSaltSize);\n      rawLength += kSaltSize;\n    }\n    \n    NSha1::CContext sha;\n    sha.Init();\n\n    // seems rar reverts hash for sha.\n    const int hashRounds = 0x40000;\n    int i;\n    for (i = 0; i < hashRounds; i++)\n    {\n      sha.Update(rawPassword, rawLength, _rar350Mode);\n      Byte pswNum[3] = { (Byte)i, (Byte)(i >> 8), (Byte)(i >> 16) };\n      sha.Update(pswNum, 3, _rar350Mode);\n      if (i % (hashRounds / 16) == 0)\n      {\n        NSha1::CContext shaTemp = sha;\n        Byte digest[NSha1::kDigestSize];\n        shaTemp.Final(digest);\n        aesInit[i / (hashRounds / 16)] = (Byte)digest[4 * 4 + 3];\n      }\n    }\n    /*\n    // it's test message for sha\n    const char *message = \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\";\n    sha.Update((const Byte *)message, strlen(message));\n    */\n    Byte digest[20];\n    sha.Final(digest);\n    for (i = 0; i < 4; i++)\n      for (int j = 0; j < 4; j++)\n        aesKey[i * 4 + j] = (digest[i * 4 + 3 - j]);\n  }\n  _needCalculate = false;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/RarAes.h",
    "content": "// Crypto/RarAes.h\n\n#ifndef __CRYPTO_RAR_AES_H\n#define __CRYPTO_RAR_AES_H\n\nextern \"C\"\n{\n#include \"../../../C/Aes.h\"\n}\n\n#include \"Common/Buffer.h\"\n#include \"Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\nnamespace NCrypto {\nnamespace NRar29 {\n\nconst UInt32 kRarAesKeySize = 16;\n\nclass CDecoder:\n  public ICompressFilter,\n  public ICompressSetDecoderProperties2,\n  public ICryptoSetPassword,\n  public CMyUnknownImp\n{\n  Byte _salt[8];\n  bool _thereIsSalt;\n  CByteBuffer buffer;\n  Byte aesKey[kRarAesKeySize];\n  Byte aesInit[AES_BLOCK_SIZE];\n  bool _needCalculate;\n\n  CAesCbc Aes;\n\n  bool _rar350Mode;\n\n  void Calculate();\n\npublic:\n\n  MY_UNKNOWN_IMP2(\n    ICryptoSetPassword,\n    ICompressSetDecoderProperties2)\n\n  STDMETHOD(Init)();\n\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n\n  STDMETHOD(CryptoSetPassword)(const Byte *aData, UInt32 aSize);\n\n  // ICompressSetDecoderProperties\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n\n  CDecoder();\n  void SetRar350Mode(bool rar350Mode) { _rar350Mode = rar350Mode; }\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/Sha1.cpp",
    "content": "// Crypto/Sha1.cpp\n// This file is based on public domain\n// Steve Reid and Wei Dai's code from Crypto++\n\n#include \"StdAfx.h\"\n\n#include \"Sha1.h\"\nextern \"C\"\n{\n#include \"../../../C/RotateDefs.h\"\n}\n\nnamespace NCrypto {\nnamespace NSha1 {\n\n// define it for speed optimization\n// #define _SHA1_UNROLL\n\nstatic const unsigned kNumW =\n  #ifdef _SHA1_UNROLL\n  16;\n  #else\n  80;\n  #endif\n  \n\n#define w0(i) (W[(i)] = data[(i)])\n\n#ifdef _SHA1_UNROLL\n#define w1(i) (W[(i)&15] = rotlFixed(W[((i)-3)&15] ^ W[((i)-8)&15] ^ W[((i)-14)&15] ^ W[((i)-16)&15], 1))\n#else\n#define w1(i) (W[(i)] = rotlFixed(W[(i)-3] ^ W[(i)-8] ^ W[(i)-14] ^ W[(i)-16], 1))\n#endif\n\n#define f1(x,y,z) (z^(x&(y^z)))\n#define f2(x,y,z) (x^y^z)\n#define f3(x,y,z) ((x&y)|(z&(x|y)))\n#define f4(x,y,z) (x^y^z)\n\n#define RK1(a,b,c,d,e,i, f, w, k) e += f(b,c,d) + w(i) + k + rotlFixed(a,5); b = rotlFixed(b,30);\n\n#define R0(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w0, 0x5A827999)\n#define R1(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w1, 0x5A827999)\n#define R2(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f2, w1, 0x6ED9EBA1)\n#define R3(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f3, w1, 0x8F1BBCDC)\n#define R4(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f4, w1, 0xCA62C1D6)\n\n#define RX_1_4(rx1, rx4, i) rx1(a,b,c,d,e,i); rx4(e,a,b,c,d,i+1); rx4(d,e,a,b,c,i+2); rx4(c,d,e,a,b,i+3); rx4(b,c,d,e,a,i+4);\n#define RX_5(rx, i) RX_1_4(rx, rx, i);\n\nvoid CContextBase::Init()\n{\n  _state[0] = 0x67452301;\n  _state[1] = 0xEFCDAB89;\n  _state[2] = 0x98BADCFE;\n  _state[3] = 0x10325476;\n  _state[4] = 0xC3D2E1F0;\n  _count = 0;\n}\n\nvoid CContextBase::GetBlockDigest(UInt32 *data, UInt32 *destDigest, bool returnRes)\n{\n  UInt32 a, b, c, d, e;\n  UInt32 W[kNumW];\n\n  a = _state[0];\n  b = _state[1];\n  c = _state[2];\n  d = _state[3];\n  e = _state[4];\n  #ifdef _SHA1_UNROLL\n  RX_5(R0, 0); RX_5(R0, 5); RX_5(R0, 10);\n  #else\n  int i;\n  for (i = 0; i < 15; i += 5) { RX_5(R0, i); }\n  #endif\n\n  RX_1_4(R0, R1, 15);\n\n\n  #ifdef _SHA1_UNROLL\n  RX_5(R2, 20); RX_5(R2, 25); RX_5(R2, 30); RX_5(R2, 35);\n  RX_5(R3, 40); RX_5(R3, 45); RX_5(R3, 50); RX_5(R3, 55);\n  RX_5(R4, 60); RX_5(R4, 65); RX_5(R4, 70); RX_5(R4, 75);\n  #else\n  i = 20;\n  for (; i < 40; i += 5) { RX_5(R2, i); }\n  for (; i < 60; i += 5) { RX_5(R3, i); }\n  for (; i < 80; i += 5) { RX_5(R4, i); }\n  #endif\n\n  destDigest[0] = _state[0] + a;\n  destDigest[1] = _state[1] + b;\n  destDigest[2] = _state[2] + c;\n  destDigest[3] = _state[3] + d;\n  destDigest[4] = _state[4] + e;\n\n  if (returnRes)\n    for (int i = 0 ; i < 16; i++)\n      data[i] = W[kNumW - 16 + i];\n  \n  // Wipe variables\n  // a = b = c = d = e = 0;\n}\n\nvoid CContextBase::PrepareBlock(UInt32 *block, unsigned size) const\n{\n  unsigned curBufferPos = size & 0xF;\n  block[curBufferPos++] = 0x80000000;\n  while (curBufferPos != (16 - 2))\n    block[curBufferPos++] = 0;\n  const UInt64 lenInBits = (_count << 9) + ((UInt64)size << 5);\n  block[curBufferPos++] = (UInt32)(lenInBits >> 32);\n  block[curBufferPos++] = (UInt32)(lenInBits);\n}\n\nvoid CContext::Update(Byte *data, size_t size, bool rar350Mode)\n{\n  bool returnRes = false;\n  unsigned curBufferPos = _count2;\n  while (size-- > 0)\n  {\n    int pos = (int)(curBufferPos & 3);\n    if (pos == 0)\n      _buffer[curBufferPos >> 2] = 0;\n    _buffer[curBufferPos >> 2] |= ((UInt32)*data++) << (8 * (3 - pos));\n    if (++curBufferPos == kBlockSize)\n    {\n      curBufferPos = 0;\n      CContextBase::UpdateBlock(_buffer, returnRes);\n      if (returnRes)\n        for (int i = 0; i < kBlockSizeInWords; i++)\n        {\n          UInt32 d = _buffer[i];\n          data[i * 4 + 0 - kBlockSize] = (Byte)(d);\n          data[i * 4 + 1 - kBlockSize] = (Byte)(d >>  8);\n          data[i * 4 + 2 - kBlockSize] = (Byte)(d >> 16);\n          data[i * 4 + 3 - kBlockSize] = (Byte)(d >> 24);\n        }\n      returnRes = rar350Mode;\n    }\n  }\n  _count2 = curBufferPos;\n}\n\nvoid CContext::Final(Byte *digest)\n{\n  const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 3);\n  unsigned curBufferPos = _count2;\n  int pos = (int)(curBufferPos & 3);\n  curBufferPos >>= 2;\n  if (pos == 0)\n    _buffer[curBufferPos] = 0;\n  _buffer[curBufferPos++] |= ((UInt32)0x80) << (8 * (3 - pos));\n\n  while (curBufferPos != (16 - 2))\n  {\n    curBufferPos &= 0xF;\n    if (curBufferPos == 0)\n      UpdateBlock();\n    _buffer[curBufferPos++] = 0;\n  }\n  _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32);\n  _buffer[curBufferPos++] = (UInt32)(lenInBits);\n  UpdateBlock();\n\n  int i;\n  for (i = 0; i < kDigestSizeInWords; i++)\n  {\n    UInt32 state = _state[i] & 0xFFFFFFFF;\n    *digest++ = (Byte)(state >> 24);\n    *digest++ = (Byte)(state >> 16);\n    *digest++ = (Byte)(state >> 8);\n    *digest++ = (Byte)(state);\n  }\n  Init();\n}\n\n///////////////////////////\n// Words version\n\nvoid CContext32::Update(const UInt32 *data, size_t size)\n{\n  while (size-- > 0)\n  {\n    _buffer[_count2++] = *data++;\n    if (_count2 == kBlockSizeInWords)\n    {\n      _count2 = 0;\n      UpdateBlock();\n    }\n  }\n}\n\nvoid CContext32::Final(UInt32 *digest)\n{\n  const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 5);\n  unsigned curBufferPos = _count2;\n  _buffer[curBufferPos++] = 0x80000000;\n  while (curBufferPos != (16 - 2))\n  {\n    curBufferPos &= 0xF;\n    if (curBufferPos == 0)\n      UpdateBlock();\n    _buffer[curBufferPos++] = 0;\n  }\n  _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32);\n  _buffer[curBufferPos++] = (UInt32)(lenInBits);\n  GetBlockDigest(_buffer, digest);\n  Init();\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/Sha1.h",
    "content": "// Crypto/Sha1.h\n// This file is based on public domain\n// Steve Reid and Wei Dai's code from Crypto++\n\n#ifndef __CRYPTO_SHA1_H\n#define __CRYPTO_SHA1_H\n\n#include <stddef.h>\n#include \"../../Common/Types.h\"\n\n// Sha1 implementation in RAR before version 3.60 has bug:\n// it changes data bytes in some cases.\n// So this class supports both versions: normal_SHA and rar3Mode\n\nnamespace NCrypto {\nnamespace NSha1 {\n\nconst unsigned kBlockSize = 64;\nconst unsigned kDigestSize = 20;\n\nconst unsigned kBlockSizeInWords = (kBlockSize >> 2);\nconst unsigned kDigestSizeInWords = (kDigestSize >> 2);\n\nclass CContextBase\n{\nprotected:\n  UInt32 _state[5];\n  UInt64 _count;\n  void UpdateBlock(UInt32 *data, bool returnRes = false)\n  {\n    GetBlockDigest(data, _state, returnRes);\n    _count++;\n  }\npublic:\n  void Init();\n  void GetBlockDigest(UInt32 *blockData, UInt32 *destDigest, bool returnRes = false);\n  // PrepareBlock can be used only when size <= 13. size in Words\n  void PrepareBlock(UInt32 *block, unsigned int size) const;\n};\n\nclass CContextBase2: public CContextBase\n{\nprotected:\n  unsigned _count2;\n  UInt32 _buffer[kBlockSizeInWords];\n  void UpdateBlock() { CContextBase::UpdateBlock(_buffer); }\npublic:\n  void Init() { CContextBase::Init(); _count2 = 0; }\n};\n\nclass CContext: public CContextBase2\n{\npublic:\n  void Update(Byte *data, size_t size, bool rar350Mode = false);\n  void Update(const Byte *data, size_t size) { Update((Byte *)data, size, false); }\n  void Final(Byte *digest);\n};\n\nclass CContext32: public CContextBase2\n{\npublic:\n  void Update(const UInt32 *data, size_t size);\n  void Final(UInt32 *digest);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/WzAes.cpp",
    "content": "// Crypto/WzAes.cpp\n/*\nThis code implements Brian Gladman's scheme\nspecified in password Based File Encryption Utility.\n\nNote: you must include MyAes.cpp to project to initialize AES tables\n*/\n\n#include \"StdAfx.h\"\n\n#include \"../Common/StreamObjects.h\"\n#include \"../Common/StreamUtils.h\"\n\n#include \"Pbkdf2HmacSha1.h\"\n#include \"RandGen.h\"\n#include \"WzAes.h\"\n\n// define it if you don't want to use speed-optimized version of Pbkdf2HmacSha1\n// #define _NO_WZAES_OPTIMIZATIONS\n\nnamespace NCrypto {\nnamespace NWzAes {\n\nconst unsigned int kAesKeySizeMax = 32;\n\nstatic const UInt32 kNumKeyGenIterations = 1000;\n\nSTDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  if(size > kPasswordSizeMax)\n    return E_INVALIDARG;\n  _key.Password.SetCapacity(size);\n  memcpy(_key.Password, data, size);\n  return S_OK;\n}\n\n#define SetUi32(p, d) { UInt32 x = (d); (p)[0] = (Byte)x; (p)[1] = (Byte)(x >> 8); \\\n    (p)[2] = (Byte)(x >> 16); (p)[3] = (Byte)(x >> 24); }\n\nvoid CBaseCoder::EncryptData(Byte *data, UInt32 size)\n{\n  unsigned int pos = _blockPos;\n  for (; size > 0; size--)\n  {\n    if (pos == AES_BLOCK_SIZE)\n    {\n      if (++_counter[0] == 0)\n        _counter[1]++;\n      UInt32 temp[4];\n      Aes_Encode32(&Aes, temp, _counter);\n      SetUi32(_buffer,      temp[0]);\n      SetUi32(_buffer + 4,  temp[1]);\n      SetUi32(_buffer + 8,  temp[2]);\n      SetUi32(_buffer + 12, temp[3]);\n      pos = 0;\n    }\n    *data++ ^= _buffer[pos++];\n  }\n  _blockPos = pos;\n}\n\n#ifndef _NO_WZAES_OPTIMIZATIONS\n\nstatic void BytesToBeUInt32s(const Byte *src, UInt32 *dest, int destSize)\n{\n  for (int i = 0 ; i < destSize; i++)\n      dest[i] =\n          ((UInt32)(src[i * 4 + 0]) << 24) |\n          ((UInt32)(src[i * 4 + 1]) << 16) |\n          ((UInt32)(src[i * 4 + 2]) <<  8) |\n          ((UInt32)(src[i * 4 + 3]));\n}\n\n#endif\n\nSTDMETHODIMP CBaseCoder::Init()\n{\n  UInt32 keySize = _key.GetKeySize();\n  UInt32 keysTotalSize = 2 * keySize + kPwdVerifCodeSize;\n  Byte buf[2 * kAesKeySizeMax + kPwdVerifCodeSize];\n  \n  // for (int ii = 0; ii < 1000; ii++)\n  {\n    #ifdef _NO_WZAES_OPTIMIZATIONS\n\n    NSha1::Pbkdf2Hmac(\n      _key.Password, _key.Password.GetCapacity(),\n      _key.Salt, _key.GetSaltSize(),\n      kNumKeyGenIterations,\n      buf, keysTotalSize);\n\n    #else\n\n    UInt32 buf32[(2 * kAesKeySizeMax + kPwdVerifCodeSize + 3) / 4];\n    UInt32 key32SizeTotal = (keysTotalSize + 3) / 4;\n    UInt32 salt[kSaltSizeMax * 4];\n    UInt32 saltSizeInWords = _key.GetSaltSize() / 4;\n    BytesToBeUInt32s(_key.Salt, salt, saltSizeInWords);\n    NSha1::Pbkdf2Hmac32(\n      _key.Password, _key.Password.GetCapacity(),\n      salt, saltSizeInWords,\n      kNumKeyGenIterations,\n      buf32, key32SizeTotal);\n    for (UInt32 j = 0; j < keysTotalSize; j++)\n      buf[j] = (Byte)(buf32[j / 4] >> (24 - 8 * (j & 3)));\n    \n    #endif\n  }\n\n  _hmac.SetKey(buf + keySize, keySize);\n  memcpy(_key.PwdVerifComputed, buf + 2 * keySize, kPwdVerifCodeSize);\n  \n  _blockPos = AES_BLOCK_SIZE;\n  for (int i = 0; i < 4; i++)\n    _counter[i] = 0;\n\n  Aes_SetKeyEncode(&Aes, buf, keySize);\n  return S_OK;\n}\n\n/*\nSTDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)\n{\n  Byte keySizeMode = 3;\n  return outStream->Write(&keySizeMode, 1, NULL);\n}\n*/\n\nHRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream)\n{\n  UInt32 saltSize = _key.GetSaltSize();\n  g_RandomGenerator.Generate(_key.Salt, saltSize);\n  Init();\n  RINOK(WriteStream(outStream, _key.Salt, saltSize));\n  return WriteStream(outStream, _key.PwdVerifComputed, kPwdVerifCodeSize);\n}\n\nHRESULT CEncoder::WriteFooter(ISequentialOutStream *outStream)\n{\n  Byte mac[kMacSize];\n  _hmac.Final(mac, kMacSize);\n  return WriteStream(outStream, mac, kMacSize);\n}\n\nSTDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)\n{\n  if (size != 1)\n    return E_INVALIDARG;\n  _key.Init();\n  Byte keySizeMode = data[0];\n  if (keySizeMode < 1 || keySizeMode > 3)\n    return E_INVALIDARG;\n  _key.KeySizeMode = keySizeMode;\n  return S_OK;\n}\n\nHRESULT CDecoder::ReadHeader(ISequentialInStream *inStream)\n{\n  UInt32 saltSize = _key.GetSaltSize();\n  UInt32 extraSize = saltSize + kPwdVerifCodeSize;\n  Byte temp[kSaltSizeMax + kPwdVerifCodeSize];\n  RINOK(ReadStream_FAIL(inStream, temp, extraSize));\n  UInt32 i;\n  for (i = 0; i < saltSize; i++)\n    _key.Salt[i] = temp[i];\n  for (i = 0; i < kPwdVerifCodeSize; i++)\n    _pwdVerifFromArchive[i] = temp[saltSize + i];\n  return S_OK;\n}\n\nstatic bool CompareArrays(const Byte *p1, const Byte *p2, UInt32 size)\n{\n  for (UInt32 i = 0; i < size; i++)\n    if (p1[i] != p2[i])\n      return false;\n  return true;\n}\n\nbool CDecoder::CheckPasswordVerifyCode()\n{\n  return CompareArrays(_key.PwdVerifComputed, _pwdVerifFromArchive, kPwdVerifCodeSize);\n}\n\nHRESULT CDecoder::CheckMac(ISequentialInStream *inStream, bool &isOK)\n{\n  isOK = false;\n  Byte mac1[kMacSize];\n  RINOK(ReadStream_FAIL(inStream, mac1, kMacSize));\n  Byte mac2[kMacSize];\n  _hmac.Final(mac2, kMacSize);\n  isOK = CompareArrays(mac1, mac2, kMacSize);\n  return S_OK;\n}\n\nSTDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size)\n{\n  EncryptData(data, size);\n  _hmac.Update(data, size);\n  return size;\n}\n\nSTDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)\n{\n  _hmac.Update(data, size);\n  EncryptData(data, size);\n  return size;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/WzAes.h",
    "content": "// Crypto/WzAes.h\n/*\nThis code implements Brian Gladman's scheme\nspecified in password Based File Encryption Utility:\n  - AES encryption (128,192,256-bit) in Counter (CTR) mode.\n  - HMAC-SHA1 authentication for encrypted data (10 bytes)\n  - Keys are derived by PPKDF2(RFC2898)-HMAC-SHA1 from ASCII password and\n    Salt (saltSize = aesKeySize / 2).\n  - 2 bytes contain Password Verifier's Code\n*/\n\n#ifndef __CRYPTO_WZ_AES_H\n#define __CRYPTO_WZ_AES_H\n\nextern \"C\"\n{\n#include \"../../../C/Aes.h\"\n}\n\n#include \"Common/Buffer.h\"\n#include \"Common/MyCom.h\"\n#include \"Common/MyVector.h\"\n\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\n#include \"HmacSha1.h\"\n\nnamespace NCrypto {\nnamespace NWzAes {\n\nconst unsigned int kSaltSizeMax = 16;\nconst unsigned int kMacSize = 10;\n\nconst UInt32 kPasswordSizeMax = 99; // 128;\n\n// Password Verification Code Size\nconst unsigned int kPwdVerifCodeSize = 2;\n\nclass CKeyInfo\n{\npublic:\n  Byte KeySizeMode; // 1 - 128-bit , 2 - 192-bit , 3 - 256-bit\n  Byte Salt[kSaltSizeMax];\n  Byte PwdVerifComputed[kPwdVerifCodeSize];\n\n  CByteBuffer Password;\n\n  UInt32 GetKeySize() const  { return (8 * (KeySizeMode & 3) + 8); }\n  UInt32 GetSaltSize() const { return (4 * (KeySizeMode & 3) + 4); }\n\n  CKeyInfo() { Init(); }\n  void Init() { KeySizeMode = 3; }\n};\n\nclass CBaseCoder:\n  public ICompressFilter,\n  public ICryptoSetPassword,\n  public CMyUnknownImp\n{\nprotected:\n  CKeyInfo _key;\n  UInt32 _counter[AES_BLOCK_SIZE / 4];\n  Byte _buffer[AES_BLOCK_SIZE];\n  NSha1::CHmac _hmac;\n  unsigned int _blockPos;\n  Byte _pwdVerifFromArchive[kPwdVerifCodeSize];\n\n  void EncryptData(Byte *data, UInt32 size);\n\n  CAes Aes;\n\npublic:\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) = 0;\n  \n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);\n\n  UInt32 GetHeaderSize() const { return _key.GetSaltSize() + kPwdVerifCodeSize; }\n};\n\nclass CEncoder:\n  public CBaseCoder\n  // public ICompressWriteCoderProperties\n{\npublic:\n  MY_UNKNOWN_IMP1(ICryptoSetPassword)\n  //  ICompressWriteCoderProperties\n  // STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  HRESULT WriteHeader(ISequentialOutStream *outStream);\n  HRESULT WriteFooter(ISequentialOutStream *outStream);\n  bool SetKeyMode(Byte mode)\n  {\n    if (mode < 1 || mode > 3)\n      return false;\n    _key.KeySizeMode = mode;\n    return true;\n  }\n};\n\nclass CDecoder:\n  public CBaseCoder,\n  public ICompressSetDecoderProperties2\n{\npublic:\n  MY_UNKNOWN_IMP2(\n      ICryptoSetPassword,\n      ICompressSetDecoderProperties2)\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);\n  HRESULT ReadHeader(ISequentialInStream *inStream);\n  bool CheckPasswordVerifyCode();\n  HRESULT CheckMac(ISequentialInStream *inStream, bool &isOK);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/ZipCrypto.cpp",
    "content": "// Crypto/ZipCrypto.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/7zCrc.h\"\n}\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"RandGen.h\"\n#include \"ZipCrypto.h\"\n\nnamespace NCrypto {\nnamespace NZip {\n\nvoid CCipher::UpdateKeys(Byte b)\n{\n  Keys[0] = CRC_UPDATE_BYTE(Keys[0], b);\n  Keys[1] += Keys[0] & 0xff;\n  Keys[1] = Keys[1] * 134775813L + 1;\n  Keys[2] = CRC_UPDATE_BYTE(Keys[2], (Byte)(Keys[1] >> 24));\n}\n\nvoid CCipher::SetPassword(const Byte *password, UInt32 passwordLen)\n{\n  Keys[0] = 305419896L;\n  Keys[1] = 591751049L;\n  Keys[2] = 878082192L;\n  for (UInt32 i = 0; i < passwordLen; i++)\n    UpdateKeys(password[i]);\n}\n\nByte CCipher::DecryptByteSpec()\n{\n  UInt32 temp = Keys[2] | 2;\n  return (Byte)((temp * (temp ^ 1)) >> 8);\n}\n\nByte CCipher::DecryptByte(Byte b)\n{\n  Byte c = (Byte)(b ^ DecryptByteSpec());\n  UpdateKeys(c);\n  return c;\n}\n\nByte CCipher::EncryptByte(Byte b)\n{\n  Byte c = (Byte)(b ^ DecryptByteSpec());\n  UpdateKeys(b);\n  return c;\n}\n\nvoid CCipher::DecryptHeader(Byte *buf)\n{\n  for (unsigned i = 0; i < kHeaderSize; i++)\n    buf[i] = DecryptByte(buf[i]);\n}\n\nvoid CCipher::EncryptHeader(Byte *buf)\n{\n  for (unsigned i = 0; i < kHeaderSize; i++)\n    buf[i] = EncryptByte(buf[i]);\n}\n\nSTDMETHODIMP CEncoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  _cipher.SetPassword(data, size);\n  return S_OK;\n}\n\nSTDMETHODIMP CEncoder::CryptoSetCRC(UInt32 crc)\n{\n  _crc = crc;\n  return S_OK;\n}\n\nSTDMETHODIMP CEncoder::Init()\n{\n  return S_OK;\n}\n\nHRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream)\n{\n  Byte header[kHeaderSize];\n  g_RandomGenerator.Generate(header, kHeaderSize - 2);\n\n  header[kHeaderSize - 1] = Byte(_crc >> 24);\n  header[kHeaderSize - 2] = Byte(_crc >> 16);\n\n  _cipher.EncryptHeader(header);\n  return WriteStream(outStream, header, kHeaderSize);\n}\n\nSTDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size)\n{\n  UInt32 i;\n  for (i = 0; i < size; i++)\n    data[i] = _cipher.EncryptByte(data[i]);\n  return i;\n}\n\nSTDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  _cipher.SetPassword(data, size);\n  return S_OK;\n}\n\nHRESULT CDecoder::ReadHeader(ISequentialInStream *inStream)\n{\n  Byte header[kHeaderSize];\n  RINOK(ReadStream_FAIL(inStream, header, kHeaderSize));\n  _cipher.DecryptHeader(header);\n  return S_OK;\n}\n\nSTDMETHODIMP CDecoder::Init()\n{\n  return S_OK;\n}\n\nSTDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)\n{\n  UInt32 i;\n  for (i = 0; i < size; i++)\n    data[i] = _cipher.DecryptByte(data[i]);\n  return i;\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/ZipCrypto.h",
    "content": "// Crypto/ZipCrypto.h\n\n#ifndef __CRYPTO_ZIP_CRYPTO_H\n#define __CRYPTO_ZIP_CRYPTO_H\n\n#include \"Common/MyCom.h\"\n\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\nnamespace NCrypto {\nnamespace NZip {\n\nconst unsigned kHeaderSize = 12;\n\nclass CCipher\n{\n  UInt32 Keys[3];\n\n  void UpdateKeys(Byte b);\n  Byte DecryptByteSpec();\npublic:\n  void SetPassword(const Byte *password, UInt32 passwordLen);\n  Byte DecryptByte(Byte b);\n  Byte EncryptByte(Byte b);\n  void DecryptHeader(Byte *buf);\n  void EncryptHeader(Byte *buf);\n};\n\nclass CEncoder :\n  public ICompressFilter,\n  public ICryptoSetPassword,\n  public ICryptoSetCRC,\n  public CMyUnknownImp\n{\n  CCipher _cipher;\n  UInt32 _crc;\npublic:\n  MY_UNKNOWN_IMP2(\n      ICryptoSetPassword,\n      ICryptoSetCRC\n  )\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n\n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);\n  STDMETHOD(CryptoSetCRC)(UInt32 crc);\n  HRESULT WriteHeader(ISequentialOutStream *outStream);\n};\n\n\nclass CDecoder:\n  public ICompressFilter,\n  public ICryptoSetPassword,\n  public CMyUnknownImp\n{\n  CCipher _cipher;\npublic:\n  MY_UNKNOWN_IMP1(ICryptoSetPassword)\n\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);\n\n  HRESULT ReadHeader(ISequentialInStream *inStream);\n};\n\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/ZipStrong.cpp",
    "content": "// Crypto/ZipStrong.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../../C/7zCrc.h\"\n#include \"../../../C/CpuArch.h\"\n}\n\n#include \"../Common/StreamUtils.h\"\n\n#include \"MyAes.h\"\n#include \"Sha1.h\"\n#include \"ZipStrong.h\"\n\nnamespace NCrypto {\nnamespace NZipStrong {\n\nstatic const UInt16 kAES128 = 0x660E;\n\n// DeriveKey* function is similar to CryptDeriveKey() from Windows.\n// But MSDN tells that we need such scheme only if\n// \"the required key length is longer than the hash value\"\n// but ZipStrong uses it always.\n\nstatic void DeriveKey2(const Byte *digest, Byte c, Byte *dest)\n{\n  Byte buf[64];\n  memset(buf, c, 64);\n  for (unsigned i = 0; i < NSha1::kDigestSize; i++)\n    buf[i] ^= digest[i];\n  NSha1::CContext sha;\n  sha.Init();\n  sha.Update(buf, 64);\n  sha.Final(dest);\n}\n \nstatic void DeriveKey(NSha1::CContext &sha, Byte *key)\n{\n  Byte digest[NSha1::kDigestSize];\n  sha.Final(digest);\n  Byte temp[NSha1::kDigestSize * 2];\n  DeriveKey2(digest, 0x36, temp);\n  DeriveKey2(digest, 0x5C, temp + NSha1::kDigestSize);\n  memcpy(key, temp, 32);\n}\n\nvoid CKeyInfo::SetPassword(const Byte *data, UInt32 size)\n{\n  NSha1::CContext sha;\n  sha.Init();\n  sha.Update(data, size);\n  DeriveKey(sha, MasterKey);\n}\n\nSTDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)\n{\n  _key.SetPassword(data, size);\n  return S_OK;\n}\n\nSTDMETHODIMP CBaseCoder::Init()\n{\n  return S_OK;\n}\n\nHRESULT CDecoder::ReadHeader(ISequentialInStream *inStream, UInt32 /* crc */, UInt64 /* unpackSize */)\n{\n  Byte temp[4];\n  RINOK(ReadStream_FALSE(inStream, temp, 2));\n  _ivSize = GetUi16(temp);\n  if (_ivSize == 0)\n  {\n    return E_NOTIMPL;\n    /*\n    SetUi32(_iv, crc);\n    for (int i = 0; i < 8; i++)\n     _iv[4 + i] = (Byte)(unpackSize >> (8 * i));\n    SetUi32(_iv + 12, 0);\n    */\n  }\n  else if (_ivSize == 16)\n  {\n    RINOK(ReadStream_FALSE(inStream, _iv, _ivSize));\n  }\n  else\n    return E_NOTIMPL;\n  RINOK(ReadStream_FALSE(inStream, temp, 4));\n  _remSize = GetUi32(temp);\n  if (_remSize > _buf.GetCapacity())\n  {\n    _buf.Free();\n    _buf.SetCapacity(_remSize);\n  }\n  return ReadStream_FALSE(inStream, _buf, _remSize);\n}\n\nHRESULT CDecoder::CheckPassword(bool &passwOK)\n{\n  passwOK = false;\n  if (_remSize < 10)\n    return E_NOTIMPL;\n  Byte *p = _buf;\n  UInt16 format = GetUi16(p);\n  if (format != 3)\n    return E_NOTIMPL;\n  UInt16 algId  = GetUi16(p + 2);\n  if (algId < kAES128)\n    return E_NOTIMPL;\n  algId -= kAES128;\n  if (algId > 2)\n    return E_NOTIMPL;\n  UInt16 bitLen = GetUi16(p + 4);\n  UInt16 flags  = GetUi16(p + 6);\n  if (algId * 64 + 128 != bitLen)\n    return E_NOTIMPL;\n  _key.KeySize = 16 + algId * 8;\n  if ((flags & 1) == 0)\n    return E_NOTIMPL;\n  UInt32 rdSize = GetUi16(p + 8);\n  UInt32 pos = 10;\n  Byte *rd = p + pos;\n  pos += rdSize;\n  if (pos + 4 > _remSize)\n    return E_NOTIMPL;\n  UInt32 reserved = GetUi32(p + pos);\n  pos += 4;\n  if (reserved != 0)\n    return E_NOTIMPL;\n  if (pos + 2 > _remSize)\n    return E_NOTIMPL;\n  UInt32 validSize = GetUi16(p + pos);\n  pos += 2;\n  Byte *validData = p + pos;\n  if (pos + validSize != _remSize)\n    return E_NOTIMPL;\n\n  if (!_aesFilter)\n    _aesFilter = new CAesCbcDecoder;\n\n  CMyComPtr<ICryptoProperties> cp;\n  RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp));\n  {\n    RINOK(cp->SetKey(_key.MasterKey, _key.KeySize));\n    RINOK(cp->SetInitVector(_iv, 16));\n    _aesFilter->Init();\n    if (_aesFilter->Filter(rd, rdSize) != rdSize)\n      return E_NOTIMPL;\n  }\n\n  Byte fileKey[32];\n  NSha1::CContext sha;\n  sha.Init();\n  sha.Update(_iv, 16);\n  sha.Update(rd, rdSize - 16); // we don't use last 16 bytes (PAD bytes)\n  DeriveKey(sha, fileKey);\n  \n  RINOK(cp->SetKey(fileKey, _key.KeySize));\n  RINOK(cp->SetInitVector(_iv, 16));\n  _aesFilter->Init();\n  if (_aesFilter->Filter(validData, validSize) != validSize)\n    return E_NOTIMPL;\n\n  if (validSize < 4)\n    return E_NOTIMPL;\n  validSize -= 4;\n  if (GetUi32(validData + validSize) != CrcCalc(validData, validSize))\n    return S_OK;\n  passwOK = true;\n  _aesFilter->Init();\n  return S_OK;\n}\n\nSTDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)\n{\n  return _aesFilter->Filter(data, size);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/Crypto/ZipStrong.h",
    "content": "// Crypto/ZipStrong.h\n\n#ifndef __CRYPTO_ZIP_STRONG_H\n#define __CRYPTO_ZIP_STRONG_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/Buffer.h\"\n\n#include \"../ICoder.h\"\n#include \"../IPassword.h\"\n\nnamespace NCrypto {\nnamespace NZipStrong {\n\nstruct CKeyInfo\n{\n  Byte MasterKey[32];\n  UInt32 KeySize;\n  void SetPassword(const Byte *data, UInt32 size);\n};\n\nclass CBaseCoder:\n  public ICompressFilter,\n  public ICryptoSetPassword,\n  public CMyUnknownImp\n{\nprotected:\n  CKeyInfo _key;\n  CMyComPtr<ICompressFilter> _aesFilter;\n  CByteBuffer _buf;\npublic:\n  STDMETHOD(Init)();\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) = 0;\n  \n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);\n};\n\nclass CDecoder:\n  public CBaseCoder\n{\n  UInt32 _ivSize;\n  Byte _iv[16];\n  UInt32 _remSize;\npublic:\n  MY_UNKNOWN_IMP1(ICryptoSetPassword)\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);\n  HRESULT ReadHeader(ISequentialInStream *inStream, UInt32 crc, UInt64 unpackSize);\n  HRESULT CheckPassword(bool &passwOK);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/ICoder.h",
    "content": "// ICoder.h\n\n#ifndef __ICODER_H\n#define __ICODER_H\n\n#include \"IStream.h\"\n\n#define CODER_INTERFACE(i, x) DECL_INTERFACE(i, 4, x)\n\nCODER_INTERFACE(ICompressProgressInfo, 0x04)\n{\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE;\n};\n\nCODER_INTERFACE(ICompressCoder, 0x05)\n{\n  STDMETHOD(Code)(ISequentialInStream *inStream,\n      ISequentialOutStream *outStream,\n      const UInt64 *inSize,\n      const UInt64 *outSize,\n      ICompressProgressInfo *progress) PURE;\n};\n\nCODER_INTERFACE(ICompressCoder2, 0x18)\n{\n  STDMETHOD(Code)(ISequentialInStream **inStreams,\n      const UInt64 **inSizes,\n      UInt32 numInStreams,\n      ISequentialOutStream **outStreams,\n      const UInt64 **outSizes,\n      UInt32 numOutStreams,\n      ICompressProgressInfo *progress) PURE;\n};\n\nnamespace NCoderPropID\n{\n  enum EEnum\n  {\n    kDictionarySize = 0x400,\n    kUsedMemorySize,\n    kOrder,\n    kBlockSize,\n    kPosStateBits = 0x440,\n    kLitContextBits,\n    kLitPosBits,\n    kNumFastBytes = 0x450,\n    kMatchFinder,\n    kMatchFinderCycles,\n    kNumPasses = 0x460,\n    kAlgorithm = 0x470,\n    kMultiThread = 0x480,\n    kNumThreads,\n    kEndMarker = 0x490\n  };\n}\n\nCODER_INTERFACE(ICompressSetCoderProperties, 0x20)\n{\n  STDMETHOD(SetCoderProperties)(const PROPID *propIDs,\n      const PROPVARIANT *properties, UInt32 numProperties) PURE;\n};\n\n/*\nCODER_INTERFACE(ICompressSetCoderProperties, 0x21)\n{\n  STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE;\n};\n*/\n\nCODER_INTERFACE(ICompressSetDecoderProperties2, 0x22)\n{\n  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE;\n};\n\nCODER_INTERFACE(ICompressWriteCoderProperties, 0x23)\n{\n  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStreams) PURE;\n};\n\nCODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24)\n{\n  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE;\n};\n\nCODER_INTERFACE(ICompressSetCoderMt, 0x25)\n{\n  STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE;\n};\n\nCODER_INTERFACE(ICompressGetSubStreamSize, 0x30)\n{\n  STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE;\n};\n\nCODER_INTERFACE(ICompressSetInStream, 0x31)\n{\n  STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE;\n  STDMETHOD(ReleaseInStream)() PURE;\n};\n\nCODER_INTERFACE(ICompressSetOutStream, 0x32)\n{\n  STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE;\n  STDMETHOD(ReleaseOutStream)() PURE;\n};\n\nCODER_INTERFACE(ICompressSetInStreamSize, 0x33)\n{\n  STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE;\n};\n\nCODER_INTERFACE(ICompressSetOutStreamSize, 0x34)\n{\n  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE;\n};\n\nCODER_INTERFACE(ICompressFilter, 0x40)\n{\n  STDMETHOD(Init)() PURE;\n  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE;\n  // Filter return outSize (UInt32)\n  // if (outSize <= size): Filter have converted outSize bytes\n  // if (outSize > size): Filter have not converted anything.\n  //      and it needs at least outSize bytes to convert one block\n  //      (it's for crypto block algorithms).\n};\n\nCODER_INTERFACE(ICompressCodecsInfo, 0x60)\n{\n  STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods) PURE;\n  STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE;\n  STDMETHOD(CreateDecoder)(UInt32 index, const GUID *iid, void **coder) PURE;\n  STDMETHOD(CreateEncoder)(UInt32 index, const GUID *iid, void **coder) PURE;\n};\nCODER_INTERFACE(ISetCompressCodecsInfo, 0x61)\n{\n  STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo) PURE;\n};\n\nCODER_INTERFACE(ICryptoProperties, 0x80)\n{\n  STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE;\n  STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE;\n};\n\n/*\nCODER_INTERFACE(ICryptoResetSalt, 0x88)\n{\n  STDMETHOD(ResetSalt)() PURE;\n};\n*/\n\nCODER_INTERFACE(ICryptoResetInitVector, 0x8C)\n{\n  STDMETHOD(ResetInitVector)() PURE;\n};\n\nCODER_INTERFACE(ICryptoSetPassword, 0x90)\n{\n  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE;\n};\n\nCODER_INTERFACE(ICryptoSetCRC, 0xA0)\n{\n  STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE;\n};\n\n//////////////////////\n// It's for DLL file\nnamespace NMethodPropID\n{\n  enum EEnum\n  {\n    kID,\n    kName,\n    kDecoder,\n    kEncoder,\n    kInStreams,\n    kOutStreams,\n    kDescription,\n    kDecoderIsAssigned,\n    kEncoderIsAssigned\n  };\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/IDecl.h",
    "content": "// IDecl.h\n\n#ifndef __IDECL_H\n#define __IDECL_H\n\n#include \"../Common/MyUnknown.h\"\n\n#define DECL_INTERFACE_SUB(i, base, groupId, subId) \\\nDEFINE_GUID(IID_ ## i, \\\n0x23170F69, 0x40C1, 0x278A, 0, 0, 0, (groupId), 0, (subId), 0, 0); \\\nstruct i: public base\n\n#define DECL_INTERFACE(i, groupId, subId) DECL_INTERFACE_SUB(i, IUnknown, groupId, subId)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/IPassword.h",
    "content": "// IPassword.h\n\n#ifndef __IPASSWORD_H\n#define __IPASSWORD_H\n\n#include \"../Common/MyUnknown.h\"\n#include \"../Common/Types.h\"\n\n#include \"IDecl.h\"\n\n#define PASSWORD_INTERFACE(i, x) DECL_INTERFACE(i, 5, x)\n\nPASSWORD_INTERFACE(ICryptoGetTextPassword, 0x10)\n{\n  STDMETHOD(CryptoGetTextPassword)(BSTR *password) PURE;\n};\n\nPASSWORD_INTERFACE(ICryptoGetTextPassword2, 0x11)\n{\n  STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password) PURE;\n};\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/IProgress.h",
    "content": "// Interface/IProgress.h\n\n#ifndef __IPROGRESS_H\n#define __IPROGRESS_H\n\n#include \"../Common/MyUnknown.h\"\n#include \"../Common/Types.h\"\n\n#include \"IDecl.h\"\n\n#define INTERFACE_IProgress(x) \\\n  STDMETHOD(SetTotal)(UInt64 total) x; \\\n  STDMETHOD(SetCompleted)(const UInt64 *completeValue) x; \\\n\nDECL_INTERFACE(IProgress, 0, 5)\n{\n  INTERFACE_IProgress(PURE)\n};\n\n/*\n// {23170F69-40C1-278A-0000-000000050002}\nDEFINE_GUID(IID_IProgress2,\n0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02);\nMIDL_INTERFACE(\"23170F69-40C1-278A-0000-000000050002\")\nIProgress2: public IUnknown\n{\npublic:\n  STDMETHOD(SetTotal)(const UInt64 *total) PURE;\n  STDMETHOD(SetCompleted)(const UInt64 *completeValue) PURE;\n};\n*/\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/IStream.h",
    "content": "// IStream.h\n\n#ifndef __ISTREAM_H\n#define __ISTREAM_H\n\n#include \"../Common/MyUnknown.h\"\n#include \"../Common/Types.h\"\n\n#include \"IDecl.h\"\n\n#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x)\n#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x)\n\nSTREAM_INTERFACE(ISequentialInStream, 0x01)\n{\n  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE;\n  /*\n  Out: if size != 0, return_value = S_OK and (*processedSize == 0),\n    then there are no more bytes in stream.\n  if (size > 0) && there are bytes in stream,\n  this function must read at least 1 byte.\n  This function is allowed to read less than number of remaining bytes in stream.\n  You must call Read function in loop, if you need exact amount of data\n  */\n};\n\nSTREAM_INTERFACE(ISequentialOutStream, 0x02)\n{\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE;\n  /*\n  if (size > 0) this function must write at least 1 byte.\n  This function is allowed to write less than \"size\".\n  You must call Write function in loop, if you need to write exact amount of data\n  */\n};\n\nSTREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03)\n{\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;\n};\n\nSTREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04)\n{\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;\n  STDMETHOD(SetSize)(Int64 newSize) PURE;\n};\n\nSTREAM_INTERFACE(IStreamGetSize, 0x06)\n{\n  STDMETHOD(GetSize)(UInt64 *size) PURE;\n};\n\nSTREAM_INTERFACE(IOutStreamFlush, 0x07)\n{\n  STDMETHOD(Flush)() PURE;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/MyVersion.h",
    "content": "#define MY_VER_MAJOR 4\n#define MY_VER_MINOR 65\n#define MY_VER_BUILD 0\n#define MY_VERSION \"4.65\"\n#define MY_7ZIP_VERSION \"7-Zip 4.65\"\n#define MY_DATE \"2009-02-03\"\n#define MY_COPYRIGHT \"Copyright (c) 1999-2009 Igor Pavlov\"\n#define MY_VERSION_COPYRIGHT_DATE MY_VERSION \"  \" MY_COPYRIGHT \"  \" MY_DATE\n\n#define P7ZIP_VERSION \"4.65\"\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/PropID.h",
    "content": "// PropID.h\n\n#ifndef __7ZIP_PROPID_H\n#define __7ZIP_PROPID_H\n\nenum\n{\n  kpidNoProperty = 0,\n  \n  kpidHandlerItemIndex = 2,\n  kpidPath,\n  kpidName,\n  kpidExtension,\n  kpidIsDir,\n  kpidSize,\n  kpidPackSize,\n  kpidAttrib,\n  kpidCTime,\n  kpidATime,\n  kpidMTime,\n  kpidSolid,\n  kpidCommented,\n  kpidEncrypted,\n  kpidSplitBefore,\n  kpidSplitAfter,\n  kpidDictionarySize,\n  kpidCRC,\n  kpidType,\n  kpidIsAnti,\n  kpidMethod,\n  kpidHostOS,\n  kpidFileSystem,\n  kpidUser,\n  kpidGroup,\n  kpidBlock,\n  kpidComment,\n  kpidPosition,\n  kpidPrefix,\n  kpidNumSubDirs,\n  kpidNumSubFiles,\n  kpidUnpackVer,\n  kpidVolume,\n  kpidIsVolume,\n  kpidOffset,\n  kpidLinks,\n  kpidNumBlocks,\n  kpidNumVolumes,\n  kpidTimeType,\n  kpidBit64,\n  kpidBigEndian,\n  kpidCpu,\n  kpidPhySize,\n  kpidHeadersSize,\n  kpidChecksum,\n  kpidCharacts,\n  kpidVa,\n\n  kpidTotalSize = 0x1100,\n  kpidFreeSpace,\n  kpidClusterSize,\n  kpidVolumeName,\n\n  kpidLocalName = 0x1200,\n  kpidProvider,\n\n  kpidUserDefined = 0x10000\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/Agent.cpp",
    "content": "// Agent.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/ComTry.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/FileFind.h\"\n\n#include \"../Common/DefaultName.h\"\n#include \"../Common/ArchiveExtractCallback.h\"\n\n#include \"Agent.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/Sort.h\"\n}\n\n\nusing namespace NWindows;\n\nSTDMETHODIMP CAgentFolder::GetAgentFolder(CAgentFolder **agentFolder)\n{\n  *agentFolder = this;\n  return S_OK;\n}\n\nvoid CAgentFolder::LoadFolder(CProxyFolder *folder)\n{\n  int i;\n  CProxyItem item;\n  item.Folder = folder;\n  for (i = 0; i < folder->Folders.Size(); i++)\n  {\n    item.Index = i;\n    _items.Add(item);\n    LoadFolder(&folder->Folders[i]);\n  }\n  int start = folder->Folders.Size();\n  for (i = 0; i < folder->Files.Size(); i++)\n  {\n    item.Index = start + i;\n    _items.Add(item);\n  }\n}\n\n\nSTDMETHODIMP CAgentFolder::LoadItems()\n{\n  if (!_agentSpec->_archiveLink.IsOpen)\n    return E_FAIL;\n  _items.Clear();\n  if (_flatMode)\n    LoadFolder(_proxyFolderItem);\n  return S_OK;\n}\n\nSTDMETHODIMP CAgentFolder::GetNumberOfItems(UInt32 *numItems)\n{\n  if (_flatMode)\n    *numItems = _items.Size();\n  else\n    *numItems = _proxyFolderItem->Folders.Size() +_proxyFolderItem->Files.Size();\n  return S_OK;\n}\n\nUString CAgentFolder::GetName(UInt32 index) const\n{\n  UInt32 realIndex;\n  const CProxyFolder *folder;\n  if (_flatMode)\n  {\n    const CProxyItem &item = _items[index];\n    folder = item.Folder;\n    realIndex = item.Index;\n  }\n  else\n  {\n    folder = _proxyFolderItem;\n    realIndex = index;\n  }\n\n  if (realIndex < (UInt32)folder->Folders.Size())\n    return folder->Folders[realIndex].Name;\n  return folder->Files[realIndex - folder->Folders.Size()].Name;\n}\n\nUString CAgentFolder::GetPrefix(UInt32 index) const\n{\n  if (!_flatMode)\n    return UString();\n  const CProxyItem &item = _items[index];\n  const CProxyFolder *folder = item.Folder;\n  UString path;\n  while (folder != _proxyFolderItem)\n  {\n    path = folder->Name + UString(WCHAR_PATH_SEPARATOR) + path;\n    folder = folder->Parent;\n  }\n  return path;\n}\n\nUString CAgentFolder::GetFullPathPrefixPlusPrefix(UInt32 index) const\n{\n  return _proxyFolderItem->GetFullPathPrefix() + GetPrefix(index);\n}\n\nvoid CAgentFolder::GetPrefixIfAny(UInt32 index, NCOM::CPropVariant &prop) const\n{\n  if (!_flatMode)\n    return;\n  prop = GetPrefix(index);\n}\n\n\nSTDMETHODIMP CAgentFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value)\n{\n  NCOM::CPropVariant prop;\n  const CProxyFolder *folder;\n  UInt32 realIndex;\n  if (_flatMode)\n  {\n    const CProxyItem &item = _items[itemIndex];\n    folder = item.Folder;\n    realIndex = item.Index;\n  }\n  else\n  {\n    folder = _proxyFolderItem;\n    realIndex = itemIndex;\n  }\n\n  if (realIndex < (UInt32)folder->Folders.Size())\n  {\n    const CProxyFolder &item = folder->Folders[realIndex];\n    if (!_flatMode && propID == kpidSize)\n      prop = item.Size;\n    else if (!_flatMode && propID == kpidPackSize)\n      prop = item.PackSize;\n    else\n    switch(propID)\n    {\n      case kpidIsDir:      prop = true; break;\n      case kpidNumSubDirs: prop = item.NumSubFolders; break;\n      case kpidNumSubFiles:   prop = item.NumSubFiles; break;\n      case kpidName:          prop = item.Name; break;\n      case kpidCRC:\n      {\n        if (item.IsLeaf)\n        {\n          RINOK(_agentSpec->GetArchive()->GetProperty(item.Index, propID, value));\n        }\n        if (item.CrcIsDefined && value->vt == VT_EMPTY)\n          prop = item.Crc;\n        break;\n      }\n      case kpidPrefix: GetPrefixIfAny(itemIndex, prop); break;\n\n      default:\n        if (item.IsLeaf)\n          return _agentSpec->GetArchive()->GetProperty(item.Index, propID, value);\n    }\n  }\n  else\n  {\n    realIndex -= folder->Folders.Size();\n    const CProxyFile &item = folder->Files[realIndex];\n    switch(propID)\n    {\n      case kpidIsDir: prop = false; break;\n      case kpidName: prop = item.Name; break;\n      case kpidPrefix: GetPrefixIfAny(itemIndex, prop); break;\n      default:\n        return _agentSpec->GetArchive()->GetProperty(item.Index, propID, value);\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nHRESULT CAgentFolder::BindToFolder(CProxyFolder *folder, IFolderFolder **resultFolder)\n{\n  CMyComPtr<IFolderFolder> parentFolder;\n  if (folder->Parent != _proxyFolderItem)\n  {\n    RINOK(BindToFolder(folder->Parent, &parentFolder));\n  }\n  else\n    parentFolder = this;\n  CAgentFolder *folderSpec = new CAgentFolder;\n  CMyComPtr<IFolderFolder> agentFolder = folderSpec;\n  folderSpec->Init(_proxyArchive, folder, parentFolder, _agentSpec);\n  *resultFolder = agentFolder.Detach();\n  return S_OK;\n}\n\nSTDMETHODIMP CAgentFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder)\n{\n  COM_TRY_BEGIN\n\n  CProxyFolder *folder;\n  UInt32 realIndex;\n  if (_flatMode)\n  {\n    const CProxyItem &item = _items[index];\n    folder = item.Folder;\n    realIndex = item.Index;\n  }\n  else\n  {\n    folder = _proxyFolderItem;\n    realIndex = index;\n  }\n  if (realIndex >= (UInt32)folder->Folders.Size())\n    return E_INVALIDARG;\n  return BindToFolder(&folder->Folders[realIndex], resultFolder);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder)\n{\n  COM_TRY_BEGIN\n  int index = _proxyFolderItem->FindDirSubItemIndex(name);\n  if (index < 0)\n    return E_INVALIDARG;\n  return BindToFolder(index, resultFolder);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::BindToParentFolder(IFolderFolder **resultFolder)\n{\n  COM_TRY_BEGIN\n  CMyComPtr<IFolderFolder> parentFolder = _parentFolder;\n  *resultFolder = parentFolder.Detach();\n  return S_OK;\n  COM_TRY_END\n}\n\nSTATPROPSTG kProperties[] =\n{\n  { NULL, kpidNumSubDirs, VT_UI4},\n  { NULL, kpidNumSubFiles, VT_UI4},\n  { NULL, kpidPrefix, VT_BSTR}\n};\n\nstatic const UInt32 kNumProperties = sizeof(kProperties) / sizeof(kProperties[0]);\n\nstruct CArchiveItemPropertyTemp\n{\n  UString Name;\n  PROPID ID;\n  VARTYPE Type;\n};\n\nSTDMETHODIMP CAgentFolder::GetNumberOfProperties(UInt32 *numProperties)\n{\n  COM_TRY_BEGIN\n  RINOK(_agentSpec->GetArchive()->GetNumberOfProperties(numProperties));\n  *numProperties += kNumProperties;\n  if (!_flatMode)\n    (*numProperties)--;\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)\n{\n  COM_TRY_BEGIN\n  UInt32 numProperties;\n  _agentSpec->GetArchive()->GetNumberOfProperties(&numProperties);\n  if (index < numProperties)\n  {\n    RINOK(_agentSpec->GetArchive()->GetPropertyInfo(index, name, propID, varType));\n    if (*propID == kpidPath)\n      *propID = kpidName;\n  }\n  else\n  {\n    const STATPROPSTG &srcItem = kProperties[index - numProperties];\n    *propID = srcItem.propid;\n    *varType = srcItem.vt;\n    *name = 0;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTATPROPSTG kFolderProps[] =\n{\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidNumSubDirs, VT_UI4},\n  { NULL, kpidNumSubFiles, VT_UI4},\n  { NULL, kpidCRC, VT_UI4}\n};\n\nstatic const UInt32 kNumFolderProps = sizeof(kFolderProps) / sizeof(kFolderProps[0]);\n\nSTDMETHODIMP CAgentFolder::GetFolderProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidSize:         prop = _proxyFolderItem->Size; break;\n    case kpidPackSize:     prop = _proxyFolderItem->PackSize; break;\n    case kpidNumSubDirs:   prop = _proxyFolderItem->NumSubFolders; break;\n    case kpidNumSubFiles:  prop = _proxyFolderItem->NumSubFiles; break;\n    case kpidName:         prop = _proxyFolderItem->Name; break;\n    case kpidPath:         prop = _proxyFolderItem->GetFullPathPrefix(); break;\n    case kpidType: prop = UString(L\"7-Zip.\") + _agentSpec->ArchiveType; break;\n    case kpidCRC: if (_proxyFolderItem->CrcIsDefined) prop = _proxyFolderItem->Crc; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::GetNumberOfFolderProperties(UInt32 *numProperties)\n{\n  *numProperties = kNumFolderProps;\n  return S_OK;\n}\n\nSTDMETHODIMP CAgentFolder::GetFolderPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)\n{\n  // if (index < kNumFolderProps)\n  {\n    const STATPROPSTG &srcItem = kFolderProps[index];\n    *propID = srcItem.propid;\n    *varType = srcItem.vt;\n    *name = 0;\n    return S_OK;\n  }\n}\n\nSTDMETHODIMP CAgentFolder::GetFolderArchiveProperties(IFolderArchiveProperties **object)\n{\n  CMyComPtr<IFolderArchiveProperties> temp = _agentSpec;\n  *object = temp.Detach();\n  return S_OK;\n}\n\n#ifdef NEW_FOLDER_INTERFACE\n\nSTDMETHODIMP CAgentFolder::SetFlatMode(Int32 flatMode)\n{\n  _flatMode = IntToBool(flatMode);\n  return S_OK;\n}\n\n#endif\n\nvoid CAgentFolder::GetRealIndices(const UInt32 *indices, UInt32 numItems, CUIntVector &realIndices) const\n{\n  if (!_flatMode)\n  {\n    _proxyFolderItem->GetRealIndices(indices, numItems, realIndices);\n    return;\n  }\n  realIndices.Clear();\n  for(UInt32 i = 0; i < numItems; i++)\n  {\n    const CProxyItem &item = _items[indices[i]];\n    const CProxyFolder *folder = item.Folder;\n    UInt32 realIndex = item.Index;\n    if (realIndex < (UInt32)folder->Folders.Size())\n      continue;\n    realIndices.Add(folder->Files[realIndex - folder->Folders.Size()].Index);\n  }\n  HeapSort(&realIndices.Front(), realIndices.Size());\n}\n\nSTDMETHODIMP CAgentFolder::Extract(const UInt32 *indices,\n    UInt32 numItems,\n    NExtract::NPathMode::EEnum pathMode,\n    NExtract::NOverwriteMode::EEnum overwriteMode,\n    const wchar_t *path,\n    INT32 testMode,\n    IFolderArchiveExtractCallback *extractCallback2)\n{\n  COM_TRY_BEGIN\n  CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;\n  CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec;\n  UStringVector pathParts;\n  CProxyFolder *currentProxyFolder = _proxyFolderItem;\n  while (currentProxyFolder->Parent)\n  {\n    pathParts.Insert(0, currentProxyFolder->Name);\n    currentProxyFolder = currentProxyFolder->Parent;\n  }\n  \n  /*\n  if (_flatMode)\n    pathMode = NExtract::NPathMode::kNoPathnames;\n  */\n\n  extractCallbackSpec->InitForMulti(false, pathMode, overwriteMode);\n\n  extractCallbackSpec->Init(_agentSpec->GetArchive(),\n      extractCallback2,\n      false,\n      (path ? path : L\"\"),\n      pathParts,\n      _agentSpec->DefaultName,\n      _agentSpec->DefaultTime,\n      _agentSpec->DefaultAttrib,\n      (UInt64)(Int64)-1\n      // ,_agentSpec->_srcDirectoryPrefix\n      );\n  CUIntVector realIndices;\n  GetRealIndices(indices, numItems, realIndices);\n  return _agentSpec->GetArchive()->Extract(&realIndices.Front(),\n      realIndices.Size(), testMode, extractCallback);\n  COM_TRY_END\n}\n\n/////////////////////////////////////////\n// CAgent\n\nCAgent::CAgent():\n  _proxyArchive(NULL),\n  _codecs(0)\n{\n}\n\nCAgent::~CAgent()\n{\n  if (_proxyArchive != NULL)\n    delete _proxyArchive;\n}\n\nSTDMETHODIMP CAgent::Open(\n    const wchar_t *filePath,\n    BSTR *archiveType,\n    // CLSID *clsIDResult,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  _archiveFilePath = filePath;\n  NFile::NFind::CFileInfoW fileInfo;\n  if (!NFile::NFind::FindFile(_archiveFilePath, fileInfo))\n    return ::GetLastError();\n  if (fileInfo.IsDir())\n    return E_FAIL;\n  CArcInfoEx archiverInfo0, archiverInfo1;\n\n  _compressCodecsInfo.Release();\n  _codecs = new CCodecs;\n  _compressCodecsInfo = _codecs;\n  RINOK(_codecs->Load());\n\n  RINOK(OpenArchive(_codecs, CIntVector(), _archiveFilePath, _archiveLink, openArchiveCallback));\n  // _archive = _archiveLink.GetArchive();\n  DefaultName = _archiveLink.GetDefaultItemName();\n  const CArcInfoEx &ai = _codecs->Formats[_archiveLink.GetArchiverIndex()];\n\n  DefaultTime = fileInfo.MTime;\n  DefaultAttrib = fileInfo.Attrib;\n  ArchiveType = ai.Name;\n  if (archiveType == 0)\n    return S_OK;\n  return StringToBstr(ArchiveType, archiveType);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgent::ReOpen(IArchiveOpenCallback *openArchiveCallback)\n{\n  COM_TRY_BEGIN\n  if (_proxyArchive != NULL)\n  {\n    delete _proxyArchive;\n    _proxyArchive = NULL;\n  }\n  RINOK(ReOpenArchive(_codecs, _archiveLink, _archiveFilePath, openArchiveCallback));\n  return ReadItems();\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgent::Close()\n{\n  COM_TRY_BEGIN\n  RINOK(_archiveLink.Close());\n  if (_archiveLink.GetNumLevels() > 1)\n  {\n    // return S_OK;\n  }\n  // _archive->Close();\n  return S_OK;\n  COM_TRY_END\n}\n\n/*\nSTDMETHODIMP CAgent::EnumProperties(IEnumSTATPROPSTG **EnumProperties)\n{\n  return _archive->EnumProperties(EnumProperties);\n}\n*/\n\nHRESULT CAgent::ReadItems()\n{\n  if (_proxyArchive != NULL)\n    return S_OK;\n  _proxyArchive = new CProxyArchive();\n  return _proxyArchive->Load(GetArchive(),\n      DefaultName,\n      // _defaultTime,\n      // _defaultAttrib,\n      NULL);\n}\n\nSTDMETHODIMP CAgent::BindToRootFolder(IFolderFolder **resultFolder)\n{\n  COM_TRY_BEGIN\n  RINOK(ReadItems());\n  CAgentFolder *folderSpec = new CAgentFolder;\n  CMyComPtr<IFolderFolder> rootFolder = folderSpec;\n  folderSpec->Init(_proxyArchive, &_proxyArchive->RootFolder, NULL, this);\n  *resultFolder = rootFolder.Detach();\n  return S_OK;\n  COM_TRY_END\n}\n\n\nSTDMETHODIMP CAgent::Extract(\n    NExtract::NPathMode::EEnum pathMode,\n    NExtract::NOverwriteMode::EEnum overwriteMode,\n    const wchar_t *path,\n    INT32 testMode,\n    IFolderArchiveExtractCallback *extractCallback2)\n{\n  COM_TRY_BEGIN\n  CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;\n  CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec;\n  extractCallbackSpec->InitForMulti(false, pathMode, overwriteMode);\n  extractCallbackSpec->Init(GetArchive(),\n      extractCallback2,\n      false,\n      path,\n      UStringVector(),\n      DefaultName,\n      DefaultTime,\n      DefaultAttrib,\n      (UInt64)(Int64)-1\n      // ,_srcDirectoryPrefix\n      );\n  return GetArchive()->Extract(0, (UInt32)(Int32)-1, testMode, extractCallback);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgent::GetNumberOfProperties(UInt32 *numProperties)\n{\n  COM_TRY_BEGIN\n  return GetArchive()->GetNumberOfProperties(numProperties);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgent::GetPropertyInfo(UInt32 index,\n      BSTR *name, PROPID *propID, VARTYPE *varType)\n{\n  COM_TRY_BEGIN\n  RINOK(GetArchive()->GetPropertyInfo(index, name, propID, varType));\n  if (*propID == kpidPath)\n    *propID = kpidName;\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgent::GetArchiveProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  return GetArchive()->GetArchiveProperty(propID, value);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgent::GetNumberOfArchiveProperties(UInt32 *numProperties)\n{\n  COM_TRY_BEGIN\n  return GetArchive()->GetNumberOfArchiveProperties(numProperties);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgent::GetArchivePropertyInfo(UInt32 index,\n      BSTR *name, PROPID *propID, VARTYPE *varType)\n{\n  COM_TRY_BEGIN\n  return GetArchive()->GetArchivePropertyInfo(index,\n      name, propID, varType);\n  COM_TRY_END\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/Agent.h",
    "content": "// Agent/Agent.h\n\n#ifndef __AGENT_AGENT_H\n#define __AGENT_AGENT_H\n\n#include \"Common/MyCom.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"../Common/UpdateAction.h\"\n#include \"../Common/OpenArchive.h\"\n\n#include \"IFolderArchive.h\"\n#include \"AgentProxy.h\"\n\n#ifdef NEW_FOLDER_INTERFACE\n#include \"../FileManager/IFolder.h\"\n#include \"../Common/LoadCodecs.h\"\n#endif\n\nclass CAgentFolder;\n\nDECL_INTERFACE(IArchiveFolderInternal, 0x01, 0xC)\n{\n  STDMETHOD(GetAgentFolder)(CAgentFolder **agentFolder) PURE;\n};\n\nstruct CProxyItem\n{\n  CProxyFolder *Folder;\n  UInt32 Index;\n};\n\nclass CAgent;\n\nclass CAgentFolder:\n  public IFolderFolder,\n  public IFolderProperties,\n  public IGetFolderArchiveProperties,\n  public IArchiveFolder,\n  public IArchiveFolderInternal,\n#ifdef NEW_FOLDER_INTERFACE\n  public IFolderOperations,\n  public IFolderSetFlatMode,\n#endif\n  public CMyUnknownImp\n{\npublic:\n\n  MY_QUERYINTERFACE_BEGIN\n    MY_QUERYINTERFACE_ENTRY(IFolderFolder)\n    MY_QUERYINTERFACE_ENTRY(IFolderProperties)\n    MY_QUERYINTERFACE_ENTRY(IGetFolderArchiveProperties)\n    MY_QUERYINTERFACE_ENTRY(IArchiveFolder)\n    MY_QUERYINTERFACE_ENTRY(IArchiveFolderInternal)\n  #ifdef NEW_FOLDER_INTERFACE\n    MY_QUERYINTERFACE_ENTRY(IFolderOperations)\n    MY_QUERYINTERFACE_ENTRY(IFolderSetFlatMode)\n  #endif\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  void LoadFolder(CProxyFolder *folder);\n  HRESULT BindToFolder(CProxyFolder *folder, IFolderFolder **resultFolder);\n  void GetRealIndices(const UINT32 *indices, UINT32 numItems, CUIntVector &realIndices) const;\n\n  INTERFACE_FolderFolder(;)\n  INTERFACE_FolderProperties(;)\n\n  STDMETHOD(GetFolderArchiveProperties)(IFolderArchiveProperties **object);\n\n  // IArchiveFolder\n  STDMETHOD(Extract)(const UINT32 *indices, UINT32 numItems,\n      NExtract::NPathMode::EEnum pathMode,\n      NExtract::NOverwriteMode::EEnum overwriteMode,\n      const wchar_t *path,\n      INT32 testMode,\n      IFolderArchiveExtractCallback *extractCallback);\n  \n  STDMETHOD(GetAgentFolder)(CAgentFolder **agentFolder);\n\n  #ifdef NEW_FOLDER_INTERFACE\n  INTERFACE_FolderOperations(;)\n\n  STDMETHOD(SetFlatMode)(Int32 flatMode);\n  #endif\n\n  CAgentFolder(): _proxyFolderItem(NULL), _flatMode(0) {}\n\n  void Init(CProxyArchive *proxyHandler,\n      CProxyFolder *proxyFolderItem,\n      IFolderFolder *parentFolder,\n      CAgent *agent)\n  {\n    _proxyArchive = proxyHandler;\n    _proxyFolderItem = proxyFolderItem;\n    _parentFolder = parentFolder;\n    _agent = (IInFolderArchive *)agent;\n    _agentSpec = agent;\n  }\n\n  void GetPathParts(UStringVector &pathParts);\n  HRESULT CommonUpdateOperation(\n      bool deleteOperation,\n      bool createFolderOperation,\n      bool renameOperation,\n      const wchar_t *newItemName,\n      const NUpdateArchive::CActionSet *actionSet,\n      const UINT32 *indices, UINT32 numItems,\n      IFolderArchiveUpdateCallback *updateCallback100);\n\n\n  UString GetPrefix(UInt32 index) const;\n  UString GetName(UInt32 index) const;\n  UString GetFullPathPrefixPlusPrefix(UInt32 index) const;\n  void GetPrefixIfAny(UInt32 index, NWindows::NCOM::CPropVariant &propVariant) const;\n\npublic:\n  CProxyArchive *_proxyArchive;\n  CProxyFolder *_proxyFolderItem;\n  CMyComPtr<IFolderFolder> _parentFolder;\n  CMyComPtr<IInFolderArchive> _agent;\n  CAgent *_agentSpec;\n\n  CRecordVector<CProxyItem> _items;\n  bool _flatMode;\nprivate:\n};\n\nclass CAgent:\n  public IInFolderArchive,\n  public IFolderArchiveProperties,\n  #ifndef EXTRACT_ONLY\n  public IOutFolderArchive,\n  public ISetProperties,\n  #endif\n  public CMyUnknownImp\n{\npublic:\n\n  MY_QUERYINTERFACE_BEGIN\n    MY_QUERYINTERFACE_ENTRY(IInFolderArchive)\n    MY_QUERYINTERFACE_ENTRY(IFolderArchiveProperties)\n  #ifndef EXTRACT_ONLY\n    MY_QUERYINTERFACE_ENTRY(IOutFolderArchive)\n    MY_QUERYINTERFACE_ENTRY(ISetProperties)\n  #endif\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  INTERFACE_IInFolderArchive(;)\n  INTERFACE_IFolderArchiveProperties(;)\n\n  #ifndef EXTRACT_ONLY\n  INTERFACE_IOutFolderArchive(;)\n\n  HRESULT CommonUpdate(\n      const wchar_t *newArchiveName,\n      int numUpdateItems,\n      IArchiveUpdateCallback *updateCallback);\n  \n  HRESULT CreateFolder(\n    const wchar_t *newArchiveName,\n    const wchar_t *folderName,\n    IFolderArchiveUpdateCallback *updateCallback100);\n\n  HRESULT RenameItem(\n    const wchar_t *newArchiveName,\n    const UINT32 *indices, UINT32 numItems,\n    const wchar_t *newItemName,\n    IFolderArchiveUpdateCallback *updateCallback100);\n\n  // ISetProperties\n  STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, INT32 numProperties);\n  #endif\n\n  CCodecs *_codecs;\n  CMyComPtr<ICompressCodecsInfo> _compressCodecsInfo;\n\n  CAgent();\n  ~CAgent();\nprivate:\n  HRESULT ReadItems();\npublic:\n  CProxyArchive *_proxyArchive;\n\n  CArchiveLink _archiveLink;\n  // IInArchive *_archive2;\n  \n  UString DefaultName;\n\n  FILETIME DefaultTime;\n  DWORD DefaultAttrib;\n\n  UString ArchiveType;\n\n  UStringVector _names;\n  UString _folderPrefix;\n\n  UString _archiveNamePrefix;\n  CAgentFolder *_agentFolder;\n\n  UString _archiveFilePath;\n\n  #ifndef EXTRACT_ONLY\n  CObjectVector<UString> m_PropNames;\n  CObjectVector<NWindows::NCOM::CPropVariant> m_PropValues;\n  #endif\n\n  IInArchive *GetArchive() { return _archiveLink.GetArchive(); }\n  bool CanUpdate() const { return _archiveLink.GetNumLevels() <= 1; }\n};\n\n#ifdef NEW_FOLDER_INTERFACE\nclass CArchiveFolderManager:\n  public IFolderManager,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(IFolderManager)\n\n  INTERFACE_IFolderManager(;)\n\n  CArchiveFolderManager(): _codecs(0) {}\nprivate:\n  void LoadFormats();\n  int FindFormat(const UString &type);\n  CCodecs *_codecs;\n  CMyComPtr<ICompressCodecsInfo> _compressCodecsInfo;\n};\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/AgentOut.cpp",
    "content": "// AgentOut.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/Defs.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../../Common/FileStreams.h\"\n\n#include \"../Common/EnumDirItems.h\"\n#include \"../Common/HandlerLoader.h\"\n#include \"../Common/OpenArchive.h\"\n#include \"../Common/UpdateCallback.h\"\n#include \"../Common/UpdatePair.h\"\n\n#include \"Agent.h\"\n#include \"UpdateCallbackAgent.h\"\n\nusing namespace NWindows;\nusing namespace NCOM;\n\nstatic HRESULT CopyBlock(ISequentialInStream *inStream, ISequentialOutStream *outStream)\n{\n  CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;\n  return copyCoder->Code(inStream, outStream, NULL, NULL, NULL);\n}\n\nSTDMETHODIMP CAgent::SetFolder(IFolderFolder *folder)\n{\n  _archiveNamePrefix.Empty();\n  if (folder == NULL)\n  {\n    _agentFolder = NULL;\n    return S_OK;\n  }\n  else\n  {\n    CMyComPtr<IFolderFolder> archiveFolder = folder;\n    CMyComPtr<IArchiveFolderInternal> archiveFolderInternal;\n    RINOK(archiveFolder.QueryInterface(IID_IArchiveFolderInternal, &archiveFolderInternal));\n    RINOK(archiveFolderInternal->GetAgentFolder(&_agentFolder));\n  }\n\n  UStringVector pathParts;\n  pathParts.Clear();\n  CMyComPtr<IFolderFolder> folderItem = folder;\n  if (folderItem != NULL)\n    for (;;)\n    {\n      CMyComPtr<IFolderFolder> newFolder;\n      folderItem->BindToParentFolder(&newFolder);\n      if (newFolder == NULL)\n        break;\n\n      NCOM::CPropVariant prop;\n      if (folderItem->GetFolderProperty(kpidName, &prop) == S_OK)\n        if (prop.vt == VT_BSTR)\n          pathParts.Insert(0, (const wchar_t *)prop.bstrVal);\n      folderItem = newFolder;\n    }\n\n  for (int i = 0; i < pathParts.Size(); i++)\n  {\n    _archiveNamePrefix += pathParts[i];\n    _archiveNamePrefix += WCHAR_PATH_SEPARATOR;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CAgent::SetFiles(const wchar_t *folderPrefix,\n    const wchar_t **names, UInt32 numNames)\n{\n  _folderPrefix = folderPrefix;\n  _names.Clear();\n  _names.Reserve(numNames);\n  for (UInt32 i = 0; i < numNames; i++)\n    _names.Add(names[i]);\n  return S_OK;\n}\n\n\nstatic HRESULT GetFileTime(CAgent *agent, UInt32 itemIndex, FILETIME &fileTime)\n{\n  CPropVariant property;\n  RINOK(agent->GetArchive()->GetProperty(itemIndex, kpidMTime, &property));\n  if (property.vt == VT_FILETIME)\n    fileTime = property.filetime;\n  else if (property.vt == VT_EMPTY)\n    fileTime = agent->DefaultTime;\n  else\n    throw 4190407;\n  return S_OK;\n}\n\nstatic HRESULT EnumerateArchiveItems(CAgent *agent,\n    const CProxyFolder &item,\n    const UString &prefix,\n    CObjectVector<CArcItem> &arcItems)\n{\n  int i;\n  for (i = 0; i < item.Files.Size(); i++)\n  {\n    const CProxyFile &fileItem = item.Files[i];\n    CArcItem ai;\n\n    RINOK(::GetFileTime(agent, fileItem.Index, ai.MTime));\n\n    CPropVariant property;\n    agent->GetArchive()->GetProperty(fileItem.Index, kpidSize, &property);\n    ai.SizeDefined = (property.vt != VT_EMPTY);\n    if (ai.SizeDefined)\n      ai.Size = ConvertPropVariantToUInt64(property);\n    ai.IsDir = false;\n    ai.Name = prefix + fileItem.Name;\n    ai.Censored = true; // test it\n    ai.IndexInServer = fileItem.Index;\n    arcItems.Add(ai);\n  }\n  for (i = 0; i < item.Folders.Size(); i++)\n  {\n    const CProxyFolder &dirItem = item.Folders[i];\n    UString fullName = prefix + dirItem.Name;\n    if(dirItem.IsLeaf)\n    {\n      CArcItem ai;\n      RINOK(::GetFileTime(agent, dirItem.Index, ai.MTime));\n      ai.IsDir = true;\n      ai.SizeDefined = false;\n      ai.Name = fullName;\n      ai.Censored = true; // test it\n      ai.IndexInServer = dirItem.Index;\n      arcItems.Add(ai);\n    }\n    RINOK(EnumerateArchiveItems(agent, dirItem, fullName + UString(WCHAR_PATH_SEPARATOR), arcItems));\n  }\n  return S_OK;\n}\n\nstruct CAgUpCallbackImp: public IUpdateProduceCallback\n{\n  const CObjectVector<CArcItem> *_arcItems;\n  IFolderArchiveUpdateCallback *_callback;\n  \n  CAgUpCallbackImp(const CObjectVector<CArcItem> *a, \n      IFolderArchiveUpdateCallback *callback): _arcItems(a), _callback(callback) {}\n  HRESULT ShowDeleteFile(int arcIndex);\n};\n\nHRESULT CAgUpCallbackImp::ShowDeleteFile(int arcIndex)\n{\n  return _callback->DeleteOperation((*_arcItems)[arcIndex].Name);\n}\n\nSTDMETHODIMP CAgent::DoOperation(\n    CCodecs *codecs,\n    int formatIndex,\n    const wchar_t *newArchiveName,\n    const Byte *stateActions,\n    const wchar_t *sfxModule,\n    IFolderArchiveUpdateCallback *updateCallback100)\n{\n  if (!CanUpdate())\n    return E_NOTIMPL;\n  NUpdateArchive::CActionSet actionSet;\n  int i;\n  for (i = 0; i < NUpdateArchive::NPairState::kNumValues; i++)\n    actionSet.StateActions[i] = (NUpdateArchive::NPairAction::EEnum)stateActions[i];\n\n  CDirItems dirItems;\n\n  {\n    UString folderPrefix = _folderPrefix;\n    NFile::NName::NormalizeDirPathPrefix(folderPrefix);\n    UStringVector errorPaths;\n    CRecordVector<DWORD> errorCodes;\n    dirItems.EnumerateDirItems2(folderPrefix, _archiveNamePrefix, _names, errorPaths, errorCodes);\n    if (errorCodes.Size() > 0)\n      return errorCodes.Front();\n  }\n\n  CMyComPtr<IOutArchive> outArchive;\n  if (GetArchive())\n  {\n    RINOK(GetArchive()->QueryInterface(IID_IOutArchive, (void **)&outArchive));\n  }\n  else\n  {\n    if (formatIndex < 0)\n      return E_FAIL;\n    RINOK(codecs->CreateOutArchive(formatIndex, outArchive));\n    #ifdef EXTERNAL_CODECS\n    {\n      CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;\n      outArchive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);\n      if (setCompressCodecsInfo)\n      {\n        RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecs));\n      }\n    }\n    #endif\n\n  }\n\n  NFileTimeType::EEnum fileTimeType;\n  UInt32 value;\n  RINOK(outArchive->GetFileTimeType(&value));\n\n  switch(value)\n  {\n    case NFileTimeType::kWindows:\n    case NFileTimeType::kDOS:\n    case NFileTimeType::kUnix:\n      fileTimeType = NFileTimeType::EEnum(value);\n      break;\n    default:\n      return E_FAIL;\n  }\n\n\n  CObjectVector<CArcItem> arcItems;\n  if (GetArchive())\n  {\n    RINOK(ReadItems());\n    EnumerateArchiveItems(this, _proxyArchive->RootFolder,  L\"\", arcItems);\n  }\n\n  CRecordVector<CUpdatePair2> updatePairs2;\n\n  {\n    CRecordVector<CUpdatePair> updatePairs;\n    GetUpdatePairInfoList(dirItems, arcItems, fileTimeType, updatePairs);\n    CAgUpCallbackImp upCallback(&arcItems, updateCallback100);\n    UpdateProduce(updatePairs, actionSet, updatePairs2, &upCallback);\n  }\n\n  UInt32 numFiles = 0;\n  for (i = 0; i < updatePairs2.Size(); i++)\n    if (updatePairs2[i].NewData)\n      numFiles++;\n  \n  if (updateCallback100)\n  {\n    RINOK(updateCallback100->SetNumFiles(numFiles));\n  }\n  \n  CUpdateCallbackAgent updateCallbackAgent;\n  updateCallbackAgent.SetCallback(updateCallback100);\n  CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback;\n  CMyComPtr<IArchiveUpdateCallback> updateCallback(updateCallbackSpec );\n\n  updateCallbackSpec->DirItems = &dirItems;\n  updateCallbackSpec->ArcItems = &arcItems;\n  updateCallbackSpec->UpdatePairs = &updatePairs2;\n  updateCallbackSpec->Archive = GetArchive();\n  updateCallbackSpec->Callback = &updateCallbackAgent;\n\n  COutFileStream *outStreamSpec = new COutFileStream;\n  CMyComPtr<IOutStream> outStream(outStreamSpec);\n  UString archiveName = newArchiveName;\n  {\n    UString resultPath;\n    int pos;\n    if(!NFile::NDirectory::MyGetFullPathName(archiveName, resultPath, pos))\n      return E_FAIL;\n    NFile::NDirectory::CreateComplexDirectory(resultPath.Left(pos));\n  }\n  if (!outStreamSpec->Create(archiveName, true))\n  {\n    // ShowLastErrorMessage();\n    return E_FAIL;\n  }\n  \n  CMyComPtr<ISetProperties> setProperties;\n  if (outArchive->QueryInterface(IID_ISetProperties, (void **)&setProperties) == S_OK)\n  {\n    if (m_PropNames.Size() == 0)\n    {\n      RINOK(setProperties->SetProperties(0, 0, 0));\n    }\n    else\n    {\n      CRecordVector<const wchar_t *> names;\n      for(i = 0; i < m_PropNames.Size(); i++)\n        names.Add((const wchar_t *)m_PropNames[i]);\n\n      NWindows::NCOM::CPropVariant *propValues = new NWindows::NCOM::CPropVariant[m_PropValues.Size()];\n      try\n      {\n        for (int i = 0; i < m_PropValues.Size(); i++)\n          propValues[i] = m_PropValues[i];\n        RINOK(setProperties->SetProperties(&names.Front(), propValues, names.Size()));\n      }\n      catch(...)\n      {\n        delete []propValues;\n        return E_FAIL;\n      }\n      delete []propValues;\n    }\n  }\n  m_PropNames.Clear();\n  m_PropValues.Clear();\n\n  if (sfxModule != NULL)\n  {\n    CInFileStream *sfxStreamSpec = new CInFileStream;\n    CMyComPtr<IInStream> sfxStream(sfxStreamSpec);\n    if (!sfxStreamSpec->Open(sfxModule))\n      return E_FAIL;\n      // throw \"Can't open sfx module\";\n    RINOK(CopyBlock(sfxStream, outStream));\n  }\n\n  RINOK(outArchive->UpdateItems(outStream, updatePairs2.Size(),updateCallback));\n  return outStreamSpec->Close();\n}\n\nSTDMETHODIMP CAgent::DoOperation2(\n    const wchar_t *newArchiveName,\n    const Byte *stateActions,\n    const wchar_t *sfxModule,\n    IFolderArchiveUpdateCallback *updateCallback100)\n{\n  return DoOperation(_codecs, -1, newArchiveName,\n    stateActions, sfxModule, updateCallback100);\n}\n\nHRESULT CAgent::CommonUpdate(\n    const wchar_t *newArchiveName,\n    int numUpdateItems,\n    IArchiveUpdateCallback *updateCallback)\n{\n  if (!CanUpdate())\n    return E_NOTIMPL;\n  CMyComPtr<IOutArchive> outArchive;\n  RINOK(GetArchive()->QueryInterface(IID_IOutArchive, (void **)&outArchive));\n\n  COutFileStream *outStreamSpec = new COutFileStream;\n  CMyComPtr<IOutStream> outStream(outStreamSpec);\n\n  UString archiveName = newArchiveName;\n  {\n    UString resultPath;\n    int pos;\n    if(!NFile::NDirectory::MyGetFullPathName(archiveName, resultPath, pos))\n      throw 141716;\n    NFile::NDirectory::CreateComplexDirectory(resultPath.Left(pos));\n  }\n\n  /*\n  bool isOK = false;\n  for (int i = 0; i < (1 << 16); i++)\n  {\n    resultName = newArchiveName;\n    if (i > 0)\n    {\n      wchar_t s[32];\n      ConvertUInt64ToString(i, s);\n      resultName += s;\n    }\n    if (outStreamSpec->Open(realPath))\n    {\n      isOK = true;\n      break;\n    }\n    if (::GetLastError() != ERROR_FILE_EXISTS)\n      return ::GetLastError();\n  }\n  if (!isOK)\n    return ::GetLastError();\n  */\n  if (!outStreamSpec->Create(archiveName, true))\n  {\n    // ShowLastErrorMessage();\n    return E_FAIL;\n  }\n  \n  RINOK(outArchive->UpdateItems(outStream, numUpdateItems, updateCallback));\n  return outStreamSpec->Close();\n}\n\n\nSTDMETHODIMP CAgent::DeleteItems(\n    const wchar_t *newArchiveName,\n    const UInt32 *indices, UInt32 numItems,\n    IFolderArchiveUpdateCallback *updateCallback100)\n{\n  if (!CanUpdate())\n    return E_NOTIMPL;\n  CUpdateCallbackAgent updateCallbackAgent;\n  updateCallbackAgent.SetCallback(updateCallback100);\n  CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback;\n  CMyComPtr<IArchiveUpdateCallback> updateCallback(updateCallbackSpec);\n  \n  CUIntVector realIndices;\n  _agentFolder->GetRealIndices(indices, numItems, realIndices);\n  CRecordVector<CUpdatePair2> updatePairs;\n  int curIndex = 0;\n  UInt32 numItemsInArchive;\n  RINOK(GetArchive()->GetNumberOfItems(&numItemsInArchive));\n  for (UInt32 i = 0; i < numItemsInArchive; i++)\n  {\n    if (curIndex < realIndices.Size())\n      if (realIndices[curIndex] == i)\n      {\n        curIndex++;\n        continue;\n      }\n    CUpdatePair2 up2;\n    up2.NewData = up2.NewProps = false;\n    up2.IsAnti = false; // check it. Maybe it can be undefined\n    up2.ArcIndex = i;\n    updatePairs.Add(up2);\n  }\n  updateCallbackSpec->UpdatePairs = &updatePairs;\n  updateCallbackSpec->Archive = GetArchive();\n  updateCallbackSpec->Callback = &updateCallbackAgent;\n  return CommonUpdate(newArchiveName, updatePairs.Size(), updateCallback);\n}\n\nHRESULT CAgent::CreateFolder(\n    const wchar_t *newArchiveName,\n    const wchar_t *folderName,\n    IFolderArchiveUpdateCallback *updateCallback100)\n{\n  if (!CanUpdate())\n    return E_NOTIMPL;\n  CUpdateCallbackAgent updateCallbackAgent;\n  updateCallbackAgent.SetCallback(updateCallback100);\n  CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback;\n  CMyComPtr<IArchiveUpdateCallback> updateCallback(updateCallbackSpec);\n\n  CRecordVector<CUpdatePair2> updatePairs;\n  UInt32 numItemsInArchive;\n  RINOK(GetArchive()->GetNumberOfItems(&numItemsInArchive));\n  for (UInt32 i = 0; i < numItemsInArchive; i++)\n  {\n    CUpdatePair2 up2;\n    up2.NewData = up2.NewProps = false;\n    up2.IsAnti = false;  // check it.\n    up2.ArcIndex = i;\n    updatePairs.Add(up2);\n  }\n  CUpdatePair2 up2;\n  up2.NewData = up2.NewProps = true;\n  up2.IsAnti = false;\n  up2.DirIndex = 0;\n\n  updatePairs.Add(up2);\n\n  updatePairs.ReserveDown();\n\n  CDirItems dirItems;\n  CDirItem di;\n\n  di.Attrib = FILE_ATTRIBUTE_DIRECTORY;\n  di.Size = 0;\n  di.Name = _agentFolder->_proxyFolderItem->GetFullPathPrefix() + folderName;\n\n  FILETIME ft;\n  NTime::GetCurUtcFileTime(ft);\n  di.CTime = di.ATime = di.MTime = ft;\n\n  dirItems.Items.Add(di);\n\n  updateCallbackSpec->Callback = &updateCallbackAgent;\n  updateCallbackSpec->DirItems = &dirItems;\n  updateCallbackSpec->UpdatePairs = &updatePairs;\n  updateCallbackSpec->Archive = GetArchive();\n  return CommonUpdate(newArchiveName, updatePairs.Size(), updateCallback);\n}\n\n\nHRESULT CAgent::RenameItem(\n    const wchar_t *newArchiveName,\n    const UInt32 *indices, UInt32 numItems,\n    const wchar_t *newItemName,\n    IFolderArchiveUpdateCallback *updateCallback100)\n{\n  if (!CanUpdate())\n    return E_NOTIMPL;\n  if (numItems != 1)\n    return E_INVALIDARG;\n  CUpdateCallbackAgent updateCallbackAgent;\n  updateCallbackAgent.SetCallback(updateCallback100);\n  CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback;\n  CMyComPtr<IArchiveUpdateCallback> updateCallback(updateCallbackSpec);\n  \n  CUIntVector realIndices;\n  _agentFolder->GetRealIndices(indices, numItems, realIndices);\n\n  UString fullPrefix = _agentFolder->GetFullPathPrefixPlusPrefix(indices[0]);\n  UString oldItemPath = fullPrefix + _agentFolder->GetName(indices[0]);\n  UString newItemPath = fullPrefix + newItemName;\n\n  CRecordVector<CUpdatePair2> updatePairs;\n  UStringVector newNames;\n\n  int curIndex = 0;\n  UInt32 numItemsInArchive;\n  RINOK(GetArchive()->GetNumberOfItems(&numItemsInArchive));\n  for (UInt32 i = 0; i < numItemsInArchive; i++)\n  {\n    if (curIndex < realIndices.Size())\n      if (realIndices[curIndex] == i)\n      {\n        CUpdatePair2 up2;\n        up2.NewData = false;\n        up2.NewProps = true;\n        RINOK(IsArchiveItemAnti(GetArchive(), i, up2.IsAnti));\n        up2.ArcIndex = i;\n\n        UString oldFullPath;\n        RINOK(GetArchiveItemPath(GetArchive(), i, DefaultName, oldFullPath));\n\n        if (oldItemPath.CompareNoCase(oldFullPath.Left(oldItemPath.Length())) != 0)\n          return E_INVALIDARG;\n\n        up2.NewNameIndex = newNames.Add(newItemPath + oldFullPath.Mid(oldItemPath.Length()));\n        updatePairs.Add(up2);\n        curIndex++;\n        continue;\n      }\n    CUpdatePair2 up2;\n    up2.NewData = up2.NewProps = false;\n    up2.IsAnti = false;\n    up2.ArcIndex = i;\n    updatePairs.Add(up2);\n  }\n  updateCallbackSpec->Callback = &updateCallbackAgent;\n  updateCallbackSpec->UpdatePairs = &updatePairs;\n  updateCallbackSpec->NewNames = &newNames;\n  updateCallbackSpec->Archive = GetArchive();\n  return CommonUpdate(newArchiveName, updatePairs.Size(), updateCallback);\n}\n\nSTDMETHODIMP CAgent::SetProperties(const wchar_t **names,\n    const PROPVARIANT *values, INT32 numProperties)\n{\n  m_PropNames.Clear();\n  m_PropValues.Clear();\n  for (int i = 0; i < numProperties; i++)\n  {\n    m_PropNames.Add(names[i]);\n    m_PropValues.Add(values[i]);\n  }\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/AgentProxy.cpp",
    "content": "// AgentProxy.cpp\n\n#include \"StdAfx.h\"\n\n#include \"AgentProxy.h\"\n\n#include \"Common/MyCom.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n#include \"Windows/Defs.h\"\n#include \"../Common/OpenArchive.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/Sort.h\"\n}\n\nusing namespace NWindows;\n\nint CProxyFolder::FindDirSubItemIndex(const UString &name, int &insertPos) const\n{\n  int left = 0, right = Folders.Size();\n  for (;;)\n  {\n    if (left == right)\n    {\n      insertPos = left;\n      return -1;\n    }\n    int mid = (left + right) / 2;\n    int compare = name.CompareNoCase(Folders[mid].Name);\n    if (compare == 0)\n      return mid;\n    if (compare < 0)\n      right = mid;\n    else\n      left = mid + 1;\n  }\n}\n\nint CProxyFolder::FindDirSubItemIndex(const UString &name) const\n{\n  int insertPos;\n  return FindDirSubItemIndex(name, insertPos);\n}\n\nvoid CProxyFolder::AddFileSubItem(UInt32 index, const UString &name)\n{\n  Files.Add(CProxyFile());\n  Files.Back().Name = name;\n  Files.Back().Index = index;\n}\n\nCProxyFolder* CProxyFolder::AddDirSubItem(UInt32 index, bool leaf, const UString &name)\n{\n  int insertPos;\n  int folderIndex = FindDirSubItemIndex(name, insertPos);\n  if (folderIndex >= 0)\n  {\n    CProxyFolder *item = &Folders[folderIndex];\n    if(leaf)\n    {\n      item->Index = index;\n      item->IsLeaf = true;\n    }\n    return item;\n  }\n  Folders.Insert(insertPos, CProxyFolder());\n  CProxyFolder *item = &Folders[insertPos];\n  item->Name = name;\n  item->Index = index;\n  item->Parent = this;\n  item->IsLeaf = leaf;\n  return item;\n}\n\nvoid CProxyFolder::Clear()\n{\n  Folders.Clear();\n  Files.Clear();\n}\n\nvoid CProxyFolder::GetPathParts(UStringVector &pathParts) const\n{\n  pathParts.Clear();\n  UString result;\n  const CProxyFolder *current = this;\n  while (current->Parent != NULL)\n  {\n    pathParts.Insert(0, (const wchar_t *)current->Name);\n    current = current->Parent;\n  }\n}\n\nUString CProxyFolder::GetFullPathPrefix() const\n{\n  UString result;\n  const CProxyFolder *current = this;\n  while (current->Parent != NULL)\n  {\n    result = current->Name + UString(WCHAR_PATH_SEPARATOR) + result;\n    current = current->Parent;\n  }\n  return result;\n}\n\nUString CProxyFolder::GetItemName(UInt32 index) const\n{\n  if (index < (UInt32)Folders.Size())\n    return Folders[index].Name;\n  return Files[index - Folders.Size()].Name;\n}\n\nvoid CProxyFolder::AddRealIndices(CUIntVector &realIndices) const\n{\n  if (IsLeaf)\n    realIndices.Add(Index);\n  int i;\n  for(i = 0; i < Folders.Size(); i++)\n    Folders[i].AddRealIndices(realIndices);\n  for(i = 0; i < Files.Size(); i++)\n    realIndices.Add(Files[i].Index);\n}\n\nvoid CProxyFolder::GetRealIndices(const UInt32 *indices, UInt32 numItems, CUIntVector &realIndices) const\n{\n  realIndices.Clear();\n  for(UInt32 i = 0; i < numItems; i++)\n  {\n    int index = indices[i];\n    int numDirItems = Folders.Size();\n    if (index < numDirItems)\n      Folders[index].AddRealIndices(realIndices);\n    else\n      realIndices.Add(Files[index - numDirItems].Index);\n  }\n  HeapSort(&realIndices.Front(), realIndices.Size());\n}\n\n///////////////////////////////////////////////\n// CProxyArchive\n\nHRESULT CProxyArchive::Reload(IInArchive *archive, IProgress *progress)\n{\n  RootFolder.Clear();\n  return ReadObjects(archive, progress);\n}\n\nHRESULT CProxyArchive::Load(IInArchive *archive,\n    const UString &defaultName,\n    // const FILETIME &defaultTime,\n    // UInt32 defaultAttributes,\n    IProgress *progress)\n{\n  DefaultName = defaultName;\n  // DefaultTime = defaultTime;\n  // DefaultAttributes = defaultAttributes;\n  return Reload(archive, progress);\n}\n\nstatic UInt64 GetSize(IInArchive *archive, UInt32 index, PROPID propID)\n{\n  NCOM::CPropVariant prop;\n  if (archive->GetProperty(index, propID, &prop) == S_OK)\n    if (prop.vt != VT_EMPTY)\n      return ConvertPropVariantToUInt64(prop);\n  return 0;\n}\n\nvoid CProxyFolder::CalculateSizes(IInArchive *archive)\n{\n  Size = PackSize = 0;\n  NumSubFolders = Folders.Size();\n  NumSubFiles = Files.Size();\n  CrcIsDefined = true;\n  Crc = 0;\n  int i;\n  for (i = 0; i < Files.Size(); i++)\n  {\n    UInt32 index = Files[i].Index;\n    Size += GetSize(archive, index, kpidSize);\n    PackSize += GetSize(archive, index, kpidPackSize);\n    {\n      NCOM::CPropVariant prop;\n      if (archive->GetProperty(index, kpidCRC, &prop) == S_OK)\n      {\n        if (prop.vt == VT_UI4)\n          Crc += prop.ulVal;\n        else\n          CrcIsDefined = false;\n      }\n      else\n        CrcIsDefined = false;\n    }\n  }\n  for (i = 0; i < Folders.Size(); i++)\n  {\n    CProxyFolder &f = Folders[i];\n    f.CalculateSizes(archive);\n    Size += f.Size;\n    PackSize += f.PackSize;\n    NumSubFiles += f.NumSubFiles;\n    NumSubFolders += f.NumSubFolders;\n    Crc += f.Crc;\n    if (!f.CrcIsDefined)\n      CrcIsDefined = false;\n  }\n}\n\nHRESULT CProxyArchive::ReadObjects(IInArchive *archive, IProgress *progress)\n{\n  UInt32 numItems;\n  RINOK(archive->GetNumberOfItems(&numItems));\n  if (progress != NULL)\n  {\n    UINT64 totalItems = numItems;\n    RINOK(progress->SetTotal(totalItems));\n  }\n  for(UInt32 i = 0; i < numItems; i++)\n  {\n    if (progress != NULL)\n    {\n      UINT64 currentItemIndex = i;\n      RINOK(progress->SetCompleted(&currentItemIndex));\n    }\n    NCOM::CPropVariant propVariantPath;\n    RINOK(archive->GetProperty(i, kpidPath, &propVariantPath));\n    CProxyFolder *currentItem = &RootFolder;\n    UString fileName;\n    if(propVariantPath.vt == VT_EMPTY)\n    {\n      fileName = DefaultName;\n\n      NCOM::CPropVariant prop;\n      RINOK(archive->GetProperty(i, kpidExtension, &prop));\n      if (prop.vt == VT_BSTR)\n      {\n        fileName += L'.';\n        fileName += prop.bstrVal;\n      }\n      else if (prop.vt != VT_EMPTY)\n        return E_FAIL;\n\n    }\n    else\n    {\n      if(propVariantPath.vt != VT_BSTR)\n        return E_FAIL;\n      UString filePath = propVariantPath.bstrVal;\n\n      int len = filePath.Length();\n      for (int i = 0; i < len; i++)\n      {\n        wchar_t c = filePath[i];\n        if (c == WCHAR_PATH_SEPARATOR || c == L'/')\n        {\n          currentItem = currentItem->AddDirSubItem((UInt32)(Int32)-1, false, fileName);\n          fileName.Empty();\n        }\n        else\n          fileName += c;\n      }\n    }\n\n    NCOM::CPropVariant propVariantIsFolder;\n    bool isFolder;\n    RINOK(IsArchiveItemFolder(archive, i, isFolder));\n    if(isFolder)\n      currentItem->AddDirSubItem(i, true, fileName);\n    else\n      currentItem->AddFileSubItem(i, fileName);\n  }\n  RootFolder.CalculateSizes(archive);\n  return S_OK;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/AgentProxy.h",
    "content": "// AgentProxy.h\n\n#ifndef __AGENT_PROXY_H\n#define __AGENT_PROXY_H\n\n#include \"Common/MyString.h\"\n\n#include \"../../Archive/IArchive.h\"\n\nclass CProxyFile\n{\npublic:\n  UInt32 Index;\n  UString Name;\n};\n\nclass CProxyFolder: public CProxyFile\n{\npublic:\n  CProxyFolder *Parent;\n  CObjectVector<CProxyFolder> Folders;\n  CObjectVector<CProxyFile> Files;\n  bool IsLeaf;\n\n  bool CrcIsDefined;\n  UInt64 Size;\n  UInt64 PackSize;\n  UInt32 Crc;\n  UInt32 NumSubFolders;\n  UInt32 NumSubFiles;\n\n  CProxyFolder(): Parent(NULL) {};\n  int FindDirSubItemIndex(const UString &name, int &insertPos) const;\n  int FindDirSubItemIndex(const UString &name) const;\n  CProxyFolder* AddDirSubItem(UInt32 index, bool leaf, const UString &name);\n  void AddFileSubItem(UInt32 index, const UString &name);\n  void Clear();\n\n  void GetPathParts(UStringVector &pathParts) const;\n  UString GetFullPathPrefix() const;\n  UString GetItemName(UInt32 index) const;\n  void AddRealIndices(CUIntVector &realIndices) const;\n  void GetRealIndices(const UInt32 *indices, UInt32 numItems, CUIntVector &realIndices) const;\n  void CalculateSizes(IInArchive *archive);\n};\n\nclass CProxyArchive\n{\n  HRESULT ReadObjects(IInArchive *archive, IProgress *progress);\npublic:\n  UString DefaultName;\n  // FILETIME DefaultTime;\n  // UInt32 DefaultAttributes;\n  CProxyFolder RootFolder;\n  HRESULT Reload(IInArchive *archive, IProgress *progress);\n  HRESULT Load(IInArchive *archive,\n      const UString &defaultName,\n      // const FILETIME &defaultTime,\n      // UInt32 defaultAttributes,\n      IProgress *progress);\n};\n\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/ArchiveFolder.cpp",
    "content": "// Zip/ArchiveFolder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/ComTry.h\"\n#include \"Common/StringConvert.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n#include \"Windows/FileDir.h\"\n\n#include \"../../Common/FileStreams.h\"\n\n#include \"../Common/UpdatePair.h\"\n#include \"../Common/ArchiveExtractCallback.h\"\n\n#include \"Agent.h\"\n\nusing namespace NWindows;\nusing namespace NCOM;\n\nSTDMETHODIMP CAgentFolder::CopyTo(const UINT32 *indices, UINT32 numItems,\n    const wchar_t *path, IFolderOperationsExtractCallback *callback)\n{\n  COM_TRY_BEGIN\n  CArchiveExtractCallback *extractCallbackSpec = new\n      CArchiveExtractCallback;\n  CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec;\n  UStringVector pathParts;\n  CProxyFolder *currentProxyFolder = _proxyFolderItem;\n  while (currentProxyFolder->Parent)\n  {\n    pathParts.Insert(0, currentProxyFolder->Name);\n    currentProxyFolder = currentProxyFolder->Parent;\n  }\n\n  CMyComPtr<IFolderArchiveExtractCallback> extractCallback2;\n  {\n    CMyComPtr<IFolderOperationsExtractCallback> callbackWrap = callback;\n    RINOK(callbackWrap.QueryInterface(\n        IID_IFolderArchiveExtractCallback, &extractCallback2));\n  }\n\n  NExtract::NPathMode::EEnum pathMode = _flatMode ?\n      NExtract::NPathMode::kNoPathnames :\n      NExtract::NPathMode::kCurrentPathnames;\n\n  extractCallbackSpec->InitForMulti(false, pathMode, NExtract::NOverwriteMode::kAskBefore);\n  extractCallbackSpec->Init(_agentSpec->GetArchive(),\n      extractCallback2,\n      false,\n      path,\n      pathParts,\n      _agentSpec->DefaultName,\n      _agentSpec->DefaultTime,\n      _agentSpec->DefaultAttrib,\n      (UInt64)(Int64)-1\n\n      // ,_agentSpec->_srcDirectoryPrefix\n      );\n  CUIntVector realIndices;\n  GetRealIndices(indices, numItems, realIndices);\n  return _agentSpec->GetArchive()->Extract(&realIndices.Front(),\n      realIndices.Size(), BoolToInt(false), extractCallback);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::MoveTo(const UINT32 * /* indices */, UINT32 /* numItems */,\n    const wchar_t * /* path */, IFolderOperationsExtractCallback * /* callback */)\n{\n  return E_NOTIMPL;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/ArchiveFolderOpen.cpp",
    "content": "// Zip/ArchiveFolder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Agent.h\"\n\n#include \"Common/StringConvert.h\"\n\n#include \"../Common/OpenArchive.h\"\n\nstatic inline UINT GetCurrentFileCodePage()\n  {  return AreFileApisANSI() ? CP_ACP : CP_OEMCP; }\n\nvoid CArchiveFolderManager::LoadFormats()\n{\n  if (!_codecs)\n  {\n    _compressCodecsInfo = _codecs = new CCodecs;\n    _codecs->Load();\n  }\n}\n\nint CArchiveFolderManager::FindFormat(const UString &type)\n{\n  for (int i = 0; i < _codecs->Formats.Size(); i++)\n    if (type.CompareNoCase(_codecs->Formats[i].Name) == 0)\n      return i;\n  return -1;\n}\n\nSTDMETHODIMP CArchiveFolderManager::OpenFolderFile(const wchar_t *filePath,\n    IFolderFolder **resultFolder, IProgress *progress)\n{\n  CMyComPtr<IArchiveOpenCallback> openArchiveCallback;\n  if (progress != 0)\n  {\n    CMyComPtr<IProgress> progressWrapper = progress;\n    progressWrapper.QueryInterface(IID_IArchiveOpenCallback, &openArchiveCallback);\n  }\n  CAgent *agent = new CAgent();\n  CMyComPtr<IInFolderArchive> archive = agent;\n  RINOK(agent->Open(filePath, NULL, openArchiveCallback));\n  return agent->BindToRootFolder(resultFolder);\n}\n\n/*\nHRESULT CAgent::FolderReOpen(\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  return ReOpenArchive(_archive, _archiveFilePath);\n}\n*/\n\n\n/*\nSTDMETHODIMP CArchiveFolderManager::GetExtensions(const wchar_t *type, BSTR *extensions)\n{\n  *extensions = 0;\n  int formatIndex = FindFormat(type);\n  if (formatIndex <  0)\n    return E_INVALIDARG;\n  // Exts[0].Ext;\n  return StringToBstr(_codecs.Formats[formatIndex].GetAllExtensions(), extensions);\n}\n*/\nSTDMETHODIMP CArchiveFolderManager::GetExtensions(BSTR *extensions)\n{\n  LoadFormats();\n  *extensions = 0;\n  UString res;\n  for (int i = 0; i < _codecs->Libs.Size(); i++)\n  {\n    const CCodecLib &lib = _codecs->Libs[i];\n    for (int j = 0; j < lib.IconPairs.Size(); j++)\n    {\n      if (!res.IsEmpty())\n        res += L' ';\n      res += lib.IconPairs[j].Ext;\n    }\n  }\n  return StringToBstr(res, extensions);\n}\n\nSTDMETHODIMP CArchiveFolderManager::GetIconPath(const wchar_t *ext, BSTR *iconPath, Int32 *iconIndex)\n{\n  LoadFormats();\n  *iconPath = 0;\n  *iconIndex = 0;\n  for (int i = 0; i < _codecs->Libs.Size(); i++)\n  {\n    const CCodecLib &lib = _codecs->Libs[i];\n    int ii = lib.FindIconIndex(ext);\n    if (ii >= 0)\n    {\n      *iconIndex = ii;\n      return StringToBstr(GetUnicodeString(lib.Path, GetCurrentFileCodePage()), iconPath);\n    }\n  }\n  return S_OK;\n}\n\n/*\nSTDMETHODIMP CArchiveFolderManager::GetTypes(BSTR *types)\n{\n  LoadFormats();\n  UString typesStrings;\n  for(int i = 0; i < _codecs.Formats.Size(); i++)\n  {\n    const CArcInfoEx &ai = _codecs.Formats[i];\n    if (ai.AssociateExts.Size() == 0)\n      continue;\n    if (i != 0)\n      typesStrings += L' ';\n    typesStrings += ai.Name;\n  }\n  return StringToBstr(typesStrings, types);\n}\nSTDMETHODIMP CArchiveFolderManager::CreateFolderFile(const wchar_t * type,\n    const wchar_t * filePath, IProgress progress)\n{\n  return E_NOTIMPL;\n}\n*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp",
    "content": "// FolderOut.cpp\n\n#include \"StdAfx.h\"\n#include \"Agent.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/ComTry.h\"\n#include \"Windows/FileDir.h\"\n\n// #include \"../Common/CompressEngineCommon.h\"\n#include \"../Common/ZipRegistry.h\"\n#include \"../Common/UpdateAction.h\"\n#include \"../Common/WorkDir.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NDirectory;\n\nstatic LPCWSTR kTempArcivePrefix = L\"7zA\";\n\nvoid CAgentFolder::GetPathParts(UStringVector &pathParts)\n{\n  _proxyFolderItem->GetPathParts(pathParts);\n}\n\nHRESULT CAgentFolder::CommonUpdateOperation(\n    bool deleteOperation,\n    bool createFolderOperation,\n    bool renameOperation,\n    const wchar_t *newItemName,\n    const NUpdateArchive::CActionSet *actionSet,\n    const UINT32 *indices, UINT32 numItems,\n    IFolderArchiveUpdateCallback *updateCallback100)\n{\n  NWorkDir::CInfo workDirInfo;\n  ReadWorkDirInfo(workDirInfo);\n  UString archiveFilePath  = _agentSpec->_archiveFilePath;\n  UString workDir = GetWorkDir(workDirInfo, archiveFilePath );\n  CreateComplexDirectory(workDir);\n\n  CTempFileW tempFile;\n  UString tempFileName;\n  if (tempFile.Create(workDir, kTempArcivePrefix, tempFileName) == 0)\n    return E_FAIL;\n\n  /*\n  if (SetOutProperties(anOutArchive, aCompressionInfo.Method) != S_OK)\n    return NFileOperationReturnCode::kError;\n  */\n  \n  ////////////////////////////\n  // Save FolderItem;\n\n  UStringVector pathParts;\n  GetPathParts(pathParts);\n\n  HRESULT result;\n  if (deleteOperation)\n    result = _agentSpec->DeleteItems(tempFileName,\n        indices, numItems, updateCallback100);\n  else if (createFolderOperation)\n  {\n    result = _agentSpec->CreateFolder(tempFileName,\n        newItemName, updateCallback100);\n  }\n  else if (renameOperation)\n  {\n    result = _agentSpec->RenameItem(\n        tempFileName,\n        indices, numItems,\n        newItemName,\n        updateCallback100);\n  }\n  else\n  {\n    Byte actionSetByte[NUpdateArchive::NPairState::kNumValues];\n    for (int i = 0; i < NUpdateArchive::NPairState::kNumValues; i++)\n      actionSetByte[i] = (Byte)actionSet->StateActions[i];\n    result = _agentSpec->DoOperation2(tempFileName, actionSetByte, NULL, updateCallback100);\n  }\n  \n  if (result != S_OK)\n    return result;\n\n  _agentSpec->Close();\n  \n  // m_FolderItem = NULL;\n  \n  if (!DeleteFileAlways(archiveFilePath ))\n    return GetLastError();\n\n  tempFile.DisableDeleting();\n  if (!MyMoveFile(tempFileName, archiveFilePath ))\n    return GetLastError();\n\n  {\n    CMyComPtr<IArchiveOpenCallback> openCallback;\n    if (updateCallback100)\n    {\n      RINOK(updateCallback100->QueryInterface(IID_IArchiveOpenCallback, (void **)&openCallback));\n    }\n    RINOK(_agentSpec->ReOpen(openCallback));\n  }\n   \n  ////////////////////////////\n  // Restore FolderItem;\n\n  CMyComPtr<IFolderFolder> archiveFolder;\n  RINOK(_agentSpec->BindToRootFolder(&archiveFolder));\n  for (int i = 0; i < pathParts.Size(); i++)\n  {\n    CMyComPtr<IFolderFolder> newFolder;\n    archiveFolder->BindToFolder(pathParts[i], &newFolder);\n    if(!newFolder)\n      break;\n    archiveFolder = newFolder;\n  }\n\n  CMyComPtr<IArchiveFolderInternal> archiveFolderInternal;\n  RINOK(archiveFolder.QueryInterface(IID_IArchiveFolderInternal, &archiveFolderInternal));\n  CAgentFolder *agentFolder;\n  RINOK(archiveFolderInternal->GetAgentFolder(&agentFolder));\n  _proxyFolderItem = agentFolder->_proxyFolderItem;\n  _proxyArchive = agentFolder->_proxyArchive;\n  _parentFolder = agentFolder->_parentFolder;\n\n  return S_OK;\n}\n\nSTDMETHODIMP CAgentFolder::CopyFrom(\n    const wchar_t *fromFolderPath, // test it\n    const wchar_t **itemsPaths,\n    UINT32 numItems,\n    IProgress *progress)\n{\n  COM_TRY_BEGIN\n  RINOK(_agentSpec->SetFiles(fromFolderPath, itemsPaths, numItems));\n  RINOK(_agentSpec->SetFolder(this));\n  CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;\n  if (progress != 0)\n  {\n    CMyComPtr<IProgress> progressWrapper = progress;\n    RINOK(progressWrapper.QueryInterface(\n      IID_IFolderArchiveUpdateCallback, &updateCallback100));\n  }\n  return CommonUpdateOperation(false, false, false, NULL,\n    &NUpdateArchive::kAddActionSet, 0, 0, updateCallback100);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::Delete(const UINT32 *indices, UINT32 numItems, IProgress *progress)\n{\n  COM_TRY_BEGIN\n  RINOK(_agentSpec->SetFolder(this));\n  CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;\n  if (progress != 0)\n  {\n    CMyComPtr<IProgress> progressWrapper = progress;\n    RINOK(progressWrapper.QueryInterface(\n        IID_IFolderArchiveUpdateCallback, &updateCallback100));\n  }\n  return CommonUpdateOperation(true, false, false, NULL,\n    &NUpdateArchive::kDeleteActionSet, indices, numItems, updateCallback100);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::CreateFolder(const wchar_t *name, IProgress *progress)\n{\n  COM_TRY_BEGIN\n  if (_proxyFolderItem->FindDirSubItemIndex(name) >= 0)\n    return ERROR_ALREADY_EXISTS;\n  RINOK(_agentSpec->SetFolder(this));\n  CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;\n  if (progress != 0)\n  {\n    CMyComPtr<IProgress> progressWrapper = progress;\n    RINOK(progressWrapper.QueryInterface(IID_IFolderArchiveUpdateCallback, &updateCallback100));\n  }\n  return CommonUpdateOperation(false, true, false, name, NULL, NULL, 0, updateCallback100);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::Rename(UINT32 index, const wchar_t *newName, IProgress *progress)\n{\n  COM_TRY_BEGIN\n  CUIntVector indices;\n  indices.Add(index);\n  RINOK(_agentSpec->SetFolder(this));\n  CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;\n  if (progress != 0)\n  {\n    CMyComPtr<IProgress> progressWrapper = progress;\n    RINOK(progressWrapper.QueryInterface(IID_IFolderArchiveUpdateCallback, &updateCallback100));\n  }\n  return CommonUpdateOperation(false, false, true, newName, NULL, &indices.Front(),\n      indices.Size(), updateCallback100);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CAgentFolder::CreateFile(const wchar_t * /* name */, IProgress * /* progress */)\n{\n  return E_NOTIMPL;\n}\n\nSTDMETHODIMP CAgentFolder::SetProperty(UINT32 /* index */, PROPID /* propID */,\n    const PROPVARIANT * /* value */, IProgress * /* progress */)\n{\n  return E_NOTIMPL;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/IFolderArchive.h",
    "content": "// IFolderArchive.h\n\n#ifndef __IFOLDER_ARCHIVE_H\n#define __IFOLDER_ARCHIVE_H\n\n#include \"../../Archive/IArchive.h\"\n// #include \"../Format/Common/ArchiveInterface.h\"\n#include \"../../UI/FileManager/IFolder.h\"\n#include \"../Common/IFileExtractCallback.h\"\n#include \"../Common/ExtractMode.h\"\n#include \"../../UI/Common/LoadCodecs.h\"\n\n#include \"../../IDecl.h\"\n\n#define FOLDER_ARCHIVE_INTERFACE_SUB(i, base,  x) DECL_INTERFACE_SUB(i, base, 0x01, x)\n#define FOLDER_ARCHIVE_INTERFACE(i, x) FOLDER_ARCHIVE_INTERFACE_SUB(i, IUnknown, x)\n\n#define INTERFACE_IArchiveFolder(x) \\\n  STDMETHOD(Extract)(const UInt32 *indices, UInt32 numItems, \\\n      NExtract::NPathMode::EEnum pathMode, \\\n      NExtract::NOverwriteMode::EEnum overwriteMode, \\\n      const wchar_t *path, Int32 testMode, \\\n      IFolderArchiveExtractCallback *extractCallback2) x; \\\n\nFOLDER_ARCHIVE_INTERFACE(IArchiveFolder, 0x05)\n{\n  INTERFACE_IArchiveFolder(PURE)\n};\n\n#define INTERFACE_IInFolderArchive(x) \\\n  STDMETHOD(Open)(const wchar_t *filePath, BSTR *archiveType, IArchiveOpenCallback *openArchiveCallback) x; \\\n  STDMETHOD(ReOpen)(IArchiveOpenCallback *openArchiveCallback) x; \\\n  STDMETHOD(Close)() x; \\\n  STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \\\n  STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \\\n  STDMETHOD(BindToRootFolder)(IFolderFolder **resultFolder) x; \\\n  STDMETHOD(Extract)(NExtract::NPathMode::EEnum pathMode, \\\n      NExtract::NOverwriteMode::EEnum overwriteMode, const wchar_t *path, \\\n      Int32 testMode, IFolderArchiveExtractCallback *extractCallback2) x; \\\n\nFOLDER_ARCHIVE_INTERFACE(IInFolderArchive, 0x06)\n{\n  INTERFACE_IInFolderArchive(PURE)\n};\n\n#define INTERFACE_IFolderArchiveUpdateCallback(x) \\\n  STDMETHOD(CompressOperation)(const wchar_t *name) x; \\\n  STDMETHOD(DeleteOperation)(const wchar_t *name) x; \\\n  STDMETHOD(OperationResult)(Int32 operationResult) x; \\\n  STDMETHOD(UpdateErrorMessage)(const wchar_t *message) x; \\\n  STDMETHOD(SetNumFiles)(UInt64 numFiles) x; \\\n\nFOLDER_ARCHIVE_INTERFACE_SUB(IFolderArchiveUpdateCallback, IProgress, 0x0B)\n{\n  INTERFACE_IFolderArchiveUpdateCallback(PURE)\n};\n\n#define INTERFACE_IOutFolderArchive(x) \\\n  STDMETHOD(SetFolder)(IFolderFolder *folder) x; \\\n  STDMETHOD(SetFiles)(const wchar_t *folderPrefix, const wchar_t **names, UInt32 numNames) x; \\\n  STDMETHOD(DeleteItems)(const wchar_t *newArchiveName, \\\n      const UInt32 *indices, UInt32 numItems, IFolderArchiveUpdateCallback *updateCallback) x; \\\n  STDMETHOD(DoOperation)(CCodecs *codecs, int index, \\\n      const wchar_t *newArchiveName, const Byte *stateActions, const wchar_t *sfxModule, \\\n      IFolderArchiveUpdateCallback *updateCallback) x; \\\n  STDMETHOD(DoOperation2)(const wchar_t *newArchiveName, const Byte *stateActions, \\\n      const wchar_t *sfxModule, IFolderArchiveUpdateCallback *updateCallback) x; \\\n\nFOLDER_ARCHIVE_INTERFACE(IOutFolderArchive, 0x0A)\n{\n  INTERFACE_IOutFolderArchive(PURE)\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/UpdateCallbackAgent.cpp",
    "content": "// UpdateCallbackAgent.h\n\n#include \"StdAfx.h\"\n\n#include \"Windows/Error.h\"\n#include \"Common/IntToString.h\"\n\n#include \"UpdateCallbackAgent.h\"\n\nusing namespace NWindows;\n\nvoid CUpdateCallbackAgent::SetCallback(IFolderArchiveUpdateCallback *callback)\n{\n  Callback = callback;\n  _compressProgress.Release();\n  if (Callback)\n    Callback.QueryInterface(IID_ICompressProgressInfo, &_compressProgress);\n}\n\nHRESULT CUpdateCallbackAgent::SetNumFiles(UInt64 numFiles)\n{\n  if (Callback)\n    return Callback->SetNumFiles(numFiles);\n  return S_OK;\n}\n\n\nHRESULT CUpdateCallbackAgent::SetTotal(UINT64 size)\n{\n  if (Callback)\n    return Callback->SetTotal(size);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackAgent::SetCompleted(const UINT64 *completeValue)\n{\n  if (Callback)\n    return Callback->SetCompleted(completeValue);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackAgent::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  if (_compressProgress)\n    return _compressProgress->SetRatioInfo(inSize, outSize);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackAgent::CheckBreak()\n{\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackAgent::Finilize()\n{\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackAgent::OpenFileError(const wchar_t *name, DWORD systemError)\n{\n  // if (systemError == ERROR_SHARING_VIOLATION)\n  {\n    if (Callback)\n    {\n      RINOK(Callback->UpdateErrorMessage(\n        UString(L\"WARNING: \") +\n        NError::MyFormatMessageW(systemError) +\n        UString(L\": \") +\n        UString(name)));\n      return S_FALSE;\n    }\n  }\n  // FailedFiles.Add(name);\n  return systemError;\n}\n\nHRESULT CUpdateCallbackAgent::GetStream(const wchar_t *name, bool /* isAnti */)\n{\n  if (Callback)\n    return Callback->CompressOperation(name);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackAgent::SetOperationResult(Int32 operationResult)\n{\n  if (Callback)\n    return Callback->OperationResult(operationResult);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackAgent::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)\n{\n  *passwordIsDefined = BoolToInt(false);\n  if (!_cryptoGetTextPassword)\n  {\n    if (!Callback)\n      return S_OK;\n    HRESULT result = Callback.QueryInterface(\n        IID_ICryptoGetTextPassword2, &_cryptoGetTextPassword);\n    if (result != S_OK)\n      return S_OK;\n  }\n  return _cryptoGetTextPassword->CryptoGetTextPassword2(passwordIsDefined, password);\n}\n\n/*\nHRESULT CUpdateCallbackAgent::ShowDeleteFile(const wchar_t *name)\n{\n  return Callback->DeleteOperation(name);\n}\n*/"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Agent/UpdateCallbackAgent.h",
    "content": "// UpdateCallbackAgent.h\n\n#ifndef __UPDATECALLBACKAGENT_H\n#define __UPDATECALLBACKAGENT_H\n\n#include \"../Common/UpdateCallback.h\"\n#include \"IFolderArchive.h\"\n\nclass CUpdateCallbackAgent: public IUpdateCallbackUI\n{\n  INTERFACE_IUpdateCallbackUI(;)\n  CMyComPtr<ICryptoGetTextPassword2> _cryptoGetTextPassword;\n  CMyComPtr<IFolderArchiveUpdateCallback> Callback;\n  CMyComPtr<ICompressProgressInfo> _compressProgress;\npublic:\n  void SetCallback(IFolderArchiveUpdateCallback *callback);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Client7z/Client7z.cpp",
    "content": "// Client7z.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/MyInitGuid.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/DLL.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n\n#include \"../../Common/FileStreams.h\"\n\n#include \"../../Archive/IArchive.h\"\n\n#include \"../../IPassword.h\"\n#include \"../../MyVersion.h\"\n\n// use another CLSIDs, if you want to support other formats (zip, rar, ...).\n// {23170F69-40C1-278A-1000-000110070000}\nDEFINE_GUID(CLSID_CFormat7z,\n  0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x07, 0x00, 0x00);\n\nusing namespace NWindows;\n\n#define kDllName \"7z.dll\"\n\nstatic const char *kCopyrightString = MY_7ZIP_VERSION\n\" (\"  kDllName \" client) \"\nMY_COPYRIGHT \" \" MY_DATE;\n\nstatic const char *kHelpString =\n\"Usage: Client7z.exe [a | l | x ] archive.7z [fileName ...]\\n\"\n\"Examples:\\n\"\n\"  Client7z.exe a archive.7z f1.txt f2.txt  : compress two files to archive.7z\\n\"\n\"  Client7z.exe l archive.7z   : List contents of archive.7z\\n\"\n\"  Client7z.exe x archive.7z   : eXtract files from archive.7z\\n\";\n\n\ntypedef UINT32 (WINAPI * CreateObjectFunc)(\n    const GUID *clsID,\n    const GUID *interfaceID,\n    void **outObject);\n\n#ifdef _WIN32\n#ifndef _UNICODE\nbool g_IsNT = false;\nstatic inline bool IsItWindowsNT()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo))\n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);\n}\n#endif\n#endif\n\nvoid PrintString(const UString &s)\n{\n  printf(\"%s\", (LPCSTR)GetOemString(s));\n}\n\nvoid PrintString(const AString &s)\n{\n  printf(\"%s\", (LPCSTR)s);\n}\n\nvoid PrintNewLine()\n{\n  PrintString(\"\\n\");\n}\n\nvoid PrintStringLn(const AString &s)\n{\n  PrintString(s);\n  PrintNewLine();\n}\n\nvoid PrintError(const AString &s)\n{\n  PrintNewLine();\n  PrintString(s);\n  PrintNewLine();\n}\n\nstatic HRESULT IsArchiveItemProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result)\n{\n  NCOM::CPropVariant prop;\n  RINOK(archive->GetProperty(index, propID, &prop));\n  if (prop.vt == VT_BOOL)\n    result = VARIANT_BOOLToBool(prop.boolVal);\n  else if (prop.vt == VT_EMPTY)\n    result = false;\n  else\n    return E_FAIL;\n  return S_OK;\n}\n\nstatic HRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result)\n{\n  return IsArchiveItemProp(archive, index, kpidIsDir, result);\n}\n\n\nstatic const wchar_t *kEmptyFileAlias = L\"[Content]\";\n\n\n//////////////////////////////////////////////////////////////\n// Archive Open callback class\n\n\nclass CArchiveOpenCallback:\n  public IArchiveOpenCallback,\n  public ICryptoGetTextPassword,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(ICryptoGetTextPassword)\n\n  STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes);\n  STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes);\n\n  STDMETHOD(CryptoGetTextPassword)(BSTR *password);\n\n  bool PasswordIsDefined;\n  UString Password;\n\n  CArchiveOpenCallback() : PasswordIsDefined(false) {}\n};\n\nSTDMETHODIMP CArchiveOpenCallback::SetTotal(const UInt64 * /* files */, const UInt64 * /* bytes */)\n{\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveOpenCallback::SetCompleted(const UInt64 * /* files */, const UInt64 * /* bytes */)\n{\n  return S_OK;\n}\n  \nSTDMETHODIMP CArchiveOpenCallback::CryptoGetTextPassword(BSTR *password)\n{\n  if (!PasswordIsDefined)\n  {\n    // You can ask real password here from user\n    // Password = GetPassword(OutStream);\n    // PasswordIsDefined = true;\n    PrintError(\"Password is not defined\");\n    return E_ABORT;\n  }\n  return StringToBstr(Password, password);\n}\n\n\n//////////////////////////////////////////////////////////////\n// Archive Extracting callback class\n\nstatic const wchar_t *kCantDeleteOutputFile = L\"ERROR: Can not delete output file \";\n\nstatic const char *kTestingString    =  \"Testing     \";\nstatic const char *kExtractingString =  \"Extracting  \";\nstatic const char *kSkippingString   =  \"Skipping    \";\n\nstatic const char *kUnsupportedMethod = \"Unsupported Method\";\nstatic const char *kCRCFailed = \"CRC Failed\";\nstatic const char *kDataError = \"Data Error\";\nstatic const char *kUnknownError = \"Unknown Error\";\n\nclass CArchiveExtractCallback:\n  public IArchiveExtractCallback,\n  public ICryptoGetTextPassword,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(ICryptoGetTextPassword)\n\n  // IProgress\n  STDMETHOD(SetTotal)(UInt64 size);\n  STDMETHOD(SetCompleted)(const UInt64 *completeValue);\n\n  // IArchiveExtractCallback\n  STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode);\n  STDMETHOD(PrepareOperation)(Int32 askExtractMode);\n  STDMETHOD(SetOperationResult)(Int32 resultEOperationResult);\n\n  // ICryptoGetTextPassword\n  STDMETHOD(CryptoGetTextPassword)(BSTR *aPassword);\n\nprivate:\n  CMyComPtr<IInArchive> _archiveHandler;\n  UString _directoryPath;  // Output directory\n  UString _filePath;       // name inside arcvhive\n  UString _diskFilePath;   // full path to file on disk\n  bool _extractMode;\n  struct CProcessedFileInfo\n  {\n    FILETIME MTime;\n    UInt32 Attrib;\n    bool isDir;\n    bool AttribDefined;\n    bool MTimeDefined;\n  } _processedFileInfo;\n\n  COutFileStream *_outFileStreamSpec;\n  CMyComPtr<ISequentialOutStream> _outFileStream;\n\npublic:\n  void Init(IInArchive *archiveHandler, const UString &directoryPath);\n\n  UInt64 NumErrors;\n  bool PasswordIsDefined;\n  UString Password;\n\n  CArchiveExtractCallback() : PasswordIsDefined(false) {}\n};\n\nvoid CArchiveExtractCallback::Init(IInArchive *archiveHandler, const UString &directoryPath)\n{\n  NumErrors = 0;\n  _archiveHandler = archiveHandler;\n  _directoryPath = directoryPath;\n  NFile::NName::NormalizeDirPathPrefix(_directoryPath);\n}\n\nSTDMETHODIMP CArchiveExtractCallback::SetTotal(UInt64 /* size */)\n{\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveExtractCallback::SetCompleted(const UInt64 * /* completeValue */)\n{\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index,\n    ISequentialOutStream **outStream, Int32 askExtractMode)\n{\n  *outStream = 0;\n  _outFileStream.Release();\n\n  {\n    // Get Name\n    NCOM::CPropVariant prop;\n    RINOK(_archiveHandler->GetProperty(index, kpidPath, &prop));\n    \n    UString fullPath;\n    if (prop.vt == VT_EMPTY)\n      fullPath = kEmptyFileAlias;\n    else\n    {\n      if (prop.vt != VT_BSTR)\n        return E_FAIL;\n      fullPath = prop.bstrVal;\n    }\n    _filePath = fullPath;\n  }\n\n  if (askExtractMode != NArchive::NExtract::NAskMode::kExtract)\n    return S_OK;\n\n  {\n    // Get Attrib\n    NCOM::CPropVariant prop;\n    RINOK(_archiveHandler->GetProperty(index, kpidAttrib, &prop));\n    if (prop.vt == VT_EMPTY)\n    {\n      _processedFileInfo.Attrib = 0;\n      _processedFileInfo.AttribDefined = false;\n    }\n    else\n    {\n      if (prop.vt != VT_UI4)\n        return E_FAIL;\n      _processedFileInfo.Attrib = prop.ulVal;\n      _processedFileInfo.AttribDefined = true;\n    }\n  }\n\n  RINOK(IsArchiveItemFolder(_archiveHandler, index, _processedFileInfo.isDir));\n\n  {\n    // Get Modified Time\n    NCOM::CPropVariant prop;\n    RINOK(_archiveHandler->GetProperty(index, kpidMTime, &prop));\n    _processedFileInfo.MTimeDefined = false;\n    switch(prop.vt)\n    {\n      case VT_EMPTY:\n        // _processedFileInfo.MTime = _utcMTimeDefault;\n        break;\n      case VT_FILETIME:\n        _processedFileInfo.MTime = prop.filetime;\n        _processedFileInfo.MTimeDefined = true;\n        break;\n      default:\n        return E_FAIL;\n    }\n\n  }\n  {\n    // Get Size\n    NCOM::CPropVariant prop;\n    RINOK(_archiveHandler->GetProperty(index, kpidSize, &prop));\n    bool newFileSizeDefined = (prop.vt != VT_EMPTY);\n    UInt64 newFileSize;\n    if (newFileSizeDefined)\n      newFileSize = ConvertPropVariantToUInt64(prop);\n  }\n\n  \n  {\n    // Create folders for file\n    int slashPos = _filePath.ReverseFind(WCHAR_PATH_SEPARATOR);\n    if (slashPos >= 0)\n      NFile::NDirectory::CreateComplexDirectory(_directoryPath + _filePath.Left(slashPos));\n  }\n\n  UString fullProcessedPath = _directoryPath + _filePath;\n  _diskFilePath = fullProcessedPath;\n\n  if (_processedFileInfo.isDir)\n  {\n    NFile::NDirectory::CreateComplexDirectory(fullProcessedPath);\n  }\n  else\n  {\n    NFile::NFind::CFileInfoW fi;\n    if (NFile::NFind::FindFile(fullProcessedPath, fi))\n    {\n      if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath))\n      {\n        PrintString(UString(kCantDeleteOutputFile) + fullProcessedPath);\n        return E_ABORT;\n      }\n    }\n    \n    _outFileStreamSpec = new COutFileStream;\n    CMyComPtr<ISequentialOutStream> outStreamLoc(_outFileStreamSpec);\n    if (!_outFileStreamSpec->Open(fullProcessedPath, CREATE_ALWAYS))\n    {\n      PrintString((UString)L\"can not open output file \" + fullProcessedPath);\n      return E_ABORT;\n    }\n    _outFileStream = outStreamLoc;\n    *outStream = outStreamLoc.Detach();\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode)\n{\n  _extractMode = false;\n  switch (askExtractMode)\n  {\n    case NArchive::NExtract::NAskMode::kExtract:  _extractMode = true; break;\n  };\n  switch (askExtractMode)\n  {\n    case NArchive::NExtract::NAskMode::kExtract:  PrintString(kExtractingString); break;\n    case NArchive::NExtract::NAskMode::kTest:  PrintString(kTestingString); break;\n    case NArchive::NExtract::NAskMode::kSkip:  PrintString(kSkippingString); break;\n  };\n  PrintString(_filePath);\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult)\n{\n  switch(operationResult)\n  {\n    case NArchive::NExtract::NOperationResult::kOK:\n      break;\n    default:\n    {\n      NumErrors++;\n      PrintString(\"     \");\n      switch(operationResult)\n      {\n        case NArchive::NExtract::NOperationResult::kUnSupportedMethod:\n          PrintString(kUnsupportedMethod);\n          break;\n        case NArchive::NExtract::NOperationResult::kCRCError:\n          PrintString(kCRCFailed);\n          break;\n        case NArchive::NExtract::NOperationResult::kDataError:\n          PrintString(kDataError);\n          break;\n        default:\n          PrintString(kUnknownError);\n      }\n    }\n  }\n\n  if (_outFileStream != NULL)\n  {\n    if (_processedFileInfo.MTimeDefined)\n      _outFileStreamSpec->SetMTime(&_processedFileInfo.MTime);\n    RINOK(_outFileStreamSpec->Close());\n  }\n  _outFileStream.Release();\n  if (_extractMode && _processedFileInfo.AttribDefined)\n    NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attrib);\n  PrintNewLine();\n  return S_OK;\n}\n\n\nSTDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password)\n{\n  if (!PasswordIsDefined)\n  {\n    // You can ask real password here from user\n    // Password = GetPassword(OutStream);\n    // PasswordIsDefined = true;\n    PrintError(\"Password is not defined\");\n    return E_ABORT;\n  }\n  return StringToBstr(Password, password);\n}\n\n\n\n//////////////////////////////////////////////////////////////\n// Archive Creating callback class\n\nstruct CDirItem\n{\n  UInt64 Size;\n  FILETIME CTime;\n  FILETIME ATime;\n  FILETIME MTime;\n  UString Name;\n  UString FullPath;\n  UInt32 Attrib;\n\n  bool isDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; }\n};\n\nclass CArchiveUpdateCallback:\n  public IArchiveUpdateCallback2,\n  public ICryptoGetTextPassword2,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP2(IArchiveUpdateCallback2, ICryptoGetTextPassword2)\n\n  // IProgress\n  STDMETHOD(SetTotal)(UInt64 size);\n  STDMETHOD(SetCompleted)(const UInt64 *completeValue);\n\n  // IUpdateCallback2\n  STDMETHOD(EnumProperties)(IEnumSTATPROPSTG **enumerator);\n  STDMETHOD(GetUpdateItemInfo)(UInt32 index,\n      Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive);\n  STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value);\n  STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream);\n  STDMETHOD(SetOperationResult)(Int32 operationResult);\n  STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size);\n  STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream);\n\n  STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password);\n\npublic:\n  CRecordVector<UInt64> VolumesSizes;\n  UString VolName;\n  UString VolExt;\n\n  UString DirPrefix;\n  const CObjectVector<CDirItem> *DirItems;\n\n  bool PasswordIsDefined;\n  UString Password;\n  bool AskPassword;\n\n  bool m_NeedBeClosed;\n\n  UStringVector FailedFiles;\n  CRecordVector<HRESULT> FailedCodes;\n\n  CArchiveUpdateCallback(): PasswordIsDefined(false), AskPassword(false), DirItems(0) {};\n\n  ~CArchiveUpdateCallback() { Finilize(); }\n  HRESULT Finilize();\n\n  void Init(const CObjectVector<CDirItem> *dirItems)\n  {\n    DirItems = dirItems;\n    m_NeedBeClosed = false;\n    FailedFiles.Clear();\n    FailedCodes.Clear();\n  }\n};\n\nSTDMETHODIMP CArchiveUpdateCallback::SetTotal(UInt64 /* size */)\n{\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::SetCompleted(const UInt64 * /* completeValue */)\n{\n  return S_OK;\n}\n\n\nSTDMETHODIMP CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG ** /* enumerator */)\n{\n  return E_NOTIMPL;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 /* index */,\n      Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive)\n{\n  if (newData != NULL)\n    *newData = BoolToInt(true);\n  if (newProperties != NULL)\n    *newProperties = BoolToInt(true);\n  if (indexInArchive != NULL)\n    *indexInArchive = (UInt32)-1;\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  \n  if (propID == kpidIsAnti)\n  {\n    prop = false;\n    prop.Detach(value);\n    return S_OK;\n  }\n\n  {\n    const CDirItem &dirItem = (*DirItems)[index];\n    switch(propID)\n    {\n      case kpidPath:  prop = dirItem.Name; break;\n      case kpidIsDir:  prop = dirItem.isDir(); break;\n      case kpidSize:  prop = dirItem.Size; break;\n      case kpidAttrib:  prop = dirItem.Attrib; break;\n      case kpidCTime:  prop = dirItem.CTime; break;\n      case kpidATime:  prop = dirItem.ATime; break;\n      case kpidMTime:  prop = dirItem.MTime; break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nHRESULT CArchiveUpdateCallback::Finilize()\n{\n  if (m_NeedBeClosed)\n  {\n    PrintNewLine();\n    m_NeedBeClosed = false;\n  }\n  return S_OK;\n}\n\nstatic void GetStream2(const wchar_t *name)\n{\n  PrintString(\"Compressing  \");\n  if (name[0] == 0)\n    name = kEmptyFileAlias;\n  PrintString(name);\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream)\n{\n  RINOK(Finilize());\n\n  const CDirItem &dirItem = (*DirItems)[index];\n  GetStream2(dirItem.Name);\n \n  if (dirItem.isDir())\n    return S_OK;\n\n  {\n    CInFileStream *inStreamSpec = new CInFileStream;\n    CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);\n    UString path = DirPrefix + dirItem.FullPath;\n    if (!inStreamSpec->Open(path))\n    {\n      DWORD sysError = ::GetLastError();\n      FailedCodes.Add(sysError);\n      FailedFiles.Add(path);\n      // if (systemError == ERROR_SHARING_VIOLATION)\n      {\n        PrintNewLine();\n        PrintError(\"WARNING: can't open file\");\n        // PrintString(NError::MyFormatMessageW(systemError));\n        return S_FALSE;\n      }\n      // return sysError;\n    }\n    *inStream = inStreamLoc.Detach();\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::SetOperationResult(Int32 /* operationResult */)\n{\n  m_NeedBeClosed = true;\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size)\n{\n  if (VolumesSizes.Size() == 0)\n    return S_FALSE;\n  if (index >= (UInt32)VolumesSizes.Size())\n    index = VolumesSizes.Size() - 1;\n  *size = VolumesSizes[index];\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream)\n{\n  wchar_t temp[32];\n  ConvertUInt64ToString(index + 1, temp);\n  UString res = temp;\n  while (res.Length() < 2)\n    res = UString(L'0') + res;\n  UString fileName = VolName;\n  fileName += L'.';\n  fileName += res;\n  fileName += VolExt;\n  COutFileStream *streamSpec = new COutFileStream;\n  CMyComPtr<ISequentialOutStream> streamLoc(streamSpec);\n  if (!streamSpec->Create(fileName, false))\n    return ::GetLastError();\n  *volumeStream = streamLoc.Detach();\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)\n{\n  if (!PasswordIsDefined)\n  {\n    if (AskPassword)\n    {\n      // You can ask real password here from user\n      // Password = GetPassword(OutStream);\n      // PasswordIsDefined = true;\n      PrintError(\"Password is not defined\");\n      return E_ABORT;\n    }\n  }\n  *passwordIsDefined = BoolToInt(PasswordIsDefined);\n  return StringToBstr(Password, password);\n}\n\n\n\n//////////////////////////////////////////////////////////////////////////\n// Main function\n\nint MY_CDECL main(int argc, char* argv[])\n{\n  #ifdef _WIN32\n  #ifndef _UNICODE\n  g_IsNT = IsItWindowsNT();\n  #endif\n  #endif\n\n  PrintStringLn(kCopyrightString);\n\n  if (argc < 3)\n  {\n    PrintStringLn(kHelpString);\n    return 1;\n  }\n  NWindows::NDLL::CLibrary library;\n  if (!library.Load(TEXT(kDllName)))\n  {\n    PrintError(\"Can not load library\");\n    return 1;\n  }\n  CreateObjectFunc createObjectFunc = (CreateObjectFunc)library.GetProcAddress(\"CreateObject\");\n  if (createObjectFunc == 0)\n  {\n    PrintError(\"Can not get CreateObject\");\n    return 1;\n  }\n\n  AString command = argv[1];\n  command.MakeLower();\n  UString archiveName = GetUnicodeString(argv[2], CP_OEMCP);\n  if (command.Compare(\"a\") == 0)\n  {\n    // create archive command\n    if (argc < 4)\n    {\n      PrintStringLn(kHelpString);\n      return 1;\n    }\n    CObjectVector<CDirItem> dirItems;\n    int i;\n    for (i = 3; i < argc; i++)\n    {\n      CDirItem di;\n      UString name = GetUnicodeString(argv[i], CP_OEMCP);\n      \n      NFile::NFind::CFileInfoW fi;\n      if (!NFile::NFind::FindFile(name, fi))\n      {\n        PrintString(UString(L\"Can't find file\") + name);\n        return 1;\n      }\n\n      di.Attrib = fi.Attrib;\n      di.Size = fi.Size;\n      di.CTime = fi.CTime;\n      di.ATime = fi.ATime;\n      di.MTime = fi.MTime;\n      di.Name = name;\n      di.FullPath = name;\n      dirItems.Add(di);\n    }\n    COutFileStream *outFileStreamSpec = new COutFileStream;\n    CMyComPtr<IOutStream> outFileStream = outFileStreamSpec;\n    if (!outFileStreamSpec->Create(archiveName, false))\n    {\n      PrintError(\"can't create archive file\");\n      return 1;\n    }\n\n    CMyComPtr<IOutArchive> outArchive;\n    if (createObjectFunc(&CLSID_CFormat7z, &IID_IOutArchive, (void **)&outArchive) != S_OK)\n    {\n      PrintError(\"Can not get class object\");\n      return 1;\n    }\n\n    CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback;\n    CMyComPtr<IArchiveUpdateCallback2> updateCallback(updateCallbackSpec);\n    updateCallbackSpec->Init(&dirItems);\n    // updateCallbackSpec->PasswordIsDefined = true;\n    // updateCallbackSpec->Password = L\"1\";\n\n    HRESULT result = outArchive->UpdateItems(outFileStream, dirItems.Size(), updateCallback);\n    updateCallbackSpec->Finilize();\n    if (result != S_OK)\n    {\n      PrintError(\"Update Error\");\n      return 1;\n    }\n    for (i = 0; i < updateCallbackSpec->FailedFiles.Size(); i++)\n    {\n      PrintNewLine();\n      PrintString((UString)L\"Error for file: \" + updateCallbackSpec->FailedFiles[i]);\n    }\n    if (updateCallbackSpec->FailedFiles.Size() != 0)\n      return 1;\n  }\n  else\n  {\n    if (argc != 3)\n    {\n      PrintStringLn(kHelpString);\n      return 1;\n    }\n\n    bool listCommand;\n    if (command.Compare(\"l\") == 0)\n      listCommand = true;\n    else if (command.Compare(\"x\") == 0)\n      listCommand = false;\n    else\n    {\n      PrintError(\"incorrect command\");\n      return 1;\n    }\n  \n    CMyComPtr<IInArchive> archive;\n    if (createObjectFunc(&CLSID_CFormat7z, &IID_IInArchive, (void **)&archive) != S_OK)\n    {\n      PrintError(\"Can not get class object\");\n      return 1;\n    }\n    \n    CInFileStream *fileSpec = new CInFileStream;\n    CMyComPtr<IInStream> file = fileSpec;\n    \n    if (!fileSpec->Open(archiveName))\n    {\n      PrintError(\"Can not open archive file\");\n      return 1;\n    }\n\n    {\n      CArchiveOpenCallback *openCallbackSpec = new CArchiveOpenCallback;\n      CMyComPtr<IArchiveOpenCallback> openCallback(openCallbackSpec);\n      openCallbackSpec->PasswordIsDefined = false;\n      // openCallbackSpec->PasswordIsDefined = true;\n      // openCallbackSpec->Password = L\"1\";\n      \n      if (archive->Open(file, 0, openCallback) != S_OK)\n      {\n        PrintError(\"Can not open archive\");\n        return 1;\n      }\n    }\n    \n    if (listCommand)\n    {\n      // List command\n      UInt32 numItems = 0;\n      archive->GetNumberOfItems(&numItems);\n      for (UInt32 i = 0; i < numItems; i++)\n      {\n        {\n          // Get uncompressed size of file\n          NWindows::NCOM::CPropVariant prop;\n          archive->GetProperty(i, kpidSize, &prop);\n          UString s = ConvertPropVariantToString(prop);\n          PrintString(s);\n          PrintString(\"  \");\n        }\n        {\n          // Get name of file\n          NWindows::NCOM::CPropVariant prop;\n          archive->GetProperty(i, kpidPath, &prop);\n          UString s = ConvertPropVariantToString(prop);\n          PrintString(s);\n        }\n        PrintString(\"\\n\");\n      }\n    }\n    else\n    {\n      // Extract command\n      CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;\n      CMyComPtr<IArchiveExtractCallback> extractCallback(extractCallbackSpec);\n      extractCallbackSpec->Init(archive, L\"\"); // second parameter is output folder path\n      extractCallbackSpec->PasswordIsDefined = false;\n      // extractCallbackSpec->PasswordIsDefined = true;\n      // extractCallbackSpec->Password = L\"1\";\n      HRESULT result = archive->Extract(NULL, (UInt32)(Int32)(-1), false, extractCallback);\n      if (result != S_OK)\n      {\n        PrintError(\"Extract Error\");\n        return 1;\n      }\n    }\n  }\n  return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Client7z/makefile",
    "content": "PROG=../../../../bin/Client7z\n\nLOCAL_FLAGS=-DCOMPRESS_MT\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLIBS=$(LOCAL_LIBS_DLL)\n\nOBJS = \\\nwine_date_and_time.o \\\nMyWindows.o \\\nDLL.o \\\nFileDir.o \\\nFileFind.o \\\nFileIO.o \\\nFileName.o \\\nPropVariant.o \\\nPropVariantConversions.o \\\nIntToString.o \\\nMyString.o \\\nStringConvert.o \\\nMyVector.o \\\nWildcard.o \\\nFileStreams.o \\\nClient7z.o\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Client7z/makefile.depend",
    "content": "wine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nDLL.o: ../../../Windows/DLL.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../myWindows/myPrivate.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileName.o: ../../../Windows/FileName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantConversions.o: ../../../Windows/PropVariantConversions.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h\nIntToString.o: ../../../Common/IntToString.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nFileStreams.o: ../../Common/FileStreams.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FileStreams.h ../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h\nClient7z.o: Client7z.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/IntToString.h ../../../Common/MyInitGuid.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/FileName.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../Common/FileStreams.h \\\n  ../../Common/../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \\\n  ../../Archive/IArchive.h ../../Archive/../IStream.h \\\n  ../../Archive/../IProgress.h ../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/../../Common/Types.h ../../Archive/../IDecl.h \\\n  ../../Archive/../PropID.h ../../IPassword.h ../../../Common/MyUnknown.h \\\n  ../../../Common/Types.h ../../IDecl.h ../../MyVersion.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Client7z/makefile.list",
    "content": "SRCS=\\\n../../../myWindows/wine_date_and_time.cpp \\\n../../../Windows/DLL.cpp \\\n../../../Windows/FileDir.cpp \\\n../../../Windows/FileFind.cpp \\\n../../../Windows/FileIO.cpp \\\n../../../Windows/FileName.cpp \\\n../../../Windows/PropVariant.cpp \\\n../../../Windows/PropVariantConversions.cpp \\\n../../../Common/IntToString.cpp \\\n../../../Common/MyWindows.cpp \\\n../../../Common/MyString.cpp \\\n../../../Common/StringConvert.cpp \\\n../../../Common/MyVector.cpp \\\n../../../Common/Wildcard.cpp \\\n../../Common/FileStreams.cpp \\\n./Client7z.cpp\n\nwine_date_and_time.o : ../../../myWindows/wine_date_and_time.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/wine_date_and_time.cpp\nIntToString.o : ../../../Common/IntToString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/IntToString.cpp\nMyWindows.o : ../../../Common/MyWindows.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyWindows.cpp\nMyString.o : ../../../Common/MyString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyString.cpp\nStringConvert.o : ../../../Common/StringConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringConvert.cpp\nMyVector.o : ../../../Common/MyVector.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyVector.cpp\nWildcard.o : ../../../Common/Wildcard.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/Wildcard.cpp\nDLL.o : ../../../Windows/DLL.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/DLL.cpp\nFileDir.o : ../../../Windows/FileDir.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileDir.cpp\nFileFind.o : ../../../Windows/FileFind.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileFind.cpp\nFileIO.o : ../../../Windows/FileIO.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileIO.cpp\nFileName.o : ../../../Windows/FileName.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileName.cpp\nPropVariant.o : ../../../Windows/PropVariant.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/PropVariant.cpp\nPropVariantConversions.o : ../../../Windows/PropVariantConversions.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/PropVariantConversions.cpp\nFileStreams.o : ../../Common/FileStreams.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/FileStreams.cpp\nClient7z.o : ./Client7z.cpp\n\t$(CXX) $(CXXFLAGS) ./Client7z.cpp\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/ClientCodec/ClientCodec.cpp",
    "content": "// Client7z.cpp\n\n#include \"StdAfx.h\"\n\n#ifdef _WIN32\n#include <initguid.h>\n#else\n#include \"Common/MyInitGuid.h\"\n#endif\n\n#include \"Windows/DLL.h\"\n#include \"../../ICoder.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Common/MyCom.h\"\n\nusing namespace NWindows;\n\nclass CFileIn : public ISequentialInStream, public CMyUnknownImp\n{\n  FILE *file_;\n  size_t pos_;\n  public:\n     MY_UNKNOWN_IMP\n\n     CFileIn() : file_(0) , pos_(0) { }\n     ~CFileIn() { this->close(); }\n\n     HRESULT open(const char *name)\n     {\n       file_ = fopen(name,\"rb\");\n       if (file_) return S_OK;\n       return E_FAIL;\n     }\n     void close()\n     {\n        if (file_) fclose(file_);\n        file_ = 0;\n        pos_ = 0;\n     }\n     HRESULT Read(void *data, UInt32 size, UInt32 *processedSize)\n     {\n       if (file_)\n       {\n          size_t ret = fread (data, 1, size, file_);\n          *processedSize = ret;\n          pos_ += ret;\n          // TBD : if ret == 0, test for feof/ferror\n          return S_OK;\n       }\n       return E_FAIL;\n     }\n     size_t pos() { return pos_; }\n};\n\nclass CFileOut : public ISequentialOutStream, public CMyUnknownImp\n{\n  FILE *file_;\n  size_t pos_;\n  public:\n     MY_UNKNOWN_IMP\n\n     CFileOut() : file_(0) { }\n     ~CFileOut() { this->close(); }\n\n     HRESULT open(const char *name)\n     {\n       file_ = fopen(name,\"wb\");\n       if (file_) return S_OK;\n       return E_FAIL;\n     }\n     void close()\n     {\n        if (file_) fclose(file_);\n        file_ = 0;\n     }\n     HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize)\n     {\n       if (file_)\n       {\n          size_t ret = fwrite(data, 1, size, file_);\n          *processedSize = ret;\n          pos_ += ret;\n          // TBD : if ret == 0, test for feof/ferror\n          return S_OK;\n       }\n       return E_FAIL;\n     }\n     size_t pos() { return pos_; }\n};\n\n//////////////////////////////////////////////////////////////////////////\n// Main function\n\nstatic const char *kHelpString = \n\"Usage: ClientCodec codec.so [c | d | i] [file_in file_out]\\n\"\n\"Examples:\\n\"\n\"  ClientCodec LZMA.so i                  : info about the codec\\n\"\n\"  ClientCodec LZMA.so e file_in file_out : encodes file_in to file_out\\n\"\n\"  ClientCodec LZMA.so d file_in file_out : decodes file_in to file_out\\n\"\n;\n\ntypedef UINT32 (WINAPI * CreateObjectFunc)(\n    const GUID *clsID, \n    const GUID *interfaceID, \n    void **outObject);\n\ntypedef UINT32 (WINAPI * GetNumberOfMethodsFunc)(UINT32 *numMethods);\n\ntypedef UINT32 (WINAPI * GetMethodPropertyFunc)(UINT32 index, PROPID propID, PROPVARIANT *value);\n\nint main(int argc, char* argv[])\n{\n  if ((argc != 3) && (argc != 5))\n  {\n    printf(kHelpString);\n    return 1;\n  }\n\n  if ((argc == 3) && (strcmp(argv[2],\"i\") != 0))\n  {\n    printf(kHelpString);\n    return 1;\n  }\n\n  NWindows::NDLL::CLibrary library;\n  if (!library.Load(argv[1]))\n  {\n    printf(\"Can not load library %s\\n\",argv[1]);\n    return 1;\n  }\n  CreateObjectFunc createObjectFunc = (CreateObjectFunc)library.GetProcAddress(\"CreateObject\");\n  if (createObjectFunc == 0)\n  {\n    printf(\"Can not get CreateObject\\n\");\n    return 1;\n  }\n\n    GetNumberOfMethodsFunc getNumberOfMethodsFunc = (GetNumberOfMethodsFunc)library.GetProcAddress(\"GetNumberOfMethods\");\n    if (getNumberOfMethodsFunc == 0)\n    {\n      printf(\"Can not get GetNumberOfMethodsFunc\\n\");\n      return 1;\n    }\n\n    UINT32 numMethods = 0;\n    HRESULT res = getNumberOfMethodsFunc(&numMethods);\n    if (res != S_OK)\n    {\n      printf(\"Error in GetNumberOfMethods\\n\");\n      return 1;\n    }\n\n    GetMethodPropertyFunc getMethodPropertyFunc = (GetMethodPropertyFunc)library.GetProcAddress(\"GetMethodProperty\");\n    if (getMethodPropertyFunc == 0)\n    {\n      printf(\"Can not get GetMethodProperty\\n\");\n      return 1;\n    }\n\n  if (argv[2][0] == 'i')\n  {\n    printf(\"%s has %d method(s)\\n\",argv[1],(int)numMethods);\n\n    for(UINT32 m = 0; m < numMethods ; m++)\n    {\n      printf(\"\\tMethod %d :\\n\",(int)m);\n      NCOM::CPropVariant propVariant;\n      res = getMethodPropertyFunc(m,NMethodPropID::kName,&propVariant);\n      if (res == S_OK)\n      {\n        if (propVariant.vt == VT_BSTR)\n        {\n          printf(\"\\t\\tName : %ls\\n\",propVariant.bstrVal); // Unicode Name\n        } else {\n          printf(\"\\t\\tName : Error\\n\");\n        }\n      } else {\n        printf(\"\\t\\tName : Unknown\\n\");\n      }\n      res = getMethodPropertyFunc(m,NMethodPropID::kDecoder,&propVariant);\n      if ((res == S_OK) && (propVariant.vt == VT_BSTR)) printf(\"\\t\\tDecoder : YES\\n\");\n      else                                              printf(\"\\t\\tDecoder : NO\\n\");\n\n      res = getMethodPropertyFunc(m,NMethodPropID::kEncoder,&propVariant);\n      if ((res == S_OK) && (propVariant.vt == VT_BSTR)) printf(\"\\t\\tEncoder : YES\\n\");\n      else                                              printf(\"\\t\\tEncoder : NO\\n\");\n    }\n  }\n\n  int numMethod = 0; // TBD\n\n  if (argv[2][0] == 'e')\n  {\n    NCOM::CPropVariant propVariant;\n    res = getMethodPropertyFunc(numMethod,NMethodPropID::kEncoder,&propVariant);\n    if ((res == S_OK) && (propVariant.vt == VT_BSTR))\n    {\n       CMyComPtr<ICompressCoder> outCoder;\n       if (createObjectFunc((const GUID *)propVariant.bstrVal, &IID_ICompressCoder, (void **)&outCoder) != S_OK)\n       {\n         printf(\"Can not get class object\\n\");\n         return 1;\n       }\n       printf(\"Encoding : ...\\n\");\n\n       CMyComPtr<CFileIn> inStream = new CFileIn;\n       res = inStream->open(argv[3]);\n       if (res != S_OK)\n       {\n         printf(\"cannot open %s\\n\",argv[3]);\n         return 1;\n       }\n\n       CMyComPtr<CFileOut> outStream = new CFileOut;\n       res = outStream->open(argv[4]);\n       if (res != S_OK)\n       {\n         printf(\"cannot open %s\\n\",argv[4]);\n         return 1;\n       }\n{\n       CMyComPtr<ICompressSetCoderProperties> setCoderProperties;\n       outCoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);\n       if (setCoderProperties != NULL)\n       {\n          printf(\"IID_ICompressSetCoderProperties : Found\\n\");\n          PROPID propID = NCoderPropID::kEndMarker;\n          NWindows::NCOM::CPropVariant value = true;          \n          res = setCoderProperties->SetCoderProperties(&propID, &value, 1);\n          if (res = S_OK) printf(\"kEndMarker : ON\\n\");\n          else            printf(\"kEndMarker : KO KO\\n\");\n       }\n       else\n       {\n          printf(\"IID_ICompressSetCoderProperties : NOT Found\\n\");\n       }\n}\n\n{\n    CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;\n    \n    outCoder.QueryInterface(IID_ICompressWriteCoderProperties, &writeCoderProperties);\n    \n    if (writeCoderProperties != NULL)\n    {\n\tUINT32 len = 5; // TBD\n        UInt32 processedSize;\n        outStream->Write(&len, sizeof(len), &processedSize);\n        \n\tprintf(\"IID_ICompressWriteCoderProperties : Found\\n\");\n        size_t pos1 = outStream->pos();\n        writeCoderProperties->WriteCoderProperties(outStream);\n        size_t pos2 = outStream->pos();\n        printf(\"SizeOfProp : %d\\n\",(int)(pos2-pos1));\n/*\n      CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp;\n      CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);\n      outStreamSpec->Init();\n      writeCoderProperties->WriteCoderProperties(outStream);\n      \n      size_t size = outStreamSpec->GetSize();\n      \n      // encodingInfo.Properties.SetCapacity(size);\n      if (encodingInfo.AltCoders.Size() == 0)\n        encodingInfo.AltCoders.Add(CAltCoderInfo());\n      CAltCoderInfo &altCoderInfo = encodingInfo.AltCoders.Front();\n      altCoderInfo.Properties.SetCapacity(size);\n      \n      memmove(altCoderInfo.Properties, outStreamSpec->GetBuffer(), size);\n*/\n    }\n    else\n    {\n\tprintf(\"IID_ICompressWriteCoderProperties : NOT Found\\n\");\n\tUINT32 len = 0;\n        UInt32 processedSize;\n        outStream->Write(&len, sizeof(len), &processedSize);\n    }\n}\n\n       res = outCoder->Code(inStream,outStream,0,0,0);\n       inStream->close();\n       outStream->close();\n\n       if (res == S_OK)\n       {\n         printf(\"Encoding : Done\\n\");\n       } else {\n         printf(\"Encoding : Error\\n\");\n         return 1;\n       }\n    }\n    else\n    {\n\tprintf(\"Encoder not available\\n\");\n        return 1;\n    }\n  }\n\n  if (argv[2][0] == 'd')\n  {\n    NCOM::CPropVariant propVariant;\n    res = getMethodPropertyFunc(numMethod,NMethodPropID::kDecoder,&propVariant);\n    if ((res == S_OK) && (propVariant.vt == VT_BSTR))\n    {\n       CMyComPtr<ICompressCoder> outCoder;\n       if (createObjectFunc((const GUID *)propVariant.bstrVal, &IID_ICompressCoder, (void **)&outCoder) != S_OK)\n       {\n         printf(\"Can not get class object\\n\");\n         return 1;\n       }\n       printf(\"Decoding : ...\\n\");\n\n       CMyComPtr<CFileIn> inStream = new CFileIn;\n       res = inStream->open(argv[3]);\n       if (res != S_OK)\n       {\n         printf(\"cannot open %s\\n\",argv[3]);\n         return 1;\n       }\n\n       CMyComPtr<CFileOut> outStream = new CFileOut;\n       res = outStream->open(argv[4]);\n       if (res != S_OK)\n       {\n         printf(\"cannot open %s\\n\",argv[4]);\n         return 1;\n       }\n{\n\tUINT32 len = 0;\n        UInt32 processedSize;\n        inStream->Read(&len, sizeof(len), &processedSize);\n\n        if (len > 0)\n        {\n           Byte props[256]; // TBD\n           inStream->Read(props, len, &processedSize);\n\n           CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;\n           outCoder->QueryInterface(IID_ICompressSetDecoderProperties2, (void **)&setDecoderProperties);\n           if (setDecoderProperties)\n           {\n             setDecoderProperties->SetDecoderProperties2(props, len);\n\t     printf(\"IID_ICompressSetDecoderProperties2 : Found (%d)\\n\",(int)len);\n           }\n        }\n}\n\n       // FIXME UInt64 outSize = 10511; // res = outCoder->Code(inStream,outStream,0,&outSize,0);\n       res = outCoder->Code(inStream,outStream,0,0,0);\n       inStream->close();\n       outStream->close();\n\n       if (res == S_OK)\n       {\n         printf(\"Decoding : Done\\n\");\n       } else {\n         printf(\"Decoding : Error\\n\");\n         return 1;\n       }\n    }\n    else\n    {\n\tprintf(\"Decoder not available\\n\");\n        return 1;\n    }\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/ClientCodec/makefile",
    "content": "PROG=../../../../bin/ClientCodec\n\nLOCAL_FLAGS=-DCOMPRESS_MT\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLIBS=$(LOCAL_LIBS_DLL)\n\nOBJS = \\\nwine_date_and_time.o \\\nMyWindows.o \\\nClientCodec.o \\\nMyString.o \\\nStringConvert.o \\\nPropVariant.o \\\nDLL.o \n\n\n\n.PHONY: test\n\n#CODER=../../../bin/Codecs/BZip2.so # OK - ICompressWriteCoderProperties : NOT Found\n#CODER=../../../bin/Codecs/Copy.so # OK - ICompressWriteCoderProperties : NOT Found\n#CODER=../../../bin/Codecs/Deflate.so # OK - ICompressWriteCoderProperties : NOT Found\nCODER=../../../bin/Codecs/LZMA.so # OK - ICompressWriteCoderProperties=5\n#CODER=../../../bin/Codecs/PPMD.so # KO Encoder - ICompressWriteCoderProperties=5\n\n\ntest : all\n\tcp ClientCodec.cpp f1\n\t../../../../bin/ClientCodec $(CODER) i\n\t../../../../bin/ClientCodec $(CODER) e f1 f2\n\t../../../../bin/ClientCodec $(CODER) d f2 f3\n\tdiff -q f1 f3\n\nclean2:\n\trm -f f1 f2 f3\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/ClientCodec/makefile.depend",
    "content": "wine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../include_windows/basetyps.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/MyWindows.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../myWindows/myPrivate.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/UTFConvert.cpp \\\n  ../../../Common/UTFConvert.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nDLL.o: ../../../Windows/DLL.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nClientCodec.o: ClientCodec.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/MyInitGuid.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../ICoder.h ../../IStream.h ../../../Common/MyUnknown.h \\\n  ../../../Common/MyWindows.h ../../../Common/Types.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/ClientCodec/makefile.list",
    "content": "SRCS=\\\n../../../myWindows/wine_date_and_time.cpp \\\n../../../Common/MyWindows.cpp \\\n../../../Common/MyString.cpp \\\n../../../Common/StringConvert.cpp \\\n../../../Windows/PropVariant.cpp \\\n../../../Windows/DLL.cpp \\\n./ClientCodec.cpp\n\nwine_date_and_time.o : ../../../myWindows/wine_date_and_time.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/wine_date_and_time.cpp\nMyWindows.o : ../../../Common/MyWindows.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyWindows.cpp\nMyString.o : ../../../Common/MyString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyString.cpp\nStringConvert.o : ../../../Common/StringConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringConvert.cpp\nPropVariant.o : ../../../Windows/PropVariant.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/PropVariant.cpp\nDLL.o : ../../../Windows/DLL.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/DLL.cpp\nClientCodec.o : ./ClientCodec.cpp\n\t$(CXX) $(CXXFLAGS) ./ClientCodec.cpp\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveCommandLine.cpp",
    "content": "// ArchiveCommandLine.cpp\n\n#include \"StdAfx.h\"\n\n#ifdef _WIN32\n#include <io.h>\n#endif\n#include <stdio.h>\n\n#include \"Common/ListFileUtils.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/StringToInt.h\"\n\n#include \"Windows/FileName.h\"\n#include \"Windows/FileDir.h\"\n#ifdef _WIN32\n#include \"Windows/FileMapping.h\"\n#include \"Windows/Synchronization.h\"\n#endif\n\n#include \"ArchiveCommandLine.h\"\n#include \"UpdateAction.h\"\n#include \"Update.h\"\n#include \"SortUtils.h\"\n#include \"EnumDirItems.h\"\n\n#include \"myPrivate.h\"\n\nextern bool g_CaseSensitive;\n\n#if _MSC_VER >= 1400\n#define MY_isatty_fileno(x) _isatty(_fileno(x))\n#else\n#define MY_isatty_fileno(x) isatty(fileno(x))\n#endif\n\n#define MY_IS_TERMINAL(x) (MY_isatty_fileno(x) != 0);\n\nusing namespace NCommandLineParser;\nusing namespace NWindows;\nusing namespace NFile;\n\nnamespace NKey {\nenum Enum\n{\n  kHelp1 = 0,\n  kHelp2,\n  kHelp3,\n  kDisableHeaders,\n  kDisablePercents,\n  kArchiveType,\n  kYes,\n  #ifndef _NO_CRYPTO\n  kPassword,\n  #endif\n  kProperty,\n  kOutputDir,\n  kWorkingDir,\n  kInclude,\n  kExclude,\n  kArInclude,\n  kArExclude,\n  kNoArName,\n  kUpdate,\n  kVolume,\n  kRecursed,\n  kSfx,\n  kStdIn,\n  kStdOut,\n  kOverwrite,\n  kEmail,\n  kShowDialog,\n  kUseLStat,\n  kTechMode,\n  kCaseSensitive\n};\n\n}\n\n\nstatic const wchar_t kRecursedIDChar = 'R';\nstatic const wchar_t *kRecursedPostCharSet = L\"0-\";\n\nnamespace NRecursedPostCharIndex {\n  enum EEnum\n  {\n    kWildCardRecursionOnly = 0,\n    kNoRecursion = 1\n  };\n}\n\nstatic const char kImmediateNameID = '!';\nstatic const char kMapNameID = '#';\nstatic const char kFileListID = '@';\n\nstatic const char kSomeCludePostStringMinSize = 2; // at least <@|!><N>ame must be\nstatic const char kSomeCludeAfterRecursedPostStringMinSize = 2; // at least <@|!><N>ame must be\n\nstatic const wchar_t *kOverwritePostCharSet = L\"asut\";\n\nNExtract::NOverwriteMode::EEnum k_OverwriteModes[] =\n{\n  NExtract::NOverwriteMode::kWithoutPrompt,\n  NExtract::NOverwriteMode::kSkipExisting,\n  NExtract::NOverwriteMode::kAutoRename,\n  NExtract::NOverwriteMode::kAutoRenameExisting\n};\n\nstatic const CSwitchForm kSwitchForms[] =\n  {\n    { L\"?\",  NSwitchType::kSimple, false },\n    { L\"H\",  NSwitchType::kSimple, false },\n    { L\"-HELP\",  NSwitchType::kSimple, false },\n    { L\"BA\", NSwitchType::kSimple, false },\n    { L\"BD\", NSwitchType::kSimple, false },\n    { L\"T\",  NSwitchType::kUnLimitedPostString, false, 1 },\n    { L\"Y\",  NSwitchType::kSimple, false },\n    #ifndef _NO_CRYPTO\n    { L\"P\",  NSwitchType::kUnLimitedPostString, false, 0 },\n    #endif\n    { L\"M\",  NSwitchType::kUnLimitedPostString, true, 1 },\n    { L\"O\",  NSwitchType::kUnLimitedPostString, false, 1 },\n    { L\"W\",  NSwitchType::kUnLimitedPostString, false, 0 },\n    { L\"I\",  NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize},\n    { L\"X\",  NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize},\n    { L\"AI\", NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize},\n    { L\"AX\", NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize},\n    { L\"AN\", NSwitchType::kSimple, false },\n    { L\"U\",  NSwitchType::kUnLimitedPostString, true, 1},\n    { L\"V\",  NSwitchType::kUnLimitedPostString, true, 1},\n    { L\"R\",  NSwitchType::kPostChar, false, 0, 0, kRecursedPostCharSet },\n    { L\"SFX\", NSwitchType::kUnLimitedPostString, false, 0 },\n    { L\"SI\", NSwitchType::kUnLimitedPostString, false, 0 },\n    { L\"SO\", NSwitchType::kSimple, false, 0 },\n    { L\"AO\", NSwitchType::kPostChar, false, 1, 1, kOverwritePostCharSet},\n    { L\"SEML\", NSwitchType::kUnLimitedPostString, false, 0},\n    { L\"AD\",  NSwitchType::kSimple, false },\n    { L\"L\",  NSwitchType::kSimple, false },\n    { L\"SLT\", NSwitchType::kSimple, false },\n    { L\"SSC\", NSwitchType::kPostChar, false, 0, 0, L\"-\" }\n  };\n\nstatic const CCommandForm g_CommandForms[] =\n{\n  { L\"A\", false },\n  { L\"U\", false },\n  { L\"D\", false },\n  { L\"T\", false },\n  { L\"E\", false },\n  { L\"X\", false },\n  { L\"L\", false },\n  { L\"B\", false },\n  { L\"I\", false }\n};\n\nstatic const int kNumCommandForms = sizeof(g_CommandForms) /  sizeof(g_CommandForms[0]);\n\nstatic const wchar_t *kUniversalWildcard = L\"*\";\nstatic const int kMinNonSwitchWords = 1;\nstatic const int kCommandIndex = 0;\n\n// ---------------------------\n// exception messages\n\nstatic const char *kUserErrorMessage  = \"Incorrect command line\";\nstatic const char *kIncorrectListFile = \"Incorrect item in listfile.\\nCheck charset encoding and -scs switch.\";\nstatic const char *kIncorrectWildCardInListFile = \"Incorrect wildcard in listfile\";\nstatic const char *kIncorrectWildCardInCommandLine  = \"Incorrect wildcard in command line\";\nstatic const char *kTerminalOutError = \"I won't write compressed data to a terminal\";\nstatic const char *kSameTerminalError = \"I won't write data and program's messages to same terminal\";\n\nstatic void ThrowException(const char *errorMessage)\n{\n  throw CArchiveCommandLineException(errorMessage);\n};\n\nstatic void ThrowUserErrorException()\n{\n  ThrowException(kUserErrorMessage);\n};\n\n// ---------------------------\n\nbool CArchiveCommand::IsFromExtractGroup() const\n{\n  switch(CommandType)\n  {\n    case NCommandType::kTest:\n    case NCommandType::kExtract:\n    case NCommandType::kFullExtract:\n      return true;\n    default:\n      return false;\n  }\n}\n\nNExtract::NPathMode::EEnum CArchiveCommand::GetPathMode() const\n{\n  switch(CommandType)\n  {\n    case NCommandType::kTest:\n    case NCommandType::kFullExtract:\n      return NExtract::NPathMode::kFullPathnames;\n    default:\n      return NExtract::NPathMode::kNoPathnames;\n  }\n}\n\nbool CArchiveCommand::IsFromUpdateGroup() const\n{\n  return (CommandType == NCommandType::kAdd ||\n    CommandType == NCommandType::kUpdate ||\n    CommandType == NCommandType::kDelete);\n}\n\nstatic NRecursedType::EEnum GetRecursedTypeFromIndex(int index)\n{\n  switch (index)\n  {\n    case NRecursedPostCharIndex::kWildCardRecursionOnly:\n      return NRecursedType::kWildCardOnlyRecursed;\n    case NRecursedPostCharIndex::kNoRecursion:\n      return NRecursedType::kNonRecursed;\n    default:\n      return NRecursedType::kRecursed;\n  }\n}\n\nstatic bool ParseArchiveCommand(const UString &commandString, CArchiveCommand &command)\n{\n  UString commandStringUpper = commandString;\n  commandStringUpper.MakeUpper();\n  UString postString;\n  int commandIndex = ParseCommand(kNumCommandForms, g_CommandForms, commandStringUpper,\n      postString) ;\n  if (commandIndex < 0)\n    return false;\n  command.CommandType = (NCommandType::EEnum)commandIndex;\n  return true;\n}\n\n// ------------------------------------------------------------------\n// filenames functions\n\nstatic bool AddNameToCensor(NWildcard::CCensor &wildcardCensor,\n    const UString &name, bool include, NRecursedType::EEnum type)\n{\n  bool isWildCard = DoesNameContainWildCard(name);\n  bool recursed = false;\n\n  switch (type)\n  {\n    case NRecursedType::kWildCardOnlyRecursed:\n      recursed = isWildCard;\n      break;\n    case NRecursedType::kRecursed:\n      recursed = true;\n      break;\n    case NRecursedType::kNonRecursed:\n      recursed = false;\n      break;\n  }\n  wildcardCensor.AddItem(include, name, recursed);\n  return true;\n}\n\nstatic void AddToCensorFromListFile(NWildcard::CCensor &wildcardCensor,\n    LPCWSTR fileName, bool include, NRecursedType::EEnum type, UINT codePage)\n{\n  UStringVector names;\n  if (!ReadNamesFromListFile(fileName, names, codePage))\n    throw kIncorrectListFile;\n  for (int i = 0; i < names.Size(); i++)\n    if (!AddNameToCensor(wildcardCensor, names[i], include, type))\n      throw kIncorrectWildCardInListFile;\n}\n\nstatic void AddCommandLineWildCardToCensr(NWildcard::CCensor &wildcardCensor,\n    const UString &name, bool include, NRecursedType::EEnum recursedType)\n{\n  if (!AddNameToCensor(wildcardCensor, name, include, recursedType))\n    throw kIncorrectWildCardInCommandLine;\n}\n\nstatic void AddToCensorFromNonSwitchesStrings(\n    int startIndex,\n    NWildcard::CCensor &wildcardCensor,\n    const UStringVector &nonSwitchStrings, NRecursedType::EEnum type,\n    bool thereAreSwitchIncludes, UINT codePage)\n{\n  if (nonSwitchStrings.Size() == startIndex && (!thereAreSwitchIncludes))\n    AddCommandLineWildCardToCensr(wildcardCensor, kUniversalWildcard, true, type);\n  for (int i = startIndex; i < nonSwitchStrings.Size(); i++)\n  {\n    const UString &s = nonSwitchStrings[i];\n    if (s[0] == kFileListID)\n      AddToCensorFromListFile(wildcardCensor, s.Mid(1), true, type, codePage);\n    else\n      AddCommandLineWildCardToCensr(wildcardCensor, s, true, type);\n  }\n}\n\n#ifdef _WIN32\nstatic void ParseMapWithPaths(NWildcard::CCensor &wildcardCensor,\n    const UString &switchParam, bool include,\n    NRecursedType::EEnum commonRecursedType)\n{\n  int splitPos = switchParam.Find(L':');\n  if (splitPos < 0)\n    ThrowUserErrorException();\n  UString mappingName = switchParam.Left(splitPos);\n  \n  UString switchParam2 = switchParam.Mid(splitPos + 1);\n  splitPos = switchParam2.Find(L':');\n  if (splitPos < 0)\n    ThrowUserErrorException();\n  \n  UString mappingSize = switchParam2.Left(splitPos);\n  UString eventName = switchParam2.Mid(splitPos + 1);\n  \n  UInt64 dataSize64 = ConvertStringToUInt64(mappingSize, NULL);\n  UInt32 dataSize = (UInt32)dataSize64;\n  {\n    CFileMapping fileMapping;\n    if (!fileMapping.Open(FILE_MAP_READ, false, GetSystemString(mappingName)))\n      ThrowException(\"Can not open mapping\");\n    LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_READ, 0, dataSize);\n    if (data == NULL)\n      ThrowException(\"MapViewOfFile error\");\n    try\n    {\n      const wchar_t *curData = (const wchar_t *)data;\n      if (*curData != 0)\n        ThrowException(\"Incorrect mapping data\");\n      UInt32 numChars = dataSize / sizeof(wchar_t);\n      UString name;\n      for (UInt32 i = 1; i < numChars; i++)\n      {\n        wchar_t c = curData[i];\n        if (c == L'\\0')\n        {\n          AddCommandLineWildCardToCensr(wildcardCensor,\n              name, include, commonRecursedType);\n          name.Empty();\n        }\n        else\n          name += c;\n      }\n      if (!name.IsEmpty())\n        ThrowException(\"data error\");\n    }\n    catch(...)\n    {\n      UnmapViewOfFile(data);\n      throw;\n    }\n    UnmapViewOfFile(data);\n  }\n  \n  {\n    NSynchronization::CManualResetEvent event;\n    if (event.Open(EVENT_MODIFY_STATE, false, GetSystemString(eventName)) == S_OK)\n      event.Set();\n  }\n}\n#endif\n\nstatic void AddSwitchWildCardsToCensor(NWildcard::CCensor &wildcardCensor,\n    const UStringVector &strings, bool include,\n    NRecursedType::EEnum commonRecursedType, UINT codePage)\n{\n  for (int i = 0; i < strings.Size(); i++)\n  {\n    const UString &name = strings[i];\n    NRecursedType::EEnum recursedType;\n    int pos = 0;\n    if (name.Length() < kSomeCludePostStringMinSize)\n      ThrowUserErrorException();\n    if (::MyCharUpper(name[pos]) == kRecursedIDChar)\n    {\n      pos++;\n      int index = UString(kRecursedPostCharSet).Find(name[pos]);\n      recursedType = GetRecursedTypeFromIndex(index);\n      if (index >= 0)\n        pos++;\n    }\n    else\n      recursedType = commonRecursedType;\n    if (name.Length() < pos + kSomeCludeAfterRecursedPostStringMinSize)\n      ThrowUserErrorException();\n    UString tail = name.Mid(pos + 1);\n    if (name[pos] == kImmediateNameID)\n      AddCommandLineWildCardToCensr(wildcardCensor, tail, include, recursedType);\n    else if (name[pos] == kFileListID)\n      AddToCensorFromListFile(wildcardCensor, tail, include, recursedType, codePage);\n    #ifdef _WIN32\n    else if (name[pos] == kMapNameID)\n      ParseMapWithPaths(wildcardCensor, tail, include, recursedType);\n    #endif\n    else\n      ThrowUserErrorException();\n  }\n}\n\n#ifdef _WIN32\n\n// This code converts all short file names to long file names.\n\nstatic void ConvertToLongName(const UString &prefix, UString &name)\n{\n  if (name.IsEmpty() || DoesNameContainWildCard(name))\n    return;\n  NFind::CFileInfoW fileInfo;\n  if (NFind::FindFile(prefix + name, fileInfo))\n    name = fileInfo.Name;\n}\n\nstatic void ConvertToLongNames(const UString &prefix, CObjectVector<NWildcard::CItem> &items)\n{\n  for (int i = 0; i < items.Size(); i++)\n  {\n    NWildcard::CItem &item = items[i];\n    if (item.Recursive || item.PathParts.Size() != 1)\n      continue;\n    ConvertToLongName(prefix, item.PathParts.Front());\n  }\n}\n\nstatic void ConvertToLongNames(const UString &prefix, NWildcard::CCensorNode &node)\n{\n  ConvertToLongNames(prefix, node.IncludeItems);\n  ConvertToLongNames(prefix, node.ExcludeItems);\n  int i;\n  for (i = 0; i < node.SubNodes.Size(); i++)\n    ConvertToLongName(prefix, node.SubNodes[i].Name);\n  // mix folders with same name\n  for (i = 0; i < node.SubNodes.Size(); i++)\n  {\n    NWildcard::CCensorNode &nextNode1 = node.SubNodes[i];\n    for (int j = i + 1; j < node.SubNodes.Size();)\n    {\n      const NWildcard::CCensorNode &nextNode2 = node.SubNodes[j];\n      if (nextNode1.Name.CompareNoCase(nextNode2.Name) == 0)\n      {\n        nextNode1.IncludeItems += nextNode2.IncludeItems;\n        nextNode1.ExcludeItems += nextNode2.ExcludeItems;\n        node.SubNodes.Delete(j);\n      }\n      else\n        j++;\n    }\n  }\n  for (i = 0; i < node.SubNodes.Size(); i++)\n  {\n    NWildcard::CCensorNode &nextNode = node.SubNodes[i];\n    ConvertToLongNames(prefix + nextNode.Name + wchar_t(NFile::NName::kDirDelimiter), nextNode);\n  }\n}\n\nstatic void ConvertToLongNames(NWildcard::CCensor &censor)\n{\n  for (int i = 0; i < censor.Pairs.Size(); i++)\n  {\n    NWildcard::CPair &pair = censor.Pairs[i];\n    ConvertToLongNames(pair.Prefix, pair.Head);\n  }\n}\n\n#endif\n\nstatic NUpdateArchive::NPairAction::EEnum GetUpdatePairActionType(int i)\n{\n  switch(i)\n  {\n    case NUpdateArchive::NPairAction::kIgnore: return NUpdateArchive::NPairAction::kIgnore;\n    case NUpdateArchive::NPairAction::kCopy: return NUpdateArchive::NPairAction::kCopy;\n    case NUpdateArchive::NPairAction::kCompress: return NUpdateArchive::NPairAction::kCompress;\n    case NUpdateArchive::NPairAction::kCompressAsAnti: return NUpdateArchive::NPairAction::kCompressAsAnti;\n  }\n  throw 98111603;\n}\n\nconst UString kUpdatePairStateIDSet = L\"PQRXYZW\";\nconst int kUpdatePairStateNotSupportedActions[] = {2, 2, 1, -1, -1, -1, -1};\n\nconst UString kUpdatePairActionIDSet = L\"0123\"; //Ignore, Copy, Compress, Create Anti\n\nconst wchar_t *kUpdateIgnoreItselfPostStringID = L\"-\";\nconst wchar_t kUpdateNewArchivePostCharID = '!';\n\n\nstatic bool ParseUpdateCommandString2(const UString &command,\n    NUpdateArchive::CActionSet &actionSet, UString &postString)\n{\n  for (int i = 0; i < command.Length();)\n  {\n    wchar_t c = MyCharUpper(command[i]);\n    int statePos = kUpdatePairStateIDSet.Find(c);\n    if (statePos < 0)\n    {\n      postString = command.Mid(i);\n      return true;\n    }\n    i++;\n    if (i >= command.Length())\n      return false;\n    int actionPos = kUpdatePairActionIDSet.Find(::MyCharUpper(command[i]));\n    if (actionPos < 0)\n      return false;\n    actionSet.StateActions[statePos] = GetUpdatePairActionType(actionPos);\n    if (kUpdatePairStateNotSupportedActions[statePos] == actionPos)\n      return false;\n    i++;\n  }\n  postString.Empty();\n  return true;\n}\n\nstatic void ParseUpdateCommandString(CUpdateOptions &options,\n    const UStringVector &updatePostStrings,\n    const NUpdateArchive::CActionSet &defaultActionSet)\n{\n  for (int i = 0; i < updatePostStrings.Size(); i++)\n  {\n    const UString &updateString = updatePostStrings[i];\n    if (updateString.CompareNoCase(kUpdateIgnoreItselfPostStringID) == 0)\n    {\n      if (options.UpdateArchiveItself)\n      {\n        options.UpdateArchiveItself = false;\n        options.Commands.Delete(0);\n      }\n    }\n    else\n    {\n      NUpdateArchive::CActionSet actionSet = defaultActionSet;\n\n      UString postString;\n      if (!ParseUpdateCommandString2(updateString, actionSet, postString))\n        ThrowUserErrorException();\n      if (postString.IsEmpty())\n      {\n        if (options.UpdateArchiveItself)\n          options.Commands[0].ActionSet = actionSet;\n      }\n      else\n      {\n        if (MyCharUpper(postString[0]) != kUpdateNewArchivePostCharID)\n          ThrowUserErrorException();\n        CUpdateArchiveCommand uc;\n        UString archivePath = postString.Mid(1);\n        if (archivePath.IsEmpty())\n          ThrowUserErrorException();\n        uc.UserArchivePath = archivePath;\n        uc.ActionSet = actionSet;\n        options.Commands.Add(uc);\n      }\n    }\n  }\n}\n\nstatic const char kByteSymbol = 'B';\nstatic const char kKiloSymbol = 'K';\nstatic const char kMegaSymbol = 'M';\nstatic const char kGigaSymbol = 'G';\n\nstatic bool ParseComplexSize(const UString &src, UInt64 &result)\n{\n  UString s = src;\n  s.MakeUpper();\n\n  const wchar_t *start = s;\n  const wchar_t *end;\n  UInt64 number = ConvertStringToUInt64(start, &end);\n  int numDigits = (int)(end - start);\n  if (numDigits == 0 || s.Length() > numDigits + 1)\n    return false;\n  if (s.Length() == numDigits)\n  {\n    result = number;\n    return true;\n  }\n  int numBits;\n  switch (s[numDigits])\n  {\n    case kByteSymbol:\n      result = number;\n      return true;\n    case kKiloSymbol:\n      numBits = 10;\n      break;\n    case kMegaSymbol:\n      numBits = 20;\n      break;\n    case kGigaSymbol:\n      numBits = 30;\n      break;\n    default:\n      return false;\n  }\n  if (number >= ((UInt64)1 << (64 - numBits)))\n    return false;\n  result = number << numBits;\n  return true;\n}\n\nstatic void SetAddCommandOptions(\n    NCommandType::EEnum commandType,\n    const CParser &parser,\n    CUpdateOptions &options)\n{\n  NUpdateArchive::CActionSet defaultActionSet;\n  switch(commandType)\n  {\n    case NCommandType::kAdd:\n      defaultActionSet = NUpdateArchive::kAddActionSet;\n      break;\n    case NCommandType::kDelete:\n      defaultActionSet = NUpdateArchive::kDeleteActionSet;\n      break;\n    default:\n      defaultActionSet = NUpdateArchive::kUpdateActionSet;\n  }\n  \n  options.UpdateArchiveItself = true;\n  \n  options.Commands.Clear();\n  CUpdateArchiveCommand updateMainCommand;\n  updateMainCommand.ActionSet = defaultActionSet;\n  options.Commands.Add(updateMainCommand);\n  if (parser[NKey::kUpdate].ThereIs)\n    ParseUpdateCommandString(options, parser[NKey::kUpdate].PostStrings,\n        defaultActionSet);\n  if (parser[NKey::kWorkingDir].ThereIs)\n  {\n    const UString &postString = parser[NKey::kWorkingDir].PostStrings[0];\n    if (postString.IsEmpty())\n      NDirectory::MyGetTempPath(options.WorkingDir);\n    else\n      options.WorkingDir = postString;\n  }\n  options.SfxMode = parser[NKey::kSfx].ThereIs;\n  if (options.SfxMode)\n    options.SfxModule = parser[NKey::kSfx].PostStrings[0];\n\n  if (parser[NKey::kVolume].ThereIs)\n  {\n    const UStringVector &sv = parser[NKey::kVolume].PostStrings;\n    for (int i = 0; i < sv.Size(); i++)\n    {\n      UInt64 size;\n      if (!ParseComplexSize(sv[i], size))\n        ThrowException(\"Incorrect volume size\");\n      options.VolumesSizes.Add(size);\n    }\n  }\n}\n\nstatic void SetMethodOptions(const CParser &parser, CObjectVector<CProperty> &properties)\n{\n  if (parser[NKey::kProperty].ThereIs)\n  {\n    // options.MethodMode.Properties.Clear();\n    for (int i = 0; i < parser[NKey::kProperty].PostStrings.Size(); i++)\n    {\n      CProperty property;\n      const UString &postString = parser[NKey::kProperty].PostStrings[i];\n      int index = postString.Find(L'=');\n      if (index < 0)\n        property.Name = postString;\n      else\n      {\n        property.Name = postString.Left(index);\n        property.Value = postString.Mid(index + 1);\n      }\n      properties.Add(property);\n    }\n  }\n}\n\nCArchiveCommandLineParser::CArchiveCommandLineParser():\n  parser(sizeof(kSwitchForms) / sizeof(kSwitchForms[0])) {}\n\nvoid CArchiveCommandLineParser::Parse1(const UStringVector &commandStrings,\n    CArchiveCommandLineOptions &options)\n{\n  try\n  {\n    parser.ParseStrings(kSwitchForms, commandStrings);\n  }\n  catch(...)\n  {\n    ThrowUserErrorException();\n  }\n\n  options.IsInTerminal = MY_IS_TERMINAL(stdin);\n  options.IsStdOutTerminal = MY_IS_TERMINAL(stdout);\n  options.IsStdErrTerminal = MY_IS_TERMINAL(stderr);\n  options.StdOutMode = parser[NKey::kStdOut].ThereIs;\n  options.EnableHeaders = !parser[NKey::kDisableHeaders].ThereIs;\n  options.HelpMode = parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs  || parser[NKey::kHelp3].ThereIs;\n\n  #ifdef _WIN32\n  options.LargePages = false;\n  if (parser[NKey::kLargePages].ThereIs)\n  {\n    const UString &postString = parser[NKey::kLargePages].PostStrings.Front();\n    if (postString.IsEmpty())\n      options.LargePages = true;\n  }\n  #endif\n}\n\nstatic bool ConvertStringToUInt32(const wchar_t *s, UInt32 &v)\n{\n  const wchar_t *end;\n  UInt64 number = ConvertStringToUInt64(s, &end);\n  if (*end != 0)\n    return false;\n  if (number > (UInt32)0xFFFFFFFF)\n    return false;\n  v = (UInt32)number;\n  return true;\n}\n\nvoid CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options)\n{\n  const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;\n  int numNonSwitchStrings = nonSwitchStrings.Size();\n  if (numNonSwitchStrings < kMinNonSwitchWords)\n    ThrowUserErrorException();\n\n  if (!ParseArchiveCommand(nonSwitchStrings[kCommandIndex], options.Command))\n    ThrowUserErrorException();\n\n  options.TechMode = parser[NKey::kTechMode].ThereIs;\n\n  if (parser[NKey::kCaseSensitive].ThereIs)\n    g_CaseSensitive = (parser[NKey::kCaseSensitive].PostCharIndex < 0);\n\n  NRecursedType::EEnum recursedType;\n  if (parser[NKey::kRecursed].ThereIs)\n    recursedType = GetRecursedTypeFromIndex(parser[NKey::kRecursed].PostCharIndex);\n  else\n    recursedType = NRecursedType::kNonRecursed;\n\n   UINT codePage = CP_ACP;\n\n  bool thereAreSwitchIncludes = false;\n  if (parser[NKey::kInclude].ThereIs)\n  {\n    thereAreSwitchIncludes = true;\n    AddSwitchWildCardsToCensor(options.WildcardCensor,\n        parser[NKey::kInclude].PostStrings, true, recursedType, codePage);\n  }\n  if (parser[NKey::kExclude].ThereIs)\n    AddSwitchWildCardsToCensor(options.WildcardCensor,\n        parser[NKey::kExclude].PostStrings, false, recursedType, codePage);\n \n  int curCommandIndex = kCommandIndex + 1;\n  bool thereIsArchiveName = !parser[NKey::kNoArName].ThereIs &&\n      options.Command.CommandType != NCommandType::kBenchmark &&\n      options.Command.CommandType != NCommandType::kInfo;\n  if (thereIsArchiveName)\n  {\n    if (curCommandIndex >= numNonSwitchStrings)\n      ThrowUserErrorException();\n    options.ArchiveName = nonSwitchStrings[curCommandIndex++];\n  }\n\n  AddToCensorFromNonSwitchesStrings(\n      curCommandIndex, options.WildcardCensor,\n      nonSwitchStrings, recursedType, thereAreSwitchIncludes, codePage);\n\n  options.YesToAll = parser[NKey::kYes].ThereIs;\n\n#ifdef HAVE_LSTAT\n  global_use_lstat = !parser[NKey::kUseLStat].ThereIs;\n#endif\n\n  bool isExtractGroupCommand = options.Command.IsFromExtractGroup();\n\n  #ifndef _NO_CRYPTO\n  options.PasswordEnabled = parser[NKey::kPassword].ThereIs;\n  if (options.PasswordEnabled)\n    options.Password = parser[NKey::kPassword].PostStrings[0];\n  #endif\n\n  options.StdInMode = parser[NKey::kStdIn].ThereIs;\n  options.ShowDialog = parser[NKey::kShowDialog].ThereIs;\n\n  if (parser[NKey::kArchiveType].ThereIs)\n    options.ArcType = parser[NKey::kArchiveType].PostStrings[0];\n\n  if (isExtractGroupCommand || options.Command.CommandType == NCommandType::kList)\n  {\n    if (options.StdInMode)\n      ThrowException(\"Reading archives from stdin is not implemented\");\n    if (!options.WildcardCensor.AllAreRelative())\n      ThrowException(\"Cannot use absolute pathnames for this command\");\n\n    NWildcard::CCensor archiveWildcardCensor;\n\n    if (parser[NKey::kArInclude].ThereIs)\n    {\n      AddSwitchWildCardsToCensor(archiveWildcardCensor,\n        parser[NKey::kArInclude].PostStrings, true, NRecursedType::kNonRecursed, codePage);\n    }\n    if (parser[NKey::kArExclude].ThereIs)\n      AddSwitchWildCardsToCensor(archiveWildcardCensor,\n      parser[NKey::kArExclude].PostStrings, false, NRecursedType::kNonRecursed, codePage);\n\n    bool directlyAddArchiveName = false;\n    if (thereIsArchiveName) {\n      if ((options.ArchiveName.Find(kUniversalWildcard) == -1) && (options.ArchiveName.Find(L\"?\") == -1)) {\n        // no wildcard => no need to scan\n        directlyAddArchiveName = true;\n      } else {\n      AddCommandLineWildCardToCensr(archiveWildcardCensor, options.ArchiveName, true, NRecursedType::kNonRecursed);\n      }\n    }\n\n    #ifdef _WIN32\n    ConvertToLongNames(archiveWildcardCensor);\n    #endif\n\n    archiveWildcardCensor.ExtendExclude();\n\n    UStringVector archivePaths;\n\n    {\n      CDirItems dirItems;\n      {\n        UStringVector errorPaths;\n        CRecordVector<DWORD> errorCodes;\n        HRESULT res = EnumerateItems(archiveWildcardCensor, dirItems, NULL, errorPaths, errorCodes);\n        if (res != S_OK || errorPaths.Size() > 0)\n          throw \"cannot find archive\";\n      }\n      for (int i = 0; i < dirItems.Items.Size(); i++)\n      {\n        const CDirItem &dirItem = dirItems.Items[i];\n        if (!dirItem.IsDir())\n          archivePaths.Add(dirItems.GetPhyPath(i));\n      }\n    }\n\n    // Because the pathname of archive can be a symbolic link\n    // do not use \"AddCommandLineWildCardToCensr(archiveWildcardCensor, options.ArchiveName\"\n    if (directlyAddArchiveName)\n      archivePaths.Add(options.ArchiveName);\n\n    if (archivePaths.Size() == 0)\n      throw \"there is no such archive\";\n\n    UStringVector archivePathsFull;\n\n    int i;\n    for (i = 0; i < archivePaths.Size(); i++)\n    {\n      UString fullPath;\n      NFile::NDirectory::MyGetFullPathName(archivePaths[i], fullPath);\n      archivePathsFull.Add(fullPath);\n    }\n    CIntVector indices;\n    SortFileNames(archivePathsFull, indices);\n    options.ArchivePathsSorted.Reserve(indices.Size());\n    options.ArchivePathsFullSorted.Reserve(indices.Size());\n    for (i = 0; i < indices.Size(); i++)\n    {\n      options.ArchivePathsSorted.Add(archivePaths[indices[i]]);\n      options.ArchivePathsFullSorted.Add(archivePathsFull[indices[i]]);\n    }\n\n    if (isExtractGroupCommand)\n    {\n      SetMethodOptions(parser, options.ExtractProperties);\n      if (options.StdOutMode && options.IsStdOutTerminal && options.IsStdErrTerminal)\n        throw kSameTerminalError;\n      if (parser[NKey::kOutputDir].ThereIs)\n      {\n        options.OutputDir = parser[NKey::kOutputDir].PostStrings[0];\n        NFile::NName::NormalizeDirPathPrefix(options.OutputDir);\n      }\n\n      options.OverwriteMode = NExtract::NOverwriteMode::kAskBefore;\n      if (parser[NKey::kOverwrite].ThereIs)\n        options.OverwriteMode =\n            k_OverwriteModes[parser[NKey::kOverwrite].PostCharIndex];\n      else if (options.YesToAll)\n        options.OverwriteMode = NExtract::NOverwriteMode::kWithoutPrompt;\n    }\n  }\n  else if (options.Command.IsFromUpdateGroup())\n  {\n    CUpdateOptions &updateOptions = options.UpdateOptions;\n\n    SetAddCommandOptions(options.Command.CommandType, parser, updateOptions);\n    \n    SetMethodOptions(parser, updateOptions.MethodMode.Properties);\n\n    options.EnablePercents = !parser[NKey::kDisablePercents].ThereIs;\n\n    if (options.EnablePercents)\n    {\n      if ((options.StdOutMode && !options.IsStdErrTerminal) ||\n         (!options.StdOutMode && !options.IsStdOutTerminal))\n        options.EnablePercents = false;\n    }\n\n    updateOptions.EMailMode = parser[NKey::kEmail].ThereIs;\n    if (updateOptions.EMailMode)\n    {\n      updateOptions.EMailAddress = parser[NKey::kEmail].PostStrings.Front();\n      if (updateOptions.EMailAddress.Length() > 0)\n        if (updateOptions.EMailAddress[0] == L'.')\n        {\n          updateOptions.EMailRemoveAfter = true;\n          updateOptions.EMailAddress.Delete(0);\n        }\n    }\n\n    updateOptions.StdOutMode = options.StdOutMode;\n    updateOptions.StdInMode = options.StdInMode;\n\n    if (updateOptions.StdOutMode && updateOptions.EMailMode)\n      throw \"stdout mode and email mode cannot be combined\";\n    if (updateOptions.StdOutMode && options.IsStdOutTerminal)\n      throw kTerminalOutError;\n    if (updateOptions.StdInMode)\n      updateOptions.StdInFileName = parser[NKey::kStdIn].PostStrings.Front();\n\n    #ifdef _WIN32\n    ConvertToLongNames(options.WildcardCensor);\n    #endif\n  }\n  else if (options.Command.CommandType == NCommandType::kBenchmark)\n  {\n    options.NumThreads = (UInt32)-1;\n    options.DictionarySize = (UInt32)-1;\n    options.NumIterations = 1;\n    if (curCommandIndex < numNonSwitchStrings)\n    {\n      if (!ConvertStringToUInt32(nonSwitchStrings[curCommandIndex++], options.NumIterations))\n        ThrowUserErrorException();\n    }\n    for (int i = 0; i < parser[NKey::kProperty].PostStrings.Size(); i++)\n    {\n      UString postString = parser[NKey::kProperty].PostStrings[i];\n      postString.MakeUpper();\n      if (postString.Length() < 2)\n        ThrowUserErrorException();\n      if (postString[0] == 'D')\n      {\n        int pos = 1;\n        if (postString[pos] == '=')\n          pos++;\n        UInt32 logSize;\n        if (!ConvertStringToUInt32((const wchar_t *)postString + pos, logSize))\n          ThrowUserErrorException();\n        if (logSize > 31)\n          ThrowUserErrorException();\n        options.DictionarySize = 1 << logSize;\n      }\n      else if (postString[0] == 'M' && postString[1] == 'T' )\n      {\n        int pos = 2;\n        if (postString[pos] == '=')\n          pos++;\n        if (postString[pos] != 0)\n          if (!ConvertStringToUInt32((const wchar_t *)postString + pos, options.NumThreads))\n            ThrowUserErrorException();\n      }\n      else if (postString[0] == 'M' && postString[1] == '=' )\n      {\n        int pos = 2;\n        if (postString[pos] != 0)\n          options.Method = postString.Mid(2);\n      }\n      else\n        ThrowUserErrorException();\n    }\n  }\n  else if (options.Command.CommandType == NCommandType::kInfo)\n  {\n  }\n  else\n    ThrowUserErrorException();\n  options.WildcardCensor.ExtendExclude();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveCommandLine.h",
    "content": "// ArchiveCommandLine.h\n\n#ifndef __ARCHIVECOMMANDLINE_H\n#define __ARCHIVECOMMANDLINE_H\n\n#include \"Common/Wildcard.h\"\n#include \"Common/CommandLineParser.h\"\n\n#include \"Extract.h\"\n#include \"Update.h\"\n\nstruct CArchiveCommandLineException: public AString\n{\n  CArchiveCommandLineException(const char *errorMessage): AString(errorMessage) {}\n};\n\nnamespace NCommandType { enum EEnum\n{\n  kAdd = 0,\n  kUpdate,\n  kDelete,\n  kTest,\n  kExtract,\n  kFullExtract,\n  kList,\n  kBenchmark,\n  kInfo\n};}\n\nnamespace NRecursedType { enum EEnum\n{\n  kRecursed,\n  kWildCardOnlyRecursed,\n  kNonRecursed\n};}\n\nstruct CArchiveCommand\n{\n  NCommandType::EEnum CommandType;\n  bool IsFromExtractGroup() const;\n  bool IsFromUpdateGroup() const;\n  bool IsTestMode() const { return CommandType == NCommandType::kTest; }\n  NExtract::NPathMode::EEnum GetPathMode() const;\n};\n\nstruct CArchiveCommandLineOptions\n{\n  bool HelpMode;\n\n  #ifdef _WIN32\n  bool LargePages;\n  #endif\n\n  bool IsInTerminal;\n  bool IsStdOutTerminal;\n  bool IsStdErrTerminal;\n  bool StdInMode;\n  bool StdOutMode;\n  bool EnableHeaders;\n\n  bool YesToAll;\n  bool ShowDialog;\n  // NWildcard::CCensor ArchiveWildcardCensor;\n  NWildcard::CCensor WildcardCensor;\n\n  CArchiveCommand Command;\n  UString ArchiveName;\n\n  #ifndef _NO_CRYPTO\n  bool PasswordEnabled;\n  UString Password;\n  #endif\n\n  bool TechMode;\n  // Extract\n  bool AppendName;\n  UString OutputDir;\n  NExtract::NOverwriteMode::EEnum OverwriteMode;\n  UStringVector ArchivePathsSorted;\n  UStringVector ArchivePathsFullSorted;\n  CObjectVector<CProperty> ExtractProperties;\n\n  CUpdateOptions UpdateOptions;\n  UString ArcType;\n  bool EnablePercents;\n\n  // Benchmark\n  UInt32 NumIterations;\n  UInt32 NumThreads;\n  UInt32 DictionarySize;\n  UString Method;\n\n\n  CArchiveCommandLineOptions(): StdInMode(false), StdOutMode(false) {};\n};\n\nclass CArchiveCommandLineParser\n{\n  NCommandLineParser::CParser parser;\npublic:\n  CArchiveCommandLineParser();\n  void Parse1(const UStringVector &commandStrings, CArchiveCommandLineOptions &options);\n  void Parse2(CArchiveCommandLineOptions &options);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp",
    "content": "// ArchiveExtractCallback.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ArchiveExtractCallback.h\"\n\n#include \"Common/Wildcard.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/ComTry.h\"\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/Time.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"Windows/PropVariantConversions.h\"\n\n#include \"../../Common/FilePathAutoRename.h\"\n\n#include \"../Common/ExtractingFilePath.h\"\n#include \"OpenArchive.h\"\n\nusing namespace NWindows;\n\nstatic const wchar_t *kCantAutoRename = L\"ERROR: Can not create file with auto name\";\nstatic const wchar_t *kCantRenameFile = L\"ERROR: Can not rename existing file \";\nstatic const wchar_t *kCantDeleteOutputFile = L\"ERROR: Can not delete output file \";\n\n\nvoid CArchiveExtractCallback::Init(\n    IInArchive *archiveHandler,\n    IFolderArchiveExtractCallback *extractCallback2,\n    bool stdOutMode,\n    const UString &directoryPath,\n    const UStringVector &removePathParts,\n    const UString &itemDefaultName,\n    const FILETIME &utcMTimeDefault,\n    UInt32 attributesDefault,\n    UInt64 packSize)\n{\n  _stdOutMode = stdOutMode;\n  _numErrors = 0;\n  _unpTotal = 1;\n  _packTotal = packSize;\n\n  _extractCallback2 = extractCallback2;\n  _compressProgress.Release();\n  _extractCallback2.QueryInterface(IID_ICompressProgressInfo, &_compressProgress);\n\n  LocalProgressSpec->Init(extractCallback2, true);\n  LocalProgressSpec->SendProgress = false;\n\n  _itemDefaultName = itemDefaultName;\n  _utcMTimeDefault = utcMTimeDefault;\n  _attributesDefault = attributesDefault;\n  _removePathParts = removePathParts;\n  _archiveHandler = archiveHandler;\n  _directoryPath = directoryPath;\n  NFile::NName::NormalizeDirPathPrefix(_directoryPath);\n}\n\nSTDMETHODIMP CArchiveExtractCallback::SetTotal(UInt64 size)\n{\n  COM_TRY_BEGIN\n  _unpTotal = size;\n  if (!_multiArchives && _extractCallback2)\n    return _extractCallback2->SetTotal(size);\n  return S_OK;\n  COM_TRY_END\n}\n\nstatic void NormalizeVals(UInt64 &v1, UInt64 &v2)\n{\n  const UInt64 kMax = (UInt64)1 << 31;\n  while (v1 > kMax)\n  {\n    v1 >>= 1;\n    v2 >>= 1;\n  }\n}\n\nstatic UInt64 MyMultDiv64(UInt64 unpCur, UInt64 unpTotal, UInt64 packTotal)\n{\n  NormalizeVals(packTotal, unpTotal);\n  NormalizeVals(unpCur, unpTotal);\n  if (unpTotal == 0)\n    unpTotal = 1;\n  return unpCur * packTotal / unpTotal;\n}\n\nSTDMETHODIMP CArchiveExtractCallback::SetCompleted(const UInt64 *completeValue)\n{\n  COM_TRY_BEGIN\n  if (!_extractCallback2)\n    return S_OK;\n\n  if (_multiArchives)\n  {\n    if (completeValue != NULL)\n    {\n      UInt64 packCur = LocalProgressSpec->InSize + MyMultDiv64(*completeValue, _unpTotal, _packTotal);\n      return _extractCallback2->SetCompleted(&packCur);\n    }\n  }\n  return _extractCallback2->SetCompleted(completeValue);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveExtractCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  COM_TRY_BEGIN\n  return _localProgress->SetRatioInfo(inSize, outSize);\n  COM_TRY_END\n}\n\nvoid CArchiveExtractCallback::CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath)\n{\n  fullPath = _directoryPath;\n  for(int i = 0; i < dirPathParts.Size(); i++)\n  {\n    if (i > 0)\n      fullPath += wchar_t(NFile::NName::kDirDelimiter);\n    fullPath += dirPathParts[i];\n    NFile::NDirectory::MyCreateDirectory(fullPath);\n  }\n}\n\nstatic UString MakePathNameFromParts(const UStringVector &parts)\n{\n  UString result;\n  for(int i = 0; i < parts.Size(); i++)\n  {\n    if(i != 0)\n      result += wchar_t(NFile::NName::kDirDelimiter);\n    result += parts[i];\n  }\n  return result;\n}\n\n\nHRESULT CArchiveExtractCallback::GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined)\n{\n  filetimeIsDefined = false;\n  NCOM::CPropVariant prop;\n  RINOK(_archiveHandler->GetProperty(index, propID, &prop));\n  if (prop.vt == VT_FILETIME)\n  {\n    filetime = prop.filetime;\n    filetimeIsDefined = (filetime.dwHighDateTime != 0 || filetime.dwLowDateTime != 0);\n  }\n  else if (prop.vt != VT_EMPTY)\n    return E_FAIL;\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode)\n{\n  COM_TRY_BEGIN\n  *outStream = 0;\n  _outFileStream.Release();\n\n  _encrypted = false;\n  _isSplit = false;\n  _curSize = 0;\n\n  UString fullPath;\n\n  RINOK(GetArchiveItemPath(_archiveHandler, index, _itemDefaultName, fullPath));\n  RINOK(IsArchiveItemFolder(_archiveHandler, index, _processedFileInfo.IsDir));\n\n  _filePath = fullPath;\n\n  {\n    NCOM::CPropVariant prop;\n    RINOK(_archiveHandler->GetProperty(index, kpidPosition, &prop));\n    if (prop.vt != VT_EMPTY)\n    {\n      if (prop.vt != VT_UI8)\n        return E_FAIL;\n      _position = prop.uhVal.QuadPart;\n      _isSplit = true;\n    }\n  }\n    \n  RINOK(IsArchiveItemProp(_archiveHandler, index, kpidEncrypted, _encrypted));\n\n  bool newFileSizeDefined;\n  UInt64 newFileSize;\n  {\n    NCOM::CPropVariant prop;\n    RINOK(_archiveHandler->GetProperty(index, kpidSize, &prop));\n    newFileSizeDefined = (prop.vt != VT_EMPTY);\n    if (newFileSizeDefined)\n    {\n      newFileSize = ConvertPropVariantToUInt64(prop);\n      _curSize = newFileSize;\n    }\n  }\n\n  if(askExtractMode == NArchive::NExtract::NAskMode::kExtract)\n  {\n    if (_stdOutMode)\n    {\n      CMyComPtr<ISequentialOutStream> outStreamLoc = new CStdOutFileStream;\n      *outStream = outStreamLoc.Detach();\n      return S_OK;\n    }\n\n    {\n      NCOM::CPropVariant prop;\n      RINOK(_archiveHandler->GetProperty(index, kpidAttrib, &prop));\n      if (prop.vt == VT_EMPTY)\n      {\n        _processedFileInfo.Attributes = _attributesDefault;\n        _processedFileInfo.AttributesAreDefined = false;\n      }\n      else\n      {\n        if (prop.vt != VT_UI4)\n          return E_FAIL;\n        _processedFileInfo.Attributes = prop.ulVal;\n        _processedFileInfo.AttributesAreDefined = true;\n      }\n    }\n\n    RINOK(GetTime(index, kpidCTime, _processedFileInfo.CTime, _processedFileInfo.CTimeDefined));\n    RINOK(GetTime(index, kpidATime, _processedFileInfo.ATime, _processedFileInfo.ATimeDefined));\n    RINOK(GetTime(index, kpidMTime, _processedFileInfo.MTime, _processedFileInfo.MTimeDefined));\n\n    bool isAnti = false;\n    RINOK(IsArchiveItemProp(_archiveHandler, index, kpidIsAnti, isAnti));\n\n    UStringVector pathParts;\n    SplitPathToParts(fullPath, pathParts);\n    \n    if(pathParts.IsEmpty())\n      return E_FAIL;\n    int numRemovePathParts = 0;\n    switch(_pathMode)\n    {\n      case NExtract::NPathMode::kFullPathnames:\n        break;\n      case NExtract::NPathMode::kCurrentPathnames:\n      {\n        numRemovePathParts = _removePathParts.Size();\n        if (pathParts.Size() <= numRemovePathParts)\n          return E_FAIL;\n        for (int i = 0; i < numRemovePathParts; i++)\n          if (_removePathParts[i].CompareNoCase(pathParts[i]) != 0)\n            return E_FAIL;\n        break;\n      }\n      case NExtract::NPathMode::kNoPathnames:\n      {\n        numRemovePathParts = pathParts.Size() - 1;\n        break;\n      }\n    }\n    pathParts.Delete(0, numRemovePathParts);\n    MakeCorrectPath(pathParts);\n    UString processedPath = MakePathNameFromParts(pathParts);\n    if (!isAnti)\n    {\n      if (!_processedFileInfo.IsDir)\n      {\n        if (!pathParts.IsEmpty())\n          pathParts.DeleteBack();\n      }\n    \n      if (!pathParts.IsEmpty())\n      {\n        UString fullPathNew;\n        CreateComplexDirectory(pathParts, fullPathNew);\n        if (_processedFileInfo.IsDir)\n          NFile::NDirectory::SetDirTime(fullPathNew,\n            (WriteCTime && _processedFileInfo.CTimeDefined) ? &_processedFileInfo.CTime : NULL,\n            (WriteATime && _processedFileInfo.ATimeDefined) ? &_processedFileInfo.ATime : NULL,\n            (WriteMTime && _processedFileInfo.MTimeDefined) ? &_processedFileInfo.MTime : &_utcMTimeDefault);\n      }\n    }\n\n\n    UString fullProcessedPath = _directoryPath + processedPath;\n\n    if(_processedFileInfo.IsDir)\n    {\n      _diskFilePath = fullProcessedPath;\n      if (isAnti)\n        NFile::NDirectory::MyRemoveDirectory(_diskFilePath);\n      return S_OK;\n    }\n\n    if (!_isSplit)\n    {\n    NFile::NFind::CFileInfoW fileInfo;\n    if(NFile::NFind::FindFile(fullProcessedPath, fileInfo))\n    {\n      switch(_overwriteMode)\n      {\n        case NExtract::NOverwriteMode::kSkipExisting:\n          return S_OK;\n        case NExtract::NOverwriteMode::kAskBefore:\n        {\n          Int32 overwiteResult;\n          RINOK(_extractCallback2->AskOverwrite(\n              fullProcessedPath, &fileInfo.MTime, &fileInfo.Size, fullPath,\n              _processedFileInfo.MTimeDefined ? &_processedFileInfo.MTime : NULL,\n              newFileSizeDefined ? &newFileSize : NULL,\n              &overwiteResult))\n\n          switch(overwiteResult)\n          {\n            case NOverwriteAnswer::kCancel:\n              return E_ABORT;\n            case NOverwriteAnswer::kNo:\n              return S_OK;\n            case NOverwriteAnswer::kNoToAll:\n              _overwriteMode = NExtract::NOverwriteMode::kSkipExisting;\n              return S_OK;\n            case NOverwriteAnswer::kYesToAll:\n              _overwriteMode = NExtract::NOverwriteMode::kWithoutPrompt;\n              break;\n            case NOverwriteAnswer::kYes:\n              break;\n            case NOverwriteAnswer::kAutoRename:\n              _overwriteMode = NExtract::NOverwriteMode::kAutoRename;\n              break;\n            default:\n              return E_FAIL;\n          }\n        }\n      }\n      if (_overwriteMode == NExtract::NOverwriteMode::kAutoRename)\n      {\n        if (!AutoRenamePath(fullProcessedPath))\n        {\n          UString message = UString(kCantAutoRename) + fullProcessedPath;\n          RINOK(_extractCallback2->MessageError(message));\n          return E_FAIL;\n        }\n      }\n      else if (_overwriteMode == NExtract::NOverwriteMode::kAutoRenameExisting)\n      {\n        UString existPath = fullProcessedPath;\n        if (!AutoRenamePath(existPath))\n        {\n          UString message = kCantAutoRename + fullProcessedPath;\n          RINOK(_extractCallback2->MessageError(message));\n          return E_FAIL;\n        }\n        if(!NFile::NDirectory::MyMoveFile(fullProcessedPath, existPath))\n        {\n          UString message = UString(kCantRenameFile) + fullProcessedPath;\n          RINOK(_extractCallback2->MessageError(message));\n          return E_FAIL;\n        }\n      }\n      else\n        if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath))\n        {\n          UString message = UString(kCantDeleteOutputFile) +  fullProcessedPath;\n          RINOK(_extractCallback2->MessageError(message));\n          return S_OK;\n          // return E_FAIL;\n        }\n    }\n    }\n    if (!isAnti)\n    {\n      _outFileStreamSpec = new COutFileStream;\n      CMyComPtr<ISequentialOutStream> outStreamLoc(_outFileStreamSpec);\n      if (!_outFileStreamSpec->Open(fullProcessedPath, _isSplit ? OPEN_ALWAYS: CREATE_ALWAYS))\n      {\n        // if (::GetLastError() != ERROR_FILE_EXISTS || !isSplit)\n        {\n          UString message = L\"can not open output file \" + fullProcessedPath;\n          RINOK(_extractCallback2->MessageError(message));\n          return S_OK;\n        }\n      }\n      if (_isSplit)\n      {\n        RINOK(_outFileStreamSpec->Seek(_position, STREAM_SEEK_SET, NULL));\n      }\n      _outFileStream = outStreamLoc;\n      *outStream = outStreamLoc.Detach();\n    }\n    _diskFilePath = fullProcessedPath;\n  }\n  else\n  {\n    *outStream = NULL;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode)\n{\n  COM_TRY_BEGIN\n  _extractMode = false;\n  switch (askExtractMode)\n  {\n    case NArchive::NExtract::NAskMode::kExtract:\n      _extractMode = true;\n  };\n  return _extractCallback2->PrepareOperation(_filePath, _processedFileInfo.IsDir,\n      askExtractMode, _isSplit ? &_position: 0);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult)\n{\n  COM_TRY_BEGIN\n  switch(operationResult)\n  {\n    case NArchive::NExtract::NOperationResult::kOK:\n    case NArchive::NExtract::NOperationResult::kUnSupportedMethod:\n    case NArchive::NExtract::NOperationResult::kCRCError:\n    case NArchive::NExtract::NOperationResult::kDataError:\n      break;\n    default:\n      _outFileStream.Release();\n      return E_FAIL;\n  }\n  if (_outFileStream != NULL)\n  {\n    _outFileStreamSpec->SetTime(\n        (WriteCTime && _processedFileInfo.CTimeDefined) ? &_processedFileInfo.CTime : NULL,\n        (WriteATime && _processedFileInfo.ATimeDefined) ? &_processedFileInfo.ATime : NULL,\n        (WriteMTime && _processedFileInfo.MTimeDefined) ? &_processedFileInfo.MTime : &_utcMTimeDefault);\n    _curSize = _outFileStreamSpec->ProcessedSize;\n    RINOK(_outFileStreamSpec->Close());\n    _outFileStream.Release();\n  }\n  UnpackSize += _curSize;\n  if (_processedFileInfo.IsDir)\n    NumFolders++;\n  else\n    NumFiles++;\n\n  if (_extractMode && _processedFileInfo.AttributesAreDefined)\n    NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attributes);\n  RINOK(_extractCallback2->SetOperationResult(operationResult, _encrypted));\n  return S_OK;\n  COM_TRY_END\n}\n\n/*\nSTDMETHODIMP CArchiveExtractCallback::GetInStream(\n    const wchar_t *name, ISequentialInStream **inStream)\n{\n  COM_TRY_BEGIN\n  CInFileStream *inFile = new CInFileStream;\n  CMyComPtr<ISequentialInStream> inStreamTemp = inFile;\n  if (!inFile->Open(_srcDirectoryPrefix + name))\n    return ::GetLastError();\n  *inStream = inStreamTemp.Detach();\n  return S_OK;\n  COM_TRY_END\n}\n*/\n\nSTDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password)\n{\n  COM_TRY_BEGIN\n  if (!_cryptoGetTextPassword)\n  {\n    RINOK(_extractCallback2.QueryInterface(IID_ICryptoGetTextPassword,\n        &_cryptoGetTextPassword));\n  }\n  return _cryptoGetTextPassword->CryptoGetTextPassword(password);\n  COM_TRY_END\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveExtractCallback.h",
    "content": "// ArchiveExtractCallback.h\n\n#ifndef __ARCHIVEEXTRACTCALLBACK_H\n#define __ARCHIVEEXTRACTCALLBACK_H\n\n#include \"../../Archive/IArchive.h\"\n#include \"IFileExtractCallback.h\"\n\n#include \"Common/MyString.h\"\n#include \"Common/MyCom.h\"\n\n#include \"../../Common/FileStreams.h\"\n#include \"../../Common/ProgressUtils.h\"\n#include \"../../IPassword.h\"\n\n#include \"ExtractMode.h\"\n\nclass CArchiveExtractCallback:\n  public IArchiveExtractCallback,\n  // public IArchiveVolumeExtractCallback,\n  public ICryptoGetTextPassword,\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP2(ICryptoGetTextPassword, ICompressProgressInfo)\n  // COM_INTERFACE_ENTRY(IArchiveVolumeExtractCallback)\n\n  INTERFACE_IArchiveExtractCallback(;)\n\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n\n  // IArchiveVolumeExtractCallback\n  // STDMETHOD(GetInStream)(const wchar_t *name, ISequentialInStream **inStream);\n\n  // ICryptoGetTextPassword\n  STDMETHOD(CryptoGetTextPassword)(BSTR *aPassword);\n\nprivate:\n  CMyComPtr<IInArchive> _archiveHandler;\n  CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2;\n  CMyComPtr<ICompressProgressInfo> _compressProgress;\n  CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword;\n  UString _directoryPath;\n  NExtract::NPathMode::EEnum _pathMode;\n  NExtract::NOverwriteMode::EEnum _overwriteMode;\n\n  UString _filePath;\n  UInt64 _position;\n  bool _isSplit;\n\n  UString _diskFilePath;\n\n  bool _extractMode;\n\n  bool WriteCTime;\n  bool WriteATime;\n  bool WriteMTime;\n\n  bool _encrypted;\n\n  struct CProcessedFileInfo\n  {\n    FILETIME CTime;\n    FILETIME ATime;\n    FILETIME MTime;\n    UInt32 Attributes;\n  \n    bool CTimeDefined;\n    bool ATimeDefined;\n    bool MTimeDefined;\n\n    bool IsDir;\n    bool AttributesAreDefined;\n  } _processedFileInfo;\n\n  UInt64 _curSize;\n  COutFileStream *_outFileStreamSpec;\n  CMyComPtr<ISequentialOutStream> _outFileStream;\n  UStringVector _removePathParts;\n\n  UString _itemDefaultName;\n  FILETIME _utcMTimeDefault;\n  UInt32 _attributesDefault;\n  bool _stdOutMode;\n\n  void CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath);\n  HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined);\npublic:\n  CArchiveExtractCallback():\n      WriteCTime(true),\n      WriteATime(true),\n      WriteMTime(true),\n      _multiArchives(false)\n  {\n    LocalProgressSpec = new CLocalProgress();\n    _localProgress = LocalProgressSpec;\n  }\n\n  CLocalProgress *LocalProgressSpec;\n  CMyComPtr<ICompressProgressInfo> _localProgress;\n  UInt64 _packTotal;\n  UInt64 _unpTotal;\n\n  bool _multiArchives;\n  UInt64 NumFolders;\n  UInt64 NumFiles;\n  UInt64 UnpackSize;\n  \n  void InitForMulti(bool multiArchives,\n      NExtract::NPathMode::EEnum pathMode,\n      NExtract::NOverwriteMode::EEnum overwriteMode)\n  {\n    _multiArchives = multiArchives; NumFolders = NumFiles = UnpackSize = 0;\n    _pathMode = pathMode;\n    _overwriteMode = overwriteMode;\n  }\n\n  void Init(\n      IInArchive *archiveHandler,\n      IFolderArchiveExtractCallback *extractCallback2,\n      bool stdOutMode,\n      const UString &directoryPath,\n      const UStringVector &removePathParts,\n      const UString &itemDefaultName,\n      const FILETIME &utcMTimeDefault,\n      UInt32 attributesDefault,\n      UInt64 packSize);\n\n  UInt64 _numErrors;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveName.cpp",
    "content": "// ArchiveName.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Windows/FileFind.h\"\n#include \"Windows/FileDir.h\"\n\nusing namespace NWindows;\n\nUString CreateArchiveName(const UString &srcName, bool fromPrev, bool keepName)\n{\n  UString resultName = L\"Archive\";\n  if (fromPrev)\n  {\n    UString dirPrefix;\n    if (NFile::NDirectory::GetOnlyDirPrefix(srcName, dirPrefix))\n    {\n      if (dirPrefix.Length() > 0)\n        if (dirPrefix[dirPrefix.Length() - 1] == WCHAR_PATH_SEPARATOR)\n        {\n          dirPrefix.Delete(dirPrefix.Length() - 1);\n          NFile::NFind::CFileInfoW fileInfo;\n          if (NFile::NFind::FindFile(dirPrefix, fileInfo))\n            resultName = fileInfo.Name;\n        }\n    }\n  }\n  else\n  {\n    NFile::NFind::CFileInfoW fileInfo;\n    if (!NFile::NFind::FindFile(srcName, fileInfo))\n      return resultName;\n    resultName = fileInfo.Name;\n    if (!fileInfo.IsDir() && !keepName)\n    {\n      int dotPos = resultName.ReverseFind('.');\n      if (dotPos > 0)\n      {\n        UString archiveName2 = resultName.Left(dotPos);\n        if (archiveName2.ReverseFind('.') < 0)\n          resultName = archiveName2;\n      }\n    }\n  }\n  return resultName;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveName.h",
    "content": "// ArchiveName.h\n\n#ifndef __ARCHIVENAME_H\n#define __ARCHIVENAME_H\n\n#include \"Common/MyString.h\"\n\nUString CreateArchiveName(const UString &srcName, bool fromPrev, bool keepName);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp",
    "content": "// ArchiveOpenCallback.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ArchiveOpenCallback.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/ComTry.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/FileStreams.h\"\n\nusing namespace NWindows;\n\nSTDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes)\n{\n  COM_TRY_BEGIN\n  if (ReOpenCallback)\n    return ReOpenCallback->SetTotal(files, bytes);\n  if (!Callback)\n    return S_OK;\n  return Callback->Open_SetTotal(files, bytes);\n  COM_TRY_END\n}\n\nSTDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes)\n{\n  COM_TRY_BEGIN\n  if (ReOpenCallback)\n    return ReOpenCallback->SetCompleted(files, bytes);\n  if (!Callback)\n    return S_OK;\n  return Callback->Open_SetCompleted(files, bytes);\n  COM_TRY_END\n}\n  \nSTDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NCOM::CPropVariant prop;\n  if (_subArchiveMode)\n    switch(propID)\n    {\n      case kpidName: prop = _subArchiveName; break;\n    }\n  else\n    switch(propID)\n    {\n      case kpidName:  prop = _fileInfo.Name; break;\n      case kpidIsDir:  prop = _fileInfo.IsDir(); break;\n      case kpidSize:  prop = _fileInfo.Size; break;\n      case kpidAttrib:  prop = (UInt32)_fileInfo.Attrib; break;\n      case kpidCTime:  prop = _fileInfo.CTime; break;\n      case kpidATime:  prop = _fileInfo.ATime; break;\n      case kpidMTime:  prop = _fileInfo.MTime; break;\n    }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nint COpenCallbackImp::FindName(const UString &name)\n{\n  for (int i = 0; i < FileNames.Size(); i++)\n    if (name.CompareNoCase(FileNames[i]) == 0)\n      return i;\n  return -1;\n}\n\nstruct CInFileStreamVol: public CInFileStream\n{\n  UString Name;\n  COpenCallbackImp *OpenCallbackImp;\n  CMyComPtr<IArchiveOpenCallback> OpenCallbackRef;\n  ~CInFileStreamVol()\n  {\n    int index = OpenCallbackImp->FindName(Name);\n    if (index >= 0)\n      OpenCallbackImp->FileNames.Delete(index);\n  }\n};\n\nSTDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStream)\n{\n  COM_TRY_BEGIN\n  if (_subArchiveMode)\n    return S_FALSE;\n  if (Callback)\n  {\n    RINOK(Callback->Open_CheckBreak());\n  }\n  *inStream = NULL;\n  UString fullPath = _folderPrefix + name;\n  if (!NFile::NFind::FindFile(fullPath, _fileInfo))\n    return S_FALSE;\n  if (_fileInfo.IsDir())\n    return S_FALSE;\n  CInFileStreamVol *inFile = new CInFileStreamVol;\n  CMyComPtr<IInStream> inStreamTemp = inFile;\n  if (!inFile->Open(fullPath))\n    return ::GetLastError();\n  *inStream = inStreamTemp.Detach();\n  inFile->Name = name;\n  inFile->OpenCallbackImp = this;\n  inFile->OpenCallbackRef = this;\n  FileNames.Add(name);\n  TotalSize += _fileInfo.Size;\n  return S_OK;\n  COM_TRY_END\n}\n\n#ifndef _NO_CRYPTO\nSTDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password)\n{\n  COM_TRY_BEGIN\n  if (ReOpenCallback)\n  {\n    CMyComPtr<ICryptoGetTextPassword> getTextPassword;\n    ReOpenCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);\n    if (getTextPassword)\n      return getTextPassword->CryptoGetTextPassword(password);\n  }\n  if (!Callback)\n    return E_NOTIMPL;\n  return Callback->Open_CryptoGetTextPassword(password);\n  COM_TRY_END\n}\n#endif\n  \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ArchiveOpenCallback.h",
    "content": "// ArchiveOpenCallback.h\n\n#ifndef __ARCHIVE_OPEN_CALLBACK_H\n#define __ARCHIVE_OPEN_CALLBACK_H\n\n#include \"Common/MyString.h\"\n#include \"Common/MyCom.h\"\n#include \"Windows/FileFind.h\"\n\n#ifndef _NO_CRYPTO\n#include \"../../IPassword.h\"\n#endif\n#include \"../../Archive/IArchive.h\"\n\n#ifdef _NO_CRYPTO\n\n#define INTERFACE_IOpenCallbackUI_Crypto(x)\n\n#else\n\n#define INTERFACE_IOpenCallbackUI_Crypto(x) \\\n  virtual HRESULT Open_CryptoGetTextPassword(BSTR *password) x; \\\n  virtual HRESULT Open_GetPasswordIfAny(UString &password) x; \\\n  virtual bool Open_WasPasswordAsked() x; \\\n  virtual void Open_ClearPasswordWasAskedFlag() x; \\\n  \n#endif\n\n#define INTERFACE_IOpenCallbackUI(x) \\\n  virtual HRESULT Open_CheckBreak() x; \\\n  virtual HRESULT Open_SetTotal(const UInt64 *files, const UInt64 *bytes) x; \\\n  virtual HRESULT Open_SetCompleted(const UInt64 *files, const UInt64 *bytes) x; \\\n  INTERFACE_IOpenCallbackUI_Crypto(x)\n\nstruct IOpenCallbackUI\n{\n  INTERFACE_IOpenCallbackUI(=0)\n};\n\nclass COpenCallbackImp:\n  public IArchiveOpenCallback,\n  public IArchiveOpenVolumeCallback,\n  public IArchiveOpenSetSubArchiveName,\n  #ifndef _NO_CRYPTO\n  public ICryptoGetTextPassword,\n  #endif\n  public CMyUnknownImp\n{\npublic:\n  #ifndef _NO_CRYPTO\n  MY_UNKNOWN_IMP3(\n      IArchiveOpenVolumeCallback,\n      ICryptoGetTextPassword,\n      IArchiveOpenSetSubArchiveName\n      )\n  #else\n  MY_UNKNOWN_IMP2(\n      IArchiveOpenVolumeCallback,\n      IArchiveOpenSetSubArchiveName\n      )\n  #endif\n\n  INTERFACE_IArchiveOpenCallback(;)\n  INTERFACE_IArchiveOpenVolumeCallback(;)\n\n  #ifndef _NO_CRYPTO\n  STDMETHOD(CryptoGetTextPassword)(BSTR *password);\n  #endif\n\n  STDMETHOD(SetSubArchiveName(const wchar_t *name))\n  {\n    _subArchiveMode = true;\n    _subArchiveName = name;\n    return  S_OK;\n  }\n\nprivate:\n  UString _folderPrefix;\n  NWindows::NFile::NFind::CFileInfoW _fileInfo;\n  bool _subArchiveMode;\n  UString _subArchiveName;\npublic:\n  UStringVector FileNames;\n  IOpenCallbackUI *Callback;\n  CMyComPtr<IArchiveOpenCallback> ReOpenCallback;\n  UInt64 TotalSize;\n\n  COpenCallbackImp(): Callback(NULL) {}\n  void Init(const UString &folderPrefix,  const UString &fileName)\n  {\n    _folderPrefix = folderPrefix;\n    if (!NWindows::NFile::NFind::FindFile(_folderPrefix + fileName, _fileInfo))\n      throw 1;\n    FileNames.Clear();\n    _subArchiveMode = false;\n    TotalSize = 0;\n  }\n  int FindName(const UString &name);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/CompressCall.cpp",
    "content": "// CompressCall.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n\n#ifdef __BORLANDC__\n#pragma hdrstop\n#endif\n\n#ifndef WX_PRECOMP\n#include \"wx/wx.h\"\n#endif\n\n\n#include \"CompressCall.h\"\n\n// FIXME #include \"Common/Random.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/MyCom.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/Synchronization.h\"\n// FIXME #include \"Windows/FileMapping.h\"\n#include \"Windows/FileDir.h\"\n\n#include \"../FileManager/ProgramLocation.h\"\n#include \"../FileManager/RegistryUtils.h\"\n\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif // _UNICODE\n\nusing namespace NWindows;\n\nstatic LPCWSTR kShowDialogSwitch = L\" -ad\";\nstatic LPCWSTR kEmailSwitch = L\" -seml.\";\nstatic LPCWSTR kMapSwitch = L\" -i#\";\nstatic LPCWSTR kArchiveNoNameSwitch = L\" -an\";\nstatic LPCWSTR kArchiveTypeSwitch = L\" -t\";\nstatic LPCWSTR kArchiveMapSwitch = L\" -ai#\";\nstatic LPCWSTR kStopSwitchParsing = L\" --\";\nstatic LPCWSTR kLargePagesDisable = L\" -slp-\";\n\nstatic void AddLagePagesSwitch(UString &params)\n{\n#ifdef _WIN32\n  if (!ReadLockMemoryEnable())\n    params += kLargePagesDisable;\n#endif\n}\n\nHRESULT MyCreateProcess(const UString &params,\n    LPCWSTR curDir, bool waitFinish,\n    NWindows::NSynchronization::CBaseEvent *event)\n{\n\tprintf(\"MyCreateProcess: waitFinish=%d event=%p\\n\",(unsigned)waitFinish,event);\n\tprintf(\"\\tparams : %ls\\n\",(const wchar_t*)params);\n\tprintf(\"\\tcurDir : %ls\\n\",(const wchar_t*)curDir);\n\n\twxString cmd(params);\n\twxString memoCurDir = wxGetCwd();\n\n\tif (curDir) {  // FIXME\n\t\twxSetWorkingDirectory(wxString(curDir));\n\t}\n\n\tprintf(\"MyCreateProcess: cmd='%ls'\\n\",(const wchar_t *)cmd);\n\tlong pid = 0;\n\tif (waitFinish) pid = wxExecute(cmd, wxEXEC_SYNC); // FIXME process never ends and stays zombie ...\n\telse            pid = wxExecute(cmd, wxEXEC_ASYNC);\n\n\tif (curDir) {\n\t\twxSetWorkingDirectory(memoCurDir);\n\t}\n\n\t// FIXME if (pid == 0) return E_FAIL;\n\n\treturn S_OK;\n#ifdef _WIN32 // FIXME\n  const UString params2 = params;\n  BOOL result;\n  {\n    STARTUPINFOW startupInfo;\n    startupInfo.cb = sizeof(startupInfo);\n    startupInfo.lpReserved = 0;\n    startupInfo.lpDesktop = 0;\n    startupInfo.lpTitle = 0;\n    startupInfo.dwFlags = 0;\n    startupInfo.cbReserved2 = 0;\n    startupInfo.lpReserved2 = 0;\n    \n    result = ::CreateProcessW(NULL, (LPWSTR)(LPCWSTR)params,\n      NULL, NULL, FALSE, 0, NULL,\n      curDir,\n      &startupInfo, &processInformation);\n  }\n  if (result == 0)\n    return ::GetLastError();\n  else\n  {\n    ::CloseHandle(processInformation.hThread);\n    if (waitFinish)\n      WaitForSingleObject(processInformation.hProcess, INFINITE);\n    else if (event != NULL)\n    {\n      HANDLE handles[] = {processInformation.hProcess, *event };\n      ::WaitForMultipleObjects(sizeof(handles) / sizeof(handles[0]),\n        handles, FALSE, INFINITE);\n    }\n    ::CloseHandle(processInformation.hProcess);\n  }\n  return S_OK;\n#endif\n}\n\nstatic UString GetQuotedString(const UString &s)\n{\n  return UString(L\"\\\"\") + s + UString(L\"\\\"\");\n}\n\nstatic UString Get7zGuiPath()\n{\n  UString path;\n  UString folder;\n  if (GetProgramFolderPath(folder))\n    path += folder;\n#ifdef _WIN32\n  path += L\"7zG.exe\";\n#else\n  path += L\"7zG\";\n#endif\n  return GetQuotedString(path);\n}\n\n#ifdef _WIN32\nstatic HRESULT CreateTempEvent(const wchar_t *name,\n    NSynchronization::CManualResetEvent &event, UString &eventName)\n{\n  CRandom random;\n  random.Init(GetTickCount());\n  for (;;)\n  {\n    int number = random.Generate();\n    wchar_t temp[32];\n    ConvertUInt64ToString((UInt32)number, temp);\n    eventName = name;\n    eventName += temp;\n    RINOK(event.CreateWithName(false, GetSystemString(eventName)));\n    if (::GetLastError() != ERROR_ALREADY_EXISTS)\n      return S_OK;\n    event.Close();\n  }\n}\n\nstatic HRESULT CreateMap(const UStringVector &names,\n    const UString &id,\n    CFileMapping &fileMapping, NSynchronization::CManualResetEvent &event,\n    UString &params)\n{\n  UInt32 extraSize = 2;\n  UInt32 dataSize = 0;\n  for (int i = 0; i < names.Size(); i++)\n    dataSize += (names[i].Length() + 1) * sizeof(wchar_t);\n  UInt32 totalSize = extraSize + dataSize;\n  \n  UString mappingName;\n  \n  CRandom random;\n  random.Init(GetTickCount());\n  for (;;)\n  {\n    int number = random.Generate();\n    wchar_t temp[32];\n    ConvertUInt64ToString(UInt32(number), temp);\n    mappingName = id;\n    mappingName += L\"Mapping\";\n    mappingName += temp;\n    if (!fileMapping.Create(INVALID_HANDLE_VALUE, NULL,\n        PAGE_READWRITE, totalSize, GetSystemString(mappingName)))\n      return E_FAIL;\n    if (::GetLastError() != ERROR_ALREADY_EXISTS)\n      break;\n    fileMapping.Close();\n  }\n  \n  UString eventName;\n  RINOK(CreateTempEvent(id + L\"MappingEndEvent\", event, eventName));\n\n  params += mappingName;\n  params += L\":\";\n  wchar_t string[10];\n  ConvertUInt64ToString(totalSize, string);\n  params += string;\n  \n  params += L\":\";\n  params += eventName;\n\n  LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_WRITE, 0, totalSize);\n  if (data == NULL)\n    return E_FAIL;\n  {\n    wchar_t *curData = (wchar_t *)data;\n    *curData = 0;\n    curData++;\n    for (int i = 0; i < names.Size(); i++)\n    {\n      const UString &s = names[i];\n      memcpy(curData, (const wchar_t *)s, s.Length() * sizeof(wchar_t));\n      curData += s.Length();\n      *curData++ = L'\\0';\n    }\n  }\n  return S_OK;\n}\n#endif\n\nHRESULT CompressFiles(\n    const UString &curDir,\n    const UString &archiveName,\n    const UString &archiveType,\n    const UStringVector &names,\n    // const UString &outFolder,\n    bool email,\n    bool showDialog,\n    bool waitFinish)\n{\n  /*\n  UString curDir;\n  if (names.Size() > 0)\n  {\n    NFile::NDirectory::GetOnlyDirPrefix(names[0], curDir);\n  }\n  */\n  UString params;\n  params = Get7zGuiPath();\n  params += L\" a\";\n#ifdef _WIN32\n  params += kMapSwitch;\n  // params += _fileNames[0];\n  \n  UInt32 extraSize = 2;\n  UInt32 dataSize = 0;\n  for (int i = 0; i < names.Size(); i++)\n    dataSize += (names[i].Length() + 1) * sizeof(wchar_t);\n  UInt32 totalSize = extraSize + dataSize;\n  \n  UString mappingName;\n  \n  CFileMapping fileMapping;\n  CRandom random;\n  random.Init(GetTickCount());\n  for (;;)\n  {\n    int number = random.Generate();\n    wchar_t temp[32];\n    ConvertUInt64ToString(UInt32(number), temp);\n    mappingName = L\"7zCompressMapping\";\n    mappingName += temp;\n    if (!fileMapping.Create(INVALID_HANDLE_VALUE, NULL,\n      PAGE_READWRITE, totalSize, GetSystemString(mappingName)))\n    {\n      // MyMessageBox(IDS_ERROR, 0x02000605);\n      return E_FAIL;\n    }\n    if (::GetLastError() != ERROR_ALREADY_EXISTS)\n      break;\n    fileMapping.Close();\n  }\n  \n  NSynchronization::CManualResetEvent event;\n  UString eventName;\n  RINOK(CreateTempEvent(L\"7zCompressMappingEndEvent\", event, eventName));\n\n  params += mappingName;\n  params += L\":\";\n  wchar_t string[10];\n  ConvertUInt64ToString(totalSize, string);\n  params += string;\n  \n  params += L\":\";\n  params += eventName;\n#else\n  char tempFile[256];\n  static int count = 1000;\n  \n  sprintf(tempFile,\"/tmp/7zCompress_%d_%d.tmp\",(int)getpid(),count++);\n\n  FILE * file = fopen(tempFile,\"w\");\n  if (file)\n  {\n    for (int i = 0; i < names.Size(); i++) {\n\t  fprintf(file,\"%ls\\n\",(const wchar_t *)names[i]);\n\t  printf(\" TMP_%d : '%ls'\\n\",i,(const wchar_t *)names[i]);\n   }\n\n    fclose(file);\n  }\n  params += L\" -i@\";\n  params += GetUnicodeString(tempFile);\n#endif\n\n  if (!archiveType.IsEmpty())\n  {\n    params += kArchiveTypeSwitch;\n    params += archiveType;\n  }\n\n  if (email)\n    params += kEmailSwitch;\n\n  if (showDialog)\n    params += kShowDialogSwitch;\n\n  AddLagePagesSwitch(params);\n\n  params += kStopSwitchParsing;\n  params += L\" \";\n  \n  params += GetQuotedString(archiveName);\n  \n#ifdef _WIN32\n  LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_WRITE, 0, totalSize);\n  if (data == NULL)\n  {\n    // MyMessageBox(IDS_ERROR, 0x02000605);\n    return E_FAIL;\n  }\n  try\n  {\n    wchar_t *curData = (wchar_t *)data;\n    *curData = 0;\n    curData++;\n    for (int i = 0; i < names.Size(); i++)\n    {\n      const UString &unicodeString = names[i];\n      memcpy(curData, (const wchar_t *)unicodeString ,\n        unicodeString .Length() * sizeof(wchar_t));\n      curData += unicodeString.Length();\n      *curData++ = L'\\0';\n    }\n    // MessageBox(0, params, 0, 0);\n    RINOK(MyCreateProcess(params,\n      (curDir.IsEmpty()? 0: (LPCWSTR)curDir),\n      waitFinish, &event));\n  }\n  catch(...)\n  {\n    UnmapViewOfFile(data);\n    throw;\n  }\n  UnmapViewOfFile(data);\n  \n\n  /*\n  CThreadCompressMain *compressor = new CThreadCompressMain();;\n  compressor->FileNames = _fileNames;\n  CThread thread;\n  if (!thread.Create(CThreadCompressMain::MyThreadFunction, compressor))\n  throw 271824;\n  */\n#else\n  printf(\"CompressFiles : -%ls-\\n\",(const wchar_t *)params);\n  HRESULT res = MyCreateProcess(params,\n      (curDir.IsEmpty()? 0: (LPCWSTR)curDir),\n\t  true, /* &event FIXME */ 0);\n  printf(\"CompressFiles : END\\n\");\n\n  remove(tempFile);\n#endif\n  return S_OK;\n}\n\nstatic HRESULT ExtractGroupCommand(const UStringVector &archivePaths,\n    const UString &params)\n{\n  UString params2 = params;\n  AddLagePagesSwitch(params2);\n  params2 += kArchiveNoNameSwitch;\n#ifdef _WIN32\n  params2 += kArchiveMapSwitch;\n  CFileMapping fileMapping;\n  NSynchronization::CManualResetEvent event;\n  RINOK(CreateMap(archivePaths, L\"7zExtract\", fileMapping, event, params2));\n  return MyCreateProcess(params2, 0, false, &event);\n#else\n  char tempFile[256];\n  static int count = 1000;\n  \n  sprintf(tempFile,\"/tmp/7zExtract_%d_%d.tmp\",(int)getpid(),count++);\n\n  FILE * file = fopen(tempFile,\"w\");\n  if (file)\n  {\n    for (int i = 0; i < archivePaths.Size(); i++) {\n\t  fprintf(file,\"%ls\\n\",(const wchar_t *)archivePaths[i]);\n\t  printf(\" TMP_%d : '%ls'\\n\",i,(const wchar_t *)archivePaths[i]);\n    }\n\n    fclose(file);\n  }\n  params2 += L\" -ai@\";\n  params2 += GetUnicodeString(tempFile);\n  printf(\"ExtractGroupCommand : -%ls-\\n\",(const wchar_t *)params2);\n  HRESULT res = MyCreateProcess(params2, 0, true, /* &event FIXME */ 0);\n  printf(\"ExtractGroupCommand : END\\n\");\n\n  remove(tempFile);\n\n  return res;\n#endif\n}\n\nHRESULT ExtractArchives(const UStringVector &archivePaths,\n    const UString &outFolder, bool showDialog)\n{\n  UString params;\n  params = Get7zGuiPath();\n  params += L\" x\";\n  if (!outFolder.IsEmpty())\n  {\n    params += L\" \\\"-o\";\n    params += outFolder;\n    params += L\"\\\"\";\n  }\n  if (showDialog)\n    params += kShowDialogSwitch;\n  return ExtractGroupCommand(archivePaths, params);\n}\n\nHRESULT TestArchives(const UStringVector &archivePaths)\n{\n  UString params;\n  params = Get7zGuiPath();\n  params += L\" t\";\n  return ExtractGroupCommand(archivePaths, params);\n}\n\nHRESULT Benchmark()\n{\n  UString params;\n  params = Get7zGuiPath();\n  params += L\" b\";\n  return MyCreateProcess(params, 0, false, NULL);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/CompressCall.h",
    "content": "// CompressCall.h\n\n#ifndef __COMPRESSCALL_H\n#define __COMPRESSCALL_H\n\n#include \"Common/MyString.h\"\n#include \"Windows/Synchronization.h\"\n\nHRESULT MyCreateProcess(const UString &params,\n   LPCWSTR lpCurrentDirectory, bool waitFinish,\n   NWindows::NSynchronization::CBaseEvent *event);\n\nHRESULT CompressFiles(\n    const UString &curDir,\n    const UString &archiveName,\n    const UString &archiveType,\n    const UStringVector &names,\n    // const UString &outFolder,\n    bool email, bool showDialog, bool waitFinish);\n\nHRESULT ExtractArchives(\n    const UStringVector &archivePaths,\n    const UString &outFolder, bool showDialog);\n\nHRESULT TestArchives(const UStringVector &archivePaths);\n\nHRESULT Benchmark();\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/DefaultName.cpp",
    "content": "// DefaultName.cpp\n\n#include \"StdAfx.h\"\n\n#include \"DefaultName.h\"\n\nstatic UString GetDefaultName3(const UString &fileName,\n    const UString &extension, const UString &addSubExtension)\n{\n  int extLength = extension.Length();\n  int fileNameLength = fileName.Length();\n  if (fileNameLength > extLength + 1)\n  {\n    int dotPos = fileNameLength - (extLength + 1);\n    if (fileName[dotPos] == '.')\n      if (extension.CompareNoCase(fileName.Mid(dotPos + 1)) == 0)\n        return fileName.Left(dotPos) + addSubExtension;\n  }\n  int dotPos = fileName.ReverseFind(L'.');\n  if (dotPos > 0)\n    return fileName.Left(dotPos) + addSubExtension;\n\n  if (addSubExtension.IsEmpty())\n    return fileName + L\"~\";\n  else\n    return fileName + addSubExtension;\n}\n\nUString GetDefaultName2(const UString &fileName,\n    const UString &extension, const UString &addSubExtension)\n{\n  UString name = GetDefaultName3(fileName, extension, addSubExtension);\n  name.TrimRight();\n  return name;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/DefaultName.h",
    "content": "// DefaultName.h\n\n#ifndef __DEFAULTNAME_H\n#define __DEFAULTNAME_H\n\n#include \"Common/MyString.h\"\n\nUString GetDefaultName2(const UString &fileName,\n    const UString &extension, const UString &addSubExtension);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/DirItem.h",
    "content": "// DirItem.h\n\n#ifndef __DIR_ITEM_H\n#define __DIR_ITEM_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Types.h\"\n#include \"../../Archive/IArchive.h\"\n\nstruct CDirItem\n{\n  UInt64 Size;\n  FILETIME CTime;\n  FILETIME ATime;\n  FILETIME MTime;\n  UString Name;\n  UInt32 Attrib;\n  int PhyParent;\n  int LogParent;\n  \n  CDirItem(): PhyParent(-1), LogParent(-1) {}\n  bool IsDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; }\n};\n\nclass CDirItems\n{\n  UStringVector Prefixes;\n  CIntVector PhyParents;\n  CIntVector LogParents;\n\n  UString GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const;\npublic:\n  CObjectVector<CDirItem> Items;\n\n  int GetNumFolders() const { return Prefixes.Size(); }\n  UString GetPhyPath(int index) const;\n  UString GetLogPath(int index) const;\n\n  int AddPrefix(int phyParent, int logParent, const UString &prefix);\n  void DeleteLastPrefix();\n\n  void EnumerateDirectory(int phyParent, int logParent, const UString &phyPrefix,\n    UStringVector &errorPaths, CRecordVector<DWORD> &errorCodes);\n\n  void EnumerateDirItems2(\n    const UString &phyPrefix,\n    const UString &logPrefix,\n    const UStringVector &filePaths,\n    UStringVector &errorPaths, CRecordVector<DWORD> &errorCodes);\n\n  void ReserveDown();\n};\n\nstruct CArcItem\n{\n  UInt64 Size;\n  FILETIME MTime;\n  UString Name;\n  bool IsDir;\n  bool SizeDefined;\n  bool Censored;\n  UInt32 IndexInServer;\n  int TimeType;\n  \n  CArcItem(): IsDir(false), SizeDefined(false), Censored(false), TimeType(-1) {}\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/EnumDirItems.cpp",
    "content": "// EnumDirItems.cpp\n\n#include \"StdAfx.h\"\n\n#include <stdio.h>\n\n#include \"Common/StringConvert.h\"\n#include \"Common/Wildcard.h\"\n#include \"Common/MyCom.h\"\n\n#include \"EnumDirItems.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NName;\n\nvoid AddDirFileInfo(int phyParent, int logParent,\n    const NFind::CFileInfoW &fi, CObjectVector<CDirItem> &dirItems)\n{\n  CDirItem di;\n  di.Size = fi.Size;\n  di.CTime = fi.CTime;\n  di.ATime = fi.ATime;\n  di.MTime = fi.MTime;\n  di.Attrib = fi.Attrib;\n  di.PhyParent = phyParent;\n  di.LogParent = logParent;\n  di.Name = fi.Name;\n  dirItems.Add(di);\n}\n\nUString CDirItems::GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const\n{\n  UString path;\n  int len = name.Length();\n  int i;\n  for (i = index; i >= 0; i = parents[i])\n    len += Prefixes[i].Length();\n  int totalLen = len;\n  wchar_t *p = path.GetBuffer(len);\n  p[len] = 0;\n  len -= name.Length();\n  memcpy(p + len, (const wchar_t *)name, name.Length() * sizeof(wchar_t));\n  for (i = index; i >= 0; i = parents[i])\n  {\n    const UString &s = Prefixes[i];\n    len -= s.Length();\n    memcpy(p + len, (const wchar_t *)s, s.Length() * sizeof(wchar_t));\n  }\n  path.ReleaseBuffer(totalLen);\n  return path;\n}\n\nUString CDirItems::GetPhyPath(int index) const\n{\n  const CDirItem &di = Items[index];\n  return GetPrefixesPath(PhyParents, di.PhyParent, di.Name);\n}\n\nUString CDirItems::GetLogPath(int index) const\n{\n  const CDirItem &di = Items[index];\n  return GetPrefixesPath(LogParents, di.LogParent, di.Name);\n}\n\nvoid CDirItems::ReserveDown()\n{\n  Prefixes.ReserveDown();\n  PhyParents.ReserveDown();\n  LogParents.ReserveDown();\n  Items.ReserveDown();\n}\n\nint CDirItems::AddPrefix(int phyParent, int logParent, const UString &prefix)\n{\n  PhyParents.Add(phyParent);\n  LogParents.Add(logParent);\n  return Prefixes.Add(prefix);\n}\n\nvoid CDirItems::DeleteLastPrefix()\n{\n  PhyParents.DeleteBack();\n  LogParents.DeleteBack();\n  Prefixes.DeleteBack();\n}\n\nvoid CDirItems::EnumerateDirectory(int phyParent, int logParent, const UString &phyPrefix,\n    UStringVector &errorPaths, CRecordVector<DWORD> &errorCodes)\n{\n  NFind::CEnumeratorW enumerator(phyPrefix + (wchar_t)kAnyStringWildcard);\n  for (;;)\n  {\n    NFind::CFileInfoW fi;\n    bool found;\n    if (!enumerator.Next(fi, found))\n    {\n      errorCodes.Add(::GetLastError());\n      errorPaths.Add(phyPrefix);\n      return;\n    }\n    if (!found)\n      break;\n    AddDirFileInfo(phyParent, logParent, fi, Items);\n    if (fi.IsDir())\n    {\n      const UString name2 = fi.Name + (wchar_t)kDirDelimiter;\n      int parent = AddPrefix(phyParent, logParent, name2);\n      EnumerateDirectory(parent, parent, phyPrefix + name2, errorPaths, errorCodes);\n    }\n  }\n}\n\nvoid CDirItems::EnumerateDirItems2(const UString &phyPrefix, const UString &logPrefix,\n    const UStringVector &filePaths, UStringVector &errorPaths, CRecordVector<DWORD> &errorCodes)\n{\n  int phyParent = phyPrefix.IsEmpty() ? -1 : AddPrefix(-1, -1, phyPrefix);\n  int logParent = logPrefix.IsEmpty() ? -1 : AddPrefix(-1, -1, logPrefix);\n\n  for (int i = 0; i < filePaths.Size(); i++)\n  {\n    const UString &filePath = filePaths[i];\n    NFind::CFileInfoW fi;\n    const UString phyPath = phyPrefix + filePath;\n    if (!NFind::FindFile(phyPath, fi))\n    {\n      errorCodes.Add(::GetLastError());\n      errorPaths.Add(phyPath);\n      continue;\n    }\n    int delimiter = filePath.ReverseFind((wchar_t)kDirDelimiter);\n    UString phyPrefixCur;\n    int phyParentCur = phyParent;\n    if (delimiter >= 0)\n    {\n      phyPrefixCur = filePath.Left(delimiter + 1);\n      phyParentCur = AddPrefix(phyParent, logParent, phyPrefixCur);\n    }\n    AddDirFileInfo(phyParentCur, logParent, fi, Items);\n    if (fi.IsDir())\n    {\n      const UString name2 = fi.Name + (wchar_t)kDirDelimiter;\n      int parent = AddPrefix(phyParentCur, logParent, name2);\n      EnumerateDirectory(parent, parent, phyPrefix + phyPrefixCur + name2, errorPaths, errorCodes);\n    }\n  }\n  ReserveDown();\n}\n\nstatic HRESULT EnumerateDirItems(const NWildcard::CCensorNode &curNode,\n    int phyParent, int logParent, const UString &phyPrefix,\n    const UStringVector &addArchivePrefix,\n    CDirItems &dirItems,\n    bool enterToSubFolders,\n    IEnumDirItemCallback *callback,\n    UStringVector &errorPaths,\n    CRecordVector<DWORD> &errorCodes);\n\nstatic HRESULT EnumerateDirItems_Spec(const NWildcard::CCensorNode &curNode,\n    int phyParent, int logParent, const UString &curFolderName,\n    const UString &phyPrefix,\n    const UStringVector &addArchivePrefix,\n    CDirItems &dirItems,\n    bool enterToSubFolders,\n    IEnumDirItemCallback *callback,\n    UStringVector &errorPaths,\n    CRecordVector<DWORD> &errorCodes)\n  \n{\n  const UString name2 = curFolderName + (wchar_t)kDirDelimiter;\n  int parent = dirItems.AddPrefix(phyParent, logParent, name2);\n  int numItems = dirItems.Items.Size();\n  HRESULT res = EnumerateDirItems(curNode, parent, parent, phyPrefix + name2,\n    addArchivePrefix, dirItems, enterToSubFolders, callback, errorPaths, errorCodes);\n  if (numItems == dirItems.Items.Size())\n    dirItems.DeleteLastPrefix();\n  return res;\n}\n\n\nstatic HRESULT EnumerateDirItems(const NWildcard::CCensorNode &curNode,\n    int phyParent, int logParent, const UString &phyPrefix,\n    const UStringVector &addArchivePrefix,  // prefix from curNode\n    CDirItems &dirItems,\n    bool enterToSubFolders,\n    IEnumDirItemCallback *callback,\n    UStringVector &errorPaths,\n    CRecordVector<DWORD> &errorCodes)\n{\n  if (!enterToSubFolders)\n    if (curNode.NeedCheckSubDirs())\n      enterToSubFolders = true;\n  if (callback)\n    RINOK(callback->ScanProgress(dirItems.GetNumFolders(), dirItems.Items.Size(), phyPrefix));\n\n  // try direct_names case at first\n  if (addArchivePrefix.IsEmpty() && !enterToSubFolders)\n  {\n    // check that all names are direct\n    int i;\n    for (i = 0; i < curNode.IncludeItems.Size(); i++)\n    {\n      const NWildcard::CItem &item = curNode.IncludeItems[i];\n      if (item.Recursive || item.PathParts.Size() != 1)\n        break;\n      const UString &name = item.PathParts.Front();\n      if (name.IsEmpty() || DoesNameContainWildCard(name))\n        break;\n    }\n    if (i == curNode.IncludeItems.Size())\n    {\n      // all names are direct (no wildcards)\n      // so we don't need file_system's dir enumerator\n      CRecordVector<bool> needEnterVector;\n      for (i = 0; i < curNode.IncludeItems.Size(); i++)\n      {\n        const NWildcard::CItem &item = curNode.IncludeItems[i];\n        const UString &name = item.PathParts.Front();\n        const UString fullPath = phyPrefix + name;\n        NFind::CFileInfoW fi;\n        if (!NFind::FindFile(fullPath, fi))\n        {\n          errorCodes.Add(::GetLastError());\n          errorPaths.Add(fullPath);\n          continue;\n        }\n        bool isDir = fi.IsDir();\n        if (isDir && !item.ForDir || !isDir && !item.ForFile)\n        {\n          errorCodes.Add((DWORD)E_FAIL);\n          errorPaths.Add(fullPath);\n          continue;\n        }\n        {\n          UStringVector pathParts;\n          pathParts.Add(fi.Name);\n          if (curNode.CheckPathToRoot(false, pathParts, !isDir))\n            continue;\n        }\n        AddDirFileInfo(phyParent, logParent, fi, dirItems.Items);\n        if (!isDir)\n          continue;\n        \n        UStringVector addArchivePrefixNew;\n        const NWildcard::CCensorNode *nextNode = 0;\n        int index = curNode.FindSubNode(name);\n        if (index >= 0)\n        {\n          for (int t = needEnterVector.Size(); t <= index; t++)\n            needEnterVector.Add(true);\n          needEnterVector[index] = false;\n          nextNode = &curNode.SubNodes[index];\n        }\n        else\n        {\n          nextNode = &curNode;\n          addArchivePrefixNew.Add(name); // don't change it to fi.Name. It's for shortnames support\n        }\n\n        RINOK(EnumerateDirItems_Spec(*nextNode, phyParent, logParent, fi.Name, phyPrefix,\n            addArchivePrefixNew, dirItems, true, callback, errorPaths, errorCodes));\n      }\n      for (i = 0; i < curNode.SubNodes.Size(); i++)\n      {\n        if (i < needEnterVector.Size())\n          if (!needEnterVector[i])\n            continue;\n        const NWildcard::CCensorNode &nextNode = curNode.SubNodes[i];\n        const UString fullPath = phyPrefix + nextNode.Name;\n        NFind::CFileInfoW fi;\n        if (!NFind::FindFile(fullPath, fi))\n        {\n          if (!nextNode.AreThereIncludeItems())\n            continue;\n          errorCodes.Add(::GetLastError());\n          errorPaths.Add(fullPath);\n          continue;\n        }\n        if (!fi.IsDir())\n        {\n          errorCodes.Add((DWORD)E_FAIL);\n          errorPaths.Add(fullPath);\n          continue;\n        }\n\n        RINOK(EnumerateDirItems_Spec(nextNode, phyParent, logParent, fi.Name, phyPrefix,\n            UStringVector(), dirItems, false, callback, errorPaths, errorCodes));\n      }\n      return S_OK;\n    }\n  }\n\n\n  NFind::CEnumeratorW enumerator(phyPrefix + wchar_t(kAnyStringWildcard));\n  for (int ttt = 0; ; ttt++)\n  {\n    NFind::CFileInfoW fi;\n    bool found;\n    if (!enumerator.Next(fi, found))\n    {\n      errorCodes.Add(::GetLastError());\n      errorPaths.Add(phyPrefix);\n      break;\n    }\n    if (!found)\n      break;\n\n    if (callback && (ttt & 0xFF) == 0xFF)\n      RINOK(callback->ScanProgress(dirItems.GetNumFolders(), dirItems.Items.Size(), phyPrefix));\n    const UString &name = fi.Name;\n    bool enterToSubFolders2 = enterToSubFolders;\n    UStringVector addArchivePrefixNew = addArchivePrefix;\n    addArchivePrefixNew.Add(name);\n    {\n      UStringVector addArchivePrefixNewTemp(addArchivePrefixNew);\n      if (curNode.CheckPathToRoot(false, addArchivePrefixNewTemp, !fi.IsDir()))\n        continue;\n    }\n    if (curNode.CheckPathToRoot(true, addArchivePrefixNew, !fi.IsDir()))\n    {\n      AddDirFileInfo(phyParent, logParent, fi, dirItems.Items);\n      if (fi.IsDir())\n        enterToSubFolders2 = true;\n    }\n    if (!fi.IsDir())\n      continue;\n\n    const NWildcard::CCensorNode *nextNode = 0;\n    if (addArchivePrefix.IsEmpty())\n    {\n      int index = curNode.FindSubNode(name);\n      if (index >= 0)\n        nextNode = &curNode.SubNodes[index];\n    }\n    if (!enterToSubFolders2 && nextNode == 0)\n      continue;\n\n    addArchivePrefixNew = addArchivePrefix;\n    if (nextNode == 0)\n    {\n      nextNode = &curNode;\n      addArchivePrefixNew.Add(name);\n    }\n\n    RINOK(EnumerateDirItems_Spec(*nextNode, phyParent, logParent, name, phyPrefix,\n        addArchivePrefixNew, dirItems, enterToSubFolders2, callback, errorPaths, errorCodes));\n  }\n  return S_OK;\n}\n\nHRESULT EnumerateItems(\n    const NWildcard::CCensor &censor,\n    CDirItems &dirItems,\n    IEnumDirItemCallback *callback,\n    UStringVector &errorPaths,\n    CRecordVector<DWORD> &errorCodes)\n{\n  for (int i = 0; i < censor.Pairs.Size(); i++)\n  {\n    const NWildcard::CPair &pair = censor.Pairs[i];\n    int phyParent = pair.Prefix.IsEmpty() ? -1 : dirItems.AddPrefix(-1, -1, pair.Prefix);\n    RINOK(EnumerateDirItems(pair.Head, phyParent, -1, pair.Prefix, UStringVector(), dirItems, false,\n        callback, errorPaths, errorCodes));\n  }\n  dirItems.ReserveDown();\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/EnumDirItems.h",
    "content": "// EnumDirItems.h\n\n#ifndef __ENUM_DIR_ITEMS_H\n#define __ENUM_DIR_ITEMS_H\n\n#include \"Common/Wildcard.h\"\n#include \"Windows/FileFind.h\"\n#include \"DirItem.h\"\n\nvoid AddDirFileInfo(int phyParent, int logParent,\n    const NWindows::NFile::NFind::CFileInfoW &fi, CObjectVector<CDirItem> &dirItems);\n\nstruct IEnumDirItemCallback\n{\n  virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, const wchar_t *path) = 0;\n};\n\nHRESULT EnumerateItems(\n    const NWildcard::CCensor &censor,\n    CDirItems &dirItems,\n    IEnumDirItemCallback *callback,\n    UStringVector &errorPaths,\n    CRecordVector<DWORD> &errorCodes);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ExitCode.h",
    "content": "// ExitCode.h\n\n#ifndef __EXIT_CODE_H\n#define __EXIT_CODE_H\n\nnamespace NExitCode {\n\nenum EEnum {\n\n  kSuccess       = 0,     // Successful operation\n  kWarning       = 1,     // Non fatal error(s) occurred\n  kFatalError    = 2,     // A fatal error occurred\n  // kCRCError      = 3,     // A CRC error occurred when unpacking\n  // kLockedArchive = 4,     // Attempt to modify an archive previously locked\n  // kWriteError    = 5,     // Write to disk error\n  // kOpenError     = 6,     // Open file error\n  kUserError     = 7,     // Command line option error\n  kMemoryError   = 8,     // Not enough memory for operation\n  // kCreateFileError = 9,     // Create file error\n  \n  kUserBreak     = 255   // User stopped the process\n\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/Extract.cpp",
    "content": "// Extract.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Extract.h\"\n\n#include \"Windows/Defs.h\"\n#include \"Windows/FileDir.h\"\n\n#include \"OpenArchive.h\"\n#include \"SetProperties.h\"\n\nusing namespace NWindows;\n\nstatic HRESULT DecompressArchive(\n    IInArchive *archive,\n    UInt64 packSize,\n    const NWildcard::CCensorNode &wildcardCensor,\n    const CExtractOptions &options,\n    IExtractCallbackUI *callback,\n    CArchiveExtractCallback *extractCallbackSpec,\n    UString &errorMessage)\n{\n  CRecordVector<UInt32> realIndices;\n  UInt32 numItems;\n  RINOK(archive->GetNumberOfItems(&numItems));\n\n  for(UInt32 i = 0; i < numItems; i++)\n  {\n    UString filePath;\n    RINOK(GetArchiveItemPath(archive, i, options.DefaultItemName, filePath));\n    bool isFolder;\n    RINOK(IsArchiveItemFolder(archive, i, isFolder));\n    if (!wildcardCensor.CheckPath(filePath, !isFolder))\n      continue;\n    realIndices.Add(i);\n  }\n  if (realIndices.Size() == 0)\n  {\n    callback->ThereAreNoFiles();\n    return S_OK;\n  }\n\n  UStringVector removePathParts;\n\n  UString outDir = options.OutputDir;\n  outDir.Replace(L\"*\", options.DefaultItemName);\n  #ifdef _WIN32\n  outDir.TrimRight();\n  #endif\n\n  if(!outDir.IsEmpty())\n    if(!NFile::NDirectory::CreateComplexDirectory(outDir))\n    {\n      HRESULT res = ::GetLastError();\n      if (res == S_OK)\n        res = E_FAIL;\n      errorMessage = ((UString)L\"Can not create output directory \") + outDir;\n      return res;\n    }\n\n  extractCallbackSpec->Init(\n      archive,\n      callback,\n      options.StdOutMode,\n      outDir,\n      removePathParts,\n      options.DefaultItemName,\n      options.ArchiveFileInfo.MTime,\n      options.ArchiveFileInfo.Attrib,\n      packSize);\n\n  #ifdef COMPRESS_MT\n  RINOK(SetProperties(archive, options.Properties));\n  #endif\n\n  HRESULT result = archive->Extract(&realIndices.Front(),\n    realIndices.Size(), options.TestMode? 1: 0, extractCallbackSpec);\n\n  return callback->ExtractResult(result);\n}\n\nHRESULT DecompressArchives(\n    CCodecs *codecs, const CIntVector &formatIndices,\n    UStringVector &archivePaths, UStringVector &archivePathsFull,\n    const NWildcard::CCensorNode &wildcardCensor,\n    const CExtractOptions &optionsSpec,\n    IOpenCallbackUI *openCallback,\n    IExtractCallbackUI *extractCallback,\n    UString &errorMessage,\n    CDecompressStat &stat)\n{\n  stat.Clear();\n  CExtractOptions options = optionsSpec;\n  int i;\n  UInt64 totalPackSize = 0;\n  CRecordVector<UInt64> archiveSizes;\n  for (i = 0; i < archivePaths.Size(); i++)\n  {\n    const UString &archivePath = archivePaths[i];\n    NFile::NFind::CFileInfoW fi;\n    if (!NFile::NFind::FindFile(archivePath, fi))\n      throw \"there is no such archive\";\n    if (fi.IsDir())\n      throw \"can't decompress folder\";\n    archiveSizes.Add(fi.Size);\n    totalPackSize += fi.Size;\n  }\n  CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;\n  CMyComPtr<IArchiveExtractCallback> ec(extractCallbackSpec);\n  bool multi = (archivePaths.Size() > 1);\n  extractCallbackSpec->InitForMulti(multi, options.PathMode, options.OverwriteMode);\n  if (multi)\n  {\n    RINOK(extractCallback->SetTotal(totalPackSize));\n  }\n  for (i = 0; i < archivePaths.Size(); i++)\n  {\n    const UString &archivePath = archivePaths[i];\n    NFile::NFind::CFileInfoW fi;\n    if (!NFile::NFind::FindFile(archivePath, fi))\n      throw \"there is no such archive\";\n\n    if (fi.IsDir())\n      throw \"there is no such archive\";\n\n    options.ArchiveFileInfo = fi;\n\n    #ifndef _NO_CRYPTO\n    openCallback->Open_ClearPasswordWasAskedFlag();\n    #endif\n\n    RINOK(extractCallback->BeforeOpen(archivePath));\n    CArchiveLink archiveLink;\n\n    CIntVector formatIndices2 = formatIndices;\n    #ifndef _SFX\n    if (formatIndices.IsEmpty())\n    {\n      int pos = archivePath.ReverseFind(L'.');\n      if (pos >= 0)\n      {\n        UString s = archivePath.Mid(pos + 1);\n        int index = codecs->FindFormatForExtension(s);\n        if (index >= 0 && s == L\"001\")\n        {\n          s = archivePath.Left(pos);\n          pos = s.ReverseFind(L'.');\n          if (pos >= 0)\n          {\n            int index2 = codecs->FindFormatForExtension(s.Mid(pos + 1));\n            if (index2 >= 0 && s.CompareNoCase(L\"rar\") != 0)\n            {\n              formatIndices2.Add(index2);\n              formatIndices2.Add(index);\n            }\n          }\n        }\n      }\n    }\n    #endif\n    HRESULT result = MyOpenArchive(codecs, formatIndices2, archivePath, archiveLink, openCallback);\n    if (result == E_ABORT)\n      return result;\n\n    bool crypted = false;\n    #ifndef _NO_CRYPTO\n    crypted = openCallback->Open_WasPasswordAsked();\n    #endif\n\n    RINOK(extractCallback->OpenResult(archivePath, result, crypted));\n    if (result != S_OK)\n      continue;\n\n    for (int v = 0; v < archiveLink.VolumePaths.Size(); v++)\n    {\n      int index = archivePathsFull.FindInSorted(archiveLink.VolumePaths[v]);\n      if (index >= 0 && index > i)\n      {\n        archivePaths.Delete(index);\n        archivePathsFull.Delete(index);\n        totalPackSize -= archiveSizes[index];\n        archiveSizes.Delete(index);\n      }\n    }\n    if (archiveLink.VolumePaths.Size() != 0)\n    {\n      totalPackSize += archiveLink.VolumesSize;\n      RINOK(extractCallback->SetTotal(totalPackSize));\n    }\n\n    #ifndef _NO_CRYPTO\n    UString password;\n    RINOK(openCallback->Open_GetPasswordIfAny(password));\n    if (!password.IsEmpty())\n    {\n      RINOK(extractCallback->SetPassword(password));\n    }\n    #endif\n\n    options.DefaultItemName = archiveLink.GetDefaultItemName();\n    RINOK(DecompressArchive(\n        archiveLink.GetArchive(),\n        fi.Size + archiveLink.VolumesSize,\n        wildcardCensor, options, extractCallback, extractCallbackSpec, errorMessage));\n    extractCallbackSpec->LocalProgressSpec->InSize += fi.Size +\n        archiveLink.VolumesSize;\n    extractCallbackSpec->LocalProgressSpec->OutSize = extractCallbackSpec->UnpackSize;\n    if (!errorMessage.IsEmpty())\n      return E_FAIL;\n  }\n  stat.NumFolders = extractCallbackSpec->NumFolders;\n  stat.NumFiles = extractCallbackSpec->NumFiles;\n  stat.UnpackSize = extractCallbackSpec->UnpackSize;\n  stat.NumArchives = archivePaths.Size();\n  stat.PackSize = extractCallbackSpec->LocalProgressSpec->InSize;\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/Extract.h",
    "content": "// Extract.h\n\n#ifndef __EXTRACT_H\n#define __EXTRACT_H\n\n#include \"Common/Wildcard.h\"\n#include \"Windows/FileFind.h\"\n\n#include \"../../Archive/IArchive.h\"\n\n#include \"ArchiveExtractCallback.h\"\n#include \"ArchiveOpenCallback.h\"\n#include \"ExtractMode.h\"\n#include \"Property.h\"\n\n#include \"../Common/LoadCodecs.h\"\n\nclass CExtractOptions\n{\npublic:\n  bool StdOutMode;\n  bool TestMode;\n  NExtract::NPathMode::EEnum PathMode;\n\n  UString OutputDir;\n  bool YesToAll;\n  UString DefaultItemName;\n  NWindows::NFile::NFind::CFileInfoW ArchiveFileInfo;\n  \n  // bool ShowDialog;\n  // bool PasswordEnabled;\n  // UString Password;\n  #ifdef COMPRESS_MT\n  CObjectVector<CProperty> Properties;\n  #endif\n\n  NExtract::NOverwriteMode::EEnum OverwriteMode;\n\n  #ifdef EXTERNAL_CODECS\n  CCodecs *Codecs;\n  #endif\n\n  CExtractOptions():\n      StdOutMode(false),\n      YesToAll(false),\n      TestMode(false),\n      PathMode(NExtract::NPathMode::kFullPathnames),\n      OverwriteMode(NExtract::NOverwriteMode::kAskBefore)\n      {}\n\n  /*\n    bool FullPathMode() const { return (ExtractMode == NExtractMode::kTest) ||\n    (ExtractMode == NExtractMode::kFullPath); }\n  */\n};\n\nstruct CDecompressStat\n{\n  UInt64 NumArchives;\n  UInt64 UnpackSize;\n  UInt64 PackSize;\n  UInt64 NumFolders;\n  UInt64 NumFiles;\n  void Clear() { NumArchives = PackSize = UnpackSize = NumFolders = NumFiles = 0; }\n};\n\nHRESULT DecompressArchives(\n    CCodecs *codecs, const CIntVector &formatIndices,\n    UStringVector &archivePaths, UStringVector &archivePathsFull,\n    const NWildcard::CCensorNode &wildcardCensor,\n    const CExtractOptions &options,\n    IOpenCallbackUI *openCallback,\n    IExtractCallbackUI *extractCallback,\n    UString &errorMessage,\n    CDecompressStat &stat);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ExtractMode.h",
    "content": "// ExtractMode.h\n\n#ifndef __EXTRACT_MODE_H\n#define __EXTRACT_MODE_H\n\nnamespace NExtract {\n  \n  namespace NPathMode\n  {\n    enum EEnum\n    {\n      kFullPathnames,\n      kCurrentPathnames,\n      kNoPathnames\n    };\n  }\n  \n  namespace NOverwriteMode\n  {\n    enum EEnum\n    {\n      kAskBefore,\n      kWithoutPrompt,\n      kSkipExisting,\n      kAutoRename,\n      kAutoRenameExisting\n    };\n  }\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ExtractingFilePath.cpp",
    "content": "// ExtractingFilePath.cpp\n\n#include \"StdAfx.h\"\n#include \"ExtractingFilePath.h\"\n\nstatic UString ReplaceIncorrectChars(const UString &s)\n{\n  #ifdef _WIN32\n  UString res;\n  for (int i = 0; i < s.Length(); i++)\n  {\n    wchar_t c = s[i];\n    if (c < 0x20 || c == '*' || c == '?' || c == '<' || c == '>'  || c == '|' || c == ':' || c == '\"')\n      c = '_';\n    res += c;\n  }\n  res.TrimRight();\n  return res;\n  #else\n  return s;\n  #endif\n}\n\n#ifdef _WIN32\nstatic const wchar_t *g_ReservedNames[] =\n{\n  L\"CON\", L\"PRN\", L\"AUX\", L\"NUL\"\n};\n\nstatic bool CheckTail(const UString &name, int len)\n{\n  int dotPos = name.Find(L'.');\n  if (dotPos < 0)\n    dotPos = name.Length();\n  UString s = name.Left(dotPos);\n  s.TrimRight();\n  return (s.Length() != len);\n}\n\nstatic bool CheckNameNum(const UString &name, const wchar_t *reservedName)\n{\n  int len = MyStringLen(reservedName);\n  if (name.Length() <= len)\n    return true;\n  if (name.Left(len).CompareNoCase(reservedName) != 0)\n    return true;\n  wchar_t c = name[len];\n  if (c < L'0' || c > L'9')\n    return true;\n  return CheckTail(name, len + 1);\n}\n\nstatic bool IsSupportedName(const UString &name)\n{\n  for (int i = 0; i < sizeof(g_ReservedNames) / sizeof(g_ReservedNames[0]); i++)\n  {\n    const wchar_t *reservedName = g_ReservedNames[i];\n    int len = MyStringLen(reservedName);\n    if (name.Length() < len)\n      continue;\n    if (name.Left(len).CompareNoCase(reservedName) != 0)\n      continue;\n    if (!CheckTail(name, len))\n      return false;\n  }\n  if (!CheckNameNum(name, L\"COM\"))\n    return false;\n  return CheckNameNum(name, L\"LPT\");\n}\n#endif\n\nstatic UString GetCorrectFileName(const UString &path)\n{\n  if (path == L\"..\" || path == L\".\")\n    return UString();\n  return ReplaceIncorrectChars(path);\n}\n\nvoid MakeCorrectPath(UStringVector &pathParts)\n{\n  for (int i = 0; i < pathParts.Size();)\n  {\n    UString &s = pathParts[i];\n    s = GetCorrectFileName(s);\n    if (s.IsEmpty())\n      pathParts.Delete(i);\n    else\n    {\n      #ifdef _WIN32\n      if (!IsSupportedName(s))\n        s = (UString)L\"_\" + s;\n      #endif\n      i++;\n    }\n  }\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ExtractingFilePath.h",
    "content": "// ExtractingFilePath.h\n\n#ifndef __EXTRACTINGFILEPATH_H\n#define __EXTRACTINGFILEPATH_H\n\n#include \"Common/MyString.h\"\n\nvoid MakeCorrectPath(UStringVector &pathParts);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/HandlerLoader.h",
    "content": "// HandlerLoader.h\n\n#ifndef __HANDLERLOADER_H\n#define __HANDLERLOADER_H\n\n#include \"../../ICoder.h\"\n#include \"Windows/DLL.h\"\n\ntypedef UInt32 (WINAPI * CreateObjectFunc)(\n    const GUID *clsID,\n    const GUID *interfaceID,\n    void **outObject);\n\nclass CHandlerLoader: public NWindows::NDLL::CLibrary\n{\npublic:\n  HRESULT CreateHandler(LPCWSTR filepath, REFGUID clsID,\n      void **archive, bool outHandler)\n  {\n    if (!Load(filepath))\n      return GetLastError();\n    CreateObjectFunc createObject = (CreateObjectFunc)\n        GetProcAddress(\"CreateObject\");\n    if (createObject == NULL)\n    {\n      HRESULT res = ::GetLastError();\n      Free();\n      return res;\n    }\n    HRESULT res = createObject(&clsID,\n        outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive);\n    if (res != 0)\n      Free();\n    return res;\n  }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/IFileExtractCallback.h",
    "content": "// IFileExtractCallback.h\n\n#ifndef __IFILEEXTRACTCALLBACK_H\n#define __IFILEEXTRACTCALLBACK_H\n\n#include \"Common/MyString.h\"\n#include \"../../IDecl.h\"\n\nnamespace NOverwriteAnswer\n{\n  enum EEnum\n  {\n    kYes,\n    kYesToAll,\n    kNo,\n    kNoToAll,\n    kAutoRename,\n    kCancel\n  };\n}\n\nDECL_INTERFACE_SUB(IFolderArchiveExtractCallback, IProgress, 0x01, 0x07)\n{\npublic:\n  STDMETHOD(AskOverwrite)(\n      const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,\n      const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,\n      Int32 *answer) PURE;\n  STDMETHOD(PrepareOperation)(const wchar_t *name, bool isFolder, Int32 askExtractMode, const UInt64 *position) PURE;\n  STDMETHOD(MessageError)(const wchar_t *message) PURE;\n  STDMETHOD(SetOperationResult)(Int32 operationResult, bool encrypted) PURE;\n};\n\nstruct IExtractCallbackUI: IFolderArchiveExtractCallback\n{\n  virtual HRESULT BeforeOpen(const wchar_t *name) = 0;\n  virtual HRESULT OpenResult(const wchar_t *name, HRESULT result, bool encrypted) = 0;\n  virtual HRESULT ThereAreNoFiles() = 0;\n  virtual HRESULT ExtractResult(HRESULT result) = 0;\n\n  #ifndef _NO_CRYPTO\n  virtual HRESULT SetPassword(const UString &password) = 0;\n  #endif\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/LoadCodecs.cpp",
    "content": "// LoadCodecs.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LoadCodecs.h\"\n\n#include \"../../../Common/MyCom.h\"\n#ifdef NEW_FOLDER_INTERFACE\n#include \"../../../Common/StringToInt.h\"\n#endif\n#include \"../../../Windows/PropVariant.h\"\n\n#include \"../../ICoder.h\"\n#include \"../../Common/RegisterArc.h\"\n\n#ifdef EXTERNAL_CODECS\n#include \"../../../Windows/FileFind.h\"\n#include \"../../../Windows/DLL.h\"\n#ifdef NEW_FOLDER_INTERFACE\n#include \"../../../Windows/ResourceString.h\"\nstatic const UINT kIconTypesResId = 100;\n#endif\n\n#ifdef _WIN32\n#include \"Windows/Registry.h\"\n#else\n#include \"Common/StringConvert.h\"\n#endif\n\nusing namespace NWindows;\nusing namespace NFile;\n\n#ifdef _WIN32\nextern HINSTANCE g_hInstance;\n#endif\n\nstatic CSysString GetLibraryFolderPrefix()\n{\n  #ifdef _WIN32\n  TCHAR fullPath[MAX_PATH + 1];\n  ::GetModuleFileName(g_hInstance, fullPath, MAX_PATH);\n  CSysString path = fullPath;\n  int pos = path.ReverseFind(TEXT(CHAR_PATH_SEPARATOR));\n  return path.Left(pos + 1);\n  #else\n  const char *p7zip_home_dir = getenv(\"P7ZIP_HOME_DIR\");\n  if (p7zip_home_dir == 0) p7zip_home_dir=\"./\";\n#ifdef _UNICODE\n  return MultiByteToUnicodeString(p7zip_home_dir);\n#else\n  return p7zip_home_dir;\n#endif\n  #endif\n}\n\n#define kCodecsFolderName TEXT(\"Codecs\")\n#define kFormatsFolderName TEXT(\"Formats\")\nstatic const TCHAR *kMainDll = TEXT(\"7z.dll\");\n\n#ifdef _WIN32\nstatic LPCTSTR kRegistryPath = TEXT(\"Software\") TEXT(STRING_PATH_SEPARATOR) TEXT(\"7-zip\");\nstatic LPCTSTR kProgramPathValue = TEXT(\"Path\");\nstatic bool ReadPathFromRegistry(HKEY baseKey, CSysString &path)\n{\n  NRegistry::CKey key;\n  if(key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS)\n    if (key.QueryValue(kProgramPathValue, path) == ERROR_SUCCESS)\n    {\n      NName::NormalizeDirPathPrefix(path);\n      return true;\n    }\n  return false;\n}\n\n#endif\n\nCSysString GetBaseFolderPrefixFromRegistry()\n{\n  CSysString moduleFolderPrefix = GetLibraryFolderPrefix();\n#ifdef _UNICODE\n  NFind::CFileInfoW fi;\n#else\n  NFind::CFileInfo fi;\n#endif\n  if (NFind::FindFile(moduleFolderPrefix + kMainDll, fi))\n    if (!fi.IsDir())\n      return moduleFolderPrefix;\n  if (NFind::FindFile(moduleFolderPrefix + kCodecsFolderName, fi))\n    if (fi.IsDir())\n      return moduleFolderPrefix;\n  if (NFind::FindFile(moduleFolderPrefix + kFormatsFolderName, fi))\n    if (fi.IsDir())\n      return moduleFolderPrefix;\n  #ifdef _WIN32\n  CSysString path;\n  if (ReadPathFromRegistry(HKEY_CURRENT_USER, path))\n    return path;\n  if (ReadPathFromRegistry(HKEY_LOCAL_MACHINE, path))\n    return path;\n  #endif\n  return moduleFolderPrefix;\n}\n\ntypedef UInt32 (WINAPI *GetNumberOfMethodsFunc)(UInt32 *numMethods);\ntypedef UInt32 (WINAPI *GetNumberOfFormatsFunc)(UInt32 *numFormats);\ntypedef UInt32 (WINAPI *GetHandlerPropertyFunc)(PROPID propID, PROPVARIANT *value);\ntypedef UInt32 (WINAPI *GetHandlerPropertyFunc2)(UInt32 index, PROPID propID, PROPVARIANT *value);\ntypedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *iid, void **outObject);\ntypedef UInt32 (WINAPI *SetLargePageModeFunc)();\n\n\nstatic HRESULT GetCoderClass(GetMethodPropertyFunc getMethodProperty, UInt32 index,\n    PROPID propId, CLSID &clsId, bool &isAssigned)\n{\n  NWindows::NCOM::CPropVariant prop;\n  isAssigned = false;\n  RINOK(getMethodProperty(index, propId, &prop));\n  if (prop.vt == VT_BSTR)\n  {\n    isAssigned = true;\n    clsId = *(const GUID *)prop.bstrVal;\n  }\n  else if (prop.vt != VT_EMPTY)\n    return E_FAIL;\n  return S_OK;\n}\n\nHRESULT CCodecs::LoadCodecs()\n{\n  CCodecLib &lib = Libs.Back();\n  lib.GetMethodProperty = (GetMethodPropertyFunc)lib.Lib.GetProcAddress(\"GetMethodProperty\");\n  if (lib.GetMethodProperty == NULL)\n    return S_OK;\n\n  UInt32 numMethods = 1;\n  GetNumberOfMethodsFunc getNumberOfMethodsFunc = (GetNumberOfMethodsFunc)lib.Lib.GetProcAddress(\"GetNumberOfMethods\");\n  if (getNumberOfMethodsFunc != NULL)\n  {\n    RINOK(getNumberOfMethodsFunc(&numMethods));\n  }\n\n  for(UInt32 i = 0; i < numMethods; i++)\n  {\n    CDllCodecInfo info;\n    info.LibIndex = Libs.Size() - 1;\n    info.CodecIndex = i;\n\n    RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kEncoder, info.Encoder, info.EncoderIsAssigned));\n    RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kDecoder, info.Decoder, info.DecoderIsAssigned));\n\n    Codecs.Add(info);\n  }\n  return S_OK;\n}\n\nstatic HRESULT ReadProp(\n    GetHandlerPropertyFunc getProp,\n    GetHandlerPropertyFunc2 getProp2,\n    UInt32 index, PROPID propID, NCOM::CPropVariant &prop)\n{\n  if (getProp2)\n    return getProp2(index, propID, &prop);;\n  return getProp(propID, &prop);\n}\n\nstatic HRESULT ReadBoolProp(\n    GetHandlerPropertyFunc getProp,\n    GetHandlerPropertyFunc2 getProp2,\n    UInt32 index, PROPID propID, bool &res)\n{\n  NCOM::CPropVariant prop;\n  RINOK(ReadProp(getProp, getProp2, index, propID, prop));\n  if (prop.vt == VT_BOOL)\n    res = VARIANT_BOOLToBool(prop.boolVal);\n  else if (prop.vt != VT_EMPTY)\n    return E_FAIL;\n  return S_OK;\n}\n\nstatic HRESULT ReadStringProp(\n    GetHandlerPropertyFunc getProp,\n    GetHandlerPropertyFunc2 getProp2,\n    UInt32 index, PROPID propID, UString &res)\n{\n  NCOM::CPropVariant prop;\n  RINOK(ReadProp(getProp, getProp2, index, propID, prop));\n  if (prop.vt == VT_BSTR)\n    res = prop.bstrVal;\n  else if (prop.vt != VT_EMPTY)\n    return E_FAIL;\n  return S_OK;\n}\n\n#endif\n\nstatic const unsigned int kNumArcsMax = 32;\nstatic unsigned int g_NumArcs = 0;\nstatic const CArcInfo *g_Arcs[kNumArcsMax];\nvoid RegisterArc(const CArcInfo *arcInfo)\n{\n  if (g_NumArcs < kNumArcsMax)\n    g_Arcs[g_NumArcs++] = arcInfo;\n}\n\nstatic void SplitString(const UString &srcString, UStringVector &destStrings)\n{\n  destStrings.Clear();\n  UString s;\n  int len = srcString.Length();\n  if (len == 0)\n    return;\n  for (int i = 0; i < len; i++)\n  {\n    wchar_t c = srcString[i];\n    if (c == L' ')\n    {\n      if (!s.IsEmpty())\n      {\n        destStrings.Add(s);\n        s.Empty();\n      }\n    }\n    else\n      s += c;\n  }\n  if (!s.IsEmpty())\n    destStrings.Add(s);\n}\n\nvoid CArcInfoEx::AddExts(const wchar_t* ext, const wchar_t* addExt)\n{\n  UStringVector exts, addExts;\n  SplitString(ext, exts);\n  if (addExt != 0)\n    SplitString(addExt, addExts);\n  for (int i = 0; i < exts.Size(); i++)\n  {\n    CArcExtInfo extInfo;\n    extInfo.Ext = exts[i];\n    if (i < addExts.Size())\n    {\n      extInfo.AddExt = addExts[i];\n      if (extInfo.AddExt == L\"*\")\n        extInfo.AddExt.Empty();\n    }\n    Exts.Add(extInfo);\n  }\n}\n\n#ifdef EXTERNAL_CODECS\n\nHRESULT CCodecs::LoadFormats()\n{\n  const NDLL::CLibrary &lib = Libs.Back().Lib;\n  GetHandlerPropertyFunc getProp = 0;\n  GetHandlerPropertyFunc2 getProp2 = (GetHandlerPropertyFunc2)\n      lib.GetProcAddress(\"GetHandlerProperty2\");\n  if (getProp2 == NULL)\n  {\n    getProp = (GetHandlerPropertyFunc)\n        lib.GetProcAddress(\"GetHandlerProperty\");\n    if (getProp == NULL)\n      return S_OK;\n  }\n\n  UInt32 numFormats = 1;\n  GetNumberOfFormatsFunc getNumberOfFormats = (GetNumberOfFormatsFunc)\n    lib.GetProcAddress(\"GetNumberOfFormats\");\n  if (getNumberOfFormats != NULL)\n  {\n    RINOK(getNumberOfFormats(&numFormats));\n  }\n  if (getProp2 == NULL)\n    numFormats = 1;\n\n  for(UInt32 i = 0; i < numFormats; i++)\n  {\n    CArcInfoEx item;\n    item.LibIndex = Libs.Size() - 1;\n    item.FormatIndex = i;\n\n    RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kName, item.Name));\n\n    NCOM::CPropVariant prop;\n    if (ReadProp(getProp, getProp2, i, NArchive::kClassID, prop) != S_OK)\n      continue;\n    if (prop.vt != VT_BSTR)\n      continue;\n    item.ClassID = *(const GUID *)prop.bstrVal;\n    prop.Clear();\n\n    UString ext, addExt;\n    RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kExtension, ext));\n    RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kAddExtension, addExt));\n    item.AddExts(ext, addExt);\n\n    ReadBoolProp(getProp, getProp2, i, NArchive::kUpdate, item.UpdateEnabled);\n    if (item.UpdateEnabled)\n      ReadBoolProp(getProp, getProp2, i, NArchive::kKeepName, item.KeepName);\n    \n    if (ReadProp(getProp, getProp2, i, NArchive::kStartSignature, prop) == S_OK)\n      if (prop.vt == VT_BSTR)\n      {\n        UINT len = ::SysStringByteLen(prop.bstrVal);\n        item.StartSignature.SetCapacity(len);\n        memmove(item.StartSignature, prop.bstrVal, len);\n      }\n    Formats.Add(item);\n  }\n  return S_OK;\n}\n\n#ifdef NEW_FOLDER_INTERFACE\nvoid CCodecLib::LoadIcons()\n{\n#ifdef _WIN32\n  UString iconTypes = MyLoadStringW((HMODULE)Lib, kIconTypesResId);\n  UStringVector pairs;\n  SplitString(iconTypes, pairs);\n  for (int i = 0; i < pairs.Size(); i++)\n  {\n    const UString &s = pairs[i];\n    int pos = s.Find(L':');\n    if (pos < 0)\n      continue;\n    CIconPair iconPair;\n    const wchar_t *end;\n    UString num = s.Mid(pos + 1);\n    iconPair.IconIndex = (UInt32)ConvertStringToUInt64(num, &end);\n    if (*end != L'\\0')\n      continue;\n    iconPair.Ext = s.Left(pos);\n    IconPairs.Add(iconPair);\n  }\n#endif // #ifdef _WIN32\n}\n\nint CCodecLib::FindIconIndex(const UString &ext) const\n{\n#ifdef _WIN32\n  for (int i = 0; i < IconPairs.Size(); i++)\n  {\n    const CIconPair &pair = IconPairs[i];\n    if (ext.CompareNoCase(pair.Ext) == 0)\n      return pair.IconIndex;\n  }\n#endif // #ifdef _WIN32\n  return -1;\n}\n#endif\n\n#ifdef _7ZIP_LARGE_PAGES\nextern \"C\"\n{\n  extern SIZE_T g_LargePageSize;\n}\n#endif\n\nHRESULT CCodecs::LoadDll(const CSysString &dllPath)\n{\n#ifdef _WIN32\n  {\n    NDLL::CLibrary library;\n    if (!library.LoadEx(dllPath, LOAD_LIBRARY_AS_DATAFILE))\n      return S_OK;\n  }\n#endif\n  Libs.Add(CCodecLib());\n  CCodecLib &lib = Libs.Back();\n  #ifdef NEW_FOLDER_INTERFACE\n  lib.Path = dllPath;\n  #endif\n  bool used = false;\n  HRESULT res = S_OK;\n  if (lib.Lib.Load(dllPath))\n  {\n    #ifdef NEW_FOLDER_INTERFACE\n    lib.LoadIcons();\n    #endif\n\n    #ifdef _7ZIP_LARGE_PAGES\n    if (g_LargePageSize != 0)\n    {\n      SetLargePageModeFunc setLargePageMode = (SetLargePageModeFunc)lib.Lib.GetProcAddress(\"SetLargePageMode\");\n      if (setLargePageMode != 0)\n        setLargePageMode();\n    }\n    #endif\n\n    lib.CreateObject = (CreateObjectFunc)lib.Lib.GetProcAddress(\"CreateObject\");\n    if (lib.CreateObject != 0)\n    {\n      int startSize = Codecs.Size();\n      res = LoadCodecs();\n      used = (Codecs.Size() != startSize);\n      if (res == S_OK)\n      {\n        startSize = Formats.Size();\n        res = LoadFormats();\n        used = used || (Formats.Size() != startSize);\n      }\n    }\n  }\n  if (!used)\n    Libs.DeleteBack();\n  return res;\n}\n\nHRESULT CCodecs::LoadDllsFromFolder(const CSysString &folderPrefix)\n{\n#ifdef _UNICODE\n  NFile::NFind::CEnumeratorW enumerator(folderPrefix + CSysString(TEXT(\"*\")));\n  NFile::NFind::CFileInfoW fi;\n#else\n  NFile::NFind::CEnumerator enumerator(folderPrefix + CSysString(TEXT(\"*\")));\n  NFile::NFind::CFileInfo fi;\n#endif\n  while (enumerator.Next(fi))\n  {\n    if (fi.IsDir())\n      continue;\n    RINOK(LoadDll(folderPrefix + fi.Name));\n  }\n  return S_OK;\n}\n\n#endif\n\n#ifndef _SFX\nstatic inline void SetBuffer(CByteBuffer &bb, const Byte *data, int size)\n{\n  bb.SetCapacity(size);\n  memmove((Byte *)bb, data, size);\n}\n#endif\n\nHRESULT CCodecs::Load()\n{\n  Formats.Clear();\n  #ifdef EXTERNAL_CODECS\n  Codecs.Clear();\n  #endif\n  for (UInt32 i = 0; i < g_NumArcs; i++)\n  {\n    const CArcInfo &arc = *g_Arcs[i];\n    CArcInfoEx item;\n    item.Name = arc.Name;\n    item.CreateInArchive = arc.CreateInArchive;\n    item.CreateOutArchive = arc.CreateOutArchive;\n    item.AddExts(arc.Ext, arc.AddExt);\n    item.UpdateEnabled = (arc.CreateOutArchive != 0);\n    item.KeepName = arc.KeepName;\n\n    #ifndef _SFX\n    SetBuffer(item.StartSignature, arc.Signature, arc.SignatureSize);\n    #endif\n    Formats.Add(item);\n  }\n  #ifdef EXTERNAL_CODECS\n  const CSysString baseFolder = GetBaseFolderPrefixFromRegistry();\n  RINOK(LoadDll(baseFolder + kMainDll));\n  RINOK(LoadDllsFromFolder(baseFolder + kCodecsFolderName TEXT(STRING_PATH_SEPARATOR)));\n  RINOK(LoadDllsFromFolder(baseFolder + kFormatsFolderName TEXT(STRING_PATH_SEPARATOR)));\n  #endif\n  return S_OK;\n}\n\n#ifndef _SFX\n\nint CCodecs::FindFormatForArchiveName(const UString &arcPath) const\n{\n  int slashPos1 = arcPath.ReverseFind(WCHAR_PATH_SEPARATOR);\n  int slashPos2 = arcPath.ReverseFind(L'.');\n  int dotPos = arcPath.ReverseFind(L'.');\n  if (dotPos < 0 || dotPos < slashPos1 || dotPos < slashPos2)\n    return -1;\n  UString ext = arcPath.Mid(dotPos + 1);\n  for (int i = 0; i < Formats.Size(); i++)\n  {\n    const CArcInfoEx &arc = Formats[i];\n    if (!arc.UpdateEnabled)\n      continue;\n    // if (arc.FindExtension(ext) >= 0)\n    UString mainExt = arc.GetMainExt();\n    if (!mainExt.IsEmpty() && ext.CompareNoCase(mainExt) == 0)\n      return i;\n  }\n  return -1;\n}\n\nint CCodecs::FindFormatForExtension(const UString &ext) const\n{\n  if (ext.IsEmpty())\n    return -1;\n  for (int i = 0; i < Formats.Size(); i++)\n    if (Formats[i].FindExtension(ext) >= 0)\n      return i;\n  return -1;\n}\n\nint CCodecs::FindFormatForArchiveType(const UString &arcType) const\n{\n  for (int i = 0; i < Formats.Size(); i++)\n    if (Formats[i].Name.CompareNoCase(arcType) == 0)\n      return i;\n  return -1;\n}\n\nbool CCodecs::FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const\n{\n  formatIndices.Clear();\n  for (int pos = 0; pos < arcType.Length();)\n  {\n    int pos2 = arcType.Find('.', pos);\n    if (pos2 < 0)\n      pos2 = arcType.Length();\n    const UString name = arcType.Mid(pos, pos2 - pos);\n    int index = FindFormatForArchiveType(name);\n    if (index < 0 && name != L\"*\")\n    {\n      formatIndices.Clear();\n      return false;\n    }\n    formatIndices.Add(index);\n    pos = pos2 + 1;\n  }\n  return true;\n}\n\n#endif\n\n#ifdef EXTERNAL_CODECS\n\n#ifdef EXPORT_CODECS\nextern unsigned int g_NumCodecs;\nSTDAPI CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject);\nSTDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value);\n// STDAPI GetNumberOfMethods(UInt32 *numCodecs);\n#endif\n\nSTDMETHODIMP CCodecs::GetNumberOfMethods(UInt32 *numMethods)\n{\n  *numMethods =\n      #ifdef EXPORT_CODECS\n      g_NumCodecs +\n      #endif\n      Codecs.Size();\n  return S_OK;\n}\n\nSTDMETHODIMP CCodecs::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  #ifdef EXPORT_CODECS\n  if (index < g_NumCodecs)\n    return GetMethodProperty(index, propID, value);\n  #endif\n\n  const CDllCodecInfo &ci = Codecs[index\n      #ifdef EXPORT_CODECS\n      - g_NumCodecs\n      #endif\n      ];\n\n  if (propID == NMethodPropID::kDecoderIsAssigned)\n  {\n    NWindows::NCOM::CPropVariant propVariant;\n    propVariant = ci.DecoderIsAssigned;\n    propVariant.Detach(value);\n    return S_OK;\n  }\n  if (propID == NMethodPropID::kEncoderIsAssigned)\n  {\n    NWindows::NCOM::CPropVariant propVariant;\n    propVariant = ci.EncoderIsAssigned;\n    propVariant.Detach(value);\n    return S_OK;\n  }\n  return Libs[ci.LibIndex].GetMethodProperty(ci.CodecIndex, propID, value);\n}\n\nSTDMETHODIMP CCodecs::CreateDecoder(UInt32 index, const GUID *iid, void **coder)\n{\n  #ifdef EXPORT_CODECS\n  if (index < g_NumCodecs)\n    return CreateCoder2(false, index, iid, coder);\n  #endif\n  const CDllCodecInfo &ci = Codecs[index\n      #ifdef EXPORT_CODECS\n      - g_NumCodecs\n      #endif\n      ];\n  if (ci.DecoderIsAssigned)\n    return Libs[ci.LibIndex].CreateObject(&ci.Decoder, iid, (void **)coder);\n  return S_OK;\n}\n\nSTDMETHODIMP CCodecs::CreateEncoder(UInt32 index, const GUID *iid, void **coder)\n{\n  #ifdef EXPORT_CODECS\n  if (index < g_NumCodecs)\n    return CreateCoder2(true, index, iid, coder);\n  #endif\n  const CDllCodecInfo &ci = Codecs[index\n      #ifdef EXPORT_CODECS\n      - g_NumCodecs\n      #endif\n      ];\n  if (ci.EncoderIsAssigned)\n    return Libs[ci.LibIndex].CreateObject(&ci.Encoder, iid, (void **)coder);\n  return S_OK;\n}\n\nHRESULT CCodecs::CreateCoder(const UString &name, bool encode, CMyComPtr<ICompressCoder> &coder) const\n{\n  for (int i = 0; i < Codecs.Size(); i++)\n  {\n    const CDllCodecInfo &codec = Codecs[i];\n    if (encode && !codec.EncoderIsAssigned || !encode && !codec.DecoderIsAssigned)\n      continue;\n    const CCodecLib &lib = Libs[codec.LibIndex];\n    UString res;\n    NWindows::NCOM::CPropVariant prop;\n    RINOK(lib.GetMethodProperty(codec.CodecIndex, NMethodPropID::kName, &prop));\n    if (prop.vt == VT_BSTR)\n      res = prop.bstrVal;\n    else if (prop.vt != VT_EMPTY)\n      continue;\n    if (name.CompareNoCase(res) == 0)\n      return lib.CreateObject(encode ? &codec.Encoder : &codec.Decoder, &IID_ICompressCoder, (void **)&coder);\n  }\n  return CLASS_E_CLASSNOTAVAILABLE;\n}\n\nint CCodecs::GetCodecLibIndex(UInt32 index)\n{\n  #ifdef EXPORT_CODECS\n  if (index < g_NumCodecs)\n    return -1;\n  #endif\n  #ifdef EXTERNAL_CODECS\n  const CDllCodecInfo &ci = Codecs[index\n      #ifdef EXPORT_CODECS\n      - g_NumCodecs\n      #endif\n      ];\n  return ci.LibIndex;\n  #else\n  return -1;\n  #endif\n}\n\nbool CCodecs::GetCodecEncoderIsAssigned(UInt32 index)\n{\n  #ifdef EXPORT_CODECS\n  if (index < g_NumCodecs)\n  {\n    NWindows::NCOM::CPropVariant prop;\n    if (GetProperty(index, NMethodPropID::kEncoder, &prop) == S_OK)\n      if (prop.vt != VT_EMPTY)\n        return true;\n    return false;\n  }\n  #endif\n  #ifdef EXTERNAL_CODECS\n  const CDllCodecInfo &ci = Codecs[index\n      #ifdef EXPORT_CODECS\n      - g_NumCodecs\n      #endif\n      ];\n  return ci.EncoderIsAssigned;\n  #else\n  return false;\n  #endif\n}\n\nHRESULT CCodecs::GetCodecId(UInt32 index, UInt64 &id)\n{\n  UString s;\n  NWindows::NCOM::CPropVariant prop;\n  RINOK(GetProperty(index, NMethodPropID::kID, &prop));\n  if (prop.vt != VT_UI8)\n    return E_INVALIDARG;\n  id = prop.uhVal.QuadPart;\n  return S_OK;\n}\n\nUString CCodecs::GetCodecName(UInt32 index)\n{\n  UString s;\n  NWindows::NCOM::CPropVariant prop;\n  if (GetProperty(index, NMethodPropID::kName, &prop) == S_OK)\n    if (prop.vt == VT_BSTR)\n      s = prop.bstrVal;\n  return s;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/LoadCodecs.h",
    "content": "// LoadCodecs.h\n\n#ifndef __LOADCODECS_H\n#define __LOADCODECS_H\n\n#include \"../../../Common/Types.h\"\n#include \"../../../Common/MyCom.h\"\n#include \"../../../Common/MyString.h\"\n#include \"../../../Common/Buffer.h\"\n#include \"../../ICoder.h\"\n\n#ifdef EXTERNAL_CODECS\n#include \"../../../Windows/DLL.h\"\n#endif\n\nstruct CDllCodecInfo\n{\n  CLSID Encoder;\n  CLSID Decoder;\n  bool EncoderIsAssigned;\n  bool DecoderIsAssigned;\n  int LibIndex;\n  UInt32 CodecIndex;\n};\n\n#include \"../../Archive/IArchive.h\"\n\ntypedef IInArchive * (*CreateInArchiveP)();\ntypedef IOutArchive * (*CreateOutArchiveP)();\n\nstruct CArcExtInfo\n{\n  UString Ext;\n  UString AddExt;\n  CArcExtInfo() {}\n  CArcExtInfo(const UString &ext): Ext(ext) {}\n  CArcExtInfo(const UString &ext, const UString &addExt): Ext(ext), AddExt(addExt) {}\n};\n\n\nstruct CArcInfoEx\n{\n  #ifdef EXTERNAL_CODECS\n  int LibIndex;\n  UInt32 FormatIndex;\n  CLSID ClassID;\n  #endif\n  bool UpdateEnabled;\n  CreateInArchiveP CreateInArchive;\n  CreateOutArchiveP CreateOutArchive;\n  UString Name;\n  CObjectVector<CArcExtInfo> Exts;\n  #ifndef _SFX\n  CByteBuffer StartSignature;\n  // CByteBuffer FinishSignature;\n  #ifdef NEW_FOLDER_INTERFACE\n  UStringVector AssociateExts;\n  #endif\n  #endif\n  bool KeepName;\n  UString GetMainExt() const\n  {\n    if (Exts.IsEmpty())\n      return UString();\n    return Exts[0].Ext;\n  }\n  int FindExtension(const UString &ext) const\n  {\n    for (int i = 0; i < Exts.Size(); i++)\n      if (ext.CompareNoCase(Exts[i].Ext) == 0)\n        return i;\n    return -1;\n  }\n  UString GetAllExtensions() const\n  {\n    UString s;\n    for (int i = 0; i < Exts.Size(); i++)\n    {\n      if (i > 0)\n        s += ' ';\n      s += Exts[i].Ext;\n    }\n    return s;\n  }\n\n  void AddExts(const wchar_t* ext, const wchar_t* addExt);\n\n  CArcInfoEx():\n    #ifdef EXTERNAL_CODECS\n    LibIndex(-1),\n    #endif\n    UpdateEnabled(false),\n    CreateInArchive(0), CreateOutArchive(0),\n    KeepName(false)\n    #ifndef _SFX\n    #endif\n  {}\n};\n\n#ifdef EXTERNAL_CODECS\ntypedef UInt32 (WINAPI *GetMethodPropertyFunc)(UInt32 index, PROPID propID, PROPVARIANT *value);\ntypedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *interfaceID, void **outObject);\n\n\nstruct CCodecLib\n{\n  NWindows::NDLL::CLibrary Lib;\n  GetMethodPropertyFunc GetMethodProperty;\n  CreateObjectFunc CreateObject;\n  #ifdef NEW_FOLDER_INTERFACE\n  struct CIconPair\n  {\n    UString Ext;\n    UInt32 IconIndex;\n  };\n  CSysString Path;\n  CObjectVector<CIconPair> IconPairs;\n  void LoadIcons();\n  int FindIconIndex(const UString &ext) const;\n  #endif\n  CCodecLib(): GetMethodProperty(0) {}\n};\n#endif\n\nclass CCodecs:\n  #ifdef EXTERNAL_CODECS\n  public ICompressCodecsInfo,\n  #else\n  public IUnknown,\n  #endif\n  public CMyUnknownImp\n{\npublic:\n  #ifdef EXTERNAL_CODECS\n  CObjectVector<CCodecLib> Libs;\n  CObjectVector<CDllCodecInfo> Codecs;\n  HRESULT LoadCodecs();\n  HRESULT LoadFormats();\n  HRESULT LoadDll(const CSysString &path);\n  HRESULT LoadDllsFromFolder(const CSysString &folderPrefix);\n\n  HRESULT CreateArchiveHandler(const CArcInfoEx &ai, void **archive, bool outHandler) const\n  {\n    return Libs[ai.LibIndex].CreateObject(&ai.ClassID, outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive);\n  }\n  #endif\n\npublic:\n  CObjectVector<CArcInfoEx> Formats;\n  HRESULT Load();\n  \n  #ifndef _SFX\n  int FindFormatForArchiveName(const UString &arcPath) const;\n  int FindFormatForExtension(const UString &ext) const;\n  int FindFormatForArchiveType(const UString &arcType) const;\n  bool FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const;\n  #endif\n\n  MY_UNKNOWN_IMP\n\n  #ifdef EXTERNAL_CODECS\n  STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods);\n  STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value);\n  STDMETHOD(CreateDecoder)(UInt32 index, const GUID *interfaceID, void **coder);\n  STDMETHOD(CreateEncoder)(UInt32 index, const GUID *interfaceID, void **coder);\n  #endif\n\n  int GetCodecLibIndex(UInt32 index);\n  bool GetCodecEncoderIsAssigned(UInt32 index);\n  HRESULT GetCodecId(UInt32 index, UInt64 &id);\n  UString GetCodecName(UInt32 index);\n\n  HRESULT CreateInArchive(int formatIndex, CMyComPtr<IInArchive> &archive) const\n  {\n    const CArcInfoEx &ai = Formats[formatIndex];\n    #ifdef EXTERNAL_CODECS\n    if (ai.LibIndex < 0)\n    #endif\n    {\n      archive = ai.CreateInArchive();\n      return S_OK;\n    }\n    #ifdef EXTERNAL_CODECS\n    return CreateArchiveHandler(ai, (void **)&archive, false);\n    #endif\n  }\n  HRESULT CreateOutArchive(int formatIndex, CMyComPtr<IOutArchive> &archive) const\n  {\n    const CArcInfoEx &ai = Formats[formatIndex];\n    #ifdef EXTERNAL_CODECS\n    if (ai.LibIndex < 0)\n    #endif\n    {\n      archive = ai.CreateOutArchive();\n      return S_OK;\n    }\n    #ifdef EXTERNAL_CODECS\n    return CreateArchiveHandler(ai, (void **)&archive, true);\n    #endif\n  }\n  int FindOutFormatFromName(const UString &name) const\n  {\n    for (int i = 0; i < Formats.Size(); i++)\n    {\n      const CArcInfoEx &arc = Formats[i];\n      if (!arc.UpdateEnabled)\n        continue;\n      if (arc.Name.CompareNoCase(name) == 0)\n        return i;\n    }\n    return -1;\n  }\n\n  #ifdef EXTERNAL_CODECS\n  HRESULT CreateCoder(const UString &name, bool encode, CMyComPtr<ICompressCoder> &coder) const;\n  #endif\n\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/OpenArchive.cpp",
    "content": "// OpenArchive.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OpenArchive.h\"\n\n#include \"Common/Wildcard.h\"\n\n#include \"Windows/FileName.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/FileStreams.h\"\n#include \"../../Common/StreamUtils.h\"\n\n#include \"Common/StringConvert.h\"\n\n#include \"DefaultName.h\"\n\nusing namespace NWindows;\n\nHRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, UString &result)\n{\n  NCOM::CPropVariant prop;\n  RINOK(archive->GetProperty(index, kpidPath, &prop));\n  if(prop.vt == VT_BSTR)\n    result = prop.bstrVal;\n  else if (prop.vt == VT_EMPTY)\n    result.Empty();\n  else\n    return E_FAIL;\n  return S_OK;\n}\n\nHRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, const UString &defaultName, UString &result)\n{\n  RINOK(GetArchiveItemPath(archive, index, result));\n  if (result.IsEmpty())\n  {\n    result = defaultName;\n    NCOM::CPropVariant prop;\n    RINOK(archive->GetProperty(index, kpidExtension, &prop));\n    if (prop.vt == VT_BSTR)\n    {\n      result += L'.';\n      result += prop.bstrVal;\n    }\n    else if (prop.vt != VT_EMPTY)\n      return E_FAIL;\n  }\n  return S_OK;\n}\n\nHRESULT GetArchiveItemFileTime(IInArchive *archive, UInt32 index,\n    const FILETIME &defaultFileTime, FILETIME &fileTime)\n{\n  NCOM::CPropVariant prop;\n  RINOK(archive->GetProperty(index, kpidMTime, &prop));\n  if (prop.vt == VT_FILETIME)\n    fileTime = prop.filetime;\n  else if (prop.vt == VT_EMPTY)\n    fileTime = defaultFileTime;\n  else\n    return E_FAIL;\n  return S_OK;\n}\n\nHRESULT IsArchiveItemProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result)\n{\n  NCOM::CPropVariant prop;\n  RINOK(archive->GetProperty(index, propID, &prop));\n  if(prop.vt == VT_BOOL)\n    result = VARIANT_BOOLToBool(prop.boolVal);\n  else if (prop.vt == VT_EMPTY)\n    result = false;\n  else\n    return E_FAIL;\n  return S_OK;\n}\n\nHRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result)\n{\n  return IsArchiveItemProp(archive, index, kpidIsDir, result);\n}\n\nHRESULT IsArchiveItemAnti(IInArchive *archive, UInt32 index, bool &result)\n{\n  return IsArchiveItemProp(archive, index, kpidIsAnti, result);\n}\n\n// Static-SFX (for Linux) can be big.\nconst UInt64 kMaxCheckStartPosition = 1 << 22;\n\nHRESULT ReOpenArchive(IInArchive *archive, const UString &fileName, IArchiveOpenCallback *openArchiveCallback)\n{\n  CInFileStream *inStreamSpec = new CInFileStream(true);\n  CMyComPtr<IInStream> inStream(inStreamSpec);\n  inStreamSpec->Open(fileName);\n  return archive->Open(inStream, &kMaxCheckStartPosition, openArchiveCallback);\n}\n\n#ifndef _SFX\nstatic inline bool TestSignature(const Byte *p1, const Byte *p2, size_t size)\n{\n  for (size_t i = 0; i < size; i++)\n    if (p1[i] != p2[i])\n      return false;\n  return true;\n}\n#endif\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    int arcTypeIndex,\n    IInStream *inStream,\n    const UString &fileName,\n    IInArchive **archiveResult,\n    int &formatIndex,\n    UString &defaultItemName,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  *archiveResult = NULL;\n  UString extension;\n  {\n    int dotPos = fileName.ReverseFind(L'.');\n    if (dotPos >= 0)\n      extension = fileName.Mid(dotPos + 1);\n  }\n  CIntVector orderIndices;\n  if (arcTypeIndex >= 0)\n    orderIndices.Add(arcTypeIndex);\n  else\n  {\n\n  int i;\n  int numFinded = 0;\n  for (i = 0; i < codecs->Formats.Size(); i++)\n    if (codecs->Formats[i].FindExtension(extension) >= 0)\n      orderIndices.Insert(numFinded++, i);\n    else\n      orderIndices.Add(i);\n  \n  #ifndef _SFX\n  if (numFinded != 1)\n  {\n    CIntVector orderIndices2;\n    CByteBuffer byteBuffer;\n    const size_t kBufferSize = (1 << 21);\n    byteBuffer.SetCapacity(kBufferSize);\n    RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));\n    size_t processedSize = kBufferSize;\n    RINOK(ReadStream(inStream, byteBuffer, &processedSize));\n    if (processedSize == 0)\n      return S_FALSE;\n\n    const Byte *buf = byteBuffer;\n    Byte hash[1 << 16];\n    memset(hash, 0xFF, 1 << 16);\n    Byte prevs[256];\n    if (orderIndices.Size() > 255)\n      return S_FALSE;\n    int i;\n    for (i = 0; i < orderIndices.Size(); i++)\n    {\n      const CArcInfoEx &ai = codecs->Formats[orderIndices[i]];\n      const CByteBuffer &sig = ai.StartSignature;\n      if (sig.GetCapacity() < 2)\n        continue;\n      UInt32 v = sig[0] | ((UInt32)sig[1] << 8);\n      prevs[i] = hash[v];\n      hash[v] = (Byte)i;\n    }\n\n    processedSize--;\n    for (UInt32 pos = 0; pos < processedSize; pos++)\n    {\n      for (; pos < processedSize && hash[buf[pos] | ((UInt32)buf[pos + 1] << 8)] == 0xFF; pos++);\n      if (pos == processedSize)\n        break;\n      UInt32 v = buf[pos] | ((UInt32)buf[pos + 1] << 8);\n      Byte *ptr = &hash[v];\n      int i = *ptr;\n      do\n      {\n        int index = orderIndices[i];\n        const CArcInfoEx &ai = codecs->Formats[index];\n        const CByteBuffer &sig = ai.StartSignature;\n        if (sig.GetCapacity() != 0 && pos + sig.GetCapacity() <= processedSize + 1)\n          if (TestSignature(buf + pos, sig, sig.GetCapacity()))\n          {\n            orderIndices2.Add(index);\n            orderIndices[i] = 0xFF;\n            *ptr = prevs[i];\n          }\n        ptr = &prevs[i];\n        i = *ptr;\n      }\n      while (i != 0xFF);\n    }\n    \n    for (i = 0; i < orderIndices.Size(); i++)\n    {\n      int val = orderIndices[i];\n      if (val != 0xFF)\n        orderIndices2.Add(val);\n    }\n    orderIndices = orderIndices2;\n\n    if (orderIndices.Size() >= 2)\n    {\n      int isoIndex = codecs->FindFormatForArchiveType(L\"iso\");\n      int udfIndex = codecs->FindFormatForArchiveType(L\"udf\");\n      int iIso = -1;\n      int iUdf = -1;\n      for (int i = 0; i < orderIndices.Size(); i++)\n      {\n        if (orderIndices[i] == isoIndex) iIso = i;\n        if (orderIndices[i] == udfIndex) iUdf = i;\n      }\n      if (iUdf == iIso + 1)\n      {\n        orderIndices[iUdf] = isoIndex;\n        orderIndices[iIso] = udfIndex;\n      }\n    }\n  }\n  else if (extension == L\"000\" || extension == L\"001\")\n  {\n    CByteBuffer byteBuffer;\n    const size_t kBufferSize = (1 << 10);\n    byteBuffer.SetCapacity(kBufferSize);\n    Byte *buffer = byteBuffer;\n    RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));\n    size_t processedSize = kBufferSize;\n    RINOK(ReadStream(inStream, buffer, &processedSize));\n    if (processedSize >= 16)\n    {\n      Byte kRarHeader[] = {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00};\n      if (TestSignature(buffer, kRarHeader, 7) && buffer[9] == 0x73 && (buffer[10] & 1) != 0)\n      {\n        for (int i = 0; i < orderIndices.Size(); i++)\n        {\n          int index = orderIndices[i];\n          const CArcInfoEx &ai = codecs->Formats[index];\n          if (ai.Name.CompareNoCase(L\"rar\") != 0)\n            continue;\n          orderIndices.Delete(i--);\n          orderIndices.Insert(0, index);\n          break;\n        }\n      }\n    }\n  }\n  #endif\n  }\n\n  for(int i = 0; i < orderIndices.Size(); i++)\n  {\n    inStream->Seek(0, STREAM_SEEK_SET, NULL);\n\n    CMyComPtr<IInArchive> archive;\n\n    formatIndex = orderIndices[i];\n    RINOK(codecs->CreateInArchive(formatIndex, archive));\n    if (!archive)\n      continue;\n\n    #ifdef EXTERNAL_CODECS\n    {\n      CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;\n      archive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);\n      if (setCompressCodecsInfo)\n      {\n        RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecs));\n      }\n    }\n    #endif\n\n    HRESULT result = archive->Open(inStream, &kMaxCheckStartPosition, openArchiveCallback);\n    if (result == S_FALSE)\n      continue;\n    RINOK(result);\n    *archiveResult = archive.Detach();\n    const CArcInfoEx &format = codecs->Formats[formatIndex];\n    if (format.Exts.Size() == 0)\n    {\n      defaultItemName = GetDefaultName2(fileName, L\"\", L\"\");\n    }\n    else\n    {\n      int subExtIndex = format.FindExtension(extension);\n      if (subExtIndex < 0)\n        subExtIndex = 0;\n      defaultItemName = GetDefaultName2(fileName,\n          format.Exts[subExtIndex].Ext,\n          format.Exts[subExtIndex].AddExt);\n    }\n    return S_OK;\n  }\n  return S_FALSE;\n}\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    int arcTypeIndex,\n    const UString &filePath,\n    IInArchive **archiveResult,\n    int &formatIndex,\n    UString &defaultItemName,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  CInFileStream *inStreamSpec = new CInFileStream(true);\n  CMyComPtr<IInStream> inStream(inStreamSpec);\n  if (!inStreamSpec->Open(filePath))\n    return GetLastError();\n  return OpenArchive(codecs, arcTypeIndex, inStream, ExtractFileNameFromPath(filePath),\n    archiveResult, formatIndex,\n    defaultItemName, openArchiveCallback);\n}\n\nstatic void MakeDefaultName(UString &name)\n{\n  int dotPos = name.ReverseFind(L'.');\n  if (dotPos < 0)\n    return;\n  UString ext = name.Mid(dotPos + 1);\n  if (ext.IsEmpty())\n    return;\n  for (int pos = 0; pos < ext.Length(); pos++)\n    if (ext[pos] < L'0' || ext[pos] > L'9')\n      return;\n  name = name.Left(dotPos);\n}\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    const UString &fileName,\n    IInArchive **archive0,\n    IInArchive **archive1,\n    int &formatIndex0,\n    int &formatIndex1,\n    UString &defaultItemName0,\n    UString &defaultItemName1,\n    IArchiveOpenCallback *openArchiveCallback)\n{\n  if (formatIndices.Size() >= 3)\n    return E_NOTIMPL;\n  \n  int arcTypeIndex = -1;\n  if (formatIndices.Size() >= 1)\n    arcTypeIndex = formatIndices[formatIndices.Size() - 1];\n  \n  HRESULT result = OpenArchive(codecs, arcTypeIndex, fileName,\n    archive0, formatIndex0, defaultItemName0, openArchiveCallback);\n  RINOK(result);\n\n  if (formatIndices.Size() == 1)\n    return S_OK;\n  arcTypeIndex = -1;\n  if (formatIndices.Size() >= 2)\n    arcTypeIndex = formatIndices[formatIndices.Size() - 2];\n\n  HRESULT resSpec = (formatIndices.Size() == 0 ? S_OK : E_NOTIMPL);\n\n  CMyComPtr<IInArchiveGetStream> getStream;\n  result = (*archive0)->QueryInterface(IID_IInArchiveGetStream, (void **)&getStream);\n  if (result != S_OK || !getStream)\n    return resSpec;\n\n  CMyComPtr<ISequentialInStream> subSeqStream;\n  result = getStream->GetStream(0, &subSeqStream);\n  if (result != S_OK || !subSeqStream)\n    return resSpec;\n\n  CMyComPtr<IInStream> subStream;\n  result = subSeqStream.QueryInterface(IID_IInStream, &subStream);\n  if (result != S_OK || !subStream)\n    return resSpec;\n\n  UInt32 numItems;\n  RINOK((*archive0)->GetNumberOfItems(&numItems));\n  if (numItems < 1)\n    return resSpec;\n\n  UString subPath;\n  RINOK(GetArchiveItemPath(*archive0, 0, subPath))\n  if (subPath.IsEmpty())\n  {\n    MakeDefaultName(defaultItemName0);\n    subPath = defaultItemName0;\n    const CArcInfoEx &format = codecs->Formats[formatIndex0];\n    if (format.Name.CompareNoCase(L\"7z\") == 0)\n    {\n      if (subPath.Right(3).CompareNoCase(L\".7z\") != 0)\n        subPath += L\".7z\";\n    }\n  }\n  else\n    subPath = ExtractFileNameFromPath(subPath);\n\n  CMyComPtr<IArchiveOpenSetSubArchiveName> setSubArchiveName;\n  openArchiveCallback->QueryInterface(IID_IArchiveOpenSetSubArchiveName, (void **)&setSubArchiveName);\n  if (setSubArchiveName)\n    setSubArchiveName->SetSubArchiveName(subPath);\n\n  result = OpenArchive(codecs, arcTypeIndex, subStream, subPath,\n      archive1, formatIndex1, defaultItemName1, openArchiveCallback);\n  resSpec = (formatIndices.Size() == 0 ? S_OK : S_FALSE);\n  if (result != S_OK)\n    return resSpec;\n  return S_OK;\n}\n\nstatic void SetCallback(const UString &archiveName,\n    IOpenCallbackUI *openCallbackUI,\n    IArchiveOpenCallback *reOpenCallback,\n    CMyComPtr<IArchiveOpenCallback> &openCallback)\n{\n  COpenCallbackImp *openCallbackSpec = new COpenCallbackImp;\n  openCallback = openCallbackSpec;\n  openCallbackSpec->Callback = openCallbackUI;\n  openCallbackSpec->ReOpenCallback = reOpenCallback;\n\n  UString fullName;\n  int fileNamePartStartIndex;\n  NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex);\n  openCallbackSpec->Init(\n      fullName.Left(fileNamePartStartIndex),\n      fullName.Mid(fileNamePartStartIndex));\n}\n\nHRESULT MyOpenArchive(\n    CCodecs *codecs,\n    int arcTypeIndex,\n    const UString &archiveName,\n    IInArchive **archive, UString &defaultItemName, IOpenCallbackUI *openCallbackUI)\n{\n  CMyComPtr<IArchiveOpenCallback> openCallback;\n  SetCallback(archiveName, openCallbackUI, NULL, openCallback);\n  int formatInfo;\n  return OpenArchive(codecs, arcTypeIndex, archiveName, archive, formatInfo, defaultItemName, openCallback);\n}\n\nHRESULT MyOpenArchive(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    const UString &archiveName,\n    IInArchive **archive0,\n    IInArchive **archive1,\n    UString &defaultItemName0,\n    UString &defaultItemName1,\n    UStringVector &volumePaths,\n    UInt64 &volumesSize,\n    IOpenCallbackUI *openCallbackUI)\n{\n  volumesSize = 0;\n  COpenCallbackImp *openCallbackSpec = new COpenCallbackImp;\n  CMyComPtr<IArchiveOpenCallback> openCallback = openCallbackSpec;\n  openCallbackSpec->Callback = openCallbackUI;\n\n  UString fullName;\n  int fileNamePartStartIndex;\n  NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex);\n  UString prefix = fullName.Left(fileNamePartStartIndex);\n  UString name = fullName.Mid(fileNamePartStartIndex);\n  openCallbackSpec->Init(prefix, name);\n\n  int formatIndex0, formatIndex1;\n  RINOK(OpenArchive(codecs, formatIndices, archiveName,\n      archive0,\n      archive1,\n      formatIndex0,\n      formatIndex1,\n      defaultItemName0,\n      defaultItemName1,\n      openCallback));\n  volumePaths.Add(prefix + name);\n  for (int i = 0; i < openCallbackSpec->FileNames.Size(); i++)\n    volumePaths.Add(prefix + openCallbackSpec->FileNames[i]);\n  volumesSize = openCallbackSpec->TotalSize;\n  return S_OK;\n}\n\nHRESULT CArchiveLink::Close()\n{\n  if (Archive1 != 0)\n    RINOK(Archive1->Close());\n  if (Archive0 != 0)\n    RINOK(Archive0->Close());\n  IsOpen = false;\n  return S_OK;\n}\n\nvoid CArchiveLink::Release()\n{\n  IsOpen = false;\n  Archive1.Release();\n  Archive0.Release();\n}\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    const UString &archiveName,\n    CArchiveLink &archiveLink,\n    IArchiveOpenCallback *openCallback)\n{\n  HRESULT res = OpenArchive(codecs, formatIndices, archiveName,\n    &archiveLink.Archive0, &archiveLink.Archive1,\n    archiveLink.FormatIndex0, archiveLink.FormatIndex1,\n    archiveLink.DefaultItemName0, archiveLink.DefaultItemName1,\n    openCallback);\n  archiveLink.IsOpen = (res == S_OK);\n  return res;\n}\n\nHRESULT MyOpenArchive(CCodecs *codecs,\n    const CIntVector &formatIndices,\n    const UString &archiveName,\n    CArchiveLink &archiveLink,\n    IOpenCallbackUI *openCallbackUI)\n{\n  HRESULT res = MyOpenArchive(codecs, formatIndices, archiveName,\n    &archiveLink.Archive0, &archiveLink.Archive1,\n    archiveLink.DefaultItemName0, archiveLink.DefaultItemName1,\n    archiveLink.VolumePaths,\n    archiveLink.VolumesSize,\n    openCallbackUI);\n  archiveLink.IsOpen = (res == S_OK);\n  return res;\n}\n\nHRESULT ReOpenArchive(CCodecs *codecs, CArchiveLink &archiveLink, const UString &fileName,\n    IArchiveOpenCallback *openCallback)\n{\n  if (archiveLink.GetNumLevels() > 1)\n    return E_NOTIMPL;\n\n  if (archiveLink.GetNumLevels() == 0)\n    return MyOpenArchive(codecs, CIntVector(), fileName, archiveLink, 0);\n\n  CMyComPtr<IArchiveOpenCallback> openCallbackNew;\n  SetCallback(fileName, NULL, openCallback, openCallbackNew);\n\n  HRESULT res = ReOpenArchive(archiveLink.GetArchive(), fileName, openCallbackNew);\n  archiveLink.IsOpen = (res == S_OK);\n  return res;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/OpenArchive.h",
    "content": "// OpenArchive.h\n\n#ifndef __OPENARCHIVE_H\n#define __OPENARCHIVE_H\n\n#include \"Common/MyString.h\"\n#include \"Windows/FileFind.h\"\n\n#include \"../../Archive/IArchive.h\"\n#include \"LoadCodecs.h\"\n#include \"ArchiveOpenCallback.h\"\n\nHRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, UString &result);\nHRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, const UString &defaultName, UString &result);\nHRESULT GetArchiveItemFileTime(IInArchive *archive, UInt32 index,\n    const FILETIME &defaultFileTime, FILETIME &fileTime);\nHRESULT IsArchiveItemProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result);\nHRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result);\nHRESULT IsArchiveItemAnti(IInArchive *archive, UInt32 index, bool &result);\n\nstruct ISetSubArchiveName\n{\n  virtual void SetSubArchiveName(const wchar_t *name) = 0;\n};\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    int arcTypeIndex,\n    IInStream *inStream,\n    const UString &fileName,\n    IInArchive **archiveResult,\n    int &formatIndex,\n    UString &defaultItemName,\n    IArchiveOpenCallback *openArchiveCallback);\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    int arcTypeIndex,\n    const UString &filePath,\n    IInArchive **archive,\n    int &formatIndex,\n    UString &defaultItemName,\n    IArchiveOpenCallback *openArchiveCallback);\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    const UString &filePath,\n    IInArchive **archive0,\n    IInArchive **archive1,\n    int &formatIndex0,\n    int &formatIndex1,\n    UString &defaultItemName0,\n    UString &defaultItemName1,\n    IArchiveOpenCallback *openArchiveCallback);\n\n\nHRESULT ReOpenArchive(IInArchive *archive, const UString &fileName, IArchiveOpenCallback *openArchiveCallback);\n\nstruct CArchiveLink\n{\n  CMyComPtr<IInArchive> Archive0;\n  CMyComPtr<IInArchive> Archive1;\n  UString DefaultItemName0;\n  UString DefaultItemName1;\n\n  int FormatIndex0;\n  int FormatIndex1;\n  \n  UStringVector VolumePaths;\n\n  bool IsOpen;\n  UInt64 VolumesSize;\n\n  int GetNumLevels() const\n  {\n    int result = 0;\n    if (Archive0)\n    {\n      result++;\n      if (Archive1)\n        result++;\n    }\n    return result;\n  }\n\n  CArchiveLink(): IsOpen(false), VolumesSize(0) {};\n\n  IInArchive *GetArchive() { return Archive1 != 0 ? Archive1: Archive0; }\n  UString GetDefaultItemName()  { return Archive1 != 0 ? DefaultItemName1: DefaultItemName0; }\n  int GetArchiverIndex() const { return Archive1 != 0 ? FormatIndex1: FormatIndex0; }\n  HRESULT Close();\n  void Release();\n};\n\nHRESULT OpenArchive(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    const UString &archiveName,\n    CArchiveLink &archiveLink,\n    IArchiveOpenCallback *openCallback);\n\nHRESULT MyOpenArchive(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    const UString &archiveName,\n    CArchiveLink &archiveLink,\n    IOpenCallbackUI *openCallbackUI);\n\nHRESULT ReOpenArchive(\n    CCodecs *codecs,\n    CArchiveLink &archiveLink,\n    const UString &fileName,\n    IArchiveOpenCallback *openCallback);\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/PropIDUtils.cpp",
    "content": "// PropIDUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"PropIDUtils.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/FileFind.h\"\n#include \"Windows/PropVariantConversions.h\"\n\n#include \"../../PropID.h\"\n\nusing namespace NWindows;\n\nstatic UString ConvertUInt32ToString(UInt32 value)\n{\n  wchar_t buffer[32];\n  ConvertUInt64ToString(value, buffer);\n  return buffer;\n}\n\nstatic void ConvertUInt32ToHex(UInt32 value, wchar_t *s)\n{\n  for (int i = 0; i < 8; i++)\n  {\n    int t = value & 0xF;\n    value >>= 4;\n    s[7 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10)));\n  }\n  s[8] = L'\\0';\n}\n\nUString ConvertPropertyToString(const PROPVARIANT &propVariant, PROPID propID, bool full)\n{\n  switch(propID)\n  {\n    case kpidCTime:\n    case kpidATime:\n    case kpidMTime:\n    {\n      if (propVariant.vt != VT_FILETIME)\n        return UString(); // It is error;\n      FILETIME localFileTime;\n      if (propVariant.filetime.dwHighDateTime == 0 &&\n          propVariant.filetime.dwLowDateTime == 0)\n        return UString();\n      if (!::FileTimeToLocalFileTime(&propVariant.filetime, &localFileTime))\n        return UString(); // It is error;\n      return ConvertFileTimeToString(localFileTime, true, full);\n    }\n    case kpidCRC:\n    {\n      if(propVariant.vt != VT_UI4)\n        break;\n      wchar_t temp[12];\n      ConvertUInt32ToHex(propVariant.ulVal, temp);\n      return temp;\n    }\n    case kpidAttrib:\n    {\n      if(propVariant.vt != VT_UI4)\n        break;\n      UString result;\n      UInt32 attributes = propVariant.ulVal;\n      if (NFile::NFind::NAttributes::IsReadOnly(attributes)) result += L'R';\n      if (NFile::NFind::NAttributes::IsHidden(attributes)) result += L'H';\n      if (NFile::NFind::NAttributes::IsSystem(attributes)) result += L'S';\n      if (NFile::NFind::NAttributes::IsDir(attributes)) result += L'D';\n      if (NFile::NFind::NAttributes::IsArchived(attributes)) result += L'A';\n      if (NFile::NFind::NAttributes::IsCompressed(attributes)) result += L'C';\n      if (NFile::NFind::NAttributes::IsEncrypted(attributes)) result += L'E';\n      return result;\n    }\n    case kpidDictionarySize:\n    {\n      if(propVariant.vt != VT_UI4)\n        break;\n      UInt32 size = propVariant.ulVal;\n      if (size % (1 << 20) == 0)\n        return ConvertUInt32ToString(size >> 20) + L\"MB\";\n      if (size % (1 << 10) == 0)\n        return ConvertUInt32ToString(size >> 10) + L\"KB\";\n      return ConvertUInt32ToString(size);\n    }\n  }\n  return ConvertPropVariantToString(propVariant);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/PropIDUtils.h",
    "content": "// PropIDUtils.h\n\n#ifndef __PROPIDUTILS_H\n#define __PROPIDUTILS_H\n\n#include \"Common/MyString.h\"\n\nUString ConvertPropertyToString(const PROPVARIANT &propVariant, PROPID propID, bool full = true);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/Property.h",
    "content": "// Property.h\n\n#ifndef __PROPERTY_H\n#define __PROPERTY_H\n\n#include \"Common/MyString.h\"\n\nstruct CProperty\n{\n  UString Name;\n  UString Value;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/SetProperties.cpp",
    "content": "// SetProperties.cpp\n\n#include \"StdAfx.h\"\n\n#include \"SetProperties.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Common/MyString.h\"\n#include \"Common/StringToInt.h\"\n#include \"Common/MyCom.h\"\n\n#include \"../../Archive/IArchive.h\"\n\nusing namespace NWindows;\nusing namespace NCOM;\n\nstatic void ParseNumberString(const UString &s, NCOM::CPropVariant &prop)\n{\n  const wchar_t *endPtr;\n  UInt64 result = ConvertStringToUInt64(s, &endPtr);\n  if (endPtr - (const wchar_t *)s != s.Length())\n    prop = s;\n  else if (result <= 0xFFFFFFFF)\n    prop = (UInt32)result;\n  else\n    prop = result;\n}\n\nHRESULT SetProperties(IUnknown *unknown, const CObjectVector<CProperty> &properties)\n{\n  if (properties.IsEmpty())\n    return S_OK;\n  CMyComPtr<ISetProperties> setProperties;\n  unknown->QueryInterface(IID_ISetProperties, (void **)&setProperties);\n  if (!setProperties)\n    return S_OK;\n\n  UStringVector realNames;\n  CPropVariant *values = new CPropVariant[properties.Size()];\n  try\n  {\n    int i;\n    for(i = 0; i < properties.Size(); i++)\n    {\n      const CProperty &property = properties[i];\n      NCOM::CPropVariant propVariant;\n      UString name = property.Name;\n      if (property.Value.IsEmpty())\n      {\n        if (!name.IsEmpty())\n        {\n          wchar_t c = name[name.Length() - 1];\n          if (c == L'-')\n            propVariant = false;\n          else if (c == L'+')\n            propVariant = true;\n          if (propVariant.vt != VT_EMPTY)\n            name = name.Left(name.Length() - 1);\n        }\n      }\n      else\n        ParseNumberString(property.Value, propVariant);\n      realNames.Add(name);\n      values[i] = propVariant;\n    }\n    CRecordVector<const wchar_t *> names;\n    for(i = 0; i < realNames.Size(); i++)\n      names.Add((const wchar_t *)realNames[i]);\n    \n    RINOK(setProperties->SetProperties(&names.Front(), values, names.Size()));\n  }\n  catch(...)\n  {\n    delete []values;\n    throw;\n  }\n  delete []values;\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/SetProperties.h",
    "content": "// SetProperties.h\n\n#ifndef __SETPROPERTIES_H\n#define __SETPROPERTIES_H\n\n#include \"Property.h\"\n\nHRESULT SetProperties(IUnknown *unknown, const CObjectVector<CProperty> &properties);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/SortUtils.cpp",
    "content": "// SortUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"SortUtils.h\"\n#include \"Common/Wildcard.h\"\n\nstatic int CompareStrings(const int *p1, const int *p2, void *param)\n{\n  const UStringVector &strings = *(const UStringVector *)param;\n  return CompareFileNames(strings[*p1], strings[*p2]);\n}\n\nvoid SortFileNames(const UStringVector &strings, CIntVector &indices)\n{\n  indices.Clear();\n  int numItems = strings.Size();\n  indices.Reserve(numItems);\n  for(int i = 0; i < numItems; i++)\n    indices.Add(i);\n  indices.Sort(CompareStrings, (void *)&strings);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/SortUtils.h",
    "content": "// SortUtils.h\n\n#ifndef __SORTUTLS_H\n#define __SORTUTLS_H\n\n#include \"Common/MyString.h\"\n\nvoid SortFileNames(const UStringVector &strings, CIntVector &indices);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/TempFiles.cpp",
    "content": "// TempFiles.cpp\n\n#include \"StdAfx.h\"\n\n#include \"TempFiles.h\"\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileIO.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\n\nvoid CTempFiles::Clear()\n{\n  while(!Paths.IsEmpty())\n  {\n    NDirectory::DeleteFileAlways((LPCWSTR)Paths.Back());\n    Paths.DeleteBack();\n  }\n}\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/TempFiles.h",
    "content": "// TempFiles.h\n\n#ifndef __TEMPFILES_H\n#define __TEMPFILES_H\n\n#include \"Common/MyString.h\"\n\nclass CTempFiles\n{\n  void Clear();\npublic:\n  UStringVector Paths;\n  ~CTempFiles() { Clear(); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/Update.cpp",
    "content": "// Update.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Update.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#ifdef _WIN32\n#include \"Windows/DLL.h\"\n#endif\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n#include \"Windows/Time.h\"\n\n#include \"../../Common/FileStreams.h\"\n\n#include \"../../Compress/CopyCoder.h\"\n\n#include \"../Common/DirItem.h\"\n#include \"../Common/EnumDirItems.h\"\n#include \"../Common/OpenArchive.h\"\n#include \"../Common/UpdateProduce.h\"\n\n#include \"EnumDirItems.h\"\n#include \"SetProperties.h\"\n#include \"TempFiles.h\"\n#include \"UpdateCallback.h\"\n\nstatic const char *kUpdateIsNotSupoorted =\n  \"update operations are not supported for this archive\";\n\nusing namespace NWindows;\nusing namespace NCOM;\nusing namespace NFile;\nusing namespace NName;\n\nstatic const wchar_t *kTempFolderPrefix = L\"7zE\";\n\nusing namespace NUpdateArchive;\n\nstatic HRESULT CopyBlock(ISequentialInStream *inStream, ISequentialOutStream *outStream)\n{\n  CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;\n  return copyCoder->Code(inStream, outStream, NULL, NULL, NULL);\n}\n\nclass COutMultiVolStream:\n  public IOutStream,\n  public CMyUnknownImp\n{\n  int _streamIndex; // required stream\n  UInt64 _offsetPos; // offset from start of _streamIndex index\n  UInt64 _absPos;\n  UInt64 _length;\n\n  struct CSubStreamInfo\n  {\n    COutFileStream *StreamSpec;\n    CMyComPtr<IOutStream> Stream;\n    UString Name;\n    UInt64 Pos;\n    UInt64 RealSize;\n  };\n  CObjectVector<CSubStreamInfo> Streams;\npublic:\n  // CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;\n  CRecordVector<UInt64> Sizes;\n  UString Prefix;\n  CTempFiles *TempFiles;\n\n  void Init()\n  {\n    _streamIndex = 0;\n    _offsetPos = 0;\n    _absPos = 0;\n    _length = 0;\n  }\n\n  HRESULT Close();\n\n  MY_UNKNOWN_IMP1(IOutStream)\n\n  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);\n  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);\n  STDMETHOD(SetSize)(Int64 newSize);\n};\n\n// static NSynchronization::CCriticalSection g_TempPathsCS;\n\nHRESULT COutMultiVolStream::Close()\n{\n  HRESULT res = S_OK;\n  for (int i = 0; i < Streams.Size(); i++)\n  {\n    CSubStreamInfo &s = Streams[i];\n    if (s.StreamSpec)\n    {\n      HRESULT res2 = s.StreamSpec->Close();\n      if (res2 != S_OK)\n        res = res2;\n    }\n  }\n  return res;\n}\n\nSTDMETHODIMP COutMultiVolStream::Write(const void *data, UInt32 size, UInt32 *processedSize)\n{\n  if(processedSize != NULL)\n    *processedSize = 0;\n  while(size > 0)\n  {\n    if (_streamIndex >= Streams.Size())\n    {\n      CSubStreamInfo subStream;\n\n      wchar_t temp[32];\n      ConvertUInt64ToString(_streamIndex + 1, temp);\n      UString res = temp;\n      while (res.Length() < 3)\n        res = UString(L'0') + res;\n      UString name = Prefix + res;\n      subStream.StreamSpec = new COutFileStream;\n      subStream.Stream = subStream.StreamSpec;\n      if(!subStream.StreamSpec->Create(name, false))\n        return ::GetLastError();\n      {\n        // NSynchronization::CCriticalSectionLock lock(g_TempPathsCS);\n        TempFiles->Paths.Add(name);\n      }\n\n      subStream.Pos = 0;\n      subStream.RealSize = 0;\n      subStream.Name = name;\n      Streams.Add(subStream);\n      continue;\n    }\n    CSubStreamInfo &subStream = Streams[_streamIndex];\n\n    int index = _streamIndex;\n    if (index >= Sizes.Size())\n      index = Sizes.Size() - 1;\n    UInt64 volSize = Sizes[index];\n\n    if (_offsetPos >= volSize)\n    {\n      _offsetPos -= volSize;\n      _streamIndex++;\n      continue;\n    }\n    if (_offsetPos != subStream.Pos)\n    {\n      // CMyComPtr<IOutStream> outStream;\n      // RINOK(subStream.Stream.QueryInterface(IID_IOutStream, &outStream));\n      RINOK(subStream.Stream->Seek(_offsetPos, STREAM_SEEK_SET, NULL));\n      subStream.Pos = _offsetPos;\n    }\n\n    UInt32 curSize = (UInt32)MyMin((UInt64)size, volSize - subStream.Pos);\n    UInt32 realProcessed;\n    RINOK(subStream.Stream->Write(data, curSize, &realProcessed));\n    data = (void *)((Byte *)data + realProcessed);\n    size -= realProcessed;\n    subStream.Pos += realProcessed;\n    _offsetPos += realProcessed;\n    _absPos += realProcessed;\n    if (_absPos > _length)\n      _length = _absPos;\n    if (_offsetPos > subStream.RealSize)\n      subStream.RealSize = _offsetPos;\n    if(processedSize != NULL)\n      *processedSize += realProcessed;\n    if (subStream.Pos == volSize)\n    {\n      _streamIndex++;\n      _offsetPos = 0;\n    }\n    if (realProcessed == 0 && curSize != 0)\n      return E_FAIL;\n    break;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP COutMultiVolStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)\n{\n  if(seekOrigin >= 3)\n    return STG_E_INVALIDFUNCTION;\n  switch(seekOrigin)\n  {\n    case STREAM_SEEK_SET:\n      _absPos = offset;\n      break;\n    case STREAM_SEEK_CUR:\n      _absPos += offset;\n      break;\n    case STREAM_SEEK_END:\n      _absPos = _length + offset;\n      break;\n  }\n  _offsetPos = _absPos;\n  if (newPosition != NULL)\n    *newPosition = _absPos;\n  _streamIndex = 0;\n  return S_OK;\n}\n\nSTDMETHODIMP COutMultiVolStream::SetSize(Int64 newSize)\n{\n  if (newSize < 0)\n    return E_INVALIDARG;\n  int i = 0;\n  while (i < Streams.Size())\n  {\n    CSubStreamInfo &subStream = Streams[i++];\n    if ((UInt64)newSize < subStream.RealSize)\n    {\n      RINOK(subStream.Stream->SetSize(newSize));\n      subStream.RealSize = newSize;\n      break;\n    }\n    newSize -= subStream.RealSize;\n  }\n  while (i < Streams.Size())\n  {\n    {\n      CSubStreamInfo &subStream = Streams.Back();\n      subStream.Stream.Release();\n      NDirectory::DeleteFileAlways(subStream.Name);\n    }\n    Streams.DeleteBack();\n  }\n  _offsetPos = _absPos;\n  _streamIndex = 0;\n  _length = newSize;\n  return S_OK;\n}\n\nstatic const wchar_t *kDefaultArchiveType = L\"7z\";\nstatic const wchar_t *kSFXExtension =\n  #ifdef _WIN32\n    L\"exe\";\n  #else\n    L\"\";\n  #endif\n\nbool CUpdateOptions::Init(const CCodecs *codecs, const CIntVector &formatIndices, const UString &arcPath)\n{\n  if (formatIndices.Size() > 1)\n    return false;\n  int arcTypeIndex = -1;\n  if (formatIndices.Size() != 0)\n    arcTypeIndex = formatIndices[0];\n  if (arcTypeIndex >= 0)\n    MethodMode.FormatIndex = arcTypeIndex;\n  else\n  {\n    MethodMode.FormatIndex = codecs->FindFormatForArchiveName(arcPath);\n    if (MethodMode.FormatIndex < 0)\n      MethodMode.FormatIndex = codecs->FindFormatForArchiveType(kDefaultArchiveType);\n  }\n  if (MethodMode.FormatIndex < 0)\n    return false;\n  const CArcInfoEx &arcInfo = codecs->Formats[MethodMode.FormatIndex];\n  if (!arcInfo.UpdateEnabled)\n    return false;\n  UString typeExt = arcInfo.GetMainExt();\n  UString ext = typeExt;\n  if (SfxMode)\n    ext = kSFXExtension;\n  ArchivePath.BaseExtension = ext;\n  ArchivePath.VolExtension = typeExt;\n  ArchivePath.ParseFromPath(arcPath);\n  for (int i = 0; i < Commands.Size(); i++)\n  {\n    CUpdateArchiveCommand &uc = Commands[i];\n    uc.ArchivePath.BaseExtension = ext;\n    uc.ArchivePath.VolExtension = typeExt;\n    uc.ArchivePath.ParseFromPath(uc.UserArchivePath);\n  }\n  return true;\n}\n\n/*\nstruct CUpdateProduceCallbackImp: public IUpdateProduceCallback\n{\n  const CObjectVector<CArcItem> *_arcItems;\n  IUpdateCallbackUI *_callback;\n  \n  CUpdateProduceCallbackImp(const CObjectVector<CArcItem> *a, \n      IUpdateCallbackUI *callback): _arcItems(a), _callback(callback) {}\n  virtual HRESULT ShowDeleteFile(int arcIndex);\n};\n\nHRESULT CUpdateProduceCallbackImp::ShowDeleteFile(int arcIndex)\n{\n  return _callback->ShowDeleteFile((*_arcItems)[arcIndex].Name);\n}\n*/\n\nstatic HRESULT Compress(\n    CCodecs *codecs,\n    const CActionSet &actionSet,\n    IInArchive *archive,\n    const CCompressionMethodMode &compressionMethod,\n    CArchivePath &archivePath,\n    const CObjectVector<CArcItem> &arcItems,\n    bool shareForWrite,\n    bool stdInMode,\n    /* const UString & stdInFileName, */\n    bool stdOutMode,\n    const CDirItems &dirItems,\n    bool sfxMode,\n    const UString &sfxModule,\n    const CRecordVector<UInt64> &volumesSizes,\n    CTempFiles &tempFiles,\n    CUpdateErrorInfo &errorInfo,\n    IUpdateCallbackUI *callback)\n{\n  CMyComPtr<IOutArchive> outArchive;\n  if(archive != NULL)\n  {\n    CMyComPtr<IInArchive> archive2 = archive;\n    HRESULT result = archive2.QueryInterface(IID_IOutArchive, &outArchive);\n    if(result != S_OK)\n      throw kUpdateIsNotSupoorted;\n  }\n  else\n  {\n    RINOK(codecs->CreateOutArchive(compressionMethod.FormatIndex, outArchive));\n\n    #ifdef EXTERNAL_CODECS\n    {\n      CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;\n      outArchive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);\n      if (setCompressCodecsInfo)\n      {\n        RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecs));\n      }\n    }\n    #endif\n  }\n  if (outArchive == 0)\n    throw kUpdateIsNotSupoorted;\n  \n  NFileTimeType::EEnum fileTimeType;\n  UInt32 value;\n  RINOK(outArchive->GetFileTimeType(&value));\n\n  switch(value)\n  {\n    case NFileTimeType::kWindows:\n    case NFileTimeType::kUnix:\n    case NFileTimeType::kDOS:\n      fileTimeType = (NFileTimeType::EEnum)value;\n      break;\n    default:\n      return E_FAIL;\n  }\n\n  CRecordVector<CUpdatePair2> updatePairs2;\n\n  {\n    CRecordVector<CUpdatePair> updatePairs;\n    GetUpdatePairInfoList(dirItems, arcItems, fileTimeType, updatePairs); // must be done only once!!!\n    // CUpdateProduceCallbackImp upCallback(&arcItems, callback);\n    UpdateProduce(updatePairs, actionSet, updatePairs2, NULL /* &upCallback */);\n  }\n\n  UInt32 numFiles = 0;\n  for (int i = 0; i < updatePairs2.Size(); i++)\n    if (updatePairs2[i].NewData)\n      numFiles++;\n  \n  RINOK(callback->SetNumFiles(numFiles));\n\n  \n  CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback;\n  CMyComPtr<IArchiveUpdateCallback> updateCallback(updateCallbackSpec);\n  \n  updateCallbackSpec->ShareForWrite = shareForWrite;\n  updateCallbackSpec->StdInMode = stdInMode;\n  updateCallbackSpec->Callback = callback;\n  updateCallbackSpec->DirItems = &dirItems;\n  updateCallbackSpec->ArcItems = &arcItems;\n  updateCallbackSpec->UpdatePairs = &updatePairs2;\n\n  CMyComPtr<ISequentialOutStream> outStream;\n\n  const UString &archiveName = archivePath.GetFinalPath();\n  if (!stdOutMode)\n  {\n    UString resultPath;\n    int pos;\n    if(!NFile::NDirectory::MyGetFullPathName(archiveName, resultPath, pos))\n      throw 1417161;\n    NFile::NDirectory::CreateComplexDirectory(resultPath.Left(pos));\n  }\n\n  COutFileStream *outStreamSpec = NULL;\n  COutMultiVolStream *volStreamSpec = NULL;\n\n  if (volumesSizes.Size() == 0)\n  {\n    if (stdOutMode)\n      outStream = new CStdOutFileStream;\n    else\n    {\n      outStreamSpec = new COutFileStream;\n      outStream = outStreamSpec;\n      bool isOK = false;\n      UString realPath;\n      for (int i = 0; i < (1 << 16); i++)\n      {\n        if (archivePath.Temp)\n        {\n          if (i > 0)\n          {\n            wchar_t s[32];\n            ConvertUInt64ToString(i, s);\n            archivePath.TempPostfix = s;\n          }\n          realPath = archivePath.GetTempPath();\n        }\n        else\n          realPath = archivePath.GetFinalPath();\n        if (outStreamSpec->Create(realPath, false))\n        {\n          tempFiles.Paths.Add(realPath);\n          isOK = true;\n          break;\n        }\n        if (::GetLastError() != ERROR_FILE_EXISTS)\n          break;\n        if (!archivePath.Temp)\n          break;\n      }\n      if (!isOK)\n      {\n        errorInfo.SystemError = ::GetLastError();\n        errorInfo.FileName = realPath;\n        errorInfo.Message = L\"Can not open file\";\n        return E_FAIL;\n      }\n    }\n  }\n  else\n  {\n    if (stdOutMode)\n      return E_FAIL;\n    volStreamSpec = new COutMultiVolStream;\n    outStream = volStreamSpec;\n    volStreamSpec->Sizes = volumesSizes;\n    volStreamSpec->Prefix = archivePath.GetFinalPath() + UString(L\".\");\n    volStreamSpec->TempFiles = &tempFiles;\n    volStreamSpec->Init();\n\n    /*\n    updateCallbackSpec->VolumesSizes = volumesSizes;\n    updateCallbackSpec->VolName = archivePath.Prefix + archivePath.Name;\n    if (!archivePath.VolExtension.IsEmpty())\n      updateCallbackSpec->VolExt = UString(L'.') + archivePath.VolExtension;\n    */\n  }\n\n  RINOK(SetProperties(outArchive, compressionMethod.Properties));\n\n  if (sfxMode)\n  {\n    CInFileStream *sfxStreamSpec = new CInFileStream;\n    CMyComPtr<IInStream> sfxStream(sfxStreamSpec);\n    if (!sfxStreamSpec->Open(sfxModule))\n    {\n      errorInfo.SystemError = ::GetLastError();\n      errorInfo.Message = L\"Can't open sfx module\";\n      errorInfo.FileName = sfxModule;\n      return E_FAIL;\n    }\n\n    CMyComPtr<ISequentialOutStream> sfxOutStream;\n    COutFileStream *outStreamSpec = NULL;\n    if (volumesSizes.Size() == 0)\n      sfxOutStream = outStream;\n    else\n    {\n      outStreamSpec = new COutFileStream;\n      sfxOutStream = outStreamSpec;\n      UString realPath = archivePath.GetFinalPath();\n      if (!outStreamSpec->Create(realPath, false))\n      {\n        errorInfo.SystemError = ::GetLastError();\n        errorInfo.FileName = realPath;\n        errorInfo.Message = L\"Can not open file\";\n        return E_FAIL;\n      }\n    }\n    RINOK(CopyBlock(sfxStream, sfxOutStream));\n    if (outStreamSpec)\n    {\n      RINOK(outStreamSpec->Close());\n    }\n  }\n\n  HRESULT result = outArchive->UpdateItems(outStream, updatePairs2.Size(), updateCallback);\n  callback->Finilize();\n  RINOK(result);\n  if (outStreamSpec)\n    result = outStreamSpec->Close();\n  else if (volStreamSpec)\n    result = volStreamSpec->Close();\n  return result;\n}\n\nHRESULT EnumerateInArchiveItems(const NWildcard::CCensor &censor,\n    IInArchive *archive,\n    const UString &defaultItemName,\n    const NWindows::NFile::NFind::CFileInfoW &archiveFileInfo,\n    CObjectVector<CArcItem> &arcItems)\n{\n  arcItems.Clear();\n  UInt32 numItems;\n  RINOK(archive->GetNumberOfItems(&numItems));\n  arcItems.Reserve(numItems);\n  for (UInt32 i = 0; i < numItems; i++)\n  {\n    CArcItem ai;\n\n    RINOK(GetArchiveItemPath(archive, i, ai.Name));\n    // check it: defaultItemName !!!\n    if (ai.Name.IsEmpty())\n      ai.Name = defaultItemName;\n    RINOK(IsArchiveItemFolder(archive, i, ai.IsDir));\n    ai.Censored = censor.CheckPath(ai.Name, !ai.IsDir);\n    RINOK(GetArchiveItemFileTime(archive, i, archiveFileInfo.MTime, ai.MTime));\n\n    {\n      CPropVariant prop;\n      RINOK(archive->GetProperty(i, kpidSize, &prop));\n      ai.SizeDefined = (prop.vt != VT_EMPTY);\n      if (ai.SizeDefined)\n        ai.Size = ConvertPropVariantToUInt64(prop);\n    }\n\n    {\n      CPropVariant prop;\n      RINOK(archive->GetProperty(i, kpidTimeType, &prop));\n      if (prop.vt == VT_UI4)\n      {\n        ai.TimeType = (int)(NFileTimeType::EEnum)prop.ulVal;\n        switch(ai.TimeType)\n        {\n          case NFileTimeType::kWindows:\n          case NFileTimeType::kUnix:\n          case NFileTimeType::kDOS:\n            break;\n          default:\n            return E_FAIL;\n        }\n      }\n    }\n\n    ai.IndexInServer = i;\n    arcItems.Add(ai);\n  }\n  return S_OK;\n}\n\n\nstatic HRESULT UpdateWithItemLists(\n    CCodecs *codecs,\n    CUpdateOptions &options,\n    IInArchive *archive,\n    const CObjectVector<CArcItem> &arcItems,\n    CDirItems &dirItems,\n    CTempFiles &tempFiles,\n    CUpdateErrorInfo &errorInfo,\n    IUpdateCallbackUI2 *callback)\n{\n  for(int i = 0; i < options.Commands.Size(); i++)\n  {\n    CUpdateArchiveCommand &command = options.Commands[i];\n    if (options.StdOutMode)\n    {\n      RINOK(callback->StartArchive(0, archive != 0));\n    }\n    else\n    {\n      RINOK(callback->StartArchive(command.ArchivePath.GetFinalPath(),\n          i == 0 && options.UpdateArchiveItself && archive != 0));\n    }\n\n    RINOK(Compress(\n        codecs,\n        command.ActionSet, archive,\n        options.MethodMode,\n        command.ArchivePath,\n        arcItems,\n        options.OpenShareForWrite,\n        options.StdInMode,\n        /* options.StdInFileName, */\n        options.StdOutMode,\n        dirItems,\n        options.SfxMode, options.SfxModule,\n        options.VolumesSizes,\n        tempFiles,\n        errorInfo, callback));\n\n    RINOK(callback->FinishArchive());\n  }\n  return S_OK;\n}\n\n#ifdef _WIN32\nclass CCurrentDirRestorer\n{\n  UString m_CurrentDirectory;\npublic:\n  CCurrentDirRestorer()\n    { NFile::NDirectory::MyGetCurrentDirectory(m_CurrentDirectory); }\n  ~CCurrentDirRestorer()\n    { RestoreDirectory();}\n  bool RestoreDirectory()\n    { return BOOLToBool(NFile::NDirectory::MySetCurrentDirectory(m_CurrentDirectory)); }\n};\n#endif\n\nstruct CEnumDirItemUpdateCallback: public IEnumDirItemCallback\n{\n  IUpdateCallbackUI2 *Callback;\n  HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, const wchar_t *path)\n  {\n    return Callback->ScanProgress(numFolders, numFiles, path);\n  }\n};\n\n#ifdef _WIN32\ntypedef ULONG (FAR PASCAL MY_MAPISENDDOCUMENTS)(\n  ULONG_PTR ulUIParam,\n  LPSTR lpszDelimChar,\n  LPSTR lpszFilePaths,\n  LPSTR lpszFileNames,\n  ULONG ulReserved\n);\ntypedef MY_MAPISENDDOCUMENTS FAR *MY_LPMAPISENDDOCUMENTS;\n#endif\n\nHRESULT UpdateArchive(\n    CCodecs *codecs,\n    const NWildcard::CCensor &censor,\n    CUpdateOptions &options,\n    CUpdateErrorInfo &errorInfo,\n    IOpenCallbackUI *openCallback,\n    IUpdateCallbackUI2 *callback)\n{\n  if (options.StdOutMode && options.EMailMode)\n    return E_FAIL;\n\n  if (options.VolumesSizes.Size() > 0 && (options.EMailMode || options.SfxMode))\n    return E_NOTIMPL;\n\n  if (options.SfxMode)\n  {\n    CProperty property;\n    property.Name = L\"rsfx\";\n    property.Value = L\"on\";\n    options.MethodMode.Properties.Add(property);\n    if (options.SfxModule.IsEmpty())\n    {\n      errorInfo.Message = L\"sfx file is not specified\";\n      return E_FAIL;\n    }\n    UString name = options.SfxModule;\n    if (!NDirectory::MySearchPath(NULL, name, NULL, options.SfxModule))\n    {\n      errorInfo.Message = L\"can't find specified sfx module\";\n      return E_FAIL;\n    }\n  }\n\n  const UString archiveName = options.ArchivePath.GetFinalPath();\n\n  UString defaultItemName;\n  NFind::CFileInfoW archiveFileInfo;\n\n  CArchiveLink archiveLink;\n  IInArchive *archive = 0;\n  if (NFind::FindFile(archiveName, archiveFileInfo))\n  {\n    if (archiveFileInfo.IsDir())\n      throw \"there is no such archive\";\n    if (options.VolumesSizes.Size() > 0)\n      return E_NOTIMPL;\n    CIntVector formatIndices;\n    if (options.MethodMode.FormatIndex >= 0)\n      formatIndices.Add(options.MethodMode.FormatIndex);\n    HRESULT result = MyOpenArchive(codecs, formatIndices, archiveName, archiveLink, openCallback);\n    if (result == E_ABORT)\n      return result;\n    RINOK(callback->OpenResult(archiveName, result));\n    RINOK(result);\n    if (archiveLink.VolumePaths.Size() > 1)\n    {\n      errorInfo.SystemError = (DWORD)E_NOTIMPL;\n      errorInfo.Message = L\"Updating for multivolume archives is not implemented\";\n      return E_NOTIMPL;\n    }\n    archive = archiveLink.GetArchive();\n    defaultItemName = archiveLink.GetDefaultItemName();\n  }\n  else\n  {\n    /*\n    if (archiveType.IsEmpty())\n      throw \"type of archive is not specified\";\n    */\n  }\n\n  CDirItems dirItems;\n  if (options.StdInMode)\n  {\n    CDirItem di;\n    di.Name = options.StdInFileName;\n    di.Size = (UInt64)(Int64)-1;\n    di.Attrib = 0;\n    NTime::GetCurUtcFileTime(di.MTime);\n    di.CTime = di.ATime = di.MTime;\n    dirItems.Items.Add(di);\n  }\n  else\n  {\n    bool needScanning = false;\n    for(int i = 0; i < options.Commands.Size(); i++)\n      if (options.Commands[i].ActionSet.NeedScanning())\n        needScanning = true;\n    if (needScanning)\n    {\n      CEnumDirItemUpdateCallback enumCallback;\n      enumCallback.Callback = callback;\n      RINOK(callback->StartScanning());\n      UStringVector errorPaths;\n      CRecordVector<DWORD> errorCodes;\n      HRESULT res = EnumerateItems(censor, dirItems, &enumCallback, errorPaths, errorCodes);\n      for (int i = 0; i < errorPaths.Size(); i++)\n      {\n        RINOK(callback->CanNotFindError(errorPaths[i], errorCodes[i]));\n      }\n      if (res != S_OK)\n      {\n        if (res != E_ABORT)\n          errorInfo.Message = L\"Scanning error\";\n        // errorInfo.FileName = errorPath;\n        return res;\n      }\n      RINOK(callback->FinishScanning());\n    }\n  }\n\n  UString tempDirPrefix;\n  bool usesTempDir = false;\n  \n  #ifdef _WIN32\n  NDirectory::CTempDirectoryW tempDirectory;\n  if (options.EMailMode && options.EMailRemoveAfter)\n  {\n    tempDirectory.Create(kTempFolderPrefix);\n    tempDirPrefix = tempDirectory.GetPath();\n    NormalizeDirPathPrefix(tempDirPrefix);\n    usesTempDir = true;\n  }\n  #endif\n\n  CTempFiles tempFiles;\n\n  bool createTempFile = false;\n  if(!options.StdOutMode && options.UpdateArchiveItself)\n  {\n    CArchivePath &ap = options.Commands[0].ArchivePath;\n    ap = options.ArchivePath;\n    // if ((archive != 0 && !usesTempDir) || !options.WorkingDir.IsEmpty())\n    if ((archive != 0 || !options.WorkingDir.IsEmpty()) && !usesTempDir && options.VolumesSizes.Size() == 0)\n    {\n      createTempFile = true;\n      ap.Temp = true;\n      if (!options.WorkingDir.IsEmpty())\n      {\n        ap.TempPrefix = options.WorkingDir;\n        NormalizeDirPathPrefix(ap.TempPrefix);\n      }\n    }\n  }\n\n  for(int i = 0; i < options.Commands.Size(); i++)\n  {\n    CArchivePath &ap = options.Commands[i].ArchivePath;\n    if (usesTempDir)\n    {\n      // Check it\n      ap.Prefix = tempDirPrefix;\n      // ap.Temp = true;\n      // ap.TempPrefix = tempDirPrefix;\n    }\n    if (i > 0 || !createTempFile)\n    {\n      const UString &path = ap.GetFinalPath();\n      if (NFind::DoesFileExist(path))\n      {\n        errorInfo.SystemError = 0;\n        errorInfo.Message = L\"File already exists\";\n        errorInfo.FileName = path;\n        return E_FAIL;\n      }\n    }\n  }\n\n  CObjectVector<CArcItem> arcItems;\n  if (archive != NULL)\n  {\n    RINOK(EnumerateInArchiveItems(censor,\n        archive, defaultItemName, archiveFileInfo, arcItems));\n  }\n\n  RINOK(UpdateWithItemLists(codecs, options, archive, arcItems, dirItems,\n      tempFiles, errorInfo, callback));\n\n  if (archive != NULL)\n  {\n    RINOK(archiveLink.Close());\n    archiveLink.Release();\n  }\n\n  tempFiles.Paths.Clear();\n  if(createTempFile)\n  {\n    try\n    {\n      CArchivePath &ap = options.Commands[0].ArchivePath;\n      const UString &tempPath = ap.GetTempPath();\n      if (archive != NULL)\n        if (!NDirectory::DeleteFileAlways(archiveName))\n        {\n          errorInfo.SystemError = ::GetLastError();\n          errorInfo.Message = L\"delete file error\";\n          errorInfo.FileName = archiveName;\n          return E_FAIL;\n        }\n      if (!NDirectory::MyMoveFile(tempPath, archiveName))\n      {\n        errorInfo.SystemError = ::GetLastError();\n        errorInfo.Message = L\"move file error\";\n        errorInfo.FileName = tempPath;\n        errorInfo.FileName2 = archiveName;\n        return E_FAIL;\n      }\n    }\n    catch(...)\n    {\n      throw;\n    }\n  }\n\n  #ifdef _WIN32\n  if (options.EMailMode)\n  {\n    NDLL::CLibrary mapiLib;\n    if (!mapiLib.Load(TEXT(\"Mapi32.dll\")))\n    {\n      errorInfo.SystemError = ::GetLastError();\n      errorInfo.Message = L\"can not load Mapi32.dll\";\n      return E_FAIL;\n    }\n    MY_LPMAPISENDDOCUMENTS fnSend = (MY_LPMAPISENDDOCUMENTS)\n        mapiLib.GetProcAddress(\"MAPISendDocuments\");\n    if (fnSend == 0)\n    {\n      errorInfo.SystemError = ::GetLastError();\n      errorInfo.Message = L\"can not find MAPISendDocuments function\";\n      return E_FAIL;\n    }\n    UStringVector fullPaths;\n    int i;\n    for(i = 0; i < options.Commands.Size(); i++)\n    {\n      CArchivePath &ap = options.Commands[i].ArchivePath;\n      UString arcPath;\n      if(!NFile::NDirectory::MyGetFullPathName(ap.GetFinalPath(), arcPath))\n      {\n        errorInfo.SystemError = ::GetLastError();\n        return E_FAIL;\n      }\n      fullPaths.Add(arcPath);\n    }\n    CCurrentDirRestorer curDirRestorer;\n    for(i = 0; i < fullPaths.Size(); i++)\n    {\n      UString arcPath = fullPaths[i];\n      UString fileName = ExtractFileNameFromPath(arcPath);\n      AString path = GetAnsiString(arcPath);\n      AString name = GetAnsiString(fileName);\n      // Warning!!! MAPISendDocuments function changes Current directory\n      fnSend(0, \";\", (LPSTR)(LPCSTR)path, (LPSTR)(LPCSTR)name, 0);\n    }\n  }\n  #endif\n  return S_OK;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/Update.h",
    "content": "// Update.h\n\n#ifndef __UPDATE_H\n#define __UPDATE_H\n\n#include \"Common/Wildcard.h\"\n#include \"Windows/FileFind.h\"\n#include \"../../Archive/IArchive.h\"\n\n#include \"UpdateAction.h\"\n#include \"ArchiveOpenCallback.h\"\n#include \"UpdateCallback.h\"\n#include \"Property.h\"\n#include \"LoadCodecs.h\"\n\nstruct CArchivePath\n{\n  UString Prefix;   // path(folder) prefix including slash\n  UString Name; // base name\n  UString BaseExtension; // archive type extension or \"exe\" extension\n  UString VolExtension;  // archive type extension for volumes\n\n  bool Temp;\n  UString TempPrefix;  // path(folder) for temp location\n  UString TempPostfix;\n\n  CArchivePath(): Temp(false) {};\n  \n  void ParseFromPath(const UString &path)\n  {\n    SplitPathToParts(path, Prefix, Name);\n    if (Name.IsEmpty())\n      return;\n    int dotPos = Name.ReverseFind(L'.');\n    if (dotPos <= 0)\n      return;\n    if (dotPos == Name.Length() - 1)\n    {\n      Name = Name.Left(dotPos);\n      BaseExtension.Empty();\n      return;\n    }\n    if (BaseExtension.CompareNoCase(Name.Mid(dotPos + 1)) == 0)\n    {\n      BaseExtension = Name.Mid(dotPos + 1);\n      Name = Name.Left(dotPos);\n    }\n    else\n      BaseExtension.Empty();\n  }\n\n  UString GetPathWithoutExt() const\n  {\n    return Prefix + Name;\n  }\n\n  UString GetFinalPath() const\n  {\n    UString path = GetPathWithoutExt();\n    if (!BaseExtension.IsEmpty())\n      path += UString(L'.') + BaseExtension;\n    return path;\n  }\n\n  \n  UString GetTempPath() const\n  {\n    UString path = TempPrefix + Name;\n    if (!BaseExtension.IsEmpty())\n      path += UString(L'.') + BaseExtension;\n    path += L\".tmp\";\n    path += TempPostfix;\n    return path;\n  }\n};\n\nstruct CUpdateArchiveCommand\n{\n  UString UserArchivePath;\n  CArchivePath ArchivePath;\n  NUpdateArchive::CActionSet ActionSet;\n};\n\nstruct CCompressionMethodMode\n{\n  int FormatIndex;\n  CObjectVector<CProperty> Properties;\n  CCompressionMethodMode(): FormatIndex(-1) {}\n};\n\nstruct CUpdateOptions\n{\n  CCompressionMethodMode MethodMode;\n\n  CObjectVector<CUpdateArchiveCommand> Commands;\n  bool UpdateArchiveItself;\n  CArchivePath ArchivePath;\n  \n  bool SfxMode;\n  UString SfxModule;\n  \n  bool OpenShareForWrite;\n\n  bool StdInMode;\n  UString StdInFileName;\n  bool StdOutMode;\n  \n  bool EMailMode;\n  bool EMailRemoveAfter;\n  UString EMailAddress;\n\n  UString WorkingDir;\n\n  bool Init(const CCodecs *codecs, const CIntVector &formatIndices, const UString &arcPath);\n\n  CUpdateOptions():\n    UpdateArchiveItself(true),\n    SfxMode(false),\n    StdInMode(false),\n    StdOutMode(false),\n    EMailMode(false),\n    EMailRemoveAfter(false),\n    OpenShareForWrite(false)\n      {};\n  CRecordVector<UInt64> VolumesSizes;\n};\n\nstruct CErrorInfo\n{\n  DWORD SystemError;\n  UString FileName;\n  UString FileName2;\n  UString Message;\n  // UStringVector ErrorPaths;\n  // CRecordVector<DWORD> ErrorCodes;\n  CErrorInfo(): SystemError(0) {};\n};\n\nstruct CUpdateErrorInfo: public CErrorInfo\n{\n};\n\n#define INTERFACE_IUpdateCallbackUI2(x) \\\n  INTERFACE_IUpdateCallbackUI(x) \\\n  virtual HRESULT OpenResult(const wchar_t *name, HRESULT result) x; \\\n  virtual HRESULT StartScanning() x; \\\n  virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, const wchar_t *path) x; \\\n  virtual HRESULT CanNotFindError(const wchar_t *name, DWORD systemError) x; \\\n  virtual HRESULT FinishScanning() x; \\\n  virtual HRESULT StartArchive(const wchar_t *name, bool updating) x; \\\n  virtual HRESULT FinishArchive() x; \\\n\nstruct IUpdateCallbackUI2: public IUpdateCallbackUI\n{\n  INTERFACE_IUpdateCallbackUI2(=0)\n};\n\nHRESULT UpdateArchive(\n    CCodecs *codecs,\n    const NWildcard::CCensor &censor,\n    CUpdateOptions &options,\n    CUpdateErrorInfo &errorInfo,\n    IOpenCallbackUI *openCallback,\n    IUpdateCallbackUI2 *callback);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdateAction.cpp",
    "content": "// UpdateAction.cpp\n\n#include \"StdAfx.h\"\n\n#include \"UpdateAction.h\"\n\nnamespace NUpdateArchive {\n\nconst CActionSet kAddActionSet =\n{\n  NPairAction::kCopy,\n  NPairAction::kCopy,\n  NPairAction::kCompress,\n  NPairAction::kCompress,\n  NPairAction::kCompress,\n  NPairAction::kCompress,\n  NPairAction::kCompress\n};\n\nconst CActionSet kUpdateActionSet =\n{\n  NPairAction::kCopy,\n  NPairAction::kCopy,\n  NPairAction::kCompress,\n  NPairAction::kCopy,\n  NPairAction::kCompress,\n  NPairAction::kCopy,\n  NPairAction::kCompress\n};\n\nconst CActionSet kFreshActionSet =\n{\n  NPairAction::kCopy,\n  NPairAction::kCopy,\n  NPairAction::kIgnore,\n  NPairAction::kCopy,\n  NPairAction::kCompress,\n  NPairAction::kCopy,\n  NPairAction::kCompress\n};\n\nconst CActionSet kSynchronizeActionSet =\n{\n  NPairAction::kCopy,\n  NPairAction::kIgnore,\n  NPairAction::kCompress,\n  NPairAction::kCopy,\n  NPairAction::kCompress,\n  NPairAction::kCopy,\n  NPairAction::kCompress,\n};\n\nconst CActionSet kDeleteActionSet =\n{\n  NPairAction::kCopy,\n  NPairAction::kIgnore,\n  NPairAction::kIgnore,\n  NPairAction::kIgnore,\n  NPairAction::kIgnore,\n  NPairAction::kIgnore,\n  NPairAction::kIgnore\n};\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdateAction.h",
    "content": "// UpdateAction.h\n\n#ifndef __UPDATE_ACTION_H\n#define __UPDATE_ACTION_H\n\nnamespace NUpdateArchive {\n\n  namespace NPairState\n  {\n    const int kNumValues = 7;\n    enum EEnum\n    {\n      kNotMasked = 0,\n      kOnlyInArchive,\n      kOnlyOnDisk,\n      kNewInArchive,\n      kOldInArchive,\n      kSameFiles,\n      kUnknowNewerFiles\n    };\n  }\n  namespace NPairAction\n  {\n    enum EEnum\n    {\n      kIgnore = 0,\n      kCopy,\n      kCompress,\n      kCompressAsAnti\n    };\n  }\n  struct CActionSet\n  {\n    NPairAction::EEnum StateActions[NPairState::kNumValues];\n    bool NeedScanning() const\n    {\n      int i;\n      for (i = 0; i < NPairState::kNumValues; i++)\n        if (StateActions[i] == NPairAction::kCompress)\n          return true;\n      for (i = 1; i < NPairState::kNumValues; i++)\n        if (StateActions[i] != NPairAction::kIgnore)\n          return true;\n      return false;\n    }\n  };\n  extern const CActionSet kAddActionSet;\n  extern const CActionSet kUpdateActionSet;\n  extern const CActionSet kFreshActionSet;\n  extern const CActionSet kSynchronizeActionSet;\n  extern const CActionSet kDeleteActionSet;\n};\n\n\n#endif\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdateCallback.cpp",
    "content": "// UpdateCallback.cpp\n\n#include \"StdAfx.h\"\n\n#include \"UpdateCallback.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/Defs.h\"\n#include \"Common/ComTry.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/FileStreams.h\"\n\nusing namespace NWindows;\n\nCArchiveUpdateCallback::CArchiveUpdateCallback():\n  Callback(0),\n  ShareForWrite(false),\n  StdInMode(false),\n  DirItems(0),\n  ArcItems(0),\n  UpdatePairs(0),\n  NewNames(0)\n  {}\n\n\nSTDMETHODIMP CArchiveUpdateCallback::SetTotal(UInt64 size)\n{\n  COM_TRY_BEGIN\n  return Callback->SetTotal(size);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue)\n{\n  COM_TRY_BEGIN\n  return Callback->SetCompleted(completeValue);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  COM_TRY_BEGIN\n  return Callback->SetRatioInfo(inSize, outSize);\n  COM_TRY_END\n}\n\n\n/*\nSTATPROPSTG kProperties[] =\n{\n  { NULL, kpidPath, VT_BSTR},\n  { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidAttrib, VT_UI4},\n  { NULL, kpidIsAnti, VT_BOOL}\n};\n\nSTDMETHODIMP CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **)\n{\n  return CStatPropEnumerator::CreateEnumerator(kProperties, sizeof(kProperties) / sizeof(kProperties[0]), enumerator);\n}\n*/\n\nSTDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index,\n      Int32 *newData, Int32 *newProps, UInt32 *indexInArchive)\n{\n  COM_TRY_BEGIN\n  RINOK(Callback->CheckBreak());\n  const CUpdatePair2 &up = (*UpdatePairs)[index];\n  if (newData != NULL) *newData = BoolToInt(up.NewData);\n  if (newProps != NULL) *newProps = BoolToInt(up.NewProps);\n  if (indexInArchive != NULL)\n  {\n    *indexInArchive = (UInt32)-1;\n    if (up.ExistInArchive())\n      *indexInArchive = (ArcItems == 0) ? up.ArcIndex : (*ArcItems)[up.ArcIndex].IndexInServer;\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  const CUpdatePair2 &up = (*UpdatePairs)[index];\n  NWindows::NCOM::CPropVariant prop;\n  \n  if (propID == kpidIsAnti)\n  {\n    prop = up.IsAnti;\n    prop.Detach(value);\n    return S_OK;\n  }\n\n  if (up.IsAnti)\n  {\n    switch(propID)\n    {\n      case kpidIsDir:\n      case kpidPath:\n        break;\n      case kpidSize:\n        prop = (UInt64)0;\n        prop.Detach(value);\n        return S_OK;\n      default:\n        prop.Detach(value);\n        return S_OK;\n    }\n  }\n  \n  if (up.ExistOnDisk())\n  {\n    const CDirItem &di = DirItems->Items[up.DirIndex];\n    switch(propID)\n    {\n      case kpidPath:  prop = DirItems->GetLogPath(up.DirIndex); break;\n      case kpidIsDir:  prop = di.IsDir(); break;\n      case kpidSize:  prop = di.Size; break;\n      case kpidAttrib:  prop = di.Attrib; break;\n      case kpidCTime:  prop = di.CTime; break;\n      case kpidATime:  prop = di.ATime; break;\n      case kpidMTime:  prop = di.MTime; break;\n    }\n  }\n  else\n  {\n    if (propID == kpidPath)\n    {\n      if (up.NewNameIndex >= 0)\n      {\n        prop = (*NewNames)[up.NewNameIndex];\n        prop.Detach(value);\n        return S_OK;\n      }\n    }\n    if (up.ExistInArchive() && Archive)\n    {\n      UInt32 indexInArchive;\n      if (ArcItems == 0)\n        indexInArchive = up.ArcIndex;\n      else\n        indexInArchive = (*ArcItems)[up.ArcIndex].IndexInServer;\n      return Archive->GetProperty(indexInArchive, propID, value);\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream)\n{\n  COM_TRY_BEGIN\n  const CUpdatePair2 &up = (*UpdatePairs)[index];\n  if (!up.NewData)\n    return E_FAIL;\n  \n  RINOK(Callback->CheckBreak());\n  RINOK(Callback->Finilize());\n\n  if (up.IsAnti)\n  {\n    return Callback->GetStream((*ArcItems)[up.ArcIndex].Name, true);\n  }\n  const CDirItem &di = DirItems->Items[up.DirIndex];\n  RINOK(Callback->GetStream(DirItems->GetLogPath(up.DirIndex), false));\n \n  if (di.IsDir())\n    return S_OK;\n\n  if (StdInMode)\n  {\n    CStdInFileStream *inStreamSpec = new CStdInFileStream;\n    CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);\n    *inStream = inStreamLoc.Detach();\n  }\n  else\n  {\n    CInFileStream *inStreamSpec = new CInFileStream;\n    CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);\n    const UString path = DirItems->GetPhyPath(up.DirIndex);\n    if (!inStreamSpec->OpenShared(path, ShareForWrite))\n    {\n      return Callback->OpenFileError(path, ::GetLastError());\n    }\n    *inStream = inStreamLoc.Detach();\n  }\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::SetOperationResult(Int32 operationResult)\n{\n  COM_TRY_BEGIN\n  return Callback->SetOperationResult(operationResult);\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size)\n{\n  if (VolumesSizes.Size() == 0)\n    return S_FALSE;\n  if (index >= (UInt32)VolumesSizes.Size())\n    index = VolumesSizes.Size() - 1;\n  *size = VolumesSizes[index];\n  return S_OK;\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream)\n{\n  COM_TRY_BEGIN\n  wchar_t temp[32];\n  ConvertUInt64ToString(index + 1, temp);\n  UString res = temp;\n  while (res.Length() < 2)\n    res = UString(L'0') + res;\n  UString fileName = VolName;\n  fileName += L'.';\n  fileName += res;\n  fileName += VolExt;\n  COutFileStream *streamSpec = new COutFileStream;\n  CMyComPtr<ISequentialOutStream> streamLoc(streamSpec);\n  if (!streamSpec->Create(fileName, false))\n    return ::GetLastError();\n  *volumeStream = streamLoc.Detach();\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)\n{\n  COM_TRY_BEGIN\n  return Callback->CryptoGetTextPassword2(passwordIsDefined, password);\n  COM_TRY_END\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdateCallback.h",
    "content": "// UpdateCallback.h\n\n#ifndef __UPDATECALLBACK_H\n#define __UPDATECALLBACK_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/MyString.h\"\n\n#include \"../../IPassword.h\"\n#include \"../../ICoder.h\"\n\n#include \"../Common/UpdatePair.h\"\n#include \"../Common/UpdateProduce.h\"\n\n#define INTERFACE_IUpdateCallbackUI(x) \\\n  virtual HRESULT SetTotal(UInt64 size) x; \\\n  virtual HRESULT SetCompleted(const UInt64 *completeValue) x; \\\n  virtual HRESULT SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) x; \\\n  virtual HRESULT CheckBreak() x; \\\n  virtual HRESULT Finilize() x; \\\n  virtual HRESULT SetNumFiles(UInt64 numFiles) x; \\\n  virtual HRESULT GetStream(const wchar_t *name, bool isAnti) x; \\\n  virtual HRESULT OpenFileError(const wchar_t *name, DWORD systemError) x; \\\n  virtual HRESULT SetOperationResult(Int32 operationResult) x; \\\n  virtual HRESULT CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) x; \\\n  // virtual HRESULT ShowDeleteFile(const wchar_t *name) x; \\\n  // virtual HRESULT CloseProgress() { return S_OK; };\n\nstruct IUpdateCallbackUI\n{\n  INTERFACE_IUpdateCallbackUI(=0)\n};\n\nclass CArchiveUpdateCallback:\n  public IArchiveUpdateCallback2,\n  public ICryptoGetTextPassword2,\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP3(\n      IArchiveUpdateCallback2,\n      ICryptoGetTextPassword2,\n      ICompressProgressInfo)\n\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n\n  INTERFACE_IArchiveUpdateCallback2(;)\n\n  STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password);\n\npublic:\n  CRecordVector<UInt64> VolumesSizes;\n  UString VolName;\n  UString VolExt;\n\n  IUpdateCallbackUI *Callback;\n\n  bool ShareForWrite;\n  bool StdInMode;\n  const CDirItems *DirItems;\n  const CObjectVector<CArcItem> *ArcItems;\n  const CRecordVector<CUpdatePair2> *UpdatePairs;\n  const UStringVector *NewNames;\n  CMyComPtr<IInArchive> Archive;\n\n  CArchiveUpdateCallback();\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdatePair.cpp",
    "content": "// UpdatePair.cpp\n\n#include \"StdAfx.h\"\n\n#include <time.h>\n\n#include \"Common/Defs.h\"\n#include \"Common/Wildcard.h\"\n#include \"Windows/Time.h\"\n\n#include \"UpdatePair.h\"\n#include \"SortUtils.h\"\n\nusing namespace NWindows;\nusing namespace NTime;\n\nstatic int MyCompareTime(NFileTimeType::EEnum fileTimeType, const FILETIME &time1, const FILETIME &time2)\n{\n  switch(fileTimeType)\n  {\n    case NFileTimeType::kWindows:\n      return ::CompareFileTime(&time1, &time2);\n    case NFileTimeType::kUnix:\n      {\n        UInt32 unixTime1, unixTime2;\n        FileTimeToUnixTime(time1, unixTime1);\n        FileTimeToUnixTime(time2, unixTime2);\n        return MyCompare(unixTime1, unixTime2);\n      }\n    case NFileTimeType::kDOS:\n      {\n        UInt32 dosTime1, dosTime2;\n        FileTimeToDosTime(time1, dosTime1);\n        FileTimeToDosTime(time2, dosTime2);\n        return MyCompare(dosTime1, dosTime2);\n      }\n  }\n  throw 4191618;\n}\n\nstatic const wchar_t *kDuplicateFileNameMessage = L\"Duplicate filename:\";\nstatic const wchar_t *kNotCensoredCollisionMessaged = L\"Internal file name collision (file on disk, file in archive):\";\n\nstatic void ThrowError(const UString &message, const UString &s1, const UString &s2)\n{\n  UString m = message;\n  m += L'\\n';\n  m += s1;\n  m += L'\\n';\n  m += s2;\n  throw m;\n}\n\nstatic void TestDuplicateString(const UStringVector &strings, const CIntVector &indices)\n{\n  for(int i = 0; i + 1 < indices.Size(); i++)\n    if (CompareFileNames(strings[indices[i]], strings[indices[i + 1]]) == 0)\n      ThrowError(kDuplicateFileNameMessage, strings[indices[i]], strings[indices[i + 1]]);\n}\n\nvoid GetUpdatePairInfoList(\n    const CDirItems &dirItems,\n    const CObjectVector<CArcItem> &arcItems,\n    NFileTimeType::EEnum fileTimeType,\n    CRecordVector<CUpdatePair> &updatePairs)\n{\n  CIntVector dirIndices, arcIndices;\n  \n  int numDirItems = dirItems.Items.Size();\n  int numArcItems = arcItems.Size();\n  \n  \n  {\n    UStringVector arcNames;\n    arcNames.Reserve(numArcItems);\n    for (int i = 0; i < numArcItems; i++)\n      arcNames.Add(arcItems[i].Name);\n    SortFileNames(arcNames, arcIndices);\n    TestDuplicateString(arcNames, arcIndices);\n  }\n\n  UStringVector dirNames;\n  {\n    dirNames.Reserve(numDirItems);\n    for (int i = 0; i < numDirItems; i++)\n      dirNames.Add(dirItems.GetLogPath(i));\n    SortFileNames(dirNames, dirIndices);\n    TestDuplicateString(dirNames, dirIndices);\n  }\n  \n  int dirIndex = 0, arcIndex = 0;\n  while (dirIndex < numDirItems && arcIndex < numArcItems)\n  {\n    CUpdatePair pair;\n    int dirIndex2 = dirIndices[dirIndex];\n    int arcIndex2 = arcIndices[arcIndex];\n    const CDirItem &di = dirItems.Items[dirIndex2];\n    const CArcItem &ai = arcItems[arcIndex2];\n    int compareResult = CompareFileNames(dirNames[dirIndex2], ai.Name);\n    if (compareResult < 0)\n    {\n      pair.State = NUpdateArchive::NPairState::kOnlyOnDisk;\n      pair.DirIndex = dirIndex2;\n      dirIndex++;\n    }\n    else if (compareResult > 0)\n    {\n      pair.State = ai.Censored ?\n          NUpdateArchive::NPairState::kOnlyInArchive:\n          NUpdateArchive::NPairState::kNotMasked;\n      pair.ArcIndex = arcIndex2;\n      arcIndex++;\n    }\n    else\n    {\n      if (!ai.Censored)\n        ThrowError(kNotCensoredCollisionMessaged, dirNames[dirIndex2], ai.Name);\n      pair.DirIndex = dirIndex2;\n      pair.ArcIndex = arcIndex2;\n      switch (MyCompareTime(\n          ai.TimeType != - 1 ? (NFileTimeType::EEnum)ai.TimeType : fileTimeType,\n          di.MTime, ai.MTime))\n      {\n        case -1: pair.State = NUpdateArchive::NPairState::kNewInArchive; break;\n        case 1:  pair.State = NUpdateArchive::NPairState::kOldInArchive; break;\n        default:\n          if (ai.SizeDefined)\n            if (di.Size != ai.Size)\n              pair.State = NUpdateArchive::NPairState::kUnknowNewerFiles;\n            else\n              pair.State = NUpdateArchive::NPairState::kSameFiles;\n          else\n              pair.State = NUpdateArchive::NPairState::kUnknowNewerFiles;\n      }\n      dirIndex++;\n      arcIndex++;\n    }\n    updatePairs.Add(pair);\n  }\n\n  for (; dirIndex < numDirItems; dirIndex++)\n  {\n    CUpdatePair pair;\n    pair.State = NUpdateArchive::NPairState::kOnlyOnDisk;\n    pair.DirIndex = dirIndices[dirIndex];\n    updatePairs.Add(pair);\n  }\n  \n  for (; arcIndex < numArcItems; arcIndex++)\n  {\n    CUpdatePair pair;\n    int arcIndex2 = arcIndices[arcIndex];\n    pair.State = arcItems[arcIndex2].Censored ?\n        NUpdateArchive::NPairState::kOnlyInArchive:\n        NUpdateArchive::NPairState::kNotMasked;\n    pair.ArcIndex = arcIndex2;\n    updatePairs.Add(pair);\n  }\n\n  updatePairs.ReserveDown();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdatePair.h",
    "content": "// UpdatePair.h\n\n#ifndef __UPDATE_PAIR_H\n#define __UPDATE_PAIR_H\n\n#include \"DirItem.h\"\n#include \"UpdateAction.h\"\n\n#include \"../../Archive/IArchive.h\"\n\nstruct CUpdatePair\n{\n  NUpdateArchive::NPairState::EEnum State;\n  int ArcIndex;\n  int DirIndex;\n  CUpdatePair(): ArcIndex(-1), DirIndex(-1) {}\n};\n\nvoid GetUpdatePairInfoList(\n    const CDirItems &dirItems,\n    const CObjectVector<CArcItem> &arcItems,\n    NFileTimeType::EEnum fileTimeType,\n    CRecordVector<CUpdatePair> &updatePairs);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdateProduce.cpp",
    "content": "// UpdateProduce.cpp\n\n#include \"StdAfx.h\"\n\n#include \"UpdateProduce.h\"\n\nusing namespace NUpdateArchive;\n\nstatic const char *kUpdateActionSetCollision = \"Internal collision in update action set\";\n\nvoid UpdateProduce(\n    const CRecordVector<CUpdatePair> &updatePairs,\n    const CActionSet &actionSet,\n    CRecordVector<CUpdatePair2> &operationChain,\n    IUpdateProduceCallback *callback)\n{\n  for (int i = 0; i < updatePairs.Size(); i++)\n  {\n    const CUpdatePair &pair = updatePairs[i];\n\n    CUpdatePair2 up2;\n    up2.IsAnti = false;\n    up2.DirIndex = pair.DirIndex;\n    up2.ArcIndex = pair.ArcIndex;\n    up2.NewData = up2.NewProps = true;\n    \n    switch(actionSet.StateActions[pair.State])\n    {\n      case NPairAction::kIgnore:\n        /*\n        if (pair.State != NPairState::kOnlyOnDisk)\n          IgnoreArchiveItem(m_ArchiveItems[pair.ArcIndex]);\n        // cout << \"deleting\";\n        */\n        if (callback)\n          callback->ShowDeleteFile(pair.ArcIndex);\n        continue;\n\n      case NPairAction::kCopy:\n        if (pair.State == NPairState::kOnlyOnDisk)\n          throw kUpdateActionSetCollision;\n        up2.NewData = up2.NewProps = false;\n        break;\n      \n      case NPairAction::kCompress:\n        if (pair.State == NPairState::kOnlyInArchive ||\n            pair.State == NPairState::kNotMasked)\n          throw kUpdateActionSetCollision;\n        break;\n      \n      case NPairAction::kCompressAsAnti:\n        up2.IsAnti = true;\n        break;\n    }\n    operationChain.Add(up2);\n  }\n  operationChain.ReserveDown();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/UpdateProduce.h",
    "content": "// UpdateProduce.h\n\n#ifndef __UPDATE_PRODUCE_H\n#define __UPDATE_PRODUCE_H\n\n#include \"UpdatePair.h\"\n\nstruct CUpdatePair2\n{\n  bool NewData;\n  bool NewProps;\n  bool IsAnti;\n  \n  int DirIndex;\n  int ArcIndex;\n  int NewNameIndex;\n\n  bool ExistOnDisk() const { return DirIndex != -1; }\n  bool ExistInArchive() const { return ArcIndex != -1; }\n\n  CUpdatePair2(): IsAnti(false), DirIndex(-1), ArcIndex(-1), NewNameIndex(-1) {}\n};\n\nstruct IUpdateProduceCallback\n{\n  virtual HRESULT ShowDeleteFile(int arcIndex) = 0;\n};\n\nvoid UpdateProduce(\n    const CRecordVector<CUpdatePair> &updatePairs,\n    const NUpdateArchive::CActionSet &actionSet,\n    CRecordVector<CUpdatePair2> &operationChain,\n    IUpdateProduceCallback *callback);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/WorkDir.cpp",
    "content": "// WorkDir.cpp\n\n#include \"StdAfx.h\"\n\n#include \"WorkDir.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/Wildcard.h\"\n\n#include \"Windows/FileName.h\"\n#include \"Windows/FileDir.h\"\n\n#if _WIN32\nstatic inline UINT GetCurrentCodePage() \n  { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } \n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NName;\n\nUString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path)\n{\n  NWorkDir::NMode::EEnum mode = workDirInfo.Mode;\n  if (workDirInfo.ForRemovableOnly)\n  {\n    mode = NWorkDir::NMode::kCurrent;\n    UString prefix = path.Left(3);\n    if (prefix[1] == L':' && prefix[2] == WCHAR_PATH_SEPARATOR)\n    {\n      UINT driveType = GetDriveType(GetSystemString(prefix, GetCurrentCodePage()));\n      if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE)\n        mode = workDirInfo.Mode;\n    }\n    /*\n    CParsedPath parsedPath;\n    parsedPath.ParsePath(archiveName);\n    UINT driveType = GetDriveType(parsedPath.Prefix);\n    if ((driveType != DRIVE_CDROM) && (driveType != DRIVE_REMOVABLE))\n      mode = NZipSettings::NWorkDir::NMode::kCurrent;\n    */\n  }\n  switch(mode)\n  {\n    case NWorkDir::NMode::kCurrent:\n    {\n      return ExtractDirPrefixFromPath(path);\n    }\n    case NWorkDir::NMode::kSpecified:\n    {\n      UString tempDir = workDirInfo.Path;\n      NormalizeDirPathPrefix(tempDir);\n      return tempDir;\n    }\n    default:\n    {\n      UString tempDir;\n      if(!NFile::NDirectory::MyGetTempPath(tempDir))\n        throw 141717;\n      return tempDir;\n    }\n  }\n}\n#else\nUString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path)\n{\n\treturn L\".\"; // FIXME\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/WorkDir.h",
    "content": "// WorkDir.h\n\n#ifndef __WORKDIR_H\n#define __WORKDIR_H\n\n#include \"ZipRegistry.h\"\n\nUString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ZipRegistry.cpp",
    "content": "// ZipRegistry.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ZipRegistry.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/Synchronization.h\"\n#include \"Windows/Registry.h\"\n\n#include \"Windows/FileDir.h\"\n\nusing namespace NWindows;\nusing namespace NRegistry;\n\nstatic const TCHAR *kCUBasePath = TEXT(\"Software\") TEXT(STRING_PATH_SEPARATOR) TEXT(\"7-ZIP\");\n\nstatic NSynchronization::CCriticalSection g_RegistryOperationsCriticalSection;\n\n//////////////////////\n// ExtractionInfo\n\nstatic const TCHAR *kExtractionKeyName = TEXT(\"Extraction\");\n\nstatic const TCHAR *kExtractionPathHistoryKeyName = TEXT(\"PathHistory\");\nstatic const TCHAR *kExtractionExtractModeValueName = TEXT(\"ExtarctMode\");\nstatic const TCHAR *kExtractionOverwriteModeValueName = TEXT(\"OverwriteMode\");\nstatic const TCHAR *kExtractionShowPasswordValueName = TEXT(\"ShowPassword\");\n\nstatic CSysString GetKeyPath(const CSysString &path)\n{\n  return CSysString(kCUBasePath) + CSysString(CHAR_PATH_SEPARATOR) + path;\n}\n\nvoid SaveExtractionInfo(const NExtract::CInfo &info)\n{\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey extractionKey;\n  extractionKey.Create(HKEY_CURRENT_USER, GetKeyPath(kExtractionKeyName));\n  extractionKey.RecurseDeleteKey(kExtractionPathHistoryKeyName);\n  {\n    CKey pathHistoryKey;\n    pathHistoryKey.Create(extractionKey, kExtractionPathHistoryKeyName);\n    for(int i = 0; i < info.Paths.Size(); i++)\n    {\n      wchar_t numberString[16];\n      ConvertUInt64ToString(i, numberString);\n      pathHistoryKey.SetValue(numberString, info.Paths[i]);\n    }\n  }\n  extractionKey.SetValue(kExtractionExtractModeValueName, UInt32(info.PathMode));\n  extractionKey.SetValue(kExtractionOverwriteModeValueName, UInt32(info.OverwriteMode));\n  extractionKey.SetValue(kExtractionShowPasswordValueName, info.ShowPassword);\n}\n\nvoid ReadExtractionInfo(NExtract::CInfo &info)\n{\n  info.Paths.Clear();\n  info.PathMode = NExtract::NPathMode::kCurrentPathnames;\n  info.OverwriteMode = NExtract::NOverwriteMode::kAskBefore;\n  info.ShowPassword = false;\n\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey extractionKey;\n  if(extractionKey.Open(HKEY_CURRENT_USER, GetKeyPath(kExtractionKeyName), KEY_READ) != ERROR_SUCCESS)\n    return;\n  \n  {\n    CKey pathHistoryKey;\n    if(pathHistoryKey.Open(extractionKey, kExtractionPathHistoryKeyName, KEY_READ) ==\n        ERROR_SUCCESS)\n    {\n      for (;;)\n      {\n        wchar_t numberString[16];\n        ConvertUInt64ToString(info.Paths.Size(), numberString);\n        UString path;\n        if (pathHistoryKey.QueryValue(numberString, path) != ERROR_SUCCESS)\n          break;\n        info.Paths.Add(path);\n      }\n    }\n  }\n  UInt32 extractModeIndex;\n  if (extractionKey.QueryValue(kExtractionExtractModeValueName, extractModeIndex) == ERROR_SUCCESS)\n  {\n    switch (extractModeIndex)\n    {\n      case NExtract::NPathMode::kFullPathnames:\n      case NExtract::NPathMode::kCurrentPathnames:\n      case NExtract::NPathMode::kNoPathnames:\n        info.PathMode = NExtract::NPathMode::EEnum(extractModeIndex);\n        break;\n    }\n  }\n  UInt32 overwriteModeIndex;\n  if (extractionKey.QueryValue(kExtractionOverwriteModeValueName, overwriteModeIndex) == ERROR_SUCCESS)\n  {\n    switch (overwriteModeIndex)\n    {\n      case NExtract::NOverwriteMode::kAskBefore:\n      case NExtract::NOverwriteMode::kWithoutPrompt:\n      case NExtract::NOverwriteMode::kSkipExisting:\n      case NExtract::NOverwriteMode::kAutoRename:\n      case NExtract::NOverwriteMode::kAutoRenameExisting:\n        info.OverwriteMode = NExtract::NOverwriteMode::EEnum(overwriteModeIndex);\n        break;\n    }\n  }\n  if (extractionKey.QueryValue(kExtractionShowPasswordValueName,\n      info.ShowPassword) != ERROR_SUCCESS)\n    info.ShowPassword = false;\n}\n\n///////////////////////////////////\n// CompressionInfo\n\nstatic const TCHAR *kCompressionKeyName = TEXT(\"Compression\");\n\nstatic const TCHAR *kCompressionHistoryArchivesKeyName = TEXT(\"ArcHistory\");\nstatic const TCHAR *kCompressionLevelValueName = TEXT(\"Level\");\nstatic const TCHAR *kCompressionLastFormatValueName = TEXT(\"Archiver\");\nstatic const TCHAR *kCompressionShowPasswordValueName = TEXT(\"ShowPassword\");\nstatic const TCHAR *kCompressionEncryptHeadersValueName = TEXT(\"EncryptHeaders\");\n\nstatic const TCHAR *kCompressionOptionsKeyName = TEXT(\"Options\");\n// static const TCHAR *kSolid = TEXT(\"Solid\");\n// static const TCHAR *kMultiThread = TEXT(\"Multithread\");\n\nstatic const WCHAR *kCompressionOptions = L\"Options\";\nstatic const TCHAR *kCompressionLevel = TEXT(\"Level\");\nstatic const WCHAR *kCompressionMethod = L\"Method\";\nstatic const WCHAR *kEncryptionMethod = L\"EncryptionMethod\";\nstatic const TCHAR *kCompressionDictionary = TEXT(\"Dictionary\");\nstatic const TCHAR *kCompressionOrder = TEXT(\"Order\");\nstatic const TCHAR *kCompressionNumThreads = TEXT(\"NumThreads\");\nstatic const TCHAR *kCompressionBlockSize = TEXT(\"BlockSize\");\n\n\nstatic void SetRegString(CKey &key, const WCHAR *name, const UString &value)\n{\n  if (value.IsEmpty())\n    key.DeleteValue(name);\n  else\n    key.SetValue(name, value);\n}\n\nstatic void SetRegUInt32(CKey &key, const TCHAR *name, UInt32 value)\n{\n  if (value == (UInt32)-1)\n    key.DeleteValue(name);\n  else\n    key.SetValue(name, value);\n}\n\nstatic void GetRegString(CKey &key, const WCHAR *name, UString &value)\n{\n  if (key.QueryValue(name, value) != ERROR_SUCCESS)\n    value.Empty();\n}\n\nstatic void GetRegUInt32(CKey &key, const TCHAR *name, UInt32 &value)\n{\n  if (key.QueryValue(name, value) != ERROR_SUCCESS)\n    value = UInt32(-1);\n}\n\nvoid SaveCompressionInfo(const NCompression::CInfo &info)\n{\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n\n  CKey compressionKey;\n  compressionKey.Create(HKEY_CURRENT_USER, GetKeyPath(kCompressionKeyName));\n  compressionKey.RecurseDeleteKey(kCompressionHistoryArchivesKeyName);\n  {\n    CKey historyArchivesKey;\n    historyArchivesKey.Create(compressionKey, kCompressionHistoryArchivesKeyName);\n    for(int i = 0; i < info.HistoryArchives.Size(); i++)\n    {\n      wchar_t numberString[16];\n      ConvertUInt64ToString(i, numberString);\n      historyArchivesKey.SetValue(numberString, info.HistoryArchives[i]);\n    }\n  }\n\n  // compressionKey.SetValue(kSolid, info.Solid);\n  // compressionKey.SetValue(kMultiThread, info.MultiThread);\n  compressionKey.RecurseDeleteKey(kCompressionOptionsKeyName);\n  {\n    CKey optionsKey;\n    optionsKey.Create(compressionKey, kCompressionOptionsKeyName);\n    for(int i = 0; i < info.FormatOptionsVector.Size(); i++)\n    {\n      const NCompression::CFormatOptions &fo = info.FormatOptionsVector[i];\n      CKey formatKey;\n      formatKey.Create(optionsKey, fo.FormatID);\n      \n      SetRegString(formatKey, kCompressionOptions, fo.Options);\n      SetRegString(formatKey, kCompressionMethod, fo.Method);\n      SetRegString(formatKey, kEncryptionMethod, fo.EncryptionMethod);\n\n      SetRegUInt32(formatKey, kCompressionLevel, fo.Level);\n      SetRegUInt32(formatKey, kCompressionDictionary, fo.Dictionary);\n      SetRegUInt32(formatKey, kCompressionOrder, fo.Order);\n      SetRegUInt32(formatKey, kCompressionBlockSize, fo.BlockLogSize);\n      SetRegUInt32(formatKey, kCompressionNumThreads, fo.NumThreads);\n    }\n  }\n\n  compressionKey.SetValue(kCompressionLevelValueName, UInt32(info.Level));\n  compressionKey.SetValue(kCompressionLastFormatValueName, GetSystemString(info.ArchiveType));\n\n  compressionKey.SetValue(kCompressionShowPasswordValueName, info.ShowPassword);\n  compressionKey.SetValue(kCompressionEncryptHeadersValueName, info.EncryptHeaders);\n  // compressionKey.SetValue(kCompressionMaximizeValueName, info.Maximize);\n}\n\nvoid ReadCompressionInfo(NCompression::CInfo &info)\n{\n  info.HistoryArchives.Clear();\n\n  // info.Solid = true;\n  // info.MultiThread = IsMultiProcessor();\n  info.FormatOptionsVector.Clear();\n\n  info.Level = 5;\n  info.ArchiveType = L\"7z\";\n  // definedStatus.Maximize = false;\n  info.ShowPassword = false;\n  info.EncryptHeaders = false;\n\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey compressionKey;\n\n  if(compressionKey.Open(HKEY_CURRENT_USER,\n      GetKeyPath(kCompressionKeyName), KEY_READ) != ERROR_SUCCESS)\n    return;\n  \n  {\n    CKey historyArchivesKey;\n    if(historyArchivesKey.Open(compressionKey, kCompressionHistoryArchivesKeyName, KEY_READ) ==\n        ERROR_SUCCESS)\n    {\n      for (;;)\n      {\n        wchar_t numberString[16];\n        ConvertUInt64ToString(info.HistoryArchives.Size(), numberString);\n        UString path;\n        if (historyArchivesKey.QueryValue(numberString, path) != ERROR_SUCCESS)\n          break;\n        info.HistoryArchives.Add(path);\n      }\n    }\n  }\n\n  \n  /*\n  bool solid = false;\n  if (compressionKey.QueryValue(kSolid, solid) == ERROR_SUCCESS)\n    info.Solid = solid;\n  bool multiThread = false;\n  if (compressionKey.QueryValue(kMultiThread, multiThread) == ERROR_SUCCESS)\n    info.MultiThread = multiThread;\n  */\n\n  {\n    CKey optionsKey;\n    if(optionsKey.Open(compressionKey, kCompressionOptionsKeyName, KEY_READ) ==\n        ERROR_SUCCESS)\n    {\n      CSysStringVector formatIDs;\n      optionsKey.EnumKeys(formatIDs);\n      for(int i = 0; i < formatIDs.Size(); i++)\n      {\n        CKey formatKey;\n        NCompression::CFormatOptions fo;\n        fo.FormatID = formatIDs[i];\n        if(formatKey.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS)\n        {\n          GetRegString(formatKey, kCompressionOptions, fo.Options);\n          GetRegString(formatKey, kCompressionMethod, fo.Method);\n          GetRegString(formatKey, kEncryptionMethod, fo.EncryptionMethod);\n\n          GetRegUInt32(formatKey, kCompressionLevel, fo.Level);\n          GetRegUInt32(formatKey, kCompressionDictionary, fo.Dictionary);\n          GetRegUInt32(formatKey, kCompressionOrder, fo.Order);\n          GetRegUInt32(formatKey, kCompressionBlockSize, fo.BlockLogSize);\n          GetRegUInt32(formatKey, kCompressionNumThreads, fo.NumThreads);\n\n          info.FormatOptionsVector.Add(fo);\n        }\n\n      }\n    }\n  }\n\n  UInt32 level;\n  if (compressionKey.QueryValue(kCompressionLevelValueName, level) == ERROR_SUCCESS)\n    info.Level = level;\n  CSysString archiveType;\n  if (compressionKey.QueryValue(kCompressionLastFormatValueName, archiveType) == ERROR_SUCCESS)\n    info.ArchiveType = GetUnicodeString(archiveType);\n  if (compressionKey.QueryValue(kCompressionShowPasswordValueName,\n      info.ShowPassword) != ERROR_SUCCESS)\n    info.ShowPassword = false;\n  if (compressionKey.QueryValue(kCompressionEncryptHeadersValueName,\n      info.EncryptHeaders) != ERROR_SUCCESS)\n    info.EncryptHeaders = false;\n  /*\n  if (compressionKey.QueryValue(kCompressionLevelValueName, info.Maximize) == ERROR_SUCCESS)\n    definedStatus.Maximize = true;\n  */\n}\n\n\n///////////////////////////////////\n// WorkDirInfo\n\nstatic const TCHAR *kOptionsInfoKeyName = TEXT(\"Options\");\n\nstatic const TCHAR *kWorkDirTypeValueName = TEXT(\"WorkDirType\");\nstatic const WCHAR *kWorkDirPathValueName = L\"WorkDirPath\";\nstatic const TCHAR *kTempRemovableOnlyValueName = TEXT(\"TempRemovableOnly\");\nstatic const TCHAR *kCascadedMenuValueName = TEXT(\"CascadedMenu\");\nstatic const TCHAR *kContextMenuValueName = TEXT(\"ContextMenu\");\n\nvoid SaveWorkDirInfo(const NWorkDir::CInfo &info)\n{\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey optionsKey;\n  optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName));\n  optionsKey.SetValue(kWorkDirTypeValueName, UInt32(info.Mode));\n  optionsKey.SetValue(kWorkDirPathValueName, info.Path);\n  optionsKey.SetValue(kTempRemovableOnlyValueName, info.ForRemovableOnly);\n}\n\nvoid ReadWorkDirInfo(NWorkDir::CInfo &info)\n{\n  info.SetDefault();\n\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey optionsKey;\n  if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS)\n    return;\n\n  UInt32 dirType;\n  if (optionsKey.QueryValue(kWorkDirTypeValueName, dirType) != ERROR_SUCCESS)\n    return;\n  switch (dirType)\n  {\n    case NWorkDir::NMode::kSystem:\n    case NWorkDir::NMode::kCurrent:\n    case NWorkDir::NMode::kSpecified:\n      info.Mode = NWorkDir::NMode::EEnum(dirType);\n  }\n  UString sysWorkDir;\n  if (optionsKey.QueryValue(kWorkDirPathValueName, sysWorkDir) != ERROR_SUCCESS)\n  {\n    info.Path.Empty();\n    if (info.Mode == NWorkDir::NMode::kSpecified)\n      info.Mode = NWorkDir::NMode::kSystem;\n  }\n  info.Path = GetUnicodeString(sysWorkDir);\n  if (optionsKey.QueryValue(kTempRemovableOnlyValueName, info.ForRemovableOnly) != ERROR_SUCCESS)\n    info.SetForRemovableOnlyDefault();\n}\n\nstatic void SaveOption(const TCHAR *value, bool enabled)\n{\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey optionsKey;\n  optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName));\n  optionsKey.SetValue(value, enabled);\n}\n\nstatic bool ReadOption(const TCHAR *value, bool defaultValue)\n{\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey optionsKey;\n  if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS)\n    return defaultValue;\n  bool enabled;\n  if (optionsKey.QueryValue(value, enabled) != ERROR_SUCCESS)\n    return defaultValue;\n  return enabled;\n}\n\nvoid SaveCascadedMenu(bool show)\n  { SaveOption(kCascadedMenuValueName, show); }\nbool ReadCascadedMenu()\n  { return ReadOption(kCascadedMenuValueName, true); }\n\n\nstatic void SaveValue(const TCHAR *value, UInt32 valueToWrite)\n{\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey optionsKey;\n  optionsKey.Create(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName));\n  optionsKey.SetValue(value, valueToWrite);\n}\n\nstatic bool ReadValue(const TCHAR *value, UInt32 &result)\n{\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  CKey optionsKey;\n  if(optionsKey.Open(HKEY_CURRENT_USER, GetKeyPath(kOptionsInfoKeyName), KEY_READ) != ERROR_SUCCESS)\n    return false;\n  return (optionsKey.QueryValue(value, result) == ERROR_SUCCESS);\n}\n\nvoid SaveContextMenuStatus(UInt32 value)\n  { SaveValue(kContextMenuValueName, value); }\n\nbool ReadContextMenuStatus(UInt32 &value)\n  { return  ReadValue(kContextMenuValueName, value); }\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Common/ZipRegistry.h",
    "content": "// ZipRegistry.h\n\n#ifndef __ZIPREGISTRY_H\n#define __ZIPREGISTRY_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Types.h\"\n#include \"ExtractMode.h\"\n\nnamespace NExtract\n{\n  struct CInfo\n  {\n    NPathMode::EEnum PathMode;\n    NOverwriteMode::EEnum OverwriteMode;\n    UStringVector Paths;\n    bool ShowPassword;\n  };\n}\n\nnamespace NCompression {\n  \n  struct CFormatOptions\n  {\n    CSysString FormatID;\n    UString Options;\n    UString Method;\n    UString EncryptionMethod;\n    UInt32 Level;\n    UInt32 Dictionary;\n    UInt32 Order;\n    UInt32 BlockLogSize;\n    UInt32 NumThreads;\n    void ResetForLevelChange()\n    {\n      BlockLogSize = NumThreads = Level = Dictionary = Order = UInt32(-1);\n      Method.Empty();\n      // EncryptionMethod.Empty();\n      // Options.Empty();\n    }\n    CFormatOptions() { ResetForLevelChange(); }\n  };\n\n  struct CInfo\n  {\n    UStringVector HistoryArchives;\n    UInt32 Level;\n    UString ArchiveType;\n\n    CObjectVector<CFormatOptions> FormatOptionsVector;\n\n    bool ShowPassword;\n    bool EncryptHeaders;\n  };\n}\n\nnamespace NWorkDir{\n  \n  namespace NMode\n  {\n    enum EEnum\n    {\n      kSystem,\n      kCurrent,\n      kSpecified\n    };\n  }\n  struct CInfo\n  {\n    NMode::EEnum Mode;\n    UString Path;\n    bool ForRemovableOnly;\n    void SetForRemovableOnlyDefault() { ForRemovableOnly = true; }\n    void SetDefault()\n    {\n      Mode = NMode::kSystem;\n      Path.Empty();\n      SetForRemovableOnlyDefault();\n    }\n  };\n}\n\nvoid SaveExtractionInfo(const NExtract::CInfo &info);\nvoid ReadExtractionInfo(NExtract::CInfo &info);\n\nvoid SaveCompressionInfo(const NCompression::CInfo &info);\nvoid ReadCompressionInfo(NCompression::CInfo &info);\n\nvoid SaveWorkDirInfo(const NWorkDir::CInfo &info);\nvoid ReadWorkDirInfo(NWorkDir::CInfo &info);\n\nvoid SaveCascadedMenu(bool enabled);\nbool ReadCascadedMenu();\n\nvoid SaveContextMenuStatus(UInt32 value);\nbool ReadContextMenuStatus(UInt32 &value);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/ConsoleClose.cpp",
    "content": "// ConsoleClose.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ConsoleClose.h\"\n\n#include <signal.h>\n\nstatic int g_BreakCounter = 0;\nstatic const int kBreakAbortThreshold = 2;\n\nnamespace NConsoleClose {\n\nstatic void HandlerRoutine(int)\n{\n  g_BreakCounter++;\n  if (g_BreakCounter < kBreakAbortThreshold)\n    return ;\n  exit(EXIT_FAILURE);\n}\n\nbool TestBreakSignal()\n{\n  return (g_BreakCounter > 0);\n}\n\nvoid CheckCtrlBreak()\n{\n  if (TestBreakSignal())\n    throw CCtrlBreakException();\n}\n\nCCtrlHandlerSetter::CCtrlHandlerSetter()\n{\n   memo_sig_int = signal(SIGINT,HandlerRoutine); // CTRL-C\n   if (memo_sig_int == SIG_ERR)\n    throw \"SetConsoleCtrlHandler fails (SIGINT)\";\n   memo_sig_term = signal(SIGTERM,HandlerRoutine); // for kill -15 (before \"kill -9\")\n   if (memo_sig_term == SIG_ERR)\n    throw \"SetConsoleCtrlHandler fails (SIGTERM)\";\n}\n\nCCtrlHandlerSetter::~CCtrlHandlerSetter()\n{\n   signal(SIGINT,memo_sig_int); // CTRL-C\n   signal(SIGTERM,memo_sig_term); // kill {pid}\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/ConsoleClose.h",
    "content": "// ConsoleCloseUtils.h\n\n#ifndef __CONSOLECLOSEUTILS_H\n#define __CONSOLECLOSEUTILS_H\n\nnamespace NConsoleClose {\n\nbool TestBreakSignal();\n\nclass CCtrlHandlerSetter\n{\n  void (*memo_sig_int)(int);\n  void (*memo_sig_term)(int);\npublic:\n  CCtrlHandlerSetter();\n  virtual ~CCtrlHandlerSetter();\n};\n\nclass CCtrlBreakException \n{};\n\nvoid CheckCtrlBreak();\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp",
    "content": "// ExtractCallbackConsole.h\n\n#include \"StdAfx.h\"\n\n#include \"ExtractCallbackConsole.h\"\n#include \"UserInputUtils.h\"\n#include \"ConsoleClose.h\"\n\n#include \"Common/Wildcard.h\"\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/Time.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Error.h\"\n#include \"Windows/PropVariantConversions.h\"\n\n#include \"../../Common/FilePathAutoRename.h\"\n\n#include \"../Common/ExtractingFilePath.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NDirectory;\n\nstatic const char *kTestString    =  \"Testing     \";\nstatic const char *kExtractString =  \"Extracting  \";\nstatic const char *kSkipString   =  \"Skipping    \";\n\n// static const char *kCantAutoRename = \"can not create file with auto name\\n\";\n// static const char *kCantRenameFile = \"can not rename existing file\\n\";\n// static const char *kCantDeleteOutputFile = \"can not delete output file \";\nstatic const char *kError = \"ERROR: \";\nstatic const char *kMemoryExceptionMessage = \"Can't allocate required memory!\";\n\nstatic const char *kProcessing = \"Processing archive: \";\nstatic const char *kEverythingIsOk = \"Everything is Ok\";\nstatic const char *kNoFiles = \"No files to process\";\n\nstatic const char *kUnsupportedMethod = \"Unsupported Method\";\nstatic const char *kCrcFailed = \"CRC Failed\";\nstatic const char *kCrcFailedEncrypted = \"CRC Failed in encrypted file. Wrong password?\";\nstatic const char *kDataError = \"Data Error\";\nstatic const char *kDataErrorEncrypted = \"Data Error in encrypted file. Wrong password?\";\nstatic const char *kUnknownError = \"Unknown Error\";\n\nSTDMETHODIMP CExtractCallbackConsole::SetTotal(UInt64)\n{\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackConsole::SetCompleted(const UInt64 *)\n{\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackConsole::AskOverwrite(\n    const wchar_t *existName, const FILETIME *, const UInt64 *,\n    const wchar_t *newName, const FILETIME *, const UInt64 *,\n    Int32 *answer)\n{\n  (*OutStream) << \"file \" << existName <<\n    \"\\nalready exists. Overwrite with \" << endl;\n  (*OutStream) << newName;\n  \n  NUserAnswerMode::EEnum overwriteAnswer = ScanUserYesNoAllQuit(OutStream);\n  \n  switch(overwriteAnswer)\n  {\n    case NUserAnswerMode::kQuit:  return E_ABORT;\n    case NUserAnswerMode::kNo:     *answer = NOverwriteAnswer::kNo; break;\n    case NUserAnswerMode::kNoAll:  *answer = NOverwriteAnswer::kNoToAll; break;\n    case NUserAnswerMode::kYesAll: *answer = NOverwriteAnswer::kYesToAll; break;\n    case NUserAnswerMode::kYes:    *answer = NOverwriteAnswer::kYes; break;\n    case NUserAnswerMode::kAutoRenameAll: *answer = NOverwriteAnswer::kAutoRename; break;\n    default: return E_FAIL;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackConsole::PrepareOperation(const wchar_t *name, bool /* isFolder */, Int32 askExtractMode, const UInt64 *position)\n{\n  switch (askExtractMode)\n  {\n    case NArchive::NExtract::NAskMode::kExtract: (*OutStream) << kExtractString; break;\n    case NArchive::NExtract::NAskMode::kTest:    (*OutStream) << kTestString; break;\n    case NArchive::NExtract::NAskMode::kSkip:    (*OutStream) << kSkipString; break;\n  };\n  (*OutStream) << name;\n  if (position != 0)\n    (*OutStream) << \" <\" << *position << \">\";\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackConsole::MessageError(const wchar_t *message)\n{\n  (*OutStream) << message << endl;\n  NumFileErrorsInCurrentArchive++;\n  NumFileErrors++;\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackConsole::SetOperationResult(Int32 operationResult, bool encrypted)\n{\n  switch(operationResult)\n  {\n    case NArchive::NExtract::NOperationResult::kOK:\n      break;\n    default:\n    {\n      NumFileErrorsInCurrentArchive++;\n      NumFileErrors++;\n      (*OutStream) << \"     \";\n      switch(operationResult)\n      {\n        case NArchive::NExtract::NOperationResult::kUnSupportedMethod:\n          (*OutStream) << kUnsupportedMethod;\n          break;\n        case NArchive::NExtract::NOperationResult::kCRCError:\n          (*OutStream) << (encrypted ? kCrcFailedEncrypted: kCrcFailed);\n          break;\n        case NArchive::NExtract::NOperationResult::kDataError:\n          (*OutStream) << (encrypted ? kDataErrorEncrypted : kDataError);\n          break;\n        default:\n          (*OutStream) << kUnknownError;\n      }\n    }\n  }\n  (*OutStream) << endl;\n  return S_OK;\n}\n\n#ifndef _NO_CRYPTO\n\nHRESULT CExtractCallbackConsole::SetPassword(const UString &password)\n{\n  PasswordIsDefined = true;\n  Password = password;\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackConsole::CryptoGetTextPassword(BSTR *password)\n{\n  if (!PasswordIsDefined)\n  {\n    Password = GetPassword(OutStream);\n    PasswordIsDefined = true;\n  }\n  return StringToBstr(Password, password);\n}\n\n#endif\n\nHRESULT CExtractCallbackConsole::BeforeOpen(const wchar_t *name)\n{\n  NumArchives++;\n  NumFileErrorsInCurrentArchive = 0;\n  (*OutStream) << endl << kProcessing << name << endl;\n  return S_OK;\n}\n\nHRESULT CExtractCallbackConsole::OpenResult(const wchar_t * /* name */, HRESULT result, bool encrypted)\n{\n  (*OutStream) << endl;\n  if (result != S_OK)\n  {\n    (*OutStream) << \"Error: \";\n    if (result == S_FALSE)\n    {\n      (*OutStream) << (encrypted ?\n        \"Can not open encrypted archive. Wrong password?\" :\n        \"Can not open file as archive\");\n    }\n    else\n    {\n      if (result == E_OUTOFMEMORY)\n        (*OutStream) << \"Can't allocate required memory\";\n      else\n        (*OutStream) << NError::MyFormatMessage(result);\n    }\n    (*OutStream) << endl;\n    NumArchiveErrors++;\n  }\n  return S_OK;\n}\n  \nHRESULT CExtractCallbackConsole::ThereAreNoFiles()\n{\n  (*OutStream) << endl << kNoFiles << endl;\n  return S_OK;\n}\n\nHRESULT CExtractCallbackConsole::ExtractResult(HRESULT result)\n{\n  if (result == S_OK)\n  {\n    (*OutStream) << endl;\n    if (NumFileErrorsInCurrentArchive == 0)\n      (*OutStream) << kEverythingIsOk << endl;\n    else\n    {\n      NumArchiveErrors++;\n      (*OutStream) << \"Sub items Errors: \" << NumFileErrorsInCurrentArchive << endl;\n    }\n  }\n  if (result == S_OK)\n    return result;\n  NumArchiveErrors++;\n  if (result == E_ABORT || result == ERROR_DISK_FULL)\n    return result;\n  (*OutStream) << endl << kError;\n  if (result == E_OUTOFMEMORY)\n    (*OutStream) << kMemoryExceptionMessage;\n  else\n  {\n    UString message;\n    NError::MyFormatMessage(result, message);\n    (*OutStream) << message;\n  }\n  (*OutStream) << endl;\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/ExtractCallbackConsole.h",
    "content": "// ExtractCallbackConsole.h\n\n#ifndef __EXTRACTCALLBACKCONSOLE_H\n#define __EXTRACTCALLBACKCONSOLE_H\n\n#include \"Common/MyString.h\"\n#include \"Common/StdOutStream.h\"\n#include \"../../Common/FileStreams.h\"\n#include \"../../IPassword.h\"\n#include \"../../Archive/IArchive.h\"\n#include \"../Common/ArchiveExtractCallback.h\"\n\nclass CExtractCallbackConsole:\n  public IExtractCallbackUI,\n  #ifndef _NO_CRYPTO\n  public ICryptoGetTextPassword,\n  #endif\n  public CMyUnknownImp\n{\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IFolderArchiveExtractCallback)\n  #ifndef _NO_CRYPTO\n  MY_QUERYINTERFACE_ENTRY(ICryptoGetTextPassword)\n  #endif\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  STDMETHOD(SetTotal)(UInt64 total);\n  STDMETHOD(SetCompleted)(const UInt64 *completeValue);\n\n  // IFolderArchiveExtractCallback\n  STDMETHOD(AskOverwrite)(\n      const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,\n      const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,\n      Int32 *answer);\n  STDMETHOD (PrepareOperation)(const wchar_t *name, bool isFolder, Int32 askExtractMode, const UInt64 *position);\n\n  STDMETHOD(MessageError)(const wchar_t *message);\n  STDMETHOD(SetOperationResult)(Int32 operationResult, bool encrypted);\n\n  HRESULT BeforeOpen(const wchar_t *name);\n  HRESULT OpenResult(const wchar_t *name, HRESULT result, bool encrypted);\n  HRESULT ThereAreNoFiles();\n  HRESULT ExtractResult(HRESULT result);\n\n \n  #ifndef _NO_CRYPTO\n  HRESULT SetPassword(const UString &password);\n  STDMETHOD(CryptoGetTextPassword)(BSTR *password);\n\n  bool PasswordIsDefined;\n  UString Password;\n\n  #endif\n  \n  UInt64 NumArchives;\n  UInt64 NumArchiveErrors;\n  UInt64 NumFileErrors;\n  UInt64 NumFileErrorsInCurrentArchive;\n\n  CStdOutStream *OutStream;\n\n  void Init()\n  {\n    NumArchives = 0;\n    NumArchiveErrors = 0;\n    NumFileErrors = 0;\n    NumFileErrorsInCurrentArchive = 0;\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/List.cpp",
    "content": "// List.cpp\n\n#include \"StdAfx.h\"\n\n#include \"List.h\"\n#include \"ConsoleClose.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/StdOutStream.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/MyCom.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariantConversions.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/Error.h\"\n\n#include \"../../Archive/IArchive.h\"\n\n#include \"../Common/PropIDUtils.h\"\n#include \"../Common/OpenArchive.h\"\n\n#include \"OpenCallbackConsole.h\"\n\nusing namespace NWindows;\n\nstruct CPropIdToName\n{\n  PROPID PropID;\n  const wchar_t *Name;\n};\n\nstatic CPropIdToName kPropIdToName[] =\n{\n  { kpidPath, L\"Path\" },\n  { kpidName, L\"Name\" },\n  { kpidIsDir, L\"Folder\" },\n  { kpidSize, L\"Size\" },\n  { kpidPackSize, L\"Packed Size\" },\n  { kpidAttrib, L\"Attributes\" },\n  { kpidCTime, L\"Created\" },\n  { kpidATime, L\"Accessed\" },\n  { kpidMTime, L\"Modified\" },\n  { kpidSolid, L\"Solid\" },\n  { kpidCommented, L\"Commented\" },\n  { kpidEncrypted, L\"Encrypted\" },\n  { kpidSplitBefore, L\"Split Before\" },\n  { kpidSplitAfter, L\"Split After\" },\n  { kpidDictionarySize, L\"Dictionary Size\" },\n  { kpidCRC, L\"CRC\" },\n  { kpidType, L\"Type\" },\n  { kpidIsAnti, L\"Anti\" },\n  { kpidMethod, L\"Method\" },\n  { kpidHostOS, L\"Host OS\" },\n  { kpidFileSystem, L\"File System\" },\n  { kpidUser, L\"User\" },\n  { kpidGroup, L\"Group\" },\n  { kpidBlock, L\"Block\" },\n  { kpidComment, L\"Comment\" },\n  { kpidPosition, L\"Position\" },\n  { kpidPrefix, L\"Prefix\" },\n  { kpidNumSubDirs, L\"Folders\" },\n  { kpidNumSubFiles, L\"Files\" },\n  { kpidUnpackVer, L\"Version\" },\n  { kpidVolume, L\"Volume\" },\n  { kpidIsVolume, L\"Multivolume\" },\n  { kpidOffset, L\"Offset\" },\n  { kpidLinks, L\"Links\" },\n  { kpidNumBlocks, L\"Blocks\" },\n  { kpidNumVolumes, L\"Volumes\" },\n\n  { kpidBit64, L\"64-bit\" },\n  { kpidBigEndian, L\"Big-endian\" },\n  { kpidCpu, L\"CPU\" },\n  { kpidPhySize, L\"Physical Size\" },\n  { kpidHeadersSize, L\"Headers Size\" },\n  { kpidChecksum, L\"Checksum\" },\n  { kpidCharacts, L\"Characteristics\" },\n  { kpidVa, L\"Virtual Address\" },\n  { kpidFreeSpace, L\"Free Space\" },\n  { kpidClusterSize, L\"Cluster Size\" }\n};\n\nstatic const char kEmptyAttribChar = '.';\n\nstatic const char *kListing = \"Listing archive: \";\nstatic const wchar_t *kFilesMessage = L\"files\";\nstatic const wchar_t *kDirsMessage = L\"folders\";\n\nstatic void GetAttribString(DWORD wa, bool isDir, char *s)\n{\n  s[0] = ((wa & FILE_ATTRIBUTE_DIRECTORY) != 0 || isDir) ? 'D' : kEmptyAttribChar;\n  s[1] = ((wa & FILE_ATTRIBUTE_READONLY) != 0) ? 'R': kEmptyAttribChar;\n  s[2] = ((wa & FILE_ATTRIBUTE_HIDDEN) != 0) ? 'H': kEmptyAttribChar;\n  s[3] = ((wa & FILE_ATTRIBUTE_SYSTEM) != 0) ? 'S': kEmptyAttribChar;\n  s[4] = ((wa & FILE_ATTRIBUTE_ARCHIVE) != 0) ? 'A': kEmptyAttribChar;\n  s[5] = '\\0';\n}\n\nenum EAdjustment\n{\n  kLeft,\n  kCenter,\n  kRight\n};\n\nstruct CFieldInfo\n{\n  PROPID PropID;\n  UString Name;\n  EAdjustment TitleAdjustment;\n  EAdjustment TextAdjustment;\n  int PrefixSpacesWidth;\n  int Width;\n};\n\nstruct CFieldInfoInit\n{\n  PROPID PropID;\n  const wchar_t *Name;\n  EAdjustment TitleAdjustment;\n  EAdjustment TextAdjustment;\n  int PrefixSpacesWidth;\n  int Width;\n};\n\nCFieldInfoInit kStandardFieldTable[] =\n{\n  { kpidMTime, L\"   Date      Time\", kLeft, kLeft, 0, 19 },\n  { kpidAttrib, L\"Attr\", kRight, kCenter, 1, 5 },\n  { kpidSize, L\"Size\", kRight, kRight, 1, 12 },\n  { kpidPackSize, L\"Compressed\", kRight, kRight, 1, 12 },\n  { kpidPath, L\"Name\", kLeft, kLeft, 2, 24 }\n};\n\nvoid PrintSpaces(int numSpaces)\n{\n  for (int i = 0; i < numSpaces; i++)\n    g_StdOut << ' ';\n}\n\nvoid PrintString(EAdjustment adjustment, int width, const UString &textString)\n{\n  const int numSpaces = width - textString.Length();\n  int numLeftSpaces = 0;\n  switch (adjustment)\n  {\n    case kLeft:\n      numLeftSpaces = 0;\n      break;\n    case kCenter:\n      numLeftSpaces = numSpaces / 2;\n      break;\n    case kRight:\n      numLeftSpaces = numSpaces;\n      break;\n  }\n  PrintSpaces(numLeftSpaces);\n  g_StdOut << textString;\n  PrintSpaces(numSpaces - numLeftSpaces);\n}\n\nclass CFieldPrinter\n{\n  CObjectVector<CFieldInfo> _fields;\npublic:\n  void Clear() { _fields.Clear(); }\n  void Init(const CFieldInfoInit *standardFieldTable, int numItems);\n  HRESULT Init(IInArchive *archive);\n  void PrintTitle();\n  void PrintTitleLines();\n  HRESULT PrintItemInfo(IInArchive *archive,\n      const UString &defaultItemName,\n      UInt32 index,\n      bool techMode);\n  HRESULT PrintSummaryInfo(UInt64 numFiles, UInt64 numDirs,\n      const UInt64 *size, const UInt64 *compressedSize);\n};\n\nvoid CFieldPrinter::Init(const CFieldInfoInit *standardFieldTable, int numItems)\n{\n  Clear();\n  for (int i = 0; i < numItems; i++)\n  {\n    CFieldInfo fieldInfo;\n    const CFieldInfoInit &fieldInfoInit = standardFieldTable[i];\n    fieldInfo.PropID = fieldInfoInit.PropID;\n    fieldInfo.Name = fieldInfoInit.Name;\n    fieldInfo.TitleAdjustment = fieldInfoInit.TitleAdjustment;\n    fieldInfo.TextAdjustment = fieldInfoInit.TextAdjustment;\n    fieldInfo.PrefixSpacesWidth = fieldInfoInit.PrefixSpacesWidth;\n    fieldInfo.Width = fieldInfoInit.Width;\n    _fields.Add(fieldInfo);\n  }\n}\n\nstatic UString GetPropName(PROPID propID, BSTR name)\n{\n  for (int i = 0; i < sizeof(kPropIdToName) / sizeof(kPropIdToName[0]); i++)\n  {\n    const CPropIdToName &propIdToName = kPropIdToName[i];\n    if (propIdToName.PropID == propID)\n      return propIdToName.Name;\n  }\n  if (name)\n    return name;\n  wchar_t s[32];\n  ConvertUInt64ToString(propID, s);\n  return s;\n}\n\nHRESULT CFieldPrinter::Init(IInArchive *archive)\n{\n  Clear();\n  UInt32 numProps;\n  RINOK(archive->GetNumberOfProperties(&numProps));\n  for (UInt32 i = 0; i < numProps; i++)\n  {\n    CMyComBSTR name;\n    PROPID propID;\n    VARTYPE vt;\n    RINOK(archive->GetPropertyInfo(i, &name, &propID, &vt));\n    CFieldInfo fieldInfo;\n    fieldInfo.PropID = propID;\n    fieldInfo.Name = GetPropName(propID, name);\n    _fields.Add(fieldInfo);\n  }\n  return S_OK;\n}\n\nvoid CFieldPrinter::PrintTitle()\n{\n  for (int i = 0; i < _fields.Size(); i++)\n  {\n    const CFieldInfo &fieldInfo = _fields[i];\n    PrintSpaces(fieldInfo.PrefixSpacesWidth);\n    PrintString(fieldInfo.TitleAdjustment,\n      ((fieldInfo.PropID == kpidPath) ? 0: fieldInfo.Width), fieldInfo.Name);\n  }\n}\n\nvoid CFieldPrinter::PrintTitleLines()\n{\n  for (int i = 0; i < _fields.Size(); i++)\n  {\n    const CFieldInfo &fieldInfo = _fields[i];\n    PrintSpaces(fieldInfo.PrefixSpacesWidth);\n    for (int i = 0; i < fieldInfo.Width; i++)\n      g_StdOut << '-';\n  }\n}\n\n\nBOOL IsFileTimeZero(CONST FILETIME *lpFileTime)\n{\n  return (lpFileTime->dwLowDateTime == 0) && (lpFileTime->dwHighDateTime == 0);\n}\n\nstatic const char *kEmptyTimeString = \"                   \";\nvoid PrintTime(const NCOM::CPropVariant &prop)\n{\n  if (prop.vt != VT_FILETIME)\n    throw \"incorrect item\";\n  if (IsFileTimeZero(&prop.filetime))\n    g_StdOut << kEmptyTimeString;\n  else\n  {\n    FILETIME localFileTime;\n    if (!FileTimeToLocalFileTime(&prop.filetime, &localFileTime))\n      throw \"FileTimeToLocalFileTime error\";\n    char s[32];\n    if (ConvertFileTimeToString(localFileTime, s, true, true))\n      g_StdOut << s;\n    else\n      g_StdOut << kEmptyTimeString;\n  }\n}\n\nHRESULT CFieldPrinter::PrintItemInfo(IInArchive *archive,\n    const UString &defaultItemName,\n    UInt32 index,\n    bool techMode)\n{\n  /*\n  if (techMode)\n  {\n    g_StdOut << \"Index = \";\n    g_StdOut << (UInt64)index;\n    g_StdOut << endl;\n  }\n  */\n  for (int i = 0; i < _fields.Size(); i++)\n  {\n    const CFieldInfo &fieldInfo = _fields[i];\n    if (!techMode)\n      PrintSpaces(fieldInfo.PrefixSpacesWidth);\n\n    NCOM::CPropVariant prop;\n    if (fieldInfo.PropID == kpidPath)\n    {\n      UString s;\n      RINOK(GetArchiveItemPath(archive, index, defaultItemName, s));\n      prop = s;\n    }\n    else\n    {\n      RINOK(archive->GetProperty(index, fieldInfo.PropID, &prop));\n    }\n    if (techMode)\n    {\n      g_StdOut << fieldInfo.Name << \" = \";\n    }\n    int width = (fieldInfo.PropID == kpidPath) ? 0: fieldInfo.Width;\n    if (prop.vt == VT_EMPTY)\n    {\n      switch(fieldInfo.PropID)\n      {\n        case kpidPath:  prop = defaultItemName; break;\n        default:\n          if (techMode)\n            g_StdOut << endl;\n          else\n            PrintSpaces(width);\n          continue;\n      }\n    }\n    if (fieldInfo.PropID == kpidMTime)\n    {\n      PrintTime(prop);\n    }\n    else if (fieldInfo.PropID == kpidAttrib)\n    {\n      if (prop.vt != VT_UI4)\n        throw \"incorrect item\";\n      UInt32 attributes = prop.ulVal;\n      bool isFolder;\n      RINOK(IsArchiveItemFolder(archive, index, isFolder));\n      char s[8];\n      GetAttribString(attributes, isFolder, s);\n      g_StdOut << s;\n    }\n    else if (prop.vt == VT_BSTR)\n    {\n      if (techMode)\n        g_StdOut << prop.bstrVal;\n      else\n        PrintString(fieldInfo.TextAdjustment, width, prop.bstrVal);\n    }\n    else\n    {\n      UString s = ConvertPropertyToString(prop, fieldInfo.PropID);\n      s.Replace(wchar_t(0xA), L' ');\n      s.Replace(wchar_t(0xD), L' ');\n\n      if (techMode)\n        g_StdOut << s;\n      else\n        PrintString(fieldInfo.TextAdjustment, width, s);\n    }\n    if (techMode)\n      g_StdOut << endl;\n  }\n  return S_OK;\n}\n\nvoid PrintNumberString(EAdjustment adjustment, int width, const UInt64 *value)\n{\n  wchar_t textString[32] = { 0 };\n  if (value != NULL)\n    ConvertUInt64ToString(*value, textString);\n  PrintString(adjustment, width, textString);\n}\n\n\nHRESULT CFieldPrinter::PrintSummaryInfo(UInt64 numFiles, UInt64 numDirs,\n    const UInt64 *size, const UInt64 *compressedSize)\n{\n  for (int i = 0; i < _fields.Size(); i++)\n  {\n    const CFieldInfo &fieldInfo = _fields[i];\n    PrintSpaces(fieldInfo.PrefixSpacesWidth);\n    NCOM::CPropVariant prop;\n    if (fieldInfo.PropID == kpidSize)\n      PrintNumberString(fieldInfo.TextAdjustment, fieldInfo.Width, size);\n    else if (fieldInfo.PropID == kpidPackSize)\n      PrintNumberString(fieldInfo.TextAdjustment, fieldInfo.Width, compressedSize);\n    else if (fieldInfo.PropID == kpidPath)\n    {\n      wchar_t textString[32];\n      ConvertUInt64ToString(numFiles, textString);\n      UString temp = textString;\n      temp += L\" \";\n      temp += kFilesMessage;\n      temp += L\", \";\n      ConvertUInt64ToString(numDirs, textString);\n      temp += textString;\n      temp += L\" \";\n      temp += kDirsMessage;\n      PrintString(fieldInfo.TextAdjustment, 0, temp);\n    }\n    else\n      PrintString(fieldInfo.TextAdjustment, fieldInfo.Width, L\"\");\n  }\n  return S_OK;\n}\n\nbool GetUInt64Value(IInArchive *archive, UInt32 index, PROPID propID, UInt64 &value)\n{\n  NCOM::CPropVariant prop;\n  if (archive->GetProperty(index, propID, &prop) != S_OK)\n    throw \"GetPropertyValue error\";\n  if (prop.vt == VT_EMPTY)\n    return false;\n  value = ConvertPropVariantToUInt64(prop);\n  return true;\n}\n\nHRESULT ListArchives(CCodecs *codecs, const CIntVector &formatIndices,\n    UStringVector &archivePaths, UStringVector &archivePathsFull,\n    const NWildcard::CCensorNode &wildcardCensor,\n    bool enableHeaders, bool techMode,\n    #ifndef _NO_CRYPTO\n    bool &passwordEnabled, UString &password,\n    #endif\n    UInt64 &numErrors)\n{\n  numErrors = 0;\n  CFieldPrinter fieldPrinter;\n  if (!techMode)\n    fieldPrinter.Init(kStandardFieldTable, sizeof(kStandardFieldTable) / sizeof(kStandardFieldTable[0]));\n\n  UInt64 numFiles2 = 0, numDirs2 = 0, totalPackSize2 = 0, totalUnPackSize2 = 0;\n  UInt64 *totalPackSizePointer2 = 0, *totalUnPackSizePointer2 = 0;\n  for (int i = 0; i < archivePaths.Size(); i++)\n  {\n    const UString &archiveName = archivePaths[i];\n    NFile::NFind::CFileInfoW fi;\n    if (!NFile::NFind::FindFile(archiveName, fi) || fi.IsDir())\n    {\n      g_StdOut << endl << \"Error: \" << archiveName << \" is not file\" << endl;\n      numErrors++;\n      continue;\n    }\n\n    CArchiveLink archiveLink;\n\n    COpenCallbackConsole openCallback;\n    openCallback.OutStream = &g_StdOut;\n\n    #ifndef _NO_CRYPTO\n\n    openCallback.PasswordIsDefined = passwordEnabled;\n    openCallback.Password = password;\n\n    #endif\n\n    HRESULT result = MyOpenArchive(codecs, formatIndices, archiveName, archiveLink, &openCallback);\n    if (result != S_OK)\n    {\n      if (result == E_ABORT)\n        return result;\n      g_StdOut << endl << \"Error: \" << archiveName << \": \";\n      if (result == S_FALSE)\n        g_StdOut << \"is not supported archive\";\n      else if (result == E_OUTOFMEMORY)\n        g_StdOut << \"Can't allocate required memory\";\n      else\n        g_StdOut << NError::MyFormatMessage(result);\n      g_StdOut << endl;\n      numErrors++;\n      continue;\n    }\n\n    for (int v = 0; v < archiveLink.VolumePaths.Size(); v++)\n    {\n      int index = archivePathsFull.FindInSorted(archiveLink.VolumePaths[v]);\n      if (index >= 0 && index > i)\n      {\n        archivePaths.Delete(index);\n        archivePathsFull.Delete(index);\n      }\n    }\n\n    IInArchive *archive = archiveLink.GetArchive();\n    const UString defaultItemName = archiveLink.GetDefaultItemName();\n\n    if (enableHeaders)\n    {\n      g_StdOut << endl << kListing << archiveName << endl << endl;\n\n      UInt32 numProps;\n      if (archive->GetNumberOfArchiveProperties(&numProps) == S_OK)\n      {\n        for (UInt32 i = 0; i < numProps; i++)\n        {\n          CMyComBSTR name;\n          PROPID propID;\n          VARTYPE vt;\n          if (archive->GetArchivePropertyInfo(i, &name, &propID, &vt) != S_OK)\n            continue;\n          NCOM::CPropVariant prop;\n          if (archive->GetArchiveProperty(propID, &prop) != S_OK)\n            continue;\n          UString s = ConvertPropertyToString(prop, propID);\n          if (!s.IsEmpty())\n            g_StdOut << GetPropName(propID, name) << \" = \" << s << endl;\n        }\n      }\n      if (techMode)\n        g_StdOut << \"----------\\n\";\n      if (numProps > 0)\n        g_StdOut << endl;\n    }\n\n    if (enableHeaders && !techMode)\n    {\n      fieldPrinter.PrintTitle();\n      g_StdOut << endl;\n      fieldPrinter.PrintTitleLines();\n      g_StdOut << endl;\n    }\n\n    if (techMode)\n    {\n      RINOK(fieldPrinter.Init(archive));\n    }\n    UInt64 numFiles = 0, numDirs = 0, totalPackSize = 0, totalUnPackSize = 0;\n    UInt64 *totalPackSizePointer = 0, *totalUnPackSizePointer = 0;\n    UInt32 numItems;\n    RINOK(archive->GetNumberOfItems(&numItems));\n    for(UInt32 i = 0; i < numItems; i++)\n    {\n      if (NConsoleClose::TestBreakSignal())\n        return E_ABORT;\n\n      UString filePath;\n      RINOK(GetArchiveItemPath(archive, i, defaultItemName, filePath));\n\n      bool isFolder;\n      RINOK(IsArchiveItemFolder(archive, i, isFolder));\n      if (!wildcardCensor.CheckPath(filePath, !isFolder))\n        continue;\n      \n      fieldPrinter.PrintItemInfo(archive, defaultItemName, i, techMode);\n      \n      UInt64 packSize, unpackSize;\n      if (!GetUInt64Value(archive, i, kpidSize, unpackSize))\n        unpackSize = 0;\n      else\n        totalUnPackSizePointer = &totalUnPackSize;\n      if (!GetUInt64Value(archive, i, kpidPackSize, packSize))\n        packSize = 0;\n      else\n        totalPackSizePointer = &totalPackSize;\n      \n      g_StdOut << endl;\n\n      if (isFolder)\n        numDirs++;\n      else\n        numFiles++;\n      totalPackSize += packSize;\n      totalUnPackSize += unpackSize;\n    }\n    if (enableHeaders && !techMode)\n    {\n      fieldPrinter.PrintTitleLines();\n      g_StdOut << endl;\n      fieldPrinter.PrintSummaryInfo(numFiles, numDirs, totalUnPackSizePointer, totalPackSizePointer);\n      g_StdOut << endl;\n    }\n    if (totalPackSizePointer != 0)\n    {\n      totalPackSizePointer2 = &totalPackSize2;\n      totalPackSize2 += totalPackSize;\n    }\n    if (totalUnPackSizePointer != 0)\n    {\n      totalUnPackSizePointer2 = &totalUnPackSize2;\n      totalUnPackSize2 += totalUnPackSize;\n    }\n    numFiles2 += numFiles;\n    numDirs2 += numDirs;\n  }\n  if (enableHeaders && !techMode && archivePaths.Size() > 1)\n  {\n    g_StdOut << endl;\n    fieldPrinter.PrintTitleLines();\n    g_StdOut << endl;\n    fieldPrinter.PrintSummaryInfo(numFiles2, numDirs2, totalUnPackSizePointer2, totalPackSizePointer2);\n    g_StdOut << endl;\n    g_StdOut << \"Archives: \" << archivePaths.Size() << endl;\n  }\n  return S_OK;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/List.h",
    "content": "// List.h\n\n#ifndef __LIST_H\n#define __LIST_H\n\n#include \"Common/Wildcard.h\"\n#include \"../Common/LoadCodecs.h\"\n\nHRESULT ListArchives(CCodecs *codecs, const CIntVector &formatIndices,\n    UStringVector &archivePaths, UStringVector &archivePathsFull,\n    const NWildcard::CCensorNode &wildcardCensor,\n    bool enableHeaders, bool techMode,\n    #ifndef _NO_CRYPTO\n    bool &passwordEnabled, UString &password,\n    #endif\n    UInt64 &errors);\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/Main.cpp",
    "content": "// Main.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/MyInitGuid.h\"\n\n#include \"Common/CommandLineParser.h\"\n#include \"Common/MyException.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/ListFileUtils.h\"\n#include \"Common/StdInStream.h\"\n#include \"Common/StdOutStream.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/StringToInt.h\"\n#include \"Common/Wildcard.h\"\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/Error.h\"\n#ifdef _WIN32\n#include \"Windows/MemoryLock.h\"\n#endif\n\n#include \"../../IPassword.h\"\n#include \"../../ICoder.h\"\n#include \"../Common/UpdateAction.h\"\n#include \"../Common/Update.h\"\n#include \"../Common/Extract.h\"\n#include \"../Common/ArchiveCommandLine.h\"\n#include \"../Common/ExitCode.h\"\n#ifdef EXTERNAL_CODECS\n#include \"../Common/LoadCodecs.h\"\n#endif\n\n#include \"../../Compress/LZMA_Alone/LzmaBenchCon.h\"\n\n#include \"List.h\"\n#include \"OpenCallbackConsole.h\"\n#include \"ExtractCallbackConsole.h\"\n#include \"UpdateCallbackConsole.h\"\n\n#include \"../../MyVersion.h\"\n\n#if defined( _WIN32) && defined( _7ZIP_LARGE_PAGES)\nextern \"C\"\n{\n#include \"../../../../C/Alloc.h\"\n}\n#endif\n\n#include \"myPrivate.h\"\n#include \"Windows/System.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NCommandLineParser;\n\n// HINSTANCE g_hInstance = 0;\nextern CStdOutStream *g_StdStream;\n\nstatic const char *kCopyrightString = \"\\n7-Zip\"\n#ifndef EXTERNAL_CODECS\n\" (A)\"\n#endif\n\n#ifdef _WIN64\n\" [64]\"\n#endif\n\n\" \" MY_VERSION_COPYRIGHT_DATE \"\\n\"\n\"p7zip Version \" P7ZIP_VERSION ;\n\nstatic const char *kHelpString =\n    \"\\nUsage: 7z\"\n#ifdef _NO_CRYPTO\n    \"r\"\n#else\n#ifndef EXTERNAL_CODECS\n    \"a\"\n#endif\n#endif\n    \" <command> [<switches>...] <archive_name> [<file_names>...]\\n\"\n    \"       [<@listfiles...>]\\n\"\n    \"\\n\"\n    \"<Commands>\\n\"\n    \"  a: Add files to archive\\n\"\n    \"  b: Benchmark\\n\"\n    \"  d: Delete files from archive\\n\"\n    \"  e: Extract files from archive (without using directory names)\\n\"\n    \"  l: List contents of archive\\n\"\n//    \"  l[a|t][f]: List contents of archive\\n\"\n//    \"    a - with Additional fields\\n\"\n//    \"    t - with all fields\\n\"\n//    \"    f - with Full pathnames\\n\"\n    \"  t: Test integrity of archive\\n\"\n    \"  u: Update files to archive\\n\"\n    \"  x: eXtract files with full paths\\n\"\n    \"<Switches>\\n\"\n    \"  -ai[r[-|0]]{@listfile|!wildcard}: Include archives\\n\"\n    \"  -ax[r[-|0]]{@listfile|!wildcard}: eXclude archives\\n\"\n    \"  -bd: Disable percentage indicator\\n\"\n    \"  -i[r[-|0]]{@listfile|!wildcard}: Include filenames\\n\"\n    \"  -m{Parameters}: set compression Method (see the manual)\\n\"\n#ifdef HAVE_LSTAT\n    \"  -l: don't store symlinks; store the files/directories they point to\\n\"\n    \"  CAUTION : the scanning stage can never end because of symlinks like '..'\\n\"\n    \"            (ex:  ln -s .. ldir)\\n\"\n#endif\n    \"  -o{Directory}: set Output directory\\n\"\n    #ifndef _NO_CRYPTO\n    \"  -p{Password}: set Password\\n\"\n    #endif\n    \"  -r[-|0]: Recurse subdirectories\\n\"\n    \"  (CAUTION: this flag does not do what you think, avoid using it)\\n\"\n    \"  -sfx[{name}]: Create SFX archive\\n\"\n    \"  -si[{name}]: read data from stdin\\n\"\n    \"  -slt: show technical information for l (List) command\\n\"\n    \"  -so: write data to stdout (eg: \"\n        \"7z\"\n#ifdef _NO_CRYPTO\n        \"r\"\n#elif EXCLUDE_COM\n        \"a\"\n#endif\n        \" a dummy -tgzip -so Doc.txt > archive.gz)\\n\"\n    \"  -ssc[-]: set sensitive case mode\\n\"\n    \"  -t{Type}: Set type of archive\\n\"\n    \"  -v{Size}[b|k|m|g]: Create volumes\\n\"\n    \"  -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: Update options\\n\"\n    \"  -w[path]: assign Work directory. Empty path means a temporary directory\\n\"\n    \"  -x[r[-|0]]]{@listfile|!wildcard}: eXclude filenames\\n\"\n    \"  -y: assume Yes on all queries\\n\";\n\n// ---------------------------\n// exception messages\n\nstatic const char *kEverythingIsOk = \"Everything is Ok\";\nstatic const char *kUserErrorMessage  = \"Incorrect command line\"; // NExitCode::kUserError\nstatic const char *kNoFormats = \"7-Zip cannot find the code that works with archives.\";\n\nstatic const wchar_t *kDefaultSfxModule = L\"7zCon.sfx\";\n\nstatic void ShowMessageAndThrowException(CStdOutStream &s, LPCSTR message, NExitCode::EEnum code)\n{\n  s << message << endl;\n  throw code;\n}\n\nstatic void PrintHelpAndExit(CStdOutStream &s) // yyy\n{\n  s << kHelpString;\n  ShowMessageAndThrowException(s, kUserErrorMessage, NExitCode::kUserError);\n}\n\n#ifndef _WIN32\nstatic void GetArguments(int numArguments, const char *arguments[], UStringVector &parts)\n{\n  parts.Clear();\n  for(int i = 0; i < numArguments; i++)\n  {\n    UString s = MultiByteToUnicodeString(arguments[i]);\n    parts.Add(s);\n  }\n}\n#endif\n\nstatic void ShowCopyrightAndHelp(CStdOutStream &s, bool needHelp)\n{\n    s << kCopyrightString << \" (locale=\" << my_getlocale() <<\",Utf16=\";\n    if (global_use_utf16_conversion) s << \"on\";\n    else                             s << \"off\";\n    s << \",HugeFiles=\";\n    if (sizeof(off_t) >= 8) s << \"on,\";\n    else                    s << \"off,\";\n    int nbcpu = NWindows::NSystem::GetNumberOfProcessors();\n    if (nbcpu > 1) s << nbcpu << \" CPUs)\\n\";\n    else           s << nbcpu << \" CPU)\\n\";\n\n  if (needHelp)\n    s << kHelpString;\n}\n\n#ifdef EXTERNAL_CODECS\nstatic void PrintString(CStdOutStream &stdStream, const AString &s, int size)\n{\n  int len = s.Length();\n  stdStream << s;\n  for (int i = len; i < size; i++)\n    stdStream << ' ';\n}\n#endif\n\nstatic void PrintString(CStdOutStream &stdStream, const UString &s, int size)\n{\n  int len = s.Length();\n  stdStream << s;\n  for (int i = len; i < size; i++)\n    stdStream << ' ';\n}\n\nstatic inline char GetHex(Byte value)\n{\n  return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));\n}\n\nconst char *kUnsupportedArcTypeMessage = \"Unsupported archive type\";\n\nint Main2(\n  #ifndef _WIN32\n  int numArguments, const char *arguments[]\n  #endif\n)\n{\n  #ifdef _WIN32\n  SetFileApisToOEM();\n  #endif\n  \n  UStringVector commandStrings;\n  #ifdef _WIN32\n  NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);\n  #else\n  // GetArguments(numArguments, arguments, commandStrings);\n  extern void mySplitCommandLine(int numArguments,const char *arguments[],UStringVector &parts);\n  mySplitCommandLine(numArguments,arguments,commandStrings);\n  #endif\n\n  if(commandStrings.Size() == 1)\n  {\n    ShowCopyrightAndHelp(g_StdOut, true);\n    return 0;\n  }\n  commandStrings.Delete(0);\n\n  CArchiveCommandLineOptions options;\n\n  CArchiveCommandLineParser parser;\n\n  parser.Parse1(commandStrings, options);\n\n  if(options.HelpMode)\n  {\n    ShowCopyrightAndHelp(g_StdOut, true);\n    return 0;\n  }\n\n  #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES)\n  if (options.LargePages)\n  {\n    SetLargePageSize();\n    NSecurity::EnableLockMemoryPrivilege();\n  }\n  #endif\n\n  CStdOutStream &stdStream = options.StdOutMode ? g_StdErr : g_StdOut;\n  g_StdStream = &stdStream;\n\n  if (options.EnableHeaders)\n    ShowCopyrightAndHelp(stdStream, false);\n\n  parser.Parse2(options);\n\n  CCodecs *codecs = new CCodecs;\n  CMyComPtr<\n    #ifdef EXTERNAL_CODECS\n    ICompressCodecsInfo\n    #else\n    IUnknown\n    #endif\n    > compressCodecsInfo = codecs;\n  HRESULT result = codecs->Load();\n  if (result != S_OK)\n    throw CSystemException(result);\n\n  bool isExtractGroupCommand = options.Command.IsFromExtractGroup();\n\n  if (codecs->Formats.Size() == 0 &&\n        (isExtractGroupCommand ||\n        options.Command.CommandType == NCommandType::kList ||\n        options.Command.IsFromUpdateGroup()))\n    throw kNoFormats;\n\n  CIntVector formatIndices;\n  if (!codecs->FindFormatForArchiveType(options.ArcType, formatIndices))\n    throw kUnsupportedArcTypeMessage;\n\n  if (options.Command.CommandType == NCommandType::kInfo)\n  {\n    stdStream << endl << \"Formats:\" << endl;\n    int i;\n    for (i = 0; i < codecs->Formats.Size(); i++)\n    {\n      const CArcInfoEx &arc = codecs->Formats[i];\n      #ifdef EXTERNAL_CODECS\n      if (arc.LibIndex >= 0)\n      {\n        char s[32];\n        ConvertUInt64ToString(arc.LibIndex, s);\n        PrintString(stdStream, s, 2);\n      }\n      else\n      #endif\n        stdStream << \"  \";\n      stdStream << ' ';\n      stdStream << (char)(arc.UpdateEnabled ? 'C' : ' ');\n      stdStream << (char)(arc.KeepName ? 'K' : ' ');\n      stdStream << \"  \";\n      PrintString(stdStream, arc.Name, 6);\n      stdStream << \"  \";\n      UString s;\n      for (int t = 0; t < arc.Exts.Size(); t++)\n      {\n        const CArcExtInfo &ext = arc.Exts[t];\n        s += ext.Ext;\n        if (!ext.AddExt.IsEmpty())\n        {\n          s += L\" (\";\n          s += ext.AddExt;\n          s += L')';\n        }\n        s += L' ';\n      }\n      PrintString(stdStream, s, 14);\n      stdStream << \"  \";\n      const CByteBuffer &sig = arc.StartSignature;\n      for (size_t j = 0; j < sig.GetCapacity(); j++)\n      {\n        Byte b = sig[j];\n        if (b > 0x20 && b < 0x80)\n        {\n          stdStream << (char)b;\n        }\n        else\n        {\n          stdStream << GetHex((Byte)((b >> 4) & 0xF));\n          stdStream << GetHex((Byte)(b & 0xF));\n        }\n        stdStream << ' ';\n      }\n      stdStream << endl;\n    }\n    stdStream << endl << \"Codecs:\" << endl;\n\n    #ifdef EXTERNAL_CODECS\n    UInt32 numMethods;\n    if (codecs->GetNumberOfMethods(&numMethods) == S_OK)\n    for (UInt32 j = 0; j < numMethods; j++)\n    {\n      int libIndex = codecs->GetCodecLibIndex(j);\n      if (libIndex >= 0)\n      {\n        char s[32];\n        ConvertUInt64ToString(libIndex, s);\n        PrintString(stdStream, s, 2);\n      }\n      else\n        stdStream << \"  \";\n      stdStream << ' ';\n      stdStream << (char)(codecs->GetCodecEncoderIsAssigned(j) ? 'C' : ' ');\n      UInt64 id;\n      stdStream << \"  \";\n      HRESULT res = codecs->GetCodecId(j, id);\n      if (res != S_OK)\n        id = (UInt64)(Int64)-1;\n      char s[32];\n      ConvertUInt64ToString(id, s, 16);\n      PrintString(stdStream, s, 8);\n      stdStream << \"  \";\n      PrintString(stdStream, codecs->GetCodecName(j), 11);\n      stdStream << endl;\n      /*\n      if (res != S_OK)\n        throw \"incorrect Codec ID\";\n      */\n    }\n    #endif\n    return S_OK;\n  }\n  else if (options.Command.CommandType == NCommandType::kBenchmark)\n  {\n    if (options.Method.CompareNoCase(L\"CRC\") == 0)\n    {\n      HRESULT res = CrcBenchCon((FILE *)stdStream, options.NumIterations, options.NumThreads, options.DictionarySize);\n      if (res != S_OK)\n      {\n        if (res == S_FALSE)\n        {\n          stdStream << \"\\nCRC Error\\n\";\n          return NExitCode::kFatalError;\n        }\n        throw CSystemException(res);\n      }\n    }\n    else\n    {\n      HRESULT res = LzmaBenchCon(\n        #ifdef EXTERNAL_LZMA\n        codecs,\n        #endif\n        (FILE *)stdStream, options.NumIterations, options.NumThreads, options.DictionarySize);\n      if (res != S_OK)\n      {\n        if (res == S_FALSE)\n        {\n          stdStream << \"\\nDecoding Error\\n\";\n          return NExitCode::kFatalError;\n        }\n        throw CSystemException(res);\n      }\n    }\n  }\n  else if (isExtractGroupCommand || options.Command.CommandType == NCommandType::kList)\n  {\n    if(isExtractGroupCommand)\n    {\n      CExtractCallbackConsole *ecs = new CExtractCallbackConsole;\n      CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;\n\n      ecs->OutStream = &stdStream;\n\n      #ifndef _NO_CRYPTO\n      ecs->PasswordIsDefined = options.PasswordEnabled;\n      ecs->Password = options.Password;\n      #endif\n\n      ecs->Init();\n\n      COpenCallbackConsole openCallback;\n      openCallback.OutStream = &stdStream;\n\n      #ifndef _NO_CRYPTO\n      openCallback.PasswordIsDefined = options.PasswordEnabled;\n      openCallback.Password = options.Password;\n      #endif\n\n      CExtractOptions eo;\n      eo.StdOutMode = options.StdOutMode;\n      eo.PathMode = options.Command.GetPathMode();\n      eo.TestMode = options.Command.IsTestMode();\n      eo.OverwriteMode = options.OverwriteMode;\n      eo.OutputDir = options.OutputDir;\n      eo.YesToAll = options.YesToAll;\n      #ifdef COMPRESS_MT\n      eo.Properties = options.ExtractProperties;\n      #endif\n      UString errorMessage;\n      CDecompressStat stat;\n      HRESULT result = DecompressArchives(\n          codecs,\n          formatIndices,\n          options.ArchivePathsSorted,\n          options.ArchivePathsFullSorted,\n          options.WildcardCensor.Pairs.Front().Head,\n          eo, &openCallback, ecs, errorMessage, stat);\n      if (!errorMessage.IsEmpty())\n      {\n        stdStream << endl << \"Error: \" << errorMessage;\n        if (result == S_OK)\n          result = E_FAIL;\n      }\n\n      stdStream << endl;\n      if (ecs->NumArchives > 1)\n        stdStream << \"Archives: \" << ecs->NumArchives << endl;\n      if (ecs->NumArchiveErrors != 0 || ecs->NumFileErrors != 0)\n      {\n        if (ecs->NumArchives > 1)\n        {\n          stdStream << endl;\n          if (ecs->NumArchiveErrors != 0)\n            stdStream << \"Archive Errors: \" << ecs->NumArchiveErrors << endl;\n          if (ecs->NumFileErrors != 0)\n            stdStream << \"Sub items Errors: \" << ecs->NumFileErrors << endl;\n        }\n        if (result != S_OK)\n          throw CSystemException(result);\n        return NExitCode::kFatalError;\n      }\n      if (result != S_OK)\n        throw CSystemException(result);\n      if (stat.NumFolders != 0)\n        stdStream << \"Folders: \" << stat.NumFolders << endl;\n      if (stat.NumFiles != 1 || stat.NumFolders != 0)\n          stdStream << \"Files: \" << stat.NumFiles << endl;\n      stdStream\n           << \"Size:       \" << stat.UnpackSize << endl\n           << \"Compressed: \" << stat.PackSize << endl;\n    }\n    else\n    {\n      UInt64 numErrors = 0;\n      HRESULT result = ListArchives(\n          codecs,\n          formatIndices,\n          options.ArchivePathsSorted,\n          options.ArchivePathsFullSorted,\n          options.WildcardCensor.Pairs.Front().Head,\n          options.EnableHeaders,\n          options.TechMode,\n          #ifndef _NO_CRYPTO\n          options.PasswordEnabled,\n          options.Password,\n          #endif\n          numErrors);\n      if (numErrors > 0)\n      {\n        g_StdOut << endl << \"Errors: \" << numErrors;\n        return NExitCode::kFatalError;\n      }\n      if (result != S_OK)\n        throw CSystemException(result);\n    }\n  }\n  else if(options.Command.IsFromUpdateGroup())\n  {\n    UString workingDir;\n\n    CUpdateOptions &uo = options.UpdateOptions;\n    if (uo.SfxMode && uo.SfxModule.IsEmpty())\n      uo.SfxModule = kDefaultSfxModule;\n\n    COpenCallbackConsole openCallback;\n    openCallback.OutStream = &stdStream;\n\n    #ifndef _NO_CRYPTO\n    bool passwordIsDefined =\n        options.PasswordEnabled && !options.Password.IsEmpty();\n    openCallback.PasswordIsDefined = passwordIsDefined;\n    openCallback.Password = options.Password;\n    #endif\n\n    CUpdateCallbackConsole callback;\n    callback.EnablePercents = options.EnablePercents;\n\n    #ifndef _NO_CRYPTO\n    callback.PasswordIsDefined = passwordIsDefined;\n    callback.AskPassword = options.PasswordEnabled && options.Password.IsEmpty();\n    callback.Password = options.Password;\n    #endif\n    callback.StdOutMode = uo.StdOutMode;\n    callback.Init(&stdStream);\n\n    CUpdateErrorInfo errorInfo;\n\n    if (!uo.Init(codecs, formatIndices, options.ArchiveName))\n      throw kUnsupportedArcTypeMessage;\n    HRESULT result = UpdateArchive(codecs,\n        options.WildcardCensor, uo,\n        errorInfo, &openCallback, &callback);\n\n#ifdef ENV_UNIX\n    if (uo.SfxMode)\n    {\n        void myAddExeFlag(const UString &name);\n        for(int i = 0; i < uo.Commands.Size(); i++)\n        {\n            CUpdateArchiveCommand &command = uo.Commands[i];\n            if (!uo.StdOutMode)\n            {\n                myAddExeFlag(command.ArchivePath.GetFinalPath());\n            }\n        }\n    }\n#endif\n\n    int exitCode = NExitCode::kSuccess;\n    if (callback.CantFindFiles.Size() > 0)\n    {\n      stdStream << endl;\n      stdStream << \"WARNINGS for files:\" << endl << endl;\n      int numErrors = callback.CantFindFiles.Size();\n      for (int i = 0; i < numErrors; i++)\n      {\n        stdStream << callback.CantFindFiles[i] << \" : \";\n        stdStream << NError::MyFormatMessageW(callback.CantFindCodes[i]) << endl;\n      }\n      stdStream << \"----------------\" << endl;\n      stdStream << \"WARNING: Cannot find \" << numErrors << \" file\";\n      if (numErrors > 1)\n        stdStream << \"s\";\n      stdStream << endl;\n      exitCode = NExitCode::kWarning;\n    }\n\n    if (result != S_OK)\n    {\n      UString message;\n      if (!errorInfo.Message.IsEmpty())\n      {\n        message += errorInfo.Message;\n        message += L\"\\n\";\n      }\n      if (!errorInfo.FileName.IsEmpty())\n      {\n        message += errorInfo.FileName;\n        message += L\"\\n\";\n      }\n      if (!errorInfo.FileName2.IsEmpty())\n      {\n        message += errorInfo.FileName2;\n        message += L\"\\n\";\n      }\n      if (errorInfo.SystemError != 0)\n      {\n        message += NError::MyFormatMessageW(errorInfo.SystemError);\n        message += L\"\\n\";\n      }\n      if (!message.IsEmpty())\n        stdStream << L\"\\nError:\\n\" << message;\n      throw CSystemException(result);\n    }\n    int numErrors = callback.FailedFiles.Size();\n    if (numErrors == 0)\n    {\n      if (callback.CantFindFiles.Size() == 0)\n        stdStream << kEverythingIsOk << endl;\n    }\n    else\n    {\n      stdStream << endl;\n      stdStream << \"WARNINGS for files:\" << endl << endl;\n      for (int i = 0; i < numErrors; i++)\n      {\n        stdStream << callback.FailedFiles[i] << \" : \";\n        stdStream << NError::MyFormatMessageW(callback.FailedCodes[i]) << endl;\n      }\n      stdStream << \"----------------\" << endl;\n      stdStream << \"WARNING: Cannot open \" << numErrors << \" file\";\n      if (numErrors > 1)\n        stdStream << \"s\";\n      stdStream << endl;\n      exitCode = NExitCode::kWarning;\n    }\n    return exitCode;\n  }\n  else\n    PrintHelpAndExit(stdStream);\n  return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/MainAr.cpp",
    "content": "// MainAr.cpp\n\n#include \"StdAfx.h\"\n\n// #include <locale.h>\n\n#include \"Windows/Error.h\"\n\n#include \"Common/StdOutStream.h\"\n#include \"Common/NewHandler.h\"\n#include \"Common/MyException.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"../Common/ExitCode.h\"\n#include \"../Common/ArchiveCommandLine.h\"\n#include \"ConsoleClose.h\"\n\nusing namespace NWindows;\n\nCStdOutStream *g_StdStream = 0;\n\n#ifdef _WIN32\n#ifndef _UNICODE\nbool g_IsNT = false;\n#endif\n#if !defined(_UNICODE) || !defined(_WIN64)\nstatic inline bool IsItWindowsNT()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo))\n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);\n}\n#endif\n#endif\n\nextern int Main2(\n  #ifndef _WIN32\n  int numArguments, const char *arguments[]\n  #endif\n);\n\nstatic const char *kExceptionErrorMessage = \"\\n\\nError:\\n\";\nstatic const char *kUserBreak  = \"\\nBreak signaled\\n\";\n\nstatic const char *kMemoryExceptionMessage = \"\\n\\nERROR: Can't allocate required memory!\\n\";\nstatic const char *kUnknownExceptionMessage = \"\\n\\nUnknown Error\\n\";\nstatic const char *kInternalExceptionMessage = \"\\n\\nInternal Error #\";\n\nint MY_CDECL main\n(\n#ifndef _WIN32\nint numArguments, const char *arguments[]\n#endif\n)\n{\n  g_StdStream = &g_StdOut;\n  #ifdef _WIN32\n  \n  #ifdef _UNICODE\n  #ifndef _WIN64\n  if (!IsItWindowsNT())\n  {\n    (*g_StdStream) << \"This program requires Windows NT/2000/2003/2008/XP/Vista\";\n    return NExitCode::kFatalError;\n  }\n  #endif\n  #else\n  g_IsNT = IsItWindowsNT();\n  #endif\n  \n  #endif\n\n  // setlocale(LC_COLLATE, \".OCP\");\n  NConsoleClose::CCtrlHandlerSetter ctrlHandlerSetter;\n  int res = 0;\n  try\n  {\n    res = Main2(\n#ifndef _WIN32\n      numArguments, arguments\n#endif\n    );\n  }\n  catch(const CNewException &)\n  {\n    (*g_StdStream) << kMemoryExceptionMessage;\n    return (NExitCode::kMemoryError);\n  }\n  catch(const NConsoleClose::CCtrlBreakException &)\n  {\n    (*g_StdStream) << endl << kUserBreak;\n    return (NExitCode::kUserBreak);\n  }\n  catch(const CArchiveCommandLineException &e)\n  {\n    (*g_StdStream) << kExceptionErrorMessage << e << endl;\n    return (NExitCode::kUserError);\n  }\n  catch(const CSystemException &systemError)\n  {\n    if (systemError.ErrorCode == E_OUTOFMEMORY)\n    {\n      (*g_StdStream) << kMemoryExceptionMessage;\n      return (NExitCode::kMemoryError);\n    }\n    if (systemError.ErrorCode == E_ABORT)\n    {\n      (*g_StdStream) << endl << kUserBreak;\n      return (NExitCode::kUserBreak);\n    }\n    UString message;\n    NError::MyFormatMessage(systemError.ErrorCode, message);\n    (*g_StdStream) << endl << endl << \"System error:\" << endl <<\n        message << endl;\n    return (NExitCode::kFatalError);\n  }\n  catch(NExitCode::EEnum &exitCode)\n  {\n    (*g_StdStream) << kInternalExceptionMessage << exitCode << endl;\n    return (exitCode);\n  }\n  /*\n  catch(const NExitCode::CMultipleErrors &multipleErrors)\n  {\n    (*g_StdStream) << endl << multipleErrors.NumErrors << \" errors\" << endl;\n    return (NExitCode::kFatalError);\n  }\n  */\n  catch(const UString &s)\n  {\n    (*g_StdStream) << kExceptionErrorMessage << s << endl;\n    return (NExitCode::kFatalError);\n  }\n  catch(const AString &s)\n  {\n    (*g_StdStream) << kExceptionErrorMessage << s << endl;\n    return (NExitCode::kFatalError);\n  }\n  catch(const char *s)\n  {\n    (*g_StdStream) << kExceptionErrorMessage << s << endl;\n    return (NExitCode::kFatalError);\n  }\n  catch(int t)\n  {\n    (*g_StdStream) << kInternalExceptionMessage << t << endl;\n    return (NExitCode::kFatalError);\n  }\n  catch(...)\n  {\n    (*g_StdStream) << kUnknownExceptionMessage;\n    return (NExitCode::kFatalError);\n  }\n  return  res;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/OpenCallbackConsole.cpp",
    "content": "// OpenCallbackConsole.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OpenCallbackConsole.h\"\n\n#include \"ConsoleClose.h\"\n#include \"UserInputUtils.h\"\n\nHRESULT COpenCallbackConsole::Open_CheckBreak()\n{\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  return S_OK;\n}\n\nHRESULT COpenCallbackConsole::Open_SetTotal(const UInt64 *, const UInt64 *)\n{\n  return Open_CheckBreak();\n}\n\nHRESULT COpenCallbackConsole::Open_SetCompleted(const UInt64 *, const UInt64 *)\n{\n  return Open_CheckBreak();\n}\n \n#ifndef _NO_CRYPTO\n\nHRESULT COpenCallbackConsole::Open_CryptoGetTextPassword(BSTR *password)\n{\n  PasswordWasAsked = true;\n  RINOK(Open_CheckBreak());\n  if (!PasswordIsDefined)\n  {\n    Password = GetPassword(OutStream);\n    PasswordIsDefined = true;\n  }\n  return StringToBstr(Password, password);\n}\n\nHRESULT COpenCallbackConsole::Open_GetPasswordIfAny(UString &password)\n{\n  if (PasswordIsDefined)\n    password = Password;\n  return S_OK;\n}\n\nbool COpenCallbackConsole::Open_WasPasswordAsked()\n{\n  return PasswordWasAsked;\n}\n\nvoid COpenCallbackConsole::Open_ClearPasswordWasAskedFlag()\n{\n  PasswordWasAsked = false;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/OpenCallbackConsole.h",
    "content": "// OpenCallbackConsole.h\n\n#ifndef __OPENCALLBACKCONSOLE_H\n#define __OPENCALLBACKCONSOLE_H\n\n#include \"Common/StdOutStream.h\"\n#include \"../Common/ArchiveOpenCallback.h\"\n\nclass COpenCallbackConsole: public IOpenCallbackUI\n{\npublic:\n  INTERFACE_IOpenCallbackUI(;)\n  \n  CStdOutStream *OutStream;\n\n  #ifndef _NO_CRYPTO\n  bool PasswordIsDefined;\n  bool PasswordWasAsked;\n  UString Password;\n  COpenCallbackConsole(): PasswordIsDefined(false), PasswordWasAsked(false) {}\n  #endif\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/PercentPrinter.cpp",
    "content": "// PercentPrinter.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/MyString.h\"\n\n#include \"PercentPrinter.h\"\n\nconst int kPaddingSize = 2;\nconst int kPercentsSize = 4;\nconst int kMaxExtraSize = kPaddingSize + 32 + kPercentsSize;\n\nstatic void ClearPrev(char *p, int num)\n{\n  int i;\n  for (i = 0; i < num; i++) *p++ = '\\b';\n  for (i = 0; i < num; i++) *p++ = ' ';\n  for (i = 0; i < num; i++) *p++ = '\\b';\n  *p = '\\0';\n}\n\nvoid CPercentPrinter::ClosePrint()\n{\n  if (m_NumExtraChars == 0)\n    return;\n  char s[kMaxExtraSize * 3 + 1];\n  ClearPrev(s, m_NumExtraChars);\n  (*OutStream) << s;\n  m_NumExtraChars = 0;\n}\n\nvoid CPercentPrinter::PrintString(const char *s)\n{\n  ClosePrint();\n  (*OutStream) << s;\n}\n\nvoid CPercentPrinter::PrintString(const wchar_t *s)\n{\n  ClosePrint();\n  (*OutStream) << s;\n}\n\nvoid CPercentPrinter::PrintNewLine()\n{\n  ClosePrint();\n  (*OutStream) << \"\\n\";\n}\n\nvoid CPercentPrinter::RePrintRatio()\n{\n  char s[32];\n  ConvertUInt64ToString(((m_Total == 0) ? 0 : (m_CurValue * 100 / m_Total)), s);\n  int size = (int)strlen(s);\n  s[size++] = '%';\n  s[size] = '\\0';\n\n  int extraSize = kPaddingSize + MyMax(size, kPercentsSize);\n  if (extraSize < m_NumExtraChars)\n    extraSize = m_NumExtraChars;\n\n  char fullString[kMaxExtraSize * 3];\n  char *p = fullString;\n  int i;\n  if (m_NumExtraChars == 0)\n  {\n    for (i = 0; i < extraSize; i++)\n      *p++ = ' ';\n    m_NumExtraChars = extraSize;\n  }\n\n  for (i = 0; i < m_NumExtraChars; i++)\n    *p++ = '\\b';\n  m_NumExtraChars = extraSize;\n  for (; size < m_NumExtraChars; size++)\n    *p++ = ' ';\n  MyStringCopy(p, s);\n  (*OutStream) << fullString;\n  OutStream->Flush();\n  m_PrevValue = m_CurValue;\n}\n\nvoid CPercentPrinter::PrintRatio()\n{\n  if (m_CurValue < m_PrevValue + m_MinStepSize &&\n      m_CurValue + m_MinStepSize > m_PrevValue && m_NumExtraChars != 0)\n    return;\n  RePrintRatio();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/PercentPrinter.h",
    "content": "// PercentPrinter.h\n\n#ifndef __PERCENTPRINTER_H\n#define __PERCENTPRINTER_H\n\n#include \"Common/Types.h\"\n#include \"Common/StdOutStream.h\"\n\nclass CPercentPrinter\n{\n  UInt64 m_MinStepSize;\n  UInt64 m_PrevValue;\n  UInt64 m_CurValue;\n  UInt64 m_Total;\n  int m_NumExtraChars;\npublic:\n  CStdOutStream *OutStream;\n\n  CPercentPrinter(UInt64 minStepSize = 1): m_MinStepSize(minStepSize),\n      m_PrevValue(0), m_CurValue(0), m_Total(1), m_NumExtraChars(0) {}\n  void SetTotal(UInt64 total) { m_Total = total; m_PrevValue = 0; }\n  void SetRatio(UInt64 doneValue) { m_CurValue = doneValue; }\n  void PrintString(const char *s);\n  void PrintString(const wchar_t *s);\n  void PrintNewLine();\n  void ClosePrint();\n  void RePrintRatio();\n  void PrintRatio();\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp",
    "content": "// UpdateCallbackConsole.cpp\n\n#include \"StdAfx.h\"\n\n#include \"UpdateCallbackConsole.h\"\n\n#include \"Windows/Error.h\"\n#ifdef COMPRESS_MT\n#include \"Windows/Synchronization.h\"\n#endif\n\n#include \"ConsoleClose.h\"\n#include \"UserInputUtils.h\"\n\nusing namespace NWindows;\n\n#ifdef COMPRESS_MT\nstatic NSynchronization::CCriticalSection g_CriticalSection;\n#define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n#else\n#define MT_LOCK\n#endif\n\nstatic const wchar_t *kEmptyFileAlias = L\"[Content]\";\n\nstatic const char *kCreatingArchiveMessage = \"Creating archive \";\nstatic const char *kUpdatingArchiveMessage = \"Updating archive \";\nstatic const char *kScanningMessage = \"Scanning\";\n\n\nHRESULT CUpdateCallbackConsole::OpenResult(const wchar_t *name, HRESULT result)\n{\n  (*OutStream) << endl;\n  if (result != S_OK)\n    (*OutStream) << \"Error: \" << name << \" is not supported archive\" << endl;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::StartScanning()\n{\n  (*OutStream) << kScanningMessage;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::ScanProgress(UInt64 /* numFolders */, UInt64 /* numFiles */, const wchar_t * /* path */)\n{\n  return CheckBreak();\n}\n\nHRESULT CUpdateCallbackConsole::CanNotFindError(const wchar_t *name, DWORD systemError)\n{\n  CantFindFiles.Add(name);\n  CantFindCodes.Add(systemError);\n  // m_PercentPrinter.ClosePrint();\n  if (!m_WarningsMode)\n  {\n    (*OutStream) << endl << endl;\n    m_PercentPrinter.PrintNewLine();\n    m_WarningsMode = true;\n  }\n  m_PercentPrinter.PrintString(name);\n  m_PercentPrinter.PrintString(\":  WARNING: \");\n  m_PercentPrinter.PrintString(NError::MyFormatMessageW(systemError));\n  m_PercentPrinter.PrintNewLine();\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::FinishScanning()\n{\n  (*OutStream) << endl << endl;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::StartArchive(const wchar_t *name, bool updating)\n{\n  if(updating)\n    (*OutStream) << kUpdatingArchiveMessage;\n  else\n    (*OutStream) << kCreatingArchiveMessage;\n  if (name != 0)\n    (*OutStream) << name;\n  else\n    (*OutStream) << \"StdOut\";\n  (*OutStream) << endl << endl;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::FinishArchive()\n{\n  (*OutStream) << endl;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::CheckBreak()\n{\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::Finilize()\n{\n  MT_LOCK\n  if (m_NeedBeClosed)\n  {\n    if (EnablePercents)\n    {\n      m_PercentPrinter.ClosePrint();\n    }\n    if (!StdOutMode && m_NeedNewLine)\n    {\n      m_PercentPrinter.PrintNewLine();\n      m_NeedNewLine = false;\n    }\n    m_NeedBeClosed = false;\n  }\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::SetNumFiles(UInt64 /* numFiles */)\n{\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::SetTotal(UInt64 size)\n{\n  MT_LOCK\n  if (EnablePercents)\n    m_PercentPrinter.SetTotal(size);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::SetCompleted(const UInt64 *completeValue)\n{\n  MT_LOCK\n  if (completeValue != NULL)\n  {\n    if (EnablePercents)\n    {\n      m_PercentPrinter.SetRatio(*completeValue);\n      m_PercentPrinter.PrintRatio();\n      m_NeedBeClosed = true;\n    }\n  }\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::SetRatioInfo(const UInt64 * /* inSize */, const UInt64 * /* outSize */)\n{\n  if (NConsoleClose::TestBreakSignal())\n    return E_ABORT;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::GetStream(const wchar_t *name, bool isAnti)\n{\n  MT_LOCK\n  if (StdOutMode)\n    return S_OK;\n  if(isAnti)\n    m_PercentPrinter.PrintString(\"Anti item    \");\n  else\n    m_PercentPrinter.PrintString(\"Compressing  \");\n  if (name[0] == 0)\n    name = kEmptyFileAlias;\n  m_PercentPrinter.PrintString(name);\n  if (EnablePercents)\n    m_PercentPrinter.RePrintRatio();\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::OpenFileError(const wchar_t *name, DWORD systemError)\n{\n  MT_LOCK\n  FailedCodes.Add(systemError);\n  FailedFiles.Add(name);\n  // if (systemError == ERROR_SHARING_VIOLATION)\n  {\n    m_PercentPrinter.ClosePrint();\n    m_PercentPrinter.PrintNewLine();\n    m_PercentPrinter.PrintString(\"WARNING: \");\n    m_PercentPrinter.PrintString(NError::MyFormatMessageW(systemError));\n    return S_FALSE;\n  }\n  // return systemError;\n}\n\nHRESULT CUpdateCallbackConsole::SetOperationResult(Int32 )\n{\n  m_NeedBeClosed = true;\n  m_NeedNewLine = true;\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackConsole::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)\n{\n  #ifdef _NO_CRYPTO\n\n  *passwordIsDefined = false;\n  return StringToBstr(L\"\", password);\n  \n  #else\n  \n  if (!PasswordIsDefined)\n  {\n    if (AskPassword)\n    {\n      Password = GetPassword(OutStream,true);\n      PasswordIsDefined = true;\n    }\n  }\n  *passwordIsDefined = BoolToInt(PasswordIsDefined);\n  return StringToBstr(Password, password);\n  \n  #endif\n  \n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/UpdateCallbackConsole.h",
    "content": "// UpdateCallbackConsole.h\n\n#ifndef __UPDATECALLBACKCONSOLE_H\n#define __UPDATECALLBACKCONSOLE_H\n\n#include \"Common/MyString.h\"\n#include \"Common/StdOutStream.h\"\n#include \"PercentPrinter.h\"\n#include \"../Common/Update.h\"\n\nclass CUpdateCallbackConsole: public IUpdateCallbackUI2\n{\n  CPercentPrinter m_PercentPrinter;\n  bool m_NeedBeClosed;\n  bool m_NeedNewLine;\n\n  bool m_WarningsMode;\n\n  CStdOutStream *OutStream;\npublic:\n  bool EnablePercents;\n  bool StdOutMode;\n\n  #ifndef _NO_CRYPTO\n  bool PasswordIsDefined;\n  UString Password;\n  bool AskPassword;\n  #endif\n\n  CUpdateCallbackConsole():\n      m_PercentPrinter(1 << 16),\n      #ifndef _NO_CRYPTO\n      PasswordIsDefined(false),\n      AskPassword(false),\n      #endif\n      StdOutMode(false),\n      EnablePercents(true),\n      m_WarningsMode(false)\n      {}\n  \n  ~CUpdateCallbackConsole() { Finilize(); }\n  void Init(CStdOutStream *outStream)\n  {\n    m_NeedBeClosed = false;\n    m_NeedNewLine = false;\n    FailedFiles.Clear();\n    FailedCodes.Clear();\n    OutStream = outStream;\n    m_PercentPrinter.OutStream = outStream;\n  }\n\n  INTERFACE_IUpdateCallbackUI2(;)\n\n  UStringVector FailedFiles;\n  CRecordVector<HRESULT> FailedCodes;\n\n  UStringVector CantFindFiles;\n  CRecordVector<HRESULT> CantFindCodes;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/UserInputUtils.cpp",
    "content": "// UserInputUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StdInStream.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"UserInputUtils.h\"\n\n#ifdef USE_FLTK\n// the programs like file-roller or xarchiver do not support archives with password\n// these programs freeze because p7zip is waiting for a password\n// defining USE_FLTK allows p7zip to use a popup in order to ask the password.\n#include <FL/Fl.H>\n#include <FL/Fl_Window.H>\n#include <FL/fl_ask.H>\n#else\n#ifdef HAVE_GETPASS\n#include <pwd.h>\n#include <unistd.h>\n#include \"Common/MyException.h\"\n#endif\n#endif\n\nstatic const char kYes = 'Y';\nstatic const char kNo = 'N';\nstatic const char kYesAll = 'A';\nstatic const char kNoAll = 'S';\nstatic const char kAutoRenameAll = 'U';\nstatic const char kQuit = 'Q';\n\nstatic const char *kFirstQuestionMessage = \"?\\n\";\nstatic const char *kHelpQuestionMessage =\n  \"(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? \";\n\n// return true if pressed Quite;\n\nNUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream)\n{\n  (*outStream) << kFirstQuestionMessage;\n  for(;;)\n  {\n    (*outStream) << kHelpQuestionMessage;\n    AString scannedString = g_StdIn.ScanStringUntilNewLine();\n    scannedString.Trim();\n    if(!scannedString.IsEmpty())\n      switch(::MyCharUpper(scannedString[0]))\n      {\n        case kYes:\n          return NUserAnswerMode::kYes;\n        case kNo:\n          return NUserAnswerMode::kNo;\n        case kYesAll:\n          return NUserAnswerMode::kYesAll;\n        case kNoAll:\n          return NUserAnswerMode::kNoAll;\n        case kAutoRenameAll:\n          return NUserAnswerMode::kAutoRenameAll;\n        case kQuit:\n          return NUserAnswerMode::kQuit;\n      }\n  }\n}\n\nUString GetPassword(CStdOutStream *outStream,bool verify)\n{\n#ifdef USE_FLTK \n  const char *r = fl_password(\"Enter password\", 0);\n  AString oemPassword = \"\";\n  if (r) oemPassword = r;\n#else /* USE_FLTK */\n#ifdef HAVE_GETPASS\n  (*outStream) << \"\\nEnter password (will not be echoed) :\";\n  outStream->Flush();\n  AString oemPassword = getpass(\"\");\n  if (verify)\n  {\n    (*outStream) << \"Verify password (will not be echoed) :\";\n    outStream->Flush();\n    AString oemPassword2 = getpass(\"\");\n    if (oemPassword != oemPassword2) throw \"password verification failed\";\n  }\n#else\n  (*outStream) << \"\\nEnter password:\";\n  outStream->Flush();\n  AString oemPassword = g_StdIn.ScanStringUntilNewLine();\n#endif\n#endif /* USE_FLTK */\n  return MultiByteToUnicodeString(oemPassword, CP_OEMCP);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/UserInputUtils.h",
    "content": "// UserInputUtils.h\n\n#ifndef __USERINPUTUTILS_H\n#define __USERINPUTUTILS_H\n\n#include \"Common/StdOutStream.h\"\n\nnamespace NUserAnswerMode {\n\nenum EEnum\n{\n  kYes,\n  kNo,\n  kYesAll,\n  kNoAll,\n  kAutoRenameAll,\n  kQuit\n};\n}\n\nNUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream);\nUString GetPassword(CStdOutStream *outStream,bool verify = false);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/makefile",
    "content": "PROG=../../../../bin/7z\n\nLOCAL_FLAGS=\\\n  -DCOMPRESS_MT \\\n  -DEXTERNAL_LZMA \\\n  -DEXTERNAL_CODECS \\\n  -DBREAK_HANDLER \\\n  -DBENCH_MT\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLIBS=$(LOCAL_LIBS_DLL)\n\nCONSOLE_OBJS = \\\n  ConsoleClose.o \\\n  ExtractCallbackConsole.o \\\n  List.o \\\n  Main.o \\\n  MainAr.o \\\n  OpenCallbackConsole.o \\\n  PercentPrinter.o \\\n  UpdateCallbackConsole.o \\\n  UserInputUtils.o \\\n\n# NewHandler.o\nCOMMON_OBJS = \\\n  CommandLineParser.o \\\n  CRC.o \\\n  IntToString.o \\\n  ListFileUtils.o \\\n  StdInStream.o \\\n  StdOutStream.o \\\n  MyString.o \\\n  MyWindows.o \\\n  StringConvert.o \\\n  StringToInt.o \\\n  UTFConvert.o \\\n  MyVector.o \\\n  Wildcard.o \\\n\n# MemoryLock.o Registry.o\nWIN_OBJS = \\\n  DLL.o \\\n  Error.o \\\n  FileDir.o \\\n  FileFind.o \\\n  FileIO.o \\\n  FileName.o \\\n  PropVariant.o \\\n  PropVariantConversions.o \\\n  System.o \\\n  Time.o \\\n\n7ZIP_COMMON_OBJS = \\\n  FilePathAutoRename.o \\\n  FileStreams.o \\\n  ProgressUtils.o \\\n  StreamUtils.o \\\n\n# WorkDir.o\nUI_COMMON_OBJS = \\\n  ArchiveCommandLine.o \\\n  ArchiveExtractCallback.o \\\n  ArchiveOpenCallback.o \\\n  DefaultName.o \\\n  EnumDirItems.o \\\n  Extract.o \\\n  ExtractingFilePath.o \\\n  LoadCodecs.o \\\n  OpenArchive.o \\\n  PropIDUtils.o \\\n  SetProperties.o \\\n  SortUtils.o \\\n  TempFiles.o \\\n  Update.o \\\n  UpdateAction.o \\\n  UpdateCallback.o \\\n  UpdatePair.o \\\n  UpdateProduce.o \\\n\nLZMA_BENCH_OBJS = \\\n  LzmaBench.o \\\n  LzmaBenchCon.o \\\n\n# Alloc.o\nC_OBJS = \\\n  Threads.o \\\n\nOBJS = \\\n  mySplitCommandLine.o \\\n  myAddExeFlag.o \\\n  wine_date_and_time.o \\\n  $(CONSOLE_OBJS) \\\n  $(COMMON_OBJS) \\\n  $(WIN_OBJS) \\\n  $(7ZIP_COMMON_OBJS) \\\n  $(UI_COMMON_OBJS) \\\n  CopyCoder.o \\\n  $(LZMA_BENCH_OBJS) \\\n  $(C_OBJS) \\\n  $(OBJ_CRC32)\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/makefile.depend",
    "content": "myAddExeFlag.o: ../../../myWindows/myAddExeFlag.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../myWindows/myPrivate.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nmySplitCommandLine.o: ../../../myWindows/mySplitCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../myWindows/../Common/StringConvert.h \\\n  ../../../myWindows/../Common/MyWindows.h \\\n  ../../../myWindows/../Common/MyString.h \\\n  ../../../myWindows/../Common/MyVector.h \\\n  ../../../myWindows/../Common/Defs.h \\\n  ../../../myWindows/../Common/Types.h ../../../myWindows/myPrivate.h\nwine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nConsoleClose.o: ../../UI/Console/ConsoleClose.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/ConsoleClose.h\nExtractCallbackConsole.o: ../../UI/Console/ExtractCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Console/ExtractCallbackConsole.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Console/../../Common/../IStream.h \\\n  ../../UI/Console/../../Common/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Common/../../Common/MyWindows.h \\\n  ../../UI/Console/../../Common/../../Common/Types.h \\\n  ../../UI/Console/../../Common/../IDecl.h \\\n  ../../UI/Console/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../../../Common/Types.h ../../UI/Console/../../IDecl.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../../Archive/../IStream.h \\\n  ../../UI/Console/../../Archive/../IProgress.h \\\n  ../../UI/Console/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../../Archive/../IDecl.h \\\n  ../../UI/Console/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../UI/Console/../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/UserInputUtils.h ../../UI/Console/ConsoleClose.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Error.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Console/../../Common/FilePathAutoRename.h \\\n  ../../UI/Console/../Common/ExtractingFilePath.h\nList.o: ../../UI/Console/List.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Console/List.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../../IStream.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../../Windows/DLL.h \\\n  ../../UI/Console/../Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/MyCom.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/Error.h ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/PropIDUtils.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/OpenArchive.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyCom.h ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h\nMain.o: ../../UI/Console/Main.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyInitGuid.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyException.h \\\n  ../../../Common/MyWindows.h ../../../Common/IntToString.h \\\n  ../../../Common/ListFileUtils.h ../../../Common/StdInStream.h \\\n  ../../../Common/StdOutStream.h ../../../Common/StringConvert.h \\\n  ../../../Common/StringToInt.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../UI/Console/../../IPassword.h \\\n  ../../UI/Console/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../../../Common/MyWindows.h \\\n  ../../UI/Console/../../../Common/Types.h ../../UI/Console/../../IDecl.h \\\n  ../../UI/Console/../../ICoder.h ../../UI/Console/../../IStream.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../../../Windows/DLL.h \\\n  ../../UI/Console/../Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Console/../Common/Extract.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/../Common/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/ArchiveCommandLine.h \\\n  ../../../Common/CommandLineParser.h \\\n  ../../UI/Console/../Common/Extract.h \\\n  ../../UI/Console/../Common/Update.h \\\n  ../../UI/Console/../Common/ExitCode.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../../Compress/LZMA_Alone/LzmaBenchCon.h \\\n  ../../UI/Console/../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../UI/Console/../../Compress/LZMA_Alone/../../UI/Common/LoadCodecs.h \\\n  ../../UI/Console/List.h ../../UI/Console/OpenCallbackConsole.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Console/ExtractCallbackConsole.h \\\n  ../../UI/Console/../../Common/FileStreams.h \\\n  ../../UI/Console/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/UpdateCallbackConsole.h \\\n  ../../UI/Console/PercentPrinter.h ../../../Common/Types.h \\\n  ../../UI/Console/../../MyVersion.h ../../../myWindows/myPrivate.h \\\n  ../../../Windows/System.h ../../../Windows/../Common/Types.h\nMainAr.o: ../../UI/Console/MainAr.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h ../../../Common/NewHandler.h \\\n  ../../../Common/MyException.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/ExitCode.h \\\n  ../../UI/Console/../Common/ArchiveCommandLine.h \\\n  ../../../Common/Wildcard.h ../../../Common/CommandLineParser.h \\\n  ../../UI/Console/../Common/Extract.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/ArchiveExtractCallback.h \\\n  ../../UI/Console/../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h ../../UI/Console/../Common/../../IDecl.h \\\n  ../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/FileStreams.h \\\n  ../../UI/Console/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../Common/ProgressUtils.h \\\n  ../../UI/Console/../Common/../../Common/../ICoder.h \\\n  ../../UI/Console/../Common/../../Common/../IStream.h \\\n  ../../UI/Console/../Common/../../Common/../IProgress.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/ExtractMode.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/../../../Windows/DLL.h \\\n  ../../UI/Console/../Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/Update.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/LoadCodecs.h ../../UI/Console/ConsoleClose.h\nOpenCallbackConsole.o: ../../UI/Console/OpenCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Console/OpenCallbackConsole.h \\\n  ../../../Common/StdOutStream.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/ConsoleClose.h ../../UI/Console/UserInputUtils.h\nPercentPrinter.o: ../../UI/Console/PercentPrinter.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Console/PercentPrinter.h \\\n  ../../../Common/Types.h ../../../Common/StdOutStream.h\nUpdateCallbackConsole.o: ../../UI/Console/UpdateCallbackConsole.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Console/UpdateCallbackConsole.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StdOutStream.h ../../UI/Console/PercentPrinter.h \\\n  ../../../Common/Types.h ../../UI/Console/../Common/Update.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../UI/Console/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../../Archive/../IStream.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Console/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Console/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Console/../Common/../../Archive/../PropID.h \\\n  ../../UI/Console/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h \\\n  ../../UI/Console/../Common/../../IPassword.h \\\n  ../../UI/Console/../Common/../../../Common/MyUnknown.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../IDecl.h \\\n  ../../UI/Console/../Common/UpdateCallback.h \\\n  ../../UI/Console/../Common/../../ICoder.h \\\n  ../../UI/Console/../Common/../../IStream.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Console/../Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Console/../Common/../Common/UpdateAction.h \\\n  ../../UI/Console/../Common/../Common/UpdateProduce.h \\\n  ../../UI/Console/../Common/../Common/UpdatePair.h \\\n  ../../UI/Console/../Common/Property.h \\\n  ../../UI/Console/../Common/LoadCodecs.h \\\n  ../../UI/Console/../Common/../../../Common/Types.h \\\n  ../../UI/Console/../Common/../../../Common/MyCom.h \\\n  ../../UI/Console/../Common/../../../Common/MyString.h \\\n  ../../UI/Console/../Common/../../../Common/Buffer.h \\\n  ../../UI/Console/../Common/../../../Common/Defs.h \\\n  ../../UI/Console/../Common/../../../Windows/DLL.h \\\n  ../../UI/Console/../Common/../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../UI/Console/ConsoleClose.h ../../UI/Console/UserInputUtils.h\nUserInputUtils.o: ../../UI/Console/UserInputUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../UI/Console/UserInputUtils.h \\\n  ../../../Common/StdOutStream.h ../../../Common/MyException.h\nCommandLineParser.o: ../../../Common/CommandLineParser.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nCRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/../../C/7zCrc.h ../../../Common/../../C/Types.h\nIntToString.o: ../../../Common/IntToString.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h\nListFileUtils.o: ../../../Common/ListFileUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/MyWindows.h \\\n  ../../../Common/../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/ListFileUtils.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/UTFConvert.h\nStdInStream.o: ../../../Common/StdInStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdInStream.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nStdOutStream.o: ../../../Common/StdOutStream.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StdOutStream.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nStringToInt.o: ../../../Common/StringToInt.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringToInt.h\nUTFConvert.o: ../../../Common/UTFConvert.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nDLL.o: ../../../Windows/DLL.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../myWindows/myPrivate.h\nError.o: ../../../Windows/Error.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileName.o: ../../../Windows/FileName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantConversions.o: ../../../Windows/PropVariantConversions.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h\nSystem.o: ../../../Windows/System.cpp ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h\nTime.o: ../../../Windows/Time.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h\nFilePathAutoRename.o: ../../Common/FilePathAutoRename.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h\nFileStreams.o: ../../Common/FileStreams.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FileStreams.h ../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h\nProgressUtils.o: ../../Common/ProgressUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/ProgressUtils.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../IProgress.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nArchiveCommandLine.o: ../../UI/Common/ArchiveCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ListFileUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringToInt.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h \\\n  ../../UI/Common/ArchiveCommandLine.h ../../../Common/Wildcard.h \\\n  ../../../Common/CommandLineParser.h ../../UI/Common/Extract.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/Property.h ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../../Windows/DLL.h \\\n  ../../UI/Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/Update.h ../../UI/Common/UpdateAction.h \\\n  ../../UI/Common/UpdateCallback.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/SortUtils.h ../../UI/Common/EnumDirItems.h \\\n  ../../UI/Common/DirItem.h ../../../myWindows/myPrivate.h\nArchiveExtractCallback.o: ../../UI/Common/ArchiveExtractCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/ComTry.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../../UI/Common/../../Common/FilePathAutoRename.h \\\n  ../../UI/Common/../Common/ExtractingFilePath.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../../Windows/DLL.h \\\n  ../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Common/ArchiveOpenCallback.h\nArchiveOpenCallback.o: ../../UI/Common/ArchiveOpenCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h\nDefaultName.o: ../../UI/Common/DefaultName.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/DefaultName.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nEnumDirItems.o: ../../UI/Common/EnumDirItems.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyCom.h \\\n  ../../UI/Common/EnumDirItems.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h\nExtract.o: ../../UI/Common/Extract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/Extract.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/ArchiveExtractCallback.h \\\n  ../../UI/Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/ProgressUtils.h \\\n  ../../UI/Common/../../Common/../ICoder.h \\\n  ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../IProgress.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/ExtractMode.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/Property.h ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../Common/../../../Common/MyString.h \\\n  ../../UI/Common/../Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../Common/../../../Common/Defs.h \\\n  ../../UI/Common/../Common/../../ICoder.h \\\n  ../../UI/Common/../Common/../../../Windows/DLL.h \\\n  ../../UI/Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../UI/Common/OpenArchive.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/SetProperties.h\nExtractingFilePath.o: ../../UI/Common/ExtractingFilePath.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/ExtractingFilePath.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nLoadCodecs.o: ../../UI/Common/LoadCodecs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/LoadCodecs.h ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/MyVector.h \\\n  ../../UI/Common/../../../Common/Defs.h \\\n  ../../UI/Common/../../../Common/Buffer.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../../Windows/DLL.h \\\n  ../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/../../../Windows/PropVariant.h \\\n  ../../UI/Common/../../../Windows/../Common/MyWindows.h \\\n  ../../UI/Common/../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/RegisterArc.h \\\n  ../../UI/Common/../../Common/../Archive/IArchive.h \\\n  ../../UI/Common/../../../Windows/FileFind.h \\\n  ../../UI/Common/../../../Windows/FileName.h \\\n  ../../UI/Common/../../../Windows/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h\nOpenArchive.o: ../../UI/Common/OpenArchive.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/OpenArchive.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h ../../UI/Common/LoadCodecs.h \\\n  ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h ../../UI/Common/../../../Windows/DLL.h \\\n  ../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../UI/Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Common/StreamUtils.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../UI/Common/DefaultName.h\nPropIDUtils.o: ../../UI/Common/PropIDUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/PropIDUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariantConversions.h \\\n  ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../UI/Common/../../PropID.h\nSetProperties.o: ../../UI/Common/SetProperties.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/SetProperties.h \\\n  ../../UI/Common/Property.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Common/StringToInt.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h\nSortUtils.o: ../../UI/Common/SortUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/SortUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nTempFiles.o: ../../UI/Common/TempFiles.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/TempFiles.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h\nUpdate.o: ../../UI/Common/Update.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../UI/Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h ../../UI/Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/UpdateCallback.h ../../UI/Common/../../ICoder.h \\\n  ../../UI/Common/../../IStream.h ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../UI/Common/Property.h \\\n  ../../UI/Common/LoadCodecs.h ../../UI/Common/../../../Common/Types.h \\\n  ../../UI/Common/../../../Common/MyCom.h \\\n  ../../UI/Common/../../../Common/MyString.h \\\n  ../../UI/Common/../../../Common/Buffer.h \\\n  ../../UI/Common/../../../Common/Defs.h \\\n  ../../UI/Common/../../../Windows/DLL.h \\\n  ../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Windows/FileDir.h ../../../Windows/FileName.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/Time.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h \\\n  ../../UI/Common/../../Compress/CopyCoder.h \\\n  ../../UI/Common/../../Compress/../../Common/MyCom.h \\\n  ../../UI/Common/../../Compress/../ICoder.h \\\n  ../../UI/Common/../Common/DirItem.h \\\n  ../../UI/Common/../Common/EnumDirItems.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../UI/Common/../Common/OpenArchive.h \\\n  ../../UI/Common/../Common/LoadCodecs.h \\\n  ../../UI/Common/../Common/ArchiveOpenCallback.h \\\n  ../../UI/Common/EnumDirItems.h ../../UI/Common/SetProperties.h \\\n  ../../UI/Common/TempFiles.h\nUpdateAction.o: ../../UI/Common/UpdateAction.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateAction.h\nUpdateCallback.o: ../../UI/Common/UpdateCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateCallback.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../UI/Common/../../IPassword.h \\\n  ../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../UI/Common/../../../Common/MyWindows.h \\\n  ../../UI/Common/../../../Common/Types.h ../../UI/Common/../../IDecl.h \\\n  ../../UI/Common/../../ICoder.h ../../UI/Common/../../IStream.h \\\n  ../../UI/Common/../Common/UpdatePair.h \\\n  ../../UI/Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../Common/../../Archive/../PropID.h \\\n  ../../UI/Common/../Common/UpdateAction.h \\\n  ../../UI/Common/../Common/UpdateProduce.h \\\n  ../../UI/Common/../Common/UpdatePair.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../UI/Common/../../Common/FileStreams.h \\\n  ../../UI/Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../UI/Common/../../Common/../IStream.h \\\n  ../../UI/Common/../../Common/../../Common/MyCom.h\nUpdatePair.o: ../../UI/Common/UpdatePair.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Time.h ../../../Common/Types.h \\\n  ../../UI/Common/UpdatePair.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h ../../UI/Common/SortUtils.h\nUpdateProduce.o: ../../UI/Common/UpdateProduce.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../UI/Common/UpdateProduce.h \\\n  ../../UI/Common/UpdatePair.h ../../UI/Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../UI/Common/../../Archive/IArchive.h \\\n  ../../UI/Common/../../Archive/../IStream.h \\\n  ../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../UI/Common/../../Archive/../../Common/MyWindows.h \\\n  ../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../UI/Common/../../Archive/../IDecl.h \\\n  ../../UI/Common/../../Archive/../IProgress.h \\\n  ../../UI/Common/../../Archive/../PropID.h \\\n  ../../UI/Common/UpdateAction.h\nLzmaBench.o: ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/LoadCodecs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyVector.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Defs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Buffer.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../ICoder.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/DLL.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/IArchive.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IProgress.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../PropID.h \\\n  ../../Compress/LZMA_Alone/../../../../C/7zCrc.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Alloc.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Defs.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Threads.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization2.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Thread.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/PropVariant.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../ICoder.h\nLzmaBenchCon.o: ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/LoadCodecs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyVector.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Defs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Buffer.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../ICoder.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/DLL.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/IArchive.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IProgress.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../PropID.h \\\n  ../../Compress/LZMA_Alone/LzmaBenchCon.h \\\n  ../../Compress/LZMA_Alone/../../../Common/IntToString.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/System.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Console/ConsoleClose.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Console/makefile.list",
    "content": "SRCS=\\\n ../../../myWindows/myAddExeFlag.cpp \\\n ../../../myWindows/mySplitCommandLine.cpp \\\n ../../../myWindows/wine_date_and_time.cpp \\\n \\\n ../../UI/Console/ConsoleClose.cpp \\\n ../../UI/Console/ExtractCallbackConsole.cpp \\\n ../../UI/Console/List.cpp \\\n ../../UI/Console/Main.cpp \\\n ../../UI/Console/MainAr.cpp \\\n ../../UI/Console/OpenCallbackConsole.cpp \\\n ../../UI/Console/PercentPrinter.cpp \\\n ../../UI/Console/UpdateCallbackConsole.cpp \\\n ../../UI/Console/UserInputUtils.cpp \\\n \\\n ../../../Common/CommandLineParser.cpp \\\n ../../../Common/CRC.cpp \\\n ../../../Common/IntToString.cpp \\\n ../../../Common/ListFileUtils.cpp \\\n ../../../Common/StdInStream.cpp \\\n ../../../Common/StdOutStream.cpp \\\n ../../../Common/MyString.cpp \\\n ../../../Common/MyWindows.cpp \\\n ../../../Common/StringConvert.cpp \\\n ../../../Common/StringToInt.cpp \\\n ../../../Common/UTFConvert.cpp \\\n ../../../Common/MyVector.cpp \\\n ../../../Common/Wildcard.cpp \\\n \\\n ../../../Windows/DLL.cpp \\\n ../../../Windows/Error.cpp \\\n ../../../Windows/FileDir.cpp \\\n ../../../Windows/FileFind.cpp \\\n ../../../Windows/FileIO.cpp \\\n ../../../Windows/FileName.cpp \\\n ../../../Windows/PropVariant.cpp \\\n ../../../Windows/PropVariantConversions.cpp \\\n ../../../Windows/System.cpp \\\n ../../../Windows/Time.cpp \\\n \\\n ../../Common/FilePathAutoRename.cpp \\\n ../../Common/FileStreams.cpp \\\n ../../Common/ProgressUtils.cpp \\\n ../../Common/StreamUtils.cpp \\\n \\\n ../../UI/Common/ArchiveCommandLine.cpp \\\n ../../UI/Common/ArchiveExtractCallback.cpp \\\n ../../UI/Common/ArchiveOpenCallback.cpp \\\n ../../UI/Common/DefaultName.cpp \\\n ../../UI/Common/EnumDirItems.cpp \\\n ../../UI/Common/Extract.cpp \\\n ../../UI/Common/ExtractingFilePath.cpp \\\n ../../UI/Common/LoadCodecs.cpp \\\n ../../UI/Common/OpenArchive.cpp \\\n ../../UI/Common/PropIDUtils.cpp \\\n ../../UI/Common/SetProperties.cpp \\\n ../../UI/Common/SortUtils.cpp \\\n ../../UI/Common/TempFiles.cpp \\\n ../../UI/Common/Update.cpp \\\n ../../UI/Common/UpdateAction.cpp \\\n ../../UI/Common/UpdateCallback.cpp \\\n ../../UI/Common/UpdatePair.cpp \\\n ../../UI/Common/UpdateProduce.cpp \\\n \\\n ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n ../../Compress/LZMA_Alone/LzmaBenchCon.cpp \\\n\n\n\nSRCS_C=\\\n ../../../../C/Threads.c \\\n\ninclude ../../../../makefile.rules\n\nMain.o : ../../UI/Console/Main.cpp\n\t$(CXX) $(CXXFLAGS) ../../UI/Console/Main.cpp\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Explorer/MyMessages.cpp",
    "content": "// MyMessages.cpp\n\n#include \"StdAfx.h\"\n\n#include \"MyMessages.h\"\n\n#include \"Windows/Error.h\"\n#include \"Windows/ResourceString.h\"\n\n#ifdef LANG\n#include \"../FileManager/LangUtils.h\"\n#endif\n\nusing namespace NWindows;\n\nvoid ShowErrorMessage(HWND window, LPCWSTR message)\n{\n  ::MessageBoxW(window, message, L\"7-Zip\", MB_OK | MB_ICONSTOP);\n}\n\nvoid ShowErrorMessageHwndRes(HWND window, UINT resID\n    #ifdef LANG\n    , UInt32 langID\n    #endif\n    )\n{\n  ShowErrorMessage(window,\n  #ifdef LANG\n  LangString(resID, langID)\n  #else\n  MyLoadStringW(resID)\n  #endif\n  );\n}\n\nvoid ShowErrorMessageRes(UINT resID\n    #ifdef LANG\n    , UInt32 langID\n    #endif\n    )\n{\n  ShowErrorMessageHwndRes(0, resID\n  #ifdef LANG\n  , langID\n  #endif\n  );\n}\n\nvoid ShowErrorMessageDWORD(HWND window, DWORD errorCode)\n{\n  ShowErrorMessage(window, NError::MyFormatMessageW(errorCode));\n}\n\nvoid ShowLastErrorMessage(HWND window)\n{\n  ShowErrorMessageDWORD(window, ::GetLastError());\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/Explorer/MyMessages.h",
    "content": "// MyMessages.h\n\n#ifndef __MYMESSAGES_H\n#define __MYMESSAGES_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Types.h\"\n\nvoid ShowErrorMessage(HWND window, LPCWSTR message);\ninline void ShowErrorMessage(LPCWSTR message) { ShowErrorMessage(0, message); }\n\nvoid ShowErrorMessageHwndRes(HWND window, UINT resID\n    #ifdef LANG\n    , UInt32 langID\n    #endif\n    );\n\nvoid ShowErrorMessageRes(UINT resID\n    #ifdef LANG\n    , UInt32 langID\n    #endif\n    );\n\n// void ShowErrorMessageDWORD(HWND window, DWORD errorCode);\n// inline void ErrorMessageDWORD(DWORD errorCode) { ShowErrorMessageDWORD(0, errorCode); }\nvoid ShowLastErrorMessage(HWND window = 0);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/App.cpp",
    "content": "// App.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n#include \"OverwriteDialogRes.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/COM.h\"\n#include \"Windows/Error.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n#include \"Windows/Thread.h\"\n\n#include \"App.h\"\n#include \"CopyDialog.h\"\n#include \"ExtractCallback.h\"\n#include \"FormatUtils.h\"\n#include \"IFolder.h\"\n#include \"LangUtils.h\"\n#include \"RegistryUtils.h\"\n#include \"ViewSettings.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NFind;\n\nextern DWORD g_ComCtl32Version;\nextern HINSTANCE g_hInstance;\n\nstatic LPCWSTR kTempDirPrefix = L\"7zE\";\n\nvoid CPanelCallbackImp::OnTab()\n{\n  if (g_App.NumPanels != 1)\n    _app->Panels[1 - _index].SetFocusToList();\n  _app->RefreshTitle();\n}\n\nvoid CPanelCallbackImp::SetFocusToPath(int index)\n{\n  int newPanelIndex = index;\n  if (g_App.NumPanels == 1)\n    newPanelIndex = g_App.LastFocusedPanel;\n  // FIXME _app->Panels[newPanelIndex]._headerComboBox.SetFocus();\n  _app->RefreshTitle();\n}\n\n\nvoid CPanelCallbackImp::OnCopy(bool move, bool copyToSame) { _app->OnCopy(move, copyToSame, _index); }\nvoid CPanelCallbackImp::OnSetSameFolder() { _app->OnSetSameFolder(_index); }\nvoid CPanelCallbackImp::OnSetSubFolder()  { _app->OnSetSubFolder(_index); }\nvoid CPanelCallbackImp::PanelWasFocused() { _app->SetFocusedPanel(_index); _app->RefreshTitle(_index); }\nvoid CPanelCallbackImp::DragBegin() { /* FIXME _app->DragBegin(_index);*/ }\nvoid CPanelCallbackImp::DragEnd() { /* FIXME _app->DragEnd();*/ }\nvoid CPanelCallbackImp::RefreshTitle(bool always) { _app->RefreshTitle(_index, always); }\n\nvoid CApp::SetListSettings()\n{\n  bool showDots = ReadShowDots();\n  bool showRealFileIcons = ReadShowRealFileIcons();\n\n  DWORD extendedStyle =0; /* FIXME = LVS_EX_HEADERDRAGDROP;\n  if (ReadFullRow())\n    extendedStyle |= LVS_EX_FULLROWSELECT;\n  if (ReadShowGrid())\n    extendedStyle |= LVS_EX_GRIDLINES;\n    */\n  bool mySelectionMode = ReadAlternativeSelection();\n  \n  /*\n  if (ReadSingleClick())\n  {\n    extendedStyle |= LVS_EX_ONECLICKACTIVATE\n      | LVS_EX_TRACKSELECT;\n    if (ReadUnderline())\n      extendedStyle |= LVS_EX_UNDERLINEHOT;\n  }\n  */\n\n  for (int i = 0; i < kNumPanelsMax; i++)\n  {\n    CPanel &panel = Panels[i];\n    panel._mySelectMode = mySelectionMode;\n    panel._showDots = showDots;\n    panel._showRealFileIcons = showRealFileIcons;\n    panel._exStyle = extendedStyle;\n\n    /* FIXME\n    DWORD style = (DWORD)panel._listView.GetStyle();\n    if (mySelectionMode)\n      style |= LVS_SINGLESEL;\n    else\n      style &= ~LVS_SINGLESEL;\n    panel._listView.SetStyle(style);\n    */\n    panel.SetExtendedStyle();\n  }\n}\n\nvoid CApp::SetShowSystemMenu()\n{\n  ShowSystemMenu = ReadShowSystemMenu();\n}\n\nvoid CApp::CreateOnePanel(int panelIndex, const UString &mainPath, bool &archiveIsOpened, bool &encrypted)\n{\n  if (PanelsCreated[panelIndex])\n    return;\n  m_PanelCallbackImp[panelIndex].Init(this, panelIndex);\n  UString path;\n  if (mainPath.IsEmpty())\n  {\n    if (!::ReadPanelPath(panelIndex, path))\n      path.Empty();\n  }\n  else\n    path = mainPath;\n  int id = 1000 + 100 * panelIndex;\n  Panels[panelIndex].Create(_window, _window,\n      id, path, &m_PanelCallbackImp[panelIndex], &AppState, archiveIsOpened, encrypted);\n  PanelsCreated[panelIndex] = true;\n}\n\n#if _WIN32\nstatic void CreateToolbar(\n    HWND parent,\n    NWindows::NControl::CImageList &imageList,\n    NWindows::NControl::CToolBar &toolBar,\n    bool LargeButtons)\n{\n  toolBar.Attach(::CreateWindowEx(0,\n      TOOLBARCLASSNAME,\n      NULL, 0\n      | WS_VISIBLE\n      | TBSTYLE_FLAT\n      | TBSTYLE_TOOLTIPS\n      | WS_CHILD\n      | CCS_NOPARENTALIGN\n      | CCS_NORESIZE\n      | CCS_NODIVIDER\n      // | TBSTYLE_AUTOSIZE\n      // | CCS_ADJUSTABLE\n      ,0,0,0,0, parent, NULL, g_hInstance, NULL));\n\n  // TB_BUTTONSTRUCTSIZE message, which is required for\n  // backward compatibility.\n  toolBar.ButtonStructSize();\n\n  imageList.Create(\n      LargeButtons ? 48: 24,\n      LargeButtons ? 36: 24,\n      ILC_MASK, 0, 0);\n  toolBar.SetImageList(0, imageList);\n}\n#endif\n\nstruct CButtonInfo\n{\n  UINT commandID;\n  UINT BitmapResID;\n  UINT Bitmap2ResID;\n  UINT StringResID;\n  UINT32 LangID;\n  UString GetText()const { return LangString(StringResID, LangID); };\n};\n\nstatic CButtonInfo g_StandardButtons[] =\n{\n  { IDM_COPY_TO, IDB_COPY, IDB_COPY2, IDS_BUTTON_COPY, 0x03020420},\n  { IDM_MOVE_TO, IDB_MOVE, IDB_MOVE2, IDS_BUTTON_MOVE, 0x03020421},\n  { IDM_DELETE, IDB_DELETE, IDB_DELETE2, IDS_BUTTON_DELETE, 0x03020422} ,\n  { IDM_FILE_PROPERTIES, IDB_INFO, IDB_INFO2, IDS_BUTTON_INFO, 0x03020423}\n};\n\nstatic CButtonInfo g_ArchiveButtons[] =\n{\n  { kAddCommand, IDB_ADD, IDB_ADD2, IDS_ADD, 0x03020400},\n  { kExtractCommand, IDB_EXTRACT, IDB_EXTRACT2, IDS_EXTRACT, 0x03020401},\n  { kTestCommand , IDB_TEST, IDB_TEST2, IDS_TEST, 0x03020402}\n};\n\nbool SetButtonText(UINT32 commandID, CButtonInfo *buttons, int numButtons, UString &s)\n{\n  for (int i = 0; i < numButtons; i++)\n  {\n    const CButtonInfo &b = buttons[i];\n    if (b.commandID == commandID)\n    {\n      s = b.GetText();\n      return true;\n    }\n  }\n  return false;\n}\n\nvoid SetButtonText(UINT32 commandID, UString &s)\n{\n  if (SetButtonText(commandID, g_StandardButtons,\n      sizeof(g_StandardButtons) / sizeof(g_StandardButtons[0]), s))\n    return;\n  SetButtonText(commandID, g_ArchiveButtons,\n      sizeof(g_ArchiveButtons) / sizeof(g_ArchiveButtons[0]), s);\n}\n\n#ifdef _WIN32\nstatic void AddButton(\n    NControl::CImageList &imageList,\n    NControl::CToolBar &toolBar,\n    CButtonInfo &butInfo,\n    bool showText,\n    bool large)\n{\n  TBBUTTON but;\n  but.iBitmap = 0;\n  but.idCommand = butInfo.commandID;\n  but.fsState = TBSTATE_ENABLED;\n  but.fsStyle = BTNS_BUTTON\n    // | BTNS_AUTOSIZE\n    ;\n  but.dwData = 0;\n\n  UString s = butInfo.GetText();\n  but.iString = 0;\n  if (showText)\n    but.iString = (INT_PTR)(LPCWSTR)s;\n\n  but.iBitmap = imageList.GetImageCount();\n  HBITMAP b = ::LoadBitmap(g_hInstance,\n      large ?\n      MAKEINTRESOURCE(butInfo.BitmapResID):\n      MAKEINTRESOURCE(butInfo.Bitmap2ResID));\n  if (b != 0)\n  {\n    imageList.AddMasked(b, RGB(255, 0, 255));\n    ::DeleteObject(b);\n  }\n  #ifdef _UNICODE\n  toolBar.AddButton(1, &but);\n  #else\n  toolBar.AddButtonW(1, &but);\n  #endif\n}\n\nstatic void AddBand(NControl::CReBar &reBar, NControl::CToolBar &toolBar)\n{\n  SIZE size;\n  toolBar.GetMaxSize(&size);\n\n  RECT rect;\n  toolBar.GetWindowRect(&rect);\n  \n  REBARBANDINFO rbBand;\n  rbBand.cbSize = sizeof(REBARBANDINFO);  // Required\n  rbBand.fMask  = RBBIM_STYLE\n    | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE;\n  rbBand.fStyle = RBBS_CHILDEDGE; // RBBS_NOGRIPPER;\n  rbBand.cxMinChild = size.cx; // rect.right - rect.left;\n  rbBand.cyMinChild = size.cy; // rect.bottom - rect.top;\n  rbBand.cyChild = rbBand.cyMinChild;\n  rbBand.cx = rbBand.cxMinChild;\n  rbBand.cxIdeal = rbBand.cxMinChild;\n  rbBand.hwndChild = toolBar;\n  reBar.InsertBand(-1, &rbBand);\n}\n\nvoid CApp::ReloadToolbars()\n{\n  if (!_rebar)\n    return;\n  HWND parent = _rebar;\n\n  while(_rebar.GetBandCount() > 0)\n    _rebar.DeleteBand(0);\n\n  _archiveToolBar.Destroy();\n  _archiveButtonsImageList.Destroy();\n\n  _standardButtonsImageList.Destroy();\n  _standardToolBar.Destroy();\n\n  if (ShowArchiveToolbar)\n  {\n    CreateToolbar(parent, _archiveButtonsImageList, _archiveToolBar, LargeButtons);\n    for (int i = 0; i < sizeof(g_ArchiveButtons) / sizeof(g_ArchiveButtons[0]); i++)\n      AddButton(_archiveButtonsImageList, _archiveToolBar, g_ArchiveButtons[i],\n          ShowButtonsLables, LargeButtons);\n    AddBand(_rebar, _archiveToolBar);\n  }\n\n  if (ShowStandardToolbar)\n  {\n    CreateToolbar(parent, _standardButtonsImageList, _standardToolBar, LargeButtons);\n    for (int i = 0; i < sizeof(g_StandardButtons) / sizeof(g_StandardButtons[0]); i++)\n      AddButton(_standardButtonsImageList, _standardToolBar, g_StandardButtons[i],\n          ShowButtonsLables, LargeButtons);\n    AddBand(_rebar, _standardToolBar);\n  }\n}\n#endif\n\nvoid CApp::ReloadRebar(HWND hwnd)\n{\n#ifdef _WIN32\n  _rebar.Destroy();\n  if (!ShowArchiveToolbar && !ShowStandardToolbar)\n    return;\n  if (g_ComCtl32Version >= MAKELONG(71, 4))\n  {\n    INITCOMMONCONTROLSEX icex;\n    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\n    icex.dwICC  = ICC_COOL_CLASSES | ICC_BAR_CLASSES;\n    InitCommonControlsEx(&icex);\n    \n    _rebar.Attach(::CreateWindowEx(WS_EX_TOOLWINDOW,\n      REBARCLASSNAME,\n      NULL,\n      WS_VISIBLE\n      | WS_BORDER\n      | WS_CHILD\n      | WS_CLIPCHILDREN\n      | WS_CLIPSIBLINGS\n      // | CCS_NODIVIDER\n      // | CCS_NOPARENTALIGN  // it's bead for moveing of two bands\n      // | CCS_TOP\n      | RBS_VARHEIGHT\n      | RBS_BANDBORDERS\n      // | RBS_AUTOSIZE\n      ,0,0,0,0, hwnd, NULL, g_hInstance, NULL));\n  }\n  if (_rebar == 0)\n    return;\n  REBARINFO rbi;\n  rbi.cbSize = sizeof(REBARINFO);  // Required when using this struct.\n  rbi.fMask = 0;\n  rbi.himl = (HIMAGELIST)NULL;\n  _rebar.SetBarInfo(&rbi);\n  ReloadToolbars();\n#endif // #ifdef _WIN32\n}\n\nvoid CApp::Create(HWND hwnd, const UString &mainPath, int xSizes[2], bool &archiveIsOpened, bool &encrypted)\n{\n#ifdef _WIN32\n  ReadToolbar();\n  ReloadRebar(hwnd);\n#endif\n\n  int i;\n  for (i = 0; i < kNumPanelsMax; i++)\n    PanelsCreated[i] = false;\n\n  _window.Attach(hwnd);\n  AppState.Read();\n  SetListSettings();\n  SetShowSystemMenu();\n  if (LastFocusedPanel >= kNumPanelsMax)\n    LastFocusedPanel = 0;\n\n  CListMode listMode;\n  ReadListMode(listMode);\n  for (i = 0; i < kNumPanelsMax; i++)\n  {\n    Panels[i]._ListViewMode = listMode.Panels[i];\n    Panels[i]._xSize = xSizes[i];\n  }\n  for (i = 0; i < kNumPanelsMax; i++)\n    if (NumPanels > 1 || i == LastFocusedPanel)\n    {\n      if (NumPanels == 1)\n        Panels[i]._xSize = xSizes[0] + xSizes[1];\n      bool archiveIsOpened2 = false;\n      bool encrypted2 = false;\n      bool mainPanel = (i == LastFocusedPanel);\n      CreateOnePanel(i, mainPanel ? mainPath : L\"\", archiveIsOpened2, encrypted2);\n      if (mainPanel)\n      {\n        archiveIsOpened = archiveIsOpened2;\n        encrypted = encrypted2;\n      }\n    }\n  SetFocusedPanel(LastFocusedPanel);\n  Panels[LastFocusedPanel].SetFocusToList();\n}\n\nextern void MoveSubWindows(HWND hWnd);\n\nvoid CApp::SwitchOnOffOnePanel()\n{\n  if (NumPanels == 1)\n  {\n    NumPanels++;\n    bool archiveIsOpened, encrypted;\n    CreateOnePanel(1 - LastFocusedPanel, UString(), archiveIsOpened, encrypted);\n    // FIXME Panels[1 - LastFocusedPanel].Enable(true);\n    // FIXME Panels[1 - LastFocusedPanel].Show(SW_SHOWNORMAL);\n  }\n  else\n  {\n    NumPanels--;\n    // FIXME Panels[1 - LastFocusedPanel].Enable(false);\n    // FIXME Panels[1 - LastFocusedPanel].Show(SW_HIDE);\n  }\n  MoveSubWindows(_window);\n}\n\nvoid CApp::Save()\n{\n  AppState.Save();\n  CListMode listMode;\n  for (int i = 0; i < kNumPanelsMax; i++)\n  {\n    const CPanel &panel = Panels[i];\n    UString path;\n    if (panel._parentFolders.IsEmpty())\n      path = panel._currentFolderPrefix;\n    else\n      path = GetFolderPath(panel._parentFolders[0].ParentFolder);\n    SavePanelPath(i, path);\n    listMode.Panels[i] = panel.GetListViewMode();\n  }\n  SaveListMode(listMode);\n}\n\nvoid CApp::Release()\n{\n  // It's for unloading COM dll's: don't change it.\n  for (int i = 0; i < kNumPanelsMax; i++)\n    Panels[i].Release();\n}\n\nstatic bool IsThereFolderOfPath(const UString &path)\n{\n  CFileInfoW fileInfo;\n  if (!FindFile(path, fileInfo))\n    return false;\n  return fileInfo.IsDir();\n}\n\n// reduces path to part that exists on disk\nstatic void ReducePathToRealFileSystemPath(UString &path)\n{\n  while(!path.IsEmpty())\n  {\n    if (IsThereFolderOfPath(path))\n    {\n      NName::NormalizeDirPathPrefix(path);\n      break;\n    }\n    int pos = path.ReverseFind(CHAR_PATH_SEPARATOR);\n    if (pos < 0)\n      path.Empty();\n    else\n    {\n      path = path.Left(pos + 1);\n      if (path.Length() == 3 && path[1] == L':')\n        break;\n      if (path.Length() > 2 && path[0] == CHAR_PATH_SEPARATOR && path[1] == CHAR_PATH_SEPARATOR)\n      {\n        int nextPos = path.Find(CHAR_PATH_SEPARATOR, 2); // pos after \\\\COMPNAME\n        if (nextPos > 0 && path.Find(CHAR_PATH_SEPARATOR, nextPos + 1) == pos)\n          break;\n      }\n      path = path.Left(pos);\n    }\n  }\n}\n\n// return true for dir\\, if dir exist\nstatic bool CheckFolderPath(const UString &path)\n{\n  UString pathReduced = path;\n  ReducePathToRealFileSystemPath(pathReduced);\n  return (pathReduced == path);\n}\n\nstatic bool IsPathAbsolute(const UString &path)\n{\n  if ((path.Length() >= 1 && path[0] == WCHAR_PATH_SEPARATOR) ||\n      (path.Length() >= 3 && path[1] == L':' && path[2] == WCHAR_PATH_SEPARATOR))\n    return true;\n  return false;\n}\n\nextern UString ConvertSizeToString(UInt64 value);\n\nstatic UString AddSizeValue(UInt64 size)\n{\n  return MyFormatNew(IDS_FILE_SIZE, 0x02000982, ConvertSizeToString(size));\n}\n\nstatic void AddValuePair1(UINT resourceID, UInt32 langID, UInt64 size, UString &s)\n{\n  s += LangString(resourceID, langID);\n  s += L\" \";\n  s += AddSizeValue(size);\n  s += L\"\\n\";\n}\n\nvoid AddValuePair2(UINT resourceID, UInt32 langID, UInt64 num, UInt64 size, UString &s)\n{\n  if (num == 0)\n    return;\n  s += LangString(resourceID, langID);\n  s += L\" \";\n  s += ConvertSizeToString(num);\n\n  if (size != (UInt64)(Int64)-1)\n  {\n    s += L\"    ( \";\n    s += AddSizeValue(size);\n    s += L\" )\";\n  }\n  s += L\"\\n\";\n}\n\nstatic void AddPropValueToSum(IFolderFolder *folder, int index, PROPID propID, UInt64 &sum)\n{\n  if (sum == (UInt64)(Int64)-1)\n    return;\n  NCOM::CPropVariant prop;\n  folder->GetProperty(index, propID, &prop);\n  switch(prop.vt)\n  {\n    case VT_UI4:\n    case VT_UI8:\n      sum += ConvertPropVariantToUInt64(prop);\n      break;\n    default:\n      sum = (UInt64)(Int64)-1;\n  }\n}\n\nUString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices)\n{\n  UString info;\n  UInt64 numDirs, numFiles, filesSize, foldersSize;\n  numDirs = numFiles = filesSize = foldersSize = 0;\n  int i;\n  for (i = 0; i < indices.Size(); i++)\n  {\n    int index = indices[i];\n    if (IsItemFolder(index))\n    {\n      AddPropValueToSum(_folder, index, kpidSize, foldersSize);\n      numDirs++;\n    }\n    else\n    {\n      AddPropValueToSum(_folder, index, kpidSize, filesSize);\n      numFiles++;\n    }\n  }\n\n  AddValuePair2(IDS_FOLDERS_COLON, 0x02000321, numDirs, foldersSize, info);\n  AddValuePair2(IDS_FILES_COLON, 0x02000320, numFiles, filesSize, info);\n  int numDefined = ((foldersSize != (UInt64)(Int64)-1) && foldersSize != 0) ? 1: 0;\n  numDefined += ((filesSize != (UInt64)(Int64)-1) && filesSize != 0) ? 1: 0;\n  if (numDefined == 2)\n    AddValuePair1(IDS_SIZE_COLON, 0x02000322, filesSize + foldersSize, info);\n  \n  info += L\"\\n\";\n  info += _currentFolderPrefix;\n  \n  for (i = 0; i < indices.Size() && i < kCopyDialog_NumInfoLines - 6; i++)\n  {\n    info += L\"\\n  \";\n    int index = indices[i];\n    info += GetItemRelPath(index);\n    if (IsItemFolder(index))\n      info += L'\\\\';\n  }\n  if (i != indices.Size())\n    info += L\"\\n  ...\";\n  return info;\n}\n\nvoid CApp::OnCopy(bool move, bool copyToSame, int srcPanelIndex)\n{\n  int destPanelIndex = (NumPanels <= 1) ? srcPanelIndex : (1 - srcPanelIndex);\n  CPanel &srcPanel = Panels[srcPanelIndex];\n  CPanel &destPanel = Panels[destPanelIndex];\n\n  CPanel::CDisableTimerProcessing disableTimerProcessing1(destPanel);\n  CPanel::CDisableTimerProcessing disableTimerProcessing2(srcPanel);\n\n  if (!srcPanel.DoesItSupportOperations())\n  {\n    srcPanel.MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));\n    return;\n  }\n\n  CRecordVector<UInt32> indices;\n  UString destPath;\n  bool useDestPanel = false;\n\n  {\n    if (copyToSame)\n    {\n      int focusedItem = srcPanel._listView.GetFocusedItem();\n      if (focusedItem < 0)\n        return;\n      int realIndex = srcPanel.GetRealItemIndex(focusedItem);\n      if (realIndex == kParentIndex)\n        return;\n      indices.Add(realIndex);\n      destPath = srcPanel.GetItemName(realIndex);\n    }\n    else\n    {\n      srcPanel.GetOperatedItemIndices(indices);\n      if (indices.Size() == 0)\n        return;\n      destPath = destPanel._currentFolderPrefix;\n      if (NumPanels == 1)\n        ReducePathToRealFileSystemPath(destPath);\n    }\n\n    CCopyDialog copyDialog;\n    UStringVector copyFolders;\n    ReadCopyHistory(copyFolders);\n\n    copyDialog.Strings = copyFolders;\n    copyDialog.Value = destPath;\n    \n    copyDialog.Title = move ?\n        LangString(IDS_MOVE, 0x03020202):\n        LangString(IDS_COPY, 0x03020201);\n    copyDialog.Static = move ?\n        LangString(IDS_MOVE_TO, 0x03020204):\n        LangString(IDS_COPY_TO, 0x03020203);\n\n    copyDialog.Info = srcPanel.GetItemsInfoString(indices);\n\n    if (copyDialog.Create(srcPanel.GetParent()) == IDCANCEL)\n      return;\n\n    destPath = copyDialog.Value;\n\n    if (destPath.IsEmpty())\n    {\n      srcPanel.MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));\n      return;\n    }\n\n    if (!IsPathAbsolute(destPath))\n    {\n      if (!srcPanel.IsFSFolder())\n      {\n        srcPanel.MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));\n        return;\n      }\n      destPath = srcPanel._currentFolderPrefix + destPath;\n    }\n\n    printf(\"destPath='%ls'\\n\",(const wchar_t *)destPath);\n#ifdef _WIN32\n    if (destPath.Length() > 0 && destPath[0] == CHAR_PATH_SEPARATOR)\n      if (destPath.Length() == 1 || destPath[1] != CHAR_PATH_SEPARATOR)\n      {\n        srcPanel.MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));\n        return;\n      }\n#endif\n\n    if (indices.Size() > 1 || (destPath.Length() > 0 && destPath.ReverseFind(CHAR_PATH_SEPARATOR) == destPath.Length() - 1) ||\n        IsThereFolderOfPath(destPath))\n    {\n      NDirectory::CreateComplexDirectory(destPath);\n      NName::NormalizeDirPathPrefix(destPath);\n      if (!CheckFolderPath(destPath))\n      {\n        if (NumPanels < 2 || destPath != destPanel._currentFolderPrefix || !destPanel.DoesItSupportOperations())\n        {\n          srcPanel.MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));\n          return;\n        }\n        useDestPanel = true;\n      }\n    }\n    else\n    {\n      int pos = destPath.ReverseFind(CHAR_PATH_SEPARATOR);\n      if (pos >= 0)\n      {\n        UString prefix = destPath.Left(pos + 1);\n        NDirectory::CreateComplexDirectory(prefix);\n        if (!CheckFolderPath(prefix))\n        {\n          srcPanel.MessageBox(LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208));\n          return;\n        }\n      }\n    }\n\n    AddUniqueStringToHeadOfList(copyFolders, destPath);\n    while (copyFolders.Size() > 20)\n      copyFolders.DeleteBack();\n    SaveCopyHistory(copyFolders);\n  }\n\n  bool useSrcPanel = (!useDestPanel || !srcPanel.IsFSFolder() || destPanel.IsFSFolder());\n  bool useTemp = useSrcPanel && useDestPanel;\n  // FIXME NFile::NDirectory::CTempDirectoryW tempDirectory;\n  UString tempDirPrefix;\n  if (useTemp)\n  {\n\t  /* FIXME\n    tempDirectory.Create(kTempDirPrefix);\n    tempDirPrefix = tempDirectory.GetPath();\n    NFile::NName::NormalizeDirPathPrefix(tempDirPrefix);\n    */\n\t  printf(\"useTemp : Not Implemented\\n\");\n\t  exit(EXIT_FAILURE);\n  }\n\n  CSelectedState srcSelState;\n  CSelectedState destSelState;\n  srcPanel.SaveSelectedState(srcSelState);\n  destPanel.SaveSelectedState(destSelState);\n\n  HRESULT result;\n  if (useSrcPanel)\n  {\n    UString folder = useTemp ? tempDirPrefix : destPath;\n    result = srcPanel.CopyTo(indices, folder, move, true, 0);\n    if (result != S_OK)\n    {\n      disableTimerProcessing1.Restore();\n      disableTimerProcessing2.Restore();\n      // For Password:\n      srcPanel.SetFocusToList();\n      if (result != E_ABORT)\n        srcPanel.MessageBoxError(result, L\"Error\");\n      return;\n    }\n  }\n  \n  if (useDestPanel)\n  {\n    UStringVector filePaths;\n    UString folderPrefix;\n    if (useTemp)\n      folderPrefix = tempDirPrefix;\n    else\n      folderPrefix = srcPanel._currentFolderPrefix;\n    filePaths.Reserve(indices.Size());\n    for(int i = 0; i < indices.Size(); i++)\n      filePaths.Add(srcPanel.GetItemRelPath(indices[i]));\n\n    result = destPanel.CopyFrom(folderPrefix, filePaths, true, 0);\n\n    if (result != S_OK)\n    {\n      disableTimerProcessing1.Restore();\n      disableTimerProcessing2.Restore();\n      // For Password:\n      srcPanel.SetFocusToList();\n      if (result != E_ABORT)\n        srcPanel.MessageBoxError(result, L\"Error\");\n      return;\n    }\n  }\n\n  RefreshTitleAlways();\n  if (copyToSame || move)\n  {\n    srcPanel.RefreshListCtrl(srcSelState);\n  }\n  if (!copyToSame)\n  {\n    destPanel.RefreshListCtrl(destSelState);\n    srcPanel.KillSelection();\n  }\n  disableTimerProcessing1.Restore();\n  disableTimerProcessing2.Restore();\n  srcPanel.SetFocusToList();\n}\n\nvoid CApp::OnSetSameFolder(int srcPanelIndex)\n{\n  if (NumPanels <= 1)\n    return;\n  const CPanel &srcPanel = Panels[srcPanelIndex];\n  CPanel &destPanel = Panels[1 - srcPanelIndex];\n  destPanel.BindToPathAndRefresh(srcPanel._currentFolderPrefix);\n}\n\nvoid CApp::OnSetSubFolder(int srcPanelIndex)\n{\n  if (NumPanels <= 1)\n    return;\n  const CPanel &srcPanel = Panels[srcPanelIndex];\n  CPanel &destPanel = Panels[1 - srcPanelIndex];\n\n  int focusedItem = srcPanel._listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int realIndex = srcPanel.GetRealItemIndex(focusedItem);\n  if (!srcPanel.IsItemFolder(realIndex))\n    return;\n\n\n  /*\n  UString string = srcPanel._currentFolderPrefix +\n      srcPanel.GetItemName(realIndex) + WCHAR_PATH_SEPARATOR;\n  destPanel.BindToFolder(string);\n  */\n  CMyComPtr<IFolderFolder> newFolder;\n  if (realIndex == kParentIndex)\n  {\n    if (srcPanel._folder->BindToParentFolder(&newFolder) != S_OK)\n      return;\n  }\n  else\n  {\n    if (srcPanel._folder->BindToFolder(realIndex, &newFolder) != S_OK)\n      return;\n  }\n  destPanel.CloseOpenFolders();\n  destPanel._folder = newFolder;\n  destPanel.RefreshListCtrl();\n}\n\n/*\nint CApp::GetFocusedPanelIndex() const\n{\n  return LastFocusedPanel;\n  HWND hwnd = ::GetFocus();\n  for (;;)\n  {\n    if (hwnd == 0)\n      return 0;\n    for (int i = 0; i < kNumPanelsMax; i++)\n    {\n      if (PanelsCreated[i] &&\n          ((HWND)Panels[i] == hwnd || Panels[i]._listView == hwnd))\n        return i;\n    }\n    hwnd = GetParent(hwnd);\n  }\n}\n  */\n\nstatic UString g_ToolTipBuffer;\nstatic CSysString g_ToolTipBufferSys;\n\n#ifdef _WIN32\nvoid CApp::OnNotify(int /* ctrlID */, LPNMHDR pnmh)\n{\n  if (pnmh->hwndFrom == _rebar)\n  {\n    switch(pnmh->code)\n    {\n      case RBN_HEIGHTCHANGE:\n      {\n        MoveSubWindows(g_HWND);\n        return;\n      }\n    }\n    return ;\n  }\n  else\n  {\n    if (pnmh->code == TTN_GETDISPINFO)\n    {\n      LPNMTTDISPINFO info = (LPNMTTDISPINFO)pnmh;\n      info->hinst = 0;\n      g_ToolTipBuffer.Empty();\n      SetButtonText((UINT32)info->hdr.idFrom, g_ToolTipBuffer);\n      g_ToolTipBufferSys = GetSystemString(g_ToolTipBuffer);\n      info->lpszText = (LPTSTR)(LPCTSTR)g_ToolTipBufferSys;\n      return;\n    }\n    #ifndef _UNICODE\n    if (pnmh->code == TTN_GETDISPINFOW)\n    {\n      LPNMTTDISPINFOW info = (LPNMTTDISPINFOW)pnmh;\n      info->hinst = 0;\n      g_ToolTipBuffer.Empty();\n      SetButtonText((UINT32)info->hdr.idFrom, g_ToolTipBuffer);\n      info->lpszText = (LPWSTR)(LPCWSTR)g_ToolTipBuffer;\n      return;\n    }\n    #endif\n  }\n}\n#endif\n\nvoid CApp::RefreshTitle(bool always)\n{\n  UString path = GetFocusedPanel()._currentFolderPrefix;\n  if (path.IsEmpty())\n    path += LangString(IDS_APP_TITLE, 0x03000000);\n  if (!always && path == PrevTitle)\n    return;\n  PrevTitle = path;\n  NWindows::MySetWindowText(_window, path);\n}\n\nvoid CApp::RefreshTitle(int panelIndex, bool always)\n{\n  if (panelIndex != GetFocusedPanelIndex())\n    return;\n  RefreshTitle(always);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/App.h",
    "content": "// App.h\n\n#ifndef __APP_H\n#define __APP_H\n\n#include \"Panel.h\"\n#include \"AppState.h\"\n// FIXME #include \"Windows/Control/ImageList.h\"\n\nclass CApp;\n\nextern CApp g_App;\nextern HWND g_HWND;\n\nconst int kNumPanelsMax = 2;\n\nextern void MoveSubWindows(HWND hWnd);\n\nenum\n{\n  kAddCommand = kToolbarStartID,\n  kExtractCommand,\n  kTestCommand\n};\n\nclass CPanelCallbackImp: public CPanelCallback\n{\n  CApp *_app;\n  int _index;\npublic:\n  void Init(CApp *app, int index)\n  {\n    _app = app;\n    _index = index;\n  }\n  virtual void OnTab();\n  virtual void SetFocusToPath(int index);\n  virtual void OnCopy(bool move, bool copyToSame);\n  virtual void OnSetSameFolder();\n  virtual void OnSetSubFolder();\n  virtual void PanelWasFocused();\n  virtual void DragBegin();\n  virtual void DragEnd();\n  virtual void RefreshTitle(bool always);\n};\n\nclass CApp;\n\n#if _WIN32\nclass CDropTarget:\n  public IDropTarget,\n  public CMyUnknownImp\n{\n  CMyComPtr<IDataObject> m_DataObject;\n  UStringVector m_SourcePaths;\n  int m_SelectionIndex;\n  bool m_DropIsAllowed;      // = true, if data contain fillist\n  bool m_PanelDropIsAllowed; // = false, if current target_panel is source_panel.\n                             // check it only if m_DropIsAllowed == true\n  int m_SubFolderIndex;\n  UString m_SubFolderName;\n\n  CPanel *m_Panel;\n  bool m_IsAppTarget;        // true, if we want to drop to app window (not to panel).\n\n  bool m_SetPathIsOK;\n\n  bool IsItSameDrive() const;\n\n  void QueryGetData(IDataObject *dataObject);\n  bool IsFsFolderPath() const;\n  DWORD GetEffect(DWORD keyState, POINTL pt, DWORD allowedEffect);\n  void RemoveSelection();\n  void PositionCursor(POINTL ptl);\n  UString GetTargetPath() const;\n  bool SetPath(bool enablePath) const;\n  bool SetPath();\n\npublic:\n  MY_UNKNOWN_IMP1_MT(IDropTarget)\n  STDMETHOD(DragEnter)(IDataObject * dataObject, DWORD keyState,\n      POINTL pt, DWORD *effect);\n  STDMETHOD(DragOver)(DWORD keyState, POINTL pt, DWORD * effect);\n  STDMETHOD(DragLeave)();\n  STDMETHOD(Drop)(IDataObject * dataObject, DWORD keyState,\n      POINTL pt, DWORD *effect);\n\n  CDropTarget():\n      TargetPanelIndex(-1),\n      SrcPanelIndex(-1),\n      m_IsAppTarget(false),\n      m_Panel(0),\n      App(0),\n      m_PanelDropIsAllowed(false),\n      m_DropIsAllowed(false),\n      m_SelectionIndex(-1),\n      m_SubFolderIndex(-1),\n      m_SetPathIsOK(false) {}\n\n  CApp *App;\n  int SrcPanelIndex;              // index of D&D source_panel\n  int TargetPanelIndex;           // what panel to use as target_panel of Application\n};\n#endif\n\nclass CApp\n{\npublic:\n  NWindows::CWindow _window;\n  bool ShowSystemMenu;\n  int NumPanels;\n  int LastFocusedPanel;\n\n  bool ShowStandardToolbar;\n  bool ShowArchiveToolbar;\n  bool ShowButtonsLables;\n  bool LargeButtons;\n\n  CAppState AppState;\n  CPanelCallbackImp m_PanelCallbackImp[kNumPanelsMax];\n  CPanel Panels[kNumPanelsMax];\n  bool PanelsCreated[kNumPanelsMax];\n\n#ifdef _WIN32\n  NWindows::NControl::CImageList _archiveButtonsImageList;\n  NWindows::NControl::CImageList _standardButtonsImageList;\n\n  NWindows::NControl::CReBar _rebar;\n  NWindows::NControl::CToolBar _archiveToolBar;\n  NWindows::NControl::CToolBar _standardToolBar;\n\n  CDropTarget *_dropTargetSpec;\n  CMyComPtr<IDropTarget> _dropTarget;\n\n  void CreateDragTarget()\n  {\n    _dropTargetSpec = new CDropTarget();\n    _dropTarget = _dropTargetSpec;\n    _dropTargetSpec->App = (this);\n  }\n#endif\n\n  void SetFocusedPanel(int index)\n  {\n    LastFocusedPanel = index;\n    // FIXME _dropTargetSpec->TargetPanelIndex = LastFocusedPanel;\n  }\n\n#ifdef _WIN32\n  void DragBegin(int panelIndex)\n  {\n    _dropTargetSpec->TargetPanelIndex = (NumPanels > 1) ? 1 - panelIndex : panelIndex;\n    _dropTargetSpec->SrcPanelIndex = panelIndex;\n  }\n\n  void DragEnd()\n  {\n    _dropTargetSpec->TargetPanelIndex = LastFocusedPanel;\n    _dropTargetSpec->SrcPanelIndex = -1;\n  }\n#endif\n\n  \n  void OnCopy(bool move, bool copyToSame, int srcPanelIndex);\n  void OnSetSameFolder(int srcPanelIndex);\n  void OnSetSubFolder(int srcPanelIndex);\n\n  void CreateOnePanel(int panelIndex, const UString &mainPath, bool &archiveIsOpened, bool &encrypted);\n  void Create(HWND hwnd, const UString &mainPath, int xSizes[2], bool &archiveIsOpened, bool &encrypted);\n  void Read();\n  void Save();\n  void Release();\n\n\n  /*\n  void SetFocus(int panelIndex)\n    { Panels[panelIndex].SetFocusToList(); }\n  */\n  void SetFocusToLastItem()\n    { Panels[LastFocusedPanel].SetFocusToLastRememberedItem(); }\n\n  int GetFocusedPanelIndex() const { return LastFocusedPanel; }\n\n  bool IsPanelVisible(int index) const { return (NumPanels > 1 || index == LastFocusedPanel); }\n\n  /*\n  void SetCurrentIndex()\n    { CurrentPanel = GetFocusedPanelIndex(); }\n  */\n\n  CApp(): NumPanels(2), LastFocusedPanel(0) {}\n  CPanel &GetFocusedPanel()\n    { return Panels[GetFocusedPanelIndex()]; }\n\n  // File Menu\n  void OpenItem()\n    { GetFocusedPanel().OpenSelectedItems(true); }\n  void OpenItemInside()\n    { GetFocusedPanel().OpenFocusedItemAsInternal(); }\n  void OpenItemOutside()\n    { GetFocusedPanel().OpenSelectedItems(false); }\n  void EditItem()\n    { GetFocusedPanel().EditItem(); }\n  void Rename()\n    { GetFocusedPanel().RenameFile(); }\n  void CopyTo()\n    { OnCopy(false, false, GetFocusedPanelIndex()); }\n  void MoveTo()\n    { OnCopy(true, false, GetFocusedPanelIndex()); }\n  void Delete(bool toRecycleBin)\n    { GetFocusedPanel().DeleteItems(toRecycleBin); }\n  void CalculateCrc();\n  void Split();\n  void Combine();\n  void Properties()\n    { GetFocusedPanel().Properties(); }\n  void Comment()\n    { GetFocusedPanel().ChangeComment(); }\n\n  void CreateFolder()\n    { GetFocusedPanel().CreateFolder(); }\n  void CreateFile()\n    { GetFocusedPanel().CreateFile(); }\n\n  // Edit\n  void EditCut()\n    { GetFocusedPanel().EditCut(); }\n  void EditCopy()\n    { GetFocusedPanel().EditCopy(); }\n  void EditPaste()\n    { GetFocusedPanel().EditPaste(); }\n\n  void SelectAll(bool selectMode)\n    { GetFocusedPanel().SelectAll(selectMode); }\n  void InvertSelection()\n    { GetFocusedPanel().InvertSelection(); }\n  void SelectSpec(bool selectMode)\n    { GetFocusedPanel().SelectSpec(selectMode); }\n  void SelectByType(bool selectMode)\n    { GetFocusedPanel().SelectByType(selectMode); }\n\n  void RefreshStatusBar()\n    { GetFocusedPanel().RefreshStatusBar(); }\n\n  void SetListViewMode(UINT32 index)\n    { GetFocusedPanel().SetListViewMode(index); }\n  UINT32 GetListViewMode()\n    { return  GetFocusedPanel().GetListViewMode(); }\n\n  void SortItemsWithPropID(PROPID propID)\n    { GetFocusedPanel().SortItemsWithPropID(propID); }\n\n  void OpenRootFolder()\n    { GetFocusedPanel().OpenDrivesFolder(); }\n  void OpenParentFolder()\n    { GetFocusedPanel().OpenParentFolder(); }\n  void FoldersHistory()\n    { GetFocusedPanel().FoldersHistory(); }\n  void RefreshView()\n    { GetFocusedPanel().OnReload(); }\n  void RefreshAllPanels()\n  {\n    for (int i = 0; i < NumPanels; i++)\n    {\n      int index = i;\n      if (NumPanels == 1)\n        index = LastFocusedPanel;\n      Panels[index].OnReload();\n    }\n  }\n  void SetListSettings();\n  void SetShowSystemMenu();\n  void SwitchOnOffOnePanel();\n  bool GetFlatMode() { return Panels[LastFocusedPanel].GetFlatMode(); }\n  void ChangeFlatMode() { Panels[LastFocusedPanel].ChangeFlatMode(); }\n\n  void OpenBookmark(int index)\n    { GetFocusedPanel().OpenBookmark(index); }\n  void SetBookmark(int index)\n    { GetFocusedPanel().SetBookmark(index); }\n\n  void ReloadRebar(HWND hwnd);\n  void ReloadToolbars();\n  void ReadToolbar()\n  {\n    UINT32 mask = ReadToolbarsMask();\n    ShowButtonsLables = ((mask & 1) != 0);\n    LargeButtons = ((mask & 2) != 0);\n    ShowStandardToolbar = ((mask & 4) != 0);\n    ShowArchiveToolbar  = ((mask & 8) != 0);\n  }\n  void SaveToolbar()\n  {\n    UINT32 mask = 0;\n    if (ShowButtonsLables) mask |= 1;\n    if (LargeButtons) mask |= 2;\n    if (ShowStandardToolbar) mask |= 4;\n    if (ShowArchiveToolbar) mask |= 8;\n    SaveToolbarsMask(mask);\n  }\n  void SwitchStandardToolbar()\n  {\n    ShowStandardToolbar = !ShowStandardToolbar;\n    SaveToolbar();\n    ReloadRebar(g_HWND);\n    MoveSubWindows(_window);\n  }\n  void SwitchArchiveToolbar()\n  {\n    ShowArchiveToolbar = !ShowArchiveToolbar;\n    SaveToolbar();\n    ReloadRebar(g_HWND);\n    MoveSubWindows(_window);\n  }\n  void SwitchButtonsLables()\n  {\n    ShowButtonsLables = !ShowButtonsLables;\n    SaveToolbar();\n    ReloadRebar(g_HWND);\n    MoveSubWindows(_window);\n  }\n  void SwitchLargeButtons()\n  {\n    LargeButtons = !LargeButtons;\n    SaveToolbar();\n    ReloadRebar(g_HWND);\n    MoveSubWindows(_window);\n  }\n\n  void AddToArchive() { GetFocusedPanel().AddToArchive(); }\n  void ExtractArchives() { GetFocusedPanel().ExtractArchives(); }\n  void TestArchives() { GetFocusedPanel().TestArchives(); }\n\n#ifdef _WIN32\n  void OnNotify(int ctrlID, LPNMHDR pnmh);\n#endif\n\n  UString PrevTitle;\n  void RefreshTitle(bool always = false);\n  void RefreshTitleAlways() { RefreshTitle(true); }\n  void RefreshTitle(int panelIndex, bool always = false);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/AppState.h",
    "content": "// AppState.h\n\n#ifndef __APPSTATE_H\n#define __APPSTATE_H\n\n#include \"Windows/Synchronization.h\"\n\nvoid inline AddUniqueStringToHead(UStringVector &list,\n    const UString &string)\n{\n  for(int i = 0; i < list.Size();)\n    if (string.CompareNoCase(list[i]) == 0)\n      list.Delete(i);\n    else\n      i++;\n  list.Insert(0, string);\n}\n\nclass CFastFolders\n{\n  NWindows::NSynchronization::CCriticalSection _criticalSection;\npublic:\n  UStringVector Strings;\n  void SetString(int index, const UString &string)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    while(Strings.Size() <= index)\n      Strings.Add(UString());\n    Strings[index] = string;\n  }\n  UString GetString(int index)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    if (index >= Strings.Size())\n      return UString();\n    return Strings[index];\n  }\n  void Save()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    SaveFastFolders(Strings);\n  }\n  void Read()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    ReadFastFolders(Strings);\n  }\n};\n\nclass CFolderHistory\n{\n  NWindows::NSynchronization::CCriticalSection _criticalSection;\n  UStringVector Strings;\n  void Normalize()\n  {\n    const int kMaxSize = 100;\n    if (Strings.Size() > kMaxSize)\n      Strings.Delete(kMaxSize, Strings.Size() - kMaxSize);\n  }\n  \npublic:\n  \n  void GetList(UStringVector &foldersHistory)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    foldersHistory = Strings;\n  }\n  \n  void AddString(const UString &string)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    AddUniqueStringToHead(Strings, string);\n    Normalize();\n  }\n  \n  void RemoveAll()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    Strings.Clear();\n  }\n  \n  void Save()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    SaveFolderHistory(Strings);\n  }\n  \n  void Read()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    ReadFolderHistory(Strings);\n    Normalize();\n  }\n};\n\nstruct CAppState\n{\n  CFastFolders FastFolders;\n  CFolderHistory FolderHistory;\n  void Save()\n  {\n    FastFolders.Save();\n    FolderHistory.Save();\n  }\n  void Read()\n  {\n    FastFolders.Read();\n    FolderHistory.Read();\n  }\n};\n\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ClassDefs.cpp",
    "content": "// ClassDefs.cpp\n\n#include \"StdAfx.h\"\n\n#include <initguid.h>\n\n#include \"IFolder.h\"\n#include \"../../IPassword.h\"\n#include \"PluginInterface.h\"\n#include \"ExtractCallback.h\"\n#include \"../../ICoder.h\"\n\n#include \"../Agent/Agent.h\"\n\n// {23170F69-40C1-278A-1000-000100020000}\nDEFINE_GUID(CLSID_CZipContextMenu,\n0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00);\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ComboDialog.cpp",
    "content": "// ComboDialog.cpp\n\n#include \"StdAfx.h\"\n#include \"ComboDialog.h\"\n\n#include \"Windows/Control/Static.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\nusing namespace NWindows;\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDOK, 0x02000702 },\n  { IDCANCEL, 0x02000710 }\n};\n#endif\n\nbool CComboDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  _comboBox.Attach(GetItem(IDC_COMBO_COMBO));\n\n  /*\n  // why it doesn't work ?\n  DWORD style = _comboBox.GetStyle();\n  if (Sorted)\n    style |= CBS_SORT;\n  else\n    style &= ~CBS_SORT;\n  _comboBox.SetStyle(style);\n  */\n  SetText(Title);\n  \n  NControl::CStatic staticContol;\n  staticContol.Attach(GetItem(IDC_COMBO_STATIC));\n  staticContol.SetText(Static);\n  _comboBox.SetText(Value);\n  for(int i = 0; i < Strings.Size(); i++)\n    _comboBox.AddString(Strings[i]);\n  return CModalDialog::OnInit();\n}\n\nvoid CComboDialog::OnOK()\n{\n  _comboBox.GetText(Value);\n  CModalDialog::OnOK();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ComboDialog.h",
    "content": "// ComboDialog.h\n\n#ifndef __COMBODIALOG_H\n#define __COMBODIALOG_H\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/ComboBox.h\"\n#include \"ComboDialogRes.h\"\n\nclass CComboDialog: public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CComboBox _comboBox;\n  virtual void OnOK();\n  virtual bool OnInit();\npublic:\n  // bool Sorted;\n  UString Title;\n  UString Static;\n  UString Value;\n  UStringVector Strings;\n  // CComboDialog(): Sorted(false) {};\n  INT_PTR Create(HWND parentWindow = 0) { return CModalDialog::Create(IDD_DIALOG_COMBO, parentWindow); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ComboDialogRes.h",
    "content": "#define IDD_DIALOG_COMBO                200\n\n#define IDC_COMBO_STATIC                1000\n#define IDC_COMBO_COMBO                 1001\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ComboDialog_rc.cpp",
    "content": "// PasswordDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"Windows/Control/DialogImpl.h\"\n\n#include \"ComboDialogRes.h\"\n\nclass ComboDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   ComboDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent,int id) : CModalDialogImpl(dialog, parent, id, wxT(\"Combo\"))\n  {\n\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\n\ttopsizer->Add(new wxStaticText(this, IDC_COMBO_STATIC, _T(\"\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\n\twxArrayString pathArray;\n\twxComboBox *combo = new wxComboBox(this, IDC_COMBO_COMBO, wxEmptyString, wxDefaultPosition, wxSize(200,-1), pathArray, wxCB_DROPDOWN|wxCB_SORT);\n\n\ttopsizer->Add(combo, 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\ttopsizer->Add(CreateButtonSizer(wxOK|wxCANCEL), 0, wxALL|wxEXPAND, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nREGISTER_DIALOG(IDD_DIALOG_COMBO,ComboDialog,0)\n\nBEGIN_EVENT_TABLE(ComboDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY,   CModalDialogImpl::OnAnyButton)\n\tEVT_CHECKBOX(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/CopyDialog.cpp",
    "content": "// CopyDialog.cpp\n\n#include \"StdAfx.h\"\n#include \"CopyDialog.h\"\n\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/Control/Static.h\"\n#include \"Windows/Shell.h\"\n#include \"Windows/FileName.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\nusing namespace NWindows;\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDOK, 0x02000702 },\n  { IDCANCEL, 0x02000710 }\n};\n#endif\n\nbool CCopyDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  _path.Attach(GetItem(IDC_COPY_COMBO));\n  SetText(Title);\n\n  NControl::CStatic staticContol;\n  staticContol.Attach(GetItem(IDC_COPY_STATIC));\n  staticContol.SetText(Static);\n  for (int i = 0; i < Strings.Size(); i++)\n    _path.AddString(Strings[i]);\n  _path.SetText(Value);\n  SetItemText(IDC_COPY_INFO, Info);\n  return CModalDialog::OnInit();\n}\n\nbool CCopyDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  switch(buttonID)\n  {\n    case IDC_COPY_SET_PATH:\n      OnButtonSetPath();\n      return true;\n  }\n  return CModalDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n\nvoid CCopyDialog::OnButtonSetPath()\n{\n  UString currentPath;\n  _path.GetText(currentPath);\n\n  /*\n  #ifdef LANG\n  UString title = LangLoadString(IDS_EXTRACT_SET_FOLDER, 0x02000881);\n  #else\n  UString title = MyLoadString(IDS_EXTRACT_SET_FOLDER);\n  #endif\n  */\n  UString title = LangStringSpec(IDS_SET_FOLDER, 0x03020209);\n  // UString title = L\"Specify a location for output folder\";\n\n  UString resultPath;\n  if (!NShell::BrowseForFolder(HWND(*this), title, currentPath, resultPath))\n    return;\n  NFile::NName::NormalizeDirPathPrefix(resultPath);\n  _path.SetCurSel(-1);\n  _path.SetText(resultPath);\n}\n\nvoid CCopyDialog::OnOK()\n{\n  _path.GetText(Value);\n  CModalDialog::OnOK();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/CopyDialog.h",
    "content": "// CopyDialog.h\n\n#ifndef __COPYDIALOG_H\n#define __COPYDIALOG_H\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/ComboBox.h\"\n#include \"CopyDialogRes.h\"\n\nconst int kCopyDialog_NumInfoLines = 11;\n\nclass CCopyDialog: public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CComboBox _path;\n  virtual void OnOK();\n  virtual bool OnInit();\n  void OnButtonSetPath();\n  bool OnButtonClicked(int buttonID, HWND buttonHWND);\npublic:\n  UString Title;\n  UString Static;\n  UString Value;\n  UStringVector Strings;\n\n  UString Info;\n\n  INT_PTR Create(HWND parentWindow = 0) { return CModalDialog::Create(IDD_DIALOG_COPY, parentWindow); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/CopyDialogRes.h",
    "content": "#define IDD_DIALOG_COPY                 202\n\n#define IDC_COPY_STATIC                1000\n#define IDC_COPY_COMBO                 1001\n#define IDC_COPY_SET_PATH              1002\n#define IDC_COPY_INFO                  1003\n\n#define IDS_SET_FOLDER  210\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/CopyDialog_rc.cpp",
    "content": "// PasswordDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"Windows/Control/DialogImpl.h\"\n\n#include \"CopyDialogRes.h\"\n\nclass CopyDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CopyDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent,int id) : CModalDialogImpl(dialog, parent, id, wxT(\"Copy\"))\n  {\n\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\n\ttopsizer->Add(new wxStaticText(this, IDC_COPY_STATIC, _T(\"\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\n\t{\n\twxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL);\n\n\twxArrayString pathArray;\n\twxComboBox *combo = new wxComboBox(this, IDC_COPY_COMBO, wxEmptyString, wxDefaultPosition, wxSize(600,-1), pathArray, wxCB_DROPDOWN|wxCB_SORT);\n\twxButton *button = new wxButton(this, IDC_COPY_SET_PATH, wxT(\"...\"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);\n\tpathSizer->Add(combo, 1, wxLEFT|wxRIGHT|wxEXPAND, 5);\n\tpathSizer->Add(button, 0, wxLEFT|wxRIGHT|wxEXPAND, 5);\n\n\ttopsizer->Add(pathSizer, 0 ,wxALL | wxALIGN_LEFT, 5 );\n\t}\n\n\ttopsizer->Add(new wxStaticText(this, IDC_COPY_INFO, _T(\"line1\\nline2\\nline3\\nline4\\n\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\ttopsizer->Add(CreateButtonSizer(wxOK|wxCANCEL), 0, wxALL|wxEXPAND, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nstatic CStringTable g_stringTable[] =\n{\n\t{ IDS_SET_FOLDER, L\"Specify a location for output folder.\" },\n\t{ 0 , 0 }\n};\n\n\nREGISTER_DIALOG(IDD_DIALOG_COPY,CopyDialog,g_stringTable)\n\nBEGIN_EVENT_TABLE(CopyDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY,   CModalDialogImpl::OnAnyButton)\n\tEVT_CHECKBOX(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ExtractCallback.cpp",
    "content": "// ExtractCallback.h\n\n#include \"StdAfx.h\"\n\n#include \"ExtractCallback.h\"\n\n#include \"Windows/Error.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/ResourceString.h\"\n\n#include \"OverwriteDialog.h\"\n#ifndef _NO_CRYPTO\n#include \"PasswordDialog.h\"\n#endif\n#include \"MessagesDialog.h\"\n#include \"../GUI/ExtractRes.h\"\n#include \"../GUI/resource.h\"\n\n#include \"Common/Wildcard.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"FormatUtils.h\"\n\n#include \"../../Common/FilePathAutoRename.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NFind;\n\nCExtractCallbackImp::~CExtractCallbackImp()\n{\n  if (ShowMessages && !Messages.IsEmpty())\n  {\n    CMessagesDialog messagesDialog;\n    messagesDialog.Messages = &Messages;\n    messagesDialog.Create(ParentWindow);\n  }\n}\n\nvoid CExtractCallbackImp::Init()\n{\n  Messages.Clear();\n  NumArchiveErrors = 0;\n  #ifndef _SFX\n  NumFolders = NumFiles = 0;\n  NeedAddFile = false;\n  #endif\n}\n\nvoid CExtractCallbackImp::AddErrorMessage(LPCWSTR message)\n{\n  Messages.Add(message);\n}\n\nSTDMETHODIMP CExtractCallbackImp::SetNumFiles(UInt64\n  #ifndef _SFX\n  numFiles\n  #endif\n  )\n{\n  #ifndef _SFX\n  ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles);\n  #endif\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackImp::SetTotal(UInt64 total)\n{\n  ProgressDialog.ProgressSynch.SetProgress(total, 0);\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackImp::SetCompleted(const UInt64 *value)\n{\n  RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause());\n  if (value != NULL)\n    ProgressDialog.ProgressSynch.SetPos(*value);\n  return S_OK;\n}\n\nHRESULT CExtractCallbackImp::Open_CheckBreak()\n{\n  return ProgressDialog.ProgressSynch.ProcessStopAndPause();\n}\n\nHRESULT CExtractCallbackImp::Open_SetTotal(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */)\n{\n  // if (numFiles != NULL) ProgressDialog.ProgressSynch.SetNumFilesTotal(*numFiles);\n  return S_OK;\n}\n\nHRESULT CExtractCallbackImp::Open_SetCompleted(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */)\n{\n  RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause());\n  // if (numFiles != NULL) ProgressDialog.ProgressSynch.SetNumFilesCur(*numFiles);\n  return S_OK;\n}\n\n#ifndef _NO_CRYPTO\n\nHRESULT CExtractCallbackImp::Open_CryptoGetTextPassword(BSTR *password)\n{\n  return CryptoGetTextPassword(password);\n}\n\nHRESULT CExtractCallbackImp::Open_GetPasswordIfAny(UString &password)\n{\n  if (PasswordIsDefined)\n    password = Password;\n  return S_OK;\n}\n\nbool CExtractCallbackImp::Open_WasPasswordAsked()\n{\n  return PasswordWasAsked;\n}\n\nvoid CExtractCallbackImp::Open_ClearPasswordWasAskedFlag()\n{\n  PasswordWasAsked = false;\n}\n\n#endif\n\n\n#ifndef _SFX\nSTDMETHODIMP CExtractCallbackImp::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize);\n  return S_OK;\n}\n#endif\n\n/*\nSTDMETHODIMP CExtractCallbackImp::SetTotalFiles(UInt64 total)\n{\n  ProgressDialog.ProgressSynch.SetNumFilesTotal(total);\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackImp::SetCompletedFiles(const UInt64 *value)\n{\n  if (value != NULL)\n    ProgressDialog.ProgressSynch.SetNumFilesCur(*value);\n  return S_OK;\n}\n*/\n\nSTDMETHODIMP CExtractCallbackImp::AskOverwrite(\n    const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,\n    const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,\n    Int32 *answer)\n{\n  COverwriteDialog dialog;\n\n  dialog.OldFileInfo.Time = *existTime;\n  dialog.OldFileInfo.SizeIsDefined = (existSize != NULL);\n  if (dialog.OldFileInfo.SizeIsDefined)\n    dialog.OldFileInfo.Size = *existSize;\n  dialog.OldFileInfo.Name = existName;\n\n  if (newTime == 0)\n    dialog.NewFileInfo.TimeIsDefined = false;\n  else\n  {\n    dialog.NewFileInfo.TimeIsDefined = true;\n    dialog.NewFileInfo.Time = *newTime;\n  }\n  \n  dialog.NewFileInfo.SizeIsDefined = (newSize != NULL);\n  if (dialog.NewFileInfo.SizeIsDefined)\n    dialog.NewFileInfo.Size = *newSize;\n  dialog.NewFileInfo.Name = newName;\n  \n  /*\n  NOverwriteDialog::NResult::EEnum writeAnswer =\n    NOverwriteDialog::Execute(oldFileInfo, newFileInfo);\n  */\n  INT_PTR writeAnswer = dialog.Create(ProgressDialog); // ParentWindow doesn't work with 7z\n  \n  switch(writeAnswer)\n  {\n    case IDCANCEL: *answer = NOverwriteAnswer::kCancel; return E_ABORT;\n    case IDYES: *answer = NOverwriteAnswer::kYes; break;\n    case IDNO: *answer = NOverwriteAnswer::kNo; break;\n    case IDC_BUTTON_OVERWRITE_YES_TO_ALL: *answer = NOverwriteAnswer::kYesToAll; break;\n    case IDC_BUTTON_OVERWRITE_NO_TO_ALL: *answer = NOverwriteAnswer::kNoToAll; break;\n    case IDC_BUTTON_OVERWRITE_AUTO_RENAME: *answer = NOverwriteAnswer::kAutoRename; break;\n    default: return E_FAIL;\n  }\n  return S_OK;\n}\n\n\nSTDMETHODIMP CExtractCallbackImp::PrepareOperation(const wchar_t *name, bool isFolder, Int32 /* askExtractMode */, const UInt64 * /* position */)\n{\n  _isFolder = isFolder;\n  return SetCurrentFilePath2(name);\n}\n\nSTDMETHODIMP CExtractCallbackImp::MessageError(const wchar_t *message)\n{\n  AddErrorMessage(message);\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackImp::ShowMessage(const wchar_t *message)\n{\n  AddErrorMessage(message);\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackImp::SetOperationResult(Int32 operationResult, bool encrypted)\n{\n  switch(operationResult)\n  {\n    case NArchive::NExtract::NOperationResult::kOK:\n      break;\n    default:\n    {\n      UINT messageID;\n      UInt32 langID;\n      switch(operationResult)\n      {\n        case NArchive::NExtract::NOperationResult::kUnSupportedMethod:\n          messageID = IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_UNSUPPORTED_METHOD;\n          langID = 0x02000A91;\n          break;\n        case NArchive::NExtract::NOperationResult::kDataError:\n          messageID = encrypted ?\n              IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR_ENCRYPTED:\n              IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR;\n          langID = encrypted ? 0x02000A94 : 0x02000A92;\n          break;\n        case NArchive::NExtract::NOperationResult::kCRCError:\n          messageID = encrypted ?\n              IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC_ENCRYPTED:\n              IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC;\n          langID = encrypted ? 0x02000A95 : 0x02000A93;\n          break;\n        default:\n          return E_FAIL;\n      }\n      if (_needWriteArchivePath)\n      {\n        AddErrorMessage(_currentArchivePath);\n        _needWriteArchivePath = false;\n      }\n      AddErrorMessage(\n        MyFormatNew(messageID,\n          #ifdef LANG\n          langID,\n          #endif\n          _currentFilePath));\n    }\n  }\n  #ifndef _SFX\n  if (_isFolder)\n    NumFolders++;\n  else\n    NumFiles++;\n  ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles);\n  #endif\n  return S_OK;\n}\n\n////////////////////////////////////////\n// IExtractCallbackUI\n\nHRESULT CExtractCallbackImp::BeforeOpen(const wchar_t *name)\n{\n  #ifndef _SFX\n  ProgressDialog.ProgressSynch.SetTitleFileName(name);\n  #endif\n  _currentArchivePath = name;\n  return S_OK;\n}\n\nHRESULT CExtractCallbackImp::SetCurrentFilePath2(const wchar_t *path)\n{\n  _currentFilePath = path;\n  #ifndef _SFX\n  ProgressDialog.ProgressSynch.SetCurrentFileName(path);\n  #endif\n  return S_OK;\n}\n\nHRESULT CExtractCallbackImp::SetCurrentFilePath(const wchar_t *path)\n{\n  #ifndef _SFX\n  if (NeedAddFile)\n    NumFiles++;\n  NeedAddFile = true;\n  ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles);\n  #endif\n  return SetCurrentFilePath2(path);\n}\n\nHRESULT CExtractCallbackImp::OpenResult(const wchar_t *name, HRESULT result, bool encrypted)\n{\n  if (result != S_OK)\n  {\n    UString message;\n    if (result == S_FALSE)\n    {\n      message = MyFormatNew(encrypted ? IDS_CANT_OPEN_ENCRYPTED_ARCHIVE : IDS_CANT_OPEN_ARCHIVE,\n        #ifdef LANG\n        (encrypted ? 0x0200060A : 0x02000609),\n        #endif\n        name);\n    }\n    else\n    {\n      message = name;\n      message += L\": \";\n      UString message2;\n      if (result == E_OUTOFMEMORY)\n        message2 =\n        #ifdef LANG\n        LangString(IDS_MEM_ERROR, 0x0200060B);\n        #else\n        MyLoadStringW(IDS_MEM_ERROR);\n        #endif\n      else\n        NError::MyFormatMessage(result, message2);\n      message += message2;\n    }\n    MessageError(message);\n    NumArchiveErrors++;\n  }\n  _currentArchivePath = name;\n  _needWriteArchivePath = true;\n  return S_OK;\n}\n  \nHRESULT CExtractCallbackImp::ThereAreNoFiles()\n{\n  return S_OK;\n}\n\nHRESULT CExtractCallbackImp::ExtractResult(HRESULT result)\n{\n  if (result == S_OK)\n    return result;\n  NumArchiveErrors++;\n  if (result == E_ABORT || result == ERROR_DISK_FULL)\n    return result;\n  MessageError(_currentFilePath);\n  MessageError(NError::MyFormatMessageW(result));\n  return S_OK;\n}\n\nHRESULT CExtractCallbackImp::SetPassword(const UString &password)\n{\n  PasswordIsDefined = true;\n  Password = password;\n  return S_OK;\n}\n\nSTDMETHODIMP CExtractCallbackImp::CryptoGetTextPassword(BSTR *password)\n{\n  PasswordWasAsked = true;\n  if (!PasswordIsDefined)\n  {\n    CPasswordDialog dialog;\n    if (dialog.Create(ProgressDialog) == IDCANCEL)\n      return E_ABORT;\n    Password = dialog.Password;\n    PasswordIsDefined = true;\n  }\n  return StringToBstr(Password, password);\n}\n\n\n// IExtractCallBack3\nSTDMETHODIMP CExtractCallbackImp::AskWrite(\n    const wchar_t *srcPath, Int32 srcIsFolder,\n    const FILETIME *srcTime, const UInt64 *srcSize,\n    const wchar_t *destPath,\n    BSTR *destPathResult,\n    Int32 *writeAnswer)\n{\n  UString destPathResultTemp = destPath;\n\n  // RINOK(StringToBstr(destPath, destPathResult));\n\n  *destPathResult = 0;\n  *writeAnswer = BoolToInt(false);\n\n  UString destPathSpec = destPath;\n  UString destPathSys = destPathSpec;\n  bool srcIsFolderSpec = IntToBool(srcIsFolder);\n  CFileInfoW destFileInfo;\n  if (FindFile(destPathSys, destFileInfo))\n  {\n    if (srcIsFolderSpec)\n    {\n      if (!destFileInfo.IsDir())\n      {\n        UString message = UString(L\"can not replace file \\'\")\n          + destPathSpec +\n          UString(L\"\\' with folder with same name\");\n        RINOK(MessageError(message));\n        return E_ABORT;\n      }\n      *writeAnswer = BoolToInt(false);\n      return S_OK;\n    }\n    if (destFileInfo.IsDir())\n    {\n      UString message = UString(L\"can not replace folder \\'\")\n          + destPathSpec +\n          UString(L\"\\' with file with same name\");\n      RINOK(MessageError(message));\n      return E_FAIL;\n    }\n\n    switch(OverwriteMode)\n    {\n      case NExtract::NOverwriteMode::kSkipExisting:\n        return S_OK;\n      case NExtract::NOverwriteMode::kAskBefore:\n      {\n        Int32 overwiteResult;\n        RINOK(AskOverwrite(\n            destPathSpec,\n            &destFileInfo.MTime, &destFileInfo.Size,\n            srcPath,\n            srcTime, srcSize,\n            &overwiteResult));\n          switch(overwiteResult)\n        {\n          case NOverwriteAnswer::kCancel:\n            return E_ABORT;\n          case NOverwriteAnswer::kNo:\n            return S_OK;\n          case NOverwriteAnswer::kNoToAll:\n            OverwriteMode = NExtract::NOverwriteMode::kSkipExisting;\n            return S_OK;\n          case NOverwriteAnswer::kYesToAll:\n            OverwriteMode = NExtract::NOverwriteMode::kWithoutPrompt;\n            break;\n          case NOverwriteAnswer::kYes:\n            break;\n          case NOverwriteAnswer::kAutoRename:\n            OverwriteMode = NExtract::NOverwriteMode::kAutoRename;\n            break;\n          default:\n            return E_FAIL;\n        }\n      }\n    }\n    if (OverwriteMode == NExtract::NOverwriteMode::kAutoRename)\n    {\n      if (!AutoRenamePath(destPathSys))\n      {\n        UString message = UString(L\"can not create name of file \")\n            + destPathSys;\n        RINOK(MessageError(message));\n        return E_ABORT;\n      }\n      destPathResultTemp = destPathSys;\n    }\n    else\n      if (!NFile::NDirectory::DeleteFileAlways(destPathSys))\n      {\n        UString message = UString(L\"can not delete output file \")\n            + destPathSys;\n        RINOK(MessageError(message));\n        return E_ABORT;\n      }\n  }\n  *writeAnswer = BoolToInt(true);\n  return StringToBstr(destPathResultTemp, destPathResult);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ExtractCallback.h",
    "content": "// ExtractCallback.h\n\n#ifndef __EXTRACTCALLBACK_H\n#define __EXTRACTCALLBACK_H\n\n#include \"../Agent/IFolderArchive.h\"\n#include \"Common/MyString.h\"\n#include \"../Common/ArchiveOpenCallback.h\"\n\n#ifdef _SFX\n#include \"ProgressDialog.h\"\n#else\n#include \"ProgressDialog2.h\"\n#endif\n\n#include \"Windows/ResourceString.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\n#ifndef _NO_CRYPTO\n#include \"../../IPassword.h\"\n#endif\n#include \"Common/MyCom.h\"\n#include \"IFolder.h\"\n\nclass CExtractCallbackImp:\n  public IExtractCallbackUI,\n  public IOpenCallbackUI,\n  public IFolderOperationsExtractCallback,\n  // public IFolderArchiveExtractCallback, // mkultiple from IProgress\n  #ifndef _SFX\n  public ICompressProgressInfo,\n  #endif\n  #ifndef _NO_CRYPTO\n  public ICryptoGetTextPassword,\n  #endif\n  public CMyUnknownImp\n{\npublic:\n  MY_QUERYINTERFACE_BEGIN2(IFolderOperationsExtractCallback)\n  MY_QUERYINTERFACE_ENTRY(IFolderArchiveExtractCallback)\n  #ifndef _SFX\n  MY_QUERYINTERFACE_ENTRY(ICompressProgressInfo)\n  #endif\n  #ifndef _NO_CRYPTO\n  MY_QUERYINTERFACE_ENTRY(ICryptoGetTextPassword)\n  #endif\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n  #ifndef _SFX\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n  #endif\n\n  INTERFACE_IProgress(;)\n  INTERFACE_IOpenCallbackUI(;)\n\n  // IFolderArchiveExtractCallback\n  // STDMETHOD(SetTotalFiles)(UInt64 total);\n  // STDMETHOD(SetCompletedFiles)(const UInt64 *value);\n  STDMETHOD(AskOverwrite)(\n      const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,\n      const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,\n      Int32 *answer);\n  STDMETHOD (PrepareOperation)(const wchar_t *name, bool isFolder, Int32 askExtractMode, const UInt64 *position);\n\n  STDMETHOD(MessageError)(const wchar_t *message);\n  STDMETHOD(SetOperationResult)(Int32 operationResult, bool encrypted);\n\n  // IExtractCallbackUI\n  \n  HRESULT BeforeOpen(const wchar_t *name);\n  HRESULT OpenResult(const wchar_t *name, HRESULT result, bool encrypted);\n  HRESULT ThereAreNoFiles();\n  HRESULT ExtractResult(HRESULT result);\n\n  #ifndef _NO_CRYPTO\n  HRESULT SetPassword(const UString &password);\n  #endif\n\n  // IFolderOperationsExtractCallback\n  STDMETHOD(AskWrite)(\n      const wchar_t *srcPath,\n      Int32 srcIsFolder,\n      const FILETIME *srcTime,\n      const UInt64 *srcSize,\n      const wchar_t *destPathRequest,\n      BSTR *destPathResult,\n      Int32 *writeAnswer);\n  STDMETHOD(ShowMessage)(const wchar_t *message);\n  STDMETHOD(SetCurrentFilePath)(const wchar_t *filePath);\n  STDMETHOD(SetNumFiles)(UInt64 numFiles);\n\n  // ICryptoGetTextPassword\n  #ifndef _NO_CRYPTO\n  STDMETHOD(CryptoGetTextPassword)(BSTR *password);\n  #endif\n\nprivate:\n  // bool _extractMode;\n  UString _currentArchivePath;\n  bool _needWriteArchivePath;\n\n  UString _currentFilePath;\n  bool _isFolder;\n\n  // void CreateComplexDirectory(const UStringVector &aDirPathParts);\n\n  HRESULT SetCurrentFilePath2(const wchar_t *filePath);\n  void AddErrorMessage(LPCWSTR message);\npublic:\n  CProgressDialog ProgressDialog;\n  UStringVector Messages;\n  bool ShowMessages;\n  #ifndef _SFX\n  UInt64 NumFolders;\n  UInt64 NumFiles;\n  bool NeedAddFile;\n  #endif\n  HWND ParentWindow;\n  INT_PTR StartProgressDialog(const UString &title)\n  {\n    return ProgressDialog.Create(title, ParentWindow);\n  }\n  UInt32 NumArchiveErrors;\n  NExtract::NOverwriteMode::EEnum OverwriteMode;\n\n  #ifndef _NO_CRYPTO\n  bool PasswordIsDefined;\n  bool PasswordWasAsked;\n  UString Password;\n  #endif\n\n  CExtractCallbackImp():\n    #ifndef _NO_CRYPTO\n    PasswordIsDefined(false),\n    PasswordWasAsked(false),\n    #endif\n    OverwriteMode(NExtract::NOverwriteMode::kAskBefore),\n    ParentWindow(0),\n    ShowMessages(true)\n    {}\n   \n  ~CExtractCallbackImp();\n  void Init();\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FM.cpp",
    "content": "// FM.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n#include \"Panel.h\"\n\nextern \"C\" \n{ \n  #include \"../../../../C/Alloc.h\"\n}\n\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n// #include \"Common/CommandLineParser.h\"\n\n// FIXME #include \"Windows/Control/Toolbar.h\"\n#include \"Windows/Error.h\"\n#include \"Windows/COM.h\"\n#include \"Windows/DLL.h\"\n// FIXME #include \"Windows/Security.h\"\n// FIXME #include \"Windows/MemoryLock.h\"\n\n#include \"ViewSettings.h\"\n#include \"../GUI/ExtractRes.h\"\n\n#include \"App.h\"\n#include \"StringUtils.h\"\n\n#include \"MyLoadMenu.h\"\n#include \"LangUtils.h\"\n#include \"FormatUtils.h\"\n#include \"RegistryUtils.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NFind;\n// using namespace NCommandLineParser;\n\n#define MAX_LOADSTRING 100\n\n#define MENU_HEIGHT 26\n\n#ifndef _UNICODE\nbool g_IsNT = false;\n#endif\nHINSTANCE g_hInstance;\nHWND g_HWND;\nbool g_OpenArchive = false;\nstatic UString g_MainPath;\n\nconst int kNumDefaultPanels = 1;\n\nconst int kSplitterWidth = 4;\nint kSplitterRateMax = 1 << 16;\n\n// bool OnMenuCommand(HWND hWnd, int id);\n\nstatic void local_WM_CREATE(HWND hWnd);\n\n#ifdef _WIN32\nstatic UString GetProgramPath()\n{\n  UString s;\n  NDLL::MyGetModuleFileName(g_hInstance, s);\n  return s;\n}\n\nUString GetProgramFolderPrefix()\n{\n  UString path = GetProgramPath();\n  int pos = path.ReverseFind(WCHAR_PATH_SEPARATOR);\n  return path.Left(pos + 1);\n}\n\n\nclass CSplitterPos\n{\n  int _ratio; // 10000 is max\n  int _pos;\n  int _fullWidth;\n  void SetRatioFromPos(HWND hWnd)\n    { _ratio = (_pos + kSplitterWidth / 2) * kSplitterRateMax / \n        MyMax(GetWidth(hWnd), 1); }\npublic:\n  int GetPos() const\n    { return _pos; }\n  int GetWidth(HWND hWnd) const\n  {\n    RECT rect;\n    ::GetClientRect(hWnd, &rect);\n    return rect.right;\n  }\n  void SetRatio(HWND hWnd, int aRatio)\n  { \n    _ratio = aRatio; \n    SetPosFromRatio(hWnd);\n  }\n  void SetPosPure(HWND hWnd, int pos)\n  {\n    int posMax = GetWidth(hWnd) - kSplitterWidth;\n    if (pos > posMax)\n      pos = posMax;\n    if (pos < 0)\n      pos = 0;\n    _pos = pos;\n  }\n  void SetPos(HWND hWnd, int pos)\n  {\n    _fullWidth = GetWidth(hWnd);\n    SetPosPure(hWnd, pos);\n    SetRatioFromPos(hWnd);\n  }\n  void SetPosFromRatio(HWND hWnd)\n  { \n    int fullWidth = GetWidth(hWnd);\n    if (_fullWidth != fullWidth)\n    {\n      _fullWidth = fullWidth;\n      SetPosPure(hWnd, GetWidth(hWnd) * _ratio / kSplitterRateMax - kSplitterWidth / 2); \n    }\n  }\n};\n#endif\n\nbool g_CanChangeSplitter = false;\nUINT32 g_SplitterPos = 0;\n// FIXME CSplitterPos g_Splitter;\nbool g_PanelsInfoDefined = false;\n\nint g_StartCaptureMousePos;\nint g_StartCaptureSplitterPos;\n\nCApp g_App;\n\nvoid MoveSubWindows(HWND hWnd);\nvoid OnSize(HWND hWnd);\n\n// FIXME LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\n\nconst wchar_t *kWindowClass = L\"FM\";\n\n#ifndef _UNICODE\nstatic bool IsItWindowsNT()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo)) \n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);\n}\n#endif\n\n//  FUNCTION: InitInstance(HANDLE, int)\nBOOL InitInstance(HINSTANCE hInstance, int nCmdShow)\n{\n  CWindow wnd;\n\n  g_hInstance = hInstance;\n\n  ReloadLangSmart();\n\n  // LoadString(hInstance, IDS_CLASS, windowClass, MAX_LOADSTRING);\n\n  // LoadString(hInstance, IDS_APP_TITLE, title, MAX_LOADSTRING);\n  UString title = LangString(IDS_APP_TITLE, 0x03000000);\n\n  /*\n  //If it is already running, then focus on the window\n  hWnd = FindWindow(windowClass, title);\n  if (hWnd) \n  {\n    SetForegroundWindow ((HWND) (((DWORD)hWnd) | 0x01));    \n    return 0;\n  } \n  */\n\n#ifdef _WIN32\n  WNDCLASSW wc;\n\n  // wc.style = CS_HREDRAW | CS_VREDRAW;\n  wc.style = 0;\n  wc.lpfnWndProc = (WNDPROC) WndProc;\n  wc.cbClsExtra = 0;\n  wc.cbWndExtra = 0;\n  wc.hInstance = hInstance;\n  wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_FAM));\n\n  // wc.hCursor = LoadCursor (NULL, IDC_ARROW);\n  wc.hCursor = ::LoadCursor(0, IDC_SIZEWE);\n  // wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);\n  wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);\n\n  wc.lpszMenuName = MAKEINTRESOURCEW(IDM_MENU);\n  wc.lpszClassName = kWindowClass;\n\n  MyRegisterClass(&wc);\n\n  // RECT rect;\n  // GetClientRect(hWnd, &rect);\n\n  DWORD style = WS_OVERLAPPEDWINDOW;\n  // DWORD style = 0;\n  \n  RECT rect;\n  bool maximized = false;\n  int x , y, xSize, ySize;\n  x = y = xSize = ySize = CW_USEDEFAULT;\n  bool windowPosIsRead = ReadWindowSize(rect, maximized);\n\n  if (windowPosIsRead)\n  {\n    // x = rect.left;\n    // y = rect.top;\n    xSize = rect.right - rect.left;\n    ySize = rect.bottom - rect.top;\n  }\n#endif\n\n  UINT32 numPanels, currentPanel;\n  g_PanelsInfoDefined = ReadPanelsInfo(numPanels, currentPanel, g_SplitterPos);\n  if (g_PanelsInfoDefined)\n  {\n    if (numPanels < 1 || numPanels > 2)\n      numPanels = kNumDefaultPanels;\n    if (currentPanel >= 2)\n      currentPanel = 0;\n  }\n  else\n  {\n    numPanels = kNumDefaultPanels;\n    currentPanel = 0;\n  }\n  g_App.NumPanels = numPanels;\n  g_App.LastFocusedPanel = currentPanel;\n\n#ifdef _WIN32 // FIXME\n  if (!wnd.Create(kWindowClass, title, style,\n    x, y, xSize, ySize, NULL, NULL, hInstance, NULL))\n    return FALSE;\n  g_HWND = (HWND)wnd;\n#else\n  {\n    extern HWND myCreateAndShowMainWindow(LPCTSTR title,void (*fct)(HWND));\n     g_HWND = myCreateAndShowMainWindow(title,local_WM_CREATE);\n  }\n#endif\n\n#ifdef _WIN32\n  WINDOWPLACEMENT placement;\n  placement.length = sizeof(placement);\n  if (wnd.GetPlacement(&placement))\n  {\n    if (nCmdShow == SW_SHOWNORMAL || nCmdShow == SW_SHOW || \n        nCmdShow == SW_SHOWDEFAULT)\n    {\n      if (maximized)\n        placement.showCmd = SW_SHOWMAXIMIZED;\n      else\n        placement.showCmd = SW_SHOWNORMAL;\n    }\n    else\n      placement.showCmd = nCmdShow;\n    if (windowPosIsRead)\n      placement.rcNormalPosition = rect;\n    wnd.SetPlacement(&placement);\n    // window.Show(nCmdShow);\n  }\n  else\n    wnd.Show(nCmdShow);\n#endif\n  return TRUE;\n}\n\n/*\nstatic void GetCommands(const UString &aCommandLine, UString &aCommands)\n{\n  UString aProgramName;\n  aCommands.Empty();\n  bool aQuoteMode = false;\n  for (int i = 0; i < aCommandLine.Length(); i++)\n  {\n    wchar_t aChar = aCommandLine[i];\n    if (aChar == L'\\\"')\n      aQuoteMode = !aQuoteMode;\n    else if (aChar == L' ' && !aQuoteMode)\n    {\n      if (!aQuoteMode)\n      {\n        i++;\n        break;\n      }\n    }\n    else \n      aProgramName += aChar;\n  }\n  aCommands = aCommandLine.Mid(i);\n}\n*/\n\n#ifdef _WIN32\nDWORD GetDllVersion(LPCTSTR lpszDllName)\n{\n  HINSTANCE hinstDll;\n  DWORD dwVersion = 0;\n  hinstDll = LoadLibrary(lpszDllName);\n  if(hinstDll)\n  {\n    DLLGETVERSIONPROC pDllGetVersion;\n    pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hinstDll, \"DllGetVersion\");\n    \n    /*Because some DLLs might not implement this function, you\n    must test for it explicitly. Depending on the particular \n    DLL, the lack of a DllGetVersion function can be a useful\n    indicator of the version.\n    */\n    if(pDllGetVersion)\n    {\n      DLLVERSIONINFO dvi;\n      HRESULT hr;\n      \n      ZeroMemory(&dvi, sizeof(dvi));\n      dvi.cbSize = sizeof(dvi);\n      \n      hr = (*pDllGetVersion)(&dvi);\n      \n      if(SUCCEEDED(hr))\n      {\n        dwVersion = MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion);\n      }\n    }\n    FreeLibrary(hinstDll);\n  }\n  return dwVersion;\n}\n\nDWORD g_ComCtl32Version;\n#endif\n\n/*\n#ifndef _WIN64\ntypedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);\n\nstatic bool IsWow64()\n{\n  LPFN_ISWOW64PROCESS  fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(\n      GetModuleHandle(\"kernel32\"), \"IsWow64Process\");\n  if (fnIsWow64Process == NULL)\n    return false;\n  BOOL isWow;\n  if (!fnIsWow64Process(GetCurrentProcess(),&isWow))\n    return false;\n  return isWow != FALSE;\n}\n#endif\n*/\n\n#ifdef _WIN32\nbool IsLargePageSupported()\n{\n  #ifdef _WIN64\n  return true;\n  #else\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo)) \n    return false;\n  if (versionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || versionInfo.dwMajorVersion < 5)\n    return false;\n  if (versionInfo.dwMajorVersion > 5)\n    return true;\n  if (versionInfo.dwMinorVersion < 1)\n    return false;\n  if (versionInfo.dwMinorVersion > 1)\n    return true;\n  // return IsWow64();\n  return false;\n  #endif\n}\n\nstatic void SetMemoryLock()\n{\n  if (!IsLargePageSupported())\n    return;\n  // if (ReadLockMemoryAdd())\n    NSecurity::AddLockMemoryPrivilege();\n\n  if (ReadLockMemoryEnable())\n    NSecurity::EnableLockMemoryPrivilege();\n}\n#endif\n\n/*\nstatic const int kNumSwitches = 1;\n\nnamespace NKey {\nenum Enum\n{\n  kOpenArachive = 0,\n};\n\n}\n\nstatic const CSwitchForm kSwitchForms[kNumSwitches] = \n  {\n    { L\"SOA\",  NSwitchType::kSimple, false },\n  };\n*/\n\n// int APIENTRY WinMain2(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */);\n\n#ifdef _WIN32\nint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int nCmdShow)\n{\n  #ifndef _UNICODE\n  g_IsNT = IsItWindowsNT();\n  #endif\n\n  #ifdef _WIN32\n  SetLargePageSize();\n  #endif\n\n  InitCommonControls();\n\n  g_ComCtl32Version = ::GetDllVersion(TEXT(\"comctl32.dll\"));\n\n  // OleInitialize is required for drag and drop.\n  OleInitialize(NULL); \n  // Maybe needs CoInitializeEx also ?\n  // NCOM::CComInitializer comInitializer;\n\n  UString programString, commandsString;\n  // MessageBoxW(0, GetCommandLineW(), L\"\", 0);\n  SplitStringToTwoStrings(GetCommandLineW(), programString, commandsString);\n\n  commandsString.Trim();\n  UString paramString, tailString;\n  SplitStringToTwoStrings(commandsString, paramString, tailString);\n  paramString.Trim();\n \n  if (!paramString.IsEmpty())\n  {\n    g_MainPath = paramString;\n    // return WinMain2(hInstance, hPrevInstance, lpCmdLine, nCmdShow);\n\n    // MessageBoxW(0, paramString, L\"\", 0);\n  }\n  /*\n  UStringVector commandStrings;\n  NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);\n  NCommandLineParser::CParser parser(kNumSwitches);\n  try \n  { \n    parser.ParseStrings(kSwitchForms, commandStrings); \n    const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;\n    if(nonSwitchStrings.Size() > 1)  \n    {\n      g_MainPath = nonSwitchStrings[1];\n      // g_OpenArchive = parser[NKey::kOpenArachive].ThereIs;\n      CFileInfoW fileInfo;\n      if (FindFile(g_MainPath, fileInfo))\n      {\n        if (!fileInfo.IsDir())\n          g_OpenArchive = true;\n      }\n    }\n  }\n  catch(...) { }\n  */\n\n\n  SetMemoryLock();\n\n  MSG msg;\n  if (!InitInstance (hInstance, nCmdShow)) \n    return FALSE;\n\n  MyLoadMenu(g_HWND);\n\n  #ifndef _UNICODE\n  if (g_IsNT)\n  {\n    HACCEL hAccels = LoadAcceleratorsW(hInstance, MAKEINTRESOURCEW(IDR_ACCELERATOR1));\n    while (GetMessageW(&msg, NULL, 0, 0)) \n    {\n      if (TranslateAcceleratorW(g_HWND, hAccels, &msg) == 0) \n      {\n        TranslateMessage(&msg);\n        DispatchMessageW(&msg);\n      }\n    }\n  }\n  else\n  #endif\n  {\n    HACCEL hAccels = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));\n    while (GetMessage(&msg, NULL, 0, 0)) \n    {\n      if (TranslateAccelerator(g_HWND, hAccels, &msg) == 0) \n      {\n        // if (g_Hwnd != NULL || !IsDialogMessage(g_Hwnd, &msg))\n        // if (!IsDialogMessage(g_Hwnd, &msg))\n        TranslateMessage(&msg);\n        DispatchMessage(&msg);\n      }\n    }\n  }\n\n  g_HWND = 0;\n  OleUninitialize();\n  return (int)msg.wParam;\n}\n\nstatic void SaveWindowInfo(HWND aWnd)\n{\n  /*\n  RECT rect;\n  if (!::GetWindowRect(aWnd, &rect))\n    return;\n  */\n  WINDOWPLACEMENT placement;\n  placement.length = sizeof(placement);\n  if (!::GetWindowPlacement(aWnd, &placement))\n    return;\n  SaveWindowSize(placement.rcNormalPosition, \n      BOOLToBool(::IsZoomed(aWnd)));\n  SavePanelsInfo(g_App.NumPanels, g_App.LastFocusedPanel, \n      g_Splitter.GetPos());\n}\n#else\nint Main1(int argc,TCHAR **argv)\n{\n  if (argc >= 2)\n  {\n    g_MainPath = argv[1];\n  }\n\n  if (!InitInstance (0, 0)) \n    return FALSE;\n\n  MyLoadMenu(g_HWND);\n\n  // FIXME : install Accelerators ?\n\n  return 0;\n}\n\n#endif\n\nvoid ExecuteCommand(UINT commandID)\n{\n  printf(\"FM - ExecuteCommand(%d)\\n\",commandID);\n  switch (commandID)\n  {\n    case kAddCommand:\n      g_App.AddToArchive();\n      break;\n    case kExtractCommand:\n      g_App.ExtractArchives();\n      break;\n    case kTestCommand:\n      g_App.TestArchives();\n      break;\n  }\n}\n\n#ifdef _WIN32\nLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\n{\n  int wmId, wmEvent;\n  switch (message) \n  {\n    case WM_COMMAND:\n      wmId    = LOWORD(wParam); \n      wmEvent = HIWORD(wParam); \n      if ((HWND) lParam != NULL && wmEvent != 0)\n        break;\n      if (wmId >= kToolbarStartID)\n      {\n        ExecuteCommand(wmId);\n        return 0;\n      }\n      if (OnMenuCommand(hWnd, wmId))\n        return 0;\n      break;\n    case WM_INITMENUPOPUP:\n      OnMenuActivating(hWnd, HMENU(wParam), LOWORD(lParam));\n      break;\n\n    /*\n    It doesn't help\n    case WM_EXITMENULOOP:\n      {\n        OnMenuUnActivating(hWnd);\n        break;\n      }\n    case WM_UNINITMENUPOPUP:\n      OnMenuUnActivating(hWnd, HMENU(wParam), lParam);\n      break;\n    */\n\n    case WM_CREATE:\n    {\n\n      /*\n      INITCOMMONCONTROLSEX icex;\n      icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\n      icex.dwICC  = ICC_BAR_CLASSES;\n      InitCommonControlsEx(&icex);\n      \n      // Toolbar buttons used to create the first 4 buttons.\n      TBBUTTON tbb [ ] = \n      {\n        // {0, 0, TBSTATE_ENABLED, BTNS_SEP, 0L, 0},\n        // {VIEW_PARENTFOLDER, kParentFolderID, TBSTATE_ENABLED, BTNS_BUTTON, 0L, 0},\n          // {0, 0, TBSTATE_ENABLED, BTNS_SEP, 0L, 0},\n        {VIEW_NEWFOLDER, ID_FILE_CREATEFOLDER, TBSTATE_ENABLED, BTNS_BUTTON, 0L, 0},\n      };\n      \n      int baseID = 100;\n      NWindows::NControl::CToolBar aToolBar;\n      aToolBar.Attach(::CreateToolbarEx (hWnd, \n        WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_TOOLTIPS, //  | TBSTYLE_FLAT \n        baseID + 2, 11, \n        (HINSTANCE)HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR, \n        (LPCTBBUTTON)&tbb, sizeof(tbb) / sizeof(tbb[0]), \n        0, 0, 100, 30, sizeof (TBBUTTON)));\n      */\n      // HCURSOR cursor = ::LoadCursor(0, IDC_SIZEWE);\n      // ::SetCursor(cursor);\n\n      if (g_PanelsInfoDefined)\n        g_Splitter.SetPos(hWnd, g_SplitterPos);\n      else\n      {\n        g_Splitter.SetRatio(hWnd, kSplitterRateMax / 2);\n        g_SplitterPos = g_Splitter.GetPos();\n      }\n\n      RECT rect;\n      ::GetClientRect(hWnd, &rect);\n      int xSize = rect.right;\n      int xSizes[2];\n      xSizes[0] = g_Splitter.GetPos();\n      xSizes[1] = xSize - kSplitterWidth - xSizes[0];\n      if (xSizes[1] < 0)\n        xSizes[1] = 0;\n\n      g_App.CreateDragTarget();\n      bool archiveIsOpened;\n      bool encrypted;\n      bool needOpenFile = false;\n      if (!g_MainPath.IsEmpty() /* && g_OpenArchive */)\n      {\n        NFile::NFind::CFileInfoW fileInfo;\n        if (NFile::NFind::FindFile(g_MainPath, fileInfo))\n          if (!fileInfo.IsDir())\n            needOpenFile = true;\n      }\n      g_App.Create(hWnd, g_MainPath, xSizes, archiveIsOpened, encrypted);\n\n      if (needOpenFile && !archiveIsOpened)\n      {\n        UString message;\n        if (encrypted)\n          message = MyFormatNew(IDS_CANT_OPEN_ENCRYPTED_ARCHIVE, 0x0200060A, g_MainPath);\n        else\n          message = MyFormatNew(IDS_CANT_OPEN_ARCHIVE, 0x02000609, g_MainPath);\n        MessageBoxW(0, message, L\"7-zip\", MB_ICONERROR);\n        return -1;\n      }\n      // g_SplitterPos = 0;\n\n      // ::DragAcceptFiles(hWnd, TRUE);\n      RegisterDragDrop(hWnd, g_App._dropTarget);\n\n      break;\n    }\n    case WM_DESTROY:\n    {\n      // ::DragAcceptFiles(hWnd, FALSE);  \n      RevokeDragDrop(hWnd);\n      g_App._dropTarget.Release();\n\n      g_App.Save();\n      g_App.Release();\n      SaveWindowInfo(hWnd);\n      PostQuitMessage(0);\n      break;\n    }\n    /*\n    case WM_MOVE:\n    {\n      break;\n    }\n    */\n    case WM_LBUTTONDOWN:\n      g_StartCaptureMousePos = LOWORD(lParam);\n      g_StartCaptureSplitterPos = g_Splitter.GetPos();\n      ::SetCapture(hWnd);\n      break;\n    case WM_LBUTTONUP:\n    {\n      ::ReleaseCapture();\n      break;\n    }\n    case WM_MOUSEMOVE: \n    {\n      if ((wParam & MK_LBUTTON) != 0 && ::GetCapture() == hWnd)\n      {\n        g_Splitter.SetPos(hWnd, g_StartCaptureSplitterPos + \n            (short)LOWORD(lParam) - g_StartCaptureMousePos);\n        MoveSubWindows(hWnd);\n      }\n      break;\n    }\n\n    case WM_SIZE:\n    {\n      if (g_CanChangeSplitter)\n        g_Splitter.SetPosFromRatio(hWnd);\n      else\n      {\n        g_Splitter.SetPos(hWnd, g_SplitterPos );\n        g_CanChangeSplitter = true;\n      }\n\n      OnSize(hWnd);\n      /*\n      int xSize = LOWORD(lParam);\n      int ySize = HIWORD(lParam);\n      // int xSplitter = 2;\n      int xWidth = g_SplitPos;\n      // int xSplitPos = xWidth;\n      g_Panel[0]._listView.MoveWindow(0, 0, xWidth, ySize);\n      g_Panel[1]._listView.MoveWindow(xSize - xWidth, 0, xWidth, ySize);\n      */\n      return 0;\n      break;\n    }\n    case WM_SETFOCUS:\n      // g_App.SetFocus(g_App.LastFocusedPanel);\n      g_App.SetFocusToLastItem();\n      break;\n    /*\n    case WM_ACTIVATE:\n    {\n      int fActive = LOWORD(wParam); \n      switch (fActive)\n      {\n        case WA_INACTIVE:\n        {\n          // g_FocusIndex = g_App.LastFocusedPanel;\n          // g_App.LastFocusedPanel = g_App.GetFocusedPanelIndex();\n          // return 0;\n        }\n      }\n      break;\n    }\n    */\n    /*\n    case kLangWasChangedMessage:\n      MyLoadMenu(g_HWND);\n      return 0;\n    */\n      \n    /*\n    case WM_SETTINGCHANGE:\n      break;\n    */\n    case WM_NOTIFY:\n    {\n      g_App.OnNotify((int)wParam, (LPNMHDR)lParam);\n      break;\n    }\n    /*\n    case WM_DROPFILES:\n    {\n      g_App.GetFocusedPanel().CompressDropFiles((HDROP)wParam);\n      return 0 ;\n    }\n    */\n   }\n   #ifndef _UNICODE\n   if (g_IsNT)\n     return DefWindowProcW(hWnd, message, wParam, lParam);\n   else\n   #endif\n     return DefWindowProc(hWnd, message, wParam, lParam);\n\n}\n\nvoid OnSize(HWND hWnd)\n{\n  /*\n  if (g_App._rebar)\n  {\n    RECT rect;\n    ::GetClientRect(hWnd, &rect);\n    int xSize = rect.right;\n    int ySize = rect.bottom;\n    // rect.bottom = 0;\n    // g_App._rebar.SizeToRect(&rect);\n    // g_App._rebar.Move(0, 0, xSize, ySize);\n  }\n  */\n  MoveSubWindows(hWnd);\n}\n\nint Window_GetRealHeight(NWindows::CWindow &w)\n{\n  RECT rect;\n  WINDOWPLACEMENT placement;\n  w.GetWindowRect(&rect);\n  int res = rect.bottom - rect.top;\n  if (w.GetPlacement(&placement))\n    res += placement.rcNormalPosition.top;\n  return res;\n}\n#else // _WIN32\nstatic void local_WM_CREATE(HWND hWnd)\n    {\n\t    printf(\"**local_WM_CREATE**\\n\");\n#if 0\n      if (g_PanelsInfoDefined)\n        g_Splitter.SetPos(hWnd, g_SplitterPos);\n      else\n      {\n        g_Splitter.SetRatio(hWnd, kSplitterRateMax / 2);\n        g_SplitterPos = g_Splitter.GetPos();\n      }\n\n      RECT rect;\n      ::GetClientRect(hWnd, &rect);\n      int xSize = rect.right;\n      int xSizes[2];\n      xSizes[0] = g_Splitter.GetPos();\n      xSizes[1] = xSize - kSplitterWidth - xSizes[0];\n      if (xSizes[1] < 0)\n        xSizes[1] = 0;\n\n      g_App.CreateDragTarget();\n#else\n      int xSizes[2] = { 0,0 };\n#endif\n      bool archiveIsOpened;\n      bool encrypted;\n      bool needOpenFile = false;\n      if (!g_MainPath.IsEmpty() /* && g_OpenArchive */)\n      {\n        NFile::NFind::CFileInfoW fileInfo;\n        if (NFile::NFind::FindFile(g_MainPath, fileInfo))\n          if (!fileInfo.IsDir())\n            needOpenFile = true;\n      }\n      g_App.Create(hWnd, g_MainPath, xSizes, archiveIsOpened, encrypted);\n\n      if (needOpenFile && !archiveIsOpened)\n      {\n        UString message;\n        if (encrypted)\n          message = MyFormatNew(IDS_CANT_OPEN_ENCRYPTED_ARCHIVE, 0x0200060A, g_MainPath);\n        else\n          message = MyFormatNew(IDS_CANT_OPEN_ARCHIVE, 0x02000609, g_MainPath);\n        MessageBoxW(0, message, L\"7-zip\", MB_ICONERROR);\n        return ;// -1;\n      }\n      // g_SplitterPos = 0;\n\n      // FIXME RegisterDragDrop(hWnd, g_App._dropTarget);\n\n}\n\nvoid main_WM_DESTROY()\n{\n      // RevokeDragDrop(hWnd);\n      // g_App._dropTarget.Release();\nprintf(\"main_WM_DESTROY\\n\");\n      g_App.Save();\n      g_App.Release();\n      // SaveWindowInfo(hWnd);\n      // PostQuitMessage(0);\n}\n#endif\n\nvoid MoveSubWindows(HWND hWnd)\n{\n#ifdef _WIN32\n  RECT rect;\n  ::GetClientRect(hWnd, &rect);\n  int xSize = rect.right;\n  int headerSize = 0;\n  if (g_App._rebar)\n    headerSize = Window_GetRealHeight(g_App._rebar);\n  int ySize = MyMax((int)(rect.bottom - headerSize), 0);\n \n  if (g_App.NumPanels > 1)\n  {\n    g_App.Panels[0].Move(0, headerSize, g_Splitter.GetPos(), ySize);\n    int xWidth1 = g_Splitter.GetPos() + kSplitterWidth;\n    g_App.Panels[1].Move(xWidth1, headerSize, xSize - xWidth1, ySize);\n  }\n  else\n  {\n    /*\n    int otherPanel = 1 - g_App.LastFocusedPanel;\n    if (g_App.PanelsCreated[otherPanel])\n      g_App.Panels[otherPanel].Move(0, headerSize, 0, ySize);\n    */\n    g_App.Panels[g_App.LastFocusedPanel].Move(0, headerSize, xSize, ySize);\n  }\n#endif\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FM_rc.cpp",
    "content": "#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n\n#ifdef __BORLANDC__\n#pragma hdrstop\n#endif\n\n#ifndef WX_PRECOMP\n#include \"wx/wx.h\"\n#endif\n\n#include \"wx/mimetype.h\"\n#include \"wx/artprov.h\"\n#include \"wx/imaglist.h\"\n\n#include \"resource.h\"\n\n#include \"App.h\"\n\n#include \"Windows/Control/DialogImpl.h\"\n#include \"Windows/Control/ListView.h\"\n#include \"Windows/Control/Window2.h\"\n\n// FIXME\n#undef IDCLOSE\n#define IDCLOSE wxID_EXIT\n\n#define static const\n#include \"../GUI/p7zip_32.xpm\"\n#undef static\n\nextern HWND g_HWND;\n\n#define BASE_ID_PANEL_1 (1000 + 100 * 0)\n#define BASE_ID_PANEL_2 (1000 + 100 * 1)\n\n////////////////////////////////////// Tool bar images\n#include \"res/AddPNG.h\"\n#include \"res/Add2PNG.h\"\n#include \"res/ExtractPNG.h\"\n#include \"res/Extract2PNG.h\"\n#include \"res/TestPNG.h\"\n#include \"res/Test2PNG.h\"\n#include \"res/CopyPNG.h\"\n#include \"res/Copy2PNG.h\"\n#include \"res/MovePNG.h\"\n#include \"res/Move2PNG.h\"\n#include \"res/DeletePNG.h\"\n#include \"res/Delete2PNG.h\"\n#include \"res/InfoPNG.h\"\n#include \"res/Info2PNG.h\"\n\n#include <wx/mstream.h>\n#define wxGetBitmapFromMemory(name) _wxGetBitmapFromMemory(name ## _png, sizeof(name ## _png))\n\nstatic inline wxBitmap _wxGetBitmapFromMemory(const unsigned char *data, int length) {\n\twxMemoryInputStream is(data, length);\n\treturn wxBitmap(wxImage(is, wxBITMAP_TYPE_ANY, -1), -1);\n}\n\n///////////////////////////////////// SevenZipPanel.h /////////////////////\n\n#include <wx/listctrl.h>\n\ntypedef wxListCtrl CExplorerListCtrl;\n\nclass MyFrame;\n\nclass SevenZipPanel : public wxPanel\n{\n\tstatic int count;\n\n\tCExplorerListCtrl *m_pListCtrlExplorer;\n\tNWindows::NControl::CWindow2 *_wList;\n\t\n\n\twxBitmapButton *m_pBmpButtonParentFolder;\n\twxComboBox *m_pComboBoxPath;\n\twxStatusBar *m_pStatusBar;\n\n\tMyFrame *m_frame;\n\n\twxImageList imgList;\n\n\tint _panelIndex;\n\n\t// wxString m_currentDirectory;\n\n\t// int m_nbDirs;\n\n\t// wxString m_prompt;\n\npublic:\n\tSevenZipPanel(MyFrame *frame, wxWindow *parent,int id,int panelIndex);\n\n\tvoid registerWindow2(NWindows::NControl::CWindow2 *w)\n\t{\n\t\t_wList = w;\n\t\t_wList->OnMessage(WM_CREATE,0,0);\n\t}\n\t\t\n\tvoid OnAnyButton( wxCommandEvent &event );\n\tvoid OnSelected(wxListEvent& event);\n\tvoid OnDeselected(wxListEvent& event);\n\tvoid OnActivated(wxListEvent& event);\n\tvoid OnFocused(wxListEvent& event);\n\tvoid OnLeftDownBeginDrag(wxListEvent& event);\n\tvoid OnRightClick(wxListEvent& event);\n\tvoid OnColumnClick(wxListEvent& event);\n\n\tvoid OnLeftDown(wxMouseEvent &event );\n\tvoid OnRightDown(wxMouseEvent &event );\n\n        void WriteText(const wxString& text) {\n\t\tprintf(\"DEBUG : %ls\\n\",(const wchar_t *)text);\n        }\n\n\t/* Don't work ...\n\tvoid OnCloseWindow(wxCloseEvent& WXUNUSED(event)) {\n\t\t_wList->OnDestroy();\n\t}\n\t*/\n\n\tvoid evt_destroy() {\n\t\t_wList->OnDestroy();\n\t}\n\n\nprivate:\n\t\tDECLARE_EVENT_TABLE()\n};\n\n\n\n///////////////////////////////////// SevenZipPanel.h /////////////////////\n\n\n\nclass MyFrame: public wxFrame\n{\npublic:\n    // ctor\n MyFrame(void (*fct)(HWND),wxFrame *frame, const wxString& title, int x, int y, int w, int h);\n    // virtual ~MyFrame();\n\n\tvoid registerWindow2(int baseID,NWindows::NControl::CWindow2 *w)\n\t{\n\t\tprintf(\"MyFrame::registerWindow2(%d,%p)\\n\",baseID,w);\n\t\tswitch (baseID)\n\t\t{\n\t\t\tcase BASE_ID_PANEL_1: _panel1->registerWindow2(w); break;\n\t\t\tcase BASE_ID_PANEL_2: _panel2->registerWindow2(w); break;\n\t\t\tdefault: printf(\"FIXME - MyFrame::registerWindow2\\n\");\n\t\t}\n\t}\n\n\tvoid PopulateToolbar(wxToolBar* toolBar);\n\tvoid RecreateToolbar();\n\n\nprotected:\n\t// callbacks\n\tvoid OnWorkerEvent(wxCommandEvent& event);\n\tvoid OnAnyMenu(wxCommandEvent& event)\n\t{\n\t\textern bool OnMenuCommand(HWND hWnd, int id);\n\t\textern void ExecuteCommand(UINT commandID);\n\n\t\tint wmId = event.GetId();\n\n\t\tif (wmId >= kToolbarStartID)\n\t\t{\n\t\t\tExecuteCommand(wmId);\n\t\t\treturn ; // 0;\n\t\t}\n\t\tOnMenuCommand(this, wmId);\n\t}\n\tvoid OnCloseWindow(wxCloseEvent& WXUNUSED(event))\n\t{\n\t\tif (_panel1) _panel1->evt_destroy();\n\t\tif (_panel2) _panel2->evt_destroy();\n\n\t\textern void main_WM_DESTROY();\n\t\tmain_WM_DESTROY();\n\t\tDestroy();\n\t}\nprivate:\n\tSevenZipPanel * _panel1;\n\tSevenZipPanel * _panel2;\n    DECLARE_EVENT_TABLE()\n};\n\nenum {\n    WORKER_EVENT=100    // this one gets sent from the worker thread\n};\n    \nBEGIN_EVENT_TABLE(MyFrame, wxFrame)\n\tEVT_MENU(WORKER_EVENT, MyFrame::OnWorkerEvent)\n\tEVT_MENU(wxID_ANY, MyFrame::OnAnyMenu)\n\tEVT_CLOSE(MyFrame::OnCloseWindow)\nEND_EVENT_TABLE()\n\n// My frame constructor\nMyFrame::MyFrame(void (*wm_create)(HWND),wxFrame *frame, const wxString& title,\n                 int x, int y, int w, int h)\n       : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))\n{\nprintf(\"===MyFrame::MyFrame===BEGIN===\\n\");\n\n\tthis->SetIcon(wxICON(p7zip_32));\n\t\n\tg_HWND = this; // FIXME\n\t\n\twxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );\n\n\t_panel1 = new SevenZipPanel(this,this,BASE_ID_PANEL_1,0);  // FIXME panelIndex = 0\n\t_panel2 = 0;\n\ttopsizer->Add(\n\t\t_panel1,\n\t\t1,            // make vertically stretchable\n\t\twxEXPAND |    // make horizontally stretchable\n\t\twxALL,        //   and make border all around\n\t\t0 );         // set border width to 10\n\n\t// Create the toolbar\n\t// FIXME RecreateToolbar();\nprintf(\"===MyFrame::MyFrame===WM_CREATE===\\n\");\n       wm_create(this);\n\n       // Create the toolbar // FIXME\n\tRecreateToolbar();\n\n\nprintf(\"===MyFrame::MyFrame===SIZER===\\n\");\n\n\tSetSizer( topsizer );      // use the sizer for layout\n\n\ttopsizer->SetSizeHints( this );   // set size hints to honour minimum size\nprintf(\"===MyFrame::MyFrame===END===\\n\");\n}\n\nvoid myCreateHandle(int n);\nvoid MyFrame::OnWorkerEvent(wxCommandEvent& event)\n{\n\tint n = event.GetInt();\n\tmyCreateHandle(n);\n}\n\nwxWindow * g_window=0;\nHWND myCreateAndShowMainWindow(LPCTSTR title,void (*fct)(HWND))\n{\n    MyFrame *frame = new MyFrame(fct,(wxFrame *)NULL, title, 50, 50, 450, 340);\n   // Don't Show the frame !\n   frame->Show(true); // FIXME\n\n   // FIXME : SetTopWindow(g_HWND);\n\n   g_window = frame;\n\n   return frame;\n}\n\n\nclass myToolBar\n{\n\twxToolBar * m_toolbar;\n\n\tbool m_bShowText;\n\npublic:\n\tmyToolBar(wxToolBar * toolbar,bool bShowText ) : m_toolbar(toolbar), m_bShowText(bShowText)  { }\n\n\tmyToolBar* AddTool(int toolId, const wxString& label, const wxBitmap& bitmap1, const wxString& shortHelpString = _T(\"\"), wxItemKind kind = wxITEM_NORMAL)\n\t{\n\t\twxString text = wxEmptyString;\n\t\tif (m_bShowText) text = label;\n\n\t\twxSize tb_size = m_toolbar->GetToolBitmapSize();\n\t\tint tb_witdh = tb_size.GetWidth();\n\t\tint tb_height = tb_size.GetHeight();\n\n\t\tif ((bitmap1.GetWidth() > tb_witdh) || ( bitmap1.GetHeight()> tb_height))\n\t\t{\n\t\t\twxBitmap bmp(bitmap1.ConvertToImage().Scale(tb_witdh, tb_height));\n\t\t\tm_toolbar->AddTool(toolId,text,bmp,shortHelpString,kind);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tm_toolbar->AddTool(toolId,text,bitmap1,shortHelpString,kind);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tvoid SetToolBitmapSize(const wxSize& size)\n\t{\n\t\tm_toolbar->SetToolBitmapSize(size);\n\t}\n\n\tbool Realize()\n\t{\n\t\treturn m_toolbar->Realize();\n\t}\n\n\tvoid AddSeparator() { m_toolbar->AddSeparator(); }\n};\n\nvoid MyFrame::PopulateToolbar(wxToolBar* p_toolBar)\n{/*\n toolBar->AddTool(wxID_NEW, _T(\"New\"),toolBarBitmaps[Tool_new], wxNullBitmap, wxITEM_NORMAL,\n _T(\"New file\"), _T(\"This is help for new file tool\"));\n */\n\tmyToolBar toolBar(p_toolBar,true);\n\n\tconst int kWidth  = 24;\n\tconst int kHeight = 24;\n\n\t// FIXME toolBar->SetToolBitmapSize(wxSize(24,24));\n\ttoolBar.SetToolBitmapSize(wxSize(kWidth,kHeight));\n\ttoolBar.AddTool(kAddCommand, wxT(\"Add\"), wxGetBitmapFromMemory(ADD2));\n\ttoolBar.AddTool(kExtractCommand,wxT(\"Extract\"), wxGetBitmapFromMemory(EXTRACT2));\n\ttoolBar.AddTool(kTestCommand, wxT(\"Test\"), wxGetBitmapFromMemory(TEST2));\n\n\ttoolBar.AddSeparator();\n\n\ttoolBar.AddTool(IDM_COPY_TO, wxT(\"Copy\"), wxGetBitmapFromMemory(COPY2));\n\ttoolBar.AddTool(IDM_MOVE_TO, wxT(\"Move\"), wxGetBitmapFromMemory(MOVE2));\n\ttoolBar.AddTool(IDM_DELETE, wxT(\"Delete\"), wxGetBitmapFromMemory(DELETE2));\n\ttoolBar.AddTool(IDM_FILE_PROPERTIES, wxT(\"Info\"), wxGetBitmapFromMemory(INFO2));\n\n\t////////////////////////////////////////////////////////\n\n\t/* FIXME\n\tif (g_mimeDatabase)\n\t{\n\t\ttoolBar.AddSeparator();\n\n\t\tTryMime(&toolBar, _T(\"txt\"));\n\t\tTryMime(&toolBar, _T(\"rar\"));\n\t\tTryMime(&toolBar, _T(\"7z\"));\n\t}\n\n\ttoolBar.AddSeparator();\n\n\twxIcon i_plus = wxArtProvider::GetIcon(wxART_ADD_BOOKMARK    , wxART_TOOLBAR  , wxSize(kWidth,kHeight));\n\ttoolBar.AddTool(wxID_ANY, wxT(\"Add Bookmark\"), i_plus);\n\n\twxIcon i_go_up_dir = wxArtProvider::GetIcon(wxART_GO_DIR_UP   , wxART_TOOLBAR  , wxSize(kWidth,kHeight));\n\ttoolBar.AddTool(wxID_ANY, wxT(\"Go up dir\"), i_go_up_dir);\n\n\twxIcon i_folder = wxArtProvider::GetIcon(wxART_FOLDER   , wxART_TOOLBAR  , wxSize(kWidth,kHeight));\n\ttoolBar.AddTool(wxID_ANY, wxT(\"Folder\"), i_folder);\n\n\twxIcon i_missing_image = wxArtProvider::GetIcon(wxART_MISSING_IMAGE   , wxART_TOOLBAR  , wxSize(kWidth,kHeight));\n\ttoolBar.AddTool(wxID_ANY, wxT(\"missing image\"), i_missing_image);\n\t*/\n\n\t///////////////////////////////////////////////////////\n\n\ttoolBar.Realize();\n\n\t// toolBar->SetRows(!(toolBar->IsVertical()) ? m_rows : 10 / m_rows);\n}\nvoid MyFrame::RecreateToolbar()\n{\n\t// delete and recreate the toolbar\n\twxToolBar *toolBar = GetToolBar();\n\t// long style = toolBar ? toolBar->GetWindowStyle() : TOOLBAR_STYLE;\n\n\tSetToolBar(NULL);\n\n\tdelete toolBar;\n\t/*\n\tstyle &= ~(wxTB_HORIZONTAL | wxTB_VERTICAL | wxTB_BOTTOM | wxTB_RIGHT | wxTB_HORZ_LAYOUT);\n\tswitch( m_toolbarPosition )\n\t{\n\tcase TOOLBAR_LEFT:style |= wxTB_LEFT; break;\n\tcase TOOLBAR_TOP: style |= wxTB_TOP;break;\n\tcase TOOLBAR_RIGHT:style |= wxTB_RIGHT;break;\n\tcase TOOLBAR_BOTTOM:style |= wxTB_BOTTOM;break;\n\t}\n\t*/\n\tlong style = wxTB_FLAT | wxTB_NODIVIDER | wxTB_TEXT; // TOOLBAR_STYLE | wxTB_TOP;\n\t/*\n\tif ( m_showTooltips ) style &= ~wxTB_NO_TOOLTIPS;\n\telse                  style |= wxTB_NO_TOOLTIPS;\n\n\tif ( style & wxTB_TEXT && !(style & wxTB_NOICONS) && m_horzText ) style |= wxTB_HORZ_LAYOUT;\n\t*/\n\ttoolBar = CreateToolBar(style, wxID_ANY);\n\n\tPopulateToolbar(toolBar);\n}\n\nvoid registerWindow2(int baseID,NWindows::NControl::CWindow2 *w)\n{\n\tMyFrame * f = (MyFrame *) g_HWND;\n\tf->registerWindow2(baseID,w);\n\t\n}\n\n\n/////////////////////////////////////////////////////////\n#include \"LangUtils.h\"\n\nstatic const UINT kOpenBookmarkMenuID = 730;  // FIXME / duplicate\nstatic const UINT kSetBookmarkMenuID = 740;\n\n\nvoid rc_MyLoadMenu(HWND hWnd)\n{\n\twxFrame *hwnd = (wxFrame *)hWnd;\n\twxMenu *m;\n\twxMenu *m_file = m = new wxMenu;\n\t{\n\t\tm->Append(IDM_FILE_OPEN, _T(\"&Open\\tEnter\"));\n\t\tm->Append(IDM_FILE_OPEN_INSIDE,_T(\"Open &Inside\\tCtrl+PgDn\"));\n\t\tm->Append(IDM_FILE_OPEN_OUTSIDE,_T(\"Open O&utside\\tShift+Enter\"));\n\t\tm->Append(IDM_FILE_EDIT,_T(\"&Edit\\tF4\"));\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_RENAME,_T(\"Rena&me\\tF2\"));\n\t\tm->Append(IDM_COPY_TO,_T(\"&Copy To...\\tF5\"));\n\t\tm->Append(IDM_MOVE_TO,_T(\"&Move To...\\tF6\"));\n\t\tm->Append(IDM_DELETE,_T(\"&Delete\\tDel\"));\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_FILE_SPLIT,_T(\"&Split file...\"));\n\t\tm->Append(IDM_FILE_COMBINE,_T(\"Com&bine files...\"));\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_FILE_PROPERTIES,_T(\"P&roperties\\tAlt+Enter\"));\n\t\tm->Append(IDM_FILE_COMMENT,_T(\"Comme&nt\\tCtrl+Z\"));\n\t\tm->Append(IDM_FILE_CRC,_T(\"Calculate checksum\"));\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_CREATE_FOLDER,_T(\"Create Folder\\tF7\"));\n\t\tm->Append(IDM_CREATE_FILE,_T(\"Create File\\tCtrl+N\"));\n\t\tm->AppendSeparator();\n\t\tm->Append(IDCLOSE,_T(\"E&xit\\tAlt+F4\"));   \n\t}\n\twxMenu *m_edit = m = new wxMenu;\n\t{\n\t\tm->Append(IDM_EDIT_CUT, _T(\"Cu&t\\tCtrl+X\"))->Enable(true);              // GRAYED\n\t\t// m->Enable(IDM_EDIT_CUT, false);\n\t\tm->Append(IDM_EDIT_COPY, _T(\"&Copy\\tCtrl+C\"))->Enable(true);            // GRAYED\n\t\tm->Append(IDM_EDIT_PASTE, _T(\"&Paste\\tCtrl+V\"))->Enable(true);          // GRAYED\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_SELECT_ALL, _T(\"Select &All\\tShift+[Grey +]\")); \n\t\tm->Append(IDM_DESELECT_ALL, _T(\"Deselect All\\tShift+[Grey -]\")); \n\t\tm->Append(IDM_INVERT_SELECTION, _T(\"&Invert Selection\\tGrey *\"));   \n\t\tm->Append(IDM_SELECT, _T(\"Select...\\tGrey +\"));           \n\t\tm->Append(IDM_DESELECT, _T(\"Deselect...\\tGrey -\"));        \n\t\tm->Append(IDM_SELECT_BY_TYPE, _T(\"Select by Type\\tAlt+[Grey+]\")); \n\t\tm->Append(IDM_DESELECT_BY_TYPE, _T(\"Deselect by Type\\tAlt+[Grey -]\")); \n\t}\n\twxMenu *m_view = m = new wxMenu;\n\t{\n\t\tm->AppendRadioItem(IDM_VIEW_LARGE_ICONS, _T(\"Lar&ge Icons\\tCtrl+1\"));        \n\t\tm->AppendRadioItem(IDM_VIEW_SMALL_ICONS, _T(\"S&mall Icons\\tCtrl+2\"));      \n\t\tm->AppendRadioItem(IDM_VIEW_LIST, _T(\"&List\\tCtrl+3\"));             \n\t\tm->AppendRadioItem(IDM_VIEW_DETAILS, _T(\"&Details\\tCtrl+4\"))->Check(true);  // CHECKED\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_VIEW_ARANGE_BY_NAME, _T(\"Name\\tCtrl+F3\"));               \n\t\tm->Append(IDM_VIEW_ARANGE_BY_TYPE, _T(\"Type\\tCtrl+F4\"));             \n\t\tm->Append(IDM_VIEW_ARANGE_BY_DATE, _T(\"Date\\tCtrl+F5\"));             \n\t\tm->Append(IDM_VIEW_ARANGE_BY_SIZE, _T(\"Size\\tCtrl+F6\"));               \n\t\tm->Append(IDM_VIEW_ARANGE_NO_SORT, _T(\"Unsorted\\tCtrl+F7\"));           \n\t\tm->AppendSeparator();\n\t\tm->AppendCheckItem(IDM_VIEW_FLAT_VIEW, _T(\"Flat View\"));                   \n\t\tm->AppendCheckItem(IDM_VIEW_TWO_PANELS, _T(\"&2 Panels\\tF9\")); \n\n\t\t{\n\t\t\twxMenu* subMenu = new wxMenu;\n\t\t\tsubMenu->AppendCheckItem(IDM_VIEW_ARCHIVE_TOOLBAR, _T(\"Archive Toolbar\"));            \n\t\t\tsubMenu->AppendCheckItem(IDM_VIEW_STANDARD_TOOLBAR, _T(\"Standard Toolbar\"));            \n\t\t\tsubMenu->AppendSeparator();\n\t\t\tsubMenu->AppendCheckItem(IDM_VIEW_TOOLBARS_LARGE_BUTTONS, _T(\"Large Buttons\"));               \n\t\t\tsubMenu->AppendCheckItem(IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, _T(\"Show Buttons Text\"));           \n\t\t\tm->Append(12112, _T(\"Toolbars\"), subMenu); // FIXME ID ?\n\t\t}\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_OPEN_ROOT_FOLDER, _T(\"Open Root Folder\\t\" STRING_PATH_SEPARATOR));        \n\t\tm->Append(IDM_OPEN_PARENT_FOLDER, _T(\"Up One Level\\tBackspace\"));\n\t\tm->Append(IDM_FOLDERS_HISTORY, _T(\"Folders History...\\tAlt+F12\"));\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_VIEW_REFRESH, _T(\"&Refresh\\tCtrl+R\"));\n\t}\n\twxMenu *m_favorites = m = new wxMenu;\n\t{\n\t\t{\n\t\t\twxMenu* subMenu = new wxMenu;\n\t\t\tfor (int i = 0; i < 10; i++)\n\t\t\t{\n\t\t\t\tUString s = LangString(IDS_BOOKMARK, 0x03000720);\n\t\t\t\ts += L\" \";\n\t\t\t\twchar_t c = (wchar_t)(L'0' + i);\n\t\t\t\ts += c;\n\t\t\t\ts += L\"\\tAlt+Shift+\";\n\t\t\t\ts += c;\n\t\t\t\tsubMenu->Append( kSetBookmarkMenuID + i, wxString(s));\n\t\t\t}\n\n\t\t\tm->Append(12111, _T(\"&Add folder to Favorites as\"), subMenu); // FIXME ID ?\n\t\t}\n\t\tm->AppendSeparator();\n\t\tfor (int i = 0; i < 10; i++)\n\t\t{\n\t\t\tUString path = g_App.AppState.FastFolders.GetString(i);\n\t\t\tconst int kMaxSize = 100;\n\t\t\tconst int kFirstPartSize = kMaxSize / 2;\n\t\t\tif (path.Length() > kMaxSize)\n\t\t\t{\n\t\t\t\tpath = path.Left(kFirstPartSize) + UString(L\" ... \") +\n\t\t\t\t\tpath.Right(kMaxSize - kFirstPartSize);\n\t\t\t}\n\t\t\tUString s = path;\n\t\t\tif (s.IsEmpty())\n\t\t\t\ts = L\"-\";\n\t\t\ts += L\"\\tAlt+\";\n\t\t\ts += (wchar_t)(L'0' + i);\n\t\t\t// menu.AppendItem(MF_STRING, kOpenBookmarkMenuID + i, s);\n\t\t\tm->Append( kOpenBookmarkMenuID + i, wxString(s));\n\t\t}\n\t\t\n\t}\n\twxMenu *m_tools = m = new wxMenu;\n\t{\n\t\tm->Append(IDM_OPTIONS, _T(\"&Options...\"));\n\t\tm->Append(IDM_BENCHMARK, _T(\"&Benchmark\"));\n\t}\n\twxMenu *m_help = m = new wxMenu;\n\t{\n\t\tm->Append(IDM_HELP_CONTENTS, _T(\"&Contents...\\tF1\"));\n\t\tm->AppendSeparator();\n\t\tm->Append(IDM_ABOUT, _T(\"&About 7-Zip...\"));\n\t}\n\n\twxMenuBar *menuBar = new wxMenuBar;\n\n\tmenuBar->Append(m_file, _T(\"&File\"));\n\tmenuBar->Append(m_edit, _T(\"&Edit\"));\n\tmenuBar->Append(m_view, _T(\"&View\"));\n\tmenuBar->Append(m_favorites, _T(\"F&avorites\"));\n\tmenuBar->Append(m_tools, _T(\"&Tools\"));\n\tmenuBar->Append(m_help, _T(\"&Help\"));\n\thwnd->SetMenuBar(menuBar);\n}\n\n//////////////////////////////////////////////////////////////////\n\n\nstatic CStringTable g_stringTable[] =\n{\n  /* resource.rc */\t  \n  /***************/\n\t{ IDS_APP_TITLE, L\"7-Zip File Manager\" },\n\n\t{ IDS_COPY                , L\"Copy\" },\n\t{ IDS_MOVE                , L\"Move\" },\n\t{ IDS_COPY_TO             , L\"Copy to:\" },\n\t{ IDS_MOVE_TO             , L\"Move to:\" },\n\t{ IDS_COPYING             , L\"Copying...\" },\n\t{ IDS_MOVING              , L\"Moving...\" },\n\t{ IDS_CANNOT_COPY         , L\"You cannot move or copy items for such folders.\" },\n\t{ IDS_SPLITTING           , L\"Splitting...\" },\n\t{ IDS_SPLIT_CONFIRM_TITLE , L\"Confirm Splitting\" },\n\t{ IDS_SPLIT_CONFIRM_MESSAGE , L\"Are you sure you want to split file into {0} volumes?\" },\n\t{ IDS_SPLIT_VOL_MUST_BE_SMALLER , L\"Volume size must be smaller than size of original file\" },\n\n\t{ IDS_COMBINE             , L\"Combine Files\" },\n\t{ IDS_COMBINE_TO          , L\"&Combine to:\" },\n\t{ IDS_COMBINING           , L\"Combining...\" },\n\t{ IDS_COMBINE_SELECT_ONE_FILE , L\"Select only first file\" },\n\n\t{ IDS_CHECKSUM_CALCULATING , L\"Checksum calculating...\" },\n\t{ IDS_CHECKSUM_INFORMATION , L\"Checksum information\" },\n\t{ IDS_CHECKSUM_CRC_DATA     , L\"CRC checksum for data:\" },\n\t{ IDS_CHECKSUM_CRC_DATA_NAMES , L\"CRC checksum for data and names:\" },\n\n\t{ IDS_SCANNING , L\"Scanning...\" },\n\n\t{ IDS_PROPERTIES , L\"Properties\" },\n\n\t{ IDS_OPERATION_IS_NOT_SUPPORTED , L\"Operation is not supported.\" },\n  \n\t{ IDS_CONFIRM_FILE_DELETE , L\"Confirm File Delete\" },\n\t{ IDS_CONFIRM_FOLDER_DELETE , L\"Confirm Folder Delete\" },\n\t{ IDS_CONFIRM_ITEMS_DELETE , L\"Confirm Multiple File Delete\" },\n\t{ IDS_WANT_TO_DELETE_FILE , L\"Are you sure you want to delete '{0}'?\" },\n\t{ IDS_WANT_TO_DELETE_FOLDER , L\"Are you sure you want to delete the folder '{0}' and all its contents?\" },\n\t{ IDS_WANT_TO_DELETE_ITEMS  , L\"Are you sure you want to delete these {0} items?\" },\n\t{ IDS_DELETING            , L\"Deleting...\" },\n\t{ IDS_ERROR_DELETING      , L\"Error Deleting File or Folder\" },\n\t{ IDS_RENAMING            , L\"Renaming...\" },\n\t{ IDS_ERROR_RENAMING      , L\"Error Renaming File or Folder\" },\n\t{ IDS_CONFIRM_FILE_COPY   , L\"Confirm File Copy\" },\n\t{ IDS_WANT_TO_COPY_FILES  , L\"Are you sure you want to copy files to archive\" },\n  \n\t{ IDS_CREATE_FOLDER       , L\"Create Folder\" },\n\t{ IDS_CREATE_FOLDER_NAME  , L\"Folder name:\" },\n\t{ IDS_CREATE_FOLDER_DEFAULT_NAME , L\"New Folder\" },\n\t{ IDS_CREATE_FOLDER_ERROR , L\"Error Creating Folder\" },\n\t{ IDS_CREATE_FILE         , L\"Create File\" },\n\t{ IDS_CREATE_FILE_NAME    , L\"File Name:\" },\n\t{ IDS_CREATE_FILE_DEFAULT_NAME , L\"New File\" },\n\t{ IDS_CREATE_FILE_ERROR   , L\"Error Creating File\" },\n\t{ IDS_SELECT              , L\"Select\" },\n\t{ IDS_DESELECT            , L\"Deselect\" },\n\t{ IDS_SELECT_MASK         , L\"Mask:\" },\n\t{ IDS_FOLDERS_HISTORY     , L\"Folders History\" },\n\t{ IDS_N_SELECTED_ITEMS    , L\"{0} object(s) selected\" },\n\t{ IDS_FILES_COLON         , L\"Files:\" },\n\t{ IDS_FOLDERS_COLON       , L\"Folders:\" },\n\t{ IDS_SIZE_COLON          , L\"Size:\" },\n\n\t{ IDS_PROPERTY_TOTAL_SIZE , L\"Total Size\" },\n\t{ IDS_PROPERTY_FREE_SPACE , L\"Free Space\" },\n\t{ IDS_PROPERTY_CLUSTER_SIZE , L\"Cluster Size\" },\n\t{ IDS_PROPERTY_VOLUME_NAME , L\"Label\" },\n\t{ IDS_PROPERTY_LOCAL_NAME , L\"Local Name\" },\n\t{ IDS_PROPERTY_PROVIDER   , L\"Provider\" },\n\t{ IDS_OPTIONS             , L\"Options\" },\n\t{ IDS_COMMENT             , L\"Comment\" },\n\t{ IDS_COMMENT2            , L\"&Comment:\" },\n\t{ IDS_SYSTEM              , L\"System\" },\n\t{ IDS_TOO_MANY_ITEMS      , L\"Too many items\" },\n\t{ IDS_WANT_UPDATE_MODIFIED_FILE , L\"File '{0}' was modified.\\nDo you want to update it in the archive?\" },\n\t{ IDS_CANNOT_UPDATE_FILE  , L\"Can not update file\\n'{0}'\" },\n\t{ IDS_CANNOT_START_EDITOR , L\"Cannot start editor.\" },\n\t{ IDS_OPENNING            , L\"Opening...\" },\n\t{ IDS_ADD                 , L\"Add\" },\n\t{ IDS_EXTRACT             , L\"Extract\" },\n\t{ IDS_TEST                , L\"Test\" },\n\t{ IDS_BUTTON_COPY         , L\"Copy\" },\n\t{ IDS_BUTTON_MOVE         , L\"Move\" },\n\t{ IDS_BUTTON_DELETE       , L\"Delete\" },\n\t{ IDS_BUTTON_INFO         , L\"Info\" },\n\t{ IDS_BOOKMARK            , L\"Bookmark\" },\n\t{ IDS_COMPUTER            , L\"Computer\" },\n\t{ IDS_NETWORK             , L\"Network\" },\n\n\t{ IDS_PROGRESS_TESTING    , L\"Testing\" },\n\t{ IDS_MESSAGE_NO_ERRORS   , L\"There are no errors\" },\n \n\t{ 0 , 0 }\n};\n\nREGISTER_STRINGTABLE(g_stringTable)\n\n/////////////////////////////////////////////////////\n\n#include \"res/ParentFolder.h\"\n\n\tSevenZipPanel::SevenZipPanel(MyFrame *frame, wxWindow *parent,int id,int panelIndex) :\n\t       \twxPanel(parent,id) , m_frame(frame), _wList(0)\n\t{\n\t\t_panelIndex = panelIndex;\n\n\t\tint _baseID = id; // FIXME\n\t\tint _listID = _baseID + 1;\n\t\tint _comboBoxID = _baseID + 3;\n\t\tint _statusBarID = _comboBoxID + 1;\n\t\tint kParentFolderID = 100; // FIXME Panel.h\n\n\n\t\t///Sizer for adding the controls created by users\n\t\twxBoxSizer* pMainSizer = new wxBoxSizer(wxVERTICAL);\n\t\tint sizes[] = {150, 250, 350, -1};\n\t\twxArrayString pathArray;\n\t\twxBoxSizer *pPathSizer = new wxBoxSizer(wxHORIZONTAL);\n\t\tm_pBmpButtonParentFolder = new wxBitmapButton(this, kParentFolderID, wxGetBitmapFromMemory(PARENT_FOLDER), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW);\n\t\tm_pComboBoxPath = new wxComboBox(this, _comboBoxID, wxEmptyString, wxDefaultPosition, wxSize(300,-1), pathArray, wxCB_DROPDOWN | wxCB_SORT );\n\t\tpPathSizer->Add(m_pBmpButtonParentFolder, 0, wxALL|wxEXPAND, 0);\n\t\tpPathSizer->Add(m_pComboBoxPath, 1, wxALL|wxEXPAND, 5);\n\n\t\tm_pListCtrlExplorer = new CExplorerListCtrl(this,_listID,wxDefaultPosition, wxSize(300,300),\n\t\t\twxLC_REPORT |\n\t\t\twxSUNKEN_BORDER | wxLC_EDIT_LABELS);\n\n\t\tprintf(\"DEBUG : new CExplorerListCtrl(id=%d) => %p\\n\",_listID,m_pListCtrlExplorer);\n\n\t\tm_pStatusBar = new wxStatusBar(this, _statusBarID);\n\t\tm_pStatusBar->SetFieldsCount(4, sizes);\n\t\tpMainSizer->Add(pPathSizer, 0, wxALL|wxEXPAND, 0);\n\t\tpMainSizer->Add(m_pListCtrlExplorer, 1, wxALL|wxEXPAND, 0);\n\t\tpMainSizer->Add(m_pStatusBar, 0, wxALL|wxEXPAND, 0);\n\t\tSetSizer(pMainSizer);\n\t\tSetAutoLayout (true);\n\t\tLayout();\n\n\t\t\n\t\t// m_pListCtrlExplorer->SetDropTarget(new DnDFile(this));\n\n\t}\n\n\tvoid SevenZipPanel::OnAnyButton( wxCommandEvent &event )\n\t{\n\t\tcount++;\n\n\t\tint id = event.GetId();\n\n\t\twxString msg = wxString::Format(_T(\"P %d : button %d \\n\"), count,id);\n\n\t\tWriteText(msg);\n\n\t\t_wList->OnMessage(WM_COMMAND , id , 0);\n\t}\n\n\tvoid SevenZipPanel::OnSelected(wxListEvent& event)\n\t{\n\t\tconst wxListItem & item = event.GetItem();\n\t\tcount++;\n\n\t\twxString msg = wxString::Format(_T(\"P %d : OnSelected %d \\n\"), count,event.GetId());\n\n\t\tWriteText(msg);\n\n\t\tNMLISTVIEW info;\n\t\tinfo.hdr.hwndFrom = m_pListCtrlExplorer;\n\t\tinfo.hdr.code     = LVN_ITEMCHANGED;\n\t\tinfo.uOldState    = 0;\n\t\tinfo.uNewState    = LVIS_SELECTED;\n\t\tinfo.lParam       = item.GetData(); // event.GetIndex(); // FIXME ? event.GetData();\n\t\t_wList->OnMessage(WM_NOTIFY , event.GetId() , (LPARAM)&info);\n\t\t/*\n\t\tif ( GetWindowStyle() & wxLC_REPORT )\n\t\t{\n\t\twxListItem info;\n\t\tinfo.m_itemId = event.m_itemIndex;\n\t\tinfo.m_col = 1;\n\t\tinfo.m_mask = wxLIST_MASK_TEXT;\n\t\tif ( GetItem(info) )\n\t\t{\n\t\twxLogMessage(wxT(\"Value of the 2nd field of the selected item: %s\"),\n\t\tinfo.m_text.c_str());\n\t\t}\n\t\telse\n\t\t{\n\t\twxFAIL_MSG(wxT(\"wxListCtrl::GetItem() failed\"));\n\t\t}\n\t\t}\n\t\t*/\n\t}\n\n\tvoid SevenZipPanel::OnDeselected(wxListEvent& event)\n\t{\n\t\tconst wxListItem & item = event.GetItem();\n\t\tcount++;\n\t\twxString msg = wxString::Format(_T(\"P %d : OnDeselected %d \\n\"), count,event.GetId());\n\t\tWriteText(msg);\n\n\t\tNMLISTVIEW info;\n\t\tinfo.hdr.hwndFrom = m_pListCtrlExplorer;\n\t\tinfo.hdr.code     = LVN_ITEMCHANGED;\n\t\tinfo.uOldState    = LVIS_SELECTED;\n\t\tinfo.uNewState    = 0;\n\t\tinfo.lParam       = item.GetData(); // event.GetIndex(); // FIXME ? event.GetData();\n\t\t_wList->OnMessage(WM_NOTIFY , event.GetId() , (LPARAM)&info);\n\t}\n\n\tvoid SevenZipPanel::OnColumnClick(wxListEvent& event)\n\t{\n\t\tcount++;\n\t\twxString msg = wxString::Format(_T(\"P %d : OnColumnClick %d col=%d\\n\"), count,event.GetId(),event.GetColumn());\n\t\tWriteText(msg);\n\n\t\tNMLISTVIEW info;\n\t\tinfo.hdr.hwndFrom = m_pListCtrlExplorer;\n\t\tinfo.hdr.code     = LVN_COLUMNCLICK;\n\t\tinfo.iSubItem     = event.GetColumn();\n\t\t_wList->OnMessage(WM_NOTIFY , event.GetId() , (LPARAM)&info);\n\n\t}\n\n\n\tvoid SevenZipPanel::OnActivated(wxListEvent& event)\n\t{\n\t\tcount++;\n\n\t\tint ind = event.GetIndex();\n\n\t\tNMHDR info;\n\t\tinfo.hwndFrom = m_pListCtrlExplorer;\n\t\tinfo.code     = NM_DBLCLK;\n\t\t_wList->OnMessage(WM_NOTIFY , event.GetId() , (LPARAM)&info);\n\n\t\t/*\n\t\tif ((ind >= 0) && ( ind < m_nbDirs))\n\t\t{\n\t\t\twxString msg = wxString::Format(_T(\"P %d : OnActivated %d : DIR = %d\\n\"), count,event.GetId(),ind);\n\t\t\tWriteText(msg);\n\n\t\t\twxString name = m_pListCtrlExplorer->GetItemText(ind);\n\n\t\t\twxFileName filename (m_currentDirectory,name);\n\t\t\tBinPath(filename.GetFullPath());\n\n\t\t}\n\t\telse\n\t\t*/\n\t\t{\n\t\t\twxString msg = wxString::Format(_T(\"P %d : OnActivated %d : FILE = %d\\n\"), count,event.GetId(),ind);\n\t\t\tWriteText(msg);\n\t\t}\n\n\n\t}\n\n\tvoid SevenZipPanel::OnFocused(wxListEvent& event)\n\t{\n\t\tcount++;\n\n\t\twxString msg = wxString::Format(_T(\"P %d : OnFocused %d \\n\"), count,event.GetId());\n\n\t\tWriteText(msg);\n\n\t\tevent.Skip();\n\t}\n\n\tvoid SevenZipPanel::OnLeftDownBeginDrag(wxListEvent& event)\n\t{\n\t\tcount++;\n\n\t\twxString msg = wxString::Format(_T(\"P %d : OnLeftDownBeginDrag %d \\n\"), count,event.GetId());\n\t\tWriteText(msg);\n\n#if 0\t\t\n\t\tif (   m_pListCtrlExplorer->GetSelectedItemCount() < 1) return ;\n\n        // start drag operation\n        wxFileDataObject filesData;\n\n\n\tlong item = -1;\n    for ( ;; )\n    {\n        item = m_pListCtrlExplorer->GetNextItem(item,\n                                     wxLIST_NEXT_ALL,\n                                     wxLIST_STATE_SELECTED);\n        if ( item == -1 )\n            break;\n\n        // this item is selected - do whatever is needed with it\n        // wxLogMessage(\"Item %ld is selected.\", item);\n\t\twxString file = m_currentDirectory + _T(\"/\") + m_pListCtrlExplorer->GetItemText(item);\n\n\t\tfilesData.AddFile(file);\n\n    }\n\n\t\tmsg = wxString::Format(_T(\"P %d : wxDropSource %d \\n\"), count,event.GetId());\n\t\tWriteText(msg);\n\n        wxDropSource source(filesData, this,\n                            wxDROP_ICON(dnd_copy),\n                            wxDROP_ICON(dnd_move),\n                            wxDROP_ICON(dnd_none));\n\n        int flags = 0;\n\t\t/*\n        if ( m_moveByDefault )\n            flags |= wxDrag_DefaultMove;\n        else if ( m_moveAllow )\n            flags |= wxDrag_AllowMove;\n\t\t\t*/\n\t\tflags |= wxDrag_AllowMove;\n\n\t\tmsg = wxString::Format(_T(\"P %d : DoDragDrop %d \\n\"), count,event.GetId());\n\t\tWriteText(msg);\n\n\n        wxDragResult result = source.DoDragDrop(flags);\n\n\n        const wxChar *pc;\n        switch ( result )\n        {\n            case wxDragError:   pc = _T(\"Error!\");    break;\n            case wxDragNone:    pc = _T(\"Nothing\");   break;\n            case wxDragCopy:    pc = _T(\"Copied\");    break;\n            case wxDragMove:    pc = _T(\"Moved\");     break;\n            case wxDragCancel:  pc = _T(\"Cancelled\"); break;\n            default:            pc = _T(\"Huh?\");      break;\n        }\n\n        WriteText(wxString(_T(\"    Drag result: \")) + pc);\n#endif\n\t}\n\nvoid SevenZipPanel::OnLeftDown(wxMouseEvent &WXUNUSED(event) )\n{\n\tWriteText(_T(\"OnLeftDown\"));\n#if 0\n    if ( !m_strText.empty() )\n    {\n        // start drag operation\n        wxTextDataObject textData(m_strText);\n        wxDropSource source(textData, this,\n                            wxDROP_ICON(dnd_copy),\n                            wxDROP_ICON(dnd_move),\n                            wxDROP_ICON(dnd_none));\n\n        int flags = 0;\n        if ( m_moveByDefault )\n            flags |= wxDrag_DefaultMove;\n        else if ( m_moveAllow )\n            flags |= wxDrag_AllowMove;\n\n        wxDragResult result = source.DoDragDrop(flags);\n\n#if wxUSE_STATUSBAR\n        const wxChar *pc;\n        switch ( result )\n        {\n            case wxDragError:   pc = _T(\"Error!\");    break;\n            case wxDragNone:    pc = _T(\"Nothing\");   break;\n            case wxDragCopy:    pc = _T(\"Copied\");    break;\n            case wxDragMove:    pc = _T(\"Moved\");     break;\n            case wxDragCancel:  pc = _T(\"Cancelled\"); break;\n            default:            pc = _T(\"Huh?\");      break;\n        }\n\n        SetStatusText(wxString(_T(\"Drag result: \")) + pc);\n#else\n        wxUnusedVar(result);\n#endif // wxUSE_STATUSBAR\n    }\n#endif // wxUSE_DRAG_AND_DROP\n}\n\nvoid SevenZipPanel::OnRightClick(wxListEvent& event)\n{\n\twxPoint point = event.GetPoint(); \n\n\tWriteText(_T(\"OnRightClick\"));\n    wxMenu menu; // (_T(\"Dnd sample menu\"));\n\n    menu.Append(wxID_ANY, _T(\"&Test drag...\"));\n    menu.AppendSeparator();\n    menu.Append(wxID_ANY, _T(\"item1\"));\n    menu.Append(wxID_ANY, _T(\"item2\"));\n    menu.Append(wxID_ANY, _T(\"item3\"));\n    menu.Append(wxID_ANY, _T(\"&About\"));\n\n    PopupMenu( &menu, point.x, point.y );\n}\n\nint SevenZipPanel::count = 0;\n\nBEGIN_EVENT_TABLE(SevenZipPanel, wxPanel)\n// EVT_MENU(wxID_ANY, SevenZipPanel::OnAnyMenu)\n// EVT_LISTBOX   (wxID_ANY,       MyPanel::OnListBox)\n// EVT_LISTBOX_DCLICK(wxID_ANY,          MyPanel::OnAnyListBoxDoubleClick)\nEVT_BUTTON    (wxID_ANY,      SevenZipPanel::OnAnyButton)\n\n // EVT_CLOSE(SevenZipPanel::OnCloseWindow)\n\n/////////////////\nEVT_LIST_ITEM_SELECTED(wxID_ANY,   SevenZipPanel::OnSelected)\nEVT_LIST_ITEM_DESELECTED(wxID_ANY, SevenZipPanel::OnDeselected)\nEVT_LIST_ITEM_ACTIVATED(wxID_ANY,  SevenZipPanel::OnActivated)\nEVT_LIST_ITEM_FOCUSED(wxID_ANY,  SevenZipPanel::OnFocused)\n\nEVT_LIST_BEGIN_DRAG(wxID_ANY, SevenZipPanel::OnLeftDownBeginDrag)\nEVT_LIST_ITEM_RIGHT_CLICK(wxID_ANY, SevenZipPanel::OnRightClick)\n\nEVT_LIST_COL_CLICK(wxID_ANY, SevenZipPanel::OnColumnClick)\n\nEND_EVENT_TABLE()\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FSDrives.h.out",
    "content": "// FSDrives.h\n\n#ifndef __FSDRIVES_H\n#define __FSDRIVES_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Types.h\"\n#include \"Common/MyCom.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"IFolder.h\"\n\nstruct CDriveInfo\n{\n  UString Name;\n  UString FullSystemName;\n  bool KnownSizes;\n  UInt64 DriveSize;\n  UInt64 FreeSpace;\n  UInt64 ClusterSize;\n  UString Type;\n  UString VolumeName;\n  UString FileSystemName;\n};\n\nclass CFSDrives:\n  public IFolderFolder,\n  public IFolderGetSystemIconIndex,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(\n    IFolderGetSystemIconIndex\n  )\n\n  INTERFACE_FolderFolder(;)\n\n  STDMETHOD(GetSystemIconIndex)(UInt32 index, INT32 *iconIndex);\n\nprivate:\n  HRESULT BindToFolderSpec(const wchar_t *name, IFolderFolder **resultFolder);\n  CObjectVector<CDriveInfo> _drives;\n  bool _volumeMode;\npublic:\n  void Init() { _volumeMode = false;}\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FSFolder.cpp",
    "content": "// FSFolder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"FSFolder.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/UTFConvert.h\"\n#include \"Common/ComTry.h\"\n\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileIO.h\"\n\n#include \"../../PropID.h\"\n\n#include \"SysIconUtils.h\"\n#ifdef _WIN32\n#include \"FSDrives.h\"\n#include \"NetFolder.h\"\n#endif\n\nnamespace NWindows {\nnamespace NFile {\n\nbool GetLongPath(LPCWSTR path, UString &longPath);\n\n}}\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NFind;\n\nnamespace NFsFolder {\n\nstatic STATPROPSTG kProperties[] =\n{\n  { NULL, kpidName, VT_BSTR},\n  // { NULL, kpidIsDir, VT_BOOL},\n  { NULL, kpidSize, VT_UI8},\n  { NULL, kpidMTime, VT_FILETIME},\n  { NULL, kpidCTime, VT_FILETIME},\n  { NULL, kpidATime, VT_FILETIME},\n  { NULL, kpidAttrib, VT_UI4},\n  { NULL, kpidPackSize, VT_UI8},\n  { NULL, kpidComment, VT_BSTR},\n  { NULL, kpidPrefix, VT_BSTR}\n};\n\nHRESULT CFSFolder::Init(const UString &path, IFolderFolder *parentFolder)\n{\n  _parentFolder = parentFolder;\n  _path = path;\n\n#ifdef _WIN32\n  _findChangeNotification.FindFirst(_path, false,\n      FILE_NOTIFY_CHANGE_FILE_NAME |\n      FILE_NOTIFY_CHANGE_DIR_NAME |\n      FILE_NOTIFY_CHANGE_ATTRIBUTES |\n      FILE_NOTIFY_CHANGE_SIZE |\n      FILE_NOTIFY_CHANGE_LAST_WRITE /*|\n      FILE_NOTIFY_CHANGE_LAST_ACCESS |\n      FILE_NOTIFY_CHANGE_CREATION |\n      FILE_NOTIFY_CHANGE_SECURITY */);\n  if (!_findChangeNotification.IsHandleAllocated())\n  {\n    DWORD lastError = GetLastError();\n    CFindFile findFile;\n    CFileInfoW fileInfo;\n    if (!findFile.FindFirst(_path + UString(L\"*\"), fileInfo))\n      return lastError;\n  }\n#endif\n  return S_OK;\n}\n\nHRESULT GetFolderSize(const UString &path, UInt64 &numFolders, UInt64 &numFiles, UInt64 &size, IProgress *progress)\n{\n  RINOK(progress->SetCompleted(NULL));\n  numFiles = numFolders = size = 0;\n  CEnumeratorW enumerator(path + UString(WSTRING_PATH_SEPARATOR L\"*\"));\n  CFileInfoW fileInfo;\n  while (enumerator.Next(fileInfo))\n  {\n    if (fileInfo.IsDir())\n    {\n      UInt64 subFolders, subFiles, subSize;\n      RINOK(GetFolderSize(path + UString(WSTRING_PATH_SEPARATOR) + fileInfo.Name, subFolders, subFiles, subSize, progress));\n      numFolders += subFolders;\n      numFolders++;\n      numFiles += subFiles;\n      size += subSize;\n    }\n    else\n    {\n      numFiles++;\n      size += fileInfo.Size;\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CFSFolder::LoadSubItems(CDirItem &dirItem, const UString &path)\n{\n  {\n    CEnumeratorW enumerator(path + L\"*\");\n    CDirItem fileInfo;\n    while (enumerator.Next(fileInfo))\n    {\n      fileInfo.CompressedSizeIsDefined = false;\n      /*\n      if (!GetCompressedFileSize(_path + fileInfo.Name,\n      fileInfo.CompressedSize))\n      fileInfo.CompressedSize = fileInfo.Size;\n      */\n      if (fileInfo.IsDir())\n      {\n        // fileInfo.Size = GetFolderSize(_path + fileInfo.Name);\n        fileInfo.Size = 0;\n      }\n      dirItem.Files.Add(fileInfo);\n    }\n  }\n  if (!_flatMode)\n    return S_OK;\n\n  for (int i = 0; i < dirItem.Files.Size(); i++)\n  {\n    CDirItem &item = dirItem.Files[i];\n    if (item.IsDir())\n      LoadSubItems(item, path + item.Name + WCHAR_PATH_SEPARATOR);\n  }\n  return S_OK;\n}\n\nvoid CFSFolder::AddRefs(CDirItem &dirItem)\n{\n  int i;\n  for (i = 0; i < dirItem.Files.Size(); i++)\n  {\n    CDirItem &item = dirItem.Files[i];\n    item.Parent = &dirItem;\n    _refs.Add(&item);\n  }\n  if (!_flatMode)\n    return;\n  for (i = 0; i < dirItem.Files.Size(); i++)\n  {\n    CDirItem &item = dirItem.Files[i];\n    if (item.IsDir())\n      AddRefs(item);\n  }\n}\n\nSTDMETHODIMP CFSFolder::LoadItems()\n{\n  // OutputDebugString(TEXT(\"Start\\n\"));\n  INT32 dummy;\n  WasChanged(&dummy);\n  Clear();\n  RINOK(LoadSubItems(_root, _path));\n  AddRefs(_root);\n\n  // OutputDebugString(TEXT(\"Finish\\n\"));\n  _commentsAreLoaded = false;\n  return S_OK;\n}\n\nstatic const wchar_t *kDescriptionFileName = L\"descript.ion\";\n\nbool CFSFolder::LoadComments()\n{\n  if (_commentsAreLoaded)\n    return true;\n  _comments.Clear();\n  _commentsAreLoaded = true;\n  NIO::CInFile file;\n  if (!file.Open(_path + kDescriptionFileName))\n    return false;\n  UInt64 length;\n  if (!file.GetLength(length))\n    return false;\n  if (length >= (1 << 28))\n    return false;\n  AString s;\n  char *p = s.GetBuffer((int)((size_t)length + 1));\n  UInt32 processedSize;\n  file.Read(p, (UInt32)length, processedSize);\n  p[length] = 0;\n  s.ReleaseBuffer();\n  if (processedSize != length)\n    return false;\n  file.Close();\n  UString unicodeString;\n  if (!ConvertUTF8ToUnicode(s, unicodeString))\n    return false;\n  return _comments.ReadFromString(unicodeString);\n}\n\nstatic bool IsAscii(const UString &testString)\n{\n  for (int i = 0; i < testString.Length(); i++)\n    if (testString[i] >= 0x80)\n      return false;\n  return true;\n}\n\nbool CFSFolder::SaveComments()\n{\n  NIO::COutFile file;\n  if (!file.Create(_path + kDescriptionFileName, true))\n    return false;\n  UString unicodeString;\n  _comments.SaveToString(unicodeString);\n  AString utfString;\n  ConvertUnicodeToUTF8(unicodeString, utfString);\n  UInt32 processedSize;\n  if (!IsAscii(unicodeString))\n  {\n    Byte bom [] = { 0xEF, 0xBB, 0xBF, 0x0D, 0x0A };\n    file.Write(bom , sizeof(bom), processedSize);\n  }\n  file.Write(utfString, utfString.Length(), processedSize);\n  _commentsAreLoaded = false;\n  return true;\n}\n\nSTDMETHODIMP CFSFolder::GetNumberOfItems(UInt32 *numItems)\n{\n  *numItems = _refs.Size();\n  return S_OK;\n}\n\n/*\nSTDMETHODIMP CFSFolder::GetNumberOfSubFolders(UInt32 *numSubFolders)\n{\n  UInt32 numSubFoldersLoc = 0;\n  for (int i = 0; i < _files.Size(); i++)\n    if (_files[i].IsDir())\n      numSubFoldersLoc++;\n  *numSubFolders = numSubFoldersLoc;\n  return S_OK;\n}\n*/\n\n#ifdef _WIN32\nbool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size)\n{\n  DWORD highPart;\n  DWORD lowPart = ::GetCompressedFileSizeW(fileName, &highPart);\n  if (lowPart == INVALID_FILE_SIZE && ::GetLastError() != NO_ERROR)\n  {\n    #ifdef WIN_LONG_PATH\n    {\n      UString longPath;\n      if (GetLongPath(fileName, longPath))\n        lowPart = ::GetCompressedFileSizeW(longPath, &highPart);\n    }\n    #endif\n    if (lowPart == INVALID_FILE_SIZE && ::GetLastError() != NO_ERROR)\n      return false;\n  }\n  size = (UInt64(highPart) << 32) | lowPart;\n  return true;\n}\n#endif\n\nSTDMETHODIMP CFSFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value)\n{\n  NCOM::CPropVariant prop;\n  if (itemIndex >= (UInt32)_refs.Size())\n    return E_INVALIDARG;\n  CDirItem &fileInfo = *_refs[itemIndex];\n  switch(propID)\n  {\n    case kpidIsDir:  prop = fileInfo.IsDir(); break;\n    case kpidName:  prop = fileInfo.Name; break;\n    case kpidSize:  if (!fileInfo.IsDir()) prop = fileInfo.Size; break;\n    case kpidPackSize:\n      if (!fileInfo.CompressedSizeIsDefined)\n      {\n        fileInfo.CompressedSizeIsDefined = true;\n#ifdef _WIN32\n        if (fileInfo.IsDir () ||\n            !MyGetCompressedFileSizeW(_path + GetRelPath(fileInfo), fileInfo.CompressedSize))\n#endif\n          fileInfo.CompressedSize = fileInfo.Size;\n      }\n      prop = fileInfo.CompressedSize;\n      break;\n    case kpidAttrib: prop = (UInt32)fileInfo.Attrib; break;\n    case kpidCTime: prop = fileInfo.CTime; break;\n    case kpidATime: prop = fileInfo.ATime; break;\n    case kpidMTime: prop = fileInfo.MTime; break;\n    case kpidComment:\n    {\n      LoadComments();\n      UString comment;\n      if (_comments.GetValue(GetRelPath(fileInfo), comment))\n        prop = comment;\n      break;\n    }\n    case kpidPrefix:\n    {\n      if (_flatMode)\n      {\n        prop = GetPrefix(fileInfo);\n      }\n      break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nHRESULT CFSFolder::BindToFolderSpec(const wchar_t *name, IFolderFolder **resultFolder)\n{\n  *resultFolder = 0;\n  CFSFolder *folderSpec = new CFSFolder;\n  CMyComPtr<IFolderFolder> subFolder = folderSpec;\n  RINOK(folderSpec->Init(_path + name + UString(WCHAR_PATH_SEPARATOR), 0));\n  *resultFolder = subFolder.Detach();\n  return S_OK;\n}\n\nUString CFSFolder::GetPrefix(const CDirItem &item) const\n{\n  UString path;\n  CDirItem *cur = item.Parent;\n  while (cur->Parent != 0)\n  {\n    path = cur->Name + UString(WCHAR_PATH_SEPARATOR) + path;\n    cur = cur->Parent;\n  }\n  return path;\n}\n\nUString CFSFolder::GetRelPath(const CDirItem &item) const\n{\n  return GetPrefix(item) + item.Name;\n}\n\nSTDMETHODIMP CFSFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder)\n{\n  *resultFolder = 0;\n  const CDirItem &fileInfo = *_refs[index];\n  if (!fileInfo.IsDir())\n    return E_INVALIDARG;\n  return BindToFolderSpec(GetRelPath(fileInfo), resultFolder);\n}\n\nSTDMETHODIMP CFSFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder)\n{\n  return BindToFolderSpec(name, resultFolder);\n}\n\nSTDMETHODIMP CFSFolder::BindToParentFolder(IFolderFolder **resultFolder)\n{\n  *resultFolder = 0;\n  if (_parentFolder)\n  {\n    CMyComPtr<IFolderFolder> parentFolder = _parentFolder;\n    *resultFolder = parentFolder.Detach();\n    return S_OK;\n  }\n  if (_path.IsEmpty())\n    return E_INVALIDARG;\n  printf(\"CFSFolder::BindToParentFolder path='%ls'\\n\",(const wchar_t *)_path);\n  int pos = _path.ReverseFind(WCHAR_PATH_SEPARATOR);\n  if (pos < 0 || pos != _path.Length() - 1)\n    return E_FAIL;\n  UString parentPath = _path.Left(pos);\n  printf(\"CFSFolder::BindToParentFolder parentPath='%ls'\\n\",(const wchar_t *)parentPath);\n  pos = parentPath.ReverseFind(WCHAR_PATH_SEPARATOR);\n  if (pos < 0)\n  {\n#ifdef _WIN32\n    parentPath.Empty();\n    CFSDrives *drivesFolderSpec = new CFSDrives;\n    CMyComPtr<IFolderFolder> drivesFolder = drivesFolderSpec;\n    drivesFolderSpec->Init();\n    *resultFolder = drivesFolder.Detach();\n#else\n    parentPath = WSTRING_PATH_SEPARATOR;\n    CFSFolder *parentFolderSpec = new CFSFolder;\n    CMyComPtr<IFolderFolder> parentFolder = parentFolderSpec;\n    printf(\"CFSFolder::BindToParentFolder Init-0 with parentPath='%ls'\\n\",(const wchar_t *)parentPath);\n    RINOK(parentFolderSpec->Init(parentPath, 0));\n    *resultFolder = parentFolder.Detach();\n#endif\n    return S_OK;\n  }\n  UString parentPathReduced = parentPath.Left(pos);\n  parentPath = parentPath.Left(pos + 1);\n  pos = parentPathReduced.ReverseFind(WCHAR_PATH_SEPARATOR);\n  if (pos == 1)\n  {\n#ifdef _WIN32\n    if (parentPath[0] != WCHAR_PATH_SEPARATOR)\n      return E_FAIL;\n    CNetFolder *netFolderSpec = new CNetFolder;\n    CMyComPtr<IFolderFolder> netFolder = netFolderSpec;\n    netFolderSpec->Init(parentPath);\n    *resultFolder = netFolder.Detach();\n#else\n    parentPath = WSTRING_PATH_SEPARATOR;\n    CFSFolder *parentFolderSpec = new CFSFolder;\n    CMyComPtr<IFolderFolder> parentFolder = parentFolderSpec;\n    printf(\"CFSFolder::BindToParentFolder Init-1 with parentPath='%ls'\\n\",(const wchar_t *)parentPath);\n    RINOK(parentFolderSpec->Init(parentPath, 0));\n    *resultFolder = parentFolder.Detach();\n#endif // ifdef _WIN32\n    return S_OK;\n  }\n  CFSFolder *parentFolderSpec = new CFSFolder;\n  CMyComPtr<IFolderFolder> parentFolder = parentFolderSpec;\n  printf(\"CFSFolder::BindToParentFolder Init-2 with parentPath='%ls'\\n\",(const wchar_t *)parentPath);\n  RINOK(parentFolderSpec->Init(parentPath, 0));\n  *resultFolder = parentFolder.Detach();\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::GetNumberOfProperties(UInt32 *numProperties)\n{\n  *numProperties = sizeof(kProperties) / sizeof(kProperties[0]);\n  if (!_flatMode)\n    (*numProperties)--;\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::GetPropertyInfo(UInt32 index,\n    BSTR *name, PROPID *propID, VARTYPE *varType)\n{\n  if (index >= sizeof(kProperties) / sizeof(kProperties[0]))\n    return E_INVALIDARG;\n  const STATPROPSTG &prop = kProperties[index];\n  *propID = prop.propid;\n  *varType = prop.vt;\n  *name = 0;\n  return S_OK;\n}\n\n\nSTDMETHODIMP CFSFolder::GetFolderProperty(PROPID propID, PROPVARIANT *value)\n{\n  COM_TRY_BEGIN\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidType: prop = L\"FSFolder\"; break;\n    case kpidPath: prop = _path; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n  COM_TRY_END\n}\n\nSTDMETHODIMP CFSFolder::WasChanged(INT32 *wasChanged)\n{\n  bool wasChangedMain = false;\n#ifdef _WIN32\n  for (;;)\n  {\n    if (!_findChangeNotification.IsHandleAllocated())\n    {\n      *wasChanged = BoolToInt(false);\n      return S_OK;\n    }\n\n    DWORD waitResult = ::WaitForSingleObject(_findChangeNotification, 0);\n    bool wasChangedLoc = (waitResult == WAIT_OBJECT_0);\n    if (wasChangedLoc)\n    {\n      _findChangeNotification.FindNext();\n      wasChangedMain = true;\n    }\n    else\n      break;\n  }\n#endif\n  *wasChanged = BoolToInt(wasChangedMain);\n  return S_OK;\n}\n \nSTDMETHODIMP CFSFolder::Clone(IFolderFolder **resultFolder)\n{\n  CFSFolder *fsFolderSpec = new CFSFolder;\n  CMyComPtr<IFolderFolder> folderNew = fsFolderSpec;\n  fsFolderSpec->Init(_path, 0);\n  *resultFolder = folderNew.Detach();\n  return S_OK;\n}\n\nHRESULT CFSFolder::GetItemsFullSize(const UInt32 *indices, UInt32 numItems,\n    UInt64 &numFolders, UInt64 &numFiles, UInt64 &size, IProgress *progress)\n{\n  numFiles = numFolders = size = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n  {\n    int index = indices[i];\n    if (index >= _refs.Size())\n      return E_INVALIDARG;\n    const CDirItem &fileInfo = *_refs[index];\n    if (fileInfo.IsDir())\n    {\n      UInt64 subFolders, subFiles, subSize;\n      RINOK(GetFolderSize(_path + GetRelPath(fileInfo), subFolders, subFiles, subSize, progress));\n      numFolders += subFolders;\n      numFolders++;\n      numFiles += subFiles;\n      size += subSize;\n    }\n    else\n    {\n      numFiles++;\n      size += fileInfo.Size;\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CFSFolder::GetItemFullSize(int index, UInt64 &size, IProgress *progress)\n{\n  const CDirItem &fileInfo = *_refs[index];\n  if (fileInfo.IsDir())\n  {\n    /*\n    CMyComPtr<IFolderFolder> subFolder;\n    RINOK(BindToFolder(index, &subFolder));\n    CMyComPtr<IFolderReload> aFolderReload;\n    subFolder.QueryInterface(&aFolderReload);\n    aFolderReload->Reload();\n    UInt32 numItems;\n    RINOK(subFolder->GetNumberOfItems(&numItems));\n    CMyComPtr<IFolderGetItemFullSize> aGetItemFullSize;\n    subFolder.QueryInterface(&aGetItemFullSize);\n    for (UInt32 i = 0; i < numItems; i++)\n    {\n      UInt64 size;\n      RINOK(aGetItemFullSize->GetItemFullSize(i, &size));\n      *totalSize += size;\n    }\n    */\n    UInt64 numFolders, numFiles;\n    return GetFolderSize(_path + GetRelPath(fileInfo), numFolders, numFiles, size, progress);\n  }\n  size = fileInfo.Size;\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::GetItemFullSize(UInt32 index, PROPVARIANT *value, IProgress *progress)\n{\n  NCOM::CPropVariant prop;\n  if (index >= (UInt32)_refs.Size())\n    return E_INVALIDARG;\n  UInt64 size = 0;\n  HRESULT result = GetItemFullSize(index, size, progress);\n  prop = size;\n  prop.Detach(value);\n  return result;\n}\n\nHRESULT CFSFolder::GetComplexName(const wchar_t *name, UString &resultPath)\n{\n  UString newName = name;\n  resultPath = _path + newName;\n  if (newName.Length() < 1)\n    return S_OK;\n  if (newName[0] == WCHAR_PATH_SEPARATOR)\n  {\n    resultPath = newName;\n    return S_OK;\n  }\n  if (newName.Length() < 2)\n    return S_OK;\n  if (newName[1] == L':')\n    resultPath = newName;\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::CreateFolder(const wchar_t *name, IProgress * /* progress */)\n{\n  UString processedName;\n  RINOK(GetComplexName(name, processedName));\n  if(NDirectory::MyCreateDirectory(processedName))\n    return S_OK;\n  if(::GetLastError() == ERROR_ALREADY_EXISTS)\n    return ::GetLastError();\n  if (!NDirectory::CreateComplexDirectory(processedName))\n    return ::GetLastError();\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::CreateFile(const wchar_t *name, IProgress * /* progress */)\n{\n  UString processedName;\n  RINOK(GetComplexName(name, processedName));\n  NIO::COutFile outFile;\n  if (!outFile.Create(processedName, false))\n    return ::GetLastError();\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::Rename(UInt32 index, const wchar_t *newName, IProgress * /* progress */)\n{\n  const CDirItem &fileInfo = *_refs[index];\n  const UString fullPrefix = _path + GetPrefix(fileInfo);\n  if (!NDirectory::MyMoveFile(fullPrefix + fileInfo.Name, fullPrefix + newName))\n    return GetLastError();\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::Delete(const UInt32 *indices, UInt32 numItems,IProgress *progress)\n{\n#ifdef _WIN32\n  RINOK(progress->SetTotal(numItems));\n  for (UInt32 i = 0; i < numItems; i++)\n  {\n    const CDirItem &fileInfo = *_refs[indices[i]];\n    const UString fullPath = _path + GetRelPath(fileInfo);\n    bool result;\n    if (fileInfo.IsDir())\n      result = NDirectory::RemoveDirectoryWithSubItems(fullPath);\n    else\n      result = NDirectory::DeleteFileAlways(fullPath);\n    if (!result)\n      return GetLastError();\n    UInt64 completed = i;\n    RINOK(progress->SetCompleted(&completed));\n  }\n#endif\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::SetProperty(UInt32 index, PROPID propID,\n    const PROPVARIANT *value, IProgress * /* progress */)\n{\n  if (index >= (UInt32)_refs.Size())\n    return E_INVALIDARG;\n  CDirItem &fileInfo = *_refs[index];\n  if (fileInfo.Parent->Parent != 0)\n    return E_NOTIMPL;\n  switch(propID)\n  {\n    case kpidComment:\n    {\n      UString filename = fileInfo.Name;\n      filename.Trim();\n      if (value->vt == VT_EMPTY)\n        _comments.DeletePair(filename);\n      else if (value->vt == VT_BSTR)\n      {\n        CTextPair pair;\n        pair.ID = filename;\n        pair.ID.Trim();\n        pair.Value = value->bstrVal;\n        pair.Value.Trim();\n        if (pair.Value.IsEmpty())\n          _comments.DeletePair(filename);\n        else\n          _comments.AddPair(pair);\n      }\n      else\n        return E_INVALIDARG;\n      SaveComments();\n      break;\n    }\n    default:\n      return E_NOTIMPL;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::GetSystemIconIndex(UInt32 index, INT32 *iconIndex)\n{\n#ifdef _WIN32\n  if (index >= (UInt32)_refs.Size())\n    return E_INVALIDARG;\n  const CDirItem &fileInfo = *_refs[index];\n  *iconIndex = 0;\n  int iconIndexTemp;\n  if (GetRealIconIndex(_path + GetRelPath(fileInfo), fileInfo.Attributes, iconIndexTemp) != 0)\n  {\n    *iconIndex = iconIndexTemp;\n    return S_OK;\n  }\n  return GetLastError();\n#endif\n  *iconIndex = 0;\n    return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::SetFlatMode(Int32 flatMode)\n{\n  _flatMode = IntToBool(flatMode);\n  return S_OK;\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FSFolder.h",
    "content": "// FSFolder.h\n\n#ifndef __FSFOLDER_H\n#define __FSFOLDER_H\n\n#include \"Common/MyString.h\"\n#include \"Common/MyCom.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"IFolder.h\"\n\n#include \"TextPairs.h\"\n\nnamespace NFsFolder {\n\nclass CFSFolder;\n\nstruct CFileInfoEx: public NWindows::NFile::NFind::CFileInfoW\n{\n  bool CompressedSizeIsDefined;\n  UInt64 CompressedSize;\n};\n\nstruct CDirItem;\n\nstruct CDirItem: public CFileInfoEx\n{\n  CDirItem *Parent;\n  CObjectVector<CDirItem> Files;\n\n  CDirItem(): Parent(0) {}\n  void Clear()\n  {\n    Files.Clear();\n    Parent = 0;\n  }\n};\n\nclass CFSFolder:\n  public IFolderFolder,\n  public IFolderWasChanged,\n  public IFolderOperations,\n  // public IFolderOperationsDeleteToRecycleBin,\n  public IFolderGetItemFullSize,\n  public IFolderClone,\n  public IFolderGetSystemIconIndex,\n  public IFolderSetFlatMode,\n  public CMyUnknownImp\n{\n  UInt64 GetSizeOfItem(int anIndex) const;\npublic:\n  MY_QUERYINTERFACE_BEGIN\n    MY_QUERYINTERFACE_ENTRY(IFolderWasChanged)\n    // MY_QUERYINTERFACE_ENTRY(IFolderOperationsDeleteToRecycleBin)\n    MY_QUERYINTERFACE_ENTRY(IFolderOperations)\n    MY_QUERYINTERFACE_ENTRY(IFolderGetItemFullSize)\n    MY_QUERYINTERFACE_ENTRY(IFolderClone)\n    MY_QUERYINTERFACE_ENTRY(IFolderGetSystemIconIndex)\n    MY_QUERYINTERFACE_ENTRY(IFolderSetFlatMode)\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n\n  INTERFACE_FolderFolder(;)\n  INTERFACE_FolderOperations(;)\n\n  STDMETHOD(WasChanged)(INT32 *wasChanged);\n  STDMETHOD(Clone)(IFolderFolder **resultFolder);\n  STDMETHOD(GetItemFullSize)(UInt32 index, PROPVARIANT *value, IProgress *progress);\n\n  STDMETHOD(SetFlatMode)(Int32 flatMode);\n\n  STDMETHOD(GetSystemIconIndex)(UInt32 index, INT32 *iconIndex);\n\nprivate:\n  UString _path;\n  CDirItem _root;\n  CRecordVector<CDirItem *> _refs;\n\n  CMyComPtr<IFolderFolder> _parentFolder;\n\n  bool _commentsAreLoaded;\n  CPairsStorage _comments;\n\n  bool _flatMode;\n\n  // FIXME NWindows::NFile::NFind::CFindChangeNotification _findChangeNotification;\n\n  HRESULT GetItemsFullSize(const UInt32 *indices, UInt32 numItems,\n      UInt64 &numFolders, UInt64 &numFiles, UInt64 &size, IProgress *progress);\n  HRESULT GetItemFullSize(int index, UInt64 &size, IProgress *progress);\n  HRESULT GetComplexName(const wchar_t *name, UString &resultPath);\n  HRESULT BindToFolderSpec(const wchar_t *name, IFolderFolder **resultFolder);\n\n  bool LoadComments();\n  bool SaveComments();\n  HRESULT LoadSubItems(CDirItem &dirItem, const UString &path);\n  void AddRefs(CDirItem &dirItem);\npublic:\n  HRESULT Init(const UString &path, IFolderFolder *parentFolder);\n\n  CFSFolder() : _flatMode(false) {}\n\n  UString GetPrefix(const CDirItem &item) const;\n  UString GetRelPath(const CDirItem &item) const;\n  UString GetRelPath(UInt32 index) const { return GetRelPath(*_refs[index]); }\n\n  void Clear()\n  {\n    _root.Clear();\n    _refs.Clear();\n  }\n};\n\nHRESULT GetFolderSize(const UString &path, UInt64 &numFolders, UInt64 &numFiles, UInt64 &size, IProgress *progress);\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FSFolderCopy.cpp",
    "content": "// FSFolderCopy.cpp\n\n#include \"StdAfx.h\"\n\n// FIXME #include <Winbase.h>\n\n#include \"FSFolder.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/Error.h\"\n\n#include \"Common/StringConvert.h\"\n\n#include \"../../Common/FilePathAutoRename.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NFind;\n\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\nnamespace NFsFolder {\n\n/*\nstatic bool IsItWindows2000orHigher()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo))\n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) &&\n      (versionInfo.dwMajorVersion >= 5);\n}\n*/\n\nstruct CProgressInfo\n{\n  UInt64 StartPos;\n  IProgress *Progress;\n};\n\n#ifdef _WIN32\n\nstatic DWORD CALLBACK CopyProgressRoutine(\n  LARGE_INTEGER /* TotalFileSize */,          // file size\n  LARGE_INTEGER TotalBytesTransferred,  // bytes transferred\n  LARGE_INTEGER /* StreamSize */,             // bytes in stream\n  LARGE_INTEGER /* StreamBytesTransferred */, // bytes transferred for stream\n  DWORD /* dwStreamNumber */,                 // current stream\n  DWORD /* dwCallbackReason */,               // callback reason\n  HANDLE /* hSourceFile */,                   // handle to source file\n  HANDLE /* hDestinationFile */,              // handle to destination file\n  LPVOID lpData                         // from CopyFileEx\n)\n{\n  CProgressInfo &progressInfo = *(CProgressInfo *)lpData;\n  UInt64 completed = progressInfo.StartPos + TotalBytesTransferred.QuadPart;\n  if (progressInfo.Progress->SetCompleted(&completed) != S_OK)\n    return PROGRESS_CANCEL;\n  return PROGRESS_CONTINUE;\n}\n\ntypedef BOOL (WINAPI * CopyFileExPointer)(\n    IN LPCSTR lpExistingFileName,\n    IN LPCSTR lpNewFileName,\n    IN LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL,\n    IN LPVOID lpData OPTIONAL,\n    IN LPBOOL pbCancel OPTIONAL,\n    IN DWORD dwCopyFlags\n    );\n\ntypedef BOOL (WINAPI * CopyFileExPointerW)(\n    IN LPCWSTR lpExistingFileName,\n    IN LPCWSTR lpNewFileName,\n    IN LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL,\n    IN LPVOID lpData OPTIONAL,\n    IN LPBOOL pbCancel OPTIONAL,\n    IN DWORD dwCopyFlags\n    );\n\n#ifndef _UNICODE\nstatic inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; }\nstatic CSysString GetSysPath(LPCWSTR sysPath)\n  { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); }\n#endif\n\n#endif\n\nstatic bool MyCopyFile(LPCWSTR existingFile, LPCWSTR newFile, IProgress *progress, UInt64 &completedSize)\n{\n#ifdef _WIN32\n  CProgressInfo progressInfo;\n  progressInfo.Progress = progress;\n  progressInfo.StartPos = completedSize;\n  BOOL CancelFlag = FALSE;\n  #ifndef _UNICODE\n  if (g_IsNT)\n  #endif\n  {\n    CopyFileExPointerW copyFunctionW = (CopyFileExPointerW)\n        ::GetProcAddress(::GetModuleHandleW(L\"kernel32.dll\"),\n        \"CopyFileExW\");\n    if (copyFunctionW == 0)\n      return false;\n    if (copyFunctionW(existingFile, newFile, CopyProgressRoutine,\n        &progressInfo, &CancelFlag, COPY_FILE_FAIL_IF_EXISTS))\n      return true;\n    #ifdef WIN_LONG_PATH\n    UString longPathExisting, longPathNew;\n    if (!NDirectory::GetLongPaths(existingFile, newFile, longPathExisting, longPathNew))\n      return false;\n    if (copyFunctionW(longPathExisting, longPathNew, CopyProgressRoutine,\n        &progressInfo, &CancelFlag, COPY_FILE_FAIL_IF_EXISTS))\n      return true;\n    #endif\n    return false;\n  }\n  #ifndef _UNICODE\n  else\n  {\n    CopyFileExPointer copyFunction = (CopyFileExPointer)\n        ::GetProcAddress(::GetModuleHandleA(\"kernel32.dll\"),\n        \"CopyFileExA\");\n    if (copyFunction != 0)\n    {\n      if (copyFunction(GetSysPath(existingFile), GetSysPath(newFile),\n          CopyProgressRoutine,&progressInfo, &CancelFlag, COPY_FILE_FAIL_IF_EXISTS))\n        return true;\n      if (::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)\n        return false;\n    }\n    return BOOLToBool(::CopyFile(GetSysPath(existingFile), GetSysPath(newFile), TRUE));\n  }\n  #endif\n#else\n  extern bool wxw_CopyFile(LPCWSTR existingFile, LPCWSTR newFile, bool overwrite);\n  return wxw_CopyFile(existingFile, newFile, true);\n#endif\n}\n\n#ifdef _WIN32\ntypedef BOOL (WINAPI * MoveFileWithProgressPointer)(\n    IN LPCWSTR lpExistingFileName,\n    IN LPCWSTR lpNewFileName,\n    IN LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL,\n    IN LPVOID lpData OPTIONAL,\n    IN DWORD dwFlags\n    );\n#endif\n\nstatic bool MyMoveFile(LPCWSTR existingFile, LPCWSTR newFile, IProgress *progress, UInt64 &completedSize)\n{\n#ifdef _WIN32\n  // if (IsItWindows2000orHigher())\n  // {\n    CProgressInfo progressInfo;\n    progressInfo.Progress = progress;\n    progressInfo.StartPos = completedSize;\n\n    MoveFileWithProgressPointer moveFunction = (MoveFileWithProgressPointer)\n        ::GetProcAddress(::GetModuleHandle(TEXT(\"kernel32.dll\")),\n        \"MoveFileWithProgressW\");\n    if (moveFunction != 0)\n    {\n      if (moveFunction(\n          existingFile, newFile, CopyProgressRoutine,\n          &progressInfo, MOVEFILE_COPY_ALLOWED))\n        return true;\n      if (::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)\n      {\n        #ifdef WIN_LONG_PATH\n        UString longPathExisting, longPathNew;\n        if (!NDirectory::GetLongPaths(existingFile, newFile, longPathExisting, longPathNew))\n          return false;\n        if (moveFunction(longPathExisting, longPathNew, CopyProgressRoutine,\n            &progressInfo, MOVEFILE_COPY_ALLOWED))\n          return true;\n        #endif\n        if (::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)\n          return false;\n      }\n    }\n  // }\n  // else\n#endif\n    return NDirectory::MyMoveFile(existingFile, newFile);\n}\n\nstatic HRESULT MyCopyFile(\n    const UString &srcPath,\n    const CFileInfoW &srcFileInfo,\n    const UString &destPathSpec,\n    IFolderOperationsExtractCallback *callback,\n    UInt64 &completedSize)\n{\n  UString destPath = destPathSpec;\n  if (destPath.CompareNoCase(srcPath) == 0)\n  {\n    UString message = UString(L\"can not move file \\'\") + destPath + UString(L\"\\' onto itself\");\n    RINOK(callback->ShowMessage(message));\n    return E_ABORT;\n  }\n\n  INT32 writeAskResult;\n  CMyComBSTR destPathResult;\n  RINOK(callback->AskWrite(\n      srcPath,\n      BoolToInt(false),\n      &srcFileInfo.MTime, &srcFileInfo.Size,\n      destPath,\n      &destPathResult,\n      &writeAskResult));\n  if (IntToBool(writeAskResult))\n  {\n    UString destPathNew = UString(destPathResult);\n    RINOK(callback->SetCurrentFilePath(srcPath));\n    if (!MyCopyFile(srcPath, destPathNew, callback, completedSize))\n    {\n      UString message = NError::MyFormatMessageW(GetLastError()) +\n        UString(L\" \\'\") +\n        UString(destPathNew) +\n        UString(L\"\\'\");\n      RINOK(callback->ShowMessage(message));\n      return E_ABORT;\n    }\n  }\n  completedSize += srcFileInfo.Size;\n  return callback->SetCompleted(&completedSize);\n}\n\nstatic HRESULT CopyFolder(\n    const UString &srcPath,\n    const UString &destPathSpec,\n    IFolderOperationsExtractCallback *callback,\n    UInt64 &completedSize)\n{\n  RINOK(callback->SetCompleted(&completedSize));\n\n  UString destPath = destPathSpec;\n  int len = srcPath.Length();\n  if (destPath.Length() >= len && srcPath.CompareNoCase(destPath.Left(len)) == 0)\n  {\n    if (destPath.Length() == len || destPath[len] == WCHAR_PATH_SEPARATOR)\n    {\n      UString message = UString(L\"can not copy folder \\'\") +\n          destPath + UString(L\"\\' onto itself\");\n      RINOK(callback->ShowMessage(message));\n      return E_ABORT;\n    }\n  }\n\n  if (!NDirectory::CreateComplexDirectory(destPath))\n  {\n    UString message = UString(L\"can not create folder \") + destPath;\n    RINOK(callback->ShowMessage(message));\n    return E_ABORT;\n  }\n  CEnumeratorW enumerator(srcPath + UString(WSTRING_PATH_SEPARATOR L\"*\"));\n  CFileInfoEx fileInfo;\n  while (enumerator.Next(fileInfo))\n  {\n    const UString srcPath2 = srcPath + UString(WSTRING_PATH_SEPARATOR) + fileInfo.Name;\n    const UString destPath2 = destPath + UString(WSTRING_PATH_SEPARATOR) + fileInfo.Name;\n    if (fileInfo.IsDir())\n    {\n      RINOK(CopyFolder(srcPath2, destPath2, callback, completedSize));\n    }\n    else\n    {\n      RINOK(MyCopyFile(srcPath2, fileInfo, destPath2, callback, completedSize));\n    }\n  }\n  return S_OK;\n}\n\n\nSTDMETHODIMP CFSFolder::CopyTo(const UInt32 *indices, UInt32 numItems,\n    const wchar_t *path, IFolderOperationsExtractCallback *callback)\n{\n  if (numItems == 0)\n    return S_OK;\n  \n  UInt64 numFolders, numFiles, totalSize;\n  GetItemsFullSize(indices, numItems, numFolders, numFiles, totalSize, callback);\n  RINOK(callback->SetTotal(totalSize));\n  RINOK(callback->SetNumFiles(numFiles));\n  \n  UString destPath = path;\n  if (destPath.IsEmpty())\n    return E_INVALIDARG;\n  bool directName = (destPath[destPath.Length() - 1] != WCHAR_PATH_SEPARATOR);\n  if (directName)\n  {\n    if (numItems > 1)\n      return E_INVALIDARG;\n  }\n    /*\n    // doesn't work in network\n  else\n    if (!NDirectory::CreateComplexDirectory(destPath)))\n    {\n      DWORD lastError = ::GetLastError();\n      UString message = UString(L\"can not create folder \") +\n        destPath;\n      RINOK(callback->ShowMessage(message));\n      return E_ABORT;\n    }\n    */\n\n  UInt64 completedSize = 0;\n  RINOK(callback->SetCompleted(&completedSize));\n  for (UInt32 i = 0; i < numItems; i++)\n  {\n    const CDirItem &fileInfo = *_refs[indices[i]];\n    UString destPath2 = destPath;\n    if (!directName)\n      destPath2 += fileInfo.Name;\n    UString srcPath = _path + GetPrefix(fileInfo) + fileInfo.Name;\n    if (fileInfo.IsDir())\n    {\n      RINOK(CopyFolder(srcPath, destPath2, callback, completedSize));\n    }\n    else\n    {\n      RINOK(MyCopyFile(srcPath, fileInfo, destPath2, callback, completedSize));\n    }\n  }\n  return S_OK;\n}\n\n/////////////////////////////////////////////////\n// Move Operations\n\nHRESULT MyMoveFile(\n    const UString &srcPath,\n    const CFileInfoW &srcFileInfo,\n    const UString &destPathSpec,\n    IFolderOperationsExtractCallback *callback,\n    UInt64 &completedSize)\n{\n  UString destPath = destPathSpec;\n  if (destPath.CompareNoCase(srcPath) == 0)\n  {\n    UString message = UString(L\"can not move file \\'\")\n         + destPath +\n        UString(L\"\\' onto itself\");\n        RINOK(callback->ShowMessage(message));\n    return E_ABORT;\n  }\n\n  INT32 writeAskResult;\n  CMyComBSTR destPathResult;\n  RINOK(callback->AskWrite(\n      srcPath,\n      BoolToInt(false),\n      &srcFileInfo.MTime, &srcFileInfo.Size,\n      destPath,\n      &destPathResult,\n      &writeAskResult));\n  if (IntToBool(writeAskResult))\n  {\n    UString destPathNew = UString(destPathResult);\n    RINOK(callback->SetCurrentFilePath(srcPath));\n    if (!MyMoveFile(srcPath, destPathNew, callback, completedSize))\n    {\n      UString message = UString(L\"can not move to file \") + destPathNew;\n      RINOK(callback->ShowMessage(message));\n    }\n  }\n  completedSize += srcFileInfo.Size;\n  RINOK(callback->SetCompleted(&completedSize));\n  return S_OK;\n}\n\nHRESULT MyMoveFolder(\n    const UString &srcPath,\n    const UString &destPathSpec,\n    IFolderOperationsExtractCallback *callback,\n    UInt64 &completedSize)\n{\n  UString destPath = destPathSpec;\n  int len = srcPath.Length();\n  if (destPath.Length() >= len && srcPath.CompareNoCase(destPath.Left(len)) == 0)\n  {\n    if (destPath.Length() == len || destPath[len] == WCHAR_PATH_SEPARATOR)\n    {\n      UString message = UString(L\"can not move folder \\'\") +\n          destPath + UString(L\"\\' onto itself\");\n      RINOK(callback->ShowMessage(message));\n      return E_ABORT;\n    }\n  }\n\n  if (MyMoveFile(srcPath, destPath, callback, completedSize))\n    return S_OK;\n\n  if (!NDirectory::CreateComplexDirectory(destPath))\n  {\n    UString message = UString(L\"can not create folder \") +  destPath;\n    RINOK(callback->ShowMessage(message));\n    return E_ABORT;\n  }\n  {\n    CEnumeratorW enumerator(srcPath + UString(WSTRING_PATH_SEPARATOR L\"*\"));\n    CFileInfoEx fileInfo;\n    while (enumerator.Next(fileInfo))\n    {\n      const UString srcPath2 = srcPath + UString(WSTRING_PATH_SEPARATOR) + fileInfo.Name;\n      const UString destPath2 = destPath + UString(WSTRING_PATH_SEPARATOR) + fileInfo.Name;\n      if (fileInfo.IsDir())\n      {\n        RINOK(MyMoveFolder(srcPath2, destPath2, callback, completedSize));\n      }\n      else\n      {\n        RINOK(MyMoveFile(srcPath2, fileInfo, destPath2, callback, completedSize));\n      }\n    }\n  }\n  if (!NDirectory::MyRemoveDirectory(srcPath))\n  {\n    UString message = UString(L\"can not remove folder\") + srcPath;\n    RINOK(callback->ShowMessage(message));\n    return E_ABORT;\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::MoveTo(\n    const UInt32 *indices,\n    UInt32 numItems,\n    const wchar_t *path,\n    IFolderOperationsExtractCallback *callback)\n{\n  if (numItems == 0)\n    return S_OK;\n\n  UInt64 numFolders, numFiles, totalSize;\n  GetItemsFullSize(indices, numItems, numFolders, numFiles, totalSize, callback);\n  RINOK(callback->SetTotal(totalSize));\n  RINOK(callback->SetNumFiles(numFiles));\n\n  UString destPath = path;\n  if (destPath.IsEmpty())\n    return E_INVALIDARG;\n  bool directName = (destPath[destPath.Length() - 1] != WCHAR_PATH_SEPARATOR);\n  if (directName)\n  {\n    if (numItems > 1)\n      return E_INVALIDARG;\n  }\n  else\n    if (!NDirectory::CreateComplexDirectory(destPath))\n    {\n      UString message = UString(L\"can not create folder \") +\n        destPath;\n      RINOK(callback->ShowMessage(message));\n      return E_ABORT;\n    }\n\n  UInt64 completedSize = 0;\n  RINOK(callback->SetCompleted(&completedSize));\n  for (UInt32 i = 0; i < numItems; i++)\n  {\n    const CDirItem &fileInfo = *_refs[indices[i]];\n    UString destPath2 = destPath;\n    if (!directName)\n      destPath2 += fileInfo.Name;\n    UString srcPath = _path + GetPrefix(fileInfo) + fileInfo.Name;\n    if (fileInfo.IsDir())\n    {\n      RINOK(MyMoveFolder(srcPath, destPath2, callback, completedSize));\n    }\n    else\n    {\n      RINOK(MyMoveFile(srcPath, fileInfo, destPath2, callback, completedSize));\n    }\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP CFSFolder::CopyFrom(const wchar_t * /* fromFolderPath */,\n    const wchar_t ** /* itemsPaths */, UInt32 /* numItems */, IProgress * /* progress */)\n{\n  /*\n  UInt64 numFolders, numFiles, totalSize;\n  numFiles = numFolders = totalSize = 0;\n  UInt32 i;\n  for (i = 0; i < numItems; i++)\n  {\n    UString path = (UString)fromFolderPath + itemsPaths[i];\n\n    CFileInfoW fileInfo;\n    if (!FindFile(path, fileInfo))\n      return ::GetLastError();\n    if (fileInfo.IsDir())\n    {\n      UInt64 subFolders, subFiles, subSize;\n      RINOK(GetFolderSize(path + UString(WSTRING_PATH_SEPARATOR) + fileInfo.Name, subFolders, subFiles, subSize, progress));\n      numFolders += subFolders;\n      numFolders++;\n      numFiles += subFiles;\n      totalSize += subSize;\n    }\n    else\n    {\n      numFiles++;\n      totalSize += fileInfo.Size;\n    }\n  }\n  RINOK(progress->SetTotal(totalSize));\n  RINOK(callback->SetNumFiles(numFiles));\n  for (i = 0; i < numItems; i++)\n  {\n    UString path = (UString)fromFolderPath + itemsPaths[i];\n  }\n  return S_OK;\n  */\n  return E_NOTIMPL;\n}\n  \n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp",
    "content": "// FileFolderPluginOpen.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/DLL.h\"\n\n#include \"IFolder.h\"\n#include \"RegistryAssociations.h\"\n#include \"RegistryPlugins.h\"\n\n#include \"OpenCallback.h\"\n#include \"PluginLoader.h\"\n#include \"../Agent/Agent.h\"\n\nusing namespace NWindows;\nusing namespace NRegistryAssociations;\n\nstatic int FindPlugin(const CObjectVector<CPluginInfo> &plugins, \n    const UString &pluginName)\n{\n  for (int i = 0; i < plugins.Size(); i++)\n    if (plugins[i].Name.CompareNoCase(pluginName) == 0)\n      return i;\n  return -1;\n}\n\nHRESULT OpenFileFolderPlugin(\n    const UString &path, \n    HMODULE *module,\n    IFolderFolder **resultFolder, \n    HWND parentWindow, \n    bool &encrypted, UString &password)\n{\n  encrypted = false;\n#ifdef _WIN32\n  CObjectVector<CPluginInfo> plugins;\n  ReadFileFolderPluginInfoList(plugins);\n#endif\n\n  UString extension;\n  UString name, pureName, dot;\n\n  if(!NFile::NDirectory::GetOnlyName(path, name))\n    return E_FAIL;\n  NFile::NName::SplitNameToPureNameAndExtension(name, pureName, dot, extension);\n\n\n  int slashPos = path.ReverseFind(WCHAR_PATH_SEPARATOR);\n  UString dirPrefix;\n  UString fileName;\n  if (slashPos >= 0)\n  {\n    dirPrefix = path.Left(slashPos + 1);\n    fileName = path.Mid(slashPos + 1);\n  }\n  else\n    fileName = path;\n\n#ifdef _WIN32\n  if (!extension.IsEmpty())\n  {\n    CExtInfo extInfo;\n    if (ReadInternalAssociation(extension, extInfo))\n    {\n      for (int i = extInfo.Plugins.Size() - 1; i >= 0; i--)\n      {\n        int pluginIndex = FindPlugin(plugins, extInfo.Plugins[i]);\n        if (pluginIndex >= 0)\n        {\n          const CPluginInfo plugin = plugins[pluginIndex];\n          plugins.Delete(pluginIndex);\n          plugins.Insert(0, plugin);\n        }\n      }\n    }\n  }\n\n  for (int i = 0; i < plugins.Size(); i++)\n  {\n    const CPluginInfo &plugin = plugins[i];\n    if (!plugin.ClassIDDefined)\n      continue;\n#endif // #ifdef _WIN32\n    CPluginLibrary library;\n    CMyComPtr<IFolderManager> folderManager;\n    CMyComPtr<IFolderFolder> folder;\n#ifdef _WIN32\n    if (plugin.FilePath.IsEmpty())\n      folderManager = new CArchiveFolderManager;\n    else if (library.LoadAndCreateManager(plugin.FilePath, plugin.ClassID, &folderManager) != S_OK)\n      continue;\n#else\n      folderManager = new CArchiveFolderManager;\n#endif // #ifdef _WIN32\n\n    COpenArchiveCallback *openCallbackSpec = new COpenArchiveCallback;\n    CMyComPtr<IProgress> openCallback = openCallbackSpec;\n    openCallbackSpec->PasswordIsDefined = false;\n    openCallbackSpec->ParentWindow = parentWindow;\n    openCallbackSpec->LoadFileInfo(dirPrefix, fileName);\n    HRESULT result = folderManager->OpenFolderFile(path, &folder, openCallback);\n    if (openCallbackSpec->PasswordWasAsked)\n      encrypted = true;\n    if (result == S_OK)\n    {\n      *module = library.Detach();\n      *resultFolder = folder.Detach();\n      return S_OK;\n    }\n#ifdef _WIN32\n    continue;\n\n    /*\n    if (result != S_FALSE)\n      return result;\n    */\n  }\n#endif\n  return S_FALSE;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FileFolderPluginOpen.h",
    "content": "// FileFolderPluginOpen.h\n\n#ifndef __FILEFOLDERPLUGINOPEN_H\n#define __FILEFOLDERPLUGINOPEN_H\n\nHRESULT OpenFileFolderPlugin(const UString &path,\n  HMODULE *module, IFolderFolder **resultFolder, HWND parentWindow, bool &encrypted, UString &password);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FormatUtils.cpp",
    "content": "// FormatUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"FormatUtils.h\"\n#include \"Common/IntToString.h\"\n#include \"Windows/ResourceString.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\nUString NumberToString(UInt64 number)\n{\n  wchar_t numberString[32];\n  ConvertUInt64ToString(number, numberString);\n  return numberString;\n}\n\nUString MyFormatNew(const UString &format, const UString &argument)\n{\n  UString result = format;\n  result.Replace(L\"{0}\", argument);\n  return result;\n}\n\nUString MyFormatNew(UINT resourceID,\n    #ifdef LANG\n    UInt32 langID,\n    #endif\n    const UString &argument)\n{\n  return MyFormatNew(\n    #ifdef LANG\n    LangString(resourceID, langID),\n    #else\n    NWindows::MyLoadStringW(resourceID),\n    #endif\n    argument);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/FormatUtils.h",
    "content": "// FormatUtils.h\n\n#ifndef __FORMATUTILS_H\n#define __FORMATUTILS_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n\nUString NumberToString(UInt64 number);\n\nUString MyFormatNew(const UString &format, const UString &argument);\nUString MyFormatNew(UINT resourceID,\n    #ifdef LANG\n    UInt32 langID,\n    #endif\n    const UString &argument);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/HelpUtils.h",
    "content": "// HelpUtils.h\n\n#ifndef __HELPUTILS_H\n#define __HELPUTILS_H\n\n#include \"Common/MyString.h\"\n\nvoid ShowHelpWindow(HWND hwnd, LPCWSTR topicFile);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/IFolder.h",
    "content": "// IFolder.h\n\n#ifndef __IFOLDER_H\n#define __IFOLDER_H\n\n#include \"../../IProgress.h\"\n\n#define FOLDER_INTERFACE_SUB(i, b, x) DECL_INTERFACE_SUB(i, b, 8, x)\n#define FOLDER_INTERFACE(i, x) FOLDER_INTERFACE_SUB(i, IUnknown, x)\n\nnamespace NPlugin\n{\n  enum\n  {\n    kName = 0,\n    kType,\n    kClassID,\n    kOptionsClassID\n  };\n}\n\n#define INTERFACE_FolderFolder(x) \\\n  STDMETHOD(LoadItems)() x; \\\n  STDMETHOD(GetNumberOfItems)(UInt32 *numItems) x; \\\n  STDMETHOD(GetProperty)(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) x; \\\n  STDMETHOD(BindToFolder)(UInt32 index, IFolderFolder **resultFolder) x; \\\n  STDMETHOD(BindToFolder)(const wchar_t *name, IFolderFolder **resultFolder) x; \\\n  STDMETHOD(BindToParentFolder)(IFolderFolder **resultFolder) x; \\\n  STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \\\n  STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \\\n  STDMETHOD(GetFolderProperty)(PROPID propID, PROPVARIANT *value) x; \\\n\nFOLDER_INTERFACE(IFolderFolder, 0x00)\n{\n  INTERFACE_FolderFolder(PURE)\n};\n\nFOLDER_INTERFACE(IFolderWasChanged, 0x04)\n{\n  STDMETHOD(WasChanged)(Int32 *wasChanged) PURE;\n};\n\nFOLDER_INTERFACE_SUB(IFolderOperationsExtractCallback, IProgress, 0x0B)\n{\n  // STDMETHOD(SetTotalFiles)(UInt64 total) PURE;\n  // STDMETHOD(SetCompletedFiles)(const UInt64 *completedValue) PURE;\n  STDMETHOD(AskWrite)(\n      const wchar_t *srcPath,\n      Int32 srcIsFolder,\n      const FILETIME *srcTime,\n      const UInt64 *srcSize,\n      const wchar_t *destPathRequest,\n      BSTR *destPathResult,\n      Int32 *writeAnswer) PURE;\n  STDMETHOD(ShowMessage)(const wchar_t *message) PURE;\n  STDMETHOD(SetCurrentFilePath)(const wchar_t *filePath) PURE;\n  STDMETHOD(SetNumFiles)(UInt64 numFiles) PURE;\n};\n\n#define INTERFACE_FolderOperations(x) \\\n  STDMETHOD(CreateFolder)(const wchar_t *name, IProgress *progress) x; \\\n  STDMETHOD(CreateFile)(const wchar_t *name, IProgress *progress) x; \\\n  STDMETHOD(Rename)(UInt32 index, const wchar_t *newName, IProgress *progress) x; \\\n  STDMETHOD(Delete)(const UInt32 *indices, UInt32 numItems, IProgress *progress) x; \\\n  STDMETHOD(CopyTo)(const UInt32 *indices, UInt32 numItems, \\\n      const wchar_t *path, IFolderOperationsExtractCallback *callback) x; \\\n  STDMETHOD(MoveTo)(const UInt32 *indices, UInt32 numItems, \\\n      const wchar_t *path, IFolderOperationsExtractCallback *callback) x; \\\n  STDMETHOD(CopyFrom)(const wchar_t *fromFolderPath, \\\n      const wchar_t **itemsPaths, UInt32 numItems, IProgress *progress) x; \\\n  STDMETHOD(SetProperty)(UInt32 index, PROPID propID, const PROPVARIANT *value, IProgress *progress) x; \\\n\nFOLDER_INTERFACE(IFolderOperations, 0x06)\n{\n  INTERFACE_FolderOperations(PURE)\n};\n\n/*\nFOLDER_INTERFACE2(IFolderOperationsDeleteToRecycleBin, 0x06, 0x03)\n{\n  STDMETHOD(DeleteToRecycleBin)(const UInt32 *indices, UInt32 numItems, IProgress *progress) PURE;\n};\n*/\n\nFOLDER_INTERFACE(IFolderGetSystemIconIndex, 0x07)\n{\n  STDMETHOD(GetSystemIconIndex)(UInt32 index, Int32 *iconIndex) PURE;\n};\n\nFOLDER_INTERFACE(IFolderGetItemFullSize, 0x08)\n{\n  STDMETHOD(GetItemFullSize)(UInt32 index, PROPVARIANT *value, IProgress *progress) PURE;\n};\n\nFOLDER_INTERFACE(IFolderClone, 0x09)\n{\n  STDMETHOD(Clone)(IFolderFolder **resultFolder) PURE;\n};\n\nFOLDER_INTERFACE(IFolderSetFlatMode, 0x0A)\n{\n  STDMETHOD(SetFlatMode)(Int32 flatMode) PURE;\n};\n\n#define INTERFACE_FolderProperties(x) \\\n  STDMETHOD(GetNumberOfFolderProperties)(UInt32 *numProperties) x; \\\n  STDMETHOD(GetFolderPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \\\n\nFOLDER_INTERFACE(IFolderProperties, 0x0B)\n{\n  INTERFACE_FolderProperties(PURE)\n};\n\n#define INTERFACE_IFolderArchiveProperties(x) \\\n  STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) x; \\\n  STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) x; \\\n  STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x;\n\nFOLDER_INTERFACE(IFolderArchiveProperties, 0x0C)\n{\n  INTERFACE_IFolderArchiveProperties(PURE)\n};\n\nFOLDER_INTERFACE(IGetFolderArchiveProperties, 0x0D)\n{\n  STDMETHOD(GetFolderArchiveProperties)(IFolderArchiveProperties **object) PURE;\n};\n\n#define FOLDER_MANAGER_INTERFACE(i, x)  DECL_INTERFACE(i, 9, x)\n\n#define INTERFACE_IFolderManager(x) \\\n  STDMETHOD(OpenFolderFile)(const wchar_t *filePath, IFolderFolder **resultFolder, IProgress *progress) x; \\\n  STDMETHOD(GetExtensions)(BSTR *extensions) x; \\\n  STDMETHOD(GetIconPath)(const wchar_t *ext, BSTR *iconPath, Int32 *iconIndex) x; \\\n  \n  // STDMETHOD(GetTypes)(BSTR *types) PURE;\n  // STDMETHOD(CreateFolderFile)(const wchar_t *type, const wchar_t *filePath, IProgress *progress) PURE;\n            \nFOLDER_MANAGER_INTERFACE(IFolderManager, 0x03)\n{\n  INTERFACE_IFolderManager(PURE);\n};\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/LangUtils.cpp",
    "content": "// LangUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"LangUtils.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/StringToInt.h\"\n#include \"Windows/Synchronization.h\"\n#include \"Windows/Window.h\"\n#include \"Windows/FileFind.h\"\n#include \"RegistryUtils.h\"\n#include \"ProgramLocation.h\"\n\nusing namespace NWindows;\n\nstatic CLang g_Lang;\nUString g_LangID;\n\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\nvoid ReloadLang()\n{\n  ReadRegLang(g_LangID);\n  g_Lang.Clear();\n  if (!g_LangID.IsEmpty() && g_LangID != L\"-\")\n  {\n    UString langPath = g_LangID;\n    if (langPath.Find(WCHAR_PATH_SEPARATOR) < 0)\n    {\n      if (langPath.Find(L'.') < 0)\n        langPath += L\".txt\";\n      UString folderPath;\n      if (GetProgramFolderPath(folderPath))\n        langPath = folderPath + UString(L\"Lang\" WSTRING_PATH_SEPARATOR) + langPath;\n    }\n    g_Lang.Open(langPath);\n  }\n}\n\nstatic bool g_Loaded = false;\nstatic NSynchronization::CCriticalSection g_CriticalSection;\n\nvoid LoadLangOneTime()\n{\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  if (g_Loaded)\n    return;\n  g_Loaded = true;\n  ReloadLang();\n}\n\nvoid LangSetDlgItemsText(HWND dialogWindow, CIDLangPair *idLangPairs, int numItems)\n{\n  for (int i = 0; i < numItems; i++)\n  {\n    const CIDLangPair &idLangPair = idLangPairs[i];\n    UString message;\n    if (g_Lang.GetMessage(idLangPair.LangID, message))\n    {\n      NWindows::CWindow window(GetDlgItem(dialogWindow, idLangPair.ControlID));\n      window.SetText(message);\n    }\n  }\n}\n\nvoid LangSetWindowText(HWND window, UInt32 langID)\n{\n  UString message;\n  if (g_Lang.GetMessage(langID, message))\n    MySetWindowText(window, message);\n}\n\nUString LangString(UInt32 langID)\n{\n  UString message;\n  if (g_Lang.GetMessage(langID, message))\n    return message;\n  return UString();\n}\n\nUString LangString(UINT resourceID, UInt32 langID)\n{\n  UString message;\n  if (g_Lang.GetMessage(langID, message))\n    return message;\n  return NWindows::MyLoadStringW(resourceID);\n}\n\nvoid LoadLangs(CObjectVector<CLangEx> &langs)\n{\n  langs.Clear();\n  UString folderPath;\n  if (!::GetProgramFolderPath(folderPath))\n    return;\n  folderPath += L\"Lang\" WSTRING_PATH_SEPARATOR;\n  NWindows::NFile::NFind::CEnumeratorW enumerator(folderPath + L\"*.txt\");\n  NWindows::NFile::NFind::CFileInfoW fileInfo;\n  while (enumerator.Next(fileInfo))\n  {\n    if (fileInfo.IsDir())\n      continue;\n    CLangEx lang;\n    UString filePath = folderPath + fileInfo.Name;\n    const int kExtSize = 4;\n    if (fileInfo.Name.Right(kExtSize) != L\".txt\")\n      continue;\n    lang.ShortName = fileInfo.Name.Left(fileInfo.Name.Length() - kExtSize);\n    if (lang.Lang.Open(filePath))\n      langs.Add(lang);\n  }\n}\n\nbool SplidID(const UString &id, WORD &primID, WORD &subID)\n{\n  primID = 0;\n  subID = 0;\n  const wchar_t *start = id;\n  const wchar_t *end;\n  UInt64 value = ConvertStringToUInt64(start, &end);\n  if (start == end)\n    return false;\n  primID = (WORD)value;\n  if (*end == 0)\n    return true;\n  if (*end != L'-')\n    return false;\n  start = end + 1;\n  value = ConvertStringToUInt64(start, &end);\n  if (start == end)\n    return false;\n  subID = (WORD)value;\n  return (*end == 0);\n}\n\ntypedef LANGID (WINAPI *GetUserDefaultUILanguageP)();\n\nvoid FindMatchLang(UString &shortName)\n{\n  shortName.Empty();\n\n  LANGID SystemDefaultLangID = GetSystemDefaultLangID(); // Lang for non-Unicode in XP64\n  LANGID UserDefaultLangID = GetUserDefaultLangID(); // Standarts and formats in XP64\n\n  if (SystemDefaultLangID != UserDefaultLangID)\n    return;\n  LANGID langID = UserDefaultLangID;\n  /*\n  LANGID SystemDefaultUILanguage; // english  in XP64\n  LANGID UserDefaultUILanguage; // english  in XP64\n\n  GetUserDefaultUILanguageP fn = (GetUserDefaultUILanguageP)GetProcAddress(\n      GetModuleHandle(\"kernel32\"), \"GetUserDefaultUILanguage\");\n  if (fn != NULL)\n    UserDefaultUILanguage = fn();\n  fn = (GetUserDefaultUILanguageP)GetProcAddress(\n      GetModuleHandle(\"kernel32\"), \"GetSystemDefaultUILanguage\");\n  if (fn != NULL)\n    SystemDefaultUILanguage = fn();\n  */\n\n  WORD primLang = (WORD)(PRIMARYLANGID(langID));\n  WORD subLang = (WORD)(SUBLANGID(langID));\n  CObjectVector<CLangEx> langs;\n  LoadLangs(langs);\n  for (int i = 0; i < langs.Size(); i++)\n  {\n    const CLangEx &lang = langs[i];\n    UString id;\n    if (lang.Lang.GetMessage(0x00000002, id))\n    {\n      WORD primID;\n      WORD subID;\n      if (SplidID(id, primID, subID))\n        if (primID == primLang)\n        {\n          if (subID == 0)\n            shortName = lang.ShortName;\n          if (subLang == subID)\n          {\n            shortName = lang.ShortName;\n            return;\n          }\n        }\n    }\n  }\n}\n\nvoid ReloadLangSmart()\n{\n  #ifndef _UNICODE\n  if (g_IsNT)\n  #endif\n  {\n    ReadRegLang(g_LangID);\n    if (g_LangID.IsEmpty())\n    {\n      UString shortName;\n      FindMatchLang(shortName);\n      if (shortName.IsEmpty())\n        shortName = L\"-\";\n      SaveRegLang(shortName);\n    }\n  }\n  ReloadLang();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/LangUtils.h",
    "content": "// LangUtils.h\n\n#ifndef __LANGUTILS_H\n#define __LANGUTILS_H\n\n#include \"Common/Lang.h\"\n#include \"Windows/ResourceString.h\"\n\nextern UString g_LangID;\n\nstruct CIDLangPair\n{\n  int ControlID;\n  UInt32 LangID;\n};\n\nvoid ReloadLang();\nvoid LoadLangOneTime();\nvoid ReloadLangSmart();\n\nstruct CLangEx\n{\n  CLang Lang;\n  UString ShortName;\n};\n\nvoid LoadLangs(CObjectVector<CLangEx> &langs);\n\nvoid LangSetDlgItemsText(HWND dialogWindow, CIDLangPair *idLangPairs, int numItems);\nvoid LangSetWindowText(HWND window, UInt32 langID);\n\nUString LangString(UInt32 langID);\nUString LangString(UINT resourceID, UInt32 langID);\n\n#ifdef LANG\n#define LangStringSpec(resourceID, langID) LangString(resourceID, langID)\n#else\n#define LangStringSpec(resourceID, langID) NWindows::MyLoadStringW(resourceID)\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ListViewDialog.cpp",
    "content": "// ListViewDialog.cpp\n\n#include \"StdAfx.h\"\n#include \"ListViewDialog.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDOK, 0x02000702 },\n  { IDCANCEL, 0x02000710 }\n};\n#endif\n\nbool CListViewDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  _listView.Attach(GetItem(IDC_LISTVIEW_LIST));\n  SetText(Title);\n\n  LVCOLUMN columnInfo;\n  columnInfo.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM;\n  columnInfo.fmt = LVCFMT_LEFT;\n  columnInfo.iSubItem = 0;\n  columnInfo.cx = 1000;\n\n  _listView.InsertColumn(0, &columnInfo);\n\n  for (int i = 0; i < Strings.Size(); i++)\n    _listView.InsertItem(i, Strings[i]);\n\n  if (Strings.Size() > 0)\n    _listView.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);\n  StringsWereChanged = false;\n  return CModalDialog::OnInit();\n}\n\n#ifdef _WIN32 // FIXME\nbool CListViewDialog::OnNotify(UINT /* controlID */, LPNMHDR header)\n{\n  if (header->hwndFrom != _listView)\n    return false;\n  switch(header->code)\n  {\n    case LVN_KEYDOWN:\n    {\n      LPNMLVKEYDOWN keyDownInfo = LPNMLVKEYDOWN(header);\n      switch(keyDownInfo->wVKey)\n      {\n        case VK_DELETE:\n        {\n          if (!DeleteIsAllowed)\n            return false;\n          int focusedIndex = _listView.GetFocusedItem();\n          if (focusedIndex < 0)\n            focusedIndex = 0;\n          for (;;)\n          {\n            int index = _listView.GetNextSelectedItem(-1);\n            if (index < 0)\n              break;\n            StringsWereChanged = true;\n            _listView.DeleteItem(index);\n            Strings.Delete(index);\n          }\n          if (focusedIndex >= _listView.GetItemCount())\n            focusedIndex = _listView.GetItemCount() - 1;\n          if (focusedIndex >= 0)\n            _listView.SetItemState(focusedIndex, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);\n          return true;\n        }\n        case 'A':\n        {\n          bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;\n          if (ctrl)\n          {\n            int numItems = _listView.GetItemCount();\n            for (int i = 0; i < numItems; i++)\n              _listView.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);\n            return true;\n          }\n        }\n      }\n    }\n  }\n  return false;\n}\n#endif\n\nvoid CListViewDialog::OnOK()\n{\n  FocusedItemIndex = _listView.GetFocusedItem();\n  CModalDialog::OnOK();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ListViewDialog.h",
    "content": "// ListViewDialog.h\n\n#ifndef __LISTVIEWDIALOG_H\n#define __LISTVIEWDIALOG_H\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/ListView.h\"\n#include \"ListViewDialogRes.h\"\n\nclass CListViewDialog: public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CListView _listView;\n  virtual void OnOK();\n  virtual bool OnInit();\n#ifdef _WIN32 // FIXME\n  virtual bool OnNotify(UINT controlID, LPNMHDR header);\n#endif\n\npublic:\n  UString Title;\n  bool DeleteIsAllowed;\n  UStringVector Strings;\n  bool StringsWereChanged;\n  int FocusedItemIndex;\n\n  INT_PTR Create(HWND wndParent = 0) { return CModalDialog::Create(IDD_DIALOG_LISTVIEW, wndParent); }\n\n  CListViewDialog(): DeleteIsAllowed(false) {}\n\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ListViewDialogRes.h",
    "content": "#define IDD_DIALOG_LISTVIEW             201\n\n#define IDC_LISTVIEW_LIST               1000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ListViewDialog_rc.cpp",
    "content": "// PasswordDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"Windows/Control/DialogImpl.h\"\n\n#include \"ListViewDialogRes.h\"\n\nclass CListViewDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CListViewDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent,int id) :\n\tCModalDialogImpl(dialog,parent, id, wxT(\"ListView\"), wxDefaultPosition, wxDefaultSize,\n\t\t\t   wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX | wxMINIMIZE_BOX)\n\n  {\n\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\twxListCtrl *list = new wxListCtrl(this, IDC_LISTVIEW_LIST, wxDefaultPosition, wxSize(645,195), wxLC_REPORT | wxLC_NO_HEADER);\n\n\ttopsizer->Add(list, 1, wxALL|wxEXPAND, 5);\n\n\ttopsizer->Add(CreateButtonSizer(wxOK|wxCANCEL), 0, wxALL|wxEXPAND, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nREGISTER_DIALOG(IDD_DIALOG_LISTVIEW,CListViewDialog,0)\n\nBEGIN_EVENT_TABLE(CListViewDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY,   CModalDialogImpl::OnAnyButton)\n\tEVT_CHECKBOX(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/MessagesDialog.cpp",
    "content": "// MessagesDialog.cpp\n \n#include \"StdAfx.h\"\n#include \"MessagesDialog.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n#include \"Windows/ResourceString.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\nusing namespace NWindows;\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDOK, 0x02000713 }\n};\n#endif\n\nvoid CMessagesDialog::AddMessageDirect(LPCWSTR message)\n{\n  int itemIndex = _messageList.GetItemCount();\n  wchar_t sz[32];\n  ConvertInt64ToString(itemIndex, sz);\n  _messageList.InsertItem(itemIndex, sz);\n  _messageList.SetSubItem(itemIndex, 1, message);\n}\n\nvoid CMessagesDialog::AddMessage(LPCWSTR message)\n{\n  UString s = message;\n  while (!s.IsEmpty())\n  {\n    int pos = s.Find(L'\\n');\n    if (pos < 0)\n      break;\n    AddMessageDirect(s.Left(pos));\n    s.Delete(0, pos + 1);\n  }\n  AddMessageDirect(s);\n}\n\nbool CMessagesDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetWindowText(HWND(*this), 0x02000A00);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  _messageList.Attach(GetItem(IDC_MESSAGE_LIST));\n  _messageList.SetUnicodeFormat(true);\n\n  _messageList.InsertColumn(0, L\"#\", 30);\n\n  const UString s =\n    #ifdef LANG\n    LangString(IDS_MESSAGES_DIALOG_MESSAGE_COLUMN, 0x02000A80);\n    #else\n    MyLoadStringW(IDS_MESSAGES_DIALOG_MESSAGE_COLUMN);\n    #endif\n\n  _messageList.InsertColumn(1, s, 600);\n\n  for(int i = 0; i < Messages->Size(); i++)\n    AddMessage((*Messages)[i]);\n\n  /*\n  if(_messageList.GetItemCount() > 0)\n  {\n    UINT aState = LVIS_SELECTED | LVIS_FOCUSED;\n    _messageList.SetItemState(0, aState, aState);\n  }\n  */\n  return CModalDialog::OnInit();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/MessagesDialog.h",
    "content": "// MessagesDialog.h\n\n#ifndef __MESSAGESDIALOG_H\n#define __MESSAGESDIALOG_H\n\n#include \"MessagesDialogRes.h\"\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/ListView.h\"\n\nclass CMessagesDialog: public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CListView _messageList;\n  void AddMessageDirect(LPCWSTR message);\n  void AddMessage(LPCWSTR message);\n  virtual bool OnInit();\npublic:\n  const UStringVector *Messages;\n  INT_PTR Create(HWND parent = 0) { return CModalDialog::Create(IDD_DIALOG_MESSAGES, parent); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/MessagesDialogRes.h",
    "content": "#define IDS_MESSAGES_DIALOG_MESSAGE_COLUMN 503\n#define IDD_DIALOG_MESSAGES             503\n#define IDC_MESSAGE_LIST                1000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/MessagesDialog_rc.cpp",
    "content": "// MessagesDialog_rc.cpp\n \n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif\n\n#include \"Windows/Control/DialogImpl.h\"\n#include \"MessagesDialogRes.h\"\n\n/*\nIDD_DIALOG_MESSAGES DIALOG 0, 0, xSize, ySize  MY_MODAL_DIALOG_STYLE\nCAPTION \"7-Zip: Diagnostic messages\"\nMY_FONT\nBEGIN\n  DEFPUSHBUTTON \"&Close\", IDOK, bXPos, bYPos, bXSize, bYSize\n  CONTROL \"List1\",IDC_MESSAGE_LIST,\"SysListView32\",\n          LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, \n          marg, marg, xSize2, ySize2 - bYSize - 6\nEND\n\nSTRINGTABLE\nBEGIN\n  IDS_MESSAGES_DIALOG_MESSAGE_COLUMN \"Message\"\nEND\n*/\n\nclass CMessagesDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CMessagesDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent , int id) :\n\tCModalDialogImpl(dialog,parent, id, wxT(\"7-Zip: Diagnostic messages\"), wxDefaultPosition, wxDefaultSize,\n\t\t\t   wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX | wxMINIMIZE_BOX)\n  {\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\twxListCtrl *list = new wxListCtrl(this, IDC_MESSAGE_LIST, wxDefaultPosition, wxSize(645,195), wxLC_REPORT );\n\n#if 0\n\tlist->InsertColumn(0, wxT(\"Col1\"), wxLIST_FORMAT_LEFT);\n\tlist->InsertColumn(1, wxT(\"Col2\"), wxLIST_FORMAT_RIGHT);\n\tlist->InsertItem(0, wxT(\"#1\"));\n\tlist->SetItem(0, 1, L\"message 1\");\n\tlist->InsertItem(1, wxT(\"#2\"));\n\tlist->SetItem(1, 1, L\"message 2\");\n#endif\n\ttopsizer->Add(list ,  1, wxALL|wxEXPAND, 5);\n\ttopsizer->Add(new wxButton(this, wxID_OK, _T(\"&Close\")) ,  0, wxALL | wxALIGN_RIGHT, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nstatic CStringTable g_stringTable[] =\n{\n\t{ IDS_MESSAGES_DIALOG_MESSAGE_COLUMN, L\"Message\" },\n\t{ 0 , 0 }\n};\n\nREGISTER_DIALOG(IDD_DIALOG_MESSAGES,CMessagesDialog,g_stringTable)\n\nBEGIN_EVENT_TABLE(CMessagesDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/MyLoadMenu.cpp",
    "content": "// MyLoadMenu\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n\n#ifdef __BORLANDC__\n#pragma hdrstop\n#endif\n\n#ifndef WX_PRECOMP\n#include \"wx/wx.h\"\n#endif\n\ntypedef wxMenuBar * HMENU;\n\n#include \"Common/StringConvert.h\"\n\n// FIXME #include \"Windows/Menu.h\"\n#include \"Windows/Error.h\"\n// FIXME #include \"Windows/Clipboard.h\"\n\n#include \"../../PropID.h\"\n\n#include \"resource.h\"\n#include \"App.h\"\n// FIXME #include \"AboutDialog.h\"\n#include \"../Common/CompressCall.h\"\n\n#include \"HelpUtils.h\"\n#include \"LangUtils.h\"\n#include \"PluginInterface.h\"\n\nstatic const UINT kOpenBookmarkMenuID = 730;\nstatic const UINT kSetBookmarkMenuID = 740;\n\nextern HINSTANCE g_hInstance;\n\nstatic LPCWSTR kFMHelpTopic = L\"fm/index.htm\";\n\nextern void OptionsDialog(HWND hwndOwner, HINSTANCE hInstance);\n\nusing namespace NWindows;\n\nstatic const int kFileMenuIndex = 0;\nstatic const int kEditMenuIndex = 1;\nstatic const int kViewMenuIndex = 2;\nstatic const int kBookmarksMenuIndex = kViewMenuIndex + 1;\n\nstruct CStringLangPair\n{\n  wchar_t *String;\n  UINT32 LangID;\n};\n\nstatic CStringLangPair kStringLangPairs[] = \n{\n  { L\"&File\",  0x03000102 },\n  { L\"&Edit\",  0x03000103 },\n  { L\"&View\",  0x03000104 },\n  { L\"&Bookmarks\", 0x03000107 },\n  { L\"&Tools\", 0x03000105 },\n  { L\"&Help\",  0x03000106 },\n};\n\nUINT32 kAddToFavoritesLangID = 0x03000710;\nUINT32 kToolbarsLangID = 0x03000451;\n\n/*\nstatic int FindStringLangItem(const UString &anItem)\n{\n  for (int i = 0; i < sizeof(kStringLangPairs) / \n      sizeof(kStringLangPairs[0]); i++)\n    if (anItem.CompareNoCase(kStringLangPairs[i].String) == 0)\n      return i;\n  return -1;\n}\n*/\n\nstatic CIDLangPair kIDLangPairs[] = \n{\n  // File\n  { IDM_FILE_OPEN, 0x03000210 },\n  { IDM_FILE_OPEN_INSIDE, 0x03000211 },\n  { IDM_FILE_OPEN_OUTSIDE, 0x03000212 },\n  // { IDM_FILE_VIEW, 0x03000220 }, // FIXME : does not exist !\n  { IDM_FILE_EDIT, 0x03000221 },\n  { IDM_RENAME, 0x03000230 },\n  { IDM_COPY_TO, 0x03000231 },\n  { IDM_MOVE_TO, 0x03000232 },\n  { IDM_DELETE, 0x03000233 },\n  { IDM_FILE_PROPERTIES, 0x03000240 },\n  { IDM_FILE_COMMENT, 0x03000241 },\n  { IDM_FILE_CRC, 0x03000242 },\n  { IDM_FILE_SPLIT, 0x03000270 },\n  { IDM_FILE_COMBINE, 0x03000271 },\n  { IDM_CREATE_FOLDER, 0x03000250 },\n  { IDM_CREATE_FILE, 0x03000251 },\n  // FIXME { IDCLOSE, 0x03000260 },\n\n  // Edit\n  { IDM_EDIT_CUT, 0x03000320 },\n  { IDM_EDIT_COPY, 0x03000321 },\n  { IDM_EDIT_PASTE, 0x03000322 },\n\n  { IDM_SELECT_ALL, 0x03000330 },\n  { IDM_DESELECT_ALL, 0x03000331 },\n  { IDM_INVERT_SELECTION, 0x03000332 },\n  { IDM_SELECT, 0x03000333 },\n  { IDM_DESELECT, 0x03000334 },\n  { IDM_SELECT_BY_TYPE, 0x03000335 },\n  { IDM_DESELECT_BY_TYPE, 0x03000336 },\n\n  { IDM_VIEW_LARGE_ICONS, 0x03000410 },\n  { IDM_VIEW_SMALL_ICONS, 0x03000411 },\n  { IDM_VIEW_LIST, 0x03000412 },\n  { IDM_VIEW_DETAILS, 0x03000413 },\n\n  { IDM_VIEW_ARANGE_BY_NAME, 0x02000204 },\n  { IDM_VIEW_ARANGE_BY_TYPE, 0x02000214 },\n  { IDM_VIEW_ARANGE_BY_DATE, 0x0200020C },\n  { IDM_VIEW_ARANGE_BY_SIZE, 0x02000207 },\n  { IDM_VIEW_ARANGE_NO_SORT, 0x03000420 },\n\n  { IDM_OPEN_ROOT_FOLDER, 0x03000430 },\n  { IDM_OPEN_PARENT_FOLDER, 0x03000431 },\n  { IDM_FOLDERS_HISTORY, 0x03000432 },\n\n  { IDM_VIEW_REFRESH, 0x03000440 },\n  \n  { IDM_VIEW_FLAT_VIEW, 0x03000449 },\n  { IDM_VIEW_TWO_PANELS, 0x03000450 },\n  { IDM_VIEW_ARCHIVE_TOOLBAR, 0x03000460 },\n  { IDM_VIEW_STANDARD_TOOLBAR, 0x03000461 },\n  { IDM_VIEW_TOOLBARS_LARGE_BUTTONS, 0x03000462 },\n  { IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, 0x03000463 },\n\n  { IDM_OPTIONS, 0x03000510 },\n  { IDM_BENCHMARK, 0x03000511 },\n  \n  { IDM_HELP_CONTENTS, 0x03000610 },\n  { IDM_ABOUT, 0x03000620 },\n\n  { 12111         , 0x03000710 }, // FIXME kAddToFavoritesLangID\n  { 12112         , 0x03000451 } // FIXME kToolbarsLangID\n};\n\n\n#ifdef _WIN32\nstatic int FindLangItem(int ControlID)\n{\n  for (int i = 0; i < sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]); i++)\n    if (kIDLangPairs[i].ControlID == ControlID)\n      return i;\n  return -1;\n}\n#endif\n\n\n/*\nstatic bool g_IsNew_fMask = true;\n\nclass CInit_fMask\n{\npublic:\n  CInit_fMask()\n  {\n    g_IsNew_fMask = false;\n    OSVERSIONINFO vi;\n    vi.dwOSVersionInfoSize = sizeof(vi);\n    if (::GetVersionEx(&vi)) \n    {\n      g_IsNew_fMask = (vi.dwMajorVersion > 4 || \n        (vi.dwMajorVersion == 4 && vi.dwMinorVersion > 0));\n    }\n    g_IsNew_fMask = false;\n  }\n} g_Init_fMask;\n\n// it's hack for supporting Windows NT\n// constants are from WinUser.h\n\n#if(WINVER < 0x0500)\n#define MIIM_STRING      0x00000040\n#define MIIM_BITMAP      0x00000080\n#define MIIM_FTYPE       0x00000100\n#endif\n\nstatic UINT Get_fMaskForString()\n{\n  return g_IsNew_fMask ? MIIM_STRING : MIIM_TYPE;\n}\n\nstatic UINT Get_fMaskForFTypeAndString()\n{\n  return g_IsNew_fMask ? (MIIM_STRING | MIIM_FTYPE) : MIIM_TYPE;\n}\n*/\n\n#ifdef _WIN32\nstatic UINT Get_fMaskForString()\n{\n  return MIIM_TYPE;\n}\n\nstatic UINT Get_fMaskForFTypeAndString()\n{\n  return MIIM_TYPE;\n}\n#endif\n\n\nstatic void MyChangeItem(wxMenuItem * mi,int LangID)\n{\n        UString newString = LangString(LangID);\n        if (newString.IsEmpty())\n          return;\n\twxString ss = mi->GetItemLabel();\n        UString shorcutString((const wchar_t *)ss); //  = item.StringValue;\n        int tabPos = shorcutString.ReverseFind(wchar_t('\\t'));\n        if (tabPos >= 0)\n          newString += shorcutString.Mid(tabPos);\n\t// printf(\"Change Menu : %ls => %ls\\n\",(const wchar_t *)ss,(const wchar_t *)newString);\n\tmi->SetItemLabel((const wchar_t *)newString);\n\n}\n\nstatic void MyChangeMenu(HMENU menuLoc, int level, int menuIndex)\n{\n  // Sets the label of the top-level menus\n  for (int i1= 0; i1< sizeof(kStringLangPairs) / sizeof(kStringLangPairs[0]); i1++)\n  {\n       \tUString newString = LangString(kStringLangPairs[i1].LangID);\n       \tif (! newString.IsEmpty()) menuLoc->SetMenuLabel(i1, (const TCHAR *)newString);\n  }\n\n  // sub-menu items\n  for (int i = 0; i < sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]); i++)\n  {\n\twxMenuItem * mi = menuLoc->FindItem(kIDLangPairs[i].ControlID);\n\tif (mi)\n\t{\n\t\tMyChangeItem(mi,kIDLangPairs[i].LangID);\n\t}\n\telse\n\t  printf(\"Change Menu : id=%d index=%d<>\\n\",kIDLangPairs[i].ControlID,i);\n  }\n}\n\n#ifdef _WIN32\nCMenu g_FileMenu;\n\nclass CFileMenuDestroyer\n{\npublic:\n  ~CFileMenuDestroyer()\n  {\n    if ((HMENU)g_FileMenu != 0)\n      g_FileMenu.Destroy();\n  }\n} g_FileMenuDestroyer;\n#endif\n\n\nvoid MyLoadMenu(HWND hWnd)\n{\n#ifdef _WIN32\n  if ((HMENU)g_FileMenu != 0)\n    g_FileMenu.Destroy();\n  HMENU oldMenu = ::GetMenu(hWnd);\n  HMENU baseMenu = ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_MENU));\n  ::SetMenu(hWnd, baseMenu);\n  ::DestroyMenu(oldMenu);\n  if (!g_LangID.IsEmpty())\n  {\n    HMENU menuOld = ::GetMenu(hWnd);\n    MyChangeMenu(menuOld, 0, 0);\n  }\n  ::DrawMenuBar(hWnd);\n#else\n  extern void rc_MyLoadMenu(HWND hWnd);\n  rc_MyLoadMenu(hWnd);\n  if (!g_LangID.IsEmpty())\n  {\n    HMENU menuOld = ((wxFrame *)hWnd)->GetMenuBar(); // ::GetMenu(hWnd);\n    MyChangeMenu(menuOld, 0, 0);\n  }\n#endif\n}\n\n#ifdef _WIN32\nextern HWND g_HWND;\nvoid MyLoadMenu()\n{\n  MyLoadMenu(g_HWND);\n}\n\nstatic void CopyMenu(HMENU srcMenuSpec, HMENU destMenuSpec)\n{\n  CMenu srcMenu;\n  srcMenu.Attach(srcMenuSpec);\n  CMenu destMenu;\n  destMenu.Attach(destMenuSpec);\n  int startPos = 0;\n  for (int i = 0; i < srcMenu.GetItemCount(); i++)\n  {\n    CMenuItem item;\n    item.fMask = MIIM_STATE | MIIM_ID | Get_fMaskForFTypeAndString();\n    item.fType = MFT_STRING;\n    if (srcMenu.GetItem(i, true, item))\n      if (destMenu.InsertItem(startPos, true, item))\n        startPos++;\n  }\n}\n\nvoid OnMenuActivating(HWND /* hWnd */, HMENU hMenu, int position)\n{\n  if (::GetSubMenu(::GetMenu(g_HWND), position) != hMenu)\n    return;\n  if (position == kFileMenuIndex)\n  {\n    if ((HMENU)g_FileMenu == 0)\n    {\n      g_FileMenu.CreatePopup();\n      CopyMenu(hMenu, g_FileMenu);\n    }\n    CMenu menu;\n    menu.Attach(hMenu);\n    while (menu.GetItemCount() > 0)\n    {\n      if (!menu.RemoveItem(0, MF_BYPOSITION))\n        break;\n    }\n    // CopyMenu(g_FileMenu, hMenu);\n    g_App.GetFocusedPanel().CreateFileMenu(hMenu);\n  }\n  else if (position == kEditMenuIndex)\n  {\n    /*\n    CMenu menu;\n    menu.Attach(hMenu);\n    menu.EnableItem(IDM_EDIT_CUT, MF_ENABLED);\n    menu.EnableItem(IDM_EDIT_COPY, MF_ENABLED);\n    menu.EnableItem(IDM_EDIT_PASTE, IsClipboardFormatAvailableHDROP() ? MF_ENABLED : MF_GRAYED);\n    */\n  }\n  else if (position == kViewMenuIndex)\n  {\n    // View;\n    CMenu menu;\n    menu.Attach(hMenu);\n    menu.CheckRadioItem(IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS, \n      IDM_VIEW_LARGE_ICONS + g_App.GetListViewMode(), MF_BYCOMMAND);\n    menu.CheckItem(IDM_VIEW_TWO_PANELS, MF_BYCOMMAND |\n        ((g_App.NumPanels == 2) ? MF_CHECKED : MF_UNCHECKED));\n    menu.CheckItem(IDM_VIEW_FLAT_VIEW, MF_BYCOMMAND |\n        ((g_App.GetFlatMode()) ? MF_CHECKED : MF_UNCHECKED));\n    menu.CheckItem(IDM_VIEW_ARCHIVE_TOOLBAR, MF_BYCOMMAND |\n        (g_App.ShowArchiveToolbar ? MF_CHECKED : MF_UNCHECKED));\n    menu.CheckItem(IDM_VIEW_STANDARD_TOOLBAR, MF_BYCOMMAND |\n        (g_App.ShowStandardToolbar ? MF_CHECKED : MF_UNCHECKED));\n    menu.CheckItem(IDM_VIEW_TOOLBARS_LARGE_BUTTONS, MF_BYCOMMAND |\n        (g_App.LargeButtons ? MF_CHECKED : MF_UNCHECKED));\n    menu.CheckItem(IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT, MF_BYCOMMAND |\n        (g_App.ShowButtonsLables ? MF_CHECKED : MF_UNCHECKED));\n  }\n  else if (position == kBookmarksMenuIndex)\n  {\n    CMenu menu;\n    menu.Attach(hMenu);\n\n    CMenu subMenu;\n    subMenu.Attach(menu.GetSubMenu(0));\n    while (subMenu.GetItemCount() > 0)\n      subMenu.RemoveItem(subMenu.GetItemCount() - 1, MF_BYPOSITION);\n    int i;\n    for (i = 0; i < 10; i++)\n    {\n      UString s = LangString(IDS_BOOKMARK, 0x03000720);\n      s += L\" \";\n      wchar_t c = (wchar_t)(L'0' + i);\n      s += c;\n      s += L\"\\tAlt+Shift+\";\n      s += c;\n      subMenu.AppendItem(MF_STRING, kSetBookmarkMenuID + i, s);\n    }\n\n    while (menu.GetItemCount() > 2)\n      menu.RemoveItem(menu.GetItemCount() - 1, MF_BYPOSITION);\n\n    for (i = 0; i < 10; i++)\n    {\n      UString path = g_App.AppState.FastFolders.GetString(i);\n      const int kMaxSize = 100;\n      const int kFirstPartSize = kMaxSize / 2;\n      if (path.Length() > kMaxSize)\n      {\n        path = path.Left(kFirstPartSize) + UString(L\" ... \") +\n          path.Right(kMaxSize - kFirstPartSize);\n      }\n      UString s = path;\n      if (s.IsEmpty())\n        s = L\"-\";\n      s += L\"\\tAlt+\";\n      s += (wchar_t)(L'0' + i);\n      menu.AppendItem(MF_STRING, kOpenBookmarkMenuID + i, s);\n    }\n  }\n}\n\n/*\nIt doesn't help\nvoid OnMenuUnActivating(HWND hWnd, HMENU hMenu, int id)\n{\n  if (::GetSubMenu(::GetMenu(g_HWND), 0) != hMenu)\n    return;\n  // g_App.GetFocusedPanel()._contextMenu.Release();\n}\n\nvoid OnMenuUnActivating(HWND hWnd)\n{\n}\n*/\n\n\nvoid LoadFileMenu(HMENU hMenu, int startPos, bool /* forFileMode */, bool programMenu)\n{\n  {\n    CMenu srcMenu;\n    srcMenu.Attach(::GetSubMenu(::GetMenu(g_HWND), 0));\n    if ((HMENU)g_FileMenu == 0)\n    {\n      g_FileMenu.CreatePopup();\n      CopyMenu(srcMenu, g_FileMenu);\n    }\n  }\n\n  CMenu destMenu;\n  destMenu.Attach(hMenu);\n  \n  for (int i = 0; i < g_FileMenu.GetItemCount(); i++)\n  {\n    CMenuItem item;\n\n    item.fMask = MIIM_STATE | MIIM_ID | Get_fMaskForFTypeAndString();\n    item.fType = MFT_STRING;\n    if (g_FileMenu.GetItem(i, true, item))\n    {\n      if (!programMenu)\n        if (item.wID == IDCLOSE)\n          continue;\n      /*\n      bool createItem = (item.wID == IDM_CREATE_FOLDER || item.wID == IDM_CREATE_FILE);\n      if (forFileMode)\n      {\n        if (createItem)\n         continue;\n      }\n      else\n      {\n        if (!createItem)\n         continue;\n      }\n      */\n      if (destMenu.InsertItem(startPos, true, item))\n        startPos++;\n    }\n  }\n  while (destMenu.GetItemCount() > 0)\n  {\n    CMenuItem item;\n    item.fMask = MIIM_TYPE;\n    item.fType = 0;\n    // item.dwTypeData = 0;\n    int lastIndex = destMenu.GetItemCount() - 1;\n    if (!destMenu.GetItem(lastIndex, true, item))\n      break;\n    if(item.fType != MFT_SEPARATOR)\n      break;\n    if (!destMenu.RemoveItem(lastIndex, MF_BYPOSITION))\n      break;\n  }\n}\n#endif\n\nbool ExecuteFileCommand(int id)\n{\n  if (id >= kPluginMenuStartID)\n  {\n#ifdef _WIN32\n    g_App.GetFocusedPanel().InvokePluginCommand(id);\n    g_App.GetFocusedPanel()._sevenZipContextMenu.Release();\n    g_App.GetFocusedPanel()._systemContextMenu.Release();\n#endif\n    return true;\n  }\n\n  switch (id)\n  {\n    // File\n    case IDM_FILE_OPEN:\n      g_App.OpenItem();\n      break;\n    case IDM_FILE_OPEN_INSIDE:\n      g_App.OpenItemInside();\n      break;\n    case IDM_FILE_OPEN_OUTSIDE:\n      g_App.OpenItemOutside();\n      break;\n    case IDM_FILE_VIEW:\n      break;\n    case IDM_FILE_EDIT:\n      g_App.EditItem();\n      break;\n    case IDM_RENAME:\n      g_App.Rename();\n      break;\n    case IDM_COPY_TO:\n      g_App.CopyTo();\n      break;\n    case IDM_MOVE_TO:\n      g_App.MoveTo();\n      break;\n    case IDM_DELETE:\n    {\n#ifdef _WIN32 // FIXME\n      bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;\n      g_App.Delete(!shift);\n#endif\n      break;\n    }\n    case IDM_FILE_CRC:\n      g_App.CalculateCrc();\n      break;\n    case IDM_FILE_SPLIT:\n      g_App.Split();\n      break;\n    case IDM_FILE_COMBINE:\n      g_App.Combine();\n      break;\n    case IDM_FILE_PROPERTIES:\n      g_App.Properties();\n      break;\n    case IDM_FILE_COMMENT:\n      g_App.Comment();\n      break;\n\n    case IDM_CREATE_FOLDER:\n      g_App.CreateFolder();\n      break;\n    case IDM_CREATE_FILE:\n      g_App.CreateFile();\n      break;\n    default:\n      return false;\n  } \n  return true;\n}\n\nbool OnMenuCommand(HWND hWnd, int id)\n{\n  printf(\"DEBUG : OnMenuCommand(%p,id=%d)-0\\n\",hWnd,id);\n\n  if (ExecuteFileCommand(id))\n    return true;\n\n  printf(\"DEBUG : OnMenuCommand(%p,id=%d)-1\\n\",hWnd,id);\n\n  switch (id)\n  {\n    // File\n    /* FIXME\n    case IDCLOSE:\n      SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWnd);\n      SendMessage (hWnd, WM_CLOSE, 0, 0);\n      break;\n    */\n    \n    // Edit\n    case IDM_EDIT_CUT:\n      g_App.EditCut();\n      break;\n    case IDM_EDIT_COPY:\n      g_App.EditCopy();\n      break;\n    case IDM_EDIT_PASTE:\n      g_App.EditPaste();\n      break;\n    case IDM_SELECT_ALL:\n      g_App.SelectAll(true);\n      g_App.RefreshStatusBar();\n      break;\n    case IDM_DESELECT_ALL:\n      g_App.SelectAll(false);\n      g_App.RefreshStatusBar();\n      break;\n    case IDM_INVERT_SELECTION:\n      g_App.InvertSelection();\n      g_App.RefreshStatusBar();\n      break;\n    case IDM_SELECT:\n      g_App.SelectSpec(true);\n      g_App.RefreshStatusBar();\n      break;\n    case IDM_DESELECT:\n      g_App.SelectSpec(false);\n      g_App.RefreshStatusBar();\n      break;\n    case IDM_SELECT_BY_TYPE:\n      g_App.SelectByType(true);\n      g_App.RefreshStatusBar();\n      break;\n    case IDM_DESELECT_BY_TYPE:\n      g_App.SelectByType(false);\n      g_App.RefreshStatusBar();\n      break;\n\n    //View\n    case IDM_VIEW_LARGE_ICONS:\n    case IDM_VIEW_SMALL_ICONS:\n    case IDM_VIEW_LIST:\n    case IDM_VIEW_DETAILS:\n    {\n      UINT index = id - IDM_VIEW_LARGE_ICONS;\n      if (index < 4)\n      {\n        g_App.SetListViewMode(index);\n        /*\n        CMenu menu;\n        menu.Attach(::GetSubMenu(::GetMenu(hWnd), kViewMenuIndex));\n        menu.CheckRadioItem(IDM_VIEW_LARGE_ICONS, IDM_VIEW_DETAILS, \n            id, MF_BYCOMMAND);\n        */\n      }\n      break;\n    }\n    case IDM_VIEW_ARANGE_BY_NAME:\n    {\n      g_App.SortItemsWithPropID(kpidName);\n      break;\n    }\n    case IDM_VIEW_ARANGE_BY_TYPE:\n    {\n      g_App.SortItemsWithPropID(kpidExtension);\n      break;\n    }\n    case IDM_VIEW_ARANGE_BY_DATE:\n    {\n      g_App.SortItemsWithPropID(kpidMTime);\n      break;\n    }\n    case IDM_VIEW_ARANGE_BY_SIZE:\n    {\n      g_App.SortItemsWithPropID(kpidSize);\n      break;\n    }\n    case IDM_VIEW_ARANGE_NO_SORT:\n    {\n      g_App.SortItemsWithPropID(kpidNoProperty);\n      break;\n    }\n\n    case IDM_OPEN_ROOT_FOLDER:\n      g_App.OpenRootFolder();\n      break;\n    case IDM_OPEN_PARENT_FOLDER:\n      g_App.OpenParentFolder();\n      break;\n    case IDM_FOLDERS_HISTORY:\n      g_App.FoldersHistory();\n      break;\n    case IDM_VIEW_REFRESH:\n      g_App.RefreshView();\n      break;\n    case IDM_VIEW_FLAT_VIEW:\n      g_App.ChangeFlatMode();\n      break;\n    case IDM_VIEW_TWO_PANELS:\n      g_App.SwitchOnOffOnePanel();\n      break;\n    case IDM_VIEW_STANDARD_TOOLBAR:\n      g_App.SwitchStandardToolbar();\n      break;\n    case IDM_VIEW_ARCHIVE_TOOLBAR:\n      g_App.SwitchArchiveToolbar();\n      break;\n    case IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT:\n      g_App.SwitchButtonsLables();\n      break;\n    case IDM_VIEW_TOOLBARS_LARGE_BUTTONS:\n      g_App.SwitchLargeButtons();\n      break;\n\n    // Tools\n    case IDM_OPTIONS:\n      // FIXME OptionsDialog(hWnd, g_hInstance);\n      break;\n          \n    case IDM_BENCHMARK:\n      Benchmark();\n      break;\n    // Help\n    case IDM_HELP_CONTENTS:\n      ShowHelpWindow(NULL, kFMHelpTopic);\n      break;\n    case IDM_ABOUT:\n    {\n\t    /* FIXME\n      CAboutDialog dialog;\n      dialog.Create(hWnd);\n      */\n\t    printf(\"IDM_ABOUT ...\\n\");\n      break;\n    }\n    default:\n    {\n      if (id >= kOpenBookmarkMenuID && id <= kOpenBookmarkMenuID + 9)\n      {\n        g_App.OpenBookmark(id - kOpenBookmarkMenuID);\n        return true;\n      }\n      else if (id >= kSetBookmarkMenuID && id <= kSetBookmarkMenuID + 9)\n      {\n        g_App.SetBookmark(id - kSetBookmarkMenuID);\n        return true;\n      }\n      return false;\n    }\n  }\n  return true;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/MyLoadMenu.h",
    "content": "// MyLoadMenu.h\n\n#ifndef __MYLOADMENU_H\n#define __MYLOADMENU_H\n\nclass myHMENU; // FIXME\ntypedef myHMENU * HMENU; // FIXME\n\nvoid OnMenuActivating(HWND hWnd, HMENU hMenu, int position);\n// void OnMenuUnActivating(HWND hWnd, HMENU hMenu, int id);\n// void OnMenuUnActivating(HWND hWnd);\n\nvoid MyLoadMenu(HWND hWnd);\nbool OnMenuCommand(HWND hWnd, int id);\nvoid MyLoadMenu();\nvoid LoadFileMenu(HMENU hMenu, int startPos, bool programMenu,\n    bool isFsFolder, int numItems, bool allAreFiles);\nbool ExecuteFileCommand(int id);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/NetFolder.h.OUT",
    "content": "// NetFolder.h\n\n#ifndef __NETFOLDER_H\n#define __NETFOLDER_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Buffer.h\"\n#include \"Common/MyCom.h\"\n#include \"Windows/PropVariant.h\"\n// FIXME #include \"Windows/Net.h\"\n\n#include \"IFolder.h\"\n\nstruct CResourceEx // FIXME : public NWindows::NNet::CResourceW\n{\n  UString Name;\n};\n\nclass CNetFolder: \n  public IFolderFolder,\n  public IFolderGetSystemIconIndex,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(\n    IFolderGetSystemIconIndex\n  )\n\n  INTERFACE_FolderFolder(;)\n\n  STDMETHOD(GetSystemIconIndex)(UInt32 index, INT32 *iconIndex);\n\nprivate:\n#ifdef _WIN32\n  NWindows::NNet::CResourceW _netResource;\n  NWindows::NNet::CResourceW *_netResourcePointer;\n#else\n  int _netResource;\n  int *_netResourcePointer;\n#endif\n\n  CObjectVector<CResourceEx> _items;\n\n  CMyComPtr<IFolderFolder> _parentFolder;\n  UString _path;\n  \npublic:\n  void Init(const UString &path);\n#ifdef _WIN32\n  void Init(const NWindows::NNet::CResourceW *netResource, \n      IFolderFolder *parentFolder, const UString &path);\n  CNetFolder(): _netResourcePointer(0) {}\n#endif\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/OpenCallback.cpp",
    "content": "// OpenCallback.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OpenCallback.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"../../Common/FileStreams.h\"\n\n#include \"PasswordDialog.h\"\n\nSTDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 *numFiles, const UInt64 *numBytes)\n{\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    _numFilesTotalDefined = (numFiles != NULL);\n    _numBytesTotalDefined = (numBytes != NULL);\n    if (_numFilesTotalDefined)\n    {\n      ProgressDialog.ProgressSynch.SetNumFilesTotal(*numFiles);\n      ProgressDialog.ProgressSynch.SetProgress(*numFiles, 0);\n    }\n    else if (_numBytesTotalDefined)\n      ProgressDialog.ProgressSynch.SetProgress(*numBytes, 0);\n  }\n  return S_OK;\n}\n\nSTDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *numFiles, const UInt64 *numBytes)\n{\n  NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n  RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause());\n  if (numFiles != NULL)\n  {\n    ProgressDialog.ProgressSynch.SetNumFilesCur(*numFiles);\n    if (_numFilesTotalDefined)\n      ProgressDialog.ProgressSynch.SetPos(*numFiles);\n  }\n  if (numBytes != NULL && _numBytesTotalDefined)\n    ProgressDialog.ProgressSynch.SetPos(*numBytes);\n  return S_OK;\n}\n\nSTDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 total)\n{\n  ProgressDialog.ProgressSynch.SetProgress(total, 0);\n  return S_OK;\n}\n\nSTDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *completed)\n{\n  RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause());\n  if (completed != NULL)\n    ProgressDialog.ProgressSynch.SetPos(*completed);\n  return S_OK;\n}\n\nSTDMETHODIMP COpenArchiveCallback::GetProperty(PROPID propID, PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  if (_subArchiveMode)\n  {\n    switch(propID)\n    {\n      case kpidName: prop = _subArchiveName; break;\n    }\n  }\n  else\n  {\n    switch(propID)\n    {\n      case kpidName:  prop = _fileInfo.Name; break;\n      case kpidIsDir:  prop = _fileInfo.IsDir(); break;\n      case kpidSize:  prop = _fileInfo.Size; break;\n      case kpidAttrib:  prop = (UInt32)_fileInfo.Attrib; break;\n      case kpidCTime:  prop = _fileInfo.CTime; break;\n      case kpidATime:  prop = _fileInfo.ATime; break;\n      case kpidMTime:  prop = _fileInfo.MTime; break;\n    }\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nSTDMETHODIMP COpenArchiveCallback::GetStream(const wchar_t *name,\n    IInStream **inStream)\n{\n  *inStream = NULL;\n  if (_subArchiveMode)\n    return S_FALSE;\n\n  NWindows::NFile::NFind::CFileInfoW fileInfo;\n\n  UString fullPath = _folderPrefix + name;\n  if (!NWindows::NFile::NFind::FindFile(fullPath, fileInfo))\n    return S_FALSE;\n  _fileInfo = fileInfo;\n  if (_fileInfo.IsDir())\n    return S_FALSE;\n  CInFileStream *inFile = new CInFileStream;\n  CMyComPtr<IInStream> inStreamTemp = inFile;\n  if (!inFile->Open(fullPath))\n    return ::GetLastError();\n  *inStream = inStreamTemp.Detach();\n  return S_OK;\n}\n\nSTDMETHODIMP COpenArchiveCallback::CryptoGetTextPassword(BSTR *password)\n{\n  PasswordWasAsked = true;\n  if (!PasswordIsDefined)\n  {\n    CPasswordDialog dialog;\n   \n    if (dialog.Create(ProgressDialog) == IDCANCEL)\n      return E_ABORT;\n\n    Password = dialog.Password;\n    PasswordIsDefined = true;\n  }\n  return StringToBstr(Password, password);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/OpenCallback.h",
    "content": "// OpenCallback.h\n\n#ifndef __OPENCALLBACK_H\n#define __OPENCALLBACK_H\n\n#include \"Common/MyString.h\"\n#include \"Common/MyCom.h\"\n#include \"Windows/FileFind.h\"\n\n#include \"../../IPassword.h\"\n\n#include \"../../Archive/IArchive.h\"\n\n\n#ifdef _SFX\n#include \"ProgressDialog.h\"\n#else\n#include \"ProgressDialog2.h\"\n#endif\n\n\nclass COpenArchiveCallback:\n  public IArchiveOpenCallback,\n  public IArchiveOpenVolumeCallback,\n  public IArchiveOpenSetSubArchiveName,\n  public IProgress,\n  public ICryptoGetTextPassword,\n  public CMyUnknownImp\n{\n  UString _folderPrefix;\n  NWindows::NFile::NFind::CFileInfoW _fileInfo;\n\n  bool _numFilesTotalDefined;\n  bool _numBytesTotalDefined;\n  NWindows::NSynchronization::CCriticalSection _criticalSection;\n\npublic:\n  bool PasswordIsDefined;\n  UString Password;\n  bool PasswordWasAsked;\n  HWND ParentWindow;\n\n  bool _subArchiveMode;\n  UString _subArchiveName;\n\npublic:\n  CProgressDialog ProgressDialog;\n\n  MY_UNKNOWN_IMP5(\n    IArchiveOpenCallback,\n    IArchiveOpenVolumeCallback,\n    IArchiveOpenSetSubArchiveName,\n    IProgress,\n    ICryptoGetTextPassword)\n\n  INTERFACE_IProgress(;)\n  INTERFACE_IArchiveOpenCallback(;)\n  INTERFACE_IArchiveOpenVolumeCallback(;)\n\n  // ICryptoGetTextPassword\n  STDMETHOD(CryptoGetTextPassword)(BSTR *password);\n\n  STDMETHOD(SetSubArchiveName(const wchar_t *name))\n  {\n    _subArchiveMode = true;\n    _subArchiveName = name;\n    return  S_OK;\n  }\n\n  COpenArchiveCallback():\n    ParentWindow(0)\n  {\n    _numFilesTotalDefined = false;\n    _numBytesTotalDefined = false;\n\n    _subArchiveMode = false;\n    PasswordIsDefined = false;\n    PasswordWasAsked = false;\n  }\n  /*\n  void Init()\n  {\n    PasswordIsDefined = false;\n    _subArchiveMode = false;\n  }\n  */\n  void LoadFileInfo(const UString &folderPrefix,  const UString &fileName)\n  {\n    _folderPrefix = folderPrefix;\n    if (!NWindows::NFile::NFind::FindFile(_folderPrefix + fileName, _fileInfo))\n      throw 1;\n  }\n  void ShowMessage(const UInt64 *completed);\n\n  INT_PTR StartProgressDialog(const UString &title)\n  {\n    return ProgressDialog.Create(title, ParentWindow);\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/OverwriteDialog.cpp",
    "content": "// OverwriteDialog.cpp\n\n#include \"StdAfx.h\"\n\n#include \"OverwriteDialog.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/ResourceString.h\"\n#include \"Windows/Control/Static.h\"\n#include \"Windows/PropVariantConversions.h\"\n\n#include \"FormatUtils.h\"\n\n// #include \"../resource.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\nusing namespace NWindows;\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDC_STATIC_OVERWRITE_HEADER,         0x02000901},\n  { IDC_STATIC_OVERWRITE_QUESTION_BEGIN, 0x02000902 },\n  { IDC_STATIC_OVERWRITE_QUESTION_END,   0x02000903 },\n  { IDYES, 0x02000705 },\n  { IDC_BUTTON_OVERWRITE_YES_TO_ALL, 0x02000707 },\n  { IDNO,  0x02000709 },\n  { IDC_BUTTON_OVERWRITE_NO_TO_ALL,0x0200070B },\n  { IDC_BUTTON_OVERWRITE_AUTO_RENAME, 0x02000911 },\n  { IDCANCEL, 0x02000711 }\n};\n#endif\n\nvoid COverwriteDialog::SetFileInfoControl(int textID, int iconID,\n    const NOverwriteDialog::CFileInfo &fileInfo)\n{\n  UString sizeString;\n  if (fileInfo.SizeIsDefined)\n    sizeString = MyFormatNew(IDS_FILE_SIZE,\n        #ifdef LANG\n        0x02000982,\n        #endif\n        NumberToString(fileInfo.Size));\n\n  UString reducedName;\n  const int kLineSize = 88;\n  for (int i = 0; i < fileInfo.Name.Length();)\n  {\n    reducedName += fileInfo.Name.Mid(i, kLineSize);\n    reducedName += L\" \";\n    i += kLineSize;\n  }\n\n  UString fullString = reducedName;\n  fullString += L\"\\n\";\n  fullString += sizeString;\n  fullString += L\"\\n\";\n\n  if (fileInfo.TimeIsDefined)\n  {\n    UString timeString;\n    FILETIME localFileTime;\n    if (!FileTimeToLocalFileTime(&fileInfo.Time, &localFileTime))\n      throw 4190402;\n    timeString = ConvertFileTimeToString(localFileTime);\n\n    fullString +=\n    #ifdef LANG\n    LangString(IDS_FILE_MODIFIED, 0x02000983);\n    #else\n    MyLoadStringW(IDS_FILE_MODIFIED);\n    #endif\n\n    fullString += L\" \";\n    fullString += timeString;\n  }\n\n  NWindows::NControl::CDialogChildControl control;\n  control.Init(*this, textID);\n  control.SetText(fullString);\n\n#ifdef _WIN32  // FIXME\n  SHFILEINFO shellFileInfo;\n  if (::SHGetFileInfo(\n      GetSystemString(fileInfo.Name), FILE_ATTRIBUTE_NORMAL, &shellFileInfo,\n      sizeof(shellFileInfo), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON))\n  {\n    NControl::CStatic staticContol;\n    staticContol.Attach(GetItem(iconID));\n    staticContol.SetIcon(shellFileInfo.hIcon);\n  }\n#endif\n}\n\nbool COverwriteDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetWindowText(HWND(*this), 0x02000900);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  SetFileInfoControl(IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME,\n      IDC_STATIC_OVERWRITE_OLD_FILE_ICON, OldFileInfo);\n  SetFileInfoControl(IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME,\n      IDC_STATIC_OVERWRITE_NEW_FILE_ICON, NewFileInfo);\n  return CModalDialog::OnInit();\n}\n\nbool COverwriteDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  switch(buttonID)\n  {\n    case IDYES:\n    case IDC_BUTTON_OVERWRITE_YES_TO_ALL:\n    case IDNO:\n    case IDC_BUTTON_OVERWRITE_NO_TO_ALL:\n    case IDC_BUTTON_OVERWRITE_AUTO_RENAME:\n      End(buttonID);\n      return true;\n  }\n  return CModalDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/OverwriteDialog.h",
    "content": "// OverwriteDialog.h\n\n#ifndef __OVERWRITEDIALOG_H\n#define __OVERWRITEDIALOG_H\n\n#include \"OverwriteDialogRes.h\"\n#include \"Windows/Control/Dialog.h\"\n\nnamespace NOverwriteDialog\n{\n  struct CFileInfo\n  {\n    bool SizeIsDefined;\n    UINT64 Size;\n    bool TimeIsDefined;\n    FILETIME Time;\n    UString Name;\n  };\n}\n\nclass COverwriteDialog: public NWindows::NControl::CModalDialog\n{\n  void SetFileInfoControl(int textID, int iconID,\n      const NOverwriteDialog::CFileInfo &fileInfo);\n  virtual bool OnInit();\n  bool OnButtonClicked(int buttonID, HWND buttonHWND);\npublic:\n  INT_PTR Create(HWND parent = 0) { return CModalDialog::Create(IDD_DIALOG_OVERWRITE, parent); }\n\n  NOverwriteDialog::CFileInfo OldFileInfo;\n  NOverwriteDialog::CFileInfo NewFileInfo;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/OverwriteDialogRes.h",
    "content": "#define IDS_FILE_MODIFIED               600\n#define IDS_FILE_SIZE                   601\n\n#define IDD_DIALOG_OVERWRITE             502\n\n#define IDC_STATIC_OVERWRITE_HEADER     1000\n\n#define IDC_STATIC_OVERWRITE_QUESTION_BEGIN 1001\n#define IDC_STATIC_OVERWRITE_QUESTION_END 1002\n\n#define IDC_STATIC_OVERWRITE_OLD_FILE_ICON 1003\n#define IDC_STATIC_OVERWRITE_NEW_FILE_ICON 1004\n\n#define IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME 1005\n#define IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME 1006\n\n#define IDC_BUTTON_OVERWRITE_YES_TO_ALL 1010\n#define IDC_BUTTON_OVERWRITE_NO_TO_ALL  1011\n#define IDC_BUTTON_OVERWRITE_AUTO_RENAME 1012\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/OverwriteDialog_rc.cpp",
    "content": "// OverwriteDialog_rc.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"OverwriteDialogRes.h\"\n#include \"Windows/Control/DialogImpl.h\"\n\n/*\nIDD_DIALOG_OVERWRITE DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE\nCAPTION \"Confirm File Replace\"\nMY_FONT\nBEGIN\n  LTEXT \"Destination folder already contains processed file.\", IDC_STATIC_OVERWRITE_HEADER, marg, 7, xSize2, 8\n  LTEXT \"Would you like to replace the existing file\", IDC_STATIC_OVERWRITE_QUESTION_BEGIN, marg, 28, xSize2, 8\n  ICON  \"\", IDC_STATIC_OVERWRITE_OLD_FILE_ICON,             marg,  44, iconSize, iconSize\n  LTEXT \"\", IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME,      fiXPos,  44,  fiXSize,  fiYSize, SS_NOPREFIX\n  LTEXT \"with this one?\",IDC_STATIC_OVERWRITE_QUESTION_END, marg,  98,   xSize2,        8\n  ICON  \"\",IDC_STATIC_OVERWRITE_NEW_FILE_ICON,              marg, 114, iconSize, iconSize\n  LTEXT \"\",IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME,       fiXPos, 114,  fiXSize,  fiYSize, SS_NOPREFIX\n  PUSHBUTTON \"&Yes\",         IDYES,                             78, b2YPos, bXSize, bYSize\n  PUSHBUTTON \"Yes to &All\",  IDC_BUTTON_OVERWRITE_YES_TO_ALL,  152, b2YPos, bXSize, bYSize\n  PUSHBUTTON \"&No\",          IDNO,                             226, b2YPos, bXSize, bYSize\n  PUSHBUTTON \"No to A&ll\",   IDC_BUTTON_OVERWRITE_NO_TO_ALL,   300, b2YPos, bXSize, bYSize\n  PUSHBUTTON \"A&uto Rename\", IDC_BUTTON_OVERWRITE_AUTO_RENAME, 181, b1YPos,    109, bYSize\n  PUSHBUTTON \"&Cancel\",      IDCANCEL,                         300, b1YPos, bXSize, bYSize\nEND\n*/\n\nclass COverwriteDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n public:\n   COverwriteDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent , int id) : CModalDialogImpl(dialog,parent, id, wxT(\"Confirm File Replace\"))\n  {\n\t///Sizer for adding the controls created by users\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\ttopsizer->Add(new wxStaticText(this, IDC_STATIC_OVERWRITE_HEADER, _T(\"Destination folder already contains processed file.\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\ttopsizer->Add(new wxStaticText(this, IDC_STATIC_OVERWRITE_QUESTION_BEGIN, _T(\"Would you like to replace the existing file\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\t// FIXME ICON  \"\", IDC_STATIC_OVERWRITE_OLD_FILE_ICON,             marg,  44, iconSize, iconSize\n\ttopsizer->Add(new wxStaticText(this, IDC_STATIC_OVERWRITE_OLD_FILE_SIZE_TIME, _T(\"\"),\n\t\twxDefaultPosition, wxDefaultSize, wxALIGN_LEFT) , 0 ,wxALL | wxALIGN_LEFT, 15 );\n\ttopsizer->Add(new wxStaticText(this, IDC_STATIC_OVERWRITE_QUESTION_END, _T(\"with this one?\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\t// FIXME ICON  \"\",IDC_STATIC_OVERWRITE_NEW_FILE_ICON,              marg, 114, iconSize, iconSize\n\ttopsizer->Add(new wxStaticText(this, IDC_STATIC_OVERWRITE_NEW_FILE_SIZE_TIME, _T(\"\"),\n\t\twxDefaultPosition, wxDefaultSize, wxALIGN_LEFT) , 0 ,wxALL | wxALIGN_LEFT, 15 );\n\n\twxBoxSizer* Sizer1 = new wxBoxSizer(wxHORIZONTAL);\n\tSizer1->Add(new wxButton(this, wxID_YES, _T(\"&Yes\")) ,  0, wxALL | wxALIGN_RIGHT, 5);\n\tSizer1->Add(new wxButton(this, IDC_BUTTON_OVERWRITE_YES_TO_ALL, _T(\"Yes to &All\")) ,  0, wxALL | wxALIGN_RIGHT, 5);\n\tSizer1->Add(new wxButton(this, wxID_NO, _T(\"&No\")) ,  0, wxALL | wxALIGN_RIGHT, 5);\n\tSizer1->Add(new wxButton(this, IDC_BUTTON_OVERWRITE_NO_TO_ALL, _T(\"No to A&ll\")) ,  0, wxALL | wxALIGN_RIGHT, 5);\n\ttopsizer->Add(Sizer1 ,  0, wxALL | wxALIGN_RIGHT, 5);\n\n\twxBoxSizer* Sizer2 = new wxBoxSizer(wxHORIZONTAL);\n\tSizer2->Add(new wxButton(this, IDC_BUTTON_OVERWRITE_AUTO_RENAME, _T(\"A&uto Rename\")) ,  0, wxALL | wxALIGN_RIGHT, 5);\n\tSizer2->Add(new wxButton(this, wxID_CANCEL, _T(\"&Cancel\")) ,  0, wxALL | wxALIGN_RIGHT, 5);\n\ttopsizer->Add(Sizer2 ,  1, wxALL | wxALIGN_RIGHT, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nstatic CStringTable g_stringTable[] =\n{\n\t{ IDS_FILE_MODIFIED, L\"modified on\" },\n\t{ IDS_FILE_SIZE, L\"{0} bytes\" },\n\t{ 0 , 0 }\n};\n\nREGISTER_DIALOG(IDD_DIALOG_OVERWRITE,COverwriteDialog,g_stringTable)\n\nBEGIN_EVENT_TABLE(COverwriteDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/Panel.cpp",
    "content": "// Panel.cpp\n\n#include \"StdAfx.h\"\n\n#ifdef _WIN32\n#include <Windowsx.h>\n#endif\n\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n#include \"Windows/Error.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Thread.h\"\n\n#include \"../../PropID.h\"\n\n#include \"Panel.h\"\n#include \"RootFolder.h\"\n#include \"FSFolder.h\"\n#include \"FormatUtils.h\"\n#include \"App.h\"\n#include \"ExtractCallback.h\"\n\n#include \"resource.h\"\n#include \"../GUI/ExtractRes.h\"\n\n#include \"../Agent/IFolderArchive.h\"\n\n#include \"../Common/CompressCall.h\"\n#include \"../Common/ArchiveName.h\"\n\nusing namespace NWindows;\nusing namespace NControl;\n\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\nstatic const UINT_PTR kTimerID = 1;\nstatic const UINT kTimerElapse = 1000;\n\n#ifdef _WIN32\nstatic DWORD kStyles[4] = { LVS_ICON, LVS_SMALLICON, LVS_LIST, LVS_REPORT };\n#endif\n\n// static const int kCreateFolderID = 101;\n// static const UINT kFileChangeNotifyMessage = WM_APP;\n\nextern HINSTANCE g_hInstance;\nextern DWORD g_ComCtl32Version;\n\nvoid CPanel::Release()\n{\n  // It's for unloading COM dll's: don't change it.\n  CloseOpenFolders();\n#ifdef _WIN32\n  _sevenZipContextMenu.Release();\n  _systemContextMenu.Release();\n#endif\n}\n\nCPanel::~CPanel()\n{\n  CloseOpenFolders();\n}\n\n#ifdef _WIN32 // FIXME\nHWND CPanel::GetParent()\n{\n  HWND h = CWindow2::GetParent();\n  return (h == 0) ? _mainWindow : h;\n}\n#endif\n\nstatic LPCWSTR kClassName = L\"7-Zip::Panel\";\n\n\nHRESULT CPanel::Create(HWND mainWindow, HWND parentWindow, UINT id,\n    const UString &currentFolderPrefix, CPanelCallback *panelCallback, CAppState *appState,\n    bool &archiveIsOpened, bool &encrypted)\n{\n  _mainWindow = mainWindow;\n  _processTimer = true;\n  _processNotify = true;\n\n  _panelCallback = panelCallback;\n  _appState = appState;\n  // _index = index;\n  _baseID = id;\n  _comboBoxID = _baseID + 3;\n  _statusBarID = _comboBoxID + 1;\n\n  UString cfp = currentFolderPrefix;\n\n  if (!currentFolderPrefix.IsEmpty())\n    if (currentFolderPrefix[0] == L'.')\n      if (!NFile::NDirectory::MyGetFullPathName(currentFolderPrefix, cfp))\n        cfp = currentFolderPrefix;\n  RINOK(BindToPath(cfp, archiveIsOpened, encrypted));\n\n#ifdef _WIN32\n  if (!CreateEx(0, kClassName, 0, WS_CHILD | WS_VISIBLE,\n      0, 0, _xSize, 260,\n      parentWindow, (HMENU)(UINT_PTR)id, g_hInstance))\n    return E_FAIL;\n#else\n  {\n  \t// printf(\"WARNING CPanel::Create => CreateEx\\n\");\n  \t// this->OnCreate(0);\n  \textern void registerWindow2(int baseID,NWindows::NControl::CWindow2 *w);\n\tregisterWindow2(_baseID,this);\n  }\n#endif\n\n  return S_OK;\n}\n\nLRESULT CPanel::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)\n{\n  switch(message)\n  {\n    case kShiftSelectMessage:\n      OnShiftSelectMessage();\n      return 0;\n    case kReLoadMessage:\n      RefreshListCtrl(_selectedState);\n      return 0;\n    case kSetFocusToListView:\n      _listView.SetFocus();\n      return 0;\n    case kOpenItemChanged:\n      return OnOpenItemChanged(lParam);\n    case kRefreshStatusBar:\n      OnRefreshStatusBar();\n      return 0;\n#ifdef _WIN32\n    case WM_TIMER:\n      OnTimer();\n      return 0;\n    case WM_CONTEXTMENU:\n      if (OnContextMenu(HANDLE(wParam), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)))\n        return 0;\n      break;\n    /*\n    case WM_DROPFILES:\n      CompressDropFiles(HDROP(wParam));\n      return 0;\n    */\n#endif\n  }\n  return CWindow2::OnMessage(message, wParam, lParam);\n}\n\n#ifdef _WIN32\nstatic LRESULT APIENTRY ListViewSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\n{\n  CWindow tempDialog(hwnd);\n  CMyListView *w = (CMyListView *)(tempDialog.GetUserDataLongPtr());\n  if (w == NULL)\n    return 0;\n  return w->OnMessage(message, wParam, lParam);\n}\n\nLRESULT CMyListView::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)\n{\n  if (message == WM_CHAR)\n  {\n    UINT scanCode = (UINT)((lParam >> 16) & 0xFF);\n    bool extended = ((lParam & 0x1000000) != 0);\n    UINT virtualKey = MapVirtualKey(scanCode, 1);\n    if (virtualKey == VK_MULTIPLY || virtualKey == VK_ADD ||\n        virtualKey == VK_SUBTRACT)\n      return 0;\n    if ((wParam == '/' && extended)\n        || wParam == CHAR_PATH_SEPARATOR || wParam == '/')\n    {\n      _panel->OpenDrivesFolder();\n      return 0;\n    }\n  }\n  else if (message == WM_SYSCHAR)\n  {\n    // For Alt+Enter Beep disabling\n    UINT scanCode = (UINT)(lParam >> 16) & 0xFF;\n    UINT virtualKey = MapVirtualKey(scanCode, 1);\n    if (virtualKey == VK_RETURN || virtualKey == VK_MULTIPLY ||\n        virtualKey == VK_ADD || virtualKey == VK_SUBTRACT)\n      return 0;\n  }\n  /*\n  else if (message == WM_SYSKEYDOWN)\n  {\n    // return 0;\n  }\n  */\n  else if (message == WM_KEYDOWN)\n  {\n    bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0;\n    bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;\n    // bool leftCtrl = (::GetKeyState(VK_LCONTROL) & 0x8000) != 0;\n    // bool RightCtrl = (::GetKeyState(VK_RCONTROL) & 0x8000) != 0;\n    bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;\n    switch(wParam)\n    {\n      case VK_RETURN:\n      {\n        if (shift && !alt && !ctrl)\n        {\n          _panel->OpenSelectedItems(false);\n          return 0;\n        }\n        break;\n      }\n      case VK_NEXT:\n      {\n        if (ctrl && !alt && !shift)\n        {\n          _panel->OpenFocusedItemAsInternal();\n          return 0;\n        }\n        break;\n      }\n      case VK_PRIOR:\n      if (ctrl && !alt && !shift)\n      {\n        _panel->OpenParentFolder();\n        return 0;\n      }\n    }\n  }\n  else if (message == WM_SETFOCUS)\n  {\n    _panel->_lastFocusedIsList = true;\n    _panel->_panelCallback->PanelWasFocused();\n  }\n  #ifndef _UNICODE\n  if (g_IsNT)\n    return CallWindowProcW(_origWindowProc, *this, message, wParam, lParam);\n  else\n  #endif\n    return CallWindowProc(_origWindowProc, *this, message, wParam, lParam);\n}\n\n/*\nstatic LRESULT APIENTRY ComboBoxSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\n{\n  CWindow tempDialog(hwnd);\n  CMyComboBox *w = (CMyComboBox *)(tempDialog.GetUserDataLongPtr());\n  if (w == NULL)\n    return 0;\n  return w->OnMessage(message, wParam, lParam);\n}\n\nLRESULT CMyComboBox::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)\n{\n  return CallWindowProc(_origWindowProc, *this, message, wParam, lParam);\n}\n*/\nstatic LRESULT APIENTRY ComboBoxEditSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\n{\n  CWindow tempDialog(hwnd);\n  CMyComboBoxEdit *w = (CMyComboBoxEdit *)(tempDialog.GetUserDataLongPtr());\n  if (w == NULL)\n    return 0;\n  return w->OnMessage(message, wParam, lParam);\n}\n\nLRESULT CMyComboBoxEdit::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)\n{\n  // See MSDN / Subclassing a Combo Box / Creating a Combo-box Toolbar\n  switch (message)\n  {\n    case WM_SYSKEYDOWN:\n      switch (wParam)\n      {\n        case VK_F1:\n        case VK_F2:\n        {\n          // check ALT\n          if ((lParam & (1<<29)) == 0)\n            break;\n          bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0;\n          bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;\n          bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;\n          if (alt && !ctrl && !shift)\n          {\n            _panel->_panelCallback->SetFocusToPath(wParam == VK_F1 ? 0 : 1);\n            return 0;\n          }\n          break;\n        }\n      }\n      break;\n    case WM_KEYDOWN:\n      switch (wParam)\n      {\n        case VK_TAB:\n          // SendMessage(hwndMain, WM_ENTER, 0, 0);\n          _panel->SetFocusToList();\n          return 0;\n        case VK_F9:\n        {\n          bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0;\n          bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;\n          bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;\n          if (!alt && !ctrl && !shift)\n          {\n            g_App.SwitchOnOffOnePanel();;\n            return 0;\n          }\n          break;\n        }\n      }\n      break;\n    case WM_CHAR:\n      switch (wParam)\n      {\n        case VK_TAB:\n        case VK_ESCAPE:\n          return 0;\n      }\n  }\n  #ifndef _UNICODE\n  if (g_IsNT)\n    return CallWindowProcW(_origWindowProc, *this, message, wParam, lParam);\n  else\n  #endif\n    return CallWindowProc(_origWindowProc, *this, message, wParam, lParam);\n}\n\nstatic HIMAGELIST GetSysImageList(bool smallIcons)\n{\n  SHFILEINFO shellInfo;\n  return (HIMAGELIST)SHGetFileInfo(TEXT(\"\"),\n      FILE_ATTRIBUTE_NORMAL |FILE_ATTRIBUTE_DIRECTORY,\n      &shellInfo, sizeof(shellInfo),\n      SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | (smallIcons ? SHGFI_SMALLICON : SHGFI_ICON));\n}\n\nbool CPanel::OnCreate(CREATESTRUCT * /* createStruct */)\n{\n  // _virtualMode = false;\n  // _sortIndex = 0;\n  _sortID = kpidName;\n  _ascending = true;\n  _lastFocusedIsList = true;\n\n  DWORD style = WS_CHILD | WS_VISIBLE; //  | WS_BORDER ; // | LVS_SHAREIMAGELISTS; //  | LVS_SHOWSELALWAYS;;\n\n  style |= LVS_SHAREIMAGELISTS;\n  // style  |= LVS_AUTOARRANGE;\n  style |= WS_CLIPCHILDREN;\n  style |= WS_CLIPSIBLINGS;\n\n  const UInt32 kNumListModes = sizeof(kStyles) / sizeof(kStyles[0]);\n  if (_ListViewMode >= kNumListModes)\n    _ListViewMode = kNumListModes - 1;\n\n  style |= kStyles[_ListViewMode]\n    | WS_TABSTOP\n    | LVS_EDITLABELS;\n  if (_mySelectMode)\n    style |= LVS_SINGLESEL;\n\n  /*\n  if (_virtualMode)\n    style |= LVS_OWNERDATA;\n  */\n\n  DWORD exStyle;\n  exStyle = WS_EX_CLIENTEDGE;\n\n  if (!_listView.CreateEx(exStyle, style, 0, 0, 116, 260,\n      HWND(*this), (HMENU)(UINT_PTR)(_baseID + 1), g_hInstance, NULL))\n    return false;\n\n  _listView.SetUnicodeFormat(true);\n\n  _listView.SetUserDataLongPtr(LONG_PTR(&_listView));\n  _listView._panel = this;\n\n   #ifndef _UNICODE\n   if(g_IsNT)\n     _listView._origWindowProc =\n      (WNDPROC)_listView.SetLongPtrW(GWLP_WNDPROC, LONG_PTR(ListViewSubclassProc));\n   else\n   #endif\n     _listView._origWindowProc =\n      (WNDPROC)_listView.SetLongPtr(GWLP_WNDPROC, LONG_PTR(ListViewSubclassProc));\n\n  _listView.SetImageList(GetSysImageList(true), LVSIL_SMALL);\n  _listView.SetImageList(GetSysImageList(false), LVSIL_NORMAL);\n\n  // _exStyle |= LVS_EX_HEADERDRAGDROP;\n  // DWORD extendedStyle = _listView.GetExtendedListViewStyle();\n  // extendedStyle |= _exStyle;\n  //  _listView.SetExtendedListViewStyle(extendedStyle);\n  SetExtendedStyle();\n\n  _listView.Show(SW_SHOW);\n  _listView.InvalidateRect(NULL, true);\n  _listView.Update();\n  \n  // Ensure that the common control DLL is loaded.\n  INITCOMMONCONTROLSEX icex;\n\n  icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\n  icex.dwICC  = ICC_BAR_CLASSES;\n  InitCommonControlsEx(&icex);\n\n  TBBUTTON tbb [ ] =\n  {\n    // {0, 0, TBSTATE_ENABLED, BTNS_SEP, 0L, 0},\n    {VIEW_PARENTFOLDER, kParentFolderID, TBSTATE_ENABLED, BTNS_BUTTON, 0L, 0},\n    // {0, 0, TBSTATE_ENABLED, BTNS_SEP, 0L, 0},\n    // {VIEW_NEWFOLDER, kCreateFolderID, TBSTATE_ENABLED, BTNS_BUTTON, 0L, 0},\n  };\n\n  if (g_ComCtl32Version >= MAKELONG(71, 4))\n  {\n    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\n    icex.dwICC  = ICC_COOL_CLASSES | ICC_BAR_CLASSES;\n    InitCommonControlsEx(&icex);\n    \n    _headerReBar.Attach(::CreateWindowEx(WS_EX_TOOLWINDOW,\n      REBARCLASSNAME,\n      NULL, WS_VISIBLE | WS_BORDER | WS_CHILD |\n      WS_CLIPCHILDREN | WS_CLIPSIBLINGS\n      | CCS_NODIVIDER\n      | CCS_NOPARENTALIGN\n      | CCS_TOP\n      | RBS_VARHEIGHT\n      | RBS_BANDBORDERS\n      ,0,0,0,0, HWND(*this), NULL, g_hInstance, NULL));\n  }\n\n  DWORD toolbarStyle =  WS_CHILD | WS_VISIBLE ;\n  if (_headerReBar)\n  {\n    toolbarStyle |= 0\n      // | WS_CLIPCHILDREN\n      // | WS_CLIPSIBLINGS\n\n      | TBSTYLE_TOOLTIPS\n      | CCS_NODIVIDER\n      | CCS_NORESIZE\n      | TBSTYLE_FLAT\n      ;\n  }\n\n  _headerToolBar.Attach(::CreateToolbarEx ((*this), toolbarStyle,\n      _baseID + 2, 11,\n      (HINSTANCE)HINST_COMMCTRL,\n      IDB_VIEW_SMALL_COLOR,\n      (LPCTBBUTTON)&tbb, sizeof(tbb) / sizeof(tbb[0]),\n      0, 0, 0, 0, sizeof (TBBUTTON)));\n\n  icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\n  icex.dwICC = ICC_USEREX_CLASSES;\n  InitCommonControlsEx(&icex);\n  \n  _headerComboBox.CreateEx(0, WC_COMBOBOXEXW, NULL,\n    WS_BORDER | WS_VISIBLE |WS_CHILD | CBS_DROPDOWN | CBS_AUTOHSCROLL,\n      0, 0, 100, 520,\n      ((_headerReBar == 0) ? HWND(*this) : _headerToolBar),\n      (HMENU)(UINT_PTR)(_comboBoxID),\n      g_hInstance, NULL);\n  _headerComboBox.SendMessage(CBEM_SETUNICODEFORMAT, (WPARAM)(BOOL)TRUE, 0);\n\n  _headerComboBox.SetImageList(GetSysImageList(true));\n\n  _headerComboBox.SetExtendedStyle(CBES_EX_PATHWORDBREAKPROC, CBES_EX_PATHWORDBREAKPROC);\n\n  /*\n  _headerComboBox.SetUserDataLongPtr(LONG_PTR(&_headerComboBox));\n  _headerComboBox._panel = this;\n  _headerComboBox._origWindowProc =\n      (WNDPROC)_headerComboBox.SetLongPtr(GWLP_WNDPROC,\n      LONG_PTR(ComboBoxSubclassProc));\n  */\n  _comboBoxEdit.Attach(_headerComboBox.GetEditControl());\n\n  // _comboBoxEdit.SendMessage(CCM_SETUNICODEFORMAT, (WPARAM)(BOOL)TRUE, 0);\n\n  _comboBoxEdit.SetUserDataLongPtr(LONG_PTR(&_comboBoxEdit));\n  _comboBoxEdit._panel = this;\n   #ifndef _UNICODE\n   if(g_IsNT)\n     _comboBoxEdit._origWindowProc =\n      (WNDPROC)_comboBoxEdit.SetLongPtrW(GWLP_WNDPROC, LONG_PTR(ComboBoxEditSubclassProc));\n   else\n   #endif\n     _comboBoxEdit._origWindowProc =\n      (WNDPROC)_comboBoxEdit.SetLongPtr(GWLP_WNDPROC, LONG_PTR(ComboBoxEditSubclassProc));\n\n  if (_headerReBar)\n  {\n    REBARINFO     rbi;\n    rbi.cbSize = sizeof(REBARINFO);  // Required when using this struct.\n    rbi.fMask  = 0;\n    rbi.himl   = (HIMAGELIST)NULL;\n    _headerReBar.SetBarInfo(&rbi);\n    \n    // Send the TB_BUTTONSTRUCTSIZE message, which is required for\n    // backward compatibility.\n    // _headerToolBar.SendMessage(TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);\n    SIZE size;\n    _headerToolBar.GetMaxSize(&size);\n    \n    REBARBANDINFO rbBand;\n    rbBand.cbSize = sizeof(REBARBANDINFO);  // Required\n    rbBand.fMask  = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE;\n    rbBand.fStyle = RBBS_NOGRIPPER;\n    rbBand.cxMinChild = size.cx;\n    rbBand.cyMinChild = size.cy;\n    rbBand.cyChild = size.cy;\n    rbBand.cx = size.cx;\n    rbBand.hwndChild  = _headerToolBar;\n    _headerReBar.InsertBand(-1, &rbBand);\n\n    RECT rc;\n    ::GetWindowRect(_headerComboBox, &rc);\n    rbBand.cxMinChild = 30;\n    rbBand.cyMinChild = rc.bottom - rc.top;\n    rbBand.cx = 1000;\n    rbBand.hwndChild  = _headerComboBox;\n    _headerReBar.InsertBand(-1, &rbBand);\n    // _headerReBar.MaximizeBand(1, false);\n  }\n\n  _statusBar.Create(WS_CHILD | WS_VISIBLE, L\"Status\", (*this), _statusBarID);\n  // _statusBar2.Create(WS_CHILD | WS_VISIBLE, L\"Status\", (*this), _statusBarID + 1);\n\n  int sizes[] = {150, 250, 350, -1};\n  _statusBar.SetParts(4, sizes);\n  // _statusBar2.SetParts(5, sizes);\n\n  /*\n  RECT rect;\n  GetClientRect(&rect);\n  OnSize(0, rect.right - rect.left, rect.top - rect.bottom);\n  */\n\n  SetTimer(kTimerID, kTimerElapse);\n\n  // InitListCtrl();\n  RefreshListCtrl();\n  RefreshStatusBar();\n  \n  return true;\n}\n#else\nbool CPanel::OnCreate(CREATESTRUCT * /* createStruct */)\n{\n   printf(\"WARNING CPanel::OnCreate\\n\");\n  _sortID = kpidName;\n  _ascending = true;\n  _lastFocusedIsList = true;\n\n  extern HWND g_HWND;\n  HWND w = GetDlgItem(g_HWND, _comboBoxID);\n  if (w == 0) \n  {\n\t  printf(\"Can't find id=%d\\n\",_comboBoxID);\n\t  return false;\n  }\n  printf(\"CPanel::OnCreate : _headerComboBox.Attach(%p)\\n\",w);\n  _headerComboBox.Attach(w);\n\n  w = GetDlgItem(g_HWND, _statusBarID);\n  if (w == 0) \n  {\n\t  printf(\"Can't find id=%d\\n\",_statusBarID);\n\t  return false;\n  }\n  printf(\"CPanel::OnCreate : _statusBar.Attach(%p)\\n\",w);\n  _statusBar.Attach(w);\n\n  w = GetDlgItem(g_HWND, _baseID + 1);\n  if (w == 0) \n  {\n\t  printf(\"Can't find id=%d\\n\",_baseID + 1);\n\t  return false;\n  }\n  printf(\"CPanel::OnCreate : _listView.Attach(%p)\\n\",w);\n  _listView.Attach(w);\n  \n  _listView.SetUnicodeFormat(true);\n\n  // _listView.SetUserDataLongPtr(LONG_PTR(&_listView));\n  _listView._panel = this;\n\n  // FIXME _listView.SetImageList(GetSysImageList(true), LVSIL_SMALL);\n  // FIXME _listView.SetImageList(GetSysImageList(false), LVSIL_NORMAL);\n\n  // FIXME SetExtendedStyle();\n\n  // FIXME _listView.Show(SW_SHOW);\n  // FIXME _listView.InvalidateRect(NULL, true);\n  _listView.Update();\n  \n  /* FIXME\n  _headerToolBar.Attach(::CreateToolbarEx ((*this), toolbarStyle,\n      _baseID + 2, 11,\n      (HINSTANCE)HINST_COMMCTRL,\n      IDB_VIEW_SMALL_COLOR,\n      (LPCTBBUTTON)&tbb, sizeof(tbb) / sizeof(tbb[0]),\n      0, 0, 0, 0, sizeof (TBBUTTON)));\n      */\n\n  /* FIXME\n  _headerComboBox.CreateEx(0, WC_COMBOBOXEXW, NULL,\n    WS_BORDER | WS_VISIBLE |WS_CHILD | CBS_DROPDOWN | CBS_AUTOHSCROLL,\n      0, 0, 100, 520,\n      ((_headerReBar == 0) ? HWND(*this) : _headerToolBar),\n      (HMENU)(UINT_PTR)(_comboBoxID),\n      g_hInstance, NULL);\n  _headerComboBox.SendMessage(CBEM_SETUNICODEFORMAT, (WPARAM)(BOOL)TRUE, 0);\n\n  _headerComboBox.SetImageList(GetSysImageList(true));\n\n  _headerComboBox.SetExtendedStyle(CBES_EX_PATHWORDBREAKPROC, CBES_EX_PATHWORDBREAKPROC);\n  */\n\n  // FIXME _comboBoxEdit.Attach(_headerComboBox.GetEditControl());\n\n  _comboBoxEdit._panel = this;\n\n  // FIXME if (_headerReBar) ...\n\n  // _statusBar.Create(WS_CHILD | WS_VISIBLE, L\"Status\", (*this), _statusBarID);\n\n  // int sizes[] = {150, 250, 350, -1};\n  // _statusBar.SetParts(4, sizes);\n\n  // SetTimer(kTimerID, kTimerElapse);\n\n  // InitListCtrl();\n  RefreshListCtrl();\n  RefreshStatusBar();\n  \n  return true;\n}\n#endif\n\n\nvoid CPanel::OnDestroy()\n{\n  printf(\"CPanel::OnDestroy\\n\");\n\n  SaveListViewInfo();\n  CWindow2::OnDestroy();\n}\n\n#ifdef _WIN32\nvoid CPanel::ChangeWindowSize(int xSize, int ySize)\n{\n  int kHeaderSize;\n  int kStatusBarSize;\n  // int kStatusBar2Size;\n  RECT rect;\n  if (_headerReBar)\n    _headerReBar.GetWindowRect(&rect);\n  else\n    _headerToolBar.GetWindowRect(&rect);\n\n  kHeaderSize = rect.bottom - rect.top;\n\n  _statusBar.GetWindowRect(&rect);\n  kStatusBarSize = rect.bottom - rect.top;\n  \n  // _statusBar2.GetWindowRect(&rect);\n  // kStatusBar2Size = rect.bottom - rect.top;\n \n  int yListViewSize = MyMax(ySize - kHeaderSize - kStatusBarSize, 0);\n  const int kStartXPos = 32;\n  if (_headerReBar)\n  {\n  }\n  else\n  {\n    _headerToolBar.Move(0, 0, xSize, 0);\n    _headerComboBox.Move(kStartXPos, 2,\n        MyMax(xSize - kStartXPos - 10, kStartXPos), 0);\n  }\n  _listView.Move(0, kHeaderSize, xSize, yListViewSize);\n  _statusBar.Move(0, kHeaderSize + yListViewSize, xSize, kStatusBarSize);\n  // _statusBar2.MoveWindow(0, kHeaderSize + yListViewSize + kStatusBarSize, xSize, kStatusBar2Size);\n  // _statusBar.MoveWindow(0, 100, xSize, kStatusBarSize);\n  // _statusBar2.MoveWindow(0, 200, xSize, kStatusBar2Size);\n}\n\nbool CPanel::OnSize(WPARAM /* wParam */, int xSize, int ySize)\n{\n  if (_headerReBar)\n    _headerReBar.Move(0, 0, xSize, 0);\n  ChangeWindowSize(xSize, ySize);\n  return true;\n}\n\nbool CPanel::OnNotifyReBar(LPNMHDR header, LRESULT & /* result */)\n{\n  switch(header->code)\n  {\n    case RBN_HEIGHTCHANGE:\n    {\n      RECT rect;\n      GetWindowRect(&rect);\n      ChangeWindowSize(rect.right - rect.left, rect.bottom - rect.top);\n      return false;\n    }\n  }\n  return false;\n}\n#endif\n\nbool CPanel::OnNotify(UINT /* controlID */, LPNMHDR header, LRESULT &result)\n{\n  if (!_processNotify)\n    return false;\n#ifdef _WIN32\n  if (header->hwndFrom == _headerComboBox)\n    return OnNotifyComboBox(header, result);\n  else if (header->hwndFrom == _headerReBar)\n    return OnNotifyReBar(header, result);\n  // if (header->hwndFrom == _listView)\n#endif\n  else if (header->hwndFrom == _listView)\n    return OnNotifyList(header, result);\n#ifdef _WIN32\n  else if (::GetParent(header->hwndFrom) == _listView &&\n      header->code == NM_RCLICK)\n    return OnRightClick((LPNMITEMACTIVATE)header, result);\n#endif\n  return false;\n}\n\nbool CPanel::OnCommand(int code, int itemID, LPARAM lParam, LRESULT &result)\n{\n  printf(\"CPanel::OnCommand(code=%d,itemID=%d)\\n\",code,itemID);\n  if (itemID == kParentFolderID)\n  {\n    OpenParentFolder();\n    result = 0;\n    return true;\n  }\n  /*\n  if (itemID == kCreateFolderID)\n  {\n    CreateFolder();\n    result = 0;\n    return true;\n  }\n  */\n  if (itemID == _comboBoxID)\n  {\n    // FIXME if (OnComboBoxCommand(code, lParam, result))\n      return true;\n  }\n  return CWindow2::OnCommand(code, itemID, lParam, result);\n}\n\nvoid CPanel::MessageBoxInfo(LPCWSTR message, LPCWSTR caption)\n  { ::MessageBoxW(HWND(*this), message, caption, MB_OK); }\nvoid CPanel::MessageBox(LPCWSTR message, LPCWSTR caption)\n  { ::MessageBoxW(HWND(*this), message, caption, MB_OK | MB_ICONSTOP); }\nvoid CPanel::MessageBox(LPCWSTR message)\n  { MessageBox(message, L\"7-Zip\"); }\nvoid CPanel::MessageBoxMyError(LPCWSTR message)\n  { MessageBox(message, L\"Error\"); }\nvoid CPanel::MessageBoxError(HRESULT errorCode, LPCWSTR caption)\n{\n  UString message;\n  if (errorCode == E_OUTOFMEMORY)\n    message = LangString(IDS_MEM_ERROR, 0x0200060B);\n  else\n    if (!NError::MyFormatMessage(errorCode, message))\n      message = L\"Error\";\n  MessageBox(message, caption);\n}\n\nvoid CPanel::MessageBoxError(HRESULT errorCode)\n  { MessageBoxError(errorCode, L\"7-Zip\"); }\nvoid CPanel::MessageBoxLastError(LPCWSTR caption)\n  { MessageBoxError(::GetLastError(), caption); }\nvoid CPanel::MessageBoxLastError()\n  { MessageBoxLastError(L\"Error\"); }\n\nvoid CPanel::MessageBoxErrorLang(UINT resourceID, UInt32 langID)\n  { MessageBox(LangString(resourceID, langID)); }\n\n\nvoid CPanel::SetFocusToList()\n{\n  _listView.SetFocus();\n  // SetCurrentPathText();\n}\n\nvoid CPanel::SetFocusToLastRememberedItem()\n{\n  if (_lastFocusedIsList)\n    SetFocusToList();\n#ifdef _WIN32 // FIXME\n  else\n    _headerComboBox.SetFocus();\n#endif\n}\n\nUString CPanel::GetFolderTypeID() const\n{\n  NCOM::CPropVariant prop;\n  if (_folder->GetFolderProperty(kpidType, &prop) == S_OK)\n    if (prop.vt == VT_BSTR)\n      return (const wchar_t *)prop.bstrVal;\n  return L\"\";\n}\n\nbool CPanel::IsRootFolder() const\n{\n  return (GetFolderTypeID() == L\"RootFolder\");\n}\n\nbool CPanel::IsFSFolder() const\n{\n  return (GetFolderTypeID() == L\"FSFolder\");\n}\n\nbool CPanel::IsFSDrivesFolder() const\n{\n  return (GetFolderTypeID() == L\"FSDrives\");\n}\n\nUString CPanel::GetFsPath() const\n{\n  if (IsFSDrivesFolder())\n    return UString();\n  return _currentFolderPrefix;\n}\n\nUString CPanel::GetDriveOrNetworkPrefix() const\n{\n  if (!IsFSFolder())\n    return UString();\n  UString drive = GetFsPath();\n  if (drive.Length() < 3)\n    return UString();\n  if (drive[0] == L'\\\\' && drive[1] == L'\\\\')\n  {\n    // if network\n    int pos = drive.Find(L'\\\\', 2);\n    if (pos < 0)\n      return UString();\n    pos = drive.Find(L'\\\\', pos + 1);\n    if (pos < 0)\n      return UString();\n    return drive.Left(pos + 1);\n  }\n  if (drive[1] != L':' || drive[2] != L'\\\\')\n    return UString();\n  return drive.Left(3);\n}\n\nbool CPanel::DoesItSupportOperations() const\n{\n  CMyComPtr<IFolderOperations> folderOperations;\n  return _folder.QueryInterface(IID_IFolderOperations, &folderOperations) == S_OK;\n}\n\nvoid CPanel::SetListViewMode(UInt32 index)\n{\n#ifdef _WIN32 // FIXME\n  if (index >= 4)\n    return;\n  _ListViewMode = index;\n  DWORD oldStyle = (DWORD)_listView.GetStyle();\n  DWORD newStyle = kStyles[index];\n  if ((oldStyle & LVS_TYPEMASK) != newStyle)\n    _listView.SetStyle((oldStyle & ~LVS_TYPEMASK) | newStyle);\n  // RefreshListCtrlSaveFocused();\n#endif\n}\n\nvoid CPanel::ChangeFlatMode()\n{\n  _flatMode = !_flatMode;\n  RefreshListCtrlSaveFocused();\n}\n\n\nvoid CPanel::RefreshStatusBar()\n{\n  // FIXME PostMessage(kRefreshStatusBar);\n}\n\nvoid CPanel::AddToArchive()\n{\n  CRecordVector<UInt32> indices;\n  GetOperatedItemIndices(indices);\n  if (!IsFSFolder())\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n  if (indices.Size() == 0)\n  {\n    MessageBoxErrorLang(IDS_SELECT_FILES, 0x03020A03);\n    return;\n  }\n  UStringVector names;\n  for (int i = 0; i < indices.Size(); i++)\n  {\n    int index = indices[i];\n    names.Add(_currentFolderPrefix + GetItemRelPath(index));\n  }\n  const UString archiveName = CreateArchiveName(\n      names.Front(), (names.Size() > 1), false);\n  HRESULT res = CompressFiles(_currentFolderPrefix, archiveName, L\"\", names, false, true, false);\n  if (res != S_OK)\n  {\n    if (_currentFolderPrefix.Length() >= MAX_PATH)\n      MessageBoxErrorLang(IDS_MESSAGE_UNSUPPORTED_OPERATION_FOR_LONG_PATH_FOLDER, 0x03020A01);\n    else\n      MessageBoxError(res);\n  }\n  // KillSelection();\n}\n\nstatic UString GetSubFolderNameForExtract(const UString &archiveName)\n{\n  int slashPos = archiveName.ReverseFind(WCHAR_PATH_SEPARATOR);\n  int dotPos = archiveName.ReverseFind(L'.');\n  if (dotPos < 0 || slashPos > dotPos)\n    return archiveName + UString(L\"~\");\n  UString res = archiveName.Left(dotPos);\n  res.TrimRight();\n  return res;\n}\n\nvoid CPanel::GetFilePaths(const CRecordVector<UInt32> &indices, UStringVector &paths)\n{\n  for (int i = 0; i < indices.Size(); i++)\n  {\n    int index = indices[i];\n    if (IsItemFolder(index))\n    {\n      paths.Clear();\n      break;\n    }\n    paths.Add(_currentFolderPrefix + GetItemRelPath(index));\n  }\n  if (paths.Size() == 0)\n  {\n    MessageBoxErrorLang(IDS_SELECT_FILES, 0x03020A03);\n    return;\n  }\n}\n\nvoid CPanel::ExtractArchives()\n{\n  if (_parentFolders.Size() > 0)\n  {\n    _panelCallback->OnCopy(false, false);\n    return;\n  }\n  CRecordVector<UInt32> indices;\n  GetOperatedItemIndices(indices);\n  UStringVector paths;\n  GetFilePaths(indices, paths);\n  if (paths.IsEmpty())\n    return;\n  UString folderName;\n  if (indices.Size() == 1)\n    folderName = GetSubFolderNameForExtract(GetItemRelPath(indices[0]));\n  else\n    folderName = L\"*\";\n  ::ExtractArchives(paths, _currentFolderPrefix + folderName + UString(WSTRING_PATH_SEPARATOR), true);\n}\n\nstruct CThreadTest\n{\n  CRecordVector<UInt32> Indices;\n  CExtractCallbackImp *ExtractCallbackSpec;\n  CMyComPtr<IFolderArchiveExtractCallback> ExtractCallback;\n  CMyComPtr<IArchiveFolder> ArchiveFolder;\n  HRESULT Result;\n\n  void Test()\n  {\n    ExtractCallbackSpec->ProgressDialog.WaitCreating();\n    Result = ArchiveFolder->Extract(&Indices[0], Indices.Size(),\n        NExtract::NPathMode::kFullPathnames, NExtract::NOverwriteMode::kAskBefore,\n        NULL, BoolToInt(true), ExtractCallback);\n    ExtractCallbackSpec->ProgressDialog.MyClose();\n  }\n  \n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    ((CThreadTest*)param)->Test();\n    return 0;\n  }\n};\n\nstatic void AddValuePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)\n{\n  wchar_t sz[32];\n  s += LangString(resourceID, langID);\n  s += L\" \";\n  ConvertUInt64ToString(value, sz);\n  s += sz;\n  s += L\"\\n\";\n}\n\n/*\nstatic void AddSizePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)\n{\n  wchar_t sz[32];\n  s += LangString(resourceID, langID);\n  s += L\" \";\n  ConvertUInt64ToString(value, sz);\n  s += sz;\n  ConvertUInt64ToString(value >> 20, sz);\n  s += L\" (\";\n  s += sz;\n  s += L\" MB)\";\n  s += L\"\\n\";\n}\n*/\n\nvoid CPanel::TestArchives()\n{\n  CRecordVector<UInt32> indices;\n  GetOperatedIndicesSmart(indices);\n  CMyComPtr<IArchiveFolder> archiveFolder;\n  _folder.QueryInterface(IID_IArchiveFolder, &archiveFolder);\n  if (archiveFolder)\n  {\n    {\n    CThreadTest extracter;\n\n    extracter.ArchiveFolder = archiveFolder;\n    extracter.ExtractCallbackSpec = new CExtractCallbackImp;\n    extracter.ExtractCallback = extracter.ExtractCallbackSpec;\n    extracter.ExtractCallbackSpec->ParentWindow = GetParent();\n    extracter.ExtractCallbackSpec->ShowMessages = true;\n\n    if (indices.IsEmpty())\n      return;\n\n    extracter.Indices = indices;\n    \n    UString title = LangString(IDS_PROGRESS_TESTING, 0x02000F90);\n    UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);\n    \n    extracter.ExtractCallbackSpec->ProgressDialog.CompressingMode = false;\n    extracter.ExtractCallbackSpec->ProgressDialog.MainWindow = GetParent();\n    extracter.ExtractCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle;\n    extracter.ExtractCallbackSpec->ProgressDialog.MainAddTitle = title + L\" \";\n    \n    extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore;\n    extracter.ExtractCallbackSpec->Init();\n    \n    NWindows::CThread extractThread;\n    if (extractThread.Create(CThreadTest::MyThreadFunction, &extracter) != S_OK)\n      return;\n    extracter.ExtractCallbackSpec->StartProgressDialog(title);\n    \n    if (extracter.ExtractCallbackSpec->Messages.IsEmpty() && extracter.Result == S_OK)\n    {\n      UString s;\n      AddValuePair(IDS_FOLDERS_COLON, 0x02000321, extracter.ExtractCallbackSpec->NumFolders, s);\n      AddValuePair(IDS_FILES_COLON, 0x02000320, extracter.ExtractCallbackSpec->NumFiles, s);\n      // AddSizePair(IDS_SIZE_COLON, 0x02000322, extracter.Stat.UnpackSize, s);\n      // AddSizePair(IDS_COMPRESSED_COLON, 0x02000323, extracter.Stat.PackSize, s);\n      s += L\"\\n\";\n      s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608);\n      MessageBoxInfo(s, LangString(IDS_PROGRESS_TESTING, 0x02000F90));\n    }\n    else\n    {\n      if (extracter.Result != S_OK && extracter.Result != E_ABORT)\n        MessageBoxError(extracter.Result, L\"Testing Error\");\n    }\n    }\n    RefreshTitleAlways();\n    return;\n  }\n\n  if (!IsFSFolder())\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n  UStringVector paths;\n  GetFilePaths(indices, paths);\n  if (paths.IsEmpty())\n    return;\n  ::TestArchives(paths);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/Panel.h",
    "content": "// Panel.h\n\n#ifndef __PANEL_H\n#define __PANEL_H\n\n#include \"Common/MyCom.h\"\n\n#include \"Windows/DLL.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/Synchronization.h\"\n// #include \"Windows/Handle.h\"\n\n// #include \"Windows/Control/ToolBar.h\"\n// #include \"Windows/Control/ReBar.h\"\n#include \"Windows/Control/ListView.h\"\n#include \"Windows/Control/Static.h\"\n#include \"Windows/Control/Edit.h\"\n#include \"Windows/Control/ComboBox.h\"\n#include \"Windows/Control/Window2.h\"\n#include \"Windows/Control/StatusBar.h\"\n\n#include \"SysIconUtils.h\"\n#include \"IFolder.h\"\n#include \"ViewSettings.h\"\n#include \"AppState.h\"\n// #include \"MyCom2.h\"\n\nconst int kParentFolderID = 100;\nconst int kPluginMenuStartID = 1000;\nconst int kToolbarStartID = 2000;\n\nconst int kParentIndex = -1;\n\nstruct CPanelCallback\n{\n  virtual void OnTab() = 0;\n  virtual void SetFocusToPath(int index) = 0;\n  virtual void OnCopy(bool move, bool copyToSame) = 0;\n  virtual void OnSetSameFolder() = 0;\n  virtual void OnSetSubFolder() = 0;\n  virtual void PanelWasFocused() = 0;\n  virtual void DragBegin() = 0;\n  virtual void DragEnd() = 0;\n  virtual void RefreshTitle(bool always) = 0;\n};\n\nvoid PanelCopyItems();\n\nstruct CItemProperty\n{\n  UString Name;\n  PROPID ID;\n  VARTYPE Type;\n  int Order;\n  bool IsVisible;\n  UInt32 Width;\n};\n\ninline bool operator<(const CItemProperty &a1, const CItemProperty &a2)\n  { return (a1.Order < a2.Order); }\n\ninline bool operator==(const CItemProperty &a1, const CItemProperty &a2)\n  { return (a1.Order == a2.Order); }\n\nclass CItemProperties: public CObjectVector<CItemProperty>\n{\npublic:\n  int FindItemWithID(PROPID id)\n  {\n    for (int i = 0; i < Size(); i++)\n      if ((*this)[i].ID == id)\n        return i;\n    return -1;\n  }\n};\n\nstruct CTempFileInfo\n{\n  UString ItemName;\n  UString FolderPath;\n  UString FilePath;\n  NWindows::NFile::NFind::CFileInfoW FileInfo;\n  void DeleteDirAndFile()\n  {\n    NWindows::NFile::NDirectory::DeleteFileAlways(FilePath);\n    NWindows::NFile::NDirectory::MyRemoveDirectory(FolderPath);\n  }\n};\n\nstruct CFolderLink: public CTempFileInfo\n{\n  NWindows::NDLL::CLibrary Library;\n  CMyComPtr<IFolderFolder> ParentFolder;\n  bool UsePassword;\n  UString Password;\n\n  UString VirtualPath;\n  CFolderLink(): UsePassword(false) {}\n};\n\nenum MyMessages\n{\n  kShiftSelectMessage = 20000, // FIXME  = WM_USER + 1,\n  kReLoadMessage,\n  kSetFocusToListView,\n  kOpenItemChanged,\n  kRefreshStatusBar\n};\n\nUString GetFolderPath(IFolderFolder * folder);\n\nclass CPanel;\n\nclass CMyListView: public NWindows::NControl::CListView\n{\npublic:\n  WNDPROC _origWindowProc;\n  CPanel *_panel;\n  LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);\n};\n\n/*\nclass CMyComboBox: public NWindows::NControl::CComboBoxEx\n{\npublic:\n  WNDPROC _origWindowProc;\n  CPanel *_panel;\n  LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);\n};\n*/\nclass CMyComboBoxEdit: public NWindows::NControl::CEdit\n{\npublic:\n  WNDPROC _origWindowProc;\n  CPanel *_panel;\n  LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);\n};\n\nstruct CSelectedState\n{\n  int FocusedItem;\n  UString FocusedName;\n  bool SelectFocused;\n  UStringVector SelectedNames;\n  CSelectedState(): FocusedItem(-1), SelectFocused(false) {}\n};\n\nclass CPanel :public NWindows::NControl::CWindow2\n{\n  // FIXME CExtToIconMap _extToIconMap;\n  UINT _baseID;\n  int _comboBoxID;\n  UINT _statusBarID;\n\n  CAppState *_appState;\n\n  bool OnCommand(int code, int itemID, LPARAM lParam, LRESULT &result);\n  LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);\n  virtual bool OnCreate(CREATESTRUCT *createStruct);\n  // FIXME virtual bool OnSize(WPARAM wParam, int xSize, int ySize);\n  virtual void OnDestroy();\n  virtual bool OnNotify(UINT controlID, LPNMHDR lParam, LRESULT &result);\n  void OnComboBoxCommand(UINT code, LPARAM &aParam);\n  // FIXME bool OnNotifyComboBoxEndEdit(PNMCBEENDEDITW info, LRESULT &result);\n  #ifndef _UNICODE\n  bool OnNotifyComboBoxEndEdit(PNMCBEENDEDIT info, LRESULT &result);\n  #endif\n  // FIXME bool OnNotifyReBar(LPNMHDR lParam, LRESULT &result);\n  // FIXME bool OnNotifyComboBox(LPNMHDR lParam, LRESULT &result);\n  void OnItemChanged(NMLISTVIEW *item);\n  bool OnNotifyList(LPNMHDR lParam, LRESULT &result);\n  // FIXME void OnDrag(LPNMLISTVIEW nmListView);\n  // FIXME bool OnKeyDown(LPNMLVKEYDOWN keyDownInfo, LRESULT &result);\n  // FIXME BOOL OnBeginLabelEdit(LV_DISPINFOW * lpnmh);\n  // FIXME BOOL OnEndLabelEdit(LV_DISPINFOW * lpnmh);\n  void OnColumnClick(LPNMLISTVIEW info);\n  // FIXME bool OnCustomDraw(LPNMLVCUSTOMDRAW lplvcd, LRESULT &result);\n\npublic:\n  HWND _mainWindow;\n  CPanelCallback *_panelCallback;\n\n/* FIXME BEGIN */\n  HWND GetParent() { return 0; }\n   operator HWND() const { return 0; }\n/* FIXME END */\n\n  void DeleteItems(bool toRecycleBin);\n  void DeleteItemsInternal(CRecordVector<UInt32> &indices);\n  void CreateFolder();\n  void CreateFile();\n\nprivate:\n\n  void ChangeWindowSize(int xSize, int ySize);\n \n  void InitColumns();\n  // void InitColumns2(PROPID sortID);\n  void InsertColumn(int index);\n\n  void SetFocusedSelectedItem(int index, bool select);\n  void RefreshListCtrl(const UString &focusedName, int focusedPos, bool selectFocused,\n      const UStringVector &selectedNames);\n\n  void OnShiftSelectMessage();\n  void OnArrowWithShift();\n\n  void OnInsert();\n  // void OnUpWithShift();\n  // void OnDownWithShift();\npublic:\n  void myTests();\n  void UpdateSelection();\n  void SelectSpec(bool selectMode);\n  void SelectByType(bool selectMode);\n  void SelectAll(bool selectMode);\n  void InvertSelection();\nprivate:\n\n  // UString GetFileType(UInt32 index);\n  LRESULT SetItemText(LVITEMW &item);\n\n  // CRecordVector<PROPID> m_ColumnsPropIDs;\n\npublic:\n  // FIXME NWindows::NControl::CReBar _headerReBar;\n  // FIXME NWindows::NControl::CToolBar _headerToolBar;\n  NWindows::NControl::CComboBoxEx _headerComboBox;\n  // CMyComboBox _headerComboBox;\n  CMyComboBoxEdit _comboBoxEdit;\n  CMyListView _listView;\n  NWindows::NControl::CStatusBar _statusBar;\n  bool _lastFocusedIsList;\n  // NWindows::NControl::CStatusBar _statusBar2;\n\n  DWORD _exStyle;\n  bool _showDots;\n  bool _showRealFileIcons;\n  // bool _virtualMode;\n  // CUIntVector _realIndices;\n  bool _enableItemChangeNotify;\n  bool _mySelectMode;\n  CBoolVector _selectedStatusVector;\n\n  CSelectedState _selectedState;\n\n  UInt32 GetRealIndex(const LVITEMW &item) const\n  {\n    /*\n    if (_virtualMode)\n      return _realIndices[item.iItem];\n    */\n    return (UInt32)item.lParam;\n  }\n  int GetRealItemIndex(int indexInListView) const\n  {\n    /*\n    if (_virtualMode)\n      return indexInListView;\n    */\n    LPARAM param;\n    if (!_listView.GetItemParam(indexInListView, param))\n      throw 1;\n    return (int)param;\n  }\n\n  UInt32 _ListViewMode;\n  int _xSize; \n\n  bool _flatMode;\n\n  bool _dontShowMode;\n\n\n  UString _currentFolderPrefix;\n  \n  CObjectVector<CFolderLink> _parentFolders;\n  NWindows::NDLL::CLibrary _library;\n  CMyComPtr<IFolderFolder> _folder;\n  // CMyComPtr<IFolderGetSystemIconIndex> _folderGetSystemIconIndex;\n\n  UStringVector _fastFolders;\n\n  void GetSelectedNames(UStringVector &selectedNames);\n  void SaveSelectedState(CSelectedState &s);\n  void RefreshListCtrl(const CSelectedState &s);\n  void RefreshListCtrlSaveFocused();\n\n  UString GetItemName(int itemIndex) const;\n  UString GetItemPrefix(int itemIndex) const;\n  UString GetItemRelPath(int itemIndex) const;\n  bool IsItemFolder(int itemIndex) const;\n  UInt64 GetItemSize(int itemIndex) const;\n\n  ////////////////////////\n  // PanelFolderChange.cpp\n\n  void SetToRootFolder();\n  HRESULT BindToPath(const UString &fullPath, bool &archiveIsOpened, bool &encrypted); // can be prefix \n  HRESULT BindToPathAndRefresh(const UString &path);\n  void OpenDrivesFolder();\n  \n  void SetBookmark(int index);\n  void OpenBookmark(int index);\n  \n  void LoadFullPath();\n  void LoadFullPathAndShow();\n  void FoldersHistory();\n  void OpenParentFolder();\n  void CloseOpenFolders();\n  void OpenRootFolder();\n\n\n  HRESULT Create(HWND mainWindow, HWND parentWindow,\n      UINT id,\n      const UString &currentFolderPrefix,\n      CPanelCallback *panelCallback,\n      CAppState *appState, bool &archiveIsOpened, bool &encrypted);\n  void SetFocusToList();\n  void SetFocusToLastRememberedItem();\n\n\n  void ReadListViewInfo();\n  void SaveListViewInfo();\n\n  CPanel() :\n      // _virtualMode(flase),\n      _exStyle(0),\n      _showDots(false),\n      _showRealFileIcons(false),\n      _needSaveInfo(false),\n      _startGroupSelect(0),\n      _selectionIsDefined(false),\n      _ListViewMode(3),\n      _flatMode(false),\n      _xSize(300),\n      _mySelectMode(false),\n      _enableItemChangeNotify(true),\n      _dontShowMode(false)\n  {}\n\n\n  void SetExtendedStyle()\n  {\n/* FIXME\t  \n    if (_listView != 0)\n      _listView.SetExtendedListViewStyle(_exStyle);\n      */\n  }\n\n\n  bool _needSaveInfo;\n  UString _typeIDString;\n  CListViewInfo _listViewInfo;\n  CItemProperties _properties;\n  CItemProperties _visibleProperties;\n  \n  PROPID _sortID;\n  // int _sortIndex;\n  bool _ascending;\n\n  void Release();\n  ~CPanel();\n  // FIXME void OnLeftClick(LPNMITEMACTIVATE itemActivate);\n  // FIXME bool OnRightClick(LPNMITEMACTIVATE itemActivate, LRESULT &result);\n\n  void OnTimer();\n  void OnReload();\n  bool OnContextMenu(HANDLE windowHandle, int xPos, int yPos);\n\n#ifdef _WIN32 \n  CMyComPtr<IContextMenu> _sevenZipContextMenu;\n  CMyComPtr<IContextMenu> _systemContextMenu;\n  HRESULT CreateShellContextMenu(\n      const CRecordVector<UInt32> &operatedIndices,\n      CMyComPtr<IContextMenu> &systemContextMenu);\n  void CreateSystemMenu(HMENU menu, \n      const CRecordVector<UInt32> &operatedIndices,\n      CMyComPtr<IContextMenu> &systemContextMenu);\n  void CreateSevenZipMenu(HMENU menu, \n      const CRecordVector<UInt32> &operatedIndices,\n      CMyComPtr<IContextMenu> &sevenZipContextMenu);\n  void CreateFileMenu(HMENU menu, \n      CMyComPtr<IContextMenu> &sevenZipContextMenu,\n      CMyComPtr<IContextMenu> &systemContextMenu,\n      bool programMenu);\n  void CreateFileMenu(HMENU menu);\n  bool InvokePluginCommand(int id);\n  bool InvokePluginCommand(int id, IContextMenu *sevenZipContextMenu, \n      IContextMenu *systemContextMenu);\n#endif // ifdef _WIN32 \n\n  void InvokeSystemCommand(const char *command);\n  void Properties();\n  void EditCut();\n  void EditCopy();\n  void EditPaste();\n\n  int _startGroupSelect;\n\n  bool _selectionIsDefined;\n  bool _selectMark;\n  int _prevFocusedItem;\n\n \n  // void SortItems(int index);\n  void SortItemsWithPropID(PROPID propID);\n\n  void GetSelectedItemsIndices(CRecordVector<UInt32> &indices) const;\n  void GetOperatedItemIndices(CRecordVector<UInt32> &indices) const;\n  void GetAllItemIndices(CRecordVector<UInt32> &indices) const;\n  void GetOperatedIndicesSmart(CRecordVector<UInt32> &indices) const;\n  // void GetOperatedListViewIndices(CRecordVector<UInt32> &indices) const;\n  void KillSelection();\n\n  UString GetFolderTypeID() const;\n  bool IsRootFolder() const;\n  bool IsFSFolder() const;\n  bool IsFSDrivesFolder() const;\n\n  UString GetFsPath() const;\n  UString GetDriveOrNetworkPrefix() const;\n\n  bool DoesItSupportOperations() const;\n\n  bool _processTimer;\n  bool _processNotify;\n\n  class CDisableTimerProcessing\n  {\n    bool _processTimerMem;\n    bool _processNotifyMem;\n\n    CPanel &_panel;\n    public:\n\n    CDisableTimerProcessing(CPanel &panel): _panel(panel) \n    { \n      Disable();\n    }\n    void Disable()\n    {\n      _processTimerMem = _panel._processTimer;\n      _processNotifyMem = _panel._processNotify;\n      _panel._processTimer = false; \n      _panel._processNotify = false; \n    }\n    void Restore()\n    {\n      _panel._processTimer = _processTimerMem; \n      _panel._processNotify = _processNotifyMem; \n    }\n    ~CDisableTimerProcessing() \n    { \n      Restore();\n    }\n    CDisableTimerProcessing& operator=(const CDisableTimerProcessing &) {; }\n  };\n\n  // bool _passwordIsDefined;\n  // UString _password;\n\n  void RefreshListCtrl();\n\n  void MessageBoxInfo(LPCWSTR message, LPCWSTR caption);\n  void MessageBox(LPCWSTR message);\n  void MessageBox(LPCWSTR message, LPCWSTR caption);\n  void MessageBoxMyError(LPCWSTR message);\n  void MessageBoxError(HRESULT errorCode, LPCWSTR caption);\n  void MessageBoxError(HRESULT errorCode);\n  void MessageBoxLastError(LPCWSTR caption);\n  void MessageBoxLastError();\n\n  void MessageBoxErrorLang(UINT resourceID, UInt32 langID);\n\n  void OpenFocusedItemAsInternal();\n  void OpenSelectedItems(bool internal);\n\n  void OpenFolderExternal(int index);\n\n  void OpenFolder(int index);\n  HRESULT OpenParentArchiveFolder();\n  HRESULT OpenItemAsArchive(const UString &name,\n      const UString &folderPath,\n      const UString &filePath,\n      const UString &virtualFilePath,\n      bool &encrypted);\n  HRESULT OpenItemAsArchive(const UString &aName);\n  HRESULT OpenItemAsArchive(int index);\n  void OpenItemInArchive(int index, bool tryInternal, bool tryExternal,\n      bool editMode);\n  HRESULT OnOpenItemChanged(const UString &folderPath, const UString &itemName, bool usePassword, const UString &password);\n  LRESULT OnOpenItemChanged(LPARAM lParam);\n\n  void OpenItem(int index, bool tryInternal, bool tryExternal);\n  void EditItem();\n  void EditItem(int index);\n\n  void RenameFile();\n  void ChangeComment();\n\n  void SetListViewMode(UInt32 index);\n  UInt32 GetListViewMode() const { return _ListViewMode; };\n\n  void ChangeFlatMode();\n  bool GetFlatMode() const { return _flatMode; };\n\n  void RefreshStatusBar();\n  void OnRefreshStatusBar();\n\n  void AddToArchive();\n\n  void GetFilePaths(const CRecordVector<UInt32> &indices, UStringVector &paths);\n  void ExtractArchives();\n  void TestArchives();\n\n  HRESULT CopyTo(const CRecordVector<UInt32> &indices, const UString &folder,\n      bool moveMode, bool showErrorMessages, UStringVector *messages,\n      bool &usePassword, UString &password);\n\n  HRESULT CopyTo(const CRecordVector<UInt32> &indices, const UString &folder,\n      bool moveMode, bool showErrorMessages, UStringVector *messages)\n  {\n    bool usePassword = false;\n    UString password;\n    if (_parentFolders.Size() > 0)\n    {\n      const CFolderLink &fl = _parentFolders.Back();\n      usePassword = fl.UsePassword;\n      password = fl.Password;\n    }\n    return CopyTo(indices, folder, moveMode, showErrorMessages, messages, usePassword, password);\n  }\n\n  HRESULT CopyFrom(const UString &folderPrefix, const UStringVector &filePaths, \n      bool showErrorMessages, UStringVector *messages);\n\n  void CopyFromNoAsk(const UStringVector &filePaths);\n  void CopyFromAsk(const UStringVector &filePaths);\n\n  // empty folderPath means create new Archive to path of first fileName.\n #ifdef _WIN32\n  void DropObject(IDataObject * dataObject, const UString &folderPath);\n\n  // empty folderPath means create new Archive to path of first fileName.\n  void CompressDropFiles(const UStringVector &fileNames, const UString &folderPath);\n#endif\n\n  void RefreshTitle(bool always = false) { _panelCallback->RefreshTitle(always);  }\n  void RefreshTitleAlways() { RefreshTitle(true);  }\n\n  UString GetItemsInfoString(const CRecordVector<UInt32> &indices);  \n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelCopy.cpp",
    "content": "// PanelExtract.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Panel.h\"\n#include \"resource.h\"\n#include \"LangUtils.h\"\n#include \"ExtractCallback.h\"\n#include \"Windows/Thread.h\"\n////////////////////////////////////////////////////////////////\n\n#include \"UpdateCallback100.h\"\n\nusing namespace NWindows;\n\nstruct CThreadExtractInArchive2\n{\n  CMyComPtr<IFolderOperations> FolderOperations;\n  CRecordVector<UInt32> Indices;\n  UString DestPath;\n  CExtractCallbackImp *ExtractCallbackSpec;\n  CMyComPtr<IFolderOperationsExtractCallback> ExtractCallback;\n  HRESULT Result;\n  bool MoveMode;\n\n  CThreadExtractInArchive2(): MoveMode(false) {}\n  \n  DWORD Extract()\n  {\n    ExtractCallbackSpec->ProgressDialog.WaitCreating();\n    if (MoveMode)\n      Result = FolderOperations->MoveTo(&Indices.Front(), Indices.Size(),\n          DestPath, ExtractCallback);\n    else\n      Result = FolderOperations->CopyTo(&Indices.Front(), Indices.Size(),\n          DestPath, ExtractCallback);\n    ExtractCallbackSpec->ProgressDialog.MyClose();\n    return 0;\n  }\n  \n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    return ((CThreadExtractInArchive2 *)param)->Extract();\n  }\n};\n\nHRESULT CPanel::CopyTo(const CRecordVector<UInt32> &indices, const UString &folder,\n    bool moveMode, bool showErrorMessages, UStringVector *messages,\n    bool &usePassword, UString &password)\n{\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    if (showErrorMessages)\n      MessageBox(errorMessage);\n    else if (messages != 0)\n      messages->Add(errorMessage);\n    return E_FAIL;\n  }\n\n  HRESULT res;\n  {\n  CThreadExtractInArchive2 extracter;\n  \n  extracter.ExtractCallbackSpec = new CExtractCallbackImp;\n  extracter.ExtractCallback = extracter.ExtractCallbackSpec;\n  extracter.ExtractCallbackSpec->ParentWindow = GetParent();\n  extracter.ExtractCallbackSpec->ShowMessages = showErrorMessages;\n  extracter.ExtractCallbackSpec->ProgressDialog.CompressingMode = false;\n  \n  UString title = moveMode ?\n      LangString(IDS_MOVING, 0x03020206):\n      LangString(IDS_COPYING, 0x03020205);\n  UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);\n  \n  extracter.ExtractCallbackSpec->ProgressDialog.MainWindow = GetParent();\n  extracter.ExtractCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle;\n  extracter.ExtractCallbackSpec->ProgressDialog.MainAddTitle = title + L\" \";\n    \n  extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore;\n  extracter.ExtractCallbackSpec->Init();\n  extracter.Indices = indices;\n  extracter.DestPath = folder;\n  extracter.FolderOperations = folderOperations;\n  extracter.MoveMode = moveMode;\n\n  extracter.ExtractCallbackSpec->PasswordIsDefined = usePassword;\n  extracter.ExtractCallbackSpec->Password = password;\n  \n  NWindows::CThread extractThread;\n  RINOK(extractThread.Create(CThreadExtractInArchive2::MyThreadFunction, &extracter));\n  extracter.ExtractCallbackSpec->StartProgressDialog(title);\n  \n  if (messages != 0)\n    *messages = extracter.ExtractCallbackSpec->Messages;\n  res = extracter.Result;\n\n  if (res == S_OK && extracter.ExtractCallbackSpec->Messages.IsEmpty())\n  {\n    usePassword = extracter.ExtractCallbackSpec->PasswordIsDefined;\n    password = extracter.ExtractCallbackSpec->Password;\n  }\n  }\n  RefreshTitleAlways();\n  return res;\n}\n\n\nstruct CThreadUpdate\n{\n  CMyComPtr<IFolderOperations> FolderOperations;\n  UString FolderPrefix;\n  UStringVector FileNames;\n  CRecordVector<const wchar_t *> FileNamePointers;\n  CMyComPtr<IFolderArchiveUpdateCallback> UpdateCallback;\n  CUpdateCallback100Imp *UpdateCallbackSpec;\n  HRESULT Result;\n  \n  DWORD Process()\n  {\n    UpdateCallbackSpec->ProgressDialog.WaitCreating();\n    Result = FolderOperations->CopyFrom(\n        FolderPrefix,\n        &FileNamePointers.Front(),\n        FileNamePointers.Size(),\n        UpdateCallback);\n    UpdateCallbackSpec->ProgressDialog.MyClose();\n    return 0;\n  }\n\n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    return ((CThreadUpdate *)param)->Process();\n  }\n};\n\n\nHRESULT CPanel::CopyFrom(const UString &folderPrefix, const UStringVector &filePaths,\n    bool showErrorMessages, UStringVector *messages)\n{\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    UString errorMessage = LangString(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    if (showErrorMessages)\n      MessageBox(errorMessage);\n    else if (messages != 0)\n      messages->Add(errorMessage);\n    return E_FAIL;\n  }\n\n  HRESULT res;\n  {\n  CThreadUpdate updater;\n  updater.UpdateCallbackSpec = new CUpdateCallback100Imp;\n  updater.UpdateCallback = updater.UpdateCallbackSpec;\n\n  UString title = LangString(IDS_COPYING, 0x03020205);\n  UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);\n\n  updater.UpdateCallbackSpec->ProgressDialog.MainWindow = GetParent();\n  updater.UpdateCallbackSpec->ProgressDialog.MainTitle = progressWindowTitle;\n  updater.UpdateCallbackSpec->ProgressDialog.MainAddTitle = title + UString(L\" \");\n  \n  updater.UpdateCallbackSpec->Init((HWND)*this, false, L\"\");\n  updater.FolderOperations = folderOperations;\n  updater.FolderPrefix = folderPrefix;\n  updater.FileNames.Reserve(filePaths.Size());\n  int i;\n  for(i = 0; i < filePaths.Size(); i++)\n    updater.FileNames.Add(filePaths[i]);\n  updater.FileNamePointers.Reserve(updater.FileNames.Size());\n  for(i = 0; i < updater.FileNames.Size(); i++)\n    updater.FileNamePointers.Add(updater.FileNames[i]);\n\n  NWindows::CThread thread;\n  RINOK(thread.Create(CThreadUpdate::MyThreadFunction, &updater));\n  updater.UpdateCallbackSpec->StartProgressDialog(title);\n  \n  if (messages != 0)\n    *messages = updater.UpdateCallbackSpec->Messages;\n\n  res = updater.Result;\n  }\n  RefreshTitleAlways();\n  return res;\n}\n\nvoid CPanel::CopyFromNoAsk(const UStringVector &filePaths)\n{\n  CDisableTimerProcessing disableTimerProcessing(*this);\n\n  CSelectedState srcSelState;\n  SaveSelectedState(srcSelState);\n\n  HRESULT result = CopyFrom(L\"\", filePaths, true, 0);\n\n  if (result != S_OK)\n  {\n    disableTimerProcessing.Restore();\n    // For Password:\n    SetFocusToList();\n    if (result != E_ABORT)\n      MessageBoxError(result);\n    return;\n  }\n\n  RefreshListCtrl(srcSelState);\n\n  disableTimerProcessing.Restore();\n  SetFocusToList();\n}\n\nvoid CPanel::CopyFromAsk(const UStringVector &filePaths)\n{\n  UString title = LangString(IDS_CONFIRM_FILE_COPY, 0x03020222);\n  UString message = LangString(IDS_WANT_TO_COPY_FILES, 0x03020223);\n  message += L\"\\n\\'\";\n  message += _currentFolderPrefix;\n  message += L\"\\' ?\";\n  int res = ::MessageBoxW(*(this), message, title, MB_YESNOCANCEL | MB_ICONQUESTION | MB_SYSTEMMODAL);\n  if (res != IDYES)\n    return;\n\n  CopyFromNoAsk(filePaths);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelCrc.cpp",
    "content": "// PanelSplitFile.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/Alloc.h\"\n  #include \"../../../../C/7zCrc.h\"\n}\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/FileIO.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/Thread.h\"\n#include \"Windows/Error.h\"\n\n#include \"ProgressDialog2.h\"\n#include \"OverwriteDialogRes.h\"\n\n#include \"App.h\"\n#include \"FormatUtils.h\"\n#include \"LangUtils.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NName;\n\nstatic const UInt32 kBufSize = (1 << 15);\n\nstruct CDirEnumerator\n{\n  bool FlatMode;\n  UString BasePrefix;\n  UStringVector FileNames;\n\n  CObjectVector<NFind::CEnumeratorW> Enumerators;\n  UStringVector Prefixes;\n  int Index;\n  bool GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UString &fullPath, DWORD &errorCode);\n  void Init();\n  \n  CDirEnumerator(): FlatMode(false) {};\n};\n\nvoid CDirEnumerator::Init()\n{\n  Enumerators.Clear();\n  Prefixes.Clear();\n  Index = 0;\n}\n\nbool CDirEnumerator::GetNextFile(NFind::CFileInfoW &fileInfo, bool &filled, UString &resPath, DWORD &errorCode)\n{\n  filled = false;\n  for (;;)\n  {\n    if (Enumerators.IsEmpty())\n    {\n      if (Index >= FileNames.Size())\n        return true;\n      const UString &path = FileNames[Index];\n      int pos = path.ReverseFind('\\\\');\n      resPath.Empty();\n      if (pos >= 0)\n        resPath = path.Left(pos + 1);\n      if (!NFind::FindFile(BasePrefix + path, fileInfo))\n      {\n        errorCode = ::GetLastError();\n        resPath = path;\n        return false;\n      }\n      Index++;\n      break;\n    }\n    bool found;\n    if (!Enumerators.Back().Next(fileInfo, found))\n    {\n      errorCode = ::GetLastError();\n      resPath = Prefixes.Back();\n      return false;\n    }\n    if (found)\n    {\n      resPath = Prefixes.Back();\n      break;\n    }\n    Enumerators.DeleteBack();\n    Prefixes.DeleteBack();\n  }\n  resPath += fileInfo.Name;\n  if (!FlatMode && fileInfo.IsDir())\n  {\n    UString prefix = resPath + (UString)(wchar_t)kDirDelimiter;\n    Enumerators.Add(NFind::CEnumeratorW(BasePrefix + prefix + (UString)(wchar_t)kAnyStringWildcard));\n    Prefixes.Add(prefix);\n  }\n  filled = true;\n  return true;\n}\n\nstruct CThreadCrc\n{\n  class CMyBuffer\n  {\n    void *_data;\n  public:\n    CMyBuffer(): _data(0) {}\n    operator void *() { return _data; }\n    bool Allocate(size_t size)\n    {\n      if (_data != 0)\n        return false;\n      _data = ::MidAlloc(size);\n      return _data != 0;\n    }\n    ~CMyBuffer() { ::MidFree(_data); }\n  };\n\n  CProgressDialog *ProgressDialog;\n\n  CDirEnumerator DirEnumerator;\n  \n  UInt64 NumFiles;\n  UInt64 NumFolders;\n  UInt64 DataSize;\n  UInt32 DataCrcSum;\n  UInt32 DataNameCrcSum;\n\n  HRESULT Result;\n  DWORD ErrorCode;\n  UString ErrorPath;\n  UString Error;\n  bool ThereIsError;\n  \n  void Process2()\n  {\n    DataSize = NumFolders = NumFiles = DataCrcSum = DataNameCrcSum = 0;\n    ProgressDialog->WaitCreating();\n\n    CMyBuffer bufferObject;\n    if (!bufferObject.Allocate(kBufSize))\n    {\n      Error = L\"Can not allocate memory\";\n      ThereIsError = true;\n      return;\n    }\n    Byte *buffer = (Byte *)(void *)bufferObject;\n\n    UInt64 totalSize = 0;\n\n    DirEnumerator.Init();\n\n    UString scanningStr = LangString(IDS_SCANNING, 0x03020800);\n    scanningStr += L\" \";\n\n    for (;;)\n    {\n      NFile::NFind::CFileInfoW fileInfo;\n      bool filled;\n      UString resPath;\n      if (!DirEnumerator.GetNextFile(fileInfo, filled, resPath, ErrorCode))\n      {\n        ThereIsError = true;\n        ErrorPath = resPath;\n        return;\n      }\n      if (!filled)\n        break;\n      if (!fileInfo.IsDir())\n        totalSize += fileInfo.Size;\n      ProgressDialog->ProgressSynch.SetCurrentFileName(scanningStr + resPath);\n      ProgressDialog->ProgressSynch.SetProgress(totalSize, 0);\n      Result = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(0);\n      if (Result != S_OK)\n        return;\n    }\n\n    ProgressDialog->ProgressSynch.SetProgress(totalSize, 0);\n\n    DirEnumerator.Init();\n\n    for (;;)\n    {\n      NFile::NFind::CFileInfoW fileInfo;\n      bool filled;\n      UString resPath;\n      if (!DirEnumerator.GetNextFile(fileInfo, filled, resPath, ErrorCode))\n      {\n        ThereIsError = true;\n        ErrorPath = resPath;\n        return;\n      }\n      if (!filled)\n        break;\n\n      UInt32 crc = CRC_INIT_VAL;\n      if (fileInfo.IsDir())\n        NumFolders++;\n      else\n      {\n        NFile::NIO::CInFile inFile;\n        if (!inFile.Open(DirEnumerator.BasePrefix + resPath))\n        {\n          ErrorCode = ::GetLastError();\n          ThereIsError = true;\n          ErrorPath = resPath;\n          return;\n        }\n        NumFiles++;\n        ProgressDialog->ProgressSynch.SetCurrentFileName(resPath);\n        for (;;)\n        {\n          UInt32 processedSize;\n          if (!inFile.Read(buffer, kBufSize, processedSize))\n          {\n            ErrorCode = ::GetLastError();\n            ThereIsError = true;\n            ErrorPath = resPath;\n            return;\n          }\n          if (processedSize == 0)\n            break;\n          crc = CrcUpdate(crc, buffer, processedSize);\n          DataSize += processedSize;\n          Result = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(DataSize);\n          if (Result != S_OK)\n            return;\n        }\n        DataCrcSum += CRC_GET_DIGEST(crc);\n      }\n      for (int i = 0; i < resPath.Length(); i++)\n      {\n        wchar_t c = resPath[i];\n        crc = CRC_UPDATE_BYTE(crc, ((Byte)(c & 0xFF)));\n        crc = CRC_UPDATE_BYTE(crc, ((Byte)((c >> 8) & 0xFF)));\n      }\n      DataNameCrcSum += CRC_GET_DIGEST(crc);\n      Result = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(DataSize);\n      if (Result != S_OK)\n        return;\n    }\n  }\n  DWORD Process()\n  {\n    try { Process2(); }\n    catch(...) { Error = L\"Error\"; ThereIsError = true;}\n    ProgressDialog->MyClose();\n    return 0;\n  }\n  \n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    return ((CThreadCrc *)param)->Process();\n  }\n};\n\nstatic void ConvertUInt32ToHex(UInt32 value, wchar_t *s)\n{\n  for (int i = 0; i < 8; i++)\n  {\n    int t = value & 0xF;\n    value >>= 4;\n    s[7 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10)));\n  }\n  s[8] = L'\\0';\n}\n\nvoid CApp::CalculateCrc()\n{\n  int srcPanelIndex = GetFocusedPanelIndex();\n  CPanel &srcPanel = Panels[srcPanelIndex];\n  if (!srcPanel.IsFSFolder())\n  {\n    srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n  CRecordVector<UInt32> indices;\n  srcPanel.GetOperatedItemIndices(indices);\n  if (indices.IsEmpty())\n    return;\n\n  CThreadCrc combiner;\n  for (int i = 0; i < indices.Size(); i++)\n    combiner.DirEnumerator.FileNames.Add(srcPanel.GetItemRelPath(indices[i]));\n  combiner.DirEnumerator.BasePrefix = srcPanel._currentFolderPrefix;\n  combiner.DirEnumerator.FlatMode = GetFlatMode();\n\n  {\n  CProgressDialog progressDialog;\n  combiner.ProgressDialog = &progressDialog;\n  combiner.ErrorCode = 0;\n  combiner.Result = S_OK;\n  combiner.ThereIsError = false;\n\n  UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);\n  UString title = LangString(IDS_CHECKSUM_CALCULATING, 0x03020710);\n\n  progressDialog.MainWindow = _window;\n  progressDialog.MainTitle = progressWindowTitle;\n  progressDialog.MainAddTitle = title + UString(L\" \");\n\n  NWindows::CThread thread;\n  if (thread.Create(CThreadCrc::MyThreadFunction, &combiner) != S_OK)\n    return;\n  progressDialog.Create(title, _window);\n\n  if (combiner.Result != S_OK)\n  {\n    if (combiner.Result != E_ABORT)\n      srcPanel.MessageBoxError(combiner.Result);\n  }\n  else if (combiner.ThereIsError)\n  {\n    if (combiner.Error.IsEmpty())\n    {\n      UString message = combiner.DirEnumerator.BasePrefix + combiner.ErrorPath;\n      message += L\"\\n\";\n      message += NError::MyFormatMessageW(combiner.ErrorCode);\n      srcPanel.MessageBoxMyError(message);\n    }\n    else\n      srcPanel.MessageBoxMyError(combiner.Error);\n  }\n  else\n  {\n    UString s;\n    {\n      wchar_t sz[32];\n\n      s += LangString(IDS_FILES_COLON, 0x02000320);\n      s += L\" \";\n      ConvertUInt64ToString(combiner.NumFiles, sz);\n      s += sz;\n      s += L\"\\n\";\n      \n      s += LangString(IDS_FOLDERS_COLON, 0x02000321);\n      s += L\" \";\n      ConvertUInt64ToString(combiner.NumFolders, sz);\n      s += sz;\n      s += L\"\\n\";\n\n      s += LangString(IDS_SIZE_COLON, 0x02000322);\n      s += L\" \";\n      ConvertUInt64ToString(combiner.DataSize, sz);\n      s += MyFormatNew(IDS_FILE_SIZE, 0x02000982, sz);;\n      s += L\"\\n\";\n\n      s += LangString(IDS_CHECKSUM_CRC_DATA, 0x03020721);\n      s += L\" \";\n      ConvertUInt32ToHex(combiner.DataCrcSum, sz);\n      s += sz;\n      s += L\"\\n\";\n\n      s += LangString(IDS_CHECKSUM_CRC_DATA_NAMES, 0x03020722);\n      s += L\" \";\n      ConvertUInt32ToHex(combiner.DataNameCrcSum, sz);\n      s += sz;\n    }\n    srcPanel.MessageBoxInfo(s, LangString(IDS_CHECKSUM_INFORMATION, 0x03020720));\n  }\n  }\n  RefreshTitleAlways();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelFolderChange.cpp",
    "content": "// PanelFolderChange.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/Wildcard.h\"\n#include \"Windows/FileDir.h\"\n\n#include \"../../PropID.h\"\n\n#include \"Panel.h\"\n#include \"ListViewDialog.h\"\n#include \"RootFolder.h\"\n#include \"ViewSettings.h\"\n#ifdef _WIN32\n#include \"FSDrives.h\"\n#endif\n#include \"LangUtils.h\"\n#include \"resource.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NFind;\n\nvoid CPanel::SetToRootFolder()\n{\n  _folder.Release();\n  _library.Free();\n  CRootFolder *rootFolderSpec = new CRootFolder;\n  _folder = rootFolderSpec;\n  rootFolderSpec->Init();\n}\n\nHRESULT CPanel::BindToPath(const UString &fullPath, bool &archiveIsOpened, bool &encrypted)\n{\n  archiveIsOpened = false;\n  encrypted = false;\n  CDisableTimerProcessing disableTimerProcessing1(*this);\n\n  printf(\"CPanel::BindToPath(%ls)\\n\",(const wchar_t *)fullPath);\n\n  if (_parentFolders.Size() > 0)\n  {\n    const UString &virtPath = _parentFolders.Back().VirtualPath;\n    if (fullPath.Left(virtPath.Length()) == virtPath)\n    {\n      for (;;)\n      {\n        CMyComPtr<IFolderFolder> newFolder;\n        HRESULT res = _folder->BindToParentFolder(&newFolder);\n        if (!newFolder || res != S_OK)\n          break;\n        _folder = newFolder;\n      }\n      UStringVector parts;\n      SplitPathToParts(fullPath.Mid(virtPath.Length()), parts);\n      for (int i = 0; i < parts.Size(); i++)\n      {\n        const UString &s = parts[i];\n        if ((i == 0 || i == parts.Size() - 1) && s.IsEmpty())\n          continue;\n        CMyComPtr<IFolderFolder> newFolder;\n        HRESULT res = _folder->BindToFolder(s, &newFolder);\n        if (!newFolder || res != S_OK)\n          break;\n        _folder = newFolder;\n      }\n      return S_OK;\n    }\n  }\n\n  CloseOpenFolders();\n  UString sysPath = fullPath;\n  CFileInfoW fileInfo;\n  UStringVector reducedParts;\n  while(!sysPath.IsEmpty())\n  {\n    if (FindFile(sysPath, fileInfo))\n      break;\n    int pos = sysPath.ReverseFind(WCHAR_PATH_SEPARATOR);\n    if (pos < 0)\n      sysPath.Empty();\n    else\n    {\n      if (reducedParts.Size() > 0 || pos < sysPath.Length() - 1)\n        reducedParts.Add(sysPath.Mid(pos + 1));\n      sysPath = sysPath.Left(pos);\n    }\n  }\n  SetToRootFolder();\n  CMyComPtr<IFolderFolder> newFolder;\n  if (sysPath.IsEmpty())\n  {\n    if (_folder->BindToFolder(fullPath, &newFolder) == S_OK)\n      _folder = newFolder;\n  }\n  else if (fileInfo.IsDir())\n  {\n    NName::NormalizeDirPathPrefix(sysPath);\n    if (_folder->BindToFolder(sysPath, &newFolder) == S_OK)\n      _folder = newFolder;\n  }\n  else\n  {\n    UString dirPrefix;\n    if (!NDirectory::GetOnlyDirPrefix(sysPath, dirPrefix))\n      dirPrefix.Empty();\n    if (_folder->BindToFolder(dirPrefix, &newFolder) == S_OK)\n    {\n      _folder = newFolder;\n      LoadFullPath();\n      UString fileName;\n      if (NDirectory::GetOnlyName(sysPath, fileName))\n      {\n        HRESULT res =\n          OpenItemAsArchive(fileName, _currentFolderPrefix,\n            _currentFolderPrefix + fileName,\n            _currentFolderPrefix + fileName,\n            encrypted);\n        if (res != S_FALSE)\n        {\n          RINOK(res);\n        }\n        /*\n        if (res == E_ABORT)\n          return res;\n        */\n        if (res == S_OK)\n        {\n          archiveIsOpened = true;\n          for (int i = reducedParts.Size() - 1; i >= 0; i--)\n          {\n            CMyComPtr<IFolderFolder> newFolder;\n            _folder->BindToFolder(reducedParts[i], &newFolder);\n            if (!newFolder)\n              break;\n            _folder = newFolder;\n          }\n        }\n      }\n    }\n  }\n  return S_OK;\n}\n\nHRESULT CPanel::BindToPathAndRefresh(const UString &path)\n{\n  CDisableTimerProcessing disableTimerProcessing1(*this);\n  bool archiveIsOpened, encrypted;\n  RINOK(BindToPath(path, archiveIsOpened, encrypted));\n  RefreshListCtrl(UString(), -1, true, UStringVector());\n  return S_OK;\n}\n\nvoid CPanel::SetBookmark(int index)\n{\n  _appState->FastFolders.SetString(index, _currentFolderPrefix);\n}\n\nvoid CPanel::OpenBookmark(int index)\n{\n  BindToPathAndRefresh(_appState->FastFolders.GetString(index));\n}\n\nUString GetFolderPath(IFolderFolder *folder)\n{\n  NCOM::CPropVariant prop;\n  if (folder->GetFolderProperty(kpidPath, &prop) == S_OK)\n    if (prop.vt == VT_BSTR)\n      return (wchar_t *)prop.bstrVal;\n  return UString();\n}\n\nvoid CPanel::LoadFullPath()\n{\n  _currentFolderPrefix.Empty();\n  for (int i = 0; i < _parentFolders.Size(); i++)\n  {\n    const CFolderLink &folderLink = _parentFolders[i];\n    _currentFolderPrefix += GetFolderPath(folderLink.ParentFolder);\n    _currentFolderPrefix += folderLink.ItemName;\n    _currentFolderPrefix += WCHAR_PATH_SEPARATOR;\n  }\n  if (_folder)\n    _currentFolderPrefix += GetFolderPath(_folder);\n}\n\nstatic int GetRealIconIndex(LPCWSTR path, DWORD attributes)\n{\n  int index = -1;\n  if (GetRealIconIndex(path, attributes, index) != 0)\n    return index;\n  return -1;\n}\n\nvoid CPanel::LoadFullPathAndShow()\n{\n  LoadFullPath();\n  _appState->FolderHistory.AddString(_currentFolderPrefix);\n\n  _headerComboBox.SetText(_currentFolderPrefix);\n#ifdef _WIN32 // FIXME\n  COMBOBOXEXITEM item;\n  item.mask = 0;\n\n  UString path = _currentFolderPrefix;\n  if (path.Length() > 3 && path[path.Length() - 1] == WCHAR_PATH_SEPARATOR)\n    path.Delete(path.Length() - 1);\n\n  CFileInfoW info;\n  DWORD attrib = FILE_ATTRIBUTE_DIRECTORY;\n  if (NFile::NFind::FindFile(path, info))\n    attrib = info.Attrib;\n  \n  item.iImage = GetRealIconIndex(path, attrib);\n\n  if (item.iImage >= 0)\n  {\n    item.iSelectedImage = item.iImage;\n    item.mask |= (CBEIF_IMAGE | CBEIF_SELECTEDIMAGE);\n  }\n  item.iItem = -1;\n  _headerComboBox.SetItem(&item);\n#endif\n\n  RefreshTitle();\n}\n\n#ifdef _WIN32\nLRESULT CPanel::OnNotifyComboBoxEnter(const UString &s)\n{\n  if (BindToPathAndRefresh(GetUnicodeString(s)) == S_OK)\n  {\n    PostMessage(kSetFocusToListView);\n    return TRUE;\n  }\n  return FALSE;\n}\n\nbool CPanel::OnNotifyComboBoxEndEdit(PNMCBEENDEDITW info, LRESULT &result)\n{\n  if (info->iWhy == CBENF_ESCAPE)\n  {\n    _headerComboBox.SetText(_currentFolderPrefix);\n    PostMessage(kSetFocusToListView);\n    result = FALSE;\n    return true;\n  }\n\n  /*\n  if (info->iWhy == CBENF_DROPDOWN)\n  {\n    result = FALSE;\n    return true;\n  }\n  */\n\n  if (info->iWhy == CBENF_RETURN)\n  {\n    // When we use Edit control and press Enter.\n    UString s;\n    _headerComboBox.GetText(s);\n    result = OnNotifyComboBoxEnter(s);\n    return true;\n  }\n  return false;\n}\n\n#ifndef _UNICODE\nbool CPanel::OnNotifyComboBoxEndEdit(PNMCBEENDEDIT info, LRESULT &result)\n{\n  if (info->iWhy == CBENF_ESCAPE)\n  {\n    _headerComboBox.SetText(_currentFolderPrefix);\n    PostMessage(kSetFocusToListView);\n    result = FALSE;\n    return true;\n  }\n  /*\n  if (info->iWhy == CBENF_DROPDOWN)\n  {\n    result = FALSE;\n    return true;\n  }\n  */\n\n  if (info->iWhy == CBENF_RETURN)\n  {\n    UString s;\n    _headerComboBox.GetText(s);\n    // GetUnicodeString(info->szText)\n    result = OnNotifyComboBoxEnter(s);\n    return true;\n  }\n  return false;\n}\n#endif\n\nvoid CPanel::AddComboBoxItem(const UString &name, int iconIndex, int indent, bool addToList)\n{\n  COMBOBOXEXITEMW item;\n  item.mask = CBEIF_TEXT | CBEIF_INDENT;\n  item.iSelectedImage = item.iImage = iconIndex;\n  if (iconIndex >= 0)\n    item.mask |= (CBEIF_IMAGE | CBEIF_SELECTEDIMAGE);\n  item.iItem = -1;\n  item.iIndent = indent;\n  item.pszText = (LPWSTR)(LPCWSTR)name;\n  _headerComboBox.InsertItem(&item);\n  if (addToList)\n    ComboBoxPaths.Add(name);\n}\n\nextern UString RootFolder_GetName_Computer(int &iconIndex);\nextern UString RootFolder_GetName_Network(int &iconIndex);\nextern UString RootFolder_GetName_Documents(int &iconIndex);\n\nbool CPanel::OnComboBoxCommand(UINT code, LPARAM /* param */, LRESULT &result)\n{\n  result = FALSE;\n  switch(code)\n  {\n    case CBN_DROPDOWN:\n    {\n      ComboBoxPaths.Clear();\n      _headerComboBox.ResetContent();\n      \n      int iconIndex;\n      UString name;\n\n      int i;\n      UStringVector pathParts;\n      \n      SplitPathToParts(_currentFolderPrefix, pathParts);\n      UString sumPass;\n      for (i = 0; i < pathParts.Size(); i++)\n      {\n        UString name = pathParts[i];\n        if (name.IsEmpty())\n          continue;\n        sumPass += name;\n        UString curName = sumPass;\n        if (i == 0)\n          curName += WSTRING_PATH_SEPARATOR;\n        CFileInfoW info;\n        DWORD attrib = FILE_ATTRIBUTE_DIRECTORY;\n        if (NFile::NFind::FindFile(sumPass, info))\n          attrib = info.Attrib;\n        sumPass += WSTRING_PATH_SEPARATOR;\n        AddComboBoxItem(name, GetRealIconIndex(curName, attrib), i, false);\n        ComboBoxPaths.Add(sumPass);\n      }\n\n      name = RootFolder_GetName_Documents(iconIndex);\n      AddComboBoxItem(name, iconIndex, 0, true);\n\n      name = RootFolder_GetName_Computer(iconIndex);\n      AddComboBoxItem(name, iconIndex, 0, true);\n        \n      UStringVector driveStrings;\n      MyGetLogicalDriveStrings(driveStrings);\n      for (i = 0; i < driveStrings.Size(); i++)\n      {\n        UString s = driveStrings[i];\n        ComboBoxPaths.Add(s);\n        int iconIndex = GetRealIconIndex(s, 0);\n        if (s.Length() > 0 && s[s.Length() - 1] == CHAR_PATH_SEPARATOR)\n          s.Delete(s.Length() - 1);\n        AddComboBoxItem(s, iconIndex, 1, false);\n      }\n\n      name = RootFolder_GetName_Network(iconIndex);\n      AddComboBoxItem(name, iconIndex, 0, true);\n\n      // UStringVector strings; _appState->FolderHistory.GetList(strings);\n    \n      return false;\n    }\n\n    case CBN_SELENDOK:\n    {\n      code = code;\n      int index = _headerComboBox.GetCurSel();\n      if (index >= 0)\n      {\n        UString pass = ComboBoxPaths[index];\n        _headerComboBox.SetCurSel(-1);\n        _headerComboBox.SetText(pass); // it's fix for seclecting by mouse.\n        if (BindToPathAndRefresh(pass) == S_OK)\n        {\n          PostMessage(kSetFocusToListView);\n          return true;\n        }\n      }\n      return false;\n    }\n    /*\n    case CBN_CLOSEUP:\n    {\n      LoadFullPathAndShow();\n      true;\n\n    }\n    case CBN_SELCHANGE:\n    {\n      // LoadFullPathAndShow();\n      return true;\n    }\n    */\n  }\n  return false;\n}\n\nbool CPanel::OnNotifyComboBox(LPNMHDR header, LRESULT &result)\n{\n  switch(header->code)\n  {\n    case CBEN_BEGINEDIT:\n    {\n      _lastFocusedIsList = false;\n      _panelCallback->PanelWasFocused();\n      break;\n    }\n    #ifndef _UNICODE\n    case CBEN_ENDEDIT:\n    {\n      return OnNotifyComboBoxEndEdit((PNMCBEENDEDIT)header, result);\n    }\n    #endif\n    case CBEN_ENDEDITW:\n    {\n      return OnNotifyComboBoxEndEdit((PNMCBEENDEDITW)header, result);\n    }\n  }\n  return false;\n}\n#endif\n\n\nvoid CPanel::FoldersHistory()\n{\n  CListViewDialog listViewDialog;\n  listViewDialog.DeleteIsAllowed = true;\n  listViewDialog.Title = LangString(IDS_FOLDERS_HISTORY, 0x03020260);\n  _appState->FolderHistory.GetList(listViewDialog.Strings);\n  if (listViewDialog.Create(GetParent()) == IDCANCEL)\n    return;\n  UString selectString;\n  if (listViewDialog.StringsWereChanged)\n  {\n    _appState->FolderHistory.RemoveAll();\n    for (int i = listViewDialog.Strings.Size() - 1; i >= 0; i--)\n      _appState->FolderHistory.AddString(listViewDialog.Strings[i]);\n    if (listViewDialog.FocusedItemIndex >= 0)\n      selectString = listViewDialog.Strings[listViewDialog.FocusedItemIndex];\n  }\n  else\n  {\n    if (listViewDialog.FocusedItemIndex >= 0)\n      selectString = listViewDialog.Strings[listViewDialog.FocusedItemIndex];\n  }\n  if (listViewDialog.FocusedItemIndex >= 0)\n    BindToPathAndRefresh(selectString);\n}\n\nvoid CPanel::OpenParentFolder()\n{\nprintf(\"CPanel::OpenParentFolder\\n\");\n  LoadFullPath(); // Maybe we don't need it ??\n  UString focucedName;\n  if (!_currentFolderPrefix.IsEmpty())\n  {\n    UString string = _currentFolderPrefix;\n    string.Delete(string.Length() - 1);\n    int pos = string.ReverseFind(WCHAR_PATH_SEPARATOR);\n    if (pos < 0)\n      pos = 0;\n    else\n      pos++;\n    focucedName = string.Mid(pos);\n  }\n\n  printf(\"CPanel::OpenParentFolder focucedName=%ls\\n\",(const wchar_t *)focucedName);\n\n  CDisableTimerProcessing disableTimerProcessing1(*this);\n  CMyComPtr<IFolderFolder> newFolder;\n  _folder->BindToParentFolder(&newFolder);\n  if (newFolder)\n    _folder = newFolder;\n  else\n  {\n    if (_parentFolders.IsEmpty())\n    {\n      SetToRootFolder();\n      if (focucedName.IsEmpty())\n        focucedName = GetItemName(0);\n    }\n    else\n    {\n      _folder.Release();\n      _library.Free();\n      CFolderLink &link = _parentFolders.Back();\n      _folder = link.ParentFolder;\n      _library.Attach(link.Library.Detach());\n      focucedName = link.ItemName;\n      if (_parentFolders.Size () > 1)\n        OpenParentArchiveFolder();\n      _parentFolders.DeleteBack();\n    }\n  }\n\n  UStringVector selectedItems;\n  /*\n  if (!focucedName.IsEmpty())\n    selectedItems.Add(focucedName);\n  */\n  LoadFullPath();\n  // ::SetCurrentDirectory(::_currentFolderPrefix);\n  RefreshListCtrl(focucedName, -1, true, selectedItems);\n  _listView.EnsureVisible(_listView.GetFocusedItem(), false);\n  RefreshStatusBar();\n\n  printf(\"CPanel::OpenParentFolder-end\\n\");\n}\n\nvoid CPanel::CloseOpenFolders()\n{\n  while(_parentFolders.Size() > 0)\n  {\n    _folder.Release();\n    _library.Free();\n    _folder = _parentFolders.Back().ParentFolder;\n    _library.Attach(_parentFolders.Back().Library.Detach());\n    if (_parentFolders.Size () > 1)\n      OpenParentArchiveFolder();\n    _parentFolders.DeleteBack();\n  }\n  _folder.Release();\n  _library.Free();\n}\n\nvoid CPanel::OpenRootFolder()\n{\n  CDisableTimerProcessing disableTimerProcessing1(*this);\n  _parentFolders.Clear();\n  SetToRootFolder();\n  RefreshListCtrl(UString(), -1, true, UStringVector());\n  // ::SetCurrentDirectory(::_currentFolderPrefix);\n  /*\n  BeforeChangeFolder();\n  _currentFolderPrefix.Empty();\n  AfterChangeFolder();\n  SetCurrentPathText();\n  RefreshListCtrl(UString(), 0, UStringVector());\n  _listView.EnsureVisible(_listView.GetFocusedItem(), false);\n  */\n}\n\nvoid CPanel::OpenDrivesFolder()\n{\n#ifdef _WIN32\n  CloseOpenFolders();\n  CFSDrives *fsFolderSpec = new CFSDrives;\n  _folder = fsFolderSpec;\n  fsFolderSpec->Init();\n  RefreshListCtrl();\n#else\n  printf(\"CPanel::OpenDrivesFolder : FIXME\\n\");\n#endif\n}\n\nvoid CPanel::OpenFolder(int index)\n{\n  if (index == kParentIndex)\n  {\n    OpenParentFolder();\n    return;\n  }\n  CMyComPtr<IFolderFolder> newFolder;\n  _folder->BindToFolder(index, &newFolder);\n  if (!newFolder)\n    return;\n  _folder = newFolder;\n  LoadFullPath();\n  // ::SetCurrentDirectory(::_currentFolderPrefix);\n  RefreshListCtrl();\n  UINT state = LVIS_SELECTED;\n  _listView.SetItemState(_listView.GetFocusedItem(), state, state);\n  _listView.EnsureVisible(_listView.GetFocusedItem(), false);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelItemOpen.cpp",
    "content": "// PanelItemOpen.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n\n#ifdef __BORLANDC__\n#pragma hdrstop\n#endif\n\n#ifndef WX_PRECOMP\n#include \"wx/wx.h\"\n#endif\n#include \"wx/mimetype.h\"\n\n#include \"resource.h\"\n\n#include \"Common/StringConvert.h\"\n// FIXME #include \"Common/Random.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/AutoPtr.h\"\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/Thread.h\"\n#include \"Windows/Synchronization.h\"\n#include \"Windows/Error.h\"\n\n#include \"ExtractCallback.h\"\n#include \"UpdateCallback100.h\"\n#include \"IFolder.h\"\n#include \"FileFolderPluginOpen.h\"\n#include \"FormatUtils.h\"\n#include \"Panel.h\"\n#include \"RegistryUtils.h\"\n#include \"LangUtils.h\"\n\nusing namespace NWindows;\nusing namespace NSynchronization;\nusing namespace NFile;\nusing namespace NDirectory;\n\nextern HWND g_HWND;\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\nstatic const wchar_t *kTempDirPrefix = L\"7zO\";\n\n\nstatic bool IsNameVirus(const UString &name)\n{\n  return (name.Find(L\"     \") >= 0);\n}\n\nstruct CTmpProcessInfo: public CTempFileInfo\n{\n  HANDLE ProcessHandle;\n  HWND Window;\n  UString FullPathFolderPrefix;\n  bool UsePassword;\n  UString Password;\n  CTmpProcessInfo(): UsePassword(false) {}\n};\n\nclass CTmpProcessInfoRelease\n{\n  CTmpProcessInfo *_tmpProcessInfo;\npublic:\n  bool _needDelete;\n  CTmpProcessInfoRelease(CTmpProcessInfo &tmpProcessInfo):\n      _tmpProcessInfo(&tmpProcessInfo), _needDelete(true) {}\n  ~CTmpProcessInfoRelease()\n  {\n    if (_needDelete)\n      _tmpProcessInfo->DeleteDirAndFile();\n  }\n};\n\nHRESULT CPanel::OpenItemAsArchive(const UString &name,\n    const UString &folderPath, const UString &filePath,\n    const UString &virtualFilePath,\n    bool &encrypted)\n{\n  encrypted = false;\n  CFolderLink folderLink;\n  if (!NFile::NFind::FindFile(filePath, folderLink.FileInfo))\n    return E_FAIL;\n  if (folderLink.FileInfo.IsDir())\n    return S_FALSE;\n\n  folderLink.FilePath = filePath;\n  folderLink.FolderPath = folderPath;\n  folderLink.VirtualPath = virtualFilePath;\n\n  CMyComPtr<IFolderFolder> newFolder;\n\n  // _passwordIsDefined = false;\n  // _password.Empty();\n\n  NDLL::CLibrary library;\n\n  UString password;\n  RINOK(OpenFileFolderPlugin(filePath, &library, &newFolder, GetParent(), encrypted, password));\n \n  folderLink.Password = password;\n  folderLink.UsePassword = encrypted;\n\n  folderLink.ParentFolder = _folder;\n  folderLink.ItemName = name;\n  _parentFolders.Add(folderLink);\n  _parentFolders.Back().Library.Attach(_library.Detach());\n\n  _folder.Release();\n  _library.Free();\n  _folder = newFolder;\n  _library.Attach(library.Detach());\n\n  return S_OK;\n}\n\nHRESULT CPanel::OpenItemAsArchive(const UString &name)\n{\n  bool encrypted;\n  return OpenItemAsArchive(name, _currentFolderPrefix,\n      _currentFolderPrefix + name,\n      _currentFolderPrefix + name,\n      encrypted);\n}\n\nHRESULT CPanel::OpenItemAsArchive(int index)\n{\n  CDisableTimerProcessing disableTimerProcessing1(*this);\n  RINOK(OpenItemAsArchive(GetItemRelPath(index)));\n  RefreshListCtrl();\n  return S_OK;\n}\n\nHRESULT CPanel::OpenParentArchiveFolder()\n{\n  CDisableTimerProcessing disableTimerProcessing1(*this);\n  if (_parentFolders.Size() < 2)\n    return S_OK;\n  CFolderLink &folderLink = _parentFolders.Back();\n  NFind::CFileInfoW newFileInfo;\n  if (NFind::FindFile(folderLink.FilePath, newFileInfo))\n  {\n    if (newFileInfo.Size != folderLink.FileInfo.Size ||\n        CompareFileTime(&newFileInfo.MTime, &folderLink.FileInfo.MTime) != 0)\n    {\n      UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE,\n          0x03020280, folderLink.ItemName);\n      if (::MessageBoxW(HWND(*this), message, L\"7-Zip\", MB_OKCANCEL | MB_ICONQUESTION) == IDOK)\n      {\n        if (OnOpenItemChanged(folderLink.FolderPath, folderLink.ItemName,\n            folderLink.UsePassword, folderLink.Password) != S_OK)\n        {\n          ::MessageBoxW(HWND(*this), MyFormatNew(IDS_CANNOT_UPDATE_FILE,\n              0x03020281, folderLink.FilePath), L\"7-Zip\", MB_OK | MB_ICONSTOP);\n          return S_OK;\n        }\n      }\n    }\n  }\n  folderLink.DeleteDirAndFile();\n  return S_OK;\n}\n\nstatic const wchar_t *kStartExtensions[] =\n{\n  L\"exe\", L\"bat\", L\"com\",\n  L\"chm\",\n  L\"msi\", L\"doc\", L\"xls\", L\"ppt\", L\"pps\", L\"wps\", L\"wpt\", L\"wks\", L\"xlr\", L\"wdb\",\n\n  L\"docx\", L\"docm\", L\"dotx\", L\"dotm\", L\"xlsx\", L\"xlsm\", L\"xltx\", L\"xltm\", L\"xlsb\",\n  L\"xlam\", L\"pptx\", L\"pptm\", L\"potx\", L\"potm\", L\"ppam\", L\"ppsx\", L\"ppsm\", L\"xsn\",\n\n  L\"dwf\", \n\n  L\"odt\", L\"ods\",\n  L\"wb3\",\n  L\"pdf\"\n};\n\nstatic bool DoItemAlwaysStart(const UString &name)\n{\n  int extPos = name.ReverseFind('.');\n  if (extPos < 0)\n    return false;\n  UString ext = name.Mid(extPos + 1);\n  ext.MakeLower();\n  for (int i = 0; i < sizeof(kStartExtensions) / sizeof(kStartExtensions[0]); i++)\n    if (ext.Compare(kStartExtensions[i]) == 0)\n      return true;\n  return false;\n}\n\n#ifdef _WIN32\nstatic HANDLE StartEditApplication(const UString &path, HWND window)\n{\n  UString command;\n  ReadRegEditor(command);\n  if (command.IsEmpty())\n  {\n    if (!MyGetWindowsDirectory(command))\n      return 0;\n    NFile::NName::NormalizeDirPathPrefix(command);\n    command += L\"notepad.exe\";\n  }\n  command = UString(L\"\\\"\") + command + UString(L\"\\\"\");\n  command += L\" \\\"\";\n  command += UString(path);\n  command += L\"\\\"\";\n\n  PROCESS_INFORMATION processInformation;\n  BOOL result;\n  #ifndef _UNICODE\n  if (!g_IsNT)\n  {\n    STARTUPINFOA startupInfo;\n    startupInfo.cb = sizeof(startupInfo);\n    startupInfo.lpReserved = 0;\n    startupInfo.lpDesktop = 0;\n    startupInfo.lpTitle = 0;\n    startupInfo.dwFlags = 0;\n    startupInfo.cbReserved2 = 0;\n    startupInfo.lpReserved2 = 0;\n    \n    result = ::CreateProcessA(NULL, (CHAR *)(const CHAR *)GetSystemString(command),\n      NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInformation);\n  }\n  else\n  #endif\n  {\n    STARTUPINFOW startupInfo;\n    startupInfo.cb = sizeof(startupInfo);\n    startupInfo.lpReserved = 0;\n    startupInfo.lpDesktop = 0;\n    startupInfo.lpTitle = 0;\n    startupInfo.dwFlags = 0;\n    startupInfo.cbReserved2 = 0;\n    startupInfo.lpReserved2 = 0;\n    \n    result = ::CreateProcessW(NULL, (WCHAR *)(const WCHAR *)command,\n      NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInformation);\n  }\n\n  if (result != FALSE)\n  {\n    ::CloseHandle(processInformation.hThread);\n    return processInformation.hProcess;\n  }\n  ::MessageBoxW(window, LangString(IDS_CANNOT_START_EDITOR, 0x03020282),\n      L\"7-Zip\", MB_OK  | MB_ICONSTOP);\n  return 0;\n}\n\n#ifndef _UNICODE\ntypedef BOOL (WINAPI * ShellExecuteExWP)(LPSHELLEXECUTEINFOW lpExecInfo);\n#endif\n\n#endif // _WIN32\n\nstatic void StartApplication(const UString &path, HWND window)\n{\n  // FIXME\n  extern const TCHAR * nameWindowToUnix(const TCHAR * lpFileName);\n  UString tmpPath = path;\n\n  wxString filename(nameWindowToUnix(tmpPath));\n\n\n  wxString ext = filename.AfterLast(_T('.'));\n\n  printf(\"StartApplication(%ls) ext='%ls'\\n\",(const wchar_t *)filename,(const wchar_t *)ext);\n\n  if ( ! ext.empty() )\n  {\n    wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext);\n    // printf(\"StartApplication(%ls) ft=%p\\n\",(const wchar_t *)filename,ft);\n    if (ft)\n    {\n      wxString cmd;\n      // wxString type; ft->GetMimeType(&type);\n      wxFileType::MessageParameters params(filename); // , type);\n      bool ok = ft->GetOpenCommand(&cmd, params);\n      // printf(\"StartApplication(%ls) ok=%d\\n\",(const wchar_t *)filename,(int)ok);\n      delete ft;\n      if ( ok )\n      {\n        printf(\"StartApplication(%ls) cmd='%ls'\\n\",(const wchar_t *)filename,(const wchar_t *)cmd);\n        long pid = wxExecute(cmd, wxEXEC_ASYNC);\n        if (pid) return ;\n      }\n    }\t   \n  }\n  ::MessageBoxW(window, \n          // NError::MyFormatMessageW(::GetLastError()),\n          L\"There is no application associated with the given file name extension\",\n          L\"7-Zip\", MB_OK | MB_ICONSTOP);\n}\n\nvoid CPanel::EditItem(int index)\n{\n  if (!_parentFolders.IsEmpty())\n  {\n    OpenItemInArchive(index, false, true, true);\n    return;\n  }\n#ifdef _WIN32\n  HANDLE hProcess = StartEditApplication(_currentFolderPrefix + GetItemRelPath(index), (HWND)*this);\n  if (hProcess != 0)\n    ::CloseHandle(hProcess);\n#endif\n}\n\nvoid CPanel::OpenFolderExternal(int index)\n{\n#ifdef _WIN32\n  HANDLE hProcess = StartApplication(GetFsPath() + GetItemRelPath(index), (HWND)*this);\n  if (hProcess != 0)\n    ::CloseHandle(hProcess);\n#else\n  printf(\" CPanel::OpenFolderExternal : FIXME\\n\");\n#endif\n}\n\nvoid CPanel::OpenItem(int index, bool tryInternal, bool tryExternal)\n{\n  CDisableTimerProcessing disableTimerProcessing1(*this);\n  if (!_parentFolders.IsEmpty())\n  {\n    OpenItemInArchive(index, tryInternal, tryExternal, false);\n    return;\n  }\n  UString name = GetItemRelPath(index);\n  if (IsNameVirus(name))\n  {\n    MessageBoxErrorLang(IDS_VIRUS, 0x03020284);\n    return;\n  }\n  UString fullPath = _currentFolderPrefix + name;\n  if (tryInternal)\n    if (!tryExternal || !DoItemAlwaysStart(name))\n    {\n      HRESULT res = OpenItemAsArchive(index);\n      if (res == S_OK || res == E_ABORT)\n        return;\n      if (res != S_FALSE)\n      {\n        MessageBoxError(res);\n        return;\n      }\n    }\n  if (tryExternal)\n  {\n    // SetCurrentDirectory opens HANDLE to folder!!!\n    // NDirectory::MySetCurrentDirectory(_currentFolderPrefix);\n#ifdef _WIN32\n    HANDLE hProcess = StartApplication(fullPath, (HWND)*this);\n    if (hProcess != 0)\n      ::CloseHandle(hProcess);\n#else\n    StartApplication(fullPath, (HWND)*this);\n#endif\n  }\n}\n      \nHRESULT CPanel::OnOpenItemChanged(const UString &folderPath, const UString &itemName,\n    bool usePassword, const UString &password)\n{\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return E_FAIL;\n  }\n  UStringVector fileNames;\n  CRecordVector<const wchar_t *> fileNamePointers;\n  fileNames.Add(itemName);\n  fileNamePointers.Add(fileNames[0]);\n\n  UString pathPrefix = folderPath;\n  NName::NormalizeDirPathPrefix(pathPrefix);\n\n  CUpdateCallback100Imp *callbackSpec = new CUpdateCallback100Imp;\n  CMyComPtr<IProgress> callback = callbackSpec;\n  callbackSpec->Init((HWND)*this, usePassword, password);\n\n  return folderOperations->CopyFrom(pathPrefix, &fileNamePointers.Front(), fileNamePointers.Size(), callback);\n}\n\nLRESULT CPanel::OnOpenItemChanged(LPARAM lParam)\n{\n  CTmpProcessInfo &tmpProcessInfo = *(CTmpProcessInfo *)lParam;\n  // LoadCurrentPath()\n  if (tmpProcessInfo.FullPathFolderPrefix != _currentFolderPrefix)\n    return 0;\n\n  CSelectedState state;\n  SaveSelectedState(state);\n\n  HRESULT result = OnOpenItemChanged(tmpProcessInfo.FolderPath, tmpProcessInfo.ItemName,\n      tmpProcessInfo.UsePassword, tmpProcessInfo.Password);\n  if (result != S_OK)\n    return 0;\n  RefreshListCtrl(state);\n  return 1;\n}\n\n/*\nclass CTmpProcessInfoList\n{\npublic:\n  CObjectVector<CTmpProcessInfo> _items;\n} g_TmpProcessInfoList;\n*/\n\nclass CExitEventLauncher\n{\npublic:\n  NWindows::NSynchronization::CManualResetEvent _exitEvent;\n  CExitEventLauncher()\n  {\n    if (_exitEvent.Create(false) != S_OK)\n      throw 9387173;\n  };\n  ~CExitEventLauncher() {  _exitEvent.Set(); }\n} g_ExitEventLauncher;\n\n#ifdef _WIN32\nstatic THREAD_FUNC_DECL MyThreadFunction(void *param)\n{\n  CMyAutoPtr<CTmpProcessInfo> tmpProcessInfoPtr((CTmpProcessInfo *)param);\n  CTmpProcessInfo *tmpProcessInfo = tmpProcessInfoPtr.get();\n\n  HANDLE hProcess = tmpProcessInfo->ProcessHandle;\n  HANDLE events[2] = { g_ExitEventLauncher._exitEvent, hProcess};\n  DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE);\n  ::CloseHandle(hProcess);\n  if (waitResult == WAIT_OBJECT_0 + 0)\n    return 0;\n  if (waitResult != WAIT_OBJECT_0 + 1)\n    return 1;\n  Sleep(200);\n  NFind::CFileInfoW newFileInfo;\n  if (NFind::FindFile(tmpProcessInfo->FilePath, newFileInfo))\n  {\n    if (newFileInfo.Size != tmpProcessInfo->FileInfo.Size ||\n        CompareFileTime(&newFileInfo.MTime, &tmpProcessInfo->FileInfo.MTime) != 0)\n    {\n      UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE,\n          0x03020280, tmpProcessInfo->ItemName);\n      if (::MessageBoxW(g_HWND, message, L\"7-Zip\", MB_OKCANCEL | MB_ICONQUESTION) == IDOK)\n      {\n        if (SendMessage(tmpProcessInfo->Window, kOpenItemChanged, 0, (LONG_PTR)tmpProcessInfo) != 1)\n        {\n          ::MessageBoxW(g_HWND, MyFormatNew(IDS_CANNOT_UPDATE_FILE,\n              0x03020281, tmpProcessInfo->FilePath), L\"7-Zip\", MB_OK | MB_ICONSTOP);\n          return 0;\n        }\n      }\n    }\n  }\n  tmpProcessInfo->DeleteDirAndFile();\n  return 0;\n}\n#endif\n\nvoid CPanel::OpenItemInArchive(int index, bool tryInternal, bool tryExternal, bool editMode)\n{\n  const UString name = GetItemName(index);\n  if (IsNameVirus(name))\n  {\n    MessageBoxErrorLang(IDS_VIRUS, 0x03020284);\n    return;\n  }\n\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n\n#ifdef _WIN32\n  NFile::NDirectory::CTempDirectoryW tempDirectory;\n  tempDirectory.Create(kTempDirPrefix);\n  UString tempDir = tempDirectory.GetPath();\n  UString tempDirNorm = tempDir;\n  NFile::NName::NormalizeDirPathPrefix(tempDirNorm);\n\n  CRecordVector<UInt32> indices;\n  indices.Add(index);\n\n  UStringVector messages;\n\n  bool usePassword = false;\n  UString password;\n  if (_parentFolders.Size() > 0)\n  {\n    const CFolderLink &fl = _parentFolders.Back();\n    usePassword = fl.UsePassword;\n    password = fl.Password;\n  }\n\n  HRESULT result = CopyTo(indices, tempDirNorm, false, true, &messages, usePassword, password);\n\n  if (_parentFolders.Size() > 0)\n  {\n    CFolderLink &fl = _parentFolders.Back();\n    fl.UsePassword = usePassword;\n    fl.Password = password;\n  }\n\n  if (!messages.IsEmpty())\n    return;\n  if (result != S_OK)\n  {\n    if (result != E_ABORT)\n      MessageBoxError(result);\n    return;\n  }\n\n  UString tempFilePath = tempDirNorm + name;\n\n  CMyAutoPtr<CTmpProcessInfo> tmpProcessInfoPtr(new CTmpProcessInfo());\n  CTmpProcessInfo *tmpProcessInfo = tmpProcessInfoPtr.get();\n  tmpProcessInfo->FolderPath = tempDir;\n  tmpProcessInfo->FilePath = tempFilePath;\n  tmpProcessInfo->UsePassword = usePassword;\n  tmpProcessInfo->Password = password;\n\n  if (!NFind::FindFile(tempFilePath, tmpProcessInfo->FileInfo))\n    return;\n\n  if (tryInternal)\n  {\n    if (!tryExternal || !DoItemAlwaysStart(name))\n    {\n      bool encrypted;\n      if (OpenItemAsArchive(name, tempDir, tempFilePath,\n         _currentFolderPrefix + name, encrypted) == S_OK)\n      {\n        RefreshListCtrl();\n        return;\n      }\n    }\n  }\n\n  CTmpProcessInfoRelease tmpProcessInfoRelease(*tmpProcessInfo);\n\n  if (!tryExternal)\n    return;\n\n  HANDLE hProcess;\n  if (editMode)\n    hProcess = StartEditApplication(tempFilePath, (HWND)*this);\n  else\n    hProcess = StartApplication(tempFilePath, (HWND)*this);\n\n  if (hProcess == 0)\n    return;\n\n  tmpProcessInfo->Window = (HWND)(*this);\n  tmpProcessInfo->FullPathFolderPrefix = _currentFolderPrefix;\n  tmpProcessInfo->ItemName = name;\n  tmpProcessInfo->ProcessHandle = hProcess;\n\n  NWindows::CThread thread;\n  if (thread.Create(MyThreadFunction, tmpProcessInfo) != S_OK)\n    throw 271824;\n  tempDirectory.DisableDeleting();\n  tmpProcessInfoPtr.release();\n  tmpProcessInfoRelease._needDelete = false;\n#else\n  printf(\" CPanel::OpenItemInArchive : FIXME\\n\");\n#endif\n}\n\n/*\nstatic const UINT64 kTimeLimit = UINT64(10000000) * 3600 * 24;\n\nstatic bool CheckDeleteItem(UINT64 currentFileTime, UINT64 folderFileTime)\n{\n  return (currentFileTime - folderFileTime > kTimeLimit &&\n      folderFileTime - currentFileTime > kTimeLimit);\n}\n\nvoid DeleteOldTempFiles()\n{\n  UString tempPath;\n  if(!NFile::NDirectory::MyGetTempPath(tempPath))\n    throw 1;\n\n  UINT64 currentFileTime;\n  NTime::GetCurUtcFileTime(currentFileTime);\n  UString searchWildCard = tempPath + kTempDirPrefix + L\"*.tmp\";\n  searchWildCard += WCHAR(NName::kAnyStringWildcard);\n  NFind::CEnumeratorW enumerator(searchWildCard);\n  NFind::CFileInfoW fileInfo;\n  while(enumerator.Next(fileInfo))\n  {\n    if (!fileInfo.IsDir())\n      continue;\n    const UINT64 &cTime = *(const UINT64 *)(&fileInfo.CTime);\n    if(CheckDeleteItem(cTime, currentFileTime))\n      RemoveDirectoryWithSubItems(tempPath + fileInfo.Name);\n  }\n}\n*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelItems.cpp",
    "content": "// PanelItems.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n// FIXME #include \"Windows/Menu.h\"\n\n#include \"../../PropID.h\"\n\n#include \"resource.h\"\n\n#include \"LangUtils.h\"\n#include \"Panel.h\"\n#include \"PropertyName.h\"\n#include \"RootFolder.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/Sort.h\"\n}\n\nusing namespace NWindows;\n\nstatic int GetColumnAlign(PROPID propID, VARTYPE varType)\n{\n  switch(propID)\n  {\n    case kpidCTime:\n    case kpidATime:\n    case kpidMTime:\n      return LVCFMT_LEFT;\n  }\n  switch(varType)\n  {\n    case VT_UI1:\n    case VT_I2:\n    case VT_UI2:\n    case VT_I4:\n    case VT_INT:\n    case VT_UI4:\n    case VT_UINT:\n    case VT_I8:\n    case VT_UI8:\n    case VT_BOOL:\n      return LVCFMT_RIGHT;\n    \n    case VT_EMPTY:\n    case VT_I1:\n    case VT_FILETIME:\n    case VT_BSTR:\n      return LVCFMT_LEFT;\n    \n    default:\n      return LVCFMT_CENTER;\n  }\n}\n\nvoid CPanel::InitColumns()\n{\n\tprintf(\"CPanel::InitColumns\\n\");\n  if (_needSaveInfo)\n    SaveListViewInfo();\n\n  _listView.DeleteAllItems();\n  _selectedStatusVector.Clear();\n\n  ReadListViewInfo();\n\n\n  PROPID sortID;\n  /*\n  if (_listViewInfo.SortIndex >= 0)\n    sortID = _listViewInfo.Columns[_listViewInfo.SortIndex].PropID;\n  */\n  sortID  = _listViewInfo.SortID;\n\n  _ascending = _listViewInfo.Ascending;\n\n  _properties.Clear();\n\n  _needSaveInfo = true;\n\n  UInt32 numProperties;\n  _folder->GetNumberOfProperties(&numProperties);\n  int i;\n  for (i = 0; i < (int)numProperties; i++)\n  {\n    CMyComBSTR name;\n    PROPID propID;\n    VARTYPE varType;\n\n    if (_folder->GetPropertyInfo(i, &name, &propID, &varType) != S_OK)\n      throw 1;\n\n    if (propID == kpidIsDir)\n      continue;\n\n    CItemProperty prop;\n    prop.Type = varType;\n    prop.ID = propID;\n    prop.Name = GetNameOfProperty(propID, name);\n    prop.Order = -1;\n    prop.IsVisible = true;\n    prop.Width = 100;\n    _properties.Add(prop);\n  }\n  // InitColumns2(sortID);\n\n  for (;;)\n    if (!_listView.DeleteColumn(0))\n      break;\n\n  int order = 0;\n  for(i = 0; i < _listViewInfo.Columns.Size(); i++)\n  {\n    const CColumnInfo &columnInfo = _listViewInfo.Columns[i];\n    int index = _properties.FindItemWithID(columnInfo.PropID);\n    if (index >= 0)\n    {\n      CItemProperty &item = _properties[index];\n      item.IsVisible = columnInfo.IsVisible;\n      item.Width = columnInfo.Width;\n      if (columnInfo.IsVisible)\n        item.Order = order++;\n      continue;\n    }\n  }\n  for(i = 0; i < _properties.Size(); i++)\n  {\n    CItemProperty &item = _properties[i];\n    if (item.Order < 0)\n      item.Order = order++;\n  }\n\n  _visibleProperties.Clear();\n  for (i = 0; i < _properties.Size(); i++)\n  {\n    const CItemProperty &property = _properties[i];\n    if (property.IsVisible)\n      _visibleProperties.Add(property);\n  }\n\n  // _sortIndex = 0;\n  _sortID = kpidName;\n  /*\n  if (_listViewInfo.SortIndex >= 0)\n  {\n    int sortIndex = _properties.FindItemWithID(sortID);\n    if (sortIndex >= 0)\n      _sortIndex = sortIndex;\n  }\n  */\n  _sortID = _listViewInfo.SortID;\n\n  for (i = 0; i < _visibleProperties.Size(); i++)\n  {\n    InsertColumn(i);\n  }\n}\n\nvoid CPanel::InsertColumn(int index)\n{\n\t//printf(\"CPanel::InsertColumn\\n\");\n  const CItemProperty &property = _visibleProperties[index];\n  LV_COLUMNW column;\n  column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_ORDER;\n  column.cx = property.Width;\n  column.fmt = GetColumnAlign(property.ID, property.Type);\n  column.iOrder = property.Order;\n  column.iSubItem = index;\n  column.pszText = (wchar_t *)(const wchar_t *)property.Name;\n  _listView.InsertColumn(index, &column);\n}\n\nvoid CPanel::RefreshListCtrl()\n{\n  RefreshListCtrl(UString(), -1, true, UStringVector());\n}\n\nint CALLBACK CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData);\n\n\nvoid CPanel::GetSelectedNames(UStringVector &selectedNames)\n{\n  selectedNames.Clear();\n\n  CRecordVector<UInt32> indices;\n  GetSelectedItemsIndices(indices);\n  selectedNames.Reserve(indices.Size());\n  for (int  i = 0; i < indices.Size(); i++)\n    selectedNames.Add(GetItemRelPath(indices[i]));\n\n  /*\n  for (int i = 0; i < _listView.GetItemCount(); i++)\n  {\n    const int kSize = 1024;\n    WCHAR name[kSize + 1];\n    LVITEMW item;\n    item.iItem = i;\n    item.pszText = name;\n    item.cchTextMax  = kSize;\n    item.iSubItem = 0;\n    item.mask = LVIF_TEXT | LVIF_PARAM;\n    if (!_listView.GetItem(&item))\n      continue;\n    int realIndex = GetRealIndex(item);\n    if (realIndex == kParentIndex)\n      continue;\n    if (_selectedStatusVector[realIndex])\n      selectedNames.Add(item.pszText);\n  }\n  */\n  selectedNames.Sort();\n}\n\nvoid CPanel::SaveSelectedState(CSelectedState &s)\n{\n  s.FocusedName.Empty();\n  s.SelectedNames.Clear();\n  s.FocusedItem = _listView.GetFocusedItem();\n  {\n    if (s.FocusedItem >= 0)\n    {\n      int realIndex = GetRealItemIndex(s.FocusedItem);\n      if (realIndex != kParentIndex)\n        s.FocusedName = GetItemRelPath(realIndex);\n        /*\n        const int kSize = 1024;\n        WCHAR name[kSize + 1];\n        LVITEMW item;\n        item.iItem = focusedItem;\n        item.pszText = name;\n        item.cchTextMax  = kSize;\n        item.iSubItem = 0;\n        item.mask = LVIF_TEXT;\n        if (_listView.GetItem(&item))\n        focusedName = item.pszText;\n      */\n    }\n  }\n  GetSelectedNames(s.SelectedNames);\n}\n\nvoid CPanel::RefreshListCtrl(const CSelectedState &s)\n{\n  bool selectFocused = s.SelectFocused;\n  if (_mySelectMode)\n    selectFocused = true;\n  RefreshListCtrl(s.FocusedName, s.FocusedItem, selectFocused, s.SelectedNames);\n}\n\nvoid CPanel::RefreshListCtrlSaveFocused()\n{\n  CSelectedState state;\n  SaveSelectedState(state);\n  RefreshListCtrl(state);\n}\n\nvoid CPanel::SetFocusedSelectedItem(int index, bool select)\n{\n  UINT state = LVIS_FOCUSED;\n  if (select)\n    state |= LVIS_SELECTED;\n  _listView.SetItemState(index, state, state);\n  if (!_mySelectMode && select)\n  {\n    int realIndex = GetRealItemIndex(index);\n    if (realIndex != kParentIndex)\n      _selectedStatusVector[realIndex] = true;\n  }\n}\n\nvoid CPanel::RefreshListCtrl(const UString &focusedName, int focusedPos, bool selectFocused,\n    const UStringVector &selectedNames)\n{\nprintf(\"CPanel::RefreshListCtrl\\n\");\n  _dontShowMode = false;\n  LoadFullPathAndShow();\n  // OutputDebugStringA(\"=======\\n\");\n  // OutputDebugStringA(\"s1 \\n\");\n  CDisableTimerProcessing timerProcessing(*this);\n\n  if (focusedPos < 0)\n    focusedPos = 0;\n\n  _listView.SetRedraw(false);\n  // m_RedrawEnabled = false;\n\n#ifdef _WIN32\n  LVITEMW item;\n  ZeroMemory(&item, sizeof(item));\n#else\n  LVITEMW item = { 0 };\n#endif\n  \n  _listView.DeleteAllItems();\n  _selectedStatusVector.Clear();\n  // _realIndices.Clear();\n  _startGroupSelect = 0;\n\n  _selectionIsDefined = false;\n  \n  // m_Files.Clear();\n  // _folder.Release();\n\n  if (!_folder)\n  {\n    // throw 1;\n    SetToRootFolder();\n  }\n  \n  // FIXME _headerToolBar.EnableButton(kParentFolderID, !IsRootFolder());\n\n  CMyComPtr<IFolderSetFlatMode> folderSetFlatMode;\n  _folder.QueryInterface(IID_IFolderSetFlatMode, &folderSetFlatMode);\n  if (folderSetFlatMode)\n    folderSetFlatMode->SetFlatMode(BoolToInt(_flatMode));\n\n  if (_folder->LoadItems() != S_OK)\n    return;\n\n  InitColumns();\n\n\n  // OutputDebugString(TEXT(\"Start Dir\\n\"));\n  UInt32 numItems;\n  _folder->GetNumberOfItems(&numItems);\n\n  bool showDots = _showDots && !IsRootFolder();\n\n  _listView.SetItemCount(numItems + (showDots ? 1 : 0));\n\n  _selectedStatusVector.Reserve(numItems);\n  int cursorIndex = -1;\n\n  CMyComPtr<IFolderGetSystemIconIndex> folderGetSystemIconIndex;\n  if (!IsFSFolder() || _showRealFileIcons)\n    _folder.QueryInterface(IID_IFolderGetSystemIconIndex, &folderGetSystemIconIndex);\n\n  if (showDots)\n  {\n    UString itemName = L\"..\";\n    item.iItem = _listView.GetItemCount();\n    if (itemName.CompareNoCase(focusedName) == 0)\n      cursorIndex = item.iItem;\n    item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;\n    int subItem = 0;\n    item.iSubItem = subItem++;\n    item.lParam = kParentIndex;\n    item.pszText = (wchar_t *)(const wchar_t *)itemName;\n    UInt32 attributes = FILE_ATTRIBUTE_DIRECTORY;\n    /* FIXME\n    item.iImage = _extToIconMap.GetIconIndex(attributes, itemName);\n    if (item.iImage < 0)\n      item.iImage = 0;\n      */\n      item.iImage = -1; // FIXME\n    if(_listView.InsertItem(&item) == -1)\n      return;\n  }\n  \n  // OutputDebugStringA(\"S1\\n\");\n\n  for(UInt32 i = 0; i < numItems; i++)\n  {\n    UString itemName = GetItemName(i);\n    const UString relPath = GetItemRelPath(i);\n    if (relPath.CompareNoCase(focusedName) == 0)\n      cursorIndex = _listView.GetItemCount();\n    bool selected = false;\n    if (selectedNames.FindInSorted(relPath) >= 0)\n      selected = true;\n    _selectedStatusVector.Add(selected);\n\n    item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;\n\n    if (!_mySelectMode)\n      if (selected)\n      {\n        item.mask |= LVIF_STATE;\n        item.state = LVIS_SELECTED;\n      }\n  \n    int subItem = 0;\n    item.iItem = _listView.GetItemCount();\n    \n    item.iSubItem = subItem++;\n    item.lParam = i;\n    \n    UString correctedName;\n    if (itemName.Find(L\"     \") >= 0)\n    {\n      int pos = 0;\n      for (;;)\n      {\n        int posNew = itemName.Find(L\"     \", pos);\n        if (posNew < 0)\n        {\n          correctedName += itemName.Mid(pos);\n          break;\n        }\n        correctedName += itemName.Mid(pos, posNew - pos);\n        correctedName += L\" ... \";\n        pos = posNew;\n        while (itemName[++pos] == ' ');\n      }\n      item.pszText = (wchar_t *)(const wchar_t *)correctedName;\n    }\n    else\n      item.pszText = (wchar_t *)(const wchar_t *)itemName;\n\n    NCOM::CPropVariant propVariant;\n    _folder->GetProperty(i, kpidAttrib, &propVariant);\n    UInt32 attributes = 0;\n    if (propVariant.vt == VT_UI4)\n      attributes = propVariant.ulVal;\n    else\n    {\n      if (IsItemFolder(i))\n        attributes |= FILE_ATTRIBUTE_DIRECTORY;\n    }\n\n    bool defined  = false;\n\n    if (folderGetSystemIconIndex)\n    {\n      folderGetSystemIconIndex->GetSystemIconIndex(i, &item.iImage);\n      defined = (item.iImage > 0);\n    }\n    if (!defined)\n    {\n      if (_currentFolderPrefix.IsEmpty())\n      {\n        int iconIndexTemp = -1;\n        GetRealIconIndex(itemName + WSTRING_PATH_SEPARATOR, attributes, iconIndexTemp);\n        item.iImage = iconIndexTemp;\n      }\n      else\n      {\n        item.iImage = -1; // FIXME _extToIconMap.GetIconIndex(attributes, itemName);\n      }\n    }\n    if (item.iImage < 0)\n      item.iImage = 0;\n\n    if(_listView.InsertItem(&item) == -1)\n      return; // error\n\n    // FIXME Added\n    item.pszText = (LPWSTR)malloc(4096); // FIXME\n    for(int col=1;col <  _listView.GetColumnCount(); col++)\n    {\n      item.iSubItem = col;\n      item.cchTextMax = 4096 / sizeof(item.pszText[0]);\n      this->SetItemText(item);\n      _listView.SetItem(&item);\n    }\n    free(item.pszText); item.pszText = 0;\n\n  }\n  // OutputDebugStringA(\"End2\\n\");\n\n  if(_listView.GetItemCount() > 0 && cursorIndex >= 0)\n    SetFocusedSelectedItem(cursorIndex, selectFocused);\n  _listView.SortItems(CompareItems, (LPARAM)this);\n  if (cursorIndex < 0 && _listView.GetItemCount() > 0)\n  {\n    if (focusedPos >= _listView.GetItemCount())\n      focusedPos = _listView.GetItemCount() - 1;\n    SetFocusedSelectedItem(focusedPos, showDots);\n  }\n  // m_RedrawEnabled = true;\n  _listView.EnsureVisible(_listView.GetFocusedItem(), false);\n  _listView.SetRedraw(true);\n  _listView.InvalidateRect(NULL, true);\n  // OutputDebugStringA(\"End1\\n\");\n  /*\n  _listView.UpdateWindow();\n  */\n}\n\nvoid CPanel::GetSelectedItemsIndices(CRecordVector<UInt32> &indices) const\n{\n  indices.Clear();\n#if 0 // FIXME - not needed anymore ? (UNIX_ENV)\n  int itemIndex = -1;\n  while ((itemIndex = _listView.GetNextItem(itemIndex, LVNI_SELECTED)) != -1)\n  {\n    LPARAM param;\n    if (_listView.GetItemParam(itemIndex, param))\n      indices.Add(param);\n  }\n#else\n  for (int i = 0; i < _selectedStatusVector.Size(); i++)\n    if (_selectedStatusVector[i])\n      indices.Add(i);\n#endif\n  HeapSort(&indices.Front(), indices.Size());\n}\n\nvoid CPanel::GetOperatedItemIndices(CRecordVector<UInt32> &indices) const\n{\n  GetSelectedItemsIndices(indices);\n  if (!indices.IsEmpty())\n    return;\n  if (_listView.GetSelectedCount() == 0)\n    return;\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem >= 0)\n  {\n    if(_listView.GetItemState(focusedItem, LVIS_SELECTED) == LVIS_SELECTED)\n    {\n      int realIndex = GetRealItemIndex(focusedItem);\n      if (realIndex != kParentIndex)\n      indices.Add(realIndex);\n    }\n  }\n}\n\nvoid CPanel::GetAllItemIndices(CRecordVector<UInt32> &indices) const\n{\n  indices.Clear();\n  UInt32 numItems;\n  if (_folder->GetNumberOfItems(&numItems) == S_OK)\n    for (UInt32 i = 0; i < numItems; i++)\n      indices.Add(i);\n}\n\nvoid CPanel::GetOperatedIndicesSmart(CRecordVector<UInt32> &indices) const\n{\n  GetOperatedItemIndices(indices);\n  if (indices.IsEmpty() || (indices.Size() == 1 && indices[0] == (UInt32)(Int32)-1))\n    GetAllItemIndices(indices);\n}\n\n/*\nvoid CPanel::GetOperatedListViewIndices(CRecordVector<UInt32> &indices) const\n{\n  indices.Clear();\n  int numItems = _listView.GetItemCount();\n  for (int i = 0; i < numItems; i++)\n  {\n    int realIndex = GetRealItemIndex(i);\n    if (realIndex >= 0)\n      if (_selectedStatusVector[realIndex])\n        indices.Add(i);\n  }\n  if (indices.IsEmpty())\n  {\n    int focusedItem = _listView.GetFocusedItem();\n      if (focusedItem >= 0)\n        indices.Add(focusedItem);\n  }\n}\n*/\n\nvoid CPanel::EditItem()\n{\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int realIndex = GetRealItemIndex(focusedItem);\n  if (realIndex == kParentIndex)\n    return;\n  if (!IsItemFolder(realIndex))\n    EditItem(realIndex);\n}\n\nvoid CPanel::OpenFocusedItemAsInternal()\n{\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int realIndex = GetRealItemIndex(focusedItem);\n  if (IsItemFolder(realIndex))\n    OpenFolder(realIndex);\n  else\n    OpenItem(realIndex, true, false);\n}\n\nvoid CPanel::OpenSelectedItems(bool tryInternal)\n{\n  CRecordVector<UInt32> indices;\n  GetOperatedItemIndices(indices);\n  if (indices.Size() > 20)\n  {\n    MessageBoxErrorLang(IDS_TOO_MANY_ITEMS, 0x02000606);\n    return;\n  }\n  \n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem >= 0)\n  {\n    int realIndex = GetRealItemIndex(focusedItem);\n    if (realIndex == kParentIndex && (tryInternal || indices.Size() == 0))\n      indices.Insert(0, realIndex);\n  }\n\n  bool dirIsStarted = false;\n  for(int i = 0; i < indices.Size(); i++)\n  {\n    UInt32 index = indices[i];\n    // CFileInfo &aFile = m_Files[index];\n    if (IsItemFolder(index))\n    {\n      if (!dirIsStarted)\n      {\n        if (tryInternal)\n        {\n          OpenFolder(index);\n          dirIsStarted = true;\n          break;\n        }\n        else\n          OpenFolderExternal(index);\n      }\n    }\n    else\n      OpenItem(index, (tryInternal && indices.Size() == 1), true);\n  }\n}\n\nUString CPanel::GetItemName(int itemIndex) const\n{\n  if (itemIndex == kParentIndex)\n    return L\"..\";\n  NCOM::CPropVariant propVariant;\n  if (_folder->GetProperty(itemIndex, kpidName, &propVariant) != S_OK)\n    throw 2723400;\n  if (propVariant.vt != VT_BSTR)\n    throw 2723401;\n  return (propVariant.bstrVal);\n}\n\nUString CPanel::GetItemPrefix(int itemIndex) const\n{\n  if (itemIndex == kParentIndex)\n    return UString();\n  NCOM::CPropVariant propVariant;\n  if (_folder->GetProperty(itemIndex, kpidPrefix, &propVariant) != S_OK)\n    throw 2723400;\n  UString prefix;\n  if (propVariant.vt == VT_BSTR)\n    prefix = propVariant.bstrVal;\n  return prefix;\n}\n\nUString CPanel::GetItemRelPath(int itemIndex) const\n{\n  return GetItemPrefix(itemIndex) + GetItemName(itemIndex);\n}\n\n\nbool CPanel::IsItemFolder(int itemIndex) const\n{\n  if (itemIndex == kParentIndex)\n    return true;\n  NCOM::CPropVariant propVariant;\n  if (_folder->GetProperty(itemIndex, kpidIsDir, &propVariant) != S_OK)\n    throw 2723400;\n  if (propVariant.vt == VT_BOOL)\n    return VARIANT_BOOLToBool(propVariant.boolVal);\n  if (propVariant.vt == VT_EMPTY)\n    return false;\n  return false;\n}\n\nUINT64 CPanel::GetItemSize(int itemIndex) const\n{\n  if (itemIndex == kParentIndex)\n    return 0;\n  NCOM::CPropVariant propVariant;\n  if (_folder->GetProperty(itemIndex, kpidSize, &propVariant) != S_OK)\n    throw 2723400;\n  if (propVariant.vt == VT_EMPTY)\n    return 0;\n  return ConvertPropVariantToUInt64(propVariant);\n}\n\nvoid CPanel::ReadListViewInfo()\n{\n  _typeIDString = GetFolderTypeID();\n  if (!_typeIDString.IsEmpty())\n    ::ReadListViewInfo(_typeIDString, _listViewInfo);\n}\n\nvoid CPanel::SaveListViewInfo()\n{\n  int i;\n  for(i = 0; i < _visibleProperties.Size(); i++)\n  {\n    CItemProperty &property = _visibleProperties[i];\n    LVCOLUMN winColumnInfo;\n    winColumnInfo.mask = LVCF_ORDER | LVCF_WIDTH;\n    if (!_listView.GetColumn(i, &winColumnInfo))\n      throw 1;\n    property.Order = winColumnInfo.iOrder;\n    property.Width = winColumnInfo.cx;\n  }\n\n  CListViewInfo viewInfo;\n  \n  // PROPID sortPropID = _properties[_sortIndex].ID;\n  PROPID sortPropID = _sortID;\n  \n  _visibleProperties.Sort();\n  for(i = 0; i < _visibleProperties.Size(); i++)\n  {\n    const CItemProperty &property = _visibleProperties[i];\n    CColumnInfo columnInfo;\n    columnInfo.IsVisible = property.IsVisible;\n    columnInfo.PropID = property.ID;\n    columnInfo.Width = property.Width;\n    viewInfo.Columns.Add(columnInfo);\n  }\n  for(i = 0; i < _properties.Size(); i++)\n  {\n    const CItemProperty &property = _properties[i];\n    if (!property.IsVisible)\n    {\n      CColumnInfo columnInfo;\n      columnInfo.IsVisible = property.IsVisible;\n      columnInfo.PropID = property.ID;\n      columnInfo.Width = property.Width;\n      viewInfo.Columns.Add(columnInfo);\n    }\n  }\n  \n  // viewInfo.SortIndex = viewInfo.FindColumnWithID(sortPropID);\n  viewInfo.SortID = sortPropID;\n\n  viewInfo.Ascending = _ascending;\n  if (!_listViewInfo.IsEqual(viewInfo))\n  {\n    ::SaveListViewInfo(_typeIDString, viewInfo);\n    _listViewInfo = viewInfo;\n  }\n}\n\n#ifdef _WIN32\nbool CPanel::OnRightClick(LPNMITEMACTIVATE itemActiveate, LRESULT &result)\n{\n  if(itemActiveate->hdr.hwndFrom == HWND(_listView))\n    return false;\n\n  POINT point;\n  ::GetCursorPos(&point);\n\n  CMenu menu;\n  CMenuDestroyer menuDestroyer(menu);\n\n  menu.CreatePopup();\n\n  const int kCommandStart = 100;\n  for(int i = 0; i < _properties.Size(); i++)\n  {\n    const CItemProperty &property = _properties[i];\n    UINT flags =  MF_STRING;\n    if (property.IsVisible)\n      flags |= MF_CHECKED;\n    if (i == 0)\n      flags |= MF_GRAYED;\n    menu.AppendItem(flags, kCommandStart + i, GetSystemString(property.Name));\n  }\n  int menuResult = menu.Track(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_NONOTIFY,\n      point.x, point.y, _listView);\n  if (menuResult >= kCommandStart && menuResult <= kCommandStart + _properties.Size())\n  {\n    int index = menuResult - kCommandStart;\n    CItemProperty &property = _properties[index];\n    property.IsVisible = !property.IsVisible;\n\n    if (property.IsVisible)\n    {\n      int prevVisibleSize = _visibleProperties.Size();\n      property.Order = prevVisibleSize;\n      _visibleProperties.Add(property);\n      InsertColumn(prevVisibleSize);\n    }\n    else\n    {\n      int visibleIndex = _visibleProperties.FindItemWithID(property.ID);\n      _visibleProperties.Delete(visibleIndex);\n      /*\n      if (_sortIndex == index)\n      {\n        _sortIndex = 0;\n        _ascending = true;\n      }\n      */\n      if (_sortID == property.ID)\n      {\n        _sortID = kpidName;\n        _ascending = true;\n      }\n\n      _listView.DeleteColumn(visibleIndex);\n    }\n  }\n  result = TRUE;\n  return true;\n}\n#endif // _WIN32\n\nvoid CPanel::OnReload()\n{\n  RefreshListCtrlSaveFocused();\n  OnRefreshStatusBar();\n}\n\nvoid CPanel::OnTimer()\n{\n  if (!_processTimer)\n    return;\n  CMyComPtr<IFolderWasChanged> folderWasChanged;\n  if (_folder.QueryInterface(IID_IFolderWasChanged, &folderWasChanged) != S_OK)\n    return;\n  INT32 wasChanged;\n  if (folderWasChanged->WasChanged(&wasChanged) != S_OK)\n    return;\n  if (wasChanged == 0)\n    return;\n  OnReload();\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelListNotify.cpp",
    "content": "// PanelListNotify.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/PropVariant.h\"\n#include \"Windows/PropVariantConversions.h\"\n\n#include \"../Common/PropIDUtils.h\"\n#include \"../../PropID.h\"\n\n#include \"Panel.h\"\n#include \"FormatUtils.h\"\n\nusing namespace NWindows;\n\nstatic UString ConvertSizeToStringShort(UInt64 value)\n{\n  wchar_t s[32];\n  wchar_t c, c2 = L'B';\n  if (value < (UInt64)10000)\n  {\n    c = L'B';\n    c2 = L'\\0';\n  }\n  else if (value < ((UInt64)10000 << 10))\n  {\n    value >>= 10;\n    c = L'K';\n  }\n  else if (value < ((UInt64)10000 << 20))\n  {\n    value >>= 20;\n    c = L'M';\n  }\n  else\n  {\n    value >>= 30;\n    c = L'G';\n  }\n  ConvertUInt64ToString(value, s);\n  int p = MyStringLen(s);\n  s[p++] = L' ';\n  s[p++] = c;\n  s[p++] = c2;\n  s[p++] = L'\\0';\n  return s;\n}\n\nUString ConvertSizeToString(UInt64 value)\n{\n  wchar_t s[32];\n  ConvertUInt64ToString(value, s);\n  int i = MyStringLen(s);\n  int pos = sizeof(s) / sizeof(s[0]);\n  s[--pos] = L'\\0';\n  while (i > 3)\n  {\n    s[--pos] = s[--i];\n    s[--pos] = s[--i];\n    s[--pos] = s[--i];\n    s[--pos] = L' ';\n  }\n  while (i > 0)\n    s[--pos] = s[--i];\n  return s + pos;\n}\n\nLRESULT CPanel::SetItemText(LVITEMW &item)\n{\n  if (_dontShowMode)\n    return 0;\n\n  UINT32 realIndex = GetRealIndex(item);\n  // printf(\" CPanel::SetItemText : realIndex=%d\\n\",realIndex);\n\n  /*\n  if ((item.mask & LVIF_IMAGE) != 0)\n  {\n    bool defined  = false;\n    CComPtr<IFolderGetSystemIconIndex> folderGetSystemIconIndex;\n    _folder.QueryInterface(&folderGetSystemIconIndex);\n    if (folderGetSystemIconIndex)\n    {\n      folderGetSystemIconIndex->GetSystemIconIndex(index, &item.iImage);\n      defined = (item.iImage > 0);\n    }\n    if (!defined)\n    {\n      NCOM::CPropVariant prop;\n      _folder->GetProperty(index, kpidAttrib, &prop);\n      UINT32 attrib = 0;\n      if (prop.vt == VT_UI4)\n        attrib = prop.ulVal;\n      else if (IsItemFolder(index))\n        attrib |= FILE_ATTRIBUTE_DIRECTORY;\n      if (_currentFolderPrefix.IsEmpty())\n        throw 1;\n      else\n        item.iImage = _extToIconMap.GetIconIndex(attrib, GetSystemString(GetItemName(index)));\n    }\n    // item.iImage = 1;\n  }\n  */\n\n  if ((item.mask & LVIF_TEXT) == 0)\n    return 0;\n\n  if (realIndex == kParentIndex)\n    return 0;\n  UString s;\n  UINT32 subItemIndex = item.iSubItem;\n  PROPID propID = _visibleProperties[subItemIndex].ID;\n  /*\n  {\n    NCOM::CPropVariant property;\n    if(propID == kpidType)\n      string = GetFileType(index);\n    else\n    {\n      HRESULT result = m_ArchiveFolder->GetProperty(index, propID, &property);\n      if (result != S_OK)\n      {\n        // PrintMessage(\"GetPropertyValue error\");\n        return 0;\n      }\n      string = ConvertPropertyToString(property, propID, false);\n    }\n  }\n  */\n  // const NFind::CFileInfo &aFileInfo = m_Files[index];\n\n  NCOM::CPropVariant prop;\n  /*\n  bool needRead = true;\n  if (propID == kpidSize)\n  {\n    CComPtr<IFolderGetItemFullSize> getItemFullSize;\n    if (_folder.QueryInterface(&getItemFullSize) == S_OK)\n    {\n      if (getItemFullSize->GetItemFullSize(index, &prop) == S_OK)\n        needRead = false;\n    }\n  }\n  if (needRead)\n  */\n\n  if (_folder->GetProperty(realIndex, propID, &prop) != S_OK)\n      throw 2723407;\n\n  if ((propID == kpidSize || propID == kpidPackSize || propID == kpidClusterSize ||\n      propID == kpidNumSubDirs || propID == kpidNumSubFiles) &&\n      (prop.vt == VT_UI8 || prop.vt == VT_UI4))\n    s = ConvertSizeToString(ConvertPropVariantToUInt64(prop));\n  else if ((propID == kpidTotalSize || propID == kpidFreeSpace) &&\n      (prop.vt == VT_UI8 || prop.vt == VT_UI4))\n    s = ConvertSizeToStringShort(ConvertPropVariantToUInt64(prop));\n  else\n  {\n    s = ConvertPropertyToString(prop, propID, false);\n    s.Replace(wchar_t(0xA), L' ');\n    s.Replace(wchar_t(0xD), L' ');\n  }\n  int size = item.cchTextMax;\n  if(size > 0)\n  {\n    if(s.Length() + 1 > size)\n      s = s.Left(size - 1);\n    MyStringCopy(item.pszText, (const wchar_t *)s);\n  }\n  return 0;\n}\n\n#ifdef _WIN32\nextern DWORD g_ComCtl32Version;\n#endif\n\nvoid CPanel::OnItemChanged(NMLISTVIEW *item)\n{\n  int index = (int)item->lParam;\n  if (index == kParentIndex)\n    return;\n  bool oldSelected = (item->uOldState & LVIS_SELECTED) != 0;\n  bool newSelected = (item->uNewState & LVIS_SELECTED) != 0;\n  // Don't change this code. It works only with such check\n  printf(\"CPanel::OnItemChanged : index=%d oldSel=%d newSel=%d\\n\",index,(int)oldSelected,(int)newSelected);\n  if(oldSelected != newSelected) {\n    printf(\"CPanel::OnItemChanged :  _selectedStatusVector[%d] = %d\\n\",index,(int)newSelected);\n    _selectedStatusVector[index] = newSelected;\n  }\n}\n\nbool CPanel::OnNotifyList(LPNMHDR header, LRESULT &result)\n{\n\tprintf(\"CPanel::OnNotifyList : FIXME\\n\");\n  // bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0;\n  // bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;\n  // bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;\n  switch(header->code)\n  {\n    case LVN_ITEMCHANGED:\n    {\n      if (_enableItemChangeNotify)\n      {\n        if (!_mySelectMode)\n          OnItemChanged((LPNMLISTVIEW)header);\n        RefreshStatusBar();\n      }\n      return false;\n    }\n    /*\n\n    case LVN_ODSTATECHANGED:\n      {\n      break;\n      }\n    */\n\n#ifdef _WIN32\n    case LVN_GETDISPINFOW:\n    {\n      LV_DISPINFOW *dispInfo = (LV_DISPINFOW *)header;\n\n      //is the sub-item information being requested?\n\n      if((dispInfo->item.mask & LVIF_TEXT) != 0 ||\n        (dispInfo->item.mask & LVIF_IMAGE) != 0)\n        SetItemText(dispInfo->item);\n      return false;\n    }\n    case LVN_KEYDOWN:\n    {\n      bool boolResult = OnKeyDown(LPNMLVKEYDOWN(header), result);\n      RefreshStatusBar();\n      return boolResult;\n    }\n#endif\n\n    case LVN_COLUMNCLICK:\n      OnColumnClick(LPNMLISTVIEW(header));\n      return false;\n    /*\n    case LVN_ITEMACTIVATE:\n      RefreshStatusBar();\n      if (!alt && !ctrl && !shift)\n        OpenSelectedItems(true);\n      return false;\n    */\n\n    case NM_DBLCLK:\n      RefreshStatusBar();\n      OpenSelectedItems(true);\n      return false;\n#ifdef _WIN32\n    case NM_RETURN:\n    {\n      bool alt = (::GetKeyState(VK_MENU) & 0x8000) != 0;\n      bool ctrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;\n      // bool leftCtrl = (::GetKeyState(VK_LCONTROL) & 0x8000) != 0;\n      // bool RightCtrl = (::GetKeyState(VK_RCONTROL) & 0x8000) != 0;\n      bool shift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;\n      if (!shift && alt && !ctrl)\n      {\n        Properties();\n        return false;\n      }\n      OpenSelectedItems(true);\n      return false;\n    }\n    case NM_RCLICK:\n      RefreshStatusBar();\n      break;\n\n    /*\n      return OnRightClick((LPNMITEMACTIVATE)header, result);\n    */\n      /*\n      case NM_CLICK:\n      SendRefreshStatusBarMessage();\n      return 0;\n      \n        // TODO : Handler default action...\n        return 0;\n        case LVN_ITEMCHANGED:\n        {\n        NMLISTVIEW *pNMLV = (NMLISTVIEW *) lpnmh;\n        SelChange(pNMLV);\n        return TRUE;\n        }\n        case NM_SETFOCUS:\n        return onSetFocus(NULL);\n        case NM_KILLFOCUS:\n        return onKillFocus(NULL);\n      */\n    case NM_CLICK:\n    {\n      // we need SetFocusToList, if we drag-select items from other panel.\n      SetFocusToList();\n      RefreshStatusBar();\n      if(_mySelectMode)\n        if(g_ComCtl32Version >= MAKELONG(71, 4))\n          OnLeftClick((LPNMITEMACTIVATE)header);\n      return false;\n    }\n    case LVN_BEGINLABELEDITW:\n      result = OnBeginLabelEdit((LV_DISPINFOW *)header);\n      return true;\n    case LVN_ENDLABELEDITW:\n      result = OnEndLabelEdit((LV_DISPINFOW *)header);\n      return true;\n\n    case NM_CUSTOMDRAW:\n    {\n      if (_mySelectMode)\n        return OnCustomDraw((LPNMLVCUSTOMDRAW)header, result);\n      break;\n    }\n    case LVN_BEGINDRAG:\n    {\n      OnDrag((LPNMLISTVIEW)header);\n      RefreshStatusBar();\n      break;\n    }\n#endif\n    // case LVN_BEGINRDRAG:\n  }\n  return false;\n}\n\n#ifdef _WIN32\nbool CPanel::OnCustomDraw(LPNMLVCUSTOMDRAW lplvcd, LRESULT &result)\n{\n  switch(lplvcd->nmcd.dwDrawStage)\n  {\n  case CDDS_PREPAINT :\n    result = CDRF_NOTIFYITEMDRAW;\n    return true;\n    \n  case CDDS_ITEMPREPAINT:\n    /*\n    SelectObject(lplvcd->nmcd.hdc,\n    GetFontForItem(lplvcd->nmcd.dwItemSpec,\n    lplvcd->nmcd.lItemlParam) );\n    lplvcd->clrText = GetColorForItem(lplvcd->nmcd.dwItemSpec,\n    lplvcd->nmcd.lItemlParam);\n    lplvcd->clrTextBk = GetBkColorForItem(lplvcd->nmcd.dwItemSpec,\n    lplvcd->nmcd.lItemlParam);\n    */\n    int realIndex = (int)lplvcd->nmcd.lItemlParam;\n    bool selected = false;\n    if (realIndex != kParentIndex)\n      selected = _selectedStatusVector[realIndex];\n    if (selected)\n      lplvcd->clrTextBk = RGB(255, 192, 192);\n    // lplvcd->clrText = RGB(255, 0, 128);\n    else\n      lplvcd->clrTextBk = _listView.GetBkColor();\n    // lplvcd->clrText = RGB(0, 0, 0);\n    // result = CDRF_NEWFONT;\n    result = CDRF_NOTIFYITEMDRAW;\n    return true;\n    \n    // return false;\n    // return true;\n    /*\n    case CDDS_SUBITEM | CDDS_ITEMPREPAINT:\n    if (lplvcd->iSubItem == 0)\n    {\n    // lplvcd->clrText = RGB(255, 0, 0);\n    lplvcd->clrTextBk = RGB(192, 192, 192);\n    }\n    else\n    {\n    lplvcd->clrText = RGB(0, 0, 0);\n    lplvcd->clrTextBk = RGB(255, 255, 255);\n    }\n    return true;\n    */\n\n        /* At this point, you can change the background colors for the item\n        and any subitems and return CDRF_NEWFONT. If the list-view control\n        is in report mode, you can simply return CDRF_NOTIFYSUBITEMREDRAW\n        to customize the item's subitems individually */\n  }\n  return false;\n}\n#endif //#ifdef _WIN32\n\nvoid CPanel::OnRefreshStatusBar()\n{\n  CRecordVector<UINT32> indices;\n  GetOperatedItemIndices(indices);\n\n  _statusBar.SetText(0, MyFormatNew(IDS_N_SELECTED_ITEMS, 0x02000301, NumberToString(indices.Size())));\n\n  UString selectSizeString;\n\n  if (indices.Size() > 0)\n  {\n    UInt64 totalSize = 0;\n    for (int i = 0; i < indices.Size(); i++)\n      totalSize += GetItemSize(indices[i]);\n    selectSizeString = ConvertSizeToString(totalSize);\n  }\n  _statusBar.SetText(1, selectSizeString);\n\n  int focusedItem = _listView.GetFocusedItem();\n  UString sizeString;\n  UString dateString;\n  if (focusedItem >= 0 && _listView.GetSelectedCount() > 0)\n  {\n    int realIndex = GetRealItemIndex(focusedItem);\n    if (realIndex != kParentIndex)\n    {\n      sizeString = ConvertSizeToString(GetItemSize(realIndex));\n      NCOM::CPropVariant prop;\n      if (_folder->GetProperty(realIndex, kpidMTime, &prop) == S_OK)\n        dateString = ConvertPropertyToString(prop, kpidMTime, false);\n    }\n  }\n  _statusBar.SetText(2, sizeString);\n  _statusBar.SetText(3, dateString);\n  // _statusBar.SetText(4, nameString);\n  // _statusBar2.SetText(1, MyFormatNew(L\"{0} bytes\", NumberToStringW(totalSize)));\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelMenu.cpp",
    "content": "#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n#ifdef _WIN32\n#include \"Windows/Menu.h\"\n#endif\n#include \"Windows/COM.h\"\n#include \"Windows/PropVariant.h\"\n#include \"Windows/Clipboard.h\"\n#include \"Windows/PropVariantConversions.h\"\n#include \"../Common/PropIDUtils.h\"\n#include \"../../PropID.h\"\n\n#include \"Panel.h\"\n#include \"PluginInterface.h\"\n#include \"MyLoadMenu.h\"\n#include \"App.h\"\n#include \"LangUtils.h\"\n#include \"resource.h\"\n#include \"PropertyName.h\"\n#include \"PropertyNameRes.h\"\n\nusing namespace NWindows;\n\n// {23170F69-40C1-278A-1000-000100020000}\nDEFINE_GUID(CLSID_CZipContextMenu,\n0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00);\n\nstatic const UINT kSevenZipStartMenuID = kPluginMenuStartID ;\nstatic const UINT kSystemStartMenuID = kPluginMenuStartID + 100;\n\nvoid CPanel::InvokeSystemCommand(const char *command)\n{\n#ifdef _WIN32\n  NCOM::CComInitializer comInitializer;\n  if (!IsFSFolder() && !IsFSDrivesFolder())\n    return;\n  CRecordVector<UInt32> operatedIndices;\n  GetOperatedItemIndices(operatedIndices);\n  if (operatedIndices.IsEmpty())\n    return;\n  CMyComPtr<IContextMenu> contextMenu;\n  if (CreateShellContextMenu(operatedIndices, contextMenu) != S_OK)\n    return;\n\n  CMINVOKECOMMANDINFO ci;\n  ZeroMemory(&ci, sizeof(ci));\n  ci.cbSize = sizeof(CMINVOKECOMMANDINFO);\n  ci.hwnd = GetParent();\n  ci.lpVerb = command;\n  contextMenu->InvokeCommand(&ci);\n#endif\n}\n\nstatic const wchar_t *kSeparator = L\"--------------------------------------\\n\";\nstatic const wchar_t *kPropValueSeparator = L\": \";\n\nextern UString ConvertSizeToString(UInt64 value);\n\nstatic void AddPropertyString(PROPID propID, const wchar_t *nameBSTR,\n    const NCOM::CPropVariant &prop, UString &s)\n{\n  if (prop.vt != VT_EMPTY)\n  {\n    const UString name = GetNameOfProperty(propID, nameBSTR);\n    UString val;\n\n    if ((\n        propID == kpidSize ||\n        propID == kpidPackSize ||\n        propID == kpidNumSubDirs ||\n        propID == kpidNumSubFiles ||\n        propID == kpidNumBlocks ||\n        propID == kpidPhySize ||\n        propID == kpidHeadersSize ||\n        propID == kpidClusterSize\n        ) && (prop.vt == VT_UI8 || prop.vt == VT_UI4))\n      val = ConvertSizeToString(ConvertPropVariantToUInt64(prop));\n    else\n      val = ConvertPropertyToString(prop, propID);\n\n    if (!val.IsEmpty())\n    {\n      s += name;\n      s += kPropValueSeparator;\n      /*\n      if (propID == kpidComment)\n        s += L'\\n';\n      */\n      s += val;\n      s += L'\\n';\n    }\n  }\n}\n\nvoid CPanel::Properties()\n{\n  CMyComPtr<IGetFolderArchiveProperties> getFolderArchiveProperties;\n  _folder.QueryInterface(IID_IGetFolderArchiveProperties, &getFolderArchiveProperties);\n  if (!getFolderArchiveProperties)\n  {\n    InvokeSystemCommand(\"properties\");\n    return;\n  }\n  \n  {\n    UString message;\n\n    CRecordVector<UInt32> operatedIndices;\n    GetOperatedItemIndices(operatedIndices);\n    if (operatedIndices.Size() == 1)\n    {\n      UInt32 index = operatedIndices[0];\n      // message += L\"Item:\\n\";\n      UInt32 numProps;\n      if (_folder->GetNumberOfProperties(&numProps) == S_OK)\n      {\n        for (UInt32 i = 0; i < numProps; i++)\n        {\n          CMyComBSTR name;\n          PROPID propID;\n          VARTYPE varType;\n          \n          if (_folder->GetPropertyInfo(i, &name, &propID, &varType) != S_OK)\n            continue;\n          \n          NCOM::CPropVariant prop;\n          if (_folder->GetProperty(index, propID, &prop) != S_OK)\n            continue;\n          AddPropertyString(propID, name, prop, message);\n        }\n      }\n      message += kSeparator;\n    }\n        \n    message += LangString(IDS_PROPERTY_FILE_TYPE, 0x02000214);\n    message += kPropValueSeparator;\n    message += GetFolderTypeID();\n    message += L\"\\n\";\n\n    {\n      NCOM::CPropVariant prop;\n      if (_folder->GetFolderProperty(kpidPath, &prop) == S_OK)\n      {\n        AddPropertyString(kpidName, L\"Path\", prop, message);\n      }\n    }\n\n    CMyComPtr<IFolderProperties> folderProperties;\n    _folder.QueryInterface(IID_IFolderProperties, &folderProperties);\n    if (folderProperties)\n    {\n      UInt32 numProps;\n      if (folderProperties->GetNumberOfFolderProperties(&numProps) == S_OK)\n      {\n        for (UInt32 i = 0; i < numProps; i++)\n        {\n          CMyComBSTR name;\n          PROPID propID;\n          VARTYPE vt;\n          if (folderProperties->GetFolderPropertyInfo(i, &name, &propID, &vt) != S_OK)\n            continue;\n          NCOM::CPropVariant prop;\n          if (_folder->GetFolderProperty(propID, &prop) != S_OK)\n            continue;\n          AddPropertyString(propID, name, prop, message);\n        }\n      }\n    }\n\n    CMyComPtr<IGetFolderArchiveProperties> getFolderArchiveProperties;\n    _folder.QueryInterface(IID_IGetFolderArchiveProperties, &getFolderArchiveProperties);\n    if (getFolderArchiveProperties)\n    {\n      CMyComPtr<IFolderArchiveProperties> getProps;\n      getFolderArchiveProperties->GetFolderArchiveProperties(&getProps);\n      if (getProps)\n      {\n        UInt32 numProps;\n        if (getProps->GetNumberOfArchiveProperties(&numProps) == S_OK)\n        {\n          if (numProps > 0)\n            message += kSeparator;\n          for (UInt32 i = 0; i < numProps; i++)\n          {\n            CMyComBSTR name;\n            PROPID propID;\n            VARTYPE vt;\n            if (getProps->GetArchivePropertyInfo(i, &name, &propID, &vt) != S_OK)\n              continue;\n            NCOM::CPropVariant prop;\n            if (getProps->GetArchiveProperty(propID, &prop) != S_OK)\n              continue;\n            AddPropertyString(propID, name, prop, message);\n          }\n        }\n      }\n    }\n    ::MessageBoxW(*(this), message, LangString(IDS_PROPERTIES, 0x03020900), MB_OK);\n  }\n}\n\nvoid CPanel::EditCut()\n{\n  // InvokeSystemCommand(\"cut\");\n}\n\nvoid CPanel::EditCopy()\n{\n  /*\n  CMyComPtr<IGetFolderArchiveProperties> getFolderArchiveProperties;\n  _folder.QueryInterface(IID_IGetFolderArchiveProperties, &getFolderArchiveProperties);\n  if (!getFolderArchiveProperties)\n  {\n    InvokeSystemCommand(\"copy\");\n    return;\n  }\n  */\n  UString s;\n  CRecordVector<UInt32> indices;\n  GetSelectedItemsIndices(indices);\n  for (int i = 0; i < indices.Size(); i++)\n  {\n    if (i > 0)\n      s += L\"\\xD\\n\";\n    s += GetItemName(indices[i]);\n  }\n  ClipboardSetText(_mainWindow, s);\n}\n\nvoid CPanel::EditPaste()\n{\n  /*\n  UStringVector names;\n  ClipboardGetFileNames(names);\n  CopyFromNoAsk(names);\n  UString s;\n  for (int i = 0; i < names.Size(); i++)\n  {\n    s += L\" \";\n    s += names[i];\n  }\n\n  MessageBoxW(0, s, L\"\", 0);\n  */\n\n  // InvokeSystemCommand(\"paste\");\n}\n\n#ifdef _WIN32\nHRESULT CPanel::CreateShellContextMenu(\n    const CRecordVector<UInt32> &operatedIndices,\n    CMyComPtr<IContextMenu> &systemContextMenu)\n{\n  systemContextMenu.Release();\n  UString folderPath = GetFsPath();\n\n  CMyComPtr<IShellFolder> desktopFolder;\n  RINOK(::SHGetDesktopFolder(&desktopFolder));\n  if (!desktopFolder)\n  {\n    // ShowMessage(\"Failed to get Desktop folder.\");\n    return E_FAIL;\n  }\n  \n  // Separate the file from the folder.\n\n  \n  // Get a pidl for the folder the file\n  // is located in.\n  LPITEMIDLIST parentPidl;\n  DWORD eaten;\n  RINOK(desktopFolder->ParseDisplayName(\n      GetParent(), 0, (wchar_t *)(const wchar_t *)folderPath,\n      &eaten, &parentPidl, 0));\n  \n  // Get an IShellFolder for the folder\n  // the file is located in.\n  CMyComPtr<IShellFolder> parentFolder;\n  RINOK(desktopFolder->BindToObject(parentPidl,\n      0, IID_IShellFolder, (void**)&parentFolder));\n  if (!parentFolder)\n  {\n    // ShowMessage(\"Invalid file name.\");\n    return E_FAIL;\n  }\n  \n  // Get a pidl for the file itself.\n  CRecordVector<LPITEMIDLIST> pidls;\n  pidls.Reserve(operatedIndices.Size());\n  for (int i = 0; i < operatedIndices.Size(); i++)\n  {\n    LPITEMIDLIST pidl;\n    UString fileName = GetItemRelPath(operatedIndices[i]);\n    if (IsFSDrivesFolder())\n      fileName += L'\\\\';\n    RINOK(parentFolder->ParseDisplayName(GetParent(), 0,\n      (wchar_t *)(const wchar_t *)fileName, &eaten, &pidl, 0));\n    pidls.Add(pidl);\n  }\n\n  ITEMIDLIST temp;\n  if (pidls.Size() == 0)\n  {\n    temp.mkid.cb = 0;\n    /*\n    LPITEMIDLIST pidl;\n    HRESULT result = parentFolder->ParseDisplayName(GetParent(), 0,\n      L\".\\\\\", &eaten, &pidl, 0);\n    if (result != NOERROR)\n      return;\n    */\n    pidls.Add(&temp);\n  }\n\n  // Get the IContextMenu for the file.\n  CMyComPtr<IContextMenu> cm;\n  RINOK( parentFolder->GetUIObjectOf(GetParent(), pidls.Size(),\n      (LPCITEMIDLIST *)&pidls.Front(), IID_IContextMenu, 0, (void**)&cm));\n  if (!cm)\n  {\n    // ShowMessage(\"Unable to get context menu interface.\");\n    return E_FAIL;\n  }\n  systemContextMenu = cm;\n  return S_OK;\n}\n\nvoid CPanel::CreateSystemMenu(HMENU menuSpec,\n    const CRecordVector<UInt32> &operatedIndices,\n    CMyComPtr<IContextMenu> &systemContextMenu)\n{\n  systemContextMenu.Release();\n\n  CreateShellContextMenu(operatedIndices, systemContextMenu);\n\n  if (systemContextMenu == 0)\n    return;\n  \n  // Set up a CMINVOKECOMMANDINFO structure.\n  CMINVOKECOMMANDINFO ci;\n  ZeroMemory(&ci, sizeof(ci));\n  ci.cbSize = sizeof(CMINVOKECOMMANDINFO);\n  ci.hwnd = GetParent();\n  \n  /*\n  if (Sender == GoBtn)\n  {\n    // Verbs that can be used are cut, paste,\n    // properties, delete, and so on.\n    String action;\n    if (CutRb->Checked)\n      action = \"cut\";\n    else if (CopyRb->Checked)\n      action = \"copy\";\n    else if (DeleteRb->Checked)\n      action = \"delete\";\n    else if (PropertiesRb->Checked)\n      action = \"properties\";\n    \n    ci.lpVerb = action.c_str();\n    result = cm->InvokeCommand(&ci);\n    if (result)\n      ShowMessage(\n      \"Error copying file to clipboard.\");\n    \n  }\n  else\n  */\n  {\n    // HMENU hMenu = CreatePopupMenu();\n    CMenu popupMenu;\n    // CMenuDestroyer menuDestroyer(popupMenu);\n    if(!popupMenu.CreatePopup())\n      throw 210503;\n\n    HMENU hMenu = popupMenu;\n\n    DWORD Flags = CMF_EXPLORE;\n    // Optionally the shell will show the extended\n    // context menu on some operating systems when\n    // the shift key is held down at the time the\n    // context menu is invoked. The following is\n    // commented out but you can uncommnent this\n    // line to show the extended context menu.\n    // Flags |= 0x00000080;\n    systemContextMenu->QueryContextMenu(hMenu, 0, kSystemStartMenuID, 0x7FFF, Flags);\n    \n\n    {\n      CMenu menu;\n      menu.Attach(menuSpec);\n      CMenuItem menuItem;\n      menuItem.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID;\n      menuItem.fType = MFT_STRING;\n      menuItem.hSubMenu = popupMenu.Detach();\n      // menuDestroyer.Disable();\n      menuItem.StringValue = LangString(IDS_SYSTEM, 0x030202A0);\n      menu.InsertItem(0, true, menuItem);\n    }\n    /*\n    if (Cmd < 100 && Cmd != 0)\n    {\n      ci.lpVerb = MAKEINTRESOURCE(Cmd - 1);\n      ci.lpParameters = \"\";\n      ci.lpDirectory = \"\";\n      ci.nShow = SW_SHOWNORMAL;\n      cm->InvokeCommand(&ci);\n    }\n    // If Cmd is > 100 then it's one of our\n    // inserted menu items.\n    else\n      // Find the menu item.\n      for (int i = 0; i < popupMenu1->Items->Count; i++)\n      {\n        TMenuItem* menu = popupMenu1->Items->Items[i];\n        // Call its OnClick handler.\n        if (menu->Command == Cmd - 100)\n          menu->OnClick(this);\n      }\n      // Release the memory allocated for the menu.\n      DestroyMenu(hMenu);\n    */\n  }\n}\n\nvoid CPanel::CreateFileMenu(HMENU menuSpec)\n{\n  CreateFileMenu(menuSpec, _sevenZipContextMenu, _systemContextMenu, true);\n}\n\nvoid CPanel::CreateSevenZipMenu(HMENU menuSpec,\n    const CRecordVector<UInt32> &operatedIndices,\n    CMyComPtr<IContextMenu> &sevenZipContextMenu)\n{\n  sevenZipContextMenu.Release();\n\n  CMenu menu;\n  menu.Attach(menuSpec);\n  // CMenuDestroyer menuDestroyer(menu);\n  // menu.CreatePopup();\n\n  bool sevenZipMenuCreated = false;\n\n  CMyComPtr<IContextMenu> contextMenu;\n  if (contextMenu.CoCreateInstance(CLSID_CZipContextMenu, IID_IContextMenu) == S_OK)\n  {\n    CMyComPtr<IInitContextMenu> initContextMenu;\n    if (contextMenu.QueryInterface(IID_IInitContextMenu, &initContextMenu) != S_OK)\n      return;\n    UString currentFolderUnicode = _currentFolderPrefix;\n    UStringVector names;\n    int i;\n    for(i = 0; i < operatedIndices.Size(); i++)\n      names.Add(currentFolderUnicode + GetItemRelPath(operatedIndices[i]));\n    CRecordVector<const wchar_t *> namePointers;\n    for(i = 0; i < operatedIndices.Size(); i++)\n      namePointers.Add(names[i]);\n    \n    // NFile::NDirectory::MySetCurrentDirectory(currentFolderUnicode);\n    if (initContextMenu->InitContextMenu(currentFolderUnicode, &namePointers.Front(),\n        operatedIndices.Size()) == S_OK)\n    {\n      HRESULT res = contextMenu->QueryContextMenu(menu, 0, kSevenZipStartMenuID,\n          kSystemStartMenuID - 1, 0);\n      sevenZipMenuCreated = (HRESULT_SEVERITY(res) == SEVERITY_SUCCESS);\n      if (sevenZipMenuCreated)\n        sevenZipContextMenu = contextMenu;\n      // int code = HRESULT_CODE(res);\n      // int nextItemID = code;\n    }\n  }\n}\n\nvoid CPanel::CreateFileMenu(HMENU menuSpec,\n    CMyComPtr<IContextMenu> &sevenZipContextMenu,\n    CMyComPtr<IContextMenu> &systemContextMenu,\n    bool programMenu)\n{\n  sevenZipContextMenu.Release();\n  systemContextMenu.Release();\n\n  CRecordVector<UInt32> operatedIndices;\n  GetOperatedItemIndices(operatedIndices);\n\n  CMenu menu;\n  menu.Attach(menuSpec);\n  \n  CreateSevenZipMenu(menu, operatedIndices, sevenZipContextMenu);\n  if (g_App.ShowSystemMenu)\n    CreateSystemMenu(menu, operatedIndices, systemContextMenu);\n\n  if (menu.GetItemCount() > 0)\n    menu.AppendItem(MF_SEPARATOR, 0, (LPCTSTR)0);\n\n  int i;\n  for (i = 0; i < operatedIndices.Size(); i++)\n    if (IsItemFolder(operatedIndices[i]))\n      break;\n  bool allAreFiles = (i == operatedIndices.Size());\n  LoadFileMenu(menu, menu.GetItemCount(), programMenu,\n      IsFSFolder(), operatedIndices.Size(), allAreFiles);\n}\n\nbool CPanel::InvokePluginCommand(int id)\n{\n  return InvokePluginCommand(id, _sevenZipContextMenu, _systemContextMenu);\n}\n\nbool CPanel::InvokePluginCommand(int id,\n    IContextMenu *sevenZipContextMenu, IContextMenu *systemContextMenu)\n{\n  UInt32 offset;\n  bool isSystemMenu = (id >= kSystemStartMenuID);\n  if (isSystemMenu)\n    offset = id  - kSystemStartMenuID;\n  else\n    offset = id  - kSevenZipStartMenuID;\n\n  CMINVOKECOMMANDINFOEX commandInfo;\n  commandInfo.cbSize = sizeof(commandInfo);\n  commandInfo.fMask = CMIC_MASK_UNICODE;\n  commandInfo.hwnd = GetParent();\n  commandInfo.lpVerb = (LPCSTR)(MAKEINTRESOURCE(offset));\n  commandInfo.lpParameters = NULL;\n  CSysString currentFolderSys = GetSystemString(_currentFolderPrefix);\n  commandInfo.lpDirectory = (LPCSTR)(LPCTSTR)(currentFolderSys);\n  commandInfo.nShow = SW_SHOW;\n  commandInfo.lpTitle = \"\";\n  commandInfo.lpVerbW = (LPCWSTR)(MAKEINTRESOURCEW(offset));\n  commandInfo.lpParameters = NULL;\n  UString currentFolderUnicode = _currentFolderPrefix;\n  commandInfo.lpDirectoryW = currentFolderUnicode;\n  commandInfo.lpTitleW = L\"\";\n  // commandInfo.ptInvoke.x = xPos;\n  // commandInfo.ptInvoke.y = yPos;\n  commandInfo.ptInvoke.x = 0;\n  commandInfo.ptInvoke.y = 0;\n  HRESULT result;\n  if (isSystemMenu)\n    result = systemContextMenu->InvokeCommand(LPCMINVOKECOMMANDINFO(&commandInfo));\n  else\n    result = sevenZipContextMenu->InvokeCommand(LPCMINVOKECOMMANDINFO(&commandInfo));\n  if (result == NOERROR)\n  {\n    KillSelection();\n    return true;\n  }\n  return false;\n}\n\nbool CPanel::OnContextMenu(HANDLE windowHandle, int xPos, int yPos)\n{\n  if (windowHandle != _listView)\n    return false;\n  /*\n  POINT point;\n  point.x = xPos;\n  point.y = yPos;\n  if (!_listView.ScreenToClient(&point))\n    return false;\n\n  LVHITTESTINFO info;\n  info.pt = point;\n  int index = _listView.HitTest(&info);\n  */\n\n  CRecordVector<UInt32> operatedIndices;\n  GetOperatedItemIndices(operatedIndices);\n\n  if (xPos < 0 || yPos < 0)\n  {\n    if (operatedIndices.Size() == 0)\n    {\n      xPos = 0;\n      yPos = 0;\n    }\n    else\n    {\n      int itemIndex = _listView.GetNextItem(-1, LVNI_FOCUSED);\n      if (itemIndex == -1)\n        return false;\n      RECT rect;\n      if (!_listView.GetItemRect(itemIndex, &rect, LVIR_ICON))\n        return false;\n      xPos = (rect.left + rect.right) / 2;\n      yPos = (rect.top + rect.bottom) / 2;\n    }\n    POINT point = {xPos, yPos};\n    _listView.ClientToScreen(&point);\n    xPos = point.x;\n    yPos = point.y;\n  }\n\n  CMenu menu;\n  CMenuDestroyer menuDestroyer(menu);\n  menu.CreatePopup();\n\n  CMyComPtr<IContextMenu> sevenZipContextMenu;\n  CMyComPtr<IContextMenu> systemContextMenu;\n  CreateFileMenu(menu, sevenZipContextMenu, systemContextMenu, false);\n\n  int result = menu.Track(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY,\n    xPos, yPos, _listView);\n\n  if (result == 0)\n    return true;\n\n  if (result >= kPluginMenuStartID)\n  {\n    InvokePluginCommand(result, sevenZipContextMenu, systemContextMenu);\n    return true;\n  }\n  if (ExecuteFileCommand(result))\n    return true;\n  return true;\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelOperations.cpp",
    "content": "// PanelOperations.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n\n#include \"Panel.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/DynamicBuffer.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/ResourceString.h\"\n#include \"Windows/Thread.h\"\n#include \"Windows/COM.h\"\n\n#include \"ComboDialog.h\"\n\n#include \"FSFolder.h\"\n#include \"LangUtils.h\"\n#include \"FormatUtils.h\"\n\n#include \"UpdateCallback100.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\n\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\nenum EFolderOpType\n{\n  FOLDER_TYPE_CREATE_FOLDER = 0,\n  FOLDER_TYPE_DELETE = 1,\n  FOLDER_TYPE_RENAME = 2\n};\n\nstruct CThreadFolderOperations\n{\n  EFolderOpType OpType;\n  UString Name;\n  UInt32 Index;\n  CRecordVector<UInt32> Indices;\n\n  CMyComPtr<IFolderOperations> FolderOperations;\n  CMyComPtr<IProgress> UpdateCallback;\n  CUpdateCallback100Imp *UpdateCallbackSpec;\n  HRESULT Result;\n  \n  CThreadFolderOperations(EFolderOpType opType);\n  \n  void Process()\n  {\n#ifdef _WIN32\n    NCOM::CComInitializer comInitializer;\n#endif\n    UpdateCallbackSpec->ProgressDialog.WaitCreating();\n\n    switch(OpType)\n    {\n      case FOLDER_TYPE_CREATE_FOLDER:\n        Result = FolderOperations->CreateFolder(Name, UpdateCallback);\n        break;\n      case FOLDER_TYPE_DELETE:\n        Result = FolderOperations->Delete(&Indices.Front(), Indices.Size(), UpdateCallback);\n        break;\n      case FOLDER_TYPE_RENAME:\n        Result = FolderOperations->Rename(Index, Name, UpdateCallback);\n        break;\n      default:\n        Result = E_FAIL;\n    }\n    UpdateCallbackSpec->ProgressDialog.MyClose();\n  }\n  \n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    ((CThreadFolderOperations *)param)->Process();\n    return 0;\n  }\n};\n\nCThreadFolderOperations::CThreadFolderOperations(EFolderOpType opType): OpType(opType) {};\n\nstatic void DoOperation(CThreadFolderOperations &op, CPanel &panel, const UString &progressTitle)\n{\n  op.UpdateCallbackSpec = new CUpdateCallback100Imp;\n  op.UpdateCallback = op.UpdateCallbackSpec;\n\n  bool usePassword = false;\n  UString password;\n  if (panel._parentFolders.Size() > 0)\n  {\n    const CFolderLink &fl = panel._parentFolders.Back();\n    usePassword = fl.UsePassword;\n    password = fl.Password;\n  }\n\n  op.UpdateCallbackSpec->Init(panel.GetParent(), usePassword, password);\n\n  op.UpdateCallbackSpec->ProgressDialog.MainWindow = panel._mainWindow;\n  op.UpdateCallbackSpec->ProgressDialog.MainTitle = LangString(IDS_APP_TITLE, 0x03000000);\n  op.UpdateCallbackSpec->ProgressDialog.MainAddTitle = progressTitle + UString(L\" \");\n\n  // op.FolderOperations = folderOperations;\n  // op.Index = realIndex;\n  // op.Name = newName;\n  // HRESULT result = folderOperations->Rename(realIndex, newName, 0);\n\n  NWindows::CThread thread;\n  if (thread.Create(CThreadFolderOperations::MyThreadFunction, &op) != S_OK)\n    throw 271824;\n  op.UpdateCallbackSpec->StartProgressDialog(progressTitle);\n}\n\n#ifndef _UNICODE\ntypedef int (WINAPI * SHFileOperationWP)(LPSHFILEOPSTRUCTW lpFileOp);\n#endif\n\nvoid CPanel::DeleteItems(bool toRecycleBin)\n{\n  CPanel::CDisableTimerProcessing disableTimerProcessing2(*this);\n  CRecordVector<UInt32> indices;\n  GetOperatedItemIndices(indices);\n  if (indices.IsEmpty())\n    return;\n  CSelectedState state;\n  SaveSelectedState(state);\n  bool useInternalDelete = false;\n  if (IsFSFolder() && toRecycleBin)\n  {\n    #ifndef _UNICODE\n    if (!g_IsNT)\n    {\n      CDynamicBuffer<CHAR> buffer;\n      size_t size = 0;\n      for (int i = 0; i < indices.Size(); i++)\n      {\n        const AString path = GetSystemString(GetFsPath() + GetItemRelPath(indices[i]));\n        buffer.EnsureCapacity(size + path.Length() + 1);\n        memmove(((CHAR *)buffer) + size, (const CHAR *)path, (path.Length() + 1) * sizeof(CHAR));\n        size += path.Length() + 1;\n      }\n      buffer.EnsureCapacity(size + 1);\n      ((CHAR *)buffer)[size]  = 0;\n      SHFILEOPSTRUCTA fo;\n      fo.hwnd = GetParent();\n      fo.wFunc = FO_DELETE;\n      fo.pFrom = (const CHAR *)buffer;\n      fo.pTo = 0;\n      fo.fFlags = 0;\n      if (toRecycleBin)\n        fo.fFlags |= FOF_ALLOWUNDO;\n      // fo.fFlags |= FOF_NOCONFIRMATION;\n      // fo.fFlags |= FOF_NOERRORUI;\n      // fo.fFlags |= FOF_SILENT;\n      // fo.fFlags |= FOF_WANTNUKEWARNING;\n      fo.fAnyOperationsAborted = FALSE;\n      fo.hNameMappings = 0;\n      fo.lpszProgressTitle = 0;\n      /* int res = */ ::SHFileOperationA(&fo);\n    }\n    else\n    #endif\n    {\n      CDynamicBuffer<WCHAR> buffer;\n      size_t size = 0;\n      int maxLen = 0;\n      for (int i = 0; i < indices.Size(); i++)\n      {\n        // L\"\\\\\\\\?\\\\\") doesn't work here.\n        const UString path = GetFsPath() + GetItemRelPath(indices[i]);\n        if (path.Length() > maxLen)\n          maxLen = path.Length();\n        buffer.EnsureCapacity(size + path.Length() + 1);\n        memmove(((WCHAR *)buffer) + size, (const WCHAR *)path, (path.Length() + 1) * sizeof(WCHAR));\n        size += path.Length() + 1;\n      }\n      buffer.EnsureCapacity(size + 1);\n      ((WCHAR *)buffer)[size] = 0;\n#ifdef _WIN32\n      if (maxLen >= MAX_PATH)\n      {\n        if (toRecycleBin)\n        {\n          MessageBoxErrorLang(IDS_ERROR_LONG_PATH_TO_RECYCLE, 0x03020218);\n          return;\n        }\n        useInternalDelete = true;\n      }\n      else\n      {\n        SHFILEOPSTRUCTW fo;\n        fo.hwnd = GetParent();\n        fo.wFunc = FO_DELETE;\n        fo.pFrom = (const WCHAR *)buffer;\n        fo.pTo = 0;\n        fo.fFlags = 0;\n        if (toRecycleBin)\n          fo.fFlags |= FOF_ALLOWUNDO;\n        fo.fAnyOperationsAborted = FALSE;\n        fo.hNameMappings = 0;\n        fo.lpszProgressTitle = 0;\n        int res;\n        #ifdef _UNICODE\n        res = ::SHFileOperationW(&fo);\n        #else\n        SHFileOperationWP shFileOperationW = (SHFileOperationWP)\n          ::GetProcAddress(::GetModuleHandleW(L\"shell32.dll\"), \"SHFileOperationW\");\n        if (shFileOperationW == 0)\n          return;\n        res = shFileOperationW(&fo);\n        #endif\n      }\n#else\n      // FIXME - how to use the recycle bin undex Gnome or KDE ?\n      useInternalDelete = true;\n#endif\n    }\n    /*\n    if (fo.fAnyOperationsAborted)\n      MessageBoxError(result, LangString(IDS_ERROR_DELETING, 0x03020217));\n    */\n  }\n  else\n    useInternalDelete = true;\n  if (useInternalDelete)\n    DeleteItemsInternal(indices);\n  RefreshListCtrl(state);\n}\n\nvoid CPanel::DeleteItemsInternal(CRecordVector<UInt32> &indices)\n{\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n\n  UString title;\n  UString message;\n  if (indices.Size() == 1)\n  {\n    int index = indices[0];\n    const UString itemName = GetItemRelPath(index);\n    if (IsItemFolder(index))\n    {\n      title = LangString(IDS_CONFIRM_FOLDER_DELETE, 0x03020211);\n      message = MyFormatNew(IDS_WANT_TO_DELETE_FOLDER, 0x03020214, itemName);\n    }\n    else\n    {\n      title = LangString(IDS_CONFIRM_FILE_DELETE, 0x03020210);\n      message = MyFormatNew(IDS_WANT_TO_DELETE_FILE, 0x03020213, itemName);\n    }\n  }\n  else\n  {\n    title = LangString(IDS_CONFIRM_ITEMS_DELETE, 0x03020212);\n    message = MyFormatNew(IDS_WANT_TO_DELETE_ITEMS, 0x03020215,\n        NumberToString(indices.Size()));\n  }\n  if (::MessageBoxW(GetParent(), message, title, MB_OKCANCEL | MB_ICONQUESTION) != IDOK)\n    return;\n\n  {\n    CThreadFolderOperations op(FOLDER_TYPE_DELETE);\n    op.FolderOperations = folderOperations;\n    op.Indices = indices;\n    DoOperation(op, *this, LangString(IDS_DELETING, 0x03020216));\n    if (op.Result != S_OK)\n      MessageBoxError(op.Result, LangString(IDS_ERROR_DELETING, 0x03020217));\n  }\n  RefreshTitleAlways();\n}\n\n#ifdef _WIN32\nBOOL CPanel::OnBeginLabelEdit(LV_DISPINFOW * lpnmh)\n{\n  int realIndex = GetRealIndex(lpnmh->item);\n  if (realIndex == kParentIndex)\n    return TRUE;\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n    return TRUE;\n  return FALSE;\n}\n\nBOOL CPanel::OnEndLabelEdit(LV_DISPINFOW * lpnmh)\n{\n  if (lpnmh->item.pszText == NULL)\n    return FALSE;\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return FALSE;\n  }\n  const UString newName = lpnmh->item.pszText;\n  CPanel::CDisableTimerProcessing disableTimerProcessing2(*this);\n\n  SaveSelectedState(_selectedState);\n\n  int realIndex = GetRealIndex(lpnmh->item);\n  if (realIndex == kParentIndex)\n    return FALSE;\n  const UString prefix = GetItemPrefix(realIndex);\n\n\n  {\n    CThreadFolderOperations op(FOLDER_TYPE_RENAME);\n    op.FolderOperations = folderOperations;\n    op.Index = realIndex;\n    op.Name = newName;\n    DoOperation(op, *this, LangString(IDS_RENAMING, 0x03020220));\n    if (op.Result != S_OK)\n    {\n      MessageBoxError(op.Result, LangString(IDS_ERROR_RENAMING, 0x03020221));\n      return FALSE;\n    }\n  }\n\n  // Can't use RefreshListCtrl here.\n  // RefreshListCtrlSaveFocused();\n  _selectedState.FocusedName = prefix + newName;\n  _selectedState.SelectFocused = true;\n\n  // We need clear all items to disable GetText before Reload:\n  // number of items can change.\n  // _listView.DeleteAllItems();\n  // But seems it can still call GetText (maybe for current item)\n  // so we can't delete items.\n\n  _dontShowMode = true;\n\n  PostMessage(kReLoadMessage);\n  return TRUE;\n}\n#endif\n\nvoid CPanel::CreateFolder()\n{\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n  CPanel::CDisableTimerProcessing disableTimerProcessing2(*this);\n  CSelectedState state;\n  SaveSelectedState(state);\n  CComboDialog comboDialog;\n  comboDialog.Title = LangString(IDS_CREATE_FOLDER, 0x03020230);\n  comboDialog.Static = LangString(IDS_CREATE_FOLDER_NAME, 0x03020231);\n  comboDialog.Value = LangString(IDS_CREATE_FOLDER_DEFAULT_NAME, /*0x03020232*/ (UInt32)-1);\n  if (comboDialog.Create(GetParent()) == IDCANCEL)\n    return;\n  \n  UString newName = comboDialog.Value;\n  \n  {\n    CThreadFolderOperations op(FOLDER_TYPE_CREATE_FOLDER);\n    op.FolderOperations = folderOperations;\n    op.Name = newName;\n    DoOperation(op, *this, LangString(IDS_CREATE_FOLDER, 0x03020230));\n\n    if (op.Result != S_OK)\n    {\n      MessageBoxError(op.Result, LangString(IDS_CREATE_FOLDER_ERROR, 0x03020233));\n      return;\n    }\n  }\n  int pos = newName.Find(L'\\\\');\n  if (pos >= 0)\n    newName = newName.Left(pos);\n  if (!_mySelectMode)\n    state.SelectedNames.Clear();\n  state.FocusedName = newName;\n  state.SelectFocused = true;\n  RefreshTitleAlways();\n  RefreshListCtrl(state);\n}\n\nvoid CPanel::CreateFile()\n{\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n  CPanel::CDisableTimerProcessing disableTimerProcessing2(*this);\n  CSelectedState state;\n  SaveSelectedState(state);\n  CComboDialog comboDialog;\n  comboDialog.Title = LangString(IDS_CREATE_FILE, 0x03020240);\n  comboDialog.Static = LangString(IDS_CREATE_FILE_NAME, 0x03020241);\n  comboDialog.Value = LangString(IDS_CREATE_FILE_DEFAULT_NAME, /*0x03020242*/ (UInt32)-1);\n  if (comboDialog.Create(GetParent()) == IDCANCEL)\n    return;\n  UString newName = comboDialog.Value;\n  HRESULT result = folderOperations->CreateFile(newName, 0);\n  if (result != S_OK)\n  {\n    MessageBoxError(result, LangString(IDS_CREATE_FILE_ERROR, 0x03020243));\n    return;\n  }\n  int pos = newName.Find(L'\\\\');\n  if (pos >= 0)\n    newName = newName.Left(pos);\n  if (!_mySelectMode)\n    state.SelectedNames.Clear();\n  state.FocusedName = newName;\n  state.SelectFocused = true;\n  RefreshListCtrl(state);\n}\n\nvoid CPanel::RenameFile()\n{\n  int index = _listView.GetFocusedItem();\n  if (index >= 0)\n    _listView.EditLabel(index);\n}\n\nvoid CPanel::ChangeComment()\n{\n  CPanel::CDisableTimerProcessing disableTimerProcessing2(*this);\n  int index = _listView.GetFocusedItem();\n  if (index < 0)\n    return;\n  int realIndex = GetRealItemIndex(index);\n  if (realIndex == kParentIndex)\n    return;\n  CSelectedState state;\n  SaveSelectedState(state);\n  CMyComPtr<IFolderOperations> folderOperations;\n  if (_folder.QueryInterface(IID_IFolderOperations, &folderOperations) != S_OK)\n  {\n    MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n\n  UString comment;\n  {\n    NCOM::CPropVariant propVariant;\n    if (_folder->GetProperty(realIndex, kpidComment, &propVariant) != S_OK)\n      return;\n    if (propVariant.vt == VT_BSTR)\n      comment = propVariant.bstrVal;\n    else if (propVariant.vt != VT_EMPTY)\n      return;\n  }\n  UString name = GetItemRelPath(realIndex);\n  CComboDialog comboDialog;\n  comboDialog.Title = name + L\" \" + LangString(IDS_COMMENT, 0x03020290);\n  comboDialog.Value = comment;\n  comboDialog.Static = LangString(IDS_COMMENT2, 0x03020291);\n  if (comboDialog.Create(GetParent()) == IDCANCEL)\n    return;\n  NCOM::CPropVariant propVariant(comboDialog.Value);\n\n  HRESULT result = folderOperations->SetProperty(realIndex, kpidComment, &propVariant, NULL);\n  if (result != S_OK)\n  {\n    MessageBoxError(result, L\"Set Comment Error\");\n  }\n  RefreshListCtrl(state);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelSelect.cpp",
    "content": "// PanelSelect.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/Wildcard.h\"\n\n#include \"Panel.h\"\n\n#include \"ComboDialog.h\"\n\n#include \"LangUtils.h\"\n\nvoid CPanel::OnShiftSelectMessage()\n{\n  if (!_mySelectMode)\n    return;\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  if (!_selectionIsDefined)\n    return;\n  int startItem = MyMin(focusedItem, _prevFocusedItem);\n  int finishItem = MyMax(focusedItem, _prevFocusedItem);\n  for (int i = 0; i < _listView.GetItemCount(); i++)\n  {\n    int realIndex = GetRealItemIndex(i);\n    if (realIndex == kParentIndex)\n      continue;\n    if (i >= startItem && i <= finishItem)\n      if (_selectedStatusVector[realIndex] != _selectMark)\n      {\n        _selectedStatusVector[realIndex] = _selectMark;\n        _listView.RedrawItem(i);\n      }\n  }\n  _prevFocusedItem = focusedItem;\n}\n\n#ifdef _WIN32\nvoid CPanel::OnArrowWithShift()\n{\n  if (!_mySelectMode)\n    return;\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int realIndex = GetRealItemIndex(focusedItem);\n  if (_selectionIsDefined)\n  {\n    if (realIndex != kParentIndex)\n      _selectedStatusVector[realIndex] = _selectMark;\n  }\n  else\n  {\n    if (realIndex == kParentIndex)\n    {\n      _selectionIsDefined = true;\n      _selectMark = true;\n    }\n    else\n    {\n      _selectionIsDefined = true;\n      _selectMark = !_selectedStatusVector[realIndex];\n      _selectedStatusVector[realIndex] = _selectMark;\n    }\n  }\n  _prevFocusedItem = focusedItem;\n  PostMessage(kShiftSelectMessage);\n  _listView.RedrawItem(focusedItem);\n}\n\nvoid CPanel::OnInsert()\n{\n  /*\n  const int kState = CDIS_MARKED; // LVIS_DROPHILITED;\n  UINT state = (_listView.GetItemState(focusedItem, LVIS_CUT) == 0) ?\n      LVIS_CUT : 0;\n  _listView.SetItemState(focusedItem, state, LVIS_CUT);\n  // _listView.SetItemState(focusedItem, LVIS_SELECTED, LVIS_SELECTED);\n\n  */\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int realIndex = GetRealItemIndex(focusedItem);\n  bool isSelected = !_selectedStatusVector[realIndex];\n  if (realIndex != kParentIndex)\n    _selectedStatusVector[realIndex] = isSelected;\n  \n  if (!_mySelectMode)\n    _listView.SetItemState(focusedItem, isSelected ? LVIS_SELECTED: 0, LVIS_SELECTED);\n\n  _listView.RedrawItem(focusedItem);\n\n  int nextIndex = focusedItem + 1;\n  if (nextIndex < _listView.GetItemCount())\n  {\n    _listView.SetItemState(nextIndex, LVIS_FOCUSED | LVIS_SELECTED, \n        LVIS_FOCUSED | LVIS_SELECTED);\n    _listView.EnsureVisible(nextIndex, false);\n  }\n}\n#endif // _WIN32\n\n/*\nvoid CPanel::OnUpWithShift()\n{\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int index = GetRealItemIndex(focusedItem);\n  _selectedStatusVector[index] = !_selectedStatusVector[index];\n  _listView.RedrawItem(index);\n}\n\nvoid CPanel::OnDownWithShift()\n{\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int index = GetRealItemIndex(focusedItem);\n  _selectedStatusVector[index] = !_selectedStatusVector[index];\n  _listView.RedrawItem(index);\n}\n*/\n\nvoid CPanel::UpdateSelection()\n{\nprintf(\"CPanel::UpdateSelection : _mySelectMode=%d\\n\",(int)_mySelectMode);\n  if (!_mySelectMode)\n  {\n    bool enableTemp = _enableItemChangeNotify;\n    _enableItemChangeNotify = false;\n    int numItems = _listView.GetItemCount();\nprintf(\"CPanel::UpdateSelection : numItems=%d\\n\",(int)numItems);\n    for (int i = 0; i < numItems; i++)\n    {\n      int realIndex = GetRealItemIndex(i);\n      if (realIndex != kParentIndex)\n      {\n        UINT value = 0;\n        value = _selectedStatusVector[realIndex] ? LVIS_SELECTED: 0;\nprintf(\"CPanel::UpdateSelection : SetItemState(%d,%d,LVIS_SELECTED)\\n\",(int)i,(unsigned)value);\n        _listView.SetItemState(i, value, LVIS_SELECTED);\n      }\n    }\n    _enableItemChangeNotify = enableTemp;\n  }\n  _listView.RedrawAllItems();\n}\n\n\nvoid CPanel::SelectSpec(bool selectMode)\n{\n  CComboDialog comboDialog;\n  comboDialog.Title = selectMode ? \n      LangString(IDS_SELECT, 0x03020250):\n      LangString(IDS_DESELECT, 0x03020251);\n  comboDialog.Static = LangString(IDS_SELECT_MASK, 0x03020252);\n  comboDialog.Value = L\"*\";\n  if (comboDialog.Create(GetParent()) == IDCANCEL)\n    return;\n  const UString &mask = comboDialog.Value;\n  for (int i = 0; i < _selectedStatusVector.Size(); i++)\n    if (CompareWildCardWithName(mask, GetItemName(i)))\n       _selectedStatusVector[i] = selectMode;\n  UpdateSelection();\n}\n\nvoid CPanel::SelectByType(bool selectMode)\n{\n  int focusedItem = _listView.GetFocusedItem();\n  if (focusedItem < 0)\n    return;\n  int realIndex = GetRealItemIndex(focusedItem);\n  UString name = GetItemName(realIndex);\n  bool isItemFolder = IsItemFolder(realIndex);\n\n  /*\n  UINT32 numItems;\n  _folder->GetNumberOfItems(&numItems);\n  if ((UInt32)_selectedStatusVector.Size() != numItems)\n    throw 11111;\n  */\n\n  if (isItemFolder)\n  {\n    for (int i = 0; i < _selectedStatusVector.Size(); i++)\n      if (IsItemFolder(i) == isItemFolder)\n        _selectedStatusVector[i] = selectMode;\n  }\n  else\n  {\n    int pos = name.ReverseFind(L'.');\n    if (pos < 0)\n    {\n      for (int i = 0; i < _selectedStatusVector.Size(); i++)\n        if (IsItemFolder(i) == isItemFolder && GetItemName(i).ReverseFind(L'.') < 0)\n          _selectedStatusVector[i] = selectMode;\n    }\n    else\n    {\n      UString mask = UString(L'*') + name.Mid(pos);\n      for (int i = 0; i < _selectedStatusVector.Size(); i++)\n        if (IsItemFolder(i) == isItemFolder && CompareWildCardWithName(mask, GetItemName(i)))\n          _selectedStatusVector[i] = selectMode;\n    }\n  }\n  UpdateSelection();\n}\n\nvoid CPanel::SelectAll(bool selectMode)\n{\n  for (int i = 0; i < _selectedStatusVector.Size(); i++)\n    _selectedStatusVector[i] = selectMode;\n  UpdateSelection();\n}\n\nvoid CPanel::InvertSelection()\n{\n  if (!_mySelectMode)\n  {\n    int numSelected = 0;\n    for (int i = 0; i < _selectedStatusVector.Size(); i++)\n      if (_selectedStatusVector[i])\n        numSelected++;\n    if (numSelected == 1)\n    {\n      int focused = _listView.GetFocusedItem();\n      if (focused >= 0)\n      {\n        int realIndex = GetRealItemIndex(focused);\n        if (realIndex >= 0)\n          if (_selectedStatusVector[realIndex])\n            _selectedStatusVector[realIndex] = false;\n      }\n    }\n  }\n  for (int i = 0; i < _selectedStatusVector.Size(); i++)\n    _selectedStatusVector[i] = !_selectedStatusVector[i];\n  UpdateSelection();\n}\n\nvoid CPanel::KillSelection()\n{\n  SelectAll(false);\n  if (!_mySelectMode)\n  {\n    int focused = _listView.GetFocusedItem();\n    if (focused >= 0)\n      _listView.SetItemState(focused, LVIS_SELECTED, LVIS_SELECTED);\n  }\n}\n\n#ifdef _WIN32\nvoid CPanel::OnLeftClick(LPNMITEMACTIVATE itemActivate)\n{\n  if(itemActivate->hdr.hwndFrom != HWND(_listView))\n    return;\n  // It will be work only for Version 4.71 (IE 4);\n  int indexInList = itemActivate->iItem;\n  if (indexInList < 0)\n    return;\n  if ((itemActivate->uKeyFlags & LVKF_SHIFT) != 0)\n  {\n    // int focusedIndex = _listView.GetFocusedItem();\n    int focusedIndex = _startGroupSelect;\n    if (focusedIndex < 0)\n      return;\n    int startItem = MyMin(focusedIndex, indexInList);\n    int finishItem = MyMax(focusedIndex, indexInList);\n    for (int i = 0; i < _selectedStatusVector.Size(); i++)\n    {\n      int realIndex = GetRealItemIndex(i);\n      if (realIndex == kParentIndex)\n        continue;\n      bool selected = (i >= startItem && i <= finishItem);\n      if (_selectedStatusVector[realIndex] != selected)\n      {\n        _selectedStatusVector[realIndex] = selected;\n        _listView.RedrawItem(i);\n      }\n    }\n  }\n  else \n  {\n    _startGroupSelect = indexInList;\n    if ((itemActivate->uKeyFlags & LVKF_CONTROL) != 0)\n    {\n      int realIndex = GetRealItemIndex(indexInList);\n      if (realIndex != kParentIndex)\n      {\n        _selectedStatusVector[realIndex] = !_selectedStatusVector[realIndex];\n        _listView.RedrawItem(indexInList);\n      }\n    }\n  }\n  return;\n}\n#endif\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelSort.cpp",
    "content": "// PanelSort.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"../../PropID.h\"\n\n#include \"Panel.h\"\n\nusing namespace NWindows;\n\nstatic UString GetExtension(const UString &name)\n{\n  int dotPos = name.ReverseFind(L'.');\n  if (dotPos < 0)\n    return UString();\n  return name.Mid(dotPos);\n}\n\nint CALLBACK CompareItems2(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)\n{\n  if (lpData == 0) // FIXME NULL)\n    return 0;\n  CPanel *panel = (CPanel*)lpData;\n  \n  switch(panel->_sortID)\n  {\n    // if (panel->_sortIndex == 0)\n    case kpidName:\n    {\n      const UString name1 = panel->GetItemName((int)lParam1);\n      const UString name2 = panel->GetItemName((int)lParam2);\n      int res = name1.CompareNoCase(name2);\n      /*\n      if (res != 0 || !panel->_flatMode)\n        return res;\n      const UString prefix1 = panel->GetItemPrefix(lParam1);\n      const UString prefix2 = panel->GetItemPrefix(lParam2);\n      return res = prefix1.CompareNoCase(prefix2);\n      */\n      return res;\n    }\n    case kpidNoProperty:\n    {\n      return MyCompare(lParam1, lParam2);\n    }\n    case kpidExtension:\n    {\n      const UString ext1 = GetExtension(panel->GetItemName((int)lParam1));\n      const UString ext2 = GetExtension(panel->GetItemName((int)lParam2));\n      return ext1.CompareNoCase(ext2);\n    }\n  }\n  /*\n  if (panel->_sortIndex == 1)\n    return MyCompare(file1.Size, file2.Size);\n  return ::CompareFileTime(&file1.MTime, &file2.MTime);\n  */\n\n  // PROPID propID = panel->_properties[panel->_sortIndex].ID;\n  PROPID propID = panel->_sortID;\n\n  NCOM::CPropVariant propVariant1, propVariant2;\n  // Name must be first property\n  panel->_folder->GetProperty((UINT32)lParam1, propID, &propVariant1);\n  panel->_folder->GetProperty((UINT32)lParam2, propID, &propVariant2);\n  if (propVariant1.vt != propVariant2.vt)\n    return 0; // It means some BUG\n  if (propVariant1.vt == VT_BSTR)\n  {\n#ifdef _WIN32\n    return _wcsicmp(propVariant1.bstrVal, propVariant2.bstrVal);\n#else\n    return wcscmp(propVariant1.bstrVal, propVariant2.bstrVal); // FIXME _wcsicmp ?\n#endif\n  }\n  return propVariant1.Compare(propVariant2);\n  // return 0;\n}\n\nint CALLBACK CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)\n{\n  if (lpData == 0) // FIXME NULL)\n\t  return 0;\n  if (lParam1 == kParentIndex) return -1;\n  if (lParam2 == kParentIndex) return 1;\n\n  CPanel *panel = (CPanel*)lpData;\n\n  bool isDir1 = panel->IsItemFolder((int)lParam1);\n  bool isDir2 = panel->IsItemFolder((int)lParam2);\n  \n  if (isDir1 && !isDir2) return -1;\n  if (isDir2 && !isDir1) return 1;\n\n  int result = CompareItems2(lParam1, lParam2, lpData);\n  return panel->_ascending ? result: (-result);\n}\n\n\n/*\nvoid CPanel::SortItems(int index)\n{\n  if (index == _sortIndex)\n    _ascending = !_ascending;\n  else\n  {\n    _sortIndex = index;\n    _ascending = true;\n    switch (_properties[_sortIndex].ID)\n    {\n      case kpidSize:\n      case kpidPackedSize:\n      case kpidCTime:\n      case kpidATime:\n      case kpidMTime:\n      _ascending = false;\n      break;\n    }\n  }\n  _listView.SortItems(CompareItems, (LPARAM)this);\n  _listView.EnsureVisible(_listView.GetFocusedItem(), false);\n}\nvoid CPanel::SortItemsWithPropID(PROPID propID)\n{\n  int index = _properties.FindItemWithID(propID);\n  if (index >= 0)\n    SortItems(index);\n}\n*/\nvoid CPanel::SortItemsWithPropID(PROPID propID)\n{\n  if (propID == _sortID)\n    _ascending = !_ascending;\n  else\n  {\n    _sortID = propID;\n    _ascending = true;\n    switch (propID)\n    {\n      case kpidSize:\n      case kpidPackSize:\n      case kpidCTime:\n      case kpidATime:\n      case kpidMTime:\n        _ascending = false;\n      break;\n    }\n  }\n  _listView.SortItems(CompareItems, (LPARAM)this);\n  _listView.EnsureVisible(_listView.GetFocusedItem(), false);\n}\n\n\nvoid CPanel::OnColumnClick(LPNMLISTVIEW info)\n{\n  /*\n  int index = _properties.FindItemWithID(_visibleProperties[info->iSubItem].ID);\n  SortItems(index);\n  */\n  SortItemsWithPropID(_visibleProperties[info->iSubItem].ID);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PanelSplitFile.cpp",
    "content": "// PanelSplitFile.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n\nextern \"C\"\n{\n  #include \"../../../../C/Alloc.h\"\n}\n\n#include \"Common/Types.h\"\n#include \"Common/IntToString.h\"\n\n// #include \"Windows/COM.h\"\n#include \"Windows/FileIO.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/Thread.h\"\n#include \"ProgressDialog2.h\"\n#include \"SplitDialog.h\"\n#include \"CopyDialog.h\"\n\n#include \"../GUI/ExtractRes.h\"\n\n#include \"SplitUtils.h\"\n#include \"App.h\"\n#include \"FormatUtils.h\"\n#include \"LangUtils.h\"\n\nusing namespace NWindows;\n\nclass CMyBuffer\n{\n  void *_data;\npublic:\n  CMyBuffer(): _data(0) {}\n  operator void *() { return _data; }\n  bool Allocate(size_t size)\n  {\n    if (_data != 0)\n      return false;\n    _data = ::MidAlloc(size);\n    return _data != 0;\n  }\n  ~CMyBuffer() { ::MidFree(_data); }\n};\n\nstruct CVolSeqName\n{\n  UString UnchangedPart;\n  UString ChangedPart;\n  CVolSeqName(): ChangedPart(L\"000\") {};\n\n  bool ParseName(const UString &name)\n  {\n    if (name.Right(2) != L\"01\")\n      return false;\n    int numLetters = 2;\n    while (numLetters < name.Length())\n    {\n      if (name[name.Length() - numLetters - 1] != '0')\n        break;\n      numLetters++;\n    }\n    UnchangedPart = name.Left(name.Length() - numLetters);\n    ChangedPart = name.Right(numLetters);\n    return true;\n  }\n\n  UString GetNextName()\n  {\n    UString newName;\n    int i;\n    int numLetters = ChangedPart.Length();\n    for (i = numLetters - 1; i >= 0; i--)\n    {\n      wchar_t c = ChangedPart[i];\n      if (c == L'9')\n      {\n        c = L'0';\n        newName = c + newName;\n        if (i == 0)\n          newName = UString(L'1') + newName;\n        continue;\n      }\n      c++;\n      newName = c + newName;\n      i--;\n      for (; i >= 0; i--)\n        newName = ChangedPart[i] + newName;\n      break;\n    }\n    ChangedPart = newName;\n    return UnchangedPart + ChangedPart;\n  }\n};\n\nstatic const UInt32 kBufSize = (1 << 20);\n\nstruct CThreadSplit\n{\n  // HRESULT Result;\n  // CPanel *Panel;\n  CProgressDialog *ProgressDialog;\n  UString FilePath;\n  UString VolBasePath;\n  CRecordVector<UInt64> VolumeSizes;\n  UString Error;\n  \n  void Process2()\n  {\n    // NCOM::CComInitializer comInitializer;\n    ProgressDialog->WaitCreating();\n    NFile::NIO::CInFile inFile;\n    if (!inFile.Open(FilePath))\n      throw L\"Can not open file\";\n    NFile::NIO::COutFile outFile;\n    CMyBuffer bufferObject;\n    if (!bufferObject.Allocate(kBufSize))\n      throw L\"Can not allocate buffer\";\n    Byte *buffer = (Byte *)(void *)bufferObject;\n    UInt64 curVolSize = 0;\n    CVolSeqName seqName;\n    UInt64 length;\n    if (!inFile.GetLength(length))\n      throw \"error\";\n\n    ProgressDialog->ProgressSynch.SetProgress(length, 0);\n    UInt64 pos = 0;\n\n    int volIndex = 0;\n\n    for (;;)\n    {\n      UInt64 volSize;\n      if (volIndex < VolumeSizes.Size())\n        volSize = VolumeSizes[volIndex];\n      else\n        volSize = VolumeSizes.Back();\n\n      UInt32 needSize = (UInt32)(MyMin((UInt64)kBufSize, volSize - curVolSize));\n      UInt32 processedSize;\n      if (!inFile.Read(buffer, needSize, processedSize))\n        throw L\"Can not read input file\";\n      if (processedSize == 0)\n        break;\n      needSize = processedSize;\n      if (curVolSize == 0)\n      {\n        UString name = VolBasePath;\n        name += L\".\";\n        name += seqName.GetNextName();\n        if (!outFile.Create(name, false))\n          throw L\"Can not create output file\";\n        ProgressDialog->ProgressSynch.SetCurrentFileName(name);\n      }\n      if (!outFile.Write(buffer, needSize, processedSize))\n        throw L\"Can not write output file\";\n      if (needSize != processedSize)\n        throw L\"Can not write output file\";\n      curVolSize += processedSize;\n      if (curVolSize == volSize)\n      {\n        outFile.Close();\n        if (volIndex < VolumeSizes.Size())\n          volIndex++;\n        curVolSize = 0;\n      }\n      pos += processedSize;\n      HRESULT res = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(pos);\n      if (res != S_OK)\n        return;\n    }\n  }\n  void Process()\n  {\n    try { Process2(); }\n    catch(const wchar_t *s) { Error = s; }\n    catch(...) { Error = L\"Error\"; }\n    ProgressDialog->MyClose();\n  }\n  \n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    ((CThreadSplit *)param)->Process();\n    return 0;\n  }\n};\n\nvoid CApp::Split()\n{\n  int srcPanelIndex = GetFocusedPanelIndex();\n  CPanel &srcPanel = Panels[srcPanelIndex];\n  if (!srcPanel.IsFSFolder())\n  {\n    srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n  CRecordVector<UInt32> indices;\n  srcPanel.GetOperatedItemIndices(indices);\n  if (indices.IsEmpty())\n    return;\n  if (indices.Size() != 1)\n  {\n    srcPanel.MessageBoxErrorLang(IDS_SELECT_ONE_FILE, 0x03020A02);\n    return;\n  }\n  int index = indices[0];\n  if (srcPanel.IsItemFolder(index))\n  {\n    srcPanel.MessageBoxErrorLang(IDS_SELECT_ONE_FILE, 0x03020A02);\n    return;\n  }\n  const UString itemName = srcPanel.GetItemName(index);\n\n  UString srcPath = srcPanel._currentFolderPrefix + srcPanel.GetItemPrefix(index);\n  UString path = srcPath;\n  int destPanelIndex = (NumPanels <= 1) ? srcPanelIndex : (1 - srcPanelIndex);\n  CPanel &destPanel = Panels[destPanelIndex];\n  if (NumPanels > 1)\n    if (destPanel.IsFSFolder())\n      path = destPanel._currentFolderPrefix;\n  CSplitDialog splitDialog;\n  splitDialog.FilePath = srcPanel.GetItemRelPath(index);\n  splitDialog.Path = path;\n  if (splitDialog.Create(srcPanel.GetParent()) == IDCANCEL)\n    return;\n\n  NFile::NFind::CFileInfoW fileInfo;\n  if (!NFile::NFind::FindFile(srcPath + itemName, fileInfo))\n  {\n    srcPanel.MessageBoxMyError(L\"Can not find file\");\n    return;\n  }\n  if (fileInfo.Size <= splitDialog.VolumeSizes.Front())\n  {\n    srcPanel.MessageBoxErrorLang(IDS_SPLIT_VOL_MUST_BE_SMALLER, 0x03020522);\n    return;\n  }\n  const UInt64 numVolumes = GetNumberOfVolumes(fileInfo.Size, splitDialog.VolumeSizes);\n  if (numVolumes >= 100)\n  {\n    wchar_t s[32];\n    ConvertUInt64ToString(numVolumes, s);\n    if (::MessageBoxW(srcPanel, MyFormatNew(IDS_SPLIT_CONFIRM_MESSAGE, 0x03020521, s),\n        LangString(IDS_SPLIT_CONFIRM_TITLE, 0x03020520),\n        MB_YESNOCANCEL | MB_ICONQUESTION | MB_TASKMODAL) != IDYES)\n      return;\n  }\n\n  path = splitDialog.Path;\n  NFile::NName::NormalizeDirPathPrefix(path);\n  if (!NFile::NDirectory::CreateComplexDirectory(path))\n  {\n    srcPanel.MessageBoxMyError(MyFormatNew(IDS_CANNOT_CREATE_FOLDER, 0x02000603, path));\n    return;\n  }\n\n  CThreadSplit spliter;\n  // spliter.Panel = this;\n\n  {\n  CProgressDialog progressDialog;\n  spliter.ProgressDialog = &progressDialog;\n\n  UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);\n  UString title = LangString(IDS_SPLITTING, 0x03020510);\n\n  progressDialog.MainWindow = _window;\n  progressDialog.MainTitle = progressWindowTitle;\n  progressDialog.MainAddTitle = title + UString(L\" \");\n  progressDialog.ProgressSynch.SetTitleFileName(itemName);\n\n\n  spliter.FilePath = srcPath + itemName;\n  spliter.VolBasePath = path  + itemName;\n  spliter.VolumeSizes = splitDialog.VolumeSizes;\n  \n  // if (splitDialog.VolumeSizes.Size() == 0) return;\n\n  // CPanel::CDisableTimerProcessing disableTimerProcessing1(srcPanel);\n  // CPanel::CDisableTimerProcessing disableTimerProcessing2(destPanel);\n\n  NWindows::CThread thread;\n  if (thread.Create(CThreadSplit::MyThreadFunction, &spliter) != S_OK)\n    throw 271824;\n  progressDialog.Create(title, _window);\n  }\n  RefreshTitleAlways();\n\n\n  if (!spliter.Error.IsEmpty())\n    srcPanel.MessageBoxMyError(spliter.Error);\n  // disableTimerProcessing1.Restore();\n  // disableTimerProcessing2.Restore();\n  // srcPanel.SetFocusToList();\n  // srcPanel.RefreshListCtrlSaveFocused();\n}\n\n\nstruct CThreadCombine\n{\n  CProgressDialog *ProgressDialog;\n\n  UString InputDirPrefix;\n  UStringVector Names;\n  UString OutputPath;\n  UInt64 TotalSize;\n\n  UString Error;\n  HRESULT Res;\n  \n  void Process2()\n  {\n    NFile::NIO::COutFile outFile;\n    if (!outFile.Create(OutputPath, false))\n    {\n      Error = L\"Can create open output file:\\n\" + OutputPath;\n      return;\n    }\n\n    ProgressDialog->ProgressSynch.SetProgress(TotalSize, 0);\n\n    CMyBuffer bufferObject;\n    if (!bufferObject.Allocate(kBufSize))\n      throw L\"Can not allocate buffer\";\n    Byte *buffer = (Byte *)(void *)bufferObject;\n    UInt64 pos = 0;\n    for (int i = 0; i < Names.Size(); i++)\n    {\n      NFile::NIO::CInFile inFile;\n      const UString nextName = InputDirPrefix + Names[i];\n      if (!inFile.Open(nextName))\n      {\n        Error = L\"Can not open input file:\\n\" + nextName;\n        return;\n      }\n      ProgressDialog->ProgressSynch.SetCurrentFileName(nextName);\n      for (;;)\n      {\n        UInt32 processedSize;\n        if (!inFile.Read(buffer, kBufSize, processedSize))\n          throw L\"Can not read input file\";\n        if (processedSize == 0)\n          break;\n        UInt32 needSize = processedSize;\n        if (!outFile.Write(buffer, needSize, processedSize) || needSize != processedSize)\n          throw L\"Can not write output file\";\n        pos += processedSize;\n        Res = ProgressDialog->ProgressSynch.SetPosAndCheckPaused(pos);\n        if (Res != S_OK)\n          return;\n      }\n    }\n  }\n\n  void Process()\n  {\n    Res = S_OK;\n    ProgressDialog->WaitCreating();\n    try { Process2(); }\n    catch(const wchar_t *s) { Error = s; }\n    catch(...) { Error = L\"Error\";}\n    ProgressDialog->MyClose();\n  }\n  \n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    ((CThreadCombine *)param)->Process();\n    return 0;\n  }\n};\n\nextern void AddValuePair2(UINT resourceID, UInt32 langID, UInt64 num, UInt64 size, UString &s);\n\nstatic void AddInfoFileName(const UString &name, UString &dest)\n{\n  dest += L\"\\n  \";\n  dest += name;\n}\n\nvoid CApp::Combine()\n{\n  int srcPanelIndex = GetFocusedPanelIndex();\n  CPanel &srcPanel = Panels[srcPanelIndex];\n  if (!srcPanel.IsFSFolder())\n  {\n    srcPanel.MessageBoxErrorLang(IDS_OPERATION_IS_NOT_SUPPORTED, 0x03020208);\n    return;\n  }\n  CRecordVector<UInt32> indices;\n  srcPanel.GetOperatedItemIndices(indices);\n  if (indices.IsEmpty())\n    return;\n  int index = indices[0];\n  if (indices.Size() != 1 || srcPanel.IsItemFolder(index))\n  {\n    srcPanel.MessageBoxErrorLang(IDS_COMBINE_SELECT_ONE_FILE, 0x03020620);\n    return;\n  }\n  const UString itemName = srcPanel.GetItemName(index);\n\n  UString srcPath = srcPanel._currentFolderPrefix + srcPanel.GetItemPrefix(index);\n  UString path = srcPath;\n  int destPanelIndex = (NumPanels <= 1) ? srcPanelIndex : (1 - srcPanelIndex);\n  CPanel &destPanel = Panels[destPanelIndex];\n  if (NumPanels > 1)\n    if (destPanel.IsFSFolder())\n      path = destPanel._currentFolderPrefix;\n\n  CVolSeqName volSeqName;\n  if (!volSeqName.ParseName(itemName))\n  {\n    srcPanel.MessageBoxErrorLang(IDS_COMBINE_CANT_DETECT_SPLIT_FILE, 0x03020621);\n    return;\n  }\n  \n  CThreadCombine combiner;\n  \n  UString nextName = itemName;\n  combiner.TotalSize = 0;\n  for (;;)\n  {\n    NFile::NFind::CFileInfoW fileInfo;\n    if (!NFile::NFind::FindFile(srcPath + nextName, fileInfo) || fileInfo.IsDir())\n      break;\n    combiner.Names.Add(nextName);\n    combiner.TotalSize += fileInfo.Size;\n    nextName = volSeqName.GetNextName();\n  }\n  if (combiner.Names.Size() == 1)\n  {\n    srcPanel.MessageBoxErrorLang(IDS_COMBINE_CANT_FIND_MORE_THAN_ONE_PART, 0x03020622);\n    return;\n  }\n  \n  if (combiner.TotalSize == 0)\n  {\n    srcPanel.MessageBoxMyError(L\"No data\");\n    return;\n  }\n  \n  UString info;\n  AddValuePair2(IDS_FILES_COLON, 0x02000320, combiner.Names.Size(), combiner.TotalSize, info);\n  \n  info += L\"\\n\";\n  info += srcPath;\n  \n  int i;\n  for (i = 0; i < combiner.Names.Size() && i < 2; i++)\n    AddInfoFileName(combiner.Names[i], info);\n  if (i != combiner.Names.Size())\n  {\n    if (i + 1 != combiner.Names.Size())\n      AddInfoFileName(L\"...\", info);\n    AddInfoFileName(combiner.Names.Back(), info);\n  }\n  \n  {\n    CCopyDialog copyDialog;\n    copyDialog.Value = path;\n    copyDialog.Title = LangString(IDS_COMBINE, 0x03020600);\n    copyDialog.Title += ' ';\n    copyDialog.Title += srcPanel.GetItemRelPath(index);\n    copyDialog.Static = LangString(IDS_COMBINE_TO, 0x03020601);\n    copyDialog.Info = info;\n    if (copyDialog.Create(srcPanel.GetParent()) == IDCANCEL)\n      return;\n    path = copyDialog.Value;\n  }\n\n  NFile::NName::NormalizeDirPathPrefix(path);\n  if (!NFile::NDirectory::CreateComplexDirectory(path))\n  {\n    srcPanel.MessageBoxMyError(MyFormatNew(IDS_CANNOT_CREATE_FOLDER, 0x02000603, path));\n    return;\n  }\n  \n  UString outName = volSeqName.UnchangedPart;\n  while (!outName.IsEmpty())\n  {\n    int lastIndex = outName.Length() - 1;\n    if (outName[lastIndex] != L'.')\n      break;\n    outName.Delete(lastIndex);\n  }\n  if (outName.IsEmpty())\n    outName = L\"file\";\n  \n  NFile::NFind::CFileInfoW fileInfo;\n  UString destFilePath = path + outName;\n  combiner.OutputPath = destFilePath;\n  if (NFile::NFind::FindFile(destFilePath, fileInfo))\n  {\n    srcPanel.MessageBoxMyError(MyFormatNew(IDS_FILE_EXIST, 0x03020A04, destFilePath));\n    return;\n  }\n  \n  {\n    CProgressDialog progressDialog;\n    combiner.ProgressDialog = &progressDialog;\n    \n    UString progressWindowTitle = LangString(IDS_APP_TITLE, 0x03000000);\n    UString title = LangString(IDS_COMBINING, 0x03020610);\n    \n    progressDialog.MainWindow = _window;\n    progressDialog.MainTitle = progressWindowTitle;\n    progressDialog.MainAddTitle = title + UString(L\" \");\n    \n    combiner.InputDirPrefix = srcPath;\n    \n    // CPanel::CDisableTimerProcessing disableTimerProcessing1(srcPanel);\n    // CPanel::CDisableTimerProcessing disableTimerProcessing2(destPanel);\n    \n    NWindows::CThread thread;\n    if (thread.Create(CThreadCombine::MyThreadFunction, &combiner) != S_OK)\n      throw 271824;\n    progressDialog.Create(title, _window);\n  }\n  RefreshTitleAlways();\n\n  if (!combiner.Error.IsEmpty())\n    srcPanel.MessageBoxMyError(combiner.Error);\n  // disableTimerProcessing1.Restore();\n  // disableTimerProcessing2.Restore();\n  // srcPanel.SetFocusToList();\n  // srcPanel.RefreshListCtrlSaveFocused();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PasswordDialog.cpp",
    "content": "// PasswordDialog.cpp\n\n#include \"StdAfx.h\"\n#include \"PasswordDialog.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDC_STATIC_PASSWORD_HEADER, 0x02000B01 },\n  { IDC_CHECK_PASSWORD_SHOW, 0x02000B02 },\n    \n};\n#endif\n\n\nbool CPasswordDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetWindowText(HWND(*this), 0x02000B00);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  _passwordControl.Attach(GetItem(IDC_EDIT_PASSWORD));\n  _passwordControl.SetText(Password);\n  _passwordControl.SetPasswordChar(TEXT('*'));\n  return CModalDialog::OnInit();\n}\n\nbool CPasswordDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  if (buttonID == IDC_CHECK_PASSWORD_SHOW)\n  {\n    _passwordControl.SetPasswordChar((IsButtonChecked(\n        IDC_CHECK_PASSWORD_SHOW) == BST_CHECKED) ? 0: TEXT('*'));\n    UString password;\n    _passwordControl.GetText(password);\n    _passwordControl.SetText(password);\n    return true;\n  }\n  return CDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n\nvoid CPasswordDialog::OnOK()\n{\n  _passwordControl.GetText(Password);\n  CModalDialog::OnOK();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PasswordDialog.h",
    "content": "// PasswordDialog.h\n\n#ifndef __PASSWORDDIALOG_H\n#define __PASSWORDDIALOG_H\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/Edit.h\"\n#include \"PasswordDialogRes.h\"\n\nclass CPasswordDialog: public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CEdit _passwordControl;\n  virtual void OnOK();\n  virtual bool OnInit();\n  virtual bool OnButtonClicked(int buttonID, HWND buttonHWND);\npublic:\n  UString Password;\n  INT_PTR Create(HWND parentWindow = 0) { return CModalDialog::Create(IDD_DIALOG_PASSWORD, parentWindow); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PasswordDialogRes.h",
    "content": "#define IDD_DIALOG_PASSWORD             501\n#define IDC_STATIC_PASSWORD_HEADER      1000\n#define IDC_EDIT_PASSWORD               1001\n#define IDC_CHECK_PASSWORD_SHOW         1002\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PasswordDialog_rc.cpp",
    "content": "// PasswordDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"Windows/Control/DialogImpl.h\"\n\n#include \"PasswordDialogRes.h\"\n\nclass CPasswordDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CPasswordDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent,int id) : CModalDialogImpl(dialog, parent, id, wxT(\"Enter password\"))\n  {\n\tbool bShowPassword = false;\n\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\t{\n\twxStaticBoxSizer *passwdSizer = new wxStaticBoxSizer(new wxStaticBox(this,IDC_STATIC_PASSWORD_HEADER,_T(\"&Enter password:\")),wxVERTICAL);\n\n\twxTextCtrl *TxtPasswd = new wxTextCtrl(this, IDC_EDIT_PASSWORD, L\"\", \n\t\twxDefaultPosition, wxSize(260,-1), bShowPassword?wxTE_LEFT:wxTE_PASSWORD );\n\n\twxCheckBox *ChkShowPasswd = new wxCheckBox(this, IDC_CHECK_PASSWORD_SHOW, wxT(\"&Show password\"));\n\n\tChkShowPasswd->SetValue(bShowPassword);\n\tpasswdSizer->Add(TxtPasswd, 0, wxALL, 5);\n\tpasswdSizer->Add(ChkShowPasswd, 0, wxALL, 5);\n\n\ttopsizer->Add(passwdSizer, 0, wxALL, 5);\n\t}\n\ttopsizer->Add(CreateButtonSizer(wxOK|wxCANCEL), 0, wxALL|wxEXPAND, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nREGISTER_DIALOG(IDD_DIALOG_PASSWORD,CPasswordDialog,0)\n\nBEGIN_EVENT_TABLE(CPasswordDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY,   CModalDialogImpl::OnAnyButton)\n\tEVT_CHECKBOX(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PhysDriveFolder.h.out",
    "content": "// PhysDriveFolder.h\n\n#ifndef __PHYSDRIVEFOLDER_H\n#define __PHYSDRIVEFOLDER_H\n\n#include \"Common/MyString.h\"\n#include \"Common/MyCom.h\"\n\n#include \"IFolder.h\"\n\nclass CPhysDriveFolder:\n  public IFolderFolder,\n  public IFolderWasChanged,\n  public IFolderOperations,\n  public IFolderGetItemFullSize,\n  public IFolderClone,\n  // public IFolderGetSystemIconIndex,\n  public CMyUnknownImp\n{\n  UInt64 GetSizeOfItem(int anIndex) const;\npublic:\n  MY_QUERYINTERFACE_BEGIN\n    MY_QUERYINTERFACE_ENTRY(IFolderWasChanged)\n    MY_QUERYINTERFACE_ENTRY(IFolderOperations)\n    MY_QUERYINTERFACE_ENTRY(IFolderGetItemFullSize)\n    MY_QUERYINTERFACE_ENTRY(IFolderClone)\n    // MY_QUERYINTERFACE_ENTRY(IFolderGetSystemIconIndex)\n  MY_QUERYINTERFACE_END\n  MY_ADDREF_RELEASE\n\n\n  INTERFACE_FolderFolder(;)\n  INTERFACE_FolderOperations(;)\n\n  STDMETHOD(WasChanged)(INT32 *wasChanged);\n  STDMETHOD(Clone)(IFolderFolder **resultFolder);\n  STDMETHOD(GetItemFullSize)(UInt32 index, PROPVARIANT *value, IProgress *progress);\n\n  // STDMETHOD(GetSystemIconIndex)(UInt32 index, INT32 *iconIndex);\n\nprivate:\n  UString _name;\n  UString _prefix;\n  UString _path;\n  UString GetFullPath() const { return _prefix + _path; }\n  UString GetFullPathWithName() const { return GetFullPath() + WCHAR_PATH_SEPARATOR + _name; }\n  CMyComPtr<IFolderFolder> _parentFolder;\n\n  UINT _driveType;\n  // FIXME DISK_GEOMETRY geom;\n  UInt64 _length;\n\npublic:\n  HRESULT Init(const UString &path);\n  HRESULT GetLength(UInt64 &size) const;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PluginInterface.h",
    "content": "// PluginInterface.h\n\n#ifndef __PLUGININTERFACE_H\n#define __PLUGININTERFACE_H\n\n#include \"Common/MyString.h\"\n\n// {23170F69-40C1-278D-0000-000100010000}\nDEFINE_GUID(IID_IInitContextMenu,\n0x23170F69, 0x40C1, 0x278D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00);\nMIDL_INTERFACE(\"23170F69-40C1-278D-0000-000100010000\")\nIInitContextMenu: public IUnknown\n{\npublic:\n  STDMETHOD(InitContextMenu)(const wchar_t *aFolder, const wchar_t **aNames, UINT32 aNumFiles) PURE;\n\n};\n\n// {23170F69-40C1-278D-0000-000100020100}\nDEFINE_GUID(IID_IPluginOptionsCallback,\n0x23170F69, 0x40C1, 0x278D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00);\nMIDL_INTERFACE(\"23170F69-40C1-278D-0000-000100020000\")\nIPluginOptionsCallback: public IUnknown\n{\npublic:\n  STDMETHOD(GetProgramFolderPath)(BSTR *value) PURE;\n  STDMETHOD(GetProgramPath)(BSTR *value) PURE;\n  STDMETHOD(GetRegistryCUPath)(BSTR *value) PURE;\n};\n\n// {23170F69-40C1-278D-0000-000100020000}\nDEFINE_GUID(IID_IPluginOptions,\n0x23170F69, 0x40C1, 0x278D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00);\nMIDL_INTERFACE(\"23170F69-40C1-278D-0000-000100020000\")\nIPluginOptions: public IUnknown\n{\npublic:\n  STDMETHOD(PluginOptions)(HWND hWnd, IPluginOptionsCallback *callback) PURE;\n  // STDMETHOD(GetFileExtensions)(BSTR *extensions) PURE;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PluginLoader.h",
    "content": "// PluginLoader.h\n\n#ifndef __PLUGINLOADER_H\n#define __PLUGINLOADER_H\n\n#include \"Windows/DLL.h\"\n\ntypedef UINT32 (WINAPI * CreateObjectPointer)(\n    const GUID *clsID,\n    const GUID *interfaceID,\n    void **outObject);\n\nclass CPluginLibrary: public NWindows::NDLL::CLibrary\n{\npublic:\n  HRESULT CreateManager(REFGUID clsID, IFolderManager **manager)\n  {\n    CreateObjectPointer createObject = (CreateObjectPointer)\n        GetProcAddress(\"CreateObject\");\n    if (createObject == NULL)\n      return GetLastError();\n    return createObject(&clsID, &IID_IFolderManager, (void **)manager);\n  }\n  HRESULT LoadAndCreateManager(LPCWSTR filePath, REFGUID clsID, IFolderManager **manager)\n  {\n    if (!Load(filePath))\n      return GetLastError();\n    return CreateManager(clsID, manager);\n  }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ProgramLocation.cpp",
    "content": "// ProgramLocation.h\n\n#include \"StdAfx.h\"\n\n#include \"ProgramLocation.h\"\n\n// #include \"Windows/FileName.h\"\n#include \"Common/StringConvert.h\"\n\n\nbool GetProgramFolderPath(UString &folder)\n{\n  const char *p7zip_home_dir = getenv(\"P7ZIP_HOME_DIR\");\n  if (p7zip_home_dir == 0) p7zip_home_dir=\"./\";\n\n  folder = MultiByteToUnicodeString(p7zip_home_dir);\n\n  return true;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ProgramLocation.h",
    "content": "// ProgramLocation.h\n\n#ifndef __PROGRAMLOCATION_H\n#define __PROGRAMLOCATION_H\n\n#include \"Common/MyString.h\"\n\nbool GetProgramFolderPath(UString &folder); // normalized\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ProgressDialog2.cpp",
    "content": "// ProgressDialog2.cpp\n\n#include \"StdAfx.h\"\n#include \"resource.h\"\n#include \"ProgressDialog2.h\"\n#include \"Common/IntToString.h\"\n\nusing namespace NWindows;\n\nstatic const UINT_PTR kTimerID = 3;\nstatic const UINT kTimerElapse = 100;\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDCANCEL, 0x02000C00 },\n  { IDC_PROGRESS_ELAPSED, 0x02000C01 },\n  { IDC_PROGRESS_REMAINING, 0x02000C02 },\n  { IDC_PROGRESS_TOTAL, 0x02000C03 },\n  { IDC_PROGRESS_SPEED, 0x02000C04 },\n  { IDC_PROGRESS_UNPACKED, 0x02000C05 },\n  { IDC_PROGRESS_PACKED, 0x02000323 },\n  { IDC_PROGRESS_RATIO, 0x02000C06 },\n  { IDC_PROGRESS_SPEED, 0x02000C04 },\n  { IDC_PROGRESS_FILES, 0x02000320 },\n  { IDC_BUTTON_PROGRESS_PRIORITY, 0x02000C10 },\n  { IDC_BUTTON_PAUSE, 0x02000C12 },\n  { IDCANCEL, 0x02000711 },\n};\n#endif\n\nHRESULT CProgressSynch::ProcessStopAndPause()\n{\n  for (;;)\n  {\n    if (GetStopped())\n      return E_ABORT;\n    if (!GetPaused())\n      break;\n    ::Sleep(100);\n  }\n  return S_OK;\n}\n\nHRESULT CProgressSynch::SetPosAndCheckPaused(UInt64 completed)\n{\n  RINOK(ProcessStopAndPause());\n  SetPos(completed);\n  return S_OK;\n}\n\n#ifndef _SFX\nCProgressDialog::~CProgressDialog()\n{\n  AddToTitle(L\"\");\n}\nvoid CProgressDialog::AddToTitle(LPCWSTR s)\n{\n  if (MainWindow != 0)\n  {\n    CWindow window(MainWindow);\n    window.SetText(s + UString(MainTitle));\n  }\n}\n\nstatic const int kTitleFileNameSizeLimit = 36;\nstatic const int kCurrentFileNameSizeLimit = 70;\n\nstatic void ReduceString(UString &s, int size)\n{\n  if (s.Length() > size)\n    s = s.Left(size / 2) + UString(L\" ... \") + s.Right(size / 2);\n}\n#endif\n\nbool CProgressDialog::OnInit()\n{\n  _range = (UInt64)(Int64)(-1);\n  _prevPercentValue = UInt32(-1);\n  _prevElapsedSec = UInt32(-1);\n  _prevRemainingSec = UInt32(-1);\n  _prevSpeed = UInt32(-1);\n  _prevMode = kSpeedBytes;\n  _prevTime = ::GetTickCount();\n  _elapsedTime = 0;\n  _foreground = true;\n\n  #ifdef LANG\n  // LangSetWindowText(HWND(*this), 0x02000C00);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n\n\n  CWindow window(GetItem(IDC_BUTTON_PROGRESS_PRIORITY));\n  window.GetText(backgroundString);\n  backgroundedString = backgroundString;\n  backgroundedString.Replace(L\"&\", L\"\");\n\n  window = GetItem(IDC_BUTTON_PAUSE);\n  window.GetText(pauseString);\n\n  foregroundString = LangString(IDS_PROGRESS_FOREGROUND, 0x02000C11);\n  continueString = LangString(IDS_PROGRESS_CONTINUE, 0x02000C13);\n  pausedString = LangString(IDS_PROGRESS_PAUSED, 0x02000C20);\n\n  m_ProgressBar.Attach(GetItem(IDC_PROGRESS1));\n  _timer = SetTimer(kTimerID, kTimerElapse);\n  _dialogCreatedEvent.Set();\n  SetText(_title);\n  SetPauseText();\n  SetPriorityText();\n  return CModalDialog::OnInit();\n}\n\nvoid CProgressDialog::OnCancel()\n{\n  ProgressSynch.SetStopped(true);\n}\n\nstatic void ConvertSizeToString(UInt64 value, wchar_t *s)\n{\n  const wchar_t *kModif = L\" KM\";\n  for (int i = 0; ; i++)\n    if (i == 2 || value < (UInt64(10000) << (i * 10)))\n    {\n      ConvertUInt64ToString(value >> (i * 10), s);\n      s += wcslen(s);\n      *s++ = ' ';\n      if (i != 0)\n        *s++ = kModif[i];\n      *s++ = L'B';\n      *s++ = L'\\0';\n      return;\n    }\n}\n\nvoid CProgressDialog::SetRange(UInt64 range)\n{\n  _range = range;\n  _previousPos = (UInt64)(Int64)-1;\n  _converter.Init(range);\n  m_ProgressBar.SetRange32(0 , _converter.Count(range)); // Test it for 100%\n\n  wchar_t s[32];\n  ConvertSizeToString(_range, s);\n  SetItemText(IDC_PROGRESS_TOTAL_VALUE, s);\n}\n\nvoid CProgressDialog::SetPos(UInt64 pos)\n{\n  bool redraw = true;\n  if (pos < _range && pos > _previousPos)\n  {\n    if (pos - _previousPos < (_range >> 10))\n      redraw = false;\n  }\n  if(redraw)\n  {\n    m_ProgressBar.SetPos(_converter.Count(pos));  // Test it for 100%\n    _previousPos = pos;\n  }\n}\n\nstatic void GetTimeString(UInt64 timeValue, TCHAR *s)\n{\n  wsprintf(s, TEXT(\"%02d:%02d:%02d\"),\n      UInt32(timeValue / 3600),\n      UInt32((timeValue / 60) % 60),\n      UInt32(timeValue % 60));\n}\n\nvoid CProgressDialog::ShowSize(int id, UInt64 value)\n{\n  wchar_t s[40];\n  s[0] = 0;\n  if (value != (UInt64)(Int64)-1)\n    ConvertSizeToString(value, s);\n  SetItemText(id, s);\n}\n\nbool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */)\n{\n  if (ProgressSynch.GetPaused())\n    return true;\n  UInt64 total, completed, totalFiles, completedFiles, inSize, outSize;\n  ProgressSynch.GetProgress(total, completed, totalFiles, completedFiles, inSize, outSize);\n\n  UInt32 curTime = ::GetTickCount();\n\n  if (total != _range)\n    SetRange(total);\n  if (total == (UInt64)(Int64)-1)\n  {\n    SetPos(0);\n    SetRange(completed);\n  }\n  else\n    SetPos(completed);\n\n  _elapsedTime += (curTime - _prevTime);\n  _prevTime = curTime;\n\n  if (_elapsedTime == 0) return true; // FIXME\n\n  UInt32 elapsedSec = _elapsedTime / 1000;\n\n  bool elapsedChanged = false;\n  if (elapsedSec != _prevElapsedSec)\n  {\n    TCHAR s[40];\n    GetTimeString(elapsedSec, s);\n    SetItemText(IDC_PROGRESS_ELAPSED_VALUE, s);\n    _prevElapsedSec = elapsedSec;\n    elapsedChanged = true;\n  }\n\n  if (elapsedChanged)\n  {\n    if (completed != 0)\n    {\n\n    if (total == (UInt64)(Int64)-1)\n    {\n      SetItemText(IDC_PROGRESS_REMAINING_VALUE, L\"\");\n    }\n    else\n    {\n      UInt64 remainingTime = 0;\n      if (completed < total)\n        remainingTime = _elapsedTime * (total - completed)  / completed;\n      UInt64 remainingSec = remainingTime / 1000;\n      if (remainingSec != _prevRemainingSec)\n      {\n        TCHAR s[40];\n        GetTimeString(remainingSec, s);\n        SetItemText(IDC_PROGRESS_REMAINING_VALUE, s);\n        _prevRemainingSec = remainingSec;\n      }\n    }\n    // if (elapsedChanged)\n    {\n      UInt32 elapsedTime = (_elapsedTime == 0) ? 1 : _elapsedTime;\n      UInt64 speedB = (completed * 1000) / elapsedTime;\n      UInt64 speedKB = speedB / 1024;\n      UInt64 speedMB = speedKB / 1024;\n      const UInt32 kLimit1 = 10;\n      TCHAR s[40];\n      bool needRedraw = false;\n      if (speedMB >= kLimit1)\n      {\n        if (_prevMode != kSpeedMBytes || speedMB != _prevSpeed)\n        {\n          ConvertUInt64ToString(speedMB, s);\n          lstrcat(s, TEXT(\" MB/s\"));\n          _prevMode = kSpeedMBytes;\n          _prevSpeed = speedMB;\n          needRedraw = true;\n        }\n      }\n      else if (speedKB >= kLimit1)\n      {\n        if (_prevMode != kSpeedKBytes || speedKB != _prevSpeed)\n        {\n          ConvertUInt64ToString(speedKB, s);\n          lstrcat(s, TEXT(\" KB/s\"));\n          _prevMode = kSpeedKBytes;\n          _prevSpeed = speedKB;\n          needRedraw = true;\n        }\n      }\n      else\n      {\n        if (_prevMode != kSpeedBytes || speedB != _prevSpeed)\n        {\n          ConvertUInt64ToString(speedB, s);\n          lstrcat(s, TEXT(\" B/s\"));\n          _prevMode = kSpeedBytes;\n          _prevSpeed = speedB;\n          needRedraw = true;\n        }\n      }\n      if (needRedraw)\n        SetItemText(IDC_PROGRESS_SPEED_VALUE, s);\n    }\n    }\n\n    if (total == 0)\n      total = 1;\n    UInt32 percentValue = (UInt32)(completed * 100 / total);\n    UString titleName;\n    ProgressSynch.GetTitleFileName(titleName);\n    if (percentValue != _prevPercentValue || _prevTitleName != titleName)\n    {\n      _prevPercentValue = percentValue;\n      SetTitleText();\n      _prevTitleName = titleName;\n    }\n    \n    TCHAR s[64];\n    ConvertUInt64ToString(completedFiles, s);\n    if (totalFiles != (UInt64)(Int64)-1)\n    {\n      lstrcat(s, TEXT(\" / \"));\n      ConvertUInt64ToString(totalFiles, s + lstrlen(s));\n    }\n    \n    SetItemText(IDC_PROGRESS_FILES_VALUE, s);\n    \n    const UInt64 packSize   = CompressingMode ? outSize : inSize;\n    const UInt64 unpackSize = CompressingMode ? inSize : outSize;\n\n    if (unpackSize == (UInt64)(Int64)-1 && packSize == (UInt64)(Int64)-1)\n    {\n      ShowSize(IDC_PROGRESS_UNPACKED_VALUE, completed);\n      SetItemText(IDC_PROGRESS_PACKED_VALUE, L\"\");\n    }\n    else\n    {\n      ShowSize(IDC_PROGRESS_UNPACKED_VALUE, unpackSize);\n      ShowSize(IDC_PROGRESS_PACKED_VALUE, packSize);\n      \n      if (packSize != (UInt64)(Int64)-1 && unpackSize != (UInt64)(Int64)-1 && unpackSize != 0)\n      {\n        UInt64 ratio = packSize * 100 / unpackSize;\n        ConvertUInt64ToString(ratio, s);\n        lstrcat(s, TEXT(\"%\"));\n        SetItemText(IDC_PROGRESS_RATIO_VALUE, s);\n      }\n    }\n  }\n\n\n  UString fileName;\n  ProgressSynch.GetCurrentFileName(fileName);\n  if (_prevFileName != fileName)\n  {\n    int slashPos = fileName.ReverseFind(WCHAR_PATH_SEPARATOR);\n    UString s1, s2;\n    if (slashPos >= 0)\n    {\n      s1 = fileName.Left(slashPos + 1);\n      s2 = fileName.Mid(slashPos + 1);\n    }\n    else\n      s2 = fileName;\n    ReduceString(s1, kCurrentFileNameSizeLimit);\n    ReduceString(s2, kCurrentFileNameSizeLimit);\n    UString s = s1 + L\"\\n\" + s2;\n    SetItemText(IDC_PROGRESS_FILE_NAME, s);\n    _prevFileName == fileName;\n  }\n\n  return true;\n}\n\n\n////////////////////\n// CU64ToI32Converter\n\nstatic const UInt64 kMaxIntValue = 0x7FFFFFFF;\n\nvoid CU64ToI32Converter::Init(UInt64 range)\n{\n  _numShiftBits = 0;\n  while(range > kMaxIntValue)\n  {\n    range >>= 1;\n    _numShiftBits++;\n  }\n}\n\nint CU64ToI32Converter::Count(UInt64 aValue)\n{\n  return int(aValue >> _numShiftBits);\n}\n\nconst UINT CProgressDialog::kCloseMessage = WM_USER + 1;\n\nbool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)\n{\n  switch(message)\n  {\n    case kCloseMessage:\n    {\n      KillTimer(_timer);\n      _timer = 0;\n      End(0);\n      return true;\n    }\n    case WM_SETTEXT:\n    {\n      if (_timer == 0)\n        return true;\n    }\n  }\n  return CModalDialog::OnMessage(message, wParam, lParam);\n}\n\nvoid CProgressDialog::SetTitleText()\n{\n  UString title;\n  if (ProgressSynch.GetPaused())\n  {\n    title = pausedString;\n    title += L\" \";\n  }\n  if (_prevPercentValue != UInt32(-1))\n  {\n    wchar_t s[64];\n    ConvertUInt64ToString(_prevPercentValue, s);\n    title += s;\n    title += L\"%\";\n  }\n  if (!_foreground)\n  {\n    title += L\" \";\n    title += backgroundedString;\n  }\n  title += L\" \";\n  UString totalTitle = title + _title;\n  UString fileName;\n  ProgressSynch.GetTitleFileName(fileName);\n  if (!fileName.IsEmpty())\n  {\n    ReduceString(fileName, kTitleFileNameSizeLimit);\n    totalTitle += L\" \";\n    totalTitle += fileName;\n  }\n  SetText(totalTitle);\n  #ifndef _SFX\n  AddToTitle(title + MainAddTitle);\n  #endif\n}\n\nvoid CProgressDialog::SetPauseText()\n{\n  SetItemText(IDC_BUTTON_PAUSE, ProgressSynch.GetPaused() ?\n    continueString : pauseString);\n  SetTitleText();\n}\n\nvoid CProgressDialog::OnPauseButton()\n{\n  bool paused = !ProgressSynch.GetPaused();\n  ProgressSynch.SetPaused(paused);\n  UInt32 curTime = ::GetTickCount();\n  if (paused)\n    _elapsedTime += (curTime - _prevTime);\n  _prevTime = curTime;\n  SetPauseText();\n}\n\nvoid CProgressDialog::SetPriorityText()\n{\n  SetItemText(IDC_BUTTON_PROGRESS_PRIORITY, _foreground ?\n      backgroundString :\n      foregroundString);\n  SetTitleText();\n}\n\nvoid CProgressDialog::OnPriorityButton()\n{\n  _foreground = !_foreground;\n  SetPriorityClass(GetCurrentProcess(), _foreground ?\n    NORMAL_PRIORITY_CLASS: IDLE_PRIORITY_CLASS);\n  SetPriorityText();\n}\n\nbool CProgressDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  switch(buttonID)\n  {\n    case IDCANCEL:\n    {\n      bool paused = ProgressSynch.GetPaused();;\n      // ProgressSynch.SetPaused(true);\n      if (!paused)\n        OnPauseButton();\n      int res = ::MessageBoxW(HWND(*this),\n          LangString(IDS_PROGRESS_ASK_CANCEL, 0x02000C30),\n          _title, MB_YESNOCANCEL);\n      // ProgressSynch.SetPaused(paused);\n      if (!paused)\n        OnPauseButton();\n      if (res == IDCANCEL || res == IDNO)\n        return true;\n      break;\n    }\n    case IDC_BUTTON_PAUSE:\n      OnPauseButton();\n      return true;\n    case IDC_BUTTON_PROGRESS_PRIORITY:\n    {\n      OnPriorityButton();\n      return true;\n    }\n  }\n  return CModalDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ProgressDialog2.h",
    "content": "// ProgressDialog2.h\n\n#ifndef __PROGRESSDIALOG2_H\n#define __PROGRESSDIALOG2_H\n\n#include \"ProgressDialog2Res.h\"\n\n#include \"Common/Types.h\"\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/ProgressBar.h\"\n#include \"Windows/Synchronization.h\"\n\nclass CProgressSynch\n{\n  NWindows::NSynchronization::CCriticalSection _criticalSection;\n  bool _stopped;\n  bool _paused;\n  UInt64 _total;\n  UInt64 _completed;\n  UInt64 _inSize;\n  UInt64 _outSize;\n  UInt64 _totalFiles;\n  UInt64 _completedFiles;\n  UString TitleFileName;\n  UString CurrentFileName;\npublic:\n  CProgressSynch():\n      _stopped(false), _paused(false),\n      _total((UInt64)(Int64)-1),\n      _completed(0),\n      _totalFiles((UInt64)(Int64)-1),\n      _completedFiles(0),\n      _inSize((UInt64)(Int64)-1),\n      _outSize((UInt64)(Int64)-1)\n      {}\n\n  bool GetStopped()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    return _stopped;\n  }\n  void SetStopped(bool value)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    _stopped = value;\n  }\n  bool GetPaused()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    return _paused;\n  }\n  void SetPaused(bool value)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    _paused = value;\n  }\n  void SetProgress(UInt64 total, UInt64 completed)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    _total = total;\n    _completed = completed;\n  }\n  void SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    if (inSize)\n      _inSize = *inSize;\n    if (outSize)\n      _outSize = *outSize;\n  }\n  void SetPos(UInt64 completed)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    _completed = completed;\n  }\n  void SetNumFilesTotal(UInt64 value)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    _totalFiles = value;\n  }\n  void SetNumFilesCur(UInt64 value)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    _completedFiles = value;\n  }\n  HRESULT ProcessStopAndPause();\n  HRESULT SetPosAndCheckPaused(UInt64 completed);\n  void GetProgress(UInt64 &total, UInt64 &completed,\n    UInt64 &totalFiles, UInt64 &completedFiles,\n    UInt64 &inSize, UInt64 &outSize)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    total = _total;\n    completed = _completed;\n    totalFiles = _totalFiles;\n    completedFiles = _completedFiles;\n    inSize = _inSize;\n    outSize = _outSize;\n  }\n  void SetTitleFileName(const UString &fileName)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    TitleFileName = fileName;\n  }\n  void GetTitleFileName(UString &fileName)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    fileName = TitleFileName;\n  }\n  void SetCurrentFileName(const UString &fileName)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    CurrentFileName = fileName;\n  }\n  void GetCurrentFileName(UString &fileName)\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);\n    fileName = CurrentFileName;\n  }\n};\n\nclass CU64ToI32Converter\n{\n  UInt64 _numShiftBits;\npublic:\n  void Init(UInt64 _range);\n  int Count(UInt64 aValue);\n};\n\n// class CProgressDialog: public NWindows::NControl::CModelessDialog\n\nenum ESpeedMode\n{\n  kSpeedBytes,\n  kSpeedKBytes,\n  kSpeedMBytes\n};\n\nclass CProgressDialog: public NWindows::NControl::CModalDialog\n{\n  UString _prevFileName;\n  UString _prevTitleName;\nprivate:\n  UString backgroundString;\n  UString backgroundedString;\n  UString foregroundString;\n  UString pauseString;\n  UString continueString;\n  UString pausedString;\n\n\n\n  UINT_PTR _timer;\n\n  UString _title;\n  CU64ToI32Converter _converter;\n  UInt64 _previousPos;\n  UInt64 _range;\n  NWindows::NControl::CProgressBar m_ProgressBar;\n\n  UInt32 _prevPercentValue;\n  UInt32 _prevTime;\n  UInt32 _elapsedTime;\n  UInt32 _prevElapsedSec;\n  UInt64 _prevRemainingSec;\n  ESpeedMode _prevMode;\n  UInt64 _prevSpeed;\n\n  bool _foreground;\n\n  bool OnTimer(WPARAM timerID, LPARAM callback);\n  void SetRange(UInt64 range);\n  void SetPos(UInt64 pos);\n  virtual bool OnInit();\n  virtual void OnCancel();\n  NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent;\n  #ifndef _SFX\n  void AddToTitle(LPCWSTR string);\n  #endif\n\n  void SetPauseText();\n  void SetPriorityText();\n  void OnPauseButton();\n  void OnPriorityButton();\n  bool OnButtonClicked(int buttonID, HWND buttonHWND);\n\n  void SetTitleText();\n  void ShowSize(int id, UInt64 value);\n\npublic:\n  CProgressSynch ProgressSynch;\n  bool CompressingMode;\n  \n  #ifndef _SFX\n  HWND MainWindow;\n  UString MainTitle;\n  UString MainAddTitle;\n  ~CProgressDialog();\n  #endif\n\n  CProgressDialog(): _timer(0), CompressingMode(true)\n    #ifndef _SFX\n    ,MainWindow(0)\n    #endif\n  {\n    if (_dialogCreatedEvent.Create() != S_OK)\n      throw 1334987;\n  }\n\n  void WaitCreating() { _dialogCreatedEvent.Lock(); }\n\n\n  INT_PTR Create(const UString &title, HWND wndParent = 0)\n  {\n    _title = title;\n    return CModalDialog::Create(IDD_DIALOG_PROGRESS, wndParent);\n  }\n\n  static const UINT kCloseMessage;\n\n  virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam);\n\n  void MyClose() { PostMessage(kCloseMessage);  };\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ProgressDialog2Res.h",
    "content": "#define IDC_BUTTON_PAUSE                3\n#define IDC_BUTTON_PROGRESS_PRIORITY    4\n#define IDD_DIALOG_PROGRESS             500\n#define IDS_PROGRESS_PAUSED             700\n#define IDS_PROGRESS_FOREGROUND         701\n#define IDS_PROGRESS_CONTINUE           702\n#define IDS_PROGRESS_ASK_CANCEL         703\n#define IDC_PROGRESS1                   1000\n#define IDC_PROGRESS_ELAPSED            1002\n#define IDC_PROGRESS_ELAPSED_VALUE      1003\n#define IDC_PROGRESS_REMAINING          1004\n#define IDC_PROGRESS_REMAINING_VALUE    1005\n#define IDC_PROGRESS_SPEED              1006\n#define IDC_PROGRESS_SPEED_VALUE        1007\n#define IDC_PROGRESS_TOTAL              1008\n#define IDC_PROGRESS_TOTAL_VALUE        1009\n#define IDC_PROGRESS_FILE_NAME          1010\n\n#define IDC_PROGRESS_FILES              1012\n#define IDC_PROGRESS_FILES_VALUE        1013\n#define IDC_PROGRESS_RATIO              1014\n#define IDC_PROGRESS_RATIO_VALUE        1015\n#define IDC_PROGRESS_PACKED             1016\n#define IDC_PROGRESS_PACKED_VALUE       1017\n#define IDC_PROGRESS_UNPACKED           1018\n#define IDC_PROGRESS_UNPACKED_VALUE     1019\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ProgressDialog2_rc.cpp",
    "content": "// ProgressDialog2_rc.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif\n\n#include \"ProgressDialog2Res.h\"\n\n#include \"Windows/Control/DialogImpl.h\"\n\n/*\nIDD_DIALOG_PROGRESS  DIALOG  0, 0, xSize, ySize  MY_MODAL_DIALOG_STYLE | WS_MINIMIZEBOX \nCAPTION \"Progress\"\nMY_FONT\nBEGIN\n  PUSHBUTTON  \"&Background\", IDC_BUTTON_PROGRESS_PRIORITY,  bXPos3, bYPos, bXSize, bYSize\n  PUSHBUTTON  \"&Pause\",      IDC_BUTTON_PAUSE,              bXPos2, bYPos, bXSize, bYSize\n  PUSHBUTTON  \"Cancel\",      IDCANCEL,                      bXPos1, bYPos, bXSize, bYSize\n  LTEXT  \"Elapsed time:\",   IDC_PROGRESS_ELAPSED,   marg, y0, x0Size, 8\n  LTEXT  \"Remaining time:\", IDC_PROGRESS_REMAINING, marg, y1, x0Size, 8\n  LTEXT  \"Files:\",          IDC_PROGRESS_FILES,     marg, y2, x0Size, 8\n  LTEXT  \"Compression ratio:\",IDC_PROGRESS_RATIO,   marg, y3, x0Size, 8\n\n  LTEXT  \"Total size:\",      IDC_PROGRESS_TOTAL,    x2, y0, x2Size, 8\n  LTEXT  \"Speed:\",           IDC_PROGRESS_SPEED,    x2, y1, x2Size, 8\n  LTEXT  \"Processed:\",       IDC_PROGRESS_UNPACKED, x2, y2, x2Size, 8\n  LTEXT  \"Compressed size:\", IDC_PROGRESS_PACKED,   x2, y3, x2Size, 8\n\n  RTEXT  \"00:00:00\",  IDC_PROGRESS_ELAPSED_VALUE,     x1, y0, x1Size, 8\n  RTEXT  \"\",          IDC_PROGRESS_REMAINING_VALUE,   x1, y1, x1Size, 8\n  RTEXT  \"\",          IDC_PROGRESS_FILES_VALUE,       x1, y2, x1Size, 8\n  RTEXT  \"\",          IDC_PROGRESS_RATIO_VALUE,       x1, y3, x1Size, 8\n\n  RTEXT  \"\",          IDC_PROGRESS_TOTAL_VALUE,       x3, y0, x3Size, 8\n  RTEXT  \"\",          IDC_PROGRESS_SPEED_VALUE,       x3, y1, x3Size, 8\n  RTEXT  \"\",          IDC_PROGRESS_UNPACKED_VALUE,    x3, y2, x3Size, 8\n  RTEXT  \"\",          IDC_PROGRESS_PACKED_VALUE,      x3, y3, x3Size, 8\n\n  LTEXT  \"\", IDC_PROGRESS_FILE_NAME, marg, bYPos - 30, xSize2, 8, SS_NOPREFIX\n  CONTROL \"Progress1\", IDC_PROGRESS1, \"msctls_progress32\", PBS_SMOOTH | WS_BORDER, marg, bYPos - 20, xSize2, 13\nEND\n\n\nSTRINGTABLE DISCARDABLE \nBEGIN\n  IDS_PROGRESS_PAUSED     \"Paused\"\n  IDS_PROGRESS_FOREGROUND \"&Foreground\"\n  IDS_PROGRESS_CONTINUE   \"&Continue\"\n  IDS_PROGRESS_ASK_CANCEL \"Are you sure you want to cancel?\"\nEND\n\n*/\nclass CProgressDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CProgressDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent , int id) : CModalDialogImpl(dialog,parent, id, wxT(\"Progress\"))\n  {\n// FIXME : ProgressDialog2 but ProgressDialog ...\n\n\t///Sizer for adding the controls created by users\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\twxStaticText *pStaticTextElapsedTime = new wxStaticText(this, IDC_PROGRESS_ELAPSED, wxT(\"Elapsed time:\"));\n\twxStaticText *m_pStaticTextElapsedTime = new wxStaticText(this, IDC_PROGRESS_ELAPSED_VALUE, wxT(\"00:00:00\"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\twxStaticText *pStaticTextRemainingTime = new wxStaticText(this, IDC_PROGRESS_REMAINING, wxT(\"Remaining time\"));\n\twxStaticText *m_pStaticTextRemainingTime = new wxStaticText(this, IDC_PROGRESS_REMAINING_VALUE, wxT(\"00:00:00\"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\n\twxStaticText *pStaticTextFiles = new wxStaticText(this, IDC_PROGRESS_FILES, wxT(\"Files:\"));\n\twxStaticText *m_pStaticTextFiles = new wxStaticText(this, IDC_PROGRESS_FILES_VALUE, wxT(\"      \"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\n\twxStaticText *pStaticTextRatio = new wxStaticText(this, IDC_PROGRESS_RATIO, wxT(\"Compression ratio:\"));\n\twxStaticText *m_pStaticTextRatio = new wxStaticText(this, IDC_PROGRESS_RATIO_VALUE, wxT(\"       \"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\n\n\twxStaticText *pStaticTextSize = new wxStaticText(this, IDC_PROGRESS_TOTAL, wxT(\"Total Size:\"));\n\twxStaticText *m_pStaticTextSize = new wxStaticText(this, IDC_PROGRESS_TOTAL_VALUE, wxT(\"          \"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\twxStaticText *pStaticTextSpeed = new wxStaticText(this, IDC_PROGRESS_SPEED, wxT(\"Speed:\"));\n\twxStaticText *m_pStaticTextSpeed = new wxStaticText(this, IDC_PROGRESS_SPEED_VALUE, wxT(\"          \"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\n\twxStaticText *pStaticTextUnpacked = new wxStaticText(this, IDC_PROGRESS_UNPACKED, wxT(\"Processed:\"));\n\twxStaticText *m_pStaticTextUnpacked = new wxStaticText(this, IDC_PROGRESS_UNPACKED, wxT(\"          \"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\t\n\twxStaticText *pStaticTextPacked = new wxStaticText(this, IDC_PROGRESS_PACKED, wxT(\"Compressed size:\"));\n\twxStaticText *m_pStaticTextPacked = new wxStaticText(this, IDC_PROGRESS_PACKED_VALUE, wxT(\"          \"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\n\twxBoxSizer *pInfoSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxBoxSizer *pTimeSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxBoxSizer *pTimeLabelSizer = new wxBoxSizer(wxVERTICAL);\n\tpTimeLabelSizer->Add(pStaticTextElapsedTime  , 0, wxALL|wxEXPAND, 5);\n\tpTimeLabelSizer->Add(pStaticTextRemainingTime, 0, wxALL|wxEXPAND, 5);\n\tpTimeLabelSizer->Add(pStaticTextFiles        , 0, wxALL|wxEXPAND, 5);\n\tpTimeLabelSizer->Add(pStaticTextRatio        , 0, wxALL|wxEXPAND, 5);\n\twxBoxSizer *pTimeInfoSizer = new wxBoxSizer(wxVERTICAL);\n\tpTimeInfoSizer->Add(m_pStaticTextElapsedTime  , 0, wxALL|wxEXPAND, 5);\n\tpTimeInfoSizer->Add(m_pStaticTextRemainingTime, 0, wxALL|wxEXPAND, 5);\n\tpTimeInfoSizer->Add(m_pStaticTextFiles        , 0, wxALL|wxEXPAND, 5);\n\tpTimeInfoSizer->Add(m_pStaticTextRatio        , 0, wxALL|wxEXPAND, 5);\n\tpTimeSizer->Add(pTimeLabelSizer               , 0, wxALL|wxEXPAND, 5);\n\tpTimeSizer->Add(pTimeInfoSizer                , 0, wxALL|wxEXPAND, 5);\n\twxBoxSizer *pSizeSpeedSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxBoxSizer *pSizeSpeedLabelSizer = new wxBoxSizer(wxVERTICAL);\n\tpSizeSpeedLabelSizer->Add(pStaticTextSize     , 0, wxALL|wxEXPAND, 5);\n\tpSizeSpeedLabelSizer->Add(pStaticTextSpeed    , 0, wxALL|wxEXPAND, 5);\n\tpSizeSpeedLabelSizer->Add(pStaticTextUnpacked , 0, wxALL|wxEXPAND, 5);\n\tpSizeSpeedLabelSizer->Add(pStaticTextPacked   , 0, wxALL|wxEXPAND, 5);\n\n\twxBoxSizer *pSizeSpeedInfoSizer = new wxBoxSizer(wxVERTICAL);\n\tpSizeSpeedInfoSizer->Add(m_pStaticTextSize    , 0, wxALL|wxEXPAND, 5);\n\tpSizeSpeedInfoSizer->Add(m_pStaticTextSpeed   , 0, wxALL|wxEXPAND, 5);\n\tpSizeSpeedInfoSizer->Add(m_pStaticTextUnpacked, 0, wxALL|wxEXPAND, 5);\n\tpSizeSpeedInfoSizer->Add(m_pStaticTextPacked  , 0, wxALL|wxEXPAND, 5);\n\n\tpSizeSpeedSizer->Add(pSizeSpeedLabelSizer, 1, wxALL|wxEXPAND, 5);\n\tpSizeSpeedSizer->Add(pSizeSpeedInfoSizer, 1, wxALL|wxEXPAND, 5);\n\tpInfoSizer->Add(pTimeSizer, 0, wxALL|wxEXPAND, 5);\n\tpInfoSizer->Add(pSizeSpeedSizer, 0, wxALL|wxEXPAND, 5);\n\n\twxStaticText *m_pStaticArchiveName = new wxStaticText(this, IDC_PROGRESS_FILE_NAME, wxT(\" \\n \"));\n\twxGauge *m_pGaugeProgress = new wxGauge(this, IDC_PROGRESS1, 100);\n\n\twxBoxSizer *pButtonSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxButton *m_pButtonBackground = new wxButton(this, IDC_BUTTON_PROGRESS_PRIORITY, wxT(\"&Background\"));\n\twxButton *m_pButtonPause = new wxButton(this, IDC_BUTTON_PAUSE, wxT(\"&Pause\"));\n\twxButton *m_pButtonCancel = new wxButton(this, wxID_CANCEL, wxT(\"&Cancel\"));\n\t// FIXME pButtonSizer->AddStretchSpacer(1);\n\tpButtonSizer->Add(m_pButtonBackground, 0, wxALL|wxEXPAND, 5);\n\tpButtonSizer->Add(m_pButtonPause, 0, wxALL|wxEXPAND, 5);\n\tpButtonSizer->Add(m_pButtonCancel, 0, wxALL|wxEXPAND, 5);\n\n\ttopsizer->Add(pInfoSizer, 0, wxBOTTOM|wxEXPAND, 5);\n\ttopsizer->Add(m_pStaticArchiveName, 0, wxLEFT|wxRIGHT|wxEXPAND, 10);\n\ttopsizer->Add(m_pGaugeProgress, 0, wxALL|wxEXPAND, 10);\n\ttopsizer->Add(pButtonSizer, 0, wxALL|wxEXPAND, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nstatic CStringTable g_stringTable[] =\n{\n\t{ IDS_PROGRESS_PAUSED     , L\"Paused\" },\n\t{ IDS_PROGRESS_FOREGROUND , L\"&Foreground\" },\n\t{ IDS_PROGRESS_CONTINUE   , L\"&Continue\" },\n\t{ IDS_PROGRESS_ASK_CANCEL , L\"Are you sure you want to cancel?\" },\n\t{ 0 , 0 }\n};\n\nREGISTER_DIALOG(IDD_DIALOG_PROGRESS,CProgressDialog,g_stringTable)\n\nBEGIN_EVENT_TABLE(CProgressDialogImpl, wxDialog)\n\tEVT_TIMER(wxID_ANY, CModalDialogImpl::OnAnyTimer)\n\tEVT_BUTTON(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ProgressDialogRes.h",
    "content": "#define IDD_DIALOG_PROGRESS          500\n\n#define IDC_PROGRESS1                1000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PropertyName.cpp",
    "content": "// PropertyName.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Windows/ResourceString.h\"\n\n#include \"../../PropID.h\"\n\n#include \"resource.h\"\n#include \"PropertyNameRes.h\"\n#include \"LangUtils.h\"\n#include \"PropertyName.h\"\n\nstruct CPropertyIDNamePair\n{\n  PROPID PropID;\n  UINT ResourceID;\n  UInt32 LangID;\n};\n\nstatic CPropertyIDNamePair kPropertyIDNamePairs[] =\n{\n  { kpidPath, IDS_PROPERTY_PATH, 0x02000203 },\n  { kpidName, IDS_PROPERTY_NAME, 0x02000204 },\n  { kpidExtension, IDS_PROPERTY_EXTENSION, 0x02000205 },\n  { kpidIsDir, IDS_PROPERTY_IS_FOLDER,  0x02000206},\n  { kpidSize, IDS_PROPERTY_SIZE, 0x02000207},\n  { kpidPackSize, IDS_PROPERTY_PACKED_SIZE, 0x02000208 },\n  { kpidAttrib, IDS_PROPERTY_ATTRIBUTES, 0x02000209 },\n  { kpidCTime, IDS_PROPERTY_CTIME, 0x0200020A },\n  { kpidATime, IDS_PROPERTY_ATIME, 0x0200020B },\n  { kpidMTime, IDS_PROPERTY_MTIME, 0x0200020C },\n  { kpidSolid, IDS_PROPERTY_SOLID, 0x0200020D },\n  { kpidCommented, IDS_PROPERTY_C0MMENTED, 0x0200020E },\n  { kpidEncrypted, IDS_PROPERTY_ENCRYPTED, 0x0200020F },\n  { kpidSplitBefore, IDS_PROPERTY_SPLIT_BEFORE, 0x02000210 },\n  { kpidSplitAfter, IDS_PROPERTY_SPLIT_AFTER, 0x02000211 },\n  { kpidDictionarySize, IDS_PROPERTY_DICTIONARY_SIZE, 0x02000212 },\n  { kpidCRC, IDS_PROPERTY_CRC, 0x02000213 },\n  { kpidType, IDS_PROPERTY_FILE_TYPE,  0x02000214},\n  { kpidIsAnti, IDS_PROPERTY_ANTI, 0x02000215 },\n  { kpidMethod, IDS_PROPERTY_METHOD, 0x02000216 },\n  { kpidHostOS, IDS_PROPERTY_HOST_OS, 0x02000217 },\n  { kpidFileSystem, IDS_PROPERTY_FILE_SYSTEM, 0x02000218},\n  { kpidUser, IDS_PROPERTY_USER, 0x02000219},\n  { kpidGroup, IDS_PROPERTY_GROUP, 0x0200021A},\n  { kpidBlock, IDS_PROPERTY_BLOCK, 0x0200021B },\n  { kpidComment, IDS_PROPERTY_COMMENT, 0x0200021C },\n  { kpidPosition, IDS_PROPERTY_POSITION, 0x0200021D },\n  { kpidPrefix, IDS_PROPERTY_PREFIX, 0x0200021E },\n  { kpidNumSubDirs, IDS_PROPERTY_FOLDERS, 0x0200021F },\n  { kpidNumSubFiles, IDS_PROPERTY_FILES, 0x02000220 },\n  { kpidUnpackVer, IDS_PROPERTY_VERSION, 0x02000221},\n  { kpidVolume, IDS_PROPERTY_VOLUME, 0x02000222},\n  { kpidIsVolume, IDS_PROPERTY_IS_VOLUME, 0x02000223},\n  { kpidOffset, IDS_PROPERTY_OFFSET, 0x02000224},\n  { kpidLinks, IDS_PROPERTY_LINKS, 0x02000225},\n  { kpidNumBlocks, IDS_PROPERTY_NUM_BLOCKS, 0x02000226},\n  { kpidNumVolumes, IDS_PROPERTY_NUM_VOLUMES, 0x02000227},\n\n  { kpidBit64, IDS_PROPERTY_BIT64, 0x02000229},\n  { kpidBigEndian, IDS_PROPERTY_BIG_ENDIAN, 0x0200022A},\n  { kpidCpu, IDS_PROPERTY_CPU, 0x0200022B},\n  { kpidPhySize, IDS_PROPERTY_PHY_SIZE, 0x0200022C},\n  { kpidHeadersSize, IDS_PROPERTY_HEADERS_SIZE, 0x0200022D},\n  { kpidChecksum, IDS_PROPERTY_CHECKSUM, 0x0200022E},\n  { kpidCharacts, IDS_PROPERTY_CHARACTS, 0x0200022F},\n  { kpidVa, IDS_PROPERTY_VA, 0x02000230},\n\n  { kpidTotalSize, IDS_PROPERTY_TOTAL_SIZE, 0x03031100 },\n  { kpidFreeSpace, IDS_PROPERTY_FREE_SPACE, 0x03031101 },\n  { kpidClusterSize, IDS_PROPERTY_CLUSTER_SIZE, 0x03031102},\n  { kpidVolumeName, IDS_PROPERTY_VOLUME_NAME, 0x03031103 },\n\n  { kpidLocalName, IDS_PROPERTY_LOCAL_NAME, 0x03031200 },\n  { kpidProvider, IDS_PROPERTY_PROVIDER, 0x03031201 }\n};\n\nint FindProperty(PROPID propID)\n{\n  for (int i = 0; i < sizeof(kPropertyIDNamePairs) / sizeof(kPropertyIDNamePairs[0]); i++)\n    if (kPropertyIDNamePairs[i].PropID == propID)\n      return i;\n  return -1;\n}\n\nUString GetNameOfProperty(PROPID propID, const wchar_t *name)\n{\n  int index = FindProperty(propID);\n  if (index < 0)\n  {\n    if (name)\n      return name;\n    wchar_t s[32];\n    ConvertUInt64ToString(propID, s);\n    return s;\n  }\n  const CPropertyIDNamePair &pair = kPropertyIDNamePairs[index];\n  return LangString(pair.ResourceID, pair.LangID);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PropertyName.h",
    "content": "// PropertyName.h\n\n#ifndef __PROPERTYNAME_H\n#define __PROPERTYNAME_H\n\n#include \"Common/MyString.h\"\n\nUString GetNameOfProperty(PROPID propID, const wchar_t *name);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/PropertyNameRes.h",
    "content": "#define IDS_PROPERTY_PATH                3\n#define IDS_PROPERTY_NAME                4\n#define IDS_PROPERTY_EXTENSION           5\n#define IDS_PROPERTY_IS_FOLDER           6\n#define IDS_PROPERTY_SIZE                7\n#define IDS_PROPERTY_PACKED_SIZE         8\n#define IDS_PROPERTY_ATTRIBUTES          9\n#define IDS_PROPERTY_CTIME              10\n#define IDS_PROPERTY_ATIME              11\n#define IDS_PROPERTY_MTIME              12\n#define IDS_PROPERTY_SOLID              13\n#define IDS_PROPERTY_C0MMENTED          14\n#define IDS_PROPERTY_ENCRYPTED          15\n#define IDS_PROPERTY_DICTIONARY_SIZE    16\n#define IDS_PROPERTY_SPLIT_BEFORE       17\n#define IDS_PROPERTY_SPLIT_AFTER        18\n#define IDS_PROPERTY_CRC                19\n#define IDS_PROPERTY_FILE_TYPE          20\n#define IDS_PROPERTY_ANTI               21\n#define IDS_PROPERTY_METHOD             22\n#define IDS_PROPERTY_HOST_OS            23\n#define IDS_PROPERTY_FILE_SYSTEM        24\n#define IDS_PROPERTY_USER               25\n#define IDS_PROPERTY_GROUP              26\n#define IDS_PROPERTY_BLOCK              27\n#define IDS_PROPERTY_COMMENT            28\n#define IDS_PROPERTY_POSITION           29\n#define IDS_PROPERTY_PREFIX             30\n#define IDS_PROPERTY_FOLDERS            31\n#define IDS_PROPERTY_FILES              32\n#define IDS_PROPERTY_VERSION            33\n#define IDS_PROPERTY_VOLUME             34\n#define IDS_PROPERTY_IS_VOLUME          35\n#define IDS_PROPERTY_OFFSET             36\n#define IDS_PROPERTY_LINKS              37\n#define IDS_PROPERTY_NUM_BLOCKS         38\n#define IDS_PROPERTY_NUM_VOLUMES        39\n\n#define IDS_PROPERTY_BIT64              41\n#define IDS_PROPERTY_BIG_ENDIAN         42\n#define IDS_PROPERTY_CPU                43\n#define IDS_PROPERTY_PHY_SIZE           44\n#define IDS_PROPERTY_HEADERS_SIZE       45\n#define IDS_PROPERTY_CHECKSUM           46\n#define IDS_PROPERTY_CHARACTS           47\n#define IDS_PROPERTY_VA                 48\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/RegistryAssociations.cpp",
    "content": "// RegistryAssociations.cpp\n\n#include \"StdAfx.h\"\n\n#include \"RegistryAssociations.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/StringToInt.h\"\n\n#include \"Windows/Synchronization.h\"\n#include \"Windows/Registry.h\"\n\n#include \"Windows/FileName.h\"\n\n#include \"StringUtils.h\"\n\nusing namespace NWindows;\nusing namespace NRegistry;\n\n\nnamespace NRegistryAssociations {\n  \nstatic NSynchronization::CCriticalSection g_CriticalSection;\n\n#define REG_PATH_FM TEXT(\"Software\") TEXT(STRING_PATH_SEPARATOR) TEXT(\"7-ZIP\") TEXT(STRING_PATH_SEPARATOR) TEXT(\"FM\")\n\nstatic const TCHAR *kCUKeyPath = REG_PATH_FM;\nstatic const WCHAR *kExtPlugins = L\"Plugins\";\nstatic const TCHAR *kExtEnabled = TEXT(\"Enabled\");\n\n#define kAssociations TEXT(\"Associations\")\n#define kAssociationsPath REG_PATH_FM TEXT(STRING_PATH_SEPARATOR) kAssociations\n\nbool ReadInternalAssociation(const wchar_t *ext, CExtInfo &extInfo)\n{\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  CKey key;\n  if (key.Open(HKEY_CURRENT_USER,\n      CSysString(kAssociationsPath TEXT(STRING_PATH_SEPARATOR)) +\n      GetSystemString(ext), KEY_READ) != ERROR_SUCCESS)\n    return false;\n  UString pluginsString;\n  key.QueryValue(kExtPlugins, pluginsString);\n  SplitString(pluginsString, extInfo.Plugins);\n  return true;\n}\n\nvoid ReadInternalAssociations(CObjectVector<CExtInfo> &items)\n{\n  items.Clear();\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  CKey associationsKey;\n  if (associationsKey.Open(HKEY_CURRENT_USER, kAssociationsPath, KEY_READ) != ERROR_SUCCESS)\n    return;\n  CSysStringVector extNames;\n  associationsKey.EnumKeys(extNames);\n  for(int i = 0; i < extNames.Size(); i++)\n  {\n    const CSysString extName = extNames[i];\n    CExtInfo extInfo;\n    // extInfo.Enabled = false;\n    extInfo.Ext = GetUnicodeString(extName);\n    CKey key;\n    if (key.Open(associationsKey, extName, KEY_READ) != ERROR_SUCCESS)\n      return;\n    UString pluginsString;\n    key.QueryValue(kExtPlugins, pluginsString);\n    SplitString(pluginsString, extInfo.Plugins);\n    /*\n    if (key.QueryValue(kExtEnabled, extInfo.Enabled) != ERROR_SUCCESS)\n      extInfo.Enabled = false;\n    */\n    items.Add(extInfo);\n  }\n}\n\nvoid WriteInternalAssociations(const CObjectVector<CExtInfo> &items)\n{\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  CKey mainKey;\n  mainKey.Create(HKEY_CURRENT_USER, kCUKeyPath);\n  mainKey.RecurseDeleteKey(kAssociations);\n  CKey associationsKey;\n  associationsKey.Create(mainKey, kAssociations);\n  for(int i = 0; i < items.Size(); i++)\n  {\n    const CExtInfo &extInfo = items[i];\n    CKey key;\n    key.Create(associationsKey, GetSystemString(extInfo.Ext));\n    key.SetValue(kExtPlugins, JoinStrings(extInfo.Plugins));\n    // key.SetValue(kExtEnabled, extInfo.Enabled);\n  }\n}\n\n///////////////////////////////////\n// External\n\nstatic const TCHAR *kShellNewKeyName = TEXT(\"ShellNew\");\nstatic const TCHAR *kShellNewDataValueName = TEXT(\"Data\");\n  \nstatic const TCHAR *kDefaultIconKeyName = TEXT(\"DefaultIcon\");\nstatic const TCHAR *kShellKeyName = TEXT(\"shell\");\nstatic const TCHAR *kOpenKeyName = TEXT(\"open\");\nstatic const TCHAR *kCommandKeyName = TEXT(\"command\");\n\nstatic CSysString GetExtensionKeyName(const CSysString &extension)\n{\n  return CSysString(TEXT(\".\")) + extension;\n}\n\nstatic CSysString GetExtProgramKeyName(const CSysString &extension)\n{\n  return CSysString(TEXT(\"7-Zip.\")) + extension;\n}\n\nstatic bool CheckShellExtensionInfo2(const CSysString &extension, UString &iconPath, int &iconIndex)\n{\n  iconIndex = -1;\n  iconPath.Empty();\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  CKey extKey;\n  if (extKey.Open(HKEY_CLASSES_ROOT, GetExtensionKeyName(extension), KEY_READ) != ERROR_SUCCESS)\n    return false;\n  CSysString programNameValue;\n  if (extKey.QueryValue(NULL, programNameValue) != ERROR_SUCCESS)\n    return false;\n  CSysString extProgramKeyName = GetExtProgramKeyName(extension);\n  if (programNameValue.CompareNoCase(extProgramKeyName) != 0)\n    return false;\n  CKey iconKey;\n  if (extKey.Open(HKEY_CLASSES_ROOT, extProgramKeyName + CSysString(TEXT(CHAR_PATH_SEPARATOR)) + kDefaultIconKeyName, KEY_READ) != ERROR_SUCCESS)\n    return false;\n  UString value;\n  if (extKey.QueryValue(NULL, value) == ERROR_SUCCESS)\n  {\n    int pos = value.ReverseFind(L',');\n    iconPath = value;\n    if (pos >= 0)\n    {\n      const wchar_t *end;\n      UInt64 index = ConvertStringToUInt64((const wchar_t *)value + pos + 1, &end);\n      if (*end == 0)\n      {\n        iconIndex = (int)index;\n        iconPath = value.Left(pos);\n      }\n    }\n  }\n  return true;\n}\n\nbool CheckShellExtensionInfo(const CSysString &extension, UString &iconPath, int &iconIndex)\n{\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  if (!CheckShellExtensionInfo2(extension, iconPath, iconIndex))\n    return false;\n  CKey extProgKey;\n  return (extProgKey.Open(HKEY_CLASSES_ROOT, GetExtProgramKeyName(extension), KEY_READ) == ERROR_SUCCESS);\n}\n\nstatic void DeleteShellExtensionKey(const CSysString &extension)\n{\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  CKey rootKey;\n  rootKey.Attach(HKEY_CLASSES_ROOT);\n  rootKey.RecurseDeleteKey(GetExtensionKeyName(extension));\n  rootKey.Detach();\n}\n\nstatic void DeleteShellExtensionProgramKey(const CSysString &extension)\n{\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  CKey rootKey;\n  rootKey.Attach(HKEY_CLASSES_ROOT);\n  rootKey.RecurseDeleteKey(GetExtProgramKeyName(extension));\n  rootKey.Detach();\n}\n\nvoid DeleteShellExtensionInfo(const CSysString &extension)\n{\n  UString iconPath;\n  int iconIndex;\n  if (CheckShellExtensionInfo2(extension, iconPath, iconIndex))\n    DeleteShellExtensionKey(extension);\n  DeleteShellExtensionProgramKey(extension);\n}\n\nvoid AddShellExtensionInfo(const CSysString &extension,\n    const UString &programTitle,\n    const UString &programOpenCommand,\n    const UString &iconPath, int iconIndex,\n    const void *shellNewData, int shellNewDataSize)\n{\n  DeleteShellExtensionKey(extension);\n  DeleteShellExtensionProgramKey(extension);\n  NSynchronization::CCriticalSectionLock lock(g_CriticalSection);\n  CSysString programKeyName = GetExtProgramKeyName(extension);\n  {\n    CKey extKey;\n    extKey.Create(HKEY_CLASSES_ROOT, GetExtensionKeyName(extension));\n    extKey.SetValue(NULL, programKeyName);\n    if (shellNewData != NULL)\n    {\n      CKey shellNewKey;\n      shellNewKey.Create(extKey, kShellNewKeyName);\n      shellNewKey.SetValue(kShellNewDataValueName, shellNewData, shellNewDataSize);\n    }\n  }\n  CKey programKey;\n  programKey.Create(HKEY_CLASSES_ROOT, programKeyName);\n  programKey.SetValue(NULL, programTitle);\n  {\n    CKey iconKey;\n    iconKey.Create(programKey, kDefaultIconKeyName);\n    UString iconPathFull = iconPath;\n    if (iconIndex >= 0)\n    {\n      iconPathFull += L\",\";\n      wchar_t s[32];\n      ConvertUInt64ToString((UInt64)iconIndex, s);\n      iconPathFull += s;\n    }\n    iconKey.SetValue(NULL, iconPathFull);\n  }\n\n  CKey shellKey;\n  shellKey.Create(programKey, kShellKeyName);\n  shellKey.SetValue(NULL, TEXT(\"\"));\n\n  CKey openKey;\n  openKey.Create(shellKey, kOpenKeyName);\n  openKey.SetValue(NULL, TEXT(\"\"));\n  \n  CKey commandKey;\n  commandKey.Create(openKey, kCommandKeyName);\n\n  commandKey.SetValue(NULL, programOpenCommand);\n}\n\n///////////////////////////\n// ContextMenu\n/*\n\nstatic const TCHAR *kContextMenuKeyName = TEXT(\"\\\\shellex\\\\ContextMenuHandlers\\\\7-ZIP\");\nstatic const TCHAR *kContextMenuHandlerCLASSIDValue =\n    TEXT(\"{23170F69-40C1-278A-1000-000100020000}\");\nstatic const TCHAR *kRootKeyNameForFile = TEXT(\"*\");\nstatic const TCHAR *kRootKeyNameForFolder = TEXT(\"Folder\");\n\nstatic CSysString GetFullContextMenuKeyName(const CSysString &aKeyName)\n  { return (aKeyName + kContextMenuKeyName); }\n\nstatic bool CheckContextMenuHandlerCommon(const CSysString &aKeyName)\n{\n  NSynchronization::CCriticalSectionLock lock(&g_CriticalSection, true);\n  CKey aKey;\n  if (aKey.Open(HKEY_CLASSES_ROOT, GetFullContextMenuKeyName(aKeyName), KEY_READ)\n      != ERROR_SUCCESS)\n    return false;\n  CSysString aValue;\n  if (aKey.QueryValue(NULL, aValue) != ERROR_SUCCESS)\n    return false;\n  return (aValue.CompareNoCase(kContextMenuHandlerCLASSIDValue) == 0);\n}\n\nbool CheckContextMenuHandler()\n{\n  return CheckContextMenuHandlerCommon(kRootKeyNameForFile) &&\n    CheckContextMenuHandlerCommon(kRootKeyNameForFolder);\n}\n\nstatic void DeleteContextMenuHandlerCommon(const CSysString &aKeyName)\n{\n  CKey rootKey;\n  rootKey.Attach(HKEY_CLASSES_ROOT);\n  rootKey.RecurseDeleteKey(GetFullContextMenuKeyName(aKeyName));\n  rootKey.Detach();\n}\n\nvoid DeleteContextMenuHandler()\n{\n  DeleteContextMenuHandlerCommon(kRootKeyNameForFile);\n  DeleteContextMenuHandlerCommon(kRootKeyNameForFolder);\n}\n\nstatic void AddContextMenuHandlerCommon(const CSysString &aKeyName)\n{\n  DeleteContextMenuHandlerCommon(aKeyName);\n  NSynchronization::CCriticalSectionLock lock(&g_CriticalSection, true);\n  CKey aKey;\n  aKey.Create(HKEY_CLASSES_ROOT, GetFullContextMenuKeyName(aKeyName));\n  aKey.SetValue(NULL, kContextMenuHandlerCLASSIDValue);\n}\n\nvoid AddContextMenuHandler()\n{\n  AddContextMenuHandlerCommon(kRootKeyNameForFile);\n  AddContextMenuHandlerCommon(kRootKeyNameForFolder);\n}\n*/\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/RegistryAssociations.h",
    "content": "// RegistryAssociations.h\n\n#ifndef __REGISTRYASSOCIATIONS_H\n#define __REGISTRYASSOCIATIONS_H\n\n#include \"Common/MyString.h\"\n\nnamespace NRegistryAssociations {\n\n  struct CExtInfo\n  {\n    UString Ext;\n    UStringVector Plugins;\n    // bool Enabled;\n  };\n  bool ReadInternalAssociation(const wchar_t *ext, CExtInfo &extInfo);\n  void ReadInternalAssociations(CObjectVector<CExtInfo> &items);\n  void WriteInternalAssociations(const CObjectVector<CExtInfo> &items);\n\n  bool CheckShellExtensionInfo(const CSysString &extension, UString &iconPath, int &iconIndex);\n\n  // void ReadCompressionInfo(NZipSettings::NCompression::CInfo &anInfo,\n  void DeleteShellExtensionInfo(const CSysString &extension);\n\n  void AddShellExtensionInfo(const CSysString &extension,\n      const UString &programTitle,\n      const UString &programOpenCommand,\n      const UString &iconPath, int iconIndex,\n      const void *shellNewData, int shellNewDataSize);\n\n\n  ///////////////////////////\n  // ContextMenu\n  /*\n  bool CheckContextMenuHandler();\n  void AddContextMenuHandler();\n  void DeleteContextMenuHandler();\n  */\n\n}\n\n// bool GetProgramDirPrefix(CSysString &aFolder);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/RegistryPlugins.h",
    "content": "// RegistryPlugins.h\n\n#ifndef __REGISTRYPLUGINS_H\n#define __REGISTRYPLUGINS_H\n\n#include \"Common/MyString.h\"\n\nenum EPluginType\n{\n  kPluginTypeFF = 0\n};\n\nstruct CPluginInfo\n{\n  UString FilePath;\n  EPluginType Type;\n  UString Name;\n  CLSID ClassID;\n  CLSID OptionsClassID;\n  bool ClassIDDefined;\n  bool OptionsClassIDDefined;\n\n  // CSysString Extension;\n  // CSysString AddExtension;\n  // bool UpdateEnabled;\n  // bool KeepName;\n};\n\nvoid ReadPluginInfoList(CObjectVector<CPluginInfo> &plugins);\nvoid ReadFileFolderPluginInfoList(CObjectVector<CPluginInfo> &plugins);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/RegistryUtils.cpp",
    "content": "// RegistryUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"RegistryUtils.h\"\n#include \"Windows/Registry.h\"\n\nusing namespace NWindows;\nusing namespace NRegistry;\n\n#define REG_PATH_7Z TEXT(\"Software\") TEXT(STRING_PATH_SEPARATOR) TEXT(\"7-ZIP\")\n\nstatic const TCHAR *kCUBasePath = REG_PATH_7Z;\nstatic const TCHAR *kCU_FMPath = REG_PATH_7Z TEXT(STRING_PATH_SEPARATOR) TEXT(\"FM\");\n// static const TCHAR *kLM_Path = REG_PATH_7Z TEXT(STRING_PATH_SEPARATOR) TEXT(\"FM\");\n\nstatic const WCHAR *kLangValueName = L\"Lang\";\nstatic const WCHAR *kEditor = L\"Editor\";\nstatic const TCHAR *kShowDots = TEXT(\"ShowDots\");\nstatic const TCHAR *kShowRealFileIcons = TEXT(\"ShowRealFileIcons\");\nstatic const TCHAR *kShowSystemMenu = TEXT(\"ShowSystemMenu\");\n\nstatic const TCHAR *kFullRow = TEXT(\"FullRow\");\nstatic const TCHAR *kShowGrid = TEXT(\"ShowGrid\");\nstatic const TCHAR *kAlternativeSelection = TEXT(\"AlternativeSelection\");\n// static const TCHAR *kLockMemoryAdd = TEXT(\"LockMemoryAdd\");\nstatic const TCHAR *kLargePagesEnable = TEXT(\"LargePages\");\n// static const TCHAR *kSingleClick = TEXT(\"SingleClick\");\n// static const TCHAR *kUnderline = TEXT(\"Underline\");\n\nvoid SaveRegLang(const UString &langFile)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  key.SetValue(kLangValueName, langFile);\n}\n\nvoid ReadRegLang(UString &langFile)\n{\n  langFile.Empty();\n  CKey key;\n  if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) == ERROR_SUCCESS)\n    key.QueryValue(kLangValueName, langFile);\n}\n\nvoid SaveRegEditor(const UString &editorPath)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCU_FMPath);\n  key.SetValue(kEditor, editorPath);\n}\n\nvoid ReadRegEditor(UString &editorPath)\n{\n  editorPath.Empty();\n  CKey key;\n  if (key.Open(HKEY_CURRENT_USER, kCU_FMPath, KEY_READ) == ERROR_SUCCESS)\n    key.QueryValue(kEditor, editorPath);\n}\n\nstatic void Save7ZipOption(const TCHAR *value, bool enabled)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  key.SetValue(value, enabled);\n}\n\nstatic void SaveOption(const TCHAR *value, bool enabled)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCU_FMPath);\n  key.SetValue(value, enabled);\n}\n\nstatic bool Read7ZipOption(const TCHAR *value, bool defaultValue)\n{\n  CKey key;\n  if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) == ERROR_SUCCESS)\n  {\n    bool enabled;\n    if (key.QueryValue(value, enabled) == ERROR_SUCCESS)\n      return enabled;\n  }\n  return defaultValue;\n}\n\nstatic bool ReadOption(const TCHAR *value, bool defaultValue)\n{\n  CKey key;\n  if (key.Open(HKEY_CURRENT_USER, kCU_FMPath, KEY_READ) == ERROR_SUCCESS)\n  {\n    bool enabled;\n    if (key.QueryValue(value, enabled) == ERROR_SUCCESS)\n      return enabled;\n  }\n  return defaultValue;\n}\n\n/*\nstatic void SaveLmOption(const TCHAR *value, bool enabled)\n{\n  CKey key;\n  key.Create(HKEY_LOCAL_MACHINE, kLM_Path);\n  key.SetValue(value, enabled);\n}\n\nstatic bool ReadLmOption(const TCHAR *value, bool defaultValue)\n{\n  CKey key;\n  if (key.Open(HKEY_LOCAL_MACHINE, kLM_Path, KEY_READ) == ERROR_SUCCESS)\n  {\n    bool enabled;\n    if (key.QueryValue(value, enabled) == ERROR_SUCCESS)\n      return enabled;\n  }\n  return defaultValue;\n}\n*/\n\nvoid SaveShowDots(bool showDots) { SaveOption(kShowDots, showDots); }\nbool ReadShowDots() { return ReadOption(kShowDots, false); }\n\nvoid SaveShowRealFileIcons(bool show)  { SaveOption(kShowRealFileIcons, show); }\nbool ReadShowRealFileIcons() { return ReadOption(kShowRealFileIcons, false); }\n\nvoid SaveShowSystemMenu(bool show) { SaveOption(kShowSystemMenu, show); }\nbool ReadShowSystemMenu(){ return ReadOption(kShowSystemMenu, false); }\n\nvoid SaveFullRow(bool enable) { SaveOption(kFullRow, enable); }\nbool ReadFullRow() { return ReadOption(kFullRow, false); }\n\nvoid SaveShowGrid(bool enable) { SaveOption(kShowGrid, enable); }\nbool ReadShowGrid(){ return ReadOption(kShowGrid, false); }\n\nvoid SaveAlternativeSelection(bool enable) { SaveOption(kAlternativeSelection, enable); }\nbool ReadAlternativeSelection(){ return ReadOption(kAlternativeSelection, false); }\n\n/*\nvoid SaveSingleClick(bool enable) { SaveOption(kSingleClick, enable); }\nbool ReadSingleClick(){ return ReadOption(kSingleClick, false); }\n\nvoid SaveUnderline(bool enable) { SaveOption(kUnderline, enable); }\nbool ReadUnderline(){ return ReadOption(kUnderline, false); }\n*/\n\n// void SaveLockMemoryAdd(bool enable) { SaveLmOption(kLockMemoryAdd, enable); }\n// bool ReadLockMemoryAdd() { return ReadLmOption(kLockMemoryAdd, true); }\n\nvoid SaveLockMemoryEnable(bool enable) { Save7ZipOption(kLargePagesEnable, enable); }\nbool ReadLockMemoryEnable() { return Read7ZipOption(kLargePagesEnable, false); }\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/RegistryUtils.h",
    "content": "// RegistryUtils.h\n\n#include \"Common/StringConvert.h\"\n\n#ifndef __REGISTRYUTILS_H\n#define __REGISTRYUTILS_H\n\nvoid SaveRegLang(const UString &langFile);\nvoid ReadRegLang(UString &langFile);\n\nvoid SaveRegEditor(const UString &editorPath);\nvoid ReadRegEditor(UString &editorPath);\n\nvoid SaveShowDots(bool showDots);\nbool ReadShowDots();\n\nvoid SaveShowRealFileIcons(bool show);\nbool ReadShowRealFileIcons();\n\nvoid SaveShowSystemMenu(bool showSystemMenu);\nbool ReadShowSystemMenu();\n\nvoid SaveFullRow(bool enable);\nbool ReadFullRow();\n\nvoid SaveShowGrid(bool enable);\nbool ReadShowGrid();\n\nvoid SaveAlternativeSelection(bool enable);\nbool ReadAlternativeSelection();\n\n// void SaveLockMemoryAdd(bool enable);\n// bool ReadLockMemoryAdd();\n\nbool ReadLockMemoryEnable();\nvoid SaveLockMemoryEnable(bool enable);\n\n/*\nvoid SaveSingleClick(bool enable);\nbool ReadSingleClick();\n\nvoid SaveUnderline(bool enable);\nbool ReadUnderline();\n*/\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/RootFolder.cpp",
    "content": "// RootFolder.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n\n#include \"RootFolder.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"../../PropID.h\"\n#include \"Windows/Defs.h\"\n#include \"Windows/PropVariant.h\"\n\n#ifdef _WIN32\n#include \"FSDrives.h\"\n#include \"PhysDriveFolder.h\"\n#include \"NetFolder.h\"\n#endif\n#include \"SysIconUtils.h\"\n#include \"LangUtils.h\"\n\nusing namespace NWindows;\n\n\nstatic const STATPROPSTG kProperties[] =\n{\n  { NULL, kpidName, VT_BSTR}\n};\n\n// static const wchar_t *kMyComputerTitle = L\"Computer\";\n// static const wchar_t *kMyNetworkTitle = L\"Network\";\n\n#ifdef _WIN32\nUString RootFolder_GetName_Computer(int &iconIndex)\n{\n  iconIndex = GetIconIndexForCSIDL(CSIDL_DRIVES);\n  return LangString(IDS_COMPUTER, 0x03020300);\n}\n\nUString RootFolder_GetName_Network(int &iconIndex)\n{\n  iconIndex = GetIconIndexForCSIDL(CSIDL_NETWORK);\n  return LangString(IDS_NETWORK, 0x03020301);\n}\n\nUString RootFolder_GetName_Documents(int &iconIndex)\n{\n  iconIndex = GetIconIndexForCSIDL(CSIDL_PERSONAL);\n  return LangString(IDS_DOCUMENTS, 0x03020302); ;\n}\n\nconst int ROOT_INDEX_COMPUTER = 0;\nconst int ROOT_INDEX_DOCUMENTS = 1;\nconst int ROOT_INDEX_NETWORK = 2;\n\nvoid CRootFolder::Init()\n{\n  _names[ROOT_INDEX_COMPUTER] = RootFolder_GetName_Computer(_iconIndices[ROOT_INDEX_COMPUTER]);\n  _names[ROOT_INDEX_DOCUMENTS] = RootFolder_GetName_Documents(_iconIndices[ROOT_INDEX_DOCUMENTS]);\n  _names[ROOT_INDEX_NETWORK] = RootFolder_GetName_Network(_iconIndices[ROOT_INDEX_NETWORK]);\n};\n#else\nvoid CRootFolder::Init()\n{\n}\n#endif\n\nSTDMETHODIMP CRootFolder::LoadItems()\n{\n  Init();\n  return S_OK;\n}\n\nSTDMETHODIMP CRootFolder::GetNumberOfItems(UInt32 *numItems)\n{\n#ifdef _WIN32\n  *numItems = kNumRootFolderItems;\n#else\n  *numItems = 1; // only \"/\" !\n#endif\n  return S_OK;\n}\n\nSTDMETHODIMP CRootFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value)\n{\n  NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidIsDir:  prop = true; break;\n#ifdef _WIN32\n    case kpidName:  prop = _names[itemIndex]; break;\n#else\n    case kpidName:  prop = L\"/\"; break;\n#endif\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\n#ifdef _WIN32\nUString GetMyDocsPath()\n{\n  UString us;\n  WCHAR s[MAX_PATH + 1];\n  if (SHGetSpecialFolderPathW(0, s, CSIDL_PERSONAL, FALSE))\n    us = s;\n  #ifndef _UNICODE\n  else\n  {\n    CHAR s2[MAX_PATH + 1];\n    if (SHGetSpecialFolderPathA(0, s2, CSIDL_PERSONAL, FALSE))\n      us = GetUnicodeString(s2);\n  }\n  #endif\n  if (us.Length() > 0 && us[us.Length() - 1] != L'\\\\')\n    us += L'\\\\';\n  return us;\n}\n#endif\n\nSTDMETHODIMP CRootFolder::BindToFolder(UInt32 index, IFolderFolder **resultFolder)\n{\n#ifdef _WIN32\n  if (index == ROOT_INDEX_COMPUTER)\n  {\n    CFSDrives *fsDrivesSpec = new CFSDrives;\n    CMyComPtr<IFolderFolder> subFolder = fsDrivesSpec;\n    fsDrivesSpec->Init();\n    *resultFolder = subFolder.Detach();\n  }\n  else if (index == ROOT_INDEX_NETWORK)\n  {\n    CNetFolder *netFolderSpec = new CNetFolder;\n    CMyComPtr<IFolderFolder> subFolder = netFolderSpec;\n    netFolderSpec->Init(0, 0, _names[ROOT_INDEX_NETWORK] + L'\\\\');\n    *resultFolder = subFolder.Detach();\n  }\n  else if (index == ROOT_INDEX_DOCUMENTS)\n  {\n    UString s = GetMyDocsPath();\n    if (!s.IsEmpty())\n    {\n      NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder;\n      CMyComPtr<IFolderFolder> subFolder = fsFolderSpec;\n      RINOK(fsFolderSpec->Init(s, NULL));\n      *resultFolder = subFolder.Detach();\n    }\n  }\n  else\n    return E_INVALIDARG;\n  return S_OK;\n#else\n  return E_INVALIDARG;\n#endif\n}\n\nstatic bool AreEqualNames(const UString &name1, const UString &name2)\n{\n  return (name1 == name2 || name1 == (name2 + UString(WCHAR_PATH_SEPARATOR)));\n}\n\nSTDMETHODIMP CRootFolder::BindToFolder(const wchar_t *name, IFolderFolder **resultFolder)\n{\n  *resultFolder = 0;\n  UString name2 = name;\n  name2.Trim();\n  if (name2.IsEmpty())\n  {\n    CRootFolder *rootFolderSpec = new CRootFolder;\n    CMyComPtr<IFolderFolder> rootFolder = rootFolderSpec;\n    rootFolderSpec->Init();\n    *resultFolder = rootFolder.Detach();\n    return S_OK;\n  }\n#ifdef _WIN32\n  for (int i = 0; i < kNumRootFolderItems; i++)\n    if (AreEqualNames(name2, _names[i]))\n      return BindToFolder((UInt32)i, resultFolder);\n  if (AreEqualNames(name2, L\"My Documents\") ||\n      AreEqualNames(name2, L\"Documents\"))\n    return BindToFolder((UInt32)ROOT_INDEX_DOCUMENTS, resultFolder);\n  if (AreEqualNames(name2, L\"My Computer\") ||\n      AreEqualNames(name2, L\"Computer\"))\n    return BindToFolder((UInt32)ROOT_INDEX_COMPUTER, resultFolder);\n#endif\n  if (name2 == UString(WCHAR_PATH_SEPARATOR))\n  {\n    CMyComPtr<IFolderFolder> subFolder = this;\n    *resultFolder = subFolder.Detach();\n    return S_OK;\n  }\n\n  if (name2.Length () < 2)\n    return E_INVALIDARG;\n\n  CMyComPtr<IFolderFolder> subFolder;\n  \n#ifdef _WIN32\n  if (name2.Left(4) == L\"\\\\\\\\.\\\\\")\n  {\n    CPhysDriveFolder *folderSpec = new CPhysDriveFolder;\n    subFolder = folderSpec;\n    RINOK(folderSpec->Init(name2.Mid(4, 2)));\n  }\n  else\n#endif\n  {\n    if (name2[name2.Length () - 1] != WCHAR_PATH_SEPARATOR)\n      name2 += WCHAR_PATH_SEPARATOR;\n    NFsFolder::CFSFolder *fsFolderSpec = new NFsFolder::CFSFolder;\n    subFolder = fsFolderSpec;\n    if (fsFolderSpec->Init(name2, 0) != S_OK)\n    {\n#ifdef _WIN32\n      if (name2[0] == WCHAR_PATH_SEPARATOR)\n      {\n        CNetFolder *netFolderSpec = new CNetFolder;\n        subFolder = netFolderSpec;\n        netFolderSpec->Init(name2);\n      }\n      else\n#endif\n        return E_INVALIDARG;\n    }\n  }\n  *resultFolder = subFolder.Detach();\n  return S_OK;\n}\n\nSTDMETHODIMP CRootFolder::BindToParentFolder(IFolderFolder **resultFolder)\n{\n  *resultFolder = 0;\n  return S_OK;\n}\n\nSTDMETHODIMP CRootFolder::GetNumberOfProperties(UInt32 *numProperties)\n{\n  *numProperties = sizeof(kProperties) / sizeof(kProperties[0]);\n  return S_OK;\n}\n\nSTDMETHODIMP CRootFolder::GetPropertyInfo(UInt32 index,\n    BSTR *name, PROPID *propID, VARTYPE *varType)\n{\n  if (index >= sizeof(kProperties) / sizeof(kProperties[0]))\n    return E_INVALIDARG;\n  const STATPROPSTG &prop = kProperties[index];\n  *propID = prop.propid;\n  *varType = prop.vt;\n  *name = 0;\n  return S_OK;\n}\n\nSTDMETHODIMP CRootFolder::GetFolderProperty(PROPID propID, PROPVARIANT *value)\n{\n  NWindows::NCOM::CPropVariant prop;\n  switch(propID)\n  {\n    case kpidType: prop = L\"RootFolder\"; break;\n    case kpidPath: prop = L\"\"; break;\n  }\n  prop.Detach(value);\n  return S_OK;\n}\n\nSTDMETHODIMP CRootFolder::GetSystemIconIndex(UInt32 index, INT32 *iconIndex)\n{\n#ifdef _WIN32\n  *iconIndex = _iconIndices[index];\n#else\n  *iconIndex = -1; // FIXME - folder icon ?\n#endif\n  return S_OK;\n}\n\n\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/RootFolder.h",
    "content": "// RootFolder.h\n\n#ifndef __ROOTFOLDER_H\n#define __ROOTFOLDER_H\n\n#include \"Common/MyString.h\"\n\n#include \"Windows/PropVariant.h\"\n\n#include \"FSFolder.h\"\n\n#ifdef _WIN32\nconst int kNumRootFolderItems = 3;\n#endif\n\nclass CRootFolder:\n  public IFolderFolder,\n  public IFolderGetSystemIconIndex,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP1(\n    IFolderGetSystemIconIndex\n  )\n\n  INTERFACE_FolderFolder(;)\n\n  STDMETHOD(GetSystemIconIndex)(UInt32 index, INT32 *iconIndex);\n\n  void Init();\nprivate:\n#ifdef _WIN32\n  UString _names[kNumRootFolderItems];\n  int _iconIndices[kNumRootFolderItems];\n#endif\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SplitDialog.cpp",
    "content": "// SplitDialog.cpp\n\n#include \"StdAfx.h\"\n#include \"SplitDialog.h\"\n\n#include \"Common/StringToInt.h\"\n#include \"Windows/Shell.h\"\n#include \"Windows/FileName.h\"\n\n#include \"SplitUtils.h\"\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\n#include \"CopyDialogRes.h\"\n\nusing namespace NWindows;\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDC_STATIC_SPLIT_PATH, 0x03020501 },\n  { IDC_STATIC_SPLIT_VOLUME, 0x02000D40 },\n};\n#endif\n\n\nbool CSplitDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetWindowText(HWND(*this), 0x03020500);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  _pathCombo.Attach(GetItem(IDC_COMBO_SPLIT_PATH));\n  _volumeCombo.Attach(GetItem(IDC_COMBO_SPLIT_VOLUME));\n  \n  if (!FilePath.IsEmpty())\n  {\n    UString title;\n    GetText(title);\n    title += L' ';\n    title += FilePath;\n    SetText(title);\n  }\n  _pathCombo.SetText(Path);\n  AddVolumeItems(_volumeCombo);\n  _volumeCombo.SetCurSel(0);\n  return CModalDialog::OnInit();\n}\n\nbool CSplitDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  switch(buttonID)\n  {\n    case IDC_BUTTON_SPLIT_PATH:\n      OnButtonSetPath();\n      return true;\n  }\n  return CModalDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n\nvoid CSplitDialog::OnButtonSetPath()\n{\n  UString currentPath;\n  _pathCombo.GetText(currentPath);\n  // UString title = L\"Specify a location for output folder\";\n  UString title = LangStringSpec(IDS_SET_FOLDER, 0x03020209);\n\n  UString resultPath;\n  if (!NShell::BrowseForFolder(HWND(*this), title, currentPath, resultPath))\n    return;\n  NFile::NName::NormalizeDirPathPrefix(resultPath);\n  _pathCombo.SetCurSel(-1);\n  _pathCombo.SetText(resultPath);\n}\n\nvoid CSplitDialog::OnOK()\n{\n  _pathCombo.GetText(Path);\n  UString volumeString;\n  _volumeCombo.GetText(volumeString);\n  volumeString.Trim();\n  if (!ParseVolumeSizes(volumeString, VolumeSizes) || VolumeSizes.Size() == 0)\n  {\n    ::MessageBoxW(*this, LangString(IDS_COMPRESS_INCORRECT_VOLUME_SIZE, 0x02000D41), L\"7-Zip\", 0);\n    return;\n  }\n  CModalDialog::OnOK();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SplitDialog.h",
    "content": "// SplitDialog.h\n\n#ifndef __SPLITDIALOG_H\n#define __SPLITDIALOG_H\n\n#include \"Common/Types.h\"\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/ComboBox.h\"\n#include \"SplitDialogRes.h\"\n\nclass CSplitDialog: public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CComboBox _pathCombo;\n  NWindows::NControl::CComboBox _volumeCombo;\n  virtual void OnOK();\n  virtual bool OnInit();\n  virtual bool OnButtonClicked(int buttonID, HWND buttonHWND);\n  void OnButtonSetPath();\npublic:\n  UString FilePath;\n  UString Path;\n  CRecordVector<UInt64> VolumeSizes;\n  INT_PTR Create(HWND parentWindow = 0)\n    { return CModalDialog::Create(IDD_DIALOG_SPLIT, parentWindow); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SplitDialogRes.h",
    "content": "#define IDD_DIALOG_SPLIT                504\n#define IDC_STATIC_SPLIT_PATH           1000\n#define IDC_COMBO_SPLIT_PATH            1001\n#define IDC_BUTTON_SPLIT_PATH           1002\n#define IDC_STATIC_SPLIT_VOLUME         1010\n#define IDC_COMBO_SPLIT_VOLUME          1011\n\n#define IDS_COMPRESS_INCORRECT_VOLUME_SIZE   95\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SplitDialog_rc.cpp",
    "content": "// PasswordDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"Windows/Control/DialogImpl.h\"\n\n#include \"SplitDialogRes.h\"\n\nclass CSplitDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CSplitDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent,int id) : CModalDialogImpl(dialog, parent, id, wxT(\"Split File\"))\n  {\n\n\twxArrayString pathArray;\n\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\n\ttopsizer->Add(new wxStaticText(this, IDC_STATIC_SPLIT_PATH, _T(\"&Split to:\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\n\t{\n\twxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL);\n\n\twxComboBox *combo = new wxComboBox(this, IDC_COMBO_SPLIT_PATH, wxEmptyString, wxDefaultPosition, wxSize(600,-1), pathArray, wxCB_DROPDOWN|wxCB_SORT);\n\twxButton *button = new wxButton(this, IDC_BUTTON_SPLIT_PATH, wxT(\"...\"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);\n\tpathSizer->Add(combo, 1, wxLEFT|wxRIGHT|wxEXPAND, 5);\n\tpathSizer->Add(button, 0, wxLEFT|wxRIGHT|wxEXPAND, 5);\n\n\ttopsizer->Add(pathSizer, 0 ,wxALL | wxALIGN_LEFT, 5 );\n\t}\n\n\ttopsizer->Add(new wxStaticText(this, IDC_STATIC_SPLIT_VOLUME, _T(\"Split to &volumes,  bytes:\")) , 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\twxComboBox *combo = new wxComboBox(this, IDC_COMBO_SPLIT_VOLUME, wxEmptyString, wxDefaultPosition, wxSize(600,-1), pathArray, wxCB_DROPDOWN|wxCB_SORT);\n\n\ttopsizer->Add(combo, 0 ,wxALL | wxALIGN_LEFT, 5 );\n\n\n\ttopsizer->Add(CreateButtonSizer(wxOK|wxCANCEL), 0, wxALL|wxEXPAND, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nstatic CStringTable g_stringTable[] =\n{\n\t{ IDS_COMPRESS_INCORRECT_VOLUME_SIZE, L\"Incorrect volume size\" },\n\t{ 0 , 0 }\n};\n\n\nREGISTER_DIALOG(IDD_DIALOG_SPLIT,CSplitDialog,g_stringTable)\n\nBEGIN_EVENT_TABLE(CSplitDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY,   CModalDialogImpl::OnAnyButton)\n\tEVT_CHECKBOX(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SplitUtils.cpp",
    "content": "// SplitUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringToInt.h\"\n\n#include \"SplitUtils.h\"\n#include \"StringUtils.h\"\n\nbool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values)\n{\n  values.Clear();\n  UStringVector destStrings;\n  SplitString(s, destStrings);\n  bool prevIsNumber = false;\n  for (int i = 0; i < destStrings.Size(); i++)\n  {\n    UString subString = destStrings[i];\n    subString.MakeUpper();\n    if (subString.IsEmpty())\n      return false;\n    if (subString == L\"-\")\n      return true;\n    if (prevIsNumber)\n    {\n      wchar_t c = subString[0];\n      UInt64 &value = values.Back();\n      prevIsNumber = false;\n      switch(c)\n      {\n        case L'B':\n          continue;\n        case L'K':\n          value <<= 10;\n          continue;\n        case L'M':\n          value <<= 20;\n          continue;\n        case L'G':\n          value <<= 30;\n          continue;\n      }\n    }\n    const wchar_t *start = subString;\n    const wchar_t *end;\n    UInt64 value = ConvertStringToUInt64(start, &end);\n    if (start == end)\n      return false;\n    if (value == 0)\n      return false;\n    values.Add(value);\n    prevIsNumber = true;\n    UString rem = subString.Mid((int)(end - start));\n    if (!rem.IsEmpty())\n      destStrings.Insert(i + 1, rem);\n  }\n  return true;\n}\n\nvoid AddVolumeItems(NWindows::NControl::CComboBox &volumeCombo)\n{\n  volumeCombo.AddString(TEXT(\"1457664 - 3.5\\\" floppy\"));\n  volumeCombo.AddString(TEXT(\"650M - CD\"));\n  volumeCombo.AddString(TEXT(\"700M - CD\"));\n  volumeCombo.AddString(TEXT(\"4480M - DVD\"));\n}\n\nUInt64 GetNumberOfVolumes(UInt64 size, CRecordVector<UInt64> &volSizes)\n{\n  if (size == 0 || volSizes.Size() == 0)\n    return 1;\n  UInt64 numVolumes = 0;\n  for (int i = 0; i < volSizes.Size(); i++)\n  {\n    UInt64 volSize = volSizes[i];\n    numVolumes++;\n    if (volSize >= size)\n      return numVolumes;\n    size -= volSize;\n  }\n  UInt64 volSize = volSizes.Back();\n  if (volSize == 0)\n    return (UInt64)(Int64)-1;\n  return numVolumes + (size - 1) / volSize + 1;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SplitUtils.h",
    "content": "// SplitUtils.h\n\n#ifndef __SPLITUTILS_H\n#define __SPLITUTILS_H\n\n#include \"Common/MyString.h\"\n#include \"Common/Types.h\"\n#include \"Windows/Control/ComboBox.h\"\n\nbool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values);\nvoid AddVolumeItems(NWindows::NControl::CComboBox &volumeCombo);\n\nUInt64 GetNumberOfVolumes(UInt64 size, CRecordVector<UInt64> &volSizes);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/StringUtils.cpp",
    "content": "// StringUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"StringUtils.h\"\n\nvoid SplitStringToTwoStrings(const UString &src, UString &dest1, UString &dest2)\n{\n  dest1.Empty();\n  dest2.Empty();\n  bool quoteMode = false;\n  int i;\n  for (i = 0; i < src.Length(); i++)\n  {\n    wchar_t c = src[i];\n    if (c == L'\\\"')\n      quoteMode = !quoteMode;\n    else if (c == L' ' && !quoteMode)\n    {\n      if (!quoteMode)\n      {\n        i++;\n        break;\n      }\n    }\n    else\n      dest1 += c;\n  }\n  dest2 = src.Mid(i);\n}\n\nvoid SplitString(const UString &srcString, UStringVector &destStrings)\n{\n  destStrings.Clear();\n  UString string;\n  int len = srcString.Length();\n  if (len == 0)\n    return;\n  for (int i = 0; i < len; i++)\n  {\n    wchar_t c = srcString[i];\n    if (c == L' ')\n    {\n      if (!string.IsEmpty())\n      {\n        destStrings.Add(string);\n        string.Empty();\n      }\n    }\n    else\n      string += c;\n  }\n  if (!string.IsEmpty())\n    destStrings.Add(string);\n}\n\nUString JoinStrings(const UStringVector &srcStrings)\n{\n  UString destString;\n  for (int i = 0; i < srcStrings.Size(); i++)\n  {\n    if (i != 0)\n      destString += L' ';\n    destString += srcStrings[i];\n  }\n  return destString;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/StringUtils.h",
    "content": "// StringUtils.h\n\n#ifndef __STRINGUTILS_H\n#define __STRINGUTILS_H\n\n#include \"Common/MyString.h\"\n\nvoid SplitStringToTwoStrings(const UString &src, UString &dest1, UString &dest2);\n\nvoid SplitString(const UString &srcString, UStringVector &destStrings);\nUString JoinStrings(const UStringVector &srcStrings);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SysIconUtils.cpp",
    "content": "// SysIconUtils.h\n\n#include \"StdAfx.h\"\n\n#include \"SysIconUtils.h\"\n#ifndef _UNICODE\n#include \"Common/StringConvert.h\"\n#endif\n\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\nint GetIconIndexForCSIDL(int csidl)\n{\n#ifdef _WIN32\n  LPITEMIDLIST pidl = 0;\n  SHGetSpecialFolderLocation(NULL, csidl, &pidl);\n  if (pidl)\n  {\n    SHFILEINFO shellInfo;\n    SHGetFileInfo(LPCTSTR(pidl),  FILE_ATTRIBUTE_NORMAL,\n      &shellInfo, sizeof(shellInfo),\n      SHGFI_PIDL | SHGFI_SYSICONINDEX);\n    IMalloc  *pMalloc;\n    SHGetMalloc(&pMalloc);\n    if(pMalloc)\n    {\n      pMalloc->Free(pidl);\n      pMalloc->Release();\n    }\n    return shellInfo.iIcon;\n  }\n#endif // FIXME -1 ?\n  return 0;\n}\n\nDWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attributes, int &iconIndex)\n{\n#ifdef _WIN32\n  SHFILEINFO shellInfo;\n  DWORD_PTR res = ::SHGetFileInfo(path, FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo,\n      sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);\n  iconIndex = shellInfo.iIcon;\n  return res;\n#else\n  return -1;\n#endif\n}\n\n\n#ifdef _WIN32\n\n#ifndef _UNICODE\ntypedef int (WINAPI * SHGetFileInfoWP)(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags);\n\nstruct CSHGetFileInfoInit\n{\n  SHGetFileInfoWP shGetFileInfoW;\n  CSHGetFileInfoInit()\n  {\n    shGetFileInfoW = (SHGetFileInfoWP)\n    ::GetProcAddress(::GetModuleHandleW(L\"shell32.dll\"), \"SHGetFileInfoW\");\n  }\n} g_SHGetFileInfoInit;\n#endif\n\nDWORD_PTR MySHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags)\n{\n  #ifdef _UNICODE\n  return SHGetFileInfoW(\n  #else\n  if (g_SHGetFileInfoInit.shGetFileInfoW == 0)\n    return 0;\n  return g_SHGetFileInfoInit.shGetFileInfoW(\n  #endif\n  pszPath, dwFileAttributes, psfi, cbFileInfo, uFlags);\n}\n\n#ifndef _UNICODE\n// static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; }\nDWORD_PTR GetRealIconIndex(LPCWSTR path, DWORD attributes, int &iconIndex)\n{\n  if(g_IsNT)\n  {\n    SHFILEINFOW shellInfo;\n    DWORD_PTR res = ::MySHGetFileInfoW(path, FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo,\n      sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);\n    iconIndex = shellInfo.iIcon;\n    return res;\n  }\n  else\n    return GetRealIconIndex(UnicodeStringToMultiByte(path), attributes, iconIndex);\n}\n#endif\n\nDWORD_PTR GetRealIconIndex(const UString &fileName, DWORD attributes,\n    int &iconIndex, UString &typeName)\n{\n  #ifndef _UNICODE\n  if(!g_IsNT)\n  {\n    SHFILEINFO shellInfo;\n    shellInfo.szTypeName[0] = 0;\n    DWORD_PTR res = ::SHGetFileInfoA(GetSystemString(fileName), FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo,\n      sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX\n      | SHGFI_TYPENAME);\n    typeName = GetUnicodeString(shellInfo.szTypeName);\n    iconIndex = shellInfo.iIcon;\n    return res;\n  }\n  else\n  #endif\n  {\n    SHFILEINFOW shellInfo;\n    shellInfo.szTypeName[0] = 0;\n    DWORD_PTR res = ::MySHGetFileInfoW(fileName, FILE_ATTRIBUTE_NORMAL | attributes, &shellInfo,\n      sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX\n      | SHGFI_TYPENAME);\n    typeName = shellInfo.szTypeName;\n    iconIndex = shellInfo.iIcon;\n    return res;\n  }\n}\n\nint CExtToIconMap::GetIconIndex(UINT32 attributes, const UString &fileNameSpec, UString &typeName)\n{\n  UString fileName = fileNameSpec;\n  if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0)\n  {\n    fileName = L\"__Fldr__\";\n    if (_dirIconIndex < 0)\n      GetRealIconIndex(fileName, attributes, _dirIconIndex, _dirTypeName);\n    typeName = _dirTypeName;\n    return _dirIconIndex;\n  }\n  int dotPos = fileName.ReverseFind('.');\n  if (dotPos < 0)\n  {\n    fileName = L\"__File__\";\n    if (_noExtIconIndex < 0)\n    {\n      int iconIndexTemp;\n      GetRealIconIndex(fileName, attributes, iconIndexTemp, _noExtTypeName);\n    }\n    typeName = _noExtTypeName;\n    return _noExtIconIndex;\n  }\n  CExtIconPair extIconPair;\n  extIconPair.Ext = fileName.Mid(dotPos + 1);\n  int anIndex = _map.FindInSorted(extIconPair);\n  if (anIndex >= 0)\n    return _map[anIndex].IconIndex;\n  fileName = fileName.Mid(dotPos);\n  GetRealIconIndex(fileName, attributes, extIconPair.IconIndex, extIconPair.TypeName);\n  _map.AddToSorted(extIconPair);\n  typeName = extIconPair.TypeName;\n  return extIconPair.IconIndex;\n}\n\nint CExtToIconMap::GetIconIndex(UINT32 attributes, const UString &fileName)\n{\n  UString typeName;\n  return GetIconIndex(attributes, fileName, typeName);\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/SysIconUtils.h",
    "content": "// SysIconUtils.h\n\n#ifndef __SYSICONUTILS_H\n#define __SYSICONUTILS_H\n\n#include \"Common/MyString.h\"\n\nstruct CExtIconPair\n{\n  UString Ext;\n  int IconIndex;\n  UString TypeName;\n\n};\n\ninline bool operator==(const CExtIconPair &a1, const CExtIconPair &a2)\n{\n  return (a1.Ext == a2.Ext);\n}\n\ninline bool operator<(const CExtIconPair &a1, const CExtIconPair &a2)\n{\n  return (a1.Ext < a2.Ext);\n}\n\nclass CExtToIconMap\n{\n  int _dirIconIndex;\n  UString _dirTypeName;\n  int _noExtIconIndex;\n  UString _noExtTypeName;\n  CObjectVector<CExtIconPair> _map;\npublic:\n  CExtToIconMap(): _dirIconIndex(-1), _noExtIconIndex(-1) {}\n  void Clear()\n  {\n    _dirIconIndex = -1;\n    _noExtIconIndex = -1;\n    _map.Clear();\n  }\n  int GetIconIndex(UINT32 attributes, const UString &fileName, UString &typeName);\n  int GetIconIndex(UINT32 attributes, const UString &fileName);\n};\n\nDWORD_PTR GetRealIconIndex(LPCTSTR path, DWORD attributes, int &iconIndex);\n#ifndef _UNICODE\nDWORD_PTR GetRealIconIndex(LPCWSTR path, DWORD attributes, int &iconIndex);\n#endif\nint GetIconIndexForCSIDL(int csidl);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/TextPairs.cpp",
    "content": "// Common/TextPairs.cpp\n\n#include \"StdAfx.h\"\n\n#include \"TextPairs.h\"\n\n#include \"Common/Defs.h\"\n#include \"Common/UTFConvert.h\"\n\nstatic const wchar_t kNewLineChar = '\\n';\n\nstatic const wchar_t kSpaceChar     = ' ';\nstatic const wchar_t kTabChar       = '\\t';\n\nstatic const wchar_t kQuoteChar     = '\\\"';\nstatic const wchar_t kEndOfLine     = '\\0';\n\nstatic const wchar_t kBOM = wchar_t(0xFEFF);\n\nstatic bool IsSeparatorChar(wchar_t c)\n{\n  return (c == kSpaceChar || c == kTabChar);\n}\n\nvoid RemoveCr(UString &s)\n{\n  s.Replace(L\"\\x0D\", L\"\");\n}\n\nstatic UString GetIDString(const wchar_t *srcString, int &finishPos)\n{\n  UString result;\n  bool quotes = false;\n  for (finishPos = 0;;)\n  {\n    wchar_t c = srcString[finishPos];\n    if (c == kEndOfLine)\n      break;\n    finishPos++;\n    bool isSeparatorChar = IsSeparatorChar(c);\n    if (c == kNewLineChar || (isSeparatorChar && !quotes)\n        || (c == kQuoteChar && quotes))\n      break;\n    else if (c == kQuoteChar)\n      quotes = true;\n    else\n      result += c;\n  }\n  result.Trim();\n  RemoveCr(result);\n  return result;\n}\n\nstatic UString GetValueString(const wchar_t *srcString, int &finishPos)\n{\n  UString result;\n  for (finishPos = 0;;)\n  {\n    wchar_t c = srcString[finishPos];\n    if (c == kEndOfLine)\n      break;\n    finishPos++;\n    if (c == kNewLineChar)\n      break;\n    result += c;\n  }\n  result.Trim();\n  RemoveCr(result);\n  return result;\n}\n\nstatic bool GetTextPairs(const UString &srcString, CObjectVector<CTextPair> &pairs)\n{\n  pairs.Clear();\n  int pos = 0;\n  \n  if (srcString.Length() > 0)\n  {\n    if (srcString[0] == kBOM)\n      pos++;\n  }\n  while (pos < srcString.Length())\n  {\n    int finishPos;\n    UString id = GetIDString((const wchar_t *)srcString + pos, finishPos);\n    pos += finishPos;\n    if (id.IsEmpty())\n      continue;\n    UString value = GetValueString((const wchar_t *)srcString + pos, finishPos);\n    pos += finishPos;\n    if (!id.IsEmpty())\n    {\n      CTextPair pair;\n      pair.ID = id;\n      pair.Value = value;\n      pairs.Add(pair);\n    }\n  }\n  return true;\n}\n\nint FindItem(const CObjectVector<CTextPair> &pairs, const UString &id)\n{\n  for (int  i = 0; i < pairs.Size(); i++)\n    if (pairs[i].ID.CompareNoCase(id) == 0)\n      return i;\n  return -1;\n}\n\nUString GetTextConfigValue(const CObjectVector<CTextPair> &pairs, const UString &id)\n{\n  int index = FindItem(pairs, id);\n  if (index < 0)\n    return UString();\n  return pairs[index].Value;\n}\n\nstatic int ComparePairIDs(const UString &s1, const UString &s2)\n  { return s1.CompareNoCase(s2); }\nstatic int ComparePairItems(const CTextPair &p1, const CTextPair &p2)\n  { return ComparePairIDs(p1.ID, p2.ID); }\n\n// typedef void* MY_PVOID;\n\n// static int ComparePairItems(const MY_PVOID *a1, const MY_PVOID *a2, void *param)\nstatic int ComparePairItems(void *const *a1, void *const *a2, void * /* param */)\n  { return ComparePairItems(**(const CTextPair **)a1, **(const CTextPair **)a2); }\n\nvoid CPairsStorage::Sort()\n  { Pairs.Sort(ComparePairItems, 0); }\n\nint CPairsStorage::FindID(const UString &id, int &insertPos)\n{\n  int left = 0, right = Pairs.Size();\n  while (left != right)\n  {\n    UINT32 mid = (left + right) / 2;\n    int compResult = ComparePairIDs(id, Pairs[mid].ID);\n    if (compResult == 0)\n      return mid;\n    if (compResult < 0)\n      right = mid;\n    else\n      left = mid + 1;\n  }\n  insertPos = left;\n  return -1;\n}\n\nint CPairsStorage::FindID(const UString &id)\n{\n  int pos;\n  return FindID(id, pos);\n}\n\nvoid CPairsStorage::AddPair(const CTextPair &pair)\n{\n  int insertPos;\n  int pos = FindID(pair.ID, insertPos);\n  if (pos >= 0)\n    Pairs[pos] = pair;\n  else\n    Pairs.Insert(insertPos, pair);\n}\n\nvoid CPairsStorage::DeletePair(const UString &id)\n{\n  int pos = FindID(id);\n  if (pos >= 0)\n    Pairs.Delete(pos);\n}\n\nbool CPairsStorage::GetValue(const UString &id, UString &value)\n{\n  value.Empty();\n  int pos = FindID(id);\n  if (pos < 0)\n    return false;\n  value = Pairs[pos].Value;\n  return true;\n}\n\nUString CPairsStorage::GetValue(const UString &id)\n{\n  int pos = FindID(id);\n  if (pos < 0)\n    return UString();\n  return Pairs[pos].Value;\n}\n\nbool CPairsStorage::ReadFromString(const UString &text)\n{\n  bool result = ::GetTextPairs(text, Pairs);\n  if (result)\n    Sort();\n  else\n    Pairs.Clear();\n  return result;\n}\n\nvoid CPairsStorage::SaveToString(UString &text)\n{\n  for (int i = 0; i < Pairs.Size(); i++)\n  {\n    const CTextPair &pair = Pairs[i];\n    bool multiWord = (pair.ID.Find(L' ') >= 0);\n    if (multiWord)\n      text += L'\\\"';\n    text += pair.ID;\n    if (multiWord)\n      text += L'\\\"';\n    text += L' ';\n    text += pair.Value;\n    text += L'\\x0D';\n    text += L'\\n';\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/TextPairs.h",
    "content": "// Common/TextPairs.h\n\n#ifndef __COMMON_TEXTPAIRS_H\n#define __COMMON_TEXTPAIRS_H\n\n#include \"Common/MyString.h\"\n\nstruct CTextPair\n{\n  UString ID;\n  UString Value;\n};\n\nclass CPairsStorage\n{\n  CObjectVector<CTextPair> Pairs;\n  int FindID(const UString &id, int &insertPos);\n  int FindID(const UString &id);\n  void Sort();\npublic:\n  void Clear() { Pairs.Clear(); };\n  bool ReadFromString(const UString &text);\n  void SaveToString(UString &text);\n\n  bool GetValue(const UString &id, UString &value);\n  UString GetValue(const UString &id);\n  void AddPair(const CTextPair &pair);\n  void DeletePair(const UString &id);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/UpdateCallback100.cpp",
    "content": "// UpdateCallback.h\n\n#include \"StdAfx.h\"\n\n#include \"Common/StringConvert.h\"\n\n#include \"UpdateCallback100.h\"\n// #include \"Windows/ProcessMessages.h\"\n// #include \"Resource/PasswordDialog/PasswordDialog.h\"\n#include \"MessagesDialog.h\"\n\n#include \"Common/Defs.h\"\n\nusing namespace NWindows;\n\nCUpdateCallback100Imp::~CUpdateCallback100Imp()\n{\n  if (ShowMessages && !Messages.IsEmpty())\n  {\n    CMessagesDialog messagesDialog;\n    messagesDialog.Messages = &Messages;\n    messagesDialog.Create(_parentWindow);\n  }\n}\n\nvoid CUpdateCallback100Imp::AddErrorMessage(LPCWSTR message)\n{\n  Messages.Add(message);\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::SetNumFiles(UInt64 numFiles)\n{\n  ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::SetTotal(UInt64 size)\n{\n  ProgressDialog.ProgressSynch.SetProgress(size, 0);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::SetCompleted(const UInt64 *completeValue)\n{\n  RINOK(ProgressDialog.ProgressSynch.ProcessStopAndPause());\n  if (completeValue != NULL)\n    ProgressDialog.ProgressSynch.SetPos(*completeValue);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::CompressOperation(const wchar_t *name)\n{\n  ProgressDialog.ProgressSynch.SetCurrentFileName(name);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::DeleteOperation(const wchar_t *name)\n{\n  ProgressDialog.ProgressSynch.SetCurrentFileName(name);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::OperationResult(Int32 /* operationResult */)\n{\n  NumFiles++;\n  ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::UpdateErrorMessage(const wchar_t *message)\n{\n  AddErrorMessage(message);\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)\n{\n  *passwordIsDefined = BoolToInt(_passwordIsDefined);\n  if (!_passwordIsDefined)\n  {\n    return S_OK;\n    /*\n    CPasswordDialog dialog;\n    if (dialog.Create(_parentWindow) == IDCANCEL)\n      return E_ABORT;\n    _password = dialog._password;\n    _passwordIsDefined = true;\n    */\n  }\n  *passwordIsDefined = BoolToInt(_passwordIsDefined);\n  return StringToBstr(_password, password);\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::SetTotal(const UInt64 * /* files */, const UInt64 * /* bytes */)\n{\n  return S_OK;\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::SetCompleted(const UInt64 * /* files */, const UInt64 * /* bytes */)\n{\n  return ProgressDialog.ProgressSynch.ProcessStopAndPause();\n}\n\nSTDMETHODIMP CUpdateCallback100Imp::CryptoGetTextPassword(BSTR *password)\n{\n  if (!_passwordIsDefined)\n    return S_FALSE;\n  return StringToBstr(_password, password);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/UpdateCallback100.h",
    "content": "// UpdateCallback100.h\n\n#ifndef __UPDATE_CALLBACK100_H\n#define __UPDATE_CALLBACK100_H\n\n#include \"Common/MyCom.h\"\n#include \"Common/MyString.h\"\n\n#include \"../Agent/IFolderArchive.h\"\n#include \"ProgressDialog2.h\"\n#include \"../../IPassword.h\"\n\n#ifdef LANG\n#include \"LangUtils.h\"\n#endif\n\nclass CUpdateCallback100Imp:\n  public IFolderArchiveUpdateCallback,\n  public ICryptoGetTextPassword2,\n  public ICryptoGetTextPassword,\n  public IArchiveOpenCallback,\n  public ICompressProgressInfo,\n  public CMyUnknownImp\n{\npublic:\n  MY_UNKNOWN_IMP5(\n    IFolderArchiveUpdateCallback,\n    ICryptoGetTextPassword2,\n    ICryptoGetTextPassword,\n    IArchiveOpenCallback,\n    ICompressProgressInfo)\n\n  INTERFACE_IProgress(;)\n  INTERFACE_IArchiveOpenCallback(;)\n  INTERFACE_IFolderArchiveUpdateCallback(;)\n\n  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);\n\n  STDMETHOD(CryptoGetTextPassword)(BSTR *password);\n  STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password);\nprivate:\n  bool _passwordIsDefined;\n  UString _password;\n\n  void AddErrorMessage(LPCWSTR message);\n  bool ShowMessages;\n\npublic:\n  CUpdateCallback100Imp(): ShowMessages(true) {}\n  ~CUpdateCallback100Imp();\n  CProgressDialog ProgressDialog;\n  HWND _parentWindow;\n  UStringVector Messages;\n  UInt64 NumFolders;\n  UInt64 NumFiles;\n\n  void Init(HWND parentWindow,\n      bool passwordIsDefined, const UString &password)\n  {\n    _passwordIsDefined = passwordIsDefined;\n    _password = password;\n    _parentWindow = parentWindow;\n    NumFolders = NumFiles = 0;\n  }\n  void StartProgressDialog(const UString &title)\n  {\n    ProgressDialog.Create(title, _parentWindow);\n  }\n\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ViewSettings.cpp",
    "content": "// ViewSettings.h\n\n#include \"StdAfx.h\"\n \n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"ViewSettings.h\"\n#include \"Windows/Registry.h\"\n#include \"Windows/Synchronization.h\"\n\nusing namespace NWindows;\nusing namespace NRegistry;\n\n#define REG_PATH_FM TEXT(\"Software\") TEXT(STRING_PATH_SEPARATOR) TEXT(\"7-ZIP\") TEXT(STRING_PATH_SEPARATOR) TEXT(\"FM\")\n\nstatic const TCHAR *kCUBasePath = REG_PATH_FM;\nstatic const TCHAR *kCulumnsKeyName = REG_PATH_FM TEXT(STRING_PATH_SEPARATOR) TEXT(\"Columns\");\n\nstatic const TCHAR *kPositionValueName = TEXT(\"Position\");\nstatic const TCHAR *kPanelsInfoValueName = TEXT(\"Panels\");\nstatic const TCHAR *kToolbars = TEXT(\"Toolbars\");\n\nstatic const WCHAR *kPanelPathValueName = L\"PanelPath\";\nstatic const TCHAR *kListMode = TEXT(\"ListMode\");\nstatic const TCHAR *kFolderHistoryValueName = TEXT(\"FolderHistory\");\nstatic const TCHAR *kFastFoldersValueName = TEXT(\"FolderShortcuts\");\nstatic const TCHAR *kCopyHistoryValueName = TEXT(\"CopyHistory\");\n\n/*\nclass CColumnInfoSpec\n{\n  UInt32 PropID;\n  Byte IsVisible;\n  UInt32 Width;\n};\n\nstruct CColumnHeader\n{\n  UInt32 Version;\n  UInt32 SortID;\n  Byte Ascending;\n};\n*/\n\nstatic const UInt32 kColumnInfoSpecHeader = 12;\nstatic const UInt32 kColumnHeaderSize = 12;\n\nstatic const UInt32 kColumnInfoVersion = 1;\n\nstatic NSynchronization::CCriticalSection g_RegistryOperationsCriticalSection;\n\nclass CTempOutBufferSpec\n{\n  CByteBuffer Buffer;\n  UInt32 Size;\n  UInt32 Pos;\npublic:\n  operator const Byte *() const { return (const Byte *)Buffer; }\n  void Init(UInt32 dataSize)\n  {\n    Buffer.SetCapacity(dataSize);\n    Size = dataSize;\n    Pos = 0;\n  }\n  void WriteByte(Byte value)\n  {\n    if (Pos >= Size)\n      throw \"overflow\";\n    ((Byte *)Buffer)[Pos++] = value;\n  }\n  void WriteUInt32(UInt32 value)\n  {\n    for (int i = 0; i < 4; i++)\n    {\n      WriteByte((Byte)value);\n      value >>= 8;\n    }\n  }\n  void WriteBool(bool value)\n  {\n    WriteUInt32(value ? 1 : 0);\n  }\n};\n\nclass CTempInBufferSpec\n{\npublic:\n  Byte *Buffer;\n  UInt32 Size;\n  UInt32 Pos;\n  Byte ReadByte()\n  {\n    if (Pos >= Size)\n      throw \"overflow\";\n    return Buffer[Pos++];\n  }\n  UInt32 ReadUInt32()\n  {\n    UInt32 value = 0;\n    for (int i = 0; i < 4; i++)\n      value |= (((UInt32)ReadByte()) << (8 * i));\n    return value;\n  }\n  bool ReadBool()\n  {\n    return (ReadUInt32() != 0);\n  }\n};\n\nvoid SaveListViewInfo(const UString &id, const CListViewInfo &viewInfo)\n{\n  const CObjectVector<CColumnInfo> &columns = viewInfo.Columns;\n  CTempOutBufferSpec buffer;\n  UInt32 dataSize = kColumnHeaderSize + kColumnInfoSpecHeader * columns.Size();\n  buffer.Init(dataSize);\n\n  buffer.WriteUInt32(kColumnInfoVersion);\n  buffer.WriteUInt32(viewInfo.SortID);\n  buffer.WriteBool(viewInfo.Ascending);\n  for(int i = 0; i < columns.Size(); i++)\n  {\n    const CColumnInfo &column = columns[i];\n    buffer.WriteUInt32(column.PropID);\n    buffer.WriteBool(column.IsVisible);\n    buffer.WriteUInt32(column.Width);\n  }\n  {\n    NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n    CKey key;\n    key.Create(HKEY_CURRENT_USER, kCulumnsKeyName);\n    key.SetValue(GetSystemString(id), (const Byte *)buffer, dataSize);\n  }\n}\n\nvoid ReadListViewInfo(const UString &id, CListViewInfo &viewInfo)\n{\n  viewInfo.Clear();\n  CObjectVector<CColumnInfo> &columns = viewInfo.Columns;\n  CByteBuffer buffer;\n  UInt32 size;\n  {\n    NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n    CKey key;\n    if(key.Open(HKEY_CURRENT_USER, kCulumnsKeyName, KEY_READ) != ERROR_SUCCESS)\n      return;\n    if (key.QueryValue(GetSystemString(id), buffer, size) != ERROR_SUCCESS)\n      return;\n  }\n  if (size < kColumnHeaderSize)\n    return;\n  CTempInBufferSpec inBuffer;\n  inBuffer.Size = size;\n  inBuffer.Buffer = (Byte *)buffer;\n  inBuffer.Pos = 0;\n\n\n  UInt32 version = inBuffer.ReadUInt32();\n  if (version != kColumnInfoVersion)\n    return;\n  viewInfo.SortID = inBuffer.ReadUInt32();\n  viewInfo.Ascending = inBuffer.ReadBool();\n\n  size -= kColumnHeaderSize;\n  if (size % kColumnInfoSpecHeader != 0)\n    return;\n  int numItems = size / kColumnInfoSpecHeader;\n  columns.Reserve(numItems);\n  for(int i = 0; i < numItems; i++)\n  {\n    CColumnInfo columnInfo;\n    columnInfo.PropID = inBuffer.ReadUInt32();\n    columnInfo.IsVisible = inBuffer.ReadBool();\n    columnInfo.Width = inBuffer.ReadUInt32();\n    columns.Add(columnInfo);\n  }\n}\n\nstatic const UInt32 kWindowPositionHeaderSize = 5 * 4;\nstatic const UInt32 kPanelsInfoHeaderSize = 3 * 4;\n\n/*\nstruct CWindowPosition\n{\n  RECT Rect;\n  UInt32 Maximized;\n};\n\nstruct CPanelsInfo\n{\n  UInt32 NumPanels;\n  UInt32 CurrentPanel;\n  UInt32 SplitterPos;\n};\n*/\n\n#ifdef _WIN32\nvoid SaveWindowSize(const RECT &rect, bool maximized)\n{\n  CSysString keyName = kCUBasePath;\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  key.Create(HKEY_CURRENT_USER, keyName);\n  // CWindowPosition position;\n  CTempOutBufferSpec buffer;\n  buffer.Init(kWindowPositionHeaderSize);\n  buffer.WriteUInt32(rect.left);\n  buffer.WriteUInt32(rect.top);\n  buffer.WriteUInt32(rect.right);\n  buffer.WriteUInt32(rect.bottom);\n  buffer.WriteBool(maximized);\n  key.SetValue(kPositionValueName, (const Byte *)buffer, kWindowPositionHeaderSize);\n}\n\nbool ReadWindowSize(RECT &rect, bool &maximized)\n{\n  CSysString keyName = kCUBasePath;\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  if(key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS)\n    return false;\n  CByteBuffer buffer;\n  UInt32 size;\n  if (key.QueryValue(kPositionValueName, buffer, size) != ERROR_SUCCESS)\n    return false;\n  if (size != kWindowPositionHeaderSize)\n    return false;\n  CTempInBufferSpec inBuffer;\n  inBuffer.Size = size;\n  inBuffer.Buffer = (Byte *)buffer;\n  inBuffer.Pos = 0;\n  rect.left = inBuffer.ReadUInt32();\n  rect.top = inBuffer.ReadUInt32();\n  rect.right = inBuffer.ReadUInt32();\n  rect.bottom = inBuffer.ReadUInt32();\n  maximized = inBuffer.ReadBool();\n  return true;\n}\n#endif\n\nvoid SavePanelsInfo(UInt32 numPanels, UInt32 currentPanel, UInt32 splitterPos)\n{\n  CSysString keyName = kCUBasePath;\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  key.Create(HKEY_CURRENT_USER, keyName);\n\n  CTempOutBufferSpec buffer;\n  buffer.Init(kPanelsInfoHeaderSize);\n  buffer.WriteUInt32(numPanels);\n  buffer.WriteUInt32(currentPanel);\n  buffer.WriteUInt32(splitterPos);\n  key.SetValue(kPanelsInfoValueName, (const Byte *)buffer, kPanelsInfoHeaderSize);\n}\n\nbool ReadPanelsInfo(UInt32 &numPanels, UInt32 &currentPanel, UInt32 &splitterPos)\n{\n  CSysString keyName = kCUBasePath;\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  if(key.Open(HKEY_CURRENT_USER, keyName, KEY_READ) != ERROR_SUCCESS)\n    return false;\n  CByteBuffer buffer;\n  UInt32 size;\n  if (key.QueryValue(kPanelsInfoValueName, buffer, size) != ERROR_SUCCESS)\n    return false;\n  if (size != kPanelsInfoHeaderSize)\n    return false;\n  CTempInBufferSpec inBuffer;\n  inBuffer.Size = size;\n  inBuffer.Buffer = (Byte *)buffer;\n  inBuffer.Pos = 0;\n  numPanels = inBuffer.ReadUInt32();\n  currentPanel = inBuffer.ReadUInt32();\n  splitterPos = inBuffer.ReadUInt32();\n  return true;\n}\n\nvoid SaveToolbarsMask(UInt32 toolbarMask)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  key.SetValue(kToolbars, toolbarMask);\n}\n\nstatic const UInt32 kDefaultToolbarMask = 8 | 4 | 1;\n\nUInt32 ReadToolbarsMask()\n{\n  CKey key;\n  if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS)\n    return kDefaultToolbarMask;\n  UInt32 mask;\n  if (key.QueryValue(kToolbars, mask) != ERROR_SUCCESS)\n    return kDefaultToolbarMask;\n  return mask;\n}\n\n\nstatic UString GetPanelPathName(UInt32 panelIndex)\n{\n  WCHAR panelString[32];\n  ConvertUInt64ToString(panelIndex, panelString);\n  return UString(kPanelPathValueName) + panelString;\n}\n\n\nvoid SavePanelPath(UInt32 panel, const UString &path)\n{\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  key.SetValue(GetPanelPathName(panel), path);\n}\n\nbool ReadPanelPath(UInt32 panel, UString &path)\n{\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS)\n    return false;\n  return (key.QueryValue(GetPanelPathName(panel), path) == ERROR_SUCCESS);\n}\n\nvoid SaveListMode(const CListMode &listMode)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  UInt32 t = 0;\n  for (int i = 0; i < 2; i++)\n    t |= ((listMode.Panels[i]) & 0xFF) << (i * 8);\n  key.SetValue(kListMode, t);\n}\n\nvoid ReadListMode(CListMode &listMode)\n{\n  CKey key;\n  listMode.Init();\n  if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS)\n    return;\n  UInt32 t;\n  if (key.QueryValue(kListMode, t) != ERROR_SUCCESS)\n    return;\n  for (int i = 0; i < 2; i++)\n  {\n    listMode.Panels[i] = (t & 0xFF);\n    t >>= 8;\n  }\n}\n\n\nvoid SaveStringList(LPCTSTR valueName, const UStringVector &folders)\n{\n  UInt32 sizeInChars = 0;\n  int i;\n  for (i = 0; i < folders.Size(); i++)\n    sizeInChars += folders[i].Length() + 1;\n  CBuffer<wchar_t> buffer;\n  buffer.SetCapacity(sizeInChars);\n  int pos = 0;\n  for (i = 0; i < folders.Size(); i++)\n  {\n    MyStringCopy((wchar_t *)buffer + pos, (const wchar_t *)folders[i]);\n    pos += folders[i].Length() + 1;\n  }\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  key.SetValue(valueName, buffer, sizeInChars * sizeof(wchar_t));\n}\n\nvoid ReadStringList(LPCTSTR valueName, UStringVector &folders)\n{\n  folders.Clear();\n  CKey key;\n  NSynchronization::CCriticalSectionLock lock(g_RegistryOperationsCriticalSection);\n  if(key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) != ERROR_SUCCESS)\n    return;\n  CByteBuffer buffer;\n  UInt32 dataSize;\n  if (key.QueryValue(valueName, buffer, dataSize) != ERROR_SUCCESS)\n    return;\n  if (dataSize % sizeof(wchar_t) != 0)\n    return;\n  const wchar_t *data = (const wchar_t *)(const Byte  *)buffer;\n  int sizeInChars = dataSize / sizeof(wchar_t);\n  UString string;\n  for (int i = 0; i < sizeInChars; i++)\n  {\n    wchar_t c = data[i];\n    if (c == L'\\0')\n    {\n      folders.Add(string);\n      string.Empty();\n    }\n    else\n      string += c;\n  }\n}\n\nvoid SaveFolderHistory(const UStringVector &folders)\n  { SaveStringList(kFolderHistoryValueName, folders); }\nvoid ReadFolderHistory(UStringVector &folders)\n  { ReadStringList(kFolderHistoryValueName, folders); }\n\nvoid SaveFastFolders(const UStringVector &folders)\n  { SaveStringList(kFastFoldersValueName, folders); }\nvoid ReadFastFolders(UStringVector &folders)\n  { ReadStringList(kFastFoldersValueName, folders); }\n\nvoid SaveCopyHistory(const UStringVector &folders)\n  { SaveStringList(kCopyHistoryValueName, folders); }\nvoid ReadCopyHistory(UStringVector &folders)\n  { ReadStringList(kCopyHistoryValueName, folders); }\n\nvoid AddUniqueStringToHeadOfList(UStringVector &list,\n    const UString &string)\n{\n  for(int i = 0; i < list.Size();)\n    if (string.CompareNoCase(list[i]) == 0)\n      list.Delete(i);\n    else\n      i++;\n  list.Insert(0, string);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/ViewSettings.h",
    "content": "// ViewSettings.h\n\n#ifndef __VIEWSETTINGS_H\n#define __VIEWSETTINGS_H\n\n#include \"Common/MyString.h\"\n\nstruct CColumnInfo\n{\n  PROPID PropID;\n  bool IsVisible;\n  UInt32 Width;\n};\n\ninline bool operator==(const CColumnInfo &a1, const CColumnInfo &a2)\n{\n  return (a1.PropID == a2.PropID) &&\n    (a1.IsVisible == a2.IsVisible) && (a1.Width == a2.Width);\n}\n\ninline bool operator!=(const CColumnInfo &a1, const CColumnInfo &a2)\n{\n  return !(a1 == a2);\n}\n\nstruct CListViewInfo\n{\n  CObjectVector<CColumnInfo> Columns;\n  PROPID SortID;\n  bool Ascending;\n\n  void Clear()\n  {\n    SortID = 0;\n    Ascending = true;\n    Columns.Clear();\n  }\n\n  int FindColumnWithID(PROPID propID) const\n  {\n    for (int i = 0; i < Columns.Size(); i++)\n      if (Columns[i].PropID == propID)\n        return i;\n    return -1;\n  }\n\n  bool IsEqual(const CListViewInfo &aNewInfo) const\n  {\n    if (Columns.Size() != aNewInfo.Columns.Size() ||\n      // SortIndex != aNewInfo.SortIndex ||\n      SortID != aNewInfo.SortID ||\n      Ascending != aNewInfo.Ascending)\n      return false;\n    for (int i = 0; i < Columns.Size(); i++)\n      if (Columns[i] != aNewInfo.Columns[i])\n        return false;\n    return true;\n  }\n};\n\nvoid SaveListViewInfo(const UString &id, const CListViewInfo &viewInfo);\nvoid ReadListViewInfo(const UString &id, CListViewInfo &viewInfo);\n\n#ifdef _WIN32\nvoid SaveWindowSize(const RECT &rect, bool maximized);\nbool ReadWindowSize(RECT &rect, bool &maximized);\n#endif\n\nvoid SavePanelsInfo(UInt32 numPanels, UInt32 currentPanel, UInt32 splitterPos);\nbool ReadPanelsInfo(UInt32 &numPanels, UInt32 &currentPanel, UInt32 &splitterPos);\n\nvoid SaveToolbarsMask(UInt32 toolbarMask);\nUInt32 ReadToolbarsMask();\n\nvoid SavePanelPath(UInt32 panel, const UString &path);\nbool ReadPanelPath(UInt32 panel, UString &path);\n\nstruct CListMode\n{\n  UInt32 Panels[2];\n  void Init() { Panels[0] = Panels[1] = 3; }\n  CListMode() { Init(); }\n};\n\nvoid SaveListMode(const CListMode &listMode);\nvoid ReadListMode(CListMode &listMode);\n\nvoid SaveFolderHistory(const UStringVector &folders);\nvoid ReadFolderHistory(UStringVector &folders);\n\nvoid SaveFastFolders(const UStringVector &folders);\nvoid ReadFastFolders(UStringVector &folders);\n\nvoid SaveCopyHistory(const UStringVector &folders);\nvoid ReadCopyHistory(UStringVector &folders);\n\nvoid AddUniqueStringToHeadOfList(UStringVector &list,\n    const UString &string);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/makefile",
    "content": "PROG=../../../../bin/7zFM\n\nLOCAL_FLAGS=\\\n\t-DUNICODE \\\n\t-D_UNICODE \\\n\t-DLANG \\\n\t-DNEW_FOLDER_INTERFACE \\\n\t-DEXTERNAL_CODECS \\\n\t-I. \\\n\t`wx-config --unicode=yes --cxxflags`\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLIBS=`wx-config --unicode=yes --libs` $(LOCAL_LIBS_DLL)\n\nOBJS=\\\nAgent.o \\\nAgentOut.o \\\nAgentProxy.o \\\nArchiveFolder.o \\\nArchiveFolderOpen.o \\\nArchiveFolderOut.o \\\nUpdateCallbackAgent.o \\\nClassDefs.o \\\nwxFM.o \\\nFM.o \\\nFM_rc.o \\\nApp.o \\\nOpenCallback.o \\\nMyLoadMenu.o \\\nPanel.o \\\nPanelCrc.o \\\nPanelCopy.o \\\nPanelItems.o \\\nPanelListNotify.o \\\nPanelFolderChange.o \\\nPanelItemOpen.o \\\nPanelMenu.o \\\nPanelOperations.o \\\nPanelSelect.o \\\nPanelSort.o \\\nPanelSplitFile.o \\\nPropertyName.o \\\nRegistryUtils.o \\\nUpdateCallback100.o \\\nViewSettings.o \\\nFileFolderPluginOpen.o \\\nRootFolder.o \\\nFSFolder.o \\\nFSFolderCopy.o \\\nFormatUtils.o \\\nSysIconUtils.o \\\nTextPairs.o \\\nExtractCallback.o \\\nProgramLocation.o \\\nCopyDialog.o \\\nCopyDialog_rc.o \\\nListViewDialog.o \\\nListViewDialog_rc.o \\\nProgressDialog2.o \\\nProgressDialog2_rc.o \\\nSplitDialog.o \\\nSplitDialog_rc.o \\\nSplitUtils.o \\\nStringUtils.o \\\nComboDialog.o \\\nComboDialog_rc.o \\\nOverwriteDialog.o \\\nOverwriteDialog_rc.o \\\nPasswordDialog.o \\\nPasswordDialog_rc.o \\\nMessagesDialog.o \\\nMessagesDialog_rc.o \\\nArchiveExtractCallback.o \\\nArchiveOpenCallback.o \\\nLoadCodecs.o \\\nOpenArchive.o \\\nFilePathAutoRename.o \\\nFileStreams.o \\\nProgressUtils.o \\\nStreamUtils.o \\\nDefaultName.o \\\nEnumDirItems.o \\\nZipRegistry.o \\\nExtractingFilePath.o \\\nPropIDUtils.o \\\nUpdateAction.o \\\nUpdateCallback.o \\\nUpdatePair.o \\\nUpdateProduce.o \\\nSortUtils.o \\\nTextConfig.o \\\nUTFConvert.o \\\nArchiveName.o \\\nCompressCall.o \\\nWorkDir.o \\\nCopyCoder.o \\\nMyString.o \\\nMyVector.o \\\nStringConvert.o \\\nStringToInt.o \\\nIntToString.o \\\nWildcard.o \\\nDLL.o \\\nError.o \\\nFileDir.o \\\nFileFind.o \\\nFileIO.o \\\nFileName.o \\\nPropVariant.o \\\nPropVariantConversions.o \\\nSynchronization.o \\\nClipboard.o \\\nTime.o \\\nSystem.o \\\nMyWindows.o \\\nRegistry.o \\\nWindow.o \\\nDialog.o \\\nControls.o \\\nWindow2.o \\\nLangUtils.o \\\nLang.o \\\nCRC.o \\\nwine_date_and_time.o \\\nwine_GetXXXDefaultLangID.o \\\nSort.o \\\nThreads.o \\\n$(OBJ_CRC32)\n\n\nOBJS2=\\\nRegistryAssociations.o \\\n\n\nOBJS_OUT=\\\nArchiveCommandLine.o \\\nSetProperties.o \\\nTempFiles.o \\\nUpdate.o \\\nMyMessages.o \\\nFormatUtils.o \\\nStringUtils.o \\\nCommandLineParser.o \\\nListFileUtils.o \\\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/makefile.depend",
    "content": "ClassDefs.o: ClassDefs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../myWindows/initguid.h ../../../Common/MyInitGuid.h IFolder.h \\\n  ../../IProgress.h ../../../Common/MyUnknown.h \\\n  ../../../Common/MyWindows.h ../../../Common/Types.h ../../IDecl.h \\\n  ../../IPassword.h PluginInterface.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h ExtractCallback.h \\\n  ../Agent/IFolderArchive.h ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyWindows.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../Common/../../IPassword.h ../Common/../../Archive/IArchive.h \\\n  ProgressDialog2.h ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/ResourceString.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h ../../ICoder.h \\\n  ../Agent/Agent.h ../../../Common/MyCom.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Agent/../Common/UpdateAction.h \\\n  ../Agent/../Common/OpenArchive.h ../../../Windows/FileFind.h \\\n  ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../Agent/IFolderArchive.h \\\n  ../Agent/AgentProxy.h ../../../Common/MyString.h \\\n  ../Agent/../FileManager/IFolder.h ../Agent/../Common/LoadCodecs.h\nAgent.o: ../Agent/Agent.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Agent/../Common/DefaultName.h \\\n  ../../../Common/MyString.h ../Agent/../Common/ArchiveExtractCallback.h \\\n  ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/../../Archive/../IStream.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Agent/../Common/../../Archive/../../Common/Types.h \\\n  ../Agent/../Common/../../Archive/../IDecl.h \\\n  ../Agent/../Common/../../Archive/../IProgress.h \\\n  ../Agent/../Common/../../Archive/../PropID.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/../../Common/FileStreams.h \\\n  ../Agent/../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Agent/../Common/../../Common/../IStream.h \\\n  ../Agent/../Common/../../Common/../../Common/MyCom.h \\\n  ../Agent/../Common/../../Common/ProgressUtils.h \\\n  ../Agent/../Common/../../Common/../ICoder.h \\\n  ../Agent/../Common/../../Common/../IStream.h \\\n  ../Agent/../Common/../../Common/../IProgress.h \\\n  ../Agent/../Common/../../IPassword.h \\\n  ../Agent/../Common/../../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/Agent.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/UpdateAction.h ../Agent/../Common/OpenArchive.h \\\n  ../../../Windows/FileFind.h ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../../Common/MyCom.h \\\n  ../Agent/../Common/../../../Common/MyString.h \\\n  ../Agent/../Common/../../../Common/Buffer.h \\\n  ../Agent/../Common/../../../Common/Defs.h \\\n  ../Agent/../Common/../../ICoder.h \\\n  ../Agent/../Common/../../../Windows/DLL.h \\\n  ../Agent/../Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/ExtractMode.h ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../IDecl.h ../Agent/AgentProxy.h \\\n  ../Agent/../FileManager/IFolder.h ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../../../../C/Sort.h ../Agent/../../../../C/Types.h\nAgentOut.o: ../Agent/AgentOut.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/Time.h \\\n  ../Agent/../../Compress/CopyCoder.h \\\n  ../Agent/../../Compress/../../Common/MyCom.h \\\n  ../Agent/../../Compress/../../Common/MyWindows.h \\\n  ../Agent/../../Compress/../ICoder.h \\\n  ../Agent/../../Compress/../IStream.h \\\n  ../Agent/../../Compress/../../Common/MyUnknown.h \\\n  ../Agent/../../Compress/../../Common/Types.h \\\n  ../Agent/../../Compress/../IDecl.h ../Agent/../../Common/FileStreams.h \\\n  ../Agent/../../Common/../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../Agent/../../Common/../IStream.h \\\n  ../Agent/../../Common/../../Common/MyCom.h \\\n  ../Agent/../Common/EnumDirItems.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../Agent/../Common/DirItem.h ../../../Common/Types.h \\\n  ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/../../Archive/../IStream.h \\\n  ../Agent/../Common/../../Archive/../IProgress.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../Archive/../../Common/Types.h \\\n  ../Agent/../Common/../../Archive/../IDecl.h \\\n  ../Agent/../Common/../../Archive/../PropID.h \\\n  ../Agent/../Common/HandlerLoader.h ../Agent/../Common/../../ICoder.h \\\n  ../../../Windows/DLL.h ../Agent/../Common/OpenArchive.h \\\n  ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../../Common/MyCom.h \\\n  ../Agent/../Common/../../../Common/MyString.h \\\n  ../Agent/../Common/../../../Common/Buffer.h \\\n  ../Agent/../Common/../../../Common/Defs.h \\\n  ../Agent/../Common/../../../Windows/DLL.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/../../IPassword.h \\\n  ../Agent/../Common/../../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/UpdateCallback.h \\\n  ../Agent/../Common/../Common/UpdatePair.h \\\n  ../Agent/../Common/../Common/DirItem.h \\\n  ../Agent/../Common/../Common/UpdateAction.h \\\n  ../Agent/../Common/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/../Common/UpdateProduce.h \\\n  ../Agent/../Common/../Common/UpdatePair.h \\\n  ../Agent/../Common/UpdatePair.h ../Agent/Agent.h \\\n  ../../../Common/MyCom.h ../Agent/../Common/UpdateAction.h \\\n  ../Agent/IFolderArchive.h ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h ../Agent/../../IDecl.h \\\n  ../Agent/AgentProxy.h ../Agent/../FileManager/IFolder.h \\\n  ../Agent/../Common/LoadCodecs.h ../Agent/UpdateCallbackAgent.h\nAgentProxy.o: ../Agent/AgentProxy.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Agent/AgentProxy.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../Agent/../../Archive/IArchive.h ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/MyWindows.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/Defs.h \\\n  ../Agent/../Common/OpenArchive.h ../../../Common/MyString.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../../Common/MyCom.h \\\n  ../Agent/../Common/../../../Common/MyString.h \\\n  ../Agent/../Common/../../../Common/Buffer.h \\\n  ../Agent/../Common/../../../Common/Defs.h \\\n  ../Agent/../Common/../../ICoder.h ../Agent/../Common/../../IStream.h \\\n  ../Agent/../Common/../../../Windows/DLL.h \\\n  ../Agent/../Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/../../IPassword.h \\\n  ../Agent/../Common/../../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../../../../C/Sort.h \\\n  ../Agent/../../../../C/Types.h\nArchiveFolder.o: ../Agent/ArchiveFolder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/ComTry.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../Agent/../../Common/FileStreams.h \\\n  ../Agent/../../Common/../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../Agent/../../Common/../IStream.h \\\n  ../Agent/../../Common/../../Common/MyUnknown.h \\\n  ../Agent/../../Common/../../Common/MyWindows.h \\\n  ../Agent/../../Common/../../Common/Types.h \\\n  ../Agent/../../Common/../IDecl.h \\\n  ../Agent/../../Common/../../Common/MyCom.h \\\n  ../Agent/../Common/UpdatePair.h ../Agent/../Common/DirItem.h \\\n  ../../../Common/Types.h ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/../../Archive/../IStream.h \\\n  ../Agent/../Common/../../Archive/../IProgress.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../Archive/../../Common/Types.h \\\n  ../Agent/../Common/../../Archive/../IDecl.h \\\n  ../Agent/../Common/../../Archive/../PropID.h \\\n  ../Agent/../Common/UpdateAction.h \\\n  ../Agent/../Common/ArchiveExtractCallback.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/../../Common/FileStreams.h \\\n  ../Agent/../Common/../../Common/ProgressUtils.h \\\n  ../Agent/../Common/../../Common/../../Common/MyCom.h \\\n  ../Agent/../Common/../../Common/../ICoder.h \\\n  ../Agent/../Common/../../Common/../IStream.h \\\n  ../Agent/../Common/../../Common/../IProgress.h \\\n  ../Agent/../Common/../../IPassword.h \\\n  ../Agent/../Common/../../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/Agent.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/UpdateAction.h ../Agent/../Common/OpenArchive.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../../Common/MyCom.h \\\n  ../Agent/../Common/../../../Common/MyString.h \\\n  ../Agent/../Common/../../../Common/Buffer.h \\\n  ../Agent/../Common/../../../Common/Defs.h \\\n  ../Agent/../Common/../../ICoder.h \\\n  ../Agent/../Common/../../../Windows/DLL.h \\\n  ../Agent/../Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/ExtractMode.h ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../IDecl.h ../Agent/AgentProxy.h \\\n  ../Agent/../FileManager/IFolder.h ../Agent/../Common/LoadCodecs.h\nArchiveFolderOpen.o: ../Agent/ArchiveFolderOpen.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Agent/Agent.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Agent/../Common/UpdateAction.h \\\n  ../Agent/../Common/OpenArchive.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/../../Archive/../IStream.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Agent/../Common/../../Archive/../../Common/Types.h \\\n  ../Agent/../Common/../../Archive/../IDecl.h \\\n  ../Agent/../Common/../../Archive/../IProgress.h \\\n  ../Agent/../Common/../../Archive/../PropID.h \\\n  ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../../Common/MyCom.h \\\n  ../Agent/../Common/../../../Common/MyString.h \\\n  ../Agent/../Common/../../../Common/Buffer.h \\\n  ../Agent/../Common/../../../Common/Defs.h \\\n  ../Agent/../Common/../../ICoder.h ../Agent/../Common/../../IStream.h \\\n  ../Agent/../Common/../../../Windows/DLL.h \\\n  ../Agent/../Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/../../IPassword.h \\\n  ../Agent/../Common/../../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h ../Agent/../../IDecl.h \\\n  ../Agent/AgentProxy.h ../../../Common/MyString.h \\\n  ../Agent/../FileManager/IFolder.h ../Agent/../Common/LoadCodecs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h\nArchiveFolderOut.o: ../Agent/ArchiveFolderOut.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Agent/Agent.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Agent/../Common/UpdateAction.h \\\n  ../Agent/../Common/OpenArchive.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/../../Archive/../IStream.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Agent/../Common/../../Archive/../../Common/Types.h \\\n  ../Agent/../Common/../../Archive/../IDecl.h \\\n  ../Agent/../Common/../../Archive/../IProgress.h \\\n  ../Agent/../Common/../../Archive/../PropID.h \\\n  ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../../Common/MyCom.h \\\n  ../Agent/../Common/../../../Common/MyString.h \\\n  ../Agent/../Common/../../../Common/Buffer.h \\\n  ../Agent/../Common/../../../Common/Defs.h \\\n  ../Agent/../Common/../../ICoder.h ../Agent/../Common/../../IStream.h \\\n  ../Agent/../Common/../../../Windows/DLL.h \\\n  ../Agent/../Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/../../IPassword.h \\\n  ../Agent/../Common/../../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h ../Agent/../../IDecl.h \\\n  ../Agent/AgentProxy.h ../../../Common/MyString.h \\\n  ../Agent/../FileManager/IFolder.h ../Agent/../Common/LoadCodecs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/ComTry.h ../../../Windows/FileDir.h \\\n  ../Agent/../Common/ZipRegistry.h ../../../Common/Types.h \\\n  ../Agent/../Common/ExtractMode.h ../Agent/../Common/WorkDir.h \\\n  ../Agent/../Common/ZipRegistry.h\nUpdateCallbackAgent.o: ../Agent/UpdateCallbackAgent.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../Agent/UpdateCallbackAgent.h ../Agent/../Common/UpdateCallback.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../Agent/../Common/../../IPassword.h \\\n  ../Agent/../Common/../../../Common/MyUnknown.h \\\n  ../Agent/../Common/../../../Common/MyWindows.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/../../ICoder.h \\\n  ../Agent/../Common/../../IStream.h \\\n  ../Agent/../Common/../Common/UpdatePair.h \\\n  ../Agent/../Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h \\\n  ../Agent/../Common/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/../Common/../../Archive/../IStream.h \\\n  ../Agent/../Common/../Common/../../Archive/../IProgress.h \\\n  ../Agent/../Common/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../Common/../Common/../../Archive/../../Common/Types.h \\\n  ../Agent/../Common/../Common/../../Archive/../IDecl.h \\\n  ../Agent/../Common/../Common/../../Archive/../PropID.h \\\n  ../Agent/../Common/../Common/UpdateAction.h \\\n  ../Agent/../Common/../Common/UpdateProduce.h \\\n  ../Agent/../Common/../Common/UpdatePair.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h\nApp.o: App.cpp ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h resource.h OverwriteDialogRes.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/COM.h ../../../Common/MyString.h \\\n  ../../../Windows/Error.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Windows/Thread.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h App.h Panel.h ../../../Common/MyCom.h \\\n  ../../../Windows/DLL.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h CopyDialog.h \\\n  ../../../Windows/Control/Dialog.h CopyDialogRes.h ExtractCallback.h \\\n  ../Agent/IFolderArchive.h ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Windows/FileFind.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../Archive/IArchive.h \\\n  ProgressDialog2.h ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/ResourceString.h LangUtils.h ../../../Common/Lang.h \\\n  ../../IPassword.h FormatUtils.h RegistryUtils.h\nwxFM.o: wxFM.cpp ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h /usr/include/wx-2.8/wx/wxprec.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Registry.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Types.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../Explorer/MyMessages.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h RegistryUtils.h \\\n  ../FileManager/ProgramLocation.h ../../../Common/MyString.h \\\n  ../../../myWindows/myPrivate.h\nFM.o: FM.cpp ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h resource.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h ../../../../C/Alloc.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Windows/Error.h ../../../Windows/COM.h ../GUI/ExtractRes.h \\\n  App.h StringUtils.h MyLoadMenu.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyVector.h ../../../Windows/ResourceString.h \\\n  FormatUtils.h ../../../Common/Types.h RegistryUtils.h\nFM_rc.o: FM_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/mimetype.h \\\n  /usr/include/wx-2.8/wx/artprov.h /usr/include/wx-2.8/wx/imaglist.h \\\n  /usr/include/wx-2.8/wx/generic/imaglist.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/icon.h resource.h App.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Control/Dialog.h ../../../../GUI/p7zip_32.xpm \\\n  res/AddPNG.h res/Add2PNG.h res/ExtractPNG.h res/Extract2PNG.h \\\n  res/TestPNG.h res/Test2PNG.h res/CopyPNG.h res/Copy2PNG.h res/MovePNG.h \\\n  res/Move2PNG.h res/DeletePNG.h res/Delete2PNG.h res/InfoPNG.h \\\n  res/Info2PNG.h /usr/include/wx-2.8/wx/mstream.h \\\n  /usr/include/wx-2.8/wx/listctrl.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyVector.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h res/ParentFolder.h\nOpenCallback.o: OpenCallback.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  OpenCallback.h ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../IPassword.h ../../../Common/MyUnknown.h \\\n  ../../../Common/Types.h ../../IDecl.h ../../Archive/IArchive.h \\\n  ../../Archive/../IStream.h ../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/../../Common/Types.h ../../Archive/../IDecl.h \\\n  ../../Archive/../IProgress.h ../../Archive/../PropID.h \\\n  ProgressDialog2.h ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../Common/FileStreams.h \\\n  ../../Common/../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../Common/../IStream.h ../../Common/../../Common/MyCom.h \\\n  PasswordDialog.h ../../../Windows/Control/Edit.h PasswordDialogRes.h\nMyLoadMenu.o: MyLoadMenu.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h ../../PropID.h \\\n  resource.h App.h Panel.h ../../../Common/MyCom.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h ../Common/CompressCall.h \\\n  ../../../Common/MyString.h ../../../Windows/Synchronization.h \\\n  HelpUtils.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Windows/ResourceString.h PluginInterface.h\nPanel.o: Panel.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Thread.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../PropID.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/Static.h ../../../Windows/Control/Edit.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Control/Window2.h \\\n  ../../../Windows/Control/StatusBar.h SysIconUtils.h \\\n  ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h RootFolder.h FSFolder.h TextPairs.h \\\n  FormatUtils.h ../../../Common/Types.h App.h ExtractCallback.h \\\n  ../Agent/IFolderArchive.h ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Windows/FileFind.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../Archive/IArchive.h \\\n  ProgressDialog2.h ProgressDialog2Res.h \\\n  ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/ResourceString.h LangUtils.h ../../../Common/Lang.h \\\n  ../../IPassword.h resource.h ../GUI/ExtractRes.h \\\n  ../Common/CompressCall.h ../../../Windows/Synchronization.h \\\n  ../Common/ArchiveName.h\nPanelCrc.o: PanelCrc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h ../../../../C/Alloc.h ../../../../C/7zCrc.h \\\n  ../../../../C/Types.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/Thread.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Error.h \\\n  ProgressDialog2.h ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Synchronization2.h OverwriteDialogRes.h App.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Windows/DLL.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Control/Static.h ../../../Windows/Control/Edit.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Control/Window2.h \\\n  ../../../Windows/Control/StatusBar.h SysIconUtils.h IFolder.h \\\n  ../../IProgress.h ../../../Common/MyUnknown.h ../../../Common/Types.h \\\n  ../../IDecl.h ViewSettings.h AppState.h FormatUtils.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Windows/ResourceString.h\nPanelCopy.o: PanelCopy.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  Panel.h ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h resource.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyVector.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h ExtractCallback.h \\\n  ../Agent/IFolderArchive.h ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Windows/FileFind.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../Archive/IArchive.h \\\n  ProgressDialog2.h ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Control/ProgressBar.h ../../IPassword.h \\\n  ../../../Windows/Thread.h UpdateCallback100.h\nPanelItems.o: PanelItems.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../PropID.h resource.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Windows/ResourceString.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h PropertyName.h RootFolder.h FSFolder.h \\\n  TextPairs.h ../../../../C/Sort.h ../../../../C/Types.h\nPanelListNotify.o: PanelListNotify.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../Common/PropIDUtils.h \\\n  ../../../Common/MyString.h ../../PropID.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h FormatUtils.h ../../../Common/Types.h\nPanelFolderChange.o: PanelFolderChange.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../PropID.h Panel.h ../../../Common/MyCom.h \\\n  ../../../Windows/DLL.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/Static.h ../../../Windows/Control/Edit.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Control/Window2.h \\\n  ../../../Windows/Control/StatusBar.h SysIconUtils.h \\\n  ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h ListViewDialog.h \\\n  ../../../Windows/Control/Dialog.h ListViewDialogRes.h RootFolder.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h FSFolder.h TextPairs.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Windows/ResourceString.h resource.h\nPanelItemOpen.o: PanelItemOpen.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/mimetype.h \\\n  resource.h ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/AutoPtr.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Thread.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h ExtractCallback.h \\\n  ../Agent/IFolderArchive.h ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/MyWindows.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyWindows.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ../../../Common/MyString.h \\\n  ../Common/ArchiveOpenCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyCom.h ../../../Windows/FileFind.h \\\n  ../Common/../../IPassword.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../Common/../../Archive/IArchive.h ProgressDialog2.h \\\n  ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Defs.h ../../../Windows/ResourceString.h LangUtils.h \\\n  ../../../Common/Lang.h ../../IPassword.h ../../../Common/MyCom.h \\\n  IFolder.h UpdateCallback100.h FileFolderPluginOpen.h FormatUtils.h \\\n  Panel.h ../../../Windows/DLL.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Control/Static.h ../../../Windows/Control/Edit.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Control/Window2.h \\\n  ../../../Windows/Control/StatusBar.h SysIconUtils.h ViewSettings.h \\\n  AppState.h RegistryUtils.h\nPanelMenu.o: PanelMenu.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/COM.h \\\n  ../../../Common/MyString.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/Clipboard.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../Common/PropIDUtils.h ../../../Common/MyString.h ../../PropID.h \\\n  Panel.h ../../../Common/MyCom.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h PluginInterface.h MyLoadMenu.h App.h \\\n  LangUtils.h ../../../Common/Lang.h ../../../Windows/ResourceString.h \\\n  resource.h PropertyName.h PropertyNameRes.h\nPanelOperations.o: PanelOperations.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h Panel.h ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/DynamicBuffer.h \\\n  ../../../Common/Buffer.h ../../../Common/Defs.h \\\n  ../../../Windows/ResourceString.h ../../../Windows/Thread.h \\\n  ../../../Windows/COM.h ComboDialog.h ../../../Windows/Control/Dialog.h \\\n  ComboDialogRes.h FSFolder.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h TextPairs.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Common/MyVector.h FormatUtils.h \\\n  ../../../Common/Types.h UpdateCallback100.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ProgressDialog2.h ProgressDialog2Res.h \\\n  ../../../Windows/Control/ProgressBar.h ../../IPassword.h\nPanelSelect.o: PanelSelect.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Windows/DLL.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/Static.h ../../../Windows/Control/Edit.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Control/Window2.h \\\n  ../../../Windows/Control/StatusBar.h SysIconUtils.h \\\n  ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h ComboDialog.h \\\n  ../../../Windows/Control/Dialog.h ComboDialogRes.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Windows/ResourceString.h\nPanelSort.o: PanelSort.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../PropID.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Control/Window2.h ../../../Windows/Control/StatusBar.h \\\n  SysIconUtils.h ../../../Common/MyString.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  ViewSettings.h AppState.h\nPanelSplitFile.o: PanelSplitFile.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h ../../../../C/Alloc.h ../../../Common/Types.h \\\n  ../../../Common/IntToString.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/Thread.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ProgressDialog2.h ProgressDialog2Res.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Synchronization2.h SplitDialog.h \\\n  ../../../Windows/Control/ComboBox.h SplitDialogRes.h CopyDialog.h \\\n  CopyDialogRes.h ../GUI/ExtractRes.h SplitUtils.h App.h Panel.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Windows/DLL.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/Window2.h \\\n  ../../../Windows/Control/StatusBar.h SysIconUtils.h IFolder.h \\\n  ../../IProgress.h ../../../Common/MyUnknown.h ../../../Common/Types.h \\\n  ../../IDecl.h ViewSettings.h AppState.h FormatUtils.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h\nPropertyName.o: PropertyName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/IntToString.h ../../../Windows/ResourceString.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../PropID.h resource.h PropertyNameRes.h \\\n  LangUtils.h ../../../Common/Lang.h ../../../Common/MyString.h \\\n  PropertyName.h ../../../Common/MyString.h\nRegistryUtils.o: RegistryUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  RegistryUtils.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Registry.h ../../../Common/Buffer.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h\nViewSettings.o: ViewSettings.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h ViewSettings.h \\\n  ../../../Common/MyString.h ../../../Windows/Registry.h \\\n  ../../../Common/Buffer.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nUpdateCallback100.o: UpdateCallback100.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h UpdateCallback100.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/MyWindows.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ProgressDialog2.h ProgressDialog2Res.h \\\n  ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../IPassword.h ../../../Common/MyUnknown.h ../../../Common/Types.h \\\n  ../../IDecl.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Windows/ResourceString.h MessagesDialog.h MessagesDialogRes.h \\\n  ../../../Windows/Control/ListView.h ../../../Common/Defs.h\nRegistryAssociations.o: RegistryAssociations.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h RegistryAssociations.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/IntToString.h ../../../Common/StringToInt.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Registry.h \\\n  ../../../Common/Buffer.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h StringUtils.h\nFileFolderPluginOpen.o: FileFolderPluginOpen.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/DLL.h IFolder.h \\\n  ../../IProgress.h ../../../Common/MyUnknown.h ../../../Common/Types.h \\\n  ../../IDecl.h RegistryAssociations.h ../../../Common/MyString.h \\\n  RegistryPlugins.h OpenCallback.h ../../../Common/MyCom.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../../IPassword.h ../../Archive/IArchive.h ../../Archive/../IStream.h \\\n  ../../Archive/../../Common/MyUnknown.h \\\n  ../../Archive/../../Common/Types.h ../../Archive/../IDecl.h \\\n  ../../Archive/../IProgress.h ../../Archive/../PropID.h \\\n  ProgressDialog2.h ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  PluginLoader.h ../Agent/Agent.h ../../../Common/MyCom.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Agent/../Common/UpdateAction.h \\\n  ../Agent/../Common/OpenArchive.h ../../../Common/MyString.h \\\n  ../../../Windows/FileFind.h ../Agent/../Common/../../Archive/IArchive.h \\\n  ../Agent/../Common/LoadCodecs.h \\\n  ../Agent/../Common/../../../Common/Types.h \\\n  ../Agent/../Common/../../../Common/MyCom.h \\\n  ../Agent/../Common/../../../Common/MyString.h \\\n  ../Agent/../Common/../../../Common/Buffer.h \\\n  ../Agent/../Common/../../../Common/Defs.h \\\n  ../Agent/../Common/../../ICoder.h ../Agent/../Common/../../IStream.h \\\n  ../Agent/../Common/../../../Windows/DLL.h \\\n  ../Agent/../Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../Agent/../Common/../../IPassword.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../Common/IFileExtractCallback.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h ../Agent/../../IDecl.h \\\n  ../Agent/AgentProxy.h ../../../Common/MyString.h \\\n  ../Agent/../FileManager/IFolder.h ../Agent/../Common/LoadCodecs.h\nRootFolder.o: RootFolder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h RootFolder.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h FSFolder.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  TextPairs.h ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../PropID.h ../../../Windows/Defs.h SysIconUtils.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Windows/ResourceString.h \\\n  ../../../Common/MyString.h\nFSFolder.o: FSFolder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  FSFolder.h ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  TextPairs.h ../../../Common/StringConvert.h ../../../Common/MyString.h \\\n  ../../../Common/UTFConvert.h ../../../Common/ComTry.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileDir.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h ../../PropID.h \\\n  SysIconUtils.h\nFSFolderCopy.o: FSFolderCopy.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  FSFolder.h ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h IFolder.h ../../IProgress.h \\\n  ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \\\n  TextPairs.h ../../../Windows/FileDir.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h\nFormatUtils.o: FormatUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  FormatUtils.h ../../../Common/Types.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/ResourceString.h \\\n  ../../../Common/MyString.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h\nSysIconUtils.o: SysIconUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  SysIconUtils.h ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nTextPairs.o: TextPairs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  TextPairs.h ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h\nArchiveName.o: ../Common/ArchiveName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h\nCompressCall.o: ../Common/CompressCall.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../Common/CompressCall.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Common/IntToString.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../Common/../FileManager/ProgramLocation.h ../../../Common/MyString.h \\\n  ../Common/../FileManager/RegistryUtils.h \\\n  ../../../Common/StringConvert.h\nWorkDir.o: ../Common/WorkDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/WorkDir.h ../Common/ZipRegistry.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Types.h ../Common/ExtractMode.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h\nExtractCallback.o: ExtractCallback.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ExtractCallback.h ../Agent/IFolderArchive.h \\\n  ../Agent/../../Archive/IArchive.h ../Agent/../../Archive/../IStream.h \\\n  ../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../Agent/../../Archive/../../Common/MyWindows.h \\\n  ../Agent/../../Archive/../../Common/Types.h \\\n  ../Agent/../../Archive/../IDecl.h ../Agent/../../Archive/../IProgress.h \\\n  ../Agent/../../Archive/../PropID.h \\\n  ../Agent/../../UI/FileManager/IFolder.h \\\n  ../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../Agent/../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../Agent/../Common/../../IDecl.h ../Agent/../Common/ExtractMode.h \\\n  ../Agent/../../UI/Common/LoadCodecs.h \\\n  ../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../Agent/../../UI/Common/../../../Common/MyWindows.h \\\n  ../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../Agent/../../UI/Common/../../ICoder.h \\\n  ../Agent/../../UI/Common/../../IStream.h \\\n  ../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../Agent/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../Agent/../../IDecl.h ../../../Common/MyString.h \\\n  ../Common/ArchiveOpenCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyCom.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../Archive/IArchive.h \\\n  ProgressDialog2.h ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/ResourceString.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h ../../IPassword.h ../../../Common/MyCom.h \\\n  IFolder.h ../../../Windows/Error.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileDir.h OverwriteDialog.h OverwriteDialogRes.h \\\n  PasswordDialog.h ../../../Windows/Control/Edit.h PasswordDialogRes.h \\\n  MessagesDialog.h MessagesDialogRes.h \\\n  ../../../Windows/Control/ListView.h ../GUI/ExtractRes.h \\\n  ../GUI/resource.h ../../../Common/Wildcard.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  FormatUtils.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h\nProgramLocation.o: ProgramLocation.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ProgramLocation.h ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h\nCopyDialog.o: CopyDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  CopyDialog.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Defs.h CopyDialogRes.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Windows/Control/Static.h ../../../Windows/Shell.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  LangUtils.h ../../../Common/Lang.h ../../../Windows/ResourceString.h\nCopyDialog_rc.o: CopyDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  CopyDialogRes.h\nListViewDialog.o: ListViewDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ListViewDialog.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Defs.h ListViewDialogRes.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h\nListViewDialog_rc.o: ListViewDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  ListViewDialogRes.h\nSplitDialog.o: SplitDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  SplitDialog.h ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Defs.h SplitDialogRes.h ../../../Common/StringToInt.h \\\n  ../../../Windows/Shell.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h SplitUtils.h \\\n  ../../../Common/MyString.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h ../../../Windows/ResourceString.h \\\n  CopyDialogRes.h\nSplitDialog_rc.o: SplitDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  SplitDialogRes.h\nSplitUtils.o: SplitUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringToInt.h SplitUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Types.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Windows/Defs.h StringUtils.h\nStringUtils.o: StringUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  StringUtils.h ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nProgressDialog2.o: ProgressDialog2.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h ProgressDialog2.h ProgressDialog2Res.h \\\n  ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Common/IntToString.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h ../../../Windows/ResourceString.h\nProgressDialog2_rc.o: ProgressDialog2_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ProgressDialog2Res.h \\\n  ../../../Windows/Control/DialogImpl.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/Dialog.h\nMessagesDialog.o: MessagesDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  MessagesDialog.h MessagesDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/IntToString.h ../../../Windows/ResourceString.h \\\n  LangUtils.h ../../../Common/Lang.h\nMessagesDialog_rc.o: MessagesDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  MessagesDialogRes.h\nComboDialog.o: ComboDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ComboDialog.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Defs.h ComboDialogRes.h \\\n  ../../../Windows/Control/Static.h LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h ../../../Windows/ResourceString.h\nComboDialog_rc.o: ComboDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  ComboDialogRes.h\nOverwriteDialog.o: OverwriteDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  OverwriteDialog.h OverwriteDialogRes.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/ResourceString.h ../../../Windows/Control/Static.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariantConversions.h \\\n  ../../../Common/Types.h FormatUtils.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h LangUtils.h ../../../Common/Lang.h\nOverwriteDialog_rc.o: OverwriteDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h OverwriteDialogRes.h \\\n  ../../../Windows/Control/DialogImpl.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/Dialog.h\nPasswordDialog.o: PasswordDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  PasswordDialog.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Edit.h \\\n  ../../../Windows/Defs.h PasswordDialogRes.h LangUtils.h \\\n  ../../../Common/Lang.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h\nPasswordDialog_rc.o: PasswordDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  PasswordDialogRes.h\nArchiveExtractCallback.o: ../Common/ArchiveExtractCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../IProgress.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/ExtractMode.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/ComTry.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../Common/../../Common/FilePathAutoRename.h \\\n  ../Common/../Common/ExtractingFilePath.h ../Common/OpenArchive.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyString.h \\\n  ../Common/../../../Common/Buffer.h ../Common/../../../Common/Defs.h \\\n  ../Common/../../ICoder.h ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/ArchiveOpenCallback.h\nArchiveOpenCallback.o: ../Common/ArchiveOpenCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/MyWindows.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/ComTry.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h\nDefaultName.o: ../Common/DefaultName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/DefaultName.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nEnumDirItems.o: ../Common/EnumDirItems.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyCom.h ../Common/EnumDirItems.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h ../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h\nLoadCodecs.o: ../Common/LoadCodecs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyWindows.h \\\n  ../Common/../../../Common/MyString.h \\\n  ../Common/../../../Common/MyVector.h ../Common/../../../Common/Defs.h \\\n  ../Common/../../../Common/Buffer.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h ../Common/../../Archive/../PropID.h \\\n  ../Common/../../../Common/StringToInt.h \\\n  ../Common/../../../Common/Types.h \\\n  ../Common/../../../Windows/PropVariant.h \\\n  ../Common/../../../Windows/../Common/MyWindows.h \\\n  ../Common/../../../Windows/../Common/Types.h \\\n  ../Common/../../Common/RegisterArc.h \\\n  ../Common/../../Common/../Archive/IArchive.h \\\n  ../Common/../../../Windows/FileFind.h \\\n  ../Common/../../../Windows/FileName.h ../Common/../../../Windows/Defs.h \\\n  ../Common/../../../Windows/ResourceString.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nOpenArchive.o: ../Common/OpenArchive.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/OpenArchive.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/LoadCodecs.h \\\n  ../Common/../../../Common/Types.h ../Common/../../../Common/MyCom.h \\\n  ../Common/../../../Common/MyWindows.h \\\n  ../Common/../../../Common/MyString.h ../Common/../../../Common/Buffer.h \\\n  ../Common/../../../Common/Defs.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../Common/../../IPassword.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/StreamUtils.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../Common/DefaultName.h\nZipRegistry.o: ../Common/ZipRegistry.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/ZipRegistry.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Types.h ../Common/ExtractMode.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Registry.h \\\n  ../../../Common/Buffer.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h\nExtractingFilePath.o: ../Common/ExtractingFilePath.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/ExtractingFilePath.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nPropIDUtils.o: ../Common/PropIDUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/PropIDUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../Common/../../PropID.h\nSortUtils.o: ../Common/SortUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/SortUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nUpdateAction.o: ../Common/UpdateAction.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/UpdateAction.h\nUpdateCallback.o: ../Common/UpdateCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/UpdateCallback.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/MyWindows.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../Common/UpdatePair.h \\\n  ../Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/../Common/../../Archive/IArchive.h \\\n  ../Common/../Common/../../Archive/../IStream.h \\\n  ../Common/../Common/../../Archive/../IProgress.h \\\n  ../Common/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../Common/../../Archive/../IDecl.h \\\n  ../Common/../Common/../../Archive/../PropID.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h\nUpdatePair.o: ../Common/UpdatePair.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Time.h ../../../Common/Types.h \\\n  ../Common/UpdatePair.h ../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/UpdateAction.h \\\n  ../Common/SortUtils.h\nUpdateProduce.o: ../Common/UpdateProduce.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/UpdateProduce.h ../Common/UpdatePair.h ../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/UpdateAction.h\nFilePathAutoRename.o: ../../Common/FilePathAutoRename.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h\nFileStreams.o: ../../Common/FileStreams.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FileStreams.h ../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h\nProgressUtils.o: ../../Common/ProgressUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/ProgressUtils.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../IProgress.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nTextConfig.o: ../../../Common/TextConfig.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/TextConfig.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/UTFConvert.h\nUTFConvert.o: ../../../Common/UTFConvert.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nCopyCoder.o: ../../Compress/CopyCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/CopyCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nStringToInt.o: ../../../Common/StringToInt.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringToInt.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nDLL.o: ../../../Windows/DLL.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nError.o: ../../../Windows/Error.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileName.o: ../../../Windows/FileName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantConversions.o: ../../../Windows/PropVariantConversions.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h\nRegistry.o: ../../../Windows/Registry.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Registry.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Types.h \\\n  /usr/include/wx-2.8/wx/config.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/confbase.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/fileconf.h \\\n  /usr/include/wx-2.8/wx/textfile.h /usr/include/wx-2.8/wx/textbuf.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/convauto.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/file.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/msgout.h\nSynchronization.o: ../../../Windows/Synchronization.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nTime.o: ../../../Windows/Time.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h\nClipboard.o: ../../../Windows/Clipboard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Clipboard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h /usr/include/wx-2.8/wx/clipbrd.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/memory.h /usr/include/wx-2.8/wx/string.h \\\n  /usr/include/wx-2.8/wx/buffer.h /usr/include/wx-2.8/wx/strconv.h \\\n  /usr/include/wx-2.8/wx/fontenc.h /usr/include/wx-2.8/wx/beforestd.h \\\n  /usr/include/wx-2.8/wx/afterstd.h /usr/include/wx-2.8/wx/iosfwrap.h \\\n  /usr/include/wx-2.8/wx/msgout.h /usr/include/wx-2.8/wx/gtk/clipbrd.h \\\n  /usr/include/wx-2.8/wx/dataobj.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hashmap.h /usr/include/wx-2.8/wx/math.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/variant.h /usr/include/wx-2.8/wx/arrstr.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/longlong.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h\nSystem.o: ../../../Windows/System.cpp ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h\nWindow.o: ../../../Windows/Window.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nDialog.o: ../../../Windows/Control/Dialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h\nControls.o: ../../../Windows/Control/Controls.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h /usr/include/wx-2.8/wx/wxprec.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/imaglist.h \\\n  /usr/include/wx-2.8/wx/generic/imaglist.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/listctrl.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Control/StatusBar.h \\\n  ../../../Windows/Control/ListView.h\nWindow2.o: ../../../Windows/Control/Window2.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Control/Window2.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h\nLangUtils.o: LangUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  LangUtils.h ../../../Common/Lang.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/StringToInt.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h RegistryUtils.h ProgramLocation.h \\\n  ../../../Common/MyString.h\nLang.o: ../../../Common/Lang.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Lang.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/TextConfig.h ../../../Common/../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/UTFConvert.h\nCRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/../../C/7zCrc.h ../../../Common/../../C/Types.h\nwine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nwine_GetXXXDefaultLangID.o:  \\\n ../../../myWindows/wine_GetXXXDefaultLangID.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/makefile.list",
    "content": "SRCS=\\\nClassDefs.cpp \\\n../Agent/Agent.cpp \\\n../Agent/AgentOut.cpp \\\n../Agent/AgentProxy.cpp \\\n../Agent/ArchiveFolder.cpp \\\n../Agent/ArchiveFolderOpen.cpp \\\n../Agent/ArchiveFolderOut.cpp \\\n../Agent/UpdateCallbackAgent.cpp \\\n\tApp.cpp \\\n\twxFM.cpp \\\n\tFM.cpp \\\n\tFM_rc.cpp \\\n\tOpenCallback.cpp \\\n\tMyLoadMenu.cpp \\\n\tPanel.cpp \\\n\tPanelCrc.cpp \\\n\tPanelCopy.cpp \\\n\tPanelItems.cpp \\\n\tPanelListNotify.cpp \\\n\tPanelFolderChange.cpp \\\n\tPanelItemOpen.cpp \\\n\tPanelMenu.cpp \\\n\tPanelOperations.cpp \\\n\tPanelSelect.cpp \\\n\tPanelSort.cpp \\\n\tPanelSplitFile.cpp \\\n\tPropertyName.cpp \\\n\tRegistryUtils.cpp \\\n\tViewSettings.cpp \\\n\tUpdateCallback100.cpp \\\n\tRegistryAssociations.cpp \\\n\tFileFolderPluginOpen.cpp \\\n\tRootFolder.cpp \\\n\tFSFolder.cpp \\\n\tFSFolderCopy.cpp \\\n\tFormatUtils.cpp \\\n\tSysIconUtils.cpp \\\n\tTextPairs.cpp \\\n\t../Common/ArchiveName.cpp \\\n\t../Common/CompressCall.cpp \\\n\t../Common/WorkDir.cpp \\\n\tExtractCallback.cpp \\\n\tProgramLocation.cpp \\\n\tCopyDialog.cpp \\\n\tCopyDialog_rc.cpp \\\n\tListViewDialog.cpp \\\n\tListViewDialog_rc.cpp \\\n\tSplitDialog.cpp \\\n\tSplitDialog_rc.cpp \\\n\tSplitUtils.cpp \\\n\tStringUtils.cpp \\\n\tProgressDialog2.cpp \\\n\tProgressDialog2_rc.cpp \\\n\tMessagesDialog.cpp \\\n\tMessagesDialog_rc.cpp \\\n\tComboDialog.cpp \\\n\tComboDialog_rc.cpp \\\n\tOverwriteDialog.cpp \\\n\tOverwriteDialog_rc.cpp \\\n\tPasswordDialog.cpp \\\n\tPasswordDialog_rc.cpp \\\n\t../Common/ArchiveExtractCallback.cpp \\\n\t../Common/ArchiveOpenCallback.cpp \\\n\t../Common/DefaultName.cpp \\\n\t../Common/EnumDirItems.cpp \\\n\t../Common/LoadCodecs.cpp \\\n\t../Common/OpenArchive.cpp \\\n\t../Common/ZipRegistry.cpp \\\n\t../Common/ExtractingFilePath.cpp \\\n\t../Common/PropIDUtils.cpp \\\n\t../Common/SortUtils.cpp \\\n\t../Common/UpdateAction.cpp \\\n\t../Common/UpdateCallback.cpp \\\n\t../Common/UpdatePair.cpp \\\n\t../Common/UpdateProduce.cpp \\\n\t../../Common/FilePathAutoRename.cpp \\\n\t../../Common/FileStreams.cpp \\\n\t../../Common/ProgressUtils.cpp \\\n\t../../Common/StreamUtils.cpp \\\n\t../../../Common/TextConfig.cpp \\\n\t../../../Common/UTFConvert.cpp \\\n\t../../Compress/CopyCoder.cpp \\\n\t../../../Common/MyString.cpp \\\n\t../../../Common/MyVector.cpp \\\n\t../../../Common/StringConvert.cpp \\\n\t../../../Common/StringToInt.cpp \\\n\t../../../Common/MyWindows.cpp \\\n\t../../../Common/Wildcard.cpp \\\n\t../../../Windows/DLL.cpp \\\n\t../../../Windows/Error.cpp \\\n\t../../../Windows/FileDir.cpp \\\n\t../../../Windows/FileFind.cpp \\\n\t../../../Windows/FileIO.cpp \\\n\t../../../Windows/FileName.cpp \\\n\t../../../Windows/PropVariant.cpp \\\n\t../../../Windows/PropVariantConversions.cpp \\\n\t../../../Windows/Registry.cpp \\\n\t../../../Windows/Synchronization.cpp \\\n\t../../../Windows/Time.cpp \\\n\t../../../Windows/Clipboard.cpp \\\n\t../../../Windows/System.cpp \\\n\t../../../Windows/Window.cpp \\\n\t../../../Windows/Control/Dialog.cpp \\\n\t../../../Windows/Control/Controls.cpp \\\n\t../../../Windows/Control/Window2.cpp \\\n\tLangUtils.cpp \\\n\t../../../Common/Lang.cpp \\\n\t../../../Common/CRC.cpp \\\n\t../../../myWindows/wine_date_and_time.cpp \\\n\t../../../myWindows/wine_GetXXXDefaultLangID.cpp\n\nSRCS_OUT=\\\n\tOpenCallbackGUI.cpp \\\n\tUpdateCallbackGUI.cpp \\\n\tUpdateGUI.cpp \\\n\t../Common/ArchiveCommandLine.cpp \\\n\t../Common/Extract.cpp \\\n\t../Common/SetProperties.cpp \\\n\t../Common/TempFiles.cpp \\\n\t../Common/Update.cpp \\\n\t../Explorer/MyMessages.cpp \\\n\t../../../Common/CommandLineParser.cpp \\\n\t../../../Common/IntToString.cpp \\\n\t../../../Common/ListFileUtils.cpp \\\n\t../../../myWindows/myGetTickCount.cpp \\\n\n\nSRCS_C=\\\n\t../../../../C/7zCrc.c \\\n\t../../../../C/Sort.c \\\n\t../../../../C/Threads.c\n\n##############################################################\nClassDefs.o : ClassDefs.cpp\n\t$(CXX) $(CXXFLAGS) ClassDefs.cpp\nAgent.o : ../Agent/Agent.cpp\n\t$(CXX) $(CXXFLAGS) ../Agent/Agent.cpp\nAgentOut.o : ../Agent/AgentOut.cpp\n\t$(CXX) $(CXXFLAGS) ../Agent/AgentOut.cpp\nAgentProxy.o : ../Agent/AgentProxy.cpp\n\t$(CXX) $(CXXFLAGS) ../Agent/AgentProxy.cpp\nArchiveFolder.o : ../Agent/ArchiveFolder.cpp\n\t$(CXX) $(CXXFLAGS) ../Agent/ArchiveFolder.cpp\nArchiveFolderOpen.o : ../Agent/ArchiveFolderOpen.cpp\n\t$(CXX) $(CXXFLAGS) ../Agent/ArchiveFolderOpen.cpp\nArchiveFolderOut.o : ../Agent/ArchiveFolderOut.cpp\n\t$(CXX) $(CXXFLAGS) ../Agent/ArchiveFolderOut.cpp\nUpdateCallbackAgent.o : ../Agent/UpdateCallbackAgent.cpp\n\t$(CXX) $(CXXFLAGS) ../Agent/UpdateCallbackAgent.cpp\n##############################################################\n\nCompressDialog.o : CompressDialog.cpp\n\t$(CXX) $(CXXFLAGS) CompressDialog.cpp\nCompressDialog_rc.o : CompressDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) CompressDialog_rc.cpp\nExtractDialog.o : ExtractDialog.cpp\n\t$(CXX) $(CXXFLAGS) ExtractDialog.cpp\nExtractDialog_rc.o : ExtractDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) ExtractDialog_rc.cpp\nBenchmarkDialog.o : BenchmarkDialog.cpp\n\t$(CXX) $(CXXFLAGS) BenchmarkDialog.cpp\nBenchmarkDialog_rc.o : BenchmarkDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) BenchmarkDialog_rc.cpp\nExtractGUI.o : ExtractGUI.cpp\n\t$(CXX) $(CXXFLAGS) ExtractGUI.cpp\nApp.o : App.cpp\n\t$(CXX) $(CXXFLAGS) App.cpp\nwxFM.o : wxFM.cpp\n\t$(CXX) $(CXXFLAGS) wxFM.cpp\nFM.o : FM.cpp\n\t$(CXX) $(CXXFLAGS) FM.cpp\nFM_rc.o : FM_rc.cpp\n\t$(CXX) $(CXXFLAGS) FM_rc.cpp\nOpenCallback.o : OpenCallback.cpp\n\t$(CXX) $(CXXFLAGS) OpenCallback.cpp\nMyLoadMenu.o : MyLoadMenu.cpp\n\t$(CXX) $(CXXFLAGS) MyLoadMenu.cpp\nPanel.o : Panel.cpp\n\t$(CXX) $(CXXFLAGS) Panel.cpp\nPanelCrc.o : PanelCrc.cpp\n\t$(CXX) $(CXXFLAGS) PanelCrc.cpp\nPanelCopy.o : PanelCopy.cpp\n\t$(CXX) $(CXXFLAGS) PanelCopy.cpp\nPanelItems.o : PanelItems.cpp\n\t$(CXX) $(CXXFLAGS) PanelItems.cpp\nPanelListNotify.o : PanelListNotify.cpp\n\t$(CXX) $(CXXFLAGS) PanelListNotify.cpp\nPanelFolderChange.o : PanelFolderChange.cpp\n\t$(CXX) $(CXXFLAGS) PanelFolderChange.cpp\nPanelItemOpen.o : PanelItemOpen.cpp\n\t$(CXX) $(CXXFLAGS) PanelItemOpen.cpp\nPanelMenu.o : PanelMenu.cpp\n\t$(CXX) $(CXXFLAGS) PanelMenu.cpp\nPanelOperations.o : PanelOperations.cpp\n\t$(CXX) $(CXXFLAGS) PanelOperations.cpp\nPanelSelect.o : PanelSelect.cpp\n\t$(CXX) $(CXXFLAGS) PanelSelect.cpp\nPanelSort.o : PanelSort.cpp\n\t$(CXX) $(CXXFLAGS) PanelSort.cpp\nPanelSplitFile.o : PanelSplitFile.cpp\n\t$(CXX) $(CXXFLAGS) PanelSplitFile.cpp\nPropertyName.o : PropertyName.cpp\n\t$(CXX) $(CXXFLAGS) PropertyName.cpp\nRegistryUtils.o : RegistryUtils.cpp\n\t$(CXX) $(CXXFLAGS) RegistryUtils.cpp\nUpdateCallback100.o : UpdateCallback100.cpp\n\t$(CXX) $(CXXFLAGS) UpdateCallback100.cpp\nViewSettings.o : ViewSettings.cpp\n\t$(CXX) $(CXXFLAGS) ViewSettings.cpp\nRegistryAssociations.o : RegistryAssociations.cpp\n\t$(CXX) $(CXXFLAGS) RegistryAssociations.cpp\nFileFolderPluginOpen.o : FileFolderPluginOpen.cpp\n\t$(CXX) $(CXXFLAGS) FileFolderPluginOpen.cpp\nRootFolder.o : RootFolder.cpp\n\t$(CXX) $(CXXFLAGS) RootFolder.cpp\nFSFolder.o : FSFolder.cpp\n\t$(CXX) $(CXXFLAGS) FSFolder.cpp\nFSFolderCopy.o : FSFolderCopy.cpp\n\t$(CXX) $(CXXFLAGS) FSFolderCopy.cpp\nFormatUtils.o : FormatUtils.cpp\n\t$(CXX) $(CXXFLAGS) FormatUtils.cpp\nSysIconUtils.o : SysIconUtils.cpp\n\t$(CXX) $(CXXFLAGS) SysIconUtils.cpp\nTextPairs.o : TextPairs.cpp\n\t$(CXX) $(CXXFLAGS) TextPairs.cpp\nOpenCallbackGUI.o : OpenCallbackGUI.cpp\n\t$(CXX) $(CXXFLAGS) OpenCallbackGUI.cpp\nUpdateCallbackGUI.o : UpdateCallbackGUI.cpp\n\t$(CXX) $(CXXFLAGS) UpdateCallbackGUI.cpp\nUpdateGUI.o : UpdateGUI.cpp\n\t$(CXX) $(CXXFLAGS) UpdateGUI.cpp\nArchiveCommandLine.o : ../Common/ArchiveCommandLine.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ArchiveCommandLine.cpp\nArchiveExtractCallback.o : ../Common/ArchiveExtractCallback.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ArchiveExtractCallback.cpp\nArchiveOpenCallback.o : ../Common/ArchiveOpenCallback.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ArchiveOpenCallback.cpp\nDefaultName.o : ../Common/DefaultName.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/DefaultName.cpp\nEnumDirItems.o : ../Common/EnumDirItems.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/EnumDirItems.cpp\nExtract.o : ../Common/Extract.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/Extract.cpp\nExtractingFilePath.o : ../Common/ExtractingFilePath.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ExtractingFilePath.cpp\nLoadCodecs.o : ../Common/LoadCodecs.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/LoadCodecs.cpp\nOpenArchive.o : ../Common/OpenArchive.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/OpenArchive.cpp\nPropIDUtils.o : ../Common/PropIDUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/PropIDUtils.cpp\nSetProperties.o : ../Common/SetProperties.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/SetProperties.cpp\nSortUtils.o : ../Common/SortUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/SortUtils.cpp\nTempFiles.o : ../Common/TempFiles.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/TempFiles.cpp\nUpdate.o : ../Common/Update.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/Update.cpp\nUpdateAction.o : ../Common/UpdateAction.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdateAction.cpp\nUpdateCallback.o : ../Common/UpdateCallback.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdateCallback.cpp\nUpdatePair.o : ../Common/UpdatePair.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdatePair.cpp\nUpdateProduce.o : ../Common/UpdateProduce.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdateProduce.cpp\nWorkDir.o : ../Common/WorkDir.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/WorkDir.cpp\nArchiveName.o : ../Common/ArchiveName.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ArchiveName.cpp\nCompressCall.o : ../Common/CompressCall.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/CompressCall.cpp\nZipRegistry.o : ../Common/ZipRegistry.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ZipRegistry.cpp\nMyMessages.o : ../Explorer/MyMessages.cpp\n\t$(CXX) $(CXXFLAGS) ../Explorer/MyMessages.cpp\nProgramLocation.o : ProgramLocation.cpp\n\t$(CXX) $(CXXFLAGS) ProgramLocation.cpp\nComboDialog.o : ComboDialog.cpp\n\t$(CXX) $(CXXFLAGS) ComboDialog.cpp\nComboDialog_rc.o : ComboDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) ComboDialog_rc.cpp\nCopyDialog.o : CopyDialog.cpp\n\t$(CXX) $(CXXFLAGS) CopyDialog.cpp\nCopyDialog_rc.o : CopyDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) CopyDialog_rc.cpp\nListViewDialog.o : ListViewDialog.cpp\n\t$(CXX) $(CXXFLAGS) ListViewDialog.cpp\nListViewDialog_rc.o : ListViewDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) ListViewDialog_rc.cpp\nSplitDialog.o : SplitDialog.cpp\n\t$(CXX) $(CXXFLAGS) SplitDialog.cpp\nSplitDialog_rc.o : SplitDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) SplitDialog_rc.cpp\nSplitUtils.o : SplitUtils.cpp\n\t$(CXX) $(CXXFLAGS) SplitUtils.cpp\nProgressDialog2.o : ProgressDialog2.cpp\n\t$(CXX) $(CXXFLAGS) ProgressDialog2.cpp\nProgressDialog2_rc.o : ProgressDialog2_rc.cpp\n\t$(CXX) $(CXXFLAGS) ProgressDialog2_rc.cpp\nMessagesDialog.o : MessagesDialog.cpp\n\t$(CXX) $(CXXFLAGS) MessagesDialog.cpp\nMessagesDialog_rc.o : MessagesDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) MessagesDialog_rc.cpp\nOverwriteDialog.o : OverwriteDialog.cpp\n\t$(CXX) $(CXXFLAGS) OverwriteDialog.cpp\nOverwriteDialog_rc.o : OverwriteDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) OverwriteDialog_rc.cpp\nPasswordDialog.o : PasswordDialog.cpp\n\t$(CXX) $(CXXFLAGS) PasswordDialog.cpp\nPasswordDialog_rc.o : PasswordDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) PasswordDialog_rc.cpp\nExtractCallback.o : ExtractCallback.cpp\n\t$(CXX) $(CXXFLAGS) ExtractCallback.cpp\nStringUtils.o : StringUtils.cpp\n\t$(CXX) $(CXXFLAGS) StringUtils.cpp\nLangUtils.o : LangUtils.cpp\n\t$(CXX) $(CXXFLAGS) LangUtils.cpp\nFilePathAutoRename.o : ../../Common/FilePathAutoRename.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/FilePathAutoRename.cpp\nFileStreams.o : ../../Common/FileStreams.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/FileStreams.cpp\nProgressUtils.o : ../../Common/ProgressUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/ProgressUtils.cpp\nStreamUtils.o : ../../Common/StreamUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/StreamUtils.cpp\nCopyCoder.o : ../../Compress/CopyCoder.cpp\n\t$(CXX) $(CXXFLAGS) ../../Compress/CopyCoder.cpp\nLzmaBench.o : ../../Compress/LZMA_Alone/LzmaBench.cpp\n\t$(CXX) $(CXXFLAGS) ../../Compress/LZMA_Alone/LzmaBench.cpp\nCommandLineParser.o : ../../../Common/CommandLineParser.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/CommandLineParser.cpp\nCRC.o : ../../../Common/CRC.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/CRC.cpp\nIntToString.o : ../../../Common/IntToString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/IntToString.cpp\nLang.o : ../../../Common/Lang.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/Lang.cpp\nListFileUtils.o : ../../../Common/ListFileUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/ListFileUtils.cpp\nMyString.o : ../../../Common/MyString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyString.cpp\nMyVector.o : ../../../Common/MyVector.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyVector.cpp\nStringConvert.o : ../../../Common/StringConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringConvert.cpp\nStringToInt.o : ../../../Common/StringToInt.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringToInt.cpp\nTextConfig.o : ../../../Common/TextConfig.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/TextConfig.cpp\nUTFConvert.o : ../../../Common/UTFConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/UTFConvert.cpp\nWildcard.o : ../../../Common/Wildcard.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/Wildcard.cpp\nDLL.o : ../../../Windows/DLL.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/DLL.cpp\nError.o : ../../../Windows/Error.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Error.cpp\nFileDir.o : ../../../Windows/FileDir.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileDir.cpp\nFileFind.o : ../../../Windows/FileFind.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileFind.cpp\nFileIO.o : ../../../Windows/FileIO.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileIO.cpp\nFileName.o : ../../../Windows/FileName.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileName.cpp\nPropVariant.o : ../../../Windows/PropVariant.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/PropVariant.cpp\nPropVariantConversions.o : ../../../Windows/PropVariantConversions.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/PropVariantConversions.cpp\nRegistry.o : ../../../Windows/Registry.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Registry.cpp\nSynchronization.o : ../../../Windows/Synchronization.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Synchronization.cpp\nTime.o : ../../../Windows/Time.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Time.cpp\nClipboard.o : ../../../Windows/Clipboard.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Clipboard.cpp\nSystem.o : ../../../Windows/System.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/System.cpp\nWindow.o : ../../../Windows/Window.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Window.cpp\nDialog.o : ../../../Windows/Control/Dialog.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Control/Dialog.cpp\nControls.o : ../../../Windows/Control/Controls.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Control/Controls.cpp\nWindow2.o : ../../../Windows/Control/Window2.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Control/Window2.cpp\nMyWindows.o : ../../../Common/MyWindows.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyWindows.cpp\nmyGetTickCount.o : ../../../myWindows/myGetTickCount.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/myGetTickCount.cpp\nwine_date_and_time.o : ../../../myWindows/wine_date_and_time.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/wine_date_and_time.cpp\nwine_GetXXXDefaultLangID.o : ../../../myWindows/wine_GetXXXDefaultLangID.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/wine_GetXXXDefaultLangID.cpp\nSort.o : ../../../../C/Sort.c\n\t$(CC) $(CFLAGS) ../../../../C/Sort.c\nThreads.o : ../../../../C/Threads.c\n\t$(CC) $(CFLAGS) ../../../../C/Threads.c\n\n# CRC32, C version\n7zCrc.o : ../../../../C/7zCrc.c\n\t$(CC) $(CFLAGS) ../../../../C/7zCrc.c\n# CRC32, ASM version\n7zCrcT8.o : ../../../../C/7zCrcT8.c\n\t$(CC) $(CFLAGS) ../../../../C/7zCrcT8.c\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/Add2PNG.h",
    "content": "static const unsigned char ADD2_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x12, 0x59, 0x20, 0xcb, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x3b, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x60, 0xc0, 0x0b, 0x78, 0xef, 0xde, \n0xbd, 0x8b, 0xe0, 0xac, 0x5a, 0xb5, 0xb6, 0x80, 0x6c, 0x0e, 0xc8, 0x28, \n0x20, 0x07, 0x62, 0x20, 0x50, 0x18, 0x02, 0x40, 0x92, 0x64, 0x71, 0xe0, \n0xa6, 0x81, 0x4c, 0x2f, 0x2f, 0x2f, 0x07, 0x72, 0x80, 0x64, 0x01, 0xf9, \n0x0e, 0x85, 0x1a, 0x05, 0x01, 0x70, 0xa3, 0x70, 0x01, 0x00, 0x61, 0xed, \n0x52, 0x81, 0x19, 0x73, 0x26, 0x18, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, \n0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/AddPNG.h",
    "content": "static const unsigned char ADD_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x6b, 0xa4, 0x39, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x4d, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x60, 0xa0, 0x01, 0xe0, 0xbd, 0x0b, \n0x04, 0x17, 0xb0, 0x49, 0xac, 0x02, 0x82, 0xeb, 0x43, 0x5b, 0x02, 0xe4, \n0xb7, 0xbb, 0x20, 0x09, 0x30, 0x03, 0x49, 0xe2, 0xd6, 0x2a, 0x24, 0xb0, \n0xb6, 0x60, 0xc8, 0x4a, 0xa0, 0x7a, 0x10, 0x49, 0x82, 0xbd, 0xbc, 0xbc, \n0xbc, 0x16, 0x1c, 0x24, 0x40, 0x46, 0x39, 0x92, 0x04, 0xe9, 0x81, 0x38, \n0xf0, 0x12, 0x20, 0xbf, 0x61, 0x93, 0x60, 0x00, 0xf9, 0xad, 0x1c, 0x9b, \n0x04, 0xcd, 0x00, 0x00, 0xa3, 0xbb, 0xae, 0x61, 0x7b, 0x93, 0x6d, 0x0f, \n0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, \n0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/Copy2PNG.h",
    "content": "static const unsigned char COPY2_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x12, 0x59, 0x20, 0xcb, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x52, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x95, 0xce, 0x31, 0x0a, 0xc0, 0x30, 0x08, \n0x40, 0x51, 0xb7, 0xdc, 0xd4, 0x4d, 0x70, 0xf3, 0x9a, 0x99, 0xec, 0xe4, \n0x5d, 0x9a, 0x18, 0x68, 0xff, 0x1a, 0xc9, 0xf2, 0x79, 0x22, 0x11, 0xb9, \n0x9a, 0xc9, 0x28, 0x46, 0x92, 0xd2, 0x18, 0xda, 0x54, 0xb5, 0x5e, 0xa5, \n0xda, 0x59, 0xf0, 0xd4, 0x3d, 0x93, 0x61, 0x8c, 0x4d, 0xbf, 0x38, 0xe2, \n0xe9, 0x6b, 0x7e, 0xae, 0x2d, 0x90, 0x11, 0x3e, 0x22, 0xb2, 0xe1, 0xfb, \n0x81, 0x23, 0x00, 0x52, 0x00, 0x21, 0x5c, 0xcd, 0x0b, 0x7e, 0x4c, 0x37, \n0xbb, 0x3f, 0x86, 0x84, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, \n0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/CopyPNG.h",
    "content": "static const unsigned char COPY_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x6b, 0xa4, 0x39, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x80, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0xbd, 0xd1, 0x31, 0x0e, 0x80, 0x20, 0x0c, \n0x85, 0xe1, 0x6e, 0x4e, 0x5c, 0x93, 0x8d, 0xa4, 0x1b, 0xd7, 0x64, 0x2a, \n0x53, 0xef, 0xe2, 0x43, 0x23, 0x12, 0xed, 0x5b, 0xe9, 0x60, 0x62, 0x7e, \n0xbf, 0x00, 0x22, 0xb2, 0x7d, 0x1a, 0x0b, 0xce, 0x82, 0x31, 0x62, 0x85, \n0x85, 0x4c, 0x88, 0x65, 0x42, 0x2c, 0x13, 0x82, 0x10, 0x13, 0x84, 0x85, \n0x24, 0x77, 0xec, 0xdf, 0xc7, 0x8c, 0xf0, 0x92, 0x84, 0x17, 0xbd, 0x3e, \n0xbe, 0xa7, 0xb1, 0x50, 0x58, 0x98, 0xe4, 0x17, 0x0a, 0x0b, 0x9d, 0xad, \n0xa1, 0x24, 0xf4, 0xb9, 0x38, 0x0e, 0xa0, 0xcb, 0x39, 0x1e, 0x20, 0x52, \n0x6b, 0x55, 0x39, 0xf0, 0xac, 0xb6, 0x82, 0xef, 0xbf, 0x52, 0x12, 0x42, \n0x30, 0xee, 0x23, 0x04, 0x08, 0x31, 0xc0, 0x9d, 0xc7, 0x40, 0x8c, 0x00, \n0x71, 0x02, 0x84, 0x81, 0xcd, 0x73, 0x02, 0xb6, 0x2b, 0x69, 0xbd, 0x15, \n0x92, 0x2f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, \n0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/Delete2PNG.h",
    "content": "static const unsigned char DELETE2_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x12, 0x59, 0x20, 0xcb, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x5a, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x9d, 0x8e, 0xc1, 0x11, 0x00, 0x21, 0x08, \n0x03, 0x69, 0xc0, 0x5e, 0x6d, 0xe0, 0x0a, 0xc9, 0xc3, 0x9e, 0xf8, 0x31, \n0x76, 0x73, 0x80, 0x06, 0x7d, 0xde, 0x5c, 0x46, 0xf3, 0x60, 0x27, 0x10, \n0x91, 0xcf, 0x6a, 0x65, 0xae, 0xa9, 0x34, 0x9f, 0x61, 0x6c, 0x8b, 0x19, \n0xa0, 0xcb, 0x92, 0x60, 0xc4, 0xef, 0x44, 0xfe, 0x6c, 0x6f, 0x03, 0x0a, \n0x24, 0x22, 0x58, 0x29, 0x82, 0x24, 0x2a, 0x77, 0xe6, 0x00, 0x9e, 0xc9, \n0xc4, 0x83, 0xd3, 0xc0, 0xae, 0x06, 0xbe, 0xaa, 0x55, 0x03, 0xa3, 0x05, \n0xea, 0xb4, 0x1f, 0x7a, 0x01, 0xc5, 0x78, 0x3b, 0x10, 0xc3, 0x1f, 0xc3, \n0xce, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, \n0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/DeletePNG.h",
    "content": "static const unsigned char DELETE_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x6b, 0xa4, 0x39, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x81, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0xc5, 0xd1, 0xc1, 0x0d, 0x80, 0x30, 0x08, \n0x05, 0x50, 0x17, 0x60, 0x57, 0xd7, 0xe1, 0xd0, 0x9d, 0x7a, 0x23, 0x6e, \n0x63, 0x2c, 0x14, 0x2d, 0xff, 0x7b, 0x55, 0x2e, 0xfd, 0x31, 0xbc, 0x58, \n0xe8, 0xb6, 0x7d, 0x57, 0x1d, 0x82, 0x97, 0xb4, 0x1a, 0xa2, 0x0e, 0xed, \n0x25, 0x44, 0x9f, 0x6a, 0x5b, 0x43, 0x02, 0xf5, 0xce, 0x0c, 0xb7, 0x18, \n0x9d, 0xe3, 0xdc, 0x09, 0xb9, 0x0e, 0x5b, 0x6f, 0x35, 0x08, 0x82, 0x20, \n0x08, 0x82, 0x10, 0xe0, 0x84, 0x00, 0x27, 0x0c, 0x04, 0x41, 0xc0, 0x66, \n0x78, 0x8a, 0x8e, 0xdf, 0xe3, 0x1f, 0x2f, 0x80, 0x90, 0x9c, 0x83, 0x01, \n0xab, 0xbb, 0xcd, 0x2b, 0x09, 0x92, 0xd8, 0x12, 0x90, 0x39, 0x03, 0x90, \n0x5c, 0x2b, 0x79, 0x41, 0x1f, 0x5a, 0xf0, 0x05, 0xad, 0x84, 0x49, 0x66, \n0x9f, 0xd4, 0x75, 0x19, 0x84, 0x3f, 0xeb, 0x04, 0x1a, 0xa7, 0x7e, 0xab, \n0x5a, 0xf7, 0xe4, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, \n0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/Extract2PNG.h",
    "content": "static const unsigned char EXTRACT2_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x12, 0x59, 0x20, 0xcb, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x22, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x60, 0xa0, 0x17, 0xe0, 0xbd, 0x0b, \n0x05, 0x17, 0x40, 0x9c, 0x33, 0x50, 0x70, 0x9d, 0x5c, 0x0e, 0xcc, 0x34, \n0x10, 0x87, 0xa1, 0x1c, 0x06, 0xe8, 0xe6, 0x1b, 0x00, 0xa6, 0x78, 0x38, \n0x15, 0x21, 0xee, 0x22, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, \n0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/ExtractPNG.h",
    "content": "static const unsigned char EXTRACT_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x6b, 0xa4, 0x39, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x28, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x60, 0x18, 0x05, 0xa4, 0x81, 0xbb, \n0x28, 0x00, 0x49, 0xe2, 0xce, 0x19, 0x24, 0x70, 0xb6, 0x60, 0xc8, 0x4a, \n0xa0, 0x7a, 0x10, 0x49, 0x82, 0xbd, 0x1c, 0x19, 0x20, 0x49, 0x8c, 0x02, \n0x8a, 0x00, 0x00, 0x11, 0x6c, 0x7c, 0x67, 0x00, 0x94, 0xd4, 0x2c, 0x00, \n0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/Info2PNG.h",
    "content": "static const unsigned char INFO2_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x12, 0x59, 0x20, 0xcb, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x46, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x60, 0x40, 0x07, 0xbc, 0x77, 0xef, \n0x5e, 0x40, 0x70, 0x76, 0xef, 0xbe, 0x8e, 0x83, 0x73, 0xf7, 0x2e, 0x82, \n0xc3, 0x50, 0x5e, 0x5e, 0x8e, 0x61, 0x10, 0x54, 0x15, 0xc2, 0x34, 0xa0, \n0x7e, 0x84, 0x01, 0xbc, 0x77, 0x91, 0x4d, 0xab, 0xc5, 0x6d, 0x0f, 0xe9, \n0x1c, 0x90, 0xd1, 0x70, 0x5b, 0x41, 0x96, 0xc2, 0xa5, 0x40, 0xce, 0x41, \n0x38, 0xbb, 0xbc, 0x1c, 0x97, 0xb3, 0x09, 0x03, 0x00, 0x3a, 0xb2, 0x32, \n0x23, 0xbc, 0x78, 0x77, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, \n0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/InfoPNG.h",
    "content": "static const unsigned char INFO_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x6b, 0xa4, 0x39, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x57, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x60, 0xa0, 0x05, 0xb8, 0x0b, 0x04, \n0x17, 0xb0, 0x49, 0xdc, 0xde, 0xbd, 0x7b, 0xf7, 0x75, 0xea, 0x48, 0x80, \n0xec, 0xc0, 0x2a, 0xc1, 0x5e, 0x0e, 0x04, 0xc4, 0xba, 0x94, 0x2c, 0xc0, \n0x7b, 0x17, 0x87, 0x07, 0x79, 0x77, 0xef, 0xc6, 0xee, 0x5c, 0xdc, 0x12, \n0x77, 0x71, 0x79, 0xb0, 0x9c, 0x8a, 0x61, 0x35, 0x18, 0x25, 0x20, 0x3e, \n0xbf, 0x7b, 0x17, 0x53, 0x02, 0x1c, 0x56, 0xbb, 0xf7, 0x16, 0x10, 0x2f, \n0x71, 0x17, 0x02, 0x30, 0x24, 0x18, 0xca, 0x21, 0x00, 0x53, 0x62, 0x30, \n0x01, 0x00, 0xd3, 0xa5, 0x67, 0xc0, 0x11, 0x9d, 0x79, 0xc0, 0x00, 0x00, \n0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/Move2PNG.h",
    "content": "static const unsigned char MOVE2_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x12, 0x59, 0x20, 0xcb, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x4c, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x95, 0xce, 0xb1, 0x0d, 0xc0, 0x20, 0x0c, \n0x44, 0xd1, 0xeb, 0xb2, 0x18, 0xad, 0x77, 0xa1, 0x63, 0x4d, 0x0a, 0x4b, \n0xa9, 0xbc, 0x4b, 0x82, 0x41, 0xf0, 0x5b, 0xae, 0xfb, 0x3c, 0xc9, 0x42, \n0xba, 0x5a, 0x67, 0x04, 0xc3, 0x49, 0x6e, 0x8c, 0x92, 0x14, 0x39, 0x2f, \n0x36, 0xdf, 0xd6, 0x3a, 0xc3, 0x18, 0x83, 0x8e, 0x54, 0xc4, 0xcb, 0x6b, \n0x3f, 0xe8, 0x69, 0x63, 0x9e, 0xb0, 0x7f, 0x50, 0x11, 0x00, 0x05, 0x40, \n0x84, 0xab, 0x7d, 0xa9, 0x14, 0x30, 0x23, 0x6c, 0x8b, 0xd3, 0x1c, 0x00, \n0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/MovePNG.h",
    "content": "static const unsigned char MOVE_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x6b, 0xa4, 0x39, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x71, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0xbd, 0xd1, 0xb1, 0x0d, 0xc0, 0x20, 0x0c, \n0x05, 0x51, 0x2f, 0xc0, 0x56, 0x6e, 0xd9, 0x85, 0x2e, 0x6b, 0x52, 0x58, \n0xa2, 0x62, 0x97, 0x98, 0x22, 0x84, 0x10, 0x5f, 0xcb, 0x6f, 0x4f, 0x4f, \n0x08, 0x10, 0x39, 0xbe, 0x4a, 0xa1, 0x53, 0x30, 0x22, 0x96, 0x29, 0x28, \n0x10, 0x53, 0x20, 0xa6, 0x40, 0x3c, 0xc4, 0xc4, 0xc3, 0x42, 0x52, 0x9f, \n0x1b, 0xe1, 0x25, 0x49, 0xbf, 0xab, 0x14, 0x32, 0x85, 0x49, 0x7e, 0x21, \n0x53, 0x68, 0x74, 0x46, 0x81, 0xd0, 0xe6, 0xe1, 0xdb, 0x3d, 0x1e, 0x20, \n0x72, 0xcd, 0xd9, 0x0a, 0xf6, 0xb7, 0x2a, 0x10, 0x42, 0x30, 0xfe, 0x23, \n0x04, 0x1e, 0x62, 0xe0, 0x7f, 0x1e, 0x03, 0x31, 0x00, 0xd2, 0x01, 0x08, \n0x81, 0xc3, 0xbb, 0x01, 0xf5, 0x5d, 0x59, 0xea, 0x53, 0xc3, 0x86, 0x77, \n0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, \n0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/ParentFolder.h",
    "content": "static unsigned char PARENT_FOLDER_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, \n0x08, 0x03, 0x00, 0x00, 0x00, 0x28, 0x2d, 0x0f, 0x53, 0x00, 0x00, 0x03, \n0x00, 0x50, 0x4c, 0x54, 0x45, 0x01, 0x67, 0x01, 0x08, 0x6e, 0x05, 0x08, \n0x77, 0x04, 0x0c, 0x79, 0x07, 0x11, 0x70, 0x0a, 0x11, 0x7c, 0x09, 0x16, \n0x7c, 0x0c, 0x17, 0x79, 0x13, 0x1f, 0x78, 0x1f, 0x37, 0x7a, 0x0b, 0x21, \n0x7d, 0x21, 0x14, 0x8c, 0x0b, 0x19, 0x98, 0x0d, 0x1c, 0xa0, 0x0f, 0x22, \n0x81, 0x17, 0x27, 0x8c, 0x14, 0x27, 0x8f, 0x14, 0x26, 0x8b, 0x1a, 0x27, \n0x8c, 0x1b, 0x2f, 0x94, 0x1f, 0x31, 0x81, 0x1b, 0x2f, 0x81, 0x2f, 0x3b, \n0x85, 0x2e, 0x3d, 0x8a, 0x3d, 0x3e, 0x8a, 0x3f, 0x3c, 0xa1, 0x1f, 0x34, \n0xb3, 0x1b, 0x41, 0x8c, 0x3e, 0x51, 0x8e, 0x29, 0x43, 0xad, 0x22, 0x44, \n0xb7, 0x22, 0x49, 0xbd, 0x25, 0x59, 0xbe, 0x39, 0x61, 0x93, 0x2e, 0x4e, \n0x8f, 0x41, 0x6b, 0xa5, 0x6c, 0x6c, 0xa6, 0x6d, 0x79, 0xad, 0x7a, 0x57, \n0xc4, 0x2c, 0x67, 0xcc, 0x34, 0x6c, 0xd1, 0x39, 0x60, 0xc5, 0x40, 0x75, \n0xda, 0x42, 0x74, 0xd8, 0x47, 0x7f, 0xe3, 0x4c, 0xb9, 0x9c, 0x11, 0x81, \n0xac, 0x47, 0x85, 0xea, 0x53, 0x8e, 0xf4, 0x5c, 0xcc, 0x99, 0x01, 0xd6, \n0xa5, 0x17, 0xd1, 0xa4, 0x1e, 0xd3, 0xa9, 0x2c, 0xdd, 0xaf, 0x35, 0xde, \n0xb5, 0x36, 0xdf, 0xba, 0x3c, 0xe6, 0xbc, 0x3e, 0xde, 0xbe, 0x51, 0xd9, \n0xb9, 0x58, 0xdb, 0xbe, 0x66, 0xe2, 0xb8, 0x43, 0xe6, 0xbc, 0x51, 0xdf, \n0xc3, 0x6b, 0xe6, 0xc2, 0x44, 0xec, 0xc6, 0x4e, 0xea, 0xc0, 0x57, 0xf2, \n0xcc, 0x5b, 0xe2, 0xc6, 0x71, 0xe6, 0xc9, 0x79, 0xe6, 0xd1, 0x63, 0xf2, \n0xd5, 0x64, 0xf5, 0xdf, 0x79, 0xff, 0xdc, 0x77, 0xef, 0xe0, 0x7b, 0xfc, \n0xe4, 0x7c, 0x89, 0xb7, 0x8b, 0x8f, 0xbc, 0x87, 0xb7, 0xd3, 0xba, 0xdf, \n0xec, 0x86, 0xdf, 0xe6, 0xaf, 0xe3, 0xce, 0x92, 0xe4, 0xd3, 0x9e, 0xe4, \n0xd4, 0x9e, 0xec, 0xd9, 0x99, 0xec, 0xd9, 0x9f, 0xfc, 0xd4, 0x83, 0xff, \n0xdb, 0x89, 0xe5, 0xd6, 0xa3, 0xe5, 0xd7, 0xab, 0xef, 0xdf, 0xab, 0xff, \n0xe8, 0x83, 0xff, 0xea, 0x95, 0xff, 0xf2, 0x8c, 0xff, 0xf9, 0x93, 0xff, \n0xff, 0x99, 0xef, 0xf5, 0xbc, 0xf2, 0xe6, 0xa4, 0xff, 0xe6, 0xa0, 0xff, \n0xf2, 0xa9, 0xff, 0xf8, 0xa6, 0xff, 0xff, 0xac, 0xff, 0xff, 0xbe, 0xc6, \n0xdb, 0xc9, 0xd6, 0xe3, 0xd9, 0xea, 0xe2, 0xca, 0xeb, 0xe7, 0xd6, 0xee, \n0xea, 0xdb, 0xf5, 0xea, 0xc1, 0xff, 0xf4, 0xc8, 0xff, 0xfe, 0xc6, 0xfc, \n0xf9, 0xcf, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xd9, 0xe5, 0xed, 0xe9, 0xff, \n0xff, 0xe7, 0xf3, 0xf4, 0xf7, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xd0, 0xf6, 0xa4, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0e, 0xc4, 0x00, 0x00, \n0x0e, 0xc4, 0x01, 0x95, 0x2b, 0x0e, 0x1b, 0x00, 0x00, 0x00, 0xc1, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x28, 0x86, 0x02, 0x15, 0x89, 0x74, \n0x30, 0xcd, 0x00, 0xe5, 0xfb, 0x32, 0xf1, 0xb0, 0x7b, 0x23, 0x09, 0x14, \n0x72, 0xf1, 0x4a, 0xc9, 0x09, 0x88, 0xa6, 0xc1, 0x05, 0x94, 0xb9, 0xa5, \n0xe4, 0xd5, 0xd4, 0x25, 0x19, 0x55, 0xc1, 0x02, 0xa6, 0xa6, 0xa6, 0x0c, \n0xcc, 0xac, 0xb2, 0xea, 0x1a, 0x1c, 0xac, 0xac, 0x20, 0x01, 0xd3, 0xe0, \n0xbc, 0x78, 0xa0, 0x18, 0xbf, 0x86, 0x96, 0x38, 0xc4, 0x0c, 0xd3, 0xdc, \n0xb8, 0xb8, 0xd4, 0xfc, 0x5c, 0x36, 0x2d, 0x1d, 0x31, 0xa8, 0x40, 0x72, \n0x2c, 0x10, 0x98, 0x72, 0xea, 0x68, 0x2b, 0x99, 0x9a, 0x82, 0x05, 0xa2, \n0xbd, 0xdc, 0xec, 0xcd, 0x43, 0xa4, 0xf5, 0x15, 0x7c, 0x4a, 0xec, 0xc0, \n0x02, 0x61, 0x36, 0x91, 0x45, 0x05, 0xb9, 0x7c, 0x06, 0x82, 0xfe, 0x09, \n0xe1, 0x60, 0x81, 0x50, 0xe7, 0x94, 0xb8, 0x38, 0x3f, 0x61, 0x4d, 0xc5, \n0x24, 0x4b, 0x88, 0x19, 0x8e, 0xd9, 0x31, 0x31, 0x31, 0x7a, 0x42, 0x22, \n0x9e, 0xee, 0x01, 0x10, 0x01, 0xdb, 0x9c, 0xa8, 0xa8, 0x28, 0x16, 0x19, \n0x57, 0x07, 0xb3, 0x2c, 0x88, 0x80, 0x4b, 0xa2, 0x87, 0x93, 0x85, 0xae, \n0xa1, 0xb1, 0x55, 0x10, 0xd4, 0xda, 0x10, 0x23, 0x43, 0x13, 0xeb, 0xc0, \n0x8c, 0x62, 0x98, 0x6f, 0x4d, 0x4d, 0x23, 0x32, 0x8b, 0xe1, 0x00, 0x00, \n0xfc, 0x33, 0x50, 0x72, 0x6d, 0x03, 0x36, 0xf2, 0x00, 0x00, 0x00, 0x00, \n0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/Test2PNG.h",
    "content": "static const unsigned char TEST2_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x12, 0x59, 0x20, 0xcb, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x47, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0xb5, 0xcd, 0xbb, 0x11, 0x00, 0x20, 0x08, \n0x03, 0x50, 0x16, 0x60, 0x57, 0x47, 0xb5, 0xb3, 0xc2, 0x0d, 0xcc, 0x0c, \n0x22, 0x9f, 0xc3, 0xde, 0x33, 0x05, 0x29, 0x5e, 0xee, 0x20, 0xfa, 0x1e, \n0x16, 0x91, 0x1e, 0x97, 0x26, 0xb0, 0x9a, 0x17, 0x31, 0x80, 0x71, 0x06, \n0xda, 0x3d, 0xc0, 0x29, 0xc0, 0x29, 0xc1, 0x28, 0xc1, 0x29, 0xc1, 0x68, \n0xd4, 0xc7, 0x0b, 0x94, 0x0a, 0x94, 0x2e, 0x78, 0xc9, 0x06, 0xae, 0xb5, \n0x39, 0x27, 0x85, 0x82, 0xfa, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, \n0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/res/TestPNG.h",
    "content": "static const unsigned char TEST_png[] = {\n0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, \n0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, \n0x04, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x6b, 0xa4, 0x39, 0x00, 0x00, 0x00, \n0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, \n0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, \n0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0x00, 0x00, 0x00, \n0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \n0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x14, 0x3b, 0x9d, 0x00, 0x00, 0x00, \n0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, \n0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x01, 0xea, 0x65, 0x16, 0xa4, 0x00, 0x00, 0x00, 0x75, 0x49, \n0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0xd1, 0x31, 0x1a, 0x80, 0x20, 0x08, \n0x05, 0x60, 0xc7, 0x96, 0xee, 0xdb, 0xd8, 0x05, 0xb8, 0x9b, 0x9b, 0x53, \n0xdd, 0xa0, 0xce, 0x10, 0x20, 0xfa, 0x55, 0xef, 0xd5, 0x2e, 0x23, 0xf2, \n0x2b, 0x60, 0x4a, 0x63, 0xc4, 0x66, 0x91, 0x31, 0x3f, 0x9f, 0x1a, 0xc7, \n0x82, 0x07, 0xbb, 0x1d, 0x94, 0xf5, 0x1f, 0xdc, 0x6f, 0x7d, 0x00, 0xf1, \n0x2a, 0xf2, 0xc2, 0xe4, 0x65, 0x99, 0xbc, 0xd0, 0xc9, 0xbb, 0xa5, 0x4e, \n0xa0, 0xa5, 0x20, 0x38, 0x43, 0x10, 0x32, 0x43, 0x25, 0x64, 0xe8, 0x4a, \n0xd8, 0xd0, 0x12, 0x79, 0xd8, 0x52, 0x23, 0xb8, 0x25, 0xe1, 0xa0, 0x11, \n0xb2, 0x56, 0x27, 0xec, 0x1f, 0x9c, 0x30, 0x60, 0x84, 0x02, 0x23, 0x1c, \n0x28, 0xe1, 0x40, 0xc9, 0x07, 0x18, 0x21, 0x2e, 0x97, 0xf8, 0xa1, 0xe3, \n0xf9, 0x5b, 0x6d, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, \n0xae, 0x42, 0x60, 0x82, 0x00, \n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/resource.h",
    "content": "#define IDI_FAM                         101\n#define IDI_FM                          101\n#define IDR_MENUBAR1                    103\n#define IDM_MENU                        103\n#define IDR_ACCELERATOR1                209\n#define IDM_FILE_OPEN                   210\n#define IDM_FILE_OPEN_INSIDE            211\n#define IDM_FILE_OPEN_OUTSIDE           212\n#define IDM_FILE_VIEW                   220\n#define IDM_FILE_EDIT                   221\n#define IDM_RENAME                      230\n#define IDM_COPY_TO                     231\n#define IDM_MOVE_TO                     232\n#define IDM_DELETE                      233\n#define IDM_FILE_SPLIT                  238\n#define IDM_FILE_COMBINE                239\n#define IDM_FILE_PROPERTIES             240\n#define IDM_FILE_COMMENT                241\n#define IDM_FILE_CRC                    242\n#define IDM_CREATE_FOLDER               250\n#define IDM_CREATE_FILE                 251\n#define IDM_EDIT_CUT                    320\n#define IDM_EDIT_COPY                   321\n#define IDM_EDIT_PASTE                  322\n#define IDM_SELECT_ALL                  330\n#define IDM_DESELECT_ALL                331\n#define IDM_INVERT_SELECTION            332\n#define IDM_SELECT                      333\n#define IDM_DESELECT                    334\n#define IDM_SELECT_BY_TYPE              335\n#define IDM_DESELECT_BY_TYPE            336\n#define IDM_VIEW_LARGE_ICONS            410\n#define IDM_VIEW_SMALL_ICONS            411\n#define IDM_VIEW_LIST                   412\n#define IDM_VIEW_DETAILS                413\n#define IDM_VIEW_ARANGE_BY_NAME         420\n#define IDM_VIEW_ARANGE_BY_TYPE         421\n#define IDM_VIEW_ARANGE_BY_DATE         422\n#define IDM_VIEW_ARANGE_BY_SIZE         423\n#define IDM_VIEW_ARANGE_NO_SORT         424\n#define IDM_OPEN_ROOT_FOLDER            430\n#define IDM_OPEN_PARENT_FOLDER          431\n#define IDM_FOLDERS_HISTORY             432\n#define IDM_VIEW_REFRESH                440\n#define IDM_VIEW_FLAT_VIEW              449\n#define IDM_VIEW_TWO_PANELS             450\n#define IDM_VIEW_TOOLBARS               451\n#define IDM_VIEW_STANDARD_TOOLBAR       460\n#define IDM_VIEW_ARCHIVE_TOOLBAR        461\n#define IDM_VIEW_TOOLBARS_LARGE_BUTTONS 462\n#define IDM_VIEW_TOOLBARS_SHOW_BUTTONS_TEXT 463\n#define IDM_OPTIONS                     510\n#define IDM_BENCHMARK                   511\n#define IDM_HELP_CONTENTS               610\n#define IDM_ABOUT                       620\n#define IDS_BOOKMARK                    720\n#define IDB_ADD                         2002\n#define IDB_EXTRACT                     2003\n#define IDB_TEST                        2004\n#define IDB_COPY                        2010\n#define IDB_MOVE                        2011\n#define IDB_DELETE                      2012\n#define IDB_INFO                        2013\n#define IDB_ADD2                        2082\n#define IDB_EXTRACT2                    2083\n#define IDB_TEST2                       2084\n#define IDB_COPY2                       2090\n#define IDB_MOVE2                       2091\n#define IDB_DELETE2                     2092\n#define IDB_INFO2                       2093\n#define IDS_APP_TITLE                   2200\n#define IDS_COPY                        2201\n#define IDS_MOVE                        2202\n#define IDS_COPY_TO                     2203\n#define IDS_MOVE_TO                     2204\n#define IDS_COPYING                     2205\n#define IDS_MOVING                      2206\n#define IDS_CANNOT_COPY                 2207\n#define IDS_OPERATION_IS_NOT_SUPPORTED  2208\n\n#define IDS_CONFIRM_FILE_DELETE         2210\n#define IDS_CONFIRM_FOLDER_DELETE       2211\n#define IDS_CONFIRM_ITEMS_DELETE        2212\n#define IDS_WANT_TO_DELETE_FILE         2213\n#define IDS_WANT_TO_DELETE_FOLDER       2214\n#define IDS_WANT_TO_DELETE_ITEMS        2215\n#define IDS_DELETING                    2216\n#define IDS_ERROR_DELETING              2217\n#define IDS_ERROR_LONG_PATH_TO_RECYCLE  2218\n\n#define IDS_RENAMING                    2220\n#define IDS_ERROR_RENAMING              2221\n#define IDS_CONFIRM_FILE_COPY           2222\n#define IDS_WANT_TO_COPY_FILES          2223\n\n\n#define IDS_CREATE_FOLDER               2230\n#define IDS_CREATE_FOLDER_NAME          2231\n#define IDS_CREATE_FOLDER_DEFAULT_NAME  2232\n#define IDS_CREATE_FOLDER_ERROR         2233\n#define IDS_CREATE_FILE                 2240\n#define IDS_CREATE_FILE_NAME            2241\n#define IDS_CREATE_FOLDER_DEFAULT_FILE_NAME 2242\n#define IDS_CREATE_FILE_DEFAULT_NAME    2242\n#define IDS_CREATE_FILE_ERROR           2243\n#define IDS_SELECT                      2250\n#define IDS_DESELECT                    2251\n#define IDS_SELECT_MASK                 2252\n#define IDS_FOLDERS_HISTORY             2260\n#define IDS_N_SELECTED_ITEMS            2270\n#define IDS_FILES_COLON                 2274\n#define IDS_FOLDERS_COLON               2275\n#define IDS_SIZE_COLON                  2276\n\n#define IDS_TOO_MANY_ITEMS              2279\n#define IDS_WANT_UPDATE_MODIFIED_FILE   2280\n#define IDS_CANNOT_UPDATE_FILE          2281\n#define IDS_CANNOT_START_EDITOR         2282\n#define IDS_OPENNING                    2283\n#define IDS_VIRUS                       2284\n#define IDS_COMPUTER                    2300\n#define IDS_NETWORK                     2301\n#define IDS_DOCUMENTS                   2302\n#define IDS_ADD                         2400\n#define IDS_EXTRACT                     2401\n#define IDS_TEST                        2402\n#define IDS_BUTTON_COPY                 2420\n#define IDS_BUTTON_MOVE                 2421\n#define IDS_BUTTON_DELETE               2422\n#define IDS_BUTTON_INFO                 2423\n#define IDS_PROPERTY_TOTAL_SIZE         3100\n#define IDS_PROPERTY_FREE_SPACE         3101\n#define IDS_PROPERTY_CLUSTER_SIZE       3102\n#define IDS_PROPERTY_VOLUME_NAME        3103\n#define IDS_PROPERTY_LOCAL_NAME         3200\n#define IDS_PROPERTY_PROVIDER           3201\n#define IDS_OPTIONS                     4000\n#define IDS_COMMENT                     4001\n#define IDS_COMMENT2                    4002\n#define IDS_SYSTEM                      4010\n\n#define IDS_SPLITTING                   4020\n#define IDS_SPLIT_CONFIRM_TITLE         4021\n#define IDS_SPLIT_CONFIRM_MESSAGE       4022\n#define IDS_SPLIT_VOL_MUST_BE_SMALLER   4023\n\n#define IDS_COMBINE                     4030\n#define IDS_COMBINE_TO                  4031\n#define IDS_COMBINING                   4032\n#define IDS_COMBINE_SELECT_ONE_FILE     4033\n#define IDS_COMBINE_CANT_DETECT_SPLIT_FILE 4034\n#define IDS_COMBINE_CANT_FIND_MORE_THAN_ONE_PART 4035\n\n#define IDS_CHECKSUM_CALCULATING        4040\n#define IDS_CHECKSUM_INFORMATION        4041\n#define IDS_CHECKSUM_CRC_DATA           4042\n#define IDS_CHECKSUM_CRC_DATA_NAMES     4043\n\n#define IDS_SCANNING                    4050\n#define IDS_PROPERTIES                  4060\n\n#define IDS_PROGRESS_TESTING            4100\n#define IDS_MESSAGE_NO_ERRORS           4200\n\n#define IDS_MESSAGE_UNSUPPORTED_OPERATION_FOR_LONG_PATH_FOLDER  4301\n#define IDS_SELECT_ONE_FILE             4302\n#define IDS_SELECT_FILES                4303\n#define IDS_FILE_EXIST                  4304\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/FileManager/wxFM.cpp",
    "content": "// wxFM.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif\n\n// #include \"../GUI/p7zip_32.xpm\"\n\nint Main1(int argc,TCHAR **argv);\n\n/*\nint Main1(int argc,TCHAR **argv)\n{\n\t// FIXME\n\tSleep(10000);\n}\n*/\n\t\n\n#include \"Windows/Registry.h\"\nusing namespace NWindows;\nusing namespace NRegistry;\n\n\n#include \"Common/StringConvert.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/Synchronization.h\"\n\n// FIXME #include \"ExtractRes.h\"\n#include \"../Explorer/MyMessages.h\"\n\n// FIXME #include \"ExtractGUI.h\"\n// FIXME #include \"UpdateGUI.h\"\n// FIXME #include \"BenchmarkDialog.h\"\n#include \"RegistryUtils.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\n\n#include \"../FileManager/ProgramLocation.h\"\n\nstatic LPCWSTR kHelpFileName = L\"help/\";\n\nvoid ShowHelpWindow(HWND hwnd, LPCWSTR topicFile)\n{\n  UString path;\n  if (!::GetProgramFolderPath(path))\n    return;\n  path += kHelpFileName;\n  path += topicFile;\n  printf(\"ShowHelpWindow(%p,%ls)=>%ls\\n\",hwnd,topicFile,(const wchar_t *)path);\n  // HtmlHelp(hwnd, GetSystemString(path), HH_DISPLAY_TOPIC, NULL);\n  wxString path2(path);\n  wxLaunchDefaultBrowser(path2);\n}\n\n////////////////////////////// TRIES ///////////////////////////////////\n\n// FIXME : duplicate\n\n#if 0\nstatic const TCHAR *kCUBasePath = TEXT(\"Software/7-ZIP\");\nstatic const WCHAR *kLangValueName = L\"Lang\";\n\nvoid SaveRegLang(const UString &langFile)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  key.SetValue(kLangValueName, langFile);\n}\n\nvoid ReadRegLang(UString &langFile)\n{\n  langFile.Empty();\n  CKey key;\n  if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) == ERROR_SUCCESS)\n    key.QueryValue(kLangValueName, langFile);\n}\n#endif\n\n\n//////////////////////////////////\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n#include \"myPrivate.h\" // global_use_utf16_conversion\n\nvoid mySplitCommandLineW(int numArguments, TCHAR  **arguments,UStringVector &parts) {\n\n  parts.Clear();\n  for(int ind=0;ind < numArguments; ind++) {\n      UString tmp = arguments[ind];\n      // tmp.Trim(); \" \" is a valid filename ...\n      if (!tmp.IsEmpty()) {\n        parts.Add(tmp);\n      }\n  }\n}\n\n// ----------------------------------------------------------------------------\n// private classes\n// ----------------------------------------------------------------------------\n\n// Define a new frame type\n#if 0\nclass MyFrame: public wxFrame\n{\npublic:\n    // ctor\n    MyFrame(wxFrame *frame, const wxString& title, int x, int y, int w, int h);\n    // virtual ~MyFrame();\n\n    // operations\n    void WriteText(const wxString& text) { m_txtctrl->WriteText(text); }\n    \nprotected:\n    // callbacks\n    void OnWorkerEvent(wxCommandEvent& event);\nprivate:\n    // just some place to put our messages in\n    wxTextCtrl *m_txtctrl;\n    DECLARE_EVENT_TABLE()\n};\n\nenum {\n    WORKER_EVENT=100    // this one gets sent from the worker thread\n};\n    \nBEGIN_EVENT_TABLE(MyFrame, wxFrame)\n    EVT_MENU(WORKER_EVENT, MyFrame::OnWorkerEvent)\n    // EVT_IDLE(MyFrame::OnIdle)\nEND_EVENT_TABLE()\n\n// My frame constructor\nMyFrame::MyFrame(wxFrame *frame, const wxString& title,\n                 int x, int y, int w, int h)\n       : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))\n{\n\t//FIXME this->SetIcon(wxICON(p7zip_32));\n    \n#if wxUSE_STATUSBAR\n    CreateStatusBar(2);\n#endif // wxUSE_STATUSBAR\n\n    m_txtctrl = new wxTextCtrl(this, wxID_ANY, _T(\"\"), wxPoint(0, 0), wxSize(0, 0), wxTE_MULTILINE | wxTE_READONLY);\n}\n\nvoid myCreateHandle(int n);\nvoid MyFrame::OnWorkerEvent(wxCommandEvent& event)\n{\n\tint n = event.GetInt();\n\tmyCreateHandle(n);\n}\n\nwxWindow * g_window=0;\n#endif\n\n\n// Define a new application type, each program should derive a class from wxApp\nclass MyApp : public wxApp\n{\npublic:\n    // override base class virtuals\n    // ----------------------------\n\n    // this one is called on application startup and is a good place for the app\n    // initialization (doing it here and not in the ctor allows to have an error\n    // return: if OnInit() returns false, the application terminates)\n    virtual bool OnInit();\n};\n\n// Create a new application object: this macro will allow wxWidgets to create\n// the application object during program execution (it's better than using a\n// static object for many reasons) and also implements the accessor function\n// wxGetApp() which will return the reference of the right type (i.e. MyApp and\n// not wxApp)\nIMPLEMENT_APP(MyApp)\n\ntime_t g_T0 = 0;\n\n#if 0\nclass MyThread : public wxThread\n{\n\tint _argc;\n\tTCHAR **_argv;\npublic:\n\tMyThread(int argc,TCHAR **argv): wxThread(),_argc(argc), _argv(argv) {}\n\n\t// thread execution starts here\n\tvirtual void *Entry()\n\t{\n\t\tint ret = Main1(_argc,_argv);\n\t\texit(ret);\n\t}\n};\n#endif\n\n// 'Main program' equivalent: the program execution \"starts\" here\nbool MyApp::OnInit()\n{\n    // don't parse the command-line options !\n    // : if ( !wxApp::OnInit() ) return false;\n\n  { // define P7ZIP_HOME_DIR\n    extern void my_windows_split_path(const AString &p_path, AString &dir , AString &base);\n    static char p7zip_home_dir[MAX_PATH];\n\n    UString fullPath;\n    NDirectory::MyGetFullPathName(wxApp::argv[0], fullPath);\n    AString afullPath = GetAnsiString(fullPath);\n\n    AString dir,name;\n\n    my_windows_split_path(afullPath,dir,name);\n\n    const char *dir2 = nameWindowToUnix((const char *)dir);\n    snprintf(p7zip_home_dir,sizeof(p7zip_home_dir),\"P7ZIP_HOME_DIR=%s/\",dir2);\n    p7zip_home_dir[sizeof(p7zip_home_dir)-1] = 0;\n    putenv(p7zip_home_dir);\n    // DEBUG printf(\"putenv(%s)\\n\",p7zip_home_dir);\n  }\n  global_use_utf16_conversion = 1; // UNICODE !\n\n  g_T0 = time(0);\n  // DEBUG printf(\"MAIN Thread : 0x%lx\\n\",wxThread::GetCurrentId());\n\n   // Create the main frame window\n#if 0\n    MyFrame *frame = new MyFrame((wxFrame *)NULL, _T(\"7-zip Main Window\"), 50, 50, 450, 340);\n   // Don't Show the frame !\n   frame->Show(true); // FIXME\n\n    SetTopWindow(frame);\n\n    g_window = frame;\n#endif\n\n    /*\n    MyThread *thread = new MyThread(wxApp::argc,wxApp::argv);\n    thread->Create(); //  != wxTHREAD_NO_ERROR\n    thread->Run();\n    */\n\n    wxInitAllImageHandlers();\n\n    Main1(wxApp::argc,wxApp::argv);\n\n  // success: wxApp::OnRun() will be called which will enter the main message\n  // loop and the application will run. If we returned false here, the\n  // application would exit immediately.\n    return true;\n}\n\nDWORD WINAPI GetTickCount(VOID) {\n\tstatic wxStopWatch sw;\n\treturn sw.Time();\n}\n\n//////////////////////////////////////////\n\n#if 0\n#include \"resource.h\"\n#include \"ExtractRes.h\"\n\nstatic CStringTable g_stringTable[] =\n{\n  /* resource.rc */\t  \n  /***************/\n\t{ IDS_OPEN_TYPE_ALL_FILES, L\"All Files\" },\n\t{ IDS_METHOD_STORE, L\"Store\" },\n\t{ IDS_METHOD_NORMAL, L\"Normal\" },\n\t{ IDS_METHOD_MAXIMUM, L\"Maximum\" },\n\t{ IDS_METHOD_FAST, L\"Fast\" },\n\t{ IDS_METHOD_FASTEST, L\"Fastest\" },\n\t{ IDS_METHOD_ULTRA, L\"Ultra\" },\n\t{ IDS_COMPRESS_NON_SOLID, L\"Non-solid\" },\n\t{ IDS_COMPRESS_SOLID, L\"Solid\" },\n\n\t{ IDS_COMPRESS_UPDATE_MODE_ADD, L\"Add and replace files\" },\n\t{ IDS_COMPRESS_UPDATE_MODE_UPDATE, L\"Update and add files\" },\n\t{ IDS_COMPRESS_UPDATE_MODE_FRESH, L\"Freshen existing files\" },\n\t{ IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE, L\"Synchronize files\" },\n\t{ IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE, L\"Browse\" },\n\t{ IDS_COMPRESS_INCORRECT_VOLUME_SIZE, L\"Incorrect volume size\" },\n\t{ IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE, L\"Specified volume size: {0} bytes.\\nAre you sure you want to split archive into such volumes?\" },\n\n\t{ IDS_PASSWORD_USE_ASCII, L\"Use only English letters, numbers and special characters (!, #, $, ...) for password.\" },\n\t{ IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH, L\"Passwords do not match\" },\n\t{ IDS_PASSWORD_IS_TOO_LONG, L\"Password is too long\" },\n\n\t{ IDS_PROGRESS_COMPRESSING, L\"Compressing\" },\n\t{ IDS_PROGRESS_TESTING, L\"Testing\" },\n\t{ IDS_MESSAGE_NO_ERRORS, L\"There are no errors\" },\n\t{ IDS_FILES_COLON, L\"Files:\" },\n\t{ IDS_FOLDERS_COLON, L\"Folders:\" },\n\t{ IDS_SIZE_COLON, L\"Size:\" },\n\t{ IDS_COMPRESSED_COLON, L\"Compressed size:\" },\n\t{ IDS_ARCHIVES_COLON, L\"Archives:\" },\n\n  /* Extract.rc */\t  \n  /**************/\n\t{ IDS_CANNOT_CREATE_FOLDER , L\"Cannot create folder '{0}'\"},\n\t{ IDS_OPEN_IS_NOT_SUPORTED_ARCHIVE, L\"File is not supported archive.\"},\n\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC , L\"CRC failed in '{0}'. File is broken.\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR , L\"Data error in '{0}'. File is broken\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_UNSUPPORTED_METHOD , L\"Unsupported compression method for '{0}'.\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC_ENCRYPTED , L\"CRC failed in encrypted file '{0}'. Wrong password?\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR_ENCRYPTED , L\"Data error in encrypted file '{0}'. Wrong password?\"},\n\n\t{ IDS_EXTRACT_SET_FOLDER , L\"Specify a location for extracted files.\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CANNOT_OPEN_FILE, L\"Can not open output file '{0}'.\"},\n\t{ IDS_PROGRESS_EXTRACTING, L\"Extracting\" },\n\n\t{ IDS_CANT_OPEN_ARCHIVE , L\"Can not open file '{0}' as archive\"},\n\t{ IDS_CANT_OPEN_ENCRYPTED_ARCHIVE , L\"Can not open encrypted archive '{0}'. Wrong password?\"},\n\n\t{ 0 , 0 }\n};\n\nREGISTER_STRINGTABLE(g_stringTable)\n#endif\n\n\n///////////////////////////////////////////\n\nnamespace NFsFolder {\n\n\t// FIXME\n\tbool wxw_CopyFile(LPCWSTR existingFile, LPCWSTR newFile, bool overwrite)\n\t{\n\t\treturn wxCopyFile(wxString(existingFile), wxString(newFile), overwrite);\n\t}\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/BenchmarkDialog.cpp",
    "content": "// BenchmarkDialog.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/IntToString.h\"\n#include \"Common/StringToInt.h\"\n#include \"Common/MyException.h\"\n#include \"Windows/Thread.h\"\n#include \"Windows/Error.h\"\n#include \"Windows/System.h\"\n#include \"../FileManager/HelpUtils.h\"\n// #include \"BenchmarkDialogRes.h\"\n#include \"BenchmarkDialog.h\"\n\nusing namespace NWindows;\n\n// const int kNumBenchDictionaryBitsStart = 21;\n\nstatic LPCWSTR kHelpTopic = L\"fm/benchmark.htm\";\n\nstatic const UINT_PTR kTimerID = 4;\nstatic const UINT kTimerElapse = 1000;\n\n#ifdef LANG\n#include \"../FileManager/LangUtils.h\"\n#endif\n\nusing namespace NWindows;\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDC_BENCHMARK_DICTIONARY, 0x02000D0C },\n  { IDC_BENCHMARK_MEMORY, 0x03080001 },\n  { IDC_BENCHMARK_NUM_THREADS, 0x02000D12 },\n  { IDC_BENCHMARK_SPEED_LABEL, 0x03080004 },\n  { IDC_BENCHMARK_RATING_LABEL, 0x03080005 },\n  { IDC_BENCHMARK_COMPRESSING, 0x03080002 },\n  { IDC_BENCHMARK_DECOMPRESSING, 0x03080003 },\n  { IDC_BENCHMARK_CURRENT, 0x03080007 },\n  { IDC_BENCHMARK_RESULTING, 0x03080008 },\n  { IDC_BENCHMARK_CURRENT2, 0x03080007 },\n  { IDC_BENCHMARK_RESULTING2, 0x03080008 },\n  { IDC_BENCHMARK_TOTAL_RATING, 0x03080006 },\n  { IDC_BENCHMARK_ELAPSED, 0x02000C01 },\n  { IDC_BENCHMARK_SIZE, 0x02000C03 },\n  { IDC_BENCHMARK_PASSES, 0x03080009 },\n  // { IDC_BENCHMARK_ERRORS, 0x0308000A },\n  { IDC_BENCHMARK_USAGE_LABEL, 0x0308000B },\n  { IDC_BENCHMARK_RPU_LABEL, 0x0308000C },\n  { IDC_BENCHMARK_COMBO_NUM_THREADS, 0x02000D12},\n \n  { IDC_BUTTON_STOP, 0x02000714 },\n  { IDC_BUTTON_RESTART, 0x02000715 },\n  { IDHELP, 0x02000720 },\n  { IDCANCEL, 0x02000710 }\n};\n#endif\n\nstatic void MyMessageBoxError(HWND hwnd, LPCWSTR message)\n{\n  MessageBoxW(hwnd, message, L\"7-Zip\", MB_ICONERROR);\n}\n\nconst LPCTSTR kProcessingString = TEXT(\"...\");\nconst LPCTSTR kMB = TEXT(\" MB\");\nconst LPCTSTR kMIPS =  TEXT(\" MIPS\");\nconst LPCTSTR kKBs = TEXT(\" KB/s\");\n\nstatic const int kMinDicLogSize = 21;\nstatic const UInt32 kMinDicSize = (1 << kMinDicLogSize);\nstatic const UInt32 kMaxDicSize =\n    #ifdef _WIN64\n    (1 << 30);\n    #else\n    (1 << 27);\n    #endif\n\nbool CBenchmarkDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetWindowText(HWND(*this), 0x03080000);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n\n  _syncInfo.Init();\n\n  m_Dictionary.Attach(GetItem(IDC_BENCHMARK_COMBO_DICTIONARY));\n  int cur = 0;\n  // _syncInfo.DictionarySize = (1 << kNumBenchDictionaryBitsStart);\n\n  UInt32 numCPUs = NSystem::GetNumberOfProcessors();\n  if (numCPUs < 1)\n    numCPUs = 1;\n  numCPUs = MyMin(numCPUs, (UInt32)(1 << 8));\n  cur = 0;\n  bool setDefaultThreads = (_syncInfo.NumThreads == (UInt32)(-1));\n  if (setDefaultThreads)\n  {\n    _syncInfo.NumThreads = numCPUs;\n    if (_syncInfo.NumThreads > 1)\n      _syncInfo.NumThreads &= ~1;\n  }\n\n  UInt64 ramSize = NSystem::GetRamSize();\n  bool setDefaultDictionary = (_syncInfo.DictionarySize == (UInt32)(-1));\n  if (setDefaultDictionary)\n  {\n    int dicSizeLog;\n    for (dicSizeLog = 25; dicSizeLog >= kBenchMinDicLogSize; dicSizeLog--)\n      if (GetBenchMemoryUsage(_syncInfo.NumThreads, ((UInt32)1 << dicSizeLog)) + (8 << 20) <= ramSize)\n        break;\n    _syncInfo.DictionarySize = (1 << dicSizeLog);\n  }\n  if (_syncInfo.DictionarySize < kMinDicSize)\n    _syncInfo.DictionarySize = kMinDicSize;\n  if (_syncInfo.DictionarySize > kMaxDicSize)\n    _syncInfo.DictionarySize = kMaxDicSize;\n\n  for (int i = kMinDicLogSize; i <= 30; i++)\n    for (int j = 0; j < 2; j++)\n    {\n      UInt32 dictionary = (1 << i) + (j << (i - 1));\n      if (dictionary > kMaxDicSize)\n        continue;\n      TCHAR s[40];\n      ConvertUInt64ToString((dictionary >> 20), s);\n      lstrcat(s, kMB);\n      int index = (int)m_Dictionary.AddString(s);\n      m_Dictionary.SetItemData(index, dictionary);\n      if (dictionary <= _syncInfo.DictionarySize)\n        cur = index;\n    }\n  m_Dictionary.SetCurSel(cur);\n\n  m_NumThreads.Attach(GetItem(IDC_BENCHMARK_COMBO_NUM_THREADS));\n  for (UInt32 num = 1; ;)\n  {\n    if (num > numCPUs * 2)\n      break;\n    TCHAR s[40];\n    ConvertUInt64ToString(num, s);\n    int index = (int)m_NumThreads.AddString(s);\n    m_NumThreads.SetItemData(index, num);\n    if (num <= numCPUs && setDefaultThreads)\n    {\n      _syncInfo.NumThreads = num;\n      cur = index;\n    }\n    if (num > 1)\n      num++;\n    num++;\n  }\n  m_NumThreads.SetCurSel(cur);\n\n  OnChangeSettings();\n\n  _syncInfo._startEvent.Set();\n  _timer = SetTimer(kTimerID, kTimerElapse);\n  return CModalDialog::OnInit();\n}\n\nUInt32 CBenchmarkDialog::GetNumberOfThreads()\n{\n  return (UInt32)m_NumThreads.GetItemData(m_NumThreads.GetCurSel());\n}\n\nUInt32 CBenchmarkDialog::OnChangeDictionary()\n{\n  UInt32 dictionary = (UInt32)m_Dictionary.GetItemData(m_Dictionary.GetCurSel());\n  UInt64 memUsage = GetBenchMemoryUsage(GetNumberOfThreads(), dictionary);\n  memUsage = (memUsage + (1 << 20) - 1) >> 20;\n  TCHAR s[40];\n  ConvertUInt64ToString(memUsage, s);\n  lstrcat(s, kMB);\n  SetItemText(IDC_BENCHMARK_MEMORY_VALUE, s);\n  return dictionary;\n}\n\nstatic const UInt32 g_IDs[] =\n{\n  IDC_BENCHMARK_COMPRESSING_USAGE,\n  IDC_BENCHMARK_COMPRESSING_USAGE2,\n  IDC_BENCHMARK_COMPRESSING_SPEED,\n  IDC_BENCHMARK_COMPRESSING_SPEED2,\n  IDC_BENCHMARK_COMPRESSING_RATING,\n  IDC_BENCHMARK_COMPRESSING_RATING2,\n  IDC_BENCHMARK_COMPRESSING_RPU,\n  IDC_BENCHMARK_COMPRESSING_RPU2,\n  \n  IDC_BENCHMARK_DECOMPRESSING_SPEED,\n  IDC_BENCHMARK_DECOMPRESSING_SPEED2,\n  IDC_BENCHMARK_DECOMPRESSING_RATING,\n  IDC_BENCHMARK_DECOMPRESSING_RATING2,\n  IDC_BENCHMARK_DECOMPRESSING_USAGE,\n  IDC_BENCHMARK_DECOMPRESSING_USAGE2,\n  IDC_BENCHMARK_DECOMPRESSING_RPU,\n  IDC_BENCHMARK_DECOMPRESSING_RPU2,\n  \n  IDC_BENCHMARK_TOTAL_USAGE_VALUE,\n  IDC_BENCHMARK_TOTAL_RATING_VALUE,\n  IDC_BENCHMARK_TOTAL_RPU_VALUE\n};\n  \nvoid CBenchmarkDialog::OnChangeSettings()\n{\n  EnableItem(IDC_BUTTON_STOP, true);\n  UInt32 dictionary = OnChangeDictionary();\n  TCHAR s[40] = { TEXT('/'), TEXT(' '), 0 };\n  ConvertUInt64ToString(NSystem::GetNumberOfProcessors(), s + 2);\n  SetItemText(IDC_BENCHMARK_HARDWARE_THREADS, s);\n  for (int i = 0; i < sizeof(g_IDs) / sizeof(g_IDs[0]); i++)\n    SetItemText(g_IDs[i], kProcessingString);\n  _startTime = GetTickCount();\n  PrintTime();\n  NWindows::NSynchronization::CCriticalSectionLock lock(_syncInfo.CS);\n  _syncInfo.Init();\n  _syncInfo.DictionarySize = dictionary;\n  _syncInfo.Changed = true;\n  _syncInfo.NumThreads = GetNumberOfThreads();\n}\n\nvoid CBenchmarkDialog::OnRestartButton()\n{\n  OnChangeSettings();\n}\n\nvoid CBenchmarkDialog::OnStopButton()\n{\n  EnableItem(IDC_BUTTON_STOP, false);\n  _syncInfo.Pause();\n}\n\nvoid CBenchmarkDialog::OnHelp()\n{\n  ShowHelpWindow(NULL, kHelpTopic);\n}\n\nvoid CBenchmarkDialog::OnCancel()\n{\n  _syncInfo.Stop();\n  KillTimer(_timer);\n  CModalDialog::OnCancel();\n}\n\nstatic void GetTimeString(UInt64 timeValue, TCHAR *s)\n{\n  wsprintf(s, TEXT(\"%02d:%02d:%02d\"),\n      UInt32(timeValue / 3600),\n      UInt32((timeValue / 60) % 60),\n      UInt32(timeValue % 60));\n}\n\nvoid CBenchmarkDialog::PrintTime()\n{\n  UInt32 curTime = ::GetTickCount();\n  UInt32 elapsedTime = (curTime - _startTime);\n  UInt32 elapsedSec = elapsedTime / 1000;\n  if (elapsedSec != 0 && _syncInfo.WasPaused())\n    return;\n  TCHAR s[40];\n  GetTimeString(elapsedSec, s);\n  SetItemText(IDC_BENCHMARK_ELAPSED_VALUE, s);\n}\n\nvoid CBenchmarkDialog::PrintRating(UInt64 rating, UINT controlID)\n{\n  TCHAR s[40];\n  ConvertUInt64ToString(rating / 1000000, s);\n  lstrcat(s, kMIPS);\n  SetItemText(controlID, s);\n}\n\nvoid CBenchmarkDialog::PrintUsage(UInt64 usage, UINT controlID)\n{\n  TCHAR s[40];\n  ConvertUInt64ToString((usage + 5000) / 10000, s);\n  lstrcat(s, TEXT(\"%\"));\n  SetItemText(controlID, s);\n}\n\nvoid CBenchmarkDialog::PrintResults(\n    UInt32 dictionarySize,\n    const CBenchInfo2 &info,\n    UINT usageID, UINT speedID, UINT rpuID, UINT ratingID,\n    bool decompressMode)\n{\n  if (info.GlobalTime == 0)\n    return;\n\n  UInt64 size = info.UnpackSize;\n  TCHAR s[40];\n  {\n    UInt64 speed = size * info.GlobalFreq / info.GlobalTime;\n    ConvertUInt64ToString(speed / 1024, s);\n    lstrcat(s, kKBs);\n    SetItemText(speedID, s);\n  }\n  UInt64 rating;\n  if (decompressMode)\n    rating = GetDecompressRating(info.GlobalTime, info.GlobalFreq, size, info.PackSize, 1);\n  else\n    rating = GetCompressRating(dictionarySize, info.GlobalTime, info.GlobalFreq, size * info.NumIterations);\n\n  PrintRating(rating, ratingID);\n  PrintRating(GetRatingPerUsage(info, rating), rpuID);\n  PrintUsage(GetUsage(info), usageID);\n}\n\nbool CBenchmarkDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */)\n{\n  PrintTime();\n  NWindows::NSynchronization::CCriticalSectionLock lock(_syncInfo.CS);\n\n  TCHAR s[40];\n  ConvertUInt64ToString((_syncInfo.ProcessedSize >> 20), s);\n  lstrcat(s, kMB);\n  SetItemText(IDC_BENCHMARK_SIZE_VALUE, s);\n\n  ConvertUInt64ToString(_syncInfo.NumPasses, s);\n  SetItemText(IDC_BENCHMARK_PASSES_VALUE, s);\n\n  /*\n  ConvertUInt64ToString(_syncInfo.NumErrors, s);\n  SetItemText(IDC_BENCHMARK_ERRORS_VALUE, s);\n  */\n\n  {\n    UInt32 dicSizeTemp = (UInt32)MyMax(_syncInfo.ProcessedSize, UInt64(1) << 20);\n    dicSizeTemp = MyMin(dicSizeTemp, _syncInfo.DictionarySize),\n    PrintResults(dicSizeTemp,\n      _syncInfo.CompressingInfoTemp,\n      IDC_BENCHMARK_COMPRESSING_USAGE,\n      IDC_BENCHMARK_COMPRESSING_SPEED,\n      IDC_BENCHMARK_COMPRESSING_RPU,\n      IDC_BENCHMARK_COMPRESSING_RATING);\n  }\n\n  {\n    PrintResults(\n      _syncInfo.DictionarySize,\n      _syncInfo.CompressingInfo,\n      IDC_BENCHMARK_COMPRESSING_USAGE2,\n      IDC_BENCHMARK_COMPRESSING_SPEED2,\n      IDC_BENCHMARK_COMPRESSING_RPU2,\n      IDC_BENCHMARK_COMPRESSING_RATING2);\n  }\n\n  {\n    PrintResults(\n      _syncInfo.DictionarySize,\n      _syncInfo.DecompressingInfoTemp,\n      IDC_BENCHMARK_DECOMPRESSING_USAGE,\n      IDC_BENCHMARK_DECOMPRESSING_SPEED,\n      IDC_BENCHMARK_DECOMPRESSING_RPU,\n      IDC_BENCHMARK_DECOMPRESSING_RATING,\n      true);\n  }\n  {\n    PrintResults(\n      _syncInfo.DictionarySize,\n      _syncInfo.DecompressingInfo,\n      IDC_BENCHMARK_DECOMPRESSING_USAGE2,\n      IDC_BENCHMARK_DECOMPRESSING_SPEED2,\n      IDC_BENCHMARK_DECOMPRESSING_RPU2,\n      IDC_BENCHMARK_DECOMPRESSING_RATING2,\n      true);\n    if (_syncInfo.DecompressingInfo.GlobalTime > 0 &&\n        _syncInfo.CompressingInfo.GlobalTime > 0)\n    {\n      UInt64 comprRating = GetCompressRating(_syncInfo.DictionarySize,\n          _syncInfo.CompressingInfo.GlobalTime, _syncInfo.CompressingInfo.GlobalFreq, _syncInfo.CompressingInfo.UnpackSize);\n      UInt64 decomprRating = GetDecompressRating(_syncInfo.DecompressingInfo.GlobalTime,\n          _syncInfo.DecompressingInfo.GlobalFreq, _syncInfo.DecompressingInfo.UnpackSize,\n          _syncInfo.DecompressingInfo.PackSize, 1);\n      PrintRating((comprRating + decomprRating) / 2, IDC_BENCHMARK_TOTAL_RATING_VALUE);\n      PrintRating((\n          GetRatingPerUsage(_syncInfo.CompressingInfo, comprRating) +\n          GetRatingPerUsage(_syncInfo.DecompressingInfo, decomprRating)) / 2, IDC_BENCHMARK_TOTAL_RPU_VALUE);\n      PrintUsage((GetUsage(_syncInfo.CompressingInfo) + GetUsage(_syncInfo.DecompressingInfo)) / 2, IDC_BENCHMARK_TOTAL_USAGE_VALUE);\n    }\n  }\n  return true;\n}\n\nbool CBenchmarkDialog::OnCommand(int code, int itemID, LPARAM lParam)\n{\n  if (code == CBN_SELCHANGE &&\n      (itemID == IDC_BENCHMARK_COMBO_DICTIONARY ||\n       itemID == IDC_BENCHMARK_COMBO_NUM_THREADS))\n  {\n    OnChangeSettings();\n    return true;\n  }\n  return CModalDialog::OnCommand(code, itemID, lParam);\n}\n\nbool CBenchmarkDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  switch(buttonID)\n  {\n    case IDC_BUTTON_RESTART:\n      OnRestartButton();\n      return true;\n    case IDC_BUTTON_STOP:\n      OnStopButton();\n      return true;\n  }\n  return CModalDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n\nstruct CThreadBenchmark\n{\n  CProgressSyncInfo *SyncInfo;\n  UInt64 _startTime;\n  #ifdef EXTERNAL_LZMA\n  CCodecs *codecs;\n  #endif\n  // UInt32 dictionarySize;\n  // UInt32 numThreads;\n\n  HRESULT Process();\n  HRESULT Result;\n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    ((CThreadBenchmark *)param)->Result = ((CThreadBenchmark *)param)->Process();\n    return 0;\n  }\n};\n\nstruct CBenchCallback: public IBenchCallback\n{\n  UInt32 dictionarySize;\n  CProgressSyncInfo *SyncInfo;\n  HRESULT SetEncodeResult(const CBenchInfo &info, bool final);\n  HRESULT SetDecodeResult(const CBenchInfo &info, bool final);\n};\n\nHRESULT CBenchCallback::SetEncodeResult(const CBenchInfo &info, bool final)\n{\n  NSynchronization::CCriticalSectionLock lock(SyncInfo->CS);\n  if (SyncInfo->Changed || SyncInfo->Paused || SyncInfo->Stopped)\n    return E_ABORT;\n  SyncInfo->ProcessedSize = info.UnpackSize;\n  if (final && SyncInfo->CompressingInfo.GlobalTime == 0)\n  {\n    (CBenchInfo&)SyncInfo->CompressingInfo = info;\n    if (SyncInfo->CompressingInfo.GlobalTime == 0)\n      SyncInfo->CompressingInfo.GlobalTime = 1;\n  }\n  else\n    (CBenchInfo&)SyncInfo->CompressingInfoTemp = info;\n\n  return S_OK;\n}\n\nHRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final)\n{\n  NSynchronization::CCriticalSectionLock lock(SyncInfo->CS);\n  if (SyncInfo->Changed || SyncInfo->Paused || SyncInfo->Stopped)\n    return E_ABORT;\n  CBenchInfo info2 = info;\n  if (info2.NumIterations == 0)\n    info2.NumIterations = 1;\n\n  info2.UnpackSize *= info2.NumIterations;\n  info2.PackSize *= info2.NumIterations;\n  info2.NumIterations = 1;\n\n  if (final && SyncInfo->DecompressingInfo.GlobalTime == 0)\n  {\n    (CBenchInfo&)SyncInfo->DecompressingInfo = info2;\n    if (SyncInfo->DecompressingInfo.GlobalTime == 0)\n      SyncInfo->DecompressingInfo.GlobalTime = 1;\n  }\n  else\n    (CBenchInfo&)SyncInfo->DecompressingInfoTemp = info2;\n  return S_OK;\n}\n\nHRESULT CThreadBenchmark::Process()\n{\n  try\n  {\n    SyncInfo->WaitCreating();\n    for (;;)\n    {\n      if (SyncInfo->WasStopped())\n        return 0;\n      if (SyncInfo->WasPaused())\n      {\n        Sleep(200);\n        continue;\n      }\n      UInt32 dictionarySize;\n      UInt32 numThreads;\n      {\n        NSynchronization::CCriticalSectionLock lock(SyncInfo->CS);\n        if (SyncInfo->Stopped || SyncInfo->Paused)\n          continue;\n        if (SyncInfo->Changed)\n          SyncInfo->Init();\n        dictionarySize = SyncInfo->DictionarySize;\n        numThreads = SyncInfo->NumThreads;\n      }\n      \n      CBenchCallback callback;\n      callback.dictionarySize = dictionarySize;\n      callback.SyncInfo = SyncInfo;\n      HRESULT result;\n      try\n      {\n        result = LzmaBench(\n          #ifdef EXTERNAL_LZMA\n          codecs,\n          #endif\n          numThreads, dictionarySize, &callback);\n      }\n      catch(...)\n      {\n        result = E_FAIL;\n      }\n\n      if (result != S_OK)\n      {\n        if (result != E_ABORT)\n        {\n          // SyncInfo->NumErrors++;\n          {\n            NSynchronization::CCriticalSectionLock lock(SyncInfo->CS);\n            SyncInfo->Pause();\n          }\n          CSysString message;\n          if (result == S_FALSE)\n            message = TEXT(\"Decoding error\");\n          else\n            message = NError::MyFormatMessage(result);\n          MessageBox(0, message, TEXT(\"7-Zip\"), MB_ICONERROR);\n        }\n      }\n      else\n      {\n        NSynchronization::CCriticalSectionLock lock(SyncInfo->CS);\n        SyncInfo->NumPasses++;\n      }\n    }\n    // return S_OK;\n  }\n  catch(CSystemException &e)\n  {\n    MessageBox(0, NError::MyFormatMessage(e.ErrorCode), TEXT(\"7-Zip\"), MB_ICONERROR);\n    return E_FAIL;\n  }\n  catch(...)\n  {\n    MyMessageBoxError(0, L\"Some error\");\n    return E_FAIL;\n  }\n}\n\nHRESULT Benchmark(\n  #ifdef EXTERNAL_LZMA\n  CCodecs *codecs,\n  #endif\n  UInt32 numThreads, UInt32 dictionarySize)\n{\n  CThreadBenchmark benchmarker;\n  #ifdef EXTERNAL_LZMA\n  benchmarker.codecs = codecs;\n  #endif\n\n  CBenchmarkDialog benchmarkDialog;\n  benchmarkDialog._syncInfo.DictionarySize = dictionarySize;\n  benchmarkDialog._syncInfo.NumThreads = numThreads;\n\n  benchmarker.SyncInfo = &benchmarkDialog._syncInfo;\n  NWindows::CThread thread;\n  RINOK(thread.Create(CThreadBenchmark::MyThreadFunction, &benchmarker));\n  benchmarkDialog.Create(0);\n  return thread.Wait();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/BenchmarkDialog.h",
    "content": "// BenchmarkDialog.h\n\n#ifndef __BENCHMARKDIALOG_H\n#define __BENCHMARKDIALOG_H\n\n#include \"BenchmarkDialogRes.h\"\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/ComboBox.h\"\n#include \"Windows/Synchronization.h\"\n#include \"../../Compress/LZMA_Alone/LzmaBench.h\"\n\n#ifdef EXTERNAL_LZMA\n#include \"../Common/LoadCodecs.h\"\n#endif\n\nstruct CBenchInfo2 : public CBenchInfo\n{\n  void Init()  { GlobalTime = UserTime = 0; }\n};\n\nclass CProgressSyncInfo\n{\npublic:\n  bool Stopped;\n  bool Paused;\n  bool Changed;\n  UInt32 DictionarySize;\n  UInt32 NumThreads;\n  UInt64 NumPasses;\n  // UInt64 NumErrors;\n  NWindows::NSynchronization::CManualResetEvent _startEvent;\n  NWindows::NSynchronization::CCriticalSection CS;\n\n  CBenchInfo2 CompressingInfoTemp;\n  CBenchInfo2 CompressingInfo;\n  UInt64 ProcessedSize;\n\n  CBenchInfo2 DecompressingInfoTemp;\n  CBenchInfo2 DecompressingInfo;\n\n  CProgressSyncInfo()\n  {\n    if (_startEvent.Create() != S_OK)\n      throw 3986437;\n  }\n  void Init()\n  {\n    Changed = false;\n    Stopped = false;\n    Paused = false;\n    CompressingInfoTemp.Init();\n    CompressingInfo.Init();\n    ProcessedSize = 0;\n    \n    DecompressingInfoTemp.Init();\n    DecompressingInfo.Init();\n\n    NumPasses = 0;\n    // NumErrors = 0;\n  }\n  void Stop()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(CS);\n    Stopped = true;\n  }\n  bool WasStopped()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(CS);\n    return Stopped;\n  }\n  void Pause()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(CS);\n    Paused = true;\n  }\n  void Start()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(CS);\n    Paused = false;\n  }\n  bool WasPaused()\n  {\n    NWindows::NSynchronization::CCriticalSectionLock lock(CS);\n    return Paused;\n  }\n  void WaitCreating() { _startEvent.Lock(); }\n};\n\nclass CBenchmarkDialog:\n  public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CComboBox m_Dictionary;\n  NWindows::NControl::CComboBox m_NumThreads;\n  UINT_PTR _timer;\n  UINT32 _startTime;\n\n  bool OnTimer(WPARAM timerID, LPARAM callback);\n  virtual bool OnInit();\n  void OnRestartButton();\n  void OnStopButton();\n  void OnHelp();\n  virtual void OnCancel();\n  bool OnButtonClicked(int buttonID, HWND buttonHWND);\n  bool OnCommand(int code, int itemID, LPARAM lParam);\n\n  void PrintTime();\n  void PrintRating(UInt64 rating, UINT controlID);\n  void PrintUsage(UInt64 usage, UINT controlID);\n  void PrintResults(\n      UINT32 dictionarySize,\n      const CBenchInfo2 &info, UINT usageID, UINT speedID, UINT rpuID, UINT ratingID,\n      bool decompressMode = false);\n\n  UInt32 GetNumberOfThreads();\n  UInt32 OnChangeDictionary();\n  void OnChangeSettings();\npublic:\n  CProgressSyncInfo _syncInfo;\n\n  CBenchmarkDialog(): _timer(0) {}\n  INT_PTR Create(HWND wndParent = 0) { return CModalDialog::Create(IDD_DIALOG_BENCHMARK, wndParent); }\n};\n\nHRESULT Benchmark(\n  #ifdef EXTERNAL_LZMA\n  CCodecs *codecs,\n  #endif\n  UInt32 dictionarySize, UInt32 numThreads);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/BenchmarkDialogRes.h",
    "content": "#define IDD_DIALOG_BENCHMARK            800\n#define IDC_BUTTON_STOP                 1001\n#define IDC_BUTTON_RESTART              1002\n#define IDC_BENCHMARK_DICTIONARY        1010\n#define IDC_BENCHMARK_COMBO_DICTIONARY  1011\n#define IDC_BENCHMARK_MEMORY            1012\n#define IDC_BENCHMARK_MEMORY_VALUE      1013\n#define IDC_BENCHMARK_NUM_THREADS       1014\n#define IDC_BENCHMARK_COMBO_NUM_THREADS 1015\n#define IDC_BENCHMARK_HARDWARE_THREADS  1016\n\n#define IDC_BENCHMARK_SPEED_LABEL       1020\n#define IDC_BENCHMARK_RATING_LABEL      1021\n#define IDC_BENCHMARK_COMPRESSING       1022\n#define IDC_BENCHMARK_DECOMPRESSING     1023\n#define IDC_BENCHMARK_CURRENT           1024\n#define IDC_BENCHMARK_RESULTING         1025\n#define IDC_BENCHMARK_CURRENT2          1026\n#define IDC_BENCHMARK_RESULTING2        1027\n#define IDC_BENCHMARK_USAGE_LABEL       1028\n#define IDC_BENCHMARK_RPU_LABEL         1029\n\n#define IDC_BENCHMARK_COMPRESSING_SPEED 1030\n#define IDC_BENCHMARK_COMPRESSING_SPEED2 1031\n#define IDC_BENCHMARK_COMPRESSING_RATING 1032\n#define IDC_BENCHMARK_COMPRESSING_RATING2 1033\n#define IDC_BENCHMARK_COMPRESSING_USAGE 1034\n#define IDC_BENCHMARK_COMPRESSING_USAGE2 1035\n#define IDC_BENCHMARK_COMPRESSING_RPU 1036\n#define IDC_BENCHMARK_COMPRESSING_RPU2 1037\n\n\n#define IDC_BENCHMARK_DECOMPRESSING_SPEED 1040\n#define IDC_BENCHMARK_DECOMPRESSING_SPEED2 1041\n#define IDC_BENCHMARK_DECOMPRESSING_RATING 1042\n#define IDC_BENCHMARK_DECOMPRESSING_RATING2 1043\n#define IDC_BENCHMARK_DECOMPRESSING_USAGE 1044\n#define IDC_BENCHMARK_DECOMPRESSING_USAGE2 1045\n#define IDC_BENCHMARK_DECOMPRESSING_RPU 1046\n#define IDC_BENCHMARK_DECOMPRESSING_RPU2 1047\n\n\n#define IDC_BENCHMARK_TOTAL_RATING      1050\n\n#define IDC_BENCHMARK_TOTAL_RATING_VALUE 1051\n#define IDC_BENCHMARK_TOTAL_RPU_VALUE 1052\n#define IDC_BENCHMARK_TOTAL_USAGE_VALUE 1053\n\n#define IDC_BENCHMARK_ELAPSED           1060\n#define IDC_BENCHMARK_ELAPSED_VALUE     1061\n#define IDC_BENCHMARK_SIZE              1062\n#define IDC_BENCHMARK_SIZE_VALUE        1063\n#define IDC_BENCHMARK_PASSES            1066\n#define IDC_BENCHMARK_PASSES_VALUE      1067\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/BenchmarkDialog_rc.cpp",
    "content": "// BenchmarkDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"Windows/Control/DialogImpl.h\"\n#include \"BenchmarkDialogRes.h\"\n\n#if 0\n\n\nIDD_DIALOG_BENCHMARK DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE | WS_MINIMIZEBOX\nCAPTION \"Benchmark\"\nMY_FONT\nBEGIN\nOK  PUSHBUTTON  \"&Restart\", IDC_BUTTON_RESTART, bXPos1, marg, bXSize, bYSize\nOK  PUSHBUTTON  \"&Stop\",    IDC_BUTTON_STOP,    bXPos1,   27, bXSize, bYSize\n  \n  PUSHBUTTON  \"&Help\",    IDHELP,             bXPos2, bYPos, bXSize,bYSize\n  PUSHBUTTON  \"Cancel\",   IDCANCEL,           bXPos1, bYPos, bXSize, bYSize\n  \nOK  LTEXT     \"&Dictionary size:\", IDC_BENCHMARK_DICTIONARY, marg, marg + 1, g0XSize, 8\nOK  COMBOBOX  IDC_BENCHMARK_COMBO_DICTIONARY, g1XPos, marg, g1XSize, 140, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\n\n  LTEXT     \"&Number of CPU threads:\", IDC_BENCHMARK_NUM_THREADS, marg, 24, g0XSize, 8\n  COMBOBOX  IDC_BENCHMARK_COMBO_NUM_THREADS, g1XPos, 23, g1XSize, 140, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\n\n  LTEXT     \"Memory usage:\", IDC_BENCHMARK_MEMORY, gc2XPos, marg + 1, gc2XSize, 8\n  LTEXT     \"0 MB\", IDC_BENCHMARK_MEMORY_VALUE, gc2XPos + gc2XSize, marg + 1, 40, 8\n  LTEXT     \"1\", IDC_BENCHMARK_HARDWARE_THREADS, gc2XPos, 24, 40, 8\n\n  RTEXT     \"CPU Usage\", IDC_BENCHMARK_USAGE_LABEL,           gUsagePos,  53, gUsageSize,  8\n  RTEXT     \"Speed\", IDC_BENCHMARK_SPEED_LABEL,               gSpeedPos,  53, gSpeedSize,  8\n  RTEXT     \"Rating / Usage\", IDC_BENCHMARK_RPU_LABEL,          gRpuPos,  53, gRpuSize,    8\n  RTEXT     \"Rating\", IDC_BENCHMARK_RATING_LABEL,            gRatingPos,  53, gRatingSize, 8\n  \n  GROUPBOX  \"Compressing\", IDC_BENCHMARK_COMPRESSING,              marg,  64,      xSize2, 40\n \n  LTEXT     \"Current\", IDC_BENCHMARK_CURRENT,                   g10XPos,  76, gLabelSize,  8\n  RTEXT     \"100%\", IDC_BENCHMARK_COMPRESSING_USAGE,          gUsagePos,  76, gUsageSize,  8\n  RTEXT     \"100 KB/s\", IDC_BENCHMARK_COMPRESSING_SPEED,      gSpeedPos,  76, gSpeedSize,  8\n  RTEXT     \"0\", IDC_BENCHMARK_COMPRESSING_RPU,                 gRpuPos,  76, gRpuSize,    8\n  RTEXT     \"0\", IDC_BENCHMARK_COMPRESSING_RATING,           gRatingPos,  76, gRatingSize, 8\n  \n  LTEXT     \"Resulting\", IDC_BENCHMARK_RESULTING,               g10XPos,  89, gLabelSize,  8\n  RTEXT     \"100%\", IDC_BENCHMARK_COMPRESSING_USAGE2,         gUsagePos,  89, gUsageSize,  8\n  RTEXT     \"100 KB/s\", IDC_BENCHMARK_COMPRESSING_SPEED2,     gSpeedPos,  89, gSpeedSize,  8\n  RTEXT     \"0\", IDC_BENCHMARK_COMPRESSING_RPU2,                gRpuPos,  89, gRpuSize,    8\n  RTEXT     \"0\", IDC_BENCHMARK_COMPRESSING_RATING2,          gRatingPos,  89, gRatingSize, 8\n  \n  GROUPBOX  \"Decompressing\", IDC_BENCHMARK_DECOMPRESSING,          marg, 111, xSize2, 40\n\n  LTEXT     \"Current\", IDC_BENCHMARK_CURRENT2,                  g10XPos, 123,  gLabelSize, 8\n  RTEXT     \"100%\", IDC_BENCHMARK_DECOMPRESSING_USAGE,        gUsagePos, 123,  gUsageSize, 8\n  RTEXT     \"100 KB/s\", IDC_BENCHMARK_DECOMPRESSING_SPEED,    gSpeedPos, 123,  gSpeedSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_DECOMPRESSING_RPU,               gRpuPos, 123,    gRpuSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_DECOMPRESSING_RATING,         gRatingPos, 123, gRatingSize, 8\n  \n  LTEXT     \"Resulting\", IDC_BENCHMARK_RESULTING2,              g10XPos, 136,  gLabelSize, 8\n  RTEXT     \"100%\", IDC_BENCHMARK_DECOMPRESSING_USAGE2,       gUsagePos, 136,  gUsageSize, 8\n  RTEXT     \"100 KB/s\", IDC_BENCHMARK_DECOMPRESSING_SPEED2,   gSpeedPos, 136,  gSpeedSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_DECOMPRESSING_RPU2,              gRpuPos, 136,    gRpuSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_DECOMPRESSING_RATING2,        gRatingPos, 136, gRatingSize, 8\n  \n  GROUPBOX  \"Total Rating\", IDC_BENCHMARK_TOTAL_RATING, gTotalRatingPos, 163, gTotalRatingSize, 38\n  RTEXT     \"0\", IDC_BENCHMARK_TOTAL_USAGE_VALUE,             gUsagePos, 181,  gUsageSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_TOTAL_RPU_VALUE,                 gRpuPos, 181,    gRpuSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_TOTAL_RATING_VALUE,           gRatingPos, 181, gRatingSize, 8\n  \n  LTEXT     \"Elapsed time:\", IDC_BENCHMARK_ELAPSED,    marg, 163, g2XSize, 8\n  LTEXT     \"Size:\", IDC_BENCHMARK_SIZE,               marg, 176, g2XSize, 8\n  LTEXT     \"Passes:\", IDC_BENCHMARK_PASSES,           marg, 189, g2XSize, 8\n  RTEXT     \"00:00:00\", IDC_BENCHMARK_ELAPSED_VALUE, g3XPos, 163, g3XSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_SIZE_VALUE,           g3XPos, 176, g3XSize, 8\n  RTEXT     \"0\", IDC_BENCHMARK_PASSES_VALUE,         g3XPos, 189, g3XSize, 8\nEND\n#endif // #if 0\n\nclass CBenchmarkDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CBenchmarkDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent , int id) : CModalDialogImpl(dialog,parent, id, wxT(\"Benchmark\"))\n  {\n\n\twxSizer *topsizer = new wxBoxSizer(wxVERTICAL);\n\n\twxSizer *sizerLine1 = new wxBoxSizer(wxHORIZONTAL);\n\n\twxSizer *sizeLine1Btn = new wxBoxSizer(wxVERTICAL);\n\tsizeLine1Btn->Add(new wxButton(this, IDC_BUTTON_RESTART, _T(\"&Restart\")) , 0, wxALL|wxEXPAND, 5 );\n\tsizeLine1Btn->Add(new wxButton(this, IDC_BUTTON_STOP, _T(\"&Stop\")) , 0, wxALL|wxEXPAND, 5 );\n\n\twxSizer *sizeLine1Combo = new wxBoxSizer(wxVERTICAL);\n\n\twxComboBox * chcDicoSize = new wxComboBox(this, IDC_BENCHMARK_COMBO_DICTIONARY,\n\t\t wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\twxComboBox * chcThread = new wxComboBox(this, IDC_BENCHMARK_COMBO_NUM_THREADS,\n\t\t wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\tsizeLine1Combo->Add(chcDicoSize , 0, wxALL, 5 );\n\tsizeLine1Combo->Add(chcThread , 0, wxALL, 5 );\n\n\twxSizer *sizeLine1ComboLabel = new wxBoxSizer(wxVERTICAL);\n\tsizeLine1ComboLabel->Add(new wxStaticText(this, IDC_BENCHMARK_DICTIONARY, _T(\"&Dictionary size:\")) , 1, wxALL|wxEXPAND, 5 );\n\tsizeLine1ComboLabel->Add(new wxStaticText(this, IDC_BENCHMARK_NUM_THREADS, _T(\"&Number of CPU threads:\")) , 1, wxALL|wxEXPAND, 5 );\n\n\twxSizer *sizeLine1Col3 = new wxBoxSizer(wxVERTICAL);\n\tsizeLine1Col3->Add(new wxStaticText(this, IDC_BENCHMARK_MEMORY, _T(\"Memory usage:\")) , 1, wxALL|wxEXPAND, 5 );\n\tsizeLine1Col3->Add(new wxStaticText(this, IDC_BENCHMARK_HARDWARE_THREADS, _T(\"1\")) , 1, wxALL|wxEXPAND, 5 );\n\n\twxSizer *sizeLine1Col4 = new wxBoxSizer(wxVERTICAL);\n\tsizeLine1Col4->Add(new wxStaticText(this, IDC_BENCHMARK_MEMORY_VALUE, _T(\"0 MB\")) , 0, wxALL|wxEXPAND, 5 );\n\n\tsizerLine1->Add(sizeLine1ComboLabel,0, wxALL|wxEXPAND, 5);\n\tsizerLine1->Add(sizeLine1Combo,0, wxALL|wxEXPAND, 5);\n\tsizerLine1->Add(sizeLine1Col3,0, wxALL|wxEXPAND, 5);\n\tsizerLine1->Add(sizeLine1Col4,0, wxALL|wxEXPAND, 5);\n\tsizerLine1->Add(sizeLine1Btn,0, wxALL|wxEXPAND, 5);\n\n\t// LABEL (copy the structure of the compressing or decompressing group\n\n\twxStaticBoxSizer * sizerLine2 = new wxStaticBoxSizer(new wxStaticBox(this,wxID_ANY,_T(\"\")),wxVERTICAL);\n\twxSizer *sizerLabel = new wxBoxSizer(wxHORIZONTAL);\n\tsizerLabel->Add(new wxStaticText(this, wxID_ANY, _T(\" \")) , 1, wxALL|wxEXPAND, 5 );\n\tsizerLabel->Add(new wxStaticText(this, IDC_BENCHMARK_SPEED_LABEL, _T(\"Speed\")) , 1, wxALL|wxEXPAND, 5 );\n\tsizerLabel->Add(new wxStaticText(this, IDC_BENCHMARK_USAGE_LABEL, _T(\"CPU Usage\")) , 1, wxALL|wxEXPAND, 5 );\n\tsizerLabel->Add(new wxStaticText(this, IDC_BENCHMARK_RPU_LABEL, _T(\"Rating / Usage\")), 1, wxALL|wxEXPAND, 5 );\n\tsizerLabel->Add(new wxStaticText(this, IDC_BENCHMARK_RATING_LABEL, _T(\"Rating\")) , 1, wxALL|wxEXPAND, 5 );\n\n\tsizerLine2->Add(sizerLabel, 0, wxALL|wxEXPAND, 5);\n\n\t// GROUP COMPRESSING\n\n\twxStaticBoxSizer * grpCompress = new wxStaticBoxSizer(new wxStaticBox(this,IDC_BENCHMARK_COMPRESSING,_T(\"Compressing\")),wxVERTICAL);\n\twxSizer *grpCompress1 = new wxBoxSizer(wxHORIZONTAL);\n\tgrpCompress1->Add(new wxStaticText(this, IDC_BENCHMARK_CURRENT, _T(\"Current\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpCompress1->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_SPEED, _T(\"100 KB/s\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpCompress1->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_USAGE, _T(\"100%\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpCompress1->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_RPU, _T(\"0\")), 1, wxALL|wxEXPAND, 5 );\n\tgrpCompress1->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_RATING, _T(\"0\")) , 1, wxALL|wxEXPAND, 5 );\n\n\twxSizer *grpCompress2 = new wxBoxSizer(wxHORIZONTAL);\n\tgrpCompress2->Add(new wxStaticText(this, IDC_BENCHMARK_RESULTING, _T(\"Resulting\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpCompress2->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_SPEED2, _T(\"100 KB/s\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpCompress2->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_USAGE2, _T(\"100%\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpCompress2->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_RPU2, _T(\"0\")) , 1, wxALL|wxEXPAND, 5);\n\tgrpCompress2->Add(new wxStaticText(this, IDC_BENCHMARK_COMPRESSING_RATING2, _T(\"0\")) , 1, wxALL|wxEXPAND, 5 );\n\n\tgrpCompress->Add(grpCompress1, 0, wxALL|wxEXPAND, 5);\n\tgrpCompress->Add(grpCompress2, 0, wxALL|wxEXPAND, 5);\n\n\t// GROUP DECOMPRESSING\n\n\twxStaticBoxSizer * grpDecompress = new wxStaticBoxSizer(new wxStaticBox(this,IDC_BENCHMARK_DECOMPRESSING,_T(\"Decompressing\")),wxVERTICAL);\n\twxSizer *grpDecompress1 = new wxBoxSizer(wxHORIZONTAL);\n\tgrpDecompress1->Add(new wxStaticText(this, IDC_BENCHMARK_CURRENT2, _T(\"Current\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpDecompress1->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_SPEED, _T(\"100 KB/s\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpDecompress1->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_USAGE, _T(\"100%\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpDecompress1->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_RPU, _T(\"0\")), 1, wxALL|wxEXPAND, 5 );\n\tgrpDecompress1->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_RATING, _T(\"0\")) , 1, wxALL|wxEXPAND, 5 );\n\n\twxSizer *grpDecompress2 = new wxBoxSizer(wxHORIZONTAL);\n\tgrpDecompress2->Add(new wxStaticText(this, IDC_BENCHMARK_RESULTING2, _T(\"Resulting\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpDecompress2->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_SPEED2, _T(\"100 KB/s\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpDecompress2->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_USAGE2, _T(\"100%\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpDecompress2->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_RPU2, _T(\"0\")) , 1, wxALL|wxEXPAND, 5);\n\tgrpDecompress2->Add(new wxStaticText(this, IDC_BENCHMARK_DECOMPRESSING_RATING2, _T(\"0\")) , 1, wxALL|wxEXPAND, 5 );\n\n\tgrpDecompress->Add(grpDecompress1, 0, wxALL|wxEXPAND, 5);\n\tgrpDecompress->Add(grpDecompress2, 0, wxALL|wxEXPAND, 5);\n\n\t// GROUPE TOTAL RATING\n\twxStaticBoxSizer * grpTotalRating = new wxStaticBoxSizer(new wxStaticBox(this,IDC_BENCHMARK_TOTAL_RATING,_T(\"Total Rating\")),wxHORIZONTAL);\n\tgrpTotalRating->Add(new wxStaticText(this, wxID_ANY, _T(\"\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpTotalRating->Add(new wxStaticText(this, IDC_BENCHMARK_TOTAL_USAGE_VALUE, _T(\"0\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpTotalRating->Add(new wxStaticText(this, IDC_BENCHMARK_TOTAL_RPU_VALUE, _T(\"0\")) , 1, wxALL|wxEXPAND, 5 );\n\tgrpTotalRating->Add(new wxStaticText(this, IDC_BENCHMARK_TOTAL_RATING_VALUE, _T(\"0\")) , 1, wxALL|wxEXPAND, 5 );\n\n\t// GROUPE ELAPSED TIME\n\twxSizer * grpElapsedTime = new wxBoxSizer(wxHORIZONTAL);\n\n\twxSizer * grpElapsedTime1 = new wxBoxSizer(wxVERTICAL);\n\tgrpElapsedTime1->Add(new wxStaticText(this, IDC_BENCHMARK_ELAPSED, _T(\"Elapsed time:\")) , 0, wxALL|wxEXPAND, 5 );\n\tgrpElapsedTime1->Add(new wxStaticText(this, IDC_BENCHMARK_SIZE, _T(\"Size:\")) , 0, wxALL|wxEXPAND, 5 );\n\tgrpElapsedTime1->Add(new wxStaticText(this, IDC_BENCHMARK_PASSES, _T(\"Passes:\")) , 0, wxALL|wxEXPAND, 5 );\n\n\twxSizer * grpElapsedTime2 = new wxBoxSizer(wxVERTICAL);\n\tgrpElapsedTime2->Add(new wxStaticText(this, IDC_BENCHMARK_ELAPSED_VALUE, _T(\"00:00:00\")) , 0, wxALL|wxEXPAND, 5 );\n\tgrpElapsedTime2->Add(new wxStaticText(this, IDC_BENCHMARK_SIZE_VALUE, _T(\"0\")) , 0, wxALL|wxEXPAND, 5 );\n\tgrpElapsedTime2->Add(new wxStaticText(this, IDC_BENCHMARK_PASSES_VALUE, _T(\"0\")) , 0, wxALL|wxEXPAND, 5 );\n\n\tgrpElapsedTime->Add(grpElapsedTime1,0, wxALL|wxEXPAND, 5);\n\tgrpElapsedTime->Add(grpElapsedTime2,0, wxALL|wxEXPAND, 5);\n\n\twxSizer * grp_ElapsedTime_TotalRating = new wxBoxSizer(wxHORIZONTAL);\n\tgrp_ElapsedTime_TotalRating->Add(grpElapsedTime, 0, wxALL|wxEXPAND, 5);\n\tgrp_ElapsedTime_TotalRating->Add(grpTotalRating, 1, wxALL|wxEXPAND, 5);\n\n\t// TOP\n\ttopsizer->Add(sizerLine1,0, wxALL|wxEXPAND, 5);\n\ttopsizer->Add(sizerLine2,0, wxALL|wxEXPAND, 5);\n\ttopsizer->Add(grpCompress, 0, wxALL|wxEXPAND, 5);\n\ttopsizer->Add(grpDecompress, 0, wxALL|wxEXPAND, 5);\n\ttopsizer->Add(grp_ElapsedTime_TotalRating, 0, wxALL|wxEXPAND, 5);\n\n\ttopsizer->Add(CreateButtonSizer(wxHELP|wxCANCEL), 0, wxALL|wxEXPAND, 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nREGISTER_DIALOG(IDD_DIALOG_BENCHMARK,CBenchmarkDialog,0)\n\n// ----------------------------------------------------------------------------\n// event tables and other macros for wxWidgets\n// ----------------------------------------------------------------------------\n\n// the event tables connect the wxWidgets events with the functions (event\n// handlers) which process them. It can be also done at run-time, but for the\n// simple menu events like this the static method is much simpler.\nBEGIN_EVENT_TABLE(CBenchmarkDialogImpl, wxDialog)\n\tEVT_TIMER(wxID_ANY, CModalDialogImpl::OnAnyTimer)\n\tEVT_BUTTON(wxID_ANY, CModalDialogImpl::OnAnyButton)\n\tEVT_COMBOBOX(wxID_ANY,    CModalDialogImpl::OnAnyChoice)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/CompressDialog.cpp",
    "content": "// CompressDialog.cpp\n\n#include \"StdAfx.h\"\n\n#include \"resource.h\"\n#include \"Common/Defs.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n#include \"Windows/CommonDialog.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/ResourceString.h\"\n#include \"Windows/System.h\"\n\n#include \"../FileManager/HelpUtils.h\"\n#include \"../FileManager/SplitUtils.h\"\n#include \"../FileManager/FormatUtils.h\"\n\n#include \"../Explorer/MyMessages.h\"\n\n#include \"../Common/ZipRegistry.h\"\n\n#include \"CompressDialog.h\"\n\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\n#ifdef LANG\n#include \"../FileManager/LangUtils.h\"\n#endif\n\n#include \"CompressDialogRes.h\"\n\n#define MY_SIZE_OF_ARRAY(x) (sizeof(x) / sizeof(x[0]))\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDC_STATIC_COMPRESS_ARCHIVE, 0x02000D01 },\n  { IDC_STATIC_COMPRESS_FORMAT, 0x02000D03 },\n  { IDC_STATIC_COMPRESS_LEVEL, 0x02000D0B },\n  { IDC_STATIC_COMPRESS_METHOD, 0x02000D04 },\n  { IDC_STATIC_COMPRESS_DICTIONARY, 0x02000D0C },\n  { IDC_STATIC_COMPRESS_ORDER, 0x02000D0D },\n  { IDC_STATIC_COMPRESS_MEMORY, 0x02000D0E },\n  { IDC_STATIC_COMPRESS_MEMORY_DE, 0x02000D0F },\n  { IDC_STATIC_COMPRESS_THREADS, 0x02000D12 },\n  { IDC_STATIC_COMPRESS_SOLID, 0x02000D13 },\n  { IDC_STATIC_COMPRESS_VOLUME, 0x02000D40 },\n  { IDC_STATIC_COMPRESS_PARAMETERS, 0x02000D06 },\n  \n  { IDC_STATIC_COMPRESS_UPDATE_MODE, 0x02000D02 },\n  { IDC_STATIC_COMPRESS_OPTIONS, 0x02000D07 },\n  { IDC_COMPRESS_SFX, 0x02000D08 },\n  { IDC_COMPRESS_SHARED, 0x02000D16 },\n  \n  { IDC_COMPRESS_ENCRYPTION, 0x02000D10 },\n  { IDC_STATIC_COMPRESS_PASSWORD1, 0x02000B01 },\n  { IDC_STATIC_COMPRESS_PASSWORD2, 0x02000B03 },\n  { IDC_COMPRESS_CHECK_SHOW_PASSWORD, 0x02000B02 },\n  { IDC_STATIC_COMPRESS_ENCRYPTION_METHOD, 0x02000D11 },\n  { IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, 0x02000D0A },\n\n  { IDOK, 0x02000702 },\n  { IDCANCEL, 0x02000710 },\n  { IDHELP, 0x02000720 }\n};\n#endif\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NName;\nusing namespace NDirectory;\n\nstatic const int kHistorySize = 20;\n\nstatic LPCWSTR kExeExt = L\".exe\";\nstatic LPCWSTR k7zFormat = L\"7z\";\n\nstruct CLevelInfo\n{\n  UInt32 ResourceID;\n  UInt32 LangID;\n};\n\nenum ELevel\n{\n  kStore = 0,\n  kFastest = 1,\n  kFast = 3,\n  kNormal = 5,\n  kMaximum = 7,\n  kUltra = 9\n};\n\nstatic const CLevelInfo g_Levels[] =\n{\n  { IDS_METHOD_STORE, 0x02000D81 },\n  { IDS_METHOD_FASTEST, 0x02000D85 },\n  { 0, 0 },\n  { IDS_METHOD_FAST, 0x02000D84 },\n  { 0, 0 },\n  { IDS_METHOD_NORMAL, 0x02000D82 },\n  { 0, 0 },\n  { IDS_METHOD_MAXIMUM, 0x02000D83 },\n  { 0, 0 },\n  { IDS_METHOD_ULTRA, 0x02000D86 }\n};\n\nenum EMethodID\n{\n  kCopy,\n  kLZMA,\n  kPPMd,\n  kBZip2,\n  kDeflate,\n  kDeflate64\n};\n\nstatic const LPCWSTR kMethodsNames[] =\n{\n  L\"Copy\",\n  L\"LZMA\",\n  L\"PPMd\",\n  L\"BZip2\",\n  L\"Deflate\",\n  L\"Deflate64\"\n};\n\nstatic const EMethodID g_7zMethods[] =\n{\n  kLZMA,\n  kPPMd,\n  kBZip2\n};\n\nstatic const EMethodID g_7zSfxMethods[] =\n{\n  kCopy,\n  kLZMA,\n  kPPMd\n};\n\nstatic EMethodID g_ZipMethods[] =\n{\n  kDeflate,\n  kDeflate64,\n  kBZip2,\n  kLZMA\n};\n\nstatic EMethodID g_GZipMethods[] =\n{\n  kDeflate\n};\n\nstatic EMethodID g_BZip2Methods[] =\n{\n  kBZip2\n};\n\nstruct CFormatInfo\n{\n  LPCWSTR Name;\n  UInt32 LevelsMask;\n  const EMethodID *MathodIDs;\n  int NumMethods;\n  bool Filter;\n  bool Solid;\n  bool MultiThread;\n  bool SFX;\n  bool Encrypt;\n  bool EncryptFileNames;\n};\n\n#define METHODS_PAIR(x) x, MY_SIZE_OF_ARRAY(x)\n\nstatic const CFormatInfo g_Formats[] =\n{\n  {\n    L\"\",\n    (1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),\n    0, 0,\n    false, false, false, false, false, false\n  },\n  {\n    k7zFormat,\n    (1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),\n    METHODS_PAIR(g_7zMethods),\n    true, true, true, true, true, true\n  },\n  {\n    L\"Zip\",\n    (1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),\n    METHODS_PAIR(g_ZipMethods),\n    false, false, true, false, true, false\n  },\n  {\n    L\"GZip\",\n    (1 << 1) | (1 << 5) | (1 << 7) | (1 << 9),\n    METHODS_PAIR(g_GZipMethods),\n    false, false, false, false, false, false\n  },\n  {\n    L\"BZip2\",\n    (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7) | (1 << 9),\n    METHODS_PAIR(g_BZip2Methods),\n    false, false, true, false, false\n  },\n  {\n    L\"Tar\",\n    (1 << 0),\n    0, 0,\n    false, false, false, false, false, false\n  }\n};\n\nstatic bool IsMethodSupportedBySfx(int methodID)\n{\n  for (int i = 0; i < MY_SIZE_OF_ARRAY(g_7zSfxMethods); i++)\n    if (methodID == g_7zSfxMethods[i])\n      return true;\n  return false;\n};\n\nstatic UInt64 GetMaxRamSizeForProgram()\n{\n  UInt64 physSize = NSystem::GetRamSize();\n  const UInt64 kMinSysSize = (1 << 24);\n  if (physSize <= kMinSysSize)\n    physSize = 0;\n  else\n    physSize -= kMinSysSize;\n  const UInt64 kMinUseSize = (1 << 25);\n  if (physSize < kMinUseSize)\n    physSize = kMinUseSize;\n  return physSize;\n}\n\nbool CCompressDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetWindowText(HWND(*this), 0x02000D00);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, MY_SIZE_OF_ARRAY(kIDLangPairs) );\n  #endif\n  _password1Control.Attach(GetItem(IDC_COMPRESS_EDIT_PASSWORD1));\n  _password2Control.Attach(GetItem(IDC_COMPRESS_EDIT_PASSWORD2));\n  _password1Control.SetText(Info.Password);\n  _password2Control.SetText(Info.Password);\n  _encryptionMethod.Attach(GetItem(IDC_COMPRESS_COMBO_ENCRYPTION_METHOD));\n\n  m_ArchivePath.Attach(GetItem(IDC_COMPRESS_COMBO_ARCHIVE));\n  m_Format.Attach(GetItem(IDC_COMPRESS_COMBO_FORMAT));\n  m_Level.Attach(GetItem(IDC_COMPRESS_COMBO_LEVEL));\n  m_Method.Attach(GetItem(IDC_COMPRESS_COMBO_METHOD));\n  m_Dictionary.Attach(GetItem(IDC_COMPRESS_COMBO_DICTIONARY));\n  m_Order.Attach(GetItem(IDC_COMPRESS_COMBO_ORDER));\n  m_Solid.Attach(GetItem(IDC_COMPRESS_COMBO_SOLID));\n  m_NumThreads.Attach(GetItem(IDC_COMPRESS_COMBO_THREADS));\n  \n  m_UpdateMode.Attach(GetItem(IDC_COMPRESS_COMBO_UPDATE_MODE));\n  m_Volume.Attach(GetItem(IDC_COMPRESS_COMBO_VOLUME));\n  m_Params.Attach(GetItem(IDC_COMPRESS_EDIT_PARAMETERS));\n\n  AddVolumeItems(m_Volume);\n\n  ReadCompressionInfo(m_RegistryInfo);\n  CheckButton(IDC_COMPRESS_CHECK_SHOW_PASSWORD, m_RegistryInfo.ShowPassword);\n  CheckButton(IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, m_RegistryInfo.EncryptHeaders);\n\n  UpdatePasswordControl();\n\n  Info.ArchiverInfoIndex = 0;\n  int i;\n  for(i = 0; i < m_ArchiverInfoList.Size(); i++)\n  {\n    const CArcInfoEx &ai = m_ArchiverInfoList[i];\n    m_Format.AddString(ai.Name);\n    if (ai.Name.CompareNoCase(m_RegistryInfo.ArchiveType) == 0)\n      Info.ArchiverInfoIndex = i;\n  }\n  m_Format.SetCurSel(Info.ArchiverInfoIndex);\n\n  SetArchiveName(Info.ArchiveName);\n  SetLevel();\n  SetParams();\n  \n  for(i = 0; i < m_RegistryInfo.HistoryArchives.Size() && i < kHistorySize; i++)\n    m_ArchivePath.AddString(m_RegistryInfo.HistoryArchives[i]);\n\n  m_UpdateMode.AddString(LangString(IDS_COMPRESS_UPDATE_MODE_ADD, 0x02000DA1));\n  m_UpdateMode.AddString(LangString(IDS_COMPRESS_UPDATE_MODE_UPDATE, 0x02000DA2));\n  m_UpdateMode.AddString(LangString(IDS_COMPRESS_UPDATE_MODE_FRESH, 0x02000DA3));\n  m_UpdateMode.AddString(LangString(IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE, 0x02000DA4));\n\n  m_UpdateMode.SetCurSel(0);\n\n  SetSolidBlockSize();\n  SetNumThreads();\n\n  TCHAR s[40] = { TEXT('/'), TEXT(' '), 0 };\n  ConvertUInt64ToString(NSystem::GetNumberOfProcessors(), s + 2);\n  SetItemText(IDC_COMPRESS_HARDWARE_THREADS, s);\n\n  CheckButton(IDC_COMPRESS_SFX, Info.SFXMode);\n  CheckButton(IDC_COMPRESS_SHARED, Info.OpenShareForWrite);\n  \n  CheckControlsEnable();\n\n  OnButtonSFX();\n\n  SetEncryptionMethod();\n  SetMemoryUsage();\n  return CModalDialog::OnInit();\n}\n\nnamespace NCompressDialog\n{\n  bool CInfo::GetFullPathName(UString &result) const\n  {\n    NDirectory::MySetCurrentDirectory(CurrentDirPrefix);\n    return MyGetFullPathName(ArchiveName, result);\n  }\n}\n\nvoid CCompressDialog::UpdatePasswordControl()\n{\n  bool showPassword = IsShowPasswordChecked();\n  TCHAR c = showPassword ? 0: TEXT('*');\n  _password1Control.SetPasswordChar(c);\n  _password2Control.SetPasswordChar(c);\n  UString password;\n  _password1Control.GetText(password);\n  _password1Control.SetText(password);\n  _password2Control.GetText(password);\n  _password2Control.SetText(password);\n\n  int cmdShow = showPassword ? SW_HIDE : SW_SHOW;\n  ShowItem(IDC_STATIC_COMPRESS_PASSWORD2, cmdShow);\n  _password2Control.Show(cmdShow);\n}\n\nbool CCompressDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  switch(buttonID)\n  {\n    case IDC_COMPRESS_BUTTON_SET_ARCHIVE:\n    {\n      OnButtonSetArchive();\n      return true;\n    }\n    case IDC_COMPRESS_SFX:\n    {\n      OnButtonSFX();\n      SetMemoryUsage();\n      return true;\n    }\n    case IDC_COMPRESS_CHECK_SHOW_PASSWORD:\n    {\n      UpdatePasswordControl();\n      return true;\n    }\n  }\n  return CModalDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n\nvoid CCompressDialog::CheckSFXControlsEnable()\n{\n  const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];\n  bool enable = fi.SFX;\n  if (enable)\n  {\n    int methodID = GetMethodID();\n    enable = (methodID == -1 || IsMethodSupportedBySfx(methodID));\n  }\n  if (!enable)\n    CheckButton(IDC_COMPRESS_SFX, false);\n  EnableItem(IDC_COMPRESS_SFX, enable);\n}\n\nvoid CCompressDialog::CheckVolumeEnable()\n{\n  bool isSFX = IsSFX();\n  m_Volume.Enable(!isSFX);\n  if (isSFX)\n    m_Volume.SetText(TEXT(\"\"));\n}\n\nvoid CCompressDialog::CheckControlsEnable()\n{\n  const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];\n  Info.SolidIsSpecified = fi.Solid;\n  bool multiThreadEnable = fi.MultiThread;\n  Info.MultiThreadIsAllowed = multiThreadEnable;\n  Info.EncryptHeadersIsAllowed = fi.EncryptFileNames;\n  \n  EnableItem(IDC_COMPRESS_COMBO_SOLID, fi.Solid);\n  EnableItem(IDC_COMPRESS_COMBO_THREADS, multiThreadEnable);\n  CheckSFXControlsEnable();\n  CheckVolumeEnable();\n\n  EnableItem(IDC_COMPRESS_ENCRYPTION, fi.Encrypt);\n\n  EnableItem(IDC_STATIC_COMPRESS_PASSWORD1, fi.Encrypt);\n  EnableItem(IDC_STATIC_COMPRESS_PASSWORD2, fi.Encrypt);\n  EnableItem(IDC_COMPRESS_EDIT_PASSWORD1, fi.Encrypt);\n  EnableItem(IDC_COMPRESS_EDIT_PASSWORD2, fi.Encrypt);\n  EnableItem(IDC_COMPRESS_CHECK_SHOW_PASSWORD, fi.Encrypt);\n\n  EnableItem(IDC_STATIC_COMPRESS_ENCRYPTION_METHOD, fi.Encrypt);\n  EnableItem(IDC_COMPRESS_COMBO_ENCRYPTION_METHOD, fi.Encrypt);\n  EnableItem(IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, fi.EncryptFileNames);\n\n  ShowItem(IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, fi.EncryptFileNames ? SW_SHOW : SW_HIDE);\n}\n\nbool CCompressDialog::IsSFX()\n{\n  CWindow sfxButton = GetItem(IDC_COMPRESS_SFX);\n  return sfxButton.IsEnabled() && IsButtonCheckedBool(IDC_COMPRESS_SFX);\n}\n\nvoid CCompressDialog::OnButtonSFX()\n{\n  SetMethod();\n\n  UString fileName;\n  m_ArchivePath.GetText(fileName);\n  int dotPos = fileName.ReverseFind(L'.');\n  int slashPos = fileName.ReverseFind(WCHAR_PATH_SEPARATOR);\n  if (dotPos < 0 || dotPos <= slashPos)\n    dotPos = -1;\n  bool isSFX = IsSFX();\n  if (isSFX)\n  {\n    if (dotPos >= 0)\n      fileName = fileName.Left(dotPos);\n    fileName += kExeExt;\n    m_ArchivePath.SetText(fileName);\n  }\n  else\n  {\n    if (dotPos >= 0)\n    {\n      UString ext = fileName.Mid(dotPos);\n      if (ext.CompareNoCase(kExeExt) == 0)\n      {\n        fileName = fileName.Left(dotPos);\n        m_ArchivePath.SetText(fileName);\n      }\n    }\n    SetArchiveName2(false); // it's for OnInit\n  }\n\n  CheckVolumeEnable();\n}\n\nvoid CCompressDialog::OnButtonSetArchive()\n{\n  UString fileName;\n  m_ArchivePath.GetText(fileName);\n  fileName.Trim();\n  Info.ArchiveName = fileName;\n  UString fullFileName;\n  if (!Info.GetFullPathName(fullFileName))\n  {\n    fullFileName = Info.ArchiveName;\n    return;\n  }\n  UString title = LangString(IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE, 0x02000D90);\n  UString s = LangString(IDS_OPEN_TYPE_ALL_FILES, 0x02000DB1);\n  s += L\" (*.*)\";\n  UString resPath;\n  if (!MyGetOpenFileName(HWND(*this), title, fullFileName, s, resPath))\n    return;\n  m_ArchivePath.SetText(resPath);\n}\n\n// in ExtractDialog.cpp\nextern void AddUniqueString(UStringVector &strings, const UString &srcString);\n\nstatic bool IsAsciiString(const UString &s)\n{\n  for (int i = 0; i < s.Length(); i++)\n  {\n    wchar_t c = s[i];\n    if (c < 0x20 || c > 0x7F)\n      return false;\n  }\n  return true;\n}\n\nvoid CCompressDialog::OnOK()\n{\n  _password1Control.GetText(Info.Password);\n  if (IsZipFormat())\n  {\n    if (!IsAsciiString(Info.Password))\n    {\n      ShowErrorMessageHwndRes(*this, IDS_PASSWORD_USE_ASCII, 0x02000B11);\n      return;\n    }\n    UString method = GetEncryptionMethodSpec();\n    method.MakeUpper();\n    if (method.Find(L\"AES\") == 0)\n    {\n      if (Info.Password.Length() > 99)\n      {\n        ShowErrorMessageHwndRes(*this, IDS_PASSWORD_IS_TOO_LONG, 0x02000B12);\n        return;\n      }\n    }\n  }\n  if (!IsShowPasswordChecked())\n  {\n    UString password2;\n    _password2Control.GetText(password2);\n    if (password2 != Info.Password)\n    {\n      ShowErrorMessageHwndRes(*this, IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH, 0x02000B10);\n      return;\n    }\n  }\n\n  SaveOptionsInMem();\n  UString s;\n  m_ArchivePath.GetText(s);\n  s.Trim();\n  m_RegistryInfo.HistoryArchives.Clear();\n  AddUniqueString(m_RegistryInfo.HistoryArchives, s);\n  Info.ArchiveName = s;\n  Info.UpdateMode = NCompressDialog::NUpdateMode::EEnum(m_UpdateMode.GetCurSel());\n\n  Info.Level = GetLevelSpec();\n  Info.Dictionary = GetDictionarySpec();\n  Info.Order = GetOrderSpec();\n  Info.OrderMode = GetOrderMode();\n  Info.NumThreads = GetNumThreadsSpec();\n\n  UInt32 solidLogSize = GetBlockSizeSpec();\n  Info.SolidBlockSize = 0;\n  if (solidLogSize > 0 && solidLogSize != (UInt32)-1)\n    Info.SolidBlockSize = (solidLogSize >= 64) ? (UInt64)(Int64)-1 : ((UInt64)1 << solidLogSize);\n\n  Info.Method = GetMethodSpec();\n  Info.EncryptionMethod = GetEncryptionMethodSpec();\n  Info.ArchiverInfoIndex = m_Format.GetCurSel();\n  Info.SFXMode = IsSFX();\n  Info.OpenShareForWrite = IsButtonCheckedBool(IDC_COMPRESS_SHARED);\n\n  m_RegistryInfo.EncryptHeaders = Info.EncryptHeaders = IsButtonCheckedBool(IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES);\n\n  m_Params.GetText(Info.Options);\n  UString volumeString;\n  m_Volume.GetText(volumeString);\n  volumeString.Trim();\n  Info.VolumeSizes.Clear();\n  if (!volumeString.IsEmpty())\n  {\n    if (!ParseVolumeSizes(volumeString, Info.VolumeSizes))\n    {\n      ShowErrorMessageHwndRes(*this, IDS_COMPRESS_INCORRECT_VOLUME_SIZE, 0x02000D41);\n      return;\n    }\n    if (!Info.VolumeSizes.IsEmpty())\n    {\n      const UInt64 volumeSize = Info.VolumeSizes.Back();\n      if (volumeSize < (100 << 10))\n      {\n        wchar_t s[32];\n        ConvertUInt64ToString(volumeSize, s);\n        if (::MessageBoxW(*this, MyFormatNew(IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE, 0x02000D42, s),\n            L\"7-Zip\", MB_YESNOCANCEL | MB_ICONQUESTION | MB_TASKMODAL) != IDYES)\n          return;\n      }\n    }\n  }\n\n  for(int i = 0; i < m_ArchivePath.GetCount(); i++)\n  {\n    UString sTemp;\n    m_ArchivePath.GetLBText(i, sTemp);\n    sTemp.Trim();\n    AddUniqueString(m_RegistryInfo.HistoryArchives, sTemp);\n  }\n  if (m_RegistryInfo.HistoryArchives.Size() > kHistorySize)\n    m_RegistryInfo.HistoryArchives.DeleteBack();\n  \n  m_RegistryInfo.ArchiveType = m_ArchiverInfoList[Info.ArchiverInfoIndex].Name;\n  m_RegistryInfo.ShowPassword = IsShowPasswordChecked();\n\n  SaveCompressionInfo(m_RegistryInfo);\n  \n  CModalDialog::OnOK();\n}\n\nstatic LPCWSTR kHelpTopic = L\"fm/plugins/7-zip/add.htm\";\n\nvoid CCompressDialog::OnHelp()\n{\n  ShowHelpWindow(NULL, kHelpTopic);\n}\n\nbool CCompressDialog::OnCommand(int code, int itemID, LPARAM lParam)\n{\n  if (code == CBN_SELCHANGE)\n  {\n    switch(itemID)\n    {\n      case IDC_COMPRESS_COMBO_FORMAT:\n      {\n        bool isSFX = IsSFX();\n        SaveOptionsInMem();\n        SetLevel();\n        SetSolidBlockSize();\n        SetNumThreads();\n        SetParams();\n        CheckControlsEnable();\n        SetArchiveName2(isSFX);\n        SetEncryptionMethod();\n        SetMemoryUsage();\n        return true;\n      }\n      case IDC_COMPRESS_COMBO_LEVEL:\n      {\n        const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n        int index = FindRegistryFormatAlways(ai.Name);\n        NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n        fo.ResetForLevelChange();\n        SetMethod();\n        SetSolidBlockSize();\n        SetNumThreads();\n        CheckSFXNameChange();\n        SetMemoryUsage();\n        return true;\n      }\n      case IDC_COMPRESS_COMBO_METHOD:\n      {\n        SetDictionary();\n        SetOrder();\n        SetSolidBlockSize();\n        SetNumThreads();\n        CheckSFXNameChange();\n        SetMemoryUsage();\n        return true;\n      }\n      case IDC_COMPRESS_COMBO_DICTIONARY:\n      case IDC_COMPRESS_COMBO_ORDER:\n      {\n        SetSolidBlockSize();\n        SetMemoryUsage();\n        return true;\n      }\n      case IDC_COMPRESS_COMBO_THREADS:\n      {\n        SetMemoryUsage();\n        return true;\n      }\n    }\n  }\n  return CModalDialog::OnCommand(code, itemID, lParam);\n}\n\nvoid CCompressDialog::CheckSFXNameChange()\n{\n  bool isSFX = IsSFX();\n  CheckSFXControlsEnable();\n  if (isSFX != IsSFX())\n    SetArchiveName2(isSFX);\n}\n\nvoid CCompressDialog::SetArchiveName2(bool prevWasSFX)\n{\n  UString fileName;\n  m_ArchivePath.GetText(fileName);\n  const CArcInfoEx &prevArchiverInfo = m_ArchiverInfoList[m_PrevFormat];\n  if (prevArchiverInfo.KeepName || Info.KeepName)\n  {\n    UString prevExtension = prevArchiverInfo.GetMainExt();\n    if (prevWasSFX)\n      prevExtension = kExeExt;\n    else\n      prevExtension = UString('.') + prevExtension;\n    const int prevExtensionLen = prevExtension.Length();\n    if (fileName.Length() >= prevExtensionLen)\n      if (fileName.Right(prevExtensionLen).CompareNoCase(prevExtension) == 0)\n        fileName = fileName.Left(fileName.Length() - prevExtensionLen);\n  }\n  SetArchiveName(fileName);\n}\n\n// if type.KeepName then use OriginalFileName\n// else if !KeepName remove extension\n// add new extension\n\nvoid CCompressDialog::SetArchiveName(const UString &name)\n{\n  UString fileName = name;\n  Info.ArchiverInfoIndex = m_Format.GetCurSel();\n  const CArcInfoEx &ai = m_ArchiverInfoList[Info.ArchiverInfoIndex];\n  m_PrevFormat = Info.ArchiverInfoIndex;\n  if (ai.KeepName)\n  {\n    fileName = OriginalFileName;\n  }\n  else\n  {\n    if (!Info.KeepName)\n    {\n      int dotPos = fileName.ReverseFind('.');\n      int slashPos = MyMax(fileName.ReverseFind(WCHAR_PATH_SEPARATOR), fileName.ReverseFind('/'));\n      if (dotPos >= 0 && dotPos > slashPos + 1)\n        fileName = fileName.Left(dotPos);\n    }\n  }\n\n  if (IsSFX())\n    fileName += kExeExt;\n  else\n  {\n    fileName += L'.';\n    fileName += ai.GetMainExt();\n  }\n  m_ArchivePath.SetText(fileName);\n}\n\nint CCompressDialog::FindRegistryFormat(const UString &name)\n{\n  for (int i = 0; i < m_RegistryInfo.FormatOptionsVector.Size(); i++)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[i];\n    if (GetUnicodeString(fo.FormatID) == name)\n      return i;\n  }\n  return -1;\n}\n\nint CCompressDialog::FindRegistryFormatAlways(const UString &name)\n{\n  int index = FindRegistryFormat(name);\n  if (index < 0)\n  {\n    NCompression::CFormatOptions fo;\n    fo.FormatID = GetSystemString(name);\n    index = m_RegistryInfo.FormatOptionsVector.Add(fo);\n  }\n  return index;\n}\n\nint CCompressDialog::GetStaticFormatIndex()\n{\n  int formatIndex = m_Format.GetCurSel();\n  const CArcInfoEx &ai = m_ArchiverInfoList[formatIndex];\n  for (int i = 0; i < MY_SIZE_OF_ARRAY(g_Formats); i++)\n    if (ai.Name.CompareNoCase(g_Formats[i].Name) == 0)\n      return i;\n  return 0; // -1;\n}\n\nvoid CCompressDialog::SetNearestSelectComboBox(NControl::CComboBox &comboBox, UInt32 value)\n{\n  for (int i = comboBox.GetCount() - 1; i >= 0; i--)\n    if ((UInt32)comboBox.GetItemData(i) <= value)\n    {\n      comboBox.SetCurSel(i);\n      return;\n    }\n  if (comboBox.GetCount() > 0)\n    comboBox.SetCurSel(0);\n}\n\nvoid CCompressDialog::SetLevel()\n{\n  m_Level.ResetContent();\n  const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  int index = FindRegistryFormat(ai.Name);\n  UInt32 level = kNormal;\n  if (index >= 0)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n    if (fo.Level <= kUltra)\n      level = fo.Level;\n    else\n      level = kUltra;\n  }\n  int i;\n  for (i = 0; i <= kUltra; i++)\n  {\n    if ((fi.LevelsMask & (1 << i)) != 0)\n    {\n      const CLevelInfo &levelInfo = g_Levels[i];\n      int index = (int)m_Level.AddString(LangString(levelInfo.ResourceID, levelInfo.LangID));\n      m_Level.SetItemData(index, i);\n    }\n  }\n  SetNearestSelectComboBox(m_Level, level);\n  SetMethod();\n}\n\nvoid CCompressDialog::SetMethod()\n{\n  m_Method.ResetContent();\n  UInt32 level = GetLevel();\n  if (level == 0)\n  {\n    SetDictionary();\n    SetOrder();\n    return;\n  }\n  const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  int index = FindRegistryFormat(ai.Name);\n  UString defaultMethod;\n  if (index >= 0)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n    defaultMethod = fo.Method;\n  }\n  bool isSfx = IsSFX();\n  for(int m = 0; m < fi.NumMethods; m++)\n  {\n    EMethodID methodID = fi.MathodIDs[m];\n    if (isSfx)\n      if (!IsMethodSupportedBySfx(methodID))\n        continue;\n    const LPCWSTR method = kMethodsNames[methodID];\n    int itemIndex = (int)m_Method.AddString(GetSystemString(method));\n    if (defaultMethod.CompareNoCase(method) == 0 || m == 0)\n      m_Method.SetCurSel(itemIndex);\n  }\n  SetDictionary();\n  SetOrder();\n}\n\nbool CCompressDialog::IsZipFormat()\n{\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  return (ai.Name.CompareNoCase(L\"zip\") == 0);\n}\n\nvoid CCompressDialog::SetEncryptionMethod()\n{\n  _encryptionMethod.ResetContent();\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  if (ai.Name.CompareNoCase(L\"7z\") == 0)\n  {\n    _encryptionMethod.AddString(TEXT(\"AES-256\"));\n    _encryptionMethod.SetCurSel(0);\n  }\n  else if (ai.Name.CompareNoCase(L\"zip\") == 0)\n  {\n    int index = FindRegistryFormat(ai.Name);\n    UString encryptionMethod;\n    if (index >= 0)\n    {\n      const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n      encryptionMethod = fo.EncryptionMethod;\n    }\n    _encryptionMethod.AddString(TEXT(\"ZipCrypto\"));\n    _encryptionMethod.AddString(TEXT(\"AES-256\"));\n    _encryptionMethod.SetCurSel(encryptionMethod.Find(L\"AES\") == 0 ? 1 : 0);\n  }\n}\n\nint CCompressDialog::GetMethodID()\n{\n  UString methodName;\n  m_Method.GetText(methodName);\n  for (int i = 0; i < MY_SIZE_OF_ARRAY(kMethodsNames); i++)\n    if (methodName.CompareNoCase(kMethodsNames[i]) == 0)\n      return i;\n  return -1;\n}\n\nUString CCompressDialog::GetMethodSpec()\n{\n  if (m_Method.GetCount() <= 1)\n    return UString();\n  UString result;\n  m_Method.GetText(result);\n  return result;\n}\n\nUString CCompressDialog::GetEncryptionMethodSpec()\n{\n  if (_encryptionMethod.GetCount() <= 1)\n    return UString();\n  if (_encryptionMethod.GetCurSel() <= 0)\n    return UString();\n  UString result;\n  _encryptionMethod.GetText(result);\n  result.Replace(L\"-\", L\"\");\n  return result;\n}\n\nint CCompressDialog::AddDictionarySize(UInt32 size, bool kilo, bool maga)\n{\n  UInt32 sizePrint = size;\n  if (kilo)\n    sizePrint >>= 10;\n  else if (maga)\n    sizePrint >>= 20;\n  TCHAR s[40];\n  ConvertUInt64ToString(sizePrint, s);\n  if (kilo)\n    lstrcat(s, TEXT(\" K\"));\n  else if (maga)\n    lstrcat(s, TEXT(\" M\"));\n  else\n    lstrcat(s, TEXT(\" \"));\n  lstrcat(s, TEXT(\"B\"));\n  int index = (int)m_Dictionary.AddString(s);\n  m_Dictionary.SetItemData(index, size);\n  return index;\n}\n\nint CCompressDialog::AddDictionarySize(UInt32 size)\n{\n  if (size > 0)\n  {\n    if ((size & 0xFFFFF) == 0)\n      return AddDictionarySize(size, false, true);\n    if ((size & 0x3FF) == 0)\n      return AddDictionarySize(size, true, false);\n  }\n  return AddDictionarySize(size, false, false);\n}\n\nvoid CCompressDialog::SetDictionary()\n{\n  m_Dictionary.ResetContent();\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  int index = FindRegistryFormat(ai.Name);\n  UInt32 defaultDictionary = UInt32(-1);\n  if (index >= 0)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n    if (fo.Method.CompareNoCase(GetMethodSpec()) == 0)\n      defaultDictionary = fo.Dictionary;\n  }\n  int methodID = GetMethodID();\n  UInt32 level = GetLevel2();\n  if (methodID < 0)\n    return;\n  const UInt64 maxRamSize = GetMaxRamSizeForProgram();\n  switch (methodID)\n  {\n    case kLZMA:\n    {\n      static const UInt32 kMinDicSize = (1 << 16);\n      if (defaultDictionary == UInt32(-1))\n      {\n        if (level >= 9)      defaultDictionary = (1 << 26);\n        else if (level >= 7) defaultDictionary = (1 << 25);\n        else if (level >= 5) defaultDictionary = (1 << 24);\n        else if (level >= 3) defaultDictionary = (1 << 20);\n        else                 defaultDictionary = (kMinDicSize);\n      }\n      int i;\n      AddDictionarySize(kMinDicSize);\n      m_Dictionary.SetCurSel(0);\n      for (i = 20; i <= 30; i++)\n        for (int j = 0; j < 2; j++)\n        {\n          if (i == 20 && j > 0)\n            continue;\n          UInt32 dictionary = (1 << i) + (j << (i - 1));\n          if (dictionary >\n          #ifdef _WIN64\n            (1 << 30)\n          #else\n            (1 << 26)\n          #endif\n            )\n            continue;\n          AddDictionarySize(dictionary);\n          UInt64 decomprSize;\n          UInt64 requiredComprSize = GetMemoryUsage(dictionary, decomprSize);\n          if (dictionary <= defaultDictionary && requiredComprSize <= maxRamSize)\n             m_Dictionary.SetCurSel(m_Dictionary.GetCount() - 1);\n        }\n\n      // SetNearestSelectComboBox(m_Dictionary, defaultDictionary);\n      break;\n    }\n    case kPPMd:\n    {\n      if (defaultDictionary == UInt32(-1))\n      {\n        if (level >= 9)      defaultDictionary = (192 << 20);\n        else if (level >= 7) defaultDictionary = ( 64 << 20);\n        else if (level >= 5) defaultDictionary = ( 16 << 20);\n        else                 defaultDictionary = (  4 << 20);\n      }\n      int i;\n      for (i = 20; i < 31; i++)\n        for (int j = 0; j < 2; j++)\n        {\n          if (i == 20 && j > 0)\n            continue;\n          UInt32 dictionary = (1 << i) + (j << (i - 1));\n          if (dictionary >= (1 << 31))\n            continue;\n          AddDictionarySize(dictionary);\n          UInt64 decomprSize;\n          UInt64 requiredComprSize = GetMemoryUsage(dictionary, decomprSize);\n          if (dictionary <= defaultDictionary && requiredComprSize <= maxRamSize || m_Dictionary.GetCount() == 0)\n             m_Dictionary.SetCurSel(m_Dictionary.GetCount() - 1);\n        }\n      SetNearestSelectComboBox(m_Dictionary, defaultDictionary);\n      break;\n    }\n    case kDeflate:\n    {\n      AddDictionarySize(32 << 10);\n      m_Dictionary.SetCurSel(0);\n      break;\n    }\n    case kDeflate64:\n    {\n      AddDictionarySize(64 << 10);\n      m_Dictionary.SetCurSel(0);\n      break;\n    }\n    case kBZip2:\n    {\n      // UInt32 defaultDictionary;\n      if (defaultDictionary == UInt32(-1))\n      {\n        if (level >= 5)\n          defaultDictionary = (900 << 10);\n        else if (level >= 3)\n          defaultDictionary = (500 << 10);\n        else\n          defaultDictionary = (100 << 10);\n      }\n      for (int i = 1; i <= 9; i++)\n      {\n        UInt32 dictionary = (i * 100) << 10;\n        AddDictionarySize(dictionary);\n        if (dictionary <= defaultDictionary || m_Dictionary.GetCount() == 0)\n           m_Dictionary.SetCurSel(m_Dictionary.GetCount() - 1);\n      }\n      break;\n    }\n  }\n}\n\nUInt32 CCompressDialog::GetComboValue(NWindows::NControl::CComboBox &c, int defMax)\n{\n  if (c.GetCount() <= defMax)\n    return (UInt32)-1;\n  return (UInt32)c.GetItemData(c.GetCurSel());\n}\n\nUInt32 CCompressDialog::GetLevel2()\n{\n  UInt32 level = GetLevel();\n  if (level == (UInt32)-1)\n    level = 5;\n  return level;\n}\n\nint CCompressDialog::AddOrder(UInt32 size)\n{\n  TCHAR s[40];\n  ConvertUInt64ToString(size, s);\n  int index = (int)m_Order.AddString(s);\n  m_Order.SetItemData(index, size);\n  return index;\n}\n\nvoid CCompressDialog::SetOrder()\n{\n  m_Order.ResetContent();\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  int index = FindRegistryFormat(ai.Name);\n  UInt32 defaultOrder = UInt32(-1);\n  if (index >= 0)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n    if (fo.Method.CompareNoCase(GetMethodSpec()) == 0)\n      defaultOrder = fo.Order;\n  }\n  int methodID = GetMethodID();\n  UInt32 level = GetLevel2();\n  if (methodID < 0)\n    return;\n  switch (methodID)\n  {\n    case kLZMA:\n    {\n      if (defaultOrder == UInt32(-1))\n        defaultOrder = (level >= 7) ? 64 : 32;\n      for (int i = 3; i <= 8; i++)\n        for (int j = 0; j < 2; j++)\n        {\n          UInt32 order = (1 << i) + (j << (i - 1));\n          if (order <= 256)\n            AddOrder(order);\n        }\n      AddOrder(273);\n      SetNearestSelectComboBox(m_Order, defaultOrder);\n      break;\n    }\n    case kPPMd:\n    {\n      if (defaultOrder == UInt32(-1))\n      {\n        if (level >= 9)\n          defaultOrder = 32;\n        else if (level >= 7)\n          defaultOrder = 16;\n        else if (level >= 5)\n          defaultOrder = 6;\n        else\n          defaultOrder = 4;\n      }\n      int i;\n      AddOrder(2);\n      AddOrder(3);\n      for (i = 2; i < 8; i++)\n        for (int j = 0; j < 4; j++)\n        {\n          UInt32 order = (1 << i) + (j << (i - 2));\n          if (order < 32)\n            AddOrder(order);\n        }\n      AddOrder(32);\n      SetNearestSelectComboBox(m_Order, defaultOrder);\n      break;\n    }\n    case kDeflate:\n    case kDeflate64:\n    {\n      if (defaultOrder == UInt32(-1))\n      {\n        if (level >= 9)\n          defaultOrder = 128;\n        else if (level >= 7)\n          defaultOrder = 64;\n        else\n          defaultOrder = 32;\n      }\n      int i;\n      for (i = 3; i <= 8; i++)\n        for (int j = 0; j < 2; j++)\n        {\n          UInt32 order = (1 << i) + (j << (i - 1));\n          if (order <= 256)\n            AddOrder(order);\n        }\n      AddOrder(methodID == kDeflate64 ? 257 : 258);\n      SetNearestSelectComboBox(m_Order, defaultOrder);\n      break;\n    }\n    case kBZip2:\n    {\n      break;\n    }\n  }\n}\n\nbool CCompressDialog::GetOrderMode()\n{\n  switch (GetMethodID())\n  {\n    case kPPMd:\n      return true;\n  }\n  return false;\n}\n\nstatic const UInt32 kNoSolidBlockSize = 0;\nstatic const UInt32 kSolidBlockSize = 64;\n\nvoid CCompressDialog::SetSolidBlockSize()\n{\n  m_Solid.ResetContent();\n  const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];\n  if (!fi.Solid)\n    return;\n\n  UInt32 level = GetLevel2();\n  if (level == 0)\n    return;\n\n  UInt32 dictionary = GetDictionarySpec();\n  if (dictionary == UInt32(-1))\n    dictionary = 1;\n\n  UInt32 defaultBlockSize = (UInt32)-1;\n\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  int index = FindRegistryFormat(ai.Name);\n  if (index >= 0)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n    if (fo.Method.CompareNoCase(GetMethodSpec()) == 0)\n      defaultBlockSize = fo.BlockLogSize;\n  }\n\n  index = (int)m_Solid.AddString(LangString(IDS_COMPRESS_NON_SOLID, 0x02000D14));\n  m_Solid.SetItemData(index, (UInt32)kNoSolidBlockSize);\n  m_Solid.SetCurSel(0);\n  bool needSet = defaultBlockSize == (UInt32)-1;\n  for (int i = 20; i <= 36; i++)\n  {\n    if (needSet && dictionary >= (((UInt64)1 << (i - 7))) && i <= 32)\n      defaultBlockSize = i;\n    TCHAR s[40];\n    ConvertUInt64ToString(1 << (i % 10), s);\n    if (i < 30) lstrcat(s, TEXT(\" M\"));\n    else        lstrcat(s, TEXT(\" G\"));\n    lstrcat(s, TEXT(\"B\"));\n    int index = (int)m_Solid.AddString(s);\n    m_Solid.SetItemData(index, (UInt32)i);\n  }\n  index = (int)m_Solid.AddString(LangString(IDS_COMPRESS_SOLID, 0x02000D15));\n  m_Solid.SetItemData(index, kSolidBlockSize);\n  if (defaultBlockSize == (UInt32)-1)\n    defaultBlockSize = kSolidBlockSize;\n  if (defaultBlockSize != kNoSolidBlockSize)\n    SetNearestSelectComboBox(m_Solid, defaultBlockSize);\n}\n\nvoid CCompressDialog::SetNumThreads()\n{\n  m_NumThreads.ResetContent();\n\n  const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];\n  if (!fi.MultiThread)\n    return;\n\n  UInt32 numHardwareThreads = NSystem::GetNumberOfProcessors();\n  UInt32 defaultValue = numHardwareThreads;\n\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  int index = FindRegistryFormat(ai.Name);\n  if (index >= 0)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n    if (fo.Method.CompareNoCase(GetMethodSpec()) == 0)\n      defaultValue = fo.NumThreads;\n  }\n\n  UInt32 numAlgoThreadsMax = 1;\n  int methodID = GetMethodID();\n  switch (methodID)\n  {\n    case kLZMA:\n    {\n      numAlgoThreadsMax = 2;\n      break;\n    }\n    case kBZip2:\n    {\n      numAlgoThreadsMax = 32;\n      break;\n    }\n  }\n  if (IsZipFormat())\n    numAlgoThreadsMax = 128;\n  for (UInt32 i = 1; i <= numHardwareThreads * 2 && i <= numAlgoThreadsMax; i++)\n  {\n    TCHAR s[40];\n    ConvertUInt64ToString(i, s);\n    int index = (int)m_NumThreads.AddString(s);\n    m_NumThreads.SetItemData(index, (UInt32)i);\n  }\n  SetNearestSelectComboBox(m_NumThreads, defaultValue);\n}\n\n\nUInt64 CCompressDialog::GetMemoryUsage(UInt32 dictionary, UInt64 &decompressMemory)\n{\n  decompressMemory = UInt64(Int64(-1));\n  UInt32 level = GetLevel2();\n  if (level == 0)\n  {\n    decompressMemory = (1 << 20);\n    return decompressMemory;\n  }\n  UInt64 size = 0;\n\n  const CFormatInfo &fi = g_Formats[GetStaticFormatIndex()];\n  if (fi.Filter && level >= 9)\n    size += (12 << 20) * 2 + (5 << 20);\n  UInt32 numThreads = GetNumThreads2();\n  if (IsZipFormat())\n  {\n    UInt32 numSubThreads = 1;\n    if (GetMethodID() == kLZMA && numThreads > 1 && level >= 5)\n      numSubThreads = 2;\n    UInt32 numMainThreads = numThreads / numSubThreads;\n    if (numMainThreads > 1)\n      size += (UInt64)numMainThreads << 25;\n  }\n  switch (GetMethodID())\n  {\n    case kLZMA:\n    {\n      UInt32 hs = dictionary - 1;\n      hs |= (hs >> 1);\n      hs |= (hs >> 2);\n      hs |= (hs >> 4);\n      hs |= (hs >> 8);\n      hs >>= 1;\n      hs |= 0xFFFF;\n      if (hs > (1 << 24))\n        hs >>= 1;\n      hs++;\n      UInt64 size1 = (UInt64)hs * 4;\n      size1 += (UInt64)dictionary * 11 / 2;\n      if (level >= 5)\n        size1 += (UInt64)dictionary * 4;\n      size1 += (2 << 20);\n\n      UInt32 numThreads1 = 1;\n      if (numThreads > 1 && level >= 5)\n      {\n        size1 += (2 << 20) + (4 << 20);\n        numThreads1 = 2;\n      }\n      size += size1 * numThreads / numThreads1;\n\n      decompressMemory = dictionary + (2 << 20);\n      return size;\n    }\n    case kPPMd:\n    {\n      decompressMemory = dictionary + (2 << 20);\n      return size + decompressMemory;\n    }\n    case kDeflate:\n    case kDeflate64:\n    {\n      UInt32 order = GetOrder();\n      if (order == UInt32(-1))\n        order = 32;\n      if (level >= 7)\n        size += (1 << 20);\n      size += 3 << 20;\n      decompressMemory = (2 << 20);\n      return size;\n    }\n    case kBZip2:\n    {\n      decompressMemory = (7 << 20);\n      UInt64 memForOneThread = (10 << 20);\n      return size + memForOneThread * numThreads;\n    }\n  }\n  return UInt64(Int64(-1));\n}\n\nUInt64 CCompressDialog::GetMemoryUsage(UInt64 &decompressMemory)\n{\n  return GetMemoryUsage(GetDictionary(), decompressMemory);\n}\n\nvoid CCompressDialog::PrintMemUsage(UINT res, UInt64 value)\n{\n  if (value == (UInt64)Int64(-1))\n  {\n    SetItemText(res, TEXT(\"?\"));\n    return;\n  }\n  value = (value + (1 << 20) - 1) >> 20;\n  TCHAR s[40];\n  ConvertUInt64ToString(value, s);\n  lstrcat(s, TEXT(\" MB\"));\n  SetItemText(res, s);\n}\n    \nvoid CCompressDialog::SetMemoryUsage()\n{\n  UInt64 decompressMem;\n  UInt64 memUsage = GetMemoryUsage(decompressMem);\n  PrintMemUsage(IDC_STATIC_COMPRESS_MEMORY_VALUE, memUsage);\n  PrintMemUsage(IDC_STATIC_COMPRESS_MEMORY_DE_VALUE, decompressMem);\n}\n\nvoid CCompressDialog::SetParams()\n{\n  const CArcInfoEx &ai = m_ArchiverInfoList[m_Format.GetCurSel()];\n  m_Params.SetText(TEXT(\"\"));\n  int index = FindRegistryFormat(ai.Name);\n  if (index >= 0)\n  {\n    const NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n    m_Params.SetText(fo.Options);\n  }\n}\n\nvoid CCompressDialog::SaveOptionsInMem()\n{\n  const CArcInfoEx &ai = m_ArchiverInfoList[Info.ArchiverInfoIndex];\n  int index = FindRegistryFormatAlways(ai.Name);\n  m_Params.GetText(Info.Options);\n  Info.Options.Trim();\n  NCompression::CFormatOptions &fo = m_RegistryInfo.FormatOptionsVector[index];\n  fo.Options = Info.Options;\n  fo.Level = GetLevelSpec();\n  fo.Dictionary = GetDictionarySpec();\n  fo.Order = GetOrderSpec();\n  fo.Method = GetMethodSpec();\n  fo.EncryptionMethod = GetEncryptionMethodSpec();\n  fo.NumThreads = GetNumThreadsSpec();\n  fo.BlockLogSize = GetBlockSizeSpec();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/CompressDialog.h",
    "content": "// CompressDialog.h\n\n#ifndef __COMPRESSDIALOG_H\n#define __COMPRESSDIALOG_H\n\n#include \"../Common/ZipRegistry.h\"\n#include \"../Common/LoadCodecs.h\"\n#include \"CompressDialogRes.h\"\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/Edit.h\"\n#include \"Windows/Control/ComboBox.h\"\n\nnamespace NCompressDialog\n{\n  namespace NUpdateMode\n  {\n    enum EEnum\n    {\n      kAdd,\n      kUpdate,\n      kFresh,\n      kSynchronize,\n    };\n  }\n  struct CInfo\n  {\n    NUpdateMode::EEnum UpdateMode;\n    bool SolidIsSpecified;\n    bool MultiThreadIsAllowed;\n    UInt64 SolidBlockSize;\n    UInt32 NumThreads;\n\n    CRecordVector<UInt64> VolumeSizes;\n\n    UInt32 Level;\n    UString Method;\n    UInt32 Dictionary;\n    bool OrderMode;\n    UInt32 Order;\n    UString Options;\n\n    UString EncryptionMethod;\n\n    bool SFXMode;\n    bool OpenShareForWrite;\n\n    \n    UString ArchiveName; // in: Relative for ; out: abs\n    UString CurrentDirPrefix;\n    bool KeepName;\n\n    bool GetFullPathName(UString &result) const;\n\n    int ArchiverInfoIndex;\n\n    UString Password;\n    bool EncryptHeadersIsAllowed;\n    bool EncryptHeaders;\n\n    void Init()\n    {\n      Level = Dictionary = Order = UInt32(-1);\n      OrderMode = false;\n      Method.Empty();\n      Options.Empty();\n      EncryptionMethod.Empty();\n    }\n    CInfo()\n    {\n      Init();\n    }\n  };\n}\n\nclass CCompressDialog: public NWindows::NControl::CModalDialog\n{\n  NWindows::NControl::CComboBox m_ArchivePath;\n  NWindows::NControl::CComboBox m_Format;\n  NWindows::NControl::CComboBox m_Level;\n  NWindows::NControl::CComboBox m_Method;\n  NWindows::NControl::CComboBox m_Dictionary;\n  NWindows::NControl::CComboBox m_Order;\n  NWindows::NControl::CComboBox m_Solid;\n  NWindows::NControl::CComboBox m_NumThreads;\n  NWindows::NControl::CComboBox m_UpdateMode;\n  NWindows::NControl::CComboBox m_Volume;\n  NWindows::NControl::CDialogChildControl m_Params;\n\n  NWindows::NControl::CEdit _password1Control;\n  NWindows::NControl::CEdit _password2Control;\n  NWindows::NControl::CComboBox _encryptionMethod;\n\n  NCompression::CInfo m_RegistryInfo;\n\n  int m_PrevFormat;\n  void SetArchiveName(const UString &name);\n  int FindRegistryFormat(const UString &name);\n  int FindRegistryFormatAlways(const UString &name);\n  \n  void CheckSFXNameChange();\n  void SetArchiveName2(bool prevWasSFX);\n  \n  int GetStaticFormatIndex();\n\n  void SetNearestSelectComboBox(NWindows::NControl::CComboBox &comboBox, UInt32 value);\n\n  void SetLevel();\n  \n  void SetMethod();\n  int GetMethodID();\n  UString GetMethodSpec();\n  UString GetEncryptionMethodSpec();\n\n  bool IsZipFormat();\n\n  void SetEncryptionMethod();\n\n  int AddDictionarySize(UInt32 size, bool kilo, bool maga);\n  int AddDictionarySize(UInt32 size);\n  \n  void SetDictionary();\n\n  UInt32 GetComboValue(NWindows::NControl::CComboBox &c, int defMax = 0);\n\n  UInt32 GetLevel()  { return GetComboValue(m_Level); }\n  UInt32 GetLevelSpec()  { return GetComboValue(m_Level, 1); }\n  UInt32 GetLevel2();\n  UInt32 GetDictionary() { return GetComboValue(m_Dictionary); }\n  UInt32 GetDictionarySpec() { return GetComboValue(m_Dictionary, 1); }\n  UInt32 GetOrder() { return GetComboValue(m_Order); }\n  UInt32 GetOrderSpec() { return GetComboValue(m_Order, 1); }\n  UInt32 GetNumThreadsSpec() { return GetComboValue(m_NumThreads, 1); }\n  UInt32 GetNumThreads2() { UInt32 num = GetNumThreadsSpec(); if (num == UInt32(-1)) num = 1; return num; }\n  UInt32 GetBlockSizeSpec() { return GetComboValue(m_Solid, 1); }\n\n  int AddOrder(UInt32 size);\n  void SetOrder();\n  bool GetOrderMode();\n\n  void SetSolidBlockSize();\n  void SetNumThreads();\n\n  UInt64 GetMemoryUsage(UInt32 dictionary, UInt64 &decompressMemory);\n  UInt64 GetMemoryUsage(UInt64 &decompressMemory);\n  void PrintMemUsage(UINT res, UInt64 value);\n  void SetMemoryUsage();\n  void SetParams();\n  void SaveOptionsInMem();\n\n  void UpdatePasswordControl();\n  bool IsShowPasswordChecked() const\n    { return IsButtonChecked(IDC_COMPRESS_CHECK_SHOW_PASSWORD) == BST_CHECKED; }\npublic:\n  CObjectVector<CArcInfoEx> m_ArchiverInfoList;\n\n  NCompressDialog::CInfo Info;\n  UString OriginalFileName; // for bzip2, gzip2\n\n  INT_PTR Create(HWND wndParent = 0)\n    { return CModalDialog::Create(IDD_DIALOG_COMPRESS, wndParent); }\n\nprotected:\n\n  void CheckSFXControlsEnable();\n  void CheckVolumeEnable();\n  void CheckControlsEnable();\n\n  void OnButtonSetArchive();\n  bool IsSFX();\n  void OnButtonSFX();\n\n  virtual bool OnInit();\n  virtual bool OnCommand(int code, int itemID, LPARAM lParam);\n  virtual bool OnButtonClicked(int buttonID, HWND buttonHWND);\n  virtual void OnOK();\n  virtual void OnHelp();\n\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/CompressDialogRes.h",
    "content": "#define IDD_DIALOG_COMPRESS             152\n#define IDC_STATIC_COMPRESS_MEMORY      1022\n#define IDC_STATIC_COMPRESS_MEMORY_DE   1023\n#define IDC_STATIC_COMPRESS_MEMORY_VALUE 1027\n#define IDC_STATIC_COMPRESS_MEMORY_DE_VALUE 1028\n#define IDC_COMPRESS_COMBO_ARCHIVE      1072\n#define IDC_COMPRESS_BUTTON_SET_ARCHIVE 1073\n#define IDC_COMPRESS_COMBO_LEVEL        1074\n#define IDC_COMPRESS_COMBO_UPDATE_MODE  1075\n#define IDC_COMPRESS_COMBO_FORMAT       1076\n#define IDC_COMPRESS_COMBO_VOLUME       1077\n#define IDC_COMPRESS_COMBO_METHOD       1078\n#define IDC_COMPRESS_COMBO_DICTIONARY   1079\n#define IDC_COMPRESS_COMBO_ORDER        1080\n\n#define IDC_COMPRESS_COMBO_SOLID        1081\n#define IDC_COMPRESS_COMBO_THREADS      1082\n#define IDC_COMPRESS_HARDWARE_THREADS   1083\n\n#define IDC_COMPRESS_SFX                1090\n#define IDC_COMPRESS_EDIT_PARAMETERS    1091\n\n// #define IDC_COMPRESS_SOLID              1092\n// #define IDC_COMPRESS_MULTI_THREAD       1093\n\n#define IDC_STATIC_COMPRESS_ARCHIVE     1097\n#define IDC_STATIC_COMPRESS_FORMAT      1098\n#define IDC_STATIC_COMPRESS_LEVEL       1099\n#define IDC_STATIC_COMPRESS_PARAMETERS  1100\n#define IDC_STATIC_COMPRESS_UPDATE_MODE 1101\n#define IDC_STATIC_COMPRESS_OPTIONS     1102\n#define IDC_STATIC_COMPRESS_VOLUME      1103\n#define IDC_STATIC_COMPRESS_METHOD      1104\n#define IDC_STATIC_COMPRESS_DICTIONARY  1105\n#define IDC_STATIC_COMPRESS_ORDER       1106\n\n#define IDC_STATIC_COMPRESS_SOLID       1107\n#define IDC_STATIC_COMPRESS_THREADS     1108\n\n#define IDC_COMPRESS_ENCRYPTION         1110\n#define IDC_STATIC_COMPRESS_PASSWORD1   1111\n#define IDC_COMPRESS_EDIT_PASSWORD1     1112\n#define IDC_STATIC_COMPRESS_PASSWORD2   1113\n#define IDC_COMPRESS_EDIT_PASSWORD2     1114\n#define IDC_COMPRESS_CHECK_SHOW_PASSWORD 1115\n\n#define IDC_STATIC_COMPRESS_ENCRYPTION_METHOD 1120\n#define IDC_COMPRESS_COMBO_ENCRYPTION_METHOD 1121\n\n#define IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES 1122\n\n#define IDC_COMPRESS_SHARED    1130\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/CompressDialog_rc.cpp",
    "content": "// CompressDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif \n\n#include \"resource.h\"\n#include \"Windows/Control/DialogImpl.h\"\n\n#include \"CompressDialogRes.h\"\n\nclass CCompressDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n  public:\n   CCompressDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent , int id) : CModalDialogImpl(dialog,parent, id, wxT(\"Add to Archive\"))\n  {\n\twxStaticText *m_pStaticTextMemoryCompress;\n\twxStaticText *m_pStaticTextMemoryDecompress;\n\twxTextCtrl *m_pTextCtrlPassword;\n\twxTextCtrl *m_pTextCtrlRePassword;\n\twxTextCtrl *m_pTextCtrlParameters;\n\twxComboBox *m_pComboBoxArchiveName;\n\twxComboBox *m_pComboBoxArchiveFormat;\n\twxComboBox *m_pComboBoxCompressionLevel;\n\twxComboBox *m_pComboBoxCompressionMethod;\n\twxComboBox *m_pComboBoxDictionarySize;\n\twxComboBox *m_pComboBoxWordSize;\n\twxComboBox *m_pComboBoxUpdateMode;\n\twxComboBox *m_pComboBoxEncryptionMethod;\n\twxComboBox *m_pComboBoxSplitToVolumes;\n\twxCheckBox *m_pCheckBoxShowPassword;\n\twxCheckBox *m_pCheckBoxEncryptFileNames;\n\twxButton   *m_pButtonBrowse;\n\n\n\t///Sizer for adding the controls created by users\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\twxStaticText *pStaticTextArchive = new wxStaticText(this, IDC_STATIC_COMPRESS_ARCHIVE, wxT(\"&Archive:\"));\n\twxBoxSizer *pArchiveNameSizer = new wxBoxSizer(wxHORIZONTAL);\n\tm_pComboBoxArchiveName = new wxComboBox(this, IDC_COMPRESS_COMBO_ARCHIVE, wxEmptyString, wxDefaultPosition, wxSize(600,-1), wxArrayString(), wxCB_DROPDOWN|wxCB_SORT);\n\tm_pButtonBrowse = new wxButton(this, IDC_COMPRESS_BUTTON_SET_ARCHIVE, wxT(\"...\"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);\n\tpArchiveNameSizer->Add(m_pComboBoxArchiveName, 1, wxALL|wxEXPAND, 5);\n\tpArchiveNameSizer->Add(m_pButtonBrowse, 0, wxALL|wxEXPAND, 5);\n\twxBoxSizer *pControlSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxBoxSizer *pLeftSizer = new wxBoxSizer(wxVERTICAL);\n\n\twxBoxSizer *pCompressionOptionsSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxBoxSizer *pCompressionStaticSizer = new wxBoxSizer(wxVERTICAL);\n\twxBoxSizer *pCompressionComboSizer = new wxBoxSizer(wxVERTICAL);\n\n\twxStaticText *pStaticTextArchiveFormat = new wxStaticText(this, IDC_STATIC_COMPRESS_FORMAT, wxT(\"Archive &format:\"));\n\t/*\n\twxArrayString archiveFormatArray;\n\tarchiveFormatArray.Add(wxT(\"7z\"));\n\tarchiveFormatArray.Add(wxT(\"Tar\"));\n\tarchiveFormatArray.Add(wxT(\"Zip\"));\n\tm_pComboBoxArchiveFormat = new wxComboBox(this, IDC_COMPRESS_COMBO_FORMAT, archiveFormatArray.Item(0), wxDefaultPosition, wxDefaultSize, archiveFormatArray, wxCB_READONLY);\n\t*/\n\n\tm_pComboBoxArchiveFormat = new wxComboBox(this, IDC_COMPRESS_COMBO_FORMAT, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\twxStaticText *pStaticTextCompressionLevel = new wxStaticText(this, IDC_STATIC_COMPRESS_LEVEL, wxT(\"Compression &level:\"));\n\twxArrayString compressionLevelArray;\n\t/*\n\tcompressionLevelArray.Add(wxT(\"Store\"));\n\tcompressionLevelArray.Add(wxT(\"Fastest\"));\n\tcompressionLevelArray.Add(wxT(\"Fast\"));\n\tcompressionLevelArray.Add(wxT(\"Normal\"));\n\tcompressionLevelArray.Add(wxT(\"Maximum\"));\n\tcompressionLevelArray.Add(wxT(\"Ultra\"));\n\tm_pComboBoxCompressionLevel = new wxComboBox(this, IDC_COMPRESS_COMBO_LEVEL, compressionLevelArray.Item(0), wxDefaultPosition, wxDefaultSize, compressionLevelArray, wxCB_READONLY);\n\t*/\n\tm_pComboBoxCompressionLevel = new wxComboBox(this, IDC_COMPRESS_COMBO_LEVEL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\twxStaticText *pStaticTextCompressionMethod = new wxStaticText(this, IDC_STATIC_COMPRESS_METHOD, wxT(\"Compression &method:\"));\n/*\n\twxArrayString compressionMethodArray;\n\tcompressionMethodArray.Add(wxT(\"LZMA\"));\n\tcompressionMethodArray.Add(wxT(\"PPMd\"));\n\tcompressionMethodArray.Add(wxT(\"BZip2\"));\n\tm_pComboBoxCompressionMethod = new wxComboBox(this, IDC_COMPRESS_COMBO_METHOD, compressionMethodArray.Item(0), wxDefaultPosition, wxDefaultSize, compressionMethodArray, wxCB_READONLY);\n*/\n\tm_pComboBoxCompressionMethod = new wxComboBox(this, IDC_COMPRESS_COMBO_METHOD, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\twxStaticText *pStaticTextDictionarySize = new wxStaticText(this, IDC_STATIC_COMPRESS_DICTIONARY, wxT(\"&Dictionary size:\"));\n/*\n\twxArrayString dictionarySizeArray;\n\tdictionarySizeArray.Add(wxT(\"64 KB\"));\n\tdictionarySizeArray.Add(wxT(\"1 MB\"));\n\tdictionarySizeArray.Add(wxT(\"1 MB\"));\n\tdictionarySizeArray.Add(wxT(\"2 MB\"));\n\tdictionarySizeArray.Add(wxT(\"3 MB\"));\n\tdictionarySizeArray.Add(wxT(\"4 MB\"));\n\tdictionarySizeArray.Add(wxT(\"6 MB\"));\n\tdictionarySizeArray.Add(wxT(\"8 MB\"));\n\tdictionarySizeArray.Add(wxT(\"12 MB\"));\n\tdictionarySizeArray.Add(wxT(\"16 MB\"));\n\tdictionarySizeArray.Add(wxT(\"24 MB\"));\n\tdictionarySizeArray.Add(wxT(\"32 MB\"));\n\tdictionarySizeArray.Add(wxT(\"48 MB\"));\n\tdictionarySizeArray.Add(wxT(\"64 MB\"));\n\tdictionarySizeArray.Add(wxT(\"96 MB\"));\n\tdictionarySizeArray.Add(wxT(\"128 MB\"));\n\tm_pComboBoxDictionarySize = new wxComboBox(this, IDC_COMPRESS_COMBO_DICTIONARY, dictionarySizeArray.Item(0), wxDefaultPosition, wxDefaultSize, dictionarySizeArray, wxCB_READONLY);\n*/\n\tm_pComboBoxDictionarySize = new wxComboBox(this, IDC_COMPRESS_COMBO_DICTIONARY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\twxStaticText *pStaticTextNumberOfThreads = new wxStaticText(this, IDC_STATIC_COMPRESS_THREADS, wxT(\"&Number of CPU threads:\"));\n/*\n\twxArrayString numberOfThreadsArray;\n\tnumberOfThreadsArray.Add(wxT(\"1\"));\n\tnumberOfThreadsArray.Add(wxT(\"2\"));\n\twxComboBox *m_pComboBoxNumberOfThreads = new wxComboBox(this, IDC_COMPRESS_COMBO_THREADS, numberOfThreadsArray.Item(0), wxDefaultPosition, wxDefaultSize, numberOfThreadsArray, wxCB_READONLY);\n*/\n\twxComboBox *m_pComboBoxNumberOfThreads = new wxComboBox(this, IDC_COMPRESS_COMBO_THREADS, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\n\n\n\n\n\twxStaticText *pStaticTextWordSize = new wxStaticText(this, IDC_STATIC_COMPRESS_ORDER, wxT(\"&Word size:\"));\n/*\n\twxArrayString wordSizeArray;\n\twordSizeArray.Add(wxT(\"8\"));\n\twordSizeArray.Add(wxT(\"12\"));\n\twordSizeArray.Add(wxT(\"16\"));\n\twordSizeArray.Add(wxT(\"24\"));\n\twordSizeArray.Add(wxT(\"32\"));\n\twordSizeArray.Add(wxT(\"48\"));\n\twordSizeArray.Add(wxT(\"64\"));\n\twordSizeArray.Add(wxT(\"96\"));\n\twordSizeArray.Add(wxT(\"128\"));\n\twordSizeArray.Add(wxT(\"192\"));\n\twordSizeArray.Add(wxT(\"256\"));\n\twordSizeArray.Add(wxT(\"273\"));\n\tm_pComboBoxWordSize = new wxComboBox(this, IDC_COMPRESS_COMBO_ORDER, wordSizeArray.Item(0), wxDefaultPosition, wxDefaultSize, wordSizeArray, wxCB_READONLY);\n*/\n\tm_pComboBoxWordSize = new wxComboBox(this, IDC_COMPRESS_COMBO_ORDER, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\n\twxStaticText *pStaticTextBlockSize = new wxStaticText(this, IDC_STATIC_COMPRESS_SOLID, wxT(\"&Solid Block size:\"));\n\n\twxComboBox *m_pComboBoxBlockSize = new wxComboBox(this, IDC_COMPRESS_COMBO_SOLID, wxEmptyString, wxDefaultPosition, wxDefaultSize,  wxArrayString(), wxCB_READONLY);\n\n\tpCompressionStaticSizer->Add(pStaticTextArchiveFormat, 1, wxALL|wxEXPAND, 5);\n\tpCompressionStaticSizer->Add(pStaticTextCompressionLevel, 1, wxALL|wxEXPAND, 5);\n\tpCompressionStaticSizer->Add(pStaticTextCompressionMethod, 1, wxALL|wxEXPAND, 5);\n\tpCompressionStaticSizer->Add(pStaticTextDictionarySize, 1, wxALL|wxEXPAND, 5);\n\tpCompressionStaticSizer->Add(pStaticTextWordSize, 1, wxALL|wxEXPAND, 5);\n\tpCompressionStaticSizer->Add(pStaticTextBlockSize, 1, wxALL|wxEXPAND, 5);\n\tpCompressionStaticSizer->Add(pStaticTextNumberOfThreads, 1, wxALL|wxEXPAND, 5);\n\tpCompressionComboSizer->Add(m_pComboBoxArchiveFormat, 1, wxALL|wxEXPAND, 5);\n\tpCompressionComboSizer->Add(m_pComboBoxCompressionLevel, 1, wxALL|wxEXPAND, 5);\n\tpCompressionComboSizer->Add(m_pComboBoxCompressionMethod, 1, wxALL|wxEXPAND, 5);\n\tpCompressionComboSizer->Add(m_pComboBoxDictionarySize, 1, wxALL|wxEXPAND, 5);\n\tpCompressionComboSizer->Add(m_pComboBoxWordSize, 1, wxALL|wxEXPAND, 5);\n\tpCompressionComboSizer->Add(m_pComboBoxBlockSize, 1, wxALL|wxEXPAND, 5);\n\tpCompressionComboSizer->Add(m_pComboBoxNumberOfThreads, 1, wxALL|wxEXPAND, 5);\n\tpCompressionOptionsSizer->Add(pCompressionStaticSizer, 1, wxALL|wxEXPAND, 0);\n\tpCompressionOptionsSizer->Add(pCompressionComboSizer, 1, wxALL|wxEXPAND, 0);\n\n\twxBoxSizer *pMemoryUsageSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxBoxSizer *pMemoryUsageLabelSizer = new wxBoxSizer(wxVERTICAL);\n\twxBoxSizer *pMemoryUsageInfoSizer = new wxBoxSizer(wxVERTICAL);\n\twxStaticText *pStaticTextCompressMemoryUsage = new wxStaticText(this, IDC_STATIC_COMPRESS_MEMORY, wxT(\"Memory usage for Compressing:\"));\n\tm_pStaticTextMemoryCompress = new wxStaticText(this, IDC_STATIC_COMPRESS_MEMORY_VALUE, wxT(\"709 MB\"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\twxStaticText *pStaticTextDecompressMemoryUsage = new wxStaticText(this, IDC_STATIC_COMPRESS_MEMORY_DE, wxT(\"Memory usage for Decompressing\"));\n\tm_pStaticTextMemoryDecompress = new wxStaticText(this, IDC_STATIC_COMPRESS_MEMORY_DE_VALUE, wxT(\"66 MB\"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);\n\tpMemoryUsageLabelSizer->Add(pStaticTextCompressMemoryUsage, 1, wxALL|wxEXPAND, 5);\n\tpMemoryUsageLabelSizer->Add(pStaticTextDecompressMemoryUsage, 1, wxALL|wxEXPAND, 5);\n\tpMemoryUsageInfoSizer->Add(m_pStaticTextMemoryCompress, 1, wxALL|wxEXPAND, 5);\n\tpMemoryUsageInfoSizer->Add(m_pStaticTextMemoryDecompress, 1, wxALL|wxEXPAND, 5);\n\tpMemoryUsageSizer->Add(pMemoryUsageLabelSizer, 1, wxALL|wxEXPAND, 0);\n\tpMemoryUsageSizer->Add(pMemoryUsageInfoSizer, 0, wxALL|wxEXPAND, 0);\n\n\twxStaticText *pStaticSplit2Volumes = new wxStaticText(this, IDC_STATIC_COMPRESS_VOLUME, wxT(\"Split to &volumes, bytes:\"));\n/*\n\twxArrayString split2VolumesArray;\n\tsplit2VolumesArray.Add(wxT(\"1457664 - 3.5\\\" floppy\"));\n\tsplit2VolumesArray.Add(wxT(\"650M - CD\"));\n\tsplit2VolumesArray.Add(wxT(\"700M - CD\"));\n\tsplit2VolumesArray.Add(wxT(\"4480M - DVD\"));\n\tm_pComboBoxSplitToVolumes = new wxComboBox(this, IDC_COMPRESS_COMBO_VOLUME, wxEmptyString, wxDefaultPosition, wxDefaultSize, split2VolumesArray, wxCB_DROPDOWN);\n*/\n\tm_pComboBoxSplitToVolumes = new wxComboBox(this, IDC_COMPRESS_COMBO_VOLUME, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_DROPDOWN);\n\n\tpLeftSizer->Add(pCompressionOptionsSizer, 0, wxALL|wxEXPAND, 0);\n\tpLeftSizer->Add(pMemoryUsageSizer, 1, wxALL|wxEXPAND, 0);\n\tpLeftSizer->Add(pStaticSplit2Volumes, 0, wxALL|wxEXPAND, 5);\n\tpLeftSizer->Add(m_pComboBoxSplitToVolumes, 0, wxALL|wxEXPAND, 5);\n\n\twxBoxSizer *pRightSizer = new wxBoxSizer(wxVERTICAL);\n\twxStaticText *pStaticTextUpdateMode = new wxStaticText(this, IDC_STATIC_COMPRESS_UPDATE_MODE, wxT(\"&Update mode:\"));\n/*\n\twxArrayString updateModeArray;\n\tupdateModeArray.Add(wxT(\"Add and replace files\"));\n\tupdateModeArray.Add(wxT(\"Update and add files\"));\n\tupdateModeArray.Add(wxT(\"Freshen existing files\"));\n\tupdateModeArray.Add(wxT(\"Synchronize files\"));\n\tm_pComboBoxUpdateMode = new wxComboBox(this, IDC_COMPRESS_COMBO_UPDATE_MODE, updateModeArray.Item(0), wxDefaultPosition, wxDefaultSize, updateModeArray, wxCB_READONLY);\n*/\n\tm_pComboBoxUpdateMode = new wxComboBox(this, IDC_COMPRESS_COMBO_UPDATE_MODE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\twxStaticBoxSizer *pOptionsSizer = new wxStaticBoxSizer(new wxStaticBox(this,IDC_STATIC_COMPRESS_OPTIONS,_T(\"Options\")),wxVERTICAL);\n\twxCheckBox *m_pCheckBoxSFXArchive = new wxCheckBox(this, IDC_COMPRESS_SFX, wxT(\"Create SF&X archive\"));\n\tpOptionsSizer->Add(m_pCheckBoxSFXArchive, 1, wxALL|wxEXPAND, 5);\n\twxCheckBox *m_pCheckBoxCompressSharedFiles = new wxCheckBox(this, IDC_COMPRESS_SHARED, wxT(\"Compress shared files\"));\n\tm_pCheckBoxCompressSharedFiles->Show(false); // this option is useless undex Unix ...\n\tpOptionsSizer->Add(m_pCheckBoxCompressSharedFiles, 1, wxALL|wxEXPAND, 5);\n\n\twxStaticBoxSizer * pEncryptSizer = new wxStaticBoxSizer(new wxStaticBox(this,IDC_COMPRESS_ENCRYPTION,_T(\"Encryption\")),wxVERTICAL);\n\twxStaticText *pStaticTextPassword = new wxStaticText(this, IDC_STATIC_COMPRESS_PASSWORD1, wxT(\"Enter password:\"));\n\tm_pTextCtrlPassword = new wxTextCtrl(this, IDC_COMPRESS_EDIT_PASSWORD1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD);\n\twxStaticText *pStaticTextRePassword = new wxStaticText(this, IDC_STATIC_COMPRESS_PASSWORD2, wxT(\"Re-enter password:\"));\n\tm_pTextCtrlRePassword = new wxTextCtrl(this, IDC_COMPRESS_EDIT_PASSWORD2, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD);\n\tm_pCheckBoxShowPassword = new wxCheckBox(this, IDC_COMPRESS_CHECK_SHOW_PASSWORD, wxT(\"Show Password\"));\n\twxBoxSizer *pEncryptionMethodSizer = new wxBoxSizer(wxHORIZONTAL);\n\twxStaticText *pStaticTextEncryptionMethod = new wxStaticText(this, IDC_STATIC_COMPRESS_ENCRYPTION_METHOD, wxT(\"&Encryption method:\"));\n/*\n\twxArrayString encryptionMethodArray;\n\tencryptionMethodArray.Add(wxT(\"AES-256\"));\n\tm_pComboBoxEncryptionMethod =new wxComboBox(this, IDC_COMPRESS_COMBO_ENCRYPTION_METHOD, encryptionMethodArray.Item(0), wxDefaultPosition, wxDefaultSize, encryptionMethodArray, wxCB_READONLY);\n*/\n\tm_pComboBoxEncryptionMethod =new wxComboBox(this, IDC_COMPRESS_COMBO_ENCRYPTION_METHOD, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayString(), wxCB_READONLY);\n\n\tpEncryptionMethodSizer->Add(pStaticTextEncryptionMethod, 1, wxALL|wxEXPAND, 5);\n\tpEncryptionMethodSizer->Add(m_pComboBoxEncryptionMethod, 1, wxALL|wxEXPAND, 5);\n\tm_pCheckBoxEncryptFileNames = new wxCheckBox(this, IDC_COMPRESS_CHECK_ENCRYPT_FILE_NAMES, wxT(\"Encrypt file &names\"));\n\tpEncryptSizer->Add(pStaticTextPassword, 0, wxALL|wxEXPAND, 5);\n\tpEncryptSizer->Add(m_pTextCtrlPassword, 0, wxLEFT|wxRIGHT|wxEXPAND, 5);\n\tpEncryptSizer->Add(pStaticTextRePassword, 0, wxALL|wxEXPAND, 5);\n\tpEncryptSizer->Add(m_pTextCtrlRePassword, 0, wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND, 5);\n\tpEncryptSizer->Add(m_pCheckBoxShowPassword, 0, wxALL|wxEXPAND, 5);\n\tpEncryptSizer->Add(pEncryptionMethodSizer, 0, wxLEFT|wxRIGHT|wxEXPAND, 0);\n\tpEncryptSizer->Add(m_pCheckBoxEncryptFileNames, 0, wxALL|wxEXPAND, 5);\n\n\tpRightSizer->Add(pStaticTextUpdateMode, 0, wxALL|wxEXPAND, 5);\n\tpRightSizer->Add(m_pComboBoxUpdateMode, 0, wxALL|wxEXPAND, 5);\n\tpRightSizer->Add(pOptionsSizer, 1, wxALL|wxEXPAND, 5);\n\tpRightSizer->Add(pEncryptSizer, 0, wxALL|wxEXPAND, 5);\n\n\tpControlSizer->Add(pLeftSizer, 1, wxALL|wxEXPAND, 5);\n\tpControlSizer->Add(pRightSizer, 1, wxALL|wxEXPAND, 5);\n\twxStaticText *pStaticTextParameters = new wxStaticText(this, IDC_STATIC_COMPRESS_PARAMETERS, wxT(\"&Parameters:\"));\n\tm_pTextCtrlParameters = new wxTextCtrl(this, IDC_COMPRESS_EDIT_PARAMETERS, wxEmptyString);\n\ttopsizer->Add(pStaticTextArchive, 0, wxLEFT | wxRIGHT | wxTOP |wxEXPAND, 10);\n\ttopsizer->Add(pArchiveNameSizer, 1, wxLEFT | wxRIGHT |wxEXPAND, 5);\n\ttopsizer->Add(pControlSizer, 0, wxALL|wxEXPAND, 5);\n\ttopsizer->Add(pStaticTextParameters, 0, wxLEFT | wxRIGHT | wxBOTTOM |wxEXPAND, 10);\n\ttopsizer->Add(m_pTextCtrlParameters, 0, wxLEFT | wxRIGHT |wxEXPAND, 10);\n\ttopsizer->Add(CreateButtonSizer(wxOK | wxCANCEL | wxHELP), 0, wxALL|wxEXPAND, 10);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nREGISTER_DIALOG(IDD_DIALOG_COMPRESS,CCompressDialog,0)\n\nBEGIN_EVENT_TABLE(CCompressDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY,   CModalDialogImpl::OnAnyButton)\n\tEVT_CHECKBOX(wxID_ANY, CModalDialogImpl::OnAnyButton)\n\tEVT_COMBOBOX(wxID_ANY, CModalDialogImpl::OnAnyChoice)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/ExtractDialog.cpp",
    "content": "// ExtractDialog.cpp\n\n#include \"StdAfx.h\"\n\n// #include <HtmlHelp.h>\n\n#include \"ExtractDialog.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Windows/Shell.h\"\n#include \"Windows/FileName.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/ResourceString.h\"\n\n#ifndef NO_REGISTRY\n#include \"../FileManager/HelpUtils.h\"\n#endif\n\n#include \"../Common/ZipRegistry.h\"\n\n#include \"../FileManager/LangUtils.h\"\n\n#include \"ExtractRes.h\"\n#include \"ExtractDialogRes.h\"\n\n// #include \"Help/Context/Extract.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\nusing namespace NName;\n\nstatic const int kPathModeButtons[] =\n{\n  IDC_EXTRACT_RADIO_FULL_PATHNAMES,\n  IDC_EXTRACT_RADIO_CURRENT_PATHNAMES,\n  IDC_EXTRACT_RADIO_NO_PATHNAMES\n};\n\n#ifndef _SFX\n\nstatic const NExtract::NPathMode::EEnum kPathModeButtonsVals[] =\n{\n  NExtract::NPathMode::kFullPathnames,\n  NExtract::NPathMode::kCurrentPathnames,\n  NExtract::NPathMode::kNoPathnames\n};\n\nstatic const int kNumPathnamesButtons = sizeof(kPathModeButtons) / sizeof(kPathModeButtons[0]);\n\nstatic const int kOverwriteButtons[] =\n{\n  IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE,\n  IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT,\n  IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES,\n  IDC_EXTRACT_RADIO_AUTO_RENAME,\n  IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING,\n};\n\nstatic const NExtract::NOverwriteMode::EEnum kOverwriteButtonsVals[] =\n{\n  NExtract::NOverwriteMode::kAskBefore,\n  NExtract::NOverwriteMode::kWithoutPrompt,\n  NExtract::NOverwriteMode::kSkipExisting,\n  NExtract::NOverwriteMode::kAutoRename,\n  NExtract::NOverwriteMode::kAutoRenameExisting\n};\n\nstatic const int kNumOverwriteButtons = sizeof(kOverwriteButtons) / sizeof(kOverwriteButtons[0]);\n\n/*\nstatic const int kFilesButtons[] =\n{\n  IDC_EXTRACT_RADIO_SELECTED_FILES,\n  IDC_EXTRACT_RADIO_ALL_FILES\n};\nstatic const int kNumFilesButtons = sizeof(kFilesButtons) / sizeof(kFilesButtons[0]);\n*/\n\nvoid CExtractDialog::GetPathMode()\n{\n  for (int i = 0; i < kNumPathnamesButtons; i++)\n    if(IsButtonCheckedBool(kPathModeButtons[i]))\n    {\n      PathMode = kPathModeButtonsVals[i];\n      return;\n    }\n  throw 1;\n}\n\nvoid CExtractDialog::SetPathMode()\n{\n  for (int j = 0; j < 2; j++)\n  {\n    for (int i = 0; i < kNumPathnamesButtons; i++)\n      if(PathMode == kPathModeButtonsVals[i])\n      {\n        CheckRadioButton(kPathModeButtons[0], kPathModeButtons[kNumPathnamesButtons - 1],\n          kPathModeButtons[i]);\n        return;\n      }\n    PathMode = kPathModeButtonsVals[0];\n  }\n  throw 1;\n}\n\nvoid CExtractDialog::GetOverwriteMode()\n{\n  for (int i = 0; i < kNumOverwriteButtons; i++)\n    if(IsButtonCheckedBool(kOverwriteButtons[i]))\n    {\n      OverwriteMode = kOverwriteButtonsVals[i];\n      return;\n    }\n  throw 0;\n}\n\nvoid CExtractDialog::SetOverwriteMode()\n{\n  for (int j = 0; j < 2; j++)\n  {\n    for (int i = 0; i < kNumOverwriteButtons; i++)\n      if(OverwriteMode == kOverwriteButtonsVals[i])\n      {\n        CheckRadioButton(kOverwriteButtons[0], kOverwriteButtons[kNumOverwriteButtons - 1],\n            kOverwriteButtons[i]);\n        return;\n      }\n    OverwriteMode = kOverwriteButtonsVals[0];\n  }\n  throw 1;\n}\n\n/*\nint CExtractDialog::GetFilesMode() const\n{\n  for (int i = 0; i < kNumFilesButtons; i++)\n    if(IsButtonCheckedBool(kFilesButtons[i]))\n      return i;\n  throw 0;\n}\n*/\n\n#endif\n\n#ifdef LANG\nstatic CIDLangPair kIDLangPairs[] =\n{\n  { IDC_STATIC_EXTRACT_EXTRACT_TO,      0x02000801 },\n  { IDC_EXTRACT_PATH_MODE,               0x02000810 },\n  { IDC_EXTRACT_RADIO_FULL_PATHNAMES,    0x02000811 },\n  { IDC_EXTRACT_RADIO_CURRENT_PATHNAMES, 0x02000812 },\n  { IDC_EXTRACT_RADIO_NO_PATHNAMES,      0x02000813 },\n  { IDC_EXTRACT_OVERWRITE_MODE,                 0x02000820 },\n  { IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE,     0x02000821 },\n  { IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT, 0x02000822 },\n  { IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES,      0x02000823 },\n  { IDC_EXTRACT_RADIO_AUTO_RENAME,              0x02000824 },\n  { IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING,     0x02000825 },\n  { IDC_EXTRACT_FILES,                0x02000830 },\n  { IDC_EXTRACT_RADIO_SELECTED_FILES, 0x02000831 },\n  { IDC_EXTRACT_RADIO_ALL_FILES,      0x02000832 },\n  { IDC_EXTRACT_PASSWORD,        0x02000802 },\n  { IDC_EXTRACT_CHECK_SHOW_PASSWORD, 0x02000B02 },\n  { IDOK,     0x02000702 },\n  { IDCANCEL, 0x02000710 },\n  { IDHELP,   0x02000720 }\n\n};\n#endif\n\n// static const int kWildcardsButtonIndex = 2;\n\n#ifndef NO_REGISTRY\nstatic const int kHistorySize = 8;\n#endif\n\nbool CExtractDialog::OnInit()\n{\n  #ifdef LANG\n  LangSetWindowText(HWND(*this), 0x02000800);\n  LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\n  #endif\n  #ifndef _SFX\n  _passwordControl.Attach(GetItem(IDC_EXTRACT_EDIT_PASSWORD));\n  _passwordControl.SetText(Password);\n  _passwordControl.SetPasswordChar(TEXT('*'));\n  #endif\n\n  NExtract::CInfo extractionInfo;\n\n  #ifdef NO_REGISTRY\n  PathMode = NExtract::NPathMode::kFullPathnames;\n  OverwriteMode = NExtract::NOverwriteMode::kAskBefore;\n  // extractionInfo.Paths = NExtract::NPathMode::kFullPathnames;\n  #else\n  ReadExtractionInfo(extractionInfo);\n  CheckButton(IDC_EXTRACT_CHECK_SHOW_PASSWORD, extractionInfo.ShowPassword);\n  UpdatePasswordControl();\n  PathMode = extractionInfo.PathMode;\n  OverwriteMode = extractionInfo.OverwriteMode;\n  #endif\n\n  _path.Attach(GetItem(IDC_EXTRACT_COMBO_PATH));\n\n  _path.SetText(DirectoryPath);\n  \n  #ifndef NO_REGISTRY\n  for(int i = 0; i < extractionInfo.Paths.Size() && i < kHistorySize; i++)\n    _path.AddString(extractionInfo.Paths[i]);\n  #endif\n\n  /*\n  if(extractionInfo.Paths.Size() > 0)\n    _path.SetCurSel(0);\n  else\n    _path.SetCurSel(-1);\n  */\n\n  \n  \n  #ifndef _SFX\n  SetPathMode();\n  SetOverwriteMode();\n\n  /*\n  CheckRadioButton(kFilesButtons[0], kFilesButtons[kNumFilesButtons - 1],\n      kFilesButtons[_filesMode]);\n  */\n\n  // CWindow selectedFilesWindow = GetItem(IDC_EXTRACT_RADIO_SELECTED_FILES);\n  // selectedFilesWindow.Enable(_enableSelectedFilesButton);\n\n\n  #endif\n\n \n  // CWindow filesWindow = GetItem(IDC_EXTRACT_RADIO_FILES);\n  // filesWindow.Enable(_enableFilesButton);\n\n  // UpdateWildCardState();\n  return CModalDialog::OnInit();\n}\n\n#ifndef _SFX\nvoid CExtractDialog::UpdatePasswordControl()\n{\n  _passwordControl.SetPasswordChar((IsButtonChecked(\n    IDC_EXTRACT_CHECK_SHOW_PASSWORD) == BST_CHECKED) ? 0: TEXT('*'));\n  UString password;\n  _passwordControl.GetText(password);\n  _passwordControl.SetText(password);\n}\n#endif\n\nbool CExtractDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  /*\n  for (int i = 0; i < kNumFilesButtons; i++)\n    if (buttonID == kFilesButtons[i])\n    {\n      UpdateWildCardState();\n      return true;\n    }\n  */\n  switch(buttonID)\n  {\n    case IDC_EXTRACT_BUTTON_SET_PATH:\n      OnButtonSetPath();\n      return true;\n    #ifndef _SFX\n    case IDC_EXTRACT_CHECK_SHOW_PASSWORD:\n    {\n      UpdatePasswordControl();\n      return true;\n    }\n    #endif\n  }\n  return CModalDialog::OnButtonClicked(buttonID, buttonHWND);\n}\n\nvoid CExtractDialog::OnButtonSetPath()\n{\n  UString currentPath;\n  _path.GetText(currentPath);\n  UString title = LangStringSpec(IDS_EXTRACT_SET_FOLDER, 0x02000881);\n  UString resultPath;\n  if (!NShell::BrowseForFolder(HWND(*this), title, currentPath, resultPath))\n    return;\n  #ifndef NO_REGISTRY\n  _path.SetCurSel(-1);\n  #endif\n  _path.SetText(resultPath);\n}\n\nvoid AddUniqueString(UStringVector &list, const UString &s)\n{\n  for(int i = 0; i < list.Size(); i++)\n    if (s.CompareNoCase(list[i]) == 0)\n      return;\n  list.Add(s);\n}\n\nvoid CExtractDialog::OnOK()\n{\n  #ifndef _SFX\n  GetPathMode();\n  GetOverwriteMode();\n  // _filesMode = (NExtractionDialog::NFilesMode::EEnum)GetFilesMode();\n\n  _passwordControl.GetText(Password);\n  #endif\n\n  NExtract::CInfo extractionInfo;\n  extractionInfo.PathMode = PathMode;\n  extractionInfo.OverwriteMode = OverwriteMode;\n  extractionInfo.ShowPassword = (IsButtonChecked(\n          IDC_EXTRACT_CHECK_SHOW_PASSWORD) == BST_CHECKED);\n  \n  UString s;\n  \n  #ifdef NO_REGISTRY\n  \n  _path.GetText(s);\n  \n  #else\n\n  int currentItem = _path.GetCurSel();\n  if(currentItem == CB_ERR)\n  {\n    _path.GetText(s);\n    if(_path.GetCount() >= kHistorySize)\n      currentItem = _path.GetCount() - 1;\n  }\n  else\n    _path.GetLBText(currentItem, s);\n  \n  #endif\n\n  s.Trim();\n  #ifndef _SFX\n  AddUniqueString(extractionInfo.Paths, s);\n  #endif\n  DirectoryPath = s;\n  #ifndef  NO_REGISTRY\n  for(int i = 0; i < _path.GetCount(); i++)\n    if(i != currentItem)\n    {\n      UString sTemp;\n      _path.GetLBText(i, sTemp);\n      sTemp.Trim();\n      AddUniqueString(extractionInfo.Paths, sTemp);\n    }\n  SaveExtractionInfo(extractionInfo);\n  #endif\n  CModalDialog::OnOK();\n}\n\n/*\nvoid CExtractDialog::UpdateWildCardState()\n{\n  // UpdateData(TRUE);\n  // m_Wildcards.EnableWindow(BoolToBOOL(m_Files == kWildcardsButtonIndex));\n}\n*/\n\n#ifndef  NO_REGISTRY\nstatic LPCWSTR kHelpTopic = L\"fm/plugins/7-zip/extract.htm\";\nvoid CExtractDialog::OnHelp()\n{\n  ShowHelpWindow(NULL, kHelpTopic);\n  CModalDialog::OnHelp();\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/ExtractDialog.h",
    "content": "// ExtractDialog.h\n\n#ifndef __EXTRACTDIALOG_H\n#define __EXTRACTDIALOG_H\n\n#include \"ExtractDialogRes.h\"\n\n#include \"Windows/Control/Dialog.h\"\n#include \"Windows/Control/Edit.h\"\n#include \"Windows/Control/ComboBox.h\"\n\n#ifndef  NO_REGISTRY\n#include \"../Common/ZipRegistry.h\"\n#endif\n#include \"../Common/ExtractMode.h\"\n\nnamespace NExtractionDialog\n{\n  /*\n  namespace NFilesMode\n  {\n    enum EEnum\n    {\n      kSelected,\n      kAll,\n      kSpecified\n    };\n  }\n  */\n}\n\nclass CExtractDialog: public NWindows::NControl::CModalDialog\n{\n  #ifdef NO_REGISTRY\n  NWindows::NControl::CDialogChildControl _path;\n  #else\n  NWindows::NControl::CComboBox _path;\n  #endif\n  \n  #ifndef _SFX\n  NWindows::NControl::CEdit _passwordControl;\n  #endif\n\n  #ifndef _SFX\n  void GetPathMode();\n  void SetPathMode();\n  void GetOverwriteMode();\n  void SetOverwriteMode();\n  // int GetFilesMode() const;\n  void UpdatePasswordControl();\n  #endif\n  \n  void OnButtonSetPath();\n\n  virtual bool OnInit();\n  virtual bool OnButtonClicked(int buttonID, HWND buttonHWND);\n  virtual void OnOK();\n  #ifndef  NO_REGISTRY\n  virtual void OnHelp();\n  #endif\npublic:\n  // bool _enableSelectedFilesButton;\n  // bool _enableFilesButton;\n  // NExtractionDialog::NFilesMode::EEnum FilesMode;\n\n  UString DirectoryPath;\n  #ifndef _SFX\n  UString Password;\n  #endif\n  NExtract::NPathMode::EEnum PathMode;\n  NExtract::NOverwriteMode::EEnum OverwriteMode;\n\n  INT_PTR Create(HWND aWndParent = 0)\n    { return CModalDialog::Create(IDD_DIALOG_EXTRACT, aWndParent); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/ExtractDialogRes.h",
    "content": "#define IDD_DIALOG_EXTRACT              137\n\n#define IDC_STATIC_EXTRACT_EXTRACT_TO   1020\n#define IDC_EXTRACT_COMBO_PATH          1021\n#define IDC_EXTRACT_BUTTON_SET_PATH     1022\n\n\n#define IDC_EXTRACT_PATH_MODE           1040\n#define IDC_EXTRACT_RADIO_FULL_PATHNAMES 1041\n#define IDC_EXTRACT_RADIO_CURRENT_PATHNAMES 1042\n#define IDC_EXTRACT_RADIO_NO_PATHNAMES  1043\n\n#define IDC_EXTRACT_OVERWRITE_MODE      1050\n#define IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE 1051\n#define IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT 1052\n#define IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES 1053\n#define IDC_EXTRACT_RADIO_SELECTED_FILES 1054\n#define IDC_EXTRACT_RADIO_ALL_FILES     1055\n#define IDC_EXTRACT_RADIO_AUTO_RENAME   1056\n#define IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING 1057\n\n\n#define IDC_EXTRACT_FILES               1060\n\n#define IDC_EXTRACT_PASSWORD            1100\n#define IDC_EXTRACT_EDIT_PASSWORD       1101\n#define IDC_EXTRACT_CHECK_SHOW_PASSWORD 1102\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/ExtractDialog_rc.cpp",
    "content": "// ExtractDialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif \n\n#include \"Windows/Control/DialogImpl.h\"\n\n#include \"ExtractRes.h\"\n#include \"ExtractDialogRes.h\"\n\n/*\nIDD_DIALOG_EXTRACT DIALOG DISCARDABLE  0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE\nCAPTION \"Extract\"\nMY_FONT\nBEGIN\n  LTEXT    \"E&xtract to:\", IDC_STATIC_EXTRACT_EXTRACT_TO, marg, marg, xSize2, 8\n  \n  COMBOBOX   IDC_EXTRACT_COMBO_PATH, marg, 21, xSize2 - bDotsSize - 13, 126, CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\n\n  PUSHBUTTON  \"...\", IDC_EXTRACT_BUTTON_SET_PATH, xSize - marg - bDotsSize, 20, bDotsSize, bYSize, WS_GROUP\n\n  GROUPBOX  \"Path mode\",IDC_EXTRACT_PATH_MODE, marg, 44, g1XSize, 57\n  CONTROL  \"Full pathnames\", IDC_EXTRACT_RADIO_FULL_PATHNAMES,\"Button\", BS_AUTORADIOBUTTON | WS_GROUP,\n           g1XPos2, 57, g1XSize2, 10\n  CONTROL  \"Current pathnames\",IDC_EXTRACT_RADIO_CURRENT_PATHNAMES, \"Button\", BS_AUTORADIOBUTTON,\n           g1XPos2, 71, g1XSize2, 10\n  CONTROL  \"No pathnames\", IDC_EXTRACT_RADIO_NO_PATHNAMES, \"Button\", BS_AUTORADIOBUTTON,\n           g1XPos2, 85, g1XSize2, 10\n\n  GROUPBOX \"Overwrite mode\",IDC_EXTRACT_OVERWRITE_MODE, g2XPos, 44, g2XSize, 88, WS_GROUP\n  CONTROL  \"Ask before overwrite\", IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE, \"Button\", BS_AUTORADIOBUTTON | WS_GROUP,\n           g2XPos2, 57, g2XSize2, 10\n  CONTROL  \"Overwrite without prompt\", IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT, \"Button\", BS_AUTORADIOBUTTON,\n           g2XPos2, 71, g2XSize2, 10\n  CONTROL  \"Skip existing files\", IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES, \"Button\", BS_AUTORADIOBUTTON,\n           g2XPos2, 85, g2XSize2, 10\n  CONTROL  \"Auto rename\", IDC_EXTRACT_RADIO_AUTO_RENAME, \"Button\", BS_AUTORADIOBUTTON,\n           g2XPos2, 99, g2XSize2, 10\n  CONTROL  \"Auto rename existing files\", IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING, \"Button\", BS_AUTORADIOBUTTON,\n           g2XPos2,113, g2XSize2, 10\n\n  GROUPBOX \"Files\",IDC_EXTRACT_FILES, marg, 140, 127, 48, NOT WS_VISIBLE | WS_DISABLED | WS_GROUP\n  CONTROL  \"&Selected files\",IDC_EXTRACT_RADIO_SELECTED_FILES, \"Button\", BS_AUTORADIOBUTTON | NOT WS_VISIBLE | WS_DISABLED | WS_GROUP,\n           g1XPos2, 153, g1XSize2, 10\n  CONTROL  \"&All files\",IDC_EXTRACT_RADIO_ALL_FILES, \"Button\", BS_AUTORADIOBUTTON | NOT WS_VISIBLE | WS_DISABLED,\n           g1XPos2, 166, g1XSize2, 10\n\n  GROUPBOX \"Password\",IDC_EXTRACT_PASSWORD, g2XPos, 142, g2XSize, 46\n  EDITTEXT IDC_EXTRACT_EDIT_PASSWORD,154,153,130,14, ES_PASSWORD | ES_AUTOHSCROLL\n  CONTROL         \"Show Password\",IDC_EXTRACT_CHECK_SHOW_PASSWORD,\"Button\", BS_AUTOCHECKBOX | WS_TABSTOP,\n           g2XPos2, 172, g2XSize2, 10\n  \n  DEFPUSHBUTTON  \"OK\",         IDOK, bXPos3, bYPos, bXSize, bYSize, WS_GROUP\n  PUSHBUTTON     \"Cancel\", IDCANCEL, bXPos2, bYPos, bXSize, bYSize\n  PUSHBUTTON     \"Help\",     IDHELP, bXPos1, bYPos, bXSize, bYSize\nEND\n*/\n\n\nclass CExtractDialogImpl : public NWindows::NControl::CModalDialogImpl\n{\n public:\n   CExtractDialogImpl(NWindows::NControl::CModalDialog *dialog,wxWindow * parent , int id) : CModalDialogImpl(dialog,parent, id, wxT(\"Extract\"))\n  {\n\twxStaticText *m_pStaticTextExtractTo;\n\twxTextCtrl *m_pTextCtrlPassword;\n\twxButton *m_pButtonBrowse;\n\twxComboBox *m_pComboBoxExtractTo;\n\twxCheckBox *m_pCheckBoxShowPassword;\n\n\n\t///Sizer for adding the controls created by users\n\twxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);\n\n\twxArrayString pathArray;\n\tm_pStaticTextExtractTo = new wxStaticText(this, IDC_STATIC_EXTRACT_EXTRACT_TO, wxT(\"E&xtract To:\"));\n\twxBoxSizer *pPathSizer = new wxBoxSizer(wxHORIZONTAL);\n\tm_pComboBoxExtractTo = new wxComboBox(this, IDC_EXTRACT_COMBO_PATH, wxEmptyString, wxDefaultPosition, wxDefaultSize, pathArray, wxCB_DROPDOWN|wxCB_SORT);\n\tm_pButtonBrowse = new wxButton(this, IDC_EXTRACT_BUTTON_SET_PATH, wxT(\"...\"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);\n\tpPathSizer->Add(m_pComboBoxExtractTo, 1, wxLEFT|wxRIGHT|wxEXPAND, 5);\n\tpPathSizer->Add(m_pButtonBrowse, 0, wxLEFT|wxRIGHT|wxEXPAND, 5);\n\n\twxBoxSizer *pControlSizer = new wxBoxSizer(wxHORIZONTAL);\n\n\twxStaticBoxSizer * grpPathMode = new wxStaticBoxSizer(new wxStaticBox(this,IDC_EXTRACT_PATH_MODE,_T(\"Path mode\")),wxVERTICAL);\n\tgrpPathMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_FULL_PATHNAMES, wxT(\"Full pathnames\"),wxDefaultPosition,  wxDefaultSize, wxRB_GROUP ) , 0 );\n\tgrpPathMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_CURRENT_PATHNAMES, wxT(\"Current pathnames\"),wxDefaultPosition,  wxDefaultSize) , 0 );\n\tgrpPathMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_NO_PATHNAMES, wxT(\"no pathnames\"),wxDefaultPosition,  wxDefaultSize) , 0 );\n\n\twxBoxSizer *pRightSizer = new wxBoxSizer(wxVERTICAL);\n\n\twxStaticBoxSizer * grpOverWriteMode = new wxStaticBoxSizer(new wxStaticBox(this,IDC_EXTRACT_OVERWRITE_MODE,wxT(\"Overwrite mode\")),wxVERTICAL);\n\tgrpOverWriteMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_ASK_BEFORE_OVERWRITE, wxT(\"Ask before overwrite\"),wxDefaultPosition,  wxDefaultSize, wxRB_GROUP) , 1 );\n\tgrpOverWriteMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_OVERWRITE_WITHOUT_PROMPT, wxT(\"Overwrite without prompt\"),wxDefaultPosition,  wxDefaultSize) , 1 );\n\tgrpOverWriteMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_SKIP_EXISTING_FILES, wxT(\"Skip existing files\"),wxDefaultPosition,  wxDefaultSize) , 1 );\n\tgrpOverWriteMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_AUTO_RENAME, wxT(\"Auto rename\"),wxDefaultPosition,  wxDefaultSize) , 1 );\n\tgrpOverWriteMode->Add(new wxRadioButton(this, IDC_EXTRACT_RADIO_AUTO_RENAME_EXISTING, wxT(\"Auto rename existing files\"),wxDefaultPosition,  wxDefaultSize) , 1 );\n\n\twxStaticBoxSizer *pPasswordSizer = new wxStaticBoxSizer(new wxStaticBox(this,IDC_EXTRACT_PASSWORD,wxT(\"Password mode\")),wxVERTICAL);\n\n\tm_pTextCtrlPassword = new wxTextCtrl(this, IDC_EXTRACT_EDIT_PASSWORD, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD);\n\tm_pCheckBoxShowPassword = new wxCheckBox(this, IDC_EXTRACT_CHECK_SHOW_PASSWORD, wxT(\"Show Password\"));\n\tpPasswordSizer->Add(m_pTextCtrlPassword, 0, wxALL|wxEXPAND, 5);\n\tpPasswordSizer->Add(m_pCheckBoxShowPassword, 0, wxALL|wxEXPAND, 5);\n\n\tpRightSizer->Add(grpOverWriteMode, 1, wxALL|wxEXPAND, 5);\n\tpRightSizer->Add(pPasswordSizer, 0, wxALL|wxEXPAND, 5);\n\n\tpControlSizer->Add(grpPathMode, 1, wxALL|wxEXPAND, 5);\n\tpControlSizer->Add(pRightSizer, 1, wxLEFT | wxRIGHT | wxEXPAND, 5);\n\n\ttopsizer->Add(m_pStaticTextExtractTo, 0, wxALL | wxEXPAND , 10);\n\ttopsizer->Add(pPathSizer, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND , 5);\n\ttopsizer->Add(pControlSizer, 1, wxALL | wxEXPAND , 5);\n\ttopsizer->Add(CreateButtonSizer(wxOK | wxCANCEL | wxHELP), 0, wxALL | wxEXPAND , 5);\n\n\tthis->OnInit();\n\n\tSetSizer(topsizer); // use the sizer for layout\n\ttopsizer->SetSizeHints(this); // set size hints to honour minimum size\n  }\nprivate:\n\t// Any class wishing to process wxWindows events must use this macro\n\tDECLARE_EVENT_TABLE()\n};\n\nREGISTER_DIALOG(IDD_DIALOG_EXTRACT,CExtractDialog,0)\n\nBEGIN_EVENT_TABLE(CExtractDialogImpl, wxDialog)\n\tEVT_BUTTON(wxID_ANY, CModalDialogImpl::OnAnyButton)\n\tEVT_CHECKBOX(wxID_ANY, CModalDialogImpl::OnAnyButton)\nEND_EVENT_TABLE()\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/ExtractGUI.cpp",
    "content": "// ExtractGUI.cpp\n\n#include \"StdAfx.h\"\n\n#include \"ExtractGUI.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/Error.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/Thread.h\"\n\n#include \"../FileManager/FormatUtils.h\"\n#include \"../FileManager/ExtractCallback.h\"\n#include \"../FileManager/LangUtils.h\"\n\n#include \"../Common/ArchiveExtractCallback.h\"\n#include \"../Explorer/MyMessages.h\"\n#include \"resource.h\"\n#include \"ExtractRes.h\"\n\n#include \"ExtractDialog.h\"\n\nusing namespace NWindows;\n\nstatic const wchar_t *kIncorrectOutDir = L\"Incorrect output directory path\";\n\nstruct CThreadExtracting\n{\n  CCodecs *codecs;\n  CExtractCallbackImp *ExtractCallbackSpec;\n  CIntVector FormatIndices;\n\n  UStringVector *ArchivePaths;\n  UStringVector *ArchivePathsFull;\n  const NWildcard::CCensorNode *WildcardCensor;\n  const CExtractOptions *Options;\n  CMyComPtr<IExtractCallbackUI> ExtractCallback;\n  CDecompressStat Stat;\n  UString ErrorMessage;\n  HRESULT Result;\n  \n  DWORD Process()\n  {\n    ExtractCallbackSpec->ProgressDialog.WaitCreating();\n    try\n    {\n      Result = DecompressArchives(\n          codecs, FormatIndices,\n          *ArchivePaths, *ArchivePathsFull,\n          *WildcardCensor, *Options, ExtractCallbackSpec, ExtractCallback, ErrorMessage, Stat);\n    }\n    catch(const UString &s)\n    {\n      ErrorMessage = s;\n      Result = E_FAIL;\n    }\n    catch(const wchar_t *s)\n    {\n      ErrorMessage = s;\n      Result = E_FAIL;\n    }\n    catch(const char *s)\n    {\n      ErrorMessage = GetUnicodeString(s);\n      Result = E_FAIL;\n    }\n    catch(...)\n    {\n      Result = E_FAIL;\n    }\n    ExtractCallbackSpec->ProgressDialog.MyClose();\n    return 0;\n  }\n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    return ((CThreadExtracting *)param)->Process();\n  }\n};\n\n#ifndef _SFX\n\nstatic void AddValuePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)\n{\n  wchar_t sz[32];\n  s += LangString(resourceID, langID);\n  s += L\" \";\n  ConvertUInt64ToString(value, sz);\n  s += sz;\n  s += L\"\\n\";\n}\n\nstatic void AddSizePair(UINT resourceID, UInt32 langID, UInt64 value, UString &s)\n{\n  wchar_t sz[32];\n  s += LangString(resourceID, langID);\n  s += L\" \";\n  ConvertUInt64ToString(value, sz);\n  s += sz;\n  ConvertUInt64ToString(value >> 20, sz);\n  s += L\" (\";\n  s += sz;\n  s += L\" MB)\";\n  s += L\"\\n\";\n}\n\n#endif\n\nHRESULT ExtractGUI(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    UStringVector &archivePaths,\n    UStringVector &archivePathsFull,\n    const NWildcard::CCensorNode &wildcardCensor,\n    CExtractOptions &options,\n    bool showDialog,\n    CExtractCallbackImp *extractCallback)\n{\n  CThreadExtracting extracter;\n  extracter.codecs = codecs;\n  extracter.FormatIndices = formatIndices;\n\n  if (!options.TestMode)\n  {\n    UString outputDir = options.OutputDir;\n    if (outputDir.IsEmpty())\n      NFile::NDirectory::MyGetCurrentDirectory(outputDir);\n    if (showDialog)\n    {\n      CExtractDialog dialog;\n      if (!NFile::NDirectory::MyGetFullPathName(outputDir, dialog.DirectoryPath))\n      {\n        ShowErrorMessage(kIncorrectOutDir);\n        return E_FAIL;\n      }\n      NFile::NName::NormalizeDirPathPrefix(dialog.DirectoryPath);\n#ifndef _WIN32\n      {\n\textern const TCHAR * nameWindowToUnix(const TCHAR * lpFileName);\n        UString tmpDirectoryPath = dialog.DirectoryPath;\n\tdialog.DirectoryPath = nameWindowToUnix(tmpDirectoryPath);\n      }\n#endif\n\n\n      // dialog.OverwriteMode = options.OverwriteMode;\n      // dialog.PathMode = options.PathMode;\n\n      if(dialog.Create(0) != IDOK)\n        return E_ABORT;\n      outputDir = dialog.DirectoryPath;\n      options.OverwriteMode = dialog.OverwriteMode;\n      options.PathMode = dialog.PathMode;\n      #ifndef _SFX\n      extractCallback->Password = dialog.Password;\n      extractCallback->PasswordIsDefined = !dialog.Password.IsEmpty();\n      #endif\n    }\n    if (!NFile::NDirectory::MyGetFullPathName(outputDir, options.OutputDir))\n    {\n      ShowErrorMessage(kIncorrectOutDir);\n      return E_FAIL;\n    }\n    NFile::NName::NormalizeDirPathPrefix(options.OutputDir);\n    \n    /*\n    if(!NFile::NDirectory::CreateComplexDirectory(options.OutputDir))\n    {\n      UString s = GetUnicodeString(NError::MyFormatMessage(GetLastError()));\n      UString s2 = MyFormatNew(IDS_CANNOT_CREATE_FOLDER,\n      #ifdef LANG\n      0x02000603,\n      #endif\n      options.OutputDir);\n      MyMessageBox(s2 + UString(L\"\\n\") + s);\n      return E_FAIL;\n    }\n    */\n  }\n  \n  UString title = LangStringSpec(options.TestMode ? IDS_PROGRESS_TESTING : IDS_PROGRESS_EXTRACTING,\n      options.TestMode ? 0x02000F90: 0x02000890);\n\n  extracter.ExtractCallbackSpec = extractCallback;\n  extracter.ExtractCallback = extractCallback;\n  extracter.ExtractCallbackSpec->Init();\n\n  extracter.ArchivePaths = &archivePaths;\n  extracter.ArchivePathsFull = &archivePathsFull;\n  extracter.WildcardCensor = &wildcardCensor;\n  extracter.Options = &options;\n\n  NWindows::CThread thread;\n  RINOK(thread.Create(CThreadExtracting::MyThreadFunction, &extracter));\n  extracter.ExtractCallbackSpec->StartProgressDialog(title);\n  if (extracter.Result == S_OK && options.TestMode &&\n      extracter.ExtractCallbackSpec->Messages.IsEmpty() &&\n      extracter.ExtractCallbackSpec->NumArchiveErrors == 0)\n  {\n    #ifndef _SFX\n    UString s;\n    AddValuePair(IDS_ARCHIVES_COLON, 0x02000324, extracter.Stat.NumArchives, s);\n    AddValuePair(IDS_FOLDERS_COLON, 0x02000321, extracter.Stat.NumFolders, s);\n    AddValuePair(IDS_FILES_COLON, 0x02000320, extracter.Stat.NumFiles, s);\n    AddSizePair(IDS_SIZE_COLON, 0x02000322, extracter.Stat.UnpackSize, s);\n    AddSizePair(IDS_COMPRESSED_COLON, 0x02000323, extracter.Stat.PackSize, s);\n    s += L\"\\n\";\n    s += LangString(IDS_MESSAGE_NO_ERRORS, 0x02000608);\n\n    MessageBoxW(0, s, LangString(IDS_PROGRESS_TESTING, 0x02000F90), 0);\n    #endif\n  }\n  if (extracter.Result != S_OK)\n    if (!extracter.ErrorMessage.IsEmpty())\n      throw extracter.ErrorMessage;\n  return extracter.Result;\n}\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/ExtractGUI.h",
    "content": "// GUI/ExtractGUI.h\n\n#ifndef __EXTRACT_GUI_H\n#define __EXTRACT_GUI_H\n\n#include \"../Common/Extract.h\"\n\n#include \"../FileManager/ExtractCallback.h\"\n\nHRESULT ExtractGUI(\n    CCodecs *codecs,\n    const CIntVector &formatIndices,\n    UStringVector &archivePaths,\n    UStringVector &archivePathsFull,\n    const NWildcard::CCensorNode &wildcardCensor,\n    CExtractOptions &options,\n    bool showDialog,\n    CExtractCallbackImp *extractCallback);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/ExtractRes.h",
    "content": "#define IDS_UPDATE_NOT_SUPPORTED 199\n#define IDS_CANNOT_CREATE_FOLDER  200\n#define IDS_OPEN_IS_NOT_SUPORTED_ARCHIVE  201\n\n#define IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC  202\n#define IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR  203\n#define IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_UNSUPPORTED_METHOD  204\n#define IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC_ENCRYPTED  205\n#define IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR_ENCRYPTED  206\n\n#define IDS_EXTRACT_SET_FOLDER  207\n#define IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CANNOT_OPEN_FILE  208\n#define IDS_PROGRESS_EXTRACTING  209\n\n#define IDS_CANT_OPEN_ARCHIVE   103\n#define IDS_CANT_OPEN_ENCRYPTED_ARCHIVE 104\n#define IDS_MEM_ERROR 105\n#define IDS_UNKNOWN_ERROR 106\n#define IDS_UNSUPPORTED_ARCHIVE_TYPE 107\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/GUI.cpp",
    "content": "// GUI.cpp\n\n#include \"StdAfx.h\"\n\n#include <initguid.h>\n\nextern \"C\"\n{\n  #include \"../../../../C/Alloc.h\"\n}\n\n#include \"Common/NewHandler.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/CommandLineParser.h\"\n#include \"Common/MyException.h\"\n\n#include \"Windows/Error.h\"\n#ifdef _WIN32\n#include \"Windows/MemoryLock.h\"\n#endif\n\n#include \"../FileManager/StringUtils.h\"\n\n#include \"../Common/ExitCode.h\"\n#include \"../Common/ArchiveCommandLine.h\"\n\n#include \"ExtractRes.h\"\n\n#include \"ExtractGUI.h\"\n#include \"UpdateGUI.h\"\n#include \"BenchmarkDialog.h\"\n\nusing namespace NWindows;\n\nHINSTANCE g_hInstance;\n#ifndef _UNICODE\nbool g_IsNT = false;\n#endif\n\nstatic void ErrorMessage(LPCWSTR message)\n{\n  MessageBoxW(NULL, message, L\"7-Zip\", MB_ICONERROR | MB_OK);\n}\n\nstatic void ErrorLangMessage(UINT resourceID, UInt32 langID)\n{\n  ErrorMessage(LangString(resourceID, langID));\n}\n\nstatic const char *kNoFormats = \"7-Zip cannot find the code that works with archives.\";\n\nstatic int ShowMemErrorMessage()\n{\n  ErrorLangMessage(IDS_MEM_ERROR, 0x0200060B);\n  return NExitCode::kMemoryError;\n}\n\nstatic int ShowSysErrorMessage(DWORD errorCode)\n{\n  if (errorCode == E_OUTOFMEMORY)\n    return ShowMemErrorMessage();\n  ErrorMessage(NError::MyFormatMessageW(errorCode));\n  return NExitCode::kFatalError;\n}\n\nint Main2(int argc,TCHAR **argv)\n{\n  UStringVector commandStrings;\n  #ifdef _WIN32  \n  NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);\n  #else\n  extern void mySplitCommandLineW(int numArguments,TCHAR  **arguments,UStringVector &parts);\n  mySplitCommandLineW(argc,argv,commandStrings);\n  #endif\n\n  if (commandStrings.Size() <= 1)\n  {\n    MessageBoxW(0, L\"Specify command\", L\"7-Zip\", 0);\n    return 0;\n  }\n  commandStrings.Delete(0);\n\n  CArchiveCommandLineOptions options;\n  CArchiveCommandLineParser parser;\n\n  parser.Parse1(commandStrings, options);\n  parser.Parse2(options);\n\n  #ifdef _WIN32\n  if (options.LargePages)\n    NSecurity::EnableLockMemoryPrivilege();\n  #endif\n\n  CCodecs *codecs = new CCodecs;\n  CMyComPtr<IUnknown> compressCodecsInfo = codecs;\n  HRESULT result = codecs->Load();\n  if (result != S_OK)\n    throw CSystemException(result);\n  \n  bool isExtractGroupCommand = options.Command.IsFromExtractGroup();\n  if (codecs->Formats.Size() == 0 &&\n        (isExtractGroupCommand ||\n        options.Command.IsFromUpdateGroup()))\n    throw kNoFormats;\n\n  CIntVector formatIndices;\n  if (!codecs->FindFormatForArchiveType(options.ArcType, formatIndices))\n  {\n    ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE, 0x0200060D);\n    return NExitCode::kFatalError;\n  }\n \n  if (options.Command.CommandType == NCommandType::kBenchmark)\n  {\n    HRESULT res = Benchmark(\n      #ifdef EXTERNAL_LZMA\n      codecs,\n      #endif\n      options.NumThreads, options.DictionarySize);\n    if (res != S_OK)\n      throw CSystemException(res);\n  }\n  else if (isExtractGroupCommand)\n  {\n    CExtractCallbackImp *ecs = new CExtractCallbackImp;\n    CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;\n    ecs->ProgressDialog.CompressingMode = false;\n    ecs->PasswordIsDefined = options.PasswordEnabled;\n    ecs->Password = options.Password;\n    ecs->Init();\n\n    CExtractOptions eo;\n    eo.StdOutMode = options.StdOutMode;\n    eo.OutputDir = options.OutputDir;\n    eo.YesToAll = options.YesToAll;\n    eo.OverwriteMode = options.OverwriteMode;\n    eo.PathMode = options.Command.GetPathMode();\n    eo.TestMode = options.Command.IsTestMode();\n    #ifdef COMPRESS_MT\n    eo.Properties = options.ExtractProperties;\n    #endif\n\n    HRESULT result = ExtractGUI(codecs, formatIndices,\n          options.ArchivePathsSorted,\n          options.ArchivePathsFullSorted,\n          options.WildcardCensor.Pairs.Front().Head,\n          eo, options.ShowDialog, ecs);\n    if (result != S_OK)\n      throw CSystemException(result);\n    if (ecs->Messages.Size() > 0 || ecs->NumArchiveErrors != 0)\n      return NExitCode::kFatalError;\n  }\n  else if (options.Command.IsFromUpdateGroup())\n  {\n    bool passwordIsDefined =\n        options.PasswordEnabled && !options.Password.IsEmpty();\n\n    CUpdateCallbackGUI callback;\n    // callback.EnablePercents = options.EnablePercents;\n    callback.PasswordIsDefined = passwordIsDefined;\n    callback.AskPassword = options.PasswordEnabled && options.Password.IsEmpty();\n    callback.Password = options.Password;\n    // callback.StdOutMode = options.UpdateOptions.StdOutMode;\n    callback.Init();\n\n    CUpdateErrorInfo errorInfo;\n\n    if (!options.UpdateOptions.Init(codecs, formatIndices, options.ArchiveName))\n    {\n      ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED, 0x02000601);\n      return NExitCode::kFatalError;\n    }\n    HRESULT result = UpdateGUI(\n        codecs,\n        options.WildcardCensor, options.UpdateOptions,\n        options.ShowDialog,\n        errorInfo, &callback);\n\n    if (result != S_OK)\n    {\n      if (!errorInfo.Message.IsEmpty())\n      {\n        ErrorMessage(errorInfo.Message);\n        if (result == E_FAIL)\n          return NExitCode::kFatalError;\n      }\n      throw CSystemException(result);\n    }\n    if (callback.FailedFiles.Size() > 0)\n      return NExitCode::kWarning;\n  }\n  else\n  {\n    throw \"Unsupported command\";\n  }\n  return 0;\n}\n\n#ifdef _WIN32\nstatic bool inline IsItWindowsNT()\n{\n  OSVERSIONINFO versionInfo;\n  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);\n  if (!::GetVersionEx(&versionInfo))\n    return false;\n  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);\n}\n\nint APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */)\n{\n  g_hInstance = hInstance;\n  #ifdef _UNICODE\n  if (!IsItWindowsNT())\n  {\n    ErrorMessage(L\"This program requires Windows NT/2000/2003/2008/XP/Vista\");\n    return NExitCode::kFatalError;\n  }\n  #else\n  g_IsNT = IsItWindowsNT();\n  #endif\n\n  #ifdef _WIN32\n  SetLargePageSize();\n  #endif\n\n  InitCommonControls();\n\n  ReloadLang();\n\n\n  // setlocale(LC_COLLATE, \".ACP\");\n  try\n  {\n    return Main2();\n  }\n#else\nint Main1(int argc,TCHAR **argv)\n{\n  ReloadLangSmart(); // ReloadLang();\n\n  // setlocale(LC_COLLATE, \".ACP\");\n  try\n  {\n    return Main2(argc,argv);\n  }\n#endif\n  catch(const CNewException &)\n  {\n    return ShowMemErrorMessage();\n  }\n  catch(const CArchiveCommandLineException &e)\n  {\n    ErrorMessage(GetUnicodeString(e));\n    return NExitCode::kUserError;\n  }\n  catch(const CSystemException &systemError)\n  {\n    if (systemError.ErrorCode == E_ABORT)\n      return NExitCode::kUserBreak;\n    return ShowSysErrorMessage(systemError.ErrorCode);\n  }\n  catch(const UString &s)\n  {\n    ErrorMessage(s);\n    return NExitCode::kFatalError;\n  }\n  catch(const AString &s)\n  {\n    ErrorMessage(GetUnicodeString(s));\n    return NExitCode::kFatalError;\n  }\n  catch(const wchar_t *s)\n  {\n    ErrorMessage(s);\n    return NExitCode::kFatalError;\n  }\n  catch(const char *s)\n  {\n    ErrorMessage(GetUnicodeString(s));\n    return NExitCode::kFatalError;\n  }\n  catch(...)\n  {\n    ErrorLangMessage(IDS_UNKNOWN_ERROR, 0x0200060C);\n    return NExitCode::kFatalError;\n  }\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/UpdateCallbackGUI.cpp",
    "content": "// UpdateCallbackGUI.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Common/Defs.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/StringConvert.h\"\n\n#include \"Windows/Error.h\"\n#include \"Windows/PropVariant.h\"\n\n#include \"../FileManager/MessagesDialog.h\"\n#include \"../FileManager/PasswordDialog.h\"\n\n#include \"UpdateCallbackGUI.h\"\n\nusing namespace NWindows;\n\nCUpdateCallbackGUI::~CUpdateCallbackGUI()\n{\n  if (!Messages.IsEmpty())\n  {\n    CMessagesDialog messagesDialog;\n    messagesDialog.Messages = &Messages;\n    messagesDialog.Create(ParentWindow);\n  }\n}\n\nvoid CUpdateCallbackGUI::Init()\n{\n  FailedFiles.Clear();\n  Messages.Clear();\n  NumArchiveErrors = 0;\n  NumFiles = 0;\n}\n\nvoid CUpdateCallbackGUI::AddErrorMessage(LPCWSTR message)\n{\n  Messages.Add(message);\n}\n\nvoid CUpdateCallbackGUI::AddErrorMessage(const wchar_t *name, DWORD systemError)\n{\n  AddErrorMessage(\n      UString(L\"WARNING: \") +\n      NError::MyFormatMessageW(systemError) +\n      UString(L\": \") +\n      UString(name));\n}\n\nHRESULT CUpdateCallbackGUI::OpenResult(const wchar_t *name, HRESULT result)\n{\n  if (result != S_OK)\n  {\n    AddErrorMessage (UString(L\"Error: \") + name +\n        UString(L\" is not supported archive\"));\n  }\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::StartScanning()\n{\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::CanNotFindError(const wchar_t *name, DWORD systemError)\n{\n  FailedFiles.Add(name);\n  AddErrorMessage(name, systemError);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::FinishScanning()\n{\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::StartArchive(const wchar_t *name, bool /* updating */)\n{\n  ProgressDialog.ProgressSynch.SetTitleFileName(name);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::FinishArchive()\n{\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::CheckBreak()\n{\n  return ProgressDialog.ProgressSynch.ProcessStopAndPause();\n}\n\nHRESULT CUpdateCallbackGUI::ScanProgress(UInt64 /* numFolders */, UInt64 numFiles, const wchar_t *path)\n{\n  ProgressDialog.ProgressSynch.SetCurrentFileName(path);\n  ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles);\n  return ProgressDialog.ProgressSynch.ProcessStopAndPause();\n}\n\nHRESULT CUpdateCallbackGUI::Finilize()\n{\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::SetNumFiles(UInt64 numFiles)\n{\n  ProgressDialog.ProgressSynch.SetNumFilesTotal(numFiles);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::SetTotal(UInt64 total)\n{\n  ProgressDialog.ProgressSynch.SetProgress(total, 0);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::SetCompleted(const UInt64 *completeValue)\n{\n  RINOK(CheckBreak());\n  if (completeValue != NULL)\n    ProgressDialog.ProgressSynch.SetPos(*completeValue);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)\n{\n  RINOK(CheckBreak());\n  ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::GetStream(const wchar_t *name, bool /* isAnti */)\n{\n  ProgressDialog.ProgressSynch.SetCurrentFileName(name);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::OpenFileError(const wchar_t *name, DWORD systemError)\n{\n  FailedFiles.Add(name);\n  // if (systemError == ERROR_SHARING_VIOLATION)\n  {\n    AddErrorMessage(name, systemError);\n    return S_FALSE;\n  }\n  // return systemError;\n}\n\nHRESULT CUpdateCallbackGUI::SetOperationResult(Int32 /* operationResult */)\n{\n  NumFiles++;\n  ProgressDialog.ProgressSynch.SetNumFilesCur(NumFiles);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)\n{\n  if (!PasswordIsDefined)\n  {\n    if (AskPassword)\n    {\n      CPasswordDialog dialog;\n      if (dialog.Create(ProgressDialog) == IDCANCEL)\n        return E_ABORT;\n      Password = dialog.Password;\n      PasswordIsDefined = true;\n    }\n  }\n  *passwordIsDefined = BoolToInt(PasswordIsDefined);\n  return StringToBstr(Password, password);\n}\n\n/*\nIt doesn't work, since main stream waits Dialog\nHRESULT CUpdateCallbackGUI::CloseProgress()\n{\n  ProgressDialog.MyClose();\n  return S_OK;\n};\n*/\n\n\nHRESULT CUpdateCallbackGUI::Open_CheckBreak()\n{\n  return ProgressDialog.ProgressSynch.ProcessStopAndPause();\n}\n\nHRESULT CUpdateCallbackGUI::Open_SetTotal(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */)\n{\n  // if (numFiles != NULL) ProgressDialog.ProgressSynch.SetNumFilesTotal(*numFiles);\n  return S_OK;\n}\n\nHRESULT CUpdateCallbackGUI::Open_SetCompleted(const UInt64 * /* numFiles */, const UInt64 * /* numBytes */)\n{\n  return ProgressDialog.ProgressSynch.ProcessStopAndPause();\n}\n\n#ifndef _NO_CRYPTO\n\nHRESULT CUpdateCallbackGUI::Open_CryptoGetTextPassword(BSTR *password)\n{\n  PasswordWasAsked = true;\n  if (!PasswordIsDefined)\n  {\n    CPasswordDialog dialog;\n    if (dialog.Create(ProgressDialog) == IDCANCEL)\n      return E_ABORT;\n    Password = dialog.Password;\n    PasswordIsDefined = true;\n  }\n  return StringToBstr(Password, password);\n}\n\nHRESULT CUpdateCallbackGUI::Open_GetPasswordIfAny(UString &password)\n{\n  if (PasswordIsDefined)\n    password = Password;\n  return S_OK;\n}\n\nbool CUpdateCallbackGUI::Open_WasPasswordAsked()\n{\n  return PasswordWasAsked;\n}\n\nvoid CUpdateCallbackGUI::Open_ClearPasswordWasAskedFlag()\n{\n  PasswordWasAsked = false;\n}\n\n/*\nHRESULT CUpdateCallbackGUI::ShowDeleteFile(const wchar_t *name)\n{\n  ProgressDialog.ProgressSynch.SetCurrentFileName(name);\n  return S_OK;\n}\n*/\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/UpdateCallbackGUI.h",
    "content": "// UpdateCallbackGUI.h\n\n#ifndef __UPDATE_CALLBACK_GUI_H\n#define __UPDATE_CALLBACK_GUI_H\n\n#include \"../Common/Update.h\"\n#include \"../Common/ArchiveOpenCallback.h\"\n#include \"../FileManager/ProgressDialog2.h\"\n\nclass CUpdateCallbackGUI:\n  public IOpenCallbackUI,\n  public IUpdateCallbackUI2\n{\npublic:\n  // bool StdOutMode;\n  bool PasswordIsDefined;\n  UString Password;\n  bool AskPassword;\n  bool PasswordWasAsked;\n  UInt64 NumFiles;\n\n  CUpdateCallbackGUI():\n      PasswordIsDefined(false),\n      PasswordWasAsked(false),\n      AskPassword(false),\n      // StdOutMode(false)\n      ParentWindow(0)\n      {}\n  \n  ~CUpdateCallbackGUI();\n  void Init();\n\n  INTERFACE_IUpdateCallbackUI2(;)\n  INTERFACE_IOpenCallbackUI(;)\n\n  // HRESULT CloseProgress();\n\n  UStringVector FailedFiles;\n\n  CProgressDialog ProgressDialog;\n  HWND ParentWindow;\n  void StartProgressDialog(const UString &title)\n  {\n    ProgressDialog.Create(title, ParentWindow);\n  }\n\n  UStringVector Messages;\n  int NumArchiveErrors;\n  void AddErrorMessage(LPCWSTR message);\n  void AddErrorMessage(const wchar_t *name, DWORD systemError);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/UpdateGUI.cpp",
    "content": "// UpdateGUI.cpp\n\n#include \"StdAfx.h\"\n\n#include \"UpdateGUI.h\"\n\n#include \"resource.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n#include \"Common/StringToInt.h\"\n\n#include \"Windows/FileDir.h\"\n#include \"Windows/Error.h\"\n#include \"Windows/FileFind.h\"\n#include \"Windows/Thread.h\"\n\n#include \"../FileManager/FormatUtils.h\"\n#include \"../FileManager/ExtractCallback.h\"\n#include \"../FileManager/StringUtils.h\"\n\n#include \"../Common/ArchiveExtractCallback.h\"\n#include \"../Common/WorkDir.h\"\n#include \"../Explorer/MyMessages.h\"\n#include \"ExtractRes.h\"\n\n#include \"CompressDialog.h\"\n#include \"UpdateGUI.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\n\n// static const wchar_t *kIncorrectOutDir = L\"Incorrect output directory path\";\nstatic const wchar_t *kDefaultSfxModule = L\"7z.sfx\";\nstatic const wchar_t *kSFXExtension = L\"exe\";\n\nstruct CThreadUpdating\n{\n  CCodecs *codecs;\n\n  CUpdateCallbackGUI *UpdateCallbackGUI;\n  const NWildcard::CCensor *WildcardCensor;\n  CUpdateOptions *Options;\n\n  CUpdateErrorInfo *ErrorInfo;\n  HRESULT Result;\n  \n  DWORD Process()\n  {\n    UpdateCallbackGUI->ProgressDialog.WaitCreating();\n    try\n    {\n      Result = UpdateArchive(codecs, *WildcardCensor, *Options,\n        *ErrorInfo, UpdateCallbackGUI, UpdateCallbackGUI);\n    }\n    catch(const UString &s)\n    {\n      ErrorInfo->Message = s;\n      Result = E_FAIL;\n    }\n    catch(const wchar_t *s)\n    {\n      ErrorInfo->Message = s;\n      Result = E_FAIL;\n    }\n    catch(const char *s)\n    {\n      ErrorInfo->Message = GetUnicodeString(s);\n      Result = E_FAIL;\n    }\n    catch(...)\n    {\n      Result = E_FAIL;\n    }\n    UpdateCallbackGUI->ProgressDialog.MyClose();\n    return 0;\n  }\n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    return ((CThreadUpdating *)param)->Process();\n  }\n};\n\nstatic void AddProp(CObjectVector<CProperty> &properties, const UString &name, const UString &value)\n{\n  CProperty prop;\n  prop.Name = name;\n  prop.Value = value;\n  properties.Add(prop);\n}\n\nstatic void AddProp(CObjectVector<CProperty> &properties, const UString &name, UInt32 value)\n{\n  wchar_t tmp[32];\n  ConvertUInt64ToString(value, tmp);\n  AddProp(properties, name, tmp);\n}\n\nstatic void AddProp(CObjectVector<CProperty> &properties, const UString &name, bool value)\n{\n  AddProp(properties, name, value ? UString(L\"on\"): UString(L\"off\"));\n}\n\nstatic bool IsThereMethodOverride(bool is7z, const UString &propertiesString)\n{\n  UStringVector strings;\n  SplitString(propertiesString, strings);\n  for (int i = 0; i < strings.Size(); i++)\n  {\n    const UString &s = strings[i];\n    if (is7z)\n    {\n      const wchar_t *end;\n      UInt64 n = ConvertStringToUInt64(s, &end);\n      if (n == 0 && *end == L'=')\n        return true;\n    }\n    else\n    {\n      if (s.Length() > 0)\n        if (s[0] == L'm' && s[1] == L'=')\n          return true;\n    }\n  }\n  return false;\n}\n\nstatic void ParseAndAddPropertires(CObjectVector<CProperty> &properties,\n    const UString &propertiesString)\n{\n  UStringVector strings;\n  SplitString(propertiesString, strings);\n  for (int i = 0; i < strings.Size(); i++)\n  {\n    const UString &s = strings[i];\n    CProperty property;\n    int index = s.Find(L'=');\n    if (index < 0)\n      property.Name = s;\n    else\n    {\n      property.Name = s.Left(index);\n      property.Value = s.Mid(index + 1);\n    }\n    properties.Add(property);\n  }\n}\n\nstatic UString GetNumInBytesString(UInt64 v)\n{\n  wchar_t s[32];\n  ConvertUInt64ToString(v, s);\n  size_t len = wcslen(s);\n  s[len++] = L'B';\n  s[len] = L'\\0';\n  return s;\n}\n\nstatic void SetOutProperties(\n    CObjectVector<CProperty> &properties,\n    bool is7z,\n    UInt32 level,\n    bool setMethod,\n    const UString &method,\n    UInt32 dictionary,\n    bool orderMode,\n    UInt32 order,\n    bool solidIsSpecified, UInt64 solidBlockSize,\n    bool multiThreadIsAllowed, UInt32 numThreads,\n    const UString &encryptionMethod,\n    bool encryptHeadersIsAllowed, bool encryptHeaders,\n    bool /* sfxMode */)\n{\n  if (level != (UInt32)(Int32)-1)\n    AddProp(properties, L\"x\", (UInt32)level);\n  if (setMethod)\n  {\n    if (!method.IsEmpty())\n      AddProp(properties, is7z ? L\"0\": L\"m\", method);\n    if (dictionary != (UInt32)(Int32)-1)\n    {\n      UString name;\n      if (is7z)\n        name = L\"0\";\n      if (orderMode)\n        name += L\"mem\";\n      else\n        name += L\"d\";\n      AddProp(properties, name, GetNumInBytesString(dictionary));\n    }\n    if (order != (UInt32)(Int32)-1)\n    {\n      UString name;\n      if (is7z)\n        name = L\"0\";\n      if (orderMode)\n        name += L\"o\";\n      else\n        name += L\"fb\";\n      AddProp(properties, name, (UInt32)order);\n    }\n  }\n    \n  if (!encryptionMethod.IsEmpty())\n    AddProp(properties, L\"em\", encryptionMethod);\n\n  if (encryptHeadersIsAllowed)\n    AddProp(properties, L\"he\", encryptHeaders);\n  if (solidIsSpecified)\n    AddProp(properties, L\"s\", GetNumInBytesString(solidBlockSize));\n  if (multiThreadIsAllowed)\n    AddProp(properties, L\"mt\", numThreads);\n}\n\nstatic HRESULT ShowDialog(\n    CCodecs *codecs,\n    const NWildcard::CCensor &censor,\n    CUpdateOptions &options, CUpdateCallbackGUI *callback)\n{\n  if (options.Commands.Size() != 1)\n    throw \"It must be one command\";\n  UString currentDirPrefix;\n  {\n    if (!NDirectory::MyGetCurrentDirectory(currentDirPrefix))\n      return E_FAIL;\n    NName::NormalizeDirPathPrefix(currentDirPrefix);\n  }\n\n  bool oneFile = false;\n  NFind::CFileInfoW fileInfo;\n  if (censor.Pairs.Size() > 0)\n  {\n    const NWildcard::CPair &pair = censor.Pairs[0];\n    if (pair.Head.IncludeItems.Size() > 0)\n    {\n      const NWildcard::CItem &item = pair.Head.IncludeItems[0];\n      if (item.ForFile)\n      {\n        UString name = pair.Prefix;\n        for (int i = 0; i < item.PathParts.Size(); i++)\n        {\n          if (i > 0)\n            name += WCHAR_PATH_SEPARATOR;\n          name += item.PathParts[i];\n        }\n        if (NFind::FindFile(name, fileInfo))\n        {\n          if (censor.Pairs.Size() == 1 && pair.Head.IncludeItems.Size() == 1)\n            oneFile = !fileInfo.IsDir();\n        }\n      }\n    }\n  }\n    \n  CCompressDialog dialog;\n  NCompressDialog::CInfo &di = dialog.Info;\n  for(int i = 0; i < codecs->Formats.Size(); i++)\n  {\n    const CArcInfoEx &ai = codecs->Formats[i];\n    if (ai.UpdateEnabled && (oneFile || !ai.KeepName))\n      dialog.m_ArchiverInfoList.Add(ai);\n  }\n  if(dialog.m_ArchiverInfoList.Size() == 0)\n  {\n    ShowErrorMessage(L\"No Update Engines\");\n    return E_FAIL;\n  }\n\n  // di.ArchiveName = options.ArchivePath.GetFinalPath();\n  di.ArchiveName = options.ArchivePath.GetPathWithoutExt();\n  dialog.OriginalFileName = fileInfo.Name;\n    \n  di.CurrentDirPrefix = currentDirPrefix;\n  di.SFXMode = options.SfxMode;\n  di.OpenShareForWrite = options.OpenShareForWrite;\n  \n  if (callback->PasswordIsDefined)\n    di.Password = callback->Password;\n    \n  di.KeepName = !oneFile;\n    \n  if(dialog.Create(0) != IDOK)\n    return E_ABORT;\n    \n  options.VolumesSizes = di.VolumeSizes;\n  /*\n  if (di.VolumeSizeIsDefined)\n  {\n    MyMessageBox(L\"Splitting to volumes is not supported\");\n    return E_FAIL;\n  }\n  */\n  \n  NUpdateArchive::CActionSet &actionSet = options.Commands.Front().ActionSet;\n  \n  switch(di.UpdateMode)\n  {\n    case NCompressDialog::NUpdateMode::kAdd:\n      actionSet = NUpdateArchive::kAddActionSet;\n      break;\n    case NCompressDialog::NUpdateMode::kUpdate:\n      actionSet = NUpdateArchive::kUpdateActionSet;\n      break;\n    case NCompressDialog::NUpdateMode::kFresh:\n      actionSet = NUpdateArchive::kFreshActionSet;\n      break;\n    case NCompressDialog::NUpdateMode::kSynchronize:\n      actionSet = NUpdateArchive::kSynchronizeActionSet;\n      break;\n    default:\n      throw 1091756;\n  }\n  const CArcInfoEx &archiverInfo = dialog.m_ArchiverInfoList[di.ArchiverInfoIndex];\n  callback->PasswordIsDefined = (!di.Password.IsEmpty());\n  if (callback->PasswordIsDefined)\n    callback->Password = di.Password;\n\n  options.MethodMode.Properties.Clear();\n\n  bool is7z = archiverInfo.Name.CompareNoCase(L\"7z\") == 0;\n  bool methodOverride = IsThereMethodOverride(is7z, di.Options);\n\n  SetOutProperties(\n      options.MethodMode.Properties,\n      is7z,\n      di.Level,\n      !methodOverride,\n      di.Method,\n      di.Dictionary,\n      di.OrderMode, di.Order,\n      di.SolidIsSpecified, di.SolidBlockSize,\n      di.MultiThreadIsAllowed, di.NumThreads,\n      di.EncryptionMethod,\n      di.EncryptHeadersIsAllowed, di.EncryptHeaders,\n      di.SFXMode);\n  \n  options.OpenShareForWrite = di.OpenShareForWrite;\n  ParseAndAddPropertires(options.MethodMode.Properties, di.Options);\n\n  if (di.SFXMode)\n    options.SfxMode = true;\n  options.MethodMode.FormatIndex = archiverInfo.FormatIndex;\n\n  options.ArchivePath.VolExtension = archiverInfo.GetMainExt();\n  if(di.SFXMode)\n    options.ArchivePath.BaseExtension = kSFXExtension;\n  else\n    options.ArchivePath.BaseExtension = options.ArchivePath.VolExtension;\n  options.ArchivePath.ParseFromPath(di.ArchiveName);\n\n  NWorkDir::CInfo workDirInfo;\n  ReadWorkDirInfo(workDirInfo);\n  options.WorkingDir.Empty();\n  if (workDirInfo.Mode != NWorkDir::NMode::kCurrent)\n  {\n    UString fullPath;\n    NDirectory::MyGetFullPathName(di.ArchiveName, fullPath);\n    options.WorkingDir = GetWorkDir(workDirInfo, fullPath);\n    NFile::NDirectory::CreateComplexDirectory(options.WorkingDir);\n  }\n  return S_OK;\n}\n\nHRESULT UpdateGUI(\n    CCodecs *codecs,\n    const NWildcard::CCensor &censor,\n    CUpdateOptions &options,\n    bool showDialog,\n    CUpdateErrorInfo &errorInfo,\n    CUpdateCallbackGUI *callback)\n{\n  if (showDialog)\n  {\n    RINOK(ShowDialog(codecs, censor, options, callback));\n  }\n  if (options.SfxMode && options.SfxModule.IsEmpty())\n    options.SfxModule = kDefaultSfxModule;\n\n  CThreadUpdating tu;\n\n  tu.codecs = codecs;\n\n  tu.UpdateCallbackGUI = callback;\n  tu.UpdateCallbackGUI->Init();\n\n  tu.WildcardCensor = &censor;\n  tu.Options = &options;\n  tu.ErrorInfo = &errorInfo;\n\n  NWindows::CThread thread;\n  RINOK(thread.Create(CThreadUpdating::MyThreadFunction, &tu))\n  tu.UpdateCallbackGUI->StartProgressDialog(LangString(IDS_PROGRESS_COMPRESSING, 0x02000DC0));\n  return tu.Result;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/UpdateGUI.h",
    "content": "// GUI/UpdateGUI.h\n\n#ifndef __UPDATE_GUI_H\n#define __UPDATE_GUI_H\n\n#include \"../Common/Update.h\"\n#include \"UpdateCallbackGUI.h\"\n\n#include \"../FileManager/UpdateCallback100.h\"\n\nHRESULT UpdateGUI(\n    CCodecs *codecs,\n    const NWildcard::CCensor &censor,\n    CUpdateOptions &options,\n    bool showDialog,\n    CUpdateErrorInfo &errorInfo,\n    CUpdateCallbackGUI *callback);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/makefile",
    "content": "PROG=../../../../bin/7zG\n\nLOCAL_FLAGS=\\\n\t-DUNICODE \\\n\t-D_UNICODE \\\n\t-DLANG \\\n\t-DCOMPRESS_MT \\\n\t-DEXTERNAL_LZMA \\\n\t-DEXTERNAL_CODECS \\\n\t-DBENCH_MT \\\n\t-I. \\\n\t`wx-config --unicode=yes --cxxflags`\n\ninclude ../../../../makefile.crc32\ninclude ../../../../makefile.machine\n\nLIBS=`wx-config --unicode=yes --libs` $(LOCAL_LIBS_DLL)\n\nOBJS=\\\nCompressDialog.o \\\nCompressDialog_rc.o \\\nExtractDialog.o \\\nExtractDialog_rc.o \\\nBenchmarkDialog.o \\\nBenchmarkDialog_rc.o \\\nExtractGUI.o \\\nGUI.o \\\nwxGUI.o \\\nUpdateCallbackGUI.o \\\nUpdateGUI.o \\\nArchiveCommandLine.o \\\nArchiveExtractCallback.o \\\nArchiveOpenCallback.o \\\nDefaultName.o \\\nEnumDirItems.o \\\nExtract.o \\\nExtractingFilePath.o \\\nLoadCodecs.o \\\nOpenArchive.o \\\nPropIDUtils.o \\\nSetProperties.o \\\nSortUtils.o \\\nTempFiles.o \\\nUpdate.o \\\nUpdateAction.o \\\nUpdateCallback.o \\\nUpdatePair.o \\\nUpdateProduce.o \\\nWorkDir.o \\\nMyMessages.o \\\nZipRegistry.o \\\nFormatUtils.o \\\nProgramLocation.o \\\nProgressDialog2.o \\\nProgressDialog2_rc.o \\\nMessagesDialog.o \\\nMessagesDialog_rc.o \\\nOverwriteDialog.o \\\nOverwriteDialog_rc.o \\\nPasswordDialog.o \\\nPasswordDialog_rc.o \\\nExtractCallback.o \\\nSplitUtils.o \\\nStringUtils.o \\\nLangUtils.o \\\nFilePathAutoRename.o \\\nFileStreams.o \\\nProgressUtils.o \\\nStreamUtils.o \\\nCopyCoder.o \\\nLzmaBench.o \\\nCommandLineParser.o \\\nCRC.o \\\nIntToString.o \\\nLang.o \\\nListFileUtils.o \\\nMyString.o \\\nMyVector.o \\\nStringConvert.o \\\nStringToInt.o \\\nTextConfig.o \\\nUTFConvert.o \\\nWildcard.o \\\nDLL.o \\\nError.o \\\nFileDir.o \\\nFileFind.o \\\nFileIO.o \\\nFileName.o \\\nPropVariant.o \\\nPropVariantConversions.o \\\nRegistry.o \\\nSynchronization.o \\\nTime.o \\\nSystem.o \\\nWindow.o \\\nDialog.o \\\nControls.o \\\nMyWindows.o \\\nwine_date_and_time.o \\\nwine_GetXXXDefaultLangID.o \\\nThreads.o \\\n$(OBJ_CRC32)\n\ninclude ../../../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/makefile.depend",
    "content": "CompressDialog.o: CompressDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  resource.h ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/CommonDialog.h \\\n  ../../../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/ResourceString.h ../../../Windows/System.h \\\n  ../../../Windows/../Common/Types.h ../FileManager/HelpUtils.h \\\n  ../../../Common/MyString.h ../FileManager/SplitUtils.h \\\n  ../../../Common/Types.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../FileManager/FormatUtils.h ../Explorer/MyMessages.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../Common/ZipRegistry.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/ExtractMode.h CompressDialog.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyWindows.h \\\n  ../Common/../../../Common/MyString.h ../Common/../../../Common/Buffer.h \\\n  ../Common/../../../Common/Defs.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h ../Common/../../Archive/../PropID.h \\\n  CompressDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../FileManager/LangUtils.h ../../../Common/Lang.h \\\n  ../../../Windows/ResourceString.h\nCompressDialog_rc.o: CompressDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h resource.h \\\n  ../../../Windows/Control/DialogImpl.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/Dialog.h CompressDialogRes.h\nExtractDialog.o: ExtractDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ExtractDialog.h ExtractDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Edit.h \\\n  ../../../Windows/Defs.h ../../../Windows/Control/ComboBox.h \\\n  ../Common/ZipRegistry.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/ExtractMode.h ../Common/ExtractMode.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Windows/Shell.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h \\\n  ../../../Windows/ResourceString.h ../FileManager/HelpUtils.h \\\n  ../../../Common/MyString.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h ../../../Windows/ResourceString.h ExtractRes.h\nExtractDialog_rc.o: ExtractDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h ExtractRes.h \\\n  ExtractDialogRes.h\nBenchmarkDialog.o: BenchmarkDialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/IntToString.h ../../../Common/StringToInt.h \\\n  ../../../Common/MyException.h ../../../Common/MyWindows.h \\\n  ../../../Windows/Thread.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/System.h ../../../Windows/../Common/Types.h \\\n  ../FileManager/HelpUtils.h ../../../Common/MyString.h BenchmarkDialog.h \\\n  BenchmarkDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Synchronization2.h \\\n  ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/LoadCodecs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Buffer.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Defs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../ICoder.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/DLL.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/IArchive.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IProgress.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../PropID.h \\\n  ../Common/LoadCodecs.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h\nBenchmarkDialog_rc.o: BenchmarkDialog_rc.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  BenchmarkDialogRes.h\nExtractGUI.o: ExtractGUI.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ExtractGUI.h ../Common/Extract.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../IProgress.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/ExtractMode.h \\\n  ../Common/ArchiveOpenCallback.h ../Common/Property.h \\\n  ../Common/../Common/LoadCodecs.h \\\n  ../Common/../Common/../../../Common/Types.h \\\n  ../Common/../Common/../../../Common/MyCom.h \\\n  ../Common/../Common/../../../Common/MyString.h \\\n  ../Common/../Common/../../../Common/Buffer.h \\\n  ../Common/../Common/../../../Common/Defs.h \\\n  ../Common/../Common/../../ICoder.h \\\n  ../Common/../Common/../../../Windows/DLL.h \\\n  ../Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../Common/../../Archive/IArchive.h \\\n  ../FileManager/ExtractCallback.h \\\n  ../FileManager/../Agent/IFolderArchive.h \\\n  ../FileManager/../Agent/../../Archive/IArchive.h \\\n  ../FileManager/../Agent/../../UI/FileManager/IFolder.h \\\n  ../FileManager/../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../FileManager/../Agent/../Common/IFileExtractCallback.h \\\n  ../FileManager/../Agent/../Common/ExtractMode.h \\\n  ../FileManager/../Agent/../../UI/Common/LoadCodecs.h \\\n  ../FileManager/../Agent/../../IDecl.h \\\n  ../FileManager/../Common/ArchiveOpenCallback.h \\\n  ../FileManager/ProgressDialog2.h ../FileManager/ProgressDialog2Res.h \\\n  ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/ResourceString.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h ../FileManager/../../IPassword.h \\\n  ../../../Common/MyCom.h ../FileManager/IFolder.h \\\n  ../../../Common/StringConvert.h ../../../Common/IntToString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Error.h \\\n  ../../../Windows/FileFind.h ../../../Windows/Thread.h \\\n  ../FileManager/FormatUtils.h ../FileManager/LangUtils.h \\\n  ../Common/ArchiveExtractCallback.h ../Explorer/MyMessages.h \\\n  ../../../Common/Types.h resource.h ExtractRes.h ExtractDialog.h \\\n  ExtractDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h \\\n  ../Common/ZipRegistry.h ../../../Common/Types.h ../Common/ExtractMode.h\nGUI.o: GUI.cpp ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../myWindows/initguid.h \\\n  ../../../Common/MyInitGuid.h ../../../../C/Alloc.h \\\n  ../../../Common/NewHandler.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/CommandLineParser.h ../../../Common/MyException.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../FileManager/StringUtils.h ../../../Common/MyString.h \\\n  ../Common/ExitCode.h ../Common/ArchiveCommandLine.h \\\n  ../../../Common/Wildcard.h ../../../Common/CommandLineParser.h \\\n  ../Common/Extract.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../IProgress.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/ExtractMode.h \\\n  ../Common/ArchiveOpenCallback.h ../Common/Property.h \\\n  ../Common/../Common/LoadCodecs.h \\\n  ../Common/../Common/../../../Common/Types.h \\\n  ../Common/../Common/../../../Common/MyCom.h \\\n  ../Common/../Common/../../../Common/MyString.h \\\n  ../Common/../Common/../../../Common/Buffer.h \\\n  ../Common/../Common/../../../Common/Defs.h \\\n  ../Common/../Common/../../ICoder.h \\\n  ../Common/../Common/../../../Windows/DLL.h \\\n  ../Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../Common/../../Archive/IArchive.h ../Common/Update.h \\\n  ../Common/UpdateAction.h ../Common/UpdateCallback.h \\\n  ../Common/../../ICoder.h ../Common/../Common/UpdatePair.h \\\n  ../Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../Common/LoadCodecs.h ExtractRes.h \\\n  ExtractGUI.h ../Common/Extract.h ../FileManager/ExtractCallback.h \\\n  ../FileManager/../Agent/IFolderArchive.h \\\n  ../FileManager/../Agent/../../Archive/IArchive.h \\\n  ../FileManager/../Agent/../../UI/FileManager/IFolder.h \\\n  ../FileManager/../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../FileManager/../Agent/../Common/IFileExtractCallback.h \\\n  ../FileManager/../Agent/../Common/ExtractMode.h \\\n  ../FileManager/../Agent/../../UI/Common/LoadCodecs.h \\\n  ../FileManager/../Agent/../../IDecl.h \\\n  ../FileManager/../Common/ArchiveOpenCallback.h \\\n  ../FileManager/ProgressDialog2.h ../FileManager/ProgressDialog2Res.h \\\n  ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Windows/ResourceString.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h ../FileManager/../../IPassword.h \\\n  ../../../Common/MyCom.h ../FileManager/IFolder.h UpdateGUI.h \\\n  ../Common/Update.h UpdateCallbackGUI.h ../Common/ArchiveOpenCallback.h \\\n  ../FileManager/ProgressDialog2.h ../FileManager/UpdateCallback100.h \\\n  BenchmarkDialog.h BenchmarkDialogRes.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Control/ComboBox.h \\\n  ../../../Windows/Synchronization.h \\\n  ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/LoadCodecs.h \\\n  ../Common/LoadCodecs.h\nwxGUI.o: wxGUI.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../../GUI/p7zip_32.xpm \\\n  ../../../Windows/Registry.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Types.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ExtractRes.h ../Explorer/MyMessages.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ExtractGUI.h ../Common/Extract.h \\\n  ../../../Common/Wildcard.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../IProgress.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/ExtractMode.h \\\n  ../Common/ArchiveOpenCallback.h ../Common/Property.h \\\n  ../Common/../Common/LoadCodecs.h \\\n  ../Common/../Common/../../../Common/Types.h \\\n  ../Common/../Common/../../../Common/MyCom.h \\\n  ../Common/../Common/../../../Common/MyString.h \\\n  ../Common/../Common/../../../Common/Buffer.h \\\n  ../Common/../Common/../../ICoder.h \\\n  ../Common/../Common/../../../Windows/DLL.h \\\n  ../Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../Common/../../Archive/IArchive.h \\\n  ../FileManager/ExtractCallback.h \\\n  ../FileManager/../Agent/IFolderArchive.h \\\n  ../FileManager/../Agent/../../Archive/IArchive.h \\\n  ../FileManager/../Agent/../../UI/FileManager/IFolder.h \\\n  ../FileManager/../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../FileManager/../Agent/../Common/IFileExtractCallback.h \\\n  ../FileManager/../Agent/../Common/ExtractMode.h \\\n  ../FileManager/../Agent/../../UI/Common/LoadCodecs.h \\\n  ../FileManager/../Agent/../../IDecl.h \\\n  ../FileManager/../Common/ArchiveOpenCallback.h \\\n  ../FileManager/ProgressDialog2.h ../FileManager/ProgressDialog2Res.h \\\n  ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/ResourceString.h \\\n  ../FileManager/LangUtils.h ../../../Common/Lang.h \\\n  ../FileManager/../../IPassword.h ../../../Common/MyCom.h \\\n  ../FileManager/IFolder.h UpdateGUI.h ../Common/Update.h \\\n  ../Common/UpdateAction.h ../Common/UpdateCallback.h \\\n  ../Common/../../ICoder.h ../Common/../Common/UpdatePair.h \\\n  ../Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../Common/LoadCodecs.h \\\n  UpdateCallbackGUI.h ../Common/ArchiveOpenCallback.h \\\n  ../FileManager/ProgressDialog2.h ../FileManager/UpdateCallback100.h \\\n  BenchmarkDialog.h BenchmarkDialogRes.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Control/ComboBox.h \\\n  ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/LoadCodecs.h \\\n  ../Common/LoadCodecs.h ../FileManager/RegistryUtils.h \\\n  ../../../Common/StringConvert.h ../FileManager/ProgramLocation.h \\\n  ../../../myWindows/myPrivate.h resource.h\nUpdateCallbackGUI.o: UpdateCallbackGUI.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../FileManager/MessagesDialog.h \\\n  ../FileManager/MessagesDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/ListView.h ../../../Windows/Defs.h \\\n  ../FileManager/PasswordDialog.h ../../../Windows/Control/Edit.h \\\n  ../FileManager/PasswordDialogRes.h UpdateCallbackGUI.h \\\n  ../Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/UpdateAction.h \\\n  ../Common/ArchiveOpenCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyCom.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/UpdateCallback.h \\\n  ../Common/../../ICoder.h ../Common/../../IStream.h \\\n  ../Common/../Common/UpdatePair.h ../Common/../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../Common/../Common/../../Archive/IArchive.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../Common/Property.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyString.h \\\n  ../Common/../../../Common/Buffer.h ../Common/../../../Common/Defs.h \\\n  ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/ArchiveOpenCallback.h ../FileManager/ProgressDialog2.h \\\n  ../FileManager/ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nUpdateGUI.o: UpdateGUI.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  UpdateGUI.h ../Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/UpdateAction.h \\\n  ../Common/ArchiveOpenCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../Common/../../IPassword.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../Common/UpdateCallback.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../Common/UpdatePair.h \\\n  ../Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/../Common/../../Archive/IArchive.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../Common/Property.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyString.h \\\n  ../Common/../../../Common/Buffer.h ../Common/../../../Common/Defs.h \\\n  ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h UpdateCallbackGUI.h \\\n  ../Common/ArchiveOpenCallback.h ../FileManager/ProgressDialog2.h \\\n  ../FileManager/ProgressDialog2Res.h ../../../Common/Types.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Control/ProgressBar.h ../../../Windows/Defs.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../FileManager/UpdateCallback100.h ../../../Common/MyCom.h \\\n  ../../../Common/MyString.h ../FileManager/../Agent/IFolderArchive.h \\\n  ../FileManager/../Agent/../../Archive/IArchive.h \\\n  ../FileManager/../Agent/../../UI/FileManager/IFolder.h \\\n  ../FileManager/../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../FileManager/../Agent/../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h \\\n  ../FileManager/../Agent/../Common/../../IDecl.h \\\n  ../FileManager/../Agent/../Common/ExtractMode.h \\\n  ../FileManager/../Agent/../../UI/Common/LoadCodecs.h \\\n  ../FileManager/../Agent/../../IDecl.h ../FileManager/ProgressDialog2.h \\\n  ../FileManager/../../IPassword.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h ../../../Windows/ResourceString.h resource.h \\\n  ../../../Common/StringConvert.h ../../../Common/IntToString.h \\\n  ../../../Common/StringToInt.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Error.h ../../../Windows/FileFind.h \\\n  ../../../Windows/Thread.h ../FileManager/FormatUtils.h \\\n  ../FileManager/ExtractCallback.h \\\n  ../FileManager/../Common/ArchiveOpenCallback.h ../FileManager/IFolder.h \\\n  ../FileManager/StringUtils.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/IFileExtractCallback.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h \\\n  ../Common/../../Common/../IProgress.h ../Common/ExtractMode.h \\\n  ../Common/WorkDir.h ../Common/ZipRegistry.h ../../../Common/Types.h \\\n  ../Explorer/MyMessages.h ../../../Common/Types.h ExtractRes.h \\\n  CompressDialog.h ../Common/ZipRegistry.h ../Common/LoadCodecs.h \\\n  CompressDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ComboBox.h\nArchiveCommandLine.o: ../Common/ArchiveCommandLine.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/ListFileUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringToInt.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h \\\n  ../Common/ArchiveCommandLine.h ../../../Common/Wildcard.h \\\n  ../../../Common/CommandLineParser.h ../Common/Extract.h \\\n  ../../../Windows/FileFind.h ../../../Windows/FileName.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../IProgress.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/ExtractMode.h \\\n  ../Common/ArchiveOpenCallback.h ../Common/Property.h \\\n  ../Common/../Common/LoadCodecs.h \\\n  ../Common/../Common/../../../Common/Types.h \\\n  ../Common/../Common/../../../Common/MyCom.h \\\n  ../Common/../Common/../../../Common/MyString.h \\\n  ../Common/../Common/../../../Common/Buffer.h \\\n  ../Common/../Common/../../../Common/Defs.h \\\n  ../Common/../Common/../../ICoder.h \\\n  ../Common/../Common/../../../Windows/DLL.h \\\n  ../Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../Common/../../Archive/IArchive.h ../Common/Update.h \\\n  ../Common/UpdateAction.h ../Common/UpdateCallback.h \\\n  ../Common/../../ICoder.h ../Common/../Common/UpdatePair.h \\\n  ../Common/../Common/DirItem.h ../../../Common/Types.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../Common/LoadCodecs.h \\\n  ../Common/SortUtils.h ../Common/EnumDirItems.h ../Common/DirItem.h \\\n  ../../../myWindows/myPrivate.h\nArchiveExtractCallback.o: ../Common/ArchiveExtractCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../IProgress.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/ExtractMode.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/ComTry.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Time.h \\\n  ../../../Common/Types.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h \\\n  ../Common/../../Common/FilePathAutoRename.h \\\n  ../Common/../Common/ExtractingFilePath.h ../Common/OpenArchive.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyString.h \\\n  ../Common/../../../Common/Buffer.h ../Common/../../../Common/Defs.h \\\n  ../Common/../../ICoder.h ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/ArchiveOpenCallback.h\nArchiveOpenCallback.o: ../Common/ArchiveOpenCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/MyWindows.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/ComTry.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h\nDefaultName.o: ../Common/DefaultName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/DefaultName.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nEnumDirItems.o: ../Common/EnumDirItems.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyCom.h ../Common/EnumDirItems.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h ../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/Types.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h\nExtract.o: ../Common/Extract.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/Extract.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/ArchiveExtractCallback.h \\\n  ../Common/IFileExtractCallback.h ../../../Common/MyString.h \\\n  ../Common/../../IDecl.h ../../../Common/MyCom.h \\\n  ../../../Common/MyWindows.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/ProgressUtils.h \\\n  ../Common/../../Common/../ICoder.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../IProgress.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/ExtractMode.h \\\n  ../Common/ArchiveOpenCallback.h ../Common/Property.h \\\n  ../Common/../Common/LoadCodecs.h \\\n  ../Common/../Common/../../../Common/Types.h \\\n  ../Common/../Common/../../../Common/MyCom.h \\\n  ../Common/../Common/../../../Common/MyString.h \\\n  ../Common/../Common/../../../Common/Buffer.h \\\n  ../Common/../Common/../../../Common/Defs.h \\\n  ../Common/../Common/../../ICoder.h \\\n  ../Common/../Common/../../../Windows/DLL.h \\\n  ../Common/../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../Common/../../Archive/IArchive.h ../../../Windows/Defs.h \\\n  ../../../Windows/FileDir.h ../Common/OpenArchive.h \\\n  ../Common/LoadCodecs.h ../Common/SetProperties.h\nExtractingFilePath.o: ../Common/ExtractingFilePath.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/ExtractingFilePath.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nLoadCodecs.o: ../Common/LoadCodecs.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyWindows.h \\\n  ../Common/../../../Common/MyString.h \\\n  ../Common/../../../Common/MyVector.h ../Common/../../../Common/Defs.h \\\n  ../Common/../../../Common/Buffer.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h ../Common/../../Archive/../PropID.h \\\n  ../Common/../../../Windows/PropVariant.h \\\n  ../Common/../../../Windows/../Common/MyWindows.h \\\n  ../Common/../../../Windows/../Common/Types.h \\\n  ../Common/../../Common/RegisterArc.h \\\n  ../Common/../../Common/../Archive/IArchive.h \\\n  ../Common/../../../Windows/FileFind.h \\\n  ../Common/../../../Windows/FileName.h ../Common/../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nOpenArchive.o: ../Common/OpenArchive.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/OpenArchive.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/LoadCodecs.h \\\n  ../Common/../../../Common/Types.h ../Common/../../../Common/MyCom.h \\\n  ../Common/../../../Common/MyWindows.h \\\n  ../Common/../../../Common/MyString.h ../Common/../../../Common/Buffer.h \\\n  ../Common/../../../Common/Defs.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../Common/ArchiveOpenCallback.h ../../../Common/MyCom.h \\\n  ../Common/../../IPassword.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/FileDir.h \\\n  ../../../Windows/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Common/StreamUtils.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../Common/DefaultName.h\nPropIDUtils.o: ../Common/PropIDUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/PropIDUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../Common/../../PropID.h\nSetProperties.o: ../Common/SetProperties.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/SetProperties.h ../Common/Property.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Common/StringToInt.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h\nSortUtils.o: ../Common/SortUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/SortUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nTempFiles.o: ../Common/TempFiles.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/TempFiles.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileIO.h \\\n  ../../../Common/MyString.h\nUpdate.o: ../Common/Update.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/Update.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../../../Windows/Defs.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/UpdateAction.h \\\n  ../Common/ArchiveOpenCallback.h ../../../Common/MyString.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../Common/../../IPassword.h ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/Types.h ../Common/../../IDecl.h \\\n  ../Common/UpdateCallback.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../Common/UpdatePair.h \\\n  ../Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/../Common/../../Archive/IArchive.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../Common/Property.h \\\n  ../Common/LoadCodecs.h ../Common/../../../Common/Types.h \\\n  ../Common/../../../Common/MyCom.h ../Common/../../../Common/MyString.h \\\n  ../Common/../../../Common/Buffer.h ../Common/../../../Common/Defs.h \\\n  ../Common/../../../Windows/DLL.h \\\n  ../Common/../../../Windows/../Common/MyString.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Windows/FileDir.h ../../../Windows/FileName.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Windows/Time.h \\\n  ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h \\\n  ../Common/../../Compress/CopyCoder.h \\\n  ../Common/../../Compress/../../Common/MyCom.h \\\n  ../Common/../../Compress/../ICoder.h ../Common/../Common/DirItem.h \\\n  ../Common/../Common/EnumDirItems.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileFind.h ../Common/../Common/OpenArchive.h \\\n  ../Common/../Common/LoadCodecs.h \\\n  ../Common/../Common/ArchiveOpenCallback.h ../Common/EnumDirItems.h \\\n  ../Common/SetProperties.h ../Common/TempFiles.h\nUpdateAction.o: ../Common/UpdateAction.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/UpdateAction.h\nUpdateCallback.o: ../Common/UpdateCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../Common/UpdateCallback.h \\\n  ../../../Common/MyCom.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../Common/../../IPassword.h \\\n  ../Common/../../../Common/MyUnknown.h \\\n  ../Common/../../../Common/MyWindows.h ../Common/../../../Common/Types.h \\\n  ../Common/../../IDecl.h ../Common/../../ICoder.h \\\n  ../Common/../../IStream.h ../Common/../Common/UpdatePair.h \\\n  ../Common/../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/../Common/../../Archive/IArchive.h \\\n  ../Common/../Common/../../Archive/../IStream.h \\\n  ../Common/../Common/../../Archive/../IProgress.h \\\n  ../Common/../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../Common/../../Archive/../IDecl.h \\\n  ../Common/../Common/../../Archive/../PropID.h \\\n  ../Common/../Common/UpdateAction.h ../Common/../Common/UpdateProduce.h \\\n  ../Common/../Common/UpdatePair.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h \\\n  ../../../Common/Defs.h ../../../Common/ComTry.h \\\n  ../../../Windows/PropVariant.h ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../Common/../../Common/FileStreams.h \\\n  ../Common/../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../Common/../../Common/../IStream.h \\\n  ../Common/../../Common/../../Common/MyCom.h\nUpdatePair.o: ../Common/UpdatePair.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Defs.h ../../../Common/Wildcard.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Time.h ../../../Common/Types.h \\\n  ../Common/UpdatePair.h ../Common/DirItem.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../Common/../../Archive/IArchive.h \\\n  ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/UpdateAction.h \\\n  ../Common/SortUtils.h\nUpdateProduce.o: ../Common/UpdateProduce.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/UpdateProduce.h ../Common/UpdatePair.h ../Common/DirItem.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../Common/../../Archive/IArchive.h ../Common/../../Archive/../IStream.h \\\n  ../Common/../../Archive/../../Common/MyUnknown.h \\\n  ../Common/../../Archive/../../Common/MyWindows.h \\\n  ../Common/../../Archive/../../Common/Types.h \\\n  ../Common/../../Archive/../IDecl.h \\\n  ../Common/../../Archive/../IProgress.h \\\n  ../Common/../../Archive/../PropID.h ../Common/UpdateAction.h\nWorkDir.o: ../Common/WorkDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/WorkDir.h ../Common/ZipRegistry.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Types.h ../Common/ExtractMode.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/Wildcard.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileDir.h ../../../Windows/Defs.h\nZipRegistry.o: ../Common/ZipRegistry.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Common/ZipRegistry.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Types.h ../Common/ExtractMode.h \\\n  ../../../Common/IntToString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Registry.h \\\n  ../../../Common/Buffer.h ../../../Common/MyString.h \\\n  ../../../Common/Types.h ../../../Windows/FileDir.h \\\n  ../../../Windows/../Common/MyString.h\nMyMessages.o: ../Explorer/MyMessages.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../Explorer/MyMessages.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/Types.h ../../../Windows/Error.h \\\n  ../../../Common/MyString.h ../../../Windows/ResourceString.h \\\n  ../Explorer/../FileManager/LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h ../../../Windows/ResourceString.h\nFormatUtils.o: ../FileManager/FormatUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../FileManager/FormatUtils.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/IntToString.h \\\n  ../../../Windows/ResourceString.h ../../../Common/MyString.h \\\n  ../FileManager/LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h\nProgramLocation.o: ../FileManager/ProgramLocation.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../FileManager/ProgramLocation.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h\nProgressDialog2.o: ../FileManager/ProgressDialog2.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../FileManager/resource.h \\\n  ../FileManager/ProgressDialog2.h ../FileManager/ProgressDialog2Res.h \\\n  ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h \\\n  ../../../Common/IntToString.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h\nProgressDialog2_rc.o: ../FileManager/ProgressDialog2_rc.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h /usr/include/wx-2.8/wx/wxprec.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../FileManager/ProgressDialog2Res.h \\\n  ../../../Windows/Control/DialogImpl.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/Dialog.h\nMessagesDialog.o: ../FileManager/MessagesDialog.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../FileManager/MessagesDialog.h \\\n  ../FileManager/MessagesDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/ListView.h \\\n  ../../../Windows/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/IntToString.h ../../../Windows/ResourceString.h \\\n  ../FileManager/LangUtils.h ../../../Common/Lang.h\nMessagesDialog_rc.o: ../FileManager/MessagesDialog_rc.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h /usr/include/wx-2.8/wx/wxprec.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  ../FileManager/MessagesDialogRes.h\nOverwriteDialog.o: ../FileManager/OverwriteDialog.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../FileManager/OverwriteDialog.h \\\n  ../FileManager/OverwriteDialogRes.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/Defs.h ../../../Windows/ResourceString.h \\\n  ../../../Windows/Control/Static.h ../../../Windows/Defs.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../FileManager/FormatUtils.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h\nOverwriteDialog_rc.o: ../FileManager/OverwriteDialog_rc.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h /usr/include/wx-2.8/wx/wxprec.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../FileManager/OverwriteDialogRes.h \\\n  ../../../Windows/Control/DialogImpl.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/Dialog.h\nPasswordDialog.o: ../FileManager/PasswordDialog.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../FileManager/PasswordDialog.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Defs.h \\\n  ../FileManager/PasswordDialogRes.h ../FileManager/LangUtils.h \\\n  ../../../Common/Lang.h ../../../Common/MyString.h \\\n  ../../../Windows/ResourceString.h\nPasswordDialog_rc.o: ../FileManager/PasswordDialog_rc.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h /usr/include/wx-2.8/wx/wxprec.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  ../FileManager/PasswordDialogRes.h\nExtractCallback.o: ../FileManager/ExtractCallback.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../FileManager/ExtractCallback.h \\\n  ../FileManager/../Agent/IFolderArchive.h \\\n  ../FileManager/../Agent/../../Archive/IArchive.h \\\n  ../FileManager/../Agent/../../Archive/../IStream.h \\\n  ../FileManager/../Agent/../../Archive/../../Common/MyUnknown.h \\\n  ../FileManager/../Agent/../../Archive/../../Common/MyWindows.h \\\n  ../FileManager/../Agent/../../Archive/../../Common/Types.h \\\n  ../FileManager/../Agent/../../Archive/../IDecl.h \\\n  ../FileManager/../Agent/../../Archive/../IProgress.h \\\n  ../FileManager/../Agent/../../Archive/../PropID.h \\\n  ../FileManager/../Agent/../../UI/FileManager/IFolder.h \\\n  ../FileManager/../Agent/../../UI/FileManager/../../IProgress.h \\\n  ../FileManager/../Agent/../Common/IFileExtractCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../FileManager/../Agent/../Common/../../IDecl.h \\\n  ../FileManager/../Agent/../Common/ExtractMode.h \\\n  ../FileManager/../Agent/../../UI/Common/LoadCodecs.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Common/Types.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Common/MyCom.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Common/MyWindows.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Common/MyString.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Common/Buffer.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Common/Defs.h \\\n  ../FileManager/../Agent/../../UI/Common/../../ICoder.h \\\n  ../FileManager/../Agent/../../UI/Common/../../IStream.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Windows/DLL.h \\\n  ../FileManager/../Agent/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../FileManager/../Agent/../../UI/Common/../../Archive/IArchive.h \\\n  ../FileManager/../Agent/../../IDecl.h ../../../Common/MyString.h \\\n  ../FileManager/../Common/ArchiveOpenCallback.h \\\n  ../../../Common/MyString.h ../../../Common/MyCom.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../FileManager/../Common/../../IPassword.h \\\n  ../FileManager/../Common/../../../Common/MyUnknown.h \\\n  ../FileManager/../Common/../../../Common/Types.h \\\n  ../FileManager/../Common/../../IDecl.h \\\n  ../FileManager/../Common/../../Archive/IArchive.h \\\n  ../FileManager/ProgressDialog2.h ../FileManager/ProgressDialog2Res.h \\\n  ../../../Common/Types.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Defs.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/ResourceString.h \\\n  ../FileManager/LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyString.h ../FileManager/../../IPassword.h \\\n  ../../../Common/MyCom.h ../FileManager/IFolder.h \\\n  ../../../Windows/Error.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileDir.h ../FileManager/OverwriteDialog.h \\\n  ../FileManager/OverwriteDialogRes.h ../FileManager/PasswordDialog.h \\\n  ../../../Windows/Control/Edit.h ../FileManager/PasswordDialogRes.h \\\n  ../FileManager/MessagesDialog.h ../FileManager/MessagesDialogRes.h \\\n  ../../../Windows/Control/ListView.h ../FileManager/../GUI/ExtractRes.h \\\n  ../FileManager/../GUI/resource.h ../../../Common/Wildcard.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../FileManager/FormatUtils.h \\\n  ../FileManager/../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h\nSplitUtils.o: ../FileManager/SplitUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringToInt.h ../FileManager/SplitUtils.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Types.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Windows/Defs.h ../FileManager/StringUtils.h\nStringUtils.o: ../FileManager/StringUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../FileManager/StringUtils.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nLangUtils.o: ../FileManager/LangUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../FileManager/LangUtils.h ../../../Common/Lang.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/MyString.h ../../../Windows/ResourceString.h \\\n  ../../../Common/MyString.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/StringToInt.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileFind.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileName.h \\\n  ../FileManager/RegistryUtils.h ../FileManager/ProgramLocation.h \\\n  ../../../Common/MyString.h\nFilePathAutoRename.o: ../../Common/FilePathAutoRename.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/FilePathAutoRename.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/Defs.h \\\n  ../../../Common/IntToString.h ../../../Windows/FileName.h \\\n  ../../../Windows/../Common/MyString.h ../../../Windows/FileFind.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h\nFileStreams.o: ../../Common/FileStreams.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/FileStreams.h ../../Common/../../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h\nProgressUtils.o: ../../Common/ProgressUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Common/ProgressUtils.h \\\n  ../../Common/../../Common/MyCom.h ../../Common/../../Common/MyWindows.h \\\n  ../../Common/../ICoder.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h ../../Common/../IProgress.h\nStreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Common/StreamUtils.h ../../Common/../IStream.h \\\n  ../../Common/../../Common/MyUnknown.h \\\n  ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \\\n  ../../Common/../IDecl.h\nCopyCoder.o: ../../Compress/CopyCoder.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../Compress/../../../C/Alloc.h \\\n  ../../Compress/../Common/StreamUtils.h \\\n  ../../Compress/../Common/../IStream.h \\\n  ../../Compress/../Common/../../Common/MyUnknown.h \\\n  ../../Compress/../Common/../../Common/MyWindows.h \\\n  ../../Compress/../Common/../../Common/Types.h \\\n  ../../Compress/../Common/../IDecl.h ../../Compress/CopyCoder.h \\\n  ../../Compress/../../Common/MyCom.h \\\n  ../../Compress/../../Common/MyWindows.h ../../Compress/../ICoder.h \\\n  ../../Compress/../IStream.h\nLzmaBench.o: ../../Compress/LZMA_Alone/LzmaBench.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../Compress/LZMA_Alone/LzmaBench.h \\\n  ../../Compress/LZMA_Alone/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/LoadCodecs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyVector.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Defs.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Buffer.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../ICoder.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/DLL.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../../Windows/../Common/MyString.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/IArchive.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IStream.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IProgress.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/MyUnknown.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../IDecl.h \\\n  ../../Compress/LZMA_Alone/../../UI/Common/../../Archive/../PropID.h \\\n  ../../Compress/LZMA_Alone/../../../../C/7zCrc.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../../C/Alloc.h \\\n  ../../Compress/LZMA_Alone/../../../Common/MyCom.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Defs.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Threads.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../../C/Types.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Synchronization2.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/Thread.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/PropVariant.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../Common/MyWindows.h \\\n  ../../Compress/LZMA_Alone/../../../Windows/../Common/Types.h \\\n  ../../Compress/LZMA_Alone/../../ICoder.h\nCommandLineParser.o: ../../../Common/CommandLineParser.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/CommandLineParser.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h\nCRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/../../C/7zCrc.h ../../../Common/../../C/Types.h\nIntToString.o: ../../../Common/IntToString.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/IntToString.h\nLang.o: ../../../Common/Lang.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Lang.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/TextConfig.h ../../../Common/../Windows/FileIO.h \\\n  ../../../Common/MyString.h ../../../Common/UTFConvert.h\nListFileUtils.o: ../../../Common/ListFileUtils.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/MyWindows.h \\\n  ../../../Common/../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/ListFileUtils.h ../../../Common/MyString.h \\\n  ../../../Common/StringConvert.h ../../../Common/UTFConvert.h\nMyString.o: ../../../Common/MyString.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../myWindows/myPrivate.h\nMyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nStringConvert.o: ../../../Common/StringConvert.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringConvert.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/UTFConvert.cpp ../../../Common/UTFConvert.h\nStringToInt.o: ../../../Common/StringToInt.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Common/StringToInt.h\nTextConfig.o: ../../../Common/TextConfig.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/TextConfig.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/UTFConvert.h\nUTFConvert.o: ../../../Common/UTFConvert.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/UTFConvert.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nWildcard.o: ../../../Common/Wildcard.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nDLL.o: ../../../Windows/DLL.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/DLL.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nError.o: ../../../Windows/Error.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Error.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h\nFileDir.o: ../../../Windows/FileDir.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileDir.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/FileName.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileFind.o: ../../../Windows/FileFind.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileFind.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Windows/FileName.h ../../../Windows/Defs.h \\\n  ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileIO.o: ../../../Windows/FileIO.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileIO.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Defs.h ../../../Windows/../Common/StringConvert.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/Types.h ../../../myWindows/myPrivate.h\nFileName.o: ../../../Windows/FileName.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/FileName.h ../../../Windows/../Common/MyString.h \\\n  ../../../Windows/../Common/MyVector.h ../../../Windows/../Common/Defs.h \\\n  ../../../Common/Wildcard.h ../../../Common/MyString.h\nPropVariant.o: ../../../Windows/PropVariant.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/PropVariant.h \\\n  ../../../Windows/../Common/MyWindows.h \\\n  ../../../Windows/../Common/Types.h ../../../Windows/../Common/Defs.h\nPropVariantConversions.o: ../../../Windows/PropVariantConversions.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h \\\n  ../../../Windows/PropVariantConversions.h ../../../Common/Types.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Defs.h \\\n  ../../../Common/StringConvert.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyString.h ../../../Common/IntToString.h\nRegistry.o: ../../../Windows/Registry.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Registry.h ../../../Common/Buffer.h \\\n  ../../../Common/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Types.h \\\n  /usr/include/wx-2.8/wx/config.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/confbase.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/fileconf.h \\\n  /usr/include/wx-2.8/wx/textfile.h /usr/include/wx-2.8/wx/textbuf.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/convauto.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/file.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/msgout.h\nSynchronization.o: ../../../Windows/Synchronization.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h ../../../Windows/Synchronization.h \\\n  ../../../Windows/Defs.h ../../../Windows/../../C/Threads.h \\\n  ../../../Windows/../../C/Types.h ../../../Windows/Synchronization2.h\nTime.o: ../../../Windows/Time.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Windows/Time.h ../../../Common/Types.h ../../../Windows/Defs.h\nSystem.o: ../../../Windows/System.cpp ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h\nWindow.o: ../../../Windows/Window.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h\nDialog.o: ../../../Windows/Control/Dialog.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  /usr/include/wx-2.8/wx/wxprec.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h ../../../Windows/Control/DialogImpl.h \\\n  ../../../Windows/Window.h ../../../Windows/Defs.h \\\n  ../../../Common/MyString.h ../../../Common/MyVector.h \\\n  ../../../Common/Defs.h ../../../Windows/Control/Dialog.h \\\n  ../../../Windows/Synchronization.h ../../../Windows/Defs.h \\\n  ../../../Windows/../../C/Threads.h ../../../Windows/../../C/Types.h \\\n  ../../../Windows/Synchronization2.h\nControls.o: ../../../Windows/Control/Controls.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h /usr/include/wx-2.8/wx/wxprec.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/platform.h \\\n  /usr/lib/wx/include/gtk2-unicode-release-2.8/wx/setup.h \\\n  /usr/include/wx-2.8/wx/chkconf.h /usr/include/wx-2.8/wx/features.h \\\n  /usr/include/wx-2.8/wx/version.h /usr/include/wx-2.8/wx/cpp.h \\\n  /usr/include/wx-2.8/wx/dlimpexp.h /usr/include/wx-2.8/wx/debug.h \\\n  /usr/include/wx-2.8/wx/wxchar.h /usr/include/wx-2.8/wx/wx.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/memory.h \\\n  /usr/include/wx-2.8/wx/string.h /usr/include/wx-2.8/wx/buffer.h \\\n  /usr/include/wx-2.8/wx/strconv.h /usr/include/wx-2.8/wx/fontenc.h \\\n  /usr/include/wx-2.8/wx/beforestd.h /usr/include/wx-2.8/wx/afterstd.h \\\n  /usr/include/wx-2.8/wx/iosfwrap.h /usr/include/wx-2.8/wx/msgout.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/hash.h /usr/include/wx-2.8/wx/hashmap.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/intl.h \\\n  /usr/include/wx-2.8/wx/log.h /usr/include/wx-2.8/wx/generic/logg.h \\\n  /usr/include/wx-2.8/wx/event.h /usr/include/wx-2.8/wx/clntdata.h \\\n  /usr/include/wx-2.8/wx/vector.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/math.h /usr/include/wx-2.8/wx/cursor.h \\\n  /usr/include/wx-2.8/wx/gtk/cursor.h /usr/include/wx-2.8/wx/object.h \\\n  /usr/include/wx-2.8/wx/utils.h /usr/include/wx-2.8/wx/filefn.h \\\n  /usr/include/wx-2.8/wx/longlong.h /usr/include/wx-2.8/wx/platinfo.h \\\n  /usr/include/wx-2.8/wx/thread.h /usr/include/wx-2.8/wx/app.h \\\n  /usr/include/wx-2.8/wx/build.h /usr/include/wx-2.8/wx/init.h \\\n  /usr/include/wx-2.8/wx/gtk/app.h /usr/include/wx-2.8/wx/stream.h \\\n  /usr/include/wx-2.8/wx/stopwatch.h /usr/include/wx-2.8/wx/module.h \\\n  /usr/include/wx-2.8/wx/window.h /usr/include/wx-2.8/wx/font.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gtk/font.h \\\n  /usr/include/wx-2.8/wx/colour.h /usr/include/wx-2.8/wx/variant.h \\\n  /usr/include/wx-2.8/wx/datetime.h /usr/include/wx-2.8/wx/gtk/colour.h \\\n  /usr/include/wx-2.8/wx/region.h /usr/include/wx-2.8/wx/gtk/region.h \\\n  /usr/include/wx-2.8/wx/validate.h /usr/include/wx-2.8/wx/palette.h \\\n  /usr/include/wx-2.8/wx/generic/paletteg.h /usr/include/wx-2.8/wx/defs.h \\\n  /usr/include/wx-2.8/wx/object.h /usr/include/wx-2.8/wx/gdiobj.h \\\n  /usr/include/wx-2.8/wx/gdicmn.h /usr/include/wx-2.8/wx/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/accel.h \\\n  /usr/include/wx-2.8/wx/generic/accel.h \\\n  /usr/include/wx-2.8/wx/gtk/window.h /usr/include/wx-2.8/wx/dynarray.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/panel.h \\\n  /usr/include/wx-2.8/wx/generic/panelg.h /usr/include/wx-2.8/wx/window.h \\\n  /usr/include/wx-2.8/wx/containr.h /usr/include/wx-2.8/wx/toplevel.h \\\n  /usr/include/wx-2.8/wx/iconbndl.h /usr/include/wx-2.8/wx/gtk/toplevel.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/gtk/frame.h \\\n  /usr/include/wx-2.8/wx/bitmap.h /usr/include/wx-2.8/wx/gtk/bitmap.h \\\n  /usr/include/wx-2.8/wx/image.h /usr/include/wx-2.8/wx/imagbmp.h \\\n  /usr/include/wx-2.8/wx/imagpng.h /usr/include/wx-2.8/wx/imaggif.h \\\n  /usr/include/wx-2.8/wx/imagpcx.h /usr/include/wx-2.8/wx/imagjpeg.h \\\n  /usr/include/wx-2.8/wx/imagtga.h /usr/include/wx-2.8/wx/imagtiff.h \\\n  /usr/include/wx-2.8/wx/imagpnm.h /usr/include/wx-2.8/wx/imagxpm.h \\\n  /usr/include/wx-2.8/wx/imagiff.h /usr/include/wx-2.8/wx/dc.h \\\n  /usr/include/wx-2.8/wx/brush.h /usr/include/wx-2.8/wx/gtk/brush.h \\\n  /usr/include/wx-2.8/wx/pen.h /usr/include/wx-2.8/wx/gtk/pen.h \\\n  /usr/include/wx-2.8/wx/gdiobj.h /usr/include/wx-2.8/wx/gdicmn.h \\\n  /usr/include/wx-2.8/wx/gtk/dc.h /usr/include/wx-2.8/wx/dcgraph.h \\\n  /usr/include/wx-2.8/wx/geometry.h /usr/include/wx-2.8/wx/graphics.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/gtk/dcclient.h \\\n  /usr/include/wx-2.8/wx/dc.h /usr/include/wx-2.8/wx/region.h \\\n  /usr/include/wx-2.8/wx/dcmemory.h /usr/include/wx-2.8/wx/gtk/dcmemory.h \\\n  /usr/include/wx-2.8/wx/dcclient.h /usr/include/wx-2.8/wx/dcprint.h \\\n  /usr/include/wx-2.8/wx/dcscreen.h /usr/include/wx-2.8/wx/gtk/dcscreen.h \\\n  /usr/include/wx-2.8/wx/button.h /usr/include/wx-2.8/wx/control.h \\\n  /usr/include/wx-2.8/wx/gtk/control.h \\\n  /usr/include/wx-2.8/wx/gtk/button.h /usr/include/wx-2.8/wx/menuitem.h \\\n  /usr/include/wx-2.8/wx/gtk/menuitem.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/menu.h /usr/include/wx-2.8/wx/gtk/menu.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/iconloc.h \\\n  /usr/include/wx-2.8/wx/generic/icon.h /usr/include/wx-2.8/wx/bitmap.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/gtk/dialog.h \\\n  /usr/include/wx-2.8/wx/defs.h /usr/include/wx-2.8/wx/timer.h \\\n  /usr/include/wx-2.8/wx/gtk/timer.h /usr/include/wx-2.8/wx/settings.h \\\n  /usr/include/wx-2.8/wx/msgdlg.h /usr/include/wx-2.8/wx/gtk/msgdlg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/cmndata.h \\\n  /usr/include/wx-2.8/wx/encinfo.h /usr/include/wx-2.8/wx/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataform.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj.h \\\n  /usr/include/wx-2.8/wx/gtk/dataobj2.h /usr/include/wx-2.8/wx/ctrlsub.h \\\n  /usr/include/wx-2.8/wx/bmpbuttn.h /usr/include/wx-2.8/wx/gtk/bmpbuttn.h \\\n  /usr/include/wx-2.8/wx/checkbox.h /usr/include/wx-2.8/wx/gtk/checkbox.h \\\n  /usr/include/wx-2.8/wx/checklst.h /usr/include/wx-2.8/wx/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/listbox.h \\\n  /usr/include/wx-2.8/wx/gtk/checklst.h /usr/include/wx-2.8/wx/choice.h \\\n  /usr/include/wx-2.8/wx/gtk/choice.h /usr/include/wx-2.8/wx/scrolbar.h \\\n  /usr/include/wx-2.8/wx/gtk/scrolbar.h /usr/include/wx-2.8/wx/stattext.h \\\n  /usr/include/wx-2.8/wx/gtk/stattext.h /usr/include/wx-2.8/wx/statbmp.h \\\n  /usr/include/wx-2.8/wx/gtk/statbmp.h /usr/include/wx-2.8/wx/icon.h \\\n  /usr/include/wx-2.8/wx/statbox.h /usr/include/wx-2.8/wx/gtk/statbox.h \\\n  /usr/include/wx-2.8/wx/radiobox.h /usr/include/wx-2.8/wx/gtk/radiobox.h \\\n  /usr/include/wx-2.8/wx/list.h /usr/include/wx-2.8/wx/radiobut.h \\\n  /usr/include/wx-2.8/wx/gtk/radiobut.h /usr/include/wx-2.8/wx/textctrl.h \\\n  /usr/include/wx-2.8/wx/ioswrap.h /usr/include/wx-2.8/wx/gtk/textctrl.h \\\n  /usr/include/wx-2.8/wx/slider.h /usr/include/wx-2.8/wx/gtk/slider.h \\\n  /usr/include/wx-2.8/wx/gauge.h /usr/include/wx-2.8/wx/gtk/gauge.h \\\n  /usr/include/wx-2.8/wx/scrolwin.h /usr/include/wx-2.8/wx/gtk/scrolwin.h \\\n  /usr/include/wx-2.8/wx/dirdlg.h /usr/include/wx-2.8/wx/gtk/dirdlg.h \\\n  /usr/include/wx-2.8/wx/generic/dirdlgg.h \\\n  /usr/include/wx-2.8/wx/dialog.h /usr/include/wx-2.8/wx/toolbar.h \\\n  /usr/include/wx-2.8/wx/tbarbase.h /usr/include/wx-2.8/wx/gtk/tbargtk.h \\\n  /usr/include/wx-2.8/wx/combobox.h /usr/include/wx-2.8/wx/gtk/combobox.h \\\n  /usr/include/wx-2.8/wx/layout.h /usr/include/wx-2.8/wx/sizer.h \\\n  /usr/include/wx-2.8/wx/mdi.h /usr/include/wx-2.8/wx/gtk/mdi.h \\\n  /usr/include/wx-2.8/wx/frame.h /usr/include/wx-2.8/wx/statusbr.h \\\n  /usr/include/wx-2.8/wx/generic/statusbr.h /usr/include/wx-2.8/wx/pen.h \\\n  /usr/include/wx-2.8/wx/arrstr.h /usr/include/wx-2.8/wx/choicdlg.h \\\n  /usr/include/wx-2.8/wx/generic/choicdgg.h \\\n  /usr/include/wx-2.8/wx/dynarray.h /usr/include/wx-2.8/wx/textdlg.h \\\n  /usr/include/wx-2.8/wx/generic/textdlgg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/gtk/filedlg.h \\\n  /usr/include/wx-2.8/wx/generic/filedlgg.h \\\n  /usr/include/wx-2.8/wx/listctrl.h /usr/include/wx-2.8/wx/listbase.h \\\n  /usr/include/wx-2.8/wx/generic/listctrl.h \\\n  /usr/include/wx-2.8/wx/textctrl.h /usr/include/wx-2.8/wx/datetime.h \\\n  /usr/include/wx-2.8/wx/filefn.h /usr/include/wx-2.8/wx/filedlg.h \\\n  /usr/include/wx-2.8/wx/valtext.h /usr/include/wx-2.8/wx/imaglist.h \\\n  /usr/include/wx-2.8/wx/generic/imaglist.h /usr/include/wx-2.8/wx/list.h \\\n  /usr/include/wx-2.8/wx/icon.h /usr/include/wx-2.8/wx/listctrl.h \\\n  ../../../Windows/Control/Dialog.h ../../../Windows/Window.h \\\n  ../../../Windows/Defs.h ../../../Common/MyString.h \\\n  ../../../Common/MyVector.h ../../../Common/Defs.h \\\n  ../../../Windows/Control/ComboBox.h ../../../Windows/Defs.h \\\n  ../../../Windows/Control/Edit.h ../../../Windows/Control/ProgressBar.h \\\n  ../../../Windows/Control/StatusBar.h \\\n  ../../../Windows/Control/ListView.h\nMyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \\\n  ../../../myWindows/config.h ../../../Common/MyWindows.h \\\n  ../../../Common/MyGuidDef.h ../../../Common/Types.h \\\n  ../../../Common/../../C/Types.h ../../../Common/Types.h \\\n  ../../../include_windows/windows.h ../../../Common/MyWindows.h \\\n  ../../../include_windows/basetyps.h ../../../include_windows/tchar.h \\\n  ../../../Common/MyWindows.h\nmyGetTickCount.o: ../../../myWindows/myGetTickCount.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\nwine_date_and_time.o: ../../../myWindows/wine_date_and_time.cpp \\\n  ../../../myWindows/config.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../include_windows/basetyps.h\nwine_GetXXXDefaultLangID.o:  \\\n ../../../myWindows/wine_GetXXXDefaultLangID.cpp \\\n  ../../../myWindows/StdAfx.h ../../../myWindows/config.h \\\n  ../../../Common/MyWindows.h ../../../Common/MyGuidDef.h \\\n  ../../../Common/Types.h ../../../Common/../../C/Types.h \\\n  ../../../Common/Types.h ../../../include_windows/windows.h \\\n  ../../../Common/MyWindows.h ../../../include_windows/basetyps.h \\\n  ../../../include_windows/tchar.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/makefile.list",
    "content": "SRCS=\\\n\tCompressDialog.cpp \\\n\tCompressDialog_rc.cpp \\\n\tExtractDialog.cpp \\\n\tExtractDialog_rc.cpp \\\n\tBenchmarkDialog.cpp \\\n\tBenchmarkDialog_rc.cpp \\\n\tExtractGUI.cpp \\\n\tGUI.cpp \\\n\twxGUI.cpp \\\n\tUpdateCallbackGUI.cpp \\\n\tUpdateGUI.cpp \\\n\t../Common/ArchiveCommandLine.cpp \\\n\t../Common/ArchiveExtractCallback.cpp \\\n\t../Common/ArchiveOpenCallback.cpp \\\n\t../Common/DefaultName.cpp \\\n\t../Common/EnumDirItems.cpp \\\n\t../Common/Extract.cpp \\\n\t../Common/ExtractingFilePath.cpp \\\n\t../Common/LoadCodecs.cpp \\\n\t../Common/OpenArchive.cpp \\\n\t../Common/PropIDUtils.cpp \\\n\t../Common/SetProperties.cpp \\\n\t../Common/SortUtils.cpp \\\n\t../Common/TempFiles.cpp \\\n\t../Common/Update.cpp \\\n\t../Common/UpdateAction.cpp \\\n\t../Common/UpdateCallback.cpp \\\n\t../Common/UpdatePair.cpp \\\n\t../Common/UpdateProduce.cpp \\\n\t../Common/WorkDir.cpp \\\n\t../Common/ZipRegistry.cpp \\\n\t../Explorer/MyMessages.cpp \\\n\t../FileManager/FormatUtils.cpp \\\n\t../FileManager/ProgramLocation.cpp \\\n\t../FileManager/ProgressDialog2.cpp \\\n\t../FileManager/ProgressDialog2_rc.cpp \\\n\t../FileManager/MessagesDialog.cpp \\\n\t../FileManager/MessagesDialog_rc.cpp \\\n\t../FileManager/OverwriteDialog.cpp \\\n\t../FileManager/OverwriteDialog_rc.cpp \\\n\t../FileManager/PasswordDialog.cpp \\\n\t../FileManager/PasswordDialog_rc.cpp \\\n\t../FileManager/ExtractCallback.cpp \\\n\t../FileManager/SplitUtils.cpp \\\n\t../FileManager/StringUtils.cpp \\\n\t../FileManager/LangUtils.cpp \\\n\t../../Common/FilePathAutoRename.cpp \\\n\t../../Common/FileStreams.cpp \\\n\t../../Common/ProgressUtils.cpp \\\n\t../../Common/StreamUtils.cpp \\\n\t../../Compress/CopyCoder.cpp \\\n\t../../Compress/LZMA_Alone/LzmaBench.cpp \\\n\t../../../Common/CommandLineParser.cpp \\\n\t../../../Common/CRC.cpp \\\n\t../../../Common/IntToString.cpp \\\n\t../../../Common/Lang.cpp \\\n\t../../../Common/ListFileUtils.cpp \\\n\t../../../Common/MyString.cpp \\\n\t../../../Common/MyVector.cpp \\\n\t../../../Common/StringConvert.cpp \\\n\t../../../Common/StringToInt.cpp \\\n\t../../../Common/TextConfig.cpp \\\n\t../../../Common/UTFConvert.cpp \\\n\t../../../Common/Wildcard.cpp \\\n\t../../../Windows/DLL.cpp \\\n\t../../../Windows/Error.cpp \\\n\t../../../Windows/FileDir.cpp \\\n\t../../../Windows/FileFind.cpp \\\n\t../../../Windows/FileIO.cpp \\\n\t../../../Windows/FileName.cpp \\\n\t../../../Windows/PropVariant.cpp \\\n\t../../../Windows/PropVariantConversions.cpp \\\n\t../../../Windows/Registry.cpp \\\n\t../../../Windows/Synchronization.cpp \\\n\t../../../Windows/Time.cpp \\\n\t../../../Windows/System.cpp \\\n\t../../../Windows/Window.cpp \\\n\t../../../Windows/Control/Dialog.cpp \\\n\t../../../Windows/Control/Controls.cpp \\\n\t../../../Common/MyWindows.cpp \\\n\t../../../myWindows/myGetTickCount.cpp \\\n\t../../../myWindows/wine_date_and_time.cpp \\\n\t../../../myWindows/wine_GetXXXDefaultLangID.cpp\n\n\nSRCS_OUT=\\\n\t../FileManager/HelpUtils.cpp \\\n\t../FileManager/OpenCallback.cpp \\\n\t../FileManager/RegistryUtils.cpp \\\n\t../../../Common/NewHandler.cpp \\\n\t../../../Windows/MemoryLock.cpp \\\n\t../../../Windows/Registry.cpp \\\n\t../../../Windows/ResourceString.cpp \\\n\t../../../Windows/Shell.cpp\n\nSRCS_C=\\\n\t../../../../C/7zCrc.c \\\n\t../../../../C/Threads.c\n\nCompressDialog.o : CompressDialog.cpp\n\t$(CXX) $(CXXFLAGS) CompressDialog.cpp\nCompressDialog_rc.o : CompressDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) CompressDialog_rc.cpp\nExtractDialog.o : ExtractDialog.cpp\n\t$(CXX) $(CXXFLAGS) ExtractDialog.cpp\nExtractDialog_rc.o : ExtractDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) ExtractDialog_rc.cpp\nBenchmarkDialog.o : BenchmarkDialog.cpp\n\t$(CXX) $(CXXFLAGS) BenchmarkDialog.cpp\nBenchmarkDialog_rc.o : BenchmarkDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) BenchmarkDialog_rc.cpp\nExtractGUI.o : ExtractGUI.cpp\n\t$(CXX) $(CXXFLAGS) ExtractGUI.cpp\nGUI.o : GUI.cpp\n\t$(CXX) $(CXXFLAGS) GUI.cpp\nwxGUI.o : wxGUI.cpp\n\t$(CXX) $(CXXFLAGS) wxGUI.cpp\nUpdateCallbackGUI.o : UpdateCallbackGUI.cpp\n\t$(CXX) $(CXXFLAGS) UpdateCallbackGUI.cpp\nUpdateGUI.o : UpdateGUI.cpp\n\t$(CXX) $(CXXFLAGS) UpdateGUI.cpp\nArchiveCommandLine.o : ../Common/ArchiveCommandLine.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ArchiveCommandLine.cpp\nArchiveExtractCallback.o : ../Common/ArchiveExtractCallback.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ArchiveExtractCallback.cpp\nArchiveOpenCallback.o : ../Common/ArchiveOpenCallback.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ArchiveOpenCallback.cpp\nDefaultName.o : ../Common/DefaultName.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/DefaultName.cpp\nEnumDirItems.o : ../Common/EnumDirItems.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/EnumDirItems.cpp\nExtract.o : ../Common/Extract.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/Extract.cpp\nExtractingFilePath.o : ../Common/ExtractingFilePath.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ExtractingFilePath.cpp\nLoadCodecs.o : ../Common/LoadCodecs.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/LoadCodecs.cpp\nOpenArchive.o : ../Common/OpenArchive.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/OpenArchive.cpp\nPropIDUtils.o : ../Common/PropIDUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/PropIDUtils.cpp\nSetProperties.o : ../Common/SetProperties.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/SetProperties.cpp\nSortUtils.o : ../Common/SortUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/SortUtils.cpp\nTempFiles.o : ../Common/TempFiles.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/TempFiles.cpp\nUpdate.o : ../Common/Update.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/Update.cpp\nUpdateAction.o : ../Common/UpdateAction.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdateAction.cpp\nUpdateCallback.o : ../Common/UpdateCallback.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdateCallback.cpp\nUpdatePair.o : ../Common/UpdatePair.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdatePair.cpp\nUpdateProduce.o : ../Common/UpdateProduce.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/UpdateProduce.cpp\nWorkDir.o : ../Common/WorkDir.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/WorkDir.cpp\nZipRegistry.o : ../Common/ZipRegistry.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/ZipRegistry.cpp\nMyMessages.o : ../Explorer/MyMessages.cpp\n\t$(CXX) $(CXXFLAGS) ../Explorer/MyMessages.cpp\nFormatUtils.o : ../FileManager/FormatUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/FormatUtils.cpp\nProgramLocation.o : ../FileManager/ProgramLocation.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/ProgramLocation.cpp\nProgressDialog2.o : ../FileManager/ProgressDialog2.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/ProgressDialog2.cpp\nProgressDialog2_rc.o : ../FileManager/ProgressDialog2_rc.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/ProgressDialog2_rc.cpp\nMessagesDialog.o : ../FileManager/MessagesDialog.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/MessagesDialog.cpp\nMessagesDialog_rc.o : ../FileManager/MessagesDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/MessagesDialog_rc.cpp\nOverwriteDialog.o : ../FileManager/OverwriteDialog.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/OverwriteDialog.cpp\nOverwriteDialog_rc.o : ../FileManager/OverwriteDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/OverwriteDialog_rc.cpp\nPasswordDialog.o : ../FileManager/PasswordDialog.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/PasswordDialog.cpp\nPasswordDialog_rc.o : ../FileManager/PasswordDialog_rc.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/PasswordDialog_rc.cpp\nExtractCallback.o : ../FileManager/ExtractCallback.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/ExtractCallback.cpp\nSplitUtils.o : ../FileManager/SplitUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/SplitUtils.cpp\nStringUtils.o : ../FileManager/StringUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/StringUtils.cpp\nLangUtils.o : ../FileManager/LangUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../FileManager/LangUtils.cpp\nFilePathAutoRename.o : ../../Common/FilePathAutoRename.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/FilePathAutoRename.cpp\nFileStreams.o : ../../Common/FileStreams.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/FileStreams.cpp\nProgressUtils.o : ../../Common/ProgressUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/ProgressUtils.cpp\nStreamUtils.o : ../../Common/StreamUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../Common/StreamUtils.cpp\nCopyCoder.o : ../../Compress/CopyCoder.cpp\n\t$(CXX) $(CXXFLAGS) ../../Compress/CopyCoder.cpp\nLzmaBench.o : ../../Compress/LZMA_Alone/LzmaBench.cpp\n\t$(CXX) $(CXXFLAGS) ../../Compress/LZMA_Alone/LzmaBench.cpp\nCommandLineParser.o : ../../../Common/CommandLineParser.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/CommandLineParser.cpp\nCRC.o : ../../../Common/CRC.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/CRC.cpp\nIntToString.o : ../../../Common/IntToString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/IntToString.cpp\nLang.o : ../../../Common/Lang.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/Lang.cpp\nListFileUtils.o : ../../../Common/ListFileUtils.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/ListFileUtils.cpp\nMyString.o : ../../../Common/MyString.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyString.cpp\nMyVector.o : ../../../Common/MyVector.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyVector.cpp\nStringConvert.o : ../../../Common/StringConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringConvert.cpp\nStringToInt.o : ../../../Common/StringToInt.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/StringToInt.cpp\nTextConfig.o : ../../../Common/TextConfig.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/TextConfig.cpp\nUTFConvert.o : ../../../Common/UTFConvert.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/UTFConvert.cpp\nWildcard.o : ../../../Common/Wildcard.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/Wildcard.cpp\nDLL.o : ../../../Windows/DLL.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/DLL.cpp\nError.o : ../../../Windows/Error.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Error.cpp\nFileDir.o : ../../../Windows/FileDir.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileDir.cpp\nFileFind.o : ../../../Windows/FileFind.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileFind.cpp\nFileIO.o : ../../../Windows/FileIO.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileIO.cpp\nFileName.o : ../../../Windows/FileName.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/FileName.cpp\nPropVariant.o : ../../../Windows/PropVariant.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/PropVariant.cpp\nPropVariantConversions.o : ../../../Windows/PropVariantConversions.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/PropVariantConversions.cpp\nRegistry.o : ../../../Windows/Registry.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Registry.cpp\nSynchronization.o : ../../../Windows/Synchronization.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Synchronization.cpp\nTime.o : ../../../Windows/Time.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Time.cpp\nSystem.o : ../../../Windows/System.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/System.cpp\nWindow.o : ../../../Windows/Window.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Window.cpp\nDialog.o : ../../../Windows/Control/Dialog.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Control/Dialog.cpp\nControls.o : ../../../Windows/Control/Controls.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Windows/Control/Controls.cpp\nMyWindows.o : ../../../Common/MyWindows.cpp\n\t$(CXX) $(CXXFLAGS) ../../../Common/MyWindows.cpp\nmyGetTickCount.o : ../../../myWindows/myGetTickCount.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/myGetTickCount.cpp\nwine_date_and_time.o : ../../../myWindows/wine_date_and_time.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/wine_date_and_time.cpp\nwine_GetXXXDefaultLangID.o : ../../../myWindows/wine_GetXXXDefaultLangID.cpp\n\t$(CXX) $(CXXFLAGS) ../../../myWindows/wine_GetXXXDefaultLangID.cpp\nThreads.o : ../../../../C/Threads.c\n\t$(CC) $(CFLAGS) ../../../../C/Threads.c\n\n# CRC32, C version\n7zCrc.o : ../../../../C/7zCrc.c\n\t$(CC) $(CFLAGS) ../../../../C/7zCrc.c\n# CRC32, ASM version\n7zCrcT8.o : ../../../../C/7zCrcT8.c\n\t$(CC) $(CFLAGS) ../../../../C/7zCrcT8.c\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/resource.h",
    "content": "#define IDS_CONTEXT_EXTRACT             142\n#define IDS_CONTEXT_EXTRACT_HELP        143\n#define IDS_CONTEXT_COMPRESS            144\n#define IDS_CONTEXT_COMPRESS_HELP       145\n#define IDS_CONTEXT_OPEN                146\n#define IDS_CONTEXT_OPEN_HELP           147\n#define IDS_CONTEXT_TEST                148\n#define IDS_CONTEXT_TEST_HELP           149\n#define IDS_CONTEXT_CAPTION_HELP        150\n#define IDS_CONTEXT_POPUP_CAPTION       151\n#define IDS_OPEN_TYPE_ALL_FILES         80\n\n#define IDS_METHOD_STORE                81\n#define IDS_METHOD_NORMAL               82\n#define IDS_METHOD_MAXIMUM              83\n#define IDS_METHOD_FAST                 84\n#define IDS_METHOD_FASTEST              85\n#define IDS_METHOD_ULTRA                86\n\n#define IDS_COMPRESS_NON_SOLID 88\n#define IDS_COMPRESS_SOLID 89\n\n#define IDS_COMPRESS_UPDATE_MODE_ADD    90\n#define IDS_COMPRESS_UPDATE_MODE_UPDATE 91\n#define IDS_COMPRESS_UPDATE_MODE_FRESH  92\n#define IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE 93\n\n#define IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE   94\n#define IDS_COMPRESS_INCORRECT_VOLUME_SIZE   95\n\n#define IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE 96\n#define IDS_CANT_UPDATE_ARCHIVE         97\n\n#define IDS_PROGRESS_COMPRESSING        98\n#define IDS_PROGRESS_TESTING            99\n#define IDS_ERROR                       100\n#define IDS_MESSAGE_NO_ERRORS           101\n#define IDS_CONFIG_DIALOG_CAPTION       102\n\n#define IDS_PASSWORD_USE_ASCII               110\n#define IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH  111\n#define IDS_PASSWORD_IS_TOO_LONG             112\n\n#define IDS_FILES_COLON                 2274\n#define IDS_FOLDERS_COLON               2275\n#define IDS_SIZE_COLON                  2276\n#define IDS_COMPRESSED_COLON            2277\n#define IDS_ARCHIVES_COLON              2278\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/7zip/UI/GUI/wxGUI.cpp",
    "content": "// wxGUI.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif\n\n#define static const\n#include \"../GUI/p7zip_32.xpm\"\n#undef static\n\n#undef ACTIVATE_DIALOG_TESTS\n\nint Main1(int argc,TCHAR **argv);\n\n#include \"Windows/Registry.h\"\nusing namespace NWindows;\nusing namespace NRegistry;\n\n\n#include \"Common/StringConvert.h\"\n#include \"Windows/FileDir.h\"\n#include \"Windows/Synchronization.h\"\n\n#include \"ExtractRes.h\"\n#include \"../Explorer/MyMessages.h\"\n\n#include \"ExtractGUI.h\"\n#include \"UpdateGUI.h\"\n#include \"BenchmarkDialog.h\"\n#include \"../FileManager/RegistryUtils.h\"\n\nusing namespace NWindows;\nusing namespace NFile;\n\n#include \"../FileManager/ProgramLocation.h\"\n\nstatic LPCWSTR kHelpFileName = L\"help/\";\n\nvoid ShowHelpWindow(HWND hwnd, LPCWSTR topicFile)\n{\n  UString path;\n  if (!::GetProgramFolderPath(path))\n    return;\n  path += kHelpFileName;\n  path += topicFile;\n  printf(\"ShowHelpWindow(%p,%ls)=>%ls\\n\",hwnd,topicFile,(const wchar_t *)path);\n  // HtmlHelp(hwnd, GetSystemString(path), HH_DISPLAY_TOPIC, NULL);\n  wxString path2(path);\n  wxLaunchDefaultBrowser(path2);\n}\n\n////////////////////////////// TRIES ///////////////////////////////////\n\n#ifdef ACTIVATE_DIALOG_TESTS\nstatic void ErrorMessage(const wchar_t *message)\n{\n  MessageBox(0,message, wxT(\"7-Zip GUI\"),wxICON_ERROR);\n}\n\n#include \"../FileManager/PasswordDialog.h\"\n#include \"../FileManager/MessagesDialog.h\"\n#include \"../FileManager/OverwriteDialog.h\"\n#include \"Windows/Thread.h\"\n\nvoid myErrorMsg(const wchar_t *message)\n{\n\tMessageBox(0,message, wxT(\"Message\"),wxICON_ERROR);\n}\n\nvoid testCMessagesDialog()\n{\n\tUStringVector Messages;\n\n\tMessages.Add(L\"message 1\");\n\tMessages.Add(L\"message 2\");\n\tMessages.Add(L\"message 3\");\n\tMessages.Add(L\"message 4\");\n\tMessages.Add(L\"message 5\");\n\tMessages.Add(L\"message 6\");\n\tMessages.Add(L\"message 7\");\n\tMessages.Add(L\"message 8\");\n\tMessages.Add(L\"message 9\");\n\n\tCMessagesDialog messagesDialog;\n    messagesDialog.Messages = &Messages;\n   int ret = messagesDialog.Create( 0  ); // ParentWindow\n\n   \tif (ret == IDOK) myErrorMsg(wxT(\"CMessagesDialog => IDOK\"));\n\telse if (ret == IDCANCEL) myErrorMsg(wxT(\"CMessagesDialog => IDCANCEL\"));\n\telse  myErrorMsg(wxT(\"CMessagesDialog => ?\"));\n\n}\n\nvoid testCOverwriteDialog()\n{\nSYSTEMTIME systemTime;\nGetSystemTime( &systemTime );\n\n\nconst wchar_t *existName = L\"existName\";\nFILETIME data_existTime;\nFILETIME *existTime = &data_existTime ;\nUInt64 data_existSize = 1234;\nUInt64 *existSize = &data_existSize;\nconst wchar_t *newName = L\"newName\";\nFILETIME data_newTime;\nFILETIME *newTime = &data_newTime;\nUInt64 data_newSize = 45678;\nUInt64 *newSize = &data_newSize;\nInt32 data_answer=0;\nInt32 *answer = &data_answer;\n\nSystemTimeToFileTime( &systemTime , &data_existTime);\nSystemTimeToFileTime( &systemTime , &data_newTime);\n\n  COverwriteDialog dialog;\n\n  dialog.OldFileInfo.Time = *existTime;\n  dialog.OldFileInfo.TimeIsDefined = true; // FIXME : look again at the sample !\n\n  dialog.OldFileInfo.SizeIsDefined = (existSize != NULL);\n  if (dialog.OldFileInfo.SizeIsDefined)\n    dialog.OldFileInfo.Size = *existSize;\n  dialog.OldFileInfo.Name = existName;\n\n  if (newTime == 0)\n    dialog.NewFileInfo.TimeIsDefined = false;\n  else\n  {\n    dialog.NewFileInfo.TimeIsDefined = true;\n    dialog.NewFileInfo.Time = *newTime;\n  }\n  \n  dialog.NewFileInfo.SizeIsDefined = (newSize != NULL);\n  if (dialog.NewFileInfo.SizeIsDefined)\n    dialog.NewFileInfo.Size = *newSize;\n  dialog.NewFileInfo.Name = newName;\n  \n  /*\n  NOverwriteDialog::NResult::EEnum writeAnswer = \n    NOverwriteDialog::Execute(oldFileInfo, newFileInfo);\n  */\n  INT_PTR writeAnswer = dialog.Create(NULL); // ParentWindow doesn't work with 7z\n  \n  switch(writeAnswer)\n  {\n  case IDCANCEL: myErrorMsg(wxT(\"COverwriteDialog => IDCANCEL\")); break;\n  case IDNO:     myErrorMsg(wxT(\"COverwriteDialog => IDNO\")); break;\n  case IDC_BUTTON_OVERWRITE_NO_TO_ALL: myErrorMsg(wxT(\"COverwriteDialog => IDC_BUTTON_OVERWRITE_NO_TO_ALL\")); break;\n  case IDC_BUTTON_OVERWRITE_YES_TO_ALL:myErrorMsg(wxT(\"COverwriteDialog => IDC_BUTTON_OVERWRITE_YES_TO_ALL\")); break;\n  case IDC_BUTTON_OVERWRITE_AUTO_RENAME:myErrorMsg(wxT(\"COverwriteDialog => IDC_BUTTON_OVERWRITE_AUTO_RENAME\")); break;\n  case IDYES:  myErrorMsg(wxT(\"COverwriteDialog => IDYES\")); break;\n  default:  myErrorMsg(wxT(\"COverwriteDialog => default\")); break;\n  }\n}\n\nvoid testCPasswordDialog()\n{\n    CPasswordDialog dialog;\n\n\tint ret = dialog.Create(0);\n\tif (ret == IDOK) {\n    \t\tUString Password = dialog.Password;\n\t\tUString msg  = wxT(\"CPasswordDialog => IDOK password=\\\"\");\n\t\tmsg += Password;\n\t\tmsg += wxT(\"\\\"\");\n\t\tmyErrorMsg(msg);\n\t}\n\telse if (ret == IDCANCEL) myErrorMsg(wxT(\"CPasswordDialog => IDCANCEL\"));\n\telse  myErrorMsg(wxT(\"CPasswordDialog => ?\"));\n\n}\n\nstruct CThreadProgressDialog\n{\n  CProgressDialog * ProgressDialog;\n  static THREAD_FUNC_DECL MyThreadFunction(void *param)\n  {\n    ((CThreadProgressDialog *)param)->Result = ((CThreadProgressDialog *)param)->Process();\n    return 0;\n  }\n  HRESULT Result;\n  HRESULT Process()\n  {\n\tSleep(1000);\n\tint total = 1000;\n\n\tProgressDialog->ProgressSynch.SetTitleFileName(L\"SetTitleFileName\");\n\tProgressDialog->ProgressSynch.SetNumFilesTotal(100);\n\tProgressDialog->ProgressSynch.SetNumFilesCur(1);\n\tProgressDialog->ProgressSynch.SetProgress(total, 0);\n\t// ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize);\n\t// ProgressDialog.ProgressSynch.SetCurrentFileName(name);\n\n\tProgressDialog->ProgressSynch.SetPos(total/10);\n\tProgressDialog->ProgressSynch.SetCurrentFileName(L\"File1\");\n\tSleep(1000);\n\tProgressDialog->ProgressSynch.SetPos(total/2);\n\tProgressDialog->ProgressSynch.SetCurrentFileName(L\"File2\");\n\tSleep(1000);\n\tProgressDialog->ProgressSynch.SetPos(total);\n\tProgressDialog->ProgressSynch.SetCurrentFileName(L\"File3\");\n\tSleep(1000);\n\tProgressDialog->MyClose();\n\treturn 0;\n  }\n};\n\nvoid testCProgressDialog()\n{\n  CProgressDialog ProgressDialog;\n\n  CThreadProgressDialog benchmarker;\n  benchmarker.ProgressDialog = &ProgressDialog;\n  NWindows::CThread thread;\n  thread.Create(CThreadProgressDialog::MyThreadFunction, &benchmarker);\n\n  //  void StartProgressDialog(const UString &title)\n  int ret = ProgressDialog.Create(L\"testCProgressDialog\", 0);\n\n\tif (ret == IDOK) myErrorMsg(wxT(\"CProgressDialog => IDOK\"));\n\telse if (ret == IDCANCEL) myErrorMsg(wxT(\"CProgressDialog => IDCANCEL\"));\n\telse  myErrorMsg(wxT(\"CProgressDialog => ?\"));\n\n}\n\nvoid testDialog(int num)\n{\n\tNWindows::NControl::CModalDialog dialog;\n\n\tprintf(\"Generic Dialog(%d)\\n\",num);\n\tint ret = dialog.Create(num, 0);\n\tif (ret == IDOK) myErrorMsg(wxT(\"Generic Dialog => IDOK\"));\n\telse if (ret == IDCANCEL) myErrorMsg(wxT(\"Generic Dialog => IDCANCEL\"));\n\telse  myErrorMsg(wxT(\"Generic Dialog => ?\"));\n}\n\nvoid testMessageBox()\n{\n\tint ret = MessageBoxW(0, L\"test yes/no/cancel\", \n            L\"7-Zip\", MB_YESNOCANCEL | MB_ICONQUESTION | MB_TASKMODAL);\n\tif (ret == IDYES) myErrorMsg(wxT(\"MessageBoxW => IDYES\"));\n\telse if (ret == IDNO) myErrorMsg(wxT(\"MessageBoxW => IDNO\"));\n\telse if (ret == IDCANCEL) myErrorMsg(wxT(\"MessageBoxW => IDCANCEL\"));\n\telse  myErrorMsg(wxT(\"MessageBoxW => ?\"));\n}\n\nstatic void testRegistry()\n{\n\tSaveRegLang(L\"fr\");\n\n\tUString langFile;\n\tReadRegLang(langFile);\n\n\tprintf(\"testRegistry : -%ls-\\n\",(const wchar_t *)langFile);\n}\n\n\nint Main2(int argc,TCHAR **argv);\n\nint Main3(int argc,wxChar **argv)\n{\n\ttestRegistry();\n\n\tint num = -1;\n\n\tif (argc >=2 )\n\t{\n\t\tnum = argv[1][0] - L'0';\n\t}\n\tprintf(\"num=%d\\n\",num);\n\n\n\tswitch(num)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\tTCHAR **argv2 = (TCHAR **)calloc(argc,sizeof(*argv));\n\n\t\t\targv2[0] = argv[0];\n\t\t\tfor(int i = 2; i < argc; i++) argv2[i-1] = argv[i];\n\n\t\t\treturn Main2(argc-1,argv2);\n\t\t}\n\t// TODO Benchmark\n\t// TODO CCompressDialog\n\t// TODO CExtractDialog ?\n\t\tcase 1 : testCMessagesDialog();  break;\n\t\tcase 2 : testCOverwriteDialog(); break;\n\t \tcase 3 : testCPasswordDialog();  break;\n\t\tcase 4 : testCProgressDialog();  break;\n\t\tcase 5 : testMessageBox();  break;\n\t\tcase 9 : \n\t\t\tif (argc >= 3)\n\t\t\t{\n\t\t\t\tAString str = GetAnsiString(argv[2]);\n\t\t\t\tint num = atoi((const char*)str);\n\t\t\t\ttestDialog(num);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprintf(\"usage : 7zG 9 <windowID>\\n\");\n\t\t\t}\n\t\t      \tbreak;\n\t\tdefault :\n\t\t\tprintf(\"usage : 7zG number\\n\");\n\n\t};\n\n\treturn 0;\n}\n\n#endif // ACTIVATE_DIALOG_TESTS\n\nstatic const TCHAR *kCUBasePath = TEXT(\"Software/7-ZIP\");\nstatic const WCHAR *kLangValueName = L\"Lang\";\n\nvoid SaveRegLang(const UString &langFile)\n{\n  CKey key;\n  key.Create(HKEY_CURRENT_USER, kCUBasePath);\n  key.SetValue(kLangValueName, langFile);\n}\n\nvoid ReadRegLang(UString &langFile)\n{\n  langFile.Empty();\n  CKey key;\n  if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) == ERROR_SUCCESS)\n    key.QueryValue(kLangValueName, langFile);\n}\n\n\n//////////////////////////////////\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n#include \"myPrivate.h\" // global_use_utf16_conversion\n\nvoid mySplitCommandLineW(int numArguments, TCHAR  **arguments,UStringVector &parts) {\n\n  parts.Clear();\n  for(int ind=0;ind < numArguments; ind++) {\n      UString tmp = arguments[ind];\n      // tmp.Trim(); \" \" is a valid filename ...\n      if (!tmp.IsEmpty()) {\n        parts.Add(tmp);\n// DEBUG printf(\"ARG %d : '%ls'\\n\",ind,(const wchar_t *)tmp);\n      }\n  }\n}\n\n// ----------------------------------------------------------------------------\n// private classes\n// ----------------------------------------------------------------------------\n\n// Define a new frame type\nclass MyFrame: public wxFrame\n{\npublic:\n    // ctor\n    MyFrame(wxFrame *frame, const wxString& title, int x, int y, int w, int h);\n    // virtual ~MyFrame();\n\n    // operations\n    void WriteText(const wxString& text) { m_txtctrl->WriteText(text); }\n    \nprotected:\n    // callbacks\n    void OnWorkerEvent(wxCommandEvent& event);\nprivate:\n    // just some place to put our messages in\n    wxTextCtrl *m_txtctrl;\n    DECLARE_EVENT_TABLE()\n};\n\nenum {\n    WORKER_EVENT=100    // this one gets sent from the worker thread\n};\n    \nBEGIN_EVENT_TABLE(MyFrame, wxFrame)\n    EVT_MENU(WORKER_EVENT, MyFrame::OnWorkerEvent)\n    // EVT_IDLE(MyFrame::OnIdle)\nEND_EVENT_TABLE()\n\n// My frame constructor\nMyFrame::MyFrame(wxFrame *frame, const wxString& title,\n                 int x, int y, int w, int h)\n       : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))\n{\n\tthis->SetIcon(wxICON(p7zip_32));\n    \n#if wxUSE_STATUSBAR\n    CreateStatusBar(2);\n#endif // wxUSE_STATUSBAR\n\n    m_txtctrl = new wxTextCtrl(this, wxID_ANY, _T(\"\"), wxPoint(0, 0), wxSize(0, 0), wxTE_MULTILINE | wxTE_READONLY);\n}\n\nvoid myCreateHandle(int n);\nwxWindow * g_window=0;\n\nvoid MyFrame::OnWorkerEvent(wxCommandEvent& event)\n{\n\tint n = event.GetInt();\n\tmyCreateHandle(n);\n}\n\n\n// Define a new application type, each program should derive a class from wxApp\nclass MyApp : public wxApp\n{\npublic:\n    // override base class virtuals\n    // ----------------------------\n\n    // this one is called on application startup and is a good place for the app\n    // initialization (doing it here and not in the ctor allows to have an error\n    // return: if OnInit() returns false, the application terminates)\n    virtual bool OnInit();\n};\n\n// Create a new application object: this macro will allow wxWidgets to create\n// the application object during program execution (it's better than using a\n// static object for many reasons) and also implements the accessor function\n// wxGetApp() which will return the reference of the right type (i.e. MyApp and\n// not wxApp)\nIMPLEMENT_APP(MyApp)\n\ntime_t g_T0 = 0;\nclass MyThread : public wxThread\n{\n\tint _argc;\n\tTCHAR **_argv;\npublic:\n\tMyThread(int argc,TCHAR **argv): wxThread(),_argc(argc), _argv(argv) {}\n\n\t// thread execution starts here\n\tvirtual void *Entry()\n\t{\n#ifdef ACTIVATE_DIALOG_TESTS\n\t\tint ret = Main3(_argc,_argv);\n#else\n\t\tint ret = Main1(_argc,_argv);\n#endif\n\t\texit(ret);\n\t}\n};\n\n// 'Main program' equivalent: the program execution \"starts\" here\nbool MyApp::OnInit()\n{\n    // don't parse the command-line options !\n    // : if ( !wxApp::OnInit() ) return false;\n\n  { // define P7ZIP_HOME_DIR\n    extern void my_windows_split_path(const AString &p_path, AString &dir , AString &base);\n    static char p7zip_home_dir[MAX_PATH];\n\n    UString fullPath;\n    NDirectory::MyGetFullPathName(wxApp::argv[0], fullPath);\n    AString afullPath = GetAnsiString(fullPath);\n\n    AString dir,name;\n\n    my_windows_split_path(afullPath,dir,name);\n\n    const char *dir2 = nameWindowToUnix((const char *)dir);\n    snprintf(p7zip_home_dir,sizeof(p7zip_home_dir),\"P7ZIP_HOME_DIR=%s/\",dir2);\n    p7zip_home_dir[sizeof(p7zip_home_dir)-1] = 0;\n    putenv(p7zip_home_dir);\n    // DEBUG printf(\"putenv(%s)\\n\",p7zip_home_dir);\n  }\n  global_use_utf16_conversion = 1; // UNICODE !\n\n  g_T0 = time(0);\n  // DEBUG printf(\"MAIN Thread : 0x%lx\\n\",wxThread::GetCurrentId());\n\n   // Create the main frame window\n    MyFrame *frame = new MyFrame((wxFrame *)NULL, _T(\"7-zip Main Window\"), 50, 50, 450, 340);\n   // Don't Show the frame !\n   // frame->Show(true);\n\n    SetTopWindow(frame);\n\n    g_window = frame;\n\n    MyThread *thread = new MyThread(wxApp::argc,wxApp::argv);\n    thread->Create(); //  != wxTHREAD_NO_ERROR\n    thread->Run();\n\n  // success: wxApp::OnRun() will be called which will enter the main message\n  // loop and the application will run. If we returned false here, the\n  // application would exit immediately.\n    return true;\n}\n\nDWORD WINAPI GetTickCount(VOID) {\n\tstatic wxStopWatch sw;\n\treturn sw.Time();\n}\n\n//////////////////////////////////////////\n\n#include \"resource.h\"\n#include \"ExtractRes.h\"\n\nstatic CStringTable g_stringTable[] =\n{\n  /* resource.rc */\t  \n  /***************/\n\t{ IDS_OPEN_TYPE_ALL_FILES, L\"All Files\" },\n\t{ IDS_METHOD_STORE, L\"Store\" },\n\t{ IDS_METHOD_NORMAL, L\"Normal\" },\n\t{ IDS_METHOD_MAXIMUM, L\"Maximum\" },\n\t{ IDS_METHOD_FAST, L\"Fast\" },\n\t{ IDS_METHOD_FASTEST, L\"Fastest\" },\n\t{ IDS_METHOD_ULTRA, L\"Ultra\" },\n\t{ IDS_COMPRESS_NON_SOLID, L\"Non-solid\" },\n\t{ IDS_COMPRESS_SOLID, L\"Solid\" },\n\n\t{ IDS_COMPRESS_UPDATE_MODE_ADD, L\"Add and replace files\" },\n\t{ IDS_COMPRESS_UPDATE_MODE_UPDATE, L\"Update and add files\" },\n\t{ IDS_COMPRESS_UPDATE_MODE_FRESH, L\"Freshen existing files\" },\n\t{ IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE, L\"Synchronize files\" },\n\t{ IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE, L\"Browse\" },\n\t{ IDS_COMPRESS_INCORRECT_VOLUME_SIZE, L\"Incorrect volume size\" },\n\t{ IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE, L\"Specified volume size: {0} bytes.\\nAre you sure you want to split archive into such volumes?\" },\n\n\t{ IDS_PASSWORD_USE_ASCII, L\"Use only English letters, numbers and special characters (!, #, $, ...) for password.\" },\n\t{ IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH, L\"Passwords do not match\" },\n\t{ IDS_PASSWORD_IS_TOO_LONG, L\"Password is too long\" },\n\n\t{ IDS_PROGRESS_COMPRESSING, L\"Compressing\" },\n\t{ IDS_PROGRESS_TESTING, L\"Testing\" },\n\t{ IDS_MESSAGE_NO_ERRORS, L\"There are no errors\" },\n\t{ IDS_FILES_COLON, L\"Files:\" },\n\t{ IDS_FOLDERS_COLON, L\"Folders:\" },\n\t{ IDS_SIZE_COLON, L\"Size:\" },\n\t{ IDS_COMPRESSED_COLON, L\"Compressed size:\" },\n\t{ IDS_ARCHIVES_COLON, L\"Archives:\" },\n\n  /* Extract.rc */\t  \n  /**************/\n\t{ IDS_CANNOT_CREATE_FOLDER , L\"Cannot create folder '{0}'\"},\n\t{ IDS_OPEN_IS_NOT_SUPORTED_ARCHIVE, L\"File is not supported archive.\"},\n\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC , L\"CRC failed in '{0}'. File is broken.\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR , L\"Data error in '{0}'. File is broken\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_UNSUPPORTED_METHOD , L\"Unsupported compression method for '{0}'.\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC_ENCRYPTED , L\"CRC failed in encrypted file '{0}'. Wrong password?\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR_ENCRYPTED , L\"Data error in encrypted file '{0}'. Wrong password?\"},\n\n\t{ IDS_EXTRACT_SET_FOLDER , L\"Specify a location for extracted files.\"},\n\t{ IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CANNOT_OPEN_FILE, L\"Can not open output file '{0}'.\"},\n\t{ IDS_PROGRESS_EXTRACTING, L\"Extracting\" },\n\n\t{ IDS_CANT_OPEN_ARCHIVE , L\"Can not open file '{0}' as archive\"},\n\t{ IDS_CANT_OPEN_ENCRYPTED_ARCHIVE , L\"Can not open encrypted archive '{0}'. Wrong password?\"},\n\n\t{ 0 , 0 }\n};\n\nREGISTER_STRINGTABLE(g_stringTable)\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/AutoPtr.h",
    "content": "// Common/AutoPtr.h\n\n#ifndef __COMMON_AUTOPTR_H\n#define __COMMON_AUTOPTR_H\n\ntemplate<class T> class CMyAutoPtr\n{\n  T *_p;\npublic:\n  CMyAutoPtr(T *p = 0) : _p(p) {}\n  CMyAutoPtr(CMyAutoPtr<T>& p): _p(p.release()) {}\n  CMyAutoPtr<T>& operator=(CMyAutoPtr<T>& p)\n  {\n    reset(p.release());\n    return (*this);\n  }\n  ~CMyAutoPtr() { delete _p; }\n  T& operator*() const { return *_p; }\n  // T* operator->() const { return (&**this); }\n  T* get() const { return _p; }\n  T* release()\n  {\n    T *tmp = _p;\n    _p = 0;\n    return tmp;\n  }\n  void reset(T* p = 0)\n  {\n    if (p != _p)\n      delete _p;\n    _p = p;\n  }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/Buffer.h",
    "content": "// Common/Buffer.h\n\n#ifndef __COMMON_BUFFER_H\n#define __COMMON_BUFFER_H\n\n#include \"Defs.h\"\n\ntemplate <class T> class CBuffer\n{\nprotected:\n  size_t _capacity;\n  T *_items;\npublic:\n  void Free()\n  {\n    delete []_items;\n    _items = 0;\n    _capacity = 0;\n  }\n  CBuffer(): _capacity(0), _items(0) {};\n  CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; }\n  CBuffer(size_t size): _items(0),  _capacity(0) {  SetCapacity(size); }\n  virtual ~CBuffer() { delete []_items; }\n  operator T *() { return _items; };\n  operator const T *() const { return _items; };\n  size_t GetCapacity() const { return  _capacity; }\n  void SetCapacity(size_t newCapacity)\n  {\n    if (newCapacity == _capacity)\n      return;\n    T *newBuffer;\n    if (newCapacity > 0)\n    {\n      newBuffer = new T[newCapacity];\n      if (_capacity > 0)\n        memmove(newBuffer, _items, MyMin(_capacity, newCapacity) * sizeof(T));\n    }\n    else\n      newBuffer = 0;\n    delete []_items;\n    _items = newBuffer;\n    _capacity = newCapacity;\n  }\n  CBuffer& operator=(const CBuffer &buffer)\n  {\n    Free();\n    if (buffer._capacity > 0)\n    {\n      SetCapacity(buffer._capacity);\n      memmove(_items, buffer._items, buffer._capacity * sizeof(T));\n    }\n    return *this;\n  }\n};\n\ntemplate <class T>\nbool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2)\n{\n  if (b1.GetCapacity() != b2.GetCapacity())\n    return false;\n  for (size_t i = 0; i < b1.GetCapacity(); i++)\n    if (b1[i] != b2[i])\n      return false;\n  return true;\n}\n\ntemplate <class T>\nbool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2)\n{\n  return !(b1 == b2);\n}\n\ntypedef CBuffer<char> CCharBuffer;\ntypedef CBuffer<wchar_t> CWCharBuffer;\ntypedef CBuffer<unsigned char> CByteBuffer;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/CRC.cpp",
    "content": "// Common/CRC.cpp\n\n#include \"StdAfx.h\"\n\nextern \"C\"\n{\n#include \"../../C/7zCrc.h\"\n}\n\nstruct CCRCTableInit { CCRCTableInit() { CrcGenerateTable(); } } g_CRCTableInit;\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/C_FileIO.cpp",
    "content": "// Common/C_FileIO.h\n\n#include \"C_FileIO.h\"\n\n#include <fcntl.h>\n#include <unistd.h>\n\nnamespace NC {\nnamespace NFile {\nnamespace NIO {\n\nbool CFileBase::OpenBinary(const char *name, int flags)\n{\n  #ifdef O_BINARY\n  flags |= O_BINARY;\n  #endif\n  Close();\n  _handle = ::open(name, flags, 0666);\n  return _handle != -1;\n}\n\nbool CFileBase::Close()\n{\n  if (_handle == -1)\n    return true;\n  if (close(_handle) != 0)\n    return false;\n  _handle = -1;\n  return true;\n}\n\nbool CFileBase::GetLength(UInt64 &length) const\n{\n  off_t curPos = Seek(0, SEEK_CUR);\n  off_t lengthTemp = Seek(0, SEEK_END);\n  Seek(curPos, SEEK_SET);\n  length = (UInt64)lengthTemp;\n  return true;\n}\n\noff_t CFileBase::Seek(off_t distanceToMove, int moveMethod) const\n{\n  return ::lseek(_handle, distanceToMove, moveMethod);\n}\n\n/////////////////////////\n// CInFile\n\nbool CInFile::Open(const char *name)\n{\n  return CFileBase::OpenBinary(name, O_RDONLY);\n}\n\nbool CInFile::OpenShared(const char *name, bool)\n{\n  return Open(name);\n}\n\nssize_t CInFile::Read(void *data, size_t size)\n{\n  return read(_handle, data, size);\n}\n\n/////////////////////////\n// COutFile\n\nbool COutFile::Create(const char *name, bool createAlways)\n{\n  if (createAlways)\n  {\n    Close();\n    _handle = ::creat(name, 0666);\n    return _handle != -1;\n  }\n  return OpenBinary(name, O_CREAT | O_EXCL | O_WRONLY);\n}\n\nbool COutFile::Open(const char *name, DWORD creationDisposition)\n{\n  return Create(name, false);\n}\n\nssize_t COutFile::Write(const void *data, size_t size)\n{\n  return write(_handle, data, size);\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/C_FileIO.h",
    "content": "// Common/C_FileIO.h\n\n#ifndef __COMMON_C_FILEIO_H\n#define __COMMON_C_FILEIO_H\n\n#include <stdio.h>\n#include <sys/types.h>\n\n#include \"Types.h\"\n#include \"MyWindows.h\"\n\nnamespace NC {\nnamespace NFile {\nnamespace NIO {\n\nclass CFileBase\n{\nprotected:\n  int _handle;\n  bool OpenBinary(const char *name, int flags);\npublic:\n  CFileBase(): _handle(-1) {};\n  ~CFileBase() { Close(); }\n  bool Close();\n  bool GetLength(UInt64 &length) const;\n  off_t Seek(off_t distanceToMove, int moveMethod) const;\n};\n\nclass CInFile: public CFileBase\n{\npublic:\n  bool Open(const char *name);\n  bool OpenShared(const char *name, bool shareForWrite);\n  ssize_t Read(void *data, size_t size);\n};\n\nclass COutFile: public CFileBase\n{\npublic:\n  bool Create(const char *name, bool createAlways);\n  bool Open(const char *name, DWORD creationDisposition);\n  ssize_t Write(const void *data, size_t size);\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/ComTry.h",
    "content": "// ComTry.h\n\n#ifndef __COM_TRY_H\n#define __COM_TRY_H\n\n#include \"MyWindows.h\"\n// #include \"Exception.h\"\n// #include \"NewHandler.h\"\n\n/*#define COM_TRY_BEGIN try {\n#define COM_TRY_END } catch(const char * s) { throw s ; } \\\n\t\tcatch(...) { return E_OUTOFMEMORY; }\n*/\n\n#define COM_TRY_BEGIN {\n#define COM_TRY_END }\n  \n  // catch(const CNewException &) { return E_OUTOFMEMORY; }\\\n  // catch(const CSystemException &e) { return e.ErrorCode; }\\\n  // catch(...) { return E_FAIL; }\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/CommandLineParser.cpp",
    "content": "// CommandLineParser.cpp\n\n#include \"StdAfx.h\"\n\n#include \"CommandLineParser.h\"\n\nnamespace NCommandLineParser {\n\n#ifdef _WIN32\nvoid SplitCommandLine(const UString &src, UString &dest1, UString &dest2)\n{\n  dest1.Empty();\n  dest2.Empty();\n  bool quoteMode = false;\n  int i;\n  for (i = 0; i < src.Length(); i++)\n  {\n    wchar_t c = src[i];\n    if (c == L'\\\"')\n      quoteMode = !quoteMode;\n    else if (c == L' ' && !quoteMode)\n    {\n      i++;\n      break;\n    }\n    else\n      dest1 += c;\n  }\n  dest2 = src.Mid(i);\n}\n\nvoid SplitCommandLine(const UString &s, UStringVector &parts)\n{\n  UString sTemp = s;\n  sTemp.Trim();\n  parts.Clear();\n  for (;;)\n  {\n    UString s1, s2;\n    SplitCommandLine(sTemp, s1, s2);\n    // s1.Trim();\n    // s2.Trim();\n    if (!s1.IsEmpty())\n      parts.Add(s1);\n    if (s2.IsEmpty())\n      break;\n    sTemp = s2;\n  }\n}\n#endif\n\nstatic const wchar_t kSwitchID1 = '-';\n// static const wchar_t kSwitchID2 = '/';\n\nstatic const wchar_t kSwitchMinus = '-';\nstatic const wchar_t *kStopSwitchParsing = L\"--\";\n\nstatic bool IsItSwitchChar(wchar_t c)\n{\n  return (c == kSwitchID1 /*|| c == kSwitchID2 */);\n}\n\nCParser::CParser(int numSwitches):\n  _numSwitches(numSwitches)\n{\n  _switches = new CSwitchResult[_numSwitches];\n}\n\nCParser::~CParser()\n{\n  delete []_switches;\n}\n\nvoid CParser::ParseStrings(const CSwitchForm *switchForms,\n  const UStringVector &commandStrings)\n{\n  int numCommandStrings = commandStrings.Size();\n  bool stopSwitch = false;\n  for (int i = 0; i < numCommandStrings; i++)\n  {\n    const UString &s = commandStrings[i];\n    if (stopSwitch)\n      NonSwitchStrings.Add(s);\n    else\n      if (s == kStopSwitchParsing)\n        stopSwitch = true;\n      else\n        if (!ParseString(s, switchForms))\n          NonSwitchStrings.Add(s);\n  }\n}\n\n// if string contains switch then function updates switch structures\n// out: (string is a switch)\nbool CParser::ParseString(const UString &s, const CSwitchForm *switchForms)\n{\n  int len = s.Length();\n  if (len == 0)\n    return false;\n  int pos = 0;\n  if (!IsItSwitchChar(s[pos]))\n    return false;\n  while (pos < len)\n  {\n    if (IsItSwitchChar(s[pos]))\n      pos++;\n    const int kNoLen = -1;\n    int matchedSwitchIndex = 0; // GCC Warning\n    int maxLen = kNoLen;\n    for (int switchIndex = 0; switchIndex < _numSwitches; switchIndex++)\n    {\n      int switchLen = MyStringLen(switchForms[switchIndex].IDString);\n      if (switchLen <= maxLen || pos + switchLen > len)\n        continue;\n\n      UString temp = s + pos;\n      temp = temp.Left(switchLen);\n      if (temp.CompareNoCase(switchForms[switchIndex].IDString) == 0)\n      // if (_strnicmp(switchForms[switchIndex].IDString, LPCSTR(s) + pos, switchLen) == 0)\n      {\n        matchedSwitchIndex = switchIndex;\n        maxLen = switchLen;\n      }\n    }\n    if (maxLen == kNoLen)\n      throw \"maxLen == kNoLen\";\n    CSwitchResult &matchedSwitch = _switches[matchedSwitchIndex];\n    const CSwitchForm &switchForm = switchForms[matchedSwitchIndex];\n    if ((!switchForm.Multi) && matchedSwitch.ThereIs)\n      throw \"switch must be single\";\n    matchedSwitch.ThereIs = true;\n    pos += maxLen;\n    int tailSize = len - pos;\n    NSwitchType::EEnum type = switchForm.Type;\n    switch(type)\n    {\n      case NSwitchType::kPostMinus:\n        {\n          if (tailSize == 0)\n            matchedSwitch.WithMinus = false;\n          else\n          {\n            matchedSwitch.WithMinus = (s[pos] == kSwitchMinus);\n            if (matchedSwitch.WithMinus)\n              pos++;\n          }\n          break;\n        }\n      case NSwitchType::kPostChar:\n        {\n          if (tailSize < switchForm.MinLen)\n            throw \"switch is not full\";\n          UString set = switchForm.PostCharSet;\n          const int kEmptyCharValue = -1;\n          if (tailSize == 0)\n            matchedSwitch.PostCharIndex = kEmptyCharValue;\n          else\n          {\n            int index = set.Find(s[pos]);\n            if (index < 0)\n              matchedSwitch.PostCharIndex =  kEmptyCharValue;\n            else\n            {\n              matchedSwitch.PostCharIndex = index;\n              pos++;\n            }\n          }\n          break;\n        }\n      case NSwitchType::kLimitedPostString:\n      case NSwitchType::kUnLimitedPostString:\n        {\n          int minLen = switchForm.MinLen;\n          if (tailSize < minLen)\n            throw \"switch is not full\";\n          if (type == NSwitchType::kUnLimitedPostString)\n          {\n            matchedSwitch.PostStrings.Add(s.Mid(pos));\n            return true;\n          }\n          int maxLen = switchForm.MaxLen;\n          UString stringSwitch = s.Mid(pos, minLen);\n          pos += minLen;\n          for (int i = minLen; i < maxLen && pos < len; i++, pos++)\n          {\n            wchar_t c = s[pos];\n            if (IsItSwitchChar(c))\n              break;\n            stringSwitch += c;\n          }\n          matchedSwitch.PostStrings.Add(stringSwitch);\n          break;\n        }\n      case NSwitchType::kSimple:\n          break;\n    }\n  }\n  return true;\n}\n\nconst CSwitchResult& CParser::operator[](size_t index) const\n{\n  return _switches[index];\n}\n\n/////////////////////////////////\n// Command parsing procedures\n\nint ParseCommand(int numCommandForms, const CCommandForm *commandForms,\n    const UString &commandString, UString &postString)\n{\n  for (int i = 0; i < numCommandForms; i++)\n  {\n    const UString id = commandForms[i].IDString;\n    if (commandForms[i].PostStringMode)\n    {\n      if (commandString.Find(id) == 0)\n      {\n        postString = commandString.Mid(id.Length());\n        return i;\n      }\n    }\n    else\n      if (commandString == id)\n      {\n        postString.Empty();\n        return i;\n      }\n  }\n  return -1;\n}\n   \n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/CommandLineParser.h",
    "content": "// Common/CommandLineParser.h\n\n#ifndef __COMMON_COMMANDLINEPARSER_H\n#define __COMMON_COMMANDLINEPARSER_H\n\n#include \"MyString.h\"\n\nnamespace NCommandLineParser {\n\nvoid SplitCommandLine(const UString &src, UString &dest1, UString &dest2);\nvoid SplitCommandLine(const UString &s, UStringVector &parts);\n\nnamespace NSwitchType {\n  enum EEnum\n  {\n    kSimple,\n    kPostMinus,\n    kLimitedPostString,\n    kUnLimitedPostString,\n    kPostChar\n  };\n}\n\nstruct CSwitchForm\n{\n  const wchar_t *IDString;\n  NSwitchType::EEnum Type;\n  bool Multi;\n  int MinLen;\n  int MaxLen;\n  const wchar_t *PostCharSet;\n};\n\nstruct CSwitchResult\n{\n  bool ThereIs;\n  bool WithMinus;\n  UStringVector PostStrings;\n  int PostCharIndex;\n  CSwitchResult(): ThereIs(false) {};\n};\n  \nclass CParser\n{\n  int _numSwitches;\n  CSwitchResult *_switches;\n  bool ParseString(const UString &s, const CSwitchForm *switchForms);\npublic:\n  UStringVector NonSwitchStrings;\n  CParser(int numSwitches);\n  ~CParser();\n  void ParseStrings(const CSwitchForm *switchForms,\n    const UStringVector &commandStrings);\n  const CSwitchResult& operator[](size_t index) const;\n};\n\n/////////////////////////////////\n// Command parsing procedures\n\nstruct CCommandForm\n{\n  wchar_t *IDString;\n  bool PostStringMode;\n};\n\n// Returns: Index of form and postString; -1, if there is no match\nint ParseCommand(int numCommandForms, const CCommandForm *commandForms,\n    const UString &commandString, UString &postString);\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/Defs.h",
    "content": "// Common/Defs.h\n\n#ifndef __COMMON_DEFS_H\n#define __COMMON_DEFS_H\n\ntemplate <class T> inline T MyMin(T a, T b)\n  {  return a < b ? a : b; }\ntemplate <class T> inline T MyMax(T a, T b)\n  {  return a > b ? a : b; }\n\ntemplate <class T> inline int MyCompare(T a, T b)\n  {  return a < b ? -1 : (a == b ? 0 : 1); }\n\ninline int BoolToInt(bool value)\n  { return (value ? 1: 0); }\n\ninline bool IntToBool(int value)\n  { return (value != 0); }\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/DynamicBuffer.h",
    "content": "// Common/DynamicBuffer.h\n\n#ifndef __COMMON_DYNAMICBUFFER_H\n#define __COMMON_DYNAMICBUFFER_H\n\n#include \"Buffer.h\"\n\ntemplate <class T> class CDynamicBuffer: public CBuffer<T>\n{\n  void GrowLength(size_t size)\n  {\n    size_t delta;\n    if (this->_capacity > 64)\n      delta = this->_capacity / 4;\n    else if (this->_capacity > 8)\n      delta = 16;\n    else\n      delta = 4;\n    delta = MyMax(delta, size);\n    this->SetCapacity(this->_capacity + delta);\n  }\npublic:\n  CDynamicBuffer(): CBuffer<T>() {};\n  CDynamicBuffer(const CDynamicBuffer &buffer): CBuffer<T>(buffer) {};\n  CDynamicBuffer(size_t size): CBuffer<T>(size) {};\n  CDynamicBuffer& operator=(const CDynamicBuffer &buffer)\n  {\n    this->Free();\n    if (buffer._capacity > 0)\n    {\n      SetCapacity(buffer._capacity);\n      memmove(this->_items, buffer._items, buffer._capacity * sizeof(T));\n    }\n    return *this;\n  }\n  void EnsureCapacity(size_t capacity)\n  {\n    if (this->_capacity < capacity)\n      GrowLength(capacity - this->_capacity);\n  }\n};\n\ntypedef CDynamicBuffer<char> CCharDynamicBuffer;\ntypedef CDynamicBuffer<wchar_t> CWCharDynamicBuffer;\ntypedef CDynamicBuffer<unsigned char> CByteDynamicBuffer;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/IntToString.cpp",
    "content": "// Common/IntToString.cpp\n\n#include \"StdAfx.h\"\n\n#include \"IntToString.h\"\n\nvoid ConvertUInt64ToString(UInt64 value, char *s, UInt32 base)\n{\n  if (base < 2 || base > 36)\n  {\n    *s = '\\0';\n    return;\n  }\n  char temp[72];\n  int pos = 0;\n  do\n  {\n    int delta = (int)(value % base);\n    temp[pos++] = (char)((delta < 10) ? ('0' + delta) : ('a' + (delta - 10)));\n    value /= base;\n  }\n  while (value != 0);\n  do\n    *s++ = temp[--pos];\n  while (pos > 0);\n  *s = '\\0';\n}\n\nvoid ConvertUInt64ToString(UInt64 value, wchar_t *s)\n{\n  wchar_t temp[32];\n  int pos = 0;\n  do\n  {\n    temp[pos++] = (wchar_t)(L'0' + (int)(value % 10));\n    value /= 10;\n  }\n  while (value != 0);\n  do\n    *s++ = temp[--pos];\n  while (pos > 0);\n  *s = L'\\0';\n}\n\nvoid ConvertInt64ToString(Int64 value, char *s)\n{\n  if (value < 0)\n  {\n    *s++ = '-';\n    value = -value;\n  }\n  ConvertUInt64ToString(value, s);\n}\n\nvoid ConvertInt64ToString(Int64 value, wchar_t *s)\n{\n  if (value < 0)\n  {\n    *s++ = L'-';\n    value = -value;\n  }\n  ConvertUInt64ToString(value, s);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/IntToString.h",
    "content": "// Common/IntToString.h\n\n#ifndef __COMMON_INTTOSTRING_H\n#define __COMMON_INTTOSTRING_H\n\n#include <stddef.h>\n#include \"Types.h\"\n\nvoid ConvertUInt64ToString(UInt64 value, char *s, UInt32 base = 10);\nvoid ConvertUInt64ToString(UInt64 value, wchar_t *s);\n\nvoid ConvertInt64ToString(Int64 value, char *s);\nvoid ConvertInt64ToString(Int64 value, wchar_t *s);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/Lang.cpp",
    "content": "// Common/Lang.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Lang.h\"\n#include \"TextConfig.h\"\n\n#include \"../Windows/FileIO.h\"\n#include \"UTFConvert.h\"\n#include \"Defs.h\"\n\nstatic bool HexStringToNumber(const UString &s, UInt32 &value)\n{\n  value = 0;\n  if (s.IsEmpty())\n    return false;\n  for (int i = 0; i < s.Length(); i++)\n  {\n    wchar_t c = s[i];\n    int a;\n    if (c >= L'0' && c <= L'9')\n      a = c - L'0';\n    else if (c >= L'A' && c <= L'F')\n      a = 10 + c - L'A';\n    else if (c >= L'a' && c <= L'f')\n      a = 10 + c - L'a';\n    else\n      return false;\n    value *= 0x10;\n    value += a;\n  }\n  return true;\n}\n\n\nstatic bool WaitNextLine(const AString &s, int &pos)\n{\n  for (; pos < s.Length(); pos++)\n    if (s[pos] == 0x0A)\n      return true;\n  return false;\n}\n\nstatic int CompareLangItems(void *const *elem1, void *const *elem2, void *)\n{\n  const CLangPair &langPair1 = *(*((const CLangPair **)elem1));\n  const CLangPair &langPair2 = *(*((const CLangPair **)elem2));\n  return MyCompare(langPair1.Value, langPair2.Value);\n}\n\nbool CLang::Open(LPCWSTR fileName)\n{\n  _langPairs.Clear();\n  NWindows::NFile::NIO::CInFile file;\n  if (!file.Open(fileName))\n    return false;\n  UInt64 length;\n  if (!file.GetLength(length))\n    return false;\n  if (length > (1 << 20))\n    return false;\n  AString s;\n  char *p = s.GetBuffer((int)length + 1);\n  UInt32 processed;\n  if (!file.Read(p, (UInt32)length, processed))\n    return false;\n  p[(UInt32)length] = 0;\n  s.ReleaseBuffer();\n  file.Close();\n  int pos = 0;\n  if (s.Length() >= 3)\n  {\n    if (Byte(s[0]) == 0xEF && Byte(s[1]) == 0xBB && Byte(s[2]) == 0xBF)\n      pos += 3;\n  }\n\n  /////////////////////\n  // read header\n\n  AString stringID = \";!@Lang@!UTF-8!\";\n  if (s.Mid(pos, stringID.Length()) != stringID)\n    return false;\n  pos += stringID.Length();\n  \n  if (!WaitNextLine(s, pos))\n    return false;\n\n  CObjectVector<CTextConfigPair> pairs;\n  if (!GetTextConfig(s.Mid(pos), pairs))\n    return false;\n\n  _langPairs.Reserve(_langPairs.Size());\n  for (int i = 0; i < pairs.Size(); i++)\n  {\n    CTextConfigPair textConfigPair = pairs[i];\n    CLangPair langPair;\n    if (!HexStringToNumber(textConfigPair.ID, langPair.Value))\n      return false;\n    langPair.String = textConfigPair.String;\n    _langPairs.Add(langPair);\n  }\n  _langPairs.Sort(CompareLangItems, NULL);\n  return true;\n}\n\nint CLang::FindItem(UInt32 value) const\n{\n  int left = 0, right = _langPairs.Size();\n  while (left != right)\n  {\n    UInt32 mid = (left + right) / 2;\n    UInt32 midValue = _langPairs[mid].Value;\n    if (value == midValue)\n      return mid;\n    if (value < midValue)\n      right = mid;\n    else\n      left = mid + 1;\n  }\n  return -1;\n}\n\nbool CLang::GetMessage(UInt32 value, UString &message) const\n{\n  int index =  FindItem(value);\n  if (index < 0)\n    return false;\n  message = _langPairs[index].String;\n  return true;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/Lang.h",
    "content": "// Common/Lang.h\n\n#ifndef __COMMON_LANG_H\n#define __COMMON_LANG_H\n\n#include \"MyVector.h\"\n#include \"MyString.h\"\n#include \"Types.h\"\n\nstruct CLangPair\n{\n  UInt32 Value;\n  UString String;\n};\n\nclass CLang\n{\n  CObjectVector<CLangPair> _langPairs;\npublic:\n  bool Open(LPCWSTR fileName);\n  void Clear() { _langPairs.Clear(); }\n  int FindItem(UInt32 value) const;\n  bool GetMessage(UInt32 value, UString &message) const;\n};\n\n#endif\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/ListFileUtils.cpp",
    "content": "// Common/ListFileUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"MyWindows.h\"\n#include \"../Windows/FileIO.h\"\n\n#include \"ListFileUtils.h\"\n#include \"StringConvert.h\"\n#include \"UTFConvert.h\"\n\nstatic const char kQuoteChar     = '\\\"';\nstatic void RemoveQuote(UString &s)\n{\n  if (s.Length() >= 2)\n    if (s[0] == kQuoteChar && s[s.Length() - 1] == kQuoteChar)\n      s = s.Mid(1, s.Length() - 2);\n}\n\nbool ReadNamesFromListFile(LPCWSTR fileName, UStringVector &resultStrings, UINT codePage)\n{\n  NWindows::NFile::NIO::CInFile file;\n  if (!file.Open(fileName,true)) /* follow the symbolic link */\n    return false;\n  UInt64 length;\n  if (!file.GetLength(length))\n    return false;\n  if (length > ((UInt32)1 << 31))\n    return false;\n  AString s;\n  char *p = s.GetBuffer((int)length + 1);\n  UInt32 processed;\n  if (!file.Read(p, (UInt32)length, processed))\n    return false;\n  p[(UInt32)length] = 0;\n  s.ReleaseBuffer();\n  file.Close();\n\n  UString u;\n  #ifdef CP_UTF8\n  if (codePage == CP_UTF8)\n  {\n    if (!ConvertUTF8ToUnicode(s, u))\n      return false;\n  }\n  else\n  #endif\n    u = MultiByteToUnicodeString(s, codePage);\n  if (!u.IsEmpty())\n  {\n    if (u[0] == 0xFEFF)\n      u.Delete(0);\n  }\n\n  UString t;\n  for (int i = 0; i < u.Length(); i++)\n  {\n    wchar_t c = u[i];\n    if (c == L'\\n' || c == 0xD)\n    {\n      t.Trim();\n      RemoveQuote(t);\n      if (!t.IsEmpty())\n        resultStrings.Add(t);\n      t.Empty();\n    }\n    else\n      t += c;\n  }\n  t.Trim();\n  RemoveQuote(t);\n  if (!t.IsEmpty())\n    resultStrings.Add(t);\n  return true;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/ListFileUtils.h",
    "content": "// Common/ListFileUtils.h\n\n#ifndef __COMMON_LISTFILEUTILS_H\n#define __COMMON_LISTFILEUTILS_H\n\n#include \"MyString.h\"\n#include \"Types.h\"\n\nbool ReadNamesFromListFile(LPCWSTR fileName, UStringVector &strings, UINT codePage = CP_OEMCP);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyCom.h",
    "content": "// MyCom.h\n\n#ifndef __MYCOM_H\n#define __MYCOM_H\n\n#include \"MyWindows.h\"\n\n#ifndef RINOK\n#define RINOK(x) { HRESULT __result_ = (x); if (__result_ != S_OK) return __result_; }\n#endif\n\ntemplate <class T>\nclass CMyComPtr\n{\n  T* _p;\npublic:\n  // typedef T _PtrClass;\n  CMyComPtr() { _p = NULL;}\n  CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }\n  CMyComPtr(const CMyComPtr<T>& lp)\n  {\n    if ((_p = lp._p) != NULL)\n      _p->AddRef();\n  }\n  ~CMyComPtr() { if (_p) _p->Release(); }\n  void Release() { if (_p) { _p->Release(); _p = NULL; } }\n  operator T*() const {  return (T*)_p;  }\n  // T& operator*() const {  return *_p; }\n  T** operator&() { return &_p; }\n  T* operator->() const { return _p; }\n  T* operator=(T* p)\n  {\n    if (p != 0)\n      p->AddRef();\n    if (_p)\n      _p->Release();\n    _p = p;\n    return p;\n  }\n  T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }\n  bool operator!() const { return (_p == NULL); }\n  // bool operator==(T* pT) const {  return _p == pT; }\n  // Compare two objects for equivalence\n  void Attach(T* p2)\n  {\n    Release();\n    _p = p2;\n  }\n  T* Detach()\n  {\n    T* pt = _p;\n    _p = NULL;\n    return pt;\n  }\n  #ifdef _WIN32\n  HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)\n  {\n    return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);\n  }\n  #endif\n  /*\n  HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)\n  {\n    CLSID clsid;\n    HRESULT hr = CLSIDFromProgID(szProgID, &clsid);\n    ATLASSERT(_p == NULL);\n    if (SUCCEEDED(hr))\n      hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);\n    return hr;\n  }\n  */\n  template <class Q>\n  HRESULT QueryInterface(REFGUID iid, Q** pp) const\n  {\n    return _p->QueryInterface(iid, (void**)pp);\n  }\n};\n\n//////////////////////////////////////////////////////////\n\ninline HRESULT StringToBstr(LPCOLESTR src, BSTR *bstr)\n{\n  *bstr = ::SysAllocString(src);\n  return (*bstr != 0) ? S_OK : E_OUTOFMEMORY;\n}\n\nclass CMyComBSTR\n{\npublic:\n  BSTR m_str;\n  CMyComBSTR(): m_str(NULL) {}\n  CMyComBSTR(LPCOLESTR src) { m_str = ::SysAllocString(src); }\n  // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }\n  // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize);  }\n  CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }\n  /*\n  CMyComBSTR(REFGUID src)\n  {\n    LPOLESTR szGuid;\n    StringFromCLSID(src, &szGuid);\n    m_str = ::SysAllocString(szGuid);\n    CoTaskMemFree(szGuid);\n  }\n  */\n  ~CMyComBSTR() { ::SysFreeString(m_str); }\n  CMyComBSTR& operator=(const CMyComBSTR& src)\n  {\n    if (m_str != src.m_str)\n    {\n      if (m_str)\n        ::SysFreeString(m_str);\n      m_str = src.MyCopy();\n    }\n    return *this;\n  }\n  CMyComBSTR& operator=(LPCOLESTR src)\n  {\n    ::SysFreeString(m_str);\n    m_str = ::SysAllocString(src);\n    return *this;\n  }\n  unsigned int Length() const { return ::SysStringLen(m_str); }\n  operator BSTR() const { return m_str; }\n  BSTR* operator&() { return &m_str; }\n  BSTR MyCopy() const\n  {\n    int byteLen = ::SysStringByteLen(m_str);\n    BSTR res = ::SysAllocStringByteLen(NULL, byteLen);\n    memcpy(res, m_str, byteLen);\n    return res;\n  }\n  /*\n  void Attach(BSTR src) { m_str = src; }\n  BSTR Detach()\n  {\n    BSTR s = m_str;\n    m_str = NULL;\n    return s;\n  }\n  */\n  void Empty()\n  {\n    ::SysFreeString(m_str);\n    m_str = NULL;\n  }\n  bool operator!() const {  return (m_str == NULL); }\n};\n\n//////////////////////////////////////////////////////////\n\nclass CMyUnknownImp\n{\npublic:\n  ULONG __m_RefCount;\n  CMyUnknownImp(): __m_RefCount(0) {}\n};\n\n#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \\\n    (REFGUID iid, void **outObject) {\n\n#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \\\n    { *outObject = (void *)(i *)this; AddRef(); return S_OK; }\n\n#define MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) if (iid == IID_IUnknown) \\\n    { *outObject = (void *)(IUnknown *)(i *)this; AddRef(); return S_OK; }\n\n#define MY_QUERYINTERFACE_BEGIN2(i) MY_QUERYINTERFACE_BEGIN \\\n    MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \\\n    MY_QUERYINTERFACE_ENTRY(i)\n\n#define MY_QUERYINTERFACE_END return E_NOINTERFACE; }\n\n#define MY_ADDREF_RELEASE \\\nSTDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \\\nSTDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0)  \\\n  return __m_RefCount; delete this; return 0; }\n\n#define MY_UNKNOWN_IMP_SPEC(i) \\\n  MY_QUERYINTERFACE_BEGIN \\\n  i \\\n  MY_QUERYINTERFACE_END \\\n  MY_ADDREF_RELEASE\n\n\n#define MY_UNKNOWN_IMP MY_QUERYINTERFACE_BEGIN \\\n  MY_QUERYINTERFACE_ENTRY_UNKNOWN(IUnknown) \\\n  MY_QUERYINTERFACE_END \\\n  MY_ADDREF_RELEASE\n\n#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \\\n  MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \\\n  MY_QUERYINTERFACE_ENTRY(i) \\\n  )\n\n#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \\\n  MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i2) \\\n  )\n\n#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \\\n  MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i2) \\\n  MY_QUERYINTERFACE_ENTRY(i3) \\\n  )\n\n#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \\\n  MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i2) \\\n  MY_QUERYINTERFACE_ENTRY(i3) \\\n  MY_QUERYINTERFACE_ENTRY(i4) \\\n  )\n\n#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \\\n  MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i1) \\\n  MY_QUERYINTERFACE_ENTRY(i2) \\\n  MY_QUERYINTERFACE_ENTRY(i3) \\\n  MY_QUERYINTERFACE_ENTRY(i4) \\\n  MY_QUERYINTERFACE_ENTRY(i5) \\\n  )\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyException.h",
    "content": "// Common/Exception.h\n\n#ifndef __COMMON_EXCEPTION_H\n#define __COMMON_EXCEPTION_H\n\n#include \"MyWindows.h\"\n\nstruct CSystemException\n{\n  HRESULT ErrorCode;\n  CSystemException(HRESULT errorCode): ErrorCode(errorCode) {}\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyGuidDef.h",
    "content": "// Common/MyGuidDef.h\n\n#ifndef GUID_DEFINED\n#define GUID_DEFINED\n\n#include \"Types.h\"\n\ntypedef struct {\n  UInt32 Data1;\n  UInt16 Data2;\n  UInt16 Data3;\n  unsigned char Data4[8];\n} GUID;\n\n#ifdef __cplusplus\n#define REFGUID const GUID &\n#else\n#define REFGUID const GUID *\n#endif\n\n#define REFCLSID REFGUID\n#define REFIID REFGUID\n\n#ifdef __cplusplus\ninline int operator==(REFGUID g1, REFGUID g2)\n{\n  for (int i = 0; i < (int)sizeof(g1); i++)\n    if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i])\n      return 0;\n  return 1;\n}\ninline int operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); }\n#endif\n\n#ifdef __cplusplus\n  #define MY_EXTERN_C extern \"C\"\n#else\n  #define MY_EXTERN_C extern\n#endif\n\n#endif // GUID_DEFINED\n\n\n#ifdef DEFINE_GUID\n#undef DEFINE_GUID\n#endif\n\n#ifdef INITGUID\n  #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\\n    MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }\n#else\n  #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\\n    MY_EXTERN_C const GUID name\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyInitGuid.h",
    "content": "// Common/MyInitGuid.h\n\n#ifndef __COMMON_MYINITGUID_H\n#define __COMMON_MYINITGUID_H\n\n#ifdef _WIN32\n#include <initguid.h>\n#else\n#define INITGUID\n#include \"MyGuidDef.h\"\nDEFINE_GUID(IID_IUnknown,\n0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyMap.cpp",
    "content": "// MyMap.cpp\n\n#include \"StdAfx.h\"\n\n#include \"MyMap.h\"\n\nstatic const unsigned kNumBitsMax = sizeof(UInt32) * 8;\n\nstatic UInt32 GetSubBits(UInt32 value, unsigned startPos, unsigned numBits)\n{\n  if (startPos == sizeof(value) * 8)\n    return 0;\n  value >>= startPos;\n  if (numBits == sizeof(value) * 8)\n    return value;\n  return value & (((UInt32)1 << numBits) - 1);\n}\n\nstatic inline unsigned GetSubBit(UInt32 v, unsigned n) { return (unsigned)(v >> n) & 1; }\n\nbool CMap32::Find(UInt32 key, UInt32 &valueRes) const\n{\n  valueRes = (UInt32)(Int32)-1;\n  if (Nodes.Size() == 0)\n    return false;\n  if (Nodes.Size() == 1)\n  {\n    const CNode &n = Nodes[0];\n    if (n.Len == kNumBitsMax)\n    {\n      valueRes = n.Values[0];\n      return (key == n.Key);\n    }\n  }\n\n  int cur = 0;\n  unsigned bitPos = kNumBitsMax;\n  for (;;)\n  {\n    const CNode &n = Nodes[cur];\n    bitPos -= n.Len;\n    if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))\n      return false;\n    unsigned bit = GetSubBit(key, --bitPos);\n    if (n.IsLeaf[bit])\n    {\n      valueRes = n.Values[bit];\n      return (key == n.Keys[bit]);\n    }\n    cur = (int)n.Keys[bit];\n  }\n}\n\nbool CMap32::Set(UInt32 key, UInt32 value)\n{\n  if (Nodes.Size() == 0)\n  {\n    CNode n;\n    n.Key = n.Keys[0] = n.Keys[1] = key;\n    n.Values[0] = n.Values[1] = value;\n    n.IsLeaf[0] = n.IsLeaf[1] = 1;\n    n.Len = kNumBitsMax;\n    Nodes.Add(n);\n    return false;\n  }\n  if (Nodes.Size() == 1)\n  {\n    CNode &n = Nodes[0];\n    if (n.Len == kNumBitsMax)\n    {\n      if (key == n.Key)\n      {\n        n.Values[0] = n.Values[1] = value;\n        return true;\n      }\n      unsigned i = kNumBitsMax - 1;\n      for (;GetSubBit(key, i) == GetSubBit(n.Key, i); i--);\n      n.Len = (UInt16)(kNumBitsMax - (1 + i));\n      unsigned newBit = GetSubBit(key, i);\n      n.Values[newBit] = value;\n      n.Keys[newBit] = key;\n      return false;\n    }\n  }\n\n  int cur = 0;\n  unsigned bitPos = kNumBitsMax;\n  for (;;)\n  {\n    CNode &n = Nodes[cur];\n    bitPos -= n.Len;\n    if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))\n    {\n      unsigned i = n.Len - 1;\n      for (; GetSubBit(key, bitPos + i) == GetSubBit(n.Key, bitPos + i); i--);\n      \n      CNode e2(n);\n      e2.Len = (UInt16)i;\n\n      n.Len = (UInt16)(n.Len - (1 + i));\n      unsigned newBit = GetSubBit(key, bitPos + i);\n      n.Values[newBit] = value;\n      n.IsLeaf[newBit] = 1;\n      n.IsLeaf[1 - newBit] = 0;\n      n.Keys[newBit] = key;\n      n.Keys[1 - newBit] = Nodes.Size();\n      Nodes.Add(e2);\n      return false;\n    }\n    unsigned bit = GetSubBit(key, --bitPos);\n\n    if (n.IsLeaf[bit])\n    {\n      if (key == n.Keys[bit])\n      {\n        n.Values[bit] = value;\n        return true;\n      }\n      unsigned i = bitPos - 1;\n      for (;GetSubBit(key, i) == GetSubBit(n.Keys[bit], i); i--);\n     \n      CNode e2;\n      \n      unsigned newBit = GetSubBit(key, i);\n      e2.Values[newBit] = value;\n      e2.Values[1 - newBit] = n.Values[bit];\n      e2.IsLeaf[newBit] = e2.IsLeaf[1 - newBit] = 1;\n      e2.Keys[newBit] = key;\n      e2.Keys[1 - newBit] = e2.Key = n.Keys[bit];\n      e2.Len = (UInt16)(bitPos - (1 + i));\n\n      n.IsLeaf[bit] = 0;\n      n.Keys[bit] = Nodes.Size();\n\n      Nodes.Add(e2);\n      return false;\n    }\n    cur = (int)n.Keys[bit];\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyMap.h",
    "content": "// MyMap.h\n\n#ifndef __COMMON_MYMAP_H\n#define __COMMON_MYMAP_H\n\n#include \"MyVector.h\"\n#include \"Types.h\"\n\nclass CMap32\n{\n  struct CNode\n  {\n    UInt32 Key;\n    UInt32 Keys[2];\n    UInt32 Values[2];\n    UInt16 Len;\n    Byte IsLeaf[2];\n  };\n  CRecordVector<CNode> Nodes;\n\npublic:\n\n  void Clear() { Nodes.Clear(); }\n  bool Find(UInt32 key, UInt32 &valueRes) const;\n  bool Set(UInt32 key, UInt32 value); // returns true, if there is such key already\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyString.cpp",
    "content": "// Common/String.cpp\n\n#include \"StdAfx.h\"\n\n#include <ctype.h>\n#ifdef HAVE_WCTYPE_H\n#include <wctype.h>\n#endif\n#include \"StringConvert.h\" // FIXED\n\n#include \"MyString.h\" // FIXED to avoid confusion with <string.h> on some filesystems\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#ifdef HAVE_WCHAR__H\n#include <wchar.h>\n#endif\n\n#include <limits.h>\n#ifndef MB_LEN_MAX\n#define MB_LEN_MAX 1024\n#endif\n\n#include \"myPrivate.h\"\n\nLPSTR WINAPI CharPrevA( LPCSTR start, LPCSTR ptr ) { // OK for MBS\n  while (*start && (start < ptr)) {\n    LPCSTR next = CharNextA( start );\n    if (next >= ptr)\n      break;\n    start = next;\n  }\n  return (LPSTR)start;\n}\n\nLPSTR WINAPI CharNextA( LPCSTR ptr ) {\n  if (!*ptr)\n    return (LPSTR)ptr;\n// #ifdef HAVE_MBRTOWC\n//  if (global_use_utf16_conversion)\n//  {\n//    wchar_t wc;\n//    size_t len  = mbrtowc(&wc,ptr,MB_LEN_MAX,0);  // mbrtowc stales on some configurations.\n//    if (len >= 1) return (LPSTR)(ptr + len);\n//    printf(\"INTERNAL ERROR - CharNextA\\n\");\n//    exit(EXIT_FAILURE);\n//  } else {\n//    return (LPSTR)(ptr + 1);\n//  }\n//#else\n  return (LPSTR)(ptr + 1); // p7zip search only for ASCII characters like '/' so no need to worry about current locale\n//#endif\n}\n\nwchar_t MyCharLower(wchar_t c)\n{\n#ifdef HAVE_TOWUPPER\n   return towlower(c);\n#else\n   int ret = c;\n   if ((ret >= 1) && (ret <256)) ret = tolower(ret);\n   return (wchar_t)ret;\n#endif\n}\n\nchar * MyStringLower(char *s)\n{\n  if (s == 0)\n    return 0;\n  char *ret = s;\n  while (*s)\n  {\n   *s = MyCharLower(*s);\n    s++;\n  }\n  return ret;\n}\n\nwchar_t * MyStringLower(wchar_t *s)\n{\n  if (s == 0)\n    return 0;\n  wchar_t *ret = s;\n  while (*s)\n  {\n   *s = MyCharLower(*s);\n    s++;\n  }\n  return ret;\n}\n\nwchar_t MyCharUpper(wchar_t c)\n{\n#ifdef HAVE_TOWUPPER\n   return towupper(c);\n#else\n   int ret = c;\n   if ((ret >= 1) && (ret <256)) ret = toupper(ret);\n   return (wchar_t)ret;\n#endif\n}\n\nwchar_t * MyStringUpper(wchar_t *s)\n{\n  if (s == 0)\n    return 0;\n  wchar_t *ret = s;\n  while (*s)\n  {\n   *s = MyCharUpper(*s);\n    s++;\n  }\n  return ret;\n}\n\nint MyStringCompare(const char *s1, const char *s2)\n{\n  while (true)\n  {\n    unsigned char c1 = (unsigned char)*s1++;\n    unsigned char c2 = (unsigned char)*s2++;\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    if (c1 == 0) return 0;\n  }\n}\n\nint MyStringCompare(const wchar_t *s1, const wchar_t *s2)\n{\n  while (true)\n  {\n    wchar_t c1 = *s1++;\n    wchar_t c2 = *s2++;\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    if (c1 == 0) return 0;\n  }\n}\n\nint MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2)\n{\n  while (true)\n  {\n    wchar_t c1 = *s1++;\n    wchar_t c2 = *s2++;\n    if (c1 != c2)\n    {\n      wchar_t u1 = MyCharUpper(c1);\n      wchar_t u2 = MyCharUpper(c2);\n      if (u1 < u2) return -1;\n      if (u1 > u2) return 1;\n    }\n    if (c1 == 0) return 0;\n  }\n}\n\nint MyStringCompareNoCase(const char *s1, const char *s2)\n{\n  return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2));\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyString.h",
    "content": "// Common/String.h\n\n#ifndef __COMMON_STRING_H\n#define __COMMON_STRING_H\n\n#include <string.h>\n// #include <wchar.h>\n\n#include \"MyVector.h\"\n\nLPSTR WINAPI CharNextA( LPCSTR ptr );\nLPSTR WINAPI CharPrevA( LPCSTR start, LPCSTR ptr );\n\ntemplate <class T>\ninline int MyStringLen(const T *s)\n{\n  int i;\n  for (i = 0; s[i] != '\\0'; i++);\n  return i;\n}\n\ntemplate <class T>\ninline T * MyStringCopy(T *dest, const T *src)\n{\n  T *destStart = dest;\n  while ((*dest++ = *src++) != 0);\n  return destStart;\n}\n\ninline wchar_t* MyStringGetNextCharPointer(wchar_t *p)\n  { return (p + 1); }\ninline const wchar_t* MyStringGetNextCharPointer(const wchar_t *p)\n  { return (p + 1); }\ninline wchar_t* MyStringGetPrevCharPointer(const wchar_t *, wchar_t *p)\n  { return (p - 1); }\ninline const wchar_t* MyStringGetPrevCharPointer(const wchar_t *, const wchar_t *p)\n  { return (p - 1); }\n\nwchar_t MyCharUpper(wchar_t c);\nchar * MyStringUpper(char *s);\nwchar_t * MyStringUpper(wchar_t *s);\n\nchar * MyStringLower(char *s);\nwchar_t * MyStringLower(wchar_t *s);\n\n\ninline char* MyStringGetPrevCharPointer(char *base, char *p)\n  { return CharPrevA(base, p); }\ninline const char* MyStringGetPrevCharPointer(const char *base, const char *p)\n  { return CharPrevA(base, p); }\ninline char* MyStringGetNextCharPointer(char *p)\n  { return CharNextA(p); }\ninline const char* MyStringGetNextCharPointer(const char *p)\n  { return CharNextA(p); }\n\n//////////////////////////////////////\n// Compare\n\n/*\n#ifndef _WIN32_WCE\nint MyStringCollate(const char *s1, const char *s2);\nint MyStringCollateNoCase(const char *s1, const char *s2);\n#endif\nint MyStringCollate(const wchar_t *s1, const wchar_t *s2);\nint MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2);\n*/\n\nint MyStringCompare(const char *s1, const char  *s2);\nint MyStringCompare(const wchar_t *s1, const wchar_t *s2);\n\n// int MyStringCompareNoCase(const char *s1, const char  *s2);\nint MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2);\n\ntemplate <class T>\nclass CStringBase\n{\n  void TrimLeftWithCharSet(const CStringBase &charSet)\n  {\n    const T *p = _chars;\n    while (charSet.Find(*p) >= 0 && (*p != 0))\n      p = GetNextCharPointer(p);\n    Delete(0, (int)(p - _chars));\n  }\n  void TrimRightWithCharSet(const CStringBase &charSet)\n  {\n    const T *p = _chars;\n    const T *pLast = NULL;\n    while (*p != 0)\n    {\n      if (charSet.Find(*p) >= 0)\n      {\n        if (pLast == NULL)\n          pLast = p;\n      }\n      else\n        pLast = NULL;\n      p = GetNextCharPointer(p);\n    }\n    if (pLast != NULL)\n    {\n      int i = (int)(pLast - _chars);\n      Delete(i, _length - i);\n    }\n\n  }\n  void MoveItems(int destIndex, int srcIndex)\n  {\n    memmove(_chars + destIndex, _chars + srcIndex,\n        sizeof(T) * (_length - srcIndex + 1));\n  }\n  \n  void InsertSpace(int &index, int size)\n  {\n    CorrectIndex(index);\n    GrowLength(size);\n    MoveItems(index + size, index);\n  }\n\n  static T *GetNextCharPointer(T *p)\n    { return MyStringGetNextCharPointer(p); }\n  static const T *GetNextCharPointer(const T *p)\n    { return MyStringGetNextCharPointer(p); }\n  static T *GetPrevCharPointer(T *base, T *p)\n    { return MyStringGetPrevCharPointer(base, p); }\n  static const T *GetPrevCharPointer(const T *base, const T *p)\n    { return MyStringGetPrevCharPointer(base, p); }\nprotected:\n  T *_chars;\n  int _length;\n  int _capacity;\n  \n  void SetCapacity(int newCapacity)\n  {\n    int realCapacity = newCapacity + 1;\n    if (realCapacity == _capacity)\n      return;\n    /*\n    const int kMaxStringSize = 0x20000000;\n    #ifndef _WIN32_WCE\n    if (newCapacity > kMaxStringSize || newCapacity < _length)\n      throw 1052337;\n    #endif\n    */\n    T *newBuffer = new T[realCapacity];\n    if (_capacity > 0)\n    {\n      for (int i = 0; i < _length; i++)\n        newBuffer[i] = _chars[i];\n      delete []_chars;\n    }\n    _chars = newBuffer;\n    _chars[_length] = 0;\n    _capacity = realCapacity;\n  }\n\n  void GrowLength(int n)\n  {\n    int freeSize = _capacity - _length - 1;\n    if (n <= freeSize)\n      return;\n    int delta;\n    if (_capacity > 64)\n      delta = _capacity / 2;\n    else if (_capacity > 8)\n      delta = 16;\n    else\n      delta = 4;\n    if (freeSize + delta < n)\n      delta = n - freeSize;\n    SetCapacity(_capacity + delta);\n  }\n\n  void CorrectIndex(int &index) const\n  {\n    if (index > _length)\n      index = _length;\n  }\n\npublic:\n  CStringBase(): _chars(0), _length(0), _capacity(0) { SetCapacity(3); }\n  CStringBase(T c):  _chars(0), _length(0), _capacity(0)\n  {\n    SetCapacity(1);\n    _chars[0] = c;\n    _chars[1] = 0;\n    _length = 1;\n  }\n  CStringBase(const T *chars): _chars(0), _length(0), _capacity(0)\n  {\n    int length = MyStringLen(chars);\n    SetCapacity(length);\n    MyStringCopy(_chars, chars); // can be optimized by memove()\n    _length = length;\n  }\n  CStringBase(const CStringBase &s):  _chars(0), _length(0), _capacity(0)\n  {\n    SetCapacity(s._length);\n    MyStringCopy(_chars, s._chars);\n    _length = s._length;\n  }\n  ~CStringBase() {  delete []_chars; }\n\n  operator const T*() const { return _chars;}\n\n  // The minimum size of the character buffer in characters.\n  // This value does not include space for a null terminator.\n  T* GetBuffer(int minBufLength)\n  {\n    if (minBufLength >= _capacity)\n      SetCapacity(minBufLength);\n    return _chars;\n  }\n  void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); }\n  void ReleaseBuffer(int newLength)\n  {\n    /*\n    #ifndef _WIN32_WCE\n    if (newLength >= _capacity)\n      throw 282217;\n    #endif\n    */\n    _chars[newLength] = 0;\n    _length = newLength;\n  }\n\n  CStringBase& operator=(T c)\n  {\n    Empty();\n    SetCapacity(1);\n    _chars[0] = c;\n    _chars[1] = 0;\n    _length = 1;\n    return *this;\n  }\n  CStringBase& operator=(const T *chars)\n  {\n    Empty();\n    int length = MyStringLen(chars);\n    SetCapacity(length);\n    MyStringCopy(_chars, chars);\n    _length = length;\n    return *this;\n  }\n  CStringBase& operator=(const CStringBase& s)\n  {\n    if (&s == this)\n      return *this;\n    Empty();\n    SetCapacity(s._length);\n    MyStringCopy(_chars, s._chars);\n    _length = s._length;\n    return *this;\n  }\n  \n  CStringBase& operator+=(T c)\n  {\n    GrowLength(1);\n    _chars[_length] = c;\n    _chars[++_length] = 0;\n    return *this;\n  }\n  CStringBase& operator+=(const T *s)\n  {\n    int len = MyStringLen(s);\n    GrowLength(len);\n    MyStringCopy(_chars + _length, s);\n    _length += len;\n    return *this;\n  }\n  CStringBase& operator+=(const CStringBase &s)\n  {\n    GrowLength(s._length);\n    MyStringCopy(_chars + _length, s._chars);\n    _length += s._length;\n    return *this;\n  }\n  void Empty()\n  {\n    _length = 0;\n    _chars[0] = 0;\n  }\n  int Length() const { return _length; }\n  bool IsEmpty() const { return (_length == 0); }\n\n  CStringBase Mid(int startIndex) const\n    { return Mid(startIndex, _length - startIndex); }\n  CStringBase Mid(int startIndex, int count ) const\n  {\n    if (startIndex + count > _length)\n      count = _length - startIndex;\n    \n    if (startIndex == 0 && startIndex + count == _length)\n      return *this;\n    \n    CStringBase<T> result;\n    result.SetCapacity(count);\n    // MyStringNCopy(result._chars, _chars + startIndex, count);\n    for (int i = 0; i < count; i++)\n      result._chars[i] = _chars[startIndex + i];\n    result._chars[count] = 0;\n    result._length = count;\n    return result;\n  }\n  CStringBase Left(int count) const\n    { return Mid(0, count); }\n  CStringBase Right(int count) const\n  {\n    if (count > _length)\n      count = _length;\n    return Mid(_length - count, count);\n  }\n\n  void MakeUpper()\n    { MyStringUpper(_chars); }\n  void MakeLower()\n    { MyStringLower(_chars); }\n\n  int Compare(const CStringBase& s) const\n    { return MyStringCompare(_chars, s._chars); }\n\n  int Compare(const T *s) const\n    { return MyStringCompare(_chars, s); }\n\n  int CompareNoCase(const CStringBase& s) const\n    { return MyStringCompareNoCase(_chars, s._chars); }\n\n  int CompareNoCase(const T *s) const\n    { return MyStringCompareNoCase(_chars, s); }\n\n  /*\n  int Collate(const CStringBase& s) const\n    { return MyStringCollate(_chars, s._chars); }\n  int CollateNoCase(const CStringBase& s) const\n    { return MyStringCollateNoCase(_chars, s._chars); }\n  */\n\n  int Find(T c) const { return Find(c, 0); }\n  int Find(T c, int startIndex) const\n  {\n    T *p = _chars + startIndex;\n    for (;;)\n    {\n      if (*p == c)\n        return (int)(p - _chars);\n      if (*p == 0)\n        return -1;\n      p = GetNextCharPointer(p);\n    }\n  }\n  int Find(const CStringBase &s) const { return Find(s, 0); }\n  int Find(const CStringBase &s, int startIndex) const\n  {\n    if (s.IsEmpty())\n      return startIndex;\n    for (; startIndex < _length; startIndex++)\n    {\n      int j;\n      for (j = 0; j < s._length && startIndex + j < _length; j++)\n        if (_chars[startIndex+j] != s._chars[j])\n          break;\n      if (j == s._length)\n        return startIndex;\n    }\n    return -1;\n  }\n  int ReverseFind(T c) const\n  {\n    if (_length == 0)\n      return -1;\n    T *p = _chars + _length - 1;\n    for (;;)\n    {\n      if (*p == c)\n        return (int)(p - _chars);\n      if (p == _chars)\n        return -1;\n      p = GetPrevCharPointer(_chars, p);\n    }\n  }\n  int FindOneOf(const CStringBase &s) const\n  {\n    for (int i = 0; i < _length; i++)\n      if (s.Find(_chars[i]) >= 0)\n        return i;\n      return -1;\n  }\n\n  void TrimLeft(T c)\n  {\n    const T *p = _chars;\n    while (c == *p)\n      p = GetNextCharPointer(p);\n    Delete(0, p - _chars);\n  }\n  private:\n  CStringBase GetTrimDefaultCharSet()\n  {\n    CStringBase<T> charSet;\n    charSet += (T)' ';\n    charSet += (T)'\\n';\n    charSet += (T)'\\t';\n    return charSet;\n  }\n  public:\n\n  void TrimLeft()\n  {\n    TrimLeftWithCharSet(GetTrimDefaultCharSet());\n  }\n  void TrimRight()\n  {\n    TrimRightWithCharSet(GetTrimDefaultCharSet());\n  }\n  void TrimRight(T c)\n  {\n    const T *p = _chars;\n    const T *pLast = NULL;\n    while (*p != 0)\n    {\n      if (*p == c)\n      {\n        if (pLast == NULL)\n          pLast = p;\n      }\n      else\n        pLast = NULL;\n      p = GetNextCharPointer(p);\n    }\n    if (pLast != NULL)\n    {\n      int i = pLast - _chars;\n      Delete(i, _length - i);\n    }\n  }\n  void Trim()\n  {\n    TrimRight();\n    TrimLeft();\n  }\n\n  int Insert(int index, T c)\n  {\n    InsertSpace(index, 1);\n    _chars[index] = c;\n    _length++;\n    return _length;\n  }\n  int Insert(int index, const CStringBase &s)\n  {\n    CorrectIndex(index);\n    if (s.IsEmpty())\n      return _length;\n    int numInsertChars = s.Length();\n    InsertSpace(index, numInsertChars);\n    for (int i = 0; i < numInsertChars; i++)\n      _chars[index + i] = s[i];\n    _length += numInsertChars;\n    return _length;\n  }\n\n  // !!!!!!!!!!!!!!! test it if newChar = '\\0'\n  int Replace(T oldChar, T newChar)\n  {\n    if (oldChar == newChar)\n      return 0;\n    int number  = 0;\n    int pos  = 0;\n    while (pos < Length())\n    {\n      pos = Find(oldChar, pos);\n      if (pos < 0)\n        break;\n      _chars[pos] = newChar;\n      pos++;\n      number++;\n    }\n    return number;\n  }\n  int Replace(const CStringBase &oldString, const CStringBase &newString)\n  {\n    if (oldString.IsEmpty())\n      return 0;\n    if (oldString == newString)\n      return 0;\n    int oldStringLength = oldString.Length();\n    int newStringLength = newString.Length();\n    int number  = 0;\n    int pos  = 0;\n    while (pos < _length)\n    {\n      pos = Find(oldString, pos);\n      if (pos < 0)\n        break;\n      Delete(pos, oldStringLength);\n      Insert(pos, newString);\n      pos += newStringLength;\n      number++;\n    }\n    return number;\n  }\n  int Delete(int index, int count = 1 )\n  {\n    if (index + count > _length)\n      count = _length - index;\n    if (count > 0)\n    {\n      MoveItems(index, index + count);\n      _length -= count;\n    }\n    return _length;\n  }\n};\n\ntemplate <class T>\nCStringBase<T> operator+(const CStringBase<T>& s1, const CStringBase<T>& s2)\n{\n  CStringBase<T> result(s1);\n  result += s2;\n  return result;\n}\n\ntemplate <class T>\nCStringBase<T> operator+(const CStringBase<T>& s, T c)\n{\n  CStringBase<T> result(s);\n  result += c;\n  return result;\n}\n\ntemplate <class T>\nCStringBase<T> operator+(T c, const CStringBase<T>& s)\n{\n  CStringBase<T> result(c);\n  result += s;\n  return result;\n}\n\ntemplate <class T>\nCStringBase<T> operator+(const CStringBase<T>& s, const T * chars)\n{\n  CStringBase<T> result(s);\n  result += chars;\n  return result;\n}\n\ntemplate <class T>\nCStringBase<T> operator+(const T * chars, const CStringBase<T>& s)\n{\n  CStringBase<T> result(chars);\n  result += s;\n  return result;\n}\n\ntemplate <class T>\nbool operator==(const CStringBase<T>& s1, const CStringBase<T>& s2)\n  { return (s1.Compare(s2) == 0); }\n\ntemplate <class T>\nbool operator<(const CStringBase<T>& s1, const CStringBase<T>& s2)\n  { return (s1.Compare(s2) < 0); }\n\ntemplate <class T>\nbool operator==(const T *s1, const CStringBase<T>& s2)\n  { return (s2.Compare(s1) == 0); }\n\ntemplate <class T>\nbool operator==(const CStringBase<T>& s1, const T *s2)\n  { return (s1.Compare(s2) == 0); }\n\ntemplate <class T>\nbool operator!=(const CStringBase<T>& s1, const CStringBase<T>& s2)\n  { return (s1.Compare(s2) != 0); }\n\ntemplate <class T>\nbool operator!=(const T *s1, const CStringBase<T>& s2)\n  { return (s2.Compare(s1) != 0); }\n\ntemplate <class T>\nbool operator!=(const CStringBase<T>& s1, const T *s2)\n  { return (s1.Compare(s2) != 0); }\n\ntypedef CStringBase<char> AString;\ntypedef CStringBase<wchar_t> UString;\n\ntypedef CObjectVector<AString> AStringVector;\ntypedef CObjectVector<UString> UStringVector;\n\n#ifdef _UNICODE\n  typedef UString CSysString;\n#else\n  typedef AString CSysString;\n#endif\n\ntypedef CObjectVector<CSysString> CSysStringVector;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyUnknown.h",
    "content": "// MyUnknown.h\n\n#ifndef __MYUNKNOWN_H\n#define __MYUNKNOWN_H\n\n#ifdef _WIN32\n\n#ifdef _WIN32_WCE\n#if (_WIN32_WCE > 300)\n#include <basetyps.h>\n#else\n#define MIDL_INTERFACE(x) struct\n#endif\n#else\n#include <basetyps.h>\n#endif\n\n#include <unknwn.h>\n\n#else\n#include \"MyWindows.h\"\n#endif\n  \n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyVector.cpp",
    "content": "// Common/MyVector.cpp\n\n#include \"StdAfx.h\"\n\n#include <string.h>\n\n#include \"MyVector.h\"\n\nCBaseRecordVector::~CBaseRecordVector() { ClearAndFree(); }\n\nvoid CBaseRecordVector::ClearAndFree()\n{\n  Clear();\n  delete []((unsigned char *)_items);\n  _capacity = 0;\n  _size = 0;\n  _items = 0;\n}\n\nvoid CBaseRecordVector::Clear() { DeleteFrom(0); }\nvoid CBaseRecordVector::DeleteBack() { Delete(_size - 1); }\nvoid CBaseRecordVector::DeleteFrom(int index) { Delete(index, _size - index); }\n\nvoid CBaseRecordVector::ReserveOnePosition()\n{\n  if (_size != _capacity)\n    return;\n  int delta = 1;\n  if (_capacity >= 64)\n    delta = _capacity / 4;\n  else if (_capacity >= 8)\n    delta = 8;\n  Reserve(_capacity + delta);\n}\n\nvoid CBaseRecordVector::Reserve(int newCapacity)\n{\n  // if (newCapacity <= _capacity)\n  if (newCapacity == _capacity)\n    return;\n  if ((unsigned)newCapacity >= ((unsigned)1 << (sizeof(unsigned) * 8 - 1)))\n    return;\n  size_t newSize = (size_t)(unsigned)newCapacity * _itemSize;\n  if (newSize / _itemSize != (size_t)(unsigned)newCapacity)\n    return;\n  unsigned char *p = NULL;\n  if (newSize > 0)\n  {\n    p = new unsigned char[newSize];\n    if (p == 0)\n      return;\n    int numRecordsToMove = (_size < newCapacity ? _size : newCapacity);\n    memcpy(p, _items, _itemSize * numRecordsToMove);\n  }\n  delete [](unsigned char *)_items;\n  _items = p;\n  _capacity = newCapacity;\n}\n\nvoid CBaseRecordVector::ReserveDown()\n{\n  Reserve(_size);\n}\n\nvoid CBaseRecordVector::MoveItems(int destIndex, int srcIndex)\n{\n  memmove(((unsigned char *)_items) + destIndex * _itemSize,\n    ((unsigned char  *)_items) + srcIndex * _itemSize,\n    _itemSize * (_size - srcIndex));\n}\n\nvoid CBaseRecordVector::InsertOneItem(int index)\n{\n  ReserveOnePosition();\n  MoveItems(index + 1, index);\n  _size++;\n}\n\nvoid CBaseRecordVector::Delete(int index, int num)\n{\n  TestIndexAndCorrectNum(index, num);\n  if (num > 0)\n  {\n    MoveItems(index, index + num);\n    _size -= num;\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyVector.h",
    "content": "// Common/Vector.h\n\n#ifndef __COMMON_VECTOR_H\n#define __COMMON_VECTOR_H\n\n#include \"Defs.h\"\n\nclass CBaseRecordVector\n{\n  void MoveItems(int destIndex, int srcIndex);\nprotected:\n  int _capacity;\n  int _size;\n  void *_items;\n  size_t _itemSize;\n  \n  void ReserveOnePosition();\n  void InsertOneItem(int index);\n  void TestIndexAndCorrectNum(int index, int &num) const\n    { if (index + num > _size) num = _size - index; }\npublic:\n  CBaseRecordVector(size_t itemSize): _capacity(0), _size(0), _items(0), _itemSize(itemSize) {}\n  virtual ~CBaseRecordVector();\n  void ClearAndFree();\n  int Size() const { return _size; }\n  bool IsEmpty() const { return (_size == 0); }\n  void Reserve(int newCapacity);\n  void ReserveDown();\n  virtual void Delete(int index, int num = 1);\n  void Clear();\n  void DeleteFrom(int index);\n  void DeleteBack();\n};\n\ntemplate <class T>\nclass CRecordVector: public CBaseRecordVector\n{\npublic:\n  CRecordVector(): CBaseRecordVector(sizeof(T)){};\n  CRecordVector(const CRecordVector &v): CBaseRecordVector(sizeof(T)) { *this = v; }\n  CRecordVector& operator=(const CRecordVector &v)\n  {\n    Clear();\n    return (*this += v);\n  }\n  CRecordVector& operator+=(const CRecordVector &v)\n  {\n    int size = v.Size();\n    Reserve(Size() + size);\n    for (int i = 0; i < size; i++)\n      Add(v[i]);\n    return *this;\n  }\n  int Add(T item)\n  {\n    ReserveOnePosition();\n    ((T *)_items)[_size] = item;\n    return _size++;\n  }\n  void Insert(int index, T item)\n  {\n    InsertOneItem(index);\n    ((T *)_items)[index] = item;\n  }\n  // T* GetPointer() const { return (T*)_items; }\n  // operator const T *() const { return _items; };\n  const T& operator[](int index) const { return ((T *)_items)[index]; }\n  T& operator[](int index) { return ((T *)_items)[index]; }\n  const T& Front() const { return operator[](0); }\n  T& Front() { return operator[](0); }\n  const T& Back() const { return operator[](_size - 1); }\n  T& Back() { return operator[](_size - 1); }\n\n  void Swap(int i, int j)\n  {\n    T temp = operator[](i);\n    operator[](i) = operator[](j);\n    operator[](j) = temp;\n  }\n\n  int FindInSorted(const T& item) const\n  {\n    int left = 0, right = Size();\n    while (left != right)\n    {\n      int mid = (left + right) / 2;\n      const T& midValue = (*this)[mid];\n      if (item == midValue)\n        return mid;\n      if (item < midValue)\n        right = mid;\n      else\n        left = mid + 1;\n    }\n    return -1;\n  }\n\n  int AddToUniqueSorted(const T& item)\n  {\n    int left = 0, right = Size();\n    while (left != right)\n    {\n      int mid = (left + right) / 2;\n      const T& midValue = (*this)[mid];\n      if (item == midValue)\n        return mid;\n      if (item < midValue)\n        right = mid;\n      else\n        left = mid + 1;\n    }\n    Insert(right, item);\n    return right;\n  }\n\n  static void SortRefDown(T* p, int k, int size, int (*compare)(const T*, const T*, void *), void *param)\n  {\n    T temp = p[k];\n    for (;;)\n    {\n      int s = (k << 1);\n      if (s > size)\n        break;\n      if (s < size && compare(p + s + 1, p + s, param) > 0)\n        s++;\n      if (compare(&temp, p + s, param) >= 0)\n        break;\n      p[k] = p[s];\n      k = s;\n    }\n    p[k] = temp;\n  }\n\n  void Sort(int (*compare)(const T*, const T*, void *), void *param)\n  {\n    int size = _size;\n    if (size <= 1)\n      return;\n    T* p = (&Front()) - 1;\n    {\n      int i = size / 2;\n      do\n        SortRefDown(p, i, size, compare, param);\n      while (--i != 0);\n    }\n    do\n    {\n      T temp = p[size];\n      p[size--] = p[1];\n      p[1] = temp;\n      SortRefDown(p, 1, size, compare, param);\n    }\n    while (size > 1);\n  }\n};\n\ntypedef CRecordVector<int> CIntVector;\ntypedef CRecordVector<unsigned int> CUIntVector;\ntypedef CRecordVector<bool> CBoolVector;\ntypedef CRecordVector<unsigned char> CByteVector;\ntypedef CRecordVector<void *> CPointerVector;\n\ntemplate <class T>\nclass CObjectVector: public CPointerVector\n{\npublic:\n  CObjectVector() {};\n  ~CObjectVector() { Clear(); };\n  CObjectVector(const CObjectVector &v) { *this = v; }\n  CObjectVector& operator=(const CObjectVector &v)\n  {\n    Clear();\n    return (*this += v);\n  }\n  CObjectVector& operator+=(const CObjectVector &v)\n  {\n    int size = v.Size();\n    Reserve(Size() + size);\n    for (int i = 0; i < size; i++)\n      Add(v[i]);\n    return *this;\n  }\n  const T& operator[](int index) const { return *((T *)CPointerVector::operator[](index)); }\n  T& operator[](int index) { return *((T *)CPointerVector::operator[](index)); }\n  T& Front() { return operator[](0); }\n  const T& Front() const { return operator[](0); }\n  T& Back() { return operator[](_size - 1); }\n  const T& Back() const { return operator[](_size - 1); }\n  int Add(const T& item) { return CPointerVector::Add(new T(item)); }\n  void Insert(int index, const T& item) { CPointerVector::Insert(index, new T(item)); }\n  virtual void Delete(int index, int num = 1)\n  {\n    TestIndexAndCorrectNum(index, num);\n    for (int i = 0; i < num; i++)\n      delete (T *)(((void **)_items)[index + i]);\n    CPointerVector::Delete(index, num);\n  }\n  int Find(const T& item) const\n  {\n    for (int i = 0; i < Size(); i++)\n      if (item == (*this)[i])\n        return i;\n    return -1;\n  }\n  int FindInSorted(const T& item) const\n  {\n    int left = 0, right = Size();\n    while (left != right)\n    {\n      int mid = (left + right) / 2;\n      const T& midValue = (*this)[mid];\n      if (item == midValue)\n        return mid;\n      if (item < midValue)\n        right = mid;\n      else\n        left = mid + 1;\n    }\n    return -1;\n  }\n  int AddToSorted(const T& item)\n  {\n    int left = 0, right = Size();\n    while (left != right)\n    {\n      int mid = (left + right) / 2;\n      const T& midValue = (*this)[mid];\n      if (item == midValue)\n      {\n        right = mid + 1;\n        break;\n      }\n      if (item < midValue)\n        right = mid;\n      else\n        left = mid + 1;\n    }\n    Insert(right, item);\n    return right;\n  }\n\n  void Sort(int (*compare)(void *const *, void *const *, void *), void *param)\n    { CPointerVector::Sort(compare, param); }\n\n  static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */)\n    { return MyCompare(*(*((const T **)a1)), *(*((const T **)a2))); }\n  void Sort() { CPointerVector::Sort(CompareObjectItems, 0); }\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyWindows.cpp",
    "content": "// MyWindows.cpp\n\n#include \"StdAfx.h\"\n\n#ifndef _WIN32\n\n#include \"MyWindows.h\"\n#include \"Types.h\"\n#include <stdlib.h> /* FIXED <malloc.h> */\n\nstatic inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); }\nstatic inline void FreeForBSTR(void *pv) { ::free(pv);}\n\nstatic UINT MyStringLen(const wchar_t *s)\n{ \n  UINT i;\n  for (i = 0; s[i] != '\\0'; i++);\n  return i;\n}\n\nBSTR SysAllocStringByteLen(LPCSTR psz, UINT len)\n{\n  // FIXED int realLen = len + sizeof(UINT) + 3;\n  const int LEN_ADDON = sizeof(wchar_t) - 1;\n  int realLen = len + sizeof(UINT) + sizeof(wchar_t) + LEN_ADDON;\n  void *p = AllocateForBSTR(realLen);\n  if (p == 0)\n    return 0;\n  *(UINT *)p = len;\n  // \"void *\" instead of \"BSTR\" to avoid unaligned copy of \"wchar_t\" because of optimizer on Solaris\n  void * bstr = (void *)((UINT *)p + 1);\n  memmove(bstr, psz, len); // psz does not always have \"wchar_t\" alignment.\n  void *pb = (void *)(((Byte *)bstr) + len);\n  memset(pb,0,sizeof(wchar_t) + LEN_ADDON);\n  return (BSTR)bstr;\n}\n\nBSTR SysAllocString(const OLECHAR *sz)\n{\n  if (sz == 0)\n    return 0;\n  UINT strLen = MyStringLen(sz);\n  UINT len = (strLen + 1) * sizeof(OLECHAR);\n  void *p = AllocateForBSTR(len + sizeof(UINT));\n  if (p == 0)\n    return 0;\n  *(UINT *)p = strLen * sizeof(OLECHAR); // FIXED\n  void * bstr = (void *)((UINT *)p + 1);\n  memmove(bstr, sz, len); // sz does not always have \"wchar_t\" alignment.\n  return (BSTR)bstr;\n}\n\nvoid SysFreeString(BSTR bstr)\n{\n  if (bstr != 0)\n    FreeForBSTR((UINT *)bstr - 1);\n}\n\nUINT SysStringByteLen(BSTR bstr)\n{\n  if (bstr == 0)\n    return 0;\n  return *((UINT *)bstr - 1);\n\n}\n\nUINT SysStringLen(BSTR bstr)\n{\n  return SysStringByteLen(bstr) / sizeof(OLECHAR);\n}\n\nHRESULT VariantClear(VARIANTARG *prop)\n{\n  if (prop->vt == VT_BSTR)\n    SysFreeString(prop->bstrVal);\n  prop->vt = VT_EMPTY;\n  return S_OK;\n}\n\nHRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src)\n{\n  HRESULT res = ::VariantClear(dest);\n  if (res != S_OK)\n    return res;\n  if (src->vt == VT_BSTR)\n  {\n    dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal, \n        SysStringByteLen(src->bstrVal));\n    if (dest->bstrVal == 0)\n      return E_OUTOFMEMORY;\n    dest->vt = VT_BSTR;\n  }\n  else\n    *dest = *src;\n  return S_OK;\n}\n\nLONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2)\n{\n  if(ft1->dwHighDateTime < ft2->dwHighDateTime)\n    return -1;\n  if(ft1->dwHighDateTime > ft2->dwHighDateTime)\n    return 1;\n  if(ft1->dwLowDateTime < ft2->dwLowDateTime)\n    return -1;\n  if(ft1->dwLowDateTime > ft2->dwLowDateTime)\n    return 1;\n  return 0;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyWindows.h",
    "content": "// MyWindows.h\n\n#ifndef __MYWINDOWS_H\n#define __MYWINDOWS_H\n\n#ifdef _WIN32\n\n#include <windows.h>\n\n#define CHAR_PATH_SEPARATOR '\\\\'\n#define WCHAR_PATH_SEPARATOR L'\\\\'\n#define STRING_PATH_SEPARATOR \"\\\\\"\n#define WSTRING_PATH_SEPARATOR L\"\\\\\"\n\n#else\n\n#define CHAR_PATH_SEPARATOR '/'\n#define WCHAR_PATH_SEPARATOR L'/'\n#define STRING_PATH_SEPARATOR \"/\"\n#define WSTRING_PATH_SEPARATOR L\"/\"\n\n#include <stddef.h> // for wchar_t\n#include <string.h>\n\n#include \"MyGuidDef.h\"\n\ntypedef char CHAR;\ntypedef unsigned char UCHAR;\n\n#undef BYTE\ntypedef unsigned char BYTE;\n\ntypedef short SHORT;\ntypedef unsigned short USHORT;\n\n#undef WORD\ntypedef unsigned short WORD;\ntypedef short VARIANT_BOOL;\n\ntypedef int INT;\ntypedef Int32 INT32;\ntypedef unsigned int UINT;\ntypedef UInt32 UINT32;\ntypedef INT32 LONG;   // LONG, ULONG and DWORD must be 32-bit\ntypedef UINT32 ULONG;\n\n#undef DWORD\ntypedef UINT32 DWORD;\n\ntypedef Int64 LONGLONG;\ntypedef UInt64 ULONGLONG;\n\ntypedef struct LARGE_INTEGER { LONGLONG QuadPart; }LARGE_INTEGER;\ntypedef union _ULARGE_INTEGER {\n  struct {\n    DWORD LowPart;\n    DWORD HighPart;\n  };\n  struct {\n    DWORD LowPart;\n    DWORD HighPart;\n  } u;\n  ULONGLONG QuadPart;\n} ULARGE_INTEGER, *PULARGE_INTEGER;\n\ntypedef const CHAR *LPCSTR;\ntypedef wchar_t WCHAR;\n\n#ifdef _UNICODE\ntypedef WCHAR TCHAR;\n#define lstrcpy wcscpy\n#define lstrcat wcscat\n#define lstrlen wcslen\n#else\ntypedef CHAR TCHAR;\n#define lstrcpy strcpy\n#define lstrcat strcat\n#define lstrlen strlen\n#endif\n\ntypedef const TCHAR *LPCTSTR;\ntypedef WCHAR OLECHAR;\ntypedef const WCHAR *LPCWSTR;\ntypedef OLECHAR *BSTR;\ntypedef const OLECHAR *LPCOLESTR;\ntypedef OLECHAR *LPOLESTR;\n\ntypedef struct _FILETIME\n{\n  DWORD dwLowDateTime;\n  DWORD dwHighDateTime;\n}FILETIME;\n\n#define HRESULT LONG\n#define FAILED(Status) ((HRESULT)(Status)<0)\ntypedef ULONG PROPID;\ntypedef LONG SCODE;\n\n#define S_OK    ((HRESULT)0x00000000L)\n#define S_FALSE ((HRESULT)0x00000001L)\n#define E_NOTIMPL ((HRESULT)0x80004001L)\n#define E_NOINTERFACE ((HRESULT)0x80004002L)\n#define E_ABORT ((HRESULT)0x80004004L)\n#define E_FAIL ((HRESULT)0x80004005L)\n#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L)\n#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)\n#define E_INVALIDARG ((HRESULT)0x80070057L)\n\n#ifdef _MSC_VER\n#define STDMETHODCALLTYPE __stdcall\n#else\n#define STDMETHODCALLTYPE\n#endif\n\n#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f\n#define STDMETHOD(f) STDMETHOD_(HRESULT, f)\n#define STDMETHODIMP_(type) type STDMETHODCALLTYPE\n#define STDMETHODIMP STDMETHODIMP_(HRESULT)\n\n#define PURE = 0\n\n#define MIDL_INTERFACE(x) struct\n\n#ifdef __cplusplus\n\nDEFINE_GUID(IID_IUnknown,\n0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);\nstruct IUnknown\n{\n  STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE;\n  STDMETHOD_(ULONG, AddRef)() PURE;\n  STDMETHOD_(ULONG, Release)() PURE;\n  #ifndef _WIN32\n  virtual ~IUnknown() {}\n  #endif\n};\n\ntypedef IUnknown *LPUNKNOWN;\n\n#endif\n\n#define VARIANT_TRUE ((VARIANT_BOOL)-1)\n#define VARIANT_FALSE ((VARIANT_BOOL)0)\n\nenum VARENUM\n{\n  VT_EMPTY = 0,\n  VT_NULL = 1,\n  VT_I2 = 2,\n  VT_I4 = 3,\n  VT_R4 = 4,\n  VT_R8 = 5,\n  VT_CY = 6,\n  VT_DATE = 7,\n  VT_BSTR = 8,\n  VT_DISPATCH = 9,\n  VT_ERROR = 10,\n  VT_BOOL = 11,\n  VT_VARIANT = 12,\n  VT_UNKNOWN = 13,\n  VT_DECIMAL = 14,\n  VT_I1 = 16,\n  VT_UI1 = 17,\n  VT_UI2 = 18,\n  VT_UI4 = 19,\n  VT_I8 = 20,\n  VT_UI8 = 21,\n  VT_INT = 22,\n  VT_UINT = 23,\n  VT_VOID = 24,\n  VT_HRESULT = 25,\n  VT_FILETIME = 64\n};\n\ntypedef unsigned short VARTYPE;\ntypedef WORD PROPVAR_PAD1;\ntypedef WORD PROPVAR_PAD2;\ntypedef WORD PROPVAR_PAD3;\n\n#ifdef __cplusplus\n\ntypedef struct tagPROPVARIANT\n{\n  VARTYPE vt;\n  PROPVAR_PAD1 wReserved1;\n  PROPVAR_PAD2 wReserved2;\n  PROPVAR_PAD3 wReserved3;\n  union\n  {\n    CHAR cVal;\n    UCHAR bVal;\n    SHORT iVal;\n    USHORT uiVal;\n    LONG lVal;\n    ULONG ulVal;\n    INT intVal;\n    UINT uintVal;\n    LARGE_INTEGER hVal;\n    ULARGE_INTEGER uhVal;\n    VARIANT_BOOL boolVal;\n    SCODE scode;\n    FILETIME filetime;\n    BSTR bstrVal;\n  };\n} PROPVARIANT;\n\ntypedef PROPVARIANT tagVARIANT;\ntypedef tagVARIANT VARIANT;\ntypedef VARIANT VARIANTARG;\n\nMY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop);\nMY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src);\n\n#endif\n\nMY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len);\nMY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz);\nMY_EXTERN_C void SysFreeString(BSTR bstr);\nMY_EXTERN_C UINT SysStringByteLen(BSTR bstr);\nMY_EXTERN_C UINT SysStringLen(BSTR bstr);\n\n/* MY_EXTERN_C DWORD GetLastError(); */\nMY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2);\n\n#define CP_ACP    0\n#define CP_OEMCP  1\n\ntypedef enum tagSTREAM_SEEK\n{\n  STREAM_SEEK_SET = 0,\n  STREAM_SEEK_CUR = 1,\n  STREAM_SEEK_END = 2\n} STREAM_SEEK;\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyXml.cpp",
    "content": "// MyXml.cpp\n\n#include \"StdAfx.h\"\n\n#include \"MyXml.h\"\n\nstatic bool IsValidChar(char c)\n{\n  return\n    c >= 'a' && c <= 'z' ||\n    c >= 'A' && c <= 'Z' ||\n    c >= '0' && c <= '9' ||\n    c == '-';\n}\n\nstatic bool IsSpaceChar(char c)\n{\n  return (c == ' ' || c == '\\t' || c == 0x0D || c == 0x0A);\n}\n\n#define SKEEP_SPACES(s, pos) while (IsSpaceChar(s[pos])) pos++;\n\nstatic bool ReadProperty(const AString &s, int &pos, CXmlProp &prop)\n{\n  prop.Name.Empty();\n  prop.Value.Empty();\n  for (; pos < s.Length(); pos++)\n  {\n    char c = s[pos];\n    if (!IsValidChar(c))\n      break;\n    prop.Name += c;\n  }\n  \n  if (prop.Name.IsEmpty())\n    return false;\n\n  SKEEP_SPACES(s, pos);\n  if (s[pos++] != '=')\n    return false;\n\n  SKEEP_SPACES(s, pos);\n  if (s[pos++] != '\\\"')\n    return false;\n  \n  while (pos < s.Length())\n  {\n    char c = s[pos++];\n    if (c == '\\\"')\n      return true;\n    prop.Value += c;\n  }\n  return false;\n}\n\nint CXmlItem::FindProperty(const AString &propName) const\n{\n  for (int i = 0; i < Props.Size(); i++)\n    if (Props[i].Name == propName)\n      return i;\n  return -1;\n}\n\nAString CXmlItem::GetPropertyValue(const AString &propName) const\n{\n  int index = FindProperty(propName);\n  if (index >= 0)\n    return Props[index].Value;\n  return AString();\n}\n\nbool CXmlItem::IsTagged(const AString &tag) const\n{\n  return (IsTag && Name == tag);\n}\n\nint CXmlItem::FindSubTag(const AString &tag) const\n{\n  for (int i = 0; i < SubItems.Size(); i++)\n    if (SubItems[i].IsTagged(tag))\n      return i;\n  return -1;\n}\n\nAString CXmlItem::GetSubString() const\n{\n  if (SubItems.Size() == 1)\n  {\n    const CXmlItem &item = SubItems[0];\n    if (!item.IsTag)\n      return item.Name;\n  }\n  return AString();\n}\n\nAString CXmlItem::GetSubStringForTag(const AString &tag) const\n{\n  int index = FindSubTag(tag);\n  if (index >= 0)\n    return SubItems[index].GetSubString();\n  return AString();\n}\n\nbool CXmlItem::ParseItems(const AString &s, int &pos, int numAllowedLevels)\n{\n  if (numAllowedLevels == 0)\n    return false;\n  SubItems.Clear();\n  AString finishString = \"</\";\n  for (;;)\n  {\n    SKEEP_SPACES(s, pos);\n\n    if (s.Mid(pos, finishString.Length()) == finishString)\n      return true;\n      \n    CXmlItem item;\n    if (!item.ParseItem(s, pos, numAllowedLevels - 1))\n      return false;\n    SubItems.Add(item);\n  }\n}\n\nbool CXmlItem::ParseItem(const AString &s, int &pos, int numAllowedLevels)\n{\n  SKEEP_SPACES(s, pos);\n\n  int pos2 = s.Find('<', pos);\n  if (pos2 < 0)\n    return false;\n  if (pos2 != pos)\n  {\n    IsTag = false;\n    Name += s.Mid(pos, pos2 - pos);\n    pos = pos2;\n    return true;\n  }\n  IsTag = true;\n\n  pos++;\n  SKEEP_SPACES(s, pos);\n\n  for (; pos < s.Length(); pos++)\n  {\n    char c = s[pos];\n    if (!IsValidChar(c))\n      break;\n    Name += c;\n  }\n  if (Name.IsEmpty() || pos == s.Length())\n    return false;\n\n  int posTemp = pos;\n  for (;;)\n  {\n    SKEEP_SPACES(s, pos);\n    if (s[pos] == '/')\n    {\n      pos++;\n      // SKEEP_SPACES(s, pos);\n      return (s[pos++] == '>');\n    }\n    if (s[pos] == '>')\n    {\n      if (!ParseItems(s, ++pos, numAllowedLevels))\n        return false;\n      AString finishString = AString(\"</\") + Name + AString(\">\");\n      if (s.Mid(pos, finishString.Length()) != finishString)\n        return false;\n      pos += finishString.Length();\n      return true;\n    }\n    if (posTemp == pos)\n      return false;\n\n    CXmlProp prop;\n    if (!ReadProperty(s, pos, prop))\n      return false;\n    Props.Add(prop);\n    posTemp = pos;\n  }\n}\n\nbool SkeepHeader(const AString &s, int &pos, const AString &startString, const AString &endString)\n{\n  SKEEP_SPACES(s, pos);\n  if (s.Mid(pos, startString.Length()) == startString)\n  {\n    pos = s.Find(endString, pos);\n    if (pos < 0)\n      return false;\n    pos += endString.Length();\n    SKEEP_SPACES(s, pos);\n  }\n  return true;\n}\n\nbool CXml::Parse(const AString &s)\n{\n  int pos = 0;\n  if (!SkeepHeader(s, pos, \"<?xml\", \"?>\"))\n    return false;\n  if (!SkeepHeader(s, pos, \"<!DOCTYPE\", \">\"))\n    return false;\n  if (!Root.ParseItem(s, pos, 1000))\n    return false;\n  SKEEP_SPACES(s, pos);\n  return (pos == s.Length() && Root.IsTag);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/MyXml.h",
    "content": "// MyXml.h\n\n#ifndef __MYXML_H\n#define __MYXML_H\n\n#include \"MyString.h\"\n\nstruct CXmlProp\n{\n  AString Name;\n  AString Value;\n};\n\nclass CXmlItem\n{\n  bool ParseItems(const AString &s, int &pos, int numAllowedLevels);\n\npublic:\n  AString Name;\n  bool IsTag;\n  CObjectVector<CXmlProp> Props;\n  CObjectVector<CXmlItem> SubItems;\n\n  bool ParseItem(const AString &s, int &pos, int numAllowedLevels);\n  \n  bool IsTagged(const AString &tag) const;\n  int FindProperty(const AString &propName) const;\n  AString GetPropertyValue(const AString &propName) const;\n  AString GetSubString() const;\n  int FindSubTag(const AString &tag) const;\n  AString GetSubStringForTag(const AString &tag) const;\n};\n\nstruct CXml\n{\n  CXmlItem Root;\n  bool Parse(const AString &s);\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/NewHandler.h",
    "content": "// Common/NewHandler.h\n\n#ifndef __COMMON_NEWHANDLER_H\n#define __COMMON_NEWHANDLER_H\n\nclass CNewException {};\n\n#ifdef _WIN32\nvoid\n#ifdef _MSC_VER\n__cdecl\n#endif\noperator delete(void *p) throw();\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StdInStream.cpp",
    "content": "// Common/StdInStream.cpp\n\n#include \"StdAfx.h\"\n\n#include <tchar.h>\n#include \"StdInStream.h\"\n\n#ifdef _MSC_VER\n// \"was declared deprecated\" disabling\n#pragma warning(disable : 4996 )\n#endif\n\nstatic const char kIllegalChar = '\\0';\nstatic const char kNewLineChar = '\\n';\n\nstatic const char *kEOFMessage = \"Unexpected end of input stream\";\nstatic const char *kReadErrorMessage  =\"Error reading input stream\";\nstatic const char *kIllegalCharMessage = \"Illegal character in input stream\";\n\nstatic LPCTSTR kFileOpenMode = TEXT(\"r\");\n\nCStdInStream g_StdIn(stdin);\n\nbool CStdInStream::Open(LPCTSTR fileName)\n{\n  Close();\n  _stream = _tfopen(fileName, kFileOpenMode);\n  _streamIsOpen = (_stream != 0);\n  return _streamIsOpen;\n}\n\nbool CStdInStream::Close()\n{\n  if (!_streamIsOpen)\n    return true;\n  _streamIsOpen = (fclose(_stream) != 0);\n  return !_streamIsOpen;\n}\n\nCStdInStream::~CStdInStream()\n{\n  Close();\n}\n\nAString CStdInStream::ScanStringUntilNewLine()\n{\n  AString s;\n  for (;;)\n  {\n    int intChar = GetChar();\n    if (intChar == EOF)\n      throw kEOFMessage;\n    char c = char(intChar);\n    if (c == kIllegalChar)\n      throw kIllegalCharMessage;\n    if (c == kNewLineChar)\n      break;\n    s += c;\n  }\n  return s;\n}\n\nvoid CStdInStream::ReadToString(AString &resultString)\n{\n  resultString.Empty();\n  int c;\n  while ((c = GetChar()) != EOF)\n    resultString += char(c);\n}\n\nbool CStdInStream::Eof()\n{\n  return (feof(_stream) != 0);\n}\n\nint CStdInStream::GetChar()\n{\n  int c = fgetc(_stream); // getc() doesn't work in BeOS?\n  if (c == EOF && !Eof())\n    throw kReadErrorMessage;\n  return c;\n}\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StdInStream.h",
    "content": "// Common/StdInStream.h\n\n#ifndef __COMMON_STDINSTREAM_H\n#define __COMMON_STDINSTREAM_H\n\n#include <stdio.h>\n\n#include \"MyString.h\"\n#include \"Types.h\"\n\nclass CStdInStream\n{\n  bool _streamIsOpen;\n  FILE *_stream;\npublic:\n  CStdInStream(): _streamIsOpen(false) {};\n  CStdInStream(FILE *stream): _streamIsOpen(false), _stream(stream) {};\n  ~CStdInStream();\n  bool Open(LPCTSTR fileName);\n  bool Close();\n\n  AString ScanStringUntilNewLine();\n  void ReadToString(AString &resultString);\n\n  bool Eof();\n  int GetChar();\n};\n\nextern CStdInStream g_StdIn;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StdOutStream.cpp",
    "content": "// Common/StdOutStream.cpp\n\n#include \"StdAfx.h\"\n\n#include <tchar.h>\n\n#include \"StdOutStream.h\"\n#include \"IntToString.h\"\n#include \"StringConvert.h\"\n\n#ifdef _MSC_VER\n// \"was declared deprecated\" disabling\n#pragma warning(disable : 4996 )\n#endif\n\nstatic const char kNewLineChar =  '\\n';\n\nstatic const char *kFileOpenMode = \"wt\";\n\nCStdOutStream  g_StdOut(stdout);\nCStdOutStream  g_StdErr(stderr);\n\nbool CStdOutStream::Open(const char *fileName)\n{\n  Close();\n  _stream = fopen(fileName, kFileOpenMode);\n  _streamIsOpen = (_stream != 0);\n  return _streamIsOpen;\n}\n\nbool CStdOutStream::Close()\n{\n  if (!_streamIsOpen)\n    return true;\n  if (fclose(_stream) != 0)\n    return false;\n  _stream = 0;\n  _streamIsOpen = false;\n  return true;\n}\n\nbool CStdOutStream::Flush()\n{\n  return (fflush(_stream) == 0);\n}\n\nCStdOutStream::~CStdOutStream ()\n{\n  Close();\n}\n\nCStdOutStream & CStdOutStream::operator<<(CStdOutStream & (*aFunction)(CStdOutStream  &))\n{\n  (*aFunction)(*this);\n  return *this;\n}\n\nCStdOutStream & endl(CStdOutStream & outStream)\n{\n  return outStream << kNewLineChar;\n}\n\nCStdOutStream & CStdOutStream::operator<<(const char *string)\n{\n  fputs(string, _stream);\n  return *this;\n}\n\nCStdOutStream & CStdOutStream::operator<<(const wchar_t *string)\n{\n  *this << (const char *)UnicodeStringToMultiByte(string, CP_OEMCP);\n  return *this;\n}\n\nCStdOutStream & CStdOutStream::operator<<(char c)\n{\n  fputc(c, _stream);\n  return *this;\n}\n\nCStdOutStream & CStdOutStream::operator<<(int number)\n{\n  char textString[32];\n  ConvertInt64ToString(number, textString);\n  return operator<<(textString);\n}\n\nCStdOutStream & CStdOutStream::operator<<(UInt64 number)\n{\n  char textString[32];\n  ConvertUInt64ToString(number, textString);\n  return operator<<(textString);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StdOutStream.h",
    "content": "// Common/StdOutStream.h\n\n#ifndef __COMMON_STDOUTSTREAM_H\n#define __COMMON_STDOUTSTREAM_H\n\n#include <stdio.h>\n\n#include \"Types.h\"\n\nclass CStdOutStream\n{\n  bool _streamIsOpen;\n  FILE *_stream;\npublic:\n  CStdOutStream (): _streamIsOpen(false), _stream(0) {};\n  CStdOutStream (FILE *stream): _streamIsOpen(false), _stream(stream) {};\n  ~CStdOutStream ();\n  operator FILE *() { return _stream; }\n  bool Open(const char *fileName);\n  bool Close();\n  bool Flush();\n  CStdOutStream & operator<<(CStdOutStream & (* aFunction)(CStdOutStream  &));\n  CStdOutStream & operator<<(const char *string);\n  CStdOutStream & operator<<(const wchar_t *string);\n  CStdOutStream & operator<<(char c);\n  CStdOutStream & operator<<(int number);\n  CStdOutStream & operator<<(UInt64 number);\n};\n\nCStdOutStream & endl(CStdOutStream & outStream);\n\nextern CStdOutStream g_StdOut;\nextern CStdOutStream g_StdErr;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StringConvert.cpp",
    "content": "// Common/StringConvert.cpp\n\n#include \"StdAfx.h\"\n#include <stdlib.h>\n\n#include \"StringConvert.h\"\nextern \"C\"\n{\nint global_use_utf16_conversion = 0;\n}\n\nnamespace utf8\n{\n#include \"UTFConvert.cpp\"\n}\n\n\n#ifdef LOCALE_IS_UTF8\n\nUString MultiByteToUnicodeString(const AString &srcString, UINT codePage)\n{\n  if ((global_use_utf16_conversion) && (!srcString.IsEmpty()))\n  {\n    UString resultString;\n    bool bret = utf8::ConvertUTF8ToUnicode(srcString,resultString);\n    if (bret) return resultString;\n  }\n\n  UString resultString;\n  for (int i = 0; i < srcString.Length(); i++)\n    resultString += wchar_t(srcString[i] & 255);\n\n  return resultString;\n}\n\nAString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)\n{\n  if ((global_use_utf16_conversion) && (!srcString.IsEmpty()))\n  {\n    AString resultString;\n    bool bret = utf8::ConvertUnicodeToUTF8(srcString,resultString);\n    if (bret) return resultString;\n  }\n\n  AString resultString;\n  for (int i = 0; i < srcString.Length(); i++)\n  {\n    if (srcString[i] >= 256) resultString += '?';\n    else                     resultString += char(srcString[i]);\n  }\n  return resultString;\n}\n\n#else /* LOCALE_IS_UTF8 */\n\nUString MultiByteToUnicodeString(const AString &srcString, UINT codePage)\n{\n#ifdef HAVE_MBSTOWCS\n  if ((global_use_utf16_conversion) && (!srcString.IsEmpty()))\n  {\n    UString resultString;\n    int numChars = mbstowcs(resultString.GetBuffer(srcString.Length()),srcString,srcString.Length()+1);\n    if (numChars >= 0) {\n      resultString.ReleaseBuffer(numChars);\n      return resultString;\n    }\n  }\n#endif\n\n  UString resultString;\n  for (int i = 0; i < srcString.Length(); i++)\n    resultString += wchar_t(srcString[i] & 255);\n\n  return resultString;\n}\n\nAString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)\n{\n#ifdef HAVE_WCSTOMBS\n  if ((global_use_utf16_conversion) && (!srcString.IsEmpty()))\n  {\n    AString resultString;\n    int numRequiredBytes = srcString.Length() * 6+1;\n    int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes),srcString,numRequiredBytes);\n    if (numChars >= 0) {\n      resultString.ReleaseBuffer(numChars);\n      return resultString;\n    }\n  }\n#endif\n\n  AString resultString;\n  for (int i = 0; i < srcString.Length(); i++)\n  {\n    if (srcString[i] >= 256) resultString += '?';\n    else                     resultString += char(srcString[i]);\n  }\n  return resultString;\n}\n\n#endif /* LOCALE_IS_UTF8 */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StringConvert.h",
    "content": "// Common/StringConvert.h\n\n#ifndef __COMMON_STRINGCONVERT_H\n#define __COMMON_STRINGCONVERT_H\n\n#include \"MyWindows.h\"\n#include \"MyString.h\"\n#include \"Types.h\"\n\nUString MultiByteToUnicodeString(const AString &srcString, UINT codePage = CP_ACP);\nAString UnicodeStringToMultiByte(const UString &srcString, UINT codePage, char defaultChar, bool &defaultCharWasUsed);\nAString UnicodeStringToMultiByte(const UString &srcString, UINT codePage = CP_ACP);\n\n\ninline const wchar_t* GetUnicodeString(const wchar_t* unicodeString)\n  { return unicodeString; }\ninline const UString& GetUnicodeString(const UString &unicodeString)\n  { return unicodeString; }\ninline UString GetUnicodeString(const AString &ansiString)\n  { return MultiByteToUnicodeString(ansiString); }\ninline UString GetUnicodeString(const AString &multiByteString, UINT codePage)\n  { return MultiByteToUnicodeString(multiByteString, codePage); }\ninline const wchar_t* GetUnicodeString(const wchar_t* unicodeString, UINT)\n  { return unicodeString; }\ninline const UString& GetUnicodeString(const UString &unicodeString, UINT)\n  { return unicodeString; }\n\ninline const char* GetAnsiString(const char* ansiString)\n  { return ansiString; }\ninline const AString& GetAnsiString(const AString &ansiString)\n  { return ansiString; }\ninline AString GetAnsiString(const UString &unicodeString)\n  { return UnicodeStringToMultiByte(unicodeString); }\n\ninline const char* GetOemString(const char* oemString)\n  { return oemString; }\ninline const AString& GetOemString(const AString &oemString)\n  { return oemString; }\ninline AString GetOemString(const UString &unicodeString)\n  { return UnicodeStringToMultiByte(unicodeString, CP_OEMCP); }\n\n\n#ifdef _UNICODE\n  inline const wchar_t* GetSystemString(const wchar_t* unicodeString)\n    { return unicodeString;}\n  inline const UString& GetSystemString(const UString &unicodeString)\n    { return unicodeString;}\n  inline const wchar_t* GetSystemString(const wchar_t* unicodeString, UINT /* codePage */)\n    { return unicodeString;}\n  inline const UString& GetSystemString(const UString &unicodeString, UINT /* codePage */)\n    { return unicodeString;}\n  inline UString GetSystemString(const AString &multiByteString, UINT codePage)\n    { return MultiByteToUnicodeString(multiByteString, codePage);}\n  inline UString GetSystemString(const AString &multiByteString)\n    { return MultiByteToUnicodeString(multiByteString);}\n#else\n  inline const char* GetSystemString(const char *ansiString)\n    { return ansiString; }\n  inline const AString& GetSystemString(const AString &multiByteString, UINT)\n    { return multiByteString; }\n  inline const char * GetSystemString(const char *multiByteString, UINT)\n    { return multiByteString; }\n  inline AString GetSystemString(const UString &unicodeString)\n    { return UnicodeStringToMultiByte(unicodeString); }\n  inline AString GetSystemString(const UString &unicodeString, UINT codePage)\n    { return UnicodeStringToMultiByte(unicodeString, codePage); }\n#endif\n\n#ifndef _WIN32_WCE\nAString SystemStringToOemString(const CSysString &srcString);\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StringToInt.cpp",
    "content": "// Common/StringToInt.cpp\n\n#include \"StdAfx.h\"\n\n#include \"StringToInt.h\"\n\nUInt64 ConvertStringToUInt64(const char *s, const char **end)\n{\n  UInt64 result = 0;\n  for (;;)\n  {\n    char c = *s;\n    if (c < '0' || c > '9')\n    {\n      if (end != NULL)\n        *end = s;\n      return result;\n    }\n    result *= 10;\n    result += (c - '0');\n    s++;\n  }\n}\n\nUInt64 ConvertOctStringToUInt64(const char *s, const char **end)\n{\n  UInt64 result = 0;\n  for (;;)\n  {\n    char c = *s;\n    if (c < '0' || c > '7')\n    {\n      if (end != NULL)\n        *end = s;\n      return result;\n    }\n    result <<= 3;\n    result += (c - '0');\n    s++;\n  }\n}\n\nUInt64 ConvertHexStringToUInt64(const char *s, const char **end)\n{\n  UInt64 result = 0;\n  for (;;)\n  {\n    char c = *s;\n    UInt32 v;\n    if (c >= '0' && c <= '9') v = (c - '0');\n    else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A');\n    else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a');\n    else\n    {\n      if (end != NULL)\n        *end = s;\n      return result;\n    }\n    result <<= 4;\n    result |= v;\n    s++;\n  }\n}\n\n\nUInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end)\n{\n  UInt64 result = 0;\n  for (;;)\n  {\n    wchar_t c = *s;\n    if (c < '0' || c > '9')\n    {\n      if (end != NULL)\n        *end = s;\n      return result;\n    }\n    result *= 10;\n    result += (c - '0');\n    s++;\n  }\n}\n\n\nInt64 ConvertStringToInt64(const char *s, const char **end)\n{\n  if (*s == '-')\n    return -(Int64)ConvertStringToUInt64(s + 1, end);\n  return ConvertStringToUInt64(s, end);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/StringToInt.h",
    "content": "// Common/StringToInt.h\n\n#ifndef __COMMON_STRINGTOINT_H\n#define __COMMON_STRINGTOINT_H\n\n#include <string.h>\n#include \"Types.h\"\n\nUInt64 ConvertStringToUInt64(const char *s, const char **end);\nUInt64 ConvertOctStringToUInt64(const char *s, const char **end);\nUInt64 ConvertHexStringToUInt64(const char *s, const char **end);\nUInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end);\n\nInt64 ConvertStringToInt64(const char *s, const char **end);\n\n#endif\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/TextConfig.cpp",
    "content": "// Common/TextConfig.cpp\n\n#include \"StdAfx.h\"\n\n#include \"TextConfig.h\"\n\n#include \"Defs.h\"\n#include \"UTFConvert.h\"\n\nstatic bool IsDelimitChar(char c)\n{\n  return (c == ' ' || c == 0x0A || c == 0x0D ||\n      c == '\\0' || c == '\\t');\n}\n    \nstatic AString GetIDString(const char *string, int &finishPos)\n{\n  AString result;\n  for (finishPos = 0; ; finishPos++)\n  {\n    char c = string[finishPos];\n    if (IsDelimitChar(c) || c == '=')\n      break;\n    result += c;\n  }\n  return result;\n}\n\nstatic bool WaitNextLine(const AString &string, int &pos)\n{\n  for (;pos < string.Length(); pos++)\n    if (string[pos] == 0x0A)\n      return true;\n  return false;\n}\n\nstatic bool SkipSpaces(const AString &string, int &pos)\n{\n  for (;pos < string.Length(); pos++)\n  {\n    char c = string[pos];\n    if (!IsDelimitChar(c))\n    {\n      if (c != ';')\n        return true;\n      if (!WaitNextLine(string, pos))\n        return false;\n    }\n  }\n  return false;\n}\n\nbool GetTextConfig(const AString &string, CObjectVector<CTextConfigPair> &pairs)\n{\n  pairs.Clear();\n  int pos = 0;\n\n  /////////////////////\n  // read strings\n\n  for (;;)\n  {\n    if (!SkipSpaces(string, pos))\n      break;\n    CTextConfigPair pair;\n    int finishPos;\n    AString temp = GetIDString(((const char *)string) + pos, finishPos);\n    if (!ConvertUTF8ToUnicode(temp, pair.ID))\n      return false;\n    if (finishPos == 0)\n      return false;\n    pos += finishPos;\n    if (!SkipSpaces(string, pos))\n      return false;\n    if (string[pos] != '=')\n      return false;\n    pos++;\n    if (!SkipSpaces(string, pos))\n      return false;\n    if (string[pos] != '\\\"')\n      return false;\n    pos++;\n    AString message;\n    for (;;)\n    {\n      if (pos >= string.Length())\n        return false;\n      char c = string[pos++];\n      if (c == '\\\"')\n        break;\n      if (c == '\\\\') // FIXME ?\n      {\n        char c = string[pos++];\n        switch(c)\n        {\n          case 'n':\n            message += '\\n';\n            break;\n          case 't':\n            message += '\\t';\n            break;\n          case '\\\\': // FIXME ?\n            message += '\\\\';\n            break;\n          case '\\\"':\n            message += '\\\"';\n            break;\n          default:\n            message += '\\\\'; // FIXME ?\n            message += c;\n            break;\n        }\n      }\n      else\n        message += c;\n    }\n    if (!ConvertUTF8ToUnicode(message, pair.String))\n      return false;\n    pairs.Add(pair);\n  }\n  return true;\n}\n\nint FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const UString &id)\n{\n  for (int  i = 0; i < pairs.Size(); i++)\n    if (pairs[i].ID.Compare(id) == 0)\n      return i;\n  return -1;\n}\n\nUString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const UString &id)\n{\n  int index = FindTextConfigItem(pairs, id);\n  if (index < 0)\n    return UString();\n  return pairs[index].String;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/TextConfig.h",
    "content": "// Common/TextConfig.h\n\n#ifndef __COMMON_TEXTCONFIG_H\n#define __COMMON_TEXTCONFIG_H\n\n#include \"MyVector.h\"\n#include \"MyString.h\"\n\nstruct CTextConfigPair\n{\n  UString ID;\n  UString String;\n};\n\nbool GetTextConfig(const AString &text, CObjectVector<CTextConfigPair> &pairs);\n\nint FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const UString &id);\nUString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const UString &id);\n\n#endif\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/Types.h",
    "content": "// Common/Types.h\n\n#ifndef __COMMON_TYPES_H\n#define __COMMON_TYPES_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#include \"../../C/Types.h\"\n}\n#else\n#include \"../../C/Types.h\"\n#endif\n\ntypedef int HRes;\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/UTFConvert.cpp",
    "content": "// UTFConvert.cpp\n\n#include \"StdAfx.h\"\n\n#include \"UTFConvert.h\"\n#include \"Types.h\"\n\nstatic const Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\nstatic Bool Utf8_To_Utf16(wchar_t *dest, size_t *destLen, const char *src, size_t srcLen)\n{\n  size_t destPos = 0, srcPos = 0;\n  for (;;)\n  {\n    Byte c;\n    int numAdds;\n    if (srcPos == srcLen)\n    {\n      *destLen = destPos;\n      return True;\n    }\n    c = (Byte)src[srcPos++];\n\n    if (c < 0x80)\n    {\n      if (dest)\n        dest[destPos] = (wchar_t)c;\n      destPos++;\n      continue;\n    }\n    if (c < 0xC0)\n      break;\n    for (numAdds = 1; numAdds < 5; numAdds++)\n      if (c < kUtf8Limits[numAdds])\n        break;\n    UInt32 value = (c - kUtf8Limits[numAdds - 1]);\n\n    do\n    {\n      Byte c2;\n      if (srcPos == srcLen)\n        break;\n      c2 = (Byte)src[srcPos++];\n      if (c2 < 0x80 || c2 >= 0xC0)\n        break;\n      value <<= 6;\n      value |= (c2 - 0x80);\n    }\n    while (--numAdds != 0);\n    \n    if (value < 0x10000)\n    {\n      if (dest)\n        dest[destPos] = (wchar_t)value;\n      destPos++;\n    }\n    else\n    {\n      value -= 0x10000;\n      if (value >= 0x100000)\n        break;\n      if (dest)\n      {\n        dest[destPos + 0] = (wchar_t)(0xD800 + (value >> 10));\n        dest[destPos + 1] = (wchar_t)(0xDC00 + (value & 0x3FF));\n      }\n      destPos += 2;\n    }\n  }\n  *destLen = destPos;\n  return False;\n}\n\nstatic Bool Utf16_To_Utf8(char *dest, size_t *destLen, const wchar_t *src, size_t srcLen)\n{\n  size_t destPos = 0, srcPos = 0;\n  for (;;)\n  {\n    unsigned numAdds;\n    UInt32 value;\n    if (srcPos == srcLen)\n    {\n      *destLen = destPos;\n      return True;\n    }\n    value = src[srcPos++];\n    if (value < 0x80)\n    {\n      if (dest)\n        dest[destPos] = (char)value;\n      destPos++;\n      continue;\n    }\n    if (value >= 0xD800 && value < 0xE000)\n    {\n      UInt32 c2;\n      if (value >= 0xDC00 || srcPos == srcLen)\n        break;\n      c2 = src[srcPos++];\n      if (c2 < 0xDC00 || c2 >= 0xE000)\n        break;\n      value = ((value - 0xD800) << 10) | (c2 - 0xDC00);\n    }\n    for (numAdds = 1; numAdds < 5; numAdds++)\n      if (value < (((UInt32)1) << (numAdds * 5 + 6)))\n        break;\n    if (dest)\n      dest[destPos] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds)));\n    destPos++;\n    do\n    {\n      numAdds--;\n      if (dest)\n        dest[destPos] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F));\n      destPos++;\n    }\n    while (numAdds != 0);\n  }\n  *destLen = destPos;\n  return False;\n}\n\nbool ConvertUTF8ToUnicode(const AString &src, UString &dest)\n{\n  dest.Empty();\n  size_t destLen = 0;\n  Utf8_To_Utf16(NULL, &destLen, src, src.Length());\n  wchar_t *p = dest.GetBuffer((int)destLen);\n  Bool res = Utf8_To_Utf16(p, &destLen, src, src.Length());\n  p[destLen] = 0;\n  dest.ReleaseBuffer();\n  return res ? true : false;\n}\n\nbool ConvertUnicodeToUTF8(const UString &src, AString &dest)\n{\n  dest.Empty();\n  size_t destLen = 0;\n  Utf16_To_Utf8(NULL, &destLen, src, src.Length());\n  char *p = dest.GetBuffer((int)destLen);\n  Bool res = Utf16_To_Utf8(p, &destLen, src, src.Length());\n  p[destLen] = 0;\n  dest.ReleaseBuffer();\n  return res ? true : false;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/UTFConvert.h",
    "content": "// Common/UTFConvert.h\n\n#ifndef __COMMON_UTFCONVERT_H\n#define __COMMON_UTFCONVERT_H\n\n#include \"MyString.h\"\n\nbool ConvertUTF8ToUnicode(const AString &utfString, UString &resultString);\nbool ConvertUnicodeToUTF8(const UString &unicodeString, AString &resultString);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/Wildcard.cpp",
    "content": "// Common/Wildcard.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Wildcard.h\"\n\nbool g_CaseSensitive =\n  #ifdef _WIN32\n    false;\n  #else\n    true;\n  #endif\n\nstatic const wchar_t kAnyCharsChar = L'*';\nstatic const wchar_t kAnyCharChar = L'?';\n\n#ifdef _WIN32\nstatic const wchar_t kDirDelimiter1 = L'\\\\';\n#endif\nstatic const wchar_t kDirDelimiter2 = L'/';\n\nstatic const UString kWildCardCharSet = L\"?*\";\n\nstatic const UString kIllegalWildCardFileNameChars=\n  L\"\\x1\\x2\\x3\\x4\\x5\\x6\\x7\\x8\\x9\\xA\\xB\\xC\\xD\\xE\\xF\"\n  L\"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1A\\x1B\\x1C\\x1D\\x1E\\x1F\"\n  L\"\\\"/:<>\\\\|\";\n\n\nstatic inline bool IsCharDirLimiter(wchar_t c)\n{\n  return (\n    #ifdef _WIN32\n    c == kDirDelimiter1 ||\n    #endif\n    c == kDirDelimiter2);\n}\n\nint CompareFileNames(const UString &s1, const UString &s2)\n{\n  if (g_CaseSensitive)\n    return s1.Compare(s2);\n  return s1.CompareNoCase(s2);\n}\n\n// -----------------------------------------\n// this function compares name with mask\n// ? - any char\n// * - any char or empty\n\nstatic bool EnhancedMaskTest(const wchar_t *mask, const wchar_t *name)\n{\n  for (;;)\n  {\n    wchar_t m = *mask;\n    wchar_t c = *name;\n    if (m == 0)\n      return (c == 0);\n    if (m == kAnyCharsChar)\n    {\n      if (EnhancedMaskTest(mask + 1, name))\n        return true;\n      if (c == 0)\n        return false;\n    }\n    else\n    {\n      if (m == kAnyCharChar)\n      {\n        if (c == 0)\n          return false;\n      }\n      else if (m != c)\n        if (g_CaseSensitive || MyCharUpper(m) != MyCharUpper(c))\n          return false;\n      mask++;\n    }\n    name++;\n  }\n}\n\n// --------------------------------------------------\n// Splits path to strings\n\nvoid SplitPathToParts(const UString &path, UStringVector &pathParts)\n{\n  pathParts.Clear();\n  UString name;\n  int len = path.Length();\n  if (len == 0)\n    return;\n  for (int i = 0; i < len; i++)\n  {\n    wchar_t c = path[i];\n    if (IsCharDirLimiter(c))\n    {\n      pathParts.Add(name);\n      name.Empty();\n    }\n    else\n      name += c;\n  }\n  pathParts.Add(name);\n}\n\nvoid SplitPathToParts(const UString &path, UString &dirPrefix, UString &name)\n{\n  int i;\n  for (i = path.Length() - 1; i >= 0; i--)\n    if (IsCharDirLimiter(path[i]))\n      break;\n  dirPrefix = path.Left(i + 1);\n  name = path.Mid(i + 1);\n}\n\nUString ExtractDirPrefixFromPath(const UString &path)\n{\n  int i;\n  for (i = path.Length() - 1; i >= 0; i--)\n    if (IsCharDirLimiter(path[i]))\n      break;\n  return path.Left(i + 1);\n}\n\nUString ExtractFileNameFromPath(const UString &path)\n{\n  int i;\n  for (i = path.Length() - 1; i >= 0; i--)\n    if (IsCharDirLimiter(path[i]))\n      break;\n  return path.Mid(i + 1);\n}\n\n\nbool CompareWildCardWithName(const UString &mask, const UString &name)\n{\n  return EnhancedMaskTest(mask, name);\n}\n\nbool DoesNameContainWildCard(const UString &path)\n{\n  return (path.FindOneOf(kWildCardCharSet) >= 0);\n}\n\n\n// ----------------------------------------------------------'\n// NWildcard\n\nnamespace NWildcard {\n\n\n/*\nM = MaskParts.Size();\nN = TestNameParts.Size();\n\n                           File                          Dir\nForFile     req   M<=N  [N-M, N)                          -\n         nonreq   M=N   [0, M)                            -\n \nForDir      req   M<N   [0, M) ... [N-M-1, N-1)  same as ForBoth-File\n         nonreq         [0, M)                   same as ForBoth-File\n\nForBoth     req   m<=N  [0, M) ... [N-M, N)      same as ForBoth-File\n         nonreq         [0, M)                   same as ForBoth-File\n\n*/\n\nbool CItem::CheckPath(const UStringVector &pathParts, bool isFile) const\n{\n  if (!isFile && !ForDir)\n    return false;\n  int delta = (int)pathParts.Size() - (int)PathParts.Size();\n  if (delta < 0)\n    return false;\n  int start = 0;\n  int finish = 0;\n  if (isFile)\n  {\n    if (!ForDir && !Recursive && delta !=0)\n      return false;\n    if (!ForFile && delta == 0)\n      return false;\n    if (!ForDir && Recursive)\n      start = delta;\n  }\n  if (Recursive)\n  {\n    finish = delta;\n    if (isFile && !ForFile)\n      finish = delta - 1;\n  }\n  for (int d = start; d <= finish; d++)\n  {\n    int i;\n    for (i = 0; i < PathParts.Size(); i++)\n      if (!CompareWildCardWithName(PathParts[i], pathParts[i + d]))\n        break;\n    if (i == PathParts.Size())\n      return true;\n  }\n  return false;\n}\n\nint CCensorNode::FindSubNode(const UString &name) const\n{\n  for (int i = 0; i < SubNodes.Size(); i++)\n    if (CompareFileNames(SubNodes[i].Name, name) == 0)\n      return i;\n  return -1;\n}\n\nvoid CCensorNode::AddItemSimple(bool include, CItem &item)\n{\n  if (include)\n    IncludeItems.Add(item);\n  else\n    ExcludeItems.Add(item);\n}\n\nvoid CCensorNode::AddItem(bool include, CItem &item)\n{\n  if (item.PathParts.Size() <= 1)\n  {\n    AddItemSimple(include, item);\n    return;\n  }\n  const UString &front = item.PathParts.Front();\n  if (DoesNameContainWildCard(front))\n  {\n    AddItemSimple(include, item);\n    return;\n  }\n  int index = FindSubNode(front);\n  if (index < 0)\n    index = SubNodes.Add(CCensorNode(front, this));\n  item.PathParts.Delete(0);\n  SubNodes[index].AddItem(include, item);\n}\n\nvoid CCensorNode::AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir)\n{\n  CItem item;\n  SplitPathToParts(path, item.PathParts);\n  item.Recursive = recursive;\n  item.ForFile = forFile;\n  item.ForDir = forDir;\n  AddItem(include, item);\n}\n\nbool CCensorNode::NeedCheckSubDirs() const\n{\n  for (int i = 0; i < IncludeItems.Size(); i++)\n  {\n    const CItem &item = IncludeItems[i];\n    if (item.Recursive || item.PathParts.Size() > 1)\n      return true;\n  }\n  return false;\n}\n\nbool CCensorNode::AreThereIncludeItems() const\n{\n  if (IncludeItems.Size() > 0)\n    return true;\n  for (int i = 0; i < SubNodes.Size(); i++)\n    if (SubNodes[i].AreThereIncludeItems())\n      return true;\n  return false;\n}\n\nbool CCensorNode::CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const\n{\n  const CObjectVector<CItem> &items = include ? IncludeItems : ExcludeItems;\n  for (int i = 0; i < items.Size(); i++)\n    if (items[i].CheckPath(pathParts, isFile))\n      return true;\n  return false;\n}\n\nbool CCensorNode::CheckPath(UStringVector &pathParts, bool isFile, bool &include) const\n{\n  if (CheckPathCurrent(false, pathParts, isFile))\n  {\n    include = false;\n    return true;\n  }\n  include = true;\n  bool finded = CheckPathCurrent(true, pathParts, isFile);\n  if (pathParts.Size() == 1)\n    return finded;\n  int index = FindSubNode(pathParts.Front());\n  if (index >= 0)\n  {\n    UStringVector pathParts2 = pathParts;\n    pathParts2.Delete(0);\n    if (SubNodes[index].CheckPath(pathParts2, isFile, include))\n      return true;\n  }\n  return finded;\n}\n\nbool CCensorNode::CheckPath(const UString &path, bool isFile, bool &include) const\n{\n  UStringVector pathParts;\n  SplitPathToParts(path, pathParts);\n  return CheckPath(pathParts, isFile, include);\n}\n\nbool CCensorNode::CheckPath(const UString &path, bool isFile) const\n{\n  bool include;\n  if (CheckPath(path, isFile, include))\n    return include;\n  return false;\n}\n\nbool CCensorNode::CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const\n{\n  if (CheckPathCurrent(include, pathParts, isFile))\n    return true;\n  if (Parent == 0)\n    return false;\n  pathParts.Insert(0, Name);\n  return Parent->CheckPathToRoot(include, pathParts, isFile);\n}\n\n/*\nbool CCensorNode::CheckPathToRoot(bool include, const UString &path, bool isFile) const\n{\n  UStringVector pathParts;\n  SplitPathToParts(path, pathParts);\n  return CheckPathToRoot(include, pathParts, isFile);\n}\n*/\n\nvoid CCensorNode::AddItem2(bool include, const UString &path, bool recursive)\n{\n  if (path.IsEmpty())\n    return;\n  bool forFile = true;\n  bool forFolder = true;\n  UString path2 = path;\n  if (IsCharDirLimiter(path[path.Length() - 1]))\n  {\n    path2.Delete(path.Length() - 1);\n    forFile = false;\n  }\n  AddItem(include, path2, recursive, forFile, forFolder);\n}\n\nvoid CCensorNode::ExtendExclude(const CCensorNode &fromNodes)\n{\n  ExcludeItems += fromNodes.ExcludeItems;\n  for (int i = 0; i < fromNodes.SubNodes.Size(); i++)\n  {\n    const CCensorNode &node = fromNodes.SubNodes[i];\n    int subNodeIndex = FindSubNode(node.Name);\n    if (subNodeIndex < 0)\n      subNodeIndex = SubNodes.Add(CCensorNode(node.Name, this));\n    SubNodes[subNodeIndex].ExtendExclude(node);\n  }\n}\n\nint CCensor::FindPrefix(const UString &prefix) const\n{\n  for (int i = 0; i < Pairs.Size(); i++)\n    if (CompareFileNames(Pairs[i].Prefix, prefix) == 0)\n      return i;\n  return -1;\n}\n\nvoid CCensor::AddItem(bool include, const UString &path, bool recursive)\n{\n  UStringVector pathParts;\n  SplitPathToParts(path, pathParts);\n  bool forFile = true;\n  if (pathParts.Back().IsEmpty())\n  {\n    forFile = false;\n    pathParts.DeleteBack();\n  }\n  const UString &front = pathParts.Front();\n  bool isAbs = false;\n  if (front.IsEmpty())\n    isAbs = true;\n  else if (front.Length() == 2 && front[1] == L':')\n    isAbs = true;\n  else\n  {\n    for (int i = 0; i < pathParts.Size(); i++)\n    {\n      const UString &part = pathParts[i];\n      if (part == L\"..\" || part == L\".\")\n      {\n        isAbs = true;\n        break;\n      }\n    }\n  }\n  int numAbsParts = 0;\n  if (isAbs)\n    if (pathParts.Size() > 1)\n      numAbsParts = pathParts.Size() - 1;\n    else\n      numAbsParts = 1;\n  UString prefix;\n  for (int i = 0; i < numAbsParts; i++)\n  {\n    const UString &front = pathParts.Front();\n    if (DoesNameContainWildCard(front))\n      break;\n    prefix += front;\n    prefix += WCHAR_PATH_SEPARATOR;\n    pathParts.Delete(0);\n  }\n  int index = FindPrefix(prefix);\n  if (index < 0)\n    index = Pairs.Add(CPair(prefix));\n\n  CItem item;\n  item.PathParts = pathParts;\n  item.ForDir = true;\n  item.ForFile = forFile;\n  item.Recursive = recursive;\n  Pairs[index].Head.AddItem(include, item);\n}\n\nbool CCensor::CheckPath(const UString &path, bool isFile) const\n{\n  bool finded = false;\n  for (int i = 0; i < Pairs.Size(); i++)\n  {\n    bool include;\n    if (Pairs[i].Head.CheckPath(path, isFile, include))\n    {\n      if (!include)\n        return false;\n      finded = true;\n    }\n  }\n  return finded;\n}\n\nvoid CCensor::ExtendExclude()\n{\n  int i;\n  for (i = 0; i < Pairs.Size(); i++)\n    if (Pairs[i].Prefix.IsEmpty())\n      break;\n  if (i == Pairs.Size())\n    return;\n  int index = i;\n  for (i = 0; i < Pairs.Size(); i++)\n    if (index != i)\n      Pairs[i].Head.ExtendExclude(Pairs[index].Head);\n}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Common/Wildcard.h",
    "content": "// Common/Wildcard.h\n\n#ifndef __COMMON_WILDCARD_H\n#define __COMMON_WILDCARD_H\n\n#include \"MyString.h\"\n\nint CompareFileNames(const UString &s1, const UString &s2);\n\nvoid SplitPathToParts(const UString &path, UStringVector &pathParts);\nvoid SplitPathToParts(const UString &path, UString &dirPrefix, UString &name);\nUString ExtractDirPrefixFromPath(const UString &path);\nUString ExtractFileNameFromPath(const UString &path);\nbool DoesNameContainWildCard(const UString &path);\nbool CompareWildCardWithName(const UString &mask, const UString &name);\n\nnamespace NWildcard {\n\nstruct CItem\n{\n  UStringVector PathParts;\n  bool Recursive;\n  bool ForFile;\n  bool ForDir;\n  bool CheckPath(const UStringVector &pathParts, bool isFile) const;\n};\n\nclass CCensorNode\n{\n  CCensorNode *Parent;\n  bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const;\n  void AddItemSimple(bool include, CItem &item);\n  bool CheckPath(UStringVector &pathParts, bool isFile, bool &include) const;\npublic:\n  CCensorNode(): Parent(0) { };\n  CCensorNode(const UString &name, CCensorNode *parent): Name(name), Parent(parent) { };\n  UString Name;\n  CObjectVector<CCensorNode> SubNodes;\n  CObjectVector<CItem> IncludeItems;\n  CObjectVector<CItem> ExcludeItems;\n\n  int FindSubNode(const UString &path) const;\n\n  void AddItem(bool include, CItem &item);\n  void AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir);\n  void AddItem2(bool include, const UString &path, bool recursive);\n\n  bool NeedCheckSubDirs() const;\n  bool AreThereIncludeItems() const;\n\n  bool CheckPath(const UString &path, bool isFile, bool &include) const;\n  bool CheckPath(const UString &path, bool isFile) const;\n\n  bool CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const;\n  // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const;\n  void ExtendExclude(const CCensorNode &fromNodes);\n};\n\nstruct CPair\n{\n  UString Prefix;\n  CCensorNode Head;\n  CPair(const UString &prefix): Prefix(prefix) { };\n};\n\nclass CCensor\n{\n  int FindPrefix(const UString &prefix) const;\npublic:\n  CObjectVector<CPair> Pairs;\n  bool AllAreRelative() const\n    { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); }\n  void AddItem(bool include, const UString &path, bool recursive);\n  bool CheckPath(const UString &path, bool isFile) const;\n  void ExtendExclude();\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/COM.cpp",
    "content": "// Windows/COM.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Windows/COM.h\"\n#include \"Common/StringConvert.h\"\n\nnamespace NWindows {\nnamespace NCOM {\n\n// CoInitialize (NULL); must be called!\n\nUString GUIDToStringW(REFGUID guid)\n{\n  UString string;\n  const int kStringSize = 48;\n  StringFromGUID2(guid, string.GetBuffer(kStringSize), kStringSize);\n  string.ReleaseBuffer();\n  return string;\n}\n\nAString GUIDToStringA(REFGUID guid)\n{\n  return UnicodeStringToMultiByte(GUIDToStringW(guid));\n}\n\nHRESULT StringToGUIDW(const wchar_t *string, GUID &classID)\n{\n  return CLSIDFromString((wchar_t *)string, &classID);\n}\n\nHRESULT StringToGUIDA(const char *string, GUID &classID)\n{\n  return StringToGUIDW(MultiByteToUnicodeString(string), classID);\n}\n\n}}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/COM.h",
    "content": "// Windows/COM.h\n\n#ifndef __WINDOWS_COM_H\n#define __WINDOWS_COM_H\n\n#include \"Common/MyString.h\"\n\nnamespace NWindows {\nnamespace NCOM {\n\n#ifdef _WIN32\n  \nclass CComInitializer\n{\npublic:\n  CComInitializer() { CoInitialize(NULL);};\n  ~CComInitializer() { CoUninitialize(); };\n};\n\nclass CStgMedium\n{\n  STGMEDIUM _object;\npublic:\n  bool _mustBeReleased;\n  CStgMedium(): _mustBeReleased(false) {}\n  ~CStgMedium() { Free(); }\n  void Free()\n  {\n    if (_mustBeReleased)\n      ReleaseStgMedium(&_object);\n    _mustBeReleased = false;\n  }\n  const STGMEDIUM* operator->() const { return &_object;}\n  STGMEDIUM* operator->() { return &_object;}\n  STGMEDIUM* operator&() { return &_object; }\n};\n\n#endif\n\n//////////////////////////////////\n// GUID <--> String Conversions\nUString GUIDToStringW(REFGUID guid);\nAString GUIDToStringA(REFGUID guid);\n#ifdef UNICODE\n  #define GUIDToString GUIDToStringW\n#else\n  #define GUIDToString GUIDToStringA\n#endif // !UNICODE\n\nHRESULT StringToGUIDW(const wchar_t *string, GUID &classID);\nHRESULT StringToGUIDA(const char *string, GUID &classID);\n#ifdef UNICODE\n  #define StringToGUID StringToGUIDW\n#else\n  #define StringToGUID StringToGUIDA\n#endif // !UNICODE\n\n  \n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Clipboard.cpp",
    "content": "// Windows/Clipboard.cpp\n\n#include \"StdAfx.h\"\n\n\n#include \"Windows/Clipboard.h\"\n#include \"Windows/Defs.h\"\n#ifdef _WIN32\n#include \"Windows/Memory.h\"\n#include \"Windows/Shell.h\"\n#include \"Windows/Memory.h\"\n#else\n#include <wx/clipbrd.h>\n#include <wx/dataobj.h>\n#endif\n\n#include \"Common/StringConvert.h\"\n\nnamespace NWindows {\n\nbool CClipboard::Open(HWND wndNewOwner)\n{\n#ifdef _WIN32\n  m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));\n#else\n  m_Open = wxTheClipboard->Open();\n#endif\n  return m_Open;\n}\n\nCClipboard::~CClipboard()\n{\n  Close();\n}\n\nbool CClipboard::Close()\n{\n  if (!m_Open)\n    return true;\n#ifdef _WIN32\n  m_Open = !BOOLToBool(CloseClipboard());\n#else\n  wxTheClipboard->Close();\n  m_Open = false;\n#endif\n  return !m_Open;\n}\n\n#ifdef _WIN32\nbool ClipboardIsFormatAvailableHDROP()\n{\n  return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));\n}\n#endif\n\n/*\nbool ClipboardGetTextString(AString &s)\n{\n  s.Empty();\n  if (!IsClipboardFormatAvailable(CF_TEXT))\n    return false;\n  CClipboard clipboard;\n\n  if (!clipboard.Open(NULL))\n    return false;\n\n  HGLOBAL h = ::GetClipboardData(CF_TEXT);\n  if (h != NULL)\n  {\n    NMemory::CGlobalLock globalLock(h);\n    const char *p = (const char *)globalLock.GetPointer();\n    if (p != NULL)\n    {\n      s = p;\n      return true;\n    }\n  }\n  return false;\n}\n*/\n\n/*\nbool ClipboardGetFileNames(UStringVector &names)\n{\n  names.Clear();\n  if (!IsClipboardFormatAvailable(CF_HDROP))\n    return false;\n  CClipboard clipboard;\n\n  if (!clipboard.Open(NULL))\n    return false;\n\n  HGLOBAL h = ::GetClipboardData(CF_HDROP);\n  if (h != NULL)\n  {\n    NMemory::CGlobalLock globalLock(h);\n    void *p = (void *)globalLock.GetPointer();\n    if (p != NULL)\n    {\n      NShell::CDrop drop(false);\n      drop.Attach((HDROP)p);\n      drop.QueryFileNames(names);\n      return true;\n    }\n  }\n  return false;\n}\n*/\n\n#ifdef _WIN32\nstatic bool ClipboardSetData(UINT uFormat, const void *data, size_t size)\n{\n  NMemory::CGlobal global;\n  if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))\n    return false;\n  {\n    NMemory::CGlobalLock globalLock(global);\n    LPVOID p = globalLock.GetPointer();\n    if (p == NULL)\n      return false;\n    memcpy(p, data, size);\n  }\n  if (::SetClipboardData(uFormat, global) == NULL)\n    return false;\n  global.Detach();\n  return true;\n}\n#endif\n\nbool ClipboardSetText(HWND owner, const UString &s)\n{\n  CClipboard clipboard;\n  if (!clipboard.Open(owner))\n    return false;\n#ifdef _WIN32\n  if (!::EmptyClipboard())\n    return false;\n\n  bool res;\n  res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Length() + 1) * sizeof(wchar_t));\n  #ifndef _UNICODE\n  AString a;\n  a = UnicodeStringToMultiByte(s, CP_ACP);\n  res |=  ClipboardSetData(CF_TEXT, (const char *)a, (a.Length() + 1) * sizeof(char));\n  a = UnicodeStringToMultiByte(s, CP_OEMCP);\n  res |=  ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Length() + 1) * sizeof(char));\n  #endif\n  return res;\n#else\n  wxTheClipboard->Clear();\n  // This data objects are held by the clipboard, \n  // so do not delete them in the app.\n  wxString ws(s);\n  wxTheClipboard->SetData( new wxTextDataObject(ws) );  \n  return true;\n#endif\n}\n \n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Clipboard.h",
    "content": "// Windows/Clipboard.h\n\n#ifndef __CLIPBOARD_H\n#define __CLIPBOARD_H\n\n#include \"Common/MyString.h\"\n\nnamespace NWindows {\n\nclass CClipboard\n{\n  bool m_Open;\npublic:\n  CClipboard(): m_Open(false) {};\n  ~CClipboard();\n  bool Open(HWND wndNewOwner);\n  bool Close();\n};\n\nbool ClipboardIsFormatAvailableHDROP();\n\n// bool ClipboardGetFileNames(UStringVector &names);\n// bool ClipboardGetTextString(AString &s);\nbool ClipboardSetText(HWND owner, const UString &s);\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/CommonDialog.h",
    "content": "// Windows/CommonDialog.h\n\n#ifndef __WINDOWS_COMMONDIALOG_H\n#define __WINDOWS_COMMONDIALOG_H\n\n#include <windows.h>\n\n#include \"Common/MyString.h\"\n#include \"Windows/Defs.h\"\n\nnamespace NWindows{\n\nbool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s, UString &resPath);\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/ComboBox.h",
    "content": "// Windows/Control/ComboBox.h\n\n#ifndef __WINDOWS_WX_CONTROL_COMBOBOX_H\n#define __WINDOWS_WX_CONTROL_COMBOBOX_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Defs.h\"\n\n#ifndef _WIN32\n#define CB_ERR (-1)  // wxNOT_FOUND\n#endif\n\nclass wxComboBox;\n\nnamespace NWindows {\n\tnamespace NControl {\n\n\t\tclass CComboBox // : public CWindow\n\t\t{\n\t\t\twxComboBox* _choice;\n\t\tpublic:\n\t\t\tCComboBox() : _choice(0) {}\n\n\t\t\tvoid Attach(wxWindow * newWindow);\n\t\t\twxWindow * Detach();\n\n\t\t\tint AddString(const TCHAR * txt);\n\n\t\t\tvoid SetText(LPCTSTR s);\n\n\t\t\tvoid GetText(CSysString &s);\n\n\t\t\tint GetCount() const ;\n\t\t\tvoid GetLBText(int index, CSysString &s);\n\n\t\t\tvoid SetCurSel(int index);\n\t\t\tint GetCurSel();\n\n\t\t\tvoid SetItemData(int index, int val);\n\n\t\t\tint GetItemData(int index);\n\n\t\t\tvoid Enable(bool state);\n\n\t\t\tvoid ResetContent();\n\t\t};\n\n\t\tclass CComboBoxEx : public CComboBox // : public CWindow\n\t\t{\n\t\tpublic:\n\t\t\t/* FIXME\n  \t\t\tLRESULT DeleteItem(int index)\n    \t\t\t{ return SendMessage(CBEM_DELETEITEM, index, 0); }\n  \t\t\tLRESULT InsertItem(COMBOBOXEXITEM *item)\n    \t\t\t{ return SendMessage(CBEM_INSERTITEM, 0, (LPARAM)item); }\n  \t\t\tDWORD SetExtendedStyle(DWORD exMask, DWORD exStyle)\n    \t\t\t{ return (DWORD)SendMessage(CBEM_SETEXTENDEDSTYLE, exMask, exStyle); }\n  \t\t\tHWND GetEditControl()\n    \t\t\t{ return (HWND)SendMessage(CBEM_GETEDITCONTROL, 0, 0); }\n\t\t\t*/\n\t\t};\n\n\n\t}\n}\n\n#endif // __WINDOWS_WX_CONTROL_COMBOBOX_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/Controls.cpp",
    "content": "// Dialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n\t#include \"wx/wx.h\"\n\t#include \"wx/imaglist.h\"\n\t#include \"wx/listctrl.h\"\n#endif  \n\n#include \"Windows/Control/Dialog.h\"\n\nclass LockGUI\n{\n\tbool _IsMain;\n\tpublic:\n\t\tLockGUI() { \n\t\t\t_IsMain = wxThread::IsMain();\n\t\t\tif (!_IsMain) {\n\t\t\t\t// DEBUG printf(\"GuiEnter(0x%lx)\\n\",wxThread::GetCurrentId());\n\t\t\t\twxMutexGuiEnter();\n\t\t\t}\n\t       \t}\n\t\t~LockGUI() { \n\t\t\tif (!_IsMain) {\n\t\t\t\twxMutexGuiLeave();\n\t\t\t\t// DEBUG printf(\"GuiLeave(0x%lx)\\n\",wxThread::GetCurrentId());\n\t\t\t}\n\t       \t}\n};\n/////////////////////////\n\nnamespace NWindows {\n\tnamespace NControl {\n\n\t\tvoid CDialogChildControl::SetText(LPCWSTR s)\n\t\t{\n\t\t\tLockGUI lock;\n\t\t\t((wxTextCtrl *)_window)->SetValue(s);\n\t\t}\n\n\t\tbool CDialogChildControl::GetText(CSysString &s)\n\t\t{\n\t\t\twxString str;\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t  \t\t\tstr = ((wxTextCtrl *)_window)->GetValue();\n\t\t\t}\n\t  \t\ts = str;\n\t  \t\treturn true;\n\t\t}\n\t}\n}\n\n///////////////////////// Windows/Control/ComboBox.cpp\n#include \"Windows/Control/ComboBox.h\"\n\nnamespace NWindows {\n\tnamespace NControl {\n\n\t\tvoid CComboBox::Attach(wxWindow * newWindow) { _choice = (wxComboBox*)newWindow; }\n\n\t\twxWindow * CComboBox::Detach()\n\t\t{\n\t\t\twxWindow * window = _choice;\n\t\t\t_choice = NULL;\n\t\t\treturn window;\n\t\t}\n\t\t\t\n\t\t\tint CComboBox::AddString(const TCHAR * txt) {\n\t\t\t\tLockGUI lock;\n\t\t\t\twxString item(txt);\n\t\t\t\treturn _choice->Append(item);\n\t\t\t}\n\n\t\t\tvoid CComboBox::SetText(LPCTSTR s) {\n\t\t\t\tLockGUI lock;\n\t\t\t\twxString str(s);\n\t\t\t\t_choice->SetValue(str);\n\t\t\t}\n\n\t\t\tvoid CComboBox::GetText(CSysString &s) {\n\t\t\t\tLockGUI lock;\n\t\t\t\twxString str = _choice->GetValue();\n\t\t\t\ts = str;\n\t\t\t}\n\n\t\t\tint CComboBox::GetCount() const  {\n\t\t\t\tLockGUI lock;\n\t\t\t       \treturn _choice->GetCount();\n\t\t\t}\n\n\t\t\tvoid CComboBox::GetLBText(int index, CSysString &s) {\n\t\t\t\tLockGUI lock;\n\t\t\t\twxString str = _choice->GetString(index);\n\t\t\t\ts = str;\n\t\t\t}\n\n\t\t\tvoid CComboBox::SetCurSel(int index) {\n\t\t\t\tLockGUI lock;\n\t\t\t       \t_choice->SetSelection(index);\n\t\t\t}\n\n\t\t\tint CComboBox::GetCurSel() {\n\t\t\t\tLockGUI lock;\n\t\t\t       \treturn _choice->GetSelection();\n\t\t\t}\n\n\t\t\tvoid CComboBox::SetItemData(int index, int val) {\n\t\t\t\tLockGUI lock;\n\t\t\t       \t_choice->SetClientData( index, (void *)(((char *)0) + val));\n\t\t       \t}\n\n\t\t\tint CComboBox::GetItemData(int index)\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\tvoid * data = _choice->GetClientData(index);\n\t\t\t\tint ret = (int)(((char *)data) - ((char *)0));\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tvoid CComboBox::Enable(bool state) {\n\t\t\t\tLockGUI lock;\n\t\t\t       \t_choice->Enable(state);\n\t\t\t}\n\n\t\t\tvoid CComboBox::ResetContent() {\n\t\t\t\tLockGUI lock;\n\t\t\t       _choice->Clear();\n\t\t       \t}\n\t}\n}\n\n///////////////////////// Windows/Control/Edit.cpp\n#include \"Windows/Control/Edit.h\"\n\nnamespace NWindows {\n\tnamespace NControl {\n\n\t\tvoid CEdit::SetPasswordChar(WPARAM c)  // Warning : does not work for wxMSW\n\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\tlong style = _window->GetWindowStyle();\n\t\t\tif ( c == 0 ) style &= ~(wxTE_PASSWORD);\t\n\t\t\telse          style |= wxTE_PASSWORD;\t\t\n\t\t\t_window->SetWindowStyle(style);\n\t\t\t_window->Refresh();\n\t\t}\n\n\n\t\tvoid CEdit::Show(int cmdShow)\n\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t// FIXME\t_window->Show(cmdShow != SW_HIDE);\n\t\t\t_window->Enable(cmdShow != SW_HIDE);\n\t\t}\n\n\t\tvoid CEdit::SetText(LPCWSTR s)\n\t\t{\n\t\t\tLockGUI lock;\n\t\t\t((wxTextCtrl *)_window)->SetValue(s);\n\t\t}\n\n\t\tbool CEdit::GetText(CSysString &s)\n\t\t{\n\t\t\twxString str;\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t  \t\t\tstr = ((wxTextCtrl *)_window)->GetValue();\n\t\t\t}\n\t  \t\ts = str;\n\t  \t\treturn true;\n\t\t}\n\t\t\n\t}\n}\n\n///////////////////////// Windows/Control/ProgressBar.cpp\n#include \"Windows/Control/ProgressBar.h\"\n\nnamespace NWindows {\n\tnamespace NControl {\n\n\t\tCProgressBar::CProgressBar(wxWindow* newWindow):\n\t\t       \t_window((wxGauge *)newWindow) , _minValue(0), _range(0) { }\n\n\tvoid CProgressBar::Attach(wxWindow* newWindow) { \n\t\t_window = (wxGauge *)newWindow;\n\t\t_minValue = 0;\n\t\t_range = 0;\n\t}\n\n\tvoid CProgressBar::SetRange32(int minValue, int maxValue) {\n\t\tint range = maxValue - minValue;\n\t\tif (range >= 1)\n\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t_minValue = minValue;\n\t\t\t_range    = range;\n\t\t\t_window->SetRange(_range);\n\t\t}\n  \t}\n\n\tvoid CProgressBar::SetPos(int pos) {\n\t\tif (_range >= 1)\n\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\tint value = pos - _minValue;\n\t\t\tif ((value >= 0) && (value <= _range)) _window->SetValue(value);\n\t\t}\n\t}\n\n\t}\n}\n\n///////////////////////// Windows/Control/StatusBar.cpp\n#include \"Windows/Control/StatusBar.h\"\n\nnamespace NWindows {\n\tnamespace NControl {\n\n\t\tvoid CStatusBar::Attach(wxWindow * newWindow) { _statusBar = (wxStatusBar*)newWindow; }\n\n\t\twxWindow * CStatusBar::Detach()\n\t\t{\n\t\t\twxWindow * window = _statusBar;\n\t\t\t_statusBar = NULL;\n\t\t\treturn window;\n\t\t}\n\n\t\tvoid CStatusBar::SetText(int index, LPCTSTR text)\n\t\t{\n\t\t\t_statusBar->SetStatusText(text,index);\n\t\t}\n\n\t}\n\n}\n\n///////////////////////// Windows/Control/ListView.cpp\n#include \"Windows/Control/ListView.h\"\n\nnamespace NWindows {\nnamespace NControl {\n\n\tvoid CListView::Attach(wxWindow * newWindow) { _list = (wxListCtrl *)newWindow; }\n\n\tCListView::operator HWND() const { return (HWND)_list; }\n\n\tint CListView::GetItemCount() const {return  _list->GetItemCount(); }\n\n\tint CListView::InsertItem(int index, LPCTSTR text) { return _list->InsertItem(index, text);        }\n\tint CListView::InsertItem(const LVITEM* item) {\n\t\t/*\n\t\tint col = item->iSubItem;\n\t\twxString text;\n\t\tif (item->mask & LVIF_TEXT) text = item->pszText;\n\n\t\t// printf(\"%p->InsertItem(id=%d,%ls)\\n\",_list,item->iItem, (const wchar_t *)text);\n\t\treturn _list->InsertItem(item->iItem, text);        \n\t\t*/\n\t\twxListItem info;\n\t\tlong mask = 0;\n\t\tinfo.SetId(item->iItem);\n\t\tif (item->mask & LVIF_TEXT)\n\t\t{\n\t\t\tinfo.SetText(item->pszText);\n\t\t\tmask |= wxLIST_MASK_TEXT;\n\t\t}\n\t\tif (item->mask & LVIF_PARAM)\n\t\t{\n\t\t\tinfo.SetData(item->lParam);\n\t\t\tmask |= wxLIST_MASK_DATA;\n\t\t}\n\t\tif (item->mask & LVIF_STATE)\n\t\t{\n\t\t\tinfo.SetState(item->state);\n\t\t\tmask |= wxLIST_MASK_STATE;\n\t\t}\n\t\t// FIXME if (item->mask & LVIF_IMAGE)\n\t\t\n\t\tinfo.SetMask(mask);\n\n\t\treturn _list->InsertItem(info);        \n\t}\n\n\tvoid CListView::SetItem(const LVITEM* item)  {\n\t\tint col = item->iSubItem;\n\t\twxString text;\n\t\tif (item->mask & LVIF_TEXT) text = item->pszText;\n\t\t// printf(\"%p->SetItem(id=%d,col=%d,%ls)\\n\",_list,item->iItem, col,(const wchar_t *)text);\n\t\t_list->SetItem(item->iItem, col, text);\n\t}\n\n\tint CListView::SetSubItem(int index, int subIndex, LPCTSTR text)\n\t{\n\t\treturn _list->SetItem(index, subIndex, text);\n\t}\n\n\tvoid SetUnicodeFormat(bool fUnicode) { return ;  }\n\n\tvoid CListView::InsertColumn(int columnIndex, LPCTSTR text, int width)\n\t{\n\t\t  _list->InsertColumn(columnIndex, text, wxLIST_FORMAT_LEFT, width);\n\t}\n\n\tvoid CListView::InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo)\n\t{\n\t\t  wxString text;\n\t\t  int format = wxLIST_FORMAT_LEFT;\n\t\t  int width = -1;\n\t\t  if (columnInfo->mask & LVCF_FMT)\n\t\t  {\n\t\t\t  if (columnInfo->fmt == LVCFMT_LEFT) format = wxLIST_FORMAT_LEFT;\n\t\t\t  if (columnInfo->fmt == LVCFMT_RIGHT) format = wxLIST_FORMAT_RIGHT;\n\t\t  }\n\t\t  if (columnInfo->mask & LVCF_TEXT)  text = columnInfo->pszText;\n\t\t  if (columnInfo->mask & LVCF_WIDTH) width   = columnInfo->cx;\n\t\t  // FIXME LVCF_SUBITEM\n\t\t// printf(\"%p->InsertColumn(%d,%ls)\\n\",_list,columnIndex,(const wchar_t *)heading);\n\t\t  _list->InsertColumn(columnIndex, text, format, width);\n\t  }\n\n\t  void CListView::DeleteAllItems() { _list->DeleteAllItems(); printf(\"%p->DeleteAllItems()\\n\",_list); }\n\n\tvoid CListView::SetRedraw(bool b) { \n\t\tif (b) _list->Thaw();\n\t\telse   _list->Freeze();\n\t\tprintf(\" %p->SetRedraw()\\n\",_list);\n\t}\n\n\tvoid CListView::SetItemCount(int count) {\n\t\t_list->SetItemCount(count);\n\t\tprintf(\" %p->SetItemCount(%d)\\n\",_list,count);\n\t}\n\n\t  void CListView::InvalidateRect(void *, bool)  { printf(\"FIXME %p->InvalidateRect()\\n\",_list);/* FIXME */ }\n\n\t  int CListView::GetSelectedCount() const { \n\t\t  int nb = _list->GetSelectedItemCount();\n\t\t  printf(\" %p->GetSelectedCount()=>%d\\n\",_list,nb);\n\t\t  return nb;\n\t  }\n\n\tvoid /* bool */ CListView::EnsureVisible(int index, bool partialOK) {\n\t\t_list->EnsureVisible(index);\n\t \tprintf(\" %p->EnsureVisible(%d)\\n\",_list,index);\n\t\t// return true;\n\t}\n\n\tvoid CListView::SetItemState(int index, UINT state, UINT mask) {\n\t\t// don't work  _list->SetItemState(index, state, mask); !?\n\t\t// try SetItem ...\n\t\t/*\n\t\twxListItem info;\n\n\t\tinfo.m_mask   = wxLIST_MASK_STATE; \n\t\tinfo.m_itemId = index;\n\t\tinfo.m_col    = 0;\n\t\tinfo.m_state  = state;\n\t\tinfo.m_mask   = mask;\n\n\t\t_list->SetItem(info);\n\t\t*/\n\t\tif (mask & LVIS_FOCUSED) {\n\t\t\t_list->SetItemState(index, state & LVIS_FOCUSED, mask & LVIS_FOCUSED);\n\t\t}\n\n\t\tif (mask & LVIS_SELECTED) {\n\t\t\t_list->SetItemState(index, state & LVIS_SELECTED, mask & LVIS_SELECTED);\n\t\t}\n\n\t\t  printf(\"FIXME %p->SetItemState(index=%d,state=0x%x,mask=0x%x)\\n\",_list,index,(unsigned)state,(unsigned)mask); /* FIXME */\n\t  }\n\n\t  UINT CListView::GetItemState(int index, UINT mask) const\n\t  {\n\t\tUINT state = _list->GetItemState(index, mask);\n\t\tprintf(\"FIXME %p->GetItemState(index=%d,mask=0x%x)=0x%x\\n\",_list,index,(unsigned)mask,(unsigned)state); /* FIXME */\n\n\t\treturn state;\n\t  }\n\n\t  void /* bool */  CListView::Update() { printf(\"FIXME %p->Update()\\n\",_list); /* FIXME */ }\n\n\t  bool CListView::DeleteColumn(int columnIndex) { \n\t\t  // printf(\"%p->DeleteColumn()\\n\",_list); \n\t\t  if (_list->GetColumnCount() < 1) return false;\n\t\t  return _list->DeleteColumn(columnIndex); // always return true !?\n\t  }\n\n\t  bool CListView::GetItemParam(int itemIndex, LPARAM &param) const\n\t  {\n\t\tparam = _list->GetItemData(itemIndex);\n\n\t\t// printf(\" %p->GetItemParam(%d) => %ld\\n\",_list,itemIndex,(long)param);\n\n\t\treturn true;\n\t  }\n\n\t  int CListView::GetNextItem(int startIndex, UINT flags) const\n          {\n\t\tint item = _list->GetNextItem(startIndex, wxLIST_NEXT_ALL, flags);\n\t\tprintf(\" %p->GetNextItem(%d) => %d\\n\",_list,startIndex,item);\n\t\treturn item;\n\n\t  }\n\n\tint CListView::GetFocusedItem() const\n\t{\n\t\tint item = _list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED);\n\t\tprintf(\" %p->GetFocusedItem() => %d\\n\",_list,item);\n\t\treturn item;\n\t}\n\n\t  void CListView::RedrawAllItems()\n\t  {\n\t  \tprintf(\"FIXME %p->RedrawAllItems()\\n\",_list);\n\t  }\n\n\t  // FIXME added\n\t  int CListView::GetColumnCount()\n\t  {\n\t\treturn _list->GetColumnCount();\n\t  }\n\n\t  void CListView::SetFocus() { /* FIXME */ }\n\n\t  void CListView::RedrawItem(int item) { /* FIXME */ }\n\n\tbool CListView::SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam) { \n\t  \tprintf(\" %p->SortItems()\\n\",_list);\n\t\treturn _list->SortItems(compareFunction, dataParam);\n\t}\n\n\tbool CListView::GetColumn(int columnIndex, LVCOLUMN* columnInfo)\n\t{\n\t\twxListItem item;\n\t\tbool ret = _list->GetColumn(columnIndex, item);\n\n\t\tif (ret)\n\t\t{\n\t\t\tcolumnInfo->iOrder = 0; // FIXME\n\t\t\tcolumnInfo->cx = item.GetWidth();\n\t\t}\n\n\t\treturn ret;\n\n\t}\n\n\t// HWND EditLabel(int itemIndex)\n\tvoid CListView::EditLabel(int itemIndex)\n\t{\n\t\t/* FIXME */\n\t}\n\n}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/Dialog.cpp",
    "content": "// Dialog.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#include \"Windows/Control/DialogImpl.h\"\n#include \"Windows/Synchronization.h\"\n\n// #include \"../GUI/p7zip_32.xpm\"\nextern const char * p7zip_32_xpm[];\n\nconst TCHAR * nameWindowToUnix(const TCHAR * lpFileName) {\n  if ((lpFileName[0] == wxT('c')) && (lpFileName[1] == wxT(':'))) return lpFileName+2;\n  return lpFileName;\n}\n\n\nextern time_t g_T0; // FIXME\n\nextern wxWindow * g_window;\n\nenum { // FIXME - duplicate\n    WORKER_EVENT=100    // this one gets sent from the worker thread\n};\n\n#define DIALOG_ID_MESSAGEBOX  8100\n#define DIALOG_ID_DIR_DIALOG  8101\n#define DIALOG_ID_FILE_DIALOG 8102\n#define DIALOG_ID_POST_DIALOG 8190\n#define DIALOG_ID_END_DIALOG  8199\n\nstatic struct\n{\n\tbool busy;\n\n\tint id;\n\twxWindow *parentWindow;\n\n\t// CreateDialog\n\tNWindows::NControl::CModalDialog * dialog;\n\n\t// EndModal\n\tint value;\n\tNWindows::NControl::CModalDialogImpl * window;\n\n\t// MessageBox\n\tconst TCHAR * msg;\n\tconst TCHAR * title;\n\tint flag;\n\n\t// \n\tLPCWSTR initialFolderOrFile;\n\n\twxSemaphore * sem;\n\tint ret;\n\n\tUString resultPath;\n\t\n#define MAX_CREATE 16\n} g_tabCreate[MAX_CREATE];\n\nstatic int myCreateHandle2(int n);\n\nstatic int findFreeInd()\n{\nstatic NWindows::NSynchronization::CCriticalSection g_CriticalSection;\n\n\tg_CriticalSection.Enter();\n\tint ind = 0;\n\twhile (ind < MAX_CREATE)\n\t{\n\t\tif (g_tabCreate[ind].busy == false)\n\t\t{\n\t\t\tg_tabCreate[ind].busy = true;\n\t\t\tbreak;\n\t\t}\n\t\tind++;\n\t}\n\tg_CriticalSection.Leave();\n\n\treturn ind;\n}\n\nstatic int WaitInd(int ind,int id,wxWindow * parent,UString &resultPath)\n{\n\tint ret = 0;\n\n\tg_tabCreate[ind].id           = id;\n\tg_tabCreate[ind].parentWindow = parent;\n\tg_tabCreate[ind].ret          = 0;\n\tg_tabCreate[ind].resultPath   = wxEmptyString;\n\n\tif (wxThread::IsMain())\n\t{\n\t\tret = myCreateHandle2(ind);\n\t\tresultPath = g_tabCreate[ind].resultPath;\n\t}\n\telse\n\t{\n\t\tg_tabCreate[ind].sem = new wxSemaphore(0);\n\n\t\t// create any type of command event here\n\t\twxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, WORKER_EVENT );\n\t\tevent.SetInt( ind );\n\n\t\t// send in a thread-safe way\n\t\t// DEBUG printf(\"T=0x%lx - %d : WaitInd(%d,%p): BEGIN\\n\", wxThread::GetCurrentId(),time(0)-g_T0,g_tabCreate[ind].id,g_tabCreate[ind].parentWindow);\n\t\twxPostEvent( g_window, event );\n\n\t\tg_tabCreate[ind].sem->Wait();\n\n\t\tret = g_tabCreate[ind].ret;\n\t\tresultPath = g_tabCreate[ind].resultPath;\n\t\t// DEBUG printf(\"T=0x%lx - %d : WaitInd(%d,%p): ret=%d\\n\", wxThread::GetCurrentId(),time(0)-g_T0,g_tabCreate[ind].id,g_tabCreate[ind].parentWindow,ret);\n\t\tdelete g_tabCreate[ind].sem;\n\t\tg_tabCreate[ind].sem = 0;\n\t}\n\n\tg_tabCreate[ind].busy = false;\n\n\treturn ret;\n}\n\nstatic int WaitInd(int ind,int id,wxWindow * parent)\n{\n\tUString resultPath;\n\treturn WaitInd(ind,id,parent,resultPath);\n}\n\nclass LockGUI\n{\n\tbool _IsMain;\n\tpublic:\n\t\tLockGUI() { \n\t\t\t_IsMain = wxThread::IsMain();\n\t\t\tif (!_IsMain) {\n\t\t\t\t// DEBUG printf(\"GuiEnter(0x%lx)\\n\",wxThread::GetCurrentId());\n\t\t\t\twxMutexGuiEnter();\n\t\t\t}\n\t       \t}\n\t\t~LockGUI() { \n\t\t\tif (!_IsMain) {\n\t\t\t\twxMutexGuiLeave();\n\t\t\t\t// DEBUG printf(\"GuiLeave(0x%lx)\\n\",wxThread::GetCurrentId());\n\t\t\t}\n\t       \t}\n};\n\nstatic const unsigned int kNumDialogsMax = 32;\nstatic unsigned int g_NumDialogs = 0;\nstatic const CDialogInfo *g_Dialogs[kNumDialogsMax]; \n\nvoid RegisterDialog(const CDialogInfo *dialogInfo) \n{ \n  // DEBUG printf(\"RegisterDialog : %d\\n\",dialogInfo->id);\n  if (g_NumDialogs < kNumDialogsMax)\n    g_Dialogs[g_NumDialogs++] = dialogInfo; \n}\n\nnamespace NWindows {\n\n\tCSysString MyLoadString(unsigned int resourceID)\n\t{\n\t\tfor(int i=0; i < g_NumDialogs; i++) {\n\t\t\tif (g_Dialogs[i]->stringTable) {\n\t\t\t\tint j = 0;\n\t\t\t\twhile(g_Dialogs[i]->stringTable[j].str) {\n\t\t\t\t\tif (resourceID == g_Dialogs[i]->stringTable[j].id) {\n\t\t\t\t\t\treturn g_Dialogs[i]->stringTable[j].str;\n\t\t\t\t\t}\n\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn L\"FIXME-MyLoadStringW-\";\n\t}\n\n\tnamespace NControl {\n\n/////////////////////////////////////////// CModalDialog //////////////////////////////////\n\n\t\t\tbool CModalDialog::CheckButton(int buttonID, UINT checkState)\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\twxCheckBox* w = (wxCheckBox*)_window->FindWindow(buttonID);\n\t\t\t\tif (w)\n\t\t\t\t{\n\t\t\t\t\tw->SetValue(checkState == BST_CHECKED);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tUINT CModalDialog::IsButtonChecked(int buttonID) const\n\t\t\t{ \n\t\t\t\tLockGUI lock;\n\t\t\t\twxCheckBox* w = (wxCheckBox*)_window->FindWindow(buttonID);\n\t\t\t\tif (w)\n\t\t\t\t{\n\t\t\t\t\tbool bret = w->GetValue();\n\t\t\t\t\tif (bret) return BST_CHECKED;\n\t\t\t\t}\n\t\t\t\treturn BST_UNCHECKED;\n\t\t\t}\n\n\t\t\tvoid CModalDialog::EnableItem(int id, bool state)\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\twxWindow* w = _window->FindWindow(id);\n\t\t\t\tif (w) w->Enable(state);\n\t\t\t}\n\n\t\t\tvoid CModalDialog::SetItemText(int id, const TCHAR *txt)\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\twxWindow* w = _window->FindWindow(id);\n\t\t\t\tif (w)\n\t\t\t\t{\n\t\t\t\t\twxString label(txt);\n\t\t\t\t\tw->SetLabel(label);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twxWindow * CModalDialog::GetItem(long id) const\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\treturn _window->FindWindow(id);\n\t\t\t}\n\n\t\t\tvoid CModalDialog::ShowItem(int itemID, int cmdShow) const\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\t// cmdShow = SW_HIDE or SW_SHOW (sometimes false or true !)\n\t\t\t\twxWindow* w = _window->FindWindow(itemID);\n\t\t\t\tif (w)\n\t\t\t\t{\n// FIXME\t\t\t\t\tw->Show(cmdShow != SW_HIDE);\n\t\t\t\t\tw->Enable(cmdShow != SW_HIDE);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tUINT_PTR CModalDialog::SetTimer(UINT_PTR idEvent , unsigned milliseconds)\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\treturn _window->SetTimer(idEvent , milliseconds);\n\t\t\t}\n\n\t\t\tvoid CModalDialog::KillTimer(UINT_PTR idEvent)\n\t\t\t{\n\t\t\t\tLockGUI lock;\n\t\t\t\t_window->KillTimer(idEvent);\n\t\t\t}\n\n\t\t\tvoid CModalDialog::SetText(const TCHAR *_title) {\n\t\t\t\tLockGUI lock;\n\t\t\t      \t_window->SetTitle(_title);\n\t\t       \t}\n\n\n\t\t\tbool CModalDialog::GetText(CSysString &s) {\n\t\t\t\twxString str;\n\t\t\t\t{\n\t\t\t\t\tLockGUI lock;\n\t  \t\t\t\tstr = _window->GetTitle();\n\t\t\t\t}\n\t  \t\t\ts = str;\n\t  \t\t\treturn true;\n\t\t       \t}\n\n\t\t\tINT_PTR CModalDialog::Create(int id , HWND parentWindow)\n\t\t\t{\n\t\t\t\tint ind = findFreeInd();\n\n\t\t\t\tg_tabCreate[ind].dialog = this;\n\n\t\t\t\treturn WaitInd(ind,id,parentWindow);\n\t\t\t}\n\n\t\t\tvoid CModalDialog::End(int result)\n\t\t\t{ \n\t\t\t\tint ind = findFreeInd();\n\n\t\t\t\tg_tabCreate[ind].window  = _window;\n\t\t\t\tg_tabCreate[ind].value   = result;\n\n\t\t\t\tWaitInd(ind,DIALOG_ID_END_DIALOG,0);\n\t\t\t}\n\n\t\t\tvoid CModalDialog::PostMessage(UINT message)\n\t\t\t{\n\t\t\t\tint ind = findFreeInd();\n\n\t\t\t\tg_tabCreate[ind].dialog  = this;\n\t\t\t\tg_tabCreate[ind].value   = message;\n\n\t\t\t\tWaitInd(ind,DIALOG_ID_POST_DIALOG,0);\n\t\t\t}\n\n/////////////////////////////////////////// CModalDialogImpl ///////////////////////////////////////\n\n\t\t\tCModalDialogImpl::CModalDialogImpl(CDialog *dialog, wxWindow* parent, wxWindowID id, \n\t\t\t\t\t const wxString& title, const wxPoint& pos,\n\t\t\t\t\t const wxSize& size, long style) :\n\t\t\t   \t\twxDialog(parent, id, title , pos , size, style /* | wxDIALOG_NO_PARENT */ ) ,\n\t\t\t\t       \t_timer(this, TIMER_ID_IMPL), _dialog(dialog)\n\t\t\t{\n\t\t\t\t// set the frame icon\n\t\t\t\tthis->SetIcon(wxICON(p7zip_32));\n\t\t\t}\n\n\t\t\tvoid CModalDialogImpl::OnAnyButton(wxCommandEvent& event)\n\t\t\t{\n\t\t\t\tint id = event.GetId();\n\t\t\t\tif (id == wxID_OK)\n\t\t\t\t{\n\t\t\t\t\tif (_dialog) _dialog->OnOK();\n\t\t\t\t\t// event.Skip(true);\n\t\t\t\t}\n\t\t\t\telse if (id == wxID_CANCEL)\n\t\t\t\t{\n\t\t\t\t\tif (_dialog) _dialog->OnCancel();\n\t\t\t\t\t// event.Skip(true);\n\t\t\t\t}\n\t\t\t\telse if (id == wxID_HELP)\n\t\t\t\t{\n\t\t\t\t\tif (_dialog) _dialog->OnHelp();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (_dialog)\n\t\t\t\t\t{\n\t\t\t\t\t\tbool bret = _dialog->OnButtonClicked(id, FindWindow(id) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid CModalDialogImpl::OnAnyChoice(wxCommandEvent &event)\n\t\t\t{\n\t\t\t\tint itemID =  event.GetId();\n\t\t\t\tif (_dialog) _dialog->OnCommand(CBN_SELCHANGE, itemID, 0);\n\t\t\t}\n\n\t\t\tvoid CModalDialogImpl::OnAnyTimer(wxTimerEvent &event)\n\t\t\t{\n\t\t\t\tint timerID =  event.GetId();\n\t\t\t\tif (_dialog) _dialog->OnTimer(timerID , 0);\n\t\t\t}\n\t}\n}\n\n///////////////////////// myCreateHandle\n\n\nstatic int myCreateHandle2(int n)\n{ \n\tint                                    id           = g_tabCreate[n].id;\n\twxWindow *                             parentWindow = g_tabCreate[n].parentWindow;\n\tNWindows::NControl::CModalDialogImpl * window       = 0;\n\n\t// DEBUG printf(\"T=0x%lx - %d : myCreateHandle(%d): BEGIN\\n\", wxThread::GetCurrentId(),time(0)-g_T0,n);\n\n\tif (id == DIALOG_ID_END_DIALOG)\n\t{\n\t\t/* FIXME : the dialog must be shown before ending it ?\n\t\twhile (!_window->IsShownOnScreen()) Sleep(200);\n\t\tSleep(200);\n\t\t*/\n\t\tg_tabCreate[n].window->EndModal(g_tabCreate[n].value);\n\t\treturn 0;\n\t}\n\n\tif (id == DIALOG_ID_POST_DIALOG)\n\t{\n\t\tg_tabCreate[n].dialog->OnMessage(g_tabCreate[n].value, 0, 0);\n\t\treturn 0;\n\t}\n\n\tif (id == DIALOG_ID_MESSAGEBOX)\n\t{\n\t\tlong style = g_tabCreate[n].flag;\n\t\tlong decorated_style = style;\n\t\tif ( ( style & ( wxICON_EXCLAMATION | wxICON_HAND | wxICON_INFORMATION |\n\t\t\t\twxICON_QUESTION ) ) == 0 )\n\t\t{\n\t\t\tdecorated_style |= ( style & wxYES ) ? wxICON_QUESTION : wxICON_INFORMATION ;\n\t\t}\n\t\twxMessageDialog dialog(parentWindow, g_tabCreate[n].msg, g_tabCreate[n].title, decorated_style);\n\t\tdialog.SetIcon(wxICON(p7zip_32));\n\t\tint ret = dialog.ShowModal();\n\n\t\treturn ret;\n\t}\n\n\tif (id == DIALOG_ID_DIR_DIALOG)\n\t{\n\t\twxString defaultDir = g_tabCreate[n].initialFolderOrFile;\n\t\twxDirDialog dirDialog(g_tabCreate[n].parentWindow,\n\t\t\t       \tg_tabCreate[n].title, defaultDir);\n\t\tdirDialog.SetIcon(wxICON(p7zip_32));\n\t\tint ret = dirDialog.ShowModal();\n\t\tif (ret == wxID_OK) g_tabCreate[n].resultPath = dirDialog.GetPath();\n\t\treturn ret;\n\t}\n\n\tif (id == DIALOG_ID_FILE_DIALOG)\n\t{\n\t\twxString defaultFilename = g_tabCreate[n].initialFolderOrFile;\n\t\twxFileDialog fileDialog(g_tabCreate[n].parentWindow, g_tabCreate[n].title,\n\t\t\t\twxEmptyString, defaultFilename,\n\t\t       \t\twxT(\"All Files (*.*)|*.*\"), wxSAVE|wxOVERWRITE_PROMPT);\n\t\tfileDialog.SetIcon(wxICON(p7zip_32));\n\t\tint ret = fileDialog.ShowModal();\n\t\tif (ret == wxID_OK) g_tabCreate[n].resultPath = fileDialog.GetPath();\n\t\treturn ret;\n\t}\n\n\tfor(int i=0; i < g_NumDialogs; i++) {\n\t\tif (id == g_Dialogs[i]->id) {\n\t\t\t// DEBUG printf(\"%d : Create(%d,%p): CreateDialog-1\\n\",time(0)-g_T0,id,parentWindow);\n\t\t\twindow = (g_Dialogs[i]->createDialog)(g_tabCreate[n].dialog,g_tabCreate[n].parentWindow);\n\t\t\t// DEBUG printf(\"%d : Create(%d,%p): CreateDialog-2\\n\",time(0)-g_T0,id,parentWindow);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (window) {\n\n\t\t// DEBUG printf(\"%d : Create(%d,%p): %p->ShowModal()\\n\",time(0)-g_T0,id,parentWindow,window);\n\n\t\tINT_PTR ret = window->ShowModal();\n\n\t\t// DEBUG printf(\"%d : Create(%d,%p): %p->ShowModal() - ret=%d\\n\",time(0)-g_T0,id,parentWindow,window,ret);\n\t\twindow->Detach();\n\t\twindow->Destroy();\n\n\t\t// DEBUG printf(\"%d : Create(%d,%p): END\\n\",time(0)-g_T0,id,parentWindow,window);\n\n\t\treturn ret;\n\t}\n\n\t// FIXME\n\tprintf(\"INTERNAL ERROR : cannot find dialog %d\\n\",id);\n\n\treturn 0;\n}\n\nvoid myCreateHandle(int n)\n{\n\tint ret = myCreateHandle2(n);\n\tg_tabCreate[n].ret = ret;\n\tg_tabCreate[n].sem->Post();\n}\n\nint MessageBoxW(wxWindow * parent, const TCHAR * msg, const TCHAR * title,int flag)\n{\n\tint ind = findFreeInd();\n\n\tg_tabCreate[ind].msg          = msg;\n\tg_tabCreate[ind].title        = title;\n\tg_tabCreate[ind].flag         = flag;\n\t\n\treturn WaitInd(ind,DIALOG_ID_MESSAGEBOX,parent);\n}\n\n\n\n// FIXME : should be in Windows/Shell.cpp\n\nnamespace NWindows{\nnamespace NShell{\n\nbool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath)\n{\n\tint ind = findFreeInd();\n\n\tg_tabCreate[ind].title               = title;\n\tg_tabCreate[ind].initialFolderOrFile = nameWindowToUnix(initialFolder);\n\t\n\tUString resTmp;\n\tint ret = WaitInd(ind,DIALOG_ID_DIR_DIALOG,owner,resTmp);\n\tif(ret == wxID_OK)\n\t{\n\t\tresultPath = resTmp;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n}}\n\n/////////////////////////// CPP/Windows/CommonDialog.cpp\nnamespace NWindows\n{\n\n\tbool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s, UString &resPath)\n\t{\n\t\tint ind = findFreeInd();\n\n\t\tg_tabCreate[ind].title               = title;\n\t\tg_tabCreate[ind].initialFolderOrFile = nameWindowToUnix(fullFileName);\n\t\n\t\tUString resTmp;\n\t\tint ret = WaitInd(ind,DIALOG_ID_FILE_DIALOG,hwnd,resTmp);\n\t\tif(ret == wxID_OK)\n\t\t{\n\t\t\tresPath = resTmp;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/Dialog.h",
    "content": "// Windows/Control/Dialog.h\n\n#ifndef __WINDOWS_CONTROL_DIALOG_H\n#define __WINDOWS_CONTROL_DIALOG_H\n\n#include \"Windows/Window.h\"\n\n#ifndef _WIN32\n#define SW_HIDE             0\n#define SW_SHOW             5\n\n#define WM_SETTEXT (6000) // wxID_HIGHEST + 1\n#define WM_USER    (6999) // wxID_HIGHEST + 1000\n\n#endif\n\n#ifndef _WIN32\n#define CBN_SELCHANGE       1\n#endif\n\n// FIXME\n#define IDOK      (5100) // wxID_OK\n#define IDCANCEL  (5101) // wxID_CANCEL\n#define IDABORT   (5115) // wxID_ABORT\n#define IDYES     (5103) // wxID_YES\n#define IDNO      (5104) // wxID_NO\n#define IDHELP    (5009) // wxID_HELP\n\n#define BST_CHECKED 1\n#define BST_UNCHECKED 0\n// #define BST_INDETERMINATE  0x0002\n\n#define wsprintf(a,b,c,d,e) swprintf(a,9999,b,c,d,e)  // FIXME\n\nnamespace NWindows {\n\tnamespace NControl {\n\n\t\tclass CModalDialogImpl;\n\n\t\tclass CDialog\n\t\t{\n\t\tprotected:\n\t\t\tCModalDialogImpl * _window;\n\t\tpublic:\n\t\t\toperator HWND() const { return HWND(_window); }\n\n\t\t\tbool OnInit(CModalDialogImpl * window) { \n\t\t\t\t_window = window;\n\t\t\t\treturn OnInit();\n\t\t       \t}\n\t\t\tvirtual bool OnInit() { return false; }\n\t\t\tvirtual void OnOK() {}\n\t\t\tvirtual void OnCancel() {}\n\t\t\tvirtual void OnHelp() {}\n\t\t\tvirtual bool OnButtonClicked(int buttonID, wxWindow * buttonHWND) { return false; }\n\t\t\tvirtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { return false; }\n\t\t\tvirtual bool OnCommand(int code, int itemID, LPARAM lParam) { return false; }\n\t\t\tvirtual bool OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { return false; }\n\t\t};\n\n\t\tclass CModalDialog : public CDialog\n\t\t{\n\t\tpublic:\n\n\n\t\t\t////////////////// COMPATIBILITY\n\n\t\t\tbool CheckRadioButton(int firstButtonID, int lastButtonID, int checkButtonID)\n\t\t\t{\n/*\n\t\t\t\tfor(int id = firstButtonID; id <= lastButtonID; id++)\n\t\t\t\t{\n\t\t\t\t\tCheckButton(id,id == checkButtonID);\n\t\t\t\t}\n*/\n\t\t\t\tthis->CheckButton(checkButtonID,true);\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\n\t\t\tbool CheckButton(int buttonID, UINT checkState);\n\t\t\tbool CheckButton(int buttonID, bool checkState)\n\t\t\t{\n\t\t\t\treturn CheckButton(buttonID, UINT(checkState ? BST_CHECKED : BST_UNCHECKED));\n\t\t\t}\n\n\n\t\t\tUINT IsButtonChecked(int buttonID) const;\n\n\t\t\tbool IsButtonCheckedBool(long buttonID) const\n\t\t\t\t{ return (IsButtonChecked(buttonID) == BST_CHECKED); }\n\n\t\t\tvoid EnableItem(int id, bool state);\n\n\t\t\tvoid SetItemText(int id, const TCHAR *txt);\n\n\t\t\twxWindow * GetItem(long id) const ;\n\n\t\t\tvoid ShowItem(int itemID, int cmdShow) const;\n\n\t\t\tvoid End(int result);\n\n\t\t\tvoid SetText(const TCHAR *_title); // {  _dialog->SetTitle(_title); }\n\n\t\t\tbool GetText(CSysString &s);\n\n\t\t\tINT_PTR Create(int id , HWND parentWindow);\n\n\t\t\tvoid PostMessage(UINT message);\n\n\t\t\tvirtual void OnHelp() {}\n\n\t\t\tUINT_PTR SetTimer(UINT_PTR idEvent , unsigned milliseconds);\n\n\t\t\tvoid KillTimer(UINT_PTR idEvent);\n\n\t\t\tvirtual void OnOK() { End(IDOK); }\n\t\t\tvirtual void OnCancel() { End(IDCANCEL); }\n\t\t};\n\nclass CDialogChildControl : public NWindows::CWindow\n{\npublic:\n  CDialogChildControl() {}\n\n  int m_ID;\n  void Init(const NWindows::NControl::CModalDialog &parentDialog, int id)\n  {\n    m_ID = id;\n    this->Attach(parentDialog.GetItem(id));\n  }\n  virtual void SetText(LPCWSTR s);\n  virtual bool GetText(CSysString &s);\n};\n\n}\n}\n\nstruct CStringTable\n{\n\tint id;\n\tconst wchar_t *str;\n};\n\nstruct CDialogInfo\n{\n\tint id;\n\tNWindows::NControl::CModalDialogImpl * (*createDialog)(NWindows::NControl::CModalDialog * dialog, HWND parentWindow);\n\tCStringTable * stringTable;\n};\n\nvoid RegisterDialog(const CDialogInfo *dialogInfo);\n\n#define REGISTER_DIALOG_NAME(x) CRegister ## x\n\n#define REGISTER_DIALOG(id,x,stringTable) \\\n\tstatic NWindows::NControl::CModalDialogImpl * myCreate##x(NWindows::NControl::CModalDialog * dialog,HWND parentWindow) \\\n\t{ return new x##Impl(dialog,parentWindow,id); } \\\n\tstatic struct CDialogInfo g_DialogInfo = { id , myCreate##x, stringTable }; \\\n\tstruct REGISTER_DIALOG_NAME(x) { \\\n\t\tREGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \\\n\tstatic REGISTER_DIALOG_NAME(x) g_RegisterDialog;\n\n#define REGISTER_STRINGTABLE(stringTable) \\\n\tstatic struct CDialogInfo g_DialogInfo = { -1 , 0 , stringTable }; \\\n\tstruct REGISTER_DIALOG_NAME(x) { \\\n\t\tREGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \\\n\tstatic REGISTER_DIALOG_NAME(x) g_RegisterDialog;\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/DialogImpl.h",
    "content": "// Windows/Control/DialogImpl.h\n\n#ifndef __WINDOWS_CONTROL_DIALOGIMPL_H\n#define __WINDOWS_CONTROL_DIALOGIMPL_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Control/Dialog.h\"\n\nnamespace NWindows {\n\tnamespace NControl {\n\n#define TIMER_ID_IMPL (1234)\n\n\t\tclass CModalDialogImpl : public wxDialog\n\t\t{\n\t\t\twxTimer _timer;\n\n\t\t\tCDialog *_dialog;\n\t\tpublic:\n\t\t\tCModalDialogImpl(CDialog *dialog, wxWindow* parent, wxWindowID id, const wxString& title,\n\t\t\t\t       \tconst wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,\n\t\t\t\t       \tlong style = wxDEFAULT_DIALOG_STYLE );\n\n\t\t\tCDialog * Detach()\n\t\t\t{\n\t\t\t\tCDialog * oldDialog = _dialog;\n\t\t\t\t_dialog = NULL;\n\t\t\t\treturn oldDialog;\n\t\t\t}\n\n\t\t\tvoid OnInit()\n\t\t\t{\n\t\t\t\tif (_dialog) _dialog->OnInit(this);\n\t\t\t}\n\n\t\t\tvoid OnAnyButton(wxCommandEvent& event);\n\t\t\tvoid OnAnyChoice(wxCommandEvent &event);\n\t\t\tvoid OnAnyTimer(wxTimerEvent &event);\n\n\t\t\tvirtual void SetLabel(const wxString &title)\n\t\t\t{\n\t\t\t\t// Why we must do this \"alias\" ?\n\t\t\t\tthis->SetTitle(title);\n\t\t\t}\n\n\t\t\t//////////////////\n\t\t\tUINT_PTR SetTimer(UINT_PTR /* FIXME idEvent */, unsigned milliseconds)\n\t\t\t{\n\t\t\t\t_timer.Start(milliseconds);\n\t\t\t\treturn TIMER_ID_IMPL;\n\t\t\t}\n\t\t\tvoid KillTimer(UINT_PTR idEvent)\n\t\t\t{\n\t\t\t\tif (idEvent == TIMER_ID_IMPL) _timer.Stop();\n\t\t\t}\n\t\t};\n}\n}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/Edit.h",
    "content": "// Windows/Control/Edit.h\n\n#ifndef __WINDOWS_CONTROL_EDIT_H\n#define __WINDOWS_CONTROL_EDIT_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Defs.h\"\n\nnamespace NWindows {\nnamespace NControl {\n\nclass CEdit: public CWindow\n{\npublic:\n\tvoid SetPasswordChar(WPARAM c);\n\tvoid Show(int cmdShow);\n\tvirtual void SetText(LPCWSTR s);\n\tvirtual bool GetText(CSysString &s);\n};\n\n}}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/ListView.h",
    "content": "// Windows/Control/ListView.h\n\n#ifndef __WINDOWS_CONTROL_LISTVIEW_H\n#define __WINDOWS_CONTROL_LISTVIEW_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Defs.h\"\n\n/*\n#include <commctrl.h>\n*/\n\n#ifndef _WIN32\n\n#define LVCF_FMT                0x0001\n#define LVCF_WIDTH              0x0002\n#define LVCF_TEXT               0x0004\n#define LVCF_SUBITEM            0x0008\n#define LVCF_IMAGE              0x0010\n#define LVCF_ORDER              0x0020\n\n#define LVCFMT_LEFT             0x0000\n#define LVCFMT_RIGHT            0x0001\n#define LVCFMT_CENTER           0x0002\n#define LVCFMT_JUSTIFYMASK      0x0003\n\n\n// state\n#define  LVIS_FOCUSED       0x0002 /* wxLIST_STATE_FOCUSED  */\n#define  LVIS_SELECTED      0x0004 /* wxLIST_STATE_SELECTED */\n\n#define  LVNI_SELECTED      0x0004 /* wxLIST_STATE_SELECTED */\n\ntypedef INT (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM);\n\ntypedef struct tagLVCOLUMNW\n{\n    UINT mask;\n    int fmt;\n    int cx;\n    LPWSTR pszText;\n    int cchTextMax;\n    int iSubItem;\n    int iOrder; // FIXME\n} LVCOLUMNW;\n\n#define  LVCOLUMN   LVCOLUMNW\n#define LV_COLUMNW  LVCOLUMNW  /* FIXME */\n\n\n\ntypedef struct tagLVITEMW\n{\n    UINT mask;\n    int iItem;\n    int iSubItem;\n    UINT state;\n    UINT stateMask;\n    LPWSTR pszText;\n    int cchTextMax;\n    int iImage;\n    LPARAM lParam;\n#if (_WIN32_IE >= 0x0300)\n    int iIndent;\n#endif\n#if (_WIN32_WINNT >= 0x501)\n    int iGroupId;\n    UINT cColumns; // tile view columns\n    PUINT puColumns;\n#endif\n} LVITEMW;\n\n#define LVITEM    LVITEMW\n\n#define LVIF_TEXT   0x0001\n// FIXME - mask\n#define LVIF_PARAM 2\n#define LVIF_IMAGE 4\n#define LVIF_STATE 8\n\n#endif\n\nclass wxListCtrl;\n\nnamespace NWindows {\nnamespace NControl {\n\nclass CListView // : public NWindows::CWindow\n{\n\twxListCtrl *_list;\npublic:\n\tCListView() : _list(0) {}\n\tvoid Attach(wxWindow * newWindow);\n\n\toperator HWND() const;\n\n\tint GetItemCount() const;\n\n\tint InsertItem(int index, LPCTSTR text);\n\tint InsertItem(const LVITEM* item);\n\n\tvoid SetItem(const LVITEM* item);\n\n\tint SetSubItem(int index, int subIndex, LPCTSTR text);\n\n\tvoid SetUnicodeFormat(bool fUnicode) { return ;  }\n\n\tvoid InsertColumn(int columnIndex, LPCTSTR text, int width);\n\n\tvoid InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo);\n\n\tvoid DeleteAllItems();\n\n\tvoid SetRedraw(bool);\n\n\tvoid SetItemCount(int );\n\n\tvoid InvalidateRect(void *, bool);\n\n\tint GetSelectedCount() const;\n\n\tvoid /* bool */ EnsureVisible(int index, bool partialOK);\n\n\tvoid SetItemState(int index, UINT state, UINT mask);\n\n\tUINT GetItemState(int index, UINT mask) const;\n\n\tvoid /* bool */  Update();\n\n\tbool DeleteColumn(int columnIndex);\n\n\tbool GetItemParam(int itemIndex, LPARAM &param) const;\n\n\tint GetNextItem(int startIndex, UINT flags) const;\n\n\tint GetFocusedItem() const;\n\n\tvoid RedrawAllItems();\n\t  // FIXME added\n\tint GetColumnCount();\n\n\tvoid SetFocus();\n\n\tvoid RedrawItem(int item);\n\n\tbool SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam);\n\n\tbool GetColumn(int columnIndex, LVCOLUMN* columnInfo);\n\n\t// HWND EditLabel(int itemIndex)\n\tvoid EditLabel(int itemIndex);\n\n};\n\n}}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/ProgressBar.h",
    "content": "// Windows/Control/ProgressBar.h\n\n#ifndef __WINDOWS_CONTROL_PROGRESSBAR_H\n#define __WINDOWS_CONTROL_PROGRESSBAR_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Defs.h\"\n\nclass wxGauge;\n\nnamespace NWindows {\nnamespace NControl {\n\n\nclass CProgressBar : public CWindow\n{\nprotected:\n\twxGauge* _window;\n\tint _minValue;\n\tint _range;\npublic:\n\tCProgressBar(wxWindow* newWindow = NULL);\n\n\tvoid Attach(wxWindow* newWindow);\n\n\tvoid SetRange32(int minValue, int maxValue);\n\n\tvoid SetPos(int pos);\n};\n\n}}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/Static.h",
    "content": "// Windows/Control/Static.h\n\n#ifndef __WINDOWS_CONTROL_STATIC_H\n#define __WINDOWS_CONTROL_STATIC_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Defs.h\"\n\ntypedef void * HICON;\n\nnamespace NWindows {\nnamespace NControl {\n\nclass CStatic : public CWindow\n{\npublic:\n\n\tHICON SetIcon(HICON icon) { return 0; } // FIXME\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/StatusBar.h",
    "content": "// Windows/Control/StatusBar.h\n\n#ifndef __WINDOWS_CONTROL_STATUSBAR_H\n#define __WINDOWS_CONTROL_STATUSBAR_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Defs.h\"\n\nclass wxStatusBar;\n\nnamespace NWindows {\nnamespace NControl {\n\nclass CStatusBar // : public NWindows::CWindow\n{\n\twxStatusBar * _statusBar;\npublic:\n\tCStatusBar() : _statusBar(0) {}\n\n\tvoid Attach(wxWindow * newWindow);\n\twxWindow * Detach();\n\n\tvoid SetText(int index, LPCTSTR text);\n\t\n/* FIXME\n  bool Create(LONG style, LPCTSTR text, HWND hwndParent, UINT id)\n    { return (_window = ::CreateStatusWindow(style, text, hwndParent, id)) != 0; }\n  bool SetParts(int numParts, const int *edgePostions)\n    { return LRESULTToBool(SendMessage(SB_SETPARTS, numParts, (LPARAM)edgePostions)); }\n  bool SetText(LPCTSTR text)\n    { return CWindow::SetText(text); }\n\n  bool SetText(int index, LPCTSTR text, UINT type)\n    { return LRESULTToBool(SendMessage(SB_SETTEXT, index | type, (LPARAM)text)); }\n  bool SetText(int index, LPCTSTR text)\n    { return SetText(index, text, 0); }\n  void Simple(bool simple)\n    { SendMessage(SB_SIMPLE, BoolToBOOL(simple), 0); }\n\n  #ifndef _UNICODE\n  bool Create(LONG style, LPCWSTR text, HWND hwndParent, UINT id)\n    { return (_window = ::CreateStatusWindowW(style, text, hwndParent, id)) != 0; }\n  bool SetText(LPCWSTR text)\n    { return CWindow::SetText(text); }\n  bool SetText(int index, LPCWSTR text, UINT type)\n    { return LRESULTToBool(SendMessage(SB_SETTEXTW, index | type, (LPARAM)text)); }\n  bool SetText(int index, LPCWSTR text)\n    { return SetText(index, text, 0); }\n  #endif\n*/  \n};\n\n}}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/Window2.cpp",
    "content": "// Windows/Control/Window2.cpp\n\n#include \"StdAfx.h\"\n\n#ifndef _UNICODE\n#include \"Common/StringConvert.h\"\n#endif\n#include \"Windows/Control/Window2.h\"\n\n// extern HINSTANCE g_hInstance;\n#ifndef _UNICODE\nextern bool g_IsNT;\n#endif\n\nnamespace NWindows {\n\n#ifndef _UNICODE\nATOM MyRegisterClass(CONST WNDCLASSW *wndClass);\n#endif\n\nnamespace NControl {\n\n#ifdef _WIN32\nstatic LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message,\n    WPARAM wParam, LPARAM lParam)\n{\n  CWindow tempWindow(aHWND);\n  if (message == WM_NCCREATE)\n    tempWindow.SetUserDataLongPtr(\n        LONG_PTR(((LPCREATESTRUCT)lParam)->lpCreateParams));\n  CWindow2 *window = (CWindow2*)(tempWindow.GetUserDataLongPtr());\n  if (window != NULL && message == WM_NCCREATE)\n    window->Attach(aHWND);\n  if (window == 0)\n  {\n    #ifndef _UNICODE\n    if (g_IsNT)\n      return DefWindowProcW(aHWND, message, wParam, lParam);\n    else\n    #endif\n      return DefWindowProc(aHWND, message, wParam, lParam);\n  }\n  return window->OnMessage(message, wParam, lParam);\n}\n\nbool CWindow2::CreateEx(DWORD exStyle, LPCTSTR className,\n      LPCTSTR windowName, DWORD style,\n      int x, int y, int width, int height,\n      HWND parentWindow, HMENU idOrHMenu,\n      HINSTANCE instance)\n{\n  WNDCLASS windowClass;\n  if(!::GetClassInfo(instance, className, &windowClass))\n  {\n    // windowClass.style          = CS_HREDRAW | CS_VREDRAW;\n    windowClass.style          = 0;\n\n    windowClass.lpfnWndProc    = WindowProcedure;\n    windowClass.cbClsExtra     = NULL;\n    windowClass.cbWndExtra     = NULL;\n    windowClass.hInstance      = instance;\n    windowClass.hIcon          = NULL;\n    windowClass.hCursor        = LoadCursor(NULL, IDC_ARROW);\n    windowClass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);\n    windowClass.lpszMenuName   = NULL;\n    windowClass.lpszClassName  = className;\n    if (::RegisterClass(&windowClass) == 0)\n      return false;\n  }\n  return CWindow::CreateEx(exStyle, className, windowName,\n      style, x, y, width, height, parentWindow,\n      idOrHMenu, instance, this);\n}\n\n#ifndef _UNICODE\n\nbool CWindow2::CreateEx(DWORD exStyle, LPCWSTR className,\n      LPCWSTR windowName, DWORD style,\n      int x, int y, int width, int height,\n      HWND parentWindow, HMENU idOrHMenu,\n      HINSTANCE instance)\n{\n  bool needRegister;\n  if(g_IsNT)\n  {\n    WNDCLASSW windowClass;\n    needRegister = ::GetClassInfoW(instance, className, &windowClass) == 0;\n  }\n  else\n  {\n    WNDCLASSA windowClassA;\n    AString classNameA;\n    LPCSTR classNameP;\n    if (IS_INTRESOURCE(className))\n      classNameP = (LPCSTR)className;\n    else\n    {\n      classNameA = GetSystemString(className);\n      classNameP = classNameA;\n    }\n    needRegister = ::GetClassInfoA(instance, classNameP, &windowClassA) == 0;\n  }\n  if (needRegister)\n  {\n    WNDCLASSW windowClass;\n    // windowClass.style          = CS_HREDRAW | CS_VREDRAW;\n    windowClass.style          = 0;\n    windowClass.lpfnWndProc    = WindowProcedure;\n    windowClass.cbClsExtra     = NULL;\n    windowClass.cbWndExtra     = NULL;\n    windowClass.hInstance      = instance;\n    windowClass.hIcon          = NULL;\n    windowClass.hCursor        = LoadCursor(NULL, IDC_ARROW);\n    windowClass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);\n    windowClass.lpszMenuName   = NULL;\n    windowClass.lpszClassName  = className;\n    if (MyRegisterClass(&windowClass) == 0)\n      return false;\n  }\n  return CWindow::CreateEx(exStyle, className, windowName,\n      style, x, y, width, height, parentWindow,\n      idOrHMenu, instance, this);\n\n}\n#endif\n\nLRESULT CWindow2::DefProc(UINT message, WPARAM wParam, LPARAM lParam)\n{\n  #ifndef _UNICODE\n  if (g_IsNT)\n    return DefWindowProcW(_window, message, wParam, lParam);\n  else\n  #endif\n    return DefWindowProc(_window, message, wParam, lParam);\n}\n#endif\n\nLRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)\n{\n  LRESULT result;\n  switch (message)\n  {\n    case WM_CREATE:\n      if (!OnCreate((CREATESTRUCT *)lParam))\n        return -1;\n      break;\n    case WM_COMMAND:\n      if (OnCommand(wParam, lParam, result))\n        return result;\n      break;\n    case WM_NOTIFY:\n      if (OnNotify((UINT)wParam, (LPNMHDR) lParam, result))\n        return result;\n      break;\n    case WM_DESTROY:\n      OnDestroy();\n      break;\n    case WM_CLOSE:\n      OnClose();\n      return 0;\n#ifdef _WIN32\n    case WM_SIZE:\n      if (OnSize(wParam, LOWORD(lParam), HIWORD(lParam)))\n        return 0;\n#endif\n  }\n#ifdef _WIN32\n  return DefProc(message, wParam, lParam);\n#else\n  return 0;\n#endif\n}\n\nbool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result)\n{\n  return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result);\n}\n\nbool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */, LRESULT & /* result */)\n{\n  return false;\n  // return DefProc(message, wParam, lParam);\n  /*\n  if (code == BN_CLICKED)\n    return OnButtonClicked(itemID, (HWND)lParam);\n  */\n}\n\n/*\nbool CDialog::OnButtonClicked(int buttonID, HWND buttonHWND)\n{\n  switch(aButtonID)\n  {\n    case IDOK:\n      OnOK();\n      break;\n    case IDCANCEL:\n      OnCancel();\n      break;\n    case IDHELP:\n      OnHelp();\n      break;\n    default:\n      return false;\n  }\n  return true;\n}\n\n*/\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Control/Window2.h",
    "content": "// Windows/Control/Window2.h\n\n#ifndef __WINDOWS_CONTROL_WINDOW2_H\n#define __WINDOWS_CONTROL_WINDOW2_H\n\n#include \"Windows/Window.h\"\n#include \"Windows/Defs.h\"\n\n#ifndef _WIN32\ntypedef void * WNDPROC;\ntypedef void * CREATESTRUCT;\ntypedef struct\n{\n\tHWND  hwndFrom;\n\n\tUINT  code;\n#define NM_DBLCLK       1\n#define LVN_ITEMCHANGED 2\n#define LVN_COLUMNCLICK 3\n} NMHDR;\ntypedef NMHDR * LPNMHDR;\n\ntypedef struct tagNMLISTVIEW\n{\n    NMHDR hdr;\n    INT iItem;\n    INT iSubItem;\n    UINT uNewState;\n    UINT uOldState;\n    // UINT uChanged;\n    // POINT ptAction;\n    LPARAM  lParam;\n} NMLISTVIEW, *LPNMLISTVIEW;\n\ntypedef void * LPNMITEMACTIVATE;\n\n#define NM_RCLICK 1234 /* FIXME */\n\n// FIXME\n#define WM_CREATE 1\n#define WM_COMMAND 2\n#define WM_NOTIFY 3\n#define WM_DESTROY 4\n#define WM_CLOSE 5\n\n#define HIWORD(l)              ((WORD)((DWORD_PTR)(l) >> 16))\n#define LOWORD(l)              ((WORD)((DWORD_PTR)(l) & 0xFFFF))\n\n\n#endif\n\nnamespace NWindows {\nnamespace NControl {\n\nclass CWindow2 // : public CWindow\n{\n  // LRESULT DefProc(UINT message, WPARAM wParam, LPARAM lParam);\npublic:\n  // CWindow2(HWND newWindow = NULL): CWindow(newWindow){};\n  CWindow2() {}\n  virtual ~CWindow2() {}\n\n#ifdef _WIN32\n  bool CreateEx(DWORD exStyle, LPCTSTR className,\n      LPCTSTR windowName, DWORD style,\n      int x, int y, int width, int height,\n      HWND parentWindow, HMENU idOrHMenu,\n      HINSTANCE instance);\n\n  #ifndef _UNICODE\n  bool CreateEx(DWORD exStyle, LPCWSTR className,\n      LPCWSTR windowName, DWORD style,\n      int x, int y, int width, int height,\n      HWND parentWindow, HMENU idOrHMenu,\n      HINSTANCE instance);\n  #endif\n#endif\n\n  virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);\n  virtual bool OnCreate(CREATESTRUCT * /* createStruct */) { return true; }\n  // virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam);\n  virtual bool OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result);\n  virtual bool OnCommand(int code, int itemID, LPARAM lParam, LRESULT &result);\n  virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; }\n  virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */, LRESULT & /* result */) { return false; }\n  virtual void OnDestroy() { /* FIXME PostQuitMessage(0); */ }\n  virtual void OnClose() { /* FIXME Destroy(); */ }\n  /*\n  virtual LRESULT  OnHelp(LPHELPINFO helpInfo) { OnHelp(); };\n  virtual LRESULT  OnHelp() {};\n  virtual bool OnButtonClicked(int buttonID, HWND buttonHWND);\n  virtual void OnOK() {};\n  virtual void OnCancel() {};\n  */\n\n#ifdef _WIN32\n  LONG_PTR SetMsgResult(LONG_PTR newLongPtr )\n    { return SetLongPtr(DWLP_MSGRESULT, newLongPtr); }\n  LONG_PTR GetMsgResult() const\n    { return GetLongPtr(DWLP_MSGRESULT); }\n#endif\n};\n\n}}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/DLL.cpp",
    "content": "// Windows/DLL.cpp\n\n#include \"StdAfx.h\"\n\n#ifdef __APPLE_CC__\n#include <mach-o/dyld.h>\n#elif ENV_BEOS\n#include <kernel/image.h>\n#include <Path.h>\n#else\n#define UINT64 DLL_UINT64 // HP-UX , dlfcn.h defines UINT64 but p7zip also defines UINT64\n#include <dlfcn.h>  // dlopen ...\n#undef UINT64\n#endif\n\n#include \"DLL.h\"\n#include \"Defs.h\"\n#ifdef _UNICODE\n#include \"../Common/StringConvert.h\"\n#endif\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n#include \"myPrivate.h\"\n\n// #define TRACEN(u) u;\n#define TRACEN(u)  /* */\n\nnamespace NWindows {\nnamespace NDLL {\n\nCLibrary::~CLibrary()\n{\n  Free();\n}\n\nbool CLibrary::Free()\n{\nTRACEN((printf(\"CLibrary::Free(%p)\\n\",(void *)_module)))\n  if (_module == 0)\n    return true;\n\n#ifdef __APPLE_CC__\n  int ret = NSUnLinkModule ((NSModule)_module, 0);\n#elif ENV_BEOS\n  int ret = unload_add_on((image_id)_module);\n#else\n  int ret = dlclose(_module);\n#endif\nTRACEN((printf(\"CLibrary::Free dlclose(%p)=%d\\n\",(void *)_module,ret)))\n  if (ret != 0) return false;\n  _module = 0;\n  return true;\n}\n\nstatic FARPROC local_GetProcAddress(HMODULE module,LPCSTR lpProcName)\n{\n  void *ptr = 0;\n  TRACEN((printf(\"local_GetProcAddress(%p,%s)\\n\",(void *)module,lpProcName)))\n  if (module) {\n#ifdef __APPLE_CC__\n    char name[MAX_PATHNAME_LEN];\n    snprintf(name,sizeof(name),\"_%s\",lpProcName);\n    name[sizeof(name)-1] = 0;\n    TRACEN((printf(\"NSLookupSymbolInModule(%p,%s)\\n\",(void *)module,name)))\n    NSSymbol sym;\n    sym = NSLookupSymbolInModule((NSModule)module, name);\n    if (sym) {\n      ptr = NSAddressOfSymbol(sym);\n    } else {\n      ptr = 0;\n    }\n#elif ENV_BEOS\n    if (get_image_symbol((image_id)module, lpProcName, B_SYMBOL_TYPE_TEXT, &ptr) != B_OK)\n      ptr = 0;\n#else\n    ptr = dlsym (module, lpProcName);\n#endif\n\tTRACEN((printf(\"CLibrary::GetProcAddress : dlsym(%p,%s)=%p\\n\",(void *)module,lpProcName,ptr)))\n  }\n  return (FARPROC)ptr;\n}\n\nFARPROC CLibrary::GetProcAddress(LPCSTR lpProcName) const\n{\n  TRACEN((printf(\"CLibrary::GetProcAddress(%p,%s)\\n\",(void *)_module,lpProcName)))\n  return local_GetProcAddress(_module,lpProcName);\n}\n\nbool CLibrary::LoadOperations(HMODULE newModule)\n{\n  if (newModule == NULL)\n    return false;\n  if(!Free())\n    return false;\n  _module = newModule;\n  return true;\n}\n\nbool CLibrary::Load(LPCTSTR lpLibFileName)\n{\n  void *handler = 0;\n  char  name[MAX_PATHNAME_LEN+1];\n#ifdef _UNICODE\n  AString name2 = UnicodeStringToMultiByte(lpLibFileName);\n  strcpy(name,nameWindowToUnix((const char *)name2));\n#else\n  strcpy(name,nameWindowToUnix(lpLibFileName));\n#endif\n  \n  // replace \".dll\" with \".so\"\n  size_t len = strlen(name);\n  if ((len >=4) && (strcmp(name+len-4,\".dll\") == 0)) {\n    strcpy(name+len-4,\".so\");\n  }\n\n  TRACEN((printf(\"CLibrary::Load(%s) => %s\\n\",lpLibFileName,name)))\n\n#ifdef __APPLE_CC__\n  NSObjectFileImage image;\n  NSObjectFileImageReturnCode nsret;\n\n  nsret = NSCreateObjectFileImageFromFile (name, &image);\n  if (nsret == NSObjectFileImageSuccess) {\n     TRACEN((printf(\"NSCreateObjectFileImageFromFile(%s) : OK\\n\",name)))\n     handler = (HMODULE)NSLinkModule(image,lpLibFileName,NSLINKMODULE_OPTION_RETURN_ON_ERROR\n           | NSLINKMODULE_OPTION_PRIVATE | NSLINKMODULE_OPTION_BINDNOW);\n  } else {\n     TRACEN((printf(\"NSCreateObjectFileImageFromFile(%s) : ERROR\\n\",name)))\n  }\n#elif ENV_BEOS\n  // normalize path (remove things like \"./\", \"..\", etc..), otherwise it won't work\n  BPath p(name, NULL, true);\n  status_t err = B_OK;\n  image_id image = load_add_on(p.Path());\nTRACEN((printf(\"load_add_on(%s)=%d\\n\",p.Path(),(int)image)))\n  if (image < 0) {\n    err = (image_id)handler;\n    handler = 0;\n  } else {\n    err = 0;\n    handler = (HMODULE)image;\n  }\n#else\n  int options_dlopen = 0;\n#ifdef RTLD_LOCAL\n  options_dlopen |= RTLD_LOCAL;\n#endif\n#ifdef RTLD_NOW\n  options_dlopen |= RTLD_NOW;\n#endif\n#ifdef RTLD_GROUP\n  #if ! (defined(hpux) || defined(__hpux))\n  options_dlopen |= RTLD_GROUP; // mainly for solaris but not for HPUX\n  #endif\n#endif\n  TRACEN((printf(\"CLibrary::Load - dlopen(%s,0x%d)\\n\",name,options_dlopen)))\n  handler = dlopen(name,options_dlopen);\n#endif // __APPLE_CC__\n  TRACEN((printf(\"CLibrary::Load(%s) => %p\\n\",name,handler)))\n  if (handler) {\n\n    // Call DllMain() like in Windows : useless now\n\n    // Propagate the value of global_use_utf16_conversion into the plugins\n    int *tmp = (int *)local_GetProcAddress(handler,\"global_use_utf16_conversion\");\n    if (tmp) *tmp = global_use_utf16_conversion;\n\n    tmp = (int *)local_GetProcAddress(handler,\"global_use_lstat\");\n    if (tmp) *tmp = global_use_lstat;\n\n    // test construtors calls\n    void (*fctTest)(void) = (void (*)(void))local_GetProcAddress(handler,\"sync_TestConstructor\");\n    if (fctTest) fctTest();\n\n  } else {\n#ifdef __APPLE_CC__\n    NSLinkEditErrors c;\n    int num_err;\n    const char *file,*err;\n    NSLinkEditError(&c,&num_err,&file,&err);\n    printf(\"Can't load '%s' (%s)\\n\", lpLibFileName,err);\n#elif ENV_BEOS\n    printf(\"Can't load '%s' (%s)\\n\", lpLibFileName,strerror(err));\n#else\n    printf(\"Can't load '%s' (%s)\\n\", lpLibFileName,dlerror());\n#endif\n  } \n\n  return LoadOperations(handler);\n}\n\n}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/DLL.h",
    "content": "// Windows/DLL.h\n\n#ifndef __WINDOWS_DLL_H\n#define __WINDOWS_DLL_H\n\n#include \"../Common/MyString.h\"\n\ntypedef void * HMODULE;\n\ntypedef int (*FARPROC)();\n\nnamespace NWindows {\nnamespace NDLL {\n\nclass CLibrary\n{\n  bool LoadOperations(HMODULE newModule);\n  HMODULE _module;\npublic:\n  operator HMODULE() const { return _module; }\n  HMODULE* operator&() { return &_module; }\n\n\n  CLibrary():_module(NULL) {};\n  ~CLibrary();\n\n  bool Free();\n\n  void Attach(HMODULE m)\n  {\n    Free();\n    _module = m;\n  }\n  HMODULE Detach()\n  {\n    HMODULE m = _module;\n    _module = NULL;\n    return m;\n  }\n\n\n  bool Load(LPCTSTR fileName);\n  FARPROC GetProcAddress(LPCSTR procName) const;\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Defs.h",
    "content": "// Windows/Defs.h\n\n#ifndef __WINDOWS_DEFS_H\n#define __WINDOWS_DEFS_H\n\ninline bool BOOLToBool(BOOL value)\n  { return (value != FALSE); }\n\n#ifdef _WIN32\ninline bool LRESULTToBool(LRESULT value)\n  { return (value != FALSE); }\n#endif\n\ninline BOOL BoolToBOOL(bool value)\n  { return (value ? TRUE: FALSE); }\n\ninline VARIANT_BOOL BoolToVARIANT_BOOL(bool value)\n  { return (value ? VARIANT_TRUE: VARIANT_FALSE); }\n\ninline bool VARIANT_BOOLToBool(VARIANT_BOOL value)\n  { return (value != VARIANT_FALSE); }\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Error.cpp",
    "content": "// Windows/Error.h\n\n#include \"StdAfx.h\"\n\n#include \"Windows/Error.h\"\n#include \"Common/StringConvert.h\"\n\nnamespace NWindows {\nnamespace NError {\n\nbool MyFormatMessage(DWORD messageID, CSysString &message)\n{\n  const char * txt = 0;\n  AString msg;\n\n  switch(messageID) {\n    case ERROR_NO_MORE_FILES   : txt = \"No more files\"; break ;\n    case E_NOTIMPL             : txt = \"E_NOTIMPL\"; break ;\n    case E_NOINTERFACE         : txt = \"E_NOINTERFACE\"; break ;\n    case E_ABORT               : txt = \"E_ABORT\"; break ;\n    case E_FAIL                : txt = \"E_FAIL\"; break ;\n    case STG_E_INVALIDFUNCTION : txt = \"STG_E_INVALIDFUNCTION\"; break ;\n    case E_OUTOFMEMORY         : txt = \"E_OUTOFMEMORY\"; break ;\n    case E_INVALIDARG          : txt = \"E_INVALIDARG\"; break ;\n    default:\n      txt = strerror(messageID);\n  }\n  if (txt) {\n    msg = txt;\n  } else {\n    char msgBuf[256];\n    snprintf(msgBuf,sizeof(msgBuf),\"error #%x\",(unsigned)messageID);\n    msgBuf[sizeof(msgBuf)-1] = 0;\n    msg = msgBuf;\n  }\n  \n  msg += \"                \";\n\n#ifdef _UNICODE\n  message = MultiByteToUnicodeString(msg);\n#else\n  message = msg;\n#endif\n  return true;\n}\n\n#ifndef _UNICODE\nbool MyFormatMessage(DWORD messageID, UString &message)\n{\n    CSysString messageSys;\n    bool result = MyFormatMessage(messageID, messageSys);\n    message = GetUnicodeString(messageSys);\n    return result;\n}\n#endif\n\n}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Error.h",
    "content": "// Windows/Error.h\n\n#ifndef __WINDOWS_ERROR_H\n#define __WINDOWS_ERROR_H\n\n#include \"Common/MyString.h\"\n\nnamespace NWindows {\nnamespace NError {\n\nbool MyFormatMessage(DWORD messageID, CSysString &message);\ninline CSysString MyFormatMessage(DWORD messageID)\n{\n  CSysString message;\n  MyFormatMessage(messageID, message);\n  return message;\n}\n#ifdef _UNICODE\ninline UString MyFormatMessageW(DWORD messageID)\n  { return MyFormatMessage(messageID); }\n#else\nbool MyFormatMessage(DWORD messageID, UString &message);\ninline UString MyFormatMessageW(DWORD messageID)\n{\n  UString message;\n  MyFormatMessage(messageID, message);\n  return message;\n}\n#endif\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileDir.cpp",
    "content": "// Windows/FileDir.cpp\n\n#include \"StdAfx.h\"\n\n#include \"FileDir.h\"\n#include \"FileName.h\"\n#include \"FileFind.h\"\n#include \"Defs.h\"\n#include \"../Common/StringConvert.h\"\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n#include \"myPrivate.h\"\n\n#include <unistd.h> // rmdir\n#include <errno.h>\n\n#include <sys/stat.h> // mkdir\n#include <sys/types.h>\n#include <fcntl.h>\n\n#include <utime.h>\n\n// #define TRACEN(u) u;\n#define TRACEN(u)  /* */\n\nclass Umask\n{\n  public:\n  mode_t  current_umask;\n  mode_t  mask;\n  Umask() {\n    current_umask = umask (0);  /* get and set the umask */\n    umask(current_umask);\t/* restore the umask */\n    mask = 0777 & (~current_umask);\n  } \n};\n\nstatic Umask gbl_umask;\n\n#ifdef _UNICODE\nAString nameWindowToUnix2(LPCWSTR name) // FIXME : optimization ?\n{\n   AString astr = UnicodeStringToMultiByte(name);\n   return AString(nameWindowToUnix((const char *)astr));\n}\n#endif\n\nextern BOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *Time, DWORD *Seconds );\n\n#ifdef _UNICODE\nDWORD WINAPI GetFullPathName( LPCTSTR name, DWORD len, LPTSTR buffer, LPTSTR *lastpart ) { // FIXME\n  if (name == 0) return 0;\n\n  DWORD name_len = lstrlen(name);\n\n  if (name[0] == '/') {\n    DWORD ret = name_len+2;\n    if (ret >= len) {\n      TRACEN((printf(\"GetFullPathNameA(%ls,%d,)=0000 (case 0)\\n\",name, (int)len)))\n      return 0;\n    }\n    lstrcpy(buffer,L\"c:\");\n    lstrcat(buffer,name);\n\n    *lastpart=buffer;\n    TCHAR *ptr=buffer;\n    while (*ptr) {\n      if (*ptr == '/')\n        *lastpart=ptr+1;\n      ptr++;\n    }\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,%ls,%ls)=%d\\n\",name, (int)len,buffer, *lastpart,(int)ret)))\n    return ret;\n  }\n  if (isascii(name[0]) && (name[1] == ':')) { // FIXME isascii\n    DWORD ret = name_len;\n    if (ret >= len) {\n      TRACEN((printf(\"GetFullPathNameA(%ls,%d,)=0000 (case 1)\\n\",name, (int)len)))\n      return 0;\n    }\n    lstrcpy(buffer,name);\n\n    *lastpart=buffer;\n    TCHAR *ptr=buffer;\n    while (*ptr) {\n      if (*ptr == '/')\n        *lastpart=ptr+1;\n      ptr++;\n    }\n    TRACEN((printf(\"GetFullPathNameA(%sl,%d,%ls,%ls)=%d\\n\",name, (int)len,buffer, *lastpart,(int)ret)))\n    return ret;\n  }\n\n  // name is a relative pathname.\n  //\n  if (len < 2) {\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 2)\\n\",name, (int)len)))\n    return 0;\n  }\n\n  DWORD ret = 0;\n  char begin[MAX_PATHNAME_LEN];\n  /* DWORD begin_len = GetCurrentDirectoryA(MAX_PATHNAME_LEN,begin); */\n  DWORD begin_len = 0;\n  begin[0]='c';\n  begin[1]=':';\n  char * cret = getcwd(begin+2, MAX_PATHNAME_LEN - 3);\n  if (cret) {\n    begin_len = strlen(begin);\n  }\n   \n  if (begin_len >= 1) {\n    //    strlen(begin) + strlen(\"/\") + strlen(name)\n    ret = begin_len     +    1        + name_len;\n\n    if (ret >= len) {\n      TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 4)\\n\",name, (int)len)))\n      return 0;\n    }\n    UString wbegin = GetUnicodeString(begin);\n    lstrcpy(buffer,wbegin);\n    lstrcat(buffer,L\"/\");\n    lstrcat(buffer,name);\n\n    *lastpart=buffer + begin_len + 1;\n    TCHAR *ptr=buffer;\n    while (*ptr) {\n      if (*ptr == '/')\n        *lastpart=ptr+1;\n      ptr++;\n    }\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,%s,%s)=%d\\n\",name, (int)len,buffer, *lastpart,(int)ret)))\n  } else {\n    ret = 0;\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 5)\\n\",name, (int)len)))\n  }\n  return ret;\n}\n\n#endif\n\nDWORD WINAPI GetFullPathName( LPCSTR name, DWORD len, LPSTR buffer, LPSTR *lastpart ) {\n  if (name == 0) return 0;\n\n  DWORD name_len = strlen(name);\n\n  if (name[0] == '/') {\n    DWORD ret = name_len+2;\n    if (ret >= len) {\n      TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 0)\\n\",name, (int)len)))\n      return 0;\n    }\n    strcpy(buffer,\"c:\");\n    strcat(buffer,name);\n\n    *lastpart=buffer;\n    char *ptr=buffer;\n    while (*ptr) {\n      if (*ptr == '/')\n        *lastpart=ptr+1;\n      ptr++;\n    }\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,%s,%s)=%d\\n\",name, (int)len,buffer, *lastpart,(int)ret)))\n    return ret;\n  }\n  if (isascii(name[0]) && (name[1] == ':')) {\n    DWORD ret = name_len;\n    if (ret >= len) {\n      TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 1)\\n\",name, (int)len)))\n      return 0;\n    }\n    strcpy(buffer,name);\n\n    *lastpart=buffer;\n    char *ptr=buffer;\n    while (*ptr) {\n      if (*ptr == '/')\n        *lastpart=ptr+1;\n      ptr++;\n    }\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,%s,%s)=%d\\n\",name, (int)len,buffer, *lastpart,(int)ret)))\n    return ret;\n  }\n\n  // name is a relative pathname.\n  //\n  if (len < 2) {\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 2)\\n\",name, (int)len)))\n    return 0;\n  }\n\n  DWORD ret = 0;\n  char begin[MAX_PATHNAME_LEN];\n  /* DWORD begin_len = GetCurrentDirectoryA(MAX_PATHNAME_LEN,begin); */\n  DWORD begin_len = 0;\n  begin[0]='c';\n  begin[1]=':';\n  char * cret = getcwd(begin+2, MAX_PATHNAME_LEN - 3);\n  if (cret) {\n    begin_len = strlen(begin);\n  }\n   \n  if (begin_len >= 1) {\n    //    strlen(begin) + strlen(\"/\") + strlen(name)\n    ret = begin_len     +    1        + name_len;\n\n    if (ret >= len) {\n      TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 4)\\n\",name, (int)len)))\n      return 0;\n    }\n    strcpy(buffer,begin);\n    strcat(buffer,\"/\");\n    strcat(buffer,name);\n\n    *lastpart=buffer + begin_len + 1;\n    char *ptr=buffer;\n    while (*ptr) {\n      if (*ptr == '/')\n        *lastpart=ptr+1;\n      ptr++;\n    }\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,%s,%s)=%d\\n\",name, (int)len,buffer, *lastpart,(int)ret)))\n  } else {\n    ret = 0;\n    TRACEN((printf(\"GetFullPathNameA(%s,%d,)=0000 (case 5)\\n\",name, (int)len)))\n  }\n  return ret;\n}\n\nstatic BOOL WINAPI RemoveDirectory(LPCSTR path) {\n  if (!path || !*path) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return FALSE;\n  }\n  const char * name = nameWindowToUnix(path);\n  TRACEN((printf(\"RemoveDirectoryA(%s)\\n\",name)))\n\n  if (rmdir( name ) != 0) {\n    return FALSE;\n  }\n  return TRUE;\n}\n#ifdef _UNICODE\nstatic BOOL WINAPI RemoveDirectory(LPCWSTR path) {\n  if (!path || !*path) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return FALSE;\n  }\n  AString name = nameWindowToUnix2(path);\n  TRACEN((printf(\"RemoveDirectoryA(%s)\\n\",(const char *)name)))\n\n  if (rmdir( (const char *)name ) != 0) {\n    return FALSE;\n  }\n  return TRUE;\n}\n#endif\n\nstatic int copy_fd(int fin,int fout)\n{\n  char buffer[16384];\n  ssize_t ret_in;\n  ssize_t ret_out;\n\n  do {\n    ret_out = -1;\n    do {\n      ret_in = read(fin, buffer,sizeof(buffer));\n    } while (ret_in < 0 && (errno == EINTR));\n    if (ret_in >= 1) {\n      do {\n        ret_out = write (fout, buffer, ret_in);\n      } while (ret_out < 0 && (errno == EINTR));\n    } else if (ret_in == 0) {\n      ret_out = 0;\n    }\n  } while (ret_out >= 1);\n  return ret_out;\n}\n\nstatic BOOL CopyFile(const char *src,const char *dst)\n{\n  int ret = -1;\n\n#ifdef O_BINARY\n  int   flags = O_BINARY;\n#else\n  int   flags = 0;\n#endif\n\n#ifdef O_LARGEFILE\n  flags |= O_LARGEFILE;\n#endif\n\n  int fout = open(dst,O_CREAT | O_WRONLY | O_EXCL | flags, 0600);\n  if (fout != -1)\n  {\n    int fin = open(src,O_RDONLY | flags , 0600);\n    if (fin != -1)\n    {\n      ret = copy_fd(fin,fout);\n      if (ret == 0) ret = close(fin);\n      else                close(fin);\n    }\n    if (ret == 0) ret = close(fout);\n    else                close(fout);\n  }\n  if (ret == 0) return TRUE;\n  return FALSE;\n}\n\n/*****************************************************************************************/\n\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NDirectory {\n\n\nbool MySetCurrentDirectory(LPCWSTR wpath)\n{\n   AString path = UnicodeStringToMultiByte(wpath);\n\n   return chdir((const char*)path) == 0;\n}\n\n#ifdef _UNICODE\nbool GetOnlyName(LPCTSTR fileName, CSysString &resultName)\n{\n  int index;\n  if (!MyGetFullPathName(fileName, resultName, index))\n    return false;\n  resultName = resultName.Mid(index);\n  return true;\n}\n\nbool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName)\n{\n  int index;\n  if (!MyGetFullPathName(fileName, resultName, index))\n    return false;\n  resultName = resultName.Left(index);\n  return true;\n}\n#endif\n\n\nbool MyGetCurrentDirectory(CSysString &resultPath)\n{\n  char begin[MAX_PATHNAME_LEN];\n  begin[0]='c';\n  begin[1]=':';\n  char * cret = getcwd(begin+2, MAX_PATHNAME_LEN - 3);\n  if (cret)\n  {\n#ifdef _UNICODE\n    resultPath = GetUnicodeString(begin);\n#else\n    resultPath = begin;\n#endif\n    return true;\n  }\n  return false;\n}\n\nbool MyMoveFile( LPCTSTR fn1, LPCTSTR fn2 ) {\n#ifdef _UNICODE\n  AString src = nameWindowToUnix2(fn1);\n  AString dst = nameWindowToUnix2(fn2);\n#else\n  const char * src = nameWindowToUnix(fn1);\n  const char * dst = nameWindowToUnix(fn2);\n#endif\n\n  TRACEN((printf(\"MoveFileW(%s,%s)\\n\",src,dst)))\n\n  int ret = rename(src,dst);\n  if (ret != 0)\n  {\n    if (errno == EXDEV) // FIXED : bug #1112167 (Temporary directory must be on same partition as target)\n    {\n      BOOL bret = CopyFile(src,dst);\n      if (bret == FALSE) return false;\n\n      struct stat info_file;\n      ret = stat(src,&info_file);\n      if (ret == 0) {\n\tTRACEN((printf(\"##DBG chmod-1(%s,%o)\\n\",dst,(unsigned)info_file.st_mode & gbl_umask.mask)))\n        ret = chmod(dst,info_file.st_mode & gbl_umask.mask);\n      }\n      if (ret == 0) {\n         ret = unlink(src);\n      }\n      if (ret == 0) return true;\n    }\n    return false;\n  }\n  return true;\n}\n\nbool MyRemoveDirectory(LPCTSTR pathName)\n{\n  return BOOLToBool(::RemoveDirectory(pathName));\n}\n\nbool SetDirTime(LPCWSTR fileName, const FILETIME * /* creationTime */ ,\n      const FILETIME *lpLastAccessTime, const FILETIME *lpLastWriteTime)\n{\n  AString  cfilename = UnicodeStringToMultiByte(fileName);\n  const char * unix_filename = nameWindowToUnix((const char *)cfilename);\n\n  struct utimbuf buf;\n\n  struct stat    oldbuf;\n  int ret = stat(unix_filename,&oldbuf);\n  if (ret == 0) {\n    buf.actime  = oldbuf.st_atime;\n    buf.modtime = oldbuf.st_mtime;\n  } else {\n    time_t current_time = time(0);\n    buf.actime  = current_time;\n    buf.modtime = current_time;\n  }\n\n  if (lpLastAccessTime)\n  {\n    LARGE_INTEGER  ltime;\n    DWORD dw;\n    ltime.QuadPart = lpLastAccessTime->dwHighDateTime;\n    ltime.QuadPart = (ltime.QuadPart << 32) | lpLastAccessTime->dwLowDateTime;\n    RtlTimeToSecondsSince1970( &ltime, &dw );\n    buf.actime = dw;\n  }\n\n  if (lpLastWriteTime)\n  {\n    LARGE_INTEGER  ltime;\n    DWORD dw;\n    ltime.QuadPart = lpLastWriteTime->dwHighDateTime;\n    ltime.QuadPart = (ltime.QuadPart << 32) | lpLastWriteTime->dwLowDateTime;\n    RtlTimeToSecondsSince1970( &ltime, &dw );\n    buf.modtime = dw;\n  }\n\n  /* ret = */ utime(unix_filename, &buf);\n\n  return true;\n}\n\n#ifndef _UNICODE\nbool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes)\n{  \n  return MySetFileAttributes(UnicodeStringToMultiByte(fileName, CP_ACP), fileAttributes);\n}\n\nbool MyRemoveDirectory(LPCWSTR pathName)\n{  \n  return MyRemoveDirectory(UnicodeStringToMultiByte(pathName, CP_ACP));\n}\n\nbool MyMoveFile(LPCWSTR existFileName, LPCWSTR newFileName)\n{  \n  UINT codePage = CP_ACP;\n  return MyMoveFile(UnicodeStringToMultiByte(existFileName, codePage), UnicodeStringToMultiByte(newFileName, codePage));\n}\n#endif\n\n\nstatic int convert_to_symlink(const char * name) {\n  FILE *file = fopen(name,\"rb\");\n  if (file) {\n    char buf[MAX_PATHNAME_LEN+1];\n    char * ret = fgets(buf,sizeof(buf)-1,file);\n    fclose(file);\n    if (ret) {\n      int ir = unlink(name);\n      if (ir == 0) {\n        ir = symlink(buf,name);\n      }\n      return ir;    \n    }\n  }\n  return -1;\n}\n\nbool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes)\n{\n  if (!fileName) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    TRACEN((printf(\"MySetFileAttributes(NULL,%d) : false-1\\n\",fileAttributes)))\n    return false;\n  }\n#ifdef _UNICODE\n  AString name = nameWindowToUnix2(fileName);\n#else\n  const char * name = nameWindowToUnix(fileName);\n#endif\n  struct stat stat_info;\n#ifdef HAVE_LSTAT\n  if (global_use_lstat) {\n    if(lstat(name,&stat_info)!=0) {\n      TRACEN((printf(\"MySetFileAttributes(%s,%d) : false-2-1\\n\",name,fileAttributes)))\n      return false;\n    }\n  } else\n#endif\n  {\n    if(stat(name,&stat_info)!=0) {\n      TRACEN((printf(\"MySetFileAttributes(%s,%d) : false-2-2\\n\",name,fileAttributes)))\n      return false;\n    }\n  }\n\n  if (fileAttributes & FILE_ATTRIBUTE_UNIX_EXTENSION) {\n     stat_info.st_mode = fileAttributes >> 16;\n#ifdef HAVE_LSTAT\n     if (S_ISLNK(stat_info.st_mode)) {\n        if ( convert_to_symlink(name) != 0) {\n          TRACEN((printf(\"MySetFileAttributes(%s,%d) : false-3\\n\",name,fileAttributes)))\n          return false;\n        }\n     } else\n#endif\n     if (S_ISREG(stat_info.st_mode)) {\n       TRACEN((printf(\"##DBG chmod-2(%s,%o)\\n\",name,(unsigned)stat_info.st_mode & gbl_umask.mask)))\n       chmod(name,stat_info.st_mode & gbl_umask.mask);\n     } else if (S_ISDIR(stat_info.st_mode)) {\n       // user/7za must be able to create files in this directory\n       stat_info.st_mode |= (S_IRUSR | S_IWUSR | S_IXUSR);\n       TRACEN((printf(\"##DBG chmod-3(%s,%o)\\n\",name,(unsigned)stat_info.st_mode & gbl_umask.mask)))\n       chmod(name,stat_info.st_mode & gbl_umask.mask);\n     }\n#ifdef HAVE_LSTAT\n  } else if (!S_ISLNK(stat_info.st_mode)) {\n    // do not use chmod on a link\n#else\n  } else {\n#endif\n\n    /* Only Windows Attributes */\n    if( S_ISDIR(stat_info.st_mode)) {\n       /* Remark : FILE_ATTRIBUTE_READONLY ignored for directory. */\n       TRACEN((printf(\"##DBG chmod-4(%s,%o)\\n\",name,(unsigned)stat_info.st_mode & gbl_umask.mask)))\n       chmod(name,stat_info.st_mode & gbl_umask.mask);\n    } else {\n       if (fileAttributes & FILE_ATTRIBUTE_READONLY) stat_info.st_mode &= ~0222; /* octal!, clear write permission bits */\n       TRACEN((printf(\"##DBG chmod-5(%s,%o)\\n\",name,(unsigned)stat_info.st_mode & gbl_umask.mask)))\n       chmod(name,stat_info.st_mode & gbl_umask.mask);\n    }\n  }\n  TRACEN((printf(\"MySetFileAttributes(%s,%d) : true\\n\",name,fileAttributes)))\n\n  return true;\n}\n\nbool MyCreateDirectory(LPCTSTR pathName)\n{  \n  if (!pathName || !*pathName) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return false;\n  }\n\n#ifdef _UNICODE\n  AString name = nameWindowToUnix2(pathName);\n#else\n  const char * name = nameWindowToUnix(pathName);\n#endif\n  bool bret = false;\n  if (mkdir( name, 0700 ) == 0) bret = true;\n\n  TRACEN((printf(\"MyCreateDirectory(%s)=%d\\n\",name,(int)bret)))\n  return bret;\n}\n\n#ifndef _UNICODE\nbool MyCreateDirectory(LPCWSTR pathName)\n{  \n  return MyCreateDirectory(UnicodeStringToMultiByte(pathName, CP_ACP));\n}\n#endif\n\nbool CreateComplexDirectory(LPCTSTR _aPathName)\n{\n  CSysString pathName = _aPathName;\n  int pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR));\n  if (pos > 0 && pos == pathName.Length() - 1)\n  {\n    if (pathName.Length() == 3 && pathName[1] == ':')\n      return true; // Disk folder;\n    pathName.Delete(pos);\n  }\n  CSysString pathName2 = pathName;\n  pos = pathName.Length();\n  while(true)\n  {\n    if(MyCreateDirectory(pathName))\n      break;\n    if(::GetLastError() == ERROR_ALREADY_EXISTS)\n    {\n#ifdef _WIN32 // FIXED for supporting symbolic link instead of a directory\n      NFind::CFileInfo fileInfo;\n      if (!NFind::FindFile(pathName, fileInfo)) // For network folders\n        return true;\n      if (!fileInfo.IsDir())\n        return false;\n#endif\n      break;\n    }\n    pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR));\n    if (pos < 0 || pos == 0)\n      return false;\n    if (pathName[pos - 1] == ':')\n      return false;\n    pathName = pathName.Left(pos);\n  }\n  pathName = pathName2;\n  while(pos < pathName.Length())\n  {\n    pos = pathName.Find(TEXT(CHAR_PATH_SEPARATOR), pos + 1);\n    if (pos < 0)\n      pos = pathName.Length();\n    if(!MyCreateDirectory(pathName.Left(pos)))\n      return false;\n  }\n  return true;\n}\n\n#ifndef _UNICODE\n\nbool CreateComplexDirectory(LPCWSTR _aPathName)\n{\n  UString pathName = _aPathName;\n  int pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR);\n  if (pos > 0 && pos == pathName.Length() - 1)\n  {\n    if (pathName.Length() == 3 && pathName[1] == L':')\n      return true; // Disk folder;\n    pathName.Delete(pos);\n  }\n  UString pathName2 = pathName;\n  pos = pathName.Length();\n  while(true)\n  {\n    if(MyCreateDirectory(pathName))\n      break;\n    if(::GetLastError() == ERROR_ALREADY_EXISTS)\n    {\n#ifdef _WIN32 // FIXED for supporting symbolic link instead of a directory\n      NFind::CFileInfoW fileInfo;\n      if (!NFind::FindFile(pathName, fileInfo)) // For network folders\n        return true;\n      if (!fileInfo.IsDir())\n        return false;\n#endif\n      break;\n    }\n    pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR);\n    if (pos < 0 || pos == 0)\n      return false;\n    if (pathName[pos - 1] == L':')\n      return false;\n    pathName = pathName.Left(pos);\n  }\n  pathName = pathName2;\n  while(pos < pathName.Length())\n  {\n    pos = pathName.Find(WCHAR_PATH_SEPARATOR, pos + 1);\n    if (pos < 0)\n      pos = pathName.Length();\n    if(!MyCreateDirectory(pathName.Left(pos)))\n      return false;\n  }\n  return true;\n}\n\n#endif\n\nbool DeleteFileAlways(LPCTSTR name)\n{\n  if (!name || !*name) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return false;\n  }\n#ifdef _UNICODE\n   AString unixname = nameWindowToUnix2(name);\n#else\n   const char * unixname = nameWindowToUnix(name);\n#endif\n   bool bret = false;\n   if (remove(unixname) == 0) bret = true;\n   TRACEN((printf(\"DeleteFileAlways(%s)=%d\\n\",unixname,(int)bret)))\n   return bret;\n}\n\n#ifndef _UNICODE\nbool DeleteFileAlways(LPCWSTR name)\n{  \n  return DeleteFileAlways(UnicodeStringToMultiByte(name, CP_ACP));\n}\n#endif\n\n#ifndef _WIN32_WCE\n\nbool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, \n    int &fileNamePartStartIndex)\n{\n  LPTSTR fileNamePointer = 0;\n  LPTSTR buffer = resultPath.GetBuffer(MAX_PATH);\n  DWORD needLength = ::GetFullPathName(fileName, MAX_PATH + 1, \n      buffer, &fileNamePointer);\n  resultPath.ReleaseBuffer();\n  if (needLength == 0 || needLength >= MAX_PATH)\n    return false;\n  if (fileNamePointer == 0)\n    fileNamePartStartIndex = lstrlen(fileName);\n  else\n    fileNamePartStartIndex = fileNamePointer - buffer;\n  return true;\n}\n\n#ifndef _UNICODE\nbool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, \n    int &fileNamePartStartIndex)\n{\n    const UINT currentPage = CP_ACP;\n    CSysString sysPath;\n    if (!MyGetFullPathName(UnicodeStringToMultiByte(fileName, \n        currentPage), sysPath, fileNamePartStartIndex))\n      return false;\n    UString resultPath1 = MultiByteToUnicodeString(\n        sysPath.Left(fileNamePartStartIndex), currentPage);\n    UString resultPath2 = MultiByteToUnicodeString(\n        sysPath.Mid(fileNamePartStartIndex), currentPage);\n    fileNamePartStartIndex = resultPath1.Length();\n    resultPath = resultPath1 + resultPath2;\n    return true;\n}\n#endif\n\n\nbool MyGetFullPathName(LPCTSTR fileName, CSysString &path)\n{\n  int index;\n  return MyGetFullPathName(fileName, path, index);\n}\n\n#ifndef _UNICODE\nbool MyGetFullPathName(LPCWSTR fileName, UString &path)\n{\n  int index;\n  return MyGetFullPathName(fileName, path, index);\n}\n#endif\n\n#endif\n\n/* needed to find .DLL/.so and SFX */\nbool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, UString &resultPath)\n{\n  if (path != 0) {\n    printf(\"NOT EXPECTED : MySearchPath : path != NULL\\n\");\n    exit(EXIT_FAILURE);\n  }\n\n  if (extension != 0) {\n    printf(\"NOT EXPECTED : MySearchPath : extension != NULL\\n\");\n    exit(EXIT_FAILURE);\n  }\n\n  if (fileName == 0) {\n    printf(\"NOT EXPECTED : MySearchPath : fileName == NULL\\n\");\n    exit(EXIT_FAILURE);\n  }\n\n  const char *p7zip_home_dir = getenv(\"P7ZIP_HOME_DIR\");\n  if (p7zip_home_dir) {\n    AString file_path = p7zip_home_dir;\n    file_path += UnicodeStringToMultiByte(fileName, CP_ACP);\n\n    TRACEN((printf(\"MySearchPath() fopen(%s)\\n\",(const char *)file_path)))\n    FILE *file = fopen((const char *)file_path,\"r\");\n    if (file) {\n      // file is found\n      fclose(file);\n      resultPath = MultiByteToUnicodeString(file_path, CP_ACP);\n      return true;\n    }\n  }\n  return false;\n}\n\n#ifndef _UNICODE\nbool MyGetTempPath(CSysString &path)\n{\n  path = \"c:/tmp/\"; // final '/' is needed\n  return true;\n}\n#endif\n\nbool MyGetTempPath(UString &path)\n{\n  path = L\"c:/tmp/\"; // final '/' is needed\n  return true;\n}\n\nUINT CTempFile::Create(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath)\n{\n  Remove();\n/* UINT number = ::GetTempFileName(dirPath, prefix, 0, path.GetBuffer(MAX_PATH)); */\n  UINT number = (UINT)getpid();\n  TCHAR * buf = resultPath.GetBuffer(MAX_PATH);\n#ifdef _UNICODE\n  swprintf(buf,MAX_PATH,L\"%s%s%d.tmp\",dirPath,prefix,(int)number);\n#else\n  snprintf(buf,MAX_PATH,\"%s%s%d.tmp\",dirPath,prefix,(int)number);\n#endif\n  buf[MAX_PATH-1]=0;\n  resultPath.ReleaseBuffer();\n  if(number != 0)\n  {\n    _fileName = resultPath;\n    _mustBeDeleted = true;\n  }\n  return number;\n}\n\nbool CTempFile::Remove()\n{\n  if (!_mustBeDeleted)\n    return true;\n  _mustBeDeleted = !DeleteFileAlways(_fileName);\n  return !_mustBeDeleted;\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileDir.h",
    "content": "// Windows/FileDir.h\n\n#ifndef __WINDOWS_FILEDIR_H\n#define __WINDOWS_FILEDIR_H\n\n#include \"../Common/MyString.h\"\n#include \"Defs.h\"\n\n/* GetFullPathName for 7zAES.cpp */\nDWORD WINAPI GetFullPathName( LPCSTR name, DWORD len, LPSTR buffer, LPSTR *lastpart );\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NDirectory {\n\nbool SetDirTime(LPCWSTR fileName, const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime);\n\nbool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes);\n#ifndef _UNICODE\nbool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes);\n#endif\n\nbool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName);\n#ifndef _UNICODE\nbool MyMoveFile(LPCWSTR existFileName, LPCWSTR newFileName);\n#endif\n\nbool MyRemoveDirectory(LPCTSTR pathName);\n#ifndef _UNICODE\nbool MyRemoveDirectory(LPCWSTR pathName);\n#endif\n\nbool MyCreateDirectory(LPCTSTR pathName);\nbool CreateComplexDirectory(LPCTSTR pathName);\n#ifndef _UNICODE\nbool MyCreateDirectory(LPCWSTR pathName);\nbool CreateComplexDirectory(LPCWSTR pathName);\n#endif\n\nbool DeleteFileAlways(LPCTSTR name);\n#ifndef _UNICODE\nbool DeleteFileAlways(LPCWSTR name);\n#endif\n\n#ifndef _WIN32_WCE\nbool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, \n    int &fileNamePartStartIndex);\nbool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath);\nbool GetOnlyName(LPCTSTR fileName, CSysString &resultName);\nbool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName);\n#ifndef _UNICODE\nbool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, \n    int &fileNamePartStartIndex);\nbool MyGetFullPathName(LPCWSTR fileName, UString &resultPath);\n#endif\n\n#endif\n\nbool MySetCurrentDirectory(LPCWSTR path);\nbool MyGetCurrentDirectory(CSysString &resultPath);\n\nbool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, UString &resultPath);\n\nbool MyGetTempPath(CSysString &resultPath);\n#ifndef _UNICODE\nbool MyGetTempPath(UString &resultPath);\n#endif\n\nclass CTempFile\n{\n  bool _mustBeDeleted;\n  CSysString _fileName;\npublic:\n  CTempFile(): _mustBeDeleted(false) {}\n  ~CTempFile() { Remove(); }\n  void DisableDeleting() { _mustBeDeleted = false; }\n  UINT Create(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath);\n  bool Remove();\n};\n\n#ifdef _UNICODE\ntypedef CTempFile CTempFileW;\n#endif\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileFind.cpp",
    "content": "// Windows/FileFind.cpp\n\n#include \"StdAfx.h\"\n\n#include \"FileFind.h\"\n#include \"../Common/StringConvert.h\"\n\n#include <sys/stat.h>\n#include <unistd.h>\n#include <errno.h>\n\n#ifdef HAVE_LSTAT\nextern \"C\"\n{\n\nint global_use_lstat=1; // default behaviour : p7zip stores symlinks instead of dumping the files they point to\n}\n#endif\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n#include \"myPrivate.h\"\n\n// #define TRACEN(u) u;\n#define TRACEN(u)  /* */\n\nvoid my_windows_split_path(const AString &p_path, AString &dir , AString &base) {\n  int pos = p_path.ReverseFind('/');\n  if (pos == -1) {\n    // no separator\n    dir  = \".\";\n    if (p_path.IsEmpty())\n      base = \".\";\n    else\n      base = p_path;\n  } else if ((pos+1) < p_path.Length()) {\n    // true separator\n    base = p_path.Mid(pos+1);\n    while ((pos >= 1) && (p_path[pos-1] == '/'))\n      pos--;\n    if (pos == 0)\n      dir = \"/\";\n    else\n      dir = p_path.Left(pos);\n  } else {\n    // separator at the end of the path\n    // pos = p_path.find_last_not_of(\"/\");\n    pos = -1;\n    int ind = 0;\n    while (p_path[ind]) {\n      if (p_path[ind] != '/')\n        pos = ind;\n      ind++;\n    }\n    if (pos == -1) {\n      base = \"/\";\n      dir = \"/\";\n    } else {\n      my_windows_split_path(p_path.Left(pos+1),dir,base);\n    }\n  }\n}\n\nstatic void my_windows_split_path(const UString &p_path, UString &dir , UString &base) {\n  int pos = p_path.ReverseFind(L'/');\n  if (pos == -1) {\n    // no separator\n    dir  = L\".\";\n    if (p_path.IsEmpty())\n      base = L\".\";\n    else\n      base = p_path;\n  } else if ((pos+1) < p_path.Length()) {\n    // true separator\n    base = p_path.Mid(pos+1);\n    while ((pos >= 1) && (p_path[pos-1] == L'/'))\n      pos--;\n    if (pos == 0)\n      dir = L\"/\";\n    else\n      dir = p_path.Left(pos);\n  } else {\n    // separator at the end of the path\n    // pos = p_path.find_last_not_of(\"/\");\n    pos = -1;\n    int ind = 0;\n    while (p_path[ind]) {\n      if (p_path[ind] != L'/')\n        pos = ind;\n      ind++;\n    }\n    if (pos == -1) {\n      base = L\"/\";\n      dir = L\"/\";\n    } else {\n      my_windows_split_path(p_path.Left(pos+1),dir,base);\n    }\n  }\n}\n\nstatic int filter_pattern(const char *string , const char *pattern , int flags_nocase) {\n  if ((string == 0) || (*string==0)) {\n    if (pattern == 0)\n      return 1;\n    while (*pattern=='*')\n      ++pattern;\n    return (!*pattern);\n  }\n\n  switch (*pattern) {\n  case '*':\n    if (!filter_pattern(string+1,pattern,flags_nocase))\n      return filter_pattern(string,pattern+1,flags_nocase);\n    return 1;\n  case 0:\n    if (*string==0)\n      return 1;\n    break;\n  case '?':\n    return filter_pattern(string+1,pattern+1,flags_nocase);\n  default:\n    if (   ((flags_nocase) && (tolower(*pattern)==tolower(*string)))\n           || (*pattern == *string)\n       ) {\n      return filter_pattern(string+1,pattern+1,flags_nocase);\n    }\n    break;\n  }\n  return 0;\n}\n\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NFind {\n\nstatic const TCHAR kDot = TEXT('.');\n\nbool CFileInfo::IsDots() const\n{ \n  if (!IsDir() || Name.IsEmpty())\n    return false;\n  if (Name[0] != kDot)\n    return false;\n  return Name.Length() == 1 || (Name[1] == kDot && Name.Length() == 2);\n}\n\nbool CFileInfoW::IsDots() const\n{ \n  if (!IsDir() || Name.IsEmpty())\n    return false;\n  if (Name[0] != kDot)\n    return false;\n  return Name.Length() == 1 || (Name[1] == kDot && Name.Length() == 2);\n}\n\nstatic bool originalFilename(const UString & src, AString & res)\n{\n  // Try to recover the original filename\n  res = \"\";\n  int is_good = 1;\n  int i=0;\n  while (src[i])\n  {\n    if (src[i] >= 256) {\n      return false;\n    } else {\n      res += char(src[i]);\n    }\n    i++;\n  }\n  return true;\n}\n\n\n\n// Warning this function cannot update \"fileInfo.Name\"\nstatic int fillin_CFileInfo(CFileInfo &fileInfo,const char *filename) {\n  struct stat stat_info;\n\n  int ret;\n#ifdef HAVE_LSTAT\n  if (global_use_lstat) {\n    ret = lstat(filename,&stat_info);\n  } else\n#endif\n  {\n     ret = stat(filename,&stat_info);\n  }\n\n  if (ret != 0) return ret;\n\n  /* FIXME : FILE_ATTRIBUTE_HIDDEN ? */\n  if (S_ISDIR(stat_info.st_mode)) {\n    fileInfo.Attrib = FILE_ATTRIBUTE_DIRECTORY;\n  } else {\n    fileInfo.Attrib = FILE_ATTRIBUTE_ARCHIVE;\n  }\n\n  if (!(stat_info.st_mode & S_IWUSR))\n    fileInfo.Attrib |= FILE_ATTRIBUTE_READONLY;\n\n  fileInfo.Attrib |= FILE_ATTRIBUTE_UNIX_EXTENSION + ((stat_info.st_mode & 0xFFFF) << 16);\n\n  RtlSecondsSince1970ToFileTime( stat_info.st_ctime, &fileInfo.CTime );\n  RtlSecondsSince1970ToFileTime( stat_info.st_mtime, &fileInfo.MTime );\n  RtlSecondsSince1970ToFileTime( stat_info.st_atime, &fileInfo.ATime );\n\n  if (S_ISDIR(stat_info.st_mode)) {\n    fileInfo.Size = 0;\n  } else { // file or symbolic link\n    fileInfo.Size = stat_info.st_size; // for a symbolic link, size = size of filename\n  }\n  return 0;\n}\n\nstatic int fillin_CFileInfo(CFileInfo &fileInfo,const char *dir,const char *name) {\n  struct stat stat_info;\n  char filename[MAX_PATHNAME_LEN];\n\n  size_t dir_len = strlen(dir);\n  size_t name_len = strlen(name);\n  size_t total = dir_len + 1 + name_len; // 1 = strlen(\"/\");\n  if (total >= MAX_PATHNAME_LEN) return -1;\n  memcpy(filename,dir,dir_len);\n  if (dir_len >= 1)\n  {\n\tif (filename[dir_len-1] == CHAR_PATH_SEPARATOR)\n\t{ // delete the '/'\n\t\tdir_len--;\n\t}\n  }\n  filename[dir_len] = CHAR_PATH_SEPARATOR;\n  memcpy(filename+(dir_len+1),name,name_len+1); // copy also final '\\0'\n\n  fileInfo.Name = name;\n\n  int ret = fillin_CFileInfo(fileInfo,filename);\n  if (ret != 0) {\n\tAString err_msg = \"stat error for \";\n        err_msg += filename;\n        err_msg += \" (\";\n        err_msg += strerror(errno);\n        err_msg += \")\";\n        return -1;\n  }\n  return ret;\n}\n\n////////////////////////////////\n// CFindFile\n\nbool CFindFile::Close()\n{\n\n  if(_dirp == 0)\n    return true;\n  int ret = closedir(_dirp);\n  if (ret == 0)\n  {\n    _dirp = 0;\n    return true;\n  }\n  return false;\n}\n           \n// bool CFindFile::FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo)\nbool CFindFile::FindFirst(LPCSTR wildcard, CFileInfo &fileInfo)\n{\n  Close();\n\n  if ((!wildcard) || (wildcard[0]==0)) {\n    SetLastError(ERROR_PATH_NOT_FOUND);\n    return false;\n  }\n \n  my_windows_split_path(nameWindowToUnix(wildcard),_directory,_pattern);\n  \n  TRACEN((printf(\"CFindFile::FindFirst : %s (dirname=%s,pattern=%s)\\n\",wildcard,(const char *)_directory,(const char *)_pattern)))\n\n  _dirp = ::opendir((const char *)_directory);\n  TRACEN((printf(\"CFindFile::FindFirst : opendir=%p\\n\",_dirp)))\n\n  if ((_dirp == 0) && (global_use_utf16_conversion)) {\n    // Try to recover the original filename\n    UString ustr = MultiByteToUnicodeString(_directory, 0);\n    AString resultString;\n    bool is_good = originalFilename(ustr, resultString);\n    if (is_good) {\n      _dirp = ::opendir((const char *)resultString);\n      _directory = resultString;\n    }\n  }\n\n  if (_dirp == 0) return false;\n\n  struct dirent *dp;\n  while ((dp = readdir(_dirp)) != NULL) {\n    if (filter_pattern(dp->d_name,(const char *)_pattern,0) == 1) {\n      int retf = fillin_CFileInfo(fileInfo,(const char *)_directory,dp->d_name);\n      if (retf)\n      {\n         TRACEN((printf(\"CFindFile::FindFirst : closedir-1(dirp=%p)\\n\",_dirp)))\n         closedir(_dirp);\n         _dirp = 0;\n         SetLastError( ERROR_NO_MORE_FILES );\n         return false;\n      }\n      TRACEN((printf(\"CFindFile::FindFirst -%s- true\\n\",dp->d_name)))\n      return true;\n    }\n  }\n\n  TRACEN((printf(\"CFindFile::FindFirst : closedir-2(dirp=%p)\\n\",_dirp)))\n  closedir(_dirp);\n  _dirp = 0;\n  SetLastError( ERROR_NO_MORE_FILES );\n  return false;\n}\n\nbool CFindFile::FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo)\n{\n  Close();\n  CFileInfo fileInfo0;\n  AString Awildcard = UnicodeStringToMultiByte(wildcard, CP_ACP);\n  bool bret = FindFirst((LPCSTR)Awildcard, fileInfo0);\n  if (bret)\n  {\n     fileInfo.Attrib = fileInfo0.Attrib;\n     fileInfo.CTime = fileInfo0.CTime;\n     fileInfo.ATime = fileInfo0.ATime;\n     fileInfo.MTime = fileInfo0.MTime;\n     fileInfo.Size = fileInfo0.Size;\n     fileInfo.Name = GetUnicodeString(fileInfo0.Name, CP_ACP);\n  }\n  return bret;\n}\n\nbool CFindFile::FindNext(CFileInfo &fileInfo)\n{\n  if (_dirp == 0)\n  {\n    SetLastError( ERROR_INVALID_HANDLE );\n    return false;\n  }\n\n  struct dirent *dp;\n  while ((dp = readdir(_dirp)) != NULL) {\n      if (filter_pattern(dp->d_name,(const char *)_pattern,0) == 1) {\n        int retf = fillin_CFileInfo(fileInfo,(const char *)_directory,dp->d_name);\n        if (retf)\n        {\n           TRACEN((printf(\"FindNextFileA -%s- ret_handle=FALSE (errno=%d)\\n\",dp->d_name,errno)))\n           return false;\n\n        }\n        TRACEN((printf(\"FindNextFileA -%s- true\\n\",dp->d_name)))\n        return true;\n      }\n    }\n  TRACEN((printf(\"FindNextFileA ret_handle=FALSE (ERROR_NO_MORE_FILES)\\n\")))\n  SetLastError( ERROR_NO_MORE_FILES );\n  return false;\n}\n\nbool CFindFile::FindNext(CFileInfoW &fileInfo)\n{\n  CFileInfo fileInfo0;\n  bool bret = FindNext(fileInfo0);\n  if (bret)\n  {\n     fileInfo.Attrib = fileInfo0.Attrib;\n     fileInfo.CTime = fileInfo0.CTime;\n     fileInfo.ATime = fileInfo0.ATime;\n     fileInfo.MTime = fileInfo0.MTime;\n     fileInfo.Size = fileInfo0.Size;\n     fileInfo.Name = GetUnicodeString(fileInfo0.Name, CP_ACP);\n  }\n  return bret;\n}\n\nbool FindFile(LPCSTR wildcard, CFileInfo &fileInfo)\n{\n  // CFindFile finder;\n  // return finder.FindFirst(wildcard, fileInfo);\n  AString dir,base;\n  my_windows_split_path(wildcard, dir , base);\n  int ret = fillin_CFileInfo(fileInfo,nameWindowToUnix(wildcard));\n  fileInfo.Name = base;\n  TRACEN((printf(\"FindFile(%s,CFileInfo) ret=%d\\n\",wildcard,ret)))\n  return (ret == 0);\n}\n\nbool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo)\n{\n  // CFindFile finder;\n  // return finder.FindFirst(wildcard, fileInfo);\n  AString name = UnicodeStringToMultiByte(wildcard, CP_ACP); \n  CFileInfo fileInfo0;\n  int ret = fillin_CFileInfo(fileInfo0,nameWindowToUnix((const char *)name));\n  TRACEN((printf(\"FindFile-1(%s,CFileInfo) ret=%d\\n\",(const char *)name,ret)))\n  if (ret != 0)\n  {\n    // Try to recover the original filename\n    AString resultString;\n    bool is_good = originalFilename(wildcard, resultString);\n    if (is_good) {\n       ret = fillin_CFileInfo(fileInfo0,nameWindowToUnix((const char *)resultString));\n       TRACEN((printf(\"FindFile-2(%s,CFileInfo) ret=%d\\n\",(const char *)resultString,ret)))\n    }\n  }\n  if (ret == 0)\n  {\n     UString dir,base;\n     my_windows_split_path(wildcard, dir , base);\n     fileInfo.Attrib = fileInfo0.Attrib;\n     fileInfo.CTime = fileInfo0.CTime;\n     fileInfo.ATime = fileInfo0.ATime;\n     fileInfo.MTime = fileInfo0.MTime;\n     fileInfo.Size = fileInfo0.Size;\n     fileInfo.Name = base;\n  }\n  return (ret == 0);\n}\n\nbool DoesFileExist(LPCSTR name)\n{\n  CFileInfo fileInfo;\n  int ret = fillin_CFileInfo(fileInfo,nameWindowToUnix(name));\n  TRACEN((printf(\"DoesFileExist(%s) ret=%d\\n\",name,ret)))\n  return (ret == 0);\n}\n\nbool DoesFileExist(LPCWSTR name)\n{\n  AString Aname = UnicodeStringToMultiByte(name, CP_ACP); \n  bool bret = DoesFileExist((LPCSTR)Aname);\n  if (bret) return bret;\n\n  // Try to recover the original filename\n  AString resultString;\n  bool is_good = originalFilename(name, resultString);\n  if (is_good) {\n     bret = DoesFileExist((const char *)resultString);\n  }\n  return bret;\n}\n\n/////////////////////////////////////\n// CEnumerator\n\nbool CEnumerator::NextAny(CFileInfo &fileInfo)\n{\n  if(_findFile.IsHandleAllocated())\n    return _findFile.FindNext(fileInfo);\n  else\n    return _findFile.FindFirst(_wildcard, fileInfo);\n}\n\nbool CEnumerator::Next(CFileInfo &fileInfo)\n{\n  while(true)\n  {\n    if(!NextAny(fileInfo))\n      return false;\n    if(!fileInfo.IsDots())\n      return true;\n  }\n}\n\nbool CEnumerator::Next(CFileInfo &fileInfo, bool &found)\n{\n  if (Next(fileInfo))\n  {\n    found = true;\n    return true;\n  }\n  found = false;\n  return (::GetLastError() == ERROR_NO_MORE_FILES);\n}\n\nbool CEnumeratorW::NextAny(CFileInfoW &fileInfo)\n{\n  if(_findFile.IsHandleAllocated())\n    return _findFile.FindNext(fileInfo);\n  else\n    return _findFile.FindFirst(_wildcard, fileInfo);\n}\n\nbool CEnumeratorW::Next(CFileInfoW &fileInfo)\n{\n  while(true)\n  {\n    if(!NextAny(fileInfo))\n      return false;\n    if(!fileInfo.IsDots())\n      return true;\n  }\n}\n\nbool CEnumeratorW::Next(CFileInfoW &fileInfo, bool &found)\n{\n  if (Next(fileInfo))\n  {\n    found = true;\n    return true;\n  }\n  found = false;\n  return (::GetLastError() == ERROR_NO_MORE_FILES);\n}\n\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileFind.h",
    "content": "// Windows/FileFind.h\n\n#ifndef __WINDOWS_FILEFIND_H\n#define __WINDOWS_FILEFIND_H\n\n#include \"../Common/MyString.h\"\n#include \"FileName.h\"\n#include \"Defs.h\"\n\n#include <sys/types.h> /* for DIR */\n#include <dirent.h>\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NFind {\n\nnamespace NAttributes\n{\n  inline bool IsReadOnly(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_READONLY) != 0; }\n  inline bool IsHidden(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_HIDDEN) != 0; }\n  inline bool IsSystem(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_SYSTEM) != 0; }\n  inline bool IsDir(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0; }\n  inline bool IsArchived(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ARCHIVE) != 0; }\n  inline bool IsCompressed(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_COMPRESSED) != 0; }\n  inline bool IsEncrypted(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ENCRYPTED) != 0; }\n}\n\nclass CFileInfoBase\n{ \n  bool MatchesMask(UINT32 mask) const  { return ((Attrib & mask) != 0); }\npublic:\n  UInt64 Size;\n  FILETIME CTime;\n  FILETIME ATime;\n  FILETIME MTime;\n  DWORD Attrib;\n  \n  bool IsDir() const { return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); }\n};\n\nclass CFileInfo: public CFileInfoBase\n{ \npublic:\n  AString Name; // FIXME CSysString Name;\n  bool IsDots() const;\n};\n\n// FIXME #ifdef _UNICODE\n// typedef CFileInfo CFileInfoW;\n// #else\nclass CFileInfoW: public CFileInfoBase\n{ \npublic:\n  UString Name;\n  bool IsDots() const;\n};\n// #endif\n\nclass CFindFile\n{\n  friend class CEnumerator;\n  DIR *_dirp;\n  AString _pattern;\n  AString _directory;  \npublic:\n  bool IsHandleAllocated() const { return (_dirp != 0); }\n  CFindFile(): _dirp(0) {}\n  ~CFindFile() {  Close(); }\n  // bool FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo);\n  bool FindFirst(LPCSTR wildcard, CFileInfo &fileInfo);\n  bool FindNext(CFileInfo &fileInfo);\n  // FIXME #ifndef _UNICODE\n  bool FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo);\n  bool FindNext(CFileInfoW &fileInfo);\n  // FIXME #endif\n  bool Close();\n};\n\nbool FindFile(LPCSTR wildcard, CFileInfo &fileInfo);\n\nbool DoesFileExist(LPCTSTR name);\n// #ifndef _UNICODE\nbool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo);\nbool DoesFileExist(LPCWSTR name);\n// #endif\n\nclass CEnumerator\n{\n  CFindFile _findFile;\n  AString _wildcard; // FIXME CSysString _wildcard;\n  bool NextAny(CFileInfo &fileInfo);\npublic:\n  CEnumerator(): _wildcard(NName::kAnyStringWildcard) {}\n  // FIXME CEnumerator(const CSysString &wildcard): _wildcard(wildcard) {}\n  CEnumerator(const AString &wildcard): _wildcard(wildcard) {}\n  bool Next(CFileInfo &fileInfo);\n  bool Next(CFileInfo &fileInfo, bool &found);\n};\n\n// FIXME #ifdef _UNICODE\n// typedef CEnumerator CEnumeratorW;\n// #else\nclass CEnumeratorW\n{\n  CFindFile _findFile;\n  UString _wildcard;\n  bool NextAny(CFileInfoW &fileInfo);\npublic:\n  CEnumeratorW(): _wildcard(NName::kAnyStringWildcard) {}\n  CEnumeratorW(const UString &wildcard): _wildcard(wildcard) {}\n  bool Next(CFileInfoW &fileInfo);\n  bool Next(CFileInfoW &fileInfo, bool &found);\n};\n// FIXME #endif\n\n}}}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileIO.cpp",
    "content": "// Windows/FileIO.cpp\n\n#include \"StdAfx.h\"\n\n#include \"FileIO.h\"\n#include \"Defs.h\"\n#include \"../Common/StringConvert.h\"\n\n#include <time.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <fcntl.h>\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n#include \"myPrivate.h\"\n\n#include <sys/types.h>\n#include <utime.h>\n\n#ifdef HAVE_LSTAT\n#define FD_LINK (-2)\n#endif\n\n#define FILE_SHARE_READ\t1\n#define GENERIC_READ\t0x80000000\n#define GENERIC_WRITE\t0x40000000\n\nextern BOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *Time, DWORD *Seconds );\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NIO {\n\nCFileBase::~CFileBase()\n{\n  Close();\n}\n\nbool CFileBase::Create(LPCSTR filename, DWORD dwDesiredAccess,\n    DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,bool ignoreSymbolicLink)\n{\n  Close();\n  \n  const char * name = nameWindowToUnix(filename);\n\n#ifdef O_BINARY\n  int   flags = O_BINARY;\n#else\n  int   flags = 0;\n#endif\n\n#ifdef O_LARGEFILE\n  flags |= O_LARGEFILE;\n#endif\n\n  /* now use the umask value */\n  int mask = umask(0);\n  (void)umask(mask);\n  int mode = 0666 & ~(mask & 066); /* keep the R/W for the user */\n\n  if (dwDesiredAccess & GENERIC_WRITE) flags |= O_WRONLY;\n  if (dwDesiredAccess & GENERIC_READ)  flags |= O_RDONLY;\n\n\n  switch (dwCreationDisposition)\n  {\n    case CREATE_NEW    : flags |= O_CREAT | O_EXCL; break;\n    case CREATE_ALWAYS : flags |= O_CREAT;          break;\n    case OPEN_EXISTING :                            break;\n    case OPEN_ALWAYS   : flags |= O_CREAT;          break;\n    // case TRUNCATE_EXISTING : flags |= O_TRUNC;      break;\n  }\n  // printf(\"##DBG open(%s,0x%x,%o)##\\n\",name,flags,(unsigned)mode);\n\n  _fd = -1;\n#ifdef HAVE_LSTAT\n   if ((global_use_lstat) && (ignoreSymbolicLink == false))\n   {\n     _size = readlink(name, _buffer, sizeof(_buffer)-1);\n     if (_size > 0) {\n       if (dwDesiredAccess & GENERIC_READ) {\n         _fd = FD_LINK;\n         _offset = 0;\n         _buffer[_size]=0;\n       } else if (dwDesiredAccess & GENERIC_WRITE) {\n         // does not overwrite the file pointed by symbolic link\n         if (!unlink(name)) return false;\n       }\n     }\n  }\n#endif\n\n  if (_fd == -1) {\n    _fd = open(name,flags, mode);\n  }\n\n  if ((_fd == -1) && (global_use_utf16_conversion)) {\n    // bug #1204993 - Try to recover the original filename\n    UString ustr = MultiByteToUnicodeString(AString(name), 0);\n    AString resultString;\n    int is_good = 1;\n    for (int i = 0; i < ustr.Length(); i++)\n    {\n      if (ustr[i] >= 256) {\n        is_good = 0;\n        break;\n      } else {\n        resultString += char(ustr[i]);\n      }\n    }\n    if (is_good) {\n      _fd = open((const char *)resultString,flags, mode);\n    }\n  }\n\n  if (_fd == -1) {\n    /* !HAVE_LSTAT : an invalid symbolic link => errno == ENOENT */\n    return false;\n  } else {\n    _unix_filename = name;\n  }\n\n  return true;\n}\n\nbool CFileBase::Create(LPCWSTR fileName, DWORD desiredAccess,\n    DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes,bool ignoreSymbolicLink)\n{\n  Close();\n    return Create(UnicodeStringToMultiByte(fileName, CP_ACP), \n      desiredAccess, shareMode, creationDisposition, flagsAndAttributes,ignoreSymbolicLink);\n}\n\nbool CFileBase::Close()\n{\n  struct utimbuf buf;\n\n  buf.actime  = _lastAccessTime;\n  buf.modtime = _lastWriteTime;\n\n  _lastAccessTime = _lastWriteTime = (time_t)-1;\n\n  if(_fd == -1)\n    return true;\n\n#ifdef HAVE_LSTAT\n  if(_fd == FD_LINK) {\n    _fd = -1;\n    return true;\n  }\n#endif\n\n  int ret = ::close(_fd);\n  if (ret == 0) {\n    _fd = -1;\n\n    /* On some OS (mingwin, MacOSX ...), you must close the file before updating times */\n    if ((buf.actime != (time_t)-1) || (buf.modtime != (time_t)-1)) {\n      struct stat    oldbuf;\n      int ret = stat((const char*)(_unix_filename),&oldbuf);\n      if (ret == 0) {\n        if (buf.actime  == (time_t)-1) buf.actime  = oldbuf.st_atime;\n        if (buf.modtime == (time_t)-1) buf.modtime = oldbuf.st_mtime;\n      } else {\n        time_t current_time = time(0);\n        if (buf.actime  == (time_t)-1) buf.actime  = current_time;\n        if (buf.modtime == (time_t)-1) buf.modtime = current_time;\n      }\n      /* ret = */ utime((const char *)(_unix_filename), &buf);\n    }\n    return true;\n  }\n  return false;\n}\n\nbool CFileBase::GetLength(UINT64 &length) const\n{\n  if (_fd == -1)\n  {\n     SetLastError( ERROR_INVALID_HANDLE );\n     return false;\n  }\n\n#ifdef HAVE_LSTAT  \n  if (_fd == FD_LINK) {\n    length = _size;\n    return true;\n  }\n#endif\n\n  off_t pos_cur = ::lseek(_fd, 0, SEEK_CUR);\n  if (pos_cur == (off_t)-1)\n    return false;\n\n  off_t pos_end = ::lseek(_fd, 0, SEEK_END);\n  if (pos_end == (off_t)-1)\n    return false;\n\n  off_t pos_cur2 = ::lseek(_fd, pos_cur, SEEK_SET);\n  if (pos_cur2 == (off_t)-1)\n    return false;\n\n  length = (UINT64)pos_end;\n\n  return true;\n}\n\nbool CFileBase::Seek(INT64 distanceToMove, DWORD moveMethod, UINT64 &newPosition)\n{\n  if (_fd == -1)\n  {\n     SetLastError( ERROR_INVALID_HANDLE );\n     return false;\n  }\n\n#ifdef HAVE_LSTAT\n  if (_fd == FD_LINK) {\n    INT64 offset;\n    switch (moveMethod) {\n    case STREAM_SEEK_SET : offset = distanceToMove; break;\n    case STREAM_SEEK_CUR : offset = _offset + distanceToMove; break;\n    case STREAM_SEEK_END : offset = _size + distanceToMove; break;\n    default :  offset = -1;\n    }\n    if (offset < 0) {\n      SetLastError( EINVAL );\n      return false;\n    }\n    if (offset > _size) offset = _size;\n    newPosition = _offset = offset;\n    return true;\n  }\n#endif\n\n  bool ret = true;\n\n  off_t pos = (off_t)distanceToMove;\n\n  off_t newpos = ::lseek(_fd,pos,moveMethod);\n\n  if (newpos == ((off_t)-1)) {\n    ret = false;\n  } else {\n    newPosition = (UINT64)newpos;\n  }\n\n  return ret;\n}\n\nbool CFileBase::Seek(UINT64 position, UINT64 &newPosition)\n{\n  return Seek(position, FILE_BEGIN, newPosition);\n}\n\n/////////////////////////\n// CInFile\n\nbool CInFile::Open(LPCTSTR fileName, DWORD shareMode, \n    DWORD creationDisposition,  DWORD flagsAndAttributes)\n{\n  return Create(fileName, GENERIC_READ, shareMode, \n      creationDisposition, flagsAndAttributes);\n}\n\nbool CInFile::Open(LPCTSTR fileName,bool ignoreSymbolicLink)\n{\n  return Create(fileName, GENERIC_READ , FILE_SHARE_READ, OPEN_EXISTING, \n     FILE_ATTRIBUTE_NORMAL,ignoreSymbolicLink);\n}\n\n#ifndef _UNICODE\nbool CInFile::Open(LPCWSTR fileName, DWORD shareMode, \n    DWORD creationDisposition,  DWORD flagsAndAttributes)\n{\n  return Create(fileName, GENERIC_READ, shareMode, \n      creationDisposition, flagsAndAttributes);\n}\n\nbool CInFile::Open(LPCWSTR fileName,bool ignoreSymbolicLink)\n{\n  return Create(fileName, GENERIC_READ , FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,ignoreSymbolicLink);\n}\n#endif\n\n// ReadFile and WriteFile functions in Windows have BUG:\n// If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) \n// from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES \n// (Insufficient system resources exist to complete the requested service).\n\n// static UINT32 kChunkSizeMax = (1 << 24);\n\nbool CInFile::ReadPart(void *data, UINT32 size, UINT32 &processedSize)\n{\n  // if (size > kChunkSizeMax)\n  //  size = kChunkSizeMax;\n  return Read(data,size,processedSize);\n}\n\nbool CInFile::Read(void *buffer, UINT32 bytesToRead, UINT32 &bytesRead)\n{\n  if (_fd == -1)\n  {\n     SetLastError( ERROR_INVALID_HANDLE );\n     return false;\n  }\n\n  if (bytesToRead == 0) {\n    bytesRead =0;\n    return TRUE;\n  }\n\n#ifdef HAVE_LSTAT\n  if (_fd == FD_LINK) {\n    if (_offset >= _size) {\n      bytesRead = 0;\n      return TRUE;\n    }\n    int len = (_size - _offset);\n    if (len > bytesToRead) len = bytesToRead;\n    memcpy(buffer,_buffer+_offset,len);\n    bytesRead = len;\n    _offset += len;\n    return TRUE;\n  }\n#endif\n\n  ssize_t  ret;\n  do {\n    ret = read(_fd,buffer,bytesToRead);\n  } while (ret < 0 && (errno == EINTR));\n\n  if (ret != -1) {\n    bytesRead = ret;\n    return TRUE;\n  }\n  bytesRead =0;\n  return FALSE;\n}\n\n/////////////////////////\n// COutFile\n\nbool COutFile::Open(LPCTSTR fileName, DWORD shareMode, \n    DWORD creationDisposition, DWORD flagsAndAttributes)\n{\n  return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, \n      creationDisposition, flagsAndAttributes);\n}\n\nstatic inline DWORD GetCreationDisposition(bool createAlways)\n  {  return createAlways? CREATE_ALWAYS: CREATE_NEW; }\n\nbool COutFile::Open(LPCTSTR fileName, DWORD creationDisposition)\n{\n  return Open(fileName, FILE_SHARE_READ, \n      creationDisposition, FILE_ATTRIBUTE_NORMAL);\n}\n\nbool COutFile::Create(LPCTSTR fileName, bool createAlways)\n{\n  return Open(fileName, GetCreationDisposition(createAlways));\n}\n\n#ifndef _UNICODE\n\nbool COutFile::Open(LPCWSTR fileName, DWORD shareMode, \n    DWORD creationDisposition, DWORD flagsAndAttributes)\n{\n  return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, \n      creationDisposition, flagsAndAttributes);\n}\n\nbool COutFile::Open(LPCWSTR fileName, DWORD creationDisposition)\n{\n  return Open(fileName, FILE_SHARE_READ, \n      creationDisposition, FILE_ATTRIBUTE_NORMAL);\n}\n\nbool COutFile::Create(LPCWSTR fileName, bool createAlways)\n{\n  return Open(fileName, GetCreationDisposition(createAlways));\n}\n\n#endif\n\nbool COutFile::SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)\n{\n  LARGE_INTEGER  ltime;\n  DWORD dw;\n\n  if (_fd == -1) {\n     SetLastError( ERROR_INVALID_HANDLE );\n     return false;\n  }\n\n  /* On some OS (cygwin, MacOSX ...), you must close the file before updating times */\n  if (aTime) {\n     ltime.QuadPart = aTime->dwHighDateTime;\n     ltime.QuadPart = (ltime.QuadPart << 32) | aTime->dwLowDateTime;\n     RtlTimeToSecondsSince1970( &ltime, &dw );\n     _lastAccessTime = dw;\n  }\n  if (mTime) {\n     ltime.QuadPart = mTime->dwHighDateTime;\n     ltime.QuadPart = (ltime.QuadPart << 32) | mTime->dwLowDateTime;\n     RtlTimeToSecondsSince1970( &ltime, &dw );\n     _lastWriteTime = dw;\n  }\n\n  return true;\n}\n\nbool COutFile::SetMTime(const FILETIME *mTime)\n{\n  return SetTime(NULL, NULL, mTime);\n}\n\nbool COutFile::WritePart(const void *data, UINT32 size, UINT32 &processedSize)\n{\n//  if (size > kChunkSizeMax)\n//    size = kChunkSizeMax;\n\n  return Write(data,size,processedSize);\n}\n\nbool COutFile::Write(const void *buffer, UINT32 bytesToWrite, UINT32 &bytesWritten)\n{\n  if (_fd == -1)\n  {\n     SetLastError( ERROR_INVALID_HANDLE );\n     return false;\n  }\n\n  ssize_t  ret;\n  do {\n    ret = write(_fd,buffer, bytesToWrite);\n  } while (ret < 0 && (errno == EINTR));\n\n  if (ret != -1) {\n    bytesWritten = ret;\n    return TRUE;\n  }\n  bytesWritten =0;\n  return FALSE;\n}\n\nbool COutFile::SetEndOfFile()\n{\n  if (_fd == -1)\n  {\n     SetLastError( ERROR_INVALID_HANDLE );\n     return false;\n  }\n\n  bool bret = false;\n\n  off_t pos_cur = lseek(_fd, 0, SEEK_CUR);\n  if (pos_cur != (off_t)-1) {\n    int iret = ftruncate(_fd, pos_cur);\n    if (iret == 0) bret = true;\n  }\n\n  return bret;\n}\n\nbool COutFile::SetLength(UINT64 length)\n{\n  UINT64 newPosition;\n  if(!Seek(length, newPosition))\n    return false;\n  if(newPosition != length)\n    return false;\n  return SetEndOfFile();\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileIO.h",
    "content": "// Windows/FileIO.h\n\n#ifndef __WINDOWS_FILEIO_H\n#define __WINDOWS_FILEIO_H\n\n#include <Common/MyString.h>\n\n#ifndef _WIN32\n\n#define FILE_BEGIN\tSEEK_SET\n#define FILE_CURRENT\tSEEK_CUR\n#define FILE_END\tSEEK_END\n#define INVALID_SET_FILE_POINTER\t((DWORD)-1)\n\n#define CREATE_NEW\t  1\n#define CREATE_ALWAYS\t  2\n#define OPEN_EXISTING\t  3\n#define OPEN_ALWAYS\t  4\n/* #define TRUNCATE_EXISTING 5 */\n\n#endif\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NIO {\n\n\nclass CFileBase\n{\nprotected:\n  int     _fd;\n  AString _unix_filename;\n  time_t   _lastAccessTime;\n  time_t   _lastWriteTime;\n#ifdef HAVE_LSTAT\n  int     _size;\n  char    _buffer[MAX_PATHNAME_LEN+1];\n  int     _offset;\n#endif\n\n  bool Create(LPCSTR fileName, DWORD desiredAccess,\n      DWORD shareMode, DWORD creationDisposition,  DWORD flagsAndAttributes,bool ignoreSymbolicLink=false);\n  bool Create(LPCWSTR fileName, DWORD desiredAccess,\n      DWORD shareMode, DWORD creationDisposition,  DWORD flagsAndAttributes,bool ignoreSymbolicLink=false);\n\npublic:\n  CFileBase(): _fd(-1) {};\n  virtual ~CFileBase();\n\n  virtual bool Close();\n\n  bool GetLength(UINT64 &length) const;\n\n  bool Seek(INT64 distanceToMove, DWORD moveMethod, UINT64 &newPosition);\n  bool Seek(UINT64 position, UINT64 &newPosition);\n};\n\nclass CInFile: public CFileBase\n{\npublic:\n  bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition,  DWORD flagsAndAttributes);\n  bool OpenShared(LPCTSTR fileName, bool /* shareForWrite */ ,bool ignoreSymbolicLink=false) {\n    return Open(fileName,ignoreSymbolicLink);\n  }\n  bool Open(LPCTSTR fileName,bool ignoreSymbolicLink=false);\n  #ifndef _UNICODE\n  bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition,  DWORD flagsAndAttributes);\n  bool OpenShared(LPCWSTR fileName, bool /* shareForWrite */ ,bool ignoreSymbolicLink=false) {\n    return Open(fileName,ignoreSymbolicLink);\n  }\n  bool Open(LPCWSTR fileName,bool ignoreSymbolicLink=false);\n  #endif\n  bool ReadPart(void *data, UINT32 size, UINT32 &processedSize);\n  bool Read(void *data, UINT32 size, UINT32 &processedSize);\n};\n\nclass COutFile: public CFileBase\n{\npublic:\n  bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);\n  bool Open(LPCTSTR fileName, DWORD creationDisposition);\n  bool Create(LPCTSTR fileName, bool createAlways);\n\n  #ifndef _UNICODE\n  bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);\n  bool Open(LPCWSTR fileName, DWORD creationDisposition);\n  bool Create(LPCWSTR fileName, bool createAlways);\n  #endif\n\n  /*\n  void SetOpenCreationDisposition(DWORD creationDisposition)\n    { m_CreationDisposition = creationDisposition; }\n  void SetOpenCreationDispositionCreateAlways()\n    { m_CreationDisposition = CREATE_ALWAYS; }\n  */\n\n  bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime);\n  bool SetMTime(const FILETIME *mTime);\n  bool WritePart(const void *data, UINT32 size, UINT32 &processedSize);\n  bool Write(const void *data, UINT32 size, UINT32 &processedSize);\n  bool SetEndOfFile();\n  bool SetLength(UINT64 length);\n};\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileName.cpp",
    "content": "// Windows/FileName.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Windows/FileName.h\"\n#include \"Common/Wildcard.h\"\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NName {\n\nvoid NormalizeDirPathPrefix(CSysString &dirPath)\n{\n  if (dirPath.IsEmpty())\n    return;\n  if (dirPath.ReverseFind(kDirDelimiter) != dirPath.Length() - 1)\n    dirPath += kDirDelimiter;\n}\n\n#ifndef _UNICODE\nvoid NormalizeDirPathPrefix(UString &dirPath)\n{\n  if (dirPath.IsEmpty())\n    return;\n  if (dirPath.ReverseFind(wchar_t(kDirDelimiter)) != dirPath.Length() - 1)\n    dirPath += wchar_t(kDirDelimiter);\n}\n#endif\n\nconst wchar_t kExtensionDelimiter = L'.';\n\nvoid SplitNameToPureNameAndExtension(const UString &fullName,\n    UString &pureName, UString &extensionDelimiter, UString &extension)\n{\n  int index = fullName.ReverseFind(kExtensionDelimiter);\n  if (index < 0)\n  {\n    pureName = fullName;\n    extensionDelimiter.Empty();\n    extension.Empty();\n  }\n  else\n  {\n    pureName = fullName.Left(index);\n    extensionDelimiter = kExtensionDelimiter;\n    extension = fullName.Mid(index + 1);\n  }\n}\n\n}}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/FileName.h",
    "content": "// Windows/FileName.h\n\n#ifndef __WINDOWS_FILENAME_H\n#define __WINDOWS_FILENAME_H\n\n#include \"../Common/MyString.h\"\n\nnamespace NWindows {\nnamespace NFile {\nnamespace NName {\n\nconst TCHAR kDirDelimiter = CHAR_PATH_SEPARATOR;\nconst TCHAR kAnyStringWildcard = '*';\n\nvoid NormalizeDirPathPrefix(CSysString &dirPath); // ensures that it ended with '\\\\'\n#ifndef _UNICODE\nvoid NormalizeDirPathPrefix(UString &dirPath); // ensures that it ended with '\\\\'\n#endif\n\nvoid SplitNameToPureNameAndExtension(const UString &fullName,\n    UString &pureName, UString &extensionDelimiter, UString &extension);\n\n}}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/PropVariant.cpp",
    "content": "// Windows/PropVariant.cpp\n\n#include \"StdAfx.h\"\n\n#include \"PropVariant.h\"\n\n#include \"../Common/Defs.h\"\n\nnamespace NWindows {\nnamespace NCOM {\n\nCPropVariant::CPropVariant(const PROPVARIANT& varSrc)\n{\n  vt = VT_EMPTY;\n  InternalCopy(&varSrc);\n}\n\nCPropVariant::CPropVariant(const CPropVariant& varSrc)\n{\n  vt = VT_EMPTY;\n  InternalCopy(&varSrc);\n}\n\nCPropVariant::CPropVariant(BSTR bstrSrc)\n{\n  vt = VT_EMPTY;\n  *this = bstrSrc;\n}\n\nCPropVariant::CPropVariant(LPCOLESTR lpszSrc)\n{\n  vt = VT_EMPTY;\n  *this = lpszSrc;\n}\n\nCPropVariant& CPropVariant::operator=(const CPropVariant& varSrc)\n{\n  InternalCopy(&varSrc);\n  return *this;\n}\nCPropVariant& CPropVariant::operator=(const PROPVARIANT& varSrc)\n{\n  InternalCopy(&varSrc);\n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(BSTR bstrSrc)\n{\n  *this = (LPCOLESTR)bstrSrc;\n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc)\n{\n  InternalClear();\n  vt = VT_BSTR;\n  wReserved1 = 0;\n  bstrVal = ::SysAllocString(lpszSrc);\n  if (bstrVal == NULL && lpszSrc != NULL)\n  {\n    vt = VT_ERROR;\n    scode = E_OUTOFMEMORY;\n  }\n  return *this;\n}\n\n\nCPropVariant& CPropVariant::operator=(bool bSrc)\n{\n  if (vt != VT_BOOL)\n  {\n    InternalClear();\n    vt = VT_BOOL;\n  }\n  boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;\n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(UInt32 value)\n{\n  if (vt != VT_UI4)\n  {\n    InternalClear();\n    vt = VT_UI4;\n  }\n  ulVal = value;\n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(UInt64 value)\n{\n  if (vt != VT_UI8)\n  {\n    InternalClear();\n    vt = VT_UI8;\n  }\n  uhVal.QuadPart = value;\n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(const FILETIME &value)\n{\n  if (vt != VT_FILETIME)\n  {\n    InternalClear();\n    vt = VT_FILETIME;\n  }\n  filetime = value;\n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(Int32 value)\n{\n  if (vt != VT_I4)\n  {\n    InternalClear();\n    vt = VT_I4;\n  }\n  lVal = value;\n  \n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(Byte value)\n{\n  if (vt != VT_UI1)\n  {\n    InternalClear();\n    vt = VT_UI1;\n  }\n  bVal = value;\n  return *this;\n}\n\nCPropVariant& CPropVariant::operator=(Int16 value)\n{\n  if (vt != VT_I2)\n  {\n    InternalClear();\n    vt = VT_I2;\n  }\n  iVal = value;\n  return *this;\n}\n\n/*\nCPropVariant& CPropVariant::operator=(LONG value)\n{\n  if (vt != VT_I4)\n  {\n    InternalClear();\n    vt = VT_I4;\n  }\n  lVal = value;\n  return *this;\n}\n*/\n\nstatic HRESULT MyPropVariantClear(PROPVARIANT *propVariant)\n{\n  switch(propVariant->vt)\n  {\n    case VT_UI1:\n    case VT_I1:\n    case VT_I2:\n    case VT_UI2:\n    case VT_BOOL:\n    case VT_I4:\n    case VT_UI4:\n    case VT_R4:\n    case VT_INT:\n    case VT_UINT:\n    case VT_ERROR:\n    case VT_FILETIME:\n    case VT_UI8:\n    case VT_R8:\n    case VT_CY:\n    case VT_DATE:\n      propVariant->vt = VT_EMPTY;\n      propVariant->wReserved1 = 0;\n      return S_OK;\n  }\n  return ::VariantClear((VARIANTARG *)propVariant);\n}\n\nHRESULT CPropVariant::Clear()\n{\n  return MyPropVariantClear(this);\n}\n\nHRESULT CPropVariant::Copy(const PROPVARIANT* pSrc)\n{\n  ::VariantClear((tagVARIANT *)this);\n  switch(pSrc->vt)\n  {\n    case VT_UI1:\n    case VT_I1:\n    case VT_I2:\n    case VT_UI2:\n    case VT_BOOL:\n    case VT_I4:\n    case VT_UI4:\n    case VT_R4:\n    case VT_INT:\n    case VT_UINT:\n    case VT_ERROR:\n    case VT_FILETIME:\n    case VT_UI8:\n    case VT_R8:\n    case VT_CY:\n    case VT_DATE:\n      memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT));\n      return S_OK;\n  }\n  return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)(pSrc));\n}\n\n\nHRESULT CPropVariant::Attach(PROPVARIANT* pSrc)\n{\n  HRESULT hr = Clear();\n  if (FAILED(hr))\n    return hr;\n  memcpy(this, pSrc, sizeof(PROPVARIANT));\n  pSrc->vt = VT_EMPTY;\n  return S_OK;\n}\n\nHRESULT CPropVariant::Detach(PROPVARIANT* pDest)\n{\n  HRESULT hr = MyPropVariantClear(pDest);\n  if (FAILED(hr))\n    return hr;\n  memcpy(pDest, this, sizeof(PROPVARIANT));\n  vt = VT_EMPTY;\n  return S_OK;\n}\n\nHRESULT CPropVariant::InternalClear()\n{\n  HRESULT hr = Clear();\n  if (FAILED(hr))\n  {\n    vt = VT_ERROR;\n    scode = hr;\n  }\n  return hr;\n}\n\nvoid CPropVariant::InternalCopy(const PROPVARIANT* pSrc)\n{\n  HRESULT hr = Copy(pSrc);\n  if (FAILED(hr))\n  {\n    vt = VT_ERROR;\n    scode = hr;\n  }\n}\n\nint CPropVariant::Compare(const CPropVariant &a)\n{\n  if (vt != a.vt)\n    return 0; // it's mean some bug\n  switch (vt)\n  {\n    case VT_EMPTY:\n      return 0;\n    \n    /*\n    case VT_I1:\n      return MyCompare(cVal, a.cVal);\n    */\n    case VT_UI1:\n      return MyCompare(bVal, a.bVal);\n\n    case VT_I2:\n      return MyCompare(iVal, a.iVal);\n    case VT_UI2:\n      return MyCompare(uiVal, a.uiVal);\n    \n    case VT_I4:\n      return MyCompare(lVal, a.lVal);\n    /*\n    case VT_INT:\n      return MyCompare(intVal, a.intVal);\n    */\n    case VT_UI4:\n      return MyCompare(ulVal, a.ulVal);\n    /*\n    case VT_UINT:\n      return MyCompare(uintVal, a.uintVal);\n    */\n    case VT_I8:\n      return MyCompare(hVal.QuadPart, a.hVal.QuadPart);\n    case VT_UI8:\n      return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart);\n\n    case VT_BOOL:\n      return -MyCompare(boolVal, a.boolVal);\n\n    case VT_FILETIME:\n      return ::CompareFileTime(&filetime, &a.filetime);\n    case VT_BSTR:\n      return 0; // Not implemented\n      // return MyCompare(aPropVarint.cVal);\n\n    default:\n      return 0;\n  }\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/PropVariant.h",
    "content": "// Windows/PropVariant.h\n\n#ifndef __WINDOWS_PROPVARIANT_H\n#define __WINDOWS_PROPVARIANT_H\n\n#include \"../Common/MyWindows.h\"\n#include \"../Common/Types.h\"\n\nnamespace NWindows {\nnamespace NCOM {\n\nclass CPropVariant : public tagPROPVARIANT\n{\npublic:\n  CPropVariant() { vt = VT_EMPTY; wReserved1 = 0; }\n  ~CPropVariant() { Clear(); }\n  CPropVariant(const PROPVARIANT& varSrc);\n  CPropVariant(const CPropVariant& varSrc);\n  CPropVariant(BSTR bstrSrc);\n  CPropVariant(LPCOLESTR lpszSrc);\n  CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); };\n  CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; }\n  CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal = *(ULARGE_INTEGER*)&value; }\n  CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; }\n  CPropVariant(Int32 value) { vt = VT_I4; wReserved1 = 0; lVal = value; }\n  CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; }\n  CPropVariant(Int16 value) { vt = VT_I2; wReserved1 = 0; iVal = value; }\n  // CPropVariant(LONG value, VARTYPE vtSrc = VT_I4) { vt = vtSrc; lVal = value; }\n\n  CPropVariant& operator=(const CPropVariant& varSrc);\n  CPropVariant& operator=(const PROPVARIANT& varSrc);\n  CPropVariant& operator=(BSTR bstrSrc);\n  CPropVariant& operator=(LPCOLESTR lpszSrc);\n  CPropVariant& operator=(bool bSrc);\n  CPropVariant& operator=(UInt32 value);\n  CPropVariant& operator=(UInt64 value);\n  CPropVariant& operator=(const FILETIME &value);\n\n  CPropVariant& operator=(Int32 value);\n  CPropVariant& operator=(Byte value);\n  CPropVariant& operator=(Int16 value);\n  // CPropVariant& operator=(LONG  value);\n\n  HRESULT Clear();\n  HRESULT Copy(const PROPVARIANT* pSrc);\n  HRESULT Attach(PROPVARIANT* pSrc);\n  HRESULT Detach(PROPVARIANT* pDest);\n\n  HRESULT InternalClear();\n  void InternalCopy(const PROPVARIANT* pSrc);\n\n  int Compare(const CPropVariant &a1);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/PropVariantConversions.cpp",
    "content": "// PropVariantConversions.cpp\n\n#include \"StdAfx.h\"\n\n#include \"PropVariantConversions.h\"\n\n#include \"Windows/Defs.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n\nstatic UString ConvertUInt64ToString(UInt64 value)\n{\n  wchar_t buffer[32];\n  ConvertUInt64ToString(value, buffer);\n  return buffer;\n}\n\nstatic UString ConvertInt64ToString(Int64 value)\n{\n  wchar_t buffer[32];\n  ConvertInt64ToString(value, buffer);\n  return buffer;\n}\n\nstatic char *UIntToStringSpec(char c, UInt32 value, char *s, int numPos)\n{\n  if (c != 0)\n    *s++ = c;\n  char temp[16];\n  int pos = 0;\n  do\n  {\n    temp[pos++] = (char)('0' + value % 10);\n    value /= 10;\n  }\n  while (value != 0);\n  int i;\n  for (i = 0; i < numPos - pos; i++)\n    *s++ = '0';\n  do\n    *s++ = temp[--pos];\n  while (pos > 0);\n  *s = '\\0';\n  return s;\n}\n\nbool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds)\n{\n#ifdef _WIN32\n  s[0] = '\\0';\n  SYSTEMTIME st;\n  if (!BOOLToBool(FileTimeToSystemTime(&ft, &st)))\n    return false;\n  s = UIntToStringSpec(0, st.wYear, s, 4);\n  s = UIntToStringSpec('-', st.wMonth, s, 2);\n  s = UIntToStringSpec('-', st.wDay, s, 2);\n  if (includeTime)\n  {\n    s = UIntToStringSpec(' ', st.wHour, s, 2);\n    s = UIntToStringSpec(':', st.wMinute, s, 2);\n    if (includeSeconds)\n      UIntToStringSpec(':', st.wSecond, s, 2);\n  }\n  /*\n  sprintf(s, \"%04d-%02d-%02d\", st.wYear, st.wMonth, st.wDay);\n  if (includeTime)\n  {\n    sprintf(s + strlen(s), \" %02d:%02d\", st.wHour, st.wMinute);\n    if (includeSeconds)\n      sprintf(s + strlen(s), \":%02d\", st.wSecond);\n  }\n  */\n#else\n  BOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *Time, DWORD *Seconds );\n\n  FILETIME filetime;\n  LocalFileTimeToFileTime(&ft, &filetime);\n\n  LARGE_INTEGER  ltime;\n\n  ltime.QuadPart = filetime.dwHighDateTime;\n  ltime.QuadPart = (ltime.QuadPart << 32) | filetime.dwLowDateTime;\n\n  DWORD dw;\n  RtlTimeToSecondsSince1970(&ltime, &dw );\n  time_t timep = (time_t)dw;\n\n  struct tm * date = localtime(&timep);\n\n  sprintf(s, \"%04d-%02d-%02d\", date->tm_year+1900, date->tm_mon+1,date->tm_mday);\n  if (includeTime)\n  {\n    sprintf(s + strlen(s), \" %02d:%02d\", date->tm_hour,date->tm_min);\n    if (includeSeconds)\n      sprintf(s + strlen(s), \":%02d\", date->tm_sec);\n  }\n#endif\n  return true;\n}\n\nUString ConvertFileTimeToString(const FILETIME &fileTime, bool includeTime, bool includeSeconds)\n{\n  char s[32];\n  ConvertFileTimeToString(fileTime, s,  includeTime, includeSeconds);\n  return GetUnicodeString(s);\n}\n \n\nUString ConvertPropVariantToString(const PROPVARIANT &prop)\n{\n  switch (prop.vt)\n  {\n    case VT_EMPTY: return UString();\n    case VT_BSTR: return prop.bstrVal;\n    case VT_UI1: return ConvertUInt64ToString(prop.bVal);\n    case VT_UI2: return ConvertUInt64ToString(prop.uiVal);\n    case VT_UI4: return ConvertUInt64ToString(prop.ulVal);\n    case VT_UI8: return ConvertUInt64ToString(prop.uhVal.QuadPart);\n    case VT_FILETIME: return ConvertFileTimeToString(prop.filetime, true, true);\n    // case VT_I1: return ConvertInt64ToString(prop.cVal);\n    case VT_I2: return ConvertInt64ToString(prop.iVal);\n    case VT_I4: return ConvertInt64ToString(prop.lVal);\n    case VT_I8: return ConvertInt64ToString(prop.hVal.QuadPart);\n    case VT_BOOL: return VARIANT_BOOLToBool(prop.boolVal) ? L\"+\" : L\"-\";\n    default:\n      \n      return UString();\n  }\n}\n\nUInt64 ConvertPropVariantToUInt64(const PROPVARIANT &prop)\n{\n  switch (prop.vt)\n  {\n    case VT_UI1: return prop.bVal;\n    case VT_UI2: return prop.uiVal;\n    case VT_UI4: return prop.ulVal;\n    case VT_UI8: return (UInt64)prop.uhVal.QuadPart;\n    default:\n      return 0;\n  }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/PropVariantConversions.h",
    "content": "// Windows/PropVariantConversions.h\n\n#ifndef __PROPVARIANTCONVERSIONS_H\n#define __PROPVARIANTCONVERSIONS_H\n\n#include \"Common/Types.h\"\n#include \"Common/MyString.h\"\n\nbool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime = true, bool includeSeconds = true);\nUString ConvertFileTimeToString(const FILETIME &ft, bool includeTime = true, bool includeSeconds = true);\nUString ConvertPropVariantToString(const PROPVARIANT &propVariant);\nUInt64 ConvertPropVariantToUInt64(const PROPVARIANT &propVariant);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/PropVariantUtils.cpp",
    "content": "// PropVariantUtils.cpp\n\n#include \"StdAfx.h\"\n\n#include \"PropVariantUtils.h\"\n#include \"Common/StringConvert.h\"\n#include \"Common/IntToString.h\"\n\nusing namespace NWindows;\n\nstatic AString GetHex(UInt32 v)\n{\n  char sz[32] = { '0', 'x' };\n  ConvertUInt64ToString(v, sz + 2, 16);\n  return sz;\n}\n\nvoid StringToProp(const AString &s, NCOM::CPropVariant &prop)\n{\n  prop = MultiByteToUnicodeString(s);\n}\n\nvoid PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NCOM::CPropVariant &prop)\n{\n  AString s;\n  for (unsigned i = 0; i < num; i++)\n  {\n    const CUInt32PCharPair &p = pairs[i];\n    if (p.Value == value)\n      s = p.Name;\n  }\n  if (s.IsEmpty())\n    s = GetHex(value);\n  StringToProp(s, prop);\n}\n\nAString TypeToString(const char *table[], unsigned num, UInt32 value)\n{\n  if (value < num)\n    return table[value];\n  return GetHex(value);\n}\n\nvoid TypeToProp(const char *table[], unsigned num, UInt32 value, NCOM::CPropVariant &prop)\n{\n  StringToProp(TypeToString(table, num, value), prop);\n}\n\n\nAString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags)\n{\n  AString s;\n  for (unsigned i = 0; i < num; i++)\n  {\n    const CUInt32PCharPair &p = pairs[i];\n    if ((flags & p.Value) != 0)\n    {\n      if (!s.IsEmpty())\n        s += ' ';\n      s += p.Name;\n    }\n    flags &= ~p.Value;\n  }\n  if (flags != 0)\n  {\n    if (!s.IsEmpty())\n      s += ' ';\n    s += GetHex(flags);\n  }\n  return s;\n}\n\nvoid FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)\n{\n  StringToProp(FlagsToString(pairs, num, flags), prop);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/PropVariantUtils.h",
    "content": "// Windows/PropVariantUtils.h\n\n#ifndef __PROP_VARIANT_UTILS_H\n#define __PROP_VARIANT_UTILS_H\n\n#include \"Common/MyString.h\"\n#include \"PropVariant.h\"\n\nstruct CUInt32PCharPair\n{\n  UInt32 Value;\n  const char *Name;\n};\n\nvoid StringToProp(const AString &s, NWindows::NCOM::CPropVariant &prop);\nvoid PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop);\n\nAString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags);\nvoid FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NWindows::NCOM::CPropVariant &prop);\n\nAString TypeToString(const char *table[], unsigned num, UInt32 value);\nvoid TypeToProp(const char *table[], unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop);\n\n#define PAIR_TO_PROP(pairs, value, prop) PairToProp(pairs, sizeof(pairs) / sizeof(pairs[0]), value, prop)\n#define FLAGS_TO_PROP(pairs, value, prop) FlagsToProp(pairs, sizeof(pairs) / sizeof(pairs[0]), value, prop)\n#define TYPE_TO_PROP(table, value, prop) TypeToProp(table, sizeof(table) / sizeof(table[0]), value, prop)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Registry.cpp",
    "content": "// Windows/Registry.cpp\n\n#include \"StdAfx.h\"\n\n#ifndef _UNICODE\n#include \"Common/StringConvert.h\"\n#endif\n#include \"Windows/Registry.h\"\n\n#include <wx/config.h>\n\nclass HKEY_Impl\n{\n  public:\n\twxString path;\n\tHKEY_Impl(wxString a) : path(a) {}\n};\n\nnamespace NWindows {\nnamespace NRegistry {\n\n#define ERROR_SET_VALUE (E_INVALIDARG) // FIXME\n#define ERROR_GET_VALUE (E_INVALIDARG) // FIXME\n#define PROGRAM_NAME L\"p7zip\"\n\nstatic wxConfig * g_config = 0;\nstatic int        g_config_ref = 0;\n\nstatic void configAddRef() {\n\tif (g_config == 0) {\n\t\tg_config = new wxConfig(PROGRAM_NAME);\n\t\tg_config->Flush(true);\n\t\twxConfigBase::Set(g_config);\n\t}\n\tg_config_ref++;\n}\n\nstatic void configSubRef() {\n\tif (g_config_ref >= 1)\n\t{\n\t\tg_config_ref--;\n\t\tif (g_config_ref == 0) {\n\t\t\tdelete g_config;\n\t\t\tg_config = 0;\n\t\t\twxConfigBase::Set(NULL);\n\t\t} else {\n\t\t\tg_config->Flush(true);\n\t\t}\n\t}\n}\n\n\tLONG CKey::Close()\n\t{\n\t\tif (_object) \n\t\t{\n\t\t\tconfigSubRef();\n\t\t\tdelete _object;\n\t\t}\n\t\t_object = 0;\n\t\treturn ERROR_SUCCESS;\n\t}\n\n\tCKey::~CKey()\n\t{\n\t\tClose();\n\t}\n\n\tLONG CKey::Create(HKEY parentKey, LPCTSTR keyName)\n\t{\n\t\tClose();\n\n\t\tconfigAddRef();\n\n\t\twxString path;\n\n\t\tif (parentKey == HKEY_CURRENT_USER) {\n\t\t\tpath=L\"/\" + wxString(keyName);\n\t\t} else {\n\t\t\tpath = parentKey->path + L\"/\" + wxString(keyName);\n\t\t}\n\t\t_object = new HKEY_Impl(path);\n\t\treturn ERROR_SUCCESS;\n\t}\n\tLONG CKey::Open(HKEY parentKey, LPCTSTR keyName, REGSAM accessMask)\n\t{\n\t\tClose();\n\n\t\tconfigAddRef();\n\n\t\twxString path;\n\n\t\tif (parentKey == HKEY_CURRENT_USER) {\n\t\t\tpath=L\"/\" + wxString(keyName);\n\t\t} else {\n\t\t\tpath = parentKey->path + L\"/\" + wxString(keyName);\n\t\t}\n\t\t_object = new HKEY_Impl(path);\n\t\treturn ERROR_SUCCESS;\n\t}\n\n\tLONG CKey::RecurseDeleteKey(LPCTSTR subKeyName)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tbool ret = g_config->DeleteGroup(subKeyName);\n\t\tif (ret) return ERROR_SUCCESS;\n\t\treturn ERROR_GET_VALUE;\n\t}\n\n\tLONG CKey::DeleteValue(LPCTSTR name)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tbool ret = g_config->DeleteEntry(name);\n\t\tif (ret) return ERROR_SUCCESS;\n\t\treturn ERROR_GET_VALUE;\n\t}\n\n\tLONG CKey::QueryValue(LPCTSTR name, UInt32 &value)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tlong val;\n\t\tbool ret = g_config->Read(name,&val);\n\t\tif (ret) {\n\t\t\tvalue = (UInt32)val;\n\t\t\treturn ERROR_SUCCESS;\n\t\t}\n\t\treturn ERROR_GET_VALUE;\n\t}\n\n\tLONG CKey::QueryValue(LPCTSTR name, bool &value)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tbool ret = g_config->Read(name,&value);\n\t\tif (ret) return ERROR_SUCCESS;\n\t\treturn ERROR_GET_VALUE;\n\t}\n\n\tLONG CKey::QueryValue(LPCTSTR name, CSysString &value)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\twxString val;\n\t\tbool ret = g_config->Read(name,&val);\n\t\tif (ret) {\n\t\t\tvalue = val;\n\t\t\treturn ERROR_SUCCESS;\n\t\t}\n\t\treturn ERROR_GET_VALUE;\n\t}\n\n\tLONG CKey::SetValue(LPCTSTR valueName, UInt32 value)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tbool ret = g_config->Write(valueName,(long)value);\n\t\tif (ret == true) return ERROR_SUCCESS;\n\t\treturn ERROR_SET_VALUE;\n\t}\n\tLONG CKey::SetValue(LPCTSTR valueName, bool value)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tbool ret = g_config->Write(valueName,value);\n\t\tif (ret == true) return ERROR_SUCCESS;\n\t\treturn ERROR_SET_VALUE;\n\t}\n\tLONG CKey::SetValue(LPCTSTR valueName, LPCTSTR value)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tbool ret = g_config->Write(valueName,value);\n\t\tif (ret == true) return ERROR_SUCCESS;\n\t\treturn ERROR_SET_VALUE;\n\t}\n\n\tLONG CKey::SetValue(LPCTSTR name, const void *value, UInt32 size)\n\t{\n\t\tstatic char hexa[] = \"0123456789ABCDEF\";\n\t\t/* FIXME\n\t\tMYASSERT(value != NULL);\n\t\tMYASSERT(_object != NULL);\n\t\treturn RegSetValueEx(_object, name, NULL, REG_BINARY, (const BYTE *)value, size);\n\t\t*/\n\t\tBYTE *buf = (BYTE *)value;\n\t\twxString str;\n\t\tfor(UInt32 i=0;i<size;i++)\n\t\t{\n\t\t\tstr += \thexa[ (buf[i]>>4) & 0x0f];\n\t\t\tstr += \thexa[ buf[i] & 0x0f];\n\t\t}\n\t\treturn SetValue(name,str);\n\t}\n\n\tLONG CKey::EnumKeys(CSysStringVector &keyNames)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\tkeyNames.Clear();\n\t\t// enumeration variables\n\t\twxString str;\n\t\tlong dummy;\n\t\tbool bCont = g_config->GetFirstEntry(str, dummy);\n\t\twhile ( bCont ) {\n\t\t\tkeyNames.Add((const TCHAR *)str);\n\t\t\tbCont = g_config->GetNextEntry(str, dummy);\n\t\t}\n\n\t\t// now all groups...\n\t\tbCont = g_config->GetFirstGroup(str, dummy);\n\t\twhile ( bCont ) {\n\t\t\tkeyNames.Add((const TCHAR *)str);\n\t\t\tbCont = g_config->GetNextGroup(str, dummy);\n  \t\t}\n\t\treturn ERROR_SUCCESS;\n\t}\n\n\tLONG CKey::QueryValue(LPCTSTR name, void *value, UInt32 &dataSize)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\twxString str;\n\t\tbool ret = g_config->Read(name,&str);\n\t\tif (ret == false) return ERROR_GET_VALUE;\n\n\t\tsize_t l =  str.Len() / 2;\n\t\tif (l > dataSize) l = dataSize;\n\t\telse              dataSize=l;\n\n\t\tBYTE *buf = (BYTE *)value;\n\t\tfor(UInt32 i=0;i<dataSize;i++)\n\t\t{\n\t\t\tchar cval[3];\n\t\t\tcval[0] = (char)str[2*i];\n\t\t\tcval[1] = (char)str[2*i+1];\n\t\t\tcval[2] = 0;\n\t\t\tunsigned uval = 0;\n\t\t\tsscanf(cval,\"%x\",&uval);\n\t\t\tbuf[i]=(BYTE)uval;\n\t\t}\n\n\t\treturn ERROR_SUCCESS;\n\t}\n\n\n\tLONG CKey::QueryValue(LPCTSTR name, CByteBuffer &value, UInt32 &dataSize)\n\t{\n\t\tg_config->SetPath(_object->path);\n\t\twxString str;\n\t\tbool ret = g_config->Read(name,&str);\n\t\tif (ret == false) return ERROR_GET_VALUE;\n\n\t\tdataSize =  str.Len() / 2;\n\t\tvalue.SetCapacity(dataSize);\n\t\treturn QueryValue(name, (BYTE *)value, dataSize);\n\t}\n\n}\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Registry.h",
    "content": "// Windows/Registry.h\n\n#ifndef __WINDOWS_REGISTRY_H\n#define __WINDOWS_REGISTRY_H\n\n#include \"Common/Buffer.h\"\n#include \"Common/MyString.h\"\n#include \"Common/Types.h\"\n\n#ifndef _WIN32\nclass HKEY_Impl;\n\ntypedef HKEY_Impl * HKEY;\n\n/*\n#define HKEY_CLASSES_ROOT       ((HKEY) 0x80000000)\n#define HKEY_LOCAL_MACHINE      ((HKEY) 0x80000002)\n#define HKEY_USERS              ((HKEY) 0x80000003)\n#define HKEY_PERFORMANCE_DATA   ((HKEY) 0x80000004)\n#define HKEY_CURRENT_CONFIG     ((HKEY) 0x80000005)\n#define HKEY_DYN_DATA           ((HKEY) 0x80000006)\n*/\n#define HKEY_CURRENT_USER       ((HKEY) 0x80000001)\n\n\ntypedef DWORD REGSAM;\n#define ERROR_SUCCESS (0)\n#define KEY_READ\t(0x1234) // FIXME\n#define KEY_ALL_ACCESS  (~0)     // FIXME\n\n/* ------------------------------ end registry ------------------------------ */\n\n#endif\n\nnamespace NWindows {\nnamespace NRegistry {\n\nconst TCHAR kKeyNameDelimiter = TEXT(CHAR_PATH_SEPARATOR);\n\n// LONG SetValue(HKEY parentKey, LPCTSTR keyName, LPCTSTR valueName, LPCTSTR value);\n\nclass CKey\n{\n  HKEY _object;\npublic:\n  CKey(): _object(NULL) {}\n  ~CKey();\n\n  operator HKEY() const { return _object; }\n\n #if 0\n  HKEY Detach();\n  void Attach(HKEY key);\n  LONG Create(HKEY parentKey, LPCTSTR keyName,\n      LPTSTR keyClass = REG_NONE, DWORD options = REG_OPTION_NON_VOLATILE,\n      REGSAM accessMask = KEY_ALL_ACCESS,\n      LPSECURITY_ATTRIBUTES securityAttributes = NULL,\n      LPDWORD disposition = NULL);\n  LONG Open(HKEY parentKey, LPCTSTR keyName,\n      REGSAM accessMask = KEY_ALL_ACCESS);\n#endif // #if 0\n  LONG Create(HKEY parentKey, LPCTSTR keyName);\n  LONG Open(HKEY parentKey, LPCTSTR keyName,\n      REGSAM accessMask = KEY_ALL_ACCESS);\n\n  LONG Close();\n\n  LONG DeleteSubKey(LPCTSTR subKeyName);\n  LONG RecurseDeleteKey(LPCTSTR subKeyName);\n\n  LONG DeleteValue(LPCTSTR name);\n  #ifndef _UNICODE\n  LONG DeleteValue(LPCWSTR name);\n  #endif\n\n  LONG SetValue(LPCTSTR valueName, UInt32 value);\n  LONG SetValue(LPCTSTR valueName, bool value);\n  LONG SetValue(LPCTSTR valueName, LPCTSTR value);\n  // LONG SetValue(LPCTSTR valueName, const CSysString &value);\n  #ifndef _UNICODE\n  LONG SetValue(LPCWSTR name, LPCWSTR value);\n  // LONG SetValue(LPCWSTR name, const UString &value);\n  #endif\n\n  LONG SetValue(LPCTSTR name, const void *value, UInt32 size);\n\n  LONG SetKeyValue(LPCTSTR keyName, LPCTSTR valueName, LPCTSTR value);\n\n  LONG QueryValue(LPCTSTR name, UInt32 &value);\n  LONG QueryValue(LPCTSTR name, bool &value);\n  LONG QueryValue(LPCTSTR name, LPTSTR value, UInt32 &dataSize);\n  LONG QueryValue(LPCTSTR name, CSysString &value);\n\n  #ifndef _UNICODE\n  LONG QueryValue(LPCWSTR name, LPWSTR value, UInt32 &dataSize);\n  LONG QueryValue(LPCWSTR name, UString &value);\n  #endif\n\n  LONG QueryValue(LPCTSTR name, void *value, UInt32 &dataSize);\n  LONG QueryValue(LPCTSTR name, CByteBuffer &value, UInt32 &dataSize);\n\n  LONG EnumKeys(CSysStringVector &keyNames);\n};\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/ResourceString.h",
    "content": "// Windows/ResourceString.h\n\n#ifndef __WINDOWS_RESOURCESTRING_H\n#define __WINDOWS_RESOURCESTRING_H\n\n#include \"Common/MyString.h\"\n\nnamespace NWindows {\n\nCSysString MyLoadString(HINSTANCE hInstance, UINT resourceID);\nCSysString MyLoadString(UINT resourceID);\n#ifdef _UNICODE\ninline UString MyLoadStringW(HINSTANCE hInstance, UINT resourceID) { return MyLoadString(hInstance, resourceID); }\ninline UString MyLoadStringW(UINT resourceID) { return MyLoadString(resourceID); }\n#else\nUString MyLoadStringW(HINSTANCE hInstance, UINT resourceID);\nUString MyLoadStringW(UINT resourceID);\n#endif\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Shell.h",
    "content": "// Windows/Shell.h\n\n#ifndef __WINDOWS_SHELL_H\n#define __WINDOWS_SHELL_H\n\n#include <windows.h>\n// #include <shlobj.h>\n\n#include \"Common/MyString.h\"\n#include \"Windows/Defs.h\"\n\n\nnamespace NWindows{\nnamespace NShell{\n\nbool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath);\n\n}}\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Synchronization.cpp",
    "content": "// Windows/Synchronization.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Synchronization.h\"\n\n// #define TRACEN(u) u;\n#define TRACEN(u)  /* */\n\n#define MAGIC 0x1234CAFE\nclass CSynchroTest\n{\n  int _magic;\n  public:\n  CSynchroTest() {\n    _magic = MAGIC;\n  }\n  void testConstructor() {\n    if (_magic != MAGIC) {\n      printf(\"ERROR : no constructors called during loading of plugins (please look at LINK_SHARED in makefile.machine)\\n\");\n      exit(EXIT_FAILURE);\n    }\n  }\n};\n\nstatic CSynchroTest gbl_synchroTest;\n\nextern \"C\" void sync_TestConstructor(void) {\n\tgbl_synchroTest.testConstructor();\n}\n\n\nnamespace NWindows {\nnamespace NSynchronization {\n\n\n#ifndef ENV_BEOS\n#ifdef DEBUG_SYNCHRO\n  void CSynchro::dump_error(int ligne,int ret,const char *text,void *param)\n  {\n    printf(\"\\n##T%d#ERROR2 (l=%d) %s : param=%p ret = %d (%s)##\\n\",(int)pthread_self(),ligne,text,param,ret,strerror(ret));\n    // abort();\n  }\n  CSynchro::CSynchro() {\n    TRACEN((printf(\"\\nT%d : E1-CSynchro(this=%p,m=%p,cond=%p)\\n\",(int)pthread_self(),(void *)this,(void *)&_object,(void *)&_cond)))\n    _isValid = false;\n  }\n\n  void CSynchro::Create() {\n    TRACEN((printf(\"\\nT%d : E1-CSynchro::Create(this=%p,m=%p,cond=%p)\\n\",(int)pthread_self(),(void *)this,(void *)&_object,(void *)&_cond)))\n    pthread_mutexattr_t mutexattr;\n    memset(&mutexattr,0,sizeof(mutexattr));\n    int ret = pthread_mutexattr_init(&mutexattr);\n    if (ret != 0) {\n\tdump_error(__LINE__,ret,\"pthread_mutexattr_init\",&mutexattr);\n    }\n    ret = pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK);\n    if (ret != 0) dump_error(__LINE__,ret,\"pthread_mutexattr_settype\",&mutexattr);\n    ret = ::pthread_mutex_init(&_object,&mutexattr);\n    if (ret != 0) dump_error(__LINE__,ret,\"pthread_mutex_init\",&_object);\n    ret = ::pthread_cond_init(&_cond,0);\n    if (ret != 0) dump_error(__LINE__,ret,\"pthread_cond_init\",&_cond);\n    TRACEN((printf(\"\\nT%d : E2-CSynchro::Create(m=%p,cond=%p)\\n\",(int)pthread_self(),(void *)&_object,(void *)&_cond)))\n  }\n  CSynchro::~CSynchro() {\n    TRACEN((printf(\"\\nT%d : E1-~CSynchro(this=%p,m=%p,cond=%p)\\n\",(int)pthread_self(),(void *)this,(void *)&_object,(void *)&_cond)))\n    if (_isValid) {\n      int ret = ::pthread_mutex_destroy(&_object);\n      if (ret != 0) dump_error(__LINE__,ret,\"pthread_mutex_destroy\",&_object);\n      ret = ::pthread_cond_destroy(&_cond);\n      if (ret != 0) dump_error(__LINE__,ret,\"pthread_cond_destroy\",&_cond);\n      TRACEN((printf(\"\\nT%d : E2-~CSynchro(m=%p,cond=%p)\\n\",(int)pthread_self(),(void *)&_object,(void *)&_cond)))\n    }\n    _isValid = false;\n  }\n  void CSynchro::Enter() { \n    TRACEN((printf(\"\\nT%d : E1-CSynchro::Enter(%p)\\n\",(int)pthread_self(),(void *)&_object)))\n    int ret = ::pthread_mutex_lock(&_object);\n    if (ret != 0) {\n      dump_error(__LINE__,ret,\"CSynchro::Enter-pthread_mutex_lock\",&_object);\n    }\n    TRACEN((printf(\"\\nT%d : E2-CSynchro::Enter(%p)\\n\",(int)pthread_self(),(void *)&_object)))\n  }\n  void CSynchro::Leave() {\n    TRACEN((printf(\"\\nT%d : E1-CSynchro::Leave(%p)\\n\",(int)pthread_self(),(void *)&_object)))\n    int ret = ::pthread_mutex_unlock(&_object);\n    if (ret != 0) dump_error(__LINE__,ret,\"Leave::pthread_mutex_unlock\",&_object);\n    TRACEN((printf(\"\\nT%d : E2-CSynchro::Leave(%p)\\n\",(int)pthread_self(),(void *)&_object)))\n  }\n  void CSynchro::WaitCond() {\n    TRACEN((printf(\"\\nT%d : E1-CSynchro::WaitCond(%p,%p)\\n\",(int)pthread_self(),(void *)&_cond,(void *)&_object)))\n    int ret = ::pthread_cond_wait(&_cond, &_object);\n    if (ret != 0) dump_error(__LINE__,ret,\"pthread_cond_wait\",&_cond);\n    TRACEN((printf(\"\\nT%d : E2-CSynchro::WaitCond(%p,%p)\\n\",(int)pthread_self(),(void *)&_cond,(void *)&_object)))\n  }\n  void CSynchro::LeaveAndSignal() {\n    TRACEN((printf(\"\\nT%d : E1-CSynchro::LeaveAndSignal(%p)\\n\",(int)pthread_self(),(void *)&_cond)))\n    int ret = ::pthread_cond_broadcast(&_cond);\n    if (ret != 0) dump_error(__LINE__,ret,\"pthread_cond_broadcast\",&_cond);\n    TRACEN((printf(\"\\nT%d : E2-CSynchro::LeaveAndSignal(%p)\\n\",(int)pthread_self(),(void *)&_object)))\n    ret = ::pthread_mutex_unlock(&_object);\n    if (ret != 0) dump_error(__LINE__,ret,\"LeaveAndSignal::pthread_mutex_unlock\",&_object);\n    TRACEN((printf(\"\\nT%d : E3-CSynchro::LeaveAndSignal(%p)\\n\",(int)pthread_self(),(void *)&_cond)))\n  }\n#endif\n#endif\n\n}}\n\nDWORD WINAPI WaitForMultipleObjects( DWORD count, const HANDLE *handles, BOOL wait_all, DWORD timeout )\n{\n    TRACEN((printf(\"\\nT%d : E1-WaitForMultipleObjects(%d)\\n\",(int)pthread_self(),(int)count)))\n  if (wait_all != FALSE) {\n      printf(\"\\n\\n INTERNAL ERROR - WaitForMultipleObjects(...) wait_all(%d) != FALSE\\n\\n\",(unsigned)wait_all);\n      abort();\n  }\n\n  if (timeout != INFINITE) {\n      printf(\"\\n\\n INTERNAL ERROR - WaitForMultipleObjects(...) timeout(%u) != INFINITE\\n\\n\",(unsigned)timeout);\n      abort();\n  }\n\n  if (count < 1) {\n      printf(\"\\n\\n INTERNAL ERROR - WaitForMultipleObjects(...) count(%u) < 1\\n\\n\",(unsigned)count);\n      abort();\n  }\n\n  NWindows::NSynchronization::CSynchro *synchro = handles[0]->_sync;\n\n  TRACEN((printf(\"\\nT%d : E2-WaitForMultipleObjects(%d)\\n\",(int)pthread_self(),(int)count)))\n  synchro->Enter();\n  TRACEN((printf(\"\\nT%d : E3-WaitForMultipleObjects(%d)\\n\",(int)pthread_self(),(int)count)))\n\n#ifdef DEBUG_SYNCHRO\n  for(DWORD i=1;i<count;i++) {\n    if (synchro != handles[i]->_sync) {\n      printf(\"\\n\\n INTERNAL ERROR - WaitForMultipleObjects(...) synchro(%p) != handles[%d]->_sync(%p)\\n\\n\",\n              synchro,(unsigned)i,handles[i]->_sync);\n      abort();\n    }\n  }\n#endif\n\n  while(1) {\n    for(DWORD i=0;i<count;i++) {\n      if (handles[i]->IsSignaledAndUpdate()) {\n        synchro->Leave();\n  TRACEN((printf(\"\\nT%d : E4-WaitForMultipleObjects(%d)\\n\",(int)pthread_self(),(int)count)))\n        return WAIT_OBJECT_0+i;\n      }\n    }\n    synchro->WaitCond();\n  }\n  synchro->Leave();\n  return ETIMEDOUT; // WAIT_TIMEOUT;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Synchronization.h",
    "content": "// Windows/Synchronization.h\n\n#ifndef __WINDOWS_SYNCHRONIZATION_H\n#define __WINDOWS_SYNCHRONIZATION_H\n\n#include \"Defs.h\"\n\nextern \"C\" \n{ \n#include \"../../C/Threads.h\"\n}\n\n#ifdef _WIN32\n#include \"Handle.h\"\n#endif\n\nnamespace NWindows {\nnamespace NSynchronization {\n\nclass Uncopyable {\nprotected: \n  Uncopyable() {} // allow construction\n  ~Uncopyable() {} // and destruction of derived objects...\nprivate:\n  Uncopyable(const Uncopyable&);             // ...but prevent copying\n  Uncopyable& operator=(const Uncopyable&);\n};\n\n\nclass CBaseEvent // FIXME : private Uncopyable\n{\nprotected:\n  ::CEvent _object;\npublic:\n  bool IsCreated() { return Event_IsCreated(&_object) != 0; }\n#ifdef _WIN32\n  operator HANDLE() { return _object.handle; }\n#endif\n  CBaseEvent() { Event_Construct(&_object); }\n  ~CBaseEvent() { Close(); }\n  WRes Close() { return Event_Close(&_object); }\n  #ifdef _WIN32\n  WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL,\n      LPSECURITY_ATTRIBUTES securityAttributes = NULL)\n  {\n    _object.handle = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset),\n        BoolToBOOL(initiallyOwn), name);\n    if (_object.handle != 0)\n      return 0;\n    return ::GetLastError();\n  }\n  WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)\n  {\n    _object.handle = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name);\n    if (_object.handle != 0)\n      return 0;\n    return ::GetLastError();\n  }\n  #endif\n\n  WRes Set() { return Event_Set(&_object); }\n  // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); }\n  WRes Reset() { return Event_Reset(&_object); }\n  WRes Lock() { return Event_Wait(&_object); }\n};\n\nclass CManualResetEvent: public CBaseEvent\n{\npublic:\n  WRes Create(bool initiallyOwn = false)\n  {\n    return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0);\n  }\n  WRes CreateIfNotCreated()\n  {\n    if (IsCreated())\n      return 0;\n    return ManualResetEvent_CreateNotSignaled(&_object);\n  }\n  #ifdef _WIN32\n  WRes CreateWithName(bool initiallyOwn, LPCTSTR name)\n  {\n    return CBaseEvent::Create(true, initiallyOwn, name);\n  }\n  #endif\n};\n\nclass CAutoResetEvent: public CBaseEvent\n{\npublic:\n  WRes Create()\n  {\n    return AutoResetEvent_CreateNotSignaled(&_object);\n  }\n  WRes CreateIfNotCreated()\n  {\n    if (IsCreated())\n      return 0;\n    return AutoResetEvent_CreateNotSignaled(&_object);\n  }\n};\n\n#ifdef _WIN32\nclass CObject: public CHandle\n{\npublic:\n  WRes Lock(DWORD timeoutInterval = INFINITE)\n    { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); }\n};\nclass CMutex: public CObject\n{\npublic:\n  WRes Create(bool initiallyOwn, LPCTSTR name = NULL,\n      LPSECURITY_ATTRIBUTES securityAttributes = NULL)\n  {\n    _handle = ::CreateMutex(securityAttributes, BoolToBOOL(initiallyOwn), name);\n    if (_handle != 0)\n      return 0;\n    return ::GetLastError();\n  }\n  WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)\n  {\n    _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name);\n    if (_handle != 0)\n      return 0;\n    return ::GetLastError();\n  }\n  WRes Release() \n  { \n    return ::ReleaseMutex(_handle) ? 0 : ::GetLastError();\n  }\n};\nclass CMutexLock\n{\n  CMutex *_object;\npublic:\n  CMutexLock(CMutex &object): _object(&object) { _object->Lock(); } \n  ~CMutexLock() { _object->Release(); }\n};\n#endif\n\nclass CSemaphore : private Uncopyable\n{\n  ::CSemaphore _object;\npublic:\n  CSemaphore() { Semaphore_Construct(&_object); }\n  ~CSemaphore() { Close(); }\n  WRes Close() {  return Semaphore_Close(&_object); }\n#ifdef _WIN32\n  operator HANDLE() { return _object.handle; }\n#endif\n  WRes Create(UInt32 initiallyCount, UInt32 maxCount)\n  {\n    return Semaphore_Create(&_object, initiallyCount, maxCount);\n  }\n  WRes Release() { return Semaphore_Release1(&_object); }\n  WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); }\n  WRes Lock() { return Semaphore_Wait(&_object); }\n};\n\nclass CCriticalSection : private Uncopyable\n{\n  ::CCriticalSection _object;\npublic:\n  CCriticalSection() { CriticalSection_Init(&_object); }\n  ~CCriticalSection() { CriticalSection_Delete(&_object); }\n  void Enter() { CriticalSection_Enter(&_object); }\n  void Leave() { CriticalSection_Leave(&_object); }\n};\n\nclass CCriticalSectionLock : private Uncopyable\n{\n  CCriticalSection *_object;\n  void Unlock()  { _object->Leave(); }\npublic:\n  CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); } \n  ~CCriticalSectionLock() { Unlock(); }\n};\n\n}}\n\n#ifndef _WIN32\n#include \"Synchronization2.h\"\n#endif\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Synchronization2.h",
    "content": "// Windows/Synchronization.h\n\n#ifdef ENV_BEOS\n#include <Locker.h>\n#include <kernel/OS.h>\n#include <list>\n#endif\n\n/* Remark : WFMO = WaitForMultipleObjects */\n\nnamespace NWindows { namespace NSynchronization { struct CBaseHandleWFMO; } }\n\ntypedef NWindows::NSynchronization::CBaseHandleWFMO *HANDLE;\n\nDWORD WINAPI WaitForMultipleObjects( DWORD count, const HANDLE *handles, BOOL wait_all, DWORD timeout );\n\nnamespace NWindows {\nnamespace NSynchronization {\n\n#ifdef ENV_BEOS\nclass CSynchro : BLocker, private Uncopyable\n{\n#define MAX_THREAD 256\n  thread_id _waiting[MAX_THREAD]; // std::list<thread_id> _waiting;\n  int index_waiting;\npublic:\n  CSynchro() { index_waiting = 0; }\n  void Create() { index_waiting = 0; }\n  ~CSynchro() {}\n  void Enter() { Lock(); }\n  void Leave() { Unlock(); }\n  void WaitCond() { \n    _waiting[index_waiting++] = find_thread(NULL); // _waiting.push_back(find_thread(NULL));\n    thread_id sender;\n    Unlock();\n    int msg = receive_data(&sender, NULL, 0);\n    Lock();\n  }\n  void LeaveAndSignal() {\n    // Unlock();\n    // Lock();\n    // for (std::list<thread_id>::iterator index = _waiting.begin(); index != _waiting.end(); index++)\n    for(int index = 0 ; index < index_waiting ; index++)\n    {\n       send_data(_waiting[index], '7zCN', NULL, 0);\n    }\n    index_waiting = 0; // _waiting.clear();\n    Unlock();\n  }\n};\n#else // #ifdef ENV_BEOS\n#ifdef DEBUG_SYNCHRO\nclass CSynchro: private Uncopyable\n{\n  pthread_mutex_t _object;\n  pthread_cond_t _cond;\n  bool _isValid;\n  void dump_error(int ligne,int ret,const char *text,void *param);\npublic:\n  CSynchro();\n  ~CSynchro();\n  void Create();\n  void Enter();\n  void Leave();\n  void WaitCond();\n  void LeaveAndSignal();\n};\n#else // #ifdef DEBUG_SYNCHRO\nclass CSynchro : private Uncopyable\n{\n  pthread_mutex_t _object;\n  pthread_cond_t _cond;\n  bool _isValid;\npublic:\n  CSynchro() { _isValid = false; }\n  ~CSynchro() {\n    if (_isValid) {\n      ::pthread_mutex_destroy(&_object);\n      ::pthread_cond_destroy(&_cond);\n    }\n    _isValid = false;\n  }\n  void Create() {\n    ::pthread_mutex_init(&_object,0);\n    ::pthread_cond_init(&_cond,0);\n  }\n  void Enter() { \n     ::pthread_mutex_lock(&_object);\n  }\n  void Leave() {\n    ::pthread_mutex_unlock(&_object);\n  }\n  void WaitCond() { \n    ::pthread_cond_wait(&_cond, &_object);\n  }\n  void LeaveAndSignal() { \n    ::pthread_cond_broadcast(&_cond);\n    ::pthread_mutex_unlock(&_object);\n  }\n};\n#endif // #ifdef DEBUG_SYNCHRO\n#endif // #ifdef ENV_BEOS\n\nstruct CBaseHandleWFMO // FIXME : private Uncopyable\n{\n  CSynchro *_sync;\n\n  CBaseHandleWFMO() { }\n\n  operator HANDLE() { return this; }\n  virtual bool IsSignaledAndUpdate() = 0;\n};\n\nclass CBaseEventWFMO : public CBaseHandleWFMO\n{\n  bool _manual_reset;\n  bool _state;\n\npublic:\n\n  bool IsCreated()  { return (this->_sync != 0); }\n  CBaseEventWFMO()  { this->_sync = 0; } \n  ~CBaseEventWFMO() { Close(); }\n\n  WRes Close() { this->_sync = 0; return S_OK; }\n\n  WRes Create(CSynchro *sync,bool manualReset, bool initiallyOwn)\n  {\n    this->_sync         = sync;\n    this->_manual_reset = manualReset;\n    this->_state        = initiallyOwn;\n    return S_OK;\n  }\n\n  WRes Set() {\n    this->_sync->Enter();\n    this->_state = true;\n    this->_sync->LeaveAndSignal();\n    return S_OK;\n  }\n\n  WRes Reset() {\n    this->_sync->Enter();\n    this->_state = false;\n    this->_sync->Leave();\n    return S_OK;\n  }\n  virtual bool IsSignaledAndUpdate() {\n    if (this->_state == true) {\n      if (this->_manual_reset == false) this->_state = false;\n      return true;\n    }\n    return false;\n  }\n};\n\nclass CManualResetEventWFMO: public CBaseEventWFMO\n{\npublic:\n  WRes Create(CSynchro *sync,bool initiallyOwn = false) { return CBaseEventWFMO::Create(sync,true, initiallyOwn); }\n};\n\nclass CAutoResetEventWFMO: public CBaseEventWFMO\n{\npublic:\n  WRes Create(CSynchro *sync) { return CBaseEventWFMO::Create(sync,false, false); }\n  WRes CreateIfNotCreated(CSynchro *sync)\n  {\n    if (IsCreated())\n      return 0;\n    return CBaseEventWFMO::Create(sync,false, false);\n  }\n};\n\nclass CSemaphoreWFMO : public CBaseHandleWFMO\n{\n  LONG _count;\n  LONG _maxCount;\n\npublic:\n  CSemaphoreWFMO() : _count(0), _maxCount(0) { this->_sync=0;} \n  WRes Create(CSynchro *sync,LONG initiallyCount, LONG maxCount)\n  {\n    if ((initiallyCount < 0) || (initiallyCount > maxCount) || (maxCount < 1)) return S_FALSE;\n    this->_sync     = sync;\n    this->_count    = initiallyCount;\n    this->_maxCount = maxCount;\n    return S_OK;\n  }\n  WRes Release(LONG releaseCount = 1) {\n    if (releaseCount < 1) return S_FALSE;\n\n    this->_sync->Enter();\n    LONG newCount = this->_count + releaseCount;\n    if (newCount > this->_maxCount)\n    {\n      this->_sync->Leave();\n      return S_FALSE;\n    }\n    this->_count = newCount;\n\n    this->_sync->LeaveAndSignal();\n\n    return S_OK;\n  }\n  WRes Close() { this->_sync=0; return S_OK; }\n\n  virtual bool IsSignaledAndUpdate() {\n    if (this->_count > 0) {\n      this->_count--;\n      return true;\n    }\n    return false;\n  }\n};\n\n}}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/System.cpp",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n\n#if defined (__NetBSD__) || defined(__OpenBSD__) || defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)\n#include <sys/param.h>\n#include <sys/sysctl.h>\n#elif defined(__linux__) || defined(__CYGWIN__) || defined(sun) || defined(__NETWARE__)\n#include <unistd.h>\n#elif defined(hpux) || defined(__hpux)\n#include <sys/param.h>\n#include <sys/pstat.h>\n#endif\n\n#if defined(__NETWARE__)\n#include <sys/sysinfo.h>\n#endif\n\n#if defined(ENV_BEOS)\n#include <be/kernel/OS.h>\n#endif\n\n\n#include \"Common/Types.h\"\n\nnamespace NWindows\n{\n\tnamespace NSystem\n\t{\n\t\t/************************ GetNumberOfProcessors ************************/\n\n\t\t#if defined (__NetBSD__) || defined(__OpenBSD__)\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t\tint mib[2], value;\n\t\t  \tint nbcpu = 1;\n\n\t\t  \tmib[0] = CTL_HW;\n\t\t  \tmib[1] = HW_NCPU;\n\t\t  \tsize_t len = sizeof(size_t);\n\t\t  \tif (sysctl(mib, 2, &value, &len, NULL, 0) >= 0)\n\t\t  \t\tif (value > nbcpu)\n\t\t\t\t\tnbcpu = value;\n\t\t\treturn nbcpu;\n\t\t}\n\t\t#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t  \tint nbcpu = 1;\n\t\t\tsize_t value;\n\t\t\tsize_t len = sizeof(value);\n\t\t\tif (sysctlbyname(\"hw.ncpu\", &value, &len, NULL, 0) == 0)\n\t\t\t\tnbcpu = value;\n\t\t\treturn nbcpu;\n\t\t}\n\t\t#elif defined (__APPLE__)\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t  \tint nbcpu = 1,value;\n\t\t\tsize_t valSize = sizeof(value);\n\t\t\tif (sysctlbyname (\"hw.ncpu\", &value, &valSize, NULL, 0) == 0)\n\t\t\t\tnbcpu = value;\n\t\t\treturn nbcpu;\n\t\t}\n\n\t\t#elif defined(__linux__) || defined(__CYGWIN__) || defined(sun)\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t  \tint nbcpu = sysconf (_SC_NPROCESSORS_CONF);\n\t\t\tif (nbcpu < 1) nbcpu = 1;\n\t\t\treturn nbcpu;\n\t\t}\n\t\t#elif defined(hpux) || defined(__hpux)\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t\tstruct pst_dynamic psd;\n\t\t\tif (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) != -1)\n\t\t\t\treturn (UInt32)psd.psd_proc_cnt;\n\t\t\treturn 1;\n\t\t}\n\t\t#elif defined(__NETWARE__)\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t\t// int nbcpu = get_nprocs_conf();\n\t\t\tint nbcpu = get_nprocs();\n\t\t\tif (nbcpu < 1) nbcpu = 1;\n\t\t\treturn nbcpu;\n\t\t}\n\t\t#elif defined(ENV_BEOS)\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t\tsystem_info info;\n\t\t\tget_system_info(&info);\n\t\t\tint nbcpu = info.cpu_count;\n\t\t\tif (nbcpu < 1) nbcpu = 1;\n\t\t\treturn nbcpu;\n\t\t}\n\t\t#else\n\t\t#warning Generic GetNumberOfProcessors\n\t\tUInt32 GetNumberOfProcessors() {\n\t\t\treturn 1;\n\t\t}\n\t\t#endif\n\n\t\t/************************ GetRamSize ************************/\n\tUInt64 GetRamSize() {\n\t\t\tUInt64 ullTotalPhys = 128 * 1024 * 1024; // default : 128MB\n\n#ifdef linux\n\t \t\tFILE * f = fopen( \"/proc/meminfo\", \"r\" );\n\t \t\tif (f)\n\t \t\t{\n\t\t\t\tchar buffer[256];\n\t\t\t\tunsigned long total;\n\n\t\t\t\tullTotalPhys = 0;\n\n\t\t  \t\twhile (fgets( buffer, sizeof(buffer), f ))\n\t\t  \t\t{\n\t\t \t\t/* old style /proc/meminfo ... */\n\t\t\t\t\tif (sscanf( buffer, \"Mem: %lu\", &total))\n\t\t\t\t\t{\n\t\t\t\t\t \tullTotalPhys += total;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* new style /proc/meminfo ... */\n\t\t\t\t\tif (sscanf(buffer, \"MemTotal: %lu\", &total))\n\t\t\t\t\t \tullTotalPhys = ((UInt64)total)*1024;\n\t\t  \t\t}\n\t\t  \t\tfclose( f );\n\t\t\t}\n#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__APPLE__)\n\t\t\tunsigned int val;\n\t\t\tint mib[2];\n\n\t\t\tmib[0] = CTL_HW;\n\t\t\tmib[1] = HW_PHYSMEM;\n\t\t\tsize_t size_sys = sizeof(val);\n\t\t\tsysctl(mib, 2, &val, &size_sys, NULL, 0);\n\t\t\tif (val) ullTotalPhys = val;\n#elif defined(__CYGWIN__)\n\t\t\tunsigned long pagesize=4096; // FIXME - sysconf(_SC_PAGESIZE) returns 65536 !?\n\t\t\t\t\t// see http://readlist.com/lists/cygwin.com/cygwin/0/3313.html\n\t\t\tunsigned long maxpages=sysconf(_SC_PHYS_PAGES);\n\t\t\tullTotalPhys = ((UInt64)pagesize)*maxpages;\n#elif defined ( sun ) || defined(__NETWARE__)\n\t\t\tunsigned long pagesize=sysconf(_SC_PAGESIZE);\n\t\t\tunsigned long maxpages=sysconf(_SC_PHYS_PAGES);\n\t\t\tullTotalPhys = ((UInt64)pagesize)*maxpages;\n#elif defined(hpux) || defined(__hpux)\n\t\t\tstruct pst_static pst;\n\t\t\tunion pstun pu;\n\t\t\t\t\t\t\n\t\t\tpu.pst_static = &pst;\n\t\t\tif ( pstat( PSTAT_STATIC, pu, (size_t)sizeof(pst), (size_t)0, 0 ) != -1 ) {\n\t\t\t\tullTotalPhys = ((UInt64)pst.physical_memory)*pst.page_size;\n\t\t\t}\n#elif defined(ENV_BEOS)\n\t\t\tsystem_info info;\n\t\t\tget_system_info(&info);\n\t\t\tullTotalPhys = info.max_pages;\n\t\t\tullTotalPhys *= 4096;\n#else\n#warning Generic GetRamSize\n#endif\n\t\t\treturn ullTotalPhys;\n\t\t}\n\n\t}\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/System.h",
    "content": "// Windows/System.h\n\n#ifndef __WINDOWS_SYSTEM_H\n#define __WINDOWS_SYSTEM_H\n\n#include \"../Common/Types.h\"\n\nnamespace NWindows {\nnamespace NSystem {\n\nUInt32 GetNumberOfProcessors();\nUInt64 GetRamSize();\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Thread.h",
    "content": "// Windows/Thread.h\n\n#ifndef __WINDOWS_THREAD_H\n#define __WINDOWS_THREAD_H\n\n#include \"Defs.h\"\n\nextern \"C\"\n{\n#include \"../../C/Threads.h\"\n}\n\nnamespace NWindows {\n\nclass CThread\n{\n  ::CThread thread;\npublic:\n  CThread() { Thread_Construct(&thread); }\n  ~CThread() { Close(); }\n  bool IsCreated() { return Thread_WasCreated(&thread) != 0; }\n  WRes Close()  { return Thread_Close(&thread); }\n  WRes Create(THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter)\n    { return Thread_Create(&thread, startAddress, parameter); }\n  WRes Wait() { return Thread_Wait(&thread); }\n  \n  #ifdef _WIN32\n  DWORD Resume() { return ::ResumeThread(thread.handle); }\n  DWORD Suspend() { return ::SuspendThread(thread.handle); }\n  bool Terminate(DWORD exitCode) { return BOOLToBool(::TerminateThread(thread.handle, exitCode)); }\n  int GetPriority() { return ::GetThreadPriority(thread.handle); }\n  bool SetPriority(int priority) { return BOOLToBool(::SetThreadPriority(thread.handle, priority)); }\n  #endif\n};\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Time.cpp",
    "content": "// Windows/Time.cpp\n\n#include \"StdAfx.h\"\n\n#include \"Time.h\"\n#include \"Windows/Defs.h\"\n\nnamespace NWindows {\nnamespace NTime {\n\nbool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime)\n{\n  return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &fileTime));\n}\n\nstatic const UInt32 kHighDosTime = 0xFF9FBF7D;\nstatic const UInt32 kLowDosTime = 0x210000;\n\nbool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime)\n{\n  WORD datePart, timePart;\n  if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart))\n  {\n    dosTime = (fileTime.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime;\n    return false;\n  }\n  dosTime = (((UInt32)datePart) << 16) + timePart;\n  return true;\n}\n\nstatic const UInt32 kNumTimeQuantumsInSecond = 10000000;\nstatic const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774;\n\nvoid UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime)\n{\n  UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond;\n  fileTime.dwLowDateTime = (DWORD)v;\n  fileTime.dwHighDateTime = (DWORD)(v >> 32);\n}\n\nbool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime)\n{\n  UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;\n  if (winTime < kUnixTimeStartValue)\n  {\n    unixTime = 0;\n    return false;\n  }\n  winTime = (winTime - kUnixTimeStartValue) / kNumTimeQuantumsInSecond;\n  if (winTime > 0xFFFFFFFF)\n  {\n    unixTime = 0xFFFFFFFF;\n    return false;\n  }\n  unixTime = (UInt32)winTime;\n  return true;\n}\n\nbool GetSecondsSince1601(unsigned year, unsigned month, unsigned day,\n  unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds)\n{\n  resSeconds = 0;\n  if (year < 1601 || year >= 10000 || month < 1 || month > 12 ||\n      day < 1 || day > 31 || hour > 23 || min > 59 || sec > 59)\n    return false;\n  UInt32 numYears = year - 1601;\n  UInt32 numDays = numYears * 365 + numYears / 4 - numYears / 100 + numYears / 400;\n  Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\n  if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))\n    ms[1] = 29;\n  month--;\n  for (unsigned i = 0; i < month; i++)\n    numDays += ms[i];\n  numDays += day - 1;\n  resSeconds = ((UInt64)(numDays * 24 + hour) * 60 + min) * 60 + sec;\n  return true;\n}\n\nvoid GetCurUtcFileTime(FILETIME &ft)\n{\n  SYSTEMTIME st;\n  GetSystemTime(&st);\n  SystemTimeToFileTime(&st, &ft);\n}\n\n}}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Time.h",
    "content": "// Windows/Time.h\n\n#ifndef __WINDOWS_TIME_H\n#define __WINDOWS_TIME_H\n\n#include \"Common/Types.h\"\n\nnamespace NWindows {\nnamespace NTime {\n\nbool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime);\nbool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime);\nvoid UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime);\nbool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime);\nbool GetSecondsSince1601(unsigned year, unsigned month, unsigned day,\n  unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds);\nvoid GetCurUtcFileTime(FILETIME &ft);\n\n}}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Window.cpp",
    "content": "// Windows/Window.cpp\n\n#include \"StdAfx.h\"\n\n// For compilers that support precompilation, includes \"wx/wx.h\".\n#include \"wx/wxprec.h\"\n \n#ifdef __BORLANDC__\n    #pragma hdrstop\n#endif\n\n// for all others, include the necessary headers (this file is usually all you\n// need because it includes almost all \"standard\" wxWidgets headers)\n#ifndef WX_PRECOMP\n    #include \"wx/wx.h\"\n#endif  \n\n#ifndef _UNICODE\n#include \"Common/StringConvert.h\"\n#endif\n#include \"Windows/Window.h\"\n\nclass LockGUI\n{\n\tbool _IsMain;\n\tpublic:\n\t\tLockGUI() { \n\t\t\t_IsMain = wxThread::IsMain();\n\t\t\tif (!_IsMain) wxMutexGuiEnter();\n\t       \t}\n\t\t~LockGUI() { if (!_IsMain) wxMutexGuiLeave(); }\n};\n\nnamespace NWindows {\n\nHWND GetDlgItem(HWND dialogWindow, int ControlID)\n{\n\tLockGUI lock;\n\tif (dialogWindow) return dialogWindow->FindWindow(ControlID);\n\treturn 0;\n}\n\nvoid MySetWindowText(HWND wnd, LPCWSTR s)\n{ \n\tif (wnd == 0) return;\n\n\tLockGUI lock;\n\n\twxString str = s;\n\t/*\n\tint id = wnd->GetId();\n\tif (  (id != wxID_OK) && (id != wxID_CANCEL) && (id != wxID_HELP) && (id != wxID_YES) && (id != wxID_NO))\n\t*/\n\t{\n\t\twnd->SetLabel(str);\n\t}\n}\n\n\tbool CWindow::GetText(CSysString &s)\n\t{\n\t  \twxString str;\n\t\t{\n\t\t\tLockGUI lock;\n\t  \t\tstr = _window->GetLabel();\n\t\t}\n\t  \ts = str;\n\t  \treturn true;\n\t}\n\n\tbool CWindow::IsEnabled()\n\t{\n\t\tLockGUI lock;\n\t\treturn _window->IsEnabled();\n\t}\n}\n\n////////////////////////////////// Windows Compatibility\n#include <sys/resource.h>\n\nvoid Sleep(unsigned millisec)\n{\n\twxMilliSleep(millisec);\n}\n\nt_processID GetCurrentProcess(void)  {\n\treturn getpid();\n}\n\nvoid SetPriorityClass(t_processID pid , int priority) {\n\tsetpriority(PRIO_PROCESS,pid,priority);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/Windows/Window.h",
    "content": "// Windows/Window.h\n\n#ifndef __WINDOWS_WINDOW_H\n#define __WINDOWS_WINDOW_H\n\n#include \"Windows/Defs.h\"\n#include \"Common/MyString.h\"\n\nnamespace NWindows {\n\nHWND GetDlgItem(HWND dialogWindow, int ControlID);\nvoid    MySetWindowText(HWND wnd, LPCWSTR s);\n\nclass CWindow\n{\nprivate:\n   // bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags);\nprotected:\n  HWND _window;\npublic:\n  CWindow(HWND newWindow = NULL): _window(newWindow){};\n  CWindow& operator=(HWND newWindow)\n  {\n    _window = newWindow;\n    return *this;\n  }\n  operator HWND() const { return _window; }\n  void Attach(HWND newWindow) { _window = newWindow; }\n  HWND Detach()\n  {\n    HWND window = _window;\n    _window = NULL;\n    return window;\n  }\n  virtual void SetText(LPCWSTR s) { MySetWindowText(_window, s); }\n  virtual bool GetText(CSysString &s);\n  bool IsEnabled();\n};\n\n}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/include_windows/basetyps.h",
    "content": "#ifndef _BASETYPS_H\n#define _BASETYPS_H\n\n#ifdef HAVE_GCCVISIBILITYPATCH\n    #define DLLEXPORT __attribute__ ((visibility(\"default\")))\n  #else\n    #define DLLEXPORT\n  #endif\n\n#ifdef __cplusplus\n#define STDAPI extern \"C\" DLLEXPORT HRESULT\n#else\n#define STDAPI extern DLLEXPORT HRESULT\n#endif  /* __cplusplus */ \n\ntypedef GUID IID;\ntypedef GUID CLSID;\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/include_windows/tchar.h",
    "content": "/* \n * tchar.h\n *\n * Unicode mapping layer for the standard C library. By including this\n * file and using the 't' names for string functions\n * (eg. _tprintf) you can make code which can be easily adapted to both\n * Unicode and non-unicode environments. In a unicode enabled compile define\n * _UNICODE before including tchar.h, otherwise the standard non-unicode\n * library functions will be used.\n *\n * Note that you still need to include string.h or stdlib.h etc. to define\n * the appropriate functions. Also note that there are several defines\n * included for non-ANSI functions which are commonly available (but using\n * the convention of prepending an underscore to non-ANSI library function\n * names).\n *\n * This file is part of the Mingw32 package.\n *\n * Contributors:\n *  Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>\n *\n *  THIS SOFTWARE IS NOT COPYRIGHTED\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n * $Revision: 1.11 $\n * $Author: earnie $\n * $Date: 2003/05/03 13:48:46 $\n *\n */\n\n#ifndef\t_TCHAR_H_\n#define _TCHAR_H_\n\n/* All the headers include this file. */\n#ifndef __int64\n#define __int64 long long\n#endif\n\n#ifndef __cdecl\n#define __cdecl /* */\n#endif\n\n/*\n * NOTE: This tests _UNICODE, which is different from the UNICODE define\n *       used to differentiate Win32 API calls.\n */\n#ifdef\t_UNICODE\n\n\n/*\n * Use TCHAR instead of char or wchar_t. It will be appropriately translated\n * if _UNICODE is correctly defined (or not).\n */\n#ifndef _TCHAR_DEFINED\ntypedef\twchar_t\tTCHAR;\n#define _TCHAR_DEFINED\n#endif\n\n/*\n * Unicode functions\n */\n/*\n#define _tfopen     _wfopen\nFILE *_wfopen( const wchar_t *filename, const wchar_t *mode );\n*/\n\n#else\t/* Not _UNICODE */\n\n#define _tfopen     fopen\n\n/*\n * TCHAR, the type you should use instead of char.\n */\n#ifndef _TCHAR_DEFINED\ntypedef char\tTCHAR;\n#define _TCHAR_DEFINED\n#endif\n\n#endif\t/* Not _UNICODE */\n\n#endif\t/* Not _TCHAR_H_ */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/include_windows/windows.h",
    "content": "/*\n\twindows.h - main header file for the Win32 API\n\n\tWritten by Anders Norlander <anorland@hem2.passagen.se>\n\n\tThis file is part of a free library for the Win32 API.\n\n\tThis library is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n*/\n#ifndef _WINDOWS_H\n#define _WINDOWS_H\n\n#include <stdarg.h>\n\n/* BEGIN #include <windef.h> */\n\n#include \"Common/MyWindows.h\" // FIXED\n\n#ifndef CONST\n#define CONST const\n#endif\n\n#undef MAX_PATH\n#define MAX_PATH 4096  /* Linux : 4096  - Windows : 260 */\n\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#define WINAPI \n\n#undef BOOL\ntypedef int BOOL;\n\n/* BEGIN #include <winnt.h> */\n/* BEGIN <winerror.h> */\n#define NO_ERROR                    0L\n#define ERROR_ALREADY_EXISTS        EEXIST\n#define ERROR_FILE_EXISTS           EEXIST\n#define ERROR_INVALID_HANDLE        EBADF\n#define ERROR_PATH_NOT_FOUND        ENOENT\n#define ERROR_DISK_FULL             ENOSPC\n#define ERROR_NO_MORE_FILES         0x100123 // FIXME\n\n/* see Common/WyWindows.h\n#define S_OK ((HRESULT)0x00000000L)\n#define S_FALSE ((HRESULT)0x00000001L)\n#define E_INVALIDARG ((HRESULT)0x80070057L)\n#define E_NOTIMPL ((HRESULT)0x80004001L)\n#define E_NOINTERFACE ((HRESULT)0x80004002L)\n#define E_ABORT ((HRESULT)0x80004004L)\n#define E_FAIL ((HRESULT)0x80004005L)\n#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)\n#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L)\n#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)\n#define FAILED(Status) ((HRESULT)(Status)<0)\n*/\n#ifndef VOID\n#define VOID void\n#endif\ntypedef void *PVOID,*LPVOID;\ntypedef WCHAR *LPWSTR;\ntypedef CHAR *LPSTR;\ntypedef TCHAR *LPTSTR;\n\n#ifdef UNICODE\n/*\n * P7ZIP_TEXT is a private macro whose specific use is to force the expansion of a\n * macro passed as an argument to the macro TEXT.  DO NOT use this\n * macro within your programs.  It's name and function could change without\n * notice.\n */\n#define P7ZIP_TEXT(q) L##q\n#else\n#define P7ZIP_TEXT(q) q\n#endif\n/*\n * UNICODE a constant string when UNICODE is defined, else returns the string\n * unmodified.\n * The corresponding macros  _TEXT() and _T() for mapping _UNICODE strings\n * passed to C runtime functions are defined in mingw/tchar.h\n */\n#define TEXT(q) P7ZIP_TEXT(q)    \n\ntypedef BYTE BOOLEAN;\n\n/* BEGIN #include <basetsd.h> */\n#ifndef __int64\n#define __int64 long long\n#endif\ntypedef unsigned __int64 UINT64;\ntypedef __int64 INT64;\n/* END #include <basetsd.h> */\n\n#define FILE_ATTRIBUTE_READONLY             1\n#define FILE_ATTRIBUTE_HIDDEN               2\n#define FILE_ATTRIBUTE_SYSTEM               4\n#define FILE_ATTRIBUTE_DIRECTORY           16\n#define FILE_ATTRIBUTE_ARCHIVE             32\n#define FILE_ATTRIBUTE_DEVICE              64\n#define FILE_ATTRIBUTE_NORMAL             128\n#define FILE_ATTRIBUTE_TEMPORARY          256\n#define FILE_ATTRIBUTE_SPARSE_FILE        512\n#define FILE_ATTRIBUTE_REPARSE_POINT     1024\n#define FILE_ATTRIBUTE_COMPRESSED        2048\n#define FILE_ATTRIBUTE_OFFLINE          0x1000\n#define FILE_ATTRIBUTE_ENCRYPTED        0x4000\n#define FILE_ATTRIBUTE_UNIX_EXTENSION   0x8000   /* trick for Unix */\n\n/* END   <winerror.h> */\n\n#include <string.h>\n#include <stddef.h>\n\n/* END #include <winnt.h> */\n\n/* END #include <windef.h> */\n\n/* BEGIN #include <winbase.h> */\n\n#define WAIT_OBJECT_0 0\n#define INFINITE\t0xFFFFFFFF\n\ntypedef struct _SYSTEMTIME {\n\tWORD wYear;\n\tWORD wMonth;\n\tWORD wDayOfWeek;\n\tWORD wDay;\n\tWORD wHour;\n\tWORD wMinute;\n\tWORD wSecond;\n\tWORD wMilliseconds;\n} SYSTEMTIME;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nBOOL WINAPI DosDateTimeToFileTime(WORD,WORD,FILETIME *);\nBOOL WINAPI FileTimeToDosDateTime(CONST FILETIME *,WORD *, WORD *);\nBOOL WINAPI FileTimeToLocalFileTime(CONST FILETIME *,FILETIME *);\nBOOL WINAPI FileTimeToSystemTime(CONST FILETIME *,SYSTEMTIME *);\nBOOL WINAPI LocalFileTimeToFileTime(CONST FILETIME *,FILETIME *);\nVOID WINAPI GetSystemTime(SYSTEMTIME *);\nBOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME*,FILETIME *);\n\nDWORD WINAPI GetTickCount(VOID);\n\n#ifdef __cplusplus\n}\n#endif\n/* END #include <winbase.h> */\n\n/* BEGIN #include <winnls.h> */\n\n#define CP_ACP   0\n#define CP_OEMCP 1\n#define CP_UTF8  65001\n\n/* #include <unknwn.h> */\n#include <basetyps.h>\nstruct IEnumSTATPROPSTG;\n\ntypedef struct  tagSTATPROPSTG {\n\tLPOLESTR lpwstrName;\n\tPROPID propid;\n\tVARTYPE vt;\n} STATPROPSTG;\n\n#ifdef __cplusplus\nextern \"C\" const IID IID_ISequentialStream;\nstruct ISequentialStream : public IUnknown\n{\n\tSTDMETHOD(QueryInterface)(REFIID,PVOID*) PURE;\n\tSTDMETHOD_(ULONG,AddRef)(void) PURE;\n\tSTDMETHOD_(ULONG,Release)(void) PURE;\n\tSTDMETHOD(Read)(void*,ULONG,ULONG*) PURE;\n\tSTDMETHOD(Write)(void const*,ULONG,ULONG*) PURE;\n};\n#else\nextern const IID IID_ISequentialStream;\n#endif  /* __cplusplus */\n\n\n/* END #include <ole2.h> */\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/StdAfx.h",
    "content": "// stdafx.h\n\n#ifndef __STDAFX_H\n#define __STDAFX_H\n\n\n#include \"config.h\"\n\n\n#define NO_INLINE /* FIXME */\n\n#ifdef HAVE_PTHREAD\n#include <pthread.h>\n#endif\n\n#include \"Common/MyWindows.h\"\n#include \"Common/Types.h\"\n\n#include <windows.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <tchar.h>\n#include <wchar.h>\n#include <stddef.h>\n#include <ctype.h>\n#include <unistd.h>\n#include <errno.h>\n#include <math.h>\n\n#ifdef __NETWARE__\n#include <sys/types.h>\n#endif\n\n#undef CS /* fix for Solaris 10 x86 */\n\n/***************************/\n\n#define CLASS_E_CLASSNOTAVAILABLE        ((HRESULT)0x80040111L)\n\n/************************* LastError *************************/\ninline DWORD WINAPI GetLastError(void) { return errno; }\ninline void WINAPI SetLastError( DWORD err ) { errno = err; }\n\n#define AreFileApisANSI() (1)\n\nvoid Sleep(unsigned millisleep);\n\ntypedef pid_t t_processID;\n\nt_processID GetCurrentProcess(void);\n\n#define  NORMAL_PRIORITY_CLASS (0)\n#define  IDLE_PRIORITY_CLASS   (10)\nvoid SetPriorityClass(t_processID , int priority);\n\n#ifdef __cplusplus\nclass wxWindow;\ntypedef wxWindow *HWND;\n\n#define MB_ICONERROR (0x00000200) // wxICON_ERROR\n#define MB_YESNOCANCEL (0x00000002 | 0x00000008 | 0x00000010) // wxYES | wxNO | wxCANCEL\n#define MB_ICONQUESTION (0x00000400) // wxICON_QUESTION\n#define MB_TASKMODAL  (0) // FIXME\n#define MB_SYSTEMMODAL (0) // FIXME\n\n#define MB_OK (0) // FIXME !\n#define MB_ICONSTOP (0) // FIXME !\n#define MB_OKCANCEL (0) // FIXME !\n\n#define MessageBox MessageBoxW\nint MessageBoxW(wxWindow * parent, const TCHAR * mes, const TCHAR * title,int flag);\n\ntypedef void *HINSTANCE;\n\ntypedef          int   INT_PTR;  // FIXME 64 bits ?\ntypedef unsigned int  UINT_PTR;  // FIXME 64 bits ?\ntypedef          long LONG_PTR;  // FIXME 64 bits ?\ntypedef          long DWORD_PTR; // FIXME 64 bits ?\ntypedef UINT_PTR WPARAM;\n\n/* WARNING\n LPARAM shall be 'long' because of CListView::SortItems and wxListCtrl::SortItems :\n*/\ntypedef LONG_PTR LPARAM;\ntypedef LONG_PTR LRESULT;\n\n#define CALLBACK /* */\n\n/************ LANG ***********/\ntypedef WORD            LANGID;\n\nLANGID GetUserDefaultLangID(void);\nLANGID GetSystemDefaultLangID(void);\n\n#define PRIMARYLANGID(l)        ((WORD)(l) & 0x3ff)\n#define SUBLANGID(l)            ((WORD)(l) >> 10)\n\n#endif\n\n#endif \n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/config.h",
    "content": "\n#if !defined(__DJGPP__)\n\n#ifndef __CYGWIN__\n  #define FILESYSTEM_IS_CASE_SENSITIVE 1\n#endif\n\n  #if !defined(ENV_MACOSX) && !defined(ENV_BEOS)\n\n    /* <wchar.h> */\n    /* HAVE_WCHAR__H and not HAVE_WCHAR_H to avoid warning with wxWidgets */\n    #define HAVE_WCHAR__H\n\n    /* <wctype.h> */\n    #define HAVE_WCTYPE_H\n\n    /* mbrtowc */\n/* #ifndef __hpux */\n/*    #define HAVE_MBRTOWC */\n/* #endif */\n\n    /* towupper */\n    #define HAVE_TOWUPPER\n\n  #endif /* !ENV_MACOSX && !ENV_BEOS */\n\n  #if !defined(ENV_BEOS)\n  #define HAVE_GETPASS\n  #endif\n\n  /* lstat, readlink and S_ISLNK */\n  #define HAVE_LSTAT\n\n  /* <locale.h> */\n  #define HAVE_LOCALE\n\n  /* mbstowcs */\n  #define HAVE_MBSTOWCS\n\n  /* wcstombs */\n  #define HAVE_WCSTOMBS\n\n#endif /* !__DJGPP__ */\n\n#ifndef ENV_BEOS\n#define HAVE_PTHREAD\n#endif\n\n#if defined(ENV_MACOSX)\n#define LOCALE_IS_UTF8\n#endif\n\n#ifdef LOCALE_IS_UTF8\n#undef HAVE_LOCALE\n#undef HAVE_MBSTOWCS\n#undef HAVE_WCSTOMBS\n/* #undef HAVE_MBRTOWC */\n#endif\n\n#define MAX_PATHNAME_LEN   1024\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/initguid.h",
    "content": "// initguid.h\n\n#include \"Common/MyInitGuid.h\"\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/makefile",
    "content": "PROG=test_emul\n\nLOCAL_FLAGS=-I. -I.. -I../include_windows\n\ninclude ../../makefile.crc32\ninclude ../../makefile.machine\n\nLIBS=$(LOCAL_LIBS)\n\nOBJS=myGetTickCount.o \\\n\twine_date_and_time.o \\\n\tmySplitCommandLine.o \\\n\tmyAddExeFlag.o \\\n\ttest_emul.o \\\n\tMyVector.o \\\n\tMyString.o \\\n\tMyWindows.o\n\ninclude ../../makefile.glb\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/makefile.depend",
    "content": "myGetTickCount.o: myGetTickCount.cpp StdAfx.h config.h \\\n ../Common/MyWindows.h ../Common/MyGuidDef.h ../Common/Types.h\nmySplitCommandLine.o: mySplitCommandLine.cpp StdAfx.h config.h \\\n ../Common/MyWindows.h ../Common/MyGuidDef.h ../Common/Types.h \\\n ../Common/StringConvert.h ../Common/MyString.h ../Common/MyVector.h \\\n ../Common/Defs.h myPrivate.h\nmyAddExeFlag.o: myAddExeFlag.cpp StdAfx.h config.h \\\n ../Common/MyWindows.h ../Common/MyGuidDef.h ../Common/Types.h \\\n myPrivate.h ../Common/StringConvert.h ../Common/MyString.h \\\n ../Common/MyVector.h ../Common/Defs.h\ntest_emul.o: test_emul.cpp StdAfx.h config.h ../Common/MyWindows.h \\\n ../Common/MyGuidDef.h ../Common/Types.h ../Common/StringConvert.h \\\n ../Common/MyString.h ../Common/MyVector.h ../Common/Defs.h \\\n ../Common/StdOutStream.h ../Common/StringConvert.cpp \\\n ../Common/UTFConvert.cpp ../Common/UTFConvert.h \\\n ../Common/StdOutStream.cpp ../Common/IntToString.h \\\n ../Common/IntToString.cpp ../Windows/Synchronization.cpp \\\n ../Windows/Synchronization.h ../Windows/Defs.h \\\n ../Windows/../../C/Threads.h ../Windows/../../C/Types.h \\\n ../Windows/FileFind.cpp ../Windows/FileFind.h \\\n ../Windows/../Common/MyString.h ../Windows/FileName.h \\\n ../Windows/../Common/StringConvert.h myPrivate.h\nwine_date_and_time.o: wine_date_and_time.cpp config.h\nMyVector.o: ../Common/MyVector.cpp StdAfx.h config.h \\\n ../Common/MyWindows.h ../Common/MyGuidDef.h ../Common/Types.h \\\n ../Common/MyVector.h ../Common/Defs.h\nMyString.o: ../Common/MyString.cpp StdAfx.h config.h \\\n ../Common/MyWindows.h ../Common/MyGuidDef.h ../Common/Types.h \\\n ../Common/StringConvert.h ../Common/MyString.h ../Common/MyVector.h \\\n ../Common/Defs.h myPrivate.h\nMyWindows.o: ../Common/MyWindows.cpp StdAfx.h config.h \\\n ../Common/MyWindows.h ../Common/MyGuidDef.h ../Common/Types.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/makefile.list",
    "content": "SRCS=myGetTickCount.cpp \\\n mySplitCommandLine.cpp \\\n myAddExeFlag.cpp \\\n test_emul.cpp \\\n wine_date_and_time.cpp \\\n ../Common/MyVector.cpp \\\n ../Common/MyString.cpp \\\n ../Common/MyWindows.cpp\n\nmySplitCommandLine.o : mySplitCommandLine.cpp\n\t$(CXX) $(CXXFLAGS) mySplitCommandLine.cpp\nmyAddExeFlag.o : myAddExeFlag.cpp\n\t$(CXX) $(CXXFLAGS) myAddExeFlag.cpp\nmyGetTickCount.o : myGetTickCount.cpp\n\t$(CXX) $(CXXFLAGS) myGetTickCount.cpp\ntest_emul.o : test_emul.cpp\n\t$(CXX) $(CXXFLAGS) test_emul.cpp\nwine_date_and_time.o : wine_date_and_time.cpp\n\t$(CXX) $(CXXFLAGS) wine_date_and_time.cpp\nMyVector.o : ../Common/MyVector.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/MyVector.cpp\nMyString.o : ../Common/MyString.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/MyString.cpp\nMyWindows.o : ../Common/MyWindows.cpp\n\t$(CXX) $(CXXFLAGS) ../Common/MyWindows.cpp\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/myAddExeFlag.cpp",
    "content": "#include \"StdAfx.h\"\n\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include <windows.h>\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n#include \"myPrivate.h\"\n\n#include \"Common/StringConvert.h\"\n\n\nvoid myAddExeFlag(LPCTSTR filename)\n{\n\tconst char * name = nameWindowToUnix(filename);\n\t// printf(\"myAddExeFlag(%s)\\n\",name);\n\tchmod(name,0700);\n}\n\nvoid myAddExeFlag(const UString &u_name)\n{\n\tmyAddExeFlag(UnicodeStringToMultiByte(u_name, CP_ACP));\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/myGetTickCount.cpp",
    "content": "#include \"StdAfx.h\"\n\n#include <time.h>\n\nDWORD WINAPI GetTickCount(VOID) {\n  return (DWORD)time(0); // FIXME : but only for the seed of the random generator\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/myPrivate.h",
    "content": "\nvoid WINAPI RtlSecondsSince1970ToFileTime( DWORD Seconds, FILETIME * ft );\n\nextern \"C\" int global_use_utf16_conversion;\n#ifdef HAVE_LSTAT\nextern \"C\" int global_use_lstat;\n#endif\n\nconst char *my_getlocale(void);\n\n#ifdef NEED_NAME_WINDOWS_TO_UNIX\nstatic inline const char * nameWindowToUnix(const char * lpFileName) {\n  if ((lpFileName[0] == 'c') && (lpFileName[1] == ':')) return lpFileName+2;\n  return lpFileName;\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/mySplitCommandLine.cpp",
    "content": "#include \"StdAfx.h\"\n\n#include \"../Common/StringConvert.h\"\n\n#include \"myPrivate.h\"\n\n#ifdef HAVE_LOCALE\n#include <locale.h>\n#endif\n\nextern void my_windows_split_path(const AString &p_path, AString &dir , AString &base);\n\nvoid mySplitCommandLine(int numArguments,const char *arguments[],UStringVector &parts) {\n\n  { // define P7ZIP_HOME_DIR\n    static char p7zip_home_dir[MAX_PATH];\n    AString dir,name;\n    my_windows_split_path(arguments[0],dir,name);\n    snprintf(p7zip_home_dir,sizeof(p7zip_home_dir),\"P7ZIP_HOME_DIR=%s/\",(const char *)dir);\n    p7zip_home_dir[sizeof(p7zip_home_dir)-1] = 0;\n    putenv(p7zip_home_dir);\n  }\n\n#ifdef HAVE_LOCALE\n  // set the program's current locale from the user's environment variables\n  setlocale(LC_ALL,\"\");\n\n\n  // auto-detect which conversion p7zip should use\n  char *locale = setlocale(LC_CTYPE,0);\n  if (locale) {\n    size_t len = strlen(locale);\n    char *locale_upper = (char *)malloc(len+1);\n    if (locale_upper) {\n      strcpy(locale_upper,locale);\n\n      for(size_t i=0;i<len;i++)\n        locale_upper[i] = toupper(locale_upper[i] & 255);\n\n      if (    (strcmp(locale_upper,\"\") != 0)\n              && (strcmp(locale_upper,\"C\") != 0)\n              && (strcmp(locale_upper,\"POSIX\") != 0) ) {\n        global_use_utf16_conversion = 1;\n      }\n      free(locale_upper);\n    }\n  }\n#elif defined(LOCALE_IS_UTF8)\n  global_use_utf16_conversion = 1; // assume LC_CTYPE=\"utf8\"\n#else\n  global_use_utf16_conversion = 0; // assume LC_CTYPE=\"C\"\n#endif\n\n  parts.Clear();\n  for(int ind=0;ind < numArguments; ind++) {\n    if ((ind <= 2) && (strcmp(arguments[ind],\"-no-utf16\") == 0)) {\n      global_use_utf16_conversion = 0;\n    } else if ((ind <= 2) && (strcmp(arguments[ind],\"-utf16\") == 0)) {\n      global_use_utf16_conversion = 1;\n    } else {\n      UString tmp = MultiByteToUnicodeString(arguments[ind]);\n      // tmp.Trim(); \" \" is a valid filename ...\n      if (!tmp.IsEmpty()) {\n        parts.Add(tmp);\n      }\n    }\n  }\n}\n\nconst char *my_getlocale(void) {\n#ifdef HAVE_LOCALE\n  const char* ret = setlocale(LC_CTYPE,0);\n  if (ret == 0)\n    ret =\"C\";\n  return ret;\n#elif defined(LOCALE_IS_UTF8)\n  return \"utf8\";\n#else\n  return \"C\";\n#endif\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/test_emul.cpp",
    "content": "#undef BIG_ENDIAN\n#undef LITTLE_ENDIAN\n\n#include \"StdAfx.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <dirent.h>\n#include <unistd.h>\n\n#ifdef HAVE_WCHAR__H\n#include <wchar.h>\n#endif\n#ifdef HAVE_LOCALE\n#include <locale.h>\n#endif\n\n#include <windows.h>\n\n#define NEED_NAME_WINDOWS_TO_UNIX\n// #include \"myPrivate.h\"\n\n#include \"Common/StringConvert.h\"\n#include \"Common/StdOutStream.h\"\n\n#undef NDEBUG\n#include <assert.h>\n\n#include \"Common/StringConvert.cpp\"\n#include \"Common/StdOutStream.cpp\"\n#include \"Common/IntToString.cpp\"\n\n#include \"Windows/Synchronization.cpp\"\n#include \"Windows/FileFind.cpp\"\n#include \"Windows/Time.cpp\"\n\nusing namespace NWindows;\n\n#if  defined(HAVE_WCHAR__H) && defined(HAVE_MBSTOWCS) && defined(HAVE_WCSTOMBS)\nvoid test_mbs(void) {\n  wchar_t wstr1[256] = {\n                         L'e',\n                         0xE8, // latin small letter e with grave\n                         0xE9, // latin small letter e with acute\n                         L'a',\n                         0xE0, // latin small letter a with grave\n                         0x20AC, // euro sign\n                         L'b',\n                         0 };\n  wchar_t wstr2[256];\n  char    astr[256];\n\n  global_use_utf16_conversion = 1;\n\n  size_t len1 = wcslen(wstr1);\n\n  printf(\"wstr1 - %d - '%ls'\\n\",(int)len1,wstr1);\n\n  size_t len0 = wcstombs(astr,wstr1,sizeof(astr));\n  printf(\"astr - %d - '%s'\\n\",(int)len0,astr);\n\n  size_t len2 = mbstowcs(wstr2,astr,sizeof(wstr2)/sizeof(*wstr2));\n  printf(\"wstr - %d - '%ls'\\n\",(int)len2,wstr2);\n\n  if (wcscmp(wstr1,wstr2) != 0) {\n    printf(\"ERROR during conversions wcs -> mbs -> wcs\\n\");\n    exit(EXIT_FAILURE);\n  }\n\n  char *ptr = astr;\n  size_t len = 0;\n  while (*ptr) {\n    ptr = CharNextA(ptr);\n    len += 1;\n  }\n  if ((len != len1) && (len != 12)) { // 12 = when locale is UTF8 instead of ISO8859-15\n    printf(\"ERROR CharNextA : len=%d, len1=%d\\n\",(int)len,(int)len1);\n    exit(EXIT_FAILURE);\n  }\n\n  UString ustr(wstr1);\n  assert(ustr.Length() == (int)len1);\n\n  AString  ansistr(astr);\n  assert(ansistr.Length() == (int)len0);\n\n  ansistr = UnicodeStringToMultiByte(ustr);\n  assert(ansistr.Length() == (int)len0);\n\n  assert(strcmp(ansistr,astr) == 0);\n  assert(wcscmp(ustr,wstr1) == 0);\n\n  UString ustr2 = MultiByteToUnicodeString(astr);\n  assert(ustr2.Length() == (int)len1);\n  assert(wcscmp(ustr2,wstr1) == 0);\n}\n#endif\n\nstatic void test_astring(int num) {\n  AString strResult;\n\n  strResult = \"first part : \";\n  char number[256];\n  sprintf(number,\"%d\",num);\n  strResult += AString(number);\n\n  strResult += \" : last part\";\n\n  printf(\"strResult -%s-\\n\",(const char *)strResult);\n\n}\n\n\nextern void my_windows_split_path(const AString &p_path, AString &dir , AString &base);\n\nstatic struct {\n  const char *path;\n  const char *dir;\n  const char *base;\n}\ntabSplit[]=\n  {\n    { \"\",\".\",\".\" },\n    { \"/\",\"/\",\"/\" },\n    { \".\",\".\",\".\" },\n    { \"//\",\"/\",\"/\" },\n    { \"///\",\"/\",\"/\" },\n    { \"dir\",\".\",\"dir\" },\n    { \"/dir\",\"/\",\"dir\" },\n    { \"/dir/\",\"/\",\"dir\" },\n    { \"/dir/base\",\"/dir\",\"base\" },\n    { \"/dir//base\",\"/dir\",\"base\" },\n    { \"/dir///base\",\"/dir\",\"base\" },\n    { \"//dir/base\",\"//dir\",\"base\" },\n    { \"///dir/base\",\"///dir\",\"base\" },\n    { \"/dir/base/\",\"/dir\",\"base\" },\n    { 0,0,0 }\n  };\n\nstatic void test_split_astring() {\n  int ind = 0;\n  while (tabSplit[ind].path) {\n    AString path(tabSplit[ind].path);\n    AString dir;\n    AString base;\n\n    my_windows_split_path(path,dir,base);\n\n    if ((dir != tabSplit[ind].dir) || (base != tabSplit[ind].base)) {\n      printf(\"ERROR : '%s' '%s' '%s'\\n\",(const char *)path,(const char *)dir,(const char *)base);\n    }\n    ind++;\n  }\n  printf(\"test_split_astring : done\\n\");\n}\n\n // Number of 100 nanosecond units from 1/1/1601 to 1/1/1970\n#define EPOCH_BIAS  116444736000000000LL\nstatic LARGE_INTEGER UnixTimeToUL(time_t tps_unx)\n{\n\tLARGE_INTEGER ul;\n\tul.QuadPart = tps_unx * 10000000LL + EPOCH_BIAS;\n\treturn ul;\n}\n\nstatic LARGE_INTEGER FileTimeToUL(FILETIME fileTime)\n{\n\tLARGE_INTEGER lFileTime;\n\tlFileTime.QuadPart = fileTime.dwHighDateTime;\n\tlFileTime.QuadPart = (lFileTime.QuadPart << 32) | fileTime.dwLowDateTime;\n\treturn lFileTime;\n}\n\nstatic void display(const char *txt,SYSTEMTIME systime)\n{\n\tFILETIME fileTime;\n\tBOOL ret = SystemTimeToFileTime(&systime,&fileTime);\n\tassert(ret == TRUE);\n\tLARGE_INTEGER ulFileTime = FileTimeToUL(fileTime);\n\t\n\tconst char * day=\"\";\n\tswitch (systime.wDayOfWeek)\n\t{\n        \tcase 0:day = \"Sunday\";break;\n        \tcase 1:day = \"Monday\";break;\n        \tcase 2:day = \"Tuesday\";break;\n        \tcase 3:day = \"Wednesday\";break;\n        \tcase 4:day = \"Thursday\";break;\n        \tcase 5:day = \"Friday\";break;\n        \tcase 6:day = \"Saturday\";break;\n\t}\n\tg_StdOut<< txt << day << \" \" \n\t\t<< (int)systime.wYear << \"/\" <<  (int)systime.wMonth << \"/\" << (int)systime.wDay << \" \"\n\t\t<< (int)systime.wHour << \":\" << (int)systime.wMinute << \":\" <<  (int)systime.wSecond << \":\" \n        \t<<     (int)systime.wMilliseconds\n\t\t<< \" (\" << (UInt64)ulFileTime.QuadPart << \")\\n\";\n}\n\nstatic void test_time()\n{\n\ttime_t tps_unx = time(0);\n\n\tg_StdOut << \"\\nTEST TIME :\\n\";\n\tSYSTEMTIME systimeGM;\n\tGetSystemTime(&systimeGM);\n\t\n\tLARGE_INTEGER ul = UnixTimeToUL(tps_unx);\n\tg_StdOut<<\"  unix time = \" << (UInt64)tps_unx << \" (\" << (UInt64)ul.QuadPart << \")\\n\";\n\n\tg_StdOut<<\"  gmtime    : \" << asctime(gmtime(&tps_unx))<<\"\\n\";\n\tg_StdOut<<\"  localtime : \" << asctime(localtime(&tps_unx))<<\"\\n\";\n\n\tdisplay(\"  GetSystemTime : \", systimeGM);\n}\n\nstatic void test_time2()\n{\n\tprintf(\"Test Time :\\n\");\n\tprintf(\"===========\\n\");\n\t/* DosTime To utcFileTime */\n\tUInt32 dosTime = 0x30d0094C;\n\tFILETIME utcFileTime;\n        FILETIME localFileTime;\n\n\tif (NTime::DosTimeToFileTime(dosTime, localFileTime))\n\t{\n\t\tif (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))\n\t\t\tutcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;\n\t}\n\n\tprintf(\"  - 0x%x => 0x%x 0x%x => 0x%x 0x%x\\n\",(unsigned)dosTime,\n\t\t(unsigned)localFileTime.dwHighDateTime,(unsigned)localFileTime.dwLowDateTime,\n\t\t(unsigned)utcFileTime.dwHighDateTime,(unsigned)utcFileTime.dwLowDateTime);\n\n\n\t/* utcFileTime to DosTime */\n        FILETIME localFileTime2 = { 0, 0 };\n\tUInt32 dosTime2 = 0;\n        FileTimeToLocalFileTime(&utcFileTime, &localFileTime2);\n        NTime::FileTimeToDosTime(localFileTime2, dosTime2);\n\n\tprintf(\"  - 0x%x <= 0x%x 0x%x <= 0x%x 0x%x\\n\",(unsigned)dosTime2,\n\t\t(unsigned)localFileTime2.dwHighDateTime,(unsigned)localFileTime2.dwLowDateTime,\n\t\t(unsigned)utcFileTime.dwHighDateTime,(unsigned)utcFileTime.dwLowDateTime);\n\n\tassert(dosTime == dosTime2);\n\tassert(localFileTime.dwHighDateTime == localFileTime2.dwHighDateTime);\n\tassert(localFileTime.dwLowDateTime  == localFileTime2.dwLowDateTime);\n}\n\nstatic void test_semaphore()\n{\n\tg_StdOut << \"\\nTEST SEMAPHORE :\\n\";\n\n\tNWindows::NSynchronization::CSynchro sync;\n\tNWindows::NSynchronization::CSemaphoreWFMO sema;\n\tbool bres;\n\tDWORD waitResult;\n\tint i;\n\n\tsync.Create();\n\tsema.Create(&sync,2,10);\n\n\tg_StdOut << \"   - Release(1)\\n\";\n\tfor(i = 0 ;i < 8;i++)\n\t{\n\t\t// g_StdOut << \"     - Release(1) : \"<< i << \"\\n\";\n\t\tbres = sema.Release(1);\n\t\tassert(bres == S_OK);\n\t}\n\t// g_StdOut << \"     - Release(1) : done\\n\";\n\tbres = sema.Release(1);\n\tassert(bres == S_FALSE);\n\n\tg_StdOut << \"   - WaitForMultipleObjects(INFINITE)\\n\";\n\tHANDLE events[1] = { sema };\n\tfor(i=0;i<10;i++)\n\t{\n\t\twaitResult = ::WaitForMultipleObjects(1, events, FALSE, INFINITE);\n\t\tassert(waitResult == WAIT_OBJECT_0);\n\t}\n\n\tg_StdOut << \"   Done\\n\";\n}\n\n\n\nint main() {\n#ifdef HAVE_LOCALE\n  setlocale(LC_ALL,\"\");\n#endif\n\n#if defined(BIG_ENDIAN)\n  printf(\"BIG_ENDIAN : %d\\n\",(int)BIG_ENDIAN);\n#endif\n#if defined(LITTLE_ENDIAN)\n  printf(\"LITTLE_ENDIAN : %d\\n\",(int)LITTLE_ENDIAN);\n#endif\n\n  printf(\"sizeof(Byte)   : %d\\n\",(int)sizeof(Byte));\n  printf(\"sizeof(UInt16) : %d\\n\",(int)sizeof(UInt16));\n  printf(\"sizeof(UInt32) : %d\\n\",(int)sizeof(UInt32));\n  printf(\"sizeof(UINT32) : %d\\n\",(int)sizeof(UINT32));\n  printf(\"sizeof(UInt64) : %d\\n\",(int)sizeof(UInt64));\n  printf(\"sizeof(UINT64) : %d\\n\",(int)sizeof(UINT64));\n  printf(\"sizeof(void *) : %d\\n\",(int)sizeof(void *));\n  printf(\"sizeof(size_t) : %d\\n\",(int)sizeof(size_t));\n  printf(\"sizeof(ptrdiff_t) : %d\\n\",(int)sizeof(ptrdiff_t));\n  printf(\"sizeof(off_t) : %d\\n\",(int)sizeof(off_t));\n\n  union {\n\tByte b[2];\n\tUInt16 s;\n  } u;\n  u.s = 0x1234;\n\n  if ((u.b[0] == 0x12) && (u.b[1] == 0x34)) {\n    printf(\"CPU : big endian\\n\");\n  } else if ((u.b[0] == 0x34) && (u.b[1] == 0x12)) {\n    printf(\"CPU : little endian\\n\");\n  } else {\n    printf(\"CPU : unknown endianess\\n\");\n  }\n\n#if  defined(HAVE_WCHAR__H) && defined(HAVE_MBSTOWCS) && defined(HAVE_WCSTOMBS)\n  test_mbs();\n#endif\n\n  test_astring(12345);\n  test_split_astring();\n\n  test_time();\n\n  test_time2();\n\n  test_semaphore();\n\n  printf(\"\\n### All Done ###\\n\\n\");\n\n  return 0;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/wine_GetXXXDefaultLangID.cpp",
    "content": "\n#include \"StdAfx.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <locale.h>\n#include <wchar.h>\n#include <ctype.h>\n#include <string.h>\n\ntypedef DWORD LCID;\ntypedef void * ULONG_PTR; /* typedef unsigned long ULONG_PTR; */\n\n#define SORT_DEFAULT        0x0\n\n#define LANG_NEUTRAL        0x00\n#define LANG_ENGLISH        0x09\n\n#define SUBLANG_DEFAULT     0x01    /* user default */\n\n#define MAKELCID(l, s)       ( (l & 0xFFFF) | ((s & 0xFFFF)<<16))\n#define MAKELANGID(p, s)     ((((WORD)(s))<<10) | (WORD)(p))\n\n#define LANGIDFROMLCID(lcid) ((WORD)(lcid))\n\nstatic LCID lcid_LC_MESSAGES = 0;\nstatic LCID lcid_LC_CTYPE = 0;\n\nstruct locale_name\n{\n    WCHAR  win_name[128];   /* Windows name (\"en-US\") */\n    WCHAR  lang[128];       /* language (\"en\") (note: buffer contains the other strings too) */\n    WCHAR *country;         /* country (\"US\") */\n    WCHAR *charset;         /* charset (\"UTF-8\") for Unix format only */\n    WCHAR *script;          /* script (\"Latn\") for Windows format only */\n    WCHAR *modifier;        /* modifier or sort order */\n    LCID   lcid;            /* corresponding LCID */\n    int    matches;         /* number of elements matching LCID (0..4) */\n    UINT   codepage;        /* codepage corresponding to charset */\n};\n#define WINE_UNICODE_INLINE static\n\n/***********************************************************/\ntypedef struct {\n\tconst WCHAR * LOCALE_SNAME;\n\tconst WCHAR * LOCALE_SISO639LANGNAME;\n\tconst WCHAR * LOCALE_SISO3166CTRYNAME;\n\tunsigned int  LOCALE_IDEFAULTUNIXCODEPAGE;\n\tunsigned int  LOCALE_ILANGUAGE;\n} t_info;\n\nstatic t_info g_langInfo[] = {\n\t{ L\"af-ZA\" , L\"af\" , L\"ZA\" , 28591 , 0x0436 },  /* afk.nls */\n\t{ L\"ar-SA\" , L\"ar\" , L\"SA\" , 28596 , 0x0401 },  /* ara.nls */\n\t{ L\"ar-LB\" , L\"ar\" , L\"LB\" , 28596 , 0x3001 },  /* arb.nls */\n\t{ L\"ar-EG\" , L\"ar\" , L\"EG\" , 28596 , 0x0c01 },  /* are.nls */\n\t{ L\"ar-DZ\" , L\"ar\" , L\"DZ\" , 28596 , 0x1401 },  /* arg.nls */\n\t{ L\"ar-BH\" , L\"ar\" , L\"BH\" , 28596 , 0x3c01 },  /* arh.nls */\n\t{ L\"ar-IQ\" , L\"ar\" , L\"IQ\" , 28596 , 0x0801 },  /* ari.nls */\n\t{ L\"ar-JO\" , L\"ar\" , L\"JO\" , 28596 , 0x2c01 },  /* arj.nls */\n\t{ L\"ar-KW\" , L\"ar\" , L\"KW\" , 28596 , 0x3401 },  /* ark.nls */\n\t{ L\"ar-LY\" , L\"ar\" , L\"LY\" , 28596 , 0x1001 },  /* arl.nls */\n\t{ L\"ar-MA\" , L\"ar\" , L\"MA\" , 28596 , 0x1801 },  /* arm.nls */\n\t{ L\"ar-OM\" , L\"ar\" , L\"OM\" , 28596 , 0x2001 },  /* aro.nls */\n\t{ L\"ar-QA\" , L\"ar\" , L\"QA\" , 28596 , 0x4001 },  /* arq.nls */\n\t{ L\"ar-SY\" , L\"ar\" , L\"SY\" , 28596 , 0x2801 },  /* ars.nls */\n\t{ L\"ar-TN\" , L\"ar\" , L\"TN\" , 28596 , 0x1c01 },  /* art.nls */\n\t{ L\"ar-AE\" , L\"ar\" , L\"AE\" , 28596 , 0x3801 },  /* aru.nls */\n\t{ L\"ar-YE\" , L\"ar\" , L\"YE\" , 28596 , 0x2401 },  /* ary.nls */\n\t{ L\"az-AZ\" , L\"az\" , L\"AZ\" , 28595 , 0x082c },  /* aze.nls */\n\t{ L\"az-Latn-AZ\" , L\"az\" , L\"AZ\" , 28599 , 0x042c },  /* azl.nls */\n\t{ L\"be-BY\" , L\"be\" , L\"BY\" , 1251 , 0x0423 },  /* bel.nls */\n\t{ L\"bg-BG\" , L\"bg\" , L\"BG\" , 1251 , 0x0402 },  /* bgr.nls */\n\t{ L\"br-FR\" , L\"br\" , L\"FR\" , 28605 , 0x0493 },  /* brf.nls */\n\t{ L\"ca-ES\" , L\"ca\" , L\"ES\" , 28605 , 0x0403 },  /* cat.nls */\n\t{ L\"zh-CN\" , L\"zh\" , L\"CN\" , 936 , 0x0804 },  /* chs.nls */\n\t{ L\"zh-TW\" , L\"zh\" , L\"TW\" , 950 , 0x0404 },  /* cht.nls */\n\t{ L\"kw-GB\" , L\"kw\" , L\"GB\" , 28605 , 0x04891 },  /* cor.nls */\n\t{ L\"cs-CZ\" , L\"cs\" , L\"CZ\" , 28592 , 0x0405 },  /* csy.nls */\n\t{ L\"cy-GB\" , L\"cy\" , L\"GB\" , 28604 , 0x0492 },  /* cym.nls */\n\t{ L\"da-DK\" , L\"da\" , L\"DK\" , 28605 , 0x0406 },  /* dan.nls */\n\t{ L\"de-AT\" , L\"de\" , L\"AT\" , 28605 , 0x0c07 },  /* dea.nls */\n\t{ L\"de-LI\" , L\"de\" , L\"LI\" , 28605 , 0x1407 },  /* dec.nls */\n\t{ L\"de-LU\" , L\"de\" , L\"LU\" , 28605 , 0x1007 },  /* del.nls */\n\t{ L\"de-CH\" , L\"de\" , L\"CH\" , 28605 , 0x0807 },  /* des.nls */\n\t{ L\"de-DE\" , L\"de\" , L\"DE\" , 28605 , 0x0407 },  /* deu.nls */\n\t{ L\"dv-MV\" , L\"dv\" , L\"MV\" , 65001 , 0x0465 },  /* div.nls */\n\t{ L\"el-GR\" , L\"el\" , L\"GR\" , 28597 , 0x0408 },  /* ell.nls */\n\t{ L\"en-AU\" , L\"en\" , L\"AU\" , 28591 , 0x0c09 },  /* ena.nls */\n\t{ L\"en-CB\" , L\"en\" , L\"CB\" , 28591 , 0x2409 },  /* enb.nls */\n\t{ L\"en-CA\" , L\"en\" , L\"CA\" , 28591 , 0x1009 },  /* enc.nls */\n\t{ L\"en-GB\" , L\"en\" , L\"GB\" , 28605 , 0x0809 },  /* eng.nls */\n\t{ L\"en-IE\" , L\"en\" , L\"IE\" , 28605 , 0x1809 },  /* eni.nls */\n\t{ L\"en-JM\" , L\"en\" , L\"JM\" , 28591 , 0x2009 },  /* enj.nls */\n\t{ L\"en-BZ\" , L\"en\" , L\"BZ\" , 28591 , 0x2809 },  /* enl.nls */\n\t{ L\"en-PH\" , L\"en\" , L\"PH\" , 28591 , 0x3409 },  /* enp.nls */\n\t{ L\"en-ZA\" , L\"en\" , L\"ZA\" , 28591 , 0x1c09 },  /* ens.nls */\n\t{ L\"en-TT\" , L\"en\" , L\"TT\" , 28591 , 0x2c09 },  /* ent.nls */\n\t{ L\"en-US\" , L\"en\" , L\"US\" , 28591 , 0x0409 },  /* enu.nls */\n\t{ L\"en-ZW\" , L\"en\" , L\"ZW\" , 28591 , 0x3009 },  /* enw.nls */\n\t{ L\"en-NZ\" , L\"en\" , L\"NZ\" , 28591 , 0x1409 },  /* enz.nls */\n\t{ L\"eo\" , L\"eo\" , L\"\" , 65001 , 0x048f },  /* eox.nls */\n\t{ L\"es-PA\" , L\"es\" , L\"PA\" , 28591 , 0x180a },  /* esa.nls */\n\t{ L\"es-BO\" , L\"es\" , L\"BO\" , 28591 , 0x400a },  /* esb.nls */\n\t{ L\"es-CR\" , L\"es\" , L\"CR\" , 28591 , 0x140a },  /* esc.nls */\n\t{ L\"es-DO\" , L\"es\" , L\"DO\" , 28591 , 0x1c0a },  /* esd.nls */\n\t{ L\"es-SV\" , L\"es\" , L\"SV\" , 28591 , 0x440a },  /* ese.nls */\n\t{ L\"es-EC\" , L\"es\" , L\"EC\" , 28591 , 0x300a },  /* esf.nls */\n\t{ L\"es-GT\" , L\"es\" , L\"GT\" , 28591 , 0x100a },  /* esg.nls */\n\t{ L\"es-HN\" , L\"es\" , L\"HN\" , 28591 , 0x480a },  /* esh.nls */\n\t{ L\"es-NI\" , L\"es\" , L\"NI\" , 28591 , 0x4c0a },  /* esi.nls */\n\t{ L\"es-C\" , L\"es\" , L\"C\" , 28591 , 0x340a },  /* esl.nls */\n\t{ L\"es-MX\" , L\"es\" , L\"MX\" , 28591 , 0x080a },  /* esm.nls */\n\t{ L\"es-ES_modern\" , L\"es\" , L\"ES\" , 28605 , 0x0c0a },  /* esn.nls */\n\t{ L\"es-CO\" , L\"es\" , L\"CO\" , 28591 , 0x240a },  /* eso.nls */\n\t{ L\"es-ES\" , L\"es\" , L\"ES\" , 28605 , 0x040a },  /* esp.nls */\n\t{ L\"es-PE\" , L\"es\" , L\"PE\" , 28591 , 0x280a },  /* esr.nls */\n\t{ L\"es-AR\" , L\"es\" , L\"AR\" , 28591 , 0x2c0a },  /* ess.nls */\n\t{ L\"es-PR\" , L\"es\" , L\"PR\" , 28591 , 0x500a },  /* esu.nls */\n\t{ L\"es-VE\" , L\"es\" , L\"VE\" , 28591 , 0x200a },  /* esv.nls */\n\t{ L\"es-UY\" , L\"es\" , L\"UY\" , 28591 , 0x380a },  /* esy.nls */\n\t{ L\"es-PY\" , L\"es\" , L\"PY\" , 28591 , 0x3c0a },  /* esz.nls */\n\t{ L\"et-EE\" , L\"et\" , L\"EE\" , 28605 , 0x0425 },  /* eti.nls */\n\t{ L\"eu-ES\" , L\"eu\" , L\"ES\" , 28605 , 0x042d },  /* euq.nls */\n\t{ L\"fa-IR\" , L\"fa\" , L\"IR\" , 65001 , 0x0429 },  /* far.nls */\n\t{ L\"fi-FI\" , L\"fi\" , L\"FI\" , 28605 , 0x040b },  /* fin.nls */\n\t{ L\"fo-FO\" , L\"fo\" , L\"FO\" , 28605 , 0x0438 },  /* fos.nls */\n\t{ L\"fr-FR\" , L\"fr\" , L\"FR\" , 28605 , 0x040c },  /* fra.nls */\n\t{ L\"fr-BE\" , L\"fr\" , L\"BE\" , 28605 , 0x080c },  /* frb.nls */\n\t{ L\"fr-CA\" , L\"fr\" , L\"CA\" , 28591 , 0x0c0c },  /* frc.nls */\n\t{ L\"fr-LU\" , L\"fr\" , L\"LU\" , 28605 , 0x140c },  /* frl.nls */\n\t{ L\"fr-MC\" , L\"fr\" , L\"MC\" , 28605 , 0x180c },  /* frm.nls */\n\t{ L\"fr-CH\" , L\"fr\" , L\"CH\" , 28605 , 0x100c },  /* frs.nls */\n\t{ L\"ga-IE\" , L\"ga\" , L\"IE\" , 28605 , 0x043c },  /* gae.nls */\n\t{ L\"gd-GB\" , L\"gd\" , L\"GB\" , 28605 , 0x083c },  /* gdh.nls */\n\t{ L\"gv-GB\" , L\"gv\" , L\"GB\" , 28605 , 0x0c3c },  /* gdv.nls */\n\t{ L\"gl-ES\" , L\"gl\" , L\"ES\" , 28605 , 0x0456 },  /* glc.nls */\n\t{ L\"gu-IN\" , L\"gu\" , L\"IN\" , 65001 , 0x0447 },  /* guj.nls */\n\t{ L\"he-I\" , L\"he\" , L\"I\" , 28598 , 0x040d },  /* heb.nls */\n\t{ L\"hi-IN\" , L\"hi\" , L\"IN\" , 65001 , 0x0439 },  /* hin.nls */\n\t{ L\"hr-HR\" , L\"hr\" , L\"HR\" , 28592 , 0x041a },  /* hrv.nls */\n\t{ L\"hu-HU\" , L\"hu\" , L\"HU\" , 28592 , 0x040e },  /* hun.nls */\n\t{ L\"hy-AM\" , L\"hy\" , L\"AM\" , 65001 , 0x042b },  /* hye.nls */\n\t{ L\"id-ID\" , L\"id\" , L\"ID\" , 28591 , 0x0421 },  /* ind.nls */\n\t{ L\"is-IS\" , L\"is\" , L\"IS\" , 28605 , 0x040f },  /* isl.nls */\n\t{ L\"it-IT\" , L\"it\" , L\"IT\" , 28605 , 0x0410 },  /* ita.nls */\n\t{ L\"it-CH\" , L\"it\" , L\"CH\" , 28605 , 0x0810 },  /* its.nls */\n\t{ L\"ja-JP\" , L\"ja\" , L\"JP\" , 20932 , 0x0411 },  /* jpn.nls */\n\t{ L\"kn-IN\" , L\"kn\" , L\"IN\" , 65001 , 0x044b },  /* kan.nls */\n\t{ L\"ka-GE\" , L\"ka\" , L\"GE\" , 65001 , 0x0437 },  /* kat.nls */\n\t{ L\"kk-KZ\" , L\"kk\" , L\"KZ\" , 28595 , 0x043f },  /* kkz.nls */\n\t{ L\"kok-IN\" , L\"kok\" , L\"IN\" , 65001 , 0x0457 },  /* knk.nls */\n\t{ L\"ko-KR\" , L\"ko\" , L\"KR\" , 949 , 0x0412 },  /* kor.nls */\n\t{ L\"ky-KG\" , L\"ky\" , L\"KG\" , 28595 , 0x0440 },  /* kyr.nls */\n\t{ L\"lt-LT\" , L\"lt\" , L\"LT\" , 28603 , 0x0427 },  /* lth.nls */\n\t{ L\"lv-LV\" , L\"lv\" , L\"LV\" , 28603 , 0x0426 },  /* lvi.nls */\n\t{ L\"mr-IN\" , L\"mr\" , L\"IN\" , 65001 , 0x044e },  /* mar.nls */\n\t{ L\"mk-MK\" , L\"mk\" , L\"MK\" , 28595 , 0x042f },  /* mki.nls */\n\t{ L\"mn-MN\" , L\"mn\" , L\"MN\" , 28595 , 0x0450 },  /* mon.nls */\n\t{ L\"ms-BN\" , L\"ms\" , L\"BN\" , 28591 , 0x083e },  /* msb.nls */\n\t{ L\"ms-MY\" , L\"ms\" , L\"MY\" , 28591 , 0x043e },  /* msl.nls */\n\t{ L\"nl-BE\" , L\"nl\" , L\"BE\" , 28605 , 0x0813 },  /* nlb.nls */\n\t{ L\"nl-N\" , L\"nl\" , L\"N\" , 28605 , 0x0413 },  /* nld.nls */\n\t{ L\"nl-SR\" , L\"nl\" , L\"SR\" , 28605 , 0x0c13 },  /* nls.nls */\n\t{ L\"nn-NO\" , L\"nn\" , L\"NO\" , 28605 , 0x0814 },  /* non.nls */\n\t{ L\"nb-NO\" , L\"nb\" , L\"NO\" , 28605 , 0x0414 },  /* nor.nls */\n\t{ L\"pa-IN\" , L\"pa\" , L\"IN\" , 65001 , 0x0446 },  /* pan.nls */\n\t{ L\"pl-P\" , L\"pl\" , L\"P\" , 28592 , 0x0415 },  /* plk.nls */\n\t{ L\"pt-BR\" , L\"pt\" , L\"BR\" , 28591 , 0x0416 },  /* ptb.nls */\n\t{ L\"pt-PT\" , L\"pt\" , L\"PT\" , 28605 , 0x0816 },  /* ptg.nls */\n\t{ L\"rm-CH\" , L\"rm\" , L\"CH\" , 28605 , 0x0417 },  /* rmc.nls */\n\t{ L\"ro-RO\" , L\"ro\" , L\"RO\" , 28592 , 0x0418 },  /* rom.nls */\n\t{ L\"ru-RU\" , L\"ru\" , L\"RU\" , 20866 , 0x0419 },  /* rus.nls */\n\t{ L\"sa-IN\" , L\"sa\" , L\"IN\" , 65001 , 0x044f },  /* san.nls */\n\t{ L\"sk-SK\" , L\"sk\" , L\"SK\" , 28592 , 0x041b },  /* sky.nls */\n\t{ L\"sl-SI\" , L\"sl\" , L\"SI\" , 28592 , 0x0424 },  /* slv.nls */\n\t{ L\"sq-A\" , L\"sq\" , L\"A\" , 28592 , 0x041c },  /* sqi.nls */\n\t{ L\"sr-SP\" , L\"sr\" , L\"SP\" , 28595 , 0x0c1a },  /* srb.nls */\n\t{ L\"sr-Latn-SP\" , L\"sr\" , L\"SP\" , 28592 , 0x081a },  /* srl.nls */\n\t{ L\"sv-SE\" , L\"sv\" , L\"SE\" , 28605 , 0x041d },  /* sve.nls */\n\t{ L\"sv-FI\" , L\"sv\" , L\"FI\" , 28605 , 0x081d },  /* svf.nls */\n\t{ L\"sw-KE\" , L\"sw\" , L\"KE\" , 28591 , 0x0441 },  /* swk.nls */\n\t{ L\"syr-SY\" , L\"syr\" , L\"SY\" , 65001 , 0x045a },  /* syr.nls */\n\t{ L\"ta-IN\" , L\"ta\" , L\"IN\" , 65001 , 0x0449 },  /* tam.nls */\n\t{ L\"te-IN\" , L\"te\" , L\"IN\" , 65001 , 0x044a },  /* tel.nls */\n\t{ L\"th-TH\" , L\"th\" , L\"TH\" , 874 , 0x041e },  /* tha.nls */\n\t{ L\"tr-TR\" , L\"tr\" , L\"TR\" , 28599 , 0x041f },  /* trk.nls */\n\t{ L\"tt-TA\" , L\"tt\" , L\"TA\" , 28595 , 0x0444 },  /* ttt.nls */\n\t{ L\"uk-UA\" , L\"uk\" , L\"UA\" , 21866 , 0x0422 },  /* ukr.nls */\n\t{ L\"ur-PK\" , L\"ur\" , L\"PK\" , 1256 , 0x0420 },  /* urd.nls */\n\t{ L\"uz-UZ\" , L\"uz\" , L\"UZ\" , 28595 , 0x0843 },  /* uzb.nls */\n\t{ L\"uz-Latn-UZ\" , L\"uz\" , L\"UZ\" , 28605 , 0x0443 },  /* uzl.nls */\n\t{ L\"vi-VN\" , L\"vi\" , L\"VN\" , 1258 , 0x042a },  /* vit.nls */\n\t{ L\"wa-BE\" , L\"wa\" , L\"BE\" , 28605 , 0x0490 },  /* wal.nls */\n\t{ L\"zh-HK\" , L\"zh\" , L\"HK\" , 950 , 0x0c04 },  /* zhh.nls */\n\t{ L\"zh-SG\" , L\"zh\" , L\"SG\" , 936 , 0x1004 },  /* zhi.nls */\n\t{ L\"zh-MO\" , L\"zh\" , L\"MO\" , 950 , 0x1404 },  /* zhm.nls */\n\t{ 0 , 0 , 0 , 0, 0 }\n};\n\n/***********************************************************/\nWINE_UNICODE_INLINE WCHAR *strchrW( const WCHAR *str, WCHAR ch )\n{\n    do { if (*str == ch) return (WCHAR *)(ULONG_PTR)str; } while (*str++);\n    return NULL;\n}\n\nWINE_UNICODE_INLINE WCHAR *strpbrkW( const WCHAR *str, const WCHAR *accept )\n{\n    for ( ; *str; str++) if (strchrW( accept, *str )) return (WCHAR *)(ULONG_PTR)str;\n    return NULL;\n}\n\n\n/***********************************************************/\n\nWINE_UNICODE_INLINE unsigned int strlenW( const WCHAR *str )\n{\n    const WCHAR *s = str;\n    while (*s) s++;\n    return s - str;\n}\n\nWINE_UNICODE_INLINE WCHAR *strcpyW( WCHAR *dst, const WCHAR *src )\n{\n    WCHAR *p = dst;\n    while ((*p++ = *src++));\n    return dst;\n}\n\nWINE_UNICODE_INLINE WCHAR *strcatW( WCHAR *dst, const WCHAR *src )\n{\n    strcpyW( dst + strlenW(dst), src );\n    return dst;\n}\n\nWINE_UNICODE_INLINE int strcmpW( const WCHAR *str1, const WCHAR *str2 )\n{\n    while (*str1 && (*str1 == *str2)) { str1++; str2++; }\n    return *str1 - *str2;\n}\n\n\nWINE_UNICODE_INLINE LPWSTR lstrcpynW( LPWSTR dst, LPCWSTR src, int n )\n{\n    {\n        LPWSTR d = dst;\n        LPCWSTR s = src;\n        UINT count = n;\n\n        while ((count > 1) && *s)\n        {\n            count--;\n            *d++ = *s++;\n        }\n        if (count) *d = 0;\n    }\n    return dst;\n}\n\n/* Copy Ascii string to Unicode without using codepages */\nstatic inline void strcpynAtoW( WCHAR *dst, const char *src, size_t n )\n{\n    while (n > 1 && *src)\n    {\n        *dst++ = (unsigned char)*src++;\n        n--;\n    }\n    if (n) *dst = 0;\n}\n\n/*******************************************************/\n\n/* Charset to codepage map, sorted by name. */\nstatic const struct charset_entry\n{\n    const char *charset_name;\n    UINT        codepage;\n} charset_names[] =\n{\n    { \"BIG5\", 950 },\n    { \"CP1250\", 1250 },\n    { \"CP1251\", 1251 },\n    { \"CP1252\", 1252 },\n    { \"CP1253\", 1253 },\n    { \"CP1254\", 1254 },\n    { \"CP1255\", 1255 },\n    { \"CP1256\", 1256 },\n    { \"CP1257\", 1257 },\n    { \"CP1258\", 1258 },\n    { \"CP932\", 932 },\n    { \"CP936\", 936 },\n    { \"CP949\", 949 },\n    { \"CP950\", 950 },\n    { \"EUCJP\", 20932 },\n    { \"GB2312\", 936 },\n    { \"IBM037\", 37 },\n    { \"IBM1026\", 1026 },\n    { \"IBM424\", 424 },\n    { \"IBM437\", 437 },\n    { \"IBM500\", 500 },\n    { \"IBM850\", 850 },\n    { \"IBM852\", 852 },\n    { \"IBM855\", 855 },\n    { \"IBM857\", 857 },\n    { \"IBM860\", 860 },\n    { \"IBM861\", 861 },\n    { \"IBM862\", 862 },\n    { \"IBM863\", 863 },\n    { \"IBM864\", 864 },\n    { \"IBM865\", 865 },\n    { \"IBM866\", 866 },\n    { \"IBM869\", 869 },\n    { \"IBM874\", 874 },\n    { \"IBM875\", 875 },\n    { \"ISO88591\", 28591 },\n    { \"ISO885910\", 28600 },\n    { \"ISO885913\", 28603 },\n    { \"ISO885914\", 28604 },\n    { \"ISO885915\", 28605 },\n    { \"ISO885916\", 28606 },\n    { \"ISO88592\", 28592 },\n    { \"ISO88593\", 28593 },\n    { \"ISO88594\", 28594 },\n    { \"ISO88595\", 28595 },\n    { \"ISO88596\", 28596 },\n    { \"ISO88597\", 28597 },\n    { \"ISO88598\", 28598 },\n    { \"ISO88599\", 28599 },\n    { \"KOI8R\", 20866 },\n    { \"KOI8U\", 21866 },\n    { \"UTF8\", CP_UTF8 }\n};\n\nstatic int charset_cmp( const void *name, const void *entry )\n{\n    const struct charset_entry *charset = (const struct charset_entry *)entry;\n    return strcasecmp( (const char *)name, charset->charset_name );\n}\n\nstatic UINT find_charset( const WCHAR *name )\n{\n    const struct charset_entry *entry;\n    char charset_name[16];\n    size_t i, j;\n\n    /* remove punctuation characters from charset name */\n    for (i = j = 0; name[i] && j < sizeof(charset_name)-1; i++)\n        if (isalnum((unsigned char)name[i])) charset_name[j++] = name[i];\n    charset_name[j] = 0;\n\n    entry = (const struct charset_entry *)bsearch( charset_name, charset_names,\n                     sizeof(charset_names)/sizeof(charset_names[0]),\n                     sizeof(charset_names[0]), charset_cmp );\n    if (entry) return entry->codepage;\n\n    return 0;\n}\n/*******************************************************/\n\nstatic BOOL find_locale_id_callback(/* LPCWSTR name, ? */ const t_info * tab,  struct locale_name *data)\n{\n    // WCHAR buffer[128];\n    int matches = 0;\n    WORD LangID = tab->LOCALE_ILANGUAGE & 0xFFFF; /* FIXME */\n    LCID lcid = MAKELCID( LangID, SORT_DEFAULT );  /* FIXME: handle sort order */\n\n    if (PRIMARYLANGID(LangID) == LANG_NEUTRAL) return TRUE; /* continue search */\n\n    /* first check exact name */\n    if (data->win_name[0] && tab->LOCALE_SNAME[0])\n        /* GetLocaleInfoW( lcid, LOCALE_SNAME | LOCALE_NOUSEROVERRIDE,\n                        buffer, sizeof(buffer)/sizeof(WCHAR) )) */\n    {\n        if (!strcmpW( data->win_name, tab->LOCALE_SNAME ))\n        {\n            matches = 4;  /* everything matches */\n            goto done;\n        }\n    }\n\n    /*if (!GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME | LOCALE_NOUSEROVERRIDE,\n                         buffer, sizeof(buffer)/sizeof(WCHAR) )) */\n    if (tab->LOCALE_SISO639LANGNAME[0] == 0)\n        return TRUE;\n\n    if (strcmpW( tab->LOCALE_SISO639LANGNAME , data->lang )) return TRUE;\n    matches++;  /* language name matched */\n\n    if (data->country)\n    {\n         /* if (GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME|LOCALE_NOUSEROVERRIDE,\n                            buffer, sizeof(buffer)/sizeof(WCHAR) )) */\n        if (tab->LOCALE_SISO3166CTRYNAME[0])\n        {\n            if (strcmpW(tab->LOCALE_SISO3166CTRYNAME , data->country )) goto done;\n            matches++;  /* country name matched */\n        }\n    }\n    else  /* match default language */\n    {\n        if (SUBLANGID(LangID) == SUBLANG_DEFAULT) matches++;\n    }\n\n    if (data->codepage)\n    {\n        UINT unix_cp;\n        /* if (GetLocaleInfoW( lcid, LOCALE_IDEFAULTUNIXCODEPAGE | LOCALE_RETURN_NUMBER,\n                            (LPWSTR)&unix_cp, sizeof(unix_cp)/sizeof(WCHAR) )) */\n\tunix_cp = tab->LOCALE_IDEFAULTUNIXCODEPAGE;\n        {\n            if (unix_cp == data->codepage) matches++;\n        }\n    }\n\n    /* FIXME: check sort order */\n\ndone:\n    if (matches > data->matches)\n    {\n        data->lcid = lcid;\n        data->matches = matches;\n    }\n    return (data->matches < 4);  /* no need to continue for perfect match */\n}\n\n\n/***********************************************************************\n *\t\tparse_locale_name\n *\n * Parse a locale name into a struct locale_name, handling both Windows and Unix formats.\n * Unix format is: lang[_country][.charset][@modifier]\n * Windows format is: lang[-script][-country][_modifier]\n */\nstatic void parse_locale_name( const WCHAR *str, struct locale_name *name )\n{\n    static const WCHAR sepW[] = {'-','_','.','@',0};\n    static const WCHAR winsepW[] = {'-','_',0};\n    static const WCHAR posixW[] = {'P','O','S','I','X',0};\n    static const WCHAR cW[] = {'C',0};\n    static const WCHAR latinW[] = {'l','a','t','i','n',0};\n    static const WCHAR latnW[] = {'-','L','a','t','n',0};\n    WCHAR *p;\n    int ind;\n\n    // TRACE(\"%s\\n\", debugstr_w(str));\n\n    name->country = name->charset = name->script = name->modifier = NULL;\n    name->lcid = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT );\n    name->matches = 0;\n    name->codepage = 0;\n    name->win_name[0] = 0;\n    lstrcpynW( name->lang, str, sizeof(name->lang)/sizeof(WCHAR) );\n\n    if (!(p = strpbrkW( name->lang, sepW )))\n    {\n        if (!strcmpW( name->lang, posixW ) || !strcmpW( name->lang, cW ))\n        {\n            name->matches = 4;  /* perfect match for default English lcid */\n            return;\n        }\n        strcpyW( name->win_name, name->lang );\n    }\n    else if (*p == '-')  /* Windows format */\n    {\n        strcpyW( name->win_name, name->lang );\n        *p++ = 0;\n        name->country = p;\n        if (!(p = strpbrkW( p, winsepW ))) goto done;\n        if (*p == '-')\n        {\n            *p++ = 0;\n            name->script = name->country;\n            name->country = p;\n            if (!(p = strpbrkW( p, winsepW ))) goto done;\n        }\n        *p++ = 0;\n        name->modifier = p;\n    }\n    else  /* Unix format */\n    {\n        if (*p == '_')\n        {\n            *p++ = 0;\n            name->country = p;\n            p = strpbrkW( p, sepW + 2 );\n        }\n        if (p && *p == '.')\n        {\n            *p++ = 0;\n            name->charset = p;\n            p = strchrW( p, '@' );\n        }\n        if (p)\n        {\n            *p++ = 0;\n            name->modifier = p;\n        }\n\n        if (name->charset)\n            name->codepage = find_charset( name->charset );\n\n        /* rebuild a Windows name if possible */\n\n        if (name->charset) goto done;  /* can't specify charset in Windows format */\n        if (name->modifier && strcmpW( name->modifier, latinW ))\n            goto done;  /* only Latn script supported for now */\n        strcpyW( name->win_name, name->lang );\n        if (name->modifier) strcatW( name->win_name, latnW );\n        if (name->country)\n        {\n            p = name->win_name + strlenW(name->win_name);\n            *p++ = '-';\n            strcpyW( p, name->country );\n        }\n    }\ndone:\n    ;\n\n/* DEBUG\n    printf(\"EnumResourceLanguagesW(...):\\n\");\n    printf(\"  name->win_name=%ls\\n\", name->win_name);\n    printf(\"  name->lang=%ls\\n\", name->lang);\n    printf(\"  name->country=%ls\\n\", name->country);\n    printf(\"  name->codepage=%d\\n\", name->codepage);\n*/\n//    EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE,\n//                            find_locale_id_callback, (LPARAM)name );\n\n    ind = 0;\n    while (g_langInfo[ind].LOCALE_SNAME)\n    {\n\t    BOOL ret = find_locale_id_callback(&g_langInfo[ind],name);\n\t    if (ret == FALSE) \n\t\t    break;\n\n\t    ind++;\n    }\n}\n\n\n\n\n/********************************/\n\nstatic UINT setup_unix_locales(void)\n{\n    struct locale_name locale_name;\n    // WCHAR buffer[128];\n    WCHAR ctype_buff[128];\n    char *locale;\n    UINT unix_cp = 0;\n\n    if ((locale = setlocale( LC_CTYPE, NULL )))\n    {\n        strcpynAtoW( ctype_buff, locale, sizeof(ctype_buff)/sizeof(WCHAR) );\n        parse_locale_name( ctype_buff, &locale_name );\n        lcid_LC_CTYPE = locale_name.lcid;\n        unix_cp = locale_name.codepage;\n    }\n    if (!lcid_LC_CTYPE)  /* this one needs a default value */\n        lcid_LC_CTYPE = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT );\n\n#if 0\n    TRACE( \"got lcid %04x (%d matches) for LC_CTYPE=%s\\n\",\n           locale_name.lcid, locale_name.matches, debugstr_a(locale) );\n\n#define GET_UNIX_LOCALE(cat) do \\\n    if ((locale = setlocale( cat, NULL ))) \\\n    { \\\n        strcpynAtoW( buffer, locale, sizeof(buffer)/sizeof(WCHAR) ); \\\n        if (!strcmpW( buffer, ctype_buff )) lcid_##cat = lcid_LC_CTYPE; \\\n        else { \\\n            parse_locale_name( buffer, &locale_name );  \\\n            lcid_##cat = locale_name.lcid; \\\n            TRACE( \"got lcid %04x (%d matches) for \" #cat \"=%s\\n\",        \\\n                   locale_name.lcid, locale_name.matches, debugstr_a(locale) ); \\\n        } \\\n    } while (0)\n\n    GET_UNIX_LOCALE( LC_COLLATE );\n    GET_UNIX_LOCALE( LC_MESSAGES );\n    GET_UNIX_LOCALE( LC_MONETARY );\n    GET_UNIX_LOCALE( LC_NUMERIC );\n    GET_UNIX_LOCALE( LC_TIME );\n#ifdef LC_PAPER\n    GET_UNIX_LOCALE( LC_PAPER );\n#endif\n#ifdef LC_MEASUREMENT\n    GET_UNIX_LOCALE( LC_MEASUREMENT );\n#endif\n#ifdef LC_TELEPHONE\n    GET_UNIX_LOCALE( LC_TELEPHONE );\n#endif\n\n#undef GET_UNIX_LOCALE\n\n#endif // #if 0\n\n    return unix_cp;\n}\n\n/********************************/\n\nstatic void LOCALE_Init(void)\n{\n\t/*\n    extern void __wine_init_codepages( const union cptable *ansi_cp, const union cptable *oem_cp,\n                                       const union cptable *unix_cp );\n\t\t\t\t       */\n\n    // UINT ansi_cp = 1252, oem_cp = 437, mac_cp = 10000, unix_cp;\n    UINT unix_cp = 0;\n\n#ifdef __APPLE__\n    /* MacOS doesn't set the locale environment variables so we have to do it ourselves */\n    CFArrayRef preferred_locales, all_locales;\n    CFStringRef user_language_string_ref = NULL;\n    char user_locale[50];\n\n    CFLocaleRef user_locale_ref = CFLocaleCopyCurrent();\n    CFStringRef user_locale_string_ref = CFLocaleGetIdentifier( user_locale_ref );\n\n    CFStringGetCString( user_locale_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );\n    CFRelease( user_locale_ref );\n    if (!strchr( user_locale, '.' )) strcat( user_locale, \".UTF-8\" );\n    unix_cp = CP_UTF8;  /* default to utf-8 even if we don't get a valid locale */\n    setenv( \"LANG\", user_locale, 0 );\n    // TRACE( \"setting locale to '%s'\\n\", user_locale );\n\n    /* We still want to set the retrieve the preferred language as chosen in\n       System Preferences.app, because it can differ from CFLocaleCopyCurrent().\n    */\n    all_locales = CFLocaleCopyAvailableLocaleIdentifiers();\n    preferred_locales = CFBundleCopyLocalizationsForPreferences( all_locales, NULL );\n    if (preferred_locales && CFArrayGetCount( preferred_locales ))\n        user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 );\n    CFRelease( all_locales );\n#endif /* __APPLE__ */\n\n    // FIXME setlocale( LC_ALL, \"\" );\n\n    unix_cp = setup_unix_locales();\n    if (!lcid_LC_MESSAGES) lcid_LC_MESSAGES = lcid_LC_CTYPE;\n#if 0\n#ifdef __APPLE__\n    /* Override lcid_LC_MESSAGES with user_language if LC_MESSAGES is set to default */\n    if (lcid_LC_MESSAGES == lcid_LC_CTYPE && user_language_string_ref)\n    {\n        struct locale_name locale_name;\n        WCHAR buffer[128];\n        CFStringGetCString( user_language_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );\n        strcpynAtoW( buffer, user_locale, sizeof(buffer)/sizeof(WCHAR) );\n        parse_locale_name( buffer, &locale_name );\n        lcid_LC_MESSAGES = locale_name.lcid;\n        TRACE( \"setting lcid_LC_MESSAGES to '%s'\\n\", user_locale );\n    }\n    if (preferred_locales)\n        CFRelease( preferred_locales );\n#endif\n\n    NtSetDefaultUILanguage( LANGIDFROMLCID(lcid_LC_MESSAGES) );\n    NtSetDefaultLocale( TRUE, lcid_LC_MESSAGES );\n    NtSetDefaultLocale( FALSE, lcid_LC_CTYPE );\n\n    ansi_cp = get_lcid_codepage( LOCALE_USER_DEFAULT );\n    GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTMACCODEPAGE | LOCALE_RETURN_NUMBER,\n                    (LPWSTR)&mac_cp, sizeof(mac_cp)/sizeof(WCHAR) );\n    GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTCODEPAGE | LOCALE_RETURN_NUMBER,\n                    (LPWSTR)&oem_cp, sizeof(oem_cp)/sizeof(WCHAR) );\n    if (!unix_cp)\n        GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTUNIXCODEPAGE | LOCALE_RETURN_NUMBER,\n                        (LPWSTR)&unix_cp, sizeof(unix_cp)/sizeof(WCHAR) );\n\n    if (!(ansi_cptable = wine_cp_get_table( ansi_cp )))\n        ansi_cptable = wine_cp_get_table( 1252 );\n    if (!(oem_cptable = wine_cp_get_table( oem_cp )))\n        oem_cptable  = wine_cp_get_table( 437 );\n    if (!(mac_cptable = wine_cp_get_table( mac_cp )))\n        mac_cptable  = wine_cp_get_table( 10000 );\n    if (unix_cp != CP_UTF8)\n    {\n        if (!(unix_cptable = wine_cp_get_table( unix_cp )))\n            unix_cptable  = wine_cp_get_table( 28591 );\n    }\n\n    __wine_init_codepages( ansi_cptable, oem_cptable, unix_cptable );\n\n    TRACE( \"ansi=%03d oem=%03d mac=%03d unix=%03d\\n\",\n           ansi_cptable->info.codepage, oem_cptable->info.codepage,\n           mac_cptable->info.codepage, unix_cp );\n\n    setlocale(LC_NUMERIC, \"C\");  /* FIXME: oleaut32 depends on this */\n#endif\n}\n\nLANGID GetUserDefaultLangID(void)\n{\n    // return LANGIDFROMLCID(GetUserDefaultLCID());\n    if (lcid_LC_MESSAGES == 0) LOCALE_Init();\n    return LANGIDFROMLCID(lcid_LC_MESSAGES);\n}\n\nLANGID GetSystemDefaultLangID(void)\n{\n    // return LANGIDFROMLCID(GetSystemDefaultLCID());\n    if (lcid_LC_MESSAGES == 0) LOCALE_Init();\n    return LANGIDFROMLCID(lcid_LC_MESSAGES);\n}\n\n#ifdef TEST\nint main()\n{\n\tLANGID langID;\n\tWORD primLang;\n\tWORD subLang;\n\n\tsetlocale( LC_ALL, \"\" );\n\n\tlangID = GetUserDefaultLangID();\n\tprintf(\"langID=0x%x\\n\",langID);\n\n\tprimLang = (WORD)(PRIMARYLANGID(langID));\n\tsubLang = (WORD)(SUBLANGID(langID));\n\n\tprintf(\"primLang=%d subLang=%d\\n\",(unsigned)primLang,(unsigned)subLang);\n\n\treturn 0;\n}\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/CPP/myWindows/wine_date_and_time.cpp",
    "content": "/*\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n *\n */\n#include \"config.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <sys/time.h> /* gettimeofday */\n#include <dirent.h>\n#include <unistd.h>\n#include <time.h>\n\n#include <windows.h>\n\n// #define TRACEN(u) u;\n#define TRACEN(u)  /* */\n\ntypedef LONG NTSTATUS;\n#define STATUS_SUCCESS                   0x00000000\n\n#define TICKSPERSEC        10000000\n#define TICKSPERMSEC       10000\n#define SECSPERDAY         86400\n#define SECSPERHOUR        3600\n#define SECSPERMIN         60\n#define MINSPERHOUR        60\n#define HOURSPERDAY        24\n#define EPOCHWEEKDAY       1  /* Jan 1, 1601 was Monday */\n#define DAYSPERWEEK        7\n#define EPOCHYEAR          1601\n#define DAYSPERNORMALYEAR  365\n#define DAYSPERLEAPYEAR    366\n#define MONSPERYEAR        12\n#define DAYSPERQUADRICENTENNIUM (365 * 400 + 97)\n#define DAYSPERNORMALCENTURY (365 * 100 + 24)\n#define DAYSPERNORMALQUADRENNIUM (365 * 4 + 1)\n\n/* 1601 to 1970 is 369 years plus 89 leap days */\n#define SECS_1601_TO_1970  ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY)\n#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC)\n/* 1601 to 1980 is 379 years plus 91 leap days */\n#define SECS_1601_TO_1980  ((379 * 365 + 91) * (ULONGLONG)SECSPERDAY)\n#define TICKS_1601_TO_1980 (SECS_1601_TO_1980 * TICKSPERSEC)\ntypedef short CSHORT;\n\nstatic LONG TIME_GetBias() {\n  time_t utc = time(NULL);\n  struct tm *ptm = localtime(&utc);\n  int localdaylight = ptm->tm_isdst; /* daylight for local timezone */\n  ptm = gmtime(&utc);\n  ptm->tm_isdst = localdaylight; /* use local daylight, not that of Greenwich */\n  LONG bias = (int)(mktime(ptm)-utc);\n  TRACEN((printf(\"TIME_GetBias %ld\\n\",(long)bias)))\n  return bias;\n}\n\nstatic inline void RtlSystemTimeToLocalTime( const LARGE_INTEGER *SystemTime,\n                                      LARGE_INTEGER *LocalTime ) {\n  LONG bias = TIME_GetBias();\n  LocalTime->QuadPart = SystemTime->QuadPart - bias * (LONGLONG)TICKSPERSEC;\n}\n\nvoid WINAPI RtlSecondsSince1970ToFileTime( DWORD Seconds, FILETIME * ft ) {\n  ULONGLONG secs = Seconds * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970;\n  ft->dwLowDateTime  = (DWORD)secs;\n  ft->dwHighDateTime = (DWORD)(secs >> 32);\n  TRACEN((printf(\"RtlSecondsSince1970ToFileTime %lx => %lx %lx\\n\",(long)Seconds,(long)ft->dwHighDateTime,(long)ft->dwLowDateTime)))\n}\n\n/*\nvoid WINAPI RtlSecondsSince1970ToTime( DWORD Seconds, LARGE_INTEGER *Time )\n{\n  ULONGLONG secs = Seconds * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970;\n  // Time->u.LowPart  = (DWORD)secs;  Time->u.HighPart = (DWORD)(secs >> 32);\n  Time->QuadPart = secs;\n}\n*/\n\n\nBOOL WINAPI DosDateTimeToFileTime( WORD fatdate, WORD fattime, FILETIME * ft) {\n  struct tm newtm;\n\n  TRACEN((printf(\"DosDateTimeToFileTime\\n\")))\n  // memset(&newtm,0,sizeof(newtm));\n  newtm.tm_sec  = (fattime & 0x1f) * 2;\n  newtm.tm_min  = (fattime >> 5) & 0x3f;\n  newtm.tm_hour = (fattime >> 11);\n  newtm.tm_mday = (fatdate & 0x1f);\n  newtm.tm_mon  = ((fatdate >> 5) & 0x0f) - 1;\n  newtm.tm_year = (fatdate >> 9) + 80;\n  newtm.tm_isdst = -1;\n\n  time_t time1 = mktime(&newtm);\n  LONG   bias  = TIME_GetBias();\n  RtlSecondsSince1970ToFileTime( time1 - bias, ft );\n\n  TRACEN((printf(\"DosDateTimeToFileTime(%d,%d) t1=%ld bias=%ld => %lx %lx\\n\",\n\t(long)fatdate,(long)fattime,(long)time1,(long)bias,\n\t(long)ft->dwHighDateTime,(long)ft->dwLowDateTime)))\n\n  return TRUE;\n}\n\nBOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *Time, DWORD *Seconds ) {\n  ULONGLONG tmp = Time->QuadPart;\n  TRACEN((printf(\"RtlTimeToSecondsSince1970-1 %llx\\n\",tmp)))\n  tmp /= TICKSPERSEC;\n  tmp -= SECS_1601_TO_1970;\n  TRACEN((printf(\"RtlTimeToSecondsSince1970-2 %llx\\n\",tmp)))\n  if (tmp > 0xffffffff) return FALSE;\n  *Seconds = (DWORD)tmp;\n  return TRUE;\n}\n\nBOOL WINAPI FileTimeToDosDateTime( const FILETIME *ft, WORD *fatdate, WORD *fattime ) {\n  LARGE_INTEGER       li;\n  ULONG               t;\n  time_t              unixtime;\n  struct tm*          tm;\n  WORD fat_d,fat_t;\n\n  TRACEN((printf(\"FileTimeToDosDateTime\\n\")))\n  li.QuadPart = ft->dwHighDateTime;\n  li.QuadPart = (li.QuadPart << 32) | ft->dwLowDateTime;\n  RtlTimeToSecondsSince1970( &li, &t );\n  unixtime = t - TIME_GetBias();\n  tm = gmtime( &unixtime );\n\n  fat_t = (tm->tm_hour << 11) + (tm->tm_min << 5) + (tm->tm_sec / 2);\n  fat_d = ((tm->tm_year - 80) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday;\n  if (fattime)\n    *fattime = fat_t;\n  if (fatdate)\n    *fatdate = fat_d;\n\n  TRACEN((printf(\"FileTimeToDosDateTime : %lx %lx => %d %d\\n\",\n\t(long)ft->dwHighDateTime,(long)ft->dwLowDateTime,(unsigned)fat_d,(unsigned)fat_t)))\n\n  return TRUE;\n}\n\nBOOL WINAPI FileTimeToLocalFileTime( const FILETIME *utcft, FILETIME * localft ) {\n  LARGE_INTEGER local, utc;\n\n  TRACEN((printf(\"FileTimeToLocalFileTime\\n\")))\n  utc.QuadPart = utcft->dwHighDateTime;\n  utc.QuadPart = (utc.QuadPart << 32) | utcft->dwLowDateTime;\n  RtlSystemTimeToLocalTime( &utc, &local );\n  localft->dwLowDateTime = (DWORD)local.QuadPart;\n  localft->dwHighDateTime = (DWORD)(local.QuadPart >> 32);\n\n  return TRUE;\n}\n\ntypedef struct _TIME_FIELDS {\n  CSHORT Year;\n  CSHORT Month;\n  CSHORT Day;\n  CSHORT Hour;\n  CSHORT Minute;\n  CSHORT Second;\n  CSHORT Milliseconds;\n  CSHORT Weekday;\n} TIME_FIELDS;\n\nstatic const int MonthLengths[2][MONSPERYEAR] =\n{\n   { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },\n   { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }\n};\n\nstatic inline int IsLeapYear(int Year) {\n  return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 1 : 0;\n}\n\nstatic inline VOID WINAPI RtlTimeToTimeFields(\n  const LARGE_INTEGER *liTime,\n  TIME_FIELDS * TimeFields) {\n\tint SecondsInDay;\n        long int cleaps, years, yearday, months;\n\tlong int Days;\n\tLONGLONG Time;\n\n\t/* Extract millisecond from time and convert time into seconds */\n\tTimeFields->Milliseconds =\n            (CSHORT) (( liTime->QuadPart % TICKSPERSEC) / TICKSPERMSEC);\n\tTime = liTime->QuadPart / TICKSPERSEC;\n\n\t/* The native version of RtlTimeToTimeFields does not take leap seconds\n\t * into account */\n\n\t/* Split the time into days and seconds within the day */\n\tDays = Time / SECSPERDAY;\n\tSecondsInDay = Time % SECSPERDAY;\n\n\t/* compute time of day */\n\tTimeFields->Hour = (CSHORT) (SecondsInDay / SECSPERHOUR);\n\tSecondsInDay = SecondsInDay % SECSPERHOUR;\n\tTimeFields->Minute = (CSHORT) (SecondsInDay / SECSPERMIN);\n\tTimeFields->Second = (CSHORT) (SecondsInDay % SECSPERMIN);\n\n\t/* compute day of week */\n\tTimeFields->Weekday = (CSHORT) ((EPOCHWEEKDAY + Days) % DAYSPERWEEK);\n\n        /* compute year, month and day of month. */\n        cleaps=( 3 * ((4 * Days + 1227) / DAYSPERQUADRICENTENNIUM) + 3 ) / 4;\n        Days += 28188 + cleaps;\n        years = (20 * Days - 2442) / (5 * DAYSPERNORMALQUADRENNIUM);\n        yearday = Days - (years * DAYSPERNORMALQUADRENNIUM)/4;\n        months = (64 * yearday) / 1959;\n        /* the result is based on a year starting on March.\n         * To convert take 12 from Januari and Februari and\n         * increase the year by one. */\n        if( months < 14 ) {\n            TimeFields->Month = months - 1;\n            TimeFields->Year = years + 1524;\n        } else {\n            TimeFields->Month = months - 13;\n            TimeFields->Year = years + 1525;\n        }\n        /* calculation of day of month is based on the wonderful\n         * sequence of INT( n * 30.6): it reproduces the \n         * 31-30-31-30-31-31 month lengths exactly for small n's */\n        TimeFields->Day = yearday - (1959 * months) / 64 ;\n}\n\n\nBOOL WINAPI FileTimeToSystemTime( const FILETIME *ft, SYSTEMTIME * syst ) {\n  TIME_FIELDS tf;\n  LARGE_INTEGER t;\n\n  TRACEN((printf(\"FileTimeToSystemTime\\n\")))\n  t.QuadPart = ft->dwHighDateTime;\n  t.QuadPart = (t.QuadPart << 32) | ft->dwLowDateTime;\n  RtlTimeToTimeFields(&t, &tf);\n\n  syst->wYear = tf.Year;\n  syst->wMonth = tf.Month;\n  syst->wDay = tf.Day;\n  syst->wHour = tf.Hour;\n  syst->wMinute = tf.Minute;\n  syst->wSecond = tf.Second;\n  syst->wMilliseconds = tf.Milliseconds;\n  syst->wDayOfWeek = tf.Weekday;\n  return TRUE;\n}\n\n\nstatic inline NTSTATUS WINAPI RtlLocalTimeToSystemTime( const LARGE_INTEGER *LocalTime,\n    LARGE_INTEGER *SystemTime) {\n\n  TRACEN((printf(\"RtlLocalTimeToSystemTime\\n\")))\n  LONG bias = TIME_GetBias();\n  SystemTime->QuadPart = LocalTime->QuadPart + bias * (LONGLONG)TICKSPERSEC;\n  return STATUS_SUCCESS;\n}\n\nBOOL WINAPI LocalFileTimeToFileTime( const FILETIME *localft, FILETIME * utcft ) {\n  LARGE_INTEGER local, utc;\n\n  TRACEN((printf(\"LocalFileTimeToFileTime\\n\")))\n  local.QuadPart = localft->dwHighDateTime;\n  local.QuadPart = (local.QuadPart << 32) | localft->dwLowDateTime;\n  RtlLocalTimeToSystemTime( &local, &utc );\n  utcft->dwLowDateTime = (DWORD)utc.QuadPart;\n  utcft->dwHighDateTime = (DWORD)(utc.QuadPart >> 32);\n\n  return TRUE;\n}\n\n/*********************************************************************\n *      GetSystemTime                                   (KERNEL32.@)\n *\n * Get the current system time.\n *\n * RETURNS\n *  Nothing.\n */\nVOID WINAPI GetSystemTime(SYSTEMTIME * systime) /* [O] Destination for current time */\n{\n  FILETIME ft;\n  LARGE_INTEGER t;\n\n  TRACEN((printf(\"GetSystemTime\\n\")))\n\n  struct timeval now;\n  gettimeofday( &now, 0 );\n  t.QuadPart  = now.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970;\n  t.QuadPart += now.tv_usec * 10;\n\n  ft.dwLowDateTime  = (DWORD)(t.QuadPart);\n  ft.dwHighDateTime = (DWORD)(t.QuadPart >> 32);\n  FileTimeToSystemTime(&ft, systime);\n}\n\n/******************************************************************************\n *       RtlTimeFieldsToTime [NTDLL.@]\n *\n * Convert a TIME_FIELDS structure into a time.\n *\n * PARAMS\n *   ftTimeFields [I] TIME_FIELDS structure to convert.\n *   Time         [O] Destination for the converted time.\n *\n * RETURNS\n *   Success: TRUE.\n *   Failure: FALSE.\n */\nstatic BOOLEAN WINAPI RtlTimeFieldsToTime(\n  TIME_FIELDS * tfTimeFields,\n  LARGE_INTEGER *Time)\n{\n  int month, year, cleaps, day;\n\n  TRACEN((printf(\"RtlTimeFieldsToTime\\n\")))\n\n\t/* FIXME: normalize the TIME_FIELDS structure here */\n        /* No, native just returns 0 (error) if the fields are not */\n        if( tfTimeFields->Milliseconds< 0 || tfTimeFields->Milliseconds > 999 ||\n                tfTimeFields->Second < 0 || tfTimeFields->Second > 59 ||\n                tfTimeFields->Minute < 0 || tfTimeFields->Minute > 59 ||\n                tfTimeFields->Hour < 0 || tfTimeFields->Hour > 23 ||\n                tfTimeFields->Month < 1 || tfTimeFields->Month > 12 ||\n                tfTimeFields->Day < 1 ||\n                tfTimeFields->Day > MonthLengths\n                    [ tfTimeFields->Month ==2 || IsLeapYear(tfTimeFields->Year)]\n                    [ tfTimeFields->Month - 1] ||\n                tfTimeFields->Year < 1601 )\n            return FALSE;\n\n        /* now calculate a day count from the date\n         * First start counting years from March. This way the leap days\n         * are added at the end of the year, not somewhere in the middle.\n         * Formula's become so much less complicate that way.\n         * To convert: add 12 to the month numbers of Jan and Feb, and \n         * take 1 from the year */\n        if(tfTimeFields->Month < 3) {\n            month = tfTimeFields->Month + 13;\n            year = tfTimeFields->Year - 1;\n        } else {\n            month = tfTimeFields->Month + 1;\n            year = tfTimeFields->Year;\n        }\n        cleaps = (3 * (year / 100) + 3) / 4;   /* nr of \"century leap years\"*/\n        day =  (36525 * year) / 100 - cleaps + /* year * dayperyr, corrected */\n                 (1959 * month) / 64 +         /* months * daypermonth */\n                 tfTimeFields->Day -          /* day of the month */\n                 584817 ;                      /* zero that on 1601-01-01 */\n        /* done */\n        \n        Time->QuadPart = (((((LONGLONG) day * HOURSPERDAY +\n            tfTimeFields->Hour) * MINSPERHOUR +\n            tfTimeFields->Minute) * SECSPERMIN +\n            tfTimeFields->Second ) * 1000 +\n            tfTimeFields->Milliseconds ) * TICKSPERMSEC;\n\n        return TRUE;\n}\n\n/*********************************************************************\n *      SystemTimeToFileTime                            (KERNEL32.@)\n */\nBOOL WINAPI SystemTimeToFileTime( const SYSTEMTIME *syst, FILETIME * ft ) {\n  TIME_FIELDS tf;\n  LARGE_INTEGER t;\n\n  TRACEN((printf(\"SystemTimeToFileTime\\n\")))\n\n  tf.Year = syst->wYear;\n  tf.Month = syst->wMonth;\n  tf.Day = syst->wDay;\n  tf.Hour = syst->wHour;\n  tf.Minute = syst->wMinute;\n  tf.Second = syst->wSecond;\n  tf.Milliseconds = syst->wMilliseconds;\n\n  RtlTimeFieldsToTime(&tf, &t);\n  ft->dwLowDateTime = (DWORD)t.QuadPart;\n  ft->dwHighDateTime = (DWORD)(t.QuadPart>>32);\n  return TRUE;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/7zC.txt",
    "content": "7z ANSI-C Decoder 4.62\n----------------------\n\n7z ANSI-C provides 7z/LZMA decoding.\n7z ANSI-C version is simplified version ported from C++ code.\n\nLZMA is default and general compression method of 7z format\nin 7-Zip compression program (www.7-zip.org). LZMA provides high \ncompression ratio and very fast decompression.\n\n\nLICENSE\n-------\n\n7z ANSI-C Decoder is part of the LZMA SDK.\nLZMA SDK is written and placed in the public domain by Igor Pavlov.\n\nFiles\n---------------------\n\n7zDecode.*   - Low level 7z decoding\n7zExtract.*  - High level 7z decoding\n7zHeader.*   - .7z format constants\n7zIn.*       - .7z archive opening\n7zItem.*     - .7z structures\n7zMain.c     - Test application\n\n\nHow To Use\n----------\n\nYou must download 7-Zip program from www.7-zip.org.\n\nYou can create .7z archive with 7z.exe or 7za.exe:\n\n  7za.exe a archive.7z *.htm -r -mx -m0fb=255\n\nIf you have big number of files in archive, and you need fast extracting, \nyou can use partly-solid archives:\n  \n  7za.exe a archive.7z *.htm -ms=512K -r -mx -m0fb=255 -m0d=512K\n\nIn that example 7-Zip will use 512KB solid blocks. So it needs to decompress only \n512KB for extracting one file from such archive.\n\n\nLimitations of current version of 7z ANSI-C Decoder\n---------------------------------------------------\n\n - It reads only \"FileName\", \"Size\", \"LastWriteTime\" and \"CRC\" information for each file in archive.\n - It supports only LZMA and Copy (no compression) methods with BCJ or BCJ2 filters.\n - It converts original UTF-16 Unicode file names to UTF-8 Unicode file names.\n \nThese limitations will be fixed in future versions.\n\n\nUsing 7z ANSI-C Decoder Test application:\n-----------------------------------------\n\nUsage: 7zDec <command> <archive_name>\n\n<Command>:\n  e: Extract files from archive\n  l: List contents of archive\n  t: Test integrity of archive\n\nExample: \n\n  7zDec l archive.7z\n\nlists contents of archive.7z\n\n  7zDec e archive.7z\n\nextracts files from archive.7z to current folder.\n\n\nHow to use .7z Decoder\n----------------------\n\nMemory allocation\n~~~~~~~~~~~~~~~~~\n\n7z Decoder uses two memory pools:\n1) Temporary pool\n2) Main pool\nSuch scheme can allow you to avoid fragmentation of allocated blocks.\n\n\nSteps for using 7z decoder\n--------------------------\n\nUse code at 7zMain.c as example.\n\n1) Declare variables:\n  inStream                 /* implements ILookInStream interface */\n  CSzArEx db;              /* 7z archive database structure */\n  ISzAlloc allocImp;       /* memory functions for main pool */\n  ISzAlloc allocTempImp;   /* memory functions for temporary pool */\n\n2) call CrcGenerateTable(); function to initialize CRC structures.\n\n3) call SzArEx_Init(&db); function to initialize db structures.\n\n4) call SzArEx_Open(&db, inStream, &allocMain, &allocTemp) to open archive\n\nThis function opens archive \"inStream\" and reads headers to \"db\".\nAll items in \"db\" will be allocated with \"allocMain\" functions.\nSzArEx_Open function allocates and frees temporary structures by \"allocTemp\" functions.\n\n5) List items or Extract items\n\n  Listing code:\n  ~~~~~~~~~~~~~\n    {\n      UInt32 i;\n      for (i = 0; i < db.db.NumFiles; i++)\n      {\n        CFileItem *f = db.db.Files + i;\n        printf(\"%10d  %s\\n\", (int)f->Size, f->Name);\n      }\n    }\n\n  Extracting code:\n  ~~~~~~~~~~~~~~~~\n\n  SZ_RESULT SzAr_Extract(\n    CArchiveDatabaseEx *db,\n    ILookInStream *inStream, \n    UInt32 fileIndex,         /* index of file */\n    UInt32 *blockIndex,       /* index of solid block */\n    Byte **outBuffer,         /* pointer to pointer to output buffer (allocated with allocMain) */\n    size_t *outBufferSize,    /* buffer size for output buffer */\n    size_t *offset,           /* offset of stream for required file in *outBuffer */\n    size_t *outSizeProcessed, /* size of file in *outBuffer */\n    ISzAlloc *allocMain,\n    ISzAlloc *allocTemp);\n\n  If you need to decompress more than one file, you can send these values from previous call:\n    blockIndex, \n    outBuffer, \n    outBufferSize,\n  You can consider \"outBuffer\" as cache of solid block. If your archive is solid, \n  it will increase decompression speed.\n\n  After decompressing you must free \"outBuffer\":\n  allocImp.Free(outBuffer);\n\n6) call SzArEx_Free(&db, allocImp.Free) to free allocated items in \"db\".\n\n\n\n\nMemory requirements for .7z decoding \n------------------------------------\n\nMemory usage for Archive opening:\n  - Temporary pool:\n     - Memory for uncompressed .7z headers\n     - some other temporary blocks\n  - Main pool:\n     - Memory for database: \n       Estimated size of one file structures in solid archive:\n         - Size (4 or 8 Bytes)\n         - CRC32 (4 bytes)\n         - LastWriteTime (8 bytes)\n         - Some file information (4 bytes)\n         - File Name (variable length) + pointer + allocation structures\n\nMemory usage for archive Decompressing:\n  - Temporary pool:\n     - Memory for LZMA decompressing structures\n  - Main pool:\n     - Memory for decompressed solid block\n     - Memory for temprorary buffers, if BCJ2 fileter is used. Usually these \n       temprorary buffers can be about 15% of solid block size. \n  \n\n7z Decoder doesn't allocate memory for compressed blocks. \nInstead of this, you must allocate buffer with desired \nsize before calling 7z Decoder. Use 7zMain.c as example.\n\n\nDefines\n-------\n\n_SZ_ALLOC_DEBUG   - define it if you want to debug alloc/free operations to stderr.\n\n\n---\n\nhttp://www.7-zip.org\nhttp://www.7-zip.org/sdk.html\nhttp://www.7-zip.org/support.html\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/7zFormat.txt",
    "content": "7z Format description (4.59)\n----------------------------\n\nThis file contains description of 7z archive format. \n7z archive can contain files compressed with any method.\nSee \"Methods.txt\" for description for defined compressing methods.\n\n\nFormat structure Overview\n-------------------------\n\nSome fields can be optional.\n\nArchive structure\n~~~~~~~~~~~~~~~~~  \nSignatureHeader\n[PackedStreams]\n[PackedStreamsForHeaders]\n[\n  Header \n  or \n  {\n    Packed Header\n    HeaderInfo\n  }\n]\n\n\n\nHeader structure\n~~~~~~~~~~~~~~~~  \n{\n  ArchiveProperties\n  AdditionalStreams\n  {\n    PackInfo\n    {\n      PackPos\n      NumPackStreams\n      Sizes[NumPackStreams]\n      CRCs[NumPackStreams]\n    }\n    CodersInfo\n    {\n      NumFolders\n      Folders[NumFolders]\n      {\n        NumCoders\n        CodersInfo[NumCoders]\n        {\n          ID\n          NumInStreams;\n          NumOutStreams;\n          PropertiesSize\n          Properties[PropertiesSize]\n        }\n        NumBindPairs\n        BindPairsInfo[NumBindPairs]\n        {\n          InIndex;\n          OutIndex;\n        }\n        PackedIndices\n      }\n      UnPackSize[Folders][Folders.NumOutstreams]\n      CRCs[NumFolders]\n    }\n    SubStreamsInfo\n    {\n      NumUnPackStreamsInFolders[NumFolders];\n      UnPackSizes[]\n      CRCs[]\n    }\n  }\n  MainStreamsInfo\n  {\n    (Same as in AdditionalStreams)\n  }\n  FilesInfo\n  {\n    NumFiles\n    Properties[]\n    {\n      ID\n      Size\n      Data\n    }\n  }\n}\n\nHeaderInfo structure\n~~~~~~~~~~~~~~~~~~~~\n{\n  (Same as in AdditionalStreams)\n}\n\n\n\nNotes about Notation and encoding\n---------------------------------\n\n7z uses little endian encoding.\n\n7z archive format has optional headers that are marked as\n[]\nHeader\n[]\n\nREAL_UINT64 means real UINT64.\n\nUINT64 means real UINT64 encoded with the following scheme:\n\n  Size of encoding sequence depends from first byte:\n  First_Byte  Extra_Bytes        Value\n  (binary)   \n  0xxxxxxx               : ( xxxxxxx           )\n  10xxxxxx    BYTE y[1]  : (  xxxxxx << (8 * 1)) + y\n  110xxxxx    BYTE y[2]  : (   xxxxx << (8 * 2)) + y\n  ...\n  1111110x    BYTE y[6]  : (       x << (8 * 6)) + y\n  11111110    BYTE y[7]  :                         y\n  11111111    BYTE y[8]  :                         y\n\n\n\nProperty IDs\n------------\n\n0x00 = kEnd\n\n0x01 = kHeader\n\n0x02 = kArchiveProperties\n    \n0x03 = kAdditionalStreamsInfo\n0x04 = kMainStreamsInfo\n0x05 = kFilesInfo\n    \n0x06 = kPackInfo\n0x07 = kUnPackInfo\n0x08 = kSubStreamsInfo\n\n0x09 = kSize\n0x0A = kCRC\n\n0x0B = kFolder\n\n0x0C = kCodersUnPackSize\n0x0D = kNumUnPackStream\n\n0x0E = kEmptyStream\n0x0F = kEmptyFile\n0x10 = kAnti\n\n0x11 = kName\n0x12 = kCTime\n0x13 = kATime\n0x14 = kMTime\n0x15 = kWinAttributes\n0x16 = kComment\n\n0x17 = kEncodedHeader\n\n0x18 = kStartPos\n0x19 = kDummy\n\n\n7z format headers\n-----------------\n\nSignatureHeader\n~~~~~~~~~~~~~~~\n  BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};\n\n  ArchiveVersion\n  {\n    BYTE Major;   // now = 0\n    BYTE Minor;   // now = 2\n  };\n\n  UINT32 StartHeaderCRC;\n\n  StartHeader\n  {\n    REAL_UINT64 NextHeaderOffset\n    REAL_UINT64 NextHeaderSize\n    UINT32 NextHeaderCRC\n  }\n\n\n...........................\n\n\nArchiveProperties\n~~~~~~~~~~~~~~~~~\nBYTE NID::kArchiveProperties (0x02)\nfor (;;)\n{\n  BYTE PropertyType;\n  if (aType == 0)\n    break;\n  UINT64 PropertySize;\n  BYTE PropertyData[PropertySize];\n}\n\n\nDigests (NumStreams)\n~~~~~~~~~~~~~~~~~~~~~\n  BYTE AllAreDefined\n  if (AllAreDefined == 0)\n  {\n    for(NumStreams)\n      BIT Defined\n  }\n  UINT32 CRCs[NumDefined]\n\n\nPackInfo\n~~~~~~~~~~~~\n  BYTE NID::kPackInfo  (0x06)\n  UINT64 PackPos\n  UINT64 NumPackStreams\n\n  []\n  BYTE NID::kSize    (0x09)\n  UINT64 PackSizes[NumPackStreams]\n  []\n\n  []\n  BYTE NID::kCRC      (0x0A)\n  PackStreamDigests[NumPackStreams]\n  []\n\n  BYTE NID::kEnd\n\n\nFolder\n~~~~~~\n  UINT64 NumCoders;\n  for (NumCoders)\n  {\n    BYTE \n    {\n      0:3 CodecIdSize\n      4:  Is Complex Coder\n      5:  There Are Attributes\n      6:  Reserved\n      7:  There are more alternative methods. (Not used anymore, must be 0).\n    } \n    BYTE CodecId[CodecIdSize]\n    if (Is Complex Coder)\n    {\n      UINT64 NumInStreams;\n      UINT64 NumOutStreams;\n    }\n    if (There Are Attributes)\n    {\n      UINT64 PropertiesSize\n      BYTE Properties[PropertiesSize]\n    }\n  }\n    \n  NumBindPairs = NumOutStreamsTotal - 1;\n\n  for (NumBindPairs)\n  {\n    UINT64 InIndex;\n    UINT64 OutIndex;\n  }\n\n  NumPackedStreams = NumInStreamsTotal - NumBindPairs;\n  if (NumPackedStreams > 1)\n    for(NumPackedStreams)\n    {\n      UINT64 Index;\n    };\n\n\n\n\nCoders Info\n~~~~~~~~~~~\n\n  BYTE NID::kUnPackInfo  (0x07)\n\n\n  BYTE NID::kFolder  (0x0B)\n  UINT64 NumFolders\n  BYTE External\n  switch(External)\n  {\n    case 0:\n      Folders[NumFolders]\n    case 1:\n      UINT64 DataStreamIndex\n  }\n\n\n  BYTE ID::kCodersUnPackSize  (0x0C)\n  for(Folders)\n    for(Folder.NumOutStreams)\n     UINT64 UnPackSize;\n\n\n  []\n  BYTE NID::kCRC   (0x0A)\n  UnPackDigests[NumFolders]\n  []\n\n  \n\n  BYTE NID::kEnd\n\n\n\nSubStreams Info\n~~~~~~~~~~~~~~\n  BYTE NID::kSubStreamsInfo; (0x08)\n\n  []\n  BYTE NID::kNumUnPackStream; (0x0D)\n  UINT64 NumUnPackStreamsInFolders[NumFolders];\n  []\n\n\n  []\n  BYTE NID::kSize  (0x09)\n  UINT64 UnPackSizes[]\n  []\n\n\n  []\n  BYTE NID::kCRC  (0x0A)\n  Digests[Number of streams with unknown CRC]\n  []\n\n  \n  BYTE NID::kEnd\n\n\nStreams Info\n~~~~~~~~~~~~\n\n  []\n  PackInfo\n  []\n\n\n  []\n  CodersInfo\n  []\n\n\n  []\n  SubStreamsInfo\n  []\n\n  BYTE NID::kEnd\n\n\nFilesInfo\n~~~~~~~~~\n  BYTE NID::kFilesInfo;  (0x05)\n  UINT64 NumFiles\n\n  for (;;)\n  {\n    BYTE PropertyType;\n    if (aType == 0)\n      break;\n\n    UINT64 Size;\n\n    switch(PropertyType)\n    {\n      kEmptyStream:   (0x0E)\n        for(NumFiles)\n          BIT IsEmptyStream\n\n      kEmptyFile:     (0x0F)\n        for(EmptyStreams)\n          BIT IsEmptyFile\n\n      kAnti:          (0x10)\n        for(EmptyStreams)\n          BIT IsAntiFile\n      \n      case kCTime: (0x12)\n      case kATime: (0x13)\n      case kMTime: (0x14)\n        BYTE AllAreDefined\n        if (AllAreDefined == 0)\n        {\n          for(NumFiles)\n            BIT TimeDefined\n        }\n        BYTE External;\n        if(External != 0)\n          UINT64 DataIndex\n        []\n        for(Definded Items)\n          UINT32 Time\n        []\n      \n      kNames:     (0x11)\n        BYTE External;\n        if(External != 0)\n          UINT64 DataIndex\n        []\n        for(Files)\n        {\n          wchar_t Names[NameSize];\n          wchar_t 0;\n        }\n        []\n\n      kAttributes:  (0x15)\n        BYTE AllAreDefined\n        if (AllAreDefined == 0)\n        {\n          for(NumFiles)\n            BIT AttributesAreDefined\n        }\n        BYTE External;\n        if(External != 0)\n          UINT64 DataIndex\n        []\n        for(Definded Attributes)\n          UINT32 Attributes\n        []\n    }\n  }\n\n\nHeader\n~~~~~~\n  BYTE NID::kHeader (0x01)\n\n  []\n  ArchiveProperties\n  []\n\n  []\n  BYTE NID::kAdditionalStreamsInfo; (0x03)\n  StreamsInfo\n  []\n\n  []\n  BYTE NID::kMainStreamsInfo;    (0x04)\n  StreamsInfo\n  []\n\n  []\n  FilesInfo\n  []\n\n  BYTE NID::kEnd\n\n\nHeaderInfo\n~~~~~~~~~~\n  []\n  BYTE NID::kEncodedHeader; (0x17)\n  StreamsInfo for Encoded Header\n  []\n\n\n---\nEnd of document\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/License.txt",
    "content": "  7-Zip source code\n  ~~~~~~~~~~~~~~~~~\n  License for use and distribution\n  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n  7-Zip Copyright (C) 1999-2009 Igor Pavlov.\n\n  Licenses for files are:\n\n    1) CPP/7zip/Compress/Rar files:  GNU LGPL + unRAR restriction\n    2) All other files:  GNU LGPL\n\n  The GNU LGPL + unRAR restriction means that you must follow both \n  GNU LGPL rules and unRAR restriction rules.\n\n\n  GNU LGPL information\n  --------------------\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n\n  unRAR restriction\n  -----------------\n\n    The decompression engine for RAR archives was developed using source \n    code of unRAR program.\n    All copyrights to original unRAR code are owned by Alexander Roshal.\n\n    The license for original unRAR code has the following restriction:\n\n    The unRAR sources cannot be used to re-create the RAR compression algorithm, \n    which is proprietary. Distribution of modified unRAR sources in separate form \n    or as a part of other software is permitted, provided that it is clearly\n    stated in the documentation and source comments that the code may\n    not be used to develop a RAR (WinRAR) compatible archiver.\n\n\n  --\n  Igor Pavlov\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/add.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>a (Add) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>a (Add) command</H1>\n\n<P>Adds files to archive.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a archive1.zip subdir\\\n</PRE>\n\n<P>adds all files and subfolders from folder <SPAN class=\"filename\">subdir</SPAN> to archive\n  <SPAN class=\"filename\">archive1.zip</SPAN>. \n  The filenames in archive will contain <SPAN class=\"filename\">subdir\\</SPAN> prefix.</P>\n\n<PRE class=\"example\">\n7z a archive2.zip .\\subdir\\*\n</PRE>\n\n<P>adds all files and subfolders from folder <SPAN class=\"filename\">subdir</SPAN> to archive\n  <SPAN class=\"filename\">archive2.zip</SPAN>.\n  The filenames in archive will not contain <SPAN class=\"filename\">subdir\\</SPAN> prefix.</P>\n\n\n<PRE class=\"example\">\ncd /D c:\\dir1\\\n7z a c:\\archive3.zip dir2\\dir3\\ \n</PRE>\n\nThe filenames in archive <SPAN class=\"filename\">c:\\archive3.zip</SPAN> \nwill contain <SPAN class=\"filename\">dir2\\dir3\\</SPAN> prefix, \nbut they will not contain <SPAN class=\"filename\">c:\\dir1\\</SPAN> prefix.\n\n<PRE class=\"example\">\n7z a Files.7z *.txt -r\n</PRE>\n\n<P>adds all *.txt files from current folder and its subfolders to archive\n    <SPAN class=\"filename\">Files.7z</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/method.htm\">-m (Method)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/sfx.htm\">-sfx (create SFX)</A><BR>\n  <A href=\"../switches/stdin.htm\">-si (use StdIn)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/update.htm\">-u (Update)</A><BR>\n  <A href=\"../switches/volume.htm\">-v (Volumes)</A><BR>\n  <A href=\"../switches/working_dir.htm\">-w (Working Dir)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B>\n    <A href=\"delete.htm\">d (Delete)</A>,\n    <A href=\"update.htm\">u (Update)</A><BR>\n  <B>Switches:</B>\n    <A href=\"../switches/update.htm\">-u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/bench.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>b (Benchmark) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>b (Benchmark) command</H1>\n\n<P>Measures speed of the CPU and checks RAM for errors.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\nb [number_of_iterations] [-mmt{N}] [-md{N}] [-mm={Method}]\n</PRE>\n\n<P>There are two tests:<P>\n<OL>\n  <LI>Compressing with LZMA method\n  <LI>Decompressing with LZMA method\n</OL>\n\n<P>The benchmark shows a rating in MIPS (million instructions per second).\nThe rating value is calculated from the measured CPU speed and it\nis normalized with results of Intel Core 2 CPU with multi-threading option \nswitched off. So if you have Intel Core 2 Duo, \nrating values must be close to real CPU frequency.</P>\n\n<P>You can change the upper dictionary size to increase memory usage by -md{N} switch.\nAlso, you can change the number of threads by -mmt{N} switch.</P>\n\n<P>The <B>Dict</B> column shows dictionary size. For example, 21 means 2^21 = 2 MB.</P>\n\n<P>The <B>Usage</B> column shows the percentage of time the processor is working.\nIt's normalized for a one-thread load. For example, 180% CPU Usage for 2 threads\ncan mean that average CPU usage is about 90% for each thread.</P>\n\n<P>The <B>R / U</B> column shows the rating normalized for 100% of CPU usage.\nThat column shows the performance of one average CPU thread.</P>\n\n<P><B>Avr</B> shows averages for different dictionary sizes.</P>\n<P><B>Tot</B> shows averages of the compression and decompression ratings.</P>\n\n<P>Compression speed and rating strongly depend on memory (RAM) latency.\n\n<P>Decompression speed and rating strongly depend on the integer performance of the CPU.\nFor example, the Intel Pentium 4 has big branch\nmisprediction penalty (which is an effect of its long pipeline) and pretty slow\nmultiply and shift operations. So, the Pentium 4 has pretty low decompressing ratings.</P>\n\n<P>You can run a CRC calculation benchmark by specifying -mm=crc.\nThat test shows the speed of CRC calculation in MB/s. The first column shows the size of the block.\nThe next column shows the speed of CRC calculation for one thread. The other columns are results\nfor multi-threaded CRC calculation.</P> \n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z b\n</PRE>\nruns benchmarking.\n\n<PRE class=\"example\">\n7z b -mmt1 -md26\n</PRE>\nruns benchmarking with one thread and 64 MB dictionary.\n\n<PRE class=\"example\">\n7z b 30\n</PRE>\n<P>runs benchmarking with default settings for 30 iterations.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/delete.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>d (Delete) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>d (Delete) command</H1>\n\n<P>Deletes files from archive.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z d archive.zip *.bak -r\n</PRE>\n\n<P>deletes <SPAN class=\"filename\">*.bak</SPAN> files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/method.htm\">-m (Method)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/update.htm\">-u (Update)</A><BR>\n  <A href=\"../switches/working_dir.htm\">-w (Working Dir)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"add.htm\">a (Add)</A>,\n  <A href=\"update.htm\">u (Update)</A>\n</P>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"../switches/update.htm\">-u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/extract.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>e (Extract) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>e (Extract) command</H1>\n\n<P>Extracts files from an archive to the current\ndirectory or to the output directory. The output directory can be specified by\n<A href=\"../switches/output_dir.htm\">-o (Set Output Directory)</A> switch.</P>\n\n<P>This command copies all extracted files to one directory.\nIf you want extract files with full paths, you must use\n<A href=\"extract_full.htm\">x (Extract with full paths)</A> command.\n\n<P>7-Zip will prompt the user before overwriting existing files unless\nthe user specifies the <A href=\"../switches/yes.htm\">-y (Assume Yes on all queries)</A>\nswitch. If the user gives a <B>no</B> answer, 7-Zip will prompt for the file to be\nextracted to a new filename. Then a <B>no</B> answer skips that file; or, <B>yes</B>\nprompts for new filename.</P>\n\n<P>7-Zip accepts the following responses:</P>\n\n<TABLE>\n  <TR> <TH>Answer</TH> <TH>Abbr.</TH> <TH>Action</TH> </TR>\n  <TR> <TD>Yes</TD> <TD>y</TD> <TD>&nbsp;</TD> </TR>\n  <TR> <TD>No</TD> <TD>n</TD> <TD>&nbsp;</TD> </TR>\n  <TR> <TD>Always</TD> <TD>a</TD> <TD>Assume YES for ALL subsequent queries of the same class</TD> </TR>\n  <TR> <TD>Skip</TD> <TD>s</TD> <TD>Assume NO for ALL subsequent queries of the same class</TD> </TR>\n  <TR> <TD>Quit</TD> <TD>q</TD> <TD>Quit the program</TD> </TR>\n\n</TABLE>\n\n<P>Abbreviated responses are allowed.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z e archive.zip\n</PRE>\n\n<P>extracts all files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to the current directory.</P>\n\n<PRE class=\"example\">\n7z e archive.zip -oc:\\soft *.cpp -r\n</PRE>\n\n<P>extracts all <SPAN class=\"filename\">*.cpp</SPAN> files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to <SPAN class=\"filename\">c:\\soft</SPAN> folder.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/overwrite.htm\">-ao (Overwrite mode)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/output_dir.htm\">-o (Set Output Directory)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A><BR>\n  <A href=\"../switches/yes.htm\">-y (Assume Yes on all queries)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/extract_full.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>x (Extract with full paths) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>x (Extract with full paths) command</H1>\n\n<P>Extracts files from an archive with their full\npaths in the current directory, or in an output directory if specified.</P>\n\n<P>See the <A href=\"extract.htm\">e (Extract)</A> command description for more deatails.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x archive.zip\n</PRE>\n\n<P>extracts all files from the archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to the current directory.</P>\n\n<PRE class=\"example\">\n7z x archive.zip -oc:\\soft *.cpp -r\n</PRE>\n\n<P>extracts all <SPAN class=\"filename\">*.cpp</SPAN> files from the archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to <SPAN class=\"filename\">c:\\soft</SPAN> folder.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/overwrite.htm\">-ao (Overwrite mode)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/output_dir.htm\">-o (Set Output Directory)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A><BR>\n  <A href=\"../switches/yes.htm\">-y (Assume Yes on all queries)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"extract.htm\">e (Extract)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Commands</TITLE>\n  <LINK href=\"style.css\" rel=stylesheet type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Commands</H1>\n\n<P>The command is the first non-switch argument on the command line.</P>\n<P>Command names are not case sensitive.</P>\n<P>See also <A href =\"../syntax.htm\">Command Line Syntax</A> for more details about using the command line.</P>\n\n<H2>Commands quick reference</H2>\n\n<TABLE border=\"1\" cellpadding=\"3\" cellspacing=\"0\">\n<TR><TH>Command</TH><TH>Description</TH></TR>\n<TR> <TD><A href=\"add.htm\">a</A></TD> <TD><A href=\"add.htm\">Add</A></TD></TR>\n<TR> <TD><A href=\"bench.htm\">b</A></TD> <TD><A href=\"bench.htm\">Benchmark</A></TD></TR>\n<TR> <TD><A href=\"delete.htm\">d</A></TD> <TD><A href=\"delete.htm\">Delete</A></TD></TR>\n<TR> <TD><A href=\"extract.htm\">e</A></TD> <TD><A href=\"extract.htm\">Extract</A></TD></TR>\n<TR> <TD><A href=\"list.htm\">l</A></TD> <TD><A href=\"list.htm\">List</A></TD></TR>\n<TR> <TD><A href=\"test.htm\">t</A></TD> <TD><A href=\"test.htm\">Test</A></TD></TR>\n<TR> <TD><A href=\"update.htm\">u</A></TD> <TD><A href=\"update.htm\">Update</A></TD></TR>\n<TR> <TD><A href=\"extract_full.htm\">x</A></TD> <TD><A href=\"extract_full.htm\">eXtract with full paths</A></TD></TR>\n</TABLE>\n\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/list.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>l (List contents of archive) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>l (List contents of archive) command</H1>\n\n\n\n<!--\n<H4>Syntax</H4>\n<P><PRE class=\"syntax\">\nl[a | t][f]\n</PRE></P>\n\n-->\n\n<P>Lists contents of archive.</P>\n\n<!-- \n<P>The following options can be used:</P>\n<TABLE>\n<TR> <TH>Option</TH> <TH>Description</TH> </TR>\n<TR> <TD>a</TD> <TD>List with Additional fields</TD> </TR>\n<TR> <TD>t</TD> <TD>List with all fields, including Technical</TD> </TR>\n<TR> <TD>f</TD> <TD>List with Full pathnames</TD> </TR>\n</TABLE>\n-->\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z l archive.zip\n</PRE>\n\n<P>lists all files from archive <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n<!--\n<PRE class=\"example\">\n7z lf archive.zip *.txt\n</PRE>\n\n<P>lists <SPAN class=\"filename\">*.txt</SPAN> files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN> with full pathnames.</P>\n-->\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/list_tech.htm\">-slt (Show technical information)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/test.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>t (Test integrity of archive) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>t (Test integrity of archive) command</H1>\n\n<P>Tests archive files.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z t archive.zip *.doc -r\n</PRE>\n\n<P>tests <SPAN class=\"filename\">*.doc</SPAN> files in archive\n    <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/commands/update.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>u (Update) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>u (Update) command</H1>\n\n<P>Update older files in the archive and add files that are not already in the archive.</P>\n\n<P>Note: The current version of 7-Zip cannot change an archive which\nwas created with the solid option switched on.\nTo update a .7z archive you must create and update that archive only in non-solid\nmode (-ms=off switch).</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z u archive.zip *.doc\n</PRE>\n\n<P>updates <SPAN class=\"filename\">*.doc</SPAN> files to archive\n    <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/method.htm\">-m (Method)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/sfx.htm\">-sfx (create SFX)</A><BR>\n  <A href=\"../switches/stdin.htm\">-si (use StdIn)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/update.htm\">-u (Update)</A><BR>\n  <A href=\"../switches/working_dir.htm\">-w (Working Dir)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"add.htm\">a (Add)</A>,\n  <A href=\"delete.htm\">d (Delete)</A>,\n</P>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"../switches/update.htm\">-u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/exit_codes.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Exit Codes from 7-Zip</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Exit Codes from 7-Zip</H1>\n\n<P>7-Zip returns the following exit codes:</P>\n\n<TABLE>\n  <TR><TH>Code</TH><TH>Meaning</TH></TR>\n  <TR><TD>0</TH><TD>No error</TD></TR>\n  <TR><TD>1</TH><TD>Warning (Non fatal error(s)). For example, one or more files were\n  locked by some other application, so they were not compressed.</TD></TR>\n  <TR><TD>2</TH><TD>Fatal error</TD></TR>\n  <TR><TD>7</TH><TD>Command line error</TD></TR>\n  <TR><TD>8</TH><TD>Not enough memory for operation</TD></TR>\n  <TR><TD>255</TH><TD>User stopped the process</TD></TR>\n</TABLE>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Version User's Guide</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Version User's Guide</H1>\n\n\n<P>7z.exe is the command line version of 7-Zip. 7z.exe uses 7z.dll\nfrom the 7-Zip package. 7z.dll is used by the 7-Zip File Manager also.</LI>\n\n<P>7za.exe (a = alone) is a standalone version of 7-Zip.\n7za.exe supports only 7z, lzma, cab, zip, gzip, bzip2, Z and tar formats.\n7za.exe doesn't use external modules.</LI>\n\n<UL>\n  <LI><A href = \"syntax.htm\">Command Line syntax</A></LI>\n  <LI><A href = \"exit_codes.htm\">Exit Codes</A></LI>\n  <LI><A href = \"commands/index.htm\">Commands</A></LI>\n  <LI><A href = \"switches/index.htm\">Switches</A></LI>\n</UL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/ar_exclude.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ax (Exclude archive filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ax (Exclude archive filenames) switch</H1>\n\n<P>Specifies archives to be excluded from the operation.</P>\n<P>Multiple exclude archive switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-ax[&lt;recurse_type>]&lt;file_ref>\n\n&lt;recurse_type> ::= r[- | 0]\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<P>See <A href=\"include.htm\">-xi (Include archive filenames)</A> switch description \nfor information about option parameters.</P>\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -an -ai!*.7z -ax!a*.7z\n</PRE>\n\n<P>tests all <SPAN class=\"filename\">*.7z</SPAN> archives,\n  except <SPAN class=\"filename\">a*.7z</SPAN> archives.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"include.htm\">-ai (Include archives)</A>\n  <A href=\"ar_no.htm\">-an (Disable parsing of archive_name)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/ar_include.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ai (Include archive filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ai (Include archive filenames) switch</H1>\n\n<P>Specifies additional include archive filenames and wildcards.</P>\n<P>Multiple include switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-ai[<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A>]<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A>\n\n<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A> ::= r[- | 0]\n<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<H4>Parameters</H4>\n\n<DL>\n  <DT><A name=\"recurse_type\"></A>&lt;recurse_type></DT>\n  <DD><P>Specifies how wildcards and file names in this switch must\n         be used.  If this option is not given, recursion will be not used.\n         For more details see specification of the\n         <A href=\"recurse.htm\">-r (Recurse)</A> switch.</P>\n<PRE class=\"syntax\">\n&lt;recurse_type> ::= r[- | 0]\n</PRE>\n\n </DD>\n <DT><A name=\"file_ref\"></A>&lt;file_ref></DT>\n <DD>\n   <P>Specifies filenames and wildcards or list file that specify processed files.</P>\n<PRE class=\"syntax\">\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n   <TABLE>\n     <TR> <TH width=\"120\">Option</TH> <TH>Description</TH> </TR>\n     <TR> <TD>{listfile}</TD> <TD>Specifies name of list file. See\n                  <A href = ../syntax.htm#ListFile>List file</A> description.</TD> </TR>\n     <TR> <TD>{wildcard}</TD> <TD>Specifies wildcard or filename.</TD> </TR>\n   </TABLE>\n </DD>\n</DL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -an -air!*.7z\n</PRE>\n\n<P>tests <SPAN class=\"filename\">*.7z</SPAN> archives in current directory and all it's \nsubdirectories.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"ar_exclude.htm\">-ax (Exclude archives)</A>\n  <A href=\"ar_no.htm\">-an (Disable parsing of archive_name)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/ar_no.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-an (Disable parsing of archive_name) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-an (Disable parsing of archive_name) switch</H1>\n\n<P>Disables parsing of the archive_name field on the command line.\nThis switch must be used with the\n<A href=\"include.htm\">-ai (Include archives) switch</A>.\nIf you use a file list for your archives, you specify it with the -ai switch,\nso you need to disable parsing of archive_name field from command line.\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-an\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -an -ai!*.7z -ax!a*.7z\n</PRE>\n\n<P>tests all <SPAN class=\"filename\">*.7z</SPAN> archives,\n  except <SPAN class=\"filename\">a*.7z</SPAN> archives.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"include.htm\">-ai (Include archives)</A>\n  <A href=\"exclude.htm\">-ax (Exclude archives)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/charset.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-scs (Set charset for list files) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-scs (Set charset for list files) switch</H1>\n\n<P>Sets charset for list files.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-scs{UTF-8 | WIN | DOS}\n</PRE>\n\n<P>Default charset is UTF-8.</P>\n\n<DL>\n  <DT>UTF-8</DT>\n  <DD>Unicode UTF-8 character set.</DD>\n  <DT>WIN</DT>\n  <DD>Default character set of Windows.</DD>\n  <DT>DOS</DT>\n  <DD>Default DOS (OEM) character set of Windows.</DD>\n</DL>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a archive.7z @listfile.txt -scsWIN\n</PRE>\n\n<P>compresses files from <SPAN class=\"filename\">listfile.txt</SPAN> list, that contains \nlist of files in default character set of Windows.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/exclude.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-x (Exclude filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-x (Exclude filenames) switch</H1>\n\n<P>Specifies which filenames or wildcarded names must be excluded from the operation.</P>\n<P>Multiple exclude switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-x[&lt;recurse_type>]&lt;file_ref>\n\n&lt;recurse_type> ::= r[- | 0]\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<P>See <A href=\"include.htm\">-i (Include)</A> switch description for information about\n    option parameters.</P>\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.txt -x!temp.*\n</PRE>\n\n<P>adds to the archive <SPAN class=\"filename\">archive.zip</SPAN> all\n  <SPAN class=\"filename\">*.txt</SPAN> files,\n  except <SPAN class=\"filename\">temp.*</SPAN> files.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"recurse.htm\">-r (Recurse)</A>,\n  <A href=\"include.htm\">-i (Include)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/include.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-i (Include filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-i (Include filenames) switch</H1>\n\n<P>Specifies additional include filenames and wildcards.</P>\n<P>Multiple include switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-i[<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A>]<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A>\n\n<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A> ::= r[- | 0]\n<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<H4>Parameters</H4>\n\n<DL>\n  <DT><A name=\"recurse_type\"></A>&lt;recurse_type></DT>\n  <DD><P>Specifies how wildcards and file names in this switch must\n         be used. If this option is not given, then the global value, assigned\n         by the <A href=\"recurse.htm\">-r (Recurse)</A> switch will be used. For\n         more details see specification of the\n         <A href=\"recurse.htm\">-r (Recurse)</A> switch.</P>\n<PRE class=\"syntax\">\n&lt;recurse_type> ::= r[- | 0]\n</PRE>\n\n </DD>\n <DT><A name=\"file_ref\"></A>&lt;file_ref></DT>\n <DD>\n   <P>Specifies filenames and wildcards, or a list file, for files to be processed.</P>\n<PRE class=\"syntax\">\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n   <TABLE>\n     <TR> <TH width=\"120\">Option</TH> <TH>Description</TH> </TR>\n     <TR> <TD>{listfile}</TD> <TD>Specifies name of list file. See\n                  <A href = ../syntax.htm#ListFile>List file</A> description.</TD> </TR>\n     <TR> <TD>{wildcard}</TD> <TD>Specifies wildcard or filename.</TD> </TR>\n   </TABLE>\n </DD>\n</DL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -tzip src.zip *.txt -ir!DIR1\\*.cpp\n</PRE>\n\n<P>adds to <SPAN class=\"filename\">src.zip</SPAN> archive all\n  <SPAN class=\"filename\">*.txt</SPAN> files from current directory\n  and all <SPAN class=\"filename\">*.cpp</SPAN>\n  files from directory <SPAN class=\"filename\">DIR1</SPAN>\n  and from all it's subdirectories.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"recurse.htm\">-r (Recurse)</A>,\n  <A href=\"exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Switches</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Switches</H1>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n&ltswitch>::= &lt;switch_symbol>&lt;switch_characters>[&lt;option>]\n&lt;switch_symbol> ::= '/' | '-' \n\n</PRE>\n<P>On the command line, a switch consists of a switch specifier,\neither a dash (-) or a forward slash (/), followed by the name of\nthe switch. Switch names cannot be abbreviated.</P>\n\n<P>Some switches take an argument after the switch name.\nNo spaces or tabs are allowed within a switch specification.\nSwitch names are not case sensitive, but arguments can be case sensitive.\n</P>\n\n<P>Switch can be used in any place in command line.</B>\n\n<P>See also <A href =\"../syntax.htm\">Command Line Syntax</A> for more details\n   about using the command line.</P>\n\n<H2>Switch quick reference</H2>\n\n<TABLE border=\"1\" cellpadding=\"3\" cellspacing=\"0\">\n<TR><TH>Switch</TH><TH>Description</TH></TR>\n<TR> <TD><A href=\"stop_switch.htm\">--</A></TD> <TD><A href=\"stop_switch.htm\">Stop switches parsing</A></TD></TR>\n<TR> <TD><A href=\"ar_include.htm\">-ai</A></TD> <TD><A href=\"ar_include.htm\">Include archive filenames</A></TD></TR>\n<TR> <TD><A href=\"ar_no.htm\">-an</A></TD> <TD><A href=\"ar_no.htm\">Disable parsing of archive_name</A></TD></TR>\n<TR> <TD><A href=\"overwrite.htm\">-ao</A></TD> <TD><A href=\"overwrite.htm\">Overwrite mode</A></TD></TR>\n<TR> <TD><A href=\"ar_exclude.htm\">-ax</A></TD> <TD><A href=\"ar_exclude.htm\">Exclude archive filenames</A></TD></TR>\n<TR> <TD><A href=\"include.htm\">-i</A></TD> <TD><A href=\"include.htm\">Include filenames</A></TD></TR>\n<TR> <TD><A href=\"method.htm\">-m</A></TD> <TD><A href=\"method.htm\">Set Compression Method</A></TD></TR>\n<TR> <TD><A href=\"output_dir.htm\">-o</A></TD> <TD><A href=\"output_dir.htm\">Set Output directory</A></TD></TR>\n<TR> <TD><A href=\"password.htm\">-p</A></TD> <TD><A href=\"password.htm\">Set Password</A></TD></TR>\n<TR> <TD><A href=\"recurse.htm\">-r</A></TD> <TD><A href=\"recurse.htm\">Recurse subdirectories</A></TD></TR>\n<TR> <TD><A href=\"charset.htm\">-scs</A></TD> <TD><A href=\"charset.htm\">Set charset for list files</A></TD></TR>\n<TR> <TD><A href=\"list_tech.htm\">-slt</A></TD> <TD><A href=\"list_tech.htm\">Show technical information</A></TD></TR>\n<TR> <TD><A href=\"sfx.htm\">-sfx</A></TD> <TD><A href=\"sfx.htm\">Create SFX archive</A></TD></TR>\n<TR> <TD><A href=\"stdin.htm\">-si</A></TD> <TD><A href=\"stdin.htm\">Read data from StdIn</A></TD></TR>\n<TR> <TD><A href=\"stdout.htm\">-so</A></TD> <TD><A href=\"stdout.htm\">Write data to StdOut</A></TD></TR>\n<TR> <TD><A href=\"ssc.htm\">-ssc</A></TD> <TD><A href=\"ssc.htm\">Set Sensitive Case mode</A></TD></TR>\n<TR> <TD><A href=\"type.htm\">-t</A></TD> <TD><A href=\"type.htm\">Type of archive</A></TD></TR>\n<TR> <TD><A href=\"update.htm\">-u</A></TD> <TD><A href=\"update.htm\">Update options</A></TD></TR>\n<TR> <TD><A href=\"volume.htm\">-v</A></TD> <TD><A href=\"volume.htm\">Create Volumes</A></TD></TR>\n<TR> <TD><A href=\"working_dir.htm\">-w</A></TD> <TD><A href=\"working_dir.htm\">Set Working directory</A></TD></TR>\n<TR> <TD><A href=\"exclude.htm\">-x</A></TD> <TD><A href=\"exclude.htm\">Exclude filenames</A></TD></TR>\n<TR> <TD><A href=\"yes.htm\">-y</A></TD> <TD><A href=\"yes.htm\">Assume Yes on all queries</A></TD></TR>\n</TABLE>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/list_tech.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-slt (Show technical information) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-slt (Show technical information) switch</H1>\n\n<P>Sets technical mode for <A href=\"../commands/list.htm\">l (List)</A> command.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-slt\n</PRE>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z l -slt archive.7z\n</PRE>\n\n<P>shows detailed technical information for the files in <SPAN class=\"filename\">archive.7z</SPAN>.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/list.htm\">l (List)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/method.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-m (Set compression Method) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-m (Set compression Method) switch</H1>\n\n<P>Specifies the compression method.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-m&lt;method_parameters>\n\n</PRE>\n\n<P>The format for this switch depends on the archive type.</P>\n\n<H4>Zip</H4>\n<TABLE>\n  <TR> \n    <TH width=\"160\">Parameter</TH> \n    <TH align=\"center\">Default</TH> \n    <TH>Description</TH> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#ZipX\">x=[0 | 1 | 3 | 5 | 7 | 9 ]</A></TD> \n    <TD align=\"center\">5</TD>\n    <TD>Sets level of compression.</TD> </TR>\n  <TR> \n    <TD>m={MethodID}</TD> \n    <TD align=\"center\">Deflate</TD> \n    <TD>Sets a method: Copy, Deflate, Deflate64, BZip2, LZMA.</TD> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#Deflate_FastBytes\">fb={NumFastBytes}</A></TD>\n    <TD align=\"center\">32</TD>\n    <TD>Sets number of Fast Bytes for Deflate encoder.</TD> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#Zip_Pass\">pass={NumPasses}</A></TD>\n    <TD align=\"center\">1</TD>\n    <TD>Sets number of Passes for Deflate encoder.</TD></TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#ZipDictionarySize\">d={Size}[b|k|m]</A></TD> \n    <TD align=\"center\">900000</TD>  \n    <TD>Sets Dictionary size for BZip2</TD></TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#ZipMultiThread\">mt=[off | on | {N}]</A></TD> \n    <TD align=\"center\">on</TD>  \n    <TD>Sets multithreading mode.</TD></TR>\n  <TR> \n    <TD>em={EncryptionMethodID}</TD> \n    <TD align=\"center\">ZipCrypto</TD> \n    <TD>Sets a encryption method: ZipCrypto, AES128, AES192, AES256</TD> </TR>\n  <TR> <TD><A class=\"parameter\">tc=[off | on]</A></TD> \n     <TD align=\"center\">off</TD>  <TD>Stores NTFS timestamps for files: Modification time, Creation time, Last access time.</TD> </TR>\n  <TR> <TD><A class=\"parameter\">cl=[off | on]</A></TD> \n     <TD align=\"center\">off</TD>  <TD>7-Zip always uses local code page for file names.</TD> </TR>\n  <TR> <TD><A class=\"parameter\">cu=[off | on]</A></TD> \n     <TD align=\"center\">off</TD>  <TD>7-Zip uses UTF-8 for file names that contain non-ASCII symbols.</TD> </TR>\n</TABLE>\n\n<P>By default (if <B>cl</B> and <B>cu</B> switches are not specified), 7-Zip uses UTF-8 encoding\nonly for file names that contain symbols unsupported by local code page.</P>\n\n<DL>\n  <DT><A name=\"ZipX\"></A>x=[0 | 1 | 3 | 5 | 7 | 9 ]</DT>\n  <DD>\n    <P>Sets level of compression. x=0 means Copy mode (no compression).</P>\n    <P>Deflate / Deflate64 settings:</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>NumFastBytes</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>\n      <TR> <TD class=\"cc\">1</TD> <TD class=\"cc\" rowspan=3>32</TD> <TD class=\"cc\" rowspan=3>1</TD> <TD>Fastest</TD> </TR>\n      <TR> <TD class=\"cc\">3</TD> <TD>Fast</TR>\n      <TR> <TD class=\"cc\">5</TD> <TD>Normal</TR>\n      <TR> <TD class=\"cc\">7</TD> <TD class=\"cc\">64</TD> <TD class=\"cc\">3</TD> <TD>Maximum</TD> </TR>\n      <TR> <TD class=\"cc\">9</TD> <TD class=\"cc\">128</TD> <TD class=\"cc\">10</TD> <TD>Ultra</TD> </TR>\n    </TABLE>\n\n    <P>x=1 and x=3 with Deflate method set fast mode for compression.</P>\n\n    <P>BZip2 settings:</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>Dictionary</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>\n      <TR> <TD class=\"cc\">1</TD> <TD class=\"cc\">100000</TD> <TD class=\"cc\" rowspan=3>1</TD> <TD>Fastest</TD> </TR>\n      <TR> <TD class=\"cc\">3</TD> <TD class=\"cc\">500000</TD>  <TD>Fast</TD> </TR>\n      <TR> <TD class=\"cc\">5</TD> <TD class=\"cc\" rowspan=3>900000</TD> <TD>Normal</TD> </TR>\n      <TR> <TD class=\"cc\">7</TD> <TD align=\"center\">2</TD> <TD>Maximum</TD> </TR>\n      <TR> <TD class=\"cc\">9</TD> <TD align=\"center\">7</TD> <TD>Ultra</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"Deflate_FastBytes\"></A>fb={NumFastBytes}</DT>\n  <DD>\n    <P>Sets the number of fast bytes for the Deflate/Deflate64 encoder.\n       It can be in the range from 3 to 258 (257 for Deflate64).\n       Usually, a big number gives a little bit better\n       compression ratio and a slower compression process.\n       A large fast bytes parameter can significantly increase the compression ratio\n       for files which contain long identical sequences of bytes.</P>\n  </DD>\n  <DT><A name=\"Zip_Pass\"></A>pass={NumPasses}</DT>\n  <DD>\n    <P>Sets number of passes for Deflate encoder. It can be in the range from 1 to 15 for Deflate and\n       from 1 to 10 for BZip2. Usually, a big number gives a little bit better\n       compression ratio and a slower compression process.\n    </P>\n  </DD>\n  <DT><A name=\"ZipDictionarySize\"></A>d={Size}[b|k|m]</DT>\n  <DD>\n    <P> Sets the Dictionary size for BZip2. You must specify the size in bytes, kilobytes, or megabytes.\n       The maximum value for the Dictionary size is 900000b. If you do not specify any symbol \n       from set [b|k|m], dictionary size will be calculated as DictionarySize = 2^Size bytes.</P>\n  </DD>\n  <DT><A name=\"ZipMultiThread\"></A>mt=[off | on | {N}]</DT>\n  <DD>\n    <P>Sets multithread mode. If you have a multiprocessor or multicore system, \n       you can get a speed increase with\n       this switch. This option affects only compression (with any method) and \n       decompression of BZip2 streams. \n       Each thread in the multithread mode uses 32 MB of RAM for buffering.\n       If you specify {N}, 7-Zip tries to use N threads.</P>\n  </DD>\n</DL>\n\n<H4>GZip</H4>\nGZip uses the same parameters as Zip, but GZip compresses only with Deflate method.\n\n<H4>BZip2</H4>\n<TABLE>\n  <TR> \n    <TH width=\"160\">Parameter</TH> \n    <TH align=\"center\">Default</TH> \n    <TH>Description</TH> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#BZip2X\">x=[1 | 3 | 5 | 7 | 9 ]</A></TD> \n    <TD align=\"center\">5</TD>\n    <TD>Sets level of compression.</TD> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#BZip2Pass\">pass={NumPasses}</A></TD>\n    <TD align=\"center\">1</TD>\n    <TD>Sets number of Passes for Bzip2 encoder.</TD></TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#BZip2MultiThread\">mt=[off | on | {N}]</A></TD> \n    <TD align=\"center\">on</TD>  \n    <TD>Sets multithreading mode.</TD></TR>\n</TABLE>\n\n<DL>\n  <DT><A name=\"BZip2\"></A>x=[1 | 3 | 5 | 7 | 9 ]</DT>\n  <DD>\n    <P>Sets level of compression</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>\n      <TR> <TD>5</TD> <TD align=\"center\">1</TD> <TD>Default compression method.</TD> </TR>\n      <TR> <TD>7</TD> <TD align=\"center\">2</TD> <TD>Maximum compression method.</TD> </TR>\n      <TR> <TD>9</TD> <TD align=\"center\">7</TD> <TD>Ultra  compression method.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"#BZip2Pass\"></A>pass={NumPasses}</DT>\n  <DD>\n    <P>Sets the number of passes. It can be in the range from 1 to 10.\n       The default value is 1 for normal mode, 2 for maximum mode and 7 for ultra mode.\n       A bigger number can give a little bit better compression ratio and a slower compression process.\n    </P>\n  </DD>\n  <DT><A name=\"BZip2MultiThread\"></A>mt=[off | on | {N}]</DT>\n  <DD>\n    <P>Sets multithread mode. If you have a multiprocessor or multicore system, \n       you can get a speed increase with\n       this switch. If you specify {N}, for example mt=4, 7-Zip tries to use 4 threads.</P>\n  </DD>\n</DL>\n\n<H4>7z</H4>\n<TABLE>\n  <TR> <TH width=\"80\">Parameter</TH> <TH align=\"center\">Default</TH> <TH>Description</TH> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#SevenZipX\">x=[0 | 1 | 3 | 5 | 7 | 9 ]</A></TD> \n        <TD align=\"center\">5</TD><TD>Sets level of compression.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#Solid\">s=[off | on | [e] [{N}f] [{N}b | {N}k | {N}m | {N}g]</A></TD> \n       <TD align=\"center\">on</TD>  <TD>Sets solid mode.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#Filter\">f=[off | on]</A></TD> \n       <TD align=\"center\">on</TD>  <TD>Enables or disables compression filters for executable files.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#HeaderCompress\">hc=[off | on]</A></TD> \n       <TD align=\"center\">on</TD>  <TD>Enables or disables archive header compressing.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#HeaderEncrypt\">he=[off | on]</A></TD> \n       <TD align=\"center\">off</TD>  <TD>Enables or disables archive header encryption.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#Bind\">b{C1}[s{S1}]:{C2}[s{S2}]</A></TD> \n       <TD align=\"center\"> </TD>  <TD>Sets binding beetwen coders.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#MethodID\">{N}={MethodID}[:param1][:param2][..]</A></TD> \n       <TD align=\"center\">LZMA</TD>  <TD>Sets a method: LZMA, PPMd, BZip2, Deflate, BCJ, BCJ2, Copy.</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MultiThread\">mt=[off | on | {N}]</A></TD> \n        <TD align=\"center\">on</TD>  <TD>Sets multithreading mode.</TD> </TR>\n   <TR> <TD><A class=\"parameter\">tc=[off | on]</A></TD> \n        <TD align=\"center\">off</TD>  <TD>Stores file creation timestamps.</TD> </TR>\n</TABLE>\n\n<DL>\n  <DT><A name=\"SevenZipX\"></A>x=[0 | 1 | 3 | 5 | 7 | 9 ]</DT>\n  <DD>\n    <P>Sets level of compression</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>Method</TH> <TH>Dictionary</TH> <TH>FastBytes</TH> <TH>MatchFinder</TH> <TH>Filter</TH> <TH>Description</TH> </TR>\n      <TR> <TD align=\"center\">0</TD> <TD align=\"center\">Copy</TD> <TD align=\"center\"></TD> <TD align=\"center\"></TD> <TD align=\"center\"></TD> <TD align=\"center\"></TD> <TD>No compression.</TD> </TR>\n      <TR> <TD align=\"center\">1</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">64 KB</TD> <TD align=\"center\">32</TD> <TD align=\"center\">HC4</TD> <TD align=\"center\">BCJ</TD> <TD>Fastest compressing</TD> </TR>\n      <TR> <TD align=\"center\">3</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">1 MB</TD>  <TD align=\"center\">32</TD> <TD align=\"center\">HC4</TD> <TD align=\"center\">BCJ</TD> <TD>Fast compressing</TD> </TR>\n      <TR> <TD align=\"center\">5</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">16 MB</TD>  <TD align=\"center\">32</TD> <TD align=\"center\">BT4</TD> <TD align=\"center\">BCJ</TD> <TD>Normal compressing</TD> </TR>\n      <TR> <TD align=\"center\">7</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">32 MB</TD> <TD align=\"center\">64</TD> <TD align=\"center\">BT4</TD> <TD align=\"center\">BCJ</TD> <TD>Maximum compressing</TD> </TR>\n      <TR> <TD align=\"center\">9</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">64 MB</TD> <TD align=\"center\">64</TD> <TD align=\"center\">BT4</TD> <TD align=\"center\">BCJ2</TD><TD>Ultra compressing</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"Solid\"></A>s=[off | on | [e] [{N}f] [{N}b | {N}k | {N}m | {N}g)]</DT>\n  <DD>\n    <P> Enables or disables solid mode. The default mode is s=on. \n        In solid mode, files are grouped together. Usually, compressing in  \n        solid mode improves the compression ratio.</P>\n\n    <TABLE>\n      <TR> <TD>e</TD> <TD>Use a separate solid block for each new file extension</TD> </TR>\n      <TR> <TD>{N}f</TD> <TD>Set the limit for number of files in one solid block</TD> </TR>\n      <TR> <TD>{N}b | {N}k | {N}m | {N}g</TD> <TD>Set a limit for the total size of a solid block in bytes</TD> </TR>\n    </TABLE>\n\n    <P>These are the default limits for the solid block size:</P>\n\n    <TABLE>\n      <TR> <TH width=\"150\">Compression Level</TH> <TH>Solid block size</TH> </TR>\n      <TR> <TD>Store</TD> <TD>0 B</TD> </TR>\n      <TR> <TD>Fastest</TD> <TD>16 MB</TD> </TR>\n      <TR> <TD>Fast</TD> <TD>128 MB</TD> </TR>\n      <TR> <TD>Normal</TD> <TD>2 GB</TD> </TR>\n      <TR> <TD>Maximum</TD> <TD>4 GB</TD> </TR>\n      <TR> <TD>Ultra</TD> <TD>4 GB</TD> </TR>\n    </TABLE>\n\n\n    <P>Limitation of the solid block size usually decreases compression ratio but gives the following advantages:</P>\n    <UL>\n      <LI>Decreases losses in case of future archive damage.\n      <LI>Decreases extraction time of a group of files (or just one\n     file), so long as the group doesn't contain the entire archive.</LI></LI>\n    </UL>\n    <P>The current version of 7-Zip doesn't support updating of solid\n    archives, if it requires repacking solid blocks.</P>\n\n    <P>Example:</P>\n      <PRE class=\"example\">\n        s=100f10m\n      </PRE>\n    <P>set solid mode with 100 files & 10 MB limits per one solid block.</P>\n\n  <DT><A name=\"Filter\"></A>f=[off | on]</DT>\n  <DD>\n    <P>Enables or disables compression filters for executable files:\n     dll, exe, ocx, sfx, sys. It uses BCJ2 filter in Ultra mode and BCJ \n     filter in other modes. The default mode is f=on. \n    </P>\n  <DT><A name=\"HeaderCompress\"></A>hc=[off | on]</DT>\n  <DD>\n    <P> Enables or disables archive header compressing. The default mode is hc=on. \n        If archive header compressing is enabled, some parts of archive header will \n        be compressed with LZMA method.\n    </P>\n  <DT><A name=\"HeaderEncrypt\"></A>he=[off | on]</DT>\n  <DD>\n    <P> Enables or disables archive header encryption. The default mode is he=off. \n    </P>\n  <DT>{N}</DT>\n  <DD>\n    <P>Sets order of methods. It is used also to associate parameters with\n        methods. Numbers must begin from 0. Methods that have smaller numbers will be used\n        before others.</P>\n  </DD>\n\n  <DT><A name=\"Bind\"></A>b{C1}[s{S1}]:{C2}[s{S2}]</DT>\n  <DD>\n    <P> Binds output stream S1 in coder C1 with input stream S2 in coder C2.\n        If stream number is not specified, stream with number 0 will be used.\n        </P>\n    <P> Usally coder has one input stream and \n    one output stream. In 7z some coders can have multiple input and output streams.</P>\n\n    <P>For example, <A class=\"parameter\" href=\"#BCJ2\">BCJ2</A> encoder has one \n     input stream and four output streams.</P>\n  </DD>\n\n  <DT><A name=\"MultiThread\"></A>mt=[off | on | {N}]</DT>\n  <DD>\n    <P>Sets multithread mode. If you have a multiprocessor or multicore system, \n       you can get a increase with this switch.\n       7-Zip supports multithread mode only for LZMA compression and \n       BZip2 compression / decompression. If you specify {N}, for example mt=4, \n       7-Zip tries to use 4 threads. LZMA compression uses only 2 threads.\n    </P>\n  </DD>\n  \n  <DT><A name=\"MethodID\"></A>{N}={MethodID}[:param1][:param2] ... [:paramN]</DT>\n  <DD>\n    <P>Sets compression method. You can use any number of methods. \n       The default method is LZMA. </P>\n    <P>Parameters must be in one of the following forms:</P>\n    <UL>\n      <LI>{ParamName}={ParamValue}.\n      <LI>{ParamName}{ParamValue}, if {ParamValue} \n        is number and {ParamName} doesn't contain numbers.\n    </UL>\n        \n    <P>Supported methods:</P>\n    <TABLE>\n      <TR> <TH width=\"60\">MethodID</TH> <TH>Description</TH> </TR>\n      <TR> <TD><A class=\"parameter\" href=\"#LZMA\">LZMA</A></TD> <TD>Algorithm based on LZ algorithm</TD> </TR>\n      <TR> <TD><A class=\"parameter\" href=\"#PPMd\">PPMd</A></TD> <TD>Dmitry Shkarin's PPMdH with small changes</TD> </TR>\n      <TR> <TD>BZip2</TD> <TD>BWT algorithm</TD> </TR>\n      <TR> <TD>Deflate</TD> <TD>LZ+Huffman</TD> </TR>\n      <TR> <TD>Copy</TD> <TD>No compression</TD> </TR>\n    </TABLE>\n\n    <P>Supported filters:</P>\n    <TABLE>\n      <TR> <TH width=\"60\">MethodID</TH> <TH>Description</TH> </TR>\n      <TR> <TD>BCJ</TD> <TD>converter for x86 executables</TD> </TR>\n      <TR> <TD><A class=\"parameter\" href=\"#BCJ2\">BCJ2</A></TD> <TD>converter for x86 executables (version 2)</TD> </TR>\n      <TR> <TD>ARM</TD> <TD>converter for ARM (little endian) executables</TD> </TR>\n      <TR> <TD>ARMT</TD> <TD>converter for ARM Thumb (little endian) executables</TD> </TR>\n      <TR> <TD>IA64</TD> <TD>converter for IA-64 executables</TD> </TR>\n      <TR> <TD>PPC</TD> <TD>converter for PowerPC (big endian) executables</TD> </TR>\n      <TR> <TD>SPARC</TD> <TD>converter for SPARC executables</TD> </TR>\n    </TABLE>\n    <P>Filters increase the compression ratio for some types of files. Filters\n       must be used with one of the compression method (for example, BCJ + LZMA).</P>\n  </DD>\n\n <H4><A name=\"LZMA\"></A>LZMA</H4>\n <P> LZMA is an algorithm based on Lempel-Ziv algorithm.\n   It provides very fast decompression (about 10-20 times faster than compression). \n   Memory requirements for compression and decompression also are different (see\n   <A class=\"parameter\" href=\"#DictionarySize\">d={Size}[b|k|m]</A> switch for details).</P>\n\n <TABLE>\n   <TR> <TH width=\"80\">Parameter</TH> <TH align=\"center\">Default</TH> <TH>Description</TH> </TR>\n\n   <TR> <TD><A class=\"parameter\" href=\"#LZMAMode\">a=[0|1]</A></TD> \n        <TD align=\"center\">1</TD>  <TD>Sets compressing mode</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#DictionarySize\">d={Size}[b|k|m]</A></TD> \n        <TD align=\"center\">24</TD>  <TD>Sets Dictionary size</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MatchFinder\">mf={MF_ID}</A></TD> \n        <TD align=\"center\">bt4</TD>  <TD>Sets Match Finder</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#FastBytes\">fb={N}</A></TD> \n        <TD align=\"center\">32</TD>  <TD>Sets number of Fast Bytes</TD></TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MatchFinderCycles\">mc={N}</A></TD> \n        <TD align=\"center\">32</TD><TD>Sets Number of Cycles for Match Finder</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#LitContext\">lc={N}</A></TD> \n        <TD align=\"center\">3</TD>  <TD>Sets number of Literal Context bits - [0, 8]</TD></TR>\n   <TR> <TD><A class=\"parameter\" href=\"#LitPos\">lp={N}</A></TD> \n        <TD align=\"center\">0</TD>  <TD>Sets number of Literal Pos bits - [0, 4]</TD></TR>\n   <TR> <TD><A class=\"parameter\" href=\"#PosBits\">pb={N}</A></TD> \n        <TD align=\"center\">2</TD>  <TD>Set number of Pos Bits - [0, 4]</TD></TR>\n </TABLE>\n\n \n <DL>\n  <DT><A name=\"#LZMAMode\"></A>a=[0|1]</DT>\n  <DD>\n    <P> Sets compression mode: 0 = fast, 1 = normal.\n      Default value is 1.</P>\n  </DD>\n  <DT><A name=\"DictionarySize\"></A>d={Size}[b|k|m]</DT>\n  <DD>\n    <P> Sets Dictionary size for LZMA. You must specify the size in bytes, kilobytes, or megabytes.\n       The maximum value for dictionary size is 1 GB = 2^30 bytes. Default values for LZMA\n       are 24 (16 MB) in normal mode, 25 (32 MB) in maximum mode (-mx=7) \n       and 26 (64 MB) in ultra mode (-mx=9). \n       If you do not specify any symbol from the set [b|k|m], the\n       dictionary size will be calculated as DictionarySize = 2^Size bytes.\n       For decompressing a file compressed by LZMA method with dictionary size N, you need\n       about N bytes of memory (RAM) available.\n       </P>\n  </DD>\n  <DT><A name=\"MatchFinder\"></A>mf={MF_ID}</DT>\n  <DD>\n    <P> Sets Match Finder for LZMA. Default method is bt4. \n       Algorithms from hc* group don't provide a good compression ratio,\n       but they often work pretty fast in combination with fast mode (a=0).\n       Memory requirements depend on dictionary size (parameter \"d\" in table below).\n    </P>\n    <TABLE>\n      <TR> <TH width=\"60\">MF_ID</TH> <TH width=\"120\">Memory</TH> <TH>Description</TH> </TR>\n      <TR> <TD>bt2</TD> <TD>d*9.5 + 4 MB</TD> <TD>Binary Tree with 2 bytes hashing.</TD> </TR>\n      <TR> <TD>bt3</TD> <TD>d*11.5 + 4 MB</TD> <TD>Binary Tree with 3 bytes hashing.</TD> </TR>\n      <TR> <TD>bt4</TD> <TD>d*11.5 + 4 MB</TD> <TD>Binary Tree with 4 bytes hashing.</TD> </TR>\n      <TR> <TD>hc4</TD> <TD>d*7.5 + 4 MB</TD> <TD>Hash Chain with 4 bytes hashing.</TD> </TR>\n    </TABLE>\n    <P>Note: Your operation system also needs some amount of physical memory for internal purposes. \n      So keep at least 32MB of physical memory unused.</P>\n  </DD>\n  \n  <DT><A name=\"FastBytes\"></A>fb={N}</DT>\n  <DD>\n    <P>Sets number of fast bytes for LZMA. It can be in the range from 5 to 273.\n       The default value is 32 for normal mode and 64 for maximum and ultra modes.\n       Usually, a big number gives a little bit better\n       compression ratio and slower compression process.\n       </P>\n  </DD>\n  <DT><A name=\"MatchFinderCycles\"></A>mc={N}</DT>\n  <DD>\n    <P>Sets number of cycles (passes) for match finder. It can be in range from 0 to 1000000000.\n       Default value is (16 + number_of_fast_bytes / 2) for BT* match finders and \n       (8 + number_of_fast_bytes / 4) for HC4 match finder. \n       If you specify mc=0, LZMA will use default value.\n       Usually, a big number gives a little bit better compression ratio and slower\n       compression process. For example, mf=HC4 and mc=10000 can provide almost the same\n       compression ratio as mf=BT4.</P>\n  </DD>\n  <DT><A name=\"LitContext\"></A>lc={N}</DT>\n  <DD>\n    <P>Sets the number of literal context bits (high bits of previous literal).\n       It can be in range from 0 to 8.\n       Default value is 3. Sometimes lc=4 gives gain for big files.</P>\n  </DD>\n  <DT><A name=\"LitPos\"></A>lp={N}</DT>\n  <DD>\n    <P>Sets the number of literal pos bits (low bits of current position for literals).\n       It can be in the range from 0 to 4.\n       The default value is 0. The lp switch is intended for periodical data when the \n       period is equal to 2^value (where lp=value). For example, for 32-bit (4 bytes)\n       periodical data you can use lp=2. Often it's better to set lc=0, \n       if you change lp switch.</P>\n  </DD>\n  <DT><A name=\"PosBits\"></A>pb={N}</DT>\n  <DD>\n    <P>Sets the number of pos bits (low bits of current position).\n       It can be in the range from 0 to 4.\n       The default value is 2. The pb switch is intended for periodical data when the\n       period is equal 2^value (where lp=value). </P>\n  </DD>\n  \n </DL>\n  \n <H4><A name=\"PPMd\"></A>PPMd</H4>\n <P> PPMd is a PPM-based algorithm. This algorithm is mostly based \n on Dmitry Shkarin's PPMdH source code. PPMd provides very good compression ratio for \n plain text files. There is no difference between compression speed and\n decompression speed. Memory requirements for compression and decompression\n also are the same.</P>\n <TABLE>\n   <TR> <TH width=\"80\">Parameter</TH> <TH align=\"center\">Default</TH> <TH>Description</TH> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MemorySize\">mem={Size}[b|k|m]</A></TD> \n        <TD align=\"center\">24</TD>  <TD>Sets size of used memory for PPMd.</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#Order\">o={Size}</A></TD> \n        <TD align=\"center\">6</TD>  <TD>Sets model order for PPMd.</TD> </TR>\n </TABLE>\n <DL>\n  <DT><A name=\"MemorySize\"></A>mem={Size}[b|k|m]</DT>\n  <DD>\n    <P> Sets the size of memory used for PPMd. You must specify the size in bytes, kilobytes, or megabytes.\n       The maximum value is 2GB = 2^31 bytes. The default value\n       is 24 (16MB). If you do not specify any symbol from the set [b|k|m], the\n       memory size will be calculated as (2^Size) bytes. PPMd uses the same \n       amount of memory for compression and decompression.</P>\n  </DD>\n  \n  <DT><A name=\"Order\"></A>o={Size}</DT>\n  <DD>\n    <P>Sets the model order for PPMd. The size must be in the range [2,32]. The default value is 6.</P>\n  </DD>\n </DL>\n\n <H4><A name=\"BCJ2\"></A>BCJ2</H4>\n <P>BCJ2 is a Branch converter for 32-bit x86 executables (version 2). \n It converts some branch instructions for increasing further compression.</P>\n <P>A BCJ2 encoder has one input stream and four output streams:</P>\n <UL>\n   <LI>s0: main stream. It requires further compression.</LI> \n   <LI>s1: stream for converted CALL values. It requires further compression.</LI>  \n   <LI>s2: stream for converted JUMP values. It requires further compression.</LI>  \n   <LI>s3: service stream. It is already compressed.</LI>  \n </UL>\n <P>If LZMA is used, the size of the dictionary for streams\n    s1 and s2 can be much smaller (512 KB is enough for most cases) \n    than the dictionary size for stream s0.</P>\n\n</DL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.jpg -mx0\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.jpg</SPAN> files to\n  <SPAN class=\"filename\">archive.zip</SPAN> archive without compression.</P>\n\n<PRE class=\"example\">\n7z a -t7z archive.7z *.exe *.dll -m0=BCJ -m1=LZMA:d=21 -ms -mmt\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.exe</SPAN> and <SPAN class=\"filename\">*.dll</SPAN> \nfiles to solid archive  <SPAN class=\"filename\">archive.7z</SPAN> using LZMA method with \n2 MB dictionary and BCJ converter. Compression will use multithreading optimization.</P>\n\n<PRE class=\"example\">\n7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19 \n     -mb0:1 -mb0s1:2 -mb0s2:3\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.exe</SPAN> and <SPAN class=\"filename\">*.dll</SPAN> \n  files to archive  <SPAN class=\"filename\">archive.7z</SPAN> using BCJ2 converter, \n  LZMA with 8 MB dictionary for main output stream (s0), \n  and LZMA with 512 KB dictionary for s1 and s2 output streams of BCJ2.</P>\n\n  \n<PRE class=\"example\">\n7z a -t7z archive.7z *.txt -m0=PPMd\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.txt</SPAN> files to archive  \n<SPAN class=\"filename\">archive.7z</SPAN> using PPMd method.</P>\n\n\n\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"type.htm\">-t (set Type of archive)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/output_dir.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-o (set Output directory) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-o (set Output directory) switch</H1>\n\n<P>Specifies a destination directory where files are to be extracted.</P>\n<P>This switch can be used only with extraction commands.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-o{dir_path}\n</PRE>\n\n<DL>\n  <DT>{dir_path}</DT>\n  <DD>This is the destination directory path. It's not required to end with a backslash.</DD>\n</DL>\n\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z x archive.zip -oc:\\Doc\n</PRE>\n\n<P>extracts all files from the <SPAN class=\"filename\">archive.zip</SPAN> archive\nto the <SPAN class=\"filename\">c:\\Doc</SPAN> directory.</P>\n\n<PRE class=\"example\">\n7z x *.zip -o*\n</PRE>\n\n<P>extracts all <SPAN class=\"filename\">*.zip</SPAN> archives to subfolders\nwith names of these archives.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/overwrite.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ao (Overwrite mode) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ao (Overwrite mode) switch</H1>\n\n<P>Specifies the overwrite mode during extraction, to overwrite files already present on disk.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-ao[a | s | t | u ]\n</PRE>\n\n\n<TABLE>\n  <TR> <TH width=\"80\">Switch</TH> <TH>Description</TH> </TR>\n  <TR> <TD>-aoa</TD> <TD>Overwrite All existing files without prompt.</TD> </TR>\n  <TR> <TD>-aos</TD> <TD>Skip extracting of existing files.</TD> </TR>\n  <TR> <TD>-aou</TD> <TD>aUto rename extracting file (for example, name.txt will \n      be renamed to name_1.txt).</TD> </TR>\n  <TR> <TD>-aot</TD> <TD>auto rename existing file (for example, name.txt will \n      be renamed to name_1.txt).</TD> </TR>\n</TABLE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x test.zip -aoa\n</PRE>\n\n<P>extracts all files from <SPAN class=\"filename\">test.zip</SPAN> archive and overwrites\nexisting files without any prompt.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"yes.htm\">-y (assume Yes on all queries)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/password.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-p (set Password) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-p (set Password) switch</H1>\n\n<P>Specifies password.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-p{password}\n</PRE>\n\n<DL>\n  <DT>{password}</DT>\n  <DD>Specifies password.</DD>\n</DL>\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a archive.7z -psecret -mhe *.txt\n</PRE>\n<P>compresses *.txt files to <SPAN class=\"filename\">archive.7z</SPAN> using password \n\"secret\". Also it encrypts archive headers (-mhe switch), so filenames will be encrypted.\n</P>\n\n<PRE class=\"example\">\n7z x archive.zip -psecret\n</PRE>\n<P>extracts all files from <SPAN class=\"filename\">archive.zip</SPAN> using password \n\"secret\".</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/recurse.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-r (Recurse subdirectories) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-r (Recurse subdirectories) switch</H1>\n\n<P>Specifies the method of treating wildcards and filenames on the command line.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-r[- | 0]\n</PRE>\n\n\n<TABLE>\n  <TR><TH width=\"80\">Switch</TH> <TH>Description</TH></TR>\n  <TR><TD>-r</TD> <TD>Enable recurse subdirectories.</TD></TR>\n  <TR><TD>-r-</TD> <TD>Disable recurse subdirectories. This option is default for all commands.</TD></TR>\n  <TR><TD>-r0</TD> <TD>Enable recurse subdirectories only for wildcard names.</TD></TR>\n</TABLE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z l archive.zip *.doc -r-\n</PRE>\n\n<P>lists all <SPAN class=\"filename\">*.doc</SPAN> files\n  that belong to the archived root directory\n  in the <SPAN class=\"filename\">archive.zip</SPAN> archive.\n  </P>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip -r src\\*.cpp src\\*.h\n</PRE>\n\n<P>adds all <SPAN class=\"filename\">*.cpp</SPAN> and <SPAN class=\"filename\">*.h</SPAN>\n  files from directory <SPAN class=\"filename\">src</SPAN> and all it's subdirectories\n  to the <SPAN class=\"filename\">archive.zip</SPAN> archive.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"include.htm\">-i (Include)</A>,\n  <A href=\"exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/sfx.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-sfx (Create SFX archive) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-sfx (Create SFX archive) switch</H1>\n\n<P>Creates self extracting archive.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-sfx[<A class=\"parameter\" href=\"#SFX_Module\">{SFX_Module}</A>]\n</PRE>\n\n<DL>\n  <DT><A name=\"SFX_Module\"></A>{SFX_Module}</DT>\n  <DD>\n    <P>Specifies the SFX module that will be combined with the archive.\n       This module must be placed in the same directory as the 7z.exe.\n       If {SFX_Module} is not assigned, 7-Zip will use standard console \n       SFX module 7zCon.sfx.</P>\n    <TABLE>\n      <TR> <TH width=\"60\">SFX_Module</TH> <TH>Description</TH> </TR>\n      <TR> <TD>7z.sfx</TD> <TD>Windows version.</TD> </TR>\n      <TR> <TD>7zCon.sfx</TD> <TD>Console version.</TD> </TR>\n      <TR> <TD>7zS.sfx</TD> <TD>Windows version for installers.</TD> </TR>\n      <TR> <TD>7zSD.sfx</TD> <TD>Windows version for installers (uses MSVCRT.dll).</TD> </TR>\n    </TABLE>\n  </DD>\n</DL>\n\n<P>\nAll SFX modules are uncompressed. You can use UPX program \n(http://upx.sourceforge.net) \nto compresss such modules. After compressing by the UPX program, the size of the\nsfx module will be reduced to 40-50% of its original size.\n</P>\n\n<H4>SFX modules for installers</H4>\n<P>SFX modules for installers are included in an external package (7z_extra). You can download\nthese modules from www.7-zip.org. SFX modules for installers (7zS.sfx and 7zSD.sfx)\nallow you to create your own installation program.\nSuch a module extracts the archive to the user's temp folder, and runs a specified program,\nand removes the temp files after the program finishes.\nA self-extracting archive for installers must be created as joining 3 files:\nSFX_Module, Installer_Config, 7z_Archive. \nIn addition, an optional file, Installer_Config, is allowed. You can use the following command to\ncreate an installer self-extracting archive:</P>\n<PRE class=\"example\">\ncopy /b 7zS.sfx + config.txt + archive.7z archive.exe\n</PRE>\n\n<P>An optimally small installation package size can be achieved,\nif the installation files are uncompressed before including them in the 7z archive.</P>\n\n<P><SPAN class=\"filename\">-y</SPAN> switch for installer module specifies quiet mode extraction.</P>\n\n<H4>Installer Config file format</H4>\n<P>\nThis config file contains commands for the Installer. The file begins with the string\n<B>;!@Install@!UTF-8!</B> and ends with <B>;!@InstallEnd@!</B>.\nThe file must be written in UTF-8 encoding.\nThe file contains any or all these string pairs:\n<P>ID_String=\"Value\"</P>\n<P>\n    <TABLE>\n      <TR> <TH width=\"60\">ID_String</TH> <TH>Description</TH> </TR>\n      <TR> <TD>Title</TD> <TD>Title for messages</TD> </TR>\n      <TR> <TD>BeginPrompt</TD> <TD>Begin Prompt message</TD> </TR>\n      <TR> <TD>Progress</TD> <TD>Value can be \"yes\" or \"no\". Default value is \"yes\".</TD> </TR>\n      <TR> <TD>RunProgram</TD> <TD>Command for executing. Default value is \"setup.exe\". Substring <B>%%T</B> \n      will be replaced with path to temporary folder, where files were extracted</TD> </TR>\n      <TR> <TD>Directory</TD> <TD>Directory prefix for \"RunProgram\". Default value is \".\\\\\"</TD> </TR>\n      <TR> <TD>ExecuteFile</TD> <TD>Name of file for executing</TD> </TR>\n      <TR> <TD>ExecuteParameters</TD> <TD>Parameters for \"ExecuteFile\"</TD> </TR>\n    </TABLE>\n</P>\n<P>You may omit any pair.</P>\n\n<P>There are two ways to run a installation program: <B>RunProgram</B> and <B>ExecuteFile</B>.\nUse <B>RunProgram</B>, if you want to run a program from the .7z archive.\nUse <B>ExecuteFile</B>, if you want to open a document from the .7z archive, or\nif you want to execute a command from Windows.</P>\n\n<P>If you use <B>RunProgram</B>, and if you specify empty directory prefix: <B>Directory</B>=\"\",\nthe system searches for the executable file in the following sequence:</P>\n<OL>\n<LI>The directory from which the application (installer) loaded. \n<LI>The temporary folder, where files were extracted.\n<LI>The Windows system directory. \n</OL>\n\n<H4>Config file Examples</H4>\n\n<PRE class=\"example\">\n;!@Install@!UTF-8!\nTitle=\"7-Zip 4.00\"\nBeginPrompt=\"Do you want to install the 7-Zip 4.00?\"\nRunProgram=\"setup.exe\"\n;!@InstallEnd@!\n</PRE>\n\n<BR>\n\n\n<PRE class=\"example\">\n;!@Install@!UTF-8!\nTitle=\"7-Zip 4.00\"\nBeginPrompt=\"Do you want to install the 7-Zip 4.00?\"\nExecuteFile=\"7zip.msi\"\n;!@InstallEnd@!\n</PRE>\n\n<BR>\n\n<PRE class=\"example\">\n;!@Install@!UTF-8!\nTitle=\"7-Zip 4.01 Update\"\nBeginPrompt=\"Do you want to install the 7-Zip 4.01 Update?\"\nExecuteFile=\"msiexec.exe\"\nExecuteParameters=\"/i 7zip.msi REINSTALL=ALL REINSTALLMODE=vomus\"\n;!@InstallEnd@!\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -sfx a.exe *.txt\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.txt</SPAN> files to self extracting \n  archive  <SPAN class=\"filename\">a.exe</SPAN> using the default console SFX module.</P>\n\n<PRE class=\"example\">\n7z a -sfx7z.sfx a.exe *\n</PRE>\n\n<P>adds all files to self extracting archive <SPAN class=\"filename\">a.exe</SPAN>\nwith module <SPAN class=\"filename\">7z.sfx</SPAN> using windows version of SFX mudule.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/ssc.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ssc (Set Sensitive Case mode) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ssc (Set Sensitive Case mode) switch</H1>\n\n<P>Sets sensitive case mode for file names.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-scs[-]\n</PRE>\n\n<TABLE>\n  <TR><TH width=\"80\">Switch</TH> <TH>Description</TH></TR>\n  <TR><TD>-ssc</TD> <TD>Set case-sensitive mode. It's default for Posix/Linux systems.</TD></TR>\n  <TR><TD>-ssc-</TD> <TD>Set case-insensitive mode. It's default for Windows systems.</TD></TR>\n</TABLE>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a archive.7z A*.txt -ssc -r\n</PRE>\n\n<P>compresses all <SPAN class=\"filename\">A*.txt</SPAN> files\n  from current directory and all it's subdirectories. That command doesn't compress\n  <SPAN class=\"filename\">a*.txt</SPAN> files.\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/stdin.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-si (read data from stdin) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-si (read data from stdin) switch</H1>\n\n<P>Causes 7-Zip to read data from stdin (standard input) instead of from disc files.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-si{file_name}\n</PRE>\n\n<DL>\n  <DT>{file_name}</DT>\n  <DD>Specifies a name that will be stored in the archive for the compressed data.\n    If file_name is not specified, data will be stored without a name.</DD>\n</DL>\n\n<P>Note: The current version of 7-Zip does not support reading of archives from stdin.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a archive.gz -tgzip -siDoc2.txt < Doc.txt\n</PRE>\n\n<P>compresses input stream from file Doc.txt to \n<SPAN class=\"filename\">archive.gz</SPAN> archive\nusing <SPAN class=\"filename\">Doc2.txt</SPAN> file name.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/stdout.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-so (write data to stdout) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-so (write data to stdout) switch</H1>\n\n<P>Causes 7-Zip to write output data to stdout (standard output stream).</P> \n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-so\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x archive.gz -so > Doc.txt\n</PRE>\n\n<P>decompresses <SPAN class=\"filename\">archive.gz</SPAN> \narchive to output stream and then redirects that stream to\n<SPAN class=\"filename\">Doc.txt</SPAN> file.</P>\n\n\n<PRE class=\"example\">\n7z a dummy -tgzip -so Doc.txt > archive.gz\n</PRE>\n\n<P>compresses the <SPAN class=\"filename\">Doc.txt</SPAN> file to the 7-Zip standard\noutput stream and writes that stream to \n<SPAN class=\"filename\">archive.gz</SPAN> file.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/stop_switch.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-- (Stop switches parsing) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-- (Stop switches parsing) switch</H1>\n\n<P>Disables switch parsing after \"--\" on the command line.\nThis is to allow 7-Zip to use file names that start with \"-\".\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n--\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -- -ArchiveName.7z\n</PRE>\n\n<P>tests <SPAN class=\"filename\">-ArchiveName.7z</SPAN> archive.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/type.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-o (set Output directory) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-t (set Type of archive) switch</H1>\n\n<P>Specifies the type of archive.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-t{archive_type}\n</PRE>\n\n<DL>\n  <DT>{archive_type}</DT>\n  <DD>Specifies the type of archive. It can be: 7z, split, zip, gzip, bzip2, tar, ....\n  7z format is the default.\n</DD>\n</DL>\n\n<P>If -t{archive_type} switch is not specified, 7-Zip uses extension of archive to \n  detect the type of archive.</P>\n\n<P>Note: gzip or bzip2 formats support only one file per archive.\nIf you want to compress more than one file to these formats,\ncreate a tar archive first, and then compress it with your selected format.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.txt\n</PRE>\n\n<P>adds all <SPAN class=\"filename\">*.txt</SPAN> files from current directory \nto zip archive <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n<PRE class=\"example\">\n7z t -t7z.split archive.7z.001\n</PRE>\n\n<P>tests all files in <SPAN class=\"filename\">archive.7z.001</SPAN>. It also checks\nthat archive is multivolume .7z archive.</P>\n\n<PRE class=\"example\">\n7z x -tiso archive.iso\n</PRE>\n\n<P>extracts files from <SPAN class=\"filename\">archive.iso</SPAN> open as ISO archive.\n\n<PRE class=\"example\">\n7z x -tudf archive.iso\n</PRE>\n\n<P>extracts files from <SPAN class=\"filename\">archive.iso</SPAN> open as UDF archive.\n\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/update.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-u (Update options) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-u (Update options) switch</H1>\n\n<P>Specifies how to update files in an archive and (or) how to create new archives.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-u<A class=\"parameter\" href=\"#disable_base_archive\">[-]</A>&lt;action_set><A class=\"parameter\" href=\"#new_archive_name\">[!{new_archive_name}]</A>\n\n  &lt;action_set> ::= &lt;state_action>...\n\n    &lt;state_action> ::= <A class=\"parameter\" href=\"#state\">&lt;state></A><A class=\"parameter\" href=\"#state\">&lt;action></A>\n\n      <A class=\"parameter\" href=\"#action\">&lt;state></A> ::= p | q | r | x | y | z | w\n\n      <A class=\"parameter\" href=\"#action\">&lt;action></A> ::= 0 | 1 | 2 | 3\n</PRE>\n\n\n<H4>Parameters</H4>\n\n<DL>\n  <DT><A name=\"disable_base_archive\"></A>dash (-)</DT>\n  <DD><P>Disables any updates in the base archive.</P>\n\n      <P>The term <B>base archive</B> means the archive assigned by \"base_archive_name\"\n      on the command line. See <A href=\"../syntax.htm\">Command line syntax</A>\n      for more details.</P>\n  </DD>\n  <DT><A name=\"new_archive_name\"></A>{new_archive_name}</DT>\n  <DD><P>Specifies the path name of the new archive to be created.\n    All options in this switch will refer to this new archive.</P>\n    <P>If not assigned, then all options in this switch will\n                  refer to the base archive of the command.</P>\n  </DD>\n  <DT><A name=\"state\"></A>&lt;state></DT>\n  <DD><P>Specifies the state of a particular file to be processed.</P>\n    <PRE class=\"syntax\">&lt;state> ::= p | q | r | x | y | z | w</PRE>\n    <P>For each unique filename there are 6 variants of state:</P>\n    <TABLE>\n      <TR> <TH>&lt;state></TH> <TH>State condition</TH>\n           <TH width=\"20%\">File on Disk</TH> <TH width=\"20%\">File in Archive</TH> </TR>\n\n      <TR> <TD align=\"center\">p</TD> <TD>File exists in archive, but is not matched with wildcard.</TD>\n           <TD>&nbsp;</TD> <TD>Exists, but is not matched</TD> </TR>\n\n      <TR> <TD align=\"center\">q</TD> <TD>File exists in archive, but doesn't exist on disk.</TD>\n           <TD>Doesn't exist</TD> <TD>Exists</TD> </TR>\n\n      <TR> <TD align=\"center\">r</TD> <TD>File doesn't exist in archive, but exists  on disk.</TD>\n           <TD>Exists</TD> <TD>Doesn't exist</TD> </TR>\n\n      <TR> <TD align=\"center\">x</TD> <TD>File in archive is newer than the file on disk.</TD>\n           <TD>Older</TD> <TD>Newer</TD> </TR>\n\n      <TR> <TD align=\"center\">y</TD> <TD>File in archive is older than the file on disk.</TD>\n           <TD>Newer</TD> <TD>Older</TD> </TR>\n\n      <TR> <TD align=\"center\">z</TD> <TD>File in archive is same as the file on disk</TD>\n           <TD>Same</TD> <TD>Same</TD> </TR>\n\n      <TR> <TD align=\"center\">w</TD> <TD>Can not be detected what file is newer  \n              (times are the same, sizes are different)</TD>\n           <TD>?</TD> <TD>?</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"action\"></A>&lt;action></DT>\n  <DD><P>Specifies the action for a given <A class=\"parameter\" href=\"#state\">&lt;state></A>.</P>\n    <PRE class=\"syntax\">&lt;action> ::= 0 | 1 | 2 | 3</PRE>\n    <P>For each state you can specify one of the three variants of actions:</P>\n    <TABLE>\n      <TR> <TH>&lt;action></TH> <TH>Description</TH></TR>\n      <TR> <TD align=\"center\">0</TD> <TD>Ignore file (don't create item in new archive for this file)</TD></TR>\n      <TR> <TD align=\"center\">1</TD> <TD>Copy file (copy from old archive to new)</TD></TR>\n      <TR> <TD align=\"center\">2</TD> <TD>Compress (compress file from disk to new archive)</TD></TR>\n      <TR> <TD align=\"center\">3</TD> <TD>Create Anti-item (item that will delete file or directory during extracting). This feature is supported only in 7z format.</TD></TR>\n    </TABLE>\n  </DD>\n</DL>\n\n\n<H4>Remarks</H4>\n\n<P>Any update command (such as <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>) can be assigned in these terms.</P>\n<P>The following table shows action sets for update commands.</P>\n\n<TABLE>\n  <TR> <TH>command \\ <A class=\"parameter\" href=\"#state\">&lt;state></A></TH>\n              <TH>p</TH> <TH>q</TH> <TH>r</TH> <TH>x</TH> <TH>y</TH> <TH>z</TH> <TH>w</TH></TR>\n  <TR> <TH><A href=\"../commands/delete.htm\">d (Delete)</A></TH> <TD>1</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD></TR>\n  <TR> <TH><A href=\"../commands/add.htm\">a (Add)</A></TH> <TD>1</TD> <TD>1</TD> <TD>2</TD> <TD>2</TD> <TD>2</TD> <TD>2</TD>  <TD>2</TD></TR>\n  <TR> <TH><A href=\"../commands/update.htm\">u (Update)</A></TH> <TD>1</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>\n  <TR> <TH><A href=\"../commands/update.htm\">Freshen</A></TH> <TD>1</TD> <TD>1</TD> <TD>0</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>\n  <TR> <TH><A href=\"../commands/update.htm\">Synchronize</A></TH> <TD>1</TD> <TD>0</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>\n</TABLE>\n\n\n<P>If you don't specify a\n<A class=\"parameter\" href=\"#new_archive_name\"><I>!{new_archive_name}</I></A> option, then\nall options will refer to the main archive (the archive assigned on the command line after the 7z command).\nIf you specify <A class=\"parameter\" href=\"#new_archive_name\"><I>!{new_archive_name}</I></A>\noption, then 7-Zip also will create a new archive with the specified name and all options\nwill refer to that new archive.</P>\n\n<P>Multiple update switches are supported.\n7-Zip can create any number of new archives during one operation.</P>\n\n<P>By default, the action set for each new archive is assigned\nas the action set of the main command. There are 3 different\naction sets for commands: <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>.\nYou can overload any &lt;state_action> pair.</P>\n\n<H4>Time zone notes</H4>\n<P>If you change time zone (when you move your computer to another time zone \nor if there are clock changes for daylight saving in your zone), you can have some problems \nwith update commands that depend from file's modification time. It's strongly recommended to use only \nfile system that uses Coordinated Universal Time (UTC) and archive format that also uses UTC. \nIn that case you will have no problems with time zone changes.\nAlso it's recommended to use only UTC formats in other cases, for example, if you send files to \nsomeone in another time zone.</P>\n\n<P>Also in some cases there are no problems, if both file system and archive format use local time, for example, FAT file system and ZIP format.</P> \n<UL>\n<LI>UTC file systems: NTFS\n<LI>UTC archive formats: .zip with -mtc switch, 7z, tar, gzip2, iso, wim\n<LI>Local time file systems : FAT, FAT32\n<LI>Local time archive formats : rar, zip, cab\n</UL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z u c:\\1\\exist.7z -u- -up0q3x2z0!c:\\1\\update.7z *\n</PRE>\n\n<P>creates a new archive <SPAN class=\"filename\">update.7z</SPAN> and\nwrites to this archive all files from current directory which differ from\nfiles in <SPAN class=\"filename\">exist.7z</SPAN> archive.\n<SPAN class=\"filename\">exist.7z</SPAN> archive will not be changed.</P>\n\n<PRE class=\"example\">\n7z u c:\\1\\exist.7z -up0q3x2z0!c:\\1\\update.7z * -ms=off\n</PRE>\n\n<P>creates a new archive <SPAN class=\"filename\">update.7z</SPAN> and\nwrites to this archive all files from the current directory which differ from\nfiles in <SPAN class=\"filename\">exist.7z</SPAN> archive.\n\n<P>Note: The current version of 7-Zip cannot change an archive created with the solid option switched on.\nTo update a .7z archive, you must create and update the archive in non-solid\nmode (-ms=off switch).</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/volume.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-v (Create Volumes) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-v (Create Volumes) switch</H1>\n\n<P>Specifies volume sizes.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-v{Size}[b | k | m | g]\n\n</PRE>\n<DL>\n  <DT>{Size}[b | k | m | g]</DT>\n  <DD>Specifies volume size in Bytes, Kilobytes (1 Kilobyte = 1024 bytes),\n  Megabytes (1 Megabyte = 1024 Kilobytes) or Gigabytes (1 Gigabyte = 1024 Megabytes).\n  if you specify only {Size}, 7-zip will treat it as bytes.</DD>\n</DL>\n\n<P>It's possible to specify several -v switches.</P>\n\n<P><B>NOTE:</B> Please don't use volumes (and don't copy volumes) before finishing archiving. \n7-Zip can change any volume (including first volume) at the end of archiving operation.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a a.7z *.txt -v10k -v15k -v2m\n</PRE>\n\n<P>creates multivolume <SPAN class=\"filename\">a.7z</SPAN> archive.\nFirst volume will be 10 KB, second will be 15 KB, and all others will be 2 MB.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/working_dir.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-w (set Working directory) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-w (set Working directory) switch</H1>\n\n<P>Sets the working directory for the temporary base archive. By\ndefault, 7-Zip builds a new base archive file in the same directory as the\nold base archive file. By specifying this switch, you can set the\nworking directory where the temporary base archive file will be built.\nAfter the temporary base archive file is built, it is copied over the\noriginal archive; then, the temporary file is deleted.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-w[<A class=\"parameter\" href=\"#dir_path\">{dir_path}</A>]\n</PRE>\n\n<DL>\n  <DT><A name=\"dir_path\"></A>{dir_path}</DT>\n  <DD>\n    <P>Specifies the destination directory path. It's not required that\n      a path end with a backslash.</P>\n    <P>If &lt;dir_path> is not assigned, then 7-Zip will use the Windows temporary directory.</P>\n  </DD>\n</DL>\n\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.cpp -wc:\\temp\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.cpp</SPAN> files to the\n<SPAN class=\"filename\">archive.zip</SPAN> archive, creating a temporary archive\nin <SPAN class=\"filename\">c:\\temp</SPAN> folder.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/switches/yes.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-y (assume Yes on all queries) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-y (assume Yes on all queries) switch</H1>\n\n<P>Disables most of the normal user queries during 7-Zip\nexecution. You can use this switch to suppress overwrite queries in the\n<A href=\"../commands/extract.htm\">e (Extract)</A> and\n<A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A> commands.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">-y</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x src.zip -y\n</PRE>\n\n<P>extracts all files from\n  <SPAN class=\"filename\">src.zip</SPAN> archive. All overwrite queries will be\nsuppressed and files on disk with same filenames as in archive will be\noverwritten.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"overwrite.htm\">-ao (Overwrite mode)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/MANUAL/syntax.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Syntax</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Syntax</H1>\n\n<PRE class = \"syntax\">\n7z <A href = \"commands/index.htm\">&lt;command></A> [<A href = \"switches/index.htm\">&lt;switch></A>...] &lt;base_archive_name> [&lt;arguments>...]\n</PRE>\n<PRE class = \"syntax\">\n&lt;arguments> ::= <A href = \"switches/index.htm\">&lt;switch></A> | &lt;wildcard> | &lt;filename> | &lt;list_file>\n<A href = \"switches/index.htm\">&lt;switch></A>::= &lt;switch_symbol>&lt;switch_characters>[&lt;option>]\n&lt;switch_symbol> ::= '/' | '-' \n&lt;list_file> ::= @{filename}\n</PRE>\n\n\n<P>Expressions in square brackets (between '[' and ']') are optional.</P>\n\n<P>Expressions in curly braces ('{' and '}') mean that instead of that \nExpression (including braces), the user must substitute some string.</P>\n\n<P>Expression</P>\n\n<PRE class = \"syntax\">\nexpression1 | expression2 | ... | expressionN</DT>\n</PRE>\n\n<P>\nmeans that any (but only one) from these expressions must be specified.\n\n<P><A href = \"commands/index.htm\">Commands</A> and\n<A href = \"switches/index.htm\">switches</A> can be entered in upper or lower case.</P>\n\n<P>Command is the first non-switch argument.</P>\n\n<P>The \"base_archive_name\" must be the first filename on the command line\nafter the command.</P>\n\n<P>The switches and other filenames can be in any order.</P>\n\n<P>Wildcards or filenames with spaces must be quoted:</P>\n\n<PRE>\n    \"Dir\\Program files\\*\"\n    Dir\\\"Program files\"\\*\n</PRE>\n\n<P>Switch options can be combined to save command line length. However, some\nswitch options take optional string arguments and therefore, must be the\nlast option in a combined argument token string because 7-Zip accepts the\nrest of the argument token as the optional argument.</P>\n\n<P>7-Zip uses wild name matching similar to Windows 95:</P>\n<UL>\n  <LI><B>'*'</B> means a sequence of arbitrary characters.</LI>\n  <LI><B>'?'</B> means any character.</LI>\n</UL>\n\n<P><B>\n7-Zip doesn't uses the system wildcard parser.   7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process all files, you must\nuse a * wildcard.</B></P>\n\n<P>Examples:</P>\n<TABLE border = \"0\">\n  <TR><TD>*.txt</TD><TD>means all files with an extension of \".txt\"</TD></TR>\n  <TR><TD>?a*</TD><TD>means all files with a second character of \"a\"</TD></TR>\n  <TR><TD>*1*</TD><TD>means all names that contains character \"1\"</TD></TR>\n  <TR><TD>*.*.*</TD><TD>means all names that contain two at least \".\" characters</TD></TR>\n</TABLE>\n\n\n<P>The default wildcard \"*\" will be used if there is no filename/wildcard in the\ncommand line.</P>\n\n<P>Slash ('\\') at the end of a path means a directory. Without a Slash ('\\') at\nthe end of the path, the path can refer either to a file or a directory.\n\n\n<H2><A name = \"ListFile\"></A>List file</H2>\n\n<P>You can supply one or more filenames or wildcards for special list files\n(files containing lists of files). The filenames in such list file must be\nseparated by new line symbol(s).</P>\n\n<P>For list files, 7-Zip uses UTF-8 encoding by default. You can change encoding\nusing <A href = \"switches/charset.htm\">-scs</A> switch.</P>\n\n<P>Multiple list files are supported.</P>\n\n<P>For example, if the file \"listfile.txt\" contains the following:</P>\n\n<PRE>\n    My programs\\*.cpp\n    Src\\*.cpp\n</PRE>\n<P>then the command</P>\n\n<PRE>\n    7z a -tzip archive.zip @listfile.txt\n</PRE>\n\n<P>adds to the archive \"archive.zip\" all \"*.cpp\" files from directories \"My\nprograms\" and \"Src\".</P>\n\n<H2><A name = \"ListFile\"></A>Short and Long File Names</H2>\n\n<P>7-Zip supports short file names  (like FILENA~1.TXT) in some cases. \nHowever, it's strongly recommended to use only the real (long) file names.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/Methods.txt",
    "content": "7-Zip method IDs (4.65)\n-----------------------\n\nEach compression or crypto method in 7z has unique binary value (ID).\nThe length of ID in bytes is arbitrary but it can not exceed 63 bits (8 bytes).\n\nIf you want to add some new ID, you have two ways:\n1) Write request for allocating IDs to 7-zip developers.\n2) Generate 8-bytes ID:\n\n    3F ZZ ZZ ZZ ZZ ZZ MM MM \n\n    3F              - Prefix for random IDs (1 byte)\n    ZZ ZZ ZZ ZZ ZZ  - Developer ID (5 bytes). Use real random bytes. \n                      \n    MM MM           - Method ID (2 bytes)\n\n    You can notify 7-Zip developers about your Developer ID / Method ID.\n\n    Note: Use new ID only if old codec can not decode data encoded with new version.\n\n\nList of defined IDs\n-------------------\n      \n00 - Copy\n\n02 - Common\n   03 Swap\n      - 2 Swap2\n      - 4 Swap4\n\n03 - 7z\n   01 - LZMA\n      01 - Version\n  \n   03 - Branch\n      01 - x86\n         03  - BCJ\n         1B  - BCJ2\n      02 - PPC\n         05 - PPC (Big Endian)\n      03 - Alpha\n         01 - Alpha\n      04 - IA64\n         01 - IA64\n      05 - ARM\n         01 - ARM\n      06 - M68\n         05 - M68 (Big Endian)\n      07 - ARM Thumb\n         01 - ARMT\n      08 - SPARC\n         05 - SPARC\n\n   04 - PPMD\n      01 - Version\n\n   7F -\n      01 - experimental methods.\n\n\n04 - Misc\n   00 - Reserved\n   01 - Zip\n      00 - Copy (not used). Use {00} instead\n      01 - Shrink\n      06 - Implode\n      08 - Deflate\n      09 - Deflate64\n      12 - BZip2 (not used). Use {04 02 02} instead\n   02 - BZip\n      02 - BZip2\n   03 - Rar\n      01 - Rar15\n      02 - Rar20\n      03 - Rar29\n   04 - Arj\n      01 - Arj (1,2,3)\n      02 - Arj 4\n   05 - Z\n   06 - Lzh\n   07 - Reserved for 7z\n   08 - Cab\n   09 - NSIS\n      01 - DeflateNSIS\n      02 - BZip2NSIS\n\n\n06 - Crypto \n   00 - \n   01 - AES\n      0x - AES-128\n      4x - AES-192\n      8x - AES-256\n      Cx - AES\n\n      x0 - ECB\n      x1 - CBC\n      x2 - CFB\n      x3 - OFB\n\n   07 - Reserved\n   0F - Reserved\n\n   F0 - Misc Ciphers (Real Ciphers without hashing algo)\n\n   F1 - Misc Ciphers (Combine)\n      01 - Zip\n         01 - Main Zip crypto algo\n      03 - RAR\n         02 - \n         03 - Rar29 AES-128 + (modified SHA-1)\n      07 - 7z\n         01 - AES-256 + SHA-256\n\n07 - Hash (subject to change)\n   00 - \n   01 - CRC\n   02 - SHA-1\n   03 - SHA-256\n   04 - SHA-384\n   05 - SHA-512\n\n   F0 - Misc Hash\n\n   F1 - Misc\n      03 - RAR\n         03 - Rar29 Password Hashing (modified SHA1)\n      07 - 7z \n         01 - SHA-256 Password Hashing\n    \n   \n\n\n---\nEnd of document\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/copying.txt",
    "content": "      GNU LESSER GENERAL PUBLIC LICENSE\n           Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n          Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n      GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n          NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n         END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/history.txt",
    "content": "Sources history of the 7-Zip\n----------------------------\n\n4.61           2008-11-23\n-------------------------\n- Bug in ver. 4.58+ was fixed:\n   7-Zip didn't use any -m* switch after -mtc, -mcl or -mcu for .zip archives. \n- Bug in .CAB code was fixed. 7-Zip didn't show some empty files,\n  if .CAB archive contains more than one empty file.\n   \n\n4.59           2008-07-27\n-------------------------\n- Bug was fixed:\n   LZMA Encoder in fast compression mode could access memory outside of \n   allocated range in some rare cases.\n   \n\n4.59 alpha     2008-05-30\n-------------------------\n- BUGS was fixed: \n    7zOut.cpp: 7-Zip incorrectly wrote size of property records in some cases.\n    7zIn.cpp:  7-Zip incorrectly work with archive, containg archive properties.\n\n4.58 alpha 9   2008-04-29\n-------------------------\n- BUG was fixed: 7-Zip showed incorrect timestamps in ISO files.\n\n\n4.58 alpha 8   2008-04-15\n-------------------------\n- BUG in 4.58 alpha 5/6/7 was fixed:\n    LZMA encoder worked incorrectly, if lp != 0.\n- Unicode (UTF-8) support for filenames in .ZIP archives. Now there are 3 modes:\n    1) Default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.\n    2) -mcu switch:  7-Zip uses UTF-8, if there are non-ASCII symbols.\n    3) -mcl switch:  7-Zip uses local code page.\n- Now it's possible to use -mSW- and -mSW+ switches instead of -mSW=off and -mSW=on  \n\n\n4.58 alpha 7   2008-04-08\n-------------------------\n- BUG was fixed: BZip2Encoder and BZip2Decoder used CEvent objects without \n  creating, when BZip2 code was called with one thread (with -mmt1 switch or with \n  default switches on single thread CPU).\n- .lzma support.\n- RPM and NSIS support was improved.\n- LZMA now stores only (2 << n) or (3 << n) dictionary size value to LZMA properties.\n\n\n4.58 alpha 6   2008-03-27\n-------------------------\n- NTFS time extra in ZIP.\n- New item property - kpidTimeType - VT_UI4 (0 - NTFS, 1 - Unix, 2 - DOS).\n- Static CRC table is not required now for Lzma Encoder (in Lz MatchFinder).\n\n\n4.58 alpha 5   2008-03-19\n-------------------------\n- Creation time (-mtc switch) for .7z archives\n- LZMA encoder was converted to ANSI-C\n\n\n4.58 alpha 3   2008-02-25\n-------------------------\n- Speed optimizations for LZMA decoding. Now it uses C code instead of C++.\n- 7-Zip now has 128 MB dictionary limit for 32-bit version:\n  It's for speed optimization: kNumLogBits = 9 + sizeof(size_t) / 2;\n- TAR: 'D' link flag support.\n- 7-Zip now can unpack multivolume RAR archives created with \n  \"old style volume names\" scheme (-vn switch) and names *.001, *.002, ...\n- Fixed bugs:\n  - 7-Zip FM could not copy / move files to root network folders like \\\\COMPNAME\\FOLDERNAME\\\n    In case of move it removed original files.\n  - SFX-WIN: if there are errors, it still could return 0.\n  - ZIP (.XPS file) isZip64 && thisDiskNumber16 == 0xFFFF.\n  - ZIP name updating:\n      If zip file contains extra field and you try to change properties of files,\n      7-zip tries to delete all extra fileds (except for WzAES).\n      And that code could hang.\n  -  7-Zip GUI didn't suggest BZip2 dictionary size used in previous run.\n  -  If creation time stamp was included in .RAR archive, 7-zip used creation time stamp \n     as modification time stamp.\n\n4.58 alpha 2   2007-12-31\n-------------------------\n- Small changes in Deflate and LZMA compression.\n- Some speed optimizations.\n\n\n4.57\n----\n- Bug was fixed:\n  Anti item is created for wrong file:\n  http://sourceforge.net/forum/forum.php?thread_id=1880366&forum_id=45798\n\n\n4.52 beta      2007-07-32\n-------------------------\n- 7-Zip could not decompress some cab files\n- \".\" dir creating at FAT was fixed / long names\n\n\n4.50 beta      2007-07-24\n-------------------------\n- 7-Zip now replaces unsupported filenames (like \"nul\", \"com1\") during extracting.\n- New switch for command line version:\n    -ssc[-] enables/disables case-sensitive mode.\n- 7z.exe l shows archive comment for zip archives\n- Some bugs were fixed: long paths names shorter than 4.\n- Speed optimizations for AES encryption.\n\n\n\n4.56 beta      2007-09-13\n-------------------------\n- some fixes in LZ encoder (LZMA and Deflate) code.\n size_t was replaces to ptrdiff_t.\n size_t version worked incorrectly with some compilers.\n\n \n4.46 beta      2007-05-25\n-------------------------\n- CPP Synchronization objects now return HRes (error code) instead of bool.\n\n\n4.45 beta      2007-04-16\n-------------------------\n- 7-Zip now uses C version of CRC, so you must call CrcGenerateTable at \n  stratup code, or you must add CPP/Common/CRC.cpp to your project.\n- Method ID in .7z now is 63-bit integer (UInt64).\n- Open error messages\n- unRar 1.5 fixed\n- unShrink fixed\n- BUG of 4.43 beta and 4.44 beta was fixed.\n  7-Zip compressing to .zip in multi-threading mode didn't work in some cases.\n\n\n4.44 beta      2007-01-20\n-------------------------\n\n- Bug was fixed: LZMAEncoder.cpp::CEncoder::GetOptimumFast\n  it was:\n    data++\n  fixed version:\n    data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1;\n  It could lead to very small cpmpression ratio decreasing when block needs move.\n\n\n4.30 beta      2005-11-18\n-------------------------\n- Security.h::AddLockMemoryPrivilege       - installs \"Large pages\" feature\n- MemoryLock.h::EnableLockMemoryPrivilege  - enables \"Large pages\" feature\n- Alloc.h::SetLargePageSize                - sets optimal LargePageSize size\n\n\n4.27           2005-09-21\n-------------------------\n- Some GUIDs/interfaces were changed.\n IStream.h:\n   ISequentialInStream::Read now works as old ReadPart\n   ISequentialOutStream::Write now works as old WritePart\n\n\n4.26 beta      2005-08-05\n-------------------------\n-  MyAlloc(0)/BigAlloc(0) now return 0\n\n\n4.25 beta      2005-07-31\n-------------------------\n-  More 64-bit compatibilty\n\n\n4.24 beta      2005-07-06\n-------------------------\n-  Common\\NewHandler.h: using throw() for code size optimization.\n\n\n4.23           2005-06-29\n-------------------------\n-  Bug was fixed: memory leak in Cab decoder.\n\n\n4.19 beta      2005-05-21\n-------------------------\n-  BZip2 code was rewritten. Now 7-Zip doesn't use original BZip2 code.\n  Old (original) version was moved to folder 7zip/Compress/BZip2Original/\n\n\n4.14 beta      2005-01-11\n-------------------------\n-  STL using was reduced\n-  7za now supports Split(001) archves\n\n\n4.10 beta      2004-10-21\n-------------------------\n-  Codecs now use new interface: ICompressSetDecoderProperties2\n\n\n4.07 beta      2004-10-03\n-------------------------\n-  some interfaces were changed slightly to support \n  -stdin -stdout mode.\n-  FilterCoder for simple filters\n-  Wildcard censor class was changed.\n-  Bug was fixed: when encrypted stream was multiple 16,\n  it used additional 16 empty bytes.\n\n\n3.11           2003-10-06\n-------------------------\n  File functions support unicode strings even\n  on Windows 95/98/ME.\n\n\n3.08.02        2003-09-20\n-------------------------\n  More compatible with GCC.\n\n\n3.08.02 beta   2003-08-20\n-------------------------\n  Extracting bug in 7zExtract.cpp was fixed.\n \n\n3.08 beta      2003-08-19\n-------------------------\n  Big source code reconstruction.\n \n\n2.30 Beta 32   2003-05-15\n-------------------------\n  Small changes in Deflate decoder.\n \n\n2.30 Beta 31   2003-04-29\n-------------------------\n  Common/NewHandler.cpp\n    HeapAlloc in (included to beta 30) was changed to malloc.\n    HeapAlloc worked slower in Win95/98/Me.\n \n\n2.30 Beta 30   2003-04-21\n-------------------------\n  new file: Common/String.cpp\n  Common/NewHandler.*  were changed\n\n\n2.30 Beta 29   2003-04-07\n-------------------------\n  Small changes in LZMA code.\n\n\n2.30 Beta 28   2003-02-16\n-------------------------\n  Processing anti-files was corrected.\n\n\n2.30 Beta 27   2003-01-24\n-------------------------\n  Project/Archiver/Format/Common/ArchiveInterface.h:\n    new IArchiveOpenVolumeCallback interface.\n\n\n2.30 Beta 26   2003-01-12\n-------------------------\n  SDK/Interface/PropID.h:\n    kpidComment now is kpidCommented\n\n\n2.30 Beta 25   2003-01-02\n-------------------------\n  Main archive interfaces were changed.\n\n\n2.30 Beta 24   2002-11-01\n-------------------------\n  SDK/Windows/Synchronization.h \n  SDK/Windows/Synchronization.cpp\n    - some changes.\n\n\n2.30 Beta 23   2002-09-07\n-------------------------\n  Project/FileManager folder was added.\n  Notation of some source files was changed.\n\n\n2.30 Beta 22   2002-08-28\n-------------------------\n  Project/FileManager folder was added.\n  Notation of some source files was changed.\n\n\n\n2.30 Beta 21   2002-07-08\n-------------------------\n  Project/Compress/LZ/MatchFinder/BinTree/BinTree.h\n  Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h\n  Project/Compress/LZ/MatchFinder/BinTree/HC.h\n  Project/Compress/LZ/MatchFinder/BinTree/HCMain.h\n    - RAM requirements for LZMA (7z) compression were reduced.\n\n\n2.30 Beta 20   2002-07-01\n-------------------------\n- SDK/Stream/WindowOut.h \n    now it uses only required memory (dictionary size).\n- Project/Archiver/Resource \n    contains common resurces\n\n\n2.30 Beta 19   2002-04-11\n-------------------------\n- SDK/Archive/Rar/Handler.cpp\n    supporting RAR29\n\n2.30 Beta 18   2002-03-25\n-------------------------\n- SDK/Archive/Cab/MSZipDecoder.cpp\n  SDK/Archive/Cab/LZXDecoder.cpp:\n    bug with corrupted archives was fixed\n- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h \n- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h \n    some speed optimization (using prefetching)\n\n\n2.30 Beta 17   2002-03-03\n-------------------------\n- ARJ suppport.\n\n\n2.30 Beta 16   2002-02-24\n-------------------------\n- Project/Compress/LZ/LZMA/Decoder.cpp:\n    Bug was fixed: LZMA could not extract more than 4 GB.\n- RPM and CPIO formats.\n- Project/Compress/LZ/LZMA/Encoder.*\n  Project/Archiver/Format/7z/OutHandler.cpp \n    New fast compression mode for LZMA: -m0a=0.\n- New match finders for LZMA: bt4b, hc3, hc4.\n\n\n2.30 Beta 15   2002-02-17\n-------------------------\n- Compression ratio in LZMA was slightly improved:\n    Project/Compress/LZ/LZMA/Encoder.*\n    Project/Archiver/Format/7z/OutHandler.cpp \n\n\n2.30 Beta 14   2002-02-10\n-------------------------\n- Supporting multithreading for LZMA:\n    Project/Compress/LZ/MatchFinder/MT \n- Common/String.h:\n    CStringBase::Replace function was fixed.\n\n\n2.30 Beta 13   2002-01-27\n-------------------------\n- Compress/LZ/MatchFinder/BinTree3.h: \n   method\n- Compress/LZ/MatchFinder/BinTreemain.h: \n    - one VirtualAlloc array was splitted to \n      the for 3 arrays.\n    - Hash-functions were changed.\n\n\n\n2.30 Beta 12   2002-01-16\n-------------------------\n- Compress/LZ/MatchFinder/BinTreemain.h: \n  Compress/LZ/MatchFinder/Patricia.h: \n  Compress/PPM/PPMd/SubAlloc.h: \n    Beta 11 bugs were fixed:\n      - VirtualFree was used incorrectly\n      - checking WIN32 instead _WINDOWS.\n  Compress/LZ/MatchFinder/Patricia.h: \n    Beta 11 bug with deleting m_Hash2Descendants was fixed.\n\n\n2.30 Beta 11   2002-01-15\n-------------------------\n- Compress/LZ/MatchFinder/BinTreemain.h: \n  Compress/LZ/MatchFinder/Patricia.h: \n  Compress/PPM/PPMd/SubAlloc.h: \n    using VirtualAlloc for memory allocating\n- Exlorer/ContextMenu.cpp: \n    Testing supporting.\n    CreateProcess instead WinExec\n- Format/Common/IArchiveHandler.h:\n  Exlorer/ProxyHandler.cpp:\n  FAR/Plugin.cpp:\n    New properties names: Method, HostOS.\n- Exlorer/OverwriteDialog.cpp:\n  FAR/OverwriteDialog.cpp:\n  Windows/PropVariantConversions.h\n    Using National time format was eliminated.\n\n\n\n2.30 Beta 10   2002-01-11\n-------------------------\n- Exlorer/ContextMenu.cpp: bug with context menu on \n  Windows NT4 in Unicode version was fixed.\n- Format/7z/UpdateArchiveEngine.cpp: bug was fixed - \n  Updating in Beta 8 and 9 didn't work.\n- Exlorer/CCompressDialog.cpp: history growing bug was fixed.\n\n\n2.30 Beta 9    2002-01-08\n-------------------------\n- SDK/Common/Vector.h: sopporting sorted object vectors .\n- Lang features.\n- Two new match finders: pat3h and pat4h.\n- SDK/Archive/Zip/InEngine.cpp: bug was fixed.\n- SDK/Windows/FileDir.cpp: function CreateComplexDirectory\n  was changed.\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/lzma.txt",
    "content": "LZMA SDK 4.65\n-------------\n\nLZMA SDK provides the documentation, samples, header files, libraries, \nand tools you need to develop applications that use LZMA compression.\n\nLZMA is default and general compression method of 7z format\nin 7-Zip compression program (www.7-zip.org). LZMA provides high \ncompression ratio and very fast decompression.\n\nLZMA is an improved version of famous LZ77 compression algorithm. \nIt was improved in way of maximum increasing of compression ratio,\nkeeping high decompression speed and low memory requirements for \ndecompressing.\n\n\n\nLICENSE\n-------\n\nLZMA SDK is written and placed in the public domain by Igor Pavlov.\n\n\nLZMA SDK Contents\n-----------------\n\nLZMA SDK includes:\n\n  - ANSI-C/C++/C#/Java source code for LZMA compressing and decompressing\n  - Compiled file->file LZMA compressing/decompressing program for Windows system\n\n\nUNIX/Linux version \n------------------\nTo compile C++ version of file->file LZMA encoding, go to directory\nC++/7zip/Compress/LZMA_Alone \nand call make to recompile it:\n  make -f makefile.gcc clean all\n\nIn some UNIX/Linux versions you must compile LZMA with static libraries.\nTo compile with static libraries, you can use \nLIB = -lm -static\n\n\nFiles\n---------------------\nlzma.txt     - LZMA SDK description (this file)\n7zFormat.txt - 7z Format description\n7zC.txt      - 7z ANSI-C Decoder description\nmethods.txt  - Compression method IDs for .7z\nlzma.exe     - Compiled file->file LZMA encoder/decoder for Windows\nhistory.txt  - history of the LZMA SDK\n\n\nSource code structure\n---------------------\n\nC/  - C files\n        7zCrc*.*   - CRC code\n        Alloc.*    - Memory allocation functions\n        Bra*.*     - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code\n        LzFind.*   - Match finder for LZ (LZMA) encoders \n        LzFindMt.* - Match finder for LZ (LZMA) encoders for multithreading encoding\n        LzHash.h   - Additional file for LZ match finder\n        LzmaDec.*  - LZMA decoding\n        LzmaEnc.*  - LZMA encoding\n        LzmaLib.*  - LZMA Library for DLL calling\n        Types.h    - Basic types for another .c files\n\tThreads.*  - The code for multithreading.\n\n    LzmaLib  - LZMA Library (.DLL for Windows)\n    \n    LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder).\n\n    Archive - files related to archiving\n      7z     - 7z ANSI-C Decoder\n\nCPP/ -- CPP files\n\n  Common  - common files for C++ projects\n  Windows - common files for Windows related code\n\n  7zip    - files related to 7-Zip Project\n\n    Common   - common files for 7-Zip\n\n    Compress - files related to compression/decompression\n\n      Copy         - Copy coder\n      RangeCoder   - Range Coder (special code of compression/decompression)\n      LZMA         - LZMA compression/decompression on C++\n      LZMA_Alone   - file->file LZMA compression/decompression\n      Branch       - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code\n\n    Archive - files related to archiving\n\n      Common   - common files for archive handling\n      7z       - 7z C++ Encoder/Decoder\n\n    Bundles    - Modules that are bundles of other modules\n  \n      Alone7z           - 7zr.exe: Standalone version of 7z.exe that supports only 7z/LZMA/BCJ/BCJ2\n      Format7zR         - 7zr.dll: Reduced version of 7za.dll: extracting/compressing to 7z/LZMA/BCJ/BCJ2\n      Format7zExtractR  - 7zxr.dll: Reduced version of 7zxa.dll: extracting from 7z/LZMA/BCJ/BCJ2.\n\n    UI        - User Interface files\n         \n      Client7z - Test application for 7za.dll,  7zr.dll, 7zxr.dll\n      Common   - Common UI files\n      Console  - Code for console archiver\n\n\n\nCS/ - C# files\n  7zip\n    Common   - some common files for 7-Zip\n    Compress - files related to compression/decompression\n      LZ     - files related to LZ (Lempel-Ziv) compression algorithm\n      LZMA         - LZMA compression/decompression\n      LzmaAlone    - file->file LZMA compression/decompression\n      RangeCoder   - Range Coder (special code of compression/decompression)\n\nJava/  - Java files\n  SevenZip\n    Compression    - files related to compression/decompression\n      LZ           - files related to LZ (Lempel-Ziv) compression algorithm\n      LZMA         - LZMA compression/decompression\n      RangeCoder   - Range Coder (special code of compression/decompression)\n\n\nC/C++ source code of LZMA SDK is part of 7-Zip project.\n7-Zip source code can be downloaded from 7-Zip's SourceForge page:\n\n  http://sourceforge.net/projects/sevenzip/\n\n\n\nLZMA features\n-------------\n  - Variable dictionary size (up to 1 GB)\n  - Estimated compressing speed: about 2 MB/s on 2 GHz CPU\n  - Estimated decompressing speed: \n      - 20-30 MB/s on 2 GHz Core 2 or AMD Athlon 64\n      - 1-2 MB/s on 200 MHz ARM, MIPS, PowerPC or other simple RISC\n  - Small memory requirements for decompressing (16 KB + DictionarySize)\n  - Small code size for decompressing: 5-8 KB\n\nLZMA decoder uses only integer operations and can be \nimplemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).\n\nSome critical operations that affect the speed of LZMA decompression:\n  1) 32*16 bit integer multiply\n  2) Misspredicted branches (penalty mostly depends from pipeline length)\n  3) 32-bit shift and arithmetic operations\n\nThe speed of LZMA decompressing mostly depends from CPU speed.\nMemory speed has no big meaning. But if your CPU has small data cache, \noverall weight of memory speed will slightly increase.\n\n\nHow To Use\n----------\n\nUsing LZMA encoder/decoder executable\n--------------------------------------\n\nUsage:  LZMA <e|d> inputFile outputFile [<switches>...]\n\n  e: encode file\n\n  d: decode file\n\n  b: Benchmark. There are two tests: compressing and decompressing \n     with LZMA method. Benchmark shows rating in MIPS (million \n     instructions per second). Rating value is calculated from \n     measured speed and it is normalized with Intel's Core 2 results.\n     Also Benchmark checks possible hardware errors (RAM \n     errors in most cases). Benchmark uses these settings:\n     (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter. \n     Also you can change the number of iterations. Example for 30 iterations:\n       LZMA b 30\n     Default number of iterations is 10.\n\n<Switches>\n  \n\n  -a{N}:  set compression mode 0 = fast, 1 = normal\n          default: 1 (normal)\n\n  d{N}:   Sets Dictionary size - [0, 30], default: 23 (8MB)\n          The maximum value for dictionary size is 1 GB = 2^30 bytes.\n          Dictionary size is calculated as DictionarySize = 2^N bytes. \n          For decompressing file compressed by LZMA method with dictionary \n          size D = 2^N you need about D bytes of memory (RAM).\n\n  -fb{N}: set number of fast bytes - [5, 273], default: 128\n          Usually big number gives a little bit better compression ratio \n          and slower compression process.\n\n  -lc{N}: set number of literal context bits - [0, 8], default: 3\n          Sometimes lc=4 gives gain for big files.\n\n  -lp{N}: set number of literal pos bits - [0, 4], default: 0\n          lp switch is intended for periodical data when period is \n          equal 2^N. For example, for 32-bit (4 bytes) \n          periodical data you can use lp=2. Often it's better to set lc0, \n          if you change lp switch.\n\n  -pb{N}: set number of pos bits - [0, 4], default: 2\n          pb switch is intended for periodical data \n          when period is equal 2^N.\n\n  -mf{MF_ID}: set Match Finder. Default: bt4. \n              Algorithms from hc* group doesn't provide good compression \n              ratio, but they often works pretty fast in combination with \n              fast mode (-a0).\n\n              Memory requirements depend from dictionary size \n              (parameter \"d\" in table below). \n\n               MF_ID     Memory                   Description\n\n                bt2    d *  9.5 + 4MB  Binary Tree with 2 bytes hashing.\n                bt3    d * 11.5 + 4MB  Binary Tree with 3 bytes hashing.\n                bt4    d * 11.5 + 4MB  Binary Tree with 4 bytes hashing.\n                hc4    d *  7.5 + 4MB  Hash Chain with 4 bytes hashing.\n\n  -eos:   write End Of Stream marker. By default LZMA doesn't write \n          eos marker, since LZMA decoder knows uncompressed size \n          stored in .lzma file header.\n\n  -si:    Read data from stdin (it will write End Of Stream marker).\n  -so:    Write data to stdout\n\n\nExamples:\n\n1) LZMA e file.bin file.lzma -d16 -lc0 \n\ncompresses file.bin to file.lzma with 64 KB dictionary (2^16=64K)  \nand 0 literal context bits. -lc0 allows to reduce memory requirements \nfor decompression.\n\n\n2) LZMA e file.bin file.lzma -lc0 -lp2\n\ncompresses file.bin to file.lzma with settings suitable \nfor 32-bit periodical data (for example, ARM or MIPS code).\n\n3) LZMA d file.lzma file.bin\n\ndecompresses file.lzma to file.bin.\n\n\nCompression ratio hints\n-----------------------\n\nRecommendations\n---------------\n\nTo increase the compression ratio for LZMA compressing it's desirable \nto have aligned data (if it's possible) and also it's desirable to locate\ndata in such order, where code is grouped in one place and data is \ngrouped in other place (it's better than such mixing: code, data, code,\ndata, ...).\n\n\nFilters\n-------\nYou can increase the compression ratio for some data types, using\nspecial filters before compressing. For example, it's possible to \nincrease the compression ratio on 5-10% for code for those CPU ISAs: \nx86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC.\n\nYou can find C source code of such filters in C/Bra*.* files\n\nYou can check the compression ratio gain of these filters with such \n7-Zip commands (example for ARM code):\nNo filter:\n  7z a a1.7z a.bin -m0=lzma\n\nWith filter for little-endian ARM code:\n  7z a a2.7z a.bin -m0=arm -m1=lzma        \n\nIt works in such manner:\nCompressing    = Filter_encoding + LZMA_encoding\nDecompressing  = LZMA_decoding + Filter_decoding\n\nCompressing and decompressing speed of such filters is very high,\nso it will not increase decompressing time too much.\nMoreover, it reduces decompression time for LZMA_decoding, \nsince compression ratio with filtering is higher.\n\nThese filters convert CALL (calling procedure) instructions \nfrom relative offsets to absolute addresses, so such data becomes more \ncompressible.\n\nFor some ISAs (for example, for MIPS) it's impossible to get gain from such filter.\n\n\nLZMA compressed file format\n---------------------------\nOffset Size Description\n  0     1   Special LZMA properties (lc,lp, pb in encoded form)\n  1     4   Dictionary size (little endian)\n  5     8   Uncompressed size (little endian). -1 means unknown size\n 13         Compressed data\n\n\nANSI-C LZMA Decoder\n~~~~~~~~~~~~~~~~~~~\n\nPlease note that interfaces for ANSI-C code were changed in LZMA SDK 4.58.\nIf you want to use old interfaces you can download previous version of LZMA SDK\nfrom sourceforge.net site.\n\nTo use ANSI-C LZMA Decoder you need the following files:\n1) LzmaDec.h + LzmaDec.c + Types.h\nLzmaUtil/LzmaUtil.c is example application that uses these files.\n\n\nMemory requirements for LZMA decoding\n-------------------------------------\n\nStack usage of LZMA decoding function for local variables is not \nlarger than 200-400 bytes.\n\nLZMA Decoder uses dictionary buffer and internal state structure.\nInternal state structure consumes\n  state_size = (4 + (1.5 << (lc + lp))) KB\nby default (lc=3, lp=0), state_size = 16 KB.\n\n\nHow To decompress data\n----------------------\n\nLZMA Decoder (ANSI-C version) now supports 2 interfaces:\n1) Single-call Decompressing\n2) Multi-call State Decompressing (zlib-like interface)\n\nYou must use external allocator:\nExample:\nvoid *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }\nvoid SzFree(void *p, void *address) { p = p; free(address); }\nISzAlloc alloc = { SzAlloc, SzFree };\n\nYou can use p = p; operator to disable compiler warnings.\n\n\nSingle-call Decompressing\n-------------------------\nWhen to use: RAM->RAM decompressing\nCompile files: LzmaDec.h + LzmaDec.c + Types.h\nCompile defines: no defines\nMemory Requirements:\n  - Input buffer: compressed size\n  - Output buffer: uncompressed size\n  - LZMA Internal Structures: state_size (16 KB for default settings) \n\nInterface:\n  int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n      const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, \n      ELzmaStatus *status, ISzAlloc *alloc);\n  In: \n    dest     - output data\n    destLen  - output data size\n    src      - input data\n    srcLen   - input data size\n    propData - LZMA properties  (5 bytes)\n    propSize - size of propData buffer (5 bytes)\n    finishMode - It has meaning only if the decoding reaches output limit (*destLen).\n\t LZMA_FINISH_ANY - Decode just destLen bytes.\n\t LZMA_FINISH_END - Stream must be finished after (*destLen).\n                           You can use LZMA_FINISH_END, when you know that \n                           current output buffer covers last bytes of stream. \n    alloc    - Memory allocator.\n\n  Out: \n    destLen  - processed output size \n    srcLen   - processed input size \n\n  Output:\n    SZ_OK\n      status:\n        LZMA_STATUS_FINISHED_WITH_MARK\n        LZMA_STATUS_NOT_FINISHED \n        LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n    SZ_ERROR_DATA - Data error\n    SZ_ERROR_MEM  - Memory allocation error\n    SZ_ERROR_UNSUPPORTED - Unsupported properties\n    SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).\n\n  If LZMA decoder sees end_marker before reaching output limit, it returns OK result,\n  and output value of destLen will be less than output buffer size limit.\n\n  You can use multiple checks to test data integrity after full decompression:\n    1) Check Result and \"status\" variable.\n    2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.\n    3) Check that output(srcLen) = compressedSize, if you know real compressedSize. \n       You must use correct finish mode in that case. */ \n\n\nMulti-call State Decompressing (zlib-like interface)\n----------------------------------------------------\n\nWhen to use: file->file decompressing \nCompile files: LzmaDec.h + LzmaDec.c + Types.h\n\nMemory Requirements:\n - Buffer for input stream: any size (for example, 16 KB)\n - Buffer for output stream: any size (for example, 16 KB)\n - LZMA Internal Structures: state_size (16 KB for default settings) \n - LZMA dictionary (dictionary size is encoded in LZMA properties header)\n\n1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header:\n   unsigned char header[LZMA_PROPS_SIZE + 8];\n   ReadFile(inFile, header, sizeof(header)\n\n2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties\n\n  CLzmaDec state;\n  LzmaDec_Constr(&state);\n  res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc);\n  if (res != SZ_OK)\n    return res;\n\n3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop\n\n  LzmaDec_Init(&state);\n  for (;;)\n  {\n    ... \n    int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, \n    \tconst Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode);\n    ...\n  }\n\n\n4) Free all allocated structures\n  LzmaDec_Free(&state, &g_Alloc);\n\nFor full code example, look at C/LzmaUtil/LzmaUtil.c code.\n\n\nHow To compress data\n--------------------\n\nCompile files: LzmaEnc.h + LzmaEnc.c + Types.h +\nLzFind.c + LzFind.h + LzFindMt.c + LzFindMt.h + LzHash.h\n\nMemory Requirements:\n  - (dictSize * 11.5 + 6 MB) + state_size\n\nLzma Encoder can use two memory allocators:\n1) alloc - for small arrays.\n2) allocBig - for big arrays.\n\nFor example, you can use Large RAM Pages (2 MB) in allocBig allocator for \nbetter compression speed. Note that Windows has bad implementation for \nLarge RAM Pages. \nIt's OK to use same allocator for alloc and allocBig.\n\n\nSingle-call Compression with callbacks\n--------------------------------------\n\nCheck C/LzmaUtil/LzmaUtil.c as example, \n\nWhen to use: file->file decompressing \n\n1) you must implement callback structures for interfaces:\nISeqInStream\nISeqOutStream\nICompressProgress\nISzAlloc\n\nstatic void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }\nstatic void SzFree(void *p, void *address) {  p = p; MyFree(address); }\nstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };\n\n  CFileSeqInStream inStream;\n  CFileSeqOutStream outStream;\n\n  inStream.funcTable.Read = MyRead;\n  inStream.file = inFile;\n  outStream.funcTable.Write = MyWrite;\n  outStream.file = outFile;\n\n\n2) Create CLzmaEncHandle object;\n\n  CLzmaEncHandle enc;\n\n  enc = LzmaEnc_Create(&g_Alloc);\n  if (enc == 0)\n    return SZ_ERROR_MEM;\n\n\n3) initialize CLzmaEncProps properties;\n\n  LzmaEncProps_Init(&props);\n\n  Then you can change some properties in that structure.\n\n4) Send LZMA properties to LZMA Encoder\n\n  res = LzmaEnc_SetProps(enc, &props);\n\n5) Write encoded properties to header\n\n    Byte header[LZMA_PROPS_SIZE + 8];\n    size_t headerSize = LZMA_PROPS_SIZE;\n    UInt64 fileSize;\n    int i;\n\n    res = LzmaEnc_WriteProperties(enc, header, &headerSize);\n    fileSize = MyGetFileLength(inFile);\n    for (i = 0; i < 8; i++)\n      header[headerSize++] = (Byte)(fileSize >> (8 * i));\n    MyWriteFileAndCheck(outFile, header, headerSize)\n\n6) Call encoding function:\n      res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable, \n        NULL, &g_Alloc, &g_Alloc);\n\n7) Destroy LZMA Encoder Object\n  LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc);\n\n\nIf callback function return some error code, LzmaEnc_Encode also returns that code.\n\n\nSingle-call RAM->RAM Compression\n--------------------------------\n\nSingle-call RAM->RAM Compression is similar to Compression with callbacks,\nbut you provide pointers to buffers instead of pointers to stream callbacks:\n\nHRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n    CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, \n    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n\nReturn code:\n  SZ_OK               - OK\n  SZ_ERROR_MEM        - Memory allocation error \n  SZ_ERROR_PARAM      - Incorrect paramater\n  SZ_ERROR_OUTPUT_EOF - output buffer overflow\n  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)\n\n\n\nLZMA Defines\n------------\n\n_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code.\n\n_LZMA_PROB32   - It can increase the speed on some 32-bit CPUs, but memory usage for \n                 some structures will be doubled in that case.\n\n_LZMA_UINT32_IS_ULONG  - Define it if int is 16-bit on your compiler and long is 32-bit.\n\n_LZMA_NO_SYSTEM_SIZE_T  - Define it if you don't want to use size_t type.\n\n\nC++ LZMA Encoder/Decoder \n~~~~~~~~~~~~~~~~~~~~~~~~\nC++ LZMA code use COM-like interfaces. So if you want to use it, \nyou can study basics of COM/OLE.\nC++ LZMA code is just wrapper over ANSI-C code.\n\n\nC++ Notes\n~~~~~~~~~~~~~~~~~~~~~~~~\nIf you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling),\nyou must check that you correctly work with \"new\" operator.\n7-Zip can be compiled with MSVC 6.0 that doesn't throw \"exception\" from \"new\" operator.\nSo 7-Zip uses \"CPP\\Common\\NewHandler.cpp\" that redefines \"new\" operator:\noperator new(size_t size)\n{\n  void *p = ::malloc(size);\n  if (p == 0)\n    throw CNewException();\n  return p;\n}\nIf you use MSCV that throws exception for \"new\" operator, you can compile without \n\"NewHandler.cpp\". So standard exception will be used. Actually some code of \n7-Zip catches any exception in internal code and converts it to HRESULT code.\nSo you don't need to catch CNewException, if you call COM interfaces of 7-Zip.\n\n---\n\nhttp://www.7-zip.org\nhttp://www.7-zip.org/sdk.html\nhttp://www.7-zip.org/support.html\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/readme.txt",
    "content": "7-Zip 4.65 Sources\n------------------\n\n7-Zip is a file archiver for Windows 95/98/ME/NT/2000/2003/XP/Vista. \n\n7-Zip Copyright (C) 1999-2009 Igor Pavlov.\n\n\nLicense Info\n------------\n\n7-Zip is free software distributed under the GNU LGPL \n(except for unRar code).\nread License.txt for more infomation about license.\n\nNotes about unRAR license:\n\nPlease check main restriction from unRar license:\n\n   2. The unRAR sources may be used in any software to handle RAR\n      archives without limitations free of charge, but cannot be used\n      to re-create the RAR compression algorithm, which is proprietary.\n      Distribution of modified unRAR sources in separate form or as a\n      part of other software is permitted, provided that it is clearly\n      stated in the documentation and source comments that the code may\n      not be used to develop a RAR (WinRAR) compatible archiver.\n\nIn brief it means:\n1) You can compile and use compiled files under GNU LGPL rules, since \n   unRAR license almost has no restrictions for compiled files.\n   You can link these compiled files to LGPL programs.\n2) You can fix bugs in source code and use compiled fixed version.\n3) You can not use unRAR sources to re-create the RAR compression algorithm.\n\n\nLZMA SDK\n--------\n\nAlso this package contains files from LZMA SDK\nyou can download LZMA SDK from this page:\nhttp://www.7-zip.org/sdk.html\nread about addtional licenses for LZMA SDK in file\nDOC/lzma.txt\n\n\nHow to compile\n--------------\nTo compile sources you need Visual C++ 6.0.\nFor compiling some files you also need \nnew Platform SDK from Microsoft' Site:\nhttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm\nor\nhttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm\nor\nhttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/\n\nIf you use MSVC6, specify SDK directories at top of directories lists:\nTools / Options / Directories\n  - Include files\n  - Library files\n\n\nTo compile 7-Zip for AMD64 and IA64 you need:\n  Windows Server 2003 SP1 Platform SDK from microsoft.com\n\nAlso you need Microsoft Macro Assembler:\n  - ml.exe for x86 \n  - ml64.exe for AMD64\nYou can use ml.exe from Windows SDK for Windows Vista or some other version.\n\n\nCompiling under Unix/Linux\n--------------------------\nCheck this site for Posix/Linux version:\nhttp://sourceforge.net/projects/p7zip/\n\n\nNotes:\n------\n7-Zip consists of COM modules (DLL files).\nBut 7-Zip doesn't use standard COM interfaces for creating objects.\nLook at\n7zip\\UI\\Client7z folder for example of using DLL files of 7-Zip. \nSome DLL files can use other DLL files from 7-Zip.\nIf you don't like it, you must use standalone version of DLL.\nTo compile standalone version of DLL you must include all used parts\nto project and define some defs. \nFor example, 7zip\\Bundles\\Format7z is a standalone version  of 7z.dll \nthat works with 7z format. So you can use such DLL in your project \nwithout additional DLL files.\n\n\nDescription of 7-Zip sources package\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDOC                Documentation\n---\n  7zFormat.txt   - 7z format description\n  copying.txt    - GNU LGPL license\n  unRarLicense.txt - License for unRAR part of source code\n  history.txt    - Sources history\n  Methods.txt    - Compression method IDs\n  readme.txt     - Readme file\n  lzma.txt       - LZMA SDK description\n  7zip.nsi       - installer script for NSIS\n\n\nC   - Source code in C\nCPP - Source code in CPP\n\nCommon            Common modules\nWindows           Win32 wrappers\n\n7zip\n-------\n  Common          Common modules for 7-zip\n\n  Archive         7-Zip Archive Format Plugins \n  --------\n    Common\n    7z\n    Arj\n    BZip2\n    Cab\n    Cpio\n    GZip\n    Rar\n    Rpm            \n    Split\n    Tar\n    Zip\n\n  Bundle          Modules that are bundles of other modules\n  ------\n    Alone         7za.exe: Standalone version of 7z\n    Alone7z       7zr.exe: Standalone version of 7z that supports only 7z/LZMA/BCJ/BCJ2\n    SFXCon        7zCon.sfx: Console 7z SFX module\n    SFXWin        7z.sfx: Windows 7z SFX module\n    SFXSetup      7zS.sfx: Windows 7z SFX module for Installers\n    Format7z            7za.dll:  .7z support\n    Format7zExtract     7zxa.dll: .7z support, extracting only\n    Format7zR           7zr.dll:  .7z support, LZMA/BCJ* only\n    Format7zExtractR    7zxr.dll: .7z support, LZMA/BCJ* only, extracting only\n    Format7zF           7z.dll:   all formats\n\n  UI\n  --\n    Agent         Intermediary modules for FAR plugin and Explorer plugin\n    Console       7z.exe Console version\n    Explorer      Explorer plugin\n    Resource      Resources\n    Far           FAR plugin  \n    Client7z      Test application for 7za.dll \n\n  Compress\n  --------\n    BZip2        BZip2 compressor\n    Branch       Branch converter\n    ByteSwap     Byte Swap converter\n    Copy         Copy coder\n    Deflate       \n    Implode\n    Arj\n    LZMA\n    PPMd          Dmitry Shkarin's PPMdH with small changes.\n    LZ            Lempel - Ziv\n\n  Crypto          Crypto modules\n  ------\n    7zAES         Cipher for 7z\n    AES           AES Cipher\n    Rar20         Cipher for Rar 2.0\n    RarAES        Cipher for Rar 3.0\n    Zip           Cipher for Zip\n\n  FileManager       File Manager\n\n\n---\nIgor Pavlov\nhttp://www.7-zip.org\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/DOCS/unRarLicense.txt",
    "content": " ******    *****   ******   unRAR - free utility for RAR archives\n **   **  **   **  **   **  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n ******   *******  ******    License for use and distribution of\n **   **  **   **  **   **   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n **   **  **   **  **   **         FREE portable version\n                                   ~~~~~~~~~~~~~~~~~~~~~\n\n      The source code of unRAR utility is freeware. This means:\n\n   1. All copyrights to RAR and the utility unRAR are exclusively\n      owned by the author - Alexander Roshal.\n\n   2. The unRAR sources may be used in any software to handle RAR\n      archives without limitations free of charge, but cannot be used\n      to re-create the RAR compression algorithm, which is proprietary.\n      Distribution of modified unRAR sources in separate form or as a\n      part of other software is permitted, provided that it is clearly\n      stated in the documentation and source comments that the code may\n      not be used to develop a RAR (WinRAR) compatible archiver.\n\n   3. The unRAR utility may be freely distributed. No person or company \n      may charge a fee for the distribution of unRAR without written\n      permission from the copyright holder.\n\n   4. THE RAR ARCHIVER AND THE UNRAR UTILITY ARE DISTRIBUTED \"AS IS\".\n      NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.  YOU USE AT \n      YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, \n      DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING\n      OR MISUSING THIS SOFTWARE.\n\n   5. Installing and using the unRAR utility signifies acceptance of\n      these terms and conditions of the license.\n\n   6. If you don't agree with terms of the license you must remove\n      unRAR files from your storage devices and cease to use the\n      utility.\n\n      Thank you for your interest in RAR and unRAR.\n\n\n                                            Alexander L. Roshal"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/af.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.09\n; Vertaal deur Petri Jooste\n;\n;\n;\n;\n\n00000000=\"Afrikaans\"\n00000001=\"Afrikaans\"\n00000002=\"54\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Konfigurasie\"\n\n; Info Page\n01000100=\"Aangaande 7-Zip\"\n01000103=\"7-Zip is gratis programmatuur. Indien u egter so baie van 7-Zip hou dat u die verdere ontwikkeling wil ondersteun, registreer dan asb. met 'n geldelike donasie aan die 7-Zip Projek.\"\n01000105=\"Registreer\"\n\n; Folders Page\n01000200=\"Gidse\"\n01000210=\"&Werkgids\"\n01000211=\"&TEMP-gids van het stelsel\"\n01000212=\"&Huidige gids\"\n01000213=\"&Gespesifiseerde gids:\"\n01000214=\"Gebruik slegs vir verwisselbare media.\"\n\n01000281=\"Spesifiseer die stoorplek vir tydelyke argieflêers.\"\n\n; System Page\n01000300=\"Stelsel\"\n01000301=\"Integreer 7-Zip in kontekskeuselys.\"\n01000302=\"Trapsgewyse kontekskeuselys\"\n01000310=\"Kontekskeuselysitems:\"\n\n; Language Page\n01000400=\"Taal\"\n01000401=\"Taal:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip opdragte\"\n02000103=\"Open\"\n02000104=\"Open die geselekteerde argief.\"\n02000105=\"Pak lêers uit...\"\n02000106=\"Pak lêers van geselekteerde argief uit.\"\n02000107=\"Voeg by argief...\"\n02000108=\"Voeg geselekteerde items by argief.\"\n02000109=\"Toets argief\"\n0200010A=\"Toets integriteit van die geselekteerde argief.\"\n0200010B=\"Pak hier uit\"\n0200010C=\"Pak lêers van die geselekteerde argief in die huidige gids uit.\"\n0200010D=\"Pak uit in {0}\"\n0200010E=\"Pak lêers uit in subgids.\"\n0200010F=\"Voeg by {0}\"\n02000110=\"Voeg die geselekteerde items by argief.\"\n02000111=\"Saampers en e-pos...\"\n02000112=\"Pers die geselekteerde items in 'n argief saam en stuur die argief via e-pos.\"\n02000113=\"Pers saam in {0} en e-pos\"\n02000114=\"Pers die geselekteerde items saam in 'n argief en stuur die argief per e-pos.\"\n\n02000140=\"<Gids>\"\n02000141=\"<Argief>\"\n\n; Properties\n02000203=\"Pad\"\n02000204=\"Naam\"\n02000205=\"Uitgang\"\n02000206=\"Gids\"\n02000207=\"Grootte\"\n02000208=\"Ingepakte grootte\"\n02000209=\"Kenmerke\"\n0200020A=\"Gemaak\"\n0200020B=\"Laatste toegang\"\n0200020C=\"Gewysig\"\n0200020D=\"Kompak\"\n0200020E=\"Kommentaar\"\n0200020F=\"Versleuteld\"\n02000210=\"Verdeel Voor\"\n02000211=\"Verdeel Na\"\n02000212=\"Woordeboek\"\n02000213=\"CRC\"\n02000214=\"Tipe\"\n02000215=\"Anti\"\n02000216=\"Metode\"\n02000217=\"Gasheer BS\"\n02000218=\"Lêersstelsel\"\n02000219=\"Gebruiker\"\n0200021A=\"Groep\"\n0200021B=\"Blok\"\n0200021C=\"Kommentaar\"\n0200021D=\"Posisie\"\n\n; Status bar\n02000301=\"{0} objekt(e) is geselekteer\"\n02000302=\"{0} objekt(e)\"\n\n; List Context Menu\n02000401=\"&Kolomme...\"\n\n02000411=\"&Open\"\n02000412=\"&Uitpak...\"\n\n; ToolBar\n02000501=\"Uitpak\"\n\n; Messages\n02000601=\"Bywerk-funksie word vir hierdie argief nie ondersteun nie.\"\n02000602=\"Kan argief {0} nie bywerk nie\"\n02000603=\"Kan gids '{0}' nie maak nie\"\n02000604=\"Hierdie lêer is nie 'n ondersteunde argief nie.\"\n02000605=\"Fout\"\n02000606=\"Te veel items\"\n02000607=\"Daar is geen program geassosieer met hierdie lêersnaam-uitgang nie\"\n02000608=\"Daar is geen foute nie\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ja\"\n02000707=\"Ja vir &almal\"\n02000709=\"&Nee\"\n0200070B=\"Nee vir a&lmal\"\n\n02000710=\"Kanselleer\"\n02000711=\"&Kanselleer\"\n02000713=\"A&fsluit\"\n02000714=\"Stop\"\n02000715=\"Herbegin\"\n\n02000720=\"Hulp\"\n\n; Extract dialog\n02000800=\"&Uitpak\"\n02000801=\"U&itpak in:\"\n02000802=\"&Wagwoord\"\n\n02000810=\"Pad-metode\"\n02000811=\"Volledige padname\"\n02000812=\"Huidige padname\"\n02000813=\"Geen padname\"\n\n02000820=\"Vervang lêers\"\n02000821=\"Vervang slegs met bevestiging\"\n02000822=\"Vervang sonder bevestiging\"\n02000823=\"Slaan bestaande lêers oor\"\n02000824=\"Hernoem outomaties\"\n02000825=\"Hernoem bestaande lêers outomaties\"\n\n02000830=\"Lêers\"\n02000831=\"&Geselekteerde lêers\"\n02000832=\"&Alle lêers\"\n\n02000881=\"Gee 'n bestemming vir uitgepakte lêers.\"\n\n02000890=\"Besig om uit te pak\"\n\n; Overwrite dialog\n02000900=\"Bevestig lêeroorskrywing\"\n02000901=\"Doelgids bevat alreeds 'n lêer met hierdie naam.\"\n02000902=\"Wil u die bestaande lêer vervang\"\n02000903=\"deur hierdie lêer ?\"\n\n02000911=\"O&utomaties hernoem\"\n\n02000982=\"{0} grepe\"\n02000983=\"gewysig op\"\n\n; Messages dialog\n02000A00=\"Diagnostiese boodskappe\"\n\n02000A80=\"Boodskap\"\n\n02000A91=\"Nie-ondersteunde saampersmetode vir '{0}'.\"\n02000A92=\"Datafout in '{0}'. Lêer is beskadig.\"\n02000A93=\"CRC het misluk in '{0}'. Lêer is beskadig.\"\n\n; Password dialog\n02000B00=\"Tik wagwoord in\"\n02000B01=\"Tik wagwoord in:\"\n02000B02=\"&Wys wagwoord\"\n\n; Progress dialog\n02000C00=\"Bewerk\"\n02000C01=\"Tydsduur sovêr:\"\n02000C02=\"Oorblywende tyd:\"\n02000C03=\"Grootte:\"\n02000C04=\"Spoed:\"\n\n02000C10=\"&Agtergrond\"\n02000C11=\"&Voorgrond\"\n02000C12=\"&Wag\"\n02000C13=\"&Gaan voort\"\n\n02000C20=\"Wagtend\"\n\n02000C30=\"Is u seker dat u wil kanselleer?\"\n\n; Compress dialog\n02000D00=\"Voeg by argief\"\n02000D01=\"&Argief:\"\n02000D02=\"&Bywerkwyse:\"\n02000D03=\"Argie&fformaat:\"\n02000D04=\"&Saampersmetode:\"\n02000D05=\"Maak kom&pakte argief\"\n02000D06=\"Pa&rameters:\"\n02000D07=\"Opsies\"\n02000D08=\"Maak SF&X argief\"\n02000D09=\"Multi-uitvoerdraadhantering\"\n02000D0A=\"Enkripteer lêer&name\"\n02000D0B=\"Saampersingv&lak:\"\n02000D0C=\"&Woordeboekgrootte:\"\n02000D0D=\"&Woordgrootte:\"\n02000D0E=\"Geheuegebruik vir saampersing:\"\n02000D0F=\"Geheuegebruik vir uitpakking:\"\n\n02000D40=\"Verdeel in &volumes, aantal grepe:\"\n\n02000D81=\"Stoor\"\n02000D82=\"Normaal\"\n02000D83=\"Maksimum\"\n02000D84=\"Vinnig\"\n02000D85=\"Vinnigste\"\n02000D86=\"Ultra\"\n\n02000D90=\"Blaai\"\n\n02000DA1=\"Lêers byvoeg en vervang\"\n02000DA2=\"Lêers bywerk en byvoeg\"\n02000DA3=\"Verfris bestaande lêers\"\n02000DA4=\"Sinkroniseer lêers\"\n\n02000DB1=\"Alle lêers\"\n\n02000DC0=\"Besig met saampersing\"\n\n; Columns dialog\n02000E00=\"Kolomme\"\n02000E01=\"Merk die kolomme wat u sigbaar wil maak in hierdie gids. Gebruik die op-en-af-pyltjies om die kolomme te rangskik soos u wil.\"\n02000E02=\"Die gemerkte kolom moet\"\n02000E03=\"pixels &breed wees.\"\n\n02000E10=\"&Opskuif\"\n02000E11=\"&Afskuif\"\n02000E12=\"&Wys\"\n02000E13=\"&Verberg\"\n02000E14=\"Stel\"\n\n02000E81=\"Titel\"\n02000E82=\"Breedte\"\n\n; Testing\n02000F90=\"Besig om te toets\"\n\n\n; File Manager\n\n03000000=\"7-Zip Lêerbestuurder\"\n\n; Menu\n03000102=\"&Lêer\"\n03000103=\"R&edigeer\"\n03000104=\"&Vertoon\"\n03000105=\"&Gereedskap\"\n03000106=\"&Hulp\"\n03000107=\"G&unstelinge\"\n\n; File\n03000210=\"&Open\"\n03000211=\"Open &Binne\"\n03000212=\"Open B&uite\"\n03000220=\"&Wys\"\n03000221=\"R&edigeer\"\n03000230=\"Her&noem\"\n03000231=\"&Kopieer na...\"\n03000232=\"&Verskuif na...\"\n03000233=\"Ve&rwyder\"\n03000240=\"E&ienskappe\"\n03000241=\"Komme&ntaar\"\n03000250=\"Maak gids\"\n03000251=\"Maak lêer\"\n03000260=\"A&fsluit\"\n03000270=\"Ver&deel lêer...\"\n03000271=\"Kom&bineer lêers...\"\n\n; Edit\n03000310=\"&Ontdoen\"\n03000311=\"&Herhaal\"\n03000320=\"&Knip\"\n03000321=\"K&opieer\"\n03000322=\"&Plak\"\n03000323=\"&Verwyder\"\n03000330=\"Selekteer &alles\"\n03000331=\"Deselekteer a&lles\"\n03000332=\"Keer &seleksie om\"\n03000333=\"Selekteer...\"\n03000334=\"Deselekteer...\"\n03000335=\"Selekteer op Soort\"\n03000336=\"Deselekteer op Soort\"\n\n; View\n03000410=\"&Groot ikone\"\n03000411=\"&Klein ikone\"\n03000412=\"&Lys\"\n03000413=\"&Detail\"\n03000420=\"Ongesorteer\"\n03000430=\"Maak wortelgids oop\"\n03000431=\"Een vlak hoër\"\n03000432=\"Gidse geskiedenis...\"\n03000440=\"&Verfris\"\n03000450=\"&2 Panele\"\n03000451=\"&Nutsbalke\"\n03000460=\"Argiveernutsbalk\"\n03000461=\"Standaardnutsbalk\"\n03000462=\"Groot knoppies\"\n03000463=\"Wys teks op knoppies\"\n\n; Tools\n03000510=\"&Opsies...\"\n03000511=\"&Normtoetsing\"\n\n; Help\n03000610=\"&Inhoud...\"\n03000620=\"&Aangaande 7-Zip...\"\n\n; Favorites\n03000710=\"Voeg gids by gunstelinge &as\"\n03000720=\"Boekmerk\"\n\n; Options Dialog\n\n03010000=\"Opsies\"\n\n; Plugins\n03010100=\"Inproppe\"\n03010101=\"In&proppe:\"\n03010110=\"Opsies...\"\n\n; Edit\n03010200=\"Redigeerder\"\n03010201=\"R&edigeerder:\"\n\n; System\n03010300=\"Stelsel\"\n03010302=\"Assosieer 7-Zip met:\"\n03010310=\"Inprop\"\n\n; Settings\n03010400=\"Instellings\"\n03010401=\"Wys \\\"..\\\" &item\"\n03010402=\"Wys &ware lêerikone\"\n03010410=\"Wys &stelselkeuselys\"\n03010420=\"Wys seleksie oor &hele ry(e)\"\n03010421=\"Wys &roosterlyne\"\n\n; Strings\n\n03020201=\"Kopieer\"\n03020202=\"Verskuif\"\n03020203=\"Kopieer na:\"\n03020204=\"Verskuif na:\"\n03020205=\"Besig met kopiëring...\"\n03020206=\"Besig met verskuiwing...\"\n03020207=\"U kan items vir hierdie soort gidse nie verskuif of kopieer nie.\"\n03020208=\"Bewerking word nie ondersteun nie.\"\n\n03020210=\"Bevestig lêerverwydering\"\n03020211=\"Bevestig gidsverwydering\"\n03020212=\"Bevestig verwydering van meerdere lêers\"\n03020213=\"Is u seker dat u '{0}' wil verwyder?\"\n03020214=\"Is u seker dat u gids '{0}' asook die inhoud daarvan wil verwyder?\"\n03020215=\"Is u seker dat u hierdie {0} items wil verwyder?\"\n03020216=\"Besig met verwydering...\"\n03020217=\"Fout by verwydering van lêer of gids\"\n\n03020220=\"Besig met hernoeming...\"\n03020221=\"Fout by hernoeming van lêer of gids\"\n\n03020230=\"Maak gids\"\n03020231=\"Naam van die gids:\"\n03020232=\"Nuwe gids\"\n03020233=\"Fout by maak van gids\"\n\n03020240=\"Maak lêer\"\n03020241=\"Lêernaam:\"\n03020242=\"Nuwe lêer\"\n03020243=\"Fout by maak van nuwe lêer\"\n\n03020250=\"Selekteer\"\n03020251=\"Deselekteer\"\n03020252=\"Masker:\"\n\n03020260=\"Gidse-geskiedenis\"\n\n03020280=\"Lêer '{0}' is gewysig.\\nWil u dit bywerk in die argief?\"\n03020281=\"Kan lêer\\n'{0}' nie bywerk nie\"\n03020282=\"Redigeerder nie aan die gang gesit word nie.\"\n03020283=\"Besig om oop te maak...\"\n\n03020300=\"Rekenaar\"\n03020301=\"Netwerk\"\n\n030202A0=\"Stelsel\"\n\n03020300=\"Rekenaar\"\n03020301=\"Network\"\n\n03020400=\"Voeg by\"\n03020401=\"Pak uit\"\n03020402=\"Toets\"\n\n03020420=\"Kopiëer\"\n03020421=\"Skuif\"\n03020422=\"Vee uit\"\n03020423=\"Intigting\"\n\n03020500=\"Verdeel lêer\"\n03020501=\"&Verdeel na:\"\n03020510=\"Besig met verdeling...\"\n\n03020600=\"Kombineer lêers\"\n03020601=\"&Kombineer na:\"\n03020610=\"Besig met kombinering...\"\n\n; Computer\n03031100=\"Totale grootte\"\n03031101=\"Vrye ruimte\"\n03031102=\"Klustergrootte\"\n03031103=\"Etiket\"\n\n; Network\n03031200=\"Plaaslike naam\"\n03031201=\"Verskaffer\"\n\n; Benchmark Dialog\n\n03080000=\"Meet\"\n03080001=\"Geheuegebruik:\"\n03080002=\"Inpakking\"\n03080003=\"Uitpakking\"\n03080004=\"Spoed\"\n03080005=\"Gradering\"\n03080006=\"Totale gradering\"\n03080007=\"Huidige\"\n03080008=\"Resultaat\"\n03080009=\"Lopies:\"\n0308000A=\"Foute:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ar.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.52\n; 20080215 Reviewed and corrected by Ahmad Gharbeia\n; 20070819 Mohammad Deeb - corrected & updated\n; 20070522 Awadh A Al-Ghaamdi - corrected & updated\n; 20020111 Mohammad Deeb - first issue\n; راجعه و صوبه أحمد غربية\n\n; IMPORTANT: This File contains Unicode control characters necessary to\n;\tpresent Arabic messages in the right direction. These characters\n;\tare invisible in editors by default. Caution should be taken when\n;\tthe file is edited, and the pattern of marking directionality with\n;\tUnicode control characters observed for best results in the UI.\n; هام للغاية: يحوي هذا الملف محارف تحكم يونيكود ضرورية لظهور العبارات العربية في الاتجاه الصحيح، و خاصة عند تداخلها مع كلمات بأحرف لاتينية؛ و هذه المحارف لا تكون\n;\tظاهرة بدئيا في محررات النصوص، لذا يرجى الانتباه عند تحريره و مراعا النسق المتبع في العبارات الموجودة لأجل أفضل نتيجة في واجهة المستخدم..\n\n00000000=\"Arabic\"\n00000001=\"العربية\"\n00000002=\"1\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"‮تضبيطات ‪7-Zip‬\"\n\n; Info Page\n01000100=\"‮عن ‪7-Zip‬\"\n01000103=\"‮هذه برمجية مجانية، لكنها إن أفادتك و أردت دعم تطويرها مستقبلا فيمكنك تسجيل نسختك مقابل مبلغ بسيط.\"\n01000104=\"الدعم\"\n01000105=\"سجّل\"\n\n; Folders Page\n01000200=\"أدلة\"\n01000210=\"دليل ال&عمل\"\n01000211=\"الدليل المؤ&قت للنظام\"\n01000212=\"ال&حالي\"\n01000213=\"‮مُ&حدد:\"\n01000214=\"استخدمه فقط للوسائط للقابلة للنزع\"\n\n01000281=\"حدد موضع الملفات المؤقتة للأرشيف.\"\n\n; System Page\n01000300=\"نظام\"\n01000301=\"‮كامل ‪7-Zip‬ بقائمة سياق القشرة\"\n01000302=\"قائمة سياق منسدلة\"\n01000310=\"‮عناصر قائمة السياق:\"\n\n; Language Page\n01000400=\"اللغة\"\n01000401=\"‮اللغة:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"‮أوامر ‪7-Zip‬\"\n02000103=\"افتح الأرشيف\"\n02000104=\"يفتح الأرشيف المختار\"\n02000105=\"‮استخرج الملفات…\"\n02000106=\"يستخرج الملفات من الأرشيف المختار\"\n02000107=\"‮أضف إلى أرشيف…\"\n02000108=\"يضيف العناصر المختارة إلى أرشيف\"\n02000109=\"افحص الأرشيف\"\n0200010A=\"يفحص سلامة الأرشيف المختار\"\n0200010B=\"استخراج هنا\"\n0200010C=\"يستخرج الملفات من الأرشيف المختار إلى الدليل الحالي\"\n0200010D=\"استخرج إلى ‪{0}‬\"\n0200010E=\"يستخرج الملفات إلى دليل فرعي\"\n0200010F=\"أضف إلى ‪{0}‬\"\n02000110=\"يضف العناصر المختارة إلى أرشيف\"\n02000111=\"‮اضغط و أرسل…\"\n02000112=\"يضغط العناصر المختارة في أرشيف ثم يرسله بالبريد الإلكتروني\"\n02000113=\"اضغط إلى ‪{0}‬ ثم أرسل\"\n02000114=\"يضغط العناصر المختارة في أرشيف تحدده ثم يرسله بالبريد الإلكتروني\"\n\n02000140=\"‮<دليل>\"\n02000141=\"‮<أرشيف>\"\n\n; Properties\n02000203=\"المسار\"\n02000204=\"الاسم\"\n02000205=\"الامتداد\"\n02000206=\"الدليل\"\n02000207=\"الحجم\"\n02000208=\"الحجم المضغوط\"\n02000209=\"خصائص\"\n0200020A=\"أنشئ في\"\n0200020B=\"فُتح في\"\n0200020C=\"عُدِّل في\"\n0200020D=\"مصمت\"\n0200020E=\"تعليق\"\n0200020F=\"مُعمَّى\"\n02000210=\"القسم السابق\"\n02000211=\"القسم اللاحق\"\n02000212=\"المعجم\"\n02000213=\"CRC\"\n02000214=\"النوع‪\"\n02000215=\"عكس\"\n02000216=\"الأسلوب\"\n02000217=\"النظام المضيف\"\n02000218=\"نظام الملفات\"\n02000219=\"المستخدم\"\n0200021A=\"المجموعة\"\n0200021B=\"الكتلة\"\n0200021C=\"تعليق\"\n0200021D=\"الموضع\"\n0200021E=\"بادئة المسار\"\n0200021F=\"الأدلة\"\n02000220=\"الملفات\"\n02000221=\"الإصدارة\"\n02000222=\"المجلد\"\n02000223=\"متعدد المجلدات\"\n02000224=\"إزاحة\"\n02000225=\"الروابط\"\n02000226=\"الكتل\"\n02000227=\"المجلدات\"\n\n; Status bar\n02000301=\"‮{0} عناصر مختارة\"\n02000302=\"‮{0} عناصر\"\n\n02000320=\"‮ملفات:\"\n02000321=\"‮أدلة:\"\n02000322=\"‮الحجم:\"\n02000323=\"‮الحجم المضغوط:\"\n02000324=\"‮الأرشيفات:\"\n\n; List Context Menu\n02000401=\"‮أ&عمدة…\"\n\n02000411=\"ا&فتح\"\n02000412=\"‮ا&ستخرج…\"\n\n; ToolBar\n02000501=\"استخرج\"\n\n; Messages\n02000601=\"عمليات التحديث غير مدعومة لنوع الأرشيف هذا.\"\n02000602=\"‮تعذّر تحديث الأرشيف ‪{0}‬‬\"\n02000603=\"‮تعذّر إنشاء الدليل '‪{0}‬'\"\n02000604=\"ليس هذا الملف أرشيفا مدعوما.\"\n02000605=\"عُطل\"\n02000606=\"عناصر أكثر من الممكن\"\n02000607=\"لا يرتبط امتداد اسم الملف المعطى بأي تطبيق\"\n02000608=\"لا أعطاب\"\n02000609=\"‮تعذّر فتح الملف '‪{0}‬' كأرشيف\"\n0200060A=\"‮تعذّر فتح الأرشيف المُعمَّى '‪{0}‬'. هل كلمة السرّ صحيحة؟\"\n\n; Dialogs\n02000702=\"حسن\"\n02000705=\"ن&عم\"\n02000707=\"&نعم للكل\"\n02000709=\"&لا\"\n0200070B=\"لا لل&كل \"\n\n02000710=\"ألغِ\"\n02000711=\"أل&غِ\"\n02000713=\"أغل&ق\"\n02000714=\"أوقف\"\n02000715=\"أبدأ من جديد\"\n\n02000720=\"مساعدة\"\n\n; Extract dialog\n02000800=\"استخرج\"\n02000801=\"‮ا&ستخرج إلى:\"\n02000802=\"كلمة السر\"\n\n02000810=\"طور المسارات\"\n02000811=\"مسارات كاملة\"\n02000812=\"المسار الحالي\"\n02000813=\"بلا مسارات\"\n\n02000820=\"طور استبدال الملفات\"\n02000821=\"اسأل قبل الاستبدال\"\n02000822=\"استبدل بلا توكيد\"\n02000823=\"تجاوز الملفات الموجودة\"\n02000824=\"غير الاسم آليا\"\n02000825=\"غير آليا أسماء الملفات الموجودة\"\n\n02000830=\"الملفات\"\n02000831=\"الملفات الم&ختارة\"\n02000832=\"&كل الملفات\"\n\n02000881=\"حدد موضع المفات المستخرجة.\"\n\n02000890=\"يجري الاستخراج\"\n\n; Overwrite dialog\n02000900=\"أكد قبل استبدال ملف\"\n02000901=\"الدليل الوجهة يحوي ملف بذات الاسم.\"\n02000902=\"أتريد استبدال الملف الموجود\"\n02000903=\"بهذا الملف؟\"\n\n02000911=\"&غيّر الاسم آليا\"\n\n02000982=\"‮{0} بايت\"\n02000983=\"عُدِّل في\"\n\n; Messages dialog\n02000A00=\"رسائل الفحص\"\n\n02000A80=\"رسالة\"\n\n02000A91=\"‮أسلوب ضغط غير مدعوم في '‪{0}‬'\"\n02000A92=\"‮عطب بيانات في '‪{0}‬'؛ الملف مبتور.\"\n02000A93=\"‮‪CRC‬ غير مطابق في '‪{0}‬'؛ الملف مبتور.\"\n02000A94=\"‮عطب بيانات في الملف المعمَّى '‪{0}‬'. هل كلمة المرور صحيحة؟\"\n02000A95=\"‮فشل فحص ‪CRC‬ في الملف '‪{0}‬'. هل كلمة المرور صحيحة؟\"\n\n; Password dialog\n02000B00=\"أدخل كلمة السر\"\n02000B01=\"‮أدخل كلمة السر:\"\n02000B02=\"أ&ظهر كلمة السر\"\n02000B03=\"أعد إدخال كلمة السر:\"\n02000B10= \"كلمتا المرور لا تطابقان\"\n02000B11=\"استخدم فقط أحرفا لاتينية و الأرقام و العلامات خاصة (! و # و $، إلخ…) في كلمة السر\"\n02000B12=\"كلمة المرور أطول مما ينبغي\"\n\n; Progress dialog\n02000C00=\"معالجة\"\n02000C01=\"‮الزمن المنقضي:\"\n02000C02=\"‮الزمن المتبقي:\"\n02000C03=\"‮الحجم:\"\n02000C04=\"‮السرعة:\"\n02000C05=\"الملفات المعالَجة:\"\n02000C06=\"نسبة الضغط:\"\n\n02000C10=\"ال&خلفية\"\n02000C11=\"الم&قدمة\"\n02000C12=\"&جمِّد\"\n02000C13=\"&واصل\"\n\n02000C20=\"مجمدة\"\n\n02000C30=\"أمتأكد أنك تريد الإلغاء؟\"\n\n; Compress dialog\n02000D00=\"أضف إلى أرشيف\"\n02000D01=\"‮الأر&شيف:\"\n02000D02=\"‮طور الت&حديث:\"\n02000D03=\"‮صي&غة الأرشيف:\"\n02000D04=\"‮أ&سلوب الضغط:\"\n02000D05=\"أنشئ أرشيفا م&صمتا\"\n02000D06=\"‮معاملا&ت:\"\n02000D07=\"خيارات\"\n02000D08=\"أنشئ أرشيفا ذاتي الاستخراج\"\n02000D09=\"تعددية الخيوط\"\n02000D0A=\"&عمِّ أسماء الملفات\"\n02000D0B=\"‮&درجة الضغط:\"\n02000D0C=\"‮حجم المع&جم:\"\n02000D0D=\"‮&طول الكلمة:\"\n02000D0E=\"‮الذاكرة اللازمة للضغط:\"\n02000D0F=\"‮الذاكرة اللازمة للاستخراج:\"\n02000D10=\"التعمية\"\n02000D11=\"طريقة التعمية:\"\n02000D12=\"عدد خيوط المعالج الماكروي:\"\n02000D13=\"حجم الكتلة المصمتة:\"\n02000D14=\"غير مصمتة\"\n02000D15=\"مصمتة\"\n02000D16=\"اضغط الملفات المشتركة\"\n\n02000D40=\"‮&قسِّم إلى أجزاء أو بايتات:\"\n02000D41=\"حجم المجلد غير صحيح\"\n02000D42=\"حجم المجلد المعين: ‪{0}‬ بايت\\nأمتأكد أنك تريد تقسيم الأرشيف إلى كتل بهذا الحجم؟\"\n\n02000D81=\"خزن\"\n02000D82=\"اعتيادي\"\n02000D83=\"الأقصى\"\n02000D84=\"سريع\"\n02000D85=\"الأسرع\"\n02000D86=\"فائق\"\n\n02000D90=\"تصفح\"\n\n02000DA1=\"إضافة و استبدال الملفات\"\n02000DA2=\"تحديث و إضافة الملفات\"\n02000DA3=\"تحديث الملفات الموجودة فقط\"\n02000DA4=\"مزامنة الملفات\"\n\n02000DB1=\"كل الملفات\"\n\n02000DC0=\"يجري الضغط\"\n\n; Columns dialog\n02000E00=\"الأعمدة\"\n02000E01=\"أشر الأعمدة التي تريد إظهارها في هذا الدليل. استخدم أزرار \\\"حرِّك لأعلى\\\" و \\\"حرِّك للأسفل\\\" لترتيب الأعمدة.\"\n02000E02=\"يجب أن يكون عرض العمود المختار\"\n02000E03=\"عنصورة.\"\n\n02000E10=\"حرِّك لأعلى\"\n02000E11=\"حرِّك لأسفل\"\n02000E12=\"أ&ظهر\"\n02000E13=\"أ&خف\"\n02000E14=\"اضبط\"\n\n02000E81=\"العنوان\"\n02000E82=\"العرض\"\n\n; Testing\n02000F90=\"الفحص\"\n\n\n; File Manager\n\n03000000=\"‮مدير ملفات ‪7-Zip‬\"\n\n; Menu\n03000102=\"&ملف\"\n03000103=\"&حرِّر\"\n03000104=\"ا&عرض\"\n03000105=\"أ&دوات\"\n03000106=\"مسا&عدة\"\n03000107=\"علامات\"\n\n; File\n03000210=\"ا&فتح\"\n03000211=\"افتح &هنا\"\n03000212=\"افتح خا&رجا\"\n03000220=\"است&عرض\"\n03000221=\"&حرِّر\"\n03000230=\"&غيِّر الاسم\"\n03000231=\"‮ان&سخ إلى…\"\n03000232=\"‮ا&نقل إلى…\"\n03000233=\"احذ&ف\"\n03000240=\"خ&صائص\"\n03000241=\"تعل&يق\"\n03000242=\"احسب التلبيدة\"\n03000250=\"أنشئ دليلا\"\n03000251=\"أنشئ ملفا\"\n03000260=\"ا&خرج\"\n03000270=\"‮&قسِّم الملف…\"\n03000271=\"‮ا&دمج الملفات…\"\n\n; Edit\n03000310=\"ت&راجع\"\n03000311=\"أ&عد\"\n03000320=\"&قص\"\n03000321=\"ا&نسخ\"\n03000322=\"أ&لصق\"\n03000323=\"احذ&ف\"\n03000330=\"اخ&تر الكل\"\n03000331=\"دع ال&كل\"\n03000332=\"اعك&س الاختيار\"\n03000333=\"‮اختر…\"\n03000334=\"‮دع…\"\n03000335=\"اختر حسب النوع\"\n03000336=\"دع حسب النوع\"\n\n; View\n03000410=\"أيقونات &كبيرة\"\n03000411=\"أيقونات &صغيرة\"\n03000412=\"&قائمة\"\n03000413=\"&تفصيلي\"\n03000420=\"غير مرتبة\"\n03000430=\"افتح الدليل الجذر\"\n03000431=\"مستوى واحد لأعلى\"\n03000432=\"‮تاريخ الأدلة…\"\n03000440=\"أن&عش\"\n03000449=\"منظور مسطح\"\n03000450=\"&لوحتان\"\n03000451=\"أشر&طة الأدوات\"\n03000460=\"شريط أدوات الأرشيفات\"\n03000461=\"شريط الأدوات القياسي\"\n03000462=\"أزرار كبيرة\"\n03000463=\"أظهر نصوص الأزرار\"\n\n; Tools\n03000510=\"‮&خيارات…\"\n03000511=\"الم&عايرة\"\n\n; Help\n03000610=\"‮ال&محتويات…\"\n03000620=\"‮&عن ‪7-Zip‬\"\n\n; Favorites\n03000710=\"أ&ضف الدليل إلى العلامات باسم\"\n03000720=\"علِّم\"\n\n; Options Dialog\n\n03010000=\"خيارات\"\n\n; Plugins\n03010100=\"الملحقات\"\n03010101=\"‮المل&حقات:\"\n03010110=\"‮خيارات…\"\n\n; Edit\n03010200=\"المحرر\"\n03010201=\"‮ال&محرر:\"\n\n; System\n03010300=\"النظام\"\n03010302=\"‮اربط ‪7-Zip‬ بامتدادات الأسماء التالية:\"\n03010310=\"ملحقة\"\n\n; Settings\n03010400=\"تضبيطات\"\n03010401=\"‮أظهر عنصر \\\"..\\\"\"\n03010402=\"أظهر الأيقونات الفعلية للملفات\"\n03010410=\"أظهر قائمة النظام\"\n03010420=\"اختيار ال&صف بالكامل\"\n03010421=\"أظهر &خطوط الجدول\"\n03010430=\"طور الاختيار ال&بديل\"\n03010440=\"استخدم صفحات &ذاكرة كبيرة\"\n\n; Strings\n\n03020201=\"انسخ\"\n03020202=\"انقل\"\n03020203=\"‮انسخ إلى:\"\n03020204=\"‮انقل إلى:\"\n03020205=\"‮يجري النسخ…\"\n03020206=\"‮يجري النقل…\"\n03020207=\"لا يمكن نسخ/نقل العناصر إلى مثل تلك الأدلة\"\n03020208=\"العملية غير مدعومة\"\n03020209=\"اختر الدليل الوجهة\"\n\n03020210=\"تأكيد حذف ملف\"\n03020211=\"تأكيد حذف دليل\"\n03020212=\"تأكيد حذف عدة ملفات\"\n03020213=\"‮أمتأكد أنك تريد حذف '‪{0}‬'؟\"\n03020214=\"‮أمتأكد أنك تريد حذف الدليل '‪{0}‬' بكل محتوياته؟\"\n03020215=\"‮أمتأكد أنك تريد حذف ‪{0}‬ عناصر هذه؟\"\n03020216=\"‮يجري الحذف…\"\n03020217=\"عطل في حذف ملف أو دليل\"\n\n03020220=\"‮يجري تغيير الاسم…\"\n03020221=\"عطل في تغيير اسم ملف أو دليل\"\n03020222=\"أكد نسخ ملف\"\n03020223=\"أمتأكد أنك تريد نسخ ملفات إلى دليل؟\"\n\n03020230=\"أنشئ دليلا\"\n03020231=\"‮اسم الدليل:\"\n03020232=\"دليل جديد\"\n03020233=\"عطل في إنشاء دليل\"\n\n03020240=\"أنشئ ملفا\"\n03020241=\"‮اسم الملف:\"\n03020242=\"ملف جديد\"\n03020243=\"عطل في إنشاء ملف\"\n\n03020250=\"اختر\"\n03020251=\"دع\"\n03020252=\"القناع\"\n\n03020260=\"تاريخ الأدلة\"\n\n03020280=\"‮تغيّر الملف '‪{0}‬'.\\nأتريد تحديثه في الأرشيف؟\"\n03020281=\"‮تعذّر تحديث الملف\\n'‪{0}‬'\"\n03020282=\"لا يمكن بدء المحرر\"\n03020283=\"‮يجري فتح…\"\n\n03020290=\"تعليق\"\n03020291=\"‮ت&عليق:\"\n\n030202A0=\"النظام\"\n\n03020300=\"الحاسوب\"\n03020301=\"الشبكة\"\n\n03020400=\"أضف\"\n03020401=\"استخرج\"\n03020402=\"افحص\"\n\n03020420=\"انسخ\"\n03020421=\"انقل\"\n03020422=\"ألغِ\"\n03020423=\"معلومات\"\n\n03020500=\"‮قسِّم الملف‪\"\n03020501=\"‮&قسِّم إلى:\"\n03020510=\"‮يجري التقسيم…\"\n03020520=\"تأكيد التقسيم\"\n03020521=\"أتريد حقا تقسيم الملف إلى ‪{0}‬ قسما؟\"\n03020522=\"يجب أن يكون حجم القسم أقل من حجم الملف الأصلي\"\n\n03020600=\"‮ادمج الملفات‪\"\n03020601=\"‮ا&دمج إلى:\"\n03020610=\"‮يجري الدمج…\"\n03020620=\"حدد الملف الأول فقط\"\n\n03020710=\"‮يجري حساب التلبيدة…\"\n03020720=\"معلومات التلبيدة\"\n03020721=\"‮معلومات تلبيدة CRC للبيانات:\"\n03020722=\"‮معلومات تلبيدة CRC للبيانات و الأسماء:\"\n\n03020800=\"‮يجري المسح…\"\n\n03020900=\"الخصائص\"\n\n; Computer\n03031100=\"الحجم الكلي\"\n03031101=\"المساحة الشاغرة\"\n03031102=\"حجم العنقود\"\n03031103=\"العنوان\"\n\n; Network\n03031200=\"الاسم المحلي\"\n03031201=\"الموفِّر\"\n\n; Benchmark Dialog\n\n03080000=\"المعايرة\"\n03080001=\"‮استغلال الذاكرة\"\n03080002=\"الضغط\"\n03080003=\"فك ضغط\"\n03080004=\"السرعة\"\n03080005=\"المستوى\"\n03080006=\"المستوى الكلي\"\n03080007=\"الحالي\"\n03080008=\"الناتج\"\n03080009=\"‮المرات\"\n0308000A=\"‮الأعطال\"\n0308000B=\"استغلال الـمعالج الماكروي\"\n0308000C=\"المستوى / الاستغلال\"\n\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ast.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.07 beta\n; Translated by Dinamiteru\n;\n;\n;\n;\n\n00000000=\"Asturian\"\n00000001=\"Asturianu\"\n00000002=\"\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuración de 7-Zip\"\n\n; Info Page\n01000100=\"Al rodiu 7-Zip\"\n01000103=\"7-Zip ye software llibre. De toos moos, tú pues sofitar el desendolcu de 7-Zip rexistrándote.\"\n01000105=\"Rexistrar\"\n\n; Folders Page\n01000200=\"Carpetes\"\n01000210=\"&Carpeta de trabayu\"\n01000211=\"Carpeta &temporal de sistema\"\n01000212=\"&Actual\"\n01000213=\"&Especificar:\"\n01000214=\"Usar sólo pa dispositivos estrayibles\"\n\n01000281=\"Especificar llocalización pa ficheros d´archivos temporales.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integrar 7-Zip nel menú contestual\"\n01000302=\"Menú contestual en ´cascada´\"\n01000310=\"Artículos del menú contestual:\"\n\n; Language Page\n01000400=\"Llingua\"\n01000401=\"Llingua:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Ordes 7-Zip\"\n02000103=\"Abrir archivu\"\n02000104=\"Abrir l´archivu seleicionáu.\"\n02000105=\"Estrayer ficheros...\"\n02000106=\"Estrayer ficheros dende´l archivu seleicionáu.\"\n02000107=\"Añedir al archivu...\"\n02000108=\"Añedir los oxetos seleicionaos al archivu.\"\n02000109=\"Probar archivu\"\n0200010A=\"Probar integridá del archivu seleicionáu.\"\n0200010B=\"Estrayer equí\"\n0200010C=\"Estrayer ficheros del archivu seleicionáu a la carpeta actual.\"\n0200010D=\"Estrayer a {0}\"\n0200010E=\"Estrayer ficheros a subcarpeta.\"\n0200010F=\"Añedir a {0}\"\n02000110=\"Añedir los oxetos seleicionaos al archivu.\"\n02000111=\"Comprimir y mandar per correu...\"\n02000112=\"Comprimir los oxetos seleicionaos nel archivu y mandalu per correu.\"\n02000113=\"Comprimir en {0} y mandar per correu\"\n02000114=\"Comprimir los oxetos seleicionaos nel archivu y mandalu per correu.\"\n\n02000140=\"<Carpeta>\"\n02000141=\"<Archivu>\"\n\n; Properties\n02000203=\"Ruta\"\n02000204=\"Nome\"\n02000205=\"Estensión\"\n02000206=\"Carpeta\"\n02000207=\"Tamañu\"\n02000208=\"Tamañu comprimío\"\n02000209=\"Atributos\"\n0200020A=\"Creao\"\n0200020B=\"Accedío\"\n0200020C=\"Cambiao\"\n0200020D=\"Sólidu\"\n0200020E=\"Comentao\"\n0200020F=\"Cifrao\"\n02000210=\"Partir antes\"\n02000211=\"Partir dempués\"\n02000212=\"Diccionariu\"\n02000213=\"CRC\"\n02000214=\"Tipu\"\n02000215=\"Anti\"\n02000216=\"Métodu\"\n02000217=\"S.O. d´Acoyida\"\n02000218=\"Sistema de ficheros\"\n02000219=\"Usuariu\"\n0200021A=\"Grupu\"\n0200021B=\"Bloque\"\n0200021C=\"Comentariu\"\n0200021D=\"Posición\"\n\n; Status bar\n02000301=\"{0} oxetu(os) seleicionaos\"\n02000302=\"{0} oxetu(os)\"\n\n; List Context Menu\n02000401=\"&Columnes...\"\n\n02000411=\"&Abrir\"\n02000412=\"&Estrayer...\"\n\n; ToolBar\n02000501=\"Estrayer\"\n\n; Messages\n02000601=\"Esti archivu nun permite les operaciones d´actualización.\"\n02000602=\"Nun se puede actualizar l´archivu {0}\"\n02000603=\"Nun se puede crear la carpeta '{0}'\"\n02000604=\"El ficheru nun ye un archivu permitíu.\"\n02000605=\"Error\"\n02000606=\"Demasiaos artículos\"\n02000607=\"Nun hai nengún programa asociau cola estensión del ficheru\"\n02000608=\"Ensín errores\"\n\n; Dialogs\n02000702=\"Val\"\n02000705=\"&Si\"\n02000707=\"Si a &Too\"\n02000709=\"&Non\"\n0200070B=\"Non a T&oo\"\n\n02000710=\"Torgar\"\n02000711=\"&Torgar\"\n02000713=\"&Zarrar\"\n02000714=\"Parar\"\n02000715=\"Reentamar\"\n\n02000720=\"Axuda\"\n\n; Extract dialog\n02000800=\"Estrayer\"\n02000801=\"E&strayer a:\"\n02000802=\"Clave\"\n\n02000810=\"Mou de ruta\"\n02000811=\"Nomes de ruta completos\"\n02000812=\"Nomes de ruta actuales\"\n02000813=\"Ensín nomes de ruta\"\n\n02000820=\"Mou de sobreescritura\"\n02000821=\"Entrugar enantes de sobreescribir\"\n02000822=\"Sobreescribir ensín confirmación\"\n02000823=\"Dexar ficheros esistentes\"\n02000824=\"Auto renomar\"\n02000825=\"Auto renomar ficheros esistentes\"\n\n02000830=\"Ficheros\"\n02000831=\"Ficheros &seleicionaos\"\n02000832=\"&Tolos ficheros\"\n\n02000881=\"Especificar llocalización pa ficheros estrayíos.\"\n\n02000890=\"Estrayendo\"\n\n; Overwrite dialog\n02000900=\"Confirmar sustitución de ficheros\"\n02000901=\"La carpeta destín yá tien el ficheru procesáu.\"\n02000902=\"¿Quiés sustituyir el ficheru esistente\"\n02000903=\"con esti otru?\"\n\n02000911=\"A&uto Renomar\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificao el\"\n\n; Messages dialog\n02000A00=\"Mensaxes de diagnósticu\"\n\n02000A80=\"Mensax\"\n\n02000A91=\"Métodu de compresión nun permitíu pa '{0}'.\"\n02000A92=\"Error de datos en '{0}'. El ficheru ta rotu.\"\n02000A93=\"El CRC falló en '{0}'. El ficheru ta rotu.\"\n\n; Password dialog\n02000B00=\"Introduz clave\"\n02000B01=\"Introduz clave:\"\n02000B02=\"Amo&sar clave\"\n\n; Progress dialog\n02000C00=\"Procesu\"\n02000C01=\"Tiempu trescurríu:\"\n02000C02=\"Tiempu pa finar:\"\n02000C03=\"Tamañu:\"\n02000C04=\"Velocidá:\"\n\n02000C10=\"&De fondu\"\n02000C11=\"&En primer planu\"\n02000C12=\"&Posar\"\n02000C13=\"&Siguir\"\n\n02000C20=\"Posao\"\n\n02000C30=\"¿Tas fixu que quies paralo?\"\n\n; Compress dialog\n02000D00=\"Añedir al archivu\"\n02000D01=\"&Archivu:\"\n02000D02=\"Mo&u d´actualización:\"\n02000D03=\"&Formatu del archivu:\"\n02000D04=\"&Métodu de compresión:\"\n02000D05=\"Crear archivu &sólidu\"\n02000D06=\"&Parámetros:\"\n02000D07=\"Opciones\"\n02000D08=\"Crear archivu SF&X\"\n02000D09=\"Multi-enfile\"\n02000D0A=\"Cifrar &nomes de ficheru\"\n02000D0B=\"Nive&l de compresión:\"\n02000D0C=\"Tamañu del &Diccionariu:\"\n02000D0D=\"Tamañu de la pa&llabra:\"\n02000D0E=\"Usu de memoria pa la compresión:\"\n02000D0F=\"Usu de memoria pa la descompresión:\"\n\n02000D40=\"Partir en &cachos, bytes:\"\n\n02000D81=\"Nenguna\"\n02000D82=\"Normal\"\n02000D83=\"Másima\"\n02000D84=\"Rápida\"\n02000D85=\"Más rápida\"\n02000D86=\"Ultra\"\n\n02000D90=\"Agüeyar\"\n\n02000DA1=\"Añedir y sustituyir ficheros\"\n02000DA2=\"Actualizar y añedir ficheros\"\n02000DA3=\"Actualizar ficheros esistentes\"\n02000DA4=\"Sincronizar ficheros\"\n\n02000DB1=\"Tolos ficheros\"\n\n02000DC0=\"Comprimiendo\"\n\n; Columns dialog\n02000E00=\"Columnes\"\n02000E01=\"Marca les columnes que quieras amosar nesta carpeta. Usa los botones Mover p´arriba y Mover p´abaxo pa reordenar les columnes.\"\n02000E02=\"La columna selicionada tien de tener\"\n02000E03=\"pixels &d´anchu.\"\n\n02000E10=\"Mover &p´arriba\"\n02000E11=\"Mover p´a&baxo\"\n02000E12=\"Amo&sar\"\n02000E13=\"&Esconder\"\n02000E14=\"Iguar\"\n\n02000E81=\"Títulu\"\n02000E82=\"Anchu\"\n\n; Testing\n02000F90=\"Probando\"\n\n\n; File Manager\n\n03000000=\"Xestor de ficheros de 7-Zip\"\n\n; Menu\n03000102=\"F&icheru\"\n03000103=\"&Remanar\"\n03000104=\"&Ver\"\n03000105=\"&Ferramientes\"\n03000106=\"A&xuda\"\n03000107=\"F&avoritos\"\n\n; File\n03000210=\"&Abrir\"\n03000211=\"Abrir &Dientro\"\n03000212=\"Abrir F&uera\"\n03000220=\"&Ver\"\n03000221=\"&Remanar\"\n03000230=\"Reno&mar\"\n03000231=\"&Copiar a...\"\n03000232=\"&Mover a...\"\n03000233=\"&Borrar\"\n03000240=\"P&ropiedaes\"\n03000241=\"Come&ntariu\"\n03000250=\"Crear carpeta\"\n03000251=\"Crear ficheru\"\n03000260=\"Co&lar\"\n03000270=\"&Partir ficheru...\"\n03000271=\"Com&binar ficheros...\"\n\n; Edit\n03000310=\"&Desfacer\"\n03000311=\"&Refacer\"\n03000320=\"Cor&tar\"\n03000321=\"&Copiar\"\n03000322=\"A&pegar\"\n03000323=\"&Borrar\"\n03000330=\"Seleicionar &Too\"\n03000331=\"Deseleicionar too\"\n03000332=\"&Invertir seleición\"\n03000333=\"Seleicionar...\"\n03000334=\"Deseleicionar...\"\n03000335=\"Seleicionar por Tipu\"\n03000336=\"Deseleicionar por Tipu\"\n\n; View\n03000410=\"Miniatures &Grandes\"\n03000411=\"&Miniatures Pequeñes\"\n03000412=\"&Llista\"\n03000413=\"&Detalles\"\n03000420=\"Ensín Ordenar\"\n03000430=\"Abrir Carpeta Raiz\"\n03000431=\"Xubir Un Nivel\"\n03000432=\"Hestorial de Carpetes...\"\n03000440=\"Actualiza&r\"\n03000450=\"&2 Paneles\"\n03000451=\"&Barres de Ferramientes\"\n03000460=\"Barra Ferramientes d´Archivu\"\n03000461=\"Barra Ferramientes Normal\"\n03000462=\"Botones Grandes\"\n03000463=\"Amosar Testu nos Botones\"\n\n; Tools\n03000510=\"&Opciones...\"\n03000511=\"&Bancu de Pruebes\"\n\n; Help\n03000610=\"&Conteníos...\"\n03000620=\"&Al rodiu 7-Zip...\"\n\n; Favorites\n03000710=\"&Añedir carpeta a Favoritos como\"\n03000720=\"Marca\"\n\n; Options Dialog\n\n03010000=\"Opciones\"\n\n; Plugins\n03010100=\"Gabitos\"\n03010101=\"&Gabitos:\"\n03010110=\"Opciones...\"\n\n; Edit\n03010200=\"Remanaor\"\n03010201=\"&Remanaor:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Asociar 7-Zip con:\"\n03010310=\"Gabitu\"\n\n; Settings\n03010400=\"Igües\"\n03010401=\"Amosar \\\"..\\\" artículu\"\n03010402=\"Amosar les miniatures reales del ficheru\"\n03010410=\"Amosar menú del sistema\"\n03010420=\"Seleicionar tola &fila\"\n03010421=\"Amosar les llinies de la &cuadrícula\"\n\n; Strings\n\n03020201=\"Copiar\"\n03020202=\"Mover\"\n03020203=\"Copiar a:\"\n03020204=\"Mover a:\"\n03020205=\"Copiando...\"\n03020206=\"Moviendo...\"\n03020207=\"Nun se pueden mover o copiar aartículos pa ese carpetes.\"\n03020208=\"La operación nun tá permitía.\"\n\n03020210=\"Confirmar Borráu de Ficheru\"\n03020211=\"Confirmar Borráu de Carpeta\"\n03020212=\"Confirmar Borráu Múltiple de Ficheros\"\n03020213=\"¿Tas fixu que quies borrar '{0}'?\"\n03020214=\"¿Tas fixu que quies borrar la carpeta '{0}' y tolos sos conteníos?\"\n03020215=\"¿Tas fixu que quies borrar estos {0} artículos?\"\n03020216=\"Borrando...\"\n03020217=\"Error al borrar el ficheru o carpeta\"\n\n03020220=\"Renomando...\"\n03020221=\"Error al renomar el ficheru o carpeta\"\n\n03020230=\"Crear Carpeta\"\n03020231=\"Nome de la carpeta:\"\n03020232=\"Nueva carpeta\"\n03020233=\"Error al crear la carpeta\"\n\n03020240=\"Crear ficheru\"\n03020241=\"Nome del ficheru:\"\n03020242=\"Nuevu ficheru\"\n03020243=\"Error al crear el ficheru\"\n\n03020250=\"Seleicionar\"\n03020251=\"Deseleicionar\"\n03020252=\"Mazcarita:\"\n\n03020260=\"Hestorial de carpetes\"\n\n03020280=\"El ficheru '{0}' foi modificáu.\\nDo ¿Quies actualizalu nel archivu?\"\n03020281=\"Nun se pudo actualizar l´archivu\\n'{0}'\"\n03020282=\"Nun se pudo entamar el Remanaor.\"\n03020283=\"Abriendo...\"\n\n03020290=\"Comentariu\"\n03020291=\"&Comentariu:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Ordenador\"\n03020301=\"Rede de Trabayu\"\n\n03020400=\"Añedir\"\n03020401=\"Estrayer\"\n03020402=\"Probar\"\n\n03020420=\"Copiar\"\n03020421=\"Mover\"\n03020422=\"Borrar\"\n03020423=\"Información\"\n\n03020500=\"Partir Ficheru\"\n03020501=\"&Partir a:\"\n03020510=\"Partiendo...\"\n\n03020600=\"Combinar Ficheros\"\n03020601=\"&Combinar a:\"\n03020610=\"Combinando...\"\n\n; Computer\n03031100=\"Tamañu total\"\n03031101=\"Espaciu llibre\"\n03031102=\"Tamañu del clúster\"\n03031103=\"Etiqueta\"\n\n; Network\n03031200=\"Nome llocal\"\n03031201=\"Suministrador\"\n\n; Benchmark Dialog\n\n03080000=\"Bancu de Pruebes\"\n03080001=\"Usu de memoria:\"\n03080002=\"Comprimiendo\"\n03080003=\"Descomprimiendo\"\n03080004=\"Velocidá\"\n03080005=\"Valoración\"\n03080006=\"Valoración total\"\n03080007=\"Actual\"\n03080008=\"Resultáu\"\n03080009=\"Correutos:\"\n0308000A=\"Errores:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/az.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.58\n; Translated by F@rhad\n;\n;\n;\n\n\n00000000=\"Azeri\"\n00000001=\"Azərbaycanca\"\n00000002=\"44\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Nizamlama\"\n\n; Info Page\n01000100=\"7-Zip haqqında\"\n01000103=\"7-Zip açıq proqramdır. Ancaq, üzv olaraq 7-zip inkişaf fəaliyyətinə qoşula bilərsiniz.\"\n01000104=\"Texniki kömək\"\n01000105=\"Qeydiyyat\"\n\n; Folders Page\n01000200=\"Qovluqlar\"\n01000210=\"İş qovluğu\"\n01000211=\"Sistem TEMP qovluğu\"\n01000212=\"Cari qovluq\"\n01000213=\"Göstərilən qovluq:\"\n01000214=\"Yalnız çıxarıla bilən sürücülərlə işlə\"\n\n01000281=\"Müvəqqəti arxiv sənədləri üçün bir yer göstərin.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"Tərkib menülərində 7-Zip görünsün\"\n01000302=\"Açılan tərkib menüsü\"\n01000310=\"Tərkib menüsündəkilər:\"\n\n; Language Page\n01000400=\"Dil\"\n01000401=\"Dil:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip əmrləri\"\n02000103=\"Arxivi aç\"\n02000104=\"Seçilmiş arxivi açar.\"\n02000105=\"Sənədləri çıxar...\"\n02000106=\"Seçilmiş arxivdən sənədləri çıxarar.\"\n02000107=\"Arxivlə...\"\n02000108=\"Seçilənləri arxivə əlavə edər.\"\n02000109=\"Arxivi sına\"\n0200010A=\"Seçilmiş arxivin tamlığını sınayar.\"\n0200010B=\"Buraya çıxar\"\n0200010C=\"Seçilmiş arxivdəki sənədləri cari qovluqda çıxarar.\"\n0200010D=\"{0} qovluğunda çıxar\"\n0200010E=\"Alt qovluğa çıxarar.\"\n0200010F=\"{0} kimi arxivlə\"\n02000110=\"Seçilənləri arxivə əlavə edər.\"\n02000111=\"Sıxıb e-məktubla göndər...\"\n02000112=\"Seçilənləri sıxıb arxivləyər və arxivi e-məktubla göndərər.\"\n02000113=\"{0} kimi sıx və e-məktubla göndər\"\n02000114=\"Seçilənləri sıxıb arxivləyər və arxivi e-məktubla göndərər.\"\n\n02000140=\"<Qovluq>\"\n02000141=\"<Arxiv>\"\n\n; Properties\n02000203=\"Yol\"\n02000204=\"Ad\"\n02000205=\"Genişləmə\"\n02000206=\"Qovluq\"\n02000207=\"Ölçü\"\n02000208=\"Arxivdəki həcmi\"\n02000209=\"Xüsusi kəmiyyətlər\"\n0200020A=\"Yaranmış\"\n0200020B=\"Müdaxiləli\"\n0200020C=\"Dəyişmə\"\n0200020D=\"Tam\"\n0200020E=\"İzahlı\"\n0200020F=\"Kilidli\"\n02000210=\"Əvvəlki parça\"\n02000211=\"Sonrakı parça\"\n02000212=\"Lüğət\"\n02000213=\"CRC\"\n02000214=\"Tip\"\n02000215=\"Anti\"\n02000216=\"Sıxılma şəkli\"\n02000217=\"Sistem\"\n02000218=\"Sənəd Sistemi\"\n02000219=\"İstifadəçi\"\n0200021A=\"Qrup\"\n0200021B=\"Blok\"\n0200021C=\"İzah\"\n0200021D=\"Mövqe\"\n0200021E=\"Yol ön şəkilçisi\"\n0200021F=\"Qovluqlar\"\n02000220=\"Sənədlər\"\n02000221=\"Buraxılış\"\n02000222=\"Cild\"\n02000223=\"Çox cildli\"\n02000224=\"Ofset\"\n02000225=\"Körpülər\"\n02000226=\"Blok\"\n02000227=\"Cild\"\n\n; Status bar\n02000301=\"{0} ədəd seçildi\"\n02000302=\"{0} ədəd\"\n\n02000320=\"Sənədlər:\"\n02000321=\"Qovluqlar:\"\n02000322=\"Ölçü:\"\n02000323=\"Sıxılmış halda ölçü:\"\n02000324=\"Arxivlər:\"\n\n; List Context Menu\n02000401=\"Sütunlar...\"\n\n02000411=\"Aç\"\n02000412=\"Çıxar...\"\n\n; ToolBar\n02000501=\"Çıxar\"\n\n; Messages\n02000601=\"Bu arxivi yeniləyə bilməzsiniz.\"\n02000602=\"{0} arxivi yenilənmir\"\n02000603=\"'{0}' qovluğu yaradıla bilmir\"\n02000604=\"Bu sənəd tanınan arxiv deyil.\"\n02000605=\"Xəta\"\n02000606=\"Həddən artıq çoxdur\"\n02000607=\"Bu genişləməyə bağlı bir proqram yoxdur\"\n02000608=\"Xəta yoxdur.\"\n02000609=\"'{0}' arxiv kimi açıla bilmir\"\n0200060A=\"Şifrlənmiş '{0}'arxivi açıla bilmir. Açar səhvdirmi?\"\n\n; Dialogs\n02000702=\"Oldu\"\n02000705=\"Bəli\"\n02000707=\"Hamısına bəli\"\n02000709=\"Xeyr\"\n0200070B=\"Hamısına xeyr\"\n\n02000710=\"Olmadı\"\n02000711=\"Olmadı\"\n02000713=\"Bağla\"\n02000714=\"Saxla\"\n02000715=\"Təkrar başla\"\n\n02000720=\"Kömək\"\n\n; Extract dialog\n02000800=\"Çıxar\"\n02000801=\"Çıxarılacaq yer:\"\n02000802=\"Açar\"\n\n02000810=\"Yol adları\"\n02000811=\"Tam yol adları\"\n02000812=\"Cari yol adları\"\n02000813=\"Yol adları olmasın\"\n\n02000820=\"Üzərinə yazılma\"\n02000821=\"Üstünə yazmaq üçün soruş\"\n02000822=\"Soruşmadan üstünə yaz\"\n02000823=\"Mövcud olanları nəzərə alma\"\n02000824=\"Avtomatik yenidən adlandır\"\n02000825=\"Mövcud olanları yenidən adlandır\"\n\n02000830=\"Sənədlər\"\n02000831=\"Seçilmiş sənədlər\"\n02000832=\"Bütün sənədlər\"\n\n02000881=\"Çıxarılacaq sənədlər üçün bir yer göstərin.\"\n\n02000890=\"çıxarılır\"\n\n; Overwrite dialog\n02000900=\"Üstünə yazma təsdiqi\"\n02000901=\"Hədəf qovluqda eyni adlı sənəd var. Üstünə yazılsın?\"\n02000902=\"Mövcud sənəd:\"\n02000903=\"bununla dəyişdirilsinmi:\"\n\n02000911=\"Yenidən adlandır\"\n\n02000982=\"{0} bayt\"\n02000983=\"son dəyişmə \"\n\n; Messages dialog\n02000A00=\"Bildirişlər\"\n\n02000A80=\"Bildiriş\"\n\n02000A91=\"'{0}' üçün sıxılma şəkli tanınmadı.\"\n02000A92=\"'{0}' yararsızdır. (Verilənlər xətası)\"\n02000A93=\"'{0}' yararsızdır. (CRC xətası)\"\n02000A94=\"Şifrlənmiş '{0}' sənədində verilənlər xətası. Açar səhvdirmi?\"\n02000A95=\"Şifrlənmiş '{0}' sənədində CRC xətası. Açar səhvdirmi?\"\n\n; Password dialog\n02000B00=\"Açar\"\n02000B01=\"Açarı daxil edin:\"\n02000B02=\"Açar görünsün\"\n02000B03=\"Açarı təkrarlayın:\"\n02000B10=\"Açarlar eyni deyil\"\n02000B11=\"Açar üçün yalnız İngilis hərfləri, rəqəm və xüsusi simvollardan (!, #, $, ...) istifadə edin\"\n02000B12=\"Açar çox uzundur\"\n\n; Progress dialog\n02000C00=\"İş\"\n02000C01=\"Keçən müddət:\"\n02000C02=\"Qalan müddət:\"\n02000C03=\"Həcm:\"\n02000C04=\"Sür'ət:\"\n02000C05=\"Yerinə yetirilən:\"\n02000C06=\"Sıxılma dərəcəsi:\"\n\n02000C10=\"Arxa planda\"\n02000C11=\"Ön planda\"\n02000C12=\"Ara ver\"\n02000C13=\"Davam et\"\n\n02000C20=\"Ara verildi - \"\n\n02000C30=\"Həqiqətən əməliyyatın dayandırılmasını istəyirsiniz?\"\n\n; Compress dialog\n02000D00=\"Arxivlə\"\n02000D01=\"Arxiv:\"\n02000D02=\"Yeniləmə şəkli:\"\n02000D03=\"Arxiv növü:\"\n02000D04=\"Sıxılma şəkli:\"\n02000D05=\"Tam olsun\"\n02000D06=\"Parametrlər:\"\n02000D07=\"Seçmələr\"\n02000D08=\"Özü cıxarılan olsun (SFX)\"\n02000D09=\"Çox ilməli\"\n02000D0A=\"Sənəd adlarını şifrlə\"\n02000D0B=\"Sıxılma səviyyəsi:\"\n02000D0C=\"Lüğət ölçüsü:\"\n02000D0D=\"Söz ölçüsü:\"\n02000D0E=\"Yaddaş istifadəsi (Sıxma):\"\n02000D0F=\"Yaddaş istifadəsi (Açma):\"\n02000D10=\"Şifrləmə\"\n02000D11=\"Şifrləmə üsulu:\"\n02000D12=\"CPU axın sayı:\"\n02000D13=\"Ardıcıl blok ölçüsü:\"\n02000D14=\"Qeyri ardıcıl\"\n02000D15=\"Ardıcıl\"\n02000D16=\"Birgə istifadəyə açıq sənədlər sıxılsın\"\n\n02000D40=\"Cildlərə böl (Bayt):\"\n02000D41=\"Cild ölçüsü düz deyil\"\n02000D42=\"Tə'yin edilmiş cild ölçüsü: {0} bayt.\\nArxivi bu ölçü ilə cildlərə bölmək istədiyinizə əminsinizmi?\"\n\n02000D81=\"Sıxılmasız\"\n02000D82=\"Normal\"\n02000D83=\"Ən yüksək\"\n02000D84=\"Sür'ətli\"\n02000D85=\"Ən sür'ətli\"\n02000D86=\"Ultra\"\n\n02000D90=\"Göz gəzdir\"\n\n02000DA1=\"Artır və dəyişdir\"\n02000DA2=\"Yenilə və artır\"\n02000DA3=\"Yalnız yenilə\"\n02000DA4=\"Tutuşdur\"\n\n02000DB1=\"Bütün sənədlər\"\n\n02000DC0=\"sıxılır\"\n\n; Columns dialog\n02000E00=\"Sütunlar\"\n02000E01=\"Bu qovluqda görünə bilən olmasını istədiyiniz sütunları işarələyin. Sütunları düzmək üçün yuxarı-aşağı düymələrindən istifadə edin.\"\n02000E02=\"Seçilən sütun genişliyi\"\n02000E03=\"nöqtə olsun.\"\n\n02000E10=\"Yuxarı\"\n02000E11=\"Aşağı\"\n02000E12=\"Göstər\"\n02000E13=\"Gizlə\"\n02000E14=\"Tə'yin et\"\n\n02000E81=\"Başlıq\"\n02000E82=\"Genişlik\"\n\n; Testing\n02000F90=\"Sınaq\"\n\n\n; File Manager\n\n03000000=\"7-Zip Sənəd İdarəedicisi\"\n\n; Menu\n03000102=\"Sənəd\"\n03000103=\"Düzəliş\"\n03000104=\"Baxış\"\n03000105=\"Vasitələr\"\n03000106=\"Kömək\"\n03000107=\"Çox işlədilənlər\"\n\n; File\n03000210=\"Aç\"\n03000211=\"Burada aç\"\n03000212=\"Pəncərədə aç\"\n03000220=\"Göstər\"\n03000221=\"Dəyişiklik et\"\n03000230=\"Yenidən adlandır\"\n03000231=\"Köçür\"\n03000232=\"Yerini dəyiş\"\n03000233=\"Sil\"\n03000240=\"Xüsusiyyətlər\"\n03000241=\"Şərh\"\n03000242=\"Yoxlama cəmini hesabla\"\n03000250=\"Qovluq yarat\"\n03000251=\"Sənəd yarat\"\n03000260=\"Çıx\"\n03000270=\"Böl...\"\n03000271=\"Birləşdir...\"\n\n; Edit\n03000310=\"Geri get\"\n03000311=\"Təkrarla\"\n03000320=\"Kəs\"\n03000321=\"Köçür\"\n03000322=\"Yapıştır\"\n03000323=\"Sil\"\n03000330=\"Hamısını seç\"\n03000331=\"Heç birin seçmə\"\n03000332=\"Tərsini seç\"\n03000333=\"Seç...\"\n03000334=\"Seçmə...\"\n03000335=\"Bu genişləməni seç\"\n03000336=\"Genişləmə seçmə\"\n\n; View\n03000410=\"Böyük Simvollar\"\n03000411=\"Kiçik Simvollar\"\n03000412=\"Siyahı\"\n03000413=\"Cədvəl\"\n03000420=\"Sırasız\"\n03000430=\"Kök qovluğu aç\"\n03000431=\"Bir səviyyə yuxarı\"\n03000432=\"Qovluq tarixçəsi...\"\n03000440=\"Yenilə\"\n03000449=\"Müstəvi görünüş\"\n03000450=\"2 lövhə\"\n03000451=\"Alət çubuğu\"\n03000460=\"Arxiv çubuğu\"\n03000461=\"Standart çubuq\"\n03000462=\"Böyük düymələr\"\n03000463=\"Düymə mətni görünsün\"\n\n; Tools\n03000510=\"Seçmələr...\"\n03000511=\"FİƏ ölçüsü\"\n\n; Help\n03000610=\"İçindəkilər...\"\n03000620=\"7-Zip haqqında...\"\n\n; Favorites\n03000710=\"Cari qovluğu artır\"\n03000720=\"Yer\"\n\n; Options Dialog\n\n03010000=\"Seçmələr\"\n\n; Plugins\n03010100=\"Əlavə tərkiblər\"\n03010101=\"Əlavə tərkiblər:\"\n03010110=\"Xüsusiyyətlər\"\n\n; Edit\n03010200=\"Mətn düzəltmə\"\n03010201=\"Mətn düzəltmə:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"7-Zip-ə bağla:\"\n03010310=\"Əlavə tərkib\"\n\n; Settings\n03010400=\"Tənzimləmələr\"\n03010401=\"\\\"..\\\" görünsün\"\n03010402=\"Sənədlərin həqiqi simvolları görünsün\"\n03010410=\"Sistem menüsü görünsün\"\n03010420=\"Bütün sətir seçilsin\"\n03010421=\"Ayırıcılar görünsün\"\n03010430=\"Alternativ seçki rejimi\"\n03010440=\"Geniş yaddaş səhifələri işlət\"\n\n; Strings\n\n03020201=\"Köçür\"\n03020202=\"Yerini dəyiş\"\n03020203=\"Köçürüləcək yer:\"\n03020204=\"Yer dəyişdiriləcək yer:\"\n03020205=\"köçürülür...\"\n03020206=\"yer dəyişdirilir...\"\n03020207=\"Köçürülmə və ya yer dəyişmə bu cür qovluq üçün mümkün deyil.\"\n03020208=\"İş mümkün deyil.\"\n03020209=\"Qovluq seçin.\"\n\n03020210=\"Sənəd silmə təsdiqi\"\n03020211=\"Qovluq silmə təsdiqi\"\n03020212=\"Birdən çox sənədi silmə təsdiqi\"\n03020213=\"\\\"{0}\\\" silinsin?\"\n03020214=\"\\\"{0}\\\" qovluğu və içindəkilər silinsin?\"\n03020215=\"Bu {0} ədəd silinənlər geri qaytarılmayacaq, silinsin?\"\n03020216=\"silinir...\"\n03020217=\"Silmə xətası\"\n\n03020220=\"yeni ad verilir...\"\n03020221=\"Adlandırma xətası\"\n03020222=\"Sənəd köçürülməsi təsdiqi\"\n03020223=\"Sənədləri arxivə köçürmək istədiyinizə əminsinizmi\"\n\n03020230=\"Qovluq yarat\"\n03020231=\"Qovluq adı:\"\n03020232=\"Yeni qovluq\"\n03020233=\"Qovluq yaratma xətası\"\n\n03020240=\"Sənəd yarat\"\n03020241=\"Sənəd adı:\"\n03020242=\"Yeni sənəd\"\n03020243=\"Sənəd yaratma xətası\"\n\n03020250=\"Seç\"\n03020251=\"Seçmə\"\n03020252=\"Seçmə ifadəsi:\"\n\n03020260=\"Qovluq tarixçəsi\"\n\n03020280=\"'{0}' sənədi dəyişmişdir.\\nArxivdə yenilənməsini istəyirsinizmi?\"\n03020281=\"'{0}' sənədi yenilənmədi\"\n03020282=\"Mətn düzəltmə işə düşmədi.\"\n03020283=\"açılır...\"\n\n03020290=\"Şərh\"\n03020291=\"Şərh:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"EHM\"\n03020301=\"Şəbəkə\"\n\n03020400=\"Arxivlə\"\n03020401=\"Çıxar\"\n03020402=\"Sına\"\n\n03020420=\"Köçür\"\n03020421=\"Yerini dəyiş\"\n03020422=\"Sil\"\n03020423=\"Mə'lumat\"\n\n03020500=\"Böl\"\n03020501=\"Bu qovluqda böl:\"\n03020510=\"bölünür...\"\n03020520=\"Bölünmə təsdiqi\"\n03020521=\"Sənədi {0} cildə bölmək istədiyinizə əminsinizmi?\"\n03020522=\"Cild ölçüsü sənədin ölçüsündən kiçik olmalıdır\"\n\n03020600=\"Birləşdir\"\n03020601=\"Bu qovluqda birləşdir:\"\n03020610=\"birləşdirilir...\"\n03020620=\"Yalnız birinci sənədi seçin\"\n\n03020710=\"Yoxlama cəmi hesablanır...\"\n03020720=\"Yoxlama cəmi\"\n03020721=\"Verilənlər üçün CRC yoxlama cəmi:\"\n03020722=\"Verilənlər və adlar üçün CRC yoxlama cəmi:\"\n\n03020800=\"Oxunur...\"\n\n03020900=\"Xüsusiyyətlər\"\n\n; Computer\n03031100=\"Cəmi həcm\"\n03031101=\"Boş yer\"\n03031102=\"Qism həcmi\"\n03031103=\"Açıqlama\"\n\n; Network\n03031200=\"Yerli ad\"\n03031201=\"Tə'min edici\"\n\n; Benchmark Dialog\n\n03080000=\"FİƏ ölçülməsi\"\n03080001=\"Yaddaş istifadəsi:\"\n03080002=\"Sıxma\"\n03080003=\"Çıxarma\"\n03080004=\"Sür'ət\"\n03080005=\"Xal\"\n03080006=\"Təxmini orta xal\"\n03080007=\"Cari\"\n03080008=\"Nəticə\"\n03080009=\"Müvəffəqiyyət:\"\n0308000A=\"Xətalar:\"\n0308000B=\"CPU istifadəsi\"\n0308000C=\"Üstünlük / İstifadə\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ba.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.07 beta\n; Translated by Haqmar\n;\n;\n;\n;\n\n00000000=\"Bashkir\"\n00000001=\"Башҡортса\"\n00000002=\"109\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip - Яйлау\"\n\n; Info Page\n01000100=\"7-Zip тураһында\"\n01000103=\"7-Zip – ирекле рәүештә таратылған программа. Шулай ҙа һеҙ теркәлеп был программаның үҫешенә ярҙам итә алаһығыҙ.\"\n01000104=\"Ярҙам\"\n01000105=\"Теркәлеү\"\n\n; Folders Page\n01000200=\"Янсыҡтар\"\n01000210=\"&Эш янсығы\"\n01000211=\"&TEMP янсығы\"\n01000212=\"Ғә&мәлдәге\"\n01000213=\"&Янсыҡ билдәлә:\"\n01000214=\"Ҡушылмалы ташығыстар өсөн генә ҡулланырға\"\n\n01000281=\"Ваҡытлыса архивтар өсөн урын билдәлә.\"\n\n; System Page\n01000300=\"Система\"\n01000301=\"Контекст менюларҙа 7-Zip күренһен\"\n01000302=\"Һикәлтәле контекст меню\"\n01000310=\"Контекст меню матдәләре:\"\n\n; Language Page\n01000400=\"Тел һайлау\"\n01000401=\"Тел:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip әмерҙәре\"\n02000103=\"Архивты асырға\"\n02000104=\"Һайланған архивты аса.\"\n02000105=\"Файлдарҙы сығарыу...\"\n02000106=\"Һайланған архивтан файлдарҙы сығара.\"\n02000107=\"Архивға өҫтә...\"\n02000108=\"Һайланған матдәләрҙе архивға өҫтәй.\"\n02000109=\"Архивты һына\"\n0200010A=\"Һайланған архивтың бөтөнлөгөн тикшерә.\"\n0200010B=\"Бында сығар\"\n0200010C=\"Һайланған архивтағы файлдарҙы ғәмәлдәге янсыҡҡа сығара.\"\n0200010D=\"{0} янсығына сығар\"\n0200010E=\"Файлдарҙы эс янсыҡҡа сығара.\"\n0200010F=\"{0} итеп архивла\"\n02000110=\"Һайланған есемдәрҙе архивға өҫтәй.\"\n02000111=\"Ҡыҫып, e-mail менән ебәр...\"\n02000112=\"Һайланған есемдәрҙе архивға өҫтәй һәм архивды e-mail менән ебәрә.\"\n02000113=\"{0} итеп ҡыҫ һәм e-mail менән ебәр\"\n02000114=\" Һайланған есемдәрҙе архивға өҫтәй һәм архивды e-mail менән ебәрә.\"\n\n02000140=\"<Янсыҡ>\"\n02000141=\"<Архив>\"\n\n\n; Properties\n02000203=\"Юл\"\n02000204=\"Исем\"\n02000205=\"Киңәлеше\"\n02000206=\"Янсыҡ\"\n02000207=\"Күләм\"\n02000208=\"Архивдағы күләме\"\n02000209=\"Үҙенсәлектәр\"\n0200020A=\"Яһалған\"\n0200020B=\"Ирешелгән\"\n0200020C=\"Үҙгәртелгән\"\n0200020D=\"Ҡаты\"\n0200020E=\"Аңлатма\"\n0200020F=\"Серләнгән\"\n02000210=\"Алдағы киҫәк\"\n02000211=\"Киләһе киҫәк\"\n02000212=\"Һүҙлек\"\n02000213=\"CRC\"\n02000214=\"Төр\"\n02000215=\"Анти\"\n02000216=\"Ҡыҫыу ысулы\"\n02000217=\"Host OS\"\n02000218=\"Файл системаһы\"\n02000219=\"Ҡулланыусы\"\n0200021A=\"Tөркөм\"\n0200021B=\"Блок\"\n0200021C=\"Асыҡлама\"\n0200021D=\"Урыны\"\n0200021E=\"Юл префиксы\"\n\n; Status bar\n02000301=\"{0} есем һайланған\"\n02000302=\"{0} есем\"\n\n02000320=\"Файл:\"\n02000321=\"Янсыҡ:\"\n02000322=\"Күләм:\"\n\n; List Context Menu\n02000401=\"&Бағаналар...\"\n\n02000411=\"&Асыу\"\n02000412=\"&Сығарыу...\"\n\n; ToolBar\n02000501=\"Сығарыу\"\n\n; Messages\n02000601=\"Был архивды яңыртыу ғәмәлен үтәп булмай.\"\n02000602=\"{0} архивын яңыртып булмай\"\n02000603=\"{0} янсығын яһап булмай\"\n02000604=\"Был файл танылған архив төрө түгел.\"\n02000605=\"Хата\"\n02000606=\"Бик күп есем\"\n02000607=\"Был файл киңәлеше менән килешкән өҫтәмә юҡ\"\n02000608=\"Хата табылманы\"\n\n; Dialogs\n02000702=\"Тамам\"\n02000705=\"&Эйе\"\n02000707=\"Бөтәһенә лә Э&йе\"\n02000709=\"&Юҡ\"\n0200070B=\" Бөтәһенә лә Ю&ҡ\"\n\n02000710=\"Кире ал\"\n02000711=\"&Кире ал \"\n02000713=\"&Яп\"\n02000714=\"Туҡта\"\n02000715=\"Яңынан башла\"\n\n02000720=\"Ярҙам\"\n\n; Extract dialog\n02000800=\"Сығар\"\n02000801=\"Бында &сығар:\"\n02000802=\"Пароль\"\n\n02000810=\"Юл исемдәре\"\n02000811=\"&Тулы юл исемдәре \"\n02000812=\"Ғәмәлдәге юл исемдәре \"\n02000813=\"Юл исемдәре булмаһын\"\n\n02000820=\"Өҫтөнә яҙыу\"\n02000821=\"&Өҫтөнә яҙыу алдынан һора\"\n02000822=\"&Өҫтөнә яҙыу алдынан һорама\"\n02000823=\"Булған файлдарҙы үтеп кит\"\n02000824=\"Яңы исем ҡуш\"\n02000825=\"Булған файлдарға яңы исем ҡуш\"\n\n02000830=\"Файлдар\"\n02000831=\"Һ&айланған файлдар\"\n02000832=\"&Бөтә файлдар \"\n\n02000881=\"Сығарыласаҡ файлдар өсөн урын һайлағыҙ.\"\n\n02000890=\"Сығарыу бара...\"\n\n; Overwrite dialog\n02000900=\"Файл алмаштырыуҙы раҫлау\"\n02000901=\"Сығарыласаҡ янсыҡта хәҙер эшкәртелгән файл менән бер үк исемле башҡа файл бар. Өҫтөнә яҙылһынмы?\"\n02000902=\"Булған файл:\"\n02000903=\"Сығарыласаҡ файл:\"\n\n02000911=\"&Яңы исем ҡуш\"\n\n02000982=\"{0} байт\"\n02000983=\"һуңғы үҙгәртелеүе\"\n\n; Messages dialog\n02000A00=\"Тикшереү белдереүҙәре\"\n\n02000A80=\"Белдереү\"\n\n02000A91=\"'{0}' файлын ҡыҫыу ысулын табып булманы.\"\n02000A92=\"'{0}' файлында мәғлүмәт хатаһы бар. Был файл боҙоҡ һәм яраҡһыҙ.\"\n02000A93=\"'{0}' файлында CRC хатаһы бар. Был файл боҙоҡ һәм яраҡһыҙ.\"\n\n; Password dialog\n02000B00=\"Пароль керетеү\"\n02000B01=\"&Паролде керетегеҙ:\"\n02000B02=\"П&ароль күренһен\"\n\n; Progress dialog\n02000C00=\"Процесс\"\n02000C01=\"Үткән ваҡыт:\"\n02000C02=\"Ҡалған ваҡыт:\"\n02000C03=\"Күләм:\"\n02000C04=\"Тиҙлек:\"\n\n02000C10=\"&Артҡы планда\"\n02000C11=\"А&лғы планда\"\n02000C12=\"&Туҡтатып тор\"\n02000C13=\"&Дауам ит\"\n\n02000C20=\"Туҡталған\"\n\n02000C30=\"Был эште ысынлап та өҙөргә теләйһегеҙме? \"\n\n; Compress dialog\n02000D00=\"Архивға өҫтә\"\n02000D01=\"&Архив:\"\n02000D02=\"&Яңыртыу ысулы:\"\n02000D03=\"А&рхив төрө:\"\n02000D04=\"Ҡ&ыҫыу ысулы:\"\n02000D05=\"Ҡа&ты архив яһа\"\n02000D06=\"&Параметрҙар:\"\n02000D07=\"&Көйләүҙәр\"\n02000D08=\"SFX ар&хивын яһау\"\n02000D09=\"Күп &элмәкле\"\n02000D0A=\"&Файл исемдәрен шифрла\"\n02000D0B=\"Ҡыҫыу &дәрәжәһе:\"\n02000D0C=\"Һүҙ&лек күләме:\"\n02000D0D=\"Һүҙ күлә&ме:\"\n02000D0E=\"Ҡыҫҡанда хәтер ҡулланыу:\"\n02000D0F=\"Сығарғанда хәтер ҡулланыу:\"\n\n02000D40=\"Киҫәк/&байт итеп бүл:\"\n\n02000D81=\"Ҡыҫыуһыҙ\"\n02000D82=\"Ғәҙәти\"\n02000D83=\"Максимум\"\n02000D84=\"Тиҙ\"\n02000D85=\"Бик тиҙ\"\n02000D86=\"Ультра\"\n\n02000D90=\"Ҡарап сығыу\"\n\n02000DA1=\"Файлдарҙы өҫтәргә һәм алмаштырырға\"\n02000DA2=\"Файлдарҙы яңыртырға һәм өҫтәргә\"\n02000DA3=\"Файлдарҙы яңырт\"\n02000DA4=\"Файлдарҙы тигеҙлә\"\n\n02000DB1=\"Бөтә файлдар\"\n\n02000DC0=\"Ҡыҫыу бара...\"\n\n; Columns dialog\n02000E00=\"Бағаналар\"\n02000E01=\"Был янсыҡта күренәсәк бағаналарҙы билдәләгеҙ. Бағаналарҙы рәтләү өсөн Өҫкә һәм Аҫҡа төймәләрен ҡулланығыҙ\"\n02000E02=\"һайланған бағаналарҙың киңлеге\"\n02000E03=\"&нөктә булһын.\"\n\n02000E10=\"Өҫ&кә\"\n02000E11=\"&Аҫҡа\"\n02000E12=\"Кү&рһәт\"\n02000E13=\"&Йәшер\"\n02000E14=\"Ҡуйырға\"\n\n02000E81=\"Башлыҡ\"\n02000E82=\"Киңлек\"\n\n; Testing\n02000F90=\"Һынау бара...\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&Файл\"\n03000103=\"&Төҙәтеү\"\n03000104=\"&Күренеш\"\n03000105=\"Ҡ&оралдар\"\n03000106=\"&Ярҙам\"\n03000107=\"Һ&айланмалар\"\n\n\n; File\n03000210=\"&Ас\"\n03000211=\"Үҙ&ендә Ас\"\n03000212=\"&Яңы тәҙрәлә Ас\"\n03000220=\"Ҡа&рау\"\n03000221=\"&Мөхәррирлә\"\n03000230=\"&Исемен үҙгәрт\"\n03000231=\"&Күбәйт...\"\n03000232=\"Кү&сер...\"\n03000233=\"&Юй\"\n03000240=\"Үҙе&нсәлектәр\"\n03000241=\"Асыҡла&ма\"\n03000242=\"Тикшереү һаны\"\n03000250=\"Яңы янсыҡ...\"\n03000251=\"Яңы &файл...\"\n03000260=\"С&ыҡ\"\n03000270=\"Файлды &бүл...\"\n03000271=\"Файлдарҙы бер&ләштер...\"\n\n; Edit\n03000310=\"&Кире ал\"\n03000311=\"Ҡ&айтар\"\n03000320=\"К&иҫ\"\n03000321=\"&Хәтергә ал\"\n03000322=\"&Йәбештер\"\n03000323=\"&Юй\"\n03000330=\"&Бөтәһен дә һайла\"\n03000331=\"Һай&лауҙарҙы кире ал\"\n03000332=\"Бил&дәләнгәндәрҙе кире әйләндер\"\n03000333=\"Маска менән һайла...\"\n03000334=\"Һайлауҙарҙы яп...\"\n03000335=\"Төр буйынса һайла\"\n03000336=\"Төр буйынса һайлауҙы яп\"\n\n; View\n03000410=\"Ҙ&ур тамғалар\"\n03000411=\"&Бәләкәй тамғалар\"\n03000412=\"&Исемлек\"\n03000413=\"&Ентекле\"\n03000420=\"Рәтһеҙ\"\n03000430=\"Төп янсыҡты ас\"\n03000431=\"Бер кимәл өҫкә \"\n03000432=\"Янсыҡтар тарихы...\"\n03000440=\"&Яңырт\"\n03000449=\"Барыһын да күрһәт\"\n03000450=\"&2 Панель\"\n03000451=\"Ҡ&оралдар таҡтаһы\"\n03000460=\"&Архивлау төймәләре\"\n03000461=\"Ғәҙәти төймәләр \"\n03000462=\"Ҙур төймәләр\"\n03000463=\"Төймә яҙыуҙары күренһен\"\n\n; Tools\n03000510=\"&Көйләүҙәр...\"\n03000511=\"&Етештереүсәнлекте үлсәү\"\n\n; Help\n03000610=\"&Эстәлек...\"\n03000620=\"7-Zip &тураһында...\"\n\n; Favorites\n03000710=\"Ғәҙә&ттәге янсыҡты һайланғандарға өҫтә:\"\n03000720=\"Урын\"\n\n; Options Dialog\n\n03010000=\"Көйләү\"\n\n; Plugins\n03010100=\"Өҫтәмәләр\"\n03010101=\"&Өҫтәмәләр:\"\n03010110=\"Яйлауҙар...\"\n\n; Edit\n03010200=\"Мөхәррирләүсе\"\n03010201=\"&Мөхәррирләүсе:\"\n\n; System\n03010300=\"Система\"\n03010302=\"7-Zip менән килештер:\"\n03010310=\"Өҫтәмә\"\n\n; Settings\n03010400=\"Көйләүҙәр\"\n03010401=\"\\\"..\\\" есеме күренһен\"\n03010402=\"Файлдарҙың ысын тамғалары күренһен\"\n03010410=\"Система менюһы күренһен\"\n03010420=\"Бөтә юл һайланһын\"\n03010421=\"Теҙмә һыҙыҡтары күренһен\"\n03010430=\"Альтернатив һайлау ысулы\"\n03010440=\"Ҙур хәтер биттәрен ҡуллан\"\n\n; Strings\n\n03020201=\"Хәтергә ал\"\n03020202=\"Күсер\"\n03020203=\"Күбәйтеләсәк урын:\"\n03020204=\"Күсереләсәк урын:\"\n03020205=\"Күбәйтеү...\"\n03020206=\"Күсереү...\"\n03020207=\"Был янсыҡ өсөн есемдәрҙе күбәйтеп йәки күсереп булмай.\"\n03020208=\"Ғәмәлде үтәп булмай\"\n\n03020210=\"Файл юйыуҙы раҫлау\"\n03020211=\"Янсыҡты юйыуҙы раҫлау\"\n03020212=\"Берҙән күп файл юйыуҙы раҫлау\"\n03020213=\"'{0}' юйылһынмы?\"\n03020214=\"'{0}' янсығы һәм эсендәгеләр юйылһынмы?\"\n03020215=\"{0} есеме юйылһынмы?\"\n03020216=\"Юйыу бара...\"\n03020217=\"Файл йәки янсыҡ юйыу хатаһы\"\n\n03020220=\"Яңынан исемләү бара...\"\n03020221=\"Файлға йәки янсыҡҡа яңы исем биреү хатаһы\"\n03020222=\"Файлдарҙы күбәйтеүҙе раҫлау\"\n03020223=\"Был файлдар архивға ҡуйылһынмы?\"\n\n03020230=\"Янсыҡ яһа\"\n03020231=\"Янсыҡ исеме:\"\n03020232=\"Яңы янсыҡ\"\n03020233=\"Янсыҡ яһау хатаһы\"\n\n03020240=\"Файл яһа\"\n03020241=\"Файл исеме:\"\n03020242=\"Яңы файл\"\n03020243=\"Файл яһау хатаһы\"\n\n03020250=\"Һайла\"\n03020251=\"Һайлауҙы кире ал\"\n03020252=\"Маска:\"\n\n03020260=\"Янсыҡтар тарихы\"\n\n03020280=\"'{0}' файлы үҙгәртелде.\\nБыл файл архивта яңыртылһынмы?\"\n03020281=\"Файлды яңыртып булманы\\n'{0}'\"\n03020282=\"Мөхәррирләүсене асып булманы.\"\n03020283=\"Асыла...\"\n\n03020290=\"Асыҡлама\"\n03020291=\"&Асыҡлама:\"\n\n030202A0=\"Система\"\n\n03020300=\"Компьютер\"\n03020301=\"Селтәр\"\n\n03020400=\"Өҫтә\"\n03020401=\"Сығар\"\n03020402=\"Һына\"\n\n03020420=\"Күбәйт\"\n03020421=\"Күсер\"\n03020422=\"Юй\"\n03020423=\"Үҙенсәлектәр\"\n\n03020500=\"Файлды бүл\"\n03020501=\"&Ошо янсыҡҡа бүл:\"\n03020510=\"Бүлеү бара...\"\n\n03020600=\"Файлдарҙы берләштер \"\n03020601=\"&Ошо янсыҡта берләштер:\"\n03020610=\"Берләштереү бара...\"\n\n03020710=\"Тикшереү һанын иҫәпләү бара...\"\n03020720=\"Тикшереү һаны\"\n03020721=\"Мәғлүмәттәр өсөн CRC тикшереү һаны:\"\n03020722=\" Мәғлүмәттәр һәм исемдәр өсөн CRC тикшереү һаны:\"\n\n03020800=\"Тарау бара...\"\n\n; Computer\n03031100=\"Барлыҡ күләм\"\n03031101=\"Буш урын\"\n03031102=\"Бөртөк күләме\"\n03031103=\"Билдә\"\n\n; Network\n03031200=\"Урындағы Исем\"\n03031201=\"Провайдер\"\n\n; Benchmark Dialog\n\n03080000=\"Етештереүсәнлекте тикшереү\"\n03080001=\"Хәтер ҡулланыу:\"\n03080002=\"Ҡыҫыу\"\n03080003=\"Сығарыу\"\n03080004=\"Тиҙлек\"\n03080005=\"Рейтинг\"\n03080006=\"Дөйөм рейтинг\"\n03080007=\"Хәҙерге\"\n03080008=\"Һөҙөмтә\"\n03080009=\"Үтеүҙәр:\"\n0308000A=\"Хаталар:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/be.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by Drive DRKA\n; Last modification :\n; 05-09-2007 15:27\n;\n;\n\n00000000=\"Belarusian\"\n00000001=\"Беларуская\"\n00000002=\"35\"\n\n; 7-Zip Configuration\n; Title\n01000000=\"7-Zip - Канфігурацыя\"\n\n; Info Page\n01000100= \"Аб праграме 7-Zip\"\n01000103= \"7-Zip з'яўляецца вольна распаўсюджваемай праграмай. Аднак калі вы жадаеце падтрымаць распрацоўку 7-Zip, вы можаце зарэгістраваць праграму.Праграма перакладена Drive DRKA.Мая электронная скрыня: drka2003@mail.ru.Пераклад зроблен у верасні 2007 года.\"\n01000104= \"Падтрымка\"\n01000105= \"Зарэгістраваць\"\n\n; Folders Page\n01000200=\"Папкі\"\n01000210=\"&Працоўная Папка\"\n01000211=\"&Сістэмная часавая Папка\"\n01000212=\"&Бягучая\"\n01000213=\"&Задаць:\"\n01000214=\"Выкарыстаць толькі для зменных носьбітаў\"\n01000281=\"Пакажыце становішча для часавых архіваў.\"\n\n; System Page\n01000300=\"Сістэма\"\n01000301=\"Убудаваць 7-Zip у кантэкстнае меню абалонкі\"\n01000302=\"Каскаднае кантэкстнае меню\"\n01000310=\"Элементы кантэкстнага меню:\"\n\n; Language Page\n01000400=\"Мова\"\n01000401=\"Мова:\"\n\n; 7-Zip Explorer extension\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Каманды 7-Zip.\"\n02000103=\"Адкрыць архіў\"\n02000104=\"Адкрыццё вылучанага архіва.\"\n02000105=\"Распакаваць\"\n02000106=\"Выманне файлаў з вылучанага архіва.\"\n02000107=\"Дадаць да архіва...\"\n02000108=\"Дадаць вылучаныя аб'екты да архіва.\"\n02000109=\"Тэставаць\"\n0200010A=\"Тэставанне вылучанага архіва.\"\n0200010B=\"Распакаваць тут\"\n0200010C=\"Выманне файлаў з вылучанага архіва ў бягучую папку.\"\n0200010D=\"Распакаваць у {0}\"\n0200010E=\"Выманне файлаў у падкаталог.\"\n0200010F=\"Дадаць да {0}\"\n02000110=\"Дадаць вылучаныя аб'екты да архіва.\"\n02000111=\"Сціснуць і адправіць па email...\"\n02000112=\"Сціснуць вылучаныя аб'екты і адправіць архіў па email.\"\n02000113=\"Сціснуць у {0} і адправіць па email\"\n02000114=\"Сціснуць вылучаныя аб'екты і адправіць архіў па email.\"\n02000140=\"<Папка>\"\n02000141=\"<Архіў>\"\n\n; Properties\n02000203=\"Шлях\"\n02000204=\"Імя\"\n02000205=\"Пашырэнне\"\n02000206=\"Папка\"\n02000207=\"Памер\"\n02000208=\"Сціснуты\"\n02000209=\"Атрыбуты\"\n0200020A=\"Створаны\"\n0200020B=\"Адчынены\"\n0200020C=\"Зменены\"\n0200020D=\"Бесперапынны\"\n0200020E=\"Каментар\"\n0200020F=\"Зашыфраваны\"\n02000210=\"Пабіты Да\"\n02000211=\"Пабіты Пасля\"\n02000212=\"Слоўнік\"\n02000213=\"CRC\"\n02000214=\"Тып\"\n02000215=\"Анты\"\n02000216=\"Метад\"\n02000217=\"Сістэма\"\n02000218=\"Файлавая Сістэма\"\n02000219=\"Карыстач\"\n0200021A=\"Група\"\n0200021B=\"Блок\"\n0200021C=\"Каментар\"\n0200021D=\"Пазіцыя\"\n0200021E=\"Шлях\"\n0200021F=\"папок\"\n02000220=\"Файлаў\"\n02000221=\"Версія\"\n02000222=\"Тым\"\n02000223=\"Шматтомны\"\n02000224=\"Зрушэнне\"\n02000225=\"Спасылак\"\n02000226=\"Блокаў\"\n02000227=\"Тамоў\"\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"Працэсар\"\n0200022C=\"Фізічны Памер\"\n0200022D=\"Памер Загалоўкаў\"\n0200022E=\"Кантрольная Сума\"\n0200022F=\"Характарыстыкі\"\n02000230=\"Віртуальны Адрас\"\n\n; Status bar\n02000301=\"Вылучана аб'ектаў: {0}\"\n02000302=\"{0} аб'ект(ов)\"\n02000320=\"Файлаў:\"\n02000321=\"папок:\"\n02000322=\"Памер:\"\n02000323=\"Сціснуты:\"\n02000324=\"Архіваў:\"\n\n; List Context Menu\n02000401=\"&Слупкі...\"\n02000411=\"&Адкрыць\"\n02000412=\"&Выняць...\"\n\n; ToolBar\n02000501=\"Выняць\"\n\n; Messages\n02000601=\"Аперацыі змены не падтрымліваюцца для гэтага архіва.\"\n02000602=\"Не атрымалася змяніць архіў {0}\"\n02000603=\"Не атрымалася стварыць папку '{0}'\"\n02000604=\"Файл не з'яўляецца падтрымоўваным архівам.\"\n02000605=\"Памылка\"\n02000606=\"Занадта шмат элементаў\"\n02000607=\"Няма асацыяванага прыкладання\"\n02000608=\"Памылак не знойдзена\"\n02000609=\"Не атрымалася адкрыць файл '{0}' як архіў\"\n0200060A=\"Не атрымалася адкрыць зашыфраваны архіў '{0}'. Няслушны пароль?\"\n0200060B=\"Нядосыць вольнай памяці\"\n0200060C=\"Невядомая памылка\"\n0200060D=\"Непадтрымоўваны тып архіва\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Так\"\n02000707=\"Ды для &усіх\"\n02000709=\"&Не\"\n0200070B=\"Няма для ў&сех\"\n02000710=\"Адмена\"\n02000711=\"&Адмена\"\n02000713=\"&Зачыніць\"\n02000714=\"Стоп\"\n02000715=\"Перазапуск\"\n02000720=\"Дапамога\"\n\n; Extract dialog\n02000800=\"Выняць\"\n02000801=\"&Распакаваць у:\"\n02000802=\"&Пароль\"\n02000810=\"Шляхі\"\n02000811=\"Па&лные шляхі\"\n02000812=\"Аб&тносительные шляхі\"\n02000813=\"&Без шляхоў\"\n02000820=\"Перазапіс\"\n02000821=\"&З пацверджаннем\"\n02000822=\"Бы&ез пацверджанні\"\n02000823=\"Проп&ускать\"\n02000824=\"Пераназваць автом.\"\n02000825=\"Переим. автом. істот.\"\n02000830=\"Файлы\"\n02000831=\"Абраныя файлы\"\n02000832=\"Усе файлы\"\n02000881=\"Пакажыце становішча для вымаемых файлаў.\"\n02000890=\"Распакаванне\"\n\n; Overwrite dialog\n02000900=\"Пацверджанне замены файла\"\n02000901=\"Папка ўжо ўтрымоўвае апрацоўваны файл.\"\n02000902=\"Замяніць існы файл\"\n02000903=\"наступным файлам?\"\n02000911=\"Пераназваць автом.\"\n02000982=\"{0} байтаў\"\n02000983=\"зменены\"\n\n; Messages dialog\n02000A00=\"Паведамленні\"\n02000A80=\"Паведамленне\"\n02000A91=\"Непадтрымоўваны метад сціску для файла '{0}'.\"\n02000A92=\"Памылка ў дадзеных у '{0}'. Файл сапсаваны.\"\n02000A93=\"Памылка CRC у '{0}'. Файл сапсаваны.\"\n02000A94=\"Памылка ў дадзеных зашыфраванага файла '{0}'. Няслушны пароль?\"\n02000A95=\"Памылка CRC для зашыфраванага файла '{0}'. Няслушны пароль?\"\n\n; Password dialog\n02000B00=\"Увод пароля\"\n02000B01=\"&Увядзіце пароль:\"\n02000B02=\"&Паказаць пароль\"\n02000B03=\"&Паўторыце пароль:\"\n02000B10=\"Паролі не супадаюць\"\n02000B11=\"Для пароля выкарыстайце толькі знакі лацінскага алфавіту, лічбы і адмысловыя знакі (!, #, $, ...)\"\n02000B12=\"Пароль занадта доўгі\"\n\n; Progress dialog\n02000C00=\"Працэс\"\n02000C01=\"Мінула:\"\n02000C02=\"Засталося:\"\n02000C03=\"Усяго:\"\n02000C04=\"Хуткасць:\"\n02000C05=\"Памер:\"\n02000C06=\"Ступень сціску:\"\n02000C10=\"&Фонам\"\n02000C11=\"&На пярэдні план\"\n02000C12=\"&Паўза\"\n02000C13=\"&Працягнуць\"\n02000C20=\"На паўзе\"\n02000C30=\"Вы сапраўды жадаеце перапыніць аперацыю?\"\n\n; Compress dialog\n02000D00=\"Дадаць да архіва\"\n02000D01=\"&Архіў:\"\n02000D02=\"&Рэжым змены:\"\n02000D03=\"&Фармат архіва:\"\n02000D04=\"&Метад сціску:\"\n02000D05=\"Стварыць &Solid архіў\"\n02000D06=\"&Параметры:\"\n02000D07=\"&Опцыі\"\n02000D08=\"Стварыць SF&X-архіў\"\n02000D09=\"М&ногопоточность\"\n02000D0A=\"&Шыфраваць імёны файлаў\"\n02000D0B=\"&Узровень сціску:\"\n02000D0C=\"Памер &слоўніка:\"\n02000D0D=\"Памер з&лоўлі:\"\n02000D0E=\"Аб'ём памяці для пакавання:\"\n02000D0F=\"Аб'ём памяці для распакавання:\"\n02000D10=\"Шыфраванне\"\n02000D11=\"Метад шыфравання:\"\n02000D12=\"Лік струменяў:\"\n02000D13=\"Памер блока:\"\n02000D14=\"Па памеры файла\"\n02000D15=\"Бесперапынны\"\n02000D16=\"Сціскаць адчыненыя для запісу файлы\"\n02000D40=\"Разбіць на &тамы памерам (у байтах):\"\n02000D41=\"Памылка ў поле для задання памеру тамоў\"\n02000D42=\"Усталяваны памер тома: {0} байтаў.\\nВы сапраўды жадаеце разбіць архіў на такія тамы?\"\n02000D81=\"Без сціску\"\n02000D82=\"Нармалёвы\"\n02000D83=\"Максімальны\"\n02000D84=\"Хуткі\"\n02000D85=\"Хуткасны\"\n02000D86=\"Ультра\"\n02000D90=\"Прагартаць\"\n02000DA1=\"Дадаць і замяніць\"\n02000DA2=\"Абнавіць і дадаць\"\n02000DA3=\"Абнавіць\"\n02000DA4=\"Сінхранізаваць\"\n02000DB1=\"Усе файлы\"\n02000DC0=\"Кампрэсія\"\n\n; Columns dialog\n02000E00=\"Слупкі\"\n02000E01=\"Пазначце слупкі, якія варта адлюстроўваць у гэтай тэчцы. Кнопкамі \\\"Уверх\\\" і \\\"Уніз\\\" можна задаць парадак прытрымлівання слупкоў.\"\n02000E02=\"Абраныя слупкі павінны мець шырыню\"\n02000E03=\"кропак.\"\n02000E10=\"&Уверх\"\n02000E11=\"У&ніз\"\n02000E12=\"П&аказаць\"\n02000E13=\"&Схаваць\"\n02000E14=\"Усталяваць\"\n02000E81=\"Імя\"\n02000E82=\"Шырыня\"\n\n; Testing\n02000F90=\"Тэставанне\"\n\n; File Manager\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&Файл\"\n03000103=\"&Праўка\"\n03000104=\"&Выгляд\"\n03000105=\"С&ервіс\"\n03000106=\"&Даведка\"\n03000107=\"&Абранае\"\n\n; File\n03000210=\"&Адкрыць\"\n03000211=\"Адкрыць &усярэдзіне\"\n03000212=\"Адкрыць снару&жи\"\n03000220=\"Прагляд\"\n03000221=\"&Рэдагаваць\"\n03000230=\"Переи&меновать\"\n03000231=\"&Капіяваць у...\"\n03000232=\"&Перамясціць у...\"\n03000233=\"&Выдаліць\"\n03000240=\"Сво&йства\"\n03000241=\"Комме&нтарий\"\n03000242=\"Кантрольная сума\"\n03000250=\"&Стварыць папку\"\n03000251=\"Ств&арыць Файл\"\n03000260=\"У&ыход\"\n03000270=\"Ра&збить файл...\"\n03000271=\"Аб&бъединить файлы...\"\n\n; Edit\n03000310=\"&Адмяніць\"\n03000311=\"&Вярнуць\"\n03000320=\"&Выразаць\"\n03000321=\"&Капіяваць\"\n03000322=\"Вст&авить\"\n03000323=\"&Выдаліць\"\n03000330=\"Вылучыць у&сёе\"\n03000331=\"Прыбраць вылучэнне\"\n03000332=\"&Звярнуць у&ыделение\"\n03000333=\"Вылучыць...\"\n03000334=\"Прыбраць вылучэнне...\"\n03000335=\"Вылучыць па тыпе\"\n03000336=\"Прыбраць вылучэнне па тыпе\"\n\n; View\n03000410=\"&Буйныя значкі\"\n03000411=\"&Дробныя значкі\"\n03000412=\"Спис&ок\"\n03000413=\"&Табліца\"\n03000420=\"Без сартавання\"\n03000430=\"Адкрыць каранёвую папку\"\n03000431=\"Пераход на адзін узровень уверх\"\n03000432=\"Гісторыя папок...\"\n03000440=\"Аб&бновить\"\n03000449=\"Плоскі рэжым\"\n03000450=\"&2 Панэлі\"\n03000451=\"&Панэлі прылад\"\n03000460=\"Панэль кнопак архіватара\"\n03000461=\"Стандартная панэль кнопак\"\n03000462=\"Вялікія кнопкі\"\n03000463=\"Надпісы на кнопках\"\n\n; Tools\n03000510=\"Налады...\"\n03000511=\"Тэставанне прадукцыйнасці\"\n\n; Help\n03000610=\"&Змест...\"\n03000620=\"Аб &праграме...\"\n\n; Favorites\n03000710=\"Дадаць папку ў &абранае як\"\n03000720=\"Закладка\"\n\n; Options Dialog\n03010000=\"Налады\"\n\n; Plugins\n03010100=\"Убудовы\"\n03010101=\"&Убудовы:\"\n03010110=\"Сво&йства\"\n\n; Edit\n03010200=\"Рэдактар\"\n03010201=\"&Рэдактар:\"\n\n; System\n03010300=\"Сістэма\"\n03010302=\"Асацыяваць 7-Zip з файламі:\"\n03010310=\"Убудова\"\n\n; Settings\n03010400=\"Налады\"\n03010401=\"Паказваць элемент \\\"..\\\"\"\n03010402=\"Паказваць рэальныя абразкі файлаў\"\n03010410=\"Паказваць сістэмнае меню\"\n03010420=\"Курсор на ўвесь радок\"\n03010421=\"Паказваць падзельнікі\"\n03010430=\"Альтэрнатыўны рэжым пазнакі\"\n03010440=\"Выкарыстаць вялікія старонкі памяці\"\n\n; Strings\n03020201=\"Капіяваць\"\n03020202=\"Перамясціць\"\n03020203=\"Капіяваць у:\"\n03020204=\"Перамясціць у:\"\n03020205=\"Капіяванне...\"\n03020206=\"Перасоўванне...\"\n03020207=\"Нельга скапіяваць аб'екты для такіх папок\"\n03020208=\"Аперацыя не падтрымліваецца для гэтай папкі.\"\n03020209=\"Пакажыце папку.\"\n03020210=\"Пацверджанне выдалення файла\"\n03020211=\"Пацверджанне выдалення папкі\"\n03020212=\"Пацверджанне выдалення групы файлаў\"\n03020213=\"Вы сапраўды жадаеце выдаліць \\\"{0}\\\"?\"\n03020214=\"Вы сапраўды жадаеце выдаліць папку \\\"{0}\\\" і ўсё яе змесціва?\"\n03020215=\"Вы сапраўды жадаеце выдаліць гэтыя аб'екты ({0} шт.)?\"\n03020216=\"Выдаленне...\"\n03020217=\"Памылка пры выдаленні файла або папкі\"\n03020218=\"Сістэма не падтрымлівае аперацыю выдалення файлаў з доўгімі шляхамі ў кошык\"\n03020220=\"Пераназванне...\"\n03020221=\"Памылка пры пераназванні файла або папкі\"\n03020222=\"Пацверджанне капіявання файлаў\"\n03020223=\"Вы сапраўды жадаеце скапіяваць гэтыя файлы ў архіў\"\n03020230=\"Стварыць папку\"\n03020231=\"Імя папкі:\"\n03020232=\"Новая Папка\"\n03020233=\"Памылка пры стварэнні папкі\"\n03020240=\"Стварыць файл\"\n03020241=\"Імя файла:\"\n03020242=\"Новы файл\"\n03020243=\"Памылка пры стварэнні файла\"\n03020250=\"Вылучыць\"\n03020251=\"Прыбраць вылучэнне\"\n03020252=\"Маска:\"\n03020260=\"Гісторыя папок\"\n03020280=\"Файл '{0}' быў зменены.\\nВы жадаеце абнавіць яго ў архіве?\"\n03020281=\"Не атрымалася абнавіць файл\\n'{0}'\"\n03020282=\"Не атрымалася запусціць рэдактар\"\n03020283=\"Адкрыццё...\"\n03020284=\"Файл падобны на вірус (імя файла ўтрымоўвае доўгую паслядоўнасць прабелаў).\"\n03020290=\"Каментар\"\n03020291=\"&Каментар:\"\n030202A0=\"Сістэма\"\n03020300=\"Кампутар\"\n03020301=\"Сетка\"\n03020302=\"Дакументы\"\n03020400=\"Дадаць\"\n03020401=\"Выняць\"\n03020402=\"Тэставаць\"\n03020420=\"Капіяваць\"\n03020421=\"Перамясціць\"\n03020422=\"Выдаліць\"\n03020423=\"Інфармацыя\"\n03020500=\"Разбіць файл\"\n03020501=\"&Разбіць у:\"\n03020510=\"Разбіццё...\"\n03020520=\"Пацверджанне  разбіцця\"\n03020521=\"Вы сапраўды жадаеце разбіць файл на {0} частак?\"\n03020522=\"Памер тома павінен быць менш памеру зыходнага файла\"\n03020600=\"Аб'яднаць файлы\"\n03020601=\"&Аб'яднаць у:\"\n03020610=\"Аб'яднанне...\"\n03020620=\"Неабходна вылучыць толькі першую частку пабітага файла\"\n03020621=\"Не атрымалася распазнаць пабіты файл\"\n03020622=\"Не атрымалася знайсці больш адной часткі пабітага файла\"\n03020710=\"Вылічэнне кантрольнай сумы...\"\n03020720=\"Кантрольная сума\"\n03020721=\"Кантрольная сума CRC для дадзеных:\"\n03020722=\"Кантрольная сума CRC для дадзеных і імёнаў:\"\n03020800=\"Сканаванне...\"\n03020900=\"Уласцівасці\"\n03020A01=\"Аперацыя не можа быць выкананая з папкі, якая мае доўгі шлях.\"\n03020A02=\"Вы павінны вылучыць адзін файл\"\n03020A03=\"Вы павінны вылучыць адзін або некалькі файлаў\"\n03020A04=\"Файл {0} ужо існуе\"\n\n; Computer\n03031100=\"Ёмістасць\"\n03031101=\"Вольна\"\n03031102=\"Памер кластара\"\n03031103=\"Пазнака\"\n\n; Network\n03031200=\"Лакальнае імя\"\n03031201=\"Правайдэр\"\n\n; Benchmark Dialog\n03080000=\"Тэставанне прадукцыйнасці\"\n03080001=\"Аб'ём памяці:\"\n03080002=\"Пакаванне\"\n03080003=\"Распакаванне\"\n03080004=\"Хуткасць\"\n03080005=\"Рэйтынг\"\n03080006=\"Агульны рэйтынг\"\n03080007=\"Бягучы\"\n03080008=\"Выніковы\"\n03080009=\"Праходаў:\"\n0308000A=\"Памылак:\"\n0308000B=\"Нагрузка\"\n0308000C=\"Рэйтынг / Нагр.\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/bg.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.37 Beta\n; Translated by chavv, http://www.angelfire.com/creep/chavvdarrr/\n; icobgr\n;\n;\n;\n\n00000000=\"Bulgarian\"\n00000001=\"Български\"\n00000002=\"2\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Конфигурация на 7-Zip\"\n\n; Info Page\n01000100=\"Информация\"\n01000103=\"7-Zip e свободно распространявана програма. Все пак, можете да подпомогнете разработването на 7-zip като се регистрирате\"\n01000104=\"Поддръжка\"\n01000105=\"Регистрация\"\n\n; Folders Page\n01000200=\"Директории\"\n01000210=\"&Работна директория\"\n01000211=\"&Системната TEMP директория\"\n01000212=\"&Текущата\"\n01000213=\"&Друга:\"\n01000214=\"Исползване само за преносими носители\"\n\n01000281=\"Определете място за временните архиви.\"\n\n; System Page\n01000300=\"Система\"\n01000301=\"Интегриране на 7-Zip в контекстното меню на Explorer\"\n01000302=\"Групирано контекстно меню\"\n01000310=\"Елементи на контекстното меню:\"\n\n; Language Page\n01000400=\"Език\"\n01000401=\"Език:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Команди 7-Zip\"\n02000103=\"Отваряне\"\n02000104=\"Отваряне на избрания архив\"\n02000105=\"Разархивиране на файловете...\"\n02000106=\"Разархивиране на файловете от избрания архив.\"\n02000107=\"Добавяне към архив...\"\n02000108=\"Добавяне на избраните файлове към архива \"\n02000109=\"Проверка на архива\"\n0200010A=\"Проверява целостта на избрания архив.\"\n0200010B=\"Разархивиране тук\"\n0200010C=\"Разархивиране на избрания архив в текущата папка.\"\n0200010D=\"Разархивиране в {0}\"\n0200010E=\"Разархивиране на файловете в подпапка.\"\n0200010F=\"Добавяне в {0}\"\n02000110=\"Добавяне на избраните файлове (папки) в архив.\"\n02000111=\"Архивиране и изпращане...\"\n02000112=\"Архивиране на избраните файлове (папки) и изпращане на архива.\"\n02000113=\"Архивиране в {0} и изпращане\"\n02000114=\"Архивиране на избраните файлове (папки) и изпращане на архива.\"\n\n02000140=\"<Папка>\"\n02000141=\"<Архив>\"\n\n; Properties\n02000203=\"Път\"\n02000204=\"Име\"\n02000205=\"Разширение\"\n02000206=\"Папка\"\n02000207=\"Размер\"\n02000208=\"Компресиран размер\"\n02000209=\"Атрибути\"\n0200020A=\"Създаден\"\n0200020B=\"Отварян\"\n0200020C=\"Изменен\"\n0200020D=\"Солиден\"\n0200020E=\"Коментар\"\n0200020F=\"Зашифрован\"\n02000210=\"Разбит До\"\n02000211=\"Разбит След\"\n02000212=\"Речник\"\n02000213=\"CRC\"\n02000214=\"Тип\"\n02000215=\"Анти\"\n02000216=\"Метод\"\n02000217=\"Host OS\"\n02000218=\"Файлова система\"\n02000219=\"Потребител\"\n0200021A=\"Група\"\n0200021B=\"Блок\"\n0200021C=\"Коментар\"\n0200021D=\"Позиция\"\n0200021E=\"Префикс на пътя\"\n\n; Status bar\n02000301=\"{0} объект(и) избрани\"\n02000302=\"{0} объект(и)\"\n\n02000320=\"Файлове:\"\n02000321=\"Папки:\"\n02000322=\"Размер:\"\n\n; List Context Menu\n02000401=\"&Колони...\"\n\n02000411=\"&Отваряне\"\n02000412=\"&Разархивиране...\"\n\n; ToolBar\n02000501=\"Разархивиране\"\n\n; Messages\n02000601=\"Операции за изменение не се поддържат за този архив.\"\n02000602=\"Архивът не може да бъде променен! {0}\"\n02000603=\"Не може да бъде създадена директория '{0}'\"\n02000604=\"Файлът не е архив от поддържан тип.\"\n02000605=\"Грешка\"\n02000606=\"Твърде много елементи\"\n02000607=\"Няма ассоциирана програма\"\n02000608=\"Няма грешки в архива\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&ДА\"\n02000707=\"ДА за &Всички\"\n02000709=\"&НЕ\"\n0200070B=\"НЕ за в&Сички\"\n\n02000710=\"Отказ\"\n02000711=\"&Отказ\"\n02000713=\"&Затваряне\"\n02000714=\"Стоп\"\n02000715=\"От начало\"\n\n02000720=\"Помощ\"\n\n; Extract dialog\n02000800=\"Разархивиране\"\n02000801=\"&Разархивиране в:\"\n02000802=\"&Парола\"\n\n02000810=\"Режим за пътищата\"\n02000811=\"Пъ&лни пътища\"\n02000812=\"&Текущи пътища\"\n02000813=\"&Без пътища\"\n\n02000820=\"Режим за презапис\"\n02000821=\"&С подтвърждение\"\n02000822=\"Б&ез подтвърждение\"\n02000823=\"Проп&ускане\"\n02000824=\"Автоматично преименуване\"\n02000825=\"Автоматично преименуване на съществуващите файлове\"\n\n02000830=\"Файлове\"\n02000831=\"Избраните файлове\"\n02000832=\"Всички файлове\"\n\n02000881=\"Избор на място за разархивираните файлове.\"\n\n02000890=\"Декомпресиране...\"\n\n; Overwrite dialog\n02000900=\"Подтвърдете замяната на Файла\"\n02000901=\"Директорията вече съдържа файл с такова име.\"\n02000902=\"Да се замени ли съществуващия файл?\"\n02000903=\"с този файл?\"\n\n02000911=\"&Автоматично преименуване\"\n\n02000982=\"{0} байта\"\n02000983=\"изменен на\"\n\n; Messages dialog\n02000A00=\"Диагностични съобщения\"\n\n02000A80=\"Съобщение\"\n\n02000A91=\"Неподдържан метод за компресия във файл '{0}'.\"\n02000A92=\"Грешка в данните в '{0}'. Файлът е повреден.\"\n02000A93=\"CRC Грешка в '{0}'. Файлът е повреден.\"\n\n; Password dialog\n02000B00=\"Въведете парола\"\n02000B01=\"Въведете парола:\"\n02000B02=\"&Показване на паролата\"\n\n; Progress dialog\n02000C00=\"Компресиране...\"\n02000C01=\"Изминало време:\"\n02000C02=\"Оставащо време:\"\n02000C03=\"Големина:\"\n02000C04=\"Скорост:\"\n\n02000C10=\"&Фонов режим\"\n02000C11=\"&Нормален режим\"\n02000C12=\"&Пауза\"\n02000C13=\"Пр&одължаване\"\n\n02000C20=\"Спрян\"\n\n02000C30=\"Наистина ли желаете да се откажете?\"\n\n; Compress dialog\n02000D00=\"Добавяне към архив\"\n02000D01=\"&Архив:\"\n02000D02=\"Режим за изменение:\"\n02000D03=\"Формат на архива:\"\n02000D04=\"Метод за компресия:\"\n02000D05=\"Създаване на п&лътен архив\"\n02000D06=\"&Параметри:\"\n02000D07=\"&Опции\"\n02000D08=\"Самора&зархивиращ се\"\n02000D09=\"Нишковидно\"\n02000D0A=\"Кодиране файловете &имена\"\n02000D0B=\"&Ниво на компресия:\"\n02000D0C=\"Размер на &речника:\"\n02000D0D=\"Размер на &думата:\"\n02000D0E=\"Памет при архивиране:\"\n02000D0F=\"Памет при разархивиране:\"\n\n02000D40=\"Разделяне на &томове, байтове:\"\n\n02000D81=\"Без компресия\"\n02000D82=\"Нормална\"\n02000D83=\"Максимална\"\n02000D84=\"Бързо\"\n02000D85=\"Най-бързо\"\n02000D86=\"Ултра\"\n\n02000D90=\"Разглеждане\"\n\n02000DA1=\"Добавяне/замяна на файловете\"\n02000DA2=\"Обновяване/добавяне на файловете\"\n02000DA3=\"Обновяване на файловете\"\n02000DA4=\"Синхронизицация на файловете\"\n\n02000DB1=\"Всички файлове\"\n\n02000DC0=\"Компресия\"\n\n; Columns dialog\n02000E00=\"Колони\"\n02000E01=\"Маркирайте колоните които искате да се виждат. Използвайте бутоните \\\"Нагоре\\\", \\\"Надолу\\\" за да промените реда на колоните.\"\n02000E02=\"Избраните колони трябва да са с \"\n02000E03=\"точки ширина.\"\n\n02000E10=\"Нагоре\"\n02000E11=\"Надолу\"\n02000E12=\"Показване\"\n02000E13=\"Скриване\"\n02000E14=\"Установяване\"\n\n02000E81=\"Име\"\n02000E82=\"Ширина\"\n\n; Testing\n02000F90=\"Проверка...\"\n\n\n; File Manager\n\n03000000=\"7-Zip Файл-браузър\"\n\n; Menu\n03000102=\"Ф&айл\"\n03000103=\"&Редактиране\"\n03000104=\"&Показване\"\n03000105=\"&Инструменти\"\n03000106=\"&Помощ\"\n03000107=\"&Любими\"\n\n; File\n03000210=\"&Отваряне\"\n03000211=\"Отваряне &в\"\n03000212=\"Отваряне &извън\"\n03000220=\"&Показване\"\n03000221=\"&Редактиране\"\n03000230=\"Преи&менуване\"\n03000231=\"&Копиране в...\"\n03000232=\"Пре&местване в...\"\n03000233=\"Из&триване\"\n03000240=\"&Свойства\"\n03000241=\"Ком&ентар\"\n03000242=\"Изчисли чексума\"\n03000250=\"Създаване на папка\"\n03000251=\"Създаване на файл\"\n03000260=\"Из&ход\"\n03000270=\"Р&азделяне на файл...\"\n03000271=\"О&бединяване на файлове...\"\n\n; Edit\n03000310=\"О&тменяне\"\n03000311=\"Вр&ъщане\"\n03000320=\"&Отрязване\"\n03000321=\"&Копиране\"\n03000322=\"&Вмъкване\"\n03000323=\"&Изтриване\"\n03000330=\"Цялостно &маркиране\"\n03000331=\"Цялостно &размаркиране\"\n03000332=\"И&нвертиране на селекцията\"\n03000333=\"Маркиране...\"\n03000334=\"Размаркиране...\"\n03000335=\"Маркиране по тип\"\n03000336=\"Размаркиране по тип\"\n\n; View\n03000410=\"&Големи икони\"\n03000411=\"&Малки икони\"\n03000412=\"&Списък\"\n03000413=\"&Детайли\"\n03000420=\"Несортиран\"\n03000430=\"Отваряне на основната папка\"\n03000431=\"1 ниво нагоре\"\n03000432=\"История на папките...\"\n03000440=\"&Обновяване\"\n03000449=\"Плосък Изглед\"\n03000450=\"&2 панела\"\n03000451=\"&Ленти с инструменти\"\n03000460=\"Лента - архив\"\n03000461=\"Стандартна лента\"\n03000462=\"Големи бутони\"\n03000463=\"Показване на текст под бутоните\"\n\n; Tools\n03000510=\"&Настройки...\"\n03000511=\"&Статистика\"\n\n; Help\n03000610=\"&Съдържание...\"\n03000620=\"&За 7-zip...\"\n\n; Favorites\n03000710=\"&Добавяне на папката в Любимите като\"\n03000720=\"Фаворит\"\n\n; Options Dialog\n\n03010000=\"Настройки\"\n\n; Plugins\n03010100=\"Плъгини\"\n03010101=\"&Плъгини:\"\n03010110=\"Настройки...\"\n\n; Edit\n03010200=\"Редактор\"\n03010201=\"&Редактор:\"\n\n; System\n03010300=\"Система\"\n03010302=\"Асоцииране на 7-Zip с:\"\n03010310=\"Плъгин\"\n\n; Settings\n03010400=\"Настройки\"\n03010401=\"Показване на \\\"..\\\" \"\n03010402=\"Показване реалните икони на файловете\"\n03010410=\"Показване на системното меню\"\n03010420=\"&Избор на цял ред\"\n03010421=\"Показване на &линии\"\n03010430=\"&Алтернативен режим на избор\"\n03010440=\"Ползвай &големи страници памет\"\n\n; Strings\n\n03020201=\"Копиране\"\n03020202=\"Преместване\"\n03020203=\"Копиране в:\"\n03020204=\"Преместване в:\"\n03020205=\"Копиране...\"\n03020206=\"Местене...\"\n03020207=\"Не може да местите или копирате от тези папки.\"\n03020208=\"Операцията не се поддържа.\"\n\n03020210=\"Подтвърдете изтриването на файл\"\n03020211=\"Подтвърдете изтриването на папка\"\n03020212=\"Подтвърдете изтриването на много файлове\"\n03020213=\"Сигурен ли сте че искате да изтриете '{0}'?\"\n03020214=\"Сигурен ли сте че искате да изтриете папката '{0}' и нейното съдържание?\"\n03020215=\"Сигурен ли сте че искате да изтриете тези {0} неща?\"\n03020216=\"Изтривам...\"\n03020217=\"Грешка при изтриване на файл или папка\"\n\n03020220=\"Преименуване...\"\n03020221=\"Грешка при преименуване на файл или папка\"\n03020222=\"Подтвърди копирането на файл\"\n03020223=\"Уверени ли сте, че скате да копирате файлове в архива\"\n\n03020230=\"Създаване на папка\"\n03020231=\"Име на папка:\"\n03020232=\"Нова папка\"\n03020233=\"Грешка при създаване на папка\"\n\n03020240=\"Създаване на файл\"\n03020241=\"Име на файл:\"\n03020242=\"Нов файл\"\n03020243=\"Грешка при създаване на файл\"\n\n03020250=\"Маркиране\"\n03020251=\"Размаркиране\"\n03020252=\"Маска:\"\n\n03020260=\"История на посетените папки\"\n\n03020280=\"Файлът '{0}' е променен.\\nИскате ли да го обновите в архива?\"\n03020281=\"Не може да бъде обновен файл \\n'{0}'\"\n03020282=\"Не може да бъде стартиран редактор.\"\n03020283=\"Отваряне...\"\n\n03020290=\"Коментар\"\n03020291=\"&Коментар:\"\n\n030202A0=\"Система\"\n\n03020300=\"Компютър\"\n03020301=\"Мрежа\"\n\n03020400=\"Добавяне\"\n03020401=\"Извличане\"\n03020402=\"Тестване\"\n\n03020420=\"Копиране\"\n03020421=\"Преместване\"\n03020422=\"Изтриване\"\n03020423=\"Информация\"\n\n03020500=\"Разделяне на файл\"\n03020501=\"&Раздели на:\"\n03020510=\"Разделяне...\"\n\n03020600=\"Обединяване на файлове\"\n03020601=\"&Обединяване в:\"\n03020610=\"Обединяване...\"\n\n03020710=\"Изчисляване на чексума...\"\n03020720=\"Информация за чексума\"\n03020721=\"CRC чексума за данни:\"\n03020722=\"CRC чексума за данни и имена:\"\n\n03020800=\"Проверяване...\"\n\n; Computer\n03031100=\"Общ размер\"\n03031101=\"Свободно място\"\n03031102=\"Размер на клъстер\"\n03031103=\"Етикет\"\n\n; Network\n03031200=\"Локално Име\"\n03031201=\"Доставчик\"\n\n; Benchmark Dialog\n\n03080000=\"Статистика\"\n03080001=\"Използвана памет:\"\n03080002=\"Архивиране\"\n03080003=\"Разархивиране\"\n03080004=\"Скорост\"\n03080005=\"Оценка\"\n03080006=\"Обща оценка\"\n03080007=\"Текущо\"\n03080008=\"Резултат\"\n03080009=\"Пасове:\"\n0308000A=\"Грешки:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/bn.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.46\n;\n; Translated by Team Oruddho\n;\n;\tweb  : http://www.oruddho.com\n; Translator : Fahad Mohammad Shaon, Mahmud Hassan\n\n00000000=\"Bangla\"\n00000001=\"বাংলা\"\n00000002=\"69\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip এর পছন্দনীয়\"\n\n; Info Page\n01000100=\"7-Zip সম্পর্কে\"\n01000103=\"7-Zip একটি মুক্ত প্রোগ্রাম কিন্তু এটি 7-Zip এর কতৃপক্ষের কাচে নিবন্ধনের মাধ্যমে আপনি উন্নত সেবা পেতে পারেন \"\n01000104=\"সহযোগিতা\"\n01000105=\"নিবন্ধন\"\n\n; Folders Page\n01000200=\"ফোল্ডার\"\n01000210=\"&কার্যরত ফোল্ডার\"\n01000211=\"&অস্থায়ী ফোল্ডার\"\n01000212=\"&প্রচলিত\"\n01000213=\"&নির্দিষ্ট:\"\n01000214=\"অস্থায়ী অংশের জন্য ব্যবহার করা\"\n\n01000281=\"অস্থায়ী ফোল্ডার নির্বাচন করুন।\"\n\n; System Page\n01000300=\"কম্পিউটার\"\n01000301=\"সাহায্যকারী তালিকায় 7-Zip সংযোজন\"\n01000302=\"সাহায্যকারী তালিকায় একের ভিতর সব গুটিয়ে ফেলা \"\n01000310=\"সাহায্যকারী তালিকার বিষয়সমূহ:\"\n\n; Language Page\n01000400=\"ভাষা\"\n01000401=\"ভাষা:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip আদেশ\"\n02000103=\"সংকুচিত ফাইল চালু করা\"\n02000104=\"নির্বাচিত সংকুচিত ফাইলগুলো চালু করা।\"\n02000105=\"ফাইল সম্প্রসারণ...\"\n02000106=\"নির্বাচিত সংকুচিত ফাইল থেকে ফাইল সম্প্রসারণ।\"\n02000107=\"সংকুচিত ফাইলে সংযোজন...\"\n02000108=\"নির্বাচিত ফাইলগুলো সংকুচিত ফাইলে সংযোজন।\"\n02000109=\"সংকুচিত ফাইল নিরীক্ষণ\"\n0200010A=\"সংকুচিত ফাইলের যথার্থতা নিরীক্ষণ।\"\n0200010B=\"এখানেই সম্প্রসারণ\"\n0200010C=\"নির্বাচিত সংকুচিত ফাইল থেকে বর্তমান ফোল্ডারে সম্প্রসারণ।\"\n0200010D=\"সম্প্রসারণ করা হবে {0}\"\n0200010E=\"উপধারকে সম্প্রসারণ করা হবে।\"\n0200010F=\"সযোজন করা হবে {0}\"\n02000110=\"নির্বাচিত ফাইলসমূহ সংকুচিত ফাইলে সযোজন করা হবে\"\n02000111=\"সংকোচন এবং ই-মেইল...\"\n02000112=\"নির্বাচিত ফাইলগুলো সংকুচিত করা এবং সংকুচিত ফাইল ই-মেইল করা।\"\n02000113=\"সংকোচন -  {0} এবং ই-মেইল \"\n02000114=\"নির্বাচিত ফাইলগুলো সংকুচিত করা এবং সংকুচিত ফাইল ই-মেইল করা।\"\n\n02000140=\"<ফোল্ডার>\"\n02000141=\"<সংকুচিত ফাইল>\"\n\n; Properties\n02000203=\"অবস্থান\"\n02000204=\"নাম\"\n02000205=\"পরিচয়\"\n02000206=\"ফোল্ডার\"\n02000207=\"আকার\"\n02000208=\"সংকুচিত আকার\"\n02000209=\"বৈশিষ্ট\"\n0200020A=\"সৃষ্টি হয়েছে\"\n0200020B=\"ব্যবহার হয়েছে\"\n0200020C=\"পরিবর্ধন হয়েছে\"\n0200020D=\"দৃঢ়\"\n0200020E=\"Commented\"\n0200020F=\"আটকানো\"\n02000210=\"খন্ডনের পূর্বে\"\n02000211=\"খন্ডনের পরে\"\n02000212=\"অভিধান\"\n02000213=\"CRC\"\n02000214=\"ধরন\"\n02000215=\"বিরোধী\"\n02000216=\"পদ্ধতি\"\n02000217=\"চলতি অপারেটিং সিস্টেম\"\n02000218=\"ফাইল ব্যবস্থা\"\n02000219=\"ব্যবহারকারী\"\n0200021A=\"দল\"\n0200021B=\"বাধা\"\n0200021C=\"মন্তব্য\"\n0200021D=\"অবস্থান\"\n0200021E=\"পথের বিশেষায়ণ (Path Prefix)\"\n\n; Status bar\n02000301=\"{0} ফাইল(সমূহ) নির্বাচিত\"\n02000302=\"{0} ফাইল(সমূহ)\"\n\n02000320=\"ফাইলসমূহ :\"\n02000321=\"ফোল্ডারসমূহ :\"\n02000322=\"আকার :\"\n\n; List Context Menu\n02000401=\"&কলাম...\"\n\n02000411=\"&চালু করা\"\n02000412=\"&সম্প্রসারন...\"\n\n; ToolBar\n02000501=\"সম্প্রসারন\"\n\n; Messages\n02000601=\"এই সংকোচনের ক্ষেত্রে এই সেবা প্রদান করা সম্ভব হচ্ছে না।\"\n02000602=\"এই সংকোচনের ক্ষেত্রে পরিবর্ধন সম্ভব নয় {0}\"\n02000603=\"'{0}' ফোল্ডার সৃষ্টি করা সম্ভব হচ্ছেনা\"\n02000604=\"ফাইলটি পরিচিত সংকুচিত ফাইল নয়\"\n02000605=\"ত্রুটি\"\n02000606=\"অনেক বেশী ফাইল\"\n02000607=\"এই পরিচয় এর ফাইল গুলোর জন্য কোন নির্ধারিত চালক নেই\"\n02000608=\"কোন ত্রুটি নেই\"\n02000609=\"'{0}' -কে সংকুচিত ফাইল হিসেবে চালু করা সম্ভব হচ্ছেনা\"\n0200060A=\"'{0}' বদ্ধ সংকুচিত ফাইল চালু করা সম্ভব হচ্ছেনা. ভুল পাসওয়ার্ড?\"\n\n; Dialogs\n02000702=\"ঠিক আছে\"\n02000705=\"&হ্যাঁ\"\n02000707=\"&সবগুলোর জন্য হ্যাঁ\"\n02000709=\"&না\"\n0200070B=\"স&বগুলোর জন্য না\"\n\n02000710=\"বাতিল\"\n02000711=\"&বাতিল\"\n02000713=\"&বন্ধ করা\"\n02000714=\"বন্ধ\"\n02000715=\"আবার শুরু\"\n\n02000720=\"সাহায্য\"\n\n; Extract dialog\n02000800=\"সম্প্রসারণ\"\n02000801=\"&সম্প্রসারণ করা হবে:\"\n02000802=\"পাসওর্য়াড\"\n\n02000810=\"ঠিকানা নির্বাচন পদ্ধতি\"\n02000811=\"পূর্ণ ঠিকানাসমূহ \"\n02000812=\"বর্তমান ঠিকানা\"\n02000813=\"ঠিকানাবিহীন\"\n\n02000820=\"প্রতিস্থাপন পদ্ধতি\"\n02000821=\"প্রতিস্থাপনের পূর্বাভাস\"\n02000822=\"আভাসবিহীন প্রতিস্থাপন\"\n02000823=\"একই পরিচয় প্রাপ্ত ফাইল এড়িয়ে চলা \"\n02000824=\"স্বয়ংক্রিয় পুঃনামকরণ\"\n02000825=\"একই পরিচয় প্রাপ্ত ফাইলের নাম পরিবর্ত্ন\"\n\n02000830=\"ফাইলসমূহ\"\n02000831=\"&নির্বাচিত ফাইলসমূহ\"\n02000832=\"&সব ফাইল\"\n\n02000881=\"ফাইল সম্প্রসারনের ঠিকানা\"\n\n02000890=\"সম্প্রসারণ করা হচ্ছে\"\n\n; Overwrite dialog\n02000900=\"ফাইল প্রতিস্থাপন নিশ্চিত করণ \"\n02000901=\"নির্ধারিত ফোল্ডারে ফাইলটি আগেথেকেই আছে \"\n02000902=\"আপনিকি বর্তমান ফাইলটি প্রতিস্থাপন করতে চান?\"\n02000903=\"এইটির সাথে?\"\n\n02000911=\"স্বয়ংক্রিয় পুঃনামকরণ\"\n\n02000982=\"{0} bytesবাইট\"\n02000983=\"পরিবর্তিত করা হয়েছে\"\n\n; Messages dialog\n02000A00=\"সমস্যা নিরাময় আভাস\"\n\n02000A80=\"আভাস\"\n\n02000A91=\"অসমর্থিত সংকোচন পদ্ধতি -'{0}'.\"\n02000A92=\"'{0}' ফাইলে ত্রুটিপূর্ণ তথ্য. ফাইলটি খন্ডিত\"\n02000A93=\"'{0}' ফাইলে CRC ব্যর্থ. ফাইলটি খন্ডিত\"\n02000A94=\"'{0}' বদ্ধ ফাইলে তথ্যে ত্রুটি. ভুল পাসওয়ার্ড?\"\n02000A95=\"'{0}' বদ্ধ ফাইলে CRC ব্যর্থ.  ভুল পাসওয়ার্ড?\"\n\n; Password dialog\n02000B00=\"পাসওয়ার্ডটি প্রবেশ করুনঃ\"\n02000B01=\"পাসওয়ার্ডটি প্রবেশ করুনঃ\"\n02000B02=\"&পাসওয়ার্ড প্রদর্শন\"\n02000B03=\"আবার পাসওয়ার্ড প্রবেশ করুনঃ\"\n02000B10=\"পাসওয়ার্ড দুটি একই নয়\"\n02000B11=\"শুধু ইংলিশ বর্ণ, সংখ্যা এবং বিশেষ বর্ণ (!, #, $, ...) পাসওয়ার্ড হিসেবে ব্যবহার করুন\"\n02000B12=\"পাসওয়ার্ডটি খুব বেশী বড় হয়েছে\"\n\n; Progress dialog\n02000C00=\"প্রগতি\"\n02000C01=\"অতিবাহিত সময়ঃ\"\n02000C02=\"সময় বাকি আছেঃ\"\n02000C03=\"আকার:\"\n02000C04=\"গতি:\"\n\n02000C10=\"&পটভূমি\"\n02000C11=\"& সামনে\"\n02000C12=\"&বিরতি\"\n02000C13=\"&চালিয়ে যাওয়া\"\n\n02000C20=\"বিরতিতে অবস্থানরত\"\n\n02000C30=\"আপনি বাতিল করতে ইচ্ছুক?\"\n\n; Compress dialog\n02000D00=\"সংকোচনে সংযোজন\"\n02000D01=\"&সংকোচন\"\n02000D02=\"&পরিমার্জন পদ্ধতি:\"\n02000D03=\"সংকোচনের & পরিচয়:\"\n02000D04=\"সংকোচন &পদ্ধতি:\"\n02000D05=\"Create &Solid archive\"\n02000D06=\"&Parameters:\"\n02000D07=\"পছন্দনীয়\"\n02000D08=\"স্বয়ংক্রিয় সংকোচন প্রোগ্রাম তৈরি\"\n02000D09=\"বহুমূখী...\"\n02000D0A=\"ফাইলের নাম &আটকে ফেলা\"\n02000D0B=\"সংকোচনের &পর্যায়:\"\n02000D0C=\"&Dictionary size:\"\n02000D0D=\"&Word size:\"\n02000D0E=\"সংকোচনের জন্য স্মৃতির ব্যবহার:\"\n02000D0F=\"সম্প্রসারনের জন্য স্মৃতির ব্যবহার:\"\n02000D10=\"বদ্ধ করা\"\n02000D11=\"বদ্ধ করার পদ্ধতি:\"\n02000D12=\"CPU-এর thread-এর সংখ্যা:\"\n02000D13=\"Solid block size:\"\n02000D14=\"Non-solid\"\n02000D15=\"Solid\"\n02000D16=\"বিনিময়যোগ্য ফাইল সংকোচন\"\n\n02000D40=\"volumes(খন্ডে), bytes(বাইটস)-এ খন্ডায়নঃ\"\n02000D41=\"খন্ডের আকারে ভুল\"\n02000D42=\"উল্লেক্ষিত খন্ডের আকার : {0} bytes.\\nআপনি কি সংকোচিত ফাইলটিকে এ ভাবেই খন্ডে খন্ডায়ন করতে চান?\"\n\n02000D81=\"অতি সংকোচায়ন\"\n02000D82=\"সাধারন\"\n02000D83=\"সর্ব্বোচ্চ\"\n02000D84=\"দ্রুত\"\n02000D85=\"অতি দ্রুত\"\n02000D86=\"পলকের গতি\"\n\n02000D90=\"বিচরণ\"\n\n02000DA1=\"সংকোচন ও ফাইল প্রতিস্থাপন\"\n02000DA2=\"পরিমার্জন ও ফাইল প্রতিস্থাপন\"\n02000DA3=\"উল্লেখিত ফাইলে সতেজতা প্রদান\"\n02000DA4=\"ফাইল সাজিয়ে রাখা\"\n\n02000DB1=\"সকল ফাইল\"\n\n02000DC0=\"সংকোচায়ন প্রক্রিয়াধীন\"\n\n; Columns dialog\n02000E00=\"পর্যায়\"\n02000E01=\"আপনি সেই সকল শ্রেণীসমূহ নির্বাচন করুন যেগুলো আপনি দেখতে চান. আপনি উপরের ও নীচের বোতামে নির্বাচনের মাধ্যমে শ্রেণীসমূহ সুসজ্জিত করতে পারেন।\"\n02000E02=\"নির্বাচিত শ্রেণীসমূহ হতে পারে ...\"\n02000E03=\"পিক্সেল বৃহদায়ন\"\n\n02000E10=\"উপরে\"\n02000E11=\"নিচে\"\n02000E12=\"প্রদর্শন\"\n02000E13=\"অদৃশ্য\"\n02000E14=\"নিরধারণ\"\n\n02000E81=\"শিরোনাম\"\n02000E82=\"প্রস্থ\"\n\n; Testing\n02000F90=\"নিরক্ষণ করছে ...\"\n\n\n; File Manager\n\n03000000=\"7-Zip ফাইল ব্যবস্থাপক\"\n\n; Menu\n03000102=\"&ফাইল\"\n03000103=\"&পরিবর্তন\"\n03000104=\"প্রদর্শন&\"\n03000105=\"&দরকারি\"\n03000106=\"&সহায়তা\"\n03000107=\"&প্রিয়\"\n\n; File\n03000210=\"&উন্মুক্ত করা\"\n03000211=\"7-zip-এ উন্মুক্ত করা\"\n03000212=\"বাহিরে উন্মুক্ত করা\"\n03000220=\"&প্রদর্শন\"\n03000221=\"&পরিবর্তন\"\n03000230=\"নাম পরিবর্তন\"\n03000231=\"&অনুলিপি হবে...\"\n03000232=\"প্রতিস্থাপন হবে...\"\n03000233=\"&মুছে ফেলা\"\n03000240=\"বৈশিষ্টাবলি\"\n03000241=\"মন্তব্য\"\n03000242=\"Checksum গননা করা\"\n03000250=\"ফোল্ডার সৃষ্টি\"\n03000251=\"ফাইল সৃষ্টি\"\n03000260=\"বাহির\"\n03000270=\"&ফাইল খন্ডায়ন...\"\n03000271=\"ফাইল সংযোজন...\"\n\n; Edit\n03000310=\"&ফিরিয়ে দেয়া\"\n03000311=\"ফিরিয়ে দেয়া রদ করা\"\n03000320=\"অনুলিপি গ্রহন এবং মুছে ফেলা\"\n03000321=\"অনুলিপি গ্রহন\"\n03000322=\"অনুলিপি প্রদান\"\n03000323=\"মুছে ফেলা\"\n03000330=\"সব নির্বাচন\"\n03000331=\"নির্বাচন রদ করা\"\n03000332=\"উল্টো নির্বাচন\"\n03000333=\"নির্বাচন...\"\n03000334=\"নির্বাচন রদ করা...\"\n03000335=\"ধরণ অনুযায়ী নির্বাচন\"\n03000336=\"ধরণ অনুযায়ী নির্বাচন রদ করা\"\n\n; View\n03000410=\"বৃহৎ প্রতিক\"\n03000411=\"ছোট্ট প্রতিক\"\n03000412=\"&তালিকা\"\n03000413=\"&বিবরণ\"\n03000420=\"অসজ্জিত\"\n03000430=\"মূল ফোল্ডার উন্মুক্ত করা\"\n03000431=\"এক পর্যায় উপরে ...\"\n03000432=\"ফোল্ডারের অতীত বিবরণ...\"\n03000440=\"&সতেজতা\"\n03000449=\"সমতল সজ্জা\"\n03000450=\"&ব্যবস্থাপক দ্বিখন্ডন\"\n03000451=\"&দরকারিখুটি\"\n03000460=\"সংকোচোন ব্যবস্থাপক খুটি\"\n03000461=\"সাধারণ খুটি\"\n03000462=\"বৃহৎ বোতাম\"\n03000463=\"বোতামের শিরোনাম প্রদর্শন\"\n\n; Tools\n03000510=\"&পছন্দগুলো...\"\n03000511=\"&বেঞ্চমার্ক\"\n\n; Help\n03000610=\"&সাহায্য...\"\n03000620=\"&7-Zip সর্ম্পকে...\"\n\n; Favorites\n03000710=\"&প্রিয় ফোল্ডার হিসাবে সংযোজন ...\"\n03000720=\"পছন্দের তালিকা\"\n\n; Options Dialog\n\n03010000=\"পছন্দগুলো\"\n\n; Plugins\n03010100=\"সংযোজনযোগ্য প্রোগ্রাম\"\n03010101=\"&সংযোজনযোগ্য প্রোগ্রামের তালিকা : \"\n03010110=\"পছন্দগুলো...\"\n\n; Edit\n03010200=\"সম্পাদক\"\n03010201=\"বর্তমান সম্পাদক : \"\n\n; System\n03010300=\"বর্তমান অবস্থা\"\n03010302=\"7-Zip-এর সাথে সম্পর্কিত : \"\n03010310=\"সংযোজনযোগ্য প্রোগ্রাম\"\n\n; Settings\n03010400=\"পছন্দগুলো\"\n03010401=\"\\\"..\\\" ফাইল প্রদর্শন\"\n03010402=\"ফাইলের আসল প্রতিক দেখানো\"\n03010410=\"কম্পিউটার চালকের তালিকা দেখানো\"\n03010420=\"পূর্ণ পর্যায় প্রদর্শন\"\n03010421=\"ছকের লাইন প্রদর্শন\"\n03010430=\"পরিপূরক নিবাচনের পদ্ধতি\"\n03010440=\"বেশি স্মৃতির ব্যবহার\"\n\n; Strings\n\n03020201=\"অনুলিপি গ্রহন\"\n03020202=\"অনুলিপি গ্রহন এবং মুছে ফেলা\"\n03020203=\"অনুলিপি করা হবে:\"\n03020204=\"প্রতিস্থাপিত হবে:\"\n03020205=\"অনুলিপি করা হচ্ছে...\"\n03020206=\"প্রতিস্থাপিত হচ্ছে...\"\n03020207=\"আপনি এই ফাইলটি উল্লেখিত ফোল্ডারে অনুলিপি করা বা প্রতিস্থাপিত করা সম্ভব নয়\"\n03020208=\"কার্যটি সম্ভব নয়\"\n03020209=\"গন্তব্য ফোল্ডার নির্বাচন.\"\n\n03020210=\"ফাইলটি মুছে ফেলতে কি আপনি নিশ্চিত\"\n03020211=\"ফোল্ডারটি মুছে ফেলতে কি আপনি নিশ্চিত\"\n03020212=\"ফাইলটি মুছে ফেলতে কি আপনি নিশ্চিত\"\n03020213=\"মুছে ফেলতে আপনি কি নিশ্চিত - '{0}'?\"\n03020214=\"'{0}' ফোল্ডার এবং এর সব ফাইল আপনি কি মুছে ফেলতে নিশ্চিত?\"\n03020215=\"নির্বাচিত {0} টি ফাইল আপনি কি মুছে ফেলতে নিশ্চিত?\"\n03020216=\"মুছে ফেলা হচ্ছে...\"\n03020217=\"ফাইল বা ফোল্ডার মুছে ফেলাতে সমস্যা হচ্ছে\"\n\n03020220=\"নাম পরিবর্তন...\"\n03020221=\"ফাইল বা ফোল্ডারের নাম পরিবর্তনে সম্ভব নয়\"\n03020222=\"ফাইল অনুলিপি নিশ্চিতকরণ\"\n03020223=\"আপনি কি ফাইলগুলোকে সংকুচিত ফাইলে অনুলিপি গ্রহণ করতে চান।\"\n\n03020230=\"ফোল্ডার সৃষ্টি\"\n03020231=\"ফোল্ডারের নাম:\"\n03020232=\"নতুন ফোল্ডার\"\n03020233=\"ফোল্ডার সৃষ্টিতে সমস্যা\"\n\n03020240=\"ফাইল সৃষ্টি\"\n03020241=\"ফাইল নাম:\"\n03020242=\"নতুন ধারক\"\n03020243=\"ফাইল সৃষ্টিতে সমস্যা\"\n\n03020250=\"নির্বাচন\"\n03020251=\"নির্বাচন রদ করা\"\n03020252=\"আড়াল করা:\"\n\n03020260=\"ফোল্ডারের অতিত বিবরন\"\n\n03020280=\"ফাইলটি '{0}' পরিমার্জিত.\\nআপনি সংকুচিত ফাইলটি ও পরিমার্জন করতে চান?\"\n03020281=\"পরিমার্জন করা সম্ভব হয়নি\\n'{0}'\"\n03020282=\"সম্পাদক চালু করা সম্ভব নয়\"\n03020283=\"উন্মুক্ত করা হচ্ছে...\"\n\n03020290=\"মন্তব্য\"\n03020291=\"&মন্তব্য:\"\n\n030202A0=\"কম্পিউটার চালক\"\n\n03020300=\"কম্পিউটার\"\n03020301=\"আন্তঃ সম্পর্ক \"\n\n03020400=\"সংজোযন\"\n03020401=\"সম্প্রসারন\"\n03020402=\"নিরীক্ষণ\"\n\n03020420=\"অনুলিপি গ্রহন\"\n03020421=\"প্রতিস্থাপন\"\n03020422=\"মুছে ফেলা\"\n03020423=\"তথ্য\"\n\n03020500=\"ফাইল খন্ডায়ন\"\n03020501=\"&ফাইল খন্ডায়িত হবে:\"\n03020510=\"ফাইল খন্ডায়ন চলছে...\"\n03020520=\"ফাইল খন্ডায়ন নিশ্চিতকরণ\"\n03020521=\"আপনি কি সংকুচিত ফাইলটিকে {0} খন্ডে খন্ডায়ন করতে চান?\"\n03020522=\"খন্ডের আকার অবশ্যই মূল ফাইলের চেয়ে ছোট হতে হবে\"\n\n03020600=\"ফাইল একীভূতি করণ\"\n03020601=\"&একীভূতি করা হবে:\"\n03020610=\"একীভূতি চলছে...\"\n03020620=\"শুধু প্রথম ফাইলটি নির্বাচন করুন\"\n\n03020710=\"Checksum গননা চলছে...\"\n03020720=\"Checksum তথ্য\"\n03020721=\"তথ্যের জন্য CRC checksum:\"\n03020722=\"তথ্য এবং নামের জন্য CRC checksum:\"\n\n03020800=\"তথ্য সংগ্রহ চলছে... (Scanning...)\"\n\n; Computer\n03031100=\"সম্পূর্ণ আকার\"\n03031101=\"অবশিষ্ট জায়গা\"\n03031102=\"ক্লাস্টারের আকার\"\n03031103=\"শিরোনাম\"\n\n; Network\n03031200=\"স্থানীয় নাম\"\n03031201=\"বিতরণকারী\"\n\n; Benchmark Dialog\n\n03080000=\"বেঞ্চমার্ক\"\n03080001=\"ব্যবহৃত স্মৃতি : \"\n03080002=\"সংকোচায়ন ...\"\n03080003=\"সম্প্রসারণ ...\"\n03080004=\"গতি\"\n03080005=\"রেটিং\"\n03080006=\"মোট রেটিং\"\n03080007=\"চলতি\"\n03080008=\"ফলাফল\"\n03080009=\"সফলতা :\"\n0308000A=\"বিফলতা :\"\n0308000B=\"CPU ব্যবহার করছে\"\n0308000C=\"Rating / ব্যবহার করছে\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/br.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 3.12\n; Translated by KAD-Korvigelloù An Drouizig (drouizig.org).\n;\n; And updated since\n;\n;\n\n00000000=\"Breton\"\n00000001=\"Brezhoneg\"\n00000002=\"126\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Kefluniañ 7-Zip\"\n\n; Info Page\n01000100=\"Keloù\"\n01000103=\"Digoust eo ar meziant 7-Zip. Mar plij deoc'h 7-zip ha mar fell deoc'h skoazellañ ar raktres-mañ e c'hellit donezoniñ argant da 7-Zip.\"\n01000105=\"Donezoniñ\"\n\n; Folders Page\n01000200=\"Teulioù\"\n01000210=\"Teulioù &labour\"\n01000211=\"Teul dibadelus ar &reizhiad\"\n01000212=\"Teul &red\"\n01000213=\"Teul &spisaet :\"\n01000214=\"Implijout nemet evit ar mediaoù dilec'hus\"\n\n01000281=\"Spisait un teul evit lakaat ar restroù diell dibadelus.\"\n\n; System Page\n01000300=\"Reizhiad\"\n01000301=\"Lakaat 7-Zip el lañser kemperzhel\"\n01000302=\"Lañser kemperzhel a-steud\"\n01000310=\"Elfennoù al lañser kemperzhel :\"\n\n; Language Page\n01000400=\"Yezh\"\n01000401=\"Yezh :\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Arc'hwelioù 7-Zip\"\n02000103=\"Digeriñ\"\n02000104=\"Digeriñ an diell diuzet.\"\n02000105=\"Eztennañ ar restroù...\"\n02000106=\"Eztennañ ar restroù diouzh an diell diuzet.\"\n02000107=\"Ouzhpennañ d'an diell...\"\n02000108=\"Ouzhpennañ an elfennoù diuzet d'an diell.\"\n02000109=\"Gwiriañ an diell\"\n0200010A=\"Gwiriañ yalc'h an diell diuzet.\"\n0200010B=\"Eztennañ amañ\"\n0200010C=\"Eztennañ restroù an diell diuzet en teul red.\"\n0200010D=\"Eztennañ diwar {0}\"\n0200010E=\"Eztennañ e-barzh un is-teul.\"\n0200010F=\"Ouzhpennañ da {0}\"\n02000110=\"Ouzhpennañ an elfennoù diuzet d'an diell.\"\n02000111=\"Gwaskañ ha kas dre postel...\"\n02000112=\"Gwaskañ an elfennoù diuzet d'an diell a kas anezhi dre postel.\"\n02000113=\"Gwaskañ diwar {0} ha kas dre postel.\"\n02000114=\"Gwaskañ an elfennoù diuzet d'an diell ha kas anezhi dre postel.\"\n\n02000140=\"<Teul>\"\n02000141=\"<Diell>\"\n\n; Properties\n02000203=\"Treug\"\n02000204=\"Anv\"\n02000205=\"Astenn\"\n02000206=\"Teul\"\n02000207=\"Ment\"\n02000208=\"Gwasket\"\n02000209=\"Doareennoù\"\n0200020A=\"Savet d'ar\"\n0200020B=\"Stoket d'ar\"\n0200020C=\"Kemmet d'ar\"\n0200020D=\"Solut\"\n0200020E=\"Evezhiadenn\"\n0200020F=\"Ennodet\"\n02000210=\"Rannañ a-raok\"\n02000211=\"Rannañ war-lerc'h\"\n02000212=\"Geriadur\"\n02000213=\"CRC\"\n02000214=\"Rizh\"\n02000215=\"Enep\"\n02000216=\"Hentenn\"\n02000217=\"OS ostiz\"\n02000218=\"Reizhiad restroù\"\n02000219=\"Implijour\"\n0200021A=\"Strollad\"\n0200021B=\"Bloc'h\"\n0200021C=\"Evezhiadenn\"\n0200021D=\"Lec'hiadur\"\n\n; Status bar\n02000301=\"{0} elfenn ziuzet\"\n02000302=\"{0} elfenn\"\n\n; List Context Menu\n02000401=\"&Bannoù...\"\n\n02000411=\"&Digeriñ\"\n02000412=\"&Eztennañ...\"\n\n; ToolBar\n02000501=\"Eztennañ\"\n\n; Messages\n02000601=\"N'haller ket ober gant an oberiadennoù nevesaat evti an diell-mañ.\"\n02000602=\"N'haller ket nevesaat an diell '{0}'\"\n02000603=\"N'haller ket sevel ar restr '{0}'\"\n02000604=\"N'eo ket ur restr diell reizh ar restr-mañ.\"\n02000605=\"Fazi\"\n02000606=\"Re a elfennoù\"\n02000607=\"Arload ebet kenstaget gant ar rizh restr-mañ\"\n02000608=\"N'eus fazi ebet\"\n\n; Dialogs\n02000702=\"Mat eo\"\n02000705=\"&Ya\"\n02000707=\"Ya be&pred\"\n02000709=\"&Ket\"\n0200070B=\"Ket &bepred\"\n\n02000710=\"Nullañ\"\n02000711=\"&Nullañ\"\n02000713=\"&Serriñ\"\n02000714=\"Paouez\"\n02000715=\"Adloc'hañ\"\n\n02000720=\"Skoazell\"\n\n; Extract dialog\n02000800=\"Eztennañ\"\n02000801=\"E&ztennañ diwar :\"\n02000802=\"Ger-tremen\"\n\n02000810=\"Treugoù\"\n02000811=\"Treugoù klok\"\n02000812=\"Treugoù daveel\"\n02000813=\"Treug ebet\"\n\n02000820=\"Mod erlec'hiañ\"\n02000821=\"Goulenn a-raok erlec'hiañ\"\n02000822=\"Erlec'hiañ hep goulenn\"\n02000823=\"Lakaat ar restroù a zo anezho a-gostez\"\n02000824=\"Adenvel ent-emgefre\"\n02000824=\"Adenvel ent-emgefre ar restroù a zo anezho\"\n\n02000830=\"Restroù\"\n02000831=\"&Restroù diuzet\"\n02000832=\"&An holl restroù\"\n\n02000881=\"Dibabit un teul evit eztennañ an restroù.\"\n\n02000890=\"Eztennañ\"\n\n; Overwrite dialog\n02000900=\"Kadarnaat a-raok erlec'hiañ ur restr\"\n02000901=\"Emañ dija ur restr gant ar memes anv en teul bukenn.\"\n02000902=\"Ha fellout a ra deoc'h lakaat e-lec'h\"\n02000903=\"ar restr da heul ?\"\n\n02000911=\"Adenvel ent-&emgefre\"\n\n02000982=\"{0} eizhtet\"\n02000983=\"kemmet d'ar\"\n\n; Messages dialog\n02000A00=\"Kemennoù yalc'h\"\n\n02000A80=\"Kemenn\"\n\n02000A91=\"Hentenn waskañ direizh evit '{0}'.\"\n02000A92=\"Stlenn faziet e-barzh '{0}'. Gwastet eo ar restr.\"\n02000A93=\"Fazi ar reoliñ CRC evit '{0}'. Gwastet eo ar restr.\"\n\n; Password dialog\n02000B00=\"Roit ar ger-tremen\"\n02000B01=\"Roit ar ger-tremen :\"\n02000B02=\"&Diskouez ar ger-tremen\"\n\n; Progress dialog\n02000C00=\"O labourat\"\n02000C01=\"Amzer dremenet :\"\n02000C02=\"Amzer o chom :\"\n02000C03=\"Ment :\"\n02000C04=\"Tizh :\"\n\n02000C10=\"&Drekleur\"\n02000C11=\"&Rakleur\"\n02000C12=\"&Ehan\"\n02000C13=\"&Kenderc'hel\"\n\n02000C20=\"Ehanet\"\n\n02000C30=\"Ha fellout a ra deoc'h nullañ ?\"\n\n; Compress dialog\n02000D00=\"Ouzhpennañ d'an diell\"\n02000D01=\"&Diell :\"\n02000D02=\"&Mod nevesaat :\"\n02000D03=\"&Mentrezh an diell :\"\n02000D04=\"Rizh &gwaskañ:\"\n02000D05=\"Sevel un diell &solut\"\n02000D06=\"&Perzhioù:\"\n02000D07=\"&Dibaboù\"\n02000D08=\"Sevel un diell SF&X\"\n02000D09=\"Lies-neudennañ\"\n02000D0A=\"Ennodiñ an &anvioù restroù\"\n02000D0B=\"L&ive gwaskañ :\"\n02000D0C=\"&Ment ar geriadur :\"\n02000D0D=\"Me&nt ar gerioù :\"\n02000D0E=\"Memor evit ar waskerezh :\"\n02000D0F=\"Memor evit an diwaskerezh :\"\n\n02000D40=\"Troc'hañ e &levrennoù, eizhtetoù :\"\n\n02000D81=\"Gwaskañ ebet\"\n02000D82=\"Reizh\"\n02000D83=\"Uhelañ\"\n02000D84=\"Prim\"\n02000D85=\"Primañ\"\n02000D86=\"Gour\"\n\n02000D90=\"Furchal\"\n\n02000DA1=\"Ouzhpennañ hag erlec'hiañ ar restroù\"\n02000DA2=\"Nevesaat hag ouzhpennañ ar restroù\"\n02000DA3=\"Freskaat ar restroù a zo anezho\"\n02000DA4=\"Goubredañ ar restroù\"\n\n02000DB1=\"An holl restroù\"\n\n02000DC0=\"O waskañ\"\n\n; Columns dialog\n02000E00=\"Bannoù\"\n02000E01=\"Merkit ar bannoù a fell deoc'h diskouez. Implijit ar meudellioù Dilec'hiañ a-us hag a-zindan evit kemmañ an urzh.\"\n02000E02=\"Ret eo bezañ ar bann diuzet\"\n02000E03=\"piksel a ledander.\"\n\n02000E10=\"Dil. a-&us\"\n02000E11=\"Dil. a-&zindan\"\n02000E12=\"&Diskouez\"\n02000E13=\"&Kuzhat\"\n02000E14=\"Lakaat\"\n\n02000E81=\"Titl\"\n02000E82=\"Ledander\"\n\n; Testing\n02000F90=\"Gwiriañ\"\n\n\n; File Manager\n\n03000000=\"Ardoer restroù 7-Zip\"\n\n; Menu\n03000102=\"&Restr\"\n03000103=\"&Aozañ\"\n03000104=\"&Gwelout\"\n03000105=\"&Ostilhoù\"\n03000106=\"&Skoazell\"\n03000107=\"Di&baboù\"\n\n; File\n03000210=\"&Digeriñ\"\n03000211=\"Digeriñ a-zia&barzh\"\n03000212=\"Digeriñ a-zia&vaez\"\n03000220=\"&Gwelout\"\n03000221=\"&Aozañ\"\n03000230=\"Adenv&el\"\n03000231=\"&Kopiañ diwar...\"\n03000232=\"&Dilec'hiañ diwar...\"\n03000233=\"D&ilemel\"\n03000240=\"P&erzhioù\"\n03000241=\"Evezhia&denn\"\n03000250=\"Sevel un teul\"\n03000251=\"Sevel ur restr\"\n03000260=\"&Kuitaat\"\n03000270=\"&Troc'hañ restr...\"\n03000271=\"&Kendeuziñ restroù...\"\n\n; Edit\n03000310=\"&Nullañ\"\n03000311=\"&Adober\"\n03000320=\"&Troc'hañ\"\n03000321=\"Ko&piañ\"\n03000322=\"P&egañ\"\n03000323=\"Di&lemel\"\n03000330=\"Diuz pep &tra\"\n03000331=\"Diziuz pe tra\"\n03000332=\"Lakaat an &diuzad war an tu gin\"\n03000333=\"Diuz...\"\n03000334=\"Diziuz...\"\n03000335=\"Diuz diouzh ar rizh\"\n03000336=\"Diziuz diouzh ar rizh\"\n\n; View\n03000410=\"Arlunioù &bras\"\n03000411=\"Arlunioù &bihan\"\n03000412=\"&Roll\"\n03000413=\"&Munudoù\"\n03000420=\"Dirummet\"\n03000430=\"Digeriñ an teul gwrizienn\"\n03000431=\"Teul kerent\"\n03000432=\"Roll istor an teul...\"\n03000440=\"Fresk&aat\"\n03000450=\"&2 brenestr\"\n03000451=\"&Barrennoù ostilhoù\"\n03000460=\"Barrenn ziell\"\n03000461=\"Barrenn skouerek\"\n03000462=\"Meudellioù bras\"\n03000463=\"Diskouez an destenn\"\n\n; Tools\n03000510=\"&Dibaboù...\"\n03000511=\"&Amprouiñ\"\n\n; Help\n03000610=\"&Roll ar pennadoù...\"\n03000620=\"A-&zivout 7-Zip...\"\n\n; Favorites\n03000710=\"&Ouzhpennañ ar c'havlec'h d'ar sinedoù\"\n03000720=\"Sined\"\n\n; Options Dialog\n\n03010000=\"Dibaboù\"\n\n; Plugins\n03010100=\"Molladoù\"\n03010101=\"&Molladoù :\"\n03010110=\"Dibaboù...\"\n\n; Edit\n03010200=\"Embanner\"\n03010201=\"&Embanner :\"\n\n; System\n03010300=\"Reizhiad\"\n03010302=\"Kenstagañ 7-Zip ouzh :\"\n03010310=\"Mollad\"\n\n; Settings\n03010400=\"Perzhioù\"\n03010401=\"Diskouez an elfenn \\\"..\\\"\"\n03010402=\"Diskouez arlunioù gwirion ar restroù\"\n03010410=\"Diskouez al lañser reizhiad\"\n03010420=\"&Diuz ar bannoù a-bezh\"\n03010421=\"Diskouez al &linennoù kael\"\n\n; Strings\n\n03020201=\"Kopiañ\"\n03020202=\"Dilec'hiañ\"\n03020203=\"Kopiañ e-barzh :\"\n03020204=\"Dilec'hiañ diwar :\"\n03020205=\"O kopiañ...\"\n03020206=\"O tilec'hiañ...\"\n03020207=\"N'hallit ket dilec'hiañ pe gopiañ lod a elfennoù evit ar restroù-se.\"\n03020208=\"N'haller ket ober an oberiadenn-mañ.\"\n\n03020210=\"Kadarnañ a-raok dilemel ar restr\"\n03020211=\"Kadarnañ a-raok dilemel an teul\"\n03020212=\"Kadarnañ a-raok dilemel an holl restroù\"\n03020213=\"Ha fellout a ra deoc'h dilemel '{0}' ?\"\n03020214=\"Ha fellout a ra deoc'h dilemel an teul '{0}' ha pep tra a zo e-barzh ?\"\n03020215=\"Ha fellout a ra deoc'h dilemel ar {0} elfenn-mañ ?\"\n03020216=\"O tilemel...\"\n03020217=\"Fazo o tilemel ar restr pe an teul\"\n\n03020220=\"Oc'h adenvel...\"\n03020221=\"Fazi oc'h adenvel ar restr pe an teul\"\n\n03020230=\"Sevel un teul\"\n03020231=\"Anv an teul :\"\n03020232=\"Teul nevez\"\n03020233=\"Fazi o sevel an teul\"\n\n03020240=\"Sevel ur restr\"\n03020241=\"Anv restr :\"\n03020242=\"Restr nevez\"\n03020243=\"Fazi o sevel ar restr\"\n\n03020250=\"Diuz\"\n03020251=\"Diziuz\"\n03020252=\"Kuzh :\"\n\n03020260=\"Roll istor an teulioù\"\n\n03020280=\"Kemmet ez eo bet ar restr '{0}'.\\nHa fellout a ra deoc'h he nevesaat en diell ?\"\n03020281=\"N'haller ket nevesaat\\n'{0}'\"\n03020282=\"N'haller ket loc'hañ an embanner.\"\n03020283=\"O tigeriñ...\"\n\n03020290=\"Evezhiadenn\"\n03020291=\"&Evezhiadenn :\"\n\n030202A0=\"Reizhiad\"\n\n03020300=\"Urzhiataer\"\n03020301=\"Rouedad\"\n\n03020400=\"Ouzhpennañ\"\n03020401=\"Eztennañ\"\n03020402=\"Amprouiñ\"\n\n03020420=\"Kopiañ\"\n03020421=\"Dilec'hiañ\"\n03020422=\"Dilemel\"\n03020423=\"Keloù\"\n\n03020500=\"Troc'hañ restr\"\n03020501=\"&Troc'hañ da :\"\n03020510=\"O troc'hañ...\"\n\n03020600=\"Kendeuziñ restroù\"\n03020601=\"&Kendeuziñ da :\"\n03020610=\"O kendeuziñ...\"\n\n; Computer\n03031100=\"Ment en holl\"\n03031101=\"Egor vak\"\n03031102=\"Ment ar c'hleusteurioù\"\n03031103=\"Skritellig\"\n\n; Network\n03031200=\"Anv lec'hel\"\n03031201=\"Pourchaser\"\n\n; Benchmark Dialog\n\n03080000=\"Amprouiñ\"\n03080001=\"Implij ar vemor :\"\n03080002=\"Gwaskerezh\"\n03080003=\"Diwaskerezh\"\n03080004=\"Tizh\"\n03080005=\"Feur\"\n03080006=\"Feur en holl\"\n03080007=\"Red\"\n03080008=\"Da heul\"\n03080009=\"Tremenioù :\"\n0308000A=\"Fazioù :\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ca.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.60\n; Translated by Josep Casals and Marc Folch\n;\n;\n;\n;\n\n00000000=\"Catalan\"\n00000001=\"Català\"\n00000002=\"3\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuració de 7-Zip\"\n\n; Info Page\n01000100=\"Informació sobre 7-Zip\"\n01000103=\"7-Zip és programari lliure. De totes maneres, podeu col.laborar en el seu desenvolupament registrant el programa.\"\n01000104=\"Suport\"\n01000105=\"Registra\"\n\n; Folders Page\n01000200=\"Carpetes\"\n01000210=\"Carpeta de &treball\"\n01000211=\"Carpeta temporal del &sistema\"\n01000212=\"Carpeta a&ctual\"\n01000213=\"E&specifica una carpeta:\"\n01000214=\"Utilitza únicament per a discs extraïbles\"\n\n01000281=\"Especifica una carpeta pels fitxers temporals.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integra 7-Zip dins el menú contextual de Windows\"\n01000302=\"Menú contextual en cascada\"\n01000310=\"Objectes del menú contextual:\"\n\n; Language Page\n01000400=\"Llengua\"\n01000401=\"Llengua:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip comandes\"\n02000103=\"Obre\"\n02000104=\"Obre el fitxer seleccionat.\"\n02000105=\"Extreu fitxers...\"\n02000106=\"Extreu els fitxers de el fitxer seleccionat.\"\n02000107=\"Afegeix al fitxer...\"\n02000108=\"Afegeix els fitxers seleccionats a l'arxiu.\"\n02000109=\"Comprova el fitxer\"\n0200010A=\"Comprova la integritat del fitxer seleccionat.\"\n0200010B=\"Extreu a aquesta carpeta\"\n0200010C=\"Extreu els fitxers de l'arxiu escollit al directori actual.\"\n0200010D=\"Extreu a {0}\"\n0200010E=\"Extreu fitxers a la subcarpeta.\"\n0200010F=\"Afegeix a {0}\"\n02000110=\"Afegeix els fitxers escollits a l'arxiu.\"\n02000111=\"Comprimeix i envia per correu electrònic...\"\n02000112=\"Comprimeix els objectes escollits al fitxer i envia'l per correu electrònic.\"\n02000113=\"Comprimeix a {0} i envia per correu electrònic\"\n02000114=\"Comprimeix els objectes escollits al fitxer i envia'l per correu electrònic..\"\n\n02000140=\"<Carpeta>\"\n02000141=\"<fitxer>\"\n\n; Properties\n02000203=\"Adreça\"\n02000204=\"Nom\"\n02000205=\"Tipus de fitxer\"\n02000206=\"Carpeta\"\n02000207=\"Mida\"\n02000208=\"Mida comprimit\"\n02000209=\"Atributs\"\n0200020A=\"Creat\"\n0200020B=\"Darrer accés\"\n0200020C=\"Darrera modificació\"\n0200020D=\"Compacte\"\n0200020E=\"Comentari\"\n0200020F=\"Xifrat\"\n02000210=\"Expandit abans\"\n02000211=\"Expandit després\"\n02000212=\"Diccionari\"\n02000213=\"CRC\"\n02000214=\"Tipus\"\n02000215=\"Anti\"\n02000216=\"Mètode\"\n02000217=\"SO orígen\"\n02000218=\"Sistema de fitxers\"\n02000219=\"Usuari\"\n0200021A=\"Grup\"\n0200021B=\"Bloc\"\n0200021C=\"Comentari\"\n0200021D=\"Posició\"\n0200021E=\"Path Prefix\"\n0200021F=\"Carpetes\"\n02000220=\"Fitxers\"\n02000221=\"Versió\"\n02000222=\"Volum\"\n02000223=\"Multivolum\"\n02000224=\"Desplaçament\"\n02000225=\"Enllaços\"\n02000226=\"Blocs\"\n02000227=\"Volums\"\n\n02000229=\"64-bits\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Mida física\"\n0200022D=\"Mida capçaleres\"\n0200022E=\"Suma de verificació\"\n0200022F=\"Característiques\"\n02000230=\"Adreça virtual\"\n\n; Status bar\n02000301=\"{0} objecte(s) seleccionat(s)\"\n02000302=\"{0} objecte(s)\"\n\n02000320=\"Fitxers:\"\n02000321=\"Carpetes:\"\n02000322=\"Mida:\"\n02000323=\"Mida comprimit:\"\n02000324=\"Arxius:\"\n\n; List Context Menu\n02000401=\"&Columnes...\"\n\n02000411=\"&Obre\"\n02000412=\"&Extreu...\"\n\n; ToolBar\n02000501=\"Extreure\"\n\n; Messages\n02000601=\"Aquest tipus de fitxer no permet actualització.\"\n02000602=\"No es pot actualitzar el fitxer {0}\"\n02000603=\"No es pot crear la carpeta '{0}'\"\n02000604=\"Tipus de fitxer desconegut.\"\n02000605=\"Error\"\n02000606=\"Massa objectes\"\n02000607=\"No hi ha cap programa associat amb aquest tipus de fitxer\"\n02000608=\"No hi ha errors\"\n02000609=\"No es pot obrir el fitxe '{0}' com a arxiu\"\n0200060A=\"No es pot obrir el fitxer xifrat '{0}'. La contrasenya és incorrecta?\"\n0200060B=\"El sistema no pot assignar la quantitat de memòria requerida\"\n0200060C=\"Error desconegut\"\n0200060D=\"Tipus d'arxiu no admès\"\n\n; Dialogs\n02000702=\"D'acord\"\n02000705=\"&Sí\"\n02000707=\"Sí a &tot\"\n02000709=\"&No\"\n0200070B=\"No a t&ot\"\n\n02000710=\"Cancel.la\"\n02000711=\"&Cancel.la\"\n02000713=\"Tan&ca\"\n02000714=\"Atura\"\n02000715=\"Reinicia\"\n\n02000720=\"Ajuda\"\n\n; Extract dialog\n02000800=\"Extreu\"\n02000801=\"E&xtreu a:\"\n02000802=\"Contrasenya\"\n\n02000810=\"Mode d'adreça\"\n02000811=\"Adreça completa\"\n02000812=\"Adreça actual\"\n02000813=\"Sense adreça\"\n\n02000820=\"Sobreescriure\"\n02000821=\"Amb confirmació\"\n02000822=\"Sense confirmació\"\n02000823=\"Conserva els fitxers ja existents\"\n02000824=\"Reanomena automàticament\"\n02000825=\"Auto-reanomena fitxers existents\"\n\n02000830=\"Fitxers\"\n02000831=\"Fitxers &seleccionats\"\n02000832=\"Tots els fitxers\"\n\n02000881=\"Seleccioneu una destinació pels fitxers extrets.\"\n\n02000890=\"Extraient\"\n\n; Overwrite dialog\n02000900=\"Confirmeu substitució de fitxers\"\n02000901=\"La carpeta de destí conté un fitxer amb el mateix nom.\"\n02000902=\"Voleu substituir el fitxer existent\"\n02000903=\"per aquest altre?\"\n\n02000911=\"Renomena a&utomàticament\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificat el\"\n\n; Messages dialog\n02000A00=\"Missatges de diagnosi\"\n\n02000A80=\"Missatge\"\n\n02000A91=\"Mètode de compressió no vàlid per a '{0}'.\"\n02000A92=\"Error de dades en '{0}'. El fitxer és corrupte.\"\n02000A93=\"CRC ha fallat en '{0}'. El fitxer és corrupte.\"\n02000A94=\"Error de dades al fitxer xifrat '{0}'. Contrasenya errònia?\"\n02000A95=\"CRC ha fallat al fitxer xifrat '{0}'. Contrasenya errònia?\"\n\n; Password dialog\n02000B00=\"Introduïu la contrasenya\"\n02000B01=\"Introduïu la contrasenya:\"\n02000B02=\"Mo&stra la contrasenya\"\n02000B03=\"Torneu a introduir la contrasenya:\"\n02000B10=\"Les contrasenyes no coincideixen\"\n02000B11=\"Utilitza només lletres (sense accents), números i caràcters especials (!, #, $, ...) a la contrasenya\"\n02000B12=\"La contrasenya és massa llarga\"\n\n; Progress dialog\n02000C00=\"Procés\"\n02000C01=\"Temps transcorregut:\"\n02000C02=\"Temps restant:\"\n02000C03=\"Mida:\"\n02000C04=\"Taxa:\"\n02000C05=\"Processat:\"\n02000C06=\"Ràtio de compressió:\"\n\n02000C10=\"Rerefons\"\n02000C11=\"Primer pla\"\n02000C12=\"&Pausa\"\n02000C13=\"&Continua\"\n\n02000C20=\"Aturat\"\n\n02000C30=\"Esteu segur que voleu cancel.lar?\"\n\n; Compress dialog\n02000D00=\"Afegir al fitxer\"\n02000D01=\"&Fitxer:\"\n02000D02=\"Mode d'act&ualització:\"\n02000D03=\"&Format del fitxer:\"\n02000D04=\"&Tipus de compressió:\"\n02000D05=\"Crea fitxer compacte\"\n02000D06=\"&Paràmetres:\"\n02000D07=\"Opcions\"\n02000D08=\"Crea fitxer SF&X\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Xifra el nom dels fitxers\"\n02000D0B=\"Nivell de &compressió:\"\n02000D0C=\"Mida del &diccionari:\"\n02000D0D=\"Mida de la paraula:\"\n02000D0E=\"Ús de memòria per comprimir:\"\n02000D0F=\"Ús de memòria per descomprimir:\"\n02000D10=\"Xifrat\"\n02000D11=\"Mètode de xifrat:\"\n02000D12=\"Nombre de fils de la CPU:\"\n02000D13=\"Mida de bloc sòlid:\"\n02000D14=\"No sòlid\"\n02000D15=\"Sòlid\"\n02000D16=\"Comprimeix fitxers compartits\"\n\n02000D40=\"Divideix en &volums, bytes:\"\n02000D41=\"Mida del volum incorrecte\"\n02000D42=\"Mida de volum especificada: {0} bytes.\\nEsteu segur que voleu dividir el fitxer en aquests volums?\"\n\n02000D81=\"Sense compressió\"\n02000D82=\"Normal\"\n02000D83=\"Màxima\"\n02000D85=\"Ràpida\"\n02000D85=\"La més ràpida\"\n02000D86=\"Ultra\"\n\n02000D90=\"Visualitza\"\n\n02000DA1=\"Afegeix i substitueix fitxers\"\n02000DA2=\"Actualitza i afegeix fitxers\"\n02000DA3=\"Actualitza fitxers ja presents\"\n02000DA4=\"Sincronitza fitxers\"\n\n02000DB1=\"Tots els fitxers\"\n\n02000DC0=\"Comprimint\"\n\n; Columns dialog\n02000E00=\"Columnes\"\n02000E01=\"Seleccioneu les columnes que voleu que siguin visibles en aquest mode. Feu servir les tecles AvPg i RePg per a organitzar les columnes.\"\n02000E02=\"La columna escollida ha de tenir\"\n02000E03=\"pixels d'amplària.\"\n\n02000E10=\"Mou cap am&unt\"\n02000E11=\"Mou cap avall\"\n02000E12=\"Mo&stra\"\n02000E13=\"Amaga\"\n02000E14=\"Fixa\"\n\n02000E81=\"Títol\"\n02000E82=\"Ample\"\n\n; Testing\n02000F90=\"Provant\"\n\n\n; File Manager\n\n03000000=\"Gestor de Fitxers 7-Zip\"\n\n; Menu\n03000102=\"&Fitxer\"\n03000103=\"&Edita\"\n03000104=\"&Visualitza\"\n03000105=\"E&ines\"\n03000106=\"Aj&uda\"\n03000107=\"&Preferits\"\n\n; File\n03000210=\"&Obre\"\n03000211=\"Obre d&ins\"\n03000212=\"Obre fora\"\n03000220=\"&Visualitza\"\n03000221=\"&Edita\"\n03000230=\"Renom&ena\"\n03000231=\"&Copia a...\"\n03000232=\"&Moure a...\"\n03000233=\"Suprimeix\"\n03000240=\"P&ropietats\"\n03000241=\"Come&ntari\"\n03000242=\"Calcula el checksum\"\n03000250=\"Crea carpeta\"\n03000251=\"Crea fitxer\"\n03000260=\"Surt\"\n03000270=\"&Divideix el fitxer...\"\n03000271=\"Com&bina el fitxer...\"\n\n; Edit\n03000310=\"Desfés\"\n03000311=\"&Refés\"\n03000320=\"Re&talla\"\n03000321=\"&Copia\"\n03000322=\"Enganxa\"\n03000323=\"&Suprimeix\"\n03000330=\"Seleccion&a-ho tot\"\n03000331=\"Deselecciona-ho tot\"\n03000332=\"&Inverteix selecció\"\n03000333=\"Selecciona...\"\n03000334=\"Deselecciona...\"\n03000335=\"Selecciona per tipus\"\n03000336=\"Deselecciona per tipus\"\n\n; View\n03000410=\"Icones g&rans\"\n03000411=\"Icones petites\"\n03000412=\"&Llista\"\n03000413=\"&Detalls\"\n03000420=\"No ordenat\"\n03000430=\"Obre carpeta arrel\"\n03000431=\"Carpeta pare\"\n03000432=\"Historial de carpetes...\"\n03000440=\"&Actualitza\"\n03000449=\"Vista plana\"\n03000450=\"&2 Taules\"\n03000451=\"&Barres d'eines\"\n03000460=\"Barra d'eines afegeix/extreu\"\n03000461=\"Barra d'eines estàndard\"\n03000462=\"Botons grans\"\n03000463=\"Mostra botons amb text\"\n\n; Tools\n03000510=\"Opcions...\"\n03000511=\"&Test de referència\"\n\n; Help\n03000610=\"&Contingut...\"\n03000620=\"Quant a 7-Zip...\"\n\n; Favorites\n03000710=\"&Afegeix la carpeta als Preferits com\"\n03000720=\"Personal\"\n\n; Options Dialog\n\n03010000=\"Opcions\"\n\n; Plugins\n03010100=\"Connectors\"\n03010101=\"&Connectors:\"\n03010110=\"Opcions...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Associa 7-Zip amb:\"\n03010310=\"Connector\"\n\n; Settings\n03010400=\"Selecció\"\n03010401=\"Mostra l'element \\\"..\\\"\"\n03010402=\"Mostra icones reals dels fitxers\"\n03010410=\"Mostra el menú de sistema\"\n03010420=\"&Selecció de columna completa\"\n03010421=\"Mostra les línies de &graella\"\n03010430=\"Mode de selecció &alternatiu\"\n03010440=\"Usa pàgines de memòria &grans\"\n\n; Strings\n\n03020201=\"Copia\"\n03020202=\"Mou\"\n03020203=\"Copia a:\"\n03020204=\"Mou a:\"\n03020205=\"Copiant...\"\n03020206=\"Movent...\"\n03020207=\"No es poden moure o copiar elements d'aquest tipus de carpetes.\"\n03020208=\"Operació no permesa.\"\n03020209=\"Seleccioneu una carpeta de destí.\"\n\n03020210=\"Confirmeu la supressió del fitxer\"\n03020211=\"Confirmeu la supressió de la carpeta\"\n03020212=\"Confirmeu supressió múltiple de fitxers\"\n03020213=\"Esteu segur que voleu suprimir '{0}'?\"\n03020214=\"Esteu segur que voleu suprimir la carpeta '{0}' i tot el seu contingut?\"\n03020215=\"Esteu segur que voleu esborrar aquests {0} elements?\"\n03020216=\"Suprimint...\"\n03020217=\"Error esborrant fitxer o carpeta\"\n03020218=\"El sistema no pot moure un fitxer amb una ruta llarga a la paperea de reciclatge\"\n\n03020220=\"Renomenant...\"\n03020221=\"Error renomenant fitxer o carpeta\"\n03020222=\"Confirmeu la còpia del fitxer\"\n03020223=\"Esteu segur que voleu copiar els fitxers a l'arxiu\"\n\n03020230=\"Crea carpeta\"\n03020231=\"Nom de carpeta:\"\n03020232=\"Carpeta nova\"\n03020233=\"Error creant carpeta\"\n\n03020240=\"Crea arxiu\"\n03020241=\"Nom d'arxiu:\"\n03020242=\"Fitxer nou\"\n03020243=\"Error creant el fitxer\"\n\n03020250=\"Selecciona\"\n03020251=\"No selecciona\"\n03020252=\"Màscara:\"\n\n03020260=\"Historial de carpetes\"\n\n03020280=\"El fitxer '{0}' ha estat modificat.\\nVoleu actualitzar-lo a l'arxiu?\"\n03020281=\"No pot actualitzar-se el fitxer\\n'{0}'\"\n03020282=\"No pot executar-se l'editor.\"\n03020283=\"Obrint...\"\n03020284=\"El fitxer sembla un virus (el nom del fitxer conté espais molt llargs al nom).\"\n\n03020290=\"Comentari\"\n03020291=\"&Comentari:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"El meu ordinador\"\n03020301=\"Entorn de xarxa\"\n03020302=\"Documents\"\n\n03020400=\"Afegeix\"\n03020401=\"Extreu\"\n03020402=\"Prova\"\n\n03020420=\"Copia\"\n03020421=\"Mou\"\n03020422=\"Suprimeix\"\n03020423=\"Info\"\n\n03020500=\"Divideix fitxer\"\n03020501=\"&Divideix a:\"\n03020510=\"Dividint...\"\n03020520=\"Confirmació de la divisió\"\n03020521=\"Esteu segur que voleu dividir el fitxer en {0} volums?\"\n03020522=\"La mida del volum ha de ser més petita que la mida del fitxer original\"\n\n03020600=\"Combina fitxers\"\n03020601=\"&Combina a:\"\n03020610=\"Combinant...\"\n03020620=\"Seleccioneu només el primer fitxer\"\n03020621=\"No es pot detectar un fitxer com a una part del fitxer dividit\"\n03020622=\"No es pot trobar més d'una part del fitxer dividit\"\n\n03020710=\"Calculant el checksum...\"\n03020720=\"Informació del checksum\"\n03020721=\"CRC checksum per les dades:\"\n03020722=\"CRC checksum per les dades i els noms:\"\n\n03020800=\"Scanning...\"\n\n03020900=\"Properties\"\n\n03020A01=\"L'operació no es pot cridar des d'una carpeta amb una ruta llarga.\"\n03020A02=\"Heu de seleccionar un fitxer\"\n03020A03=\"Heu de seleccionar un o més fitxers\"\n03020A04=\"El fitxer {0} ja existeix\"\n\n; Computer\n03031100=\"Mida total\"\n03031101=\"Espai lliure\"\n03031102=\"Mida sector\"\n03031103=\"Etiqueta\"\n\n; Network\n03031200=\"Nom local\"\n03031201=\"Proveïdor\"\n\n; Benchmark Dialog\n\n03080000=\"Test de referència\"\n03080001=\"Ús de la memòria:\"\n03080002=\"Comprimint\"\n03080003=\"Decomprimint\"\n03080004=\"Velocitat\"\n03080005=\"Taxa\"\n03080006=\"Taxa total\"\n03080007=\"Actual\"\n03080008=\"Resultant\"\n03080009=\"Passades:\"\n0308000A=\"Errors:\"\n0308000B=\"Ús de la CPU\"\n0308000C=\"Taxa / Ús\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/cs.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.30\n; Translated by Milan Hrubý\n; Updated for 4.33 version by Michal Molhanec\n; 7-Zip 4.57 updated by Jiří Malák\n;\n\n00000000=\"Czech\"\n00000001=\"Čeština\"\n00000002=\"5\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip konfigurace\"\n\n; Info Page\n01000100=\"O programu 7-Zip\"\n01000103=\"7-Zip je svobodný software. Nicméně můžete podpořit jeho vývoj registrací.\"\n01000104=\"Podpora\"\n01000105=\"Registrovat\"\n\n; Folders Page\n01000200=\"Složky\"\n01000210=\"Pracovní složka\"\n01000211=\"&Systémová složka pro dočasné soubory\"\n01000212=\"&Aktuální\"\n01000213=\"S&ložka:\"\n01000214=\"&Používat pouze pro vyjímatelné disky\"\n\n01000281=\"Vyberte umístění pro dočasné komprimované soubory.\"\n\n; System Page\n01000300=\"Systém\"\n01000301=\"&Integrovat 7-Zip do kontextového menu\"\n01000302=\"S&tupňovité kontextové menu\"\n01000310=\"&Položky kontextového menu:\"\n\n; Language Page\n01000400=\"Jazyk\"\n01000401=\"Jazyk:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip příkazy\"\n02000103=\"Otevřít\"\n02000104=\"Otevře vybraný archiv.\"\n02000105=\"Rozbalit soubory...\"\n02000106=\"Rozbalí soubory z vybraného archivu.\"\n02000107=\"Přidat do archivu...\"\n02000108=\"Přidá vybrané položky do archivu.\"\n02000109=\"Testovat archiv\"\n0200010A=\"Otestuje integritu vybraného archivu.\"\n0200010B=\"Rozbalit zde\"\n0200010C=\"Rozbalí soubory z vybraného archivu do aktuální složky.\"\n0200010D=\"Rozbalit do {0}\"\n0200010E=\"Rozbalí soubory do podsložky.\"\n0200010F=\"Přidat do {0}\"\n02000110=\"Přidá vybrané položky do archivu.\"\n02000111=\"Zkomprimovat a odeslat poštou...\"\n02000112=\"Zkomprimuje vybrané položky do archivu a odešle archiv poštou.\"\n02000113=\"Zkomprimovat do {0} a odeslat poštou\"\n02000114=\"Zkomprimuje vybrané položky do archivu a odešle archiv poštou.\"\n\n02000140=\"<Složka>\"\n02000141=\"<Archiv>\"\n\n; Properties\n02000203=\"Cesta\"\n02000204=\"Název\"\n02000205=\"Přípona\"\n02000206=\"Složka\"\n02000207=\"Velikost\"\n02000208=\"Komprimovaná velikost\"\n02000209=\"Atributy\"\n0200020A=\"Vytvořen\"\n0200020B=\"Použit\"\n0200020C=\"Změněn\"\n0200020D=\"Pevný\"\n0200020E=\"S poznámkou\"\n0200020F=\"Zakódovaný\"\n02000210=\"Rozdělen do\"\n02000211=\"Rozdělen od\"\n02000212=\"Slovník\"\n02000213=\"CRC\"\n02000214=\"Typ\"\n02000215=\"Anti\"\n02000216=\"Metoda\"\n02000217=\"Hostitelský OS\"\n02000218=\"Souborový systém\"\n02000219=\"Uživatel\"\n0200021A=\"Skupina\"\n0200021B=\"Blok\"\n0200021C=\"Poznámka\"\n0200021D=\"Pozice\"\n0200021E=\"Cesta\"\n0200021F=\"Složky\"\n02000220=\"Soubory\"\n02000221=\"Verze\"\n02000222=\"Díl\"\n02000223=\"Vícedílný\"\n02000224=\"Offset\"\n02000225=\"Odkazy\"\n02000226=\"Bloků\"\n02000227=\"Dílů\"\n\n; Status bar\n02000301=\"vybráno {0} objekt(ů)\"\n02000302=\"{0} objekt(ů)\"\n\n02000320=\"Soubory:\"\n02000321=\"Složky:\"\n02000322=\"Velikost:\"\n02000323=\"Komprimovaná velikost:\"\n02000324=\"Archívy:\"\n\n; List Context Menu\n02000401=\"&Sloupce...\"\n\n02000411=\"&Otevřít\"\n02000412=\"&Rozbalit...\"\n\n; ToolBar\n02000501=\"Rozbalit\"\n\n; Messages\n02000601=\"Aktualizační operace nejsou podporovány pro tento archiv.\"\n02000602=\"Nelze aktualizovat archiv {0}\"\n02000603=\"Nelze vytvořit složku '{0}'\"\n02000604=\"Soubor není podporovaným archivem.\"\n02000605=\"Chyba\"\n02000606=\"Příliš mnoho položek\"\n02000607=\"Žádná aplikace není asociována s touto příponou souboru\"\n02000608=\"Nedošlo k žádným chybám\"\n02000609=\"Soubor '{0}' nelze otevřít jako archiv\"\n0200060A=\"Zakódovaný archiv '{0}' nelze otevřít. Špatné heslo?\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ano\"\n02000707=\"Ano na &všechno\"\n02000709=\"&Ne\"\n0200070B=\"N&e na všechno\"\n\n02000710=\"Storno\"\n02000711=\"&Storno\"\n02000713=\"Zavří&t\"\n02000714=\"Zastavit\"\n02000715=\"Spustit znovu\"\n\n02000720=\"Nápověda\"\n\n; Extract dialog\n02000800=\"Rozbalit\"\n02000801=\"&Rozbalit do:\"\n02000802=\"Heslo\"\n\n02000810=\"Cesty\"\n02000811=\"Plné cesty\"\n02000812=\"Aktuální cesty\"\n02000813=\"Žádné cesty\"\n\n02000820=\"Způsob přepisování\"\n02000821=\"Zeptat se před přepisem\"\n02000822=\"Přepsat bez výzvy\"\n02000823=\"Přeskočit existující soubory\"\n02000824=\"Automatické přejmenování\"\n02000825=\"Automatické přejmenování existujících souborů\"\n\n02000830=\"Soubory\"\n02000831=\"&Vybrané soubory\"\n02000832=\"Všechny &soubory\"\n\n02000881=\"Vyberte umístění pro rozbalené soubory.\"\n\n02000890=\"Rozbalování\"\n\n; Overwrite dialog\n02000900=\"Potvrzení nahrazení souboru\"\n02000901=\"Cílová složka již obsahuje zpracovaný soubor.\"\n02000902=\"Chcete nahradit existující soubor\"\n02000903=\"tímto?\"\n\n02000911=\"A&utomaticky přejmenovat\"\n\n02000982=\"{0} bajtů\"\n02000983=\"změněn\"\n\n; Messages dialog\n02000A00=\"Diagnostické zprávy\"\n\n02000A80=\"Zpráva\"\n\n02000A91=\"Nepodporovaná komprimační metoda pro '{0}'.\"\n02000A92=\"Chyba dat v '{0}'. Soubor je poškozený.\"\n02000A93=\"Chyba CRC v '{0}'. Soubor je poškozený.\"\n02000A94=\"Chyba dat v zakódovaném souboru '{0}'. Chybné heslo?\"\n02000A95=\"Chyba CRC v zakódovaném souboru '{0}'. Chybné heslo?\"\n\n; Password dialog\n02000B00=\"Vložit heslo\"\n02000B01=\"Vložit heslo:\"\n02000B02=\"Zobrazit he&slo\"\n02000B03=\"Potvrzení hesla:\"\n02000B10=\"Heslo nesouhlasí\"\n02000B11=\"Pro heslo použíjte pouze anglická písmena, číslice a speciální znaky (!, #, $, ...)\"\n02000B12=\"Heslo je příliš dlouhé\"\n\n; Progress dialog\n02000C00=\"Průběh\"\n02000C01=\"Uplynulý čas:\"\n02000C02=\"Zbývající čas:\"\n02000C03=\"Celková velikost:\"\n02000C04=\"Rychlost:\"\n02000C05=\"Zpracováno:\"\n02000C06=\"Komprimační poměr:\"\n\n02000C10=\"&Pozadí\"\n02000C11=\"P&opředí\"\n02000C12=\"Po&zastavit\"\n02000C13=\"Po&kračovat\"\n\n02000C20=\"Pozastaveno\"\n\n02000C30=\"Jste si jistí, že to chcete stornovat?\"\n\n; Compress dialog\n02000D00=\"Přidat do archivu\"\n02000D01=\"&Archiv:\"\n02000D02=\"Způsob aktualizace:\"\n02000D03=\"&Formát archivu:\"\n02000D04=\"&Komprimační metoda:\"\n02000D05=\"&Vytvořit pevný archiv\"\n02000D06=\"&Parametry:\"\n02000D07=\"Možnosti\"\n02000D08=\"Vytvořit SF&X archiv\"\n02000D09=\"Více-vláknový\"\n02000D0A=\"Zakódovat &názvy souborů\"\n02000D0B=\"Ú&roveň komprese:\"\n02000D0C=\"Ve&likost slovníku:\"\n02000D0D=\"V&elikost slova:\"\n02000D0E=\"Spotřeba paměti pro zabalení:\"\n02000D0F=\"Spotřeba paměti pro rozbalení:\"\n02000D10=\"Zakódování\"\n02000D11=\"Metoda zakódování:\"\n02000D12=\"Počet vláken CPU:\"\n02000D13=\"Velikost bloku:\"\n02000D14=\"Podle velikosti souboru\"\n02000D15=\"Pevný\"\n02000D16=\"Zkomprimovat otevřené soubory\"\n\n02000D40=\"Rozdělit na díly, bajtů:\"\n02000D41=\"Nesprávná velikost dílu\"\n02000D42=\"Zadaná velikost dílu: {0} bytů.\\nJste si jistí, že chcete rozdělit archiv do takových dílů?\"\n\n02000D81=\"Skladovací\"\n02000D82=\"Normální\"\n02000D83=\"Maximální\"\n02000D84=\"Rychlá\"\n02000D85=\"Nejrychlejší\"\n02000D86=\"Ultra\"\n\n02000D90=\"Procházet\"\n\n02000DA1=\"Přidat a nahradit soubory\"\n02000DA2=\"Aktualizovat a přidat soubory\"\n02000DA3=\"Aktualizovat existující soubory\"\n02000DA4=\"Synchronizovat soubory\"\n\n02000DB1=\"Všechny soubory\"\n\n02000DC0=\"Komprimování\"\n\n; Columns dialog\n02000E00=\"Sloupce\"\n02000E01=\"Zaškrtněte sloupce, které byste rádi zviditelnili v této složce. Použijte tlačítka Posunout nahoru a Posunout dolů pro uspořádání sloupců.\"\n02000E02=\"Vybraný sloupec by měl být\"\n02000E03=\"pixelů šir&oký.\"\n\n02000E10=\"Posunout &nahoru\"\n02000E11=\"Posunout &dolů\"\n02000E12=\"&Ukázat\"\n02000E13=\"&Skrýt\"\n02000E14=\"Nastavit\"\n\n02000E81=\"Název\"\n02000E82=\"Šířka\"\n\n; Testing\n02000F90=\"Testování\"\n\n\n; File Manager\n\n03000000=\"7-Zip správce souborů\"\n\n; Menu\n03000102=\"&Soubor\"\n03000103=\"Úpr&avy\"\n03000104=\"&Zobrazení\"\n03000105=\"&Nástroje\"\n03000106=\"Nápo&věda\"\n03000107=\"&Oblíbené\"\n\n; File\n03000210=\"&Otevřít\"\n03000211=\"Otevřít u&vnitř\"\n03000212=\"Otevřít &mimo\"\n03000220=\"&Zobrazit\"\n03000221=\"&Upravit\"\n03000230=\"&Přejmenovat\"\n03000231=\"Kopírovat &do...\"\n03000232=\"Př&esunout do...\"\n03000233=\"Vymaza&t\"\n03000240=\"Vlast&nosti\"\n03000241=\"Poznámk&a\"\n03000242=\"Vypočítat kontrolní součet\"\n03000250=\"Vytvořit složku\"\n03000251=\"Vytvořit soubor\"\n03000260=\"&Konec\"\n03000270=\"&Rozdělit soubor...\"\n03000271=\"&Sloučit soubory...\"\n\n; Edit\n03000310=\"&Zpět\"\n03000311=\"&Opakovat\"\n03000320=\"Vyjmou&t\"\n03000321=\"&Kopírovat\"\n03000322=\"&Vložit\"\n03000323=\"Vym&azat\"\n03000330=\"Vybrat &vše\"\n03000331=\"Zrušit výběr vše\"\n03000332=\"&Invertovat výběr\"\n03000333=\"Vybrat...\"\n03000334=\"Zrušit výběr...\"\n03000335=\"Vybrat podle typu\"\n03000336=\"Zrušit výběr podle typu\"\n\n; View\n03000410=\"&Velké ikony\"\n03000411=\"&Malé ikony\"\n03000412=\"&Seznam\"\n03000413=\"&Podrobnosti\"\n03000420=\"&Bez třídění\"\n03000430=\"Otevřít kořenovou složku\"\n03000431=\"O úroveň výš\"\n03000432=\"Historie složek...\"\n03000440=\"&Obnovit\"\n03000449=\"\\\"Ploché\\\" zobrazení\"\n03000450=\"&2 panely\"\n03000451=\"Nástrojové lišty\"\n03000460=\"Archivační nástrojová lišta\"\n03000461=\"Standardní nástrojová lišta\"\n03000462=\"Velká tlačítka\"\n03000463=\"Zobrazovat text tlačítek\"\n\n; Tools\n03000510=\"&Možnosti...\"\n03000511=\"&Test výkonu\"\n\n; Help\n03000610=\"&Obsah...\"\n03000620=\"O progr&amu 7-Zip...\"\n\n; Favorites\n03000710=\"&Přidat složku do oblíbených jako\"\n03000720=\"Záložka\"\n\n; Options Dialog\n\n03010000=\"Možnosti\"\n\n; Plugins\n03010100=\"Pluginy\"\n03010101=\"&Pluginy:\"\n03010110=\"Možnosti...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Systém\"\n03010302=\"Asociovat 7-Zip s:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Nastavení\"\n03010401=\"Zobrazovat položku \\\"..\\\"\"\n03010402=\"Zobrazovat skutečnou ikonu souboru\"\n03010410=\"Zobrazovat systémové menu\"\n03010420=\"&Vybírat celý řádek\"\n03010421=\"Zobrazovat &mřížku\"\n03010430=\"&Alternativní způsob výběru\"\n03010440=\"&Používat velké stránky paměti\"\n\n; Strings\n\n03020201=\"Kopírovat\"\n03020202=\"Přesunout\"\n03020203=\"Kopírovat do:\"\n03020204=\"Přesunout do:\"\n03020205=\"Kopírování...\"\n03020206=\"Přesouvání...\"\n03020207=\"Nemůžete přesunout nebo kopírovat položky do této složky.\"\n03020208=\"Operace není podporována.\"\n03020209=\"Vyberte cílovou složku.\"\n\n03020210=\"Potvrdit vymazání souboru\"\n03020211=\"Potvrdit vymazání složky\"\n03020212=\"Potvrdit mnohonásobné vymazání souboru\"\n03020213=\"Jste si jistí, že chcete vymazat '{0}'?\"\n03020214=\"Jste si jistí, že chcete vymazat složku '{0}' a všechno co obsahuje?\"\n03020215=\"Jste si jistí, že chcete vymazat tyto {0} položky?\"\n03020216=\"Mazání...\"\n03020217=\"Chyba při mazání souboru nebo složky\"\n\n03020220=\"Přejmenování...\"\n03020221=\"Chyba při přejmenování souboru nebo složky\"\n03020222=\"Potvrzení kopírování souborů\"\n03020223=\"Jste si jistí, že chcete zkopírovat soubory do archivu\"\n\n03020230=\"Vytvořit složku\"\n03020231=\"Název složky:\"\n03020232=\"Nová složka\"\n03020233=\"Chyba při vytváření složky\"\n\n03020240=\"Vytvořit soubor\"\n03020241=\"Název souboru:\"\n03020242=\"Nový soubor\"\n03020243=\"Chyba při vytváření souboru\"\n\n03020250=\"Vybrat\"\n03020251=\"Zrušit výběr\"\n03020252=\"Maska:\"\n\n03020260=\"Historie složek\"\n\n03020280=\"Soubor '{0}' byl změněn.\\nChcete ho aktualizovat v archivu?\"\n03020281=\"Nelze aktualizovat soubor\\n'{0}'\"\n03020282=\"Editor nelze spustit.\"\n03020283=\"Otevírání...\"\n\n03020290=\"Poznámka\"\n03020291=\"&Poznámka:\"\n\n030202A0=\"Systém\"\n\n03020300=\"Počítač\"\n03020301=\"Síť\"\n\n03020400=\"Přidat\"\n03020401=\"Rozbalit\"\n03020402=\"Test\"\n\n03020420=\"Kopírovat\"\n03020421=\"Přesunout\"\n03020422=\"Vymazat\"\n03020423=\"Informace\"\n\n03020500=\"Rozdělit soubor\"\n03020501=\"Rozdělit do:\"\n03020510=\"Rozdělování...\"\n03020520=\"Potvrdit rozdělování\"\n03020521=\"Jste si jistí, že chcete rozdělit soubor na {0} dílů?\"\n03020522=\"Velikost dílu musí být menší než velikost původního souboru\"\n\n03020600=\"Sloučit soubory\"\n03020601=\"Sloučit do:\"\n03020610=\"Slučování...\"\n03020620=\"Vybrat pouze první soubor\"\n\n03020710=\"Vypočítávání kontrolního součtu...\"\n03020720=\"Informace o kontrolním součtu\"\n03020721=\"CRC kontrolní součet pro data:\"\n03020722=\"CRC kontrolní součet pro data a jména:\"\n\n03020800=\"Prohledávání...\"\n\n03020900=\"Vlastnosti\"\n\n; Computer\n03031100=\"Celková velikost\"\n03031101=\"Volné místo\"\n03031102=\"Velikost clusteru\"\n03031103=\"Označení\"\n\n; Network\n03031200=\"Místní název\"\n03031201=\"Poskytovatel\"\n\n; Benchmark Dialog\n\n03080000=\"Test výkonu\"\n03080001=\"Spotřeba paměti:\"\n03080002=\"Komprimování\"\n03080003=\"Rozbalování\"\n03080004=\"Rychlost\"\n03080005=\"Výkon\"\n03080006=\"Celkový výkon\"\n03080007=\"Aktuální\"\n03080008=\"Výsledné\"\n03080009=\"Průchodů:\"\n0308000A=\"Chyb:\"\n0308000B=\"Využití CPU\"\n0308000C=\"Výkon / Využití\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/cy.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.37\n; Translated by Owain Lewis\n;\n;\n;\n;\n\n00000000=\"Welsh\"\n00000001=\"Cymraeg\"\n00000002=\"82\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Ffurfweddiad 7-Zip\"\n\n; Info Page\n01000100=\"Manylion 7-Zip\"\n01000103=\"Mae 7-Zip yn meddalwedd am ddim. Ond, gallwch cefnogi y\ndatblygiad o 7-Zip trwy cofrestru.\"\n01000104=\"Cefnogi\"\n01000105=\"Cofrestri\"\n\n; Folders Page\n01000200=\"Ffolderi\"\n01000210=\"Ffolder &gweithio\"\n01000211=\"Ffolder tymor byr y &system\"\n01000212=\"&Cyfredol\"\n01000213=\"&Penodol:\"\n01000214=\"Defnyddiwch am gyriant symudadwy yn unig\"\n\n01000281=\"Nodwch lleoliad am ffeiliau archif tymor byr.\"\n\n; System Page\n01000300=\"System\"\n01000301=\"Cyfuno 7-Zip mewn i dewislen cyd-destun y cribyn\"\n01000302=\"Dewislen cyd-destun wedi'i rhaeadru\"\n01000310=\"Eitemau dewislen cyd-destun:\"\n\n; Language Page\n01000400=\"Iaith\"\n01000401=\"Iaith:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Gorchymynion 7-Zip\"\n02000103=\"Agor archif\"\n02000104=\"Agor yr archif dethol.\"\n02000105=\"Echdynnu ffeiliau...\"\n02000106=\"Echdynnu ffeiliau o'r archif dethol.\"\n02000107=\"Ychwanegu i'r archif...\"\n02000108=\"Ychwanegu yr eitemau dethol i'r archif.\"\n02000109=\"Profi archif\"\n0200010A=\"Profi cywirdeb yr archif dethol.\"\n0200010B=\"Echdynnu Yma\"\n0200010C=\"Echdynnu ffeiliau o'r archif dethol i'r ffolder cyfredol.\"\n0200010D=\"Echdynnu i {0}\"\n0200010E=\"Echdynnu ffeiliau i is-ffolder.\"\n0200010F=\"Ychwanegu i {0}\"\n02000110=\"Ychwanegu yr eitemau dethol i'r archif.\"\n02000111=\"Cywasgu ac e-bostio...\"\n02000112=\"Cywasgu yr eitemau dethol i archif a danfon yr archif trwy\ne-bost.\"\n02000113=\"Cywasgu i {0} ac e-bostio\"\n02000114=\"Cywasgu yr eitemau dethol i archif a danfon yr archif trwy\ne-bost.\"\n\n02000140=\"<Ffolder>\"\n02000141=\"<Archif>\"\n\n; Properties\n02000203=\"Llwybr\"\n02000204=\"Enw\"\n02000205=\"Estyniad\"\n02000206=\"Ffolder\"\n02000207=\"Maint\"\n02000208=\"Maint wedi'i Cywasgu\"\n02000209=\"Priodweddau\"\n0200020A=\"Crëwyd\"\n0200020B=\"Cyrchwyd\"\n0200020C=\"Addaswyd\"\n0200020D=\"Solet\"\n0200020E=\"Sylwad\"\n0200020F=\"Amgryptio\"\n02000210=\"Hollti Cyn\"\n02000211=\"Hollti ar Ôl\"\n02000212=\"Geiriadur\"\n02000213=\"CRC\"\n02000214=\"Math\"\n02000215=\"Anti\"\n02000216=\"Dull\"\n02000217=\"SW Cynnal\"\n02000218=\"System Ffeiliau\"\n02000219=\"Ddefnyddiwr\"\n0200021A=\"Grŵp\"\n0200021B=\"Bloc\"\n0200021C=\"Sylwad\"\n0200021D=\"Safle\"\n0200021E=\"Rhagddodiad y Llwybr\"\n\n; Status bar\n02000301=\"{0} gwrthrych(au) dethol\"\n02000302=\"{0} gwrthrych(au)\"\n\n02000320=\"Ffeiliau:\"\n02000321=\"Ffolderi:\"\n02000322=\"Maint:\"\n\n; List Context Menu\n02000401=\"&Colofnau...\"\n\n02000411=\"&Agor\"\n02000412=\"&Echdynnu...\"\n\n; ToolBar\n02000501=\"Echdynnu\"\n\n; Messages\n02000601=\"Mae gweithrediadau diweddaru ddim yn ateg am yr archif hyn.\"\n02000602=\"Ddim yn gallu diweddaru yr archif {0}\"\n02000603=\"Ddim yn gallu creu y ffolder '{0}'\"\n02000604=\"Mae'r ffeil ddim yn archif ateg.\"\n02000605=\"Gwall\"\n02000606=\"Gormod o eitemau\"\n02000607=\"Mae na ddim rhaglen wedi'i cysylltu gyda'r estyniad enw ffeil\"\n02000608=\"Mae na ddim wallau\"\n\n; Dialogs\n02000702=\"Iawn\"\n02000705=\"&Iawn\"\n02000707=\"Iawn i'r &Cwbwl\"\n02000709=\"&Na\"\n0200070B=\"Na i'r C&wbwl\"\n\n02000710=\"Canslo\"\n02000711=\"&Canslo\"\n02000713=\"&Cau\"\n02000714=\"Stopio\"\n02000715=\"Ailgychwyn\"\n\n02000720=\"Cymorth\"\n\n; Extract dialog\n02000800=\"Echdynnu\"\n02000801=\"E&chdynnu i:\"\n02000802=\"Cyfrinair\"\n\n02000810=\"Modd llwybr\"\n02000811=\"Enwau llwybr llawn\"\n02000812=\"Enwau llwybr gyfredol\"\n02000813=\"Dim enwau llwybr\"\n\n02000820=\"Modd disodli\"\n02000821=\"Gofyn cyn disodli\"\n02000822=\"Disodli heb awgrymeb\"\n02000823=\"Crychneidio ffeiliau presennol\"\n02000824=\"Ailenwu yn awtomatig\"\n02000825=\"Ailenwu ffeiliau presennol yn awtomatig\"\n\n02000830=\"Ffeiliau\"\n02000831=\"&Ffeiliau dethol\"\n02000832=\"&Pob ffeil\"\n\n02000881=\"Nodwch lleoliad am echdynnu ffeiliau.\"\n\n02000890=\"Echdynnu\"\n\n; Overwrite dialog\n02000900=\"Cadarnhau Disodli Ffeil\"\n02000901=\"Mae'r ffolder hon eisioes yn cynnwys y ffeil cyrchfan.\"\n02000902=\"Hoffech chi ddisodli'r ffeil sy'n bodoli eisioes\"\n02000903=\"Gyda hon?\"\n\n02000911=\"Ailenwi A&wtomatig\"\n\n02000982=\"{0} beit\"\n02000983=\"addaswyd ar\"\n\n; Messages dialog\n02000A00=\"Neges diagnostig\"\n\n02000A80=\"Neges\"\n\n02000A91=\"Modd cywasgu ddim yn dilys am '{0}'.\"\n02000A92=\"Gwall data mewn '{0}'. Ffeil wedi'i torri.\"\n02000A93=\"CRC wedi'i methu mewn '{0}'. Ffeil wedi'i torri.\"\n\n; Password dialog\n02000B00=\"Mewnbynnwch cyfrinair\"\n02000B01=\"Mewnbynnwch cyfrinair:\"\n02000B02=\"&Dangos cyfrinair\"\n\n; Progress dialog\n02000C00=\"Proses\"\n02000C01=\"Wedi treiglo:\"\n02000C02=\"Amser a'r ôl:\"\n02000C03=\"Maint:\"\n02000C04=\"Cyflymder:\"\n\n02000C10=\"&Cefndir\"\n02000C11=\"&Blaendir\"\n02000C12=\"&Pwyllo\"\n02000C13=\"P&arhau\"\n\n02000C20=\"Pwyllo\"\n\n02000C30=\"Ydych chi am canslo?\"\n\n; Compress dialog\n02000D00=\"Ychwanegu i'r archif\"\n02000D01=\"&Archif:\"\n02000D02=\"Modd &diweddaru:\"\n02000D03=\"&Fformat yr archif:\"\n02000D04=\"Dull &cywasgu:\"\n02000D05=\"Creu archif &Solet\"\n02000D06=\"&Paramedrau:\"\n02000D07=\"Dewisiadau\"\n02000D08=\"Creu archif SF&X\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Amgryptio &enwau ffeiliau\"\n02000D0B=\"&Lefel cywasgu:\"\n02000D0C=\"Maint &geiriadur:\"\n02000D0D=\"Maint geiria&u:\"\n02000D0E=\"Defnydd cof am Cywasgu:\"\n02000D0F=\"Defnydd cof am Datgywasgu:\"\n\n02000D40=\"Hollti i &cyfeintiau, beitiau:\"\n\n02000D81=\"Storio\"\n02000D82=\"Arferol\"\n02000D83=\"Uchafswm\"\n02000D84=\"Cyflum\"\n02000D85=\"Cyflymach\"\n02000D86=\"Ultra\"\n\n02000D90=\"Pori\"\n\n02000DA1=\"Ychwanegu ac amnewid ffeiliau\"\n02000DA2=\"Diweddaru ac ychwanegu ffeiliau\"\n02000DA3=\"Adnewyddu y ffeiliau presennol\"\n02000DA4=\"Cyfamseru ffeiliau\"\n\n02000DB1=\"Pob Ffeil\"\n\n02000DC0=\"Cywasgu\"\n\n; Columns dialog\n02000E00=\"Colofnau\"\n02000E01=\"Ticiwch y colofnau byddech yn hoffi gwneud yn gweledig yn y\nffolder hon. Defnyddiwch y botwmau Symud Lan a Symud Lawr i ailtrefnu y\ncolofnau.\"\n02000E02=\"Dylid y colofn dethol bod\"\n02000E03=\"picseli &llydan.\"\n\n02000E10=\"Symud &Lan\"\n02000E11=\"Symud La&wr\"\n02000E12=\"&Dangos\"\n02000E13=\"&Cuddio\"\n02000E14=\"Gosod\"\n\n02000E81=\"Teitl\"\n02000E82=\"Lled\"\n\n; Testing\n02000F90=\"Ymbrofi\"\n\n\n; File Manager\n\n03000000=\"Rheolwr Ffeil 7-Zip\"\n\n; Menu\n03000102=\"&Ffeil\"\n03000103=\"&Golygu\"\n03000104=\"Gwe&ld\"\n03000105=\"&Offer\"\n03000106=\"&Cymorth\"\n03000107=\"Ff&efrynnau\"\n\n; File\n03000210=\"&Agor\"\n03000211=\"Agor tu &Mewn\"\n03000212=\"Agor tu &Fas\"\n03000220=\"Gwe&ld\"\n03000221=\"&Golygu\"\n03000230=\"A&ilenwi\"\n03000231=\"&Copïo i...\"\n03000232=\"&Symud i...\"\n03000233=\"&Dileu\"\n03000240=\"&Priodweddau\"\n03000241=\"Syl&wad\"\n03000242=\"Cyfrifo swm-gwirio\"\n03000250=\"Creu Ffolder\"\n03000251=\"Creu Ffeil\"\n03000260=\"Alla&n\"\n03000270=\"&Hollti ffeil...\"\n03000271=\"Cy&funo ffeilau...\"\n\n; Edit\n03000310=\"&Dadwneud\"\n03000311=\"&Ailwneud\"\n03000320=\"&Torri\"\n03000321=\"&Copïo\"\n03000322=\"&Gludo\"\n03000323=\"D&ileu\"\n03000330=\"Dewis y C&yfan\"\n03000331=\"Dad-ddewis y Cyfan\"\n03000332=\"Gwrt&hdroi'r Dewis\"\n03000333=\"Dewis...\"\n03000334=\"Dad-ddewis...\"\n03000335=\"Dewis trwy Math\"\n03000336=\"Dad-ddewis trwy Math\"\n\n; View\n03000410=\"Eiconau &Mawr\"\n03000411=\"Eiconau &Bach\"\n03000412=\"&Rhestr\"\n03000413=\"Ma&nylion\"\n03000420=\"Dad-dosbarthu\"\n03000430=\"Agor Ffolder Gwraidd\"\n03000431=\"Lan Un Lefel\"\n03000432=\"Hanes Ffolderi...\"\n03000440=\"&Adnewyddu\"\n03000449=\"Golwg Flat\"\n03000450=\"&2 Paneli\"\n03000451=\"Bariau &Offer\"\n03000460=\"Bar Offer Archif\"\n03000461=\"Bar Offer Arferol\"\n03000462=\"Botwmau Fawr\"\n03000463=\"Dangos Testun Botwmau\"\n\n; Tools\n03000510=\"&Dewisiadau...\"\n03000511=\"&Meincnod\"\n\n; Help\n03000610=\"&Cynnwys...\"\n03000620=\"&Manylion 7-Zip...\"\n\n; Favorites\n03000710=\"&Ychwanegu ffolder i Ffefrynnau fel\"\n03000720=\"Llyfrnod\"\n\n; Options Dialog\n\n03010000=\"Dewisiadau\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Dewisiadau...\"\n\n; Edit\n03010200=\"Golygydd\"\n03010201=\"&Golygydd:\"\n\n; System\n03010300=\"System\"\n03010302=\"Cysylltu 7-Zip gyda:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Gosodiadau\"\n03010401=\"Dangos eitem \\\"..\\\"\"\n03010402=\"Dangos eicon ffeil go iawn\"\n03010410=\"Dangos dewislen y system\"\n03010420=\"Dethol &holl rhes\"\n03010421=\"Dangos llinellau &grid\"\n03010430=\"Modd dethol &arallddewisiol\"\n03010440=\"Defnyddiwch tudalenau cof &mawr\"\n\n; Strings\n\n03020201=\"Copïo\"\n03020202=\"Symud\"\n03020203=\"Copïo i:\"\n03020204=\"Symud i:\"\n03020205=\"Copïo...\"\n03020206=\"Symud...\"\n03020207=\"Rydych ddim yn gallu symud na copïo eitemau am ffolderi o'r\nfath.\"\n03020208=\"Mae'r gweithrediad ddim wedi'i ategu.\"\n\n03020210=\"Cadarnhau Dileu Ffeil\"\n03020211=\"Cadarnhau Dileu Ffolder\"\n03020212=\"Cadarnhau Dileu Ffeiliau Amryfal\"\n03020213=\"Ydych chi'n siŵr eich bod am dileu '{0}'?\"\n03020214=\"Ydych chi'n siŵr eich bod am dileu y ffolder '{0}' ac ei holl\ncynnwys?\"\n03020215=\"Ydych chi'n siŵr eich bod am dileu yr eitemau hyn {0}?\"\n03020216=\"Dileu...\"\n03020217=\"Gwall Dileu Ffeil neu Ffolder\"\n\n03020220=\"Ailenwi...\"\n03020221=\"Gwall wrth Ailenwi Ffeil neu Ffolder\"\n03020222=\"Cadarnhau Copi Ffeil\"\n03020223=\"Ydych chi'n siŵr eich bod am copïo'r ffeiliau i'r archif\"\n\n03020230=\"Creu Ffolder\"\n03020231=\"Enw Ffolder:\"\n03020232=\"Ffolder Newydd\"\n03020233=\"Gwall wrth Creu Ffolder\"\n\n03020240=\"Creu Ffeil\"\n03020241=\"Enw Ffeil:\"\n03020242=\"Ffeil Newydd\"\n03020243=\"Gwall wrth Creu Ffeil\"\n\n03020250=\"Dewis\"\n03020251=\"Dad-ddewis\"\n03020252=\"Mwgwd:\"\n\n03020260=\"Hanes Ffolderi\"\n\n03020280=\"Roedd ffeil '{0}' wedi'i addasu.\\nWyt ti moen ei diweddaru yn yr\narchif?\"\n03020281=\"Ddim yn gallu diweddaru ffeil\\n'{0}'\"\n03020282=\"Ddim yn gallu dechrau golygydd.\"\n03020283=\"Agor...\"\n\n03020290=\"Sylwad\"\n03020291=\"&Sylwad:\"\n\n030202A0=\"System\"\n\n03020300=\"Cyfrifiadur\"\n03020301=\"Rhyngrwyd\"\n\n03020400=\"Ychwanegu\"\n03020401=\"Echdynnu\"\n03020402=\"Profi\"\n\n03020420=\"Copïo\"\n03020421=\"Symud\"\n03020422=\"Dileu\"\n03020423=\"Gwybodaeth\"\n\n03020500=\"Hollti Ffeil\"\n03020501=\"&Hollti i:\"\n03020510=\"Hollti...\"\n\n03020600=\"Cyfuno Ffeiliau\"\n03020601=\"&Cyfuno i:\"\n03020610=\"Cyfuno...\"\n\n03020710=\"Cyfrifo swm-gwirio...\"\n03020720=\"Gwybodaeth swm-gwirio\"\n03020721=\"Swm-gwirio CRC am data:\"\n03020722=\"Swm-gwirio CRC am data ac enwau:\"\n\n03020800=\"Sganio...\"\n\n; Computer\n03031100=\"Cyfanswm Maint\"\n03031101=\"Lle Rhydd\"\n03031102=\"Maint Clwstwr\"\n03031103=\"Label\"\n\n; Network\n03031200=\"Enw Lleol\"\n03031201=\"Darparwr\"\n\n; Benchmark Dialog\n\n03080000=\"Meincnod\"\n03080001=\"Defnyddiad cof:\"\n03080002=\"Cywasgu\"\n03080003=\"Datgywasgu\"\n03080004=\"Cyflymdra\"\n03080005=\"Amcangyfrif\"\n03080006=\"Amcangyfrif llwyr\"\n03080007=\"Presennol\"\n03080008=\"Canlyniad\"\n03080009=\"Pasio:\"\n0308000A=\"Gwallau:\"\n\n;!@LangEnd@!\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/da.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Originaly Translated by Jakob Schmidt.\n; Updated by Kian Andersen, Jørgen Rasmussen\n;\n;\n;\n\n00000000=\"Danish\"\n00000001=\"Dansk\"\n00000002=\"6\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Indstillinger\"\n\n; Info Page\n01000100=\"Om 7-Zip\"\n01000103=\"7-Zip er gratis software, men hvis du kan og vil hjælpe fremtidige udvikling, så vær venlig at registrer.\"\n01000104=\"Support\"\n01000105=\"Registrer\"\n\n; Folders Page\n01000200=\"Mappe\"\n01000210=\"&Arbejdsmappe\"\n01000211=\"&Systemets midlertidige mappe\"\n01000212=\"&Nuværende\"\n01000213=\"&Specificeret:\"\n01000214=\"Brug kun til flytbare drev.\"\n\n01000281=\"Angiv adresse til midlertidige filer..\"\n\n; System Page\n01000300=\"System\"\n01000301=\"Flet 7-Zip ind i Windows\"\n01000302=\"Vis 7-zip ved højreklik\"\n01000310=\"Punkter i genvejsmenuen:\"\n\n; Language Page\n01000400=\"Sprog\"\n01000401=\"Sprog:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip kommandoer\"\n02000103=\"Åben\"\n02000104=\"Åbner det valgte arkiv.\"\n02000105=\"Udpak filer...\"\n02000106=\"Udpak filer fra det valgte arkiv.\"\n02000107=\"Føj til arkiv...\"\n02000108=\"Føj de valgte filer til arkiv.\"\n02000109=\"Undersøg arkiv\"\n0200010A=\"Undersøger integriteten af valgte arkiv.\"\n0200010B=\"Udpak Her\"\n0200010C=\"Udpak filer fra det valgte arkiv her.\"\n0200010D=\"Udpak til {0}\"\n0200010E=\"Udpak filer til undermappe.\"\n0200010F=\"Føj til {0}\"\n02000110=\"Føj det valgte til arkiv.\"\n02000111=\"Pak og e-mail...\"\n02000112=\"Pak det valgte til arkiv og send via e-mail.\"\n02000113=\"Pak til {0} og e-mail\"\n02000114=\"Pak det valgte til arkiv og send via e-mail.\"\n\n02000140=\"<Mappe>\"\n02000141=\"<Arkiv>\"\n\n; Properties\n02000203=\"Sti\"\n02000204=\"Navn\"\n02000205=\"Filtypenavn\"\n02000206=\"Mappe\"\n02000207=\"Størrelse\"\n02000208=\"Nedpakket størrelse\"\n02000209=\"Egenskaber\"\n0200020A=\"Oprettet\"\n0200020B=\"Åbnet\"\n0200020C=\"Ændret\"\n0200020D=\"Solid\"\n0200020E=\"Kommentar\"\n0200020F=\"Krypteret\"\n02000210=\"Opdeling før\"\n02000211=\"Opdeling efter\"\n02000212=\"Leksikon\"\n02000213=\"CRC\"\n02000214=\"Type\"\n02000215=\"Anti\"\n02000216=\"Metode\"\n02000217=\"Vært OS\"\n02000218=\"Filsystem\"\n02000219=\"Bruger\"\n0200021A=\"Gruppe\"\n0200021B=\"Blok\"\n0200021C=\"Kommentar\"\n0200021D=\"Position\"\n0200021E=\"Sti præfiks\"\n0200021F=\"Mapper\"\n02000220=\"Filer\"\n02000221=\"Version\"\n02000222=\"Bind\"\n02000223=\"Flerbindsarkiv\"\n02000224=\"Offset\"\n02000225=\"Links\"\n02000226=\"Blokke\"\n02000227=\"Bind\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Fysisk størrelse\"\n0200022D=\"Headerstørrelse\"\n0200022E=\"Checksum\"\n0200022F=\"Karakteristika\"\n02000230=\"Virtuel adresse\"\n\n; Status bar\n02000301=\"{0} objekt(er) valg\"\n02000302=\"{0} objekt(er)\"\n\n02000320=\"Filer:\"\n02000321=\"Mapper:\"\n02000322=\"Størrelse:\"\n\n; List Context Menu\n02000401=\"&Kolonner...\"\n\n02000411=\"&Åben\"\n02000412=\"&Udpak...\"\n\n; ToolBar\n02000501=\"Udpak\"\n\n; Messages\n02000601=\"Opdater operationer er ikke understøttet for dette arkiv.\"\n02000602=\"Kan ikke opdatere arkiv {0}\"\n02000603=\"Kan ikke oprette folder '{0}'\"\n02000604=\"Filen er ikke et understøttet arkiv.\"\n02000605=\"Fejl\"\n02000606=\"For mange objekter\"\n02000607=\"Der er ingen programmer tilknyttet dette filtypenavn\"\n02000608=\"Der er ingen fejl\"\n02000609=\"Kan ikke åbne filen '{0}' som et arkiv\"\n0200060A=\"Kan ikke åbne det krypterede arkiv '{0}'. Forkert adgangskode?\"\n0200060B=\"Systemet kan ikke allokere den nødvendige mængde hukommelse\"\n0200060C=\"Ukendt fejl\"\n0200060D=\"Arkivtypen er ikke understøttet\"\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ja\"\n02000707=\"Ja til &alt\"\n02000709=\"&Nej\"\n0200070B=\"Nej til a&lt\"\n\n02000710=\"Annuller\"\n02000711=\"&Annuller\"\n02000713=\"&Luk\"\n02000714=\"Stop\"\n02000715=\"Genstart\"\n\n02000720=\"Hjælp\"\n\n; Extract dialog\n02000800=\"Udpak\"\n02000801=\"U&dpak til:\"\n02000802=\"Adgangskode\"\n\n02000810=\"Sti type\"\n02000811=\"Komplet stinavne\"\n02000812=\"Nuværende stinavne\"\n02000813=\"Ingen stinavne\"\n\n02000820=\"Erstat tilstand\"\n02000821=\"Spørg før erstatning\"\n02000822=\"Erstat uden advarsel\"\n02000823=\"Spring nuværende filer over\"\n02000824=\"Automatisk omdøbning\"\n02000825=\"Omdøb automatisk eksisterende filer\"\n\n02000830=\"Filer\"\n02000831=\"&Valgte filer\"\n02000832=\"&Alle filer\"\n\n02000881=\"Vælg en sti for de udpakkede filer.\"\n\n02000890=\"Udpakker\"\n\n; Overwrite dialog\n02000900=\"Bekræft filerstatning\"\n02000901=\"Destinationsmappen indeholder allerede behandlede filer.\"\n02000902=\"Ønsker du at udskifte den eksisterende fil\"\n02000903=\"med denne?\"\n\n02000911=\"A&utomatisk omdøbning\"\n\n02000982=\"{0} bytes\"\n02000983=\"Ændret den\"\n\n; Messages dialog\n02000A00=\"Diagnostisk besked\"\n\n02000A80=\"Besked\"\n\n02000A91=\"Ikke understøttet pakkemetode for '{0}'.\"\n02000A92=\"Datafejl i '{0}'. Filen er ødelagt.\"\n02000A93=\"CRC mislykkedes i '{0}'. Filen er ødelagt.\"\n02000A94=\"Datafejl i den krypterede fil '{0}'. Forkert adgangskode?\"\n02000A95=\"CRC mislykkedes i den krypterede fil '{0}'. Forkert adgangskode?\"\n\n; Password dialog\n02000B00=\"Indtast adgangskode\"\n02000B01=\"Indtast adgangskode:\"\n02000B02=\"&Vis adgangskode\"\n02000B03=\"Genindtast adgangskode:\"\n02000B10=\"Adgangskoderne stemmer ikke overens\"\n02000B11=\"Brug kun engelske bogstaver, numre og specialtegn (!, #, $, ...) til adgangskode\"\n02000B12=\"Adgangskoden er for lang\"\n\n; Progress dialog\n02000C00=\"Proces\"\n02000C01=\"Brugt tid:\"\n02000C02=\"Tid tilbage:\"\n02000C03=\"Størrelse:\"\n02000C04=\"Hastighed:\"\n02000C05=\"Behandlet:\"\n02000C06=\"Komprimeringsforhold:\"\n\n02000C10=\"&Baggrund\"\n02000C11=\"&Forgrund\"\n02000C12=\"&Pause\"\n02000C13=\"&Fortsæt\"\n\n02000C20=\"Pauset\"\n\n02000C30=\"Er du sikker på du vil annullere?\"\n\n; Compress dialog\n02000D00=\"Føj til arkiv\"\n02000D01=\"&Arkiv:\"\n02000D02=\"&Opdateringstilstand:\"\n02000D03=\"Arkiv&format:\"\n02000D04=\"Pakke&metode:\"\n02000D05=\"Opret &solid arkiv\"\n02000D06=\"&Parameter:\"\n02000D07=\"Funktioner\"\n02000D08=\"Opret selv&udpakkende arkiv\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Krypter fil&navne\"\n02000D0B=\"Nedpaknings&niveau:\"\n02000D0C=\"&Ordbogsstørrelse:\"\n02000D0D=\"&Ordstørrelse:\"\n02000D0E=\"Hukommelsesbrug for nedpakning:\"\n02000D0F=\"Hukommelsesbrug for udpakning:\"\n02000D10=\"Kryptering\"\n02000D11=\"Krypteringsmetode:\"\n02000D12=\"Antal CPU tråde:\"\n02000D13=\"Solid blokstørrelse:\"\n02000D14=\"Ikke-solid\"\n02000D15=\"Solid\"\n02000D16=\"Komprimer delte filer\"\n\n02000D40=\"Opdel i bind, bytes:\"\n02000D41=\"Ukorrekt bindstørrelse\"\n02000D42=\"Specificer bindstørrelse: {0} bytes.\\nEr du sikker på du ønsker at opdele arkivet i sådanne bind?\"\n\n02000D81=\"Kun gem\"\n02000D82=\"Normal\"\n02000D83=\"Bedste\"\n02000D84=\"Hurtig\"\n02000D85=\"Hurtigste\"\n02000D86=\"Ultra\"\n\n02000D90=\"Gennemse\"\n\n02000DA1=\"Tilføj og erstat filer\"\n02000DA2=\"Opdater og tilføj filer\"\n02000DA3=\"Opdater eksisterende filer\"\n02000DA4=\"Synkroniser filer\"\n\n02000DB1=\"Alle filer\"\n\n02000DC0=\"Nedpakker\"\n\n; Columns dialog\n02000E00=\"Kolonner\"\n02000E01=\"Tjek kolonnerne som du vil have synlige i denne mappe. Brug pil-op og pil-ned knapperne til at ændre kolonnerne.\"\n02000E02=\"Den valgte kolonne burde være\"\n02000E03=\"pixler &bred.\"\n\n02000E10=\"Flyt &op\"\n02000E11=\"Flyt &ned\"\n02000E12=\"&Vis\"\n02000E13=\"&Skjul\"\n02000E14=\"Sæt\"\n\n02000E81=\"Titel\"\n02000E82=\"Bredde\"\n\n; Testing\n02000F90=\"Undersøger\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&Fil\"\n03000103=\"&Rediger\"\n03000104=\"&Vis\"\n03000105=\"F&unktioner\"\n03000106=\"&Hjælp\"\n03000107=\"F&avoriter\"\n\n; File\n03000210=\"&Åben\"\n03000211=\"Åben &indeni\"\n03000212=\"Åben &udenfor\"\n03000220=\"&Vis\"\n03000221=\"&Rediger\"\n03000230=\"O&mdøb\"\n03000231=\"&Kopier til...\"\n03000232=\"&Flyt til...\"\n03000233=\"&Slet\"\n03000240=\"&Egenskaber\"\n03000241=\"Komme&ntar\"\n03000242=\"Udregn checksum\"\n03000250=\"Opret mappe\"\n03000251=\"Opret fil\"\n03000260=\"&Afslut\"\n03000270=\"&Opdel fil...\"\n03000271=\"Kom&biner filer...\"\n\n; Edit\n03000310=\"&Fortryd\"\n03000311=\"&Gendan\"\n03000320=\"&Klip\"\n03000321=\"K&opier\"\n03000322=\"Sæt &ind\"\n03000323=\"&Slet\"\n03000330=\"Vælg &alt\"\n03000331=\"Fravælg alt\"\n03000332=\"O&mvendt valg\"\n03000333=\"Vælg...\"\n03000334=\"Fravælg...\"\n03000335=\"Vælg efter type\"\n03000336=\"Fravælg efter type\"\n\n; View\n03000410=\"Sto&re ikoner\"\n03000411=\"S&må ikoner\"\n03000412=\"&Liste\"\n03000413=\"&Detaljer\"\n03000420=\"Usorteret\"\n03000430=\"Åben rodmappe\"\n03000431=\"Et niveau op\"\n03000432=\"Mappehistorik...\"\n03000440=\"&Opdater\"\n03000449=\"Flad visning\"\n03000450=\"&2 paneler\"\n03000451=\"&Værktøjslinjer\"\n03000460=\"Arkivlinje\"\n03000461=\"Standardlinje\"\n03000462=\"Store knapper\"\n03000463=\"Vis knaptekst\"\n\n; Tools\n03000510=\"&Indstillinger...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Indhold...\"\n03000620=\"&Om 7-Zip...\"\n\n; Favorites\n03000710=\"&Føj mappe til Favoritter som\"\n03000720=\"Bogmærke\"\n\n; Options Dialog\n\n03010000=\"Indstillinger\"\n\n; Plugins\n03010100=\"Tilføjelser\"\n03010101=\"&Tilføjelser:\"\n03010110=\"Indstillinger...\"\n\n; Edit\n03010200=\"Tekstbehandler\"\n03010201=\"&Tekstbehandler:\"\n\n; System\n03010300=\"System\"\n03010302=\"Associer 7-Zip med:\"\n03010310=\"Tilføjelse\"\n\n; Settings\n03010400=\"Indstillinger\"\n03010401=\"Vis \\\"..\\\" post\"\n03010402=\"Vis rigtige filikoner\"\n03010410=\"Vis systemmenu\"\n03010420=\"&Fuld række valg\"\n03010421=\"Vis &gitter\"\n03010430=\"&Alternativ markeringsmetode\"\n03010440=\"Benyt &store hukommelsessider\"\n\n; Strings\n\n03020201=\"Kopier\"\n03020202=\"Flyt\"\n03020203=\"Kopier til:\"\n03020204=\"Flyt til:\"\n03020205=\"Kopierer...\"\n03020206=\"Flytter...\"\n03020207=\"Du kan ikke flytte eller kopierer elementer for sådan en mappe.\"\n03020208=\"Opgaven er ikke understøttet.\"\n03020209=\"Vælg destinationsmappen.\"\n\n03020210=\"Godkend sletning af fil\"\n03020211=\"Godkend sletning af mappe\"\n03020212=\"Godkend sletning af flere filer\"\n03020213=\"Er du sikker på du vil slette '{0}'?\"\n03020214=\"Er du sikker på du vil slette mappen '{0}' og alt indhold?\"\n03020215=\"Er du sikker på du vil slette disse {0} elementer?\"\n03020216=\"Sletter...\"\n03020217=\"Fejl da en fil eller mappe skulle slettes\"\n03020218=\"Systemet kan ikke flytte en fil med lang filsti til Papirkurven\"\n03020220=\"Omdøber...\"\n03020221=\"Fejl da en fil eller mappe skulle omdøbes\"\n03020222=\"Bekræft filkopiering\"\n03020223=\"Er du sikker du vil kopiere filer til arkiv?\"\n\n03020230=\"Opret mappe\"\n03020231=\"Mappenavn:\"\n03020232=\"Ny mappe\"\n03020233=\"Fejl under oprettelse af mappe\"\n\n03020240=\"Opret fil\"\n03020241=\"Filnavn:\"\n03020242=\"Ny fil\"\n03020243=\"Fejl under oprettelse af fil\"\n\n03020250=\"Vælg\"\n03020251=\"Fravælg\"\n03020252=\"Masker:\"\n\n03020260=\"Mappehistorik\"\n\n03020280=\"Filen '{0}' er blevet ændret.\\nVil du opdater den i arkivet?\"\n03020281=\"Kan ikke opdatere filen\\n'{0}'\"\n03020282=\"Kan ikke starte tekstbehandler.\"\n03020283=\"Åbner...\"\n03020284=\"Filen ligner en virus (filnavnet indeholder lange mellemrum i navn).\"\n\n03020290=\"Kommentar\"\n03020291=\"&Kommentar:\"\n\n030202A0=\"System\"\n\n03020300=\"Computer\"\n03020301=\"Netværk\"\n03020302=\"Dokumenter\"\n\n03020400=\"Tilføj\"\n03020401=\"Udpak\"\n03020402=\"Test\"\n\n03020420=\"Kopier\"\n03020421=\"Flyt\"\n03020422=\"Slet\"\n03020423=\"Info\"\n\n03020500=\"Opdel fil\"\n03020501=\"&Opdel til:\"\n03020510=\"Opdeler...\"\n03020520=\"Godkend opdeling\"\n03020521=\"Er du sikker på du vil opdele filen i {0} bind?\"\n03020522=\"Bind-størrelsen skal være mindre end størrelsen på den oprindelige fil\"\n\n03020600=\"Kombiner filer\"\n03020601=\"&Kombiner til:\"\n03020610=\"Kombinerer...\"\n03020620=\"Vælg kun første fil\"\n03020621=\"Kan ikke genkende fil, som en del af opdelt fil\"\n03020622=\"Kan ikke finde mere end én del af opdelt fil\"\n03020710=\"Beregner checksum..\"\n03020720=\"Checksum information\"\n03020721=\"CRC checksum for data:\"\n03020722=\"CRC checksum for data og navne:\"\n\n03020800=\"Skanner...\"\n03020900=\"Egenskaber\"\n03020A01=\"Handlingen kan ikke kaldes fra en mappe der har en lang sti.\"\n03020A02=\"Du skal vælge en fil\"\n03020A03=\"Du skal vælge en eller flere filer\"\n03020A04=\"Fil {0} findes allerede\"\n; Computer\n03031100=\"Total størrelse\"\n03031101=\"Fri plads\"\n03031102=\"Clusterstørrelse\"\n03031103=\"Etiket\"\n\n; Network\n03031200=\"Lokalt navn\"\n03031201=\"Udbyder\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Hukommelsesbrug:\"\n03080002=\"Nedpakning\"\n03080003=\"Udpakning\"\n03080004=\"Hastighed\"\n03080005=\"Bedømmelse\"\n03080006=\"Total bedømmelse\"\n03080007=\"Nuværende\"\n03080008=\"Resultat\"\n03080009=\"Forsøg:\"\n0308000A=\"Fejl:\"\n0308000B=\"CPU forbrug\"\n0308000C=\"Bedømmelse / Forbrug\"\n\n;!@LangEnd@!\n\n \t  \t \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/de.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 2.30 Beta 22\n; Translated by Soeren Finster\n; 7-Zip 4.07 beta\n; Updated by JAK-Software.DE\n; 7-Zip 4.55 beta\n; Maintained by Joachim Henke (since 4.12 beta)\n\n00000000=\"German\"\n00000001=\"Deutsch\"\n00000002=\"7\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Einstellungen\"\n\n; Info Page\n01000100=\"Info über 7-Zip\"\n01000103=\"7-Zip ist freie Software. Sie können jedoch das Projekt durch eine Registrierung unterstützen.\"\n01000104=\"techn. Unterstützung\"\n01000105=\"Registrieren\"\n\n; Folders Page\n01000200=\"Ordner\"\n01000210=\"&Arbeitsverzeichnis\"\n01000211=\"&TEMP-Ordner des Systems\"\n01000212=\"Aktueller &Ordner\"\n01000213=\"&Benutzerdefiniert:\"\n01000214=\"Nur bei &Wechselmedien benutzen\"\n\n01000281=\"Wählen Sie einen Ordner für temporäre Archivdateien:\"\n\n; System Page\n01000300=\"System\"\n01000301=\"7-Zip in Kontextmenü integrieren\"\n01000302=\"Kontextmenü kaskadieren\"\n01000310=\"Einträge im Kontextmenü:\"\n\n; Language Page\n01000400=\"Sprache\"\n01000401=\"Sprache:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip Befehle\"\n02000103=\"Öffnen\"\n02000104=\"Ausgewähltes Archiv öffnen\"\n02000105=\"Dateien entpacken...\"\n02000106=\"Dateien aus dem gewählten Archiv entpacken\"\n02000107=\"Zu einem Archiv hinzufügen...\"\n02000108=\"Fügt die markierten Objekte einem Archiv hinzu.\"\n02000109=\"Archiv überprüfen\"\n0200010A=\"Prüft die Integrität des ausgewählten Archivs.\"\n0200010B=\"Hier entpacken\"\n0200010C=\"Entpackt das gewählte Archiv in den aktuellen Ordner.\"\n0200010D=\"Entpacken nach {0}\"\n0200010E=\"Entpackt Dateien in ein Unterverzeichnis.\"\n0200010F=\"Hinzufügen zu {0}\"\n02000110=\"Fügt die markierten Objekte dem Archiv hinzu.\"\n02000111=\"Archivieren und versenden...\"\n02000112=\"Packt die markierten Objekte und verschickt das Archiv per E-Mail.\"\n02000113=\"Archivieren in {0} und versenden\"\n02000114=\"Packt die markierten Objekte und verschickt das Archiv per E-Mail.\"\n\n02000140=\"<Verzeichnis>\"\n02000141=\"<Archiv>\"\n\n; Properties\n02000203=\"Pfad\"\n02000204=\"Name\"\n02000205=\"Erweiterung\"\n02000206=\"Ordner\"\n02000207=\"Größe\"\n02000208=\"Gepackte Größe\"\n02000209=\"Attribute\"\n0200020A=\"Erstellt am\"\n0200020B=\"Letzter Zugriff\"\n0200020C=\"Geändert am\"\n0200020D=\"Kompakt (solid)\"\n0200020E=\"Kommentiert\"\n0200020F=\"Verschlüsselt\"\n02000210=\"Vorher geteilt\"\n02000211=\"Danach geteilt\"\n02000212=\"Wörterbuch\"\n02000213=\"CRC\"\n02000214=\"Typ\"\n02000215=\"Anti\"\n02000216=\"Verfahren\"\n02000217=\"Herkunft\"\n02000218=\"Dateisystem\"\n02000219=\"Besitzer\"\n0200021A=\"Gruppe\"\n0200021B=\"Block\"\n0200021C=\"Kommentar\"\n0200021D=\"Position\"\n0200021E=\"Pfad\"\n0200021F=\"Ordner\"\n02000220=\"Dateien\"\n02000221=\"Version\"\n02000222=\"Teilarchiv\"\n02000223=\"Mehrteiliges Archiv\"\n02000224=\"Offset\"\n02000225=\"Verknüpfungen\"\n02000226=\"Blöcke\"\n02000227=\"Teilarchive\"\n\n; Status bar\n02000301=\"{0} Objekt(e) markiert\"\n02000302=\"{0} Objekt(e)\"\n\n02000320=\"Dateien:\"\n02000321=\"Ordner:\"\n02000322=\"Größe:\"\n02000323=\"Komprimierte Größe:\"\n02000324=\"Archive:\"\n\n; List Context Menu\n02000401=\"&Spalten...\"\n\n02000411=\"Ö&ffnen\"\n02000412=\"&Entpacken...\"\n\n; ToolBar\n02000501=\"Entpacken\"\n\n; Messages\n02000601=\"Aktualisierungen werden für dieses Archiv nicht unterstützt.\"\n02000602=\"Kann das Archiv \\\"{0}\\\" nicht aktualisieren.\"\n02000603=\"Kann den Ordner \\\"{0}\\\" nicht erstellen.\"\n02000604=\"Diese Datei ist kein unterstütztes Archiv.\"\n02000605=\"Fehler\"\n02000606=\"Zu viele Objekte\"\n02000607=\"Mit dieser Erweiterung ist kein Programm verknüpft.\"\n02000608=\"Es sind keine Fehler aufgetreten.\"\n02000609=\"Die Datei \\\"{0}\\\" kann nicht als Archiv geöffnet werden.\"\n0200060A=\"Das verschlüsselte Archiv \\\"{0}\\\" kann nicht geöffnet werden. Falsches Passwort?\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ja\"\n02000707=\"Ja für &alle\"\n02000709=\"&Nein\"\n0200070B=\"Nein für a&lle\"\n\n02000710=\"Abbrechen\"\n02000711=\"&Abbrechen\"\n02000713=\"&Schließen\"\n02000714=\"Stopp\"\n02000715=\"Neustart\"\n\n02000720=\"Hilfe\"\n\n; Extract dialog\n02000800=\"Entpacken\"\n02000801=\"&Entpacken nach:\"\n02000802=\"Passwort\"\n\n02000810=\"Verzeichnisstruktur wiederherstellen\"\n02000811=\"Komplette Pfadangaben\"\n02000812=\"Relative Pfadangaben\"\n02000813=\"Keine Pfadangaben\"\n\n02000820=\"Dateien überschreiben\"\n02000821=\"Nur mit Bestätigung\"\n02000822=\"Ohne Bestätigung\"\n02000823=\"Vorhandene Dateien überspringen\"\n02000824=\"Automatisch umbenennen\"\n02000825=\"Vorhandene Dateien umbenennen\"\n\n02000830=\"Dateien\"\n02000831=\"&Markierte Dateien\"\n02000832=\"&Alle Dateien\"\n\n02000881=\"Wählen Sie einen Ordner für die entpackten Dateien:\"\n\n02000890=\"Entpacken\"\n\n; Overwrite dialog\n02000900=\"Überschreiben bestätigen\"\n02000901=\"Der Zielordner beinhaltet bereits eine Datei diesen Namens.\"\n02000902=\"Wollen Sie diese Datei\"\n02000903=\"durch diese ersetzen?\"\n\n02000911=\"A&utomatisch umbenennen\"\n\n02000982=\"{0} Bytes\"\n02000983=\"geändert am\"\n\n; Messages dialog\n02000A00=\"Diagnosemeldungen\"\n\n02000A80=\"Meldung\"\n\n02000A91=\"Das Kompressionsverfahren in \\\"{0}\\\" wird nicht unterstützt.\"\n02000A92=\"Datenfehler in \\\"{0}\\\". Die Datei ist beschädigt.\"\n02000A93=\"CRC-Prüfsummenfehler. Die Datei \\\"{0}\\\" ist beschädigt.\"\n02000A94=\"Datenfehler in der verschlüsselten Datei \\\"{0}\\\". Falsches Passwort?\"\n02000A95=\"CRC-Prüfsummenfehler bei verschlüsselter Datei \\\"{0}\\\". Falsches Passwort?\"\n\n; Password dialog\n02000B00=\"Kennworteingabe\"\n02000B01=\"Passwort eingeben:\"\n02000B02=\"Passwort an&zeigen\"\n02000B03=\"Passwort bestätigen:\"\n02000B10=\"Die Passwörter stimmen nicht überein.\"\n02000B11=\"Bitte nur Buchstaben des englischen Alphabets, Ziffern und Sonderzeichen (!, #, $, ...) im Passwort verwenden!\"\n02000B12=\"Das Passwort ist zu lang.\"\n\n; Progress dialog\n02000C00=\"Fortschritt\"\n02000C01=\"Verstrichene Zeit:\"\n02000C02=\"Verbleibende Zeit:\"\n02000C03=\"Gesamtdatenmenge:\"\n02000C04=\"Geschwindigkeit:\"\n02000C05=\"Verarbeitet:\"\n02000C06=\"Kompressionsrate:\"\n\n02000C10=\"&Hintergrund\"\n02000C11=\"&Vordergrund\"\n02000C12=\"&Pause\"\n02000C13=\"&Fortsetzen\"\n\n02000C20=\"Pause\"\n\n02000C30=\"Möchten Sie wirklich abbrechen?\"\n\n; Compress dialog\n02000D00=\"Zu Archiv hinzufügen\"\n02000D01=\"&Archiv:\"\n02000D02=\"Art der Akt&ualisierung:\"\n02000D03=\"Archiv&format:\"\n02000D04=\"Kompressions&verfahren:\"\n02000D05=\"Kompaktes Archiv erstellen (solid)\"\n02000D06=\"&Parameter:\"\n02000D07=\"Optionen\"\n02000D08=\"Selbstentpackendes Archiv (SF&X) erstellen\"\n02000D09=\"Multithreading\"\n02000D0A=\"Datei&namen verschlüsseln\"\n02000D0B=\"&Kompressionsstärke:\"\n02000D0C=\"Wörter&buchgröße:\"\n02000D0D=\"&Wortgröße:\"\n02000D0E=\"Speicherbedarf beim Komprimieren:\"\n02000D0F=\"Speicherbedarf beim Entpacken:\"\n02000D10=\"Verschlüsselung\"\n02000D11=\"Verfahren:\"\n02000D12=\"Anzahl &CPU-Threads:\"\n02000D13=\"Größe &solider Blöcke:\"\n02000D14=\"Nicht solide\"\n02000D15=\"Solide\"\n02000D16=\"Zum Schreiben &geöffnete Dateien einbeziehen\"\n\n02000D40=\"In &Teildateien aufsplitten (Bytes):\"\n02000D41=\"Ungültiger Wert für Dateigrößen\"\n02000D42=\"Angegebene Größe für Teildateien: {0} Bytes.\\nSind Sie sicher, dass das Archiv dementsprechend aufgesplittet werden soll?\"\n\n02000D81=\"Speichern\"\n02000D82=\"Normal\"\n02000D83=\"Maximum\"\n02000D84=\"Schnell\"\n02000D85=\"Schnellste\"\n02000D86=\"Ultra\"\n\n02000D90=\"Durchsuchen\"\n\n02000DA1=\"Hinzufügen und Ersetzen\"\n02000DA2=\"Aktualisieren und Hinzufügen\"\n02000DA3=\"Vorhandene Dateien aktualisieren\"\n02000DA4=\"Synchronisieren\"\n\n02000DB1=\"Alle Dateien\"\n\n02000DC0=\"Komprimiere\"\n\n; Columns dialog\n02000E00=\"Spalten\"\n02000E01=\"Markieren Sie die Spalten, die Sie in dieser Ansicht sehen wollen. Benutzen Sie die Aufwärts- und Abwärts-Schaltflächen, um die Spalten wie gewünscht anzuordnen.\"\n02000E02=\"Die markierte Spalte soll\"\n02000E03=\"Pixel &breit sein.\"\n\n02000E10=\"&Aufwärts\"\n02000E11=\"Ab&wärts\"\n02000E12=\"&Zeigen\"\n02000E13=\"&Verstecken\"\n02000E14=\"Speichern\"\n\n02000E81=\"Titel\"\n02000E82=\"Breite\"\n\n; Testing\n02000F90=\"Überprüfen\"\n\n\n; File Manager\n\n03000000=\"7-Zip Dateimanager\"\n\n; Menu\n03000102=\"&Datei\"\n03000103=\"&Bearbeiten\"\n03000104=\"&Ansicht\"\n03000105=\"&Extras\"\n03000106=\"&?\"\n03000107=\"&Favoriten\"\n\n; File\n03000210=\"Ö&ffnen\"\n03000211=\"I&ntern öffnen\"\n03000212=\"E&xtern öffnen\"\n03000220=\"&Ansehen\"\n03000221=\"&Bearbeiten\"\n03000230=\"&Umbenennen\"\n03000231=\"&Kopieren nach...\"\n03000232=\"&Verschieben nach...\"\n03000233=\"&Löschen\"\n03000240=\"E&igenschaften\"\n03000241=\"K&ommentieren\"\n03000242=\"Prüfsumme berechnen\"\n03000250=\"Ordner erstellen\"\n03000251=\"Datei erstellen\"\n03000260=\"Be&enden\"\n03000270=\"Datei auf&splitten...\"\n03000271=\"Dateien &zusammenfügen...\"\n\n; Edit\n03000310=\"&Rückgängig\"\n03000311=\"&Wiederherstellen\"\n03000320=\"&Ausschneiden\"\n03000321=\"&Kopieren\"\n03000322=\"&Einfügen\"\n03000323=\"&Löschen\"\n03000330=\"Alles &markieren\"\n03000331=\"Alles abwählen\"\n03000332=\"Markierung &umkehren\"\n03000333=\"Auswählen...\"\n03000334=\"Auswahl aufheben...\"\n03000335=\"Nach Typ auswählen\"\n03000336=\"Nach Typ abwählen\"\n\n; View\n03000410=\"&Große Symbole\"\n03000411=\"&Kleine Symbole\"\n03000412=\"&Liste\"\n03000413=\"&Details\"\n03000420=\"Unsortiert\"\n03000430=\"Wurzelverzeichnis\"\n03000431=\"Übergeordneter Ordner\"\n03000432=\"Ordnerverlauf...\"\n03000440=\"&Aktualisieren\"\n03000449=\"Alles in einer &Ebene\"\n03000450=\"&Zweigeteiltes Fenster\"\n03000451=\"&Symbolleisten\"\n03000460=\"Archivfunktionen\"\n03000461=\"Standardfunktionen\"\n03000462=\"Große Schaltflächen\"\n03000463=\"Schaltflächenbeschriftung\"\n\n; Tools\n03000510=\"&Optionen...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Hilfethemen\"\n03000620=\"Ü&ber 7-Zip...\"\n\n; Favorites\n03000710=\"&Ordner hinzufügen als\"\n03000720=\"Favorit\"\n\n; Options Dialog\n\n03010000=\"Optionen\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Optionen...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"System\"\n03010302=\"7-Zip verknüpfen mit:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Einstellungen\"\n03010401=\"&Verzeichniseintrag \\\"..\\\" anzeigen\"\n03010402=\"Symbole aus &Dateien laden und anzeigen\"\n03010410=\"System-Kontext&menü im Dateimenü anzeigen\"\n03010420=\"Dateiauswahl markiert ganze &Zeile\"\n03010421=\"&Gitternetzlinien anzeigen\"\n03010430=\"&Alternativer Dateiauswahl-Modus\"\n03010440=\"Große &Speicherseiten verwenden\"\n\n; Strings\n\n03020201=\"Kopieren\"\n03020202=\"Verschieben\"\n03020203=\"Kopieren nach:\"\n03020204=\"Verschieben nach:\"\n03020205=\"Kopiere...\"\n03020206=\"Verschiebe...\"\n03020207=\"Verschieben und Kopieren ist für diesen Ordner nicht möglich.\"\n03020208=\"Die Operation wird nicht unterstützt.\"\n03020209=\"Zielordner auswählen\"\n\n03020210=\"Löschen von Datei bestätigen\"\n03020211=\"Löschen von Ordner bestätigen\"\n03020212=\"Löschen von mehreren Dateien bestätigen\"\n03020213=\"Soll \\\"{0}\\\" wirklich gelöscht werden?\"\n03020214=\"Soll der Ordner \\\"{0}\\\" und sein gesamter Inhalt wirklich gelöscht werden?\"\n03020215=\"Sollen diese {0} Objekte wirklich gelöscht werden?\"\n03020216=\"Lösche...\"\n03020217=\"Fehler beim Löschen von Datei oder Ordner\"\n\n03020220=\"Umbenennen...\"\n03020221=\"Fehler beim Umbenennen von Datei oder Ordner\"\n03020222=\"Kopieren bestätigen\"\n03020223=\"Sollen die Dateien wirklich in dieses Archiv kopiert werden:\"\n\n03020230=\"Ordner erstellen\"\n03020231=\"Ordnername:\"\n03020232=\"Neuer Ordner\"\n03020233=\"Fehler beim Erstellen des Ordners\"\n\n03020240=\"Datei erstellen\"\n03020241=\"Dateiname:\"\n03020242=\"Neue Datei\"\n03020243=\"Fehler beim Erstellen der Datei\"\n\n03020250=\"Auswählen\"\n03020251=\"Auswahl aufheben\"\n03020252=\"Filter:\"\n\n03020260=\"Ordnerverlauf\"\n\n03020280=\"Die Datei \\\"{0}\\\" wurde geändert.\\nSoll sie im Archiv aktualisiert werden?\"\n03020281=\"Die Datei konnte nicht aktualisiert werden.\\n\\\"{0}\\\"\"\n03020282=\"Kann Editor nicht starten\"\n03020283=\"Öffne...\"\n\n03020290=\"Kommentar\"\n03020291=\"&Kommentar:\"\n\n030202A0=\"System\"\n\n03020300=\"Arbeitsplatz\"\n03020301=\"Netzwerk\"\n\n03020400=\"Hinzufügen\"\n03020401=\"Entpacken\"\n03020402=\"Überprüfen\"\n\n03020420=\"Kopieren\"\n03020421=\"Verschieben\"\n03020422=\"Löschen\"\n03020423=\"Eigenschaften\"\n\n03020500=\"Datei aufsplitten\"\n03020501=\"Teildateien &nach:\"\n03020510=\"Aufsplitten...\"\n03020520=\"Aufsplitten bestätigen\"\n03020521=\"Sind Sie sicher, die Datei in {0} Teildateien aufsplitten zu wollen?\"\n03020522=\"Die Größe der Teildateien muss kleiner sein als die der ursprünglichen Datei.\"\n\n03020600=\"Dateien zusammenfügen\"\n03020601=\"Zieldatei &nach:\"\n03020610=\"Zusammenfügen...\"\n03020620=\"Bitte nur die erste Datei auswählen.\"\n\n03020710=\"Berechne Prüfsumme...\"\n03020720=\"Prüfsummen-Information\"\n03020721=\"CRC-Prüfsumme über die Daten:\"\n03020722=\"Prüfsumme über Daten und Namen:\"\n\n03020800=\"Durchsuche...\"\n\n03020900=\"Eigenschaften\"\n\n; Computer\n03031100=\"Gesamtgröße\"\n03031101=\"Freier Speicherplatz\"\n03031102=\"Clustergröße\"\n03031103=\"Name\"\n\n; Network\n03031200=\"Lokaler Name\"\n03031201=\"Provider\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Speichernutzung:\"\n03080002=\"Komprimierung\"\n03080003=\"Dekomprimierung\"\n03080004=\"Geschwindigkeit\"\n03080005=\"Bewertung\"\n03080006=\"Gesamtwertung\"\n03080007=\"Aktuell\"\n03080008=\"Ergebnis\"\n03080009=\"Durchläufe:\"\n0308000A=\"Fehler:\"\n0308000B=\"CPU-Nutzung\"\n0308000C=\"Bewert./Nutzung\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/el.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by Vasilis Kosmidis\n;\n \n00000000=\"Greek\"\n00000001=\"Ελληνικά\"\n00000002=\"8\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Ρυθμίσεις 7-Zip\"\n\n; Info Page\n01000100=\"Πληροφορίες για το 7-Zip\"\n01000103=\"Το 7-Zip είναι ελεύθερο λογισμικό. Ωστόσο μπορείτε να υποστηρίξετε την περαιτέρω ανάπτυξη του με την εγγραφή σας.\"\n01000104=\"Υποστήριξη\"\n01000105=\"Εγγραφή\"\n\n; Folders Page\n01000200=\"Φάκελοι\"\n01000210=\"&Φάκελος εργασίας\"\n01000211=\"&Προσωρινός φάκελος συστήματος\"\n01000212=\"&Τρέχων φάκελος\"\n01000213=\"&Καθορισμένος:\"\n01000214=\"Χρήση μόνο για αφαιρούμενες μονάδες δίσκου\"\n01000281=\"Καθορίστε μια τοποθεσία για τα προσωρινά αρχεία συμπίεσης.\"\n\n; System Page\n01000300=\"Σύστημα\"\n01000301=\"Ενσωμάτωση του 7-Zip στο λειτουργικό\"\n01000302=\"Με ομαδοποίηση των επιλογών\"\n01000310=\"Στοιχεία του πίνακα επιλογών:\"\n\n; Language Page\n01000400=\"Γλώσσα\"\n01000401=\"Γλώσσα:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Εντολές 7-Zip\"\n02000103=\"Άνοιγμα\"\n02000104=\"Άνοιγμα επιλεγμένου αρχείου συμπίεσης.\"\n02000105=\"Αποσυμπίεση αρχείων...\"\n02000106=\"Αποσυμπίεση επιλεγμένου αρχείου συμπίεσης\"\n02000107=\"Προσθήκη σε αρχείο συμπίεσης...\"\n02000108=\"Προσθήκη επιλεγμένων στοιχείων σε αρχείο συμπίεσης\"\n02000109=\"Έλεγχος αρχείου συμπίεσης\"\n0200010A=\"Έλεγχος εγκυρότητας επιλεγμένου αρχείου συμπίεσης\"\n0200010B=\"Αποσυμπίεση εδώ\"\n0200010C=\"Αποσυμπίεση αρχείων στον τρέχοντα φάκελο\"\n0200010D=\"Αποσυμπίεση στο φάκελο {0}\"\n0200010E=\"Αποσυμπίεση αρχείων σε υποφάκελο.\"\n0200010F=\"Προσθήκη στο {0}\"\n02000110=\"Προσθήκη επιλεγμένων στοιχείων σε αρχείο συμπίεσης.\"\n02000111=\"Συμπίεση και αποστολή με e-mail...\"\n02000112=\"Συμπίεση επιλεγμένων στοιχείων και αποστολή με e-mail.\"\n02000113=\"Συμπίεση στο {0} και αποστολή με e-mail\"\n02000114=\"Συμπίεση επιλεγμένων στοιχείων και αποστολή με e-mail.\"\n02000140=\"<Φάκελος>\"\n02000141=\"<Αρχείο Συμπίεσης>\"\n\n; Properties\n02000203=\"Θέση\"\n02000204=\"Όνομα\"\n02000205=\"Τύπος\"\n02000206=\"Φάκελος\"\n02000207=\"Μέγεθος\"\n02000208=\"Συμπιεσμένο μέγεθος\"\n02000209=\"Ιδιότητες\"\n0200020A=\"Δημιουργήθηκε\"\n0200020B=\"Προσπελάστηκε\"\n0200020C=\"Τροποποιήθηκε\"\n0200020D=\"Συμπαγές\"\n0200020E=\"Σχόλιο\"\n0200020F=\"Κωδικοποιημένο\"\n02000210=\"Διάσπαση πριν\"\n02000211=\"Διάσπαση μετά\"\n02000212=\"Λεξικό\"\n02000213=\"CRC\"\n02000214=\"Τύπος\"\n02000215=\"Αντί\"\n02000216=\"Μέθοδος\"\n02000217=\"Λειτουργικό\"\n02000218=\"Σύστημα αρχείων\"\n02000219=\"Χρήστης\"\n0200021A=\"Ομάδα\"\n0200021B=\"Μπλοκ\"\n0200021C=\"Σχόλιο\"\n0200021D=\"Θέση\"\n0200021E=\"Προκαθορισμένη διαδρομή\"\n0200021F=\"Φάκελοι\"\n02000220=\"Αρχεία\"\n02000221=\"Έκδοση\"\n02000222=\"Τόμος\"\n02000223=\"Πολυτόμος\"\n02000224=\"Offset\"\n02000225=\"Σύνδεσμοι\"\n02000226=\"Μπλοκ\"\n02000227=\"Τόμοι\"\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Φυσικό μέγεθος\"\n0200022D=\"Μέγεθος headers\"\n0200022E=\"Άθροισμα ελέγχου\"\n0200022F=\"Χαρακτηριστικά\"\n02000230=\"Εικονική διεύθυνση\"\n\n; Status bar\n02000301=\"{0} επιλεγμένα στοιχεία\"\n02000302=\"{0} στοιχεία\"\n02000320=\"Αρχεία:\"\n02000321=\"Φάκελοι:\"\n02000322=\"Μέγεθος:\"\n02000323=\"Συμπιεσμένο μέγεθος:\"\n02000324=\"Αρχεία συμπίεσης:\"\n\n; List Context Menu\n02000401=\"&Στήλες...\"\n02000411=\"Άν&οιγμα\"\n02000412=\"&Αποσυμπίεση...\"\n\n; ToolBar\n02000501=\"Αποσυμπίεση\"\n\n; Messages\n02000601=\"Οι λειτουργίες ενημέρωσης δεν είναι διαθέσιμες για αυτόν τον τύπο συμπιεσμένου αρχείου.\"\n02000602=\"Αδυνατή η ενημέρωση του αρχείου συμπίεσης {0}\"\n02000603=\"Αδύνατη η δημιουργία του φακέλου '{0}'\"\n02000604=\"Η μέθοδος συμπίεσης του αρχείου δεν υποστηρίζεται.\"\n02000605=\"Σφάλμα\"\n02000606=\"Πάρα πολλά στοιχεία\"\n02000607=\"Δεν υπάρχει εφαρμογή που να σχετίζεται με τον τύπο του αρχείου.\"\n02000608=\"Δεν υπάρχουν σφάλματα\"\n02000609=\"Δεν μπορεί να ανοιχθεί το αρχείο '{0}' σαν αρχείο συμπίεσης\"\n0200060A=\"Δεν μπορεί να ανοιχθεί το κρυπτογραφημένο αρχείο '{0}'. Λάθος κωδικός;\"\n0200060B=\"Το σύστημα δεν μπορεί να διαθέσει την απαιτούμενη ποσότητα μνήμης.\"\n0200060C=\"Άγνωστο σφάλμα\"\n0200060D=\"Μη υποστηριζόμενο αρχείο συμπίεσης.\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ναι\"\n02000707=\"Ναι σε &όλα\"\n02000709=\"Ό&χι\"\n0200070B=\"Όχι σε ό&λα\"\n02000710=\"Άκυρο\"\n02000711=\"&Άκυρο\"\n02000713=\"&Κλείσιμο\"\n02000714=\"&Διακοπή\"\n02000715=\"Επανεκκίνηση\"\n02000720=\"Βοήθεια\"\n\n; Extract dialog\n02000800=\"Αποσυμπίεση\"\n02000801=\"&Αποσυμπίεση στο φάκελο:\"\n02000802=\"Κωδικός πρόσβασης\"\n02000810=\"Επιλογές διαδρομών φακέλων \"\n02000811=\"Πλήρεις διαδρομές φακέλων\"\n02000812=\"Τρέχουσες διαδρομές φακέλων \"\n02000813=\"Χωρίς διαδρομές φακέλων\"\n02000820=\"Επιλογές αντικατάστασης αρχείων\"\n02000821=\"Αντικατάσταση με ερώτηση\"\n02000822=\"Αντικατάσταση χωρίς ερώτηση\"\n02000823=\"Παράβλεψη των υπαρχόντων αρχείων\"\n02000824=\"Αυτόματη μετονομασία\"\n02000825=\"Αυτόματη μετονομασία των υπαρχόντων αρχείων\"\n02000830=\"Αρχεία\"\n02000831=\"&Επιλεγμένα αρχεία\"\n02000832=\"&Όλα τα αρχεία\"\n02000881=\"Καθορίστε τον φάκελο αποσυμπίεσης.\"\n02000890=\"Αποσυμπίεση\"\n\n; Overwrite dialog\n02000900=\"Επιβεβαίωση αντικατάστασης του αρχείου\"\n02000901=\"Ο φάκελος προορισμού περιέχει ήδη ένα αρχείο με το ίδιο όνομα.\"\n02000902=\"Θέλετε να αντικαταστήσετε το υπάρχον αρχείο\"\n02000903=\"με αυτό;\"\n02000911=\"Αυτόματη &μετονομασία\"\n02000982=\"{0} bytes\"\n02000983=\"τροποποιήθηκε\"\n\n; Messages dialog\n02000A00=\"Διαγνωστικά μηνύματα\"\n02000A80=\"Μήνυμα\"\n02000A91=\"Μη υποστηριζόμενη μέθοδος συμπίεσης για το '{0}'.\"\n02000A92=\"Λάθος δεδομένων στο {0}. Το αρχείο είναι φθαρμένο.\"\n02000A93=\"Ο έλεγχος CRC απέτυχε στο '{0}'. Το αρχείο είναι φθαρμένο.\"\n02000A94=\"Λάθος δεδομένων στο κρυπτογραφημένο αρχείο '{0}'. Λάθος κωδικός;\"\n02000A95=\"Ο έλεγχος CRC απέτυχε στο κρυπτογραφημένο αρχείο '{0}'. Λάθος κωδικός;\"\n\n; Password dialog\n02000B00=\"Εισαγωγή κωδικού πρόσβασης\"\n02000B01=\"Κωδικός πρόσβασης:\"\n02000B02=\"&Εμφάνιση κωδικού\"\n02000B03=\"Επανεισάγετε τον κωδικό πρόσβασης:\"\n02000B10=\"Οι κωδικοί δεν ταιριάζουν.\"\n02000B11=\"Χρησιμοποιήστε μόνο Αγγλικά γράμματα, αριθμούς και ειδικούς χαρακτήρες (!, #, ...) για κωδικό.\"\n02000B12=\"Ο κωδικός είναι πολύ μεγάλος.\"\n\n; Progress dialog\n02000C00=\"Διεργασία\"\n02000C01=\"Διανύθηκε:\"\n02000C02=\"Απομένει:\"\n02000C03=\"Μέγεθος:\"\n02000C04=\"Ταχύτητα:\"\n02000C05=\"Επεξεργάσθηκαν:\"\n02000C06=\"Αναλογία συμπίεσης\"\n02000C10=\"Στο &παρασκήνιο\"\n02000C11=\"Στο &προσκήνιο\"\n02000C12=\"&Διακοπή\"\n02000C13=\"&Συνέχεια\"\n02000C20=\"Διακόπηκε\"\n02000C30=\"Είστε σίγουροι ότι θέλετε να ακυρώσετε;\"\n\n; Compress dialog\n02000D00=\"Προσθήκη σε συμπιεσμένο αρχείο\"\n02000D01=\"&Όνομα αρχείου συμπίεσης:\"\n02000D02=\"&Τρόπος ενημέρωσης:\"\n02000D03=\"Συμπίεση στη μορ&φή:\"\n02000D04=\"&Μέθοδος συμπίεσης:\"\n02000D05=\"Δημιουργία &συμπαγούς αρχείου\"\n02000D06=\"&Παράμετροι:\"\n02000D07=\"Επιλογές συμπίεσης\"\n02000D08=\"Με αυτόματη αποσυμπίεση (SF&X)\"\n02000D09=\"Πολύ-νηματική επεξεργασία\"\n02000D0A=\"Κρυπτογράφηση των &ονομάτων\"\n02000D0B=\"Επίπεδο συμπίεσης:\"\n02000D0C=\"Μέγεθος &λεξικού:\"\n02000D0D=\"Μέγεθος &λέξης:\"\n02000D0E=\"Χρήση μνήμης για συμπίεση:\"\n02000D0F=\"Χρήση μνήμης για αποσυμπίεση:\"\n02000D10=\"Κρυπτογράφηση\"\n02000D11=\"Μέθοδος κρυπτογράφησης\"\n02000D12=\"Αριθμός νημάτων CPU\"\n02000D13=\"Μέγεθος συμπαγούς μπλοκ:\"\n02000D14=\"Μη-συμπαγές\"\n02000D15=\"Συμπαγές\"\n02000D16=\"Συμπίεση κοινών αρχείων\"\n02000D40=\"Διαίρεση σε τόμους:\"\n02000D41=\"Λάθος μέγεθος τόμου\"\n02000D42=\"Καθορισμένο μέγεθος τόμου: {0} bytes.\\nΕίστε σίγουρος ότι θέλετε να χωρίσετε το αρχείο σε τέτοιους τόμους;\"\n02000D81=\"Αποθήκευση\"\n02000D82=\"Κανονική\"\n02000D83=\"Μέγιστη\"\n02000D84=\"Γρήγορη\"\n02000D85=\"Πολύ γρήγορη\"\n02000D86=\"Υπερσυμπίεση\"\n02000D90=\"Αναζήτηση\"\n02000DA1=\"Προσθήκη και αντικατάσταση αρχείων\"\n02000DA2=\"Προσθήκη και ενημέρωση αρχείων\"\n02000DA3=\"Ενημέρωση των υπαρχόντων αρχείων\"\n02000DA4=\"Συγχρονισμός αρχείων\"\n02000DB1=\"Όλα τα αρχεία\"\n02000DC0=\"Συμπίεση\"\n\n; Columns dialog\n02000E00=\"Στήλες\"\n02000E01=\"Επιλέξτε τις στήλες που θέλετε να φαίνονται σε αυτό το φάκελο. Χρησιμοποιήστε τα πλήκτρα 'πάνω' και 'κάτω' για να επαναδιατάξετε τις στήλες.\"\n02000E02=\"Η επιλεγμένη στήλη πρέπει να έχει\"\n02000E03=\"pixels &πλάτος.\"\n02000E10=\"Μετακίνηση &πάνω\"\n02000E11=\"Μετακίνηση &κάτω\"\n02000E12=\"&Εμφάνιση\"\n02000E13=\"&Απόκρυψη\"\n02000E14=\"Ενεργοποίηση\"\n02000E81=\"Τίτλος\"\n02000E82=\"Πλάτος\"\n\n; Testing\n02000F90=\"Έλεγχος\"\n\n\n; File Manager\n03000000=\"Διαχειριστής αρχείων 7-Zip\"\n\n; Menu\n03000102=\"&Αρχείο\"\n03000103=\"&Επεξεργασία\"\n03000104=\"Π&ροβολή\"\n03000105=\"Εργα&λεία\"\n03000106=\"&Βοήθεια\"\n03000107=\"Αγα&πημένα\"\n\n; File\n03000210=\"Άν&οιγμα\"\n03000211=\"Άνοιγμα στο &ίδιο παράθυρο\"\n03000212=\"Άνοιγμα σε &νέο παράθυρο\"\n03000220=\"Π&ροβολή\"\n03000221=\"Επε&ξεργασία\"\n03000230=\"Με&τονομασία\"\n03000231=\"Αντι&γραφή...\"\n03000232=\"Μετα&κίνηση...\"\n03000233=\"Διαγρα&φή\"\n03000240=\"&Ιδιότητες\"\n03000241=\"Σχόλιο\"\n03000242=\"Υπολογισμός αθροίσματος ελέγχου\"\n03000250=\"Δημιουργία φακέλου\"\n03000251=\"Δημιουργία αρχείου\"\n03000260=\"Έ&ξοδος\"\n03000270=\"&Διαχωρισμός αρχείου...\"\n03000271=\"&Συνένωση αρχείων...\"\n\n; Edit\n03000310=\"Αναίρεσ&η\"\n03000311=\"Επανάλη&ψη\"\n03000320=\"Απο&κοπή\"\n03000321=\"Αντι&γραφή\"\n03000322=\"&Επικόλληση\"\n03000323=\"Διαγρα&φή\"\n03000330=\"Ε&πιλογή όλων\"\n03000331=\"Αποεπιλογή όλων\"\n03000332=\"Αντιστροφή επιλογής\"\n03000333=\"Επιλογή...\"\n03000334=\"Αποεπιλογή...\"\n03000335=\"Επιλογή σύμφωνα με τον τύπο αρχείου\"\n03000336=\"Αποεπιλογή σύμφωνα με τον τύπο αρχείου\"\n\n; View\n03000410=\"Μεγάλα εικονί&δια\"\n03000411=\"&Μικρά εικονίδια\"\n03000412=\"&Λίστα\"\n03000413=\"Λε&πτομέρειες \"\n03000420=\"Χωρίς ταξινόμηση\"\n03000430=\"Άνοιγμα κεντρικού φακέλου\"\n03000431=\"Μετάβαση ένα επίπεδο πάνω\"\n03000432=\"&Ιστορικό φακέλων...\"\n03000440=\"Α&νανέωση\"\n03000449=\"Επίπεδη προβολή\"\n03000450=\"Σε &2 τμήματα\"\n03000451=\"&Γραμμές εργαλείων\"\n03000460=\"Συμπίεσης\"\n03000461=\"Βασική\"\n03000462=\"Μεγάλα εικονίδια\"\n03000463=\"Προβολή κειμένου\"\n\n; Tools\n03000510=\"&Ρυθμίσεις...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Περιεχόμενα...\"\n03000620=\"Π&ερί του 7-Zip...\"\n\n; Favorites\n03000710=\"&Προσθήκη στα Αγαπημένα ως\"\n03000720=\"Σελιδοδείκτης\"\n\n; Options Dialog\n03010000=\"Ρυθμίσεις\"\n\n; Plugins\n03010100=\"Πρόσθετα\"\n03010101=\"&Πρόσθετα:\"\n03010110=\"Ρυθμίσεις...\"\n\n; Edit\n03010200=\"Πρόγραμμα επεξεργασίας\"\n03010201=\"&Πρόγραμμα επεξεργασίας:\"\n\n; System\n03010300=\"Σύστημα\"\n03010302=\"Συσχέτιση του 7-Zip με τα αρχεία:\"\n03010310=\"Πρόσθετο\"\n\n; Settings\n03010400=\"Επιλογές\"\n03010401=\"Εμφάνιση αντικειμένου \\\"..\\\"\"\n03010402=\"Εμφάνιση των κανονικών εικονιδίων των αρχείων\"\n03010410=\"Εμφάνιση μενού συστήματος\"\n03010420=\"&Επιλογή ολόκληρης διαδρομής\"\n03010421=\"Εμφάνιση γραμμών πλέγματος\"\n03010430=\"Εναλλακτική κατάσταση επιλογής\"\n03010440=\"Χρήση μεγάλων &σελίδων μνήμης\"\n\n; Strings\n03020201=\"Αντιγραφή\"\n03020202=\"Μετακίνηση\"\n03020203=\"Αντιγραφή στο:\"\n03020204=\"Μετακίνηση στο:\"\n03020205=\"Αντιγραφή...\"\n03020206=\"Μετακίνηση...\"\n03020207=\"Δεν μπορείτε να μετακινήσετε ή να αντιγράψετε σε τέτοιους φακέλους.\"\n03020208=\"Η λειτουργία δεν υποστηρίζεται.\"\n03020209=\"Επιλέξτε φάκελο προορισμού.\"\n03020210=\"Επιβεβαίωση διαγραφής του αρχείου\"\n03020211=\"Επιβεβαίωση διαγραφής του φακέλου\"\n03020212=\"Επιβεβαίωση διαγραφής πολλών αρχείων\"\n03020213=\"Είστε βέβαιοι ότι θέλετε να διαγράψετε το '{0}' ;\"\n03020214=\"Είστε βέβαιοι ότι θέλετε να διαγράψετε το φάκελο '{0}' και όλα τα περιεχόμενα του;\"\n03020215=\"Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτά τα {0} στοιχεία;\"\n03020216=\"Διαγραφή...\"\n03020217=\"Παρουσιάστηκε σφάλμα κατά τη διαγραφή.\"\n03020218=\"Το σύστημα δεν μπορεί να μετακινήσει ένα αρχείο με μεγάλη διαδρομή στον Κάδο Ανακύκλωσης.\"\n03020220=\"Μετονομασία...\"\n03020221=\"Παρουσιάστηκε σφάλμα κατά τη μετονομασία.\"\n03020222=\"Επιβεβαίωση αντιγραφής αρχείων\"\n03020223=\"Είστε βέβαιος ότι θέλετε να αντιγράψετε τα αρχεία στο αρχείο συμπίεσης;\"\n03020230=\"Δημιουργία φακέλου\"\n03020231=\"Όνομα φακέλου:\"\n03020232=\"Νέος φάκελος\"\n03020233=\"Σφάλμα κατά την δημιουργία φακέλου.\"\n03020240=\"Δημιουργία αρχείου\"\n03020241=\"Όνομα αρχείου:\"\n03020242=\"Νέο αρχείο\"\n03020243=\"Σφάλμα κατά την δημιουργία αρχείου.\"\n03020250=\"Επιλογή\"\n03020251=\"Αποεπιλογή\"\n03020252=\"Με όνομα:\"\n03020260=\"Ιστορικό φακέλων\"\n03020280=\"Το αρχείο '{0}' τροποποιήθηκε.\\nΘέλετε να ενημερώσετε το αρχείο συμπίεσης;\"\n03020281=\"Αδυνατή η ενημέρωση του αρχείου\\n'{0}'\"\n03020282=\"Δεν είναι δυνατή η εκκίνηση του προγράμματος επεξεργασίας.\"\n03020283=\"Άνοιγμα...\"\n03020284=\"Το αρχείο μοιάζει με ιό (το όνομα του περιέχει μεγάλα κενά).\"\n03020290=\"Σχόλιο\"\n03020291=\"&Σχόλιο:\"\n030202A0=\"Σύστημα\"\n03020300=\"Υπολογιστής\"\n03020301=\"Δικτύο\"\n03020302=\"Έγγραφα\"\n03020400=\"Προσθήκη\"\n03020401=\"Αποσυμπίεση\"\n03020402=\"Έλεγχος\"\n03020420=\"Αντιγραφή\"\n03020421=\"Μετακίνηση\"\n03020422=\"Διαγραφή\"\n03020423=\"Πληροφορίες\"\n03020500=\"Διαχωρισμός αρχείου\"\n03020501=\"&Διαχωρισμός σε:\"\n03020510=\"Διαχωρισμός...\"\n03020520=\"Επιβεβαίωση διαχωρισμού\"\n03020521=\"Είστε βέβαιος ότι θέλετε να διαχωρίσετε το αρχείο σε {0} τόμους;\"\n03020522=\"Το μέγεθος του τόμου πρέπει να είναι μικρότερο από αυτό του αρχικού αρχείου.\"\n03020600=\"Συνένωση αρχείων\"\n03020601=\"&Συνένωση σε:\"\n03020610=\"Συνένωση...\"\n03020620=\"Επιλέξτε μόνο το πρώτο αρχείο\"\n03020621=\"Το αρχείο δεν μπορεί να ανιχνευθεί ως μέρος διαχωρισμένου αρχείου.\"\n03020622=\"Δεν μπορούν να βρεθούν πάνω από ένα μέρη διαχωρισμένου αρχείου.\"\n03020710=\"Υπολογισμός αθροίσματος ελέγχου...\"\n03020720=\"Πληροφορίες αθροίσματος ελέγχου\"\n03020721=\"Άθροισμα ελέγχου CRC για δεδομένα:\"\n03020722=\"Άθροισμα ελέγχου CRC για δεδομένα και ονόματα:\"\n03020800=\"Σάρωση...\"\n03020900=\"Ιδιότητες\"\n03020A01=\"Η λειτουργία δεν μπορεί να κληθεί από ένα φάκελο που έχει μεγάλη διαδρομή.\"\n03020A02=\"Πρέπει να επιλέξετε ένα αρχείο.\"\n03020A03=\"Πρέπει να επιλέξετε ένα ή περισσότερα αρχεία.\"\n03020A04=\"Το αρχείο {0} ήδη υπάρχει.\"\n\n\n; Computer\n03031100=\"Συνολικό μέγεθος\"\n03031101=\"Ελεύθερος χώρος\"\n03031102=\"Μέγεθος συμπλέγματος\"\n03031103=\"Ετικέτα\"\n\n; Network\n03031200=\"Τοπικό όνομα\"\n03031201=\"Παροχέας\"\n\n; Benchmark Dialog\n03080000=\"Benchmark\"\n03080001=\"Χρήση μνήμης:\"\n03080002=\"Συμπίεση\"\n03080003=\"Αποσυμπίεση\"\n03080004=\"Ταχύτητα\"\n03080005=\"Εκτίμηση\"\n03080006=\"Συνολ. εκτίμηση\"\n03080007=\"Τρέχων πέρασμα\"\n03080008=\"Αποτέλεσμα\"\n03080009=\"Περάσματα:\"\n0308000A=\"Σφάλματα:\"\n0308000B=\"Χρήση CPU\"\n0308000C=\"Ταξ/μιση/Χρήση\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/en.ttt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by Igor Pavlov\n;\n;\n;\n;\n\n00000000=\"English\"\n00000001=\"English\"\n00000002=\"9\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Configuration\"\n\n; Info Page\n01000100=\"About 7-Zip\"\n01000103=\"7-Zip is free software. However, you can support development of 7-Zip by registering.\"\n01000104=\"Support\"\n01000105=\"Register\"\n\n; Folders Page\n01000200=\"Folders\"\n01000210=\"&Working folder\"\n01000211=\"&System temp folder\"\n01000212=\"&Current\"\n01000213=\"&Specified:\"\n01000214=\"Use for removable drives only\"\n\n01000281=\"Specify a location for temporary archive files.\"\n\n; System Page\n01000300=\"System\"\n01000301=\"Integrate 7-Zip to shell context menu\"\n01000302=\"Cascaded context menu\"\n01000310=\"Context menu items:\"\n\n; Language Page\n01000400=\"Language\"\n01000401=\"Language:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip commands\"\n02000103=\"Open archive\"\n02000104=\"Opens the selected archive.\"\n02000105=\"Extract files...\"\n02000106=\"Extracts files from the selected archive.\"\n02000107=\"Add to archive...\"\n02000108=\"Adds the selected items to archive.\"\n02000109=\"Test archive\"\n0200010A=\"Tests integrity of the selected archive.\"\n0200010B=\"Extract Here\"\n0200010C=\"Extracts files from the selected archive to current folder.\"\n0200010D=\"Extract to {0}\"\n0200010E=\"Extracts files to subfolder.\"\n0200010F=\"Add to {0}\"\n02000110=\"Adds the selected items to archive.\"\n02000111=\"Compress and email...\"\n02000112=\"Compresses the selected items to archive and sends archive via email.\"\n02000113=\"Compress to {0} and email\"\n02000114=\"Compresses the selected items to archive and sends archive via email.\"\n\n02000140=\"<Folder>\"\n02000141=\"<Archive>\"\n\n; Properties\n02000203=\"Path\"\n02000204=\"Name\"\n02000205=\"Extension\"\n02000206=\"Folder\"\n02000207=\"Size\"\n02000208=\"Packed Size\"\n02000209=\"Attributes\"\n0200020A=\"Created\"\n0200020B=\"Accessed\"\n0200020C=\"Modified\"\n0200020D=\"Solid\"\n0200020E=\"Commented\"\n0200020F=\"Encrypted\"\n02000210=\"Split Before\"\n02000211=\"Split After\"\n02000212=\"Dictionary\"\n02000213=\"CRC\"\n02000214=\"Type\"\n02000215=\"Anti\"\n02000216=\"Method\"\n02000217=\"Host OS\"\n02000218=\"File System\"\n02000219=\"User\"\n0200021A=\"Group\"\n0200021B=\"Block\"\n0200021C=\"Comment\"\n0200021D=\"Position\"\n0200021E=\"Path Prefix\"\n0200021F=\"Folders\"\n02000220=\"Files\"\n02000221=\"Version\"\n02000222=\"Volume\"\n02000223=\"Multivolume\"\n02000224=\"Offset\"\n02000225=\"Links\"\n02000226=\"Blocks\"\n02000227=\"Volumes\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Physical Size\"\n0200022D=\"Headers Size\"\n0200022E=\"Checksum\"\n0200022F=\"Characteristics\"\n02000230=\"Virtual Address\"\n\n; Status bar\n02000301=\"{0} object(s) selected\"\n02000302=\"{0} object(s)\"\n\n02000320=\"Files:\"\n02000321=\"Folders:\"\n02000322=\"Size:\"\n02000323=\"Compressed size:\"\n02000324=\"Archives:\"\n\n; List Context Menu\n02000401=\"&Columns...\"\n\n02000411=\"&Open\"\n02000412=\"&Extract...\"\n\n; ToolBar\n02000501=\"Extract\"\n\n; Messages\n02000601=\"Update operations are not supported for this archive.\"\n02000602=\"Cannot update archive {0}\"\n02000603=\"Cannot create folder '{0}'\"\n02000604=\"File is not supported archive.\"\n02000605=\"Error\"\n02000606=\"Too many items\"\n02000607=\"There is no application associated with the given file name extension\"\n02000608=\"There are no errors\"\n02000609=\"Can not open file '{0}' as archive\"\n0200060A=\"Can not open encrypted archive '{0}'. Wrong password?\"\n0200060B=\"The system cannot allocate the required amount of memory\"\n0200060C=\"Unknown error\"\n0200060D=\"Unsupported archive type\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Yes\"\n02000707=\"Yes to &All\"\n02000709=\"&No\"\n0200070B=\"No to A&ll\"\n\n02000710=\"Cancel\"\n02000711=\"&Cancel\"\n02000713=\"&Close\"\n02000714=\"Stop\"\n02000715=\"Restart\"\n\n02000720=\"Help\"\n\n; Extract dialog\n02000800=\"Extract\"\n02000801=\"E&xtract to:\"\n02000802=\"Password\"\n\n02000810=\"Path mode\"\n02000811=\"Full pathnames\"\n02000812=\"Current pathnames\"\n02000813=\"No pathnames\"\n\n02000820=\"Overwrite mode\"\n02000821=\"Ask before overwrite\"\n02000822=\"Overwrite without prompt\"\n02000823=\"Skip existing files\"\n02000824=\"Auto rename\"\n02000825=\"Auto rename existing files\"\n\n02000830=\"Files\"\n02000831=\"&Selected files\"\n02000832=\"&All files\"\n\n02000881=\"Specify a location for extracted files.\"\n\n02000890=\"Extracting\"\n\n; Overwrite dialog\n02000900=\"Confirm File Replace\"\n02000901=\"Destination folder already contains processed file.\"\n02000902=\"Would you like to replace the existing file\"\n02000903=\"with this one?\"\n\n02000911=\"A&uto Rename\"\n\n02000982=\"{0} bytes\"\n02000983=\"modified on\"\n\n; Messages dialog\n02000A00=\"Diagnostic messages\"\n\n02000A80=\"Message\"\n\n02000A91=\"Unsupported compression method for '{0}'.\"\n02000A92=\"Data error in '{0}'. File is broken.\"\n02000A93=\"CRC failed in '{0}'. File is broken.\"\n02000A94=\"Data error in encrypted file '{0}'. Wrong password?\"\n02000A95=\"CRC failed in encrypted file '{0}'. Wrong password?\"\n\n; Password dialog\n02000B00=\"Enter password\"\n02000B01=\"Enter password:\"\n02000B02=\"&Show password\"\n02000B03=\"Reenter password:\"\n02000B10=\"Passwords do not match\"\n02000B11=\"Use only English letters, numbers and special characters (!, #, $, ...) for password\"\n02000B12=\"Password is too long\"\n\n; Progress dialog\n02000C00=\"Process\"\n02000C01=\"Elapsed time:\"\n02000C02=\"Remaining time:\"\n02000C03=\"Total size:\"\n02000C04=\"Speed:\"\n02000C05=\"Processed:\"\n02000C06=\"Compression ratio:\"\n\n02000C10=\"&Background\"\n02000C11=\"&Foreground\"\n02000C12=\"&Pause\"\n02000C13=\"&Continue\"\n\n02000C20=\"Paused\"\n\n02000C30=\"Are you sure you want to cancel?\"\n\n; Compress dialog\n02000D00=\"Add to archive\"\n02000D01=\"&Archive:\"\n02000D02=\"&Update mode:\"\n02000D03=\"Archive &format:\"\n02000D04=\"Compression &method:\"\n02000D05=\"Create &Solid archive\"\n02000D06=\"&Parameters:\"\n02000D07=\"Options\"\n02000D08=\"Create SF&X archive\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Encrypt file &names\"\n02000D0B=\"Compression &level:\"\n02000D0C=\"&Dictionary size:\"\n02000D0D=\"&Word size:\"\n02000D0E=\"Memory usage for Compressing:\"\n02000D0F=\"Memory usage for Decompressing:\"\n02000D10=\"Encryption\"\n02000D11=\"Encryption method:\"\n02000D12=\"Number of CPU threads:\"\n02000D13=\"Solid block size:\"\n02000D14=\"Non-solid\"\n02000D15=\"Solid\"\n02000D16=\"Compress shared files\"\n\n02000D40=\"Split to &volumes, bytes:\"\n02000D41=\"Incorrect volume size\"\n02000D42=\"Specified volume size: {0} bytes.\\nAre you sure you want to split archive into such volumes?\"\n\n02000D81=\"Store\"\n02000D82=\"Normal\"\n02000D83=\"Maximum\"\n02000D84=\"Fast\"\n02000D85=\"Fastest\"\n02000D86=\"Ultra\"\n\n02000D90=\"Browse\"\n\n02000DA1=\"Add and replace files\"\n02000DA2=\"Update and add files\"\n02000DA3=\"Freshen existing files\"\n02000DA4=\"Synchronize files\"\n\n02000DB1=\"All Files\"\n\n02000DC0=\"Compressing\"\n\n; Columns dialog\n02000E00=\"Columns\"\n02000E01=\"Check the columns that you would like to make visible in this folder. Use the Move Up and Move Down buttons to reorder the columns.\"\n02000E02=\"The selected column should be\"\n02000E03=\"pixels &wide.\"\n\n02000E10=\"Move &Up\"\n02000E11=\"Move &Down\"\n02000E12=\"&Show\"\n02000E13=\"&Hide\"\n02000E14=\"Set\"\n\n02000E81=\"Title\"\n02000E82=\"Width\"\n\n; Testing\n02000F90=\"Testing\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&File\"\n03000103=\"&Edit\"\n03000104=\"&View\"\n03000105=\"&Tools\"\n03000106=\"&Help\"\n03000107=\"F&avorites\"\n\n; File\n03000210=\"&Open\"\n03000211=\"Open &Inside\"\n03000212=\"Open O&utside\"\n03000220=\"&View\"\n03000221=\"&Edit\"\n03000230=\"Rena&me\"\n03000231=\"&Copy To...\"\n03000232=\"&Move To...\"\n03000233=\"&Delete\"\n03000240=\"P&roperties\"\n03000241=\"Comme&nt\"\n03000242=\"Calculate checksum\"\n03000250=\"Create Folder\"\n03000251=\"Create File\"\n03000260=\"E&xit\"\n03000270=\"&Split file...\"\n03000271=\"Com&bine files...\"\n\n; Edit\n03000310=\"&Undo\"\n03000311=\"&Redo\"\n03000320=\"Cu&t\"\n03000321=\"&Copy\"\n03000322=\"&Paste\"\n03000323=\"&Delete\"\n03000330=\"Select &All\"\n03000331=\"Deselect All\"\n03000332=\"&Invert Selection\"\n03000333=\"Select...\"\n03000334=\"Deselect...\"\n03000335=\"Select by Type\"\n03000336=\"Deselect by Type\"\n\n; View\n03000410=\"Lar&ge Icons\"\n03000411=\"S&mall Icons\"\n03000412=\"&List\"\n03000413=\"&Details\"\n03000420=\"Unsorted\"\n03000430=\"Open Root Folder\"\n03000431=\"Up One Level\"\n03000432=\"Folders History...\"\n03000440=\"&Refresh\"\n03000449=\"Flat View\"\n03000450=\"&2 Panels\"\n03000451=\"&Toolbars\"\n03000460=\"Archive Toolbar\"\n03000461=\"Standard Toolbar\"\n03000462=\"Large Buttons\"\n03000463=\"Show Buttons Text\"\n\n; Tools\n03000510=\"&Options...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Contents...\"\n03000620=\"&About 7-Zip...\"\n\n; Favorites\n03000710=\"&Add folder to Favorites as\"\n03000720=\"Bookmark\"\n\n; Options Dialog\n\n03010000=\"Options\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Options...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"System\"\n03010302=\"Associate 7-Zip with:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Settings\"\n03010401=\"Show \\\"..\\\" item\"\n03010402=\"Show real file icons\"\n03010410=\"Show system menu\"\n03010420=\"&Full row select\"\n03010421=\"Show &grid lines\"\n03010430=\"&Alternative selection mode\"\n03010440=\"Use &large memory pages\"\n\n; Strings\n\n03020201=\"Copy\"\n03020202=\"Move\"\n03020203=\"Copy to:\"\n03020204=\"Move to:\"\n03020205=\"Copying...\"\n03020206=\"Moving...\"\n03020207=\"You cannot move or copy items for such folders.\"\n03020208=\"The operation is not supported for this folder.\"\n03020209=\"Select destination folder.\"\n\n03020210=\"Confirm File Delete\"\n03020211=\"Confirm Folder Delete\"\n03020212=\"Confirm Multiple File Delete\"\n03020213=\"Are you sure you want to delete '{0}'?\"\n03020214=\"Are you sure you want to delete the folder '{0}' and all its contents?\"\n03020215=\"Are you sure you want to delete these {0} items?\"\n03020216=\"Deleting...\"\n03020217=\"Error Deleting File or Folder\"\n03020218=\"The system cannot move a file with long path to the Recycle Bin\"\n\n03020220=\"Renaming...\"\n03020221=\"Error Renaming File or Folder\"\n03020222=\"Confirm File Copy\"\n03020223=\"Are you sure you want to copy files to archive\"\n\n03020230=\"Create Folder\"\n03020231=\"Folder name:\"\n03020232=\"New Folder\"\n03020233=\"Error Creating Folder\"\n\n03020240=\"Create File\"\n03020241=\"File Name:\"\n03020242=\"New File\"\n03020243=\"Error Creating File\"\n\n03020250=\"Select\"\n03020251=\"Deselect\"\n03020252=\"Mask:\"\n\n03020260=\"Folders History\"\n\n03020280=\"File '{0}' was modified.\\nDo you want to update it in the archive?\"\n03020281=\"Can not update file\\n'{0}'\"\n03020282=\"Cannot start editor.\"\n03020283=\"Opening...\"\n03020284=\"The file looks like a virus (the file name contains long spaces in name).\"\n\n03020290=\"Comment\"\n03020291=\"&Comment:\"\n\n030202A0=\"System\"\n\n03020300=\"Computer\"\n03020301=\"Network\"\n03020302=\"Documents\"\n\n03020400=\"Add\"\n03020401=\"Extract\"\n03020402=\"Test\"\n\n03020420=\"Copy\"\n03020421=\"Move\"\n03020422=\"Delete\"\n03020423=\"Info\"\n\n03020500=\"Split File\"\n03020501=\"&Split to:\"\n03020510=\"Splitting...\"\n03020520=\"Confirm Splitting\"\n03020521=\"Are you sure you want to split file into {0} volumes?\"\n03020522=\"Volume size must be smaller than size of original file\"\n\n03020600=\"Combine Files\"\n03020601=\"&Combine to:\"\n03020610=\"Combining...\"\n03020620=\"Select only first part of split file\"\n03020621=\"Can not detect file as part of split file\"\n03020622=\"Can not find more than one part of split file\"\n\n03020710=\"Checksum calculating...\"\n03020720=\"Checksum information\"\n03020721=\"CRC checksum for data:\"\n03020722=\"CRC checksum for data and names:\"\n\n03020800=\"Scanning...\"\n\n03020900=\"Properties\"\n\n03020A01=\"The operation cannot be called from a folder that has a long path.\"\n03020A02=\"You must select one file\"\n03020A03=\"You must select one or more files\"\n03020A04=\"File {0} is already exist\"\n\n; Computer\n03031100=\"Total Size\"\n03031101=\"Free Space\"\n03031102=\"Cluster Size\"\n03031103=\"Label\"\n\n; Network\n03031200=\"Local Name\"\n03031201=\"Provider\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Memory usage:\"\n03080002=\"Compressing\"\n03080003=\"Decompressing\"\n03080004=\"Speed\"\n03080005=\"Rating\"\n03080006=\"Total Rating\"\n03080007=\"Current\"\n03080008=\"Resulting\"\n03080009=\"Passes:\"\n0308000A=\"Errors:\"\n0308000B=\"CPU Usage\"\n0308000C=\"Rating / Usage\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/eo.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.37\n; Translated by Dmitri Gabinski\n;\n;\n;\n;\n\n00000000=\"Esperanto\"\n00000001=\"Esperanto\"\n00000002=\"\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip-Konfiguro\"\n\n; Info Page\n01000100=\"Informo\"\n01000103=\"7-Zip estas senpaga programo. Tamen, vi povas subteni evoluadon de 7-Zip per enregistriĝo.\"\n01000104=\"Subteno\"\n01000105=\"Enregistriĝo\"\n\n; Folders Page\n01000200=\"Dosierujoj\"\n01000210=\"&Kuranta dosierujo\"\n01000211=\"&Sistema labora dosierujo\"\n01000212=\"&Ĉi tiu\"\n01000213=\"&Specifu:\"\n01000214=\"&Uzi nur por demeteblaj datumportiloj\"\n\n01000281=\"Specifu ujon por laboraj dosieroj.\"\n\n; System Page\n01000300=\"Sistemo\"\n01000301=\"Metu 7-Zip'on en kuntekstan menuon de ŝelo\"\n01000302=\"Kaskada kunteksta menuo\"\n01000310=\"Punktoj de kunteksta menuo:\"\n\n; Language Page\n01000400=\"Lingvo\"\n01000401=\"Lingvo:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Komandoj de 7-Zip\"\n02000103=\"Malfermu\"\n02000104=\"Malfermu markitan dosieron.\"\n02000105=\"Elarĥivigu dosierojn...\"\n02000106=\"Elarĥivigo de dosieroj el markita arĥivo.\"\n02000107=\"Enarĥivigu...\"\n02000108=\"Enarĥivigu markitajn objektojn.\"\n02000109=\"Testu arĥivon\"\n0200010A=\"Testo de kohero de markita arĥivo.\"\n0200010B=\"Elarĥivigu ĉi-tien\"\n0200010C=\"Elarĥivigo de dosieroj el markita arĥivo en kurantan dosierujon.\"\n0200010D=\"Elarĥivigu en {0}\"\n0200010E=\"Elarĥvigas dosierojn en subdosierujon.\"\n0200010F=\"Aldonu al {0}\"\n02000110=\"Aldonu markitajn aĵojn al arĥivo.\"\n02000111=\"Enarĥivigu kaj enretpoŝtigu...\"\n02000112=\"Enarĥivigu la markitajn aĵojn kaj enretpoŝtigu la arĥivon.\"\n02000113=\"Enarĥivigu en {0} kaj enretpoŝtigu...\"\n02000113=\"Enarĥivigu la markitajn aĵojn kaj enretpoŝtigu la arĥivon.\"\n\n02000140=\"<Dosierujo>\"\n02000141=\"<Arĥivo>\"\n\n; Properties\n02000203=\"Dosierindiko\"\n02000204=\"Nomo\"\n02000205=\"Dosiernoma sufikso\"\n02000206=\"Dosierujo\"\n02000207=\"Grando\"\n02000208=\"Enarĥiva grando\"\n02000209=\"Atributoj\"\n0200020A=\"Kreita\"\n0200020B=\"Malfermita\"\n0200020C=\"Ŝanĝita\"\n0200020D=\"Solida\"\n0200020E=\"Komento\"\n0200020F=\"Ĉifra\"\n02000210=\"Disigita antaŭ\"\n02000211=\"Disigita post\"\n02000212=\"Vortaro\"\n02000213=\"CRC\"\n02000214=\"Tipo\"\n02000215=\"Kontraŭ\"\n02000216=\"Metodo\"\n02000217=\"Gastiga operaciumo\"\n02000218=\"Dosiersistemo\"\n02000219=\"Uzulo\"\n0200021A=\"Grupo\"\n0200021B=\"Bloko\"\n0200021C=\"Komento\"\n0200021D=\"Pozicio\"\n0200021E=\"Vojprefikso\"\n\n; Status bar\n02000301=\"{0} objekto(j) markita(j)\"\n02000302=\"{0} objekto(j)\"\n\n02000320=\"Dosieroj:\"\n02000321=\"Dosierujoj:\"\n02000322=\"Grando:\"\n\n; List Context Menu\n02000401=\"&Kolumnoj...\"\n\n02000411=\"&Malfermu\"\n02000412=\"&Elarĥivigu...\"\n\n; ToolBar\n02000501=\"Elarĥivigu\"\n\n; Messages\n02000601=\"Ĝisdatigoperacioj ne estas subtenataj por ĉi-tiu arĥivo.\"\n02000602=\"Fiaskis ĝisdatigi arĥivon {0}\"\n02000603=\"Fiaskis krei dosierujon '{0}'\"\n02000604=\"Dosiero ne estas subtenata arĥivo.\"\n02000605=\"Eraro\"\n02000606=\"Troaj elementoj\"\n02000607=\"Mankas kunligita programo\"\n02000608=\"Eraroj ne trovitaj\"\n\n; Dialogs\n02000702=\"B&one\"\n02000705=\"&Jes\"\n02000707=\"Jes por ĉ&iuj\"\n02000709=\"&Ne\"\n0200070B=\"Ne por ĉi&uj\"\n\n02000710=\"Nuligu\"\n02000711=\"&Nuligu\"\n02000713=\"&Fermu\"\n02000714=\"&Haltu\"\n02000715=\"Restartigu\"\n\n02000720=\"Helpo\"\n\n; Extract dialog\n02000800=\"&Elarĥivigu\"\n02000801=\"E&larĥivigu en:\"\n02000802=\"&Pasvorto\"\n\n02000810=\"Dosierindikoj\"\n02000811=\"&Absolutaj dosierindikoj\"\n02000812=\"&Relativaj dosierindikoj\"\n02000813=\"&Sen dosierindikoj\"\n\n02000820=\"Anstataŭiga skribreĝimo\"\n02000821=\"&Kun konfirmo\"\n02000822=\"&Sen konfirmo\"\n02000823=\"&Preterlasu estantaj dosieroj\"\n02000824=\"Aŭtonomŝanĝo\"\n02000825=\"Aŭtonomŝanĝo de ekzistantaj dosieroj\"\n\n02000830=\"Dosieroj\"\n02000831=\"&Markitaj dosieroj\"\n02000832=\"Ĉ&iuj dosieroj\"\n\n02000881=\"Specifu ujon por elarĥivendaj dosieroj.\"\n\n02000890=\"Elarĥivigo\"\n\n; Overwrite dialog\n02000900=\"Konfirmo de nomŝanĝo\"\n02000901=\"Dosierujo jam enhavas prilaboratan dosieron.\"\n02000902=\"Anstataŭigu estantan dosieron\"\n02000903=\"per ĉi-tiu?\"\n\n02000911=\"&Aŭtonomŝanĝo.\"\n\n02000982=\"{0} bajtoj\"\n02000983=\"anstataŭigitaj per\"\n\n; Messages dialog\n02000A00=\"Diagnozaj mesaĝoj\"\n\n02000A80=\"Mesaĝo\"\n\n02000A91=\"Ne estas subtenata densigmetodo por dosiero '{0}'.\"\n02000A92=\"Datumeraro en '{0}'. Difektiĝinta dosiero.\"\n02000A93=\"CRC-eraro en '{0}'. Difektiĝinta dosiero.\"\n\n; Password dialog\n02000B00=\"Pasvorto\"\n02000B01=\"Enigu pasvorton:\"\n02000B02=\"&Montru pasvorton\"\n\n; Progress dialog\n02000C00=\"Procezo\"\n02000C01=\"Pasinta tempo:\"\n02000C02=\"Restanta tempo:\"\n02000C03=\"Grando:\"\n02000C04=\"Rapideco:\"\n\n02000C10=\"&Fono\"\n02000C11=\"&Malfono\"\n02000C12=\"&Paŭzo\"\n02000C13=\"&Daŭrigu\"\n\n02000C20=\"Paŭzita\"\n\n02000C30=\"Ĉu vi vere volas nuligi?\"\n\n; Compress dialog\n02000D00=\"Enarĥivigu\"\n02000D01=\"&Arĥivo:\"\n02000D02=\"A&nstataŭigreĝimo:\"\n02000D03=\"A&rĥivformato:\"\n02000D04=\"&Densigmetodo:\"\n02000D05=\"Kreu &solidan arĥivon\"\n02000D06=\"&Parametroj:\"\n02000D07=\"Agordoj\"\n02000D08=\"Kreu SF&X-arĥivon\"\n02000D09=\"Disfadenigo\"\n02000D0A=\"Ĉifru dosier&nomojn\"\n02000D0B=\"Densigo&nivelo\"\n02000D0C=\"&Vortarogrando:\"\n02000D0D=\"Vo&rtogrando:\"\n02000D0E=\"Memoruzo por densigo:\"\n02000D0F=\"Memoruzo por maldensigo:\"\n\n02000D40=\"&Plurvolumigu, bajtoj:\"\n\n02000D81=\"Sen densigo\"\n02000D82=\"Normala densigo\"\n02000D83=\"Maksimuma densigo\"\n02000D84=\"Rapide\"\n02000D85=\"Plej rapide\"\n02000D86=\"Ultra\"\n\n02000D90=\"Foliumu\"\n\n02000DA1=\"Aldonu kaj anstataŭigu dosierojn\"\n02000DA2=\"Ĝisdatigu kaj aldonu dosierojn\"\n02000DA3=\"Refreŝigu estantajn dosierojn\"\n02000DA4=\"Sinkronigu dosierojn\"\n\n02000DB1=\"Ĉiuj dosieroj\"\n\n02000DC0=\"Densigo\"\n\n; Columns dialog\n02000E00=\"Kolumnoj\"\n02000E01=\"Marku kolumnojn, enarĥivendaj en ĉi-tiu dosierujo. Per butonoj Supren kaj Suben eblas difini sekvordo de kolumnoj.\"\n02000E02=\"Markita kolumno devas havi &larĝecon de\"\n02000E03=\"rastumeroj.\"\n\n02000E10=\"&Supren\"\n02000E11=\"S&uben\"\n02000E12=\"&Montru\"\n02000E13=\"&Kaŝu\"\n02000E14=\"Difinu\"\n\n02000E81=\"Nomo\"\n02000E82=\"Larĝeco\"\n\n; Testing\n02000F90=\"Testado\"\n\n\n; File Manager\n\n03000000=\"7-Zip-dosieradministrilo\"\n\n; Menu\n03000102=\"&Dosiero\"\n03000103=\"&Redakto\"\n03000104=\"&Vido\"\n03000105=\"&Agordoj\"\n03000106=\"&Helpo\"\n03000107=\"&Favoritaj\"\n\n; File\n03000210=\"&Malfermu\"\n03000211=\"Malfermu &ene\"\n03000212=\"Malfermu ek&stere\"\n03000220=\"&Vidigu\"\n03000221=\"&Redaktu\"\n03000230=\"Ŝ&anĝu nomon\"\n03000231=\"&Kopiu en...\"\n03000232=\"M&ovu en...\"\n03000233=\"&Forigu\"\n03000240=\"A&tributoj\"\n03000241=\"Ko&mentu\"\n03000242=\"Kalkulu kontrolsumon\"\n03000250=\"Kreu &dosierujon\"\n03000251=\"Kre&u dos&ieron\"\n03000260=\"E&liru\"\n03000270=\"&Erigu dosierojn...\"\n03000271=\"Komb&inu dosierojn...\"\n\n; Edit\n03000310=\"&Malfaru\"\n03000311=\"&Refaru\"\n03000320=\"&Tondu\"\n03000321=\"&Kopiu\"\n03000322=\"Al&gluu\"\n03000323=\"&Forigu\"\n03000330=\"M&arku ĉiun\"\n03000331=\"Ma&lmarku ĉiun\"\n03000332=\"&Inversigu markon\"\n03000333=\"Marku...\"\n03000334=\"Malmarku...\"\n03000335=\"Marku laŭ tipo\"\n03000336=\"Malmarku laŭ tipo\"\n\n; View\n03000410=\"&Grandaj bildetoj\"\n03000411=\"&Malgrandaj bildetoj\"\n03000412=\"&Listo\"\n03000413=\"&Detale\"\n03000420=\"&Neordigite\"\n03000430=\"Malfermu radikan dosierujon\"\n03000431=\"Supren je unu nivelo\"\n03000432=\"Dosierujhistorio...\"\n03000440=\"Ĝ&isdatigu\"\n03000449=\"Ununivela vido\"\n03000450=\"&2 paneloj\"\n03000451=\"&Ilobretoj\"\n03000460=\"Arĥivo-ilobreto\"\n03000461=\"Norma ilobreto\"\n03000462=\"Grandaj bildetoj\"\n03000463=\"Montru butontekston\"\n\n; Tools\n03000510=\"&Agordoj...\"\n03000511=\"&Etalono\"\n\n; Help\n03000610=\"&Enhavo...\"\n03000620=\"&Pri 7-Zip...\"\n\n; Favorites\n03000710=\"&Aldonu dosierujon al favorataj kiel\"\n03000720=\"Legosigno\"\n\n; Options Dialog\n\n03010000=\"Agordoj\"\n\n; Plugins\n03010100=\"Kromaĵoj\"\n03010101=\"&Kromaĵoj:\"\n03010110=\"Agordoj\"\n\n; Edit\n03010200=\"Redaktilo\"\n03010201=\"&Redaktilo:\"\n\n; System\n03010300=\"Sistemo\"\n03010302=\"Asociu 7-Zip-on kun dosieroj:\"\n03010310=\"Kromaĵo\"\n\n; Settings\n03010400=\"Agordoj\"\n03010401=\"Montru \\\"..\\\"-elementon\"\n03010402=\"Montru realajn dosierbildetojn\"\n03010410=\"Montru sisteman menuon\"\n03010420=\"Marku &tutan linion\"\n03010421=\"Montru &kradliniojn\"\n03010430=\"&Alternativa markreĝimo\"\n03010440=\"Uzu &grandajn memorpaĝojn\"\n\n; Strings\n\n03020201=\"Kopiu\"\n03020202=\"Movu\"\n03020203=\"Kopiu en:\"\n03020204=\"Movu en:\"\n03020205=\"Kopio...\"\n03020206=\"Movo...\"\n03020207=\"Maleblas kopii objektojn por tiaj dosieroj.\"\n03020208=\"Operacio ne estas subtenata.\"\n\n03020210=\"Konfirmo de forigo de dosiero\"\n03020211=\"Konfirmo de forigo de dosierujo\"\n03020212=\"Konfirmo de forigo de dosieraro\"\n03020213=\"Ĉu vi vere volas forigi '{0}'?\"\n03020214=\"Ĉu vi vere volas forigi dosierujon \\\"{0}\\\" kaj tutan ĝian enhavon?\"\n03020215=\"Ĉu vi vere volas forigi ĉi tiajn {0} objektojn?\"\n03020216=\"Forigo...\"\n03020217=\"Eraro dum forigo de dosiero aŭ dosierujo\"\n\n03020220=\"Nomŝanĝo...\"\n03020221=\"Eraro dum nomŝanĝo de dosiero aŭ dosierujo\"\n03020222=\"Konfirmu dosierkopion\"\n03020223=\"Ĉu vere kopii dosierojn enarĥiven\"\n\n03020230=\"Kreu dosierujon\"\n03020231=\"Dosierujnomo:\"\n03020232=\"Nova dosierujo\"\n03020233=\"Eraro dum dosierujkreo\"\n\n03020240=\"Kreu dosieron\"\n03020241=\"Dosiernomo:\"\n03020242=\"Nova dosiero\"\n03020243=\"Eraro dum dosierkreo\"\n\n03020250=\"Marku\"\n03020251=\"Malmarku\"\n03020252=\"Masko:\"\n\n03020260=\"Dosierujhistorio\"\n\n03020280=\"Dosiero '{0}' ŝanĝiĝis.\\nĈu vi volas ĝistadigi ĝin enraĥive?\"\n03020281=\"Fiaskis ĝisdatigi dosieron\\n'{0}''\"\n03020282=\"Fiaskis startigi redaktilon.\"\n03020283=\"Malfermo...\"\n\n03020290=\"Komento\"\n03020291=\"&Komento:\"\n\n030202A0=\"Sistemo\"\n\n03020300=\"Komputilo\"\n03020301=\"Reto\"\n\n03020400=\"Enarĥivigu\"\n03020401=\"Elarĥivigu\"\n03020402=\"Testu\"\n\n03020420=\"Kopiu\"\n03020421=\"Movu\"\n03020422=\"Forigu\"\n03020423=\"Informo\"\n\n03020500=\"Erigu dosieron\"\n03020501=\"&Erigu en:\"\n03020510=\"Erigo...\"\n\n03020600=\"Kombinu dosierojn\"\n03020601=\"&Kombinu en:\"\n03020610=\"Kombino...\"\n\n03020710=\"Kalkulante kontrolsumon...\"\n03020720=\"Informo pri kontrolsumo\"\n03020721=\"CRC-kontrolsumo por datumoj:\"\n03020722=\"CRC-kontrolsumo por datumoj kaj nomoj:\"\n\n03020800=\"Analizante...\"\n\n; Computer\n03031100=\"Kapacito\"\n03031101=\"Libera\"\n03031102=\"Faskogrando\"\n03031103=\"Marko\"\n\n; Network\n03031200=\"Loka nomo\"\n03031201=\"Provizanto\"\n\n; Benchmark Dialog\n\n03080000=\"Etalono\"\n03080001=\"Memoruzo:\"\n03080002=\"Densigo\"\n03080003=\"Maldensigo\"\n03080004=\"Rapideco\"\n03080005=\"Takso\"\n03080006=\"Tuta takso\"\n03080007=\"Kuranta\"\n03080008=\"Rezulta\"\n03080009=\"Pasoj:\"\n0308000A=\"Eraroj:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/es.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 3.08 Beta\n; Translated by Jbc25 based in original file of Igor Pavlov\n; 7-Zip 4.54 Beta (en.ttt 4.53)\n; Updated by Guillermo Gabrielli - 05/09/2007\n;\n;\n\n00000000=\"Spanish\"\n00000001=\"Español\"\n00000002=\"10\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuración de 7-Zip\"\n\n; Info Page\n01000100=\"Acerca de 7-Zip\"\n01000103=\"7-Zip es un excelente software, además es libre y gratuito. Pero tu puedes apoyar el desarrollo de 7-Zip registrándote, para contribuir a mejorar el programa.\"\n01000104=\"Soporte\"\n01000105=\"Registro\"\n\n; Folders Page\n01000200=\"Directorios\"\n01000210=\"Directorio de &trabajo\"\n01000211=\"Directorio temporal del &sistema\"\n01000212=\"Directorio &actual\"\n01000213=\"&Especificar directorio:\"\n01000214=\"Usar sólo para discos extraíbles\"\n\n01000281=\"Especificar un directorio para archivos temporales.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integrar 7-Zip en el menú contextual de Windows\"\n01000302=\"Menú contextual en cascada\"\n01000310=\"Ítems en el menú contextual:\"\n\n; Language Page\n01000400=\"Idioma\"\n01000401=\"Idioma:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comandos 7-Zip\"\n02000103=\"Abrir comprimido\"\n02000104=\"Abre el archivo seleccionado.\"\n02000105=\"Extraer ficheros...\"\n02000106=\"Extrae los ficheros del archivo seleccionado.\"\n02000107=\"Añadir al archivo...\"\n02000108=\"Añade los ficheros seleccionados al archivo.\"\n02000109=\"Comprobar archivo\"\n0200010A=\"Comprueba la integridad del archivo seleccionado.\"\n0200010B=\"Extraer aquí\"\n0200010C=\"Extrae los ficheros del archivo seleccionado a la carpeta actual.\"\n0200010D=\"Extraer en {0}\"\n0200010E=\"Extrae ficheros a una subcarpeta.\"\n0200010F=\"Añadir a {0}\"\n02000110=\"Añade los items seleccionados al archivo.\"\n02000111=\"Comprimir y enviar por correo...\"\n02000112=\"Comprime los items selecionados a un archivo y lo enviar por correo.\"\n02000113=\"Comprimir a {0} y enviar por correo\"\n02000114=\"Comprime los items selecionados a un archivo y lo envía por correo.\"\n\n02000140=\"<Carpeta>\"\n02000141=\"<Archivo>\"\n\n; Properties\n02000203=\"Dirección\"\n02000204=\"Nombre\"\n02000205=\"Tipo de archivo\"\n02000206=\"Directorio\"\n02000207=\"Tamaño\"\n02000208=\"Tamaño comprimido\"\n02000209=\"Atributos\"\n0200020A=\"Creado\"\n0200020B=\"Acceso\"\n0200020C=\"Modificado\"\n0200020D=\"Compacto\"\n0200020E=\"Comentado\"\n0200020F=\"Encriptado\"\n02000210=\"expandido antes\"\n02000211=\"expandido después\"\n02000212=\"Diccionario\"\n02000213=\"CRC\"\n02000214=\"Tipo\"\n02000215=\"Anti\"\n02000216=\"Método\"\n02000217=\"SO origen\"\n02000218=\"Sistema de archivos\"\n02000219=\"Usuario\"\n0200021A=\"Grupo\"\n0200021B=\"Bloque\"\n0200021C=\"Comentario\"\n0200021D=\"Posición\"\n0200021E=\"Ruta\"\n0200021F=\"Directorios\"\n02000220=\"Ficheros\"\n02000221=\"Versión\"\n02000222=\"Volumen\"\n02000223=\"Multivolumen\"\n02000224=\"Desplazamiento\"\n02000225=\"Vínculos\"\n02000226=\"Bloques\"\n02000227=\"Volúmenes\"\n\n; Status bar\n02000301=\"{0} objeto(s) seleccionado(s)\"\n02000302=\"{0} objeto(s)\"\n\n02000320=\"Ficheros:\"\n02000321=\"Directorios:\"\n02000322=\"Tamaño:\"\n02000323=\"Tamaño Comprimido:\"\n02000324=\"Archivos:\"\n\n; List Context Menu\n02000401=\"&Columnas...\"\n\n02000411=\"&Abrir\"\n02000412=\"&Extraer...\"\n\n; ToolBar\n02000501=\"Extraer\"\n\n; Messages\n02000601=\"Este tipo de archivo no permite actualización.\"\n02000602=\"No se puede actualizar el archivo {0}\"\n02000603=\"No se puede crear el directorio '{0}'\"\n02000604=\"Tipo de archivo no reconocible.\"\n02000605=\"Error\"\n02000606=\"Demasiados objetos\"\n02000607=\"No hay ningún programa asociado a esta extensión de archivo\"\n02000608=\"No hay errores\"\n02000609=\"No se puede abrir '{0}' como un archivo comprimido\"\n0200060A=\"No se puede abrir el archivo encriptado '{0}'. Verifique la contraseña.\"\n\n; Dialogs\n02000702=\"Aceptar\"\n02000705=\"&Sí\"\n02000707=\"Sí a &todo\"\n02000709=\"&No\"\n0200070B=\"No a t&odo\"\n\n02000710=\"Cancelar\"\n02000711=\"&Cancelar\"\n02000713=\"&Cerrar\"\n02000714=\"Parar\"\n02000715=\"Volver a empezar\"\n\n02000720=\"Ayuda\"\n\n; Extract dialog\n02000800=\"Extraer\"\n02000801=\"E&xtraer a:\"\n02000802=\"Contraseña\"\n\n02000810=\"Modo de directorio\"\n02000811=\"Directorio completo\"\n02000812=\"Directorio relativo\"\n02000813=\"Sin directorio\"\n\n02000820=\"Sobrescribir\"\n02000821=\"Con confirmación\"\n02000822=\"Sin confirmación\"\n02000823=\"Conservar archivos existentes\"\n02000824=\"Renombrar automáticamente\"\n02000825=\"Auto-Renombrar archivos existentes\"\n\n02000830=\"Archivos\"\n02000831=\"Archivos &seleccionados\"\n02000832=\"&Todos los archivos\"\n\n02000881=\"Seleccione destino para los archivos extraídos.\"\n\n02000890=\"Extrayendo\"\n\n; Overwrite dialog\n02000900=\"Confirmar sustitución de archivos\"\n02000901=\"El directorio ya contiene un archivo con el mismo nombre.\"\n02000902=\"¿Desea sustituir el archivo existente\"\n02000903=\"por este otro?\"\n\n02000911=\"Renombrar a&utomáticamente\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificado el\"\n\n; Messages dialog\n02000A00=\"Mensajes de diagnóstico\"\n\n02000A80=\"Mensaje\"\n\n02000A91=\"Método de compresión no válido para '{0}'.\"\n02000A92=\"Error de datos en '{0}'. El archivo está dañado.\"\n02000A93=\"CRC ha fallado en '{0}'. El archivo está dañado.\"\n02000A94=\"Error de datos en el archivo encriptado '{0}'. Verifique la contraseña.\"\n02000A95=\"CRC ha fallado en el archivo encriptado '{0}'. Verifique la contraseña.\"\n\n; Password dialog\n02000B00=\"Introducir contraseña\"\n02000B01=\"E&scriba la contraseña:\"\n02000B02=\"&Mostrar contraseña\"\n02000B03=\"Escriba nue&vamente la contraseña:\"\n02000B10=\"Las contraseñas son diferentes. Por favor vuelva a ingresarlas.\"\n02000B11=\"Utilice en la contraseña solamente letras del alfabeto inglés, números y caracteres especiales (!, #, $, ...)\"\n02000B12=\"La contraseña es demasiado larga.\"\n\n; Progress dialog\n02000C00=\"Progreso\"\n02000C01=\"Tiempo transcurrido:\"\n02000C02=\"Tiempo pendiente:\"\n02000C03=\"Tamaño:\"\n02000C04=\"Velocidad:\"\n02000C05=\"Procesado:\"\n02000C06=\"Razón de Compresión:\"\n\n02000C10=\"Se&gundo Plano\"\n02000C11=\"P&rimer plano\"\n02000C12=\"&Pausa\"\n02000C13=\"&Continuar\"\n\n02000C20=\"Pausado\"\n\n02000C30=\"¿Está seguro de que desea cancelar?\"\n\n; Compress dialog\n02000D00=\"Añadir al archivo\"\n02000D01=\"&Archivo:\"\n02000D02=\"M&odo de actualización:\"\n02000D03=\"&Formato de archivo:\"\n02000D04=\"&Tipo de compresión:\"\n02000D05=\"Crear archivo &compacto\"\n02000D06=\"&Parámetros:\"\n02000D07=\"Opciones\"\n02000D08=\"Crear archivo SF&X (auto-extraíble)\"\n02000D09=\"Multi&hilo\"\n02000D0A=\"Encriptar &nombres de fichero\"\n02000D0B=\"Nive&l de Compresión:\"\n02000D0C=\"Tamaño de &Diccionario:\"\n02000D0D=\"Tama&ño de la Palabra:\"\n02000D0E=\"Memoria usada para Comprimir:\"\n02000D0F=\"Memoria usada para Descomprimir:\"\n02000D10=\"Encriptación\"\n02000D11=\"Método de &Encriptación:\"\n02000D12=\"Número de hilos de CPU:\"\n02000D13=\"Tamaño de bloque compacto:\"\n02000D14=\"No Compacto\"\n02000D15=\"Sin Límite\"\n02000D16=\"Comprimir archivos abiertos para escritura\"\n\n02000D40=\"Partir en fra&gmentos, bytes:\"\n02000D41=\"Tamaño de fragmento incorrecto\"\n02000D42=\"Tamaño de fragmento especificado: {0} bytes.\\n¿Está seguro que desea dividir el archivo en fragmentos de dicho tamaño?\"\n\n02000D81=\"Sin compresión\"\n02000D82=\"Normal\"\n02000D83=\"Máxima\"\n02000D84=\"Rápida\"\n02000D85=\"Más rápida\"\n02000D86=\"Ultra\"\n\n02000D90=\"Explorar\"\n\n02000DA1=\"Añadir y sustituir archivos\"\n02000DA2=\"Actualizar y añadir archivos\"\n02000DA3=\"Sólo actualizar archivos\"\n02000DA4=\"Sincronizar archivos\"\n\n02000DB1=\"Todos los archivos\"\n\n02000DC0=\"Comprimiendo\"\n\n; Columns dialog\n02000E00=\"Columnas\"\n02000E01=\"Seleccione las columnas que quiere que estén visibles en este modo. Use las teclas AvPg y RePg organizar las columnas como quiera.\"\n02000E02=\"La columna elegida debe tener\"\n02000E03=\"pixels.\"\n\n02000E10=\"Mover hacia &arriba\"\n02000E11=\"Mover hacia a&bajo\"\n02000E12=\"&Mostrar\"\n02000E13=\"&Esconder\"\n02000E14=\"Fijar\"\n\n02000E81=\"Título\"\n02000E82=\"Ancho\"\n\n; Testing\n02000F90=\"Probando\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&Archivo\"\n03000103=\"&Editar\"\n03000104=\"&Ver\"\n03000105=\"&Herramientas\"\n03000106=\"Ay&uda\"\n03000107=\"&Favoritos\"\n\n; File\n03000210=\"&Abrir\"\n03000211=\"Abrir &dentro\"\n03000212=\"Abrir &fuera\"\n03000220=\"&Ver\"\n03000221=\"&Editar\"\n03000230=\"Re&nombrar\"\n03000231=\"&Copiar a...\"\n03000232=\"&Mover a...\"\n03000233=\"&Borrar\"\n03000240=\"&Propiedades\"\n03000241=\"Comen&tario\"\n03000242=\"Suma de verificación\"\n03000250=\"Crear carpeta\"\n03000251=\"Crear archivo\"\n03000260=\"&Salir\"\n03000270=\"Di&vidir archivo...\"\n03000271=\"C&ombinar archivos...\"\n\n; Edit\n03000310=\"&Deshacer\"\n03000311=\"&Rehacer\"\n03000320=\"Cor&tar\"\n03000321=\"&Copiar\"\n03000322=\"&Pegar\"\n03000323=\"&Borrar\"\n03000330=\"Seleccionar &todo\"\n03000331=\"Deseleccionar todo\"\n03000332=\"&Invertir selección\"\n03000333=\"Seleccionar...\"\n03000334=\"Deseleccionar...\"\n03000335=\"Seleccionar por tipo\"\n03000336=\"Deseleccionar por tipo\"\n\n; View\n03000410=\"Iconos g&randes\"\n03000411=\"&Iconos pequeños\"\n03000412=\"&Lista\"\n03000413=\"&Detalles\"\n03000420=\"Desordenado\"\n03000430=\"Abrir directorio raíz\"\n03000431=\"Un directorio arriba\"\n03000432=\"Historia de carpetas...\"\n03000440=\"&Actualizar\"\n03000449=\"Vista plana (Flat view)\"\n03000450=\"&2 paneles\"\n03000451=\"&Barras de Herramientas\"\n03000460=\"Barra de Herramientas 'Archivo'\"\n03000461=\"Barras de Herramientas Estándar\"\n03000462=\"Botones grandes\"\n03000463=\"Mostrar Texto en los Botones\"\n\n; Tools\n03000510=\"&Opciones...\"\n03000511=\"&Pruebas (Benchmark)\"\n\n; Help\n03000610=\"&Contenido...\"\n03000620=\"&Acerca de 7-Zip...\"\n\n; Favorites\n03000710=\"&Añadir carpeta a favoritos como\"\n03000720=\"Agregar a favoritos\"\n\n; Options Dialog\n\n03010000=\"Opciones\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Opciones...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Asociar 7-Zip con:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Propiedades\"\n03010401=\"Mostrar el ítem \\\"..\\\"\"\n03010402=\"Mostrar iconos propios\"\n03010410=\"Mostrar menú del sistema\"\n03010420=\"&Seleccionar fila(s) entera(s)\"\n03010421=\"Mostrar &Cuadrícula\"\n03010430=\"Modo de selección &alternativo\"\n03010440=\"Usar páginas &grandes de memoria\"\n\n; Strings\n\n03020201=\"Copiar\"\n03020202=\"Mover\"\n03020203=\"Copiar a:\"\n03020204=\"Mover a:\"\n03020205=\"Copiando...\"\n03020206=\"Moviendo...\"\n03020207=\"No se pueden mover o copiar elementos de este tipo de carpetas.\"\n03020208=\"Operación no permitida.\"\n03020209=\"Seleccione la carpeta de destino\"\n\n03020210=\"Confirmar borrado de archivo\"\n03020211=\"Confirmar borrado de carpeta\"\n03020212=\"Confirmar borrado de ficheros múltiples\"\n03020213=\"¿Está seguro de querer borrar '{0}'?\"\n03020214=\"¿Está seguro de querer borrar la carpeta '{0}' y todo su contenido?\"\n03020215=\"¿Está seguro de querer borrar estos {0} elementos?\"\n03020216=\"Borrando...\"\n03020217=\"Error borrando fichero o carpeta\"\n\n03020220=\"Renombrando...\"\n03020221=\"Error renombrando fichero o carpeta\"\n03020222=\"Confirmar copia de ficheros\"\n03020223=\"¿Está seguro que desea copiar los ficheros al archivo\"\n\n03020230=\"Crear carpeta\"\n03020231=\"Nombre de carpeta:\"\n03020232=\"Carpeta nueva\"\n03020233=\"Error creando carpeta\"\n\n03020240=\"Crear archivo\"\n03020241=\"Nombre de archivo:\"\n03020242=\"Archivo nuevo\"\n03020243=\"Error creando archivo\"\n\n03020250=\"Seleccionar\"\n03020251=\"Deseleccionar\"\n03020252=\"Máscara:\"\n\n03020260=\"Historial de carpetas\"\n\n03020280=\"El fichero '{0}' ha sido modificado.\\n¿Quiere actualizarlo en el archivo?\"\n03020281=\"No puede actualizarse el fichero\\n'{0}'\"\n03020282=\"No puede ejecutarse el editor.\"\n03020283=\"Abriendo...\"\n\n03020290=\"Comentario\"\n03020291=\"&Comentario:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Mi PC\"\n03020301=\"Entorno de red\"\n\n03020400=\"Agregar\"\n03020401=\"Extraer\"\n03020402=\"Probar\"\n\n03020420=\"Copiar\"\n03020421=\"Mover\"\n03020422=\"Borrar\"\n03020423=\"Información\"\n\n03020500=\"Dividir Archivo\"\n03020501=\"Di&vidir a:\"\n03020510=\"Dividiendo...\"\n03020520=\"Confirmar División\"\n03020521=\"¿Está seguro que desea dividir el archivo en {0} partes?\"\n03020522=\"El tamaño de los fragmentos debe ser menor que el del archivo original\"\n\n03020600=\"Combinar Archivos\"\n03020601=\"&Combinar a:\"\n03020610=\"Combinando...\"\n03020620=\"Seleccione solamente el primer archivo\"\n\n03020710=\"Calculando suma de verificación...\"\n03020720=\"Suma de verificación (CRC)\"\n03020721=\"CRC de los datos:\"\n03020722=\"CRC de los datos y nombres:\"\n\n03020800=\"Buscando...\"\n\n03020900=\"Propiedades\"\n\n; Computer\n03031100=\"Espacio total\"\n03031101=\"Espacio libre\"\n03031102=\"Tamaño clúster\"\n03031103=\"Etiqueta\"\n\n; Network\n03031200=\"Nombre local\"\n03031201=\"Proveedor\"\n\n; Benchmark Dialog\n\n03080000=\"Pruebas (Benchmark)\"\n03080001=\"Uso de Memoria:\"\n03080002=\"Compresión\"\n03080003=\"Descompresión\"\n03080004=\"Velocidad\"\n03080005=\"Tasa\"\n03080006=\"Tasa Total\"\n03080007=\"Actual\"\n03080008=\"Resultante\"\n03080009=\"Pasos:\"\n0308000A=\"Errores:\"\n0308000B=\"Uso de CPU\"\n0308000C=\"Resultante / Uso\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/et.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.07 beta\n; Eesti keelde on tõlkinud Kaupo Suviste\n; Täiendas Mihkel Tõnnov\n;\n;\n;\n;\n\n00000000=\"Estonian\"\n00000001=\"eesti keel\"\n00000002=\"37\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zipi suvandid\"\n\n; Info Page\n01000100=\"Teave 7-Zipi kohta\"\n01000103=\"7-Zip on vaba tarkvara. Kuid kui soovite toetada 7-Zipi arendamist, siis saate programmi registreerida.\\n\\n7-Zipi Eesti koduleht:\\nhttp://www.hot.ee/somberg/7zip.html\"\n01000105=\"Registreeri\"\n\n; Folders Page\n01000200=\"Kaustad\"\n01000210=\"&Töökaust\"\n01000211=\"&Süsteemi ajutiste failide kaust\"\n01000212=\"&Praegune kaust\"\n01000213=\"&Kasutaja määratud:\"\n01000214=\"Kasuta ainult irddraivide puhul\"\n\n01000281=\"Määrake ajutiste arhiivifailide asukoht.\"\n\n; System Page\n01000300=\"Süsteem\"\n01000301=\"Integreeri 7-Zip kesta hüpikmenüüsse\"\n01000302=\"Kaskaad-hüpikmenüü\"\n01000310=\"Hüpikmenüü käsud:\"\n\n; Language Page\n01000400=\"Keel\"\n01000401=\"Keel:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zipi käsud\"\n02000103=\"Ava arhiiv\"\n02000104=\"Avab valitud arhiivi.\"\n02000105=\"Ekstrakti failid...\"\n02000106=\"Ekstraktib failid valitud arhiivist.\"\n02000107=\"Lisa arhiivi...\"\n02000108=\"Lisab valitud üksused arhiivi.\"\n02000109=\"Testi arhiivi\"\n0200010A=\"Testib valitud arhiivi terviklust.\"\n0200010B=\"Ekstrakti siia\"\n0200010C=\"Ekstraktib failid valitud arhiivist praegusesse kausta.\"\n0200010D=\"Ekstrakti kausta {0}\"\n0200010E=\"Ekstraktib failid alamkausta.\"\n0200010F=\"Lisa arhiivi {0}\"\n02000110=\"Lisab valitud üksused arhiivi.\"\n02000111=\"Tihenda ja meili...\"\n02000112=\"Tihendab valitud üksused arhiiviks ja saadab arhiivi e-postiga.\"\n02000113=\"Tihenda arhiiviks {0} ja meili\"\n02000114=\"Tihendab valitud üksused arhiiviks ja saadab arhiivi e-postiga.\"\n\n02000140=\"<Kaust>\"\n02000141=\"<Arhiiv>\"\n\n; Properties\n02000203=\"Tee\"\n02000204=\"Nimi\"\n02000205=\"Laiend\"\n02000206=\"Kaust\"\n02000207=\"Maht\"\n02000208=\"Maht tihendatult\"\n02000209=\"Atribuudid\"\n0200020A=\"Loodud\"\n0200020B=\"Avatud\"\n0200020C=\"Muudetud\"\n0200020D=\"Ühtne\"\n0200020E=\"Kommenteeritud\"\n0200020F=\"Krüptitud\"\n02000210=\"Jupitatud enne\"\n02000211=\"Jupitatud pärast\"\n02000212=\"Sõnastik\"\n02000213=\"CRC\"\n02000214=\"Tüüp\"\n02000215=\"Anti\"\n02000216=\"Meetod\"\n02000217=\"Süsteem\"\n02000218=\"Failisüsteem\"\n02000219=\"Kasutaja\"\n0200021A=\"Rühm\"\n0200021B=\"Plokk\"\n0200021C=\"Kommentaar\"\n0200021D=\"Koht\"\n\n; Status bar\n02000301=\"{0} üksus(t) valitud\"\n02000302=\"{0} üksus(t)\"\n\n; List Context Menu\n02000401=\"&Veerud...\"\n\n02000411=\"&Ava\"\n02000412=\"&Ekstrakti...\"\n\n; ToolBar\n02000501=\"Ekstrakti\"\n\n; Messages\n02000601=\"Selle arhiivi värskendamistoiminguid ei toetata.\"\n02000602=\"Ei saa värskendada arhiivi {0}\"\n02000603=\"Ei saa luua kausta {0}\"\n02000604=\"Programm ei toeta faili vormingut.\"\n02000605=\"Tõrge\"\n02000606=\"Liiga palju üksusi.\"\n02000607=\"Selle failinime laiendiga pole seostatud ühtki rakendust.\"\n02000608=\"Vigu ei leitud.\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Jah\"\n02000707=\"Kõigile j&ah\"\n02000709=\"&Ei\"\n0200070B=\"Kõigile e&i\"\n\n02000710=\"Loobu\"\n02000711=\"&Loobu\"\n02000713=\"&Sulge\"\n02000714=\"Seiska\"\n02000715=\"Restardi\"\n\n02000720=\"Spikker\"\n\n; Extract dialog\n02000800=\"Ekstraktimine\"\n02000801=\"&Ekstrakti kausta:\"\n02000802=\"&Parool\"\n\n02000810=\"Teed\"\n02000811=\"&Täielikud teenimed\"\n02000812=\"Su&htelised teenimed\"\n02000813=\"Teenime&deta\"\n\n02000820=\"Ülekirjutus\"\n02000821=\"Küsi e&nne ülekirjutamist\"\n02000822=\"Ki&rjuta küsimata üle\"\n02000823=\"&Jäta olemasolevad failid vahele\"\n02000824=\"Nimeta a&utomaatselt ümber\"\n02000825=\"Nimeta &olemasolevad f. autom. ümber\"\n\n02000830=\"Failid\"\n02000831=\"&Valitud failid\"\n02000832=\"&Kõik failid\"\n\n02000881=\"Määrake ekstraktitud failide asukoht.\"\n\n02000890=\"ekstraktitud\"\n\n; Overwrite dialog\n02000900=\"Failiasenduse kinnitamine\"\n02000901=\"Sihtkaust juba sisaldab töödeldavat faili.\"\n02000902=\"Kas soovite asendada olemasoleva faili\"\n02000903=\"selle failiga?\"\n\n02000911=\"Nimeta a&utomaatselt ümber\"\n\n02000982=\"{0} baiti\"\n02000983=\"muudetud\"\n\n; Messages dialog\n02000A00=\"Diagnostikateated\"\n\n02000A80=\"Teade\"\n\n02000A91=\"Toetuseta tihendusmeetod failile {0}.\"\n02000A92=\"Andmeviga failis {0}. Fail on rikutud.\"\n02000A93=\"Tsükkelkoodkontroll (CRC) failis {0} nurjus. Fail on rikutud.\"\n\n; Password dialog\n02000B00=\"Parooli sisestamine\"\n02000B01=\"Sisestage parool:\"\n02000B02=\"&Kuva parool\"\n\n; Progress dialog\n02000C00=\"Töötlemine\"\n02000C01=\"Kulunud aeg:\"\n02000C02=\"Järelejäänud aeg:\"\n02000C03=\"Maht:\"\n02000C04=\"Kiirus:\"\n\n02000C10=\"&Taustal\"\n02000C11=\"&Esiplaanile\"\n02000C12=\"&Paus\"\n02000C13=\"&Jätka\"\n\n02000C20=\"Pausiks peatatud\"\n\n02000C30=\"Kas soovite kindlasti loobuda?\"\n\n; Compress dialog\n02000D00=\"Arhiivi lisamine\"\n02000D01=\"&Arhiiv:\"\n02000D02=\"Värskend&usrežiim:\"\n02000D03=\"Arhiivi&vorming:\"\n02000D04=\"Tihendus&meetod:\"\n02000D05=\"&Loo ühtne arhiiv\"\n02000D06=\"Pa&rameetrid:\"\n02000D07=\"Suvandid\"\n02000D08=\"Loo is&eavanev arhiiv\"\n02000D09=\"Hargtöötlus\"\n02000D0A=\"Krüpti faili&nimed\"\n02000D0B=\"&Tihendusaste:\"\n02000D0C=\"Sõnaraamatu ma&ht:\"\n02000D0D=\"&Sõna maht:\"\n02000D0E=\"Mälu hõivatus tihendamisel:\"\n02000D0F=\"Mälu hõivatus hõrendamisel:\"\n\n02000D40=\"&Jupita köideteks (baitides):\"\n\n02000D81=\"Tihenduseta\"\n02000D82=\"Normaaltihendus\"\n02000D83=\"Maksimaaltihendus\"\n02000D84=\"Kiirtihendus\"\n02000D85=\"Kiireim tihendus\"\n02000D86=\"Ultratihendus\"\n\n02000D90=\"Sirvi\"\n\n02000DA1=\"Lisa ja asenda failid\"\n02000DA2=\"Värskenda ja lisa failid\"\n02000DA3=\"Värskenda olemasolevad failid\"\n02000DA4=\"Sünkrooni failid\"\n\n02000DB1=\"Kõik failid\"\n\n02000DC0=\"tihendatud\"\n\n; Columns dialog\n02000E00=\"Veerud\"\n02000E01=\"Märkige veerud, mida soovite selles kaustas kuvada. Soovitud järjestusse saate veerud seada nuppude Nihuta üles ja Nihuta alla abil.\"\n02000E02=\"Valitud veerg peaks olema\"\n02000E03=\"pi&kslit lai.\"\n\n02000E10=\"Ni&huta üles\"\n02000E11=\"Nihuta &alla\"\n02000E12=\"K&uva\"\n02000E13=\"&Peida\"\n02000E14=\"Sea\"\n\n02000E81=\"Tiitel\"\n02000E82=\"Laius\"\n\n; Testing\n02000F90=\"Testimine\"\n\n\n; File Manager\n\n03000000=\"7-Zipi failihaldur\"\n\n; Menu\n03000102=\"&Fail\"\n03000103=\"&Redigeeri\"\n03000104=\"&Vaade\"\n03000105=\"&Tööriistad\"\n03000106=\"&Spikker\"\n03000107=\"&Lemmikud\"\n\n; File\n03000210=\"&Ava\"\n03000211=\"Ava s&ees\"\n03000212=\"Ava väljasp&ool\"\n03000220=\"Vaat&ur\"\n03000221=\"&Redigeeri\"\n03000230=\"&Nimeta ümber\"\n03000231=\"&Kopeeri asukohta...\"\n03000232=\"&Teisalda asukohta...\"\n03000233=\"Ku&stuta\"\n03000240=\"Atri&buudid\"\n03000241=\"Ko&mmentaar\"\n03000250=\"Loo kaust\"\n03000251=\"Loo fail\"\n03000260=\"&Välju\"\n03000270=\"&Jupita fail...\"\n03000271=\"Ü&henda failid...\"\n\n; Edit\n03000310=\"&Võta tagasi\"\n03000311=\"&Tee uuesti\"\n03000320=\"&Lõika\"\n03000321=\"&Kopeeri\"\n03000322=\"Klee&bi\"\n03000323=\"Ku&stuta\"\n03000330=\"V&ali kõik\"\n03000331=\"Tühista kõik valikud\"\n03000332=\"&Pööra valik\"\n03000333=\"Vali...\"\n03000334=\"Tühista valik...\"\n03000335=\"Vali tüübi järgi\"\n03000336=\"Tühista tüübi järgi valik\"\n\n; View\n03000410=\"&Suured ikoonid\"\n03000411=\"Väi&kesed ikoonid\"\n03000412=\"&Loend\"\n03000413=\"Üksikasja&d\"\n03000420=\"Sortimata\"\n03000430=\"Ava juurkaust\"\n03000431=\"Taseme võrra üles\"\n03000432=\"Kaustaajalugu...\"\n03000440=\"&Värskenda\"\n03000450=\"&2 paani\"\n03000451=\"&Tööriistaribad\"\n03000460=\"Arhiiviriistariba\"\n03000461=\"Standardnupuriba\"\n03000462=\"Suured nupud\"\n03000463=\"Kuva nupusildid\"\n\n; Tools\n03000510=\"&Häälestus...\"\n03000511=\"&Jõudlustest\"\n\n; Help\n03000610=\"&Sisukord...\"\n03000620=\"&Teave 7-Zipi kohta...\"\n\n; Favorites\n03000710=\"&Lisa kaust lemmikute hulka järjehoidjana\"\n03000720=\"Järjehoidja\"\n\n; Options Dialog\n\n03010000=\"Häälestus\"\n\n; Plugins\n03010100=\"Pluginad\"\n03010101=\"&Pluginad:\"\n03010110=\"Suvandid...\"\n\n; Edit\n03010200=\"Redaktor\"\n03010201=\"&Redaktor:\"\n\n; System\n03010300=\"Süsteem\"\n03010302=\"Seosta 7-Zip laienditega:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Sätted\"\n03010401=\"Kuva element \\\"..\\\"\"\n03010402=\"Kuva tegelikud failiikoonid\"\n03010410=\"Kuva süsteemimenüü\"\n03010420=\"&Vali terve rida\"\n03010421=\"Kuva &ruudujooned\"\n\n; Strings\n\n03020201=\"Kopeerimine\"\n03020202=\"Teisaldamine\"\n03020203=\"Kopeeri asukohta:\"\n03020204=\"Teisalda asukohta:\"\n03020205=\"Kopeerimine...\"\n03020206=\"Teisaldamine...\"\n03020207=\"Te ei saa teisaldada või kopeerida üksusi niisugustesse kaustadesse.\"\n03020208=\"Seda toimingut ei toetata.\"\n\n03020210=\"Failikustutuse kinnitamine\"\n03020211=\"Kaustakustutuse kinnitamine\"\n03020212=\"Mitme faili kustutamise kinnitamine\"\n03020213=\"Kas soovite kindlasti kustutada faili {0}?\"\n03020214=\"Kas soovite kindlasti kustutada kausta {0} ja kogu selle sisu?\"\n03020215=\"Kas soovite kindlasti kustutada need {0} üksust?\"\n03020216=\"Kustutamine...\"\n03020217=\"Tõrge faili või kausta kustutamisel\"\n\n03020220=\"Ümbernimetamine...\"\n03020221=\"Tõrge faili või kausta ümbernimetamisel\"\n\n03020230=\"Kausta loomine\"\n03020231=\"Kausta nimi:\"\n03020232=\"Uus kaust\"\n03020233=\"Tõrge kausta loomisel\"\n\n03020240=\"Faili loomine\"\n03020241=\"Faili nimi:\"\n03020242=\"Uus fail\"\n03020243=\"Tõrge faili loomisel\"\n\n03020250=\"Valimine\"\n03020251=\"Valiku tühistamine\"\n03020252=\"Mask:\"\n\n03020260=\"Kaustaajalugu\"\n\n03020280=\"Faili {0} on muudetud.\\nKas soovite selle arhiivis värskendada?\"\n03020281=\"Ei saa värskendada faili\\n{0}\"\n03020282=\"Ei saa käivitada redaktorit.\"\n03020283=\"Avamine...\"\n\n03020290=\"- kommentaar\"\n03020291=\"&Kommentaar:\"\n\n030202A0=\"Süsteem\"\n\n03020300=\"Arvuti\"\n03020301=\"Võrk\"\n\n03020400=\"Lisa\"\n03020401=\"Ekstrakti\"\n03020402=\"Testi\"\n\n03020420=\"Kopeeri\"\n03020421=\"Teisalda\"\n03020422=\"Kustuta\"\n03020423=\"Teave\"\n\n03020500=\"Faili jupitamine\"\n03020501=\"&Jupita asukohta:\"\n03020510=\"Jupitamine...\"\n\n03020600=\"Failide ühendamine\"\n03020601=\"Ü&henda asukohta:\"\n03020610=\"Ühendamine...\"\n\n; Computer\n03031100=\"Kogumaht\"\n03031101=\"Vaba ruum\"\n03031102=\"Klastri suurus\"\n03031103=\"Silt\"\n\n; Network\n03031200=\"Kohalik nimi\"\n03031201=\"Teenusepakkuja\"\n\n; Benchmark Dialog\n\n03080000=\"Jõudlustest\"\n03080001=\"Mälu hõivatus:\"\n03080002=\"Tihendamine\"\n03080003=\"Hõrendamine\"\n03080004=\"Kiirus\"\n03080005=\"Nimijõudlus\"\n03080006=\"Üldine nimijõudlus\"\n03080007=\"Praegune:\"\n03080008=\"Tulemus:\"\n03080009=\"Töötiire:\"\n0308000A=\"Vigu:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/eu.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by Iñigo Salvador Azurmendi\n;\n;\n;\n;\n\n00000000=\"Basque\"\n00000001=\"Euskara\"\n00000002=\"45\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Konfiguraketa\"\n\n; Info Page\n01000100=\"7-Zip-eri buruz\"\n01000103=\"7-Zip software askea da. Hala ere, erregistratuz, 7-Zip garatzen lagundu dezakezu.\"\n01000104=\"Euskarria\"\n01000105=\"Erregistratu\"\n\n; Folders Page\n01000200=\"Karpetak\"\n01000210=\"Laneko &Karpetak\"\n01000211=\"&Sistemaren aldiuneko karpeta\"\n01000212=\"&Unekoa\"\n01000213=\"&Zehaztutakoa:\"\n01000214=\"Erabili unitate eramangarriekin soilik\"\n\n01000281=\"Zehaztu kokaleku bat aldiuneko artxibu fitxategientzako.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Bateratu 7-Zip maskorraren testuinguru menura\"\n01000302=\"Testuinguru menua turrustan\"\n01000310=\"Testuinguru menuaren zerrenda:\"\n\n; Language Page\n01000400=\"Hizkuntza\"\n01000401=\"Hizkuntza:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip aginduak\"\n02000103=\"Artxibua ireki\"\n02000104=\"Aukeratutako artxiboa irekitzen du.\"\n02000105=\"Fitxategiak atera...\"\n02000106=\"Aukeratutako artxibuko fitxategiak ateratzen ditu.\"\n02000107=\"Artxibura erantsi...\"\n02000108=\"Aukeratutako gaiak artxibura eransten ditu.\"\n02000109=\"Artxibua egiaztatu\"\n0200010A=\"Aukeratutako artxibuaren osotasuan egiaztatzen du.\"\n0200010B=\"Atera hona\"\n0200010C=\"Fitxategiak aukeratutako artxibutik uneko karpetara ateratzen ditu.\"\n0200010D=\"Atera {0}-(e)ra\"\n0200010E=\"Atera fitxategiak azpikarpetara.\"\n0200010F=\"Erantsi {0}-(e)ra\"\n02000110=\"Aukeratutako gaiak artxibura eransten ditu.\"\n02000111=\"Konprimatu eta post@z bidali...\"\n02000112=\"Aukeratutako gaiak artxibura konprimatu eta post@ bitartez bidaltzen du.\"\n02000113=\"Konprimatu {0}-(e)ra eta post@z bidali\"\n02000114=\"Aukeratutako gaiak artxibura konprimatu eta post@ bitartez bidaltzen du.\"\n\n02000140=\"<Karpeta>\"\n02000141=\"<Artxibua>\"\n\n; Properties\n02000203=\"Bidea\"\n02000204=\"Izena\"\n02000205=\"Luzapena\"\n02000206=\"Karpeta\"\n02000207=\"Neurria\"\n02000208=\"Neurria konprimatuta\"\n02000209=\"Ezaugarriak\"\n0200020A=\"Sortu\"\n0200020B=\"Atzitua\"\n0200020C=\"Aldatu\"\n0200020D=\"Trinko\"\n0200020E=\"Azalpena\"\n0200020F=\"Zifratuta\"\n02000210=\"Banatu Lehenago\"\n02000211=\"Banatu Ondoren\"\n02000212=\"Hiztegia\"\n02000213=\"CRC\"\n02000214=\"Mota\"\n02000215=\"Anti\"\n02000216=\"Metodoa\"\n02000217=\"Ostalariaren SE\"\n02000218=\"Fitxategi Sistema\"\n02000219=\"Erabiltzailea\"\n0200021A=\"Taldea\"\n0200021B=\"Blokeatu\"\n0200021C=\"Aipamena\"\n0200021D=\"Kokapena\"\n0200021E=\"Bide Aurrizkia\"\n0200021F=\"Karpetak\"\n02000220=\"Fitxategiak\"\n02000221=\"Bertsioa\"\n02000222=\"Bolumena\"\n02000223=\"Bolumen anizkoitza\"\n02000224=\"Kokapen zuzenketa\"\n02000225=\"Estekak\"\n02000226=\"Blokeak\"\n02000227=\"Bolumenak\"\n\n; Status bar\n02000301=\"{0} objektu aukeratuta\"\n02000302=\"{0} objektu\"\n\n02000320=\"Fitxategiak:\"\n02000321=\"Karpetak:\"\n02000322=\"Neurria:\"\n02000323=\"Neurria trinkotuta:\"\n02000324=\"Artxibuak:\"\n\n; List Context Menu\n02000401=\"&Zutabeak...\"\n\n02000411=\"&Ireki\"\n02000412=\"&Atera...\"\n\n; ToolBar\n02000501=\"Atera\"\n\n; Messages\n02000601=\"Eguneraketa eragiketak ez dira onartzen artxibu honekin.\"\n02000602=\"Ezin da {0} artxibua eguneratu\"\n02000603=\"Ezin da '{0}' artxibua sortu\"\n02000604=\"Fitxategia ez da onartutako artxibua.\"\n02000605=\"Akatsa\"\n02000606=\"Gai gehiegi\"\n02000607=\"Ez dago fitxategi luzapen horrekin elkartutako aplikaziorik\"\n02000608=\"Ez dago akatsik\"\n02000609=\"Ezin da '{0}' fitxategia artxibu bezala ireki\"\n0200060A=\"Ezin da da '{0}' zifratutako artxibua ireki. Pasahitz okerra?\"\n\n; Dialogs\n02000702=\"Ados\"\n02000705=\"&Bai\"\n02000707=\"&Guztiari Bai\"\n02000709=\"&Ez\"\n0200070B=\"G&uztiari Ez\"\n\n02000710=\"Uzi\"\n02000711=\"&Utzi\"\n02000713=\"&Itxi\"\n02000714=\"Gelditu\"\n02000715=\"Berrasi\"\n\n02000720=\"Laguntza\"\n\n; Extract dialog\n02000800=\"Atera\"\n02000801=\"Atera &Hona:\"\n02000802=\"Pasahitza\"\n\n02000810=\"Bide modua\"\n02000811=\"Bideizen osoak\"\n02000812=\"Uneko bideizenak\"\n02000813=\"Bideizenik ez\"\n\n02000820=\"Gainidatzi modua\"\n02000821=\"Galdetu gainidatzi aurretik\"\n02000822=\"Gainidatzi abisatu gabe\"\n02000823=\"Jauzi existitzen diren fitxategiak\"\n02000824=\"Berez berrizendatu\"\n02000825=\"Berez berrizendatu existitzen diren fitxategiak\"\n\n02000830=\"Fitxategiak\"\n02000831=\"&Aukeratutako fitxategiak\"\n02000832=\"Fitxategi &Guztiak\"\n\n02000881=\"Zehaztu fitxategiak ateratzeko lekua.\"\n\n02000890=\"Ateratzen\"\n\n; Overwrite dialog\n02000900=\"Onetsi Fitxategi Ordezkapena\"\n02000901=\"Helburu karpetak prozesatutako fitxategia dauka dagoeneko.\"\n02000902=\"Existitzen den fitxategia ordezkatu nahi duzu\"\n02000903=\"beste honekin?\"\n\n02000911=\"&Berez Berrizedatu\"\n\n02000982=\"{0} byte\"\n02000983=\"aldatua\"\n\n; Messages dialog\n02000A00=\"Diagnosi mezuak\"\n\n02000A80=\"Mezua\"\n\n02000A91=\"'{0}'-rentzako onartugabeko konpresio metodoa .\"\n02000A92=\"Datuen akatsa '{0}'-n. Fitxategia hondatuta dago.\"\n02000A93=\"CRC akatsa '{0}'-n. Fitxategia hondatuta dago.\"\n02000A94=\"Datuen akatsa zifratutako '{0}' fitxategian. Pasahitz okerra?\"\n02000A95=\"CRC okerra zifratutako '{0}' fitxategian. Pasahitz okerra?\"\n\n; Password dialog\n02000B00=\"Sartu pasahitza\"\n02000B01=\"Sartu pasahitza:\"\n02000B02=\"&Erakutsi pasahitza\"\n02000B03=\"Pasahitza berriz sartu:\"\n02000B10=\"Pasahitzak ez datoz bat\"\n02000B11=\"Erabili soilik hizki ingelesak, zenbakiak eta karaktere bereziak (!, #, $, ...) pasahitzetan\"\n02000B12=\"Pasahitza luzeegia da\"\n\n; Progress dialog\n02000C00=\"Prozesua\"\n02000C01=\"Irangandako denbora:\"\n02000C02=\"Falta den denbora:\"\n02000C03=\"Neurria:\"\n02000C04=\"Abiadura:\"\n02000C05=\"Prozesatuta:\"\n02000C06=\"Trinkoketa ratioa:\"\n\n02000C10=\"&Atzealdean\"\n02000C11=\"&Aurrealdean\"\n02000C12=\"&Eten\"\n02000C13=\"&Jarraitu\"\n\n02000C20=\"Etenda\"\n\n02000C30=\"Ziur zaude galarazi nahi duzula?\"\n\n; Compress dialog\n02000D00=\"Erantsi artxibura\"\n02000D01=\"&Artxibua:\"\n02000D02=\"&Eguneratzeko modua:\"\n02000D03=\"Artxibu &formatua:\"\n02000D04=\"Konpresio &metodoa:\"\n02000D05=\"Sortu artxibu &Trinkoak\"\n02000D06=\"&Parametroak:\"\n02000D07=\"Aukerak\"\n02000D08=\"Sortu SF&X artxibua\"\n02000D09=\"Harilkatze-anitza\"\n02000D0A=\"Zifratu fitxategi &izenak\"\n02000D0B=\"Konpresio &maila:\"\n02000D0C=\"&Hiztegi neurria:\"\n02000D0D=\"&Hitz neurria:\"\n02000D0E=\"Konpresiorako Memoria erabilera:\"\n02000D0F=\"Deskonpresiorako Memoria erabilera:\"\n02000D10=\"Zifraketa\"\n02000D11=\"Zifraketa metodoa:\"\n02000D12=\"PUZ hari kopurua:\"\n02000D13=\"Bloke solidoaren neurria:\"\n02000D14=\"Ez-solidoa\"\n02000D15=\"Solidoa\"\n02000D16=\"Trinkotu partekatutako fitxategiak\"\n\n02000D40=\"Zatitu &bolumenetan, byte-ak:\"\n02000D41=\"Bolumen zati baliogabea\"\n02000D42=\"Zehaztutako bolumen neurria: {0} byte.\\nZiur zaude artxibua holako bolumenetan zatitu nahi duzula?\"\n\n02000D81=\"Gorde\"\n02000D82=\"Arrunta\"\n02000D83=\"Gehienezkoa\"\n02000D84=\"Azkarra\"\n02000D85=\"Azkarrena\"\n02000D86=\"Ultra\"\n\n02000D90=\"Arakatu\"\n\n02000DA1=\"Erantsi eta ordezkatu fitxategiak\"\n02000DA2=\"Eguneratu eta erantsi fitxategiak\"\n02000DA3=\"Berritu existitzen diren fitxategiak\"\n02000DA4=\"Fitxategiak sinkronizatu\"\n\n02000DB1=\"Fitxategi Guztiak\"\n\n02000DC0=\"Konprimatzen\"\n\n; Columns dialog\n02000E00=\"Zutabeak\"\n02000E01=\"Egiaztatu karpeta honetan ikusgarri egin nahi zenituzkeen zutabeak. Erabili Mugitu Gora eta Mugitu Behera botoiak zutabeak berrantolatzeko.\"\n02000E02=\"Aukeratutako zutabeak izan behar lituzke\"\n02000E03=\"pixel &zabalera.\"\n\n02000E10=\"Mugitu &Gora\"\n02000E11=\"Mugitu &Behera\"\n02000E12=\"&Erakuts\"\n02000E13=\"&Ezkutatu\"\n02000E14=\"Ezarri\"\n\n02000E81=\"Izenburua\"\n02000E82=\"Zabalera\"\n\n; Testing\n02000F90=\"Egiaztatzen\"\n\n\n; File Manager\n\n03000000=\"7-Zip Fitxategi Kudeatzailea\"\n\n; Menu\n03000102=\"&Fitxategia\"\n03000103=\"&Editatu\"\n03000104=\"&Ikusi\"\n03000105=\"&Tresnak\"\n03000106=\"&Laguntza\"\n03000107=\"&Gogokoak\"\n\n; File\n03000210=\"&Ireki\"\n03000211=\"Ireki &Barruan\"\n03000212=\"Ireki &Kanpoaldean\"\n03000220=\"&Ikusi\"\n03000221=\"&Editatu\"\n03000230=\"&Berrizendatu\"\n03000231=\"&Kopiatu Hona...\"\n03000232=\"&Mugitu Hona...\"\n03000233=\"&Ezabatu\"\n03000240=\"&Propietateak\"\n03000241=\"&Azalpena\"\n03000242=\"Kontroleko batura kalkulatu\"\n03000250=\"Karpeta Sortu\"\n03000251=\"Fitxategia Sortu\"\n03000260=\"&Irten\"\n03000270=\"Fitxategia &zatitu...\"\n03000271=\"Fitxategiak E&lkartu...\"\n\n; Edit\n03000310=\"&Desegin\"\n03000311=\"&Berregin\"\n03000320=\"&Ebaki\"\n03000321=\"&Kopiatu\"\n03000322=\"&Itsatsi\"\n03000323=\"E&zabatu\"\n03000330=\"&Guztia Aukeratu\"\n03000331=\"Guztia Ezaukeratu\"\n03000332=\"Aukeraketa &Alderantzikatu\"\n03000333=\"Aukeratu...\"\n03000334=\"Ezaukeratu...\"\n03000335=\"Aukeratu Motaren arabera\"\n03000336=\"Ezaukeratu Motaren arabera\"\n\n; View\n03000410=\"Ikono &Haundiak\"\n03000411=\"Ikono &Txikiak\"\n03000412=\"&Zerrenda\"\n03000413=\"&Xehetasunak\"\n03000420=\"Antolatugabe\"\n03000430=\"Ireki Erroko Karpeta\"\n03000431=\"Maila Bat Gora\"\n03000432=\"Karpeten Historia...\"\n03000440=\"&Freskatu\"\n03000449=\"Ikuspegi laua\"\n03000450=\"&2 Panel\"\n03000451=\"&Tresnabarrak\"\n03000460=\"Fitxategi Tresnabarra\"\n03000461=\"Tresnabarra Estandarra\"\n03000462=\"Botoi Haundiak\"\n03000463=\"Erakutsi Testua Botoietan\"\n\n; Tools\n03000510=\"&Aukerak...\"\n03000511=\"&Erreferentzi puntua (Benchmark)\"\n\n; Help\n03000610=\"&Edukia...\"\n03000620=\"&7-Zip-eri Buruz...\"\n\n; Favorites\n03000710=\"&Erantsi karpeta Gogokoetara honela\"\n03000720=\"Liburumarka\"\n\n; Options Dialog\n\n03010000=\"Aukerak\"\n\n; Plugins\n03010100=\"Pluginak\"\n03010101=\"&Pluginak:\"\n03010110=\"Aukerak...\"\n\n; Edit\n03010200=\"Editorea\"\n03010201=\"&Editorea:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Elkartu 7-Zip hauekin:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Ezarpenak\"\n03010401=\"Erakutsi \\\"..\\\" gaia\"\n03010402=\"Erakutsi benetako fitxategi ikonoak\"\n03010410=\"Erakutsi sistemaren menua\"\n03010420=\"&Lerro oso aukeraketa\"\n03010421=\"Erakutsi &saretaren lerroak\"\n03010430=\"&Ordezko aukeraketa modua\"\n03010440=\"Memoria orrialde &luzeak erabili\"\n\n; Strings\n\n03020201=\"Kopiatu\"\n03020202=\"Mugitu\"\n03020203=\"Kopiatu hona:\"\n03020204=\"Mugitu hona:\"\n03020205=\"Kopiatzen...\"\n03020206=\"Mugitzen...\"\n03020207=\"Ezin dituzu mugitu edo kopiatu gaiak horrelako karpetetan.\"\n03020208=\"Eragiketa ez da onartzen.\"\n03020209=\"Hautatu helburu karpeta.\"\n\n03020210=\"Onetsi Fitxategi Ezabaketa\"\n03020211=\"Onetsi Karpeta Ezabaketa\"\n03020212=\"Onetsi Fitxategi Anitzen Ezabaketa\"\n03020213=\"Ziur zaude '{0}' ezabatu nahi duzula?\"\n03020214=\"Ziur zaude '{0}' karpeta eta bere eduki guztia ezabatu nahi duzula?\"\n03020215=\"Ziur zaude {0} gai hauek ezabatu nahi dituzula?\"\n03020216=\"Ezabatzen...\"\n03020217=\"Akatsa Fitxategia edo Karpeta Ezabatzerakoan\"\n\n03020220=\"Berrizendatzen...\"\n03020221=\"Akatsa Fitxategia edo Karpeta Berrizendatzerakoan\"\n03020222=\"Onetsi Fitxategi Kopiaketa\"\n03020223=\"Ziur zaude fitxategiak artxibura kopiatu nahi dituzula\"\n\n03020230=\"Karpeta Sortu\"\n03020231=\"Karpeta izena:\"\n03020232=\"Karpeta Berria\"\n03020233=\"Akatsa Karpeta Sortzerakoan\"\n\n03020240=\"Fitxategia Sortu\"\n03020241=\"Fitxategi Izena:\"\n03020242=\"Fitxategi Berria\"\n03020243=\"Akatsa Fitxategia Sortzerakoan\"\n\n03020250=\"Aukeratu\"\n03020251=\"Ezaukeratu\"\n03020252=\"Maskara:\"\n\n03020260=\"Karpeten Historia\"\n\n03020280=\"'{0}' fitxategia aldatu egin da.\\nArtxibuan eguneratu nahi duzu?\"\n03020281=\"Ezin da fitxategia eguneratu\\n'{0}'\"\n03020282=\"Ezin da editorea abiatu.\"\n03020283=\"Irekitzen...\"\n\n03020290=\"Azalpena\"\n03020291=\"&Azalpena:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Konputagailua\"\n03020301=\"Sarea\"\n\n03020400=\"Erantsi\"\n03020401=\"Atera\"\n03020402=\"Egiaztatu\"\n\n03020420=\"Kopiatu\"\n03020421=\"Mugitu\"\n03020422=\"Ezabatu\"\n03020423=\"Info\"\n\n03020500=\"Fitxategia Zatitu\"\n03020501=\"&Zatitu hona:\"\n03020510=\"Zatitzen...\"\n03020520=\"Zatiketa berretsi\"\n03020521=\"Ziur zaude fitxategia {0} bolumenetan zatitau nahi duzula?\"\n03020522=\"Bolumen neurria jatorrizko fitxategiarena baino txikiago izan behar da\"\n\n03020600=\"Fitxategiak Elkartu\"\n03020601=\"&Elkartu honekin:\"\n03020610=\"Elkartzen...\"\n03020620=\"Hautau soilik lehenengo fitxategia\"\n\n03020710=\"Kontroleko batura kalkulatzen...\"\n03020720=\"Kontroleko baturaren gaineko informazioa\"\n03020721=\"Datuentzako CRC kontroleko batura:\"\n03020722=\"Datuak eta izenentzako CRC kontroleko batura:\"\n\n03020800=\"Aztertzen...\"\n\n03020900=\"Propietateak\"\n\n; Computer\n03031100=\"Neurri Osoa\"\n03031101=\"Leku Askea\"\n03031102=\"Cluster Neurria\"\n03031103=\"Etiketa\"\n\n; Network\n03031200=\"Bertako Izena\"\n03031201=\"Hornitzailea\"\n\n; Benchmark Dialog\n\n03080000=\"Erreferentzi puntua (Benchmark)\"\n03080001=\"Memoria erabilera:\"\n03080002=\"Konprimatzen\"\n03080003=\"Deskonprimatzen\"\n03080004=\"Abiadura\"\n03080005=\"Balorazioa\"\n03080006=\"Balorazio Osoa\"\n03080007=\"Unekoa\"\n03080008=\"Emaitza\"\n03080009=\"Zuzenak:\"\n0308000A=\"Akatsak:\"\n0308000B=\"PUZ erabilera\"\n0308000C=\"Balioztatze / Erabilera\"\n\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ext.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by Purgossu\n;\n;\n;\n;\n\n00000000=\"Extremaduran\"\n00000001=\"Estremeñu\"\n00000002=\"\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Cunfigurazión de 7-Zip\"\n\n; Info Page\n01000100=\"Azerca e 7-Zip\"\n01000103=\"7-Zip es 'software' libri i a gastus pagus. Peru puei apoyal el desarrollu e 7-Zip meyanti'l rehistru el pograma.\"\n01000104=\"Soporti\"\n01000105=\"Rehistral\"\n\n; Folders Page\n01000200=\"Direhtorius\"\n01000210=\"Direhtoriu e labu&tu\"\n01000211=\"Direhtoriu temporal del &sistema\"\n01000212=\"Direhtoriu &ahtual\"\n01000213=\"&Espezifical:\"\n01000214=\"Usal sólu pa dispositivus estrayíbris\"\n\n01000281=\"Espezifical ruta pa ficherus d'archivus temporalis.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integral 7-Zip nel menú contestual\"\n01000302=\"Menú contestual en cascá\"\n01000310=\"Elementus del menú contestual:\"\n\n; Language Page\n01000400=\"Idioma\"\n01000401=\"Idioma:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comandus de 7-Zip\"\n02000103=\"Abril archivu\"\n02000104=\"Abril archivu selezionáu.\"\n02000105=\"Estrayel ficherus...\"\n02000106=\"Estrayel ficherus del archivu selezionáu.\"\n02000107=\"Añíl al archivu...\"\n02000108=\"Añíl lus elementus selezionáus al archivu.\"\n02000109=\"Comprebal archivu\"\n0200010A=\"Comprebal l'integriá l'archivu selezionáu.\"\n0200010B=\"Estrayel aquina\"\n0200010C=\"Estrayel ficherus del archivu selezionáu nel direhtoriu ahtual.\"\n0200010D=\"Estrayel en {0}\"\n0200010E=\"Estrayel ficherus nun sudirehtoriu.\"\n0200010F=\"Añíl a {0}\"\n02000110=\"Añíl lus elementus selezionaus al archivu.\"\n02000111=\"Comprimil i envial pol correu-e...\"\n02000112=\"Comprimil archivus selezionaus nel ficheru i enbialu pol correu-e.\"\n02000113=\"Comprimil en {0} i enbial pol correu\"\n02000114=\"Comprimil elementus selezionaus nel ficheru i enbialu pol correu-e.\"\n\n02000140=\"<Direhtoriu>\"\n02000141=\"<Archivu>\"\n\n; Properties\n02000203=\"Ruta\"\n02000204=\"Nombri\"\n02000205=\"Estensión\"\n02000206=\"Direhtoriu\"\n02000207=\"Tamañu\"\n02000208=\"Tamañu comprimíu\"\n02000209=\"Atributus\"\n0200020A=\"Creáu'l\"\n0200020B=\"Úrtimu azesu\"\n0200020C=\"Moificáu'l\"\n0200020D=\"Sóliu\"\n0200020E=\"Comentáu\"\n0200020F=\"Encrihtáu\"\n02000210=\"Desapartáu enantis\"\n02000211=\"Desapartáu endispués\"\n02000212=\"Izionariu\"\n02000213=\"CRC\"\n02000214=\"Tipu\"\n02000215=\"Anti\"\n02000216=\"Métou\"\n02000217=\"S.O. d'orihin\"\n02000218=\"Sistema d'archivus\"\n02000219=\"Usuariu\"\n0200021A=\"Grupu\"\n0200021B=\"Broqui\"\n0200021C=\"Comentariu\"\n0200021D=\"Posición\"\n0200021E=\"Prefiju la ruta\"\n0200021F=\"Direhtorius\"\n02000220=\"Ficherus\"\n02000221=\"Versión\"\n02000222=\"Volumin\"\n02000223=\"Multivolumin\"\n02000224=\"'Offset'\"\n02000225=\"Enlazis\"\n02000226=\"Broquis\"\n02000227=\"Volúmenis\"\n\n; Status bar\n02000301=\"{0} elementu(s) selezionaus\"\n02000302=\"{0} elementu(s)\"\n\n02000320=\"Ficherus:\"\n02000321=\"Direhtorius:\"\n02000322=\"Tamañu:\"\n02000323=\"Tamañu comprimíu:\"\n02000324=\"Archivus:\"\n\n; List Context Menu\n02000401=\"&Colunas...\"\n\n02000411=\"&Abril\"\n02000412=\"&Estrayel...\"\n\n; ToolBar\n02000501=\"Estrayel\"\n\n; Messages\n02000601=\"Nu se puei ahtualizal esti tipu d'archivu.\"\n02000602=\"Nu s'á puíu ahtualizal l'archivu {0}\"\n02000603=\"Nu s'á puíu creal el direhtoriu '{0}'\"\n02000604=\"Tipu d'archivu nu soportáu.\"\n02000605=\"Yerru\"\n02000606=\"Elementus en demasía\"\n02000607=\"Nu ái nengún pograma asoziáu con esta estensión d'archivu\"\n02000608=\"Sin yerrus\"\n02000609=\"Nu s'á puíu abril '{0}' comu archivu\"\n0200060A=\"Nu s'a puíu abril l'archivu encrihtáu '{0}'. Conseña yerrónia?\"\n\n; Dialogs\n02000702=\"Azehtal\"\n02000705=\"&Sí\"\n02000707=\"Sí &a tó\"\n02000709=\"&Nu\"\n0200070B=\"Nu a &tó\"\n\n02000710=\"Canzelal\"\n02000711=\"&Canzelal\"\n02000713=\"&Fechal\"\n02000714=\"Paral\"\n02000715=\"Reinizial\"\n\n02000720=\"Ayúa\"\n\n; Extract dialog\n02000800=\"Estrayel\"\n02000801=\"E&strayel a:\"\n02000802=\"Conseña\"\n\n02000810=\"Móu e ruta\"\n02000811=\"Ruta compreta\"\n02000812=\"Ruta relativa\"\n02000813=\"Sin ruta\"\n\n02000820=\"Móu e sobrescrebil\"\n02000821=\"Preguntal enantis\"\n02000822=\"Sobrescrebil sin preguntal\"\n02000823=\"Conserbal ficherus esistentis\"\n02000824=\"Renombral de horma automática\"\n02000825=\"Autu-renombral ficherus esistentis\"\n\n02000830=\"Ficherus\"\n02000831=\"Ficherus &selezionaus\"\n02000832=\"&Tolos ficherus\"\n\n02000881=\"Espezifical destinu pa lus ficherus estrayíus.\"\n\n02000890=\"Estrayendu\"\n\n; Overwrite dialog\n02000900=\"Confirmal remprazu de ficherus\"\n02000901=\"El direhtoriu ya contieni un ficheru del mesmu nombri.\"\n02000902=\"Sustituyil el ficheru esistenti\"\n02000903=\"pol esti otru?\"\n\n02000911=\"Eccambial nombri e horma a&utomática\"\n\n02000982=\"{0} 'bytes'\"\n02000983=\"moificáu'l\"\n\n; Messages dialog\n02000A00=\"Mensahis de dianósticu\"\n\n02000A80=\"Mensahi\"\n\n02000A91=\"Métou e compresión nu soportáu '{0}'.\"\n02000A92=\"Yerru e datus en '{0}'. El ficheru está changarráu.\"\n02000A93=\"Yerru e CRC '{0}'. El ficheru stá changarráu.\"\n02000A94=\"Yerru e datus nel ficheru encrihtáu '{0}'. Conseña yerrónia?\"\n02000A95=\"Yerru e CRC nel ficheru encrihtáu '{0}'. Conseña yerrónia?\"\n\n; Password dialog\n02000B00=\"Introuzil conseña\"\n02000B01=\"Introuzil conseña:\"\n02000B02=\"Mue&stral conseña\"\n02000B03=\"Repitil conseña:\"\n02000B10=\"Las cunseñas nu coincín\"\n02000B11=\"Usi sólu letras ingresas, númirus i caráhteris especialis (!, #, $, ...) pala conseña\"\n02000B12=\"La conseña tieni largura'n demasía\"\n\n; Progress dialog\n02000C00=\"Progresu\"\n02000C01=\"Tiempu trascurríu:\"\n02000C02=\"Tiempu restanti:\"\n02000C03=\"Tamañu total:\"\n02000C04=\"Veloziá:\"\n02000C05=\"Prucesáu:\"\n02000C06=\"Tasa e compresión:\"\n\n02000C10=\"Se&gundu pranu\"\n02000C11=\"&Primel pranu\"\n02000C12=\"&Paral\"\n02000C13=\"A&continal\"\n\n02000C20=\"Paráu\"\n\n02000C30=\"De siguru que quieri canzelal la operazión?\"\n\n; Compress dialog\n02000D00=\"Añíl a archivu\"\n02000D01=\"&Archivu:\"\n02000D02=\"&Móu d'ahtualizazión:\"\n02000D03=\"&Hormatu d'archivu:\"\n02000D04=\"Mé&tou e compresión:\"\n02000D05=\"&Creal archivu sóliu\"\n02000D06=\"&Parámetrus:\"\n02000D07=\"Ozionis\"\n02000D08=\"Creal archivu 'SF&X'\"\n02000D09=\"Multi-ilu\"\n02000D0A=\"Encrihtal &nombris de ficheru\"\n02000D0B=\"Nive&l de compresión:\"\n02000D0C=\"Tamañu el i&zionariu:\"\n02000D0D=\"Tama&ñu e parabra:\"\n02000D0E=\"Usu e memoria pa compresión:\"\n02000D0F=\"Usu e memoria pa dehcompresión:\"\n02000D10=\"Encrihtazión\"\n02000D11=\"Métou encrihtazión:\"\n02000D12=\"Númiru ilus e la UCP:\"\n02000D13=\"Tamañu el broqui sóliu:\"\n02000D14=\"Nu sóliu\"\n02000D15=\"Sóliu\"\n02000D16=\"Comprimil ficherus compartíus\"\n\n02000D40=\"Desapartal en &balandronis, 'bytes':\"\n02000D41=\"Tamañu el volumin nu váliu\"\n02000D42=\"Introuza'l tamañu el volumin: {0} 'bytes'.\\nDe siguru que quieri desapartal l'archivu'n tantus volúmenis?\"\n\n02000D81=\"Almacenal\"\n02000D82=\"Normal\"\n02000D83=\"Másima\"\n02000D84=\"Respahila\"\n02000D85=\"La más respahila\"\n02000D86=\"Ultra\"\n\n02000D90=\"Esproral\"\n\n02000DA1=\"Añíl i remprazal ficherus\"\n02000DA2=\"Ahtualizal i añíl ficherus\"\n02000DA3=\"Ahtualizal sólu ficherus esistentis\"\n02000DA4=\"Sincronizal ficherus\"\n\n02000DB1=\"Tolos ficherus\"\n\n02000DC0=\"Comprimiendu\"\n\n; Columns dialog\n02000E00=\"Colunas\"\n02000E01=\"Selezioni las colunas que quiera muestral n'esti direhtoriu. Pa reordinal las colunas usi las tecras AvPg o RePg.\"\n02000E02=\"La coluna selezioná debi tenel una &anchura e\"\n02000E03=\"'pixels'.\"\n\n02000E10=\"Movel pa &zimará\"\n02000E11=\"Movel pa em&bahu\"\n02000E12=\"Mue&stral\"\n02000E13=\"&Escuendel\"\n02000E14=\"Fihal\"\n\n02000E81=\"Títulu\"\n02000E82=\"Anchura\"\n\n; Testing\n02000F90=\"Comprebandu\"\n\n\n; File Manager\n\n03000000=\"7-Zip - hestol de ficherus\"\n\n; Menu\n03000102=\"&Archivu\"\n03000103=\"&Eital\"\n03000104=\"&Vel\"\n03000105=\"&Herramientas\"\n03000106=\"A&yúa\"\n03000107=\"A&melgaoris\"\n\n; File\n03000210=\"&Abril\"\n03000211=\"Abril &dentru\"\n03000212=\"Abril &huera\"\n03000220=\"&Vel\"\n03000221=\"&Eital\"\n03000230=\"Renom&bral\"\n03000231=\"&Copial a...\"\n03000232=\"&Movel pa...\"\n03000233=\"&Eliminal\"\n03000240=\"P&ropieais\"\n03000241=\"Come&ntariu\"\n03000242=\"Calculal 'checksum'\"\n03000250=\"Creal direhtoriu\"\n03000251=\"Creal ficheru\"\n03000260=\"&Salil\"\n03000270=\"De&sapartal ficheru...\"\n03000271=\"Com&binal ficherus...\"\n\n; Edit\n03000310=\"&Deshadel\"\n03000311=\"&Rehadel\"\n03000320=\"Cor&tal\"\n03000321=\"&Copial\"\n03000322=\"&Pegal\"\n03000323=\"&Eliminal\"\n03000330=\"Selezional &tó\"\n03000331=\"Deselezional tó\"\n03000332=\"&Invertil selezión\"\n03000333=\"Selezional...\"\n03000334=\"Deselezional...\"\n03000335=\"Selezional pol tipu\"\n03000336=\"Deselezional pol tipu\"\n\n; View\n03000410=\"Iconus g&randis\"\n03000411=\"Iconus caquerus\"\n03000412=\"&Listáu\"\n03000413=\"&Detallis\"\n03000420=\"Nu soportáu\"\n03000430=\"Abril direhtoriu raíz\"\n03000431=\"Subil un nivel\"\n03000432=\"Historial de direhtorius...\"\n03000440=\"&Ahtualizal\"\n03000449=\"Vista prana\"\n03000450=\"&2 panelis\"\n03000451=\"Barra e herramien&tas\"\n03000460=\"Barra e heramientas 'archivu'\"\n03000461=\"Barra e heramientas estándal\"\n03000462=\"Botonis grandis\"\n03000463=\"Muestral testu enus botonis\"\n\n; Tools\n03000510=\"&Ozionis...\"\n03000511=\"Pre&ba el patrón de compresión\"\n\n; Help\n03000610=\"&Conteníus...\"\n03000620=\"&Azerca e 7-Zip...\"\n\n; Favorites\n03000710=\"&Añíl direhtoriu a Amelgaoris comu\"\n03000720=\"Amelgaol\"\n\n; Options Dialog\n\n03010000=\"Ozionis\"\n\n; Plugins\n03010100=\"'Plugins'\"\n03010101=\"'&Plugins':\"\n03010110=\"Ozionis...\"\n\n; Edit\n03010200=\"Eitol\"\n03010201=\"&Eitol:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Asozial 7-Zip con hormatus:\"\n03010310=\"'Plugin'\"\n\n; Settings\n03010400=\"Configurazión\"\n03010401=\"Muestral l'elementu \\..\\\"\"\n03010402=\"Muestral icunus propius del ficheru\"\n03010410=\"Muestral menú el sistema\"\n03010420=\"&Selezional fila(s) enteriza(s)\"\n03010421=\"Muestral líneas e la &cuairícula\"\n03010430=\"Móu e selezión &alternativu\"\n03010440=\"Usa&l páhinas de memoria grandis\"\n\n; Strings\n\n03020201=\"Copial\"\n03020202=\"Movel\"\n03020203=\"Copial a:\"\n03020204=\"Movel pa:\"\n03020205=\"Copiandu...\"\n03020206=\"Moviendu...\"\n03020207=\"Nu se puein movel u copial elementus pa esti tipu e direhtorius.\"\n03020208=\"Operazión nu soportá.\"\n03020209=\"Selezional direhtoriu destinu.\"\n\n03020210=\"Confirmal eliminazión del ficheru\"\n03020211=\"Confirmal eliminazión del direhtoriu\"\n03020212=\"Confirmal eliminazión de varius ficherus\"\n03020213=\"De siguru que quieri eliminal '{0}'?\"\n03020214=\"De siguru que quieri eliminal el direhtoriu '{0}' i tol su conteníu?\"\n03020215=\"De siguru que quieri eliminal estus {0} elementus?\"\n03020216=\"Eliminandu...\"\n03020217=\"S'alcuentráu'n yerru al eliminal el ficheru u direhtoriu\"\n\n03020220=\"Renombrandu...\"\n03020221=\"S'alcuentráu'n yerru al renombral el ficheru u direhtoriu\"\n03020222=\"Confirmal copia el ficheru\"\n03020223=\"De siguru que quieri copiar estus ficherus al archivu?\"\n\n03020230=\"Creal direhtoriu\"\n03020231=\"Nombri e direhtoriu:\"\n03020232=\"Nuevu direhtoriu\"\n03020233=\"S'alcuentráu'n yerru al creal el direhtoriu\"\n\n03020240=\"Creal ficheru\"\n03020241=\"Nombri el ficheru:\"\n03020242=\"Nuevu ficheru\"\n03020243=\"S'alcuentráu'n yerru al creal el ficheru\"\n\n03020250=\"Selezional\"\n03020251=\"Deselezional\"\n03020252=\"Máscara:\"\n\n03020260=\"Historial de direhtorius\"\n\n03020280=\"El ficheru '{0}' á síu moificáu.\\nAhtualizalu nel archivu?\"\n03020281=\"Nu s'a puíu ahtualizal l'archivu\\n'{0}'\"\n03020282=\"Nu s'a puíu ehecutal l'eitol.\"\n03020283=\"Abriendu...\"\n\n03020290=\"Comentariu\"\n03020291=\"&Comentariu:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"'Mi PC'\"\n03020301=\"'Entorno de red'\"\n\n03020400=\"Añíl\"\n03020401=\"Estrayel\"\n03020402=\"Comprebal\"\n\n03020420=\"Copial\"\n03020421=\"Movel\"\n03020422=\"Eliminal\"\n03020423=\"Inhormazión\"\n\n03020500=\"Desapartal ficheru\"\n03020501=\"&Desapartal a:\"\n03020510=\"Desapartandu...\"\n03020520=\"Confirmal desapartamientu\"\n03020521=\"De siguru que quieri desapartal el ficheru'n {0} volúmenis?\"\n03020522=\"El tamañu e lus volúmenis debi sel mas caqueru que'l del ficheru orihinal\"\n\n03020600=\"Unil ficherus\"\n03020601=\"&Unil en:\"\n03020610=\"Uniendu...\"\n03020620=\"Selezional sólu'l primel ficheru\"\n\n03020710=\"Calculandu'l 'checksum'...\"\n03020720=\"Inhormazión de 'checksum'\"\n03020721=\"'Checksum' de 'CRC' pala inhormazión:\"\n03020722=\"'Checksum' de 'CRC' pala inhormazión i lus nombris:\"\n\n03020800=\"Escaneandu...\"\n\n03020900=\"Propieais\"\n\n; Computer\n03031100=\"Tamañu total\"\n03031101=\"Espaziu dispunibri\"\n03031102=\"Tamañu el 'cluster'\"\n03031103=\"Etiqueta\"\n\n; Network\n03031200=\"Nombri local\"\n03031201=\"Proveol\"\n\n; Benchmark Dialog\n\n03080000=\"'Benchmark'\"\n03080001=\"Usu e memoria:\"\n03080002=\"Comprimiendu\"\n03080003=\"Comprimiendu\"\n03080004=\"Veloziá\"\n03080005=\"Razón\"\n03080006=\"Razón total\"\n03080007=\"Ahtual\"\n03080008=\"Resurtáu\"\n03080009=\"Pasis:\"\n0308000A=\"Yerrus:\"\n0308000B=\"Usu e CPU\"\n0308000C=\"Razón / Usu\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/fa.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by Edris Naderan\n; Changed and updated by Mehdi Farhadi (since 4.30)\n;\n;\n;\n\n00000000=\"Farsi\"\n00000001=\"فارسی\"\n00000002=\"41\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"پیکربندی ‎7-Zip\"\n\n; Info Page\n01000100=\"درباره ‎7-Zip\"\n01000103=\"برنامه‌ای که در پیش رو دارید یک برنامه مجانی است، اما شما می توانید با پرداخت مبلغی جزئی به توسعه این نرم‌افزار کمک کنید.\"\n01000104=\"پشتيباني\"\n01000105=\"ثبت کردن\"\n\n; Folders Page\n01000200=\"پوشه‌ها\"\n01000210=\"پوشه در حال کار\"\n01000211=\"پوشه موقت سیستم\"\n01000212=\"جاری\"\n01000213=\"تعیین:\"\n01000214=\"فقط برای درایوهای قابل جابجایی استفاده شود\"\n\n01000281=\"جهت ذخیره فایل‌های موقتی مکانی را تعیین کنید.\"\n\n; System Page\n01000300=\"سیستم\"\n01000301=\"نمایش گزینه‌های مربوط به فشرده‌سازی در منوی ویندوز\"\n01000302=\"نمایش همه گزینه‌ها در یک زیرمنو\"\n01000310=\"گزینه‌های منو:\"\n\n; Language Page\n01000400=\"زبان\"\n01000401=\"زبان:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"فرمان‌های ‎7-Zip\"\n02000103=\"بازکردن آرشیو\"\n02000104=\"آرشیو انتخاب شده را باز می‌کند.\"\n02000105=\"استخراج فایل‌ها...\"\n02000106=\"فایل‌ها را از آرشیو انتخاب شده استخراج می‌کند.\"\n02000107=\"افزودن به آرشیو...\"\n02000108=\"گزینه‌های انتخاب شده را به آرشیو اضافه می‌کند.\"\n02000109=\"بررسی آرشیو\"\n0200010A=\"جامعیت آرشیو انتخاب شده را بررسی می‌کند.\"\n0200010B=\"استخراج در اینجا\"\n0200010C=\"فایل‌ها را از آرشیو انتخاب شده به پوشه جاری استخراج می‌کند.\"\n0200010D=\"استخراج به {0}\"\n0200010E=\"فایل‌ها را به زیرپوشه استخراج می‌کند.\"\n0200010F=\"افزودن به {0}\"\n02000110=\"گزینه‌های انتخاب شده را به آرشیو اضافه می‌کند.\"\n02000111=\"فشرده‌سازی و ارسال با ایمیل...\"\n02000112=\"گزینه‌های انتخاب شده را فشرده‌ می‌سازد و آرشیو را توسط ایمیل ارسال می‌کند.\"\n02000113=\"فشرده‌سازی در {0} و ارسال با ایمیل\"\n02000114=\"گزینه‌های انتخاب شده را فشرده‌ می‌سازد و آرشیو را توسط ایمیل ارسال می‌کند.\"\n\n02000140=\"<پوشه>\"\n02000141=\"<آرشیو>\"\n\n; Properties\n02000203=\"مسیر\"\n02000204=\"نام\"\n02000205=\"Extension\"\n02000206=\"پوشه\"\n02000207=\"اندازه\"\n02000208=\"اندازه فشرده\"\n02000209=\"صفات\"\n0200020A=\"ساخته شده\"\n0200020B=\"دستیابی شده\"\n0200020C=\"تغییر یافته\"\n0200020D=\"Solid\"\n0200020E=\"توضیح‌دار\"\n0200020F=\"رمزگذاری شده\"\n02000210=\"قسمت قبلی\"\n02000211=\"قسمت بعدی\"\n02000212=\"لغت‌نامه\"\n02000213=\"CRC\"\n02000214=\"نوع\"\n02000215=\"Anti\"\n02000216=\"روش\"\n02000217=\"سیستم میزبان\"\n02000218=\"سیستم فایل\"\n02000219=\"کاربر\"\n0200021A=\"گروه\"\n0200021B=\"قطعه\"\n0200021C=\"توضيح‌\"\n0200021D=\"مکان\"\n0200021E=\"پيشوند مسير\"\n0200021F=\"پوشه‌ها\"\n02000220=\"فایل‌ها\"\n02000221=\"Version\"\n02000222=\"Volume\"\n02000223=\"Multivolume\"\n02000224=\"Offset\"\n02000225=\"Links\"\n02000226=\"قطعات\"\n02000227=\"Volumes\"\n\n; Status bar\n02000301=\"{0} گزینه انتخاب شده\"\n02000302=\"{0} گزینه\"\n\n02000320=\"فایل‌ها:\"\n02000321=\"پوشه‌ها:\"\n02000322=\"اندازه:\"\n02000323=\"اندازه فشرده:\"\n02000324=\"آرشیو‌ها:\"\n\n; List Context Menu\n02000401=\"ستون‌ها...\"\n\n02000411=\"بازکردن\"\n02000412=\"استخراج...\"\n\n; ToolBar\n02000501=\"استخراج\"\n\n; Messages\n02000601=\"عملیات بروزرسانی برای این آرشیو پشتیبانی نمی‌شود.\"\n02000602=\"بروز رسانی آرشیو {0} ممکن نیست\"\n02000603=\"ایجاد پوشه '{0}' ممکن نیست\"\n02000604=\"اين فایل یک آرشیو پشتیبانی شده نيست.\"\n02000605=\"خطا\"\n02000606=\"تعداد گزینه‌ها بسیار زیاد است\"\n02000607=\"هیچ برنامه‌ای برای باز کردن این فایل منتسب نشده است\"\n02000608=\"خطایی وجود ندارد\"\n02000609=\"فايل '{0}' يك آرشيو شناخته شده نيست\"\n0200060A=\"برنامه قادر به بازكردن آرشيو رمزگذارى شده '{0}' نيست. كلمه عبور اشتباه است؟\"\n\n; Dialogs\n02000702=\"تایید\"\n02000705=\"&بلی\"\n02000707=\"بلی همه را\"\n02000709=\"&خیر\"\n0200070B=\"خیر هیچ کدام\"\n\n02000710=\"انصراف\"\n02000711=\"انصراف\"\n02000713=\"بستن\"\n02000714=\"توقف\"\n02000715=\"اجرای مجدد\"\n\n02000720=\"راهنما\"\n\n; Extract dialog\n02000800=\"استخراج\"\n02000801=\"استخراج به:\"\n02000802=\"کلمه عبور\"\n\n02000810=\"نوع مسیر\"\n02000811=\"نام کامل مسیر\"\n02000812=\"نام مسیر جاری\"\n02000813=\"بدون نام مسیر\"\n\n02000820=\"شيوه جایگزینی\"\n02000821=\"قبل از جایگزینی سوال شود\"\n02000822=\"جایگزینی بدون اخطار\"\n02000823=\"نادیده گرفتن فایل‌های موجود\"\n02000824=\"تغییر نام خودکار\"\n02000825=\"تغییر نام خودکار فایل‌های موجود\"\n\n02000830=\"فایل‌ها\"\n02000831=\"فایل‌های انتخاب شده\"\n02000832=\"همه فایل‌ها\"\n\n02000881=\"مکانی را جهت استخراج فایل‌ها تعیین کنيد.\"\n\n02000890=\"در حال استخراج\"\n\n; Overwrite dialog\n02000900=\"تایید جایگزینی فایل\"\n02000901=\"پوشه مقصد حاوی فایلی با نام فایل در حال پردازش می‌باشد.\"\n02000902=\"آیا شما مایل به جایگزینی این فایل\"\n02000903=\"با این فایل هستید؟\"\n\n02000911=\"تغییر نام خودکار\"\n\n02000982=\"{0} بایت\"\n02000983=\"تغییر کرده در\"\n\n; Messages dialog\n02000A00=\"پیغام‌های تشخيصی\"\n\n02000A80=\"پیغام\"\n\n02000A91=\"روش فشرده‌سازی پشتیبانی نشده برای '{0}'.\"\n02000A92=\"خطای داده‌ها در '{0}'. اين فايل دچار مشكل است.\"\n02000A93=\"خطای CRC در '{0}'. اين فايل دچار مشكل است.\"\n02000A94=\"خطای داده‌ها در فايل رمزگذارى شده '{0}'. كلمه عبور اشتباه است؟\"\n02000A95=\"خطای CRC در فايل رمزگذارى شده '{0}'. كلمه عبور اشتباه است؟\"\n\n; Password dialog\n02000B00=\"کلمه عبور\"\n02000B01=\"کلمه عبور:\"\n02000B02=\"نمایش کلمه عبور\"\n02000B03=\"تكرار كلمه عبور:\"\n02000B10=\"دو كلمه عبور يكسان نيستند\"\n02000B11=\"فقط از حروف انگليسى، اعداد و علامت‌هاى خاص (!، #، $، ...) در كلمه عبور استفاده كنيد\"\n02000B12=\"كلمه عبور خيلی بلند است\"\n\n; Progress dialog\n02000C00=\"پردازش\"\n02000C01=\"زمان سپری شده:\"\n02000C02=\"زمان باقی مانده:\"\n02000C03=\"اندازه:\"\n02000C04=\"سرعت:\"\n02000C05=\"پردازش شده:\"\n02000C06=\"نسبت فشردگى:\"\n\n02000C10=\"پس زمینه\"\n02000C11=\"پیش زمینه\"\n02000C12=\"توقف\"\n02000C13=\"ادامه\"\n\n02000C20=\"متوقف\"\n\n02000C30=\"آیا شما قصد لغو عملیات را دارید؟\"\n\n; Compress dialog\n02000D00=\"افزودن به آرشیو\"\n02000D01=\"آرشیو:\"\n02000D02=\"شيوه بروزرسانی:\"\n02000D03=\"قالب آرشیو:\"\n02000D04=\"روش فشرده‌سازی:\"\n02000D05=\"ایجاد آرشیو يکپارچه (&Solid)\"\n02000D06=\"پارامترها\"\n02000D07=\"تنظیمات\"\n02000D08=\"ایجاد آرشیو قابل اجرا (SF&X)\"\n02000D09=\"Multi-threading\"\n02000D0A=\"رمزگذاری نام فایل‌ها\"\n02000D0B=\"ميزان فشرده‌سازی:\"\n02000D0C=\"اندازه لغت‌نامه:\"\n02000D0D=\"اندازه کلمه:\"\n02000D0E=\"مقدار حافظه لازم جهت فشرده‌سازی:\"\n02000D0F=\"مقدار حافظه لازم جهت استخراج:\"\n02000D10=\"رمزگذاری\"\n02000D11=\"شيوه رمزگذاری:\"\n02000D12=\"Number of CPU threads:\"\n02000D13=\"Solid block size:\"\n02000D14=\"Non-solid\"\n02000D15=\"Solid\"\n02000D16=\"فشرده‌سازی فایل‌هاى در حال استفاده ديگر برنامه‌ها\"\n\n02000D40=\"تقسیم به چندين قسمت، بر حسب بايت:\"\n02000D41=\"اندازه تقسیم نادرست است\"\n02000D42=\"اندازه تقسیم تعيين شده: {0} بايت.\\nآیا شما قصد دارید آرشيو را به قسمتهاى به اين اندازه تقسيم كنيد؟\"\n\n02000D81=\"ذخیره\"\n02000D82=\"متوسط\"\n02000D83=\"حداکثر\"\n02000D84=\"سریع\"\n02000D85=\"خیلی سریع\"\n02000D86=\"مافوق\"\n\n02000D90=\"آدرس‌دهی\"\n\n02000DA1=\"افزودن و جایگزینی فایل‌ها\"\n02000DA2=\"بروزرسانی و افزودن فایل‌ها\"\n02000DA3=\"تازه کردن فایل‌های موجود\"\n02000DA4=\"سنکرون کردن فایل‌ها\"\n\n02000DB1=\"همه فایل‌ها\"\n\n02000DC0=\"فشرده‌سازی\"\n\n; Columns dialog\n02000E00=\"ستون‌ها\"\n02000E01=\"ستون‌هایی را که می‌خواهید نمایش داده شوند انتخاب کنید. از کليدهای انتقال به بالا و پایین برای جابجایی ستون‌ها استفاده کنيد.\"\n02000E02=\"ستون‌ انتخاب شده باید\"\n02000E03=\"پیکسل عرض داشته باشد.\"\n\n02000E10=\"انتقال به بالا\"\n02000E11=\"انتقال به پایین\"\n02000E12=\"نمایش\"\n02000E13=\"مخفی\"\n02000E14=\"Set\"\n\n02000E81=\"عنوان\"\n02000E82=\"عرض\"\n\n; Testing\n02000F90=\"بررسی\"\n\n\n; File Manager\n\n03000000=\"برنامه مدیریت فایل ‎7-Zip\"\n\n; Menu\n03000102=\"فایل\"\n03000103=\"ویرایش\"\n03000104=\"نمایش\"\n03000105=\"ابزارها\"\n03000106=\"راهنما\"\n03000107=\"برگزیده‌ها\"\n\n; File\n03000210=\"باز کردن\"\n03000211=\"باز کردن درونی\"\n03000212=\"باز کردن بیرونی\"\n03000220=\"نمایش\"\n03000221=\"ویرایش\"\n03000230=\"تغییر نام\"\n03000231=\"کپی به...\"\n03000232=\"انتقال به...\"\n03000233=\"حذف\"\n03000240=\"اطلاعات\"\n03000241=\"توضيح\"\n03000242=\"محاسبه checksum\"\n03000250=\"ایجاد پوشه\"\n03000251=\"ایجاد فایل\"\n03000260=\"خروج\"\n03000270=\"تقسیم فایل...\"\n03000271=\"ترکیب فایل‌ها...\"\n\n; Edit\n03000310=\"عقب\"\n03000311=\"جلو\"\n03000320=\"بریدن\"\n03000321=\"کپی\"\n03000322=\"چسباندن\"\n03000323=\"حذف\"\n03000330=\"انتخاب همه\"\n03000331=\"لغو انتخاب‌ها\"\n03000332=\"معکوس كردن انتخاب‌ها\"\n03000333=\"انتخاب...\"\n03000334=\"لغو انتخاب...\"\n03000335=\"انتخاب بر حسب نوع\"\n03000336=\"لغو انتخاب بر حسب نوع\"\n\n; View\n03000410=\"آیکون‌های بزرگ\"\n03000411=\"آیکون‌های کوچک\"\n03000412=\"فهرست‌وار\"\n03000413=\"با جزئیات\"\n03000420=\"نامرتب\"\n03000430=\"باز کردن شاخه اصلی\"\n03000431=\"یک مرحله به بالا\"\n03000432=\"تاریخچه پوشه‌ها...\"\n03000440=\"از نو چیدن\"\n03000449=\"Flat View\"\n03000450=\"2 پانل\"\n03000451=\"منوهای ابزار\"\n03000460=\"منوی ابزار آرشیو\"\n03000461=\"منوی ابزار استانداد\"\n03000462=\"کلید‌های بزرگ\"\n03000463=\"نمایش برچسب کلید‌ها\"\n\n; Tools\n03000510=\"تنظیمات...\"\n03000511=\"سنجش\"\n\n; Help\n03000610=\"محتویات...\"\n03000620=\"درباره ‎7-Zip...\"\n\n; Favorites\n03000710=\"افزودن پوشه به برگزیده‌ها به عنوان\"\n03000720=\"علامت\"\n\n; Options Dialog\n\n03010000=\"تنظیمات\"\n\n; Plugins\n03010100=\"ماژول‌ها\"\n03010101=\"ماژول‌ها:\"\n03010110=\"تنظیمات...\"\n\n; Edit\n03010200=\"ویرایشگر\"\n03010201=\"ویرایشگر:\"\n\n; System\n03010300=\"سیستم\"\n03010302=\"انتساب ‎7-Zip با:\"\n03010310=\"مودول\"\n\n; Settings\n03010400=\"تنظیمات\"\n03010401=\"نمایش گزینه \\\"..\\\"\"\n03010402=\"نمایش آیکون واقعی فایل‌ها\"\n03010410=\"نمایش منوی سیستم\"\n03010420=\"انتخاب سطر به صورت کامل\"\n03010421=\"نمایش خطوط جدولی\"\n03010430=\"شيوه انتخاب جايگزين\"\n03010440=\"استفاده از شیوه حافظه هنگفت\"\n\n; Strings\n\n03020201=\"کپی\"\n03020202=\"انتقال\"\n03020203=\"کپی به:\"\n03020204=\"انتقال به:\"\n03020205=\"در حال کپی...\"\n03020206=\"در حال انتقال...\"\n03020207=\"شما نمی‌توانید گزینه‌هایی را در پوشه خودشان کپی کنید یا انتقال دهید.\"\n03020208=\"عملیات پشتیبانی نمی‌شود.\"\n03020209=\"پوشه مقصد را انتخاب كنيد.\"\n\n03020210=\"تایید حذف فایل\"\n03020211=\"تایید حذف پوشه\"\n03020212=\"تایید حذف فایل‌ها\"\n03020213=\"آیا شما قصد دارید '{0}' را حذف کنید؟\"\n03020214=\"آیا شما قصد دارید پوشه '{0}' و تمام محتویات آن را حذف کنید؟\"\n03020215=\"آیا شما قصد دارید اين '{0}' گزینه را حذف کنید؟\"\n03020216=\"در حال حذف...\"\n03020217=\"خطا هنگام حذف فایل یا پوشه\"\n\n03020220=\"تغییر نام...\"\n03020221=\"خطای تغییر نام فایل یا پوشه\"\n03020222=\"تایید کپی فایل\"\n03020223=\"آیا شما قصد دارید فایل‌ها را به آرشیو کپی کنید\"\n\n03020230=\"ایجاد پوشه\"\n03020231=\"نام پوشه:\"\n03020232=\"پوشه جدید\"\n03020233=\"خطای ایجاد پوشه\"\n\n03020240=\"ایجاد فایل\"\n03020241=\"نام فایل:\"\n03020242=\"فایل جدید\"\n03020243=\"خطای ایجاد فایل\"\n\n03020250=\"انتخاب\"\n03020251=\"لغو انتخاب\"\n03020252=\"ماسك:\"\n\n03020260=\"تاریخچه پوشه‌ها\"\n\n03020280=\"فایل '{0}' تغییر کرده است.\\n آیا میل دارید فایل مذکور در آرشیو بروزرسانی شود؟\"\n03020281=\"این فایل قابل بروزرسانی نمی‌باشد\\n'{0}'\"\n03020282=\"ویرایشگر اجرا نمی‌شود.\"\n03020283=\"در حال باز کردن...\"\n\n03020290=\"توضيح\"\n03020291=\"توضيح:\"\n\n030202A0=\"سیستم\"\n\n03020300=\"کامپیوتر\"\n03020301=\"شبکه\"\n\n03020400=\"افزودن\"\n03020401=\"استخراج\"\n03020402=\"بررسی\"\n\n03020420=\"کپی\"\n03020421=\"انتقال\"\n03020422=\"حذف\"\n03020423=\"اطلاعات\"\n\n03020500=\"تقسیم فایل\"\n03020501=\"تقسیم درون:\"\n03020510=\"در حال تقسیم...\"\n03020520=\"تاييد تقسیم فایل\"\n03020521=\"آیا شما قصد دارید اين فايل را به {0} قسمت تقسيم كنيد؟\"\n03020522=\"اندازه قسمت‌ها بايد كوچكتر از اندازه فايل اصلى باشد\"\n\n03020600=\"ترکیب فایل‌ها\"\n03020601=\"ترکیب درون:\"\n03020610=\"در حال ترکیب...\"\n03020620=\"فقط اولين فايل را انتخاب كنيد\"\n\n03020710=\"در حال محاسبه Checksum...\"\n03020720=\"اطلاعات Checksum\"\n03020721=\"CRC checksum for data:\"\n03020722=\"CRC checksum for data and names:\"\n\n03020800=\"در حال پويش...\"\n\n03020900=\"مشخصات\"\n\n; Computer\n03031100=\"اندازه کل\"\n03031101=\"فضای خالی\"\n03031102=\"سایز کلاستر\"\n03031103=\"برچسب\"\n\n; Network\n03031200=\"نام محلی\"\n03031201=\"مهياكننده\"\n\n; Benchmark Dialog\n\n03080000=\"سنجش\"\n03080001=\"حافظه مصرفی:\"\n03080002=\"فشرده‌سازی\"\n03080003=\"استخراج\"\n03080004=\"سرعت\"\n03080005=\"درجه‌بندی\"\n03080006=\"درجه‌بندی کلی\"\n03080007=\"جاری\"\n03080008=\"دستاورد\"\n03080009=\"تعداد عبور:\"\n0308000A=\"خطاها:\"\n0308000B=\"CPU Usage\"\n0308000C=\"Rating / Usage\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/fi.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.57\n; Translated by Ari Ryynanen\n; Updated by Jarko P. (3.08.04 beta -->4.30)\n; Updated by Juhani Valtasalmi (4.30 --> 4.42)\n; Updated with light modifications by T.Sakkara (4.42 --> 4.60) 25.10.2008\n;\n;\n\n00000000=\"Finnish\"\n00000001=\"Suomi\"\n00000002=\"11\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Lisäsetukset\"\n\n; Info Page\n01000100=\"Tietoja\"\n01000103=\"7-Zip on ilmainen ohjelmisto. Halutessasi voit kuitenkin tukea kehitystyötä rekisteröitymällä.\"\n01000104=\"Tuki (engl.)\"\n01000105=\"Rekisteröidy (engl.)\"\n\n; Folders Page\n01000200=\"Kansiot\"\n01000210=\"&Työkansio\"\n01000211=\"&Järjestelmän väliaikaiskansio\"\n01000212=\"&Nykyinen kansio\"\n01000213=\"&Valittu kansio:\"\n01000214=\"Käytä vain siirrettäville tietovälineille\"\n\n01000281=\"Määritä väliaikaistiedostojen sijainti.\"\n\n; System Page\n01000300=\"Järjestelmä\"\n01000301=\"Liitä 7-Zip järjestelmän valikoihin.\"\n01000302=\"Ryhmitetty järjestelmävalikko\"\n01000310=\"Järjestelmävalikon sisältö:\"\n\n; Language Page\n01000400=\"Kieli\"\n01000401=\"Kieli:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip komennot\"\n02000103=\"Avaa\"\n02000104=\"Avaa valittu paketti.\"\n02000105=\"Purkaa...\"\n02000106=\"Purkaa valitun paketin.\"\n02000107=\"Lisää pakettiin...\"\n02000108=\"Lisää tiedostot valittuun pakettiin.\"\n02000109=\"Eheystarkastus\"\n0200010A=\"Tarkistaa valitun paketin eheyden.\"\n0200010B=\"Purkaa tänne\"\n0200010C=\"Purkaa tiedostot valitusta paketista nykyiseen kansioon.\"\n0200010D=\"Purkaa kansioon {0}\"\n0200010E=\"Purkaa tiedostot alikansioon.\"\n0200010F=\"Lisää pakettiin {0}\"\n02000110=\"Lisää valitut tiedostot pakettiin.\"\n02000111=\"Pakkaa tiedostot ja lähetä...\"\n02000112=\"Pakkaa valitut ja lähetä sähköpostilla.\"\n02000113=\"Lisää pakettiin {0} ja lähetä\"\n02000114=\"Lisää valitut tiedostot pakettiin ja lähetä sähköpostilla.\"\n\n02000140=\"<Kansio>\"\n02000141=\"<Paketti>\"\n\n; Properties\n02000203=\"Polku\"\n02000204=\"Nimi\"\n02000205=\"Tiedostomuoto\"\n02000206=\"Kansio\"\n02000207=\"Koko\"\n02000208=\"Pakattu koko\"\n02000209=\"Määritteet\"\n0200020A=\"Luotu\"\n0200020B=\"Käytetty\"\n0200020C=\"Muokattu\"\n0200020D=\"Kiinteä\"\n0200020E=\"Kommentoitu\"\n0200020F=\"Suojaus\"\n02000210=\"Pilko ennen\"\n02000211=\"Pilko jälkeen\"\n02000212=\"Sanakirja\"\n02000213=\"CRC\"\n02000214=\"Tyyppi\"\n02000215=\"Anti\"\n02000216=\"Menetelmä\"\n02000217=\"Isäntäjärjestelmä\"\n02000218=\"Tiedostojärjestelmä\"\n02000219=\"Käyttäjä\"\n0200021A=\"Ryhmä\"\n0200021B=\"Lohko\"\n0200021C=\"Kuvaus\"\n0200021D=\"Kohta\"\n0200021E=\"Polun etuliite\"\n0200021F=\"Kansioita\"\n02000220=\"Tiedostoja\"\n02000221=\"Versio\"\n02000222=\"Nimi\"\n02000223=\"Pilkottu\"\n02000224=\"Siirtymä\"\n02000225=\"Linkit\"\n02000226=\"Lohkot\"\n02000227=\"Nimet\"\n\n; Status bar\n02000301=\"{0} tiedosto(a) valittu\"\n02000302=\"{0} tiedosto(a)\"\n\n02000320=\"Tiedostoja:\"\n02000321=\"Kansioita:\"\n02000322=\"Koko:\"\n02000323=\"Pakattu koko:\"\n02000324=\"Paketteja:\"\n\n; List Context Menu\n02000401=\"&Sarakkeet...\"\n02000411=\"&Avaa\"\n02000412=\"&Purkaa...\"\n\n; ToolBar\n02000501=\"Purkaa\"\n\n; Messages\n02000601=\"Tätä pakettia ei voi päivittää.\"\n02000602=\"Pakettia '{0}' ei voida päivittää.\"\n02000603=\"Ei voida luoda kansioita '{0}.'\"\n02000604=\"Tiedoston pakkaustapaa ei tueta.\"\n02000605=\"Virhe!\"\n02000606=\"Liian monta kohdetta.\"\n02000607=\"Tiedostotyyppiin ei ole liitetty mitään ohjelmaa.\"\n02000608=\"Ei virheitä.\"\n02000609=\"Tiedoston '{0}' pakkausta ei voi purkaa.\"\n0200060A=\"Ei voi avata suojattua pakettia '{0}'. Onko salasana oikea?\"\n\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Kyllä\"\n02000707=\"Kyllä k&aikkiin\"\n02000709=\"&Ei\"\n0200070B=\"E&i kaikkiin\"\n\n02000710=\"Peruuta\"\n02000711=\"&Peruuta\"\n02000713=\"&Sulje\"\n02000714=\"Pysäytä\"\n02000715=\"Aloita uudelleen\"\n\n02000720=\"Ohje\"\n\n; Extract dialog\n02000800=\"Purkaa\"\n02000801=\"&Purkaa kansioon\"\n02000802=\"Salasana\"\n\n02000810=\"Polkujen sisällytys:\"\n02000811=\"Sisällytä koko polku\"\n02000812=\"Nykyiset nimet\"\n02000813=\"Älä sisällytä polkuja\"\n\n02000820=\"Samannimiset tiedostot:\"\n02000821=\"Kysy tapauskohtaisesti\"\n02000822=\"Korvaa\"\n02000823=\"Ohita\"\n02000824=\"Uudelleennimeä\"\n02000825=\"Uudelleennimeä aiemmat\"\n\n02000830=\"Tiedostot\"\n02000831=\"&Valitut\"\n02000832=\"&Kaikki\"\n\n02000881=\"Purkaa kansioon\"\n\n02000890=\"Puretaan paketti\"\n\n; Overwrite dialog\n02000900=\"Vahvista tiedoston korvaus\"\n02000901=\"Tämä kansio sisältää jo samannimisen tiedoston.\"\n02000902=\"Haluatko korvata tiedoston\"\n02000903=\"tällä tiedostolla?\"\n\n02000911=\"&Uudelleennimeä automaattisesti\"\n\n02000982=\"{0} tavua\"\n02000983=\"muokattu\"\n\n; Messages dialog\n02000A00=\"Tietoja\"\n\n02000A80=\"Viesti\"\n\n02000A91=\"Tukematon pakkausmenetelmä tiedostolle '{0}'.\"\n02000A92=\"Tietovirhe tiedostossa '{0}'. Tiedosto on viottunut.\"\n02000A93=\"Tiedoston '{0}' eheystarkistus epäonnistui. Tiedosto on vioittunut.\"\n02000A94=\"Virhe avattaessa suojattua pakettia '{0}'. Onko salasana oikea?\"\n02000A95=\"CRC-virhe avattaessa suojattua pakettia '{0}'. Onko salasana oikea?\"\n\n; Password dialog\n02000B00=\"Anna salasana\"\n02000B01=\"Anna salasana:\"\n02000B02=\"Näytä &salasana\"\n02000B03=\"Toista salasana:\"\n02000B10=\"Salasanat eivät täsmää\"\n02000B11=\"Salasanassa voi käyttää numeroita ja erikoismerkkejä, mutta EI skandinaavisia kirjaimia.\"\n02000B12=\"Liian pitkä salasana\"\n\n; Progress dialog\n02000C00=\"Käsitellään\"\n02000C01=\"Aikaa kulunut:\"\n02000C02=\"Aikaa jäljellä:\"\n02000C03=\"Koko:\"\n02000C04=\"Nopeus:\"\n02000C05=\"Käsitelty:\"\n02000C06=\"Pakkaussuhde:\"\n\n02000C10=\"&Tausta-ajona\"\n02000C11=\"&Normaali prioriteetti\"\n02000C12=\"&Pysäytä\"\n02000C13=\"&Jatka\"\n\n02000C20=\"Pysäytetty\"\n\n02000C30=\"Keskeytetäänkö toiminto?\"\n\n; Compress dialog\n02000D00=\"Lisää pakettiin\"\n02000D01=\"&Paketti:\"\n02000D02=\"&Päivitystapa:\"\n02000D03=\"Pakkaus&:\"\n02000D04=\"Pakkaus&menetelmä:\"\n02000D05=\"Luo Kiinte&ä paketti\"\n02000D06=\"&Parametrit:\"\n02000D07=\"Asetukset\"\n02000D08=\"Luo itsepurkautuva paketti\"\n02000D09=\"Prosessorisäikeet\"\n02000D0A=\"Tiedosto&nimien suojaus\"\n02000D0B=\"Pakkauksen &taso:\"\n02000D0C=\"&Sanakirjan koko:\"\n02000D0D=\"&Sanan koko:\"\n02000D0E=\"Pakkauksessa tarvittava muistimäärä:\"\n02000D0F=\"Purkauksessa tarvittava muistimäärä:\"\n02000D10=\"Suojaus\"\n02000D11=\"Salausalgoritmi\"\n02000D12=\"Prosessorisäikeet\"\n02000D13=\"Kiinteä lohkokoko\"\n02000D14=\"Muuttuva\"\n02000D15=\"Kiinteä\"\n\n02000D16=\"Pakkaa yhteiset tiedostot\"\n\n02000D40=\"&Osien koko pilkottaessa:\"\n02000D41=\"Pilkotun osan koko epäkelpo\"\n02000D42=\"Pilkottavien osien koko: {0} tavua.\\nPilkotaanko paketti edellämainitun kokoisiin osiin?\"\n\n02000D81=\"Ei pakkausta\"\n02000D82=\"Normaali\"\n02000D83=\"Täysi\"\n02000D84=\"Nopea\"\n02000D85=\"Nopein\"\n02000D86=\"Ultra\"\n\n02000D90=\"Selaa\"\n\n02000DA1=\"Lisää ja korvaa tiedostoja\"\n02000DA2=\"Päivitä ja lisää tiedostoja\"\n02000DA3=\"Päivitä olemassaolevat tiedostot\"\n02000DA4=\"Synkronoi tiedostot\"\n\n02000DB1=\"Kaikki tiedostot\"\n\n02000DC0=\"Lisätään pakettiin\"\n\n; Columns dialog\n02000E00=\"Sarakkeet\"\n02000E01=\"Valitse tässä kansiossa näytettävät sarakkeet. Käytä uudelleenjärjestelyyn painikkeita 'Siirrä ylös' ja 'Siirrä alas'\"\n02000E02=\"Aseta valitun sarakkeen &leveydeksi\"\n02000E03=\"pikseliä.\"\n\n02000E10=\"Siirrä &Ylös\"\n02000E11=\"Siirrä &Alas\"\n02000E12=\"&Näytä\"\n02000E13=\"&Piilota\"\n02000E14=\"Aseta\"\n\n02000E81=\"Otsikko\"\n02000E82=\"Leveys\"\n\n; Testing\n02000F90=\"Eheystarkistus\"\n\n\n; File Manager\n\n03000000=\"7-Zip Tiedostonhallinta\"\n\n; Menu\n03000102=\"&Tiedosto\"\n03000103=\"&Muokkaa\"\n03000104=\"&Näytä\"\n03000105=\"Työ&kalut\"\n03000106=\"&Ohje\"\n03000107=\"&Suosikit\"\n\n; File\n03000210=\"&Avaa\"\n03000211=\"Avaa sisäisesti\"\n03000212=\"Avaa &ulkoisesti\"\n03000220=\"&Näytä\"\n03000221=\"&Muokkaa\"\n03000230=\"Nim&eä uudelleen\"\n03000231=\"&Kopioi...\"\n03000232=\"&Siirrä...\"\n03000233=\"&Poista\"\n03000240=\"Ominais&uudet\"\n03000241=\"Ku&vaus\"\n03000242=\"Laske tarkistussummat\"\n03000250=\"Luo kansio\"\n03000251=\"Luo tiedosto\"\n03000260=\"&Lopeta\"\n03000270=\"&Pilko tiedosto...\"\n03000271=\"&Yhdistä pilkotut...\"\n\n; Edit\n03000310=\"&Kumoa\"\n03000311=\"&Toista\"\n03000320=\"&Leikkaa\"\n03000321=\"K&opioi\"\n03000322=\"L&iitä\"\n03000323=\"&Poista\"\n03000330=\"V&alitse kaikki\"\n03000331=\"Poista &valinnat\"\n03000332=\"&Käänteinen valinta\"\n03000333=\"Valitse...\"\n03000334=\"Poista valinta...\"\n03000335=\"Valitse tyypin mukaan\"\n03000336=\"Poista valinnat tyypin mukaan\"\n\n; View\n03000410=\"Suu&ret kuvakkeet\"\n03000411=\"&Pienet kuvakkeet\"\n03000412=\"&Luettelo\"\n03000413=\"&Tiedot\"\n03000420=\"Alkuperäinen järjestys\"\n03000430=\"Avaa pääkansio\"\n03000431=\"Avaa yläkansio\"\n03000432=\"Kansiohistoria...\"\n03000440=\"P&äivitä\"\n03000449=\"Kansioiden sisältö luetteloituna\"\n03000450=\"&Kaksi panelia\"\n03000451=\"&Työkalupalkki\"\n03000460=\"Pakettipalkki\"\n03000461=\"Vakiopalkki\"\n03000462=\"Suuret painikkeet\"\n03000463=\"Näytä painikkeiden tekstit\"\n\n; Tools\n03000510=\"&Asetukset...\"\n03000511=\"&Nopeustesti\"\n\n; Help\n03000610=\"&Sisältö...\"\n03000620=\"&Tietoja ohjelmasta\"\n\n; Favorites\n03000710=\"&Lisää Suosikit-kansioon\"\n03000720=\"Kirjanmerkki\"\n\n; Options Dialog\n\n03010000=\"Asetukset\"\n\n; Plugins\n03010100=\"Lisäosat\"\n03010101=\"&Lisäosat:\"\n03010110=\"Lisäsetukset...\"\n\n; Edit\n03010200=\"Editori\"\n03010201=\"&Editori:\"\n\n; System\n03010300=\"Järjestelmäliitännät\"\n03010302=\"Liitä 7-Zip seuraaviin tiedostotyypeihin:\"\n03010310=\"Lisäosa\"\n\n; Settings\n03010400=\"Tiedostoikkuna\"\n03010401=\"Näytä yläkansion symboli\"\n03010402=\"Näytä aidot tiedostokuvakkeet\"\n03010410=\"Näytä järjestelmävalikko\"\n03010420=\"Valitse &koko rivi\"\n03010421=\"Näytä ruudukko\"\n03010430=\"&Vaihtoehtoinen valintojen esitystapa\"\n03010440=\"Käytä &suuria muistisivuja\"\n\n; Strings\n\n03020201=\"Kopioi\"\n03020202=\"Siirrä\"\n03020203=\"Kopioi kansioon:\"\n03020204=\"Siirrä kansioon:\"\n03020205=\"Kopioidaan...\"\n03020206=\"Siirretään...\"\n03020207=\"Ei voida siirtää tai kopioida tiedostoja kyseiseen kansioon.\"\n03020208=\"Toiminto ei ole tuettu.\"\n03020209=\"Valitse kohdekansio.\"\n\n\n03020210=\"Vahvista tiedoston poisto\"\n03020211=\"Vahvista kansion poisto\"\n03020212=\"Vahvista useiden kohteiden poisto\"\n03020213=\"Poistetaanko tiedosto '{0}'?\"\n03020214=\"Poistetaanko kansio '{0}' ja kaiken sen sisällön?\"\n03020215=\"Poistetaanko nämä {0} kohdetta?\"\n03020216=\"Poistetaan...\"\n03020217=\"Virhe poistettaessa tiedostoa tai kansiota\"\n\n03020220=\"Nimetään uudelleen...\"\n03020221=\"Virhe uudelleennimettäessä tiedostoa tai kansiota\"\n03020222=\"Vahvista tiedoston kopioiminen\"\n03020223=\"Kopioidaanko tiedostot pakettiin?\"\n\n03020230=\"Luo uusi kansio\"\n03020231=\"Kansion nimi:\"\n03020232=\"Uusi kansio\"\n03020233=\"Virhe luotaessa kansiota\"\n\n03020240=\"Luo uusi tiedosto\"\n03020241=\"Tiedostonimi:\"\n03020242=\"Uusi tiedosto\"\n03020243=\"Virhe luotaessa tiedostoa\"\n\n03020250=\"Valitse\"\n03020251=\"Poista valinta\"\n03020252=\"Peite:\"\n\n03020260=\"Kansiohistoria\"\n\n03020280=\"Tiedostoa '{0}' on muutettu.\\nHaluatko päivittää paketin?\"\n03020281=\"Ei voida päivittää tiedostoa \\n'{0}'.\"\n03020282=\"Editoria ei voida käynnistää.\"\n03020283=\"Avataan...\"\n\n03020290=\"\"\n03020291=\"&Kuvaus:\"\n\n030202A0=\"Järjestelmä\"\n\n03020300=\"Tietokone\"\n03020301=\"Verkko\"\n\n03020400=\"Lisää\"\n03020401=\"Purkaa\"\n03020402=\"Tarkista eheys\"\n\n03020420=\"Kopioi\"\n03020421=\"Siirrä\"\n03020422=\"Poista\"\n03020423=\"Ominaisuudet\"\n\n03020500=\"Pilko tiedosto\"\n03020501=\"&Pilko kansioon:\"\n03020510=\"Pilkotaan...\"\n03020520=\"Vahvista pilkkominen\"\n03020521=\"Pilkotaanko tiedosto {0} osaan?\"\n03020522=\"Pilkotun osan koon pitää olla pienempi kuin alkuperäisen tiedoston.\"\n\n\n03020600=\"Yhdistä pilkotut tiedostot\"\n03020601=\"&Yhdistä kansioon:\"\n\n\n03020610=\"Yhdistetään...\"\n\n\n03020620=\"Valitse vain ensimmäinen tiedosto\"\n\n03020710=\"Laskee tarkistussummaa...\"\n03020720=\"Tarkistussummat\"\n03020721=\"Sisällön CRC-tarkistussumma:\"\n03020722=\"Sisällön ja tiedostonimien CRC-tarkistussumma:\"\n\n03020800=\"Etsitään...\"\n\n03020900=\"Ominaisuudet\"\n; Computer\n03031100=\"Aseman koko\"\n03031101=\"Vapaata tilaa\"\n03031102=\"Varausyksikön koko\"\n03031103=\"Nimi\"\n\n; Network\n03031200=\"Paikallinen nimi\"\n03031201=\"Palveluntarjoja\"\n\n; Benchmark Dialog\n\n03080000=\"Nopeustesti\"\n03080001=\"Muistin käyttö:\"\n03080002=\"Pakkaaminen\"\n03080003=\"Purkaminen\"\n03080004=\"Nopeus\"\n03080005=\"Teho\"\n03080006=\"Teho yhteensä\"\n03080007=\"Tämänhetkinen\"\n03080008=\"Tulos\"\n03080009=\"Läpäisyt:\"\n0308000A=\"Virheitä:\"\n0308000B=\"Suoritinkäyttö\"\n0308000C=\"Teho / säie\"\n\n;!@LangEnd@!\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/fr.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.56 beta\n; Translated by Nicolas Sierro\n; Updated to 7-Zip 4.56 beta by Philippe Berthault\n;\n;\n;\n\n00000000=\"French\"\n00000001=\"Français\"\n00000002=\"12\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuration de 7-Zip\"\n\n; Info Page\n01000100=\"A propos de 7-Zip\"\n01000103=\"7-Zip est un logiciel libre. Cependant vous pouvez soutenir son développement en vous enregistrant.\"\n01000104=\"Support\"\n01000105=\"S'enregistrer\"\n\n; Folders Page\n01000200=\"Dossiers\"\n01000210=\"Dossier de &travail\"\n01000211=\"Dossier temporaire du &système\"\n01000212=\"Dossier &courant\"\n01000213=\"Dossier s&pécifié:\"\n01000214=\"N'utiliser que pour les médias amovibles\"\n\n01000281=\"Spécifiez un dossier pour les fichiers d'archive temporaires.\"\n\n; System Page\n01000300=\"Système\"\n01000301=\"Intégrer 7-Zip au menu contextuel\"\n01000302=\"Menu contextuel en cascade\"\n01000310=\"Eléments du menu contextuel :\"\n\n; Language Page\n01000400=\"Langue\"\n01000401=\"Langue :\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Commandes 7-Zip\"\n02000103=\"Ouvrir\"\n02000104=\"Ouvrir l'archive sélectionnée.\"\n02000105=\"Extraire les fichiers...\"\n02000106=\"Extraire les fichiers de l'archive sélectionnée.\"\n02000107=\"Ajouter à l'archive...\"\n02000108=\"Ajouter les objets sélectionnés à l'archive.\"\n02000109=\"Contrôler l'archive\"\n0200010A=\"Contrôler l'intégrité de l'archive sélectionnée.\"\n0200010B=\"Extraire ici\"\n0200010C=\"Extraire les fichiers de l'archive sélectionnée dans le dossier actuel.\"\n0200010D=\"Extraire vers {0}\"\n0200010E=\"Extraire dans un sous dossier.\"\n0200010F=\"Ajouter à {0}\"\n02000110=\"Ajouter les éléments sélectionnés à l'archive.\"\n02000111=\"Compresser et envoyer par mail...\"\n02000112=\"Compresser les éléments sélectionnés à l'archive et l'envoyer par mail.\"\n02000113=\"Compresser vers {0} et envoyer par mail.\"\n02000114=\"Compresser les éléments sélectionnés à l'archive et l'envoyer par mail.\"\n\n02000140=\"<Dossier>\"\n02000141=\"<Archive>\"\n\n; Properties\n02000203=\"Chemin\"\n02000204=\"Nom\"\n02000205=\"Extension\"\n02000206=\"Dossier\"\n02000207=\"Taille\"\n02000208=\"Compressé\"\n02000209=\"Attributs\"\n0200020A=\"Créé le\"\n0200020B=\"Accédé le\"\n0200020C=\"Modifié le\"\n0200020D=\"Solide\"\n0200020E=\"Commentaire\"\n0200020F=\"Crypté\"\n02000210=\"Diviser avant\"\n02000211=\"Diviser après\"\n02000212=\"Dictionnaire\"\n02000213=\"CRC\"\n02000214=\"Type\"\n02000215=\"Anti\"\n02000216=\"Méthode\"\n02000217=\"OS hôte\"\n02000218=\"Système de fichiers\"\n02000219=\"Utilisateur\"\n0200021A=\"Groupe\"\n0200021B=\"Bloc\"\n0200021C=\"Commentaire\"\n0200021D=\"Position\"\n0200021E=\"Préfixe\"\n0200021F=\"Dossiers\"\n02000220=\"Fichiers\"\n02000221=\"Version\"\n02000222=\"Volume\"\n02000223=\"Multivolume\"\n02000224=\"Offset\"\n02000225=\"Liens\"\n02000226=\"Blocs\"\n02000227=\"Volumes\"\n\n; Status bar\n02000301=\"{0} objet(s) sélectionné(s)\"\n02000302=\"{0} objet(s)\"\n\n02000320=\"Fichiers:\"\n02000321=\"Dossiers:\"\n02000322=\"Taille:\"\n02000323=\"Taille compressée:\"\n02000324=\"Archives:\"\n\n; List Context Menu\n02000401=\"&Colonnes...\"\n\n02000411=\"&Ouvrir\"\n02000412=\"&Extraire...\"\n\n; ToolBar\n02000501=\"Extraire\"\n\n; Messages\n02000601=\"Les opérations de mise à jour ne sont pas disponibles pour cette archive.\"\n02000602=\"L'archive '{0}' ne peut pas être mise à jour\"\n02000603=\"Le dossier '{0}' ne peut pas être créé\"\n02000604=\"Le fichier n'est pas une archive valide.\"\n02000605=\"Erreur à l'invocation de la commande\"\n02000606=\"Trop d'objets\"\n02000607=\"Aucune application n'est associée avec ce type de fichier\"\n02000608=\"Il n'y a pas d'erreurs\"\n02000609=\"Le fichier '{0}' ne peut être ouvert comme une archive\"\n0200060A=\"L'archive cryptée '{0}' ne peut être ouverte. Mauvais mot de passe?\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Oui\"\n02000707=\"Oui pour tous\"\n02000709=\"&Non\"\n0200070B=\"Non pour tous\"\n\n02000710=\"Annuler\"\n02000711=\"&Annuler\"\n02000713=\"&Fermer\"\n02000714=\"Stop\"\n02000715=\"Redémarrer\"\n\n02000720=\"Aide\"\n\n; Extract dialog\n02000800=\"Extraire\"\n02000801=\"E&xtraire vers:\"\n02000802=\"Mot de passe\"\n\n02000810=\"Chemins\"\n02000811=\"Chemins complets\"\n02000812=\"Chemins relatifs\"\n02000813=\"Pas de chemin\"\n\n02000820=\"Mode de remplacement\"\n02000821=\"Confirmer avant de remplacer\"\n02000822=\"Remplacer sans demander\"\n02000823=\"Ignorer les fichiers existants\"\n02000824=\"Renommer automatiquement\"\n02000825=\"Renommer les fichiers existants\"\n\n02000830=\"Fichiers\"\n02000831=\"&Fichiers sélectionnés\"\n02000832=\"&Tous les fichiers\"\n\n02000881=\"Choisissez un dossier pour l'extraction des fichiers.\"\n\n02000890=\"Extraction\"\n\n; Overwrite dialog\n02000900=\"Confirmer le remplacement de fichier\"\n02000901=\"Le dossier de destination contient déjà un fichier avec ce nom.\"\n02000902=\"Voulez-vous remplacer le fichier existant\"\n02000903=\"par celui-ci ?\"\n\n02000911=\"Renommer &automatiquement\"\n\n02000982=\"{0} octets\"\n02000983=\"modifié le\"\n\n; Messages dialog\n02000A00=\"Messages de diagnostic\"\n\n02000A80=\"Message\"\n\n02000A91=\"Méthode de compression non valide pour '{0}'.\"\n02000A92=\"Donnée erronée dans le fichier '{0}'. Le fichier est corrompu.\"\n02000A93=\"Échec du contrôle CRC dans le fichier '{0}'. Le fichier est corrompu.\"\n02000A94=\"Donnée erronée dans le fichier crypté '{0}'. Mauvais mot de passe?\"\n02000A95=\"Échec du contrôle CRC dans le fichier crypté '{0}'. Mauvais mot de passe?\"\n\n; Password dialog\n02000B00=\"Entrez le mot de passe\"\n02000B01=\"Entrez le mot de passe:\"\n02000B02=\"&Afficher le mot de passe\"\n02000B03=\"Entrez le mot de passe à nouveau:\"\n02000B10=\"Les mots de passe ne correspondent pas\"\n02000B11=\"Pour le mot de passe, n'utilisez que des lettres non accentuées, des chiffres et des caractères spéciaux (!, #, $, ...)\"\n02000B12=\"Le mot de passe est trop long\"\n\n; Progress dialog\n02000C00=\"Procède\"\n02000C01=\"Temps écoulé:\"\n02000C02=\"Temps restant:\"\n02000C03=\"Taille:\"\n02000C04=\"Vitesse:\"\n02000C05=\"Traité:\"\n02000C06=\"Taux de compression:\"\n\n02000C10=\"&Arrière plan\"\n02000C11=\"&Avant plan\"\n02000C12=\"&Pause\"\n02000C13=\"&Continuer\"\n\n02000C20=\"En pause\"\n\n02000C30=\"Etes vous sur de vouloir annuler ?\"\n\n; Compress dialog\n02000D00=\"Ajouter à l'archive\"\n02000D01=\"&Archive:\"\n02000D02=\"&Mode de mise à jour:\"\n02000D03=\"&Format de l'archive:\"\n02000D04=\"Type de &compression:\"\n02000D05=\"Créer une archive &solide\"\n02000D06=\"&Paramètres:\"\n02000D07=\"Options\"\n02000D08=\"Créer une archive SF&X\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Crypter les &noms de fichiers\"\n02000D0B=\"N&iveau de compression :\"\n02000D0C=\"&Taille du dictionnaire :\"\n02000D0D=\"Tai&lle des mots :\"\n02000D0E=\"Mémoire pour la compression :\"\n02000D0F=\"Mémoire pour la décompression :\"\n02000D10=\"Cryptage\"\n02000D11=\"Méthode de cryptage:\"\n02000D12=\"Nombre de threads CPU:\"\n02000D13=\"Taille de bloc solide:\"\n02000D14=\"Non-solide\"\n02000D15=\"Solide\"\n02000D16=\"Compresser des fichiers partagés\"\n\n02000D40=\"Découper en &volumes, octets:\"\n02000D41=\"Taille de volume incorrecte\"\n02000D42=\"Taille de volume spécifiée: {0} octets.\\nÊtes vous sûr de vouloir découper l'archive dans de tels volumes?\"\n\n02000D81=\"Aucune\"\n02000D82=\"Normale\"\n02000D83=\"Maximum\"\n02000D84=\"Rapide\"\n02000D85=\"Le plus rapide\"\n02000D86=\"Ultra\"\n\n02000D90=\"Choisir\"\n\n02000DA1=\"Ajouter et remplacer les fichiers\"\n02000DA2=\"Mettre à jour et ajouter les fichiers\"\n02000DA3=\"Rafraîchir les fichiers existants\"\n02000DA4=\"Synchroniser les fichiers\"\n\n02000DB1=\"Tous les fichiers\"\n\n02000DC0=\"Compression\"\n\n; Columns dialog\n02000E00=\"Colonnes\"\n02000E01=\"Marquez les colonnes que vous désirez afficher. Utilisez les boutons Monter et Descendre pour modifier leur ordre.\"\n02000E02=\"La colonne sélectionnée doit faire\"\n02000E03=\"pixels de &large.\"\n\n02000E10=\"Mon&ter\"\n02000E11=\"&Descendre\"\n02000E12=\"&Afficher\"\n02000E13=\"&Masquer\"\n02000E14=\"Sauver\"\n\n02000E81=\"Titre\"\n02000E82=\"Largeur\"\n\n; Testing\n02000F90=\"Contrôle\"\n\n\n; File Manager\n\n03000000=\"Gestionnaire de fichier de 7-Zip\"\n\n; Menu\n03000102=\"&Fichier\"\n03000103=\"&Edition\"\n03000104=\"Affic&hage\"\n03000105=\"&Outils\"\n03000106=\"&Aide\"\n03000107=\"Fa&voris\"\n\n; File\n03000210=\"&Ouvrir\"\n03000211=\"Ouvrir à l'&intérieur\"\n03000212=\"Ouvrir à l'e&xtérieur\"\n03000220=\"&Voir\"\n03000221=\"&Edition\"\n03000230=\"Reno&mmer\"\n03000231=\"&Copier vers...\"\n03000232=\"&Déplacer vers...\"\n03000233=\"S&upprimer\"\n03000240=\"P&ropriétés\"\n03000241=\"Comme&ntaire\"\n03000242=\"Somme de contrôle\"\n03000250=\"Créer un dossier\"\n03000251=\"Créer un fichier\"\n03000260=\"&Quitter\"\n03000270=\"Diviser le &fichier ...\"\n03000271=\"Combiner les fic&hiers ...\"\n\n; Edit\n03000310=\"&Annuler\"\n03000311=\"&Refaire\"\n03000320=\"&Couper\"\n03000321=\"Co&pier\"\n03000322=\"C&oller\"\n03000323=\"S&upprimer\"\n03000330=\"Sélectionner &tout\"\n03000331=\"Désélectionner tout\"\n03000332=\"&Inverser la sélection\"\n03000333=\"Sélectionner...\"\n03000334=\"Désélectionner...\"\n03000335=\"Sélectionner par type\"\n03000336=\"Désélectionner par type\"\n\n; View\n03000410=\"&Grandes icônes\"\n03000411=\"&Petites icônes\"\n03000412=\"&Liste\"\n03000413=\"&Détails\"\n03000420=\"Non trié\"\n03000430=\"Ouvrir le dossier racine\"\n03000431=\"Dossier parent\"\n03000432=\"Historique des dossiers...\"\n03000440=\"Actualis&er\"\n03000449=\"Vue à plat\"\n03000450=\"&2 Fenêtres\"\n03000451=\"&Barres d'outils\"\n03000460=\"Barre d'archive\"\n03000461=\"Barre standard\"\n03000462=\"Grands boutons\"\n03000463=\"Montrer le texte\"\n\n; Tools\n03000510=\"&Options...\"\n03000511=\"Test de performance\"\n\n; Help\n03000610=\"&Contenu...\"\n03000620=\"À &propos de 7-Zip...\"\n\n; Favorites\n03000710=\"&Ajouter le répertoire aux favoris\"\n03000720=\"Signet\"\n\n; Options Dialog\n\n03010000=\"Options\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Options...\"\n\n; Edit\n03010200=\"Editeur\"\n03010201=\"&Editeur:\"\n\n; System\n03010300=\"Système\"\n03010302=\"Associer 7-Zip avec:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Paramètres\"\n03010401=\"Afficher l'élément \\\"..\\\"\"\n03010402=\"Afficher les icônes réelles des fichiers\"\n03010410=\"Afficher le menu système\"\n03010420=\"Sélectionner toute la ligne\"\n03010421=\"Afficher la grille\"\n03010430=\"Utiliser la sélection alternative\"\n03010440=\"Utiliser des grosses pages mémoire\"\n\n; Strings\n\n03020201=\"Copier\"\n03020202=\"Déplacer\"\n03020203=\"Copier dans:\"\n03020204=\"Déplacer vers:\"\n03020205=\"Copie...\"\n03020206=\"Déplacement...\"\n03020207=\"Vous ne pouvez pas déplacer ou copier des objets pour de tels dossiers.\"\n03020208=\"L'opération n'est pas possible.\"\n03020209=\"Sélectionnez le dossier de destination.\"\n\n03020210=\"Confirmer la suppression du fichier\"\n03020211=\"Confirmer la suppression du dossier\"\n03020212=\"Confirmer la suppression de tous les fichiers\"\n03020213=\"Êtes-vous sûr de vouloir supprimer '{0}'?\"\n03020214=\"Êtes-vous sûr de vouloir supprimer le dossier '{0}' et tout ce qu'il contient ?\"\n03020215=\"Êtes-vous sûr de vouloir supprimer ces {0} objets ?\"\n03020216=\"Suppression...\"\n03020217=\"Erreur durant la suppression du fichier ou du dossier\"\n\n03020220=\"Renommage...\"\n03020221=\"Erreur durant le renommage du fichier ou du dossier\"\n03020222=\"Confirmation de la copie de fichiers\"\n03020223=\"Confirmer la copie du(des) fichier(s)\"\n\n03020230=\"Créer un dossier\"\n03020231=\"Nom du dossier:\"\n03020232=\"Nouveau dossier\"\n03020233=\"Erreur durant la création du dossier\"\n\n03020240=\"Créer un fichier\"\n03020241=\"Nom du fichier:\"\n03020242=\"Nouveau fichier\"\n03020243=\"Erreur durant la création du fichier\"\n\n03020250=\"Sélectionner\"\n03020251=\"Désélectionner\"\n03020252=\"Masque:\"\n\n03020260=\"Historique des dossiers\"\n\n03020280=\"Le fichier '{0}' a été modifié.\\nVoulez-vous le mettre à jour dans l'archive ?\"\n03020281=\"Impossible de mettre à jour\\n'{0}'\"\n03020282=\"Impossible de démarrer l'éditeur.\"\n03020283=\"Ouverture...\"\n\n03020290=\"Commentaire\"\n03020291=\"&Commentaire:\"\n\n030202A0=\"Système\"\n\n03020300=\"Ordinateur\"\n03020301=\"Réseau\"\n\n03020400=\"Ajouter\"\n03020401=\"Extraire\"\n03020402=\"Tester\"\n\n03020420=\"Copier\"\n03020421=\"Déplacer\"\n03020422=\"Supprimer\"\n03020423=\"Informations\"\n\n03020500=\"Diviser le fichier\"\n03020501=\"&Diviser en :\"\n03020510=\"Division...\"\n03020520=\"Confirmez le découpage\"\n03020521=\"Êtes vous sûr de vouloir découper le fichier en {0} volumes?\"\n03020522=\"La taille de volume doit être inférieure à la taille du fichier d'origine\"\n\n03020600=\"Combiner les fichiers\"\n03020601=\"&Combiner en :\"\n03020610=\"Combinaison...\"\n03020620=\"Ne sélectionner que le premier fichier\"\n\n03020710=\"Calcul de la somme de contrôle...\"\n03020720=\"Informations sur la somme de contrôle\"\n03020721=\"Somme de contrôle des données\"\n03020722=\"Somme de contrôle des données et des noms\"\n\n03020800=\"Exploration...\"\n\n03020900=\"Propriétés\"\n\n; Computer\n03031100=\"Taille totale\"\n03031101=\"Espace libre\"\n03031102=\"Taille des clusters\"\n03031103=\"Nom de volume\"\n\n; Network\n03031200=\"Nom local\"\n03031201=\"Fournisseur\"\n\n; Benchmark Dialog\n\n03080000=\"Test de performance\"\n03080001=\"Utilisation de la mémoire :\"\n03080002=\"Compression\"\n03080003=\"Décompression\"\n03080004=\"Vitesse\"\n03080005=\"Taux\"\n03080006=\"Taux total\"\n03080007=\"Actuel\"\n03080008=\"Résultant\"\n03080009=\"Passes:\"\n0308000A=\"Erreurs:\"\n0308000B=\"Utilisation CPU\"\n0308000C=\"Estim.. / Usage\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/fur.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.44\n; Translated by Andrea Decorte (Klenje)\n; http://softfurlan.altervista.org\n; secont l'ortografie uficiâl de Provincie di Udin\n;\n;\n\n00000000=\"Friulian\"\n00000001=\"Furlan\"\n00000002=\"\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configurazion di 7-Zip\"\n\n; Info Page\n01000100=\"Informazions su 7-Zip\"\n01000103=\"7-Zip al è un program libar. Purpûr, tu puedis supuartâ il disvilup di 7-Zip cu la regjistrazion. I utents regjistrâts a podaran otignî supuart tecnic.\"\n01000104=\"Supuart tecnic\"\n01000105=\"Regjistre\"\n\n; Folders Page\n01000200=\"Cartelis\"\n01000210=\"Cartele di &vore\"\n01000211=\"Cartele &provisorie dal sisteme\"\n01000212=\"&Corinte\"\n01000213=\"&Specificade:\"\n01000214=\"Dopre dome pai drives che si puedin gjavâ\"\n\n01000281=\"Specifiche une posizion pai files provisoris di un archivi.\"\n\n; System Page\n01000300=\"Sisteme\"\n01000301=\"Integre 7-Zip intal menù contestuâl de shell\"\n01000302=\"Menù contestuâl in discjadude\"\n01000310=\"Elements dal menù contestuâl:\"\n\n; Language Page\n01000400=\"Lenghe\"\n01000401=\"Lenghe:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comants di 7-Zip\"\n02000103=\"Viarç archivi\"\n02000104=\"Viarç l'archivi selezionât.\"\n02000105=\"Tire fûr files...\"\n02000106=\"Tire fûr files dal archivi selezionât.\"\n02000107=\"Zonte a un archivi...\"\n02000108=\"Zonte i elements selezionâts a un archivi.\"\n02000109=\"Prove archivi\"\n0200010A=\"Prove l'integritât dal archivi selezionât.\"\n0200010B=\"Tire fûr ca\"\n0200010C=\"Tire fûr files dal archivi selezionât inte cartele corinte.\"\n0200010D=\"Tire fûr in {0}\"\n0200010E=\"Tire fûr i files intune sotcartele.\"\n0200010F=\"Zonte a {0}\"\n02000110=\"Zonte i elements selezionâts a un archivi.\"\n02000111=\"Comprim e mande par email...\"\n02000112=\"Comprim i elements selezionâts e mande l'archivi par email.\"\n02000113=\"Comprim in {0} e mande par email\"\n02000114=\"Comprim i elements selezionâts e mande l'archivi par email.\"\n\n02000140=\"<Cartele>\"\n02000141=\"<archivi>\"\n\n; Properties\n02000203=\"Percors\"\n02000204=\"Non\"\n02000205=\"Estension\"\n02000206=\"Cartele\"\n02000207=\"Dimension\"\n02000208=\"Dimension comprimude\"\n02000209=\"Atribûts\"\n0200020A=\"Creât\"\n0200020B=\"Ultin acès\"\n0200020C=\"Modificât\"\n0200020D=\"Solit\"\n0200020E=\"Comentât\"\n0200020F=\"Cifrât\"\n02000210=\"Divît prin di\"\n02000211=\"Divît daspò di\"\n02000212=\"Dizionari\"\n02000213=\"CRC\"\n02000214=\"Gjenar\"\n02000215=\"Anti\"\n02000216=\"Metodi\"\n02000217=\"SO di origjin\"\n02000218=\"Sisteme dai files\"\n02000219=\"Utent\"\n0200021A=\"Grup\"\n0200021B=\"Bloc\"\n0200021C=\"Coment\"\n0200021D=\"Posizion\"\n0200021E=\"Prefìs dal troi\"\n\n; Status bar\n02000301=\"{0} ogjet(s) selezionât(s)\"\n02000302=\"{0} ogjet(s)\"\n\n02000320=\"Files:\"\n02000321=\"Cartelis:\"\n02000322=\"Dimension:\"\n\n; List Context Menu\n02000401=\"&Colonis...\"\n\n02000411=\"&Viarç\"\n02000412=\"&Tire fûr...\"\n\n; ToolBar\n02000501=\"Tire fûr\"\n\n; Messages\n02000601=\"Lis operazions di atualizazion no son supuartadis par chest archivi.\"\n02000602=\"No si pues atualizâ l'archivi {0}\"\n02000603=\"No si pues creâ la cartele '{0}'\"\n02000604=\"Il file nol è un archivi supuartât.\"\n02000605=\"Erôr\"\n02000606=\"Masse elements\"\n02000607=\"Nissune aplicazion e je associade cu la estension di chest file\"\n02000608=\"Nissun erôr cjatât\"\n02000609=\"No si pues viarzi il file '{0}' come archivi\"\n0200060A=\"No si pues viarzi l'archivi cifrât '{0}'. Ise sbaliade la peraule clâf?\"\n\n; Dialogs\n02000702=\"Va ben\"\n02000705=\"&Sì\"\n02000707=\"Sì &a ducj\"\n02000709=\"&No\"\n0200070B=\"No a &ducj\"\n\n02000710=\"Scancele\"\n02000711=\"S&cancele\"\n02000713=\"&Siare\"\n02000714=\"Ferme\"\n02000715=\"Torne a inviâ\"\n\n02000720=\"&Jutori\"\n\n; Extract dialog\n02000800=\"Tire fûr\"\n02000801=\"Tir&e fûr in:\"\n02000802=\"Peraule clâf\"\n\n02000810=\"Struture des cartelis\"\n02000811=\"Percors intîrs\"\n02000812=\"Percors corints\"\n02000813=\"Nissun percors\"\n\n02000820=\"Sore scriture\"\n02000821=\"Domande prin di scrivi parsore\"\n02000822=\"Scrîf parsore cence domandâ\"\n02000823=\"Salte i files che esistin\"\n02000824=\"Gambie nons in automatic\"\n02000825=\"Gambie nons in automatic se a esistin\"\n\n02000830=\"Files\"\n02000831=\"Files &selezionâts\"\n02000832=\"Duc&j i files\"\n\n02000881=\"Specifiche une posizion pai files tirâts fûr.\"\n\n02000890=\"Daûr a tirâ fûr...\"\n\n; Overwrite dialog\n02000900=\"Conferme de sostituzion dal file\"\n02000901=\"Inte cartele di destinazion al è za il file processât.\"\n02000902=\"Vuelistu sostituî il file esistint\"\n02000903=\"cun chest file?\"\n\n02000911=\"&Gambie non in automatic\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificât ai\"\n\n; Messages dialog\n02000A00=\"Messaçs diagnostics\"\n\n02000A80=\"Messaç\"\n\n02000A91=\"Il metodi di compression nol è supuartât par '{0}'.\"\n02000A92=\"Erôr di dâts in '{0}'. Il file al è corot.\"\n02000A93=\"CRC falît in '{0}'. Il file al è corot.\"\n02000A94=\"Erôr di dâts tal file cifrât '{0}'. Peraule clâf sbaliade?\"\n02000A95=\"CRC falît tal file cifrât '{0}'. Peraule clâf sbaliade?\"\n\n; Password dialog\n02000B00=\"Scrîf peraule clâf\"\n02000B01=\"Scrîf la peraule clâf:\"\n02000B02=\"&Mostre la peraule clâf\"\n02000B03=\"Torne a inserî la peraule clâf:\"\n02000B10=\"Lis peraulis clâfs no son compagnis\"\n02000B11=\"Dopre dome lis letaris inglesis (no acentadis), i numars e i caratars speciâi (!, #, $, ...) inte peraule clâf\"\n02000B12=\"La peraule clâf e je masse lungje\"\n\n; Progress dialog\n02000C00=\"Procès\"\n02000C01=\"Timp passât:\"\n02000C02=\"Timp restant:\"\n02000C03=\"Dimension:\"\n02000C04=\"Sveltece:\"\n\n02000C10=\"&Sfont\"\n02000C11=\"P&rin plan\"\n02000C12=\"&Pause\"\n02000C13=\"&Continue\"\n\n02000C20=\"In pause\"\n\n02000C30=\"Sêstu sigûr di volê scancelâ?\"\n\n; Compress dialog\n02000D00=\"Zonte a un archivi\"\n02000D01=\"&Archivi:\"\n02000D02=\"Mût di at&ualizazion:\"\n02000D03=\"&Formât archivi:\"\n02000D04=\"&Metodi di compression:\"\n02000D05=\"Cree archivi &solit\"\n02000D06=\"&Parametris:\"\n02000D07=\"Opzions\"\n02000D08=\"Cree archivi SF&X\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Cifre i &nons dai files\"\n02000D0B=\"Nive&l di compression:\"\n02000D0C=\"&Dimension dizionari:\"\n02000D0D=\"Dimension &peraule:\"\n02000D0E=\"Utilizazion memorie comprimint:\"\n02000D0F=\"Utilizazion memorie decomprimint:\"\n02000D10=\"Ciframent\"\n02000D11=\"Metodi di ciframent:\"\n\n02000D40=\"Divît in &volums, grandece in bytes:\"\n02000D41=\"Dimension dai volums sbaliade\"\n02000D42=\"Dimension dai volums volude: {0} bytes.\\nSêstu sigûr di volê dividi l'archivi in tocs di cheste dimension?\"\n\n02000D81=\"Cence compression\"\n02000D82=\"Normâl\"\n02000D83=\"Massim\"\n02000D84=\"Svelt\"\n02000D85=\"Il pi svelt\"\n02000D86=\"Super\"\n\n02000D90=\"Sgarfe\"\n\n02000DA1=\"Zonte e sostituìs files\"\n02000DA2=\"Atualize e zonte files\"\n02000DA3=\"Atualize i files che esistin\"\n02000DA4=\"Sincronize i files\"\n\n02000DB1=\"Ducj i files\"\n\n02000DC0=\"Daûr a comprimi\"\n\n; Columns dialog\n02000E00=\"Colonis\"\n02000E01=\"Selezione lis colonis che tu vuelis rindi visibilis in cheste cartele. Dopre i botons Pare sù e Pare jù par gambiâ l'ordin des colonis.\"\n02000E02=\"La colone selezionade e à di jessi\"\n02000E03=\"pixels &largje.\"\n\n02000E10=\"Par&e sù\"\n02000E11=\"Pare &jù\"\n02000E12=\"&Mostre\"\n02000E13=\"&Plate\"\n02000E14=\"Configure\"\n\n02000E81=\"Titul\"\n02000E82=\"Largjece\"\n\n; Testing\n02000F90=\"Daûr a provâ\"\n\n\n; File Manager\n\n03000000=\"7-Zip - Aministradôr di files\"\n\n; Menu\n03000102=\"&File\"\n03000103=\"&Modifiche\"\n03000104=\"&Viodude\"\n03000105=\"&Imprescj\"\n03000106=\"&Jutori\"\n03000107=\"&Preferîts\"\n\n; File\n03000210=\"&Viarç\"\n03000211=\"Viarç dentri 7-&Zip\"\n03000212=\"V&iarç fûr di 7-Zip\"\n03000220=\"&Mostre\"\n03000221=\"M&odifiche\"\n03000230=\"Gambie &non\"\n03000231=\"&Copie in...\"\n03000232=\"Mô&f in...\"\n03000233=\"&Elimine\"\n03000240=\"P&ropietâts\"\n03000241=\"Comen&t\"\n03000242=\"Calcole chec&ksum\"\n03000250=\"Cree cartele\"\n03000251=\"Cree file\"\n03000260=\"V&a fûr\"\n03000270=\"&Divît file...\"\n03000271=\"Torne a &unî files...\"\n\n; Edit\n03000310=\"&Anule\"\n03000311=\"Torne a &fâ\"\n03000320=\"&Taie\"\n03000321=\"&Copie\"\n03000322=\"Tac&he\"\n03000323=\"&Elimine\"\n03000330=\"Selezione d&ut\"\n03000331=\"&Deselezione dut\"\n03000332=\"&Invertìs selezion\"\n03000333=\"Selezione...\"\n03000334=\"Deselezione...\"\n03000335=\"Selezione par gjenar\"\n03000336=\"Deselezione par gjenar\"\n\n; View\n03000410=\"Iconis &grandis\"\n03000411=\"Iconis &piçulis\"\n03000412=\"&Liste\"\n03000413=\"&Detais\"\n03000420=\"Cence ordin\"\n03000430=\"Viarç cartele principâl\"\n03000431=\"Parsore di un nivel\"\n03000432=\"Storic des cartelis...\"\n03000440=\"&Atualize\"\n03000449=\"Viodude plane\"\n03000450=\"&2 panei\"\n03000451=\"Sbaris dai impresc&j\"\n03000460=\"Sbare dai imprescj par l'archivi\"\n03000461=\"Sbare dai imprescj standard\"\n03000462=\"Botons larcs\"\n03000463=\"Mostre test dai botons\"\n\n; Tools\n03000510=\"&Opzions...\"\n03000511=\"&Banc di prove\"\n\n; Help\n03000610=\"&Argoments...\"\n03000620=\"&Informazions su 7-Zip...\"\n\n; Favorites\n03000710=\"&Zonte cartele ai Preferîts sicu\"\n03000720=\"Preferît\"\n\n; Options Dialog\n\n03010000=\"Opzions\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Opzions...\"\n\n; Edit\n03010200=\"Editôr\"\n03010201=\"&Editôr:\"\n\n; System\n03010300=\"Sisteme\"\n03010302=\"Associe 7-Zip cun:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Configurazion\"\n03010401=\"Mostre l'element \\\"..\\\"\"\n03010402=\"Mostre lis veris iconis dai files\"\n03010410=\"Mostre il menù dal sisteme\"\n03010420=\"&Selezione la rie intire\"\n03010421=\"Mostre les liniis de &gridele sot\"\n03010430=\"Mût di selezion &alternatîf\"\n03010440=\"Dopre pagjinis di memorie &largjis\"\n\n; Strings\n\n03020201=\"Copie\"\n03020202=\"Môf\"\n03020203=\"Copie in:\"\n03020204=\"Môf in:\"\n03020205=\"Daûr a copiâ...\"\n03020206=\"Daûr a movi...\"\n03020207=\"No si pues movi o copiâ elements di chest gjenar di cartelis.\"\n03020208=\"L'operazion no je supuartade.\"\n03020209=\"Sielç la cartele di destinazion.\"\n\n03020210=\"Conferme de eliminazion dal file\"\n03020211=\"Conferme de eliminazion de cartele\"\n03020212=\"Conferme de eliminazion di plui files\"\n03020213=\"Sêstu sigûr di volê eliminâ '{0}'?\"\n03020214=\"Sêstu sigûr di volê eliminâ la cartele '{0}' e dut ce ch'al è lì dentri?\"\n03020215=\"Sêstu sigûr di volê eliminâ chescj {0} elements?\"\n03020216=\"Daûr a eliminâ...\"\n03020217=\"Erôr eliminant un file o une cartele\"\n\n03020220=\"Daûr a gambiâ non...\"\n03020221=\"Erôr gambiant non a un file o une cartele\"\n03020222=\"Conferme de copie dai files\"\n03020223=\"Sêstu sigûr di volê copiâ i files tal archivi\"\n\n03020230=\"Cree cartele\"\n03020231=\"Non de cartele:\"\n03020232=\"Gnove cartele\"\n03020233=\"Erôr inte creazion de cartele\"\n\n03020240=\"Cree file\"\n03020241=\"Non dal file:\"\n03020242=\"Gnûf file\"\n03020243=\"Erôr inte creazion dal file\"\n\n03020250=\"Selezione\"\n03020251=\"Deselezione\"\n03020252=\"Filtri:\"\n\n03020260=\"Storic des cartelis\"\n\n03020280=\"Il file '{0}' al è stât modificât.\\nVuelistu atualizâlu intal archivi?\"\n03020281=\"No si pues atualizâ il file\\n'{0}'\"\n03020282=\"No si pues inviâ l'editôr.\"\n03020283=\"Daûr a viarzi...\"\n\n03020290=\"Coment\"\n03020291=\"&Coment:\"\n\n030202A0=\"Sisteme\"\n\n03020300=\"Ordenadôr\"\n03020301=\"Rêt\"\n\n03020400=\"Zonte\"\n03020401=\"Tire fûr\"\n03020402=\"Prove\"\n\n03020420=\"Copie\"\n03020421=\"Môf\"\n03020422=\"Elimine\"\n03020423=\"Info\"\n\n03020500=\"Divît file\"\n03020501=\"&Divît in:\"\n03020510=\"Daûr a dividi...\"\n03020520=\"Conferme de division\"\n03020521=\"Sêstu sigûr di volê dividi il file in {0} tocs?\"\n03020522=\"La dimension di un volum e à di jessi plui piçule di chê dal file origjinâl\"\n\n03020600=\"Torne a unî files\"\n03020601=\"&Torne a unî in:\"\n03020610=\"Daûr a tornâ a unî...\"\n03020620=\"Sielç dome il prin file\"\n\n03020710=\"Daûr a calcolâ il checksum...\"\n03020720=\"Informazions sul checksum\"\n03020721=\"Checksum CRC pai dâts:\"\n03020722=\"Checksum CRC pai dâts e i nons:\"\n\n03020800=\"Daûr a scandaiâ...\"\n\n; Computer\n03031100=\"Dimension totâl\"\n03031101=\"Puest libar\"\n03031102=\"Dimension setôr\"\n03031103=\"Etichete\"\n\n; Network\n03031200=\"Non locâl\"\n03031201=\"Furnidôr\"\n\n; Benchmark Dialog\n\n03080000=\"Banc di prove\"\n03080001=\"Utilizazion memorie:\"\n03080002=\"Comprimint\"\n03080003=\"Decomprimint\"\n03080004=\"Sveltece\"\n03080005=\"Valutazion\"\n03080006=\"Valutazion totâl\"\n03080007=\"Corint\"\n03080008=\"Risultant\"\n03080009=\"Passaçs:\"\n0308000A=\"Erôrs:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/fy.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by Berend Ytsma\n;\n;\n;\n\n00000000=\"Frisian\"\n00000001=\"Frysk\"\n00000002=\"98\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Konfiguraasje\"\n\n; Info Page\n01000100=\"7-Zip it hoe en het\"\n01000103=\"7-Zip is fergees. Mar, jo kinne de ûntwikkeling stypje troch jo te registrearjen.\"\n01000104=\"Stipe\"\n01000105=\"Registrearje\"\n\n; Folders Page\n01000200=\"Mappen\"\n01000210=\"&Wurkmap\"\n01000211=\"&Tydlikesysteemmap\"\n01000212=\"&Aktive\"\n01000213=\"&Oantsjutte:\"\n01000214=\"Allinnich brûke foar útnimbere skiven\"\n\n01000281=\"ynfiere fan de lokaasje foar tydlike argyftriemmen.\"\n\n; System Page\n01000300=\"Systeem\"\n01000301=\"Yntegraasje fan 7-Zip yn ferbânmenu\"\n01000302=\"Ferbânmenu yn trepfoarm\"\n01000310=\"Ferbânmenu-items:\"\n\n; Language Page\n01000400=\"Taal\"\n01000401=\"Taal:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip kommando\"\n02000103=\"Argyf iepenje\"\n02000104=\"Iepenet it selektearre argyf.\"\n02000105=\"Triemmen útpakke...\"\n02000106=\"Triemmen út it selektearre argyf útpakke.\"\n02000107=\"Oan argyf taheakje...\"\n02000108=\"De selektearre items wurde oan argyf taheakke.\"\n02000109=\"Argyf teste\"\n0200010A=\"Besjocht de yntegriteit fan it selektearre argyf.\"\n0200010B=\"Hjir útpakke\"\n0200010C=\"Triemmen út it selektearre argyf yn de aktive map útpakke.\"\n0200010D=\"Utpakke yn {0}\"\n0200010E=\"Utpakke fan triemmen yn ûndermap.\"\n0200010F=\"Oan {0} taheakje\"\n02000110=\"Foeget de selektearre items ta oan argyf.\"\n02000111=\"komprimearje en ferstjoere...\"\n02000112=\"Komprimearret de selektearre items nei argyf en stjoerd argyf fuort mei e-post.\"\n02000113=\"Komprimearje nei {0} en poste\"\n02000114=\"komprimearret de selektearre items nei argyf en stjoerd argyf fuort mei e-post.\"\n\n02000140=\"<Map>\"\n02000141=\"<Argyf>\"\n\n; Properties\n02000203=\"Paad\"\n02000204=\"Namme\"\n02000205=\"Taheaksel\"\n02000206=\"Map\"\n02000207=\"Grutte\"\n02000208=\"Ynpakte grutte\"\n02000209=\"Skaaimerk\"\n0200020A=\"Makke\"\n0200020B=\"Lêste tagong\"\n0200020C=\"Feroare\"\n0200020D=\"Kompakt\"\n0200020E=\"Kommentaar\"\n0200020F=\"Fersifere\"\n02000210=\"Spjalt foar\"\n02000211=\"Spjalt efter\"\n02000212=\"Wurdboek\"\n02000213=\"CRC\"\n02000214=\"Type\"\n02000215=\"Anty\"\n02000216=\"Metoade\"\n02000217=\"Host OS\"\n02000218=\"Triemsysteem\"\n02000219=\"Brûker\"\n0200021A=\"Keppel\"\n0200021B=\"Blok\"\n0200021C=\"Kommentaar\"\n0200021D=\"Posysje\"\n0200021E=\"Paad foarheaksel\"\n0200021F=\"Mappen\"\n02000220=\"Triemmen\"\n02000221=\"Ferzje\"\n02000222=\"Folume\"\n02000223=\"Multifolume\"\n02000224=\"Offset\"\n02000225=\"Links\"\n02000226=\"Blokken\"\n02000227=\"Folumes\"\n\n; Status bar\n02000301=\"{0} objekt(en) selektearre\"\n02000302=\"{0} objekt(en)\"\n\n02000320=\"Triemmen:\"\n02000321=\"Mappen:\"\n02000322=\"Grutte:\"\n02000323=\"Komprimearregrutte:\"\n02000324=\"Argiven:\"\n\n; List Context Menu\n02000401=\"&Kolommen...\"\n\n02000411=\"&Iepenje\"\n02000412=\"&Utpakke...\"\n\n; ToolBar\n02000501=\"Utpakke\"\n\n; Messages\n02000601=\"Bywurk operaasje waard net stipe troch dit argyf.\"\n02000602=\"Kin argyf {0} net bywurkje\"\n02000603=\"Kin map '{0}' net meitsje \"\n02000604=\"Triem is in net stipe argyf.\"\n02000605=\"Flater\"\n02000606=\"Tefolle items\"\n02000607=\"Der is gjin applikaasje ferbûn oan dit triem taheaksel\"\n02000608=\"Der binne gjin flaters\"\n02000609=\"Kin triem '{0} net as argyf iepenje\"\n0200060A=\"Kin fersifere argyf '{0}' net iepenje. Ferkeard wachtwurd?\"\n\n; Dialogs\n02000702=\"Okee\"\n02000705=\"&Jawis\"\n02000707=\"Jawis foar &Alles\"\n02000709=\"&Nee\"\n0200070B=\"Nee foar A&lles\"\n\n02000710=\"Ofbrekke\"\n02000711=\"&Ofbrekke\"\n02000713=\"&Slute\"\n02000714=\"Stopje\"\n02000715=\"Opnij begjinne\"\n\n02000720=\"Help\"\n\n; Extract dialog\n02000800=\"Utpakke\"\n02000801=\"U&tpakke nei:\"\n02000802=\"Wachtwurd\"\n\n02000810=\"Paad modus\"\n02000811=\"Folsleine paadnammen\"\n02000812=\"Aktive paadnammen\"\n02000813=\"Gjin paadnammen\"\n\n02000820=\"Oerskriuw modus\"\n02000821=\"Freegje foardat jo oerskriuwe\"\n02000822=\"Oerskriuwe sûnder pront\"\n02000823=\"Besteande triemmen oerslaan\"\n02000824=\"Automatysk omneame\"\n02000825=\"Automatysk ek by besteande triemmen\"\n\n02000830=\"Triemmen\"\n02000831=\"&Selektearre triemmen\"\n02000832=\"&Alle triemmen\"\n\n02000881=\"De lokaasje om nei út te pakken oantsjutte.\"\n\n02000890=\"Utpakke\"\n\n; Overwrite dialog\n02000900=\"It ferfangen fan de triem befêstigje\"\n02000901=\"Bestimmingsmap befettet al in triem mei dizze namme.\"\n02000902=\"Wolle jo de triem ferfange\"\n02000903=\"Mei dizze?\"\n\n02000911=\"A&utomatysk omneame\"\n\n02000982=\"{0} bytes\"\n02000983=\"Feroare op\"\n\n; Messages dialog\n02000A00=\"Diagnostyk berjocht\"\n\n02000A80=\"Berjocht\"\n\n02000A91=\"Net stipe kompresjemetoade foar '{0}'.\"\n02000A92=\"Data flater yn '{0}'. Triem is beskeadige.\"\n02000A93=\"CRC mislearre yn '{0}'. Triem is beskeadige.\"\n02000A94=\"Data flater yn fersifere triem '{0}'. Ferkeard wachtwurd?\"\n02000A95=\"CRC mislearre yn fersifere triem '{0}'. Ferkeard wachtwurd?\"\n\n; Password dialog\n02000B00=\"Wachtwurd ynfiere\"\n02000B01=\"Wachtwurd ynfiere:\"\n02000B02=\"Wachtwurd &sjen litte\"\n02000B03=\"Wachwurd opnij ynfiere:\"\n02000B10=\"Wachtwurden komme net oerien\"\n02000B11=\"Brûk allinne ingelske letters, nûmers en spesjale karakters (!, #, $, ...) foar it wachtwurd\"\n02000B12=\"Wachtwurd is te lang\"\n\n; Progress dialog\n02000C00=\"Proses\"\n02000C01=\"Ferstrutsen tiid:\"\n02000C02=\"Tiid noch te gean:\"\n02000C03=\"Totale grutte:\"\n02000C04=\"Fluggens:\"\n02000C05=\"Ferwurke:\"\n02000C06=\"Kompresje nivo:\"\n\n02000C10=\"&Eftergrûn\"\n02000C11=\"&Foargrûn\"\n02000C12=\"&Skoftsje\"\n02000C13=\"&Ferfetsje\"\n\n02000C20=\"Skoft\"\n\n02000C30=\"Binne jo wis dat jo ôfbrekke wolle?\"\n\n; Compress dialog\n02000D00=\"Oan argyf taheakje\"\n02000D01=\"&Argyf:\"\n02000D02=\"&Bywurkmodus:\"\n02000D03=\"Argyf &formaat:\"\n02000D04=\"Kompresje&metoade:\"\n02000D05=\"&Kompakt argyf meitsje\"\n02000D06=\"&Parameters:\"\n02000D07=\"Opsjes\"\n02000D08=\"Meitsje SF&X-argyf\"\n02000D09=\"Meardere streamen\"\n02000D0A=\"Fersiferje triem&nammen\"\n02000D0B=\"Kompresje&nivo:\"\n02000D0C=\"&Wurdboekgrutte:\"\n02000D0D=\"&Wurdgrutte:\"\n02000D0E=\"Unthâld gebrûk by komprimearjen:\"\n02000D0F=\"Unthâld gebrûk by ûntkomprimearjen:\"\n02000D10=\"Fersifering\"\n02000D11=\"Fersiferingmetoade:\"\n02000D12=\"Tal CPU trieden:\"\n02000D13=\"Kompakte blokgrutte:\"\n02000D14=\"net-kompakt\"\n02000D15=\"Kompakt\"\n02000D16=\"Dielde triemmen komprimearje\"\n\n02000D40=\"Spjalte nei &folumes, bytes:\"\n02000D41=\"Net juste folumegrutte\"\n02000D42=\"Oantsjutte folumegrutte: {0} bytes.\\nWolle jo it argyf yn sokke folumes spjalte?\"\n\n\n02000D81=\"Bewarje\"\n02000D82=\"Normaal\"\n02000D83=\"Maksimum\"\n02000D84=\"Fluch\"\n02000D85=\"Fluchst\"\n02000D86=\"Ultra\"\n\n02000D90=\"Blêdzje\"\n\n02000DA1=\"Triemmen taheakje en ferfange\"\n02000DA2=\"Triemmen taheakje en bywurkje\"\n02000DA3=\"Besteande triemmen ferfarskje\"\n02000DA4=\"Triemmen lyk rinne litte\"\n\n02000DB1=\"Alle triemmen\"\n\n02000DC0=\"Oan it komprimearjen\"\n\n; Columns dialog\n02000E00=\"Kolommen\"\n02000E01=\"Kontrolearje de kolommen dy't jo yn dizze map sichtber meitsje wolle. Brûk de omheech en omleech knoppen om de kolommen te oarderjen.\"\n02000E02=\"De selektearre kolom soe\"\n02000E03=\"Piksels &breed wêze moatte.\"\n\n02000E10=\"Om&heech ferpleatse\"\n02000E11=\"Om&leech ferpleatse\"\n02000E12=\"&Sjen litte\"\n02000E13=\"&Fertopje\"\n02000E14=\"Set\"\n\n02000E81=\"Titel\"\n02000E82=\"Breedte\"\n\n; Testing\n02000F90=\"Oan it Testen\"\n\n\n; File Manager\n\n03000000=\"7-Zip Triembehearder\"\n\n; Menu\n03000102=\"&Triem\"\n03000103=\"&Bewurkje\"\n03000104=\"&Byld\"\n03000105=\"&Ark\"\n03000106=\"&Help\"\n03000107=\"B&lêdwizers\"\n\n; File\n03000210=\"&Iepenje\"\n03000211=\"Iepenje &yn\"\n03000212=\"Iepenje bû&ten\"\n03000220=\"&Byld\"\n03000221=\"&Bewurkje\"\n03000230=\"Omne&ame\"\n03000231=\"&Kopiearje nei...\"\n03000232=\"&Ferpleats nei...\"\n03000233=\"&Wiskje\"\n03000240=\"E&igenskippen\"\n03000241=\"Komme&ntaar\"\n03000242=\"Kontrôlesom berekenje\"\n03000250=\"Map meitsje\"\n03000251=\"Triem meitsje\"\n03000260=\"U&tgong\"\n03000270=\"Triemmen &spjalte...\"\n03000271=\"Triemmen Kom&binearje...\"\n\n; Edit\n03000310=\"&Ungedien meitsje\"\n03000311=\"&Opnij\"\n03000320=\"Kni&ppe\"\n03000321=\"&Kopiearje\"\n03000322=\"&Plakke\"\n03000323=\"&Wiskje\"\n03000330=\"&Alles selektearje\"\n03000331=\"Alles net selektearje\"\n03000332=\"&Seleksje omdraaien\"\n03000333=\"Selektearje...\"\n03000334=\"Net selektearje...\"\n03000335=\"Selektearje neffens type\"\n03000336=\"Net selektearje neffens type\"\n\n; View\n03000410=\"Gru&tte Ikoanen\"\n03000411=\"L&ytse Ikoanen\"\n03000412=\"&List\"\n03000413=\"&Details\"\n03000420=\"Net Sortearre\"\n03000430=\"Haadmap iepenje\"\n03000431=\"Ien nivo omheech\"\n03000432=\"Maphistoarje...\"\n03000440=\"&Ferfarskje\"\n03000449=\"Platte werjefte\"\n03000450=\"&2 Panielen\"\n03000451=\"&Arkbalke\"\n03000460=\"Argyf arkbalke\"\n03000461=\"Standert arkbalke\"\n03000462=\"Grutte knoppen\"\n03000463=\"Knoptekst sjen litte\"\n\n; Tools\n03000510=\"&Opsjes...\"\n03000511=\"&Ykpunt\"\n\n; Help\n03000610=\"&Ynhâld...\"\n03000620=\"&7-Zip it hoe en het...\"\n\n; Favorites\n03000710=\"Map oan blêdwizers &taheakje  as\"\n03000720=\"Blêdwizer meitsje\"\n\n; Options Dialog\n\n03010000=\"Opsjes\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Opsjes...\"\n\n; Edit\n03010200=\"Bewurker\"\n03010201=\"&Bewurker:\"\n\n; System\n03010300=\"Systeem\"\n03010302=\"Ferbyn 7-Zip Mei:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Ynstellings\"\n03010401=\"\\\"..\\\" item sjen litte\"\n03010402=\"Echte triem ikoanen sjen litte\"\n03010410=\"Systeemmenu sjen litte\"\n03010420=\"&Folsleine rige selektearje\"\n03010421=\"&Roaster sjen litte\"\n03010430=\"&Alternative seleksje modus\"\n03010440=\"Brûk &grut ûnthâld siden\"\n\n; Strings\n\n03020201=\"Kopiearje\"\n03020202=\"Ferpleatse\"\n03020203=\"Kopiearje nei:\"\n03020204=\"Ferpleats nei:\"\n03020205=\"Oan it kopiearren...\"\n03020206=\"Oan it ferpleatsen...\"\n03020207=\"Jo kinne net foar sokke mappen items kopiearje of ferpleatse\"\n03020208=\"Operaasje wurdt net stipe.\"\n03020209=\"Bestimmingsmap selektearje.\"\n\n03020210=\"It wiskjen fan de triem befêstigje\"\n03020211=\"It wiskjen fan de map befêstigje\"\n03020212=\"It wiskjen fan meardere triemmen befêstigje\"\n03020213=\"Binne jo wis dat jo '{0}' wiskje wolle?\"\n03020214=\"Binne jo wis dat jo de map '{0}' en al syn ynhâld wiskje wolle?\"\n03020215=\"Binne jo wis dat jo {0} items wiskje wolle?\"\n03020216=\"Oan it wiskjen\"\n03020217=\"Flater by it wiskjen fan triem of map\"\n\n03020220=\"Omneame...\"\n03020221=\"Flater by it omneamen fan triem of map\"\n03020222=\"Triem kopiearje befêstigje\"\n03020223=\"Binne jo wis dat jo de triemmen nei it argyf kopiearje wolle?\"\n\n03020230=\"Map meitsje\"\n03020231=\"Mapnamme:\"\n03020232=\"Nije map\"\n03020233=\"Flater by it meitsjen fan map\"\n\n03020240=\"Triem meitsje\"\n03020241=\"Triem namme:\"\n03020242=\"Nije triem\"\n03020243=\"Flater by’t meitsjen fan triem\"\n\n03020250=\"Selektearje\"\n03020251=\"Net Selektearje\"\n03020252=\"Masker:\"\n\n03020260=\"Maphistoarje\"\n\n03020280=\"Triem '{0}' is wizige.\\nWolle jo it bywurkje yn it argyf?\"\n03020281=\"Kin triem '{0}'\\nnet bywurkje\"\n03020282=\"Kin bewurker net starte.\"\n03020283=\"Oan it iepenjen...\"\n\n03020290=\"Kommentaar\"\n03020291=\"&Kommentaar:\"\n\n030202A0=\"Systeem\"\n\n03020300=\"Kompjûter\"\n03020301=\"Netwurk\"\n\n03020400=\"Taheakje\"\n03020401=\"Utpakke\"\n03020402=\"Test\"\n\n03020420=\"Kopiearje\"\n03020421=\"Ferpleatse\"\n03020422=\"Wiskje\"\n03020423=\"Ynformaasje\"\n\n03020500=\"Triem spjalte\"\n03020501=\"&Spjalt nei:\"\n03020510=\"Oan it Spjalten...\"\n03020520=\"Spjalte befêstigje\"\n03020521=\"Wolle jo de triem spjalte yn {0} dielen?\"\n03020522=\"Folumegrutte moat lytser wêze dan de grutte fan it orizjineel\"\n\n\n03020600=\"Triemmen kombinearje\"\n03020601=\"&Kombinearje nei:\"\n03020610=\"Oan it kombinearjen...\"\n03020620=\"Allinne earste triem selektearje\"\n\n03020710=\"Kontrôlesom oan it berekenjen...\"\n03020720=\"Kontrôlesom ynformaasje\"\n03020721=\"CRC kontrôlesom foar data:\"\n03020722=\"CRC kontrôlesom foar data en nammen:\"\n\n03020800=\"Oan it skennen...\"\n\n03020900=\"Eigenskippen\"\n\n; Computer\n03031100=\"Totale grutte\"\n03031101=\"Frije romte\"\n03031102=\"Kluster grutte\"\n03031103=\"Kaartsje\"\n\n\n; Network\n03031200=\"Lokale namme\"\n03031201=\"Ferskaffer\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Unthâld gebrûk:\"\n03080002=\"Oan it komprimearren\"\n03080003=\"Oan it ûntkomprimearren\"\n03080004=\"Fluggens\"\n03080005=\"Wurdearring\"\n03080006=\"Totale Wurdearring\"\n03080007=\"Hjoeddeiske\"\n03080008=\"Resultaat\"\n03080009=\"Kear foarbei:\"\n0308000A=\"Flaters:\"\n0308000B=\"CPU brûkens\"\n0308000C=\"Beoardieling / Brûkens\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/gl.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 3.12\n; Translated by Xosé Calvo\n;\n;\n;\n;\n\n00000000=\"Galician\"\n00000001=\"Galego\"\n00000002=\"101\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuración do 7-Zip\"\n\n; Info Page\n01000100=\"Sobre o 7-Zip\"\n01000103=\"7-Zip é un programa gratuito. Contodo, pode contribuir co seu desenvolvimento rexistrándose. Se se rexistrar, terá direito a receber apoio técnico.\"\n01000105=\"Rexistrar\"\n\n; Folders Page\n01000200=\"Cartafois\"\n01000210=\"&cartafol de traballo\"\n01000211=\"Cartafol &temporario do sistema\"\n01000212=\"Cartafol a&ctual\"\n01000213=\"&Especificar:\"\n01000214=\"Usar só discos removíveis\"\n\n01000281=\"Especificar unha localización para os ficheiros de arquivo temporarios.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integratar 7-Zip no menú de contexto\"\n01000302=\"Menú de contexto en cascata\"\n01000310=\"Elementos do Menú de contexto:\"\n\n; Language Page\n01000400=\"Idioma\"\n01000401=\"Idioma:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comandos do 7-Zip\"\n02000103=\"Abrir arquivo\"\n02000104=\"Abre o arquivo seleccionado.\"\n02000105=\"Extrair ficheiros...\"\n02000106=\"Extrae ficheiros do arquivo seleccionado.\"\n02000107=\"Adicionar ao arquivo...\"\n02000108=\"Engade os elementos seleccionados ao arquivo.\"\n02000109=\"Comprobar arquivo\"\n0200010A=\"Comproba a integridade do arquivo seleccionado.\"\n0200010B=\"Extrair Aquí\"\n0200010C=\"Extrae ficheiros do arquivo seleccionado para o cartafol actual.\"\n0200010D=\"Extrair para {0}\"\n0200010E=\"Extrae ficheiros para o sub-cartafol.\"\n0200010F=\"Adicionar a {0}\"\n02000110=\"Engade os elementos seleccionados ao arquivo.\"\n02000111=\"Comprimir e enviar por correo...\"\n02000112=\"Comprime os elementos seleccionados para un arquivo e envía o arquivo mediante correo electrónico.\"\n02000113=\"Comprimir a {0} e enviar por correo\"\n02000114=\"Comprime os elementos seleccionados para ese arquivo e envía o arquivo mediante correo electrónico.\"\n\n02000140=\"<Cartafol>\"\n02000141=\"<Arquivo>\"\n\n; Properties\n02000203=\"Camiño\"\n02000204=\"Nome\"\n02000205=\"Extensión\"\n02000206=\"Cartafol\"\n02000207=\"Tamaño\"\n02000208=\"Tamaño comprimido\"\n02000209=\"Atributos\"\n0200020A=\"Creado\"\n0200020B=\"Último acceso\"\n0200020C=\"Modificado\"\n0200020D=\"Sólido\"\n0200020E=\"Comentado\"\n0200020F=\"Encriptado\"\n02000210=\"Partir Antes\"\n02000211=\"Partir Depois\"\n02000212=\"Dicionario\"\n02000213=\"CRC\"\n02000214=\"Tipo\"\n02000215=\"Anti\"\n02000216=\"Método\"\n02000217=\"OS do Servidor\"\n02000218=\"Sistema de Ficheiros\"\n02000219=\"Usario\"\n0200021A=\"Grupo\"\n0200021B=\"Bloco\"\n0200021C=\"Comentario\"\n\n; Status bar\n02000301=\"{0} obxecto(s) seleccionados\"\n02000302=\"{0} obxecto(s)\"\n\n; List Context Menu\n02000401=\"&Columnas...\"\n\n02000411=\"&Abrir\"\n02000412=\"&Extrair...\"\n\n; ToolBar\n02000501=\"Extrair\"\n\n; Messages\n02000601=\"Este tipo de arquivo non permite actualizacións.\"\n02000602=\"Non é posíbel actualizar o arquivo {0}\"\n02000603=\"Non é posíbel crear o cartafol '{0}'\"\n02000604=\"Formato de ficheiro descoñecido.\"\n02000605=\"Erro\"\n02000606=\"Demasiados elementos\"\n02000607=\"Non existe nengunha apliación asociada con esta extensión de ficheiro\"\n02000608=\"Non se produciron erross\"\n\n; Dialogs\n02000702=\"Dacordo\"\n02000705=\"&Si\"\n02000707=\"Si a &Todo\"\n02000709=\"&Non\"\n0200070B=\"Non a T&odo\"\n\n02000710=\"Cancelar\"\n02000711=\"&Cancelar\"\n02000713=\"&Fechar\"\n02000714=\"Parar\"\n02000715=\"Reiniciar\"\n\n02000720=\"Axuda\"\n\n; Extract dialog\n02000800=\"Extrair\"\n02000801=\"E&xtrair para:\"\n02000802=\"Contrasinal\"\n\n02000810=\"Modo nome de cartafol\"\n02000811=\"Camiños completos\"\n02000812=\"Camiños actuais\"\n02000813=\"Sen camiños\"\n\n02000820=\"Modo sobreposición\"\n02000821=\"Con confirmación\"\n02000822=\"Sen confirmación\"\n02000823=\"Manter os ficheiros existentes\"\n02000824=\"Renomear automaticamente\"\n\n02000830=\"Ficheiros\"\n02000831=\"&Ficheiros seleccionados\"\n02000832=\"&Todos os ficheiros\"\n\n02000881=\"Especificar unha localización de destino para os ficheiros extraídos.\"\n\n02000890=\"Extraindo\"\n\n; Overwrite dialog\n02000900=\"Confirmar a Substitución dos Ficheiros\"\n02000901=\"O cartafol de destino xa contén un ficheiro co mesmo nome.\"\n02000902=\"Desexa substituir o ficheiro co mesmo nome\"\n02000903=\"por este?\"\n\n02000911=\"Renomear &automaticamente\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificado en\"\n\n; Messages dialog\n02000A00=\"mensaxes de diagnóstico\"\n\n02000A80=\"Mensaxe\"\n\n02000A91=\"Método de compresión non válido para '{0}'.\"\n02000A92=\"Erro de datos en '{0}'. O ficheiro está mal.\"\n02000A93=\"CRC fallou en '{0}'. O ficheiro está mal.\"\n\n; Password dialog\n02000B00=\"Introduza o contrasinal\"\n02000B01=\"Introduza o contrasinal:\"\n02000B02=\"&Mostrar o contrasinal\"\n\n; Progress dialog\n02000C00=\"Procesamento\"\n02000C01=\"Tempo pasado:\"\n02000C02=\"Tempo restante:\"\n02000C03=\"Tamaño:\"\n02000C04=\"Velocidade:\"\n\n02000C10=\"&Fondo\"\n02000C11=\"&Letras\"\n02000C12=\"&Pausa\"\n02000C13=\"&Continuar\"\n\n02000C20=\"Parado\"\n\n02000C30=\"Ten a certeza de que quer cancelar?\"\n\n; Compress dialog\n02000D00=\"Adicionar ao arquivo\"\n02000D01=\"&Arquivo:\"\n02000D02=\"&Modo de actualización:\"\n02000D03=\"&Format do arquivo:\"\n02000D04=\"&Tipo de compresión:\"\n02000D05=\"Crar arquvivo &Sólido\"\n02000D06=\"&Parámetros:\"\n02000D07=\"Opcións\"\n02000D08=\"Crear un arquivo SF&X\"\n02000D09=\"Múltiples fíos\"\n02000D0A=\"Encriptar os &nomes dos ficheiros\"\n02000D0B=\"&Nível de compresión:\"\n02000D0C=\"Tamaño do &dicionario:\"\n02000D0D=\"Tamaño das &palabras:\"\n02000D0E=\"Uso da memoria para a Compresión:\"\n02000D0F=\"Uso da memoria para a Decompresión:\"\n\n02000D40=\"Partir en &volumes, bytes:\"\n\n02000D81=\"Sen compresión\"\n02000D82=\"Normal\"\n02000D83=\"Máxima\"\n02000D84=\"Rápida\"\n02000D85=\"Máis rápida\"\n02000D86=\"Ultra\"\n\n02000D90=\"Ver\"\n\n02000DA1=\"Adicionar e substituir os ficheiros\"\n02000DA2=\"Actualizar e adicionar os ficheiros\"\n02000DA3=\"Só actualizar os ficheiros existentes\"\n02000DA4=\"Sincronizar os ficheiros\"\n\n02000DB1=\"Todos os ficheiros\"\n\n02000DC0=\"Comprimir\"\n\n; Columns dialog\n02000E00=\"Columnas\"\n02000E01=\"Seleccione as columnas que pretende facer visíbeis neste modo. Use as teclas RePág e AvPág para reordenar as columnas ao seu gosto.\"\n02000E02=\"A columna seleccionada debería ter\"\n02000E03=\"pixeis de &ancho.\"\n\n02000E10=\"Mover para &Arriba\"\n02000E11=\"Mover para &Baixo\"\n02000E12=\"&Mostrar\"\n02000E13=\"&Ocultar\"\n02000E14=\"Fixar\"\n\n02000E81=\"Título\"\n02000E82=\"Lonxitude\"\n\n; Testing\n02000F90=\"Proba\"\n\n\n; File Manager\n\n03000000=\"Xestor de Ficheiros do 7-Zip\"\n\n; Menu\n03000102=\"&Ficheiro\"\n03000103=\"&Modificar\"\n03000104=\"&Ver\"\n03000105=\"&Ferramentas\"\n03000106=\"&Axuda\"\n03000107=\"F&avoritos\"\n\n; File\n03000210=\"&Abrir\"\n03000211=\"Abrir &Dentro\"\n03000212=\"Abrir &Fora\"\n03000220=\"&Ver\"\n03000221=\"&Modificar\"\n03000230=\"Reno&mear\"\n03000231=\"&Copiar Para...\"\n03000232=\"&Mover Para...\"\n03000233=\"&Eliminar\"\n03000240=\"&Propriedades\"\n03000241=\"Come&ntario\"\n03000250=\"Crear Cartafol\"\n03000251=\"Crear Ficheiro\"\n03000260=\"Sa&ir\"\n\n; Edit\n03000310=\"&Desfacer\"\n03000311=\"&Refacer\"\n03000320=\"Cor&tar\"\n03000321=\"&Copiar\"\n03000322=\"&Pegar\"\n03000323=\"&Eliminar\"\n03000330=\"Seleccionar &Todo\"\n03000331=\"De-seleccionar Todo\"\n03000332=\"&Inverter a Selección\"\n03000333=\"Seleccionar...\"\n03000334=\"De-seleccionar...\"\n03000335=\"Seleccionar por Tipo\"\n03000336=\"De-select por Tipo\"\n\n; View\n03000410=\"Icones &Grandes\"\n03000411=\"Icones &Pequenos\"\n03000412=\"&Lista\"\n03000413=\"&Detalles\"\n03000420=\"Sen Orde\"\n03000430=\"Abrir o Cartafol Raíz\"\n03000431=\"Subir un Nível\"\n03000432=\"Histórico de Cartafois...\"\n03000440=\"&Refrescar\"\n03000450=\"&Dous Paineis\"\n03000451=\"&Barras de Ferramentas\"\n03000460=\"Barra de Ferramentas de arquivos\"\n03000461=\"Barra de Ferramentas normal\"\n03000462=\"Botóns grandes\"\n03000463=\"Mostrar o Texto dos Botóns\"\n\n; Tools\n03000510=\"&Opcións...\"\n03000511=\"&Análise\"\n\n; Help\n03000610=\"&Contido...\"\n03000620=\"&Acerca do 7-Zip...\"\n\n; Favorites\n03000710=\"&Adicionar o cartafol aos Favoritos como\"\n03000720=\"Marcador\"\n\n; Options Dialog\n\n03010000=\"Opciós\"\n\n; Plugins\n03010100=\"Extensións\"\n03010101=\"&Extensións:\"\n03010110=\"Opcións...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Asociar 7-Zip con:\"\n03010310=\"Extensión\"\n\n; Settings\n03010400=\"Axustes\"\n03010401=\"Mostrar o elemento \\\"..\\\"\"\n03010402=\"Mostrar os icones reais dos ficheiros\"\n03010410=\"Mostrar o menú do sistema\"\n\n; Strings\n\n03020201=\"Copiar\"\n03020202=\"Mover\"\n03020203=\"Copiar para:\"\n03020204=\"Mover para:\"\n03020205=\"A copiar...\"\n03020206=\"a mover...\"\n03020207=\"Non é posíbel mover ou copiar os elementos para eses cartafois.\"\n03020208=\"Non é posíbel efectuar esta operación.\"\n\n03020210=\"Confirmar Eliminar Ficheiro\"\n03020211=\"Confirmar Eliminar Cartafol\"\n03020212=\"Confirmar Eliminar Múltiplos Ficheiros\"\n03020213=\"Ten a certeza de que desexa eliminar '{0}'?\"\n03020214=\"Ten a certeza de que desexa eliminar o cartafol '{0}' e todo o seu contido?\"\n03020215=\"Ten a certeza de que desexa eliminar estes {0} elementos?\"\n03020216=\"A eliminar...\"\n03020217=\"Erro ao eliminar Ficheiro ou Cartafol\"\n\n03020220=\"A renomear...\"\n03020221=\"Erro ao Renomear Ficheiro ou Cartafol\"\n\n03020230=\"Crear Cartafol\"\n03020231=\"Nome do cartafol:\"\n03020232=\"Novo Cartafol\"\n03020233=\"Erro ao crear o Cartafol\"\n\n03020240=\"Crear Ficheiro\"\n03020241=\"Nome do Ficheiro:\"\n03020242=\"Novo Ficheiro\"\n03020243=\"Erro ao crear o Ficheiro\"\n\n03020250=\"Seleccionar\"\n03020251=\"De-seleccionar\"\n03020252=\"Máscara:\"\n\n03020260=\"Histórico dos Cartafois\"\n\n03020280=\"Modificouse o Ficheiro '{0}'.\\nQuéreo actualizar no arquivo?\"\n03020281=\"Non é posíbel actualizar o ficheiro\\n'{0}'\"\n03020282=\"Non se pode iniciar o editor.\"\n03020283=\"Abrindo...\"\n\n03020290=\"Comentario\"\n03020291=\"&Comentario:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Computador\"\n03020301=\"Rede\"\n\n03020400=\"Adicionar\"\n03020401=\"Extrair\"\n03020402=\"Probar\"\n\n03020420=\"Copiar\"\n03020421=\"Mover\"\n03020422=\"Eliminar\"\n03020423=\"Información\"\n\n; Computer\n03031100=\"Tamaño total\"\n03031101=\"Tamaño disponíbel\"\n03031102=\"Tamaño co cluster\"\n03031103=\"Etiqueta\"\n\n; Network\n03031200=\"Nome local\"\n03031201=\"Fornecedor\"\n\n; Benchmark Dialog\n\n03080000=\"Análise\"\n03080001=\"Uso da memoria:\"\n03080002=\"Compresión\"\n03080003=\"Decompresión\"\n03080004=\"Rapidez\"\n03080005=\"Relación\"\n03080006=\"Relación total\"\n03080007=\"Actual\"\n03080008=\"Resultante\"\n03080009=\"Pases:\"\n0308000A=\"Erros:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/he.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.37 beta\n; Translated by Jonathan Lahav\n;\n;\n;\n;\n\n00000000=\"Hebrew\"\n00000001=\"עברית\"\n00000002=\"13\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip תצורת\"\n\n; Info Page\n01000100=\"7-Zip אודות\"\n01000103=\"זו היא תוכנה חופשית. עם זאת, ביכולתך לתמוך בפיתוח התוכנה על ידי הרשמה\"\n01000104=\"תמיכה\"\n01000105=\"הרשמה\"\n\n; Folders Page\n01000200=\"תיקיות\"\n01000210=\"&תיקיית עבודה\"\n01000211=\"של המ&ערכת \\\"Temp\\\" תיקיית ה\"\n01000212=\"&נוכחית\"\n01000213=\"&בחר תיקייה:\"\n01000214=\"השתמש בהגדרות אלו עבור כוננים ניידים בלבד\"\n\n01000281=\".בחר מיקום לקבצי ארכיון זמניים\"\n\n; System Page\n01000300=\"מערכת\"\n01000301=\"שלב את התוכנה בתפריט-ההקשר הכללי\"\n01000302=\"תפריט מדורג\"\n01000310=\"פריטי תפריט:\"\n\n; Language Page\n01000400=\"שפה\"\n01000401=\"שפה:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip פקודות\"\n02000103=\"פתח ארכיון\"\n02000104=\".פותח את הארכיון שנבחר\"\n02000105=\"חלץ קבצים...\"\n02000106=\".מחלץ קבצים מהארכיון שנבחר\"\n02000107=\"הוסף לארכיון...\"\n02000108=\".מוסיף את הקבצים שנבחרו לארכיון\"\n02000109=\"בדוק ארכיון\"\n0200010A=\".בודק את תקינות הארכיון שנבחר\"\n0200010B=\"חלץ לפה\"\n0200010C=\".מחלץ קבצים מהארכיון שנבחר לתיקייה הנוכחית\"\n0200010D=\"{0} -חלץ ל\"\n0200010E=\".מחלץ קבצים לתיקיות משנה\"\n0200010F=\"{0} -הוסף ל\"\n02000110=\".מוסיף את הפריטים שנבחרו לארכיון\"\n02000111=\"כווץ ושלח בדוא\\\"ל...\"\n02000112=\".מכווץ את הפריטים שנבחרו לארכיון ושולח בדוא\\\"ל\"\n02000113=\"כווץ ל- {0} ושלח בדוא\\\"ל\"\n02000114=\".מכווץ את הפריטים שנבחרו לארכיון ושולח בדוא\\\"ל\"\n\n02000140=\"<תיקייה>\"\n02000141=\"<ארכיון>\"\n\n; Properties\n02000203=\"נתיב\"\n02000204=\"שם\"\n02000205=\"סיומת\"\n02000206=\"תיקייה\"\n02000207=\"גודל\"\n02000208=\"גודל מכווץ\"\n02000209=\"תכונות\"\n0200020A=\"נוצר\"\n0200020B=\"נצפה\"\n0200020C=\"השתנה\"\n0200020D=\"רצוף\"\n0200020E=\"הוער\"\n0200020F=\"הוצפן\"\n02000210=\"פצל לפני\"\n02000211=\"פצל אחרי\"\n02000212=\"מילון\"\n02000213=\"CRC\"\n02000214=\"סוג\"\n02000215=\"Anti\"\n02000216=\"שיטה\"\n02000217=\"מערכת הפעלה\"\n02000218=\"מערכת קבצים\"\n02000219=\"משתמש\"\n0200021A=\"קבוצה\"\n0200021B=\"קטע\"\n0200021C=\"הערה\"\n0200021D=\"מיקום\"\n0200021E=\"תחילית נתיב\"\n\n; Status bar\n02000301=\"{0} (פריט(ים) נבחר(ו\"\n02000302=\"{0} פריטים\"\n\n02000320=\"קבצים:\"\n02000321=\"תיקיות:\"\n02000322=\"גודל:\"\n\n; List Context Menu\n02000401=\"&טורים...\"\n\n02000411=\"&פתח\"\n02000412=\"&חלץ...\"\n\n; ToolBar\n02000501=\"חילוץ\"\n\n; Messages\n02000601=\".פעולות עדכון לא נתמכות עבור ארכיון זה\"\n02000602=\"{0} אין אפשרות לעדכן את הארכיון\"\n02000603=\"'{0}' אין אפשרות ליצור את התיקייה\"\n02000604=\".הקובץ אינו ארכיון הנתמך ע\\\"י התוכנה\"\n02000605=\"שגיאה\"\n02000606=\"יותר מדי פריטים\"\n02000607=\"סיומת שם הקובץ הנתון לא משוייכת לאף תוכנה\"\n02000608=\"אין שגיאות\"\n\n; Dialogs\n02000702=\"אישור\"\n02000705=\"&כן\"\n02000707=\"כן ל&הכל\"\n02000709=\"&לא\"\n0200070B=\"ל&א להכל\"\n\n02000710=\"ביטול\"\n02000711=\"&ביטול\"\n02000713=\"&סגור\"\n02000714=\"עצור\"\n02000715=\"התחל שוב\"\n\n02000720=\"עזרה\"\n\n; Extract dialog\n02000800=\"חילוץ\"\n02000801=\"&חלץ ל:\"\n02000802=\"סיסמה\"\n\n02000810=\"שיטת נתיבים\"\n02000811=\"נתיבים מלאים\"\n02000812=\"נתיבים נוכחיים\"\n02000813=\"ללא נתיבים\"\n\n02000820=\"החלפת קבצים\"\n02000821=\"שאל לפני החלפה\"\n02000822=\"החלף בלי לשאול\"\n02000823=\"דלג על קבצים קיימים\"\n02000824=\"שינוי שם אוטומטי\"\n02000825=\"שינוי שם אוטומטי לקבצים קיימים\"\n\n02000830=\"קבצים\"\n02000831=\"קבצים שנ&בחרו\"\n02000832=\"&כל הקבצים\"\n\n02000881=\".ציין יעד לקבצים שיחולצו\"\n\n02000890=\"מחלץ\"\n\n; Overwrite dialog\n02000900=\"אשר החלפת קובץ\"\n02000901=\".תיקיית היעד מכילה כבר קובץ בשם זה\"\n02000902=\"האם ברצונך להחליף את הקובץ הקיים\"\n02000903=\"?בקובץ הזה\"\n\n02000911=\"שינוי שם &אוטומטי\"\n\n02000982=\"{0} בתים\"\n02000983=\"השתנה ב\"\n\n; Messages dialog\n02000A00=\"הודעות איבחון\"\n\n02000A80=\"הודעה\"\n\n02000A91=\".'{0}' שיטת הכיווץ אינה נתמכת עבור\"\n02000A92=\".שגיאת מידע ב '{0}'. הקובץ מקולקל\"\n02000A93=\".נכשל ב '{0}'. הקובץ מקולקל CRC\"\n\n; Password dialog\n02000B00=\"כתוב סיסמה\"\n02000B01=\"כתוב סיסמה:\"\n02000B02=\"&הצג סיסמה\"\n\n; Progress dialog\n02000C00=\"תהליך\"\n02000C01=\"הזמן שעבר:\"\n02000C02=\"הזמן שנותר:\"\n02000C03=\"גודל:\"\n02000C04=\"מהירות:\"\n\n02000C10=\"&רקע\"\n02000C11=\"&קדמה\"\n02000C12=\"ה&שהה\"\n02000C13=\"ה&משך\"\n\n02000C20=\"מושהה\"\n\n02000C30=\"?האם אתה בטוח שברצונך לבטל\"\n\n; Compress dialog\n02000D00=\"הוסף לארכיון\"\n02000D01=\"&ארכיון:\"\n02000D02=\"מצב &עדכון:\"\n02000D03=\"&תסדיר הארכיון:\"\n02000D04=\"&שיטת הכיווץ:\"\n02000D05=\"צור קובץ &רצוף\"\n02000D06=\"&פרמטרים:\"\n02000D07=\"אפשרויות\"\n02000D08=\"צור ארכיון &חילוץ-עצמי\"\n02000D09=\"ריבוי-תהליכים\"\n02000D0A=\"&קדד שמות קבצים\"\n02000D0B=\"רמת &כיווץ:\"\n02000D0C=\"גודל מי&לון:\"\n02000D0D=\"גודל &מילה:\"\n02000D0E=\"זיכרון דרוש לכיווץ:\"\n02000D0F=\"זיכרון דרוש לחילוץ:\"\n\n02000D40=\"פצל לחלקים, בתים:\"\n\n02000D81=\"אחסון\"\n02000D82=\"רגילה\"\n02000D83=\"הכי טובה\"\n02000D84=\"מהירה\"\n02000D85=\"הכי מהירה\"\n02000D86=\"אולטרה\"\n\n02000D90=\"עיון\"\n\n02000DA1=\"הוסף והחלף קבצים\"\n02000DA2=\"עדכן והוסף קבצים\"\n02000DA3=\"רענן קבצים קיימים\"\n02000DA4=\"סנכרן קבצים\"\n\n02000DB1=\"כל הקבצים\"\n\n02000DC0=\"מכווץ\"\n\n; Columns dialog\n02000E00=\"עמודות\"\n02000E01=\".סמן את העמודות שברצונך שיופיעו בתיקייה זו. השתמש בכפתורים העלה והורד כדי לסדר מחדש את העמודות\"\n02000E02=\"העמודה שנבחרה תהיה ברוחב\"\n02000E03=\".&פיקסלים\"\n\n02000E10=\"ה&עלה\"\n02000E11=\"הו&רד\"\n02000E12=\"ה&צג\"\n02000E13=\"ה&סתר\"\n02000E14=\"קבע\"\n\n02000E81=\"כותרת\"\n02000E82=\"רוחב\"\n\n; Testing\n02000F90=\"בודק\"\n\n\n; File Manager\n\n03000000=\"7-Zip מנהל הקבצים של\"\n\n; Menu\n03000102=\"&קובץ\"\n03000103=\"&עריכה\"\n03000104=\"&תצוגה\"\n03000105=\"&כלים\"\n03000106=\"ע&זרה\"\n03000107=\"&מועדפים\"\n\n; File\n03000210=\"&פתח\"\n03000211=\"פתח ב&תוכנה\"\n03000212=\"פתח ב&חלון\"\n03000220=\"&הצג\"\n03000221=\"&ערוך\"\n03000230=\"&שנה שם\"\n03000231=\"העת&ק ל...\"\n03000232=\"העב&ר ל...\"\n03000233=\"&מחק\"\n03000240=\"מ&אפיינים\"\n03000241=\"הערה\"\n03000242=\"חשב סיכום ביקורת\"\n03000250=\"צור תקייה\"\n03000251=\"צור קובץ\"\n03000260=\"י&ציאה\"\n03000270=\"&פצל קובץ...\"\n03000271=\"מ&זג קבצים...\"\n\n; Edit\n03000310=\"&בטל\"\n03000311=\"ב&צע מחדש\"\n03000320=\"&גזור\"\n03000321=\"הע&תק\"\n03000322=\"&הדבק\"\n03000323=\"&מחק\"\n03000330=\"בח&ר הכל\"\n03000331=\"בטל בחירה\"\n03000332=\"ה&פוך בחירה\"\n03000333=\"בחר...\"\n03000334=\"בטל בחירה...\"\n03000335=\"בחר לפי סוג\"\n03000336=\"בטל בחירה לפי סוג\"\n\n; View\n03000410=\"סמלים &גדולים\"\n03000411=\"סמלים &קטנים\"\n03000412=\"&רשימה\"\n03000413=\"&פרטים\"\n03000420=\"לא מסודר\"\n03000430=\"פתח תיקיית שורש\"\n03000431=\"חזור שלב אחד\"\n03000432=\"היסטוריית תיקיות...\"\n03000440=\"ר&ענן\"\n03000449=\"פריסה מלאה\"\n03000450=\"&2 חלונות\"\n03000451=\"&סרגלי כלים\"\n03000460=\"סרגל ארכיון\"\n03000461=\"סרגל רגיל\"\n03000462=\"כפתורים גדולים\"\n03000463=\"כתוב את פעולת הכפתור מתחתיו\"\n\n; Tools\n03000510=\"&אפשרויות...\"\n03000511=\"&מבחן ביצועים\"\n\n; Help\n03000610=\"&תוכן...\"\n03000620=\"&7-Zip אודות...\"\n\n; Favorites\n03000710=\"&הוסף תיקייה למועדפים כ\"\n03000720=\"סימנייה\"\n\n; Options Dialog\n\n03010000=\"אפשרויות\"\n\n; Plugins\n03010100=\"תוספים\"\n03010101=\"&תוספים:\"\n03010110=\"אפשרויות...\"\n\n; Edit\n03010200=\"עורך\"\n03010201=\"&עורך:\"\n\n; System\n03010300=\"מערכת\"\n03010302=\"7-Zip שייך ל:\"\n03010310=\"תוסף\"\n\n; Settings\n03010400=\"הגדרות\"\n03010401=\"\\\"..\\\" הצג את\"\n03010402=\"הצג סמלים אמיתיים\"\n03010410=\"הצג גם את תפריט המערכת\"\n03010420=\"בחר את כל ה&שורה\"\n03010421=\"הצג קווי &טבלא\"\n03010430=\"שיטת &בחירה חלופית\"\n03010440=\"השתמש בקטעי זיכרון &גדולים יותר\"\n\n; Strings\n\n03020201=\"העתק\"\n03020202=\"העבר\"\n03020203=\"העתק ל:\"\n03020204=\"העבר ל:\"\n03020205=\"מעתיק...\"\n03020206=\"מעביר...\"\n03020207=\".אין אפשרות להעתיק/להעביר פריטים בתיקייה כזאת\"\n03020208=\".אין תמיכה לפעולה זו\"\n\n03020210=\"אשר מחיקת קובץ\"\n03020211=\"אשר מחיקת תיקייה\"\n03020212=\"אשר מחיקת מספר קבצים\"\n03020213=\"?'{0}' האם אתה בטוח שברצונך למחוק את\"\n03020214=\"?האם אתה בטוח שברצונך למחוק את התיקייה '{0}' ואת כל תוכנה\"\n03020215=\"?האם אתה בטוח שברצונך למחוק את {0} הפריטים האלה\"\n03020216=\"מוחק...\"\n03020217=\"אירעה שגיאה במחיקת קובץ או תיקייה\"\n\n03020220=\"משנה שם...\"\n03020221=\"אירעה שגיאה בשינוי שם של קובץ או תיקייה\"\n03020222=\"אשר העתקת קובץ\"\n03020223=\"האם אתה בטוח שברצונך להעתיק קבצים לארכיון\"\n\n03020230=\"צור תיקייה\"\n03020231=\"שם התיקייה:\"\n03020232=\"תיקייה חדשה\"\n03020233=\"שגיאה ביצירת תיקייה\"\n\n03020240=\"צור קובץ\"\n03020241=\"שם הקובץ:\"\n03020242=\"קובץ חדש\"\n03020243=\"שגיאה ביצירת קובץ\"\n\n03020250=\"בחר\"\n03020251=\"בטל בחירה\"\n03020252=\"מיסוך:\"\n\n03020260=\"היסטוריית תיקיות\"\n\n03020280=\".הקובץ '{0}' שונה\\n?האם ברצונך לעדכן אותו בארכיון\"\n03020281=\"אין אפשרות לעדכן את הקובץ\\n'{0}'\"\n03020282=\".אין אפשרות להפעיל את העורך\"\n03020283=\"פותח...\"\n\n03020290=\"הערה\"\n03020291=\"&הערה:\"\n\n030202A0=\"מערכת\"\n\n03020300=\"מחשב\"\n03020301=\"רשת\"\n\n03020400=\"הוסף\"\n03020401=\"חלץ\"\n03020402=\"בדוק\"\n\n03020420=\"העתק\"\n03020421=\"העבר\"\n03020422=\"מחק\"\n03020423=\"מידע\"\n\n03020500=\"פצל קובץ\"\n03020501=\"&פצל ל:\"\n03020510=\"מפצל...\"\n\n03020600=\"מזג קבצים\"\n03020601=\"&מזג ל:\"\n03020610=\"ממזג...\"\n\n03020710=\"מחשב סיכום ביקורת...\"\n03020720=\"תוצאות סיכום ביקורת\"\n03020721=\"CRC checksum for data:\"\n03020722=\"CRC checksum for data and names:\"\n\n03020800=\"סורק...\"\n\n; Computer\n03031100=\"גודל כללי\"\n03031101=\"שטח פנוי\"\n03031102=\"גודל קלסטר\"\n03031103=\"תווית\"\n\n; Network\n03031200=\"שם מקומי\"\n03031201=\"ספק\"\n\n; Benchmark Dialog\n\n03080000=\"מבחן ביצועים\"\n03080001=\"זיכרון בשימוש:\"\n03080002=\"מכווץ\"\n03080003=\"מחלץ\"\n03080004=\"מהירות\"\n03080005=\"קצב\"\n03080006=\"סיכום הקצב\"\n03080007=\"נוכחי\"\n03080008=\"סופי\"\n03080009=\"הצלחות:\"\n0308000A=\"שגיאות:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/hr.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 3.12\n; Translated by Alan Šimek\n; 7-Zip 4.53\n; Corrected and updated by Hasan Osmanagić\n; 7-Zip 4.60 beta\n; Corrected and updated by Stjepan Treger\n\n00000000=\"Croatian\"\n00000001=\"Hrvatski\"\n00000002=\"26-1\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip postavke\"\n\n; Info Page\n01000100=\"O 7-Zip-u\"\n01000103=\"7-Zip je besplatan. Međutim, možete podržati daljnji razvoj 7-Zipa registriranjem. Kao registriranom korisniku biti će Vam omogućena tehnička podrška.\"\n01000104=\"Podrška\"\n01000105=\"Registriraj se\"\n\n; Folders Page\n01000200=\"Mape\"\n01000210=\"&Radna mapa\"\n01000211=\"&Privremena sistemska mapa\"\n01000212=\"&Trenutna\"\n01000213=\"&Navedena:\"\n01000214=\"Koristi samo za izmjenjive diskove\"\n\n01000281=\"Lokaciju za smještaj privremenih datoteka.\"\n\n; System Page\n01000300=\"Sustav\"\n01000301=\"Integriraj 7-Zip u padajući kontekstni izbornik\"\n01000302=\"Padajući kontekstni izbornik\"\n01000310=\"Stavke kontekstnog izbornika:\"\n\n; Language Page\n01000400=\"Jezik\"\n01000401=\"Jezik:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip naredbe\"\n02000103=\"Otvori arhiv\"\n02000104=\"Otvori izabranu arhiv\"\n02000105=\"Raspakiraj datoteke...\"\n02000106=\"Raspakiraj datoteke odabrane arhive\"\n02000107=\"Dodaj u arhiv...\"\n02000108=\"Dodaj izabrane stavke u arhiv\"\n02000109=\"Testiraj arhiv\"\n0200010A=\"Testiraj integritet odabrane arhive\"\n0200010B=\"Raspakiraj ovdje\"\n0200010C=\"Raspakiraj podatke iz odabrane arhive u trenutnu mapu\"\n0200010D=\"Raspakiraj u{0}\"\n0200010E=\"Raspakiraj podatke u pod-mapu\"\n0200010F=\"Dodaj u {0}\"\n02000110=\"Dodaj odabrane podatke u arhiv\"\n02000113=\"Sažimanje i slanje e-poštom\"\n02000114=\"Sažimanje odabranih podataka u arhiv i slanje e-poštom\"\n02000113=\"Sažimanje u {0} i slanje e-poštom\"\n02000114=\"Sažimanje odabranih podataka u arhiv i slanje e-poštom\"\n\n02000140=\"<Mapa>\"\n02000141=\"<Arhiva>\"\n\n; Properties\n02000203=\"Putanja\"\n02000204=\"Prema nazivu\"\n02000205=\"Tip\"\n02000206=\"Mapa\"\n02000207=\"Prema veličini\"\n02000208=\"Sažeta veličina\"\n02000209=\"Atributi\"\n0200020A=\"Kreirano\"\n0200020B=\"Pristupano\"\n0200020C=\"Prema mijenjanju\"\n0200020D=\"Zbijeno\"\n0200020E=\"Komentar\"\n0200020F=\"Enkripcija\"\n02000210=\"Podjeli prije\"\n02000211=\"Podjeli poslije\"\n02000212=\"Rječnik\"\n02000213=\"CRC\"\n02000214=\"Prema tipu\"\n02000215=\"Anti\"\n02000216=\"Način\"\n02000217=\"Glavni OS\"\n02000218=\"Sustav datoteka\"\n02000219=\"Korisnik\"\n0200021A=\"Grupa\"\n0200021B=\"Zbijeno\"\n0200021C=\"Komentar\"\n0200021D=\"Pozicija\"\n0200021E=\"U datoteci\"\n0200021F=\"Mape\"\n02000220=\"Datoteke\"\n02000221=\"Inačica\"\n02000222=\"Dio\"\n02000223=\"Višedijelni\"\n02000224=\"Razmak\"\n02000225=\"Veza\"\n02000226=\"Blokovi\"\n02000227=\"Dijelova\"\n\n02000229=\"64-bitno\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Fizička veličina\"\n0200022D=\"Veličina zaglavlja\"\n0200022E=\"Kontrolni zbroj\"\n0200022F=\"Karakteristike\"\n02000230=\"Virtualna adresa\"\n\n; Status bar\n02000301=\"{0} objekt(a) izabrano\"\n02000302=\"{0} objekt(a)\"\n\n02000320=\"Datoteka(e):\"\n02000321=\"Mapa(e):\"\n02000322=\"Veličina:\"\n02000323=\"Sažeta veličina:\"\n02000324=\"Arhive:\"\n\n; List Context Menu\n02000401=\"&Stupci...\"\n\n02000411=\"&Otvori\"\n02000412=\"&Raspakiraj...\"\n\n; ToolBar\n02000501=\"Raspakiraj\"\n\n; Messages\n02000601=\"Obnova nije podržana za ovaj arhiv.\"\n02000602=\"Ne mogu obnoviti arhiv {0}\"\n02000603=\"Ne mogu kreirati mapu '{0}'\"\n02000604=\"Datoteka nije podržan arhiv.\"\n02000605=\"Greška\"\n02000606=\"Previše stavki\"\n02000607=\"Ni jedan program nije vezan uz navedeni tip\"\n02000608=\"Nema grešaka\"\n02000609=\"Nemoguće otvoriti datoteku '{0}' kao arhiv\"\n0200060A=\"Nemoguće otvoriti kriptiranu arhivu '{0}'. Kriva lozinka?\"\n0200060B=\"Sustav ne može pripremiti potrebnu količinu memorije\"\n0200060C=\"Nepoznata greška\"\n0200060D=\"Tip arhive nije podržan\"\n\n; Dialogs\n02000702=\"U redu\"\n02000705=\"&Da\"\n02000707=\"Da za &Sve\"\n02000709=\"&Ne\"\n0200070B=\"Ne za Sv&e\"\n\n02000710=\"Odustajem\"\n02000711=\"&Odustajem\"\n02000713=\"&Zatvori\"\n02000714=\"&Stani\"\n02000715=\"Ponovi\"\n\n02000720=\"Pomoć\"\n\n; Extract dialog\n02000800=\"Raspakiraj\"\n02000801=\"&Raspakiraj u:\"\n02000802=\"&Lozinka\"\n\n02000810=\"Putanja mapa\"\n02000811=\"Potpuni tokovi\"\n02000812=\"Trenutni tokovi\"\n02000813=\"Bez tokova\"\n\n02000820=\"Natpiši postojeće\"\n02000821=\"Pitaj prije natpisivanja postojećeg\"\n02000822=\"Natpiši postojeće bez upozorenja\"\n02000823=\"Preskoči postojeće datoteke\"\n02000824=\"Automatska promjena naziva\"\n02000825=\"Automatska promjena naziva postojećih datoteka\"\n\n02000830=\"Datoteke\"\n02000831=\"&Izabrane datoteke\"\n02000832=\"&Sve datoteke\"\n\n02000881=\"Lokacija za raspakiranje datoteka.\"\n\n02000890=\"Raspakiranje\"\n\n; Overwrite dialog\n02000900=\"Potvrdite zamjenu datoteka\"\n02000901=\"Ciljana mapa već sadrži datoteku koja se trenutno obrađuje.\"\n02000902=\"Zamijeniti postojeću\"\n02000903=\"datoteku s ovom?\"\n\n02000911=\"A&utomatska promjena naziva\"\n\n02000982=\"{0} bajte\"\n02000983=\"Izmijenjeno\"\n\n; Messages dialog\n02000A00=\"Dijagnostičke poruke\"\n\n02000A80=\"Poruka\"\n\n02000A91=\"Nije podržan način sažimanja za '{0}'.\"\n02000A92=\"Podatkovna greška u '{0}'. Datoteka je neispravna.\"\n02000A93=\"CRC greška u '{0}'. Datoteka je neispravna.\"\n02000A94=\"Greška u kriptiranoj datoteci '{0}'. Kriva lozinka?\"\n02000A95=\"CRC greška u kriptiranoj datoteci '{0}'. Kriva lozinka?\"\n\n; Password dialog\n02000B00=\"Unesite lozinku\"\n02000B01=\"Unesite lozinku:\"\n02000B02=\"&Prikaži lozinku\"\n02000B03=\"Ponovite lozinku:\"\n02000B10=\"Lozinka nije jednaka\"\n02000B11=\"Koristite samo engleska slova, brojeve i specijalne znake (!, #, $, ...) za lozinku\"\n02000B12=\"Lozinka je preduga\"\n\n; Progress dialog\n02000C00=\"Obrada\"\n02000C01=\"Utrošeno vrijeme:\"\n02000C02=\"Preostalo vrijeme:\"\n02000C03=\"Veličina:\"\n02000C04=\"Brzina:\"\n02000C05=\"Obrađeno:\"\n02000C06=\"Omjer kompresije:\"\n\n02000C10=\"U pozadini\"\n02000C11=\"U prvom planu\"\n02000C20=\"&Pauza\"\n02000C13=\"Nastavi\"\n\n02000C20=\"Pauza\"\n\n02000C30=\"Poništiti?\"\n\n; Compress dialog\n02000D00=\"Dodavanje u arhiv ili stvaranje novog arhiva\"\n02000D01=\"&Arhiv:\"\n02000D02=\"&Način obnove:\"\n02000D03=\"&Format arhiva:\"\n02000D04=\"&Metoda sažimanja:\"\n02000D05=\"Kreiraj &zbijeni arhiv\"\n02000D06=\"&Parametri:\"\n02000D07=\"&Mogućnosti\"\n02000D08=\"Kreiraj E&XE arhiv\"\n02000D09=\"Višenitnost\"\n02000D0A=\"Enkripcija naziva datoteka\"\n02000D0B=\"Stupanj sažimanja\"\n02000D0D=\"Veličina rječnika:\"\n02000D0D=\"&Veličina riječi:\"\n02000D0E=\"Korištenje memorije za sažimanje:\"\n02000D0F=\"Korištenje memorije za raspakiranje:\"\n02000D10=\"Kriptiranje\"\n02000D11=\"Metoda kriptiranja:\"\n02000D12=\"Broj niti u CPU:\"\n02000D13=\"Veličina bloka u zbijenom:\"\n02000D14=\"Bez-zbijanja\"\n02000D15=\"Zbijeno\"\n02000D16=\"Sažmi i datoteke u upotrebi\"\n\n02000D40=\"Razdvajanje na dijelove, bajta:\"\n02000D41=\"Netočna veličina bloka\"\n02000D42=\"Veličina bloka: {0} bajtova.\\nJeste li sigurni da želite podijeliti u takve dijelove?\"\n\n02000D81=\"Bez sažimanja\"\n02000D82=\"Uobičajeno\"\n02000D83=\"Najjače\"\n02000D84=\"Brzo\"\n02000D85=\"Vrlo brzo\"\n02000D86=\"Ultra\"\n\n02000D90=\"Traži\"\n\n02000DA1=\"Dodaj i zamjeni datoteke\"\n02000DA2=\"Obnovi i dodaj datoteke\"\n02000DA3=\"Osvježi postojeće datoteke\"\n02000DA4=\"Sinkroniziraj datoteke\"\n\n02000DB1=\"Sve datoteke\"\n\n02000DC0=\"Sažimanje u arhiv\"\n\n; Columns dialog\n02000E00=\"Stupci\"\n02000E01=\"Označavanje vidljivih stupaca u ovom pogledu. Koristite tipke Page UP i Page Down za uređivanje stupaca po vlastitom izboru.\"\n02000E02=\"Odabrani stupac treba biti\"\n02000E03=\"točaka širo&k.\"\n\n02000E10=\"Pomakni &Gore\"\n02000E11=\"Pomakni &Dolje\"\n02000E12=\"&Prikaži\"\n02000E13=\"&Skriveno\"\n02000E14=\"Postavi\"\n\n02000E81=\"Naslov\"\n02000E82=\"Širina\"\n\n; Testing\n02000F90=\"Testiranje\"\n\n\n; File Manager\n\n03000000=\"7-Zip upravljač datoteka\"\n\n; Menu\n03000102=\"&Datoteke\"\n03000103=\"&Uređivanje\"\n03000104=\"&Izgled\"\n03000105=\"&Alati\"\n03000106=\"&Pomoć\"\n03000107=\"Omiljene mape\"\n\n; File\n03000210=\"&Otvori\"\n03000211=\"Ot&vori mapu\"\n03000212=\"Otvori u &sustavu\"\n03000220=\"Iz&gled\"\n03000221=\"&Uređivanje\"\n03000230=\"Prei&menuj\"\n03000231=\"&Kopiraj u...\"\n03000232=\"Premje&sti u...\"\n03000233=\"O&briši\"\n03000240=\"Svojs&tva\"\n03000241=\"Komentar\"\n03000242=\"Izračun kontrolnog zbroja\"\n03000250=\"Stvo&ri mapu\"\n03000251=\"Stvori &datoteku\"\n03000260=\"&Izlaz\"\n03000270=\"Podije&li datoteku...\"\n03000271=\"Spo&ji datoteke...\"\n\n; Edit\n03000310=\"&Poništi\"\n03000311=\"Po&novi\"\n03000320=\"Od&reži\"\n03000321=\"&Kopiraj\"\n03000322=\"&Zalijepi\"\n03000323=\"O&briši\"\n03000330=\"Odaberi &sve\"\n03000331=\"Poništi odabir\"\n03000332=\"&Obrni odabir\"\n03000333=\"Odaberi...\"\n03000334=\"Poništi odabir...\"\n03000335=\"Odabir po tipu\"\n03000336=\"Poništi odabir tipa\"\n\n; View\n03000410=\"&Velike ikone\"\n03000411=\"&Male ikone\"\n03000412=\"&Popis\"\n03000413=\"&Detalji\"\n03000420=\"Neso&rtirano\"\n03000430=\"&Korijen\"\n03000431=\"&Nadmapa\"\n03000432=\"Proš&le mape...\"\n03000440=\"O&svježi\"\n03000449=\"Sadržaj mapa\"\n03000450=\"&2 okna\"\n03000451=\"Alatne &trake\"\n03000460=\"Alatna traka arhiva\"\n03000461=\"Standardna alatna traka\"\n03000462=\"Velike tipke\"\n03000463=\"Prikaži tekst\"\n\n; Tools\n03000510=\"&Mogućnosti...\"\n03000511=\"M&jerenje\"\n\n; Help\n03000610=\"&7-Zip pomoć...\"\n03000620=\"&O programu...\"\n\n; Favorites\n03000710=\"Dodaj u popis omiljenih uz\"\n03000720=\"prečicu\"\n\n; Options Dialog\n\n03010000=\"Mogućnosti\"\n\n; Plugins\n03010100=\"Dodaci\"\n03010101=\"&Dodaci:\"\n03010110=\"Mogućnosti...\"\n\n; Edit\n03010200=\"Uređivač\"\n03010201=\"&Program:\"\n\n; System\n03010300=\"Sustav\"\n03010302=\"Poveži 7-Zip sa:\"\n03010310=\"Dodatak\"\n\n; Settings\n03010400=\"Postavke\"\n03010401=\"Nadmapa \\\"..\\\" \"\n03010402=\"Prikaži prave ikone datoteka\"\n03010410=\"Prikaži sistemski izbornik\"\n03010420=\"&Označi cijeli redak\"\n03010421=\"Prikaži &linije mreže\"\n03010430=\"Drugi n&ačin označavanja\"\n03010440=\"Koristi raspo&loživu memoriju\"\n\n; Strings\n\n03020201=\"Kopiraj\"\n03020202=\"Premjesti\"\n03020203=\"Kopiraj u:\"\n03020204=\"Premjesti u:\"\n03020205=\"Kopiranje u tijeku...\"\n03020206=\"Premještanje u tijeku...\"\n03020207=\"Nije moguće pomaknuti ili kopirati podatke ove mape.\"\n03020208=\"Operacija nije podržana.\"\n03020209=\"Odabir odredišne mape.\"\n\n03020210=\"Potvrdite brisanje datoteke\"\n03020211=\"Potvrdite brisanje mape\"\n03020212=\"Potvrdite višestruko brisanje datoteka\"\n03020213=\"Obrisati '{0}'?\"\n03020214=\"Obrisati mapu '{0}' i sav njezin sadržaj?\"\n03020215=\"Obrisati ove {0} podatke?\"\n03020216=\"Brisanje u tijeku...\"\n03020217=\"Greška pri brisanju datoteke ili mape\"\n03020218=\"Sustav ne može premjestiti datoteku sa dugačkom putanjom u Kantu za recikliranje\"\n\n03020220=\"Preimenovanje u tijeku...\"\n03020221=\"Greška pri preimenovanju datoteke ili mape\"\n03020222=\"Potvrdite kopiranje datoteka\"\n03020223=\"Kopiranje datoteka u arhiv?\"\n\n03020230=\"Kreiraj mapu\"\n03020231=\"Naziv mape:\"\n03020232=\"Nova mapa\"\n03020233=\"Greška pri kreiranju mape\"\n\n03020240=\"Kreiraj datoteku\"\n03020241=\"Naziv datoteke:\"\n03020242=\"Nova datoteka\"\n03020243=\"Greška pri kreiranju datoteka\"\n\n03020250=\"Odaberi\"\n03020251=\"Poništi odabir\"\n03020252=\"Maska:\"\n\n03020260=\"Kronologija mapa\"\n\n03020280=\"Datoteka '{0}' je izmijenjena.\\nObnoviti arhiv?\"\n03020281=\"Nije moguće obnoviti datoteku\\n'{0}'\"\n03020282=\"Nije moguće započeti uređivanje.\"\n03020283=\"Otvaranje u tijeku...\"\n03020284=\"Datoteka izgleda kao virus (naziv datoteke sadrži dugačke razmake).\"\n\n03020291=\"Komentar\"\n03020291=\"&Komentar:\"\n\n030202A0=\"Sustav\"\n\n03020300=\"Računalo\"\n03020301=\"Mreža\"\n03020302=\"Dokumenti\"\n\n03020400=\"Dodaj\"\n03020401=\"Raspakiraj\"\n03020402=\"Testiraj\"\n\n03020420=\"Kopiraj\"\n03020421=\"Premjesti\"\n03020422=\"Obriši\"\n03020423=\"Svojstva\"\n\n03020500=\"Podijeli datoteku\"\n03020501=\"&Podijeli u:\"\n03020510=\"Dioba...\"\n03020520=\"Potvrdite diobu\"\n03020521=\"Podijeliti datoteku u {0} dijelova?\"\n03020522=\"Veličina diobenog dijela mora biti manja od izvorne datoteke\"\n\n03020600=\"Spoji datoteke\"\n03020601=\"&Spoji u:\"\n03020610=\"Spajanje...\"\n03020620=\"Označite samo prvu datoteku\"\n03020621=\"Nije pronađena datoteka koja je dio razdijeljenih datoteka\"\n03020622=\"Pronađena samo jedna datoteka od razdijeljenih datoteka\"\n\n03020710=\"Izračunavanje kontrolnog zbroja...\"\n03020720=\"Info kontrolni zbroj\"\n03020721=\"CRC kontrolni zbroj za podatke:\"\n03020722=\"CRC kontrolni zbroj za podatke i nazive:\"\n\n03020800=\"Skeniram...\"\n\n03020900=\"Svojstva\"\n\n03020A01=\"Operaciju nemoguće pozvati iz mape koja ima dugačku putanju.\"\n03020A02=\"Morate obilježiti jednu datoteku\"\n03020A03=\"Morate obilježiti jednu ili više datoteka\"\n03020A04=\"Datoteka {0} već postoji\"\n\n; Computer\n03031100=\"Ukupni kapacitet\"\n03031101=\"Slobodni prostor\"\n03031102=\"Veličina klastera\"\n03031103=\"Naziv\"\n\n; Network\n03031200=\"Lokalni naziv\"\n03031201=\"Pružatelj\"\n\n; Benchmark Dialog\n\n03080000=\"Mjerenje\"\n03080001=\"Korištenje memorije:\"\n03080002=\"Sažimanje\"\n03080003=\"Raspakiranje\"\n03080004=\"Brzina\"\n03080005=\"Ocjena\"\n03080006=\"Ukupna ocjena\"\n03080007=\"Trenutno\"\n03080008=\"Rezultat\"\n03080009=\"Prolazi:\"\n0308000A=\"Greške:\"\n0308000B=\"CPU zauzeće\"\n0308000C=\"Ocjena/Zauzeće\"\n\n;!@LangEnd@!\n\n \t  \t \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/hu.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.07 beta\n; Translated by Jozsef Tamas Herczeg\n;\n;\n;\n;\n\n00000000=\"Hungarian\"\n00000001=\"Magyar\"\n00000002=\"14\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip beállítása\"\n\n; Info Page\n01000100=\"Névjegy\"\n01000103=\"A 7-Zip ingyenes szoftver. Ha elnyerte a tetszését, s mégis szeretné támogatni a további fejlesztését, regisztrálja 20 US$ áron, fizethet hitelkártyval vagy más módon.\"\n01000105=\"Regisztráció\"\n\n; Folders Page\n01000200=\"Mappák\"\n01000210=\"&Munkamappa\"\n01000211=\"A &rendszer ideiglenes mappája\"\n01000212=\"&Jelenlegi\"\n01000213=\"&Meghatározott:\"\n01000214=\"Csak cserélhető meghajtókhoz\"\n\n01000281=\"Válassza ki az ideiglenes archív fájlok mappáját.\"\n\n; System Page\n01000300=\"Rendszer\"\n01000301=\"Hozzáadás a parancsértelmező helyi menüjéhez\"\n01000302=\"Lépcsőzetes helyi menü\"\n01000310=\"Helyi menü elemek:\"\n\n; Language Page\n01000400=\"Nyelvek\"\n01000401=\"Nyelv:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip parancsai\"\n02000103=\"Megnyitás\"\n02000104=\"Megnyitja a kijelölt archívumot.\"\n02000105=\"Fájlok kibontása...\"\n02000106=\"Kibontja a fájlokat a kijelölt archívumból.\"\n02000107=\"Behelyezés archívumba...\"\n02000108=\"Behelyezi a kijelölt elemeket az archívumba.\"\n02000109=\"Archívum tesztelése\"\n0200010A=\"Ellenőrzi a kijelölt archívum állapotát.\"\n0200010B=\"Kibontás ide\"\n0200010C=\"Fájlok kibontása a kijelölt archívumból a jelenlegi mappába.\"\n0200010D=\"Kibontás ide: {0}\"\n0200010E=\"A fájlok kibontása almappába.\"\n0200010F=\"Behelyezés: {0}\"\n02000110=\"Archívumba helyezi a kijelölt elemeket.\"\n02000111=\"Tömörítés és küldés...\"\n02000112=\"Archívumba tömöríti a kijelölt elemeket és e-mailben elküldi az archívumot.\"\n02000113=\"Tömörítés {0} archívumba és küldés\"\n02000114=\"Archívumba tömöríti a kijelölt elemeket és e-mailben elküldi az archívumot.\"\n\n02000140=\"<Mappa>\"\n02000141=\"<Archívum>\"\n\n; Properties\n02000203=\"Útvonal\"\n02000204=\"Név\"\n02000205=\"Kiterjesztés\"\n02000206=\"Mappa\"\n02000207=\"Méret\"\n02000208=\"Tömörtve\"\n02000209=\"Attribútumok\"\n0200020A=\"Létrehozva\"\n0200020B=\"Hozzáférés\"\n0200020C=\"Módosítva\"\n0200020D=\"Tömör\"\n0200020E=\"Megjegyzés\"\n0200020F=\"Titkosított\"\n02000210=\"Feldarabolás előtt\"\n02000211=\"Feldarabolás után\"\n02000212=\"Szótár\"\n02000213=\"CRC\"\n02000214=\"Típus\"\n02000215=\"Anti\"\n02000216=\"Módszer\"\n02000217=\"Gazda OS\"\n02000218=\"Fájlrendszer\"\n02000219=\"Felhasználó\"\n0200021A=\"Csoport\"\n0200021B=\"Blokk\"\n0200021C=\"Megjegyzés\"\n0200021D=\"Pozíció\"\n\n; Status bar\n02000301=\"{0} objektum kijelölve\"\n02000302=\"{0} objektum\"\n\n; List Context Menu\n02000401=\"&Oszlopok...\"\n\n02000411=\"M&egnyitás\"\n02000412=\"&Kibontás...\"\n\n; ToolBar\n02000501=\"Kibontás\"\n\n; Messages\n02000601=\"Az aktualizálás ennél az archívumtípusnál nem támogatott.\"\n02000602=\"A(z) {0} archívum nem aktualizálható\"\n02000603=\"A(z) '{0}' mappát nem lehet létrehozni\"\n02000604=\"A fájl nem támogatott archívum.\"\n02000605=\"Hiba\"\n02000606=\"Túl sok elem\"\n02000607=\"Nem társított alkalmazást az adott fájlkiterjesztéshez\"\n02000608=\"Az archívum hibamentes\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Igen\"\n02000707=\"Igen, &mindet\"\n02000709=\"&Nem\"\n0200070B=\"Egyet &sem\"\n\n02000710=\"Mégse\"\n02000711=\"&Mégse\"\n02000713=\"&Bezárás\"\n02000714=\"Leállítás\"\n02000715=\"Újraindítás\"\n\n02000720=\"Súgó\"\n\n; Extract dialog\n02000800=\"Kibontás\"\n02000801=\"&Kibontás ide:\"\n02000802=\"Jelszó\"\n\n02000810=\"Útvonal\"\n02000811=\"Teljes útvonal\"\n02000812=\"Jelenlegi útvonal\"\n02000813=\"Nincs útvonal\"\n\n02000820=\"Felülírás\"\n02000821=\"Rákérdezés felülírás előtt\"\n02000822=\"Felülírás rákérdezés nélkül\"\n02000823=\"A létező fájlok kihagyása\"\n02000824=\"Automatikus átnevezés\"\n02000825=\"A létező fájlok automatikus átnevezése\"\n\n02000830=\"Fájlok\"\n02000831=\"&Kijelölt fájlok\"\n02000832=\"&Minden fájl\"\n\n02000881=\"Határozza meg a kibontott fájlok tárolómappáját.\"\n\n02000890=\"Kibontás\"\n\n; Overwrite dialog\n02000900=\"Fájlcsere megerősítése\"\n02000901=\"A célmappa már tartalmazza a feldolgozott fájlt.\"\n02000902=\"Kívánja lecserélni a létező fájlt\"\n02000903=\"ezzel a fájllal?\"\n\n02000911=\"A&utomatikus átnevezés\"\n\n02000982=\"{0} bájt\"\n02000983=\"módosítva\"\n\n; Messages dialog\n02000A00=\"Diagnosztikai üzenetek\"\n\n02000A80=\"Üzenet\"\n\n02000A91=\"A(z) '{0}' tömörítési módja nem támogatott.\"\n02000A92=\"Adathiba a következőben: '{0}'. A fjl srlt.\"\n02000A93=\"CRC-hiba a következőben: '{0}'. A fjl srlt.\"\n\n; Password dialog\n02000B00=\"Jelszó beírása\"\n02000B01=\"Írja be a jelszót:\"\n02000B02=\"A &jelszó megjelenítése\"\n\n; Progress dialog\n02000C00=\"Folyamat\"\n02000C01=\"Eltelt idő:\"\n02000C02=\"Hátralévő idő:\"\n02000C03=\"Méret:\"\n02000C04=\"Sebesség:\"\n\n02000C10=\"&Háttérben\"\n02000C11=\"&Előtérben\"\n02000C12=\"&Szünet\"\n02000C13=\"&Folytatás\"\n\n02000C20=\"Szünet\"\n\n02000C30=\"Biztos, hogy megszakítja a folyamatot?\"\n\n; Compress dialog\n02000D00=\"Behelyezés archívumba\"\n02000D01=\"&Archívum:\"\n02000D02=\"Akt&ualizálás módja:\"\n02000D03=\"Arcíhvum &formátuma:\"\n02000D04=\"Tömörítés &módja:\"\n02000D05=\"&Tömör archívum létrehozása\"\n02000D06=\"&Tulajdonságok:\"\n02000D07=\"Beállítások\"\n02000D08=\"SF&X archívum létrehozása\"\n02000D09=\"Többszálas\"\n02000D0A=\"Fájlnevek &titkosítása\"\n02000D0B=\"Tömörítés &foka:\"\n02000D0C=\"&Címtár mérete:\"\n02000D0D=\"&Szó mérete:\"\n02000D0E=\"A tömörítés memóriahasználata:\"\n02000D0F=\"A kitömörítés memóriahasználata:\"\n\n02000D40=\"Darabolás &kötetekre, bájt:\"\n\n02000D81=\"Raktár\"\n02000D82=\"Normál\"\n02000D83=\"Legnagyobb\"\n02000D84=\"Gyors\"\n02000D85=\"Leggyorsabb\"\n02000D86=\"Ultra\"\n\n02000D90=\"Tallózás\"\n\n02000DA1=\"Fájlok behelyezése és cseréje\"\n02000DA2=\"Fájlok aktualizálása és behelyezése\"\n02000DA3=\"Létező fájlok frissítése\"\n02000DA4=\"Fájlok szinkronizálása\"\n\n02000DB1=\"Minden fájl\"\n\n02000DC0=\"Tömörítés\"\n\n; Columns dialog\n02000E00=\"Oszlopok\"\n02000E01=\"Jelölje be azokat az oszlopokat melyeket ebben a nézetben megjeleníteni kíván. A Fel s a Le gombbal tetszés szerint átrendezheti az oszlopokat.\"\n02000E02=\"A kijelölt oszlop legyen \"\n02000E03=\"képpont &széles.\"\n\n02000E10=\"&Fel\"\n02000E11=\"&Le\"\n02000E12=\"&Megjelenítés\"\n02000E13=\"&Elrejtés\"\n02000E14=\"Beállítás\"\n\n02000E81=\"Cím\"\n02000E82=\"Széles\"\n\n; Testing\n02000F90=\"Tesztelés\"\n\n\n; File Manager\n\n03000000=\"7-Zip fájlkezelő\"\n\n; Menu\n03000102=\"&Fájl\"\n03000103=\"S&zerkesztés\"\n03000104=\"&Nézet\"\n03000105=\"&Eszközök\"\n03000106=\"&Súgó\"\n03000107=\"Ked&vencek\"\n\n; File\n03000210=\"M&egnyitás\"\n03000211=\"Megnyitás &belül\"\n03000212=\"Megnyitás kí&vül\"\n03000220=\"&Nézet\"\n03000221=\"S&zerkesztés\"\n03000230=\"Átn&evezés\"\n03000231=\"Más&olás mappába...\"\n03000232=\"Át&helyezés mappába...\"\n03000233=\"&Törlés\"\n03000240=\"T&ulajdonságok\"\n03000241=\"&Megjegyzés\"\n03000250=\"Mappa létrehozása\"\n03000251=\"Fájl létrehozása\"\n03000260=\"&Kilépés\"\n03000270=\"Fájl&darabolás...\"\n03000271=\"Fájl&egyesítés...\"\n\n; Edit\n03000310=\"&Visszavonás\"\n03000311=\"&Ismét\"\n03000320=\"&Kivágás\"\n03000321=\"&Másolás\"\n03000322=\"&Beillesztés\"\n03000323=\"&Törlés\"\n03000330=\"Min&d kijelölése\"\n03000331=\"Kijelölés megszüntetése\"\n03000332=\"Kijelölés &megfordítása\"\n03000333=\"Kijelölés...\"\n03000334=\"Megszüntetés...\"\n03000335=\"Kijelölés típus alapján\"\n03000336=\"Megszüntetés típus alapján\"\n\n; View\n03000410=\"&Nagy ikonok\"\n03000411=\"&Kis ikonok\"\n03000412=\"&Lista\"\n03000413=\"&Részletek\"\n03000420=\"Rendezetlen\"\n03000430=\"Gyökérmappa megnyitása\"\n03000431=\"Egy szinttel följebb\"\n03000432=\"Mappa előzmények...\"\n03000440=\"&Frissítés\"\n03000450=\"&2 panel\"\n03000451=\"&Eszköztárak\"\n03000460=\"Archiválás eszköztár\"\n03000461=\"Szokásos eszköztár\"\n03000462=\"Nagy gombok\"\n03000463=\"Szövegcímkék megjelenítése\"\n\n; Tools\n03000510=\"&Beállítások...\"\n03000511=\"&Teljesítménymérés\"\n\n; Help\n03000610=\"&Tartalomjegyzék...\"\n03000620=\"7-Zip &névjegye...\"\n\n; Favorites\n03000710=\"Mappa &hozzáadása a Kedvencekhez mint\"\n03000720=\"Könyvjelző\"\n\n; Options Dialog\n\n03010000=\"Beállítások\"\n\n; Plugins\n03010100=\"Beépülő modulok\"\n03010101=\"&Beépülő modulok:\"\n03010110=\"Beállítások...\"\n\n; Edit\n03010200=\"Szerkesztő\"\n03010201=\"&Szerkesztő:\"\n\n; System\n03010300=\"Rendszer\"\n03010302=\"7-Zip társítása:\"\n03010310=\"Beépülő modul\"\n\n; Settings\n03010400=\"Beállítások\"\n03010401=\"A \\\"..\\\" elem látható\"\n03010402=\"Az eredeti fájlikonok láthatók\"\n03010410=\"Látható a rendszermenü\"\n03010420=\"&Teljes soros kijelölés\"\n03010421=\"&Rácsvonalak kijelzése\"\n\n; Strings\n\n03020201=\"Másolás\"\n03020202=\"Áthelyezés\"\n03020203=\"Másolás ide:\"\n03020204=\"Áthelyezés ide:\"\n03020205=\"Másolás...\"\n03020206=\"Áthelyezés...\"\n03020207=\"Ilyen mappák esetén az elemek nem helyezhetők át vagy másolhatók.\"\n03020208=\"A művelet nem támogatott.\"\n\n03020210=\"Fájltörlés megerősítése\"\n03020211=\"Mappatörlés megerősítése\"\n03020212=\"Több fájltörlés megerősítése\"\n03020213=\"Biztos, hogy törölni akarja a következőt: '{0}'?\"\n03020214=\"Biztos, hogy törölni akarja a(z) '{0}' mappát és annak teljes tartalmát?\"\n03020215=\"Biztos, hogy törölni akarja ezt a(z) {0} elemet?\"\n03020216=\"Törlés...\"\n03020217=\"Hiba történt a fájl vagy a mappa törlésekor\"\n\n03020220=\"Átnevezés...\"\n03020221=\"Hiba történt a fájl vagy a mappa átnevezésekor\"\n\n03020230=\"Mappa létrehozása\"\n03020231=\"Mappa neve:\"\n03020232=\"Új mappa\"\n03020233=\"Hiba történt a mappa létrehozásakor\"\n\n03020240=\"Fájl létrehozása\"\n03020241=\"Fájlnév:\"\n03020242=\"Új fájl\"\n03020243=\"Hiba történt a fájl létrehozásakor\"\n\n03020250=\"Kijelölés\"\n03020251=\"Megszüntetés\"\n03020252=\"Maszk:\"\n\n03020260=\"Mappa előzmények\"\n\n03020280=\"'{0}'\\nA fájl tartalma megváltozott.\\nKívánja aktualizálni az archívumban?\"\n03020281=\"A fájl nem aktualizálható:\\n'{0}'\"\n03020282=\"A szerkesztő nem indítható.\"\n03020283=\"Megnyitás...\"\n\n03020290=\"Megjegyzés\"\n03020291=\"&Megjegyzés:\"\n\n030202A0=\"Rendszer\"\n\n03020300=\"Sajátgép\"\n03020301=\"Hálózati helyek\"\n\n03020400=\"Hozzáadás\"\n03020401=\"Kibontás\"\n03020402=\"Teszt\"\n\n03020420=\"Másolás\"\n03020421=\"Áthelyezés\"\n03020422=\"Törlés\"\n03020423=\"Tulajdonságok\"\n\n03020500=\"Fájldarabolás\"\n03020501=\"&Darabolás ide:\"\n03020510=\"Darabolás...\"\n\n03020600=\"Fájlegyesítés\"\n03020601=\"&Egyesítés ide:\"\n03020610=\"Egyesítés...\"\n\n; Computer\n03031100=\"Teljes méret\"\n03031101=\"Szabad terület\"\n03031102=\"Kluszterméret\"\n03031103=\"Címke\"\n\n; Network\n03031200=\"Helyi név\"\n03031201=\"Szolgáltató\"\n\n; Benchmark Dialog\n\n03080000=\"Teljesítménymérés\"\n03080001=\"Memóriahasználat:\"\n03080002=\"Tömörítés\"\n03080003=\"Kitömörítés\"\n03080004=\"Sebesség\"\n03080005=\"Értékelés\"\n03080006=\"Összértékelés\"\n03080007=\"Jelenlegi\"\n03080008=\"Eredmény\"\n03080009=\"Menetek:\"\n0308000A=\"Hibák:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/hy.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.30\n; Translated by Gevorg Papikyan\n;\n;\n;\n;\n\n00000000=\"Armenian\"\n00000001=\"Հայերեն\"\n00000002=\"43\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip - Կոնֆիգուրացիա\"\n\n; Info Page\n01000100=\"7-Zip ծրագրի մասին\"\n01000103=\"7-Zip-ը հանդիսանում է ազատ տարածվող ծրագիր: Սակայն եթե գանկանում եք աջակցել 7-Zip-ի զարգացմանը Դուք կարող եք գրանցել ծրագիրը:\"\n01000104=\"Աջակցում\"\n01000105=\"Գրանցել\"\n\n; Folders Page\n01000200=\"Թղթապանակներ\"\n01000210=\"Աշխատանքային թղթապանակ\"\n01000211=\"Սիստեմային ժամանակավոր թղթապանակ\"\n01000212=\"Ընթացիկ\"\n01000213=\"Նշանակել\"\n01000214=\"Օգտագործել միայն հանվող կրիչների համար\"\n\n01000281=\"Նշեք ժամանակավոր արխիվների տեղը\"\n\n; System Page\n01000300=\"Սիստեմա\"\n01000301=\"Ներդնել 7-Zip-ը ենթատեքստային մենյուի մեջ\"\n01000302=\"Կասկադային ենթատեքստային մենյու\"\n01000310=\"Ենթատեքստային մենյուի բաղադրիչները\"\n\n; Language Page\n01000400=\"Լեզու\"\n01000401=\"Լեզու:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip-ի հրամանները\"\n02000103=\"Բացել արխիվը\"\n02000104=\"Նշված արխիվի բացում\"\n02000105=\"Բացել\"\n02000106=\"Նշված արխիվից ֆայլերի հանում\"\n02000107=\"Ավելացնել արխիվին...\"\n02000108=\"Նշված օբյեկտներն ավելացնել արխիվին\"\n02000109=\"Թեսթավորում\"\n0200010A=\"Նշված արխիվի թեսթավորում\"\n0200010B=\"Բացել այստեղ\"\n0200010C=\"Նշված արխիվից ֆայլերի հանում ընթացիկ թղթապանակի մեջ\"\n0200010D=\"Բացել {0}-ում\"\n0200010E=\"Ֆայլերի հանումը ենթակատալոգ\"\n0200010F=\"Միացնել {0}-ին\"\n02000110=\"Ավելացնել նշված օբյեկտներն արխիվին\"\n02000111=\"Սեղմել եվ ուղարկել էլ-փոստով...\"\n02000112=\"Սեղմել նշված օբյեկտները եվ արխիվն ուղարկել էլ-փոստով...\"\n02000113=\"Սեղմել {0}-ի մեջ եվ ուղարկել էլ-փոստով...\"\n02000114=\"Սեղմել նշված օբյեկտները եվ արխիվն ուղարկել էլ-փոստով\"\n\n02000140=\"<Թղթապանակ>\"\n02000141=\"<Արխիվ>\"\n\n; Properties\n02000203=\"Ճանապարհ\"\n02000204=\"Ըստ անվանման\"\n02000205=\"Ընդլայնում\"\n02000206=\"Թղթապանակ\"\n02000207=\"Ըստ չափսի\"\n02000208=\"Սեղմած\"\n02000209=\"Ատրիբուտներ\"\n0200020A=\"Ստեղծվել է\"\n0200020B=\"Բացվել է\"\n0200020C=\"Ըստ փոփոխման ժամանակի\"\n0200020D=\"Անընդհատ\"\n0200020E=\"Մեկնաբանություն\"\n0200020F=\"Գաղտնի է\"\n02000210=\"Մասնատված է մինչեվ\"\n02000211=\"Մասնատված է հետո\"\n02000212=\"Բառարան\"\n02000213=\"CRC\"\n02000214=\"Ըստ տիպի\"\n02000215=\"Հակա\"\n02000216=\"Մեթոդ\"\n02000217=\"Սիստեմա\"\n02000218=\"Ֆայլային համակարգ\"\n02000219=\"Օգտագործող\"\n0200021A=\"Խումբ\"\n0200021B=\"Բլոկ\"\n0200021C=\"Մեկնաբանություն\"\n0200021D=\"Դիրք\"\n\n; Status bar\n02000301=\"Նշված օբյեկտներ: {0}\"\n02000302=\"{0} օբյեկտ(ներ)\"\n\n; List Context Menu\n02000401=\"Սյունակներ...\"\n\n02000411=\"Բացել\"\n02000412=\"Հանել...\"\n\n; ToolBar\n02000501=\"Հանել\"\n\n; Messages\n02000601=\"Փոփոխումն անհնար է տվյալ ֆայլի համար\"\n02000602=\"{0} արխիվը փոփոխել չհաջողվեց\"\n02000603=\"'{0}' թղթապանակը ստեղծել չհաջողվեց\"\n02000604=\"Ֆայլը 7-Zip-ի կողմից չի աջակցվում\"\n02000605=\"Սխալ\"\n02000606=\"Բաղադրիչները չափազանց շատ են\"\n02000607=\"Համապատասխան ծրագիր չկա\"\n02000608=\"Սխալներ չեն հայտնաբերվել\"\n\n; Dialogs\n02000702=\"ՕԿ\"\n02000705=\"Այո\"\n02000707=\"Բոլորի համար՝ Այո\"\n02000709=\"Ոչ\"\n0200070B=\"Բոլորի համար՝ Ոչ\"\n\n02000710=\"Ընդհատել\"\n02000711=\"Ընդհատել\"\n02000713=\"Փակել\"\n02000714=\"Ստոպ\"\n02000715=\"Վերսկսել\"\n\n02000720=\"Օգնություն\"\n\n; Extract dialog\n02000800=\"Բացել\"\n02000801=\"Բացել\"\n02000802=\"Նշանաբառ\"\n\n02000810=\"Ճանապարհներ\"\n02000811=\"Ամբողջական ճանապարհներ\"\n02000812=\"Հարաբերական ճանապարհներ\"\n02000813=\"Առանց ճանապարհների\"\n\n02000820=\"Վերաձայնագրում\"\n02000821=\"Հաստատումով\"\n02000822=\"Առանց հաստատման\"\n02000823=\"Թողնել\"\n02000824=\"Ավտոմատ անվանափոխել\"\n02000825=\"Ավտոմ. անվանափոխել առկաները\"\n\n02000830=\"Ֆայլեր\"\n02000831=\"Ընտրված ֆայլեր\"\n02000832=\"Բոլոր ֆայլերը\"\n\n02000881=\"Նշեք հանվող ֆայլերի տեղը\"\n\n02000890=\"Բացում\"\n\n; Overwrite dialog\n02000900=\"Ֆայլի փոխման հաստատում\"\n02000901=\"Թղթապանակն արդեն պարունակում է մշակվող ֆայլը\"\n02000902=\"Փոխել պարունակվող ֆայլը\"\n02000903=\"հետեվյալ ֆայլով\"\n\n02000911=\"Ավտոմատ անվանափոխում\"\n\n02000982=\"{0} բայթ\"\n02000983=\"փոփոխված է\"\n\n; Messages dialog\n02000A00=\"Հաղորդագրություններ\"\n\n02000A80=\"Հաղորդագրություններ\"\n\n02000A91=\"'{0}' ֆայլի համար սեղմման մեթոդը կիրառելի չէ.\"\n02000A92=\"'{0}'-ում տվյալների սխալ: Ֆայլը փչացած է:\"\n02000A93=\"'{0}'-ում CRC-ի սխալ: Ֆայլը փչացած է:\"\n\n; Password dialog\n02000B00=\"Նշանաբառի ներմուծում\"\n02000B01=\"Ներմուծեք նշանաբառը\"\n02000B02=\"Ցուցադրել նշանաբառը\"\n\n; Progress dialog\n02000C00=\"Գործընթաց\"\n02000C01=\"Անցել է\"\n02000C02=\"Մնացել է\"\n02000C03=\"Չափս\"\n02000C04=\"Արագություն\"\n\n02000C10=\"Հետեվում\"\n02000C11=\"Առջեվում\"\n02000C12=\"Դադար\"\n02000C13=\"Շարունակել\"\n\n02000C20=\"Դադարի մեջ է\"\n\n02000C30=\"Համոզված եք, որ ուզում եք ընդհատել գործընթացը\"\n\n; Compress dialog\n02000D00=\"Ավելացնել արխիվին\"\n02000D01=\"Արխիվ:\"\n02000D02=\"Փոփոխման ռեժիմը\"\n02000D03=\"Արխիվի ֆորմատը:\"\n02000D04=\"Սեղմման եղանակը:\"\n02000D05=\"Ստեղծել Solid արխիվ\"\n02000D06=\"Պարամետրեր:\"\n02000D07=\"Օպցիաներ\"\n02000D08=\"Ստեղծել SFX-արխիվ\"\n02000D09=\"Բազմահոսքություն\"\n02000D0A=\"Գաղտնի պահել ֆայլերի անունները\"\n02000D0B=\"Սեղմման աստիճանը:\"\n02000D0C=\"Բառարանի չափը:\"\n02000D0D=\"Բառի չափը:\"\n02000D0E=\"Հիշողության ծավալը սեղմման համար:\"\n02000D0F=\"Հիշողության ծավալը բացման համար:\"\n\n02000D40=\"Բաժանել հատորների հետեվյալ չափերով (բայթերով):\"\n\n02000D81=\"Առանց սեղմման\"\n02000D82=\"Նորմալ\"\n02000D83=\"Առավելագույն\"\n02000D84=\"Արագ\"\n02000D85=\"Շատ արագ\"\n02000D86=\"ՈՒլտրա\"\n\n02000D90=\"Թերթել\"\n\n02000DA1=\"Ավելացնել եվ փոխել\"\n02000DA2=\"Թարմացնել եվ ավելացնել\"\n02000DA3=\"Թարմացնել\"\n02000DA4=\"Սինխրոնիզացնել\"\n\n02000DB1=\"Բոլոր ֆայլերը\"\n\n02000DC0=\"Սեղմում\"\n\n; Columns dialog\n02000E00=\"Սյունյակներ\"\n02000E01=\"Նշեք այն սյունյակները, որոնք պետք է երեվան այդ թղթապանակում: \\\"Վերեվ\\\" եվ \\\"Ներքեվ\\\" կոճակներով կարելի է կարգավորել սյունյակների հերթականությունը:\"\n02000E02=\"Նշվածսյունյակների լանդը պետք է լինի\"\n02000E03=\"կետ:\"\n\n02000E10=\"Վերեվ\"\n02000E11=\"Ներքեվ\"\n02000E12=\"Ցույց տալ\"\n02000E13=\"Պահել\"\n02000E14=\"Նշանակել\"\n\n02000E81=\"Անուն\"\n02000E82=\"Լայնք\"\n\n; Testing\n02000F90=\"Թեսթավորում\"\n\n\n; File Manager\n\n03000000=\"7-Zip Ֆայլ Մենեջեր\"\n\n; Menu\n03000102=\"     Ֆայլ    \"\n03000103=\" Խմբագրում \"\n03000104=\"      Տեսք    \"\n03000105=\"Սպասարկում\"\n03000106=\"  Տեղեկանք  \"\n03000107=\"Ընտրվածներ\"\n\n; File\n03000210=\"Բացել\"\n03000211=\"Բացել ներսից\"\n03000212=\"Բացել դրսից\"\n03000220=\"Դիտում\"\n03000221=\"Խմբագրել\"\n03000230=\"Անվանափոխել\"\n03000231=\"Պատճենել...\"\n03000232=\"Տեղափոխել...\"\n03000233=\"Հեռացնել\"\n03000240=\"Բնութագրեր\"\n03000241=\"Մեկնաբանություն\"\n03000250=\"Ստեղծել թղթապանակ\"\n03000251=\"Ստեղծել ֆայլ\"\n03000260=\"Ելք\"\n03000270=\"Մասնատել ֆայլը...\"\n03000271=\"Միացնել ֆայլերը...\"\n\n; Edit\n03000310=\"Ընդհատել\"\n03000311=\"Վերադարձնել\"\n03000320=\"Կտրել\"\n03000321=\"Պատճենել\"\n03000322=\"Դնել\"\n03000323=\"Հեռացնել\"\n03000330=\"Ընտրել բոլորը\"\n03000331=\"Հանել ընտրությունը\"\n03000332=\"Շուռ տալ ընտրությունը\"\n03000333=\"Նշել...\"\n03000334=\"Հանել ընտրությունը...\"\n03000335=\"Նշել ըստ տիպերի\"\n03000336=\"Հանել ըստ տիպերի ընտրությունը\"\n\n; View\n03000410=\"Խոշոր նշաններ\"\n03000411=\"Մանր նշաններ\"\n03000412=\"Ցուցակ\"\n03000413=\"Աղյուսակ\"\n03000420=\"Առանց դասավորման\"\n03000430=\"Բացել սկզբնական թղթապանակը\"\n03000431=\"Անցում մեկ մակարդակ վերեվ\"\n03000432=\"Թղթապանակների պատմություն...\"\n03000440=\"Թարմացնել\"\n03000450=\"2 վահանակ\"\n03000451=\"Գործիքների վահանակներ\"\n03000460=\"Արխիվատորի կոճակների վահանակ\"\n03000461=\"Ստանդարտ կոճակների վահանակ\"\n03000462=\"Մեծ կոճակներ\"\n03000463=\"Գրառումներ կոճակների վրա\"\n\n; Tools\n03000510=\"Նախընտրանքներ...\"\n03000511=\"Արտադրողականության ստուգատես\"\n\n; Help\n03000610=\"Օգնություն...\"\n03000620=\"Ծրագրի մասին...\"\n\n; Favorites\n03000710=\"Ավելացնել թղթապանակն ընտրվածների մեջ որպես\"\n03000720=\"Ընտրանք\"\n\n; Options Dialog\n\n03010000=\"Նախընտրանքներ\"\n\n; Plugins\n03010100=\"Պլագիններ\"\n03010101=\"Պլագիններ:\"\n03010110=\"Բնութագրեր\"\n\n; Edit\n03010200=\"Խմբագրիչ\"\n03010201=\"Խմբագրիչ:\"\n\n; System\n03010300=\"Համակարգ\"\n03010302=\"7-Zip-ը ասոցիացնել հետեվյալ ֆայլերի հետ\"\n03010310=\"Պլագին\"\n\n; Settings\n03010400=\"Նախընտրանքներ\"\n03010401=\"Ցույց տալ էլեմենտը \\\"..\\\"\"\n03010402=\"Ցույց տալ ֆայլերի իրական նշանները\"\n03010410=\"Ցույց հատ համակարգային մենյուն\"\n03010420=\"Կուրսորն ամբողջ տողով\"\n03010421=\"Ցույց տալ անջատիչները\"\n03010430=\"Նշման այլընտրանքային ռեժիմ\"\n03010440=\"Օգտագործել հիշողության մեծ էջեր\"\n\n; Strings\n\n03020201=\"Պատճենել\"\n03020202=\"Տեղափոխել\"\n03020203=\"Պատճենել...\"\n03020204=\"Տեղափոխել...\"\n03020205=\"Պատճենում...\"\n03020206=\"Տեղափոխում...\"\n03020207=\"Հնարավոր չէ պատճենել կամ կտրել օբյեկտներ այս տեսակ թղթապանակների համար\"\n03020208=\"Գործողությունե չի աջակցվում\"\n\n03020210=\"Ֆայլի հեռացման հաստատում\"\n03020211=\"Թղթապանակի հեռացման հաստատում\"\n03020212=\"Ֆայլերի խմբի հեռացման հաստատում\"\n03020213=\"Համողված եքշ որ ցանկանում եք հեռացնել \\\"{0}\\\"-ը\"\n03020214=\"Համողված եքշ որ ցանկանում եք հեռացնել \\\"{0}\\\" թղթապանակը եվ նրա պարունակությունը и все ее содержимое?\"\n03020215=\"Համողված եքշ որ ցանկանում եք հեռացնել այս օբյեկտները ({0} հատ)\"\n03020216=\"Հեռացում...\"\n03020217=\"Սխալ ֆայլի կամ թղթապանակի հեռացման ժամանակ\"\n\n03020220=\"Անվանափոխում...\"\n03020221=\"Սխալ ֆայլի կամ թղթապանակի անվանափոխման ժամանակ\"\n03020222=\"Ֆայլերի պատճենման հաստատում\"\n03020223=\"Համողված եքշ որ ցանկանում եք պատճենել այս ֆայլերը արխիվում\"\n\n03020230=\"Ստեղծել թղթապանակ\"\n03020231=\"Թղթապանակի անվանումը\"\n03020232=\"Նոր թղթապանակ\"\n03020233=\"Սխալ թղթապանակի ստեղծման ժամանակ\"\n\n03020240=\"Ստեղծել ֆայլ\"\n03020241=\"Ֆայլի անվանումը\"\n03020242=\"Նոր ֆայլ\"\n03020243=\"Սխալ ֆայլի ստեղծման ժամանակ\"\n\n03020250=\"Նշել\"\n03020251=\"Հանել նշումը\"\n03020252=\"Դիմակ:\"\n\n03020260=\"Թղթապանակների պատմություն\"\n\n03020280=\"'{0}' ֆայլը փոփոխվել է: \\nՑանկանում եք թարմացնել այն արխիվում:\"\n03020281=\"Չհաջողվեց թարմացնել \\n'{0}' ֆայլը\"\n03020282=\"Խմբագրիչը միացնել չհաջողվեց\"\n03020283=\"Բացում...\"\n\n03020290=\"Մեկնաբանություն\"\n03020291=\"Մեկնաբանություն՝\"\n\n030202A0=\"Համակարգ\"\n\n03020300=\"Համակարգիչ\"\n03020301=\"Ցանց\"\n\n03020400=\"Ավելացնել\"\n03020401=\"Հանել\"\n03020402=\"Թեսթավորում\"\n\n03020420=\"Պատճենել\"\n03020421=\"Տեղափոխել\"\n03020422=\"Հեռացնել\"\n03020423=\"Տեղեկություն\"\n\n03020500=\"Մասնատել ֆայլե\"\n03020501=\"Մասնատել հետեվյալ թղթապանակում՝\"\n03020510=\"Մասնատում...\"\n\n03020600=\"Միացնել ֆայլերը\"\n03020601=\"Միացնել հետեվյալ թղթապանակում\"\n03020610=\"Միացում...\"\n\n; Computer\n03031100=\"Տարողունակություն\"\n03031101=\"Ազատ է\"\n03031102=\"Կլաստերի չափսը\"\n03031103=\"Նիշ\"\n\n; Network\n03031200=\"Լոկալ անվանումը\"\n03031201=\"Պրովայդեր\"\n\n; Benchmark Dialog\n\n03080000=\"Արտադրողականության թեսթավորում\"\n03080001=\"Հիշողության ծավալ:\"\n03080002=\"Փաթեթավորում\"\n03080003=\"Բացում\"\n03080004=\"Արագություն\"\n03080005=\"Վարկանիշ\"\n03080006=\"Ընդհանուր վարկանիշ\"\n03080007=\"Ընթացիկ\"\n03080008=\"Վերջնական\"\n03080009=\"Անցումներ՝\"\n0308000A=\"Սխալներ՝\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/id.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.60 beta\n; Diterjemahkan oleh Frans Liando\n;\n; Sumber: http://nlp.aia.bppt.go.id/glosti/\n;\n;\n\n00000000=\"Indonesian\"\n00000001=\"Bahasa Indonesia\"\n00000002=\"33\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Konfigurasi 7-Zip\"\n\n; Info Page\n01000100=\"Tentang 7-Zip\"\n01000103=\"7-Zip adalah perangkat lunak gratis. Bagaimanapun, Anda bisa mendukung pengembangan dari 7-Zip dengan mendaftar.\\n\\nTerjemahan bahasa Indonesia oleh Frans Liando.\"\n01000104=\"Dukung\"\n01000105=\"Daftar\"\n\n; Folders Page\n01000200=\"Pelipat\"\n01000210=\"&Pelipat kerja\"\n01000211=\"Pelipat temporer &sistem\"\n01000212=\"S&ekarang\"\n01000213=\"&Ditentukan:\"\n01000214=\"Hanya untuk penggerak bisa pindah\"\n\n01000281=\"Tetapkan lokasi untuk berkas arsip temporer.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"Integrasi 7-Zip ke cangkang menu konteks\"\n01000302=\"Menu konteks kaskade\"\n01000310=\"Butir-butir pada menu konteks:\"\n\n; Language Page\n01000400=\"Bahasa\"\n01000401=\"Bahasa:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Perintah-perintah 7-Zip\"\n02000103=\"Buka arsip\"\n02000104=\"Buka arsip terpilih.\"\n02000105=\"Ekstrak berkas...\"\n02000106=\"Ekstrak berkas arsip terpilih.\"\n02000107=\"Tambahkan ke arsip...\"\n02000108=\"Tambahkan butir terpilih ke arsip.\"\n02000109=\"Uji arsip\"\n0200010A=\"Uji integritas dari arsip terpilih.\"\n0200010B=\"Ekstrak di sini\"\n0200010C=\"Ekstrak berkas arsip terpilih ke pelipat ini.\"\n0200010D=\"Ekstrak ke {0}\"\n0200010E=\"Ekstrak berkas ke sub pelipat.\"\n0200010F=\"Tambahkan ke {0}\"\n02000110=\"Tambahkan butir terpilih ke arsip.\"\n02000111=\"Mampatkan dan surat kawat...\"\n02000112=\"Mampatkan butir terpilih ke arsip dan kirim via surat kawat.\"\n02000113=\"Mampatkan ke {0} dan surat kawat\"\n02000114=\"Mampatkan butir terpilih ke arsip dan kirim via surat kawat.\"\n\n02000140=\"<Pelipat>\"\n02000141=\"<Arsip>\"\n\n; Properties\n02000203=\"Lintasan\"\n02000204=\"Nama\"\n02000205=\"Ekstensi\"\n02000206=\"Pelipat\"\n02000207=\"Ukuran\"\n02000208=\"Ukuran Dikemas\"\n02000209=\"Atribut\"\n0200020A=\"Dibuat\"\n0200020B=\"Diakses\"\n0200020C=\"Dimodifikasi\"\n0200020D=\"Padat\"\n0200020E=\"Komentar\"\n0200020F=\"Terenkripsi\"\n02000210=\"Belah Sebelum\"\n02000211=\"Belah Setelah\"\n02000212=\"Kamus\"\n02000213=\"CRC\"\n02000214=\"Tipe\"\n02000215=\"Anti\"\n02000216=\"Metode\"\n02000217=\"SO Host\"\n02000218=\"Sistem Berkas\"\n02000219=\"Pengguna\"\n0200021A=\"Grup\"\n0200021B=\"Blok\"\n0200021C=\"Komentar\"\n0200021D=\"Posisi\"\n0200021E=\"Awalan Lintasan\"\n0200021F=\"Pelipat\"\n02000220=\"Berkas\"\n02000221=\"Versi\"\n02000222=\"Volume\"\n02000223=\"Multivolume\"\n02000224=\"Ofset\"\n02000225=\"Tautan\"\n02000226=\"Blok\"\n02000227=\"Volume\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Ukuran Fisik\"\n0200022D=\"Ukuran Kepala\"\n0200022E=\"Ceksum\"\n0200022F=\"Karakteristik\"\n02000230=\"Alamat Maya\"\n\n; Status bar\n02000301=\"{0} objek terpilih\"\n02000302=\"{0} objek\"\n\n02000320=\"Berkas:\"\n02000321=\"Pelipat:\"\n02000322=\"Ukuran:\"\n02000323=\"Ukuran termampatkan:\"\n02000324=\"Arsip:\"\n\n; List Context Menu\n02000401=\"&Kolom...\"\n\n02000411=\"&Buka\"\n02000412=\"&Ekstrak...\"\n\n; ToolBar\n02000501=\"Ekstrak\"\n\n; Messages\n02000601=\"Operasi pembaruan tak didukung untuk arsip ini.\"\n02000602=\"Tak bisa memperbarui arsip {0}\"\n02000603=\"Tak bisa membuat pelipat '{0}'\"\n02000604=\"Berkas arsip tak didukung.\"\n02000605=\"Kesalahan\"\n02000606=\"Terlalu banyak butir\"\n02000607=\"Tak ada aplikasi yang diasosiasikan dengan ekstensi dari nama berkas yang diberikan\"\n02000608=\"Tidak ada kesalahan\"\n02000609=\"Tak bisa membuka berkas arsip '{0}'\"\n0200060A=\"Tak bisa membuka arsip terenkripsi '{0}'. Kata sandi salah?\"\n0200060B=\"Sistem tak bisa mengalokasikan jumlah memori yang diperlukan\"\n0200060C=\"Kesalahan tak dikenal\"\n0200060D=\"Tipe arsip tak didukung\"\n\n; Dialogs\n02000702=\"Oke\"\n02000705=\"&Ya\"\n02000707=\"Ya untuk &semua\"\n02000709=\"&Tidak\"\n0200070B=\"Tidak untuk s&emua\"\n\n02000710=\"Batal\"\n02000711=\"&Batal\"\n02000713=\"&Tutup\"\n02000714=\"Henti\"\n02000715=\"Start Ulang\"\n\n02000720=\"Bantuan\"\n\n; Extract dialog\n02000800=\"Ekstrak\"\n02000801=\"E&kstrak ke:\"\n02000802=\"Kata sandi\"\n\n02000810=\"Mode lintasan\"\n02000811=\"Nama lengkap lintasan\"\n02000812=\"Nama lintasan sekarang\"\n02000813=\"Tidak ada nama lintasan\"\n\n02000820=\"Mode tulis timpa\"\n02000821=\"Konfirmasikan sebelum tulis timpa\"\n02000822=\"Tulis timpa tanpa konfirmasi\"\n02000823=\"Lewati berkas yang ada\"\n02000824=\"Penamaan ulang automatis\"\n02000825=\"Penamaan ulang automatis terhadap berkas yang ada\"\n\n02000830=\"Berkas\"\n02000831=\"&Berkas terpilih\"\n02000832=\"&Semua berkas\"\n\n02000881=\"Tetapkan lokasi untuk berkas yang diekstrak.\"\n\n02000890=\"Sedang mengekstrak\"\n\n; Overwrite dialog\n02000900=\"Konfirmasi Penggantian Berkas\"\n02000901=\"Pelipat tujuan telah berisi berkas yang terproses.\"\n02000902=\"Maukah Anda mengganti berkas yang ada\"\n02000903=\"dengan yang ini?\"\n\n02000911=\"Nama Ulang Automatis\"\n\n02000982=\"{0} bita\"\n02000983=\"dimodifikasi pada\"\n\n; Messages dialog\n02000A00=\"Pesan Diagnosa\"\n\n02000A80=\"Pesan\"\n\n02000A91=\"Metode kompresi untuk '{0}' tak didukung.\"\n02000A92=\"Kesalahan data di '{0}'. Berkas ini rusak.\"\n02000A93=\"CRC gagal di '{0}'. Berkas ini rusak.\"\n02000A94=\"Kesalahan data di berkas terenkripsi '{0}'. Kata sandi salah?\"\n02000A95=\"CRC gagal di berkas terenkripsi '{0}'. Kata sandi salah?\"\n\n; Password dialog\n02000B00=\"Masukkan kata sandi\"\n02000B01=\"Masukkan kata sandi:\"\n02000B02=\"Perlihatkan kata sandi\"\n02000B03=\"Konfirmasi kata sandi:\"\n02000B10=\"Kata sandi tidak cocok\"\n02000B11=\"Gunakanlah hanya huruf Indonesia, nomor dan karakter khusus (!, #, $, ...) untuk kata sandi\"\n02000B12=\"Kata sandi terlalu panjang\"\n\n; Progress dialog\n02000C00=\"Proses\"\n02000C01=\"Waktu terpakai:\"\n02000C02=\"Sisa waktu:\"\n02000C03=\"Jumlah ukuran:\"\n02000C04=\"Kecepatan:\"\n02000C05=\"Terproses:\"\n02000C06=\"Rasio kompresi:\"\n\n02000C10=\"Latar &Belakang\"\n02000C11=\"Latar &Depan\"\n02000C12=\"&Jeda\"\n02000C13=\"&Lanjut\"\n\n02000C20=\"Jeda\"\n\n02000C30=\"Anda yakin ingin membatalkannya?\"\n\n; Compress dialog\n02000D00=\"Tambahkan ke arsip\"\n02000D01=\"&Arsip:\"\n02000D02=\"&Mode pembaruan:\"\n02000D03=\"&Format arsip:\"\n02000D04=\"&Metode kompresi:\"\n02000D05=\"Buat ar&sip padat\"\n02000D06=\"&Parameter:\"\n02000D07=\"Pilihan\"\n02000D08=\"Buat arsip SF&X\"\n02000D09=\"Multirangkaian\"\n02000D0A=\"Enkripsi &nama berkas\"\n02000D0B=\"&Level kompresi:\"\n02000D0C=\"Ukuran kam&us:\"\n02000D0D=\"Ukuran &kata:\"\n02000D0E=\"Pemakaian memori untuk Pemampatan:\"\n02000D0F=\"Pemakaian memori untuk Pengawamampatan:\"\n02000D10=\"Enkripsi\"\n02000D11=\"Metode enkripsi:\"\n02000D12=\"Jumlah CPU:\"\n02000D13=\"Ukuran blok padat:\"\n02000D14=\"Non-padat\"\n02000D15=\"Padat\"\n02000D16=\"Mampatkan berkas bersama\"\n\n02000D40=\"Belah ke &volume, bita:\"\n02000D41=\"Ukuran volume salah\"\n02000D42=\"Tentukan ukuran volume: {0} bita.\\nAnda Yakin ingin membelah arsip menjadi volume demikian?\"\n\n02000D81=\"Simpan\"\n02000D82=\"Normal\"\n02000D83=\"Maksimum\"\n02000D84=\"Cepat\"\n02000D85=\"Tercepat\"\n02000D86=\"Ultra\"\n\n02000D90=\"Ramban\"\n\n02000DA1=\"Tambah dan ganti berkas\"\n02000DA2=\"Perbarui dan tambah berkas\"\n02000DA3=\"Perbaharui berkas yang ada\"\n02000DA4=\"Sinkronisasikan berkas\"\n\n02000DB1=\"Semua Berkas\"\n\n02000DC0=\"Pemampatan\"\n\n; Columns dialog\n02000E00=\"Kolom\"\n02000E01=\"Cek kolom yang Anda ingin tampakkan pada pelipat ini. Gunakan tombol Atas dan Bawah untuk memesan kolom.\"\n02000E02=\"Kolom yang terpilih harus\"\n02000E03=\"ber-piksel &lebar.\"\n\n02000E10=\"Pindah ke &Atas\"\n02000E11=\"Pindah ke &Bawah\"\n02000E12=\"Per&lihatkan\"\n02000E13=\"&Sembunyikan\"\n02000E14=\"Set\"\n\n02000E81=\"Judul\"\n02000E82=\"Lebar\"\n\n; Testing\n02000F90=\"Pengujian\"\n\n\n; File Manager\n\n03000000=\"Manager Berkas 7-Zip\"\n\n; Menu\n03000102=\"&Berkas\"\n03000103=\"&Sunting\"\n03000104=\"&Pandangan\"\n03000105=\"Perala&tan\"\n03000106=\"Ban&tuan\"\n03000107=\"&Kesukaan\"\n\n; File\n03000210=\"B&uka\"\n03000211=\"Buka Sisi &Dalam\"\n03000212=\"Buka Sisi &Luar\"\n03000220=\"&Pandangan\"\n03000221=\"&Sunting\"\n03000230=\"&Nama Ulang\"\n03000231=\"S&alin Ke...\"\n03000232=\"P&indahkan Ke...\"\n03000233=\"&Hapus\"\n03000240=\"P&roperti\"\n03000241=\"Kome&ntar\"\n03000242=\"Hitung Ceksum\"\n03000250=\"Buat Pelipat\"\n03000251=\"Buat Berkas\"\n03000260=\"&Keluar\"\n03000270=\"Be&lah Berkas...\"\n03000271=\"Gab&ung Berkas...\"\n\n; Edit\n03000310=\"&Ulangi\"\n03000311=\"&Batalkan\"\n03000320=\"Po&tong\"\n03000321=\"S&alin\"\n03000322=\"Tem&pel\"\n03000323=\"&Hapus\"\n03000330=\"Pilih Semu&a\"\n03000331=\"Tak Memilih Semua\"\n03000332=\"Pilih Kebal&ikannya\"\n03000333=\"Pilih...\"\n03000334=\"Tak Memilih...\"\n03000335=\"Pilih Berdasarkan Tipe\"\n03000336=\"Tak Memilih Berdasarkan Tipe\"\n\n; View\n03000410=\"Ikon &Besar\"\n03000411=\"Ikon &Kecil\"\n03000412=\"&Daftar\"\n03000413=\"&Rincian\"\n03000420=\"Tak Beraturan\"\n03000430=\"Buka Akar Pelipat\"\n03000431=\"Naik Satu Tingkat\"\n03000432=\"Histori Pelipat...\"\n03000440=\"&Segarkan Ulang\"\n03000449=\"Pandangan Datar\"\n03000450=\"&2 Panel\"\n03000451=\"Ba&tang Peralatan\"\n03000460=\"Batang Peralatan Arsip\"\n03000461=\"Ba&tang Peralatan Standar\"\n03000462=\"Tombol Besar\"\n03000463=\"Perlihatkan Teks Tombol\"\n\n; Tools\n03000510=\"&Pilihan...\"\n03000511=\"&Tolok\"\n\n; Help\n03000610=\"Petun&juk...\"\n03000620=\"Tent&ang 7-Zip...\"\n\n; Favorites\n03000710=\"Tambahkan pelipat ke Kesukaan sebagai\"\n03000720=\"Marka Buku\"\n\n; Options Dialog\n\n03010000=\"Pilihan\"\n\n; Plugins\n03010100=\"Tambahan\"\n03010101=\"&Tambahan:\"\n03010110=\"Pilihan...\"\n\n; Edit\n03010200=\"Penyunting\"\n03010201=\"&Penyunting:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"Asosiasikan 7-Zip dengan:\"\n03010310=\"Tambahan\"\n\n; Settings\n03010400=\"Setelan\"\n03010401=\"Perlihatkan \\\"..\\\" butir\"\n03010402=\"Perlihatkan ikon asli berkas\"\n03010410=\"Perlihatkan menu sistem\"\n03010420=\"&Memilih baris penuh\"\n03010421=\"Perlihatkan &garis kisi-kisi\"\n03010430=\"Mode pemilihan &alternatif\"\n03010440=\"Gunakan halaman memori &besar\"\n\n; Strings\n\n03020201=\"Salin\"\n03020202=\"Pindah\"\n03020203=\"Salin ke:\"\n03020204=\"Pindah ke:\"\n03020205=\"Menyalin...\"\n03020206=\"Memindah...\"\n03020207=\"Anda tak bisa memindah atau menyalin butir untuk pelipat demikian.\"\n03020208=\"Pengoperasian tak didukung untuk pelipat demikian.\"\n03020209=\"Pilih pelipat tujuan.\"\n\n03020210=\"Konfirmasi Penghapusan Berkas\"\n03020211=\"Konfirmasi Penghapusan Pelipat\"\n03020212=\"Konfirmasi Penghapusan Berkas-berkas\"\n03020213=\"Anda yakin ingin menghapus '{0}'?\"\n03020214=\"Anda yakin ingin menghapus pelipat '{0}' dan semua isinya?\"\n03020215=\"Anda yakin ingin menghapus {0} butir?\"\n03020216=\"Menghapus...\"\n03020217=\"Kesalahan Ketika Menghapus Berkas atau Pelipat\"\n03020218=\"System tak bisa memindah suatu berkas yang berlintasan panjang ke Recycle Bin\"\n\n03020220=\"Nama Ulang...\"\n03020221=\"Kesalahan Ketika Penamaan Ulang Berkas atau Pelipat\"\n03020222=\"Konfirmasi Penyalinan Berkas\"\n03020223=\"Anda yakin ingin menyalin berkas ke arsip?\"\n\n03020230=\"Buat Pelipat\"\n03020231=\"Nama pelipat:\"\n03020232=\"Pelipat Baru\"\n03020233=\"Kesalahan Pembuatan Pelipat\"\n\n03020240=\"Buat Berkas\"\n03020241=\"Nama berkas:\"\n03020242=\"Berkas Baru\"\n03020243=\"Kesalahan Pembuatan Berkas\"\n\n03020250=\"Pilih\"\n03020251=\"Tak Memilih\"\n03020252=\"Maser:\"\n\n03020260=\"Histori Pelipat\"\n\n03020280=\"Berkas '{0}' telah termodifikasi.\\nApakah Anda ingin perbarui pada arsip?\"\n03020281=\"Tak bisa memperbarui berkas\\n'{0}'\"\n03020282=\"Tak bisa membuka penyunting.\"\n03020283=\"Membuka...\"\n03020284=\"Berkas ini tampaknya seperti virus (pada nama berkas berisi ruang kosong yang panjang).\"\n\n03020290=\"Komentar\"\n03020291=\"&Komentar:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"Komputer\"\n03020301=\"Jaringan\"\n03020302=\"Dokumen\"\n\n03020400=\"Tambah\"\n03020401=\"Ekstrak\"\n03020402=\"Uji\"\n\n03020420=\"Salin\"\n03020421=\"Pindah\"\n03020422=\"Hapus\"\n03020423=\"Info\"\n\n03020500=\"Belah Berkas\"\n03020501=\"&Belah ke:\"\n03020510=\"Membelah...\"\n03020520=\"Konfirmasi Membelah\"\n03020521=\"Anda yakin ingin membelah berkas menjadi {0} volume?\"\n03020522=\"Ukuran volume seharusnya lebih kecil dari pada ukuran asli berkas\"\n\n03020600=\"Gabung Berkas\"\n03020601=\"&Gabung ke:\"\n03020610=\"Menggabung...\"\n03020620=\"Pilih bagian pertama saja dari berkas yang dibelah\"\n03020621=\"Tak bisa mendeteksi berkas sebagai bagian dari berkas yang dibelah\"\n03020622=\"Tak bisa menemukan lebih dari satu bagian dari berkas yang dibelah\"\n\n03020710=\"Hitung ceksum...\"\n03020720=\"Informasi ceksum\"\n03020721=\"Ceksum CRC untuk data:\"\n03020722=\"Ceksum CRC untuk data dan nama:\"\n\n03020800=\"Memindai...\"\n\n03020900=\"Properti\"\n\n03020A01=\"Pengoperasian tak bisa memanggil dari pelipat yang berlintasan panjang.\"\n03020A02=\"Anda harus memilih satu berkas\"\n03020A03=\"Anda harus memilih satu atau lebih berkas\"\n03020A04=\"Berkas {0} telah ada\"\n\n; Computer\n03031100=\"Ukuran Total\"\n03031101=\"Ruang Kosong\"\n03031102=\"Ukuran Gugus\"\n03031103=\"Label\"\n\n; Network\n03031200=\"Nama Lokal\"\n03031201=\"Penyelenggara\"\n\n; Benchmark Dialog\n\n03080000=\"Tolok\"\n03080001=\"Pemakaian memori:\"\n03080002=\"Pemampatan\"\n03080003=\"Pengawamampatan\"\n03080004=\"Kecepatan\"\n03080005=\"Penilaian\"\n03080006=\"Jumlah Penilaian\"\n03080007=\"Sekarang\"\n03080008=\"Hasil\"\n03080009=\"Lewat:\"\n0308000A=\"Kesalahan:\"\n0308000B=\"Pemakaian CPU\"\n0308000C=\"Penilaian/Pemakaian\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/io.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.08 beta8\n; Translated by iZoom\n;\n;\n;\n;\n\n00000000=\"Ido\"\n00000001=\"Ido\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip-Ajusto\"\n\n; Info Page\n01000100=\"Pri progamo...\"\n01000103=\"7-Zip esas gratuita programo. Tamen, vu povas mantenar developado di 7-Zip per enregistrigesar.\"\n01000105=\"Enregistrigesar\"\n\n; Folders Page\n01000200=\"Dosieruyi\"\n01000210=\"&Laborala dosieruyo\"\n01000211=\"&Sistemala provizora dosieruyo\"\n01000212=\"&Nuna\"\n01000213=\"&Definez:\"\n01000214=\"&Uzar nur por deprenebla datumportili\"\n\n01000281=\"Definar loko por provizora arkiva dosieri.\"\n\n; System Page\n01000300=\"Sistemo\"\n01000301=\"Pozar 7-Zip'o en kuntexta menuo di shelo\"\n01000302=\"Kaskada kuntexta menuo\"\n01000310=\"Elementi di kuntexta menuo:\"\n\n; Language Page\n01000400=\"Linguo\"\n01000401=\"Linguo:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Komandi di 7-Zip\"\n02000103=\"Apertar\"\n02000104=\"Apertar merkita dosiero.\"\n02000105=\"Extraktar dosieri...\"\n02000106=\"Extraktar dosieri ek merkita arkivo.\"\n02000107=\"Adjuntar ad arkivo...\"\n02000108=\"Adjuntar merkita objekti.\"\n02000109=\"Verifikar arkivo\"\n0200010A=\"Verifiko di integreso di merkita arkivo.\"\n0200010B=\"Extraktez hike\"\n0200010C=\"Extraktar dosieri ek merkita arkivo aden nuna dosieruyo.\"\n0200010D=\"Extraktez aden {0}\"\n0200010E=\"Extraktar dosieri aden subdosieruyo.\"\n0200010F=\"Adjuntar ad {0}\"\n02000110=\"Adjuntar merkita objekti ad arkivo.\"\n02000111=\"Enarkivigar ed sendar elk-posto...\"\n02000112=\"Enarkivigar la merkita objekti e sendar la arkivo.\"\n02000113=\"Enarkivigar aden {0} e sendar elk-posto...\"\n02000113=\"Enarkivigar la merkita objekti e sendar la arkivo.\"\n\n02000140=\"<Dosieruyo>\"\n02000141=\"<Arkivo>\"\n\n; Properties\n02000203=\"Dosiervoyo\"\n02000204=\"Nomo\"\n02000205=\"Dosiernoma sufixo\"\n02000206=\"Dosieruyo\"\n02000207=\"Grandeso\"\n02000208=\"Enarkiva grandeso\"\n02000209=\"Atributi\"\n0200020A=\"Kreita\"\n0200020B=\"Acesita\"\n0200020C=\"Chanjita\"\n0200020D=\"Solida\"\n0200020E=\"Komentita\"\n0200020F=\"Chifrita\"\n02000210=\"Fendita ante\"\n02000211=\"Fendita pos\"\n02000212=\"Vortaro\"\n02000213=\"CRC\"\n02000214=\"Tipo\"\n02000215=\"Kontre\"\n02000216=\"Metodo\"\n02000217=\"Operacala sistemo\"\n02000218=\"Dosiersistemo\"\n02000219=\"Uzero\"\n0200021A=\"Grupo\"\n0200021B=\"Bloko\"\n0200021C=\"Komenturo\"\n0200021D=\"Poziciono\"\n\n; Status bar\n02000301=\"{0} objekt(o|i) merkita\"\n02000302=\"{0} objekt(o|i)\"\n\n; List Context Menu\n02000401=\"&Kolumni...\"\n\n02000411=\"&Apertar\"\n02000412=\"&Extraktez...\"\n\n; ToolBar\n02000501=\"Extraktar\"\n\n; Messages\n02000601=\"Rinovigo ne suportesas por ica arkivo.\"\n02000602=\"Rinovigo dil arkivo {0} faliis\"\n02000603=\"Krear dosieruyo '{0}' neposiblesis\"\n02000604=\"Dosiero ne esas suportata arkivo.\"\n02000605=\"Eroro\"\n02000606=\"Tro multa objekti\"\n02000607=\"Programo asociita kun tala tipo dosierala mankas\"\n02000608=\"Erori ne es trovita\"\n\n; Dialogs\n02000702=\"B&one\"\n02000705=\"&Yes\"\n02000707=\"Yes por &omni\"\n02000709=\"&No\"\n0200070B=\"No por o&mni\"\n\n02000710=\"Abandonar\"\n02000711=\"&Abandonez\"\n02000713=\"&Klozez\"\n02000714=\"Haltez\"\n02000715=\"Ristartez\"\n\n02000720=\"Helpo\"\n\n; Extract dialog\n02000800=\"&Extraktar\"\n02000801=\"E&xtraktar aden:\"\n02000802=\"&Pasovorto\"\n\n02000810=\"Dosiervoyi\"\n02000811=\"&Absoluta dosiervoyi\"\n02000812=\"&Relativa dosiervoyi\"\n02000813=\"&Sen dosiervoyi\"\n\n02000820=\"Remplasala skribmodo\"\n02000821=\"&Kun konfirmo\"\n02000822=\"&Sen konfirmo\"\n02000823=\"&Omisar existanta dosieri\"\n02000824=\"Automata nomchanjo\"\n02000825=\"Automata nomchanjo de existanta dosieri\"\n\n02000830=\"Dosieri\"\n02000831=\"&Merkita dosieri\"\n02000832=\"&Omna dosieri\"\n\n02000881=\"Definez loko por dosieri extraktenda.\"\n\n02000890=\"Extrakto\"\n\n; Overwrite dialog\n02000900=\"Konfirmo di nomchanjo\"\n02000901=\"Dosieruyo ja kontenas operacata dosiero.\"\n02000902=\"Kad remplasor esanta dosiero\"\n02000903=\"per la ica?\"\n\n02000911=\"&Automata nomchanjo.\"\n\n02000982=\"{0} bayti*\"\n02000983=\"chanjita per\"\n\n; Messages dialog\n02000A00=\"Diagnozala mesaji\"\n\n02000A80=\"Mesajo\"\n\n02000A91=\"Kompresmetodo ne esas suportata por dosiero '{0}'.\"\n02000A92=\"Datumeroro en '{0}'. Dosiero es fushita.\"\n02000A93=\"CRC-eroro en '{0}'. Dosiero es fushita.\"\n\n; Password dialog\n02000B00=\"Pasovorto\"\n02000B01=\"Sugestez pasovorto:\"\n02000B02=\"&Montrar pasovorto\"\n\n; Progress dialog\n02000C00=\"Proceso\"\n02000C01=\"Pasinta tempo:\"\n02000C02=\"Restanta tempo:\"\n02000C03=\"Grandeso:\"\n02000C04=\"Rapideso:\"\n\n02000C10=\"&Fono\"\n02000C11=\"&Avanajo\"\n02000C12=\"&Pauzo\"\n02000C13=\"&Durez\"\n\n02000C20=\"Pauzita\"\n\n02000C30=\"Kad vu ya volas abortar?\"\n\n; Compress dialog\n02000D00=\"Adjuntar aden arkivo\"\n02000D01=\"&Arkivo:\"\n02000D02=\"R&emplasomodo:\"\n02000D03=\"A&rkiva formato:\"\n02000D04=\"&Kompresometodo:\"\n02000D05=\"Kreor &solida arkivo\"\n02000D06=\"&Parametri:\"\n02000D07=\"Ajustaji\"\n02000D08=\"Krear SF&X-arkivo\"\n02000D09=\"Disfiligo\"\n02000D0A=\"Chifrar dosier&nomi\"\n02000D0B=\"Kompreso&grado\"\n02000D0C=\"&Vortarograndeso:\"\n02000D0D=\"Vo&rtograndeso:\"\n02000D0E=\"Memoruzo por kompresar:\"\n02000D0F=\"Memoruzo por extraktar:\"\n\n02000D40=\"&Fendar por volumini, bayti:\"\n\n02000D81=\"Sen kompresar\"\n02000D82=\"Normala kompreso\"\n02000D83=\"Maxim granda kompreso\"\n02000D84=\"Rapide\"\n02000D85=\"Maxim rapide\"\n02000D86=\"Extreme\"\n\n02000D90=\"Inspektar\"\n\n02000DA1=\"Adjuntar e remplasar dosieri\"\n02000DA2=\"Rinovigar e adjuntar dosieri\"\n02000DA3=\"Rifreshigar existanta dosieri\"\n02000DA4=\"Sinkronizar dosieri\"\n\n02000DB1=\"Omna dosieri\"\n\n02000DC0=\"Kompreso\"\n\n; Columns dialog\n02000E00=\"Kolumni\"\n02000E01=\"Merkez kolumni qui es spektenda en ca dosieruyo. Per butoni \\\"Ad-Supre\\\" ed \\\"Ad-Infre\\\" es posibla riaranjar sekquordino dil kolumni.\"\n02000E02=\"Merkita kolumno devas havar &larjeso di\"\n02000E03=\"punti.\"\n\n02000E10=\"Ad-&Supre\"\n02000E11=\"Ad-&Infre\"\n02000E12=\"&Montrez\"\n02000E13=\"&Celez\"\n02000E14=\"Definez\"\n\n02000E81=\"Nomo\"\n02000E82=\"Larjeso\"\n\n; Testing\n02000F90=\"Probado\"\n\n\n; File Manager\n\n03000000=\"7-Zip-dosieradministrilo\"\n\n; Menu\n03000102=\"&Dosiero\"\n03000103=\"&Redakto\"\n03000104=\"&Aspekto\"\n03000105=\"&Utensili\"\n03000106=\"&Helpo\"\n03000107=\"&Favoraji\"\n\n; File\n03000210=\"&Apertigar\"\n03000211=\"Apertigar int&erne\"\n03000212=\"Apertigar e&xter\"\n03000220=\"&Vidigar\"\n03000221=\"&Redaktar\"\n03000230=\"Ch&anjar nomo\"\n03000231=\"Ko&piar aden...\"\n03000232=\"Transp&ozar aden...\"\n03000233=\"E&facar\"\n03000240=\"In&heraji\"\n03000241=\"Ko&mentar\"\n03000250=\"Krear &dosieruyo\"\n03000251=\"Krear dos&iero\"\n03000260=\"E&kirar\"\n03000270=\"F&endar dosiero...\"\n03000271=\"Komb&inar dosieri...\"\n\n; Edit\n03000310=\"&Abolisar\"\n03000311=\"&Rifacar\"\n03000320=\"&Tranchar\"\n03000321=\"&Kopiar\"\n03000322=\"In&sertar\"\n03000323=\"E&facar\"\n03000330=\"Merk&ar omno\"\n03000331=\"Des&merkar omno\"\n03000332=\"&Inversigar merko\"\n03000333=\"Merkar...\"\n03000334=\"Desmerkar...\"\n03000335=\"Merkar segun tipo\"\n03000336=\"Desmerkar segun tipo\"\n\n; View\n03000410=\"&Granda ikoneti\"\n03000411=\"&Mikra ikoneti\"\n03000412=\"&Listo\"\n03000413=\"&Tabelo\"\n03000420=\"&Nearanjite\"\n03000430=\"Apertigar radika dosieruyo\"\n03000431=\"Ad-supre ye un nivelo\"\n03000432=\"Dosieruya historio...\"\n03000440=\"R&inovigar\"\n03000450=\"&2 paneli\"\n03000451=\"Utens&ila paneli\"\n03000460=\"Utensila panelo di arkivo\"\n03000461=\"Norma utensila panelo\"\n03000462=\"Granda ikoneti\"\n03000463=\"Videbla butontexto\"\n\n; Tools\n03000510=\"&Ajusti...\"\n03000511=\"&Experienco dil rapideso\"\n\n; Help\n03000610=\"&Konteno...\"\n03000620=\"&Pri 7-Zip...\"\n\n; Favorites\n03000710=\"&Adjuntar dosieruyo ad la favorata quale\"\n03000720=\"Lektomerkajo\"\n\n; Options Dialog\n\n03010000=\"Ajusti\"\n\n; Plugins\n03010100=\"Extraji\"\n03010101=\"&Extraji:\"\n03010110=\"Ajusti\"\n\n; Edit\n03010200=\"Redaktilo\"\n03010201=\"&Redaktilo:\"\n\n; System\n03010300=\"Sistemo\"\n03010302=\"Asociar 7-Zip-o kun dosieru:\"\n03010310=\"Extrajo\"\n\n; Settings\n03010400=\"Ajusti\"\n03010401=\"Montrar \\\"..\\\"-elemento\"\n03010402=\"Montrar reala dosier-ikoneti\"\n03010410=\"Montrar sistemala menuo\"\n03010420=\"Merkar &tota lineo\"\n03010421=\"Montrar &streki separanta\"\n\n; Strings\n\n03020201=\"Kopiar\"\n03020202=\"Transpozar\"\n03020203=\"Kopiez aden:\"\n03020204=\"Transpozez aden:\"\n03020205=\"Kopio...\"\n03020206=\"Transpozo...\"\n03020207=\"Onu ne povas kopiar objekti por tala dosieruyi.\"\n03020208=\"Operaco ne suportesas.\"\n\n03020210=\"Konfirmo dil efaco di dosiero\"\n03020211=\"Konfirmo dil efaco di dosieruyo\"\n03020212=\"Konfirmo dil efaco di dosieraro\"\n03020213=\"Ka vu ya volas efacar '{0}'?\"\n03020214=\"Ka vu ya volas efacar dosieruyo \\\"{0}\\\" e omna lua kontenaji?\"\n03020215=\"Ka vu ya volas efacar ita {0} objekti?\"\n03020216=\"Efaco...\"\n03020217=\"Eroro dum efacar di dosiero o dosieruyo\"\n\n03020220=\"Nomchanjo...\"\n03020221=\"Eroro dum nomchanjo di dosiero o dosieruyo\"\n\n03020230=\"Krear dosieruyo\"\n03020231=\"Dosieruynomo:\"\n03020232=\"Nova dosieruyo\"\n03020233=\"Eroro dum dosieruykreo\"\n\n03020240=\"Krear dosiero\"\n03020241=\"Dosiernomo:\"\n03020242=\"Nova dosiero\"\n03020243=\"Eroro dum dosierkreo\"\n\n03020250=\"Merkar\"\n03020251=\"Desmerkar\"\n03020252=\"Masko:\"\n\n03020260=\"Dosieruyhistorio\"\n\n03020280=\"Dosiero '{0}' chanjesis.\\nKa vu volas rinovigar lu enarkive?\"\n03020281=\"Rinovigo dil dosiero\\n'{0}' faliis\"\n03020282=\"Startigo dil redaktilo.\"\n03020283=\"Aperto...\"\n\n03020290=\"Komento\"\n03020291=\"&Komento:\"\n\n030202A0=\"Sistemo\"\n\n03020300=\"Komputilo\"\n03020301=\"Reto\"\n\n03020400=\"Adjuntar\"\n03020401=\"Extraktar\"\n03020402=\"Verifikar\"\n\n03020420=\"Kopiar\"\n03020421=\"Transpozar\"\n03020422=\"Efacar\"\n03020423=\"Informo\"\n\n03020500=\"Fendar dosiero\"\n03020501=\"&Fendez aden:\"\n03020510=\"Fendo...\"\n\n03020600=\"Kombinar dosieri\"\n03020601=\"&Kombinar aden:\"\n03020610=\"Kombino...\"\n\n; Computer\n03031100=\"Tota kapacivo\"\n03031101=\"Vakanta\"\n03031102=\"Faskogrando\"\n03031103=\"Etiketo\"\n\n; Network\n03031200=\"Lokala nomo\"\n03031201=\"Provizanto\"\n\n; Benchmark Dialog\n\n03080000=\"Experienco dil rapideso\"\n03080001=\"Memoruzo:\"\n03080002=\"Kompresado\"\n03080003=\"Extraktado\"\n03080004=\"Rapideso\"\n03080005=\"Aprecuro\"\n03080006=\"Tota aprecuro\"\n03080007=\"Kuranta\"\n03080008=\"Rezulta\"\n03080009=\"Pasi:\"\n0308000A=\"Erori:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/is.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by bjossi\n;\n;\n;\n;\n\n00000000=\"Icelandic\"\n00000001=\"Íslenska\"\n00000002=\"15\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Stillingar\"\n\n; Info Page\n01000100=\"Um 7-Zip\"\n01000103=\"7-Zip er ókeypis forrit. En þú getur stutt þróun 7-Zip með því að skrá þig.\"\n01000104=\"Aðstoð\"\n01000105=\"Skráning\"\n\n; Folders Page\n01000200=\"Möppur\"\n01000210=\"&Mappa notuð til vinnslu:\"\n01000211=\"&Tímabundin kerfismappa\"\n01000212=\"&Núverandi mappa\"\n01000213=\"&Skilgreindu möppu:\"\n01000214=\"Nota aðeins með fjarlægjanlegum drifum\"\n\n01000281=\"Skilgreindu staðsetningu fyir tímabundin gagnasöfn.\"\n\n; System Page\n01000300=\"Kerfi\"\n01000301=\"Innleiða 7-Zip í flýtivalmynd\"\n01000302=\"Lagskipt flýtivalmynd\"\n01000310=\"Hlutir í flýtivalmynd:\"\n\n; Language Page\n01000400=\"Tungumál\"\n01000401=\"Tungumál:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip skipanir\"\n02000103=\"Opna gagnasafn\"\n02000104=\"Opnar valið gagnasafn.\"\n02000105=\"Afþjappa gögn...\"\n02000106=\"Afþjappar gögnum frá völdu gagnasafni.\"\n02000107=\"Bæta við gagnasafn...\"\n02000108=\"Bætir skjölum í gagnasafn.\"\n02000109=\"Prófa gagnasafn\"\n0200010A=\"Prófar stöðugleika gagnasafns.\"\n0200010B=\"Afþjappa Hér\"\n0200010C=\"Afþjappar gögnum frá gagnasafni í núverandi möppu.\"\n0200010D=\"Afþjappa í {0}\"\n0200010E=\"Afþjappar gögn í hliðar-möppur.\"\n0200010F=\"Bæta við {0}\"\n02000110=\"Bætir gögnum við gagnasafn.\"\n02000111=\"Þjappa og senda...\"\n02000112=\"Þjappar saman gögnum í gagnasafn og sendir það með tölvupósti.\"\n02000113=\"Þjappa til {0} og senda\"\n02000114=\"Þjappar saman gögnum í gagnasafn og sendir það með tölvupósti.\"\n\n02000140=\"<Mappa>\"\n02000141=\"<Gagnasafn>\"\n\n; Properties\n02000203=\"Slóð\"\n02000204=\"Nafn\"\n02000205=\"Tegund Skráar\"\n02000206=\"Mappa\"\n02000207=\"Stærð\"\n02000208=\"Þjöppuð Stærð\"\n02000209=\"Eiginleikar\"\n0200020A=\"Búið Til\"\n0200020B=\"Opnað\"\n0200020C=\"Breytt\"\n0200020D=\"Þétt\"\n0200020E=\"Umsögn\"\n0200020F=\"Lykilorð\"\n02000210=\"Klofið Fyrir\"\n02000211=\"Klofið Eftir\"\n02000212=\"Orðasafn\"\n02000213=\"CRC\"\n02000214=\"Tegund\"\n02000215=\"Anti\"\n02000216=\"Aðferð\"\n02000217=\"Stýrikerfi\"\n02000218=\"Gagnakerfi\"\n02000219=\"Notandi\"\n0200021A=\"Hópur\"\n0200021B=\"Kubbur\"\n0200021C=\"Umsögn\"\n0200021D=\"Staðsetning\"\n0200021E=\"Prefix Slóðar\"\n0200021F=\"Möppur\"\n02000220=\"Skrár\"\n02000221=\"Útgáfa\"\n02000222=\"Kerfi\"\n02000223=\"Fjölkerfi\"\n02000224=\"Staðsetning\"\n02000225=\"Slóðar\"\n02000226=\"Kubbar\"\n02000227=\"Kerfi\"\n\n; Status bar\n02000301=\"{0} hlutir valdir\"\n02000302=\"{0} hlutir\"\n\n02000320=\"Skrár:\"\n02000321=\"Möppur:\"\n02000322=\"Stærð:\"\n02000323=\"Þjöppuð stærð:\"\n02000324=\"Gagnasöfn:\"\n\n; List Context Menu\n02000401=\"&Runur...\"\n\n02000411=\"&Opna\"\n02000412=\"&Afþjappa...\"\n\n; ToolBar\n02000501=\"Afþjappa\"\n\n; Messages\n02000601=\"Þessi tegund gagnasafns styður ekki uppfærsluskipanir.\"\n02000602=\"Get ekki uppfært gagnasafn {0}\"\n02000603=\"Get ekki búið til möppu '{0}'\"\n02000604=\"Viðkomandi skrá er ekki gagnasafn.\"\n02000605=\"Villa\"\n02000606=\"Of margar skrár\"\n02000607=\"Það er ekkert forrit í boði fyrir viðkomandi tegund skráar\"\n02000608=\"Það eru engar villur\"\n02000609=\"Get ekki opnað skrá '{0}' sem gagnasafn\"\n0200060A=\"Get ekki opnað læst gagnasafn '{0}'. Rangt lykilorð?\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Já\"\n02000707=\"Já við &Öllu\"\n02000709=\"&Nei\"\n0200070B=\"Nei við &Öllu\"\n\n02000710=\"Hætta Við\"\n02000711=\"&Hætta Við\"\n02000713=\"&Loka\"\n02000714=\"Hætta\"\n02000715=\"Endurræsa\"\n\n02000720=\"Hjálp\"\n\n; Extract dialog\n02000800=\"Afþjappa\"\n02000801=\"&Afþjappa í:\"\n02000802=\"Lykilorð\"\n\n02000810=\"Slóðar\"\n02000811=\"Full slóða-nöfn\"\n02000812=\"Núverandi slóða-nöfn\"\n02000813=\"Engin slóða-nöfn\"\n\n02000820=\"Yfirfærsla\"\n02000821=\"Spyrja fyrir yfirfærslu\"\n02000822=\"Yfirfæra án viðvörunar\"\n02000823=\"Sleppa öðrum skrám\"\n02000824=\"Endurnefna sjálfkrafa\"\n02000825=\"Endurnefna aðrar skrár\"\n\n02000830=\"Skrár\"\n02000831=\"&Valdar skrár\"\n02000832=\"&Allar skrár\"\n\n02000881=\"Skilgreindu staðsetningu fyrir afþjappaðar skrár.\"\n\n02000890=\"Afþjappa\"\n\n; Overwrite dialog\n02000900=\"Staðfesta Yfirfærslu Skráar\"\n02000901=\"Skilgreind mappa inniheldur unna skrá nú þegar.\"\n02000902=\"Vilt þú yfirfæra fyrrverandi skrá\"\n02000903=\"með þessari?\"\n\n02000911=\"&Endurnefna Sjálfkrafa\"\n\n02000982=\"{0} bæti\"\n02000983=\"Breytt þann\"\n\n; Messages dialog\n02000A00=\"Prufuskilaboð\"\n\n02000A80=\"Skilaboð\"\n\n02000A91=\"Óstutt samþjöppunaraðferð fyrir '{0}'.\"\n02000A92=\"Gagnavilla í '{0}'. Skrá er biluð.\"\n02000A93=\"CRC gekk ekki í '{0}'. Skrá er biluð.\"\n02000A94=\"Gagnavilla í læstu skjali '{0}'. Rangt lykilorð?\"\n02000A95=\"CRC gekk ekki í læstu skjali '{0}'. Rangt lykilorð?\"\n\n; Password dialog\n02000B00=\"Skrifaðu lykilorð\"\n02000B01=\"Skrifaðu lykilorð:\"\n02000B02=\"&Sýna lykilorð\"\n02000B03=\"Skrifaðu lykilorð aftur:\"\n02000B10=\"Lykilorðin eru ekki eins\"\n02000B11=\"Notaðu aðeins enska stafi, tölur og sérstaka stafi (!, #, $, ...) í lykilorðum\"\n02000B12=\"Lykilorðið er of langt\"\n\n; Progress dialog\n02000C00=\"Vinna\"\n02000C01=\"Áætlaður tími:\"\n02000C02=\"Tími eftir:\"\n02000C03=\"Heildarstærð:\"\n02000C04=\"Hraði:\"\n02000C05=\"Unnið:\"\n02000C06=\"Samþjöppunarstuðull:\"\n\n02000C10=\"&Bakgrunnur\"\n02000C11=\"&Fyrirgrunnur\"\n02000C12=\"&Bíða\"\n02000C13=\"&Halda áfram\"\n\n02000C20=\"Bíður\"\n\n02000C30=\"Ertu viss um að þú viljir hætta við?\"\n\n; Compress dialog\n02000D00=\"Bæta við gagnasafn\"\n02000D01=\"&Gagnasafn:\"\n02000D02=\"&Uppfærsla:\"\n02000D03=\"Gagnasafn &tegund:\"\n02000D04=\"Samþjöppun &aðferð:\"\n02000D05=\"Gera &Þétt gagnasafn\"\n02000D06=\"&Skipanir:\"\n02000D07=\"Stillingar\"\n02000D08=\"Gera &SFX gagnasafn\"\n02000D09=\"Fjölvinnsla (multi-threading)\"\n02000D0A=\"Læsa skjali &nöfn\"\n02000D0B=\"Samþjöppun &stig:\"\n02000D0C=\"&Stærð orðasafns:\"\n02000D0D=\"&Orðastærð:\"\n02000D0E=\"Notkun vinnsluminnis fyrir Samþjöppun:\"\n02000D0F=\"Notkun vinnsluminnis fyrir Afþjöppun:\"\n02000D10=\"Læsing\"\n02000D11=\"Aðferð læsingar:\"\n02000D12=\"Fjöldi CPU kjarna:\"\n02000D13=\"Þétt kubbastærð:\"\n02000D14=\"Óþétt\"\n02000D15=\"Þétt\"\n02000D16=\"Þjappa deildum skrám\"\n\n02000D40=\"Skipta í &hluta, bæti:\"\n02000D41=\"Vitlaus stærð hluts\"\n02000D42=\"Skilgreind stærð hluta: {0} bæti.\\nErtu viss um að þú viljir skipta gagnasafni í þessa hluta?\"\n\n02000D81=\"Geyma\"\n02000D82=\"Meðallag\"\n02000D83=\"Hámark\"\n02000D84=\"Hratt\"\n02000D85=\"Hraðast\"\n02000D86=\"Ultra\"\n\n02000D90=\"Skoða\"\n\n02000DA1=\"Bæta við og yfirfæra skrár\"\n02000DA2=\"Uppfæra og bæta við skrám\"\n02000DA3=\"Lífga upp á núverandi skrár\"\n02000DA4=\"Samrýma skrár\"\n\n02000DB1=\"Allar Skrár\"\n\n02000DC0=\"Samþjappa\"\n\n; Columns dialog\n02000E00=\"Runur\"\n02000E01=\"Veldu runurnar sem þú vilt gera sýnilegar í þessari möppu. Notaðu Fara Upp og Fara Niður takkana til að endurraða rununum.\"\n02000E02=\"Valda runan ætti að vera\"\n02000E03=\"pixlar &vítt.\"\n\n02000E10=\"Fara &Upp\"\n02000E11=\"Fara &Niður\"\n02000E12=\"&Sýna\"\n02000E13=\"&Fela\"\n02000E14=\"Setja\"\n\n02000E81=\"Titill\"\n02000E82=\"Vídd\"\n\n; Testing\n02000F90=\"Prófa\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&Skrá\"\n03000103=\"&Skipanir\"\n03000104=\"&Útlit\"\n03000105=\"&Tól\"\n03000106=\"&Hjálp\"\n03000107=\"&Í Uppáhaldi\"\n\n; File\n03000210=\"&Opna\"\n03000211=\"Opna &Inni\"\n03000212=\"Opna &Úti\"\n03000220=\"&Skoða\"\n03000221=\"&Breyta\"\n03000230=\"&Endurnefna\"\n03000231=\"&Afrita Til...\"\n03000232=\"&Færa Til...\"\n03000233=\"&Eyða\"\n03000240=\"&Stillingar\"\n03000241=\"&Umsögn\"\n03000242=\"Reikna út checksum\"\n03000250=\"Gera Möppu\"\n03000251=\"Gera Skrá\"\n03000260=\"&Hætta\"\n03000270=\"&Skipta skrá...\"\n03000271=\"&Sameina skrár...\"\n\n; Edit\n03000310=\"&Bakka\"\n03000311=\"&Gera aftur\"\n03000320=\"&Klippa\"\n03000321=\"&Afrita\"\n03000322=\"&Birta Afrit\"\n03000323=\"&Eyða\"\n03000330=\"Velja &Allt\"\n03000331=\"Afvelja Allt\"\n03000332=\"&Öfugsnúið Val\"\n03000333=\"Velja...\"\n03000334=\"Afvelja...\"\n03000335=\"Velja eftir Tegund\"\n03000336=\"Afvelja eftir Tegund\"\n\n; View\n03000410=\"&Stórar Myndir\"\n03000411=\"&Smáar Myndir\"\n03000412=\"&Listi\"\n03000413=\"&Smáatriði\"\n03000420=\"Óflokkað\"\n03000430=\"Opna Aðalmöppu\"\n03000431=\"Til Baka\"\n03000432=\"Möppusaga...\"\n03000440=\"&Uppfæra\"\n03000449=\"Birta Heildarinnihald\"\n03000450=\"&2 Borð\"\n03000451=\"&Tólaröð\"\n03000460=\"Tólaröð gagnasafns\"\n03000461=\"Eðlileg Tólaröð\"\n03000462=\"Stórir Takkar\"\n03000463=\"Sýna Texta Takkana\"\n\n; Tools\n03000510=\"&Stillingar...\"\n03000511=\"&Hraðaprufa\"\n\n; Help\n03000610=\"&Innihald...\"\n03000620=\"&Um 7-Zip...\"\n\n; Favorites\n03000710=\"&Bæta möppu við Uppáhald sem\"\n03000720=\"Setja bókarmerki\"\n\n; Options Dialog\n\n03010000=\"Stillingar\"\n\n; Plugins\n03010100=\"Græjur\"\n03010101=\"&Græjur:\"\n03010110=\"Stillingar...\"\n\n; Edit\n03010200=\"Breytir\"\n03010201=\"&Breytir:\"\n\n; System\n03010300=\"Kerfi\"\n03010302=\"Innleiða 7-Zip í:\"\n03010310=\"Græja\"\n\n; Settings\n03010400=\"Stillingar\"\n03010401=\"Sýna \\\"..\\\" hluti\"\n03010402=\"Sýna réttar skráarmyndir\"\n03010410=\"Sýna kerfisvalmynd\"\n03010420=\"&Fullt raðaval\"\n03010421=\"Sýna &hnitalínur\"\n03010430=\"&Öðruvísi valstilling\"\n03010440=\"Nota &stórar minnissíður\"\n\n; Strings\n\n03020201=\"Afrita\"\n03020202=\"Færa\"\n03020203=\"Afrita í:\"\n03020204=\"Færa skrá/möppu til:\"\n03020205=\"Afrita...\"\n03020206=\"Færa...\"\n03020207=\"Þú getur ekki fært eða afritað svona skrár fyrir þessar möppur.\"\n03020208=\"Skipun er ekki studd.\"\n03020209=\"Veldu staðsetningarmöppu.\"\n\n03020210=\"Staðfestu Eyðingu Skráar\"\n03020211=\"Staðfestu Eyðingu Möppu\"\n03020212=\"Staðfestu Fjöldaeyðingu Skráa\"\n03020213=\"Ertu viss um að þú viljir eyða '{0}'?\"\n03020214=\"Ertu viss um að þú viljir eyða möppunni '{0}' og öllu innihaldi hennar?\"\n03020215=\"Ertu viss um að þú viljir eyða þessum {0} skrám?\"\n03020216=\"Eyða...\"\n03020217=\"Ekki tókst að eyða Skrá eða Möppu\"\n\n03020220=\"Endurnefna...\"\n03020221=\"Villa við endurnafn Skráar eða Möppu\"\n03020222=\"Staðfestu Afritun Skráar\"\n03020223=\"Ertu viss um að þú viljir afrita þessa skrá í gagnasafn?\"\n\n03020230=\"Gera Möppu\"\n03020231=\"Nafn möppu:\"\n03020232=\"Ný Mappa\"\n03020233=\"Villa við gerð möppu\"\n\n03020240=\"Gera Skrá\"\n03020241=\"Nafn Skráar:\"\n03020242=\"Ný Skrá\"\n03020243=\"Villa við gerð skráar\"\n\n03020250=\"Velja\"\n03020251=\"Afvelja\"\n03020252=\"Skyggja:\"\n\n03020260=\"Möppusaga\"\n\n03020280=\"Skrá '{0}' var breytt.\\nViltu uppfæra hana í gagnasafninu?\"\n03020281=\"Get ekki uppfært skrá\\n'{0}'\"\n03020282=\"Get ekki opnað breyti.\"\n03020283=\"Opna...\"\n\n03020290=\"Umsögn\"\n03020291=\"&Umsögn:\"\n\n030202A0=\"Kerfi\"\n\n03020300=\"Tölva\"\n03020301=\"Internet\"\n\n03020400=\"Bæta við\"\n03020401=\"Afþjappa\"\n03020402=\"Prófa\"\n\n03020420=\"Afrita\"\n03020421=\"Færa\"\n03020422=\"Eyða\"\n03020423=\"Upplýsingar\"\n\n03020500=\"Skipta Skrá\"\n03020501=\"&Skipta í:\"\n03020510=\"Skipta...\"\n03020520=\"Staðfestu skiptingu\"\n03020521=\"Ertu viss um að þú viljir skipta skránni í {0} hluta?\"\n03020522=\"Stærð hluta verður að vera smærri en stærð upprunalegu skrárinnar\"\n\n03020600=\"Sameina Skrár\"\n03020601=\"&Sameina Í:\"\n03020610=\"Sameina...\"\n03020620=\"Veldu aðeins fyrstu skránna\"\n\n03020710=\"Checksum útreikning...\"\n03020720=\"Checksum upplýsingar\"\n03020721=\"CRC checksum fyrir gögn:\"\n03020722=\"CRC checksum fyrir gögn of nöfn:\"\n\n03020800=\"Skanna...\"\n\n03020900=\"Stillingar\"\n\n; Computer\n03031100=\"Heildarstærð\"\n03031101=\"Laust Pláss\"\n03031102=\"Stærð Hóps\"\n03031103=\"Titill\"\n\n; Network\n03031200=\"Nafn Hér\"\n03031201=\"Þjónustugjafi\"\n\n; Benchmark Dialog\n\n03080000=\"Hraðaprufa\"\n03080001=\"Vinnsluminnisnotkun:\"\n03080002=\"Samþjöppun\"\n03080003=\"Afþjöppun\"\n03080004=\"Hraði\"\n03080005=\"Útkoma\"\n03080006=\"Heildarútkoma\"\n03080007=\"Núverandi\"\n03080008=\"Niðurstaða\"\n03080009=\"Fjöldi Prufa:\"\n0308000A=\"Villur:\"\n0308000B=\"CPU Notkun\"\n0308000C=\"Útkoma / Notkun\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/it.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.07 Beta\n; Translated by Leandro Spagnol\n;\n; Updated to 7-Zip v4.60\n; by TJL73 <http://tjl73.altervista.org/>\n; Some corrections by Vincenzo Reale\n;\n\n00000000=\"Italian\"\n00000001=\"Italiano\"\n00000002=\"16\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configurazione di 7-Zip \"\n\n; Info Page\n01000100=\"Informazioni\"\n01000103=\"7-Zip è un software gratuito e libero. Se vuoi supportare l'ulteriore sviluppo di 7-Zip, regìstrati: in qualità di utente registrato, potrai usufruire del servizio di supporto tecnico.\\n\\n\\nLocalizzazione italiana a cura di: TJL73 <http://tjl73.altervista.org/>\"\n01000104=\"Supporto tecnico\"\n01000105=\"Registra\"\n\n; Folders Page\n01000200=\"Cartelle\"\n01000210=\"Cartella di lavoro\"\n01000211=\"Cartella &TEMP di sistema\"\n01000212=\"&Corrente\"\n01000213=\"&Specificata:\"\n01000214=\"&Utilizza solo per dischi rimovibili\"\n\n01000281=\"Specifica una cartella per i file temporanei.\"\n\n; System Page\n01000300=\"Shell di sistema\"\n01000301=\"Integra 7-Zip nel menu contestuale della shell\"\n01000302=\"Menu contestuale a cascata\"\n01000310=\"Elementi del menu contestuale:\"\n\n; Language Page\n01000400=\"Lingua\"\n01000401=\"Lingua:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comandi 7-Zip\"\n02000103=\"Apri\"\n02000104=\"Apre l'archivio selezionato.\"\n02000105=\"Estrai i file...\"\n02000106=\"Estrae i file dall'archivio selezionato.\"\n02000107=\"Aggiungi all'archivio...\"\n02000108=\"Aggiunge i file selezionati all'archivio.\"\n02000109=\"Verifica l'archivio\"\n0200010A=\"Verifica l'integrità dell'archivio selezionato.\"\n0200010B=\"Estrai qui\"\n0200010C=\"Estrae i file dall'archivio selezionato, nella cartella corrente.\"\n0200010D=\"Estrai in {0}\"\n0200010E=\"Estrae i file nella sottocartella specificata.\"\n0200010F=\"Aggiungi a {0}\"\n02000110=\"Aggiunge gli elementi selezionati all'archivio specificato.\"\n02000111=\"Comprimi ed invia per email...\"\n02000112=\"Comprime i file selezionati in un archivio e lo invia per email.\"\n02000113=\"Comprimi in {0} ed invia per email\"\n02000114=\"Comprime i file selezionati nell'archivio specificato e lo invia per email.\"\n\n02000140=\"<cartella>\"\n02000141=\"<archivio>\"\n\n; Properties\n02000203=\"Percorso\"\n02000204=\"Nome\"\n02000205=\"Estensione\"\n02000206=\"Cartella\"\n02000207=\"Dimensione\"\n02000208=\"Dimensione compressa\"\n02000209=\"Attributi\"\n0200020A=\"Creato\"\n0200020B=\"Ultimo accesso\"\n0200020C=\"Ultima modifica\"\n0200020D=\"Solido\"\n0200020E=\"Commentato\"\n0200020F=\"Cifrato\"\n02000210=\"Dividi prima\"\n02000211=\"Dividi dopo\"\n02000212=\"Dizionario\"\n02000213=\"CRC\"\n02000214=\"Tipo\"\n02000215=\"Anti\"\n02000216=\"Metodo\"\n02000217=\"OS destinatario\"\n02000218=\"File system\"\n02000219=\"Utente\"\n0200021A=\"Gruppo\"\n0200021B=\"Blocco\"\n0200021C=\"Commento\"\n0200021D=\"Posizione\"\n0200021E=\"Percorso completo\"\n0200021F=\"Cartelle\"\n02000220=\"File\"\n02000221=\"Versione\"\n02000222=\"Unità\"\n02000223=\"Unità multiple\"\n02000224=\"Offset\"\n02000225=\"Collegamenti\"\n02000226=\"Blocchi\"\n02000227=\"Unità\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Dimensione fisica\"\n0200022D=\"Dimensione intestazioni\"\n0200022E=\"Checksum\"\n0200022F=\"Caratteristiche\"\n02000230=\"Indirizzo virtuale\"\n\n; Status bar\n02000301=\"Oggetti selezionati: {0}\"\n02000302=\"{0} oggetti\"\n\n02000320=\"File:\"\n02000321=\"Cartelle:\"\n02000322=\"Dimensione:\"\n02000323=\"Dimensione compressa:\"\n02000324=\"Archivi:\"\n\n; List Context Menu\n02000401=\"&Colonne...\"\n\n02000411=\"&Apri\"\n02000412=\"&Estrai...\"\n\n; ToolBar\n02000501=\"Estrai\"\n\n; Messages\n02000601=\"Non è possibile effettuare aggiornamenti su questo archivio.\"\n02000602=\"Impossibile aggiornare l'archivio {0}\"\n02000603=\"Impossibile creare la cartella '{0}'\"\n02000604=\"Questo file non è un archivio supportato.\"\n02000605=\"Errore\"\n02000606=\"Troppi elementi\"\n02000607=\"L'estensione del file scelto non è associata a nessun programma.\"\n02000608=\"Nessun errore.\"\n02000609=\"Impossibile aprire il file '{0}' come archivio.\"\n0200060A=\"Impossibile aprire l'archivio cifrato '{0}'. Password errata?\"\n0200060B=\"Non è possibile allocare la quantità di memoria richiesta\"\n0200060C=\"Errore sconosciuto\"\n0200060D=\"Archivio non supportato\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Sì\"\n02000707=\"Sì per &tutti\"\n02000709=\"&No\"\n0200070B=\"No per t&utti\"\n\n02000710=\"Annulla\"\n02000711=\"&Annulla\"\n02000713=\"&Chiudi\"\n02000714=\"Ferma\"\n02000715=\"Riavvia\"\n\n02000720=\"Aiuto\"\n\n; Extract dialog\n02000800=\"Estrai\"\n02000801=\"E&strai in:\"\n02000802=\"Password\"\n\n02000810=\"Struttura delle cartelle\"\n02000811=\"Percorsi completi\"\n02000812=\"Percorsi attuali\"\n02000813=\"Nessun percorso\"\n\n02000820=\"Sovrascrittura\"\n02000821=\"Chiedi prima di sovrascrivere\"\n02000822=\"Sovrascrivi senza chiedere\"\n02000823=\"Non sovrascrivere i file esistenti\"\n02000824=\"Rinomina automaticamente\"\n02000825=\"Rinomina autom. i file esistenti\"\n\n02000830=\"File\"\n02000831=\"File &selezionati\"\n02000832=\"&Tutti i file\"\n\n02000881=\"Specifica una cartella in cui estrarre i file.\"\n\n02000890=\"Estrazione in corso...\"\n\n; Overwrite dialog\n02000900=\"Conferma la sovrascrittura del file\"\n02000901=\"File già esistente nella cartella di destinazione.\"\n02000902=\"Vuoi sostituire il file esistente\"\n02000903=\"con questo?\"\n\n02000911=\"&Rinomina automaticamente\"\n\n02000982=\"{0} byte\"\n02000983=\"modificato il\"\n\n; Messages dialog\n02000A00=\"Messaggi di diagnostica\"\n\n02000A80=\"Messaggio\"\n\n02000A91=\"Metodo di compressione non supportato per '{0}'.\"\n02000A92=\"Errore nei dati in '{0}'. Il file è danneggiato.\"\n02000A93=\"CRC non corretto in '{0}'. Il file è danneggiato.\"\n02000A94=\"Errore nel file cifrato '{0}'. Password errata?\"\n02000A95=\"CRC errato nel file cifrato '{0}'. Password errata?\"\n\n; Password dialog\n02000B00=\"Inserisci password\"\n02000B01=\"&Inserisci password:\"\n02000B02=\"Mostra pass&word\"\n02000B03=\"&Reinserisci password:\"\n02000B10=\"Password differenti\"\n02000B11=\"Per la password, utilizzare solo lettere ASCII, numeri e caratteri speciali (!, #, $, ...)\"\n02000B12=\"La password è troppo lunga\"\n\n; Progress dialog\n02000C00=\"Processo\"\n02000C01=\"Tempo trascorso:\"\n02000C02=\"Tempo rimanente:\"\n02000C03=\"Dimensione totale:\"\n02000C04=\"Velocità:\"\n02000C05=\"Elaborato:\"\n02000C06=\"Rapporto compressione:\"\n\n02000C10=\"&In background\"\n02000C11=\"&In primo piano\"\n02000C12=\"&Pausa\"\n02000C13=\"&Riprendi\"\n\n02000C20=\"In pausa\"\n\n02000C30=\"Sei sicuro di voler annullare?\"\n\n; Compress dialog\n02000D00=\"Aggiungi all'archivio\"\n02000D01=\"Nome &archivio:\"\n02000D02=\"Modalità a&ggiornamento:\"\n02000D03=\"&Formato dell'archivio:\"\n02000D04=\"&Metodo di compressione:\"\n02000D05=\"Crea archivio &solido\"\n02000D06=\"Parametri &opzionali:\"\n02000D07=\"Opzioni\"\n02000D08=\"Crea archivio auto-&estraente\"\n02000D09=\"Usa multi-threading\"\n02000D0A=\"Cifra anche il &nome dei file\"\n02000D0B=\"&Livello di compressione:\"\n02000D0C=\"Dimensione &Dizionario:\"\n02000D0D=\"Dimensioni &Parola:\"\n02000D0E=\"Quantità memoria per compressione:\"\n02000D0F=\"Quantità memoria per decompressione:\"\n02000D10=\"Cifratura\"\n02000D11=\"Metodo &cifratura:\"\n02000D12=\"N&umero di flussi (thread) CPU:\"\n02000D13=\"Dimensione del &blocco solido:\"\n02000D14=\"Non-solido\"\n02000D15=\"Solido\"\n02000D16=\"Comprimi file condivisi\"\n\n02000D40=\"Di&vidi in più file (dimensione in byte):\"\n02000D41=\"Dimensione non corretta\"\n02000D42=\"Dimensione specificata: {0} byte.\\nSicuro di voler dividere l'archivio in questo modo?\"\n\n02000D81=\"Nessuna\"\n02000D82=\"Normale\"\n02000D83=\"Massima\"\n02000D84=\"Veloce\"\n02000D85=\"Velocissima\"\n02000D86=\"Ultra\"\n\n02000D90=\"Sfoglia\"\n\n02000DA1=\"Aggiungi e sostituisci i file\"\n02000DA2=\"Aggiorna e aggiungi i file\"\n02000DA3=\"Aggiorna i file esistenti\"\n02000DA4=\"Sincronizza i file\"\n\n02000DB1=\"Tutti i file\"\n\n02000DC0=\"Compressione in corso...\"\n\n; Columns dialog\n02000E00=\"Colonne\"\n02000E01=\"Segna le colonne che vuoi rendere visibili in questa cartella. Usa i pulsanti Sposta in alto ed in basso per riordinare le colonne.\"\n02000E02=\"Le colonne selezionate dovrebbero essere larghe\"\n02000E03=\"pixel.\"\n\n02000E10=\"Sposta in &alto\"\n02000E11=\"Sposta in &basso\"\n02000E12=\"&Mostra\"\n02000E13=\"&Nascondi\"\n02000E14=\"Imposta\"\n\n02000E81=\"Titolo\"\n02000E82=\"Larghezza\"\n\n; Testing\n02000F90=\"Verifica archivio...\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&File\"\n03000103=\"&Modifica\"\n03000104=\"&Visualizza\"\n03000105=\"&Strumenti\"\n03000106=\"&Aiuto\"\n03000107=\"&Preferiti\"\n\n; File\n03000210=\"&Apri\"\n03000211=\"Apri in &7-Zip File Manager\"\n03000212=\"Apri in E&xplorer\"\n03000220=\"&Visualizza\"\n03000221=\"Apri con l'&editor predefinito\"\n03000230=\"Rino&mina\"\n03000231=\"&Copia in...\"\n03000232=\"&Sposta in...\"\n03000233=\"&Elimina\"\n03000240=\"&Proprietà\"\n03000241=\"Comme&nto\"\n03000242=\"Calcola chec&ksum\"\n03000250=\"Crea cartella\"\n03000251=\"Crea file\"\n03000260=\"E&sci\"\n03000270=\"&Dividi il file...\"\n03000271=\"&Unisci i file...\"\n\n; Edit\n03000310=\"&Annulla\"\n03000311=\"&Ripeti\"\n03000320=\"Tag&lia\"\n03000321=\"&Copia\"\n03000322=\"&Incolla\"\n03000323=\"&Elimina\"\n03000330=\"&Seleziona tutto\"\n03000331=\"&Deseleziona tutto\"\n03000332=\"In&verti selezione\"\n03000333=\"Seleziona...\"\n03000334=\"Deseleziona...\"\n03000335=\"Seleziona per tipo\"\n03000336=\"Deseleziona per tipo\"\n\n; View\n03000410=\"Icone &grandi\"\n03000411=\"Icone &piccole\"\n03000412=\"&Elenco\"\n03000413=\"&Dettagli\"\n03000420=\"Nessun ordine\"\n03000430=\"Apri cartella principale\"\n03000431=\"Livello superiore\"\n03000432=\"Cronologia...\"\n03000440=\"&Aggiorna\"\n03000449=\"Vista non strutturata\"\n03000450=\"Interfaccia a &2 pannelli\"\n03000451=\"Barre degli &strumenti\"\n03000460=\"Barra archivio\"\n03000461=\"Barra standard\"\n03000462=\"Icone grandi\"\n03000463=\"Mostra etichette di testo\"\n\n; Tools\n03000510=\"&Opzioni...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Guida...\"\n03000620=\"&Informazioni su 7-Zip...\"\n\n; Favorites\n03000710=\"&Aggiungi la cartella ai Preferiti come\"\n03000720=\"Collegamento\"\n\n; Options Dialog\n\n03010000=\"Opzioni\"\n\n; Plugins\n03010100=\"Plugin\"\n03010101=\"Plugin:\"\n03010110=\"&Opzioni...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor predefinito:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Associa 7-Zip a:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Impostazioni\"\n03010401=\"Mostra l'elemento \\\"..\\\"\"\n03010402=\"Mostra le icone dei file\"\n03010410=\"Mostra le icone di sistema\"\n03010420=\"Selezione a &riga intera\"\n03010421=\"Mostra &griglia\"\n03010430=\"Modalità di selezione &alternativa\"\n03010440=\"Utilizza pagine &larghe di memoria\"\n\n; Strings\n\n03020201=\"Copia\"\n03020202=\"Sposta\"\n03020203=\"Copia in:\"\n03020204=\"Sposta in:\"\n03020205=\"Copia in corso...\"\n03020206=\"Spostamento in corso...\"\n03020207=\"Non è possibile spostare o copiare file in queste cartelle.\"\n03020208=\"Operazione non supportata per questa cartella.\"\n03020209=\"Selezionare la cartella di destinazione.\"\n\n03020210=\"Conferma l'eliminazione del file\"\n03020211=\"Conferma l'eliminazione della cartella\"\n03020212=\"Conferma l'eliminazione di più elementi\"\n03020213=\"Sei certo di voler eliminare '{0}'?\"\n03020214=\"Sei certo di voler eliminare la cartella '{0}' e tutto il suo contenuto?\"\n03020215=\"Sei certo di voler eliminare questi {0} elementi?\"\n03020216=\"Eliminazione in corso...\"\n03020217=\"Errore nell'eliminazione del file o della cartella\"\n03020218=\"Impossibile spostare un file con percorso lungo nel Cestino\"\n\n03020220=\"Rinomina in corso...\"\n03020221=\"Errore nella rinomina del file o cartella\"\n03020222=\"Conferma copia\"\n03020223=\"Sei sicuro di voler copiare questi file nell'archivio\"\n\n03020230=\"Crea cartella\"\n03020231=\"Nome cartella:\"\n03020232=\"Nuova cartella\"\n03020233=\"Errore nella creazione della cartella\"\n\n03020240=\"Crea file\"\n03020241=\"Nome file:\"\n03020242=\"Nuovo file\"\n03020243=\"Errore nella creazione del file\"\n\n03020250=\"Seleziona\"\n03020251=\"Deseleziona\"\n03020252=\"Filtro:\"\n\n03020260=\"Cronologia\"\n\n03020280=\"Il file '{0}' è stato modificato.\\nVuoi aggiornare l'archivio?\"\n03020281=\"Impossibile aggiornare il file\\n'{0}'\"\n03020282=\"Impossibile avviare l'editor.\"\n03020283=\"Apertura in corso... \"\n03020284=\"Il file sembra essere un virus (contiene molti spazi nel nome).\"\n\n03020290=\"Commento\"\n03020291=\"&Commento:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Computer\"\n03020301=\"Rete\"\n03020302=\"Documenti\"\n\n03020400=\"Aggiungi\"\n03020401=\"Estrai\"\n03020402=\"Verifica\"\n\n03020420=\"Copia\"\n03020421=\"Sposta\"\n03020422=\"Elimina\"\n03020423=\"Proprietà\"\n\n03020500=\"Dividi file\"\n03020501=\"&Dividi in:\"\n03020510=\"Dividi in...\"\n03020520=\"Conferma divisione\"\n03020521=\"Sicuro di voler dividere l'archivio in {0} porzioni?\"\n03020522=\"La dimensione di ciascuna porzione deve essere più piccola della dimensione totale dell'archivio originale\"\n\n03020600=\"Unisci i file\"\n03020601=\"&Unisci in:\"\n03020610=\"Unisci...\"\n03020620=\"Seleziona solo la prima parte del file diviso\"\n03020621=\"Impossibile riconoscere il file come archivio diviso\"\n03020622=\"Impossibile trovare più di una parte dell'archivio diviso\"\n\n03020710=\"Calcolo del checksum...\"\n03020720=\"Informazioni sul checksum\"\n03020721=\"CRC checksum sui dati:\"\n03020722=\"CRC checksum su dati e nomi:\"\n\n03020800=\"Scansione...\"\n\n03020900=\"Proprietà\"\n\n03020A01=\"L'operazione non può essere richiamata da una cartella con percorso lungo.\"\n03020A02=\"Devi selezionare un file\"\n03020A03=\"Devi selezionare almeno un file\"\n03020A04=\"Il file {0} è già presente\"\n\n; Computer\n03031100=\"Capacità\"\n03031101=\"Disponibili\"\n03031102=\"Dimensione dei cluster\"\n03031103=\"Etichetta\"\n\n; Network\n03031200=\"Nome locale\"\n03031201=\"Rete\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Utilizzo memoria:\"\n03080002=\"Compressione in corso\"\n03080003=\"Decompressione in corso\"\n03080004=\"Velocità\"\n03080005=\"Valutazione\"\n03080006=\"Valutazione totale\"\n03080007=\"Attuale\"\n03080008=\"Risultante\"\n03080009=\"Passaggi:\"\n0308000A=\"Errori:\"\n0308000B=\"Utilizzo CPU\"\n0308000C=\"Stima / Utilizzo\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ja.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59 beta\n; Translated by Komuro, Mick, 2chBBS-software\n; Additions and minor fixes by Stepanushkin Dmitry\n; Some fixes by Crus Mitsuaki\n;\n;\n\n00000000=\"Japanese\"\n00000001=\"日本語\"\n00000002=\"17\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip設定\"\n\n; Info Page\n01000100=\"7-Zipについて\"\n01000103=\"7-Zipはフリーウェアです。しかし、7-Zipに有料で登録し開発を支援する事が出来ます。登録したユーザーは技術的なサポートを受ける事が出来ます。\"\n01000104=\"サポート\"\n01000105=\"登録(&R)\"\n\n; Folders Page\n01000200=\"フォルダ(&F)\"\n01000210=\"作業フォルダ(&W)\"\n01000211=\"一時フォルダ(&S)\"\n01000212=\"カレントフォルダ(&C)\"\n01000213=\"フォルダ指定(&P)：\"\n01000214=\"リムーバブルドライブのみ使用する(&R)\"\n\n01000281=\"作業フォルダ指定\"\n\n; System Page\n01000300=\"システム\"\n01000301=\"右クリックに7-Zip登録（シェルに統合）(&I)\"\n01000302=\"7-Zipをサブメニュー化する\"\n01000310=\"メニュー項目：\"\n\n; Language Page\n01000400=\"言語\"\n01000401=\"言語設定：\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip コマンド\"\n02000103=\"開く(&O)\"\n02000104=\"選択した書庫を開く\"\n02000105=\"解凍(&E)...\"\n02000106=\"選択した書庫を解凍...\"\n02000107=\"圧縮(&C)...\"\n02000108=\"選択したファイルを圧縮\"\n02000109=\"書庫をテスト(&T)\"\n0200010A=\"選択した書庫をテスト\"\n0200010B=\"ここに解凍(&H)\"\n0200010C=\"選択した書庫をここに解凍\"\n0200010D=\"{0} に解凍\"\n0200010E=\"サブフォルダに解凍\"\n0200010F=\"{0} に圧縮\"\n02000110=\"選択したファイルを圧縮...\"\n02000111=\"圧縮して電子メール送信...\"\n02000112=\"選択したファイルを圧縮して電子メール送信...\"\n02000113=\"{0} に圧縮して電子メール送信\"\n02000114=\"選択したファイルを圧縮して電子メール送信...\"\n\n02000140=\"<フォルダ>\"\n02000141=\"<書庫>\"\n\n; Properties\n02000203=\"パス\"\n02000204=\"名前\"\n02000205=\"拡張子\"\n02000206=\"フォルダ\"\n02000207=\"サイズ\"\n02000208=\"圧縮後サイズ\"\n02000209=\"属性\"\n0200020A=\"作成日時\"\n0200020B=\"アクセス日時\"\n0200020C=\"更新日時\"\n0200020D=\"ソリッド\"\n0200020E=\"コメント済み\"\n0200020F=\"暗号化\"\n02000210=\"分割前\"\n02000211=\"分割後\"\n02000212=\"辞書\"\n02000213=\"CRC\"\n02000214=\"種類\"\n02000215=\"逆\"\n02000216=\"圧縮方法\"\n02000217=\"ホストOS\"\n02000218=\"ファイルシステム\"\n02000219=\"ユーザー\"\n0200021A=\"グループ\"\n0200021B=\"ブロック\"\n0200021C=\"コメント\"\n0200021D=\"ポジション\"\n0200021E=\"パスプレフィックス\"\n0200021F=\"フォルダ数\"\n02000220=\"ファイル数\"\n02000221=\"バージョン\"\n02000222=\"ボリューム\"\n02000223=\"多重ボリューム書庫\"\n02000224=\"オフセット\"\n02000225=\"リンク数\"\n02000226=\"使用ブロック数\"\n02000227=\"ボリューム数\"\n\n02000229=\"64ビット\"\n0200022A=\"ビッグエンディアン\"\n0200022B=\"CPU\"\n0200022C=\"物理サイズ\"\n0200022D=\"ヘッダーサイズ\"\n0200022E=\"チェックサム\"\n0200022F=\"特性\"\n02000230=\"仮想アドレス\"\n\n; Status bar\n02000301=\"{0} 個のオブジェクト選択\"\n02000302=\"{0} 個のオブジェクト\"\n\n02000320=\"ファイル数：\"\n02000321=\"フォルダ数：\"\n02000322=\"サイズ：\"\n02000323=\"圧縮済みサイズ：\"\n02000324=\"書庫数：\"\n\n; List Context Menu\n02000401=\"項目(&C)\"\n\n02000411=\"開く(&O)\"\n02000412=\"解凍(&E)\"\n\n; ToolBar\n02000501=\"解凍\"\n\n; Messages\n02000601=\"この書庫は更新機能がサポートされていません\"\n02000602=\"{0} 書庫が更新出来ません\"\n02000603=\"\\\"{0}\\\"フォルダが作成出来ません\"\n02000604=\"対応してない圧縮形式です\"\n02000605=\"エラー\"\n02000606=\"アイテムが多過ぎます\"\n02000607=\"与えられたファイルに関連付けられたアプリケーションはありません\"\n02000608=\"正常です\"\n02000609=\"ファイル\\\"{0}\\\"は書庫として開くことが出来ません\"\n0200060A=\"暗号化された書庫\\\"{0}\\\"を開くことが出来ません。パスワードが間違っていませんか？\"\n0200060B=\"メモリを割り当て出来ません\"\n0200060C=\"不明なエラー\"\n0200060D=\"書庫形式が未対応です\"\n\n; Dialogs\n02000702=\"OK(&O)\"\n02000705=\"はい(&Y)\"\n02000707=\"全てに はい(&A)\"\n02000709=\"いいえ(&N)\"\n0200070B=\"全てに いいえ(&L)\"\n\n02000710=\"キャンセル(&C)\"\n02000711=\"キャンセル(&C)\"\n02000713=\"閉じる(&C)\"\n02000714=\"停止(&S)\"\n02000715=\"再開(&R)\"\n\n02000720=\"ヘルプ\"\n\n; Extract dialog\n02000800=\"解凍(&E)\"\n02000801=\"解凍先(&X)：\"\n02000802=\"パスワード(&W)\"\n\n02000810=\"パス名出力方法\"\n02000811=\"絶対パス(&F)\"\n02000812=\"相対パス(&C)\"\n02000813=\"パス無し(&N)\"\n\n02000820=\"上書き方法\"\n02000821=\"上書きするときは確認する(&B)\"\n02000822=\"常に上書き(&O)\"\n02000823=\"ファイルが存在するときはスキップ(&E)\"\n02000824=\"自動的にリネーム(&U)\"\n02000825=\"ファイルが存在するときは自動リネーム(&T)\"\n\n02000830=\"ファイル\"\n02000831=\"選択したファイル(&S)\"\n02000832=\"全てのファイル(&A)\"\n\n02000881=\"解凍先指定\"\n\n02000890=\"解凍中\"\n\n; Overwrite dialog\n02000900=\"ファイル上書き確認\"\n02000901=\"このフォルダには既に以下の同じファイルが存在します\"\n02000902=\"現在のファイル\"\n02000903=\"に次の新しいファイルを上書きしますか？\"\n\n02000911=\"自動的にリネーム(&U)\"\n\n02000982=\"{0} バイト\"\n02000983=\"更新日時：\"\n\n; Messages dialog\n02000A00=\"診断結果\"\n\n02000A80=\"メッセージ\"\n\n02000A91=\"\\\"{0}\\\"はサポートされていない圧縮形式です\"\n02000A92=\"\\\"{0}\\\"でデータエラーが発生しました。ファイルは壊れています\"\n02000A93=\"\\\"{0}\\\"のCRCが違います。 ファイルは壊れています\"\n02000A94=\"暗号化されたファイル\\\"{0}\\\"でデータエラーが発生しました。パスワードが間違っていませんか？\"\n02000A95=\"暗号化されたファイル\\\"{0}\\\"のCRCが違います。パスワードが間違っていませんか？\"\n\n; Password dialog\n02000B00=\"パスワード入力\"\n02000B01=\"パスワード入力(&W)：\"\n02000B02=\"パスワードを表示する(&H)\"\n02000B03=\"パスワード再入力 ：\"\n02000B10=\"パスワードが一致しません\"\n02000B11=\"パスワードには半角英数記号(!, #, $, ...)のみを使用して下さい。\"\n02000B12=\"パスワードがあまりに長過ぎます。\"\n\n; Progress dialog\n02000C00=\"処理\"\n02000C01=\"経過時間：\"\n02000C02=\"残り時間：\"\n02000C03=\"サイズ：\"\n02000C04=\"速度：\"\n02000C05=\"処理済み：\"\n02000C06=\"圧縮率：\"\n\n02000C10=\"バックグラウンド(&B)\"\n02000C11=\"フォアグラウンド(&F)\"\n02000C12=\"一時停止(&P)\"\n02000C13=\"続行(&C)\"\n\n02000C20=\"一時停止\"\n\n02000C30=\"本当に圧縮を取りやめますか?\"\n\n; Compress dialog\n02000D00=\"ファイル圧縮\"\n02000D01=\"圧縮先(&A)：\"\n02000D02=\"更新方法(&U)：\"\n02000D03=\"書庫形式(&F)：\"\n02000D04=\"圧縮メソッド(&M)：\"\n02000D05=\"ソリッド書庫作成(&S)\"\n02000D06=\"パラメータ(&P)：\"\n02000D07=\"オプション\"\n02000D08=\"自己解凍書庫作成(&X)\"\n02000D09=\"マルチスレッド利用(&L)\"\n02000D0A=\"ファイル名を暗号化(&N)\"\n02000D0B=\"圧縮レベル(&L)：\"\n02000D0C=\"辞書サイズ(&D)：\"\n02000D0D=\"ワードサイズ(&W)：\"\n02000D0E=\"圧縮に必要なメモリ：\"\n02000D0F=\"解凍に必要なメモリ：\"\n02000D10=\"暗号化\"\n02000D11=\"暗号化メソッド：\"\n02000D12=\"CPUスレッド数：\"\n02000D13=\"ソリッドブロックサイズ：\"\n02000D14=\"ソリッドなし\"\n02000D15=\"無制限\"\n02000D16=\"共有されたファイル圧縮\"\n\n02000D40=\"書庫を分割(&V)：\"\n02000D41=\"不正なボリュームサイズ\"\n02000D42=\"選択されたボリュームサイズ ： {0} バイトです。\\n書庫をこのサイズに分割しますか？\"\n\n02000D81=\"無圧縮\"\n02000D82=\"標準\"\n02000D83=\"最高\"\n02000D84=\"高速\"\n02000D85=\"最速\"\n02000D86=\"超圧縮\"\n\n02000D90=\"閲覧\"\n\n02000DA1=\"全てのファイル上書き\"\n02000DA2=\"ファイル追加と更新\"\n02000DA3=\"変更したファイルのみ更新\"\n02000DA4=\"ファイルを同期させる\"\n\n02000DB1=\"全てのファイル\"\n\n02000DC0=\"圧縮\"\n\n; Columns dialog\n02000E00=\"項目\"\n02000E01=\"表示したい項目をチェックしてください。表示したい項目の順番を変えるには移動ボタンで変えます\"\n02000E02=\"選択した項目の表示幅を設定します\"\n02000E03=\"ピクセル幅(&W)\"\n\n02000E10=\"上に移動(&U)\"\n02000E11=\"下に移動(&D)\"\n02000E12=\"表示(&S)\"\n02000E13=\"隠す(&H)\"\n02000E14=\"設定(&S)\"\n\n02000E81=\"タイトル\"\n02000E82=\"幅\"\n\n; Testing\n02000F90=\"テスト中\"\n\n\n; File Manager\n\n03000000=\"7-Zipファイルマネージャ\"\n\n; Menu\n03000102=\"ファイル(&F)\"\n03000103=\"編集(&E)\"\n03000104=\"表示(&V)\"\n03000105=\"ツール(&T)\"\n03000106=\"ヘルプ(&H)\"\n03000107=\"お気に入り(&A)\"\n\n; File\n03000210=\"開く(&O)\"\n03000211=\"開くインサイド(&I)\"\n03000212=\"開くアウトサイド(&U)\"\n03000220=\"表示(&V)\"\n03000221=\"編集(&E)\"\n03000230=\"名前の変更(&M)\"\n03000231=\"コピー(&C)...\"\n03000232=\"移動(&M)...\"\n03000233=\"削除(&D)\"\n03000240=\"プロパティ(&R)\"\n03000241=\"コメント(&N)\"\n03000242=\"チェックサムの計算\"\n03000250=\"フォルダ作成(&F)\"\n03000251=\"ファイル作成(&L)\"\n03000260=\"閉じる(&X)\"\n03000270=\"ファイル分割(&S)...\"\n03000271=\"ファイル結合(&B)...\"\n\n; Edit\n03000310=\"元に戻す(&U)\"\n03000311=\"やり直す(&R)\"\n03000320=\"切り取り(&T)\"\n03000321=\"コピー(&C)\"\n03000322=\"貼り付け(&P)\"\n03000323=\"削除(&D)\"\n03000330=\"全て選択(&A)\"\n03000331=\"全て選択解除(&L)\"\n03000332=\"選択切り替え(&I)\"\n03000333=\"選択(&S)...\"\n03000334=\"選択解除(&E)...\"\n03000335=\"同一形式選択(&T)\"\n03000336=\"同一形式選択解除(&Y)\"\n\n; View\n03000410=\"大きいアイコン(&G)\"\n03000411=\"小さいアイコン(&M)\"\n03000412=\"一覧(&L)\"\n03000413=\"詳細(&D)\"\n03000420=\"アンソート(&N)\"\n03000430=\"ルートフォルダを開く(&O)\"\n03000431=\"一つ上の階層へ(&U)\"\n03000432=\"フォルダ履歴(&H)...\"\n03000440=\"リフレッシュ(&R)\"\n03000449=\"フラットビュー\"\n03000450=\"&2分割画面\"\n03000451=\"ツールバー(&T)\"\n03000460=\"書庫ツールバー(&A)\"\n03000461=\"標準ツールバー(&S)\"\n03000462=\"大きなボタン(&L)\"\n03000463=\"テキスト表示(&T)\"\n\n; Tools\n03000510=\"オプション(&O)...\"\n03000511=\"ベンチマーク(&B)\"\n\n; Help\n03000610=\"ヘルプ内容(&C)...\"\n03000620=\"7-Zipについて(&A)...\"\n\n; Favorites\n03000710=\"フォルダをお気に入りに追加(&A)\"\n03000720=\"ブックマーク\"\n\n; Options Dialog\n\n03010000=\"オプション\"\n\n; Plugins\n03010100=\"プラグイン\"\n03010101=\"プラグイン(&P)：\"\n03010110=\"オプション...\"\n\n; Edit\n03010200=\"エディタ\"\n03010201=\"エディタ(&E)：\"\n\n; System\n03010300=\"システム\"\n03010302=\"7-Zipに関連付けるファイル：\"\n03010310=\"プラグイン\"\n\n; Settings\n03010400=\"設定\"\n03010401=\"\\\"..\\\"を表示する\"\n03010402=\"本来アイコンを表示する\"\n03010410=\"エクスプローラのメニューを表示する\"\n03010420=\"どの列をクリックしても選択出来るようにする(&F)\"\n03010421=\"グリッド線を表示する(&G)\"\n03010430=\"代替選択モード(&A)\"\n03010440=\"多量メモリページを使用する(&L)\"\n\n; Strings\n\n03020201=\"コピー\"\n03020202=\"移動\"\n03020203=\"フォルダへコピー：\"\n03020204=\"フォルダへ移動：\"\n03020205=\"コピーしています...\"\n03020206=\"移動しています...\"\n03020207=\"そのフォルダにはコピー＆移動が出来ません。\"\n03020208=\"その操作はサポートされていません。\"\n03020209=\"対象のフォルダ選択\"\n\n03020210=\"ファイル削除の確認\"\n03020211=\"フォルダ削除の確認\"\n03020212=\"複数ファイル削除の確認\"\n03020213=\"\\\"{0}\\\"を本当に削除しますか？\"\n03020214=\"フォルダ\\\"{0}\\\"とフォルダ内の全てのファイルを削除しますか？\"\n03020215=\"これらの{0}個の項目を本当に削除しますか？\"\n03020216=\"削除中...\"\n03020217=\"ファイル又はフォルダ削除エラー\"\n03020218=\"ファイルのパスが長すぎる為、ファイルをごみ箱に移動出来ません\"\n\n03020220=\"リネームしています...\"\n03020221=\"ファイル又はフォルダ名前変更エラー\"\n03020222=\"ファイルコピー確認\"\n03020223=\"本当にファイルを書庫に追加しますか？\"\n\n03020230=\"フォルダ作成\"\n03020231=\"フォルダ名：\"\n03020232=\"新しいフォルダ\"\n03020233=\"フォルダ作成エラー\"\n\n03020240=\"ファイル作成\"\n03020241=\"ファイル名：\"\n03020242=\"新しいファイル\"\n03020243=\"ファイル作成エラー\"\n\n03020250=\"選択\"\n03020251=\"選択解除\"\n03020252=\"マスク：\"\n\n03020260=\"フォルダ履歴\"\n\n03020280=\"ファイル\\\"{0}\\\"の内容は変更されています。\\n書庫を更新しますか？\"\n03020281=\"ファイル\\\"{0}\\\"の更新出来ません。\"\n03020282=\"エディタ起動出来ません。\"\n03020283=\"開いています...\"\n03020284=\"ファイル名は大量のスペースを含んでいる為、ウイルスのようなファイルです。\"\n\n03020290=\"コメント\"\n03020291=\"コメント(&C)：\"\n\n030202A0=\"システム\"\n\n03020300=\"コンピュータ\"\n03020301=\"ネットワーク\"\n03020302=\"ドキュメント\"\n\n03020400=\"追加\"\n03020401=\"解凍\"\n03020402=\"テスト\"\n\n03020420=\"コピー\"\n03020421=\"移動\"\n03020422=\"削除\"\n03020423=\"情報\"\n\n03020500=\"ファイル分割\"\n03020501=\"分割先(&S)：\"\n03020510=\"分割中...\"\n03020520=\"分割確認\"\n03020521=\"{0} 個にファイルを分割してもよろしいですか？\"\n03020522=\"分割後のサイズは元のファイルサイズより小さいサイズを指定して下さい。\"\n\n03020600=\"ファイル結合\"\n03020601=\"結合先(&C)：\"\n03020610=\"結合中...\"\n03020620=\"先頭のファイルだけ選択して下さい\"\n03020621=\"分割されているファイルの部分として一部を検出する事が出来ません\"\n03020622=\"分割されているファイルの一部しか見つかりません\"\n\n03020710=\"チェックサム計算中...\"\n03020720=\"チェックサム情報\"\n03020721=\"データのCRC チェックサム：\"\n03020722=\"データと名前のCRC チェックサム：\"\n\n03020800=\"スキャン中...\"\n\n03020900=\"プロパティ\"\n\n03020A01=\"現行フォルダのパスが長すぎる為、コマンド実行出来ません。\"\n03020A02=\"一つのファイルを選択して下さい\"\n03020A03=\"一つ以上のファイルを選択して下さい\"\n03020A04=\"\\\"{0}\\\"のファイルは既に存在します\"\n\n; Computer\n03031100=\"トータルサイズ\"\n03031101=\"空き領域\"\n03031102=\"クラスタサイズ\"\n03031103=\"ラベル\"\n\n; Network\n03031200=\"ローカル名\"\n03031201=\"プロバイダ\"\n\n; Benchmark Dialog\n\n03080000=\"ベンチマーク\"\n03080001=\"必要メモリ：\"\n03080002=\"圧縮中\"\n03080003=\"解凍中\"\n03080004=\"スピード\"\n03080005=\"評価\"\n03080006=\"総合評価\"\n03080007=\"現在\"\n03080008=\"結果\"\n03080009=\"テスト回数：\"\n0308000A=\"エラー：\"\n0308000B=\"CPU使用率\"\n0308000C=\"評価 / 使用率\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ka.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.07 beta\n; Translated by Dimitri Gogelia\n;\n;\n;\n;\n\n00000000=\"Georgian\"\n00000001=\"ქართული\"\n00000002=\"55\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip-ის კონფიგურირება \"\n\n; Info Page\n01000100=\"7-Zip-ის შესახებ\"\n01000103=\"7-Zip თავისუფალად გავრცელებადი პროგრამული უზრუნველყოფაა. თუ გსურთ, რომ მხარი დაუჭიროთ 7-Zip-ის შექმნას, შეგიძლიათ დაარეგისტრიროთ პროგრამა. როგორც რეგისტრირებულ მომხმარებელს, თქვენ გექნებათ ტექნიკური მხარდაჭერა.\"\n01000105=\"რეგისტრაცია\"\n\n; Folders Page\n01000200=\"საქაღალდეები\"\n01000210=\"მუშა საქაღალდე\"\n01000211=\"სისტემური დროებითი საქაღალდე\"\n01000212=\"მიმდინარე\"\n01000213=\"ამორჩევა:\"\n01000214=\"გამოიყენება მხოლოდ ცვლადი მატარებლებისათვის\"\n\n01000281=\"მიუთითეთ ადგილმდებარეობა დროებითი არქივებისათვის.\"\n\n; System Page\n01000300=\"სისტემა\"\n01000301=\"7-Zip-ის გარსის კონტექსტურ მენიუში ჩადგმა\"\n01000302=\"კასკადური კონტექსტური მენიუ\"\n01000310=\"კონტექსტური მენიუს ელემენტები:\"\n\n; Language Page\n01000400=\"ენა\"\n01000401=\"ენა:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip-ის ბრძანებები\"\n02000103=\"არქივის გახსნა\"\n02000104=\"მონიშნული არქივის გახსნა.\"\n02000105=\"გახსნა...\"\n02000106=\"ფაილების გახსნა მონიშნული არქივიდან.\"\n02000107=\"არქივში დამატება...\"\n02000108=\"მონიშნული ობიექტების არქივში დამატება.\"\n02000109=\"ტესტირება\"\n0200010A=\"მონიშნული არქივის ტესტირება.\"\n0200010B=\"გახსნა აქ\"\n0200010C=\"ფაილების გახსნა მონიშნული არქივიდან მიმდინარე საქაღალდეში.\"\n0200010D=\"გახსნა {0}-ში\"\n0200010E=\"ფაილების გახსნა ქვე-საქაღალდეში.\"\n0200010F=\"{0}-ში დამატება\"\n02000110=\"მონიშნული ობიექტების არქივში დამატება.\"\n02000111=\"შეიკუმშოს და გაიგზავნოს ელ-ფოსტით...\"\n02000112=\"შეიკუმშოს მონიშნული ობიექტები არქივში და გაიგზავნოს ელ-ფოსტით.\"\n02000113=\"შეიკუმშოს {0} და გაიგზავნოს ელ-ფოსტით\"\n02000114=\"შეიკუმშოს მონიშნული ობიექტები არქივში და გაიგზავნოს ელ-ფოსტით.\"\n\n02000140=\"<საქაღალდე>\"\n02000141=\"<არქივი>\"\n\n; Properties\n02000203=\"გზა\"\n02000204=\"სახელი\"\n02000205=\"გაფართოება\"\n02000206=\"საქაღალდე\"\n02000207=\"ზომა\"\n02000208=\"შეკუმშულის ზომა\"\n02000209=\"ატრიბუტები\"\n0200020A=\"შექმნილია\"\n0200020B=\"გახსნილია\"\n0200020C=\"მოდიფიცირებულია\"\n0200020D=\"უწყვეტი\"\n0200020E=\"კომენტარი\"\n0200020F=\"დაშიფრულია\"\n02000210=\"Split Before\"\n02000211=\"Split After\"\n02000212=\"ლექსიკონი\"\n02000213=\"CRC\"\n02000214=\"ტიპი\"\n02000215=\"ანტი\"\n02000216=\"მეთოდი\"\n02000217=\"სისტემა\"\n02000218=\"ფაილური სისტემა\"\n02000219=\"მომხმარებელი\"\n0200021A=\"ჯგუფი\"\n0200021B=\"ბლოკი\"\n0200021C=\"კომენტარი\"\n0200021D=\"პოზიცია\"\n\n; Status bar\n02000301=\"მონიშნულია {0} ობიექტი\"\n02000302=\"{0} ობიექტი\"\n\n; List Context Menu\n02000401=\"სვეტები...\"\n\n02000411=\"გახსნა\"\n02000412=\"ამოღება...\"\n\n; ToolBar\n02000501=\"ამოღება\"\n\n; Messages\n02000601=\"ამ ტიპის არქივისათვის ცვლილების ოპერაცია ხელმიუწვდომელია.\"\n02000602=\"ვერ შევცვალე არქივი {0}\"\n02000603=\"ვერ შევქმენი საქაღალდე '{0}'\"\n02000604=\"ფაილი არ წარმოადგენს არქივს.\"\n02000605=\"შეცდომა\"\n02000606=\"ძალზე ბევრი ელემენტი\"\n02000607=\"ასეთი ტიპის ფაილის გაფართოებასთან არ არის ასოცირებული არცერთი პროგრამა\"\n02000608=\"შეცდომები არ არის ნაპოვნი\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"დიახ\"\n02000707=\"დიახ ყველასათვის\"\n02000709=\"არა\"\n0200070B=\"არა ყველასათვის\"\n\n02000710=\"გაუქმება\"\n02000711=\"გაუქმება\"\n02000713=\"დახურვა\"\n02000714=\"სტოპ\"\n02000715=\"გადატვირთვა\"\n\n02000720=\"ცნობარი\"\n\n; Extract dialog\n02000800=\"ამოღება\"\n02000801=\"ამოღება:\"\n02000802=\"პაროლი\"\n\n02000810=\"გზა\"\n02000811=\"სრული გზა\"\n02000812=\"შეფარდებითი გზა\"\n02000813=\"გზის გარეშე\"\n\n02000820=\"თავზე გადაწერის მეთოდი\"\n02000821=\"თავზე გადაწერა თანხმობით\"\n02000822=\"თავზე გადაწერა თანხმობის გარეშე\"\n02000823=\"გამოტოვება\"\n02000824=\"ავტონ. გადარქმევა\"\n02000825=\"გახსნილი ფაილების ავტონ. გადარქმევა\"\n\n02000830=\"ფაილები\"\n02000831=\"მონიშნული ფაილები\"\n02000832=\"ყველა ფაილი\"\n\n02000881=\"მიუთითეთ ადგილი ამოსაღები ფაილებისათვის.\"\n\n02000890=\"ამოღება\"\n\n; Overwrite dialog\n02000900=\"ფაილის შეცვლის დასტური\"\n02000901=\"საქაღალდე უკვე შეიცავს დამუშავებად ფაილს.\"\n02000902=\"შეიცვალოს მიმდინარე ფაილი\"\n02000903=\"შემდეგი ფაილით?\"\n\n02000911=\"ავტონ. გადარქმევა\"\n\n02000982=\"{0} ბაიტი\"\n02000983=\"შეცვლილია\"\n\n; Messages dialog\n02000A00=\"დიაგნოსტიკური შეტყობინება\"\n\n02000A80=\"შეტყობინება\"\n\n02000A91=\"შეკუმშვის შეუთავსებადი მეთოდი '{0}'-თვის.\"\n02000A92=\"მონაცემების შეცდომა '{0}'-ში. ფაილი დაზიანებულია.\"\n02000A93=\"CRC-ის შეცდომა '{0}'-ში. ფაილი დაზიანებულია.\"\n\n; Password dialog\n02000B00=\"პაროლის შეტანა\"\n02000B01=\"შეიყვანეთ პაროლი:\"\n02000B02=\"პაროლის ჩვენება\"\n\n; Progress dialog\n02000C00=\"პროცესი\"\n02000C01=\"გასული დრო:\"\n02000C02=\"დარჩენილი დრო:\"\n02000C03=\"ზომა:\"\n02000C04=\"სიჩქარე:\"\n\n02000C10=\"ფონურად\"\n02000C11=\"წინა პლანზე\"\n02000C12=\"პაუზა\"\n02000C13=\"გაგრძელება\"\n\n02000C20=\"დაპაუზებულია\"\n\n02000C30=\"დარწმუნებული ხართ, რომ გინდათ შეწყვიტოთ ოპერაცია?\"\n\n; Compress dialog\n02000D00=\"არქივში დამატება\"\n02000D01=\"არქივი:\"\n02000D02=\"განახლების რეჟიმი:\"\n02000D03=\"არქივის ფორმატი:\"\n02000D04=\"შეკუმშვის მეთოდი:\"\n02000D05=\"შეიქმნას უწყვეტი არქივი\"\n02000D06=\"პარამეტრები:\"\n02000D07=\"ოფციები\"\n02000D08=\"შეიქმნას SFX-არქივი\"\n02000D09=\"მრავალნაკადიანი\"\n02000D0A=\"ფაილების სახელების დაშიფვრა\"\n02000D0B=\"შეკუმშვის დონე:\"\n02000D0C=\"ლექსიკონის ზომა:\"\n02000D0D=\"სიტყვის ზომა:\"\n02000D0E=\"მეხსიერების ზომა შეკუმშვისათვის:\"\n02000D0F=\"მეხსიერების ზომა გახსნისათვის:\"\n\n02000D40=\"დაიყოს ტომებად:\"\n\n02000D81=\"შეკუმშვის გარეშე\"\n02000D82=\"ნორმალური\"\n02000D83=\"მაქსიმუმი\"\n02000D84=\"სწრაფი\"\n02000D85=\"უსწრაფესი\"\n02000D86=\"ულტრა\"\n\n02000D90=\"ნახვა\"\n\n02000DA1=\"დამატება და შეცვლა\"\n02000DA2=\"განახლება და დამატება\"\n02000DA3=\"განახლება\"\n02000DA4=\"ფაილების სინქრონიზაცია\"\n\n02000DB1=\"ყველა ფაილი\"\n\n02000DC0=\"შეკუმშვა\"\n\n; Columns dialog\n02000E00=\"სვეტები\"\n02000E01=\"მონიშნეთ სვეტები, რომლებიც უნდა გამოჩნდეს ამ საქაღალდეში. ღილაკებით ”ზევით” და ”ქვევით” შეიძლება დაყენდეს სვეტების მსველობის თანმიმდევრობა.\"\n02000E02=\"მონიშნული სვეტების სიგანე უნდა იყოს\"\n02000E03=\"წერტილი.\"\n\n02000E10=\"ზევით\"\n02000E11=\"ქვევით\"\n02000E12=\"ჩვენება\"\n02000E13=\"დამალვა\"\n02000E14=\"დაყენება\"\n\n02000E81=\"სახელი\"\n02000E82=\"სიგანე\"\n\n; Testing\n02000F90=\"ტესტირება\"\n\n\n; File Manager\n\n03000000=\"7-Zip ფაილების მმართველი\"\n\n; Menu\n03000102=\"ფაილი\"\n03000103=\"რედაქტირება\"\n03000104=\"ნახვა\"\n03000105=\"სერვისი\"\n03000106=\"ცნობარი\"\n03000107=\"სანიშნეები\"\n\n; File\n03000210=\"გახსნა\"\n03000211=\"გაიხსნას შიგნით\"\n03000212=\"გაიხსნას გარეთ\"\n03000220=\"დათვალიერება\"\n03000221=\"რედაქტირება\"\n03000230=\"სახელის გადარქმევა\"\n03000231=\"ასლი...\"\n03000232=\"გადატანა...\"\n03000233=\"წაშლა\"\n03000240=\"თვისებები\"\n03000241=\"კომენტარი\"\n03000250=\"საქაღალდის შექმნა\"\n03000251=\"ფაილის შექმნა\"\n03000260=\"გამოსვლა\"\n03000270=\"ფაილის დაშლა...\"\n03000271=\"ფაილების გაერთიანება...\"\n\n; Edit\n03000310=\"გაუქმება\"\n03000311=\"აღდგენა\"\n03000320=\"ამოჭრა\"\n03000321=\"ასლი\"\n03000322=\"ჩასმა\"\n03000323=\"წაშლა\"\n03000330=\"სრული მონიშვნა\"\n03000331=\"მონიშვნის გაუქმება\"\n03000332=\"მონიშვნის უკუცვლა\"\n03000333=\"მოინიშნოს...\"\n03000334=\"მოიხსნას მონიშვნა...\"\n03000335=\"მოინიშნოს ტიპის მიხედვით\"\n03000336=\"მონიშვნის მოხსნა ტიპის მიხედვით\"\n\n; View\n03000410=\"მსხვილი პიქტოგრამები\"\n03000411=\"პატარა პიქტოგრამები\"\n03000412=\"სია\"\n03000413=\"ცხრილი\"\n03000420=\"არასორტირებული\"\n03000430=\"ძირეული საქაღალდის გახსნა\"\n03000431=\"ერთი დონით ზევით\"\n03000432=\"საქაღალდეების ისტორია...\"\n03000440=\"განახლება\"\n03000450=\"2 პანელი\"\n03000451=\"ინსტრუმენტების პანელი\"\n03000460=\"არქივირების პანელი\"\n03000461=\"ძირითადი პანელი\"\n03000462=\"მსხვილი პანელები\"\n03000463=\"წარწერები ღილაკებზე\"\n\n; Tools\n03000510=\"აწყობა...\"\n03000511=\"წარმადობის ტესტირება\"\n\n; Help\n03000610=\"თავფურცელი...\"\n03000620=\"7-Zip-ის შესახებ...\"\n\n; Favorites\n03000710=\"დაემატოს საქაღალდე სანიშნეებში როგორც\"\n03000720=\"სანიშნე\"\n\n; Options Dialog\n\n03010000=\"აწყობა\"\n\n; Plugins\n03010100=\"ჩადგმები\"\n03010101=\"ჩადგმები:\"\n03010110=\"თვისებები...\"\n\n; Edit\n03010200=\"რედაქტორი\"\n03010201=\"რედაქტორი:\"\n\n; System\n03010300=\"სისტემა\"\n03010302=\"ასოციაცია 7-Zip-თან:\"\n03010310=\"ჩადგმა\"\n\n; Settings\n03010400=\"აწყობა\"\n03010401=\"\\\"..\\\" ელემენტის ჩვენება\"\n03010402=\"ფაილების რეალური პიქტოგრამების ჩვენება\"\n03010410=\"სისტემური მენიუს ჩვენება\"\n03010420=\"კურსორი მთელ სტრიქონზე\"\n03010421=\"გამყოფის ჩვენება\"\n\n; Strings\n\n03020201=\"ასლის აღება\"\n03020202=\"გადატანა\"\n03020203=\"ასლი:\"\n03020204=\"გადატანა:\"\n03020205=\"ასლის აღება...\"\n03020206=\"გადატანა...\"\n03020207=\"ამ საქაღალდეებისათვის ობიექტების ასლირება დაუშვებელია.\"\n03020208=\"ოპერაცია არ ხორციელდება.\"\n\n03020210=\"ფაილის წაშლის თანხმობა\"\n03020211=\"საქაღალდის წაშლის თანხმობა\"\n03020212=\"რამდენიმე ფაილის წაშლის თანხმობა\"\n03020213=\"დარწმუნებული ხართ, რომ გინდათ წაშალოთ '{0}'?\"\n03020214=\"დარწმუნებული ხართ, რომ გინდათ წაშალოთ '{0}' საქაღალდე და მთელი მისი შიგთავსი?\"\n03020215=\"დარწმუნებული ხართ, რომ გინდათ წაშალოთ {0} ელემენტები?\"\n03020216=\"იშლება...\"\n03020217=\"ფაილის ან საქაღალდის წაშლის შეცდომა\"\n\n03020220=\"გადარქმევა...\"\n03020221=\"ფაილის ან საქაღალდის გადარქმევის შეცდომა\"\n\n03020230=\"საქაღალდის შექმნა\"\n03020231=\"საქაღალდის სახელი:\"\n03020232=\"ახალი საქაღალდე\"\n03020233=\"შეცდომა საქაღალდის შექმნისას\"\n\n03020240=\"ფაილის შექმნა\"\n03020241=\"ფაილის სახელი:\"\n03020242=\"ახალი ფაილი\"\n03020243=\"ფაილის შექმნის შეცდომა\"\n\n03020250=\"მონიშვნა\"\n03020251=\"მონიშვნის გაუქმება\"\n03020252=\"ნიღაბი:\"\n\n03020260=\"საქაღალდეების ისტორია\"\n\n03020280=\"ფაილი '{0}' შეიცვალა.\\nგნებავთ მისი არქივში განახლება?\"\n03020281=\"შეუძლებელია \\n'{0}'-ის განახლება\"\n03020282=\"შეუძლებელია რედაქტორის გაშვება.\"\n03020283=\"იხსნება...\"\n\n03020290=\"კომენტარი\"\n03020291=\"კომენტარი:\"\n\n030202A0=\"სისტემა\"\n\n03020300=\"კომპიუტერი\"\n03020301=\"ქსელი\"\n\n03020400=\"დამატება\"\n03020401=\"ამოღება\"\n03020402=\"ტესტირება\"\n\n03020420=\"ასლი\"\n03020421=\"გადაადგილება\"\n03020422=\"წაშლა\"\n03020423=\"ინფორმაცია\"\n\n03020500=\"ფაილის დაშლა\"\n03020501=\"დაიშალოს:\"\n03020510=\"დაშლა...\"\n\n03020600=\"Combine Files\"\n03020601=\"&Combine to:\"\n03020610=\"Combining...\"\n\n; Computer\n03031100=\"მოცულობა\"\n03031101=\"თავისუფალი სივრცე\"\n03031102=\"კლასტერის ზომა\"\n03031103=\"ჭდე\"\n\n; Network\n03031200=\"ლოკალური სახელი\"\n03031201=\"პროვაიდერი\"\n\n; Benchmark Dialog\n\n03080000=\"წარმადობის ტესტირება\"\n03080001=\"გამოყენებული მეხსიერების ზომა:\"\n03080002=\"შეკუმშვა\"\n03080003=\"გაშლა\"\n03080004=\"სიჩქარე\"\n03080005=\"რეიტინგი\"\n03080006=\"საერთო რეიტინგი\"\n03080007=\"მიმდინარე\"\n03080008=\"შემაჯამებელი\"\n03080009=\"გატარება:\"\n0308000A=\"შეცდომა:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ko.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59b\n; Translated by\n; 4.53~4.59b:   Dong-yoon Han (한동윤)\n; ~4.52 beta:   Hyeong il  Kim(kurt Sawyer)\n; Orignal:      ZannyLim(임재형),\n;\n\n00000000=\"Korean\"\n00000001=\"한국어\"\n00000002=\"18\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip 환경설정\"\n\n; Info Page\n01000100=\"7-Zip 정보\"\n01000103=\"7-Zip 은 무료 소프트웨어입니다. 원하신다면, 등록을 통해 7-Zip 개발을 지원하실 수 있습니다.\"\n01000104=\"기술지원\"\n01000105=\"등록\"\n\n; Folders Page\n01000200=\"폴더\"\n01000210=\"작업 폴더(&W)\"\n01000211=\"시스템 임시 폴더(&S)\"\n01000212=\"현재 폴더(&C)\"\n01000213=\"지정 폴더(&S):\"\n01000214=\"이동식 드라이브에서만 사용\"\n\n01000281=\"압축에 관계된 파일이 임시적으로 사용할 위치 지정.\"\n\n; System Page\n01000300=\"시스템\"\n01000301=\"7-Zip 을 쉘 컨텍스트 메뉴에 통합\"\n01000302=\"계단식 컨텍스트 메뉴\"\n01000310=\"컨텍스트 메뉴 항목:\"\n\n; Language Page\n01000400=\"언어\"\n01000401=\"언어:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip 명령\"\n02000103=\"압축파일 열기\"\n02000104=\"선택한 압축파일을 엽니다.\"\n02000105=\"압축 풀기...\"\n02000106=\"선택한 압축파일의 압축을 풉니다.\"\n02000107=\"압축파일에 추가...\"\n02000108=\"선택한 항목을 압축파일에 추가합니다.\"\n02000109=\"압축파일 테스트\"\n0200010A=\"선택한 압축파일의 무결성을 테스트합니다.\"\n0200010B=\"여기에 압축 풀기\"\n0200010C=\"선택한 압축파일을 현재 폴더에 풉니다.\"\n0200010D=\"{0}에 풀기\"\n0200010E=\"하위 폴더에 파일을 풉니다.\"\n0200010F=\"{0}에 추가\"\n02000110=\"선택한 항목을 압축파일에 추가합니다.\"\n02000111=\"압축해서 이메일 보내기\"\n02000112=\"선택한 항목을 압축파일로 만들어 이메일을 통해 보냅니다.\"\n02000113=\"{0}로 압축해서 이메일 보내기\"\n02000114=\"선택한 항목을 압축파일로 만들어 이메일을 통해 보냅니다.\"\n\n02000140=\"<폴더>\"\n02000141=\"<압축파일>\"\n\n; Properties\n02000203=\"경로\"\n02000204=\"이름\"\n02000205=\"확장자\"\n02000206=\"폴더\"\n02000207=\"크기\"\n02000208=\"압축된 크기\"\n02000209=\"속성\"\n0200020A=\"만든 날짜\"\n0200020B=\"액세스한 날짜\"\n0200020C=\"수정한 날짜\"\n0200020D=\"솔리드\"\n0200020E=\"설명\"\n0200020F=\"암호화\"\n02000210=\"나누기 이전\"\n02000211=\"나누기 후\"\n02000212=\"사전\"\n02000213=\"CRC\"\n02000214=\"형식\"\n02000215=\"안티\"\n02000216=\"압축 방식\"\n02000217=\"생성한 OS\"\n02000218=\"파일 시스템\"\n02000219=\"사용자\"\n0200021A=\"그룹\"\n0200021B=\"블럭\"\n0200021C=\"설명\"\n0200021D=\"위치\"\n0200021E=\"경로 접두\"\n0200021F=\"폴더\"\n02000220=\"파일\"\n02000221=\"버전\"\n02000222=\"볼륨\"\n02000223=\"다중볼륨\"\n02000224=\"오프셋\"\n02000225=\"링크\"\n02000226=\"블록\"\n02000227=\"볼륨\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"물리적 크기\"\n0200022D=\"해더 크기\"\n0200022E=\"체크섬\"\n0200022F=\"특성\"\n02000230=\"가상 주소\"\n\n; Status bar\n02000301=\"{0} 항목이 선택됨\"\n02000302=\"{0} 항목\"\n\n02000320=\"파일:\"\n02000321=\"폴더:\"\n02000322=\"크기:\"\n02000323=\"압축된 크기:\"\n02000324=\"압축파일:\"\n\n; List Context Menu\n02000401=\"열(&C)...\"\n\n02000411=\"열기(&O)\"\n02000412=\"압축 풀기(&E)...\"\n\n; ToolBar\n02000501=\"압축 풀기\"\n\n; Messages\n02000601=\"업데이트 작업이 이 압축파일에서는 지원되지 않습니다.\"\n02000602=\"압축파일 {0}을(를) 업데이트 할 수 없음\"\n02000603=\"'{0}' 폴더를 생성할 수 없음\"\n02000604=\"파일이 지원되지 않는 압축파일 입니다.\"\n02000605=\"오류\"\n02000606=\"항목이 너무 많음\"\n02000607=\"주어진 파일 이름 확장자에 연결된 프로그램이 없음\"\n02000608=\"오류 없음\"\n02000609=\"파일 '{0}'을(를) 압축파일로 열 수 없음\"\n0200060A=\"암호화된 압축파일 '{0}'을(를) 열 수 없습니다. 암호가 틀리나요?\"\n0200060B=\"시스템이 필요한 양의 메모리를 할당할 수 없음\"\n0200060C=\"알 수 없는 오류\"\n0200060D=\"지원되지 않는 압축파일 유형\"\n\n; Dialogs\n02000702=\"확인\"\n02000705=\"예(&Y)\"\n02000707=\"모두 예(&A)\"\n02000709=\"아니오(&N)\"\n0200070B=\"모두 아니오(&L)\"\n\n02000710=\"취소\"\n02000711=\"취소(&C)\"\n02000713=\"닫기(&C)\"\n02000714=\"중지\"\n02000715=\"다시 시작\"\n\n02000720=\"도움말\"\n\n; Extract dialog\n02000800=\"압축 풀기\"\n02000801=\"압축 풀기(&X):\"\n02000802=\"암호\"\n\n02000810=\"경로 모드\"\n02000811=\"전체 경로명\"\n02000812=\"현재 경로명\"\n02000813=\"경로명 없음\"\n\n02000820=\"덮어쓰기 모드\"\n02000821=\"덮어쓰기 전에 물어봄\"\n02000822=\"물어보지 않고 덮어쓰기\"\n02000823=\"존재하는 파일 건너뛰기\"\n02000824=\"자동으로 이름 바꾸기\"\n02000825=\"존재하는 파일 이름 바꾸기\"\n\n02000830=\"파일\"\n02000831=\"선택된 파일(&S)\"\n02000832=\"모든 파일(&A)\"\n\n02000881=\"압축 풀린 파일의 위치를 지정합니다.\"\n\n02000890=\"압축 푸는 중\"\n\n; Overwrite dialog\n02000900=\"파일 교체시 확인\"\n02000901=\"대상 폴더에 이미 파일이 존재합니다.\"\n02000902=\"존재하는 파일을\"\n02000903=\"이것으로 교체하시겠습니까?\"\n\n02000911=\"자동으로 이름 바꾸기(&U)\"\n\n02000982=\"{0} 바이트\"\n02000983=\"수정한 날짜\"\n\n; Messages dialog\n02000A00=\"진단 메시지\"\n\n02000A80=\"메시지\"\n\n02000A91=\"'{0}'은 지원하지 않는 압축 방식입니다.\"\n02000A92=\"'{0}'에 데이터 오류가 있습니다. 파일이 손상되었습니다.\"\n02000A93=\"'{0}'의 CRC 검사를 실패했습니다. 파일이 손상되었습니다.\"\n02000A94=\"암호화 파일 '{0}'에 데이터 오류가 있습니다. 암호가 틀리나요?\"\n02000A95=\"암호화 파일 '{0}'의 CRC 검사를 실패했습니다. 암호가 틀리나요?\"\n\n; Password dialog\n02000B00=\"암호 입력\"\n02000B01=\"암호 입력:\"\n02000B02=\"암호 보여주기(&S)\"\n02000B03=\"암호 다시 입력:\"\n02000B10=\"암호가 일치하지 않음\"\n02000B11=\"암호로는 영문자, 숫자 그리고 특수 문자 (!, #, $, ...)만 사용\"\n02000B12=\"패스워드가 너무 김\"\n\n; Progress dialog\n02000C00=\"처리\"\n02000C01=\"경과 시간:\"\n02000C02=\"남은 시간:\"\n02000C03=\"전체 크기:\"\n02000C04=\"속도:\"\n02000C05=\"처리됨:\"\n02000C06=\"압축 효율:\"\n\n02000C10=\"낮은 순위로(&B)\"\n02000C11=\"우선 순위로(&F)\"\n02000C12=\"일시정지(&P)\"\n02000C13=\"계속(&C)\"\n\n02000C20=\"일시정지 됨\"\n\n02000C30=\"정말로 취소하시겠습니까?\"\n\n; Compress dialog\n02000D00=\"압축파일에 추가\"\n02000D01=\"압축파일(&A):\"\n02000D02=\"업데이트 모드(&U):\"\n02000D03=\"압축파일 형식(&F):\"\n02000D04=\"압축 방식(&M):\"\n02000D05=\"솔리드 압축 파일 만들기(&S)\"\n02000D06=\"매개변수(&P):\"\n02000D07=\"옵션\"\n02000D08=\"자동(SFX) 압축파일 생성(&X)\"\n02000D09=\"다중 스레딩\"\n02000D0A=\"파일 이름 암호화(&N)\"\n02000D0B=\"압축 레벨(&L):\"\n02000D0C=\"사전 크기(&D):\"\n02000D0D=\"단어(word) 크기(&W):\"\n02000D0E=\"압축시 사용 메모리:\"\n02000D0F=\"압축 풀기시 사용 메모리:\"\n02000D10=\"암호화\"\n02000D11=\"암호화 방식:\"\n02000D12=\"CPU 스레드 수:\"\n02000D13=\"솔리드 블록 크기:\"\n02000D14=\"솔리드 사용 않함\"\n02000D15=\"솔리드\"\n02000D16=\"공유하고있는 파일 압축\"\n\n02000D40=\"볼륨 나누기, 바이트(&V):\"\n02000D41=\"볼륨 크기가 부적절합니다.\"\n02000D42=\"지정된 볼륨 크기: {0} 바이트.\\n이 볼륨 크기로 분할 하시겠습니까?\"\n\n02000D81=\"저장\"\n02000D82=\"보통\"\n02000D83=\"최고\"\n02000D84=\"빠름\"\n02000D85=\"가장 빠름\"\n02000D86=\"극한\"\n\n02000D90=\"찾아보기\"\n\n02000DA1=\"파일을 추가하고 교체\"\n02000DA2=\"파일을 업데이트하고 추가\"\n02000DA3=\"존재하는 파일만 새롭게 하기\"\n02000DA4=\"압축파일 내용을 동기화\"\n\n02000DB1=\"모든 파일\"\n\n02000DC0=\"압축하는 중\"\n\n; Columns dialog\n02000E00=\"열\"\n02000E01=\"이 폴더에서 보고 싶은 열을 체크하세요. 열의 순서를 바꾸려면 위로 그리고 아래로 버튼을 사용하세요.\"\n02000E02=\"선택한 열은 반드시 넓이는\"\n02000E03=\"픽셀이 되어야 합니다. (&W)\"\n\n02000E10=\"위로 이동(&U)\"\n02000E11=\"아래로 이동(&D)\"\n02000E12=\"보여주기(&S)\"\n02000E13=\"숨기기(&H)\"\n02000E14=\"설정\"\n\n02000E81=\"제목\"\n02000E82=\"폭\"\n\n; Testing\n02000F90=\"검사 중\"\n\n\n; File Manager\n\n03000000=\"7-Zip 파일 매니저\"\n\n; Menu\n03000102=\"파일(&F)\"\n03000103=\"편집(&E)\"\n03000104=\"보기(&V)\"\n03000105=\"도구(&T)\"\n03000106=\"도움말(&H)\"\n03000107=\"즐겨찾기(&A)\"\n\n; File\n03000210=\"열기(&O)\"\n03000211=\"내부 열기(&I)\"\n03000212=\"외부 열기(&U)\"\n03000220=\"보기(&V)\"\n03000221=\"편집(&E)\"\n03000230=\"새 이름(&M)\"\n03000231=\"복사(&C)...\"\n03000232=\"이동(&M)...\"\n03000233=\"삭제(&D)\"\n03000240=\"속성(&R)\"\n03000241=\"설명(&N)\"\n03000242=\"체크섬 계산\"\n03000250=\"폴더 만들기\"\n03000251=\"파일 만들기\"\n03000260=\"끝내기(&X)\"\n03000270=\"파일 나누기(&S)\"\n03000271=\"파일 합치기(&B)\"\n\n; Edit\n03000310=\"실행 취소(&U)\"\n03000311=\"다시 실행(&R)\"\n03000320=\"잘라내기(&T)\"\n03000321=\"복사(&C)\"\n03000322=\"붙여넣기(&P)\"\n03000323=\"삭제(&D)\"\n03000330=\"모두 선택(&A)\"\n03000331=\"모두 선택 취소\"\n03000332=\"선택 항목 반전(&I)\"\n03000333=\"선택...\"\n03000334=\"선택 취소...\"\n03000335=\"파일 형식으로 선택\"\n03000336=\"파일 형식으로 선택 취소\"\n\n; View\n03000410=\"큰 아이콘(&G)\"\n03000411=\"작은 아이콘(&M)\"\n03000412=\"목록(&L)\"\n03000413=\"자세히(&S)\"\n03000420=\"정렬 안함\"\n03000430=\"최상위 폴더 열기\"\n03000431=\"한단계 위로\"\n03000432=\"폴더 히스토리...\"\n03000440=\"새로 고침(&R)\"\n03000449=\"펼쳐 보기\"\n03000450=\"2 패널(&2)\"\n03000451=\"도구 모음(&T)\"\n03000460=\"압축 도구 모음\"\n03000461=\"표준 도구 모음\"\n03000462=\"큰 버튼\"\n03000463=\"버튼 텍스트 보여주기\"\n\n; Tools\n03000510=\"옵션(&P)...\"\n03000511=\"벤치마크(&B)...\"\n\n; Help\n03000610=\"도움말 항목(&C)...\"\n03000620=\"7-Zip 정보(&A)...\"\n\n; Favorites\n03000710=\"즐겨찾기에 폴더 추가(&A)\"\n03000720=\"북마크\"\n\n; Options Dialog\n\n03010000=\"옵션\"\n\n; Plugins\n03010100=\"플러그인\"\n03010101=\"플러그인(&P):\"\n03010110=\"옵션\"\n\n; Edit\n03010200=\"편집기\"\n03010201=\"편집기(&E):\"\n\n; System\n03010300=\"시스템\"\n03010302=\"7-Zip으로 연결:\"\n03010310=\"플러그 인\"\n\n; Settings\n03010400=\"설정\"\n03010401=\"\\\"..\\\" 항목 보여주기\"\n03010402=\"실재 파일 아이콘 보여주기\"\n03010410=\"시스템 메뉴 보여주기\"\n03010420=\"행 전체 선택(&F)\"\n03010421=\"눈금선 보여주기(&G)\"\n03010430=\"대체 선택 모드\"\n03010440=\"큰 메모리 페이지 사용\"\n\n; Strings\n\n03020201=\"복사\"\n03020202=\"이동\"\n03020203=\"폴더로 복사:\"\n03020204=\"폴더로 이동:\"\n03020205=\"복사 중...\"\n03020206=\"이동 중...\"\n03020207=\"해당 폴더에 항목을 이동 또는 복사할 수 없습니다.\"\n03020208=\"지원되지 않는 작업입니다.\"\n03020209=\"대상 폴더를 선택하세요.\"\n\n03020210=\"파일 삭제 확인\"\n03020211=\"폴더 삭제 확인\"\n03020212=\"여러 파일 지우기 확인\"\n03020213=\"'{0}'을(를) 삭제하시겠습니까?\"\n03020214=\"폴더 '{0}'와 그 모든 내용을 삭제하시겠습니까?\"\n03020215=\"이 {0} 항목들을 삭제하시겠습니까?\"\n03020216=\"삭제 중...\"\n03020217=\"파일 또는 폴더 삭제 실패\"\n03020218=\"시스템이 긴 경로의 파일을 휴지통으로 이동할 수 없음\"\n\n03020220=\"이름 바꾸는 중...\"\n03020221=\"파일 또는 폴더 이름 바꾸기 실패\"\n03020222=\"파일 복사 확인\"\n03020223=\"파일을 압축파일로 복사 하시겠습니까?\"\n\n03020230=\"폴더 만들기\"\n03020231=\"폴더 이름:\"\n03020232=\"새 폴더\"\n03020233=\"폴더 만들기 오류\"\n\n03020240=\"파일 만들기\"\n03020241=\"파일 이름:\"\n03020242=\"새 파일\"\n03020243=\"파일 만들기 오류\"\n\n03020250=\"선택\"\n03020251=\"선택 취소\"\n03020252=\"마스크:\"\n\n03020260=\"폴더 히스토리\"\n\n03020280=\"파일 '{0}'이 수정되었습니다.\\n압축파일에 업데이트 하시겠습니까?\"\n03020281=\"'{0}' 파일을 업데이트 할 수 없습니다.\"\n03020282=\"편집기를 시작할 수 없습니다.\"\n03020283=\"여는 중...\"\n03020284=\"해당 파일이 바이러스 같습니다 (파일 이름에 길다란 공백이 들어있음).\"\n\n03020290=\"설명\"\n03020291=\"설명(&C):\"\n\n030202A0=\"시스템\"\n\n03020300=\"컴퓨터\"\n03020301=\"네트워크\"\n03020302=\"문서\"\n\n03020400=\"추가\"\n03020401=\"압축 풀기\"\n03020402=\"테스트\"\n\n03020420=\"복사\"\n03020421=\"이동\"\n03020422=\"삭제\"\n03020423=\"정보\"\n\n03020500=\"파일 분할하기\"\n03020501=\"분할하기(&S):\"\n03020510=\"분할하는 중...\"\n03020520=\"분할 확인\"\n03020521=\"정말 {0} 볼륨들로 분할 하시겠습니까?\"\n03020522=\"볼륨 크기가 원본 파일보다 작아야만 합니다.\"\n\n03020600=\"파일 합치기\"\n03020601=\"합치기(&B):\"\n03020610=\"파일 합치는 중...\"\n03020620=\"첫번째 파일만 선택하시오\"\n03020621=\"분할한 파일의 한 부분으로 인식할 수 없음\"\n03020622=\"분할 파일의 한 부분 이상을 찾을 수 없음\"\n\n03020710=\"체크섬 계산중...\"\n03020720=\"체크섬 정보\"\n03020721=\"데이터용 CRC 체크섬:\"\n03020722=\"데이터와 이름용 CRC 체크섬:\"\n\n03020800=\"검색 중...\"\n\n03020900=\"속성\"\n\n03020A01=\"긴 경로로된 폴더에서 해당 작업을 호출할 수 없습니다.\"\n03020A02=\"반드시 한 개의 파일을 선택해야함\"\n03020A03=\"반드시 한 개 이상의 파일을 선택해야 함\"\n03020A04=\"{0} 파일은 이미 존재함\"\n\n; Computer\n03031100=\"전체 크기\"\n03031101=\"여유 공간\"\n03031102=\"클러스터 크기\"\n03031103=\"라벨\"\n\n; Network\n03031200=\"로컬 이름\"\n03031201=\"제공자\"\n\n; Benchmark Dialog\n\n03080000=\"벤치마크\"\n03080001=\"메모리 사용량:\"\n03080002=\"압축 중\"\n03080003=\"압축 푸는 중\"\n03080004=\"속도\"\n03080005=\"평가\"\n03080006=\"전체 평가\"\n03080007=\"현재\"\n03080008=\"결과\"\n03080009=\"통과:\"\n0308000A=\"오류:\"\n0308000B=\"CPU 사용량\"\n0308000C=\"평가 / 사용량\"\n\n;!@LangEnd@!\n\n \t  \t \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ku-ckb.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.58\n; Translated by Ara Bakhtiar.\n;\n;\n;\n;\n\n00000000=\"Kurdish - Sorani\"\n00000001=\"كوردی\"\n00000002=\"\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"شێوه‌پێدان\"\n\n; Info Page\n01000100=\"7-Zip ده‌رباره‌ی\"\n01000103=\"7-Zip پڕۆگرامێكی خۆڕایه‌. له‌گه‌ڵ ئه‌وه‌شدا، ئه‌توانی پاڵپشت بیت له‌ په‌ره‌پێدانی 7-Zip.\"\n01000104=\"پاڵپشتی\"\n01000105=\"تۆماركردن\"\n\n; Folders Page\n01000200=\"بوخچه‌كان\"\n01000210=\"بوخچه‌ی &كاركردن\"\n01000211=\"بوخچه‌ی كاتی &سیسته‌م\"\n01000212=\"&ئێستایی\"\n01000213=\"&دیاریكراو:\"\n01000214=\"ته‌نها بۆ ئه‌و درایڤانه‌ به‌كاری بهێنه‌ كه‌ توانای لێكردنه‌وه‌یان هه‌یه‌ (removable)\"\n\n01000281=\"شوێنێك دیاری بكه‌ بۆ په‌ڕگه‌ كاتییه‌كانی ئه‌شیڤ.\"\n\n; System Page\n01000300=\"سیسته‌م\"\n01000301=\"Integrate 7-Zip to shell context menu\"\n01000302=\"Cascaded context menu\"\n01000310=\"Context menu items:\"\n\n; Language Page\n01000400=\"زمان\"\n01000401=\"زمان:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"فرمانه‌كانی 7-Zip\"\n02000103=\"كردنه‌وه‌ی ئه‌شیڤ\"\n02000104=\"ئه‌رشیڤه‌ دیاریكراوه‌كان ئه‌كاته‌وه‌.\"\n02000105=\"ده‌ركێشانی په‌ڕگه‌كان\"\n02000106=\"په‌ڕگه‌كان ده‌رئه‌كێشێت له‌ ئه‌رشیڤه‌ دیاریكراوه‌كه‌دا.\"\n02000107=\"زیادكردن بۆ ئه‌رشیڤ\"\n02000108=\"دیاریكراوه‌كان بۆ ئه‌رشیڤ زیاد بكه‌\"\n02000109=\"تاقیكردنه‌وه‌ی ئه‌رشیڤ\"\n0200010A=\"گشتی ئه‌رشیڤه‌ دیاریكراوه‌كه‌ تاقیده‌كاته‌وه‌.\"\n0200010B=\"لێره‌ ده‌ریبكێشه‌\"\n0200010C=\"په‌ڕگه‌كانی ئه‌رشیڤی دیاریكراو ده‌رده‌كێشێ بۆ بوخچه‌ی ئێستایی.\"\n0200010D=\"ده‌ركێشان بۆ {0}\"\n0200010E=\"په‌ڕگه‌كان ده‌رده‌كێشێ بۆ ژێربوخچه‌.\"\n0200010F=\"زیادكردنی بۆ {0}\"\n02000110=\"دیاریكراوه‌كان زیاد ده‌كات بۆ ئه‌رشیڤ.\"\n02000111=\"په‌ستاندن و په‌یامی ئه‌لیكترۆنی...\"\n02000112=\"په‌ڕگه‌ دیاریكراوه‌كان بپه‌ستێنه‌ بۆ ئه‌رشیڤ و ئه‌رشیڤه‌كه‌ش به‌ په‌یامی ئه‌لیكترۆنی بنێره‌.\"\n02000113=\"بیپه‌ستێنه‌ بۆ {0} و به‌ په‌یامی ئه‌لیكترۆنی بینێره‌\"\n02000114=\"په‌ڕگه‌ دیاریكراوه‌كان بپه‌ستێنه‌ بۆ ئه‌رشیڤ و ئه‌رشیڤه‌كه‌ش به‌ په‌یامی ئه‌لیكترۆنی بنێره‌.\"\n\n02000140=\"<بوخچه‌>\"\n02000141=\"<ئه‌رشیڤ>\"\n\n; Properties\n02000203=\"ڕێڕه‌و\"\n02000204=\"ناو\"\n02000205=\"درێژكراوه‌\"\n02000206=\"بوخچه‌\"\n02000207=\"قه‌باره‌\"\n02000208=\"قه‌باره‌ی پێچراو\"\n02000209=\"تایبه‌تمه‌ندی\"\n0200020A=\"دروستكراوه‌\"\n0200020B=\"Accessed\"\n0200020C=\"ده‌ستكاریكراوه‌\"\n0200020D=\"ڕه‌ق\"\n0200020E=\"لێدوانی له‌سه‌ر دراوه‌\"\n0200020F=\"پارێزراو\"\n02000210=\"له‌تكردن پێش\"\n02000211=\"له‌تكردن پاش\"\n02000212=\"فه‌رهه‌نگ\"\n02000213=\"CRC\"\n02000214=\"جۆر\"\n02000215=\"دژ\"\n02000216=\"ڕێباز\"\n02000217=\"سیسته‌می خانه‌خوێ\"\n02000218=\"سیسته‌می په‌ڕگه‌\"\n02000219=\"به‌كارهێنه‌ر\"\n0200021A=\"گروپ\"\n0200021B=\"بلۆك\"\n0200021C=\"لێدوان\"\n0200021D=\"جێگه‌\"\n0200021E=\"ـی ڕێڕه‌و Prefix\"\n0200021F=\"بوخچه‌كان\"\n02000220=\"په‌ڕگه‌كان\"\n02000221=\"وه‌شان\"\n02000222=\"قه‌باره‌كان\"\n02000223=\"فره‌ قه‌باره‌\"\n02000224=\"Offset\"\n02000225=\"به‌سته‌ره‌كان\"\n02000226=\"بلۆكه‌كان\"\n02000227=\"قه‌باره‌كان\"\n\n; Status bar\n02000301=\"{0} شت دیاریكراوه‌\"\n02000302=\"{0} شت\"\n\n02000320=\"په‌ڕگه‌كان:\"\n02000321=\"بوخچه‌كان:\"\n02000322=\"قه‌باره‌\"\n02000323=\"قه‌باره‌ی په‌ستێنراو:\"\n02000324=\"ئه‌رشیڤه‌كان:\"\n\n; List Context Menu\n02000401=\"&ستوونه‌كان...\"\n\n02000411=\"&كردنه‌وه‌\"\n02000412=\"&ده‌ركێشان...\"\n\n; ToolBar\n02000501=\"ده‌ركێشان\"\n\n; Messages\n02000601=\"كارپێكردنی نوێكاری پاڵپشت نه‌كراوه‌ بۆ ئه‌م ئه‌رشیڤه‌.\"\n02000602=\"ناتوانرێ ئه‌رشیڤی {0} نوێبكرێته‌وه‌\"\n02000603=\"ناتوانرێ بوخچه‌ی '{0}' دروستبكرێت.\"\n02000604=\"په‌ڕگه‌ ئه‌رشیڤێكی پاڵپشتیكراو نییه‌.\"\n02000605=\"هه‌ڵه‌\"\n02000606=\"شتی(item) زۆر هه‌ن\"\n02000607=\"هیچ په‌ڕگه‌یه‌ك نییه‌ په‌یوه‌ست بێت به‌ درێژكراوه‌ی په‌ڕگه‌ی دراوه‌وه‌.\"\n02000608=\"هیچ هه‌ڵه‌یه‌ك نییه‌\"\n02000609=\"ناتوانرێت په‌ڕگه‌ی '{0}' بكرێته‌وه‌ وه‌ك ئه‌رشیڤ.\"\n0200060A=\"ناتوانرێت ئه‌رشیڤی پارێزراوی '{0}' بكرێته‌وه‌. ئایا تێپه‌ڕه‌وشه‌ هه‌ڵه‌یه‌؟\"\n\n; Dialogs\n02000702=\"باشه‌\"\n02000705=\"&به‌ڵێ\"\n02000707=\"به‌ڵێ بۆ &هه‌موو\"\n02000709=\"&نه‌خێر\"\n0200070B=\"نه‌خێر بۆ هه‌&موو\"\n\n02000710=\"پاشگه‌زبوونه‌وه‌\"\n02000711=\"&پاشگه‌زبوونه‌وه‌\"\n02000713=\"&داخستن\"\n02000714=\"وه‌ستاندن\"\n02000715=\"ده‌ستپێكردنه‌وه‌\"\n\n02000720=\"یارمه‌تی\"\n\n; Extract dialog\n02000800=\"ده‌ركێشان\"\n02000801=\"&ده‌ركێشان بۆ:\"\n02000802=\"تێپه‌ڕه‌وشه‌\"\n\n02000810=\"جۆری ڕێڕه‌و\"\n02000811=\"ناوی ڕێڕه‌وی ته‌واوه‌تی\"\n02000812=\"ناوی ڕێڕه‌وه‌ ئێستاییه‌كان\"\n02000813=\"ناوی ڕێڕه‌و نییه‌\"\n\n02000820=\"جۆری به‌سه‌ردا نووسینه‌وه‌\"\n02000821=\"بپرسه‌ پێش به‌سه‌ردا نووسینه‌وه‌\"\n02000822=\"به‌سه‌ردا بنووسه‌وه‌ به‌بێ ڕه‌زامه‌ندی\"\n02000823=\"په‌ڕگه‌ هه‌بووه‌كان بپه‌ڕێنه‌\"\n02000824=\"خۆكار ناوگۆڕین\"\n02000825=\"خۆكار ناوگۆڕینی په‌ڕگه‌ هه‌بووه‌كان\"\n\n02000830=\"په‌ڕگه‌كان\"\n02000831=\"په‌ڕگه‌ &دیاریكراوه‌كان\"\n02000832=\"&هه‌موو په‌ڕگه‌كان\"\n\n02000881=\"شوێنێك دیاری بكه‌ بۆ په‌ڕگه‌ ده‌ركێشراوه‌كان\"\n\n02000890=\"ده‌ری ده‌كێشێ\"\n\n; Overwrite dialog\n02000900=\"دڵنیابه‌ له‌ جێگرتنه‌وه‌ی په‌ڕگه‌\"\n02000901=\"بوخچه‌ی مه‌به‌ست په‌ڕگه‌یه‌كی تیادایه‌ به‌ هه‌مان ناو.\"\n02000902=\"حه‌ز ده‌كه‌یت په‌ڕگه‌ هه‌بووه‌كان جێبگیردرێته‌وه‌؟\"\n02000903=\"له‌گه‌ڵ ئه‌م دانه‌یه‌؟\"\n\n02000911=\"ناوگۆڕینی &خۆكار\"\n\n02000982=\"{0} بایت\"\n02000983=\"ده‌ستكاریكراوه‌ له‌\"\n\n; Messages dialog\n02000A00=\"په‌یامی لێكۆڵینه‌وه‌/ پشكنین\"\n\n02000A80=\"په‌یام\"\n\n02000A91=\"ڕێبازێكی پاڵپشتی نه‌كراوی په‌ستاندن بۆ '{0}'. \"\n02000A92=\"زانیاری '{0}' هه‌ڵه‌یه‌. په‌ڕگه‌ تێكشكاوه‌.\"\n02000A93=\"CRC سه‌ركه‌وتوو نه‌بوو. په‌ڕگه‌ تێكشكاوه‌.\"\n02000A94=\"زانیاری هه‌ڵه‌یه‌ له‌ په‌ڕگه‌ی پارێزراودا '{0}'. ئایا تێپه‌ڕه‌وشه‌ هه‌ڵه‌یه‌؟\"\n02000A95=\"CRC هه‌ڵه‌یه‌ له‌ په‌ڕگه‌ی پارێزراودا '{0}'. ئایا تێپه‌ڕه‌وشه‌ هه‌ڵه‌یه‌؟\"\n\n; Password dialog\n02000B00=\"نووسینی تێپه‌ڕه‌وشه‌:\"\n02000B01=\"تێپه‌ڕه‌وشه‌ بنووسه‌:\"\n02000B02=\"&پیشاندانی تێپه‌ڕه‌وشه‌\"\n02000B03=\"تێپه‌ڕه‌وشه‌ بنووسه‌وه‌:\"\n02000B10=\"تێپه‌ڕه‌وشه‌كان وه‌ك یه‌ك نین\"\n02000B11=\"ته‌نها پیته‌ ئینگلیزییه‌كان، ژماره‌ و نووسه‌ تیبه‌تییه‌كان ($، %، #) بۆ تێپه‌ڕه‌وشه‌ به‌كاربهێنه‌\"\n02000B12=\"تێپه‌ڕه‌وشه‌ زۆر درێژه‌\"\n\n; Progress dialog\n02000C00=\"جێبه‌جێكردن\"\n02000C01=\"ك. ده‌ستپێكردوو:\"\n02000C02=\"كاتی ماوه‌:\"\n02000C03=\"سه‌رجه‌می قه‌باره‌:\"\n02000C04=\"خێرایی:\"\n02000C05=\"جێبه‌جێكراوه‌:\"\n02000C06=\"ڕێژه‌ی په‌ستاندن:\"\n\n02000C10=\"&پاشه‌بنه‌ما\"\n02000C11=\"پ&ێشه‌بنه‌ما\"\n02000C12=\"&ڕاگرتن\"\n02000C13=\"&به‌رده‌وام بوون\"\n\n02000C20=\"ڕاگیردرا\"\n\n02000C30=\"دڵنیایت له‌ پاشگه‌زبوونه‌وه‌؟\"\n\n; Compress dialog\n02000D00=\"زیادكردن بۆ ئه‌رشیڤ\"\n02000D01=\"&ئه‌رشیڤ:\"\n02000D02=\"&جۆری نوێكاری:\"\n02000D03=\"&فۆڕماتی ئه‌رشیڤ:\"\n02000D04=\"&ڕێبازی په‌ستاندن:\"\n02000D05=\"دروستكردنی ئه‌رشیڤی &ڕه‌ق/ پته‌و\"\n02000D06=\"&هاوكۆڵكه‌كان:\"\n02000D07=\"هه‌ڵبژاردنه‌كان\"\n02000D08=\"دروستكردنی ئه‌رشیڤی SF&X\"\n02000D09=\"فره‌ ده‌زوو\"\n02000D0A=\"&ناوی په‌ڕگه‌كان بپارێزه‌ (encrypt)\"\n02000D0B=\"&ئاستی په‌ستاندن:\"\n02000D0C=\"قه‌باره‌ی &فه‌رهه‌نگ:\"\n02000D0D=\"قه‌باره‌ی &وشه‌:\"\n02000D0E=\"ڕێژه‌ی به‌كارهێنانی بیرگه‌ بۆ په‌ستاندان:\"\n02000D0F=\"ڕێژه‌ی به‌كارهێنانی بیرگه‌ بۆ كردنه‌وه‌ی په‌ستێنراو:\"\n02000D10=\"پاراستن\"\n02000D11=\"ڕێبازی پاراستن\"\n02000D12=\"ژماره‌ی ده‌زووه‌كانی CPU:\"\n02000D13=\"قه‌باره‌ی بلۆكی ڕه‌ق:\"\n02000D14=\"نا-ڕه‌ق\"\n02000D15=\"ڕه‌ق\"\n02000D16=\"په‌ستاندنی په‌ڕگه‌ ئاڵوگۆڕكراوه‌كان\"\n\n02000D40=\"له‌تی بكه‌ بۆ &قه‌باره و بایت‌\"\n02000D41=\"قه‌باره‌ی له‌تكراوه‌كه‌ هه‌ڵه‌یه‌\"\n02000D42=\"قه‌باره‌ی دیاریكراوی له‌تكراوه‌كه‌: {0} بایت.\\nدڵنیایت له‌ له‌تكردنی ئه‌رشیڤه‌كه‌ بۆ ئه‌و قه‌بارانه‌؟\"\n\n02000D81=\"پاشه‌كه‌وت\"\n02000D82=\"ئاسایی\"\n02000D83=\"زۆرترین\"\n02000D84=\"خێرا\"\n02000D85=\"خێراترین\"\n02000D86=\"سه‌روو\"\n\n02000D90=\"هه‌ڵده‌وه‌/ Browse\"\n\n02000DA1=\"زیادكردن و جێگرتنه‌وه‌ی په‌ڕگه‌كان\"\n02000DA2=\"نوێكردنه‌وه‌ و زیادكردنی په‌ڕگه‌\"\n02000DA3=\"بووژاندنه‌وه‌ی په‌ڕگه‌ هه‌بووه‌كان\"\n02000DA4=\"ـكردنی په‌ڕگه‌كان Synchronize\"\n\n02000DB1=\"هه‌موو په‌ڕگه‌كان\"\n\n02000DC0=\"ده‌ی په‌ستێنێ...\"\n\n; Columns dialog\n02000E00=\"ستوونه‌كان\"\n02000E01=\"ئه‌و ستوونه‌كان بپشكنه‌ كه‌ حه‌ز ده‌كه‌یت دیاربن له‌م بوخچه‌یه‌دا. دوگمه‌ی جوڵان بۆ سه‌ره‌وه‌ و جوڵان بۆ خواره‌وه‌ به‌كارببه‌ بۆ پێش و پاشخستنی ستوونه‌كان.\"\n02000E02=\"ستوونی دیاریكراو پێویسته‌\"\n02000E03=\"پیكسڵ &پان بێت.\"\n\n02000E10=\"جوڵان بۆ &خواره‌وه‌\"\n02000E11=\"جوڵان بۆ &سه‌ره‌وه‌\"\n02000E12=\"&پیشاندان\"\n02000E13=\"&شاردنه‌وه‌\"\n02000E14=\"ڕێكبخه‌\"\n\n02000E81=\"ناونیشان\"\n02000E82=\"پانی\"\n\n; Testing\n02000F90=\"تاقیده‌كاته‌وه‌\"\n\n\n; File Manager\n\n03000000=\"7-Zip به‌ڕێوه‌به‌رایه‌تی په‌ڕگه‌ی\"\n\n; Menu\n03000102=\"&فایل\"\n03000103=\"&ده‌ستكاری\"\n03000104=\"&بینین\"\n03000105=\"&ئامڕازه‌كان\"\n03000106=\"&یارمه‌تی\"\n03000107=\"د&ڵخوازه‌كان\"\n\n; File\n03000210=\"&كردنه‌وه‌\"\n03000211=\"كردنه‌وه‌ له‌&ناو خۆدا\"\n03000212=\"كردنه‌وه‌ له‌ &ده‌ره‌وه‌\"\n03000220=\"&بینین\"\n03000221=\"&ده‌ستكاری\"\n03000230=\"&ناوگۆڕین\"\n03000231=\"&له‌به‌رگرتنه‌وه‌ بۆ...\"\n03000232=\"&گواستنه‌وه‌ بۆ...\"\n03000233=\"&سڕینه‌وه‌\"\n03000240=\"&تایبه‌تمه‌ندییه‌كان\"\n03000241=\"ل&ێدوان\"\n03000242=\"ژماردنی checksum\"\n03000250=\"دروستكردنی بوخچه‌\"\n03000251=\"دروستكردنی په‌ڕگه‌\"\n03000260=\"ده‌ر&چوون\"\n03000270=\"&له‌تكردنی په‌ڕگه‌...\"\n03000271=\"&پێكه‌وه‌ لكاندنی په‌ڕگه‌كان...\"\n\n; Edit\n03000310=\"&پاشگه‌زبوونه‌وه‌\"\n03000311=\"&كردن-ه‌وه‌\"\n03000320=\"&بڕین\"\n03000321=\"&له‌به‌رگرتنه‌وه‌\"\n03000322=\"&لكا&ندن\"\n03000323=\"&سڕینه‌وه‌\"\n03000330=\"هه‌مووی دیاری بكه‌\"\n03000331=\"هه‌موو دیاریكراوه‌كان لاببه‌\"\n03000332=\"%پێچه‌وانه‌كردنه‌وه‌ی دیاریكراو\"\n03000333=\"دیاری بكه‌...\"\n03000334=\"دیاری مه‌كه‌...\"\n03000335=\"به‌ پێی جۆر دیاری بكه‌\"\n03000336=\"لابردنی دیاریكراوه‌كان به‌پێ جۆر\"\n\n; View\n03000410=\"ئایكۆنی &گه‌وره‌\"\n03000411=\"ئایكۆنی &بچوك\"\n03000412=\"&لیست\"\n03000413=\"&ورده‌كاری\"\n03000420=\"ڕیزنه‌كراو\"\n03000430=\"كردنه‌وه‌ی بوخچه‌ی ڕه‌گ\"\n03000431=\"یه‌ك ئاست بۆ سه‌ره‌وه‌\"\n03000432=\"مێژووی بوخچه‌كان...\"\n03000440=\"&بووژاندنه‌وه‌\"\n03000449=\"بینین به‌شێوه‌ی فلات\"\n03000450=\"&2 پانێڵ\"\n03000451=\"&جێ ئامڕاز\"\n03000460=\"جێ ئامڕازی ئه‌رشیڤ\"\n03000461=\"جی ئامڕازی بنچینه‌\"\n03000462=\"دوگمه‌ی گه‌وره‌\"\n03000463=\"پیشاندانی ده‌قی دوگمه‌كان\"\n\n; Tools\n03000510=\"&هه‌ڵبژاردنه‌كان\"\n03000511=\"&نیشانه‌ی پێوان\"\n\n; Help\n03000610=\"&ناوه‌ڕۆكه‌كان...\"\n03000620=\"&ده‌رباره‌ی 7-Zip...\"\n\n; Favorites\n03000710=\"&زیادكردنی بوخچه‌ بۆ دڵخوازه‌كان وه‌ك\"\n03000720=\"دڵخوازی\"\n\n; Options Dialog\n\n03010000=\"هه‌ڵبژاردنه‌كان\"\n\n; Plugins\n03010100=\"پێوه‌كراوه‌كان\"\n03010101=\"&پێوه‌كراوه‌كان:\"\n03010110=\"هه‌ڵبژاردنه‌كان\"\n\n; Edit\n03010200=\"ده‌ستكاریكه‌ر\"\n03010201=\"&ده‌ستكاریكه‌ر:\"\n\n; System\n03010300=\"سیسته‌م\"\n03010302=\"7-Zip په‌یوه‌ست بكه‌ به‌:\"\n03010310=\"پێوه‌كراوه‌\"\n\n; Settings\n03010400=\"ڕێكخسته‌كان\"\n03010401=\"شته‌كانی \\\"..\\\" پیشانبده‌\"\n03010402=\"ئایكۆنی ڕاسته‌قینه‌ی په‌ڕگه‌كان پیشانبده‌\"\n03010410=\"مێنیوی سیسته‌م پیشانبده‌\"\n03010420=\"دیاریكردنی هه‌موو &ڕیزه‌كه‌\"\n03010421=\"پیشاندانی هێڵه‌ &grid ـه‌كان\"\n03010430=\"جۆری دیاریكردنی &جێگره‌وه‌/ ئه‌ڵته‌رناتیڤ\"\n03010440=\"په‌ڕه‌ی بیرگه‌ی &گه‌وره‌ به‌كارببه‌\"\n\n; Strings\n\n03020201=\"له‌به‌رگرتنه‌وه‌\"\n03020202=\"گواستنه‌وه‌\"\n03020203=\"له‌به‌رگتنه‌وه‌ بۆ:\"\n03020204=\"گواستنه‌وه‌ بۆ:\"\n03020205=\"له‌به‌ری ده‌گرێته‌وه‌...\"\n03020206=\"ده‌یگوازێته‌وه‌ بۆ...\"\n03020207=\"ناتوانی شته‌كان له‌به‌ربگریته‌وه‌ یان بگوازیته‌وه‌ بۆ ئه‌و بوخچانه‌.\"\n03020208=\"ئه‌و كاره‌ پاڵپشتی نه‌كراوه‌\"\n03020209=\"بوخچه‌ی مه‌به‌ست دیاری بكه‌.\"\n\n03020210=\"دڵنیابه‌ له‌ سڕینه‌وه‌ی په‌ڕگه‌\"\n03020211=\"دڵنیابه‌ له‌ سڕینه‌وه‌ی بوخچه‌\"\n03020212=\"دڵنیابه‌ له‌ سڕینه‌وه‌ی هه‌موو په‌ڕگه‌كان\"\n03020213=\"دڵنیایت له‌ سڕینه‌وه‌ی '{0}'؟\"\n03020214=\"دڵنیایت له‌ سڕینه‌وه‌ی بوخچه‌ی '{0}' و هه‌موو ناوه‌ڕۆكه‌كانی؟\"\n03020215=\"دڵنیایت له‌ سڕینه‌وه‌ی ئه‌م {0} شته‌؟\"\n03020216=\"ده‌ی سڕێته‌وه‌...\"\n03020217=\"هه‌ڵه‌ هه‌یه‌ له‌ سڕینه‌وه‌ی په‌ڕگه‌كان یا بوخچه‌كان\"\n\n03020220=\"ناوی ده‌گۆڕێ...\"\n03020221=\"هه‌ڵه‌ هه‌یه‌ له‌ ناو گۆڕینی په‌ڕگه‌ یان بوخچه‌كان. \"\n03020222=\"دڵنیابه‌ له‌ له‌به‌رگرتنه‌وه‌ی په‌ڕگه‌\"\n03020223=\"دڵنیایت له‌ له‌به‌رگرتنه‌وه‌ی په‌ڕگه‌كان بۆ ئه‌رشیڤ؟\"\n\n03020230=\"دروستكردنی بوخچه‌\"\n03020231=\"ناوی بوخچه‌:\"\n03020232=\"به‌خچه‌ی نوێ\"\n03020233=\"هه‌ڵه‌ هه‌یه‌ له‌ دروستكردنی بوخچه‌ \"\n\n03020240=\"دروستكردنی په‌ڕگه‌\"\n03020241=\"ناوی په‌ڕگه‌:\"\n03020242=\"په‌ڕگه‌ی نوێ\"\n03020243=\"هه‌ڵه‌ هه‌یه‌ له‌ دروستكردنی په‌ڕگه‌دا\"\n\n03020250=\"دیاری بكه‌\"\n03020251=\"دیاری مه‌كه‌\"\n03020252=\"ڕووپۆش:\"\n\n03020260=\"مێژووی بوخچه‌كان\"\n\n03020280=\"په‌ڕگه‌ی '{0}' ده‌ستكاریكراوه‌. ئه‌ته‌وێت له‌ ئه‌رشیڤه‌كه‌دا نوێی بكه‌یته‌وه‌؟\"\n03020281=\"ناتوانرێ په‌ڕگه‌ی \\n'{0}' نوێبكرێته‌وه‌\"\n03020282=\"ناتوانرێ ده‌ستكاریكه‌ر ده‌ستپێبكرێت.\"\n03020283=\"ده‌یكاته‌وه‌...\"\n\n03020290=\"لێدوان\"\n03020291=\"&لێدوان:\"\n\n030202A0=\"سیسته‌م\"\n\n03020300=\"كۆمپیوته‌ر\"\n03020301=\"ڕایه‌ڵه‌\"\n\n03020400=\"زیادكردن\"\n03020401=\"ده‌ركێشان\"\n03020402=\"تاقیكردنه‌وه‌\"\n\n03020420=\"له‌به‌رگرتنه‌وه‌\"\n03020421=\"گواستنه‌وه‌\"\n03020422=\"سڕینه‌وه‌\"\n03020423=\"زانیاری\"\n\n03020500=\"له‌تكردنی په‌ڕگه‌\"\n03020501=\"&له‌تی بكه‌ بۆ:\"\n03020510=\"له‌تی ده‌كات...\"\n03020520=\"دڵنیابه‌ له‌ له‌تكردن\"\n03020521=\"دڵنیایت له‌ له‌تكردنی په‌ڕگه‌ی {0} بۆ دوو قه‌باره‌؟\"\n03020522=\"پێویسته‌ قه‌باره‌ی هه‌ر یه‌ك له‌ له‌ته‌كان بچوكتربێت له‌ قه‌باره‌ی په‌ڕگه‌ له‌تكراوه‌كه‌\"\n\n03020600=\"پێكه‌وه‌ لكاندنی په‌ڕگه‌كان\"\n03020601=\"%پێكه‌وه‌ی بلكێنه‌ بۆ:\"\n03020610=\"پێكه‌وه‌ی ده‌لكێنێت...\"\n03020620=\"ته‌نها په‌ڕگه‌ی یه‌كه‌م دیاری بكه‌\"\n\n03020710=\"ژماردنی Checksum...\"\n03020720=\"زانیاری Checksum\"\n03020721=\"CRC checksum for data:\"\n03020722=\"CRC checksum for data and names:\"\n\n03020800=\"Scanning...\"\n\n03020900=\"تایبه‌تمه‌ندییه‌كان\"\n\n; Computer\n03031100=\"سه‌رجه‌می قه‌باره‌\"\n03031101=\"بۆشایی به‌تاڵ\"\n03031102=\"قه‌باره‌ی كۆمه‌ڵه‌كه‌\"\n03031103=\"نیشان\"\n\n; Network\n03031200=\"ناوی ناوخۆیی\"\n03031201=\"دابینكه‌ر\"\n\n; Benchmark Dialog\n\n03080000=\"نیشانه‌ی پێوان\"\n03080001=\"ڕێژه‌ی به‌كارهێنراوی بیرگه‌:\"\n03080002=\"په‌ستاندن\"\n03080003=\"كردنه‌وه‌ی په‌ستێنراو\"\n03080004=\"خێرایی\"\n03080005=\"هه‌ڵسه‌نگاندن\"\n03080006=\"سه‌رجه‌می هه‌ڵسه‌نگاندن\"\n03080007=\"ئێستایی\"\n03080008=\"ئه‌نجام\"\n03080009=\"ده‌رچوونه‌كان:\"\n0308000A=\"هه‌ڵه‌كان:\"\n0308000B=\"CPU ڕێژه‌ی به‌كارهێنراوی\"\n0308000C=\"ڕێژه‌ی به‌كارهێنراو / هه‌ڵسه‌نگاندن\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ku.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.37\n; Translated by Rizoyê Xerzî\n;\n;\n;\n;\n\n00000000=\"Kurdish\"\n00000001=\"Kurdî\"\n00000002=\"\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Sazkirin\"\n\n; Info Page\n01000100=\"Der barê 7-Zip de\"\n01000103=\"7-Zip nivîsbariyeke azad e. Lê, tu dikarî wekî tomarkirin desteka pêşxistina 7-zip bibî.\"\n01000104=\"Destek\"\n01000105=\"Tomarkirin\"\n\n; Folders Page\n01000200=\"Peldank\"\n01000210=\"Peldanka &Xebatê\"\n01000211=\"&Peldanka TEMP a Pergalê\"\n01000212=\"P&eldanka Derbasdar\"\n01000213=\"Pe&ldanka Navborî:\"\n01000214=\"Bi tenê ji bo ajokarên derketî bi kar bîne\"\n\n01000281=\"Ji bo dosiyên demdemî yên arşîvê cih belî bike.\"\n\n; System Page\n01000300=\"Pergal\"\n01000301=\"Bila di pêşekên naverokê de 7-Zip bixuye\"\n01000302=\"Pêşeka naverokê ya sûlavî\"\n01000310=\"Hêmanên peşeka naverokê:\"\n\n; Language Page\n01000400=\"Ziman\"\n01000401=\"Ziman:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Fermanên 7-Zip\"\n02000103=\"Arşîvê veke\"\n02000104=\"Arşîva hilbijartî vedike.\"\n02000105=\"Dosiyan derxe...\"\n02000106=\"Dosiyan ji arşîva hilbijartî derdixe.\"\n02000107=\"Bike Arşîv...\"\n02000108=\"Hêmanên hilbijartî dixe arşîvê.\"\n02000109=\"Arşîvê bihêçîne\"\n0200010A=\"Tevahiya arşîva hilbijartî diceribîne.\"\n0200010B=\"Valake vir\"\n0200010C=\"Dosiyên arşîva hilbijartî derdixe peldanka derbasdar.\"\n0200010D=\"Peldanka {0} derxe\"\n0200010E=\"Derdixe bin-peldankê.\"\n0200010F=\"Wekî {0} bike arşîv\"\n02000110=\"Hêmanên hilbijartî dike arşîv.\"\n02000111=\"Bişidîne û bişîne...\"\n02000112=\"Hêman hilbijartî dişidîne û arşîvê bi e-peyamê re dişîne.\"\n02000113=\"Wekî {0} bişidîne û bişîne\"\n02000114=\"Hêmanên hilbijartî dişidîne û dike arşîv û arşîvê bi e-peyamê re dişîne.\"\n\n02000140=\"<Peldank>\"\n02000141=\"<Arşîv>\"\n\n; Properties\n02000203=\"Rê\"\n02000204=\"Nav\"\n02000205=\"Cure\"\n02000206=\"Peldank\"\n02000207=\"Mezinahî\"\n02000208=\"Mezinahiya di arşîvê de\"\n02000209=\"Taybetiyên xweser\"\n0200020A=\"Çêbûyî\"\n0200020B=\"Gihaştî\"\n0200020C=\"Guhertî\"\n0200020D=\"Hişk\"\n0200020E=\"Daxuyankirî\"\n0200020F=\"Şîfrekirî\"\n02000210=\"Parçeyê borî\"\n02000211=\"Parçeyê piştre\"\n02000212=\"Ferheng\"\n02000213=\"CRC\"\n02000214=\"Cure\"\n02000215=\"Dij\"\n02000216=\"Awayê şidandinê\"\n02000217=\"Platform\"\n02000218=\"Pergala Dosiyê\"\n02000219=\"Bikarhêner\"\n0200021A=\"Kom\"\n0200021B=\"Stûn\"\n0200021C=\"Daxuyanî\"\n0200021D=\"Cih\"\n0200021E=\"Path Prefix\"\n\n; Status bar\n02000301=\"{0} heb hêman hilbijartî ne\"\n02000302=\"{0} heb hêman\"\n\n02000320=\"Pel:\"\n02000321=\"Peldank:\"\n02000322=\"Mezinahî:\"\n\n; List Context Menu\n02000401=\"&Stûn...\"\n\n02000411=\"&Veke\"\n02000412=\"&Derxe...\"\n\n; ToolBar\n02000501=\"Derxe\"\n\n; Messages\n02000601=\"Tu nikarî vê arşîvê rojane bikî.\"\n02000602=\"Arşîva {0} nayê rojanekirin\"\n02000603=\"Peldanka '{0}' nayê çêkirin\"\n02000604=\"Ev dosya ne arşîveke naskirî ye.\"\n02000605=\"Çewtî\"\n02000606=\"Hêman zêde ne\"\n02000607=\"Sepaneke têkildarî vî cureyê dosiyê nîn e\"\n02000608=\"Çewtî nîn e.\"\n\n; Dialogs\n02000702=\"Temam\"\n02000705=\"&Erê\"\n02000707=\"&Ji Bo Hemûyî Erê\"\n02000709=\"&Na\"\n0200070B=\"Ji &Bo Hemûyî Na\"\n\n02000710=\"Betal\"\n02000711=\"B&etal\"\n02000713=\"Bi&gire\"\n02000714=\"Raweste\"\n02000715=\"Dîsa Destpêke\"\n\n02000720=\"Alîkarî\"\n\n; Extract dialog\n02000800=\"Derxe\"\n02000801=\"&Cihê Dê Derkevê:\"\n02000802=\"Şîfre\"\n\n02000810=\"Navê Rê\"\n02000811=\"Navê tevahî yên rê\"\n02000812=\"Navê derbasdar ên rê\"\n02000813=\"Bila navên rê tune bin\"\n\n02000820=\"Dosiyên heyî\"\n02000821=\"Ji bo li ser binivîse bipirse\"\n02000822=\"Bê pirs li ser binivîse\"\n02000823=\"Derxistin\"\n02000824=\"Navekî nû li yên di arşîvê de bike\"\n02000825=\"Navekî nû li yên heyî bike\"\n\n02000830=\"Dosya\"\n02000831=\"D&osiyên hilbijartî\"\n02000832=\"He&mû Dosya\"\n\n02000881=\"Ji bo dosya derkevinê cihekî belî bike.\"\n\n02000890=\"Tên derxistin\"\n\n; Overwrite dialog\n02000900=\"Rewla Lisernivîsandinê\"\n02000901=\"Di dosiya armanckirî de bi vî navî dosiyek heye. Bila li ser bête nivîsîn?\"\n02000902=\"Dosiya heyî:\"\n02000903=\"Dosiya tê derxistin:\"\n\n02000911=\"Na&vekî nû lê bike\"\n\n02000982=\"{0} bayt\"\n02000983=\"guhertina dawî \"\n\n; Messages dialog\n02000A00=\"Peyamên haydariyê\"\n\n02000A80=\"Peyam\"\n\n02000A91=\"Ji bo '{0}' awayê şidandinê nehate nasîn.\"\n02000A92=\"'{0}' xerabe ye. (Çewtiya daneyê)\"\n02000A93=\"'{0}' xerabe ye. (Çewtiya CRC)\"\n\n; Password dialog\n02000B00=\"Têketina Şîfreyê\"\n02000B01=\"Şîfreyê binivîse:\"\n02000B02=\"Bi&la şîfre bixuye\"\n\n; Progress dialog\n02000C00=\"bixebite\"\n02000C01=\"Dema borî:\"\n02000C02=\"Dema mayî:\"\n02000C03=\"Mezinahî:\"\n02000C04=\"Lez:\"\n\n02000C10=\"L%i Pişt\"\n02000C11=\"Li &Pêş\"\n02000C12=\"&Rawestîne\"\n02000C13=\"Bi&domîne\"\n\n02000C20=\"Rawestiya - \"\n\n02000C30=\"Ma bila betal bibe?\"\n\n; Compress dialog\n02000D00=\"Bike Arşîv\"\n02000D01=\"&Arşîv:\"\n02000D02=\"A&wayê rojanekirinê:\"\n02000D03=\"Awa&yê arşîvê:\"\n02000D04=\"Awayê şi&dandinê:\"\n02000D05=\"Bila &hişk be\"\n02000D06=\"&Parametre:\"\n02000D07=\"Vebijêrk\"\n02000D08=\"Bila ew bixwe derxe (SFX)\"\n02000D09=\"Pir&girêkî\"\n02000D0A=\"Navên dosiyê bike şîfre\"\n02000D0B=\"A&sta şidandinê:\"\n02000D0C=\"Me&zinahiya ferhengê:\"\n02000D0D=\"M&ezinahiya bêjeyê:\"\n02000D0E=\"Bikaranîna bîrê (Şidandin):\"\n02000D0F=\"Bikaranîna bîrê (Vekirin):\"\n\n02000D40=\"Wekî Bayt/&cilt bike parçe:\"\n\n02000D81=\"Bêyî şidandin\"\n02000D82=\"Asayî\"\n02000D83=\"Herî Pir\"\n02000D84=\"Bi Lez\"\n02000D85=\"Leztirîn\"\n02000D86=\"Ultra\"\n\n02000D90=\"Bibîne\"\n\n02000DA1=\"Dosiyan têxê, yên heyî derxe\"\n02000DA2=\"Dosiyan têxê, yên kevin rojane bike\"\n02000DA3=\"Bi tenê yên kevin rojane bike\"\n02000DA4=\"Dosiyan bike wekî hev\"\n\n02000DB1=\"Hemû dosya\"\n\n02000DC0=\"tên şidandin\"\n\n; Columns dialog\n02000E00=\"Stûn\"\n02000E01=\"Stûnên tu dixwazî di vê peldankê de xuya bibin nîşan bike. Ji bo rêzkirina stûnan bişkojkên berjor-berjêr bi kar bîne.\"\n02000E02=\"Firehiya stûna hilbijartî\"\n02000E03=\"Bila &piksel be.\"\n\n02000E10=\"B&erjor\"\n02000E11=\"&Berjêr\"\n02000E12=\"&Nîşan Bide\"\n02000E13=\"&Veşêre\"\n02000E14=\"Peywirdar bike\"\n\n02000E81=\"Sernivîs\"\n02000E82=\"Firehî\"\n\n; Testing\n02000F90=\"tê hêçandin\"\n\n\n; File Manager\n\n03000000=\"7-Zip Gerînendeyê Dosiyan\"\n\n; Menu\n03000102=\"&Dosya\"\n03000103=\"&Bipergalîne\"\n03000104=\"&Nîşan Bide\"\n03000105=\"&Amûr\"\n03000106=\"A&lîkarî\"\n03000107=\"Bi&jare\"\n\n; File\n03000210=\"&Veke\"\n03000211=\"&Di Panelê De Veke\"\n03000212=\"Di &Paceyê De Veke\"\n03000220=\"&Nîşan Bide\"\n03000221=\"&Sererast bike\"\n03000230=\"&Navekî Nû Bidê\"\n03000231=\"&Ji Ber Bigire\"\n03000232=\"B&ar Bike\"\n03000233=\"Jê B&ibe\"\n03000240=\"&Taybetî\"\n03000241=\"Da&xuyanî\"\n03000242=\"checksum heseb bike\"\n03000250=\"Pe&ldankeke Nû\"\n03000251=\"Do&siyeke Nû\"\n03000260=\"De&rkeve\"\n03000270=\"Parçe Bi&ke...\"\n03000271=\"Bike &Yek...\"\n\n; Edit\n03000310=\"&Vegere\"\n03000311=\"&Nû Bike\"\n03000320=\"&Bibire\"\n03000321=\"&Ji Ber Bigire\"\n03000322=\"&Pêveke\"\n03000323=\"Jê Bib&e\"\n03000330=\"&Hemûyî hilbijêre\"\n03000331=\"He&mû hilijartinê rake\"\n03000332=\"Be&revajî wê hilbijêre\"\n03000333=\"&Hilbijêre...\"\n03000334=\"Hilbijarti&nê Rake...\"\n03000335=\"Vî cureyî hilbijêre\"\n03000336=\"Hilbijartina cure rake\"\n\n; View\n03000410=\"&Dawêrên Mezin\"\n03000411=\"D&awêrên Biçûk\"\n03000412=\"&Lîste\"\n03000413=\"&Hûragahî\"\n03000420=\"Bê Dor\"\n03000430=\"Peldanka Kok Veke\"\n03000431=\"Astekê Berjor\"\n03000432=\"Dîroka Peldankê...\"\n03000440=\"&Nû Bike\"\n03000449=\"xuyakirina sade\"\n03000450=\"&2 Panelan veke\"\n03000451=\"Da&rikê amûran\"\n03000460=\"Darikê arşîvê\"\n03000461=\"Darikê standart\"\n03000462=\"Bişkojkên mezin\"\n03000463=\"Bila nivîsa bişkojkan bixuye\"\n\n; Tools\n03000510=\"&Vebijêrk...\"\n03000511=\"&Pîvana Çalakbûnê\"\n\n; Help\n03000610=\"&Naverok...\"\n03000620=\"D&er barê 7-Zip de...\"\n\n; Favorites\n03000710=\"Pe&ldanka derbasdar veke\"\n03000720=\"Cih\"\n\n; Options Dialog\n\n03010000=\"Vebijêrk\"\n\n; Plugins\n03010100=\"Leqêq\"\n03010101=\"&Hemû Lehêq:\"\n03010110=\"Mîheng...\"\n\n; Edit\n03010200=\"Per&galker\"\n03010201=\"Pergalkerê De&qê:\"\n\n; System\n03010300=\"Pergal\"\n03010302=\"Bi 7-Zip re têkildar bike:\"\n03010310=\"Leqêq\"\n\n; Settings\n03010400=\"Mîheng\"\n03010401=\"Bila hêmana \\\"..\\\" xuya bike\"\n03010402=\"Bila dawêrên dosiyên rastî xuya bikin\"\n03010410=\"Bila pêşeka pergalê xuya bike\"\n03010420=\"Bila &hemû rêzikê bibore\"\n03010421=\"Bila &xêzên tabloyê xuya bike\"\n03010430=\"&Kipa hilbijartina alternatîf\"\n03010440=\"bîra berfireh bikar bîne\"\n\n; Strings\n\n03020201=\"Ji Ber Bigire\"\n03020202=\"Bar Bike\"\n03020203=\"Cihê Dê Were Jibergirtin:\"\n03020204=\"Cihê Dê Were Barkirin:\"\n03020205=\"tê jibergirtin...\"\n03020206=\"tê barkirin...\"\n03020207=\"Jibergirtin û barkirin ji bo vê peldankê nabe.\"\n03020208=\"Kirin ne pêkan e.\"\n\n03020210=\"Erêkirina jêbirina dosiyê\"\n03020211=\"Erêkirina jêbirina peldankê\"\n03020212=\"Erêkirina jêbirina gelek dosiyan\"\n03020213=\"Ma bila dosiya '{0}' bête jêbirin?\"\n03020214=\"Ma bila peldanka  '{0}' û yên tê de bên jêbirin?\"\n03020215=\"Ma bila hêmana {0} bête jêbirin?\"\n03020216=\"tê jêbirin...\"\n03020217=\"Çewtiya Jêbirinê\"\n\n03020220=\"navekî nû tê lêkirin...\"\n03020221=\"Çewtiya Navlêkirinê\"\n03020222=\"Erêkirina Jibergirtinê\"\n03020223=\"Ma bila dosî ji bo arşîvê bên jibergirtin\"\n\n03020230=\"Peldankeke nû\"\n03020231=\"Navê peldankê:\"\n03020232=\"Peldankeke Nû\"\n03020233=\"Çewtiya Çêkirina peldankê\"\n\n03020240=\"Dosiyeke Nû\"\n03020241=\"Navê Dosiyê:\"\n03020242=\"Dosiyeke Nû\"\n03020243=\"Çewtiya çêkirina Dosiyê\"\n\n03020250=\"Hilbijêre\"\n03020251=\"Hilbijartinê rake\"\n03020252=\"Derbirîna hilbijartinê:\"\n\n03020260=\"Rabirdûya Peldankê\"\n\n03020280=\"Dosiya '{0}' hatiye guhartin.\\nMa bila di arşîvê bête rojanekirin?\"\n03020281=\"Dosiya '{0}' nehate rojanekirin\"\n03020282=\"Pergalkerê deqê nehate destpêkirin.\"\n03020283=\"vedibe...\"\n\n03020290=\"Daxuyanî\"\n03020291=\"&Daxuyanî:\"\n\n030202A0=\"Pergal\"\n\n03020300=\"Komputer\"\n03020301=\"Tor\"\n\n03020400=\"Bike Arşîv\"\n03020401=\"Derxe\"\n03020402=\"Bihêçîne\"\n\n03020420=\"Ji Ber Bigire\"\n03020421=\"Bar Bike\"\n03020422=\"Jê Bibe\"\n03020423=\"Agahî\"\n\n03020500=\"Bike Parçe\"\n03020501=\"Di &vê peldankê de parçe bike:\"\n03020510=\"tê parçekirin...\"\n\n03020600=\"Bike Yek\"\n03020601=\"Di vê &peldankê de bike yek:\"\n03020610=\"tê yekirin...\"\n\n03020710=\"Hesabê sererastkirî...\"\n03020720=\"Agahiyên hesabê sererast\"\n03020721=\"CRC hesabê sererast bo data:\"\n03020722=\"CRC hesabê sererast bo data û nav:\"\n\n03020800=\"Tê raguhestin\"\n\n; Computer\n03031100=\"Hemû Mezinahî\"\n03031101=\"Cihê Vala\"\n03031102=\"Mezinahiya telpikî\"\n03031103=\"Etîket\"\n\n; Network\n03031200=\"Navê Herêmî\"\n03031201=\"Derfetkar\"\n\n; Benchmark Dialog\n\n03080000=\"Çalakiya komputerê\"\n03080001=\"Bikaranîna birê:\"\n03080002=\"Şidandin\"\n03080003=\"Vekirin\"\n03080004=\"Lez\"\n03080005=\"Puan\"\n03080006=\"bi guloverî puanan\"\n03080007=\"Carî\"\n03080008=\"Encam\"\n03080009=\"Serkeftî:\"\n0308000A=\"Çewt:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/lt.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.57\n; Translated by Marius Navickas <http://www.teisininkas.lt/ivairus/7-zip> edited by Domas Jokubauskis\n;\n;\n;\n;\n\n00000000=\"Lithuanian\"\n00000001=\"Lietuvių\"\n00000002=\"39\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip nustatymai\"\n\n; Info Page\n01000100=\"Apie 7-Zip\"\n01000103=\"7-Zip yra nemokama programa. Vis dėlto, jeigu jums patinka 7-Zip ir jūs norėtumėte paremti jos tolesnį vystymą, prašome pinigais paremti 7-Zip projektą.\"\n01000104=\"Techninis palaikymas\"\n01000105=\"Paremti\"\n\n; Folders Page\n01000200=\"Aplankai\"\n01000210=\"&Darbinis aplankas\"\n01000211=\"&Sisteminis laikinas aplankas\"\n01000212=\"D&abartinis\"\n01000213=\"Nurodyta&s:\"\n01000214=\"Naudoti tik išimamiems diskams\"\n\n01000281=\"Nurodyti vietą laikinoms archyvinėms byloms.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integruoti 7-Zip į kontekstinį meniu \"\n01000302=\"Pakopinis kontekstinis meniu\"\n01000310=\"Kontekstinio meniu įrašai:\"\n\n; Language Page\n01000400=\"Kalba\"\n01000401=\"Kalba:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip komandos\"\n02000103=\"Atverti archyvą\"\n02000104=\"Atveria pasirinktą archyvą.\"\n02000105=\"Išskleisti failus...\"\n02000106=\"Išskleidžia failus iš pasirinkto archyvo.\"\n02000107=\"Įtraukti į archyvą...\"\n02000108=\"Įtraukia pasirinktus elementus į archyvą.\"\n02000109=\"Patikrinti archyvą\"\n0200010A=\"Patikrina pasirinkto archyvo vientisumą.\"\n0200010B=\"Išskleisti čia\"\n0200010C=\"Išskleidžia pasirinkto archyvo failus šiame aplanke.\"\n0200010D=\"Išskleisti į {0}\"\n0200010E=\"Išskleidžia failus į paaplankį.\"\n0200010F=\"Įtraukti į {0}\"\n02000110=\"Įtraukia pasirinktus elementus į archyvą.\"\n02000111=\"Suglaudinti ir išsiųsti el. paštu...\"\n02000112=\"Suglaudina pasirinktus failus į archyvą ir išsiunčia jį el. paštu.\"\n02000113=\"Suglaudinti į {0} ir išsiųsti el. paštu\"\n02000114=\"Suglaudina pasirinktus failus į archyvą ir išsiunčia jį el. paštu.\"\n\n02000140=\"<Aplankas>\"\n02000141=\"<Archyvas>\"\n\n; Properties\n02000203=\"Kelias\"\n02000204=\"Pavadinimas\"\n02000205=\"Plėtinys\"\n02000206=\"Aplankas\"\n02000207=\"Dydis\"\n02000208=\"Dydis archyve\"\n02000209=\"Atributai\"\n0200020A=\"Sukurta\"\n0200020B=\"Naudota\"\n0200020C=\"Pakeista\"\n0200020D=\"Vientisas\"\n0200020E=\"Komentaras\"\n0200020F=\"Šifruotas\"\n02000210=\"Perskyra prieš\"\n02000211=\"Perskyra paskui\"\n02000212=\"Žodynas\"\n02000213=\"CRC\"\n02000214=\"Tipas\"\n02000215=\"Anti\"\n02000216=\"Būdas\"\n02000217=\"Kompiuterio OS\"\n02000218=\"Bylų sistema\"\n02000219=\"Vartotojas\"\n0200021A=\"Grupė\"\n0200021B=\"Blokas\"\n0200021C=\"Komentaras\"\n0200021D=\"Pozicija\"\n0200021E=\"Aplankas\"\n0200021F=\"Aplankai\"\n02000220=\"Vylos\"\n02000221=\"Versija\"\n02000222=\"Dalis\"\n02000223=\"!!Multivolume\"\n02000224=\"!!Offset\"\n02000225=\"Nuorodos\"\n02000226=\"Blokai\"\n02000227=\"Dalys\"\n\n; Status bar\n02000301=\"Pasirinkta {0} objektų: \"\n02000302=\"{0} objektų\"\n\n02000320=\"Failai:\"\n02000321=\"Aplankai:\"\n02000322=\"Dydis:\"\n02000323=\"Dydis suglaudinus:\"\n02000324=\"Archyvai:\"\n\n; List Context Menu\n02000401=\"&Stulpelių...\"\n\n02000411=\"&Atverti\"\n02000412=\"&Išskleisti...\"\n\n; ToolBar\n02000501=\"Išskleisti\"\n\n; Messages\n02000601=\"Šio archyvo negalima atnaujinti.\"\n02000602=\"Negalima atnaujinti archyvo „{0}“\"\n02000603=\"Negalima sukurti aplanko „{0}“\"\n02000604=\"Failas nėra palaikomas archyvas.\"\n02000605=\"Klaida\"\n02000606=\"Per daug elementų\"\n02000607=\"Nėra programų, kurios būtų susietos su pateikto failo plėtiniu\"\n02000608=\"Klaidų nerasta\"\n02000609=\"Negalima atverti „{0}“ failo kaip archyvo\"\n0200060A=\"Negalima atverti šifruoto archyvo „{0}“. Neteisingas slaptažodis?\"\n\n; Dialogs\n02000702=\"Gerai\"\n02000705=\"&Taip\"\n02000707=\"T&aip Visiems\"\n02000709=\"&Ne\"\n0200070B=\"Ne v&isiems\"\n\n02000710=\"Atšaukti\"\n02000711=\"&Atšaukti\"\n02000713=\"&Uždaryti\"\n02000714=\"Sustabdyti\"\n02000715=\"Iš naujo\"\n\n02000720=\"Elektroninis žinynas\"\n\n; Extract dialog\n02000800=\"Išskleisti\"\n02000801=\"Iš&skleisti į:\"\n02000802=\"Slaptažodis\"\n\n02000810=\"Kelio režimas\"\n02000811=\"Pilni keliai\"\n02000812=\"Dabartiniai keliai\"\n02000813=\"Jokių kelių\"\n\n02000820=\"Perrašymo režimas\"\n02000821=\"Paklausti prieš perrašant\"\n02000822=\"Perrašyti neįspėjant\"\n02000823=\"Praleisti esančius failus\"\n02000824=\"Automatiškai pervadinti\"\n02000825=\"Automatiškai pervadinti esančius failus\"\n\n02000830=\"Failai\"\n02000831=\"Pa&sirinktus failus\"\n02000832=\"Visus f&ailus\"\n\n02000881=\"Nurodyti vietą išskleidžiamiesiems failams.\"\n\n02000890=\"Išskleidžiama\"\n\n; Overwrite dialog\n02000900=\"Failų pakeitimo patvirtinimas\"\n02000901=\"Paskirtame aplanke jau yra apdorojamas failas.\"\n02000902=\"Ar norėtumėte pakeisti esančią failą\"\n02000903=\"šia failu?\"\n\n02000911=\"A&utomatinis pervadinimas\"\n\n02000982=\"{0} baitų\"\n02000983=\"pakeista\"\n\n; Messages dialog\n02000A00=\"Diagnostiniai pranešimai\"\n\n02000A80=\"Pranešimas\"\n\n02000A91=\"Nepalaikomas suglaudinimo metodas failui „{0}“.\"\n02000A92=\"Duomenų klaida „{0}“. Failas pažeistas.\"\n02000A93=\"CRC klaida „{0}“. Failas pažeistas.\"\n02000A94=\"Duomenų klaida šifruotame faile „{0}“. Neteisingas slaptažodis?\"\n02000A95=\"CRC neatitikimas šifruotame faile „{0}“. Neteisingas slaptažodis?\"\n\n; Password dialog\n02000B00=\"Slaptažodžio įvedimas\"\n02000B01=\"Įveskite slaptažodį:\"\n02000B02=\"&Rodyti slaptažodį\"\n02000B03=\"Pakartokite slaptažodį:\"\n02000B10=\"Slaptažodžiai nesutampa\"\n02000B11=\"Slaptažodžiui naudokite tik lotyniškas raides, numerius bei specialiuosius simbolius (!, #, $, ...)\"\n02000B12=\"Slaptažodis yra per ilgas\"\n\n; Progress dialog\n02000C00=\"Vykdymas\"\n02000C01=\"Praėjęs laikas:\"\n02000C02=\"Likęs laikas:\"\n02000C03=\"Dydis:\"\n02000C04=\"Sparta:\"\n02000C05=\"Apdorota:\"\n02000C06=\"Suglaudinimo laipsnis:\"\n\n02000C10=\"&Fone\"\n02000C11=\"&Pirminis procesas\"\n02000C12=\"&Laikinai sustabdyti\"\n02000C13=\"&Tęsti\"\n\n02000C20=\"Laikinai sustabdyta\"\n\n02000C30=\"Ar jūs esate tikri, kad norite atšaukti?\"\n\n; Compress dialog\n02000D00=\"Įtraukti į archyvą\"\n02000D01=\"&Archyvas:\"\n02000D02=\"Atna&ujinimo režimas:\"\n02000D03=\"Archyvo &formatas:\"\n02000D04=\"Glaudini&mo būdas:\"\n02000D05=\"Sukurti &vientisą archyvą\"\n02000D06=\"&Parametrai:\"\n02000D07=\"Nustatymai\"\n02000D08=\"Iš&sipakuojantis archyvas\"\n02000D09=\"Daugiagijiškumas\"\n02000D0A=\"Už&šifruoti failų pavadinimus\"\n02000D0B=\"Suglaudinimo &lygis:\"\n02000D0C=\"Žo&dyno dydis:\"\n02000D0D=\"Ž&odžio dydis:\"\n02000D0E=\"Atmintinės naudojimas suglaudinimui:\"\n02000D0F=\"Atmintinės naudojimas išskleidimui:\"\n02000D10=\"Šifravimas\"\n02000D11=\"Šifravimo metodas:\"\n02000D12=\"CPU gijų skaičius:\"\n02000D13=\"Vientiso bloko dydis:\"\n02000D14=\"Ne vientisas\"\n02000D15=\"Vientisas archyvas\"\n02000D16=\"Glaudinti dalijamus failus\"\n\n02000D40=\"Skaidyti į dalis bai&tais:\"\n02000D41=\"Neteisingas dalies dydis\"\n02000D42=\"Nurodytas dalies dydis: {0} baitai.\\nAr jūs esate įsitikinę, jog norite archyvą skaidyti į tokias dalis?\"\n\n02000D81=\"Mažiausias\"\n02000D82=\"Normalus\"\n02000D83=\"Didžiausias\"\n02000D84=\"Greitas\"\n02000D85=\"Greitesnis\"\n02000D86=\"Smarkiausias\"\n\n02000D90=\"Naršyti\"\n\n02000DA1=\"Įtraukti ir pakeisti failus\"\n02000DA2=\"Atnaujinti ir įtraukti failus\"\n02000DA3=\"Atnaujinti esančius failus\"\n02000DA4=\"Sinchronizuoti failus\"\n\n02000DB1=\"Visus failus\"\n\n02000DC0=\"Glaudinama\"\n\n; Columns dialog\n02000E00=\"Stulpeliai\"\n02000E01=\"Pasirinkite stulpelius, kuriuos norėtumėte matyti aplanke. Naudokite mygtukus Aukštyn ir Žemyn keisdami stulpelių tvarką.\"\n02000E02=\"Pasirinktas stulpelis turėtų būti\"\n02000E03=\"taškų &pločio.\"\n\n02000E10=\"&Aukštyn\"\n02000E11=\"Žemyn(&Z)\"\n02000E12=\"&Rodyti\"\n02000E13=\"&Slėpti\"\n02000E14=\"Nustatyti\"\n\n02000E81=\"Antraštė\"\n02000E82=\"Plotis\"\n\n; Testing\n02000F90=\"tikrinama\"\n\n\n; File Manager\n\n03000000=\"7-Zip failų tvarkyklė\"\n\n; Menu\n03000102=\"&Failas\"\n03000103=\"K&eisti\"\n03000104=\"&Rodyti\"\n03000105=\"Įran&kiai\"\n03000106=\"&Elektroninis žinynas\"\n03000107=\"Mėgi&amiausi\"\n\n; Failas\n03000210=\"&Atverti\"\n03000211=\"Atverti v&iduje\"\n03000212=\"Atverti iš&orėje\"\n03000220=\"&Rodyti\"\n03000221=\"K&eisti\"\n03000230=\"Pervadi&nti\"\n03000231=\"&Kopijuoti į...\"\n03000232=\"&Perkelti į...\"\n03000233=\"Šalin&ti\"\n03000240=\"Savy&bės\"\n03000241=\"Kome&ntuoti\"\n03000242=\"Skaičiuoti kontrolinę sumą\"\n03000250=\"Sukurti aplanką\"\n03000251=\"Sukurti failą\"\n03000260=\"Išei&ti\"\n03000270=\"&Skaidyti failą...\"\n03000271=\"Jungti &failus...\"\n\n; Edit\n03000310=\"Atša&ukti\"\n03000311=\"Paka&rtoti\"\n03000320=\"Iškirp&ti\"\n03000321=\"&Kopijuoti\"\n03000322=\"Į&dėti\"\n03000323=\"Išt&rinti\"\n03000330=\"Pažymėti &viską\"\n03000331=\"Nužymėti viską\"\n03000332=\"Atv&irkštinis žymėjimas\"\n03000333=\"Pasirikti...\"\n03000334=\"Atžymėti...\"\n03000335=\"Pasirinkti pagal tipą\"\n03000336=\"Atžymėti pagal tipą\"\n\n; View\n03000410=\"Did&elės piktogramos\"\n03000411=\"&Mažos piktogramos\"\n03000412=\"&Sąrašas\"\n03000413=\"&Išsamiai\"\n03000420=\"Nerūšiuotos\"\n03000430=\"Atverti pagrindinį aplanką\"\n03000431=\"Lygiu aukščiau\"\n03000432=\"Aplankų istorija...\"\n03000440=\"&Atnaujinti\"\n03000449=\"Nepaisyti aplankų\"\n03000450=\"&2 skydeliai\"\n03000451=\"&Parankinės\"\n03000460=\"Archyvo parankinė\"\n03000461=\"Standartinė parankinė\"\n03000462=\"Dideli mygtukai\"\n03000463=\"Rodyti mygtukų tekstą\"\n\n; Tools\n03000510=\"&Nuostatos...\"\n03000511=\"&Spartos bandymas\"\n\n; Help\n03000610=\"&Turinys...\"\n03000620=\"&Apie 7-Zip...\"\n\n; Favorites\n03000710=\"&Pridėti katalogą prie mėgiamiausiųjų kaip\"\n03000720=\"Mėgiamiausias\"\n\n; Options Dialog\n\n03010000=\"Nustatymai\"\n\n; Plugins\n03010100=\"Įskiepiai\"\n03010101=\"Įskie&piai:\"\n03010110=\"Nuostatos...\"\n\n; Edit\n03010200=\"Redaktorius\"\n03010201=\"R&edaktorius:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Susieti 7-Zip su:\"\n03010310=\"Įskiepis\"\n\n; Settings\n03010400=\"Nustatos\"\n03010401=\"Rodyti „..“ failų sąraše\"\n03010402=\"Rodyti tikras failų piktogramas\"\n03010410=\"Rodyti sisteminį meniu\"\n03010420=\"&Žymėti visą eilutę\"\n03010421=\"Rodyti tinklelio linija&s\"\n03010430=\"&Kitoks žymėjimo būdas\"\n03010440=\"Naudoti didžiu&lius atmintinės puslapius\"\n\n; Strings\n\n03020201=\"Kopijuoti\"\n03020202=\"Perkelti\"\n03020203=\"Kopijuoti į:\"\n03020204=\"Perkelti į:\"\n03020205=\"kopijuojama...\"\n03020206=\"perkeliama...\"\n03020207=\"Jūs negalite perkelti arba kopijuoti elementų šiuose aplankuose.\"\n03020208=\"Veiksmas nepalaikomas.\"\n03020209=\"Pasirinkite paskirties aplanką.\"\n\n03020210=\"Patvirtinkite failo šalinimą\"\n03020211=\"Patvirtinkite aplanko šalinimą\"\n03020212=\"Patvirtinkite kelių failų šalinimą\"\n03020213=\"Ar esate įsitikinę, jog norite pašalinti „{0}“?\"\n03020214=\"Ar esate įsitikinę, jog norite pašalinti „{0}“ aplanką ir visą jo turinį?\"\n03020215=\"Ar esate įsitikinę, jog norite pašalinti šiuos {0} elementus?\"\n03020216=\"šalinama...\"\n03020217=\"Klaida trinant failą ar aplanką\"\n\n03020220=\"pervadinama...\"\n03020221=\"Klaida pervadinant failą ar aplanką\"\n03020222=\"Failų kopijavimo patvirtinimas\"\n03020223=\"Ar jūs esate įsitikinę, jog norite kopijuoti failus į archyvą?\"\n\n03020230=\"Sukurti aplanką\"\n03020231=\"Aplanko pavadinimas:\"\n03020232=\"Naujas aplankas\"\n03020233=\"Klaida kuriant aplanką\"\n\n03020240=\"Sukurti failą\"\n03020241=\"Failo pavadinimas:\"\n03020242=\"Naujas failas\"\n03020243=\"Klaida kuriant failą\"\n\n03020250=\"Pasirinkti\"\n03020251=\"Nesirinkti\"\n03020252=\"Šablonas:\"\n\n03020260=\"Aplankų istorija\"\n\n03020280=\"Failas „{0}“ buvo pakeistas.\\nAr norite ją atnaujinti archyve?\"\n03020281=\"Negalima atnaujinti failo\\n„{0}“\"\n03020282=\"Negalima paleisti redaktoriaus.\"\n03020283=\"Atidaroma...\"\n\n03020290=\"Komentaras\"\n03020291=\"&Komentaras:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Kompiuteris\"\n03020301=\"Tinklas\"\n\n03020400=\"Glaudinti\"\n03020401=\"Išskleisti\"\n03020402=\"Bandyti\"\n\n03020420=\"Kopijuoti\"\n03020421=\"Perkelti\"\n03020422=\"Šalinti\"\n03020423=\"Informacija\"\n\n03020500=\"Skaidyti failą\"\n03020501=\"&Skaidyti į:\"\n03020510=\"skaidoma...\"\n03020520=\"Skaidymo patvirtinimas\"\n03020521=\"Ar jūs esate įsitikinę, jog norite failą skaidyti į {0} dalis?\"\n03020522=\"Dalies dydis privalo būti mažesnis už dalijamo failo dydį\"\n\n03020600=\"Sujungti failus\"\n03020601=\"&Sujungti į:\"\n03020610=\"sujungiami failai...\"\n03020620=\"Pažymėkite tik pirmą failą\"\n\n03020710=\"kontrolinės sumos skaičiavimas...\"\n03020720=\"Kontrolinės sumos informacija\"\n03020721=\"Duomenų CRC kontrolinė suma:\"\n03020722=\"Duomenų ir failų pavadinimų CRC kontrolinė suma:\"\n\n03020800=\"skenuojama...\"\n\n03020900=\"Nuostatos\"\n\n; Computer\n03031100=\"Visas dydis\"\n03031101=\"Laisva vieta\"\n03031102=\"Blokinio dydis\"\n03031103=\"Pavadinimas\"\n\n; Network\n03031200=\"Vietinis pavadinimas\"\n03031201=\"Tiekėjas\"\n\n; Benchmark Dialog\n\n03080000=\"Spartos bandymas\"\n03080001=\"Atmintinės naudojimas:\"\n03080002=\"Suglaudinama\"\n03080003=\"Išskleidžiama\"\n03080004=\"Sparta\"\n03080005=\"Vertinimas\"\n03080006=\"Galutinis vertinimas\"\n03080007=\"Dabartinis\"\n03080008=\"Vidutinis\"\n03080009=\"Kartai:\"\n0308000A=\"Klaidos:\"\n0308000B=\"CPU naudojimas\"\n0308000C=\"Reitingas / naudojimas\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/lv.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.10 beta\n; Translated by Armands Radzuška\n;\n;\n;\n;\n\n00000000=\"Latvian\"\n00000001=\"Latviešu\"\n00000002=\"38\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip konfigurācija\"\n\n; Info Page\n01000100=\"Par 7-Zip\"\n01000103=\"7-Zip ir bezmaksas programma, tomēr, reģistrējoties jūs varat 7-Zip izstrādāšanu atbalstīt.\"\n01000105=\"&Reģistrēties\"\n\n; Folders Page\n01000200=\"Mapes\"\n01000210=\"&Darba mape\"\n01000211=\"&Sistēmas pagaidfailu mape\"\n01000212=\"&Tekošā\"\n01000213=\"&Noteikt:\"\n01000214=\"&Izmantot tikai maināmajiem nesējiem\"\n\n01000281=\"Norādiet vietu arhīvu pagaidfailiem.\"\n\n; System Page\n01000300=\"Sistēma\"\n01000301=\"&Integrēt 7-Zip Windows vides kontekstizvēlē\"\n01000302=\"&Kaskādveida kontekstizvēle\"\n01000310=\"Kontekstizvēles elementi:\"\n\n; Language Page\n01000400=\"Valoda\"\n01000401=\"Valoda:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip komandas\"\n02000103=\"Atvērt arhīvu\"\n02000104=\"Atver izvēlēto arhīvu.\"\n02000105=\"Izvilkt failus...\"\n02000106=\"Izvelk failus no izvēlētā arhīva.\"\n02000107=\"Ielikt arhīvā...\"\n02000108=\"Pievieno izvēlētās vienības arhīvam.\"\n02000109=\"Pārbaudīt arhīvu\"\n0200010A=\"Pārbauda izvēlētā arhīva veselumu.\"\n0200010B=\"Izvilkt šeit\"\n0200010C=\"Failus no izvēlētā arhīva izvelk patreizējā mapē.\"\n0200010D=\"Izvilkt {0} mapē\"\n0200010E=\"Izvelk failus apakšmapē.\"\n0200010F=\"Ielikt {0}\"\n02000110=\"Ieliek izvēlētos elementus arhīvā.\"\n02000111=\"Saspiest, sūtīt pa e-pastu...\"\n02000112=\"Ieliek izvēlētās vienības arhīvā un sūta arhīvu pa e-pastu.\"\n02000113=\"Saspiest {0}, sūtīt pa e-pastu\"\n02000114=\" Ieliek izvēlētās vienības arhīvā un sūta arhīvu pa e-pastu.\"\n\n02000140=\"<Mape>\"\n02000141=\"<Arhīvs>\"\n\n; Properties\n02000203=\"Ceļš\"\n02000204=\"Nosaukums\"\n02000205=\"Paplašinājums\"\n02000206=\"Mape\"\n02000207=\"Lielums\"\n02000208=\"Saspiests\"\n02000209=\"Atribūti\"\n0200020A=\"Izveidots\"\n0200020B=\"Atvērts\"\n0200020C=\"Pārveidots\"\n0200020D=\"Blīvs\"\n0200020E=\"Piezīmes\"\n0200020F=\"Šifrēts\"\n02000210=\"Dalīts pirms\"\n02000211=\"Dalīts pēc\"\n02000212=\"Vārdnīca\"\n02000213=\"CRC\"\n02000214=\"Veids\"\n02000215=\"Anti\"\n02000216=\"Paņēmiens\"\n02000217=\"Sistēma\"\n02000218=\"Failu sistēma\"\n02000219=\"Lietotājs\"\n0200021A=\"Grupa\"\n0200021B=\"Bloks\"\n0200021C=\"Piezīmes\"\n0200021D=\"Pozīcija\"\n\n; Status bar\n02000301=\"Iezīmēts(i) {0} objekts(i)\"\n02000302=\"{0} objekts(i)\"\n\n; List Context Menu\n02000401=\"&Stabiņi...\"\n\n02000411=\"&Atvērt\"\n02000412=\"&Izvilkt...\"\n\n; ToolBar\n02000501=\"Izvilkšana\"\n\n; Messages\n02000601=\"Šis arhīvs neatbalsta pārveidošanu.\"\n02000602=\"Arhīvu {0} neizdevās pārveidot.\"\n02000603=\"Mapi '{0}' neizdevās izveidot.\"\n02000604=\"Fails nav atbalstīts arhīvs.\"\n02000605=\"Kļūda\"\n02000606=\"Par daudz vienību.\"\n02000607=\"Ar doto faila paplašinājumu neviena programma nav saistīta.\"\n02000608=\"Kļūdu nav.\"\n\n; Dialogs\n02000702=\"&Labi\"\n02000705=\"&Jā\"\n02000707=\"Jā &visiem\"\n02000709=\"&Nē\"\n0200070B=\"Nē v&isiem\"\n\n02000710=\"&Atcelt\"\n02000711=\"&Atcelt\"\n02000713=\"Aiz&vērt\"\n02000714=\"Stop\"\n02000715=\"Pārstartēt\"\n\n02000720=\"&Rokasgrāmata\"\n\n; Extract dialog\n02000800=\"Izvilkšana\"\n02000801=\"&Izvilkt uz:\"\n02000802=\"&Parole\"\n\n02000810=\"Ceļi\"\n02000811=\"Pilni &ceļu nosaukumi\"\n02000812=\"Patreizējie ceļu &nosaukumi\"\n02000813=\"&Bez ceļu nosaukumiem\"\n\n02000820=\"Pārrakstīšana\"\n02000821=\"&Jautāt pirms pārrakstīšanas\"\n02000822=\"Pārra&kstīt bez jautāšanas\"\n02000823=\"I&zlaist esošos failus\"\n02000824=\"A&utopārdēvēšana\"\n02000825=\"Automātiski pārdēvēt esošos failu\"\n\n02000830=\"Faili\"\n02000831=\"&Iezīmētie faili\"\n02000832=\"&Visi faili\"\n\n02000881=\"Norādiet vietu izvelkamiem failiem.\"\n\n02000890=\"Izvilkšana\"\n\n; Overwrite dialog\n02000900=\"Apstipriniet faila aizvietošanu\"\n02000901=\"Mērķa mape jau satur apstrādājamo failu.\"\n02000902=\"Vai vēlaties aizvietot esošo failu\"\n02000903=\"ar šo?\"\n\n02000911=\"Autopārdēvēšana\"\n\n02000982=\"{0} baiti\"\n02000983=\"pārveidots\"\n\n; Messages dialog\n02000A00=\"Diagnostikas paziņojumi\"\n\n02000A80=\"Paziņojums\"\n\n02000A91=\"Neatbalstīts saspiešanas paņēmiens '{0}' failam.\"\n02000A92=\"Datu kļūda '{0}'. Fails ir bojāts.\"\n02000A93=\"CRC kļūda '{0}'. Fails ir bojāts.\"\n\n; Password dialog\n02000B00=\"Paroles ievadīšana\"\n02000B01=\"Ievadiet paroli:\"\n02000B02=\"Par&ole redzama\"\n\n; Progress dialog\n02000C00=\"Process\"\n02000C01=\"Pagājušais laiks:\"\n02000C02=\"Atlikušais laiks:\"\n02000C03=\"Lielums:\"\n02000C04=\"Ātrums:\"\n\n02000C10=\"&Fonā\"\n02000C11=\"&Priekšplānā\"\n02000C12=\"Pa&uze\"\n02000C13=\"&Turpināt\"\n\n02000C20=\"Pauzēts\"\n\n02000C30=\"Vai piekrītat pārtraukt šo darbību?\"\n\n; Compress dialog\n02000D00=\"Pievienošana arhīvam\"\n02000D01=\"Ar&hīvs:\"\n02000D02=\"Pār&veidošanas režīms:\"\n02000D03=\"Arhīva &formāts:\"\n02000D04=\"&Saspiešanas paņēmiens:\"\n02000D05=\"Izveidot &blīvo arhīvu\"\n02000D06=\"Parame&tri:\"\n02000D07=\"&Uzstādījumi\"\n02000D08=\"Izveidot SF&X arhīvu\"\n02000D09=\"&Multiplūsmas\"\n02000D0A=\"Šifrēt failu &nosaukumus\"\n02000D0B=\"&Saspiešanas līmenis:\"\n02000D0C=\"&Vārdnīcas lielums:\"\n02000D0D=\"Vār&da lielums:\"\n02000D0E=\"Atmiņa arhivēšanai:\"\n02000D0F=\"Atmiņa atarhivēšanai:\"\n\n02000D40=\"&Dalīt sējumos, baitos:\"\n\n02000D81=\"Uzkrāšana nesaspiežot\"\n02000D82=\"Parastais\"\n02000D83=\"Maksimālā saspiešana\"\n02000D84=\"Ātrais\"\n02000D85=\"Ātrākais\"\n02000D86=\"Ultra\"\n\n02000D90=\"Pārlūkošana\"\n\n02000DA1=\"Pievienot un aizvietot failus\"\n02000DA2=\"Atjaunināt un pievienot failus\"\n02000DA3=\"Atjaunināt esošos failus\"\n02000DA4=\"Sinhronizēt failus\"\n\n02000DB1=\"Visi faili\"\n\n02000DC0=\"saspiešana\"\n\n; Columns dialog\n02000E00=\"Stabiņi\"\n02000E01=\"Atzīmējiet stabiņus, ko Jūs vēlaties redzēt šai skatā. Izmantojiet pogas „Uz augšu” un „Uz leju” stabiņu pārkārtošanai pēc savas gaumes.\"\n02000E02=\"Iezīmētajiem stabiņiem jābūt\"\n02000E03=\"pikseļus &platiem.\"\n\n02000E10=\"Uz a&ugšu\"\n02000E11=\"Uz &leju\"\n02000E12=\"Pa&rādīt\"\n02000E13=\"Pa&slēpt\"\n02000E14=\"Uzstādīt\"\n\n000E81=\"Nosaukums\"\n02000E82=\"Platums\"\n\n; Testing\n02000F90=\"Pārbaude\"\n\n\n; File Manager\n\n03000000=\"7-Zip failu pārzinis\"\n\n; Menu\n03000102=\"&Fails\"\n03000103=\"&Labošana\"\n03000104=\"&Izskats\"\n03000105=\"&Rīki\"\n03000106=\"&Palīdzība\"\n03000107=\"Ie&cienītās\"\n\n; File\n03000210=\"&Atvērt\"\n03000211=\"Atvērt &iekšpusē\"\n03000212=\"Atvērt ārp&usē\"\n03000220=\"Ap&skate\"\n03000221=\"&Labot\"\n03000230=\"Pā&rdēvēt\"\n03000231=\"&Kopēt uz...\"\n03000232=\"Pār&vietot uz...\"\n03000233=\"&Dzēst\"\n03000240=\"Īpašī&bas\"\n03000241=\"&Piezīmes\"\n03000250=\"Izveidot &mapi\"\n03000251=\"Izveidot &failu\"\n03000260=\"&Beigt\"\n03000270=\"&Sadalīt failu...\"\n03000271=\"Ap&vienot failus...\"\n\n; Edit\n03000310=\"&Atcelt\"\n03000311=\"At&jaunot\"\n03000320=\"&Izgriezt\"\n03000321=\"&Kopēt\"\n03000322=\"Ieviet&ot\"\n03000323=\"&Dzēst\"\n03000330=\"Iezīmēt &visu\"\n03000331=\"Atcelt vis&u\"\n03000332=\"I&nvertēt iezīmējumu\"\n03000333=\"Ie&zīmēt...\"\n03000334=\"&Atcelt...\"\n03000335=\"I&ezīmēt pēc tipa\"\n03000336=\"A&tcelt pēc tipa\"\n\n; View\n03000410=\"&Lielas ikonas\"\n03000411=\"&Mazas ikonas\"\n03000412=\"&Saraksts\"\n03000413=\"Sī&kāk\"\n03000420=\"&Nešķirot\"\n03000430=\"&Atvērt saknes mapi\"\n03000431=\"Līmeni &uz augšu\"\n03000432=\"Mapju &vēsture...\"\n03000440=\"&Pārlasīt\"\n03000450=\"&2 paneļi\"\n03000451=\"&Rīku joslas\"\n03000460=\"Arhīva rīku josla\"\n03000461=\"Standarta rīku josla\"\n03000462=\"Lielas pogas\"\n03000463=\"Parādīt pogu tekstu\"\n\n; Tools\n03000510=\"&Uzstādījumi...\"\n03000511=\"&Darbspējas pārbaude\"\n\n; Help\n03000610=\"&Rokasgrāmatas saturs...\"\n03000620=\"&Par 7-Zip...\"\n\n; Favorites\n03000710=\"&Pievienot mapi iecienītajām kā\"\n03000720=\"Iecienītās\"\n\n; Options Dialog\n\n03010000=\"Uzstādījumi\"\n\n; Plugins\n03010100=\"Iespraudņi\"\n03010101=\"Iespraudņi:\"\n03010110=\"&Uzstādījumi...\"\n\n; Edit\n03010200=\"Labošana\"\n03010201=\"&Labošanas programma:\"\n\n; System\n03010300=\"Sistēma\"\n03010302=\"Piesaistīt 7-Zip pie:\"\n03010310=\"Iespraudnis\"\n\n; Settings\n03010400=\"Uzstādījumi\"\n03010401=\"Parādīt \\\"..\\\" &vienību\"\n03010402=\"Parādīt īstās &failu ikonas\"\n03010410=\"Parādīt &sistēmas izvēli\"\n03010420=\"&Pilnas rindas iezīmēšana\"\n03010421=\"Parādīt at&dalošās līnijas\"\n\n; Strings\n\n03020201=\"Kopēt\"\n03020202=\"Pārvietot\"\n03020203=\"Kopēt uz:\"\n03020204=\"Pārvietot uz:\"\n03020205=\"Kopēšana...\"\n03020206=\"Pārvietošana...\"\n03020207=\"Vienības uz šīm mapēm nevar kopēt vai pārvietot.\"\n03020208=\"Darbība nav atbalstīta.\"\n\n03020210=\"Faila dzēšanas apstiprinājums\"\n03020211=\"Mapes dzēšanas apstiprinājums\"\n03020212=\"Vairāku failu dzēšanas apstiprinājums\"\n03020213=\"Vai piekrītat '{0}' dzēšanai?\"\n03020214=\"Vai piekrītat mapes '{0}' un visa tās satura dzēšanai?\"\n03020215=\"Vai piekrītat šo {0} vienību dzēšanai?\"\n03020216=\"Dzēšana...\"\n03020217=\"Faila vai mapes dzēšanas kļūda\"\n\n03020220=\"Pārdēvēšana...\"\n03020221=\"Faila vai mapes pārdēvēšanas kļūda\"\n\n03020230=\"Mapes izveidošana\"\n03020231=\"Mapes nosaukums:\"\n03020232=\"Jauna mape\"\n03020233=\"Mapes izveidošanas kļūda\"\n\n03020240=\"Faila izveidošana\"\n03020241=\"Faila nosaukums:\"\n03020242=\"Jauns fails\"\n03020243=\"Faila izveidošanas kļūda\"\n\n03020250=\"Iezīmēšana\"\n03020251=\"Iezīmējuma atcelšana\"\n03020252=\"Šablons:\"\n\n03020260=\"Mapju vēsture\"\n\n03020280=\"Fails '{0}' ir pārveidots.\\nVai vēlaties to atjaunināt arī arhīvā?\"\n03020281=\"Failu nav iespējams uzlabot\\n'{0}'\"\n03020282=\"Nav iespējams palaist labošanas programmu.\"\n03020283=\"Atvēršana...\"\n\n03020290=\"Piezīmes\"\n03020291=\"&Piezīmes:\"\n\n030202A0=\"Sistēma\"\n\n03020300=\"Dators\"\n03020301=\"Tīkls\"\n\n03020400=\"Ievietot\"\n03020401=\"Izvilkt\"\n03020402=\"Pārbaude\"\n\n03020420=\"Kopēt\"\n03020421=\"Ppārvietot\"\n03020422=\"Dzēst\"\n03020423=\"Info\"\n\n03020500=\"Sadalīt failu\"\n03020501=\"&Dalīt uz:\"\n03020510=\"Dalīšana...\"\n\n03020600=\"Apvienot failus\"\n03020601=\"&Apvienot uz:\"\n03020610=\"Apvienošana...\"\n\n; Computer\n03031100=\"Tilpums\"\n03031101=\"Brīvā vieta\"\n03031102=\"Klāstera lielums\"\n03031103=\"Nosaukums\"\n\n; Network\n03031200=\"Lokālais nosaukums\"\n03031201=\"Provaiders\"\n\n; Benchmark Dialog\n\n03080000=\"Darpspējības pārbaude\"\n03080001=\"Atmiņas pielietojums:\"\n03080002=\"Arhivēšana\"\n03080003=\"Atarhivēšana\"\n03080004=\"Ātrums\"\n03080005=\"Vērtējums\"\n03080006=\"Kopējais vērtējums\"\n03080007=\"Patreizējais\"\n03080008=\"Rezultējošais\"\n03080009=\"Izdošanās:\"\n0308000A=\"Kļūdas:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/mk.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.09 beta\n; Translated by Gabriel Stojanoski\n; Преведено од Габриел Стојаноски\n;\n;\n;\n\n00000000=\"Macedonian\"\n00000001=\"Македонски\"\n00000002=\"47\"\n\n; 7-Zip Подесување\n\n; Title\n01000000=\"7-Zip Подесување\"\n\n; Info Page\n01000100=\"За 7-Zip\"\n01000103=\"7-Zip е бесплатен архивер. Меѓутоа, вие можете да дадете поддршка на понатамошното развивање на 7-Zip со вашето  регистрирање.\"\n01000105=\"Регистрирај\"\n\n; Folders Page\n01000200=\"Директориуми\"\n01000210=\"&Работен директориум\"\n01000211=\"&Системски привремен директориум\"\n01000212=\"&Моментален\"\n01000213=\"&Одреди:\"\n01000214=\"Само за преносни уреди\"\n\n01000281=\"Одреди локација за привремените архивски датотеки.\"\n\n; System Page\n01000300=\"Систем\"\n01000301=\"Интегрирај го 7-Zip во додатно мени\"\n01000302=\"Каскадно додатно мени\"\n01000310=\"Во додатното мени:\"\n\n; Language Page\n01000400=\"Јазик\"\n01000401=\"Јазик:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip команди\"\n02000103=\"Отвори архива\"\n02000104=\"Ја отвора селектираната архива.\"\n02000105=\"Отпакувај датотеки...\"\n02000106=\"Отпакува датотеки од селектираната архива.\"\n02000107=\"Додади во Архива...\"\n02000108=\"Ги додава селектираните датотеки во архива.\"\n02000109=\"Тестирај архива\"\n0200010A=\"Ја тестира селектираната архива.\"\n0200010B=\"Отпакувај овде\"\n0200010C=\"Отпакува датотеки од избраната архива во моменталниот директориум.\"\n0200010D=\"Отпакувај во {0}\"\n0200010E=\"Отпакува датотеки во поддиректориум.\"\n0200010F=\"Додади во {0}\"\n02000110=\"Ги додава одредените датотеки во архива.\"\n02000111=\"Компресирај и прати на e-mail...\"\n02000112=\"Ги компресира датотеките во архива и архивата ја испраќа преку e-mail.\"\n02000113=\"Компресирај во {0} и испрати\"\n02000114=\"Ги компресира датотеките во архива и архивата ја испраќа преку e-mail.\"\n\n02000140=\"<Директориум>\"\n02000141=\"<Архива>\"\n\n; Properties\n02000203=\"Патека\"\n02000204=\"Име\"\n02000205=\"Екстензија\"\n02000206=\"Директориум\"\n02000207=\"Големина\"\n02000208=\"Пакувана Големина\"\n02000209=\"Атрибути\"\n0200020A=\"Креирано\"\n0200020B=\"Пристапено\"\n0200020C=\"Променето\"\n0200020D=\"Целосна\"\n0200020E=\"Објаснета\"\n0200020F=\"Енкриптирана\"\n02000210=\"Подели Пред\"\n02000211=\"Подели После\"\n02000212=\"Речник\"\n02000213=\"CRC\"\n02000214=\"Тип\"\n02000215=\"Анти\"\n02000216=\"Метод\"\n02000217=\"Оперативен Систем\"\n02000218=\"Датотечен Систем\"\n02000219=\"Корисник\"\n0200021A=\"Група\"\n0200021B=\"Блок\"\n0200021C=\"Коментар\"\n0200021D=\"Позиција\"\n\n; Status bar\n02000301=\"{0} објект(и) избрано\"\n02000302=\"{0} објект(и)\"\n\n; List Context Menu\n02000401=\"&Колони...\"\n\n02000411=\"&Отвори\"\n02000412=\"От&пакувај...\"\n\n; ToolBar\n02000501=\"Отпакувај\"\n\n; Messages\n02000601=\"Оваа операција не е поддржана за овој тип на архива.\"\n02000602=\"Не е можно обновување на архивата {0}\"\n02000603=\"Не е можно креирање на директориумот '{0}'\"\n02000604=\"Датотеката не е поддржана архива.\"\n02000605=\"Грешка\"\n02000606=\"Премногу објекти\"\n02000607=\"Нема програма придружена со оваа екстензија\"\n02000608=\"Нема грешки\"\n\n; Dialogs\n02000702=\"Ок\"\n02000705=\"&Да\"\n02000707=\"Да &Сите\"\n02000709=\"&Не\"\n0200070B=\"Не Н&иедна\"\n\n02000710=\"Откажи\"\n02000711=\"&Откажи\"\n02000713=\"&Затвори\"\n02000714=\"Стоп\"\n02000715=\"Рестартирај\"\n\n02000720=\"Помош\"\n\n; Extract dialog\n02000800=\"Отпакувај\"\n02000801=\"Отпакувај &во:\"\n02000802=\"Лозинка\"\n\n02000810=\"Патеки\"\n02000811=\"Целосна патека\"\n02000812=\"Моментална патека\"\n02000813=\"Без патека\"\n\n02000820=\"Презапишување\"\n02000821=\"Прашај пред да презапишеш\"\n02000822=\"Презапиши без прашување\"\n02000823=\"Изостави постоечки датотеки\"\n02000824=\"Автоматски преименувај\"\n02000825=\"Автоматски преименувај постоечки датотеки\"\n\n02000830=\"Датотеки\"\n02000831=\"&Избрани датотеки\"\n02000832=\"&Сите датотеки\"\n\n02000881=\"Одреди локација за отпакуваните датотеки.\"\n\n02000890=\"Отпакување\"\n\n; Overwrite dialog\n02000900=\"Потврди Замена на Датотеки\"\n02000901=\"Конечниот директориум веќе ја содржи датотеката.\"\n02000902=\"Дали сакате да ја замените постоечката датотека\"\n02000903=\"со оваа?\"\n\n02000911=\"&Автоматски преименувај\"\n\n02000982=\"{0} бајти\"\n02000983=\"променета на\"\n\n; Messages dialog\n02000A00=\"Дијагноза\"\n\n02000A80=\"Порака\"\n\n02000A91=\"Неподдржан метод за компресија за '{0}'.\"\n02000A92=\"Грешка во податоците во '{0}'. Датотеката е оштетена.\"\n02000A93=\"CRC грешка во '{0}'. Датотеката е оштетена.\"\n\n; Password dialog\n02000B00=\"Внеси лозинка\"\n02000B01=\"Внеси лозинка:\"\n02000B02=\"&Прикажи ја лозинката\"\n\n; Progress dialog\n02000C00=\"Процесирај\"\n02000C01=\"Поминато време:\"\n02000C02=\"Преостанато време:\"\n02000C03=\"Големина:\"\n02000C04=\"Брзина:\"\n\n02000C10=\"По&задина\"\n02000C11=\"&Напред\"\n02000C12=\"&Пауза\"\n02000C13=\"П&родолжи\"\n\n02000C20=\"Паузирано\"\n\n02000C30=\"Дали сигурно сакате да откажете?\"\n\n; Compress dialog\n02000D00=\"Додади во архива\"\n02000D01=\"&Архива:\"\n02000D02=\"&Додавање:\"\n02000D03=\"&Формат на Архива:\"\n02000D04=\"&Метод на компресија:\"\n02000D05=\"Креирај &Целосна архива\"\n02000D06=\"&Параметри:\"\n02000D07=\"Опции\"\n02000D08=\"Креирај SFX ар&хива\"\n02000D09=\"Multi-threading\"\n02000D0A=\"&Енкриптирај ги имињата\"\n02000D0B=\"&Ниво на компресија:\"\n02000D0C=\"Големина на &речникот:\"\n02000D0D=\"Големина на &зборот:\"\n02000D0E=\"Искорист мемор за компрес:\"\n02000D0F=\"Искорист мемор за декомпрес:\"\n\n02000D40=\"&Подели на делови, бајти:\"\n\n02000D81=\"Спакувај\"\n02000D82=\"Нормално\"\n02000D83=\"Максимално\"\n02000D84=\"Брзо\"\n02000D85=\"Најбрзо\"\n02000D86=\"Ултра\"\n\n02000D90=\"Барај\"\n\n02000DA1=\"Додади и замени датотеки\"\n02000DA2=\"Обнови и додади датотеки\"\n02000DA3=\"Обнови ги постоечките датотеки\"\n02000DA4=\"Синхронизирај ги датотеките\"\n\n02000DB1=\"Сите Датотеки\"\n\n02000DC0=\"Компресирање\"\n\n; Columns dialog\n02000E00=\"Колони\"\n02000E01=\"Селектирај ги колоните што сакаш да бидат видливи во овој директориум. Употреби ги Нагоре и Надолу копчињата за да ги преуредиш колоните.\"\n02000E02=\"Избраната колона треба да биде\"\n02000E03=\"пиксели &широка.\"\n\n02000E10=\"На&горе\"\n02000E11=\"На&долу\"\n02000E12=\"&Прикажи\"\n02000E13=\"&Сокриј\"\n02000E14=\"Стави\"\n\n02000E81=\"Име\"\n02000E82=\"Ширина\"\n\n; Testing\n02000F90=\"Тестирање\"\n\n\n; File Manager\n\n03000000=\"7-Zip Менаџер\"\n\n; Menu\n03000102=\"&Датотека\"\n03000103=\"&Уреди\"\n03000104=\"&Изглед\"\n03000105=\"&Алатки\"\n03000106=\"&Помош\"\n03000107=\"&Омилени\"\n\n; File\n03000210=\"&Отвори\"\n03000211=\"Отвори &Внатре\"\n03000212=\"Отвори &Надвор\"\n03000220=\"&Поглед\"\n03000221=\"&Уреди\"\n03000230=\"&Преименувај\"\n03000231=\"&Копирај Во...\"\n03000232=\"&Премести Во...\"\n03000233=\"&Избриши\"\n03000240=\"&Карактеристики\"\n03000241=\"К&оментар\"\n03000250=\"Креирај Директориум\"\n03000251=\"Креирај Датотека\"\n03000260=\"&Излези\"\n03000270=\"&Подели датотека...\"\n03000271=\"Ком&бинирај датотеки...\"\n\n; Edit\n03000310=\"&Undo\"\n03000311=\"&Redo\"\n03000320=\"Пре&сечи\"\n03000321=\"&Копирај\"\n03000322=\"&Залепи\"\n03000323=\"&Избриши\"\n03000330=\"Селектирај &Се\"\n03000331=\"Деселектирај Се\"\n03000332=\"&Обратна Селекција\"\n03000333=\"Селектирај...\"\n03000334=\"Деселектирај...\"\n03000335=\"Селектирај по Тип\"\n03000336=\"Деселектирај по Тип\"\n\n; View\n03000410=\"&Големи Икони\"\n03000411=\"&Мали Икони\"\n03000412=\"&Листа\"\n03000413=\"&Детали\"\n03000420=\"Неподредени\"\n03000430=\"Отвори го основниот директориум\"\n03000431=\"Едно Ниво Нагоре\"\n03000432=\"Историја на Директориумите...\"\n03000440=\"&Обнови\"\n03000450=\"&2 Панели\"\n03000451=\"&Алатници\"\n03000460=\"Алатница на Архивата\"\n03000461=\"Стандардна Алатница\"\n03000462=\"Големи Копчиња\"\n03000463=\"Текст На Копчињата\"\n\n; Tools\n03000510=\"&Опции...\"\n03000511=\"&Тест\"\n\n; Help\n03000610=\"&Содржина...\"\n03000620=\"&За 7-Zip...\"\n\n; Favorites\n03000710=\"&Додади го директориумот во Омилени\"\n03000720=\"Забелешки\"\n\n; Options Dialog\n\n03010000=\"Опции\"\n\n; Plugins\n03010100=\"Плагини\"\n03010101=\"&Плагини:\"\n03010110=\"Опции...\"\n\n; Edit\n03010200=\"Едитор\"\n03010201=\"&Едитор:\"\n\n; System\n03010300=\"Систем\"\n03010302=\"Придружи го 7-Zip со:\"\n03010310=\"Плагин\"\n\n; Settings\n03010400=\"Подесувања\"\n03010401=\"Прикажи \\\"..\\\" предмет\"\n03010402=\"Прикажи вистински икони\"\n03010410=\"Прикажи системско мени\"\n03010420=\"&Селектирај &цел ред\"\n03010421=\"Прикажи &мрежа\"\n\n; Strings\n\n03020201=\"Копирај\"\n03020202=\"Премести\"\n03020203=\"Копирај Во:\"\n03020204=\"Премести Во:\"\n03020205=\"Копирање...\"\n03020206=\"Преместување...\"\n03020207=\"Не е можно преместување или копирање на предмети од вакви директориуми.\"\n03020208=\"Постапката не е поддржана.\"\n\n03020210=\"Потврдете го Бришењето на Датотеката\"\n03020211=\"Потврдете го Бришењето на Директориумот\"\n03020212=\"Потврдете го бришењето на повеќе датотеки\"\n03020213=\"Дали сте сигурни за бришењето на '{0}'?\"\n03020214=\"Дали сте сигурни за бришењето на директориумот '{0}' и неговата содржина?\"\n03020215=\"Дали сте сигурни за бришењето на овие {0} датотеки?\"\n03020216=\"Бришење...\"\n03020217=\"Грешка при бришењето на Датотеката или Директориумот\"\n\n03020220=\"Преименување...\"\n03020221=\"Грешка при преименувањето на Датотеката или Директориумот\"\n\n03020230=\"Креирај Директориум\"\n03020231=\"Име на Директориумот:\"\n03020232=\"Нов Директориум\"\n03020233=\"Грешка при креирањето на Директориумот\"\n\n03020240=\"Креирај датотека\"\n03020241=\"Име на Датотеката:\"\n03020242=\"Нова датотека\"\n03020243=\"Грешка при креирањето на датотеката\"\n\n03020250=\"Селектирај\"\n03020251=\"Деселектитај\"\n03020252=\"Маскирај:\"\n\n03020260=\"Историја на Директориумите\"\n\n03020280=\"Датотеката '{0}' е модифицирана.\\nДали сакате да ја обновите во архивата?\"\n03020281=\"Не е можно обновување на датотеката\\n'{0}'\"\n03020282=\"Грешка при стартување на Едиторот.\"\n03020283=\"Отворање...\"\n\n03020290=\"Коментар\"\n03020291=\"&Коментар:\"\n\n030202A0=\"Систем\"\n\n03020300=\"Компјутер\"\n03020301=\"Мрежа\"\n\n03020400=\"Додади\"\n03020401=\"Отпакувај\"\n03020402=\"Тестирај\"\n\n03020420=\"Копирај\"\n03020421=\"Премести\"\n03020422=\"Избриши\"\n03020423=\"Инфо\"\n\n03020500=\"Подели датотека\"\n03020501=\"&Подели на:\"\n03020510=\"Делење...\"\n\n03020600=\"Состави Датотеки\"\n03020601=\"&Состави на:\"\n03020610=\"Составување...\"\n\n; Computer\n03031100=\"Вкупна Големина\"\n03031101=\"Слободен Простор\"\n03031102=\"Голем на Кластерите\"\n03031103=\"Етикета\"\n\n; Network\n03031200=\"Име\"\n03031201=\"Провајдер\"\n\n; Benchmark Dialog\n\n03080000=\"Тест\"\n03080001=\"Искорист Меморија:\"\n03080002=\"Компресирање\"\n03080003=\"Декомпресирање\"\n03080004=\"Брзина\"\n03080005=\"Проценка\"\n03080006=\"Вкупна Проценка\"\n03080007=\"Моментално\"\n03080008=\"Резултат\"\n03080009=\"Поминато:\"\n0308000A=\"Грешки:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/mn.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 3.12\n; Translated by Bayar\n; Update and Spelling corrected Bayarsaikhan\n;\n;\n;\n\n00000000=\"Mongolian\"\n00000001=\"Монгол хэл\"\n00000002=\"80\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip тохируулга\"\n\n; Info Page\n01000100=\"7-Zip-ийн тухай\"\n01000103=\"7-Zip бол үнэгүй програм. Гэлээ ч та 7-Зип-д бүртгүүлэн хөгжүүлэгчдийг дэмжиж болно. Бүртгүүлсэн хэрэглэгчид техникийн дэмжлэг авах болно.\"\n01000104=\"Дэмжлэг\"\n01000105=\"Бүртгүүлэх\"\n\n; Folders Page\n01000200=\"Хавтсууд\"\n01000210=\"&Ажлын хавтас\"\n01000211=\"&Систем\\завсрын хавтас\"\n01000212=\"&Одоогийн\"\n01000213=\"&Тодорхойлсон:\"\n01000214=\"Зөвхөн зөөврийн төхөөрөмж хэрэглэх\"\n\n01000281=\"Завсрын архив файл үүсгэх байрлалыг тодорхойл.\"\n\n; System Page\n01000300=\"Систем\"\n01000301=\"7-Зип-ийг шелл контекст цэстэй нийлүүлэх\"\n01000302=\"Контекст цэсийг цувуулан харуул\"\n01000310=\"Контекст цэсийн төрлүүд:\"\n\n; Language Page\n01000400=\"Хэл\"\n01000401=\"Хэл:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Зип\"\n02000102=\"7-Зип тушаалууд\"\n02000103=\"Архив нээх\"\n02000104=\"Сонгосон архив нээх.\"\n02000105=\"Файлуудыг задал...\"\n02000106=\"Сонгосон архиваас файлыг задал.\"\n02000107=\"Архивт нэм...\"\n02000108=\"Сонгосон зүйлүүдээ архивт нэм.\"\n02000109=\"Архивийн шалгалт\"\n0200010A=\"Сонгогдсон архивийн бүтэн байдлыг шалгах.\"\n0200010B=\"Энд задал\"\n0200010C=\"Сонгогдсон архиваас одооны хавтаст файлыг задал.\"\n0200010D=\"{0} руу задал\"\n0200010E=\"Ерөнхий хавтаст файлыг задлах.\"\n0200010F=\"{0} рүү нэм\"\n02000110=\"Сонгосон зүйлүүдээ архивт нэм.\"\n02000111=\"Шахах ба Шуудандах...\"\n02000112=\"Сонгогдсон зүйлүүдийг шахаад Шуудангаар илгээх\"\n02000113=\"{0} рүү шахах ба Шууданд\"\n02000114=\"Сонгогдсон зүйлүүдийг шахаад  архивийг Шуудангаар илгээх\"\n\n02000140=\"<Хавтас>\"\n02000141=\"<Aрхив>\"\n\n; Properties\n02000203=\"Зам\"\n02000204=\"Нэр\"\n02000205=\"Өргөтгөл\"\n02000206=\"Хавтас\"\n02000207=\"Хэмжээ\"\n02000208=\"Багцалсан хэмжээ\"\n02000209=\"Чанар\"\n0200020A=\"Үүсгэсэн\"\n0200020B=\"Хандсан\"\n0200020C=\"Өөрчилсөн\"\n0200020D=\"Баталгаатай\"\n0200020E=\"Тайлбар хийгдсэн\"\n0200020F=\"Нууцлагдсан\"\n02000210=\"Өмнө хуваасан\"\n02000211=\"Дараа хуваасан\"\n02000212=\"Толь бичиг\"\n02000213=\"CRC\"\n02000214=\"Төрөл\"\n02000215=\"Эсрэг\"\n02000216=\"Арга\"\n02000217=\"Хост ҮС\"\n02000218=\"Файл систем\"\n02000219=\"Хэрэглэгч\"\n0200021A=\"Бүлэг\"\n0200021B=\"Түгжих\"\n0200021C=\"Тайлбар\"\n0200021D=\"Байрлал\"\n\n; Status bar\n02000301=\"{0} зүйл(үүд) сонгогдсон байна\"\n02000302=\"{0} зүйл(үүд)\"\n\n; List Context Menu\n02000401=\"&Баганууд...\"\n\n02000411=\"&Нээх\"\n02000412=\"&Задлах...\"\n\n; ToolBar\n02000501=\"Задлах\"\n\n; Messages\n02000601=\"Дэмжигдээгүй архивийг задлах шинэчлэлт хийх.\"\n02000602=\"Архив шинэчилж чадсангүй {0}\"\n02000603=\"Хавтас үүсгэж чадахгүй '{0}'\"\n02000604=\"Дэмжигдээгүй файлын архив байна.\"\n02000605=\"Алдаа\"\n02000606=\"Дэндүү их юм байна\"\n02000607=\"Файлын нэрийн өргөтгөлтөй холдбогдсон програм байхгүй байна даа\"\n02000608=\"Алдаа алга байна\"\n\n; Dialogs\n02000702=\"За\"\n02000705=\"&Тийм\"\n02000707=\"Бүг&д тийм\"\n02000709=\"&Үгүй\"\n0200070B=\"Бүгд ү&гүй\"\n\n02000710=\"Болих\"\n02000711=\"&Болих\"\n02000713=\"&Хаах\"\n02000714=\"Зогс\"\n02000715=\"Дахин ачаалла\"\n\n02000720=\"Тусламж\"\n\n; Extract dialog\n02000800=\"Задал\"\n02000801=\"З&адлах газар:\"\n02000802=\"Нууц үг\"\n\n02000810=\"Замын горим\"\n02000811=\"Бүтэн замын нэр\"\n02000812=\"Одоогийн замын нэр\"\n02000813=\"Параметр алга\"\n\n02000820=\"Давхарлаж бичих горим\"\n02000821=\"Давхарлаж бичхээсээ өмнө асуух\"\n02000822=\"Асуултгүй давхарлаж бичих\"\n02000823=\"Байгаа файлыг алгасах\"\n02000824=\"Автоматаар нэр солих\"\n02000825=\"Байвал нэрийг нь солих\"\n\n02000830=\"Файлууд\"\n02000831=\"&Сонгогдсон файлууд\"\n02000832=\"&Бүх файлууд\"\n\n02000881=\"Задалсан файлуудын байрлалыг тодорхойл.\"\n\n02000890=\"Задалж байна...\"\n\n; Overwrite dialog\n02000900=\"Файл дахин байрлуулахыг батлах\"\n02000901=\"Хавтас файлыг агуулсан байна.\"\n02000902=\"Байгаа файлуудыг дахин байрлуулах уу\"\n02000903=\"Энүүнтэй юу?\"\n\n02000911=\"A&втомат нэр солих\"\n\n02000982=\"{0} битүүд\"\n02000983=\"Өөрчлөлт идэвхжилттэй\"\n\n; Messages dialog\n02000A00=\"Шинжилгээний зурвас\"\n\n02000A80=\"Зурвас\"\n\n02000A91=\"Дараах файлд шахалтын арга дэмжигдээгүй байна '{0}'.\"\n02000A92=\"'{0}'өгөгдлийн алдаа. Файл эвдэрсэн байна.\"\n02000A93=\"'{0}'CRC бүтсэнгүй. Файл эвдэрсэн байна.\"\n\n; Password dialog\n02000B00=\"Нууц үгээ оруулах\"\n02000B01=\"Нууц үгээ оруулах:\"\n02000B02=\"&Нууц үг харуулах\"\n\n; Progress dialog\n02000C00=\"Үйл явц\"\n02000C01=\"Өнгөрсөн хугацаа:\"\n02000C02=\"Үлдсэн хугацаа:\"\n02000C03=\"Хэмжээ:\"\n02000C04=\"Хурд:\"\n\n02000C10=\"&Ар талд\"\n02000C11=\"&Өмнө тал\"\n02000C12=\"&Түр зогс\"\n02000C13=\"&Үргэлжлүүл\"\n\n02000C20=\"Түр зогслоо\"\n\n02000C30=\"Та үнэхээр болих гэж байна уу?\"\n\n; Compress dialog\n02000D00=\"Архивт нэм\"\n02000D01=\"&Aрхив:\"\n02000D02=\"&Шинэчлэх горим:\"\n02000D03=\"Архив &өргөтгөл:\"\n02000D04=\"Шахах &арга:\"\n02000D05=\"Баталгаатай архив үүсгэх\"\n02000D06=\"&Параметерүүд:\"\n02000D07=\"Сонголтууд\"\n02000D08=\"SF&X архив үүсгэх\"\n02000D09=\"Олон-Бодлогын\"\n02000D0A=\"&Файлын нэрүүдийг нууцал\"\n02000D0B=\"Шахалтын &төвшин:\"\n02000D0C=\"&Толь бичгийн хэмжээ:\"\n02000D0D=\"&Үгийн хэмжээ:\"\n02000D0E=\"Шахаж байгаа санах ойн хэрэглээ:\"\n02000D0F=\"Задалж байгаа санах ойн хэрэглээ:\"\n\n02000D40=\"Эзлэхүүн рүү хуваах, битүүд:\"\n\n02000D81=\"Хадгалах\"\n02000D82=\"Энгийн\"\n02000D83=\"Дээд хэмжээгээр\"\n02000D84=\"Хурдан\"\n02000D85=\"Дээд хурданаар\"\n02000D86=\"Ултра\"\n\n02000D90=\"Нэгжих\"\n\n02000DA1=\"Нэмэх ба дахин байрлуулах\"\n02000DA2=\"Шинэчлэх ба дахин байрлуулах\"\n02000DA3=\"Байгаа файлуудыг дахин унших\"\n02000DA4=\"Файлуудыг тааруулах\"\n\n02000DB1=\"Бүх файлууд\"\n\n02000DC0=\"Шахаж байна\"\n\n; Columns dialog\n02000E00=\"Баганууд\"\n02000E01=\"Энэ хавтаст хийх багануудаа шалгана уу. Дээш оч доош оч товчлуураар та багануудаа янзалж болно.\"\n02000E02=\"Сонгосон багана чинь ийм байх ёстой\"\n02000E03=\"Цэгийн &өргөн.\"\n\n02000E10=\"Дээш &оч\"\n02000E11=\"Доош &оч\"\n02000E12=\"&Үзүүлэх\"\n02000E13=\"&Нуух\"\n02000E14=\"Оруулах\"\n\n02000E81=\"Гарчиг\"\n02000E82=\"Өргөн\"\n\n; Testing\n02000F90=\"Шалгаж байна\"\n\n\n; File Manager\n\n03000000=\"7-Зип файл Менежер\"\n\n; Menu\n03000102=\"&Файл\"\n03000103=\"&Засах\"\n03000104=\"&Үзүүлэх\"\n03000105=\"&Хэрэгслүүд\"\n03000106=\"&Тусламж\"\n03000107=\"Д&уртай зүйл\"\n\n; File\n03000210=\"&Нээх\"\n03000211=\"Дотор &нээх\"\n03000212=\"Гадна &нээх\"\n03000220=\"&Харах\"\n03000221=\"&Засварлах\"\n03000230=\"Нэр с&олих\"\n03000231=\"...рүү &Хуулах...\"\n03000232=\"...руу &Зөөх...\"\n03000233=\"&Устгах\"\n03000240=\"&Мэдээлэл үзэх\"\n03000241=\"Тай&лбар\"\n03000250=\"Хавтас үүсгэх\"\n03000251=\"Файл үүсгэх\"\n03000260=\"Га&рах\"\n03000270=\"&Файл хуваах...\"\n03000271=\"Файлуудыг нэгтгэх...\"\n\n; Edit\n03000310=\"&Цуцлах\"\n03000311=\"&Сэргээх\"\n03000320=\"Хайч&лах\"\n03000321=\"&Хуулах\"\n03000322=\"&Тавих\"\n03000323=\"&Устгах\"\n03000330=\"Бүгдийг со&нгох\"\n03000331=\"Сонгохоо болих\"\n03000332=\"&Сонголтоо эргүүл\"\n03000333=\"Сонгох...\"\n03000334=\"Сонгохгүй...\"\n03000335=\"Төрлөөр нь сонгох\"\n03000336=\"Төрлөөр нь сонгохгүй\"\n\n; View\n03000410=\"Том& дүрсүүд\"\n03000411=\"Жи&жиг дүрсүүд\"\n03000412=\"&Жагсаалт\"\n03000413=\"&Дэлгэрэнгүй\"\n03000420=\"Ангилаагүй\"\n03000430=\"Гол хавтсыг нээх\"\n03000431=\"Нэг төвшин дээш\"\n03000432=\"Хавтасны түүх...\"\n03000440=\"&Сэргээ\"\n03000450=\"&2 самбарууд\"\n03000451=\"&Багажны самбар\"\n03000460=\"Aрхив багажны самбар\"\n03000461=\"Стандарт багажны самбар\"\n03000462=\"Том товчлуурууд\"\n03000463=\"Товчлуурын текстийг үзүүл\"\n\n; Tools\n03000510=\"&Сонголтууд...\"\n03000511=\"&Бэнчмарк\"\n\n; Help\n03000610=\"&Агуулгууд...\"\n03000620=\"&7-Зип-ийн тухай...\"\n\n; Favorites\n03000710=\"&Хавтсыг дуртайдаа нэмэх үү\"\n03000720=\"Хавчуурга\"\n\n; Options Dialog\n\n03010000=\"Сонголтууд\"\n\n; Plugins\n03010100=\"Плаг-инууд\"\n03010101=\"&Плаг-инууд:\"\n03010110=\"Сонголтууд...\"\n\n; Edit\n03010200=\"Засварлагч\"\n03010201=\"&Засварлагч:\"\n\n; System\n03010300=\"Систем\"\n03010302=\"7-Зипийг дараахтай нэгтгэх:\"\n03010310=\"Плаг-ин\"\n\n; Settings\n03010400=\"Тохируулгууд\"\n03010401=\"Зүйл \\\"..\\\" үзүүлэх\"\n03010402=\"Жинхэнэ файл дүрсийг харуулах\"\n03010410=\"Системийн цэс харуул\"\n03010420=\"&Бүтэн мөр сонгох\"\n03010421=\"&Мөрийн дундах зураас харуулах\"\n03010430=\"&Сайжруулсан Сонгох горим\"\n03010440=\"&Том санах ойн хуудас хэрэглэх\"\n\n; Strings\n\n03020201=\"Хуулах\"\n03020202=\"Зөөх\"\n03020203=\"хуулахдаа:\"\n03020204=\"Зөөхдөө:\"\n03020205=\"Хуулж байна...\"\n03020206=\"Зөөж байна...\"\n03020207=\"Та файл ба хавтсыг зөөх буюу хуулж чадахгүй.\"\n03020208=\"Үйлдэл дэмжигдээгүй байна.\"\n\n03020210=\"Файл устгахыг батал\"\n03020211=\"Хавтас устгахыг батал\"\n03020212=\"Олон файл устгахыг батал\"\n03020213=\"Та'{0}'-ийг устгах гэж байна уу?\"\n03020214=\"'{0}' хавтас болон бүх агуулгыг устгах гэж байна уу?\"\n03020215=\"{0} зүйлүүдийг устгах гэж байна уу?\"\n03020216=\"Устгаж байна...\"\n03020217=\"Файл болон хавтсыг устгахад алдаатай\"\n\n03020220=\"Нэр солиж байна...\"\n03020221=\"Файл болон хавтсын нэрийг солиход алдаатай\"\n03020222=\"Файл хуулахыг магадлах\"\n03020223=\"Та үнэхээр файлуудыг архив руу хуулахыг хүсэж байна уу\"\n\n03020230=\"Хавтас үүсгэх\"\n03020231=\"Хавтас нэр:\"\n03020232=\"Шинэ хавтас\"\n03020233=\"Хавтас үүсгэхэд алдаа гарав\"\n\n03020240=\"Файл үүсгэх\"\n03020241=\"Файл нэр:\"\n03020242=\"Шинэ файл\"\n03020243=\"Файл үүсгэхэд алдаа гарав\"\n\n03020250=\"Сонгох\"\n03020251=\"Сонгохгүй\"\n03020252=\"Maск:\"\n\n03020260=\"Хавтсын түүх\"\n\n03020280=\"Файл '{0}' өөрчлөгдлөө.\\nТа архивт шинэчлэлт хиймээр байна уу?\"\n03020281=\"Файлыг шинэчилж чадсангүй\\n'{0}\"\n03020282=\"Засварлагчийг нээж чадсангүй.\"\n03020283=\"Нээж байна...\"\n\n03020290=\"Тайлбар\"\n03020291=\"&Тайлбар:\"\n\n030202A0=\"Систем\"\n\n03020300=\"Компьютер\"\n03020301=\"Сүлжээ\"\n\n03020400=\"Нэм\"\n03020401=\"Задал\"\n03020402=\"Шалгах\"\n\n03020420=\"Хуулах\"\n03020421=\"Зөөх\"\n03020422=\"Устгах\"\n03020423=\"Шинж...\"\n\n03020500=\"Хуваах файл:\"\n03020501=\"&Файл хуваах газар:\"\n03020510=\"Хувааж байна...\"\n\n03020600=\"Нэгтгэх файлууд:\"\n03020601=\"&Нэгтгэх газар:\"\n03020610=\"Нэгтгэж байна...\"\n\n; Computer\n03031100=\"Нийт хэмжээ\"\n03031101=\"Хоосон зай\"\n03031102=\"Кластерын зай\"\n03031103=\"Нэр\"\n\n; Network\n03031200=\"Локаль Нэр\"\n03031201=\"Хангагч\"\n\n; Benchmark Dialog\n\n03080000=\"Бэнчмарк\"\n03080001=\"Санах ойн хэрэглээ:\"\n03080002=\"Шахаж байна\"\n03080003=\"Задалж байна\"\n03080004=\"Хурд\"\n03080005=\"Үнэлж байна\"\n03080006=\"Нийт үнэлгээ\"\n03080007=\"Одоогийн\"\n03080008=\"Хариуг гаргаж байна\"\n03080009=\"Өнгөрсөн:\"\n0308000A=\"Алдаанууд:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/mr.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.42\n; अनुवाद सुबोध गायकवाड\n;\n;\n;\n;\n\n00000000=\"Marathi\"\n00000001=\"मराठी\"\n00000002=\"78\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip संरचना\"\n\n; Info Page\n01000100=\"7-Zip बद्दल माहिती\"\n01000103=\"7-Zip हे मोफ़त सॉफ़्टवेअर आहे. तरिही, तुम्ही नोंद करुन याच्या प्रगतीला सहाय्य करू शकता.\"\n01000104=\"सहाय्यता\"\n01000105=\"नोंद\"\n\n; Folders Page\n01000200=\"फ़ोल्डर\"\n01000210=\"&चलित फ़ोल्डर\"\n01000211=\"&प्रणालीचे तात्पुरते फ़ोल्डर\"\n01000212=\"&सध्या\"\n01000213=\"&नमुद:\"\n01000214=\"फक्त काढता येणाय्रा ड्रॉईव्हकरता वापरा\"\n\n01000281=\"तात्पुरत्या दफ़तर करिता मार्ग दर्शवा.\"\n\n; System Page\n01000300=\"प्रणाली\"\n01000301=\"7-Zip ला shell context मेनुशी जोडा\"\n01000302=\"Cascaded context menu\"\n01000310=\"Context मेनु वस्तू:\"\n\n; Language Page\n01000400=\"भाषा\"\n01000401=\"भाषा:\"\n\n\n; 7-Zip Explorer extension\n\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip कमांड्स\"\n02000103=\"दफ़तर उघडा\"\n02000104=\"निवडलेले दफ़तर उघडा.\"\n02000105=\"फ़ाइल्स बाहेर काढा...\"\n02000106=\"निवडलेल्या दफ़तर मधुन फाइल बाहेर काढा .\"\n02000107=\"दफ़तरात टाका...\"\n02000108=\"निवडलेल्या वस्तू दफ़तरात टाका.\"\n02000109=\"दफ़तर तपासा\"\n0200010A=\"दफ़तराची पुर्णता तपासा.\"\n0200010B=\"येथे बाहेर काढा\"\n0200010C=\"सध्याच्या फ़ोल्डरमध्ये निवडलेल्या दफ़तर मधुन फाइल बाहेर काढा.\"\n0200010D=\"बाहेर {0}\"\n0200010E=\"फ़ाइल्स उप-फ़ोल्डरमध्ये काढा.\"\n0200010F=\"{0} येथे टाका\"\n02000110=\"निवडलेल्या वस्तू दफ़तरात टाका.\"\n02000111=\"दाबा आणि इमेल करा...\"\n02000112=\"निवडलेल्या वस्तू दफ़तरात दाबुन टाका आणि दफ़तर इमेलद्वारे पाठवा.\"\n02000113=\" {0} येथे दाबा आणि इमेल करा\"\n02000114=\"निवडलेल्या वस्तू दफ़तरात दाबुन टाका आणि दफ़तर इमेलद्वारे पाठवा.\"\n\n\n02000140=\"<Folder>\"\n02000141=\"<Archive>\"\n\n; Properties\n02000203=\"मार्ग\"\n02000204=\"नाव\"\n02000205=\"शेपुट\"\n02000206=\"फ़ोल्डर\"\n02000207=\"आकार\"\n02000208=\"दबलेला आकार\"\n02000209=\"गुणधर्म\"\n0200020A=\"तयार\"\n0200020B=\"वापर\"\n0200020C=\"बदल\"\n0200020D=\"ठोस\"\n0200020E=\"भाष्य\"\n0200020F=\"बंधिस्त\"\n02000210=\"या पुर्व तुकडे करा \"\n02000211=\"या नंतर तुकडे करा\"\n02000212=\"शब्दावली\"\n02000213=\"CRC\"\n02000214=\"प्रकार\"\n02000215=\"विरुद्ध\"\n02000216=\"पद्धत\"\n02000217=\"यजमान आज्ञावली\"\n02000218=\"फ़ाइल प्रणाली\"\n02000219=\"उपयोगकर्ता\"\n0200021A=\"गट\"\n0200021B=\"गठ्ठा\"\n0200021C=\"प्रतिक्रिया\"\n0200021D=\"स्थिती\"\n0200021E=\"मार्गाची सुरुवात\"\n\n; Status bar\n02000301=\"निवडलेल्या वस्तू{0}\"\n02000302=\"{0} वस्तू(s)\"\n\n02000320=\"फ़ाइल:\"\n02000321=\"फ़ोल्डर:\"\n02000322=\"आकार:\"\n\n; List Context Menu\n02000401=\"&स्तंभ...\"\n\n02000411=\"&उघडा\"\n02000412=\"&बाहेर...\"\n\n; ToolBar\n02000501=\"बाहेर\"\n\n; Messages\n02000601=\"या दफ़तरासाठी नुतनीकरण शक्य नाही.\"\n02000602=\"{0} दफ़तराचे नुतनीकरण होऊ शकले नाही\"\n02000603=\" '{0}' फ़ोल्डर तयार होऊ शकले नाही\"\n02000604=\"हा दफ़तर वेगळा आहे.\"\n02000605=\"चुक\"\n02000606=\"खूपच जास्त वस्तू\"\n02000607=\"या फ़ाइलला उघडण्याकरता एकही संबधित प्रोग्राम नाही\"\n02000608=\"येथे एकही चूक नाही\"\n\n; Dialogs\n02000702=\"ठीक\"\n02000705=\"&हो\"\n02000707=\"&सर्व ला हो\"\n02000709=\"&नाही\"\n0200070B=\"&सर्व ला नाही\"\n\n02000710=\"रद्द\"\n02000711=\"&रद्द\"\n02000713=\"&बंद\"\n02000714=\"थांबा\"\n02000715=\"पुन्हा सुरु करा\"\n\n02000720=\"मदत\"\n\n; Extract dialog\n02000800=\"बाहेर\"\n02000801=\"&बाहेर:\"\n02000802=\"परवलिचा शब्द\"\n\n02000810=\"मार्ग रित\"\n02000811=\"पूर्ण पत्ता\"\n02000812=\"सध्याचा पत्ता\"\n02000813=\"पत्ता नाही\"\n\n02000820=\"Overwrite रीत\"\n02000821=\"overwrite करण्यापुर्वी विचारा\"\n02000822=\"Overwrite न विचारता करा\"\n02000823=\"अस्तित्वात असलेल्या फ़ाइल सोडा\"\n02000824=\"स्वयंचलित नाव बदलवा\"\n02000825=\"अस्तित्वात असलेल्या फ़ाइलचे आपोआप नाव बदलवा\"\n\n02000830=\"फ़ाइल\"\n02000831=\"&निवडलेल्या फ़ाइल\"\n02000832=\"&सर्व फ़ाइल\"\n\n02000881=\"फ़ाइल बाहेर काढण्यासाठी मार्ग नमूद करा.\"\n\n02000890=\"बाहेर\"\n\n; Overwrite dialog\n02000900=\"फ़ाइल बदलवीणे खात्री\"\n02000901=\"त्या फ़ोल्डरमध्ये अगोदरच कार्यान्वीत फ़ाइल आहे.\"\n02000902=\"अस्तित्वात असलेली फ़ाइल बदलवायची आहे का?\"\n02000903=\"यानी?\"\n\n02000911=\"स्वयंचलित नाव बदलवा\"\n\n02000982=\"{0} बाइट्स\"\n02000983=\"बदल\"\n\n; Messages dialog\n02000A00=\"उपचार संदेश\"\n\n02000A80=\"संदेश\"\n\n02000A91=\"असहाय्यक दाब पद्धत'{0}'.\"\n02000A92=\"डेटा चूक'{0}'. फ़ाइल तुटलेली आहे.\"\n02000A93=\"CRC अयशस्वी '{0}'. फ़ाइल तुटलेली आहे.\"\n\n; Password dialog\n02000B00=\"परवलिचा शब्द टाका\"\n02000B01=\"परवलिचा शब्द टाका:\"\n02000B02=\"परवलिचा शब्द दाखवा\"\n\n; Progress dialog\n02000C00=\"कार्य\"\n02000C01=\"झालेला वेळ:\"\n02000C02=\"निघुन गेलेला वॆळ:\"\n02000C03=\"आकार:\"\n02000C04=\"वेग:\"\n\n02000C10=\"&मागे लपवा\"\n02000C11=\"&समोर आणा\"\n02000C12=\"&विश्राम\"\n02000C13=\"&सुरु\"\n\n02000C20=\"विश्राम\"\n\n02000C30=\"तुम्हाला रद्द करण्याबाबत खात्री आहे का?\"\n\n; Compress dialog\n02000D00=\"दफ़तरात टाका\"\n02000D01=\"&दफ़तर:\"\n02000D02=\"&नुतनीकरन रित:\"\n02000D03=\"दफ़तर &प्रकार:\"\n02000D04=\"दाब &पद्धत:\"\n02000D05=\"&ठोस दफ़तर तयार करा\"\n02000D06=\"&Parameters:\"\n02000D07=\"पर्याय\"\n02000D08=\"SF&X दफ़तर तयार करा\"\n02000D09=\"Multi-threading\"\n02000D0A=\"फ़ाइल &नाव बंधिस्त करा\"\n02000D0B=\"दाब &level:\"\n02000D0C=\"&शब्द्कोश आकार:\"\n02000D0D=\"&शब्द आकार:\"\n02000D0E=\"दाबण्यासाठी स्मरणशक्तीचा वापर:\"\n02000D0F=\"प्रसरण पावण्यासाठी स्मरणशक्तीचा वापर:\"\n\n02000D40=\"तुकडे, बाइट्स:\"\n\n02000D81=\"साठा\"\n02000D82=\"साधारण\"\n02000D83=\"जास्तीत जास्त\"\n02000D84=\"वेगवान\"\n02000D85=\"अतिशय वेगवान\"\n02000D86=\"एकदमच\"\n\n02000D90=\"ब्राउझ\"\n\n02000DA1=\"फ़ाइल टाका आणि ठेवा\"\n02000DA2=\"फ़ाइल टाका आणि नुतन करा\"\n02000DA3=\"अस्तित्वातील फ़ाइल ताजे करा\"\n02000DA4=\"Synchronize फ़ाइल\"\n\n02000DB1=\"सर्व फ़ाइल\"\n\n02000DC0=\"दाब\"\n\n; Columns dialog\n02000E00=\"स्तंभ\"\n02000E01=\"जे स्तंभ तुम्हाला या फ़ोल्डरमध्ये दृश्य करायचे आहे ते निवडा. वर आणि खाली कळचा उपयोग करा..\"\n02000E02=\"निवडलेला स्तंभ \"\n02000E03=\"पिक्सेल पसरलेला.\"\n\n02000E10=\"&वर\"\n02000E11=\"&खाली\"\n02000E12=\"&दृश्य\"\n02000E13=\"&लपवा\"\n02000E14=\"बसवा\"\n\n02000E81=\"शिर्षक\"\n02000E82=\"रुंद\"\n\n; Testing\n02000F90=\"तपासणी\"\n\n\n; File Manager\n\n03000000=\"7-Zip फ़ाइल व्यवस्थापक\"\n\n; Menu\n03000102=\"&फ़ाइल\"\n03000103=\"&संपादन\"\n03000104=\"&दर्शन\"\n03000105=\"&अवजार\"\n03000106=\"&मदत\"\n03000107=\"आ&वडते\"\n\n; File\n03000210=\"&उघडा\"\n03000211=\"&अंदर उघडा\"\n03000212=\"&बाहेर उघडा\"\n03000220=\"&दृश्य\"\n03000221=\"&संपादक\"\n03000230=\"नाव बदल\"\n03000231=\"&प्रतिलिपी...\"\n03000232=\"&हलवा...\"\n03000233=\"&मिटवा\"\n03000240=\"लक्षणं\"\n03000241=\"प्रतिक्रिया\"\n03000250=\"फ़ोल्डर तयार करा\"\n03000251=\"फ़ाइल तयार करा\"\n03000260=\"गमन\"\n03000270=\"&फ़ाइल तुकडे करा...\"\n03000271=\"फ़ाइल जोडा...\"\n\n; Edit\n03000310=\"&पुर्वस्थिती\"\n03000311=\"&पुन्हा करा\"\n03000320=\"कापा\"\n03000321=\"&प्रतिलिपी\"\n03000322=\"&चिकटवा\"\n03000323=\"&मिटवा\"\n03000330=\"सर्व निवडा\"\n03000331=\"सर्वांना अनिवडित करा\"\n03000332=\"&निवड उलटी करा\"\n03000333=\"निवडा...\"\n03000334=\"अनिवडा...\"\n03000335=\"प्रकारेद्वारा निवडा\"\n03000336=\"प्रकारेद्वारे अनिवडा\"\n\n; View\n03000410=\"मोठे Icons\"\n03000411=\"लहान Icons\"\n03000412=\"&सुची\"\n03000413=\"&माहिती\"\n03000420=\"अव्यवस्थित\"\n03000430=\"Root फ़ोल्डर उघडा\"\n03000431=\"एक वरती चढा\"\n03000432=\"फ़ोल्डर इतिहास...\"\n03000440=\"&टवटवीत करा\"\n03000449=\"Flat दृश्य\"\n03000450=\"&२ फ़लक\"\n03000451=\"&अवजार कप्पाs\"\n03000460=\"दफ़तर अवजार कप्पा\"\n03000461=\"प्रमाण अवजार कप्पा\"\n03000462=\"मोठे कळ\"\n03000463=\"कळ शब्द दाखवा\"\n\n; Tools\n03000510=\"&पर्याय...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&माहिती...\"\n03000620=\"7-Zip बद्दल...\"\n\n; Favorites\n03000710=\"&फ़ोल्डर आवडते मध्ये टाका...\"\n03000720=\"पृष्ठ\"\n\n; Options Dialog\n\n03010000=\"पर्याय\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"पर्याय...\"\n\n; Edit\n03010200=\"संपादक\"\n03010201=\"&संपादक:\"\n\n; System\n03010300=\"प्रणाली\"\n03010302=\"7-Zip संबधित करा:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"स्थिती\"\n03010401=\"वस्तू \\\"..\\\" दाखवा\"\n03010402=\"फ़ाइलचे खरे icon दाखवा\"\n03010410=\"प्रणालीचे मेनु दाखवा\"\n03010420=\"&सर्व ओळ निवडा\"\n03010421=\" &grid रेघा दाखवा\"\n03010430=\"&अतिरिक्त निवड पद्धती\"\n03010440=\"मोठे स्मरणशक्ती पृष्ठ वापरा\"\n\n; Strings\n\n03020201=\"प्रतिलिपी\"\n03020202=\"हलवा\"\n03020203=\"प्रतिलिपी:\"\n03020204=\"हलवा:\"\n03020205=\"प्रतिलिपी...\"\n03020206=\"हलवल्या जात आहे...\"\n03020207=\"तुम्ही अश्या फ़ोल्डरसाठी वस्तू हलवू किंवा प्रतिलिपी तयार करू शकत नाही.\"\n03020208=\"क्रिया करता येणार नाही.\"\n\n03020210=\"फ़ाइल मिटवायची खात्री\"\n03020211=\"फ़ोल्डर मिटवायची खात्री\"\n03020212=\"अनेक फ़ाइल मिटवायची खात्री\"\n03020213=\"तुम्हाला '{0}' मिटवायची खात्री आहे का?\"\n03020214=\"तुम्हाला '{0}' फ़ोल्डर आणि त्यातील सर्व वस्तु मिटवायची खात्री आहे का?\"\n03020215=\"तुम्हाला {0} वस्तु मिटवायची खात्री आहे का?\"\n03020216=\"मिटत आहे...\"\n03020217=\"फ़ाइल किंवा फ़ोल्डर मिटवता येत नाही आहे\"\n\n03020220=\"नविन नाव दिल्या जात आहे...\"\n03020221=\"फ़ाइल किंवा फ़ोल्डरला नविन नाव देता येत नाही आहे\"\n03020222=\"फ़ाइलची प्रतिलिपी करण्यास तुमची खात्री आहे का\"\n03020223=\"दफ़्तरात फ़ाइलची प्रतिलिपी करण्यास तुमची खात्री आहे का\"\n\n03020230=\"फ़ॊल्डर तयार करा\"\n03020231=\"फ़ोल्डर नाव:\"\n03020232=\"नविन फ़ॊल्डर\"\n03020233=\"फ़ोल्डर तयार करता येत नाही आहे\"\n\n03020240=\"फ़ाइल तयार करा\"\n03020241=\"फ़ाइलचे नाव:\"\n03020242=\"नविन फ़ाइल\"\n03020243=\"फ़ाइल तयार करता येत नाही आहे\"\n\n03020250=\"निवडा\"\n03020251=\"निवड रद्द\"\n03020252=\"मुखवटा:\"\n\n03020260=\"फ़ोल्डरचा इतिहास\"\n\n03020280=\" '{0}' ही फ़ाइल बदलली आहे.\\nतुम्हाला हे दफ़तरात नुतन करायचे आहे का?\"\n03020281=\"फ़ाइल नुतन करता येत नाही\\n'{0}'\"\n03020282=\"संपादक सुरु होत नाही.\"\n03020283=\"उघडत आहे...\"\n\n03020290=\"प्रतिक्रिया\"\n03020291=\"&प्रतिक्रिया:\"\n\n030202A0=\"प्रणाली\"\n\n03020300=\"संगणक\"\n03020301=\"नेटवर्क\"\n\n03020400=\"टाका\"\n03020401=\"बाहेर\"\n03020402=\"तपासा\"\n\n03020420=\"प्रतिलिपी\"\n03020421=\"हलवा\"\n03020422=\"मिटवा\"\n03020423=\"माहिती\"\n\n03020500=\"फ़ाइलचे तुकडे करा\"\n03020501=\"&येथे तुकडे:\"\n03020510=\"तुकडे होत आहे...\"\n\n03020600=\"फ़ाइल जोडा\"\n03020601=\"&येथे फ़ाइल जोडा:\"\n03020610=\"फ़ाइल जुडत आहे...\"\n\n03020710=\"Checksum मोजत आहे...\"\n03020720=\"Checksum माहिती\"\n03020721=\"डेटाकरिता CRC checksum :\"\n03020722=\"नाव आणि डेटाकरिता CRC checksum :\"\n\n03020800=\"बारकाईने पाहत आहे...\"\n\n; Computer\n03031100=\"एकूण आकार\"\n03031101=\"खाली जागा\"\n03031102=\"क्लस्टर आकार\"\n03031103=\"शिर्षक\"\n\n; Network\n03031200=\"लोकल नाव\"\n03031201=\"देणारा\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"स्मरणशक्ती वापर:\"\n03080002=\"दाबत आहे\"\n03080003=\"प्रसरण होत आहे\"\n03080004=\"वेग\"\n03080005=\"क्रमांकन\"\n03080006=\"एकुण क्रमांकन\"\n03080007=\"सध्या\"\n03080008=\"परिणाम\"\n03080009=\"Passes:\"\n0308000A=\"चूक:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ms.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.30\n; Diterjemahkan oleh Khairul Ridhwan Bin Omar\n;\n;\n;\n;\n\n00000000=\"Malay\"\n00000001=\"Bahasa Melayu\"\n00000002=\"62\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Konfigurasi 7-Zip\"\n\n; Info Page\n01000100=\"Perihal 7-Zip\"\n01000103=\"7-Zip adalah perisian percuma. Sokong pembangunan 7-Zip dengan melakukan pendaftaran.\"\n01000105=\"Pendaftaran\"\n\n; Folders Page\n01000200=\"Folder\"\n01000210=\"&Folder kerja\"\n01000211=\"&Folder sementara sistem\"\n01000212=\"&Sekarang\"\n01000213=\"&Ditentukan:\"\n01000214=\"Hanya untuk pemacu mudah alih\"\n\n01000281=\"Tentukan lokasi untuk arkib fail sementara.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"Integrasikan 7-Zip ke shell konteks menu\"\n01000302=\"Cascaded konteks menu\"\n01000310=\"Item pada konteks menu:\"\n\n; Language Page\n01000400=\"Bahasa\"\n01000401=\"Bahasa:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Arahan dalam 7-Zip\"\n02000103=\"Buka arkib\"\n02000104=\"Buka arkib terpilih.\"\n02000105=\"Ekstrak fail...\"\n02000106=\"Ekstrak fail dari arkib terpilih.\"\n02000107=\"Tambahkan ke arkib...\"\n02000108=\"Tambahkan item yang terpilih ke arkib.\"\n02000109=\"Uji arkib\"\n0200010A=\"Uji integriti dari arkib terpilih.\"\n0200010B=\"Ekstrak di sini\"\n0200010C=\"Ekstrak fail arkib yang terpilih ke folder ini.\"\n0200010D=\"Ekstrak ke {0}\"\n0200010E=\"Ekstrak fail ke subfolder.\"\n0200010F=\"Tambahkan ke {0}\"\n02000110=\"Tambahkan item terpilih ke arkib.\"\n02000111=\"Padatkan dan kirimkan melalui email...\"\n02000112=\"Padatkan item yang terpilih ke arkib dan kirimkan melalui email.\"\n02000113=\"Padatkan ke {0} dan kirimkan melalui email\"\n02000114=\"Padatkan item yang terpilih ke arkib dan kirimkan melalui email.\"\n\n02000140=\"<Folder>\"\n02000141=\"<Arkib>\"\n\n; Properties\n02000203=\"Bahagian\"\n02000204=\"Nama\"\n02000205=\"Sambungan\"\n02000206=\"Folder\"\n02000207=\"Saiz\"\n02000208=\"Saiz Paket\"\n02000209=\"Atribut\"\n0200020A=\"Dibuat\"\n0200020B=\"Diakses\"\n0200020C=\"Diubah Suai\"\n0200020D=\"Solid\"\n0200020E=\"Komen\"\n0200020F=\"Terenkripsi\"\n02000210=\"Terpisah Sebelum\"\n02000211=\"Terpisah Selepas\"\n02000212=\"Kamus\"\n02000213=\"CRC\"\n02000214=\"Jenis\"\n02000215=\"Anti\"\n02000216=\"Kaedah\"\n02000217=\"Sistem Operasi\"\n02000218=\"Sistem Fail\"\n02000219=\"Pengguna\"\n0200021A=\"Kumpulan\"\n0200021B=\"Blok\"\n0200021C=\"Komen\"\n0200021D=\"Posisi\"\n\n; Status bar\n02000301=\"{0} buah objek telah terpilih\"\n02000302=\"{0} buah objek\"\n\n; List Context Menu\n02000401=\"&Kolum...\"\n\n02000411=\"&Buka\"\n02000412=\"&Ekstrak...\"\n\n; ToolBar\n02000501=\"Ekstrak\"\n\n; Messages\n02000601=\"Tidak menyokong pengemaskinian untuk arkib ini.\"\n02000602=\"Tidak dapat mengemaskini arkib {0}\"\n02000603=\"Tidak dapat membuat folder '{0}'\"\n02000604=\"Tidak dapat menyokong fail arkib jenis ini.\"\n02000605=\"Ralat\"\n02000606=\"Terlalu banyak item\"\n02000607=\"Tidak ada aplikasi yang dikongsikan dengan sambungan dari nama fail yang diberikan\"\n02000608=\"Tidak ada ralat\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ya\"\n02000707=\"Ya untuk Semua\"\n02000709=\"&Tidak\"\n0200070B=\"Tidak untuk Semua\"\n\n02000710=\"Batal\"\n02000711=\"&Batal\"\n02000713=\"&Tutup\"\n02000714=\"Henti\"\n02000715=\"Mula Semula\"\n\n02000720=\"Bantuan\"\n\n; Extract dialog\n02000800=\"Ekstrak\"\n02000801=\"Ekstrak ke:\"\n02000802=\"Kata laluan\"\n\n02000810=\"Mod laluan\"\n02000811=\"Laluan nama penuh\"\n02000812=\"Nama laluan sekarang\"\n02000813=\"Tidak pakai nama laluan\"\n\n02000820=\"Mod tulis semula\"\n02000821=\"Tanya sebelum menulis semula\"\n02000822=\"Tulis semula tanpa perlu diberitahu\"\n02000823=\"Abaikan fail yang ada\"\n02000824=\"Namakan semula automatik\"\n02000825=\"Namakan automatik fail yang ada\"\n\n02000830=\"Fail\"\n02000831=\"&Fail yang terpilih\"\n02000832=\"&Semua fail\"\n\n02000881=\"Tentukan lokasi untuk pengekstrakan fail.\"\n\n02000890=\"Sedang mengekstrak\"\n\n; Overwrite dialog\n02000900=\"Pastikan penggantian fail\"\n02000901=\"Folder tujuan telah berisi fail yang telah terproses.\"\n02000902=\"Mahukah anda menggantikan fail yang ada\"\n02000903=\"dengan yang ini?\"\n\n02000911=\"N&amakan semula Automatik\"\n\n02000982=\"{0} baits\"\n02000983=\"diubah suai pada\"\n\n; Messages dialog\n02000A00=\"Mesej diagnostik\"\n\n02000A80=\"Mesej\"\n\n02000A91=\"Kaedah pemampatan untuk '{0}' tidak disokong.\"\n02000A92=\"Data ralat di '{0}'. Fail ini rosak.\"\n02000A93=\"CRC gagal di '{0}'. Fail ini rosak.\"\n\n; Password dialog\n02000B00=\"Masukkan kata laluan\"\n02000B01=\"Masukkan kata laluan:\"\n02000B02=\"&Perlihatkan kata laluan\"\n\n; Progress dialog\n02000C00=\"Proses\"\n02000C01=\"Telah berlalu:\"\n02000C02=\"Selesai dalam:\"\n02000C03=\"Saiz:\"\n02000C04=\"Kecepatan:\"\n\n02000C10=\"&Latar belakang\"\n02000C11=\"&Latar depan\"\n02000C12=\"&Berehat\"\n02000C13=\"&Teruskan\"\n\n02000C20=\"Berehat\"\n\n02000C30=\"Anda yakin untuk membatalkannya?\"\n\n; Compress dialog\n02000D00=\"Tambahkan ke arkib\"\n02000D01=\"&Arkib:\"\n02000D02=\"&Mod kemaskini:\"\n02000D03=\"Format arkib:\"\n02000D04=\"Kaedah mampatan:\"\n02000D05=\"Buat arkib solid\"\n02000D06=\"&Parameter:\"\n02000D07=\"Opsyen\"\n02000D08=\"Buat arkib SF&X\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Enkripsi nama &fail\"\n02000D0B=\"Aras &mampatan:\"\n02000D0C=\"&Saiz kamus:\"\n02000D0D=\"&Saiz perkataan:\"\n02000D0E=\"Penggunaan memori untuk Memampatkan:\"\n02000D0F=\"Penggunaan memori untuk Menyah-mampatkan:\"\n\n02000D40=\"Bahagi/belah ke &nilai, baits:\"\n\n02000D81=\"Untuk Penyimpanan\"\n02000D82=\"Normal\"\n02000D83=\"Maksimum\"\n02000D84=\"Cepat\"\n02000D85=\"Lebih cepat\"\n02000D86=\"Ultra\"\n\n02000D90=\"Selusur...\"\n\n02000DA1=\"Tambah dan gantikan fail\"\n02000DA2=\"Kemaskini dan tambahkan fail\"\n02000DA3=\"Perbaharui fail yang ada\"\n02000DA4=\"Menyesuaikan fail\"\n\n02000DB1=\"Semua Fail\"\n\n02000DC0=\"Memampatkan\"\n\n; Columns dialog\n02000E00=\"Kolum\"\n02000E01=\"Semak kolum yang anda ingin lihat untuk folder ini. Gunakan bebutang Ke Atas dan Ke Bawah untuk menyusun kolum.\"\n02000E02=\"Kolum yang sepatutnya dipilih\"\n02000E03=\"piksel &lebar.\"\n\n02000E10=\"Pindah ke &Atas\"\n02000E11=\"Pindah ke &Bawah\"\n02000E12=\"&Perlihatkan\"\n02000E13=\"&Sembunyikan\"\n02000E14=\"Set\"\n\n02000E81=\"Judul\"\n02000E82=\"Lebar\"\n\n; Testing\n02000F90=\"Pengujian\"\n\n\n; File Manager\n\n03000000=\"Pengurusan Fail 7-Zip\"\n\n; Menu\n03000102=\"&Fail\"\n03000103=\"&Edit\"\n03000104=\"&Paparan\"\n03000105=\"&Alat\"\n03000106=\"&Bantuan\"\n03000107=\"K&egemaran\"\n\n; File\n03000210=\"&Buka\"\n03000211=\"Buka di D&alam\"\n03000212=\"Buka di L&uar\"\n03000220=\"&Paparan\"\n03000221=\"&Edit\"\n03000230=\"Nam&akan semula\"\n03000231=\"&Salin ke...\"\n03000232=\"&Pindahkan ke...\"\n03000233=\"Hapus\"\n03000240=\"P&roperti\"\n03000241=\"Kom&en\"\n03000250=\"Buat Folder\"\n03000251=\"Buat Fail\"\n03000260=\"K&eluar\"\n03000270=\"&Bahagi/belah Fail...\"\n03000271=\"Gab&ung Fail...\"\n\n; Edit\n03000310=\"&Buat Asal\"\n03000311=\"&Buat Semula\"\n03000320=\"Poton&g\"\n03000321=\"&Salin\"\n03000322=\"&Tampal\"\n03000323=\"&Hapus\"\n03000330=\"Pilih &Semua\"\n03000331=\"Jangan Pilih Semua\"\n03000332=\"&Sonsangkan Pilihan \"\n03000333=\"Pilih...\"\n03000334=\"Tidak Memilih...\"\n03000335=\"Pilih Berdasarkan Jenis\"\n03000336=\"Tidak Memilih Berdasarkan Jenis\"\n\n; View\n03000410=\"Ikon B&esar\"\n03000411=\"Ikon K&ecil\"\n03000412=\"&Senarai\"\n03000413=\"&Butiran\"\n03000420=\"Tidak Tersusun\"\n03000430=\"Buka Root Folder\"\n03000431=\"Ke atas Satu Aras\"\n03000432=\"Folder Sejarah...\"\n03000440=\"&Segarkan Semula\"\n03000450=\"&2 Panel\"\n03000451=\"&Toolbar\"\n03000460=\"Toolbar Arkib\"\n03000461=\"Toolbar Standard\"\n03000462=\"Bebutang Besar\"\n03000463=\"Perlihatkan Teks Bebutang\"\n\n; Tools\n03000510=\"&Opsyen...\"\n03000511=\"&Tanda Aras\"\n\n; Help\n03000610=\"&Kandungan...\"\n03000620=\"&Perihal 7-Zip...\"\n\n; Favorites\n03000710=\"&Tambah folder pada Kegemaran sebagai\"\n03000720=\"Penanda Buku\"\n\n; Options Dialog\n\n03010000=\"Opsyen\"\n\n; Plugins\n03010100=\"Plugin\"\n03010101=\"&Plugin:\"\n03010110=\"Opsyen...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"Kongsikan 7-Zip dengan:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Seting\"\n03010401=\"Perlihatkan \\\"..\\\" item\"\n03010402=\"Perlihatkan ikon asli dari fail\"\n03010410=\"Perlihatkan menu sistem\"\n03010420=\"&Pilih barisan penuh \"\n03010421=\"Perlihatkan garisan grid\"\n03010430=\"&Mod Pilihan Alternatif\"\n03010440=\"Gunakan muka surat memori yang &besar\"\n\n; Strings\n\n03020201=\"Salin\"\n03020202=\"Pindah\"\n03020203=\"Salin ke:\"\n03020204=\"Pindah ke:\"\n03020205=\"Sedang menyalin...\"\n03020206=\"Sedang memindah...\"\n03020207=\"Anda tidak boleh memindah atau menyalin item untuk folder yang demikian.\"\n03020208=\"Operasi tidak disokong.\"\n\n03020210=\"Pasti penghapusan fail\"\n03020211=\"Pasti penghapusan folder\"\n03020212=\"Pasti penghapusan fail-fail\"\n03020213=\"Anda yakin untuk menghapus '{0}'?\"\n03020214=\"Anda yakin untuk menghapus folder '{0}' dan semua isi kandungannya?\"\n03020215=\"Anda yakin untuk menghapus item {0}?\"\n03020216=\"Penghapusan...\"\n03020217=\"Ralat ketika menghapuskan Fail atau Folder\"\n\n03020220=\"Namakan semula...\"\n03020221=\"Ralat, ketika namakan semula Fail atau Folder\"\n03020222=\"Pasti salinkan fail\"\n03020223=\"Anda yakin untuk menyalinkan fail kepada arkib\"\n\n\n03020230=\"Buat Folder\"\n03020231=\"Nama Folder:\"\n03020232=\"Folder Baru\"\n03020233=\"Ralat, tidak dapat Membuat Folder\"\n\n03020240=\"Buat Fail\"\n03020241=\"Nama Fail:\"\n03020242=\"Fail Baru\"\n03020243=\"Ralat, tidak dapat Membuat Fail\"\n\n03020250=\"Pilih\"\n03020251=\"Tidak Memilih\"\n03020252=\"Topeng:\"\n\n03020260=\"Folder Sejarah\"\n\n03020280=\"Fail '{0}' telah terubah suai.\\nApakah anda ingin mengemaskininya pada arkib?\"\n03020281=\"Tidak dapat mengemaskini fail\\n'{0}'\"\n03020282=\"Tidak dapat membuka editor.\"\n03020283=\"Membuka...\"\n\n03020290=\"Komen\"\n03020291=\"&Komen:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"Komputer\"\n03020301=\"Rangkaian\"\n\n03020400=\"Tambah\"\n03020401=\"Ekstrak\"\n03020402=\"Uji\"\n\n03020420=\"Salin\"\n03020421=\"Pindah\"\n03020422=\"Hapus\"\n03020423=\"Maklumat\"\n\n03020500=\"Pisahkan Fail\"\n03020501=\"&Pisahkan ke:\"\n03020510=\"Pembelahan ...\"\n\n03020600=\"Gabungan Fail\"\n03020601=\"&Gabung ke:\"\n03020610=\"Penggabungan ...\"\n\n; Computer\n03031100=\"Saiz Keseluruhan\"\n03031101=\"Ruang Kosong\"\n03031102=\"Saiz Kluster\"\n03031103=\"Label\"\n\n; Network\n03031200=\"Nama Tempatan\"\n03031201=\"Penyedia\"\n\n; Benchmark Dialog\n\n03080000=\"Tanda Aras\"\n03080001=\"Penggunaan memori:\"\n03080002=\"Pemampatan\"\n03080003=\"Penyah-mampatan\"\n03080004=\"Kecepatan\"\n03080005=\"Rating\"\n03080006=\"Total Rating\"\n03080007=\"Sekarang\"\n03080008=\"Keputusan\"\n03080009=\"Lulus:\"\n0308000A=\"Ralat:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/nb.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.45\n; Translated by Jostein Christoffer Andersen\n; Maintained by Kjetil Hjartnes\n; Maintained by Robert Grønning\n;\n;\n\n00000000=\"Norwegian Bokmal\"\n00000001=\"Norsk Bokmål\"\n00000002=\"20-1\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip innstillinger\"\n\n; Info Page\n01000100=\"Om 7-Zip\"\n01000103=\"7-Zip er gratis programvare, men du kan støtte utviklingen av 7-Zip ved å registrere deg.\"\n01000104=\"Brukerstøtte\"\n01000105=\"Registrering\"\n\n; Folders Page\n01000200=\"Mapper\"\n01000210=\"&Arbeidsmappe\"\n01000211=\"Systemets &midlertidige mappe\"\n01000212=\"&Nåværende\"\n01000213=\"&Egendefinert:\"\n01000214=\"Kun for flyttbare stasjoner\"\n\n01000281=\"Angi plassering for midlertidige filer.\"\n\n; System Page\n01000300=\"System\"\n01000301=\"Integrer 7-Zip i programmenyen\"\n01000302=\"Forgrenet programmeny\"\n01000310=\"Valg i programmenyen:\"\n\n; Language Page\n01000400=\"Språk\"\n01000401=\"Språk:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip-kommandoer\"\n02000103=\"Åpne arkiv\"\n02000104=\"Åpner det merkede arkivet.\"\n02000105=\"Pakk ut …\"\n02000106=\"Pakk ut filer fra det merkede arkivet.\"\n02000107=\"Legg til arkiv …\"\n02000108=\"Legger merkede filer til arkivet.\"\n02000109=\"Test arkiv\"\n0200010A=\"Test integriteten til det merkede arkivet.\"\n0200010B=\"Pakk ut internt\"\n0200010C=\"Pakk ut filer fra det merkede arkivet til gjeldende mappe.\"\n0200010D=\"Pakk ut til {0}\"\n0200010E=\"Pakker ut filer til undermappe.\"\n0200010F=\"Legg til {0}\"\n02000110=\"Legger merkede elementer til arkivet.\"\n02000111=\"Komprimer og send med e-post …\"\n02000112=\"Komprimerer merkede elementer til et arkiv og sender det med e-post.\"\n02000113=\"Komprimer til {0} og send med e-post\"\n02000114=\"Komprimerer merkede elementer til et arkiv og sender det med e-post.\"\n\n02000140=\"<mappe>\"\n02000141=\"<arkiv>\"\n\n; Properties\n02000203=\"Plassering\"\n02000204=\"Navn\"\n02000205=\"Filetternavn\"\n02000206=\"Mappe\"\n02000207=\"Størrelse\"\n02000208=\"Komprimert størrelse\"\n02000209=\"Attributter\"\n0200020A=\"Opprettet\"\n0200020B=\"Åpnet\"\n0200020C=\"Endret\"\n0200020D=\"Kompakt\"\n0200020E=\"Kommentert\"\n0200020F=\"Kryptert\"\n02000210=\"Oppdeling før\"\n02000211=\"Oppdeling etter\"\n02000212=\"Ordbok\"\n02000213=\"CRC\"\n02000214=\"Type\"\n02000215=\"Anti\"\n02000216=\"Metode\"\n02000217=\"Vert-OS\"\n02000218=\"Filsystem\"\n02000219=\"Bruker\"\n0200021A=\"Gruppe\"\n0200021B=\"Blokk\"\n0200021C=\"Kommentar\"\n0200021D=\"Posisjon\"\n0200021E=\"Stiprefiks\"\n\n; Status bar\n02000301=\"{0} element(er) merket\"\n02000302=\"{0} element(er)\"\n\n02000320=\"Filer:\"\n02000321=\"Mapper:\"\n02000322=\"Størrelse:\"\n\n; List Context Menu\n02000401=\"&Kolonner …\"\n\n02000411=\"&Åpne\"\n02000412=\"&Pakk ut …\"\n\n; ToolBar\n02000501=\"Pakk ut\"\n\n; Messages\n02000601=\"Oppdateringsfunksjoner støttes ikke for dette arkivet.\"\n02000602=\"Klarte ikke oppdatere arkivet «{0}»\"\n02000603=\"Klarte ikke opprette mappen «{0}»\"\n02000604=\"Filen er ikke et støttet arkivformat.\"\n02000605=\"Feil\"\n02000606=\"For mange elementer\"\n02000607=\"Ingen programmer er knyttet til dette filetternavnet\"\n02000608=\"Fant ingen feil.\"\n02000609=\"Kan ikke åpne filen «{0}» som arkiv\"\n0200060A=\"Kan ikke åpne det krypterte arkivet «{0}». Sjekk at du har riktig passord.\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ja\"\n02000707=\"Ja til &alt\"\n02000709=\"&Nei\"\n0200070B=\"Nei til a&lt\"\n\n02000710=\"Avbryt\"\n02000711=\"&Avbryt\"\n02000713=\"&Lukk\"\n02000714=\"Stopp\"\n02000715=\"Start på nytt\"\n\n02000720=\"Hjelp\"\n\n; Extract dialog\n02000800=\"Pakk ut\"\n02000801=\"&Pakk ut til:\"\n02000802=\"Passord\"\n\n02000810=\"Filstier\"\n02000811=\"Fullstendige filstier\"\n02000812=\"Gjeldende filstier\"\n02000813=\"Ingen filstier\"\n\n02000820=\"Overskrivelse\"\n02000821=\"Bekreft før overskrivelse\"\n02000822=\"Overskriv uten bekreftelse\"\n02000823=\"Hopp over filer som finnes allerede\"\n02000824=\"Navngi nye filer automatisk\"\n02000825=\"Navngi filer som finnes automatisk\"\n\n02000830=\"Filer\"\n02000831=\"&Merkede filer\"\n02000832=\"&Alle filer\"\n\n02000881=\"Angi plassering for filer som skal pakkes ut.\"\n\n02000890=\"Pakker ut\"\n\n; Overwrite dialog\n02000900=\"Bekreft filoverskrivelse\"\n02000901=\"Den behandlede filen finnes i målmappen allerede.\"\n02000902=\"Vil du overskrive filen\"\n02000903=\"med denne?\"\n\n02000911=\"Navngi a&utomatisk\"\n\n02000982=\"{0} byte\"\n02000983=\"Endret\"\n\n; Messages dialog\n02000A00=\"Diagnosemeldinger\"\n\n02000A80=\"Melding\"\n\n02000A91=\"Komprimeringsmetoden støttes ikke for «{0}».\"\n02000A92=\"Datafeil i «{0}». Filen er ødelagt.\"\n02000A93=\"CRC-feil i «{0}». Filen er ødelagt.\"\n02000A94=\"Datafeil i den krypterte filen «{0}». Sjekk at du har riktig passord.\"\n02000A95=\"CRC feilet i den krypterte filen «{0}». Sjekk at du har riktig passord.\"\n\n; Password dialog\n02000B00=\"Angi passord\"\n02000B01=\"Angi passord:\"\n02000B02=\"&Vis passord\"\n02000B03=\"Bekreft passord:\"\n02000B10=\"Passordene er ikke like\"\n02000B11=\"Du kan bare bruke engelske bokstaver, tall eller spesialtegn (!, #, $, …) i passordet\"\n02000B12=\"Passordet er for langt\"\n\n; Progress dialog\n02000C00=\"Prosess\"\n02000C01=\"Tidsforbruk:\"\n02000C02=\"Gjenværende tid:\"\n02000C03=\"Størrelse:\"\n02000C04=\"Hastighet:\"\n\n02000C10=\"&Bakgrunn\"\n02000C11=\"&Forgrunn\"\n02000C12=\"&Stopp\"\n02000C13=\"&Fortsett\"\n\n02000C20=\"Stoppet\"\n\n02000C30=\"Vil du avbryte?\"\n\n; Compress dialog\n02000D00=\"Legg til arkiv\"\n02000D01=\"Filn&avn:\"\n02000D02=\"&Oppdateringsmetode:\"\n02000D03=\"&Format:\"\n02000D04=\"Komprimerings&metode:\"\n02000D05=\"&Kompakt arkiv\"\n02000D06=\"&Parametre:\"\n02000D07=\"&Innstillinger\"\n02000D08=\"Selvutpakkende arkiv («SF&X»)\"\n02000D09=\"Fler&trådet\"\n02000D0A=\"Kr&ypter filnavn\"\n02000D0B=\"Komprimerings&nivå:\"\n02000D0C=\"Ord&bokstørrelse:\"\n02000D0D=\"&Ordstørrelse:\"\n02000D0E=\"Minnebruk ved komprimering:\"\n02000D0F=\"Minnebruk ved dekomprimering:\"\n02000D10=\"Kryptering\"\n02000D11=\"Krypteringsmetode:\"\n02000D12=\"Antall CPU tråder:\"\n02000D13=\"Solid blokk størrelse:\"\n02000D14=\"Ikkje-solid\"\n02000D15=\"Solid\"\n\n02000D40=\"&Del opp til flere delarkiv i størrelsen:\"\n02000D41=\"Ugyldig delarkivstørrelse\"\n02000D42=\"Valgt delarkivstørrelse: {0} byte.\\nEr du sikker på at du vil dele arkivet med denne størrelsen?\"\n\n02000D81=\"Ukomprimert\"\n02000D82=\"Normal\"\n02000D83=\"Maksimum\"\n02000D84=\"Rask\"\n02000D85=\"Raskest\"\n02000D86=\"Ultra\"\n\n02000D90=\"Bla gjennom\"\n\n02000DA1=\"Legg til og overskriv filer\"\n02000DA2=\"Oppdater og legg til filer\"\n02000DA3=\"Oppdater filer\"\n02000DA4=\"Synkroniser filer\"\n\n02000DB1=\"Alle filer\"\n\n02000DC0=\"Komprimerer\"\n\n; Columns dialog\n02000E00=\"Kolonner\"\n02000E01=\"Merk av kolonnene som skal være synlige i denne mappen. Trykk «Flytt opp» og «Flytt ned» for å endre rekkefølgen.\"\n02000E02=\"Den merkede kolonnen bør være\"\n02000E03=\"piksler &bred.\"\n\n02000E10=\"Flytt &opp\"\n02000E11=\"Flytt &ned\"\n02000E12=\"&Vis\"\n02000E13=\"&Skjul\"\n02000E14=\"Angi\"\n\n02000E81=\"Tittel\"\n02000E82=\"Bredde\"\n\n; Testing\n02000F90=\"Testing\"\n\n\n; File Manager\n\n03000000=\"7-Zip filbehandler\"\n\n; Menu\n03000102=\"&Fil\"\n03000103=\"&Rediger\"\n03000104=\"&Vis\"\n03000105=\"Verk&tøy\"\n03000106=\"&Hjelp\"\n03000107=\"&Bokmerker\"\n\n; File\n03000210=\"&Åpne\"\n03000211=\"Åpne &internt\"\n03000212=\"Åpne &eksternt\"\n03000220=\"&Vis\"\n03000221=\"&Rediger\"\n03000230=\"Gi nytt &navn\"\n03000231=\"&Kopier til …\"\n03000232=\"&Flytt til …\"\n03000233=\"S&lett\"\n03000240=\"E&genskaper\"\n03000241=\"&Kommentar …\"\n03000242=\"Beregn sjekksum\"\n03000250=\"Ny &mappe …\"\n03000251=\"Ny f&il …\"\n03000260=\"&Avslutt\"\n03000270=\"&Del opp arkiv …\"\n03000271=\"&Sett sammen arkiv …\"\n\n; Edit\n03000310=\"&Angre\"\n03000311=\"&Gjør om\"\n03000320=\"Klipp &ut\"\n03000321=\"&Kopier\"\n03000322=\"&Lim inn\"\n03000323=\"&Slett\"\n03000330=\"Merk &alle\"\n03000331=\"Merk i&ngen\"\n03000332=\"Merk &omvendt\"\n03000333=\"Merk …\"\n03000334=\"Merk &ikke …\"\n03000335=\"Merk &valgt type\"\n03000336=\"Merk i&kke valgt type\"\n\n; View\n03000410=\"&Store ikoner\"\n03000411=\"S&må ikoner\"\n03000412=\"&Liste\"\n03000413=\"&Detaljer\"\n03000420=\"Usortert\"\n03000430=\"Rotmappe\"\n03000431=\"Gå opp et nivå\"\n03000432=\"Mappelogg …\"\n03000440=\"&Oppdater\"\n03000449=\"&Flat visning\"\n03000450=\"&To felt\"\n03000451=\"&Verktøylinjer\"\n03000460=\"Arkivverktøylinje\"\n03000461=\"Standardverktøylinje\"\n03000462=\"Store knapper\"\n03000463=\"Knappetekst\"\n\n; Tools\n03000510=\"&Innstillinger …\"\n03000511=\"&Yteprøve …\"\n\n; Help\n03000610=\"&Innhold\"\n03000620=\"&Om 7-Zip\"\n\n; Favorites\n03000710=\"&Bokmerk denne mappen som\"\n03000720=\"Bokmerke\"\n\n; Options Dialog\n\n03010000=\"Innstillinger\"\n\n; Plugins\n03010100=\"Tillegg\"\n03010101=\"&Tillegg:\"\n03010110=\"Innstillinger …\"\n\n; Edit\n03010200=\"Redigering\"\n03010201=\"&Redigeringsprogram:\"\n\n; System\n03010300=\"System\"\n03010302=\"Assosier 7-Zip med:\"\n03010310=\"Utvidelse\"\n\n; Settings\n03010400=\"Innstillinger\"\n03010401=\"Vis element for å gå opp et &nivå\"\n03010402=\"Vis egentlige fil&ikoner\"\n03010410=\"Vis system&meny\"\n03010420=\"Merk &hele rader\"\n03010421=\"Vis &rutenett\"\n03010430=\"&Alternativ merking\"\n03010440=\"Bruk &store minnesider\"\n\n; Strings\n\n03020201=\"Kopier\"\n03020202=\"Flytt\"\n03020203=\"Kopier til:\"\n03020204=\"Flytt til:\"\n03020205=\"Kopierer …\"\n03020206=\"Flytter …\"\n03020207=\"Du kan ikke flytte eller kopiere elementer i slike mapper.\"\n03020208=\"Operasjonen støttes ikke.\"\n03020209=\"Velg målmappe.\"\n\n03020210=\"Bekreft at fil skal slettes\"\n03020211=\"Bekreft at mappe skal slettes\"\n03020212=\"Bekreft at flere filer skal slettes\"\n03020213=\"Vil du slette «{0}»?\"\n03020214=\"Vil du slette mappen «{0}» med alt innhold?\"\n03020215=\"Vil du slette disse {0} elementene?\"\n03020216=\"Sletter …\"\n03020217=\"Det oppstod en feil da filen eller mappen skulle slettes\"\n\n03020220=\"Navngir …\"\n03020221=\"Det oppstod en feil da filen eller mappen skulle navngis\"\n03020222=\"Bekreft at fil skal kopieres\"\n03020223=\"Vil du kopiere filene til arkivet\"\n\n03020230=\"Ny mappe\"\n03020231=\"Mappenavn:\"\n03020232=\"Ny mappe\"\n03020233=\"Det oppstod en feil da mappen skulle opprettes\"\n\n03020240=\"Ny fil\"\n03020241=\"Filnavn:\"\n03020242=\"Ny fil\"\n03020243=\"Det oppstod en feil da filen skulle opprettes\"\n\n03020250=\"Merk\"\n03020251=\"Merk ikke\"\n03020252=\"Filter:\"\n\n03020260=\"Mappelogg\"\n\n03020280=\"Filen «{0}» har blitt endret.\\nVil du oppdatere den i arkivet?\"\n03020281=\"Klarte ikke oppdatere filen\\n«{0}»\"\n03020282=\"Klarte ikke starte redigeringsprogram.\"\n03020283=\"Åpner …\"\n\n03020290=\"kommentar\"\n03020291=\"&Kommentar:\"\n\n030202A0=\"System\"\n\n03020300=\"Datamaskin\"\n03020301=\"Nettverk\"\n\n03020400=\"Legg til\"\n03020401=\"Pakk ut\"\n03020402=\"Prøv\"\n\n03020420=\"Kopier\"\n03020421=\"Flytt\"\n03020422=\"Slett\"\n03020423=\"Egenskaper\"\n\n03020500=\"Del opp arkiv\"\n03020501=\"&Del opp som:\"\n03020510=\"Deler opp …\"\n03020520=\"Bekreft deling\"\n03020521=\"Er du sikker på at du vil dele arkivet i {0} delarkiv?\"\n03020522=\"Delarkivene må være mindre enn originalarkivet\"\n\n03020600=\"Sett sammen arkiv\"\n03020601=\"&Sett sammen som:\"\n03020610=\"Setter sammen …\"\n03020620=\"Velg bare det første delarkivet\"\n\n03020710=\"Beregner sjekksum …\"\n03020720=\"Sjekksuminformasjon\"\n03020721=\"CRC-sjekksum for data:\"\n03020722=\"CRC-sjekksum for data og filnavn:\"\n\n03020800=\"Skanner …\"\n\n; Computer\n03031100=\"Total plass\"\n03031101=\"Ledig plass\"\n03031102=\"Sektorgruppestørrelse\"\n03031103=\"Etikett\"\n\n; Network\n03031200=\"Lokalt navn\"\n03031201=\"Forsyner\"\n\n; Benchmark Dialog\n\n03080000=\"Yteprøve\"\n03080001=\"Minnebruk:\"\n03080002=\"Komprimering\"\n03080003=\"Dekomprimering\"\n03080004=\"Hastighet\"\n03080005=\"Ytelse\"\n03080006=\"Samlet ytelse\"\n03080007=\"Nåværende\"\n03080008=\"Resultat\"\n03080009=\"Bestått:\"\n0308000A=\"Feilet:\"\n0308000B=\"CPU bruk\"\n0308000C=\"Ytelse / Bruk\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ne.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.37\n; Translated by Shiva Pokharel, Mahesh Subedi\n;\n;\n;\n;\n\n00000000=\"Nepali\"\n00000001=\"नेपाली\"\n00000002=\"97\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-जिप कन्फिगरेसन\"\n\n; Info Page\n01000100=\"7-जिपका बारेमा\"\n01000103=\"7-जिप निशुल्क सफ्टवेयर हो। यद्यपी,तपाईँले दर्ता गरेर 7-जिपलाई सहयोग गर्न सक्नुहुन्छ ।\"\n01000104=\"सहयोग\"\n01000105=\"दर्ता\"\n\n; Folders Page\n01000200=\"फोल्डर\"\n01000210=\"&कार्य फोल्डर\"\n01000211=\"&प्रणाली टेम्प(अस्थायी) फोल्डर\"\n01000212=\"&चालू\"\n01000213=\"&निर्दिष्ट:\"\n01000214=\"हटाउन योग्य ड्राइभहरूका लागि मात्र प्रयोग गर्नुहोस्\"\n\n01000281=\"अस्थायी सङ्ग्रह फाइलका लागि स्थान तोक्नुहोस् ।\"\n\n; System Page\n01000300=\"प्रणाली\"\n01000301=\"शेल प्रसङ्ग मेनुमा 7-जिप लाई सम्मिलन गर्नुहोस् \"\n01000302=\"सोपानी प्रसङ्ग मेनु\"\n01000310=\"प्रसङ्ग मेनु वस्तु:\"\n\n; Language Page\n01000400=\"भाषा\"\n01000401=\"भाषा:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-जिप\"\n02000102=\"7-जिप आदेश\"\n02000103=\"सङ्ग्रह खोल्नुहोस्\"\n02000104=\"चयन गरिएको सङ्ग्रह खोल्नुहोस्\"\n02000105=\"फाइलहरू निकाल्नुहोस्...\"\n02000106=\"चयन गरिएको सङ्ग्रहबाट फाइलहरू निकाल्नुहोस्\"\n02000107=\"सङ्ग्रहमा थप्नुहोस्...\"\n02000108=\"चयन गरिएका वस्तुहरूलाई सङ्ग्रहमा थप्दछ\"\n02000109=\"सङ्ग्रह जाँच्नुहोस्\"\n0200010A=\"चयन गरिएको सङ्ग्रहको समेङ्कन जाँच्दछ\"\n0200010B=\"यहाँ निकाल्नुहोस्\"\n0200010C=\"हालको फोल्डरमा चयन गरिएको सङ्ग्रहबाट फाइलहरू निकाल्नुहोस्\"\n0200010D=\"{0} मा निकाल्नुहोस्\"\n0200010E=\"सहायक फोल्डरमा फाइलहरू निकाल्दछ\"\n0200010F=\"{0} मा थप्नुहोस्\"\n02000110=\"चयन गरिएका वस्तुहरू सङ्ग्रह थप्दछ\"\n02000111=\"सङ्कुचन गरेर इमेल गर्नुहोस्...\"\n02000112=\"चयन गरिएका वस्तुलाई सङ्ग्रहमा सङ्कुचन गर्दछ र इमेल मार्फत सङ्ग्रहमा पठाउदछ\"\n02000113=\"{0} मा सङ्कुचन गर्नुहोस् र इमेल गर्नुहोस्\"\n02000114=\"चयन गरिएका वस्तुलाई सङ्ग्रहमा सङ्कुचन गर्दछ र इमेल मार्फत सङ्ग्रहमा पठाउदछ\"\n\n02000140=\"<Folder>\"\n02000141=\"<Archive>\"\n\n; Properties\n02000203=\"मार्ग\"\n02000204=\"नाम\"\n02000205=\"विस्तार\"\n02000206=\"फोल्डर\"\n02000207=\"साइज\"\n02000208=\"प्याक गरिएको साइज\"\n02000209=\"विशेषता\"\n0200020A=\"सिर्जित\"\n0200020B=\"पहुँच\"\n0200020C=\"परिमार्जित\"\n0200020D=\"ठोस\"\n0200020E=\"टिप्पणी\"\n0200020F=\"गुप्तिकृत\"\n02000210=\"यस पहिले विभाजन गर्नुहोस्\"\n02000211=\"यस पछि विभाजन गर्नुहोस्\"\n02000212=\"शब्दकोश\"\n02000213=\"CRC\"\n02000214=\"प्रकार\"\n02000215=\"बिरोधि\"\n02000216=\"विधि\"\n02000217=\"होस्ट OS\"\n02000218=\"फाइल प्रणाली\"\n02000219=\"प्रयोगकर्ता\"\n0200021A=\"समूह\"\n0200021B=\"रोक\"\n0200021C=\"टिप्पणी\"\n0200021D=\"स्थान\"\n0200021E=\"मार्ग प्रत्यय\"\n\n; वस्तुस्थिति पट्टी\n02000301=\"{0} वस्तु(हरू) चयन गरियो\"\n02000302=\"{0} वस्तु(हरू)\"\n\n02000320=\"फाइल:\"\n02000321=\"फोल्डर:\"\n02000322=\"साइज:\"\n\n; प्रसङ्ग मेनु सूची\n02000401=\"&स्तम्भ...\"\n\n02000411=\"&खोल्नुहोस्\"\n02000412=\"&निकाल्नुहोस्...\"\n\n; उपकरणपट्टी\n02000501=\"निकाल्नुहोस्\"\n\n; सन्देश\n02000601=\"यो सङ्ग्रहका लागि अद्यावधिक सञ्चालन समर्थन गर्दैन\"\n02000602=\"सङ्ग्रह {0} अद्यावधिक गर्न सकिदैन\"\n02000603=\"'{0}'फोल्डर सिर्जना गर्न सकिदैन\"\n02000604=\"फाइलले सङ्ग्रह समर्थन गर्दैन\"\n02000605=\"त्रुटि\"\n02000606=\"धेरै वस्तु\"\n02000607=\"त्यहाँ दिइएको फाइल नाम विस्तारसँग सम्बन्धित अनुप्रयोग छैन\"\n02000608=\"त्यहाँ त्रुटि छैन\"\n\n; संवाद\n02000702=\"ठीक छ\"\n02000705=\"&हो\"\n02000707=\"&सबैलाई हो\"\n02000709=\"&होइन\"\n0200070B=\"&कसैलाई होइन\"\n\n02000710=\"रद्द गर्नुहोस्\"\n02000711=\"&रद्द गर्नुहोस्\"\n02000713=\"&बन्द गर्नुहोस्\"\n02000714=\"रोक्नुहोस्\"\n02000715=\"पुन: सुरु गर्नुहोस्\"\n\n02000720=\"मद्दत\"\n\n; संवाद निकाल्नुहोस्\n02000800=\"निकाल्नुहोस्\"\n02000801=\"यसलाई निकाल्नुहोस्:\"\n02000802=\"पासवर्ड\"\n\n02000810=\"मार्ग मोड\"\n02000811=\"पूरा मार्गनाम\"\n02000812=\"हालको मार्गनामहरू\"\n02000813=\"मार्गनामहरू छैन\"\n\n02000820=\"अधिलेखन मोड\"\n02000821=\"अधिलेखन गर्नु अगाडि सोध्नुहोस्\"\n02000822=\"प्रोम्टबिना अधिलेखन गर्नुहोस्\"\n02000823=\"अवस्थित फाइलहरू फड्काउनुहोस्\"\n02000824=\"स्वचालित पुन: नामकरण\"\n02000825=\"स्वचालित पुन: नामकरण अवस्थित फाइलहरू\"\n\n02000830=\"फाइल\"\n02000831=\"&चयन गरिएको फाइल\"\n02000832=\"&सबै फाइल\"\n\n02000881=\"निकालिएको फाइलका लागि स्थान निर्दिष्ट गर्नुहोस्\"\n\n02000890=\"निकाल्दैछ\"\n\n; अधिलेखन संवाद\n02000900=\"फाइल प्रतिस्थापन यकिन गर्नुहोस्\"\n02000901=\"गन्तव्य फोल्डरले पहिले नै प्रक्रिया गरिएको फाइल समावेश गर्दछ\"\n02000902=\"अवस्थित फाइलमा प्रतिस्थापन गर्न चाहनुहुन्छ\"\n02000903=\"योसँग?\"\n\n02000911=\"स्वचालित पुन: नामकरण\"\n\n02000982=\"{0} बाइट\"\n02000983=\"यसमा परिमार्जित\"\n\n; सन्देश संवाद\n02000A00=\"निदानात्मक सन्देश\"\n\n02000A80=\"सन्देश\"\n\n02000A91=\"'{0}'का लागि असमर्थित सङ्कुचन विधि \"\n02000A92=\"'{0}'लगत त्रुटि । फाइल बिग्रेको छ\"\n02000A93=\"'{0}' मा CRC असफल । फाइल बिग्रेको छ\"\n\n; पासवर्ड संवाद\n02000B00=\"पासवर्ड प्रविष्ट गर्नुहोस्\"\n02000B01=\"पासवर्ड प्रविष्ट गर्नुहोस्:\"\n02000B02=\"&पासवर्ड देखाउनुहोस्\"\n\n; प्रगित संवाद\n02000C00=\"प्रक्रिया\"\n02000C01=\"व्यतीत समय:\"\n02000C02=\"पुन: नामकरण समय:\"\n02000C03=\"साइज:\"\n02000C04=\"गति:\"\n\n02000C10=\"&पृष्ठभुमि\"\n02000C11=\"&अग्रभुमि\"\n02000C12=\"&पज गर्नुहोस्\"\n02000C13=\"&जारी राख्नुहोस्\"\n\n02000C20=\"पज गरिएको\"\n\n02000C30=\"तपाईँ रद्द गर्न यकिन हुनुहुन्छ ?\"\n\n; सङ्कुचन संवाद\n02000D00=\"सङ्ग्रहमा थप्नुहोस्\"\n02000D01=\"&सङ्ग्रह:\"\n02000D02=\"&अद्यावधिक मोड:\"\n02000D03=\"सङ्ग्रह ढाँचा:\"\n02000D04=\"सङ्कुचन विधि:\"\n02000D05=\"ठोस सङ्ग्रह सिर्जना गर्नुहोस्\"\n02000D06=\"&परिमिति:\"\n02000D07=\"विकल्प\"\n02000D08=\"SF&X सङ्ग्रह सिर्जना गर्नुहोस्\"\n02000D09=\"मल्टि-थ्रेडिङ\"\n02000D0A=\"फाइलनाम गुप्तिकरण गर्नुहोस्\"\n02000D0B=\"सङ्कुचन स्तर:\"\n02000D0C=\"&शब्दकोश साइज:\"\n02000D0D=\"&शब्द साइज:\"\n02000D0E=\"सङ्कुचनका लागि स्मृति प्रयोग:\"\n02000D0F=\"असङ्कुचनका लागि स्मृति प्रयोग:\"\n\n02000D40=\"भोल्युम, बाइटमा विभाजन गर्नुहोस्:\"\n\n02000D81=\"भण्डार गर्नुहोस्\"\n02000D82=\"साधारण\"\n02000D83=\"अधिकतम\"\n02000D84=\"छिटो\"\n02000D85=\"सब भन्दा छिटो\"\n02000D86=\"अत्यन्त\"\n\n02000D90=\"ब्राउज गर्नुहोस्\"\n\n02000DA1=\"फाइल थपेर प्रतिस्थापन गर्नुहोस्\"\n02000DA2=\"फाइलहरू अद्यावधिक गरेर थप्नुहोस्\"\n02000DA3=\"अवस्थित फाइल ताजा गर्नुहोस्\"\n02000DA4=\"फाइल समक्रमण गर्नुहोस्\"\n\n02000DB1=\"सबै फाइल\"\n\n02000DC0=\"सङ्कुचन\"\n\n; स्तम्भ संवाद\n02000E00=\"स्तम्भ\"\n02000E01=\"यो फोल्डरमा देखिने बनाउन चाहनु भएको स्तम्भ जाँच गर्नुहोस् । स्तम्भलाई पुन: क्रमबद्ध गर्न 'माथि सार्नुहोस्' र 'तल सार्नुहोस्' बटनको प्रयोग गर्नुहोस् \"\n02000E02=\"चयन गरिएको स्तम्भ हुनुपर्दछ\"\n02000E03=\"फराकिलो पिक्सेल\"\n\n02000E10=\"माथि सार्नुहोस्\"\n02000E11=\"तल सार्नुहोस्\"\n02000E12=\"&देखाउनुहोस्\"\n02000E13=\"&लुकाउनुहोस्\"\n02000E14=\"सेट गर्नुहोस्\"\n\n02000E81=\"शीर्षक\"\n02000E82=\"चौडाइ\"\n\n; परीक्षण\n02000F90=\"परीक्षण\"\n\n\n; फाइल प्रबन्धक\n\n03000000=\"7-जिप फाइल प्रबन्धक\"\n\n; मेनु\n03000102=\"&फाइल\"\n03000103=\"&सम्पादन गर्नुहोस्\"\n03000104=\"&हेर्नुहोस्\"\n03000105=\"&उपकरण\"\n03000106=\"&मद्दत\"\n03000107=\"&रुचाइएको\"\n\n; फाइल\n03000210=\"&खोल्नुहोस्\"\n03000211=\"भित्रपट्टि खोल्नुहोस्\"\n03000212=\"बाहरिपट्टि खोल्नुहोस्\"\n03000220=\"&हेर्नुहोस्\"\n03000221=\"&सम्पादन गर्नुहोस्\"\n03000230=\"पुन: नामकरण गर्नुहोस्\"\n03000231=\"&यसमा प्रतिलिपि बनाउनुहोस्...\"\n03000232=\"&यसमा सार्नुहोस्...\"\n03000233=\"&मेट्नुहोस्\"\n03000240=\"&गुण\"\n03000241=\"टिप्पणी\"\n03000242=\"checksum गणना गर्नुहोस्\"\n03000250=\"फोल्डर सिर्जना गर्नुहोस्\"\n03000251=\"फाइल सिर्जना गर्नुहोस्\"\n03000260=\"निस्कनुहोस्\"\n03000270=\"&फाइल विभाजन गर्नुहोस्...\"\n03000271=\"फाइलहरू संयोजन गर्नुहोस्...\"\n\n; सम्पादन\n03000310=\"&पूर्वस्थितिमा फर्काउनुहोस्\"\n03000311=\"&रिडु गर्नुहोस्\"\n03000320=\"काँट्नुहोस्\"\n03000321=\"&प्रतिलिपि बनाउनुहोस्\"\n03000322=\"&टाँस्नुहोस्\"\n03000323=\"&मेट्नुहोस्\"\n03000330=\"सबै चयन गर्नुहोस्\"\n03000331=\"सबै मेट्नुहोस्\"\n03000332=\"&चयन उल्टाउनुहोस्\"\n03000333=\"चयन गर्नुहोस्...\"\n03000334=\"चयन हटाउनुहोस्...\"\n03000335=\"प्रकार अनुसार चयन गर्नुहोस्\"\n03000336=\"प्रकार अनुसार चयन हटाउनुहोस्\"\n\n; दृश्य\n03000410=\"ठूलो प्रतिमा\"\n03000411=\"सानो प्रतिमा\"\n03000412=\"&सूची\"\n03000413=\"&वर्णन\"\n03000420=\"क्रमबद्ध नगरिएको\"\n03000430=\"प्रमूल फोल्डर खोल्नुहोस्\"\n03000431=\"एक स्तर माथि\"\n03000432=\"फोल्डरको इतिहार...\"\n03000440=\"&ताजा गर्नुहोस्\"\n03000449=\"फ्ल्याट दृश्य\"\n03000450=\"&२ प्यानल\"\n03000451=\"&उपकरणपट्टी\"\n03000460=\"सङ्ग्रह उपकरणपट्टी\"\n03000461=\"मानक उपकरणपट्टी\"\n03000462=\"ठूलो बटन\"\n03000463=\"बटनको पाठ देखाउनुहोस्\"\n\n; उपकरण\n03000510=\"&विकल्प...\"\n03000511=\"&बेञ्चमार्क\"\n\n; मद्दत\n03000610=\"&सामग्री...\"\n03000620=\"&7-जिपका बारेमा...\"\n\n; रूचाइएको\n03000710=\"&यस रूपमा रूचाइएकोमा फोल्डर थप्नुहोस्\"\n03000720=\"पुस्तकचिनो\"\n\n; विकल्प संवाद\n\n03010000=\"विकल्प\"\n\n; प्लगइन\n03010100=\"प्लगइन\"\n03010101=\"&प्लगइन:\"\n03010110=\"विकल्प...\"\n\n; सम्पादन\n03010200=\"सम्पादक\"\n03010201=\"&सम्पादक:\"\n\n; प्रणाली\n03010300=\"प्रणाली\"\n03010302=\"यससँग 7-जिप सम्बन्धित:\"\n03010310=\"प्लगइन\"\n\n; सेटिङ\n03010400=\"सेटिङ\"\n03010401=\"\\\"..\\\" वस्तु देखाउनुहोस्\"\n03010402=\"वास्तविक फाइल प्रतिमा देखाउनुहोस्\"\n03010410=\"प्रणाली मेनु देखाउनुहोस्\"\n03010420=\"&पूरा पङ्क्ति चयन\"\n03010421=\"ग्रिड रेखा देखाउनुहोस्\"\n03010430=\"&वैकल्पिक चयन मोड\"\n03010440=\"ठूलो स्मृति पृष्ठ प्रयोग गर्नुहोस्\"\n\n; सेटिङ\n\n03020201=\"प्रतिलिपि गर्नुहोस्\"\n03020202=\"सार्नुहोस्\"\n03020203=\"यसमा प्रतिलिपि गर्नुहोस्:\"\n03020204=\"यसमा सार्नुहोस्:\"\n03020205=\"प्रतिलिपि गर्दैछ...\"\n03020206=\"सार्दैछ...\"\n03020207=\"यस्तो फोल्डरकाल लागि तपाईँले वस्तुहरू सार्न र प्रतिलिपि गर्न सक्नुहुदैन\"\n03020208=\"सञ्चालन समर्थन गर्दैन\"\n\n03020210=\"फाइल मेट्न यकिन गर्नुहोस्\"\n03020211=\"फोल्ड मेट्न यकिन गर्नुहोस्\"\n03020212=\"बहुविध फाइल मेट्न यकिन गर्नुहोस्\"\n03020213=\"तपाईँ '{0}'मेट्न निश्चित हुनुहुन्छ ?\"\n03020214=\"तपाईँ '{0}' फोल्डर यसको सबै सामग्री मेट्न निश्चित हुनुहुन्छ ?\"\n03020215=\"तपाईँ {0} वस्तुहरू मेट्न निश्चित हुनुहुन्छ ?\"\n03020216=\"मेट्दैछ...\"\n03020217=\"फाइल वा फोल्डर मेट्दा त्रुटि\"\n\n03020220=\"पुन: नामकरण...\"\n03020221=\"फाइल वा फोल्डर पुन: नामकरण गर्दा त्रुटि\"\n03020222=\"फाइल प्रतिलिपि गर्न यकिन गर्नुहोस्\"\n03020223=\"तपाईँ फाइलहरू सङ्ग्रहमा प्रतिलिपि गर्न निश्चित हुनुहुन्छ\"\n\n03020230=\"फोल्डर सिर्जना गर्नुहोस्\"\n03020231=\"फोल्डर नाम:\"\n03020232=\"नयाँ फोल्डर\"\n03020233=\"फोल्डर सिर्जना गर्दा त्रुटि\"\n\n03020240=\"फाइल सिर्जना गर्नुहोस्\"\n03020241=\"फाइल नाम:\"\n03020242=\"नयाँ फाइल\"\n03020243=\"फाइल सिर्जना गर्दा त्रुटि\"\n\n03020250=\"चयन गर्नुहोस्\"\n03020251=\"चयन हटाउनुहोस्\"\n03020252=\"मास्क:\"\n\n03020260=\"फोल्डर इतिहार\"\n\n03020280=\"'{0}'फाइल परिमार्जन गरिएको छ ।\\nतपाईँले यसलाई सङ्ग्रहमा अद्यावधिक गर्न चाहनुहुन्छ ?\"\n03020281=\"फाइल अद्यावधिक गर्न सकिदैन\\n'{0}'\"\n03020282=\"सम्पादक सुरु गर्न सकिदैन\"\n03020283=\"खोल्दैछ...\"\n\n03020290=\"टिप्पणी\"\n03020291=\"&टिप्पणी:\"\n\n030202A0=\"प्रणाली\"\n\n03020300=\"कम्प्युटर\"\n03020301=\"सञ्जाल\"\n\n03020400=\"थप्नुहोस्\"\n03020401=\"निकाल्नुहोस्\"\n03020402=\"परीक्षण गर्नुहोस्\"\n\n03020420=\"प्रतिलिपि गर्नुहोस्\"\n03020421=\"सार्नुहोस्\"\n03020422=\"मेट्नुहोस्\"\n03020423=\"सूचना\"\n\n03020500=\"फाइल विभाजन गर्नुहोस्\"\n03020501=\"&यसमा विभाजन गर्नुहोस्:\"\n03020510=\"विभाजन गर्दैछ...\"\n\n03020600=\"फाइल संयोजन गर्नुहोस्\"\n03020601=\"&यसमा संयोजन गर्नुहोस्:\"\n03020610=\"संयोजन गर्दैछ...\"\n\n03020710=\"Checksum गणना गर्दैछ...\"\n03020720=\"Checksum सूचना\"\n03020721=\"लगतका लागि CRC checksum:\"\n03020722=\"लगत र नामहरूका लागि CRC checksum:\"\n\n03020800=\"स्क्यानिङ...\"\n\n; कम्प्युटर\n03031100=\"जम्मा साइज\"\n03031101=\"स्वतन्त्र रिक्तस्थान\"\n03031102=\"समूह साइज\"\n03031103=\"लेबुल\"\n\n; सञ्जाल\n03031200=\"स्थानिय नाम\"\n03031201=\"प्रदायक\"\n\n; बेञ्चमार्क संवाद\n\n03080000=\"बेञ्चमार्क\"\n03080001=\"स्मृति उपयोग:\"\n03080002=\"सङ्कुचन\"\n03080003=\"असङ्कुचन\"\n03080004=\"गति\"\n03080005=\"दर\"\n03080006=\"जम्मा दर\"\n03080007=\"हालको\"\n03080008=\"नतिजा\"\n03080009=\"पास:\"\n0308000A=\"त्रुटि:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/nl.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59 Beta\n; Translated by Jeroen Tulp - Vertaald door Jeroen Tulp\n;\n; Changed and updated translations as done for 7-Zip 4.26 Beta by Jeroen van der Weijde.\n;\n; Special thanks to Fuss! and r00n for their support in perfecting these translations.\n\n00000000=\"Dutch\"\n00000001=\"Nederlands\"\n00000002=\"19\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Configuratie\"\n\n; Info Page\n01000100=\"Over 7-Zip\"\n01000103=\"7-Zip is gratis software. Echter, u kunt de ontwikkeling van 7-Zip ondersteunen door u te registreren.\"\n01000104=\"&Ondersteuning\"\n01000105=\"&Registreren\"\n\n; Folders Page\n01000200=\"Mappen\"\n01000210=\"&Werkmap\"\n01000211=\"&Tijdelijke systeemmap\"\n01000212=\"&Huidige\"\n01000213=\"&Gespecificeerd:\"\n01000214=\"Alleen voor verwisselbare schijven gebruiken.\"\n\n01000281=\"Specificeer een locatie voor tijdelijke archiefbestanden.\"\n\n; System Page\n01000300=\"Systeem\"\n01000301=\"7-Zip in het contextmenu integreren.\"\n01000302=\"Trapsgewijs contextmenu\"\n01000310=\"Contextmenu items:\"\n\n; Language Page\n01000400=\"Taal\"\n01000401=\"Taal:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip opdrachten\"\n02000103=\"Open archief\"\n02000104=\"Opent het geselecteerde archief.\"\n02000105=\"Bestanden uitpakken...\"\n02000106=\"Bestanden uitpakken voor het geselecteerde archief.\"\n02000107=\"Toevoegen aan archief...\"\n02000108=\"Toevoegen van de geselecteerde items aan een archief.\"\n02000109=\"Archief testen\"\n0200010A=\"Integriteit van het geselecteerde archief testen.\"\n0200010B=\"Pak hier uit\"\n0200010C=\"Pakt bestanden in het archief uit naar de huidige map.\"\n0200010D=\"Pak uit naar {0}\"\n0200010E=\"Pakt bestanden in het archief uit naar een submap.\"\n0200010F=\"Toevoegen aan {0}\"\n02000110=\"Toevoegen van geselecteerde items aan het archief.\"\n02000111=\"Comprimeer en verstuur...\"\n02000112=\"Comprimeert de geselecteerde items in een archief en verstuur het via e-mail.\"\n02000113=\"Comprimeer naar {0} en verstuur\"\n02000114=\"Comprimeert de geselecteerde items in het archief en verstuur het via e-mail.\"\n\n02000140=\"<Map>\"\n02000141=\"<Archief>\"\n\n; Properties\n02000203=\"Pad\"\n02000204=\"Naam\"\n02000205=\"Extensie\"\n02000206=\"Map\"\n02000207=\"Grootte\"\n02000208=\"Ingepakte grootte\"\n02000209=\"Kenmerken\"\n0200020A=\"Aangemaakt\"\n0200020B=\"Laatst geopend\"\n0200020C=\"Gewijzigd\"\n0200020D=\"Compact\"\n0200020E=\"Commentaar\"\n0200020F=\"Gecodeerd\"\n02000210=\"Gesplitst voor\"\n02000211=\"Gesplitst na\"\n02000212=\"Woordenboek\"\n02000213=\"CRC\"\n02000214=\"Type\"\n02000215=\"Anti\"\n02000216=\"Methode\"\n02000217=\"Gastheer OS\"\n02000218=\"Bestandssysteem\"\n02000219=\"Gebruiker\"\n0200021A=\"Groep\"\n0200021B=\"Blok\"\n0200021C=\"Opmerking\"\n0200021D=\"Positie\"\n0200021E=\"Pad Prefix\"\n0200021F=\"Mappen\"\n02000220=\"Bestanden\"\n02000221=\"Versie\"\n02000222=\"Volume\"\n02000223=\"Multivolume\"\n02000224=\"Offset\"\n02000225=\"Koppelingen\"\n02000226=\"Blokken\"\n02000227=\"Volumes\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Fysieke grootte\"\n0200022D=\"Kop grootte\"\n0200022E=\"Checksum\"\n0200022F=\"Karakteristieken\"\n02000230=\"Virtueel Adres\"\n\n; Status bar\n02000301=\"{0} item(s) geselecteerd\"\n02000302=\"{0} item(s)\"\n\n02000320=\"Bestanden:\"\n02000321=\"Mappen:\"\n02000322=\"Grootte:\"\n02000323=\"Gecomprimeerde grootte:\"\n02000324=\"Archieven:\"\n\n; List Context Menu\n02000401=\"&Kolommen...\"\n\n02000411=\"&Openen\"\n02000412=\"&Uitpakken...\"\n\n; ToolBar\n02000501=\"Uitpakken\"\n\n; Messages\n02000601=\"Bijwerkfuncties niet ondersteund voor dit archief.\"\n02000602=\"Kan archief {0} niet bijwerken.\"\n02000603=\"Kan map '{0}' niet aanmaken.\"\n02000604=\"Dit bestand is geen ondersteund archief.\"\n02000605=\"Fout\"\n02000606=\"Te veel items\"\n02000607=\"Er is geen programma geassocieerd met deze bestandsextensie.\"\n02000608=\"Er zijn geen fouten.\"\n02000609=\"Kan bestand '{0}' niet openen als archief.\"\n0200060A=\"Kan het gecodeerde archief '{0}' niet openen. Verkeerd wachtwoord?\"\n0200060B=\"Het systeem kan de benodigde hoeveelheid geheugen niet alloceren\"\n0200060C=\"Onbekende fout\"\n0200060D=\"Niet ondersteund archief type\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ja\"\n02000707=\"Ja op &alles\"\n02000709=\"&Nee\"\n0200070B=\"Nee op a&lles\"\n\n02000710=\"Annuleren\"\n02000711=\"&Annuleren\"\n02000713=\"A&fsluiten\"\n02000714=\"Stop\"\n02000715=\"Herstarten\"\n\n02000720=\"Help\"\n\n; Extract dialog\n02000800=\"&Uitpakken\"\n02000801=\"U&itpakken naar:\"\n02000802=\"&Wachtwoord\"\n\n02000810=\"Padmethode\"\n02000811=\"Volledige padnamen\"\n02000812=\"Huidige padnamen\"\n02000813=\"Geen padnamen\"\n\n02000820=\"Overschrijfmethode\"\n02000821=\"Vraag voor overschrijven\"\n02000822=\"Overschrijven zonder bevestiging\"\n02000823=\"Bestaande bestanden overslaan\"\n02000824=\"Automatisch hernoemen\"\n02000825=\"Automatisch hernoemen van bestaande bestanden\"\n\n02000830=\"Bestanden\"\n02000831=\"&Geselecteerde bestanden\"\n02000832=\"&Alle bestanden\"\n\n02000881=\"Geef een locatie op voor de uitgepakte bestanden.\"\n\n02000890=\"Bezig met uitpakken...\"\n\n; Overwrite dialog\n02000900=\"Bevestig vervangen bestand\"\n02000901=\"Doelmap bevat reeds het verwerkte bestand.\"\n02000902=\"Wilt u het bestaande bestand vervangen\"\n02000903=\"door dit bestand?\"\n\n02000911=\"A&utomatisch hernoemen\"\n\n02000982=\"{0} bytes\"\n02000983=\"gewijzigd op\"\n\n; Messages dialog\n02000A00=\"Diagnostische berichten\"\n\n02000A80=\"Bericht\"\n\n02000A91=\"Niet ondersteunde compressiemethode voor '{0}'.\"\n02000A92=\"Gegevensfout in '{0}'. Bestand is beschadigd.\"\n02000A93=\"CRC mislukt in '{0}'. Bestand is beschadigd.\"\n02000A94=\"Gegevensfout in het gecodeerde bestand '{0}'. Verkeerd wachtwoord?\"\n02000A95=\"CRC mislukt in het gecodeerde bestand '{0}'. Verkeerd wachtwoord?\"\n\n; Password dialog\n02000B00=\"Wachtwoord ingeven\"\n02000B01=\"Wachtwoord &ingeven:\"\n02000B02=\"Wachtwoord &tonen\"\n02000B03=\"Wachtwoord bevestigen:\"\n02000B10=\"Wachtwoorden komen niet overeen.\"\n02000B11=\"Gebruik alleen alfanumerieke en speciale karakters (!, #, $, ...) voor het wachtwoord.\"\n02000B12=\"Wachtwoord is te lang.\"\n\n; Progress dialog\n02000C00=\"Verwerking\"\n02000C01=\"Verstreken tijd:\"\n02000C02=\"Overgebleven tijd:\"\n02000C03=\"Grootte:\"\n02000C04=\"Snelheid:\"\n02000C05=\"Verwerkt:\"\n02000C06=\"Compressie verhouding:\"\n\n02000C10=\"&Achtergrond\"\n02000C11=\"&Voorgrond\"\n02000C12=\"&Pauzeren\"\n02000C13=\"&Hervatten\"\n\n02000C20=\"Gepauzeerd\"\n\n02000C30=\"Weet u zeker dat u wilt annuleren?\"\n\n; Compress dialog\n02000D00=\"Toevoegen aan archief\"\n02000D01=\"&Archief:\"\n02000D02=\"&Bijwerkmethode:\"\n02000D03=\"Archief &formaat:\"\n02000D04=\"Compressie&methode:\"\n02000D05=\"&Compact archief maken\"\n02000D06=\"&Parameters:\"\n02000D07=\"Opties\"\n02000D08=\"SF&X archief maken\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Codee&r bestandsnamen\"\n02000D0B=\"Compressie&niveau:\"\n02000D0C=\"&Woordenboekgrootte:\"\n02000D0D=\"W&oordgrootte:\"\n02000D0E=\"Geheugengebruik bij het inpakken:\"\n02000D0F=\"Geheugengebruik bij het uitpakken:\"\n02000D10=\"Codering\"\n02000D11=\"Cod&eermethode:\"\n02000D12=\"Aantal CP&U-threads:\"\n02000D13=\"Compacte b&lokgrootte:\"\n02000D14=\"Niet compact\"\n02000D15=\"Compact\"\n02000D16=\"Comprimeer &gedeelde bestanden\"\n\n02000D40=\"Opsplitsen in &volumes (grootte in bytes):\"\n02000D41=\"Verkeerde volumegrootte\"\n02000D42=\"Gespecificeerde volumegrootte: {0} bytes.\\nWeet u zeker dat u het archief zo wilt splitsen?\"\n\n02000D81=\"Opslaan\"\n02000D82=\"Normaal\"\n02000D83=\"Maximum\"\n02000D84=\"Snel\"\n02000D85=\"Snelst\"\n02000D86=\"Ultra\"\n\n02000D90=\"Bladeren\"\n\n02000DA1=\"Bestanden toevoegen en vervangen\"\n02000DA2=\"Bestanden bijwerken en toevoegen\"\n02000DA3=\"Bestaande bestanden opfrissen\"\n02000DA4=\"Bestanden synchroniseren\"\n\n02000DB1=\"Alle bestanden\"\n\n02000DC0=\"Bezig met comprimeren...\"\n\n; Columns dialog\n02000E00=\"Kolommen\"\n02000E01=\"Markeer de kolommen die u zichtbar wilt maken in deze map. Gebruik de omhoog en omlaag knoppen om de kolommen te rangschikken.\"\n02000E02=\"De gemarkeerde kolom moet\"\n02000E03=\"pixels &breed zijn.\"\n\n02000E10=\"Om&hoog verplaatsen\"\n02000E11=\"Om&laag verplaatsen\"\n02000E12=\"&Tonen\"\n02000E13=\"&Verbergen\"\n02000E14=\"Instellen\"\n\n02000E81=\"Titel\"\n02000E82=\"Breedte\"\n\n; Testing\n02000F90=\"Bezig met testen...\"\n\n\n; File Manager\n\n03000000=\"7-Zip Bestandsbeheer\"\n\n; Menu\n03000102=\"&Bestand\"\n03000103=\"Be&werken\"\n03000104=\"Bee&ld\"\n03000105=\"E&xtra\"\n03000106=\"&Help\"\n03000107=\"&Favorieten\"\n\n; File\n03000210=\"&Openen\"\n03000211=\"Open B&innen\"\n03000212=\"Open B&uiten\"\n03000220=\"Bee&ld\"\n03000221=\"&Bewerken\"\n03000230=\"Naam wi&jzigen\"\n03000231=\"Kopiëren &naar...\"\n03000232=\"&Verplaatsen naar...\"\n03000233=\"Verwij&deren\"\n03000240=\"Ei&genschappen\"\n03000241=\"O&pmerking\"\n03000242=\"&Checksum berekenen\"\n03000250=\"Nieuwe &map\"\n03000251=\"Nieuw b&estand\"\n03000260=\"&Sluiten\"\n03000270=\"Bestand opspli&tsen...\"\n03000271=\"Bestanden s&amenvoegen...\"\n\n; Edit\n03000310=\"&Ongedaan maken\"\n03000311=\"&Opnieuw\"\n03000320=\"Kn&ippen\"\n03000321=\"&Kopiëren\"\n03000322=\"P&lakken\"\n03000323=\"Verwij&deren\"\n03000330=\"&Alles selecteren\"\n03000331=\"All&es de-selecteren\"\n03000332=\"Sele&ctie omkeren\"\n03000333=\"&Selecteer...\"\n03000334=\"&De-selecteer...\"\n03000335=\"&Selecteer op type\"\n03000336=\"&De-selecteer op type\"\n\n; View\n03000410=\"&Grote pictogrammen\"\n03000411=\"&Kleine pictogrammen\"\n03000412=\"&Lijst\"\n03000413=\"&Details\"\n03000420=\"&Ongesorteerd\"\n03000430=\"&Root map openen\"\n03000431=\"Één &niveau omhoog\"\n03000432=\"&Mappen Geschiedenis...\"\n03000440=\"&Vernieuwen\"\n03000449=\"&Platte weergave\"\n03000450=\"&2 Panelen\"\n03000451=\"&Werkbalken\"\n03000460=\"&Archief werkbalk\"\n03000461=\"&Standaard werkbalk\"\n03000462=\"Grote kn&oppen\"\n03000463=\"Knop&tekst weergeven\"\n\n; Tools\n03000510=\"&Opties...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Inhoud...\"\n03000620=\"&Over 7-Zip...\"\n\n; Favorites\n03000710=\"&Map toevoegen aan favorieten\"\n03000720=\"Toevoegen als\"\n\n; Options Dialog\n\n03010000=\"Opties\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"&Opties...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Systeem\"\n03010302=\"Associeer 7-Zip met:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Instellingen\"\n03010401=\"Toon \\\"..\\\" &item\"\n03010402=\"Toon &echte bestandspictogrammen\"\n03010410=\"Toon &systeem contextmenu\"\n03010420=\"&Selecteer gehele rij\"\n03010421=\"Toon &rasterlijnen\"\n03010430=\"&Alternatieve selectiemodus\"\n03010440=\"&Gebruik grote geheugenpagina's\"\n\n; Strings\n\n03020201=\"Kopiëren\"\n03020202=\"Verplaatsen\"\n03020203=\"Kopiëren naar:\"\n03020204=\"Verplaatsen naar:\"\n03020205=\"Bezig met kopiëren...\"\n03020206=\"Bezig met verplaatsen...\"\n03020207=\"U kunt items niet verplaatsen of kopiëren voor dergelijke mappen.\"\n03020208=\"Functie wordt niet ondersteund.\"\n03020209=\"Selecteer een doelmap.\"\n\n03020210=\"Verwijdering bestand bevestigen\"\n03020211=\"Verwijdering map bevestigen\"\n03020212=\"Verwijdering van meerdere bestanden bevestigen\"\n03020213=\"Weet u zeker dat u '{0}' wilt verwijderen?\"\n03020214=\"Weet u zeker dat u de map '{0}' en alle onderliggende items wilt verwijderen?\"\n03020215=\"Weet u zeker dat u deze {0} items wilt verwijderen?\"\n03020216=\"Bezig met verwijderen...\"\n03020217=\"Fout bij het verwijderen van een bestand of map\"\n\n03020220=\"Bezig met hernoemen...\"\n03020221=\"Fout bij het hernoemen van een bestand of map\"\n03020222=\"Bevestig kopiëren van bestand\"\n03020223=\"Weet u zeker dat u deze bestanden naar het archief wilt kopiëren\"\n\n03020230=\"Map maken\"\n03020231=\"Naam van de map:\"\n03020232=\"Nieuwe map\"\n03020233=\"Fout bij het maken van de map\"\n\n03020240=\"Bestand maken\"\n03020241=\"Bestandsnaam:\"\n03020242=\"Nieuw bestand\"\n03020243=\"Fout bij het maken van het bestand.\"\n\n03020250=\"Selecteren\"\n03020251=\"De-selecteren\"\n03020252=\"Masker:\"\n\n03020260=\"Mappen Geschiedenis\"\n\n03020280=\"Bestand '{0}' is gewijzigd.\\nWilt u het bijwerken in het archief?\"\n03020281=\"Kan bestand\\n'{0}' niet bijwerken.\"\n03020282=\"Kan de editor niet starten.\"\n03020283=\"Bezig met openen...\"\n\n03020290=\"Opmerking\"\n03020291=\"&Opmerking:\"\n\n030202A0=\"Systeem\"\n\n03020300=\"Computer\"\n03020301=\"Netwerk\"\n03020302=\"Documenten\"\n\n03020400=\"Toevoegen\"\n03020401=\"Uitpakken\"\n03020402=\"Testen\"\n\n03020420=\"Kopiëren\"\n03020421=\"Verplaatsen\"\n03020422=\"Verwijderen\"\n03020423=\"Info\"\n\n03020500=\"Opsplitsen bestand\"\n03020501=\"&Opsplitsen naar:\"\n03020510=\"Bezig met opsplitsen...\"\n03020520=\"Bevestigen opsplitsen\"\n03020521=\"Weet u zeker dat u het bestand wilt opsplitsen in {0} volumes?\"\n03020522=\"De volumegrootte moet kleiner zijn dan de grootte van het oorspronkelijke bestand.\"\n\n03020600=\"Bestanden samenvoegen\"\n03020601=\"&Samenvoegen naar:\"\n03020610=\"Bezig met samenvoegen...\"\n03020620=\"Selecteer alleen het eerste bestand.\"\n03020621=\"Kan het bestand niet herkennen als onderdeel van een gesplitst bestand\"\n03020622=\"Kan niet meer dan 1  deel van een gesplitst bestand\"\n\n03020710=\"Bezig met checksum berekenen...\"\n03020720=\"Checksum informatie\"\n03020721=\"CRC checksum voor gegevens:\"\n03020722=\"CRC checksum voor gegevens en namen:\"\n\n03020800=\"Bezig met scannen...\"\n\n03020900=\"Eigenschappen\"\n\n03020A01=\"De actie kan niet worden uitgevoerd vanuit een folder met een dermate lang pad.\"\n03020A02=\"U moet 1 bestand selecteren\"\n03020A03=\"U moet 1 of meerdere bestanden selecteren\"\n03020A04=\"Bestand {0} bestaat reeds\"\n\n; Computer\n03031100=\"Capaciteit\"\n03031101=\"Beschikbaar\"\n03031102=\"Clustergrootte\"\n03031103=\"Label\"\n\n; Network\n03031200=\"Lokale naam\"\n03031201=\"Provider\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Geheugengebruik:\"\n03080002=\"Inpakken\"\n03080003=\"Uitpakken\"\n03080004=\"Snelheid\"\n03080005=\"Waarde\"\n03080006=\"Totale waarde\"\n03080007=\"Huidig\"\n03080008=\"Resultaat\"\n03080009=\"Doorgangen:\"\n0308000A=\"Fouten:\"\n0308000B=\"CPU-gebruik\"\n0308000C=\"Waarde / gebruik\"\n\n;!@LangEnd@!\n\n \t  \t \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/nn.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.45\n; Translated by Robert Grønning\n;\n;\n;\n;\n\n00000000=\"Norwegian Nynorsk\"\n00000001=\"Norsk Nynorsk\"\n00000002=\"20-2\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip innstillingar\"\n\n; Info Page\n01000100=\"Om 7-Zip\"\n01000103=\"7-Zip er fri programvare. Du kan støtta utviklinga av 7-Zip ved å registrere deg.\"\n01000104=\"Brukarstøtte\"\n01000105=\"Registrering\"\n\n; Folders Page\n01000200=\"Mapper\"\n01000210=\"&Arbeidsmappe\"\n01000211=\"&Midlertidig mappe\"\n01000212=\"&Noverande\"\n01000213=\"&Eigendefinert:\"\n01000214=\"Berre for flyttbare stasjonar\"\n\n01000281=\"Oppgje plassering for midlertidige arkiv filer.\"\n\n; System Page\n01000300=\"System\"\n01000301=\"Legg inn 7-Zip i programmenyen\"\n01000302=\"Forgreina programmeny\"\n01000310=\"Programmeny val:\"\n\n; Language Page\n01000400=\"Språk\"\n01000401=\"Språk:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip kommandoar\"\n02000103=\"Opna arkiv\"\n02000104=\"Opna valt arkiv.\"\n02000105=\"Pakk ut filer...\"\n02000106=\"Pakk ut filer frå valt arkiv.\"\n02000107=\"Legg til i arkiv...\"\n02000108=\"Legg til utval i arkiv.\"\n02000109=\"Test arkiv\"\n0200010A=\"Testar integriteten til valt arkiv.\"\n0200010B=\"Pakk ut her\"\n0200010C=\"Pakkar ut filer frå valt arkiv til denne mappa.\"\n0200010D=\"Pakk ut til {0}\"\n0200010E=\"Pakkar ut filer til undermappe.\"\n0200010F=\"Legg til i {0}\"\n02000110=\"Legg utval til i arkiv.\"\n02000111=\"Komprimere og send som epost...\"\n02000112=\"Komprimere utval til et arkiv og send det som epost.\"\n02000113=\"Komprimere til {0} og send som epost\"\n02000114=\"Komprimere utval til et arkiv og send det som epost.\"\n\n02000140=\"<Mappe>\"\n02000141=\"<Arkiv>\"\n\n; Properties\n02000203=\"Bane\"\n02000204=\"Namn\"\n02000205=\"Fil etternamn\"\n02000206=\"Mappe\"\n02000207=\"Størrelse\"\n02000208=\"Komprimert Størrelse\"\n02000209=\"Eigenskapar\"\n0200020A=\"Oppretta\"\n0200020B=\"Opna\"\n0200020C=\"Endra\"\n0200020D=\"Solid\"\n0200020E=\"Kommentert\"\n0200020F=\"Kryptert\"\n02000210=\"Delt før\"\n02000211=\"Delt etter\"\n02000212=\"Ordbok\"\n02000213=\"CRC\"\n02000214=\"Type\"\n02000215=\"Anti\"\n02000216=\"Metode\"\n02000217=\"Vert OS\"\n02000218=\"Filsystem\"\n02000219=\"Brukar\"\n0200021A=\"Gruppe\"\n0200021B=\"Blokkering\"\n0200021C=\"Kommentar\"\n0200021D=\"Posisjon\"\n0200021E=\"Bane prefiks\"\n\n; Status bar\n02000301=\"{0} objekt(ar) valt\"\n02000302=\"{0} objekt(ar)\"\n\n02000320=\"Filer:\"\n02000321=\"Mapper:\"\n02000322=\"Størrelse:\"\n\n; List Context Menu\n02000401=\"&Kolonner...\"\n\n02000411=\"&Opna\"\n02000412=\"&Pakk ut...\"\n\n; ToolBar\n02000501=\"Pakk ut\"\n\n; Messages\n02000601=\"Dette arkivet manglar støtte for å kunne oppdaterast.\"\n02000602=\"Kan ikkje oppdatere arkiv {0}\"\n02000603=\"Kan ikkje oppretta mappe '{0}'\"\n02000604=\"Fila er ikkje eit støtta arkiv.\"\n02000605=\"Feil\"\n02000606=\"For mange gonger\"\n02000607=\"Ingen program er tilknytt dette fil etternamnet\"\n02000608=\"Ingen feil\"\n02000609=\"Kan ikkje opna fila '{0}' som eit arkiv\"\n0200060A=\"Kan ikkje opna det krypterte arkivet '{0}'. Feil passord?\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ja\"\n02000707=\"Ja til &alt\"\n02000709=\"&Nei\"\n0200070B=\"N&ei til alt\"\n\n02000710=\"Avbryt\"\n02000711=\"&Avbryt\"\n02000713=\"&Lukke\"\n02000714=\"Stopp\"\n02000715=\"Start på nytt\"\n\n02000720=\"Hjelp\"\n\n; Extract dialog\n02000800=\"Pakk ut\"\n02000801=\"Pakk ut &til:\"\n02000802=\"Passord\"\n\n02000810=\"Bane modus\"\n02000811=\"Fulstendig banenamn\"\n02000812=\"Noverande banenamn\"\n02000813=\"Ingen banenamn\"\n\n02000820=\"Overskriving modus\"\n02000821=\"Bekrefta før overskriving\"\n02000822=\"Skriv over utan bekrefting\"\n02000823=\"Hopp over eksisterande filer\"\n02000824=\"Endra filnamn automatisk\"\n02000825=\"Endra filnamn automatisk for eksisterande filer\"\n\n02000830=\"Filer\"\n02000831=\"&Valte filer\"\n02000832=\"&Alle filer\"\n\n02000881=\"Vel ei mappe for ut-pakka filer.\"\n\n02000890=\"Pakkar ut\"\n\n; Overwrite dialog\n02000900=\"Bekrefta overskriving av fil\"\n02000901=\"Målmappa inneheld allereie ei behandla fil.\"\n02000902=\"Vil du overskriva den eksisterande fila\"\n02000903=\"med denne?\"\n\n02000911=\"&Skift filnamn automatisk\"\n\n02000982=\"{0} byte\"\n02000983=\"endra på\"\n\n; Messages dialog\n02000A00=\"Diagnose meldingar\"\n\n02000A80=\"Melding\"\n\n02000A91=\"Kompresjonsmetoden er ikkje støtta for '{0}'.\"\n02000A92=\"Data feil i '{0}'. Fila er øydelagt.\"\n02000A93=\"CRC feila på '{0}'. Fila er øydelagt.\"\n02000A94=\"Data feil i den krypterte fila '{0}'. Feil passord?\"\n02000A95=\"CRC feila i den krypterte fila '{0}'. Feil passord?\"\n\n; Password dialog\n02000B00=\"Skriv inn passord\"\n02000B01=\"Skriv inn passord:\"\n02000B02=\"&Vis passord\"\n02000B03=\"Skriv inn passordet på nytt:\"\n02000B10=\"Passorda er ikkje like\"\n02000B11=\"Bruk berre Engelske bokstavar, tal og spesielle teikn (!, #, $, ...) i passordet\"\n02000B12=\"Passordet er for langt\"\n\n; Progress dialog\n02000C00=\"Prosess\"\n02000C01=\"Tid brukt:\"\n02000C02=\"Tid gjenstår:\"\n02000C03=\"Størrelse:\"\n02000C04=\"Fart:\"\n\n02000C10=\"&Bakgrunn\"\n02000C11=\"&Forgrunn\"\n02000C12=\"&Pause\"\n02000C13=\"&Hald fram\"\n\n02000C20=\"Sett på pause\"\n\n02000C30=\"Er du sikker på du vil avbryte?\"\n\n; Compress dialog\n02000D00=\"Legg til i arkiv\"\n02000D01=\"&Arkiv:\"\n02000D02=\"&Oppdaterings modus:\"\n02000D03=\"Arkiv &format:\"\n02000D04=\"Kompresjons &metode:\"\n02000D05=\"Opprett eit &Solid arkiv\"\n02000D06=\"&Parameter:\"\n02000D07=\"Val\"\n02000D08=\"Opprett SF&X arkiv\"\n02000D09=\"Fleirtråda\"\n02000D0A=\"&Krypter filnamn\"\n02000D0B=\"Kompresjons &nivå:\"\n02000D0C=\"O&rdbok størrelse:\"\n02000D0D=\"Or&d størrelse:\"\n02000D0E=\"Minnebruk ved kompresjon:\"\n02000D0F=\"Minnebruk ved ut-pakking:\"\n02000D10=\"Krypter\"\n02000D11=\"Krypter metode:\"\n02000D12=\"Anntal CPU tråder:\"\n02000D13=\"Solid blokk størrelse:\"\n02000D14=\"Ikkje-solid\"\n02000D15=\"Solid\"\n\n02000D40=\"Splitt opp i deler, byte:\"\n02000D41=\"Feil del-størrelse\"\n02000D42=\"Oppgitt del-størrelse: {0} byte.\\nEr du sikker på du vil dele arkivet opp i slike deler?\"\n\n02000D81=\"Lagre\"\n02000D82=\"Normal\"\n02000D83=\"Maksimum\"\n02000D84=\"Rask\"\n02000D85=\"Raskast\"\n02000D86=\"Ekstrem\"\n\n02000D90=\"Bla igjennom\"\n\n02000DA1=\"Legg til og skriv over filer\"\n02000DA2=\"Oppdatere og legg til filer\"\n02000DA3=\"Frisk opp eksisterande filer\"\n02000DA4=\"Synkroniser filer\"\n\n02000DB1=\"Alle filer\"\n\n02000DC0=\"Komprimerer\"\n\n; Columns dialog\n02000E00=\"Kolonner\"\n02000E01=\"Merk kolonnene du vil visa i denne mappa. Bruk Flytt opp og Flytt ned knappane for å endra plassringen på kolonnene.\"\n02000E02=\"Den valte kolonna skal vera\"\n02000E03=\"punkter &brei.\"\n\n02000E10=\"Flytt &Opp\"\n02000E11=\"Flytt &Ned\"\n02000E12=\"&Vis\"\n02000E13=\"&Gøym\"\n02000E14=\"Bruk\"\n\n02000E81=\"Tittel\"\n02000E82=\"Breidde\"\n\n; Testing\n02000F90=\"Testing\"\n\n\n; File Manager\n\n03000000=\"7-Zip Fil behandlar\"\n\n; Menu\n03000102=\"&Fil\"\n03000103=\"&Redigere\"\n03000104=\"&Vis\"\n03000105=\"Verk&tøy\"\n03000106=\"&Hjelp\"\n03000107=\"F&avorittar\"\n\n; File\n03000210=\"&Opna\"\n03000211=\"Opna &Inni\"\n03000212=\"Opna &Utanfor\"\n03000220=\"&Vis\"\n03000221=\"&Redigere\"\n03000230=\"Endra &namn\"\n03000231=\"&Kopiere til...\"\n03000232=\"&Flytt til...\"\n03000233=\"&Slett\"\n03000240=\"&Eigenskapar\"\n03000241=\"Ko&mmentar\"\n03000242=\"Rekna ut kontrollnummer\"\n03000250=\"Opprett mappe\"\n03000251=\"Opprett fil\"\n03000260=\"&Avslutta\"\n03000270=\"&Del opp fil...\"\n03000271=\"Set saman filer...\"\n\n; Edit\n03000310=\"&Angre\"\n03000311=\"&Gjer om\"\n03000320=\"Klipp &ut\"\n03000321=\"&Kopiere\"\n03000322=\"Lim &inn\"\n03000323=\"&Slett\"\n03000330=\"&Merk alle\"\n03000331=\"Fjern alle markeringar\"\n03000332=\"&Omvendt markering\"\n03000333=\"Marker...\"\n03000334=\"Fjern markering...\"\n03000335=\"Merk etter type\"\n03000336=\"Fjern markering etter type\"\n\n; View\n03000410=\"S&tore ikon\"\n03000411=\"S&må ikon\"\n03000412=\"&Lista\"\n03000413=\"&Detaljar\"\n03000420=\"Assortert\"\n03000430=\"Opna kjeldemappa\"\n03000431=\"Opp eit nivå\"\n03000432=\"Mappelogg...\"\n03000440=\"&Oppdatere\"\n03000449=\"Flat vising\"\n03000450=\"&2 felt\"\n03000451=\"&Verktøylinjer\"\n03000460=\"Arkiv verktøylinje\"\n03000461=\"Standard verktøylinjer\"\n03000462=\"Store knappar\"\n03000463=\"Vis knappetekst\"\n\n; Tools\n03000510=\"&Val...\"\n03000511=\"&Yting test\"\n\n; Help\n03000610=\"&Innhold...\"\n03000620=\"&Om 7-Zip...\"\n\n; Favorites\n03000710=\"&Legg mappe til i favorittar som\"\n03000720=\"Bokmerke\"\n\n; Options Dialog\n\n03010000=\"Val\"\n\n; Plugins\n03010100=\"Tillegg\"\n03010101=\"&Tillegg:\"\n03010110=\"Val...\"\n\n; Edit\n03010200=\"Redigeringsprogram\"\n03010201=\"&Redigeringsprogram:\"\n\n; System\n03010300=\"System\"\n03010302=\"Forbind 7-Zip med:\"\n03010310=\"Tillegg\"\n\n; Settings\n03010400=\"Innstillingar\"\n03010401=\"Vis \\\"..\\\" element\"\n03010402=\"Vis dei ordentlege fil ikona\"\n03010410=\"Vis system meny\"\n03010420=\"&Merk heile rader\"\n03010421=\"Vis &rutenett\"\n03010430=\"&Alternativ markerings modus\"\n03010440=\"Bruk &store minnesider\"\n\n; Strings\n\n03020201=\"Kopiere\"\n03020202=\"Flytt\"\n03020203=\"Kopiere til:\"\n03020204=\"Flytt til:\"\n03020205=\"Kopierer...\"\n03020206=\"Flyttar...\"\n03020207=\"Du kan ikkje flytta eller kopiere element i slike mapper.\"\n03020208=\"Støttar ikkje handlinga.\"\n03020209=\"Vel målmappe.\"\n\n03020210=\"Godkjenne sletting av fil\"\n03020211=\"Godkjenne sletting av mappe\"\n03020212=\"Godkjenne sletting av fleire filer\"\n03020213=\"Er du sikker på at du vil sletta '{0}'?\"\n03020214=\"Er du sikker på at du vil sletta mappa '{0}' og alt innhold i den?\"\n03020215=\"Er du sikker på at du vil sletta desse {0} elementa?\"\n03020216=\"Slettar...\"\n03020217=\"Feil ved sletting av fil eller mappe\"\n\n03020220=\"Endrar namn...\"\n03020221=\"Feil ved endring av namn på fil eller mappe\"\n03020222=\"Godkjenne filkopiering\"\n03020223=\"Er du sikker på at du vil kopiere filer til arkiv\"\n\n03020230=\"Opprett mappe\"\n03020231=\"Mappe namn:\"\n03020232=\"Ny mappe\"\n03020233=\"Feil ved oppretting av mappe\"\n\n03020240=\"Opprett fil\"\n03020241=\"Filnamn:\"\n03020242=\"Ny fil\"\n03020243=\"Feil ved oppretting av fil\"\n\n03020250=\"Marker\"\n03020251=\"Fjern markering\"\n03020252=\"Maske:\"\n\n03020260=\"Mappe logg\"\n\n03020280=\"Fila '{0}' blei endra.\\nVil du oppdatere den i arkivet?\"\n03020281=\"Kan ikkje oppdatere fil\\n'{0}'\"\n03020282=\"Kan ikkje starta redigeringsprogram.\"\n03020283=\"Opnar...\"\n\n03020290=\"Kommentar\"\n03020291=\"&Kommentar:\"\n\n030202A0=\"System\"\n\n03020300=\"Datamaskin\"\n03020301=\"Nettverk\"\n\n03020400=\"Legg til\"\n03020401=\"Pakk ut\"\n03020402=\"Test\"\n\n03020420=\"Kopiere\"\n03020421=\"Flytt\"\n03020422=\"Slett\"\n03020423=\"Informasjon\"\n\n03020500=\"Del opp fil\"\n03020501=\"&Del opp til:\"\n03020510=\"Delar opp...\"\n03020520=\"Godkjenne oppdeling\"\n03020521=\"Er du sikker på at du vil dele opp fila i {0} delar?\"\n03020522=\"Størrelsen på delane må vera mindre enn størrelsen på originalfila\"\n\n03020600=\"Slå saman filer\"\n03020601=\"&Slå saman til:\"\n03020610=\"Slår saman...\"\n03020620=\"Berre vel den første fila\"\n\n03020710=\"Reknar ut kontrollnummer...\"\n03020720=\"Informasjon om kontrollnummer\"\n03020721=\"CRC kontrollnummer for data:\"\n03020722=\"CRC kontrollnummer for data og namn:\"\n\n03020800=\"Undersøkjer...\"\n\n; Computer\n03031100=\"Total størrelse\"\n03031101=\"Ledig plass\"\n03031102=\"Klyngje størrelse\"\n03031103=\"Etikett\"\n\n; Network\n03031200=\"Lokalt namn\"\n03031201=\"Leverandør\"\n\n; Benchmark Dialog\n\n03080000=\"Yting test\"\n03080001=\"Minnebruk:\"\n03080002=\"Kompresjon\"\n03080003=\"Ut-pakking\"\n03080004=\"Fart\"\n03080005=\"Yting\"\n03080006=\"Total yting\"\n03080007=\"Noverande\"\n03080008=\"Resultat\"\n03080009=\"Gonger:\"\n0308000A=\"Feil:\"\n0308000B=\"CPU bruk\"\n0308000C=\"Yting / Bruk\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/pa-in.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by Gurmeet Singh Kochar\n;\n;\n;\n;\n\n00000000=\"Punjabi, Indian\"\n00000001=\"ਪੰਜਾਬੀ\"\n00000002=\"70-1\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-ਜ਼ਿੱਪ ਸਰੰਚਨਾ\"\n\n; Info Page\n01000100=\"7-ਜ਼ਿੱਪ ਬਾਰੇ\"\n01000103=\"7-ਜ਼ਿੱਪ ਇੱਕ ਮੁਫ਼ਤ ਸਾਫ਼ਟਵੇਅਰ ਹੈ। ਪਰ ਫੇਰ ਵੀ, ਤੁਸੀਂ ਰਜਿਸਟਰ ਕਰਕੇ 7-ਜ਼ਿੱਪ ਦੇ ਵਿਕਾਸ ਵਿੱਚ ਸਮਰਥਨ ਪਾ ਸੱਕਦੇ ਹੋ।\\n\\nਪੰਜਾਬੀ ਵਿੱਚ ਅਨੁਵਾਦ ਕੀਤਾ (Translation Done By):\\nGurmeet Singh Kochar (ਗੁਰਮੀਤ ਸਿੰਘ ਕੋਚਰ)\\n<gomikochar@yahoo.com>\"\n01000104=\"ਸਮਰਥਨ\"\n01000105=\"ਰਜਿਸਟਰ\"\n\n; Folders Page\n01000200=\"ਫੋਲਡਰ\"\n01000210=\"ਵਰਕਿੰਗ ਫੋਲਡਰ (&W)\"\n01000211=\"ਸਿਸਟਮ ਆਰਜ਼ੀ (temp) ਫੋਲਡਰ (&S)\"\n01000212=\"ਇਸ ਸਮੇਂ ਚੁਣਿਆ (&C)\"\n01000213=\"ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ (&S):\"\n01000214=\"ਸਿਰਫ਼ ਹਟਾਈ ਜਾ ਸੱਕਨ ਵਾਲੀਆਂ ਡਰਾਈਵ ਲਈ ਵਰਤੋਂ ਕਰੋ\"\n\n01000281=\"ਆਰਜ਼ੀ ਆਕਾਈਵ ਫਾਇਲਾਂ ਲਈ ਟਿਕਾਣਾ ਦੱਸੋ।\"\n\n; System Page\n01000300=\"ਸਿਸਟਮ\"\n01000301=\"ਸ਼ੈੱਲ ਕੰਨਟੈਕਸਟ ਮੇਨੂੰ ਨਾਲ 7-ਜ਼ਿੱਪ ਨੂੰ ਏਕੀਕਿਰਤ ਕਰੋ\"\n01000302=\"ਕੈਸਕੇਡਡ ਕੰਨਟੈਕਸਟ ਮੇਨੂੰ\"\n01000310=\"ਕੰਨਟੈਕਸਟ ਮੇਨੂੰ ਆਈਟਮਾਂ:\"\n\n; Language Page\n01000400=\"ਭਾਸ਼ਾ\"\n01000401=\"ਭਾਸ਼ਾ:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-ਜ਼ਿੱਪ\"\n02000102=\"7-ਜ਼ਿੱਪ ਕਮਾਂਡਾਂ\"\n02000103=\"ਆਕਾਈਵ ਖੋਲੋ\"\n02000104=\"ਚੁਣੇ ਆਕਾਈਵ ਨੂੰ ਖੋਲੇਣ ਲਈ।\"\n02000105=\"ਫਾਇਲਾਂ ਕੱਡੋ...\"\n02000106=\"ਚੁਣੇ ਆਕਾਈਵ ਵਿੱਚੋਂ ਫਾਇਲਾਂ ਕੱਡਣ ਲਈ।\"\n02000107=\"ਆਕਾਈਵ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ...\"\n02000108=\"ਚੁਣੀਆਂ ਆਈਟਮਾਂ ਆਕਾਈਵ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨ ਲਈ।\"\n02000109=\"ਆਕਾਈਵ ਪਰਖੋ\"\n0200010A=\"ਚੁਣੇ ਆਕਾਈਵ ਦੀ ਅਖੰਡਤਾ ਪਰਖਨ ਲਈ।\"\n0200010B=\"ਫਾਇਲਾਂ ਇੱਥੇ ਕੱਡੋ\"\n0200010C=\"ਇਸ ਵੇਲੇ ਦੇ ਫੋਲਡਰ ਵਿੱਚ ਚੁਣੇ ਆਕਾਈਵ ਵਿੱਚੋਂ ਫਾਇਲਾਂ ਕੱਡਣ ਲਈ।\"\n0200010D=\"{0} ਵਿੱਚ ਕੱਡੋ\"\n0200010E=\"ਉਪ-ਫੋਲਡਰ ਵਿੱਚ ਫਾਇਲਾਂ ਕੱਡਣ ਲਈ।\"\n0200010F=\"{0} ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ\"\n02000110=\"ਚੁਣੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਆਕਾਈਵ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨ ਲਈ।\"\n02000111=\"ਨਪੀੜੋ ਅਤੇ ਈਮੇਲ ਕਰੋ...\"\n02000112=\"ਚੁਣੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਆਕਾਈਵ ਵਿੱਚ ਨਪੀੜਨ ਅਤੇ ਆਕਾਈਵ ਨੂੰ ਈਮੇਲ ਰਾਂਹੀ ਭੇਜਨ ਲਈ।\"\n02000113=\"{0} ਵਿੱਚ ਨਪੀੜੋ ਅਤੇ ਈਮੇਲ ਕਰੋ\"\n02000114=\"ਚੁਣੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਆਕਾਈਵ ਵਿੱਚ ਨਪੀੜਨ ਅਤੇ ਆਕਾਈਵ ਨੂੰ ਈਮੇਲ ਰਾਂਹੀ ਭੇਜਨ ਲਈ।\"\n\n02000140=\"<ਫੋਲਡਰ>\"\n02000141=\"<ਆਕਾਈਵ>\"\n\n; Properties\n02000203=\"ਮਾਰਗ\"\n02000204=\"ਨਾਂ\"\n02000205=\"ਐਕਸਟੈਂਸ਼ਨ\"\n02000206=\"ਫੋਲਡਰ\"\n02000207=\"ਸਾਈਜ਼\"\n02000208=\"ਪੈਕਡ ਸਾਈਜ਼\"\n02000209=\"ਲੱਛਨ\"\n0200020A=\"ਬਣਤਰ ਸਮਾਂ\"\n0200020B=\"ਪਹੁੰਚ ਸਮਾਂ\"\n0200020C=\"ਸੋਧ ਸਮਾਂ\"\n0200020D=\"ਠੋਸ\"\n0200020E=\"ਟਿੱਪਣੀ\"\n0200020F=\"ਐਨਕ੍ਰਿਪਟਡ\"\n02000210=\"Split Before\"\n02000211=\"Split After\"\n02000212=\"ਡਿਕਸ਼ਨਰੀ\"\n02000213=\"ਸੀ-ਆਰ-ਸੀ (CRC)\"\n02000214=\"ਕਿਸਮ\"\n02000215=\"ਐਂਟੀ (Anti)\"\n02000216=\"ਢੰਗ\"\n02000217=\"ਮੇਜ਼ਬਾਨ ਔ-ਐੱਸ\"\n02000218=\"ਫਾਇਲ ਸਿਸਟਮ\"\n02000219=\"ਯੂਜ਼ਰ\"\n0200021A=\"ਸਮੂਹ\"\n0200021B=\"ਬਲੋਕ\"\n0200021C=\"ਟਿੱਪਣੀ\"\n0200021D=\"ਸਥਿੱਤੀ\"\n0200021E=\"ਮਾਰਗ ਅਗੇਤਰ\"\n0200021F=\"ਫੋਲਡਰ\"\n02000220=\"ਫਾਇਲਾਂ\"\n02000221=\"ਵਰਜਨ\"\n02000222=\"ਵੋਲੁੱਮ\"\n02000223=\"ਮਲਟੀਵੋਲੁੱਮ\"\n02000224=\"ਔਫ਼ਸੈਟ\"\n02000225=\"ਲਿੰਕ\"\n02000226=\"ਬਲੋਕ\"\n02000227=\"ਵੋਲੁੱਮ\"\n\n; Status bar\n02000301=\"ਚੁਣੇ ਪਦਾਰਥ: {0}\"\n02000302=\"{0} ਪਦਾਰਥ\"\n\n02000320=\"ਫਾਇਲਾਂ:\"\n02000321=\"ਫੋਲਡਰ:\"\n02000322=\"ਸਾਈਜ਼:\"\n02000323=\"ਨਪੀੜਤ ਸਾਈਜ਼:\"\n02000324=\"ਆਕਾਈਵਾਂ:\"\n\n; List Context Menu\n02000401=\"ਕਾਲਮ (&C)...\"\n\n02000411=\"ਖੋਲੋ (&O)\"\n02000412=\"ਕੱਡੋ (&E)...\"\n\n; ToolBar\n02000501=\"ਕੱਡੋ\"\n\n; Messages\n02000601=\"ਅੱਪਡੇਟ ਔਪਰੇਸ਼ਨ ਇਸ ਆਕਾਈਵ ਲਈ ਸਹਿਯੋਗੀ ਨਹੀਂ ਹਨ।\"\n02000602=\"{0} ਆਕਾਈਵ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸੱਕੀ\"\n02000603=\"'{0}' ਫੋਲਡਰ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸੱਕਿਆ\"\n02000604=\"ਫਾਇਲ ਇੱਕ ਸਹਿਯੋਗੀ ਆਕਾਈਵ ਨਹੀਂ ਹੈ।\"\n02000605=\"ਸਮੱਸਿਆ\"\n02000606=\"ਬਹੁੱਤ ਸਾਰੀਆਂ ਆਈਟਮਾਂ\"\n02000607=\"ਦਿੱਤੀ ਗਈ ਫਾਇਲ ਐਕਸਟੈਂਸ਼ਨ ਨਾਲ ਕੋਈ ਵੀ ਕਾਰਜ ਨਹੀਂ ਜੁੜਿਆ ਹੋਇਆ ਹੈ।\"\n02000608=\"ਕੋਈ ਸਮੱਸਿਆਵਾਂ ਨਹੀਂ ਹਨ\"\n02000609=\"'{0}' ਫਾਇਲ ਨੂੰ ਆਕਾਈਵ ਤਰ੍ਹਾਂ ਨਹੀਂ ਖੋਲਿਆ ਜਾ ਸੱਕਿਆ\"\n0200060A=\"'{0}' ਐਨਕ੍ਰਿਪਟਡ ਆਕਾਈਵ ਨਹੀਂ ਖੋਲਿਆ ਜਾ ਸੱਕਿਆ। ਗਲ਼ਤ ਪਾਸਵਰਡ?\"\n\n; Dialogs\n02000702=\"ਠੀਕ ਹੈ\"\n02000705=\"ਹਾਂ (&Y)\"\n02000707=\"ਸਾਰਿਆਂ ਲਈ ਹਾਂ (&A)\"\n02000709=\"ਨਹੀਂ (&N)\"\n0200070B=\"ਸਾਰਿਆਂ ਲਈ ਨਹੀਂ (&l)\"\n\n02000710=\"ਰੱਦ ਕਰੋ\"\n02000711=\"ਰੱਦ ਕਰੋ (&C)\"\n02000713=\"ਬੰਦ ਕਰੋ (&C)\"\n02000714=\"ਰੁਕੋ\"\n02000715=\"ਮੁੜ ਚਾਲੂ ਕਰੋ\"\n\n02000720=\"ਮੱਦਦ\"\n\n; Extract dialog\n02000800=\"ਕੱਡੋ\"\n02000801=\"ਇੱਥੇ ਕੱਡੋ (&x):\"\n02000802=\"ਪਾਸਵਰਡ\"\n\n02000810=\"ਮਾਰਗ ਢੰਗ\"\n02000811=\"ਪੂਰੇ ਮਾਰਗ ਨਾਂ\"\n02000812=\"ਇਸ ਵੇਲੇ ਦੇ ਮਾਰਗ ਨਾਂ\"\n02000813=\"ਕੋਈ ਮਾਰਗ ਨਾਂ ਨਹੀਂ\"\n\n02000820=\"ਉਪਰੀਲੇਖਨ ਢੰਗ\"\n02000821=\"ਉਪਰੀਲੇਖਨ ਤੋਂ ਪਹਿਲਾਂ ਤਸਦੀਕ\"\n02000822=\"ਬਿਨ੍ਹਾਂ ਤਸਦੀਕ ਉਪਰੀਲੇਖਨ\"\n02000823=\"ਮੌਜੂਦਾ ਫਾਇਲਾਂ ਨਾਂ ਕੱਡੋ\"\n02000824=\"ਆਪੇ ਨਾਂ ਬਦਲ ਦਿਓ\"\n02000825=\"ਮੌਜੂਦਾ ਫਾਇਲਾਂ ਦਾ ਆਪੇ ਨਾਂ ਬਦਲ ਦਿਓ\"\n\n02000830=\"ਫਾਇਲਾਂ\"\n02000831=\"ਚੁਣੀਆਂ ਫਾਇਲਾਂ (&S)\"\n02000832=\"ਸਾਰੀਆਂ ਫਾਇਲਾਂ (&A)\"\n\n02000881=\"ਕੱਡੀਆਂ ਜਾਉਣ ਵਾਲੀਆਂ ਫਾਇਲਾਂ ਲਈ ਟਿਕਾਣਾ ਦੱਸੋ।\"\n\n02000890=\"ਕੱਡੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ\"\n\n; Overwrite dialog\n02000900=\"ਫਾਇਲ ਬਦਲਨ ਦੀ ਤਸਦੀਕ\"\n02000901=\"ਕਾਰਵਾਈ ਕੀਤੀ ਜਾਉਂਦੀ ਫਾਇਲ ਨਿਯਤ ਫੋਲਡਰ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।\"\n02000902=\"ਕੀ ਤੁਸੀਂ ਮੌਜੂਦਾ ਫਾਇਲ ਨੂੰ\"\n02000903=\"ਇਸ ਫਾਇਲ ਨਾਲ ਬਦਲਨਾ ਚਾਹੋਗੇ?\"\n\n02000911=\"ਆਪੇ ਨਾਂ ਬਦਲੀ ਕਰੋ (&u)\"\n\n02000982=\"{0} ਬਾਈਟ\"\n02000983=\"ਸੋਧ ਸਮਾਂ\"\n\n; Messages dialog\n02000A00=\"ਡਾਈਗਨੋਸਟਿੱਕ ਸੰਦੇਸ਼\"\n\n02000A80=\"ਸੰਦੇਸ਼\"\n\n02000A91=\"'{0}' ਲਈ ਨਪੀੜਨ ਢੰਗ ਸਹਿਯੋਗੀ ਨਹੀਂ।\"\n02000A92=\"'{0}' ਵਿੱਚ ਡਾਟਾ ਸਮੱਸਿਆ। ਫਾਇਲ ਟੁੱਟੀ ਹੋਈ ਹੈ।\"\n02000A93=\"'{0}' ਵਿੱਚ ਸੀ-ਆਰ-ਸੀ ਅਸਫ਼ਲ ਰਿਹਾ। ਫਾਇਲ ਟੁੱਟੀ ਹੋਈ ਹੈ।\"\n02000A94=\"'{0}' ਐਨਕ੍ਰਿਪਟਡ ਫਾਇਲ ਵਿੱਚ ਡਾਟਾ ਸਮੱਸਿਆ। ਗਲ਼ਤ ਪਾਸਵਰਡ?\"\n02000A95=\"'{0}' ਐਨਕ੍ਰਿਪਟਡ ਫਾਇਲ ਵਿੱਚ ਸੀ-ਆਰ-ਸੀ ਅਸਫ਼ਲ ਰਿਹਾ। ਗਲ਼ਤ ਪਾਸਵਰਡ?\"\n\n; Password dialog\n02000B00=\"ਪਾਸਵਰਡ ਭਰੋ\"\n02000B01=\"ਪਾਸਵਰਡ ਭਰੋ:\"\n02000B02=\"ਪਾਸਵਰਡ ਵਿਖਾਓ (&S)\"\n02000B03=\"ਪਾਸਵਰਡ ਮੁੜ ਭਰੋ:\"\n02000B10=\"ਪਾਸਵਰਡ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ\"\n02000B11=\"ਪਾਸਵਰਡ ਲਈ ਸਿਰਫ਼ ਅੰਗ੍ਰੇਜ਼ੀ ਅੱਖਰ, ਅੰਕ, ਅਤੇ ਖ਼ਾਸ ਅੱਖਰਾਂ (!, #, $, ...) ਦੀ ਹੀ ਵਰਤੋਂ ਕਰੋ\"\n02000B12=\"ਪਾਸਵਰਡ ਬਹੁੱਤ ਲੰਬਾ ਹੈ\"\n\n; Progress dialog\n02000C00=\"ਕਾਰਜ\"\n02000C01=\"ਬੀਤਿਆ ਸਮਾਂ:\"\n02000C02=\"ਰਹਿੰਦਾ ਸਮਾਂ:\"\n02000C03=\"ਕੁੱਲ ਸਾਈਜ਼:\"\n02000C04=\"ਗਤੀ:\"\n02000C05=\"ਨਿਬੇੜੀਆਂ ਬਾਈਟ:\"\n02000C06=\"ਨਪੀੜਨ ਅਨੁਪਾਤ:\"\n\n02000C10=\"ਬੈਕਗਰਾਉਂਡ (&B)\"\n02000C11=\"ਫੋਰਗਰਾਉਂਡ (&F)\"\n02000C12=\"ਪੋਜ਼ (&P)\"\n02000C13=\"ਜਾਰੀ ਕਰੋ (&C)\"\n\n02000C20=\"ਪੋਜ਼ ਹੋਇਆ\"\n\n02000C30=\"ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿੱਤ ਹੀ ਰੱਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?\"\n\n; Compress dialog\n02000D00=\"ਆਕਾਈਵ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ\"\n02000D01=\"ਆਕਾਈਵ (&A):\"\n02000D02=\"ਅੱਪਡੇਟ ਢੰਗ (&U):\"\n02000D03=\"ਆਕਾਈਵ ਫੌਰਮੈਟ (&f):\"\n02000D04=\"ਨਪੀੜਨ ਢੰਗ (&m):\"\n02000D05=\"ਠੋਸ ਆਕਾਈਵ ਬਣਾਓ (&S)\"\n02000D06=\"ਪੈਰਾਮੀਟਰ (&P):\"\n02000D07=\"ਚੋਣਾਂ\"\n02000D08=\"SF&X ਆਕਾਈਵ ਬਣਾਓ\"\n02000D09=\"ਮਲਟੀ-ਥਰੈਡਿੰਗ\"\n02000D0A=\"ਫਾਇਲਾਂ ਦੇ ਨਾਂ ਐਨਕ੍ਰਿਪਟ ਕਰੋ (&n)\"\n02000D0B=\"ਨਪੀੜਨ ਪੱਧਰ (&l):\"\n02000D0C=\"ਡਿਕਸ਼ਨਰੀ ਸਾਈਜ਼ (&D):\"\n02000D0D=\"ਵਰਡ ਸਾਈਜ਼(&W):\"\n02000D0E=\"ਨਪੀੜਨ ਲਈ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ:\"\n02000D0F=\"ਆਕਾਈਵ ਖੋਲਨ ਲਈ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ:\"\n02000D10=\"ਐਨਕ੍ਰਿਪਸ਼ਨ\"\n02000D11=\"ਐਨਕ੍ਰਿਪਸ਼ਨ ਢੰਗ:\"\n02000D12=\"ਸੀ-ਪੀ-ਯੂ ਥਰੈੱਡ ਗਿਣਤੀ:\"\n02000D13=\"ਠੋਸ ਬਲੋਕ ਸਾਈਜ਼:\"\n02000D14=\"ਨਾ-ਠੋਸ\"\n02000D15=\"ਠੋਸ\"\n02000D16=\"ਵਰਤੀਆਂ ਜਾਉਂਦੀਆਂ ਫਾਇਲਾਂ ਨੂੰ ਵੀ ਨਪੀੜੋ\"\n\n02000D40=\"ਵੋਲੁੱਮਾਂ ਵਿੱਚ ਵੰਡੋ, ਬਾਈਟ (&v):\"\n02000D41=\"ਵੋਲੁੱਮ ਸਾਈਜ਼ ਗਲ਼ਤ ਹੈ\"\n02000D42=\"ਦਿੱਤਾ ਗਿਆ ਵੋਲੁੱਮ ਸਾਈਜ਼: {0} ਬਾਈਟ।\\nਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿੱਤ ਆਕਾਈਵ ਨੂੰ ਦਿੱਤੇ ਗਏ ਵੋਲੁੱਮਾਂ ਵਿੱਚ ਵੰਡਣਾ ਚਾਹੁੰਦੇ ਹੋ?\"\n\n02000D81=\"ਸਿਰਫ਼ ਇਕੱਤਰਤਾ\"\n02000D82=\"ਆਮ\"\n02000D83=\"ਵੱਧੋਂ ਵੱਧ\"\n02000D84=\"ਤੇਜ਼\"\n02000D85=\"ਬਹੁੱਤ ਤੇਜ਼\"\n02000D86=\"ਸਭ ਤੋਂ ਵੱਧ\"\n\n02000D90=\"ਬਰਾਊਜ਼\"\n\n02000DA1=\"ਫਾਇਲਾਂ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਬਦਲੋ\"\n02000DA2=\"ਫਾਇਲਾਂ ਸ਼ਾਮਲ ਅਤੇ ਅੱਪਡੇਟ ਕਰੋ\"\n02000DA3=\"ਮੌਜੂਦਾ ਫਾਇਲਾਂ ਤਾਜ਼ਾ ਕਰੋ\"\n02000DA4=\"ਫਾਇਲਾਂ ਸਮਕਾਲਵਰਤੀ ਕਰੋ\"\n\n02000DB1=\"ਸਾਰੀਆਂ ਫਾਇਲਾਂ\"\n\n02000DC0=\"ਨਪੀੜਨ ਕਾਰਜ ਚੱਲ ਰਿਹਾ ਹੈ\"\n\n; Columns dialog\n02000E00=\"ਕਾਲਮ\"\n02000E01=\"ਉਹ ਕਾਲਮ ਚੁਣੋ ਜਿਹੜੇ ਤੁਸੀਂ ਇਸ ਫੋਲਡਰ ਵਿੱਚ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ। 'ਇੱਕ ਉੱਪਰ ਕਰੋ' ਅਤੇ 'ਇੱਕ ਨੀਚੇ ਕਰੋ' ਬਟਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕਾਲਮ ਮੁੜ ਵਿਵੱਸਥਾ ਕਰ ਸੱਕਦੇ ਹੋ।\"\n02000E02=\"ਚੁਣਿਆ ਗਿਆ ਕਾਲਮ\"\n02000E03=\"ਪਿਕਸਲ ਚੌੜਾ ਹੋਏਗਾ (&w)।\"\n\n02000E10=\"ਇੱਕ ਉੱਪਰ ਕਰੋ (&U)\"\n02000E11=\"ਇੱਕ ਨੀਚੇ ਕਰੋ (&D)\"\n02000E12=\"ਵਿਖਾਓ (&S)\"\n02000E13=\"ਛੁਪਾਓ (&H)\"\n02000E14=\"ਸੈਟ\"\n\n02000E81=\"ਸ਼ੀਰਸ਼ਕ\"\n02000E82=\"ਚੁੜਾਈ\"\n\n; Testing\n02000F90=\"ਪਰਖ ਚੱਲ ਰਹੀ ਹੈ\"\n\n\n; File Manager\n\n03000000=\"7-ਜ਼ਿੱਪ ਫਾਇਲ ਮਨੇਜਰ\"\n\n; Menu\n03000102=\"ਫਾਇਲ (&F)\"\n03000103=\"ਸੋਧ (&E)\"\n03000104=\"ਵੇਖੋ (&V)\"\n03000105=\"ਸੰਧ (&T)\"\n03000106=\"ਮੱਦਦ (&H)\"\n03000107=\"ਪਸੰਦੀਦਾ (&a)\"\n\n; File\n03000210=\"ਖੋਲੋ (&O)\"\n03000211=\"ਅੰਦਰ ਖੋਲੋ (&I)\"\n03000212=\"ਬਾਹਰ ਖੋਲੋ (&u)\"\n03000220=\"ਵਿਖਾਓ (&V)\"\n03000221=\"ਸੋਧ ਕਰੋ (&E)\"\n03000230=\"ਨਾਂ ਬਦਲੋ (&m)\"\n03000231=\"ਨਵੇਂ ਟਿਕਾਣੇ ਤੇ ਨਕਲ ਉਤਾਰੋ (&C)...\"\n03000232=\"ਨਵੇਂ ਟਿਕਾਣੇ ਤੇ ਭੇਜੋ (&M)...\"\n03000233=\"ਹਟਾਓ (&D)\"\n03000240=\"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ (&r)\"\n03000241=\"ਟਿੱਪਣੀ (&n)\"\n03000242=\"ਚੈਕਸੱਮ ਗਣਨਾ ਕਰੋ\"\n03000250=\"ਫੋਲਡਰ ਬਣਾਓ\"\n03000251=\"ਫਾਇਲ ਬਣਾਓ\"\n03000260=\"ਬਾਹਰ ਨਿਕਲੋ (&x)\"\n03000270=\"ਫਾਇਲ ਹਿੱਸਿਆਂ ਵਿੱਚ ਵੰਡੋ (&S)...\"\n03000271=\"ਫਾਇਲ ਦੇ ਹਿੱਸੇ ਜੋੜੋ (&b)...\"\n\n; Edit\n03000310=\"ਆਖਿਰੀ ਕਾਰਵਾਈ ਨਕਾਰੋ (&U)\"\n03000311=\"ਨਕਾਰੀ ਕਾਰਵਾਈ ਮੁੜ ਕਰੋ (&R)\"\n03000320=\"ਕੱਟੋ (&t)\"\n03000321=\"ਨਕਲ ਉਤਾਰੋ (&C)\"\n03000322=\"ਚੇਪੋ (&P)\"\n03000323=\"ਹਟਾਓ (&D)\"\n03000330=\"ਸਭ ਚੁਣੋ (&A)\"\n03000331=\"ਸਭ ਚੋਣ ਰੱਦ ਕਰੋ\"\n03000332=\"ਉਲਟ ਚੋਣ ਕਰੋ (&I)\"\n03000333=\"ਚੁਣੋ...\"\n03000334=\"ਚੋਣ ਰੱਦ ਕਰੋ...\"\n03000335=\"ਕਿਸਮ ਨਾਲ ਚੁਣੋ ਕਰੋ\"\n03000336=\"ਕਿਸਮ ਨਾਲ ਚੋਣ ਰੱਦ ਕਰੋ\"\n\n; View\n03000410=\"ਵੱਡੇ ਆਈਕਾਨ (&g)\"\n03000411=\"ਛੋਟੇ ਆਈਕਾਨ (&m)\"\n03000412=\"ਸੂਚੀ (&L)\"\n03000413=\"ਵੇਰਵੇ ਸਹਿਤ (&D)\"\n03000420=\"ਨਾ ਕ੍ਰਮ-ਬੱਧ\"\n03000430=\"ਰੂਟ ਫੋਲਡਰ ਖੋਲੋ\"\n03000431=\"ਇੱਕ ਪੱਧਰ ਉੱਤੇ\"\n03000432=\"ਫੋਲਡਰ ਅਤੀਤ...\"\n03000440=\"ਤਾਜ਼ਾ ਕਰੋ(&R)\"\n03000449=\"ਫਲੈਟ ਦ੍ਰਿਸ਼\"\n03000450=\"&2 ਪੈਨਲ\"\n03000451=\"ਟੂਲਬਾਰ (&T)\"\n03000460=\"ਆਕਾਈਵ ਟੂਲਬਾਰ\"\n03000461=\"ਸਧਾਰਨ ਟੂਲਬਾਰ\"\n03000462=\"ਵੱਡੇ ਬਟਨ\"\n03000463=\"ਬਟਨ ਟੈਕਸਟ ਵਿਖਾਓ\"\n\n; Tools\n03000510=\"ਚੋਣਾਂ (&O)...\"\n03000511=\"ਬੈਂਚਮਾਰਕ (&B)\"\n\n; Help\n03000610=\"ਵਿਸ਼ਾ ਸੂਚੀ (&C)...\"\n03000620=\"7-ਜ਼ਿੱਪ ਬਾਰੇ (&A)...\"\n\n; Favorites\n03000710=\"ਫੋਲਡਰ ਪਸੰਦੀਦਾ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ (&A)\"\n03000720=\"ਬੁੱਕਮਾਰਕ\"\n\n; Options Dialog\n\n03010000=\"ਚੋਣਾਂ\"\n\n; Plugins\n03010100=\"ਪਲੱਗ-ਇੰਨ\"\n03010101=\"ਪਲੱਗ-ਇੰਨ (&P):\"\n03010110=\"ਚੋਣਾਂ...\"\n\n; Edit\n03010200=\"ਐਡੀਟਰ\"\n03010201=\"ਟੈਕਸਟ ਐਡੀਟਰ (&E):\"\n\n; System\n03010300=\"ਸਿਸਟਮ\"\n03010302=\"7-ਜ਼ਿੱਪ ਨਾਲ ਹੇਠਾਂ ਦਿੱਤੇ ਫਾਇਲ ਐਕਸਟੈਂਸ਼ਨ ਜੋੜੋ:\"\n03010310=\"ਪਲੱਗ-ਇੰਨ\"\n\n; Settings\n03010400=\"ਸੈਟਿੰਗ\"\n03010401=\"\\\"..\\\" ਆਈਟਮ ਵਿਖਾਓ\"\n03010402=\"ਅਸਲੀ ਫਾਇਲ ਆਈਕਾਨ ਵਿਖਾਓ\"\n03010410=\"ਸਿਸਟਮ ਮੇਨੂੰ ਵਿਖਾਓ\"\n03010420=\"ਪੂਰੀ ਕਤਾਰ ਚੁਣੋ (&F)\"\n03010421=\"ਗ੍ਰਿਡ ਲਾਈਨਾਂ ਵਿਖਾਓ (&g)\"\n03010430=\"ਵਿਕਲਪਕ ਚੁਣਾਓ ਢੰਗ (&A)\"\n03010440=\"ਵੱਡੇ ਮੈਮੋਰੀ ਪੇਜ ਵਰਤੋ (&l)\"\n\n; Strings\n\n03020201=\"ਨਵੇਂ ਟਿਕਾਣੇ ਤੇ ਨਕਲ ਉਤਾਰੋ\"\n03020202=\"ਨਵੇਂ ਟਿਕਾਣੇ ਤੇ ਭੇਜੋ\"\n03020203=\"ਹੇਠਾਂ ਦਿੱਤੇ ਟਿਕਾਣੇ ਤੇ ਨਕਲ ਉਤਾਰੋ:\"\n03020204=\"ਹੇਠਾਂ ਦਿੱਤੇ ਟਿਕਾਣੇ ਤੇ ਭੇਜੋ:\"\n03020205=\"ਨਕਲ ਉਤਾਰੀ ਜਾ ਰਹੀ ਹੈ...\"\n03020206=\"ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ...\"\n03020207=\"ਇਹੋ ਜਿਹੇ ਫੋਲਡਰਾਂ ਲਈ ਤੁਸੀਂ ਆਈਟਮਾਂ ਨੂੰ ਨਵੇਂ ਟਿਕਾਣੇ ਤੇ ਨਾਂ ਹੀ ਭੇਜ ਸੱਕਦੇ ਹੋ ਨਾਂ ਨਕਲ ਉਤਾਰ ਸੱਕਦੇ ਹੋ।\"\n03020208=\"ਕਾਰਵਾਈ ਸਹਿਯੋਗੀ ਨਹੀਂ ਹੈ।\"\n03020209=\"ਨਿਯਤ ਫੋਲਡਰ ਚੁਣੋ\"\n\n03020210=\"ਫਾਇਲ ਹਟਾਉਣ ਦੀ ਤਸਦੀਕ\"\n03020211=\"ਫੋਲਡਰ ਹਟਾਉਣ ਦੀ ਤਸਦੀਕ\"\n03020212=\"ਬਹੁ-ਫਾਈਲਾਂ ਹਟਾਉਣ ਦੀ ਤਸਦੀਕ\"\n03020213=\"'{0}' ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?\"\n03020214=\"ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿੱਤ ਫੋਲਡਰ '{0}' ਅਤੇ ਉਸਦੇ ਵਿੱਚਲੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?\"\n03020215=\"ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿੱਤ ਇਨ੍ਹਾਂ {0} ਆਈਟਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?\"\n03020216=\"ਹਟਾਉਣ ਦੀ ਕਾਰਵਾਈ ਚੱਲ ਰਹੀ ਹੈ...\"\n03020217=\"ਫਾਇਲ ਜਾਂ ਫੋਲਡਰ ਹਟਾਉਣ ਵਿੱਚ ਸਮੱਸਿਆ\"\n\n03020220=\"ਨਾਂ ਬਦਲਿਆ ਜਾ ਰਿਹਾ ਹੈ...\"\n03020221=\"ਫਾਇਲ ਜਾਂ ਫੋਲਡਰ ਦਾ ਨਾਂ ਬਦਲਣ ਵਿੱਚ ਸਮੱਸਿਆ\"\n03020222=\"ਫਾਇਲ ਦੀ ਨਕਲ ਉਤਾਰਣ ਦੀ ਤਸਦੀਕ\"\n03020223=\"ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿੱਤ ਫਾਇਲਾਂ ਦੀ ਆਕਾਈਵ ਵਿੱਚ ਨਕਲ ਉਤਾਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\"\n\n03020230=\"ਫੋਲਡਰ ਬਣਾਓ\"\n03020231=\"ਫੋਲਡਰ ਨਾਂ:\"\n03020232=\"ਨਵਾਂ ਫੋਲਡਰ\"\n03020233=\"ਫੋਲਡਰ ਬਨਾਉਣ ਵਿੱਚ ਸਮੱਸਿਆ\"\n\n03020240=\"ਫਾਇਲ ਬਣਾਓ\"\n03020241=\"ਫਾਇਲ ਨਾਂ:\"\n03020242=\"ਨਵੀਂ ਫਾਇਲ\"\n03020243=\"ਫਾਇਲ ਬਨਾਉਣ ਵਿੱਚ ਸਮੱਸਿਆ\"\n\n03020250=\"ਚੁਣੋ\"\n03020251=\"ਚੋਣ ਰੱਦ ਕਰੋ\"\n03020252=\"ਮਾਸਕ:\"\n\n03020260=\"ਫੋਲਡਰ ਅਤੀਤ\"\n\n03020280=\"'{0}' ਫਾਇਲ ਸੋਧ ਦਿੱਤੀ ਗਈ ਹੈ।\\nਕੀ ਤੁਸੀਂ ਉਸਨੂੰ ਆਕਾਈਵ ਵਿੱਚ ਅੱਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?\"\n03020281=\"ਫਾਇਲ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸੱਕੀ\\n'{0}'\"\n03020282=\"ਐਡੀਟਰ ਚਾਲੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸੱਕਿਆ।\"\n03020283=\"ਖੋਲੀ ਜਾ ਰਹੀ ਹੈ...\"\n\n03020290=\"ਟਿੱਪਣੀ\"\n03020291=\"ਟਿੱਪਣੀ (&C):\"\n\n030202A0=\"ਸਿਸਟਮ\"\n\n03020300=\"ਕੰਪਿਊਟਰ\"\n03020301=\"ਨੈੱਟਵਰਕ\"\n\n03020400=\"ਸ਼ਾਮਲ ਕਰੋ\"\n03020401=\"ਕੱਡੋ\"\n03020402=\"ਪਰਖ ਕਰੋ\"\n\n03020420=\"ਨਕਲ ਉਤਾਰੋ\"\n03020421=\"ਨਵੇਂ ਟਿਕਾਣੇ ਤੇ ਭੇਜੋ\"\n03020422=\"ਹਟਾਓ\"\n03020423=\"ਜਾਣਕਾਰੀ\"\n\n03020500=\"ਫਾਇਲ ਹਿੱਸਿਆਂ ਵਿੱਚ ਵੰਡੋ\"\n03020501=\"ਹੇਠਾਂ ਦਿੱਤੇ ਟਿਕਾਣੇ ਉੱਤੇ ਹਿੱਸੇ ਕਰੋ (&S):\"\n03020510=\"ਫਾਇਲ ਹਿੱਸਿਆਂ ਵਿੱਚ ਵੰਡੀ ਜਾ ਰਹੀ ਹੈ...\"\n03020520=\"ਹਿੱਸੇ ਕਰਨ ਦੀ ਤਸਦੀਕ\"\n03020521=\"ਕੀ ਤੁਸੀਂ ਨਿਸ਼ਚਿੱਤ ਫਾਇਲ ਦੇ {0} ਵੋਲੁੱਮਾਂ ਵਿੱਚ ਹਿੱਸੇ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?\"\n03020522=\"ਵੋਲੁੱਮ ਸਾਈਜ਼ ਅਸਲੀ ਫਾਇਲ ਦੇ ਸਾਈਜ਼ ਤੋਂ ਛੋਟਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ\"\n\n03020600=\"ਫਾਇਲ ਦੇ ਹਿੱਸੇ ਜੋੜੋ\"\n03020601=\"ਹੇਠਾਂ ਦਿੱਤੇ ਟਿਕਾਣੇ ਉੱਤੇ ਹਿੱਸੇ ਜੋੜੋ(&C):\"\n03020610=\"ਹਿੱਸੇ ਜੋੜੇ ਜਾ ਰਹੇ ਹਨ...\"\n03020620=\"ਸਿਰਫ਼ ਪਹਿਲੀ ਫਾਇਲ ਚੁਣੋ\"\n\n03020710=\"ਚੈਕਸੱਮ ਗਣਨਾ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...\"\n03020720=\"ਚੈਕਸੱਮ ਜਾਣਕਾਰੀ\"\n03020721=\"ਡਾਟਾ ਲਈ ਸੀ-ਆਰ-ਸੀ ਚੈਕਸੱਮ:\"\n03020722=\"ਡਾਟਾ ਅਤੇ ਨਾਮਾਂ ਲਈ ਸੀ-ਆਰ-ਸੀ ਚੈਕਸੱਮ:\"\n\n03020800=\"ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...\"\n\n03020900=\"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ\"\n\n; Computer\n03031100=\"ਕੁੱਲ ਸਾਈਜ਼\"\n03031101=\"ਖ਼ਾਲੀ ਥਾਂ\"\n03031102=\"ਕਲੱਸਟਰ ਸਾਈਜ਼\"\n03031103=\"ਲੇਬਲ\"\n\n; Network\n03031200=\"ਸਥਾਨਕ ਨਾਂ\"\n03031201=\"ਉਪਲੱਬਧ ਕਰਤਾ\"\n\n; Benchmark Dialog\n\n03080000=\"ਬੈਂਚਮਾਰਕ\"\n03080001=\"ਮੈਮੋਰੀ ਵਰਤੋਂ:\"\n03080002=\"ਨਪੀੜਨ ਕਾਰਜ\"\n03080003=\"ਖੋਲਣ ਕਾਰਜ\"\n03080004=\"ਗਤੀ\"\n03080005=\"ਦਰਜ਼ਾ\"\n03080006=\"ਕੁੱਲ ਦਰਜ਼ਾ\"\n03080007=\"ਇਸ ਸਮੇਂ\"\n03080008=\"ਰੀਸੱਲਟਿੰਗ\"\n03080009=\"ਪਾਸ:\"\n0308000A=\"ਸਮੱਸਿਆਵਾਂ:\"\n0308000B=\"ਸੀ-ਪੀ-ਯੂ ਵਰਤੋਂ\"\n0308000C=\"ਦਰਜ਼ਾ / ਵਰਤੋਂ\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/pl.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by cienislaw, corrected by pixel\n; Last versions translated by F1xat / 2007-08-26\n; Polish mirror at www.7-zip.org/pl\n;\n;\n\n00000000=\"Polish\"\n00000001=\"Polski\"\n00000002=\"21\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Konfiguracja 7-Zip\"\n\n; Info Page\n01000100=\"O programie\"\n01000103=\"7-Zip jest programem darmowym. Jednak jeśli chciałbyś wspomóc dalszy jego rozwój, zarejestruj 7-Zip'a.\\n\\nPolska strona 7-Zip:\\nwww.7-zip.org/pl\\npl_7-zip@o2.pl\"\n01000104=\"Wsparcie\"\n01000105=\"Zarejestruj\"\n\n; Folders Page\n01000200=\"Foldery\"\n01000210=\"&Folder roboczy\"\n01000211=\"&Systemowy folder tymczasowy\"\n01000212=\"&Aktualny\"\n01000213=\"&Wybrany\"\n01000214=\"Użyj tylko dla dysków wymiennych\"\n\n01000281=\"Folder dla plików tymczasowych\"\n\n; System Page\n01000300=\"System\"\n01000301=\"Zintegruj 7-Zip z powłoką systemową\"\n01000302=\"Kaskadowe menu kontekstowe\"\n01000310=\"Pozycje w menu kontekstowym:\"\n\n; Language Page\n01000400=\"Język\"\n01000401=\"Język:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"&7-Zip\"\n02000102=\"Komendy 7-Zip\"\n02000103=\"Otwórz archiwum\"\n02000104=\"Otwiera wybrane archiwum.\"\n02000105=\"Wypakuj pliki...\"\n02000106=\"Wypakowuje pliki z wybranego archiwum.\"\n02000107=\"Dodaj do archiwum...\"\n02000108=\"Dodaje wybrane pliki do archiwum.\"\n02000109=\"Testuj archiwum\"\n0200010A=\"Testuje poprawność wybranego archiwum.\"\n0200010B=\"Wypakuj tutaj\"\n0200010C=\"Wypakowuje pliki z wybranego archiwum do aktualnego folderu.\"\n0200010D=\"Wypakuj do {0}\"\n0200010E=\"Wypakowuje pliki do podfoldera.\"\n0200010F=\"Dodaj do {0}\"\n02000110=\"Dodaje zaznaczone pliki i foldery do archiwum.\"\n02000111=\"Kompresuj i wyślij...\"\n02000112=\"Kompresuje zaznaczone pliki/foldery i wysyła je mailem.\"\n02000113=\"Kompresuj do {0} i wyślij\"\n02000114=\"Kompresuje zaznaczone pliki/foldery do archiwum i wysyła je mailem.\"\n\n02000140=\"<Folder>\"\n02000141=\"<Archiwum>\"\n\n; Properties\n02000203=\"Ścieżka\"\n02000204=\"Nazwa\"\n02000205=\"Rozszerzenie\"\n02000206=\"Folder\"\n02000207=\"Rozmiar\"\n02000208=\"Spakowany\"\n02000209=\"Atrybuty\";\n0200020A=\"Utworzony\"\n0200020B=\"Ostatnio używany\"\n0200020C=\"Zmodyfikowany\"\n0200020D=\"Ciągłe\"\n0200020E=\"Komentarz\"\n0200020F=\"Szyfrowany\"\n02000210=\"Rozdziel przed\"\n02000211=\"Rozdziel po\"\n02000212=\"Rozmiar słownika\"\n02000213=\"CRC\"\n02000214=\"Typ\"\n02000215=\"Anti\"\n02000216=\"Metoda\"\n02000217=\"System operacyjny\"\n02000218=\"System plików\"\n02000219=\"Użytkownik\"\n0200021A=\"Grupa\"\n0200021B=\"Blok\"\n0200021C=\"Komentarz\"\n0200021D=\"Pozycja\"\n0200021E=\"Ścieżka\"\n0200021F=\"Foldery\"\n02000220=\"Pliki\"\n02000221=\"Wersja\"\n02000222=\"Wolumin\"\n02000223=\"Wiele woluminów\"\n02000224=\"Offset\"\n02000225=\"Linki\"\n02000226=\"Bloki\"\n02000227=\"Woluminy\"\n\n; Status bar\n02000301=\"{0} pozycji zaznaczonych\"\n02000302=\"{0} pozycji\"\n\n02000320=\"Plików:\"\n02000321=\"Folderów:\"\n02000322=\"Rozmiar:\"\n02000323=\"Rozmiar skompresowany:\"\n02000324=\"Archiwa:\"\n\n; List Context Menu\n02000401=\"&Kolumny...\"\n\n02000411=\"&Otwórz\"\n02000412=\"&Wypakuj...\"\n\n; ToolBar\n02000501=\"Wypakuj\"\n\n; Messages\n02000601=\"Aktualizacja nie jest dostępna dla tego archiwum\"\n02000602=\"Nie mogę zaktualizować archiwum {0}\"\n02000603=\"Nie mogę utworzyć folderu '{0}'\"\n02000604=\"Plik nie jest akceptowalnym archiwum.\"\n02000605=\"Błąd\"\n02000606=\"Za dużo pozycji\"\n02000607=\"Nie znaleziono aplikacji skojarzonej z rozszerzeniem nazwy danego pliku\"\n02000608=\"Nie stwierdzono błędów\"\n02000609=\"Nie mogę otworzyć pliku '{0}' jako archiwum\"\n0200060A=\"Nie mogę otworzyć zaszyfrowanego archiwum'{0}'. Nieprawidłowe hasło?\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Tak\"\n02000707=\"Tak dla &wszystkich\"\n02000709=\"&Nie\"\n0200070B=\"Nie dla w&szystkich\"\n\n02000710=\"Anuluj\"\n02000711=\"&Anuluj\"\n02000713=\"&Zamknij\"\n02000714=\"Przerwij\"\n02000715=\"Restart\"\n\n02000720=\"Pomoc\"\n\n; Extract dialog\n02000800=\"Wypakuj\"\n02000801=\"W&ypakuj do:\"\n02000802=\"Hasło\"\n\n02000810=\"Tryb ścieżek\"\n02000811=\"Pełne ścieżki\"\n02000812=\"Aktualne ścieżki\"\n02000813=\"Bez ścieżek\"\n\n02000820=\"Tryb nadpisywania\"\n02000821=\"Zapytaj przed nadpisaniem\"\n02000822=\"Nadpisz bez pytania\"\n02000823=\"Pomiń istniejące pliki\"\n02000824=\"Automatyczna zmiana nazwy\"\n02000825=\"Automatyczna zmiana nazwy istniejących plików\"\n\n02000830=\"Pliki\"\n02000831=\"&Wybrane pliki\"\n02000832=\"W&szystkie pliki\"\n\n02000881=\"Wskaż miejsce dla wypakowanych plików.\"\n\n02000890=\"Wypakowuję z\"\n\n; Overwrite dialog\n02000900=\"Potwierdź zamianę plików\"\n02000901=\"Folder docelowy zawiera już przetworzony plik\"\n02000902=\"Czy chcesz zamienić istniejący plik\"\n02000903=\"następującym plikiem?\"\n\n02000911=\"A&utomatyczna zmiana nazw\"\n\n02000982=\"{0} bajtów\"\n02000983=\"zmodyfikowany\"\n\n; Messages dialog\n02000A00=\"Wiadomości diagnostyczne\"\n\n02000A80=\"Wiadomość\"\n\n02000A91=\"Nieobsługiwana metoda kompresji dla '{0}'.\"\n02000A92=\"Błąd danych w '{0}'. Plik jest uszkodzony.\"\n02000A93=\"Błąd CRC w '{0}'. Plik jest uszkodzony.\"\n02000A94=\"Błąd danych w zaszyfrowanym pliku '{0}'. Nieprawidłowe hasło?\"\n02000A95=\"Błąd CRC w zaszyfrowanym pliku '{0}'. Nieprawidłowe hasło?\"\n\n; Password dialog\n02000B00=\"Wprowadź hasło\"\n02000B01=\"Wprowadź hasło:\"\n02000B02=\"Pokaż &hasło\"\n02000B03=\"Powtórz hasło:\"\n02000B10=\"Hasła różnią się!\"\n02000B11=\"Dla hasła używaj tylko liter angielskiego alfabetu, cyfr i znaków specjalnych (!, #, $, ...)\"\n02000B12=\"Hasło jest za długie\"\n\n; Progress dialog\n02000C00=\"Przetwarzam\"\n02000C01=\"Czas:\"\n02000C02=\"Czas pozostały:\"\n02000C03=\"Rozmiar:\"\n02000C04=\"Prędkość:\"\n02000C05=\"Przetworzono:\"\n02000C06=\"Stopień kompresji:\"\n\n02000C10=\"Praca w &tle\"\n02000C11=\"&Przywróć\"\n02000C12=\"&Pauza\"\n02000C13=\"&Kontynuuj\"\n\n02000C20=\"Spauzowano\"\n\n02000C30=\"Czy jesteś pewien, że chcesz anulować?\"\n\n; Compress dialog\n02000D00=\"Dodaj do archiwum\"\n02000D01=\"&Archiwum:\"\n02000D02=\"&Tryb aktualizacji:\"\n02000D03=\"&Format archiwum:\"\n02000D04=\"&Metoda kompresji:\"\n02000D05=\"Utwórz &ciągłe archiwum\"\n02000D06=\"&Parametry:\"\n02000D07=\"Opcje\"\n02000D08=\"Utwórz archiwum &SFX\"\n02000D09=\"&Wielowątkowość\"\n02000D0A=\"&Zaszyfruj nazwy plików\"\n02000D0B=\"Po&ziom &kompresji:\"\n02000D0C=\"&Rozmiar &słownika:\"\n02000D0D=\"R&ozmiar słowa:\"\n02000D0E=\"Użycie pamięci dla kompresji:\"\n02000D0F=\"Użycie pamięci dla dekompresji:\"\n02000D10=\"Szyfrowanie\"\n02000D11=\"Metoda szyfrowania:\"\n02000D12=\"Liczba wątków:\"\n02000D13=\"Wielkość bloku ciągłego archiwum:\"\n02000D14=\"Nie-ciągłe\"\n02000D15=\"Ciągłe\"\n02000D16=\"Kompresuj współdzielone pliki\"\n\n02000D40=\"Rozmiar &woluminów (bajty):\"\n02000D41=\"Nieprawidłowy rozmiar woluminu\"\n02000D42=\"Wybrany rozmiar archiwum: {0} bajtów.\\nCzy jesteś pewien, że chcesz podzielić archiwum na takie części?\"\n\n02000D81=\"Bez kompresji\"\n02000D82=\"Normalna\"\n02000D83=\"Najlepsza\"\n02000D84=\"Szybka\"\n02000D85=\"Najszybsza\"\n02000D86=\"Ultra\"\n\n02000D90=\"Przeglądaj\"\n\n02000DA1=\"Dodaj i zamień pliki\"\n02000DA2=\"Dodaj i aktualizuj pliki\"\n02000DA3=\"Odśwież istniejące pliki\"\n02000DA4=\"Synchronizuj zawartość archiwum\"\n\n02000DB1=\"Wszystkie pliki\"\n\n02000DC0=\"Tworzę archiwum\"\n\n; Columns dialog\n02000E00=\"Kolumny\"\n02000E01=\"Zaznacz kolumny, które mają być widoczne w tym widoku. Użyj przycisków 'Przesuń w górę' i 'Przesuń w dół' do zmiany kolejności kolumn.\"\n02000E02=\"Wybrana kolumna powinna mieć\"\n02000E03=\"pikseli szerokości\"\n\n02000E10=\"Przesuń w &górę\"\n02000E11=\"Przesuń w &dół\"\n02000E12=\"&Wyświetl\"\n02000E13=\"&Ukryj\"\n02000E14=\"Ustaw\"\n\n02000E81=\"Nagłówek\"\n02000E82=\"Szerokość\"\n\n; Testing\n02000F90=\"Testuję\"\n\n\n; File Manager\n\n03000000=\"Menadżer plików 7-Zip\"\n\n; Menu\n03000102=\"&Plik\"\n03000103=\"&Edycja\"\n03000104=\"&Widok\"\n03000105=\"&Narzędzia\"\n03000106=\"Pomo&c\"\n03000107=\"&Ulubione\"\n\n; File\n03000210=\"&Otwórz\"\n03000211=\"Otwórz &wewnątrz\"\n03000212=\"Otwórz na &zewnątrz\"\n03000220=\"W&idok\"\n03000221=\"&Edycja\"\n03000230=\"Zm&ień nazwę\"\n03000231=\"&Kopiuj do...\"\n03000232=\"&Przenieś do...\"\n03000233=\"&Usuń\"\n03000240=\"Właściwości\"\n03000241=\"Ko&mentarz\"\n03000242=\"Sprawdź sumę kontrolną\"\n03000250=\"Nowy &folder\"\n03000251=\"&Nowy plik\"\n03000260=\"Konie&c\"\n03000270=\"Podzie&l plik...\"\n03000271=\"Sc&al pliki...\"\n\n; Edit\n03000310=\"&Cofnij\"\n03000311=\"&Dalej\"\n03000320=\"Wy&tnij\"\n03000321=\"&Kopiuj\"\n03000322=\"Wkl&ej\"\n03000323=\"&Usuń\"\n03000330=\"&Zaznacz wszystko\"\n03000331=\"&Odznacz wszystko\"\n03000332=\"Od&wróć zaznaczenie\"\n03000333=\"Zaznacz...\"\n03000334=\"Odznacz...\"\n03000335=\"Zaznacz według typu\"\n03000336=\"Odznacz według typu\"\n\n; View\n03000410=\"Duż&e ikony\"\n03000411=\"M&ałe ikony\"\n03000412=\"&Lista\"\n03000413=\"&Szczegóły\"\n03000420=\"Niesortowane\"\n03000430=\"Otwórz główny katalog\"\n03000431=\"Do góry o jeden folder\"\n03000432=\"Historia folderów...\"\n03000440=\"&Odśwież\"\n03000449=\"Pokaż pliki w podkatalogach\"\n03000450=\"&Dwa okna\"\n03000451=\"&Paski narzędziowe\"\n03000460=\"Pasek archiwum\"\n03000461=\"Standardowy pasek\"\n03000462=\"Duże przyciski\"\n03000463=\"Pokazuj opisy przycisków\"\n\n; Tools\n03000510=\"&Opcje...\"\n03000511=\"&Test szybkości\"\n\n; Help\n03000610=\"&Tematy pomocy...\"\n03000620=\"&O programie 7-Zip...\"\n\n; Favorites\n03000710=\"&Dodaj folder do Ulubionych jako\"\n03000720=\"Zakładka\"\n\n; Options Dialog\n\n03010000=\"Opcje\"\n\n; Plugins\n03010100=\"Wtyczki\"\n03010101=\"&Wtyczki:\"\n03010110=\"Opcje...\"\n\n; Edit\n03010200=\"Edytor\"\n03010201=\"&Edytor:\"\n\n; System\n03010300=\"System\"\n03010302=\"Skojarz 7-Zip z:\"\n03010310=\"Wtyczka\"\n\n; Settings\n03010400=\"Ustawienia\"\n03010401=\"Pokaż \\\"..\\\" do katalogu nadrzędnego\"\n03010402=\"Pokaż prawdziwe ikony plików\"\n03010410=\"Pokaż menu systemowe\"\n03010420=\"Zaznacz całą &kolumnę\"\n03010421=\"Pokazuj &linie podziału\"\n03010430=\"&Alternatywny tryb wyboru\"\n03010440=\"Użyj &dużych stron pamięci\"\n\n; Strings\n\n03020201=\"Kopiuj\"\n03020202=\"Przenieś\"\n03020203=\"Kopiuj do:\"\n03020204=\"Przenieś do:\"\n03020205=\"Kopiowanie...\"\n03020206=\"Przenoszenie...\"\n03020207=\"Nie możesz kopiować lub przenosić do takich folderów.\"\n03020208=\"Operacja nie jest obsługiwana.\"\n03020209=\"Wybierz folder docelowy.\"\n\n03020210=\"Potwierdzenie usunięcia pliku\"\n03020211=\"Potwierdzenie usunięcia katalogu\"\n03020212=\"Potwierdzenie usunięcia wielu plików\"\n03020213=\"Czy na pewno chcesz usunąć '{0}'?\"\n03020214=\"Czy na pewno chcesz usunąć folder '{0}' i wszystko co zawiera?\"\n03020215=\"Czy na pewno chcesz usunąć {0} ?\"\n03020216=\"Usuwanie...\"\n03020217=\"Błąd podczas usuwania pliku lub folderu\"\n\n03020220=\"Zmiana nazwy...\"\n03020221=\"Błąd podczas zmiany nazwy pliku lub folderu\"\n03020222=\"Potwierdź kopiowanie plików\"\n03020223=\"Czy na pewno chcesz skopiować pliki do archiwum?\"\n\n03020230=\"Nowy folder\"\n03020231=\"Nazwa foldera:\"\n03020232=\"Nowy folder\"\n03020233=\"Błąd podczas tworzenia nowego folderu\"\n\n03020240=\"Nowy plik\"\n03020241=\"Nazwa pliku:\"\n03020242=\"Nowy plik\"\n03020243=\"Błąd podczas tworzenia nowego pliku\"\n\n03020250=\"Zaznacz\"\n03020251=\"Odznacz\"\n03020252=\"Maska:\"\n\n03020260=\"Historia folderów\"\n\n03020280=\"Plik '{0}' został zmodyfikowany.\\nCzy chcesz zaktualizować archiwum?\"\n03020281=\"Nie można zaktualizować pliku\\n'{0}'\"\n03020282=\"Nie można uruchomić edytora.\"\n03020283=\"Otwieranie...\"\n\n03020290=\"Komentarz\"\n03020291=\"&Komentarz:\"\n\n030202A0=\"Menu &systemowe\"\n\n03020300=\"Komputer\"\n03020301=\"Sieć\"\n\n03020400=\"Dodaj\"\n03020401=\"Wypakuj\"\n03020402=\"Testuj\"\n\n03020420=\"Kopiuj\"\n03020421=\"Przenieś\"\n03020422=\"Usuń\"\n03020423=\"Właściwości\"\n\n03020500=\"Podziel plik\"\n03020501=\"Podziel do:\"\n03020510=\"Dzielę...\"\n03020520=\"Potwierdź podział\"\n03020521=\"Czy na pewno chcesz podzielić archiwum na {0} części?\"\n03020522=\"Rozmiar woluminu musi być mniejszy niż rozmiar oryginalnego pliku\"\n\n03020600=\"Scalaj pliki\"\n03020601=\"Scal do:\"\n03020610=\"Scalam...\"\n03020620=\"Wybierz tylko pierwszy plik\"\n\n03020710=\"Sprawdzam sumę kontrolną...\"\n03020720=\"Informacje o sumie kontrolnej\"\n03020721=\"Suma kontrolna CRC dla danych:\"\n03020722=\"Suma kontrolna CRC dla danych i nazw:\"\n\n03020800=\"Skanowanie...\"\n\n03020900=\"Właściwości\"\n\n; Computer\n03031100=\"Całkowity Rozmiar\"\n03031101=\"Wolna Przestrzeń\"\n03031102=\"Rozmiar Klastra\"\n03031103=\"Etykieta\"\n\n; Network\n03031200=\"Nazwa Lokalna\"\n03031201=\"Provider\"\n\n; Benchmark Dialog\n\n03080000=\"Test szybkości\"\n03080001=\"Użyta pamięć:\"\n03080002=\"Kompresja\"\n03080003=\"Dekompresja\"\n03080004=\"Prędkość\"\n03080005=\"Ocena\"\n03080006=\"Ocena ogólna\"\n03080007=\"Aktualnie\"\n03080008=\"Rezultat\"\n03080009=\"Przebiegi:\"\n0308000A=\"Błędy:\"\n0308000B=\"Obciążenie procesora\"\n0308000C=\"Ocena/Obciążenie\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ps.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.53\n; Translated by the Pathanisation Project\n; pathanisation.pakhtosoft.com\n; 20071226\n;\n\n00000000=\"Pashto\"\n00000001=\"پښتو\"\n00000002=\"99\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"۷‏-زېپ سازونه\"\n\n; Info Page\n01000100=\"۷‏-زېپ په اړه\"\n01000103=\".دا يو وړيا ساوتری دی. خو، په نومکښلو سره د ساوتري د پرمختګ ملاتړ کولی شئ\"\n01000104=\"ملاتړ\"\n01000105=\"نومکښل\"\n\n; Folders Page\n01000200=\"پوښۍ\"\n01000210=\"&کارنه پوښۍ\"\n01000211=\"&لنډمهاله غونډال پوښۍ\"\n01000212=\"&اوسنۍ\"\n01000213=\"&څانګړې\"\n01000214=\"يوازې له لېرېدونکو چليځونو لپاره کارول\"\n\n01000281=\".د لنډمهاله ارشيو دوتنو لپاره ځای وټاکئ\"\n\n; System Page\n01000300=\"غونډال\"\n01000301=\"۷‏-زېپ سيپۍ تړاو غورنۍ کښې زياتول\"\n01000302=\"ځړبهيزه تړاو غورنۍ\"\n01000310=\":تړاو غورنۍ توکي\"\n\n; Language Page\n01000400=\"ژبه\"\n01000401=\":ژبه\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"۷‏-زېپ\"\n02000102=\"۷‏-زېپ بولۍ\"\n02000103=\"ارشيو پرانيستل\"\n02000104=\".ټاکل شوی ارشيو پرانيزي\"\n02000105=\"...دوتنې ويستل\"\n02000106=\".د ټاکل شوي ارشيو نه دوتنې وباسي\"\n02000107=\"...ارشيو ته زياتول\"\n02000108=\".ټاکل شوي توکي ارشيو ته زياتوي\"\n02000109=\"ارشيو ازمويل\"\n0200010A=\".د ټاکل شوي ارشيو بشپړتيا ازمويي\"\n0200010B=\"دلته ويستل\"\n0200010C=\".د ټاکل شوي ارشيو نه اوسنۍ پوښۍ ته دوتنې وباسي\"\n0200010D=\"ته ويستل {0}‏\"\n0200010E=\".څېرمه پوښۍ ته دوتنې وباسي\"\n0200010F=\"ته زياتول {0}\"\n02000110=\".ټاکل شوي توکي ارشيو ته زياتوي\"\n02000111=\"...زېرل او برېښل\"\n02000112=\".ټاکل شوي توکي ارشيو ته زېري او د برېښلېک له لارې يې ليږي\"\n02000113=\"ته زياتول او برېښل {0}\"\n02000114=\".ټاکل شوي توکي ارشيو ته زېري او د برېښلېک له لارې يې ليږي\"\n\n02000140=\"<پوښۍ>\"\n02000141=\"<ارشيو>\"\n\n; Properties\n02000203=\"يونلور\"\n02000204=\"نوم\"\n02000205=\"شاتاړی\"\n02000206=\"پوښۍ\"\n02000207=\"کچ\"\n02000208=\"بنډل شوی کچ\"\n02000209=\"څانتياوې\"\n0200020A=\"جوړشوی\"\n0200020B=\"رسی\"\n0200020C=\"بدلون\"\n0200020D=\"کلک\"\n0200020E=\"څرګندون\"\n0200020F=\"کوډييز\"\n02000210=\"چول مخکښې\"\n02000211=\"چول وروسته\"\n02000212=\"ويېپانګه\"\n02000213=\"CRC\"\n02000214=\"ډول\"\n02000215=\"مخالف\"\n02000216=\"لېله\"\n02000217=\"کوربه چغ\"\n02000218=\"دوتنه غونډال\"\n02000219=\"کارن\"\n0200021A=\"ډله\"\n0200021B=\"غونډ\"\n0200021C=\"څرګندون\"\n0200021D=\"ځای\"\n0200021E=\"يونلور مختاړی\"\n0200021F=\"پوښۍ\"\n02000220=\"دوتنې\"\n02000221=\"نسخه\"\n02000222=\"ډکون\"\n02000223=\"ګڼډکون\"\n02000224=\"افسېټ\"\n02000225=\"پېوندونه\"\n02000226=\"غوڼدونه\"\n02000227=\"ډکونونه\"\n\n; Status bar\n02000301=\"ټاکل شوي څيزونه {0}\"\n02000302=\"څيز(ونه) '{0}'\"\n\n02000320=\"دوتنې:\"\n02000321=\"پوښۍ:\"\n02000322=\":کچ\"\n02000323=\":زېرلی کچ\"\n02000324=\":ارشيونه\"\n\n; List Context Menu\n02000401=\"...ستنې&\"\n\n02000411=\"پرانيستل&\"\n02000412=\"...ويستل&\"\n\n; ToolBar\n02000501=\"ويستل\"\n\n; Messages\n02000601=\".اوسمهاله چلښتونه دې ارشيو لپاره منلي نه دي\"\n02000602=\"ارشيو اوسمهالولی نه شي '{0}'\"\n02000603=\"پوښۍ جوړولی نه شي '{0}'\"\n02000604=\".دوتنه منلی ارشيو نه دی\"\n02000605=\"تېروتنه\"\n02000606=\"ډېر زيات توکي\"\n02000607=\"د ورکړل شوي دوتنې نوم شاتاړي سره هېڅ کاريال مل نه دی\"\n02000608=\"هېڅ تېروتنه نشته\"\n02000609=\"'{0}' دوتنه لکه د ارشيو نه شي پرانيستلی\"\n0200060A=\"کوډييز ارشيو پرانيستلی نه شي '{0}'. ناسمه تېرنويې؟\"\n\n; Dialogs\n02000702=\"هوکې\"\n02000705=\"هو&\"\n02000707=\"ټولو ته هو&\"\n02000709=\"نه&\"\n0200070B=\"ټ&ولو ته نه\"\n\n02000710=\"بندول\"\n02000711=\"بندول&\"\n02000713=\"بندول&\"\n02000714=\"تمول\"\n02000715=\"بياپېلول\"\n\n02000720=\"مرسته\"\n\n; Extract dialog\n02000800=\"ويستل\"\n02000801=\":ته و&يستل\"\n02000802=\"تېرنويې\"\n\n02000810=\"يونلور اکر\"\n02000811=\"بشپړ يونلورنومونه\"\n02000812=\"اوسني يونلورنومونه\"\n02000813=\"هېڅ يونلورنومونه\"\n\n02000820=\"سرليکلو اکر\"\n02000821=\"سرليکلو نه مخکښې پوښتل\"\n02000822=\"بې له پارليکې سرليکل\"\n02000823=\"شته دوتنې پرېښودل\"\n02000824=\"خپله بيانومول\"\n02000825=\"شته دوتنې خپله بيانومول\"\n\n02000830=\"دوتنې\"\n02000831=\"ټاکلې دوتنې&\"\n02000832=\"ټولې دوتنې&\"\n\n02000881=\".د ويستلو دوتنو لپاره يو ځای وټاکئ\"\n\n02000890=\"وباسي\"\n\n; Overwrite dialog\n02000900=\"دوتنه ځاېناستی باورييل\"\n02000901=\".موخه پوښۍ دمخه بهيرلې دوتنې لري\"\n02000902=\"غواړئ چې شته دوتنه ځاېناستې کړئ\"\n02000903=\"له دې سره؟\"\n\n02000911=\"خپله ب&يانومول\"\n\n02000982=\"باېټه {0}\"\n02000983=\"بدل شوی په\"\n\n; Messages dialog\n02000A00=\"رنځ نومېرنې استوزه\"\n\n02000A80=\"استوزه\"\n\n02000A91=\".لپاره نامنلې زېرنې لېله '{0}'\"\n02000A92=\".کښې اومتوک ستونزه '{0}' دوتنه ماته ده\"\n02000A93=\".کښې سرس پاتې راغی '{0}' دوتنه ماته ده\"\n02000A94=\"کوډييزې دوتنې '{0}' کښې اومتوک ستونزه. ناسمه تېرنويې؟\"\n02000A95=\"په کوډييزې دوتنې '{0}' کښې سرس پاتې راغی. ناسمه تېرنويې؟\"\n\n; Password dialog\n02000B00=\"تېرنويې وليکئ\"\n02000B01=\":تېرنويې وليکئ\"\n02000B02=\"تېرنويې ښودل&\"\n02000B03=\":تېرنويې بيا وليکئ\"\n02000B10=\"تېرنويې سمون نه خوري\"\n02000B11=\"تېرنويې لپاره يوازې انګريزي توري، شمېرې او ځانګړي لوښې (!, #, $, ...) وکاروئ\"\n02000B12=\"تېرنويې ډېره اوږده ده\"\n\n; Progress dialog\n02000C00=\"بهير\"\n02000C01=\":تېر مهال\"\n02000C02=\":پاتې مهال\"\n02000C03=\":بشپړ کچ\"\n02000C04=\":چټکتیا\"\n02000C05=\":بهيرلی\"\n02000C06=\":زېرلو نسبت\"\n\n02000C10=\"شاليد&\"\n02000C11=\"پاسليد&\"\n02000C12=\"ځنډول&\"\n02000C13=\"پرمختلل&\"\n\n02000C20=\"څنډېدلی\"\n\n02000C30=\"په ډاډمنه توګه غواړئ چې بند يې کړئ؟\"\n\n; Compress dialog\n02000D00=\"ارشيو ته زياتول\"\n02000D01=\":ارشيو&\"\n02000D02=\":اوسمهاليز اکر&\"\n02000D03=\":ارشيو بڼه&\"\n02000D04=\":زېرنې &لېله\"\n02000D05=\"کلک ارشيو جوړول&\"\n02000D06=\":ارزښتمني&\"\n02000D07=\"غوراوي\"\n02000D08=\"ارشيو جوړول SF&X\"\n02000D09=\"ګڼ-مزيول\"\n02000D0A=\"دوتنه &نومونه کوډييزول\"\n02000D0B=\":زېرنې &کچه\"\n02000D0C=\":ويېپانګې کچه&\"\n02000D0D=\":ويې کچ&\"\n02000D0E=\":زېرلو لپاره ياد کارونه\"\n02000D0F=\":نازېرلو لپاره ياد کارونه\"\n02000D10=\"کوډییزونه\"\n02000D11=\":کوډییزونې لېله\"\n02000D12=\":د مبي مزيو شمېر\"\n02000D13=\":کلک غونډ کچ\"\n02000D14=\"نا-کلک\"\n02000D15=\"کلک\"\n02000D16=\"ونډولې دوتنې زېرل\"\n\n02000D40=\":ډکونونو، باېټونو ته چول&\"\n02000D41=\"ناسم ډکون کچ\"\n02000D42=\".باېټه {0} :ټاکلی ډکون کچ\\nپه ډاډمنه توګه غواړئ چې ارشيو په داسې ډکونونو وويشئ؟\"\n\n02000D81=\"زېرمل\"\n02000D82=\"ليوی\"\n02000D83=\"زيات\"\n02000D84=\"چټک\"\n02000D85=\"ډېر چټک\"\n02000D86=\"ډېر زيات چټک\"\n\n02000D90=\"لټول\"\n\n02000DA1=\"دوتنې زياتول او ځاېناستول\"\n02000DA2=\"دوتنې اوسمهالول او زياتول\"\n02000DA3=\"شته دوتنې تاندول\"\n02000DA4=\"دوتنې هممهالول\"\n\n02000DB1=\"ټولې دوتنې\"\n\n02000DC0=\"زېرل کيږي\"\n\n; Columns dialog\n02000E00=\"ستنې\"\n02000E01=\".هغه ستنې چې په دې پوښۍ کښې يې ښکاره کول غواړئ، ټک وهئ. د ستنو بيا اوډونولو لپاره د لاندې خوځول او پورته خوځول تڼيو څخه کار واخلئ\"\n02000E02=\"ټاکل شوې ستن بايد\"\n02000E03=\".پکسله &پلنه وي\"\n\n02000E10=\"پورته& خوځول\"\n02000E11=\"لاندې خوځول&\"\n02000E12=\"ښودل&\"\n02000E13=\"پټول&\"\n02000E14=\"ټاکل\"\n\n02000E81=\"سرليک\"\n02000E82=\"پلنوالی\"\n\n; Testing\n02000F90=\"ازموينه\"\n\n\n; File Manager\n\n03000000=\"۷‏-زېپ دوتنه سمبالګر\"\n\n; Menu\n03000102=\"دوتنه&\"\n03000103=\"سمون&\"\n03000104=\"ليد&\"\n03000105=\"توکي&\"\n03000106=\"مرسته&\"\n03000107=\"خ&واپوري\"\n\n; File\n03000210=\"پرانيستل&\"\n03000211=\"دننه& پرانيستل\"\n03000212=\"بهر پ&رانيستل\"\n03000220=\"ليد&\"\n03000221=\"سمون&\"\n03000230=\"بي&انومول\"\n03000231=\"...ته لمېسل&\"\n03000232=\"...ته خوځول&\"\n03000233=\"ړنګول&\"\n03000240=\"ځانتياوې\"\n03000241=\"څرګند&ون\"\n03000242=\"چېکسم شمېرل\"\n03000250=\"پوښۍ جوړول\"\n03000251=\"دوتنه جوړول\"\n03000260=\"و&تون\"\n03000270=\"...دوتنه چول&\"\n03000271=\"...دوتنې يوځ&ايول\"\n\n; Edit\n03000310=\"ناکړ&\"\n03000311=\"بياکړ&\"\n03000320=\"سکڼ&ل\"\n03000321=\"لمېسل&\"\n03000322=\"سرېښل&\"\n03000323=\"ړنګول&\"\n03000330=\"ټول ټاکل&\"\n03000331=\"ټول ناټاکل\"\n03000332=\"ټاکنه نسکورول&\"\n03000333=\"...ټاکل\"\n03000334=\"...ناټاکل\"\n03000335=\"پر ډول ټاکل\"\n03000336=\"پر ډول ناټاکل\"\n\n; View\n03000410=\"لو&ی انځورنونه\"\n03000411=\"و&اړه انځورنونه\"\n03000412=\"لړ&\"\n03000413=\"خبرتياوې&\"\n03000420=\"ناڼلي\"\n03000430=\"ولۍ پوښۍ پرانيستل\"\n03000431=\"يو کچه برول\"\n03000432=\"...پوښيو مخينه\"\n03000440=\"تاندول&\"\n03000449=\"پوړ ليد\"\n03000450=\"۲‏ چوکاټه&\"\n03000451=\"توکپټې&\"\n03000460=\"ارشيو توکپټه\"\n03000461=\"کره توکپټه\"\n03000462=\"لویې تڼۍ\"\n03000463=\"د تڼيو ليکنې ښودل\"\n\n; Tools\n03000510=\"...غوراوي&\"\n03000511=\"بنچمارک&\"\n\n; Help\n03000610=\"...منځپانګه&\"\n03000620=\"...۷‏-زېپ په اړه&\"\n\n; Favorites\n03000710=\"پوښۍ خواپورو ته زياتول لکه&\"\n03000720=\"نښه\"\n\n; Options Dialog\n\n03010000=\"غوراوي\"\n\n; Plugins\n03010100=\"لګونونه\"\n03010101=\":لګونونه&\"\n03010110=\"...غوراوي\"\n\n; Edit\n03010200=\"سمونګر\"\n03010201=\":سمونګر&\"\n\n; System\n03010300=\"غونډال\"\n03010302=\":له ۷‏-زېپ سره ملول\"\n03010310=\"لګون\"\n\n; Settings\n03010400=\"امستنې\"\n03010401=\"توکي ښودل \\\"..\\\"\"\n03010402=\"د دوتنو ريښتيني انځورنونه ښودل\"\n03010410=\"غونډال غورنۍ ښودل\"\n03010420=\"ټول کيل ټاکل&\"\n03010421=\"کرښې ښودل\"\n03010430=\"انډوليز ټاکنې اکر&\"\n03010440=\"لوی ياد مخونه کارول&\"\n\n; Strings\n\n03020201=\"لمېسل\"\n03020202=\"خوځول\"\n03020203=\":ته لمېسل\"\n03020204=\":ته خوځول\"\n03020205=\"...لميسل کيږي\"\n03020206=\"...خوځيږي\"\n03020207=\".له داسې پوښۍ لپاره توکي نه شئ خوځولی يا لمېسلی\"\n03020208=\".چلښت منلی نه دی\"\n03020209=\".موخه پوښۍ وټاکئ\"\n\n03020210=\"دوتنې ړنګونه باورييل\"\n03020211=\"پوښۍ ړنګونه باورييل\"\n03020212=\"ګڼو دوتنو ړنګونه باورييل\"\n03020213=\"په ډاډمنه توګه '{0}' ړنګول غواړئ؟\"\n03020214=\"په ډاډمنه توګه '{0}' پوښۍ او د دې ټوله منځپانګه ړنګول غواړئ؟\"\n03020215=\"په ډاډمنه توګه دا {0} توکي ړنګول غواړئ؟\"\n03020216=\"...ړنګيږي\"\n03020217=\"دوتنې يا پوښۍ ړنګولو ستونزه\"\n\n03020220=\"بيانوميږي\"\n03020221=\"دوتنې يا پوښۍ بيانومولو ستونزه\"\n03020222=\"دوتنې لمېسل باورييل\"\n03020223=\"په ډاډمنه توګه دوتنې ارشيو ته لمېسل غواړئ؟\"\n\n03020230=\"پوښۍ جوړول\"\n03020231=\":پوښۍ نوم\"\n03020232=\"نوې پوښۍ\"\n03020233=\"پوښۍ جوړولو ستونزه\"\n\n03020240=\"دوتنه جوړول\"\n03020241=\":دوتنه نوم\"\n03020242=\"نوې دوتنه\"\n03020243=\"دوتنې جوړولو ستونزه\"\n\n03020250=\"ټاکل\"\n03020251=\"ناټاکل\"\n03020252=\":وربوزۍ\"\n\n03020260=\"پوښيو مخينه\"\n\n03020280=\".'{0}' دوتنه کښې بدلون راغلی\\nپه ارشيو کښې يې اوسمهالول غواړئ؟\"\n03020281=\"'{0}'\\nدوتنه اوسمهالولی نه شي\"\n03020282=\"سمونګر پېلولی نه شي\"\n03020283=\"...پرانيستل کيږي\"\n\n03020290=\"څرګندون\"\n03020291=\":څرګندون&\"\n\n030202A0=\"غونډال\"\n\n03020300=\"سولګر\"\n03020301=\"جال\"\n\n03020400=\"زياتول\"\n03020401=\"ويستل\"\n03020402=\"ازمويل\"\n\n03020420=\"لمېسل\"\n03020421=\"خوځول\"\n03020422=\"ړنګول\"\n03020423=\"خبرتياوې\"\n\n03020500=\"دوتنه چول\"\n03020501=\":ته چول&\"\n03020510=\"...چول کيږي\"\n03020520=\"چونه باورييل\"\n03020521=\"په ډاډمنه توګه دوتنه په {0} ډکونونو وېشل غواړئ؟\"\n03020522=\"ډکون کچ بايد د دوتنې ار کچ نه وړوکی وي\"\n\n03020600=\"دوتنې يوځايول\"\n03020601=\":ته يوځايول&\"\n03020610=\"...يوځايږي\"\n03020620=\"يوازې لمړۍ دوتنه ټاکل\"\n\n03020710=\"...چېکسم شمېريږي\"\n03020720=\"چېکسم خبرتياوې\"\n03020721=\":چېکسم CRC اومتوک لپاره\"\n03020722=\":چېکسم CRC اومتوک او نومونو لپاره\"\n\n03020800=\"...ځیريږي\"\n\n03020900=\"ځانتياوې\"\n\n; Computer\n03031100=\"بشپړ کچ\"\n03031101=\"پاتې تشه\"\n03031102=\"ځومبک کچ\"\n03031103=\"نښکه\"\n\n; Network\n03031200=\"ځایي نوم\"\n03031201=\"برابروونى\"\n\n; Benchmark Dialog\n\n03080000=\"بنچمارک\"\n03080001=\":ياد کارونه\"\n03080002=\"زېريږي\"\n03080003=\"نازېريږي\"\n03080004=\"چټکتيا\"\n03080005=\"کچونه\"\n03080006=\"بشپړه کچونه\"\n03080007=\"اوسنی\"\n03080008=\"پايليز\"\n03080009=\":تيريږي\"\n0308000A=\":تېروتنه\"\n0308000B=\"مبي کارونه\"\n0308000C=\"کچونه / کارونه\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/pt-br.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by Fabricio Biazzotto - Atualizado por Felipe\n;\n;\n;\n;\n\n00000000=\"Portuguese Brazil\"\n00000001=\"Português (Brasil)\"\n00000002=\"22-1\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuração do 7-Zip\"\n\n; Info Page\n01000100=\"Sobre o 7-Zip\"\n01000103=\"7-Zip é um software livre. Contudo, você pode ajudar com o seu desenvolvimento registrando-o.\"\n01000104=\"Suporte\"\n01000105=\"Registrar\"\n\n; Folders Page\n01000200=\"Pastas\"\n01000210=\"&Pasta de trabalho\"\n01000211=\"&Pasta temporária do sistema\"\n01000212=\"&Atual\"\n01000213=\"&Especificada:\"\n01000214=\"Usar apenas para drives removíveis\"\n\n01000281=\"Especifique um local para os arquivos temporários.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integrar o 7-Zip ao menu de contexto\"\n01000302=\"Menu de contexto em cascata\"\n01000310=\"Itens do menu de contexto:\"\n\n; Language Page\n01000400=\"Idioma\"\n01000401=\"Idioma:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comandos do 7-Zip\"\n02000103=\"Abrir arquivo\"\n02000104=\"Abre o arquivo selecionado.\"\n02000105=\"Extrair arquivos...\"\n02000106=\"Extrai o conteúdo do arquivo selecionado.\"\n02000107=\"Adicionar ao arquivo...\"\n02000108=\"Adiciona os itens selecionados ao arquivo.\"\n02000109=\"Testar o arquivo\"\n0200010A=\"Testa a integridade do arquivo selecionado.\"\n0200010B=\"Extrair aqui\"\n0200010C=\"Extrai o conteúdo do arquivo selecionado na pasta atual.\"\n0200010D=\"Extrair para {0}\"\n0200010E=\"Extrai os arquivos para uma sub-pasta.\"\n0200010F=\"Adicionar para {0}\"\n02000110=\"Adiciona os itens selecionados ao arquivo.\"\n02000111=\"Comprimir e enviar por email...\"\n02000112=\"Comprime os itens selecionados e envia o arquivo por e-mail.\"\n02000113=\"Comprimir para {0} e enviar por email\"\n02000114=\"Comprime os itens selecionados e envia o arquivo por e-mail.\"\n\n02000140=\"<Pasta>\"\n02000141=\"<Arquivo>\"\n\n; Properties\n02000203=\"Caminho\"\n02000204=\"Nome\"\n02000205=\"Extensão\"\n02000206=\"Pasta\"\n02000207=\"Tamanho\"\n02000208=\"Tamanho Compactado\"\n02000209=\"Atributos\"\n0200020A=\"Criado\"\n0200020B=\"Acessado\"\n0200020C=\"Modificado\"\n0200020D=\"Sólido\"\n0200020E=\"Comentado\"\n0200020F=\"Criptografado\"\n02000210=\"Dividir Antes\"\n02000211=\"Dividir Depois\"\n02000212=\"Dicionário\"\n02000213=\"CRC\"\n02000214=\"Tipo\"\n02000215=\"Anti\"\n02000216=\"Método\"\n02000217=\"Sistema Operacional\"\n02000218=\"Sistema de Arquivos\"\n02000219=\"Usuário\"\n0200021A=\"Grupo\"\n0200021B=\"Bloco\"\n0200021C=\"Comentário\"\n0200021D=\"Posição\"\n0200021E=\"Prefixo do Caminho\"\n0200021F=\"Pastas\"\n02000220=\"Arquivos\"\n02000221=\"Versão\"\n02000222=\"Volume\"\n02000223=\"Multivolume\"\n02000224=\"Offset\"\n02000225=\"Links\"\n02000226=\"Blocos\"\n02000227=\"Volumes\"\n\n02000229=\"64 bits\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Tamanho Físico\"\n0200022D=\"Tamanho dos Cabeçalhos\"\n0200022E=\"Checksum\"\n0200022F=\"Características\"\n02000230=\"Endereço Virtual\"\n\n; Status bar\n02000301=\"{0} objeto(s) selecionado(s)\"\n02000302=\"{0} objeto(s)\"\n\n02000320=\"Arquivos:\"\n02000321=\"Pastas:\"\n02000322=\"Tamanho:\"\n02000323=\"Tamanho comprimido:\"\n02000324=\"Arquivos:\"\n\n; List Context Menu\n02000401=\"&Colunas...\"\n\n02000411=\"&Abrir\"\n02000412=\"&Extrair...\"\n\n; ToolBar\n02000501=\"Extrair\"\n\n; Messages\n02000601=\"Operações de atualização não são suportadas por este arquivo.\"\n02000602=\"Não pôde atualizar o arquivo {0}\"\n02000603=\"Não pôde criar a pasta '{0}'\"\n02000604=\"O arquivo não é suportado.\"\n02000605=\"Erro\"\n02000606=\"Itens demais\"\n02000607=\"Não há nenhuma aplicação associada com o nome da extensão dado a este arquivo\"\n02000608=\"Não há erros\"\n02000609=\"Não pôde abrir o arquivo '{0}' como arquivo\"\n0200060A=\"Não pôde abrir o arquivo encriptado '{0}'. Senha errada?\"\n0200060B=\"O sistema não pôde alocar a quantidade requerida de memória\"\n0200060C=\"Erro desconhecido\"\n0200060D=\"Tipo de arquivo não suportado\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Sim\"\n02000707=\"Sim para &Todos\"\n02000709=\"&Não\"\n0200070B=\"Não para To&dos\"\n\n02000710=\"Cancelar\"\n02000711=\"&Cancelar\"\n02000713=\"&Fechar\"\n02000714=\"Parar\"\n02000715=\"Reiniciar\"\n\n02000720=\"Ajuda\"\n\n; Extract dialog\n02000800=\"Extrair\"\n02000801=\"E&xtrair para:\"\n02000802=\"Senha\"\n\n02000810=\"Modo de caminho\"\n02000811=\"Nomes dos caminhos completos\"\n02000812=\"Nomes dos caminhos atuais\"\n02000813=\"Sem nomes de caminhos\"\n\n02000820=\"Modo de substituição\"\n02000821=\"Perguntar antes de sobrescrever\"\n02000822=\"Sobrescrever sem perguntar\"\n02000823=\"Pular os arquivos existentes\"\n02000824=\"Auto-renomear\"\n02000825=\"Auto-renomear os arquivos existentes\"\n\n02000830=\"Arquivos\"\n02000831=\"&Arquivos selecionados\"\n02000832=\"&Todos os arquivos\"\n\n02000881=\"Especifique um local para os arquivos extraídos.\"\n\n02000890=\"Extraindo\"\n\n; Overwrite dialog\n02000900=\"Confirmar a substituição dos arquivos\"\n02000901=\"A pasta destino já contém o arquivo processado.\"\n02000902=\"Você gostaria de substituir o arquivo existente\"\n02000903=\"por este?\"\n\n02000911=\"A&uto-Renomear\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificado em\"\n\n; Messages dialog\n02000A00=\"Mensagens de diagnóstico\"\n\n02000A80=\"Mensagem\"\n\n02000A91=\"Método de compressão não suportado por '{0}'.\"\n02000A92=\"Erro nos dados de '{0}'. O arquivo está danificado.\"\n02000A93=\"Falha no CRC de '{0}'. O arquivo está danificado.\"\n02000A94=\"Erros nos dados do arquivo encriptado '{0}'. Senha errada?\"\n02000A95=\"Falha de CRC no arquivo encriptado '{0}'. Senha errada?\"\n\n; Password dialog\n02000B00=\"Inserir senha\"\n02000B01=\"Inserir senha:\"\n02000B02=\"&Mostrar senha\"\n02000B03=\"Re-inserir a senha:\"\n02000B10=\"As senhas não combinam\"\n02000B11=\"Usar apenas letras em Inglês, números e caracteres especiais (!, #, $, ...) para a senha\"\n02000B12=\"A senha é muito longa\"\n\n; Progress dialog\n02000C00=\"Processo\"\n02000C01=\"Tempo decorrido:\"\n02000C02=\"Tempo restante:\"\n02000C03=\"Tamanho total:\"\n02000C04=\"Velocidade:\"\n02000C05=\"Processado:\"\n02000C06=\"Taxa de compressão:\"\n\n02000C10=\"&Em segundo plano\"\n02000C11=\"&Em primeiro plano\"\n02000C12=\"&Pausar\"\n02000C13=\"&Continuar\"\n\n02000C20=\"Pausado\"\n\n02000C30=\"Você tem certeza que você quer cancelar?\"\n\n; Compress dialog\n02000D00=\"Adicionar ao arquivo\"\n02000D01=\"&Arquivo:\"\n02000D02=\"&Modo de atualização:\"\n02000D03=\"Formato do &arquivo:\"\n02000D04=\"Método de &compressão:\"\n02000D05=\"Criar &arquivo sólido\"\n02000D06=\"&Parâmetros:\"\n02000D07=\"Opções\"\n02000D08=\"Criar ar&quivo SFX\"\n02000D09=\"Multi-processamento\"\n02000D0A=\"Criptografar os &nomes dos arquivos\"\n02000D0B=\"Nível da &compressão:\"\n02000D0C=\"&Tamanho do dicionário:\"\n02000D0D=\"&Tamanho da palavra:\"\n02000D0E=\"Uso de memória para compressão:\"\n02000D0F=\"Uso de memória para descompressão:\"\n02000D10=\"Encriptação\"\n02000D11=\"Método de encriptação:\"\n02000D12=\"Número de threads da CPU:\"\n02000D13=\"Tamanho do bloco sólido:\"\n02000D14=\"Não-sólido\"\n02000D15=\"Sólido\"\n02000D16=\"Comprimir arquivos compartilhados\"\n\n02000D40=\"Dividir em &volumes, bytes:\"\n02000D41=\"Tamanho do volume incorreto\"\n02000D42=\"Tamanho do volume especificado: {0} bytes.\\nVocê tem certeza que você quer dividir o arquivo em tais volumes?\"\n\n02000D81=\"Armazenar\"\n02000D82=\"Normal\"\n02000D83=\"Máximo\"\n02000D84=\"Rápida\"\n02000D85=\"Mais rápida\"\n02000D86=\"Ultra\"\n\n02000D90=\"Navegar\"\n\n02000DA1=\"Adicionar e substituir arquivos\"\n02000DA2=\"Atualizar e adicionar arquivos\"\n02000DA3=\"Atualizar arquivos existentes\"\n02000DA4=\"Sincronizar arquivos\"\n\n02000DB1=\"Todos os Arquivos\"\n\n02000DC0=\"Comprimindo\"\n\n; Columns dialog\n02000E00=\"Colunas\"\n02000E01=\"Marque as colunas que você gostaria de tornar visíveis nesta pasta. Use os botões Mover para cima e Mover para baixo para re-ordernar as colunas.\"\n02000E02=\"A coluna selecionada deve ter\"\n02000E03=\"pixels de &largura.\"\n\n02000E10=\"Mover para &cima\"\n02000E11=\"Mover para &baixo\"\n02000E12=\"&Mostrar\"\n02000E13=\"&Esconder\"\n02000E14=\"Definir\"\n\n02000E81=\"Título\"\n02000E82=\"Largura\"\n\n; Testing\n02000F90=\"Testando\"\n\n\n; File Manager\n\n03000000=\"Gerenciador de Arquivos do 7-Zip\"\n\n; Menu\n03000102=\"&Arquivo\"\n03000103=\"&Editar\"\n03000104=\"&Ver\"\n03000105=\"&Ferramentas\"\n03000106=\"&Ajuda\"\n03000107=\"F&avoritos\"\n\n; File\n03000210=\"&Abrir\"\n03000211=\"Abrir &por dentro\"\n03000212=\"Abrir ex&ternamente\"\n03000220=\"&Ver\"\n03000221=\"&Editar\"\n03000230=\"Re&nomear\"\n03000231=\"&Copiar para...\"\n03000232=\"&Mover para...\"\n03000233=\"&Apagar\"\n03000240=\"P&ropriedades\"\n03000241=\"Comen&tário\"\n03000242=\"Calcular checksum\"\n03000250=\"Criar Pasta\"\n03000251=\"Criar Arquivo\"\n03000260=\"Sai&r\"\n03000270=\"&Dividir arquivo...\"\n03000271=\"Com&binar arquivos...\"\n\n; Edit\n03000310=\"&Desfazer\"\n03000311=\"&Refazer\"\n03000320=\"Co&rtar\"\n03000321=\"&Copiar\"\n03000322=\"&Colar\"\n03000323=\"&Apagar\"\n03000330=\"Selecionar &tudo\"\n03000331=\"Desfazer seleção\"\n03000332=\"&Inverter seleção\"\n03000333=\"Selecionar...\"\n03000334=\"Desfazer seleção...\"\n03000335=\"Selecionar por tipo\"\n03000336=\"Desfazer seleção por tipo\"\n\n; View\n03000410=\"Íco&nes grandes\"\n03000411=\"Íco&nes pequenos\"\n03000412=\"&Lista\"\n03000413=\"&Detalhes\"\n03000420=\"Desordenado\"\n03000430=\"Abrir a Pasta Raiz\"\n03000431=\"Subir um nível\"\n03000432=\"Histórico das Pastas...\"\n03000440=\"&Atualizar\"\n03000449=\"Visão Plana\"\n03000450=\"&2 Painéis\"\n03000451=\"&Barra de Ferramentas\"\n03000460=\"Barra de Ferramentas do Arquivo\"\n03000461=\"Barra de Ferramentas Padrão\"\n03000462=\"Botões Grandes\"\n03000463=\"Mostrar o Texto dos Botões\"\n\n; Tools\n03000510=\"&Opções...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Conteúdo...\"\n03000620=\"&Sobre o 7-Zip...\"\n\n; Favorites\n03000710=\"&Adicionar a pasta aos favoritos como\"\n03000720=\"Bookmark\"\n\n; Options Dialog\n\n03010000=\"Opções\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Opções...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Associar o 7-Zip com:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Configurações\"\n03010401=\"Mostrar o item \\\"..\\\" \"\n03010402=\"Mostrar os ícones reais dos arquivos\"\n03010410=\"Mostrar o menu do sistema\"\n03010420=\"&Selecionar a linha inteira\"\n03010421=\"Mostrar as &linhas de grade\"\n03010430=\"&Modo de seleção alternativo\"\n03010440=\"Usar &grandes páginas de memória\"\n\n; Strings\n\n03020201=\"Copiar\"\n03020202=\"Mover\"\n03020203=\"Copiar para:\"\n03020204=\"Mover para:\"\n03020205=\"Copiando...\"\n03020206=\"Movendo...\"\n03020207=\"Você não pode mover ou copiar itens para tais pastas.\"\n03020208=\"A operação não é suportada.\"\n03020209=\"Selecionar a pasta destino.\"\n\n03020210=\"Confirmar a exclusão do arquivo\"\n03020211=\"Confirmar a exclusão da pasta\"\n03020212=\"Confirmar a exclusão de múltiplos arquivos\"\n03020213=\"Você tem certeza que você quer apagar '{0}'?\"\n03020214=\"Você tem certeza que você quer apagar a pasta '{0}' e todo o seu conteúdo?\"\n03020215=\"Você tem certeza que você quer apagar estes {0} itens?\"\n03020216=\"Apagando...\"\n03020217=\"Erro ao apagar o arquivo ou pasta\"\n03020218=\"O sistema não pode mover um arquivo com caminho longo para o Recycle Bin\"\n\n03020220=\"Renomeando...\"\n03020221=\"Erro ao renomear o arquivo ou pasta\"\n03020222=\"Confirmar a cópia do arquivo\"\n03020223=\"Você tem certeza que você quer copiar os arquivos para dentro do arquivo compactado?\"\n\n03020230=\"Criar Pasta\"\n03020231=\"Nome da pasta:\"\n03020232=\"Nova Pasta\"\n03020233=\"Erro na Criação da Pasta\"\n\n03020240=\"Criar Arquivo\"\n03020241=\"Nome do Arquivo:\"\n03020242=\"Novo Arquivo\"\n03020243=\"Erro na Criação do Arquivo\"\n\n03020250=\"Selecionar\"\n03020251=\"Desfazer seleção\"\n03020252=\"Máscara:\"\n\n03020260=\"Histórico das Pastas\"\n\n03020280=\"O arquivo '{0}' foi modificado.\\nVocê quer atualizá-lo no arquivo compactado?\"\n03020281=\"Não pôde atualizar o arquivo\\n'{0}'\"\n03020282=\"Não pôde iniciar o editor.\"\n03020283=\"Abrindo...\"\n03020284=\"O arquivo parece um vírus (o nome do arquivo contém espaços longos no nome).\"\n\n03020290=\"Comentário\"\n03020291=\"&Comentário:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Computador\"\n03020301=\"Rede\"\n03020302=\"Documentos\"\n\n03020400=\"Adicionar\"\n03020401=\"Extrair\"\n03020402=\"Testar\"\n\n03020420=\"Copiar\"\n03020421=\"Mover\"\n03020422=\"Apagar\"\n03020423=\"Info\"\n\n03020500=\"Dividir Arquivo\"\n03020501=\"&Dividir para:\"\n03020510=\"Dividindo...\"\n03020520=\"Confirmar a Divisão\"\n03020521=\"Você tem certeza de quer você dividir o arquivo em {0} volumes?\"\n03020522=\"O tamanho do volume deve ser menor do que o tamanho do arquivo original\"\n\n03020600=\"Combinar Arquivos\"\n03020601=\"&Combinar para:\"\n03020610=\"Combinando...\"\n03020620=\"Selecionar apenas o primeiro arquivo\"\n03020621=\"Não pôde detectar o arquivo como parte do arquivo dividido\"\n03020622=\"Não pôde achar mais do que uma parte do arquivo dividido\"\n\n03020710=\"Calculando checksum...\"\n03020720=\"Informação de checksum\"\n03020721=\"CRC checksum para dados:\"\n03020722=\"CRC checksum para dados e nomes:\"\n\n03020800=\"Escaneando...\"\n\n03020900=\"Propriedades\"\n\n03020A01=\"A operação não pode ser chamada de uma pasta que tem um caminho longo.\"\n03020A02=\"Você deve selecionar um arquivo\"\n03020A03=\"Você deve selecionar um ou mais arquivos\"\n03020A04=\"O arquivo {0} já existe\"\n\n; Computer\n03031100=\"Tamanho Total\"\n03031101=\"Espaço Livre\"\n03031102=\"Tamanho do Cluster\"\n03031103=\"Rótulo\"\n\n; Network\n03031200=\"Nome Local\"\n03031201=\"Provedor\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Uso de memória:\"\n03080002=\"Comprimindo\"\n03080003=\"Descomprimindo\"\n03080004=\"Velocidade\"\n03080005=\"Avaliação\"\n03080006=\"Total da Avaliação\"\n03080007=\"Atual\"\n03080008=\"Resultado\"\n03080009=\"Passos:\"\n0308000A=\"Erros:\"\n0308000B=\"Uso da CPU\"\n0308000C=\"Avaliação / Uso\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/pt.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.46\n; Translated by Rui Costa\n;\n;\n;\n;\n\n00000000=\"Portuguese Standard\"\n00000001=\"Português\"\n00000002=\"22\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuração do 7-Zip\"\n\n; Info Page\n01000100=\"Acerca do 7-Zip\"\n01000103=\"O 7-Zip é um software gratuito. Contudo, pode apoiar o desenvolvimento do 7-Zip registando-se.\"\n01000104=\"Apoio\"\n01000105=\"Registar\"\n\n; Folders Page\n01000200=\"Pastas\"\n01000210=\"&Pasta de trabalho\"\n01000211=\"Pasta temporária do &Sistema\"\n01000212=\"Pasta &actual\"\n01000213=\"&Especificar pasta:\"\n01000214=\"Usar só para discos removíveis\"\n\n01000281=\"Especifique a pasta para os ficheiros de arquivo temporários.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integrar 7-Zip no menu de contexto do Windows\"\n01000302=\"Menu de contexto em cascata\"\n01000310=\"Itens do menu de contexto:\"\n\n; Language Page\n01000400=\"Idioma\"\n01000401=\"Idioma:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comandos do 7-Zip\"\n02000103=\"Abrir arquivo\"\n02000104=\"Abre o arquivo seleccionado.\"\n02000105=\"Extrair ficheiros...\"\n02000106=\"Extrair ficheiros do arquivo seleccionado.\"\n02000107=\"Adicionar ao arquivo...\"\n02000108=\"Adicionar os itens seleccionados ao arquivo.\"\n02000109=\"Testar arquivo\"\n0200010A=\"Testa a integridade do arquivo seleccionado.\"\n0200010B=\"Extrair para aqui\"\n0200010C=\"Extrair ficheiros do arquivo seleccionado para a pasta actual.\"\n0200010D=\"Extrair para {0}\"\n0200010E=\"Extrair ficheiros para sub-pasta.\"\n0200010F=\"Adicionar a {0}\"\n02000110=\"Adiciona os itens seleccionados ao arquivo.\"\n02000111=\"Comprimir e enviar por e-mail...\"\n02000112=\"Comprimir os itens seleccionados para o arquivo e enviar o arquivo por e-mail.\"\n02000113=\"Comprimir para {0} e enviar por e-mail\"\n02000114=\"Comprimir os itens seleccionados para o arquivo e enviar o arquivo por e-mail.\"\n\n02000140=\"<Pasta>\"\n02000141=\"<Arquivo>\"\n\n; Properties\n02000203=\"Caminho\"\n02000204=\"Nome\"\n02000205=\"Extensão\"\n02000206=\"Pasta\"\n02000207=\"Tamanho\"\n02000208=\"T. comprimido\"\n02000209=\"Atributos\"\n0200020A=\"Criado\"\n0200020B=\"Acedido\"\n0200020C=\"Modificado\"\n0200020D=\"Sólido\"\n0200020E=\"Compacto\"\n0200020F=\"Encriptado\"\n02000210=\"Expandido antes\"\n02000211=\"Expandido depois\"\n02000212=\"Dicionário\"\n02000213=\"CRC\"\n02000214=\"Tipo\"\n02000215=\"Anti\"\n02000216=\"Método\"\n02000217=\"Host OS\"\n02000218=\"Sistema de ficheiros\"\n02000219=\"Utilizador\"\n0200021A=\"Grupo\"\n0200021B=\"Bloco\"\n0200021C=\"Comentário\"\n0200021D=\"Posição\"\n0200021E=\"Prefixo de caminho\"\n\n; Status bar\n02000301=\"{0} objecto(s) seleccionado(s)\"\n02000302=\"{0} objecto(s)\"\n\n02000320=\"Ficheiros:\"\n02000321=\"Pastas:\"\n02000322=\"Tamanho:\"\n\n; List Context Menu\n02000401=\"&Colunas...\"\n\n02000411=\"&Abrir\"\n02000412=\"&Extrair...\"\n\n; ToolBar\n02000501=\"Extrair\"\n\n; Messages\n02000601=\"Este tipo de arquivo não permite actualizações.\"\n02000602=\"Não é possível actualizar {0}\"\n02000603=\"Não é possível criar a pasta '{0}'\"\n02000604=\"O ficheiro não é um arquivo suportado.\"\n02000605=\"Erro\"\n02000606=\"Demasiados itens\"\n02000607=\"Não existe nenhuma aplicação associada com esta extensão de ficheiro\"\n02000608=\"Não existem erros\"\n02000609=\"Não é possível abrir o ficheiro '{0}' como arquivo\"\n0200060A=\"Não é possível abrir o arquivo encriptado '{0}'. Palavra-passe errada?\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Sim\"\n02000707=\"Sim a &tudo\"\n02000709=\"&Não\"\n0200070B=\"Não a t&udo\"\n\n02000710=\"Cancelar\"\n02000711=\"&Cancelar\"\n02000713=\"&Fechar\"\n02000714=\"Parar\"\n02000715=\"Reiniciar\"\n\n02000720=\"Ajuda\"\n\n; Extract dialog\n02000800=\"Extrair\"\n02000801=\"E&xtrair para:\"\n02000802=\"Palavra-passe\"\n\n02000810=\"Modo nome de pasta\"\n02000811=\"Nome de pastas completo\"\n02000812=\"Nome de pastas actual\"\n02000813=\"Sem nome de pastas\"\n\n02000820=\"Modo de sobrescrever\"\n02000821=\"Com confirmação\"\n02000822=\"Sem confirmação\"\n02000823=\"Manter os ficheiros existentes\"\n02000824=\"Renomear autom.\"\n02000825=\"Renomear autom. os ficheiros existentes\"\n\n02000830=\"Ficheiros\"\n02000831=\"Ficheiros &seleccionados\"\n02000832=\"&Todos os ficheiros\"\n\n02000881=\"Especificar o local de destino para os ficheiros extraídos.\"\n\n02000890=\"A extrair\"\n\n; Overwrite dialog\n02000900=\"Confirmar a substituição do ficheiro\"\n02000901=\"A pasta já possui um ficheiro com o mesmo nome.\"\n02000902=\"Deseja substituir o ficheiro com o mesmo nome\"\n02000903=\"por este?\"\n\n02000911=\"Renomear &automaticamente\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificado em\"\n\n; Messages dialog\n02000A00=\"Mensagens de diagnóstico\"\n\n02000A80=\"Mensagem\"\n\n02000A91=\"Método de compressão não válido para '{0}'.\"\n02000A92=\"Erro de dados em '{0}'. O arquivo está danificado.\"\n02000A93=\"CRC falhou em '{0}'. O arquivo está danificado.\"\n02000A94=\"Erro de dados no ficheiro encriptado '{0}'. Palavra-passe errada?\"\n02000A95=\"CRC falhou no ficheiro encriptado '{0}'. Palavra-passe errada?\"\n\n; Password dialog\n02000B00=\"Introduza a palavra-passe\"\n02000B01=\"Introduza a palavra-passe:\"\n02000B02=\"&Mostrar palavra-passe\"\n02000B03=\"Reintroduza a palavra-passe:\"\n02000B10=\"As palavras-passe não coincidem\"\n02000B11=\"Utilize apenas letras inglesas, números e caracteres especiais (!, #, $, ...) na palavra-passe\"\n02000B12=\"A palavra-passe é demasiado longa\"\n\n; Progress dialog\n02000C00=\"Progresso\"\n02000C01=\"Tempo decorrido:\"\n02000C02=\"Tempo restante:\"\n02000C03=\"Tamanho:\"\n02000C04=\"Velocidade:\"\n\n02000C10=\"&Segundo plano\"\n02000C11=\"&Primeiro plano\"\n02000C12=\"&Pausar\"\n02000C13=\"&Continuar\"\n\n02000C20=\"Pausado\"\n\n02000C30=\"Tem a certeza que quer cancelar?\"\n\n; Compress dialog\n02000D00=\"Adicionar ao arquivo\"\n02000D01=\"&Arquivo:\"\n02000D02=\"&Modo de actualização:\"\n02000D03=\"&Formato do arquivo:\"\n02000D04=\"Tipo de &compressão:\"\n02000D05=\"Criar arquivo sólido\"\n02000D06=\"&Parâmetros:\"\n02000D07=\"Opções\"\n02000D08=\"Criar arquivo SF&X\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Encriptar &nomes de ficheiro\"\n02000D0B=\"Níve&l de compressão:\"\n02000D0C=\"Tamanho do &dicionário:\"\n02000D0D=\"Tamanho da &palavra:\"\n02000D0E=\"Utilização de memória para compressão:\"\n02000D0F=\"Utilização de memória para descompressão:\"\n02000D10=\"Encriptação\"\n02000D11=\"Método de encriptação:\"\n02000D12=\"Número de threads da CPU:\"\n02000D13=\"Tamanho dos blocos sólidos:\"\n02000D14=\"Não sólido\"\n02000D15=\"Sólido\"\n02000D16=\"Comprimir ficheiros partilhados\"\n\n02000D40=\"Separar por &volumes, bytes:\"\n02000D41=\"Tamanho do volume incorrecto\"\n02000D42=\"Tamanho do volume especificado: {0} bytes.\\nTem a certeza que quer separar o arquivo em tais volumes?\"\n\n02000D81=\"Sem compressão\"\n02000D82=\"Normal\"\n02000D83=\"Máxima\"\n02000D84=\"Rápida\"\n02000D85=\"A mais rápida\"\n02000D86=\"Ultra\"\n\n02000D90=\"Ver\"\n\n02000DA1=\"Adicionar e substituir os ficheiros\"\n02000DA2=\"Actualizar e adicionar os ficheiros\"\n02000DA3=\"Só actualizar os ficheiros\"\n02000DA4=\"Sincronizar os ficheiros\"\n\n02000DB1=\"Todos os ficheiros\"\n\n02000DC0=\"A comprimir\"\n\n; Columns dialog\n02000E00=\"Colunas\"\n02000E01=\"Seleccione as colunas que pretende visíveis nesta pasta. Use os botões Subir e Baixar para reordenar as colunas.\"\n02000E02=\"A coluna seleccionada deve ter\"\n02000E03=\"&pixeis de largura.\"\n\n02000E10=\"&Subir\"\n02000E11=\"&Baixar\"\n02000E12=\"&Mostrar\"\n02000E13=\"&Esconder\"\n02000E14=\"Fixar\"\n\n02000E81=\"Título\"\n02000E82=\"Largura\"\n\n; Testing\n02000F90=\"A testar\"\n\n\n; File Manager\n\n03000000=\"Gestor de ficheiros do 7-Zip\"\n\n; Menu\n03000102=\"&Ficheiro\"\n03000103=\"&Editar\"\n03000104=\"&Ver\"\n03000105=\"&Ferramentas\"\n03000106=\"&Ajuda\"\n03000107=\"F&avoritos\"\n\n; File\n03000210=\"&Abrir\"\n03000211=\"Abrir &Dentro\"\n03000212=\"Abrir &Fora\"\n03000220=\"&Ver\"\n03000221=\"&Editar\"\n03000230=\"Re&nomear\"\n03000231=\"&Copiar para...\"\n03000232=\"&Mover para...\"\n03000233=\"Apaga&r\"\n03000240=\"P&ropriedades\"\n03000241=\"Come&ntário\"\n03000242=\"Calcular checksum\"\n03000250=\"Criar Pasta\"\n03000251=\"Criar Ficheiro\"\n03000260=\"Sa&ir\"\n03000270=\"&Separar ficheiro...\"\n03000271=\"Com&binar ficheiros...\"\n\n; Edit\n03000310=\"&Desfazer\"\n03000311=\"&Refazer\"\n03000320=\"Co&rtar\"\n03000321=\"&Copiar\"\n03000322=\"C&olar\"\n03000323=\"&Apagar\"\n03000330=\"Seleccionar &Tudo\"\n03000331=\"De-seleccionar Tudo\"\n03000332=\"&Inverter Selecção\"\n03000333=\"Seleccionar...\"\n03000334=\"De-seleccionar...\"\n03000335=\"Seleccionar por Tipo\"\n03000336=\"De-seleccionar por Tipo\"\n\n; View\n03000410=\"Ícones &Grandes\"\n03000411=\"Ícones &Pequenos\"\n03000412=\"&Lista\"\n03000413=\"&Detalhes\"\n03000420=\"Sem ordem\"\n03000430=\"Abrir pasta raíz\"\n03000431=\"Subir um nível\"\n03000432=\"Histórico de pastas...\"\n03000440=\"&Actualizar\"\n03000449=\"Visualização plana\"\n03000450=\"&2 painéis\"\n03000451=\"&Barras de ferramentas\"\n03000460=\"Barra de ferramentas do arquivo\"\n03000461=\"Barra de ferramentas padrão\"\n03000462=\"Botões grandes\"\n03000463=\"Mostrar legenda dos botões\"\n\n; Tools\n03000510=\"&Opções...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Conteúdo...\"\n03000620=\"&Acerca do 7-Zip...\"\n\n; Favorites\n03000710=\"&Adicionar pasta aos Favoritos como\"\n03000720=\"Favorito\"\n\n; Options Dialog\n\n03010000=\"Opções\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Opções...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Associar 7-Zip com:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Definições\"\n03010401=\"Mostrar item \\\"..\\\" \"\n03010402=\"Mostrar ícones reais dos ficheiros\"\n03010410=\"Mostrar menu de sistema\"\n03010420=\"Selecciona linha &completa\"\n03010421=\"Mostra linhas da &grelha\"\n03010430=\"Modo de selecção &alternativo\"\n03010440=\"Utilizar páginas de &memória grandes\"\n\n; Strings\n\n03020201=\"Copiar\"\n03020202=\"Mover\"\n03020203=\"Copiar para:\"\n03020204=\"Mover para:\"\n03020205=\"Copiando...\"\n03020206=\"Movendo...\"\n03020207=\"Não é possível copiar ou mover ficheiros para essas pastas.\"\n03020208=\"Operação não suportada.\"\n03020209=\"Seleccionar pasta de destino.\"\n\n03020210=\"Confirmar a eliminação de Ficheiro\"\n03020211=\"Confirmar a eliminação de Pasta\"\n03020212=\"Confirmar a eliminação de Múltiplos Ficheiros\"\n03020213=\"Tem a certeza que deseja eliminar '{0}'?\"\n03020214=\"Tem a certeza que deseja eliminar a pasta '{0}' e todo o seu conteúdo?\"\n03020215=\"Tem a certeza que deseja eliminar {0} itens?\"\n03020216=\"A eliminar...\"\n03020217=\"Erro ao Eliminar Ficheiro ou Pasta\"\n\n03020220=\"A Renomear...\"\n03020221=\"Erro ao Renomear Ficheiro ou Pasta\"\n03020222=\"Confirmar a cópia de ficheiros\"\n03020223=\"Tem a certeza que deseja copiar ficheiros para o arquivo\"\n\n03020230=\"Criar Pasta\"\n03020231=\"Nome da Pasta:\"\n03020232=\"Nova Pasta\"\n03020233=\"Erro ao criar Pasta\"\n\n03020240=\"Criar Ficheiro\"\n03020241=\"Nome do Ficheiro:\"\n03020242=\"Novo ficheiro\"\n03020243=\"Erro ao Criar Ficheiro\"\n\n03020250=\"Seleccionar\"\n03020251=\"Deseleccionar\"\n03020252=\"Máscara:\"\n\n03020260=\"Histórico de pastas\"\n\n03020280=\"O ficheiro '{0}' foi modificado.\\nDeseja actualizá-lo no arquivo?\"\n03020281=\"Não é possível actualizar o ficheiro\\n'{0}'\"\n03020282=\"Não é possível iniciar o editor.\"\n03020283=\"A abrir...\"\n\n03020290=\"Comentário\"\n03020291=\"&Comentário:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"Computador\"\n03020301=\"Rede\"\n\n03020400=\"Adicionar\"\n03020401=\"Extrair\"\n03020402=\"Testar\"\n\n03020420=\"Copiar\"\n03020421=\"Mover\"\n03020422=\"Apagar\"\n03020423=\"Info\"\n\n03020500=\"Separar Ficheiro\"\n03020501=\"&Separar para:\"\n03020510=\"A separar...\"\n03020520=\"Confirmar separação\"\n03020521=\"Tem a certeza que quer separar o ficheiro em {0} volumes?\"\n03020522=\"O tamanho do volume tem de ser inferior ao tamanho do ficheiro original\"\n\n03020600=\"Combinar Ficheiros\"\n03020601=\"&Combinar para:\"\n03020610=\"A combinar...\"\n03020620=\"Seleccionar apenas o primeiro ficheiro\"\n\n03020710=\"A calcular o Checksum...\"\n03020720=\"Informação do Checksum\"\n03020721=\"CRC checksum para dados:\"\n03020722=\"CRC checksum para dados e nome:\"\n\n03020800=\"A pesquisar...\"\n\n; Computer\n03031100=\"Tamanho Total\"\n03031101=\"Espaço Livre\"\n03031102=\"Tamanho do Cluster\"\n03031103=\"Etiqueta\"\n\n; Network\n03031200=\"Nome Local\"\n03031201=\"Provedor\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Utilização de memória:\"\n03080002=\"Comprimindo\"\n03080003=\"Descomprimindo\"\n03080004=\"Velocidade\"\n03080005=\"Pontuação\"\n03080006=\"Pontuação total\"\n03080007=\"Actual\"\n03080008=\"Resultante\"\n03080009=\"Passagens:\"\n0308000A=\"Erros:\"\n0308000B=\"Uso da CPU\"\n0308000C=\"Pontuação / Uso\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ro.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by Lucian Nan ( http://www.prizeeinternational.com)\n;\n;\n;\n;\n\n00000000=\"Romanian\"\n00000001=\"Română\"\n00000002=\"24\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuraţia 7-Zip\"\n\n; Info Page\n01000100=\"Despre 7-Zip\"\n01000103=\"7-Zip este un program gratuit. Oricum, poţi contribui la dezvoltarea 7-Zip înregistrându-te.\"\n01000104=\"Suport tehnic\"\n01000105=\"Înregistrează\"\n\n; Folders Page\n01000200=\"Directoare\"\n01000210=\"&Directorul de lucru\"\n01000211=\"Directorul &tempotar al sistemului\"\n01000212=\"&Actual\"\n01000213=\"&Specificat:\"\n01000214=\"Utilizează numai pentru discurile detaşabile\"\n\n01000281=\"Specifică o destinaţie pentru arhivele temporare.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"Integrează 7-Zip în contextul meniului shell\"\n01000302=\"Contextul meniului în cascadă\"\n01000310=\"Obiectele meniului:\"\n\n; Language Page\n01000400=\"Limba\"\n01000401=\"Limba:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comenzi 7-Zip\"\n02000103=\"Deschide arhiva\"\n02000104=\"Deschide arhivele selectate.\"\n02000105=\"Dezarhivează fişierele...\"\n02000106=\"Dezarhivează fişierele din arhiva selectată.\"\n02000107=\"Adaugă într-o arhivă...\"\n02000108=\"Adaugă obiectele selectate într-o arhivă.\"\n02000109=\"Testează arhiva\"\n0200010A=\"Testează integritatea arhivei selectate.\"\n0200010B=\"Dezarhivează aici\"\n0200010C=\"Dezarhivează fişierele din arhiva selectată în directorul actual.\"\n0200010D=\"Dezarhivează în {0}\"\n0200010E=\"Dezarhivează fişierele în subdirector.\"\n0200010F=\"Adaugă în {0}\"\n02000110=\"Adaugă obiectele selectate într-o arhivă.\"\n02000111=\"Arhivează şi trimite email...\"\n02000112=\"Arhivează obiectele selectate într-o arhivă şi trimite-o prin email.\"\n02000113=\"Arhivează în {0} şi trimite email\"\n02000114=\"Arhivează obiectele selectate într-o arhiva şi trimite-o prin email.\"\n\n02000140=\"<Director>\"\n02000141=\"<Arhivă>\"\n\n; Properties\n02000203=\"Calea\"\n02000204=\"Nume\"\n02000205=\"Extensie\"\n02000206=\"Director\"\n02000207=\"Mărime\"\n02000208=\"Mărimea pachetului\"\n02000209=\"Atribute\"\n0200020A=\"Creată\"\n0200020B=\"Accesată\"\n0200020C=\"Modificată\"\n0200020D=\"Solidă\"\n0200020E=\"Comentat\"\n0200020F=\"Criptat\"\n02000210=\"Împarte înainte\"\n02000211=\"Împarte după\"\n02000212=\"Dicţionar\"\n02000213=\"CRC\"\n02000214=\"Tip\"\n02000215=\"Anti\"\n02000216=\"Metoda\"\n02000217=\"SO gazdă\"\n02000218=\"Fişier de sistem\"\n02000219=\"Utilizator\"\n0200021A=\"Grup\"\n0200021B=\"Blochează\"\n0200021C=\"Comentariu\"\n0200021D=\"Poziţia\"\n0200021E=\"Prefixul destinaţiei\"\n0200021F=\"Directoare\"\n02000220=\"Fişiere\"\n02000221=\"Versiunea\"\n02000222=\"Volum\"\n02000223=\"Multivolume\"\n02000224=\"Ofset\"\n02000225=\"Legături\"\n02000226=\"Blocuri\"\n02000227=\"Volume\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Mărime fizică\"\n0200022D=\"Mărimea antetelor\"\n0200022E=\"Checksum\"\n0200022F=\"Caracteristici\"\n02000230=\"Adresa virtuală\"\n\n; Status bar\n02000301=\"{0} obiect(e) selectat(e)\"\n02000302=\"{0} obiect(e)\"\n\n02000320=\"Fişiere:\"\n02000321=\"Directoare:\"\n02000322=\"Mărime:\"\n02000323=\"Mărimea comprimată:\"\n02000324=\"Arhive:\"\n\n; List Context Menu\n02000401=\"&Coloane...\"\n\n02000411=\"&Deschide\"\n02000412=\"De&zarhivează...\"\n\n; ToolBar\n02000501=\"Dezarhivează\"\n\n; Messages\n02000601=\"Operaţiile de actualizare nu sunt suportate pentru această arhivă.\"\n02000602=\"Nu pot actualiza arhiva {0}\"\n02000603=\"Nu pot crea directorul '{0}'\"\n02000604=\"Fişierul nu este o arhivă suportată.\"\n02000605=\"Eroare\"\n02000606=\"Prea multe obiecte\"\n02000607=\"Nu este nici o aplicaţie asociată cu extensia fişierului dat\"\n02000608=\"Nu sunt erori\"\n02000609=\"Nu pot deschide fişierul '{0}' ca arhivă\"\n0200060A=\"Nu pot deschide arhiva criptată '{0}'. Parola greşită?\"\n0200060B=\"Sistemul nu poate aloca memoria necesară\"\n0200060C=\"Eroare necunoscută\"\n0200060D=\"Tip de arhivă nesuportat\"\n\n; Dialogs\n02000702=\"Bine\"\n02000705=\"&Da\"\n02000707=\"Da, pe &toate\"\n02000709=\"&Nu\"\n0200070B=\"N&ici unul\"\n\n02000710=\"Anulare\"\n02000711=\"&Anulare\"\n02000713=\"&Închide\"\n02000714=\"Opreşte\"\n02000715=\"Restartează\"\n\n02000720=\"Ajutor\"\n\n; Extract dialog\n02000800=\"Dezarhivează\"\n02000801=\"Dezarhivează în:\"\n02000802=\"Parola\"\n\n02000810=\"Modul destinaţie\"\n02000811=\"Numele întreg al destinaţiei\"\n02000812=\"Destinaţia actuală\"\n02000813=\"Fără locaţie\"\n\n02000820=\"Modul de înlocuire\"\n02000821=\"Întreabă înainte de a înlocui\"\n02000822=\"Înlocuieşte fară a întreba\"\n02000823=\"Sări peste fişierele existente\"\n02000824=\"Auto redenumire\"\n02000825=\"Auto redenumeşte fişierele existente\"\n\n02000830=\"Fişiere\"\n02000831=\"Fişierele &selectate\"\n02000832=\"&Toate fişierele\"\n\n02000881=\"Specifică o destinaţie pentru fişierele dezarhivate.\"\n\n02000890=\"Dezarhivez\"\n\n; Overwrite dialog\n02000900=\"Aprobă înlocuirea fişierului\"\n02000901=\"Fişierul există deja în directorul destinaţie.\"\n02000902=\"Doriţi să înlocuiţi fişierul existent\"\n02000903=\"cu acesta?\"\n\n02000911=\"A&uto redenumire\"\n\n02000982=\"{0} octeţi\"\n02000983=\"modifcat pe\"\n\n; Messages dialog\n02000A00=\"Mesaje de diagnosticare\"\n\n02000A80=\"Mesaj\"\n\n02000A91=\"Metodă de arhivare nesuportată pentru '{0}'.\"\n02000A92=\"Eroare de date la '{0}'. Fişierul este corupt.\"\n02000A93=\"Verificarea CRC a eşuat pentru '{0}'. Fişierul este corupt.\"\n02000A94=\"Erori de date la fişierul criptat '{0}'. Parolă greşită?\"\n02000A95=\"Verificarea CRC a eşuat pentru fişierul criptat '{0}'. Parolă greşită?\"\n\n; Password dialog\n02000B00=\"Introdu parola\"\n02000B01=\"Introdu parola:\"\n02000B02=\"&Arată parola\"\n02000B03=\"Reintrodu parola:\"\n02000B10=\"Parolele nu sunt identice\"\n02000B11=\"Utilizaţi numai litere, cifre şi caracterele speciale (!, #, $, ...) pentru parolă\"\n02000B12=\"Parola este prea lungă\"\n\n; Progress dialog\n02000C00=\"Procesare\"\n02000C01=\"Timp trecut:\"\n02000C02=\"Timp rămas:\"\n02000C03=\"Mărimea:\"\n02000C04=\"Viteza:\"\n02000C05=\"Procesat:\"\n02000C06=\"Rata de comprimare:\"\n\n02000C10=\"În &fundal\"\n02000C11=\"La &suprafaţă\"\n02000C12=\"&Pauză\"\n02000C13=\"&Continuă\"\n\n02000C20=\"În pauză\"\n\n02000C30=\"Eşti sigur că vrei să anulezi?\"\n\n; Compress dialog\n02000D00=\"Adaugă într-o arhivă\"\n02000D01=\"&Arhivează:\"\n02000D02=\"Modul de a&ctualizare:\"\n02000D03=\"&Formatul arhivei:\"\n02000D04=\"&Metoda de arhivare:\"\n02000D05=\"Crează arhivă &solidă\"\n02000D06=\"&Parametri:\"\n02000D07=\"Opţiuni\"\n02000D08=\"Crează arhivă SF&X\"\n02000D09=\"Mai multe fire de execuţie\"\n02000D0A=\"Criptează &numele fişierului\"\n02000D0B=\"&Nivel de arhivare:\"\n02000D0C=\"Mărimea &dicţionarului:\"\n02000D0D=\"Mărimea &cuvântului:\"\n02000D0E=\"Memorie utilizată pentru arhivare:\"\n02000D0F=\"Memorie utilizată pentru dezarhivare:\"\n02000D10=\"Criptare\"\n02000D11=\"Metoda de criptare:\"\n02000D12=\"Numărul de procesoare utilizate:\"\n02000D13=\"Mărimea blocului solid:\"\n02000D14=\"NEsolid\"\n02000D15=\"Solid\"\n02000D16=\"Arhivează fişierele partajate\"\n\n02000D40=\"Împarte în &volume, octeţi:\"\n02000D41=\"Dimensiunea volumului este incorectă\"\n02000D42=\"Dimensiunea volumului specificat: {0} octeţi.\\nEşti sigur că vrei să împarţi arhiva în mai multe volume (părţi)?\"\n\n02000D81=\"Stochează\"\n02000D82=\"Normală\"\n02000D83=\"Maximă\"\n02000D84=\"Rapidă\"\n02000D85=\"Imediată\"\n02000D86=\"Ultra\"\n\n02000D90=\"Caută\"\n\n02000DA1=\"Adaugă şi înlocuieşte fişierele\"\n02000DA2=\"Actualizează şi adaugă fişierele\"\n02000DA3=\"Actualizează fişierele existente\"\n02000DA4=\"Sincronizează fişierele\"\n\n02000DB1=\"Toate fişierele\"\n\n02000DC0=\"Arhivare\"\n\n; Columns dialog\n02000E00=\"Coloane\"\n02000E01=\"Bifează coloanele pe care vrei să le faci vizibile în acest director. Utilizează butoanele Mută sus şi Mută jos pentru a reordona coloanele.\"\n02000E02=\"Coloana selectată poate fi\"\n02000E03=\"puncte &mari.\"\n\n02000E10=\"Mută &sus\"\n02000E11=\"Mută &jos\"\n02000E12=\"&Arată\"\n02000E13=\"As&cunde\"\n02000E14=\"S&etează\"\n\n02000E81=\"Titlu\"\n02000E82=\"Lăţime\"\n\n; Testing\n02000F90=\"Testez\"\n\n\n; File Manager\n\n03000000=\"Managerul de fişiere 7-Zip\"\n\n; Menu\n03000102=\"&Fişier\"\n03000103=\"&Editează\"\n03000104=\"&Vizualizează\"\n03000105=\"&Unelte\"\n03000106=\"&Ajutor\"\n03000107=\"F&avorite\"\n\n; File\n03000210=\"&Deschide\"\n03000211=\"Deschide î&n\"\n03000212=\"Deschide în &afară\"\n03000220=\"&Vizualizeză\"\n03000221=\"&Editează\"\n03000230=\"&Redenumeşte\"\n03000231=\"&Copiază la...\"\n03000232=\"&Mută la...\"\n03000233=\"Şter&ge\"\n03000240=\"&Proprietăţi\"\n03000241=\"Comen&tariu\"\n03000242=\"Calculează suma de verificare\"\n03000250=\"Crează director\"\n03000251=\"Crează fişier\"\n03000260=\"&Ieşire\"\n03000270=\"Împarte &fişierul...\"\n03000271=\"&Uneşte fişierele...\"\n\n; Edit\n03000310=\"Ca anterior (&Undo)\"\n03000311=\"&Repetă (Redo)\"\n03000320=\"&Taie\"\n03000321=\"&Copiază\"\n03000322=\"&Lipeşte\"\n03000323=\"Şter&ge\"\n03000330=\"&Selectează tot\"\n03000331=\"&Deselectează tot\"\n03000332=\"&Inversează selecţia\"\n03000333=\"Selectează...\"\n03000334=\"Deselectează...\"\n03000335=\"Selectează după tip\"\n03000336=\"Deselectează după tip\"\n\n; View\n03000410=\"Iconiţe m&ari\"\n03000411=\"Iconiţe m&ici\"\n03000412=\"&Listă\"\n03000413=\"&Detalii\"\n03000420=\"Nesortat\"\n03000430=\"Deschide directorul rădăcină\"\n03000431=\"Un nivel mai sus\"\n03000432=\"Istoria directoarelor...\"\n03000440=\"&Împrospătează\"\n03000449=\"Vedere plană\"\n03000450=\"&2 panouri\"\n03000451=\"Bare de &unelte\"\n03000460=\"Bara de arhivare\"\n03000461=\"Bara de unelte standard\"\n03000462=\"Butoane mari\"\n03000463=\"Arată textul butoanelor\"\n\n; Tools\n03000510=\"&Opţiuni...\"\n03000511=\"&Banc de încercare\"\n\n; Help\n03000610=\"&Conţinut...\"\n03000620=\"&Despre 7-Zip...\"\n\n; Favorites\n03000710=\"&Adaugă directorul în Favorite ca\"\n03000720=\"Semn de carte\"\n\n; Options Dialog\n\n03010000=\"Opţiuni\"\n\n; Plugins\n03010100=\"Plugin-uri\"\n03010101=\"&Plugin-uri:\"\n03010110=\"Opţiuni...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"Asociază 7-Zip cu:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Setări\"\n03010401=\"Arată \\\"..\\\" obiect\"\n03010402=\"Arată iconiţele reale ale fişierului\"\n03010410=\"Arată meniul sistemului\"\n03010420=\"Selectează &tot rândul\"\n03010421=\"Arată liniile de ghidare\"\n03010430=\"Mod de selectare &alternativă\"\n03010440=\"Utilizează pagini &mari de memorie\"\n\n; Strings\n\n03020201=\"Copiază\"\n03020202=\"Mută\"\n03020203=\"Copiază la:\"\n03020204=\"Mută la:\"\n03020205=\"Copiez...\"\n03020206=\"Mut...\"\n03020207=\"Nu poţi muta sau copia obiectele în aceleaşi directoare.\"\n03020208=\"Operaţia nu este suportată.\"\n03020209=\"Alege directorul destinaţie.\"\n\n03020210=\"Aprobă ştergerea fişierului\"\n03020211=\"Aprobă ştergerea directorului\"\n03020212=\"Aprobă ştergerea mai multor fişiere\"\n03020213=\"Eşti sigur că vrei să ştergi '{0}'?\"\n03020214=\"Eşti sigur că vrei să ştergi directorul '{0}' şi tot conţinutul lui?\"\n03020215=\"Eşti sigur că vrei să ştergi aceste {0} obiecte?\"\n03020216=\"Şterg...\"\n03020217=\"Eroare la ştergerea fişierului sau directorului\"\n03020218=\"Sistemul nu poate muta un fişier cu cale lungă la Coşul de gunoi\"\n\n03020220=\"Redenumesc...\"\n03020221=\"Eroare la redenumirea fişierului sau directorului\"\n03020222=\"Aprobă copierea fişierului\"\n03020223=\"Eşti sigur că vrei să copiezi fişierele în arhivă\"\n\n03020230=\"Crează director\"\n03020231=\"Numele directorului:\"\n03020232=\"Director nou\"\n03020233=\"Eroare la crearea directorului\"\n\n03020240=\"Crează fişier\"\n03020241=\"Numele fişierului:\"\n03020242=\"Fişier nou\"\n03020243=\"Eroare la crearea fişierului\"\n\n03020250=\"Selectează\"\n03020251=\"Deselectează\"\n03020252=\"Masca:\"\n\n03020260=\"Istoria directoarelor\"\n\n03020280=\"Fişierul '{0}' a fost modificat.\\nDoreşti să îl actualizez în arhivă?\"\n03020281=\"Nu pot actualiza fişierul\\n'{0}'\"\n03020282=\"Nu pot porni editorul.\"\n03020283=\"Deschid...\"\n03020284=\"The file looks like a virus (the file name contains long spaces in name).\"\n\n03020290=\"Comentariu\"\n03020291=\"&Comentariu:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"Computer\"\n03020301=\"Reţea\"\n03020302=\"Documente\"\n\n03020400=\"Arhivează\"\n03020401=\"Dezarhivează\"\n03020402=\"Testează\"\n\n03020420=\"Copiază\"\n03020421=\"Mută\"\n03020422=\"Şterge\"\n03020423=\"Info\"\n\n03020500=\"Împarte fişierul\"\n03020501=\"Î&mparte în:\"\n03020510=\"Împart...\"\n03020520=\"Confirmă împărţirea\"\n03020521=\"Eşti sigur că vrei să imparţi arhiva în {0} volume (părţi)?\"\n03020522=\"Dimensiunea volumului trebuie să fie mai mică decât dimensiunea fişierului original\"\n\n03020600=\"Uneşte fişierele\"\n03020601=\"&Uneşte în:\"\n03020610=\"Unesc...\"\n03020620=\"Alege doar prima parte din fişierul împărțit\"\n03020621=\"Nu pot detecta fișierul ca parte a fișierului împărțit\"\n03020622=\"Nu găsesc mai mult de o parte din fișierul împărțit\"\n\n03020710=\"Calculez suma de control...\"\n03020720=\"Informaţii despre suma de control\"\n03020721=\"Suma de control CRC pentru conţinut:\"\n03020722=\"Suma de control CRC pentru conţinut şi nume:\"\n\n03020800=\"Citesc...\"\n\n03020900=\"Proprietăţi\"\n\n03020A01=\"Operația nu poate fi apelată dintr-un director cu cale lungă.\"\n03020A02=\"Trebuie să alegi un fișier\"\n03020A03=\"Trebuie să alegi unul sau mai multe fișiere\"\n03020A04=\"Fișierul {0} există deja\"\n\n; Computer\n03031100=\"Mărimea totală\"\n03031101=\"Spaţiu liber\"\n03031102=\"Mărimea grupului\"\n03031103=\"Etichetă\"\n\n; Network\n03031200=\"Nume local\"\n03031201=\"Distribuitor\"\n\n; Benchmark Dialog\n\n03080000=\"Banc de încercare\"\n03080001=\"Memorie utilizată:\"\n03080002=\"Arhivez\"\n03080003=\"Dezarhivez\"\n03080004=\"Viteza\"\n03080005=\"Rata\"\n03080006=\"Rata totală\"\n03080007=\"Actual\"\n03080008=\"Rezultate\"\n03080009=\"Trecute:\"\n0308000A=\"Erori:\"\n0308000B=\"Utilizarea procesorului\"\n0308000C=\"Rata / Utilizare\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ru.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by Igor Pavlov\n;\n;\n;\n;\n\n00000000=\"Russian\"\n00000001=\"Русский\"\n00000002=\"25\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip - Конфигурация\"\n\n; Info Page\n01000100=\"О программе 7-Zip\"\n01000103=\"7-Zip является свободно распространяемой программой. Однако если вы хотите поддержать разработку 7-Zip, вы можете зарегистрировать программу.\"\n01000104=\"Поддержка\"\n01000105=\"Зарегистрировать\"\n\n; Folders Page\n01000200=\"Папки\"\n01000210=\"&Рабочая папка\"\n01000211=\"&Системная временная папка\"\n01000212=\"&Текущая\"\n01000213=\"&Задать:\"\n01000214=\"Использовать только для сменных носителей\"\n\n01000281=\"Укажите положение для временных архивов.\"\n\n; System Page\n01000300=\"Система\"\n01000301=\"Встроить 7-Zip в контекстное меню оболочки\"\n01000302=\"Каскадное контекстное меню\"\n01000310=\"Элементы контекстного меню:\"\n\n; Language Page\n01000400=\"Язык\"\n01000401=\"Язык:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Команды 7-Zip.\"\n02000103=\"Открыть архив\"\n02000104=\"Открытие выделенного архива.\"\n02000105=\"Распаковать\"\n02000106=\"Извлечение файлов из выделенного архива.\"\n02000107=\"Добавить к архиву...\"\n02000108=\"Добавить выделенные объекты к архиву.\"\n02000109=\"Тестировать\"\n0200010A=\"Тестирование выделенного архива.\"\n0200010B=\"Распаковать здесь\"\n0200010C=\"Извлечение файлов из выделенного архива в текущую папку.\"\n0200010D=\"Распаковать в {0}\"\n0200010E=\"Извлечение файлов в подкаталог.\"\n0200010F=\"Добавить к {0}\"\n02000110=\"Добавить выделенные объекты к архиву.\"\n02000111=\"Сжать и отправить по email...\"\n02000112=\"Сжать выделенные объекты и отправить архив по email.\"\n02000113=\"Сжать в {0} и отправить по email\"\n02000114=\"Сжать выделенные объекты и отправить архив по email.\"\n\n02000140=\"<Папка>\"\n02000141=\"<Архив>\"\n\n; Properties\n02000203=\"Путь\"\n02000204=\"Имя\"\n02000205=\"Расширение\"\n02000206=\"Папка\"\n02000207=\"Размер\"\n02000208=\"Сжатый\"\n02000209=\"Атрибуты\"\n0200020A=\"Создан\"\n0200020B=\"Открыт\"\n0200020C=\"Изменен\"\n0200020D=\"Непрерывный\"\n0200020E=\"Комментарий\"\n0200020F=\"Зашифрован\"\n02000210=\"Разбит До\"\n02000211=\"Разбит После\"\n02000212=\"Словарь\"\n02000213=\"CRC\"\n02000214=\"Тип\"\n02000215=\"Анти\"\n02000216=\"Метод\"\n02000217=\"Система\"\n02000218=\"Файловая Система\"\n02000219=\"Пользователь\"\n0200021A=\"Группа\"\n0200021B=\"Блок\"\n0200021C=\"Комментарий\"\n0200021D=\"Позиция\"\n0200021E=\"Путь\"\n0200021F=\"Папок\"\n02000220=\"Файлов\"\n02000221=\"Версия\"\n02000222=\"Том\"\n02000223=\"Многотомный\"\n02000224=\"Смещение\"\n02000225=\"Ссылок\"\n02000226=\"Блоков\"\n02000227=\"Томов\"\n\n02000229=\"64-bit\"\n0200022A=\"Big-endian\"\n0200022B=\"Процессор\"\n0200022C=\"Физический Размер\"\n0200022D=\"Размер Заголовков\"\n0200022E=\"Контрольная Сумма\"\n0200022F=\"Характеристики\"\n02000230=\"Виртуальный Адрес\"\n\n; Status bar\n02000301=\"Выделено объектов: {0}\"\n02000302=\"{0} объект(ов)\"\n\n02000320=\"Файлов:\"\n02000321=\"Папок:\"\n02000322=\"Размер:\"\n02000323=\"Сжатый:\"\n02000324=\"Архивов:\"\n\n; List Context Menu\n02000401=\"&Столбцы...\"\n\n02000411=\"&Открыть\"\n02000412=\"&Извлечь...\"\n\n; ToolBar\n02000501=\"Извлечь\"\n\n; Messages\n02000601=\"Операции изменения не поддерживаются для этого архива.\"\n02000602=\"Не удалось изменить архив {0}\"\n02000603=\"Не удалось создать папку '{0}'\"\n02000604=\"Файл не является поддерживаемым архивом.\"\n02000605=\"Ошибка\"\n02000606=\"Слишком много элементов\"\n02000607=\"Нет ассоциированного приложения\"\n02000608=\"Ошибок не найдено\"\n02000609=\"Не удалось открыть файл '{0}' как архив\"\n0200060A=\"Не удалось открыть зашифрованный архив '{0}'. Неверный пароль?\"\n0200060B=\"Недостаточно свободной памяти\"\n0200060C=\"Неизвестная ошибка\"\n0200060D=\"Неподдерживаемый тип архива\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Да\"\n02000707=\"Да для &всех\"\n02000709=\"&Нет\"\n0200070B=\"Нет для в&сех\"\n\n02000710=\"Отмена\"\n02000711=\"&Отмена\"\n02000713=\"&Закрыть\"\n02000714=\"Стоп\"\n02000715=\"Перезапуск\"\n\n02000720=\"Помощь\"\n\n; Extract dialog\n02000800=\"Извлечь\"\n02000801=\"&Распаковать в:\"\n02000802=\"&Пароль\"\n\n02000810=\"Пути\"\n02000811=\"По&лные пути\"\n02000812=\"О&тносительные пути\"\n02000813=\"&Без путей\"\n\n02000820=\"Перезапись\"\n02000821=\"&С подтверждением\"\n02000822=\"Б&ез подтверждения\"\n02000823=\"Проп&ускать\"\n02000824=\"Переименовать автом.\"\n02000825=\"Переим. автом. существ.\"\n\n02000830=\"Файлы\"\n02000831=\"Выбранные файлы\"\n02000832=\"Все файлы\"\n\n02000881=\"Укажите положение для извлекаемых файлов.\"\n\n02000890=\"Распаковка\"\n\n; Overwrite dialog\n02000900=\"Подтверждение замены файла\"\n02000901=\"Папка уже содержит обрабатываемый файл.\"\n02000902=\"Заменить существующий файл\"\n02000903=\"следующим файлом?\"\n\n02000911=\"Переименовать автом.\"\n\n02000982=\"{0} байтов\"\n02000983=\"изменен\"\n\n; Messages dialog\n02000A00=\"Сообщения\"\n\n02000A80=\"Сообщение\"\n\n02000A91=\"Неподдерживаемый метод сжатия для файла '{0}'.\"\n02000A92=\"Ошибка в данных в '{0}'. Файл испорчен.\"\n02000A93=\"Ошибка CRC в '{0}'. Файл испорчен.\"\n02000A94=\"Ошибка в данных зашифрованного файла '{0}'. Неверный пароль?\"\n02000A95=\"Ошибка CRC для зашифрованного файла '{0}'. Неверный пароль?\"\n\n; Password dialog\n02000B00=\"Ввод пароля\"\n02000B01=\"&Введите пароль:\"\n02000B02=\"&Показать пароль\"\n02000B03=\"&Повторите пароль:\"\n02000B10=\"Пароли не совпадают\"\n02000B11=\"Для пароля используйте только символы латинского алфавита, цифры и специальные символы (!, #, $, ...)\"\n02000B12=\"Пароль слишком длинный\"\n\n; Progress dialog\n02000C00=\"Процесс\"\n02000C01=\"Прошло:\"\n02000C02=\"Осталось:\"\n02000C03=\"Всего:\"\n02000C04=\"Скорость:\"\n02000C05=\"Размер:\"\n02000C06=\"Степень сжатия:\"\n\n02000C10=\"&Фоном\"\n02000C11=\"&На передний план\"\n02000C12=\"&Пауза\"\n02000C13=\"&Продолжить\"\n\n02000C20=\"На паузе\"\n\n02000C30=\"Вы действительно хотите прервать операцию?\"\n\n; Compress dialog\n02000D00=\"Добавить к архиву\"\n02000D01=\"&Архив:\"\n02000D02=\"&Режим изменения:\"\n02000D03=\"&Формат архива:\"\n02000D04=\"&Метод сжатия:\"\n02000D05=\"Создать &Solid архив\"\n02000D06=\"&Параметры:\"\n02000D07=\"&Опции\"\n02000D08=\"Создать SF&X-архив\"\n02000D09=\"М&ногопоточность\"\n02000D0A=\"&Шифровать имена файлов\"\n02000D0B=\"&Уровень сжатия:\"\n02000D0C=\"Размер &словаря:\"\n02000D0D=\"Размер с&лова:\"\n02000D0E=\"Объем памяти для упаковки:\"\n02000D0F=\"Объем памяти для распаковки:\"\n02000D10=\"Шифрование\"\n02000D11=\"Метод шифрования:\"\n02000D12=\"Число потоков:\"\n02000D13=\"Размер блока:\"\n02000D14=\"По размеру файла\"\n02000D15=\"Непрерывный\"\n02000D16=\"Сжимать открытые для записи файлы\"\n\n02000D40=\"Разбить на &тома размером (в байтах):\"\n02000D41=\"Ошибка в поле для задания размера томов\"\n02000D42=\"Установленный размер тома: {0} байтов.\\nВы действительно хотите разбить архив на такие тома?\"\n\n02000D81=\"Без сжатия\"\n02000D82=\"Нормальный\"\n02000D83=\"Максимальный\"\n02000D84=\"Быстрый\"\n02000D85=\"Скоростной\"\n02000D86=\"Ультра\"\n\n02000D90=\"Пролистать\"\n\n02000DA1=\"Добавить и заменить\"\n02000DA2=\"Обновить и добавить\"\n02000DA3=\"Обновить\"\n02000DA4=\"Синхронизировать\"\n\n02000DB1=\"Все файлы\"\n\n02000DC0=\"Компрессия\"\n\n; Columns dialog\n02000E00=\"Столбцы\"\n02000E01=\"Пометьте столбцы, которые следует отображать в этой папке. Кнопками \\\"Вверх\\\" и \\\"Вниз\\\" можно задать порядок следования столбцов.\"\n02000E02=\"Выбранные столбцы должны иметь ширину\"\n02000E03=\"точек.\"\n\n02000E10=\"&Вверх\"\n02000E11=\"В&низ\"\n02000E12=\"П&оказать\"\n02000E13=\"&Скрыть\"\n02000E14=\"Установить\"\n\n02000E81=\"Имя\"\n02000E82=\"Ширина\"\n\n; Testing\n02000F90=\"Тестирование\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&Файл\"\n03000103=\"&Правка\"\n03000104=\"&Вид\"\n03000105=\"С&ервис\"\n03000106=\"&Справка\"\n03000107=\"&Избранное\"\n\n; File\n03000210=\"&Открыть\"\n03000211=\"Открыть &внутри\"\n03000212=\"Открыть снару&жи\"\n03000220=\"Просмотр\"\n03000221=\"&Редактировать\"\n03000230=\"Переи&меновать\"\n03000231=\"&Копировать в...\"\n03000232=\"&Переместить в...\"\n03000233=\"&Удалить\"\n03000240=\"Сво&йства\"\n03000241=\"Комме&нтарий\"\n03000242=\"Контрольная сумма\"\n03000250=\"&Создать Папку\"\n03000251=\"Созд&ать Файл\"\n03000260=\"В&ыход\"\n03000270=\"Ра&збить файл...\"\n03000271=\"О&бъединить файлы...\"\n\n; Edit\n03000310=\"&Отменить\"\n03000311=\"&Вернуть\"\n03000320=\"&Вырезать\"\n03000321=\"&Копировать\"\n03000322=\"Вст&авить\"\n03000323=\"&Удалить\"\n03000330=\"Выделить в&се\"\n03000331=\"Убрать выделение\"\n03000332=\"&Обратить в&ыделение\"\n03000333=\"Выделить...\"\n03000334=\"Убрать выделение...\"\n03000335=\"Выделить по типу\"\n03000336=\"Убрать выделение по типу\"\n\n; View\n03000410=\"&Крупные значки\"\n03000411=\"&Мелкие значки\"\n03000412=\"Спис&ок\"\n03000413=\"&Таблица\"\n03000420=\"Без сортировки\"\n03000430=\"Открыть корневую папку\"\n03000431=\"Переход на один уровень вверх\"\n03000432=\"История папок...\"\n03000440=\"О&бновить\"\n03000449=\"Плоский режим\"\n03000450=\"&2 Панели\"\n03000451=\"&Панели инструментов\"\n03000460=\"Панель кнопок архиватора\"\n03000461=\"Стандартная панель кнопок\"\n03000462=\"Большие кнопки\"\n03000463=\"Надписи на кнопках\"\n\n; Tools\n03000510=\"Настройки...\"\n03000511=\"Тестирование производительности\"\n\n; Help\n03000610=\"&Оглавление...\"\n03000620=\"О &программе...\"\n\n; Favorites\n03000710=\"Добавить папку в &избранное как\"\n03000720=\"Закладка\"\n\n; Options Dialog\n\n03010000=\"Настройки\"\n\n; Plugins\n03010100=\"Плагины\"\n03010101=\"&Плагины:\"\n03010110=\"Сво&йства\"\n\n; Edit\n03010200=\"Редактор\"\n03010201=\"&Редактор:\"\n\n; System\n03010300=\"Система\"\n03010302=\"Ассоциировать 7-Zip с файлами:\"\n03010310=\"Плагин\"\n\n; Settings\n03010400=\"Настройки\"\n03010401=\"Показывать элемент \\\"..\\\"\"\n03010402=\"Показывать реальные иконки файлов\"\n03010410=\"Показывать системное меню\"\n03010420=\"Курсор на всю строку\"\n03010421=\"Показывать разделители\"\n03010430=\"Альтернативный режим пометки\"\n03010440=\"Использовать большие страницы памяти\"\n\n; Strings\n\n03020201=\"Копировать\"\n03020202=\"Переместить\"\n03020203=\"Копировать в:\"\n03020204=\"Переместить в:\"\n03020205=\"Копирование...\"\n03020206=\"Перемещение...\"\n03020207=\"Нельзя скопировать объекты для таких папок\"\n03020208=\"Операция не поддерживается для этой папки.\"\n03020209=\"Укажите папку.\"\n\n03020210=\"Подтверждение удаления файла\"\n03020211=\"Подтверждение удаления папки\"\n03020212=\"Подтверждение удаления группы файлов\"\n03020213=\"Вы действительно хотите удалить \\\"{0}\\\"?\"\n03020214=\"Вы действительно хотите удалить папку \\\"{0}\\\" и все ее содержимое?\"\n03020215=\"Вы действительно хотите удалить эти объекты ({0} шт.)?\"\n03020216=\"Удаление...\"\n03020217=\"Ошибка при удалении файла или папки\"\n03020218=\"Система не поддерживает операцию удаления файлов с длинными путями в корзину\"\n\n03020220=\"Переименование...\"\n03020221=\"Ошибка при переименовании файла или папки\"\n03020222=\"Подтверждение копирования файлов\"\n03020223=\"Вы действительно хотите скопировать эти файлы в архив\"\n\n03020230=\"Создать папку\"\n03020231=\"Имя папки:\"\n03020232=\"Новая папка\"\n03020233=\"Ошибка при создании папки\"\n\n03020240=\"Создать файл\"\n03020241=\"Имя файла:\"\n03020242=\"Новый файл\"\n03020243=\"Ошибка при создании файла\"\n\n03020250=\"Выделить\"\n03020251=\"Убрать выделение\"\n03020252=\"Маска:\"\n\n03020260=\"История папок\"\n\n03020280=\"Файл '{0}' был изменен.\\nВы хотите обновить его в архиве?\"\n03020281=\"Не удалось обновить файл\\n'{0}'\"\n03020282=\"Не удалось запустить редактор\"\n03020283=\"Открытие...\"\n03020284=\"Файл похож на вирус (имя файла содержит длинную последовательность пробелов).\"\n\n03020290=\"Комментарий\"\n03020291=\"&Комментарий:\"\n\n030202A0=\"Система\"\n\n03020300=\"Компьютер\"\n03020301=\"Сеть\"\n03020302=\"Документы\"\n\n03020400=\"Добавить\"\n03020401=\"Извлечь\"\n03020402=\"Тестировать\"\n\n03020420=\"Копировать\"\n03020421=\"Переместить\"\n03020422=\"Удалить\"\n03020423=\"Информация\"\n\n03020500=\"Разбить файл\"\n03020501=\"&Разбить в:\"\n03020510=\"Разбиение...\"\n03020520=\"Подтверждение  разбиения\"\n03020521=\"Вы действительно хотите разбить файл на {0} частей?\"\n03020522=\"Размер тома должен быть меньше размера исходного файла\"\n\n03020600=\"Объединить файлы\"\n03020601=\"&Объединить в:\"\n03020610=\"Объединение...\"\n03020620=\"Необходимо выделить только первую часть разбитого файла\"\n03020621=\"Не удалось распознать разбитый файл\"\n03020622=\"Не удалось найти более одной части разбитого файла\"\n\n03020710=\"Вычисление контрольной суммы...\"\n03020720=\"Контрольная сумма\"\n03020721=\"Контрольная сумма CRC для данных:\"\n03020722=\"Контрольная сумма CRC для данных и имен:\"\n\n03020800=\"Сканирование...\"\n\n03020900=\"Свойства\"\n\n03020A01=\"Операция не может быть исполнена из папки, которая имеет длинный путь.\"\n03020A02=\"Вы должны выделить один файл\"\n03020A03=\"Вы должны выделить один или несколько файлов\"\n03020A04=\"Файл {0} уже существует\"\n\n; Computer\n03031100=\"Емкость\"\n03031101=\"Свободно\"\n03031102=\"Размер кластера\"\n03031103=\"Метка\"\n\n; Network\n03031200=\"Локальное имя\"\n03031201=\"Провайдер\"\n\n; Benchmark Dialog\n\n03080000=\"Тестирование производительности\"\n03080001=\"Объем памяти:\"\n03080002=\"Упаковка\"\n03080003=\"Распаковка\"\n03080004=\"Скорость\"\n03080005=\"Рейтинг\"\n03080006=\"Общий рейтинг\"\n03080007=\"Текущий\"\n03080008=\"Итоговый\"\n03080009=\"Проходов:\"\n0308000A=\"Ошибок:\"\n0308000B=\"Нагрузка\"\n0308000C=\"Рейтинг / Нагр.\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/si.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by සුපුන් බුධාජීව (Supun Budhajeewa)\n;\n;\n;\n;\n\n00000000=\"Sinhala\"\n00000001=\"සිංහල\"\n00000002=\"91\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip වින්‍යාසගත කිරීම්\"\n\n; Info Page\n01000100=\"7-Zip පිළිබඳව\"\n01000103=\"7-Zip නිදහස් මෘදුකාංගයක් වුවත්, ලියාපදිංචි වීම මගින් 7-Zip හි වැඩි දියුණුව සඳහා ඔබට දායක විය හැකිය.\\n\\nමෙම සිංහල භාෂා පරිවර්තනය G.S.N. සුපුන් බුධාජීව (budhajeewa@gmail.com) විසින් සිදු කරන ලදී.\"\n01000104=\"සහය දෙන්න\"\n01000105=\"ලියාපදිංචි වෙන්න\"\n\n; Folders Page\n01000200=\"බහාලුම්\"\n01000210=\"සක්‍රීය බහාලුම් (&W)\"\n01000211=\"පද්ධති තාවකාලික දෑ (Temp) බහාලුම (&S)\"\n01000212=\"වත්මන් (&C)\"\n01000213=\"තෝරන්න (&S):\"\n01000214=\"ඉවත් කළ හැකි ධාවක සඳහා පමණක් භාවිතා කරන්න\"\n\n01000281=\"තාවකාලික හැකිළුම් ගොනු සඳහා ස්ථානයක් දෙන්න.\"\n\n; System Page‍\n01000300=\"පද්ධතිය\"\n01000301=\"Shell context මෙනුව වෙත 7-Zip අන්තර්ගත කරන්න\"\n01000302=\"Context menu අංග එක් අංගයක් යටතේ සඳහන් කරන්න‍‍‍\"\n01000310=\"Context මෙනු අංග:\"\n\n; Language Page\n01000400=\"භාෂාව\"\n01000401=\"භාෂාව:\"\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip විධාන\"\n02000103=\"හැකිළුම විවෘත කරන්න\"\n02000104=\"තෝරා ඇති හැකිළුම විවෘත කරයි.\"\n02000105=\"ගොනු ලිහන්න...\"\n02000106=\"තෝරා ඇති හැකිළුමෙන් ගොනු ලිහයි.\"\n02000107=\"හැකිළුමකට ඇතුල් කරන්න...\"\n02000108=\"තෝරා ඇති වස්තු හැකිළුමකට ඇතුල් කරයි.\"\n02000109=\"හැකිළුම පරීක්ෂා කරන්න\"\n0200010A=\"තෝරා ඇති හැකිළුම පරීක්ෂා කරයි.\"\n0200010B=\"මෙතැනට ලිහන්න\"\n0200010C=\"තෝරා ඇති හැකිළුම ලිහා, එහි ගොනු වත්මන් බහාලුමට එක් කරයි.\"\n0200010D=\"{0} වෙත ලිහන්න\"\n0200010E=\"හැකිළුම ලිහා, එහි ගොනු උප බහාලුමකට එක් කරයි.\"\n0200010F=\"{0} වෙත එක් කරන්න\"\n02000110=\"තෝරාගත් වස්තු දැනටමත් නිර්මිත හැකිළුමකට එක් කරයි.\"\n02000111=\"හකුළා විදුලි තැපැල් කරන්න...\"\n02000112=\"තෝරා ඇති වස්තු හකුළා විදුලි තැපෑල හරහා යවයි.\"\n02000113=\"{0} වෙත හකුළා විදුලි තැපැල් කරන්න\"\n02000114=\"තෝරාගත් වස්තු දැනටමත් නිර්මිත හැකිළුමකට එක් කර විදුලි තැපෑල හරහා යවයි.\"\n\n02000140=\"<බහාලුම>\"\n02000141=\"<හැකිළුම>\"\n\n; Properties\n02000203=\"මංපෙත\"\n02000204=\"නම\"\n02000205=\"දිගුව\"\n02000206=\"බහාලුම\"\n02000207=\"විශාලත්වය\"\n02000208=\"හැකිළුමෙන් පසු විශාලත්වය\"\n02000209=\"ලක්ෂණ\"\n0200020A=\"නිර්මාණය කළ දිනය\"\n0200020B=\"ප්‍රවේශ වූ දිනය\"\n0200020C=\"අළුත් කළ දිනය\"\n0200020D=\"සවි\"\n0200020E=\"ටීකා කොට ඇත\"\n0200020F=\"සුරක්ෂිතය\"\n02000210=\"Split Before\"\n02000211=\"Split After\"\n02000212=\"Dictionary\"\n02000213=\"CRC\"\n02000214=\"වර්ගය\"\n02000215=\"Anti\"\n02000216=\"ක්‍රමය\"\n02000217=\"ධාරක මෙහෙයුම් පද්ධතිය\"\n02000218=\"ගොනු පද්ධතිය\"\n02000219=\"පරිශිලක\"\n0200021A=\"සමූහය\"\n0200021B=\"Block\"\n0200021C=\"ටීකාව\"\n0200021D=\"පිහිටීම\"\n0200021E=\"Path Prefix\"\n0200021F=\"බහාලුම්\"\n02000220=\"ගොනු\"\n02000221=\"සංස්කරණය\"\n02000222=\"Volume\"\n02000223=\"Multivolume\"\n02000224=\"Offset\"\n02000225=\"සබැඳීන්\"\n02000226=\"Blocks\"\n02000227=\"Volumes\"\n\n02000229=\"බිට්-64\"\n0200022A=\"Big-endian\"\n0200022B=\"මධ්‍යම සැකසුම් පද්ධතිය (CPU)\"\n0200022C=\"භෞතික විශාලත්වය\"\n0200022D=\"ශීර්ෂ විශාලත්වය\"\n0200022E=\"Checksum\"\n0200022F=\"මුහුණුවර\"\n02000230=\"Virtual Address\"\n\n; Status bar\n02000301=\"වස්තු {0}ක් තෝරා ඇත\"\n02000302=\"වස්තු {0}\"\n\n02000320=\"ගොනු:\"\n02000321=\"බහාලුම්:\"\n02000322=\"ප්‍රමාණය:\"\n02000323=\"හැකිළු පසු ප්‍රමාණය:\"\n02000324=\"හැකිළුම්:\"\n\n; List Context Menu\n02000401=\"කොලමයන් (&C)...\"\n\n02000411=\"විවෘත කරන්න (&O)\"\n02000412=\"ලිහන්න (&Ex)...\"\n\n; ToolBar\n02000501=\"ලිහන්න\"\n\n; Messages\n02000601=\"මෙම හැකිළුම සඳහා යාවත්කාල කිරීම් සහයෝගය නොදක්වයි.\"\n02000602=\"{0} හැකිළුම යාවත්කාල කල නොහැක\"\n02000603=\"'{0}' බහාලුම තැනිය නොහැක\"\n02000604=\"ගොනුව සහයෝගී හැකිළුමක් නොවේ.\"\n02000605=\"දෝෂයක්\"\n02000606=\"අංග ඉතා අධිකය\"\n02000607=\"දෙන ලද ගොනු නාම දිගුව හා ආශ්‍රිත යෙදවුමක් නැත\"\n02000608=\"දෝෂ නොමැත\"\n02000609=\"'{0}' ගොනුව හැකිළුමක් ලෙස විවෘත කළ නොහැක\"\n0200060A=\"සුරක්ෂිත '{0}' හැකිළුම විවෘත කළ නොහැක. මුරපදය වැරදි ද ?\"\n0200060B=\"අවශ්‍ය මතක ප්‍රමාණය පද්ධතියට වෙන් කර ගත නොහැක\"\n0200060C=\"හඳුනා නොගත් දෝෂයක්\"\n0200060D=\"සහයෝගී නොවන හැකිළුම් ක්‍රමයක්\"\n\n; Dialogs\n02000702=\"හරි\"\n02000705=\"ඔවු (&Y)\"\n02000707=\"සියල්ලටම ඔවු (&A)\"\n02000709=\"නැහැ (&N)\"\n0200070B=\"සියල්ලටම නැහැ(&L)\"\n\n02000710=\"එපා\"\n02000711=\"එපා (&C)\"\n02000713=\"වසන්න (&C)\"\n02000714=\"නවතන්න\"\n02000715=\"ප්‍රත්‍යාරම්භ කරන්න\"\n\n02000720=\"උදව්\"\n\n; Extract dialog\n02000800=\"ලිහන්න\"\n02000801=\"ලිහීමට තැනක් (&X) :\"\n02000802=\"මුරපදය\"\n\n02000810=\"මංපෙත් ස්වභාවය\"\n02000811=\"සම්පූර්ණ මංපෙත් නම්\"\n02000812=\"වර්තමාන මංපෙත් නම්\"\n02000813=\"මංපෙත් නම් අවශ්‍ය නැත\"\n\n02000820=\"උඩින් ලිවීමේ ස්වභාවය\"\n02000821=\"උඩින් ලියන්නට පෙර විමසන්න\"\n02000822=\"විමසීමෙන් තොරව උඩින් ලියන්න\"\n02000823=\"දැනටමත් ඇති ගොනු මගහරින්න\"\n02000824=\"ගොනු ස්වයංක්‍රියව ප්‍රතිනම් කරන්න\"\n02000825=\"දැනටමත් ඇති ගොනු‍ ප්‍රතිනම් කරන්න\"\n\n02000830=\"ගොනු\"\n02000831=\"තෝරාගත් ගොනු (&S)\"\n02000832=\"සියළු ගොනු (&A)\"\n\n02000881=\"ලිහන ලද ගොනු සඳහා ස්ථානයක් තෝරන්න.\"\n\n02000890=\"ලිහමින් පවතී‍\"\n\n; Overwrite dialog\n02000900=\"ගොනු ප්‍රතිස්ථාපනය තහවුරු කර ගැනීම\"\n02000901=\"ගමනාන්ත බහාලුමේ දැනටමත් නිර්මිත ගොනුවක් ඇත.\"\n02000902=\"දැනටම පවතින පහත ගොනුව,\"\n02000903=\"මෙය සමග ප්‍රතිස්ථාපනය කරන්න ද ?\"\n\n02000911=\"ස්වයංක්‍රියව ප්‍රතිනම් කරන්න (&U)\"\n\n02000982=\"{0} බයිට (Bytes)\"\n02000983=\"නව්‍ය කළේ\"\n\n; Messages dialog\n02000A00=\"විනිශ්චීය පණිවුඩ\"\n\n02000A80=\"පණිවිඩය\"\n\n02000A91=\"'{0}' සඳහා සහයෝගය නොදක්වන හැකිළුම් ක්‍රමයක්.\"\n02000A92=\"'{0}' හි දත්ත දෝෂයකි. ගොනුව බිඳී ඇත.\"\n02000A93=\"'{0}' හි CRC අසමත් විනි. ගොනුව බිඳී ඇත.\"\n02000A94=\"සුරක්ෂිත '{0}' ගොනුවේ දත්ත දෝෂයකි. වැරදි මුරපදයක් ද ?\"\n02000A95=\"සුරක්ෂිත '{0}' ගොනුවේ CRC අසමත් විනි. වැරදි මුරපදයක් ද ?\"\n\n; Password dialog\n02000B00=\"මුරපදය ඇතුල් කරන්න\"\n02000B01=\"මුරපදය ඇතුල් කරන්න:\"\n02000B02=\"මුරපදය පෙන්වන්න (&S)\"\n02000B03=\"මුරපදය නැවත ඇතුල් කරන්න:\"\n02000B10=\"මුරපද නොගැලපේ\"\n02000B11=\"මුරපද සඳහා ඉංග්‍රිසි අකුරු, ඉලක්කම් සහ විශේෂිත සංකේත පමණක් භාවිතා කරන්න (!, #, $, ...)\"\n02000B12=\"මුරපදය දිග වැඩිය\"\n\n; Progress dialog\n02000C00=\"ක්‍රියාවලිය\"\n02000C01=\"ගතවූ කාලය:\"\n02000C02=\"ඉතිරි කාලය:\"\n02000C03=\"සම්පූර්ණ විශාලත්වය:\"\n02000C04=\"වේගය:\"\n02000C05=\"ක්‍රියාවලියට භාජනය වූ ප්‍රමාණය:\"\n02000C06=\"හැකිළුම් අනුපාතය:\"\n\n02000C10=\"පසුබිමින් (&B)\"\n02000C11=\"පෙරබිමින් (&F)\"\n02000C12=\"මදකට නවතන්න (&P)\"\n02000C13=\"නැවත අරඹන්න (&C)\"\n\n02000C20=\"මදකට නවතා ඇත\"\n\n02000C30=\"ඉවත්වීමට අවශ්‍ය බව විශ්වාස ද ?\"\n\n; Compress dialog\n02000D00=\"හැකිළුමකට එක් කරන්න\"\n02000D01=\"හැකිළුම (&A):\"\n02000D02=\"යාවත්කාල කිරීමේ ස්වභාවය (&U):\"\n02000D03=\"හැකිළුම් රටාව (&F):\"\n02000D04=\"හැකිළුම් ක්‍රමය (&M):\"\n02000D05=\"සවි හැකිළුමක් තනන්න (&S)\"\n02000D06=\"පරාමිති (&P):\"\n02000D07=\"විකල්ප\"\n02000D08=\"SF&X හැකිළුමක් තනන්න\"\n02000D09=\"Multi-threading\"\n02000D0A=\"ගොනු නාම සුරකින්න (&S)\"\n02000D0B=\"හැකිළුම් මට්ටම (&L):\"\n02000D0C=\"&Dictionary size:\"\n02000D0D=\"&Word size:\"\n02000D0E=\"හැකිලීම සඳහා මතක භාවිතය:\"\n02000D0F=\"ලිහීම ක්‍රියාව සඳහා මතක භාවිතය:\"\n02000D10=\"සුරැකුම්\"\n02000D11=\"සුරැකුම් ක්‍රමය:\"\n02000D12=\"Number of CPU threads:\"\n02000D13=\"Solid block size:\"\n02000D14=\"සවි-නොමැති\"\n02000D15=\"සවි\"\n02000D16=\"හවුල්කාර ගොනු ද හකුළන්න\"\n\n02000D40=\"කොටස් වලට බෙදන්න, බයිට (bytes):\"\n02000D41=\"වැරදි කොටස් විශාලත්වයකි\"\n02000D42=\"සඳහන් කරන ලද කොටස් විශාලත්වය බයිට  {0} කි.\\nහැකිළුම මෙවන් කොටස් වලට බෙදියයුතු බව විශ්වාස ද ?\"\n\n02000D81=\"තැන්පත් කරන්න\"\n02000D82=\"සාමාන්‍ය\"\n02000D83=\"උපරිම\"\n02000D84=\"වේගවත්\"\n02000D85=\"ඉතා වේගවත්\"\n02000D86=\"අධි හැකිළුම්‍\"\n\n02000D90=\"සොයන්න\"\n\n02000DA1=\"ගොනු එක් කර ප්‍රතිස්ථාපනය කරන්න\"\n02000DA2=\"ගොනු යාවත්කාල කර එක් කරන්න\"\n02000DA3=\"දැනටමත් ඇති ගොනු නැවුම් කරන්න\"\n02000DA4=\"ගොනු සමකාලී කරන්න\"\n\n02000DB1=\"සියළු ගොනු\"\n\n02000DC0=\"හකුළමින් පවතී\"\n\n; Columns dialog\n02000E00=\"කොලම\"\n02000E01=\"මෙම බහාලුමේ දිස්වනවාට ඔබ කැමති කොලමයන් තෝරන්න. කොලමයන් පිලිවෙල කිරීම සඳහා ඉහළට සහ පහළට යන බොත්තම් භාවිත කරන්න.\"\n02000E02=\"තෝරාගත් කොලමයන්,\"\n02000E03=\"පික්සල් පළල (&W).\"\n\n02000E10=\"ඉහළට (&U)\"\n02000E11=\"පහළට (&D)\"\n02000E12=\"පෙන්වන්න (&S)\"\n02000E13=\"සඟවන්න (&H)\"\n02000E14=\"පිහිටුවන්න\"\n\n02000E81=\"නාමය\"\n02000E82=\"පළල\"\n\n; Testing\n02000F90=\"පරීක්ෂා කිරීම\"\n\n; File Manager\n\n03000000=\"7-Zip ගොනු කළමනාකරු\"\n\n; Menu\n03000102=\"ගොනුව (&F)\"\n03000103=\"සැකසුම් (&E)\"\n03000104=\"දසුන (&V)\"\n03000105=\"මෙවලම් (&T)\"\n03000106=\"උදව් (&H)\"\n03000107=\"කැමතිම (&A)\"\n\n; File\n03000210=\"විවෘත කරන්න (&O)\"\n03000211=\"මෙහිම විවෘත කරන්න (&I)\"\n03000212=\"පිටතින් විවෘත කරන්න (&U)\"\n03000220=\"දසුන (&V)\"\n03000221=\"සංස්කරණය කරන්න (&E)\"\n03000230=\"නැවත නම් කරන්න (&M)\"\n03000231=\"වෙනත් තැනකට පිටපත් කරන්න (&C)...\"\n03000232=\"වෙනත් තැනකට ගෙනය‍න්න (&M)...\"\n03000233=\"මකන්න (&D)\"\n03000240=\"වත්කම් (&R)\"\n03000241=\"ටීකා (&N)\"\n03000242=\"checksum ගණනය කරන්න\"\n03000250=\"බහාලුමක් තනන්න\"\n03000251=\"ගොනුවක් තනන්න\"\n03000260=\"ඉවත් වන්න (&X)\"\n03000270=\"ගොනුව බෙදන්න (&S)...\"\n03000271=\"ගොනු එකතු කරන්න (&B)...\"\n\n; Edit\n03000310=\"අහෝසි කරන්න (&U)\"\n03000311=\"යළි කරන්න (&R)\"\n03000320=\"කපන්න (&T)\"\n03000321=\"පිටපත් කරන්න (&C)\"\n03000322=\"අලවන්න (&P)\"\n03000323=\"මකන්න (&D)\"\n03000330=\"සියල්ල තෝරන්න (&A)\"\n03000331=\"තෝරන ලද සියල්ල ඉන් ඉවත් කරන්න\"\n03000332=\"අනෙක් පැත්තට තෝරන්න (&I)\"\n03000333=\"තෝරන්න...\"\n03000334=\"තේරීම ඉවත් කරන්න...\"\n03000335=\"වර්ගයෙන් තෝරන්න\"\n03000336=\"වර්ගයෙන් තේරීම ඉවත් කරන්න\"\n\n; View\n03000410=\"විශාල මූර්ති (&G)\"\n03000411=\"කුඩා මූර්ති (&M)\"\n03000412=\"ලයිස්තුව (&L)\"\n03000413=\"සවිස්තර (&D)\"\n03000420=\"අසුරන නොලද\"\n03000430=\"ප්‍රධාන බහාලුම විවෘත කරන්න\"\n03000431=\"ඉහළට එක් ස්ථරයක්\"\n03000432=\"බහාලුම් අතීතය...\"\n03000440=\"ප්‍රතිපූරණය කරන්න(&R)\"\n03000449=\"පැතලි දසුන\"\n03000450=\"පැනල &2\"\n03000451=\"මෙවලම් තීරු (&T)\"\n03000460=\"හැකිළුම් මෙවලම් තීරුව\"\n03000461=\"සම්මත මෙවලම් තීරුව\"\n03000462=\"විශාල බොත්තම්\"\n03000463=\"බොත්තම් පෙළ දක්වන්න\"\n\n; Tools\n03000510=\"විකල්ප (&O)...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"අන්තර්ගතය (&C)...\"\n03000620=\"7-Zip පිළිබඳව (&A)...\"\n\n; Favorites\n03000710=\"බහාලුම කැමතිම අංග වලට එකතු කරන අයුර (&A)\"\n03000720=\"පොත් සලකුණ - අංක\"\n\n; Options Dialog\n\n03010000 = \"විකල්ප\"\n\n; Plugins\n03010100 = \"ප්ලගින\"\n03010101 = \"ප්ලගින (&P):\"\n03010110 = \"විකල්ප...\"\n\n; Edit\n03010200 = \"සංස්කාරකය\"\n03010201 = \"සංස්කාරකය (&E):\"\n\n; System\n03010300 = \"පද්ධතිය\"\n03010302 = \"7-Zip සමග හවුල් කරන්න:\"\n03010310 = \"ප්ලගින\"\n\n; Settings\n03010400 = \"සෙටිංග්ස්\"\n03010401 = \"\\\"..\\\" අංගය පෙන්වන්න\"\n03010402 = \"ගොනු වල සත්‍ය මූර්තිය පෙන්වන්න\"\n03010410 = \"පද්ධති මෙනුව පෙන්වන්න\"\n03010420 = \"සම්පූර්ණ තීරු තේරීම (&F)\"\n03010421 = \"වගු රේභා පෙන්වන්න (&G)\"\n03010430 = \"වෛකල්පිත තේරීම් ස්වභාවය (&A)\"\n03010440 = \"විශාල මතක පිටු භාවිතා කරන්න (&L)\"\n\n; Strings\n\n03020201 = \"පිටපත් කරන්න\"\n03020202 = \"ගෙනයන්න\"\n03020203 = \"වෙනත් තැනකට පිටපත් කරන්න:\"\n03020204 = \"වෙනත් තැනකට ගෙනයන්න:\"\n03020205 = \"පිටපත් කරමින් පවතී...\"\n03020206 = \"ගෙනයමින් පවතී...\"\n03020207 = \"මෙවන් බහාලුම් වලට ගොනු පිටපත් හෝ ගෙනයාම කළ නොහැක.\"\n03020208 = \"ක්‍රියාව කල නොහැක.\"\n03020209 = \"ගමනාන්ත බහාලුම තෝරන්න.\"\n\n03020210 = \"ගොනු මැකීම තහවුරු කිරීම\"\n03020211 = \"බහාලුම් මැකීම තහවුරු කිරීම\"\n03020212 = \"බහු ගොනු මැකීම තහවුරු කිරීම\"\n03020213 = \"ඔබට '{0}' මැකීමට අවශ්‍ය බව විශ්වාස ද ?\"\n03020214 = \"ඔබට '{0}' බහාලුම හා එහි අන්තර්ගතය මැකීමට අවශ්‍ය බව විශ්වාස ද ?\"\n03020215 = \"ඔබට {0} යන වස්තු මැකීමට අවශ්‍ය බව විශ්වාස ද ?\"\n03020216 = \"මකමින් පවතී...\"\n03020217 = \"ගොනුව හෝ බහාලුම මැකීමේ දී දෝෂයක් මතු විය\"\n03020218=\"දිගු මංපෙතක් ඇති ගොනුවක් කුණු බඳුනට යැවීම පද්ධතියට කල නොහැක.\"\n\n03020220 = \"ප්‍රතිනම් කරමින් පවතී...\"\n03020221 = \"ගොනුව හෝ බහාලුම මැකීමේදී දෝෂයක් මතු විය\"\n03020222 = \"ගොනු පිටපත් කිරීම තහවුරු කිරීම\"\n03020223 = \"ගො‍නුව හැකිළුම වෙත පිටපත් කළ යුතු බව ඔබට විශ්වාස ද\"\n\n03020230 = \"බහාලුමක් තනන්න\"\n03020231 = \"බහාලුම් නාමය:\"\n03020232 = \"නව බහාලුමක්\"\n03020233 = \"බහාලුම තැනීමේදී දෝෂයක් මතුවිය\"\n\n03020240 = \"ගොනුවක් තනන්න\"\n03020241 = \"ගොනු නාමය:\"\n03020242 = \"නව ගොනුවක්\"\n03020243 = \"ගොනුව තැනීමේදී දෝෂයක් මතුවිය\"\n\n03020250 = \"තෝරන්න\"\n03020251 = \"තේරීම ඉවත් කරන්න\"\n03020252 = \"ගොනුවේ හෝ බහාලුමේ නම හෝ කොටසක්:\"\n\n03020260 = \"බහාලුම් අතීතය\"\n\n03020280 = \"'{0}' ගොනුව නව්‍ය කෙරිනි.\\nහැකිළුමෙහි එය යාවත්කාල කිරීමට ඔබට අවශ්‍ය ද ?\"\n03020281 = \"ගොනුව යාවත්කාල කල නොහැක\\n'{0}'\"\n03020282 = \"සංස්කාරකය විවෘත කළ නොහැක.\"\n03020283 = \"විවෘත කරමින් පවතී...\"\n03020284=\"ගොනුව වෛරසයක් වැනිය (ගොනු නාමයේ දිගු හිස් තැන් ඇත).\"\n\n03020290 = \"ටීකාව\"\n03020291 = \"ටීකාව (&C):\"\n\n030202A0 = \"පද්ධතිය\"\n\n03020300 = \"පරිගණකය\"\n03020301 = \"ජාලය\"\n03020302=\"ලියකියවිලි\"\n\n03020400 = \"හකුළන්න\"\n03020401 = \"ලිහන්න\"\n03020402 = \"පරීක්ෂා කරන්න\"\n\n03020420 = \"පිටපත් කරන්න\"\n03020421 = \"ගෙන යන්න\"\n03020422 = \"මකන්න\"\n03020423 = \"තොරතුරු\"\n\n03020500 = \"ගොනුව බෙදන්න\"\n03020501 = \"ගොනුව බෙදා කොටස් මෙහි තැන්පත් කරන්න (&S):\"\n03020510 = \"ගොනුව බෙදමින් පවතී...\"\n03020520 = \"ගොනුව බෙදීම තහවුරු කරන්න\"\n03020521 = \"ගොනුව කොටස් {0} කට බෙදීමට අවශ්‍ය බව ඔබට විශ්වාස ද ?\"\n03020522 = \"බෙදූ කොටසක විශාලත්වය, මුල් ගොනුවේ විශාලත්වයට වඩා අඩු විය යුතුය\"\n\n03020600 = \"බෙදූ ගොනු එක් කරන්න\"\n03020601 = \"බෙදූ ගොනු එක් කර මෙහි තැනපත් කරන්න (&C):\"\n03020610 = \"බෙදූ ගොන එක් කරමින් පවතී...\"\n03020620 = \"පළමු ගොනුව පමණක් තෝරන්න\"\n03020621=\"ගොනුව, බෙදන ලද ගොනුවක කොටසක් ලෙස හඳුනාගත නොහැක.\"\n03020622=\"බෙදන ලද ගොනුවේ කොටස් වලින් එකකට වඩා සොයාගත නොහැක.\"\n\n03020710 = \"Checksum calculating...\"\n03020720 = \"Checksum information\"\n03020721 = \"CRC checksum for data:\"\n03020722 = \"CRC checksum for data and names:\"\n\n03020800 = \"සුපිරික්සමින් පවතී...\"\n\n03020900 = \"වත්කම්\"\n\n03020A01=\"දිගු මංපෙතක් ඇති බහාලුමකින් ක්‍රියාකාරීත්වය කැඳවිය නොහැක.\"\n03020A02=\"එක් ගොනුවක් පමණක් තේරිය යුතුය.\"\n03020A03=\"ගොනු එකක් හෝ වැඩි ගණනක් තේරිය යුතුය.\"\n03020A04=\"{0} ගොනුව දැනටමත් ඇත\"\n\n; Computer\n03031100 = \"සම්පූර්ණ විශාලත්වය\"\n03031101 = \"නිදහස් ඉඩ\"\n03031102 = \"Cluster විශාලත්වය\"\n03031103 = \"නම් පත\"\n\n; Network\n03031200 = \"Local Name\"\n03031201 = \"සපයන්නා\"\n\n; Benchmark Dialog\n\n03080000 = \"Benchmark\"\n03080001 = \"මතක භාවිතය:\"\n03080002 = \"හැකිළුම්\"\n03080003 = \"ලිහුම්\"\n03080004 = \"වේගය\"\n03080005 = \"ඇගයුම\"\n03080006 = \"සම්පූර්ණ ඇගයුම\"\n03080007 = \"වත්මන්\"\n03080008 = \"ප්‍රතිඵලිත\"\n03080009 = \"Passes:\"\n0308000A = \"දෝෂ:\"\n0308000B = \"CPU භාවිතාව\"\n0308000C = \"ඇගයුම / භාවිතාව‍\"\n\n;!@LangEnd@!\n\n \t  \t \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/sk.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59 beta\n; Translated by Pavel Devečka\n;\n;\n;\n;\n\n00000000=\"Slovak\"\n00000001=\"Slovenčina\"\n00000002=\"27\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Nastavenia 7-Zip\"\n\n; Info Page\n01000100=\"O programe 7-Zip\"\n01000103=\"7-Zip je voľne šíriteľný program. Jeho vývoj môžete podporiť tým, že sa zaregistrujete.\"\n01000104=\"Podporiť\"\n01000105=\"Zaregistrovať\"\n\n; Folders Page\n01000200=\"Adresáre\"\n01000210=\"&Pracovný adresár\"\n01000211=\"&Systémový adresár pre dočasné súbory\"\n01000212=\"&Aktuálny adresár\"\n01000213=\"&Manuálne vybraný adresár:\"\n01000214=\"Po&užiť len pre vymeniteľné jednotky\"\n\n01000281=\"Vyberte adresár pre dočasné súbory.\"\n\n; System Page\n01000300=\"Systém\"\n01000301=\"Integrovať 7-Zip do kontextového menu\"\n01000302=\"Kaskádové kontextové menu\"\n01000310=\"Položky kontextového menu:\"\n\n; Language Page\n01000400=\"Jazyk\"\n01000401=\"Jazyk:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Príkazy 7-Zip\"\n02000103=\"Otvoriť archív\"\n02000104=\"Otvorí vybraný archív.\"\n02000105=\"Rozbaliť súbory...\"\n02000106=\"Rozbalí súbory z vybraného archívu.\"\n02000107=\"Pridať do archívu...\"\n02000108=\"Pridá vybrané položky do archívu.\"\n02000109=\"Otestovať archív\"\n0200010A=\"Otestuje integritu vybraného archívu.\"\n0200010B=\"Rozbaliť tu\"\n0200010C=\"Rozbalí súbory z vybraného archívu do aktuálneho adresára.\"\n0200010D=\"Rozbaliť do {0}\"\n0200010E=\"Rozbalí súbory do podadresára.\"\n0200010F=\"Pridať do {0}\"\n02000110=\"Pridá vybrané položky do archívu.\"\n02000111=\"Skomprimovať a poslať emailom...\"\n02000112=\"Skomprimuje vybrané položky do archívu a pošle archív emailom.\"\n02000113=\"Skomprimovať do {0} a poslať emailom\"\n02000114=\"Skomprimuje vybrané položky do archívu a pošle archív emailom.\"\n\n02000140=\"<Adresár>\"\n02000141=\"<Archív>\"\n\n; Properties\n02000203=\"Cesta\"\n02000204=\"Meno\"\n02000205=\"Prípona\"\n02000206=\"Adresár\"\n02000207=\"Veľkosť\"\n02000208=\"Veľkosť po kompresii\"\n02000209=\"Atribúty\"\n0200020A=\"Vytvorený\"\n0200020B=\"Sprístupnený\"\n0200020C=\"Zmenený\"\n0200020D=\"Jednoliaty\"\n0200020E=\"Komentovaný\"\n0200020F=\"Zašifrovaný\"\n02000210=\"Rozdelený predtým\"\n02000211=\"Rozdelený potom\"\n02000212=\"Slovník\"\n02000213=\"CRC\"\n02000214=\"Typ\"\n02000215=\"Anti\"\n02000216=\"Metóda\"\n02000217=\"Hostiteľský OS\"\n02000218=\"Súborový systém\"\n02000219=\"Užívateľ\"\n0200021A=\"Skupina\"\n0200021B=\"Blok\"\n0200021C=\"Komentár\"\n0200021D=\"Pozícia\"\n0200021E=\"Predpona cesty\"\n0200021F=\"Adresáre\"\n02000220=\"Súbory\"\n02000221=\"Verzia\"\n02000222=\"Zväzok\"\n02000223=\"Multizväzok\"\n02000224=\"Ofset\"\n02000225=\"Väzby\"\n02000226=\"Bloky\"\n02000227=\"Zväzky\"\n\n02000229=\"64-bitov\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Fyzická veľkosť\"\n0200022D=\"Veľkosť hlavičiek\"\n0200022E=\"Kontrolný súčet\"\n0200022F=\"Charakteristiky\"\n02000230=\"Virtuálna adresa\"\n\n; Status bar\n02000301=\"{0} objekt(ov) vybraných\"\n02000302=\"{0} objekt(ov)\"\n\n02000320=\"Súbory:\"\n02000321=\"Adresáre:\"\n02000322=\"Veľkosť:\"\n02000323=\"Veľkosť po kompresii:\"\n02000324=\"Archívy:\"\n\n; List Context Menu\n02000401=\"&Stĺpce...\"\n\n02000411=\"&Otvoriť\"\n02000412=\"&Rozbaliť...\"\n\n; ToolBar\n02000501=\"Rozbaliť\"\n\n; Messages\n02000601=\"Aktualizačné operácie nie sú v tomto archíve podporované.\"\n02000602=\"Nemožno aktualizovať archív {0}\"\n02000603=\"Nemožno vytvoriť adresár '{0}'.\"\n02000604=\"Súbor nie je podporovaný archív.\"\n02000605=\"Chyba\"\n02000606=\"Priveľa položiek\"\n02000607=\"Žiadna aplikácia nie je priradená k súborom s touto príponou.\"\n02000608=\"V archíve sa nenašli žiadne chyby.\"\n02000609=\"Súbor '{0}' nemožno otvoriť ako archív.\"\n0200060A=\"Nemožno otvoriť šifrovaný archív '{0}'. Nesprávne heslo?\"\n0200060B=\"Systém nemôže alokovať požadované množstvo pamäte.\"\n0200060C=\"Neznáma chyba\"\n0200060D=\"Nepodporovaný typ archívu\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Áno\"\n02000707=\"Áno na &všetko\"\n02000709=\"&Nie\"\n0200070B=\"Nie na vš&etko\"\n\n02000710=\"Storno\"\n02000711=\"&Storno\"\n02000713=\"&Zatvoriť\"\n02000714=\"Zastaviť\"\n02000715=\"Reštartovať\"\n\n02000720=\"Nápoveda\"\n\n; Extract dialog\n02000800=\"Rozbaliť\"\n02000801=\"Rozbaliť do:\"\n02000802=\"Heslo\"\n\n02000810=\"Nastavenie názvov ciest\"\n02000811=\"Plné názvy ciest\"\n02000812=\"Aktuálne názvy ciest\"\n02000813=\"Žiadne názvy ciest\"\n\n02000820=\"Nastavenie prepísania\"\n02000821=\"Spýtať sa pred prepísaním\"\n02000822=\"Prepísať bez výzvy\"\n02000823=\"Preskočiť existujúce súbory\"\n02000824=\"Automaticky premenovať\"\n02000825=\"Auto. premenovať existujúce súbory\"\n\n02000830=\"Súbory\"\n02000831=\"&Vybrané súbory\"\n02000832=\"Vš&etky súbory\"\n\n02000881=\"Špecifikujte adresár pre rozbalené súbory.\"\n\n02000890=\"Rozbaľovanie\"\n\n; Overwrite dialog\n02000900=\"Potvrdenie nahradenia súboru\"\n02000901=\"Cieľový adresár už obsahuje rozbaľovaný súbor.\"\n02000902=\"Chcete nahradiť existujúci súbor\"\n02000903=\"týmto?\"\n\n02000911=\"&Automaticky premenovať\"\n\n02000982=\"{0} bajtov\"\n02000983=\"upravených\"\n\n; Messages dialog\n02000A00=\"Diagnostické správy\"\n\n02000A80=\"Správa\"\n\n02000A91=\"Nepodporovaná kompresná metóda pre '{0}'.\"\n02000A92=\"Dátová chyba v '{0}'. Súbor je porušený.\"\n02000A93=\"CRC zlyhalo v '{0}'. Súbor je porušený.\"\n02000A94=\"Dátová chyba v šifrovanom súbore '{0}'. Nesprávne heslo?\"\n02000A95=\"CRC zlyhalo v šifrovanom súbore '{0}'. Nesprávne heslo?\"\n\n; Password dialog\n02000B00=\"Zadajte heslo\"\n02000B01=\"Zadajte heslo:\"\n02000B02=\"Ukázať heslo\"\n02000B03=\"Zopakujte heslo:\"\n02000B10=\"Heslá nie sú zhodné!\"\n02000B11=\"Používajte len písmená bez diakritiky, čísla a špeciálne znaky (!, #, $, ...)!\"\n02000B12=\"Heslo je príliš dlhé!\"\n\n; Progress dialog\n02000C00=\"Priebeh\"\n02000C01=\"Uplynutý čas:\"\n02000C02=\"Zostávajúci čas:\"\n02000C03=\"Veľkosť:\"\n02000C04=\"Rýchlosť:\"\n02000C05=\"Spracované:\"\n02000C06=\"Úroveň kompresie:\"\n\n02000C10=\"&Pozadie\"\n02000C11=\"P&opredie\"\n02000C12=\"Po&zastaviť\"\n02000C13=\"Po&kračovať\"\n\n02000C20=\"Pozastavené\"\n\n02000C30=\"Ste si istý, že chcete akciu zrušiť?\"\n\n; Compress dialog\n02000D00=\"Pridať do archívu\"\n02000D01=\"&Archív:\"\n02000D02=\"&Nastavenie aktualizácie súborov v existujúcich archívoch:\"\n02000D03=\"&Formát archívu:\"\n02000D04=\"&Kompresná metóda:\"\n02000D05=\"V&ytvoriť jednoliaty archív\"\n02000D06=\"&Parametre:\"\n02000D07=\"Možnosti\"\n02000D08=\"Vytvoriť samorozbaľovací archív\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Zašifrovať mená súborov\"\n02000D0B=\"Ú&roveň kompresie:\"\n02000D0C=\"&Veľkosť slovníka:\"\n02000D0D=\"V&eľkosť slova:\"\n02000D0E=\"Pamäť potrebná na kompresiu:\"\n02000D0F=\"Pamäť potrebná na dekompresiu:\"\n02000D10=\"Šifrovanie\"\n02000D11=\"Metóda šifrovania:\"\n02000D12=\"Poče&t CPU vlákien:\"\n02000D13=\"Veľk&osť jednoliateho bloku:\"\n02000D14=\"Nejednoliaty\"\n02000D15=\"Jednoliaty\"\n02000D16=\"Komprimovať zdieľané súbory\"\n\n02000D40=\"Roz&deliť na časti, bajtov:\"\n02000D41=\"Nesprávna veľkosť časti\"\n02000D42=\"Vybraná veľkosť časti: {0} bytov.\\nSte si istý, že chcete rozdeliť archív na také časti?\"\n\n02000D81=\"Bez kompresie\"\n02000D82=\"Normálna\"\n02000D83=\"Maximálna\"\n02000D84=\"Rýchla\"\n02000D85=\"Najrýchlejšia\"\n02000D86=\"Ultra\"\n\n02000D90=\"Prechádzať\"\n\n02000DA1=\"Pridať a nahradiť súbory\"\n02000DA2=\"Aktualizovať a pridať súbory\"\n02000DA3=\"Aktualizovať existujúce súbory\"\n02000DA4=\"Synchronizovať súbory\"\n\n02000DB1=\"Všetky súbory\"\n\n02000DC0=\"Komprimovanie\"\n\n; Columns dialog\n02000E00=\"Stĺpce\"\n02000E01=\"Zaškrtnite stĺpce, ktoré by ste radi zviditeľnili v tomto adresári. Použite tlačítka Posunúť hore a Posunúť dole na usporiadanie stĺpcov.\"\n02000E02=\"Vybraný stĺpec by mal byť\"\n02000E03=\"pixelov &široký.\"\n\n02000E10=\"Posunúť &hore\"\n02000E11=\"Posunúť &dole\"\n02000E12=\"&Ukázať\"\n02000E13=\"&Skryť\"\n02000E14=\"Nastaviť\"\n\n02000E81=\"Titulok\"\n02000E82=\"Šírka\"\n\n; Testing\n02000F90=\"Výsledok testovania\"\n\n\n; File Manager\n\n03000000=\"7-Zip File Manager\"\n\n; Menu\n03000102=\"&Súbor\"\n03000103=\"&Upraviť\"\n03000104=\"&Zobraziť\"\n03000105=\"&Nástroje\"\n03000106=\"Ná&poveda\"\n03000107=\"&Obľúbené\"\n\n; File\n03000210=\"&Otvoriť\"\n03000211=\"O&tvoriť vnútri\"\n03000212=\"Ot&voriť externe\"\n03000220=\"&Zobraziť\"\n03000221=\"&Upraviť\"\n03000230=\"&Premenovať\"\n03000231=\"&Kopírovať do...\"\n03000232=\"P&resunúť do...\"\n03000233=\"O&dstrániť\"\n03000240=\"V&lastnosti\"\n03000241=\"Ko&mentár\"\n03000242=\"Vypočítať kontrolný súčet\"\n03000250=\"Vytvoriť adresár\"\n03000251=\"Vytvoriť súbor\"\n03000260=\"Uko&nčiť\"\n03000270=\"Ro&zdeliť súbor...\"\n03000271=\"Zlúč&iť súbory...\"\n\n; Edit\n03000310=\"&Späť\"\n03000311=\"&Znovu\"\n03000320=\"&Vystrihnúť\"\n03000321=\"&Kopírovať\"\n03000322=\"V&ložiť\"\n03000323=\"&Vymazať\"\n03000330=\"Označiť všetko\"\n03000331=\"Odznačiť všetko\"\n03000332=\"Invertovať označenie\"\n03000333=\"Označiť...\"\n03000334=\"Odznačiť...\"\n03000335=\"Označiť podľa typu\"\n03000336=\"Odznačiť podľa typu\"\n\n; View\n03000410=\"&Veľké ikony\"\n03000411=\"&Malé ikony\"\n03000412=\"&Zoznam\"\n03000413=\"&Podrobnosti\"\n03000420=\"Netriediť\"\n03000430=\"Otvoriť koreňový adresár\"\n03000431=\"O úroveň vyššie\"\n03000432=\"História adresárov...\"\n03000440=\"&Obnoviť\"\n03000449=\"Plochý pohľad\"\n03000450=\"&2 Panely\"\n03000451=\"P&anely nástrojov\"\n03000460=\"Archív\"\n03000461=\"Štandard\"\n03000462=\"Veľké ikony\"\n03000463=\"Textový popis pod ikonami\"\n\n; Tools\n03000510=\"N&astavenia\"\n03000511=\"&Skúšobný test\"\n\n; Help\n03000610=\"&Obsah nápovedy\"\n03000620=\"O p&rograme 7-Zip\"\n\n; Favorites\n03000710=\"Pridať adresár medzi Obľúbené ako\"\n03000720=\"Záložka\"\n\n; Options Dialog\n\n03010000=\"Nastavenia\"\n\n; Plugins\n03010100=\"Zásuvné moduly\"\n03010101=\"Zásuvné moduly:\"\n03010110=\"Konfigurácia\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"Editor:\"\n\n; System\n03010300=\"Systém\"\n03010302=\"Asociovať 7-Zip s vybranými typmi súborov:\"\n03010310=\"Zásuvný modul\"\n\n; Settings\n03010400=\"Nastavenia\"\n03010401=\"Ukázať \\\"..\\\" položku\"\n03010402=\"Ukázať skutočné ikony súborov\"\n03010410=\"Ukázať systémové menu\"\n03010420=\"Označiť celý riadok\"\n03010421=\"Zobraziť čiary mriežky\"\n03010430=\"Alternatívny mód výberu\"\n03010440=\"Použitie veľkých stránok pamäti\"\n\n; Strings\n\n03020201=\"Kopírovať\"\n03020202=\"Presunúť\"\n03020203=\"Kopírovať do:\"\n03020204=\"Presunúť do:\"\n03020205=\"Kopírovanie...\"\n03020206=\"Presúvanie...\"\n03020207=\"Nemôžete presunúť alebo kopírovať položky smerom do takých adresárov.\"\n03020208=\"Operácia nie je podporovaná.\"\n03020209=\"Vyberte cieľový adresár.\"\n\n03020210=\"Potvrdenie odstránenia súboru\"\n03020211=\"Potvrdenie odstránenia adresára\"\n03020212=\"Potvrdenie odstránenia viacerých položiek\"\n03020213=\"Ste si istý, že chcete odstrániť súbor '{0}'?\"\n03020214=\"Ste si istý, že chcete odstrániť adresár '{0}' a celý jeho obsah?\"\n03020215=\"Ste si istý, že chcete odstrániť týchto {0} položiek?\"\n03020216=\"Odstraňovanie...\"\n03020217=\"Chyba pri odstraňovaní súboru alebo adresáru\"\n03020218=\"Systém nemôže do koša presunúť súbor s dlhou cestou\"\n\n03020220=\"Premenovanie...\"\n03020221=\"Chyba pri premenovaní súboru alebo adresáru\"\n03020222=\"Potvrdiť kopírovanie súboru/súborov\"\n03020223=\"Ste si istý, že chcete kopírovať súbor/súbory do archívu?\"\n\n03020230=\"Vytvoriť adresár\"\n03020231=\"Meno adresáru:\"\n03020232=\"Nový adresár\"\n03020233=\"Chyba pri vytváraní adresáru\"\n\n03020240=\"Vytvoriť súbor\"\n03020241=\"Meno súboru:\"\n03020242=\"Nový súbor\"\n03020243=\"Chyba pri vytváraní súboru\"\n\n03020250=\"Označiť\"\n03020251=\"Odznačiť\"\n03020252=\"Maska:\"\n\n03020260=\"História adresárov\"\n\n03020280=\"Súbor '{0}' bol zmenený.\\nChcete ho aktualizovať v archíve?\"\n03020281=\"Nemožno aktualizovať súbor\\n'{0}'\"\n03020282=\"Nemožno spustiť editor.\"\n03020283=\"Otváranie...\"\n03020284=\"Súbor vyzerá ako vírus. (Meno súboru obsahuje veľa medzier.)\"\n\n03020290=\"Komentár\"\n03020291=\"&Komentár:\"\n\n030202A0=\"Systém\"\n\n03020300=\"Počítač\"\n03020301=\"Sieť\"\n03020302=\"Dokumenty\"\n\n03020400=\"Pridať\"\n03020401=\"Rozbaliť\"\n03020402=\"Otestovať\"\n\n03020420=\"Kopírovať\"\n03020421=\"Presunúť\"\n03020422=\"Odstrániť\"\n03020423=\"Vlastnosti\"\n\n03020500=\"Rozdeliť súbor\"\n03020501=\"&Rozdeliť do:\"\n03020510=\"Rozdeľovanie...\"\n03020520=\"Potvrďte rozdeľovanie.\"\n03020521=\"Ste si istý, že chcete rozdeliť súbor na {0} častí?\"\n03020522=\"Veľkosť časti musí byť menšia, než veľkosť pôvodného súboru.\"\n\n03020600=\"Zlúčiť súbory\"\n03020601=\"&Zlúčiť do:\"\n03020610=\"Zlučovanie...\"\n03020620=\"Vyberte len prvý súbor.\"\n03020621=\"Nie je možné detekovať súbor ako časť rozdeleného súboru.\"\n03020622=\"Nie je možné nájsť viac ako jednu časť rozdeleného súboru.\"\n\n03020710=\"Výpočet CRC...\"\n03020720=\"Informácie o CRC\"\n03020721=\"CRC pre dáta:\"\n03020722=\"CRC pre dáta a názvy:\"\n\n03020800=\"Prehľadávanie...\"\n\n03020900=\"Vlastnosti\"\n\n03020A01=\"Operácia nemôže byť volaná z adresára, ktorý má dlhú cestu.\"\n03020A02=\"Musíte si vybrať jeden súbor.\"\n03020A03=\"Musíte si vybrať jeden alebo viac súborov.\"\n03020A04=\"Súbor {0} už existuje.\"\n\n; Computer\n03031100=\"Celková veľkosť\"\n03031101=\"Voľné miesto\"\n03031102=\"Veľkosť klastra\"\n03031103=\"Menovka\"\n\n; Network\n03031200=\"Lokálny názov\"\n03031201=\"Prevádzkovateľ\"\n\n; Benchmark Dialog\n\n03080000=\"Skúšobný test\"\n03080001=\"Použitá pamäť:\"\n03080002=\"Komprimovanie\"\n03080003=\"Rozbaľovanie\"\n03080004=\"Rýchlosť\"\n03080005=\"Hodnotenie\"\n03080006=\"Celkové hodnotenie\"\n03080007=\"Aktuálne:\"\n03080008=\"Výsledné:\"\n03080009=\"Testov bez chýb:\"\n0308000A=\"Chyby:\"\n0308000B=\"Využitie CPU\"\n0308000C=\"Hodn. / Využitie\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/sl.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.55\n; First translation by tomazek\n; All further translations and edits by miles\n;\n;\n;\n\n00000000=\"Slovenian\"\n00000001=\"Slovenski\"\n00000002=\"36\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Konfiguracija 7-Zip\"\n\n; Info Page\n01000100=\"O programu 7-Zip\"\n01000103=\"7-Zip je brezplačen.  Njegov razvoj podprete s tem, da se registrirate.\"\n01000104=\"Podpora\"\n01000105=\"Registracija\"\n\n; Folders Page\n01000200=\"Mape\"\n01000210=\"&Delovna mapa\"\n01000211=\"&Sistemska začasna mapa\"\n01000212=\"&Trenutna mapa\"\n01000213=\"&Navedeno:\"\n01000214=\"Uporabi le za izmenljive pogone\"\n\n01000281=\"Navedite mesto za začasne arhivske datoteke.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"Integracija 7-Zip v kontekstni meni lupine\"\n01000302=\"Kaskadni kontekstni meni\"\n01000310=\"Izbire kontekstnega menija:\"\n\n; Language Page\n01000400=\"Jezik\"\n01000401=\"Jezik:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Ukazi 7-Zip\"\n02000103=\"Odpri arhiv\"\n02000104=\"Odpre izbrani arhiv.\"\n02000105=\"Razširi datoteke ...\"\n02000106=\"Razširi datoteke iz izbranega arhiva.\"\n02000107=\"Stisni v arhiv ...\"\n02000108=\"Stisne izbrane datoteke ali mape v arhiv.\"\n02000109=\"Preizkusi arhiv\"\n0200010A=\"Preveri integriteto izbranega arhiva.\"\n0200010B=\"Razširi semkaj\"\n0200010C=\"Razširi datoteke izbranega arhiva v trenutno mapo.\"\n0200010D=\"Razširi v {0}\"\n0200010E=\"Razširi datoteke v podmapo.\"\n0200010F=\"Dodaj v {0}\"\n02000110=\"Stisne izbrane datoteke ali mape v arhiv.\"\n02000111=\"Stisni in pošlji ...\"\n02000112=\"Stisne izbrane datoteke v arhiv in ga pošlje po elektronski pošti.\"\n02000113=\"Stisni v {0} in pošlji po e-pošti\"\n02000114=\"Stisne izbrane datoteke v arhiv in ga pošlje po elektronski pošti.\"\n\n02000140=\"<Mapa>\"\n02000141=\"<Arhiv>\"\n\n; Properties\n02000203=\"Pot\"\n02000204=\"Ime\"\n02000205=\"Pripona\"\n02000206=\"Mapa\"\n02000207=\"Velikost\"\n02000208=\"Stisnjena velikost\"\n02000209=\"Atributi\"\n0200020A=\"Izdelano\"\n0200020B=\"Uporabljeno\"\n0200020C=\"Spremenjeno\"\n0200020D=\"Trdno\"\n0200020E=\"Komentirano\"\n0200020F=\"Šifrirano\"\n02000210=\"Razdeli pred\"\n02000211=\"Razdeli po\"\n02000212=\"Slovar\"\n02000213=\"CRC\"\n02000214=\"Vrsta\"\n02000215=\"Anti\"\n02000216=\"Metoda\"\n02000217=\"Gostiteljski OS\"\n02000218=\"Datotečni sistem\"\n02000219=\"Uporabnik\"\n0200021A=\"Skupina\"\n0200021B=\"Blok\"\n0200021C=\"Opomba\"\n0200021D=\"Položaj\"\n0200021E=\"Predpona poti\"\n0200021F=\"Mape\"\n02000220=\"Datoteke\"\n02000221=\"Različica\"\n02000222=\"Nosilec\"\n02000223=\"Več nosilcev\"\n02000224=\"Zamik\"\n02000225=\"Povezave\"\n02000226=\"Bloki\"\n02000227=\"Nosilcev\"\n\n; Status bar\n02000301=\"Izbran(ih) {0} objekt(ov)\"\n02000302=\"{0} objekt(ov)\"\n\n02000320=\"Datoteke:\"\n02000321=\"Mape:\"\n02000322=\"Velikost:\"\n02000323=\"Stisnjena velikost:\"\n02000324=\"Arhivi:\"\n\n; List Context Menu\n02000401=\"&Stolpci ...\"\n\n02000411=\"&Odpri\"\n02000412=\"&Razširi ...\"\n\n; ToolBar\n02000501=\"Razširi\"\n\n; Messages\n02000601=\"Za ta arhiv operacije osveževanja niso podprte.\"\n02000602=\"Arhiva {0} ni mogoče osvežiti\"\n02000603=\"Mape '{0}' ni mogoče ustvariti\"\n02000604=\"Datoteka ni podprti arhiv.\"\n02000605=\"Napaka\"\n02000606=\"Preveč izbir\"\n02000607=\"S podano vrsto datoteke ni povezana nobena aplikacija\"\n02000608=\"Brez napak\"\n02000609=\"Datoteke '{0}' ni mogoče odpreti kot arhiv\"\n0200060A=\"Šifriranega arhiva '{0}' ni mogoče odpreti. Je morda geslo napačno?\"\n\n; Dialogs\n02000702=\"V redu\"\n02000705=\"&Da\"\n02000707=\"Da za &vse\"\n02000709=\"&Ne\"\n0200070B=\"Ne za v&se\"\n\n02000710=\"Prekliči\"\n02000711=\"P&rekliči\"\n02000713=\"&Zapri\"\n02000714=\"Zaustavi\"\n02000715=\"Ponovno zaženi\"\n\n02000720=\"Pomoč\"\n\n; Extract dialog\n02000800=\"Razširi\"\n02000801=\"R&azširi v:\"\n02000802=\"Geslo\"\n\n02000810=\"Poti\"\n02000811=\"Polne poti\"\n02000812=\"Trenutne poti\"\n02000813=\"Brez poti\"\n\n02000820=\"Prepisovalni način\"\n02000821=\"Zahtevaj potrditev\"\n02000822=\"Prepiši brez potrditve\"\n02000823=\"Preskoči obstoječe datoteke\"\n02000824=\"Samodejno preimenuj\"\n02000825=\"Samodejno preimenuj obstoječe datoteke\"\n\n02000830=\"Datoteke\"\n02000831=\"Samo &izbrane\"\n02000832=\"&Vse datoteke\"\n\n02000881=\"Določite mesto razširjanja datotek.\"\n\n02000890=\"Razširjanje\"\n\n; Overwrite dialog\n02000900=\"Potrditev zamenjave datoteke\"\n02000901=\"Ciljna mapa že vsebuje obdelovano datoteko.\"\n02000902=\"Želite zamenjati obstoječo datoteko\"\n02000903=\"s to datoteko?\"\n\n02000911=\"Samodejno &preimenuj\"\n\n02000982=\"{0} bajtov\"\n02000983=\"spremenjena\"\n\n; Messages dialog\n02000A00=\"Diagnostična sporočila\"\n\n02000A80=\"Sporočilo\"\n\n02000A91=\"Nepodprta metoda stiskanja za '{0}'.\"\n02000A92=\"Podatkovna napaka v '{0}'. Datoteka je poškodovana.\"\n02000A93=\"Napaka CRC v '{0}'. Datoteka je poškodovana.\"\n02000A94=\"Podatkovna napaka v šifrirani datoteki '{0}'. Je geslo pravilno?\"\n02000A95=\"Napaka CRC v šifrirani datoteki '{0}'. Je geslo pravilno?\"\n\n; Password dialog\n02000B00=\"Vnos gesla\"\n02000B01=\"Vnesite geslo:\"\n02000B02=\"&Pokaži geslo\"\n02000B03=\"Ponovno vnesite geslo:\"\n02000B10=\"Gesli se ne ujemata\"\n02000B11=\"Za geslo uporabite le črke, številke in posebne znake angleške abecede (!, #, $, ...)\"\n02000B12=\"Geslo je predolgo\"\n\n; Progress dialog\n02000C00=\"Obdelovanje\"\n02000C01=\"Pretečeni čas:\"\n02000C02=\"Preostali čas:\"\n02000C03=\"Velikost:\"\n02000C04=\"Hitrost:\"\n02000C05=\"Obdelano:\"\n02000C06=\"Razmerje stiskanja:\"\n\n02000C10=\"&Ozadje\"\n02000C11=\"O&spredje\"\n02000C12=\"&Začasno zaustavi\"\n02000C13=\"&Nadaljuj\"\n\n02000C20=\"Zaustavljen\"\n\n02000C30=\"Ste prepričani, da želite preklicati?\"\n\n; Compress dialog\n02000D00=\"Dodaj v arhiv\"\n02000D01=\"&Arhiv:\"\n02000D02=\"&Način osveževanja:\"\n02000D03=\"&Vrsta arhiva:\"\n02000D04=\"&Metoda stiskanja:\"\n02000D05=\"Izdelaj &trdni arhiv\"\n02000D06=\"&Parametri:\"\n02000D07=\"Možnosti\"\n02000D08=\"Izdelaj arhiv SF&X\"\n02000D09=\"Večnitnost\"\n02000D0A=\"Šifriraj &imena datotek\"\n02000D0B=\"Raven &stiskanja:\"\n02000D0C=\"&Velikost slovarja:\"\n02000D0D=\"Velikost &besede:\"\n02000D0E=\"Poraba pomnilnika za stiskanje:\"\n02000D0F=\"Poraba pomnilnika za razširjanje:\"\n02000D10=\"Šifriranje\"\n02000D11=\"Metoda šifriranja:\"\n02000D12=\"Število niti CPE:\"\n02000D13=\"Velikost trdnega bloka:\"\n02000D14=\"Ne-trdno\"\n02000D15=\"Trdno\"\n02000D16=\"Stisni skupne datoteke\"\n\n02000D40=\"Razdeli na &nosilce velikosti (v bajtih):\"\n02000D41=\"Neveljavna velikost nosilca\"\n02000D42=\"Navedena velikost nosilca: {0} bajtov.\\nSte prepričani, da želite razdeliti arhiv na takšne nosilce?\"\n\n02000D81=\"Brez stiskanja\"\n02000D82=\"Običajno\"\n02000D83=\"Največje stiskanje\"\n02000D84=\"Hitro\"\n02000D85=\"Najhitrejše\"\n02000D86=\"Ultra\"\n\n02000D90=\"Prebrskaj\"\n\n02000DA1=\"Dodaj in zamenjaj datoteke\"\n02000DA2=\"Osveži in dodaj datoteke\"\n02000DA3=\"Osveži obstoječe datoteke\"\n02000DA4=\"Sinhroniziraj datoteke\"\n\n02000DB1=\"Vse datoteke\"\n\n02000DC0=\"Stiskanje\"\n\n; Columns dialog\n02000E00=\"Stolpci\"\n02000E01=\"Preverite stolpce, ki bi jih radi naredili vidne v tej mapi. Za preureditev njihovega vrstnega reda uporabite gumba Premakni gor in Premakni dol.\"\n02000E02=\"Izbrani stolpec naj bo širok\"\n02000E03=\"&slikovnih točk.\"\n\n02000E10=\"Premakni &gor\"\n02000E11=\"Premakni &dol\"\n02000E12=\"&Prikaži\"\n02000E13=\"&Skrij\"\n02000E14=\"Nastavi\"\n\n02000E81=\"Naslov\"\n02000E82=\"Širina\"\n\n; Testing\n02000F90=\"Preizkušanje\"\n\n\n; File Manager\n\n03000000=\"Upravitelj datotek 7-Zip\"\n\n; Menu\n03000102=\"&Datoteka\"\n03000103=\"&Urejanje\"\n03000104=\"&Pogled\"\n03000105=\"O&rodja\"\n03000106=\"Po&moč\"\n03000107=\"Pr&iljubljene\"\n\n; File\n03000210=\"&Odpri\"\n03000211=\"Odpri &znotraj\"\n03000212=\"Odpri zu&naj\"\n03000220=\"P&rikaz\"\n03000221=\"&Urejanje\"\n03000230=\"Prei&menuj\"\n03000231=\"&Kopiraj ...\"\n03000232=\"&Premakni ...\"\n03000233=\"Iz&briši\"\n03000240=\"L&astnosti\"\n03000241=\"Opomb&e\"\n03000242=\"Izračunaj preskusno vsoto\"\n03000250=\"Ustvari mapo\"\n03000251=\"Ustvari datoteko\"\n03000260=\"&Izhod\"\n03000270=\"&Razdeli datoteko ...\"\n03000271=\"&Združi datoteke ...\"\n\n; Edit\n03000310=\"Ra&zveljavi\"\n03000311=\"P&onovi\"\n03000320=\"&Izreži\"\n03000321=\"&Kopiraj\"\n03000322=\"Prile&pi\"\n03000323=\"Iz&briši\"\n03000330=\"Izberi &vse\"\n03000331=\"Razveljavi izbiro vseh\"\n03000332=\"&Preobrni izbor\"\n03000333=\"Izberi ...\"\n03000334=\"Razveljavi izbiro ...\"\n03000335=\"Izberi glede na vrsto\"\n03000336=\"Razveljavi izbiro glede na vrsto\"\n\n; View\n03000410=\"&Velike ikone\"\n03000411=\"&Majhne ikone\"\n03000412=\"&Seznam\"\n03000413=\"&Podrobnosti\"\n03000420=\"Nerazvrščeno\"\n03000430=\"Odpri korensko mapo\"\n03000431=\"Nadrejena raven\"\n03000432=\"Zgodovina mape ...\"\n03000440=\"&Osveži\"\n03000449=\"Splošen pogled\"\n03000450=\"&Dve podokni\"\n03000451=\"&Orodne vrstice\"\n03000460=\"Orodna vrstica arhiva\"\n03000461=\"Navadna orodna vrstica\"\n03000462=\"Veliki gumbi\"\n03000463=\"Pokaži besedilo gumbov\"\n\n; Tools\n03000510=\"&Možnosti ...\"\n03000511=\"Me&ritev\"\n\n; Help\n03000610=\"&Vsebina pomoči ...\"\n03000620=\"&O programu 7-Zip ...\"\n\n; Favorites\n03000710=\"&Dodaj mapo med Priljubljene kot\"\n03000720=\"Zaznamek\"\n\n; Options Dialog\n\n03010000=\"Možnosti\"\n\n; Plugins\n03010100=\"Dodatki\"\n03010101=\"&Dodatki:\"\n03010110=\"Možnosti ...\"\n\n; Edit\n03010200=\"Urejevalnik\"\n03010201=\"&Urejevalnik:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"Poveži 7-Zip z:\"\n03010310=\"Dodatek\"\n\n; Settings\n03010400=\"Nastavitve\"\n03010401=\"Pokaži postavko \\\"..\\\"\"\n03010402=\"Pokaži prave ikone datotek\"\n03010410=\"Pokaži sistemski meni\"\n03010420=\"&Izbor celotne vrstice\"\n03010421=\"Pokaži &mrežne črte\"\n03010430=\"&Alternativni način izbiranja\"\n03010440=\"Uporabi &velike spominske strani\"\n\n; Strings\n\n03020201=\"Kopiraj\"\n03020202=\"Premakni\"\n03020203=\"Kopiraj v:\"\n03020204=\"Premakni v:\"\n03020205=\"Kopiranje ...\"\n03020206=\"Premikanje ...\"\n03020207=\"Ne morete premakniti ali prekopirati elementov take mape.\"\n03020208=\"Operacija ni podprta.\"\n03020209=\"Izberite ciljno mapo.\"\n\n03020210=\"Potrditev brisanja datoteke\"\n03020211=\"Potrditev brisanja mape\"\n03020212=\"Potrditev brisanja več datotek\"\n03020213=\"Ste prepričani, da želite zbrisati '{0}'?\"\n03020214=\"Ste prepričani, da želite zbrisati mapo '{0}' in celotno njeno vsebino?\"\n03020215=\"Ste prepričani, da želite zbrisati teh {0} postavk?\"\n03020216=\"Brisanje ...\"\n03020217=\"Napaka pri brisanju datoteke ali mape\"\n\n03020220=\"Preimenovanje ...\"\n03020221=\"Napaka pri preimenovanju datoteke ali mape\"\n03020222=\"Potrditev kopiranja datoteke\"\n03020223=\"Ste prepričani, da želite kopirati datoteke v arhiv?\"\n\n03020230=\"Izdelava mape\"\n03020231=\"Ime mape:\"\n03020232=\"Nova mapa\"\n03020233=\"Napaka pri ustvarjanju mape\"\n\n03020240=\"Ustvarjanje datoteke\"\n03020241=\"Ime datoteke:\"\n03020242=\"Nova datoteka\"\n03020243=\"Napaka pri ustvarjanju datoteke\"\n\n03020250=\"Izberi\"\n03020251=\"Razveljavi izbiro\"\n03020252=\"Maska:\"\n\n03020260=\"Zgodovina map\"\n\n03020280=\"Datoteka '{0}' je bila spremenjena.\\nJo želite osvežiti v arhivu?\"\n03020281=\"Datoteke ni mogoče osvežiti\\n'{0}'\"\n03020282=\"Urejevalnika ni mogoče pognati.\"\n03020283=\"Odpiranje ...\"\n\n03020290=\"Opomba\"\n03020291=\"&Opomba:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"Računalnik\"\n03020301=\"Omrežje\"\n\n03020400=\"Dodaj\"\n03020401=\"Razširi\"\n03020402=\"Preizkusi\"\n\n03020420=\"Kopiraj\"\n03020421=\"Premakni\"\n03020422=\"Izbriši\"\n03020423=\"Informacije\"\n\n03020500=\"Razdeli datoteko\"\n03020501=\"&Razdeli na:\"\n03020510=\"Razdeljevanje ...\"\n03020520=\"Potrditev razdelitve\"\n03020521=\"Ste prepričani, da želite razdeliti datoteko na {0} nosilcev?\"\n03020522=\"Velikost nosilca mora biti manjša kot velikost izvorne datoteke\"\n\n03020600=\"Združi datoteke\"\n03020601=\"&Združi v:\"\n03020610=\"Združevanje  ...\"\n03020620=\"Izberite samo prvo datoteko\"\n\n03020710=\"Izračun preskusne vsote ...\"\n03020720=\"Podatki o preskusni vsoti\"\n03020721=\"Preskusna vsota za podatke:\"\n03020722=\"Preskusna vsota za podatke in imena:\"\n\n03020800=\"Pregledovanje ...\"\n\n03020900=\"Properties\"\n\n; Computer\n03031100=\"Skupna velikost\"\n03031101=\"Prostega prostora\"\n03031102=\"Velikost gruče\"\n03031103=\"Oznaka\"\n\n; Network\n03031200=\"Krajevno ime\"\n03031201=\"Ponudnik\"\n\n; Benchmark Dialog\n\n03080000=\"Meritev\"\n03080001=\"Poraba pomnilnika:\"\n03080002=\"Stiskanje\"\n03080003=\"Razširjanje\"\n03080004=\"Hitrost\"\n03080005=\"Ocena\"\n03080006=\"Skupna ocena\"\n03080007=\"Trenutno\"\n03080008=\"Končno\"\n03080009=\"Prehodi:\"\n0308000A=\"Napake:\"\n0308000B=\"Uporaba CPE\"\n0308000C=\"Ocena / uporaba\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/sq.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.37\n; Translated by Mikel Hasko\n;\n;\n;\n;\n\n00000000=\"Albanian\"\n00000001=\"Shqip\"\n00000002=\"28\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Konfigurimi i 7-Zip\"\n\n; Info Page\n01000100=\"Për 7-Zip\"\n01000103=\"7-Zip është softuer falas. Megjithatë, ju mund të përkrahni në zhvillimin e 7-Zip duke e regjistruar atë.\"\n01000104=\"Përkrahja\"\n01000105=\"Regjistrimi\"\n\n; Folders Page\n01000200=\"Dosje\"\n01000210=\"&Dosja e punës\"\n01000211=\"Dosja e përkohshme e &sistemit\"\n01000212=\"Dosja &aktuale\"\n01000213=\"I sp&ecifikuar:\"\n01000214=\"Përdor vetëm për njësi të largueshme\"\n\n01000281=\"Specifikoni një vendndodhje për skedarët e përkohshëm të arkivit.\"\n\n; System Page\n01000300=\"Sistemi\"\n01000301=\"Integro 7-Zip në kontekst meny\"\n01000302=\"Kaskado kontekst menynë\"\n01000310=\"Elementë të kontekst menysë:\"\n\n; Language Page\n01000400=\"Gjuha\"\n01000401=\"Gjuha:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Komanda të 7-Zip\"\n02000103=\"Hap arkivin\"\n02000104=\"Hap arkivin e selektuar.\"\n02000105=\"Zbërthe skedarët...\"\n02000106=\"Zbërthen skedarët na arkivi i selektuar.\"\n02000107=\"Shto në arkiv...\"\n02000108=\"Shton artikujt e zgjedhur në arkiv.\"\n02000109=\"Testo arkivin\"\n0200010A=\"Teston integritetin e arkivit të selektuar.\"\n0200010B=\"Zbërthe këtu\"\n0200010C=\"Zbërthen skedarët nga arkivi i zgjedhur në dosjen aktuale.\"\n0200010D=\"Zbërthe në {0}\"\n0200010E=\"Zbërthen skedarët tek nëndosja.\"\n0200010F=\"Shto tek {0}\"\n02000110=\"Shton artikujt e zgjedhur në arkiv.\"\n02000111=\"Kompreso dhe dërgo me e-mail...\"\n02000112=\"Kompreson artikujt e zgjedhur në arkiv dhe e dërgon këtë të fundit me e-mail.\"\n02000113=\"Kompreso në {0} dhe dërgo me e-mail\"\n02000114=\"Kompreson artikujt e zgjedhur në arkiv dhe e dërgon këtë të fundit me e-mail.\"\n\n02000140=\"<Dosja>\"\n02000141=\"<Arkivi>\"\n\n; Properties\n02000203=\"Shtegu\"\n02000204=\"Emri\"\n02000205=\"Prapashtesa\"\n02000206=\"Dosja\"\n02000207=\"Madhësia\"\n02000208=\"Madhësia e mbërthimit\"\n02000209=\"Atributet\"\n0200020A=\"Krijuar më\"\n0200020B=\"Hyrë së fundi më\"\n0200020C=\"Modifikuar më\"\n0200020D=\"I qëndrueshëm\"\n0200020E=\"I komentuar\"\n0200020F=\"I shifruar\"\n02000210=\"Ndaj para\"\n02000211=\"Ndaj pas\"\n02000212=\"Fjalori\"\n02000213=\"CRC\"\n02000214=\"Tipi\"\n02000215=\"Anti\"\n02000216=\"Metoda\"\n02000217=\"Pronari i sistemit\"\n02000218=\"Sistemi i skedarit\"\n02000219=\"Përdoruesi\"\n0200021A=\"Grupi\"\n0200021B=\"Blloku\"\n0200021C=\"Komenti\"\n0200021D=\"Pozicioni\"\n0200021E=\"Prefiksi i shtegut\"\n\n; Status bar\n02000301=\"Selektuar {0} objekt(e)\"\n02000302=\"{0} objekt(e)\"\n\n02000320=\"Skedarë:\"\n02000321=\"Dosje:\"\n02000322=\"Madhësia:\"\n\n; List Context Menu\n02000401=\"&Kolona...\"\n\n02000411=\"&Hap\"\n02000412=\"&Zbërthe...\"\n\n; ToolBar\n02000501=\"Zbërthe\"\n\n; Messages\n02000601=\"Operacionet e azhurnimit për këtë arkiv s'përkrahen.\"\n02000602=\"S'mund të azhurnojë arkivin {0}\"\n02000603=\"S'mund të krijojë dosjen '{0}'\"\n02000604=\"Skedari është një arkiv i papërkrahur.\"\n02000605=\"Gabim\"\n02000606=\"Tepër shumë artikuj\"\n02000607=\"S'ka aplikim të lidhur me prapashtesën e dhënë të emrit të skedarit\"\n02000608=\"S'ka gabime\"\n\n; Dialogs\n02000702=\"Në rregull\"\n02000705=\"&Po\"\n02000707=\"Po për të gjith&a\"\n02000709=\"&Jo\"\n0200070B=\"Jo për të gjit&ha\"\n\n02000710=\"Anulim\"\n02000711=\"&Anulim\"\n02000713=\"&Mbyll\"\n02000714=\"Ndalo\"\n02000715=\"Rinis\"\n\n02000720=\"Ndihmë\"\n\n; Extract dialog\n02000800=\"Zbërthe\"\n02000801=\"Z&bërthe në:\"\n02000802=\"Fjalëkalimi\"\n\n02000810=\"Mënyra e Shtegut\"\n02000811=\"Emra të plotë Shtigjesh\"\n02000812=\"Emrat aktualë të Shtigjeve\"\n02000813=\"Pa emra shtigjesh\"\n\n02000820=\"Mënyra e mbishkrimit\"\n02000821=\"Pyet para se të mbishkruaj\"\n02000822=\"Mbishkruaj pa nxitje\"\n02000823=\"Mbikalo skedarët ekzistues\"\n02000824=\"Riemërto automatikisht\"\n02000825=\"Riemërto auto. skedarët ekzistues\"\n\n02000830=\"Skedarët\"\n02000831=\"Skedarët e &selektuar\"\n02000832=\"&Të gjithë skedarët\"\n\n02000881=\"Specifikoni një vendndodhje për skedarët e zbërthyer.\"\n\n02000890=\"Duke zbërthyer\"\n\n; Overwrite dialog\n02000900=\"Konfirmo zëvendësimin e skedarëve\"\n02000901=\"Dosja e destinacionit e përmban një herë skedarin e përpunuar.\"\n02000902=\"Dëshironi ta zëvendësoni skedarin ekzistues\"\n02000903=\"me këtë?\"\n\n02000911=\"R&iemërtim automatik\"\n\n02000982=\"{0} bajt\"\n02000983=\"modifikuar më\"\n\n; Messages dialog\n02000A00=\"Mesazhe diagnostikues\"\n\n02000A80=\"Mesazhi\"\n\n02000A91=\"Metodë e papërkrahshme kompresimi për '{0}'.\"\n02000A92=\"Gabim të dhënash në '{0}'. Skedari është i prishur.\"\n02000A93=\"CRC dështoi '{0}'. Skedari është i prishur.\"\n\n; Password dialog\n02000B00=\"Fusni fjalëkalimin\"\n02000B01=\"Fusni fjalëkalimin:\"\n02000B02=\"&Trego fjalëkalimin\"\n\n; Progress dialog\n02000C00=\"Procesi\"\n02000C01=\"Koha e kaluar:\"\n02000C02=\"Koha e mbetur:\"\n02000C03=\"Madhësia:\"\n02000C04=\"Shpejtësia:\"\n\n02000C10=\"Në &sfond\"\n02000C11=\"Në pla&n të parë\"\n02000C12=\"&Pushim\"\n02000C13=\"&Vazhdim\"\n\n02000C20=\"Në pushim\"\n\n02000C30=\"Jeni të sigurt se dëshironi ta anuloni?\"\n\n; Compress dialog\n02000D00=\"Shto në arkiv\"\n02000D01=\"&Arkivi:\"\n02000D02=\"&Mënyra e azhurnimit:\"\n02000D03=\"&Formati i arkivit:\"\n02000D04=\"Metoda e kompr&esimit:\"\n02000D05=\"&Krijo një arkiv të qëndrueshëm\"\n02000D06=\"&Parametrat:\"\n02000D07=\"Opsionet\"\n02000D08=\"Krijo një arkiv SF&X\"\n02000D09=\"Multifillesë\"\n02000D0A=\"Shifro em&rat e skedarëve\"\n02000D0B=\"&Niveli i kompresimit:\"\n02000D0C=\"Ma&dhësia e fjalorit:\"\n02000D0D=\"Mad&hësia e fjalës:\"\n02000D0E=\"Shfrytëzimi i memo. për kompresimin:\"\n02000D0F=\"Shfrytëzimi i memo. për dekompresimin:\"\n\n02000D40=\"Ndaj në &volume (madhësia jepet në bajt):\"\n\n02000D81=\"Ruaj\"\n02000D82=\"Normal\"\n02000D83=\"Maksimal\"\n02000D84=\"I shpejtë\"\n02000D85=\"Më i shpejtë\"\n02000D86=\"Ultra\"\n\n02000D90=\"Shfleto\"\n\n02000DA1=\"Shto dhe zëvendëso skedarët\"\n02000DA2=\"Azhurno dhe shto skedarët\"\n02000DA3=\"Azhurno skedarët ekzistues\"\n02000DA4=\"Sinkronizo skedarët\"\n\n02000DB1=\"Të gjithë skedarët\"\n\n02000DC0=\"Duke kompresuar\"\n\n; Columns dialog\n02000E00=\"Kolonat\"\n02000E01=\"Verifikoni kolonat që dëshironi të jenë të dukshme në këtë dosje. Përdorni tastet \\\"Lëviz lartë\\\" & \\\"Lëviz poshtë\\\" për të rirenditur kolonat.\"\n02000E02=\"Kolonat e zgjedhura duhet të jenë\"\n02000E03=\"piksel &të gjera.\"\n\n02000E10=\"Lëviz &lartë\"\n02000E11=\"Lëviz p&oshtë\"\n02000E12=\"&Shfaq\"\n02000E13=\"&Fshih\"\n02000E14=\"Cakto\"\n\n02000E81=\"Titulli\"\n02000E82=\"Gjerësia\"\n\n; Testing\n02000F90=\"Duke testuar\"\n\n\n; File Manager\n\n03000000=\"Menaxheri i skedarëve 7-Zip\"\n\n; Menu\n03000102=\"&Skedari\"\n03000103=\"&Redaktimi\"\n03000104=\"&Pamja\"\n03000105=\"&Veglat\"\n03000106=\"&Ndihma\"\n03000107=\"&Të parapëlqyerit\"\n\n; File\n03000210=\"&Hap\"\n03000211=\"Hap përbre&nda\"\n03000212=\"Hap përjas&hta\"\n03000220=\"&Pamja\"\n03000221=\"&Redakto\"\n03000230=\"Ri&emërto\"\n03000231=\"&Kopjo tek...\"\n03000232=\"&Zhvendos tek...\"\n03000233=\"&Fshi\"\n03000240=\"&Vetitë\"\n03000241=\"Ko&menti\"\n03000242=\"Llogarit shumën e verifikimit\"\n03000250=\"Krijo një dosje\"\n03000251=\"Krijo një skedar\"\n03000260=\"&Dil\"\n03000270=\"N&daj skedarin...\"\n03000271=\"Kom&bino skedarët...\"\n\n; Edit\n03000310=\"&Zhbëj\"\n03000311=\"&Ribëj\"\n03000320=\"&Prit\"\n03000321=\"&Kopjo\"\n03000322=\"&Ngjit\"\n03000323=\"&Fshi\"\n03000330=\"S&elekto të gjithë\"\n03000331=\"Çse&lekto të gjithë\"\n03000332=\"Anasill selekti&min\"\n03000333=\"Selekto...\"\n03000334=\"Çselekto...\"\n03000335=\"Selekto sipas tipit\"\n03000336=\"Çselekto sipas tipit\"\n\n; View\n03000410=\"Ikona të &mëdha\"\n03000411=\"Ikona të &vogla\"\n03000412=\"&Listë\"\n03000413=\"&Detaje\"\n03000420=\"&Të parenditur\"\n03000430=\"Hap dosjen rrënjë\"\n03000431=\"Një nivel më lartë\"\n03000432=\"Historiku i dosjes...\"\n03000440=\"&Rifresko\"\n03000449=\"Pamje e rrafshtë\"\n03000450=\"&2 panele\"\n03000451=\"&Shiritat e veglave\"\n03000460=\"Shiriti i veglave i arkivit\"\n03000461=\"Shiriti standard i veglave\"\n03000462=\"Butona të mëdhenj\"\n03000463=\"Shfaq tekstin e butonave\"\n\n; Tools\n03000510=\"&Opsionet...\"\n03000511=\"&Etapa\"\n\n; Help\n03000610=\"&Përmbajtjet...\"\n03000620=\"&Për 7-Zip...\"\n\n; Favorites\n03000710=\"&Shto dosjen tek të parapëlqyerit si\"\n03000720=\"Shënuesi\"\n\n; Options Dialog\n\n03010000=\"Opsionet\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Opsionet...\"\n\n; Edit\n03010200=\"Redaktuesi\"\n03010201=\"&Redaktuesi:\"\n\n; System\n03010300=\"Sistemi\"\n03010302=\"Lidh 7-Zip me:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Rregullimet\"\n03010401=\"Shfaq &artikullin \\\"..\\\"\"\n03010402=\"Shfaq &ikonat e vërteta të skedarëve\"\n03010410=\"Shfaq &menynë e sistemit\"\n03010420=\"Selekto të tërë &rreshtin\"\n03010421=\"Shfaq &vijat e rrjetit\"\n03010430=\"Mënyrë alternative &selektimi\"\n03010440=\"Përdor &faqe të mëdha të memories\"\n\n; Strings\n\n03020201=\"Kopjo\"\n03020202=\"Zhvendos\"\n03020203=\"Kopjo tek:\"\n03020204=\"Zhvendos tek:\"\n03020205=\"Duke kopjuar...\"\n03020206=\"Duke zhvendosur...\"\n03020207=\"Ju s'mund të zhvendosni ose kopjoni artikuj për dosje të atilla.\"\n03020208=\"Operacioni s'përkrahet.\"\n\n03020210=\"Konfirmo fshirjen e skedarit\"\n03020211=\"Konfirmo fshirjen e dosjes\"\n03020212=\"Konfirmo fshirjen e shumëfishtë të skedarëve\"\n03020213=\"Jeni të sigurt që doni të fshini '{0}'?\"\n03020214=\"Jeni të sigurt që doni të fshini dosjen '{0}' dhe tërë përmbajtjen e saj?\"\n03020215=\"Jeni të sigurt që doni t'i fshini këto {0} artikuj?\"\n03020216=\"Duke fshirë...\"\n03020217=\"Gabim gjatë fshirjes së skedarit apo dosjes\"\n\n03020220=\"Duke riemërtuar...\"\n03020221=\"Gabim gjatë riemërtimit të skedarit apo dosjes\"\n03020222=\"Konfirmim për kopjimin e skedarëve\"\n03020223=\"Jeni të sigurt që doni të kopjoni skedarë në arkiv\"\n\n03020230=\"Krijo një dosje\"\n03020231=\"Emri i dosjes:\"\n03020232=\"Dosje e re\"\n03020233=\"Gabim gjatë krijimit të dosjes\"\n\n03020240=\"Krijo një skedar\"\n03020241=\"Emri i skedarit:\"\n03020242=\"Skedar i ri\"\n03020243=\"Gabim gjatë krijimit të skedarit\"\n\n03020250=\"Selekto\"\n03020251=\"Çselekto\"\n03020252=\"Maska:\"\n\n03020260=\"Historiku i dosjes\"\n\n03020280=\"Skedari '{0}' u modifikua.\\nDoni ta azhurnoni atë edhe në arkiv?\"\n03020281=\"S'mund të azhurnojë skedarin\\n'{0}'\"\n03020282=\"S'mund të hap redaktuesin.\"\n03020283=\"Duke hapur...\"\n\n03020290=\"Komenti\"\n03020291=\"&Komenti:\"\n\n030202A0=\"Sistemi\"\n\n03020300=\"Kompjuteri\"\n03020301=\"Rrejti\"\n\n03020400=\"Shto\"\n03020401=\"Zbërthe\"\n03020402=\"Testo\"\n\n03020420=\"Kopjo\"\n03020421=\"Zhvendos\"\n03020422=\"Fshi\"\n03020423=\"Info\"\n\n03020500=\"Ndaj skedarin\"\n03020501=\"&Ndaj në:\"\n03020510=\"Duke ndarë...\"\n\n03020600=\"Kombino skedarët\"\n03020601=\"&Kombino në:\"\n03020610=\"Duke kombinuar...\"\n\n03020710=\"Duke llogaritur shumën e verifikimit...\"\n03020720=\"Informacionet e shumës së verifikimit\"\n03020721=\"Shuma e verifikimit CRC për të dhënat:\"\n03020722=\"Shuma e verifikimit CRC për të dhënat dhe emrat:\"\n\n03020800=\"Duke skanuar...\"\n\n; Computer\n03031100=\"Madhësia totale\"\n03031101=\"Hapësira e lirë\"\n03031102=\"Madhësia e cluster-it\"\n03031103=\"Etiketa\"\n\n; Network\n03031200=\"Emri lokal\"\n03031201=\"Kujdestari\"\n\n; Benchmark Dialog\n\n03080000=\"Etapa\"\n03080001=\"Shfrytëzimi i memories:\"\n03080002=\"Kompresimi\"\n03080003=\"Dekompresimi\"\n03080004=\"Shpejtësia\"\n03080005=\"Vlerësimi\"\n03080006=\"Vlerësimi total\"\n03080007=\"Aktualisht\"\n03080008=\"Rezultati\"\n03080009=\"Kalime:\"\n0308000A=\"Gabime:\"\n\n;!@LangEnd@!"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/sr-spc.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.30\n; Translated by Lazar\n\n00000000=\"Serbian - Cyrilic\"\n00000001=\"Српски - ћирилица\"\n00000002=\"26-3\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Подешавање 7-Zip-a\"\n\n; Info Page\n01000100=\"О програму\"\n01000103=\"7-Zip је бесплатан програм. Но, ако Вам се 7-Zip допадне и пожелите да подржите даљи развој програма, молимо Вас региструјте се тако што ћете приложити донацију од 20$. То можете урадити кредитном картицом или неким другим начином плаћања.\"\n01000104=\"Подршка\"\n01000105=\"Регистрација\"\n\n; Folders Page\n01000200=\"Фасцикле\"\n01000210=\"Радна фасцикла\"\n01000211=\"Користи Windows-ову привремену фасциклу\"\n01000212=\"Тренутна\"\n01000213=\"Наведена:\"\n01000214=\"Користи само за измењиве медије\"\n\n01000281=\"Наведите локацију за смештање привремених датотека.\"\n\n; System Page\n01000300=\"Систем\"\n01000301=\"Убаци 7-Zip у системски мени\"\n01000302=\"Каскадни системски мени\"\n01000310=\"Ставке системског менија:\"\n\n; Language Page\n01000400=\"Језик\"\n01000401=\"Језик:\"\n\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip команде\"\n02000103=\"Отвори архиву\"\n02000104=\"Отвори изабрану архиву.\"\n02000105=\"Издвој датотеке...\"\n02000106=\"Издвој датотеке из изабране архиве.\"\n02000107=\"Додај у архиву...\"\n02000108=\"Додај изабране ставке у архиву.\"\n02000109=\"Тестирај архиву\"\n0200010A=\"Тестирај интегритет изабране архиве.\"\n0200010B=\"Издвој овде\"\n0200010C=\"Издвој датотеке из изабране архиве у тренутну фасциклу.\"\n0200010D=\"Издвој у {0}\"\n0200010E=\"Издвој датотеке у подфасциклу.\"\n0200010F=\"Додај у {0}\"\n02000110=\"Додај изабране датотеке у архиву.\"\n02000111=\"Додај и направи e-mail...\"\n02000112=\"Додај обележене датотеке и направи e-mail.\"\n02000113=\"Додај у {0} и направи e-mail\"\n02000114=\"Додај обележене датотеке и направи e-mail.\"\n\n02000140=\"<Folder>\"\n02000141=\"<Archive>\"\n\n; Properties\n02000203=\"Путања\"\n02000204=\"Назив\"\n02000205=\"Тип\"\n02000206=\"Фасцикла\"\n02000207=\"Величина\"\n02000208=\"Величина у запакованом стању\"\n02000209=\"Атрибути\"\n0200020A=\"Креирана\"\n0200020B=\"Приступано\"\n0200020C=\"Промењено\"\n0200020D=\"Solid\"\n0200020E=\"Коментар\"\n0200020F=\"Шифровано\"\n02000210=\"Подели пре\"\n02000211=\"Подели после\"\n02000212=\"Dictionary\"\n02000213=\"CRC\"\n02000214=\"Тип\"\n02000215=\"Анти\"\n02000216=\"Метод\"\n02000217=\"Оперативни систем\"\n02000218=\"Систем датотека\"\n02000219=\"Корисник\"\n0200021A=\"Група\"\n0200021B=\"Блок\"\n0200021C=\"Коментар\"\n0200021D=\"Положај\"\n\n; Status bar\n02000301=\"{0} објекат(а) изабрано\"\n02000302=\"{0} објекат(а)\"\n\n; List Context Menu\n02000401=\"Колона...\"\n\n02000411=\"Отвори\"\n02000412=\"Издвој...\"\n\n; ToolBar\n02000501=\"Издвој\"\n\n; Messages\n02000601=\"Операција освежавања није дозвољена за ову архиву.\"\n02000602=\"Не могу да освежим архиву {0}\"\n02000603=\"Не могу да креирам Фасциклу '{0}'\"\n02000604=\"Датотека није једна од подржаних архива.\"\n02000605=\"Грешка\"\n02000606=\"Исувише ставки\"\n02000607=\"Ни једна апликација није додељена наведеној екстензији\"\n02000608=\"Није било никаквих грешака\"\n\n; Dialogs\n02000702=\"У реду\"\n02000705=\"Да\"\n02000707=\"Да за све\"\n02000709=\"Не\"\n0200070B=\"Не за све\"\n\n02000710=\"Откажи\"\n02000711=\"Откажи\"\n02000713=\"Затвори\"\n02000714=\"Стани\"\n02000715=\"Поново\"\n\n02000720=\"Помоћ\"\n\n; Extract dialog\n02000800=\"Издвој\"\n02000801=\"Издвој у:\"\n02000802=\"Шифра\"\n\n02000810=\"Путање\"\n02000811=\"Пуна путања\"\n02000812=\"Тренутне путање\"\n02000813=\"Без путање\"\n\n02000820=\"Замена\"\n02000821=\"Питај пре него што замениш\"\n02000822=\"Замени без запиткивања\"\n02000823=\"Прескочи постојеће датотеке\"\n02000824=\"Аутоматска промена назива\"\n02000825=\"Аутоматска промена назива постојећих датотека\"\n\n02000830=\"Датотеке\"\n02000831=\"Изабрани датотеке\"\n02000832=\"Све датотеке\"\n\n02000881=\"Наведи локацију где ће се издвајати датотеке из архива.\"\n\n02000890=\"Издвајање\"\n\n; Overwrite dialog\n02000900=\"Потврди замену датотеке\"\n02000901=\"Циљна фасцикла већ садржи датотеку која се тренутно обрађује.\"\n02000902=\"Да ли желите да замените постојећу датотеку\"\n02000903=\"са овом?\"\n\n02000911=\"Аутоматска промена назива\"\n\n02000982=\"{0} бајтова\"\n02000983=\"модификовано\"\n\n; Messages dialog\n02000A00=\"Дијагностичке поруке\"\n\n02000A80=\"Поруке\"\n\n02000A91=\"Неподржани метод компресије за '{0}'.\"\n02000A92=\"Грешка у '{0}'. Датотека је неисправана.\"\n02000A93=\"CRC грешка у '{0}'. Датотека је неисправана.\"\n\n; Password dialog\n02000B00=\"Унесите лозинку\"\n02000B01=\"Унесите лозинку:\"\n02000B02=\"Прикажи лозинку\"\n\n; Progress dialog\n02000C00=\"Обрађујем\"\n02000C01=\"Протекло време:\"\n02000C02=\"Преостало време:\"\n02000C03=\"Величина:\"\n02000C04=\"Брзина:\"\n\n02000C10=\"Позадина\"\n02000C11=\"На врху\"\n02000C12=\"Пауза\"\n02000C13=\"Настави\"\n\n02000C20=\"Пауза\"\n\n02000C30=\"Да ли сте сигурни да желите да прекинете?\"\n\n; Compress dialog\n02000D00=\"Додај у архиву\"\n02000D01=\"Архива:\"\n02000D02=\"Надоградња архива:\"\n02000D03=\"Формат архиве:\"\n02000D04=\"Тип компресије:\"\n02000D05=\"Креирај Solid архиву\"\n02000D06=\"Параметри:\"\n02000D07=\"Опције\"\n02000D08=\"Креирај SFX архиву\"\n02000D09=\"Више нити\"\n02000D0A=\"Шифруј називе датотека\"\n02000D0B=\"Ниво компресије:\"\n02000D0C=\"Dictionary size:\"\n02000D0D=\"Word size:\"\n02000D0E=\"Потребна меморија - компресија:\"\n02000D0F=\"Потребна меморија - декомпресија:\"\n\n02000D40=\"Подели на делове, бајти:\"\n\n02000D81=\"Без компресије\"\n02000D82=\"Нормално\"\n02000D83=\"Максимално\"\n02000D84=\"Брзо\"\n02000D85=\"Брже\"\n02000D86=\"Најбрже\"\n\n02000D90=\"Прегледај\"\n\n02000DA1=\"Додај и замени датотеке\"\n02000DA2=\"Освежи и додај датотеке\"\n02000DA3=\"Озвежи постојеће датотеке\"\n02000DA4=\"Синхронизуј датотеке\"\n\n02000DB1=\"Све датотеке\"\n\n02000DC0=\"Додајем\"\n\n; Columns dialog\n02000E00=\"Колоне\"\n02000E01=\"Обележите колоне које бисте желели да буду видљиве у овом прегледу. Користите PageUp и PageDown тастере како бисте преуредили колоне по сопственом избору.\"\n02000E02=\"Изабране колоне би требале бити\"\n02000E03=\"тачака широке.\"\n\n02000E10=\"Помери горе\"\n02000E11=\"Помери доле\"\n02000E12=\"Прикажи\"\n02000E13=\"Сакриј\"\n02000E14=\"Постави\"\n\n02000E81=\"Наслов\"\n02000E82=\"Ширина\"\n\n; Testing\n02000F90=\"Тестирање\"\n\n; File Manager\n\n03000000=\"7-Zip\"\n\n; Menu\n03000102=\"Датотека\"\n03000103=\"Уређивање\"\n03000104=\"Преглед\"\n03000105=\"Алати\"\n03000106=\"Помоћ\"\n03000107=\"Омиљено\"\n\n; File\n03000210=\"Погледај\"\n03000211=\"Отвори са 7-Zip-ом\"\n03000212=\"Отвори са придруженом програмом\"\n03000220=\"Прегледај\"\n03000221=\"Промени\"\n03000230=\"Преименуј\"\n03000231=\"Копирај у...\"\n03000232=\"Премести у...\"\n03000233=\"Обриши\"\n03000240=\"Својства\"\n03000241=\"Коментар\"\n03000250=\"Нова фасцикла\"\n03000251=\"Нова датотека\"\n03000260=\"Излаз\"\n03000270=\"Подели фајл...\"\n03000271=\"Спој делове...\"\n\n\n; Edit\n03000310=\"Опозови\"\n03000311=\"Понови\"\n03000320=\"Исеци\"\n03000321=\"Копирај\"\n03000322=\"Налепи\"\n03000323=\"Избриши\"\n03000330=\"Изабери све\"\n03000331=\"Поништи избор свега\"\n03000332=\"Обрнути избор\"\n03000333=\"Изабери...\"\n03000334=\"Поништи избор...\"\n03000335=\"Изабери по типу\"\n03000336=\"Поништи избор по типу\"\n\n; View\n03000410=\"Иконе\"\n03000411=\"Напоредно слагање\"\n03000412=\"Списак\"\n03000413=\"Детаљи\"\n03000420=\"Без сортирања\"\n03000430=\"Отвори почетну фасциклу\"\n03000431=\"Горе за један ниво\"\n03000432=\"Хронологија...\"\n03000440=\"Освежавање\"\n03000450=\"2 Прозора\"\n03000451=\"Траке са алаткама\"\n03000460=\"Рад са архивама\"\n03000461=\"Рад са датотекама\"\n03000462=\"Велика дугмад\"\n03000463=\"Прикажи текст испод дугмади\"\n\n; Tools\n03000510=\"Опције...\"\n03000511=\"Benchmark\"\n\n; Help\n03000610=\"Помоћ...\"\n03000620=\"О програму...\"\n\n; Favorites\n03000710=\"Додај\"\n03000720=\"Изабери\"\n\n; Options Dialog\n\n03010000=\"Опције\"\n\n; Plugins\n03010100=\"Plug-ins\"\n03010101=\"Plug-ins:\"\n03010110=\"Опције...\"\n\n; Edit\n03010200=\"Промене у датотекама\"\n03010201=\"Програм:\"\n\n; System\n03010300=\"Систем\"\n03010302=\"7-Zip отвара следеће типове датотека:\"\n03010310=\"Plug-in\"\n\n; Settings\n03010400=\"Подешавања\"\n03010401=\"Прикажи \\\"..\\\"\"\n03010402=\"Прикажи праве сличице датотека\"\n03010410=\"Прикажи системски мени\"\n03010420=\"Обележи цео ред\"\n03010421=\"Прикажи линије мреже\"\n03010430=\"Алтернативни начин за бирање\"\n03010440=\"Користи велике меморијске блокове\"\n\n; Strings\n\n03020201=\"Копирај\"\n03020202=\"Исеци\"\n03020203=\"Копирај у:\"\n03020204=\"Премести у:\"\n03020205=\"Копирање у току...\"\n03020206=\"Премештање у току...\"\n03020207=\"Није могуће преместити или копирати садржај ове Фасцикле.\"\n03020208=\"Операција није подржана.\"\n\n03020210=\"Потврдите брисање датотеке\"\n03020211=\"Потврдите брисање фасцикле\"\n03020212=\"Потврдите вишеструко брисање датотека\"\n03020213=\"Јесте ли сигурни да желите да обришете '{0}'?\"\n03020214=\"Јесте ли сигурни да желите да обришете фасциклу '{0}' и сав њен садржај?\"\n03020215=\"Јесте ли сигурни да желите да обришете ове {0} податке?\"\n03020216=\"Брисање у току...\"\n03020217=\"Грешка при брисању датотеке или фасцикле\"\n\n03020220=\"Преименовање у току...\"\n03020221=\"Грешка при преименовању датотеке или фасцикле\"\n03020222=\"Потврди копирање датотеке\"\n03020223=\"Да ли сте сигурни да желите да копирате датотеке у архиву\"\n\n03020230=\"Креирај фасциклу\"\n03020231=\"Име фасцикле:\"\n03020232=\"Нова фасцикла\"\n03020233=\"Грешка при креирању фасцикли\"\n\n03020240=\"Креирај датотеку\"\n03020241=\"Име датотеке:\"\n03020242=\"Нова датотека\"\n03020243=\"Грешка при креирању датотека\"\n\n03020250=\"Одабери\"\n03020251=\"Поништи избор\"\n03020252=\"Маска:\"\n\n03020260=\"Хронологија\"\n\n03020280=\"Датотека '{0}' је измјењена.\\nДа ли желите ажурирати архиву?\"\n03020281=\"Није могуће ажурирати датотеку\\n'{0}'\"\n03020282=\"Није могуће започети уређивање.\"\n03020283=\"Отварање у току...\"\n\n03020291=\"Коментар\"\n03020291=\"Коментар:\"\n\n030202A0=\"Систем\"\n\n03020300=\"Рачунар\"\n03020301=\"Мрежа\"\n\n03020400=\"Додај\"\n03020401=\"Издвој\"\n03020402=\"Тестирај\"\n\n03020420=\"Копирај\"\n03020421=\"Премести\"\n03020422=\"Избриши\"\n03020423=\"Својства\"\n\n03020500=\"Подели датотеку\"\n03020501=\"Подели на:\"\n03020510=\"Подела...\"\n\n03020600=\"Састави датотеке\"\n03020601=\"Састави у:\"\n03020610=\"Спајање...\"\n\n; Computer\n03031100=\"Укупни капацитет\"\n03031101=\"Слободни простор\"\n03031102=\"Величинa cluster-а\"\n03031103=\"Назив\"\n\n; Network\n03031200=\"Локално име\"\n03031201=\"Provider\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Коришћење меморије:\"\n03080002=\"Компресија\"\n03080003=\"Декомпресија\"\n03080004=\"Брзина\"\n03080005=\"Оцена\"\n03080006=\"Потпуна оцена\"\n03080007=\"Тренутно\"\n03080008=\"Резултат\"\n03080009=\"Пролази:\"\n0308000A=\"Грешке:\"\n\n;!@LangEnd@!"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/sr-spl.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.30\n; Translated by Lazar\n\n00000000=\"Serbian - Latin\"\n00000001=\"Srpski - latinica\"\n00000002=\"26-2\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Podešavanje 7-Zip-a\"\n\n; Info Page\n01000100=\"O programu\"\n01000103=\"7-Zip je besplatan program. No, ako Vam se 7-Zip dopadne i poželite da podržite dalji razvoj programa, molimo Vas registrujte se tako što ćete priložiti donaciju od 20$. To možete uraditi kreditnom karticom ili nekim drugim načinom plaćanja.\"\n01000104=\"Podrška\"\n01000105=\"Registracija\"\n\n; Folders Page\n01000200=\"Fascikle\"\n01000210=\"Radna fascikla\"\n01000211=\"Koristi Windows-ovu privremenu fasciklu\"\n01000212=\"Trenutna\"\n01000213=\"Navedena:\"\n01000214=\"Koristi samo za izmenjive medije\"\n\n01000281=\"Navedite lokaciju za smeštanje privremenih datoteka.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"Ubaci 7-Zip u sistemski meni\"\n01000302=\"Kaskadni sistemski meni\"\n01000310=\"Stavke sistemskog menija:\"\n\n; Language Page\n01000400=\"Jezik\"\n01000401=\"Jezik:\"\n\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip komande\"\n02000103=\"Otvori arhivu\"\n02000104=\"Otvori izabranu arhivu.\"\n02000105=\"Izdvoj datoteke...\"\n02000106=\"Izdvoj datoteke iz izabrane arhive.\"\n02000107=\"Dodaj u arhivu...\"\n02000108=\"Dodaj izabrane stavke u arhivu.\"\n02000109=\"Testiraj arhivu\"\n0200010A=\"Testiraj integritet izabrane arhive.\"\n0200010B=\"Izdvoj ovde\"\n0200010C=\"Izdvoj datoteke iz izabrane arhive u trenutnu fasciklu.\"\n0200010D=\"Izdvoj u {0}\"\n0200010E=\"Izdvoj datoteke u podfasciklu.\"\n0200010F=\"Dodaj u {0}\"\n02000110=\"Dodaj izabrane datoteke u arhivu.\"\n02000111=\"Dodaj i napravi e-mail...\"\n02000112=\"Dodaj obeležene datoteke i napravi e-mail.\"\n02000113=\"Dodaj u {0} i napravi e-mail\"\n02000114=\"Dodaj obeležene datoteke i napravi e-mail.\"\n\n02000140=\"<Folder>\"\n02000141=\"<Archive>\"\n\n; Properties\n02000203=\"Putanja\"\n02000204=\"Naziv\"\n02000205=\"Tip\"\n02000206=\"Fascikla\"\n02000207=\"Veličina\"\n02000208=\"Veličina u zapakovanom stanju\"\n02000209=\"Atributi\"\n0200020A=\"Kreirana\"\n0200020B=\"Pristupano\"\n0200020C=\"Promenjeno\"\n0200020D=\"Solid\"\n0200020E=\"Komentar\"\n0200020F=\"Šifrovano\"\n02000210=\"Podeli pre\"\n02000211=\"Podeli posle\"\n02000212=\"Dictionary\"\n02000213=\"CRC\"\n02000214=\"Tip\"\n02000215=\"Anti\"\n02000216=\"Metod\"\n02000217=\"Operativni sistem\"\n02000218=\"Sistem datoteka\"\n02000219=\"Korisnik\"\n0200021A=\"Grupa\"\n0200021B=\"Blok\"\n0200021C=\"Komentar\"\n0200021D=\"Položaj\"\n\n; Status bar\n02000301=\"{0} objekat(a) izabrano\"\n02000302=\"{0} objekat(a)\"\n\n; List Context Menu\n02000401=\"Kolona...\"\n\n02000411=\"Otvori\"\n02000412=\"Izdvoj...\"\n\n; ToolBar\n02000501=\"Izdvoj\"\n\n; Messages\n02000601=\"Operacija osvežavanja nije dozvoljena za ovu arhivu.\"\n02000602=\"Ne mogu da osvežim arhivu {0}\"\n02000603=\"Ne mogu da kreiram Fasciklu '{0}'\"\n02000604=\"Datoteka nije jedna od podržanih arhiva.\"\n02000605=\"Greška\"\n02000606=\"Isuviše stavki\"\n02000607=\"Ni jedna aplikacija nije dodeljena navedenoj ekstenziji\"\n02000608=\"Nije bilo nikakvih grešaka\"\n\n; Dialogs\n02000702=\"U redu\"\n02000705=\"Da\"\n02000707=\"Da za sve\"\n02000709=\"Ne\"\n0200070B=\"Ne za sve\"\n\n02000710=\"Otkaži\"\n02000711=\"Otkaži\"\n02000713=\"Zatvori\"\n02000714=\"Stani\"\n02000715=\"Ponovo\"\n\n02000720=\"Pomoć\"\n\n; Extract dialog\n02000800=\"Izdvoj\"\n02000801=\"Izdvoj u:\"\n02000802=\"Šifra\"\n\n02000810=\"Putanje\"\n02000811=\"Puna putanja\"\n02000812=\"Trenutne putanje\"\n02000813=\"Bez putanje\"\n\n02000820=\"Zamena\"\n02000821=\"Pitaj pre nego što zameniš\"\n02000822=\"Zameni bez zapitkivanja\"\n02000823=\"Preskoči postojeće datoteke\"\n02000824=\"Automatska promena naziva\"\n02000825=\"Automatska promena naziva postojećih datoteka\"\n\n02000830=\"Datoteke\"\n02000831=\"Izabrani datoteke\"\n02000832=\"Sve datoteke\"\n\n02000881=\"Navedi lokaciju gde će se izdvajati datoteke iz arhiva.\"\n\n02000890=\"Izdvajanje\"\n\n; Overwrite dialog\n02000900=\"Potvrdi zamenu datoteke\"\n02000901=\"Ciljna fascikla već sadrži datoteku koja se trenutno obrađuje.\"\n02000902=\"Da li želite da zamenite postojeću datoteku\"\n02000903=\"sa ovom?\"\n\n02000911=\"Automatska promena naziva\"\n\n02000982=\"{0} bajtova\"\n02000983=\"modifikovano\"\n\n; Messages dialog\n02000A00=\"Dijagnostičke poruke\"\n\n02000A80=\"Poruke\"\n\n02000A91=\"Nepodržani metod kompresije za '{0}'.\"\n02000A92=\"Greška u '{0}'. Datoteka je neispravana.\"\n02000A93=\"CRC greška u '{0}'. Datoteka je neispravana.\"\n\n; Password dialog\n02000B00=\"Unesite lozinku\"\n02000B01=\"Unesite lozinku:\"\n02000B02=\"Prikaži lozinku\"\n\n; Progress dialog\n02000C00=\"Obrađujem\"\n02000C01=\"Proteklo vreme:\"\n02000C02=\"Preostalo vreme:\"\n02000C03=\"Veličina:\"\n02000C04=\"Brzina:\"\n\n02000C10=\"Pozadina\"\n02000C11=\"Na vrhu\"\n02000C12=\"Pauza\"\n02000C13=\"Nastavi\"\n\n02000C20=\"Pauza\"\n\n02000C30=\"Da li ste sigurni da želite da prekinete?\"\n\n; Compress dialog\n02000D00=\"Dodaj u arhivu\"\n02000D01=\"Arhiva:\"\n02000D02=\"Nadogradnja arhiva:\"\n02000D03=\"Format arhive:\"\n02000D04=\"Tip kompresije:\"\n02000D05=\"Kreiraj Solid arhivu\"\n02000D06=\"Parametri:\"\n02000D07=\"Opcije\"\n02000D08=\"Kreiraj SFX arhivu\"\n02000D09=\"Više niti\"\n02000D0A=\"Šifruj nazive datoteka\"\n02000D0B=\"Nivo kompresije:\"\n02000D0C=\"Dictionary size:\"\n02000D0D=\"Word size:\"\n02000D0E=\"Potrebna memorija - kompresija:\"\n02000D0F=\"Potrebna memorija - dekompresija:\"\n\n02000D40=\"Podeli na delove, bajti:\"\n\n02000D81=\"Bez kompresije\"\n02000D82=\"Normalno\"\n02000D83=\"Maksimalno\"\n02000D84=\"Brzo\"\n02000D85=\"Brže\"\n02000D86=\"Najbrže\"\n\n02000D90=\"Pregledaj\"\n\n02000DA1=\"Dodaj i zameni datoteke\"\n02000DA2=\"Osveži i dodaj datoteke\"\n02000DA3=\"Ozveži postojeće datoteke\"\n02000DA4=\"Sinhronizuj datoteke\"\n\n02000DB1=\"Sve datoteke\"\n\n02000DC0=\"Dodajem\"\n\n; Columns dialog\n02000E00=\"Kolone\"\n02000E01=\"Obeležite kolone koje biste želeli da budu vidljive u ovom pregledu. Koristite PageUp i PageDown tastere kako biste preuredili kolone po sopstvenom izboru.\"\n02000E02=\"Izabrane kolone bi trebale biti\"\n02000E03=\"tačaka široke.\"\n\n02000E10=\"Pomeri gore\"\n02000E11=\"Pomeri dole\"\n02000E12=\"Prikaži\"\n02000E13=\"Sakrij\"\n02000E14=\"Postavi\"\n\n02000E81=\"Naslov\"\n02000E82=\"Širina\"\n\n; Testing\n02000F90=\"Testiranje\"\n\n; File Manager\n\n03000000=\"7-Zip\"\n\n; Menu\n03000102=\"Datoteka\"\n03000103=\"Uređivanje\"\n03000104=\"Pregled\"\n03000105=\"Alati\"\n03000106=\"Pomoć\"\n03000107=\"Omiljeno\"\n\n; File\n03000210=\"Pogledaj\"\n03000211=\"Otvori sa 7-Zip-om\"\n03000212=\"Otvori sa pridruženom programom\"\n03000220=\"Pregledaj\"\n03000221=\"Promeni\"\n03000230=\"Preimenuj\"\n03000231=\"Kopiraj u...\"\n03000232=\"Premesti u...\"\n03000233=\"Obriši\"\n03000240=\"Svojstva\"\n03000241=\"Komentar\"\n03000250=\"Nova fascikla\"\n03000251=\"Nova datoteka\"\n03000260=\"Izlaz\"\n03000270=\"Podeli fajl...\"\n03000271=\"Spoj delove...\"\n\n\n; Edit\n03000310=\"Opozovi\"\n03000311=\"Ponovi\"\n03000320=\"Iseci\"\n03000321=\"Kopiraj\"\n03000322=\"Nalepi\"\n03000323=\"Izbriši\"\n03000330=\"Izaberi sve\"\n03000331=\"Poništi izbor svega\"\n03000332=\"Obrnuti izbor\"\n03000333=\"Izaberi...\"\n03000334=\"Poništi izbor...\"\n03000335=\"Izaberi po tipu\"\n03000336=\"Poništi izbor po tipu\"\n\n; View\n03000410=\"Ikone\"\n03000411=\"Naporedno slaganje\"\n03000412=\"Spisak\"\n03000413=\"Detalji\"\n03000420=\"Bez sortiranja\"\n03000430=\"Otvori početnu fasciklu\"\n03000431=\"Gore za jedan nivo\"\n03000432=\"Hronologija...\"\n03000440=\"Osvežavanje\"\n03000450=\"2 Prozora\"\n03000451=\"Trake sa alatkama\"\n03000460=\"Rad sa arhivama\"\n03000461=\"Rad sa datotekama\"\n03000462=\"Velika dugmad\"\n03000463=\"Prikaži tekst ispod dugmadi\"\n\n; Tools\n03000510=\"Opcije...\"\n03000511=\"Benchmark\"\n\n; Help\n03000610=\"Pomoć...\"\n03000620=\"O programu...\"\n\n; Favorites\n03000710=\"Dodaj\"\n03000720=\"Izaberi\"\n\n; Options Dialog\n\n03010000=\"Opcije\"\n\n; Plugins\n03010100=\"Plug-ins\"\n03010101=\"Plug-ins:\"\n03010110=\"Opcije...\"\n\n; Edit\n03010200=\"Promene u datotekama\"\n03010201=\"Program:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"7-Zip otvara sledeće tipove datoteka:\"\n03010310=\"Plug-in\"\n\n; Settings\n03010400=\"Podešavanja\"\n03010401=\"Prikaži \\\"..\\\"\"\n03010402=\"Prikaži prave sličice datoteka\"\n03010410=\"Prikaži sistemski meni\"\n03010420=\"Obeleži ceo red\"\n03010421=\"Prikaži linije mreže\"\n03010430=\"Alternativni način za biranje\"\n03010440=\"Koristi velike memorijske blokove\"\n\n; Strings\n\n03020201=\"Kopiraj\"\n03020202=\"Iseci\"\n03020203=\"Kopiraj u:\"\n03020204=\"Premesti u:\"\n03020205=\"Kopiranje u toku...\"\n03020206=\"Premeštanje u toku...\"\n03020207=\"Nije moguće premestiti ili kopirati sadržaj ove Fascikle.\"\n03020208=\"Operacija nije podržana.\"\n\n03020210=\"Potvrdite brisanje datoteke\"\n03020211=\"Potvrdite brisanje fascikle\"\n03020212=\"Potvrdite višestruko brisanje datoteka\"\n03020213=\"Jeste li sigurni da želite da obrišete '{0}'?\"\n03020214=\"Jeste li sigurni da želite da obrišete fasciklu '{0}' i sav njen sadržaj?\"\n03020215=\"Jeste li sigurni da želite da obrišete ove {0} podatke?\"\n03020216=\"Brisanje u toku...\"\n03020217=\"Greška pri brisanju datoteke ili fascikle\"\n\n03020220=\"Preimenovanje u toku...\"\n03020221=\"Greška pri preimenovanju datoteke ili fascikle\"\n03020222=\"Potvrdi kopiranje datoteke\"\n03020223=\"Da li ste sigurni da želite da kopirate datoteke u arhivu\"\n\n03020230=\"Kreiraj fasciklu\"\n03020231=\"Ime fascikle:\"\n03020232=\"Nova fascikla\"\n03020233=\"Greška pri kreiranju fascikli\"\n\n03020240=\"Kreiraj datoteku\"\n03020241=\"Ime datoteke:\"\n03020242=\"Nova datoteka\"\n03020243=\"Greška pri kreiranju datoteka\"\n\n03020250=\"Odaberi\"\n03020251=\"Poništi izbor\"\n03020252=\"Maska:\"\n\n03020260=\"Hronologija\"\n\n03020280=\"Datoteka '{0}' je izmjenjena.\\nDa li želite ažurirati arhivu?\"\n03020281=\"Nije moguće ažurirati datoteku\\n'{0}'\"\n03020282=\"Nije moguće započeti uređivanje.\"\n03020283=\"Otvaranje u toku...\"\n\n03020291=\"Komentar\"\n03020291=\"Komentar:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"Računar\"\n03020301=\"Mreža\"\n\n03020400=\"Dodaj\"\n03020401=\"Izdvoj\"\n03020402=\"Testiraj\"\n\n03020420=\"Kopiraj\"\n03020421=\"Premesti\"\n03020422=\"Izbriši\"\n03020423=\"Svojstva\"\n\n03020500=\"Podeli datoteku\"\n03020501=\"Podeli na:\"\n03020510=\"Podela...\"\n\n03020600=\"Sastavi datoteke\"\n03020601=\"Sastavi u:\"\n03020610=\"Spajanje...\"\n\n; Computer\n03031100=\"Ukupni kapacitet\"\n03031101=\"Slobodni prostor\"\n03031102=\"Veličina cluster-a\"\n03031103=\"Naziv\"\n\n; Network\n03031200=\"Lokalno ime\"\n03031201=\"Provider\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Korišćenje memorije:\"\n03080002=\"Kompresija\"\n03080003=\"Dekompresija\"\n03080004=\"Brzina\"\n03080005=\"Ocena\"\n03080006=\"Potpuna ocena\"\n03080007=\"Trenutno\"\n03080008=\"Rezultat\"\n03080009=\"Prolazi:\"\n0308000A=\"Greške:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/sv.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Original translation by Andreas M Nilsson and Christoffer Enqvist\n; Maintained since '7-Zip 4.07 beta' by Andreas M Nilsson\n; Updated for '7-Zip 4.42' by Bernhard Eriksson, Wermlandsdata, Sweden\n; Incorpororated changes made by Andreas M Nilsson for 4.44\n; Updated for 4.53 and 4.59 by Bernhard Eriksson, Wermlandsdata, Sweden\n\n00000000=\"Swedish\"\n00000001=\"Svenska\"\n00000002=\"29\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip konfiguration\"\n\n; Info Page\n01000100=\"Om 7-Zip\"\n01000103=\"7-Zip är fri programvara. Du kan emellertid stödja den fortsatta utvecklingen av 7-Zip genom att donera. Den aktuella översättningen på svenska är gjord av Wermlandsdata, baserad på arbete utfört av Andreas M Nilsson och Christoffer Enqvist.\"\n01000104=\"Support\"\n01000105=\"Donera\"\n\n; Folders Page\n01000200=\"Mappar\"\n01000210=\"&Arbetsmapp\"\n01000211=\"&Systemets temp-mapp\"\n01000212=\"A&ktuell\"\n01000213=\"Spe&cificerad:\"\n01000214=\"Använd enbart för &flyttbara enheter\"\n\n01000281=\"Ange plats där temporära arkivfiler ska sparas.\"\n\n; System Page\n01000300=\"System\"\n01000301=\"Lägg till 7-Zip som alternativ i Utforskarens högerklicksmenyn\"\n01000302=\"Placera 7-Zip som en undermeny\"\n01000310=\"Objekt i högerklicksmenyn:\"\n\n; Language Page\n01000400=\"Språk\"\n01000401=\"Språk:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip kommandon\"\n02000103=\"Öppna\"\n02000104=\"Öppna det markerade arkivet.\"\n02000105=\"Packa upp filer...\"\n02000106=\"Packar upp filer från det markerade arkivet.\"\n02000107=\"Lägg till arkiv...\"\n02000108=\"Lägger till de markerade filerna till ett arkiv.\"\n02000109=\"Kontrollera arkivet\"\n0200010A=\"Kontrollerar om arkivet är korrupt.\"\n0200010B=\"Packa upp här\"\n0200010C=\"Packar upp filer från det markerade arkivet till den aktuella mappen.\"\n0200010D=\"Packa upp till {0}\"\n0200010E=\"Packar upp filer till en undermapp.\"\n0200010F=\"Lägg till {0}\"\n02000110=\"Lägger till de markerade filerna till ett arkiv.\"\n02000111=\"Komprimera och skicka som e-post...\"\n02000112=\"Komprimerar de markerade filerna till ett arkiv och skickar arkivet via e-post.\"\n02000113=\"Komprimera till {0} och skicka som e-post\"\n02000114=\"Komprimerar de markerade filerna till ett arkiv och skickar arkivet via e-post.\"\n\n02000140=\"<Mapp>\"\n02000141=\"<Arkiv>\"\n\n; Properties\n02000203=\"Sökväg\"\n02000204=\"Namn\"\n02000205=\"Filändelse\"\n02000206=\"Mapp\"\n02000207=\"Storlek\"\n02000208=\"Storlek komprimerad\"\n02000209=\"Attribut\"\n0200020A=\"Skapad\"\n0200020B=\"Använd\"\n0200020C=\"Ändrad\"\n0200020D=\"Sammanhängande (Solid)\"\n0200020E=\"Kommenterad\"\n0200020F=\"Krypterad\"\n02000210=\"Delad före\"\n02000211=\"Delad efter\"\n02000212=\"Ordlista\"\n02000213=\"CRC\"\n02000214=\"Typ\"\n02000215=\"Anti\"\n02000216=\"Metod\"\n02000217=\"Värd OS\"\n02000218=\"Filsystem\"\n02000219=\"Användare\"\n0200021A=\"Grupp\"\n0200021B=\"Block\"\n0200021C=\"Kommentar\"\n0200021D=\"Position\"\n0200021E=\"Sökvägs prefix\"\n0200021F=\"Kataloger\"\n02000220=\"Filer\"\n02000221=\"Version\"\n02000222=\"Volym\"\n02000223=\"Multivolym\"\n02000224=\"Offset\"\n02000225=\"Länkar\"\n02000226=\"Block\"\n02000227=\"Volymer\"\n\n02000229=\"64-bitars\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"Fysisk storlek\"\n0200022D=\"Storlek på header\"\n0200022E=\"Checksumma\"\n0200022F=\"Karakteristisk\"\n02000230=\"Virtuell adress\"\n\n; Status bar\n02000301=\"{0} objekt markerade\"\n02000302=\"{0} objekt\"\n\n02000320=\"Filer:\"\n02000321=\"Mappar:\"\n02000322=\"Storlek:\"\n02000323=\"Komprimerad storlek:\"\n02000324=\"Arkiv:\"\n\n; List Context Menu\n02000401=\"&Kolumner...\"\n\n02000411=\"&Öppna\"\n02000412=\"&Packa upp...\"\n\n; ToolBar\n02000501=\"Packa upp\"\n\n; Messages\n02000601=\"Uppdatering stöds inte för det här arkivet.\"\n02000602=\"Kan inte uppdatera arkiv {0}\"\n02000603=\"Kan inte skapa mapp '{0}'\"\n02000604=\"Arkivformatet stöds inte.\"\n02000605=\"Fel\"\n02000606=\"För många objekt\"\n02000607=\"Filändelsen är inte associerad till något program\"\n02000608=\"Inga fel påträffades\"\n02000609=\"Kan inte öppna filen '{0}' som ett arkiv\"\n0200060A=\"Kan inte öppna det krypterade arkivet '{0}'. Fel lösenord?\"\n0200060B=\"Systemet kan inte allokera den begärda minnesmängden\"\n0200060C=\"Okänt fel\"\n0200060D=\"Arkiv typen stöds ej\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ja\"\n02000707=\"Ja till &Alla\"\n02000709=\"&Nej\"\n0200070B=\"Nej till A&lla\"\n\n02000710=\"Avbryt\"\n02000711=\"A&vbryt\"\n02000713=\"&Stäng\"\n02000714=\"Stopp\"\n02000715=\"Starta om\"\n\n02000720=\"Hjälp\"\n\n; Extract dialog\n02000800=\"Packa upp\"\n02000801=\"&Packa upp till:\"\n02000802=\"&Lösenord\"\n\n02000810=\"&Sökvägstyp\"\n02000811=\"Kompletta sökvägar\"\n02000812=\"Aktuella sökvägar\"\n02000813=\"Inga sökvägar\"\n\n02000820=\"&Överskrivning\"\n02000821=\"Fråga före överskrivning\"\n02000822=\"Skriv över befintliga filer\"\n02000823=\"Hoppa över befintliga filer\"\n02000824=\"Automatisk omdöpning\"\n02000825=\"Automatisk omdöpning av befintliga filer\"\n\n02000830=\"Filer\"\n02000831=\"&Markerade filer\"\n02000832=\"&Alla filer\"\n\n02000881=\"Ange sökväg för uppackade filer.\"\n\n02000890=\"Packar upp\"\n\n; Overwrite dialog\n02000900=\"Bekräfta överskrivning av fil\"\n02000901=\"Målmappen innehåller redan den behandlade filen.\"\n02000902=\"Vill du skriva över den befintliga filen\"\n02000903=\"med den här?\"\n\n02000911=\"A&utomatisk omdöpning\"\n\n02000982=\"{0} bytes\"\n02000983=\"ändrad den\"\n\n; Messages dialog\n02000A00=\"Diagnostiska meddelanden\"\n\n02000A80=\"Meddelande\"\n\n02000A91=\"Komprimeringsmetoden stöds inte för '{0}'.\"\n02000A92=\"Datafel i '{0}'. Filen är korrupt.\"\n02000A93=\"CRC-fel i '{0}'. Filen är korrupt.\"\n02000A94=\"Datafel i den krypterade filen '{0}'. Fel lösenord?\"\n02000A95=\"CRC-fel i den krypterade filen '{0}'. Fel lösenord?\"\n\n; Password dialog\n02000B00=\"Ange lösenord\"\n02000B01=\"Ange lösenord:\"\n02000B02=\"&Visa lösenord\"\n02000B03=\"Upprepa lösenord:\"\n02000B10=\"Lösenorden stämmer inte överens.\"\n02000B11=\"Använd endast engelska tecken, siffror och special tecken (!, #, $, ...) till lösenord\"\n02000B12=\"Lösenordet är för långt.\"\n\n; Progress dialog\n02000C00=\"Förlopp\"\n02000C01=\"Förfluten tid:\"\n02000C02=\"Återstående tid:\"\n02000C03=\"Storlek:\"\n02000C04=\"Hastighet:\"\n02000C05=\"Bearbetat:\"\n02000C06=\"Komprimeringsgrad:\"\n\n02000C10=\"&Bakgrunden\"\n02000C11=\"&Förgrunden\"\n02000C12=\"&Pausa\"\n02000C13=\"F&ortsätt\"\n\n02000C20=\"Pausad\"\n\n02000C30=\"Är du säker på att du vill avbryta?\"\n\n; Compress dialog\n02000D00=\"Lägg till arkiv\"\n02000D01=\"&Arkiv:\"\n02000D02=\"&Uppdateringsmetod:\"\n02000D03=\"Arkiv&format:\"\n02000D04=\"&Komprimeringsmetod:\"\n02000D05=\"Skapa ett &sammanhängande (eng. solid) arkiv\"\n02000D06=\"&Parametrar:\"\n02000D07=\"Alternativ\"\n02000D08=\"Skapa sj&älvuppackande arkiv\"\n02000D09=\"Använd flera trådar\"\n02000D0A=\"Kryptera fil&namn\"\n02000D0B=\"Komprimeringsniv&å:\"\n02000D0C=\"Storlek på &ordlista:\"\n02000D0D=\"Storlek på o&rd:\"\n02000D0E=\"Minne behövt vid komprimering:\"\n02000D0F=\"Minne behövt vid dekomprimering:\"\n02000D10=\"Kryptering\"\n02000D11=\"Krypteringsmetod:\"\n02000D12=\"Antal trådar:\"\n02000D13=\"Solit block storlek:\"\n02000D14=\"Icke-solit\"\n02000D15=\"Solit\"\n02000D16=\"Komprimera delade filer\"\n\n02000D40=\"Dela upp i &delar (volymer), bytes:\"\n02000D41=\"Felaktig volymstorlek.\"\n02000D42=\"Specificerad volymstorlek: {0} byte.\\nÄr du säker du vill dela arkivet i sådana delar?\"\n\n02000D81=\"Okomprimerat\"\n02000D82=\"Normal\"\n02000D83=\"Maximal\"\n02000D84=\"Snabb\"\n02000D85=\"Snabbaste\"\n02000D86=\"Ultra\"\n\n02000D90=\"Bläddra\"\n\n02000DA1=\"Lägg till och ersätt filer\"\n02000DA2=\"Lägg till och uppdatera befintliga filer\"\n02000DA3=\"Uppdatera enbart befintliga filer\"\n02000DA4=\"Synkronisera filer\"\n\n02000DB1=\"Alla filer\"\n\n02000DC0=\"Komprimerar\"\n\n; Columns dialog\n02000E00=\"Kolumner\"\n02000E01=\"Markera de kolumner du vill ska vara synliga i den här mappen. Använd \\\"Flytta Upp\\\" och \\\"Flytta Ner\\\" knapparna för att ordna om kolumnerna.\"\n02000E02=\"Den valda kolumnen ska vara\"\n02000E03=\"pixlar &bred.\"\n\n02000E10=\"Flytta &Upp\"\n02000E11=\"Flytta &Ner\"\n02000E12=\"&Visa\"\n02000E13=\"&Dölj\"\n02000E14=\"Bestäm\"\n\n02000E81=\"Titel\"\n02000E82=\"Bredd\"\n\n; Testing\n02000F90=\"Kontrollerar\"\n\n\n; File Manager\n\n03000000=\"7-Zip Filhanterare\"\n\n; Menu\n03000102=\"&Arkiv\"\n03000103=\"&Redigera\"\n03000104=\"&Visa\"\n03000105=\"Verkt&yg\"\n03000106=\"&Hjälp\"\n03000107=\"&Favoriter\"\n\n; File\n03000210=\"&Öppna\"\n03000211=\"Öppna &internt\"\n03000212=\"Öppna &externt\"\n03000220=\"&Visa\"\n03000221=\"&Redigera\"\n03000230=\"&Byt namn\"\n03000231=\"&Kopiera till...\"\n03000232=\"&Flytta till...\"\n03000233=\"&Ta bort\"\n03000240=\"E&genskaper\"\n03000241=\"Komme&ntera\"\n03000242=\"Beräkna checksumma\"\n03000250=\"Skapa mapp\"\n03000251=\"Skapa fil\"\n03000260=\"&Avsluta\"\n03000270=\"&Dela upp fil...\"\n03000271=\"&Sätt ihop filer...\"\n\n; Edit\n03000310=\"&Ångra\"\n03000311=\"&Gör om\"\n03000320=\"&Klipp ut\"\n03000321=\"K&opiera\"\n03000322=\"K&listra in\"\n03000323=\"&Ta bort\"\n03000330=\"Markera &alla\"\n03000331=\"Avmarkera alla\"\n03000332=\"&Invertera markering\"\n03000333=\"Markera...\"\n03000334=\"Avmarkera...\"\n03000335=\"Markera efter typ\"\n03000336=\"Avmarkera efter typ\"\n\n; View\n03000410=\"St&ora ikoner\"\n03000411=\"Sm&å ikoner\"\n03000412=\"&Lista\"\n03000413=\"&Detaljerad lista\"\n03000420=\"Osorterade\"\n03000430=\"Öppna rotmappen\"\n03000431=\"Upp en nivå\"\n03000432=\"Mapphistorik...\"\n03000440=\"&Uppdatera\"\n03000449=\"Platt vy\"\n03000450=\"&2 Paneler\"\n03000451=\"&Verktygsfält\"\n03000460=\"Verktygsfältet Arkiv\"\n03000461=\"Verktygsfältet Standard\"\n03000462=\"Stora Knappar\"\n03000463=\"Visa Knapptext\"\n\n; Tools\n03000510=\"&Alternativ...\"\n03000511=\"&Benchmark\"\n\n; Help\n03000610=\"&Innehåll...\"\n03000620=\"&Om 7-Zip...\"\n\n; Favorites\n03000710=\"&Lägg mappen till Favoriter som\"\n03000720=\"Bokmärke\"\n\n; Options Dialog\n\n03010000=\"Alternativ\"\n\n; Plugins\n03010100=\"Insticksmoduler\"\n03010101=\"&Insticksmoduler:\"\n03010110=\"Alternativ...\"\n\n; Edit\n03010200=\"Redigerare\"\n03010201=\"&Redigerare:\"\n\n; System\n03010300=\"System\"\n03010302=\"Associera med 7-Zip:\"\n03010310=\"Insticksmodul\"\n\n; Settings\n03010400=\"Inställningar\"\n03010401=\"Visa \\\"..\\\" objektet\"\n03010402=\"Visa riktiga ikoner, för filer innehållande ikoner (el. länkade)\"\n03010410=\"Visa system-menyn\"\n03010420=\"Markera &hel rad\"\n03010421=\"Visa &rutnät\"\n03010430=\"&Alternativt markeringsläge\"\n03010440=\"Använd &stora minnessidor\"\n\n; Strings\n\n03020201=\"Kopiera\"\n03020202=\"Flytta\"\n03020203=\"Kopiera till:\"\n03020204=\"Flytta till:\"\n03020205=\"Kopierar...\"\n03020206=\"Flyttar...\"\n03020207=\"Du kan inte flytta eller kopiera objekt till sådan mapp.\"\n03020208=\"Funktionen stöds inte.\"\n03020209=\"Välj målmapp.\"\n\n03020210=\"Bekräfta borttagning av fil\"\n03020211=\"Bekräfta borttagning av mapp\"\n03020212=\"Bekräfta borttagning av flera filer\"\n03020213=\"Är du säker på att du vill ta bort '{0}'?\"\n03020214=\"Är du säker på att du vill ta bort mappen '{0}' och allt dess innehåll?\"\n03020215=\"Är du säker på att du vill ta bort de här {0} objekten?\"\n03020216=\"Tar bort...\"\n03020217=\"Ett fel uppstod under borttagning av fil eller mapp\"\n03020218=\"Systemet kan inte flytta en fil med s lng skvg till papperskorgen\"\n\n03020220=\"Döper om...\"\n03020221=\"Ett fel uppstod under omdöpning av fil eller mapp\"\n03020222=\"Bekräfta kopiering av fil\"\n03020223=\"Är du säker på att du vill kopiera filerna till arkivet\"\n\n03020230=\"Skapa mapp\"\n03020231=\"Mappnamn:\"\n03020232=\"Ny mapp\"\n03020233=\"Fel vid skapande av mapp\"\n\n03020240=\"Skapa fil\"\n03020241=\"Filnamn:\"\n03020242=\"Ny fil\"\n03020243=\"Fel vid skapande av fil\"\n\n03020250=\"Markera\"\n03020251=\"Avmarkera\"\n03020252=\"Filter:\"\n\n03020260=\"Mapphistorik\"\n\n03020280=\"Filen '{0}' har blivit ändrad.\\nVill du uppdatera den i arkivet?\"\n03020281=\"Kan inte uppdatera filen\\n'{0}'\"\n03020282=\"Kan inte starta redigeraren.\"\n03020283=\"Öppnar...\"\n03020284=\"Filen verkar vara ett virus (filnamnet innehåller 'långa' mellanslag).\"\n\n03020290=\"Kommentar\"\n03020291=\"&Kommentar:\"\n\n030202A0=\"System\"\n\n03020300=\"Dator\"\n03020301=\"Nätverk\"\n03020302=\"Dokument\"\n\n03020400=\"Lägg till\"\n03020401=\"Packa upp\"\n03020402=\"Testa\"\n\n03020420=\"Kopiera\"\n03020421=\"Flytta\"\n03020422=\"Radera\"\n03020423=\"Info\"\n\n03020500=\"Dela Upp Fil\"\n03020501=\"&Dela upp till:\"\n03020510=\"Delar upp...\"\n03020520=\"Bekräfta uppdelning\"\n03020521=\"Är det säkert du vill dela upp filen i {0} volymer?\"\n03020522=\"Volymstorleken måste vara mindre än storleken på originalfilen.\"\n\n03020600=\"Sätt Ihop Filer\"\n03020601=\"&Sätt ihop till:\"\n03020610=\"Sätter ihop...\"\n03020620=\"Markera bara första filen\"\n03020621=\"Kan inte upptäcka att filen är en del av en uppdelad fil\"\n03020622=\"Kan inte hitta mer än en del av en uppdelad fil\"\n\n03020710=\"Beräknar checksumma...\"\n03020720=\"Checksumma information\"\n03020721=\"CRC checksumma för data:\"\n03020722=\"CRC checksumma för data och namn:\"\n\n03020800=\"Skannar...\"\n\n03020900=\"Egenskaper\"\n\n03020A01=\"Operation kan inte utföras från en katalog med en så lång sökväg.\"\n03020A02=\"Du måste välja en fil\"\n03020A03=\"Du måste välja en eller flera filer\"\n03020A04=\"Filen {0} existerar redan\"\n\n; Computer\n03031100=\"Total Storlek\"\n03031101=\"Ledigt utrymme\"\n03031102=\"Kluster storlek\"\n03031103=\"Etikett\"\n\n; Network\n03031200=\"Datornamn\"\n03031201=\"Nätverkstyp\"\n\n; Benchmark Dialog\n\n03080000=\"Benchmark\"\n03080001=\"Minnesanvändning:\"\n03080002=\"Komprimering\"\n03080003=\"Dekomprimering\"\n03080004=\"Hastighet\"\n03080005=\"Prestanda\"\n03080006=\"Total prestanda\"\n03080007=\"Aktuellt\"\n03080008=\"Resultat\"\n03080009=\"Omgångar:\"\n0308000A=\"Fel:\"\n0308000B=\"CPU Användning\"\n0308000C=\"Rate / Användning\"\n\n;!@LangEnd@!\n\n \t  \t \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/ta.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 3.13\n; Translated by Ve Elanjelian, lead coordinator of ThamiZha! team. See: www.thamizha.com\n;\n;\n;\n;\n\n00000000=\"Tamil\"\n00000001=\"தமிழ்\"\n00000002=\"73\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-ஜிப் தகவமைப்பு\"\n\n; Info Page\n01000100=\"7-ஜிப்பைப் பற்றி\"\n01000103=\"தமிழாக்கம் (c) 2004 தமிழா! குழு - www.thamizha.com/\\n\\n7-ஜிப் ஒரு பரிநிரல் ஆகும். ஆனால், நீங்கள் 7-ஜிப்பின் மேம்பாட்டை ஆதரிக்க விரும்பினால், பதிவுபெற்றுங்கள். பதிவுபெற்ற பயனராக, நீங்கள் தொழில்நுட்ப உதவியும் பெறலாம்.\"\n01000105=\"பதிவுபெறுங்கள்\"\n\n; Folders Page\n01000200=\"அடைவுகள்\"\n01000210=\"பணியிலுள்ள அடைவு\"\n01000211=\"மண்டல தற்காலிக அடைவு\"\n01000212=\"நடப்பு\"\n01000213=\"குறிப்பிட்ட:\"\n01000214=\"கழற்று இயக்கிகளை மட்டும் பயன்படுத்து\"\n\n01000281=\"கோப்புகளைத் தற்காலிக காப்பகப்படுத்தும் இடத்தைக் குறிப்பிடுக.\"\n\n; System Page\n01000300=\"மண்டலம்\"\n01000301=\"7-ஜிப்பை வெற்று சூழல்பட்டியலுடன் ஒருங்கிணை\"\n01000302=\"விழுதொடரும் சூழல் பட்டியல்\"\n01000310=\"சூழல் பட்டியல் உருப்படிகள்:\"\n\n; Language Page\n01000400=\"மொழி\"\n01000401=\"மொழி:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-ஜிப்\"\n02000102=\"7-ஜிப் ஆணைகள்\"\n02000103=\"காப்பகத்தைத் திற\"\n02000104=\"தேரிவிக்கப்பட்ட காப்பகத்தைத் திறக்கும்.\"\n02000105=\"கோப்புகளை வெளிக்கொணர்...\"\n02000106=\"தெரிவுசெய்யப்பட்ட காப்பக கோப்புகளை வெளிக்கொணரும்.\"\n02000107=\"காப்பகத்தில் இணை...\"\n02000108=\"தெரிவிக்கப்பட்ட உருப்படிகளைக் காப்பகத்திலிணைக்கும்.\"\n02000109=\"காப்பகத்தைச் சோதனைசெய்\"\n0200010A=\"தெரிவுசெய்யப்பட்ட காப்பக சீர்மையைச் சோதிக்கும்.\"\n0200010B=\"இங்கு வெளிக்கொணர்\"\n0200010C=\"தெரிவுசெய்யப்பட்ட காப்பகக் கோப்புகளை நடப்பு அடைவில் வெளிக்கொணரும்.\"\n0200010D=\"{0}-ல் வெளிக்கொணர்\"\n0200010E=\"துணைஅடைவில் கோப்புகளை வெளிக்கொணர்.\"\n0200010F=\"{0}-ல் இணை\"\n02000110=\"தெரிவிக்கப்பட்ட உருப்படிகளைக் காப்பகத்திலிணைக்கும்.\"\n02000111=\"இறுக்கி மின்னஞ்சலனுப்பு...\"\n02000112=\"தெரிவான உருப்படிகளை காப்பகத்தில் இறுக்கிய பின் காப்பகத்தை மின்னஞ்சல் வழி அனுப்பும்.\"\n02000113=\"{0}-க்கு இறுக்கி அஞ்சலனுப்பு\"\n02000114=\"தெரிவான உருப்படிகளை காப்பகத்தில் இறுக்கிய பின் காப்பகத்தை மின்னஞ்சல் வழி அனுப்பும்.\"\n\n02000140=\"<அடைவு>\"\n02000141=\"<காப்பகம்>\"\n\n; Properties\n02000203=\"பாதை\"\n02000204=\"பெயர்\"\n02000205=\"நீட்டிப்பு\"\n02000206=\"அடைவு\"\n02000207=\"அளவு\"\n02000208=\"கட்டப்பட்ட அளவு\"\n02000209=\"பண்புக்கூறு\"\n0200020A=\"உருவாக்கப்பட்டது\"\n0200020B=\"அனுகப்பட்டது\"\n0200020C=\"மாற்றப்பட்டது\"\n0200020D=\"திண்மம்\"\n0200020E=\"கருத்துரைக்கப்பட்ட\"\n0200020F=\"மறைக்குறியீட்டப்பட்டது\"\n02000210=\"முன் பிரி\"\n02000211=\"பின் பிரி\"\n02000212=\"அகராதி\"\n02000213=\"CRC\"\n02000214=\"வகை\"\n02000215=\"தடுப்பு\"\n02000216=\"வழி\"\n02000217=\"புரவலரின் OS\"\n02000218=\"கோப்பு மண்டலம்\"\n02000219=\"பயனர்\"\n0200021A=\"குழு\"\n0200021B=\"கட்டம்\"\n0200021C=\"குறிப்பு\"\n\n; Status bar\n02000301=\"{0} பொருள் தெரிவானது\"\n02000302=\"{0} பொருள்(கள்)\"\n\n; List Context Menu\n02000401=\"பத்திகள்...\"\n\n02000411=\"திற\"\n02000412=\"வெளிக்கொணர்...\"\n\n; ToolBar\n02000501=\"வெளிக்கொணர்\"\n\n; Messages\n02000601=\"இக்காப்பகத்தில் புதுப்பிக்கும் செயல்களுக்கு ஆதரவில்லை.\"\n02000602=\"{0} காப்பகத்தைப் புதுப்பிக்க முடியவில்லை\"\n02000603=\"'{0}' அடைவை உருவாக்க இயலவில்லை\"\n02000604=\"கோப்பு ஒரு ஆதரிக்கப்படாத காப்பகம்.\"\n02000605=\"தவறு\"\n02000606=\"மிகவும் அதிகமான உருப்படிகள்\"\n02000607=\"கொடுக்கப்பட்ட கோப்புப் பெயர் நீட்டிப்புடன் தொடர்பான எப்பயன்பாடும் இல்லை.\"\n02000608=\"தவறுகளேதுமில்லை\"\n\n; Dialogs\n02000702=\"சரி\"\n02000705=\"ஆம்\"\n02000707=\"அனைத்திற்கும் ஆம்\"\n02000709=\"வேண்டாம்\"\n0200070B=\"அனைத்திற்கும் இல்லை\"\n\n02000710=\"இரத்து\"\n02000711=\"இரத்து\"\n02000713=\"மூடு\"\n02000714=\"நிறுத்து\"\n02000715=\"மீள்துவங்கு\"\n\n02000720=\"உதவி\"\n\n; Extract dialog\n02000800=\"வெளிக்கொணர்\"\n02000801=\"இங்கு வெளிக்கொணர்:\"\n02000802=\"கடவுச்சொல்\"\n\n02000810=\"பாதை முறைமை\"\n02000811=\"முழு பாதைப்பெயர்கள்\"\n02000812=\"நடப்பு பாதைப்பெயர்கள்\"\n02000813=\"பாதைப்பெயர்களில்லை\"\n\n02000820=\"மேலெழுதல் முறைமை\"\n02000821=\"மேலெழுதுவதற்கு முன் கேள்\"\n02000822=\"கேட்காமல் மேலெழுது\"\n02000823=\"தற்பொழுதுள்ள கோப்புகளைத் தவிர்\"\n02000824=\"தானாக மாற்றுப்பெயரிடு\"\n\n02000830=\"கோப்புகள்\"\n02000831=\"தேரிவான கோப்புகள்\"\n02000832=\"அனைத்து கோப்புகளும்\"\n\n02000881=\"வெளிக்கொணர்ந்த கோப்புகளுக்கான இடத்தைக் குறிப்பிடு.\"\n\n02000890=\"வெளிக்கொணரப்படுகின்றது\"\n\n; Overwrite dialog\n02000900=\"கோப்பு மாற்றத்தை உறுதிசெய்\"\n02000901=\"சேரிட அடைவு ஏற்கனவே செயல்படுத்தப்பட்ட கோப்பைக் கொண்டுள்ளது.\"\n02000902=\"தற்பொழுதுள்ள கோப்பை\"\n02000903=\"இதக்கொண்டு மாற்ற விரும்புகிறீர்களா?\"\n\n02000911=\"தானாக மாற்றுப்பெயரிடு\"\n\n02000982=\"{0} பைட்கள்\"\n02000983=\"மாற்றப்பட்ட காலம்\"\n\n; Messages dialog\n02000A00=\"அறிவழிச் செய்திகள்\"\n\n02000A80=\"செய்தி\"\n\n02000A91=\"'{0}'-ல் ஆதரவில்லாத இறுக்கல் முறை.\"\n02000A92=\"'{0}'-ல் தரவுத் தவறு. கோப்பு முறிந்துள்ளது.\"\n02000A93=\"'{0}'-ல் CRC தோல்வியுற்றது. கோப்பு முறிந்துள்ளது.\"\n\n; Password dialog\n02000B00=\"கடவுச்சொல்லை உள்ளிடுக\"\n02000B01=\"கடவுச்சொல்லை உள்ளிடுக:\"\n02000B02=\"கடவுச்சொல்லை காட்டு\"\n\n; Progress dialog\n02000C00=\"செயலாக்கம்\"\n02000C01=\"மீதமுள்ள நேரம்:\"\n02000C02=\"மீதமுள்ள நேரம்:\"\n02000C03=\"அளவு:\"\n02000C04=\"வேகம்:\"\n\n02000C10=\"பின்புலம்\"\n02000C11=\"முன்புலம்\"\n02000C12=\"தற்காலிகமாக நிறுத்து\"\n02000C13=\"தொடரவும்\"\n\n02000C20=\"தற்காலிக நிறுத்தல்\"\n\n02000C30=\"உறுதியாகவே இரத்து செய்ய விரும்புகிறீர்களா?\"\n\n; Compress dialog\n02000D00=\"காப்பகத்திலிணை\"\n02000D01=\"காப்பகம்:\"\n02000D02=\"புதுபிக்கும் முறைமை:\"\n02000D03=\"காப்பக வடிவம்:\"\n02000D04=\"இறுக்கும் வழி:\"\n02000D05=\"திண்ம காப்பகத்தை உருவாக்கு\"\n02000D06=\"அளபுருகள்:\"\n02000D07=\"விருப்பத்தேர்வுகள்\"\n02000D08=\"SFX காப்பகம் உறுவாக்கு\"\n02000D09=\"பல இழையாக்கம்\"\n02000D0A=\"பெயரை மறைக்குறியீடாக்கு\"\n02000D0B=\"இறுக்க வகை:\"\n02000D0C=\"அகராதி அளவு:\"\n02000D0D=\"வார்த்தை அளவு:\"\n02000D0E=\"இறுக்க நினைவக பயன்பாடு:\"\n02000D0F=\"பெருக்க நினைவக பயன்பாடு:\"\n\n02000D40=\"கனவளவுகளுக்கு, பைட்களுக்குப் பிரி:\"\n\n02000D81=\"தேக்கு\"\n02000D82=\"சாதாரண\"\n02000D83=\"அதிகமான\"\n02000D84=\"விரைவான\"\n02000D85=\"அதிவிரைவான\"\n02000D86=\"சிறப்பான\"\n\n02000D90=\"உலாவு\"\n\n02000DA1=\"சேர்த்து கோப்புகளை மாற்று\"\n02000DA2=\"புதிப்பித்து கோப்புகளை சேர்\"\n02000DA3=\"உள்ள கோப்புகளைப் புதுப்பி\"\n02000DA4=\"கோப்புகளை ஒத்தியக்கு\"\n\n02000DB1=\"அனைத்து கோப்புகளும்\"\n\n02000DC0=\"இறுக்கப்படுகின்றது\"\n\n; Columns dialog\n02000E00=\"பத்திகள்\"\n02000E01=\"இவ்வடைவில் தெரிய வேண்டியவற்றின் பத்திகளைத் தெரிவுசெய். மேல் நகர்த்து மற்றும் கீழ் நகர்த்து பொத்தான்களக் கொண்டு பத்திகளை ஒழுங்காக்கு.\"\n02000E02=\"தெரிவுசெய்யப்பட்ட பத்தி\"\n02000E03=\"படத்துணுக்கு அகலம் இருக்கவேண்டும்.\"\n\n02000E10=\"மேல் நகர்த்து\"\n02000E11=\"கீழ் நகர்த்து\"\n02000E12=\"காட்டு\"\n02000E13=\"மறை\"\n02000E14=\"அமை\"\n\n02000E81=\"தலைப்பு\"\n02000E82=\"அகலம்\"\n\n; Testing\n02000F90=\"சோதனை...\"\n\n\n; File Manager\n\n03000000=\"7-ஜிப் கோப்பு மேலாளர்\"\n\n; Menu\n03000102=\"கோப்பு\"\n03000103=\"பதிப்பு\"\n03000104=\"பார்வை\"\n03000105=\"கருவிகள்\"\n03000106=\"உதவி\"\n03000107=\"விருப்பங்கள்\"\n\n; File\n03000210=\"திற\"\n03000211=\"உள்ளே திற\"\n03000212=\"வெளியே திற\"\n03000220=\"பார்வை\"\n03000221=\"பதிப்பு\"\n03000230=\"மாற்றுப்பெயரிடு\"\n03000231=\"இங்கு நகலெடு...\"\n03000232=\"இங்கு நகர்த்து...\"\n03000233=\"அழி\"\n03000240=\"தன்மைகள்\"\n03000241=\"கருத்துரை\"\n03000250=\"கோப்பை உருவாக்கு\"\n03000251=\"கோப்பு உருவாக்கு\"\n03000260=\"வெளியேறு\"\n\n; Edit\n03000310=\"செயல்நீக்கு\"\n03000311=\"செயல்மீள்\"\n03000320=\"வெட்டு\"\n03000321=\"நகல்\"\n03000322=\"ஒட்டு\"\n03000323=\"அழி\"\n03000330=\"அனைத்தும் தேர்ந்தெடு\"\n03000331=\"அனைத்தும் நீக்கு\"\n03000332=\"தெரிவை புரட்டு\"\n03000333=\"தேர்ந்தெடு...\"\n03000334=\"நீக்கு...\"\n03000335=\"வகைப்படி தெரிவுசெய்\"\n03000336=\"வகைப்படி நீக்கு\"\n\n; View\n03000410=\"பெரிய உருபிகள்\"\n03000411=\"சிறிய உருபிகள்\"\n03000412=\"பட்டியல்\"\n03000413=\"தகவல்கள்\"\n03000420=\"வரிசைப்படுத்தப்படாதது\"\n03000430=\"வேர் அடைவைத் திற\"\n03000431=\"ஒரு படி மேல்\"\n03000432=\"அடைவுகளின் வரலாறு...\"\n03000440=\"புதுக்கல்\"\n03000450=\"2 பலகங்கள்\"\n03000451=\"கருவிப்பட்டைகள்\"\n03000460=\"காப்பக கருவிப்பட்டை\"\n03000461=\"பொதுவான கருவிப்பட்டை\"\n03000462=\"பெரிய பொத்தான்கள்\"\n03000463=\"பொத்தான்களின் உரையைக் காட்டு\"\n\n; Tools\n03000510=\"விருப்பத்தேர்வு...\"\n03000511=\"மதிப்பீட்டு அளவை\"\n\n; Help\n03000610=\"பொருளடக்கம்...\"\n03000620=\"7-ஜிப்பைப் பற்றி...\"\n\n; Favorites\n03000710=\"அடைவை விரும்பியவற்றுள் இப்படி இணை\"\n03000720=\"புத்தகக்குறி\"\n\n; Options Dialog\n\n03010000=\"தேர்வுகள்\"\n\n; Plugins\n03010100=\"செருகுநிரல்கள்\"\n03010101=\"செருகுநிரல்கள்:\"\n03010110=\"தேர்வுகள்...\"\n\n; Edit\n03010200=\"பதிப்பாளன்\"\n03010201=\"பதிப்பாளன்:\"\n\n; System\n03010300=\"மண்டலம்\"\n03010302=\"7-ஜிப்பை இதனுடன் தொடர்புப்படுத்து:\"\n03010310=\"செருகுநிரல்\"\n\n; Settings\n03010400=\"அமைவுகள்\"\n03010401=\"\\\"..\\\" உருப்படியைக் காட்டு\"\n03010402=\"கோப்பு உருபிகளைக் காட்டு\"\n03010410=\"மண்டல பட்டியலைக் காட்டு\"\n\n; Strings\n\n03020201=\"நகல்\"\n03020202=\"நகர்த்து\"\n03020203=\"இங்கு நகலெடு:\"\n03020204=\"இங்கு நகர்த்து:\"\n03020205=\"நகலெடுக்கப்படுகிறது...\"\n03020206=\"நகர்த்தப்படுகிறது...\"\n03020207=\"அத்தகைய அடைவுகளுக்கு நீங்கள் நகர்த்தவோ நகலெடுக்கவோ முடியாது.\"\n03020208=\"அத்தகைய செயலுக்கு ஆதரவில்லை.\"\n\n03020210=\"கோப்பு அழிப்பை உறுதிசெய்\"\n03020211=\"அடைவு அழிப்பை உறுதிசெய்\"\n03020212=\"பல கோப்பு அழிப்பை உறுதிசெய்\"\n03020213=\"'{0}'-ஐ உறுதியாக அழிக்க விரும்புகிறீர்களா?\"\n03020214=\"'{0}' அடைவையும் அதிலுள்ளவற்றயும் உறுதியாகவே அழிக்க விரும்புகிறீர்களா?\"\n03020215=\"இந்த {0} உருப்படிகளை உறுதியாக அழிக்க விரும்புகிறீர்களா?\"\n03020216=\"அழிக்கப்படுகிறது...\"\n03020217=\"கோப்பையோ அடைவையோ அழிக்கும்போது தவறு\"\n\n03020220=\"பெயர்மாற்றப்படுகிறது...\"\n03020221=\"கோப்பையோ அடைவையோ பெயர்மாற்றும்போது தவறு\"\n\n03020230=\"அடைவு உருவாக்கு\"\n03020231=\"அடைவின் பெயர்:\"\n03020232=\"புதிய அடைவு\"\n03020233=\"அடைவு உருவாக்கும்போது தவறு\"\n\n03020240=\"கோப்பு உருவாக்கு\"\n03020241=\"கோப்பின் பெயர்:\"\n03020242=\"புதிய கோப்பு\"\n03020243=\"கோப்பு உருவாக்கையில் தவறேற்பட்டது\"\n\n03020250=\"தெரிவுசெய்\"\n03020251=\"நீக்கு\"\n03020252=\"முகமுடி:\"\n\n03020260=\"அடைவுகளின் வரலாறு\"\n\n03020280=\"'{0}' கோப்பு மாற்றப்பட்டது.\\nஇதனை காப்பகத்தில் புதுப்பிக்க வேண்டுமா?\"\n03020281=\"பின்வரும் கோப்பை புதுப்பிக்க இயலவில்லை\\n'{0}'\"\n03020282=\"பதிப்பாளனைத் துவக்க இயலவில்லை.\"\n03020283=\"திறக்கப்படுகின்றது...\"\n\n03020290=\"கருத்துரை\"\n03020291=\"கருத்துரை:\"\n\n030202A0=\"மண்டலம்\"\n\n03020300=\"கணினி\"\n03020301=\"பிணையம்\"\n\n03020400=\"இணை\"\n03020401=\"வெளிக்கொணர்\"\n03020402=\"பரிசோதி\"\n\n03020420=\"நகல்\"\n03020421=\"நகர்த்து\"\n03020422=\"அழி\"\n03020423=\"தகவல்\"\n\n; Computer\n03031100=\"மொத்த அளவு\"\n03031101=\"காளி இடம்\"\n03031102=\"கொத்தணியின் அளவு\"\n03031103=\"வில்லை\"\n\n; Network\n03031200=\"இடத்துரி பெயர்\"\n03031201=\"வழங்குபவர்\"\n\n; Benchmark Dialog\n\n03080000=\"மதிப்பீட்டு அளவை\"\n03080001=\"நினைவக பயன்:\"\n03080002=\"இறுக்கப்படுகையில்\"\n03080003=\"பெருக்கப்படுகையில்\"\n03080004=\"வேகம்\"\n03080005=\"புள்ளிகள்\"\n03080006=\"மொத்த புள்ளிகள்\"\n03080007=\"நடப்பு\"\n03080008=\"முடிவில்\"\n03080009=\"சரியானவை:\"\n0308000A=\"தவறுகள்:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/th.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 3.13\n; Translated by Zafire06\n;\n;\n;\n;\n\n00000000=\"Thai\"\n00000001=\"ไทย\"\n00000002=\"30\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"โครงแบบ 7-Zip\"\n\n; Info Page\n01000100=\"เกี่ยวกับ 7-Zip\"\n01000103=\"7-Zip เป็นฟรีแวร์  อย่างไรก็ตาม  คุณสามารถสนับสนุนการพัฒนาของ 7-Zip ได้โดยการลงทะเบียน  เมื่อคุณเป็นผู้ใช้ที่ลงทะเบียนแล้ว  คุณจะได้รับการสนับสนุนทางเทคนิคจากเรา\"\n01000105=\"ลงทะเบียน\"\n\n; Folders Page\n01000200=\"โฟลเดอร์\"\n01000210=\"&โฟลเดอร์ที่ทำงานอยู่\"\n01000211=\"&โฟลเดอร์ต่างๆของระบบ\"\n01000212=\"&โฟลเดอร์ปัจจุบัน\"\n01000213=\"&ระบุ:\"\n01000214=\"ใช้สำหรับไดรฟ์แบบถอดได้เท่านั้น\"\n\n01000281=\"รายละเอียดที่ตั้งสำหรับไฟล์เอกสารชั่วคราว\"\n\n; System Page\n01000300=\"ระบบ\"\n01000301=\"รวบรวมคำสั่ง 7-Zip ไปที่แถบเมนูลัด\"\n01000302=\"แยกเป็นแถบคำสั่ง 7-Zip\"\n01000310=\"วัตถุที่ปรากฏบนเมนูลัด:\"\n\n; Language Page\n01000400=\"ภาษา\"\n01000401=\"ภาษา:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"คำสั่ง 7-Zip\"\n02000103=\"เปิดเอกสาร\"\n02000104=\"เปิดเอกสารที่เลือกไว้\"\n02000105=\"แยกไฟล์...\"\n02000106=\"แยกไฟล์จากเอกสารที่เลือกไว้\"\n02000107=\"เพิ่มเข้าเอกสาร...\"\n02000108=\"เพิ่มวัตถุที่เลือกไว้เข้าเอกสาร\"\n02000109=\"ทดสอบเอกสาร\"\n0200010A=\"ทดสอบความน่าเชื่อถือของเอกสารที่เลือกไว้\"\n0200010B=\"แยกไฟล์ที่นี่\"\n0200010C=\"แยกไฟล์จากเอกสารที่เลือกไว้ไปที่โฟลเดอร์เดิม\"\n0200010D=\"แยกไฟล์ไปที่ {0}\"\n0200010E=\"แยกไฟล์ไปที่โฟลเดอร์ย่อย.\"\n0200010F=\"เพิ่มเข้า {0}\"\n02000110=\"เพิ่มวัตถุที่เลือกไว้เข้าเอกสาร\"\n02000111=\"บีบอัดแล้วส่งอีเมลล์...\"\n02000112=\"บีบอัดวัตถุที่เลือกไว้แล้วส่งไปทางอีเมลล์\"\n02000113=\"บีบอัดเป็น {0} แล้วส่งอีเมลล์\"\n02000114=\"บีบอัดวัตถุที่เลือกไว้แล้วส่งไปทางอีเมลล์\"\n\n02000140=\"<โฟลเดอร์>\"\n02000141=\"<เอกสาร>\"\n\n; Properties\n02000203=\"ที่ตั้ง\"\n02000204=\"ชื่อ\"\n02000205=\"ชนิด\"\n02000206=\"โฟลเดอร์\"\n02000207=\"ขนาด\"\n02000208=\"ขนาดเมื่อถูกจัดเก็บ\"\n02000209=\"ลักษณะประจำ\"\n0200020A=\"สร้างเมื่อ\"\n0200020B=\"เข้าถึงเมื่อ\"\n0200020C=\"ดัดแปรเมื่อ\"\n0200020D=\"ต่อเนื่อง\"\n0200020E=\"หมายเหตุ\"\n0200020F=\"การเข้ารหัสลับ\"\n02000210=\"ก่อนแบ่ง\"\n02000211=\"หลังแบ่ง\"\n02000212=\"ดิคชันนารี\"\n02000213=\"ซีอาร์ซี\"\n02000214=\"แบบชนิด\"\n02000215=\"ต่อต้าน\"\n02000216=\"วิธีการ\"\n02000217=\"OS ที่ใช้\"\n02000218=\"ไฟล์ระบบ\"\n02000219=\"ผู้ใช้\"\n0200021A=\"กลุ่ม\"\n0200021B=\"บล็อก\"\n0200021C=\"หมายเหตุ\"\n\n; Status bar\n02000301=\"{0} วัตถุที่เลือกไว้\"\n02000302=\"{0} วัตถุ\"\n\n; List Context Menu\n02000401=\"&สดมภ์...\"\n\n02000411=\"&เปิด\"\n02000412=\"&แยกไฟล์...\"\n\n; ToolBar\n02000501=\"แยกไฟล์\"\n\n; Messages\n02000601=\"ปรับปรุงการทำงานไม่สนับสนุนสำหรับเอกสาร\"\n02000602=\"ไม่สามารถปรับปรุงเอกสาร {0}\"\n02000603=\"ไม่สามารถสร้างโฟลเดอร์ '{0}'\"\n02000604=\"ไฟล์ไม่สนับสนุนเอกสาร\"\n02000605=\"เกิดข้อผิดพลาด\"\n02000606=\"มีวัตถุมากเกินไป\"\n02000607=\"ไม่มีโปรแกรมที่เปิดชนิดไฟล์ที่ให้มาได้\"\n02000608=\"ไม่มีข้อผิดพลาด\"\n\n; Dialogs\n02000702=\"ตกลง\"\n02000705=\"&ใช่\"\n02000707=\"ใช่ทั้งหมด\"\n02000709=\"&ไม่\"\n0200070B=\"ไม่ทั้งหมด\"\n\n02000710=\"ยกเลิก\"\n02000711=\"&ยกเลิก\"\n02000713=\"&ออก\"\n02000714=\"หยุด\"\n02000715=\"ฟื้นฟู\"\n\n02000720=\"ช่วยเหลือ\"\n\n; Extract dialog\n02000800=\"แยกไฟล์\"\n02000801=\"แยกไฟล์ไปที่:\"\n02000802=\"รหัสผ่าน\"\n\n02000810=\"ที่ตั้ง\"\n02000811=\"ชื่อที่ตั้งแบบเต็ม\"\n02000812=\"ชื่อตั้งเดิม\"\n02000813=\"ไม่มีชื่อที่ตั้ง\"\n\n02000820=\"การบันทึกทับ\"\n02000821=\"ถามก่อนมีการบันทึกทับ\"\n02000822=\"บันทึกทับโดยไม่มีข้อความพร้อมรับ\"\n02000823=\"ข้ามไฟล์ที่มีอยู่\"\n02000824=\"เปลี่ยนชื่ออัตโนมัติ\"\n\n02000830=\"ไฟล์\"\n02000831=\"&ไฟล์ที่เลือกไว้\"\n02000832=\"&ไฟล์ทั้งหมด\"\n\n02000881=\"ระบุที่ตั้งสำหรับไฟล์ที่แยกออกมา\"\n\n02000890=\"กำลังแยกไฟล์\"\n\n; Overwrite dialog\n02000900=\"ยืนยันการแทนที่ไฟล์\"\n02000901=\"โฟลเดอร์ปลายทางมีไฟล์ที่ได้ประมวลผลแล้ว\"\n02000902=\"คุณต้องการแทนที่ไฟล์ที่มีอยู่หรือไม่\"\n02000903=\"ด้วย\"\n\n02000911=\"เปลี่ยนชื่ออัตโนมัติ\"\n\n02000982=\"{0} ไบต์\"\n02000983=\"ดัดแปรบน\"\n\n; Messages dialog\n02000A00=\"ข้อความวินิจฉัย\"\n\n02000A80=\"ข้อความ\"\n\n02000A91=\"ไม่สนับสนุนการบีบอัดเมท็อดสำหรับ '{0}'\"\n02000A92=\"ข้อมูลใน '{0}' ผิดพลาด  ไฟล์ชำรุด\"\n02000A93=\"ซีอาร์ซีใน '{0}' ไม่สามารถใช้การได้  ไฟล์ชำรุด\"\n\n; Password dialog\n02000B00=\"ใส่รหัสผ่าน\"\n02000B01=\"ใส่รหัสผ่าน:\"\n02000B02=\"&แสดงรหัสผ่าน\"\n\n; Progress dialog\n02000C00=\"กระบวนการ\"\n02000C01=\"ใช้เวลาไปแล้ว:\"\n02000C02=\"ต้องใช้เวลาอีก:\"\n02000C03=\"ขนาด:\"\n02000C04=\"ความเร็ว:\"\n\n02000C10=\"&ทำงานเป็นพื้นหลัง\"\n02000C11=\"&ทำงานเป็นพื้นหน้า\"\n02000C12=\"&หยุดชั่วคราว\"\n02000C13=\"&ดำเนินการต่อ\"\n\n02000C20=\"หยุดชั่วคราว\"\n\n02000C30=\"คุณแน่ใจหรือว่าจะยกเลิก\"\n\n; Compress dialog\n02000D00=\"เพิ่มเข้าเอกสาร\"\n02000D01=\"&เอกสาร:\"\n02000D02=\"&การปรับปรุง:\"\n02000D03=\"เอกสารการจัดรูปแบบ:\"\n02000D04=\"การบีบอัดเมท็อด:\"\n02000D05=\"สร้างเอกสารแบบต่อเนื่อง\"\n02000D06=\"&พารามิเตอร์:\"\n02000D07=\"ตัวเลือก\"\n02000D08=\"สร้างเอกสาร SFX\"\n02000D09=\"สร้างสายโยงใยมากเป็นพิเศษ\"\n02000D0A=\"สร้างรหัสผ่าน\"\n02000D0B=\"อัตราการบีบอัด:\"\n02000D0C=\"&ขนาดดิคชันนารี:\"\n02000D0D=\"&ขนาดอักษร:\"\n02000D0E=\"หน่วยความจำที่ใช้ในการบีบอัด:\"\n02000D0F=\"หน่วยความจำที่ใช้ในการแตกออก:\"\n\n02000D40=\"อัตราการแบ่งไฟล์, ไบต์:\"\n\n02000D81=\"เก็บเฉยๆ\"\n02000D82=\"ธรรมดา\"\n02000D83=\"ดี\"\n02000D84=\"เร็ว\"\n02000D85=\"เร็วที่สุด\"\n02000D86=\"ดีที่สุด\"\n\n02000D90=\"ค้นดู\"\n\n02000DA1=\"เพิ่มและแทนที่ไฟล์\"\n02000DA2=\"ปรับปรุงและเพิ่ม\"\n02000DA3=\"ทำให้ไฟล์ที่มีอยู่ใช้การได้ดีขึ้น\"\n02000DA4=\"ทำให้ไฟล์ประสานกัน\"\n\n02000DB1=\"ไฟล์ทั้งหมด\"\n\n02000DC0=\"กำลังบีบอัด\"\n\n; Columns dialog\n02000E00=\"สดมภ์\"\n02000E01=\"ตรวจสอบสดมภ์ซึ่งจะทำให้คุณรู้รายละเอียดของไฟล์ได้มากขึ้น  ใช้ปุ่มย้ายขึ้นและย้ายลงเพื่อเรียงลำดับสดมภ์อีกครั้ง\"\n02000E02=\"สดมภ์ที่เลือกไว้จะเป็น\"\n02000E03=\"ความกว้าง (พิกเซล)\"\n\n02000E10=\"ย้ายขึ้น\"\n02000E11=\"ย้ายลง\"\n02000E12=\"&แสดง\"\n02000E13=\"&ซ่อน\"\n02000E14=\"เซ็ต\"\n\n02000E81=\"หัวเรื่อง\"\n02000E82=\"ความกว้าง\"\n\n; Testing\n02000F90=\"กำลังทดสอบ\"\n\n\n; File Manager\n\n03000000=\"ตัวจัดการไฟล์ 7-Zip\"\n\n; Menu\n03000102=\"&แฟ้ม\"\n03000103=\"&แก้ไข\"\n03000104=\"&มุมมอง\"\n03000105=\"&เครื่องมือ\"\n03000106=\"&ช่วยเหลือ\"\n03000107=\"&รายการโปรด\"\n\n; File\n03000210=\"&เปิด\"\n03000211=\"เปิดในหน้าต่างเดิม\"\n03000212=\"เปิดในหน้าต่างใหม่\"\n03000220=\"&มุมมอง\"\n03000221=\"&แก้ไข\"\n03000230=\"&เปลี่ยนชื่อ\"\n03000231=\"&คัดลอกไปที่...\"\n03000232=\"&วางที่...\"\n03000233=\"&ลบ\"\n03000240=\"&คุณสมบัติ\"\n03000241=\"&หมายเหตุ\"\n03000250=\"สร้างโฟลเดอร์\"\n03000251=\"สร้างไฟล์\"\n03000260=\"ออก\"\n\n; Edit\n03000310=\"&ทำกลับ\"\n03000311=\"&ทำซ้ำ\"\n03000320=\"&ตัด\"\n03000321=\"&คัดลอก\"\n03000322=\"&วาง\"\n03000323=\"&ลบ\"\n03000330=\"เลือกทั้งหมด\"\n03000331=\"ยกเลิกการเลือกทั้งหมด\"\n03000332=\"&สลับการเลือกให้เป็นตรงกันข้าม\"\n03000333=\"เลือก...\"\n03000334=\"ยกเลิกการเลือก...\"\n03000335=\"เลือกด้วยแบบชนิด\"\n03000336=\"ยกเลิกการเลือกด้วยแบบชนิด\"\n\n; View\n03000410=\"&ไอคอนขนาดใหญ่\"\n03000411=\"&ไอคอนขนาดเล็ก\"\n03000412=\"&แสดงเป็นรายการ\"\n03000413=\"&แสดงแบบละเอียด\"\n03000420=\"ไม่เลือก\"\n03000430=\"เปิดรากโฟลเดอร์\"\n03000431=\"เลื่อนขึ้นหนึ่งระดับ\"\n03000432=\"ประวัติโฟลเดอร์...\"\n03000440=\"&ฟื้นฟู\"\n03000450=\"&แสดง 2 แผง\"\n03000451=\"&แถบเครื่องมือ\"\n03000460=\"แถบเครื่องมือเอกสาร\"\n03000461=\"แถบเครื่องมือธรรมดา\"\n03000462=\"ปุ่มขนาดใหญ่\"\n03000463=\"แสดงข้อความบนปุ่ม\"\n\n; Tools\n03000510=\"&ตัวเลือก...\"\n03000511=\"&เกณฑ์เปรียบเทียบสมรรถนะ\"\n\n; Help\n03000610=\"&เนื้อหาและดัชนี...\"\n03000620=\"&เกี่ยวกับ 7-Zip...\"\n\n; Favorites\n03000710=\"&เพิ่มโฟลเดอร์เข้ารายการโปรด\"\n03000720=\"คั่นหน้าที่\"\n\n; Options Dialog\n\n03010000=\"ตัวเลือก\"\n\n; Plugins\n03010100=\"ปลั๊กอิน\"\n03010101=\"&ปลั๊กอิน:\"\n03010110=\"ตัวเลือก...\"\n\n; Edit\n03010200=\"บรรณาธิกรณ์\"\n03010201=\"&บรรณาธิกรณ์:\"\n\n; System\n03010300=\"ระบบ\"\n03010302=\"ทำให้ 7-Zip ทำงานร่วมกับ:\"\n03010310=\"ปลั๊กอิน\"\n\n; Settings\n03010400=\"กำหนด\"\n03010401=\"แสดงวัตถุ \\\"..\\\"\"\n03010402=\"แสดงไอคอนไฟล์ที่แท้จริง\"\n03010410=\"แสดงเมนูระบบ\"\n\n; Strings\n\n03020201=\"คัดลอก\"\n03020202=\"ย้าย\"\n03020203=\"คัดลอกไปที่:\"\n03020204=\"ย้ายที่:\"\n03020205=\"กำลังคัดลอก...\"\n03020206=\"กำลังวาง...\"\n03020207=\"คุณไม่สามารถย้ายหรือคัดลอกวัตถุในโฟลเดอร์เช่นนี้\"\n03020208=\"การปฏิบัติการไม่สนับสนุน\"\n\n03020210=\"ยืนยันการลบไฟล์\"\n03020211=\"ยืนยันการลบโฟลเดอร์\"\n03020212=\"ยืนยันการลบไฟล์แบบควบซ้อน\"\n03020213=\"คุณแน่ใจหรือว่าคุณต้องการจะลบไฟล์ '{0}'?\"\n03020214=\"คุณแน่ใจหรือว่าคุณต้องการจะลบโฟลเดอร์ '{0}' และข้อมูลของมันทั้งหมด\"\n03020215=\"คุณแน่ใจหรือว่าจะลบวัตถุ {0} เหล่านี้\"\n03020216=\"กำลังลบ...\"\n03020217=\"เกิดข้อผิดพลาดในการลบไฟล์หรือโฟลเดอร์\"\n\n03020220=\"กำลังเปลี่ยนชื่อ...\"\n03020221=\"เกิดข้อผิดพลาดในการเปลี่ยนชื่อไฟล์หรือโฟลเดอร์\"\n\n03020230=\"สร้างโฟลเดอร์\"\n03020231=\"ชื่อโฟลเดอร์:\"\n03020232=\"โฟลเดอร์ใหม่\"\n03020233=\"เกิดข้อผิดพลาดในการสร้างโฟลเดอร์\"\n\n03020240=\"สร้างไฟล์\"\n03020241=\"ชื่อไฟล์:\"\n03020242=\"ไฟล์ใหม่\"\n03020243=\"เหิดข้อผิดพลาดในการสร้างไฟล์\"\n\n03020250=\"เลือก\"\n03020251=\"ยกเลิกการเลือก\"\n03020252=\"ตัวพราง:\"\n\n03020260=\"ประวัติโฟลเดอร์\"\n\n03020280=\"ไฟล์ '{0}' ได้ถูกดัดแปรแล้ว\\nคุณต้องการจะปรับปรุงเอกสารหรือไม่\"\n03020281=\"ไม่สามารถปรับปรุงไฟล์\\n'{0}'\"\n03020282=\"ไม่สามารถเปิดบรรณาธิกรณ์\"\n03020283=\"กำลังเปิด...\"\n\n03020290=\"หมายเหตุ\"\n03020291=\"&หมายเหตุ:\"\n\n030202A0=\"ระบบ\"\n\n03020300=\"คอมพิวเตอร์\"\n03020301=\"เครือข่าย\"\n\n03020400=\"เพิ่มเข้า\"\n03020401=\"แยกไฟล์\"\n03020402=\"ทดสอบ\"\n\n03020420=\"คัดลอก\"\n03020421=\"ย้าย\"\n03020422=\"ลบ\"\n03020423=\"เกี่ยวกับ\"\n\n; Computer\n03031100=\"ขนาดทั้งหมด\"\n03031101=\"ช่องว่างที่เหลืออยู่\"\n03031102=\"ขนาดกลุ่ม\"\n03031103=\"ป้าย\"\n\n; Network\n03031200=\"ชื่อเฉพาะ\"\n03031201=\"ผู้ให้บริการ\"\n\n; Benchmark Dialog\n\n03080000=\"เกณฑ์เปรียบเทียบสมรรถนะ\"\n03080001=\"หน่วยความจำที่ใช้:\"\n03080002=\"การบีบอัด\"\n03080003=\"การยกเลิกบีบอัด\"\n03080004=\"ความเร็ว\"\n03080005=\"เกณฑ์ความสามารถ\"\n03080006=\"เกณฑ์ความสามารถทั้งหมด\"\n03080007=\"ปัจจุบัน\"\n03080008=\"ผลการประเมิน\"\n03080009=\"ข้อความ:\"\n0308000A=\"ความผิดพลาด:\"\n\n; New lines (Added 11/10/2004 For Version 4)\n0200021D=\"ตำแหน่ง\"\n02000825=\"เปลี่ยนชื่อไฟล์ที่มีอยู่แล้วอัตโนมัติ\"\n03000270=\"แ&บ่งไฟล์...\"\n03000271=\"ร&วมไฟล์...\"\n03010420=\"เ&ลือกเต็มแถว\"\n03010421=\"แสดงเ&ส้นกริด\"\n03020500=\"แบ่งไฟล์\"\n03020501=\"แ&บ่งไปที่:\"\n03020510=\"กำลังแบ่ง...\"\n03020600=\"รวมไฟล์\"\n03020601=\"&รวมไปที่:\"\n03020610=\"กำลังรวม...\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/tr.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.45\n; Translated by rmgunduz 22.04.2007\n;\n; Raif Merter GÜNDÜZ\n; DEU CSE / TURKEY\n;\n\n00000000=\"Turkish\"\n00000001=\"Türkçe\"\n00000002=\"31\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Yapılandırma\"\n\n; Info Page\n01000100=\"7-Zip hakkında\"\n01000103=\"7-Zip özgür bir yazılımdır. Ancak, kayıt olarak 7-zip geliştirme faaliyetine destek olabilirsiniz.\"\n01000104=\"Destek\"\n01000105=\"Kayıt ol\"\n\n; Folders Page\n01000200=\"Klasörler\"\n01000210=\"Ça&lışma klasörü\"\n01000211=\"&Sistem TEMP klasörü\"\n01000212=\"&Geçerli klasör\"\n01000213=\"&Belirtilen klasör:\"\n01000214=\"Sadece çıkarılabilen sürücüler için kullan\"\n\n01000281=\"Geçici arşiv dosyaları için bir yer belirleyin.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"İçerik menülerinde 7-Zip görünsün\"\n01000302=\"Çağlayan içerik menüsü\"\n01000310=\"İçerik menü öğeleri:\"\n\n; Language Page\n01000400=\"Dil\"\n01000401=\"Dil:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip komutları\"\n02000103=\"Arşivi aç\"\n02000104=\"Seçili arşivi açar.\"\n02000105=\"Dosyaları çıkart...\"\n02000106=\"Seçili arşivden dosyaları çıkartır.\"\n02000107=\"Arşivle...\"\n02000108=\"Seçili öğeleri arşive ekler.\"\n02000109=\"Arşivi sına\"\n0200010A=\"Seçili arşivin bütünlüğünü test eder.\"\n0200010B=\"Burada çıkart\"\n0200010C=\"Seçili arşivdeki dosyaları geçerli klasöre çıkartır.\"\n0200010D=\"{0} klasörüne çıkart\"\n0200010E=\"Alt klasöre çıkartır.\"\n0200010F=\"{0} olarak arşivle\"\n02000110=\"Seçili öğeleri arşive ekler.\"\n02000111=\"Sıkıştırıp postala...\"\n02000112=\"Seçili öğeleri sıkıştırıp arşivler ve arşivi e-posta ile gönderir.\"\n02000113=\"{0} olarak sıkıştır ve postala\"\n02000114=\"Seçili öğeleri sıkıştırıp arşivler ve arşivi e-posta ile gönderir.\"\n\n02000140=\"<Klasör>\"\n02000141=\"<Arşiv>\"\n\n; Properties\n02000203=\"Yol\"\n02000204=\"Ad\"\n02000205=\"Uzantı\"\n02000206=\"Klasör\"\n02000207=\"Boyut\"\n02000208=\"Arşivde boyutu\"\n02000209=\"Öznitelikler\"\n0200020A=\"Oluşmuş\"\n0200020B=\"Erişilmiş\"\n0200020C=\"Değişmiş\"\n0200020D=\"Katı\"\n0200020E=\"Açıklanmış\"\n0200020F=\"Şifrelenmiş\"\n02000210=\"Önceki parça\"\n02000211=\"Sonraki parça\"\n02000212=\"Sözlük\"\n02000213=\"CRC\"\n02000214=\"Tür\"\n02000215=\"Anti\"\n02000216=\"Sıkıştırma şekli\"\n02000217=\"Platform\"\n02000218=\"Dosya Sistemi\"\n02000219=\"Kullanıcı\"\n0200021A=\"Grup\"\n0200021B=\"Blok\"\n0200021C=\"Açıklama\"\n0200021D=\"Konum\"\n0200021E=\"Yol Öneki\"\n\n; Status bar\n02000301=\"{0} adet öğe seçili\"\n02000302=\"{0} adet öğe\"\n\n02000320=\"Dosyalar:\"\n02000321=\"Klasörler:\"\n02000322=\"Boyut:\"\n\n; List Context Menu\n02000401=\"&Sütunlar...\"\n\n02000411=\"&Aç\"\n02000412=\"&Çıkart...\"\n\n; ToolBar\n02000501=\"Çıkart\"\n\n; Messages\n02000601=\"Bu arşiv üzerinde güncelleme yapamazsınız.\"\n02000602=\"{0} arşivi güncellenemiyor\"\n02000603=\"'{0}' klasörü oluşturulamıyor\"\n02000604=\"Bu dosya bilinen bir arşiv değil.\"\n02000605=\"Hata\"\n02000606=\"Çok fazla öğe\"\n02000607=\"Bu dosya uzantısı ile ilişkili bir uygulama yok\"\n02000608=\"Hata yok.\"\n02000609=\"'{0}' arşiv dosyası olarak açılamıyor.\"\n0200060A=\"'{0}' dosyası açılamıyor. Şifreniz yanlış olabilir mi?\"\n\n; Dialogs\n02000702=\"Tamam\"\n02000705=\"&Evet\"\n02000707=\"Tümüne E&vet\"\n02000709=\"&Hayır\"\n0200070B=\"Tümüne Ha&yır\"\n\n02000710=\"İptal\"\n02000711=\"İ&ptal\"\n02000713=\"&Kapat\"\n02000714=\"Dur\"\n02000715=\"Tekrar başlat\"\n\n02000720=\"Yardım\"\n\n; Extract dialog\n02000800=\"Çıkart\"\n02000801=\"&Çıkartılacak yer:\"\n02000802=\"Parola\"\n\n02000810=\"Yol adları\"\n02000811=\"Tam yol adları\"\n02000812=\"Geçerli yol adları\"\n02000813=\"Yol adları olmasın\"\n\n02000820=\"Olan dosyalar\"\n02000821=\"Üzerine yazmak için sor\"\n02000822=\"Sormadan üzerine yaz\"\n02000823=\"Çıkartma\"\n02000824=\"Arşivdekilere yeni ad ver\"\n02000825=\"Olanlara yeni ad ver\"\n\n02000830=\"Dosyalar\"\n02000831=\"&Seçili dosyalar\"\n02000832=\"&Tüm dosyalar\"\n\n02000881=\"Çıkartılacak dosyalar için bir yer belirleyin.\"\n\n02000890=\"çıkartılıyor\"\n\n; Overwrite dialog\n02000900=\"Üzerine Yazma Durumu\"\n02000901=\"Hedef klasörde bu adla bir dosya var. Üzerine yazılsın mı?\"\n02000902=\"Mevcut dosya:\"\n02000903=\"Çıkartılan dosya:\"\n\n02000911=\"&Yeni ad ver\"\n\n02000982=\"{0} bayt\"\n02000983=\"son değişimi \"\n\n; Messages dialog\n02000A00=\"Tanılayıcı iletiler\"\n\n02000A80=\"İleti\"\n\n02000A91=\"'{0}' için sıkıştırma şekli tanınamadı.\"\n02000A92=\"'{0}' bozuk. (Veri hatası)\"\n02000A93=\"'{0}' bozuk. (CRC hatası)\"\n02000A94=\"Şifrelenmiş '{0}' dosyası hatalı. Şifreniz yanlış olabilir mi?\"\n02000A95=\"'{0}' dosyasında CRC hatası. Şifreniz yanlış olabilir mi?\"\n\n; Password dialog\n02000B00=\"Parola Girişi\"\n02000B01=\"Parolayı girin:\"\n02000B02=\"Par&ola görünsün\"\n02000B03=\"Şifre tekrarı:\"\n02000B10=\"Şifreler birbiriyle uyuşmuyor.\"\n02000B11=\"Şifre için İngilizce harfler, sayılar ve özel karekterden (!, #, $, ...) kullanabilirsiniz.\"\n02000B12=\"Şifre çok uzun\"\n\n; Progress dialog\n02000C00=\"işle\"\n02000C01=\"Geçen süre:\"\n02000C02=\"Kalan süre:\"\n02000C03=\"Boyut:\"\n02000C04=\"Hız:\"\n\n02000C10=\"&Geri planda\"\n02000C11=\"Ö&nde\"\n02000C12=\"&Duraklat\"\n02000C13=\"De&vam et\"\n\n02000C20=\"Durakladı - \"\n\n02000C30=\"İptal edilsin mi?\"\n\n; Compress dialog\n02000D00=\"Arşivle\"\n02000D01=\"&Arşiv:\"\n02000D02=\"&Güncelleme şekli:\"\n02000D03=\"Arşiv &biçimi:\"\n02000D04=\"Sı&kıştırma şekli:\"\n02000D05=\"Ka&tı olsun\"\n02000D06=\"&Parametreler:\"\n02000D07=\"Seçenekler\"\n02000D08=\"Ke&ndi çıkartsın (SFX)\"\n02000D09=\"Ç&ok ilmekli\"\n02000D0A=\"Dosya adlarını şi&frele\"\n02000D0B=\"Sıkıştırma dü&zeyi:\"\n02000D0C=\"&Sözlük boyutu:\"\n02000D0D=\"Ke&lime boyutu:\"\n02000D0E=\"Bellek kullanımı (Sıkıştırma):\"\n02000D0F=\"Bellek kullanımı (Çözme):\"\n02000D10=\"Şifreleme\"\n02000D11=\"Şifreleme metodu:\"\n02000D12=\"İşlemci ilmeklerinin sayısı:\"\n02000D13=\"Aralıksız blok boyutu:\"\n02000D14=\"Aralıklı\"\n02000D15=\"Aralıksız\"\n\n02000D40=\"Bayt/&cilt olarak parçala:\"\n02000D41=\"Yanlış yığın boyutu\"\n02000D42=\"Belirtilen yığın boyutu: {0} bayt.\\nBu boyutta yığınlara ayırmak istediğinizden emin misiniz?\"\n\n02000D81=\"Sıkıştırmasız\"\n02000D82=\"Normal\"\n02000D83=\"Maksimum\"\n02000D84=\"Hızlı\"\n02000D85=\"En hızlı\"\n02000D86=\"Ultra\"\n\n02000D90=\"Gözat\"\n\n02000DA1=\"Dosyaları ekle, olanları çıkart\"\n02000DA2=\"Dosyaları ekle, eskileri güncelle\"\n02000DA3=\"Sadece eskileri güncelle\"\n02000DA4=\"Dosyaları eşitle\"\n\n02000DB1=\"Tüm dosyalar\"\n\n02000DC0=\"sıkıştırılıyor\"\n\n; Columns dialog\n02000E00=\"Sütunlar\"\n02000E01=\"Bu klasörde görülebilir olmasını istediğiniz sütunları işaretleyin. Sütunları sıralamak için yukarı-aşağı düğmelerini kullanın.\"\n02000E02=\"Seçili sütun genişliği\"\n02000E03=\"&piksel olsun.\"\n\n02000E10=\"&Yukarı\"\n02000E11=\"&Aşağı\"\n02000E12=\"&Göster\"\n02000E13=\"Gi&zle\"\n02000E14=\"Tayin et\"\n\n02000E81=\"Başlık\"\n02000E82=\"Genişlik\"\n\n; Testing\n02000F90=\"sınanıyor\"\n\n\n; File Manager\n\n03000000=\"7-Zip Dosya Yöneticisi\"\n\n; Menu\n03000102=\"&Dosya\"\n03000103=\"Dü&zenle\"\n03000104=\"Gö&rüntüle\"\n03000105=\"&Araçlar\"\n03000106=\"&Yardım\"\n03000107=\"Sı&k Kullanılanlar\"\n\n; File\n03000210=\"&Aç\"\n03000211=\"Pa&nelde Aç\"\n03000212=\"Pence&rede Aç\"\n03000220=\"&Görüntüle\"\n03000221=\"Dü&zenle\"\n03000230=\"Yeni a&d ver\"\n03000231=\"K&opyala\"\n03000232=\"&Taşı\"\n03000233=\"&Sil\"\n03000240=\"Öz&ellikler\"\n03000241=\"Açıkla&ma\"\n03000242=\"Toplam kazancı hesapla\"\n03000250=\"Yeni k&lasör\"\n03000251=\"Yeni dos&ya\"\n03000260=\"Çı&k\"\n03000270=\"&Parçala...\"\n03000271=\"&Birleştir...\"\n\n; Edit\n03000310=\"&Geri al\"\n03000311=\"&Yinele\"\n03000320=\"&Kes\"\n03000321=\"K&opyala\"\n03000322=\"Ya&pıştır\"\n03000323=\"&Sil\"\n03000330=\"&Tümünü seç\"\n03000331=\"Tüm seçimi ka&ldır\"\n03000332=\"&Aksini seç\"\n03000333=\"Seç...\"\n03000334=\"Seçimi kaldır...\"\n03000335=\"Bu uzantıyı seç\"\n03000336=\"Uzantılı seçimi kaldır\"\n\n; View\n03000410=\"&Büyük Simgeler\"\n03000411=\"&Küçük Simgeler\"\n03000412=\"&Liste\"\n03000413=\"&Detaylar\"\n03000420=\"Sırasız\"\n03000430=\"Kök Klasörü Aç\"\n03000431=\"Bir Seviye Yukarı\"\n03000432=\"Klasör Geçmişi...\"\n03000440=\"&Yenile\"\n03000449=\"Düz Görünüm\"\n03000450=\"&2 Panel aç\"\n03000451=\"&Araç çubukları\"\n03000460=\"Arşiv çubuğu\"\n03000461=\"Standart çubuk\"\n03000462=\"Büyük düğmeler\"\n03000463=\"Düğme metinleri görünsün\"\n\n; Tools\n03000510=\"&Seçenekler...\"\n03000511=\"&Performans ölçümü\"\n\n; Help\n03000610=\"İç&indekiler...\"\n03000620=\"7-Zip &Hakkında...\"\n\n; Favorites\n03000710=\"Geçerli &klasörü ekle\"\n03000720=\"Yer\"\n\n; Options Dialog\n\n03010000=\"Seçenekler\"\n\n; Plugins\n03010100=\"Eklentiler\"\n03010101=\"&Eklentiler:\"\n03010110=\"Ayarlar...\"\n\n; Edit\n03010200=\"Düzenleyici\"\n03010201=\"Metin &düzenleyici:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"7-Zip ile ilişkilendir:\"\n03010310=\"Eklenti\"\n\n; Settings\n03010400=\"Ayarlar\"\n03010401=\"\\\"..\\\" öğesi görünsün\"\n03010402=\"Gerçek dosya simgeleri görünsün\"\n03010410=\"Sistem menüsü görünsün\"\n03010420=\"&Tüm satır seçilsin\"\n03010421=\"T&ablo çizgileri görünsün\"\n03010430=\"&Alternatif seçim kipi\"\n\n; Strings\n\n03020201=\"Kopyala\"\n03020202=\"Taşı\"\n03020203=\"Kopyalanacak yer:\"\n03020204=\"Taşınacak yer:\"\n03020205=\"kopyalanıyor...\"\n03020206=\"taşınıyor...\"\n03020207=\"Öğelerin kopyalanması veya taşınması bu klasör için mümkün değil.\"\n03020208=\"Bu tür dosyaların parçalarını hareket ettiremezsiniz ve kopyalayamazsınız.\"\n03020208=\"İşlem desteklenmiyor.\"\n03020209=\"Hedef klasörü seçiniz.\"\n\n03020210=\"Dosya Silme Onayı\"\n03020211=\"Klasör Silme Onayı\"\n03020212=\"Birden fazla Dosya Silme Onayı\"\n03020213=\"'{0}' silinsin mi?\"\n03020214=\"'{0}' klasörü ve içindekiler silinsin mi?\"\n03020215=\"{0} silinsin mi?\"\n03020216=\"siliniyor...\"\n03020217=\"Silme Hatası\"\n\n03020220=\"yeni ad veriliyor...\"\n03020221=\"Adlandırma Hatası\"\n03020222=\"Kopyalama Teyidi\"\n03020223=\"Dosyalar arşive kopyalansın mı\"\n\n03020230=\"Yeni klasör\"\n03020231=\"Klasör adı:\"\n03020232=\"Yeni Klasör\"\n03020233=\"Klasör Oluşturma Hatası\"\n\n03020240=\"Yeni dosya\"\n03020241=\"Dosya Adı:\"\n03020242=\"Yeni Dosya\"\n03020243=\"Dosya Oluşturma Hatası\"\n\n03020250=\"Seç\"\n03020251=\"Seçimi kaldır\"\n03020252=\"Seçim ifadesi:\"\n\n03020260=\"Klasör Geçmişi\"\n\n03020280=\"'{0}' dosyası değişmiş.\\nArşivde güncellensin mi?\"\n03020281=\"'{0}' dosyası güncellenemedi\"\n03020282=\"Metin düzenleyici başlatılamadı.\"\n03020283=\"açılıyor...\"\n\n03020290=\"Açıklama\"\n03020291=\"&Açıklama:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"Bilgisayar\"\n03020301=\"Ağ\"\n\n03020400=\"Arşivle\"\n03020401=\"Çıkart\"\n03020402=\"Sına\"\n\n03020420=\"Kopyala\"\n03020421=\"Taşı\"\n03020422=\"Sil\"\n03020423=\"Bilgi\"\n\n03020500=\"Parçala\"\n03020501=\"Şu &klasörde parçala:\"\n03020510=\"parçalanıyor...\"\n03020520=\"Silmeyi onaylayın\"\n03020521=\"Dosyayı {0} parçaya ayırmak istediğinizden emin misiniz?\"\n03020522=\"Parça büyüklüğü, orjinal dosya boyutundan küçük olmalıdır\"\n\n03020600=\"Birleştir\"\n03020601=\"Şu &klasörde birleştir:\"\n03020610=\"birleştiriliyor...\"\n03020620=\"Sadece ilk dosyayı seçiniz\"\n\n03020710=\"Kazanç hesaplanıyor...\"\n03020720=\"Kazanç ilgisi\"\n03020721=\"Verinin CRC kazancı:\"\n03020722=\"Verinin CRC kazancı ve isimler:\"\n\n03020800=\"Taranıyor...\"\n\n; Computer\n03031100=\"Toplam Boyut\"\n03031101=\"Boş Alan\"\n03031102=\"Küme Boyutu\"\n03031103=\"Etiket\"\n\n; Network\n03031200=\"Yerel Ad\"\n03031201=\"Sağlayıcı\"\n\n; Benchmark Dialog\n\n03080000=\"Bilgisayar performansı\"\n03080001=\"Bellek kullanımı:\"\n03080002=\"Sıkıştırılıyor\"\n03080003=\"Ayrıştırılıyor\"\n03080004=\"Hız\"\n03080005=\"Puan\"\n03080006=\"Ortalama Puan\"\n03080007=\"Cari\"\n03080008=\"Sonuç\"\n03080009=\"Başarılı:\"\n0308000A=\"Hatalı:\"\n0308000B=\"İşlemci kullanımı\"\n0308000C=\"Puan / Kullanım\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/tt.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.07 beta\n; Translated by Albert Fazlí (http://soft.beznen.net/)\n;\n;\n;\n;\n\n00000000=\"Tatarish\"\n00000001=\"Tatarça\"\n00000002=\"68\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip Caylaw\"\n\n; Info Page\n01000100=\"7-Zip turında\"\n01000103=\"7-Zip yazılımı buşlay. Alay bulsa da, terkälü aşa anı citeşterü eşenä yärdäm itep bula.\"\n01000105=\"Terkälü\"\n\n; Folders Page\n01000200=\"Törgäklär\"\n01000210=\"&Eş törgäge\"\n01000211=\"&Sistemneñ çorlı törgäge\"\n01000212=\"&Biredäge\"\n01000213=\"Bo&nısı:\"\n01000214=\"Çığarmalı cıharlar öçen genä qullanası\"\n\n01000281=\"Çorlı tuplam biremnäre öçen urınlaşu bilgeläw.\"\n\n; System Page\n01000300=\"Sistem\"\n01000301=\"7-Zip'ne atılma saylaqqa kertäse\"\n01000302=\"Atılma saylaqnı töräse\"\n01000310=\"Atılma saylaq kereme:\"\n\n; Language Page\n01000400=\"Telläşterü\"\n01000401=\"Tel saylaw:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip boyırığı\"\n02000103=\"Tuplamanı Açu\"\n02000104=\"Saylanğan tuplamanı aça.\"\n02000105=\"Biremne Çişü...\"\n02000106=\"Saylanğan tuplama biremnären çişä.\"\n02000107=\"Tuplamağa Östäw...\"\n02000108=\"Saylanğan kermenärne tuplamağa östi.\"\n02000109=\"Tuplamanı Sına\"\n0200010A=\"Saylanğan tuplamanıñ tulılığın tikşerä.\"\n0200010B=\"Bonda Çiş\"\n0200010C=\"Saylanğan tuplama biremnären biredäge törgäkkä çişä.\"\n0200010D=\"Boña Çiş: {0}\"\n0200010E=\"Biremnärne eçtörgäkkä çişä.\"\n0200010F=\"Boña Östä: {0}\"\n02000110=\"Saylanğan keremnärne tuplamağa östi.\"\n02000111=\"Qısıp Cibärü...\"\n02000112=\"Saylanğan keremnärne tuplamağa östäp, şul tuplamanı email aşa cibärä.\"\n02000113=\"Qısıp Cibär, {0} kebek\"\n02000114=\"Saylanğan keremnärne tuplamağa östäp, şul tuplamanı email aşa cibärä.\"\n\n02000140=\"<Törgäk>\"\n02000141=\"<Tuplama>\"\n\n; Properties\n02000203=\"Yul\"\n02000204=\"Adı\"\n02000205=\"Quşımta\"\n02000206=\"Törgäk\"\n02000207=\"Küläm\"\n02000208=\"Qısqan Küläm\"\n02000209=\"Üzençälek\"\n0200020A=\"Yasaldı\"\n0200020B=\"İreşelde\"\n0200020C=\"Üzgärelde\"\n0200020D=\"Özelmäs\"\n0200020E=\"Açıqlamalı\"\n0200020F=\"Serlängän\"\n02000210=\"Bülü Aldında\"\n02000211=\"Bülüdän Soñ\"\n02000212=\"Süznämä\"\n02000213=\"CRC\"\n02000214=\"Törlek\"\n02000215=\"Qarşı\"\n02000216=\"Isul\"\n02000217=\"Host OS\"\n02000218=\"Birem Sisteme\"\n02000219=\"Qullanuçı\"\n0200021A=\"Törkem\"\n0200021B=\"Blok\"\n0200021C=\"Açıqlama\"\n0200021D=\"Urını\"\n\n; Status bar\n02000301=\"{0} cisem saylandı\"\n02000302=\"{0} cisem\"\n\n; List Context Menu\n02000401=\"&Buylar...\"\n\n02000411=\"&Aç\"\n02000412=\"&Çişü...\"\n\n; ToolBar\n02000501=\"Çişü\"\n\n; Messages\n02000601=\"Bu tuplama öçen yañartu eşen uzdırıp bulmí.\"\n02000602=\"Tuplamanı yañartıp buldı: {0}\"\n02000603=\"Törgäkne yasap bulmadı: {0}\"\n02000604=\"Bu birem totılğan tuplamalardan tügel.\"\n02000605=\"Xata\"\n02000606=\"Keremnär artıq küp\"\n02000607=\"Bu birem adındağı quşımtağa kileştergän yazılımnar yuq\"\n02000608=\"Xatalar yuq\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"Ä&ye\"\n02000707=\"&Barına da Äye\"\n02000709=\"Yu&q\"\n0200070B=\"Barına da Y&uq\"\n\n02000710=\"Kiräkmi\"\n02000711=\"&Kiräkmi\"\n02000713=\"&Çığış\"\n02000714=\"Tuqta\"\n02000715=\"Yänä Cibär\"\n\n02000720=\"Yärdäm\"\n\n; Extract dialog\n02000800=\"Çiş\"\n02000801=\"Boña çişä&se:\"\n02000802=\"Sersüz\"\n\n02000810=\"Yullar\"\n02000811=\"Tulı yul adı\"\n02000812=\"Bu yuldan tayanıp\"\n02000813=\"Yullarsız\"\n\n02000820=\"Östän yazıp\"\n02000821=\"Östän yazu aldınnan sorísı\"\n02000822=\"Östän yazu aldınnan soramísı\"\n02000823=\"Bulğan biremne uzası\"\n02000824=\"Adın üzgärtäse\"\n02000825=\"Bulğan birem adın üzgärtäse\"\n\n02000830=\"Biremnär\"\n02000831=\"&Saylanğan biremnär\"\n02000832=\"&Bar biremnär\"\n\n02000881=\"Çiğelgän biremnär öçen urınlaşu törgägen bilgeläw.\"\n\n02000890=\"Çişü\"\n\n; Overwrite dialog\n02000900=\"Birem Almaştırunı Raslaw\"\n02000901=\"Çişü törgägendä eşkärtelä torğan biremnär bar inde.\"\n02000902=\"Şul bar bulğan biremne\"\n02000903=\"bonısına almaştırasımı?\"\n\n02000911=\"Üzennän &Atap tor\"\n\n02000982=\"{0} bayt\"\n02000983=\"üzgärtelüe\"\n\n; Messages dialog\n02000A00=\"Tikşerü beldermäse\"\n\n02000A80=\"Beldermä\"\n\n02000A91=\"'{0}' eçtälegeneñ qısu ısulı totılmí.\"\n02000A92=\"'{0}' eçtälege yaraqsız. Bu birem bozıq.\"\n02000A93=\"'{0}' CRC'se kileşmi. Bu birem bozıq.\"\n\n; Password dialog\n02000B00=\"Sersüz kertü\"\n02000B01=\"Sersüz kertü:\"\n02000B02=\"&Sersüz kürsätäse\"\n\n; Progress dialog\n02000C00=\"Alğa barış\"\n02000C01=\"Uylanğan waqıt:\"\n02000C02=\"Qalğan waqıt:\"\n02000C03=\"Küläm:\"\n02000C04=\"Tizlek:\"\n\n02000C10=\"&Artqı yaqta\"\n02000C11=\"A&lğı yaqta\"\n02000C12=\"&Tuqtap tor\"\n02000C13=\"&Dawam it\"\n\n02000C20=\"Tuqtap tora\"\n\n02000C30=\"Bu eşne çınlap ta özäseme?\"\n\n; Compress dialog\n02000D00=\"Tuplamağa östä\"\n02000D01=\"&Tuplama:\"\n02000D02=\"&Yañartu isulı:\"\n02000D03=\"Tuplama &töre:\"\n02000D04=\"Qısu &ısulı:\"\n02000D05=\"Ö&zelmäs tuplama yasísı\"\n02000D06=\"&Köylämä:\"\n02000D07=\"Köylämälär\"\n02000D08=\"SF&X tuplama yasísı\"\n02000D09=\"Küp-ceple\"\n02000D0A=\"Birem adı&n serlise\"\n02000D0B=\"Qızu &köçe:\"\n02000D0C=\"&Süznämä küläme:\"\n02000D0D=\"Sü&z küläme:\"\n02000D0E=\"Qısqanda Xäter qullanu:\"\n02000D0F=\"Çişkändä Xäter qullanu:\"\n\n02000D40=\"&Töplämgä büläse, bayt:\"\n\n02000D81=\"Saqlap\"\n02000D82=\"Ğädäti\"\n02000D83=\"Bik qısıp\"\n02000D84=\"Tiz\"\n02000D85=\"Bik tiz\"\n02000D86=\"İs kitkeç\"\n\n02000D90=\"Saylaw\"\n\n02000DA1=\"Biremnärne östise dä almaştırası\"\n02000DA2=\"Biremnärne östise dä yañartası\"\n02000DA3=\"Bulğan biremnärne yañartası\"\n02000DA4=\"Biremnärne çordaşlísı\"\n\n02000DB1=\"Bar Biremnär\"\n\n02000DC0=\"Qısu\"\n\n; Columns dialog\n02000E00=\"Buylar\"\n02000E01=\"Bu törgäktä küräse kilgän buylarnı saylaw. Buylarnıñ tezeleşen üzgärtü öçen, Öskäräk/Asqaraq töymälären qullanası.\"\n02000E02=\"Saylanğan buy \"\n02000E03=\"tap &kiñlegendä bulırğa tieş.\"\n\n02000E10=\"Ös&käräk\"\n02000E11=\"As&qaraq\"\n02000E12=\"Kü&rsät\"\n02000E13=\"&Yäşer\"\n02000E14=\"Quy\"\n\n02000E81=\"Başlıq\"\n02000E82=\"Kiñlek\"\n\n; Testing\n02000F90=\"Sınaw\"\n\n\n; File Manager\n\n03000000=\"7-Zip Birem İdäräçe\"\n\n; Menu\n03000102=\"&Birem\"\n03000103=\"Ü&zgärtü\"\n03000104=\"&Küreneş\"\n03000105=\"&Qoral\"\n03000106=\"&Yärdäm\"\n03000107=\"&Saylanma\"\n\n; File\n03000210=\"&Aç\"\n03000211=\"&Üzendä Aç\"\n03000212=\"&Tıştan Aç\"\n03000220=\"&Eçtälege\"\n03000221=\"Ü&zgärtü\"\n03000230=\"İse&m Quşu\"\n03000231=\"Boña &Kübäytü...\"\n03000232=\"Boña Küçe&rü...\"\n03000233=\"&Beter\"\n03000240=\"&Üzençälege\"\n03000241=\"Açıqla&ma\"\n03000250=\"Törgäk Yasaw...\"\n03000251=\"Birem Yasaw...\"\n03000260=\"Çı&ğış\"\n03000270=\"Biremne &Bülü...\"\n03000271=\"Biremnärne &Berläşterü...\"\n\n; Edit\n03000310=\"Kire a&l\"\n03000311=\"Kire &qaq\"\n03000320=\"Ki&sep al\"\n03000321=\"&İskä al\"\n03000322=\"&Östäp quy\"\n03000323=\"&Beter\"\n03000330=\"B&arın da Sayla\"\n03000331=\"Saylanunı Beter\"\n03000332=\"K&ire Saylap\"\n03000333=\"Saylanğan itü\"\n03000334=\"Saylanmağan itü\"\n03000335=\"Törne Saylanğan itü\"\n03000336=\"Törne Saylanmağan itü\"\n\n; View\n03000410=\"&Olı Tamğa\"\n03000411=\"&Keçe Tamğa\"\n03000412=\"&Tezmä\"\n03000413=\"&Cäymä\"\n03000420=\"Tezmiçä\"\n03000430=\"Töp Torgäkne Aç\"\n03000431=\"Ber Adımğa Öskä\"\n03000432=\"Utkän Törgäklär...\"\n03000440=\"&Yañart\"\n03000450=\"&2 Taqta\"\n03000451=\"&Qoraltirä\"\n03000460=\"Tuplama Qoraltiräse\"\n03000461=\"Töp Qoraltirä\"\n03000462=\"Olı Töymälär\"\n03000463=\"Töymä Yazması belän\"\n\n; Tools\n03000510=\"&Caylaw...\"\n03000511=\"Ci&tezlek\"\n\n; Help\n03000610=\"&Eçtälek...\"\n03000620=\"7-Zip &Turında...\"\n\n; Favorites\n03000710=\"&Törgäkne bolay itep östä:\"\n03000720=\"Bitbilge\"\n\n; Options Dialog\n\n03010000=\"Caylaw\"\n\n; Plugins\n03010100=\"Östämä\"\n03010101=\"&Östämä:\"\n03010110=\"Caylaw...\"\n\n; Edit\n03010200=\"Tözätkeç\"\n03010201=\"&Tözätkeç:\"\n\n; System\n03010300=\"Sistem\"\n03010302=\"7-Zip belän Kileşter:\"\n03010310=\"Östämä\"\n\n; Settings\n03010400=\"Caylaw\"\n03010401=\"Tezmädä \\\"..\\\" törgägen kürsätäse\"\n03010402=\"Birem tamğasın kürsätäse\"\n03010410=\"Sistem saylağın kürsätäse\"\n03010420=\"Yulnı &tulayım saylísı\"\n03010421=\"Yulara sızıq &kürsätäse\"\n\n; Strings\n\n03020201=\"İskä\"\n03020202=\"Küçer\"\n03020203=\"Boña kübäyt:\"\n03020204=\"Boña küçer:\"\n03020205=\"Kübäytü...\"\n03020206=\"Küçerü...\"\n03020207=\"Bu törgäk öçen keremnärne kübäytep/küçerep bulmí.\"\n03020208=\"Bonı eşläp bulmí.\"\n\n03020210=\"Birem Beterüne Raslaw\"\n03020211=\"Törgäk Beterüne Raslaw\"\n03020212=\"Biremnärne Küpläp Beterüne Raslaw\"\n03020213=\"Bonı çınlap ta beteräseme: '{0}'?\"\n03020214=\"Bu törgäkne anıñ bar eçtälege belän çınlap ta beteräseme: '{0}'?\"\n03020215=\"Bu {0} keremne çınlap ta beteräseme?\"\n03020216=\"Beterü...\"\n03020217=\"Birem/Törgäkne Beterü Xatası\"\n\n03020220=\"İsem quşu...\"\n03020221=\"Birem/Törgäkkä İsem quşu Xatası\"\n\n03020230=\"Törgäk Yasaw\"\n03020231=\"Törgäk adı:\"\n03020232=\"Yaña Törgäk\"\n03020233=\"Törgäk Yasaw Xatası\"\n\n03020240=\"Birem Yasaw\"\n03020241=\"Birem Adı:\"\n03020242=\"Yaña Birem\"\n03020243=\"Birem Yasaw Xatası\"\n\n03020250=\"Saylağan it\"\n03020251=\"Saylanmağan it\"\n03020252=\"Ürnäk:\"\n\n03020260=\"Uzğan Törgäklär\"\n\n03020280=\"'{0}' atlı birem üzgärtelde.\\nAnı tuplamada da yañartasımı?\"\n03020281=\"Biremne yañartıp bulmadı\\n'{0}'\"\n03020282=\"Tözätkeçne cibärep bulmadı.\"\n03020283=\"Açu...\"\n\n03020290=\"Açıqlama\"\n03020291=\"&Açıqlama:\"\n\n030202A0=\"Sistem\"\n\n03020300=\"Sanaq\"\n03020301=\"Çeltär\"\n\n03020400=\"Östä\"\n03020401=\"Çiş\"\n03020402=\"Sına\"\n\n03020420=\"Kübäyt\"\n03020421=\"Küçer\"\n03020422=\"Beter\"\n03020423=\"Turında\"\n\n03020500=\"Biremne Bül\"\n03020501=\"&Boña büläse:\"\n03020510=\"Bülderü...\"\n\n03020600=\"Biremne Ber it\"\n03020601=\"&Boña ber itäse:\"\n03020610=\"Berläşterü...\"\n\n; Computer\n03031100=\"Barlıq Küläm\"\n03031101=\"Buş Alan\"\n03031102=\"Börtek Küläme\"\n03031103=\"Yazma\"\n\n; Network\n03031200=\"Cirle Atama\"\n03031201=\"Tä'minçe\"\n\n; Benchmark Dialog\n\n03080000=\"Citezlek\"\n03080001=\"Xäter totıla:\"\n03080002=\"Qısqanda\"\n03080003=\"Çişkändä\"\n03080004=\"Tizlek\"\n03080005=\"Köç\"\n03080006=\"Köç Yomğağı\"\n03080007=\"Biredä\"\n03080008=\"Näticä\"\n03080009=\"Eşläp çığu:\"\n0308000A=\"Xatalar:\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/uk.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.60 beta\n; Translated by Misha Padalka\n;\n;\n;\n;\n\n00000000=\"Ukrainian\"\n00000001=\"Українська\"\n00000002=\"34\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Налаштування 7-Zip\"\n\n; Info Page\n01000100=\"Про 7-Zip\"\n01000103=\"7-Zip - це вільне програмне забезпечення. Але Ви можете допомогти розробці 7-zip за допомогою реєстрації.\"\n01000104=\"Підтримка\"\n01000105=\"Зареєструватися\"\n\n; Folders Page\n01000200=\"Теки\"\n01000210=\"&Робоча тека\"\n01000211=\"&Системна тека тимчасових файлів\"\n01000212=\"&Поточна\"\n01000213=\"&Задана:\"\n01000214=\"Використовувати тільки для змінних носіїв\"\n\n01000281=\"Вкажіть розташування тимчасових архівних файлів.\"\n\n; System Page\n01000300=\"Система\"\n01000301=\"Інтегрувати 7-Zip до контекстного меню оболонки\"\n01000302=\"Каскадне контекстне меню\"\n01000310=\"Пункти контекстного меню:\"\n\n; Language Page\n01000400=\"Мова\"\n01000401=\"Мова:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Команди 7-Zip\"\n02000103=\"Відкрити архів\"\n02000104=\"Відкриває вибраний архів.\"\n02000105=\"Видобути файли...\"\n02000106=\"Видобуває файли з вибраного архіву.\"\n02000107=\"Додати до архіву...\"\n02000108=\"Додає вибрані елементи до архіву.\"\n02000109=\"Перевірити архів\"\n0200010A=\"Перевіряє цілісність вибраного архіву.\"\n0200010B=\"Видобути тут\"\n0200010C=\"Видобуває файли з вибраного архіву до поточної теки.\"\n0200010D=\"Видобути до {0}\"\n0200010E=\"Видобуває файли до теки.\"\n0200010F=\"Додати до {0}\"\n02000110=\"Додає вибрані елементи до архіву.\"\n02000111=\"Стиснути та надіслати...\"\n02000112=\"Стискає вибрані елементи та надсилає архів електронною поштою.\"\n02000113=\"Стиснути до {0} та надіслати\"\n02000114=\"Стискає вибрані елементи та надсилає архів електронною поштою.\"\n\n02000140=\"<Тека>\"\n02000141=\"<Архів>\"\n\n; Properties\n02000203=\"Шлях\"\n02000204=\"Назва\"\n02000205=\"Розширення\"\n02000206=\"Тека\"\n02000207=\"Розмір\"\n02000208=\"Розмір в архіві\"\n02000209=\"Атрибути\"\n0200020A=\"Створено\"\n0200020B=\"Останній доступ\"\n0200020C=\"Змінено\"\n0200020D=\"Неперервний\"\n0200020E=\"З коментарем\"\n0200020F=\"Зашифровано\"\n02000210=\"Розбитий до\"\n02000211=\"Розбитий після\"\n02000212=\"Словник\"\n02000213=\"CRC\"\n02000214=\"Тип\"\n02000215=\"Анти\"\n02000216=\"Метод\"\n02000217=\"Операційна система\"\n02000218=\"Файлова система\"\n02000219=\"Користувач\"\n0200021A=\"Група\"\n0200021B=\"Блок\"\n0200021C=\"Коментар\"\n0200021D=\"Позиція\"\n0200021E=\"Префікс шляху\"\n0200021F=\"Тек\"\n02000220=\"Файлів\"\n02000221=\"Версія\"\n02000222=\"Частина\"\n02000223=\"З декількох частин\"\n02000224=\"Зміщення\"\n02000225=\"Посилань\"\n02000226=\"Блоків\"\n02000227=\"Частин\"\n\n02000229=\"64-біт\"\n0200022A=\"Big-endian\"\n0200022B=\"Процесор\"\n0200022C=\"Фізичний розмір\"\n0200022D=\"Розмір заголовків\"\n0200022E=\"Контрольна сума\"\n0200022F=\"Властивості\"\n02000230=\"Віртуальна адреса\"\n\n; Status bar\n02000301=\"{0} об'єкт(ів) вибрано\"\n02000302=\"{0} об'єкт(ів)\"\n\n02000320=\"Файлів:\"\n02000321=\"Тек:\"\n02000322=\"Розмір:\"\n02000323=\"Розмір після стиснення:\"\n02000324=\"Архівів:\"\n\n; List Context Menu\n02000401=\"&Колонки...\"\n\n02000411=\"&Відкрити\"\n02000412=\"&Видобути...\"\n\n; ToolBar\n02000501=\"Видобути\"\n\n; Messages\n02000601=\"Операція оновлення не підтримується для даного архіву.\"\n02000602=\"Не можу оновити архів {0}\"\n02000603=\"Не можу створити теку '{0}'\"\n02000604=\"Файл не є підтримуваним архівом.\"\n02000605=\"Помилка\"\n02000606=\"Забагато елементів\"\n02000607=\"Немає програми, пов'язаної з даним розширенням\"\n02000608=\"Без помилок\"\n02000609=\"Не можу відкрити файл '{0}' як архів\"\n0200060A=\"Не можу відкрити зашифрований архів '{0}'. Хибний пароль?\"\n0200060B=\"Система не може виділити необхідний обсяг пам'яті\"\n0200060C=\"Невідома помилка\"\n0200060D=\"Непідтримуватий тип архіву\"\n\n; Dialogs\n02000702=\"Гаразд\"\n02000705=\"&Так\"\n02000707=\"Так для &всіх\"\n02000709=\"&Ні\"\n0200070B=\"Ні для вс&іх\"\n\n02000710=\"Скасувати\"\n02000711=\"&Скасувати\"\n02000713=\"&Закрити\"\n02000714=\"Зупинити\"\n02000715=\"Перезапустити\"\n\n02000720=\"Довідка\"\n\n; Extract dialog\n02000800=\"Видобути\"\n02000801=\"В&идобути до:\"\n02000802=\"Пароль\"\n\n02000810=\"Обробка шляхів\"\n02000811=\"Повні шляхи\"\n02000812=\"Відносні шляхи\"\n02000813=\"Без шляхів\"\n\n02000820=\"Режим перезапису\"\n02000821=\"Запитувати перед перезаписом\"\n02000822=\"Перезаписувати без попередження\"\n02000823=\"Пропускати існуючі файли\"\n02000824=\"Автоматично перейменовувати\"\n02000825=\"Автоматично перейменовувати існуючі файли\"\n\n02000830=\"Файли\"\n02000831=\"&Вибрані файли\"\n02000832=\"&Всі файли\"\n\n02000881=\"Вкажіть розміщення видобуваних файлів.\"\n\n02000890=\"Видобування\"\n\n; Overwrite dialog\n02000900=\"Підтвердіть заміну файлу\"\n02000901=\"Тека призначення вже містить оброблюваний файл.\"\n02000902=\"Ви бажаєте замінити існуючий файл\"\n02000903=\"Цим?\"\n\n02000911=\"А&втоматично перейменовувати\"\n\n02000982=\"{0} байт\"\n02000983=\"змінений\"\n\n; Messages dialog\n02000A00=\"Діагностичні повідомлення\"\n\n02000A80=\"Повідомлення\"\n\n02000A91=\"Непідтривуваний метод стиску для '{0}'.\"\n02000A92=\"Помилка даний у '{0}'. Файл пошкоджено.\"\n02000A93=\"Збій контрольної суми в '{0}'. Файл пошкоджено.\"\n02000A94=\"Помилка даних у зашифрованому файлі '{0}'. Хибний пароль?\"\n02000A95=\"Помилка контрольної суми у зашифрованому файлі '{0}'. Хибний пароль?\"\n\n; Password dialog\n02000B00=\"Введіть пароль\"\n02000B01=\"Введіть пароль:\"\n02000B02=\"&Показувати пароль\"\n02000B03=\"Повторіть пароль:\"\n02000B10=\"Паролі не співпадають\"\n02000B11=\"Для паролю використовуйте лише англійські літери, цифри та спеціальні символи (!, #, $, ...)\"\n02000B12=\"Пароль занадто довгий\"\n\n; Progress dialog\n02000C00=\"Процес\"\n02000C01=\"Пройшло:\"\n02000C02=\"Залишилося:\"\n02000C03=\"Розмір:\"\n02000C04=\"Швидкість:\"\n02000C05=\"Оброблено:\"\n02000C06=\"Ступінь стиску:\"\n\n02000C10=\"&На задньому плані\"\n02000C11=\"&На передньому плані\"\n02000C12=\"&Пауза\"\n02000C13=\"&Продовжити\"\n\n02000C20=\"Призупинено\"\n\n02000C30=\"Ви впевнені, що бажаєте скасувати?\"\n\n; Compress dialog\n02000D00=\"Додати до архіву\"\n02000D01=\"&Архів:\"\n02000D02=\"&Режим оновлення:\"\n02000D03=\"&Формат архіву:\"\n02000D04=\"&Метод стискання:\"\n02000D05=\"Створити &неперервний архів\"\n02000D06=\"&Параметри:\"\n02000D07=\"Налаштування\"\n02000D08=\"Створити архів, що сам &видобувається\"\n02000D09=\"Багатопоточність\"\n02000D0A=\"Шифрувати &назви файлів\"\n02000D0B=\"&Ступінь стиску:\"\n02000D0C=\"&Розмір словника:\"\n02000D0D=\"&Розмір слова:\"\n02000D0E=\"Необхідно пам'яті для стискання:\"\n02000D0F=\"Необхідно пам'яті для видобування:\"\n02000D10=\"Шифрування\"\n02000D11=\"Метод шифрування:\"\n02000D12=\"Кількість потоків:\"\n02000D13=\"Розмір блоку:\"\n02000D14=\"За розміром файлу\"\n02000D15=\"Неперервний\"\n02000D16=\"Стискати відкриті на запис файли\"\n\n02000D40=\"Розділити на &частини, байт:\"\n02000D41=\"Хибний розмір частини\"\n02000D42=\"Заданий розмір частини: {0} байт.\\nВи впевнені, що бажаєте розбити архів на такі частини?\"\n\n02000D81=\"Без стиску\"\n02000D82=\"Нормальна\"\n02000D83=\"Максимальна\"\n02000D84=\"Швидка\"\n02000D85=\"Найшвидша\"\n02000D86=\"Ультра\"\n\n02000D90=\"Переглянути\"\n\n02000DA1=\"Додати та замінити файли\"\n02000DA2=\"Оновити та замінити файли\"\n02000DA3=\"Оновити існуючі файли\"\n02000DA4=\"Синхронізувати файли\"\n\n02000DB1=\"Всі файли\"\n\n02000DC0=\"Стискання\"\n\n; Columns dialog\n02000E00=\"Колонки\"\n02000E01=\"Позначте колонки, які ви бажаєте показувати в даній теці. Використовуйте кнопки \\\"Змістити вгору\\\" та \\\"Змістити вниз\\\" для зміни порядку колонок.\"\n02000E02=\"Вибрана колонка має бути &шириною\"\n02000E03=\"пікселів.\"\n\n02000E10=\"Змістити &вгору\"\n02000E11=\"Змістити &вниз\"\n02000E12=\"&Показати\"\n02000E13=\"П&риховати\"\n02000E14=\"Встановити\"\n\n02000E81=\"Заголовок\"\n02000E82=\"Ширина\"\n\n; Testing\n02000F90=\"Тестування\"\n\n\n; File Manager\n\n03000000=\"Менеджер файлів 7-Zip\"\n\n; Menu\n03000102=\"&Файл\"\n03000103=\"&Редагування\"\n03000104=\"&Вигляд\"\n03000105=\"&Інструменти\"\n03000106=\"&Допомога\"\n03000107=\"&Улюблене\"\n\n; File\n03000210=\"&Відкрити\"\n03000211=\"Відкрити в&середині\"\n03000212=\"Відкрити &зовні\"\n03000220=\"&Переглянути\"\n03000221=\"&Редагувати\"\n03000230=\"Змінити &назву\"\n03000231=\"&Копіювати до...\"\n03000232=\"&Перемістити до...\"\n03000233=\"Ви&далити\"\n03000240=\"В&ластивості\"\n03000241=\"Комет&ар\"\n03000242=\"Обчислити контрольну суму\"\n03000250=\"Створити теку\"\n03000251=\"Створити файл\"\n03000260=\"Ви&хід\"\n03000270=\"&Розбити файл...\"\n03000271=\"Ск&ласти файли...\"\n\n; Edit\n03000310=\"&Скасувати\"\n03000311=\"&Повернути\"\n03000320=\"Ви&різати\"\n03000321=\"&Копіювати\"\n03000322=\"&Вставити\"\n03000323=\"Ви&далити\"\n03000330=\"Вибрати &всі\"\n03000331=\"Зняти вибір\"\n03000332=\"&Інвертувати вибір\"\n03000333=\"Вибрати...\"\n03000334=\"Зняти вибір...\"\n03000335=\"Вибрати за типом\"\n03000336=\"Зняти вибір за типом\"\n\n; View\n03000410=\"Вели&кі значки\"\n03000411=\"&Маленькі значки\"\n03000412=\"&Список\"\n03000413=\"&Таблиця\"\n03000420=\"Без сортування\"\n03000430=\"Відкрити кореневу теку\"\n03000431=\"Вгору на один рівень\"\n03000432=\"Історія тек...\"\n03000440=\"&Оновити\"\n03000449=\"Плоский вигляд\"\n03000450=\"&2 панелі\"\n03000451=\"&Панелі інструментів\"\n03000460=\"Панель архіву\"\n03000461=\"Стандартна панель\"\n03000462=\"Великі кнопки\"\n03000463=\"Текст на кнопках\"\n\n; Tools\n03000510=\"&Налаштування...\"\n03000511=\"&Тестування швидкості\"\n\n; Help\n03000610=\"&Зміст...\"\n03000620=\"&Про 7-Zip...\"\n\n; Favorites\n03000710=\"&Додати теку до улюблених як\"\n03000720=\"Закладка\"\n\n; Options Dialog\n\n03010000=\"Options\"\n\n; Plugins\n03010100=\"Модулі\"\n03010101=\"&Модулі:\"\n03010110=\"Параметри...\"\n\n; Edit\n03010200=\"Редактор\"\n03010201=\"&Редактор:\"\n\n; System\n03010300=\"Система\"\n03010302=\"Пов'язати 7-Zip з:\"\n03010310=\"Модуль\"\n\n; Settings\n03010400=\"Налаштування\"\n03010401=\"Показувати елемент \\\"..\\\"\"\n03010402=\"Показувати системні значки\"\n03010410=\"Показувати системне меню\"\n03010420=\"&Вибір цілого рядка\"\n03010421=\"Показувати &сітку\"\n03010430=\"&Альтернативний режим виділення\"\n03010440=\"Використовувати в&еликі сторінки пам'яті\"\n\n; Strings\n\n03020201=\"Копіювати\"\n03020202=\"Перемістити\"\n03020203=\"Копіювати до:\"\n03020204=\"Перемістити до:\"\n03020205=\"Копіювання...\"\n03020206=\"Переміщення...\"\n03020207=\"Ви не можете переміщувати чи копіювати елементи для таких тек.\"\n03020208=\"Операція не підтримується.\"\n03020209=\"Вкажіть теку призначення.\"\n\n03020210=\"Підтвердіть видалення файлу\"\n03020211=\"Підтвердіть видалення теки\"\n03020212=\"Підтвердіть видалення декількох файлів\"\n03020213=\"Ви впевнені, що бажаєте видалити '{0}'?\"\n03020214=\"Ви впевнені, що бажаєте видалити теку '{0}' і весь її вміст?\"\n03020215=\"Ви впевнені, що бажаєте видалити ці {0} елементів?\"\n03020216=\"Видалення...\"\n03020217=\"Помилка при видалення файлу чи теки\"\n03020218=\"Система не може пересунути файл з довгим шляхом у Кошик\"\n\n03020220=\"Зміна назви...\"\n03020221=\"Помилка при зміні назви файлу чи теки\"\n03020222=\"Підтвердіть копіювання файлу\"\n03020223=\"Ви впевнені, що хочете скопіювати файли в архів\"\n\n03020230=\"Створити теку\"\n03020231=\"Назва теки:\"\n03020232=\"Нова тека\"\n03020233=\"Помилка при створенні теки\"\n\n03020240=\"Створити файл\"\n03020241=\"Назва файлу:\"\n03020242=\"Новий файл\"\n03020243=\"Помилка при створенні файлу\"\n\n03020250=\"Вибрати\"\n03020251=\"Зняти вибір\"\n03020252=\"Маска:\"\n\n03020260=\"Історія тек\"\n\n03020280=\"Файл '{0}' було змінено.\\nВи бажаєте оновити його в архіві?\"\n03020281=\"Не можу оновити файл\\n'{0}'\"\n03020282=\"Не можу запустити редактор.\"\n03020283=\"Відкриття...\"\n03020284=\"Файл схожий на вірус (назва містить довгі пропуски).\"\n\n03020290=\"Коментар\"\n03020291=\"&Коментар:\"\n\n030202A0=\"Системне\"\n\n03020300=\"Комп'ютер\"\n03020301=\"Мережа\"\n03020302=\"Документи\"\n\n03020400=\"Додати\"\n03020401=\"Витягнути\"\n03020402=\"Тестувати\"\n\n03020420=\"Копіювати\"\n03020421=\"Перемістити\"\n03020422=\"Видалити\"\n03020423=\"Інформація\"\n\n03020500=\"Розбити файл\"\n03020501=\"&Розбити до:\"\n03020510=\"Розбиття...\"\n03020520=\"Підтвердіть розбиття\"\n03020521=\"Ви впевнені, що бажаєте розбити архів на {0} частин?\"\n03020522=\"Розмір частини має бути меншим за розмір вихідного файлу\"\n\n03020600=\"Склеїти файли\"\n03020601=\"&Склеїти до:\"\n03020610=\"Склеювання...\"\n03020620=\"Виберіть тільки перший файл\"\n03020621=\"Файл не схожий на частину розбитого файлу\"\n03020622=\"Не можу знайти більше однієї частини розбитого файлу\"\n\n03020710=\"Обчислення контрольної суми...\"\n03020720=\"Інформація про контрольну суму\"\n03020721=\"Контрольна сума для даних:\"\n03020722=\"Контрольна сума для даних та назв:\"\n\n03020800=\"Сканування...\"\n\n03020900=\"Властивості\"\n\n03020A01=\"Дія не може бути виконана в теці з довгим шляхом.\"\n03020A02=\"Виберіть один файл\"\n03020A03=\"Виберіть один або більше файлів\"\n03020A04=\"Файл {0} вже існує\"\n\n; Computer\n03031100=\"Загальний розмір\"\n03031101=\"Вільний простір\"\n03031102=\"Розмір кластеру\"\n03031103=\"Мітка\"\n\n; Network\n03031200=\"Локальна назва\"\n03031201=\"Джерело\"\n\n; Benchmark Dialog\n\n03080000=\"Тестування швидкості\"\n03080001=\"Використання пам'яті:\"\n03080002=\"Стискання\"\n03080003=\"Витягування\"\n03080004=\"Швидкість\"\n03080005=\"Рейтинг\"\n03080006=\"Загальний рейтинг\"\n03080007=\"Поточний\"\n03080008=\"Результат\"\n03080009=\"Проходів:\"\n0308000A=\"Помилок:\"\n0308000B=\"Завантаження процесора\"\n0308000C=\"Рейтинг / Завантаження\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/uz.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.30\n; Translated by Sherzod Mamatkulov\n;\n;\n;\n;\n\n00000000=\"Uzbek\"\n00000001=\"O'zbek\"\n00000002=\"67\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip tanlovlari\"\n\n; Info Page\n01000100=\"7-Zip haqida\"\n01000103=\"7-Zip bepul dasturiy ta'minot. Binobarin, siz uni qayd qildirish orqali qo'llab-quvvatlashingiz mumkin.\"\n01000104=\"Yordam\"\n01000105=\"Qayd qilish\"\n\n; Folders Page\n01000200=\"Papkalar\"\n01000210=\"&Ish papkasi\"\n01000211=\"Tizim &vaqtinchalik papkasi\"\n01000212=\"&Joriy papka\"\n01000213=\"&Tayinlangan:\"\n01000214=\"Faqat olinadigan drayvlar uchun ishlat\"\n\n01000281=\"Vaqtinchalik arxiv fayllari uchun manzilni tayinlang.\"\n\n; System Page\n01000300=\"Tizim\"\n01000301=\"7-Zipni qobiq kontekst menyusiga qo'sh\"\n01000302=\"Kontekst menyusi pog'onali\"\n01000310=\"Kontekst menyu bandlari:\"\n\n; Language Page\n01000400=\"Til\"\n01000401=\"Til:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip buyruqlari\"\n02000103=\"Arxivni och\"\n02000104=\"Tanlangan arxivni ochadi.\"\n02000105=\"Fayllarni ajrat...\"\n02000106=\"Tanlangan arxivdan fayllarni ajratadi.\"\n02000107=\"Arxivga qo'sh...\"\n02000108=\"Tanlangan qismlarni arxivga qo'shadi.\"\n02000109=\"Arxivni sina\"\n0200010A=\"Tanlangan arxivning butunligini tekshiradi.\"\n0200010B=\"Shu joyga ajrat\"\n0200010C=\"Tanlangan arxivdagi fayllarni joriy papkaga ajratadi.\"\n0200010D=\"{0}ga ajrat\"\n0200010E=\"Fayllarni nimpapkaga ajratadi.\"\n0200010F=\"{0}ga qo'sh\"\n02000110=\"Tanlangan qismlarni arxivga qo'shadi.\"\n02000111=\"Siq va emailda jo'nat...\"\n02000112=\"Tanlangan qismlarni arxivga siqib, email orqali jo'natadi.\"\n02000113=\"{0}ga siq va emailda jo'nat\"\n02000114=\"Tanlangan qismlarni arxivga siqib, email orqali jo'natadi.\"\n\n02000140=\"<Papka>\"\n02000141=\"<Arxiv>\"\n\n; Properties\n02000203=\"Yo'lak\"\n02000204=\"Nomi\"\n02000205=\"Kengaytma\"\n02000206=\"Papka\"\n02000207=\"Hajmi\"\n02000208=\"Siqilgan hajmi\"\n02000209=\"Atributlari\"\n0200020A=\"Yaratilgan\"\n0200020B=\"Ochilgan\"\n0200020C=\"O'zgartirilgan\"\n0200020D=\"Yaxlit\"\n0200020E=\"Sharhlangan\"\n0200020F=\"Tilsimlangan\"\n02000210=\"Bundan oldin bo'laklangan\"\n02000211=\"Bundan keyin bo'laklangan\"\n02000212=\"Lug'at\"\n02000213=\"CRC\"\n02000214=\"Turi\"\n02000215=\"Anti\"\n02000216=\"Uslub\"\n02000217=\"Mezbon OS\"\n02000218=\"Fayl tizimi\"\n02000219=\"Foydalanuvchi\"\n0200021A=\"Guruh\"\n0200021B=\"Block\"\n0200021C=\"Sharh\"\n0200021D=\"Joylashuv\"\n\n; Status bar\n02000301=\"{0} ta qism tanlangan\"\n02000302=\"{0} ta qism\"\n\n; List Context Menu\n02000401=\"&Ustunlar...\"\n\n02000411=\"&Ochish\"\n02000412=\"&Ajrat...\"\n\n; ToolBar\n02000501=\"Ajrat\"\n\n; Messages\n02000601=\"Bu arxivga nisbatan yangilash amallari bajarilmaydi.\"\n02000602=\"{0} arxivini yagilay olmadim\"\n02000603=\"'{0}' papkasini yarata olmadim\"\n02000604=\"Ushbu fayl tushunarli arxiv emas.\"\n02000605=\"Xato\"\n02000606=\"Qismlar o'ta ko'p\"\n02000607=\"Berilgan fayl nomi kengaytmasi bilan hechqanday dastur biriktirilmagan\"\n02000608=\"Hechqanday xato yo'q\"\n\n; Dialogs\n02000702=\"OK\"\n02000705=\"&Ha\"\n02000707=\"H&ammasiga ha\"\n02000709=\"&Yo'q\"\n0200070B=\"Hammasiga y&o'q\"\n\n02000710=\"Bekor\"\n02000711=\"&Bekor\"\n02000713=\"&Yopish\"\n02000714=\"To'xta\"\n02000715=\"Qayta boshla\"\n\n02000720=\"Yordam\"\n\n; Extract dialog\n02000800=\"Ajratish\"\n02000801=\"&Buyerga ajrat:\"\n02000802=\"Parol\"\n\n02000810=\"Yo'lak uslubi\"\n02000811=\"To'liq yo'lak nomlari\"\n02000812=\"Joriy yo'lak nomlari\"\n02000813=\"Yo'lak nomi yo'q\"\n\n02000820=\"Ustidan yozish uslubi\"\n02000821=\"Yozib yuborishdan oldin so'ra\"\n02000822=\"So'ramasdan yozib yubor\"\n02000823=\"Oldindan mavjud fayllarni tashlab ket\"\n02000824=\"Avtomatik tarzda qayta nomla\"\n02000825=\"Mavjud fayllarni avto qayta nomla\"\n\n02000830=\"Fayllar\"\n02000831=\"&Tanlangan fayllar\"\n02000832=\"&Barcha fayllar\"\n\n02000881=\"Ajratilgan fayllar uchun manzil tayinlang.\"\n\n02000890=\"Ajratilmoqda\"\n\n; Overwrite dialog\n02000900=\"Fayl ustidan yozishni tasdiqlash\"\n02000901=\"Manziliy papkada ishlangan fayl oldindan mavjud.\"\n02000902=\"Mavjud faylni\"\n02000903=\"bunisi bilan almashtirasizmi?\"\n\n02000911=\"A&vtomatik tarzda qayta nomla\"\n\n02000982=\"{0} bayt\"\n02000983=\"o'zgargan sanasi\"\n\n; Messages dialog\n02000A00=\"Diagnostik xabarlar\"\n\n02000A80=\"Xabar\"\n\n02000A91=\"'{0}'dagi siquv metodi notanish.\"\n02000A92=\"'{0}'da data xatosi yuz berdi. Fayl zararlangan.\"\n02000A93=\"'{0}'da CRC amalga oshmadi. Fayl zararlangan.\"\n\n; Password dialog\n02000B00=\"Parolni kiritish\"\n02000B01=\"Parolni kiriting:\"\n02000B02=\"&Parolni ko'rsat\"\n\n; Progress dialog\n02000C00=\"Jarayon\"\n02000C01=\"O'tgan vaqt:\"\n02000C02=\"Qolgan vaqt:\"\n02000C03=\"Hajm:\"\n02000C04=\"Tezlik:\"\n\n02000C10=\"&Orqa fon\"\n02000C11=\"Ol&di fon\"\n02000C12=\"&Pauza\"\n02000C13=\"&Davom et\"\n\n02000C20=\"Pauza qilingan\"\n\n02000C30=\"Rostdan ham bekor qilishni istaysizmi?\"\n\n; Compress dialog\n02000D00=\"Arxivga qo'shish\"\n02000D01=\"&Arxiv:\"\n02000D02=\"&Yangilash uslubi:\"\n02000D03=\"Arxiv &formati:\"\n02000D04=\"&Siquv metodi:\"\n02000D05=\"&Yaxlit arxiv yarat\"\n02000D06=\"&Parametrlar:\"\n02000D07=\"Tanlovlar\"\n02000D08=\"SF&X arxiv yarat\"\n02000D09=\"Ko'p-bo'limda\"\n02000D0A=\"Fayl &nomlarini tilsimla\"\n02000D0B=\"Siq&uv bosqichi:\"\n02000D0C=\"&Lug'at hajmi:\"\n02000D0D=\"So'z haj&mi:\"\n02000D0E=\"Siquvda ishlatiladigan xotira:\"\n02000D0F=\"Ajratuvda ishlatiladigan xotira:\"\n\n02000D40=\"&Tomlarga bo'lakla, bayt:\"\n\n02000D81=\"Saqlash\"\n02000D82=\"O'rtacha\"\n02000D83=\"Eng zo'r\"\n02000D84=\"Tez\"\n02000D85=\"Eng tez\"\n02000D86=\"Ultra\"\n\n02000D90=\"Belgila\"\n\n02000DA1=\"Fayllarni qo'sh va almashtir\"\n02000DA2=\"Fayllarni yangila va qo'sh\"\n02000DA3=\"Mavjud fayllarni yangila\"\n02000DA4=\"Fayllarni sinxronla\"\n\n02000DB1=\"Barcha fayllar\"\n\n02000DC0=\"Siquv ketmoqda\"\n\n; Columns dialog\n02000E00=\"Ustunlar\"\n02000E01=\"Ushbu papkada ko'rinadigan ustunlarni belgilang. Ustunlarni tartibini o'zgartirish uchun Yuqoriga va Pastga tugmalaridan foydalaning.\"\n02000E02=\"Tanlangan ustun kengligi\"\n02000E03=\"pi&xel bo'lsin.\"\n\n02000E10=\"&Yuqoriga\"\n02000E11=\"&Pastga\"\n02000E12=\"&Ko'rsat\"\n02000E13=\"Y&ashir\"\n02000E14=\"Tayinla\"\n\n02000E81=\"Sarlavha\"\n02000E82=\"Kengligi\"\n\n; Testing\n02000F90=\"sinaldi\"\n\n\n; File Manager\n\n03000000=\"7-Zip fayl boshqaruvchisi\"\n\n; Menu\n03000102=\"&Fayl\"\n03000103=\"&Tahrir\"\n03000104=\"&Ko'rish\"\n03000105=\"&Asboblar\"\n03000106=\"&Yordam\"\n03000107=\"Fa&voritlar\"\n\n; File\n03000210=\"&Ochish\"\n03000211=\"&Ichkarida ochish\"\n03000212=\"&Tashqarida ochish\"\n03000220=\"&Ko'rish\"\n03000221=\"Ta&hrirla\"\n03000230=\"&Qayta nomla\"\n03000231=\"Buyerga &nusxala...\"\n03000232=\"B&uyerga ko'chir...\"\n03000233=\"O'chir\"\n03000240=\"&Xossalari\"\n03000241=\"&Sharh\"\n03000250=\"Papka yarat\"\n03000251=\"Fayl yarat\"\n03000260=\"&Chiqish\"\n03000270=\"&Faylni bo'lakla...\"\n03000271=\"Fayllarni &birlashtir...\"\n\n; Edit\n03000310=\"&Qaytar\"\n03000311=\"Qayta &bajar\"\n03000320=\"Q&irqish\"\n03000321=\"&Nusxala\"\n03000322=\"Qo'yis&h\"\n03000323=\"&O'chir\"\n03000330=\"H&ammasini tanla\"\n03000331=\"Hammasini tashla\"\n03000332=\"&Tanlanishni teskarila\"\n03000333=\"Tanlash...\"\n03000334=\"Tashlash...\"\n03000335=\"Turi bo'yicha tanla\"\n03000336=\"Turi bo'yicha tashla\"\n\n; View\n03000410=\"&Yirik ikonlar\"\n03000411=\"&Mitti ikonlar\"\n03000412=\"&Ro'yxat\"\n03000413=\"&Tafsilotlar\"\n03000420=\"Saralanmagan\"\n03000430=\"Ildiz papkasini och\"\n03000431=\"Bir bosqich yuqoriga\"\n03000432=\"Papkalar tarixi...\"\n03000440=\"&Qayta och\"\n03000450=\"&2 ta panel\"\n03000451=\"&Uskunalar majmuasi\"\n03000460=\"Arxiv toolbari\"\n03000461=\"Standart toolbar\"\n03000462=\"Yirik tugmalar\"\n03000463=\"Tugmalar matnini ko'rsat\"\n\n; Tools\n03000510=\"Tanl&ovlar...\"\n03000511=\"&Baholash\"\n\n; Help\n03000610=\"&Tarkibi...\"\n03000620=\"&7-Zip haqida...\"\n\n; Favorites\n03000710=\"&Papkani ushbu xatcho'p qo'sh\"\n03000720=\"Xatcho'p\"\n\n; Options Dialog\n\n03010000=\"Tanlovlar\"\n\n; Plugins\n03010100=\"Plaginlar\"\n03010101=\"&Plaginlar:\"\n03010110=\"Tanlovlar...\"\n\n; Edit\n03010200=\"Muharrir\"\n03010201=\"&Muharrir:\"\n\n; System\n03010300=\"Tizim\"\n03010302=\"Ushbu arxivlarni 7-Zip bilan biriktir:\"\n03010310=\"Plagin\"\n\n; Settings\n03010400=\"Sharoit\"\n03010401=\"\\\"..\\\" qismini ko'rsat\"\n03010402=\"Fayllarning haqiqiy ikonlarini ko'rsat\"\n03010410=\"Tizim menyusini ko'rsat\"\n03010420=\"&To'liq yo'lakni tanlash\"\n03010421=\"&Panjara chiziqlarini ko'rsat\"\n03010430=\"&Muqobil tanlash uslubini qo'lla\"\n03010440=\"&Yirik xotira pageini ishlat\"\n\n; Strings\n\n03020201=\"Nusxalash\"\n03020202=\"Ko'chirish\"\n03020203=\"Ushbu katalogga nusxala:\"\n03020204=\"Ushbu katalogga ko'chir:\"\n03020205=\"Nusxalanmoqda...\"\n03020206=\"Ko'chirilmoqda...\"\n03020207=\"Bunaqangi papkalar uchun qismlarni ko'chirish yoki nusxalashning iloji yo'q.\"\n03020208=\"Ushbu operatsiya qo'llanmaydi.\"\n\n03020210=\"Faylni o'chirishni tasdiqlang\"\n03020211=\"Papkani o'chirishni tasdiqlang\"\n03020212=\"Ko'plab fayllarni o'chirishni tasdiqlang\"\n03020213=\"Rostdan ham '{0}'ni o'chirib tashlamoqchimisiz?\"\n03020214=\"Rostdan ham '{0}' papkasini butun tarkibi bilan o'chirib tashlamoqchimisiz?\"\n03020215=\"Rostdan ham ushbu {0} ta qismni o'chirib tashlamoqchimisiz?\"\n03020216=\"O'chirilmoqda...\"\n03020217=\"Fayl yoki papkani o'chirishda xato yuz berdi\"\n\n03020220=\"Qayta nomlanmoqda...\"\n03020221=\"Fayl yoki papkani qayta nomlashda xato yuz berdi\"\n03020222=\"Faylni nusxalashni tasdiqlang\"\n03020223=\"Rostdan ham fayllarni arxivga nusxalashni xohlaysizmi\"\n\n03020230=\"Papka yaratish\"\n03020231=\"Papka nomi:\"\n03020232=\"Yangi papka\"\n03020233=\"Papka yaratishda xato yuz berdi\"\n\n03020240=\"Fayl yaratish\"\n03020241=\"Fayl nomi:\"\n03020242=\"Yangi fayl\"\n03020243=\"Fayl yaratishda xatolik yuz berdi\"\n\n03020250=\"Tanlash\"\n03020251=\"Tashlash\"\n03020252=\"Maska:\"\n\n03020260=\"Papkalar tarixi\"\n\n03020280=\"'{0}' fayli o'zgartirildi.\\nUni arxiv ichida yangilashni xohlaysizmi?\"\n03020281=\"Ushbu faylni yangilay olmadim\\n'{0}'\"\n03020282=\"Muharrirni ocha olmadim.\"\n03020283=\"Ochilmoqda...\"\n\n03020290=\"sharhi\"\n03020291=\"&Sharh:\"\n\n030202A0=\"Tizim\"\n\n03020300=\"Kompyuter\"\n03020301=\"Tarmoq\"\n\n03020400=\"Qo'sh\"\n03020401=\"Ajrat\"\n03020402=\"Sina\"\n\n03020420=\"Nusxala\"\n03020421=\"Ko'chir\"\n03020422=\"O'chir\"\n03020423=\"Info\"\n\n03020500=\"Faylni bo'laklash\"\n03020501=\"&Ushbu katalogga bo'lakla:\"\n03020510=\"Bo'laklanmoqda...\"\n\n03020600=\"Fayllarni birlashtirish\"\n03020601=\"&Ushbu katalogga birlashtir:\"\n03020610=\"Birlashtirilmoqda...\"\n\n; Computer\n03031100=\"Umumiy hajmi\"\n03031101=\"Bo'sh joy\"\n03031102=\"Klaster hajmi\"\n03031103=\"Yorliq\"\n\n; Network\n03031200=\"Lokal nomi\"\n03031201=\"Provayder\"\n\n; Benchmark Dialog\n\n03080000=\"Baholash\"\n03080001=\"Xotira ishlatilishi:\"\n03080002=\"Siqish\"\n03080003=\"Ajratish\"\n03080004=\"Tezlik\"\n03080005=\"Reyting\"\n03080006=\"Umumiy reyting\"\n03080007=\"Joriy\"\n03080008=\"Natijaviy\"\n03080009=\"O'tganlar:\"\n0308000A=\"Xatolar:\"\n\n;!@LangEnd@!"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/va.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.44\n; Translated by Fernando Verdú\n;\n;\n;\n;\n\n00000000=\"Valencian\"\n00000001=\"Valencià\"\n00000002=\"\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Configuració del 7-Zip\"\n\n; Info Page\n01000100=\"Sobre 7-Zip\"\n01000103=\"7-Zip és un programa lliure (GNU LGPL). Pot col·laborar en el desenvolupament del 7-zip registrant-lo, com a usuari registrat podrà rebre suport tècnic.\"\n01000104=\"Suport\"\n01000105=\"Registrar\"\n\n; Folders Page\n01000200=\"Directoris\"\n01000210=\"Directori de &treball\"\n01000211=\"Directori temporal del &sistema\"\n01000212=\"Directori a&ctual\"\n01000213=\"E&specificar directori:\"\n01000214=\"Utilitzar només per a discs extraibles\"\n\n01000281=\"Especificar un directori per als arxius temporals.\"\n\n; System Page\n01000300=\"Sistema\"\n01000301=\"Integrar 7-Zip dins el menu contextual de Windows\"\n01000302=\"Menu contextual en cascada\"\n01000310=\"Objectes del menu contextual:\"\n\n; Language Page\n01000400=\"Idioma\"\n01000401=\"Idioma:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Comandaments 7-Zip\"\n02000103=\"Obrir arxiu\"\n02000104=\"Obri l'arxiu seleccionat.\"\n02000105=\"Extraure fitxers...\"\n02000106=\"Extraure els fitxers de l'arxiu seleccionat.\"\n02000107=\"Afegir a l'arxiu...\"\n02000108=\"Afegir els objectes seleccionats a l'arxiu.\"\n02000109=\"Comprovar arxiu\"\n0200010A=\"Comprova la integritat del fitxer seleccionat.\"\n0200010B=\"Extraure ací\"\n0200010C=\"Extrau els fitxers de l'arxiu triat al directori actual.\"\n0200010D=\"Extraure a {0}\"\n0200010E=\"Extrau fitxers al subdirectori.\"\n0200010F=\"Afegir a {0}\"\n02000110=\"Afegix els fitxers triats a l'arxiu.\"\n02000111=\"Comprimir i enviar per correu electrònic...\"\n02000112=\"Comprimir els objectes triats a l'arxiu i enviar l'arxiu per correu electrònic.\"\n02000113=\"Comprimir a {0} i enviar per correu electrònic\"\n02000114=\"Comprimir els objectes triats a l'arxiu i enviar l'arxiu per correu electrònic..\"\n\n02000140=\"<Directori>\"\n02000141=\"<Arxiu>\"\n\n; Properties\n02000203=\"Adreça\"\n02000204=\"Nom\"\n02000205=\"Tipus d'arxiu\"\n02000206=\"Directori\"\n02000207=\"Tamany\"\n02000208=\"Tamany comprimit\"\n02000209=\"Atributs\"\n0200020A=\"Creat\"\n0200020B=\"ültim accés\"\n0200020C=\"Última modificació\"\n0200020D=\"Compacte\"\n0200020E=\"Comentari\"\n0200020F=\"Xifrat\"\n02000210=\"Expandit abans\"\n02000211=\"Expandit després\"\n02000212=\"Diccionari\"\n02000213=\"CRC\"\n02000214=\"Tipus\"\n02000215=\"Anti\"\n02000216=\"Mètode\"\n02000217=\"SO d'origen\"\n02000218=\"Sistema de fitxers\"\n02000219=\"Usuari\"\n0200021A=\"Grup\"\n0200021B=\"Bloc\"\n0200021C=\"Comentari\"\n0200021D=\"Posició\"\n0200021E=\"Prefix de ruta\"\n\n; Status bar\n02000301=\"{0} objecte(s) seleccionat(s)\"\n02000302=\"{0} objecte(s)\"\n\n02000320=\"Fitxers:\"\n02000321=\"Directoris:\"\n02000322=\"Mida:\"\n\n; List Context Menu\n02000401=\"&Columnes...\"\n\n02000411=\"&Obrir\"\n02000412=\"&Extraure...\"\n\n; ToolBar\n02000501=\"Extraure\"\n\n; Messages\n02000601=\"Les operacions d'actualització d'este arxiu no estan suportades.\"\n02000602=\"No es pot actualitzar l'arxiu {0}\"\n02000603=\"No es pot crear el directori '{0}'\"\n02000604=\"Tipus d'arxiu desconegut.\"\n02000605=\"Error\"\n02000606=\"Massa objectes\"\n02000607=\"No hi ha cap programa associat amb este tipus de fitxer\"\n02000608=\"No hi ha errors\"\n02000609=\"No es pot obrir el fitxer '{0}' com arxiu\"\n0200060A=\"No es pot obrir l'arxiu xifrat '{0}'. contrasenya incorrecta?\"\n\n; Dialogs\n02000702=\"Acceptar\"\n02000705=\"&Si\"\n02000707=\"Si a &tot\"\n02000709=\"&No\"\n0200070B=\"No a t&ot\"\n\n02000710=\"Cancel·lar\"\n02000711=\"&Cancel·lar\"\n02000713=\"Tan&car\"\n02000714=\"Parar\"\n02000715=\"Reiniciar\"\n\n02000720=\"Ajuda\"\n\n; Extract dialog\n02000800=\"Extraure\"\n02000801=\"E&xtraure a:\"\n02000802=\"Contrasenya\"\n\n02000810=\"Mode d'adreça\"\n02000811=\"Adreça sencera\"\n02000812=\"Adreça actual\"\n02000813=\"Sense adreça\"\n\n02000820=\"Sobreescriu\"\n02000821=\"Pregunta abans de sobreescriure\"\n02000822=\"Sobreescriu sense confirmació\"\n02000823=\"Conserva arxius ja existents\"\n02000824=\"Reanomena automàticament\"\n02000825=\"Reanomena automàticament arxius ja existents\"\n\n02000830=\"Fitxers\"\n02000831=\"Fitxers &seleccionats\"\n02000832=\"Tots els fitxers\"\n\n02000881=\"Seleccione destinació per als fitxers extrets.\"\n\n02000890=\"Extraent\"\n\n; Overwrite dialog\n02000900=\"Confirmar substitució de fitxers\"\n02000901=\"El directori de destinació conté un fitxer amb el mateix nom.\"\n02000902=\"Vol substituir el fitxer existent\"\n02000903=\"per este altre?\"\n\n02000911=\"Renomenar a&utomàticament\"\n\n02000982=\"{0} bytes\"\n02000983=\"modificat el\"\n\n; Messages dialog\n02000A00=\"Missatges de diagnosi\"\n\n02000A80=\"Missatge\"\n\n02000A91=\"Mètode de compressió no vàlid per a '{0}'.\"\n02000A92=\"Error de dades en '{0}'. L'arxiu està corrupte.\"\n02000A93=\"CRC ha fallat en '{0}'. L'arxiu està corrupte.\"\n02000A94=\"Errors de dades en l'arxiu xifrat '{0}'. Contrasenya incorrecta?\"\n02000A95=\"CRC incorrecte en l'arxiu xifrat '{0}'. Contrasenya incorrecta?\"\n\n; Password dialog\n02000B00=\"Introduir contrasenya\"\n02000B01=\"Introduir contrasenya:\"\n02000B02=\"Mo&strar contrasenya\"\n02000B03=\"Reintroduir contrasenya:\"\n02000B10=\"Les contrasenyes no coincideixen\"\n02000B11=\"Useu només lletres de l'alfabet anglès, números i caràcters especials (!, #, $, ...) per a la contrasenya\"\n02000B12=\"Contrasenya massa llarga\"\n\n; Progress dialog\n02000C00=\"Procés\"\n02000C01=\"Temps transcorregut:\"\n02000C02=\"Temps restant:\"\n02000C03=\"Mida:\"\n02000C04=\"Velocitat:\"\n\n02000C10=\"Segon pla\"\n02000C11=\"Primer pla\"\n02000C12=\"&Pausa\"\n02000C13=\"&Continuar\"\n\n02000C20=\"Parat\"\n\n02000C30=\"Està segur que vol cancel·lar?\"\n\n; Compress dialog\n02000D00=\"Afegir a l'arxiu\"\n02000D01=\"&Arxiu:\"\n02000D02=\"Mode d'act&ualització:\"\n02000D03=\"&Format de l'arxiu:\"\n02000D04=\"Tipus de co&mpressió:\"\n02000D05=\"Crear arxiu compacte\"\n02000D06=\"&Paràmetres:\"\n02000D07=\"Opcions\"\n02000D08=\"Crear arxiu SF&X\"\n02000D09=\"Multi-threading\"\n02000D0A=\"Encriptar el nom dels fitxers\"\n02000D0B=\"&Nivell de compressió:\"\n02000D0C=\"Tamany &diccionari:\"\n02000D0D=\"Tamany &paraula:\"\n02000D0E=\"Us de memòria Comprimint:\"\n02000D0F=\"Us de memòria Descomprimint:\"\n02000D10=\"Xifrat\"\n02000D11=\"Métode de xifrat:\"\n\n02000D40=\"Separar en &volums, bytes:\"\n02000D41=\"Mida incorrecta de volum\"\n02000D42=\"Mida del volum especificada: {0} bytes.\\nEsteu segurs que voleu dividir l'arxiu en volums?\"\n\n02000D81=\"Sense compressió\"\n02000D82=\"Normal\"\n02000D83=\"Màxima\"\n02000D84=\"Ràpida\"\n02000D85=\"La més ràpida\"\n02000D86=\"Ultra\"\n\n02000D90=\"Visualitzar\"\n\n02000DA1=\"Afegir i substituir fitxers\"\n02000DA2=\"Actualitzar i afegir fitxers\"\n02000DA3=\"Actualitzar fitxers existents\"\n02000DA4=\"Sincronitzar fitxers\"\n\n02000DB1=\"Tots els fitxers\"\n\n02000DC0=\"Comprimint\"\n\n; Columns dialog\n02000E00=\"Columnes\"\n02000E01=\"Seleccione les columnes que vol que siguen visibles en este mode. Faça servir les tecles AvPg i RePg per a organitzar les columnes.\"\n02000E02=\"La columna triada ha de tindre\"\n02000E03=\"píxels d'amplària.\"\n\n02000E10=\"Moure cap am&unt\"\n02000E11=\"Moure cap avall\"\n02000E12=\"Mo&strar\"\n02000E13=\"Amagar\"\n02000E14=\"Fixar\"\n\n02000E81=\"Títol\"\n02000E82=\"Ample\"\n\n; Testing\n02000F90=\"Provant\"\n\n\n; File Manager\n\n03000000=\"Gestor d'Arxius 7-Zip\"\n\n; Menu\n03000102=\"&Arxiu\"\n03000103=\"&Editar\"\n03000104=\"&Visualitzar\"\n03000105=\"Ferramentes\"\n03000106=\"Ajuda\"\n03000107=\"Favorits\"\n\n; File\n03000210=\"&Obrir\"\n03000211=\"Obrir d&ins\"\n03000212=\"Obrir fora\"\n03000220=\"&Visualitzar\"\n03000221=\"&Editar\"\n03000230=\"Renom&enar\"\n03000231=\"&Copiar a...\"\n03000232=\"&Moure a...\"\n03000233=\"&Suprimir\"\n03000240=\"P&ropietats\"\n03000241=\"Come&ntari\"\n03000242=\"Calcular checksum\"\n03000250=\"Crear directori\"\n03000251=\"Crear fitxer\"\n03000260=\"Eixir\"\n03000270=\"&Separar fitxer...\"\n03000271=\"Com&binar fitxers...\"\n\n; Edit\n03000310=\"&Desfer\"\n03000311=\"&Refer\"\n03000320=\"Re&tallar\"\n03000321=\"&Copiar\"\n03000322=\"&Pegar\"\n03000323=\"&Suprimir\"\n03000330=\"Seleccion&ar-ho tot\"\n03000331=\"Deseleccionar-ho tot\"\n03000332=\"&Invertir selecció\"\n03000333=\"Seleccionar...\"\n03000334=\"No seleccionar...\"\n03000335=\"Seleccionar per tipus\"\n03000336=\"No seleccionar per tipus\"\n\n; View\n03000410=\"Icones g&rans\"\n03000411=\"Icones menudes\"\n03000412=\"&Llista\"\n03000413=\"&Detalls\"\n03000420=\"No ordenat\"\n03000430=\"Obrir directori arrel\"\n03000431=\"Directori pare\"\n03000432=\"Historial de carpetes...\"\n03000440=\"Actualitza&r\"\n03000449=\"Vista plana\"\n03000450=\"&2 Taules\"\n03000451=\"&Barres de ferramentes\"\n03000460=\"Arxiu\"\n03000461=\"Estàndard\"\n03000462=\"Botons grans\"\n03000463=\"Mostrar text dels botons\"\n\n; Tools\n03000510=\"&Opcions...\"\n03000511=\"&Banc de proves\"\n\n; Help\n03000610=\"&Contingut...\"\n03000620=\"Sobre 7-Zip...\"\n\n; Favorites\n03000710=\"&Afegir el directori als Favorits com a\"\n03000720=\"Personal\"\n\n; Options Dialog\n\n03010000=\"Opcions\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Opcions...\"\n\n; Edit\n03010200=\"Editor\"\n03010201=\"&Editor:\"\n\n; System\n03010300=\"Sistema\"\n03010302=\"Associar 7-Zip amb:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Ajusts\"\n03010401=\"Mostrar l'objecte \\\"..\\\"\"\n03010402=\"Mostrar icones reals dels fitxers\"\n03010410=\"Mostrar el menú del sistema\"\n03010420=\"Seleccionar &tota la la fila\"\n03010421=\"Mostrar &línies de la taula\"\n03010430=\"Mode de selecció &alternatiu\"\n03010440=\"Utilitzar pàgines de memòria &grans\"\n\n; Strings\n\n03020201=\"Copiar\"\n03020202=\"Moure\"\n03020203=\"Copiar a:\"\n03020204=\"Moure a:\"\n03020205=\"Copiant...\"\n03020206=\"Movent...\"\n03020207=\"No es poden moure o copiar elements d'este tipus de carpetes.\"\n03020208=\"Operació no permesa.\"\n03020209=\"Seleccioneu carpeta de destinació.\"\n\n03020210=\"Confirmar supressió del fitxer\"\n03020211=\"Confirmar supressió del directori\"\n03020212=\"Confirmar supressió m�ltiple de fitxers\"\n03020213=\"Està segur de voler suprimir '{0}'?\"\n03020214=\"Està segur de voler suprimir la carpeta '{0}' i tot el seu contingut?\"\n03020215=\"Està segur de voler esborrar estos {0} elements?\"\n03020216=\"Suprimint...\"\n03020217=\"Error esborrant fitxer o carpeta\"\n\n03020220=\"Renomenant...\"\n03020221=\"Error renomenant fitxer o carpeta\"\n03020222=\"Confirmar copia de fitxer\"\n03020223=\"Està segur que vol copiar els fitxers a l'arxiu\"\n\n03020230=\"Crear carpeta\"\n03020231=\"Nom de carpeta:\"\n03020232=\"Carpeta nova\"\n03020233=\"Error creant carpeta\"\n\n03020240=\"Crear fitxer\"\n03020241=\"Nom de fitxer:\"\n03020242=\"Fitxer nou\"\n03020243=\"Error creant el fitxer\"\n\n03020250=\"Seleccionar\"\n03020251=\"No seleccionar\"\n03020252=\"Màscara:\"\n\n03020260=\"Historial de directoris\"\n\n03020280=\"El fitxer '{0}' ha sigut modificat.\\nVol actualitzar-lo a l'arxiu?\"\n03020281=\"No es pot actualitzar el fitxer\\n'{0}'\"\n03020282=\"No es pot executar l'editor.\"\n03020283=\"Obrint...\"\n\n03020290=\"Comentari\"\n03020291=\"&Comentari:\"\n\n030202A0=\"Sistema\"\n\n03020300=\"El meu ordinador\"\n03020301=\"Entorn de xarxa\"\n\n03020400=\"Afegir\"\n03020401=\"Extraure\"\n03020402=\"Provar\"\n\n03020420=\"Copiar\"\n03020421=\"Moure\"\n03020422=\"Esborrar\"\n03020423=\"Info\"\n\n03020500=\"Separar fitxer\"\n03020501=\"&Separar a:\"\n03020510=\"Separant...\"\n03020520=\"Confirma divissió\"\n03020521=\"Esteu segurs que voleu dividir el fitxer en {0} volums?\"\n03020522=\"La mida del volum ha de ser menor que la mida original del fitxer\"\n\n03020600=\"Combinar fitxers\"\n03020601=\"&Combinar a:\"\n03020610=\"Combinant...\"\n03020620=\"Seleccioneu només el primer fitxer\"\n\n03020710=\"Calculant checksum...\"\n03020720=\"Informació checksum\"\n03020721=\"CRC checksum per a les dades:\"\n03020722=\"CRC checksum per a dades i noms:\"\n\n03020800=\"Escanejant...\"\n\n; Computer\n03031100=\"Tamany total\"\n03031101=\"Espai lliure\"\n03031102=\"Tamany sector\"\n03031103=\"Etiqueta\"\n\n; Network\n03031200=\"Nom local\"\n03031201=\"Proveïdor\"\n\n; Benchmark Dialog\n\n03080000=\"Banc de proves\"\n03080001=\"Us de memoria:\"\n03080002=\"Comprimint\"\n03080003=\"Descomprimint\"\n03080004=\"Velocitat\"\n03080005=\"Taxa\"\n03080006=\"Taxa total\"\n03080007=\"Actual\"\n03080008=\"Resultant\"\n03080009=\"Passades:\"\n0308000A=\"Errors:\"\n\n;!@LangEnd@!\n\n\n \t  \t \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/vi.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.48 beta\n; Translated by Nguyễn Hồng Quân\n;\n;\n;\n;\n\n00000000=\"Vietnamese\"\n00000001=\"Tiếng Việt\"\n00000002=\"42\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"Cấu hình 7-Zip\"\n\n; Info Page\n01000100=\"Giới thiệu 7-Zip\"\n01000103=\"7-Zip là một phần mềm miễn phí. Tuy nhiên, bạn vui lòng ủng hộ nhóm phát triển 7-Zip bằng cách đăng ký.\"\n01000104=\"Ủng hộ\"\n01000105=\"Đăng ký\"\n\n; Folders Page\n01000200=\"Thư mục\"\n01000210=\"&Thư mục làm việc\"\n01000211=\"&Thư mục tạm của hệ thống\"\n01000212=\"&Hiện hành\"\n01000213=\"&Đặc biệt:\"\n01000214=\"Chỉ sử dụng cho ổ đĩa tháo lắp\"\n\n01000281=\"Chỉ định nơi chứa tập tin lưu tạm.\"\n\n; System Page\n01000300=\"Hệ thống\"\n01000301=\"Tích hợp 7-Zip vào menu ngữ cảnh\"\n01000302=\"Xếp tầng menu ngữ cảnh\"\n01000310=\"Menu ngữ cảnh:\"\n\n; Language Page\n01000400=\"Ngôn ngữ\"\n01000401=\"Ngôn ngữ:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"Các lệnh của 7-Zip\"\n02000103=\"Mở tập tin đã nén\"\n02000104=\"Mở tập tin đã nén.\"\n02000105=\"Giải nén tập tin...\"\n02000106=\"Giải nén từ tập tin nén đã chọn.\"\n02000107=\"Thêm vào tập tin nén...\"\n02000108=\"Thêm những tập tin đã chọn vào tập tin nén.\"\n02000109=\"Kiểm tra tập tin nén\"\n0200010A=\"Kiểm tra tính toàn vẹn của tập tin đã nén.\"\n0200010B=\"Giải nén tại đây\"\n0200010C=\"Giải nén vào thư mục hiện hành.\"\n0200010D=\"Giải nén vào {0}\"\n0200010E=\"Giải nén vào thư mục con.\"\n0200010F=\"Thêm vào {0}\"\n02000110=\"Thêm những tập tin đã chọn vào tập tin nén.\"\n02000111=\"Nén và gởi email...\"\n02000112=\"Nén những tập tin đã chọn thành tập tin nén rồi gởi email.\"\n02000113=\"Nén thành {0} rồi gởi email\"\n02000114=\"Nén những tập tin đã chọn vào tập tin nén rồi gởi email.\"\n\n02000140=\"<Thư mục>\"\n02000141=\"<Tập tin nén>\"\n\n; Properties\n02000203=\"Đường dẫn\"\n02000204=\"Tên\"\n02000205=\"Phần mở rộng\"\n02000206=\"Thư mục\"\n02000207=\"Trước khi nén\"\n02000208=\"Sau khi nén\"\n02000209=\"Thuộc tính\"\n0200020A=\"Thời điểm tạo thành\"\n0200020B=\"Thời điểm truy xuất\"\n0200020C=\"Thời điểm sửa đổi\"\n0200020D=\"Đặc\"\n0200020E=\"Ghi chú\"\n0200020F=\"Đã được mã hoá\"\n02000210=\"Chia nhỏ trước\"\n02000211=\"Chia nhỏ sau\"\n02000212=\"Từ điển\"\n02000213=\"CRC\"\n02000214=\"Loại\"\n02000215=\"Anti\"\n02000216=\"Phương pháp\"\n02000217=\"Host OS\"\n02000218=\"Hệ thống tập tin\"\n02000219=\"Người dùng\"\n0200021A=\"Nhóm\"\n0200021B=\"Đóng khối\"\n0200021C=\"Chú thích\"\n0200021D=\"Vị trí\"\n0200021E=\"Đầu ngữ đường dẫn\"\n\n; Status bar\n02000301=\"{0} đối tượng đã được chọn\"\n02000302=\"{0} đối tượng\"\n\n02000320=\"Tập tin:\"\n02000321=\"Thư mục:\"\n02000322=\"Kích cỡ:\"\n\n; List Context Menu\n02000401=\"&Cột...\"\n\n02000411=\"&Mở\"\n02000412=\"&Giải nén...\"\n\n; ToolBar\n02000501=\"Giải nén\"\n\n; Messages\n02000601=\"Thao tác cập nhật không được hỗ trợ cho tập tin này.\"\n02000602=\"Không thể cập nhật tập tin {0}\"\n02000603=\"Không thể tạo thư mục '{0}'\"\n02000604=\"Dạng tập tin này không được hỗ trợ.\"\n02000605=\"Lỗi\"\n02000606=\"Quá nhiều mục\"\n02000607=\"Không có ứng dụng tương ứng với phần mở rộng của tập tin này\"\n02000608=\"Không xuất hiện lỗi\"\n02000609=\"Không thể mở '{0}' như là tập tin nén\"\n0200060A=\"Không thể mở tập tin nén bị mã hóa '{0}'. Mật khẩu sai?\"\n\n; Dialogs\n02000702=\"Đồng ý\"\n02000705=\"&Có\"\n02000707=\"Có &tất\"\n02000709=\"&Không\"\n0200070B=\"Khôn&g tất\"\n\n02000710=\"Huỷ bỏ\"\n02000711=\"&Huỷ bỏ\"\n02000713=\"&Đóng\"\n02000714=\"Dừng\"\n02000715=\"Làm lại\"\n\n02000720=\"Giúp đỡ\"\n\n; Extract dialog\n02000800=\"Giải nén\"\n02000801=\"&Giải nén vào:\"\n02000802=\"Mật mã\"\n\n02000810=\"Chế độ đường dẫn\"\n02000811=\"Đường dẫn đầy đủ\"\n02000812=\"Đường dẫn hiện thời\"\n02000813=\"Không có đường dẫn\"\n\n02000820=\"Chế độ ghi đè\"\n02000821=\"Hỏi trước khi ghi đè\"\n02000822=\"Ghi đè không cần hỏi\"\n02000823=\"Bỏ qua tập tin đã có\"\n02000824=\"Tự động đổi tên\"\n02000825=\"Tự động đổi tên tập tin đã có\"\n\n02000830=\"Tập tin\"\n02000831=\"Tập tin đã &chọn\"\n02000832=\"&Tất cả tập tin\"\n\n02000881=\"Chọn nơi để giải nén tập tin.\"\n\n02000890=\"Đang giải nén\"\n\n; Overwrite dialog\n02000900=\"Xác nhận thay thế tập tin\"\n02000901=\"Thư mục đích đã có tập tin cần xử lý.\"\n02000902=\"Bạn có muốn thay thế tập tin đã có\"\n02000903=\"bằng tập tin mới?\"\n\n02000911=\"&Tự đổi tên\"\n\n02000982=\"{0} bytes\"\n02000983=\"chỉnh sửa ngày\"\n\n; Messages dialog\n02000A00=\"Thông điệp chẩn đoán\"\n\n02000A80=\"Thông điệp\"\n\n02000A91=\"Phương pháp nén không được hỗ trợ cho '{0}'.\"\n02000A92=\"Lỗi về dữ liệu trong '{0}'. Tập tin đã bị hỏng.\"\n02000A93=\"Lỗi chẵn/lẻ (CRC) trong '{0}'. Tập tin đã bị hỏng.\"\n02000A94=\"Lỗi dữ liệu trong tập tin nén bị mã hóa '{0}'. Mật khẩu sai?\"\n02000A95=\"CRC không thành trong tập tin nén bị mã hóa '{0}'. Mật khẩu sai?\"\n\n; Password dialog\n02000B00=\"Nhập mật khẩu\"\n02000B01=\"Nhập mật khẩu:\"\n02000B02=\"&Hiển thị mật khẩu\"\n02000B03=\"Nhập lại mật khẩu:\"\n02000B10=\"Các mật khẩu không khớp nhau\"\n02000B11=\"Chỉ dùng những chữ cái tiếng Anh, số và những kí tự đặc biệt (!, #, $, ...) cho mật khẩu\"\n02000B12=\"Mật khẩu quá dài đi\"\n\n; Progress dialog\n02000C00=\"Xử lý\"\n02000C01=\"Thời gian đã qua:\"\n02000C02=\"Thời gian còn lại:\"\n02000C03=\"Kích thước:\"\n02000C04=\"Tốc độ:\"\n\n02000C10=\"&Chạy nền\"\n02000C11=\"&Chạy ưu tiên\"\n02000C12=\"&Dừng\"\n02000C13=\"&Tiếp tục\"\n\n02000C20=\"Đã dừng\"\n\n02000C30=\"Bạn có muốn chấm dứt?\"\n\n; Compress dialog\n02000D00=\"Thêm vào tập tin nén\"\n02000D01=\"&Tập tin nén:\"\n02000D02=\"&Chế độ cập nhật:\"\n02000D03=\"&Dạng tập tin nén:\"\n02000D04=\"&Phương thức nén:\"\n02000D05=\"Chỉ tạo thành &một tập tin nén\"\n02000D06=\"Tham &số:\"\n02000D07=\"Tuỳ chọn\"\n02000D08=\"Tạo tập tin &tự giải nén\"\n02000D09=\"Đa luồng\"\n02000D0A=\"Mã hoá &tên tập tin\"\n02000D0B=\"&Cấp độ nén:\"\n02000D0C=\"&Kích thước thư mục:\"\n02000D0D=\"&Kích thước từ:\"\n02000D0E=\"Bộ nhớ sử dụng cho việc nén:\"\n02000D0F=\"Bộ nhớ sử dụng cho việc giải nén:\"\n02000D10=\"Mã hóa\"\n02000D11=\"Phương pháp mã hóa:\"\n02000D12=\"Số luồng xử lý CPU:\"\n02000D13=\"Kích cỡ khối đặc:\"\n02000D14=\"Không đặc\"\n02000D15=\"Đặc\"\n02000D16=\"Nén những tập tin chia sẻ\"\n\n02000D40=\"Chia thành &nhiều phần, bytes:\"\n02000D41=\"Kích cỡ phần chia chưa đúng\"\n02000D42=\"Kích cỡ phần chia đã định là: {0} bytes.\\nĐúng là bạn muốn chia nhỏ tập tin nén thành những phần như thế?\"\n\n02000D81=\"Lưu trữ\"\n02000D82=\"Thường\"\n02000D83=\"Tối đa\"\n02000D84=\"Nhanh\"\n02000D85=\"Nhanh nhất\"\n02000D86=\"Siêu nhanh\"\n\n02000D90=\"Tìm chọn\"\n\n02000DA1=\"Thêm và thay thế tập tin\"\n02000DA2=\"Cập nhật và thêm tập tin\"\n02000DA3=\"Cập nhật tập tin đã có\"\n02000DA4=\"Đồng bộ tập tin\"\n\n02000DB1=\"Tất cả tập tin\"\n\n02000DC0=\"Đang nén, chờ tí\"\n\n; Columns dialog\n02000E00=\"Cột\"\n02000E01=\"Đánh dấu chọn các cột mà bạn muốn xuất hiện trong thư mục này. Dùng các nút LÊN/XUỐNG để thay đổi thứ tự các cột.\"\n02000E02=\"Cột đã chọn nên có\"\n02000E03=\"độ &rộng theo điểm ảnh.\"\n\n02000E10=\"Chuyển &Lên\"\n02000E11=\"Chuyển &Xuống\"\n02000E12=\"&Hiển thị\"\n02000E13=\"&Ẩn\"\n02000E14=\"Đặt\"\n\n02000E81=\"Tiêu đề\"\n02000E82=\"Độ rộng\"\n\n; Testing\n02000F90=\"Kiểm tra\"\n\n\n; File Manager\n\n03000000=\"Chương trình quản lý tập tin 7-Zip\"\n\n; Menu\n03000102=\"&Tập tin\"\n03000103=\"&Biên tập\"\n03000104=\"&Xem\"\n03000105=\"&Công cụ\"\n03000106=\"&Giúp đỡ\"\n03000107=\"Ư&a thích\"\n\n; File\n03000210=\"&Mở\"\n03000211=\"Mở &tại đây\"\n03000212=\"Mở trong cửa sổ &khác\"\n03000220=\"&Xem\"\n03000221=\"&Biên tập\"\n03000230=\"Đổ&i tên\"\n03000231=\"&Sao chép đến...\"\n03000232=\"&Di chuyển đến...\"\n03000233=\"&Xoá\"\n03000240=\"Th&uộc tính\"\n03000241=\"C&hú thích\"\n03000242=\"Tính checksum\"\n03000250=\"Tạo thư mục\"\n03000251=\"Tạo tập tin\"\n03000260=\"Th&oát\"\n03000270=\"&Cắt tập tin...\"\n03000271=\"&Nối tập tin...\"\n\n; Edit\n03000310=\"Như &cũ\"\n03000311=\"Làm &lại\"\n03000320=\"&Cắt\"\n03000321=\"&Sao chép\"\n03000322=\"&Dán\"\n03000323=\"&Xoá\"\n03000330=\"Chọn &tất cả\"\n03000331=\"Bỏ chọn tất cả\"\n03000332=\"Chọn &ngược lại\"\n03000333=\"Chọn...\"\n03000334=\"Bỏ chọn...\"\n03000335=\"Chọn theo loại\"\n03000336=\"Bỏ chọn theo loại\"\n\n; View\n03000410=\"Biểu tượng &lớn\"\n03000411=\"Biểu tượng &nhỏ\"\n03000412=\"&Danh sách\"\n03000413=\"&Chi tiết\"\n03000420=\"Không sắp xếp\"\n03000430=\"Mở thư mục gốc\"\n03000431=\"Lên một cấp\"\n03000432=\"Lịch sử thư mục...\"\n03000440=\"&Rà soát lại\"\n03000450=\"&2 bảng\"\n03000449=\"Xem dàn trải\"\n03000451=\"&Thanh công cụ\"\n03000460=\"Thanh công cụ nén\"\n03000461=\"Thanh công cụ chuẩn\"\n03000462=\"Sử dụng nút lớn\"\n03000463=\"Hiển thị chữ trên nút\"\n\n; Tools\n03000510=\"&Tuỳ chọn...\"\n03000511=\"Đo tốc độ\"\n\n; Help\n03000610=\"&Nội dung...\"\n03000620=\"&Giới thiệu 7-Zip...\"\n\n; Favorites\n03000710=\"&Thêm thư mục vào 'Ưa thích' như là\"\n03000720=\"Đánh dấu\"\n\n; Options Dialog\n\n03010000=\"Các tùy chọn\"\n\n; Plugins\n03010100=\"Plugins\"\n03010101=\"&Plugins:\"\n03010110=\"Tuỳ chọn...\"\n\n; Edit\n03010200=\"Biên tập\"\n03010201=\"&Biên tập:\"\n\n; System\n03010300=\"Hệ thống\"\n03010302=\"Liên kết 7-Zip với:\"\n03010310=\"Plugin\"\n\n; Settings\n03010400=\"Sắp đặt\"\n03010401=\"Hiển thị \\\"..\\\"\"\n03010402=\"Hiển thị biểu tượng thực của tập tin\"\n03010410=\"Hiển thị menu hệ thống\"\n03010420=\"Chọn cả &dòng\"\n03010421=\"Hiển thị &lưới\"\n03010430=\"Chế độ chọn luân &phiên\"\n03010440=\"Sử dụng bộ &nhớ lớn\"\n\n; Strings\n\n03020201=\"Sao chép\"\n03020202=\"Di chuyển\"\n03020203=\"Sao chép đến:\"\n03020204=\"Di chuyển đến:\"\n03020205=\"Đang sao chép...\"\n03020206=\"Đang di chuyển...\"\n03020207=\"Bạn không thể di chuyển hoặc sao chép vào thư mục đó.\"\n03020208=\"Thao tác không được hỗ trợ.\"\n03020209=\"Chọn thư mục đến.\"\n\n03020210=\"Xác nhận xoá tập tin\"\n03020211=\"Xác nhận xoá thư mục\"\n03020212=\"Xác nhận xoá nhiều tập tin\"\n03020213=\"Bạn có chắc là bạn có muốn xoá '{0}'?\"\n03020214=\"Bạn có chắc là bạn muốn xoá thư mục '{0}' và tất cả tập tin trong nó?\"\n03020215=\"Bạn có chắc là bạn muốn xoá {0} ?\"\n03020216=\"Đang xoá...\"\n03020217=\"Lỗi khi đang xoá tập tin hoặc thư mục\"\n\n03020220=\"Đang đổi tên...\"\n03020221=\"Lỗi khi đổi tên tập tin hoặc thư mục\"\n03020222=\"Xác nhận sao chép tập tin\"\n03020223=\"Bạn chắc chắn muốn sao chép vào tập tin nén chứ\"\n\n03020230=\"Tạo thư mục\"\n03020231=\"Tên thư mục:\"\n03020232=\"Thư mục mới\"\n03020233=\"Lỗi khi tạo thư mục\"\n\n03020240=\"Tạo tập tin\"\n03020241=\"Tên tập tin:\"\n03020242=\"Tập tin mới\"\n03020243=\"Lỗi khi tạo tập tin\"\n\n03020250=\"Chọn\"\n03020251=\"Bỏ chọn\"\n03020252=\"Mặt nạ:\"\n\n03020260=\"Lịch sử thư mục\"\n\n03020280=\"Tập tin '{0}' đã bị thay đổi.\\nBạn có muốn cập nhật vào tập tin nén?\"\n03020281=\"Không thể cập nhật tập tin\\n'{0}'\"\n03020282=\"Không thể khởi động trình biên tập.\"\n03020283=\"Đang mở...\"\n\n03020290=\"Chú thích\"\n03020291=\"&Chú thích:\"\n\n030202A0=\"Hệ thống\"\n\n03020300=\"Máy tính\"\n03020301=\"Mạng\"\n\n03020400=\"Thêm\"\n03020401=\"Giải nén\"\n03020402=\"Kiểm tra\"\n\n03020420=\"Sao chép\"\n03020421=\"Di chuyển\"\n03020422=\"Xoá\"\n03020423=\"Thông tin\"\n\n03020500=\"Chia nhỏ tập tin\"\n03020501=\"&Chia nhỏ thành:\"\n03020510=\"Đang chia nhỏ...\"\n03020520=\"Xác nhận việc chia nhỏ\"\n03020521=\"Bạn có chắc là muốn chia nhỏ tập tin nén thành {0} phần?\"\n03020522=\"Kích cỡ phần chia phải nhỏ hơn tập tin gốc à nha!\"\n\n03020600=\"Nối tập tin\"\n03020601=\"&Nối thành:\"\n03020610=\"Đang nối...\"\n03020620=\"Chỉ chọn tập tin đầu thôi\"\n\n03020710=\"Đang tính checksum...\"\n03020720=\"Thông tin checksum\"\n03020721=\"CRC checksum cho dữ liệu:\"\n03020722=\"CRC checksum cho dữ liệu và tên:\"\n\n03020800=\"Đang quét...\"\n\n; Computer\n03031100=\"Tổng kích thước\"\n03031101=\"Kích thước trống\"\n03031102=\"Kích thước cluster\"\n03031103=\"Nhãn\"\n\n; Network\n03031200=\"Tên cục bộ\"\n03031201=\"Nhà cung cấp\"\n\n; Benchmark Dialog\n\n03080000=\"Đo tốc độ\"\n03080001=\"Bộ nhớ sử dụng:\"\n03080002=\"Nén\"\n03080003=\"Giải nén\"\n03080004=\"Tốc độ\"\n03080005=\"Đánh giá\"\n03080006=\"Tổng đánh giá\"\n03080007=\"Hiện thời\"\n03080008=\"Kết quả\"\n03080009=\"Đã qua:\"\n0308000A=\"Lỗi:\"\n0308000B=\"Mức dùng CPU\"\n0308000C=\"Tốc độ / Mức dùng\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/zh-cn.txt",
    "content": ";!@Lang@!UTF-8!\n; 7-Zip 4.59\n; translated by Sparanoid\n; http://7z.sparanoid.com/\n; last updated: 2008-08-15\n; revision: 0829\n;\n\n00000000=\"Chinese Simplified\"\n00000001=\"简体中文\"\n00000002=\"4-2\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip 配置\"\n\n; Info Page\n01000100=\"关于 7-Zip\"\n01000103=\"7-Zip 是一款免费软件。然而您也可以通过注册的方式来支持 7-Zip 的开发。\"\n01000104=\"技术支持\"\n01000105=\"注册\"\n\n; Folders Page\n01000200=\"文件夹\"\n01000210=\"工作文件夹(&W)\"\n01000211=\"系统临时文件夹(&S)\"\n01000212=\"当前(&C)\"\n01000213=\"指定文件夹(&S)：\"\n01000214=\"仅用于可移动磁盘\"\n\n01000281=\"指定一个临时压缩档案的位置。\"\n\n; System Page\n01000300=\"系统\"\n01000301=\"添加 7-Zip 到右键菜单\"\n01000302=\"层叠右键菜单\"\n01000310=\"选择在右键菜单中显示的项目\"\n\n; Language Page\n01000400=\"语言\"\n01000401=\"选择语言：\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip 指令\"\n02000103=\"打开压缩档案\"\n02000104=\"打开选定的压缩档案\"\n02000105=\"释放文件...\"\n02000106=\"从选定的压缩文件中提取文件\"\n02000107=\"添加到压缩档案...\"\n02000108=\"添加选定项目到压缩档案\"\n02000109=\"测试压缩档案\"\n0200010A=\"完整测试已选中的档案\"\n0200010B=\"当前目录释放\"\n0200010C=\"从选定的压缩档案中释放文件到当前目录。\"\n0200010D=\"释放到 {0}\"\n0200010E=\"释放文件到子文件夹\"\n0200010F=\"添加到 {0}\"\n02000110=\"添加选定项目到压缩档案\"\n02000111=\"压缩并邮寄...\"\n02000112=\"将选定的项目添加到压缩档案并使用电子邮件发送。\"\n02000113=\"压缩 {0} 并邮寄\"\n02000114=\"将选定的项目添加到压缩档案并使用电子邮件发送。\"\n\n02000140=\"<文件夹>\"\n02000141=\"<档案>\"\n\n; Properties\n02000203=\"路径\"\n02000204=\"名称\"\n02000205=\"扩展名\"\n02000206=\"文件夹\"\n02000207=\"大小\"\n02000208=\"压缩后大小\"\n02000209=\"属性\"\n0200020A=\"创建时间\"\n0200020B=\"访问时间\"\n0200020C=\"修改时间\"\n0200020D=\"固实\"\n0200020E=\"注释\"\n0200020F=\"有口令\"\n02000210=\"之前分割\"\n02000211=\"之后分割\"\n02000212=\"字典大小\"\n02000213=\"CRC\"\n02000214=\"类型\"\n02000215=\"剔除项\"\n02000216=\"算法\"\n02000217=\"主操作系统\"\n02000218=\"文件系统\"\n02000219=\"用户\"\n0200021A=\"组\"\n0200021B=\"字块\"\n0200021C=\"注释\"\n0200021D=\"定位\"\n0200021E=\"路径前缀\"\n0200021F=\"文件夹\"\n02000220=\"文件\"\n02000221=\"版本\"\n02000222=\"卷\"\n02000223=\"多卷压缩\"\n02000224=\"偏移\"\n02000225=\"链接\"\n02000226=\"字块\"\n02000227=\"分卷\"\n\n02000229=\"64 位\"\n0200022A=\"Big-endian\"\n0200022B=\"CPU\"\n0200022C=\"物理大小\"\n0200022D=\"文件头大小\"\n0200022E=\"校验和\"\n0200022F=\"特征\"\n02000230=\"虚拟地址\"\n\n; Status bar\n02000301=\"选定 {0} 个项目\"\n02000302=\"{0} 个项目\"\n\n02000320=\"文件：\"\n02000321=\"文件夹：\"\n02000322=\"大小：\"\n02000323=\"压缩后大小：\"\n02000324=\"压缩档案：\"\n\n; List Context Menu\n02000401=\"栏目(&C)...\"\n\n02000411=\"打开(&O)\"\n02000412=\"释放(&E)...\"\n\n; ToolBar\n02000501=\"释放\"\n\n; Messages\n02000601=\"不支持此压缩档案的更新操作。\"\n02000602=\"不能更新压缩档案 {0}\"\n02000603=\"不能创建文件夹“{0}”\"\n02000604=\"文件不支持压缩档案。\"\n02000605=\"错误\"\n02000606=\"项目太多\"\n02000607=\"没有应用程序和下面给出的文件扩展名相关联。\"\n02000608=\"未发现错误\"\n02000609=\"无法作为压缩档案打开文件 '{0}'\"\n0200060A=\"无法打开加密压缩档案 '{0}'。密码错误？\"\n0200060B=\"系统无法分配所需内存数量\"\n0200060C=\"未知错误\"\n0200060D=\"不支持的压缩档案格式\"\n\n; Dialogs\n02000702=\"确定\"\n02000705=\"是(&Y)\"\n02000707=\"全是(&A)\"\n02000709=\"否(&N)\"\n0200070B=\"全否(&L)\"\n\n02000710=\"取消\"\n02000711=\"取消(&C)\"\n02000713=\"关闭(&C)\"\n02000714=\"停止(&S)\"\n02000715=\"重新开始(&R)\"\n\n02000720=\"帮助(&C)\"\n\n; Extract dialog\n02000800=\"释放\"\n02000801=\"释放到(&X)：\"\n02000802=\"密码\"\n\n02000810=\"路径方式\"\n02000811=\"完整路径名称\"\n02000812=\"当前路径名称\"\n02000813=\"没有路径名称\"\n\n02000820=\"覆盖方式\"\n02000821=\"在覆盖前询问\"\n02000822=\"不提示就覆盖\"\n02000823=\"跳过已经存在的文件\"\n02000824=\"自动重新命名\"\n02000825=\"重新命名现有文件\"\n\n02000830=\"文件\"\n02000831=\"选定的文件(&S)\"\n02000832=\"全部文件(&A)\"\n\n02000881=\"指定一个释放文件的位置。\"\n\n02000890=\"正在释放\"\n\n; Overwrite dialog\n02000900=\"确认文件替换\"\n02000901=\"此文件夹已包含一个相同名称的文件。\"\n02000902=\"是否将现有文件\"\n02000903=\"替换为\"\n\n02000911=\"自动重新命名(&U)\"\n\n02000982=\"{0} 字节\"\n02000983=\"修改于\"\n\n; Messages dialog\n02000A00=\"诊断信息\"\n\n02000A80=\"信息\"\n\n02000A91=\"不支持的压缩算法“{0}”。\"\n02000A92=\"数据于“{0}”处发生错误，文件已损坏。\"\n02000A93=\"CRC 校验于“{0}”处失败，文件已损坏。\"\n02000A94=\"加密文件“{0}”数据有误，密码错误？\"\n02000A95=\"加密文件“{0}”CRC 数据效验有误，密码错误？\"\n\n; Password dialog\n02000B00=\"输入密码\"\n02000B01=\"输入密码：\"\n02000B02=\"显示密码(&S)\"\n02000B03=\"重新输入：\"\n02000B10=\"密码不匹配\"\n02000B11=\"密码只允许英文字符，数字，以及特殊字符(!、#、$...)\"\n02000B12=\"密码过长\"\n\n; Progress dialog\n02000C00=\"进程\"\n02000C01=\"已用时间：\"\n02000C02=\"剩余时间：\"\n02000C03=\"总大小：\"\n02000C04=\"速度：\"\n02000C05=\"已处理：\"\n02000C06=\"压缩率：\"\n\n02000C10=\"后台(&B)\"\n02000C11=\"前台(&F)\"\n02000C12=\"暂停(&P)\"\n02000C13=\"继续(&C)\"\n\n02000C20=\"被暂停\"\n\n02000C30=\"您真的要取消吗？\"\n\n; Compress dialog\n02000D00=\"添加到压缩档案\"\n02000D01=\"压缩档案(&A)：\"\n02000D02=\"更新方式(&U)：\"\n02000D03=\"压缩格式(&F)：\"\n02000D04=\"压缩方法(&M)：\"\n02000D05=\"创建固实压缩档案(&S)\"\n02000D06=\"参数(&P)：\"\n02000D07=\"选项\"\n02000D08=\"创建自释放档案(&X)\"\n02000D09=\"多线程支持(Pentium 4 HT 或多处理器)\"\n02000D0A=\"加密文件名(&N)\"\n02000D0B=\"压缩等级(&L)：\"\n02000D0C=\"字典大小(&D)：\"\n02000D0D=\"单词大小(&W)：\"\n02000D0E=\"压缩所需内存：\"\n02000D0F=\"解压缩所需内存：\"\n02000D10=\"加密\"\n02000D11=\"加密算法：\"\n02000D12=\"CPU 线程数：\"\n02000D13=\"固实数据大小：\"\n02000D14=\"非固实\"\n02000D15=\"固实\"\n02000D16=\"压缩共享文件\"\n\n02000D40=\"分卷大小，字节(&V)：\"\n02000D41=\"分卷大小错误\"\n02000D42=\"指定分卷大小：{0} 字节。\\n您确定要分割当前文件吗？\"\n\n02000D81=\"存储压缩\"\n02000D82=\"标准压缩\"\n02000D83=\"最大压缩\"\n02000D84=\"快速压缩\"\n02000D85=\"最快压缩\"\n02000D86=\"极限压缩\"\n\n02000D90=\"浏览\"\n\n02000DA1=\"添加并替换文件\"\n02000DA2=\"更新并添加文件\"\n02000DA3=\"只刷新已存在的文件\"\n02000DA4=\"同步压缩档案内容\"\n\n02000DB1=\"所有文件\"\n\n02000DC0=\"压缩\"\n\n; Columns dialog\n02000E00=\"栏目\"\n02000E01=\"选中您愿意在这个文件夹中可见的栏目。使用上移或者下移按钮来重新安排该栏目的顺序。\"\n02000E02=\"选定栏目将会被\"\n02000E03=\"所选栏的宽度(像素)(&W)\"\n\n02000E10=\"上移(&U)\"\n02000E11=\"下移(&D)\"\n02000E12=\"显示(&S)\"\n02000E13=\"隐藏(&H)\"\n02000E14=\"设置\"\n\n02000E81=\"标题\"\n02000E82=\"宽度\"\n\n; Testing\n02000F90=\"测试\"\n\n\n; File Manager\n\n03000000=\"7-Zip 文件管理器\"\n\n; Menu\n03000102=\"文件(&F)\"\n03000103=\"编辑(&E)\"\n03000104=\"查看(&V)\"\n03000105=\"工具(&T)\"\n03000106=\"帮助(&H)\"\n03000107=\"收藏(&A)\"\n\n; File\n03000210=\"打开(&O)\"\n03000211=\"当前窗口打开(&I)\"\n03000212=\"新建窗口打开(&U)\"\n03000220=\"视图(&V)\"\n03000221=\"编辑(&E)\"\n03000230=\"重命名(&M)\"\n03000231=\"复制到(&C)...\"\n03000232=\"移动到(&M)...\"\n03000233=\"删除(&D)\"\n03000240=\"属性(&R)\"\n03000241=\"注释(&N)\"\n03000242=\"文件效验\"\n03000250=\"新建文件夹\"\n03000251=\"新建文件\"\n03000260=\"退出(&X)\"\n03000270=\"分割文件(&S)...\"\n03000271=\"合并文件(&B)...\"\n\n; Edit\n03000310=\"撤消(&U)\"\n03000311=\"重做(&R)\"\n03000320=\"剪切(&T)\"\n03000321=\"复制(&C)\"\n03000322=\"粘贴(&P)\"\n03000323=\"删除(&D)\"\n03000330=\"全部选定(&A)\"\n03000331=\"全不选\"\n03000332=\"反相选择(&I)\"\n03000333=\"选择...\"\n03000334=\"取消选择...\"\n03000335=\"选择相同类型的文件\"\n03000336=\"取消选择相同类型的文件\"\n\n; View\n03000410=\"大图标(&G)\"\n03000411=\"小图标(&M)\"\n03000412=\"列表(&L)\"\n03000413=\"详细信息(&D)\"\n03000420=\"不排序\"\n03000430=\"打开根文件夹\"\n03000431=\"向上\"\n03000432=\"文件夹历史...\"\n03000440=\"刷新(&R)\"\n03000449=\"平板模式\"\n03000450=\"双版面(&2)\"\n03000451=\"工具栏(&T)\"\n03000460=\"档案工具栏\"\n03000461=\"标准工具栏\"\n03000462=\"大按钮\"\n03000463=\"显示按钮文字\"\n\n; Tools\n03000510=\"选项(&O)\"\n03000511=\"基准测试(&B)\"\n\n; Help\n03000610=\"目录(&C)\"\n03000620=\"关于 7-Zip (&A)\"\n\n; Favorites\n03000710=\"添加到收藏夹(&A)\"\n03000720=\"书签\"\n\n; Options Dialog\n\n03010000=\"选项\"\n\n; Plugins\n03010100=\"插件\"\n03010101=\"插件(&P)：\"\n03010110=\"插件选项...\"\n\n; Edit\n03010200=\"编辑器\"\n03010201=\"编辑器(&E)：\"\n\n; System\n03010300=\"系统\"\n03010302=\"使用 7-Zip 关联的文件类型：\"\n03010310=\"插件\"\n\n; Settings\n03010400=\"显示\"\n03010401=\"显示“..”项(双击向上)\"\n03010402=\"显示真实图标(&I)\"\n03010410=\"显示系统菜单(&M)\"\n03010420=\"整行选择(&F)\"\n03010421=\"显示网格线(&G)\"\n03010430=\"7-Zip 传统选择模式(&A)\"\n03010440=\"使用大内存页(&L)\"\n\n; Strings\n\n03020201=\"复制\"\n03020202=\"移动\"\n03020203=\"复制到：\"\n03020204=\"移动到：\"\n03020205=\"正在复制...\"\n03020206=\"正在移动...\"\n03020207=\"你不能这样移动或复制文件(夹)。\"\n03020208=\"不支持当前操作\"\n03020209=\"选择目标文件夹。\"\n\n03020210=\"确认文件删除\"\n03020211=\"确认文件夹删除\"\n03020212=\"确认删除多个文件\"\n03020213=\"确实要删除 “{0}”吗？\"\n03020214=\"确实要删除文件夹“{0}”以及全部内容吗？\"\n03020215=\"确实要删除这 {0} 项？\"\n03020216=\"正在删除...\"\n03020217=\"无法删除文件或文件夹.\"\n03020218=\"系统无法将过长路径的文件移动到回收站\"\n\n03020220=\"正在重新命名...\"\n03020221=\"无法重命名文件或文件夹。\"\n03020222=\"确认文件复制\"\n03020223=\"您确定复制文件到压缩档案\"\n\n03020230=\"新建文件夹\"\n03020231=\"文件夹名称：\"\n03020232=\"新建文件夹\"\n03020233=\"无法创建文件夹\"\n\n03020240=\"新建文件\"\n03020241=\"文件名：\"\n03020242=\"新文件.txt\"\n03020243=\"无法新建文件\"\n\n03020250=\"选择\"\n03020251=\"取消选定\"\n03020252=\"掩码：\"\n\n03020260=\"文件夹历史\"\n\n03020280=\"文件“{0}”已修改。\\n你想在压缩文件中更新它？\"\n03020281=\"无法更新文件\\n“{0}”，有可能该压缩档案是固实的。\"\n03020282=\"无法运行外部编辑。\"\n03020283=\"正在打开...\"\n03020284=\"此文件似乎是病毒文件(文件名中包含多个空格)。\"\n\n03020290=\"注释\"\n03020291=\"注释(&C)：\"\n\n030202A0=\"系统\"\n\n03020300=\"我的电脑\"\n03020301=\"网上邻居\"\n03020302=\"我的文档\"\n\n03020400=\" 添加 \"\n03020401=\" 释放 \"\n03020402=\" 测试 \"\n\n03020420=\" 复制 \"\n03020421=\" 移动 \"\n03020422=\" 删除 \"\n03020423=\" 信息 \"\n\n03020500=\"分割文件\"\n03020501=\"分割文件到(&S)：\"\n03020510=\"正在分割...\"\n03020520=\"确认分割\"\n03020521=\"您确认要将文件分割为 {0} 个分卷？\"\n03020522=\"分卷大小必须小于原文件大小\"\n\n03020600=\"合并文件\"\n03020601=\"合并文件到(&S)：\"\n03020610=\"正在合并...\"\n03020620=\"请选择分卷的首个文件\"\n03020621=\"无法检测出文件为压缩分卷\"\n03020622=\"无法检测出其他压缩分卷\"\n\n03020710=\"正在效验...\"\n03020720=\"效验信息\"\n03020721=\"CRC 数据效验：\"\n03020722=\"CRC 数据及文件名效验：\"\n\n03020800=\"正在搜索...\"\n\n03020900=\"属性\"\n\n03020A01=\"无法为过长的路径完成该操作。\"\n03020A02=\"您必须选择一个文件\"\n03020A03=\"您至少要选择一个文件\"\n03020A04=\"文件 {0} 已存在\"\n\n; Computer\n03031100=\"总大小\"\n03031101=\"可用空间\"\n03031102=\"簇大小\"\n03031103=\"卷标\"\n\n; Network\n03031200=\"本地名称\"\n03031201=\"供应者\"\n\n; Benchmark Dialog\n\n03080000=\"基准测试\"\n03080001=\"内存使用：\"\n03080002=\"压缩\"\n03080003=\"解压缩\"\n03080004=\"压缩速度\"\n03080005=\"处理速度\"\n03080006=\"平均处理速度\"\n03080007=\"当前\"\n03080008=\"最初结果\"\n03080009=\"传送：\"\n0308000A=\"发生错误：\"\n0308000B=\"CPU 使用率\"\n0308000C=\"使用率得分\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/Lang/zh-tw.txt",
    "content": "﻿;!@Lang@!UTF-8!\n; 7-Zip 4.59\n; Translated by Leon Tseng, sec2, 琥珀\n;\n;\n;\n;\n\n00000000=\"Chinese Traditional\"\n00000001=\"繁體中文\"\n00000002=\"4-1\"\n\n; 7-Zip Configuration\n\n; Title\n01000000=\"7-Zip 組態設定\"\n\n; Info Page\n01000100=\"關於 7-Zip\"\n01000103=\"7-Zip 為自由軟體。不過，您可以藉由註冊來支援 7-Zip 的開發。\"\n01000104=\"支援\"\n01000105=\"註冊\"\n\n; Folders Page\n01000200=\"資料夾\"\n01000210=\"工作資料夾(&W)\"\n01000211=\"系統暫存資料夾(&S)\"\n01000212=\"目前的資料夾(&C)\"\n01000213=\"指定的資料夾(&S):\"\n01000214=\"僅用於卸除式磁碟機\"\n\n01000281=\"請指定存放暫存壓縮檔的位置。\"\n\n; System Page\n01000300=\"系統\"\n01000301=\"將 7-Zip 整合到快顯功能表中\"\n01000302=\"串聯式快顯功能表\"\n01000310=\"快顯功能表項目:\"\n\n; Language Page\n01000400=\"語言\"\n01000401=\"介面語言:\"\n\n\n; 7-Zip Explorer extension\n\n; Context menu\n02000101=\"7-Zip\"\n02000102=\"7-Zip 指令\"\n02000103=\"開啟壓縮檔\"\n02000104=\"開啟選取的壓縮檔。\"\n02000105=\"解壓縮檔案...\"\n02000106=\"從選取的壓縮檔中解壓縮檔案。\"\n02000107=\"加入壓縮檔...\"\n02000108=\"將選取的項目加入壓縮檔中。\"\n02000109=\"測試壓縮檔\"\n0200010A=\"測試選取壓縮檔的完整性。\"\n0200010B=\"解壓縮至此\"\n0200010C=\"從選取的壓縮檔解壓縮檔案至目前的資料夾中。\"\n0200010D=\"解壓縮至 {0}\"\n0200010E=\"將檔案解壓縮到子資料夾。\"\n0200010F=\"加入 {0}\"\n02000110=\"將選取的項目加入壓縮檔中。\"\n02000111=\"壓縮並郵寄...\"\n02000112=\"將選取的項目壓縮為壓縮檔並經由電子郵件傳送此壓縮檔。\"\n02000113=\"壓縮成 {0} 並郵寄\"\n02000114=\"將選取的項目壓縮為壓縮檔並經由電子郵件傳送此壓縮檔。\"\n\n02000140=\"<資料夾>\"\n02000141=\"<壓縮檔>\"\n\n; Properties\n02000203=\"路徑\"\n02000204=\"名稱\"\n02000205=\"副檔名\"\n02000206=\"資料夾\"\n02000207=\"大小\"\n02000208=\"封裝後大小\"\n02000209=\"屬性\"\n0200020A=\"建立日期\"\n0200020B=\"存取日期\"\n0200020C=\"修改日期\"\n0200020D=\"緊密\"\n0200020E=\"註解\"\n0200020F=\"加密\"\n02000210=\"分割前\"\n02000211=\"分割後\"\n02000212=\"字典大小\"\n02000213=\"CRC\"\n02000214=\"類型\"\n02000215=\"防護\"\n02000216=\"方式\"\n02000217=\"主機作業系統\"\n02000218=\"檔案系統\"\n02000219=\"使用者\"\n0200021A=\"群組\"\n0200021B=\"區塊\"\n0200021C=\"註解\"\n0200021D=\"位置\"\n0200021E=\"路徑前綴\"\n0200021F=\"資料夾\"\n02000220=\"檔案\"\n02000221=\"版本\"\n02000222=\"卷\"\n02000223=\"多卷\"\n02000224=\"偏移\"\n02000225=\"連結\"\n02000226=\"區塊\"\n02000227=\"分卷\"\n\n; Status bar\n02000301=\"已選取 {0} 個物件\"\n02000302=\"{0} 個物件\"\n\n02000320=\"檔案:\"\n02000321=\"資料夾:\"\n02000322=\"大小:\"\n02000323=\"壓縮大小:\"\n02000324=\"壓縮檔:\"\n\n; List Context Menu\n02000401=\"欄位(&C)...\"\n\n02000411=\"開啟(&O)\"\n02000412=\"解壓縮(&E)...\"\n\n; ToolBar\n02000501=\"解壓縮\"\n\n; Messages\n02000601=\"此壓縮檔未支援更新操作。\"\n02000602=\"無法更新壓縮檔 {0}\"\n02000603=\"無法建立資料夾 '{0}'\"\n02000604=\"非支援的壓縮檔。\"\n02000605=\"錯誤\"\n02000606=\"項目過多\"\n02000607=\"沒有任何應用程式與特定的檔案副檔名有所關聯。\"\n02000608=\"沒有任何錯誤\"\n02000609=\"無法開啟壓縮檔 '{0}'\"\n0200060A=\"無法開啟加密的壓縮檔 '{0}'。錯誤的密碼?\"\n\n; Dialogs\n02000702=\"確定\"\n02000705=\"是(&Y)\"\n02000707=\"全部皆是(&A)\"\n02000709=\"否(&N)\"\n0200070B=\"全部皆否(&L)\"\n\n02000710=\"取消\"\n02000711=\"取消(&C)\"\n02000713=\"關閉(&C)\"\n02000714=\"停止\"\n02000715=\"重新開始\"\n\n02000720=\"說明\"\n\n; Extract dialog\n02000800=\"解壓縮\"\n02000801=\"解壓縮至(&X):\"\n02000802=\"密碼\"\n\n02000810=\"路徑模式\"\n02000811=\"完整的路徑名稱\"\n02000812=\"目前的路徑名稱\"\n02000813=\"不要路徑名稱\"\n\n02000820=\"覆寫模式\"\n02000821=\"覆寫前先詢問我\"\n02000822=\"覆寫時不詢問\"\n02000823=\"略過現有的檔案\"\n02000824=\"自動重新命名\"\n02000825=\"自動重新命名現有的檔案\"\n\n02000830=\"檔案\"\n02000831=\"選取的檔案(&S)\"\n02000832=\"所有檔案(&A)\"\n\n02000881=\"請指定存放暫存壓縮檔的位置。\"\n\n02000890=\"正在解壓縮\"\n\n; Overwrite dialog\n02000900=\"確認取代檔案\"\n02000901=\"目的資料夾已包含要處理的檔案。\"\n02000902=\"您要取代現有的檔案\"\n02000903=\"而改用這個檔案嗎?\"\n\n02000911=\"自動重新命名(&U)\"\n\n02000982=\"{0} 位元組\"\n02000983=\"修改日期\"\n\n; Messages dialog\n02000A00=\"診斷訊息\"\n\n02000A80=\"訊息\"\n\n02000A91=\"'{0}' 未支援此壓縮方式。\"\n02000A92=\"'{0}' 中的資料含有錯誤。檔案已損壞。\"\n02000A93=\"'{0}' 的 CRC 驗證失敗。檔案已損壞。\"\n02000A94=\"資料錯誤於加密的檔案 '{0}'。錯誤的密碼?\"\n02000A95=\"CRC 失敗於加密的檔案 '{0}'。錯誤的密碼?\"\n\n; Password dialog\n02000B00=\"輸入密碼\"\n02000B01=\"輸入密碼:\"\n02000B02=\"顯示密碼(&S)\"\n02000B03=\"重新輸入密碼:\"\n02000B10=\"密碼不一致\"\n02000B11=\"僅能使用英文字母、數字和特殊字元 (!, #, $, ...) 當作密碼\"\n02000B12=\"密碼太長\"\n\n; Progress dialog\n02000C00=\"進度\"\n02000C01=\"經過時間:\"\n02000C02=\"剩餘時間:\"\n02000C03=\"大小:\"\n02000C04=\"速度:\"\n02000C05=\"已處理:\"\n02000C06=\"壓縮率:\"\n\n02000C10=\"背景作業(&B)\"\n02000C11=\"前景作業(&F)\"\n02000C12=\"暫停(&P)\"\n02000C13=\"繼續(&C)\"\n\n02000C20=\"暫停\"\n\n02000C30=\"您確定要取消嗎?\"\n\n; Compress dialog\n02000D00=\"加入壓縮檔\"\n02000D01=\"壓縮檔(&A):\"\n02000D02=\"更新模式(&U):\"\n02000D03=\"壓縮檔格式(&F):\"\n02000D04=\"壓縮方式(&M):\"\n02000D05=\"建立結實壓縮檔(&S)\"\n02000D06=\"參數(&P):\"\n02000D07=\"選項\"\n02000D08=\"建立自解壓縮檔(&X)\"\n02000D09=\"多執行緒\"\n02000D0A=\"加密檔名(&N)\"\n02000D0B=\"壓縮層級(&L):\"\n02000D0C=\"字典大小(&D):\"\n02000D0D=\"字組大小(&W):\"\n02000D0E=\"壓縮時記憶體使用:\"\n02000D0F=\"解壓縮時記憶體使用:\"\n02000D10=\"加密\"\n02000D11=\"加密方法:\"\n02000D12=\"CPU 線程數:\"\n02000D13=\"結實區塊大小:\"\n02000D14=\"非結實\"\n02000D15=\"結實\"\n02000D16=\"壓縮共用檔案\"\n\n02000D40=\"分割壓縮檔，位元組(&V):\"\n02000D41=\"不正確的分割大小\"\n02000D42=\"指定的分割大小: {0} 位元組。\\n您確定要分割為這些壓縮檔嗎?\"\n\n02000D81=\"封存\"\n02000D82=\"一般壓縮\"\n02000D83=\"最大壓縮\"\n02000D84=\"快速壓縮\"\n02000D85=\"最快速壓縮\"\n02000D86=\"極致壓縮\"\n\n02000D90=\"瀏覽\"\n\n02000DA1=\"加入並取代檔案\"\n02000DA2=\"更新並加入檔案\"\n02000DA3=\"更新現有的檔案\"\n02000DA4=\"同步處理檔案\"\n\n02000DB1=\"所有檔案\"\n\n02000DC0=\"正在壓縮\"\n\n; Columns dialog\n02000E00=\"欄位\"\n02000E01=\"核取您想在此資料夾中所要顯示的欄位。請使用 [上移] 和 [下移] 按鈕重新排列欄位的順序。\"\n02000E02=\"選取的欄位應該是\"\n02000E03=\"像素寬度(&W)\"\n\n02000E10=\"上移(&U)\"\n02000E11=\"下移(&D)\"\n02000E12=\"顯示(&S)\"\n02000E13=\"隱藏(&H)\"\n02000E14=\"設定\"\n\n02000E81=\"標題\"\n02000E82=\"寬度\"\n\n; Testing\n02000F90=\"測試\"\n\n\n; File Manager\n\n03000000=\"7-Zip 檔案管理員\"\n\n; Menu\n03000102=\"檔案(&F)\"\n03000103=\"編輯(&E)\"\n03000104=\"檢視(&V)\"\n03000105=\"工具(&T)\"\n03000106=\"說明(&H)\"\n03000107=\"我的最愛(&A)\"\n\n; File\n03000210=\"開啟(&O)\"\n03000211=\"在內部開啟(&I)\"\n03000212=\"在外部開啟(&U)\"\n03000220=\"檢視(&V)\"\n03000221=\"編輯(&E)\"\n03000230=\"重新命名(&M)\"\n03000231=\"複製到(&C)...\"\n03000232=\"移動到(&M)...\"\n03000233=\"刪除(&D)\"\n03000240=\"內容(&R)\"\n03000241=\"註解(&N)\"\n03000242=\"計算驗證值\"\n03000250=\"建立資料夾\"\n03000251=\"建立檔案\"\n03000260=\"結束(&X)\"\n03000270=\"分割檔案(&S)...\"\n03000271=\"合併檔案(&B)...\"\n\n; Edit\n03000310=\"還原(&U)\"\n03000311=\"重做(&R)\"\n03000320=\"剪下(&T)\"\n03000321=\"複製(&C)\"\n03000322=\"貼上(&P)\"\n03000323=\"刪除(&D)\"\n03000330=\"全選(&A)\"\n03000331=\"全不選\"\n03000332=\"反向選擇(&I)\"\n03000333=\"選取...\"\n03000334=\"取消選取...\"\n03000335=\"依類型選取\"\n03000336=\"依類型不選取\"\n\n; View\n03000410=\"大圖示(&G)\"\n03000411=\"小圖示(&M)\"\n03000412=\"清單(&L)\"\n03000413=\"詳細資料(&D)\"\n03000420=\"不排序\"\n03000430=\"開啟根目錄\"\n03000431=\"上移一層\"\n03000432=\"資料夾歷程記錄...\"\n03000440=\"重新整理(&R)\"\n03000449=\"攤開檢視\"\n03000450=\"雙窗格(&2)\"\n03000451=\"工具列(&T)\"\n03000460=\"壓縮檔工具列\"\n03000461=\"標準工具列\"\n03000462=\"大型按鈕\"\n03000463=\"顯示按鈕文字\"\n\n; Tools\n03000510=\"選項(&O)...\"\n03000511=\"效能測試(&B)\"\n\n; Help\n03000610=\"內容(&C)...\"\n03000620=\"關於 7-Zip(&A)...\"\n\n; Favorites\n03000710=\"將資料夾加入我的最愛為(&A)\"\n03000720=\"書籤\"\n\n; Options Dialog\n\n03010000=\"選項\"\n\n; Plugins\n03010100=\"外掛程式\"\n03010101=\"外掛程式(&P):\"\n03010110=\"選項...\"\n\n; Edit\n03010200=\"編輯器\"\n03010201=\"編輯器(&E):\"\n\n; System\n03010300=\"系統\"\n03010302=\"使 7-Zip 與之產生關聯:\"\n03010310=\"外掛程式\"\n\n; Settings\n03010400=\"設定\"\n03010401=\"顯示 \\\"..\\\" 項目\"\n03010402=\"顯示實際檔案圖示\"\n03010410=\"顯示系統選單\"\n03010420=\"整列選取(&F)\"\n03010421=\"顯示格線(&G)\"\n03010430=\"使用替代選擇模式(&A)\"\n03010440=\"使用大量記憶體分頁(&L)\"\n\n; Strings\n\n03020201=\"複製\"\n03020202=\"移動\"\n03020203=\"複製到:\"\n03020204=\"移動到:\"\n03020205=\"正在複製...\"\n03020206=\"正在移動...\"\n03020207=\"您不能在這類資料夾中移動或複製項目。\"\n03020208=\"未支援的操作。\"\n03020209=\"選擇目標資料夾。\"\n\n03020210=\"確認刪除檔案\"\n03020211=\"確認刪除資料夾\"\n03020212=\"確認刪除多個檔案\"\n03020213=\"您確定要刪除 '{0}' 嗎?\"\n03020214=\"您確定要刪除資料夾 '{0}' 以及它所有的內容嗎?\"\n03020215=\"您確定要刪除這 {0} 個項目嗎? \"\n03020216=\"正在刪除...\"\n03020217=\"刪除檔案或資料夾時發生錯誤\"\n\n03020220=\"正在重新命名...\"\n03020221=\"重新命名檔案或資料夾時發生錯誤\"\n03020222=\"確認複製檔案\"\n03020223=\"您確定要複製檔案至壓縮檔?\"\n\n03020230=\"建立資料夾\"\n03020231=\"資料夾名稱:\"\n03020232=\"新增資料夾\"\n03020233=\"建立資料夾時發生錯誤\"\n\n03020240=\"建立檔案\"\n03020241=\"檔案名稱:\"\n03020242=\"新增檔案\"\n03020243=\"建立檔案時發生錯誤\"\n\n03020250=\"選取\"\n03020251=\"取消選取\"\n03020252=\"遮罩:\"\n\n03020260=\"資料夾歷程記錄\"\n\n03020280=\"檔案 '{0}' 已被修改過。\\n您是否要在此壓縮檔內更新檔案?\"\n03020281=\"無法更新檔案\\n'{0}'\"\n03020282=\"無法啟動編輯器。\"\n03020283=\"正在開啟...\"\n\n03020290=\"註解\"\n03020291=\"註解(&C):\"\n\n030202A0=\"系統\"\n\n03020300=\"電腦\"\n03020301=\"網路\"\n03020302=\"文件\"\n\n03020400=\"加入\"\n03020401=\"解壓縮\"\n03020402=\"測試\"\n\n03020420=\"複製\"\n03020421=\"移動\"\n03020422=\"刪除\"\n03020423=\"資訊\"\n\n03020500=\"分割檔案\"\n03020501=\"分割到(&S):\"\n03020510=\"正在分割...\"\n03020520=\"確認分割\"\n03020521=\"您確定要分割檔案為 {0} 個?\"\n03020522=\"分割大小必須小於原始檔案大小\"\n\n03020600=\"合併檔案\"\n03020601=\"合併到(&C):\"\n03020610=\"正在合併...\"\n03020620=\"僅選取第一個檔案\"\n\n03020710=\"正在計算驗證值...\"\n03020720=\"驗證值資訊\"\n03020721=\"資料的 CRC 驗證值:\"\n03020722=\"資料及名稱的 CRC 驗證值:\"\n\n03020800=\"正在掃瞄...\"\n\n03020900=\"內容\"\n\n; Computer\n03031100=\"全部大小\"\n03031101=\"可用空間\"\n03031102=\"叢集大小\"\n03031103=\"標籤\"\n\n; Network\n03031200=\"本機名稱\"\n03031201=\"提供者\"\n\n; Benchmark Dialog\n\n03080000=\"效能測試\"\n03080001=\"記憶體使用:\"\n03080002=\"壓縮\"\n03080003=\"解壓縮\"\n03080004=\"速度\"\n03080005=\"評等\"\n03080006=\"整體評等\"\n03080007=\"目前\"\n03080008=\"結果\"\n03080009=\"通過數:\"\n0308000A=\"錯誤數:\"\n0308000B=\"CPU 使用\"\n0308000C=\"評等 / 使用\"\n\n;!@LangEnd@!\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/#ITBITS",
    "content": ""
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/7zip.hhc",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">\r\n<!-- Sitemap 1.0 -->\r\n</HEAD><BODY>\r\n<OBJECT type=\"text/site properties\">\r\n  <param name=\"ImageType\" value=\"Folder\">\r\n</OBJECT>\r\n<UL>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"7-Zip Start Page\">\r\n    <param name=\"Local\" value=\"start.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"General Information\">\r\n    <param name=\"Local\" value=\"general/index.htm\">\r\n    <param name=\"ImageNumber\" value=\"1\">\r\n    </OBJECT>\r\n  <UL>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Supported formats\">\r\n      <param name=\"Local\" value=\"general/formats.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"7z format\">\r\n      <param name=\"Local\" value=\"general/7z.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Performance\">\r\n      <param name=\"Local\" value=\"general/performance.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Frequently Asked Questions\">\r\n      <param name=\"Local\" value=\"general/faq.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"License\">\r\n      <param name=\"Local\" value=\"general/license.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Register 7-Zip\">\r\n      <param name=\"Local\" value=\"general/register.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Thanks\">\r\n      <param name=\"Local\" value=\"general/thanks.htm\">\r\n      </OBJECT>\r\n  </UL>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"File Manager\">\r\n    <param name=\"Local\" value=\"fm/index.htm\">\r\n    <param name=\"ImageNumber\" value=\"1\">\r\n    </OBJECT>\r\n  <UL>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Menu Items and Shortcut Keys\">\r\n      <param name=\"Local\" value=\"fm/Menu.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Options Dialog Box\">\r\n      <param name=\"Local\" value=\"fm/options.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Benchmark\">\r\n      <param name=\"Local\" value=\"fm/benchmark.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"About Dialog Box\">\r\n      <param name=\"Local\" value=\"fm/about.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Plugins\">\r\n      <param name=\"Local\" value=\"fm/plugins/index.htm\">\r\n      <param name=\"ImageNumber\" value=\"1\">\r\n      </OBJECT>\r\n    <UL>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"7-Zip\">\r\n        <param name=\"Local\" value=\"fm/plugins/7-zip/index.htm\">\r\n        <param name=\"ImageNumber\" value=\"1\">\r\n        </OBJECT>\r\n      <UL>\r\n        <LI> <OBJECT type=\"text/sitemap\">\r\n          <param name=\"Name\" value=\"Add to Archive Dialog Box\">\r\n          <param name=\"Local\" value=\"fm/plugins/7-zip/add.htm\">\r\n          </OBJECT>\r\n        <LI> <OBJECT type=\"text/sitemap\">\r\n          <param name=\"Name\" value=\"Extract Dialog Box\">\r\n          <param name=\"Local\" value=\"fm/plugins/7-zip/extract.htm\">\r\n          </OBJECT>\r\n        <LI> <OBJECT type=\"text/sitemap\">\r\n          <param name=\"Name\" value=\"7-Zip Plugin Options\">\r\n          <param name=\"Local\" value=\"fm/plugins/7-zip/options.htm\">\r\n          </OBJECT>\r\n      </UL>\r\n    </UL>\r\n  </UL>\r\n  \r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Command Line Version\">\r\n    <param name=\"Local\" value=\"cmdline/index.htm\">\r\n    <param name=\"ImageNumber\" value=\"1\">\r\n    </OBJECT>\r\n  <UL>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Syntax\">\r\n      <param name=\"Local\" value=\"cmdline/syntax.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Exit Codes\">\r\n      <param name=\"Local\" value=\"cmdline/exit_codes.htm\">\r\n      </OBJECT>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Commands\">\r\n      <param name=\"Local\" value=\"cmdline/commands/index.htm\">\r\n      <param name=\"ImageNumber\" value=\"1\">\r\n      </OBJECT>\r\n    <UL>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"a (Add)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/add.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"b (Bench)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/bench.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"d (Delete)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/delete.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"e (Extract)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/extract.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"l (List)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/list.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"t (Test)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/test.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"u (Update)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/update.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"x (eXtract with full paths)\">\r\n        <param name=\"Local\" value=\"cmdline/commands/extract_full.htm\">\r\n        </OBJECT>\r\n    </UL>\r\n    <LI> <OBJECT type=\"text/sitemap\">\r\n      <param name=\"Name\" value=\"Switches\">\r\n      <param name=\"Local\" value=\"cmdline/switches/index.htm\">\r\n      <param name=\"ImageNumber\" value=\"1\">\r\n      </OBJECT>\r\n    <UL>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-- (Stop switches parsing)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/stop_switch.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-ai (Include archive filenames) switch\">\r\n        <param name=\"Local\" value=\"cmdline/switches/ar_include.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-an (Disable parsing of archive_name) switch\">\r\n        <param name=\"Local\" value=\"cmdline/switches/ar_no.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-ao (Overwrite mode)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/overwrite.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-ax (Exclude archive filenames) switch\">\r\n        <param name=\"Local\" value=\"cmdline/switches/ar_exclude.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-i (Include filenames)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/include.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-m (Set Compression Method)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/method.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-o (Set Output directory)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/output_dir.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-p (Set Password)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/password.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-r (Recurse subdirectories)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/recurse.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-scs (Set charset for list files)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/charset.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-seml (Send archive by email)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/email.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-sfx (Create SFX archive)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/sfx.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-si (Read data from StdIn)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/stdin.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-so (Write data to StdOut)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/stdout.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-slp (Set Large Pages mode)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/large_pages.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-slt (Show technical information)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/list_tech.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-ssc (Set Sensitive Case mode)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/ssc.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-ssw (Compress files open for writing)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/shared.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-t (Set Type of archive)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/type.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-u (Update options)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/update.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-v (Create Volumes)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/volume.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-w (Set Working directory)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/working_dir.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-x (Exclude filenames)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/exclude.htm\">\r\n        </OBJECT>\r\n      <LI> <OBJECT type=\"text/sitemap\">\r\n        <param name=\"Name\" value=\"-y (Assume Yes on all queries)\">\r\n        <param name=\"Local\" value=\"cmdline/switches/yes.htm\">\r\n        </OBJECT>\r\n    </UL>\r\n  </UL>\r\n</UL>\r\n</BODY></HTML>\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/7zip.hhk",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">\r\n<!-- Sitemap 1.0 -->\r\n</HEAD><BODY>\r\n<UL>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Start Page\">\r\n    <param name=\"Local\" value=\"start.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"General Information\">\r\n    <param name=\"Local\" value=\"general/index.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"License\">\r\n    <param name=\"Local\" value=\"general/license.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Register\">\r\n    <param name=\"Local\" value=\"general/register.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Formats\">\r\n    <param name=\"Local\" value=\"general/formats.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"7z format\">\r\n    <param name=\"Local\" value=\"general/7z.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Performance\">\r\n    <param name=\"Local\" value=\"general/performance.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"FAQ\">\r\n    <param name=\"Local\" value=\"general/faq.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Thanks\">\r\n    <param name=\"Local\" value=\"general/thanks.htm\">\r\n    </OBJECT>\r\n\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"File Manager\">\r\n    <param name=\"Local\" value=\"fm/index.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Options Dialog Box\">\r\n    <param name=\"Local\" value=\"fm/options.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Benchmark\">\r\n    <param name=\"Local\" value=\"fm/benchmark.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"About Dialog Box\">\r\n    <param name=\"Local\" value=\"fm/about.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Menu\">\r\n    <param name=\"Local\" value=\"fm/menu.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"7-Zip Plugin\">\r\n    <param name=\"Local\" value=\"fm/plugins/7-zip/index.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Extract Dialog Box\">\r\n    <param name=\"Local\" value=\"fm/plugins/7-zip/extract.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Add to Archive Dialog Box\">\r\n    <param name=\"Local\" value=\"fm/plugins/7-zip/add.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"7-Zip Plugin Options Dialog Box\">\r\n    <param name=\"Local\" value=\"fm/plugins/7-zip/options.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Command Line Version\">\r\n    <param name=\"Local\" value=\"cmdline/index.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Command Line Syntax\">\r\n    <param name=\"Local\" value=\"cmdline/syntax.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Exit Codes\">\r\n    <param name=\"Local\" value=\"cmdline/exit_codes.htm\">\r\n    </OBJECT>\r\n\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Commands\">\r\n    <param name=\"Local\" value=\"cmdline/commands/index.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"a (Add) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/add.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"b (Bencmark) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/bench.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"d (Delete) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/delete.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"e (Extract) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/extract.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"x (Extract with full paths) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/extract_full.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"l (List contents of archive) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/list.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"t (Test integrity of archive) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/test.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"u (Update) command\">\r\n    <param name=\"Local\" value=\"cmdline/commands/update.htm\">\r\n    </OBJECT>\r\n\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"Switches\">\r\n    <param name=\"Local\" value=\"cmdline/switches/index.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-- (Stop switches parsing) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/stop_switch.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-ai (Include archive filenames) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/ar_include.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-an (Disable parsing of archive_name) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/ar_no.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-ao (Overwrite mode) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/overwrite.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-ax (Exclude archive filenames) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/ar_exclude.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-i (Inlude filenames) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/include.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-m (Set compression Method) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/method.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-o (set Output directory) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/output_dir.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-p (set Password) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/password.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-r (Recurse subdirectories) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/recurse.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-scs (Set charset for list files) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/charset.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-seml (Send archive by email) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/email.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-sfx (Create SFX archive) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/sfx.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-slp (Set Large Pages mode) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/large_pages.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-slt (Show technical information) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/list_tech.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-si (read data from StdIn) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/stdin.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-so (write data to stdout) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/stdout.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-ssc (Set Sensitive Case mode) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/ssc.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-ssw (Compress files open for writing) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/shared.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-t (set Type of archive) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/type.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-u (Update options) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/update.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-v (Create Volumes) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/volume.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-w (set Working directory) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/working_dir.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-x (Exclude filenames) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/exclude.htm\">\r\n    </OBJECT>\r\n  <LI> <OBJECT type=\"text/sitemap\">\r\n    <param name=\"Name\" value=\"-y (assume Yes on all queries) switch\">\r\n    <param name=\"Local\" value=\"cmdline/switches/yes.htm\">\r\n    </OBJECT>\r\n</UL>\r\n</BODY></HTML>\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/add.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>a (Add) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>a (Add) command</H1>\n\n<P>Adds files to archive.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a archive1.zip subdir\\\n</PRE>\n\n<P>adds all files and subfolders from folder <SPAN class=\"filename\">subdir</SPAN> to archive\n  <SPAN class=\"filename\">archive1.zip</SPAN>. \n  The filenames in archive will contain <SPAN class=\"filename\">subdir\\</SPAN> prefix.</P>\n\n<PRE class=\"example\">\n7z a archive2.zip .\\subdir\\*\n</PRE>\n\n<P>adds all files and subfolders from folder <SPAN class=\"filename\">subdir</SPAN> to archive\n  <SPAN class=\"filename\">archive2.zip</SPAN>.\n  The filenames in archive will not contain <SPAN class=\"filename\">subdir\\</SPAN> prefix.</P>\n\n\n<PRE class=\"example\">\ncd /D c:\\dir1\\\n7z a c:\\archive3.zip dir2\\dir3\\ \n</PRE>\n\nThe filenames in archive <SPAN class=\"filename\">c:\\archive3.zip</SPAN> \nwill contain <SPAN class=\"filename\">dir2\\dir3\\</SPAN> prefix, \nbut they will not contain <SPAN class=\"filename\">c:\\dir1\\</SPAN> prefix.\n\n<PRE class=\"example\">\n7z a Files.7z *.txt -r\n</PRE>\n\n<P>adds all *.txt files from current folder and its subfolders to archive\n    <SPAN class=\"filename\">Files.7z</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/method.htm\">-m (Method)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/sfx.htm\">-sfx (create SFX)</A><BR>\n  <A href=\"../switches/stdin.htm\">-si (use StdIn)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/update.htm\">-u (Update)</A><BR>\n  <A href=\"../switches/volume.htm\">-v (Volumes)</A><BR>\n  <A href=\"../switches/working_dir.htm\">-w (Working Dir)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B>\n    <A href=\"delete.htm\">d (Delete)</A>,\n    <A href=\"update.htm\">u (Update)</A><BR>\n  <B>Switches:</B>\n    <A href=\"../switches/update.htm\">-u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/bench.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>b (Benchmark) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>b (Benchmark) command</H1>\n\n<P>Measures speed of the CPU and checks RAM for errors.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\nb [number_of_iterations] [-mmt{N}] [-md{N}] [-mm={Method}]\n</PRE>\n\n<P>There are two tests:<P>\n<OL>\n  <LI>Compressing with LZMA method\n  <LI>Decompressing with LZMA method\n</OL>\n\n<P>The benchmark shows a rating in MIPS (million instructions per second).\nThe rating value is calculated from the measured CPU speed and it\nis normalized with results of Intel Core 2 CPU with multi-threading option \nswitched off. So if you have Intel Core 2 Duo, \nrating values must be close to real CPU frequency.</P>\n\n<P>You can change the upper dictionary size to increase memory usage by -md{N} switch.\nAlso, you can change the number of threads by -mmt{N} switch.</P>\n\n<P>The <B>Dict</B> column shows dictionary size. For example, 21 means 2^21 = 2 MB.</P>\n\n<P>The <B>Usage</B> column shows the percentage of time the processor is working.\nIt's normalized for a one-thread load. For example, 180% CPU Usage for 2 threads\ncan mean that average CPU usage is about 90% for each thread.</P>\n\n<P>The <B>R / U</B> column shows the rating normalized for 100% of CPU usage.\nThat column shows the performance of one average CPU thread.</P>\n\n<P><B>Avr</B> shows averages for different dictionary sizes.</P>\n<P><B>Tot</B> shows averages of the compression and decompression ratings.</P>\n\n<P>Compression speed and rating strongly depend on memory (RAM) latency.\n\n<P>Decompression speed and rating strongly depend on the integer performance of the CPU.\nFor example, the Intel Pentium 4 has big branch\nmisprediction penalty (which is an effect of its long pipeline) and pretty slow\nmultiply and shift operations. So, the Pentium 4 has pretty low decompressing ratings.</P>\n\n<P>You can run a CRC calculation benchmark by specifying -mm=crc.\nThat test shows the speed of CRC calculation in MB/s. The first column shows the size of the block.\nThe next column shows the speed of CRC calculation for one thread. The other columns are results\nfor multi-threaded CRC calculation.</P> \n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z b\n</PRE>\nruns benchmarking.\n\n<PRE class=\"example\">\n7z b -mmt1 -md26\n</PRE>\nruns benchmarking with one thread and 64 MB dictionary.\n\n<PRE class=\"example\">\n7z b 30\n</PRE>\n<P>runs benchmarking with default settings for 30 iterations.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/delete.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>d (Delete) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>d (Delete) command</H1>\n\n<P>Deletes files from archive.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z d archive.zip *.bak -r\n</PRE>\n\n<P>deletes <SPAN class=\"filename\">*.bak</SPAN> files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/method.htm\">-m (Method)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/update.htm\">-u (Update)</A><BR>\n  <A href=\"../switches/working_dir.htm\">-w (Working Dir)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"add.htm\">a (Add)</A>,\n  <A href=\"update.htm\">u (Update)</A>\n</P>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"../switches/update.htm\">-u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/extract.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>e (Extract) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>e (Extract) command</H1>\n\n<P>Extracts files from an archive to the current\ndirectory or to the output directory. The output directory can be specified by\n<A href=\"../switches/output_dir.htm\">-o (Set Output Directory)</A> switch.</P>\n\n<P>This command copies all extracted files to one directory.\nIf you want extract files with full paths, you must use\n<A href=\"extract_full.htm\">x (Extract with full paths)</A> command.\n\n<P>7-Zip will prompt the user before overwriting existing files unless\nthe user specifies the <A href=\"../switches/yes.htm\">-y (Assume Yes on all queries)</A>\nswitch. If the user gives a <B>no</B> answer, 7-Zip will prompt for the file to be\nextracted to a new filename. Then a <B>no</B> answer skips that file; or, <B>yes</B>\nprompts for new filename.</P>\n\n<P>7-Zip accepts the following responses:</P>\n\n<TABLE>\n  <TR> <TH>Answer</TH> <TH>Abbr.</TH> <TH>Action</TH> </TR>\n  <TR> <TD>Yes</TD> <TD>y</TD> <TD>&nbsp;</TD> </TR>\n  <TR> <TD>No</TD> <TD>n</TD> <TD>&nbsp;</TD> </TR>\n  <TR> <TD>Always</TD> <TD>a</TD> <TD>Assume YES for ALL subsequent queries of the same class</TD> </TR>\n  <TR> <TD>Skip</TD> <TD>s</TD> <TD>Assume NO for ALL subsequent queries of the same class</TD> </TR>\n  <TR> <TD>Quit</TD> <TD>q</TD> <TD>Quit the program</TD> </TR>\n\n</TABLE>\n\n<P>Abbreviated responses are allowed.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z e archive.zip\n</PRE>\n\n<P>extracts all files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to the current directory.</P>\n\n<PRE class=\"example\">\n7z e archive.zip -oc:\\soft *.cpp -r\n</PRE>\n\n<P>extracts all <SPAN class=\"filename\">*.cpp</SPAN> files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to <SPAN class=\"filename\">c:\\soft</SPAN> folder.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/overwrite.htm\">-ao (Overwrite mode)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/output_dir.htm\">-o (Set Output Directory)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A><BR>\n  <A href=\"../switches/yes.htm\">-y (Assume Yes on all queries)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/extract_full.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>x (Extract with full paths) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>x (Extract with full paths) command</H1>\n\n<P>Extracts files from an archive with their full\npaths in the current directory, or in an output directory if specified.</P>\n\n<P>See the <A href=\"extract.htm\">e (Extract)</A> command description for more deatails.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x archive.zip\n</PRE>\n\n<P>extracts all files from the archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to the current directory.</P>\n\n<PRE class=\"example\">\n7z x archive.zip -oc:\\soft *.cpp -r\n</PRE>\n\n<P>extracts all <SPAN class=\"filename\">*.cpp</SPAN> files from the archive\n    <SPAN class=\"filename\">archive.zip</SPAN> to <SPAN class=\"filename\">c:\\soft</SPAN> folder.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/overwrite.htm\">-ao (Overwrite mode)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/output_dir.htm\">-o (Set Output Directory)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A><BR>\n  <A href=\"../switches/yes.htm\">-y (Assume Yes on all queries)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"extract.htm\">e (Extract)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Commands</TITLE>\n  <LINK href=\"style.css\" rel=stylesheet type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Commands</H1>\n\n<P>The command is the first non-switch argument on the command line.</P>\n<P>Command names are not case sensitive.</P>\n<P>See also <A href =\"../syntax.htm\">Command Line Syntax</A> for more details about using the command line.</P>\n\n<H2>Commands quick reference</H2>\n\n<TABLE border=\"1\" cellpadding=\"3\" cellspacing=\"0\">\n<TR><TH>Command</TH><TH>Description</TH></TR>\n<TR> <TD><A href=\"add.htm\">a</A></TD> <TD><A href=\"add.htm\">Add</A></TD></TR>\n<TR> <TD><A href=\"bench.htm\">b</A></TD> <TD><A href=\"bench.htm\">Benchmark</A></TD></TR>\n<TR> <TD><A href=\"delete.htm\">d</A></TD> <TD><A href=\"delete.htm\">Delete</A></TD></TR>\n<TR> <TD><A href=\"extract.htm\">e</A></TD> <TD><A href=\"extract.htm\">Extract</A></TD></TR>\n<TR> <TD><A href=\"list.htm\">l</A></TD> <TD><A href=\"list.htm\">List</A></TD></TR>\n<TR> <TD><A href=\"test.htm\">t</A></TD> <TD><A href=\"test.htm\">Test</A></TD></TR>\n<TR> <TD><A href=\"update.htm\">u</A></TD> <TD><A href=\"update.htm\">Update</A></TD></TR>\n<TR> <TD><A href=\"extract_full.htm\">x</A></TD> <TD><A href=\"extract_full.htm\">eXtract with full paths</A></TD></TR>\n</TABLE>\n\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/list.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>l (List contents of archive) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>l (List contents of archive) command</H1>\n\n\n\n<!--\n<H4>Syntax</H4>\n<P><PRE class=\"syntax\">\nl[a | t][f]\n</PRE></P>\n\n-->\n\n<P>Lists contents of archive.</P>\n\n<!-- \n<P>The following options can be used:</P>\n<TABLE>\n<TR> <TH>Option</TH> <TH>Description</TH> </TR>\n<TR> <TD>a</TD> <TD>List with Additional fields</TD> </TR>\n<TR> <TD>t</TD> <TD>List with all fields, including Technical</TD> </TR>\n<TR> <TD>f</TD> <TD>List with Full pathnames</TD> </TR>\n</TABLE>\n-->\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z l archive.zip\n</PRE>\n\n<P>lists all files from archive <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n<!--\n<PRE class=\"example\">\n7z lf archive.zip *.txt\n</PRE>\n\n<P>lists <SPAN class=\"filename\">*.txt</SPAN> files from archive\n    <SPAN class=\"filename\">archive.zip</SPAN> with full pathnames.</P>\n-->\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/list_tech.htm\">-slt (Show technical information)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/test.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>t (Test integrity of archive) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>t (Test integrity of archive) command</H1>\n\n<P>Tests archive files.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z t archive.zip *.doc -r\n</PRE>\n\n<P>tests <SPAN class=\"filename\">*.doc</SPAN> files in archive\n    <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/ar_include.htm\">-ai (Include archives)</A><BR>\n  <A href=\"../switches/ar_no.htm\">-an (Disable parsing of archive_name)</A><BR>\n  <A href=\"../switches/ar_exclude.htm\">-ax (Exclude archives)</A><BR>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/commands/update.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>u (Update) command</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>u (Update) command</H1>\n\n<P>Update older files in the archive and add files that are not already in the archive.</P>\n\n<P>Note: The current version of 7-Zip cannot change an archive which\nwas created with the solid option switched on.\nTo update a .7z archive you must create and update that archive only in non-solid\nmode (-ms=off switch).</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z u archive.zip *.doc\n</PRE>\n\n<P>updates <SPAN class=\"filename\">*.doc</SPAN> files to archive\n    <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n\n<H4>Notes</H4>\n\n<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process \nall files, you must use a * wildcard.</P>\n\n\n<H4>Switches that can be used with this command</H4>\n\n<P>\n  <A href=\"../switches/include.htm\">-i (Include)</A><BR>\n  <A href=\"../switches/method.htm\">-m (Method)</A><BR>\n  <A href=\"../switches/password.htm\">-p (Set Password)</A><BR>\n  <A href=\"../switches/recurse.htm\">-r (Recurse)</A><BR>\n  <A href=\"../switches/sfx.htm\">-sfx (create SFX)</A><BR>\n  <A href=\"../switches/stdin.htm\">-si (use StdIn)</A><BR>\n  <A href=\"../switches/stdout.htm\">-so (use StdOut)</A><BR>\n  <A href=\"../switches/type.htm\">-t (Type of archive)</A><BR>\n  <A href=\"../switches/update.htm\">-u (Update)</A><BR>\n  <A href=\"../switches/working_dir.htm\">-w (Working Dir)</A><BR>\n  <A href=\"../switches/exclude.htm\">-x (Exclude)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Commands:</B> \n  <A href=\"add.htm\">a (Add)</A>,\n  <A href=\"delete.htm\">d (Delete)</A>,\n</P>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"../switches/update.htm\">-u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/exit_codes.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Exit Codes from 7-Zip</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Exit Codes from 7-Zip</H1>\n\n<P>7-Zip returns the following exit codes:</P>\n\n<TABLE>\n  <TR><TH>Code</TH><TH>Meaning</TH></TR>\n  <TR><TD>0</TH><TD>No error</TD></TR>\n  <TR><TD>1</TH><TD>Warning (Non fatal error(s)). For example, one or more files were\n  locked by some other application, so they were not compressed.</TD></TR>\n  <TR><TD>2</TH><TD>Fatal error</TD></TR>\n  <TR><TD>7</TH><TD>Command line error</TD></TR>\n  <TR><TD>8</TH><TD>Not enough memory for operation</TD></TR>\n  <TR><TD>255</TH><TD>User stopped the process</TD></TR>\n</TABLE>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Version User's Guide</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Version User's Guide</H1>\n\n\n<P>7z.exe is the command line version of 7-Zip. 7z.exe uses 7z.dll\nfrom the 7-Zip package. 7z.dll is used by the 7-Zip File Manager also.</LI>\n\n<P>7za.exe (a = alone) is a standalone version of 7-Zip.\n7za.exe supports only 7z, lzma, cab, zip, gzip, bzip2, Z and tar formats.\n7za.exe doesn't use external modules.</LI>\n\n<UL>\n  <LI><A href = \"syntax.htm\">Command Line syntax</A></LI>\n  <LI><A href = \"exit_codes.htm\">Exit Codes</A></LI>\n  <LI><A href = \"commands/index.htm\">Commands</A></LI>\n  <LI><A href = \"switches/index.htm\">Switches</A></LI>\n</UL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/ar_exclude.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ax (Exclude archive filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ax (Exclude archive filenames) switch</H1>\n\n<P>Specifies archives to be excluded from the operation.</P>\n<P>Multiple exclude archive switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-ax[&lt;recurse_type>]&lt;file_ref>\n\n&lt;recurse_type> ::= r[- | 0]\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<P>See <A href=\"include.htm\">-xi (Include archive filenames)</A> switch description \nfor information about option parameters.</P>\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -an -ai!*.7z -ax!a*.7z\n</PRE>\n\n<P>tests all <SPAN class=\"filename\">*.7z</SPAN> archives,\n  except <SPAN class=\"filename\">a*.7z</SPAN> archives.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"include.htm\">-ai (Include archives)</A>\n  <A href=\"ar_no.htm\">-an (Disable parsing of archive_name)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/ar_include.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ai (Include archive filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ai (Include archive filenames) switch</H1>\n\n<P>Specifies additional include archive filenames and wildcards.</P>\n<P>Multiple include switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-ai[<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A>]<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A>\n\n<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A> ::= r[- | 0]\n<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<H4>Parameters</H4>\n\n<DL>\n  <DT><A name=\"recurse_type\"></A>&lt;recurse_type></DT>\n  <DD><P>Specifies how wildcards and file names in this switch must\n         be used.  If this option is not given, recursion will be not used.\n         For more details see specification of the\n         <A href=\"recurse.htm\">-r (Recurse)</A> switch.</P>\n<PRE class=\"syntax\">\n&lt;recurse_type> ::= r[- | 0]\n</PRE>\n\n </DD>\n <DT><A name=\"file_ref\"></A>&lt;file_ref></DT>\n <DD>\n   <P>Specifies filenames and wildcards or list file that specify processed files.</P>\n<PRE class=\"syntax\">\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n   <TABLE>\n     <TR> <TH width=\"120\">Option</TH> <TH>Description</TH> </TR>\n     <TR> <TD>{listfile}</TD> <TD>Specifies name of list file. See\n                  <A href = ../syntax.htm#ListFile>List file</A> description.</TD> </TR>\n     <TR> <TD>{wildcard}</TD> <TD>Specifies wildcard or filename.</TD> </TR>\n   </TABLE>\n </DD>\n</DL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -an -air!*.7z\n</PRE>\n\n<P>tests <SPAN class=\"filename\">*.7z</SPAN> archives in current directory and all it's \nsubdirectories.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"ar_exclude.htm\">-ax (Exclude archives)</A>\n  <A href=\"ar_no.htm\">-an (Disable parsing of archive_name)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/ar_no.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-an (Disable parsing of archive_name) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-an (Disable parsing of archive_name) switch</H1>\n\n<P>Disables parsing of the archive_name field on the command line.\nThis switch must be used with the\n<A href=\"include.htm\">-ai (Include archives) switch</A>.\nIf you use a file list for your archives, you specify it with the -ai switch,\nso you need to disable parsing of archive_name field from command line.\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-an\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -an -ai!*.7z -ax!a*.7z\n</PRE>\n\n<P>tests all <SPAN class=\"filename\">*.7z</SPAN> archives,\n  except <SPAN class=\"filename\">a*.7z</SPAN> archives.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"include.htm\">-ai (Include archives)</A>\n  <A href=\"exclude.htm\">-ax (Exclude archives)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/charset.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-scs (Set charset for list files) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-scs (Set charset for list files) switch</H1>\n\n<P>Sets charset for list files.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-scs{UTF-8 | WIN | DOS}\n</PRE>\n\n<P>Default charset is UTF-8.</P>\n\n<DL>\n  <DT>UTF-8</DT>\n  <DD>Unicode UTF-8 character set.</DD>\n  <DT>WIN</DT>\n  <DD>Default character set of Windows.</DD>\n  <DT>DOS</DT>\n  <DD>Default DOS (OEM) character set of Windows.</DD>\n</DL>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a archive.7z @listfile.txt -scsWIN\n</PRE>\n\n<P>compresses files from <SPAN class=\"filename\">listfile.txt</SPAN> list, that contains \nlist of files in default character set of Windows.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/exclude.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-x (Exclude filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-x (Exclude filenames) switch</H1>\n\n<P>Specifies which filenames or wildcarded names must be excluded from the operation.</P>\n<P>Multiple exclude switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-x[&lt;recurse_type>]&lt;file_ref>\n\n&lt;recurse_type> ::= r[- | 0]\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<P>See <A href=\"include.htm\">-i (Include)</A> switch description for information about\n    option parameters.</P>\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.txt -x!temp.*\n</PRE>\n\n<P>adds to the archive <SPAN class=\"filename\">archive.zip</SPAN> all\n  <SPAN class=\"filename\">*.txt</SPAN> files,\n  except <SPAN class=\"filename\">temp.*</SPAN> files.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"recurse.htm\">-r (Recurse)</A>,\n  <A href=\"include.htm\">-i (Include)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/include.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-i (Include filenames) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-i (Include filenames) switch</H1>\n\n<P>Specifies additional include filenames and wildcards.</P>\n<P>Multiple include switches are supported.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-i[<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A>]<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A>\n\n<A class=\"parameter\" href=\"#recurse_type\">&lt;recurse_type></A> ::= r[- | 0]\n<A class=\"parameter\" href=\"#file_ref\">&lt;file_ref></A> ::= @{listfile} | !{wildcard}\n</PRE>\n\n<H4>Parameters</H4>\n\n<DL>\n  <DT><A name=\"recurse_type\"></A>&lt;recurse_type></DT>\n  <DD><P>Specifies how wildcards and file names in this switch must\n         be used. If this option is not given, then the global value, assigned\n         by the <A href=\"recurse.htm\">-r (Recurse)</A> switch will be used. For\n         more details see specification of the\n         <A href=\"recurse.htm\">-r (Recurse)</A> switch.</P>\n<PRE class=\"syntax\">\n&lt;recurse_type> ::= r[- | 0]\n</PRE>\n\n </DD>\n <DT><A name=\"file_ref\"></A>&lt;file_ref></DT>\n <DD>\n   <P>Specifies filenames and wildcards, or a list file, for files to be processed.</P>\n<PRE class=\"syntax\">\n&lt;file_ref> ::= @{listfile} | !{wildcard}\n</PRE>\n   <TABLE>\n     <TR> <TH width=\"120\">Option</TH> <TH>Description</TH> </TR>\n     <TR> <TD>{listfile}</TD> <TD>Specifies name of list file. See\n                  <A href = ../syntax.htm#ListFile>List file</A> description.</TD> </TR>\n     <TR> <TD>{wildcard}</TD> <TD>Specifies wildcard or filename.</TD> </TR>\n   </TABLE>\n </DD>\n</DL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -tzip src.zip *.txt -ir!DIR1\\*.cpp\n</PRE>\n\n<P>adds to <SPAN class=\"filename\">src.zip</SPAN> archive all\n  <SPAN class=\"filename\">*.txt</SPAN> files from current directory\n  and all <SPAN class=\"filename\">*.cpp</SPAN>\n  files from directory <SPAN class=\"filename\">DIR1</SPAN>\n  and from all it's subdirectories.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"recurse.htm\">-r (Recurse)</A>,\n  <A href=\"exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Switches</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Switches</H1>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n&ltswitch>::= &lt;switch_symbol>&lt;switch_characters>[&lt;option>]\n&lt;switch_symbol> ::= '/' | '-' \n\n</PRE>\n<P>On the command line, a switch consists of a switch specifier,\neither a dash (-) or a forward slash (/), followed by the name of\nthe switch. Switch names cannot be abbreviated.</P>\n\n<P>Some switches take an argument after the switch name.\nNo spaces or tabs are allowed within a switch specification.\nSwitch names are not case sensitive, but arguments can be case sensitive.\n</P>\n\n<P>Switch can be used in any place in command line.</B>\n\n<P>See also <A href =\"../syntax.htm\">Command Line Syntax</A> for more details\n   about using the command line.</P>\n\n<H2>Switch quick reference</H2>\n\n<TABLE border=\"1\" cellpadding=\"3\" cellspacing=\"0\">\n<TR><TH>Switch</TH><TH>Description</TH></TR>\n<TR> <TD><A href=\"stop_switch.htm\">--</A></TD> <TD><A href=\"stop_switch.htm\">Stop switches parsing</A></TD></TR>\n<TR> <TD><A href=\"ar_include.htm\">-ai</A></TD> <TD><A href=\"ar_include.htm\">Include archive filenames</A></TD></TR>\n<TR> <TD><A href=\"ar_no.htm\">-an</A></TD> <TD><A href=\"ar_no.htm\">Disable parsing of archive_name</A></TD></TR>\n<TR> <TD><A href=\"overwrite.htm\">-ao</A></TD> <TD><A href=\"overwrite.htm\">Overwrite mode</A></TD></TR>\n<TR> <TD><A href=\"ar_exclude.htm\">-ax</A></TD> <TD><A href=\"ar_exclude.htm\">Exclude archive filenames</A></TD></TR>\n<TR> <TD><A href=\"include.htm\">-i</A></TD> <TD><A href=\"include.htm\">Include filenames</A></TD></TR>\n<TR> <TD><A href=\"method.htm\">-m</A></TD> <TD><A href=\"method.htm\">Set Compression Method</A></TD></TR>\n<TR> <TD><A href=\"output_dir.htm\">-o</A></TD> <TD><A href=\"output_dir.htm\">Set Output directory</A></TD></TR>\n<TR> <TD><A href=\"password.htm\">-p</A></TD> <TD><A href=\"password.htm\">Set Password</A></TD></TR>\n<TR> <TD><A href=\"recurse.htm\">-r</A></TD> <TD><A href=\"recurse.htm\">Recurse subdirectories</A></TD></TR>\n<TR> <TD><A href=\"charset.htm\">-scs</A></TD> <TD><A href=\"charset.htm\">Set charset for list files</A></TD></TR>\n<TR> <TD><A href=\"list_tech.htm\">-slt</A></TD> <TD><A href=\"list_tech.htm\">Show technical information</A></TD></TR>\n<TR> <TD><A href=\"sfx.htm\">-sfx</A></TD> <TD><A href=\"sfx.htm\">Create SFX archive</A></TD></TR>\n<TR> <TD><A href=\"stdin.htm\">-si</A></TD> <TD><A href=\"stdin.htm\">Read data from StdIn</A></TD></TR>\n<TR> <TD><A href=\"stdout.htm\">-so</A></TD> <TD><A href=\"stdout.htm\">Write data to StdOut</A></TD></TR>\n<TR> <TD><A href=\"ssc.htm\">-ssc</A></TD> <TD><A href=\"ssc.htm\">Set Sensitive Case mode</A></TD></TR>\n<TR> <TD><A href=\"type.htm\">-t</A></TD> <TD><A href=\"type.htm\">Type of archive</A></TD></TR>\n<TR> <TD><A href=\"update.htm\">-u</A></TD> <TD><A href=\"update.htm\">Update options</A></TD></TR>\n<TR> <TD><A href=\"volume.htm\">-v</A></TD> <TD><A href=\"volume.htm\">Create Volumes</A></TD></TR>\n<TR> <TD><A href=\"working_dir.htm\">-w</A></TD> <TD><A href=\"working_dir.htm\">Set Working directory</A></TD></TR>\n<TR> <TD><A href=\"exclude.htm\">-x</A></TD> <TD><A href=\"exclude.htm\">Exclude filenames</A></TD></TR>\n<TR> <TD><A href=\"yes.htm\">-y</A></TD> <TD><A href=\"yes.htm\">Assume Yes on all queries</A></TD></TR>\n</TABLE>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/list_tech.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-slt (Show technical information) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-slt (Show technical information) switch</H1>\n\n<P>Sets technical mode for <A href=\"../commands/list.htm\">l (List)</A> command.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-slt\n</PRE>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z l -slt archive.7z\n</PRE>\n\n<P>shows detailed technical information for the files in <SPAN class=\"filename\">archive.7z</SPAN>.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/list.htm\">l (List)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/method.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-m (Set compression Method) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-m (Set compression Method) switch</H1>\n\n<P>Specifies the compression method.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-m&lt;method_parameters>\n\n</PRE>\n\n<P>The format for this switch depends on the archive type.</P>\n\n<H4>Zip</H4>\n<TABLE>\n  <TR> \n    <TH width=\"160\">Parameter</TH> \n    <TH align=\"center\">Default</TH> \n    <TH>Description</TH> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#ZipX\">x=[0 | 1 | 3 | 5 | 7 | 9 ]</A></TD> \n    <TD align=\"center\">5</TD>\n    <TD>Sets level of compression.</TD> </TR>\n  <TR> \n    <TD>m={MethodID}</TD> \n    <TD align=\"center\">Deflate</TD> \n    <TD>Sets a method: Copy, Deflate, Deflate64, BZip2, LZMA.</TD> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#Deflate_FastBytes\">fb={NumFastBytes}</A></TD>\n    <TD align=\"center\">32</TD>\n    <TD>Sets number of Fast Bytes for Deflate encoder.</TD> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#Zip_Pass\">pass={NumPasses}</A></TD>\n    <TD align=\"center\">1</TD>\n    <TD>Sets number of Passes for Deflate encoder.</TD></TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#ZipDictionarySize\">d={Size}[b|k|m]</A></TD> \n    <TD align=\"center\">900000</TD>  \n    <TD>Sets Dictionary size for BZip2</TD></TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#ZipMultiThread\">mt=[off | on | {N}]</A></TD> \n    <TD align=\"center\">on</TD>  \n    <TD>Sets multithreading mode.</TD></TR>\n  <TR> \n    <TD>em={EncryptionMethodID}</TD> \n    <TD align=\"center\">ZipCrypto</TD> \n    <TD>Sets a encryption method: ZipCrypto, AES128, AES192, AES256</TD> </TR>\n  <TR> <TD><A class=\"parameter\">tc=[off | on]</A></TD> \n     <TD align=\"center\">off</TD>  <TD>Stores NTFS timestamps for files: Modification time, Creation time, Last access time.</TD> </TR>\n  <TR> <TD><A class=\"parameter\">cl=[off | on]</A></TD> \n     <TD align=\"center\">off</TD>  <TD>7-Zip always uses local code page for file names.</TD> </TR>\n  <TR> <TD><A class=\"parameter\">cu=[off | on]</A></TD> \n     <TD align=\"center\">off</TD>  <TD>7-Zip uses UTF-8 for file names that contain non-ASCII symbols.</TD> </TR>\n</TABLE>\n\n<P>By default (if <B>cl</B> and <B>cu</B> switches are not specified), 7-Zip uses UTF-8 encoding\nonly for file names that contain symbols unsupported by local code page.</P>\n\n<DL>\n  <DT><A name=\"ZipX\"></A>x=[0 | 1 | 3 | 5 | 7 | 9 ]</DT>\n  <DD>\n    <P>Sets level of compression. x=0 means Copy mode (no compression).</P>\n    <P>Deflate / Deflate64 settings:</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>NumFastBytes</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>\n      <TR> <TD class=\"cc\">1</TD> <TD class=\"cc\" rowspan=3>32</TD> <TD class=\"cc\" rowspan=3>1</TD> <TD>Fastest</TD> </TR>\n      <TR> <TD class=\"cc\">3</TD> <TD>Fast</TR>\n      <TR> <TD class=\"cc\">5</TD> <TD>Normal</TR>\n      <TR> <TD class=\"cc\">7</TD> <TD class=\"cc\">64</TD> <TD class=\"cc\">3</TD> <TD>Maximum</TD> </TR>\n      <TR> <TD class=\"cc\">9</TD> <TD class=\"cc\">128</TD> <TD class=\"cc\">10</TD> <TD>Ultra</TD> </TR>\n    </TABLE>\n\n    <P>x=1 and x=3 with Deflate method set fast mode for compression.</P>\n\n    <P>BZip2 settings:</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>Dictionary</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>\n      <TR> <TD class=\"cc\">1</TD> <TD class=\"cc\">100000</TD> <TD class=\"cc\" rowspan=3>1</TD> <TD>Fastest</TD> </TR>\n      <TR> <TD class=\"cc\">3</TD> <TD class=\"cc\">500000</TD>  <TD>Fast</TD> </TR>\n      <TR> <TD class=\"cc\">5</TD> <TD class=\"cc\" rowspan=3>900000</TD> <TD>Normal</TD> </TR>\n      <TR> <TD class=\"cc\">7</TD> <TD align=\"center\">2</TD> <TD>Maximum</TD> </TR>\n      <TR> <TD class=\"cc\">9</TD> <TD align=\"center\">7</TD> <TD>Ultra</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"Deflate_FastBytes\"></A>fb={NumFastBytes}</DT>\n  <DD>\n    <P>Sets the number of fast bytes for the Deflate/Deflate64 encoder.\n       It can be in the range from 3 to 258 (257 for Deflate64).\n       Usually, a big number gives a little bit better\n       compression ratio and a slower compression process.\n       A large fast bytes parameter can significantly increase the compression ratio\n       for files which contain long identical sequences of bytes.</P>\n  </DD>\n  <DT><A name=\"Zip_Pass\"></A>pass={NumPasses}</DT>\n  <DD>\n    <P>Sets number of passes for Deflate encoder. It can be in the range from 1 to 15 for Deflate and\n       from 1 to 10 for BZip2. Usually, a big number gives a little bit better\n       compression ratio and a slower compression process.\n    </P>\n  </DD>\n  <DT><A name=\"ZipDictionarySize\"></A>d={Size}[b|k|m]</DT>\n  <DD>\n    <P> Sets the Dictionary size for BZip2. You must specify the size in bytes, kilobytes, or megabytes.\n       The maximum value for the Dictionary size is 900000b. If you do not specify any symbol \n       from set [b|k|m], dictionary size will be calculated as DictionarySize = 2^Size bytes.</P>\n  </DD>\n  <DT><A name=\"ZipMultiThread\"></A>mt=[off | on | {N}]</DT>\n  <DD>\n    <P>Sets multithread mode. If you have a multiprocessor or multicore system, \n       you can get a speed increase with\n       this switch. This option affects only compression (with any method) and \n       decompression of BZip2 streams. \n       Each thread in the multithread mode uses 32 MB of RAM for buffering.\n       If you specify {N}, 7-Zip tries to use N threads.</P>\n  </DD>\n</DL>\n\n<H4>GZip</H4>\nGZip uses the same parameters as Zip, but GZip compresses only with Deflate method.\n\n<H4>BZip2</H4>\n<TABLE>\n  <TR> \n    <TH width=\"160\">Parameter</TH> \n    <TH align=\"center\">Default</TH> \n    <TH>Description</TH> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#BZip2X\">x=[1 | 3 | 5 | 7 | 9 ]</A></TD> \n    <TD align=\"center\">5</TD>\n    <TD>Sets level of compression.</TD> </TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#BZip2Pass\">pass={NumPasses}</A></TD>\n    <TD align=\"center\">1</TD>\n    <TD>Sets number of Passes for Bzip2 encoder.</TD></TR>\n  <TR> \n    <TD><A class=\"parameter\" href=\"#BZip2MultiThread\">mt=[off | on | {N}]</A></TD> \n    <TD align=\"center\">on</TD>  \n    <TD>Sets multithreading mode.</TD></TR>\n</TABLE>\n\n<DL>\n  <DT><A name=\"BZip2\"></A>x=[1 | 3 | 5 | 7 | 9 ]</DT>\n  <DD>\n    <P>Sets level of compression</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>\n      <TR> <TD>5</TD> <TD align=\"center\">1</TD> <TD>Default compression method.</TD> </TR>\n      <TR> <TD>7</TD> <TD align=\"center\">2</TD> <TD>Maximum compression method.</TD> </TR>\n      <TR> <TD>9</TD> <TD align=\"center\">7</TD> <TD>Ultra  compression method.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"#BZip2Pass\"></A>pass={NumPasses}</DT>\n  <DD>\n    <P>Sets the number of passes. It can be in the range from 1 to 10.\n       The default value is 1 for normal mode, 2 for maximum mode and 7 for ultra mode.\n       A bigger number can give a little bit better compression ratio and a slower compression process.\n    </P>\n  </DD>\n  <DT><A name=\"BZip2MultiThread\"></A>mt=[off | on | {N}]</DT>\n  <DD>\n    <P>Sets multithread mode. If you have a multiprocessor or multicore system, \n       you can get a speed increase with\n       this switch. If you specify {N}, for example mt=4, 7-Zip tries to use 4 threads.</P>\n  </DD>\n</DL>\n\n<H4>7z</H4>\n<TABLE>\n  <TR> <TH width=\"80\">Parameter</TH> <TH align=\"center\">Default</TH> <TH>Description</TH> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#SevenZipX\">x=[0 | 1 | 3 | 5 | 7 | 9 ]</A></TD> \n        <TD align=\"center\">5</TD><TD>Sets level of compression.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#Solid\">s=[off | on | [e] [{N}f] [{N}b | {N}k | {N}m | {N}g]</A></TD> \n       <TD align=\"center\">on</TD>  <TD>Sets solid mode.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#Filter\">f=[off | on]</A></TD> \n       <TD align=\"center\">on</TD>  <TD>Enables or disables compression filters for executable files.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#HeaderCompress\">hc=[off | on]</A></TD> \n       <TD align=\"center\">on</TD>  <TD>Enables or disables archive header compressing.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#HeaderEncrypt\">he=[off | on]</A></TD> \n       <TD align=\"center\">off</TD>  <TD>Enables or disables archive header encryption.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#Bind\">b{C1}[s{S1}]:{C2}[s{S2}]</A></TD> \n       <TD align=\"center\"> </TD>  <TD>Sets binding beetwen coders.</TD> </TR>\n  <TR> <TD><A class=\"parameter\" href=\"#MethodID\">{N}={MethodID}[:param1][:param2][..]</A></TD> \n       <TD align=\"center\">LZMA</TD>  <TD>Sets a method: LZMA, PPMd, BZip2, Deflate, BCJ, BCJ2, Copy.</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MultiThread\">mt=[off | on | {N}]</A></TD> \n        <TD align=\"center\">on</TD>  <TD>Sets multithreading mode.</TD> </TR>\n   <TR> <TD><A class=\"parameter\">tc=[off | on]</A></TD> \n        <TD align=\"center\">off</TD>  <TD>Stores file creation timestamps.</TD> </TR>\n</TABLE>\n\n<DL>\n  <DT><A name=\"SevenZipX\"></A>x=[0 | 1 | 3 | 5 | 7 | 9 ]</DT>\n  <DD>\n    <P>Sets level of compression</P>\n    <TABLE>\n      <TR> <TH>Level</TH> <TH>Method</TH> <TH>Dictionary</TH> <TH>FastBytes</TH> <TH>MatchFinder</TH> <TH>Filter</TH> <TH>Description</TH> </TR>\n      <TR> <TD align=\"center\">0</TD> <TD align=\"center\">Copy</TD> <TD align=\"center\"></TD> <TD align=\"center\"></TD> <TD align=\"center\"></TD> <TD align=\"center\"></TD> <TD>No compression.</TD> </TR>\n      <TR> <TD align=\"center\">1</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">64 KB</TD> <TD align=\"center\">32</TD> <TD align=\"center\">HC4</TD> <TD align=\"center\">BCJ</TD> <TD>Fastest compressing</TD> </TR>\n      <TR> <TD align=\"center\">3</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">1 MB</TD>  <TD align=\"center\">32</TD> <TD align=\"center\">HC4</TD> <TD align=\"center\">BCJ</TD> <TD>Fast compressing</TD> </TR>\n      <TR> <TD align=\"center\">5</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">16 MB</TD>  <TD align=\"center\">32</TD> <TD align=\"center\">BT4</TD> <TD align=\"center\">BCJ</TD> <TD>Normal compressing</TD> </TR>\n      <TR> <TD align=\"center\">7</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">32 MB</TD> <TD align=\"center\">64</TD> <TD align=\"center\">BT4</TD> <TD align=\"center\">BCJ</TD> <TD>Maximum compressing</TD> </TR>\n      <TR> <TD align=\"center\">9</TD> <TD align=\"center\">LZMA</TD> <TD align=\"center\">64 MB</TD> <TD align=\"center\">64</TD> <TD align=\"center\">BT4</TD> <TD align=\"center\">BCJ2</TD><TD>Ultra compressing</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"Solid\"></A>s=[off | on | [e] [{N}f] [{N}b | {N}k | {N}m | {N}g)]</DT>\n  <DD>\n    <P> Enables or disables solid mode. The default mode is s=on. \n        In solid mode, files are grouped together. Usually, compressing in  \n        solid mode improves the compression ratio.</P>\n\n    <TABLE>\n      <TR> <TD>e</TD> <TD>Use a separate solid block for each new file extension</TD> </TR>\n      <TR> <TD>{N}f</TD> <TD>Set the limit for number of files in one solid block</TD> </TR>\n      <TR> <TD>{N}b | {N}k | {N}m | {N}g</TD> <TD>Set a limit for the total size of a solid block in bytes</TD> </TR>\n    </TABLE>\n\n    <P>These are the default limits for the solid block size:</P>\n\n    <TABLE>\n      <TR> <TH width=\"150\">Compression Level</TH> <TH>Solid block size</TH> </TR>\n      <TR> <TD>Store</TD> <TD>0 B</TD> </TR>\n      <TR> <TD>Fastest</TD> <TD>16 MB</TD> </TR>\n      <TR> <TD>Fast</TD> <TD>128 MB</TD> </TR>\n      <TR> <TD>Normal</TD> <TD>2 GB</TD> </TR>\n      <TR> <TD>Maximum</TD> <TD>4 GB</TD> </TR>\n      <TR> <TD>Ultra</TD> <TD>4 GB</TD> </TR>\n    </TABLE>\n\n\n    <P>Limitation of the solid block size usually decreases compression ratio but gives the following advantages:</P>\n    <UL>\n      <LI>Decreases losses in case of future archive damage.\n      <LI>Decreases extraction time of a group of files (or just one\n     file), so long as the group doesn't contain the entire archive.</LI></LI>\n    </UL>\n    <P>The current version of 7-Zip doesn't support updating of solid\n    archives, if it requires repacking solid blocks.</P>\n\n    <P>Example:</P>\n      <PRE class=\"example\">\n        s=100f10m\n      </PRE>\n    <P>set solid mode with 100 files & 10 MB limits per one solid block.</P>\n\n  <DT><A name=\"Filter\"></A>f=[off | on]</DT>\n  <DD>\n    <P>Enables or disables compression filters for executable files:\n     dll, exe, ocx, sfx, sys. It uses BCJ2 filter in Ultra mode and BCJ \n     filter in other modes. The default mode is f=on. \n    </P>\n  <DT><A name=\"HeaderCompress\"></A>hc=[off | on]</DT>\n  <DD>\n    <P> Enables or disables archive header compressing. The default mode is hc=on. \n        If archive header compressing is enabled, some parts of archive header will \n        be compressed with LZMA method.\n    </P>\n  <DT><A name=\"HeaderEncrypt\"></A>he=[off | on]</DT>\n  <DD>\n    <P> Enables or disables archive header encryption. The default mode is he=off. \n    </P>\n  <DT>{N}</DT>\n  <DD>\n    <P>Sets order of methods. It is used also to associate parameters with\n        methods. Numbers must begin from 0. Methods that have smaller numbers will be used\n        before others.</P>\n  </DD>\n\n  <DT><A name=\"Bind\"></A>b{C1}[s{S1}]:{C2}[s{S2}]</DT>\n  <DD>\n    <P> Binds output stream S1 in coder C1 with input stream S2 in coder C2.\n        If stream number is not specified, stream with number 0 will be used.\n        </P>\n    <P> Usally coder has one input stream and \n    one output stream. In 7z some coders can have multiple input and output streams.</P>\n\n    <P>For example, <A class=\"parameter\" href=\"#BCJ2\">BCJ2</A> encoder has one \n     input stream and four output streams.</P>\n  </DD>\n\n  <DT><A name=\"MultiThread\"></A>mt=[off | on | {N}]</DT>\n  <DD>\n    <P>Sets multithread mode. If you have a multiprocessor or multicore system, \n       you can get a increase with this switch.\n       7-Zip supports multithread mode only for LZMA compression and \n       BZip2 compression / decompression. If you specify {N}, for example mt=4, \n       7-Zip tries to use 4 threads. LZMA compression uses only 2 threads.\n    </P>\n  </DD>\n  \n  <DT><A name=\"MethodID\"></A>{N}={MethodID}[:param1][:param2] ... [:paramN]</DT>\n  <DD>\n    <P>Sets compression method. You can use any number of methods. \n       The default method is LZMA. </P>\n    <P>Parameters must be in one of the following forms:</P>\n    <UL>\n      <LI>{ParamName}={ParamValue}.\n      <LI>{ParamName}{ParamValue}, if {ParamValue} \n        is number and {ParamName} doesn't contain numbers.\n    </UL>\n        \n    <P>Supported methods:</P>\n    <TABLE>\n      <TR> <TH width=\"60\">MethodID</TH> <TH>Description</TH> </TR>\n      <TR> <TD><A class=\"parameter\" href=\"#LZMA\">LZMA</A></TD> <TD>Algorithm based on LZ algorithm</TD> </TR>\n      <TR> <TD><A class=\"parameter\" href=\"#PPMd\">PPMd</A></TD> <TD>Dmitry Shkarin's PPMdH with small changes</TD> </TR>\n      <TR> <TD>BZip2</TD> <TD>BWT algorithm</TD> </TR>\n      <TR> <TD>Deflate</TD> <TD>LZ+Huffman</TD> </TR>\n      <TR> <TD>Copy</TD> <TD>No compression</TD> </TR>\n    </TABLE>\n\n    <P>Supported filters:</P>\n    <TABLE>\n      <TR> <TH width=\"60\">MethodID</TH> <TH>Description</TH> </TR>\n      <TR> <TD>BCJ</TD> <TD>converter for x86 executables</TD> </TR>\n      <TR> <TD><A class=\"parameter\" href=\"#BCJ2\">BCJ2</A></TD> <TD>converter for x86 executables (version 2)</TD> </TR>\n      <TR> <TD>ARM</TD> <TD>converter for ARM (little endian) executables</TD> </TR>\n      <TR> <TD>ARMT</TD> <TD>converter for ARM Thumb (little endian) executables</TD> </TR>\n      <TR> <TD>IA64</TD> <TD>converter for IA-64 executables</TD> </TR>\n      <TR> <TD>PPC</TD> <TD>converter for PowerPC (big endian) executables</TD> </TR>\n      <TR> <TD>SPARC</TD> <TD>converter for SPARC executables</TD> </TR>\n    </TABLE>\n    <P>Filters increase the compression ratio for some types of files. Filters\n       must be used with one of the compression method (for example, BCJ + LZMA).</P>\n  </DD>\n\n <H4><A name=\"LZMA\"></A>LZMA</H4>\n <P> LZMA is an algorithm based on Lempel-Ziv algorithm.\n   It provides very fast decompression (about 10-20 times faster than compression). \n   Memory requirements for compression and decompression also are different (see\n   <A class=\"parameter\" href=\"#DictionarySize\">d={Size}[b|k|m]</A> switch for details).</P>\n\n <TABLE>\n   <TR> <TH width=\"80\">Parameter</TH> <TH align=\"center\">Default</TH> <TH>Description</TH> </TR>\n\n   <TR> <TD><A class=\"parameter\" href=\"#LZMAMode\">a=[0|1]</A></TD> \n        <TD align=\"center\">1</TD>  <TD>Sets compressing mode</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#DictionarySize\">d={Size}[b|k|m]</A></TD> \n        <TD align=\"center\">24</TD>  <TD>Sets Dictionary size</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MatchFinder\">mf={MF_ID}</A></TD> \n        <TD align=\"center\">bt4</TD>  <TD>Sets Match Finder</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#FastBytes\">fb={N}</A></TD> \n        <TD align=\"center\">32</TD>  <TD>Sets number of Fast Bytes</TD></TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MatchFinderCycles\">mc={N}</A></TD> \n        <TD align=\"center\">32</TD><TD>Sets Number of Cycles for Match Finder</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#LitContext\">lc={N}</A></TD> \n        <TD align=\"center\">3</TD>  <TD>Sets number of Literal Context bits - [0, 8]</TD></TR>\n   <TR> <TD><A class=\"parameter\" href=\"#LitPos\">lp={N}</A></TD> \n        <TD align=\"center\">0</TD>  <TD>Sets number of Literal Pos bits - [0, 4]</TD></TR>\n   <TR> <TD><A class=\"parameter\" href=\"#PosBits\">pb={N}</A></TD> \n        <TD align=\"center\">2</TD>  <TD>Set number of Pos Bits - [0, 4]</TD></TR>\n </TABLE>\n\n \n <DL>\n  <DT><A name=\"#LZMAMode\"></A>a=[0|1]</DT>\n  <DD>\n    <P> Sets compression mode: 0 = fast, 1 = normal.\n      Default value is 1.</P>\n  </DD>\n  <DT><A name=\"DictionarySize\"></A>d={Size}[b|k|m]</DT>\n  <DD>\n    <P> Sets Dictionary size for LZMA. You must specify the size in bytes, kilobytes, or megabytes.\n       The maximum value for dictionary size is 1 GB = 2^30 bytes. Default values for LZMA\n       are 24 (16 MB) in normal mode, 25 (32 MB) in maximum mode (-mx=7) \n       and 26 (64 MB) in ultra mode (-mx=9). \n       If you do not specify any symbol from the set [b|k|m], the\n       dictionary size will be calculated as DictionarySize = 2^Size bytes.\n       For decompressing a file compressed by LZMA method with dictionary size N, you need\n       about N bytes of memory (RAM) available.\n       </P>\n  </DD>\n  <DT><A name=\"MatchFinder\"></A>mf={MF_ID}</DT>\n  <DD>\n    <P> Sets Match Finder for LZMA. Default method is bt4. \n       Algorithms from hc* group don't provide a good compression ratio,\n       but they often work pretty fast in combination with fast mode (a=0).\n       Memory requirements depend on dictionary size (parameter \"d\" in table below).\n    </P>\n    <TABLE>\n      <TR> <TH width=\"60\">MF_ID</TH> <TH width=\"120\">Memory</TH> <TH>Description</TH> </TR>\n      <TR> <TD>bt2</TD> <TD>d*9.5 + 4 MB</TD> <TD>Binary Tree with 2 bytes hashing.</TD> </TR>\n      <TR> <TD>bt3</TD> <TD>d*11.5 + 4 MB</TD> <TD>Binary Tree with 3 bytes hashing.</TD> </TR>\n      <TR> <TD>bt4</TD> <TD>d*11.5 + 4 MB</TD> <TD>Binary Tree with 4 bytes hashing.</TD> </TR>\n      <TR> <TD>hc4</TD> <TD>d*7.5 + 4 MB</TD> <TD>Hash Chain with 4 bytes hashing.</TD> </TR>\n    </TABLE>\n    <P>Note: Your operation system also needs some amount of physical memory for internal purposes. \n      So keep at least 32MB of physical memory unused.</P>\n  </DD>\n  \n  <DT><A name=\"FastBytes\"></A>fb={N}</DT>\n  <DD>\n    <P>Sets number of fast bytes for LZMA. It can be in the range from 5 to 273.\n       The default value is 32 for normal mode and 64 for maximum and ultra modes.\n       Usually, a big number gives a little bit better\n       compression ratio and slower compression process.\n       </P>\n  </DD>\n  <DT><A name=\"MatchFinderCycles\"></A>mc={N}</DT>\n  <DD>\n    <P>Sets number of cycles (passes) for match finder. It can be in range from 0 to 1000000000.\n       Default value is (16 + number_of_fast_bytes / 2) for BT* match finders and \n       (8 + number_of_fast_bytes / 4) for HC4 match finder. \n       If you specify mc=0, LZMA will use default value.\n       Usually, a big number gives a little bit better compression ratio and slower\n       compression process. For example, mf=HC4 and mc=10000 can provide almost the same\n       compression ratio as mf=BT4.</P>\n  </DD>\n  <DT><A name=\"LitContext\"></A>lc={N}</DT>\n  <DD>\n    <P>Sets the number of literal context bits (high bits of previous literal).\n       It can be in range from 0 to 8.\n       Default value is 3. Sometimes lc=4 gives gain for big files.</P>\n  </DD>\n  <DT><A name=\"LitPos\"></A>lp={N}</DT>\n  <DD>\n    <P>Sets the number of literal pos bits (low bits of current position for literals).\n       It can be in the range from 0 to 4.\n       The default value is 0. The lp switch is intended for periodical data when the \n       period is equal to 2^value (where lp=value). For example, for 32-bit (4 bytes)\n       periodical data you can use lp=2. Often it's better to set lc=0, \n       if you change lp switch.</P>\n  </DD>\n  <DT><A name=\"PosBits\"></A>pb={N}</DT>\n  <DD>\n    <P>Sets the number of pos bits (low bits of current position).\n       It can be in the range from 0 to 4.\n       The default value is 2. The pb switch is intended for periodical data when the\n       period is equal 2^value (where lp=value). </P>\n  </DD>\n  \n </DL>\n  \n <H4><A name=\"PPMd\"></A>PPMd</H4>\n <P> PPMd is a PPM-based algorithm. This algorithm is mostly based \n on Dmitry Shkarin's PPMdH source code. PPMd provides very good compression ratio for \n plain text files. There is no difference between compression speed and\n decompression speed. Memory requirements for compression and decompression\n also are the same.</P>\n <TABLE>\n   <TR> <TH width=\"80\">Parameter</TH> <TH align=\"center\">Default</TH> <TH>Description</TH> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#MemorySize\">mem={Size}[b|k|m]</A></TD> \n        <TD align=\"center\">24</TD>  <TD>Sets size of used memory for PPMd.</TD> </TR>\n   <TR> <TD><A class=\"parameter\" href=\"#Order\">o={Size}</A></TD> \n        <TD align=\"center\">6</TD>  <TD>Sets model order for PPMd.</TD> </TR>\n </TABLE>\n <DL>\n  <DT><A name=\"MemorySize\"></A>mem={Size}[b|k|m]</DT>\n  <DD>\n    <P> Sets the size of memory used for PPMd. You must specify the size in bytes, kilobytes, or megabytes.\n       The maximum value is 2GB = 2^31 bytes. The default value\n       is 24 (16MB). If you do not specify any symbol from the set [b|k|m], the\n       memory size will be calculated as (2^Size) bytes. PPMd uses the same \n       amount of memory for compression and decompression.</P>\n  </DD>\n  \n  <DT><A name=\"Order\"></A>o={Size}</DT>\n  <DD>\n    <P>Sets the model order for PPMd. The size must be in the range [2,32]. The default value is 6.</P>\n  </DD>\n </DL>\n\n <H4><A name=\"BCJ2\"></A>BCJ2</H4>\n <P>BCJ2 is a Branch converter for 32-bit x86 executables (version 2). \n It converts some branch instructions for increasing further compression.</P>\n <P>A BCJ2 encoder has one input stream and four output streams:</P>\n <UL>\n   <LI>s0: main stream. It requires further compression.</LI> \n   <LI>s1: stream for converted CALL values. It requires further compression.</LI>  \n   <LI>s2: stream for converted JUMP values. It requires further compression.</LI>  \n   <LI>s3: service stream. It is already compressed.</LI>  \n </UL>\n <P>If LZMA is used, the size of the dictionary for streams\n    s1 and s2 can be much smaller (512 KB is enough for most cases) \n    than the dictionary size for stream s0.</P>\n\n</DL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.jpg -mx0\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.jpg</SPAN> files to\n  <SPAN class=\"filename\">archive.zip</SPAN> archive without compression.</P>\n\n<PRE class=\"example\">\n7z a -t7z archive.7z *.exe *.dll -m0=BCJ -m1=LZMA:d=21 -ms -mmt\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.exe</SPAN> and <SPAN class=\"filename\">*.dll</SPAN> \nfiles to solid archive  <SPAN class=\"filename\">archive.7z</SPAN> using LZMA method with \n2 MB dictionary and BCJ converter. Compression will use multithreading optimization.</P>\n\n<PRE class=\"example\">\n7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19 \n     -mb0:1 -mb0s1:2 -mb0s2:3\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.exe</SPAN> and <SPAN class=\"filename\">*.dll</SPAN> \n  files to archive  <SPAN class=\"filename\">archive.7z</SPAN> using BCJ2 converter, \n  LZMA with 8 MB dictionary for main output stream (s0), \n  and LZMA with 512 KB dictionary for s1 and s2 output streams of BCJ2.</P>\n\n  \n<PRE class=\"example\">\n7z a -t7z archive.7z *.txt -m0=PPMd\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.txt</SPAN> files to archive  \n<SPAN class=\"filename\">archive.7z</SPAN> using PPMd method.</P>\n\n\n\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"type.htm\">-t (set Type of archive)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/output_dir.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-o (set Output directory) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-o (set Output directory) switch</H1>\n\n<P>Specifies a destination directory where files are to be extracted.</P>\n<P>This switch can be used only with extraction commands.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-o{dir_path}\n</PRE>\n\n<DL>\n  <DT>{dir_path}</DT>\n  <DD>This is the destination directory path. It's not required to end with a backslash.</DD>\n</DL>\n\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z x archive.zip -oc:\\Doc\n</PRE>\n\n<P>extracts all files from the <SPAN class=\"filename\">archive.zip</SPAN> archive\nto the <SPAN class=\"filename\">c:\\Doc</SPAN> directory.</P>\n\n<PRE class=\"example\">\n7z x *.zip -o*\n</PRE>\n\n<P>extracts all <SPAN class=\"filename\">*.zip</SPAN> archives to subfolders\nwith names of these archives.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/overwrite.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ao (Overwrite mode) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ao (Overwrite mode) switch</H1>\n\n<P>Specifies the overwrite mode during extraction, to overwrite files already present on disk.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-ao[a | s | t | u ]\n</PRE>\n\n\n<TABLE>\n  <TR> <TH width=\"80\">Switch</TH> <TH>Description</TH> </TR>\n  <TR> <TD>-aoa</TD> <TD>Overwrite All existing files without prompt.</TD> </TR>\n  <TR> <TD>-aos</TD> <TD>Skip extracting of existing files.</TD> </TR>\n  <TR> <TD>-aou</TD> <TD>aUto rename extracting file (for example, name.txt will \n      be renamed to name_1.txt).</TD> </TR>\n  <TR> <TD>-aot</TD> <TD>auto rename existing file (for example, name.txt will \n      be renamed to name_1.txt).</TD> </TR>\n</TABLE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x test.zip -aoa\n</PRE>\n\n<P>extracts all files from <SPAN class=\"filename\">test.zip</SPAN> archive and overwrites\nexisting files without any prompt.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"yes.htm\">-y (assume Yes on all queries)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/password.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-p (set Password) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-p (set Password) switch</H1>\n\n<P>Specifies password.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-p{password}\n</PRE>\n\n<DL>\n  <DT>{password}</DT>\n  <DD>Specifies password.</DD>\n</DL>\n\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a archive.7z -psecret -mhe *.txt\n</PRE>\n<P>compresses *.txt files to <SPAN class=\"filename\">archive.7z</SPAN> using password \n\"secret\". Also it encrypts archive headers (-mhe switch), so filenames will be encrypted.\n</P>\n\n<PRE class=\"example\">\n7z x archive.zip -psecret\n</PRE>\n<P>extracts all files from <SPAN class=\"filename\">archive.zip</SPAN> using password \n\"secret\".</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/recurse.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-r (Recurse subdirectories) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-r (Recurse subdirectories) switch</H1>\n\n<P>Specifies the method of treating wildcards and filenames on the command line.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-r[- | 0]\n</PRE>\n\n\n<TABLE>\n  <TR><TH width=\"80\">Switch</TH> <TH>Description</TH></TR>\n  <TR><TD>-r</TD> <TD>Enable recurse subdirectories.</TD></TR>\n  <TR><TD>-r-</TD> <TD>Disable recurse subdirectories. This option is default for all commands.</TD></TR>\n  <TR><TD>-r0</TD> <TD>Enable recurse subdirectories only for wildcard names.</TD></TR>\n</TABLE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z l archive.zip *.doc -r-\n</PRE>\n\n<P>lists all <SPAN class=\"filename\">*.doc</SPAN> files\n  that belong to the archived root directory\n  in the <SPAN class=\"filename\">archive.zip</SPAN> archive.\n  </P>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip -r src\\*.cpp src\\*.h\n</PRE>\n\n<P>adds all <SPAN class=\"filename\">*.cpp</SPAN> and <SPAN class=\"filename\">*.h</SPAN>\n  files from directory <SPAN class=\"filename\">src</SPAN> and all it's subdirectories\n  to the <SPAN class=\"filename\">archive.zip</SPAN> archive.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"include.htm\">-i (Include)</A>,\n  <A href=\"exclude.htm\">-x (Exclude)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/sfx.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-sfx (Create SFX archive) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-sfx (Create SFX archive) switch</H1>\n\n<P>Creates self extracting archive.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-sfx[<A class=\"parameter\" href=\"#SFX_Module\">{SFX_Module}</A>]\n</PRE>\n\n<DL>\n  <DT><A name=\"SFX_Module\"></A>{SFX_Module}</DT>\n  <DD>\n    <P>Specifies the SFX module that will be combined with the archive.\n       This module must be placed in the same directory as the 7z.exe.\n       If {SFX_Module} is not assigned, 7-Zip will use standard console \n       SFX module 7zCon.sfx.</P>\n    <TABLE>\n      <TR> <TH width=\"60\">SFX_Module</TH> <TH>Description</TH> </TR>\n      <TR> <TD>7z.sfx</TD> <TD>Windows version.</TD> </TR>\n      <TR> <TD>7zCon.sfx</TD> <TD>Console version.</TD> </TR>\n      <TR> <TD>7zS.sfx</TD> <TD>Windows version for installers.</TD> </TR>\n      <TR> <TD>7zSD.sfx</TD> <TD>Windows version for installers (uses MSVCRT.dll).</TD> </TR>\n    </TABLE>\n  </DD>\n</DL>\n\n<P>\nAll SFX modules are uncompressed. You can use UPX program \n(http://upx.sourceforge.net) \nto compresss such modules. After compressing by the UPX program, the size of the\nsfx module will be reduced to 40-50% of its original size.\n</P>\n\n<H4>SFX modules for installers</H4>\n<P>SFX modules for installers are included in an external package (7z_extra). You can download\nthese modules from www.7-zip.org. SFX modules for installers (7zS.sfx and 7zSD.sfx)\nallow you to create your own installation program.\nSuch a module extracts the archive to the user's temp folder, and runs a specified program,\nand removes the temp files after the program finishes.\nA self-extracting archive for installers must be created as joining 3 files:\nSFX_Module, Installer_Config, 7z_Archive. \nIn addition, an optional file, Installer_Config, is allowed. You can use the following command to\ncreate an installer self-extracting archive:</P>\n<PRE class=\"example\">\ncopy /b 7zS.sfx + config.txt + archive.7z archive.exe\n</PRE>\n\n<P>An optimally small installation package size can be achieved,\nif the installation files are uncompressed before including them in the 7z archive.</P>\n\n<P><SPAN class=\"filename\">-y</SPAN> switch for installer module specifies quiet mode extraction.</P>\n\n<H4>Installer Config file format</H4>\n<P>\nThis config file contains commands for the Installer. The file begins with the string\n<B>;!@Install@!UTF-8!</B> and ends with <B>;!@InstallEnd@!</B>.\nThe file must be written in UTF-8 encoding.\nThe file contains any or all these string pairs:\n<P>ID_String=\"Value\"</P>\n<P>\n    <TABLE>\n      <TR> <TH width=\"60\">ID_String</TH> <TH>Description</TH> </TR>\n      <TR> <TD>Title</TD> <TD>Title for messages</TD> </TR>\n      <TR> <TD>BeginPrompt</TD> <TD>Begin Prompt message</TD> </TR>\n      <TR> <TD>Progress</TD> <TD>Value can be \"yes\" or \"no\". Default value is \"yes\".</TD> </TR>\n      <TR> <TD>RunProgram</TD> <TD>Command for executing. Default value is \"setup.exe\". Substring <B>%%T</B> \n      will be replaced with path to temporary folder, where files were extracted</TD> </TR>\n      <TR> <TD>Directory</TD> <TD>Directory prefix for \"RunProgram\". Default value is \".\\\\\"</TD> </TR>\n      <TR> <TD>ExecuteFile</TD> <TD>Name of file for executing</TD> </TR>\n      <TR> <TD>ExecuteParameters</TD> <TD>Parameters for \"ExecuteFile\"</TD> </TR>\n    </TABLE>\n</P>\n<P>You may omit any pair.</P>\n\n<P>There are two ways to run a installation program: <B>RunProgram</B> and <B>ExecuteFile</B>.\nUse <B>RunProgram</B>, if you want to run a program from the .7z archive.\nUse <B>ExecuteFile</B>, if you want to open a document from the .7z archive, or\nif you want to execute a command from Windows.</P>\n\n<P>If you use <B>RunProgram</B>, and if you specify empty directory prefix: <B>Directory</B>=\"\",\nthe system searches for the executable file in the following sequence:</P>\n<OL>\n<LI>The directory from which the application (installer) loaded. \n<LI>The temporary folder, where files were extracted.\n<LI>The Windows system directory. \n</OL>\n\n<H4>Config file Examples</H4>\n\n<PRE class=\"example\">\n;!@Install@!UTF-8!\nTitle=\"7-Zip 4.00\"\nBeginPrompt=\"Do you want to install the 7-Zip 4.00?\"\nRunProgram=\"setup.exe\"\n;!@InstallEnd@!\n</PRE>\n\n<BR>\n\n\n<PRE class=\"example\">\n;!@Install@!UTF-8!\nTitle=\"7-Zip 4.00\"\nBeginPrompt=\"Do you want to install the 7-Zip 4.00?\"\nExecuteFile=\"7zip.msi\"\n;!@InstallEnd@!\n</PRE>\n\n<BR>\n\n<PRE class=\"example\">\n;!@Install@!UTF-8!\nTitle=\"7-Zip 4.01 Update\"\nBeginPrompt=\"Do you want to install the 7-Zip 4.01 Update?\"\nExecuteFile=\"msiexec.exe\"\nExecuteParameters=\"/i 7zip.msi REINSTALL=ALL REINSTALLMODE=vomus\"\n;!@InstallEnd@!\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a -sfx a.exe *.txt\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.txt</SPAN> files to self extracting \n  archive  <SPAN class=\"filename\">a.exe</SPAN> using the default console SFX module.</P>\n\n<PRE class=\"example\">\n7z a -sfx7z.sfx a.exe *\n</PRE>\n\n<P>adds all files to self extracting archive <SPAN class=\"filename\">a.exe</SPAN>\nwith module <SPAN class=\"filename\">7z.sfx</SPAN> using windows version of SFX mudule.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/ssc.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-ssc (Set Sensitive Case mode) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-ssc (Set Sensitive Case mode) switch</H1>\n\n<P>Sets sensitive case mode for file names.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-scs[-]\n</PRE>\n\n<TABLE>\n  <TR><TH width=\"80\">Switch</TH> <TH>Description</TH></TR>\n  <TR><TD>-ssc</TD> <TD>Set case-sensitive mode. It's default for Posix/Linux systems.</TD></TR>\n  <TR><TD>-ssc-</TD> <TD>Set case-insensitive mode. It's default for Windows systems.</TD></TR>\n</TABLE>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a archive.7z A*.txt -ssc -r\n</PRE>\n\n<P>compresses all <SPAN class=\"filename\">A*.txt</SPAN> files\n  from current directory and all it's subdirectories. That command doesn't compress\n  <SPAN class=\"filename\">a*.txt</SPAN> files.\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/stdin.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-si (read data from stdin) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-si (read data from stdin) switch</H1>\n\n<P>Causes 7-Zip to read data from stdin (standard input) instead of from disc files.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-si{file_name}\n</PRE>\n\n<DL>\n  <DT>{file_name}</DT>\n  <DD>Specifies a name that will be stored in the archive for the compressed data.\n    If file_name is not specified, data will be stored without a name.</DD>\n</DL>\n\n<P>Note: The current version of 7-Zip does not support reading of archives from stdin.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a archive.gz -tgzip -siDoc2.txt < Doc.txt\n</PRE>\n\n<P>compresses input stream from file Doc.txt to \n<SPAN class=\"filename\">archive.gz</SPAN> archive\nusing <SPAN class=\"filename\">Doc2.txt</SPAN> file name.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/stdout.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-so (write data to stdout) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-so (write data to stdout) switch</H1>\n\n<P>Causes 7-Zip to write output data to stdout (standard output stream).</P> \n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-so\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x archive.gz -so > Doc.txt\n</PRE>\n\n<P>decompresses <SPAN class=\"filename\">archive.gz</SPAN> \narchive to output stream and then redirects that stream to\n<SPAN class=\"filename\">Doc.txt</SPAN> file.</P>\n\n\n<PRE class=\"example\">\n7z a dummy -tgzip -so Doc.txt > archive.gz\n</PRE>\n\n<P>compresses the <SPAN class=\"filename\">Doc.txt</SPAN> file to the 7-Zip standard\noutput stream and writes that stream to \n<SPAN class=\"filename\">archive.gz</SPAN> file.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/stop_switch.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-- (Stop switches parsing) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-- (Stop switches parsing) switch</H1>\n\n<P>Disables switch parsing after \"--\" on the command line.\nThis is to allow 7-Zip to use file names that start with \"-\".\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n--\n</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z t -- -ArchiveName.7z\n</PRE>\n\n<P>tests <SPAN class=\"filename\">-ArchiveName.7z</SPAN> archive.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/type.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-o (set Output directory) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-t (set Type of archive) switch</H1>\n\n<P>Specifies the type of archive.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-t{archive_type}\n</PRE>\n\n<DL>\n  <DT>{archive_type}</DT>\n  <DD>Specifies the type of archive. It can be: 7z, split, zip, gzip, bzip2, tar, ....\n  7z format is the default.\n</DD>\n</DL>\n\n<P>If -t{archive_type} switch is not specified, 7-Zip uses extension of archive to \n  detect the type of archive.</P>\n\n<P>Note: gzip or bzip2 formats support only one file per archive.\nIf you want to compress more than one file to these formats,\ncreate a tar archive first, and then compress it with your selected format.</P>\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.txt\n</PRE>\n\n<P>adds all <SPAN class=\"filename\">*.txt</SPAN> files from current directory \nto zip archive <SPAN class=\"filename\">archive.zip</SPAN>.</P>\n\n<PRE class=\"example\">\n7z t -t7z.split archive.7z.001\n</PRE>\n\n<P>tests all files in <SPAN class=\"filename\">archive.7z.001</SPAN>. It also checks\nthat archive is multivolume .7z archive.</P>\n\n<PRE class=\"example\">\n7z x -tiso archive.iso\n</PRE>\n\n<P>extracts files from <SPAN class=\"filename\">archive.iso</SPAN> open as ISO archive.\n\n<PRE class=\"example\">\n7z x -tudf archive.iso\n</PRE>\n\n<P>extracts files from <SPAN class=\"filename\">archive.iso</SPAN> open as UDF archive.\n\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/list.htm\">l (List)</A>,\n  <A href=\"../commands/test.htm\">t (Test)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/update.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-u (Update options) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-u (Update options) switch</H1>\n\n<P>Specifies how to update files in an archive and (or) how to create new archives.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-u<A class=\"parameter\" href=\"#disable_base_archive\">[-]</A>&lt;action_set><A class=\"parameter\" href=\"#new_archive_name\">[!{new_archive_name}]</A>\n\n  &lt;action_set> ::= &lt;state_action>...\n\n    &lt;state_action> ::= <A class=\"parameter\" href=\"#state\">&lt;state></A><A class=\"parameter\" href=\"#state\">&lt;action></A>\n\n      <A class=\"parameter\" href=\"#action\">&lt;state></A> ::= p | q | r | x | y | z | w\n\n      <A class=\"parameter\" href=\"#action\">&lt;action></A> ::= 0 | 1 | 2 | 3\n</PRE>\n\n\n<H4>Parameters</H4>\n\n<DL>\n  <DT><A name=\"disable_base_archive\"></A>dash (-)</DT>\n  <DD><P>Disables any updates in the base archive.</P>\n\n      <P>The term <B>base archive</B> means the archive assigned by \"base_archive_name\"\n      on the command line. See <A href=\"../syntax.htm\">Command line syntax</A>\n      for more details.</P>\n  </DD>\n  <DT><A name=\"new_archive_name\"></A>{new_archive_name}</DT>\n  <DD><P>Specifies the path name of the new archive to be created.\n    All options in this switch will refer to this new archive.</P>\n    <P>If not assigned, then all options in this switch will\n                  refer to the base archive of the command.</P>\n  </DD>\n  <DT><A name=\"state\"></A>&lt;state></DT>\n  <DD><P>Specifies the state of a particular file to be processed.</P>\n    <PRE class=\"syntax\">&lt;state> ::= p | q | r | x | y | z | w</PRE>\n    <P>For each unique filename there are 6 variants of state:</P>\n    <TABLE>\n      <TR> <TH>&lt;state></TH> <TH>State condition</TH>\n           <TH width=\"20%\">File on Disk</TH> <TH width=\"20%\">File in Archive</TH> </TR>\n\n      <TR> <TD align=\"center\">p</TD> <TD>File exists in archive, but is not matched with wildcard.</TD>\n           <TD>&nbsp;</TD> <TD>Exists, but is not matched</TD> </TR>\n\n      <TR> <TD align=\"center\">q</TD> <TD>File exists in archive, but doesn't exist on disk.</TD>\n           <TD>Doesn't exist</TD> <TD>Exists</TD> </TR>\n\n      <TR> <TD align=\"center\">r</TD> <TD>File doesn't exist in archive, but exists  on disk.</TD>\n           <TD>Exists</TD> <TD>Doesn't exist</TD> </TR>\n\n      <TR> <TD align=\"center\">x</TD> <TD>File in archive is newer than the file on disk.</TD>\n           <TD>Older</TD> <TD>Newer</TD> </TR>\n\n      <TR> <TD align=\"center\">y</TD> <TD>File in archive is older than the file on disk.</TD>\n           <TD>Newer</TD> <TD>Older</TD> </TR>\n\n      <TR> <TD align=\"center\">z</TD> <TD>File in archive is same as the file on disk</TD>\n           <TD>Same</TD> <TD>Same</TD> </TR>\n\n      <TR> <TD align=\"center\">w</TD> <TD>Can not be detected what file is newer  \n              (times are the same, sizes are different)</TD>\n           <TD>?</TD> <TD>?</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT><A name=\"action\"></A>&lt;action></DT>\n  <DD><P>Specifies the action for a given <A class=\"parameter\" href=\"#state\">&lt;state></A>.</P>\n    <PRE class=\"syntax\">&lt;action> ::= 0 | 1 | 2 | 3</PRE>\n    <P>For each state you can specify one of the three variants of actions:</P>\n    <TABLE>\n      <TR> <TH>&lt;action></TH> <TH>Description</TH></TR>\n      <TR> <TD align=\"center\">0</TD> <TD>Ignore file (don't create item in new archive for this file)</TD></TR>\n      <TR> <TD align=\"center\">1</TD> <TD>Copy file (copy from old archive to new)</TD></TR>\n      <TR> <TD align=\"center\">2</TD> <TD>Compress (compress file from disk to new archive)</TD></TR>\n      <TR> <TD align=\"center\">3</TD> <TD>Create Anti-item (item that will delete file or directory during extracting). This feature is supported only in 7z format.</TD></TR>\n    </TABLE>\n  </DD>\n</DL>\n\n\n<H4>Remarks</H4>\n\n<P>Any update command (such as <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>) can be assigned in these terms.</P>\n<P>The following table shows action sets for update commands.</P>\n\n<TABLE>\n  <TR> <TH>command \\ <A class=\"parameter\" href=\"#state\">&lt;state></A></TH>\n              <TH>p</TH> <TH>q</TH> <TH>r</TH> <TH>x</TH> <TH>y</TH> <TH>z</TH> <TH>w</TH></TR>\n  <TR> <TH><A href=\"../commands/delete.htm\">d (Delete)</A></TH> <TD>1</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD></TR>\n  <TR> <TH><A href=\"../commands/add.htm\">a (Add)</A></TH> <TD>1</TD> <TD>1</TD> <TD>2</TD> <TD>2</TD> <TD>2</TD> <TD>2</TD>  <TD>2</TD></TR>\n  <TR> <TH><A href=\"../commands/update.htm\">u (Update)</A></TH> <TD>1</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>\n  <TR> <TH><A href=\"../commands/update.htm\">Freshen</A></TH> <TD>1</TD> <TD>1</TD> <TD>0</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>\n  <TR> <TH><A href=\"../commands/update.htm\">Synchronize</A></TH> <TD>1</TD> <TD>0</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>\n</TABLE>\n\n\n<P>If you don't specify a\n<A class=\"parameter\" href=\"#new_archive_name\"><I>!{new_archive_name}</I></A> option, then\nall options will refer to the main archive (the archive assigned on the command line after the 7z command).\nIf you specify <A class=\"parameter\" href=\"#new_archive_name\"><I>!{new_archive_name}</I></A>\noption, then 7-Zip also will create a new archive with the specified name and all options\nwill refer to that new archive.</P>\n\n<P>Multiple update switches are supported.\n7-Zip can create any number of new archives during one operation.</P>\n\n<P>By default, the action set for each new archive is assigned\nas the action set of the main command. There are 3 different\naction sets for commands: <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>.\nYou can overload any &lt;state_action> pair.</P>\n\n<H4>Time zone notes</H4>\n<P>If you change time zone (when you move your computer to another time zone \nor if there are clock changes for daylight saving in your zone), you can have some problems \nwith update commands that depend from file's modification time. It's strongly recommended to use only \nfile system that uses Coordinated Universal Time (UTC) and archive format that also uses UTC. \nIn that case you will have no problems with time zone changes.\nAlso it's recommended to use only UTC formats in other cases, for example, if you send files to \nsomeone in another time zone.</P>\n\n<P>Also in some cases there are no problems, if both file system and archive format use local time, for example, FAT file system and ZIP format.</P> \n<UL>\n<LI>UTC file systems: NTFS\n<LI>UTC archive formats: .zip with -mtc switch, 7z, tar, gzip2, iso, wim\n<LI>Local time file systems : FAT, FAT32\n<LI>Local time archive formats : rar, zip, cab\n</UL>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z u c:\\1\\exist.7z -u- -up0q3x2z0!c:\\1\\update.7z *\n</PRE>\n\n<P>creates a new archive <SPAN class=\"filename\">update.7z</SPAN> and\nwrites to this archive all files from current directory which differ from\nfiles in <SPAN class=\"filename\">exist.7z</SPAN> archive.\n<SPAN class=\"filename\">exist.7z</SPAN> archive will not be changed.</P>\n\n<PRE class=\"example\">\n7z u c:\\1\\exist.7z -up0q3x2z0!c:\\1\\update.7z * -ms=off\n</PRE>\n\n<P>creates a new archive <SPAN class=\"filename\">update.7z</SPAN> and\nwrites to this archive all files from the current directory which differ from\nfiles in <SPAN class=\"filename\">exist.7z</SPAN> archive.\n\n<P>Note: The current version of 7-Zip cannot change an archive created with the solid option switched on.\nTo update a .7z archive, you must create and update the archive in non-solid\nmode (-ms=off switch).</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/volume.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-v (Create Volumes) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-v (Create Volumes) switch</H1>\n\n<P>Specifies volume sizes.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-v{Size}[b | k | m | g]\n\n</PRE>\n<DL>\n  <DT>{Size}[b | k | m | g]</DT>\n  <DD>Specifies volume size in Bytes, Kilobytes (1 Kilobyte = 1024 bytes),\n  Megabytes (1 Megabyte = 1024 Kilobytes) or Gigabytes (1 Gigabyte = 1024 Megabytes).\n  if you specify only {Size}, 7-zip will treat it as bytes.</DD>\n</DL>\n\n<P>It's possible to specify several -v switches.</P>\n\n<P><B>NOTE:</B> Please don't use volumes (and don't copy volumes) before finishing archiving. \n7-Zip can change any volume (including first volume) at the end of archiving operation.</P>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z a a.7z *.txt -v10k -v15k -v2m\n</PRE>\n\n<P>creates multivolume <SPAN class=\"filename\">a.7z</SPAN> archive.\nFirst volume will be 10 KB, second will be 15 KB, and all others will be 2 MB.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/working_dir.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-w (set Working directory) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-w (set Working directory) switch</H1>\n\n<P>Sets the working directory for the temporary base archive. By\ndefault, 7-Zip builds a new base archive file in the same directory as the\nold base archive file. By specifying this switch, you can set the\nworking directory where the temporary base archive file will be built.\nAfter the temporary base archive file is built, it is copied over the\noriginal archive; then, the temporary file is deleted.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">\n-w[<A class=\"parameter\" href=\"#dir_path\">{dir_path}</A>]\n</PRE>\n\n<DL>\n  <DT><A name=\"dir_path\"></A>{dir_path}</DT>\n  <DD>\n    <P>Specifies the destination directory path. It's not required that\n      a path end with a backslash.</P>\n    <P>If &lt;dir_path> is not assigned, then 7-Zip will use the Windows temporary directory.</P>\n  </DD>\n</DL>\n\n\n<H4>Example</H4>\n\n<PRE class=\"example\">\n7z a -tzip archive.zip *.cpp -wc:\\temp\n</PRE>\n\n<P>adds <SPAN class=\"filename\">*.cpp</SPAN> files to the\n<SPAN class=\"filename\">archive.zip</SPAN> archive, creating a temporary archive\nin <SPAN class=\"filename\">c:\\temp</SPAN> folder.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/add.htm\">a (Add)</A>,\n  <A href=\"../commands/delete.htm\">d (Delete)</A>,\n  <A href=\"../commands/update.htm\">u (Update)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/switches/yes.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>-y (assume Yes on all queries) switch</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>-y (assume Yes on all queries) switch</H1>\n\n<P>Disables most of the normal user queries during 7-Zip\nexecution. You can use this switch to suppress overwrite queries in the\n<A href=\"../commands/extract.htm\">e (Extract)</A> and\n<A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A> commands.</P>\n\n<H4>Syntax</H4>\n\n<PRE class=\"syntax\">-y</PRE>\n\n<H4>Examples</H4>\n\n<PRE class=\"example\">\n7z x src.zip -y\n</PRE>\n\n<P>extracts all files from\n  <SPAN class=\"filename\">src.zip</SPAN> archive. All overwrite queries will be\nsuppressed and files on disk with same filenames as in archive will be\noverwritten.</P>\n\n<H4>Commands that can be used with this switch</H4>\n\n<P>\n  <A href=\"../commands/extract.htm\">e (Extract)</A>,\n  <A href=\"../commands/extract_full.htm\">x (Extract with full paths)</A>\n</P>\n\n<H4>See also</H4>\n\n<P>\n  <B>Switches:</B>\n  <A href=\"overwrite.htm\">-ao (Overwrite mode)</A>,\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/cmdline/syntax.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Command Line Syntax</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Command Line Syntax</H1>\n\n<PRE class = \"syntax\">\n7z <A href = \"commands/index.htm\">&lt;command></A> [<A href = \"switches/index.htm\">&lt;switch></A>...] &lt;base_archive_name> [&lt;arguments>...]\n</PRE>\n<PRE class = \"syntax\">\n&lt;arguments> ::= <A href = \"switches/index.htm\">&lt;switch></A> | &lt;wildcard> | &lt;filename> | &lt;list_file>\n<A href = \"switches/index.htm\">&lt;switch></A>::= &lt;switch_symbol>&lt;switch_characters>[&lt;option>]\n&lt;switch_symbol> ::= '/' | '-' \n&lt;list_file> ::= @{filename}\n</PRE>\n\n\n<P>Expressions in square brackets (between '[' and ']') are optional.</P>\n\n<P>Expressions in curly braces ('{' and '}') mean that instead of that \nExpression (including braces), the user must substitute some string.</P>\n\n<P>Expression</P>\n\n<PRE class = \"syntax\">\nexpression1 | expression2 | ... | expressionN</DT>\n</PRE>\n\n<P>\nmeans that any (but only one) from these expressions must be specified.\n\n<P><A href = \"commands/index.htm\">Commands</A> and\n<A href = \"switches/index.htm\">switches</A> can be entered in upper or lower case.</P>\n\n<P>Command is the first non-switch argument.</P>\n\n<P>The \"base_archive_name\" must be the first filename on the command line\nafter the command.</P>\n\n<P>The switches and other filenames can be in any order.</P>\n\n<P>Wildcards or filenames with spaces must be quoted:</P>\n\n<PRE>\n    \"Dir\\Program files\\*\"\n    Dir\\\"Program files\"\\*\n</PRE>\n\n<P>Switch options can be combined to save command line length. However, some\nswitch options take optional string arguments and therefore, must be the\nlast option in a combined argument token string because 7-Zip accepts the\nrest of the argument token as the optional argument.</P>\n\n<P>7-Zip uses wild name matching similar to Windows 95:</P>\n<UL>\n  <LI><B>'*'</B> means a sequence of arbitrary characters.</LI>\n  <LI><B>'?'</B> means any character.</LI>\n</UL>\n\n<P><B>\n7-Zip doesn't uses the system wildcard parser.   7-Zip doesn't\nfollow the archaic rule by which *.* means any file. 7-Zip treats\n*.* as matching the name of any file that has an extension. To process all files, you must\nuse a * wildcard.</B></P>\n\n<P>Examples:</P>\n<TABLE border = \"0\">\n  <TR><TD>*.txt</TD><TD>means all files with an extension of \".txt\"</TD></TR>\n  <TR><TD>?a*</TD><TD>means all files with a second character of \"a\"</TD></TR>\n  <TR><TD>*1*</TD><TD>means all names that contains character \"1\"</TD></TR>\n  <TR><TD>*.*.*</TD><TD>means all names that contain two at least \".\" characters</TD></TR>\n</TABLE>\n\n\n<P>The default wildcard \"*\" will be used if there is no filename/wildcard in the\ncommand line.</P>\n\n<P>Slash ('\\') at the end of a path means a directory. Without a Slash ('\\') at\nthe end of the path, the path can refer either to a file or a directory.\n\n\n<H2><A name = \"ListFile\"></A>List file</H2>\n\n<P>You can supply one or more filenames or wildcards for special list files\n(files containing lists of files). The filenames in such list file must be\nseparated by new line symbol(s).</P>\n\n<P>For list files, 7-Zip uses UTF-8 encoding by default. You can change encoding\nusing <A href = \"switches/charset.htm\">-scs</A> switch.</P>\n\n<P>Multiple list files are supported.</P>\n\n<P>For example, if the file \"listfile.txt\" contains the following:</P>\n\n<PRE>\n    My programs\\*.cpp\n    Src\\*.cpp\n</PRE>\n<P>then the command</P>\n\n<PRE>\n    7z a -tzip archive.zip @listfile.txt\n</PRE>\n\n<P>adds to the archive \"archive.zip\" all \"*.cpp\" files from directories \"My\nprograms\" and \"Src\".</P>\n\n<H2><A name = \"ListFile\"></A>Short and Long File Names</H2>\n\n<P>7-Zip supports short file names  (like FILENA~1.TXT) in some cases. \nHowever, it's strongly recommended to use only the real (long) file names.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/about.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>About Dialog Box</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>About Dialog Box</H1>\n\n<P>The About dialog box provides information about 7-Zip and allows \nyou to register 7-Zip. This dialog box is available \nfrom the Help menu.</P>\n\n<UL>\n<LI>Press <B>www.7-zip.org</B> button for opening 7-Zip Home Page.</LI>\n<LI>Press <B>Register</B> button to register 7-Zip.</LI>\n</UL>\n\nSee also <A href = \"../general/register.htm\">Register 7-Zip</A> for more\ndetails how to register 7-Zip.\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/benchmark.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Benchmark</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Benchmark</H1>\n\n<P>This form allows you to measure the performance of your computer.</P>\n\n<P>There are two tests:<P>\n<OL>\n  <LI>Compression with LZMA method\n  <LI>Decompression with LZMA method\n</OL>\n\n<P>The benchmark shows a rating in MIPS (million instructions per second).\nThe rating value is calculated from the measured speed, and it\nis normalized with results of Intel Core 2 CPU with multi-threading option switched off. \nSo if you have modern CPU from Intel or AMD, rating values in single-thread mode \nmust be close to real CPU frequency.</P>\n\n<P>You can change the dictionary size to increase memory usage.\nAlso you can change the number of threads.</P>\n\n<P>The <B>CPU Usage</B> column shows the percentage of time the processor is working.\nIt's normalized for a one-thread load. For example, 180% CPU Usage for 2 threads\ncan mean that average CPU usage is about 90% for each thread.</P>\n\n<P>The <B>Rating / Usage</B> column shows rating normalized for 100% of CPU usage.\nThat column shows performance of the one CPU thread. It must be close to real CPU frequency,\nif you have modern CPU.</P>\n\n<P>The <B>Total rating</B> shows averages of the compressing and decompression ratings.</P>\n\n\n<P>Compression speed and rating strongly depend from memory (RAM) latency.\n\n<P>Decompression speed and rating strongly depend on CPU integer operations.\nFor example, an Intel Pentium 4 has big branch\nmisprediction penalty (which is effect of long pipeline) and pretty slow\nmultiply and shift operations. So, the  Pentium 4 has pretty low decompressing\nratings.</P>\n\n\n<P>Also the program checks possible errors. \nIf the program shows some error message, in most cases it means that \nyour RAM is defective. If so, don't use 7-Zip for\ncompressing data, since such errors can lead to data losses.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>7-Zip File Manager</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>7-Zip File Manager</H1>\n\n<P>The 7-Zip File Manager is a program for manipulating files and folders.</P>\n\n<P>The 7-Zip File Manager can work with two panels. You can switch between\npanels by pressing the Tab button. Most of the operations can be\nexecuted using keyboard shortcuts or by right-clicking on items \nand selecting the appropriate command from menu.</P>\n\n\n<H4>In This Section</H4>\n\n<DL>\n  <DT><A href = \"menu.htm\">Menu Items and Shortcut Keys</A></DT>\n    <DD>Describes the menu items and  keyboard shortcut.</DD>\n  <DT><A href = \"options.htm\">Options Dialog Box</A></DT>\n    <DD>Describes what settings you can change that affect the 7-Zip File Manager.</DD>\n  <DT><A href = \"benchmark.htm\">Benchmark</A></DT>\n    <DD>Describes a 7-Zip Benchmark for measuring CPU performance.</DD>\n  <DT><A href = \"about.htm\">About Dialog Box</A></DT>\n    <DD>Provides information about 7-Zip.</DD>\n  <DT><A href = \"plugins/index.htm\">Plugins</A></DT>\n    <DD>Describes plugins for the 7-Zip File Manager.</DD>\n</DL>\n\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/menu.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Menu Items and Shortcut Keys</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H2>Menu Items</H2>\n\n<P>Note: 'Grey' refers to the numeric keypad.</P>\n\n<H3>File</H3>\n<TABLE>\n  <TR> <TH>Menu item</TH> <TH>Shortcut</TH>  <TH>Description</TH> </TR>\n  <TR> <TD>System</TD> <TD></TD> <TD>Submenu with menu commands from system shell</TD> </TR>\n  <TR> <TD>Open</TD> <TD>Enter</TD> <TD>Open current item</TD> </TR>\n  <TR> <TD>Open Inside</TD> <TD>Ctrl+PgDn</TD> <TD>Open current item as folder inside 7-Zip</TD> </TR>\n  <TR> <TD>Open Outside</TD> <TD>Shift+Enter</TD> <TD>Open current item in new window</TD> </TR>\n  <TR> <TD>Edit</TD> <TD>F4</TD> <TD>Open selected item with editor</TD> </TR>\n  <TR> <TD>Rename</TD> <TD>F2</TD> <TD>Rename selected item</TD> </TR>\n  <TR> <TD>Copy To...</TD> <TD>F5</TD> <TD>Copy selected items</TD> </TR>\n  <TR> <TD>Move To...</TD> <TD>F6</TD> <TD>Move selected items</TD> </TR>\n  <TR> <TD>Delete</TD> <TD>Delete</TD> <TD>Delete selected items</TD> </TR>\n  <TR> <TD>Split file...</TD> <TD></TD> <TD>Split file to parts</TD> </TR>\n  <TR> <TD>Combine files...</TD> <TD></TD> <TD>Combine files to one file</TD> </TR>\n  <TR> <TD>Comment</TD> <TD>Ctrl+Z</TD> <TD>Set comment for file</TD> </TR>\n  <TR> <TD>Calculate checksum</TD> <TD></TD> <TD>Calculates CRC checksum for files</TD> </TR>\n  <TR> <TD>Create Folder</TD> <TD>F7</TD> <TD>Create new folder</TD> </TR>\n  <TR> <TD>Create File</TD> <TD>Shift+F4</TD> <TD>Creates new file</TD> </TR>\n  <TR> <TD>Exit</TD> <TD>Alt+F4</TD> <TD>Closes the program.</TD> </TR>\n</TABLE>\n\n<H3>Edit</H3>\n<TABLE>\n  <TR> <TH>Menu Item</TH> <TH>Shortcut</TH>  <TH>Description</TH> </TR>\n  <TR> <TD>Select All</TD> <TD>Shift+[Grey +]</TD> <TD>Select all items</TD> </TR>\n  <TR> <TD>Deselect All</TD> <TD>Shift+[Grey -]</TD> <TD>Select all items</TD> </TR>\n  <TR> <TD>Invert Selection</TD> <TD>[Grey *]</TD> <TD>Select / Deselect all items</TD> </TR>\n  <TR> <TD>Select...</TD> <TD>[Grey +]</TD> <TD>Select specified items</TD> </TR>\n  <TR> <TD>Deselect...</TD> <TD>[Grey -]</TD> <TD>Deselect specified items</TD> </TR>\n  <TR> <TD>Select by Type</TD> <TD>Alt+[Grey +]</TD> <TD>Select all items with the same extension as current item</TD> </TR>\n  <TR> <TD>Deselect by Type</TD> <TD>Alt+[Grey -]</TD> <TD>Deselect all items with the same extension as current item</TD> </TR>\n</TABLE>\n\n<H3>View</H3>\n<TABLE>\n  <TR> <TH>Menu Item</TH> <TH>Shortcut</TH>  <TH>Description</TH> </TR>\n  <TR> <TD>Large Icons</TD><TD>Ctrl+1</TD> <TD>Displays items by using large icons</TD> </TR>\n  <TR> <TD>Small Icons</TD><TD>Ctrl+2</TD> <TD>Displays items by using small icons</TD> </TR>\n  <TR> <TD>List</TD> <TD>Ctrl+3</TD><TD>Displays items in a list</TD> </TR>\n  <TR> <TD>Details</TD> <TD>Ctrl+4</TD><TD>Displays items in a list with detailed information about each item</TD> </TR>\n\n  <TR> <TD>Name</TD> <TD>Ctrl+F3</TD> <TD>Sort items by Name</TD> </TR>\n  <TR> <TD>Type</TD> <TD>Ctrl+F4</TD> <TD>Sort items by Type</TD> </TR>\n  <TR> <TD>Date</TD> <TD>Ctrl+F5</TD> <TD>Sort items by Date</TD> </TR>\n  <TR> <TD>Size</TD> <TD>Ctrl+F6</TD> <TD>Sort items by Size</TD> </TR>\n  <TR> <TD>Unsorted</TD> <TD>Ctrl+F7</TD> <TD>Do not sort items</TD> </TR>\n\n  <TR> <TD>Flat View</TD> <TD></TD> <TD>Switch Flat view mode for list of files</TD> </TR>\n  <TR> <TD>2 Panels</TD> <TD>F9</TD> <TD>Switch On/Off second panel</TD> </TR>\n  <TR> <TD>Toolbars</TD> <TD></TD> <TD>Menu items for toolbars handling</TD> </TR>\n\n  <TR> <TD>Open Root Folder</TD>  <TD>\\</TD> <TD>Open root computer folder</TD> </TR>\n  <TR> <TD>Up One Level</TD> <TD>Backspace</TD> <TD>Open the folder one level up</TD> </TR>\n  <TR> <TD>Folders History...</TD> <TD>Alt+F12</TD> <TD>Open folders history</TD> </TR>\n  <TR> <TD>Refresh</TD> <TD>Ctrl+R</TD> <TD>Refresh items list</TD> </TR>\n                      \n</TABLE>\n\n<H3>Options</H3>\n<TABLE>\n  <TR> <TH>Menu Item</TH> <TH>Shortcut</TH>  <TH>Description</TH> </TR>\n  <TR> <TD>Options...</TD> <TD></TD> <TD>Open Options dialog box</TD> </TR>\n</TABLE>\n\n<H3>Favorites</H3>\n<TABLE>\n  <TR> <TH>Menu Item</TH> <TH>Shortcut</TH>  <TH>Description</TH> </TR>\n  <TR> <TD>Add folder to Favorites as</TD> <TD></TD> <TD>Adds folder to favorities</TD> </TR>\n</TABLE>\n\n<H3>Help</H3>\n<TABLE>\n  <TR> <TH>Menu Item</TH> <TH>Shortcut</TH>  <TH>Description</TH> </TR>\n  <TR> <TD>Contents...</TD> <TD>F1</TD> <TD>Opens 7-Zip Help</TD> </TR>\n  <TR> <TD>About 7-Zip...</TD> <TD></TD> <TD>Opens About dialog box</TD> </TR>\n</TABLE>\n\n\n<H2>Miscellaneous commands</H2>\n<TABLE>\n  <TR> <TH>Shortcut</TH>  <TH>Description</TH> </TR>\n  <TR> <TD>Tab</TD> <TD>Switch between panels</TD> </TR>\n  <TR> <TD>Insert</TD> <TD>Select / Deselect current item</TD> </TR>\n  <TR> <TD>Shift+F10</TD> <TD>Display the shortcut menu for the selected items</TD> </TR>\n  <TR> <TD>RightCtrl+0<BR>Alt+0<BR>...<BR>RightCtrl+9<BR>Alt+9</TD> <TD>Open folder bookmark</TD> </TR>\n  <TR> <TD>Shift+RightCtrl+0<BR>Shift+Alt+0<BR>...<BR>Shift+RightCtrl+9<BR>Shift+Alt+9</TD> <TD>Creates folder bookmark</TD> </TR>\n  <TR> <TD>Alt+F1</TD> <TD>Edit the Folder Address on left panel</TD> </TR>\n  <TR> <TD>Alt+F2</TD> <TD>Edit the Folder Address on right panel</TD> </TR>\n  <TR> <TD>Ctrl+[Grey +]</TD> <TD>Adjust optimal column width for items</TD> </TR>\n  <TR> <TD>Alt+Up</TD> <TD>Open same folder in other panel</TD> </TR>\n  <TR> <TD>Alt+Left,<BR>Alt+Right</TD> <TD>Open current folder in other panel</TD> </TR>\n</TABLE>\n\n<H2>Keyboard Shortcuts</H2>\n\n<TABLE>\n  <TR> <TH>Key</TH>  <TH>Normal</TH> <TH>Ctrl</TH> <TH>Alt</TH> <TH>Shift</TH> </TR>\n  <TR> <TH>Tab</TH> <TD>Switch panel</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>F1</TH> <TD>Help</TD> <TD></TD> <TD>Left Path</TD> <TD></TD> </TR>\n  <TR> <TH>F2</TH> <TD>Rename</TD> <TD></TD>  <TD>Right Path</TD> <TD></TD> </TR>\n  <TR> <TH>F3</TH> <TD>View</TD> <TD>Sort by Name</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>F4</TH> <TD>Edit</TD> <TD>Sort by Type</TD> <TD>Exit</TD> <TD>Create File</TD> </TR>\n  <TR> <TH>F5</TH> <TD>Copy</TD> <TD>Sort by Date</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>F6</TH> <TD>Move</TD> <TD>Sort by Size</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>F7</TH> <TD>Create Folder</TD> <TD>Unsorted</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>F9</TH> <TD>1/2 Panels</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>F10</TH> <TD>Menu</TD> <TD></TD> <TD></TD> <TD>Shortcut Menu</TD> </TR>\n  <TR> <TH>F12</TH> <TD></TD> <TD></TD> <TD>Folders History</TD> <TD></TD> </TR>\n  <TR> <TH>0-9</TH> <TD></TD> <TD>R: Folder Bookmark</TD><TD>Folder Bookmark</TD> <TD></TD> </TR>\n  <TR> <TH>A</TH> <TD></TD> <TD>Select All</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>N</TH> <TD></TD> <TD>Create File</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>R</TH> <TD></TD> <TD>Refresh</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Z</TH> <TD></TD> <TD>Comment</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Backspace</TH> <TD>Up One Level</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Enter</TH> <TD>Open</TD> <TD></TD> <TD>Properties</TD> <TD>Open outside</TD> </TR>\n  <TR> <TH>Insert</TH> <TD>Select Item</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Delete</TH> <TD>Delete Item</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Page Down</TH> <TD></TD> <TD>Open Inside</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Page Up</TH> <TD></TD> <TD>Up One Level</TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Up</TH> <TD></TD> <TD></TD> <TD>Open same folder</TD> <TD></TD> </TR>\n  <TR> <TH>Left</TH> <TD></TD> <TD></TD> <TD>Open current folder</TD> <TD></TD> </TR>\n  <TR> <TH>Right</TH> <TD></TD> <TD></TD> <TD>Open current folder</TD> <TD></TD> </TR>\n  <TR> <TH>\\</TH> <TD>Open root</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Grey /</TH> <TD>Open root</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Grey *</TH> <TD>Select All</TD> <TD></TD> <TD></TD> <TD></TD> </TR>\n  <TR> <TH>Grey +</TH> <TD>Select</TD> <TD>Adjust columns</TD> <TD>Select by Type</TD> <TD>Select All</TD> </TR>\n  <TR> <TH>Grey -</TH> <TD>Deselect</TD> <TD></TD> <TD>Deselect by Type</TD> <TD>Deselect All</TD> </TR>\n</TABLE>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/options.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Options Dialog Box</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Options Dialog Box</H1>\n\n\n<P>You can change many of the settings that affect the 7-Zip File Manager \nin the Options dialog box. To access this dialog box select Options \nfrom the Tools menu.</P> \n\n<P>The options dialog box contains the following pages:</P>\n<UL>\n  <LI><A href = \"#system\">System  Page</A></LI>\n  <LI><A href = \"#plugins\">Plugins Page</A></LI>\n  <LI><A href = \"#editor\">Editor Page</A></LI>\n  <LI><A href = \"#settings\">Settings Page</A></LI>\n  <LI><A href = \"#language\">Language Page</A></LI>\n</UL>\n\n<H2><a name=\"system\"></a>System  Page</H2>\n<P>Allows you to specify the behavior of 7-Zip in the filing system.</P>\n<DL>\n  <DT>Associate 7-Zip with</DT>\n    <DD>Lists the file name extensions and associated plugins that are currently \n       registered with 7-Zip. If file name extension is checked, \n        7-Zip will be used to open file with that extension.\n        In any case you can always open all archives with \n        7-Zip via your right-click context menu.</DD>\n</DL>\n\n<H2><a name=\"plugins\"></a>Plugins Page</H2>\n<P>Allows you to specify settings for the installed plugins.</P>\n<DL>\n  <DT>Plugins</DT>\n    <DD>Lists the plugins. For modifying settings of plugins, you must \n    select the plugin and press the Options button.</DD>\n</DL>\n\n<H2><a name=\"editor\"></a>Editor Page</H2>\n<P>Allows you to specify settings for the editor.</P>\n<DL>\n  <DT>Editor</DT>\n    <DD>Specifies the path to the editor.</DD>\n</DL>\n\n<H2><a name=\"settings\"></a>Settings Page</H2>\n<P>Allows you to specify some settings.</P>\n<DL>\n  <DT>Show .. item</DT>\n    <DD>Shows .. item in file list.</DD>\n  <DT>Show real file icons</DT>\n    <DD>Shows real file icons in file list. If this option is enabled,\n      listing updates can be slower.</DD>\n  <DT>Show system menu</DT>\n    <DD>Shows a system context sub-menu in the File menu.</DD>\n  <DT>Full row select</DT>\n    <DD>When an item is selected, the item and all its subitems are highlighted.</DD>\n  <DT>Show grid lines</DT>\n    <DD>Displays gridlines around items and subitems.</DD>\n  <DT>Alternative selection mode</DT>\n    <DD>If enabled, File Manager keeps selection mark when you move cursor.</DD>\n  <DT>Use large memory pages</DT>\n    <DD>If enabled, 7-Zip will try to use large pages. This feature allows an increase in speed of compression.\n      This may cause 7-Zip to pause when starting compression, because of allocation of the large pages.\n      Also, the Windows Task Manager doesn't show the real memory usage of the program, if 7-Zip uses large pages.\n      This feature works only on Windows 2003 / XP x64. \n      Also you must have administrator's rights for your system.\n      Recommended size of RAM: 1 GB or more.\n      To install this feature you must run 7-Zip File Manager at least once, \n      close it and reboot the system.</DD>\n</DL>\n\n<H2><a name=\"language\"></a>Language Page</H2>\n<P><P>Allows you to change the default language.</P>\n<DL>\n  <DT>Language</DT>\n    <DD>Lists the available languages.</DD>\n</DL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/plugins/7-zip/add.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Add to Archive Dialog Box</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Add to Archive Dialog Box</H1>\n\n<P>Allows you to specify options for creating or updating an archive.</P>\n\n<H4>How to call this dialog box</H4>\n<OL>\n  <LI>In Windows Explorer or in 7-Zip, right-click the file(s) or folder(s) you want to compress.</LI>\n  <LI>Point to <B>7-Zip</B>, and then click the <B>Add to archive...</B> command item.</LI>\n</OL>\n\n<H4>Parameters</H4>\n<DL>\n  <DT>Archive</DT>\n  <DD>Provides a space for you to specify a destination archive name.\n     You can click &quot;<B>...</B>&quot; button to display &quot;Open&quot; dialog box\n     that you can use to locate archive.</DD>\n\n  <DT>Archive format</DT>\n  <DD>Specifies a format of created archive. Some formats (gzip and bzip2) \n    do not support compressing more the one file per archive.</DD>\n\n  <DT>Compression level</DT>\n  <DD>\n    <P>Specifies compression level. There are 6 levels of compression:</P>\n    <TABLE>\n      <TR> <TH>Value</TH> <TH>Meaning</TH> </TR>\n      <TR> <TD>Store</TD> <TD>Files will be copied to archive without compression.</TD> </TR>\n      <TR> <TD>Fastest</TD> <TD>Fastest compression.</TD> </TR>\n      <TR> <TD>Fast</TD> <TD>Fast compression.</TD> </TR>\n      <TR> <TD>Normal</TD> <TD>Compression with balanced settings.</TD> </TR>\n      <TR> <TD>Maximum</TD> <TD>Can give a higher compression ratio than Normal level.\n               But it can be slower, and it can require more memory.</TD> </TR>\n      <TR> <TD>Ultra</TD> <TD>Can give a higher compression ratio than Maximum level. \n               But it can be slower, and it can require more memory.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT>Compression method</DT>\n  <DD>\n    <P>Specifies compression method. Each archive format can have its own compression methods:</P>\n    <TABLE>\n      <TR> <TH>Method</TH> <TH>Description</TH> </TR>\n      <TR> <TD>LZMA</TD> <TD>Default compression method of 7z format. It provides high \n                     compression ratio and very fast decompression.</TD> </TR>\n      <TR> <TD>PPMd</TD> <TD>Dmitry Shkarin's PPMdH algorithm with small changes. \n                  Usually it provides high compression ratio and high speed \n                  for text files.</TD> </TR>\n      <TR> <TD>BZip2</TD> <TD>Standard compression method based on BWT algorithm. \n                     Usually it provides high speed and pretty good \n                     compression ratio for text files.</TD> </TR>\n      <TR> <TD>Deflate</TD> <TD>Standard compression method of ZIP and GZip formats.\n             Compression ratio is not too high. But it provides pretty fast \n             compressing and decompressing. Deflate method supports only \n             32 KB dictionary.</TD> </TR>\n      <TR> <TD>Deflate64</TD> <TD>Modified version of Deflate algorithm with \n             bigger dictionary (64KB).</TD> </TR>\n    </TABLE>\n    <P>Estimated 7-Zip performance and memory requirements for AMD Athlon 64 X2 3800+:</P>\n    <TABLE>\n      <TR> \n        <TH class=\"cc\">Method</TH> \n        <TH class=\"cc\">Level</TH> \n        <TH class=\"cc\">Dictionary Size</TH> \n        <TH class=\"cc\">Compressing Speed</TH> \n        <TH class=\"cc\">Decompressing Speed</TH> \n        <TH class=\"cc\">Memory for Compressing</TH> \n        <TH class=\"cc\">Memory for Decompressing</TH> \n      </TR>\n      <TR>\n         <TD class=\"cc\" rowspan=\"5\">LZMA</TD>\n         <TD class=\"cc\">fastest</TD>\n         <TD class=\"cc\">64 KB</TD>\n         <TD class=\"cc\">4.5 MB/s</TD>\n         <TD class=\"cc\" rowspan=\"5\">15 MB/s</TD>\n         <TD class=\"cc\">3 MB</TD>\n         <TD class=\"cc\">3 MB</TD></TR>\n      <TR>\n         <TD class=\"cc\">fast</TD>\n         <TD class=\"cc\">1 MB</TD>\n         <TD class=\"cc\">3 MB/s</TD>\n         <TD class=\"cc\">10 MB</TD>\n         <TD class=\"cc\">3 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">normal</TD>\n        <TD class=\"cc\">16 MB</TD>\n        <TD class=\"cc\">2 MB/s</TD>\n        <TD class=\"cc\">186 MB</TD>\n        <TD class=\"cc\">18 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">maximum</TD>\n        <TD class=\"cc\">32 MB</TD>\n        <TD class=\"cc\">1.8 MB/s</TD>\n        <TD class=\"cc\">376 MB</TD>\n        <TD class=\"cc\">34 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">ultra</TD>\n        <TD class=\"cc\">64 MB</TD>\n        <TD class=\"cc\">1.6 MB/s</TD>\n        <TD class=\"cc\">709 MB</TD>\n        <TD class=\"cc\">66 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\" rowspan=\"4\">PPMD</TD>\n        <TD class=\"cc\">fast</TD>\n        <TD class=\"cc\">4 MB</TD>\n        <TD class=\"cc\" colspan=\"2\">1.4 MB/s</TD>\n        <TD class=\"cc\" colspan=\"2\">6 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">normal</TD>\n        <TD class=\"cc\">24MB</TD>\n        <TD class=\"cc\" colspan=\"2\">1.2 MB/s</TD>\n        <TD class=\"cc\" colspan=\"2\">26 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">maximum</TD>\n        <TD class=\"cc\">64 MB</TD>\n        <TD class=\"cc\" colspan=\"2\">1.0 MB/s</TD>\n        <TD class=\"cc\" colspan=\"2\">66 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">ultra</TD>\n        <TD class=\"cc\">192 MB</TD>\n        <TD class=\"cc\" colspan=\"2\">0.9 MB/s</TD>\n        <TD class=\"cc\" colspan=\"2\">194 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\" rowspan=\"4\">Deflate</TD>\n        <TD class=\"cc\">fast</TD>\n        <TD class=\"cc\" rowspan=\"4\">32 KB</TD>\n        <TD class=\"cc\">15 MB/s</TD>\n        <TD class=\"cc\" rowspan=\"4\">40 MB/s</TD>\n        <TD class=\"cc\" rowspan=\"2\">3 MB</TD>\n        <TD class=\"cc\" rowspan=\"4\">2 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">normal</TD>\n        <TD class=\"cc\">3.5 MB/s</TD></TR>\n      <TR>\n        <TD class=\"cc\">maximum</TD>\n        <TD class=\"cc\">1.5 MB/s</TD>\n        <TD class=\"cc\" rowspan=\"2\">4MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">ultra</TD>\n        <TD class=\"cc\">0.4 MB/s</TD>\n      <TR>\n        <TD class=\"cc\" rowspan=\"3\">BZip2</TD>\n        <TD class=\"cc\">normal</TD>\n        <TD class=\"cc\" rowspan=\"3\">900 KB</TD>\n        <TD class=\"cc\">3 MB/s</TD>\n        <TD class=\"cc\" rowspan=\"3\">16 MB/s</TD>\n        <TD class=\"cc\" rowspan=\"3\">20 MB</TD>\n        <TD class=\"cc\" rowspan=\"3\">7 MB</TD></TR>\n      <TR>\n        <TD class=\"cc\">maximum</TD>\n        <TD class=\"cc\">1.2 MB/s</TD>\n      <TR>\n        <TD class=\"cc\">ultra</TD>\n        <TD class=\"cc\">0.4 MB/s</TD>\n    </TABLE>\n  </DD>\n\n  <DT>Dictionary size</DT>\n  <DD>\n    <P>Specifies Dictionary size for compression method.</P>\n    <P>Usually, a higher Dictionary size gives a higher compression ratio.\n    But compressing can be slower and it can require more memory.</P>\n    <P>\n    Memory (RAM) usage for LZMA compressing is about 11 times more than dictionary size.\n    Memory usage for LZMA decompressing is close to  value of dictionary size. \n    Memory usage for PPMd compressing and decompressing is almost equal \n    to dictionary size.</P>\n  </DD>\n\n  <DT>Word size</DT>\n  <DD>\n    <P>Specifies the length of words, which will be used to find identical \n       sequences of bytes for compression.</P>\n    <P>Usually for LZMA and Deflate, big Word size gives a little bit better\n       compression ratio and slower compression process.\n       A big Word size parameter can significantly increase compression ratio \n       for files which contain long identical sequences of bytes. For PPMd,\n       the Word size strongly affects both compression ratio and \n       compression/decompression speed.</P>\n  </DD>\n\n  \n  <DT>Solid Block size</DT>\n  <DD>\n    <P>Specifies the size of a solid block. You can also disable solid mode.\n          In solid mode all files will be compressed as continuous data blocks. \n          Usually compressing to a solid archive improves the compression ratio.\n          You can use this option only for 7z archives. With the current version of 7z, you\n          can update existing archives only when \n          solid mode is switched off and the existing archive is non-solid.</P>\n  </DD>\n\n  <DT>Number of CPU threads</DT>\n  <DD>\n    <P>Specifies the number of threads for compressing. \n       A big number of threads can speed up compression speed on Multi-Processor systems.\n       Sometimes it can increase speed even on single-core CPU.</P>\n  </DD>\n\n  <DT>Split to volumes</DT>\n  <DD>\n    <PRE class=\"syntax\">\n    {Size}[b | k | m | g]\n    </PRE>\n\n    <P>Specifies volume sizes in Bytes, Kilobytes (1 Kilobyte = 1024 bytes),\n    Megabytes (1 Megabyte = 1024 Kilobytes) or Gigabytes (1 Gigabyte = 1024 Megabytes).\n    If you specify only {Size}, 7-zip will treat it as bytes. It's possible to specify\n    several values. Example:</P>\n\n    <PRE class=\"example\">\n    10k 15k 2m\n    </PRE>\n\n    <P>The first volume will be 10 KB, the second will be 15 KB, and all others will be 2 MB.</P>\n   \n  </DD>\n\n  <DT>Parameters</DT>\n  <DD>\n    <P>Allows you to specify parameters for compression. See the\n    <A href=\"../../../../cmdline/switches/method.htm\">-m (Method)</A> switch description for \n    more details. Omit the -m prefix (as in -m switch) when using this dialog box.<P>\n    <P><B>Examples</B></P>\n    <PRE class=\"example\">\n      0=PPMd</PRE>\n      <P>uses PPMd method for compressing files.</P>\n\n    <PRE class=\"example\">\n      0=bcj2 1=lzma:d23 2=lzma 3=lzma b0:1 b0s1:2 b0s2:3</PRE>\n      <P>uses BCJ2 filter (for x86 executables) and LZMA.</P>\n\n  </DD>\n\n  <DT>Update mode</DT>\n  <DD>\n    <P>Specifies update mode:</P>\n    <TABLE>\n      <TR> <TH width=\"30%\">Value</TH> <TH>Meaning</TH> </TR>\n      <TR> <TD>Add and replace files</TD> <TD>Add all specified files to the archive.</TD> </TR>\n      <TR> <TD>Update and add files</TD> <TD>Update older files in the archive and add\n                files that are new to the archive.</TD> </TR>\n      <TR> <TD>Freshen existing files</TD> <TD>Update specified files in the\n               archive that are older than the selected disk files.</TD> </TR>\n      <TR> <TD>Synchronize files</TD> <TD>Replace specified files only if\n         added files are newer. Always add those files, which are not\n         present in the archive. Delete from archive those files,\n         which are not present on the disk.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT>Options</DT>\n  <DD>\n    <P>Specifies compression options:</P>\n    <TABLE>\n      <TR> <TH width=\"30%\">Option</TH> <TH>Meaning</TH> </TR>\n      <TR> <TD>Create SFX archive</TD> <TD>Create self-extracting archive. You can use this option only \n        for 7z archives. Look to \n    <A href=\"../../../../cmdline/switches/sfx.htm\">-sfx (Create SFX archive)</A> switch description for \n    more details about SFX modules.</TD> </TR>\n      <TR> <TD>Compress shared files</TD> <TD>Compress files open for writing by another applications.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT>Encryption</DT>\n  <DD>\n    <P>Specifies password and encryption options.</P>\n    <DL>\n      <DT>Enter password</DT>\n        <DD>Specify passord here</DD>\n      <DT>Reenter password</DT>\n        <DD>Reenter passord here for verification</DD>\n      <DT>Show Password</DT>\n        <DD>Shows Password</DD>\n      <DT>Encryption method</DT>\n        <DD>Specifies the encryption method. For 7z format, it can be only AES-256.\n          For ZIP format you can select ZipCrypto or AES-256. \n          Use ZipCrypto, if you want to get archive compatible with most of the ZIP archivers. \n          AES-256 provides stronger encryption, but now AES-256 is supported only \n          by 7-Zip, WinZip and some other ZIP archivers.\n      <DT>Encrypt file names</DT>\n        <DD>Enables or disables archive header encryption, including file name encryption.</DD>\n    </DL>\n  </DD>\n\n\n</DL>\n<UL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/plugins/7-zip/extract.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Extract Dialog Box</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Extract Dialog Box</H1>\n\n<P>Allows you to specify options for extracting files from archive.</P>\n\n<H4>How to run this dialog box</H4>\n<P>There are two ways to run this dialog</P>\n<UL>\n  <LI>To extract all files from an archive:\n    <OL>\n      <LI>In Windows Explorer or in 7-Zip, right-click the archive file.</LI>\n      <LI>Point to <B>7-Zip</B>, and then click <B>Extract files...</B>.</LI>\n    </OL>\n  </LI>\n\n  <LI>To extract specified files from an archive opened in the browsing window:\n    <OL>\n      <LI>Open archive with 7-Zip.</LI>\n      <LI>Select items to extract.</LI>\n      <LI>Right-click items and then click <B>Copy To...</B>.</LI>\n    </OL>\n  </LI>\n</UL>\n\n\n<H4>Parameters</H4>\n<DL>\n  <DT>Extract to</DT>\n  <DD>Provides a space for you to specify an output folder.\n     You can click &quot;<B>...</B>&quot; button to display &quot;Browse for folder&quot;\n     dialog box that you can use to locate output folder.</DD>\n\n  <DT>Path mode</DT>\n  <DD>\n    <P>Specify extract mode:</P>\n    <TABLE>\n      <TR> <TH>Value</TH> <TH>Meaning</TH> </TR>\n      <TR> <TD>Full pathnames</TD> <TD>Extract files with full pathnames.</TD> </TR>\n      <TR> <TD>Current pathnames</TD> <TD>Extract files with all relative paths.</TD> </TR>\n      <TR> <TD>No pathnmes</TD> <TD>Extract files without folder paths.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT>Overwrite mode</DT>\n  <DD>\n    <P>Specify overwrite mode for files that already present on disk:</P>\n    <TABLE>\n      <TR> <TH>Value</TH> <TH>Meaning</TH> </TR>\n      <TR> <TD>Ask before overwrite</TD> <TD>Ask before overwriting existing files.</TD> </TR>\n      <TR> <TD>Overwrite without prompt</TD> <TD>Overwrite existing files without prompt.</TD> </TR>\n      <TR> <TD>Skip existing files</TD> <TD>Skip extracting of existing files.</TD> </TR>\n      <TR> <TD>Auto rename</TD> <TD>Rename extracted files, if a file with the same name already exists.\n                        For example, file document.txt will be renamed to document_1.txt.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT>Files</DT>\n  <DD>\n    <P>Specifies files for extracting:</P>\n    <TABLE>\n      <TR> <TH>Value</TH> <TH>Meaning</TH> </TR>\n      <TR> <TD>Selected files</TD> <TD>Extract only files that are selected in the main window.</TD> </TR>\n      <TR> <TD>All files</TD> <TD>Extract all files.</TD> </TR>\n    </TABLE>\n  </DD>\n\n  <DT>Password</DT>\n  <DD>\n    <P>Specifies a password for encrypted archives.</P>\n  </DD>\n</DL>\n<UL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/plugins/7-zip/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>7-Zip Plugin</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>7-Zip Plugin</H1>\n\n<P>7-Zip is a plugin for  manipulating archives. It makes all archive files \nlook like usual folders in File Manager.</P>\n\n<P>Most of the operations with compressed files can be initiated by\nright-clicking on files in the File Manager (or in Windows Explorer) and\nselecting the appropriate command from a menu.</P>\n\n<H4>Using 7-Zip</H4>\n\n<DL>\n  <DT><A name=\"open\"></A>Opening archive</DT>\n  <DD>\n    <P>There are two ways to open an archive file:</P>\n    <UL>\n      <LI>If you have the file type associated with 7-Zip, then you can open the\n         file with 7-Zip by double-clicking the file or by right-clicking and selecting\n         the <B>Open</B> command.</LI>\n      <LI>You can right-click the archive file, point to <B>7-Zip</B>,\n        and then click the <B>Open</B> command item.</LI>\n    </UL>\n  </DD>\n  <DT>Extracting archive</DT>\n  <DD>\n    <P>There are two ways to extract files from an archive:</P>\n    <UL>\n      <LI>To extract all files from an archive right-click the archive file,\n          point to <B>7-Zip</B>, and then click the <B>Extract files...</B>\n          command item.</LI>\n      <LI>To extract specific files from an archive, open it by\n          <A href=\"#open\">Open archive with 7-Zip</A>,\n          select the items to extract, and run the <B>Copy To...</B> command.</LI>\n    </UL>\n    <P> <A href=\"extract.htm\">Extract Dialog</A> will appear.</P>\n  </DD>\n  <DT>Testing archive</DT>\n  <DD>\n     <P>To test an archive, right-click the archive file,\n          point to <B>7-Zip</B>, and then click the <B>Test archive</B>\n          command item.</P>\n  </DD>\n  <DT>Creating and updating files in an archive</DT>\n  <DD>\n    <P>For creating or updating an archive file, right-click the file(s) or folder(s) you want to compress,\n          point to <B>7-Zip</B>, and then click the <B>Add to archive...</B> command item.\n    <A href=\"add.htm\">Add to Archive Dialog</A> will appear.</P>\n  </DD>\n</DL>\n\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/plugins/7-zip/options.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>7-Zip Options Dialog Box</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>7-Zip Options Dialog Box</H1>\n\n\n<P>You can change many of the settings that affect the 7-Zip Plugin \nin the 7-Zip Options Dialog Box.\nTo access this dialog box, select Options from the Tools menu, then select the Plugins Page,\nselect 7-Zip plugin, and press Options.</P>\n\n<P>The options dialog box contains the following pages:</P>\n<UL>\n  <LI><A href = \"#system\">System  Page</A></LI>\n  <LI><A href = \"#folders\">Folders Page</A></LI>\n</UL>\n\n<H2><a name=\"system\"></a>System  Page</H2>\n<P>Allows you to specify behavior of 7-Zip in Windows Shell.</P>\n<DL>\n  <DT>Integrate 7-Zip to shell context menu</DT>\n    <DD>Select this check box to add 7-Zip commands to Shell Context Menu.</DD>\n  <DT>Cascaded context menu</DT>\n    <DD>Select this check box to group 7-Zip context menu items to one <B>7-Zip</B> submenu.</DD>\n  <DT>Context menu items</DT>\n    <DD>Lists the optional context menu items. If an item is checked,\n        7-Zip will add this item to the context menu.</DD>\n</DL>\n\n<H2><a name=\"folders\"></a>Folders Page</H2>\n<P>Allows you to set the folders which 7-Zip will use for internal purposes.</P>\n\n<H3>Working folder</H3>\n\n<P>The working folder section allows you to specify a folder which will be used\nfor temporary archive files:</P>\n\n<DL>\n  <DT>System temp folder</DT>\n    <DD>7-Zip will use the Windows temp folder.</DD>\n  <DT>Current</DT>\n    <DD>7-Zip will use the folder containing the target archive.</DD>\n  <DT>Specified</DT>\n    <DD>7-Zip will use the folder specified in the following edit control.</DD>\n</DL>\n\n<DL>\n  <DT>Use for removable drives only</DT>\n    <DD> Specifies whether 7-Zip should use the specified folder settings\n         only for removable drives;  for other drives, 7-Zip will create\n         temporary archives in the folder containing the target archive.\n         If you clear this check box, 7-Zip always will use the specified folder\n         settings mode always.\n    </DD>\n</DL>\n\n<P>7-Zip uses temporary archive files for all update operations. \nSo, for speed reasons, it is recommended that you select the\n<B>System temp folder</B> option and select \n<B>Use for removable drives only</B> check box.\n</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/plugins/7-zip/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/plugins/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Plugins</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Plugins</H1>\n\n<P>The 7-Zip File Manager can use internal and external plugins.</P>\n\n<P>Currently 7-Zip uses the following plugins:</P>\n<DL>\n  <DT><A href = \"7-zip/index.htm\">7-Zip</A></DT>\n    <DD>Plugin for manipulating archives.</DD>\n</DL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/plugins/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/fm/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/7z.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>7z Format</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>7z Format</H1>\n\n<P><B>7z</B> is a new archive format, providing a high compression ratio.</P>\n\n<P>The main features of the <B>7z</B> format:</P>\n<UL>\n  <LI>Open architecture\n  <LI>High compression ratio\n  <LI>Strong AES-256 encryption\n  <LI>Ability to use any compression, conversion or encryption method\n  <LI>Supports files with sizes up to 16000000000 GB\n  <LI>Unicode file names\n  <LI>Solid compression\n  <LI>Archive headers compression\n</UL>\n\n<P><B>7z</B> has an open architecture, so it can support any new compression methods.</P>\nThe following methods currently are integrated into <B>7z</B>:<P>\n\n<TABLE cellspacing =\"2\" cellpadding =\"4\">\n  <TR> <TH class=\"Title\" width=\"60\">Method</TH> <TH class=\"Title\">Description</TH> </TR>\n  <TR> <TD class=\"Item\">LZMA</TD> <TD class=\"Item\">Improved and optimized version of LZ77 algorithm</TD></TR>\n  <TR> <TD class=\"Item\">PPMD</TD> <TD class=\"Item\">Dmitry Shkarin's PPMdH with small changes</TD></TR>\n  <TR> <TD class=\"Item\">BCJ</TD> <TD class=\"Item\">Converter for 32-bit x86 executables</TD></TR>\n  <TR> <TD class=\"Item\">BCJ2</TD> <TD class=\"Item\">Converter for 32-bit x86 executables</TD></TR>\n  <TR> <TD class=\"Item\">BZip2</TD> <TD class=\"Item\">Standard BWT algorithm</TD></TR>\n  <TR> <TD class=\"Item\">Deflate</TD> <TD class=\"Item\">Standard LZ77-based algorithm</TD></TR>\n</TABLE>\n\n<P><B>LZMA</B> is the default and general compression method of <B>7z</B> format. \nThe main features of the <B>LZMA</B> method:</P>\n<UL>\n  <LI>High compression ratio\n  <LI>Variable dictionary size (up to 4 GB)\n  <LI>Compression speed: about 1 MB/s on 2 GHz CPU\n  <LI>Decompression speed: about 10-20 MB/s on 2 GHz CPU\n  <LI>Small memory requirement for decompression (depends from dictionary size)\n  <LI>Small code size for decompression: about 5 KB\n  <LI>Supports multi-threading and P4's hyper-threading\n</UL>\n\n<P>The <B>LZMA</B> compression algorithm is very suitable for embedded applications.\nIf you want to use <B>LZMA</B> code, you can ask for consultation, custom code programming,\nand required developer licenses at \n<P><A href=\"http://www.7-zip.org/support.html\" target=\"_blank\">www.7-zip.org/support.html</A></P>\n</P>\n\n<P>7-Zip also supports encryption with the AES-256 algorithm. \nThis algorithm uses a cipher key with length of 256 bits. To create the key, 7-Zip \nuses a derivation function based on an SHA-256 hash algorithm.\nA key derivation function produces a derived key from a text password defined by the user.\nTo increase the cost of an exhaustive search for passwords, 7-Zip uses a big number \nof iterations to produce the cipher key from the text password.</P>\n\n<H2>Tips for selecting password length</H2>\n\n<P>Here is an estimate of the time required for an exhaustive\npassword search attack, when the password is a random\nsequence of lowercase Latin letters.</P>\n\n<P>We suppose that one user can check 10 passwords per second and an\norganization with a budget of about $1 billion can check 10 billion\npasswords per second. We also \nsuppose that the processor in use doubles its performance every two years;\nso, each additional Latin letter of a long password adds about\n9 years to an exhaustive key search attack.</P>\n\n<P>The result is this estimate of the time to succeed in an attack:</P>\n\n<TABLE>\n  <TR align=center>\n    <TH>Password Length</TH>\n    <TH>Single User Attack</TH>\n    <TH>Organization Attack</TH>\n  </TR>\n  <TR align=center>\n    <TD>1</TD>\n    <TD>2 s</TD>\n    <TD>1 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>2</TD>\n    <TD>1 min</TD>\n    <TD>1 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>3</TD>\n    <TD>30 min</TD>\n    <TD>1 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>4</TD>\n    <TD>12 hours</TD>\n    <TD>1 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>5</TD>\n    <TD>14 days</TD>\n    <TD>1 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>6</TD>\n    <TD>1 year</TD>\n    <TD>1 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>7</TD>\n    <TD>10 years</TD>\n    <TD>1 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>8</TD>\n    <TD>19 years</TD>\n    <TD>20 s</TD>\n  </TR>\n  <TR align=center>\n    <TD>9</TD>\n    <TD>26 years</TD>\n    <TD>9 min</TD>\n  </TR>\n  <TR align=center>\n    <TD>10</TD>\n    <TD>37 years</TD>\n    <TD>4 hours</TD>\n  </TR>\n  <TR align=center>\n    <TD>11</TD>\n    <TD>46 years</TD>\n    <TD>4 days</TD>\n  </TR>\n  <TR align=center>\n    <TD>12</TD>\n    <TD>55 years</TD>\n    <TD>4 months</TD>\n  </TR>\n  <TR align=center>\n    <TD>13</TD>\n    <TD>64 years</TD>\n    <TD>4 years</TD>\n  </TR>\n  <TR align=center>\n    <TD>14</TD>\n    <TD>73 years</TD>\n    <TD>13 years</TD>\n  </TR>\n  <TR align=center>\n    <TD>15</TD>\n    <TD>82 years</TD>\n    <TD>22 years</TD>\n  </TR>\n  <TR align=center>\n    <TD>16</TD>\n    <TD>91 years</TD>\n    <TD>31 years</TD>\n  </TR>\n  <TR align=center>\n    <TD>17</TD>\n    <TD>100 years</TD>\n    <TD>40 years</TD>\n  </TR>\n</TABLE>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/faq.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Frequently Asked Questions (FAQ)</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Frequently Asked Questions (FAQ)</H1>\n\n<H4>Can I use 7-Zip in a commercial organization?</H4>\n\n<P>Yes, 7-Zip is free software. You can use it on any computer. You don't need to \nregister or pay for 7-Zip.</P>\n\n<H4>Why doesn't the command line version add files that do not have any extension?</H4>\n\n<P>You probably used a *.* wildcard.\n7-Zip doesn't use the Windows system wildcard parser; so, 7-Zip doesn't follow\nthe archaic rule by which *.* matches every file name.\n7-Zip treats *.* as matching only a file name with an extension. \nTo process all files, you must use a * wildcard or just omit the wildcard entirely.</P>\n\n\n<H4>Why doesn't adding, deleting or updating an existing archive work?</H4>\n\n<P>The current version of 7-Zip cannot change an archive created with the solid option\nswitched on. To update a .7z archive you must create and update the archive in non-solid\nmode (-ms=off switch)</P>\n\n<H4>What about support for ACE archives?</H4>\n\n<P>Support for ACE can be implemented, if the source code\nof that format is made available, and if the source code license\nwill allow using that code.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/formats.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Supported formats</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Supported formats</H1>\n\n<TABLE>\n  <TR>\n    <TH>Format</TH>\n    <TH>Compressing</TH>\n    <TH>Decompressing</TH>\n    <TH>Filename Extensions</TH>\n  </TR>\n  <TR>\n    <TD align=\"center\">7z</TD>\n    <TD align=\"center\">X</TD>\n    <TD align=\"center\">X</TD>\n    <TD>7z</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\"><A href=\"#zip\">ZIP</A></TD>\n    <TD align=\"center\">X</TD>\n    <TD align=\"center\">X</TD>\n    <TD>zip</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">GZIP</TD>\n    <TD align=\"center\">X</TD>\n    <TD align=\"center\">X</TD>\n    <TD>gz gzip tgz</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">BZIP2</TD>\n    <TD align=\"center\">X</TD>\n    <TD align=\"center\">X</TD>\n    <TD>bz2 bzip2 tbz2 tbz</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">TAR</TD>\n    <TD align=\"center\">X</TD>\n    <TD align=\"center\">X</TD>\n    <TD>tar</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">LZMA</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>lzma</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">RAR</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>rar</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">CAB</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>cab</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">ARJ</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>arj</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">Z</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>z taz</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">CPIO</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>cpio</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">RPM</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>rpm</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">DEB</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>deb</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\"><A href=\"#lzh\">LZH</A></TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>lzh lha</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">SPLIT</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>001 002 ...</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">CHM</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>chm chw hxs</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">ISO</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>iso</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">UDF</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>iso</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">COMPOUND</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>msi doc xls ppt</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">WIM</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>wim swm</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">DMG</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>dmg</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">XAR</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>xar</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">HFS</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>hfs</TD>\n  </TR>\n  <TR>\n    <TD align=\"center\">NSIS</TD>\n    <TD align=\"center\"></TD>\n    <TD align=\"center\">X</TD>\n    <TD>exe</TD>\n  </TR>\n</TABLE>\n\n<H2><a name=\"zip\"></a>ZIP</H2>\n\n<P>7-Zip creates fully ZIP compatible archives. Anyone can\ndecompress these files by any ZIP compatible decompression\nutility. During compression 7-Zip can use one of the following ZIP\ncompression methods:</P>\n<UL>\n  <LI>0 - Store</LI>\n  <LI>8 - Deflate</LI>\n  <LI>9 - Deflate64</LI>\n  <LI>12 - BZip2</LI>\n</UL>\n\n<P>The current version of the 7-Zip can extract any files from ZIP archive that\nwere compressed with one of the following methods:</P>\n<UL>\n  <LI>0 - Store</LI>\n  <LI>1 - Shrink</LI>\n  <LI>6 - Implode</LI>\n  <LI>8 - Deflate</LI>\n  <LI>9 - Deflate64</LI>\n  <LI>12 - BZip2</LI>\n</UL>\n\n<P>Files compressed with other ZIP compression methods\ncan't be extracted by the current version of the 7-Zip.\nBut these supported methods are the most popular today,\nand therefore 7-Zip can decompress most ZIP archives.\nTo extract files compressed with non-supported methods you must use some\nother ZIP utility.</P>\n\n<P>7-Zip supports the Zip64 extension of ZIP format.</P>\n\n<P>The current version of 7-Zip doesn't support Zip multivolume archives.</P>\n\n<H2><a name=\"lzh\"></a>LZH</H2>\n\n<P>7-Zip supports LZH archives only for listing, browsing and decompressing.\n7-Zip supports -lh0-, -lh4-, -lh5-, -lh6- and -lh7- methods.</P>\n\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/index.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>General Information</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>General Information</H1>\n\n<h4>The main features of 7-Zip</h4>\n\n<UL>\n  <LI><A href = \"../fm/index.htm\">Powerful file manager</A></LI>\n  <LI><A href = \"performance.htm\">High compression ratio and high speed</A></LI>\n  <LI><A href = \"formats.htm\">Big number of supported archive formats</A></LI>\n  <LI><A href = \"../cmdline/index.htm\">Additional command line version</A></LI>\n</UL>\n\n<H4>See Also</H4>\n<UL>\n  <LI><A href = \"register.htm\">How to register 7-Zip</A></LI>\n  <LI><A href = \"license.htm\">License for use and distribution</A></LI>\n</UL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/license.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>License for use and distribution</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>License</H1>\n\n<P>7-Zip Copyright (C) 1999-2007 Igor Pavlov.</P>\n\n<P>Licenses for files are:</P>\n<IL>\n  <LI>7z.dll: GNU LGPL + unRAR restriction\n  <LI>All other files: GNU LGPL\n</IL>\n\n<P>The GNU LGPL + unRAR restriction means that you must follow both \n  GNU LGPL rules and unRAR restriction rules.</P>\n\n<P>Note: You can use 7-Zip on any computer, including a computer in a commercial \n    organization. You don't need to register or pay for 7-Zip.</P>\n\n<P>Read file License.txt for full information about license.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/performance.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Performance</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Performance</H1>\n\n<H4>ZIP Format</H4>\n<P>Compression ratio results are very dependent upon the data used for\nthe tests. We compared 7-Zip with some of the leading \ncommercial archivers: PKZIP 2.04g, WinZip 7.0.</P>\n\n<P>FILE SET: The Canterbury Corpus (11 files totaling 2,810,784 bytes,\npopular file set used to compression rates).</P>\n\n<TABLE>\n  <TR>\n    <TH>Archiver</TH>\n    <TH>Compressed size</TH>\n    <TH>Ratio</TH>\n  </TR>\n  <TR>\n    <TD><B>7-Zip (zip format)</B></TD>\n    <TD><B>676284</B></TD>\n    <TD><B>100%</B></TD>\n  </TR>\n  <TR>\n    <TD>PKZIP 2.04g -ex</TD>\n    <TD>726047</TD>\n    <TD>107%</TD>\n  </TR>\n  <TR>\n    <TD>WinZip 7.0 (Max)</TD>\n    <TD>731499</TD>\n    <TD>108%</TD>\n  </TR>\n</TABLE>\n\n\n<H4>7z Format</H4>\n\n<P>7z is the new archive format, providing a high compression ratio.</P>\n\n<P>FILE SET: The GIMP 1.2.4 for Windows after full installation \n(127 subfolders, 1304 files totaling 27,128,826 bytes).  \nThe GIMP is the GNU Image Manipulation Program. It can be downloaded from \nwww.gimp.org.</P>\n\n<TABLE>\n  <TR>\n    <TH>Archiver</TH>\n    <TH>Compressed size</TH>\n    <TH>Ratio</TH>\n  </TR>\n  <TR>\n    <TD><B>7-Zip (7z format)</B></TD>\n    <TD><B>5445402</B></TD>\n    <TD><B>100%</B></TD>\n  </TR>\n  <TR>\n    <TD>WinRAR 3.10</TD>\n    <TD>6004155</TD>\n    <TD>110%</TD>\n  </TR>\n  <TR>\n    <TD>WinAce 2.3</TD>\n    <TD>6242424</TD>\n    <TD>115%</TD>\n  </TR>\n  <TR>\n    <TD>CABARC 1.0</TD>\n    <TD>6455327</TD>\n    <TD>119%</TD>\n  </TR>\n  <TR>\n    <TD><B>7-Zip (zip format)</B></TD>\n    <TD><B>9461621</B></TD>\n    <TD><B>174%</B></TD>\n  </TR>\n  <TR>\n    <TD>PKZIP 2.50</TD>\n    <TD>9842800</TD>\n    <TD>181%</TD>\n  </TR>\n</TABLE>\n\n<H4>GZIP Format</H4>\n\n<P>7-Zip provides the best compression ratio for GZIP format. The compression ratio\nis equal to its compression ratio for ZIP format (above).</P>\n\n<H4>RAR Format</H4>\n\n<P>7-Zip provides superior decompression speed for RAR archives.\nFor solid archives it decompresses only the minimum number of files\nneeded. For example,\nconsider a solid archive <B>archive.rar</B> containing 100000 files\ncreated by the command:<BR>\n<B>rar a archive.rar -s100 * -r</B><BR>\nIn this solid archive, each group of 100 files is compressed as one big file.\nTo extract one file from that archive,\n7-Zip will decompress (in memory) only some files from one group.\nAs a result, 7-Zip can provide the combined advantages\nof solid compression and high speed of decompression.</P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/register.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Register 7-Zip</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Register 7-Zip</H1>\n\n<P>7-Zip is free software. However, you can support development of 7-Zip by registering.</P>\n\n<P>You can find all information about registering at:</P>\n\n<P><A href = \"http://www.7-zip.org/register.html\" target=\"_blank\">\n  http://www.7-zip.org/register.html</A></P>\n\n<P>Thank you very much in advance!</P>\n\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/general/thanks.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>Thanks</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>Thanks</H1>\n\n<P>I would like to thank:</P>\n<UL>\n  <LI>myspace from sf.net - for porting to Unix/Linux, testing, bug fixing and more\n  <LI>ARJ Software - for ARJ format.\n  <LI>Wei Dai - for SHA-256 code and Crypto++ Library\n  <LI>Jeff Gilchrist - for compressing tests\n  <LI>Brian Gladman - for AES code in previous versions of 7-Zip\n  <LI>Szymon Grabowski  - for some ideas\n  <LI>Microsoft Corporation - for CAB/WIM formats descriptions, and WiX (Windows Installer XML)\n  <LI>Nullsoft, Inc. and NSIS team - for NSIS (Nullsoft Scriptable Install System)\n  <LI>Robert Martinez - 7-Zip Logo\n  <LI>Markus Oberhumer and Laszlo Molnar - for UPX program\n  <LI>Alexander Ratushnyak - for compressing tests\n  <LI>Eugene Roshal - for RAR format\n  <LI>Matthew Russotto - for CHM/CAB format description\n  <LI>Julian Seward - for BZip2 format\n  <LI>Eugene Shelwien - for some ideas and algorithms\n  <LI>Dmitry Shkarin - for PPMd algorithm\n  <LI>Yoshioka Tsuneo - for TAR32 program\n  <LI>Vadim Yoockin - for compressing tests\n  <LI>Bulat Ziganshin - for some ideas\n  <LI>John Michael Williams - for help file corrections\n  <LI>Apple Inc. - for HFS format description\n  <LI>vu1tur(DMG2IMG) - for hints to .DMG format\n  <LI>Yutaka Sawada - for hints to ZIP Strong Encryption format.\n</UL>\n\n<P>Localization team:</P>\n<UL>\n  <LI>Afrikaans - Petri Jooste\n  <LI>Albanian - MIkel Hasko\n  <LI>Arabic - Mohammad Deeb, Awadh A Al-Ghaamdi, Ahmad Gharbeia\n  <LI>Armenian - Gevorg Papikyan\n  <LI>Asturian - Dinamiteru\n  <LI>Azeri - F@rhad\n  <LI>Basque - Inigo Salvador Azurmendi\n  <LI>Belarusian - Kirill Gulyakevitch, Drive DRKA\n  <LI>Breton - KAD-Korvigellou An Drouizig\n  <LI>Bulgarian - Chavv, icobgr\n  <LI>Catalan - Josep Casals, Gaizka Boleko, Marc Folch\n  <LI>Chinese Simplified - Modern Tiger, kaZek, Hutu Li, Junior.Spirit\n  <LI>Chinese Traditional - Leon Tseng, sec2\n  <LI>Croatian - Alan Simek, Hasan Osmanagic, Stjepan Treger\n  <LI>Czech - Jaromir Veber, Milan Hruby, Michal Molhanec, Jiri Malak\n  <LI>Danish - Jakob Schmidt, Kian Andersen, Jorgen Rasmussen\n  <LI>Dutch - Bert van Velsen, Jeroen van der Weijde, Harm Hilvers, Jeroen Tulp\n  <LI>Esperanto - Dmitri Gabinski\n  <LI>Estonian - Kaupo Suviste\n  <LI>Extremaduran - Miguel Angel\n  <LI>Farsi - Edris Naderan, Mehdi Farhadi\n  <LI>Finnish - Ari Ryynanen, Jarko P., Juhani Valtasalmi, T.Sakkara\n  <LI>French - Nicolas Sierro, Philippe Berthault\n  <LI>Friulian - Andrea Decorte\n  <LI>Frisian - Berend Ytsma\n  <LI>Galician - Xose Calvo\n  <LI>Georgian - Dimitri Gogelia\n  <LI>German - Soeren Finster, JAK-Software, Joachim Henke\n  <LI>Greek - Vasileios Karakoidas, Jacaranda Bill, Vasilis Kosmidis\n  <LI>Hebrew - Gal Brill, Jonathan Lahav, Peter G\n  <LI>Hungarian - Jozsef Tamas Herczeg\n  <LI>Icelandic - bjossi\n  <LI>Ido - iZoom\n  <LI>Indonesian - M. Rofiq Setiawan, Frans Liando\n  <LI>Italian - Leandro Spagnol, TJL73\n  <LI>Japanese - Komuro, Mick, 2chBBS-software, Stepanushkin Dmitry\n  <LI>Korean - bzImage, ZannyLim, Hyeongil Kim (kurt Sawyer), Dong-yoon Han\n  <LI>Kurdish - Rizyoye Xerzi\n  <LI>Kurdish Sorani - Ara Bakhtiar\n  <LI>Latvian - Armands Radzushka\n  <LI>Lithuanian - Marius Navickas\n  <LI>Macedonian - Gabriel Stojanoski\n  <LI>Malay - Khairul Ridhwan Omar\n  <LI>Marathi - Subodh Gaikwad\n  <LI>Mongolian - Bayar\n  <LI>Norwegian Bokmal - Christoffer Andersen, Kjetil Hjartnes, Robert Gronning\n  <LI>Norwegian Nynorsk - Robert Gronning\n  <LI>Pashto - Zabeeh khan\n  <LI>Polish - Cienislaw, Pixel, F1xat\n  <LI>Portuguese Brazil - Francisco Jr, Fabricio Biazzotto, Atualizado por Felipe\n  <LI>Portuguese Standard - Carlos Macao, Joao Alves, Rui Costa\n  <LI>Punjabi Indian - Gurmeet Singh Kochar\n  <LI>Romanian - Lucian Nan\n  <LI>Serbo-Croatian - Miodrag Jevremovicc\n  <LI>Slovak - Tomas Tomasek, Pavel Devecka\n  <LI>Slovenian - Jernej Simoncic, miles\n  <LI>Spanish - Pablo Rodriguez, Jbc25, Guillermo Gabrielli\n  <LI>Swedish - Andreas Nilsson, Christoffer Enqvist, Bernhard Eriksson\n  <LI>Sinhala - G.S.N. Supun Budhajeewa\n  <LI>Tamil - Ve Elanjelian\n  <LI>Tatarish - Albert Fazli\n  <LI>Thai - Chayanon Ruamcharoen\n  <LI>Turkish - \n  <LI>Ukrainian - Andrij Ilechko, Mokiy Mazaylo, Sergiy Gontaruk\n  <LI>Uzbek - Sherzod Mamatkulov\n  <LI>Valencian - Tomas Miralles, Fernando Verdu \n  <LI>Vietnamese - Tran Hong Ha, Le Vu Hoang\n  <LI>Voro - Valdis Laan\n  <LI>Welsh - Owain Lewis\n</UL>\n\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/start.htm",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<HTML>\n<HEAD>\n  <META http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">\n  <TITLE>7-Zip Start Page</TITLE>\n  <LINK href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n</HEAD>\n\n<BODY>\n\n<H1>7-Zip</H1>\n\n<P><B>Welcome to 7-Zip 4.65!</B></P> \n<P>7-Zip is a file archiver with a high compression ratio.</P>\n\n<H4>The documentation for 7-Zip includes:</H4>\n\n<UL>\n  <LI><A href = \"general/index.htm\">General information about 7-Zip</A></LI>\n  <LI><A href = \"fm/index.htm\">User's Guide for 7-Zip File Manager</A></LI>\n  <LI><A href = \"cmdline/index.htm\">User's Guide for command line version</A></LI>\n</UL>\n\n<H4>See Also</H4>\n\n<UL>\n  <LI><A href = \"general/register.htm\">How to register to 7-Zip</A></LI>\n  <LI><A href = \"general/faq.htm\">Frequently Asked Questions (FAQ)</A></LI>\n  <!-- <LI><A href = \"general/license.htm\">License for use and distribution</A></LI> -->\n</UL>\n\n<HR>\n\n<P>Copyright (c) 1999-2009 Igor Pavlov</P>\n<P><B>Web site:</B> <A href=\"http://www.7-zip.org\" target=\"_blank\">www.7-zip.org</A></P>\n<P><B>Support:</B> <A href=\"http://www.7-zip.org/support.html\" target=\"_blank\">www.7-zip.org/support.html</A></P>\n<P><B>Subscribe to news:</B> <A href=\"http://www.7-zip.org/subscribe.html\" target=\"_blank\">\n      http://www.7-zip.org/subscribe.html</A></P>\n<P><B>Forum, bugs tracking:</B> <A href=\"http://sourceforge.net/projects/sevenzip/\" target=\"_blank\">\n   http://sourceforge.net/projects/sevenzip/</A></P>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/help/style.css",
    "content": "body\n  {\n  padding: 0px 0px 0px 26px;\n  background: #ffffff; \n  color: #000000;\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  font-size: 80%;\n  }\n\ndiv\n  {\n  width: 90%;\n  border: 2px solid #999999;\n  padding: 4px 8px;\n  background: #cccccc;\n  }\n  \nh1, h2, h3, h4\n  {\n  font-family: Verdana, Arial, Helvetica, sans-serif;\n  margin-left: -26px;\n  }\n  \nh1\n  {\n  font-size: 145%;\n  margin-top: .5em;\n  margin-bottom: 1em; \n  }\n  \nh2\n  {\n  font-size: 130%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n  \nh3\n  {\n  font-size: 115%;\n  margin-top: 1.5em;\n  margin-bottom: .6em;\n  }\n  \nh4\n  {\n  font-size: 100%;\n  margin-top: 1.5em;\n  margin-bottom: .6em; \n  }\n\nul p, ol p, dl p\n  {\n  margin-left: 0em;\n  }\n\np\n  {\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\ndl\n  {\n  /*margin-top: 0em; */\n  }\n\ndt\n  {\n  margin-top: .76em;\n  margin-bottom: .5em;\n  font-weight: bold;\n  }\n\ndd\n  {\n  margin-top: .5em;\n  margin-bottom: .5em;  \n  margin-left: 1.9em; \n  }\n\n\nul, ol\n  {\n  margin-top: .6em;   \n  margin-bottom: 0em;\n  }\n  \nol\n  {\n  margin-left: 3.6em; \n  } \n  \nul\n  {\n  list-style-type: disc; \n  margin-left: 1.9em; \n  }\n\nli\n  {\n  margin-bottom: .6em;\n  }\n\nul ol, ol ol\n  {\n  list-style-type: lower-alpha;\n  {\n\n  /*\npre\n  {\n  margin-top: .6em;\n  margin-bottom: .6em; \n  }\n  */\n\npre,code\n  {\n  font: 100% Courier New, Courier, mono; \n  color: #000000;\n  cursor: text;\n  }\n\npre.syntax\n  {\n  background: #dddddd;\n  padding: 2pt,4pt\n  }\n\npre.syntax\n  {\n  color: #000000;\n  }\n\npre.example\n  {\n  margin-left: 2.0em;\n  /*margin-top: 12.0em;*/\n  /*margin-bottom: 1.0em;*/\n  color: #C00000;\n  /*padding: 10pt,20pt*/\n  }\n\ntable\n  {\n  /* width: 90%; */\n  background: #999999;\n  margin-top: .6em;\n  margin-bottom: .3em;\n  }\n    \nth\n  { \n  padding: 4px 8px;\n  background: #cccccc;\n  text-align: left;\n  font-size: 80%;\n  vertical-align: bottom;\n  }\n\nth.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\ntd\n  { \n  padding: 4px 8px;\n  background: #ffffff;\n  vertical-align: top;\n  font-size: 80%;\n  }\n\ntd.cc\n  { \n  text-align: center;\n  vertical-align: middle;\n  }\n\n\nblockquote\n  {\n  margin-left: 3.8em;\n  margin-right: 3.8em;\n  margin-top: .6em;\n  margin-bottom: .6em;\n  }\n\na:link\n  {\n  color: #0066ff;\n  }\n  \na:visited\n  {\n  color: #996600; \n  }\n  \na:hover\n  {\n  color: #cc9900;\n  }\n  \na.parameter:link\n  {\n  color: #0066ff;\n  text-decoration:none;\n  }\n\na.parameter:visited\n  {\n  text-decoration:none;\n  }\n\ndiv.footer\n  {\n  width: 100%;\n  border: none;\n  background: #ffffff;\n  margin-top: 18pt;\n  padding-bottom: 12pt;\n  color: #228B22;\n  text-align: center;\n  font-size: 70%;\n  }\n\nspan.filename\n{\n  color: #F00000;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/kde/p7zip_compress.desktop",
    "content": "[Desktop Entry]\nServiceTypes=inode/directory\nActions=CompressDialog;Compress7z;CompressZip;extractHere;ExtractSubdir;ExtractTo;test;Benchmark\nX-KDE-Priority=TopLevel\nX-KDE-Submenu=7-Zip\nX-KDE-Icon=p7zip\n\n[Desktop Action CompressDialog]\nName=Add to Archive ...\nIcon=p7zip\nExec=p7zipForFilemanager ad -t7z %U\n\n[Desktop Action Compress7z]\nName=Add to 7z Archive\nIcon=p7zip\nExec=p7zipForFilemanager a -t7z %U\n\n[Desktop Action CompressZip]\nName=Add to Zip Archive\nIcon=p7zip\nExec=p7zipForFilemanager a -tzip %U\n\n[Desktop Action extractHere]\nName=Extract Here\nExec=p7zipForFilemanager x %U\nIcon=p7zip\n\n[Desktop Action ExtractSubdir]\nName=Extract to subdirectory\nIcon=p7zip\nExec=p7zipForFilemanager xs %U\n\n[Desktop Action ExtractTo]\nName=Extract to ...\nIcon=p7zip\nExec=p7zipForFilemanager xd %U\n\n[Desktop Action test]\nName=Test Archive\nExec=p7zipForFilemanager t %U\nIcon=p7zip\n\n[Desktop Action Benchmark]\nName=Benchmark\nIcon=p7zip\nExec=p7zipForFilemanager b\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/kde/p7zip_compress2.desktop",
    "content": "[Desktop Entry]\nServiceTypes=all/allfiles\nActions=CompressDialog;Compress7z;CompressZip;extractHere;ExtractSubdir;ExtractTo;test;Benchmark\nX-KDE-Priority=TopLevel\nX-KDE-Submenu=7-Zip\nX-KDE-Icon=p7zip\n\n[Desktop Action CompressDialog]\nName=Add to Archive ...\nIcon=p7zip\nExec=p7zipForFilemanager ad -t7z %U\n\n[Desktop Action Compress7z]\nName=Add to 7z Archive\nIcon=p7zip\nExec=p7zipForFilemanager a -t7z %U\n\n[Desktop Action CompressZip]\nName=Add to Zip Archive\nIcon=p7zip\nExec=p7zipForFilemanager a -tzip %U\n\n[Desktop Action extractHere]\nName=Extract Here\nExec=p7zipForFilemanager x %U\nIcon=p7zip\n\n[Desktop Action ExtractSubdir]\nName=Extract to subdirectory\nIcon=p7zip\nExec=p7zipForFilemanager xs %U\n\n[Desktop Action ExtractTo]\nName=Extract to ...\nIcon=p7zip\nExec=p7zipForFilemanager xd %U\n\n[Desktop Action test]\nName=Test Archive\nExec=p7zipForFilemanager t %U\nIcon=p7zip\n\n[Desktop Action Benchmark]\nName=Benchmark\nIcon=p7zip\nExec=p7zipForFilemanager b\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/kde/p7zip_extract.desktop",
    "content": "[Desktop Entry]\nX-SuSE-translate=true\nEncoding=UTF-8\nServiceTypes=application/x-gzip,application/x-lha,application/x-tar,application/x-tgz,application/x-tbz,application/x-tbz2,application/x-zip,application/x-bzip,application/x-tzo,application/x-lzop,application/x-rar,application/x-rar-compressed,application/x-zoo,application/x-tarz,application/x-archive,application/x-bzip2,application/x-jar,application/x-deb,application/x-ace,application/x-7z,application/x-arc,application/x-arj,application/x-compress,application/x-cpio,application/x-pak\nActions=extractHere\n\n[Desktop Action extractHere]\nName=Extract Here with 7-zip\nExec=p7zipForFilemanager x %U\nIcon=p7zip\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/kde/p7zip_extract_subdir.desktop",
    "content": "[Desktop Entry]\nX-SuSE-translate=true\nEncoding=UTF-8\nServiceTypes=application/x-gzip,application/x-lha,application/x-tar,application/x-tgz,application/x-tbz,application/x-tbz2,application/x-zip,application/x-bzip,application/x-tzo,application/x-lzop,application/x-rar,application/x-rar-compressed,application/x-zoo,application/x-tarz,application/x-archive,application/x-bzip2,application/x-jar,application/x-deb,application/x-ace,application/x-7z,application/x-arc,application/x-arj,application/x-compress,application/x-cpio,application/x-pak\nActions=ExtractSubdir\n\n[Desktop Action ExtractSubdir]\nName=Extract to subdirectory with 7-Zip\nIcon=p7zip\nExec=p7zipForFilemanager xs %U\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/kde/p7zip_extract_to.desktop",
    "content": "[Desktop Entry]\nX-SuSE-translate=true\nEncoding=UTF-8\nServiceTypes=application/x-gzip,application/x-lha,application/x-tar,application/x-tgz,application/x-tbz,application/x-tbz2,application/x-zip,application/x-bzip,application/x-tzo,application/x-lzop,application/x-rar,application/x-rar-compressed,application/x-zoo,application/x-tarz,application/x-archive,application/x-bzip2,application/x-jar,application/x-deb,application/x-ace,application/x-7z,application/x-arc,application/x-arj,application/x-compress,application/x-cpio,application/x-pak\nActions=ExtractTo\n\n[Desktop Action ExtractTo]\nName=Extract to ... with 7-Zip\nIcon=p7zip\nExec=p7zipForFilemanager xd %U\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/kde/p7zip_test.desktop",
    "content": "[Desktop Entry]\nX-SuSE-translate=true\nEncoding=UTF-8\nServiceTypes=application/x-gzip,application/x-lha,application/x-tar,application/x-tgz,application/x-tbz,application/x-tbz2,application/x-zip,application/x-bzip,application/x-tzo,application/x-lzop,application/x-rar,application/x-rar-compressed,application/x-zoo,application/x-tarz,application/x-archive,application/x-bzip2,application/x-jar,application/x-deb,application/x-ace,application/x-7z,application/x-arc,application/x-arj,application/x-compress,application/x-cpio,application/x-pak\nActions=test\n\n[Desktop Action test]\nName=Test with 7-zip\nExec=p7zipForFilemanager t %U\nIcon=p7zip\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/p7zipForFilemanager",
    "content": "#! /bin/sh\n\n# program t archive1.7z ... archiveN.7z\n# program x directory_out archive1.7z ... archiveN.7z\n# program xd directory_out archive1.7z ... archiveN.7z\n# program a -t7z current_directory file1 ... fileN\n# program ad -tzip current_directory file1 ... fileN\n\nP7ZIP=\"7zG\"\n\nlist=/tmp/p7zip.list.$$\nrm -f ${list}\n\ntrace=/tmp/7zG1.txt\nrm -f ${trace}\n\nfor file in \"$@\"\ndo\n\techo \"arg=${file}\" >> ${trace}\ndone\n\ncmd=\"$1\"\nshift\n\nflag_ad=\"\"\nflag_type=\"\"\n\ncase \"${cmd}\" in\nb|t)\n\t;;\nx|xs)\n\t;;\nxd)\n\tflag_ad=\"-ad\"\n\t;;\na)\n\tflag_type=\"$1\"\n\tshift\n\t;;\nad)\n\tflag_type=\"$1\"\n\tshift\n\tflag_ad=\"-ad\"\n\t;;\n*)\n\techo \"Unknown command \\\"${cmd}\\\"\"\n\texit 1\n\t;;\nesac\n\n#ext=\".7z\"\n#if [ \"${flag_type}\" = \"-tzip\" ]\n#then\n#\text=\".zip\"\n#fi\n\nargn=\"$#\"\nfile1=\"$1\"\ndir1=`dirname \"${file1}\"`\nfile2=\"$2\"\necho \"argn=${argn}\" >> ${trace}\necho \"flag_type=${flag_type}\" >> ${trace}\necho \"file1=${file1}\" >> ${trace}\necho \"dir1=${dir1}\" >> ${trace}\necho \"file2=${file2}\" >> ${trace}\n\nif [ \"a${dir1}\" != \"a\" ]\nthen\n\tcd \"${dir1}\"\nfi\n\nfor file in \"$@\"\ndo\n\tfile=`basename \"${file}\"`\n\techo ${file} >> ${list}\n\techo \"list=${file}\" >> ${trace}\ndone\n\ncase \"${cmd}\" in\nb)\n\t${P7ZIP} b\n\t;;\nt)\n\t${P7ZIP} t -an -ai@${list}\n\t;;\nx|xd)\n\t${P7ZIP} x ${flag_ad} -an -ai@${list}\n\t;;\nxs)\n\tdir_out=`dirname \"${file1}\"`\n\t${P7ZIP} x ${flag_ad} -o\"*\" -an -ai@${list}\n\t;;\na|ad)\n\tif [ ${argn} -eq \"1\" ]\n\tthen\n\t\tfile=`basename \"${file1}\"`${ext}\n\t\techo \"archive_out=${file}\" >> ${trace}\n\t\t${P7ZIP} a ${flag_ad} ${flag_type} -i@${list} ${flag} -- \"${file}\"\n\telse\n\t\tfile=`basename \"${dir1}\"`${ext}\n\t\techo \"archive_out=${file}\" >> ${trace}\n\t\t${P7ZIP} a ${flag_ad} ${flag_type} -i@${list} ${flag} -- \"${file}\"\n\tfi\n\t;;\nesac\n\nrm -f ${list}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/p7zip_32.xpm",
    "content": "/* XPM */\nstatic char * p7zip_32_xpm[] = {\n\"32 32 3 1\",\n\" \tc None\",\n\".\tc #000000\",\n\"+\tc #FFFFFF\",\n\"                                \",\n\"                                \",\n\"                                \",\n\"                                \",\n\"................................\",\n\"................................\",\n\"..++++++++++++++++++++++++++++..\",\n\"..++++++++++++++++++++++++++++..\",\n\"..++++++++++++++++++++++++++++..\",\n\"..+++.............++++++++++++..\",\n\"..+++.............++++++++++++..\",\n\"..+++.............++++++++++++..\",\n\"..+++..+++++++++..++++++++++++..\",\n\"..+++..+++++++++..++++++++++++..\",\n\"..+++........+++..++.......+++..\",\n\"..+++.......+++...++.......+++..\",\n\"..+++......+++....++++++...+++..\",\n\"..+++.....+++.....+++++...++++..\",\n\"..+++.....+++.....++++...+++++..\",\n\"..+++.....+++.....+++...++++++..\",\n\"..+++.....+++.....++...+++++++..\",\n\"..+++.....+++.....++...+++++++..\",\n\"..+++.............++.......+++..\",\n\"..+++.............++.......+++..\",\n\"..++++++++++++++++++++++++++++..\",\n\"..++++++++++++++++++++++++++++..\",\n\"..++++++++++++++++++++++++++++..\",\n\"................................\",\n\"................................\",\n\"                                \",\n\"                                \",\n\"                                \"};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/GUI/readme.txt",
    "content": "\n\t7zG\n\t===\n\n\n\n1) building\n-----------\n\n  make test_7zG : build bin/7zG and make some tests\n\n\n2) installing 7zG (tested on Ubuntu 8.04)\n-----------------\n\n  copy the method used for 7z !\n\n  - find where 7z is installed\n    type 7z\n\n  - copy the 7z shell\n    cp /usr/bin/7z /usr/bin/7zG\n\n  - edit /usr/bin/7zG to replace 7z with 7zG\n\n  - chmod 555  /usr/bin/7zG\n\n  - copy bin/7zG according to what is written in /usr/bin/7zG\n    cp bin/7zG /usr/lib/p7zip/7zG\n    chmod 555 /usr/lib/p7zip/7zG\n\n  - To have access to the Lang files, copy Lang\n    cp -r GUI/Lang /usr/lib/p7zip/Lang\n    find /usr/lib/p7zip/Lang -type d -exec chmod 555 {} \\;\n    find /usr/lib/p7zip/Lang -type f -exec chmod 444 {} \\;\n\n\n  - To have access to the help, copy help\n    cp -r GUI/help /usr/lib/p7zip/help\n    find /usr/lib/p7zip/help -type d -exec chmod 555 {} \\;\n    find /usr/lib/p7zip/help -type f -exec chmod 444 {} \\;\n\n  - copy p7zipForFilemanager\n    cp GUI/p7zipForFilemanager  /usr/bin/p7zipForFilemanager\n    chmod 555 /usr/bin/p7zipForFilemanager\n\n  - copy the 7-zip icon \n    cp GUI/p7zip_16_ok.png /usr/share/icons/hicolor/16x16/apps/p7zip.png\n    chmod 444 /usr/share/icons/hicolor/16x16/apps/p7zip.png\n  \n3) installing the context menu for KDE   (dolphin)  (tested on Ubuntu 8.04)\n--------------------------------------------------\n  only for the user :\n    mkdir -p ~/.kde/share/apps/d3lphin/servicemenus/\n    cp GUI/kde/*.desktop ~/.kde/share/apps/d3lphin/servicemenus/\n\n\n  for all:\n    cp GUI/kde/*.desktop /usr/share/apps/d3lphin/servicemenus/\n\n\n4) installing the context menu for KDE   (konqueror)  (tested on Ubuntu 8.04)\n----------------------------------------------------\n  only for the user :\n    mkdir -p ~/.kde/share/apps/konqueror/servicemenus/\n    cp GUI/kde/*.desktop ~/.kde/share/apps/konqueror/servicemenus/\n\n  for all:\n     cp  GUI/kde/*.desktop  /usr/share/apps/konqueror/servicemenus/\n\n\n5) installing the context menu for gnome   (nautilus)\n-----------------------------------------------------\n  don't know how to add a context menu in nautilus :(\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/README",
    "content": "\tp7zip 4.65\n\t==========\n\nHomepage : http://p7zip.sourceforge.net/\n\np7zip is a port of the Windows programs 7z.exe and 7za.exe provided by 7-zip.\n\n7-zip is a file archiver with the highest compression ratio.\nHomepage : www.7-zip.org\n\n  7z uses plugins (7z.so and Codecs/Rar29.so) to handle archives.\n  7za is a stand-alone executable.\n  7za handles less archive formats than 7z.exe.\n  7zr is a light stand-alone executable that supports only 7z/LZMA/BCJ/BCJ2.\n\nNEW:\n  7zG : see GUI/readme.txt\n\nCAUTION :\n---------\n\n- FIRST : DO NOT USE the 7-zip format for backup purpose on Linux/Unix because :\n  - 7-zip does not store the owner/group of the file\n\n  On Linux/Unix, in order to backup directories you must use tar !\n  to backup a directory  : tar cf - directory | 7za a -si directory.tar.7z\n  to restore your backup : 7za x -so directory.tar.7z | tar xf -\n\n- if you want to send files and directories (not the owner of file)\n  to others Unix/MacOS/Windows users, you can use the 7-zip format.\n\n  example : 7za a directory.7z  directory\n\n  do not use \"-r\" because this flag does not do what you think\n  do not use directory/* because of \".*\" files\n   (example : \"directory/*\" does not match \"directory/.profile\")\n\n\nBUILD :\n-------\n\n  If you have downloaded the \"bin\" package,\n\tuse directly the program bin/7za.\n\t(tested on Redhat 9.0, Fedora 2, Mandrake 10.0, Debian 3.0)\n\tAs the program is statically linked, its should run on many x86 linux.\n\n  If you have downloaded the \"source\" package,\n\n\tAccording to your OS, copy makefile.linux,\n\tmakefile.freebsd, makefile.cygwin, ...\n        over makefile.machine\n\n\tIf you want to make a parallel build : make -j4 -f makefile.parallel_jobs TARGET\n\n\tmake clean    : to clean all directories\n\tmake          : to build bin/7za\n\tmake sfx      : to build bin/7zCon.sfx (7za can now create SFX archive)\n\tmake 7z       : to build bin/7z and its plugins :\n                          - \"bin/7z.so\" (GNU LGPL + AES code license)\n                          - \"bin/Codecs/Rar29.so\" (GNU LGPL + unRAR restriction)\n\tmake 7zr      : to build bin/7zr\n\tmake all      : to build bin/7za and bin/7zCon.sfx\n\tmake all2     : to build bin/7za, bin/7z (with its plugins) and bin/7zCon.sfx\n\tmake all3     : to build bin/7za, bin/7z (with its plugins), bin/7zr and bin/7zCon.sfx\n\tmake test     : to test bin/7za (extracting, archiving, password ...)\n\tmake test_7z  : to test bin/7z  (extracting, archiving, password ...)\n\tmake test_7zr : to test bin/7zr (extracting, archiving, ...)\n\n\tmake 7zG      : to build bin/7zG and its plugins :\n                          - \"bin/7z.so\" (GNU LGPL + AES code license)\n                          - \"bin/Codecs/Rar29.so\" (GNU LGPL + unRAR restriction)\n\tmake test_7zG : to test bin/7zG (extracting, archiving, ...)\n\n\n  this procedure has been tested on :\n   - x86 CPU :\n\tDOS   - (built with DJGPP, see http://blairdude.googlepages.com/p7zip )\n\tLinux - Redhat 9.0 Standart\n\tLinux - Fedora 2 (Redhat) (gcc 3.3.3 and gcc-3.4.1 with \n                stack-smashing protector from www.trl.ibm.com/projects/security/ssp/)\n\tLinux - Mandrake 10.0 Official\n\tLinux - Debian 3.0 Stable\n\tLinux - Ubuntu 8.04\n\tFreeBSD 5.2.1 (gcc 3.3.3)\n\tMacOS 10.4.8 \n\tNetBSD \n\tCYGWIN_NT-5.1 1.5.9(0.112/4/2) 2004-03-18 23:05 i686 Cygwin\n\tSolaris  9 (x86) with gcc 3.3.2\n\tSolaris 10 (x86)\n\n   - alpha CPU :\n\tLinux - Debian 3.0 (alpha) with gcc 2.95.4\n\n   - AMD64 CPU :\n\tLinux - SuSE 8 ES (AMD64 Opteron) with gcc 3.2.2\n\tLinux - Fedora 4  (AMD64 Turion)  with gcc 4.0.1\n\tLinux - Ubuntu 8.10\n\n   - Itanium CPU :\n        HP-UX B.11.31 U ia64 with aCC (HP C/aC++ B3910B A.06.14 [Feb 22 2007])\n\n   - s390x CPU :\n\tLinux - SUSE Enterprise Linux 10 - with gcc 4.1.2\n\t( only the 32bits built works, the 64bits built does not pass the tests )\n\n   - sparc CPU :\n\tSolaris 8 (sparc) with gcc 2.95.2\n\tSolaris 9 (sparc) with gcc 3.3.2\n\n   - powerpc CPU :\n\tMacOS X 10.1/darwin 5.5 with gcc 932.1 (gcc 2.95.2)\n\tMacOS X 10.3 with XCode 1.5\n\n   - openpower CPU :\n        Linux openpower-linux1 2.6.5-7.97-pseries64 (ppc64) with gcc 3.3.3 \n\n   - IBM :\n\tAIX 5.3 with gcc 4.1.0\n\n   - Tru64 :\n\tOSF 5.1 with gcc 3.4.2\n\n   - PA-RISC :\n\tHP-UX 11.11 with aCC (HP ANSI C++ B3910B A.03.73)\n\tHP-UX 11.11 with gcc 3.4.2 (7za and 7zr : OK, 7z : Ko because of a buggy gcc for HP-UX,\n                                    plugins don't work because C++ constructors are not called !)\n\n\nBUILD with cmake\n----------------\n  You can only build 7za.\n \n  cd CPP/7zip/CMAKE\n\n  edit generate.sh to choose your target\n\n  ./generate.sh\n\n  the cmake project for the target is in \"CPP/7zip/CMAKE/Alone\".\n\n  For the target \"Unix Makefiles\", use \"make\" to compile\n\n  For others target, use the IDE (CodeBlocks, KDevelop3, Eclipse CDT4)\n\nINSTALL :\n---------\n\n  method 1\n  --------\n  - edit install.sh to change DEST_HOME\n  - ./install.sh : to install\n  Remark : you must be \"root\" to install 7za in the directory \"/usr/local\"\n\n  method 2\n  --------\n  - 7za is a stand-alone program, you can put this program where you want.\n  example :  cp bin/7za /usr/local/bin/7za\n\n  - 7z needs its plugins. You must copy the file 7z, 7z.so\n    and the directory Codecs in the same destination directory.\n\n  - if you want to be able to create SFX archive, copy bin/7zCon.sfx\n  to the directory where 7za or 7z can be found.\n  \n\nUSAGE:\n------\n  Remark : you can replace 7za with 7z.\n\n  7za t archive.7z  : tests files in the archive archive.7z\n  7za l archive.7z  : lists all files from archive archive.7z\n  7za x archive.7z  : extracts all files from archive archive.7z\n                   to the current directory\n\n  7za a archive.7z file1 fileN : add files to the archive archive.7z\n\n  7za a archive.7z  dir1 :  add all files and subdirectories from directory \"dir1\" to archive archive.7z \n\n  CAUTION : do not use the flag \"-r\" unless you know what you are doing ...\n\n  7za a -sfx archive.exe dir1 : add all files from directory \"dir1\" to SFX archive archive.exe \n  (Remark : SFX archive MUST end with \".exe\")\n\n  You can also add or extract files to/from .zip or .tar archives.\n  You can also compress/uncompress .gz or .bz2 files.\n\n  7za a -tzip   archive.zip file file2 file3\n  7za a -ttar   archive.tar file\n  7za a -tgzip  file.gz     file\n  7za a -tbzip2 archive.bz2 file\n\n  You can use password for archives:\n  7za a -pmy_password archive.7z  dir1\n\n  For .7z archive only, you can enable archive header encryption with \"-mhe\"\n  7za a -mhe=on -pmy_password archive.7z  dir1\n\n  For more, see the documentation of 7za.exe in DOCS/MANUAL directory\n  7za a -t7z  -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z  dir1 :\n      adds all files from directory \"dir1\" to archive archive.7z\n      using \"ultra settings\".\n      -t7z     : 7z archive\n      -m0=lzma : lzma method\n      -mx=9    : level of compression = 9 (Ultra)\n      -mfb=64  : number of fast bytes for LZMA = 64\n      -md=32m  : dictionary size = 32 megabytes\n      -ms=on   : solid archive = on\n\nBENCHMARKS :\n------------\n  7za b : bench LZMA codec\n  7z b -mm=crc : make internal crc check.\n\nLICENSE :\n---------\n  please read DOCS/License.txt.\n\nLIMITATIONS from 7-zip :\n------------------------\n\n  - does not support uid/gid for the .tar format (so, use tar on Unix)\n\nLIMITATIONS for Unix version only :\n-----------------------------------\n\n  - can handle properly UNICODE filenames only if the environment is UTF-8.\n  Example : export LANG=en_US.UTF-8 ; unset LC_CTYPE\n  Remark  : see the possible values for LANG in the directory \n            - /usr/lib/locale   : Fedora 2 / Solaris 8\n            - /usr/share/locale : OpenBSD / Debian / FreeBSD / MacOS X / Mandrake 10.1 / NetBSD\n  p7zip relies on LC_CTYPE and then on LANG to convert name to/from UNICODE.\n  the command \"locale\" should display these environment variables.\n  you can also do \"echo $LC_CTYPE\" and \"echo $LANG\".\n\n  If you do not plan to export your archive, you can use the flag \"-no-utf16\".\n  Usage :\n    7za a -no-utf16 archive.7z dirOrFile1 ... dirOrFileN\n    7za t -no-utf16 archive.7z\n    7za l -no-utf16 archive.7z\n    7za x -no-utf16 archive.7z\n \n  - ignores Windows file access permissions (files are created with default permissions)\n\n  see also TODO file.\n\nDEVELOPPER CORNER:\n------------------\n\n  - WaitForMultipleObject has no equivalence on Unix.\n  - Events don't exist.\n  - sizeof(wchar_t) = 4 with GCC (2 with MS VC++)\n  - \"FIXME\" in source code indicates that you should add codes to better handle all cases.\n\n  - \"FIXED\" in source code indicates that the original code has been\n    changed to work in Unix environment.\n\n  see also TODO file.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/TODO",
    "content": "\n7za/7z\n======\n- auto-generate config.h (use a configure script ...)\n\n- suppress all exit(EXIT_FAILURE), FIXME, ...\n\n- no chmod for TAR (should restore the rights set)\n\n- no chown(uid,gid) for TAR\n\n- Use a more portable \"String.h\"\n\n- UTF16 : try to test with Complex Unicode filenames\n\n- KNOWN BUGS\n\n  - date (format arj/rar/chm) ?\n\n  - absolute path ?\n\n- zip format : better support of symbolic links\n\n7zG / p7zipForFilemanager\n==========================\n\n- better help displaying\n\n- better support for space in filenames\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/check/check.sh",
    "content": "#! /bin/sh\n\nsure()\n{\n  eval $*\n  if [ \"$?\" != \"0\" ]\n  then\n    echo \"ERROR during : $*\"\n    echo \"ERROR during : $*\" > last_error\n    exit 1\n  fi\n}\n\nPZIP7=`pwd`\"/$1\"\n\nREP=TMP_$$\necho \"REP=${REP}\"\n\nchmod -R 777 ${REP} 2> /dev/null\nrm -fr   ${REP}\nmkdir -p ${REP}\n\ncd ${REP}\n\n# sure rm -fr 7za433_ref 7za433_7zip_bzip2 7za433_7zip_lzma 7za433_7zip_lzma_crypto 7za433_7zip_ppmd 7za433_tar\n# sure rm -fr 7za433_7zip_bzip2.7z 7za433_7zip_lzma.7z 7za433_7zip_lzma_crypto.7z 7za433_7zip_ppmd.7z 7za433_tar.tar\n\necho \"\"\necho \"# TESTING ...\"\necho \"#############\"\n\nsure ${PZIP7} t ../test/7za433_tar.tar\nsure ${PZIP7} t ../test/7za433_7zip_lzma.7z\nsure ${PZIP7} t -pqwerty ../test/7za433_7zip_lzma_crypto.7z\nsure ${PZIP7} t ../test/7za433_7zip_ppmd.7z\nsure ${PZIP7} t ../test/7za433_7zip_bzip2.7z\n\necho \"\"\necho \"# EXTRACTING ...\"\necho \"################\"\n\nsure tar xf ../test/7za433_tar.tar\nsure mv 7za433_tar 7za433_ref\n\nsure ${PZIP7} x ../test/7za433_tar.tar\nsure diff -r 7za433_ref 7za433_tar\n\nsure ${PZIP7} x ../test/7za433_7zip_lzma.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma\n\nsure ${PZIP7} x -pqwerty ../test/7za433_7zip_lzma_crypto.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma_crypto\n\nsure ${PZIP7} x ../test/7za433_7zip_ppmd.7z\nsure diff -r 7za433_ref 7za433_7zip_ppmd\n\nsure ${PZIP7} x ../test/7za433_7zip_bzip2.7z\nsure diff -r 7za433_ref 7za433_7zip_bzip2\n\necho \"\"\necho \"# Archiving ...\"\necho \"###############\"\n\nsure ${PZIP7} a -ttar 7za433_tar.tar 7za433_tar\nsure tar tvf 7za433_tar.tar\n\nsure ${PZIP7} a 7za433_7zip_lzma.7z 7za433_7zip_lzma\n\nsure ${PZIP7} a -pqwerty -mhc=on -mhe=on 7za433_7zip_lzma_crypto.7z 7za433_7zip_lzma_crypto\n\nsure ${PZIP7} a -mx=9 -m0=ppmd:mem=64m:o=32 7za433_7zip_ppmd.7z 7za433_7zip_ppmd\n\nsure ${PZIP7} a -m0=bzip2 7za433_7zip_bzip2.7z 7za433_7zip_bzip2\n\necho \"\"\necho \"# EXTRACTING (PASS 2) ...\"\necho \"#########################\"\n\nsure rm -fr 7za433_7zip_bzip2 7za433_7zip_lzma 7za433_7zip_lzma_crypto 7za433_7zip_ppmd 7za433_tar\n\nsure ${PZIP7} x 7za433_tar.tar\nsure diff -r 7za433_ref 7za433_tar\n\nsure ${PZIP7} x 7za433_7zip_lzma.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma\n\nsure ${PZIP7} x -pqwerty 7za433_7zip_lzma_crypto.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma_crypto\n\nsure ${PZIP7} x 7za433_7zip_ppmd.7z\nsure diff -r 7za433_ref 7za433_7zip_ppmd\n\nsure ${PZIP7} x 7za433_7zip_bzip2.7z\nsure diff -r 7za433_ref 7za433_7zip_bzip2\n\necho \"\"\necho \"# EXTRACTING (LZMA) ...\"\necho \"#######################\"\n\nrm -f 7za.exe\n\nsure ${PZIP7} x ../test/7za.exe.lzma\nsure diff 7za.exe 7za433_ref/bin/7za.exe\nsure rm -f 7za.exe\n\nsure ${PZIP7} x ../test/7za.exe.lzma86\nsure diff 7za.exe 7za433_ref/bin/7za.exe\nsure rm -f 7za.exe\n\nsure ${PZIP7} x ../test/7za.exe.lzma_eos\nsure diff 7za.exe 7za433_ref/bin/7za.exe\nsure rm -f 7za.exe\n\n#####################################\n\ncd ..\n\n# ./clean_all.sh\nchmod -R 777 ${REP} 2> /dev/null\nrm -fr   ${REP}\n\necho \"\"\necho \"========\"\necho \"ALL DONE\"\necho \"========\"\necho \"\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/check/check_7zr.sh",
    "content": "#! /bin/sh\n\nsure()\n{\n  eval $*\n  if [ \"$?\" != \"0\" ]\n  then\n    echo \"ERROR during : $*\"\n    echo \"ERROR during : $*\" > last_error\n    exit 1\n  fi\n}\n\nPZIP7=`pwd`\"/$1\"\n\nREP=TMP_$$\necho \"REP=${REP}\"\n\nchmod -R 777 ${REP} 2> /dev/null\nrm -fr   ${REP}\nmkdir -p ${REP}\n\ncd ${REP}\n\n# sure rm -fr 7za433_ref 7za433_7zip_bzip2 7za433_7zip_lzma 7za433_7zip_lzma_crypto 7za433_7zip_ppmd 7za433_tar\n# sure rm -fr 7za433_7zip_bzip2.7z 7za433_7zip_lzma.7z 7za433_7zip_lzma_crypto.7z 7za433_7zip_ppmd.7z 7za433_tar.tar\n\necho \"\"\necho \"# TESTING ...\"\necho \"#############\"\n\nsure ${PZIP7} t ../test/7za433_7zip_lzma.7z\n\n\necho \"\"\necho \"# EXTRACTING ...\"\necho \"################\"\n\nsure tar xf ../test/7za433_tar.tar\nsure mv 7za433_tar 7za433_ref\n\nsure ${PZIP7} x ../test/7za433_7zip_lzma.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma\n\necho \"\"\necho \"# Archiving ...\"\necho \"###############\"\n\nsure ${PZIP7} a 7za433_7zip_lzma.7z 7za433_7zip_lzma\n\necho \"\"\necho \"# EXTRACTING (PASS 2) ...\"\necho \"#########################\"\n\nsure rm -fr 7za433_7zip_lzma\n\nsure ${PZIP7} x 7za433_7zip_lzma.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma\n\necho \"\"\necho \"# EXTRACTING (LZMA) ...\"\necho \"#######################\"\n\nrm -f 7za.exe\n\nsure ${PZIP7} x ../test/7za.exe.lzma\nsure diff 7za.exe 7za433_ref/bin/7za.exe\nsure rm -f 7za.exe\n\nsure ${PZIP7} x ../test/7za.exe.lzma86\nsure diff 7za.exe 7za433_ref/bin/7za.exe\nsure rm -f 7za.exe\n\nsure ${PZIP7} x ../test/7za.exe.lzma_eos\nsure diff 7za.exe 7za433_ref/bin/7za.exe\nsure rm -f 7za.exe\n\n#####################################\n\ncd ..\n\n# ./clean_all.sh\nchmod -R 777 ${REP} 2> /dev/null\nrm -fr   ${REP}\n\n\necho \"\"\necho \"========\"\necho \"ALL DONE\"\necho \"========\"\necho \"\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/check/check_Client7z.sh",
    "content": "#! /bin/sh\n\nsure()\n{\n  eval $*\n  if [ \"$?\" != \"0\" ]\n  then\n    echo \"ERROR during : $*\"\n    echo \"ERROR during : $*\" > last_error\n    exit 1\n  fi\n}\n\nLD_LIBRARY_PATH=`cd ../bin ; pwd`:${LD_LIBRARY_PATH}\nexport LD_LIBRARY_PATH\necho \"LD_LIBRARY_PATH=${LD_LIBRARY_PATH}\"\n\nPZIP7=`pwd`\"/$1\"\n\nREP=TMP_$$\necho \"REP=${REP}\"\n\nchmod -R 777 ${REP} 2> /dev/null\nrm -fr   ${REP}\nmkdir -p ${REP}\n\ncd ${REP}\n\n# sure rm -fr 7za433_ref 7za433_7zip_bzip2 7za433_7zip_lzma 7za433_7zip_lzma_crypto 7za433_7zip_ppmd 7za433_tar\n# sure rm -fr 7za433_7zip_bzip2.7z 7za433_7zip_lzma.7z 7za433_7zip_lzma_crypto.7z 7za433_7zip_ppmd.7z 7za433_tar.tar\n\n# for Beos or MacOSX\nln -s ../../bin/7z.so .\n\necho \"\"\necho \"# TESTING ...\"\necho \"#############\"\n\nsure ${PZIP7} l ../test/7za433_7zip_lzma.7z\n# sure ${PZIP7} t -pqwerty ../test/7za433_7zip_lzma_crypto.7z\nsure ${PZIP7} l ../test/7za433_7zip_ppmd.7z\nsure ${PZIP7} l ../test/7za433_7zip_bzip2.7z\n\n\n\necho \"\"\necho \"# EXTRACTING ...\"\necho \"################\"\n\nsure tar xf ../test/7za433_tar.tar\nsure mv 7za433_tar 7za433_ref\n\nsure ${PZIP7} x ../test/7za433_7zip_lzma.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma\n\n# sure ${PZIP7} x -pqwerty ../test/7za433_7zip_lzma_crypto.7z\n# sure diff -r 7za433_ref 7za433_7zip_lzma_crypto\n\nsure ${PZIP7} x ../test/7za433_7zip_ppmd.7z\nsure diff -r 7za433_ref 7za433_7zip_ppmd\n\nsure ${PZIP7} x ../test/7za433_7zip_bzip2.7z\nsure diff -r 7za433_ref 7za433_7zip_bzip2\n\necho \"\"\necho \"# Archiving ...\"\necho \"###############\"\n\nsure ${PZIP7} a 7za433_7zip_lzma.7z 7za433_7zip_lzma/bin/7za.exe 7za433_7zip_lzma/readme.txt 7za433_7zip_lzma/doc/copying.txt\n\necho \"\"\necho \"# EXTRACTING (PASS 2) ...\"\necho \"#########################\"\n\nsure rm -fr 7za433_7zip_bzip2 7za433_7zip_lzma 7za433_7zip_lzma_crypto 7za433_7zip_ppmd 7za433_tar\n\nsure ${PZIP7} x 7za433_7zip_lzma.7z\nsure diff -r 7za433_ref 7za433_7zip_lzma\n\ncd ..\n\n# ./clean_all.sh\nchmod -R 777 ${REP} 2> /dev/null\nrm -fr   ${REP}\n\necho \"\"\necho \"========\"\necho \"ALL DONE\"\necho \"========\"\necho \"\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/check/check_install.sh",
    "content": "#! /bin/sh\n\ncd ..\n\nDEST_HOME=${HOME}/INSTALL_FOR_P7ZIP/local\nDEST_HOME_SPACE=\"${HOME}/INSTALL_FOR_P7ZIP/lo  cal\"\n\n##########################################################################################\"\n\necho \"## PASS 1 - no files \"\n\nchmod -R 777 ${HOME}/INSTALL_FOR_P7ZIP\nrm -fr       ${HOME}/INSTALL_FOR_P7ZIP\n\n./install.sh \"${DEST_HOME}/usr/bin\" \"${DEST_HOME}/usr/lib/p7zip\" \"${DEST_HOME}/usr/man\" \"${DEST_HOME}/usr/share/doc/p7zip\"\n\n\necho \"## PASS 2 - overwrite files \"\n./install.sh \"${DEST_HOME}/usr/bin\" \"${DEST_HOME}/usr/lib/p7zip\" \"${DEST_HOME}/usr/man\" \"${DEST_HOME}/usr/share/doc/p7zip\"\n\nmv \"${DEST_HOME}\" \"${DEST_HOME}_REF\"\n\necho \"## PASS 3 - with DEST_DIR\"\n\n./install.sh \"/usr/bin\" \"/usr/lib/p7zip\" \"/usr/man\" \"/usr/share/doc/p7zip\"  \"${DEST_HOME}/\"\n\ndiff -r  \"${DEST_HOME}/usr/bin\" \"${DEST_HOME}_REF/usr/bin\" > /dev/null\n   if [ \"$?\" = \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (bin)\"\n     echo \"#####\"\n     exit 1\n   fi\n\ndiff -r  \"${DEST_HOME}/usr/man\" \"${DEST_HOME}_REF/usr/man\" > /dev/null\n   if [ \"$?\" = \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (man)\"\n     echo \"#####\"\n     exit 1\n   fi\n\ndiff -r  \"${DEST_HOME}/usr/lib\" \"${DEST_HOME}_REF/usr/lib\" > /dev/null\n   if [ \"$?\" != \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (lib)\"\n     echo \"#####\"\n     exit 1\n   fi\n\ndiff -r  \"${DEST_HOME}/usr/share\" \"${DEST_HOME}_REF/usr/share\" > /dev/null\n   if [ \"$?\" != \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (share)\"\n     echo \"#####\"\n     exit 1\n   fi\n\n##########################################################################################\"\n\necho \"## PASS 4 - no files \"\n\nchmod -R 777 ${HOME}/INSTALL_FOR_P7ZIP\nrm -fr       ${HOME}/INSTALL_FOR_P7ZIP\n\n./install.sh \"${DEST_HOME_SPACE}/usr/bin\" \"${DEST_HOME_SPACE}/usr/lib/p7zip\" \"${DEST_HOME_SPACE}/usr/man\" \"${DEST_HOME_SPACE}/usr/share/doc/p7zip\"\n\n\necho \"## PASS 5 - overwrite files \"\n./install.sh \"${DEST_HOME_SPACE}/usr/bin\" \"${DEST_HOME_SPACE}/usr/lib/p7zip\" \"${DEST_HOME_SPACE}/usr/man\" \"${DEST_HOME_SPACE}/usr/share/doc/p7zip\"\n\n# test each programs\necho \"## PASS 6 - programs testing\"\n\n\"${DEST_HOME_SPACE}/usr/bin/7za\" t check/test/7za433_7zip_lzma.7z > /dev/null\n  if [ \"$?\" != \"0\" ]\n  then\n    echo \"#####\"\n    echo \"ERROR 7za\"\n    echo \"#####\"\n    exit 1\n  fi\n\n\"${DEST_HOME_SPACE}/usr/bin/7z\" t check/test/7za433_7zip_lzma.7z > /dev/null\n  if [ \"$?\" != \"0\" ]\n  then\n    echo \"#####\"\n    echo \"ERROR 7z\"\n    echo \"#####\"\n    exit 1\n  fi\n\n\"${DEST_HOME_SPACE}/usr/bin/7zr\" t check/test/7za433_7zip_lzma.7z > /dev/null\n  if [ \"$?\" != \"0\" ]\n  then\n    echo \"#####\"\n    echo \"ERROR 7zr\"\n    echo \"#####\"\n    exit 1\n  fi\n\n\nmv \"${DEST_HOME_SPACE}\" \"${DEST_HOME_SPACE}_REF\"\n\necho \"## PASS 7 - with DEST_DIR\"\n\n./install.sh \"/usr/bin\" \"/usr/lib/p7zip\" \"/usr/man\" \"/usr/share/doc/p7zip\"  \"${DEST_HOME_SPACE}/\"\n\ndiff -r  \"${DEST_HOME_SPACE}/usr/bin\" \"${DEST_HOME_SPACE}_REF/usr/bin\" > /dev/null\n   if [ \"$?\" = \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (bin)\"\n     echo \"#####\"\n     exit 1\n   fi\n\ndiff -r  \"${DEST_HOME_SPACE}/usr/man\" \"${DEST_HOME_SPACE}_REF/usr/man\" > /dev/null\n   if [ \"$?\" = \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (man)\"\n     echo \"#####\"\n     exit 1\n   fi\n\ndiff -r  \"${DEST_HOME_SPACE}/usr/lib\" \"${DEST_HOME_SPACE}_REF/usr/lib\" > /dev/null\n   if [ \"$?\" != \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (lib)\"\n     echo \"#####\"\n     exit 1\n   fi\n\ndiff -r  \"${DEST_HOME_SPACE}/usr/share\" \"${DEST_HOME_SPACE}_REF/usr/share\" > /dev/null\n   if [ \"$?\" != \"0\" ]\n   then\n     echo \"#####\"\n     echo \"ERROR (share)\"\n     echo \"#####\"\n     exit 1\n   fi\n\n\n##########################################################################################\"\n\nchmod -R 777 ${HOME}/INSTALL_FOR_P7ZIP\nrm -fr       ${HOME}/INSTALL_FOR_P7ZIP\n\n    echo \"########\"\n    echo \"All Done\"\n    echo \"########\"\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/check/clean_all.sh",
    "content": "#! /bin/sh\n\nrm -fr 7za433_ref 7za433_7zip_bzip2 7za433_7zip_lzma 7za433_7zip_lzma_crypto 7za433_7zip_ppmd 7za433_tar\nrm -fr 7za433_7zip_bzip2.7z 7za433_7zip_lzma.7z 7za433_7zip_lzma_crypto.7z 7za433_7zip_ppmd.7z 7za433_tar.tar\nrm -fr last_error TMP_*\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/VirtualFileSystemForMidnightCommander/ChangeLog",
    "content": "=-=-=-= 4.29\n* Code optimization for using less temporary files as possible (may not work with p7zip \n  versions oldest than 4.29)\n\n=-=-=-= 4.16beta\n* Changed internal date representation, because old date format may not work with \n  some mc versions. (thanks to Valery Koval for patch)\n* Aligned with p7zip 4.16 beta (for properly handle old type archives with \"./\" prefix in \n  archive root, and deletion error from solid archives handle)\n\n=-=-=-= 4.14.2beta\n* extract files with same name from different archive subdirs was not a bug, but feature,\n  so I made code cleanup. (thanks to myspace and Igor Pavlov)\n\n=-=-=-= 4.14.1beta\nAligned with p7zip 4.14.01 beta (may work with v 4.x) Not work with oldest versions!\n* workaround p7zip bug for extract files with same name from different archive subdirs\n\n=-=-=-= 4.12.2beta\n* incorrect show small text files in internal (mc) viewer = fixed\n\n=-=-=-= 4.12.1beta\nAligned with p7zip 4.12 beta (may work with v 4.10) Not work with oldest versions!\n* many workarounds to aligning with 4.12\n\n=-=-=-= 0.3.2beta\nAligned with p7zip 0.91 cause version 4.10beta is buggy\n* incorrect handle files inside subdirs of archive without prefix \"./\" = fixed\n\n=-=-=-= 0.3.1beta\nAligned with p7zip 0.91 cause version 4.10beta is buggy\n* incorrect handle filenames inside archive with length little than 12 symbols = fixed\n* p7zip trying extract all files with same name in top dir and other dirs of archive = workaround\n* some workarounds to align with version 0.91\n\n=-=-=-= 0.3beta\nAligned with p7zip 0.90 cause version 4.10beta is buggy\n* incorrect handle filenames with spaces = fixed\n\n=-=-=-= 0.2beta\nfirst version, full of bugs..."
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/VirtualFileSystemForMidnightCommander/readme",
    "content": "\nThe official site of u7z is : http://sgh-punk.narod.ru/files/u7z/\n\nINSTALL\n=======\n- edit /usr/share/mc/extfs/extfs.ini to add \"u7z\" after urar.\n\n- edit /usr/share/mc/mc.ext to add :\n=-=-=-=-=-= Cut -=-=-=-=-=-\nregex/\\.(7z|7Z)$\n\tView=%view{ascii} 7za l %f\n\tOpen=%cd %p#u7z\n=-=-=-=-=-= Cut -=-=-=-=-=-\n\nThis must be added before Manual pages Lines to prevent handle 7z archive\nlike man page\n\n- copy u7z to /usr/share/mc/extfs\n\n- launch mc to try ;)\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/VirtualFileSystemForMidnightCommander/readme.u7z",
    "content": "For use u7z you must add following line to extfs.ini\n\n=-=-=-=-=-= Cut -=-=-=-=-=-\nu7z\n=-=-=-=-=-= Cut -=-=-=-=-=-\n\nAnd add somthing like this to extension file\n\nREMARK: 7z may be replaced with 7za\n\n=-=-=-=-=-= Cut -=-=-=-=-=-\nregex/\\.(7z|7Z)$\n\tView=%view{ascii} 7z l %f\n\tOpen=%cd %p#u7z\n=-=-=-=-=-= Cut -=-=-=-=-=-\n\nThis must be added before Manual pages Lines to prevent handle 7z archive\nlike man page\n\n\nIf you have installed 7z with plugins, you can view and unpack .cab and other\n(if there is plugin) archive types with u7z, just add\n\n=-=-=-=-=-= Cut -=-=-=-=-=-\nregex/\\.(cab|CAB)$\n\tView=%view{ascii} 7z l %f\n\tOpen=%cd %p#u7z\n=-=-=-=-=-= Cut -=-=-=-=-=-\n\nto extension file, and somthing like this for other supported archives.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/VirtualFileSystemForMidnightCommander/u7z",
    "content": "#! /bin/sh\n#\n# u7z - 7zip file archive Virtual File System for Midnight Commander ( ftp://ftp.ibiblio.org/pub/Linux/utils/file/managers/mc/ )\n# \n# Copyright (C) 2004 Sergiy Niskorodov (sgh at mail dot zp dot ua)\n\n# Written by Sergiy Niskorodov aka SGh\n#\n# version 4.29 (12 Nov 2005)\n#\n# 7z for linux can be found on http://sourceforge.net/projects/p7zip/\n\n\n# Thanks to urar VFS authors andrey joukov 2:5020/337.13@fidonet.org, \n# christian.gennerat@alcatel.fr, Andrew V. Samoilov <sav@bcs.zp.ua>\n# I use this script like example\n\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n# \n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n# \n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n\n\nSEVENZ=`which 7z` || SEVENZ=`which 7za`\n\n\nmc7zfs_list ()\n{\n    $SEVENZ l \"$1\" 2> /dev/null | gawk -v uid=${UID-0} '\nBEGIN { flag=0; arr_of_month=\"JanFebMarAprMayJunJulAugSepOctNovDec\" }\n /^-------/ { flag++; if (flag > 1) exit 0; next }\n{\nif (flag == 0) next\n\nyear=substr($1, 1, 4)\nmonth=substr($1, 6, 2)\nday=substr($1, 9, 2)\n\nmonth_name=substr(arr_of_month, (month-1)*3+1, 3)\n\ntime=substr($2, 1, 5)\n\nif (index($3, \"D\") != 0)\n    attr=\"drwxr-xr-x\"\nelse\nif (index($3, \".\") != 0)\n    attr=\"-rw-r--r--\"\n\nsize=$4\n\n$0=substr($0, 54)\nif (NF > 1)\n    name=$0\nelse\n    name=$1\n\ngsub(/\\\\/, \"/\", name)\n\nprintf \"%s   1 %-8d %-8d %8d %3s %2d %4d %s %s\\n\", attr, uid, 0, size, month_name, day, year, time, name\n}'\n}\n\nmc7zfs_copyin ()\n{\n# preserve pwd.\n    pwd=`pwd`\n# Create a directory and copy in it the tmp file with the random name\n    dir=\"$3\".dir\n    mkdir \"$dir\"\n    cd \"$dir\"\n    di=\"${2%/*}\"\n# if file is to be written upper in the archive tree, make fake dir\n    if test \"$di\" != \"${2##*/}\" ; then\n        mkdir -p \"$di\" \n    fi\n    cp -fp \"$3\" \"$dir/$2\"\n    $SEVENZ a \"$1\" \"$2\" >/dev/null 2> /dev/null\n    cd $pwd\n    rm -rf \"$3.dir\"\n}\n\nmc7zfs_copyout ()\n{\n    $SEVENZ l \"$1\" | grep -q \"[.][/].*$2\" &> /dev/null && EXFNAME=*./\"$2\" || EXFNAME=\"$2\"\n    $SEVENZ e -r- -so \"$1\" \"$EXFNAME\" > \"$3\" 2> /dev/null\n}\n\nmc7zfs_mkdir ()\n{\n# preserve pwd.\n    pwd=`pwd`\n# Create a directory and create in it a tmp directory with the good name     \n    dir=tmpdir.${RANDOM}\n    mkdir $dir\n    cd $dir\n    mkdir -p \"$2\"\n    $SEVENZ a -r \"$1\" \"$2\" >/dev/null 2>/dev/null\n    cd $pwd\n    rm -rf $dir\n}\n\nmc7zfs_rm ()\n{\n    $SEVENZ l \"$1\" | grep -q \"[.][/].*$2\" &> /dev/null && EXFNAME=*./\"$2\" || EXFNAME=\"$2\"\n    $SEVENZ d \"$1\" \"$EXFNAME\" 2>&1 | grep -q E_NOTIMPL &> /dev/null && { echo -e \"Function not implemented...\\n7z cannot delete files from solid archive.\" >&2 ; exit 1 ; }\n}\n\numask 077\n\ncmd=\"$1\"\nshift\n\ncase \"$cmd\" in\n  list)    mc7zfs_list    \"$@\" ;;\n  rm)      mc7zfs_rm      \"$@\" ;;\n  rmdir)   mc7zfs_rm      \"$@\" ;;\n  mkdir)   mc7zfs_mkdir   \"$@\" ;;\n  copyin)  mc7zfs_copyin  \"$@\" ;;\n  copyout) mc7zfs_copyout \"$@\" ;;\n  *) exit 1 ;;\nesac\nexit 0\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/gzip-like_CLI_wrapper_for_7z/README",
    "content": "gzip-like CLI wrapper (for 7z)\n==============================\n\nThe official site of the script p7zip provided in this directory\nis http://packages.debian.org/unstable/utils/p7zip.\n\n\nThe script p7zip provides a CLI similar to that of\ngzip/bzip2/etc Un*x utilities for 7z.\n\nWhen necessary, it emulates streaming by using\ntemporary files in /tmp. This is all transparent to\nthe application using it, which can use the same\nsemantincs than with gzip or bzip2.\n\nFor example, you can do:\n\ntar --use-compress-program=p7zip -cf file.tar.7z dir/\n\nto generate a 7zipped tarball.\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/gzip-like_CLI_wrapper_for_7z/check/check.sh",
    "content": "# ! /bin/sh\n\n# remove the strange filenames ...\nrm -f -- \"--\" \"bar\" \"-c\" \"-d\" \"-foo\" \"foo bar\" \"foo (bar) - ABCD\" \"-h\" \"-help\"\nif [ \"$?\" != \"0\" ] ; then\n  echo \"error during rm\"\n  exit 1\nfi\n\n# pipe\nout=`echo \"foobar\" | ../p7zip |  ../p7zip -d`\n\nif [ \"${out}\" != \"foobar\" ] ; then\n  echo \"error in ../p7zip |  ../p7zip -d\"\n  exit 1\nfi\n\n# path with \"./\"\necho \"foobar content\" > foobar\n../p7zip ./foobar\nif [ \"$?\" != \"0\" ] ; then\n  echo \"error p7zip ./foobar\"\n  exit 1\nfi\n\nif [ ! -f ./foobar.7z ] ; then\n  echo \"error ./foobar.7z not found\"\n  exit 1\nfi\n\n../p7zip -d ./foobar.7z\nif [ \"$?\" != \"0\" ] ; then\n  echo \"error p7zip -d ./foobar.7z\"\n  exit 1\nfi\n\nif [ ! -f ./foobar ] ; then\n  echo \"error ./foobar not found\"\n  exit 1\nfi\n\ncontent=`cat foobar`\nif [ \"${content}\" != \"foobar content\" ] ; then\n  echo \"error content of foobar\"\n  exit 1\nfi\n\nrm -f foobar\n\n# the strange filenames are in the tar ...\ntar xf files.tar\nif [ \"$?\" != \"0\" ] ; then\n  echo \"error in tar xf files.tar\"\n  exit 1\nfi\n\n../p7zip -- \"--\" \"bar\" \"-c\" \"-d\" \"-foo\" \"foo bar\" \"foo (bar) - ABCD\" \"-h\" \"-help\"\nif [ \"$?\" != \"0\" ] ; then\n  echo \"error in p7zip\"\n  exit 1\nfi\n\nfor f in \"--\" \"bar\" \"-c\" \"-d\" \"-foo\" \"foo bar\" \"foo (bar) - ABCD\" \"-h\" \"-help\"\ndo\n  7za -- t \"${f}.7z\" > /dev/null\n  if [ \"$?\" != 0 ] ; then\n    echo error in \"${f}.7z\"\n    exit 1\n  fi\ndone \n\n../p7zip -d -- *.7z\nif [ \"$?\" != \"0\" ] ; then\n  echo \"error in p7zip -d\"\n  exit 1\nfi\n\nfor f in \"--\" \"bar\" \"-c\" \"-d\" \"-foo\" \"foo bar\" \"foo (bar) - ABCD\" \"-h\" \"-help\"\ndo\n  if [ ! -f \"${f}\" ] ; then\n    echo error \"${f}\" not found\n    exit 1\n  fi\ndone\n\n# remove the strange filenames ...\nrm -f -- \"--\" \"bar\" \"-c\" \"-d\" \"-foo\" \"foo bar\" \"foo (bar) - ABCD\" \"-h\" \"-help\"\nif [ \"$?\" != \"0\" ] ; then\n  echo \"error during rm\"\n  exit 1\nfi\n\n# test errors\n\n../p7zip no_file\nif [ \"$?\" = \"0\" ] ; then\n  echo \"error p7zip no_file\"\n  exit 1\nfi\n\n../p7zip -d no_file\nif [ \"$?\" = \"0\" ] ; then\n  echo \"error p7zip -d no_file\"\n  exit 1\nfi\n\n../p7zip -d no_file.7z\nif [ \"$?\" = \"0\" ] ; then\n  echo \"error p7zip -d no_file.7z\"\n  exit 1\nfi\n\necho \necho \"########\"\necho \"All Done\"\necho \"########\"\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1",
    "content": ".TH p7zip 1 \"October 31 2004\" \"Mohammed Adnene Trojette\"\n.SH NAME\np7zip \\- Wrapper on 7za, a 7-zip file archiver with high compression ratio\n.SH SYNOPSIS\n.B p7zip\n.BR [-d]\n.BR [-h|--help]\n.BR [--]\n.BR [file ... ]\n    \\-h print this help\n    \\-d decompress file\n    \\-- treats  all  subsequent  arguments  as  file names, even if they start with a dash\n.SH DESCRIPTION\n7-Zip is a file archiver with the highest compression ratio. The program supports 7z (that implements LZMA compression algorithm), ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM and DEB formats. Compression ratio in the new 7z format is 30-50% better than ratio in ZIP format.\n.TP\np7zip is a gzip-like CLI wrapper script for 7zip\n.PP\n.SH FUNCTION LETTERS\n.TP\n.B \\-d\nDecompress file\n.TP\n.B \\-h, \\--help\nPrint usage\n.TP\n.B \\--\nTreats  all  subsequent  arguments  as  file names, even if they start with a dash\n.SH \"SEE ALSO\"\n7z(1), 7za(1), 7zr(1), bzip2(1), gzip(1), zip(1)\n.PP\n.SH AUTHOR\n.TP\nWritten for Debian by Mohammed Adnene Trojette.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/gzip-like_CLI_wrapper_for_7z/p7zip",
    "content": "#!/bin/sh\n# gzip-like CLI wrapper for p7zip\n# version 2.0\n#\n# History\n#  2.0 :\n#    - support for -filename, \"file name\"\n#    - p7zip file1 file2 ...\n\nset -e\n\nusage ()\n  {\n    echo \"Usage: $0 [-d] [-h|--help] [--] [ name ... ]\"\n    echo \"\"\n    echo \"    -h print this help\"\n    echo \"    -d decompress file\"\n    echo \"    -- treats  all  subsequent  arguments  as  file names, even if they start with a dash\"\n    echo \"\"\n    exit 1\n  }\n\ndoit()\n{\n  compress=$1\n  file=\"$2\"\n  \n  if [ \"${file}\" != \"\" ] ; then\n    if ${compress} ; then\n      if [ -f \"${file}\" ] ; then\n        rm -f -- \"${file}.7z\"\n        7za a -- \"${file}.7z\" \"${file}\"\n        if [ \"$?\" != \"0\" ] ; then\n          rm -f -- \"${file}.7z\"\n          exit 1\n        fi\n        rm -- \"${file}\"\n      else\n        exit 1\n      fi\n    else\n      case \"${file}\" in\n        *.7z)\n          if [ -f \"${file}\" ] ; then\n            7za x -- \"${file}\"\n            if [ \"$?\" != \"0\" ] ; then\n              exit 1\n            fi\n            rm -- \"${file}\"\n           else\n             exit 1\n           fi\n        ;;\n        *)\n          echo \"$0: ${file}: unknown suffix\"\n          exit 1\n        ;;\n      esac\n    fi\n    return 0\n  fi\n  \n  P7ZIPTMP=${TMP:-/tmp}\n  tmp=`mktemp ${P7ZIPTMP}/p7zip.XXXXXXXX`\n  trap \"rm -f -- ${tmp}\" 0\n\n  if ${compress} ; then\n    if tty > /dev/null ; then\n      echo \"$0: compressed data not written to a terminal.\"\n      echo \"For help, type: $0 -h\"\n      exit 1\n    fi\n    rm -f -- ${tmp}\n    7za a -si -- ${tmp} >/dev/null\n    if [ \"$?\" != \"0\" ] ; then\n      exit 1\n    fi\n    cat ${tmp}\n  else\n    cat > ${tmp}\n    7za x -so -- ${tmp} 2>/dev/null | cat\n    if [ \"$?\" != \"0\" ] ; then\n      exit 1\n    fi\n  fi\n  \n  rm -f -- ${tmp}\n  return 0\n}\n\n\n## MAIN\n\ncompress=true\nflag=true\nfile=\"\"\n\n# make sure they're present, before we screw up\nfor i in mktemp 7za rm cat tty ; do\n  if ! which $i > /dev/null ; then\n    echo \"$0: $i: command not found\"\n    exit 1\n  fi\ndone\n\n# files and flags\nwhile [ \"$#\" != \"0\" ] ; do\n  case \"$1\" in\n    -d)\n      compress=false # decompressing\n      ;;\n    -c)\n      echo \"$0: ignoring $1 option (not yet implemented)\"\n      ;;\n    -h|--help)\n      usage\n      ;;\n    --)\n      flag=false\n      shift\n      break\n      ;;\n    *)\n\tdoit ${compress} \"$1\"\n        file=\"$1\"\n    ;;\n  esac\n  shift\ndone\n\n# only files now\nwhile [ \"$#\" != \"0\" ] ; do\n  doit ${compress} \"$1\"\n  file=\"$1\"\n  shift\ndone\n\nif [ \"${file}\" = \"\" ] ; then\n  # compressing/decompressing using standart I/O\n  doit ${compress}\nfi\n\nexit 0\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/qnx630sp3/qnx630sp3-shared",
    "content": "BIN=\"p7zip-4.47-x86-qnx6.shared\"\ncd ../../ && mkdir -p ../${BIN}/Codecs && \\\nmake clean && \\\nmv makefile.machine makefile.machine.bak && \\\ncp makefile.qnx_shared.bin makefile.machine && \\\nmake 7z && make 7za && make 7zr && make sfx && \\\nmv ./bin/7z ../${BIN} && mv ./bin/7za ../${BIN} && mv ./bin/7zr ../${BIN} && mv ./bin/7zCon.sfx ../${BIN} && \\\nmake clean && \\\ncp makefile.qnx_shared.so makefile.machine && \\\nmake 7z && \\\nmv ./bin/7z.so ../${BIN} && mv ./bin/Codecs/Rar29.so ../${BIN}/Codecs && \\\nmake clean && \\\nmv makefile.machine.bak makefile.machine\necho \"All done - look for binaries in ../${BIN}\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/contrib/qnx630sp3/qnx630sp3-static",
    "content": "BIN=\"p7zip-4.47-x86-qnx6.static\"\ncd ../../ && mkdir ../${BIN} && \\\nmake clean && \\\nmv makefile.machine makefile.machine.bak && \\\ncp makefile.qnx_static makefile.machine && \\\nmake 7za && make 7zr && make sfx && \\\nmv ./bin/7za ../${BIN} && mv ./bin/7zr ../${BIN} && mv ./bin/7zCon.sfx ../${BIN} ; \\\nmake clean && \\\nmv makefile.machine.bak makefile.machine\necho \"All done - look for binaries in ../${BIN}\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/man1/7z.1",
    "content": ".TH 7z 1 \"September 1 2006\" \"Mohammed Adnene Trojette\"\n.SH NAME\n7z \\- A file archiver with highest compression ratio\n.SH SYNOPSIS\n.B 7z\n.BR [adeltux]\n.BR [\\-]\n.BR [SWITCH]\n.BR <ARCHIVE_NAME>\n.BR <ARGUMENTS>...\n.PP\n.SH DESCRIPTION\n7-Zip is a file archiver with the highest compression ratio. The program supports 7z (that implements LZMA compression algorithm), ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM and DEB formats. Compression ratio in the new 7z format is 30-50% better than ratio in ZIP format.\n.TP\n7z uses plugins to handle archives.\n.PP\n.SH FUNCTION LETTERS\n.TP\n.B a\nAdd\n.TP\n.B d\nDelete\n.TP\n.B e\nExtract\n.TP\n.B l\nList\n.TP\n.B t\nTest\n.TP\n.B u\nUpdate\n.TP\n.B x\neXtract with full paths\n.PP\n.SH SWITCHES\n.TP\n.B \\-ai[r[\\-|0]]{@listfile|!wildcard}\nInclude archives\n.TP\n.B \\-ax[r[\\-|0]]{@listfile|!wildcard}\neXclude archives\n.TP\n.B \\-bd\nDisable percentage indicator\n.TP\n.B \\-i[r[\\-|0]]{@listfile|!wildcard}\nInclude filenames\n.TP\n.B \\-l\ndon't store symlinks; store the files/directories they point to (CAUTION : the scanning stage can never end because of recursive symlinks like 'ln \\-s .. ldir')\n.TP\n.B \\-m{Parameters}\nSet Compression Method (see {DEST_SHARE_DOC}/MANUAL/switches/method.htm for a list of methods)\n.TP\n.B \\-mhe=on|off\n7z format only : enables or disables archive header encryption (Default : off)\n.TP\n.B \\-o{Directory}\nSet Output directory\n.TP\n.B \\-p{Password}\nSet Password\n.TP\n.B \\-r[\\-|0]\nRecurse subdirectories (CAUTION: this flag does not do what you think, avoid using it)\n.TP\n.B \\-sfx[{name}]\nCreate SFX archive\n.TP\n.B \\-si\nRead data from StdIn (eg: tar cf \\- directory | 7z a \\-si directory.tar.7z)\n.TP\n.B \\-so\nWrite data to StdOut (eg: % echo foo | 7z a dummy \\-tgzip \\-si \\-so > /dev/null)\n.TP\n.B \\-slt\nSets technical mode for l (list) command\n.TP\n.B \\-t{Type}\nType of archive (7z, zip, gzip, bzip2 or tar. 7z format is default)\n.TP\n.B \\-v{Size}[b|k|m|g]\nCreate volumes\n.TP\n.B \\-u[\\-][p#][q#][r#][x#][y#][z#][!newArchiveName]\nUpdate options\n.TP\n.B \\-w[path]\nSet Working directory\n.TP\n.B \\-x[r[\\-|0]]]{@listfile|!wildcard}\nExclude filenames\n.TP\n.B \\-y\nAssume Yes on all queries\n.PP\n.SH DIAGNOSTICS\n7-Zip returns the following exit codes:\n.RS\n.IP 0\nNormal (no errors or warnings detected)\n.IP 1\nWarning (Non fatal error(s)). For example, some files cannot be read during compressing. So they were not compressed\n.IP 2\nFatal error\n.IP 7\nBad command line parameters\n.IP 8\nNot enough memory for operation\n.IP 255\nUser stopped the process with control-C (or similar)\n.SH Backup and limitations\nDO NOT USE the 7-zip format for backup purpose on Linux/Unix because :\n \\- 7-zip does not store the owner/group of the file.\n\n.LP\nOn Linux/Unix, in order to backup directories you must use tar :\n \\- to backup a directory  : tar cf \\- directory | 7za a \\-si directory.tar.7z\n \\- to restore your backup : 7za x \\-so directory.tar.7z | tar xf \\-\n\nIf you want to send files and directories (not the owner of file)\nto others Unix/MacOS/Windows users, you can use the 7-zip format.\n\n  example : 7za a directory.7z  directory\n\n.LP\nDo not use \"\\-r\" because this flag does not do what you think.\n.LP\nDo not use directory/* because of \".*\" files (example : \"directory/*\" does not match \"directory/.profile\")\n.SH EXAMPLE 1\n.TP\n.B 7z a \\-t7z  \\-m0=lzma \\-mx=9 \\-mfb=64 \\-md=32m \\-ms=on archive.7z  dir1\nadds all files from directory \"dir1\" to archive archive.7z using \"ultra settings\"\n.TP\n.B \\-t7z\n7z archive\n.TP\n.B \\-m0=lzma\nlzma method\n.TP\n.B \\-mx=9\nlevel of compression = 9 (Ultra)\n.TP\n.B \\-mfb=64\nnumber of fast bytes for LZMA = 64\n.TP\n.B \\-md=32m\ndictionary size = 32 megabytes\n.TP\n.B \\-ms=on\nsolid archive = on\n.SH EXAMPLE 2\n.TP\n.B\n7z a \\-sfx archive.exe dir1\nadd all files from directory \"dir1\" to SFX archive archive.exe (Remark : SFX archive MUST end with \".exe\")\n.SH EXAMPLE 3\n.TP\n.B\n7z a \\-mhe=on \\-pmy_password archive.7z a_directory\nadd all files from directory \"a_directory\" to the archive \"archive.7z\" (with data and header archive encryption on)\n.SH \"SEE ALSO\"\n7za(1), 7zr(1), bzip2(1), gzip(1), zip(1)\n.PP\n.SH \"HTML Documentation\"\n{DEST_SHARE_DOC}/MANUAL/index.htm\n.SH AUTHOR\n.TP\nWritten for Debian by Mohammed Adnene Trojette.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/man1/7za.1",
    "content": ".TH 7za 1 \"September 1 2006\" \"Mohammed Adnene Trojette\"\n.SH NAME\n7za \\- A file archiver with highest compression ratio\n.SH SYNOPSIS\n.B 7za\n.BR [adeltux]\n.BR [-]\n.BR [SWITCH]\n.BR <ARCHIVE_NAME>\n.BR <ARGUMENTS>...\n.PP\n.SH DESCRIPTION\n7-Zip is a file archiver with the highest compression ratio. The program supports 7z (that implements LZMA compression algorithm), ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM and DEB formats. Compression ratio in the new 7z format is 30-50% better than ratio in ZIP format.\n.TP\n7za is a stand-alone executable. 7za handles less archive formats than 7z, but does not need any others.\n.PP\n.SH FUNCTION LETTERS\n.TP\n.B a\nAdd\n.TP\n.B d\nDelete\n.TP\n.B e\nExtract\n.TP\n.B l\nList\n.TP\n.B t\nTest\n.TP\n.B u\nUpdate\n.TP\n.B x\neXtract with full paths\n.PP\n.SH SWITCHES\n.TP\n.B \\-ai[r[-|0]]{@listfile|!wildcard}\nInclude archives\n.TP\n.B \\-ax[r[-|0]]{@listfile|!wildcard}\neXclude archives\n.TP\n.B \\-bd\nDisable percentage indicator\n.TP\n.B \\-i[r[-|0]]{@listfile|!wildcard}\nInclude filenames\n.TP\n.B \\-l\ndon't store symlinks; store the files/directories they point to (CAUTION : the scanning stage can never end because of recursive symlinks like 'ln \\-s .. ldir')\n.TP\n.B \\-m{Parameters}\nSet Compression Method (see {DEST_SHARE_DOC}/MANUAL/switches/method.htm for a list of methods)\n.TP\n.B \\-mhe=on|off\n7z format only : enables or disables archive header encryption (Default : off)\n.TP\n.B \\-o{Directory}\nSet Output directory\n.TP\n.B \\-p{Password}\nSet Password\n.TP\n.B \\-r[-|0]\nRecurse subdirectories (CAUTION: this flag does not do what you think, avoid using it)\n.TP\n.B \\-sfx[{name}]\nCreate SFX archive\n.TP\n.B \\-si\nRead data from StdIn (eg: tar cf \\- directory | 7za a \\-si directory.tar.7z)\n.TP\n.B \\-so\nWrite data to StdOut (eg: % echo foo | 7z a dummy \\-tgzip \\-si \\-so > /dev/null)\n.TP\n.B \\-slt\nSets technical mode for l (list) command\n.TP\n.B \\-t{Type}\nType of archive (7z, zip, gzip, bzip2 or tar. 7z format is default)\n.TP\n.B \\-v{Size}[b|k|m|g]\nCreate volumes\n.TP\n.B \\-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]\nUpdate options\n.TP\n.B \\-w[path]\nSet Working directory\n.TP\n.B \\-x[r[-|0]]]{@listfile|!wildcard}\nExclude filenames\n.TP\n.B \\-y\nAssume Yes on all queries\n.PP\n.SH DIAGNOSTICS\n7-Zip returns the following exit codes:\n.RS\n.IP 0\nNormal (no errors or warnings detected)\n.IP 1\nWarning (Non fatal error(s)). For example, some files cannot be read during compressing. So they were not compressed\n.IP 2\nFatal error\n.IP 7\nBad command line parameters\n.IP 8\nNot enough memory for operation\n.IP 255\nUser stopped the process with control-C (or similar)\n.SH Backup and limitations\nDO NOT USE the 7-zip format for backup purpose on Linux/Unix because :\n \\- 7-zip does not store the owner/group of the file.\n\n.LP\nOn Linux/Unix, in order to backup directories you must use tar :\n \\- to backup a directory  : tar cf \\- directory | 7za a \\-si directory.tar.7z\n \\- to restore your backup : 7za x \\-so directory.tar.7z | tar xf \\-\n\nIf you want to send files and directories (not the owner of file)\nto others Unix/MacOS/Windows users, you can use the 7-zip format.\n\n  example : 7za a directory.7z  directory\n\n.LP\nDo not use \"\\-r\" because this flag does not do what you think.\n.LP\nDo not use directory/* because of \".*\" files (example : \"directory/*\" does not match \"directory/.profile\")\n.SH EXAMPLE 1\n.TP\n.B 7za a \\-t7z  \\-m0=lzma \\-mx=9 \\-mfb=64 \\-md=32m \\-ms=on archive.7z  dir1\nadds all files from directory \"dir1\" to archive archive.7z using \"ultra settings\"\n.TP\n.B \\-t7z\n7z archive\n.TP\n.B \\-m0=lzma\nlzma method\n.TP\n.B \\-mx=9\nlevel of compression = 9 (Ultra)\n.TP\n.B \\-mfb=64\nnumber of fast bytes for LZMA = 64\n.TP\n.B \\-md=32m\ndictionary size = 32 megabytes\n.TP\n.B \\-ms=on\nsolid archive = on\n.SH EXAMPLE 2\n.TP\n.B\n7za a \\-sfx archive.exe dir1\nadd all files from directory \"dir1\" to SFX archive archive.exe (Remark : SFX archive MUST end with \".exe\")\n.SH EXAMPLE 3\n.TP\n.B\n7za a \\-mhe=on \\-pmy_password archive.7z a_directory\nadd all files from directory \"a_directory\" to the archive \"archive.7z\" (with data and header archive encryption on)\n.SH \"SEE ALSO\"\n7z(1), 7zr(1), bzip2(1), gzip(1), zip(1)\n.PP\n.SH \"HTML Documentation\"\n{DEST_SHARE_DOC}/MANUAL/index.htm\n.SH AUTHOR\n.TP\nWritten for Debian by Mohammed Adnene Trojette.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7z/man1/7zr.1",
    "content": ".TH 7zr 1 \"September 1 2006\" \"Mohammed Adnene Trojette\"\r\n.SH NAME\r\n7zr \\- A file archiver with highest compression ratio\r\n.SH SYNOPSIS\r\n.B 7zr\r\n.BR [adeltux]\r\n.BR [-]\r\n.BR [SWITCH]\r\n.BR <ARCHIVE_NAME>\r\n.BR <ARGUMENTS>...\r\n.PP\r\n.SH DESCRIPTION\r\n7-Zip is a file archiver with the highest compression ratio. The program supports 7z (that implements LZMA compression algorithm), ZIP, CAB, ARJ, GZIP, BZIP2, TAR, CPIO, RPM and DEB formats. Compression ratio in the new 7z format is 30-50% better than ratio in ZIP format.\r\n.TP\r\n7zr is a stand-alone executable. 7zr handles less archive formats than 7z, but does not need any others. 7zr is a \"light-version\" of 7za that only handles 7z archives.\r\n.PP\r\n.SH FUNCTION LETTERS\r\n.TP\r\n.B a\r\nAdd\r\n.TP\r\n.B d\r\nDelete\r\n.TP\r\n.B e\r\nExtract\r\n.TP\r\n.B l\r\nList\r\n.TP\r\n.B t\r\nTest\r\n.TP\r\n.B u\r\nUpdate\r\n.TP\r\n.B x\r\neXtract with full paths\r\n.PP\r\n.SH SWITCHES\r\n.TP\r\n.B \\-ai[r[-|0]]{@listfile|!wildcard}\r\nInclude archives\r\n.TP\r\n.B \\-ax[r[-|0]]{@listfile|!wildcard}\r\neXclude archives\r\n.TP\r\n.B \\-bd\r\nDisable percentage indicator\r\n.TP\r\n.B \\-i[r[-|0]]{@listfile|!wildcard}\r\nInclude filenames\r\n.TP\r\n.B \\-l\r\ndon't store symlinks; store the files/directories they point to (CAUTION : the scanning stage can never end because of recursive symlinks like 'ln \\-s .. ldir')\r\n.TP\r\n.B \\-m{Parameters}\r\nSet Compression Method (see {DEST_SHARE_DOC}/MANUAL/switches/method.htm for a list of methods)\r\n.TP\r\n.B \\-mhe=on|off\r\n7z format only : enables or disables archive header encryption (Default : off)\r\n.TP\r\n.B \\-o{Directory}\r\nSet Output directory\r\n.TP\r\n.B \\-p{Password}\r\nSet Password\r\n.TP\r\n.B \\-r[-|0]\r\nRecurse subdirectories (CAUTION: this flag does not do what you think, avoid using it)\r\n.TP\r\n.B \\-sfx[{name}]\r\nCreate SFX archive\r\n.TP\r\n.B \\-si\r\nRead data from StdIn (eg: tar cf \\- directory | 7zr a \\-si directory.tar.7z)\r\n.TP\r\n.B \\-so\r\nWrite data to StdOut (eg: 7zr x \\-so directory.tar.7z | tar xf \\-)\r\n.TP\r\n.B \\-slt\r\nSets technical mode for l (list) command\r\n.TP\r\n.B \\-v{Size}[b|k|m|g]\r\nCreate volumes\r\n.TP\r\n.B \\-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]\r\nUpdate options\r\n.TP\r\n.B \\-w[path]\r\nSet Working directory\r\n.TP\r\n.B \\-x[r[-|0]]]{@listfile|!wildcard}\r\nExclude filenames\r\n.TP\r\n.B \\-y \r\nAssume Yes on all queries\r\n.PP\r\n.SH DIAGNOSTICS\r\n7-Zip returns the following exit codes:\r\n.RS\r\n.IP 0\r\nNormal (no errors or warnings detected)\r\n.IP 1\r\nWarning (Non fatal error(s)). For example, some files cannot be read during compressing. So they were not compressed\r\n.IP 2\r\nFatal error\r\n.IP 7\r\nBad command line parameters\r\n.IP 8\r\nNot enough memory for operation\r\n.IP 255\r\nUser stopped the process with control-C (or similar)\r\n.SH Backup and limitations\r\nDO NOT USE the 7-zip format for backup purpose on Linux/Unix because :\r\n \\- 7-zip does not store the owner/group of the file.\r\n\r\n.LP\r\nOn Linux/Unix, in order to backup directories you must use tar :\r\n \\- to backup a directory  : tar cf - directory | 7zr a -si directory.tar.7z\r\n \\- to restore your backup : 7zr x -so directory.tar.7z | tar xf -\r\n\r\nIf you want to send files and directories (not the owner of file)\r\nto others Unix/MacOS/Windows users, you can use the 7-zip format.\r\n\r\n  example : 7zr a directory.7z  directory\r\n\r\n.LP\r\nDo not use \"\\-r\" because this flag does not do what you think.\r\n.LP\r\nDo not use directory/* because of \".*\" files (example : \"directory/*\" does not match \"directory/.profile\")\r\n.SH EXAMPLE 1\r\n.TP\r\n.B 7zr a \\-t7z  \\-m0=lzma \\-mx=9 \\-mfb=64 \\-md=32m \\-ms=on archive.7z  dir1\r\nadds all files from directory \"dir1\" to archive archive.7z using \"ultra settings\"\r\n.TP\r\n.B \\-t7z\r\n7z archive\r\n.TP\r\n.B \\-m0=lzma\r\nlzma method\r\n.TP\r\n.B \\-mx=9\r\nlevel of compression = 9 (Ultra)\r\n.TP\r\n.B \\-mfb=64\r\nnumber of fast bytes for LZMA = 64\r\n.TP\r\n.B \\-md=32m\r\ndictionary size = 32 megabytes\r\n.TP\r\n.B \\-ms=on\r\nsolid archive = on\r\n.SH EXAMPLE 2\r\n.TP\r\n.B\r\n7zr a \\-sfx archive.exe dir1\r\nadd all files from directory \"dir1\" to SFX archive archive.exe (Remark : SFX archive MUST end with \".exe\")\r\n.SH EXAMPLE 3\r\n.TP\r\n.B\r\n7zr a \\-mhe=on \\-pmy_password archive.7z a_directory\r\nadd all files from directory \"a_directory\" to the archive \"archive.7z\" (with data and header archive encryption on)\r\n.SH \"SEE ALSO\"\r\n7z(1), 7za(1), bzip2(1), gzip(1), zip(1)\r\n.PP\r\n.SH \"HTML Documentation\"\r\n{DEST_SHARE_DOC}/MANUAL/index.htm\r\n.SH AUTHOR\r\n.TP\r\nWritten for Debian by Mohammed Adnene Trojette.\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7zip.cpp",
    "content": "/*\r\n\tCopyright (C) 2009 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"7zip.h\"\r\n\r\n#include \"7z/C/Types.h\"\r\n#include \"7z/CPP/7zip/Archive/IArchive.h\"\r\n//#include \"7z/CPP/Common/InitializeStaticLib.h\" // important! (if using a static lib)\r\n\r\n#ifdef ANDROID\r\n#include \"7z/CPP/include_windows/windows.h\"\r\n#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)\r\nvoid Do7ZipRegistration();\r\n#endif\r\n\r\n#include <string>\r\n#include <vector>\r\n#include <assert.h>\r\n\r\n#include \"7zipstreams.h\" // defines OutStream and InFileStream\r\n\r\n#define _NO_CRYPTO\r\n\r\nSTDAPI GetNumberOfFormats(UINT32 *numFormats);\r\nSTDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value);\r\nSTDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject);\r\n\r\nstruct ArchiveFormatInfo\r\n{\r\n\tstd::string name;\r\n\tstd::vector<std::string> extensions;\r\n\tstd::string signature;\r\n\tGUID guid;\r\n};\r\n\r\nstatic std::vector<ArchiveFormatInfo> s_formatInfos;\r\n\r\nstatic std::string wstrToStr(const wchar_t* wstr)\r\n{\r\n#ifdef ANDROID\r\n\tint len = wcslen(wstr);\r\n\tchar* str = new char[len + 1];\r\n\tfor(int i = 0 ; i < len ; ++i)\r\n\t\tstr[i] = (char)wstr[i];\r\n\tstr[len] = '\\0';\r\n\tstd::string ret(str);\r\n\tdelete [] str;\r\n\treturn ret;\r\n#else\r\n\tchar* str = (char*)_alloca((wcslen(wstr)+1));\r\n    sprintf(str, \"%S\", wstr);\r\n\treturn std::string(str);\r\n#endif\r\n}\r\n\r\nstatic std::vector<std::string> tokenize(const std::string & str, const std::string & delim)\r\n{\r\n\tstd::vector<std::string> tokens;\r\n\tsize_t p0 = 0, p1 = std::string::npos;\r\n\twhile(p0 != std::string::npos)\r\n\t{\r\n\t\tp1 = str.find_first_of(delim, p0);\r\n\t\tif(p1 != p0)\r\n\t\t{\r\n\t\t\tstd::string token = str.substr(p0, p1 - p0);\r\n\t\t\ttokens.push_back(token);\r\n\t\t}\r\n\t\tp0 = str.find_first_not_of(delim, p1);\r\n\t}\r\n\treturn tokens;\r\n}\r\n\r\nstatic std::string s_supportedFormatsFilter;\r\nconst char* GetSupportedFormatsFilter()\r\n{\r\n\tassert(!s_formatInfos.empty());\r\n\tif(s_supportedFormatsFilter.empty())\r\n\t{\r\n\t\ts_supportedFormatsFilter = \"\";\r\n\t\tfor(size_t i = 0; i < s_formatInfos.size(); i++)\r\n\t\t{\r\n\t\t\tfor(size_t j = 0; j < s_formatInfos[i].extensions.size(); j++)\r\n\t\t\t{\r\n\t\t\t\ts_supportedFormatsFilter += \";*.\";\r\n\t\t\t\ts_supportedFormatsFilter += s_formatInfos[i].extensions[j];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn s_supportedFormatsFilter.c_str();\r\n}\r\n\r\nvoid InitDecoder()\r\n{\r\n\tCleanupDecoder();\r\n\tDo7ZipRegistration();\r\n\r\n\tUINT32 numFormats = 0;\r\n\tGetNumberOfFormats(&numFormats);\r\n\r\n\tfor(unsigned int i = 0; i < numFormats; i++)\r\n\t{\r\n\t\tPROPVARIANT var = {VT_EMPTY};\r\n\t\tArchiveFormatInfo info;\r\n\r\n\t\tGetHandlerProperty2(i, NArchive::kName, &var);\r\n\t\tif(var.vt == VT_BSTR)\r\n\t\t\tinfo.name = wstrToStr(var.bstrVal);\r\n\r\n\t\tGetHandlerProperty2(i, NArchive::kExtension, &var);\r\n\t\tif(var.vt == VT_BSTR)\r\n\t\t\tinfo.extensions = tokenize(wstrToStr(var.bstrVal), \" \");\r\n\r\n\t\tGetHandlerProperty2(i, NArchive::kStartSignature, &var);\r\n\t\tif(var.vt == VT_BSTR)\r\n\t\t\tinfo.signature = (const char*)var.bstrVal; // note: there's no 100% correct way of doing this with the existing 7-zip interface, but this is much better than using SysStringLen() in any way (it would return 1 for the signature \"BZh\", for example)\r\n\r\n\t\tGetHandlerProperty2(i,NArchive::kClassID,&var);\r\n\t\tif(var.vt == VT_BSTR)\r\n\t\t\tmemcpy(&info.guid, var.bstrVal, 16);\r\n\t\telse\r\n\t\t\tmemset(&info.guid, 0, 16);\r\n\r\n\t\ts_formatInfos.push_back(info);\r\n\r\n\t\tVariantClear((VARIANTARG*)&var);\r\n\t}\r\n}\r\n\r\nvoid CleanupDecoder()\r\n{\r\n\ts_formatInfos.clear();\r\n\ts_supportedFormatsFilter.clear();\r\n}\r\n\r\n#include \"7z/CPP/7zip/Archive/Zip/ZipHandler.h\"\r\n\r\n\r\nArchiveFile::ArchiveFile(const char* filename)\r\n{\r\n\tassert(!s_formatInfos.empty());\r\n\r\n\tm_typeIndex = -1;\r\n\tm_numItems = 0;\r\n\tm_items = NULL;\r\n\tm_filename = NULL;\r\n\r\n\tFILE* file = fopen(filename, \"rb\");\r\n\tif(!file)\r\n\t\treturn;\r\n\r\n\tm_filename = new char[strlen(filename)+1];\r\n\tstrcpy(m_filename, filename);\r\n\r\n\t// detect archive type using format signature in file\r\n\tfor(size_t i = 0; i < s_formatInfos.size() && m_typeIndex < 0; i++)\r\n\t{\r\n\t\tfseek(file, 0, SEEK_SET);\r\n\t\t\r\n\t\tstd::string& formatSig = s_formatInfos[i].signature;\r\n\t\tint len = formatSig.size();\r\n\r\n\t\tif(len == 0)\r\n\t\t\tcontinue; // because some formats have no signature\r\n\r\n#ifdef ANDROID\r\n\t\tchar* fileSig = new char[len];\r\n#else\r\n\t\tchar* fileSig = (char*)_alloca(len);\r\n#endif\r\n\t\tfread(fileSig, 1, len, file);\r\n\r\n\t\tif(!memcmp(formatSig.c_str(), fileSig, len))\r\n\t\t\tm_typeIndex = i;\r\n#ifdef ANDROID\r\n\t\tdelete [] fileSig;\r\n#endif\r\n\t}\r\n\r\n\t// if no signature match has been found, detect archive type using filename.\r\n\t// this is only for signature-less formats\r\n\tconst char* fileExt = strrchr(filename, '.');\r\n\tif(fileExt++)\r\n\t{\r\n\t\tfor(size_t i = 0; i < s_formatInfos.size() && m_typeIndex < 0; i++)\r\n\t\t{\r\n\t\t\tif(s_formatInfos[i].signature.empty())\r\n\t\t\t{\r\n\t\t\t\tstd::vector<std::string>& formatExts = s_formatInfos[i].extensions;\r\n\t\t\t\tfor(size_t j = 0; j < formatExts.size(); j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(!_stricmp(formatExts[j].c_str(), fileExt))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tm_typeIndex = i;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif(m_typeIndex < 0)\r\n\t{\r\n\t\t// uncompressed\r\n\r\n\t\tm_numItems = 1;\r\n\t\tm_items = new ArchiveItem[m_numItems];\r\n\r\n\t\tfseek(file, 0, SEEK_END);\r\n\t\tm_items[0].size = ftell(file);\r\n\r\n\t\tm_items[0].name = new char[strlen(filename)+1];\r\n\t\tstrcpy(m_items[0].name, filename);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tIInArchive* object = NULL;\r\n\t\tif(SUCCEEDED(CreateObject(&s_formatInfos[m_typeIndex].guid, &IID_IInArchive, (void**)&object)))\r\n\t\t{\r\n\t\t\tInFileStream* ifs = new InFileStream(filename);\r\n\t\t\tif(SUCCEEDED(object->Open(ifs,0,0)))\r\n\t\t\t{\r\n\t\t\t\tUInt32 numItems = 0;\r\n\t\t\t\tobject->GetNumberOfItems(&numItems);\r\n\t\t\t\tm_numItems = numItems;\r\n\t\t\t\tm_items = new ArchiveItem[m_numItems];\r\n\r\n\t\t\t\tfor(int i = 0; i < m_numItems; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tPROPVARIANT var = {VT_EMPTY};\r\n\t\t\t\t\tArchiveItem& item = m_items[i];\r\n\r\n\t\t\t\t\tobject->GetProperty(i, kpidSize, &var);\r\n\t\t\t\t\titem.size = var.uhVal.LowPart;\r\n\r\n\t\t\t\t\tobject->GetProperty(i, kpidPath, &var);\r\n\t\t\t\t\tstd::string path = wstrToStr(var.bstrVal);\r\n\t\t\t\t\titem.name = new char[path.size()+1];\r\n\t\t\t\t\tstrcpy(item.name, path.c_str());\r\n\r\n\t\t\t\t\t//object->GetProperty(i, kpidMethod, &var);\r\n\t\t\t\t\t//std::string& method = wstrToStr(var.bstrVal);\r\n\t\t\t\t\t//item.method = new char[method.size()+1];\r\n\t\t\t\t\t//strcpy(item.method, method.c_str());\r\n\r\n\t\t\t\t\tobject->GetProperty(i, kpidEncrypted, &var);\r\n#ifdef _NO_CRYPTO\r\n\t\t\t\t\tif(var.boolVal)\r\n\t\t\t\t\t\titem.size = 0; // don't support decompressing it, pretend size zero\r\n#else\r\n\t\t\t\t\t#error password support NYI... see client7z.cpp\r\n\t\t\t\t\titem.encrypted = !!var.boolVal;\r\n#endif\r\n\r\n\t\t\t\t\tVariantClear((VARIANTARG*)&var);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobject->Close();\r\n\t\t\t}\r\n\r\n\t\t\tobject->Release();\r\n\t\t}\r\n\t}\r\n\r\n\tfclose(file);\r\n}\r\n\r\nArchiveFile::~ArchiveFile()\r\n{\r\n\tfor(int i = 0; i < m_numItems; i++)\r\n\t{\r\n\t\tdelete[] m_items[i].name;\r\n\t}\r\n\tdelete[] m_items;\r\n\tdelete[] m_filename;\r\n}\r\n\r\nconst char* ArchiveFile::GetArchiveTypeName()\r\n{\r\n\tassert(!s_formatInfos.empty());\r\n\r\n\tif((size_t)m_typeIndex >= s_formatInfos.size())\r\n\t\treturn \"\";\r\n\r\n\treturn s_formatInfos[m_typeIndex].name.c_str();\r\n}\r\n\r\nint ArchiveFile::GetNumItems()\r\n{\r\n\treturn m_numItems;\r\n}\r\n\r\nint ArchiveFile::GetItemSize(int item)\r\n{\r\n\tassert(item >= 0 && item < m_numItems);\r\n\tif(!(item >= 0 && item < m_numItems)) return 0;\r\n\treturn m_items[item].size;\r\n}\r\n\r\nconst char* ArchiveFile::GetItemName(int item)\r\n{\r\n\t//assert(item >= 0 && item < m_numItems);\r\n\tif(!(item >= 0 && item < m_numItems)) return \"\";\r\n\treturn m_items[item].name;\r\n}\r\n\r\nbool ArchiveFile::IsCompressed()\r\n{\r\n\treturn (m_typeIndex >= 0);\r\n}\r\n\r\nint ArchiveFile::ExtractItem(int index, unsigned char* outBuffer, int bufSize) const\r\n{\r\n\tassert(!s_formatInfos.empty());\r\n\t//assert(index >= 0 && index < m_numItems);\r\n\tif(!(index >= 0 && index < m_numItems)) return 0;\r\n\r\n\tArchiveItem& item = m_items[index];\r\n\r\n\tif(bufSize < item.size)\r\n\t\treturn 0;\r\n\r\n\tif(m_typeIndex < 0)\r\n\t{\r\n\t\t// uncompressed\r\n\t\tFILE* file = fopen(m_filename, \"rb\");\r\n\t\tfread(outBuffer, 1, item.size, file);\r\n\t\tfclose(file);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tIInArchive* object = NULL;\r\n\t\tHRESULT hr = E_FAIL;\r\n\t\tif(SUCCEEDED(CreateObject(&s_formatInfos[m_typeIndex].guid, &IID_IInArchive, (void**)&object)))\r\n\t\t{\r\n\t\t\tInFileStream* ifs = new InFileStream(m_filename);\r\n\t\t\tif(SUCCEEDED(object->Open(ifs,0,0)))\r\n\t\t\t{\r\n\t\t\t\tOutStream* os = new OutStream(index, outBuffer, item.size);\r\n\t\t\t\tconst UInt32 indices [1] = {index};\r\n\t\t\t\thr = object->Extract(indices, 1, 0, os);\r\n\t\t\t\tobject->Close();\r\n\t\t\t}\r\n\t\t\tobject->Release();\r\n\t\t}\r\n\t\tif(FAILED(hr))\r\n\t\t\treturn 0;\r\n\t}\r\n\r\n\treturn item.size;\r\n}\r\n\r\n\r\n\r\nint ArchiveFile::ExtractItem(int index, const char* outFilename) const\r\n{\r\n\tassert(!s_formatInfos.empty());\r\n\t//assert(index >= 0 && index < m_numItems);\r\n\tif(!(index >= 0 && index < m_numItems)) return 0;\r\n\r\n\tArchiveItem& item = m_items[index];\r\n\tint rv = item.size;\r\n\r\n#ifndef ANDROID\r\n\tDWORD outAttributes = GetFileAttributes(outFilename);\r\n\tif(outAttributes & FILE_ATTRIBUTE_READONLY)\r\n\t\tSetFileAttributes(outFilename, outAttributes & ~FILE_ATTRIBUTE_READONLY); // temporarily remove read-only attribute so we can decompress to there\r\n#endif\r\n\r\n\tif(m_typeIndex < 0)\r\n\t{\r\n#ifndef ANDROID //I don't *think* we care about this\r\n\t\t// uncompressed\r\n\t\tif(!CopyFile(m_filename, outFilename, false))\r\n#endif\r\n\t\t\trv = 0;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tIInArchive* object = NULL;\r\n\t\tHRESULT hr = E_FAIL;\r\n\t\tif(SUCCEEDED(CreateObject(&s_formatInfos[m_typeIndex].guid, &IID_IInArchive, (void**)&object)))\r\n\t\t{\r\n\t\t\tInFileStream* ifs = new InFileStream(m_filename);\r\n\t\t\tif(SUCCEEDED(object->Open(ifs,0,0)))\r\n\t\t\t{\r\n\t\t\t\tgameInfo.resize(rv);\r\n\t\t\t\tOutStream* os = new OutStream(index, outFilename);\r\n\t\t\t\tconst UInt32 indices [1] = {index};\r\n\t\t\t\thr = object->Extract(indices, 1, 0, os);\r\n\t\t\t\tobject->Close();\r\n\t\t\t}\r\n\t\t\tobject->Release();\r\n\t\t}\r\n\t\tif(FAILED(hr))\r\n\t\t\trv = 0;\r\n\t}\r\n\r\n#ifndef ANDROID\r\n\tif(outAttributes & FILE_ATTRIBUTE_READONLY)\r\n\t\tSetFileAttributes(outFilename, outAttributes); // restore read-only attribute\r\n#endif\r\n\r\n\treturn rv;\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7zip.h",
    "content": "/*\r\n\tCopyright (C) 2009 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _7ZIP_DEC_HEADER\r\n#define _7ZIP_DEC_HEADER\r\n\r\n#include \"NDSSystem.h\"\r\n\r\n// 7zip file extraction\r\n// NOTE: if you want to add support for opening files within archives to some part of DeSmuME,\r\n// consider using the higher-level interface provided by OpenArchive.h instead\r\n\r\nvoid InitDecoder();\r\nvoid CleanupDecoder();\r\nconst char* GetSupportedFormatsFilter();\r\n\r\n// simplest way of extracting a file after calling InitDecoder():\r\n// int size = ArchiveFile(filename).ExtractItem(0, buf, sizeof(buf));\r\n\r\nstruct ArchiveFile\r\n{\r\n\tArchiveFile(const char* filename);\r\n\tvirtual ~ArchiveFile();\r\n\r\n\tint GetNumItems();\r\n\tint GetItemSize(int item);\r\n\tconst char* GetItemName(int item);\r\n\tint ExtractItem(int item, unsigned char* outBuffer, int bufSize) const; // returns size, or 0 if failed\r\n\tint ExtractItem(int item, const char* outFilename) const;\r\n\r\n\tbool IsCompressed();\r\n\tconst char* GetArchiveTypeName();\r\n\r\nprotected:\r\n\tstruct ArchiveItem\r\n\t{\r\n\t\tint size;\r\n\t\tchar* name;\r\n\t};\r\n\tArchiveItem* m_items;\r\n\tint m_numItems;\r\n\tint m_typeIndex;\r\n\tchar* m_filename;\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/7zipstreams.h",
    "content": "// This file is (modified) from\r\n// FCEUX (2009)\r\n// FCE Ultra - NES/Famicom Emulator\r\n// Copyright (C) 2003 Xodnizel\r\n// \r\n// This program is free software; you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation; either version 2 of the License, or\r\n// (at your option) any later version.\r\n// \r\n// This program is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n// GNU General Public License for more details.\r\n// \r\n// You should have received a copy of the GNU General Public License\r\n// along with this program; if not, write to the Free Software\r\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n\r\n#ifndef _7ZIPSTREAMS_HEADER\r\n#define _7ZIPSTREAMS_HEADER\r\n\r\n#include \"7z/CPP/Common/MyCom.h\"\r\n\r\n#ifdef ANDROID\r\n#define UINT8 unsigned char\r\n#define UINT32 unsigned int\r\n#define SSTDMETHODCALLTYPE\r\n#define _stricmp strcasecmp\r\n#endif\r\n\r\nclass ICountedSequentialOutStream : public ISequentialOutStream\r\n{\r\npublic:\r\n\tvirtual UINT32 Size() const = 0;\r\n};\r\n\r\nclass SeqMemoryOutStream : public ICountedSequentialOutStream, private CMyUnknownImp\r\n{\r\n\tUINT8* const output;\r\n\tUINT32 pos;\r\n\tconst UINT32 size;\r\n\tULONG refCount;\r\n\r\n\tHRESULT STDMETHODCALLTYPE QueryInterface(REFGUID, void**)\r\n\t{\r\n\t\treturn E_NOINTERFACE;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE Write(const void* data, UInt32 length, UInt32* bytesWritten)\r\n\t{\r\n\t\tif (data != NULL || size == 0)\r\n\t\t{\r\n\t\t\t//assert(length <= size - pos);\r\n\r\n\t\t\tif (length > size - pos)\r\n\t\t\t\tlength = size - pos;\r\n\r\n\t\t\tif(data)\r\n\t\t\t\tmemcpy(output + pos, data, length);\r\n\t\t\tpos += length;\r\n\r\n\t\t\tif (bytesWritten)\r\n\t\t\t\t*bytesWritten = length;\r\n\r\n\t\t\treturn S_OK;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn E_INVALIDARG;\r\n\t\t}\r\n\t}\r\n\r\n\tMY_ADDREF_RELEASE\r\n\r\npublic:\r\n\r\n\tSeqMemoryOutStream(void* d, UINT32 s) : output((UINT8*)d), pos(0), size(s), refCount(0) {}\r\n\r\n\tvirtual ~SeqMemoryOutStream()\r\n\t{\r\n\t\tint a = 0;\r\n\t}\r\n\r\n\tUINT32 Size() const\r\n\t{\r\n\t\treturn pos;\r\n\t}\r\n};\r\n\r\nclass SeqFileOutStream : public ICountedSequentialOutStream, private CMyUnknownImp\r\n{\r\n\tFILE* file;\r\n\tUINT32 pos;\r\n\tULONG refCount;\r\n\r\n\tHRESULT STDMETHODCALLTYPE QueryInterface(REFGUID, void**)\r\n\t{\r\n\t\treturn E_NOINTERFACE;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE Write(const void* data, UInt32 length, UInt32* bytesWritten)\r\n\t{\r\n\t\tif(!file)\r\n\t\t\treturn E_FAIL;\r\n\r\n\t\tif (data != NULL)\r\n\t\t{\r\n\t\t\tint written = 0;\r\n\t\t\tif(data)\r\n\t\t\t\twritten = fwrite(data, 1, length, file);\r\n\r\n\t\t\tpos += written;\r\n\t\t\tif (bytesWritten)\r\n\t\t\t\t*bytesWritten = written;\r\n\r\n\t\t\treturn S_OK;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn E_INVALIDARG;\r\n\t\t}\r\n\t}\r\n\r\n\tMY_ADDREF_RELEASE\r\n\r\npublic:\r\n\r\n\tSeqFileOutStream(const char* outFilename) : pos(0), refCount(0)\r\n\t{\r\n\t\tfile = fopen(outFilename, \"wb\");\r\n\t}\r\n\tvirtual ~SeqFileOutStream()\r\n\t{\r\n\t\tif(file)\r\n\t\t\tfclose(file);\r\n\t}\r\n\r\n\tUINT32 Size() const\r\n\t{\r\n\t\treturn pos;\r\n\t}\r\n};\r\n\r\n\r\nclass OutStream : public IArchiveExtractCallback, private CMyUnknownImp\r\n{\r\n\tICountedSequentialOutStream* seqStream;\r\n\tconst UINT32 index;\r\n\tULONG refCount;\r\n\r\n\tHRESULT STDMETHODCALLTYPE QueryInterface(REFGUID, void**)\r\n\t{\r\n\t\treturn E_NOINTERFACE;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE PrepareOperation(Int32)\r\n\t{\r\n\t\treturn S_OK;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE SetTotal(UInt64)\r\n\t{\r\n\t\treturn S_OK;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE SetCompleted(const UInt64*)\r\n\t{\r\n\t\treturn S_OK;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE SetOperationResult(Int32)\r\n\t{\r\n\t\treturn S_OK;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE GetStream(UInt32 id, ISequentialOutStream** ptr, Int32 mode)\r\n\t{\r\n\t\tswitch (mode)\r\n\t\t{\r\n\t\t\tcase NArchive::NExtract::NAskMode::kExtract:\r\n\t\t\tcase NArchive::NExtract::NAskMode::kTest:\r\n\r\n\t\t\t\tif (id != index || ptr == NULL)\r\n\t\t\t\t\treturn S_FALSE;\r\n\t\t\t\telse\r\n\t\t\t\t\t*ptr = seqStream;\r\n\t\t\t// fall through\r\n\t\t\tcase NArchive::NExtract::NAskMode::kSkip:\r\n\t\t\t\treturn S_OK;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\treturn E_INVALIDARG;\r\n\t\t}\r\n\t}\r\n\r\n\tMY_ADDREF_RELEASE\r\n\r\npublic:\r\n\r\n\tOutStream(UINT32 index, void* data, UINT32 size) : index(index), refCount(0)\r\n\t{\r\n\t\tseqStream = new SeqMemoryOutStream(data, size);\r\n\t\tseqStream->AddRef();\r\n\t}\r\n\tOutStream(UINT32 index, const char* outFilename) : index(index), refCount(0)\r\n\t{\r\n\t\tseqStream = new SeqFileOutStream(outFilename);\r\n\t\tseqStream->AddRef();\r\n\t}\r\n\tvirtual ~OutStream()\r\n\t{\r\n\t\t//seqStream->Release(); // commented out because apparently IInArchive::Extract() calls Release one more time than it calls AddRef\r\n\t}\r\n\tUINT32 Size() const\r\n\t{\r\n\t\treturn seqStream->Size();\r\n\t}\r\n};\r\n\r\nclass InStream : public IInStream, private IStreamGetSize, private CMyUnknownImp\r\n{\r\n\tULONG refCount;\r\n\r\n\tHRESULT STDMETHODCALLTYPE QueryInterface(REFGUID, void**)\r\n\t{\r\n\t\treturn E_NOINTERFACE;\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE GetSize(UInt64* outSize)\r\n\t{\r\n\t\tif (outSize)\r\n\t\t{\r\n\t\t\t*outSize = size;\r\n\t\t\treturn S_OK;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn E_INVALIDARG;\r\n\t\t}\r\n\t}\r\n\r\n\tMY_ADDREF_RELEASE\r\n\r\nprotected:\r\n\r\n\tUINT32 size;\r\n\r\npublic:\r\n\r\n\texplicit InStream() : refCount(0) {}\r\n\tvirtual ~InStream() {}\r\n};\r\n\r\n\r\nclass InFileStream : public InStream\r\n{\r\npublic:\r\n\r\n\tvirtual ~InFileStream()\r\n\t{\r\n\t\tif(file)\r\n\t\t\tfclose(file);\r\n\t}\r\n\r\n\tFILE* file;\r\n\r\n\tInFileStream(const char* fname) : file(NULL)\r\n\t{\r\n\t\tfile = fopen(fname, \"rb\");\r\n\t\tif(file)\r\n\t\t{\r\n\t\t\tfseek(file, 0, SEEK_END);\r\n\t\t\tsize = ftell(file);\r\n\t\t\tfseek(file, 0, SEEK_SET);\r\n\t\t}\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE Read(void* data, UInt32 length, UInt32* bytesRead)\r\n\t{\r\n\t\tif(!file)\r\n\t\t\treturn E_FAIL;\r\n\r\n\t\tif (data != NULL || length == 0)\r\n\t\t{\r\n\t\t\tint read = fread(data, 1, length, file);\r\n\t\t\t\r\n\t\t\tif (bytesRead)\r\n\t\t\t\t*bytesRead = read;\r\n\r\n\t\t\treturn S_OK;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn E_INVALIDARG;\r\n\t\t}\r\n\t}\r\n\r\n\tHRESULT STDMETHODCALLTYPE Seek(Int64 offset, UInt32 origin, UInt64* pos)\r\n\t{\r\n\t\tif(!file)\r\n\t\t\treturn E_FAIL;\r\n\r\n\t\tif (origin < 3)\r\n\t\t{\r\n\t\t\tfseek(file, (long)offset, origin);\r\n\t\t\torigin = ftell(file);\r\n\r\n\t\t\tif (pos)\r\n\t\t\t\t*pos = origin;\r\n\r\n\t\t\treturn S_OK;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn E_INVALIDARG;\r\n\t\t}\r\n\t\r\n\t}\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/OpenArchive.cpp",
    "content": "/*\r\n\tCopyright (C) 2009 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"common.h\"\r\n#include \"main.h\"\r\n#include \"driver.h\"\r\n//#include <windows.h>\r\n#include <stdio.h>\r\n#include <errno.h>\r\n#include <string.h>\r\n#include <assert.h>\r\n#include <map>\r\n#include <vector>\r\n#include <algorithm>\r\n#include \"7zip.h\"\r\n//#include \"G_main.h\"\r\n//#include \"G_dsound.h\"\r\n//#include \"resource.h\"\r\n#include \"OpenArchive.h\"\r\n\r\nstatic char Str_Tmp[1024];\r\n\r\n#ifndef ANDROID\r\nLRESULT CALLBACK ArchiveFileChooser(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);\r\nstatic int s_archiveFileChooserResult = -1;\r\n\r\nstatic HWND s_parentHWND = NULL;\r\nvoid SetArchiveParentHWND(void* hwnd) { s_parentHWND = (HWND)hwnd; }\r\nstatic HWND GetArchiveParentHWND() { return s_parentHWND ? s_parentHWND : MainWindow->getHWnd(); }\r\n#else\r\n#include \"main.h\"\r\n#define _stricmp strcasecmp\r\n#define _strnicmp strncasecmp\r\nextern char androidTempPath[1024];\r\nvoid GetTempPath(int len, char* dest)\r\n{\r\n\tstrncpy(dest, androidTempPath, len);\r\n}\r\n#define timeGetTime GetTickCount\r\n#define _snprintf snprintf\r\n#define DWORD unsigned int\r\n#define _unlink unlink\r\n#endif\r\n\r\nstruct ArchiveFileChooserInfo\r\n{\r\n\tArchiveFileChooserInfo(ArchiveFile& theArchive, const char** ignoreExtensions, int& numIgnoreExtensions) : archive(theArchive)\r\n\t{\r\ntryagain:\r\n\t\tint numItems = archive.GetNumItems();\r\n\t\tfor(int i = 0; i < numItems; i++)\r\n\t\t{\r\n\t\t\tif(archive.GetItemSize(i))\r\n\t\t\t{\r\n\t\t\t\tconst char* name = archive.GetItemName(i);\r\n\t\t\t\tconst char* ext = strrchr(name, '.');\r\n\t\t\t\tbool ok = true;\r\n\t\t\t\tif(ext++)\r\n\t\t\t\t{\r\n\t\t\t\t\tfor(int j = 0; j < numIgnoreExtensions; j++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tconst char* ext2 = ignoreExtensions[j];\r\n\t\t\t\t\t\tconst char* wild = strchr(ext2, '*');\r\n\t\t\t\t\t\tif(!wild)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(!_stricmp(ext, ext2))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tok = false;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse // very limited (end only) wildcard support\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(!_strnicmp(ext, ext2, wild - ext2))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tok = false;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(ok)\r\n\t\t\t\t{\r\n\t\t\t\t\tArchiveFileChooserInfo::FileInfo* fi = new ArchiveFileChooserInfo::FileInfo();\r\n\t\t\t\t\tfi->name = name;\r\n\t\t\t\t\tfi->itemIndex = i;\r\n\t\t\t\t\tfiles.push_back(fi);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(files.empty() && numIgnoreExtensions)\r\n\t\t{\r\n\t\t\t// try again without any exclusions if we excluded everything in the archive\r\n\t\t\tnumIgnoreExtensions = 0;\r\n\t\t\tgoto tryagain;\r\n\t\t}\r\n\r\n\t\t// strip away prefix paths that are common to all the files\r\n\t\tbool stripping = !files.empty();\r\n\t\twhile(stripping)\r\n\t\t{\r\n\t\t\tconst char* firstName = files[0]->name.c_str();\r\n\t\t\tconst char* slash = strchr(firstName, '\\\\');\r\n\t\t\tconst char* slash2 = strchr(firstName, '/');\r\n\t\t\tslash = std::max(slash, slash2);\r\n\t\t\tif(!slash++)\r\n\t\t\t\tbreak;\r\n\t\t\tfor(size_t i = 1; i < files.size(); i++)\r\n\t\t\t\tif(strncmp(firstName, files[i]->name.c_str(), slash - firstName))\r\n\t\t\t\t\tstripping = false;\r\n\t\t\tif(stripping)\r\n\t\t\t\tfor(size_t i = 0; i < files.size(); i++)\r\n\t\t\t\t\tfiles[i]->name = files[i]->name.substr(slash - firstName, files[i]->name.length() - (slash - firstName));\r\n\t\t}\r\n\r\n\t\t// sort by filename\r\n\t\t//std::sort(files.begin(), files.end(), FileInfo::Sort);\r\n\t}\r\n\r\n//protected:\r\n\r\n\tstruct FileInfo\r\n\t{\r\n\t\tstd::string name;\r\n\t\tint itemIndex;\r\n\t\t\r\n\t\tstatic bool Sort(const FileInfo& elem1, const FileInfo& elem2)\r\n\t\t{\r\n\t\t\tint comp = elem1.name.compare(elem2.name);\r\n\t\t\treturn comp ? (comp < 0) : (elem1.itemIndex < elem2.itemIndex);\r\n\t\t}\r\n\t};\r\n\r\n\tArchiveFile& archive;\r\n\tstd::vector<FileInfo*> files;\r\n};\r\n\r\nint ChooseItemFromArchive(ArchiveFile& archive, bool autoChooseIfOnly1, const char** ignoreExtensions, int numIgnoreExtensions)\r\n{\r\n\tint prevNumIgnoreExtensions = numIgnoreExtensions;\r\n\r\n\t// prepare a list of files to choose from the archive\r\n\tArchiveFileChooserInfo info (archive, ignoreExtensions, numIgnoreExtensions);\r\n\r\n\t// based on our list, decide which item in the archive to choose\r\n\r\n\t// check if there's nothing\r\n\tif(info.files.size() < 1)\r\n\t{\r\n//\t\tDialogsOpen++;\r\n#ifndef ANDROID\r\n\t\tMessageBox(GetArchiveParentHWND(), \"The archive is either empty or encrypted.\", \"Nothing to load!\", MB_OK | MB_ICONWARNING);\r\n#endif\r\n//\t\tDialogsOpen--;\r\n\t\treturn -1;\r\n\t}\r\n\r\n\t// if there's only 1 item, choose it\r\n\tif(info.files.size() == 1 && autoChooseIfOnly1 && numIgnoreExtensions == prevNumIgnoreExtensions)\r\n\t\treturn info.files[0]->itemIndex;\r\n\r\n#ifndef ANDROID\r\n\t// bring up a dialog to choose the index if there's more than 1\r\n\tDialogBoxParam(hAppInst, MAKEINTRESOURCE(IDD_ARCHIVEFILECHOOSER), GetArchiveParentHWND(), (DLGPROC) ArchiveFileChooser,(LPARAM) &info);\r\n\treturn s_archiveFileChooserResult;\r\n#else\r\n\treturn -1; //TODO: Call back into Java and ask the user\r\n#endif\r\n}\r\n\r\n\r\n\r\n#define DEFAULT_EXTENSION \".tmp\"\r\n#define DEFAULT_CATEGORY \"desmume\"\r\n\r\nstatic struct TempFiles\r\n{\r\n\tstruct TemporaryFile\r\n\t{\r\n\t\r\n\t\r\n\t\tTemporaryFile(const char* path)\r\n\t\t{\r\n\t\t\tchar tempPath [1024];\r\n\t\t\tGetTempPath(1024, tempPath);\r\n\t\t\tstrcat(tempPath, path);\r\n\t\t\tstrcpy(filename, tempPath);\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tTemporaryFile(const char* cat, const char* ext)\r\n\t\t{\r\n\t\t\tif(!ext || !*ext) ext = DEFAULT_EXTENSION;\r\n\t\t\tif(!cat || !*cat) cat = DEFAULT_CATEGORY;\r\n\t\t\tcategory = cat;\r\n\r\n\t\t\tchar tempPath [1024];\r\n\t\t\tGetTempPath(1024, tempPath);\r\n\t\t\t//GetTempFileName(tempPath, cat, 0, filename, ext); // alas\r\n\r\n\t\t\tchar*const fname = tempPath + strlen(tempPath);\r\n\t\t\tunsigned short start = (unsigned short)(timeGetTime() & 0xFFFF);\r\n\t\t\tunsigned short n = start + 1;\r\n\t\t\twhile(n != start)\r\n\t\t\t{\r\n\t\t\t\t_snprintf(fname, 1024 - (fname - tempPath), \"%s%04X%s\", cat, n, ext);\r\n\t\t\t\tFILE* file = fopen(tempPath, \"wb\");\r\n\t\t\t\tif(file)\r\n\t\t\t\t{\r\n\t\t\t\t\t// mark the temporary file as read-only and (whatever this does) temporary\r\n#ifndef ANDROID //putting it in the cache is the same as this. we can also use that java temp file deletion if necessary\r\n\t\t\t\t\tDWORD attributes = GetFileAttributes(tempPath);\r\n\t\t\t\t\tattributes |= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_TEMPORARY;\r\n\t\t\t\t\tSetFileAttributes(tempPath, attributes);\r\n#endif\r\n\t\t\t\t\tfclose(file);\r\n\r\n\t\t\t\t\t// add it to our registry of files that need to be deleted, in case we fail to terminate properly\r\n\t\t\t\t\tTempFiles::AddEntryToGarbageRegistry(tempPath);\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tn++;\r\n\t\t\t}\r\n\t\t\tstrcpy(filename, tempPath);\r\n\t\t}\r\n\t\tTemporaryFile(const TemporaryFile& copy)\r\n\t\t{\r\n\t\t\tstrcpy(filename, copy.filename);\r\n\t\t\tcategory = copy.category;\r\n\t\t}\r\n\t\tTemporaryFile()\r\n\t\t{\r\n\t\t\tfilename[0] = 0;\r\n\t\t\tcategory[0] = 0;\r\n\t\t}\r\n\t\tbool Delete(bool returnFalseOnRegistryRemovalFailure=false)\r\n\t\t{\r\n\t\t\tif(!*filename)\r\n\t\t\t\treturn true; // guess it already didn't exist\r\n\r\n\t\t\t// remove read-only attribute so Windows will let us delete it\r\n\t\t\t// (our temporary files are read-only to discourage other apps from tampering)\r\n#ifndef ANDROID\r\n\t\t\tDWORD attributes = GetFileAttributes(filename);\r\n\t\t\tif(attributes & FILE_ATTRIBUTE_READONLY)\r\n\t\t\t\tSetFileAttributes(filename, attributes & ~FILE_ATTRIBUTE_READONLY);\r\n#endif\r\n\r\n\t\t\tif(_unlink(filename) == 0 || errno != EACCES)\r\n\t\t\t{\r\n\t\t\t\t// remove it from our registry of files that need to be deleted, to reduce accumulation\r\n\t\t\t\tbool removed = TempFiles::RemoveEntryFromGarbageRegistry(filename);\r\n\r\n\t\t\t\t*filename = '\\0';\r\n\t\t\t\treturn removed || !returnFalseOnRegistryRemovalFailure; // successfully deleted or already didn't exist, return true unless registry removal failure notification was requested and that failed\r\n\t\t\t}\r\n\r\n#ifndef ANDROID\r\n\t\t\t// restore read-only if we couldn't delete it (not sure if this ever succeeds or matters though)\r\n\t\t\tif(attributes & FILE_ATTRIBUTE_READONLY)\r\n\t\t\t\tSetFileAttributes(filename, attributes);\r\n#endif\r\n\r\n\t\t\treturn false; // failed to delete read-only or in-use file\r\n\t\t}\r\n\t\tchar filename [MAX_PATH];\r\n\t\tstd::string category;\r\n\t};\r\n\r\n\tstd::vector<TemporaryFile> tempFiles;\r\n\r\n\tconst char* GetFile(const char* category, const char* extension)\r\n\t{\r\n\t\ttempFiles.push_back(TemporaryFile(category, extension));\r\n\t\treturn tempFiles.back().filename;\r\n\t}\r\n\t\r\n\tconst char* GetFile(const char* path)\r\n\t{\r\n\t\ttempFiles.push_back(TemporaryFile(path));\r\n\t\treturn tempFiles.back().filename;\r\n\t}\r\n\r\n\tvoid ReleaseFile(const char* filename)\r\n\t{\r\n\t\tfor(int i = (int)tempFiles.size()-1; i >= 0; i--)\r\n\t\t{\r\n\t\t\tif(!strcmp(filename, tempFiles[i].filename))\r\n\t\t\t{\r\n\t\t\t\tif(tempFiles[i].Delete())\r\n\t\t\t\t\ttempFiles.erase(tempFiles.begin() + i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvoid ReleaseCategory(const char* cat, const char* exceptionFilename)\r\n\t{\r\n\t\tfor(int i = (int)tempFiles.size()-1; i >= 0; i--)\r\n\t\t{\r\n\t\t\tif(!strcmp(cat, tempFiles[i].category.c_str()) &&\r\n\t\t\t\t(!exceptionFilename ||\r\n\t\t\t\t  strcmp(exceptionFilename, tempFiles[i].filename)))\r\n\t\t\t{\r\n\t\t\t\tif(tempFiles[i].Delete())\r\n\t\t\t\t\ttempFiles.erase(tempFiles.begin() + i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// delete all temporary files on shutdown\r\n\t~TempFiles()\r\n\t{\r\n\t\tfor(size_t i = 0; i < tempFiles.size(); i++)\r\n\t\t{\r\n\t\t\ttempFiles[i].Delete();\r\n\t\t}\r\n\r\n\t\tTempFiles::CleanOutGarbageRegistry();\r\n\t}\r\n\r\n\t// run this on startup to delete any files that we failed to delete last time\r\n\t// in case we crashed or were forcefully terminated\r\n\tTempFiles()\r\n\t{\r\n\t\tTempFiles::CleanOutGarbageRegistry();\r\n\t}\r\n\r\n\tstatic void AddEntryToGarbageRegistry(const char* filename)\r\n\t{\r\n\t//If temporary files become a problem, we can register them in the Java layer here and delete them on close\r\n#ifndef ANDROID\r\n\t\tchar gbgFile[1024];\r\n\t\tGetTempPath(1024, gbgFile);\r\n\t\tstrcat(gbgFile, \"DesmumeTempFileRecords\");\r\n\t\tchar key[64];\r\n\t\tint i = 0;\r\n\t\twhile(true)\r\n\t\t{\r\n\t\t\tsprintf(key, \"File%d\", i);\r\n\t\t\tGetPrivateProfileString(\"Files\", key, \"\", Str_Tmp, 1024, gbgFile);\r\n\t\t\tif(!*Str_Tmp)\r\n\t\t\t\tbreak;\r\n\t\t\ti++;\r\n\t\t}\r\n\t\tWritePrivateProfileString(\"Files\", key, filename, gbgFile);\r\n#endif\r\n\t}\r\n\tstatic bool RemoveEntryFromGarbageRegistry(const char* filename)\r\n\t{\r\n#ifndef ANDROID\r\n\t\tchar gbgFile[1024];\r\n\t\tGetTempPath(1024, gbgFile);\r\n\t\tstrcat(gbgFile, \"DesmumeTempFileRecords\");\r\n\t\tchar key[64];\r\n\t\tint i = 0;\r\n\t\tint deleteSlot = -1;\r\n\t\twhile(true)\r\n\t\t{\r\n\t\t\tsprintf(key, \"File%d\", i);\r\n\t\t\tGetPrivateProfileString(\"Files\", key, \"\", Str_Tmp, 1024, gbgFile);\r\n\t\t\tif(!*Str_Tmp)\r\n\t\t\t\tbreak;\r\n\t\t\tif(!strcmp(Str_Tmp, filename))\r\n\t\t\t\tdeleteSlot = i;\r\n\t\t\ti++;\r\n\t\t}\r\n\t\t--i;\r\n\t\tif(i >= 0 && deleteSlot >= 0)\r\n\t\t{\r\n\t\t\tif(i != deleteSlot)\r\n\t\t\t{\r\n\t\t\t\tsprintf(key, \"File%d\", i);\r\n\t\t\t\tGetPrivateProfileString(\"Files\", key, \"\", Str_Tmp, 1024, gbgFile);\r\n\t\t\t\tsprintf(key, \"File%d\", deleteSlot);\r\n\t\t\t\tWritePrivateProfileString(\"Files\", key, Str_Tmp, gbgFile);\r\n\t\t\t}\r\n\t\t\tsprintf(key, \"File%d\", i);\r\n\t\t\tif(0 == WritePrivateProfileString(\"Files\", key, NULL, gbgFile))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t\tif(i <= 0 && deleteSlot == 0)\r\n\t\t\t_unlink(gbgFile);\r\n#endif\r\n\t\treturn true;\r\n\t}\r\n\r\nprivate:\r\n\tstatic void CleanOutGarbageRegistry()\r\n\t{\r\n#ifndef ANDROID\r\n\t\tchar gbgFile[1024 + 48];\r\n\t\tGetTempPath(1024, gbgFile);\r\n\t\tstrcat(gbgFile, \"DesmumeTempFileRecords\");\r\n\r\n\t\tchar key[64];\r\n\t\tint i = 0;\r\n\t\twhile(true)\r\n\t\t{\r\n\t\t\tsprintf(key, \"File%d\", i);\r\n\t\t\tGetPrivateProfileString(\"Files\", key, \"\", Str_Tmp, 1024, gbgFile);\r\n\t\t\tif(!*Str_Tmp)\r\n\t\t\t\tbreak;\r\n\t\t\tTemporaryFile temp;\r\n\t\t\tstrcpy(temp.filename, Str_Tmp);\r\n\t\t\tif(!temp.Delete(true))\r\n\t\t\t\ti++;\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n} s_tempFiles;\r\n\r\n\r\nconst char* GetTempFile(const char* category, const char* extension)\r\n{\r\n\treturn s_tempFiles.GetFile(category, extension);\r\n}\r\nvoid ReleaseTempFile(const char* filename)\r\n{\r\n\ts_tempFiles.ReleaseFile(filename);\r\n}\r\nvoid ReleaseTempFileCategory(const char* cat, const char* exceptionFilename)\r\n{\r\n\tif(!cat || !*cat) cat = DEFAULT_CATEGORY;\r\n\ts_tempFiles.ReleaseCategory(cat, exceptionFilename);\r\n}\r\n\r\n\r\n\r\n// example input Name:          \"C:\\games.zip\"\r\n// example output LogicalName:  \"C:\\games.zip|Sonic.nds\"\r\n// example output PhysicalName: \"C:\\Documents and Settings\\User\\Local Settings\\Temp\\Desmume\\dec3.tmp\"\r\n// assumes arguments are character buffers with 1024 bytes each\r\nbool ObtainFile(const char* Name, char *const & LogicalName, char *const & PhysicalName, const char* category, const char** ignoreExtensions, int numIgnoreExtensions)\r\n{\r\n\tchar ArchivePaths [1024];\r\n\tstrcpy(LogicalName, Name);\r\n\tstrcpy(PhysicalName, Name);\r\n\tstrcpy(ArchivePaths, Name);\r\n\tchar* bar = strchr(ArchivePaths, '|');\r\n\tif(bar)\r\n\t{\r\n\t\tPhysicalName[bar - ArchivePaths] = 0; // doesn't belong in the physical name\r\n\t\tLogicalName[bar - ArchivePaths] = 0; // we'll reconstruct the logical name as we go\r\n\t\t*bar++ = 0; // bar becomes the next logical archive path component\r\n\t}\r\n\r\n\twhile(true)\r\n\t{\r\n\t\tArchiveFile archive (PhysicalName);\r\n\t\tif(!archive.IsCompressed())\r\n\t\t{\r\n\t\t\treturn archive.GetNumItems() > 0;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tint item = -1;\r\n\t\t\tbool forceManual = false;\r\n\t\t\tif(bar && *bar) // try following the in-archive part of the logical path\r\n\t\t\t{\r\n\t\t\t\tchar* bar2 = strchr(bar, '|');\r\n\t\t\t\tif(bar2) *bar2++ = 0;\r\n\t\t\t\tint numItems = archive.GetNumItems();\r\n\t\t\t\tfor(int i = 0; i < numItems; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(archive.GetItemSize(i))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tconst char* itemName = archive.GetItemName(i);\r\n\t\t\t\t\t\tif(!_stricmp(itemName, bar))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\titem = i; // match found, now we'll auto-follow the path\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(item < 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tforceManual = true; // we don't want it choosing something else without user permission\r\n\t\t\t\t\tbar = NULL; // remaining archive path is invalid\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tbar = bar2; // advance to next archive path part\r\n\t\t\t}\r\n\t\t\tif(item < 0)\r\n\t\t\t\titem = ChooseItemFromArchive(archive, !forceManual, ignoreExtensions, numIgnoreExtensions);\r\n\r\n\t\t\tconst char* TempFileName = s_tempFiles.GetFile(archive.GetItemName(item));\r\n\t\t\tif(!archive.ExtractItem(item, TempFileName))\r\n\t\t\t\ts_tempFiles.ReleaseFile(TempFileName);\r\n\t\t\tLOGI(\"Extracting temporary ROM to %s\", TempFileName);\r\n\t\t\ts_tempFiles.ReleaseFile(PhysicalName);\r\n\t\t\tstrcpy(PhysicalName, TempFileName);\r\n\t\t\t//_snprintf(LogicalName + strlen(LogicalName), 1024 - (strlen(LogicalName)+1), \"|%s\", archive.GetItemName(item));\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\nstruct ControlLayoutInfo\r\n{\r\n\tint controlID;\r\n\t\r\n\tenum LayoutType // what to do when the containing window resizes\r\n\t{\r\n\t\tNONE, // leave the control where it was\r\n\t\tRESIZE_END, // resize the control\r\n\t\tMOVE_START, // move the control\r\n\t};\r\n\tLayoutType horizontalLayout;\r\n\tLayoutType verticalLayout;\r\n};\r\nstruct ControlLayoutState\r\n{\r\n\tint x,y,width,height;\r\n\tbool valid;\r\n\tControlLayoutState() : valid(false) {}\r\n};\r\n\r\n#ifndef ANDROID\r\nstatic ControlLayoutInfo controlLayoutInfos [] = {\r\n\t{IDC_LIST1, ControlLayoutInfo::RESIZE_END, ControlLayoutInfo::RESIZE_END},\r\n\t{IDOK,      ControlLayoutInfo::MOVE_START, ControlLayoutInfo::MOVE_START},\r\n\t{IDCANCEL, ControlLayoutInfo::MOVE_START, ControlLayoutInfo::MOVE_START},\r\n};\r\nstatic const int numControlLayoutInfos = sizeof(controlLayoutInfos)/sizeof(*controlLayoutInfos);\r\n\r\nstatic ControlLayoutState s_layoutState [numControlLayoutInfos];\r\nstatic int s_windowWidth = 182, s_windowHeight = 113;\r\n\r\n\r\n\r\nLRESULT CALLBACK ArchiveFileChooser(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tRECT r, r2;\r\n\tint dx1, dy1, dx2, dy2;\r\n\tstatic std::map<int,int> s_listToItemsMap;\r\n\r\n\tswitch(uMsg)\r\n\t{\r\n\t\tcase WM_INITDIALOG:\r\n\t\t{\r\n//\t\t\tDialogsOpen++;\r\n//\t\t\tClear_Sound_Buffer();\r\n\t\t\t\r\n//\t\t\tif(Full_Screen)\r\n//\t\t\t{\r\n//\t\t\t\twhile (ShowCursor(false) >= 0);\r\n//\t\t\t\twhile (ShowCursor(true) < 0);\r\n//\t\t\t}\r\n\r\n\t\t\tGetWindowRect(MainWindow->getHWnd(), &r);\r\n\t\t\tdx1 = (r.right - r.left) / 2;\r\n\t\t\tdy1 = (r.bottom - r.top) / 2;\r\n\r\n\t\t\tGetWindowRect(hDlg, &r2);\r\n\t\t\tdx2 = (r2.right - r2.left) / 2;\r\n\t\t\tdy2 = (r2.bottom - r2.top) / 2;\r\n\r\n\t\t\t//SetWindowPos(hDlg, NULL, max(0, r.left + (dx1 - dx2)), max(0, r.top + (dy1 - dy2)), NULL, NULL, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);\r\n\t\t\tSetWindowPos(hDlg, NULL, r.left, r.top, NULL, NULL, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);\r\n\r\n\t\t\tArchiveFileChooserInfo& info = *(ArchiveFileChooserInfo*)lParam;\r\n\t\t\tstd::vector<ArchiveFileChooserInfo::FileInfo>& files = info.files;\r\n\t\t\tArchiveFile& archive = info.archive;\r\n\r\n\t\t\tstd::string title = \"Choose File in \";\r\n\t\t\ttitle += archive.GetArchiveTypeName();\r\n\t\t\ttitle += \" Archive\";\r\n\t\t\tSetWindowText(hDlg, title.c_str());\r\n\r\n\t\t\t// populate list\r\n\t\t\tfor(size_t i = 0; i < files.size(); i++)\r\n\t\t\t{\r\n\t\t\t\tint listIndex = SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, (WPARAM) 0, (LONG) (LPTSTR) files[i].name.c_str());\r\n\t\t\t\ts_listToItemsMap[listIndex] = files[i].itemIndex;\r\n\t\t\t}\r\n\r\n\t\t\tSendDlgItemMessage(hDlg, IDC_LIST1, LB_SETCURSEL, (WPARAM) 0, (LPARAM) 0);\r\n\r\n\t\t\t{\r\n\t\t\t\tRECT r3;\r\n\t\t\t\tGetClientRect(hDlg, &r3);\r\n\t\t\t\ts_windowWidth = r3.right - r3.left;\r\n\t\t\t\ts_windowHeight = r3.bottom - r3.top;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t}\tbreak;\r\n\r\n\t\tcase WM_SIZING:\r\n\t\t{\r\n\t\t\t// enforce a minimum window size\r\n\r\n\t\t\tLPRECT r = (LPRECT) lParam;\r\n\t\t\tint minimumWidth = 281;\r\n\t\t\tint minimumHeight = 117;\r\n\t\t\tif(r->right - r->left < minimumWidth)\r\n\t\t\t\tif(wParam == WMSZ_LEFT || wParam == WMSZ_TOPLEFT || wParam == WMSZ_BOTTOMLEFT)\r\n\t\t\t\t\tr->left = r->right - minimumWidth;\r\n\t\t\t\telse\r\n\t\t\t\t\tr->right = r->left + minimumWidth;\r\n\t\t\tif(r->bottom - r->top < minimumHeight)\r\n\t\t\t\tif(wParam == WMSZ_TOP || wParam == WMSZ_TOPLEFT || wParam == WMSZ_TOPRIGHT)\r\n\t\t\t\t\tr->top = r->bottom - minimumHeight;\r\n\t\t\t\telse\r\n\t\t\t\t\tr->bottom = r->top + minimumHeight;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\r\n\t\tcase WM_SIZE:\r\n\t\t{\r\n\t\t\t// resize or move controls in the window as necessary when the window is resized\r\n\r\n\t\t\tint prevDlgWidth = s_windowWidth;\r\n\t\t\tint prevDlgHeight = s_windowHeight;\r\n\r\n\t\t\tint dlgWidth = LOWORD(lParam);\r\n\t\t\tint dlgHeight = HIWORD(lParam);\r\n\r\n\t\t\tint deltaWidth = dlgWidth - prevDlgWidth;\r\n\t\t\tint deltaHeight = dlgHeight - prevDlgHeight;\r\n\r\n\t\t\tfor(int i = 0; i < numControlLayoutInfos; i++)\r\n\t\t\t{\r\n\t\t\t\tControlLayoutInfo layoutInfo = controlLayoutInfos[i];\r\n\t\t\t\tControlLayoutState& layoutState = s_layoutState[i];\r\n\r\n\t\t\t\tHWND hCtrl = GetDlgItem(hDlg,layoutInfo.controlID);\r\n\r\n\t\t\t\tint x,y,width,height;\r\n\t\t\t\tif(layoutState.valid)\r\n\t\t\t\t{\r\n\t\t\t\t\tx = layoutState.x;\r\n\t\t\t\t\ty = layoutState.y;\r\n\t\t\t\t\twidth = layoutState.width;\r\n\t\t\t\t\theight = layoutState.height;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tRECT r;\r\n\t\t\t\t\tGetWindowRect(hCtrl, &r);\r\n\t\t\t\t\tPOINT p = {r.left, r.top};\r\n\t\t\t\t\tScreenToClient(hDlg, &p);\r\n\t\t\t\t\tx = p.x;\r\n\t\t\t\t\ty = p.y;\r\n\t\t\t\t\twidth = r.right - r.left;\r\n\t\t\t\t\theight = r.bottom - r.top;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tswitch(layoutInfo.horizontalLayout)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase ControlLayoutInfo::RESIZE_END: width += deltaWidth; break;\r\n\t\t\t\t\tcase ControlLayoutInfo::MOVE_START: x += deltaWidth; break;\r\n\t\t\t\t\tdefault: break;\r\n\t\t\t\t}\r\n\t\t\t\tswitch(layoutInfo.verticalLayout)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase ControlLayoutInfo::RESIZE_END: height += deltaHeight; break;\r\n\t\t\t\t\tcase ControlLayoutInfo::MOVE_START: y += deltaHeight; break;\r\n\t\t\t\t\tdefault: break;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tSetWindowPos(hCtrl, 0, x,y, width,height, 0);\r\n\r\n\t\t\t\tlayoutState.x = x;\r\n\t\t\t\tlayoutState.y = y;\r\n\t\t\t\tlayoutState.width = width;\r\n\t\t\t\tlayoutState.height = height;\r\n\t\t\t\tlayoutState.valid = true;\r\n\t\t\t}\r\n\r\n\t\t\ts_windowWidth = dlgWidth;\r\n\t\t\ts_windowHeight = dlgHeight;\r\n\r\n\t\t\tRedrawWindow(hDlg, NULL, NULL, RDW_INVALIDATE);\r\n\t\t}\r\n\t\tbreak;\r\n\r\n\t\tcase WM_COMMAND:\r\n\t\t\tswitch(LOWORD(wParam))\r\n\t\t\t{\r\n\t\t\t\tcase IDC_LIST1:\r\n\t\t\t\t\tif(HIWORD(wParam) == LBN_DBLCLK)\r\n\t\t\t\t\t\tSendMessage(hDlg, WM_COMMAND, IDOK, 0);\r\n\t\t\t\t\treturn TRUE;\r\n\r\n\t\t\t\tcase IDOK:\r\n\t\t\t\t{\t\r\n\t\t\t\t\tint listIndex = SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r\n\t\t\t\t\ts_archiveFileChooserResult = s_listToItemsMap[listIndex];\r\n\t\t\t\t\ts_listToItemsMap.clear();\r\n//\t\t\t\t\tif(Full_Screen)\r\n//\t\t\t\t\t{\r\n//\t\t\t\t\t\twhile (ShowCursor(true) < 0);\r\n//\t\t\t\t\t\twhile (ShowCursor(false) >= 0);\r\n//\t\t\t\t\t}\r\n//\t\t\t\t\tDialogsOpen--;\r\n\t\t\t\t\tEndDialog(hDlg, false);\r\n\t\t\t\t}\treturn TRUE;\r\n\r\n\t\t\t\tcase IDCANCEL:\r\n\t\t\t\t\ts_archiveFileChooserResult = -1;\r\n\t\t\t\t\ts_listToItemsMap.clear();\r\n//\t\t\t\t\tif(Full_Screen)\r\n//\t\t\t\t\t{\r\n//\t\t\t\t\t\twhile (ShowCursor(true) < 0);\r\n//\t\t\t\t\t\twhile (ShowCursor(false) >= 0);\r\n//\t\t\t\t\t}\r\n//\t\t\t\t\tDialogsOpen--;\r\n\t\t\t\t\tEndDialog(hDlg, false);\r\n\t\t\t\t\treturn TRUE;\r\n\t\t\t}\r\n\r\n\t\tcase WM_CLOSE:\r\n\t\t\ts_archiveFileChooserResult = -1;\r\n\t\t\ts_listToItemsMap.clear();\r\n//\t\t\tif(Full_Screen)\r\n//\t\t\t{\r\n//\t\t\t\twhile (ShowCursor(true) < 0);\r\n//\t\t\t\twhile (ShowCursor(false) >= 0);\r\n//\t\t\t}\r\n//\t\t\tDialogsOpen--;\r\n\t\t\tEndDialog(hDlg, false);\r\n\t\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn false;\r\n}\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/OpenArchive.h",
    "content": "/*\r\n\tCopyright (C) 2009 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n// for retrieving files from archives and/or managing temporary files\r\n\r\n#ifndef OPENARCHIVE_HEADER\r\n#define OPENARCHIVE_HEADER\r\n\r\n#include \"7zip.h\"\r\n\r\n// ObtainFile()\r\n// this is the main, high-level function for opening possibly-compressed files.\r\n// you don't need to check whether the file is compressed beforehand,\r\n// this function will figure that out and work correctly either way.\r\n// it also does the work of bringing up a within-archive file selector dialog if necessary,\r\n// which even allows navigating to a file within an archive that's within the archive.\r\n// the output PhysicalName is the filename of an uncompressed file\r\n// for you to load with fopen or whatever,\r\n// unless the function fails (or is cancelled) in which case it will return false.\r\n// example input Name:          \"C:\\games.zip\"\r\n// example output LogicalName:  \"C:\\games.zip|Sonic.nds\"\r\n// example output PhysicalName: \"C:\\Documents and Settings\\User\\Local Settings\\Temp\\DeSmuME\\rom7A37.smd\"\r\n// assumes the three name arguments are unique character buffers with exactly 1024 bytes each\r\nbool ObtainFile(const char* Name, char *const & LogicalName, char *const & PhysicalName, const char* category=NULL, const char** ignoreExtensions=NULL, int numIgnoreExtensions=0);\r\n\r\n// ReleaseTempFileCategory()\r\n// this is for deleting the temporary files that ObtainFile() can create.\r\n// using it is optional because they will auto-delete on proper shutdown of the program,\r\n// but it's nice to be able to clean up the files as early as possible.\r\n// pass in the same \"category\" string you passed into ObtainFile(),\r\n// and this will delete all files of that category.\r\n// you can optionally specify one filename to not delete even if its category matches.\r\n// note that any still-open files cannot be deleted yet and will be skipped.\r\nvoid ReleaseTempFileCategory(const char* category, const char* exceptionFilename=NULL);\r\n\r\n// sets the parent window of subsequent archive selector dialogs\r\n// NULL resets this to the default (main emulator window)\r\nvoid SetArchiveParentHWND(void* hwnd=NULL);\r\n\r\n// the rest of these are more internal utility functions,\r\n// but they could be generally useful outside of that\r\nconst char* GetTempFile(const char* category=NULL, const char* extension=NULL); // creates a temp file and returns a path to it.  extension if any should include the '.'\r\nvoid ReleaseTempFile(const char* filename); // deletes a particular temporary file, by filename\r\nint ChooseItemFromArchive(ArchiveFile& archive, bool autoChooseIfOnly1=true, const char** ignoreExtensions=0, int numIgnoreExtensions=0); // gets an index to a file within an already-open archive, using the file chooser if there's more than one choice\r\n\r\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/draw.cpp",
    "content": "#include \"main.h\"\r\n#include \"../NDSSystem.h\"\r\n#include \"video.h\"\r\n#include <android/bitmap.h>\r\n\r\nextern VideoInfo video;\r\n\r\n#define DOBITMAPIMPL \tif(pixelFormat == ANDROID_BITMAP_FORMAT_RGBA_8888) \\\r\n\t{ \\\r\n\t\tu32* src = (u32*)pixels; \\\r\n\t\tsrc += (verticalOffset * (rotate ? height : width)); \\\r\n\t\tif(video.currentfilter == VideoInfo::NONE) \\\r\n\t\t{ \\\r\n\t\t\tif(rotate) \\\r\n\t\t\t{ \\\r\n\t\t\t\tfor(int y = 0 ; y < height ; ++y) \\\r\n\t\t\t\t{ \\\r\n\t\t\t\t\tu32* destline = (u32*)dest; \\\r\n\t\t\t\t\tu32* srccol = src + (height - y - 1); \\\r\n\t\t\t\t\tfor(int x = 0 ; x < width ; ++x)  \\\r\n\t\t\t\t\t{ \\\r\n\t\t\t\t\t\t*destline++ = *srccol; \\\r\n\t\t\t\t\t\tsrccol += height; \\\r\n\t\t\t\t\t} \\\r\n\t\t\t\t\tdest += stride; \\\r\n\t\t\t\t} \\\r\n\t\t\t} \\\r\n\t\t\telse \\\r\n\t\t\t{ \\\r\n\t\t\t\tif(stride == width * sizeof(u32)) \\\r\n\t\t\t\t\tmemcpy(dest, src, width * height * sizeof(u32)); \\\r\n\t\t\t\telse \\\r\n\t\t\t\t{ \\\r\n\t\t\t\t\tfor(int y = 0 ; y < height ; ++y) \\\r\n\t\t\t\t\t{ \\\r\n\t\t\t\t\t\tmemcpy(dest, &src[y * width], width * sizeof(u32)); \\\r\n\t\t\t\t\t\tdest += stride; \\\r\n\t\t\t\t\t} \\\r\n\t\t\t\t} \\\r\n\t\t\t} \\\r\n\t\t} \\\r\n\t\telse \\\r\n\t\t{ \\\r\n\t\t\tif(rotate) \\\r\n\t\t\t{ \\\r\n\t\t\t\tfor(int y = 0 ; y < height ; ++y) \\\r\n\t\t\t\t{ \\\r\n\t\t\t\t\tu32* destline = (u32*)dest; \\\r\n\t\t\t\t\tu32* srccol = src + (height - y - 1); \\\r\n\t\t\t\t\tfor(int x = 0 ; x < width ; ++x)  \\\r\n\t\t\t\t\t{ \\\r\n\t\t\t\t\t\t*destline++ = 0xFF000000 | *srccol; \\\r\n\t\t\t\t\t\tsrccol += height; \\\r\n\t\t\t\t\t} \\\r\n\t\t\t\t\tdest += stride; \\\r\n\t\t\t\t} \\\r\n\t\t\t} \\\r\n\t\t\telse \\\r\n\t\t\t{ \\\r\n\t\t\t\tfor(int y = 0 ; y < height ; ++y) \\\r\n\t\t\t\t{ \\\r\n\t\t\t\t\tu32* destline = (u32*)dest; \\\r\n\t\t\t\t\tfor(int x = 0 ; x < width ; ++x) \\\r\n\t\t\t\t\t\t*destline++ = 0xFF000000 | *src++; \\\r\n\t\t\t\t\tdest += stride; \\\r\n\t\t\t\t} \\\r\n\t\t\t} \\\r\n\t\t} \\\r\n\t} \\\r\n\telse \\\r\n\t{ \\\r\n\t\tu16* src = (u16*)pixels; \\\r\n\t\tsrc += (verticalOffset * (rotate ? height : width)); \\\r\n\t\tif(rotate) \\\r\n\t\t{ \\\r\n\t\t\tfor(int y = 0 ; y < height ; ++y) \\\r\n\t\t\t{ \\\r\n\t\t\t\tu16* destline = (u16*)dest; \\\r\n\t\t\t\tu16* srccol = src + (height - y - 1); \\\r\n\t\t\t\tfor(int x = 0 ; x < width ; ++x)  \\\r\n\t\t\t\t{ \\\r\n\t\t\t\t\t*destline++ = *srccol; \\\r\n\t\t\t\t\tsrccol += height; \\\r\n\t\t\t\t} \\\r\n\t\t\t\tdest += stride; \\\r\n\t\t\t} \\\r\n\t\t} \\\r\n\t\telse \\\r\n\t\t{ \\\r\n\t\t\tif(stride == width * sizeof(u16)) \\\r\n\t\t\t\tmemcpy(dest, src, width * height * sizeof(u16)); \\\r\n\t\t\telse \\\r\n\t\t\t{ \\\r\n\t\t\t\tfor(int y = 0 ; y < height ; ++y) \\\r\n\t\t\t\t{ \\\r\n\t\t\t\t\tmemcpy(dest, &src[y * width], width * sizeof(u16)); \\\r\n\t\t\t\t\tdest += stride; \\\r\n\t\t\t\t} \\\r\n\t\t\t} \\\r\n\t\t} \\\r\n\t}\r\n\r\n//Since the loops will have constant numbers of iterations at compile times and the pointers are restricted, gcc should be able to use the NEON instruction set nicely here\r\ntemplate<int width, int height> void doBitmapDrawTemplate(u8* __restrict__ pixels, u8* __restrict__ dest, int stride, int pixelFormat, int verticalOffset, bool rotate)\r\n{\r\n\tDOBITMAPIMPL\r\n}\r\n\r\nvoid doBitmapDrawStandard(u8* __restrict__ pixels, u8* __restrict__ dest, int width, int height, int stride, int pixelFormat, int verticalOffset, bool rotate)\r\n{\r\n\tDOBITMAPIMPL\r\n}\r\n\t\r\nvoid doBitmapDraw(u8* pixels, u8* dest, int width, int height, int stride, int pixelFormat, int verticalOffset, bool rotate)\r\n{\r\n\tif(width == 256 && height == 192)\r\n\t\tdoBitmapDrawTemplate<256,192>(pixels,dest,stride,pixelFormat,verticalOffset,rotate);\r\n\telse\r\n\t\tdoBitmapDrawStandard(pixels,dest,width,height,stride,pixelFormat,verticalOffset,rotate);\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/Android.mk",
    "content": "# Makefile for exophase ARM on ARM JIT\r\n\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\n\r\nLOCAL_MODULE \t\t:= libexophasejit\r\nLOCAL_ARM_MODE \t\t:= arm\r\nLOCAL_CFLAGS\t\t:= -DHAVE_JIT -DUSE_EXOPHASEJIT\r\nLOCAL_C_INCLUDES\t:= \t$(LOCAL_PATH)/../ \\\r\n\t\t\t\t\t\t$(LOCAL_PATH)/../../\r\nLOCAL_SRC_FILES\t\t:= \tarm_stub.S\\\r\n\t\t\t\t\t\tcpu_threaded.cpp\\\r\n\t\t\t\t\t\tcpu.cpp\\\r\n\t\t\t\t\t\tdynarec_linker.cpp\\\r\n\t\t\t\t\t\twarm.cpp\\\r\n\t\t\t\t\t\texophasejit.cpp\r\n\t\t\t\t\t\t\r\nLOCAL_LDLIBS \t\t:= -llog\r\n\r\ninclude $(BUILD_STATIC_LIBRARY)\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/arm_codegen.h",
    "content": "/*\n * arm-codegen.h\n *\n * Copyright (c) 2002 Wild West Software\n * Copyright (c) 2001, 2002 Sergey Chaban\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software,\n * and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n\n#ifndef ARM_CG_H\n#define ARM_CG_H\n\ntypedef unsigned long arminstr_t;\ntypedef unsigned long armword_t;\n\n/* Helper functions */\n/*void arm_emit_std_prologue(cg_segment_t * segment, unsigned int local_size);\nvoid arm_emit_std_epilogue(cg_segment_t * segment, unsigned int local_size, int pop_regs);\nvoid arm_emit_lean_prologue(cg_segment_t * segment, unsigned int local_size, int push_regs);\nint arm_is_power_of_2(armword_t val);\nint calc_arm_mov_const_shift(armword_t val);\nint is_arm_const(armword_t val);\nint arm_bsf(armword_t val);\nvoid arm_mov_reg_imm32_cond(cg_segment_t * segment, int reg, armword_t imm32, int cond);\nvoid arm_mov_reg_imm32(cg_segment_t * segment, int reg, armword_t imm32);*/\n\n\n//*** check for correctness ***\n//extern u32* x86Ptr;\n\nvoid write_to_file(u32 val);\n\n//#define write32(val) { *(u32 *)translation_ptr = val; write_to_file(*(u32 *)translation_ptr); translation_ptr += 4; }\n\n//#define write32(val) { if( g_PcWatch.IsReset == RECRESET_OFF ) { *(u32*)pCurPage->pCodeCurrent = val; pCurPage->pCodeCurrent +=4; if( (u32)pCurPage->pCodeCurrent >= (u32)pCurPage->pCodeEnd ) { g_PcWatch.IsReset = RECRESET_START; recResize(); g_PcWatch.IsReset = RECRESET_END; return; } }else{ if( g_PcWatch.IsReset == RECRESET_END ){ g_PcWatch.IsReset = RECRESET_OFF; return; } } }\n//#define write32_ret(val) { if( g_PcWatch.IsReset == RECRESET_OFF ) { *(u32*)pCurPage->pCodeCurrent = val; pCurPage->pCodeCurrent +=4; if( (u32)pCurPage->pCodeCurrent >= (u32)pCurPage->pCodeEnd ) { g_PcWatch.IsReset = RECRESET_START; recResize(); g_PcWatch.IsReset = RECRESET_END; return 0; } }else{ if( g_PcWatch.IsReset == RECRESET_END ){ g_PcWatch.IsReset = RECRESET_OFF; return 0; } } }\n//#define write32(val) { *(u32*)pCurPage->pCodeCurrent = val; pCurPage->pCodeCurrent +=4; }\n\n#define ARM_EMIT(p, i) write32(i);\n//write32(i);\n/*{ *(u32*)translation_ptr = (i); translation_ptr += 4; } */\n\n#if defined(GIZMONDO) || defined(POCKETPC) /* Implemented but not working right yet for PPC */\n\n// --------------------------------------------------------------------------\n// These declarations for coredll are extracted from platform builder\n// source code\n// --------------------------------------------------------------------------\n\n/* Flags for CacheSync/CacheRangeFlush */\n#define CACHE_SYNC_DISCARD      0x001   /* write back & discard all cached data */\n#define CACHE_SYNC_INSTRUCTIONS 0x002   /* discard all cached instructions */\n#define CACHE_SYNC_WRITEBACK    0x004   /* write back but don't discard data cache*/\n#define CACHE_SYNC_FLUSH_I_TLB  0x008   /* flush I-TLB */\n#define CACHE_SYNC_FLUSH_D_TLB  0x010   /* flush D-TLB */\n#define CACHE_SYNC_FLUSH_TLB    (CACHE_SYNC_FLUSH_I_TLB|CACHE_SYNC_FLUSH_D_TLB)    /* flush all TLB */\n#define CACHE_SYNC_L2_WRITEBACK 0x020   /* write-back L2 Cache */\n#define CACHE_SYNC_L2_DISCARD   0x040   /* discard L2 Cache */\n\n#define CACHE_SYNC_ALL          0x07F   /* sync and discard everything in Cache/TLB */\n\nextern \"C\" {\n  void CacheSync(int flags);\n}\n#define CLEAR_INSN_CACHE(BEG, END) CacheSync(CACHE_SYNC_INSTRUCTIONS | CACHE_SYNC_WRITEBACK);\n\n#else\n\n#if 0\n#define CLEAR_INSN_CACHE(BEG, END)                  \\\n{                                 \\\n  register unsigned long _beg __asm (\"a1\") = (unsigned long) (BEG); \\\n  register unsigned long _end __asm (\"a2\") = (unsigned long) (END); \\\n  register unsigned long _flg __asm (\"a3\") = 0;           \\\n  register unsigned long _scno __asm (\"r7\") = 0xf0002;        \\\n  __asm __volatile (\"swi 0x9f0002   @ sys_cacheflush\"     \\\n        : \"=r\" (_beg)                     \\\n        : \"0\" (_beg), \"r\" (_end), \"r\" (_flg), \"r\" (_scno));   \\\n}\n\n#endif\n\n#endif\n\n#if defined(_MSC_VER) && !defined(ARM_NOIASM)\n# define ARM_IASM(_expr) __easfdmit (_expr)\n#else\n# define ARM_IASM(_expr)\n#endif\n\n/* even_scale = rot << 1 */\n#define ARM_SCALE(imm8, even_scale) ( ((imm8) >> (even_scale)) | ((imm8) << (32 - even_scale)) )\n\n\n\ntypedef enum {\n  ARMREG_R0 = 0,\n  ARMREG_R1,\n  ARMREG_R2,\n  ARMREG_R3,\n  ARMREG_R4,\n  ARMREG_R5,\n  ARMREG_R6,\n  ARMREG_R7,\n  ARMREG_R8,\n  ARMREG_R9,\n  ARMREG_R10,\n  ARMREG_R11,\n  ARMREG_R12,\n  ARMREG_R13,\n  ARMREG_R14,\n  ARMREG_R15,\n\n\n  /* aliases */\n  /* args */\n  ARMREG_A1 = ARMREG_R0,\n  ARMREG_A2 = ARMREG_R1,\n  ARMREG_A3 = ARMREG_R2,\n  ARMREG_A4 = ARMREG_R3,\n\n  /* local vars */\n  ARMREG_V1 = ARMREG_R4,\n  ARMREG_V2 = ARMREG_R5,\n  ARMREG_V3 = ARMREG_R6,\n  ARMREG_V4 = ARMREG_R7,\n  ARMREG_V5 = ARMREG_R8,\n  ARMREG_V6 = ARMREG_R9,\n  ARMREG_V7 = ARMREG_R10,\n\n  ARMREG_FP = ARMREG_R11,\n  ARMREG_IP = ARMREG_R12,\n  ARMREG_SP = ARMREG_R13,\n  ARMREG_LR = ARMREG_R14,\n  ARMREG_PC = ARMREG_R15,\n\n  /* FPU */\n  ARMREG_F0 = 0,\n  ARMREG_F1,\n  ARMREG_F2,\n  ARMREG_F3,\n  ARMREG_F4,\n  ARMREG_F5,\n  ARMREG_F6,\n  ARMREG_F7,\n\n  /* co-processor */\n  ARMREG_CR0 = 0,\n  ARMREG_CR1,\n  ARMREG_CR2,\n  ARMREG_CR3,\n  ARMREG_CR4,\n  ARMREG_CR5,\n  ARMREG_CR6,\n  ARMREG_CR7,\n  ARMREG_CR8,\n  ARMREG_CR9,\n  ARMREG_CR10,\n  ARMREG_CR11,\n  ARMREG_CR12,\n  ARMREG_CR13,\n  ARMREG_CR14,\n  ARMREG_CR15,\n\n  /* XScale: acc0 on CP0 */\n  ARMREG_ACC0 = ARMREG_CR0,\n\n  ARMREG_MAX = ARMREG_R15,\n\n  /* flags */\n  ARMREG_CPSR = 0,\n  ARMREG_SPSR = 1\n} ARMReg;\n\ntypedef enum {\n  ARM_FCONST_0_0 = 8,\n  ARM_FCONST_1_0,\n  ARM_FCONST_2_0,\n  ARM_FCONST_3_0,\n  ARM_FCONST_4_0,\n  ARM_FCONST_5_0,\n  ARM_FCONST_0_5,\n  ARM_FCONST_10_0\n} ARMFPUConst;\n\n/* number of argument registers */\n#define ARM_NUM_ARG_REGS 4\n\n/* number of non-argument registers */\n#define ARM_NUM_VARIABLE_REGS 7\n\n/* number of global registers */\n#define ARM_NUM_GLOBAL_REGS 5\n\n/* bitvector for all argument regs (A1-A4) */\n#define ARM_ALL_ARG_REGS \\\n  (1 << ARMREG_A1) | (1 << ARMREG_A2) | (1 << ARMREG_A3) | (1 << ARMREG_A4)\n\n\ntypedef enum {\n  ARMCOND_EQ = 0x0,          /* Equal; Z = 1 */\n  ARMCOND_NE = 0x1,          /* Not equal, or unordered; Z = 0 */\n  ARMCOND_CS = 0x2,          /* Carry set; C = 1 */\n  ARMCOND_HS = ARMCOND_CS,   /* Unsigned higher or same; */\n  ARMCOND_CC = 0x3,          /* Carry clear; C = 0 */\n  ARMCOND_LO = ARMCOND_CC,   /* Unsigned lower */\n  ARMCOND_MI = 0x4,          /* Negative; N = 1 */\n  ARMCOND_PL = 0x5,          /* Positive or zero; N = 0 */\n  ARMCOND_VS = 0x6,          /* Overflow; V = 1 */\n  ARMCOND_VC = 0x7,          /* No overflow; V = 0 */\n  ARMCOND_HI = 0x8,          /* Unsigned higher; C = 1 && Z = 0 */\n  ARMCOND_LS = 0x9,          /* Unsigned lower or same; C = 0 || Z = 1 */\n  ARMCOND_GE = 0xA,          /* Signed greater than or equal; N = V */\n  ARMCOND_LT = 0xB,          /* Signed less than; N != V */\n  ARMCOND_GT = 0xC,          /* Signed greater than; Z = 0 && N = V */\n  ARMCOND_LE = 0xD,          /* Signed less than or equal; Z = 1 && N != V */\n  ARMCOND_AL = 0xE,          /* Always */\n  ARMCOND_NV = 0xF,          /* Never */\n\n  ARMCOND_SHIFT = 28\n} ARMCond;\n\n#define ARMCOND_MASK (ARMCOND_NV << ARMCOND_SHIFT)\n\n#define ARM_DEF_COND(cond) (((cond) & 0xF) << ARMCOND_SHIFT)\n\n\n\ntypedef enum {\n  ARMSHIFT_LSL = 0,\n  ARMSHIFT_LSR = 1,\n  ARMSHIFT_ASR = 2,\n  ARMSHIFT_ROR = 3,\n\n  ARMSHIFT_ASL = ARMSHIFT_LSL\n  /* rrx = (ror, 1) */\n} ARMShiftType;\n\n\ntypedef struct {\n  armword_t PSR_c : 8;\n  armword_t PSR_x : 8;\n  armword_t PSR_s : 8;\n  armword_t PSR_f : 8;\n} ARMPSR;\n\ntypedef enum {\n  ARMOP_AND = 0x0,\n  ARMOP_EOR = 0x1,\n  ARMOP_SUB = 0x2,\n  ARMOP_RSB = 0x3,\n  ARMOP_ADD = 0x4,\n  ARMOP_ADC = 0x5,\n  ARMOP_SBC = 0x6,\n  ARMOP_RSC = 0x7,\n  ARMOP_TST = 0x8,\n  ARMOP_TEQ = 0x9,\n  ARMOP_CMP = 0xa,\n  ARMOP_CMN = 0xb,\n  ARMOP_ORR = 0xc,\n  ARMOP_MOV = 0xd,\n  ARMOP_BIC = 0xe,\n  ARMOP_MVN = 0xf,\n\n\n  /* not really opcodes */\n\n  ARMOP_STR = 0x0,\n  ARMOP_LDR = 0x1,\n\n  /* ARM2+ */\n  ARMOP_MUL   = 0x0, /* Rd := Rm*Rs */\n  ARMOP_MLA   = 0x1, /* Rd := (Rm*Rs)+Rn */\n\n  /* ARM3M+ */\n  ARMOP_UMULL = 0x4,\n  ARMOP_UMLAL = 0x5,\n  ARMOP_SMULL = 0x6,\n  ARMOP_SMLAL = 0x7,\n\n  /* for data transfers with register offset */\n  ARM_UP   = 1,\n  ARM_DOWN = 0\n} ARMOpcode;\n\ntypedef enum {\n  THUMBOP_AND  = 0,\n  THUMBOP_EOR  = 1,\n  THUMBOP_LSL  = 2,\n  THUMBOP_LSR  = 3,\n  THUMBOP_ASR  = 4,\n  THUMBOP_ADC  = 5,\n  THUMBOP_SBC  = 6,\n  THUMBOP_ROR  = 7,\n  THUMBOP_TST  = 8,\n  THUMBOP_NEG  = 9,\n  THUMBOP_CMP  = 10,\n  THUMBOP_CMN  = 11,\n  THUMBOP_ORR  = 12,\n  THUMBOP_MUL  = 13,\n  THUMBOP_BIC  = 14,\n  THUMBOP_MVN  = 15,\n  THUMBOP_MOV  = 16,\n  THUMBOP_CMPI = 17,\n  THUMBOP_ADD  = 18,\n  THUMBOP_SUB  = 19,\n  THUMBOP_CMPH = 19,\n  THUMBOP_MOVH = 20\n} ThumbOpcode;\n\n\n/* Generic form - all ARM instructions are conditional. */\ntypedef struct {\n  arminstr_t icode : 28;\n  arminstr_t cond  :  4;\n} ARMInstrGeneric;\n\n\n\n/* Branch or Branch with Link instructions. */\ntypedef struct {\n  arminstr_t offset : 24;\n  arminstr_t link   :  1;\n  arminstr_t tag    :  3; /* 1 0 1 */\n  arminstr_t cond   :  4;\n} ARMInstrBR;\n\n#define ARM_BR_ID 5\n#define ARM_BR_MASK 7 << 25\n#define ARM_BR_TAG ARM_BR_ID << 25\n\n#define ARM_DEF_BR(offs, l, cond) ((offs) | ((l) << 24) | (ARM_BR_TAG) | (cond << ARMCOND_SHIFT))\n\n/* branch */\n#define ARM_B_COND(p, cond, offset) ARM_EMIT(p, ARM_DEF_BR(offset, 0, cond))\n#define ARM_B(p, offs) ARM_B_COND((p), ARMCOND_AL, (offs))\n/* branch with link */\n#define ARM_BL_COND(p, cond, offset) ARM_EMIT(p, ARM_DEF_BR(offset, 1, cond))\n#define ARM_BL(p, offs) ARM_BL_COND((p), ARMCOND_AL, (offs))\n\n/* branch to register and exchange */\n#define ARM_BX_COND(p, cond, reg) ARM_EMIT(p, ((cond << ARMCOND_SHIFT) | (reg) | 0x12FFF10))\n#define ARM_BX(p, reg) ARM_BX_COND((p), ARMCOND_AL, (reg))\n\n/* branch to register with link */\n#define ARM_BLX_COND(p, cond, reg) ARM_EMIT(p, ((cond << ARMCOND_SHIFT) | (reg) | 0x12FFF30))\n#define ARM_BLX(p, reg) ARM_BLX_COND((p), ARMCOND_AL, (reg))\n\n\n/* Data Processing Instructions - there are 3 types. */\n\ntypedef struct {\n  arminstr_t imm : 8;\n  arminstr_t rot : 4;\n} ARMDPI_op2_imm;\n\ntypedef struct {\n  arminstr_t rm   : 4;\n  arminstr_t tag  : 1; /* 0 - immediate shift, 1 - reg shift */\n  arminstr_t type : 2; /* shift type - logical, arithmetic, rotate */\n} ARMDPI_op2_reg_shift;\n\n\n/* op2 is reg shift by imm */\ntypedef union {\n  ARMDPI_op2_reg_shift r2;\n  struct {\n    arminstr_t _dummy_r2 : 7;\n    arminstr_t shift : 5;\n  } imm;\n} ARMDPI_op2_reg_imm;\n\n/* op2 is reg shift by reg */\ntypedef union {\n  ARMDPI_op2_reg_shift r2;\n  struct {\n    arminstr_t _dummy_r2 : 7;\n    arminstr_t pad       : 1; /* always 0, to differentiate from HXFER etc. */\n    arminstr_t rs        : 4;\n  } reg;\n} ARMDPI_op2_reg_reg;\n\n/* Data processing instrs */\ntypedef union {\n  ARMDPI_op2_imm op2_imm;\n\n  ARMDPI_op2_reg_shift op2_reg;\n  ARMDPI_op2_reg_imm op2_reg_imm;\n  ARMDPI_op2_reg_reg op2_reg_reg;\n\n  struct {\n    arminstr_t op2    : 12; /* raw operand 2 */\n    arminstr_t rd     :  4; /* destination reg */\n    arminstr_t rn     :  4; /* first operand reg */\n    arminstr_t s      :  1; /* S-bit controls PSR update */\n    arminstr_t opcode :  4; /* arithmetic/logic operation */\n    arminstr_t type   :  1; /* type of op2, 0 = register, 1 = immediate */\n    arminstr_t tag    :  2; /* 0 0 */\n    arminstr_t cond   :  4;\n  } all;\n} ARMInstrDPI;\n\n#define ARM_DPI_ID 0\n#define ARM_DPI_MASK 3 << 26\n#define ARM_DPI_TAG ARM_DPI_ID << 26\n\n#define ARM_DEF_DPI_IMM_COND(imm8, rot, rd, rn, s, op, cond) \\\n  ((imm8) & 0xFF)      | \\\n  (((rot) & 0xF) << 8) | \\\n  ((rd) << 12)         | \\\n  ((rn) << 16)         | \\\n  ((s) << 20)          | \\\n  ((op) << 21)         | \\\n  (1 << 25)            | \\\n  (ARM_DPI_TAG)        | \\\n  ARM_DEF_COND(cond)\n\n\n#define ARM_DEF_DPI_IMM(imm8, rot, rd, rn, s, op) \\\n  ARM_DEF_DPI_IMM_COND(imm8, rot, rd, rn, s, op, ARMCOND_AL)\n\n/* codegen */\n#define ARM_DPIOP_REG_IMM8ROT_COND(p, op, rd, rn, imm8, rot, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_IMM_COND((imm8), ((rot) >> 1), (rd), (rn), 0, (op), cond))\n#define ARM_DPIOP_S_REG_IMM8ROT_COND(p, op, rd, rn, imm8, rot, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_IMM_COND((imm8), ((rot) >> 1), (rd), (rn), 1, (op), cond))\n\n/* inline */\n#define ARM_IASM_DPIOP_REG_IMM8ROT_COND(p, op, rd, rn, imm8, rot, cond) \\\n  ARM_IASM(ARM_DEF_DPI_IMM_COND((imm8), ((rot) >> 1), (rd), (rn), 0, (op), cond))\n#define ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(p, op, rd, rn, imm8, rot, cond) \\\n  ARM_IASM(ARM_DEF_DPI_IMM_COND((imm8), ((rot) >> 1), (rd), (rn), 1, (op), cond))\n\n\n\n#define ARM_DEF_DPI_REG_IMMSHIFT_COND(rm, shift_type, imm_shift, rd, rn, s, op, cond) \\\n  (rm)                        | \\\n  ((shift_type & 3) << 5)     | \\\n  (((imm_shift) & 0x1F) << 7) | \\\n  ((rd) << 12)                | \\\n  ((rn) << 16)                | \\\n  ((s) << 20)                 | \\\n  ((op) << 21)                | \\\n  (ARM_DPI_TAG)               | \\\n  ARM_DEF_COND(cond)\n\n/* codegen */\n#define ARM_DPIOP_REG_IMMSHIFT_COND(p, op, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), shift_type, imm_shift, (rd), (rn), 0, (op), cond))\n\n#define ARM_DPIOP_S_REG_IMMSHIFT_COND(p, op, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), shift_type, imm_shift, (rd), (rn), 1, (op), cond))\n\n#define ARM_DPIOP_REG_REG_COND(p, op, rd, rn, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), ARMSHIFT_LSL, 0, (rd), (rn), 0, (op), cond))\n\n#define ARM_DPIOP_S_REG_REG_COND(p, op, rd, rn, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), ARMSHIFT_LSL, 0, (rd), (rn), 1, (op), cond))\n\n/* inline */\n#define ARM_IASM_DPIOP_REG_IMMSHIFT_COND(p, op, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM(ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), shift_type, imm_shift, (rd), (rn), 0, (op), cond))\n\n#define ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(p, op, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM(ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), shift_type, imm_shift, (rd), (rn), 1, (op), cond))\n\n#define ARM_IASM_DPIOP_REG_REG_COND(p, op, rd, rn, rm, cond) \\\n  ARM_IASM(ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), ARMSHIFT_LSL, 0, (rd), (rn), 0, (op), cond))\n\n#define ARM_IASM_DPIOP_S_REG_REG_COND(p, op, rd, rn, rm, cond) \\\n  ARM_IASM_EMIT(ARM_DEF_DPI_REG_IMMSHIFT_COND((rm), ARMSHIFT_LSL, 0, (rd), (rn), 1, (op), cond))\n\n\n/* Rd := Rn op (Rm shift_type Rs) */\n#define ARM_DEF_DPI_REG_REGSHIFT_COND(rm, shift_type, rs, rd, rn, s, op, cond) \\\n  (rm)                        | \\\n  (1 << 4)                    | \\\n  ((shift_type & 3) << 5)     | \\\n  ((rs) << 8)                 | \\\n  ((rd) << 12)                | \\\n  ((rn) << 16)                | \\\n  ((s) << 20)                 | \\\n  ((op) << 21)                | \\\n  (ARM_DPI_TAG)               | \\\n  ARM_DEF_COND(cond)\n\n/* codegen */\n#define ARM_DPIOP_REG_REGSHIFT_COND(p, op, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_REG_REGSHIFT_COND((rm), shift_type, (rs), (rd), (rn), 0, (op), cond))\n\n#define ARM_DPIOP_S_REG_REGSHIFT_COND(p, op, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_DPI_REG_REGSHIFT_COND((rm), shift_type, (rs), (rd), (rn), 1, (op), cond))\n\n/* inline */\n#define ARM_IASM_DPIOP_REG_REGSHIFT_COND(p, op, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM(ARM_DEF_DPI_REG_REGSHIFT_COND((rm), shift_type, (rs), (rd), (rn), 0, (op), cond))\n\n#define ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(p, op, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM(ARM_DEF_DPI_REG_REGSHIFT_COND((rm), shift_type, (rs), (rd), (rn), 1, (op), cond))\n\n\n\n/* Multiple register transfer. */\ntypedef struct {\n  arminstr_t reg_list : 16; /* bitfield */\n  arminstr_t rn       :  4; /* base reg */\n  arminstr_t ls       :  1; /* load(1)/store(0) */\n  arminstr_t wb       :  1; /* write-back \"!\" */\n  arminstr_t s        :  1; /* restore PSR, force user bit */\n  arminstr_t u        :  1; /* up/down */\n  arminstr_t p        :  1; /* pre(1)/post(0) index */\n  arminstr_t tag      :  3; /* 1 0 0 */\n  arminstr_t cond     :  4;\n} ARMInstrMRT;\n\n#define ARM_MRT_ID 4\n#define ARM_MRT_MASK 7 << 25\n#define ARM_MRT_TAG ARM_MRT_ID << 25\n\n#define ARM_DEF_MRT(regs, rn, l, w, s, u, p, cond) \\\n  (regs)        | \\\n  (rn << 16)    | \\\n  (l << 20)     | \\\n  (w << 21)     | \\\n  (s << 22)     | \\\n  (u << 23)     | \\\n  (p << 24)     | \\\n  (ARM_MRT_TAG) | \\\n  ARM_DEF_COND(cond)\n\n#define ARM_STMDB(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 0, 0, 0, 0, 1, ARMCOND_AL))\n#define ARM_LDMDB(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 1, 0, 0, 0, 1, ARMCOND_AL))\n#define ARM_STMDB_WB(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 0, 1, 0, 0, 1, ARMCOND_AL))\n#define ARM_LDMIA_WB(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 1, 1, 0, 1, 0, ARMCOND_AL))\n#define ARM_LDMIA(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 1, 0, 0, 1, 0, ARMCOND_AL))\n#define ARM_STMIA(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 0, 0, 0, 1, 0, ARMCOND_AL))\n#define ARM_STMIA_WB(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 0, 1, 0, 1, 0, ARMCOND_AL))\n\n#define ARM_LDMIA_WB_PC_S(p, rbase, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, rbase, 1, 1, 1, 1, 0, ARMCOND_AL))\n\n/* THUMB\n#define ARM_POP_OP(p) ARM_EMIT(p, 0xFF01BD17)\n#define ARM_PUSH_OP(p) ARM_EMIT(p, 0xFF02B497)\n*/\n\n/* stmdb sp!, {regs} */\n#define ARM_PUSH(p, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, ARMREG_SP, 0, 1, 0, 0, 1, ARMCOND_AL))\n#define ARM_IASM_PUSH(regs) ARM_IASM(ARM_DEF_MRT(regs, ARMREG_SP, 0, 1, 0, 0, 1, ARMCOND_AL))\n\n/* ldmia sp!, {regs} */\n#define ARM_POP(p, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, ARMREG_SP, 1, 1, 0, 1, 0, ARMCOND_AL))\n#define ARM_IASM_POP(regs) ARM_IASM_EMIT(ARM_DEF_MRT(regs, ARMREG_SP, 1, 1, 0, 1, 0, ARMCOND_AL))\n\n/* ldmia sp, {regs} ; (no write-back) */\n#define ARM_POP_NWB(p, regs) ARM_EMIT(p, ARM_DEF_MRT(regs, ARMREG_SP, 1, 0, 0, 1, 0, ARMCOND_AL))\n#define ARM_IASM_POP_NWB(regs) ARM_IASM_EMIT(ARM_DEF_MRT(regs, ARMREG_SP, 1, 0, 0, 1, 0, ARMCOND_AL))\n\n#define ARM_PUSH1(p, r1) ARM_PUSH(p, (1 << r1))\n#define ARM_PUSH2(p, r1, r2) ARM_PUSH(p, (1 << r1) | (1 << r2))\n#define ARM_PUSH3(p, r1, r2, r3) ARM_PUSH(p, (1 << r1) | (1 << r2) | (1 << r3))\n#define ARM_PUSH4(p, r1, r2, r3, r4) ARM_PUSH(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4))\n#define ARM_PUSH5(p, r1, r2, r3, r4, r5) ARM_PUSH(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5))\n#define ARM_PUSH6(p, r1, r2, r3, r4, r5, r6) ARM_PUSH(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6))\n#define ARM_PUSH7(p, r1, r2, r3, r4, r5, r6, r7) ARM_PUSH(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6) | (1 << r7))\n#define ARM_PUSH8(p, r1, r2, r3, r4, r5, r6, r7, r8) ARM_PUSH(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6) | (1 << r7) | (1 << r8))\n#define ARM_PUSH9(p, r1, r2, r3, r4, r5, r6, r7, r8, r9) ARM_PUSH(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6) | (1 << r7) | (1 << r8) | (1 << r9))\n\n#define ARM_POP9(p, r1, r2, r3, r4, r5, r6, r7, r8, r9) ARM_POP(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6) | (1 << r7) | (1 << r8) | (1 << r9))\n#define ARM_POP8(p, r1, r2, r3, r4, r5, r6, r7, r8) ARM_POP(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6) | (1 << r7) | (1 << r8))\n#define ARM_POP7(p, r1, r2, r3, r4, r5, r6, r7) ARM_POP(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6) | (1 << r7))\n#define ARM_POP6(p, r1, r2, r3, r4, r5, r6) ARM_POP(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5) | (1 << r6))\n#define ARM_POP5(p, r1, r2, r3, r4, r5) ARM_POP(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4) | (1 << r5))\n#define ARM_POP4(p, r1, r2, r3, r4) ARM_POP(p, (1 << r1) | (1 << r2) | (1 << r3) | (1 << r4))\n#define ARM_POP3(p, r1, r2, r3) ARM_POP(p, (1 << r1) | (1 << r2) | (1 << r3))\n#define ARM_POP2(p, r1, r2) ARM_POP(p, (1 << r1) | (1 << r2))\n#define ARM_POP1(p, r1) ARM_POP(p, (1 << r1))\n\n\n/* Multiply instructions */\ntypedef struct {\n  arminstr_t rm     : 4;\n  arminstr_t tag2   : 4;   /* 9 */\n  arminstr_t rs     : 4;\n  arminstr_t rn     : 4;\n  arminstr_t rd     : 4;\n  arminstr_t s      : 1;\n  arminstr_t opcode : 3;\n  arminstr_t tag    : 4;\n  arminstr_t cond   : 4;\n} ARMInstrMul;\n\n#define ARM_MUL_ID 0\n#define ARM_MUL_ID2 9\n#define ARM_MUL_MASK ((0xF << 24) | (0xF << 4))\n#define ARM_MUL_TAG ((ARM_MUL_ID << 24) | (ARM_MUL_ID2 << 4))\n\n#define ARM_DEF_MUL_COND(op, rd, rm, rs, rn, s, cond) \\\n  (rm)               | \\\n  ((rs) << 8)        | \\\n  ((rn) << 12)       | \\\n  ((rd) << 16)       | \\\n  (((s) & 1) << 20)  | \\\n  (((op) & 7) << 21) | \\\n  ARM_MUL_TAG        | \\\n  ARM_DEF_COND(cond)\n\n/* Rd := (Rm * Rs)[31:0]; 32 x 32 -> 32 */\n#define ARM_MUL_COND(p, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_MUL, rd, rm, rs, 0, 0, cond))\n#define ARM_MUL(p, rd, rm, rs) \\\n  ARM_MUL_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_MULS_COND(p, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_MUL, rd, rm, rs, 0, 1, cond))\n#define ARM_MULS(p, rd, rm, rs) \\\n  ARM_MULS_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_MUL_REG_REG(p, rd, rm, rs) ARM_MUL(p, rd, rm, rs)\n#define ARM_MULS_REG_REG(p, rd, rm, rs) ARM_MULS(p, rd, rm, rs)\n\n/* inline */\n#define ARM_IASM_MUL_COND(rd, rm, rs, cond) \\\n  ARM_IASM_EMIT(ARM_DEF_MUL_COND(ARMOP_MUL, rd, rm, rs, 0, 0, cond))\n#define ARM_IASM_MUL(rd, rm, rs) \\\n  ARM_IASM_MUL_COND(rd, rm, rs, ARMCOND_AL)\n#define ARM_IASM_MULS_COND(rd, rm, rs, cond) \\\n  ARM_IASM_EMIT(ARM_DEF_MUL_COND(ARMOP_MUL, rd, rm, rs, 0, 1, cond))\n#define ARM_IASM_MULS(rd, rm, rs) \\\n  ARM_IASM_MULS_COND(rd, rm, rs, ARMCOND_AL)\n\n\n/* Rd := (Rm * Rs) + Rn; 32x32+32->32 */\n#define ARM_MLA_COND(p, rd, rm, rs, rn, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_MLA, rd, rm, rs, rn, 0, cond))\n#define ARM_MLA(p, rd, rm, rs, rn) \\\n  ARM_MLA_COND(p, rd, rm, rs, rn, ARMCOND_AL)\n#define ARM_MLAS_COND(p, rd, rm, rs, rn, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_MLA, rd, rm, rs, rn, 1, cond))\n#define ARM_MLAS(p, rd, rm, rs, rn) \\\n  ARM_MLAS_COND(p, rd, rm, rs, rn, ARMCOND_AL)\n\n/* inline */\n#define ARM_IASM_MLA_COND(rd, rm, rs, rn, cond) \\\n  ARM_IASM_EMIT(ARM_DEF_MUL_COND(ARMOP_MLA, rd, rm, rs, rn, 0, cond))\n#define ARM_IASM_MLA(rd, rm, rs, rn) \\\n  ARM_IASM_MLA_COND(rd, rm, rs, rn, ARMCOND_AL)\n#define ARM_IASM_MLAS_COND(rd, rm, rs, rn, cond) \\\n  ARM_IASM_EMIT(ARM_DEF_MUL_COND(ARMOP_MLA, rd, rm, rs, rn, 1, cond))\n#define ARM_IASM_MLAS(rd, rm, rs, rn) \\\n  ARM_IASM_MLAS_COND(rd, rm, rs, rn, ARMCOND_AL)\n\n\n#define ARM_SMULL_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_SMULL, rd, rm, rs, rn, 0, cond))\n#define ARM_SMULL(p, rn, rd, rm, rs) \\\n  ARM_SMULL_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n#define ARM_SMLAL_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_SMLAL, rd, rm, rs, rn, 0, cond))\n#define ARM_SMLAL(p, rn, rd, rm, rs) \\\n  ARM_SMLAL_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n#define ARM_UMULL_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_UMULL, rd, rm, rs, rn, 0, cond))\n#define ARM_UMULL(p, rn, rd, rm, rs) \\\n  ARM_UMULL_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n#define ARM_UMLAL_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_UMLAL, rd, rm, rs, rn, 0, cond))\n#define ARM_UMLAL(p, rn, rd, rm, rs) \\\n  ARM_UMLAL_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n\n#define ARM_SMULLS_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_SMULL, rd, rm, rs, rn, 1, cond))\n#define ARM_SMULLS(p, rn, rd, rm, rs) \\\n  ARM_SMULLS_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n#define ARM_SMLALS_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_SMLAL, rd, rm, rs, rn, 1, cond))\n#define ARM_SMLALS(p, rn, rd, rm, rs) \\\n  ARM_SMLALS_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n#define ARM_UMULLS_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_UMULL, rd, rm, rs, rn, 1, cond))\n#define ARM_UMULLS(p, rn, rd, rm, rs) \\\n  ARM_UMULLS_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n#define ARM_UMLALS_COND(p, rn, rd, rm, rs, cond) \\\n  ARM_EMIT(p, ARM_DEF_MUL_COND(ARMOP_UMLAL, rd, rm, rs, rn, 1, cond))\n#define ARM_UMLALS(p, rn, rd, rm, rs) \\\n  ARM_UMLALS_COND(p, rn, rd, rm, rs, ARMCOND_AL)\n\n\n\n/*  Word/byte transfer */\ntypedef union {\n  ARMDPI_op2_reg_imm op2_reg_imm;\n  struct {\n    arminstr_t op2_imm : 12;\n    arminstr_t rd      :  4;\n    arminstr_t rn      :  4;\n    arminstr_t ls      :  1;\n    arminstr_t wb      :  1;\n    arminstr_t b       :  1;\n    arminstr_t u       :  1; /* down(0) / up(1) */\n    arminstr_t p       :  1; /* post-index(0) / pre-index(1) */\n    arminstr_t type    :  1; /* imm(0) / register(1) */\n    arminstr_t tag     :  2; /* 0 1 */\n    arminstr_t cond    :  4;\n  } all;\n} ARMInstrWXfer;\n\n#define ARM_WXFER_ID 1\n#define ARM_WXFER_MASK 3 << 26\n#define ARM_WXFER_TAG ARM_WXFER_ID << 26\n\n\n/*\n * ls    :  opcode, ARMOP_STR(0)/ARMOP_LDR(1)\n * imm12 :  immediate offset\n * wb    :  write-back\n * p     :  index mode, post-index (0, automatic write-back)\n *        or pre-index (1, calc effective address before memory access)\n */\n#define ARM_DEF_WXFER_IMM(imm12, rd, rn, ls, wb, b, p, cond) \\\n  ((((int)(imm12)) < 0) ? -((int)(imm12)) : (imm12)) | \\\n  ((rd) << 12)                                   | \\\n  ((rn) << 16)                                   | \\\n  ((ls) << 20)                                   | \\\n  ((wb) << 21)                                   | \\\n  ((b)  << 22)                                   | \\\n  (((int)(imm12) >= 0) << 23)                    | \\\n  ((p) << 24)                                    | \\\n  ARM_WXFER_TAG                                  | \\\n  ARM_DEF_COND(cond)\n\n#define ARM_WXFER_MAX_OFFS 0xFFF\n\n/* this macro checks for imm12 bounds */\n#define ARM_EMIT_WXFER_IMM(ptr, imm12, rd, rn, ls, wb, b, p, cond) \\\n  do { \\\n    int _imm12 = (int)(imm12) < -ARM_WXFER_MAX_OFFS  \\\n                 ? -ARM_WXFER_MAX_OFFS               \\\n                 : (int)(imm12) > ARM_WXFER_MAX_OFFS \\\n                 ? ARM_WXFER_MAX_OFFS                \\\n                 : (int)(imm12);                     \\\n    ARM_EMIT((ptr), \\\n    ARM_DEF_WXFER_IMM(_imm12, (rd), (rn), (ls), (wb), (b), (p), (cond))); \\\n  } while (0)\n\n\n/* LDRx */\n/* immediate offset, post-index */\n#define ARM_LDR_IMM_POST_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_LDR, 0, 0, 0, cond))\n\n#define ARM_LDR_IMM_POST(p, rd, rn, imm) ARM_LDR_IMM_POST_COND(p, rd, rn, imm, ARMCOND_AL)\n\n#define ARM_LDRB_IMM_POST_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_LDR, 0, 1, 0, cond))\n\n#define ARM_LDRB_IMM_POST(p, rd, rn, imm) ARM_LDRB_IMM_POST_COND(p, rd, rn, imm, ARMCOND_AL)\n\n/* immediate offset, pre-index */\n#define ARM_LDR_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_LDR, 0, 0, 1, cond))\n\n#define ARM_LDR_IMM(p, rd, rn, imm) ARM_LDR_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n\n#define ARM_LDRB_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_LDR, 0, 1, 1, cond))\n\n#define ARM_LDRB_IMM(p, rd, rn, imm) ARM_LDRB_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n\n\n/* STRx */\n/* immediate offset, post-index */\n#define ARM_STR_IMM_POST_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_STR, 0, 0, 0, cond))\n\n#define ARM_STR_IMM_POST(p, rd, rn, imm) ARM_STR_IMM_POST_COND(p, rd, rn, imm, ARMCOND_AL)\n\n#define ARM_STRB_IMM_POST_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_STR, 0, 1, 0, cond))\n\n#define ARM_STRB_IMM_POST(p, rd, rn, imm) ARM_STRB_IMM_POST_COND(p, rd, rn, imm, ARMCOND_AL)\n\n/* immediate offset, pre-index */\n#define ARM_STR_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT_WXFER_IMM(p, imm, rd, rn, ARMOP_STR, 0, 0, 1, cond)\n/*  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_STR, 0, 0, 1, cond))*/\n/*  ARM_EMIT_WXFER_IMM(p, imm, rd, rn, ARMOP_STR, 0, 0, 1, cond) */\n/*  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_STR, 0, 0, 1, cond)) */\n\n#define ARM_STR_IMM(p, rd, rn, imm) ARM_STR_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n\n#define ARM_STRB_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_IMM(imm, rd, rn, ARMOP_STR, 0, 1, 1, cond))\n\n#define ARM_STRB_IMM(p, rd, rn, imm) ARM_STRB_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n\n/* write-back */\n#define ARM_STR_IMM_WB_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT_WXFER_IMM(p, imm, rd, rn, ARMOP_STR, 1, 0, 1, cond)\n#define ARM_STR_IMM_WB(p, rd, rn, imm) ARM_STR_IMM_WB_COND(p, rd, rn, imm, ARMCOND_AL)\n\n\n/*\n * wb    :  write-back\n * u     :  down(0) / up(1)\n * p     :  index mode, post-index (0, automatic write-back) or pre-index (1)\n */\n#define ARM_DEF_WXFER_REG_REG_UPDOWN_COND(rm, shift_type, shift, rd, rn, ls, wb, b, u, p, cond) \\\n  (rm)                | \\\n  ((shift_type) << 5) | \\\n  ((shift) << 7)      | \\\n  ((rd) << 12)        | \\\n  ((rn) << 16)        | \\\n  ((ls) << 20)        | \\\n  ((wb) << 21)        | \\\n  ((b)  << 22)        | \\\n  ((u)  << 23)        | \\\n  ((p)  << 24)        | \\\n  (1    << 25)        | \\\n  ARM_WXFER_TAG       | \\\n  ARM_DEF_COND(cond)\n\n#define ARM_DEF_WXFER_REG_REG_COND(rm, shift_type, shift, rd, rn, ls, wb, b, p, cond) \\\n  ARM_DEF_WXFER_REG_REG_UPDOWN_COND(rm, shift_type, shift, rd, rn, ls, wb, b, ARM_UP, p, cond)\n#define ARM_DEF_WXFER_REG_MINUS_REG_COND(rm, shift_type, shift, rd, rn, ls, wb, b, p, cond) \\\n  ARM_DEF_WXFER_REG_REG_UPDOWN_COND(rm, shift_type, shift, rd, rn, ls, wb, b, ARM_DOWN, p, cond)\n\n\n#define ARM_LDR_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_REG_REG_COND(rm, shift_type, shift, rd, rn, ARMOP_LDR, 0, 0, 1, cond))\n#define ARM_LDR_REG_REG_SHIFT(p, rd, rn, rm, shift_type, shift) \\\n  ARM_LDR_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, ARMCOND_AL)\n#define ARM_LDR_REG_REG(p, rd, rn, rm) \\\n  ARM_LDR_REG_REG_SHIFT(p, rd, rn, rm, ARMSHIFT_LSL, 0)\n\n#define ARM_LDRB_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_REG_REG_COND(rm, shift_type, shift, rd, rn, ARMOP_LDR, 0, 1, 1, cond))\n#define ARM_LDRB_REG_REG_SHIFT(p, rd, rn, rm, shift_type, shift) \\\n  ARM_LDRB_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, ARMCOND_AL)\n#define ARM_LDRB_REG_REG(p, rd, rn, rm) \\\n  ARM_LDRB_REG_REG_SHIFT(p, rd, rn, rm, ARMSHIFT_LSL, 0)\n\n#define ARM_STR_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_REG_REG_COND(rm, shift_type, shift, rd, rn, ARMOP_STR, 0, 0, 1, cond))\n#define ARM_STR_REG_REG_SHIFT(p, rd, rn, rm, shift_type, shift) \\\n  ARM_STR_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, ARMCOND_AL)\n#define ARM_STR_REG_REG(p, rd, rn, rm) \\\n  ARM_STR_REG_REG_SHIFT(p, rd, rn, rm, ARMSHIFT_LSL, 0)\n\n/* post-index */\n#define ARM_STR_REG_REG_SHIFT_POST_COND(p, rd, rn, rm, shift_type, shift, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_REG_REG_COND(rm, shift_type, shift, rd, rn, ARMOP_STR, 0, 0, 0, cond))\n#define ARM_STR_REG_REG_SHIFT_POST(p, rd, rn, rm, shift_type, shift) \\\n  ARM_STR_REG_REG_SHIFT_POST_COND(p, rd, rn, rm, shift_type, shift, ARMCOND_AL)\n#define ARM_STR_REG_REG_POST(p, rd, rn, rm) \\\n  ARM_STR_REG_REG_SHIFT_POST(p, rd, rn, rm, ARMSHIFT_LSL, 0)\n\n/* zero-extend */\n#define ARM_STRB_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, cond) \\\n  ARM_EMIT(p, ARM_DEF_WXFER_REG_REG_COND(rm, shift_type, shift, rd, rn, ARMOP_STR, 0, 1, 1, cond))\n#define ARM_STRB_REG_REG_SHIFT(p, rd, rn, rm, shift_type, shift) \\\n  ARM_STRB_REG_REG_SHIFT_COND(p, rd, rn, rm, shift_type, shift, ARMCOND_AL)\n#define ARM_STRB_REG_REG(p, rd, rn, rm) \\\n  ARM_STRB_REG_REG_SHIFT(p, rd, rn, rm, ARMSHIFT_LSL, 0)\n\n\n/* ARMv4+ */\n/* Half-word or byte (signed) transfer. */\ntypedef struct {\n  arminstr_t rm     : 4; /* imm_lo */\n  arminstr_t tag3   : 1; /* 1 */\n  arminstr_t h      : 1; /* half-word or byte */\n  arminstr_t s      : 1; /* sign-extend or zero-extend */\n  arminstr_t tag2   : 1; /* 1 */\n  arminstr_t imm_hi : 4;\n  arminstr_t rd     : 4;\n  arminstr_t rn     : 4;\n  arminstr_t ls     : 1;\n  arminstr_t wb     : 1;\n  arminstr_t type   : 1; /* imm(1) / reg(0) */\n  arminstr_t u      : 1; /* +- */\n  arminstr_t p      : 1; /* pre/post-index */\n  arminstr_t tag    : 3;\n  arminstr_t cond   : 4;\n} ARMInstrHXfer;\n\n#define ARM_HXFER_ID 0\n#define ARM_HXFER_ID2 1\n#define ARM_HXFER_ID3 1\n#define ARM_HXFER_MASK ((0x7 << 25) | (0x9 << 4))\n#define ARM_HXFER_TAG ((ARM_HXFER_ID << 25) | (ARM_HXFER_ID2 << 7) | (ARM_HXFER_ID3 << 4))\n\n#define ARM_DEF_HXFER_IMM_COND(imm, h, s, rd, rn, ls, wb, p, cond) \\\n  (((int)(imm) >= 0 ? (imm) : -(int)(imm)) & 0xF)               | \\\n  ((h) << 5)                                                    | \\\n  ((s) << 6)                                                    | \\\n  ((((int)(imm) >= 0 ? (imm) : -(int)(imm)) << 4) & (0xF << 8)) | \\\n  ((rd) << 12)                                                  | \\\n  ((rn) << 16)                                                  | \\\n  ((ls) << 20)                                                  | \\\n  ((wb) << 21)                                                  | \\\n  (1 << 22)                                                     | \\\n  (((int)(imm) >= 0) << 23)                                     | \\\n  ((p) << 24)                                                   | \\\n  ARM_HXFER_TAG                                                 | \\\n  ARM_DEF_COND(cond)\n\n#define ARM_LDRH_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 1, 0, rd, rn, ARMOP_LDR, 0, 1, cond))\n#define ARM_LDRH_IMM(p, rd, rn, imm) \\\n  ARM_LDRH_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n#define ARM_LDRSH_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 1, 1, rd, rn, ARMOP_LDR, 0, 1, cond))\n#define ARM_LDRSH_IMM(p, rd, rn, imm) \\\n  ARM_LDRSH_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n#define ARM_LDRSB_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 0, 1, rd, rn, ARMOP_LDR, 0, 1, cond))\n#define ARM_LDRSB_IMM(p, rd, rn, imm) \\\n  ARM_LDRSB_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n\n\n#define ARM_STRH_IMM_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 1, 0, rd, rn, ARMOP_STR, 0, 1, cond))\n#define ARM_STRH_IMM(p, rd, rn, imm) \\\n  ARM_STRH_IMM_COND(p, rd, rn, imm, ARMCOND_AL)\n\n#define ARM_STRH_IMM_POST_COND(p, rd, rn, imm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_IMM_COND(imm, 1, 0, rd, rn, ARMOP_STR, 0, 0, cond))\n#define ARM_STRH_IMM_POST(p, rd, rn, imm) \\\n  ARM_STRH_IMM_POST_COND(p, rd, rn, imm, ARMCOND_AL)\n\n\n#define ARM_DEF_HXFER_REG_REG_UPDOWN_COND(rm, h, s, rd, rn, ls, wb, u, p, cond) \\\n  ((rm) & 0xF)                | \\\n  ((h) << 5)                  | \\\n  ((s) << 6)                  | \\\n  ((rd) << 12)                | \\\n  ((rn) << 16)                | \\\n  ((ls) << 20)                | \\\n  ((wb) << 21)                | \\\n  (0 << 22)                   | \\\n  ((u) << 23)                 | \\\n  ((p) << 24)                 | \\\n  ARM_HXFER_TAG               | \\\n  ARM_DEF_COND(cond)\n\n#define ARM_DEF_HXFER_REG_REG_COND(rm, h, s, rd, rn, ls, wb, p, cond) \\\n  ARM_DEF_HXFER_REG_REG_UPDOWN_COND(rm, h, s, rd, rn, ls, wb, ARM_UP, p, cond)\n#define ARM_DEF_HXFER_REG_MINUS_REG_COND(rm, h, s, rd, rn, ls, wb, p, cond) \\\n  ARM_DEF_HXFER_REG_REG_UPDOWN_COND(rm, h, s, rd, rn, ls, wb, ARM_DOWN, p, cond)\n\n#define ARM_LDRH_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 1, 0, rd, rn, ARMOP_LDR, 0, 1, cond))\n#define ARM_LDRH_REG_REG(p, rd, rn, rm) \\\n  ARM_LDRH_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_LDRSH_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 1, 1, rd, rn, ARMOP_LDR, 0, 1, cond))\n#define ARM_LDRSH_REG_REG(p, rd, rn, rm) \\\n  ARM_LDRSH_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_LDRSB_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 0, 1, rd, rn, ARMOP_LDR, 0, 1, cond))\n#define ARM_LDRSB_REG_REG(p, rd, rn, rm) ARM_LDRSB_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#define ARM_STRH_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 1, 0, rd, rn, ARMOP_STR, 0, 1, cond))\n#define ARM_STRH_REG_REG(p, rd, rn, rm) \\\n  ARM_STRH_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#define ARM_STRH_REG_REG_POST_COND(p, rd, rn, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_HXFER_REG_REG_COND(rm, 1, 0, rd, rn, ARMOP_STR, 0, 0, cond))\n#define ARM_STRH_REG_REG_POST(p, rd, rn, rm) \\\n  ARM_STRH_REG_REG_POST_COND(p, rd, rn, rm, ARMCOND_AL)\n\n\n\n/* Swap */\ntypedef struct {\n  arminstr_t rm   : 4;\n  arminstr_t tag3 : 8; /* 0x9 */\n  arminstr_t rd   : 4;\n  arminstr_t rn   : 4;\n  arminstr_t tag2 : 2;\n  arminstr_t b    : 1;\n  arminstr_t tag  : 5; /* 0x2 */\n  arminstr_t cond : 4;\n} ARMInstrSwap;\n\n#define ARM_SWP_ID 2\n#define ARM_SWP_ID2 9\n#define ARM_SWP_MASK ((0x1F << 23) | (3 << 20) | (0xFF << 4))\n#define ARM_SWP_TAG ((ARM_SWP_ID << 23) | (ARM_SWP_ID2 << 4))\n\n\n\n/* Software interrupt */\ntypedef struct {\n  arminstr_t num  : 24;\n  arminstr_t tag  :  4;\n  arminstr_t cond :  4;\n} ARMInstrSWI;\n\n#define ARM_SWI_ID 0xF\n#define ARM_SWI_MASK (0xF << 24)\n#define ARM_SWI_TAG (ARM_SWI_ID << 24)\n\n\n\n/* Co-processor Data Processing */\ntypedef struct {\n  arminstr_t crm  : 4;\n  arminstr_t tag2 : 1; /* 0 */\n  arminstr_t op2  : 3;\n  arminstr_t cpn  : 4; /* CP number */\n  arminstr_t crd  : 4;\n  arminstr_t crn  : 4;\n  arminstr_t op   : 4;\n  arminstr_t tag  : 4; /* 0xE */\n  arminstr_t cond : 4;\n} ARMInstrCDP;\n\n#define ARM_CDP_ID 0xE\n#define ARM_CDP_ID2 0\n#define ARM_CDP_MASK ((0xF << 24) | (1 << 4))\n#define ARM_CDP_TAG ((ARM_CDP_ID << 24) | (ARM_CDP_ID2 << 4))\n\n\n/* Co-processor Data Transfer (ldc/stc) */\ntypedef struct {\n  arminstr_t offs : 8;\n  arminstr_t cpn  : 4;\n  arminstr_t crd  : 4;\n  arminstr_t rn   : 4;\n  arminstr_t ls   : 1;\n  arminstr_t wb   : 1;\n  arminstr_t n    : 1;\n  arminstr_t u    : 1;\n  arminstr_t p    : 1;\n  arminstr_t tag  : 3;\n  arminstr_t cond : 4;\n} ARMInstrCDT;\n\n#define ARM_CDT_ID 6\n#define ARM_CDT_MASK (7 << 25)\n#define ARM_CDT_TAG (ARM_CDT_ID << 25)\n\n\n/* Co-processor Register Transfer (mcr/mrc) */\ntypedef struct {\n  arminstr_t crm  : 4;\n  arminstr_t tag2 : 1;\n  arminstr_t op2  : 3;\n  arminstr_t cpn  : 4;\n  arminstr_t rd   : 4;\n  arminstr_t crn  : 4;\n  arminstr_t ls   : 1;\n  arminstr_t op1  : 3;\n  arminstr_t tag  : 4;\n  arminstr_t cond : 4;\n} ARMInstrCRT;\n\n#define ARM_CRT_ID 0xE\n#define ARM_CRT_ID2 0x1\n#define ARM_CRT_MASK ((0xF << 24) | (1 << 4))\n#define ARM_CRT_TAG ((ARM_CRT_ID << 24) | (ARM_CRT_ID2 << 4))\n\n/*\n * Move from co-processor register to CPU register\n * Rd := cRn {<op>cRm}\n * op{condition} CP#,CPOp,Rd,CRn,CRm{,CPOp2}\n */\n#define ARM_DEF_MRC_COND(cpn, cpop, rd, crn, crm, cpop2, cond) \\\n  ((crm) & 0xF)       |\\\n  ((cpop2) << 5)      |\\\n  ((cpn) << 8)        |\\\n  ((rd) << 12)        |\\\n  ((crn) << 16)       |\\\n  ((ARMOP_LDR) << 20) |\\\n  ((cpop) << 21)      |\\\n  ARM_CRT_TAG         |\\\n  ARM_DEF_COND(cond)\n\n#define ARM_MRC_COND(p, cpn, cpop, rd, crn, crm, cpop2, cond) \\\n  ARM_EMIT(p, ARM_DEF_MRC_COND(cpn, cpop, rd, crn, crm, cpop2, cond))\n#define ARM_MRC(p, cpn, cpop, rd, crn, crm, cpop2) \\\n  ARM_MRC_COND(p, cpn, cpop, rd, crn, crm, cpop2, ARMCOND_AL)\n\n\n\n/* Move register to PSR. */\ntypedef union {\n  ARMDPI_op2_imm op2_imm;\n  struct {\n    arminstr_t rm   : 4;\n    arminstr_t pad  : 8; /* 0 */\n    arminstr_t tag4 : 4; /* 0xF */\n    arminstr_t fld  : 4;\n    arminstr_t tag3 : 2; /* 0x2 */\n    arminstr_t sel  : 1;\n    arminstr_t tag2 : 2; /* 0x2 */\n    arminstr_t type : 1;\n    arminstr_t tag  : 2; /* 0 */\n    arminstr_t cond : 4;\n  } all;\n} ARMInstrMSR;\n\n#define ARM_MSR_ID 0\n#define ARM_MSR_ID2 2\n#define ARM_MSR_ID3 2\n#define ARM_MSR_ID4 0xF\n#define ARM_MSR_MASK ((3 << 26) | \\\n                      (3 << 23) | \\\n                      (3 << 20) | \\\n                      (0xF << 12))\n#define ARM_MSR_TAG ((ARM_MSR_ID << 26)  | \\\n                     (ARM_MSR_ID2 << 23) | \\\n                     (ARM_MSR_ID3 << 20) | \\\n                     (ARM_MSR_ID4 << 12))\n\n#define ARM_DEF_MSR_REG_COND(mask, rm, r, cond) \\\n    ARM_MSR_TAG       | \\\n    ARM_DEF_COND(cond)    | \\\n    ((rm) & 0xf)      | \\\n    (((r) & 1) << 22)   | \\\n    (((mask) & 0xf) << 16)\n\n#define ARM_MSR_REG_COND(p, mask, rm, r, cond) \\\n  ARM_EMIT(p, ARM_DEF_MSR_REG_COND(mask, rm, r, cond))\n\n#define ARM_MSR_REG(p, mask, rm, r) \\\n  ARM_MSR_REG_COND(p, mask, rm, r, ARMCOND_AL)\n\n#define ARM_PSR_C 1\n#define ARM_PSR_X 2\n#define ARM_PSR_S 4\n#define ARM_PSR_F 8\n\n#define ARM_CPSR 0\n#define ARM_SPSR 1\n\n/* Move PSR to register. */\ntypedef struct {\n  arminstr_t tag3 : 12;\n  arminstr_t rd   :  4;\n  arminstr_t tag2 :  6;\n  arminstr_t sel  :  1; /* CPSR | SPSR */\n  arminstr_t tag  :  5;\n  arminstr_t cond :  4;\n} ARMInstrMRS;\n\n#define ARM_MRS_ID 2\n#define ARM_MRS_ID2 0xF\n#define ARM_MRS_ID3 0\n#define ARM_MRS_MASK ((0x1F << 23) | (0x3F << 16) | 0xFFF)\n#define ARM_MRS_TAG ((ARM_MRS_ID << 23) | (ARM_MRS_ID2 << 16) | ARM_MRS_ID3)\n\n#define ARM_DEF_MRS_COND(rd, r, cond) \\\n  ARM_MRS_TAG       | \\\n  ARM_DEF_COND(cond)    | \\\n  (((r) & 1) << 22)   | \\\n  ((rd)& 0xf) << 12\n\n#define ARM_MRS_COND(p, rd, r, cond) \\\n  ARM_EMIT(p, ARM_DEF_MRS_COND(rd, r, cond))\n\n#define ARM_MRS_CPSR_COND(p, rd, cond) \\\n  ARM_MRS_COND(p, rd, ARM_CPSR, cond)\n\n#define ARM_MRS_CPSR(p, rd) \\\n  ARM_MRS_CPSR_COND(p, rd, ARMCOND_AL)\n\n#define ARM_MRS_SPSR_COND(p, rd, cond) \\\n  ARM_MRS_COND(p, rd, ARM_SPSR, cond)\n\n#define ARM_MRS_SPSR(p, rd) \\\n  ARM_MRS_SPSR_COND(p, rd, ARMCOND_AL)\n\n\n#include \"arm_dpimacros.h\"\n\n#define ARM_NOP(p) ARM_MOV_REG_REG(p, ARMREG_R0, ARMREG_R0)\n\n\n#define ARM_SHL_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, imm, cond)\n#define ARM_SHL_IMM(p, rd, rm, imm) \\\n  ARM_SHL_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n#define ARM_SHLS_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, imm, cond)\n#define ARM_SHLS_IMM(p, rd, rm, imm) \\\n  ARM_SHLS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n\n#define ARM_SHR_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, imm, cond)\n#define ARM_SHR_IMM(p, rd, rm, imm) \\\n  ARM_SHR_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n#define ARM_SHRS_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, imm, cond)\n#define ARM_SHRS_IMM(p, rd, rm, imm) \\\n  ARM_SHRS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n\n#define ARM_SAR_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, imm, cond)\n#define ARM_SAR_IMM(p, rd, rm, imm) \\\n  ARM_SAR_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n#define ARM_SARS_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, imm, cond)\n#define ARM_SARS_IMM(p, rd, rm, imm) \\\n  ARM_SARS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n\n#define ARM_ROR_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, imm, cond)\n#define ARM_ROR_IMM(p, rd, rm, imm) \\\n  ARM_ROR_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n#define ARM_RORS_IMM_COND(p, rd, rm, imm, cond) \\\n  ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, imm, cond)\n#define ARM_RORS_IMM(p, rd, rm, imm) \\\n  ARM_RORS_IMM_COND(p, rd, rm, imm, ARMCOND_AL)\n\n#define ARM_SHL_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, rs, cond)\n#define ARM_SHL_REG(p, rd, rm, rs) \\\n  ARM_SHL_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_SHLS_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSL, rs, cond)\n#define ARM_SHLS_REG(p, rd, rm, rs) \\\n  ARM_SHLS_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_SHLS_REG_REG(p, rd, rm, rs) ARM_SHLS_REG(p, rd, rm, rs)\n\n#define ARM_SHR_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, rs, cond)\n#define ARM_SHR_REG(p, rd, rm, rs) \\\n  ARM_SHR_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_SHRS_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_LSR, rs, cond)\n#define ARM_SHRS_REG(p, rd, rm, rs) \\\n  ARM_SHRS_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_SHRS_REG_REG(p, rd, rm, rs) ARM_SHRS_REG(p, rd, rm, rs)\n\n#define ARM_SAR_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, rs, cond)\n#define ARM_SAR_REG(p, rd, rm, rs) \\\n  ARM_SAR_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_SARS_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ASR, rs, cond)\n#define ARM_SARS_REG(p, rd, rm, rs) \\\n  ARM_SARS_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_SARS_REG_REG(p, rd, rm, rs) ARM_SARS_REG(p, rd, rm, rs)\n\n#define ARM_ROR_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, rs, cond)\n#define ARM_ROR_REG(p, rd, rm, rs) \\\n  ARM_ROR_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_RORS_REG_COND(p, rd, rm, rs, cond) \\\n  ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, ARMSHIFT_ROR, rs, cond)\n#define ARM_RORS_REG(p, rd, rm, rs) \\\n  ARM_RORS_REG_COND(p, rd, rm, rs, ARMCOND_AL)\n#define ARM_RORS_REG_REG(p, rd, rm, rs) ARM_RORS_REG(p, rd, rm, rs)\n\n#define ARM_DBRK(p) ARM_EMIT(p, 0xE6000010)\n#define ARM_IASM_DBRK() ARM_IASM_EMIT(0xE6000010)\n\n#define ARM_INC(p, reg) ARM_ADD_REG_IMM8(p, reg, reg, 1)\n#define ARM_DEC(p, reg) ARM_SUB_REG_IMM8(p, reg, reg, 1)\n\n\n/* ARM V5 */\n\n/* Count leading zeros, CLZ{cond} Rd, Rm */\ntypedef struct {\n  arminstr_t rm   :  4;\n  arminstr_t tag2 :  8;\n  arminstr_t rd   :  4;\n  arminstr_t tag  :  12;\n  arminstr_t cond :  4;\n} ARMInstrCLZ;\n\n#define ARM_CLZ_ID 0x16F\n#define ARM_CLZ_ID2 0xF1\n#define ARM_CLZ_MASK ((0xFFF << 16) | (0xFF < 4))\n#define ARM_CLZ_TAG ((ARM_CLZ_ID << 16) | (ARM_CLZ_ID2 << 4))\n\n#define ARM_DEF_CLZ_COND(rd, rm, cond) \\\n  ARM_CLZ_TAG       | \\\n  ARM_DEF_COND(cond)    | \\\n  (((rm) & 0xf))      | \\\n  ((rd) & 0xf) << 12\n\n#define ARM_CLZ_COND(p, rd, rm, cond) \\\n  ARM_EMIT(p, ARM_DEF_CLZ_COND(rd, rm, cond))\n\n#define ARM_CLZ(p, rd, rm) \\\n  ARM_EMIT(p, ARM_DEF_CLZ_COND(rd, rm, ARMCOND_AL))\n\n/*\n *              TAG     p         b   wb  ls\n * ARMCOND_NV | 0-1-0 | 0 | +/- | 1 | 0 | 1 | rn -|- 0xF | imm12\n */\n#define ARM_PLD_ID 0xF45\n#define ARM_PLD_ID2 0xF /* rd */\n#define ARM_PLD_MASK ((0xFC7 << 20) | (0xF << 12))\n#define ARM_PLD_TAG ((ARM_PLD_ID << 20) | (ARM_PLD_ID2 << 12))\n#define ARM_DEF_PLD_IMM(imm12, rn) \\\n  ((((int)imm12) < 0) ? -(int)(imm12) : (imm12)) | \\\n  ((0xF) << 12)                                  | \\\n  ((rn) << 16)                                   | \\\n  ((1) << 20)  /* ls = load(1) */                | \\\n  ((0) << 21)  /* wb = 0 */                      | \\\n  ((1)  << 22) /* b = 1 */                       | \\\n  (((int)(imm12) >= 0) << 23)                    | \\\n  ((1) << 24)  /* pre/post = pre(1) */           | \\\n  ((2) << 25)  /* tag */                         | \\\n  ARM_DEF_COND(ARMCOND_NV)\n\n#define ARM_PLD_IMM(p, rn, imm12) ARM_EMIT(p, ARM_DEF_PLD_IMM(imm12, rn))\n\n#define ARM_DEF_PLD_REG_REG_UPDOWN_SHIFT(rn, shift_type, shift, rm, u) \\\n  (rm)                            | \\\n  ((shift_type) << 5)             | \\\n  ((shift) << 7)                  | \\\n  (0xF << 12) /* rd = 0xF */      | \\\n  ((rn) << 16)                    | \\\n  (1    << 20) /* ls = load(1) */ | \\\n  (0    << 21) /* wb = 0 */       | \\\n  (1    << 22) /* b = 1 */        | \\\n  ((u)  << 23)                    | \\\n  (1  << 24)   /* pre(1) */       | \\\n  (3    << 25)                    | \\\n  ARM_DEF_COND(ARMCOND_NV)\n\n#define ARM_PLD_REG_REG_UPDOWN_SHIFT(p, rm, rn, u, shift_type, shift) \\\n  ARM_EMIT(p,  ARM_DEF_PLD_REG_REG_UPDOWN_SHIFT(rm, shift_type, shift, rn, u))\n\n#define ARM_PLD_REG_PLUS_REG(p, rm, rn) \\\n  ARM_PLD_REG_REG_UPDOWN_SHIFT(p, rm, rn, ARM_UP, ARMSHIFT_LSL, 0)\n\n#define ARM_PLD_REG_MINUS_REG(p, rm, rn) \\\n  ARM_PLD_REG_REG_UPDOWN_SHIFT(p, rm, rn, ARM_DOWN, ARMSHIFT_LSL, 0)\n\n\n#define ARM_DEF_STF_IMM_COND(p, prec, freg_const, rd, imm8, rot, cond) \\\n  ((imm8) & 0xFF)      | \\\n  (((rot) & 0xF) << 8) | \\\n  ((freg_const) << 12) | \\\n  (1 << 25)            | \\\n  ARM_DEF_COND(cond)\n\n\ntypedef union {\n  ARMInstrBR    br;\n  ARMInstrDPI   dpi;\n  ARMInstrMRT   mrt;\n  ARMInstrMul   mul;\n  ARMInstrWXfer wxfer;\n  ARMInstrHXfer hxfer;\n  ARMInstrSwap  swp;\n  ARMInstrCDP   cdp;\n  ARMInstrCDT   cdt;\n  ARMInstrCRT   crt;\n  ARMInstrSWI   swi;\n  ARMInstrMSR   msr;\n  ARMInstrMRS   mrs;\n  ARMInstrCLZ   clz;\n\n  ARMInstrGeneric generic;\n  arminstr_t      raw;\n} ARMInstr;\n\n#endif /* ARM_CG_H */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/arm_dpimacros.h",
    "content": "/* Macros for DPI ops, auto-generated from template\n *\n * Copyright (c) 2002 Wild West Software\n * Copyright (c) 2001, 2002 Sergey Chaban\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software,\n * and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n\n/* mov/mvn */\n\n/* Rd := imm8 ROR rot */\n#define ARM_MOV_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define ARM_MOV_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MOV_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define ARM_MOVS_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MOVS_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define _MOV_REG_IMM(reg, imm8, rot) \\\n  _MOV_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define _MOVS_REG_IMM(reg, imm8, rot) \\\n  _MOVS_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := imm8 */\n#define ARM_MOV_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define ARM_MOV_REG_IMM8(p, reg, imm8) \\\n  ARM_MOV_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define ARM_MOVS_REG_IMM8(p, reg, imm8) \\\n  ARM_MOVS_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define _MOV_REG_IMM8(reg, imm8) \\\n  _MOV_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define _MOVS_REG_IMM8(reg, imm8) \\\n  _MOVS_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm */\n#define ARM_MOV_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_MOV, rd, 0, rm, cond)\n#define ARM_MOV_REG_REG(p, rd, rm) \\\n  ARM_MOV_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_MOV, rd, 0, rm, cond)\n#define ARM_MOVS_REG_REG(p, rd, rm) \\\n  ARM_MOVS_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_MOV, rd, 0, rm, cond)\n#define _MOV_REG_REG(rd, rm) \\\n  _MOV_REG_REG_COND(rd, rm, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_MOV, rd, 0, rm, cond)\n#define _MOVS_REG_REG(rd, rm) \\\n  _MOVS_REG_REG_COND(rd, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm <shift_type> imm_shift */\n#define ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MOV_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MOVS_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MOV_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MOV_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MOVS_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MOVS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n\n/* Rd := (Rm <shift_type> Rs) */\n#define ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MOV_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MOVS_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define _MOV_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MOV_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define _MOVS_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MOVS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* Rd := imm8 ROR rot */\n#define ARM_MVN_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define ARM_MVN_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MVN_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define ARM_MVNS_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MVNS_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define _MVN_REG_IMM(reg, imm8, rot) \\\n  _MVN_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define _MVNS_REG_IMM(reg, imm8, rot) \\\n  _MVNS_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := imm8 */\n#define ARM_MVN_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define ARM_MVN_REG_IMM8(p, reg, imm8) \\\n  ARM_MVN_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define ARM_MVNS_REG_IMM8(p, reg, imm8) \\\n  ARM_MVNS_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define _MVN_REG_IMM8(reg, imm8) \\\n  _MVN_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define _MVNS_REG_IMM8(reg, imm8) \\\n  _MVNS_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm */\n#define ARM_MVN_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_MVN, rd, 0, rm, cond)\n#define ARM_MVN_REG_REG(p, rd, rm) \\\n  ARM_MVN_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_MVN, rd, 0, rm, cond)\n#define ARM_MVNS_REG_REG(p, rd, rm) \\\n  ARM_MVNS_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_MVN, rd, 0, rm, cond)\n#define _MVN_REG_REG(rd, rm) \\\n  _MVN_REG_REG_COND(rd, rm, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_MVN, rd, 0, rm, cond)\n#define _MVNS_REG_REG(rd, rm) \\\n  _MVNS_REG_REG_COND(rd, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm <shift_type> imm_shift */\n#define ARM_MVN_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MVN_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MVN_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MVNS_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MVNS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MVN_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MVN_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MVNS_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MVNS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n\n/* Rd := (Rm <shift_type> Rs) */\n#define ARM_MVN_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MVN_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MVN_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MVNS_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MVNS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define _MVN_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MVN_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define _MVNS_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MVNS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n\n/* DPIs, arithmetic and logical */\n\n/* -- AND -- */\n\n/* Rd := Rn AND (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_AND_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_AND, rd, rn, imm8, rot, cond)\n#define ARM_AND_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_AND_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ANDS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_AND, rd, rn, imm8, rot, cond)\n#define ARM_ANDS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ANDS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_AND, rd, rn, imm8, rot, cond)\n#define _AND_REG_IMM(rd, rn, imm8, rot) \\\n  _AND_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ANDS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_AND, rd, rn, imm8, rot, cond)\n#define _ANDS_REG_IMM(rd, rn, imm8, rot) \\\n  _ANDS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND imm8 */\n#define ARM_AND_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_AND_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_AND_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_AND_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ANDS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ANDS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ANDS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ANDS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _AND_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _AND_REG_IMM8(rd, rn, imm8) \\\n  _AND_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ANDS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ANDS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ANDS_REG_IMM8(rd, rn, imm8) \\\n  _ANDS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND Rm */\n#define ARM_AND_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_AND, rd, rn, rm, cond)\n#define ARM_AND_REG_REG(p, rd, rn, rm) \\\n  ARM_AND_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ANDS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_AND, rd, rn, rm, cond)\n#define ARM_ANDS_REG_REG(p, rd, rn, rm) \\\n  ARM_ANDS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_AND, rd, rn, rm, cond)\n#define _AND_REG_REG(rd, rn, rm) \\\n  _AND_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ANDS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_AND, rd, rn, rm, cond)\n#define _ANDS_REG_REG(rd, rn, rm) \\\n  _ANDS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND (Rm <shift_type> imm_shift) */\n#define ARM_AND_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_AND_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_AND_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ANDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ANDS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ANDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define _AND_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _AND_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ANDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ANDS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ANDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND (Rm <shift_type> Rs) */\n#define ARM_AND_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define ARM_AND_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_AND_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ANDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ANDS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ANDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define _AND_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _AND_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ANDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define _ANDS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ANDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- EOR -- */\n\n/* Rd := Rn EOR (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_EOR_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define ARM_EOR_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_EOR_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_EORS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define ARM_EORS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_EORS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define _EOR_REG_IMM(rd, rn, imm8, rot) \\\n  _EOR_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _EORS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define _EORS_REG_IMM(rd, rn, imm8, rot) \\\n  _EORS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR imm8 */\n#define ARM_EOR_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_EOR_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_EOR_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_EOR_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_EORS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_EORS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_EORS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_EORS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _EOR_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _EOR_REG_IMM8(rd, rn, imm8) \\\n  _EOR_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _EORS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _EORS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _EORS_REG_IMM8(rd, rn, imm8) \\\n  _EORS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR Rm */\n#define ARM_EOR_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_EOR, rd, rn, rm, cond)\n#define ARM_EOR_REG_REG(p, rd, rn, rm) \\\n  ARM_EOR_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_EORS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_EOR, rd, rn, rm, cond)\n#define ARM_EORS_REG_REG(p, rd, rn, rm) \\\n  ARM_EORS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_EOR, rd, rn, rm, cond)\n#define _EOR_REG_REG(rd, rn, rm) \\\n  _EOR_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _EORS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_EOR, rd, rn, rm, cond)\n#define _EORS_REG_REG(rd, rn, rm) \\\n  _EORS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR (Rm <shift_type> imm_shift) */\n#define ARM_EOR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_EOR_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_EOR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_EORS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_EORS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_EORS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _EOR_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _EOR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _EORS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _EORS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _EORS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR (Rm <shift_type> Rs) */\n#define ARM_EOR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_EOR_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_EOR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_EORS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_EORS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_EORS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define _EOR_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _EOR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _EORS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define _EORS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _EORS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- SUB -- */\n\n/* Rd := Rn SUB (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_SUB_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define ARM_SUB_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SUB_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_SUBS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define ARM_SUBS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SUBS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define _SUB_REG_IMM(rd, rn, imm8, rot) \\\n  _SUB_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _SUBS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define _SUBS_REG_IMM(rd, rn, imm8, rot) \\\n  _SUBS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB imm8 */\n#define ARM_SUB_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SUB_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SUB_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SUB_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_SUBS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SUBS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SUBS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SUBS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SUB_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SUB_REG_IMM8(rd, rn, imm8) \\\n  _SUB_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _SUBS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SUBS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SUBS_REG_IMM8(rd, rn, imm8) \\\n  _SUBS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB Rm */\n#define ARM_SUB_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_SUB, rd, rn, rm, cond)\n#define ARM_SUB_REG_REG(p, rd, rn, rm) \\\n  ARM_SUB_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_SUBS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_SUB, rd, rn, rm, cond)\n#define ARM_SUBS_REG_REG(p, rd, rn, rm) \\\n  ARM_SUBS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_SUB, rd, rn, rm, cond)\n#define _SUB_REG_REG(rd, rn, rm) \\\n  _SUB_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _SUBS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_SUB, rd, rn, rm, cond)\n#define _SUBS_REG_REG(rd, rn, rm) \\\n  _SUBS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB (Rm <shift_type> imm_shift) */\n#define ARM_SUB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SUB_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SUB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_SUBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SUBS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SUBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SUB_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SUB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _SUBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SUBS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SUBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB (Rm <shift_type> Rs) */\n#define ARM_SUB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SUB_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SUB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_SUBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SUBS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SUBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define _SUB_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SUB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _SUBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define _SUBS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SUBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- RSB -- */\n\n/* Rd := Rn RSB (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_RSB_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define ARM_RSB_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSB_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_RSBS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define ARM_RSBS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSBS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define _RSB_REG_IMM(rd, rn, imm8, rot) \\\n  _RSB_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _RSBS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define _RSBS_REG_IMM(rd, rn, imm8, rot) \\\n  _RSBS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB imm8 */\n#define ARM_RSB_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSB_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSB_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSB_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_RSBS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSBS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSBS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSBS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSB_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSB_REG_IMM8(rd, rn, imm8) \\\n  _RSB_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _RSBS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSBS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSBS_REG_IMM8(rd, rn, imm8) \\\n  _RSBS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB Rm */\n#define ARM_RSB_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_RSB, rd, rn, rm, cond)\n#define ARM_RSB_REG_REG(p, rd, rn, rm) \\\n  ARM_RSB_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_RSBS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_RSB, rd, rn, rm, cond)\n#define ARM_RSBS_REG_REG(p, rd, rn, rm) \\\n  ARM_RSBS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_RSB, rd, rn, rm, cond)\n#define _RSB_REG_REG(rd, rn, rm) \\\n  _RSB_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _RSBS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_RSB, rd, rn, rm, cond)\n#define _RSBS_REG_REG(rd, rn, rm) \\\n  _RSBS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB (Rm <shift_type> imm_shift) */\n#define ARM_RSB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSB_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_RSBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSBS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSB_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _RSBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSBS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB (Rm <shift_type> Rs) */\n#define ARM_RSB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSB_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_RSBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSBS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define _RSB_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _RSBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define _RSBS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- ADD -- */\n\n/* Rd := Rn ADD (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_ADD_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define ARM_ADD_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADD_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ADDS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define ARM_ADDS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADDS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define _ADD_REG_IMM(rd, rn, imm8, rot) \\\n  _ADD_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ADDS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define _ADDS_REG_IMM(rd, rn, imm8, rot) \\\n  _ADDS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD imm8 */\n#define ARM_ADD_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADD_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADD_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADD_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ADDS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADDS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADDS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADDS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADD_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADD_REG_IMM8(rd, rn, imm8) \\\n  _ADD_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ADDS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADDS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADDS_REG_IMM8(rd, rn, imm8) \\\n  _ADDS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD Rm */\n#define ARM_ADD_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_ADD, rd, rn, rm, cond)\n#define ARM_ADD_REG_REG(p, rd, rn, rm) \\\n  ARM_ADD_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ADDS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_ADD, rd, rn, rm, cond)\n#define ARM_ADDS_REG_REG(p, rd, rn, rm) \\\n  ARM_ADDS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_ADD, rd, rn, rm, cond)\n#define _ADD_REG_REG(rd, rn, rm) \\\n  _ADD_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ADDS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_ADD, rd, rn, rm, cond)\n#define _ADDS_REG_REG(rd, rn, rm) \\\n  _ADDS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD (Rm <shift_type> imm_shift) */\n#define ARM_ADD_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADD_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADD_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ADDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADDS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADD_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADD_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ADDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADDS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD (Rm <shift_type> Rs) */\n#define ARM_ADD_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADD_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADD_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ADDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADDS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define _ADD_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADD_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ADDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define _ADDS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- ADC -- */\n\n/* Rd := Rn ADC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_ADC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define ARM_ADC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ADCS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define ARM_ADCS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADCS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define _ADC_REG_IMM(rd, rn, imm8, rot) \\\n  _ADC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ADCS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define _ADCS_REG_IMM(rd, rn, imm8, rot) \\\n  _ADCS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC imm8 */\n#define ARM_ADC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ADCS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADCS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADCS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADCS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADC_REG_IMM8(rd, rn, imm8) \\\n  _ADC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ADCS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADCS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADCS_REG_IMM8(rd, rn, imm8) \\\n  _ADCS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC Rm */\n#define ARM_ADC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_ADC, rd, rn, rm, cond)\n#define ARM_ADC_REG_REG(p, rd, rn, rm) \\\n  ARM_ADC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ADCS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_ADC, rd, rn, rm, cond)\n#define ARM_ADCS_REG_REG(p, rd, rn, rm) \\\n  ARM_ADCS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_ADC, rd, rn, rm, cond)\n#define _ADC_REG_REG(rd, rn, rm) \\\n  _ADC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ADCS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_ADC, rd, rn, rm, cond)\n#define _ADCS_REG_REG(rd, rn, rm) \\\n  _ADCS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC (Rm <shift_type> imm_shift) */\n#define ARM_ADC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ADCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADCS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ADCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADCS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC (Rm <shift_type> Rs) */\n#define ARM_ADC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ADCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADCS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define _ADC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ADCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define _ADCS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- SBC -- */\n\n/* Rd := Rn SBC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_SBC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define ARM_SBC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SBC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_SBCS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define ARM_SBCS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SBCS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define _SBC_REG_IMM(rd, rn, imm8, rot) \\\n  _SBC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _SBCS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define _SBCS_REG_IMM(rd, rn, imm8, rot) \\\n  _SBCS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC imm8 */\n#define ARM_SBC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SBC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SBC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SBC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_SBCS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SBCS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SBCS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SBCS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SBC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SBC_REG_IMM8(rd, rn, imm8) \\\n  _SBC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _SBCS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SBCS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SBCS_REG_IMM8(rd, rn, imm8) \\\n  _SBCS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC Rm */\n#define ARM_SBC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_SBC, rd, rn, rm, cond)\n#define ARM_SBC_REG_REG(p, rd, rn, rm) \\\n  ARM_SBC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_SBCS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_SBC, rd, rn, rm, cond)\n#define ARM_SBCS_REG_REG(p, rd, rn, rm) \\\n  ARM_SBCS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_SBC, rd, rn, rm, cond)\n#define _SBC_REG_REG(rd, rn, rm) \\\n  _SBC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _SBCS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_SBC, rd, rn, rm, cond)\n#define _SBCS_REG_REG(rd, rn, rm) \\\n  _SBCS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC (Rm <shift_type> imm_shift) */\n#define ARM_SBC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SBC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SBC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_SBCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SBCS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SBCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SBC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SBC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _SBCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SBCS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SBCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC (Rm <shift_type> Rs) */\n#define ARM_SBC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SBC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SBC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_SBCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SBCS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SBCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define _SBC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SBC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _SBCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define _SBCS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SBCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- RSC -- */\n\n/* Rd := Rn RSC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_RSC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define ARM_RSC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_RSCS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define ARM_RSCS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSCS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define _RSC_REG_IMM(rd, rn, imm8, rot) \\\n  _RSC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _RSCS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define _RSCS_REG_IMM(rd, rn, imm8, rot) \\\n  _RSCS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC imm8 */\n#define ARM_RSC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_RSCS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSCS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSCS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSCS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSC_REG_IMM8(rd, rn, imm8) \\\n  _RSC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _RSCS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSCS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSCS_REG_IMM8(rd, rn, imm8) \\\n  _RSCS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC Rm */\n#define ARM_RSC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_RSC, rd, rn, rm, cond)\n#define ARM_RSC_REG_REG(p, rd, rn, rm) \\\n  ARM_RSC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_RSCS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_RSC, rd, rn, rm, cond)\n#define ARM_RSCS_REG_REG(p, rd, rn, rm) \\\n  ARM_RSCS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_RSC, rd, rn, rm, cond)\n#define _RSC_REG_REG(rd, rn, rm) \\\n  _RSC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _RSCS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_RSC, rd, rn, rm, cond)\n#define _RSCS_REG_REG(rd, rn, rm) \\\n  _RSCS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC (Rm <shift_type> imm_shift) */\n#define ARM_RSC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_RSCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSCS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _RSCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSCS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC (Rm <shift_type> Rs) */\n#define ARM_RSC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_RSCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSCS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define _RSC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _RSCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define _RSCS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- ORR -- */\n\n/* Rd := Rn ORR (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_ORR_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define ARM_ORR_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ORR_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ORRS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define ARM_ORRS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ORRS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define _ORR_REG_IMM(rd, rn, imm8, rot) \\\n  _ORR_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ORRS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define _ORRS_REG_IMM(rd, rn, imm8, rot) \\\n  _ORRS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR imm8 */\n#define ARM_ORR_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ORR_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ORR_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ORR_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ORRS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ORRS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ORRS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ORRS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ORR_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ORR_REG_IMM8(rd, rn, imm8) \\\n  _ORR_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ORRS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ORRS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ORRS_REG_IMM8(rd, rn, imm8) \\\n  _ORRS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR Rm */\n#define ARM_ORR_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_ORR, rd, rn, rm, cond)\n#define ARM_ORR_REG_REG(p, rd, rn, rm) \\\n  ARM_ORR_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ORRS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_ORR, rd, rn, rm, cond)\n#define ARM_ORRS_REG_REG(p, rd, rn, rm) \\\n  ARM_ORRS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_ORR, rd, rn, rm, cond)\n#define _ORR_REG_REG(rd, rn, rm) \\\n  _ORR_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ORRS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_ORR, rd, rn, rm, cond)\n#define _ORRS_REG_REG(rd, rn, rm) \\\n  _ORRS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR (Rm <shift_type> imm_shift) */\n#define ARM_ORR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ORR_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ORR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ORRS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ORRS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ORRS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ORR_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ORR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ORRS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ORRS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ORRS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR (Rm <shift_type> Rs) */\n#define ARM_ORR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ORR_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ORR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ORRS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ORRS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ORRS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define _ORR_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ORR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ORRS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define _ORRS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ORRS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- BIC -- */\n\n/* Rd := Rn BIC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_BIC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define ARM_BIC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_BIC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_BICS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define ARM_BICS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_BICS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define _BIC_REG_IMM(rd, rn, imm8, rot) \\\n  _BIC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _BICS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define _BICS_REG_IMM(rd, rn, imm8, rot) \\\n  _BICS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC imm8 */\n#define ARM_BIC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_BIC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_BIC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_BIC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_BICS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_BICS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_BICS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_BICS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _BIC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _BIC_REG_IMM8(rd, rn, imm8) \\\n  _BIC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _BICS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _BICS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _BICS_REG_IMM8(rd, rn, imm8) \\\n  _BICS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC Rm */\n#define ARM_BIC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_BIC, rd, rn, rm, cond)\n#define ARM_BIC_REG_REG(p, rd, rn, rm) \\\n  ARM_BIC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_BICS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_BIC, rd, rn, rm, cond)\n#define ARM_BICS_REG_REG(p, rd, rn, rm) \\\n  ARM_BICS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_BIC, rd, rn, rm, cond)\n#define _BIC_REG_REG(rd, rn, rm) \\\n  _BIC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _BICS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_BIC, rd, rn, rm, cond)\n#define _BICS_REG_REG(rd, rn, rm) \\\n  _BICS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC (Rm <shift_type> imm_shift) */\n#define ARM_BIC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_BIC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_BIC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_BICS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_BICS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_BICS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _BIC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _BIC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _BICS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _BICS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _BICS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC (Rm <shift_type> Rs) */\n#define ARM_BIC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_BIC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_BIC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_BICS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_BICS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_BICS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define _BIC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _BIC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _BICS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define _BICS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _BICS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n\n\n\n\n/* DPIs, comparison */\n\n/* PSR := TST Rn, (imm8 ROR 2*rot) */\n#define ARM_TST_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_TST, 0, rn, imm8, rot, cond)\n#define ARM_TST_REG_IMM(p, rn, imm8, rot) \\\n  ARM_TST_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_TST, 0, rn, imm8, rot, cond)\n#define _TST_REG_IMM(rn, imm8, rot) \\\n  _TST_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := TST Rn, imm8 */\n#define ARM_TST_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_TST_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_TST_REG_IMM8(p, rn, imm8) \\\n  ARM_TST_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_IMM8_COND(rn, imm8, cond) \\\n  _TST_REG_IMM_COND(rn, imm8, 0, cond)\n#define _TST_REG_IMM8(rn, imm8) \\\n  _TST_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := TST Rn, Rm */\n#define ARM_TST_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_TST, 0, rn, rm, cond)\n#define ARM_TST_REG_REG(p, rn, rm) \\\n  ARM_TST_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_TST, 0, rn, rm, cond)\n#define _TST_REG_REG(rn, rm) \\\n  _TST_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := TST Rn, (Rm <shift_type> imm8) */\n#define ARM_TST_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_TST, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_TST_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_TST_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_TST, 0, rn, rm, shift_type, imm_shift, cond)\n#define _TST_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _TST_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, (imm8 ROR 2*rot) */\n#define ARM_TEQ_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_TEQ, 0, rn, imm8, rot, cond)\n#define ARM_TEQ_REG_IMM(p, rn, imm8, rot) \\\n  ARM_TEQ_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_TEQ, 0, rn, imm8, rot, cond)\n#define _TEQ_REG_IMM(rn, imm8, rot) \\\n  _TEQ_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, imm8 */\n#define ARM_TEQ_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_TEQ_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_TEQ_REG_IMM8(p, rn, imm8) \\\n  ARM_TEQ_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_IMM8_COND(rn, imm8, cond) \\\n  _TEQ_REG_IMM_COND(rn, imm8, 0, cond)\n#define _TEQ_REG_IMM8(rn, imm8) \\\n  _TEQ_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, Rm */\n#define ARM_TEQ_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_TEQ, 0, rn, rm, cond)\n#define ARM_TEQ_REG_REG(p, rn, rm) \\\n  ARM_TEQ_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_TEQ, 0, rn, rm, cond)\n#define _TEQ_REG_REG(rn, rm) \\\n  _TEQ_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, (Rm <shift_type> imm8) */\n#define ARM_TEQ_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_TEQ, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_TEQ_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_TEQ_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_TEQ, 0, rn, rm, shift_type, imm_shift, cond)\n#define _TEQ_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _TEQ_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, (imm8 ROR 2*rot) */\n#define ARM_CMP_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_CMP, 0, rn, imm8, rot, cond)\n#define ARM_CMP_REG_IMM(p, rn, imm8, rot) \\\n  ARM_CMP_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_CMP, 0, rn, imm8, rot, cond)\n#define _CMP_REG_IMM(rn, imm8, rot) \\\n  _CMP_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, imm8 */\n#define ARM_CMP_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_CMP_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_CMP_REG_IMM8(p, rn, imm8) \\\n  ARM_CMP_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_IMM8_COND(rn, imm8, cond) \\\n  _CMP_REG_IMM_COND(rn, imm8, 0, cond)\n#define _CMP_REG_IMM8(rn, imm8) \\\n  _CMP_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, Rm */\n#define ARM_CMP_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_CMP, 0, rn, rm, cond)\n#define ARM_CMP_REG_REG(p, rn, rm) \\\n  ARM_CMP_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_CMP, 0, rn, rm, cond)\n#define _CMP_REG_REG(rn, rm) \\\n  _CMP_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, (Rm <shift_type> imm8) */\n#define ARM_CMP_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_CMP, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_CMP_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_CMP_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_CMP, 0, rn, rm, shift_type, imm_shift, cond)\n#define _CMP_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _CMP_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, (Rm <shift_type> Rs) */\n#define ARM_CMP_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_CMP, 0, rn, rm, shift_type, rs, cond)\n#define ARM_CMP_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_CMP_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n/* PSR := CMN Rn, (Rm <shift_type> Rs) */\n#define ARM_CMN_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_CMN, 0, rn, rm, shift_type, rs, cond)\n#define ARM_CMN_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_CMN_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n/* PSR := TST Rn, (Rm <shift_type> Rs) */\n#define ARM_TST_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_TST, 0, rn, rm, shift_type, rs, cond)\n#define ARM_TST_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_CMN_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n/* PSR := TEQ Rn, (Rm <shift_type> Rs) */\n#define ARM_TEQ_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_TEQ, 0, rn, rm, shift_type, rs, cond)\n#define ARM_TEQ_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_CMN_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\nARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_CMP, rd, rn, rm, shift_type, rs, cond)\n#define _CMP_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n_CMP_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, (imm8 ROR 2*rot) */\n#define ARM_CMN_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_CMN, 0, rn, imm8, rot, cond)\n#define ARM_CMN_REG_IMM(p, rn, imm8, rot) \\\n  ARM_CMN_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_CMN, 0, rn, imm8, rot, cond)\n#define _CMN_REG_IMM(rn, imm8, rot) \\\n  _CMN_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, imm8 */\n#define ARM_CMN_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_CMN_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_CMN_REG_IMM8(p, rn, imm8) \\\n  ARM_CMN_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_IMM8_COND(rn, imm8, cond) \\\n  _CMN_REG_IMM_COND(rn, imm8, 0, cond)\n#define _CMN_REG_IMM8(rn, imm8) \\\n  _CMN_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, Rm */\n#define ARM_CMN_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_CMN, 0, rn, rm, cond)\n#define ARM_CMN_REG_REG(p, rn, rm) \\\n  ARM_CMN_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_CMN, 0, rn, rm, cond)\n#define _CMN_REG_REG(rn, rm) \\\n  _CMN_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, (Rm <shift_type> imm8) */\n#define ARM_CMN_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_CMN, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_CMN_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_CMN_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_CMN, 0, rn, rm, shift_type, imm_shift, cond)\n#define _CMN_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _CMN_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n\n/* end generated */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/arm_dpimacros_old.h",
    "content": "/* Macros for DPI ops, auto-generated from template\n *\n * Copyright (c) 2002 Wild West Software\n * Copyright (c) 2001, 2002 Sergey Chaban\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software,\n * and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n\n/* mov/mvn */\n\n/* Rd := imm8 ROR rot */\n#define ARM_MOV_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define ARM_MOV_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MOV_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define ARM_MOVS_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MOVS_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define _MOV_REG_IMM(reg, imm8, rot) \\\n  _MOV_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, rot, cond)\n#define _MOVS_REG_IMM(reg, imm8, rot) \\\n  _MOVS_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := imm8 */\n#define ARM_MOV_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define ARM_MOV_REG_IMM8(p, reg, imm8) \\\n  ARM_MOV_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define ARM_MOVS_REG_IMM8(p, reg, imm8) \\\n  ARM_MOVS_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define _MOV_REG_IMM8(reg, imm8) \\\n  _MOV_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MOV, reg, 0, imm8, 0, cond)\n#define _MOVS_REG_IMM8(reg, imm8) \\\n  _MOVS_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm */\n#define ARM_MOV_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_MOV, rd, 0, rm, cond)\n#define ARM_MOV_REG_REG(p, rd, rm) \\\n  ARM_MOV_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_MOV, rd, 0, rm, cond)\n#define ARM_MOVS_REG_REG(p, rd, rm) \\\n  ARM_MOVS_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_MOV, rd, 0, rm, cond)\n#define _MOV_REG_REG(rd, rm) \\\n  _MOV_REG_REG_COND(rd, rm, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_MOV, rd, 0, rm, cond)\n#define _MOVS_REG_REG(rd, rm) \\\n  _MOVS_REG_REG_COND(rd, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm <shift_type> imm_shift */\n#define ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MOV_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MOV_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MOVS_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MOVS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MOV_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MOV_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MOVS_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MOVS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n\n/* Rd := (Rm <shift_type> Rs) */\n#define ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MOV_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MOV_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MOVS_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MOVS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MOV_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define _MOV_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MOV_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define _MOVS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_MOV, rd, 0, rm, shift_type, rs, cond)\n#define _MOVS_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MOVS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* Rd := imm8 ROR rot */\n#define ARM_MVN_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define ARM_MVN_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MVN_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_IMM_COND(p, reg, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define ARM_MVNS_REG_IMM(p, reg, imm8, rot) \\\n  ARM_MVNS_REG_IMM_COND(p, reg, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define _MVN_REG_IMM(reg, imm8, rot) \\\n  _MVN_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_IMM_COND(reg, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, rot, cond)\n#define _MVNS_REG_IMM(reg, imm8, rot) \\\n  _MVNS_REG_IMM_COND(reg, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := imm8 */\n#define ARM_MVN_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define ARM_MVN_REG_IMM8(p, reg, imm8) \\\n  ARM_MVN_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_IMM8_COND(p, reg, imm8, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define ARM_MVNS_REG_IMM8(p, reg, imm8) \\\n  ARM_MVNS_REG_IMM8_COND(p, reg, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define _MVN_REG_IMM8(reg, imm8) \\\n  _MVN_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_IMM8_COND(reg, imm8, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_MVN, reg, 0, imm8, 0, cond)\n#define _MVNS_REG_IMM8(reg, imm8) \\\n  _MVNS_REG_IMM8_COND(reg, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm */\n#define ARM_MVN_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_MVN, rd, 0, rm, cond)\n#define ARM_MVN_REG_REG(p, rd, rm) \\\n  ARM_MVN_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_REG_COND(p, rd, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_MVN, rd, 0, rm, cond)\n#define ARM_MVNS_REG_REG(p, rd, rm) \\\n  ARM_MVNS_REG_REG_COND(p, rd, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_MVN, rd, 0, rm, cond)\n#define _MVN_REG_REG(rd, rm) \\\n  _MVN_REG_REG_COND(rd, rm, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_REG_COND(rd, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_MVN, rd, 0, rm, cond)\n#define _MVNS_REG_REG(rd, rm) \\\n  _MVNS_REG_REG_COND(rd, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rm <shift_type> imm_shift */\n#define ARM_MVN_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MVN_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MVN_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define ARM_MVNS_REG_IMMSHIFT(p, rd, rm, shift_type, imm_shift) \\\n  ARM_MVNS_REG_IMMSHIFT_COND(p, rd, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MVN_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MVN_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, imm_shift, cond)\n#define _MVNS_REG_IMMSHIFT(rd, rm, shift_type, imm_shift) \\\n  _MVNS_REG_IMMSHIFT_COND(rd, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n\n/* Rd := (Rm <shift_type> Rs) */\n#define ARM_MVN_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MVN_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MVN_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define ARM_MVNS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define ARM_MVNS_REG_REGSHIFT(p, rd, rm, shift_type, rs) \\\n  ARM_MVNS_REG_REGSHIFT_COND(p, rd, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _MVN_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define _MVN_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MVN_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n/* S */\n#define _MVNS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_MVN, rd, 0, rm, shift_type, rs, cond)\n#define _MVNS_REG_REGSHIFT(rd, rm, shift_type, rs) \\\n  _MVNS_REG_REGSHIFT_COND(rd, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n\n/* DPIs, arithmetic and logical */\n\n/* -- AND -- */\n\n/* Rd := Rn AND (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_AND_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_AND, rd, rn, imm8, rot, cond)\n#define ARM_AND_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_AND_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ANDS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_AND, rd, rn, imm8, rot, cond)\n#define ARM_ANDS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ANDS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_AND, rd, rn, imm8, rot, cond)\n#define _AND_REG_IMM(rd, rn, imm8, rot) \\\n  _AND_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ANDS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_AND, rd, rn, imm8, rot, cond)\n#define _ANDS_REG_IMM(rd, rn, imm8, rot) \\\n  _ANDS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND imm8 */\n#define ARM_AND_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_AND_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_AND_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_AND_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ANDS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ANDS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ANDS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ANDS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _AND_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _AND_REG_IMM8(rd, rn, imm8) \\\n  _AND_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ANDS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ANDS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ANDS_REG_IMM8(rd, rn, imm8) \\\n  _ANDS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND Rm */\n#define ARM_AND_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_AND, rd, rn, rm, cond)\n#define ARM_AND_REG_REG(p, rd, rn, rm) \\\n  ARM_AND_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ANDS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_AND, rd, rn, rm, cond)\n#define ARM_ANDS_REG_REG(p, rd, rn, rm) \\\n  ARM_ANDS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_AND, rd, rn, rm, cond)\n#define _AND_REG_REG(rd, rn, rm) \\\n  _AND_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ANDS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_AND, rd, rn, rm, cond)\n#define _ANDS_REG_REG(rd, rn, rm) \\\n  _ANDS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND (Rm <shift_type> imm_shift) */\n#define ARM_AND_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_AND_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_AND_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ANDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ANDS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ANDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define _AND_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _AND_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ANDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ANDS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ANDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn AND (Rm <shift_type> Rs) */\n#define ARM_AND_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define ARM_AND_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_AND_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ANDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ANDS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ANDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _AND_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define _AND_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _AND_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ANDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_AND, rd, rn, rm, shift_type, rs, cond)\n#define _ANDS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ANDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- EOR -- */\n\n/* Rd := Rn EOR (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_EOR_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define ARM_EOR_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_EOR_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_EORS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define ARM_EORS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_EORS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define _EOR_REG_IMM(rd, rn, imm8, rot) \\\n  _EOR_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _EORS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_EOR, rd, rn, imm8, rot, cond)\n#define _EORS_REG_IMM(rd, rn, imm8, rot) \\\n  _EORS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR imm8 */\n#define ARM_EOR_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_EOR_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_EOR_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_EOR_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_EORS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_EORS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_EORS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_EORS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _EOR_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _EOR_REG_IMM8(rd, rn, imm8) \\\n  _EOR_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _EORS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _EORS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _EORS_REG_IMM8(rd, rn, imm8) \\\n  _EORS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR Rm */\n#define ARM_EOR_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_EOR, rd, rn, rm, cond)\n#define ARM_EOR_REG_REG(p, rd, rn, rm) \\\n  ARM_EOR_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_EORS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_EOR, rd, rn, rm, cond)\n#define ARM_EORS_REG_REG(p, rd, rn, rm) \\\n  ARM_EORS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_EOR, rd, rn, rm, cond)\n#define _EOR_REG_REG(rd, rn, rm) \\\n  _EOR_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _EORS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_EOR, rd, rn, rm, cond)\n#define _EORS_REG_REG(rd, rn, rm) \\\n  _EORS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR (Rm <shift_type> imm_shift) */\n#define ARM_EOR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_EOR_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_EOR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_EORS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_EORS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_EORS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _EOR_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _EOR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _EORS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _EORS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _EORS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn EOR (Rm <shift_type> Rs) */\n#define ARM_EOR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_EOR_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_EOR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_EORS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_EORS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_EORS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _EOR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define _EOR_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _EOR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _EORS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_EOR, rd, rn, rm, shift_type, rs, cond)\n#define _EORS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _EORS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- SUB -- */\n\n/* Rd := Rn SUB (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_SUB_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define ARM_SUB_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SUB_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_SUBS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define ARM_SUBS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SUBS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define _SUB_REG_IMM(rd, rn, imm8, rot) \\\n  _SUB_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _SUBS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_SUB, rd, rn, imm8, rot, cond)\n#define _SUBS_REG_IMM(rd, rn, imm8, rot) \\\n  _SUBS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB imm8 */\n#define ARM_SUB_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SUB_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SUB_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SUB_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_SUBS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SUBS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SUBS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SUBS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SUB_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SUB_REG_IMM8(rd, rn, imm8) \\\n  _SUB_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _SUBS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SUBS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SUBS_REG_IMM8(rd, rn, imm8) \\\n  _SUBS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB Rm */\n#define ARM_SUB_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_SUB, rd, rn, rm, cond)\n#define ARM_SUB_REG_REG(p, rd, rn, rm) \\\n  ARM_SUB_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_SUBS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_SUB, rd, rn, rm, cond)\n#define ARM_SUBS_REG_REG(p, rd, rn, rm) \\\n  ARM_SUBS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_SUB, rd, rn, rm, cond)\n#define _SUB_REG_REG(rd, rn, rm) \\\n  _SUB_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _SUBS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_SUB, rd, rn, rm, cond)\n#define _SUBS_REG_REG(rd, rn, rm) \\\n  _SUBS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB (Rm <shift_type> imm_shift) */\n#define ARM_SUB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SUB_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SUB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_SUBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SUBS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SUBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SUB_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SUB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _SUBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SUBS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SUBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SUB (Rm <shift_type> Rs) */\n#define ARM_SUB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SUB_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SUB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_SUBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SUBS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SUBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SUB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define _SUB_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SUB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _SUBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_SUB, rd, rn, rm, shift_type, rs, cond)\n#define _SUBS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SUBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- RSB -- */\n\n/* Rd := Rn RSB (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_RSB_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define ARM_RSB_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSB_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_RSBS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define ARM_RSBS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSBS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define _RSB_REG_IMM(rd, rn, imm8, rot) \\\n  _RSB_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _RSBS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_RSB, rd, rn, imm8, rot, cond)\n#define _RSBS_REG_IMM(rd, rn, imm8, rot) \\\n  _RSBS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB imm8 */\n#define ARM_RSB_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSB_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSB_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSB_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_RSBS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSBS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSBS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSBS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSB_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSB_REG_IMM8(rd, rn, imm8) \\\n  _RSB_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _RSBS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSBS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSBS_REG_IMM8(rd, rn, imm8) \\\n  _RSBS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB Rm */\n#define ARM_RSB_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_RSB, rd, rn, rm, cond)\n#define ARM_RSB_REG_REG(p, rd, rn, rm) \\\n  ARM_RSB_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_RSBS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_RSB, rd, rn, rm, cond)\n#define ARM_RSBS_REG_REG(p, rd, rn, rm) \\\n  ARM_RSBS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_RSB, rd, rn, rm, cond)\n#define _RSB_REG_REG(rd, rn, rm) \\\n  _RSB_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _RSBS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_RSB, rd, rn, rm, cond)\n#define _RSBS_REG_REG(rd, rn, rm) \\\n  _RSBS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB (Rm <shift_type> imm_shift) */\n#define ARM_RSB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSB_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSB_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_RSBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSBS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSBS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSB_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSB_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _RSBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSBS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSBS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSB (Rm <shift_type> Rs) */\n#define ARM_RSB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSB_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSB_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_RSBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSBS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSBS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define _RSB_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSB_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _RSBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_RSB, rd, rn, rm, shift_type, rs, cond)\n#define _RSBS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSBS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- ADD -- */\n\n/* Rd := Rn ADD (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_ADD_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define ARM_ADD_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADD_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ADDS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define ARM_ADDS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADDS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define _ADD_REG_IMM(rd, rn, imm8, rot) \\\n  _ADD_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ADDS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_ADD, rd, rn, imm8, rot, cond)\n#define _ADDS_REG_IMM(rd, rn, imm8, rot) \\\n  _ADDS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD imm8 */\n#define ARM_ADD_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADD_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADD_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADD_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ADDS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADDS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADDS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADDS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADD_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADD_REG_IMM8(rd, rn, imm8) \\\n  _ADD_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ADDS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADDS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADDS_REG_IMM8(rd, rn, imm8) \\\n  _ADDS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD Rm */\n#define ARM_ADD_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_ADD, rd, rn, rm, cond)\n#define ARM_ADD_REG_REG(p, rd, rn, rm) \\\n  ARM_ADD_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ADDS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_ADD, rd, rn, rm, cond)\n#define ARM_ADDS_REG_REG(p, rd, rn, rm) \\\n  ARM_ADDS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_ADD, rd, rn, rm, cond)\n#define _ADD_REG_REG(rd, rn, rm) \\\n  _ADD_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ADDS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_ADD, rd, rn, rm, cond)\n#define _ADDS_REG_REG(rd, rn, rm) \\\n  _ADDS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD (Rm <shift_type> imm_shift) */\n#define ARM_ADD_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADD_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADD_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ADDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADDS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADDS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADD_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADD_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ADDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADDS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADDS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADD (Rm <shift_type> Rs) */\n#define ARM_ADD_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADD_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADD_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ADDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADDS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADDS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADD_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define _ADD_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADD_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ADDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_ADD, rd, rn, rm, shift_type, rs, cond)\n#define _ADDS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADDS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- ADC -- */\n\n/* Rd := Rn ADC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_ADC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define ARM_ADC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ADCS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define ARM_ADCS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ADCS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define _ADC_REG_IMM(rd, rn, imm8, rot) \\\n  _ADC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ADCS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_ADC, rd, rn, imm8, rot, cond)\n#define _ADCS_REG_IMM(rd, rn, imm8, rot) \\\n  _ADCS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC imm8 */\n#define ARM_ADC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ADCS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ADCS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ADCS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ADCS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADC_REG_IMM8(rd, rn, imm8) \\\n  _ADC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ADCS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ADCS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ADCS_REG_IMM8(rd, rn, imm8) \\\n  _ADCS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC Rm */\n#define ARM_ADC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_ADC, rd, rn, rm, cond)\n#define ARM_ADC_REG_REG(p, rd, rn, rm) \\\n  ARM_ADC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ADCS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_ADC, rd, rn, rm, cond)\n#define ARM_ADCS_REG_REG(p, rd, rn, rm) \\\n  ARM_ADCS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_ADC, rd, rn, rm, cond)\n#define _ADC_REG_REG(rd, rn, rm) \\\n  _ADC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ADCS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_ADC, rd, rn, rm, cond)\n#define _ADCS_REG_REG(rd, rn, rm) \\\n  _ADCS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC (Rm <shift_type> imm_shift) */\n#define ARM_ADC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ADCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ADCS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ADCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ADCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ADCS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ADCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ADC (Rm <shift_type> Rs) */\n#define ARM_ADC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ADCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ADCS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ADCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ADC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define _ADC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ADCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_ADC, rd, rn, rm, shift_type, rs, cond)\n#define _ADCS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ADCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- SBC -- */\n\n/* Rd := Rn SBC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_SBC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define ARM_SBC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SBC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_SBCS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define ARM_SBCS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_SBCS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define _SBC_REG_IMM(rd, rn, imm8, rot) \\\n  _SBC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _SBCS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_SBC, rd, rn, imm8, rot, cond)\n#define _SBCS_REG_IMM(rd, rn, imm8, rot) \\\n  _SBCS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC imm8 */\n#define ARM_SBC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SBC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SBC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SBC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_SBCS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_SBCS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_SBCS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_SBCS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SBC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SBC_REG_IMM8(rd, rn, imm8) \\\n  _SBC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _SBCS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _SBCS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _SBCS_REG_IMM8(rd, rn, imm8) \\\n  _SBCS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC Rm */\n#define ARM_SBC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_SBC, rd, rn, rm, cond)\n#define ARM_SBC_REG_REG(p, rd, rn, rm) \\\n  ARM_SBC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_SBCS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_SBC, rd, rn, rm, cond)\n#define ARM_SBCS_REG_REG(p, rd, rn, rm) \\\n  ARM_SBCS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_SBC, rd, rn, rm, cond)\n#define _SBC_REG_REG(rd, rn, rm) \\\n  _SBC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _SBCS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_SBC, rd, rn, rm, cond)\n#define _SBCS_REG_REG(rd, rn, rm) \\\n  _SBCS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC (Rm <shift_type> imm_shift) */\n#define ARM_SBC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SBC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SBC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_SBCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_SBCS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_SBCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SBC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SBC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _SBCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _SBCS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _SBCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn SBC (Rm <shift_type> Rs) */\n#define ARM_SBC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SBC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SBC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_SBCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_SBCS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_SBCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _SBC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define _SBC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SBC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _SBCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_SBC, rd, rn, rm, shift_type, rs, cond)\n#define _SBCS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _SBCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- RSC -- */\n\n/* Rd := Rn RSC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_RSC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define ARM_RSC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_RSCS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define ARM_RSCS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_RSCS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define _RSC_REG_IMM(rd, rn, imm8, rot) \\\n  _RSC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _RSCS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_RSC, rd, rn, imm8, rot, cond)\n#define _RSCS_REG_IMM(rd, rn, imm8, rot) \\\n  _RSCS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC imm8 */\n#define ARM_RSC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_RSCS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_RSCS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_RSCS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_RSCS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSC_REG_IMM8(rd, rn, imm8) \\\n  _RSC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _RSCS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _RSCS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _RSCS_REG_IMM8(rd, rn, imm8) \\\n  _RSCS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC Rm */\n#define ARM_RSC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_RSC, rd, rn, rm, cond)\n#define ARM_RSC_REG_REG(p, rd, rn, rm) \\\n  ARM_RSC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_RSCS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_RSC, rd, rn, rm, cond)\n#define ARM_RSCS_REG_REG(p, rd, rn, rm) \\\n  ARM_RSCS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_RSC, rd, rn, rm, cond)\n#define _RSC_REG_REG(rd, rn, rm) \\\n  _RSC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _RSCS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_RSC, rd, rn, rm, cond)\n#define _RSCS_REG_REG(rd, rn, rm) \\\n  _RSCS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC (Rm <shift_type> imm_shift) */\n#define ARM_RSC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_RSCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_RSCS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_RSCS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _RSCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _RSCS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _RSCS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn RSC (Rm <shift_type> Rs) */\n#define ARM_RSC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_RSCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_RSCS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_RSCS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _RSC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define _RSC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _RSCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_RSC, rd, rn, rm, shift_type, rs, cond)\n#define _RSCS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _RSCS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- ORR -- */\n\n/* Rd := Rn ORR (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_ORR_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define ARM_ORR_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ORR_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_ORRS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define ARM_ORRS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_ORRS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define _ORR_REG_IMM(rd, rn, imm8, rot) \\\n  _ORR_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _ORRS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_ORR, rd, rn, imm8, rot, cond)\n#define _ORRS_REG_IMM(rd, rn, imm8, rot) \\\n  _ORRS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR imm8 */\n#define ARM_ORR_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ORR_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ORR_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ORR_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_ORRS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_ORRS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_ORRS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_ORRS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ORR_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ORR_REG_IMM8(rd, rn, imm8) \\\n  _ORR_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _ORRS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _ORRS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _ORRS_REG_IMM8(rd, rn, imm8) \\\n  _ORRS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR Rm */\n#define ARM_ORR_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_ORR, rd, rn, rm, cond)\n#define ARM_ORR_REG_REG(p, rd, rn, rm) \\\n  ARM_ORR_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_ORRS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_ORR, rd, rn, rm, cond)\n#define ARM_ORRS_REG_REG(p, rd, rn, rm) \\\n  ARM_ORRS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_ORR, rd, rn, rm, cond)\n#define _ORR_REG_REG(rd, rn, rm) \\\n  _ORR_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _ORRS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_ORR, rd, rn, rm, cond)\n#define _ORRS_REG_REG(rd, rn, rm) \\\n  _ORRS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR (Rm <shift_type> imm_shift) */\n#define ARM_ORR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ORR_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ORR_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_ORRS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_ORRS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_ORRS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ORR_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ORR_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _ORRS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, imm_shift, cond)\n#define _ORRS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _ORRS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn ORR (Rm <shift_type> Rs) */\n#define ARM_ORR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ORR_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ORR_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_ORRS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define ARM_ORRS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_ORRS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _ORR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define _ORR_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ORR_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _ORRS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_ORR, rd, rn, rm, shift_type, rs, cond)\n#define _ORRS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _ORRS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* -- BIC -- */\n\n/* Rd := Rn BIC (imm8 ROR rot) ; rot is power of 2 */\n#define ARM_BIC_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_REG_IMM8ROT_COND(p, ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define ARM_BIC_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_BIC_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n#define ARM_BICS_REG_IMM_COND(p, rd, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define ARM_BICS_REG_IMM(p, rd, rn, imm8, rot) \\\n  ARM_BICS_REG_IMM_COND(p, rd, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_REG_IMM8ROT_COND(ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define _BIC_REG_IMM(rd, rn, imm8, rot) \\\n  _BIC_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#define _BICS_REG_IMM_COND(rd, rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_BIC, rd, rn, imm8, rot, cond)\n#define _BICS_REG_IMM(rd, rn, imm8, rot) \\\n  _BICS_REG_IMM_COND(rd, rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC imm8 */\n#define ARM_BIC_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_BIC_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_BIC_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_BIC_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n#define ARM_BICS_REG_IMM8_COND(p, rd, rn, imm8, cond) \\\n  ARM_BICS_REG_IMM_COND(p, rd, rn, imm8, 0, cond)\n#define ARM_BICS_REG_IMM8(p, rd, rn, imm8) \\\n  ARM_BICS_REG_IMM8_COND(p, rd, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _BIC_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _BIC_REG_IMM8(rd, rn, imm8) \\\n  _BIC_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#define _BICS_REG_IMM8_COND(rd, rn, imm8, cond) \\\n  _BICS_REG_IMM_COND(rd, rn, imm8, 0, cond)\n#define _BICS_REG_IMM8(rd, rn, imm8) \\\n  _BICS_REG_IMM8_COND(rd, rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC Rm */\n#define ARM_BIC_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_REG_REG_COND(p, ARMOP_BIC, rd, rn, rm, cond)\n#define ARM_BIC_REG_REG(p, rd, rn, rm) \\\n  ARM_BIC_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n#define ARM_BICS_REG_REG_COND(p, rd, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_BIC, rd, rn, rm, cond)\n#define ARM_BICS_REG_REG(p, rd, rn, rm) \\\n  ARM_BICS_REG_REG_COND(p, rd, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_REG_REG_COND(ARMOP_BIC, rd, rn, rm, cond)\n#define _BIC_REG_REG(rd, rn, rm) \\\n  _BIC_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#define _BICS_REG_REG_COND(rd, rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_BIC, rd, rn, rm, cond)\n#define _BICS_REG_REG(rd, rn, rm) \\\n  _BICS_REG_REG_COND(rd, rn, rm, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC (Rm <shift_type> imm_shift) */\n#define ARM_BIC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_REG_IMMSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_BIC_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_BIC_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define ARM_BICS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define ARM_BICS_REG_IMMSHIFT(p, rd, rn, rm, shift_type, imm_shift) \\\n  ARM_BICS_REG_IMMSHIFT_COND(p, rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_REG_IMMSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _BIC_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _BIC_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#define _BICS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, imm_shift, cond)\n#define _BICS_REG_IMMSHIFT(rd, rn, rm, shift_type, imm_shift) \\\n  _BICS_REG_IMMSHIFT_COND(rd, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* Rd := Rn BIC (Rm <shift_type> Rs) */\n#define ARM_BIC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_REG_REGSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_BIC_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_BIC_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define ARM_BICS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, cond) \\\n  ARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define ARM_BICS_REG_REGSHIFT(p, rd, rn, rm, shift_type, rs) \\\n  ARM_BICS_REG_REGSHIFT_COND(p, rd, rn, rm, shift_type, rs, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _BIC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_REG_REGSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define _BIC_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _BIC_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#define _BICS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\n  ARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_BIC, rd, rn, rm, shift_type, rs, cond)\n#define _BICS_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n  _BICS_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n\n\n\n\n/* DPIs, comparison */\n\n/* PSR := TST Rn, (imm8 ROR 2*rot) */\n#define ARM_TST_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_TST, 0, rn, imm8, rot, cond)\n#define ARM_TST_REG_IMM(p, rn, imm8, rot) \\\n  ARM_TST_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_TST, 0, rn, imm8, rot, cond)\n#define _TST_REG_IMM(rn, imm8, rot) \\\n  _TST_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := TST Rn, imm8 */\n#define ARM_TST_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_TST_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_TST_REG_IMM8(p, rn, imm8) \\\n  ARM_TST_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_IMM8_COND(rn, imm8, cond) \\\n  _TST_REG_IMM_COND(rn, imm8, 0, cond)\n#define _TST_REG_IMM8(rn, imm8) \\\n  _TST_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := TST Rn, Rm */\n#define ARM_TST_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_TST, 0, rn, rm, cond)\n#define ARM_TST_REG_REG(p, rn, rm) \\\n  ARM_TST_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_TST, 0, rn, rm, cond)\n#define _TST_REG_REG(rn, rm) \\\n  _TST_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := TST Rn, (Rm <shift_type> imm8) */\n#define ARM_TST_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_TST, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_TST_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_TST_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TST_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_TST, 0, rn, rm, shift_type, imm_shift, cond)\n#define _TST_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _TST_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, (imm8 ROR 2*rot) */\n#define ARM_TEQ_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_TEQ, 0, rn, imm8, rot, cond)\n#define ARM_TEQ_REG_IMM(p, rn, imm8, rot) \\\n  ARM_TEQ_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_TEQ, 0, rn, imm8, rot, cond)\n#define _TEQ_REG_IMM(rn, imm8, rot) \\\n  _TEQ_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, imm8 */\n#define ARM_TEQ_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_TEQ_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_TEQ_REG_IMM8(p, rn, imm8) \\\n  ARM_TEQ_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_IMM8_COND(rn, imm8, cond) \\\n  _TEQ_REG_IMM_COND(rn, imm8, 0, cond)\n#define _TEQ_REG_IMM8(rn, imm8) \\\n  _TEQ_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, Rm */\n#define ARM_TEQ_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_TEQ, 0, rn, rm, cond)\n#define ARM_TEQ_REG_REG(p, rn, rm) \\\n  ARM_TEQ_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_TEQ, 0, rn, rm, cond)\n#define _TEQ_REG_REG(rn, rm) \\\n  _TEQ_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := TEQ Rn, (Rm <shift_type> imm8) */\n#define ARM_TEQ_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_TEQ, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_TEQ_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_TEQ_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _TEQ_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_TEQ, 0, rn, rm, shift_type, imm_shift, cond)\n#define _TEQ_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _TEQ_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, (imm8 ROR 2*rot) */\n#define ARM_CMP_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_CMP, 0, rn, imm8, rot, cond)\n#define ARM_CMP_REG_IMM(p, rn, imm8, rot) \\\n  ARM_CMP_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_CMP, 0, rn, imm8, rot, cond)\n#define _CMP_REG_IMM(rn, imm8, rot) \\\n  _CMP_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, imm8 */\n#define ARM_CMP_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_CMP_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_CMP_REG_IMM8(p, rn, imm8) \\\n  ARM_CMP_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_IMM8_COND(rn, imm8, cond) \\\n  _CMP_REG_IMM_COND(rn, imm8, 0, cond)\n#define _CMP_REG_IMM8(rn, imm8) \\\n  _CMP_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, Rm */\n#define ARM_CMP_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_CMP, 0, rn, rm, cond)\n#define ARM_CMP_REG_REG(p, rn, rm) \\\n  ARM_CMP_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_CMP, 0, rn, rm, cond)\n#define _CMP_REG_REG(rn, rm) \\\n  _CMP_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, (Rm <shift_type> imm8) */\n#define ARM_CMP_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_CMP, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_CMP_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_CMP_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_CMP, 0, rn, rm, shift_type, imm_shift, cond)\n#define _CMP_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _CMP_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMP Rn, (Rm <shift_type> Rs) */\n#define ARM_CMP_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_CMP, 0, rn, rm, shift_type, rs, cond)\n#define ARM_CMP_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_CMP_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n/* PSR := CMN Rn, (Rm <shift_type> Rs) */\n#define ARM_CMN_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_CMN, 0, rn, rm, shift_type, rs, cond)\n#define ARM_CMN_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_CMN_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n/* PSR := TST Rn, (Rm <shift_type> Rs) */\n#define ARM_TST_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_TST, 0, rn, rm, shift_type, rs, cond)\n#define ARM_TST_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_TST_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n/* PSR := TEQ Rn, (Rm <shift_type> Rs) */\n#define ARM_TEQ_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, cond) \\\nARM_DPIOP_S_REG_REGSHIFT_COND(p, ARMOP_TEQ, 0, rn, rm, shift_type, rs, cond)\n#define ARM_TEQ_REG_REGSHIFT(p, rn, rm, shift_type, rs) \\\nARM_TEQ_REG_REGSHIFT_COND(p, rn, rm, shift_type, rs, ARMCOND_AL)\n\n\n\n#ifndef ARM_NOIASM\n#define _CMP_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, cond) \\\nARM_IASM_DPIOP_S_REG_REGSHIFT_COND(ARMOP_CMP, rd, rn, rm, shift_type, rs, cond)\n#define _CMP_REG_REGSHIFT(rd, rn, rm, shift_type, rs) \\\n_CMP_REG_REGSHIFT_COND(rd, rn, rm, shift_type, rs, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, (imm8 ROR 2*rot) */\n#define ARM_CMN_REG_IMM_COND(p, rn, imm8, rot, cond) \\\n  ARM_DPIOP_S_REG_IMM8ROT_COND(p, ARMOP_CMN, 0, rn, imm8, rot, cond)\n#define ARM_CMN_REG_IMM(p, rn, imm8, rot) \\\n  ARM_CMN_REG_IMM_COND(p, rn, imm8, rot, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_IMM_COND(rn, imm8, rot, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMM8ROT_COND(ARMOP_CMN, 0, rn, imm8, rot, cond)\n#define _CMN_REG_IMM(rn, imm8, rot) \\\n  _CMN_REG_IMM_COND(rn, imm8, rot, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, imm8 */\n#define ARM_CMN_REG_IMM8_COND(p, rn, imm8, cond) \\\n  ARM_CMN_REG_IMM_COND(p, rn, imm8, 0, cond)\n#define ARM_CMN_REG_IMM8(p, rn, imm8) \\\n  ARM_CMN_REG_IMM8_COND(p, rn, imm8, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_IMM8_COND(rn, imm8, cond) \\\n  _CMN_REG_IMM_COND(rn, imm8, 0, cond)\n#define _CMN_REG_IMM8(rn, imm8) \\\n  _CMN_REG_IMM8_COND(rn, imm8, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, Rm */\n#define ARM_CMN_REG_REG_COND(p, rn, rm, cond) \\\n  ARM_DPIOP_S_REG_REG_COND(p, ARMOP_CMN, 0, rn, rm, cond)\n#define ARM_CMN_REG_REG(p, rn, rm) \\\n  ARM_CMN_REG_REG_COND(p, rn, rm, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_REG_COND(rn, rm, cond) \\\n  ARM_IASM_DPIOP_S_REG_REG_COND(ARMOP_CMN, 0, rn, rm, cond)\n#define _CMN_REG_REG(rn, rm) \\\n  _CMN_REG_REG_COND(rn, rm, ARMCOND_AL)\n#endif\n\n\n/* PSR := CMN Rn, (Rm <shift_type> imm8) */\n#define ARM_CMN_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, cond) \\\n  ARM_DPIOP_S_REG_IMMSHIFT_COND(p, ARMOP_CMN, 0, rn, rm, shift_type, imm_shift, cond)\n#define ARM_CMN_REG_IMMSHIFT(p, rn, rm, shift_type, imm_shift) \\\n  ARM_CMN_REG_IMMSHIFT_COND(p, rn, rm, shift_type, imm_shift, ARMCOND_AL)\n\n#ifndef ARM_NOIASM\n#define _CMN_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, cond) \\\n  ARM_IASM_DPIOP_S_REG_IMMSHIFT_COND(ARMOP_CMN, 0, rn, rm, shift_type, imm_shift, cond)\n#define _CMN_REG_IMMSHIFT(rn, rm, shift_type, imm_shift) \\\n  _CMN_REG_IMMSHIFT_COND(rn, rm, shift_type, imm_shift, ARMCOND_AL)\n#endif\n\n\n\n/* end generated */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/arm_emit.h",
    "content": "/* gameplaySP\n *\n * Copyright (C) 2006 Exophase <exophase@gmail.com>\n * Copyright (C) 2012 Qingping He\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License as\n * published by the Free Software Foundation; either version 2 of\n * the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef ARM_EMIT_H\n#define ARM_EMIT_H\n\n#include \"arm_codegen.h\"\n#include \"dynarec_linker.h\"\n#include \"armcpu.h\"\n#include \"MMU.h\"\n#include \"NDSSystem.h\"\n\nusing namespace Dynarec;\n\nextern u32 *reg;\n\nu32 arm_update_gba_arm(u32 pc);\nu32 arm_update_gba_thumb(u32 pc);\nu32 arm_update_gba_idle_arm(u32 pc);\nu32 arm_update_gba_idle_thumb(u32 pc);\n\n// Although these are defined as a function, don't call them as\n// such (jump to it instead)\nvoid arm_indirect_branch_arm(u32 address);\nvoid arm_indirect_branch_thumb(u32 address);\nvoid arm_indirect_branch_dual_arm(u32 address);\nvoid arm_indirect_branch_dual_thumb(u32 address);\n\nvoid execute_store_cpsr(u32 new_cpsr, u32 store_mask, u32 address);\nu32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address);\nvoid execute_store_spsr(u32 new_cpsr, u32 store_mask);\nu32 execute_read_spsr();\nu32 execute_spsr_restore(u32 address);\n\nvoid execute_swi_arm(u32 pc);\nvoid execute_swi_thumb(u32 pc);\n\nvoid execute_store_u32_safe(u32 address, u32 source);\n\nvoid step_debug_arm(u32 pc);\n\n\n#define write32(value)                                                        \\\n  *((u32 *)translation_ptr) = value;                                          \\\n  translation_ptr += 4                                                        \\\n\n#define arm_relative_offset(source, offset)                                   \\\n  (((((u32)offset - (u32)source) - 8) >> 2) & 0xFFFFFF)                       \\\n\n\n// reg_base_offset is the amount of bytes after reg_base where the registers\n// actually begin.\n\n#define reg_base_offset 1024\n\n\n#define reg_a0          ARMREG_R0\n#define reg_a1          ARMREG_R1\n#define reg_a2          ARMREG_R2\n\n#define reg_s0          ARMREG_R9\n#define reg_base        ARMREG_SP\n#define reg_flags       ARMREG_R11\n\n#define reg_cycles      ARMREG_R12\n\n#define reg_rv          ARMREG_R0\n\n#define reg_rm          ARMREG_R0\n#define reg_rn          ARMREG_R1\n#define reg_rs          ARMREG_R14\n#define reg_rd          ARMREG_R0\n\n\n// Register allocation layout for ARM and Thumb:\n// Map from a GBA register to a host ARM register. -1 means load it\n// from memory into one of the temp registers.\n\n// The following registers are chosen based on statistical analysis\n// of a few games (see below), but might not be the best ones. Results\n// vary tremendously between ARM and Thumb (for obvious reasons), so\n// two sets are used. Take care to not call any function which can\n// overwrite any of these registers from the dynarec - only call\n// trusted functions in arm_stub.S which know how to save/restore\n// them and know how to transfer them to the C functions it calls\n// if necessary.\n\n// The following define the actual registers available for allocation.\n// As registers are freed up add them to this list.\n\n// Note that r15 is linked to the a0 temp reg - this register will\n// be preloaded with a constant upon read, and used to link to\n// indirect branch functions upon write.\n\n#define reg_x0         ARMREG_R3\n#define reg_x1         ARMREG_R4\n#define reg_x2         ARMREG_R5\n#define reg_x3         ARMREG_R6\n#define reg_x4         ARMREG_R7\n#define reg_x5         ARMREG_R8\n\n#define mem_reg        -1\n\n/*\n\nARM register usage (38.775138% ARM instructions):\nr00: 18.263814% (-- 18.263814%)\nr12: 11.531477% (-- 29.795291%)\nr09: 11.500162% (-- 41.295453%)\nr14: 9.063440% (-- 50.358893%)\nr06: 7.837682% (-- 58.196574%)\nr01: 7.401049% (-- 65.597623%)\nr07: 6.778340% (-- 72.375963%)\nr05: 5.445009% (-- 77.820973%)\nr02: 5.427288% (-- 83.248260%)\nr03: 5.293743% (-- 88.542003%)\nr04: 3.601103% (-- 92.143106%)\nr11: 3.207311% (-- 95.350417%)\nr10: 2.334864% (-- 97.685281%)\nr08: 1.708207% (-- 99.393488%)\nr15: 0.311270% (-- 99.704757%)\nr13: 0.295243% (-- 100.000000%)\n\nThumb register usage (61.224862% Thumb instructions):\nr00: 34.788858% (-- 34.788858%)\nr01: 26.564083% (-- 61.352941%)\nr03: 10.983500% (-- 72.336441%)\nr02: 8.303127% (-- 80.639567%)\nr04: 4.900381% (-- 85.539948%)\nr05: 3.941292% (-- 89.481240%)\nr06: 3.257582% (-- 92.738822%)\nr07: 2.644851% (-- 95.383673%)\nr13: 1.408824% (-- 96.792497%)\nr08: 0.906433% (-- 97.698930%)\nr09: 0.679693% (-- 98.378623%)\nr10: 0.656446% (-- 99.035069%)\nr12: 0.453668% (-- 99.488737%)\nr14: 0.248909% (-- 99.737646%)\nr11: 0.171066% (-- 99.908713%)\nr15: 0.091287% (-- 100.000000%)\n\n*/\n\ns32 arm_register_allocation[] =\n{\n  reg_x0,       // GBA r0\n  reg_x1,       // GBA r1\n  mem_reg,      // GBA r2\n  mem_reg,      // GBA r3\n  mem_reg,      // GBA r4\n  mem_reg,      // GBA r5\n  reg_x2,       // GBA r6\n  mem_reg,      // GBA r7\n  mem_reg,      // GBA r8\n  reg_x3,       // GBA r9\n  mem_reg,      // GBA r10\n  mem_reg,      // GBA r11\n  reg_x4,       // GBA r12\n  mem_reg,      // GBA r13\n  reg_x5,       // GBA r14\n  reg_a0        // GBA r15\n\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n};\n\ns32 thumb_register_allocation[] =\n{\n  reg_x0,       // GBA r0\n  reg_x1,       // GBA r1\n  reg_x2,       // GBA r2\n  reg_x3,       // GBA r3\n  reg_x4,       // GBA r4\n  reg_x5,       // GBA r5\n  mem_reg,      // GBA r6\n  mem_reg,      // GBA r7\n  mem_reg,      // GBA r8\n  mem_reg,      // GBA r9\n  mem_reg,      // GBA r10\n  mem_reg,      // GBA r11\n  mem_reg,      // GBA r12\n  mem_reg,      // GBA r13\n  mem_reg,      // GBA r14\n  reg_a0        // GBA r15\n\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n  mem_reg,\n};\n\n\n\n#define arm_imm_lsl_to_rot(value)                                             \\\n  (32 - value)                                                                \\\n\n\n__attribute__((noinline)) u32 arm_disect_imm_32bit(u32 imm, u32 *stores, u32 *rotations)\n{\n  u32 store_count = 0;\n  u32 left_shift = 0;\n\n  // Otherwise it'll return 0 things to store because it'll never\n  // find anything.\n  if(imm == 0)\n  {\n    rotations[0] = 0;\n    stores[0] = 0;\n    return 1;\n  }\n\n  // Find chunks of non-zero data at 2 bit alignments.\n  while(1)\n  {\n    for(; left_shift < 32; left_shift += 2)\n    {\n      if((imm >> left_shift) & 0x03)\n        break;\n    }\n\n    if(left_shift == 32)\n    {\n      // We've hit the end of the useful data.\n      return store_count;\n    }\n\n    // Hit the end, it might wrap back around to the beginning.\n    if(left_shift >= 24)\n    {\n      // Make a mask for the residual bits. IE, if we have\n      // 5 bits of data at the end we can wrap around to 3\n      // bits of data in the beginning. Thus the first\n      // thing, after being shifted left, has to be less\n      // than 111b, 0x7, or (1 << 3) - 1.\n      u32 top_bits = 32 - left_shift;\n      u32 residual_bits = 8 - top_bits;\n      u32 residual_mask = (1 << residual_bits) - 1;\n\n      if((store_count > 1) && (left_shift > 24) &&\n       ((stores[0] << ((32 - rotations[0]) & 0x1F)) < residual_mask))\n      {\n        // Then we can throw out the last bit and tack it on\n        // to the first bit.\n        stores[0] =\n         (stores[0] << ((top_bits + (32 - rotations[0])) & 0x1F)) |\n         ((imm >> left_shift) & 0xFF);\n        rotations[0] = top_bits;\n\n        return store_count;\n      }\n      else\n      {\n        // There's nothing to wrap over to in the beginning\n        stores[store_count] = (imm >> left_shift) & 0xFF;\n        rotations[store_count] = (32 - left_shift) & 0x1F;\n        return store_count + 1;\n      }\n      break;\n    }\n\n    stores[store_count] = (imm >> left_shift) & 0xFF;\n    rotations[store_count] = (32 - left_shift) & 0x1F;\n\n    store_count++;\n    left_shift += 8;\n  }\n\n  return 0;\n}\n\n#define arm_load_imm_32bit(ireg, imm)                                         \\\n{                                                                             \\\n  u32 stores[4];                                                              \\\n  u32 rotations[4];                                                           \\\n  u32 store_count = arm_disect_imm_32bit(imm, stores, rotations);             \\\n  u32 i;                                                                      \\\n                                                                              \\\n  ARM_MOV_REG_IMM(0, ireg, stores[0], rotations[0]);                          \\\n                                                                              \\\n  for(i = 1; i < store_count; i++)                                            \\\n  {                                                                           \\\n    ARM_ORR_REG_IMM(0, ireg, ireg, stores[i], rotations[i]);                  \\\n  }                                                                           \\\n}                                                                             \\\n\n\n#define generate_load_pc(ireg, new_pc)                                        \\\n  arm_load_imm_32bit(ireg, new_pc)                                            \\\n\n#define generate_load_imm(ireg, imm, imm_ror)                                 \\\n  ARM_MOV_REG_IMM(0, ireg, imm, imm_ror)                                      \\\n\n\n\n#define generate_shift_left(ireg, imm)                                        \\\n  ARM_MOV_REG_IMMSHIFT(0, ireg, ireg, ARMSHIFT_LSL, imm)                      \\\n\n#define generate_shift_right(ireg, imm)                                       \\\n  ARM_MOV_REG_IMMSHIFT(0, ireg, ireg, ARMSHIFT_LSR, imm)                      \\\n\n#define generate_shift_right_arithmetic(ireg, imm)                            \\\n  ARM_MOV_REG_IMMSHIFT(0, ireg, ireg, ARMSHIFT_ASR, imm)                      \\\n\n#define generate_rotate_right(ireg, imm)                                      \\\n  ARM_MOV_REG_IMMSHIFT(0, ireg, ireg, ARMSHIFT_ROR, imm)                      \\\n\n#define generate_add(ireg_dest, ireg_src)                                     \\\n  ARM_ADD_REG_REG(0, ireg_dest, ireg_dest, ireg_src)                          \\\n\n#define generate_sub(ireg_dest, ireg_src)                                     \\\n  ARM_SUB_REG_REG(0, ireg_dest, ireg_dest, ireg_src)                          \\\n\n#define generate_or(ireg_dest, ireg_src)                                      \\\n  ARM_ORR_REG_REG(0, ireg_dest, ireg_dest, ireg_src)                          \\\n\n#define generate_xor(ireg_dest, ireg_src)                                     \\\n  ARM_EOR_REG_REG(0, ireg_dest, ireg_dest, ireg_src)                          \\\n\n#define generate_add_imm(ireg, imm, imm_ror)                                  \\\n  ARM_ADD_REG_IMM(0, ireg, ireg, imm, imm_ror)                                \\\n\n#define generate_sub_imm(ireg, imm, imm_ror)                                  \\\n  ARM_SUB_REG_IMM(0, ireg, ireg, imm, imm_ror)                                \\\n\n#define generate_xor_imm(ireg, imm, imm_ror)                                  \\\n  ARM_EOR_REG_IMM(0, ireg, ireg, imm, imm_ror)                                \\\n\n#define generate_add_reg_reg_imm(ireg_dest, ireg_src, imm, imm_ror)           \\\n  ARM_ADD_REG_IMM(0, ireg_dest, ireg_src, imm, imm_ror)                       \\\n\n#define generate_and_imm(ireg, imm, imm_ror)                                  \\\n  ARM_AND_REG_IMM(0, ireg, ireg, imm, imm_ror)                                \\\n\n#define generate_mov(ireg_dest, ireg_src)                                     \\\n  if(ireg_dest != ireg_src)                                                   \\\n  {                                                                           \\\n    ARM_MOV_REG_REG(0, ireg_dest, ireg_src);                                  \\\n  }                                                                           \\\n\n//#define generate_function_call(function_location)                             \\\n//  do                            \t\t\t\t\t\t\t\t\t\t\t \\\n//  {                           \t\t\t\t\t\t\t\t\t\t\t\t  \\\n//  ARM_BL(0, arm_relative_offset(translation_ptr, function_location));          \\\n//  LOGE(\"gen fun call : %x %x %x\", (u32)translation_ptr,(u32)function_location,((u32)function_location-(u32)translation_ptr - 8)>>2);\\\n//  }while(0);\n\n#define generate_function_call(function_location)                             \\\n  do                            \t\t\t\t\t\t\t\t\t\t\t \\\n  {                           \t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t  arm_load_imm_32bit(ARMREG_LR,(u32)function_location);\t\t\t\t\t  \\\n\t  ARM_BLX(0, ARMREG_LR);\t\t\t\t\t\t\t\t\t\t\t\t \\\n  }while(0);\n\n#define generate_function_call_step1(function_location)                         \\\n  do                            \t\t\t\t\t\t\t\t\t\t\t \\\n  {                           \t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t  arm_load_imm_32bit(ARMREG_LR,(u32)function_location);\t\t\t\t\t  \\\n  }while(0);\n\n#define generate_function_call_step2(function_location)                         \\\ndo                            \t\t\t\t\t\t\t\t\t\t\t \\\n{                           \t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t ARM_BLX(0, ARMREG_LR);\t\t\t\t\t\t\t\t\t\t\t\t \\\n}while(0);\n\n#define generate_exit_block()                                                 \\\n  ARM_BX(0, ARMREG_LR)                                                        \\\n\n// The branch target is to be filled in later (thus a 0 for now)\n\n#define generate_branch_filler(condition_code, writeback_location)            \\\n  (writeback_location) = translation_ptr;                                     \\\n  ARM_B_COND(0, condition_code, 0)                                            \\\n\n#define generate_update_pc(new_pc)                                            \\\n  generate_load_pc(reg_a0, new_pc)                                            \\\n\n#define generate_cycle_update()                                               \\\n  if(cycle_count)                                                             \\\n  {                                                                           \\\n    if(cycle_count >> 8)                                                      \\\n    {                                                                         \\\n      ARM_ADD_REG_IMM(0, reg_cycles, reg_cycles, (cycle_count >> 8) & 0xFF,   \\\n       arm_imm_lsl_to_rot(8));                                                \\\n    }                                                                         \\\n    ARM_ADD_REG_IMM(0, reg_cycles, reg_cycles, (cycle_count & 0xFF), 0);      \\\n    cycle_count = 0;                                                          \\\n  }                                                                           \\\n\n#define generate_cycle_update_flag_set()                                      \\\n  if(cycle_count >> 8)                                                        \\\n  {                                                                           \\\n    ARM_ADD_REG_IMM(0, reg_cycles, reg_cycles, (cycle_count >> 8) & 0xFF,     \\\n     arm_imm_lsl_to_rot(8));                                                  \\\n  }                                                                           \\\n  generate_save_flags();                                                      \\\n  ARM_ADDS_REG_IMM(0, reg_cycles, reg_cycles, (cycle_count & 0xFF), 0);       \\\n  cycle_count = 0                                                             \\\n\n#define generate_branch_patch_conditional_arm(dest, offset)                       \\\n\tgenerate_cycle_update();\\\n  ARM_SUB_REG_IMM(0, reg_cycles, reg_cycles, (((pc - cond_pc)>>2) & 0xFF), 0)  ;\\\n  *((u32 *)(dest)) = (*((u32 *)dest) & 0xFF000000) |                          \\\n   arm_relative_offset(dest, offset);                                          \\\n   ARM_ADD_REG_IMM(0, reg_cycles, reg_cycles, (((pc - cond_pc)>>2) & 0xFF), 0)  \\\n\n\n#define generate_branch_patch_conditional_thumb(dest, offset)                       \\\n\t\tARM_ADD_REG_IMM(0, reg_cycles, reg_cycles, 2, 0);  \\\n  *((u32 *)(dest)) = (*((u32 *)dest) & 0xFF000000) |                          \\\n   arm_relative_offset(dest, offset);                                          \\\n   ARM_ADD_REG_IMM(0, reg_cycles, reg_cycles, 1, 0)  \\\n\n#define generate_branch_patch_unconditional(dest, offset)                     \\\n  *((u32 *)(dest)) = (*((u32 *)dest) & 0xFF000000) |                          \\\n   arm_relative_offset(dest, offset)                                          \\\n\n\n// A different function is called for idle updates because of the relative\n// location of the embedded PC. The idle version could be optimized to put\n// the CPU into halt mode too, however.\n\n#define generate_branch_idle_eliminate(writeback_location, new_pc, mode)      \\\n  generate_function_call(arm_update_gba_idle_##mode);                         \\\n  write32(new_pc);                                                            \\\n  generate_branch_filler(ARMCOND_AL, writeback_location)                      \\\n\n#define generate_branch_update(writeback_location, new_pc, mode)              \\\n  generate_function_call_step1(arm_update_gba_##mode);                        \\\n  ARM_MOV_REG_IMMSHIFT(0, reg_a0, reg_cycles, ARMSHIFT_LSR, 31);              \\\n  ARM_ADD_REG_IMMSHIFT(0, ARMREG_PC, ARMREG_PC, reg_a0, ARMSHIFT_LSL, 2);     \\\n  write32(new_pc);                                                            \\\n  generate_function_call_step2(arm_update_gba_##mode);                        \\\n  generate_branch_filler(ARMCOND_AL, writeback_location)                      \\\n\n\n#define generate_branch_no_cycle_update(writeback_location, new_pc, mode)     \\\n  if(pc == idle_loop_target_pc)                                               \\\n  {                                                                           \\\n    generate_branch_idle_eliminate(writeback_location, new_pc, mode);         \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    generate_branch_update(writeback_location, new_pc, mode);                 \\\n  }                                                                           \\\n\n#define generate_branch_cycle_update(writeback_location, new_pc, mode)        \\\n  generate_cycle_update();                                                    \\\n  generate_branch_no_cycle_update(writeback_location, new_pc, mode)           \\\n\n// a0 holds the destination\n\n//#define generate_indirect_branch_no_cycle_update(type)                        \\\n//  ARM_B(0, arm_relative_offset(translation_ptr, arm_indirect_branch_##type))  \\\n\n//#define generate_indirect_branch_no_cycle_update(type)                        \\\n//  do                            \t\t\t\t\t\t\t\t\t\t\t \\\n//  {                           \t\t\t\t\t\t\t\t\t\t\t\t  \\\n//\t  ARM_STR_IMM(0,ARMREG_R0,reg_base,(reg_base_offset + (62 * 4)));\t      \\\n//\t  arm_load_imm_32bit(ARMREG_R0,(u32)(arm_indirect_branch_##type));\t\t \\\n//\t  ARM_STR_IMM(0,ARMREG_R0,reg_base,(reg_base_offset + (63 * 4)));\t      \\\n//\t  ARM_LDR_IMM(0,ARMREG_R0,reg_base,(reg_base_offset + (62 * 4)));\t      \\\n//\t  ARM_LDR_IMM(0,ARMREG_PC,reg_base,(reg_base_offset + (63 * 4)));\t      \\\n//  }while(0);\n\n#define generate_indirect_branch_no_cycle_update(type)                        \\\n  do                            \t\t\t\t\t\t\t\t\t\t\t \\\n  {                           \t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t  arm_load_imm_32bit(ARMREG_R1,(u32)(arm_indirect_branch_##type));\t\t \\\n\t  ARM_BX(0, ARMREG_R1);  \t\t\t\t\t\t\t\t\t\t\t\t\\\n  }while(0);\n\n#define generate_indirect_branch_cycle_update(type)                           \\\n  generate_cycle_update();                                                    \\\n  generate_indirect_branch_no_cycle_update(type)                              \\\n\n#define generate_block_prologue()                                             \\\n\n#define generate_block_extra_vars_arm()                                       \\\n  void generate_indirect_branch_arm()                                         \\\n  {                                                                           \\\n    if(condition == 0x0E)                                                     \\\n    {                                                                         \\\n      generate_cycle_update();                                                \\\n    }                                                                         \\\n    generate_indirect_branch_no_cycle_update(arm);                            \\\n  }                                                                           \\\n                                                                              \\\n  void generate_indirect_branch_dual()                                        \\\n  {                                                                           \\\n    if(condition == 0x0E)                                                     \\\n    {                                                                         \\\n      generate_cycle_update();                                                \\\n    }                                                                         \\\n    generate_indirect_branch_no_cycle_update(dual_arm);                       \\\n  }                                                                           \\\n                                                                              \\\n  u32 prepare_load_reg(u32 scratch_reg, u32 reg_index)                        \\\n  {                                                                           \\\n    u32 reg_use = arm_register_allocation[reg_index];                         \\\n    if(reg_use == mem_reg)                                                    \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n      return scratch_reg;                                                     \\\n    }                                                                         \\\n                                                                              \\\n    return reg_use;                                                           \\\n  }                                                                           \\\n                                                                              \\\n  u32 prepare_load_reg_pc(u32 scratch_reg, u32 reg_index, u32 pc_offset)      \\\n  {                                                                           \\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      generate_load_pc(scratch_reg, pc + pc_offset);                          \\\n      return scratch_reg;                                                     \\\n    }                                                                         \\\n    return prepare_load_reg(scratch_reg, reg_index);                          \\\n  }                                                                           \\\n                                                                              \\\n  u32 prepare_store_reg(u32 scratch_reg, u32 reg_index)                       \\\n  {                                                                           \\\n    u32 reg_use = arm_register_allocation[reg_index];                         \\\n    if(reg_use == mem_reg)                                                    \\\n      return scratch_reg;                                                     \\\n                                                                              \\\n    return reg_use;                                                           \\\n  }                                                                           \\\n                                                                              \\\n  void complete_store_reg(u32 scratch_reg, u32 reg_index)                     \\\n  {                                                                           \\\n    if(arm_register_allocation[reg_index] == mem_reg)                         \\\n    {                                                                         \\\n      ARM_STR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  void complete_store_reg_pc_no_flags(u32 scratch_reg, u32 reg_index)         \\\n  {                                                                           \\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      generate_indirect_branch_arm();                                         \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      complete_store_reg(scratch_reg, reg_index);                             \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  void complete_store_reg_pc_flags(u32 scratch_reg, u32 reg_index)            \\\n  {                                                                           \\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      if(condition == 0x0E)                                                   \\\n      {                                                                       \\\n        generate_cycle_update();                                              \\\n      }                                                                       \\\n      generate_function_call(execute_spsr_restore);                           \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      complete_store_reg(scratch_reg, reg_index);                             \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  void generate_load_reg(u32 ireg, u32 reg_index)                             \\\n  {                                                                           \\\n    s32 load_src = arm_register_allocation[reg_index];                        \\\n    if(load_src != mem_reg)                                                   \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, ireg, load_src);                                     \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  void generate_store_reg(u32 ireg, u32 reg_index)                            \\\n  {                                                                           \\\n    s32 store_dest = arm_register_allocation[reg_index];                      \\\n    if(store_dest != mem_reg)                                                 \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, store_dest, ireg);                                   \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_STR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  }                                                                           \\\n\n\n#define generate_block_extra_vars_thumb()                                     \\\n  u32 prepare_load_reg(u32 scratch_reg, u32 reg_index)                        \\\n  {                                                                           \\\n    u32 reg_use = thumb_register_allocation[reg_index];                       \\\n    if(reg_use == mem_reg)                                                    \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n      return scratch_reg;                                                     \\\n    }                                                                         \\\n                                                                              \\\n    return reg_use;                                                           \\\n  }                                                                           \\\n                                                                              \\\n  u32 prepare_load_reg_pc(u32 scratch_reg, u32 reg_index, u32 pc_offset)      \\\n  {                                                                           \\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      generate_load_pc(scratch_reg, pc + pc_offset);                          \\\n      return scratch_reg;                                                     \\\n    }                                                                         \\\n    return prepare_load_reg(scratch_reg, reg_index);                          \\\n  }                                                                           \\\n                                                                              \\\n  u32 prepare_store_reg(u32 scratch_reg, u32 reg_index)                       \\\n  {                                                                           \\\n    u32 reg_use = thumb_register_allocation[reg_index];                       \\\n    if(reg_use == mem_reg)                                                    \\\n      return scratch_reg;                                                     \\\n                                                                              \\\n    return reg_use;                                                           \\\n  }                                                                           \\\n                                                                              \\\n  void complete_store_reg(u32 scratch_reg, u32 reg_index)                     \\\n  {                                                                           \\\n    if(thumb_register_allocation[reg_index] == mem_reg)                       \\\n    {                                                                         \\\n      ARM_STR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  void generate_load_reg(u32 ireg, u32 reg_index)                             \\\n  {                                                                           \\\n    s32 load_src = thumb_register_allocation[reg_index];                      \\\n    if(load_src != mem_reg)                                                   \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, ireg, load_src);                                     \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  void generate_store_reg(u32 ireg, u32 reg_index)                            \\\n  {                                                                           \\\n    s32 store_dest = thumb_register_allocation[reg_index];                    \\\n    if(store_dest != mem_reg)                                                 \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, store_dest, ireg);                                   \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_STR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  }                                                                           \\\n\nu8 *last_rom_translation_ptr = rom_translation_cache;\n//u8 *last_ram_translation_ptr = ram_translation_cache;\nu8 *last_bios_translation_ptr = bios_translation_cache;\n\n/*\n#define translate_invalidate_dcache_one(which)                                \\\n  if (which##_translation_ptr > last_##which##_translation_ptr)               \\\n  {                                                                           \\\n    warm_cache_op_range(WOP_D_CLEAN, last_##which##_translation_ptr,          \\\n      which##_translation_ptr - last_##which##_translation_ptr);              \\\n    warm_cache_op_range(WOP_I_INVALIDATE, last_##which##_translation_ptr, 32);\\\n    last_##which##_translation_ptr = which##_translation_ptr;                 \\\n  }\n*/\n\n#define translate_invalidate_dcache_one(which)                                \\\n  if (which##_translation_ptr > last_##which##_translation_ptr)               \\\n  {                                                                           \\\n\t__builtin___clear_cache(last_##which##_translation_ptr, which##_translation_ptr);              \\\n    last_##which##_translation_ptr = which##_translation_ptr;                 \\\n  }\n\n/*  \n#define translate_invalidate_dcache(dorom,doram)                                         \\\n{                                                                             \\\n  translate_invalidate_dcache_one(rom)                                        \\\n  translate_invalidate_dcache_one(ram)                                        \\\n  translate_invalidate_dcache_one(bios)                                       \\\n}\n*/\n\n#define translate_invalidate_dcache()     \t                                  \\\n{                                                                             \\\n  translate_invalidate_dcache_one(rom)                              \t\t  \\\n  translate_invalidate_dcache_one(bios)                      \t  \t\t\t  \\\n}\n\n#define invalidate_icache_region(addr, size)                                  \\\n  warm_cache_op_range(WOP_I_INVALIDATE, addr, size)\n\n\n#define block_prologue_size 0\n\n\n// It should be okay to still generate result flags, spsr will overwrite them.\n// This is pretty infrequent (returning from interrupt handlers, et al) so\n// probably not worth optimizing for.\n\n#define check_for_interrupts()                                                \\\nif(exec_interrupts(ARMCPU_ARM9))\\\n{\\\n    reg_mode[MODE_IRQ][6] = pc + 4;                                           \\\n    spsr[MODE_IRQ] = reg[REG_CPSR];                                           \\\n    reg[REG_CPSR] = 0xD2;                                                     \\\n    pc = cpu.intVector + 0x18;                                                          \\\n    set_cpu_mode(MODE_IRQ);                                                   \\\n    armcpu_irqException(&cpu);\\\n}\\\n\n#define generate_load_reg_pc(ireg, reg_index, pc_offset)                      \\\n  if(reg_index == 15)                                                         \\\n  {                                                                           \\\n    generate_load_pc(ireg, pc + pc_offset);                                   \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    generate_load_reg(ireg, reg_index);                                       \\\n  }                                                                           \\\n\n#define generate_store_reg_pc_no_flags(ireg, reg_index)                       \\\n  generate_store_reg(ireg, reg_index);                                        \\\n  if(reg_index == 15)                                                         \\\n  {                                                                           \\\n    generate_indirect_branch_arm();                                           \\\n  }                                                                           \\\n\nu32 function_cc execute_spsr_restore_body(u32 pc)\n{\n  armcpu_switchMode(dynarec_cpu, dynarec_cpu->SPSR.bits.mode);\n  dynarec_cpu->changeCPSR();\n\n  //execHardware_interrupts();\n//  check_for_interrupts();\n  return pc;\n}\n\n\n#define generate_store_reg_pc_flags(ireg, reg_index)                          \\\n  generate_store_reg(ireg, reg_index);                                        \\\n  if(reg_index == 15)                                                         \\\n  {                                                                           \\\n    if(condition == 0x0E)                                                     \\\n    {                                                                         \\\n      generate_cycle_update();                                                \\\n    }                                                                         \\\n    generate_function_call(execute_spsr_restore);                             \\\n  }                                                                           \\\n\n\n#define generate_load_flags()                                                 \\\n/*  ARM_MSR_REG(0, ARM_PSR_F, reg_flags, ARM_CPSR) */                         \\\n\n#define generate_store_flags()                                                \\\n/*  ARM_MRS_CPSR(0, reg_flags) */                                             \\\n\n#define generate_save_flags()                                                 \\\n  ARM_MRS_CPSR(0, reg_flags)                                                  \\\n\n#define generate_restore_flags()                                              \\\n  ARM_MSR_REG(0, ARM_PSR_F, reg_flags, ARM_CPSR)                              \\\n\n\n#define condition_opposite_eq ARMCOND_NE\n#define condition_opposite_ne ARMCOND_EQ\n#define condition_opposite_cs ARMCOND_CC\n#define condition_opposite_cc ARMCOND_CS\n#define condition_opposite_mi ARMCOND_PL\n#define condition_opposite_pl ARMCOND_MI\n#define condition_opposite_vs ARMCOND_VC\n#define condition_opposite_vc ARMCOND_VS\n#define condition_opposite_hi ARMCOND_LS\n#define condition_opposite_ls ARMCOND_HI\n#define condition_opposite_ge ARMCOND_LT\n#define condition_opposite_lt ARMCOND_GE\n#define condition_opposite_gt ARMCOND_LE\n#define condition_opposite_le ARMCOND_GT\n#define condition_opposite_al ARMCOND_NV\n#define condition_opposite_nv ARMCOND_AL\n\n#define generate_branch(mode)                                                 \\\n{                                                                             \\\n  generate_branch_cycle_update(                                               \\\n   block_exits[block_exit_position].branch_source,                            \\\n   block_exits[block_exit_position].branch_target, mode);                     \\\n  block_exit_position++;                                                      \\\n}                                                                             \\\n\n#define generate_branch_blx_imm(mode)                                                 \\\n{                                                                             \\\n  generate_branch_cycle_update(                                               \\\n   block_exits[block_exit_position].branch_source,                            \\\n   block_exits[block_exit_position].branch_target & 0xFFFFFFFE, mode);                     \\\n  block_exit_position++;                                                      \\\n}                                                                             \\\n\n\n#define generate_op_and_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_AND_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_orr_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_ORR_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_eor_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_EOR_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_bic_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_BIC_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_sub_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_SUB_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_rsb_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_RSB_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_sbc_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_SBC_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_rsc_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_RSC_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_add_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_ADD_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_adc_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_ADC_REG_IMMSHIFT(0, _rd, _rn, _rm, shift_type, shift)                   \\\n\n#define generate_op_mov_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_MOV_REG_IMMSHIFT(0, _rd, _rm, shift_type, shift)                        \\\n\n#define generate_op_mvn_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  ARM_MVN_REG_IMMSHIFT(0, _rd, _rm, shift_type, shift)                        \\\n\n\n#define generate_op_and_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_AND_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_orr_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_ORR_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_eor_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_EOR_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_bic_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_BIC_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_sub_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_SUB_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_rsb_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_RSB_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_sbc_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_SBC_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_rsc_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_RSC_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_add_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_ADD_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_adc_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_ADC_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                     \\\n\n#define generate_op_mov_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_MOV_REG_REGSHIFT(0, _rd, _rm, shift_type, _rs)                          \\\n\n#define generate_op_mvn_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  ARM_MVN_REG_REGSHIFT(0, _rd, _rm, shift_type, _rs)                          \\\n\n\n#define generate_op_and_imm(_rd, _rn)                                         \\\n  ARM_AND_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_orr_imm(_rd, _rn)                                         \\\n  ARM_ORR_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_eor_imm(_rd, _rn)                                         \\\n  ARM_EOR_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_bic_imm(_rd, _rn)                                         \\\n  ARM_BIC_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_sub_imm(_rd, _rn)                                         \\\n  ARM_SUB_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_rsb_imm(_rd, _rn)                                         \\\n  ARM_RSB_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_sbc_imm(_rd, _rn)                                         \\\n  ARM_SBC_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_rsc_imm(_rd, _rn)                                         \\\n  ARM_RSC_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_add_imm(_rd, _rn)                                         \\\n  ARM_ADD_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_adc_imm(_rd, _rn)                                         \\\n  ARM_ADC_REG_IMM(0, _rd, _rn, imm, imm_ror)                                  \\\n\n#define generate_op_mov_imm(_rd, _rn)                                         \\\n  ARM_MOV_REG_IMM(0, _rd, imm, imm_ror)                                       \\\n\n#define generate_op_mvn_imm(_rd, _rn)                                         \\\n  ARM_MVN_REG_IMM(0, _rd, imm, imm_ror)                                       \\\n\n\n#define generate_op_reg_immshift_lflags(name, _rd, _rn, _rm, st, shift)       \\\n  ARM_##name##_REG_IMMSHIFT(0, _rd, _rn, _rm, st, shift)                      \\\n\n#define generate_op_reg_immshift_aflags(name, _rd, _rn, _rm, st, shift)       \\\n  ARM_##name##_REG_IMMSHIFT(0, _rd, _rn, _rm, st, shift)                      \\\n\n#define generate_op_reg_immshift_aflags_load_c(name, _rd, _rn, _rm, st, sh)   \\\n  ARM_##name##_REG_IMMSHIFT(0, _rd, _rn, _rm, st, sh)                         \\\n\n#define generate_op_reg_immshift_uflags(name, _rd, _rm, shift_type, shift)    \\\n  ARM_##name##_REG_IMMSHIFT(0, _rd, _rm, shift_type, shift)                   \\\n\n#define generate_op_reg_immshift_tflags(name, _rn, _rm, shift_type, shift)    \\\n  ARM_##name##_REG_IMMSHIFT(0, _rn, _rm, shift_type, shift)                   \\\n\n\n#define generate_op_reg_regshift_lflags(name, _rd, _rn, _rm, shift_type, _rs) \\\n  ARM_##name##_REG_REGSHIFT(0, _rd, _rn, _rm, shift_type, _rs)                \\\n\n#define generate_op_reg_regshift_aflags(name, _rd, _rn, _rm, st, _rs)         \\\n  ARM_##name##_REG_REGSHIFT(0, _rd, _rn, _rm, st, _rs)                        \\\n\n#define generate_op_reg_regshift_aflags_load_c(name, _rd, _rn, _rm, st, _rs)  \\\n  ARM_##name##_REG_REGSHIFT(0, _rd, _rn, _rm, st, _rs)                        \\\n\n#define generate_op_reg_regshift_uflags(name, _rd, _rm, shift_type, _rs)      \\\n  ARM_##name##_REG_REGSHIFT(0, _rd, _rm, shift_type, _rs)                     \\\n\n#define generate_op_reg_regshift_tflags(name, _rn, _rm, shift_type, _rs)      \\\n  ARM_##name##_REG_REGSHIFT(0, _rn, _rm, shift_type, _rs)                     \\\n\n\n#define generate_op_imm_lflags(name, _rd, _rn)                                \\\n  ARM_##name##_REG_IMM(0, _rd, _rn, imm, imm_ror)                             \\\n\n#define generate_op_imm_aflags(name, _rd, _rn)                                \\\n  ARM_##name##_REG_IMM(0, _rd, _rn, imm, imm_ror)                             \\\n\n#define generate_op_imm_aflags_load_c(name, _rd, _rn)                         \\\n  ARM_##name##_REG_IMM(0, _rd, _rn, imm, imm_ror)                             \\\n\n#define generate_op_imm_uflags(name, _rd)                                     \\\n  ARM_##name##_REG_IMM(0, _rd, imm, imm_ror)                                  \\\n\n#define generate_op_imm_tflags(name, _rn)                                     \\\n  ARM_##name##_REG_IMM(0, _rn, imm, imm_ror)                                  \\\n\n\n#define generate_op_ands_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_lflags(ANDS, _rd, _rn, _rm, shift_type, shift)     \\\n\n#define generate_op_orrs_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_lflags(ORRS, _rd, _rn, _rm, shift_type, shift)     \\\n\n#define generate_op_eors_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_lflags(EORS, _rd, _rn, _rm, shift_type, shift)     \\\n\n#define generate_op_bics_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_lflags(BICS, _rd, _rn, _rm, shift_type, shift)     \\\n\n#define generate_op_subs_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_aflags(SUBS, _rd, _rn, _rm, shift_type, shift)     \\\n\n#define generate_op_rsbs_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_aflags(RSBS, _rd, _rn, _rm, shift_type, shift)     \\\n\n#define generate_op_sbcs_reg_immshift(_rd, _rn, _rm, st, shift)               \\\n  generate_op_reg_immshift_aflags_load_c(SBCS, _rd, _rn, _rm, st, shift)      \\\n\n#define generate_op_rscs_reg_immshift(_rd, _rn, _rm, st, shift)               \\\n  generate_op_reg_immshift_aflags_load_c(RSCS, _rd, _rn, _rm, st, shift)      \\\n\n#define generate_op_adds_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_aflags(ADDS, _rd, _rn, _rm, shift_type, shift)     \\\n\n#define generate_op_adcs_reg_immshift(_rd, _rn, _rm, st, shift)               \\\n  generate_op_reg_immshift_aflags_load_c(ADCS, _rd, _rn, _rm, st, shift)      \\\n\n#define generate_op_movs_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_uflags(MOVS, _rd, _rm, shift_type, shift)          \\\n\n#define generate_op_mvns_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_op_reg_immshift_uflags(MVNS, _rd, _rm, shift_type, shift)          \\\n\n// The reg operand is in reg_rm, not reg_rn like expected, so rsbs isn't\n// being used here. When rsbs is fully inlined it can be used with the\n// apropriate operands.\n\n#define generate_op_neg_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n{                                                                             \\\n  generate_load_imm(reg_rn, 0, 0);                                            \\\n  generate_op_subs_reg_immshift(_rd, reg_rn, _rm, ARMSHIFT_LSL, 0);           \\\n}                                                                             \\\n\n#define generate_op_muls_reg_immshift(_rd, _rn, _rm, shift_type, shift)       \\\n  generate_load_flags();                                                      \\\n  ARM_MULS(0, _rd, _rn, _rm);                                                 \\\n  generate_store_flags()                                                      \\\n\n#define generate_op_cmp_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  generate_op_reg_immshift_tflags(CMP, _rn, _rm, shift_type, shift)           \\\n\n#define generate_op_cmn_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  generate_op_reg_immshift_tflags(CMN, _rn, _rm, shift_type, shift)           \\\n\n#define generate_op_tst_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  generate_op_reg_immshift_tflags(TST, _rn, _rm, shift_type, shift)           \\\n\n#define generate_op_teq_reg_immshift(_rd, _rn, _rm, shift_type, shift)        \\\n  generate_op_reg_immshift_tflags(TEQ, _rn, _rm, shift_type, shift)           \\\n\n\n#define generate_op_ands_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_lflags(ANDS, _rd, _rn, _rm, shift_type, _rs)       \\\n\n#define generate_op_orrs_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_lflags(ORRS, _rd, _rn, _rm, shift_type, _rs)       \\\n\n#define generate_op_eors_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_lflags(EORS, _rd, _rn, _rm, shift_type, _rs)       \\\n\n#define generate_op_bics_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_lflags(BICS, _rd, _rn, _rm, shift_type, _rs)       \\\n\n#define generate_op_subs_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_aflags(SUBS, _rd, _rn, _rm, shift_type, _rs)       \\\n\n#define generate_op_rsbs_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_aflags(RSBS, _rd, _rn, _rm, shift_type, _rs)       \\\n\n#define generate_op_sbcs_reg_regshift(_rd, _rn, _rm, st, _rs)                 \\\n  generate_op_reg_regshift_aflags_load_c(SBCS, _rd, _rn, _rm, st, _rs)        \\\n\n#define generate_op_rscs_reg_regshift(_rd, _rn, _rm, st, _rs)                 \\\n  generate_op_reg_regshift_aflags_load_c(RSCS, _rd, _rn, _rm, st, _rs)        \\\n\n#define generate_op_adds_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_aflags(ADDS, _rd, _rn, _rm, shift_type, _rs)       \\\n\n#define generate_op_adcs_reg_regshift(_rd, _rn, _rm, st, _rs)                 \\\n  generate_op_reg_regshift_aflags_load_c(ADCS, _rd, _rn, _rm, st, _rs)        \\\n\n#define generate_op_movs_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_uflags(MOVS, _rd, _rm, shift_type, _rs)            \\\n\n#define generate_op_mvns_reg_regshift(_rd, _rn, _rm, shift_type, _rs)         \\\n  generate_op_reg_regshift_uflags(MVNS, _rd, _rm, shift_type, _rs)            \\\n\n#define generate_op_cmp_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  generate_op_reg_regshift_tflags(CMP, _rn, _rm, shift_type, _rs)             \\\n\n#define generate_op_cmn_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  generate_op_reg_regshift_tflags(CMN, _rn, _rm, shift_type, _rs)             \\\n\n#define generate_op_tst_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  generate_op_reg_regshift_tflags(TST, _rn, _rm, shift_type, _rs)             \\\n\n#define generate_op_teq_reg_regshift(_rd, _rn, _rm, shift_type, _rs)          \\\n  generate_op_reg_regshift_tflags(TEQ, _rn, _rm, shift_type, _rs)             \\\n\n\n#define generate_op_ands_imm(_rd, _rn)                                        \\\n  generate_op_imm_lflags(ANDS, _rd, _rn)                                      \\\n\n#define generate_op_orrs_imm(_rd, _rn)                                        \\\n  generate_op_imm_lflags(ORRS, _rd, _rn)                                      \\\n\n#define generate_op_eors_imm(_rd, _rn)                                        \\\n  generate_op_imm_lflags(EORS, _rd, _rn)                                      \\\n\n#define generate_op_bics_imm(_rd, _rn)                                        \\\n  generate_op_imm_lflags(BICS, _rd, _rn)                                      \\\n\n#define generate_op_subs_imm(_rd, _rn)                                        \\\n  generate_op_imm_aflags(SUBS, _rd, _rn)                                      \\\n\n#define generate_op_rsbs_imm(_rd, _rn)                                        \\\n  generate_op_imm_aflags(RSBS, _rd, _rn)                                      \\\n\n#define generate_op_sbcs_imm(_rd, _rn)                                        \\\n  generate_op_imm_aflags_load_c(SBCS, _rd, _rn)                               \\\n\n#define generate_op_rscs_imm(_rd, _rn)                                        \\\n  generate_op_imm_aflags_load_c(RSCS, _rd, _rn)                               \\\n\n#define generate_op_adds_imm(_rd, _rn)                                        \\\n  generate_op_imm_aflags(ADDS, _rd, _rn)                                      \\\n\n#define generate_op_adcs_imm(_rd, _rn)                                        \\\n  generate_op_imm_aflags_load_c(ADCS, _rd, _rn)                               \\\n\n#define generate_op_movs_imm(_rd, _rn)                                        \\\n  generate_op_imm_uflags(MOVS, _rd)                                           \\\n\n#define generate_op_mvns_imm(_rd, _rn)                                        \\\n  generate_op_imm_uflags(MVNS, _rd)                                           \\\n\n#define generate_op_cmp_imm(_rd, _rn)                                         \\\n  generate_op_imm_tflags(CMP, _rn)                                            \\\n\n#define generate_op_cmn_imm(_rd, _rn)                                         \\\n  generate_op_imm_tflags(CMN, _rn)                                            \\\n\n#define generate_op_tst_imm(_rd, _rn)                                         \\\n  generate_op_imm_tflags(TST, _rn)                                            \\\n\n#define generate_op_teq_imm(_rd, _rn)                                         \\\n  generate_op_imm_tflags(TEQ, _rn)                                            \\\n\n\n#define prepare_load_rn_yes()                                                 \\\n  u32 _rn = prepare_load_reg_pc(reg_rn, rn, 8)                                \\\n\n#define prepare_load_rn_no()                                                  \\\n\n#define prepare_store_rd_yes()                                                \\\n  u32 _rd = prepare_store_reg(reg_rd, rd)                                     \\\n\n#define prepare_store_rd_no()                                                 \\\n\n#define complete_store_rd_yes(flags_op)                                       \\\n  complete_store_reg_pc_##flags_op(_rd, rd)                                   \\\n\n#define complete_store_rd_no(flags_op)                                        \\\n\n#define arm_generate_op_reg(name, load_op, store_op, flags_op)                \\\n  u32 shift_type = (opcode >> 5) & 0x03;                                      \\\n  arm_decode_data_proc_reg();                                                 \\\n  prepare_load_rn_##load_op();                                                \\\n  prepare_store_rd_##store_op();                                              \\\n                                                                              \\\n  if((opcode >> 4) & 0x01)                                                    \\\n  {                                                                           \\\n\texec_cyc=( rd == 15 ? 4 : 2);                                               \\\n    u32 rs = ((opcode >> 8) & 0x0F);                                          \\\n    u32 _rs = prepare_load_reg(reg_rs, rs);                                   \\\n    u32 _rm = prepare_load_reg_pc(reg_rm, rm, 12);                            \\\n    generate_op_##name##_reg_regshift(_rd, _rn, _rm, shift_type, _rs);        \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n\texec_cyc=( rd == 15 ? 3 : 1);                                               \\\n    u32 shift_imm = ((opcode >> 7) & 0x1F);                                   \\\n    u32 _rm = prepare_load_reg_pc(reg_rm, rm, 8);                             \\\n    generate_op_##name##_reg_immshift(_rd, _rn, _rm, shift_type, shift_imm);  \\\n  }                                                                           \\\n  complete_store_rd_##store_op(flags_op)                                      \\\n\n#define arm_generate_op_reg_flags(name, load_op, store_op, flags_op)          \\\n  arm_generate_op_reg(name, load_op, store_op, flags_op)                      \\\n\n// imm will be loaded by the called function if necessary.\n\n#define arm_generate_op_imm(name, load_op, store_op, flags_op)                \\\n  arm_decode_data_proc_imm();                                                 \\\n  exec_cyc=( rd == 15 ? 3 : 1);                                               \\\n  prepare_load_rn_##load_op();                                                \\\n  prepare_store_rd_##store_op();                                              \\\n  generate_op_##name##_imm(_rd, _rn);                                         \\\n  complete_store_rd_##store_op(flags_op)                                      \\\n\n#define arm_generate_op_imm_flags(name, load_op, store_op, flags_op)          \\\n  arm_generate_op_imm(name, load_op, store_op, flags_op)                      \\\n\n#define arm_data_proc(name, type, flags_op)                                   \\\n{                                                                             \\\n  arm_generate_op_##type(name, yes, yes, flags_op);                           \\\n}                                                                             \\\n\n#define reg_cycle_val 2\n#define imm_cycle_val 1\n#define reg_flags_cycle_val 2\n#define imm_flags_cycle_val 1\n\n#define arm_data_proc_test(name, type)                                        \\\n{                                                                             \\\n  arm_generate_op_##type(name, yes, no, no);                                  \\\n}                                                                             \\\n\n#define arm_data_proc_unary(name, type, flags_op)                             \\\n{                                                                             \\\n  arm_generate_op_##type(name, no, yes, flags_op);                            \\\n}                                                                             \\\n\n\n#define arm_multiply_add_no_flags_no()                                        \\\n  ARM_MUL(0, _rd, _rm, _rs)                                                   \\\n\n#define arm_multiply_add_yes_flags_no()                                       \\\n  u32 _rn = prepare_load_reg(reg_a2, rn);                                     \\\n  ARM_MLA(0, _rd, _rm, _rs, _rn)                                              \\\n\n#define arm_multiply_add_no_flags_yes()                                       \\\n  generate_load_flags();                                                      \\\n  ARM_MULS(0, _rd, _rm, _rs)                                         \\\n  generate_store_flags()                                                      \\\n\n#define arm_multiply_add_yes_flags_yes()                                      \\\n  u32 _rn = prepare_load_reg(reg_a2, rn);                                     \\\n  generate_load_flags();                                                      \\\n  ARM_MLAS(0, _rd, _rm, _rs, _rn);                                            \\\n  generate_store_flags()\n\nextern void multiply_add_no_cycles();\nextern void multiply_add_yes_cycles();\n\n#define arm_multiply(add_op, flags)                                           \\\n{                                                                             \\\n  arm_decode_multiply();                                                      \\\n  u32 _rm = prepare_load_reg(reg_a0, rm);                                     \\\n  ARM_MOV_REG_REG(0, reg_a0, _rm);\\\n  generate_function_call(multiply_add_##add_op##_cycles);\\\n  u32 _rs = prepare_load_reg(reg_a1, rs);                                     \\\n  u32 _rd = prepare_store_reg(reg_a0, rd);                                    \\\n  arm_multiply_add_##add_op##_flags_##flags();                                \\\n  complete_store_reg(_rd, rd);                                                \\\n}                                                                             \\\n\nextern void u64_cycles();\nextern void u64_add_cycles();\nextern void s64_cycles();\nextern void s64_add_cycles();\n\n#define arm_multiply_long_name_s64     SMULL\n#define arm_multiply_long_name_u64     UMULL\n#define arm_multiply_long_name_s64_add SMLAL\n#define arm_multiply_long_name_u64_add UMLAL\n\n\n#define arm_multiply_long_flags_no(name)                                      \\\n  ARM_##name(0, _rdlo, _rdhi, _rm, _rs)                                       \\\n\n#define arm_multiply_long_flags_yes(name)                                     \\\n  generate_load_flags();                                                      \\\n  ARM_##name##S(0, _rdlo, _rdhi, _rm, _rs);                                   \\\n  generate_store_flags()                                                      \\\n\n\n#define arm_multiply_long_add_no(name)                                        \\\n\n#define arm_multiply_long_add_yes(name)                                       \\\n  prepare_load_reg(reg_a0, rdlo);                                             \\\n  prepare_load_reg(reg_a1, rdhi)                                              \\\n\n\n#define arm_multiply_long_op(flags, name)                                     \\\n  arm_multiply_long_flags_##flags(name)                                       \\\n\n#define arm_multiply_long(name, add_op, flags)                                \\\n{                                                                             \\\n  arm_decode_multiply_long();                                                 \\\n  u32 _rm = prepare_load_reg(reg_a2, rm);                                     \\\n  ARM_MOV_REG_REG(0, reg_a2, _rm); \\\n  generate_function_call(name##_cycles);\\\n  u32 _rs = prepare_load_reg(reg_rs, rs);                                     \\\n  u32 _rdlo = prepare_store_reg(reg_a0, rdlo);                                \\\n  u32 _rdhi = prepare_store_reg(reg_a1, rdhi);                                \\\n  arm_multiply_long_add_##add_op(name);                                       \\\n  arm_multiply_long_op(flags, arm_multiply_long_name_##name);                 \\\n  complete_store_reg(_rdlo, rdlo);                                            \\\n  complete_store_reg(_rdhi, rdhi);                                            \\\n}                                                                             \\\n\n#define arm_psr_read_cpsr()                                                   \\\n  u32 _rd = prepare_store_reg(reg_a0, rd);                                    \\\n  generate_load_reg(_rd, REG_CPSR);                                           \\\n  ARM_BIC_REG_IMM(0, _rd, _rd, 0xF0, arm_imm_lsl_to_rot(24));                 \\\n  ARM_AND_REG_IMM(0, reg_flags, reg_flags, 0xF0, arm_imm_lsl_to_rot(24));     \\\n  ARM_ORR_REG_REG(0, _rd, _rd, reg_flags);                                    \\\n  complete_store_reg(_rd, rd)                                                 \\\n\n#define arm_psr_read_spsr()                                                   \\\n  generate_function_call(execute_read_spsr)                                   \\\n  generate_store_reg(reg_a0, rd)                                              \\\n\n#define arm_psr_read(op_type, psr_reg)                                        \\\n  arm_psr_read_##psr_reg()                                                    \\\n\n// This function's okay because it's called from an ASM function that can\n// wrap it correctly.\n\nu32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)\n{\n  if(store_mask & 0xFF)\n  {\n    armcpu_switchMode(dynarec_cpu, _cpsr & 0x1F);\n    dynarec_cpu->changeCPSR();\n    /*if(exec_interrupts(proc))\n    {\n      reg_mode[MODE_IRQ][6] = address + 4;\n      spsr[MODE_IRQ] = _cpsr;\n      reg[REG_CPSR] = 0xD2;\n      set_cpu_mode(MODE_IRQ);\n      return 0xFFFF0018;\n    }*/\n\n  }\n\n  dynarec_cpu->R[REG_CPSR] = _cpsr;\n\n  return 0;\n}\n\n#define arm_psr_load_new_reg()                                                \\\n  generate_load_reg(reg_a0, rm)                                               \\\n\n#define arm_psr_load_new_imm()                                                \\\n  generate_load_imm(reg_a0, imm, imm_ror)                                     \\\n\n#define arm_psr_store_cpsr()                                                  \\\n  arm_load_imm_32bit(reg_a1, psr_masks[psr_field]);                           \\\n  generate_function_call(execute_store_cpsr);                                 \\\n  write32(pc)                                                                 \\\n\n#define arm_psr_store_spsr()                                                  \\\n  generate_function_call(execute_store_spsr)                                  \\\n\n#define arm_psr_store(op_type, psr_reg)                                       \\\n  arm_psr_load_new_##op_type();                                               \\\n  arm_psr_store_##psr_reg()                                                   \\\n\n\n#define arm_psr(op_type, transfer_type, psr_reg)                              \\\n{                                                                             \\\n\t  exec_cyc=1;\\\n  arm_decode_psr_##op_type();                                                 \\\n  arm_psr_##transfer_type(op_type, psr_reg);                                  \\\n}                                                                             \\\n\n// TODO: loads will need the PC passed as well for open address, however can\n// eventually be rectified with a hash table on the memory accesses\n// (same with the stores)\n\n#define load_u8_cycle()\\\n\tMMU_aluMemAccessCycles<proc,8,MMU_AD_READ>(3,pc)\\\n\n#define load_u16_cycle()\\\n\t\tMMU_aluMemAccessCycles<proc,16,MMU_AD_READ>(3,pc)\\\n\n#define load_s16_cycle()\\\n\t\tMMU_aluMemAccessCycles<proc,16,MMU_AD_READ>(3,pc)\\\n\n#define load_u32_cycle()\\\n\t\tMMU_aluMemAccessCycles<proc,32,MMU_AD_READ>(3,pc)\\\n\n#define arm_access_memory_load(mem_type, offset_type, adjust_op, direction)   \\\n  generate_function_call(execute_load_##mem_type);                            \\\n  write32((pc + 8));                                                          \\\n  generate_store_reg_pc_no_flags(reg_rv, rd)                                  \\\n\n#define arm_access_memory_loadd(mem_type, offset_type, adjust_op, direction)  \\\n  ARM_MOV_REG_REG(0, reg_s0, reg_a0);   \\\n  generate_function_call(execute_load_u32);                            \\\n  write32((pc + 8));                                                          \\\n  generate_store_reg_pc_no_flags(reg_rv, rd);                                  \\\n  ARM_ADD_REG_IMM(0, reg_a0, reg_s0, 4, 0);  \\\n  generate_function_call(execute_load_u32);                            \\\n  write32((pc + 8));                                                          \\\n  generate_store_reg_pc_no_flags(reg_rv, rd+1)                                  \\\n\n//#define arm_access_memory_store(mem_type, offset_type, adjust_op, direction)  \\\n//  generate_load_reg_pc(reg_a1, rd, 12);                                       \\\n//  generate_function_call(execute_store_##mem_type);                           \\\n//  write32((pc + 4))                                                           \\\n//\n//#define arm_access_memory_stored(mem_type, offset_type, adjust_op, direction) \\\n//  generate_load_reg_pc(reg_a1, rd, 12);                                       \\\n//  ARM_MOV_REG_REG(0, reg_s0, reg_a0);   \\\n//  generate_function_call(execute_store_u32);                           \\\n//  write32((pc + 4));                                                           \\\n//  ARM_ADD_REG_IMM(0, reg_a0, reg_s0, 4, 0);  \\\n//  generate_load_reg_pc(reg_a1, rd+1, 12);                                       \\\n//  generate_function_call(execute_store_u32);                           \\\n//  write32((pc + 4))                                                           \\\n\n#define arm_access_memory_store(mem_type, offset_type, adjust_op, direction)  \\\n  generate_load_reg_pc(reg_a1, rd, 8);                                       \\\n  generate_function_call(execute_store_##mem_type);                           \\\n  write32((pc + 4))                                                           \\\n\n#define arm_access_memory_stored(mem_type, offset_type, adjust_op, direction) \\\n  generate_load_reg_pc(reg_a1, rd, 8);                                       \\\n  ARM_MOV_REG_REG(0, reg_s0, reg_a0);   \\\n  generate_function_call(execute_store_u32);                           \\\n  write32((pc + 4));                                                           \\\n  ARM_ADD_REG_IMM(0, reg_a0, reg_s0, 4, 0);  \\\n  generate_load_reg_pc(reg_a1, rd+1, 8);                                       \\\n  generate_function_call(execute_store_u32);                           \\\n  write32((pc + 4))\n\n// Calculate the address into a0 from _rn, _rm\n\n#define arm_access_memory_adjust_reg_sh_up(ireg)                              \\\n  ARM_ADD_REG_IMMSHIFT(0, ireg, _rn, _rm, ((opcode >> 5) & 0x03),             \\\n   ((opcode >> 7) & 0x1F))                                                    \\\n\n#define arm_access_memory_adjust_reg_sh_down(ireg)                            \\\n  ARM_SUB_REG_IMMSHIFT(0, ireg, _rn, _rm, ((opcode >> 5) & 0x03),             \\\n   ((opcode >> 7) & 0x1F))                                                    \\\n\n#define arm_access_memory_adjust_reg_up(ireg)                                 \\\n  ARM_ADD_REG_REG(0, ireg, _rn, _rm)                                          \\\n\n#define arm_access_memory_adjust_reg_down(ireg)                               \\\n  ARM_SUB_REG_REG(0, ireg, _rn, _rm)                                          \\\n\n#define arm_access_memory_adjust_imm(op, ireg)                                \\\n{                                                                             \\\n  u32 stores[4];                                                              \\\n  u32 rotations[4];                                                           \\\n  u32 store_count = arm_disect_imm_32bit(offset, stores, rotations);          \\\n                                                                              \\\n  if(store_count > 1)                                                         \\\n  {                                                                           \\\n    ARM_##op##_REG_IMM(0, ireg, _rn, stores[0], rotations[0]);                \\\n    ARM_##op##_REG_IMM(0, ireg, ireg, stores[1], rotations[1]);               \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    ARM_##op##_REG_IMM(0, ireg, _rn, stores[0], rotations[0]);                \\\n  }                                                                           \\\n}                                                                             \\\n\n#define arm_access_memory_adjust_imm_up(ireg)                                 \\\n  arm_access_memory_adjust_imm(ADD, ireg)                                     \\\n\n#define arm_access_memory_adjust_imm_down(ireg)                               \\\n  arm_access_memory_adjust_imm(SUB, ireg)                                     \\\n\n\n#define arm_access_memory_pre(type, direction)                                \\\n  arm_access_memory_adjust_##type##_##direction(reg_a0)                       \\\n\n#define arm_access_memory_pre_wb(type, direction)                             \\\n  arm_access_memory_adjust_##type##_##direction(reg_a0);                      \\\n  generate_store_reg(reg_a0, rn)                                              \\\n\n#define arm_access_memory_post(type, direction)                               \\\n  u32 _rn_dest = prepare_store_reg(reg_a1, rn);                               \\\n  if(_rn != reg_a0)                                                           \\\n  {                                                                           \\\n    generate_load_reg(reg_a0, rn);                                            \\\n  }                                                                           \\\n  arm_access_memory_adjust_##type##_##direction(_rn_dest);                    \\\n  complete_store_reg(_rn_dest, rn)                                            \\\n\n\n#define arm_data_trans_reg(adjust_op, direction)                              \\\n  arm_decode_data_trans_reg();                                                \\\n  u32 _rn = prepare_load_reg_pc(reg_a0, rn, 8);                               \\\n  u32 _rm = prepare_load_reg(reg_a1, rm);                                     \\\n  arm_access_memory_##adjust_op(reg_sh, direction)                            \\\n\n#define arm_data_trans_imm(adjust_op, direction)                              \\\n  arm_decode_data_trans_imm();                                                \\\n  u32 _rn = prepare_load_reg_pc(reg_a0, rn, 8);                               \\\n  arm_access_memory_##adjust_op(imm, direction)                               \\\n\n\n#define arm_data_trans_half_reg(adjust_op, direction)                         \\\n  arm_decode_half_trans_r();                                                  \\\n  u32 _rn = prepare_load_reg_pc(reg_a0, rn, 8);                               \\\n  u32 _rm = prepare_load_reg(reg_a1, rm);                                     \\\n  arm_access_memory_##adjust_op(reg, direction)                               \\\n\n#define arm_data_trans_half_imm(adjust_op, direction)                         \\\n  arm_decode_half_trans_of();                                                 \\\n  u32 _rn = prepare_load_reg_pc(reg_a0, rn, 8);                               \\\n  arm_access_memory_##adjust_op(imm, direction)                               \\\n\n\n#define arm_access_memory(access_type, direction, adjust_op, mem_type,        \\\n offset_type)                                                                 \\\n{                                                                             \\\n  arm_data_trans_##offset_type(adjust_op, direction);                         \\\n  arm_access_memory_##access_type(mem_type, offset_type, adjust_op, direction);                                  \\\n}                                                                             \\\n\n\n#define word_bit_count(word)                                                  \\\n  (bit_count[word >> 8] + bit_count[word & 0xFF])                             \\\n\n#define sprint_no(access_type, pre_op, post_op, wb)                           \\\n\n#define sprint_yes(access_type, pre_op, post_op, wb)                          \\\n  printf(\"sbit on %s %s %s %s\\n\", #access_type, #pre_op, #post_op, #wb)       \\\n\n\n// TODO: Make these use cached registers. Implement iwram_stack_optimize.\n\n#define arm_block_memory_load()                                               \\\n  generate_function_call(execute_load_u32);                                   \\\n  write32((pc + 8));                                                          \\\n  generate_store_reg(reg_rv, i)                                               \\\n\n#define arm_block_memory_store()                                              \\\n  generate_load_reg_pc(reg_a1, i, 8);                                         \\\n  generate_function_call(execute_store_u32_safe)                              \\\n\n#define arm_block_memory_final_load()                                         \\\n  arm_block_memory_load()                                                     \\\n\n//#define arm_block_memory_final_store()                                        \\\n//  generate_load_reg_pc(reg_a1, i, 12);                                        \\\n//  generate_function_call(execute_store_u32);                                  \\\n//  write32((pc + 4))                                                           \\\n\n#define arm_block_memory_final_store()                                        \\\n  generate_load_reg_pc(reg_a1, i, 8);                                        \\\n  generate_function_call(execute_store_u32);                                  \\\n  write32((pc + 4))                                                           \\\n\n#define arm_block_memory_adjust_pc_store()                                    \\\n\n#define arm_block_memory_adjust_pc_load()                                     \\\n  if(reg_list & 0x8000)                                                       \\\n  {                                                                           \\\n    generate_mov(reg_a0, reg_rv);                                             \\\n    generate_indirect_branch_dual();                                           \\\n  }                                                                           \\\n\n#define arm_block_memory_offset_down_a()                                      \\\n  generate_sub_imm(reg_s0, ((word_bit_count(reg_list) * 4) - 4), 0)           \\\n\n#define arm_block_memory_offset_down_b()                                      \\\n  generate_sub_imm(reg_s0, (word_bit_count(reg_list) * 4), 0)                 \\\n\n#define arm_block_memory_offset_no()                                          \\\n\n#define arm_block_memory_offset_up()                                          \\\n  generate_add_imm(reg_s0, 4, 0)                                              \\\n\n#define arm_block_memory_writeback_down()                                     \\\n  generate_load_reg(reg_a0, rn);                                              \\\n  generate_sub_imm(reg_a0, (word_bit_count(reg_list) * 4), 0);                \\\n  generate_store_reg(reg_a0, rn)                                              \\\n\n#define arm_block_memory_writeback_up()                                       \\\n  generate_load_reg(reg_a0, rn);                                              \\\n  generate_add_imm(reg_a0, (word_bit_count(reg_list) * 4), 0);                \\\n  generate_store_reg(reg_a0, rn)                                              \\\n\n#define arm_block_memory_writeback_no()\n\n// Only emit writeback if the register is not in the list\n\n#define arm_block_memory_writeback_load(writeback_type)                       \\\n  if(!((reg_list >> rn) & 0x01))                                              \\\n  {                                                                           \\\n    arm_block_memory_writeback_##writeback_type();                            \\\n  }                                                                           \\\n\n#define arm_block_memory_writeback_store(writeback_type)                      \\\n  arm_block_memory_writeback_##writeback_type()                               \\\n\nextern void switch_user();\nextern void switch_back();\n\n\n#define arm_block_memory(access_type, offset_type, writeback_type, s_bit)     \\\n{                                                                             \\\n  arm_decode_block_trans();                                                   \\\n  u32 offset = 0;                                                             \\\n  u32 i;                                                                      \\\n  u32 register15 = (opcode >>15) &0x01;\\\n     \\\n                                                                              \\\n  generate_load_reg(reg_s0, rn);                                              \\\n  arm_block_memory_offset_##offset_type();                                    \\\n  arm_block_memory_writeback_##access_type(writeback_type);                   \\\n  ARM_BIC_REG_IMM(0, reg_s0, reg_s0, 0x03, 0);                                \\\n  \\\nif(((opcode >> 22) & 0x01) && !(register15 && ((opcode >> 20) & 0x01)))  \\\n{generate_function_call(switch_user);\\\n}\\\n\\\n                                                                              \\\n  for(i = 0; i < 16; i++)                                                     \\\n  {                                                                           \\\n    if((reg_list >> i) & 0x01)                                                \\\n    {                                                                         \\\n      generate_add_reg_reg_imm(reg_a0, reg_s0, offset, 0);                    \\\n      if(reg_list & ~((2 << i) - 1))                                          \\\n      {                                                                       \\\n        arm_block_memory_##access_type();                                     \\\n        offset += 4;                                                          \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        arm_block_memory_final_##access_type();                               \\\n        break;                                                                \\\n      }                                                                       \\\n    }                                                                         \\\n  }                                                                           \\\n  if((opcode >> 22) & 0x01)  \\\n  {\\\n\t  if(register15 && (opcode>>20 & 0x01))  \\\n\t  {   \\\n\t\t  generate_function_call(execute_spsr_restore);\\\n\t  }   \\\n\t  else   \\\n\t  {  \\\n\t\t  generate_function_call(switch_back);   \\\n\t  }   \\\n  }\\\n   arm_block_memory_adjust_pc_##access_type();                                 \\\n                                                                              \\\n \\\n  \\\n}                                                                             \\\n\n#define arm_swap(type)                                                        \\\n{                                                                             \\\n  arm_decode_swap();                                                          \\\n  generate_load_reg(reg_a0, rn);                                              \\\n  generate_function_call(execute_load_##type);                                \\\n  write32((pc + 8));                                                          \\\n  generate_mov(reg_s0, reg_rv);                                               \\\n  generate_load_reg(reg_a0, rn);                                              \\\n  generate_load_reg(reg_a1, rm);                                              \\\n  generate_function_call(execute_store_##type);                               \\\n  write32((pc + 4));                                                          \\\n  generate_store_reg(reg_s0, rd);                                             \\\n}                                                                             \\\n\n\n\n#define thumb_generate_op_reg(name, _rd, _rs, _rn)                            \\\n  u32 __rm = prepare_load_reg(reg_rm, _rn);                                   \\\n  generate_op_##name##_reg_immshift(__rd, __rn, __rm, ARMSHIFT_LSL, 0)        \\\n\n#define thumb_generate_op_imm(name, _rd, _rs, imm_)                           \\\n{                                                                             \\\n  u32 imm_ror = 0;                                                            \\\n  generate_op_##name##_imm(__rd, __rn);                                       \\\n}                                                                             \\\n\n\n#define thumb_data_proc(type, name, op_type, _rd, _rs, _rn)                   \\\n{                                                                             \\\n\texec_cyc = 1 ;\\\n  thumb_decode_##type();                                                      \\\n  u32 __rn = prepare_load_reg(reg_rn, _rs);                                   \\\n  u32 __rd = prepare_store_reg(reg_rd, _rd);                                  \\\n  generate_load_reg(reg_rn, _rs);                                             \\\n  thumb_generate_op_##op_type(name, _rd, _rs, _rn);                           \\\n  complete_store_reg(__rd, _rd);                                              \\\n}                                                                             \\\n\n#define thumb_data_proc_test(type, name, op_type, _rd, _rs)                   \\\n{                                                                             \\\n\texec_cyc = 1 ;\\\n  thumb_decode_##type();                                                      \\\n  u32 __rn = prepare_load_reg(reg_rn, _rd);                                   \\\n  thumb_generate_op_##op_type(name, 0, _rd, _rs);                             \\\n}                                                                             \\\n\n#define thumb_data_proc_unary(type, name, op_type, _rd, _rs)                  \\\n{                                                                             \\\n\texec_cyc = 1 ;\\\n  thumb_decode_##type();                                                      \\\n  u32 __rd = prepare_store_reg(reg_rd, _rd);                                  \\\n  thumb_generate_op_##op_type(name, _rd, 0, _rs);                             \\\n  complete_store_reg(__rd, _rd);                                              \\\n}                                                                             \\\n\n\n#define complete_store_reg_pc_thumb()                                         \\\n  if(rd == 15)                                                                \\\n  {                                                                           \\\n    generate_indirect_branch_cycle_update(thumb);                             \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    complete_store_reg(_rd, rd);                                              \\\n  }                                                                           \\\n\n#define thumb_data_proc_hi(name)                                              \\\n{                                                                             \\\n\t  exec_cyc = 1;\\\n  thumb_decode_hireg_op();                                                    \\\n  u32 _rd = prepare_load_reg_pc(reg_rd, rd, 4);                               \\\n  u32 _rs = prepare_load_reg_pc(reg_rn, rs, 4);                               \\\n  generate_op_##name##_reg_immshift(_rd, _rd, _rs, ARMSHIFT_LSL, 0);          \\\n  complete_store_reg_pc_thumb();                                              \\\n}                                                                             \\\n\n#define thumb_data_proc_test_hi(name)                                         \\\n{                                                                             \\\n\t  exec_cyc = 1;\\\n  thumb_decode_hireg_op();                                                    \\\n  u32 _rd = prepare_load_reg_pc(reg_rd, rd, 4);                               \\\n  u32 _rs = prepare_load_reg_pc(reg_rn, rs, 4);                               \\\n  generate_op_##name##_reg_immshift(0, _rd, _rs, ARMSHIFT_LSL, 0);            \\\n}                                                                             \\\n\n#define thumb_data_proc_mov_hi()                                              \\\n{                                                                             \\\n\t  exec_cyc = 1;\\\n  thumb_decode_hireg_op();                                                    \\\n  u32 _rs = prepare_load_reg_pc(reg_rn, rs, 4);                               \\\n  u32 _rd = prepare_store_reg(reg_rd, rd);                                    \\\n  ARM_MOV_REG_REG(0, _rd, _rs);                                               \\\n  complete_store_reg_pc_thumb();                                              \\\n}                                                                             \\\n\n\n\n#define thumb_load_pc(_rd)                                                    \\\n{                                                                             \\\n\texec_cyc = 1 ;\\\n  thumb_decode_imm();                                                         \\\n  u32 __rd = prepare_store_reg(reg_rd, _rd);                                  \\\n  generate_load_pc(__rd, (((pc & ~2) + 4) + (imm * 4)));                      \\\n  complete_store_reg(__rd, _rd);                                              \\\n}                                                                             \\\n\n#define thumb_load_sp(_rd)                                                    \\\n{                                                                             \\\n\texec_cyc=1;\\\n  thumb_decode_imm();                                                         \\\n  u32 __sp = prepare_load_reg(reg_a0, REG_SP);                                \\\n  u32 __rd = prepare_store_reg(reg_a0, _rd);                                  \\\n  ARM_ADD_REG_IMM(0, __rd, __sp, imm, arm_imm_lsl_to_rot(2));                 \\\n  complete_store_reg(__rd, _rd);                                              \\\n}                                                                             \\\n\n#define thumb_adjust_sp_up()                                                  \\\n  ARM_ADD_REG_IMM(0, _sp, _sp, imm, arm_imm_lsl_to_rot(2))                    \\\n\n#define thumb_adjust_sp_down()                                                \\\n  ARM_SUB_REG_IMM(0, _sp, _sp, imm, arm_imm_lsl_to_rot(2))                    \\\n\n#define thumb_adjust_sp(direction)                                            \\\n{                                                                             \\\n\texec_cyc=1; \\\n  thumb_decode_add_sp();                                                      \\\n  u32 _sp = prepare_load_reg(reg_a0, REG_SP);                                 \\\n  thumb_adjust_sp_##direction();                                              \\\n  complete_store_reg(_sp, REG_SP);                                            \\\n}                                                                             \\\n\n#define generate_op_lsl_reg(_rd, _rm, _rs)                                    \\\n\texec_cyc=2; \\\n  generate_op_movs_reg_regshift(_rd, 0, _rm, ARMSHIFT_LSL, _rs)               \\\n\n#define generate_op_lsr_reg(_rd, _rm, _rs)                                    \\\n\texec_cyc=2; \\\n  generate_op_movs_reg_regshift(_rd, 0, _rm, ARMSHIFT_LSR, _rs)               \\\n\n#define generate_op_asr_reg(_rd, _rm, _rs)                                    \\\n\texec_cyc=2; \\\n  generate_op_movs_reg_regshift(_rd, 0, _rm, ARMSHIFT_ASR, _rs)               \\\n\n#define generate_op_ror_reg(_rd, _rm, _rs)                                    \\\n\texec_cyc=2; \\\n  generate_op_movs_reg_regshift(_rd, 0, _rm, ARMSHIFT_ROR, _rs)               \\\n\n\n#define generate_op_lsl_imm(_rd, _rm)                                         \\\n\texec_cyc=1; \\\n  generate_op_movs_reg_immshift(_rd, 0, _rm, ARMSHIFT_LSL, imm)               \\\n\n#define generate_op_lsr_imm(_rd, _rm)                                         \\\n\texec_cyc=1; \\\n  generate_op_movs_reg_immshift(_rd, 0, _rm, ARMSHIFT_LSR, imm)               \\\n\n#define generate_op_asr_imm(_rd, _rm)                                         \\\n\texec_cyc=1; \\\n  generate_op_movs_reg_immshift(_rd, 0, _rm, ARMSHIFT_ASR, imm)               \\\n\n#define generate_op_ror_imm(_rd, _rm)                                         \\\n\texec_cyc=1; \\\n  generate_op_movs_reg_immshift(_rd, 0, _rm, ARMSHIFT_ROR, imm)               \\\n\n\n#define generate_shift_reg(op_type)                                           \\\n  u32 __rm = prepare_load_reg(reg_rd, rd);                                    \\\n  u32 __rs = prepare_load_reg(reg_rs, rs);                                    \\\n  generate_op_##op_type##_reg(__rd, __rm, __rs)                               \\\n\n#define generate_shift_imm(op_type)                                           \\\n  u32 __rs = prepare_load_reg(reg_rs, rs);                                    \\\n  generate_op_##op_type##_imm(__rd, __rs)                                     \\\n\n\n#define thumb_shift(decode_type, op_type, value_type)                         \\\n{                                                                             \\\n  thumb_decode_##decode_type();                                               \\\n  u32 __rd = prepare_store_reg(reg_rd, rd);                                   \\\n  generate_shift_##value_type(op_type);                                       \\\n  complete_store_reg(__rd, rd);                                               \\\n}                                                                             \\\n\n// Operation types: imm, mem_reg, mem_imm\n\n#define thumb_access_memory_load(mem_type, _rd)                               \\\n  generate_function_call(execute_load_##mem_type);                            \\\n  write32((pc + 4));                                                          \\\n  generate_store_reg(reg_rv, _rd)                                             \\\n\n#define thumb_access_memory_store(mem_type, _rd)                              \\\n  generate_load_reg(reg_a1, _rd);                                             \\\n  generate_function_call(execute_store_##mem_type);                           \\\n  write32((pc + 2))                                                           \\\n\n#define thumb_access_memory_generate_address_pc_relative(offset, _rb, _ro)    \\\n  generate_load_pc(reg_a0, (offset))                                          \\\n\n#define thumb_access_memory_generate_address_reg_imm(offset, _rb, _ro)        \\\n  u32 __rb = prepare_load_reg(reg_a0, _rb);                                   \\\n  ARM_ADD_REG_IMM(0, reg_a0, __rb, offset, 0)                                 \\\n\n#define thumb_access_memory_generate_address_reg_imm_sp(offset, _rb, _ro)     \\\n  u32 __rb = prepare_load_reg(reg_a0, _rb);                                   \\\n  ARM_ADD_REG_IMM(0, reg_a0, __rb, offset, arm_imm_lsl_to_rot(2))             \\\n\n#define thumb_access_memory_generate_address_reg_reg(offset, _rb, _ro)        \\\n  u32 __rb = prepare_load_reg(reg_a0, _rb);                                   \\\n  u32 __ro = prepare_load_reg(reg_a1, _ro);                                   \\\n  ARM_ADD_REG_REG(0, reg_a0, __rb, __ro)                                      \\\n\n#define thumb_access_memory(access_type, op_type, _rd, _rb, _ro,              \\\n address_type, offset, mem_type)                                              \\\n{                                                                             \\\n  thumb_decode_##op_type();                                                   \\\n  thumb_access_memory_generate_address_##address_type(offset, _rb, _ro);      \\\n  thumb_access_memory_##access_type(mem_type, _rd);                           \\\n}                                                                             \\\n\n// TODO: Make these use cached registers. Implement iwram_stack_optimize.\n\n#define thumb_block_address_preadjust_up()                                    \\\n  generate_add_imm(reg_s0, (bit_count[reg_list] * 4), 0)                      \\\n\n#define thumb_block_address_preadjust_down()                                  \\\n  generate_sub_imm(reg_s0, (bit_count[reg_list] * 4), 0)                      \\\n\n#define thumb_block_address_preadjust_push_lr()                               \\\n  generate_sub_imm(reg_s0, ((bit_count[reg_list] + 1) * 4), 0)                \\\n\n#define thumb_block_address_preadjust_no()                                    \\\n\n#define thumb_block_address_postadjust_no(base_reg)                           \\\n  generate_store_reg(reg_s0, base_reg)                                        \\\n\n#define thumb_block_address_postadjust_up(base_reg)                           \\\n  generate_add_reg_reg_imm(reg_a0, reg_s0, (bit_count[reg_list] * 4), 0);     \\\n  generate_store_reg(reg_a0, base_reg)                                        \\\n\n#define thumb_block_address_postadjust_down(base_reg)                         \\\n  generate_mov(reg_a0, reg_s0);                                               \\\n  generate_sub_imm(reg_a0, (bit_count[reg_list] * 4), 0);                     \\\n  generate_store_reg(reg_a0, base_reg)                                        \\\n\n#define thumb_block_address_postadjust_pop_pc(base_reg)                       \\\n  generate_add_reg_reg_imm(reg_a0, reg_s0,                                    \\\n   ((bit_count[reg_list] + 1) * 4), 0);                                       \\\n  generate_store_reg(reg_a0, base_reg)                                        \\\n\n#define thumb_block_address_postadjust_push_lr(base_reg)                      \\\n  generate_store_reg(reg_s0, base_reg)                                        \\\n\n#define thumb_block_memory_extra_no()                                         \\\n\n#define thumb_block_memory_extra_up()                                         \\\n\n#define thumb_block_memory_extra_down()                                       \\\n\n#define thumb_block_memory_extra_pop_pc()                                     \\\n  generate_add_reg_reg_imm(reg_a0, reg_s0, (bit_count[reg_list] * 4), 0);     \\\n  generate_function_call(execute_load_u32);                                   \\\n  write32((pc + 4));                                                          \\\n  generate_mov(reg_a0, reg_rv);                                               \\\n  generate_indirect_branch_cycle_update(dual_thumb)                                \\\n\n#define thumb_block_memory_extra_push_lr(base_reg)                            \\\n  generate_add_reg_reg_imm(reg_a0, reg_s0, (bit_count[reg_list] * 4), 0);     \\\n  generate_load_reg(reg_a1, REG_LR);                                          \\\n  generate_function_call(execute_store_u32_safe)                              \\\n\n#define thumb_block_memory_load()                                             \\\n  generate_function_call(execute_load_u32);                                   \\\n  write32((pc + 4));                                                          \\\n  generate_store_reg(reg_rv, i)                                               \\\n\n#define thumb_block_memory_store()                                            \\\n  generate_load_reg(reg_a1, i);                                               \\\n  generate_function_call(execute_store_u32_safe)                              \\\n\n#define thumb_block_memory_final_load()                                       \\\n  thumb_block_memory_load()                                                   \\\n\n#define thumb_block_memory_final_store()                                      \\\n  generate_load_reg(reg_a1, i);                                               \\\n  generate_function_call(execute_store_u32);                                  \\\n  write32((pc + 2))                                                           \\\n\n#define thumb_block_memory_final_no(access_type)                              \\\n  thumb_block_memory_final_##access_type()                                    \\\n\n#define thumb_block_memory_final_up(access_type)                              \\\n  thumb_block_memory_final_##access_type()                                    \\\n\n#define thumb_block_memory_final_down(access_type)                            \\\n  thumb_block_memory_final_##access_type()                                    \\\n\n#define thumb_block_memory_final_push_lr(access_type)                         \\\n  thumb_block_memory_##access_type()                                          \\\n\n#define thumb_block_memory_final_pop_pc(access_type)                          \\\n  thumb_block_memory_##access_type()                                          \\\n\n#define thumb_block_memory(access_type, pre_op, post_op, base_reg)            \\\n{                                                                             \\\n  thumb_decode_rlist();                                                       \\\n  u32 i;                                                                      \\\n  u32 offset = 0;                                                             \\\n                                                                              \\\n  generate_load_reg(reg_s0, base_reg);                                        \\\n  ARM_BIC_REG_IMM(0, reg_s0, reg_s0, 0x03, 0);                                \\\n  thumb_block_address_preadjust_##pre_op();                                   \\\n  thumb_block_address_postadjust_##post_op(base_reg);                         \\\n                                                                              \\\n  for(i = 0; i < 8; i++)                                                      \\\n  {                                                                           \\\n    if((reg_list >> i) & 0x01)                                                \\\n    {                                                                         \\\n      generate_add_reg_reg_imm(reg_a0, reg_s0, offset, 0);                    \\\n      if(reg_list & ~((2 << i) - 1))                                          \\\n      {                                                                       \\\n        thumb_block_memory_##access_type();                                   \\\n        offset += 4;                                                          \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        thumb_block_memory_final_##post_op(access_type);                      \\\n        break;                                                                \\\n      }                                                                       \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  thumb_block_memory_extra_##post_op();                                       \\\n}                                                                             \\\n\n#define thumb_conditional_branch(condition)                                   \\\n{                                                                             \\\n  generate_cycle_update();                                                    \\\n  generate_load_flags();                                                      \\\n  generate_branch_filler(condition_opposite_##condition, backpatch_address);  \\\n  generate_branch_no_cycle_update(                                            \\\n   block_exits[block_exit_position].branch_source,                            \\\n   block_exits[block_exit_position].branch_target, thumb);                    \\\n  generate_branch_patch_conditional_thumb(backpatch_address, translation_ptr);      \\\n  block_exit_position++;                                                      \\\n}                                                                             \\\n\n\n#define arm_conditional_block_header()                                        \\\n  generate_cycle_update();                                                    \\\n  generate_load_flags();                                                      \\\n  /* This will choose the opposite condition */                               \\\n  condition ^= 0x01;                                                          \\\n  generate_branch_filler(condition, backpatch_address)                        \\\n\n#define arm_b()                                                               \\\n\t\tcycle_count+=3;\\\n  generate_branch(arm)                                                        \\\n\n#define arm_bl()                                                              \\\n\tcycle_count+=3;\\\n  generate_update_pc((pc + 4));                                               \\\n  generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_branch(arm)                                                        \\\n\n#define arm_bx()                                                              \\\n\t\tcycle_count+=3;\\\n  arm_decode_branchx();                                                       \\\n  generate_load_reg(reg_a0, rn);                                              \\\n  generate_indirect_branch_dual();                                            \\\n\nextern void arm_update_gba_to_thumb();\nextern void arm_update_gba_idle_to_thumb();\n\nextern void to_thumb_handler();\nextern void to_arm_handler();\n\n#define arm_blx_imm()\\\n\t\tcycle_count+=3;\\\n  generate_update_pc((pc + 4));                                               \\\n  generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_function_call(to_thumb_handler); \\\n  generate_branch_blx_imm(thumb)                                                        \\\n\n#define arm_blx_reg()\\\n\t\tcycle_count+=3;\\\narm_decode_branchx();                                                       \\\ngenerate_update_pc((pc + 4));                                               \\\n generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_load_reg(reg_a0, rn);                                              \\\n  generate_indirect_branch_dual();                                            \\\n\n#define arm_clz()\\\n{\texec_cyc=2;\\\n\tarm_decode_clz();\\\n\tu32 _rd = prepare_store_reg(reg_a0, rd);                                    \\\n\tgenerate_load_reg(_rd, rm);                                           \\\n\twrite32(0xe16f0f10 | _rd | (_rd<<12));\\\n\tcomplete_store_reg(_rd, rd);                                                 }\\\n\n#define generate_q_add(_rn, _rd, _rm)\\\n\twrite32(0xe1000050 | (_rn << 16) | (_rd << 12) | (_rm))\\\n\n#define generate_q_dadd(_rn, _rd, _rm)  \\\n\twrite32(0xe1400050 | (_rn <<16) | (_rd << 12) |(_rm))  \\\n\n#define generate_q_sub(_rn, _rd, _rm)\\\n\twrite32(0xe1200050 | (_rn << 16) | (_rd << 12) | (_rm))\\\n\n#define generate_q_dsub(_rn, _rd, _rm)\\\n\twrite32(0xe1600050 | (_rn << 16) | (_rd << 12) | (_rm))\\\n\n#define arm_q_op(name) \\\n{                                                                             \\\n  arm_decode_q_op();                                                      \\\n  exec_cyc = rd ==15 ? 3 : 2;\\\n  u32 _rm = prepare_load_reg(reg_a0, rm);                                     \\\n  u32 _rn = prepare_load_reg(reg_a1, rn);                                     \\\n  u32 _rd = prepare_store_reg(reg_a0, rd);                                    \\\n  generate_load_flags();                                                      \\\n    generate_q_##name(_rn, _rd, _rm);                                         \\\n    generate_store_flags();                                                      \\\n  complete_store_reg(_rd, rd);                                                \\\n}                                                                             \\\n\n\n#define arm_q_mla()\\\n\t\t{                                                                             \\\n\texec_cyc=2;\\\n\t\t  arm_decode_q_mla();                                                      \\\n\t\t  u32 _rm = prepare_load_reg(reg_a0, rm);                                     \\\n\t\t  u32 _rn = prepare_load_reg(reg_a1, rn);                                     \\\n\t\t  u32 _rs = prepare_load_reg(reg_a2, rs);                                   \\\n\t\t  u32 _rd = prepare_store_reg(reg_a0, rd);                                    \\\n\t\t  generate_load_flags();                                                      \\\n\t\t    write32(clean_op | (_rd << 16) | (_rn << 12) | (_rs << 8) | _rm  | 0xE0000000);                                         \\\n\t\t    generate_store_flags();                                                      \\\n\t\t  complete_store_reg(_rd, rd);                                                \\\n\t\t}    \\\n\n#define arm_q_mul()\\\n\t\t{                                                                             \\\n\t\t\texec_cyc=2;\\\n\t\t  arm_decode_q_mul();                                                      \\\n\t\t  u32 _rm = prepare_load_reg(reg_a0, rm);                                     \\\n\t\t  u32 _rs = prepare_load_reg(reg_a1, rs);                                   \\\n\t\t  u32 _rd = prepare_store_reg(reg_a0, rd);                                    \\\n\t\t  generate_load_flags();                                                      \\\n\t\t    write32(clean_op | (_rd << 16) | (_rs << 8) | _rm | 0xE0000000);                                         \\\n\t\t    generate_store_flags();                                                      \\\n\t\t  complete_store_reg(_rd, rd);                                                \\\n\t\t}    \\\n\n\nextern void arm_mcr_asm(const u32 i);\nextern void arm_mrc_asm(const u32 i);\n\n#define arm_mcr_emit()\\\n\t\tcycle_count+= 2;                                                           \\\n\t\tgenerate_cycle_update(); \\\n\t\tgenerate_function_call(arm_mcr_asm);                            \\\n\t\twrite32((pc + 4));                                                          \\\n\n#define arm_mrc_emit()\\\n\t\texec_cyc = 4;                                                           \\\n\t\tgenerate_function_call(arm_mrc_asm);                            \\\n\t\twrite32((pc + 4));                                                          \\\n\n#define arm_swi()                                                             \\\n\tgenerate_cycle_update(); \\\n  generate_function_call(execute_swi_arm);                                    \\\n  write32((pc + 4));                                                          \\\n\n\n#define thumb_b()                                                             \\\n\t\tcycle_count+=1; \\\n  generate_branch(thumb)                                                      \\\n\n#define thumb_bl()                                                            \\\n\t\tcycle_count+=5;\\\n  generate_update_pc(((pc + 2) | 0x01));                                      \\\n  generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_branch(thumb)                                                      \\\n\n#define thumb_blh()                                                           \\\n{                                                                             \\\n\t  cycle_count+=1;\\\n  thumb_decode_branch();                                                      \\\n  generate_update_pc(((pc + 2) | 0x01));                                      \\\n  generate_load_reg(reg_a1, REG_LR);                                          \\\n  generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_mov(reg_a0, reg_a1);                                               \\\n  generate_add_imm(reg_a0, (offset * 2), 0);                                  \\\n  generate_indirect_branch_cycle_update(thumb);                               \\\n}                                                                             \\\n\nextern void arm_update_gba_to_arm();\nextern void arm_update_gba_idle_to_arm();\nextern void arm_indirect_branch_to_arm();\n\n#define thumb_blx_imm()                                                           \\\n{                                                                             \\\n\t/*block_exits[block_exit_position].branch_source  */                          \\\n\t\tcycle_count+=4;\\\n  generate_update_pc(((pc + 2)|0x01));                                      \\\n  generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_function_call(to_arm_handler); \\\n  generate_branch_blx_imm(arm);                          \\\n}                                                                             \\\n\n#define thumb_blxh()                                                           \\\n{                                                                             \\\n\t  cycle_count+=1;\\\n  thumb_decode_branch();                                                      \\\n  generate_update_pc(((pc + 2) | 0x01));                                      \\\n  generate_load_reg(reg_a1, REG_LR);                                          \\\n  generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_mov(reg_a0, reg_a1);                                               \\\n  generate_add_imm(reg_a0, (offset * 2), 0);                                  \\\n  generate_indirect_branch_cycle_update(to_arm);                               \\\n}                                                                             \\\n\n#define thumb_bx()                                                            \\\n{                                                                             \\\n\tcycle_count+=3;\\\n  thumb_decode_hireg_op();                                                    \\\n  generate_load_reg_pc(reg_a0, rs, 4);                                        \\\n  generate_indirect_branch_cycle_update(dual_thumb);                          \\\n}                                                                             \\\n\n#define thumb_blx_reg()                                                            \\\n{                                                                             \\\n\tcycle_count+=4;\\\n  thumb_decode_hireg_op();                                                    \\\n  generate_update_pc(((pc + 2)|0x01)); \\\n  generate_store_reg(reg_a0, REG_LR);                                         \\\n  generate_load_reg_pc(reg_a0, rs, 2);                                        \\\n  generate_indirect_branch_cycle_update(dual_thumb);                          \\\n}                                                                             \\\n\n\n#define thumb_swi()                                                           \\\n\tgenerate_cycle_update(); \\\n  generate_function_call(execute_swi_thumb);                                  \\\n  write32((pc + 2));                                                          \\\n\nu8 swi_hle_handle[256] =\n{\n  0x0,    // SWI 0:  SoftReset\n  0x0,    // SWI 1:  RegisterRAMReset\n  0x0,    // SWI 2:  Halt\n  0x0,    // SWI 3:  Stop/Sleep\n  0x0,    // SWI 4:  IntrWait\n  0x0,    // SWI 5:  VBlankIntrWait\n  0x1,    // SWI 6:  Div\n  0x0,    // SWI 7:  DivArm\n  0x0,    // SWI 8:  Sqrt\n  0x0,    // SWI 9:  ArcTan\n  0x0,    // SWI A:  ArcTan2\n  0x0,    // SWI B:  CpuSet\n  0x0,    // SWI C:  CpuFastSet\n  0x0,    // SWI D:  GetBIOSCheckSum\n  0x0,    // SWI E:  BgAffineSet\n  0x0,    // SWI F:  ObjAffineSet\n  0x0,    // SWI 10: BitUnpack\n  0x0,    // SWI 11: LZ77UnCompWram\n  0x0,    // SWI 12: LZ77UnCompVram\n  0x0,    // SWI 13: HuffUnComp\n  0x0,    // SWI 14: RLUnCompWram\n  0x0,    // SWI 15: RLUnCompVram\n  0x0,    // SWI 16: Diff8bitUnFilterWram\n  0x0,    // SWI 17: Diff8bitUnFilterVram\n  0x0,    // SWI 18: Diff16bitUnFilter\n  0x0,    // SWI 19: SoundBias\n  0x0,    // SWI 1A: SoundDriverInit\n  0x0,    // SWI 1B: SoundDriverMode\n  0x0,    // SWI 1C: SoundDriverMain\n  0x0,    // SWI 1D: SoundDriverVSync\n  0x0,    // SWI 1E: SoundChannelClear\n  0x0,    // SWI 1F: MidiKey2Freq\n  0x0,    // SWI 20: SoundWhatever0\n  0x0,    // SWI 21: SoundWhatever1\n  0x0,    // SWI 22: SoundWhatever2\n  0x0,    // SWI 23: SoundWhatever3\n  0x0,    // SWI 24: SoundWhatever4\n  0x0,    // SWI 25: MultiBoot\n  0x0,    // SWI 26: HardReset\n  0x0,    // SWI 27: CustomHalt\n  0x0,    // SWI 28: SoundDriverVSyncOff\n  0x0,    // SWI 29: SoundDriverVSyncOn\n  0x0     // SWI 2A: SoundGetJumpList\n};\n\nvoid execute_swi_hle_div_arm();\nvoid execute_swi_hle_div_thumb();\n\nvoid execute_swi_hle_div_c()\n{\n  /*s32 result = (s32)reg[0] / (s32)reg[1];\n  reg[1] = (s32)reg[0] % (s32)reg[1];\n  reg[0] = result;\n\n  reg[3] = (result ^ (result >> 31)) - (result >> 31);*/\n}\n\n#define generate_swi_hle_handler(_swi_number, mode)                           \\\n{                                                                             \\\n  u32 swi_number = _swi_number;                                               \\\n  if(swi_hle_handle[swi_number])                                              \\\n  {                                                                           \\\n    /* Div */                                                                 \\\n    if(swi_number == 0x06)                                                    \\\n    {                                                                         \\\n      generate_function_call(execute_swi_hle_div_##mode);                     \\\n    }                                                                         \\\n    break;                                                                    \\\n  }                                                                           \\\n}                                                                             \\\n\n#define generate_translation_gate(type)                                       \\\n  generate_update_pc(pc);                                                     \\\n  generate_indirect_branch_no_cycle_update(type)                              \\\n\n#define generate_step_debug()                                                 \\\n  generate_function_call(step_debug_arm);                                     \\\n  write32(pc)                                                                 \\\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/arm_stub.S",
    "content": ".align 2\r\n\r\n.extern block_lookup_address_arm\r\n.extern block_lookup_address_thumb\r\n.extern execute_store_cpsr_body\r\n.extern execute_swi_hle_div_c\r\n.extern move_reg\r\n.extern ds_write8\r\n.extern ds_write16\r\n.extern ds_write32\r\n.extern ds_read8\r\n.extern ds_read16\r\n.extern ds_read32\r\n.extern NDS_update_dynarec\r\n.extern update_dynarec\r\n.extern logmeow\r\n.extern arm_mrc\r\n.extern arm_mcr\r\n.extern switch_user_arm\r\n.extern switch_back_arm\r\n.extern load_reg\r\n.extern cache_reg\r\n.extern read8_cycles\r\n.extern read16_cycles\r\n.extern read32_cycles\r\n\r\n.globl multiply_add_no_cycles\r\n.globl multiply_add_yes_cycles\r\n.globl u64_cycles\r\n.globl u64_add_cycles\r\n.globl s64_cycles\r\n.globl s64_add_cycles\r\n\r\n.globl dynarec_init\r\n.globl dynarec_exec\r\n\r\n.globl switch_user\r\n.globl switch_back\r\n\r\n.globl arm_update_gba_arm\r\n.globl arm_update_gba_thumb\r\n.globl arm_update_gba_idle_arm\r\n.globl arm_update_gba_idle_thumb\r\n\r\n\r\n.globl arm_indirect_branch_arm\r\n.globl arm_indirect_branch_thumb\r\n.globl arm_indirect_branch\r\n.globl arm_indirect_branch_dual_arm\r\n.globl arm_indirect_branch_dual_thumb\r\n.globl arm_indirect_branch_to_arm\r\n\r\n.globl to_thumb_handler\r\n.globl to_arm_handler\r\n\r\n.globl execute_arm_translate\r\n\r\n.globl execute_store_u8\r\n.globl execute_store_u16\r\n.globl execute_store_u32\r\n.globl execute_store_u32_safe\r\n\r\n.globl execute_load_u8\r\n.globl execute_load_s8\r\n.globl execute_load_u16\r\n.globl execute_load_s16\r\n.globl execute_load_u32\r\n\r\n.globl execute_store_cpsr\r\n.globl execute_read_spsr\r\n.globl execute_store_spsr\r\n.globl execute_spsr_restore\r\n\r\n.globl execute_swi_arm\r\n.globl execute_swi_thumb\r\n\r\n.globl execute_patch_bios_read\r\n.globl execute_patch_bios_protect\r\n\r\n.globl execute_bios_ptr_protected\r\n.globl execute_bios_rom_ptr\r\n\r\n.globl arm_mrc_asm\r\n.globl arm_mcr_asm\r\n\r\n.globl step_debug_arm\r\n\r\n.globl invalidate_icache_region\r\n.globl invalidate_cache_region\r\n\r\n.globl memory_map_read\r\n.globl memory_map_write\r\n.globl reg\r\n\r\n#define REG_BASE_OFFSET   1024\r\n\r\n#define REG_R0            (REG_BASE_OFFSET + (0 * 4))\r\n#define REG_R1            (REG_BASE_OFFSET + (1 * 4))\r\n#define REG_R2            (REG_BASE_OFFSET + (2 * 4))\r\n#define REG_R3            (REG_BASE_OFFSET + (3 * 4))\r\n#define REG_R4            (REG_BASE_OFFSET + (4 * 4))\r\n#define REG_R5            (REG_BASE_OFFSET + (5 * 4))\r\n#define REG_R6            (REG_BASE_OFFSET + (6 * 4))\r\n#define REG_R7            (REG_BASE_OFFSET + (7 * 4))\r\n#define REG_R8            (REG_BASE_OFFSET + (8 * 4))\r\n#define REG_R9            (REG_BASE_OFFSET + (9 * 4))\r\n#define REG_R10           (REG_BASE_OFFSET + (10 * 4))\r\n#define REG_R11           (REG_BASE_OFFSET + (11 * 4))\r\n#define REG_R12           (REG_BASE_OFFSET + (12 * 4))\r\n#define REG_R13           (REG_BASE_OFFSET + (13 * 4))\r\n#define REG_R14           (REG_BASE_OFFSET + (14 * 4))\r\n#define REG_SP            (REG_BASE_OFFSET + (13 * 4))\r\n#define REG_LR            (REG_BASE_OFFSET + (14 * 4))\r\n#define REG_PC            (REG_BASE_OFFSET + (15 * 4))\r\n\r\n#define REG_CPSR          (REG_BASE_OFFSET + (16 * 4))\r\n\r\n#define REG_SAVE_SP          (REG_BASE_OFFSET + (21 * 4))\r\n#define REG_SAVE_LR         (REG_BASE_OFFSET + (22 * 4))\r\n#define REG_SAVE_LR_DYNAREC         (REG_BASE_OFFSET + (23 * 4))\r\n\r\n#define CPU_MODE          (REG_BASE_OFFSET + (29 * 4))\r\n#define CPU_HALT_STATE    (REG_BASE_OFFSET + (30 * 4))\r\n#define CHANGED_PC_STATUS (REG_BASE_OFFSET + (31 * 4))\r\n\r\n\r\n#define reg_a0            r0\r\n#define reg_a1            r1\r\n#define reg_a2            r2\r\n\r\n#define reg_s0            r9\r\n#define reg_base          sp\r\n#define reg_flags         r11\r\n\r\n#define reg_cycles        r12\r\n\r\n#define reg_x0            r3\r\n#define reg_x1            r4\r\n#define reg_x2            r5\r\n#define reg_x3            r6\r\n#define reg_x4            r7\r\n#define reg_x5            r8\r\n\r\n\r\n#define MODE_SUPERVISOR   3\r\n\r\n#ifdef __ARM_ARCH_7A__\r\n  #define extract_u16(rd, rs) \\\r\n    uxth rd, rs\r\n#else\r\n  #define extract_u16(rd, rs) \\\r\n    bic  rd, rs, #0xff000000 ;\\\r\n    bic  rd, rd, #0x00ff0000\r\n#endif\r\n\r\n@ Will load the register set from memory into the appropriate cached registers.\r\n@ See arm_emit.h for listing explanation.\r\n\r\n#define load_registers_arm()                                                 ;\\\r\n  ldr reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  ldr reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  ldr reg_x2, [reg_base, #REG_R6]                                            ;\\\r\n  ldr reg_x3, [reg_base, #REG_R9]                                            ;\\\r\n  ldr reg_x4, [reg_base, #REG_R12]                                           ;\\\r\n  ldr reg_x5, [reg_base, #REG_R14]                                           ;\\\r\n\r\n#define load_registers_thumb()                                               ;\\\r\n  ldr reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  ldr reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  ldr reg_x2, [reg_base, #REG_R2]                                            ;\\\r\n  ldr reg_x3, [reg_base, #REG_R3]                                            ;\\\r\n  ldr reg_x4, [reg_base, #REG_R4]                                            ;\\\r\n  ldr reg_x5, [reg_base, #REG_R5]                                            ;\\\r\n\r\n\r\n@ Will store the register set from cached registers back to memory.\r\n\r\n#define store_registers_arm()                                                ;\\\r\n  str reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  str reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  str reg_x2, [reg_base, #REG_R6]                                            ;\\\r\n  str reg_x3, [reg_base, #REG_R9]                                            ;\\\r\n  str reg_x4, [reg_base, #REG_R12]                                           ;\\\r\n  str reg_x5, [reg_base, #REG_R14]                                           ;\\\r\n\r\n#define store_registers_thumb()                                              ;\\\r\n  str reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  str reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  str reg_x2, [reg_base, #REG_R2]                                            ;\\\r\n  str reg_x3, [reg_base, #REG_R3]                                            ;\\\r\n  str reg_x4, [reg_base, #REG_R4]                                            ;\\\r\n  str reg_x5, [reg_base, #REG_R5]                                            ;\\\r\n\r\n\r\n@ Returns an updated persistent cpsr with the cached flags register.\r\n@ Uses reg as a temporary register and returns the CPSR here.\r\n\r\n#define collapse_flags_no_update(reg)                                        ;\\\r\n  ldr reg, [reg_base, #REG_CPSR]          /* reg = cpsr                    */;\\\r\n  bic reg, reg, #0xF8000000               /* clear ALU flags in cpsr       */;\\\r\n  and reg_flags, reg_flags, #0xF8000000   /* clear non-ALU flags           */;\\\r\n  orr reg, reg, reg_flags                 /* update cpsr with ALU flags    */;\\\r\n\r\n@ Updates cpsr using the above macro.\r\n\r\n#define collapse_flags(reg)                                                  ;\\\r\n  collapse_flags_no_update(reg)                                              ;\\\r\n  str reg, [reg_base, #REG_CPSR]                                             ;\\\r\n\r\n@ Loads the saved flags register from the persistent cpsr.\r\n\r\n#define extract_flags()                                                      ;\\\r\n  ldr reg_flags, [reg_base, #REG_CPSR]                                       ;\\\r\n  msr cpsr_f, reg_flags                                                      ;\\\r\n\r\n\r\n#define save_flags()                                                         ;\\\r\n  mrs reg_flags, cpsr                                                        ;\\\r\n\r\n#define restore_flags()                                                      ;\\\r\n  msr cpsr_f, reg_flags                                                      ;\\\r\n\r\n#ifdef __ARM_EABI__\r\n  @ must align stack\r\n  #define call_c_saved_regs r2, r3, r12, lr\r\n#else\r\n  #define call_c_saved_regs r3, r12, lr\r\n#endif\r\n\r\n@ Calls a C function - all caller save registers which are important to the\r\n@ dynarec and to returning from this function are saved.\r\n\r\n#define call_c_function(function)                                            ;\\\r\n  stmdb sp!, { call_c_saved_regs }                                           ;\\\r\n  bl function                                                                ;\\\r\n  ldmia sp!, { call_c_saved_regs }                                           ;\\\r\n\r\n\r\n@ Update the GBA hardware (video, sound, input, etc)\r\n\r\n@ Input:\r\n@ r0: current PC\r\n\r\n#define return_straight()                                                    ;\\\r\n   str lr, [reg_base, #REG_SAVE_LR_DYNAREC]                                ;\\\r\n\r\n#define return_add()                                                         ;\\\r\n  add lr, lr, #4;\\\r\n  str lr, [reg_base, #REG_SAVE_LR_DYNAREC]                                                             ;\\\r\n\r\n#define load_pc_straight()                                                   ;\\\r\n  ldr r0, [lr, #-8]                                                          ;\\\r\n\r\n#define load_pc_add()                                                        ;\\\r\n  ldr r0, [lr]                                                               ;\\\r\n\r\n\r\n#define arm_update_gba_builder(name, mode, return_op)                        ;\\\r\n                                                                             ;\\\r\narm_update_gba_##name:                                                       ;\\\r\n  load_pc_##return_op()                                                      ;\\\r\n  str r0, [reg_base, #REG_PC]             /* write out the PC              */;\\\r\n                                                                             ;\\\r\n  save_flags()                                                               ;\\\r\n  collapse_flags(r0)                      /* update the flags              */;\\\r\n                                                                             ;\\\r\n  store_registers_##mode()                /* save out registers            */;\\\r\n     ;\\\r\n  return_##return_op()    ;\\\r\n      ;\\\r\n  add sp, sp, #REG_BASE_OFFSET   ;\\\r\n  mov r0, sp    ;\\\r\n   call_c_function(cache_reg)    ;\\\r\n      ;\\\r\n  mov r0, reg_cycles    ;\\\r\n  add sp, sp, #0x100 ;\\\r\n  ldmfd sp!,{r4-r11,pc}     ;\\\r\n\r\n\r\n\r\narm_update_gba_builder(arm, arm, straight)\r\narm_update_gba_builder(thumb, thumb, straight)\r\n\r\narm_update_gba_builder(idle_arm, arm, add)\r\narm_update_gba_builder(idle_thumb, thumb, add)\r\n\r\n\r\n\r\n@ These are b stubs for performing indirect branches. They are not\r\n@ linked to and don't return, instead they link elsewhere.\r\n\r\n@ Input:\r\n@ r0: PC to branch to\r\n\r\narm_indirect_branch_arm:\r\n  save_flags()\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0\r\n\r\narm_indirect_branch_thumb:\r\n  save_flags()\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0\r\n\r\narm_indirect_branch_dual_arm:\r\n  save_flags()\r\n  tst r0, #0x01                           @ check lower bit\r\n  bne 1f                                  @ if set going to Thumb mode\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\n1:\r\n  bic r0, r0, #0x01\r\n  store_registers_arm()                   @ save out ARM registers\r\n  load_registers_thumb()                  @ load in Thumb registers\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  orr r1, r1, #0x20                       @ set Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\narm_indirect_branch_dual_thumb:\r\n  save_flags()\r\n  tst r0, #0x01                           @ check lower bit\r\n  beq 1f                                  @ if set going to ARM mode\r\n  bic r0, r0, #0x01\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\n1:\r\n  store_registers_thumb()                 @ save out Thumb registers\r\n  load_registers_arm()                    @ load in ARM registers\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  bic r1, r1, #0x20                       @ clear Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\narm_indirect_branch_to_arm:\r\n  save_flags()\r\n  store_registers_thumb()                 @ save out Thumb registers\r\n  load_registers_arm()                    @ load in ARM registers\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  bic r1, r1, #0x20                       @ clear Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\n\r\n@ Update the cpsr.\r\n\r\n@ Input:\r\n@ r0: new cpsr value\r\n@ r1: bitmask of which bits in cpsr to update\r\n@ r2: current PC\r\n\r\nexecute_store_cpsr:\r\n  save_flags()\r\n  and reg_flags, r0, r1                   @ reg_flags = new_cpsr & store_mask\r\n  ldr r0, [reg_base, #REG_CPSR]           @ r0 = cpsr\r\n  bic r0, r0, r1                          @ r0 = cpsr & ~store_mask\r\n  orr reg_flags, reg_flags, r0            @ reg_flags = new_cpsr | cpsr\r\n\r\n  mov r0, reg_flags                       @ also put new cpsr in r0\r\n\r\n  store_registers_arm()                   @ save ARM registers\r\n  ldr r2, [lr]                            @ r2 = pc\r\n  call_c_function(execute_store_cpsr_body)\r\n  load_registers_arm()                    @ restore ARM registers\r\n\r\n  cmp r0, #0                              @ check new PC\r\n  beq 1f                                  @ if it's zero, return\r\n\r\n  call_c_function(block_lookup_address_arm)\r\n\r\n  restore_flags()\r\n  bx r0                                   @ return to new ARM address\r\n\r\n1:\r\n  restore_flags()\r\n  add pc, lr, #4                          @ return\r\n\r\n\r\n@ Update the current spsr.\r\n\r\n@ Input:\r\n@ r0: new cpsr value\r\n@ r1: bitmask of which bits in spsr to update\r\n\r\nexecute_store_spsr:\r\n  ldr r1, =spsr_pointer\r\n  ldr r1, [r1]\r\n  str r0, [r1]              @ spsr[CPU_MODE] = new_spsr\r\n  bx lr\r\n\r\n@ Read the current spsr.\r\n\r\n@ Output:\r\n@ r0: spsr\r\n\r\nexecute_read_spsr:\r\n  ldr r0, =spsr_pointer                           @ r0 = &spsr\r\n  ldr r0, [r0]\r\n  ldr r0, [r0]\r\n  bx lr                                   @ return\r\n\r\n\r\n@ Restore the cpsr from the mode spsr and mode shift.\r\n\r\n@ Input:\r\n@ r0: current pc\r\n\r\nexecute_spsr_restore:\r\n  save_flags()\r\n  store_registers_arm()\r\n\r\n  @ This function call will pass r0 (address) and return it.\r\n  ldr r3, =spsr_pointer                           @ r1 = spsr\r\n  ldr r3, [r3]\r\n  ldr r3, [r3]\r\n\r\n                   @ save ARM registers\r\n  call_c_function(execute_spsr_restore_body)\r\n\r\n\r\n  str r3, [reg_base, #REG_CPSR]           @ update cpsr\r\n\r\n  mov reg_flags, r3                      @ also, update shadow flags\r\n\r\n  ldr r1, [reg_base, #REG_CPSR]           @ r1 = cpsr\r\n  tst r1, #0x20                           @ see if Thumb mode is set\r\n  bne 2f                                  @ if so handle it\r\n\r\n  load_registers_arm()                    @ restore ARM registers\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0\r\n\r\n2:\r\n  load_registers_thumb()                  @ load Thumb registers\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0\r\n\r\n\r\n\r\n@ Setup the mode transition work for calling an SWI.\r\n\r\n@ Input:\r\n@ r0: current pc\r\n\r\n#define execute_swi_builder(mode)                                            ;\\\r\n                                                                             ;\\\r\nexecute_swi_##mode:                                                          ;\\\r\nldr r0, [lr] ;\\\r\nsave_flags();\\\r\n  collapse_flags(r2)                                                             ;\\\r\n  store_registers_##mode()                                                   ;\\\r\n  call_c_function(mode##_swi_exec)                        ;\\\r\n  add reg_cycles, reg_cycles, r0;\\\r\n  load_registers_##mode()                                                    ;\\\r\n  extract_flags()                                                            ;\\\r\n add pc, lr, #4                                                                     ;\\\r\n\r\nexecute_swi_builder(arm)\r\n\r\n\r\nexecute_swi_thumb:\r\nldr r0, [lr]\r\nsave_flags()\r\n  collapse_flags(r2)\r\n  store_registers_thumb()\r\n  call_c_function(thumb_swi_exec)\r\n  add reg_cycles, reg_cycles, r0\r\n  load_registers_thumb()\r\n  extract_flags()\r\n add pc, lr, #4\r\n\r\n\r\n//execute_swi_builder(thumb)\r\n\r\n\r\n@ Wrapper for calling SWI functions in C (or can implement some in ASM if\r\n@ desired)\r\n\r\n#define execute_swi_function_builder(swi_function, mode)                     ;\\\r\n                                                                             ;\\\r\n  .globl execute_swi_hle_##swi_function##_##mode                            ;\\\r\nexecute_swi_hle_##swi_function##_##mode:                                     ;\\\r\n  save_flags()                                                               ;\\\r\n  store_registers_##mode()                                                   ;\\\r\n  call_c_function(execute_swi_hle_##swi_function##_c)                        ;\\\r\n  load_registers_##mode()                                                    ;\\\r\n  restore_flags()                                                            ;\\\r\n  bx lr                                                                      ;\\\r\n\r\nexecute_swi_function_builder(div, arm)\r\nexecute_swi_function_builder(div, thumb)\r\n\r\n\r\n@ Start program execution. Normally the mode should be Thumb and the\r\n@ PC should be 0x8000000, however if a save state is preloaded this\r\n@ will be different.\r\n\r\n@ Input:\r\n@ r0: initial value for cycle counter\r\n\r\n@ Uses sp as reg_base; must hold consistently true.\r\n\r\ndynarec_init:               @ load cycle counter\r\n\r\n  mov r0, reg_base                        @ load reg_base into first param\r\n  call_c_function(move_reg)               @ make reg_base the new reg ptr\r\n  bx lr\r\n  //bl load_ptr_read_function_table         @ load read function ptr table\r\n\r\n\r\ndynarec_exec:\r\n  stmfd sp!,{r4-r11,lr}\r\n\r\n  sub sp, sp, #0x100                      @ allocate room for register data\r\n                  /* load new cycle count          */\r\n\r\n  mov r0, reg_base                        @ load reg_base into first param\r\n  call_c_function(load_reg)\r\n  sub sp, sp, #REG_BASE_OFFSET\r\n\r\n  ldr lr, [reg_base, #REG_SAVE_LR_DYNAREC]\r\n\r\n  ldr r0, [reg_base, #CHANGED_PC_STATUS]  /* load PC changed status        */\r\n  cmp r0, #0                              /* see if PC has changed         */\r\n\r\n  mov reg_cycles, #0\r\n  beq 1f                                  /* if not return                 */\r\n\r\n  mov r1, #0\r\n  str r1, [reg_base, #CHANGED_PC_STATUS]\r\n\r\n  ldr r0, [reg_base, #REG_PC]             /* load new PC                   */\r\n  ldr r1, [reg_base, #REG_CPSR]           /* r1 = flags                    */\r\n  tst r1, #0x20                           /* see if Thumb bit is set       */\r\n  bne 2f                                  /* if so load Thumb PC           */\r\n\r\n  load_registers_arm()                    /* load ARM regs                 */\r\n  call_c_function(block_lookup_address_arm)\r\n  extract_flags()\r\n\r\n  bx r0                                   /* jump to new ARM block         */\r\n\r\n1:\r\n  ldr r0, [reg_base, #REG_PC]             /* load new PC                   */\r\n  ldr r1, [reg_base, #REG_CPSR]           /* r1 = flags                    */\r\n  tst r1, #0x20                           /* see if Thumb bit is set       */\r\n  bne 3f                                  /* if so load Thumb PC           */\r\n\r\n  load_registers_arm()                 /* reload registers              */\r\n  extract_flags()\r\n  ldr pc, [reg_base, #REG_SAVE_LR_DYNAREC]\r\n\r\n2:\r\n  load_registers_thumb()                  /* load Thumb regs               */\r\n  call_c_function(block_lookup_address_thumb)\r\n  extract_flags()\r\n  bx r0                                   /* jump to new ARM block         */\r\n\r\n3:\r\n  load_registers_thumb()\r\n  extract_flags()\r\n  ldr pc, [reg_base, #REG_SAVE_LR_DYNAREC]\r\n@ Write out to memory.\r\n\r\n@ Input:\r\n@ r0: address\r\n@ r1: value\r\n@ r2: current pc\r\n\r\n#define execute_store_body(store_type, store_op)                             ;\\\r\n  save_flags()                                                               ;\\\r\n  stmdb sp!, { lr }                       /* save lr                       */;\\\r\n  tst r0, #0xF0000000                     /* make sure address is in range */;\\\r\n  bne ext_store_u##store_type             /* if not do ext store           */;\\\r\n                                                                             ;\\\r\n  ldr r2, =memory_map_write               /* r2 = memory_map_write         */;\\\r\n  mov lr, r0, lsr #15                     /* lr = page index of address    */;\\\r\n  ldr r2, [r2, lr, lsl #2]                /* r2 = memory page              */;\\\r\n                                                                             ;\\\r\n  cmp r2, #0                              /* see if map is ext             */;\\\r\n  beq ext_store_u##store_type             /* if so do ext store            */;\\\r\n                                                                             ;\\\r\n  mov r0, r0, lsl #17                     /* isolate bottom 15 bits in top */;\\\r\n  mov r0, r0, lsr #17                     /* like performing and 0x7FFF    */;\\\r\n  store_op r1, [r2, r0]                   /* store result                  */;\\\r\n\r\n\r\n#define store_align_8()                                                      ;\\\r\n  and r1, r1, #0xff                                                          ;\\\r\n\r\n#define store_align_16()                                                     ;\\\r\n  bic r0, r0, #0x01                                                          ;\\\r\n  extract_u16(r1, r1)                                                        ;\\\r\n\r\n#define store_align_32()                                                     ;\\\r\n  bic r0, r0, #0x03                                                          ;\\\r\n\r\n\r\n#define execute_store_builder(store_type, store_op, load_op)                 ;\\\r\n                                                                             ;\\\r\nexecute_store_u##store_type:                                                 ;\\\r\n  save_flags()                                                               ;\\\r\n  call_c_function(ds_write##store_type)                                  ;\\\r\n  add reg_cycles, reg_cycles, r0;\\\r\n  ldr r0, [reg_base, #CHANGED_PC_STATUS];\\\r\n  cmp r0, #0;\\\r\n  bne lookup_pc;\\\r\n  restore_flags();\\\r\n  add pc, lr, #4                          /* return*/ ;\\\r\next_store_u##store_type:                                                     ;\\\r\n  save_flags();\\\r\n  call_c_function(ds_write##store_type)                                  ;\\\r\n  add reg_cycles, reg_cycles, r0 ;\\\r\n  cmp r0, #0;\\\r\n  bne lookup_pc;\\\r\n  restore_flags();\\\r\n  add pc, lr, #4                          /* return*/ ;\\\r\n\r\n//execute_store_builder(8, strb, ldrb)\r\nexecute_store_u8:\r\n  save_flags()\r\n  call_c_function(ds_write8)\r\n  add reg_cycles, reg_cycles, r0\r\n  ldr r0, [reg_base, #CHANGED_PC_STATUS]\r\n\r\n  cmp r0, #1\r\n  beq lookup_pc\r\n\r\n  cmp r0, #2\r\n  beq 1f\r\n\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return*/\r\n1:\r\n  mov r0, #0\r\n  str r0, [reg_base, #CHANGED_PC_STATUS]\r\n  ldr r0, [reg_base, #REG_CPSR]\r\n  and r0, r0, #0x20\r\n  cmp r0, #0\r\n  beq 2f\r\n  restore_flags()\r\n  b arm_update_gba_idle_thumb\r\n2:\r\n  restore_flags()\r\n  b arm_update_gba_idle_arm\r\n\r\next_store_u8:\r\n  save_flags()\r\n  call_c_function(ds_write8)\r\n  add reg_cycles, reg_cycles, r0\r\n  cmp r0, #0\r\n  bne lookup_pc\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return*/\r\n\r\n\r\nexecute_store_builder(16, strh, ldrh)\r\n//execute_store_builder(32, str, ldr)\r\n\r\nexecute_store_u32:\r\n  save_flags()\r\n  call_c_function(ds_write32)\r\n  add reg_cycles, reg_cycles, r0\r\n  ldr r0, [reg_base, #CHANGED_PC_STATUS]\r\n\r\n  cmp r0, #1\r\n  beq lookup_pc\r\n\r\n  cmp r0, #2\r\n  beq 1f\r\n\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return*/\r\n1:\r\n  mov r0, #0\r\n  str r0, [reg_base, #CHANGED_PC_STATUS]\r\n  ldr r0, [reg_base, #REG_CPSR]\r\n  and r0, r0, #0x20\r\n  cmp r0, #0\r\n  beq 2f\r\n  restore_flags()\r\n  b arm_update_gba_idle_thumb\r\n2:\r\n  restore_flags()\r\n  b arm_update_gba_idle_arm\r\n\r\nexecute_store_u32_safe:\r\n  save_flags()\r\n  call_c_function(ds_write32)\r\n  add reg_cycles, reg_cycles, r0\r\n  restore_flags()\r\n  bx lr                                    @ Return\r\n\r\next_store_u32_safe:\r\n  save_flags()\r\n  ldmia sp!, { lr }                       @ Restore lr\r\n  call_c_function(ds_write32)         @ Perform 32bit store\r\n  add reg_cycles, reg_cycles, r0\r\n  restore_flags()\r\n  bx lr                                   @ Return\r\n\r\n\r\n/*#define store_align_8()                                                      ;\\\r\n  and r1, r1, #0xff                                                          ;\\\r\n\r\n#define store_align_16()                                                     ;\\\r\n  bic r0, r0, #0x01                                                          ;\\\r\n  extract_u16(r1, r1)                                                        ;\\\r\n\r\n#define store_align_32()                                                     ;\\\r\n  bic r0, r0, #0x03                                                          ;\\\r\n\r\n\r\n#define execute_store_builder(store_type, store_op, load_op)                 ;\\\r\n                                                                             ;\\\r\nexecute_store_u##store_type:                                                 ;\\\r\n  save_flags()                                                               ;\\\r\n  call_c_function(ds_write##store_type)                                  ;\\\r\n  add reg_cycles, reg_cycles, r0;\\\r\n  ldr r0, [reg_base, #CHANGED_PC_STATUS];\\\r\n  cmp r0, #0;\\\r\n bne 1f;\\\r\n  restore_flags();\\\r\n  add pc, lr, #4                            ;\\\r\n1: ;\\\r\n  mov r0, #0;\\\r\n  str r0, [reg_base, #CHANGED_PC_STATUS];\\\r\n  ldr r0, [lr];\\\r\n  str r0, [reg_base, #REG_PC];\\\r\n  b lookup_pc;\\\r\n\r\nexecute_store_builder(8, strb, ldrb)\r\nexecute_store_builder(16, strh, ldrh)\r\n//execute_store_builder(32, str, ldr)\r\n\r\nexecute_store_u32:\r\n  save_flags()\r\n  call_c_function(ds_write32)\r\n  add reg_cycles, reg_cycles, r0\r\n  //ldr r0, [reg_base, #CHANGED_PC_STATUS]\r\n  //cmp r0, #0\r\n  //bne 1f\r\n  restore_flags()\r\n  add pc, lr, #4                           ;\\\r\n1:\r\n  mov r0, #0\r\n  str r0, [reg_base, #CHANGED_PC_STATUS]\r\n  ldr r0, [lr]\r\n  str r0, [reg_base, #REG_PC]\r\n  b lookup_pc\r\n\r\n\r\nexecute_store_u32_safe:\r\n  save_flags()\r\n  call_c_function(ds_write32)\r\n  add reg_cycles, reg_cycles, r0\r\n  //ldr r0, [reg_base, #CHANGED_PC_STATUS]\r\n  //cmp r0, #0\r\n  //bne 1f\r\n  restore_flags()\r\n  add pc, lr, #4                           ;\\\r\n1:\r\n  mov r0, #0\r\n  str r0, [reg_base, #CHANGED_PC_STATUS]\r\n  ldr r0, [lr]\r\n  str r0, [reg_base, #REG_PC]\r\n  b lookup_pc*/\r\n\r\nlookup_pc:\r\n  mov r0, #0\r\n  str r0, [reg_base, #CHANGED_PC_STATUS]\r\n  ldr r0, [lr]\r\n  str r0, [reg_base, #REG_PC]\r\n  //ldr r0, [reg_base, #REG_PC]             @ r0 = new pc\r\n  ldr r1, [reg_base, #REG_CPSR]           @ r1 = flags\r\n  tst r1, #0x20                           @ see if Thumb bit is set\r\n  beq lookup_pc_arm                       @ if not lookup ARM\r\n\r\nlookup_pc_thumb:\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   @ jump to new Thumb block\r\n\r\nlookup_pc_arm:\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ jump to new ARM block\r\n\r\n#ifndef ENABLE_ADVANCED_TIMING\r\n\r\n@this doesnt work if there are 32 zeros in front\r\n@but hopefully that case wont matter too much\r\n\r\nmultiply_add_no_cycles:\r\n  save_flags()\r\n  clz r2, reg_a0\r\n  cmp r2, #0\r\n  rsbeq r2, r2, #0\r\n  clzeq r2, r0\r\n  lsr r2, r2, #8\r\n  rsb r2, r2, #5\r\n  add reg_cycles, reg_cycles, r2\r\n  restore_flags()\r\n  bx lr\r\n\r\nmultiply_add_yes_cycles:\r\n  save_flags()\r\n  clz r2, reg_a0\r\n  cmp r2, #0\r\n  rsbeq r2, r2, #0\r\n  clzeq r2, r0\r\n  asr r2, #8\r\n  rsb r2, r2, #6\r\n  add reg_cycles, r2\r\n  restore_flags()\r\n  bx lr\r\n\r\nu64_cycles:\r\n  clz r1, reg_a2\r\n  asr r1, #8\r\n  rsb r1, r1, #6\r\n  add reg_cycles, r1\r\n  bx lr\r\n\r\nu64_add_cycles:\r\n  clz r1, reg_a2\r\n  asr r1, #8\r\n  rsb r1, r1, #7\r\n  add reg_cycles, r1\r\n  bx lr\r\n\r\ns64_cycles:\r\n  save_flags()\r\n  clz r1, reg_a2\r\n  cmp r1, #0\r\n  rsbeq r1, r1, #0\r\n  clzeq r1, r0\r\n  lsr r1, r1, #8\r\n  rsb r1, r1, #6\r\n  add reg_cycles, reg_cycles, r1\r\n  restore_flags()\r\n  bx lr\r\n\r\ns64_add_cycles:\r\n  save_flags()\r\n  clz r1, reg_a2\r\n  cmp r1, #0\r\n  rsbeq r1, r1, #0\r\n  clzeq r1, r0\r\n  asr r1, #8\r\n  rsb r1, r1, #7\r\n  add reg_cycles, r1\r\n  restore_flags()\r\n  bx lr\r\n\r\n#endif\r\n\r\nto_thumb_handler:\r\n\tldr r1, [reg_base, #REG_CPSR]\r\n\torr r1, r1, #0x20\r\n\tstr r1, [reg_base, #REG_CPSR]\r\n\tstore_registers_arm()\r\n\tload_registers_thumb()\r\n\tbx lr\r\n\r\nto_arm_handler:\r\n\tldr r1, [reg_base, #REG_CPSR]\r\n\tbic r1, r1, #0x20\r\n\tstr r1, [reg_base, #REG_CPSR]\r\n\tstore_registers_thumb()\r\n\tload_registers_arm()\r\n\tbx lr\r\n\r\n#define sign_extend_u8(reg)\r\n#define sign_extend_u16(reg)\r\n#define sign_extend_u32(reg)\r\n\r\n#define sign_extend_s8(reg)                                                  ;\\\r\n  mov reg, reg, lsl #24                   /* shift reg into upper 8bits    */;\\\r\n  mov reg, reg, asr #24                   /* shift down, sign extending    */;\\\r\n\r\n#define sign_extend_s16(reg)                                                 ;\\\r\n  mov reg, reg, lsl #16                   /* shift reg into upper 16bits   */;\\\r\n  mov reg, reg, asr #16                   /* shift down, sign extending    */;\\\r\n\r\n#define execute_load_op_u8(load_op)                                          ;\\\r\n  mov r0, r0, lsl #17                                                        ;\\\r\n  load_op r0, [r2, r0, lsr #17]                                              ;\\\r\n\r\n#define execute_load_op_s8(load_op)                                          ;\\\r\n  mov r0, r0, lsl #17                                                        ;\\\r\n  mov r0, r0, lsr #17                                                        ;\\\r\n  load_op r0, [r2, r0]                                                       ;\\\r\n\r\n#define execute_load_op_u16(load_op)                                         ;\\\r\n  execute_load_op_s8(load_op)                                                ;\\\r\n\r\n#define execute_load_op_s16(load_op)                                         ;\\\r\n  execute_load_op_s8(load_op)                                                ;\\\r\n\r\n#define execute_load_op_u16(load_op)                                         ;\\\r\n  execute_load_op_s8(load_op)                                                ;\\\r\n\r\n#define execute_load_op_u32(load_op)                                         ;\\\r\n  execute_load_op_u8(load_op)                                                ;\\\r\n\r\n\r\n#define execute_load_builder(load_type, load_function, load_op, mask)        ;\\\r\n                                                                             ;\\\r\nexecute_load_##load_type:                                                    ;\\\r\n  save_flags()                                                               ;\\\r\n  mov r2, r0 ;\\\r\n  call_c_function(read##load_function##_cycles) ;\\\r\n  add reg_cycles, reg_cycles, r0 ;\\\r\n  mov r0, r2 ;\\\r\n  call_c_function(ds_read##load_function)    /*CHANGE*/                            ;\\\r\n  sign_extend_##load_type(r0)             /* sign extend result            */;\\\r\n  restore_flags()                                                            ;\\\r\n  add pc, lr, #4                          /* return                        */;\\\r\n\r\n\r\nexecute_load_builder(u8, 8, ldrneb, #0xF0000000)\r\nexecute_load_builder(s8, 8, ldrnesb, #0xF0000000)\r\n//execute_load_builder(u16, 16, ldrneh, #0xF0000001)\r\n\r\n\r\nexecute_load_builder(s16, 16, ldrnesh, #0xF0000001)\r\nexecute_load_u16:\r\n  save_flags()\r\n  mov r2, r0\r\n  call_c_function(read16_cycles)\r\n  add reg_cycles, reg_cycles, r0\r\n  mov r0, r2\r\n  call_c_function(ds_read16)    /*CHANGE*/\r\n  sign_extend_u16(r0)             /* sign extend result            */\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return                        */\r\n\r\n\r\n//execute_load_builder(u32, 32, ldrne, #0xF0000000)\r\n\r\nexecute_load_u32:\r\n  save_flags()\r\n  mov r2, r0\r\n  //call_c_function(read32_cycles)\r\n  add reg_cycles, reg_cycles, #4\r\n  //mov r0, r2\r\n  call_c_function(ds_read32)    /*CHANGE*/\r\n  sign_extend_u32(r0)             /* sign extend result            */\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return                        */\r\n\r\n\r\narm_mcr_asm:\r\n  ldr r0, [lr]\r\n  save_flags()\r\n  store_registers_arm()\r\n  call_c_function(arm_mcr)\r\n  load_registers_arm()\r\n  ldr r0, [reg_base, #CHANGED_PC_STATUS]\r\n  cmp r0, #0\r\n  beq 1f\r\n\r\n  mov r0, #0\r\n  str r0, [reg_base, #CHANGED_PC_STATUS]\r\n  extract_flags()\r\n  b arm_update_gba_idle_arm\r\n1:\r\n  extract_flags()\r\n  add pc, lr, #4\r\n\r\narm_mrc_asm:\r\n  ldr r0, [lr]\r\n  save_flags()\r\n  collapse_flags(r2)\r\n  store_registers_arm()\r\n  call_c_function(arm_mrc)\r\n  load_registers_arm()\r\n  extract_flags()\r\n  add pc, lr, #4\r\n\r\nswitch_user:\r\n  save_flags()\r\n  collapse_flags(r2)\r\n  store_registers_arm()\r\n  call_c_function(switch_user_arm)\r\n  load_registers_arm()\r\n  extract_flags()\r\n  bx lr\r\n\r\nswitch_back:\r\nsave_flags()\r\n  collapse_flags(r2)\r\n  store_registers_arm()\r\n  call_c_function(switch_back_arm)\r\n  load_registers_arm()\r\n  restore_flags()\r\n  bx lr\r\n\r\n#define save_reg_scratch(reg)                                                 ;\\\r\n  ldr r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4))]                          ;\\\r\n  str r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4) + 128)]                    ;\\\r\n\r\n#define restore_reg_scratch(reg)                                              ;\\\r\n  ldr r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4) + 128)]                    ;\\\r\n  str r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4))]                          ;\\\r\n\r\n#define scratch_regs_thumb(type)                                              ;\\\r\n  type##_reg_scratch(0)                                                       ;\\\r\n  type##_reg_scratch(1)                                                       ;\\\r\n  type##_reg_scratch(2)                                                       ;\\\r\n  type##_reg_scratch(3)                                                       ;\\\r\n  type##_reg_scratch(4)                                                       ;\\\r\n  type##_reg_scratch(5)                                                       ;\\\r\n\r\n#define scratch_regs_arm(type)                                                ;\\\r\n  type##_reg_scratch(0)                                                       ;\\\r\n  type##_reg_scratch(1)                                                       ;\\\r\n  type##_reg_scratch(6)                                                       ;\\\r\n  type##_reg_scratch(9)                                                       ;\\\r\n  type##_reg_scratch(12)                                                      ;\\\r\n  type##_reg_scratch(14)                                                      ;\\\r\n\r\n\r\nstep_debug_arm:\r\n  save_flags()\r\n  collapse_flags(r0)\r\n\r\n  ldr r0, [reg_base, #REG_CPSR]           @ r1 = cpsr\r\n  tst r0, #0x20                           @ see if Thumb bit is set\r\n\r\n  ldr r0, [lr]                            @ load PC\r\n  mvn r1, reg_cycles                      @ load cycle counter\r\n\r\n  beq 1f                                  @ if not goto ARM mode\r\n\r\n  scratch_regs_thumb(save)\r\n\r\n  store_registers_thumb()                 @ write back Thumb regs\r\n  call_c_function(step_debug)             @ call debug step\r\n  scratch_regs_thumb(restore)\r\n  restore_flags()\r\n  add pc, lr, #4                          @ return\r\n\r\n1:\r\n  scratch_regs_arm(save)\r\n  store_registers_arm()                   @ write back ARM regs\r\n  call_c_function(step_debug)             @ call debug step\r\n  scratch_regs_arm(restore)\r\n  restore_flags()\r\n  add pc, lr, #4                          @ return, skipping PC\r\n\r\n.pool\r\n\r\n.comm memory_map_read 0x8000\r\n.comm memory_map_write 0x8000\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/arm_stub_old.S",
    "content": ".align 2\r\n\r\n.extern block_lookup_address_arm\r\n.extern block_lookup_address_thumb\r\n.extern execute_store_cpsr_body\r\n.extern execute_swi_hle_div_c\r\n.extern move_reg\r\n.extern ds_write8\r\n.extern ds_write16\r\n.extern ds_write32\r\n.extern ds_read8\r\n.extern ds_read16\r\n.extern ds_read32\r\n.extern NDS_update_dynarec\r\n.extern update_dynarec\r\n.extern logmeow\r\n.extern arm_mrc\r\n.extern arm_mcr\r\n.extern switch_user_arm\r\n.extern switch_back_arm\r\n\r\n.global switch_user\r\n.global switch_back\r\n\r\n.global arm_update_gba_arm\r\n.global arm_update_gba_thumb\r\n.global arm_update_gba_to_arm\r\n.global arm_update_gba_to_thumb\r\n.global arm_update_gba_idle_arm\r\n.global arm_update_gba_idle_thumb\r\n.global arm_update_gba_idle_to_arm\r\n.global arm_update_gba_idle_to_thumb\r\n\r\n.global arm_indirect_branch_arm\r\n.global arm_indirect_branch_thumb\r\n.global arm_indirect_branch\r\n.global arm_indirect_branch_dual_arm\r\n.global arm_indirect_branch_dual_thumb\r\n.global arm_indirect_branch_to_arm\r\n\r\n.global execute_arm_translate\r\n\r\n.global execute_store_u8\r\n.global execute_store_u16\r\n.global execute_store_u32\r\n.global execute_store_u32_safe\r\n\r\n.global execute_load_u8\r\n.global execute_load_s8\r\n.global execute_load_u16\r\n.global execute_load_s16\r\n.global execute_load_u32\r\n\r\n.global execute_store_cpsr\r\n.global execute_read_spsr\r\n.global execute_store_spsr\r\n.global execute_spsr_restore\r\n\r\n.global execute_swi_arm\r\n.global execute_swi_thumb\r\n\r\n.global execute_patch_bios_read\r\n.global execute_patch_bios_protect\r\n\r\n.global execute_bios_ptr_protected\r\n.global execute_bios_rom_ptr\r\n\r\n.global arm_mrc_asm\r\n.global arm_mcr_asm\r\n\r\n.global step_debug_arm\r\n\r\n.global invalidate_icache_region\r\n.global invalidate_cache_region\r\n\r\n.global memory_map_read\r\n.global memory_map_write\r\n.global reg\r\n\r\n#define REG_BASE_OFFSET   1024\r\n\r\n#define REG_R0            (REG_BASE_OFFSET + (0 * 4))\r\n#define REG_R1            (REG_BASE_OFFSET + (1 * 4))\r\n#define REG_R2            (REG_BASE_OFFSET + (2 * 4))\r\n#define REG_R3            (REG_BASE_OFFSET + (3 * 4))\r\n#define REG_R4            (REG_BASE_OFFSET + (4 * 4))\r\n#define REG_R5            (REG_BASE_OFFSET + (5 * 4))\r\n#define REG_R6            (REG_BASE_OFFSET + (6 * 4))\r\n#define REG_R7            (REG_BASE_OFFSET + (7 * 4))\r\n#define REG_R8            (REG_BASE_OFFSET + (8 * 4))\r\n#define REG_R9            (REG_BASE_OFFSET + (9 * 4))\r\n#define REG_R10           (REG_BASE_OFFSET + (10 * 4))\r\n#define REG_R11           (REG_BASE_OFFSET + (11 * 4))\r\n#define REG_R12           (REG_BASE_OFFSET + (12 * 4))\r\n#define REG_R13           (REG_BASE_OFFSET + (13 * 4))\r\n#define REG_R14           (REG_BASE_OFFSET + (14 * 4))\r\n#define REG_SP            (REG_BASE_OFFSET + (13 * 4))\r\n#define REG_LR            (REG_BASE_OFFSET + (14 * 4))\r\n#define REG_PC            (REG_BASE_OFFSET + (15 * 4))\r\n\r\n#define REG_CPSR          (REG_BASE_OFFSET + (20 * 4))\r\n\r\n#define REG_SAVE          (REG_BASE_OFFSET + (21 * 4))\r\n#define REG_SAVE2         (REG_BASE_OFFSET + (22 * 4))\r\n#define REG_SAVE3         (REG_BASE_OFFSET + (23 * 4))\r\n\r\n#define CPU_MODE          (REG_BASE_OFFSET + (29 * 4))\r\n#define CPU_HALT_STATE    (REG_BASE_OFFSET + (30 * 4))\r\n#define CHANGED_PC_STATUS (REG_BASE_OFFSET + (31 * 4))\r\n\r\n\r\n#define reg_a0            r0\r\n#define reg_a1            r1\r\n#define reg_a2            r2\r\n\r\n#define reg_s0            r9\r\n#define reg_base          sp\r\n#define reg_flags         r11\r\n\r\n#define reg_cycles        r12\r\n\r\n#define reg_x0            r3\r\n#define reg_x1            r4\r\n#define reg_x2            r5\r\n#define reg_x3            r6\r\n#define reg_x4            r7\r\n#define reg_x5            r8\r\n\r\n\r\n#define MODE_SUPERVISOR   3\r\n\r\n#ifdef __ARM_ARCH_7A__\r\n  #define extract_u16(rd, rs) \\\r\n    uxth rd, rs\r\n#else\r\n  #define extract_u16(rd, rs) \\\r\n    bic  rd, rs, #0xff000000 ;\\\r\n    bic  rd, rd, #0x00ff0000\r\n#endif\r\n\r\n@ Will load the register set from memory into the appropriate cached registers.\r\n@ See arm_emit.h for listing explanation.\r\n\r\n#define load_registers_arm()                                                 ;\\\r\n  ldr reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  ldr reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  ldr reg_x2, [reg_base, #REG_R6]                                            ;\\\r\n  ldr reg_x3, [reg_base, #REG_R9]                                            ;\\\r\n  ldr reg_x4, [reg_base, #REG_R12]                                           ;\\\r\n  ldr reg_x5, [reg_base, #REG_R14]                                           ;\\\r\n\r\n#define load_registers_thumb()                                               ;\\\r\n  ldr reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  ldr reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  ldr reg_x2, [reg_base, #REG_R2]                                            ;\\\r\n  ldr reg_x3, [reg_base, #REG_R3]                                            ;\\\r\n  ldr reg_x4, [reg_base, #REG_R4]                                            ;\\\r\n  ldr reg_x5, [reg_base, #REG_R5]                                            ;\\\r\n\r\n\r\n@ Will store the register set from cached registers back to memory.\r\n\r\n#define store_registers_arm()                                                ;\\\r\n  str reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  str reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  str reg_x2, [reg_base, #REG_R6]                                            ;\\\r\n  str reg_x3, [reg_base, #REG_R9]                                            ;\\\r\n  str reg_x4, [reg_base, #REG_R12]                                           ;\\\r\n  str reg_x5, [reg_base, #REG_R14]                                           ;\\\r\n\r\n#define store_registers_thumb()                                              ;\\\r\n  str reg_x0, [reg_base, #REG_R0]                                            ;\\\r\n  str reg_x1, [reg_base, #REG_R1]                                            ;\\\r\n  str reg_x2, [reg_base, #REG_R2]                                            ;\\\r\n  str reg_x3, [reg_base, #REG_R3]                                            ;\\\r\n  str reg_x4, [reg_base, #REG_R4]                                            ;\\\r\n  str reg_x5, [reg_base, #REG_R5]                                            ;\\\r\n\r\n\r\n@ Returns an updated persistent cpsr with the cached flags register.\r\n@ Uses reg as a temporary register and returns the CPSR here.\r\n\r\n#define collapse_flags_no_update(reg)                                        ;\\\r\n  ldr reg, [reg_base, #REG_CPSR]          /* reg = cpsr                    */;\\\r\n  bic reg, reg, #0xF0000000               /* clear ALU flags in cpsr       */;\\\r\n  and reg_flags, reg_flags, #0xF0000000   /* clear non-ALU flags           */;\\\r\n  orr reg, reg, reg_flags                 /* update cpsr with ALU flags    */;\\\r\n\r\n@ Updates cpsr using the above macro.\r\n\r\n#define collapse_flags(reg)                                                  ;\\\r\n  collapse_flags_no_update(reg)                                              ;\\\r\n  str reg, [reg_base, #REG_CPSR]                                             ;\\\r\n\r\n@ Loads the saved flags register from the persistent cpsr.\r\n\r\n#define extract_flags()                                                      ;\\\r\n  ldr reg_flags, [reg_base, #REG_CPSR]                                       ;\\\r\n  msr cpsr_f, reg_flags                                                      ;\\\r\n\r\n\r\n#define save_flags()                                                         ;\\\r\n  mrs reg_flags, cpsr                                                        ;\\\r\n\r\n#define restore_flags()                                                      ;\\\r\n  msr cpsr_f, reg_flags                                                      ;\\\r\n\r\n#ifdef __ARM_EABI__\r\n  @ must align stack\r\n  #define call_c_saved_regs r2, r3, r12, lr\r\n#else\r\n  #define call_c_saved_regs r3, r12, lr\r\n#endif\r\n\r\n@ Calls a C function - all caller save registers which are important to the\r\n@ dynarec and to returning from this function are saved.\r\n\r\n#define call_c_function(function)                                            ;\\\r\n  stmdb sp!, { call_c_saved_regs }                                           ;\\\r\n  bl function                                                                ;\\\r\n  ldmia sp!, { call_c_saved_regs }                                           ;\\\r\n\r\n\r\n@ Update the GBA hardware (video, sound, input, etc)\r\n\r\n@ Input:\r\n@ r0: current PC\r\n\r\n#define return_straight()                                                    ;\\\r\n  bx lr                                                                      ;\\\r\n\r\n#define return_add()                                                         ;\\\r\n  add pc, lr, #4                                                             ;\\\r\n\r\n#define load_pc_straight()                                                   ;\\\r\n  ldr r0, [lr, #-8]                                                          ;\\\r\n\r\n#define load_pc_add()                                                        ;\\\r\n  ldr r0, [lr]                                                               ;\\\r\n\r\n\r\n#define arm_update_gba_builder(name, mode, return_op)                        ;\\\r\n                                                                             ;\\\r\narm_update_gba_##name:                                                       ;\\\r\n  load_pc_##return_op()                                                      ;\\\r\n  str r0, [reg_base, #REG_PC]             /* write out the PC              */;\\\r\n                                                                             ;\\\r\n  save_flags()                                                               ;\\\r\n  collapse_flags(r0)                      /* update the flags              */;\\\r\n                                                                             ;\\\r\n  store_registers_##mode()                /* save out registers            */;\\\r\n  mov r0, reg_cycles;\\\r\n  call_c_function(NDS_update_dynarec)    /*          update GBA state              */;\\\r\n                                                                             ;\\\r\n  mvn reg_cycles, r0                      /* load new cycle count          */;\\\r\n                                                                             ;\\\r\n  ldr r0, [reg_base, #CHANGED_PC_STATUS]  /* load PC changed status        */;\\\r\n  cmp r0, #0                              /* see if PC has changed         */;\\\r\n  beq 1f                                  /* if not return                 */;\\\r\n  mov r1, #0;\\\r\n  str r1, [reg_base, #CHANGED_PC_STATUS];\\\r\n                                                                             ;\\\r\n  ldr r0, [reg_base, #REG_PC]             /* load new PC                   */;\\\r\n  ldr r1, [reg_base, #REG_CPSR]           /* r1 = flags                    */;\\\r\n  tst r1, #0x20                           /* see if Thumb bit is set       */;\\\r\n  bne 2f                                  /* if so load Thumb PC           */;\\\r\n                                                                             ;\\\r\n  load_registers_arm()                    /* load ARM regs                 */;\\\r\n  call_c_function(block_lookup_address_arm)                                  ;\\\r\n  restore_flags()                                                            ;\\\r\n  bx r0                                   /* jump to new ARM block         */;\\\r\n                                                                             ;\\\r\n1:                                                                           ;\\\r\n  load_registers_##mode()                 /* reload registers              */;\\\r\n  restore_flags()                                                            ;\\\r\n  return_##return_op()                                                       ;\\\r\n                                                                             ;\\\r\n2:                                                                           ;\\\r\n  load_registers_thumb()                  /* load Thumb regs               */;\\\r\n  call_c_function(block_lookup_address_thumb)                                ;\\\r\n  restore_flags()                                                            ;\\\r\n  bx r0                                   /* jump to new ARM block         */;\\\r\n\r\n\r\narm_update_gba_builder(arm, arm, straight)\r\n\r\narm_update_gba_builder(thumb, thumb, straight)\r\n\r\narm_update_gba_builder(idle_arm, arm, add)\r\narm_update_gba_builder(idle_thumb, thumb, add)\r\n\r\narm_update_gba_to_arm:\r\n  load_pc_straight()\r\n  str r0, [reg_base, #REG_PC]             /* write out the PC              */\r\n\r\n  save_flags()\r\n  collapse_flags(r0)                      /* update the flags              */\r\n\r\n  store_registers_thumb()                /* save out registers            */\r\n  mov r0, reg_cycles\r\n  call_c_function(NDS_update_dynarec)    /*          update GBA state              */\r\n\r\n  mvn reg_cycles, r0                      /* load new cycle count          */\r\n\r\n  ldr r0, [reg_base, #REG_PC]             /* load PC                   */\r\n  ldr r1, [reg_base, #REG_CPSR]           /* r1 = flags                    */\r\n  bic r1, r1, #0x20 /*sets to ARM mode*/\r\n\r\n  load_registers_arm()                  /* load ARM regs               */\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  bic r1, r1, #0x20                       @ clear Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   /* jump to new ARM block         */\r\n\r\narm_update_gba_idle_to_arm:\r\n  load_pc_add()\r\n  str r0, [reg_base, #REG_PC]             /* write out the PC              */\r\n\r\n  save_flags()\r\n  collapse_flags(r0)                      /* update the flags              */\r\n\r\n  store_registers_thumb()                /* save out registers            */\r\n  mov r0, reg_cycles\r\n  call_c_function(NDS_update_dynarec)    /*          update GBA state              */\r\n\r\n  mvn reg_cycles, r0                      /* load new cycle count          */\r\n\r\n  ldr r0, [reg_base, #REG_PC]             /* load PC                   */\r\n  ldr r1, [reg_base, #REG_CPSR]           /* r1 = flags                    */\r\n  bic r1, r1, #0x20 /*sets to ARM mode*/\r\n\r\n  load_registers_arm()                  /* load ARM regs               */\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  bic r1, r1, #0x20                       @ clear Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   /* jump to new ARM block         */\r\n\r\narm_update_gba_to_thumb:\r\n  load_pc_straight()\r\n  str r0, [reg_base, #REG_PC]             /* write out the PC              */\r\n\r\n  save_flags()\r\n  collapse_flags(r0)                      /* update the flags              */\r\n\r\n  store_registers_arm()                /* save out registers            */\r\n  mov r0, reg_cycles\r\n  call_c_function(NDS_update_dynarec)    /*          update GBA state              */\r\n\r\n  mvn reg_cycles, r0                      /* load new cycle count          */\r\n\r\nldr r0, [reg_base, #REG_PC]             /* load PC                   */\r\n  load_registers_thumb()                  /* load ARM regs               */\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  orr r1, r1, #0x20                       @ set Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   /* jump to new thumb block         */\r\n\r\narm_update_gba_idle_to_thumb:\r\n  load_pc_add()\r\n  str r0, [reg_base, #REG_PC]             /* write out the PC              */\r\n\r\n  save_flags()\r\n  collapse_flags(r0)                      /* update the flags              */\r\n\r\n  store_registers_arm()                /* save out registers            */\r\n  mov r0, reg_cycles\r\n  call_c_function(NDS_update_dynarec)    /*          update GBA state              */\r\n\r\n  mvn reg_cycles, r0                      /* load new cycle count          */\r\nldr r0, [reg_base, #REG_PC]             /* load PC                   */\r\n  load_registers_thumb()                  /* load ARM regs               */\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  orr r1, r1, #0x20                       @ set Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   /* jump to new thumb block         */\r\n\r\n@ These are b stubs for performing indirect branches. They are not\r\n@ linked to and don't return, instead they link elsewhere.\r\n\r\n@ Input:\r\n@ r0: PC to branch to\r\n\r\narm_indirect_branch_arm:\r\n  save_flags()\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0\r\n\r\narm_indirect_branch_thumb:\r\n  save_flags()\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0\r\n\r\narm_indirect_branch_dual_arm:\r\n  save_flags()\r\n  tst r0, #0x01                           @ check lower bit\r\n  bne 1f                                  @ if set going to Thumb mode\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\n1:\r\n  bic r0, r0, #0x01\r\n  store_registers_arm()                   @ save out ARM registers\r\n  load_registers_thumb()                  @ load in Thumb registers\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  orr r1, r1, #0x20                       @ set Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\narm_indirect_branch_dual_thumb:\r\n  save_flags()\r\n  tst r0, #0x01                           @ check lower bit\r\n  beq 1f                                  @ if set going to ARM mode\r\n  bic r0, r0, #0x01\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\n1:\r\n  store_registers_thumb()                 @ save out Thumb registers\r\n  load_registers_arm()                    @ load in ARM registers\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  bic r1, r1, #0x20                       @ clear Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\narm_indirect_branch_to_arm:\r\n  save_flags()\r\n  store_registers_thumb()                 @ save out Thumb registers\r\n  load_registers_arm()                    @ load in ARM registers\r\n  ldr r1, [reg_base, #REG_CPSR]           @ load cpsr\r\n  bic r1, r1, #0x20                       @ clear Thumb mode\r\n  str r1, [reg_base, #REG_CPSR]           @ store flags\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ return\r\n\r\n\r\n@ Update the cpsr.\r\n\r\n@ Input:\r\n@ r0: new cpsr value\r\n@ r1: bitmask of which bits in cpsr to update\r\n@ r2: current PC\r\n\r\nexecute_store_cpsr:\r\n  save_flags()\r\n  and reg_flags, r0, r1                   @ reg_flags = new_cpsr & store_mask\r\n  ldr r0, [reg_base, #REG_CPSR]           @ r0 = cpsr\r\n  bic r0, r0, r1                          @ r0 = cpsr & ~store_mask\r\n  orr reg_flags, reg_flags, r0            @ reg_flags = new_cpsr | cpsr\r\n\r\n  mov r0, reg_flags                       @ also put new cpsr in r0\r\n\r\n  store_registers_arm()                   @ save ARM registers\r\n  ldr r2, [lr]                            @ r2 = pc\r\n  call_c_function(execute_store_cpsr_body)\r\n  load_registers_arm()                    @ restore ARM registers\r\n\r\n  cmp r0, #0                              @ check new PC\r\n  beq 1f                                  @ if it's zero, return\r\n\r\n  call_c_function(block_lookup_address_arm)\r\n\r\n  restore_flags()\r\n  bx r0                                   @ return to new ARM address\r\n\r\n1:\r\n  restore_flags()\r\n  add pc, lr, #4                          @ return\r\n\r\n\r\n@ Update the current spsr.\r\n\r\n@ Input:\r\n@ r0: new cpsr value\r\n@ r1: bitmask of which bits in spsr to update\r\n\r\nexecute_store_spsr:\r\n  ldr r1, =spsr                           @ r1 = spsr\r\n  ldr r2, [reg_base, #CPU_MODE]           @ r2 = CPU_MODE\r\n  str r0, [r1, r2, lsl #2]                @ spsr[CPU_MODE] = new_spsr\r\n  bx lr\r\n\r\n@ Read the current spsr.\r\n\r\n@ Output:\r\n@ r0: spsr\r\n\r\nexecute_read_spsr:\r\n  ldr r0, =spsr                           @ r0 = spsr\r\n  ldr r1, [reg_base, #CPU_MODE]           @ r1 = CPU_MODE\r\n  ldr r0, [r0, r1, lsl #2]                @ r0 = spsr[CPU_MODE]\r\n  bx lr                                   @ return\r\n\r\n\r\n@ Restore the cpsr from the mode spsr and mode shift.\r\n\r\n@ Input:\r\n@ r0: current pc\r\n\r\nexecute_spsr_restore:\r\n  save_flags()\r\n  ldr r1, =spsr                           @ r1 = spsr\r\n  ldr r2, [reg_base, #CPU_MODE]           @ r2 = cpu_mode\r\n  ldr r1, [r1, r2, lsl #2]                @ r1 = spsr[cpu_mode] (new cpsr)\r\n  str r1, [reg_base, #REG_CPSR]           @ update cpsr\r\n  mov reg_flags, r1                       @ also, update shadow flags\r\n\r\n  @ This function call will pass r0 (address) and return it.\r\n  store_registers_arm()                   @ save ARM registers\r\n  call_c_function(execute_spsr_restore_body)\r\n\r\n  ldr r1, [reg_base, #REG_CPSR]           @ r1 = cpsr\r\n  tst r1, #0x20                           @ see if Thumb mode is set\r\n  bne 2f                                  @ if so handle it\r\n\r\n  load_registers_arm()                    @ restore ARM registers\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0\r\n\r\n2:\r\n  load_registers_thumb()                  @ load Thumb registers\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0\r\n\r\n\r\n\r\n@ Setup the mode transition work for calling an SWI.\r\n\r\n@ Input:\r\n@ r0: current pc\r\n\r\n#define execute_swi_builder(mode)                                            ;\\\r\n                                                                             ;\\\r\nexecute_swi_##mode:                                                          ;\\\r\nldr r0, [lr] ;\\\r\n  save_flags()                                                               ;\\\r\n  store_registers_##mode()                                                   ;\\\r\n  call_c_function(mode##_swi_exec)                        ;\\\r\n  load_registers_##mode()                                                    ;\\\r\n  restore_flags()                                                            ;\\\r\n add pc, lr, #4                                                                     ;\\\r\n\r\nexecute_swi_builder(arm)\r\n\r\n\r\nexecute_swi_thumb:\r\nldr r0, [lr]\r\n  save_flags()\r\n  store_registers_thumb()\r\n  call_c_function(thumb_swi_exec)\r\n  load_registers_thumb()\r\n  restore_flags()\r\n add pc, lr, #4\r\n\r\n\r\n//execute_swi_builder(thumb)\r\n\r\n\r\n@ Wrapper for calling SWI functions in C (or can implement some in ASM if\r\n@ desired)\r\n\r\n#define execute_swi_function_builder(swi_function, mode)                     ;\\\r\n                                                                             ;\\\r\n  .global execute_swi_hle_##swi_function##_##mode                            ;\\\r\nexecute_swi_hle_##swi_function##_##mode:                                     ;\\\r\n  save_flags()                                                               ;\\\r\n  store_registers_##mode()                                                   ;\\\r\n  call_c_function(execute_swi_hle_##swi_function##_c)                        ;\\\r\n  load_registers_##mode()                                                    ;\\\r\n  restore_flags()                                                            ;\\\r\n  bx lr                                                                      ;\\\r\n\r\nexecute_swi_function_builder(div, arm)\r\nexecute_swi_function_builder(div, thumb)\r\n\r\n\r\n@ Start program execution. Normally the mode should be Thumb and the\r\n@ PC should be 0x8000000, however if a save state is preloaded this\r\n@ will be different.\r\n\r\n@ Input:\r\n@ r0: initial value for cycle counter\r\n\r\n@ Uses sp as reg_base; must hold consistently true.\r\n\r\nexecute_arm_translate:\r\n  sub sp, sp, #0x100                      @ allocate room for register data\r\n\r\n  mvn reg_cycles, r0                      @ load cycle counter\r\n\r\n  mov r0, reg_base                        @ load reg_base into first param\r\n  call_c_function(move_reg)               @ make reg_base the new reg ptr\r\n  call_c_function(update_dynarec)\r\n\r\n  sub sp, sp, #REG_BASE_OFFSET            @ allocate room for ptr table\r\n  //bl load_ptr_read_function_table         @ load read function ptr table\r\n\r\n  ldr r0, [reg_base, #REG_PC]             @ r0 = current pc\r\n  ldr r1, [reg_base, #REG_CPSR]           @ r1 = flags\r\n  tst r1, #0x20                           @ see if Thumb bit is set\r\n\r\n  bne 1f                                  @ if so lookup thumb\r\n\r\n  load_registers_arm()                    @ load ARM registers\r\n  call_c_function(block_lookup_address_arm)\r\n  extract_flags()                         @ load flags\r\n  bx r0                                 @ jump to first ARM block\r\n1:\r\n  load_registers_thumb()                  @ load Thumb registers\r\n  call_c_function(block_lookup_address_thumb)\r\n  extract_flags()                         @ load flags\r\n  bx r0                                   @ jump to first Thumb block\r\n@ Write out to memory.\r\n\r\n@ Input:\r\n@ r0: address\r\n@ r1: value\r\n@ r2: current pc\r\n\r\n#define execute_store_body(store_type, store_op)                             ;\\\r\n  save_flags()                                                               ;\\\r\n  stmdb sp!, { lr }                       /* save lr                       */;\\\r\n  tst r0, #0xF0000000                     /* make sure address is in range */;\\\r\n  bne ext_store_u##store_type             /* if not do ext store           */;\\\r\n                                                                             ;\\\r\n  ldr r2, =memory_map_write               /* r2 = memory_map_write         */;\\\r\n  mov lr, r0, lsr #15                     /* lr = page index of address    */;\\\r\n  ldr r2, [r2, lr, lsl #2]                /* r2 = memory page              */;\\\r\n                                                                             ;\\\r\n  cmp r2, #0                              /* see if map is ext             */;\\\r\n  beq ext_store_u##store_type             /* if so do ext store            */;\\\r\n                                                                             ;\\\r\n  mov r0, r0, lsl #17                     /* isolate bottom 15 bits in top */;\\\r\n  mov r0, r0, lsr #17                     /* like performing and 0x7FFF    */;\\\r\n  store_op r1, [r2, r0]                   /* store result                  */;\\\r\n\r\n\r\n#define store_align_8()                                                      ;\\\r\n  and r1, r1, #0xff                                                          ;\\\r\n\r\n#define store_align_16()                                                     ;\\\r\n  bic r0, r0, #0x01                                                          ;\\\r\n  extract_u16(r1, r1)                                                        ;\\\r\n\r\n#define store_align_32()                                                     ;\\\r\n  bic r0, r0, #0x03                                                          ;\\\r\n\r\n\r\n#define execute_store_builder(store_type, store_op, load_op)                 ;\\\r\n                                                                             ;\\\r\nexecute_store_u##store_type:                                                 ;\\\r\n  save_flags()                                                               ;\\\r\n  call_c_function(ds_write##store_type)                                  ;\\\r\n  restore_flags();\\\r\n  add pc, lr, #4                          /* return*/ ;\\\r\next_store_u##store_type:                                                     ;\\\r\n  call_c_function(ds_write##store_type)                                  ;\\\r\n  restore_flags();\\\r\n  add pc, lr, #4                          /* return*/ ;\\\r\n\r\nexecute_store_builder(8, strb, ldrb)\r\nexecute_store_builder(16, strh, ldrh)\r\n//execute_store_builder(32, str, ldr)\r\n\r\nexecute_store_u32:\r\n  save_flags()\r\n  call_c_function(ds_write32)\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return*/\r\n\r\nexecute_store_u32_safe:\r\n  save_flags()\r\n  call_c_function(ds_write32)\r\n  restore_flags()\r\n  bx lr                                    @ Return\r\n\r\next_store_u32_safe:\r\n  ldmia sp!, { lr }                       @ Restore lr\r\n  call_c_function(ds_write32)         @ Perform 32bit store\r\n  restore_flags()\r\n  bx lr                                   @ Return\r\n\r\nsmc_write:\r\n  call_c_function(flush_translation_cache_ram)\r\n\r\nlookup_pc:\r\n  ldr r0, [reg_base, #REG_PC]             @ r0 = new pc\r\n  ldr r1, [reg_base, #REG_CPSR]           @ r1 = flags\r\n  tst r1, #0x20                           @ see if Thumb bit is set\r\n  beq lookup_pc_arm                       @ if not lookup ARM\r\n\r\nlookup_pc_thumb:\r\n  call_c_function(block_lookup_address_thumb)\r\n  restore_flags()\r\n  bx r0                                   @ jump to new Thumb block\r\n\r\nlookup_pc_arm:\r\n  call_c_function(block_lookup_address_arm)\r\n  restore_flags()\r\n  bx r0                                   @ jump to new ARM block\r\n\r\n\r\n#define sign_extend_u8(reg)\r\n#define sign_extend_u16(reg)\r\n#define sign_extend_u32(reg)\r\n\r\n#define sign_extend_s8(reg)                                                  ;\\\r\n  mov reg, reg, lsl #24                   /* shift reg into upper 8bits    */;\\\r\n  mov reg, reg, asr #24                   /* shift down, sign extending    */;\\\r\n\r\n#define sign_extend_s16(reg)                                                 ;\\\r\n  mov reg, reg, lsl #16                   /* shift reg into upper 16bits   */;\\\r\n  mov reg, reg, asr #16                   /* shift down, sign extending    */;\\\r\n\r\n#define execute_load_op_u8(load_op)                                          ;\\\r\n  mov r0, r0, lsl #17                                                        ;\\\r\n  load_op r0, [r2, r0, lsr #17]                                              ;\\\r\n\r\n#define execute_load_op_s8(load_op)                                          ;\\\r\n  mov r0, r0, lsl #17                                                        ;\\\r\n  mov r0, r0, lsr #17                                                        ;\\\r\n  load_op r0, [r2, r0]                                                       ;\\\r\n\r\n#define execute_load_op_u16(load_op)                                         ;\\\r\n  execute_load_op_s8(load_op)                                                ;\\\r\n\r\n#define execute_load_op_s16(load_op)                                         ;\\\r\n  execute_load_op_s8(load_op)                                                ;\\\r\n\r\n#define execute_load_op_u16(load_op)                                         ;\\\r\n  execute_load_op_s8(load_op)                                                ;\\\r\n\r\n#define execute_load_op_u32(load_op)                                         ;\\\r\n  execute_load_op_u8(load_op)                                                ;\\\r\n\r\n\r\n#define execute_load_builder(load_type, load_function, load_op, mask)        ;\\\r\n                                                                             ;\\\r\nexecute_load_##load_type:                                                    ;\\\r\n  save_flags()                                                               ;\\\r\n  call_c_function(ds_read##load_function)    /*CHANGE*/                            ;\\\r\n  sign_extend_##load_type(r0)             /* sign extend result            */;\\\r\n  restore_flags()                                                            ;\\\r\n  add pc, lr, #4                          /* return                        */;\\\r\n\r\n\r\nexecute_load_builder(u8, 8, ldrneb, #0xF0000000)\r\nexecute_load_builder(s8, 8, ldrnesb, #0xF0000000)\r\n//execute_load_builder(u16, 16, ldrneh, #0xF0000001)\r\n\r\n\r\nexecute_load_builder(s16, 16, ldrnesh, #0xF0000001)\r\nexecute_load_u16:\r\n  save_flags()\r\n  call_c_function(ds_read16)    /*CHANGE*/\r\n  sign_extend_u16(r0)             /* sign extend result            */\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return                        */\r\n\r\n\r\n//execute_load_builder(u32, 32, ldrne, #0xF0000000)\r\n\r\nexecute_load_u32:\r\n  save_flags()\r\n  call_c_function(ds_read32)    /*CHANGE*/\r\n  sign_extend_u32(r0)             /* sign extend result            */\r\n  restore_flags()\r\n  add pc, lr, #4                          /* return                        */\r\n\r\n\r\narm_mcr_asm:\r\n  ldr r0, [lr]\r\n  save_flags()\r\n  store_registers_arm()\r\n  call_c_function(arm_mcr)\r\n  load_registers_arm()\r\n  restore_flags()\r\n  add pc, lr, #4\r\n\r\narm_mrc_asm:\r\n  ldr r0, [lr]\r\n  save_flags()\r\n  store_registers_arm()\r\n  call_c_function(arm_mrc)\r\n  load_registers_arm()\r\n  restore_flags()\r\n  add pc, lr, #4\r\n\r\nswitch_user:\r\n  save_flags()\r\n  store_registers_arm()\r\n  call_c_function(switch_user_arm)\r\n  load_registers_arm()\r\n  restore_flags()\r\n  bx lr\r\n\r\nswitch_back:\r\nsave_flags()\r\n  store_registers_arm()\r\n  call_c_function(switch_back_arm)\r\n  load_registers_arm()\r\n  restore_flags()\r\n  bx lr\r\n\r\n#define save_reg_scratch(reg)                                                 ;\\\r\n  ldr r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4))]                          ;\\\r\n  str r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4) + 128)]                    ;\\\r\n\r\n#define restore_reg_scratch(reg)                                              ;\\\r\n  ldr r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4) + 128)]                    ;\\\r\n  str r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4))]                          ;\\\r\n\r\n#define scratch_regs_thumb(type)                                              ;\\\r\n  type##_reg_scratch(0)                                                       ;\\\r\n  type##_reg_scratch(1)                                                       ;\\\r\n  type##_reg_scratch(2)                                                       ;\\\r\n  type##_reg_scratch(3)                                                       ;\\\r\n  type##_reg_scratch(4)                                                       ;\\\r\n  type##_reg_scratch(5)                                                       ;\\\r\n\r\n#define scratch_regs_arm(type)                                                ;\\\r\n  type##_reg_scratch(0)                                                       ;\\\r\n  type##_reg_scratch(1)                                                       ;\\\r\n  type##_reg_scratch(6)                                                       ;\\\r\n  type##_reg_scratch(9)                                                       ;\\\r\n  type##_reg_scratch(12)                                                      ;\\\r\n  type##_reg_scratch(14)                                                      ;\\\r\n\r\n\r\nstep_debug_arm:\r\n  save_flags()\r\n  collapse_flags(r0)\r\n\r\n  ldr r0, [reg_base, #REG_CPSR]           @ r1 = cpsr\r\n  tst r0, #0x20                           @ see if Thumb bit is set\r\n\r\n  ldr r0, [lr]                            @ load PC\r\n  mvn r1, reg_cycles                      @ load cycle counter\r\n\r\n  beq 1f                                  @ if not goto ARM mode\r\n\r\n  scratch_regs_thumb(save)\r\n\r\n  store_registers_thumb()                 @ write back Thumb regs\r\n  call_c_function(step_debug)             @ call debug step\r\n  scratch_regs_thumb(restore)\r\n  restore_flags()\r\n  add pc, lr, #4                          @ return\r\n\r\n1:\r\n  scratch_regs_arm(save)\r\n  store_registers_arm()                   @ write back ARM regs\r\n  call_c_function(step_debug)             @ call debug step\r\n  scratch_regs_arm(restore)\r\n  restore_flags()\r\n  add pc, lr, #4                          @ return, skipping PC\r\n\r\n.pool\r\n\r\n.comm memory_map_read 0x8000\r\n.comm memory_map_write 0x8000\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/cpu.cpp",
    "content": "/* gameplaySP\n *\n * Copyright (C) 2006 Exophase <exophase@gmail.com>\n * Copyright (C) 2012 Qingping He\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License as\n * published by the Free Software Foundation; either version 2 of\n * the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n// Important todo:\n// - stm reglist writeback when base is in the list needs adjustment\n// - block memory needs psr swapping and user mode reg swapping\n\n#include \"dynarec/cpu.h\"\n#include \"dynarec_linker.h\"\n#include \"sys/mman.h\"\n#include \"errno.h\"\n#include \"android/log.h\"\n\nusing namespace Dynarec;\n\nextern \"C\"\n{\n\nu32 memory_region_access_read_u8[16];\nu32 memory_region_access_read_s8[16];\nu32 memory_region_access_read_u16[16];\nu32 memory_region_access_read_s16[16];\nu32 memory_region_access_read_u32[16];\nu32 memory_region_access_write_u8[16];\nu32 memory_region_access_write_u16[16];\nu32 memory_region_access_write_u32[16];\nu32 memory_reads_u8;\nu32 memory_reads_s8;\nu32 memory_reads_u16;\nu32 memory_reads_s16;\nu32 memory_reads_u32;\nu32 memory_writes_u8;\nu32 memory_writes_u16;\nu32 memory_writes_u32;\n\nconst u8 bit_count[256] =\n{\n  0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3,\n  4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4,\n  4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2,\n  3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,\n  4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4,\n  5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,\n  3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2,\n  3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,\n  4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5,\n  6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5,\n  5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6,\n  7, 7, 8\n};\n\n\n#ifdef REGISTER_USAGE_ANALYZE\n\nu64 instructions_total = 0;\n\nu64 arm_reg_freq[16];\nu64 arm_reg_access_total = 0;\nu64 arm_instructions_total = 0;\n\nu64 thumb_reg_freq[16];\nu64 thumb_reg_access_total = 0;\nu64 thumb_instructions_total = 0;\n\n// mla/long mla's addition operand are not counted yet.\n\n#define using_register(instruction_set, register, type)                       \\\n  instruction_set##_reg_freq[register]++;                                     \\\n  instruction_set##_reg_access_total++                                        \\\n\n#define using_register_list(instruction_set, rlist, count)                    \\\n{                                                                             \\\n  u32 i;                                                                      \\\n  for(i = 0; i < count; i++)                                                  \\\n  {                                                                           \\\n    if((reg_list >> i) & 0x01)                                                \\\n    {                                                                         \\\n      using_register(instruction_set, i, memory_target);                      \\\n    }                                                                         \\\n  }                                                                           \\\n}                                                                             \\\n\n#define using_instruction(instruction_set)                                    \\\n  instruction_set##_instructions_total++;                                     \\\n  instructions_total++                                                        \\\n\nint sort_tagged_element(const void *_a, const void *_b)\n{\n  const u64 *a = _a;\n  const u64 *b = _b;\n\n  return (int)(b[1] - a[1]);\n}\n\nvoid print_register_usage()\n{\n  u32 i;\n  u64 arm_reg_freq_tagged[32];\n  u64 thumb_reg_freq_tagged[32];\n  double percent;\n  double percent_total = 0.0;\n\n  for(i = 0; i < 16; i++)\n  {\n    arm_reg_freq_tagged[i * 2] = i;\n    arm_reg_freq_tagged[(i * 2) + 1] = arm_reg_freq[i];\n    thumb_reg_freq_tagged[i * 2] = i;\n    thumb_reg_freq_tagged[(i * 2) + 1] = thumb_reg_freq[i];\n  }\n\n  qsort(arm_reg_freq_tagged, 16, sizeof(u64) * 2, sort_tagged_element);\n  qsort(thumb_reg_freq_tagged, 16, sizeof(u64) * 2, sort_tagged_element);\n\n  printf(\"ARM register usage (%lf%% ARM instructions):\\n\",\n   (arm_instructions_total * 100.0) / instructions_total);\n  for(i = 0; i < 16; i++)\n  {\n    percent = (arm_reg_freq_tagged[(i * 2) + 1] * 100.0) /\n     arm_reg_access_total;\n    percent_total += percent;\n    printf(\"r%02d: %lf%% (-- %lf%%)\\n\",\n     (u32)arm_reg_freq_tagged[(i * 2)], percent, percent_total);\n  }\n\n  percent_total = 0.0;\n\n  printf(\"\\nThumb register usage (%lf%% Thumb instructions):\\n\",\n   (thumb_instructions_total * 100.0) / instructions_total);\n  for(i = 0; i < 16; i++)\n  {\n    percent = (thumb_reg_freq_tagged[(i * 2) + 1] * 100.0) /\n     thumb_reg_access_total;\n    percent_total += percent;\n    printf(\"r%02d: %lf%% (-- %lf%%)\\n\",\n     (u32)thumb_reg_freq_tagged[(i * 2)], percent, percent_total);\n  }\n\n  memset(arm_reg_freq, 0, sizeof(u64) * 16);\n  memset(thumb_reg_freq, 0, sizeof(u64) * 16);\n  arm_reg_access_total = 0;\n  thumb_reg_access_total = 0;\n}\n\n#else\n\n#define using_register(instruction_set, register, type)                       \\\n\n#define using_register_list(instruction_set, rlist, count)                    \\\n\n#define using_instruction(instruction_set)                                    \\\n\n#endif\n\n\n#define arm_decode_data_proc_reg()                                            \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F;                                                     \\\n  using_register(arm, rd, op_dest);                                           \\\n  using_register(arm, rn, op_src);                                            \\\n  using_register(arm, rm, op_src)                                             \\\n\n#define arm_decode_data_proc_imm()                                            \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 imm;                                                                    \\\n  ror(imm, opcode & 0xFF, ((opcode >> 8) & 0x0F) * 2);                        \\\n  using_register(arm, rd, op_dest);                                           \\\n  using_register(arm, rn, op_src)                                             \\\n\n#define arm_decode_psr_reg()                                                  \\\n  u32 psr_field = (opcode >> 16) & 0x0F;                                      \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F;                                                     \\\n  using_register(arm, rd, op_dest);                                           \\\n  using_register(arm, rm, op_src)                                             \\\n\n#define arm_decode_psr_imm()                                                  \\\n  u32 psr_field = (opcode >> 16) & 0x0F;                                      \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 imm;                                                                    \\\n  ror(imm, opcode & 0xFF, ((opcode >> 8) & 0x0F) * 2);                        \\\n  using_register(arm, rd, op_dest)                                            \\\n\n#define arm_decode_branchx()                                                  \\\n  u32 rn = opcode & 0x0F;                                                     \\\n  using_register(arm, rn, branch_target)                                      \\\n\n#define arm_decode_multiply()                                                 \\\n  u32 rd = (opcode >> 16) & 0x0F;                                             \\\n  u32 rn = (opcode >> 12) & 0x0F;                                             \\\n  u32 rs = (opcode >> 8) & 0x0F;                                              \\\n  u32 rm = opcode & 0x0F;                                                     \\\n  using_register(arm, rd, op_dest);                                           \\\n  using_register(arm, rn, op_src);                                            \\\n  using_register(arm, rm, op_src)                                             \\\n\n#define arm_decode_multiply_long()                                            \\\n  u32 rdhi = (opcode >> 16) & 0x0F;                                           \\\n  u32 rdlo = (opcode >> 12) & 0x0F;                                           \\\n  u32 rn = (opcode >> 8) & 0x0F;                                              \\\n  u32 rm = opcode & 0x0F;                                                     \\\n  using_register(arm, rdhi, op_dest);                                         \\\n  using_register(arm, rdlo, op_dest);                                         \\\n  using_register(arm, rn, op_src);                                            \\\n  using_register(arm, rm, op_src)                                             \\\n\n#define arm_decode_swap()                                                     \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F;                                                     \\\n  using_register(arm, rd, memory_target);                                     \\\n  using_register(arm, rn, memory_base);                                       \\\n  using_register(arm, rm, memory_target)                                      \\\n\n#define arm_decode_half_trans_r()                                             \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F;                                                     \\\n  using_register(arm, rd, memory_target);                                     \\\n  using_register(arm, rn, memory_base);                                       \\\n  using_register(arm, rm, memory_offset)                                      \\\n\n#define arm_decode_half_trans_of()                                            \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 offset = ((opcode >> 4) & 0xF0) | (opcode & 0x0F);                      \\\n  using_register(arm, rd, memory_target);                                     \\\n  using_register(arm, rn, memory_base)                                        \\\n\n#define arm_decode_data_trans_imm()                                           \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 offset = opcode & 0x0FFF;                                               \\\n  using_register(arm, rd, memory_target);                                     \\\n  using_register(arm, rn, memory_base)                                        \\\n\n#define arm_decode_data_trans_reg()                                           \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F;                                                     \\\n  using_register(arm, rd, memory_target);                                     \\\n  using_register(arm, rn, memory_base);                                       \\\n  using_register(arm, rm, memory_offset)                                      \\\n\n#define arm_decode_block_trans()                                              \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 reg_list = opcode & 0xFFFF;                                             \\\n  using_register(arm, rn, memory_base);                                       \\\n  using_register_list(arm, reg_list, 16)                                      \\\n\n#define arm_decode_branch()                                                   \\\n  s32 offset = ((s32)(opcode & 0xFFFFFF) << 8) >> 6                           \\\n\n\n#define thumb_decode_shift()                                                  \\\n  u32 imm = (opcode >> 6) & 0x1F;                                             \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07;                                                     \\\n  using_register(thumb, rd, op_dest);                                         \\\n  using_register(thumb, rs, op_shift)                                         \\\n\n#define thumb_decode_add_sub()                                                \\\n  u32 rn = (opcode >> 6) & 0x07;                                              \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07;                                                     \\\n  using_register(thumb, rd, op_dest);                                         \\\n  using_register(thumb, rn, op_src);                                          \\\n  using_register(thumb, rn, op_src)                                           \\\n\n#define thumb_decode_add_sub_imm()                                            \\\n  u32 imm = (opcode >> 6) & 0x07;                                             \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07;                                                     \\\n  using_register(thumb, rd, op_src_dest);                                     \\\n  using_register(thumb, rs, op_src)                                           \\\n\n#define thumb_decode_imm()                                                    \\\n  u32 imm = opcode & 0xFF;                                                    \\\n  using_register(thumb, ((opcode >> 8) & 0x07), op_dest)                      \\\n\n#define thumb_decode_alu_op()                                                 \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07;                                                     \\\n  using_register(thumb, rd, op_src_dest);                                     \\\n  using_register(thumb, rs, op_src)                                           \\\n\n#define thumb_decode_hireg_op()                                               \\\n  u32 rs = (opcode >> 3) & 0x0F;                                              \\\n  u32 rd = ((opcode >> 4) & 0x08) | (opcode & 0x07);                          \\\n  using_register(thumb, rd, op_src_dest);                                     \\\n  using_register(thumb, rs, op_src)                                           \\\n\n\n#define thumb_decode_mem_reg()                                                \\\n  u32 ro = (opcode >> 6) & 0x07;                                              \\\n  u32 rb = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07;                                                     \\\n  using_register(thumb, rd, memory_target);                                   \\\n  using_register(thumb, rb, memory_base);                                     \\\n  using_register(thumb, ro, memory_offset)                                    \\\n\n\n#define thumb_decode_mem_imm()                                                \\\n  u32 imm = (opcode >> 6) & 0x1F;                                             \\\n  u32 rb = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07;                                                     \\\n  using_register(thumb, rd, memory_target);                                   \\\n  using_register(thumb, rb, memory_base)                                      \\\n\n\n#define thumb_decode_add_sp()                                                 \\\n  u32 imm = opcode & 0x7F;                                                    \\\n  using_register(thumb, REG_SP, op_dest)                                      \\\n\n#define thumb_decode_rlist()                                                  \\\n  u32 reg_list = opcode & 0xFF;                                               \\\n  using_register_list(thumb, rlist, 8)                                        \\\n\n#define thumb_decode_branch_cond()                                            \\\n  s32 offset = (s8)(opcode & 0xFF)                                            \\\n\n#define thumb_decode_swi()                                                    \\\n  u32 comment = opcode & 0xFF                                                 \\\n\n#define thumb_decode_branch()                                                 \\\n  u32 offset = opcode & 0x07FF                                                \\\n\n\n#define get_shift_register(dest)                                              \\\n  u32 shift = reg[(opcode >> 8) & 0x0F];                                      \\\n  using_register(arm, ((opcode >> 8) & 0x0F), op_shift);                      \\\n  dest = reg[rm];                                                             \\\n  if(rm == 15)                                                                \\\n    dest += 4                                                                 \\\n\n\n#define calculate_z_flag(dest)                                                \\\n  z_flag = (dest == 0)                                                        \\\n\n#define calculate_n_flag(dest)                                                \\\n  n_flag = ((signed)dest < 0)                                                 \\\n\n#define calculate_c_flag_sub(dest, src_a, src_b)                              \\\n  c_flag = ((unsigned)src_b <= (unsigned)src_a)                               \\\n\n#define calculate_v_flag_sub(dest, src_a, src_b)                              \\\n  v_flag = ((signed)src_b > (signed)src_a) != ((signed)dest < 0)              \\\n\n#define calculate_c_flag_add(dest, src_a, src_b)                              \\\n  c_flag = ((unsigned)dest < (unsigned)src_a)                                 \\\n\n#define calculate_v_flag_add(dest, src_a, src_b)                              \\\n  v_flag = ((signed)dest < (signed)src_a) != ((signed)src_b < 0)              \\\n\n\n#define calculate_reg_sh()                                                    \\\n  u32 reg_sh = 0;                                                             \\\n  switch((opcode >> 4) & 0x07)                                                \\\n  {                                                                           \\\n    /* LSL imm */                                                             \\\n    case 0x0:                                                                 \\\n    {                                                                         \\\n      reg_sh = reg[rm] << ((opcode >> 7) & 0x1F);                             \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* LSL reg */                                                             \\\n    case 0x1:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      if(shift <= 31)                                                         \\\n        reg_sh = reg_sh << shift;                                             \\\n      else                                                                    \\\n        reg_sh = 0;                                                           \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* LSR imm */                                                             \\\n    case 0x2:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      if(imm == 0)                                                            \\\n        reg_sh = 0;                                                           \\\n      else                                                                    \\\n        reg_sh = reg[rm] >> imm;                                              \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* LSR reg */                                                             \\\n    case 0x3:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      if(shift <= 31)                                                         \\\n        reg_sh = reg_sh >> shift;                                             \\\n      else                                                                    \\\n        reg_sh = 0;                                                           \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ASR imm */                                                             \\\n    case 0x4:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      reg_sh = reg[rm];                                                       \\\n                                                                              \\\n      if(imm == 0)                                                            \\\n        reg_sh = (s32)reg_sh >> 31;                                           \\\n      else                                                                    \\\n        reg_sh = (s32)reg_sh >> imm;                                          \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ASR reg */                                                             \\\n    case 0x5:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      if(shift <= 31)                                                         \\\n        reg_sh = (s32)reg_sh >> shift;                                        \\\n      else                                                                    \\\n        reg_sh = (s32)reg_sh >> 31;                                           \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ROR imm */                                                             \\\n    case 0x6:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n                                                                              \\\n      if(imm == 0)                                                            \\\n        reg_sh = (reg[rm] >> 1) | (c_flag << 31);                             \\\n      else                                                                    \\\n        ror(reg_sh, reg[rm], imm);                                            \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ROR reg */                                                             \\\n    case 0x7:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      ror(reg_sh, reg_sh, shift);                                             \\\n      break;                                                                  \\\n    }                                                                         \\\n  }                                                                           \\\n\n#define calculate_reg_sh_flags()                                              \\\n  u32 reg_sh = 0;                                                             \\\n  switch((opcode >> 4) & 0x07)                                                \\\n  {                                                                           \\\n    /* LSL imm */                                                             \\\n    case 0x0:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      reg_sh = reg[rm];                                                       \\\n                                                                              \\\n      if(imm != 0)                                                            \\\n      {                                                                       \\\n        c_flag = (reg_sh >> (32 - imm)) & 0x01;                               \\\n        reg_sh <<= imm;                                                       \\\n      }                                                                       \\\n                                                                              \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* LSL reg */                                                             \\\n    case 0x1:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      if(shift != 0)                                                          \\\n      {                                                                       \\\n        if(shift > 31)                                                        \\\n        {                                                                     \\\n          if(shift == 32)                                                     \\\n            c_flag = reg_sh & 0x01;                                           \\\n          else                                                                \\\n            c_flag = 0;                                                       \\\n          reg_sh = 0;                                                         \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          c_flag = (reg_sh >> (32 - shift)) & 0x01;                           \\\n          reg_sh <<= shift;                                                   \\\n        }                                                                     \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* LSR imm */                                                             \\\n    case 0x2:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      reg_sh = reg[rm];                                                       \\\n      if(imm == 0)                                                            \\\n      {                                                                       \\\n        c_flag = reg_sh >> 31;                                                \\\n        reg_sh = 0;                                                           \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        c_flag = (reg_sh >> (imm - 1)) & 0x01;                                \\\n        reg_sh >>= imm;                                                       \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* LSR reg */                                                             \\\n    case 0x3:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      if(shift != 0)                                                          \\\n      {                                                                       \\\n        if(shift > 31)                                                        \\\n        {                                                                     \\\n          if(shift == 32)                                                     \\\n            c_flag = (reg_sh >> 31) & 0x01;                                   \\\n          else                                                                \\\n            c_flag = 0;                                                       \\\n          reg_sh = 0;                                                         \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          c_flag = (reg_sh >> (shift - 1)) & 0x01;                            \\\n          reg_sh >>= shift;                                                   \\\n        }                                                                     \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ASR imm */                                                             \\\n    case 0x4:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      reg_sh = reg[rm];                                                       \\\n      if(imm == 0)                                                            \\\n      {                                                                       \\\n        reg_sh = (s32)reg_sh >> 31;                                           \\\n        c_flag = reg_sh & 0x01;                                               \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        c_flag = (reg_sh >> (imm - 1)) & 0x01;                                \\\n        reg_sh = (s32)reg_sh >> imm;                                          \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ASR reg */                                                             \\\n    case 0x5:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      if(shift != 0)                                                          \\\n      {                                                                       \\\n        if(shift > 31)                                                        \\\n        {                                                                     \\\n          reg_sh = (s32)reg_sh >> 31;                                         \\\n          c_flag = reg_sh & 0x01;                                             \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          c_flag = (reg_sh >> (shift - 1)) & 0x01;                            \\\n          reg_sh = (s32)reg_sh >> shift;                                      \\\n        }                                                                     \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ROR imm */                                                             \\\n    case 0x6:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      reg_sh = reg[rm];                                                       \\\n      if(imm == 0)                                                            \\\n      {                                                                       \\\n        u32 old_c_flag = c_flag;                                              \\\n        c_flag = reg_sh & 0x01;                                               \\\n        reg_sh = (reg_sh >> 1) | (old_c_flag << 31);                          \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        c_flag = (reg_sh >> (imm - 1)) & 0x01;                                \\\n        ror(reg_sh, reg_sh, imm);                                             \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ROR reg */                                                             \\\n    case 0x7:                                                                 \\\n    {                                                                         \\\n      get_shift_register(reg_sh);                                             \\\n      if(shift != 0)                                                          \\\n      {                                                                       \\\n        c_flag = (reg_sh >> (shift - 1)) & 0x01;                              \\\n        ror(reg_sh, reg_sh, shift);                                           \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n  }                                                                           \\\n\n#define calculate_reg_offset()                                                \\\n  u32 reg_offset = 0;                                                         \\\n  switch((opcode >> 5) & 0x03)                                                \\\n  {                                                                           \\\n    /* LSL imm */                                                             \\\n    case 0x0:                                                                 \\\n    {                                                                         \\\n      reg_offset = reg[rm] << ((opcode >> 7) & 0x1F);                         \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* LSR imm */                                                             \\\n    case 0x1:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      if(imm == 0)                                                            \\\n        reg_offset = 0;                                                       \\\n      else                                                                    \\\n        reg_offset = reg[rm] >> imm;                                          \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ASR imm */                                                             \\\n    case 0x2:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      if(imm == 0)                                                            \\\n        reg_offset = (s32)reg[rm] >> 31;                                      \\\n      else                                                                    \\\n        reg_offset = (s32)reg[rm] >> imm;                                     \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    /* ROR imm */                                                             \\\n    case 0x3:                                                                 \\\n    {                                                                         \\\n      u32 imm = (opcode >> 7) & 0x1F;                                         \\\n      if(imm == 0)                                                            \\\n        reg_offset = (reg[rm] >> 1) | (c_flag << 31);                         \\\n      else                                                                    \\\n        ror(reg_offset, reg[rm], imm);                                        \\\n      break;                                                                  \\\n    }                                                                         \\\n  }                                                                           \\\n\n#define calculate_flags_add(dest, src_a, src_b)                               \\\n  calculate_z_flag(dest);                                                     \\\n  calculate_n_flag(dest);                                                     \\\n  calculate_c_flag_add(dest, src_a, src_b);                                   \\\n  calculate_v_flag_add(dest, src_a, src_b)                                    \\\n\n#define calculate_flags_sub(dest, src_a, src_b)                               \\\n  calculate_z_flag(dest);                                                     \\\n  calculate_n_flag(dest);                                                     \\\n  calculate_c_flag_sub(dest, src_a, src_b);                                   \\\n  calculate_v_flag_sub(dest, src_a, src_b)                                    \\\n\n#define calculate_flags_logic(dest)                                           \\\n  calculate_z_flag(dest);                                                     \\\n  calculate_n_flag(dest)                                                      \\\n\n#define extract_flags()                                                       \\\n  n_flag = reg[REG_CPSR] >> 31;                                               \\\n  z_flag = (reg[REG_CPSR] >> 30) & 0x01;                                      \\\n  c_flag = (reg[REG_CPSR] >> 29) & 0x01;                                      \\\n  v_flag = (reg[REG_CPSR] >> 28) & 0x01;                                      \\\n\n#define collapse_flags()                                                      \\\n  reg[REG_CPSR] = (n_flag << 31) | (z_flag << 30) | (c_flag << 29) |          \\\n   (v_flag << 28) | (reg[REG_CPSR] & 0xFF)                                    \\\n\n#define memory_region(r_dest, l_dest, address)                                \\\n  r_dest = memory_regions[address >> 24];                                     \\\n  l_dest = memory_limits[address >> 24]                                       \\\n\n\n#define pc_region()                                                           \\\n  memory_region(pc_region, pc_limit, pc)                                      \\\n\n#define check_pc_region()                                                     \\\n  new_pc_region = (pc >> 15);                                                 \\\n  if(new_pc_region != pc_region)                                              \\\n  {                                                                           \\\n    pc_region = new_pc_region;                                                \\\n    pc_address_block = memory_map_read[new_pc_region];                        \\\n                                                                              \\\n    if(pc_address_block == NULL)                                              \\\n      pc_address_block = load_gamepak_page(pc_region & 0x3FF);                \\\n  }                                                                           \\\n\nu32 branch_targets = 0;\nu32 high_frequency_branch_targets = 0;\n\n#define BRANCH_ACTIVITY_THRESHOLD 50\n\n#define arm_update_pc()                                                       \\\n  pc = reg[REG_PC]                                                            \\\n\n#define arm_pc_offset(val)                                                    \\\n  pc += val;                                                                  \\\n  reg[REG_PC] = pc                                                            \\\n\n#define arm_pc_offset_update(val)                                             \\\n  pc += val;                                                                  \\\n  reg[REG_PC] = pc                                                            \\\n\n#define arm_pc_offset_update_direct(val)                                      \\\n  pc = val;                                                                   \\\n  reg[REG_PC] = pc                                                            \\\n\n\n// It should be okay to still generate result flags, spsr will overwrite them.\n// This is pretty infrequent (returning from interrupt handlers, et al) so\n// probably not worth optimizing for.\n\n#define check_for_interrupts()                                                \\\n  if((io_registers[REG_IE] & io_registers[REG_IF]) &&                         \\\n   io_registers[REG_IME] && ((reg[REG_CPSR] & 0x80) == 0))                    \\\n  {                                                                           \\\n    reg_mode[MODE_IRQ][6] = reg[REG_PC] + 4;                                  \\\n    spsr[MODE_IRQ] = reg[REG_CPSR];                                           \\\n    reg[REG_CPSR] = 0xD2;                                                     \\\n    reg[REG_PC] = armcpu->intVector + 0x18;                                                 \\\n    arm_update_pc();                                                          \\\n    set_cpu_mode(MODE_IRQ);                                                   \\\n    goto arm_loop;                                                            \\\n  }                                                                           \\\n\n#define arm_spsr_restore()                                                    \\\n  if(rd == 15)                                                                \\\n  {                                                                           \\\n    if(reg[CPU_MODE] != MODE_USER)                                            \\\n    {                                                                         \\\n      reg[REG_CPSR] = spsr[reg[CPU_MODE]];                                    \\\n      extract_flags();                                                        \\\n      set_cpu_mode(cpu_modes[reg[REG_CPSR] & 0x1F]);                          \\\n      check_for_interrupts();                                                 \\\n    }                                                                         \\\n    arm_update_pc();                                                          \\\n                                                                              \\\n    if(reg[REG_CPSR] & 0x20)                                                  \\\n      goto thumb_loop;                                                        \\\n  }                                                                           \\\n\n#define arm_data_proc_flags_reg()                                             \\\n  arm_decode_data_proc_reg();                                                 \\\n  calculate_reg_sh_flags()                                                    \\\n\n#define arm_data_proc_reg()                                                   \\\n  arm_decode_data_proc_reg();                                                 \\\n  calculate_reg_sh()                                                          \\\n\n#define arm_data_proc_flags_imm()                                             \\\n  arm_decode_data_proc_imm()                                                  \\\n\n#define arm_data_proc_imm()                                                   \\\n  arm_decode_data_proc_imm()                                                  \\\n\n#define arm_data_proc(expr, type)                                             \\\n{                                                                             \\\n  u32 dest;                                                                   \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_proc_##type();                                                     \\\n  dest = expr;                                                                \\\n  arm_pc_offset(-4);                                                          \\\n  reg[rd] = dest;                                                             \\\n                                                                              \\\n  if(rd == 15)                                                                \\\n  {                                                                           \\\n    arm_update_pc();                                                          \\\n  }                                                                           \\\n}                                                                             \\\n\n#define flags_vars(src_a, src_b)                                              \\\n  u32 dest;                                                                   \\\n  const u32 _sa = src_a;                                                      \\\n  const u32 _sb = src_b                                                       \\\n\n#define arm_data_proc_logic_flags(expr, type)                                 \\\n{                                                                             \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_proc_flags_##type();                                               \\\n  u32 dest = expr;                                                            \\\n  calculate_flags_logic(dest);                                                \\\n  arm_pc_offset(-4);                                                          \\\n  reg[rd] = dest;                                                             \\\n  arm_spsr_restore();                                                         \\\n}                                                                             \\\n\n#define arm_data_proc_add_flags(src_a, src_b, type)                           \\\n{                                                                             \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_proc_##type();                                                     \\\n  flags_vars(src_a, src_b);                                                   \\\n  dest = _sa + _sb;                                                           \\\n  calculate_flags_add(dest, _sa, _sb);                                        \\\n  arm_pc_offset(-4);                                                          \\\n  reg[rd] = dest;                                                             \\\n  arm_spsr_restore();                                                         \\\n}\n\n#define arm_data_proc_sub_flags(src_a, src_b, type)                           \\\n{                                                                             \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_proc_##type();                                                     \\\n  flags_vars(src_a, src_b);                                                   \\\n  dest = _sa - _sb;                                                           \\\n  calculate_flags_sub(dest, _sa, _sb);                                        \\\n  arm_pc_offset(-4);                                                          \\\n  reg[rd] = dest;                                                             \\\n  arm_spsr_restore();                                                         \\\n}                                                                             \\\n\n#define arm_data_proc_test_logic(expr, type)                                  \\\n{                                                                             \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_proc_flags_##type();                                               \\\n  u32 dest = expr;                                                            \\\n  calculate_flags_logic(dest);                                                \\\n  arm_pc_offset(-4);                                                          \\\n}                                                                             \\\n\n#define arm_data_proc_test_add(src_a, src_b, type)                            \\\n{                                                                             \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_proc_##type();                                                     \\\n  flags_vars(src_a, src_b);                                                   \\\n  dest = _sa + _sb;                                                           \\\n  calculate_flags_add(dest, _sa, _sb);                                        \\\n  arm_pc_offset(-4);                                                          \\\n}                                                                             \\\n\n#define arm_data_proc_test_sub(src_a, src_b, type)                            \\\n{                                                                             \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_proc_##type();                                                     \\\n  flags_vars(src_a, src_b);                                                   \\\n  dest = _sa - _sb;                                                           \\\n  calculate_flags_sub(dest, _sa, _sb);                                        \\\n  arm_pc_offset(-4);                                                          \\\n}                                                                             \\\n\n#define arm_multiply_flags_yes(_dest)                                         \\\n  calculate_z_flag(_dest);                                                    \\\n  calculate_n_flag(_dest);                                                    \\\n\n#define arm_multiply_flags_no(_dest)                                          \\\n\n#define arm_multiply_long_flags_yes(_dest_lo, _dest_hi)                       \\\n  z_flag = (_dest_lo == 0) & (_dest_hi == 0);                                 \\\n  calculate_n_flag(_dest_hi)                                                  \\\n\n#define arm_multiply_long_flags_no(_dest_lo, _dest_hi)                        \\\n\n#define arm_multiply(add_op, flags)                                           \\\n{                                                                             \\\n  u32 dest;                                                                   \\\n  arm_decode_multiply();                                                      \\\n  dest = (reg[rm] * reg[rs]) add_op;                                          \\\n  arm_multiply_flags_##flags(dest);                                           \\\n  reg[rd] = dest;                                                             \\\n  arm_pc_offset(4);                                                           \\\n}                                                                             \\\n\n#define arm_multiply_long_addop(type)                                         \\\n  + ((type##64)((((type##64)reg[rdhi]) << 32) | reg[rdlo]));                  \\\n\n#define arm_multiply_long(add_op, flags, type)                                \\\n{                                                                             \\\n  type##64 dest;                                                              \\\n  u32 dest_lo;                                                                \\\n  u32 dest_hi;                                                                \\\n  arm_decode_multiply_long();                                                 \\\n  dest = ((type##64)((type##32)reg[rm]) *                                     \\\n   (type##64)((type##32)reg[rn])) add_op;                                     \\\n  dest_lo = (u32)dest;                                                        \\\n  dest_hi = (u32)(dest >> 32);                                                \\\n  arm_multiply_long_flags_##flags(dest_lo, dest_hi);                          \\\n  reg[rdlo] = dest_lo;                                                        \\\n  reg[rdhi] = dest_hi;                                                        \\\n  arm_pc_offset(4);                                                           \\\n}                                                                             \\\n\nconst u32 psr_masks[16] =\n{\n  0x00000000, 0x000000FF, 0x0000FF00, 0x0000FFFF, 0x00FF0000,\n  0x00FF00FF, 0x00FFFF00, 0x00FFFFFF, 0xFF000000, 0xFF0000FF,\n  0xFF00FF00, 0xFF00FFFF, 0xFFFF0000, 0xFFFF00FF, 0xFFFFFF00,\n  0xFFFFFFFF\n};\n\n#define arm_psr_read(dummy, psr_reg)                                          \\\n  collapse_flags();                                                           \\\n  reg[rd] = psr_reg                                                           \\\n\n#define arm_psr_store_cpsr(source)                                            \\\n  reg[REG_CPSR] = (source & store_mask) | (reg[REG_CPSR] & (~store_mask));    \\\n  extract_flags();                                                            \\\n  if(store_mask & 0xFF)                                                       \\\n  {                                                                           \\\n    set_cpu_mode(cpu_modes[reg[REG_CPSR] & 0x1F]);                            \\\n    check_for_interrupts();                                                   \\\n  }                                                                           \\\n\n#define arm_psr_store_spsr(source)                                            \\\n  u32 _psr = spsr[reg[CPU_MODE]];                                             \\\n  spsr[reg[CPU_MODE]] = (source & store_mask) | (_psr & (~store_mask))        \\\n\n#define arm_psr_store(source, psr_reg)                                        \\\n  const u32 store_mask = psr_masks[psr_field];                                \\\n  arm_psr_store_##psr_reg(source)                                             \\\n\n#define arm_psr_src_reg reg[rm]\n\n#define arm_psr_src_imm imm\n\n#define arm_psr(op_type, transfer_type, psr_reg)                              \\\n{                                                                             \\\n  arm_decode_psr_##op_type();                                                 \\\n  arm_pc_offset(4);                                                           \\\n  arm_psr_##transfer_type(arm_psr_src_##op_type, psr_reg);                    \\\n}                                                                             \\\n\n#define arm_data_trans_reg()                                                  \\\n  arm_decode_data_trans_reg();                                                \\\n  calculate_reg_offset()                                                      \\\n\n#define arm_data_trans_imm()                                                  \\\n  arm_decode_data_trans_imm()                                                 \\\n\n#define arm_data_trans_half_reg()                                             \\\n  arm_decode_half_trans_r()                                                   \\\n\n#define arm_data_trans_half_imm()                                             \\\n  arm_decode_half_trans_of()                                                  \\\n\n#define aligned_address_mask8  0xF0000000\n#define aligned_address_mask16 0xF0000001\n#define aligned_address_mask32 0xF0000003\n\n#define fast_read_memory(size, type, address, dest)                           \\\n{                                                                             \\\n  u8 *map;                                                                    \\\n  u32 _address = address;                                                     \\\n                                                                              \\\n  if(_address < 0x10000000)                                                   \\\n  {                                                                           \\\n    memory_region_access_read_##type[_address >> 24]++;                       \\\n    memory_reads_##type++;                                                    \\\n  }                                                                           \\\n  if(((_address >> 24) == 0) && (pc >= 0x4000))                               \\\n  {                                                                           \\\n    dest = *((type *)((u8 *)&bios_read_protect + (_address & 0x03)));         \\\n  }                                                                           \\\n  else                                                                        \\\n                                                                              \\\n  if(((_address & aligned_address_mask##size) == 0) &&                        \\\n   (map = memory_map_read[_address >> 15]))                                   \\\n  {                                                                           \\\n    dest = *((type *)((u8 *)map + (_address & 0x7FFF)));                      \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    dest = (type)read_memory##size(_address);                                 \\\n  }                                                                           \\\n}                                                                             \\\n\n#define fast_read_memory_s16(address, dest)                                   \\\n{                                                                             \\\n  u8 *map;                                                                    \\\n  u32 _address = address;                                                     \\\n  if(_address < 0x10000000)                                                   \\\n  {                                                                           \\\n    memory_region_access_read_s16[_address >> 24]++;                          \\\n    memory_reads_s16++;                                                       \\\n  }                                                                           \\\n  if(((_address & aligned_address_mask16) == 0) &&                            \\\n   (map = memory_map_read[_address >> 15]))                                   \\\n  {                                                                           \\\n    dest = *((s16 *)((u8 *)map + (_address & 0x7FFF)));                       \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    dest = (s16)read_memory16_signed(_address);                               \\\n  }                                                                           \\\n}                                                                             \\\n\n\n#define fast_write_memory(size, type, address, value)                         \\\n{                                                                             \\\n  u8 *map;                                                                    \\\n  u32 _address = (address) & ~(aligned_address_mask##size & 0x03);            \\\n  if(_address < 0x10000000)                                                   \\\n  {                                                                           \\\n    memory_region_access_write_##type[_address >> 24]++;                      \\\n    memory_writes_##type++;                                                   \\\n  }                                                                           \\\n                                                                              \\\n  if(((_address & aligned_address_mask##size) == 0) &&                        \\\n   (map = memory_map_write[_address >> 15]))                                  \\\n  {                                                                           \\\n    *((type *)((u8 *)map + (_address & 0x7FFF))) = value;                     \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    cpu_alert = write_memory##size(_address, value);                          \\\n    if(cpu_alert)                                                             \\\n      goto alert;                                                             \\\n  }                                                                           \\\n}                                                                             \\\n\n#define load_aligned32(address, dest)                                         \\\n{                                                                             \\\n  u32 _address = address;                                                     \\\n  u8 *map = memory_map_read[_address >> 15];                                  \\\n  if(_address < 0x10000000)                                                   \\\n  {                                                                           \\\n    memory_region_access_read_u32[_address >> 24]++;                          \\\n    memory_reads_u32++;                                                       \\\n  }                                                                           \\\n  if(map)                                                                     \\\n  {                                                                           \\\n    dest = address32(map, _address & 0x7FFF);                                 \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    dest = read_memory32(_address);                                           \\\n  }                                                                           \\\n}                                                                             \\\n\n#define store_aligned32(address, value)                                       \\\n{                                                                             \\\n  u32 _address = address;                                                     \\\n  u8 *map = memory_map_write[_address >> 15];                                 \\\n  if(_address < 0x10000000)                                                   \\\n  {                                                                           \\\n    memory_region_access_write_u32[_address >> 24]++;                         \\\n    memory_writes_u32++;                                                      \\\n  }                                                                           \\\n  if(map)                                                                     \\\n  {                                                                           \\\n    address32(map, _address & 0x7FFF) = value;                                \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    cpu_alert = write_memory32(_address, value);                              \\\n    if(cpu_alert)                                                             \\\n      goto alert;                                                             \\\n  }                                                                           \\\n}                                                                             \\\n\n#define load_memory_u8(address, dest)                                         \\\n  fast_read_memory(8, u8, address, dest)                                      \\\n\n#define load_memory_u16(address, dest)                                        \\\n  fast_read_memory(16, u16, address, dest)                                    \\\n\n#define load_memory_u32(address, dest)                                        \\\n  fast_read_memory(32, u32, address, dest)                                    \\\n\n#define load_memory_s8(address, dest)                                         \\\n  fast_read_memory(8, s8, address, dest)                                      \\\n\n#define load_memory_s16(address, dest)                                        \\\n  fast_read_memory_s16(address, dest)                                         \\\n\n#define store_memory_u8(address, value)                                       \\\n  fast_write_memory(8, u8, address, value)                                    \\\n\n#define store_memory_u16(address, value)                                      \\\n  fast_write_memory(16, u16, address, value)                                  \\\n\n#define store_memory_u32(address, value)                                      \\\n  fast_write_memory(32, u32, address, value)                                  \\\n\n#define no_op                                                                 \\\n\n#define arm_access_memory_writeback_yes(off_op)                               \\\n  reg[rn] = address off_op                                                    \\\n\n#define arm_access_memory_writeback_no(off_op)                                \\\n\n#define arm_access_memory_pc_preadjust_load()                                 \\\n\n#define arm_access_memory_pc_preadjust_store()                                \\\n  u32 reg_op = reg[rd];                                                       \\\n  if(rd == 15)                                                                \\\n    reg_op += 4                                                               \\\n\n#define arm_access_memory_pc_postadjust_load()                                \\\n  arm_update_pc()                                                             \\\n\n#define arm_access_memory_pc_postadjust_store()                               \\\n\n#define load_reg_op reg[rd]                                                   \\\n\n#define store_reg_op reg_op                                                   \\\n\n#define arm_access_memory(access_type, off_op, off_type, mem_type,            \\\n wb, wb_off_op)                                                               \\\n{                                                                             \\\n  arm_pc_offset(8);                                                           \\\n  arm_data_trans_##off_type();                                                \\\n  u32 address = reg[rn] off_op;                                               \\\n  arm_access_memory_pc_preadjust_##access_type();                             \\\n                                                                              \\\n  arm_pc_offset(-4);                                                          \\\n  arm_access_memory_writeback_##wb(wb_off_op);                                \\\n  access_type##_memory_##mem_type(address, access_type##_reg_op);             \\\n  arm_access_memory_pc_postadjust_##access_type();                            \\\n}                                                                             \\\n\n#define word_bit_count(word)                                                  \\\n  (bit_count[word >> 8] + bit_count[word & 0xFF])                             \\\n\n#define sprint_no(access_type, offset_type, writeback_type)                   \\\n\n#define sprint_yes(access_type, offset_type, writeback_type)                  \\\n  printf(\"sbit on %s %s %s\\n\", #access_type, #offset_type, #writeback_type)   \\\n\n#define arm_block_writeback_load()                                            \\\n  if(!((reg_list >> rn) & 0x01))                                              \\\n  {                                                                           \\\n    reg[rn] = address;                                                        \\\n  }                                                                           \\\n\n#define arm_block_writeback_store()                                           \\\n  reg[rn] = address                                                           \\\n\n#define arm_block_writeback_yes(access_type)                                  \\\n  arm_block_writeback_##access_type()                                         \\\n\n#define arm_block_writeback_no(access_type)                                   \\\n\n#define load_block_memory(address, dest)                                      \\\n  dest = address32(address_region, (address + offset) & 0x7FFF)               \\\n\n#define store_block_memory(address, dest)                                     \\\n  address32(address_region, (address + offset) & 0x7FFF) = dest               \\\n\n#define arm_block_memory_offset_down_a()                                      \\\n  (base - (word_bit_count(reg_list) * 4) + 4)                                 \\\n\n#define arm_block_memory_offset_down_b()                                      \\\n  (base - (word_bit_count(reg_list) * 4))                                     \\\n\n#define arm_block_memory_offset_no()                                          \\\n  (base)                                                                      \\\n\n#define arm_block_memory_offset_up()                                          \\\n  (base + 4)                                                                  \\\n\n#define arm_block_memory_writeback_down()                                     \\\n  reg[rn] = base - (word_bit_count(reg_list) * 4)                             \\\n\n#define arm_block_memory_writeback_up()                                       \\\n  reg[rn] = base + (word_bit_count(reg_list) * 4)                             \\\n\n#define arm_block_memory_writeback_no()                                       \\\n\n#define arm_block_memory_load_pc()                                            \\\n  load_aligned32(address, pc);                                                \\\n  reg[REG_PC] = pc                                                            \\\n\n#define arm_block_memory_store_pc()                                           \\\n  store_aligned32(address, pc + 4)                                            \\\n\n#define arm_block_memory(access_type, offset_type, writeback_type, s_bit)     \\\n{                                                                             \\\n  arm_decode_block_trans();                                                   \\\n  u32 base = reg[rn];                                                         \\\n  u32 address = arm_block_memory_offset_##offset_type() & 0xFFFFFFFC;         \\\n  u32 i;                                                                      \\\n                                                                              \\\n  arm_block_memory_writeback_##writeback_type();                              \\\n                                                                              \\\n  for(i = 0; i < 15; i++)                                                     \\\n  {                                                                           \\\n    if((reg_list >> i) & 0x01)                                                \\\n    {                                                                         \\\n      access_type##_aligned32(address, reg[i]);                               \\\n      address += 4;                                                           \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  arm_pc_offset(4);                                                           \\\n  if(reg_list & 0x8000)                                                       \\\n  {                                                                           \\\n    arm_block_memory_##access_type##_pc();                                    \\\n  }                                                                           \\\n}                                                                             \\\n\n#define arm_swap(type)                                                        \\\n{                                                                             \\\n  arm_decode_swap();                                                          \\\n  u32 temp;                                                                   \\\n  load_memory_##type(reg[rn], temp);                                          \\\n  store_memory_##type(reg[rn], reg[rm]);                                      \\\n  reg[rd] = temp;                                                             \\\n  arm_pc_offset(4);                                                           \\\n}                                                                             \\\n\n#define arm_next_instruction()                                                \\\n{                                                                             \\\n  arm_pc_offset(4);                                                           \\\n  goto skip_instruction;                                                      \\\n}                                                                             \\\n\n#define thumb_update_pc()                                                     \\\n  pc = reg[REG_PC]                                                            \\\n\n#define thumb_pc_offset(val)                                                  \\\n  pc += val;                                                                  \\\n  reg[REG_PC] = pc                                                            \\\n\n#define thumb_pc_offset_update(val)                                           \\\n  pc += val;                                                                  \\\n  reg[REG_PC] = pc                                                            \\\n\n#define thumb_pc_offset_update_direct(val)                                    \\\n  pc = val;                                                                   \\\n  reg[REG_PC] = pc                                                            \\\n\n// Types: add_sub, add_sub_imm, alu_op, imm\n// Affects N/Z/C/V flags\n\n#define thumb_add(type, dest_reg, src_a, src_b)                               \\\n{                                                                             \\\n  thumb_decode_##type();                                                      \\\n  const u32 _sa = src_a;                                                      \\\n  const u32 _sb = src_b;                                                      \\\n  u32 dest = _sa + _sb;                                                       \\\n  calculate_flags_add(dest, _sa, _sb);                                        \\\n  reg[dest_reg] = dest;                                                       \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n#define thumb_add_noflags(type, dest_reg, src_a, src_b)                       \\\n{                                                                             \\\n  thumb_decode_##type();                                                      \\\n  u32 dest = (src_a) + (src_b);                                               \\\n  reg[dest_reg] = dest;                                                       \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n#define thumb_sub(type, dest_reg, src_a, src_b)                               \\\n{                                                                             \\\n  thumb_decode_##type();                                                      \\\n  const u32 _sa = src_a;                                                      \\\n  const u32 _sb = src_b;                                                      \\\n  u32 dest = _sa - _sb;                                                       \\\n  calculate_flags_sub(dest, _sa, _sb);                                        \\\n  reg[dest_reg] = dest;                                                       \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n// Affects N/Z flags\n\n#define thumb_logic(type, dest_reg, expr)                                     \\\n{                                                                             \\\n  thumb_decode_##type();                                                      \\\n  u32 dest = expr;                                                            \\\n  calculate_flags_logic(dest);                                                \\\n  reg[dest_reg] = dest;                                                       \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n// Decode types: shift, alu_op\n// Operation types: lsl, lsr, asr, ror\n// Affects N/Z/C flags\n\n#define thumb_shift_lsl_reg()                                                 \\\n  u32 shift = reg[rs];                                                        \\\n  u32 dest = reg[rd];                                                         \\\n  if(shift != 0)                                                              \\\n  {                                                                           \\\n    if(shift > 31)                                                            \\\n    {                                                                         \\\n      if(shift == 32)                                                         \\\n        c_flag = dest & 0x01;                                                 \\\n      else                                                                    \\\n        c_flag = 0;                                                           \\\n      dest = 0;                                                               \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      c_flag = (dest >> (32 - shift)) & 0x01;                                 \\\n      dest <<= shift;                                                         \\\n    }                                                                         \\\n  }                                                                           \\\n\n#define thumb_shift_lsr_reg()                                                 \\\n  u32 shift = reg[rs];                                                        \\\n  u32 dest = reg[rd];                                                         \\\n  if(shift != 0)                                                              \\\n  {                                                                           \\\n    if(shift > 31)                                                            \\\n    {                                                                         \\\n      if(shift == 32)                                                         \\\n        c_flag = dest >> 31;                                                  \\\n      else                                                                    \\\n        c_flag = 0;                                                           \\\n      dest = 0;                                                               \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      c_flag = (dest >> (shift - 1)) & 0x01;                                  \\\n      dest >>= shift;                                                         \\\n    }                                                                         \\\n  }                                                                           \\\n\n#define thumb_shift_asr_reg()                                                 \\\n  u32 shift = reg[rs];                                                        \\\n  u32 dest = reg[rd];                                                         \\\n  if(shift != 0)                                                              \\\n  {                                                                           \\\n    if(shift > 31)                                                            \\\n    {                                                                         \\\n      dest = (s32)dest >> 31;                                                 \\\n      c_flag = dest & 0x01;                                                   \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      c_flag = (dest >> (shift - 1)) & 0x01;                                  \\\n      dest = (s32)dest >> shift;                                              \\\n    }                                                                         \\\n  }                                                                           \\\n\n#define thumb_shift_ror_reg()                                                 \\\n  u32 shift = reg[rs];                                                        \\\n  u32 dest = reg[rd];                                                         \\\n  if(shift != 0)                                                              \\\n  {                                                                           \\\n    c_flag = (dest >> (shift - 1)) & 0x01;                                    \\\n    ror(dest, dest, shift);                                                   \\\n  }                                                                           \\\n\n#define thumb_shift_lsl_imm()                                                 \\\n  u32 dest = reg[rs];                                                         \\\n  if(imm != 0)                                                                \\\n  {                                                                           \\\n    c_flag = (dest >> (32 - imm)) & 0x01;                                     \\\n    dest <<= imm;                                                             \\\n  }                                                                           \\\n\n#define thumb_shift_lsr_imm()                                                 \\\n  u32 dest;                                                                   \\\n  if(imm == 0)                                                                \\\n  {                                                                           \\\n    dest = 0;                                                                 \\\n    c_flag = reg[rs] >> 31;                                                   \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    dest = reg[rs];                                                           \\\n    c_flag = (dest >> (imm - 1)) & 0x01;                                      \\\n    dest >>= imm;                                                             \\\n  }                                                                           \\\n\n#define thumb_shift_asr_imm()                                                 \\\n  u32 dest;                                                                   \\\n  if(imm == 0)                                                                \\\n  {                                                                           \\\n    dest = (s32)reg[rs] >> 31;                                                \\\n    c_flag = dest & 0x01;                                                     \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    dest = reg[rs];                                                           \\\n    c_flag = (dest >> (imm - 1)) & 0x01;                                      \\\n    dest = (s32)dest >> imm;                                                  \\\n  }                                                                           \\\n\n#define thumb_shift_ror_imm()                                                 \\\n  u32 dest = reg[rs];                                                         \\\n  if(imm == 0)                                                                \\\n  {                                                                           \\\n    u32 old_c_flag = c_flag;                                                  \\\n    c_flag = dest & 0x01;                                                     \\\n    dest = (dest >> 1) | (old_c_flag << 31);                                  \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    c_flag = (dest >> (imm - 1)) & 0x01;                                      \\\n    ror(dest, dest, imm);                                                     \\\n  }                                                                           \\\n\n#define thumb_shift(decode_type, op_type, value_type)                         \\\n{                                                                             \\\n  thumb_decode_##decode_type();                                               \\\n  thumb_shift_##op_type##_##value_type();                                     \\\n  calculate_flags_logic(dest);                                                \\\n  reg[rd] = dest;                                                             \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n#define thumb_test_add(type, src_a, src_b)                                    \\\n{                                                                             \\\n  thumb_decode_##type();                                                      \\\n  const u32 _sa = src_a;                                                      \\\n  const u32 _sb = src_b;                                                      \\\n  u32 dest = _sa + _sb;                                                       \\\n  calculate_flags_add(dest, src_a, src_b);                                    \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n#define thumb_test_sub(type, src_a, src_b)                                    \\\n{                                                                             \\\n  thumb_decode_##type();                                                      \\\n  const u32 _sa = src_a;                                                      \\\n  const u32 _sb = src_b;                                                      \\\n  u32 dest = _sa - _sb;                                                       \\\n  calculate_flags_sub(dest, src_a, src_b);                                    \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n#define thumb_test_logic(type, expr)                                          \\\n{                                                                             \\\n  thumb_decode_##type();                                                      \\\n  u32 dest = expr;                                                            \\\n  calculate_flags_logic(dest);                                                \\\n  thumb_pc_offset(2);                                                         \\\n}\n\n#define thumb_hireg_op(expr)                                                  \\\n{                                                                             \\\n  thumb_pc_offset(4);                                                         \\\n  thumb_decode_hireg_op();                                                    \\\n  u32 dest = expr;                                                            \\\n  thumb_pc_offset(-2);                                                        \\\n  if(rd == 15)                                                                \\\n  {                                                                           \\\n    reg[REG_PC] = dest & ~0x01;                                               \\\n    thumb_update_pc();                                                        \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    reg[rd] = dest;                                                           \\\n  }                                                                           \\\n}                                                                             \\\n\n// Operation types: imm, mem_reg, mem_imm\n\n#define thumb_access_memory(access_type, op_type, address, reg_op,            \\\n mem_type)                                                                    \\\n{                                                                             \\\n  thumb_decode_##op_type();                                                   \\\n  access_type##_memory_##mem_type(address, reg_op);                           \\\n  thumb_pc_offset(2);                                                         \\\n}                                                                             \\\n\n#define thumb_block_address_preadjust_no_op()                                 \\\n\n#define thumb_block_address_preadjust_up()                                    \\\n  address += bit_count[reg_list] * 4                                          \\\n\n#define thumb_block_address_preadjust_down()                                  \\\n  address -= bit_count[reg_list] * 4                                          \\\n\n#define thumb_block_address_preadjust_push_lr()                               \\\n  address -= (bit_count[reg_list] + 1) * 4                                    \\\n\n#define thumb_block_address_postadjust_no_op()                                \\\n\n#define thumb_block_address_postadjust_up()                                   \\\n  address += offset                                                           \\\n\n#define thumb_block_address_postadjust_down()                                 \\\n  address -= offset                                                           \\\n\n#define thumb_block_address_postadjust_pop_pc()                               \\\n  load_memory_u32(address + offset, pc);                                      \\\n  pc &= ~0x01;                                                                \\\n  reg[REG_PC] = pc;                                                           \\\n  address += offset + 4                                                       \\\n\n#define thumb_block_address_postadjust_push_lr()                              \\\n  store_memory_u32(address + offset, reg[REG_LR]);                            \\\n\n#define thumb_block_memory_wb_load(base_reg)                                  \\\n  if(!((reg_list >> base_reg) & 0x01))                                        \\\n  {                                                                           \\\n    reg[base_reg] = address;                                                  \\\n  }                                                                           \\\n\n#define thumb_block_memory_wb_store(base_reg)                                 \\\n  reg[base_reg] = address                                                     \\\n\n#define thumb_block_memory(access_type, pre_op, post_op, base_reg)            \\\n{                                                                             \\\n  u32 i;                                                                      \\\n  u32 offset = 0;                                                             \\\n  thumb_decode_rlist();                                                       \\\n  using_register(thumb, base_reg, memory_base);                               \\\n  u32 address = reg[base_reg] & ~0x03;                                        \\\n  thumb_block_address_preadjust_##pre_op();                                   \\\n                                                                              \\\n  for(i = 0; i < 8; i++)                                                      \\\n  {                                                                           \\\n    if((reg_list >> i) & 1)                                                   \\\n    {                                                                         \\\n      access_type##_aligned32(address + offset, reg[i]);                      \\\n      offset += 4;                                                            \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  thumb_pc_offset(2);                                                         \\\n                                                                              \\\n  thumb_block_address_postadjust_##post_op();                                 \\\n  thumb_block_memory_wb_##access_type(base_reg);                              \\\n}                                                                             \\\n\n#define thumb_conditional_branch(condition)                                   \\\n{                                                                             \\\n  thumb_decode_branch_cond();                                                 \\\n  if(condition)                                                               \\\n  {                                                                           \\\n    thumb_pc_offset((offset * 2) + 4);                                        \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    thumb_pc_offset(2);                                                       \\\n  }                                                                           \\\n}                                                                             \\\n\n// When a mode change occurs from non-FIQ to non-FIQ retire the current\n// reg[13] and reg[14] into reg_mode[cpu_mode][5] and reg_mode[cpu_mode][6]\n// respectively and load into reg[13] and reg[14] reg_mode[new_mode][5] and\n// reg_mode[new_mode][6]. When swapping to/from FIQ retire/load reg[8]\n// through reg[14] to/from reg_mode[MODE_FIQ][0] through reg_mode[MODE_FIQ][6].\nu32* spsr_pointer;\nu32 reg_mode[7][7];\n\ncpu_mode_type cpu_modes[32] =\n{\n  MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID,\n  MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID,\n  MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID,\n  MODE_INVALID, MODE_USER, MODE_FIQ, MODE_IRQ, MODE_SUPERVISOR, MODE_INVALID,\n  MODE_INVALID, MODE_INVALID, MODE_ABORT, MODE_INVALID, MODE_INVALID,\n  MODE_INVALID, MODE_INVALID, MODE_UNDEFINED, MODE_INVALID, MODE_INVALID,\n  MODE_USER\n};\n\nu32 cpu_modes_cpsr[7] = { 0x10, 0x11, 0x12, 0x13, 0x17, 0x1B, 0x1F };\n\n// When switching modes set spsr[new_mode] to cpsr. Modifying PC as the\n// target of a data proc instruction will set cpsr to spsr[cpu_mode].\n// ARM/Thumb mode is stored in the flags directly, this is simpler than\n// shadowing it since it has a constant 1bit represenation.\n\nu32 last_mode;\n\nvoid switch_user_arm()\n{\n\tlast_mode = armcpu_switchMode(dynarec_cpu, USR);\n}\n\nvoid switch_back_arm()\n{\n\tarmcpu_switchMode(dynarec_cpu, last_mode);\n}\n\n/*void dynarec_irq_interrupt()\n{\n    // Interrupt handler in BIOS\n    reg_mode[MODE_IRQ][6] = reg[REG_PC] + 4;\n    spsr[MODE_IRQ] = reg[REG_CPSR];\n    //reg[REG_CPSR] = 0xD2;\n    reg[REG_PC] = dynarec_cpu->intVector + 0x18;\n\n\n    set_cpu_mode(MODE_IRQ);\n    reg[CPU_HALT_STATE] = CPU_ACTIVE;\n    reg[CHANGED_PC_STATUS] = 1;\n  }*/\n\nvoid cache_reg(u32 *old_reg)\n{\n\tmemcpy(dynarec_cpu->reg, old_reg, 32*4);\n\tdynarec_cpu->R= &dynarec_cpu->reg[0];\n\n//\tfor (int i = 0; i < 16; i++)\n//\t\tLOGE(\"cache_reg[%d] : %x\", i, dynarec_cpu->R[i]);\n\n//\tLOGE(\"cache_reg %x\", old_reg);\n}\n\nvoid load_reg(u32 *new_reg)\n{\n\tmemcpy(new_reg, dynarec_cpu->R, 32*4);\n\tdynarec_cpu->R = new_reg;\n\n//\tLOGE(\"load_reg %x\", new_reg);\n}\n\n\n\nvoid move_reg(u32 *new_reg)\n{\n\t//load_reg(new_reg);\n\tdynarec_cpu = &NDS_ARM9;\n\tdynarec_cpu->R[CHANGED_PC_STATUS] =1;\n\tdynarec_cpu->R[15]-=8;\n\tspsr_pointer = &(dynarec_cpu->SPSR.val);\n\n\tdynarec_cpu = &NDS_ARM7;\n\tdynarec_cpu->R[CHANGED_PC_STATUS] =1;\n\tdynarec_cpu->R[15]-=8;\n\tspsr_pointer = &(dynarec_cpu->SPSR.val);\n\n  //rom_translation_ptr = last_rom_translation_ptr = rom_translation_cache;\n  u32 offset = reinterpret_cast<u32>(rom_translation_ptr) & 0x00000FFF;\n  u8* page = rom_translation_ptr-offset;\n\n    int fail = mprotect(page, ROM_TRANSLATION_CACHE_SIZE+4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n  if(fail)\n  {\n\t  LOGE(\"rom protect change fail %s\", strerror(errno));\n//\t  exit(1);\n  }\n\n  /*u32 ram_offset= reinterpret_cast<u32>(ram_translation_ptr) & 0x00000FFF;\n  u8* ram_page= ram_translation_ptr-ram_offset;\n\n  int ram_protect_fail = mprotect(ram_page, RAM_TRANSLATION_CACHE_SIZE+4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n  if(ram_protect_fail)\n    {\n  \t  LOGE(\"ram protect change fail %s\", strerror(errno));\n  //\t  exit(1);\n    }*/\n\n  u32 bios_offset= reinterpret_cast<u32>(bios_translation_ptr) & 0x00000FFF;\n  u8* bios_page= bios_translation_ptr-bios_offset;\n\n\n  int bios_protect_fail = mprotect(bios_page, BIOS_TRANSLATION_CACHE_SIZE+4096, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n  if(bios_protect_fail)\n    {\n  \t  LOGE(\"bios protect change fail %s\", strerror(errno));\n  //\t  exit(1);\n    }\n\n  flush_translation_cache_rom();\n  flush_translation_cache_ram();\n  flush_translation_cache_bios();\n\n}\n#include \"MMU.h\"\nint start=0;\nbool yummy=true;\nbool log_out_enable =false;\nextern u32 total_cycle_arm9;\nextern u32 total_cycle_arm7;\nint test=0;\nu32 preserv[17];\n#define PROCNUM ARMCPU_ARM9\nu32 step_debug(u32 pc, u32 cycles)\n{\n\t/*if(dynarec_proc == ARMCPU_ARM9)\n\t\tif(dynarec_cpu->R[Dynarec::REG_CPSR] & 0x20)\n\t\t\tLOGE(\"pc %x instruct %x\", pc, _MMU_read16<ARMCPU_ARM9, MMU_AT_CODE>(pc));\n\t\t\telse\n\t\t\t{\n\t\t\tLOGE(\"pc %x instruct %x\", pc, _MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc));\n\t\t\t}*/\n\t/*if((0-cycles)>1000000 || enable)\n\t{LOGE(\"cycles %x\", 0-cycles);\n\tenable=true;\n\t}*/\n\n\tif(dynarec_proc == DEBUG_PROC && (pc <0 || start>0 /* || total_cycle_arm9 > 8893000*/) && yummy)\n\t{\n\t\tfor(int i=0;i<15;i++)\n\t\t\tLOGE(\"r%u %x\", i, dynarec_cpu->R[i]);\n\n\t\tif(dynarec_cpu->R[Dynarec::REG_CPSR] & 0x20)\n\t\t\t{\n\t\t\t\tLOGE(\"t pc %x instruct %x r12 %x cycle_count %u\", pc, _MMU_read16(dynarec_proc, MMU_AT_CODE,pc),dynarec_cpu->R[12], (0-cycles-1)*2);\n\n\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\n\t\t\t\t\tLOGE(\"a pc %x instruct %x  r12 %x cycle_count %u\", pc, _MMU_read32(dynarec_proc, MMU_AT_CODE,pc), dynarec_cpu->R[12], (0-cycles-1)*2);\n\t\t\t\t}\n\n\t\tLOGE(\"cpsr %x\", dynarec_cpu->R[Dynarec::REG_CPSR]);\n\t\t//start++;\n\t\tyummy=false;\n\t\tlog_out_enable=true;\n\t\t/*if(start>0)\n\t\t{\n\t\t\tsleep(10);\n\t\t\texit(0);\n\t\t}*/\n\t}\n\n\tbool cond_sat = pc == 0x20cdae8  ;//(_MMU_read16(0, MMU_AT_DATA, 0x4000180) == 0x606 && NDS_ARM9.R[0] == 0x6);// _MMU_read32(dynarec_proc, MMU_AT_DATA,0x2328880) ==0x2320828;//dynarec_cpu->R[14] == 0x20159f0 && dynarec_cpu->R[0] == 0x2320828;\n\n\tif(dynarec_proc == DEBUG_PROC && (cond_sat|| start>0 /* || total_cycle_arm9 > 8893000*/) && log_out_enable)\n\t\t{\n\t\t\t//for(int i=0;i<15;i++)\n\t\t\t//\t\t\tLOGE(\"r%u %x\", i, dynarec_cpu->R[i]);\n\n\t\t\tu32 arm7_instruct;\n\n\t\t\tif(NDS_ARM7.R[Dynarec::REG_CPSR] & 0x20)\n\t\t\t{\n\t\t\t\tarm7_instruct = _MMU_read16(dynarec_proc, MMU_AT_CODE,NDS_ARM7.R[15]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tarm7_instruct = _MMU_read32(dynarec_proc, MMU_AT_CODE,NDS_ARM7.R[15]);\n\t\t\t}\n\n\t\t\tif(dynarec_cpu->R[Dynarec::REG_CPSR] & 0x20)\n\t\t\t\t{\n\t\t\t\t\tLOGE(\"t pc %x instruct %x cpsr %x sp %x lr %x\", pc, _MMU_read16(dynarec_proc, MMU_AT_CODE,pc), dynarec_cpu->R[16], dynarec_cpu->R[13], dynarec_cpu->R[14]);\n\n\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\n\t\t\t\t\t\tLOGE(\"a pc %x instruct %x cpsr %x sp %x lr %x\", pc, _MMU_read32(dynarec_proc, MMU_AT_CODE,pc),dynarec_cpu->R[16], dynarec_cpu->R[13], dynarec_cpu->R[14]);\n\t\t\t\t\t}\n\n\t\t\t//LOGE(\"cpsr %x\", dynarec_cpu->R[Dynarec::REG_CPSR]);\n\t\t\tstart++;\n\n\t\t\t//for(int i=0;i<15;i++)\n\t\t\t//\t\t\t\t\t\tLOGE(\"old r%u %x\", i, preserv[i]);\n\n\t\t\t/*\t\t\tif(preserv[Dynarec::REG_CPSR] & 0x20)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tLOGE(\"old pc %x instruct %x r0 %x r4 %x r8 %x cycle_count %u\", preserv[15], _MMU_read16(dynarec_proc, MMU_AT_CODE,preserv[15]), preserv[0], preserv[4], preserv[8], (0-cycles-1)*2);\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\t\tLOGE(\"old pc %x instruct %x r0 %x r4 %x r8 %x cycle_count %u\", preserv[15], _MMU_read32(dynarec_proc, MMU_AT_CODE,preserv[15]),preserv[0], preserv[4],  preserv[8],(0-cycles-1)*2);\n\t\t\t\t\t\t\t\t}*/\n\n\t\t\t//\t\t\tLOGE(\"old cpsr %x\", preserv[Dynarec::REG_CPSR]);\n\n\t\t\tif(pc == 0x20cc6e4)\n\t\t\t{\n\t\t\t\tLOGE(\"hit\");\n\t\t\t}\n\t\t}\n\n\tif(dynarec_proc == DEBUG_PROC)\n\t{\n\t\tfor(int i=0;i<=16;i++)\n\t\t\tpreserv[i]=dynarec_cpu->R[i];\n\n\t\tpreserv[15]=pc;\n\t}\n\n\n\t/*if(dynarec_cpu->R[Dynarec::REG_CPSR] & 0x20)\n\t\t{\n\t\t\tif(_MMU_read16(dynarec_proc, MMU_AT_CODE,pc) == 0)\n\t\t\t{\n\t\t\t\tLOGE(\"thumb zero instruct %x pc %x\", dynarec_proc, pc);\n\t\t\t\tsleep(10);\n\t\t\t\texit(0);\n\n\t\t\t}\n\t\t}\n\telse if( _MMU_read32(dynarec_proc, MMU_AT_CODE,pc) == 0)\n\t{\n\t\tLOGE(\"arm zero instruct %x pc %x\", dynarec_proc, pc);\n\t\tsleep(10);\n\t\texit(0);\n\n\t}*/\n\n\n\t//LOGE(\"cycle counter %x\", 0-cycles);\n\n\t/*if(((pc == 0x200c224)|| start>0) && yummy && dynarec_proc ==0)\n\t{\n\t\t//LOGE(\"pc %x instruct %x cycles %u\", pc,_MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc), 0-cycles-1);\n\t\t\tfor(int i=0;i<15;i++)\n\t\t\t\t\tLOGE(\"r%u %x\", i, dynarec_cpu->R[i]);\n\n\tif(dynarec_cpu->R[Dynarec::REG_CPSR] & 0x20)\n\t{\n\t\tLOGE(\"pc %x instruct %x cycle %u\", pc, _MMU_read16(dynarec_proc, MMU_AT_CODE,pc), total_cycle_arm9);\n\n\t}\n\t\telse\n\t\t{\n\n\t\t\tLOGE(\"pc %x instruct %x cycle %u\", pc, _MMU_read32(dynarec_proc, MMU_AT_CODE,pc), total_cycle_arm9);\n\t\t}\n\t\tLOGE(\"cpsr %x\", dynarec_cpu->R[Dynarec::REG_CPSR]);\n\t\t//LOGE(\"spsr %x spsr irq %x\", dynarec_cpu->SPSR.val, dynarec_cpu->SPSR_irq.val);\n\t\t//LOGE(\"cycles %x\", 0-cycles);\n\t\t//exit(1);\n\t\t//yummy=false\n\t\t//if(pc == 0x2036c50)\n\t\t//sleep(10);\n\t\t//exit(0);\n\t\t//enable=true;\n\t\t//yummy=false;\n\t\tstart++;\n\t}*/\n\n\t\t\t//LOGE(\"cpsr %x\", reg[Dynarec::REG_CPSR]);\n\n\t/*for(int i=0;i<15;i++)\n\tif(reg[i] == 0x027e4280)\n\t{\n\t\tfor(int i=0;i<15;i++)\n\t\t\t\t\t\t\tLOGE(\"r%u %x\", i, reg[i]);\n\n\t\t\tif(reg[Dynarec::REG_CPSR] & 0x20)\n\t\t\t\tLOGE(\"pc %x instruct %x\", pc, _MMU_read16<ARMCPU_ARM9, MMU_AT_CODE>(pc));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLOGE(\"pc %x instruct %x\", pc, _MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc));\n\t\t\t\t}\n\t\t\t\tLOGE(\"cpsr %x\", reg[Dynarec::REG_CPSR]);\n\t\t\t\texit(0);\n\t}*/\n\n\n\n\t/*if(((pc ==  0x200c224 )|| start>0) && enable && dynarec_proc ==0)\n\t{\n\t\tfor(int i=0;i<15;i++)\n\t\t\t\t\tLOGE(\"r%u %x\", i, dynarec_cpu->R[i]);\n\t\tif(dynarec_cpu->R[16] & 0x20)\n\t\t\t\tLOGE(\"pc %x instruct %x r8 %x r13 %x cycle count %u val %x\", pc, _MMU_read16(dynarec_proc, MMU_AT_CODE,pc), dynarec_cpu->R[8], dynarec_cpu->R[13], total_cycle_arm9,\n\t\t\t\t\t\t_MMU_read32(dynarec_proc, MMU_AT_DATA,0x380ff28));\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLOGE(\"pc %x instruct %x r8 %x r13 %x cycle count %u val %x\", pc, _MMU_read32(dynarec_proc, MMU_AT_CODE,pc), dynarec_cpu->R[8], dynarec_cpu->R[13], total_cycle_arm9,\n\t\t\t\t\t\t\t_MMU_read32(dynarec_proc, MMU_AT_DATA,0x380ff30));\n\t\t\t\t}\n\t\tLOGE(\"cpsr %x\", dynarec_cpu->R[16]);\n\t\t//LOGE(\"spsr %x spsr irq %x\", dynarec_cpu->SPSR.val, dynarec_cpu->SPSR_irq.val);\n\t\tstart++;\n\t}*/\n\n\t/*if(joker() && yummy)\n\t{\n\t\tfor(int i=0;i<15;i++)\n\t\t\t\t\t\t\tLOGE(\"r%u %x\", i, reg[i]);\n\t\t\t\tLOGE(\"pc %x instruct %x\", pc, _MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc));\n\t\t\t\tLOGE(\"cpsr %x\", reg[Dynarec::REG_CPSR]);\n\t\t\t\tyummy=false;\n\t}*/\n\n\t/*if(reg[Dynarec::REG_CPSR] & 0x20)\n\t\t\t\t\tLOGE(\"pc %x instruct %x\", pc, _MMU_read16<ARMCPU_ARM9, MMU_AT_CODE>(pc));\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tLOGE(\"pc %x instruct %x\", pc, _MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc));\n\t\t\t\t\t}*/\n\n\t//if(start>100){\n\n\t\t//log_out_enable=false;}\n\n\t/*if((test != dynarec_cpu->SPSR_irq.val) && dynarec_proc ==1 )\n\t\t{\n\n\t\t\ttest = dynarec_cpu->SPSR_irq.val;\n\t\t\tLOGE(\"uh oh %x pc %x cpsr %x spsr %x cycle count %u\", test, pc, dynarec_cpu->R[16], dynarec_cpu->SPSR.val, total_cycle_arm9);\n\t\t}*/\n\n\t/*if((test != _MMU_read32<ARMCPU_ARM9, MMU_AT_DATA>(0x027e3a40)))\n\t{\n\n\t\ttest = _MMU_read32<ARMCPU_ARM9, MMU_AT_DATA>(0x027e3a40);\n\t\tLOGE(\"uh oh %x pc %x\", test, pc);\n\t}*/\n//if(yummy){LOGE(\"pc %x instruct %x\", pc, _MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc));}\n\t//if(yummy){LOGE(\"r0 %x\", reg[0]);}\n\t//if(yummy)LOGE(\"cpsr %x instruct %x\", reg[Dynarec::REG_CPSR]);\n\n\t//if(pc == 0)yummy=false;\n\n\t\t\t\t/*if(_MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc) >>28 == 0xF && enable)\n\t\t\t\t{\n\t\t\t\t\tLOGE(\"yo %x pc %x\", _MMU_read32<ARMCPU_ARM9, MMU_AT_CODE>(pc), pc);\n\t\t\t\t\t//exit(0);\n\t\t\t\t}*/\n\t\t\t\t//LOGE(\"CPSR %x\", reg[Dynarec::REG_CPSR]);\n\t\t\t\t//start++;\n\t//}\n//if(start==50)\n//exit(0);\n\t//LOGE(\"cycle counter %x\", cycles);\n\n\treturn 0;\n}\n\nu32 instruction_count = 0;\n\nu32 output_field = 0;\nconst u32 num_output_fields = 2;\n\nu32 last_instruction = 0;\n\nu32 in_interrupt = 0;\n\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/cpu.h",
    "content": "/* gameplaySP\n *\n * Copyright (C) 2006 Exophase <exophase@gmail.com>\n * Copyright (C) 2012 Qingping He\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License as\n * published by the Free Software Foundation; either version 2 of\n * the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef CPU_H\n#define CPU_H\n\n\n#include \"types.h\"\n#include \"MMU.h\"\n#include \"MMU_timing.h\"\n#include <android/log.h>\n\n#define function_cc\n#define DEBUG_PROC ARMCPU_ARM9\n// System mode and user mode are represented as the same here\n\nnamespace Dynarec{\ntypedef enum\n{\n  MODE_USER,\n  MODE_IRQ,\n  MODE_FIQ,\n  MODE_SUPERVISOR,\n  MODE_ABORT,\n  MODE_UNDEFINED,\n  MODE_INVALID\n} cpu_mode_type;\n\ntypedef enum\n{\n  CPU_ALERT_NONE,\n  CPU_ALERT_HALT,\n  CPU_ALERT_SMC,\n  CPU_ALERT_IRQ\n} cpu_alert_type;\n\ntypedef enum\n{\n  CPU_ACTIVE,\n  CPU_HALT,\n  CPU_STOP\n} cpu_halt_type;\n\ntypedef enum\n{\n  IRQ_NONE = 0x0000,\n  IRQ_VBLANK = 0x0001,\n  IRQ_HBLANK = 0x0002,\n  IRQ_VCOUNT = 0x0004,\n  IRQ_TIMER0 = 0x0008,\n  IRQ_TIMER1 = 0x0010,\n  IRQ_TIMER2 = 0x0020,\n  IRQ_TIMER3 = 0x0040,\n  IRQ_SERIAL = 0x0080,\n  IRQ_DMA0 = 0x0100,\n  IRQ_DMA1 = 0x0200,\n  IRQ_DMA2 = 0x0400,\n  IRQ_DMA3 = 0x0800,\n  IRQ_KEYPAD = 0x1000,\n  IRQ_GAMEPAK = 0x2000,\n} irq_type;\n\ntypedef enum\n{\n  REG_SP            = 13,\n  REG_LR            = 14,\n  REG_PC            = 15,\n  REG_CPSR          = 16,\n  REG_SAVE          = 21,\n  REG_SAVE2         = 22,\n  REG_SAVE3         = 23,\n  CPU_MODE          = 29,\n  CPU_HALT_STATE    = 30,\n  CHANGED_PC_STATUS = 31\n} ext_reg_numbers;\n\ntypedef enum\n{\n  STEP,\n  PC_BREAKPOINT,\n  VCOUNT_BREAKPOINT,\n  Z_BREAKPOINT,\n  COUNTDOWN_BREAKPOINT,\n  COUNTDOWN_BREAKPOINT_B,\n  COUNTDOWN_BREAKPOINT_C,\n  STEP_RUN,\n  RUN\n} debug_state;\n\ntypedef enum\n{\n  TRANSLATION_REGION_RAM,\n  TRANSLATION_REGION_ROM,\n  TRANSLATION_REGION_BIOS\n} translation_region_type;\n};\n\n\nusing namespace Dynarec;\n\nextern \"C\"\n{\n\nextern debug_state current_debug_state;\nextern u32 instruction_count;\nextern u32 last_instruction;\n\nvoid execute_arm(u32 cycles);\nvoid dynarec_irq_interrupt();\nvoid set_cpu_mode(cpu_mode_type new_mode);\n\nvoid debug_on();\nvoid debug_off(debug_state new_debug_state);\n\nu32 function_cc execute_load_u8(u32 address);\nu32 function_cc execute_load_u16(u32 address);\nu32 function_cc execute_load_u32(u32 address);\nu32 function_cc execute_load_s8(u32 address);\nu32 function_cc execute_load_s16(u32 address);\nvoid function_cc execute_store_u8(u32 address, u32 source);\nvoid function_cc execute_store_u16(u32 address, u32 source);\nvoid function_cc execute_store_u32(u32 address, u32 source);\nu32 function_cc execute_arm_translate(u32 cycles);\nvoid init_translater();\n\nu8 function_cc *block_lookup_address_arm(u32 pc);\nu8 function_cc *block_lookup_address_thumb(u32 pc);\ns32 translate_block_arm(u32 pc, translation_region_type translation_region,\n u32 smc_enable);\ns32 translate_block_thumb(u32 pc, translation_region_type translation_region,\n u32 smc_enable);\n\n#ifdef PSP_BUILD\n\n#define ROM_TRANSLATION_CACHE_SIZE (1024 * 512 * 4)\n#define RAM_TRANSLATION_CACHE_SIZE (1024 * 384)\n#define BIOS_TRANSLATION_CACHE_SIZE (1024 * 128)\n#define TRANSLATION_CACHE_LIMIT_THRESHOLD (1024)\n\n#else\n\n#define ROM_TRANSLATION_CACHE_SIZE (1024 * 512 * 4 * 5)\n#define RAM_TRANSLATION_CACHE_SIZE (1024 * 384 * 2)\n#define BIOS_TRANSLATION_CACHE_SIZE (1024 * 128 * 2)\n#define TRANSLATION_CACHE_LIMIT_THRESHOLD (1024 * 32)\n\n#endif\n\nextern u8 rom_translation_cache[ROM_TRANSLATION_CACHE_SIZE];\n//extern u8 ram_translation_cache[RAM_TRANSLATION_CACHE_SIZE];\nextern u8 bios_translation_cache[BIOS_TRANSLATION_CACHE_SIZE];\nextern u8 *rom_translation_ptr;\nextern u8 *ram_translation_ptr;\nextern u8 *bios_translation_ptr;\n\n#define DYNAREC_PAGE_TABLE_SIZE 1024*64\n\nextern u32** dynarec_page_table[DYNAREC_PAGE_TABLE_SIZE];\n\n#define MAX_TRANSLATION_GATES 8\n\nextern u32 idle_loop_target_pc;\nextern u32 force_pc_update_target;\nextern u32 iwram_stack_optimize;\nextern u32 allow_smc_ram_u8;\nextern u32 allow_smc_ram_u16;\nextern u32 allow_smc_ram_u32;\nextern u32 direct_map_vram;\nextern u32 translation_gate_targets;\nextern u32 translation_gate_target_pc[MAX_TRANSLATION_GATES];\n\nextern u32 in_interrupt;\n\n#define ROM_BRANCH_HASH_SIZE (1024 * 64)\n\n/* EDIT: Shouldn't this be extern ?! */\nextern u32 *rom_branch_hash[ROM_BRANCH_HASH_SIZE];\n\nvoid flush_translation_cache_rom();\nvoid flush_translation_cache_ram();\nvoid flush_translation_cache_bios();\nvoid dump_translation_cache();\n\nextern u32* spsr_pointer;\nextern u32 reg_mode[7][7];\n\nextern cpu_mode_type cpu_modes[32];\nextern const u32 psr_masks[16];\n\nextern u32 breakpoint_value;\n\nextern u32 memory_region_access_read_u8[16];\nextern u32 memory_region_access_read_s8[16];\nextern u32 memory_region_access_read_u16[16];\nextern u32 memory_region_access_read_s16[16];\nextern u32 memory_region_access_read_u32[16];\nextern u32 memory_region_access_write_u8[16];\nextern u32 memory_region_access_write_u16[16];\nextern u32 memory_region_access_write_u32[16];\nextern u32 memory_reads_u8;\nextern u32 memory_reads_s8;\nextern u32 memory_reads_u16;\nextern u32 memory_reads_s16;\nextern u32 memory_reads_u32;\nextern u32 memory_writes_u8;\nextern u32 memory_writes_u16;\nextern u32 memory_writes_u32;\n\nextern void write_smc_check(u32 adr);\n\nextern u32 *reg;\nvoid init_cpu();\nvoid move_reg(u32* new_reg);\n\n#include <android/log.h>\n\n#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,   \"nds4droid\", __VA_ARGS__)\n\nFORCEINLINE void flush_page_table()\n{\n\tLOGE(\"flushing table\");\n\tu32 i;\n\tfor(i=0;i<DYNAREC_PAGE_TABLE_SIZE;i++)\n\t{\n\t\tif(dynarec_page_table[i])\n\t\t{\n\t\t\tfree((void*)(dynarec_page_table[i]));\n\t\t\tdynarec_page_table[i] = 0;\n\t\t}\n\t}\n}\n\nFORCEINLINE void add_adr(u32 adr, u32* val)\n{\n\tu32 idx = (adr & 0x0FFFFFFF)>>12;\n\tu32** page = dynarec_page_table[idx];\n\t\n\t/*if(*val == 0xe12fff3e || *val == 0xe381131a)\n\t{\n\t\t__android_log_print(ANDROID_LOG_ERROR,\"nds4droid\",\"%x was mapped to %x\",adr,*val);\n\n\t}*/\n\n\tif(page)\n\t{\n\t\tpage[(adr & 0xFFF)>>1] = val;\n\t}\n\telse\n\t{\n\t\tdynarec_page_table[idx] = (u32**)calloc(2048, 4);\n\t\tif(!dynarec_page_table[idx])\n\t\t\tLOGE(\"alloc for page table fail\");\n\n\t\t(dynarec_page_table[idx])[(adr & 0xFFF)>>1] = val;\n\t}\n}\n\nFORCEINLINE u32* retrieve_adr(u32 adr)\n{\n\tu32** page = dynarec_page_table[(adr & 0x0FFFFFFF)>>12];\n\tif(!page)\n\t\treturn NULL;\n\n\treturn (dynarec_page_table[(adr & 0x0FFFFFFF)>>12])[(adr & 0xFFF)>>1];\n}\n\nFORCEINLINE void wipe_bios()\n{\n\tfor(int i=0;i<0x10;i++)\n\t{\n\t\tif(dynarec_page_table[i & 0xFFFF0000])\n\t\t{\n\t\t\tfree((void*)(dynarec_page_table[i & 0xFFFF0000]));\n\t\t\tdynarec_page_table[i & 0xFFFF0000] = 0;\n\t\t}\n\t}\n}\n\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/cpu_threaded.cpp",
    "content": "/* gameplaySP\n *\n * Copyright (C) 2006 Exophase <exophase@gmail.com>\n * Copyright (C) 2012 Qingping He\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License as\n * published by the Free Software Foundation; either version 2 of\n * the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n// Not-so-important todo:\n// - stm reglist writeback when base is in the list needs adjustment\n// - block memory needs psr swapping and user mode reg swapping\n#include \"dynarec/cpu.h\"\n#include \"warm.h\"\n#include <android/log.h>\n\n#define PC_BUILD\n\nusing namespace Dynarec;\n\nextern \"C\" {\n\n#ifdef USE_PROFILER\n#pragma GCC optimize (\"O2\", \"no-stack-protector\", \"unroll-loops\", \"unswitch-loops\", \"no-profile-generate\")\n#else\n#pragma GCC optimize (\"O2\", \"no-stack-protector\", \"omit-frame-pointer\", \"unroll-loops\", \"unswitch-loops\", \"no-profile-generate\")\n#endif\n\n\n#define address8(base, offset)                                                \\\n  *((u8 *)((u8 *)base + (offset)))                                            \\\n\n#define address16(base, offset)                                               \\\n  *((u16 *)((u8 *)base + (offset)))                                           \\\n\n#define address32(base, offset)                                               \\\n  *((u32 *)((u8 *)base + (offset)))                                           \\\n\nu8 rom_translation_cache[ROM_TRANSLATION_CACHE_SIZE];\nu8 *rom_translation_ptr = rom_translation_cache;\n\n//u8 ram_translation_cache[RAM_TRANSLATION_CACHE_SIZE];\n//u8 *ram_translation_ptr = ram_translation_cache;\nu32 iwram_code_min = 0xFFFFFFFF;\nu32 iwram_code_max = 0xFFFFFFFF;\nu32 ewram_code_min = 0xFFFFFFFF;\nu32 ewram_code_max = 0xFFFFFFFF;\n\nu8 bios_translation_cache[BIOS_TRANSLATION_CACHE_SIZE];\nu8 *bios_translation_ptr = bios_translation_cache;\nu8 bios_rom[1024 * 32];\n\nu32 *rom_branch_hash[ROM_BRANCH_HASH_SIZE];\n\n// Default\nu32 idle_loop_target_pc = 0xFFFFFFFF;\nu32 force_pc_update_target = 0xFFFFFFFF;\nu32 translation_gate_target_pc[MAX_TRANSLATION_GATES];\nu32 translation_gate_targets = 0;\nu32 iwram_stack_optimize = 1;\nu32 allow_smc_ram_u8 = 1;\nu32 allow_smc_ram_u16 = 1;\nu32 allow_smc_ram_u32 = 1;\n\ntypedef struct {\n\tu8 *block_offset;\n\tu16 flag_data;\n\tu8 condition;\n\tu8 update_cycles;\n} block_data_type;\n\ntypedef struct {\n\tu32 branch_target;\n\tu8 *branch_source;\n} block_exit_type;\n\nconst u8 bit_count[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1,\n\t\t2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2,\n\t\t3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1,\n\t\t2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3,\n\t\t4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3,\n\t\t4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2,\n\t\t3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2,\n\t\t3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4,\n\t\t5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3,\n\t\t4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4,\n\t\t5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 };\n\n#define arm_decode_data_proc_reg()                                            \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_data_proc_imm()                                            \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 imm = opcode & 0xFF;                                                    \\\n  u32 imm_ror = ((opcode >> 8) & 0x0F) * 2                                    \\\n\n#define arm_decode_psr_reg()                                                  \\\n  u32 psr_field = (opcode >> 16) & 0x0F;                                      \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_psr_imm()                                                  \\\n  u32 psr_field = (opcode >> 16) & 0x0F;                                      \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 imm = opcode & 0xFF;                                                    \\\n  u32 imm_ror = ((opcode >> 8) & 0x0F) * 2                                    \\\n\n#define arm_decode_branchx()                                                  \\\n  u32 rn = opcode & 0x0F                                                      \\\n\n#define arm_decode_multiply()                                                 \\\n  u32 rd = (opcode >> 16) & 0x0F;                                             \\\n  u32 rn = (opcode >> 12) & 0x0F;                                             \\\n  u32 rs = (opcode >> 8) & 0x0F;                                              \\\n  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_q_mla() \\\n\t\t  u32 rd = (opcode >> 16) & 0x0F;                                             \\\n\t\t  u32 rn = (opcode >> 12) & 0x0F;                                             \\\n\t\t  u32 rs = (opcode >> 8) & 0x0F;                                              \\\n\t\t  u32 rm = opcode & 0x0F;                                                      \\\n\t\t  u32 clean_op = opcode & 0x0FF000F0\\\n\n#define arm_decode_q_mul() \\\n\t\t  u32 rd = (opcode >> 16) & 0x0F;                                             \\\n\t\t  u32 rs = (opcode >> 8) & 0x0F;                                              \\\n\t\t  u32 rm = opcode & 0x0F;                                                      \\\n\t\t  u32 clean_op = opcode & 0x0FF000F0\\\n\n#define arm_decode_q_op()  \\\n\t\t  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n\t\t  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n\t\t  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_clz()\\\n  u32 rm = opcode & 0x0F;\\\n  u32 rd = (opcode >> 12) & 0x0F\\\n\n#define arm_decode_multiply_long()                                            \\\n  u32 rdhi = (opcode >> 16) & 0x0F;                                           \\\n  u32 rdlo = (opcode >> 12) & 0x0F;                                           \\\n  u32 rs = (opcode >> 8) & 0x0F;                                              \\\n  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_swap()                                                     \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_half_trans_r()                                             \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_half_trans_of()                                            \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 offset = ((opcode >> 4) & 0xF0) | (opcode & 0x0F)                       \\\n\n#define arm_decode_data_trans_imm()                                           \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 offset = opcode & 0x0FFF                                                \\\n\n#define arm_decode_data_trans_reg()                                           \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 rd = (opcode >> 12) & 0x0F;                                             \\\n  u32 rm = opcode & 0x0F                                                      \\\n\n#define arm_decode_block_trans()                                              \\\n  u32 rn = (opcode >> 16) & 0x0F;                                             \\\n  u32 reg_list = opcode & 0xFFFF                                              \\\n\n#define arm_decode_branch()                                                   \\\n  s32 offset = ((s32)(opcode & 0xFFFFFF) << 8) >> 6                           \\\n\n#define thumb_decode_shift()                                                  \\\n  u32 imm = (opcode >> 6) & 0x1F;                                             \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07                                                      \\\n\n#define thumb_decode_add_sub()                                                \\\n  u32 rn = (opcode >> 6) & 0x07;                                              \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07                                                      \\\n\n#define thumb_decode_add_sub_imm()                                            \\\n  u32 imm = (opcode >> 6) & 0x07;                                             \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07                                                      \\\n\n#define thumb_decode_imm()                                                    \\\n  u32 imm = opcode & 0xFF                                                     \\\n\n#define thumb_decode_alu_op()                                                 \\\n  u32 rs = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07                                                      \\\n\n#define thumb_decode_hireg_op()                                               \\\n  u32 rs = (opcode >> 3) & 0x0F;                                              \\\n  u32 rd = ((opcode >> 4) & 0x08) | (opcode & 0x07)                           \\\n\n#define thumb_decode_mem_reg()                                                \\\n  u32 ro = (opcode >> 6) & 0x07;                                              \\\n  u32 rb = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07                                                      \\\n\n#define thumb_decode_mem_imm()                                                \\\n  u32 imm = (opcode >> 6) & 0x1F;                                             \\\n  u32 rb = (opcode >> 3) & 0x07;                                              \\\n  u32 rd = opcode & 0x07                                                      \\\n\n#define thumb_decode_add_sp()                                                 \\\n  u32 imm = opcode & 0x7F                                                     \\\n\n#define thumb_decode_rlist()                                                  \\\n  u32 reg_list = opcode & 0xFF                                                \\\n\n#define thumb_decode_branch_cond()                                            \\\n  s32 offset = (s8)(opcode & 0xFF)                                            \\\n\n#define thumb_decode_swi()                                                    \\\n  u32 comment = opcode & 0xFF                                                 \\\n\n#define thumb_decode_branch()                                                 \\\n  u32 offset = opcode & 0x07FF                                                \\\n\n#include \"arm_emit.h\"\n\n#define check_pc_region(pc)                                                   \\\n\n#define translate_arm_instruction()                                           \\\n  check_pc_region(pc);                                                        \\\n\topcode = _MMU_read32(dynarec_proc, MMU_AT_CODE, pc);                        \\\n\t/*if(opcode & 0x0E1000F0 == 0x000000D0)*/\\\n\t/*{*/\\\n\t/*if(block_print)LOGE(\"instruction before trans %x pc %x\", opcode, pc);*/\\\n\t\\\n  condition = block_data[block_data_position].condition;                      \\\n  \\\n  if((condition != last_condition) || (condition >= 0x20))                    \\\n    {                                                                           \\\n      if((last_condition & 0x0F) != 0x0E && (last_condition & 0x0F) != 0x0F)                                       \\\n      {                                                                         \\\n        generate_branch_patch_conditional_arm(backpatch_address, translation_ptr);  \\\n      }                                                                         \\\n                                                                                \\\n      last_condition = condition;                                               \\\n                                                                                \\\n      condition &= 0x0F;                                                        \\\n                                                                                \\\n      if(condition != 0x0E && condition != 0x0F)                                                     \\\n      {                                                                         \\\n        arm_conditional_block_header();                                         \\\n        cond_pc = pc;   \\\n      }                                                                         \\\n    }                                                                           \\\n    \\\n/*generate_step_debug(); */\\\n                                                                              \\\n  switch((opcode >> 20) & 0xFF)                                               \\\n  {                                                                           \\\n    case 0x00:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn], -rm */                                            \\\n          switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t    case 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, post, u16, half_reg);              \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t    case 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, down, post, u16, half_reg);                  \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t    case 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, post, u16, half_reg);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* MUL rd, rm, rs */                                                \\\n          arm_multiply(no, no);                                               \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* AND rd, rn, reg_op */                                              \\\n        arm_data_proc(and, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x01:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 0:                                                             \\\n            /* MULS rd, rm, rs */                                             \\\n            arm_multiply(no, yes);                                            \\\n            break;                                                            \\\n                                                                              \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], -rm */                                          \\\n            arm_access_memory(load, down, post, u16, half_reg);               \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], -rm */                                         \\\n            arm_access_memory(load, down, post, s8, half_reg);                \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], -rm */                                         \\\n            arm_access_memory(load, down, post, s16, half_reg);               \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ANDS rd, rn, reg_op */                                             \\\n        arm_data_proc(ands, reg_flags, flags);                                \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x02:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn], -rm */                                            \\\n\t\tswitch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, post, u16, half_reg);              \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, down, post, u16, half_reg);                  \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, post, u16, half_reg);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* MLA rd, rm, rs, rn */                                            \\\n          arm_multiply(yes, no);                                              \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* EOR rd, rn, reg_op */                                              \\\n        arm_data_proc(eor, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x03:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 0:                                                             \\\n            /* MLAS rd, rm, rs, rn */                                         \\\n            arm_multiply(yes, yes);                                           \\\n            break;                                                            \\\n                                                                              \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], -rm */                                          \\\n            arm_access_memory(load, down, post, u16, half_reg);               \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], -rm */                                         \\\n            arm_access_memory(load, down, post, s8, half_reg);                \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], -rm */                                         \\\n            arm_access_memory(load, down, post, s16, half_reg);               \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* EORS rd, rn, reg_op */                                             \\\n        arm_data_proc(eors, reg_flags, flags);                                \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x04:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn], -imm */                                             \\\n        switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, post, u16, half_imm);              \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, down, post, u16, half_imm);                  \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, post, u16,  half_imm);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* SUB rd, rn, reg_op */                                              \\\n        arm_data_proc(sub, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x05:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], -imm */                                         \\\n            arm_access_memory(load, down, post, u16, half_imm);               \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], -imm */                                        \\\n            arm_access_memory(load, down, post, s8, half_imm);                \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], -imm */                                        \\\n            arm_access_memory(load, down, post, s16, half_imm);               \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* SUBS rd, rn, reg_op */                                             \\\n        arm_data_proc(subs, reg, flags);                                      \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x06:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn], -imm */                                             \\\n\t\tswitch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, post, u16, half_imm);              \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, down, post, u16, half_imm);                  \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, post, u16,  half_imm);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* RSB rd, rn, reg_op */                                              \\\n        arm_data_proc(rsb, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x07:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], -imm */                                         \\\n            arm_access_memory(load, down, post, u16, half_imm);               \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], -imm */                                        \\\n            arm_access_memory(load, down, post, s8, half_imm);                \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], -imm */                                        \\\n            arm_access_memory(load, down, post, s16, half_imm);               \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* RSBS rd, rn, reg_op */                                             \\\n        arm_data_proc(rsbs, reg, flags);                                      \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x08:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn], +rm */                                            \\\n          switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, up, post, u16, half_reg);            \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, up, post, u16, half_reg);                 \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store,up, post, u16, half_reg);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* UMULL rd, rm, rs */                                              \\\n          arm_multiply_long(u64, no, no);                                     \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ADD rd, rn, reg_op */                                              \\\n        arm_data_proc(add, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x09:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 0:                                                             \\\n            /* UMULLS rdlo, rdhi, rm, rs */                                   \\\n            arm_multiply_long(u64, no, yes);                                  \\\n            break;                                                            \\\n                                                                              \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], +rm */                                          \\\n            arm_access_memory(load, up, post, u16, half_reg);                 \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], +rm */                                         \\\n            arm_access_memory(load, up, post, s8, half_reg);                  \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], +rm */                                         \\\n            arm_access_memory(load, up, post, s16, half_reg);                 \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ADDS rd, rn, reg_op */                                             \\\n        arm_data_proc(adds, reg, flags);                                      \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x0A:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn], +rm */                                            \\\n          switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, up, post, u16, half_reg);            \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, up, post, u16, half_reg);                 \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store,up, post, u16, half_reg);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* UMLAL rd, rm, rs */                                              \\\n          arm_multiply_long(u64_add, yes, no);                                \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ADC rd, rn, reg_op */                                              \\\n        arm_data_proc(adc, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x0B:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 0:                                                             \\\n            /* UMLALS rdlo, rdhi, rm, rs */                                   \\\n            arm_multiply_long(u64_add, yes, yes);                             \\\n            break;                                                            \\\n                                                                              \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], +rm */                                          \\\n            arm_access_memory(load, up, post, u16, half_reg);                 \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], +rm */                                         \\\n            arm_access_memory(load, up, post, s8, half_reg);                  \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], +rm */                                         \\\n            arm_access_memory(load, up, post, s16, half_reg);                 \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ADCS rd, rn, reg_op */                                             \\\n        arm_data_proc(adcs, reg, flags);                                      \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x0C:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn], +imm */                                           \\\n          switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, up, post, u16, half_imm);            \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, up, post, u16, half_imm);                 \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store,up, post, u16, half_imm);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* SMULL rd, rm, rs */                                              \\\n          arm_multiply_long(s64, no, no);                                     \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* SBC rd, rn, reg_op */                                              \\\n        arm_data_proc(sbc, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x0D:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 0:                                                             \\\n            /* SMULLS rdlo, rdhi, rm, rs */                                   \\\n            arm_multiply_long(s64, no, yes);                                  \\\n            break;                                                            \\\n                                                                              \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], +imm */                                         \\\n            arm_access_memory(load, up, post, u16, half_imm);                 \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], +imm */                                        \\\n            arm_access_memory(load, up, post, s8, half_imm);                  \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], +imm */                                        \\\n            arm_access_memory(load, up, post, s16, half_imm);                 \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* SBCS rd, rn, reg_op */                                             \\\n        arm_data_proc(sbcs, reg, flags);                                      \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x0E:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn], +imm */                                           \\\n          switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, up, post, u16, half_imm);            \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, up, post, u16, half_imm);                 \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store,up, post, u16, half_imm);                \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* SMLAL rd, rm, rs */                                              \\\n          arm_multiply_long(s64_add, yes, no);                                \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* RSC rd, rn, reg_op */                                              \\\n        arm_data_proc(rsc, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x0F:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 0:                                                             \\\n            /* SMLALS rdlo, rdhi, rm, rs */                                   \\\n            arm_multiply_long(s64_add, yes, yes);                             \\\n            break;                                                            \\\n                                                                              \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn], +imm */                                         \\\n            arm_access_memory(load, up, post, u16, half_imm);                 \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn], +imm */                                        \\\n            arm_access_memory(load, up, post, s8, half_imm);                  \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn], +imm */                                        \\\n            arm_access_memory(load, up, post, s16, half_imm);                 \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* RSCS rd, rn, reg_op */                                             \\\n        arm_data_proc(rscs, reg, flags);                                      \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x10:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n                                                                              \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn - rm] */                                            \\\n          switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, pre, u16, half_reg);            \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored, down, pre, u16, half_reg);                 \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, pre, u16, half_reg);               \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* SWP rd, rm, [rn] */                                              \\\n          arm_swap(u32);                                                      \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n    \t  switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0x50:                                                             \\\n\t\t\t  arm_q_op(add);                                            \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0x00:                                                             \\\n\t\t\t  arm_psr(reg, read, cpsr);                                             \\\n\t\t\t  break;                                                            \\\n\t\t\t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \t  \\\n\t\t\tdefault: \\\n\t\t\t\tarm_q_mla();\\\n\t\t\t\tbreak; \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x11:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn - rm] */                                          \\\n            arm_access_memory(load, down, pre, u16, half_reg);                \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn - rm] */                                         \\\n            arm_access_memory(load, down, pre, s8, half_reg);                 \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn - rm] */                                         \\\n            arm_access_memory(load, down, pre, s16, half_reg);                \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* TST rd, rn, reg_op */                                              \\\n        arm_data_proc_test(tst, reg_flags);                                   \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x12:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn - rm]! */                                             \\\n        switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, pre_wb, u16, half_reg);               \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored,down, pre_wb, u16, half_reg);                    \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, pre_wb, u16, half_reg);                 \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        if(opcode & 0x10)                                                     \\\n        {                                                                     \\\n        \tif((opcode & 0xF0) == 0x30)                                         \\\n        \t{                                                                 \\\n        \t\tarm_blx_reg();                                                \\\n        \t}                                                                 \\\n        \telse if((opcode & 0xF0) == 0x50)                                           \\\n\t      \t{                                                                     \\\n\t      \t\tarm_q_op(sub);                                                    \\\n\t      \t}                                                                     \\\n    \t    else   if((opcode & 0xb0) == 0x80) \\\n    \t    {  \\\n    \t      \tarm_q_mla();  \\\n    \t    }  \\\n            else if((opcode & 0xb0) == 0xA0)\\\n            {  \\\n            \tarm_q_mul();  \\\n            }  \\\n    \t    else  \\\n        \t{                                                                 \\\n        \t\t/* BX rn */                                                   \\\n\t\t\t\tarm_bx();                                                     \\\n        \t}                                                                 \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* MSR cpsr, rm */                                                  \\\n          arm_psr(reg, store, cpsr);                                          \\\n        }                                                                     \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x13:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn - rm]! */                                         \\\n            arm_access_memory(load, down, pre_wb, u16, half_reg);             \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn - rm]! */                                        \\\n            arm_access_memory(load, down, pre_wb, s8, half_reg);              \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn - rm]! */                                        \\\n            arm_access_memory(load, down, pre_wb, s16, half_reg);             \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* TEQ rd, rn, reg_op */                                              \\\n        arm_data_proc_test(teq, reg_flags);                                   \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x14:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        if(opcode & 0x20)                                                     \\\n        {                                                                     \\\n          /* STRH rd, [rn - imm] */                                           \\\n          switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, pre, u16, half_imm);               \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored,down, pre, u16, half_imm);                     \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, pre, u16, half_imm);                 \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n        }                                                                     \\\n        else                                                                  \\\n        {                                                                     \\\n          /* SWPB rd, rm, [rn] */                                             \\\n          arm_swap(u8);                                                       \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n    \t  if((opcode & 0xF0) == 0x50)                                           \\\n    \t  {                                                                     \\\n    \t  \tarm_q_op(dadd);                                                    \\\n    \t  }                                                                     \\\n    \t  else   if((opcode & 0xF0) == 0x00) \\\n    \t  {  \\\n    \t\t  /* MRS rd, spsr */                                                    \\\n        \tarm_psr(reg, read, spsr);                                             \\\n    \t  }    \\\n    \t  else  \\\n    \t  {  \\\n    \t     arm_q_mla();  \\\n    \t  }   \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x15:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn - imm] */                                         \\\n            arm_access_memory(load, down, pre, u16, half_imm);                \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn - imm] */                                        \\\n            arm_access_memory(load, down, pre, s8, half_imm);                 \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn - imm] */                                        \\\n            arm_access_memory(load, down, pre, s16, half_imm);                \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* CMP rn, reg_op */                                                  \\\n        arm_data_proc_test(cmp, reg);                                         \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x16:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn - imm]! */                                            \\\n        switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, down, pre_wb, u16, half_imm);               \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored,down, pre_wb, u16, half_imm);                     \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store, down, pre_wb, u16, half_imm);                 \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* MSR spsr, rm */                                                    \\\n\t\tswitch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0x50:                                                             \\\n\t\t\t  arm_q_op(dsub);                                                    \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0x10:                                                             \\\n\t\t\t  arm_clz();  \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0x00:                                                             \\\n\t\t\t  arm_psr(reg, store, spsr);                                            \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tdefault:                                                             \\\n\t\t\t  arm_q_mul();\\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x17:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn - imm]! */                                        \\\n            arm_access_memory(load, down, pre_wb, u16, half_imm);             \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn - imm]! */                                       \\\n            arm_access_memory(load, down, pre_wb, s8, half_imm);              \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn - imm]! */                                       \\\n            arm_access_memory(load, down, pre_wb, s16, half_imm);             \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* CMN rd, rn, reg_op */                                              \\\n        arm_data_proc_test(cmn, reg);                                         \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x18:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn + rm] */                                              \\\n        switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, up, pre, u16, half_reg);               \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored,up, pre, u16, half_reg);                     \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store,up, pre, u16, half_reg);                  \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ORR rd, rn, reg_op */                                              \\\n        arm_data_proc(orr, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x19:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn + rm] */                                          \\\n            arm_access_memory(load, up, pre, u16, half_reg);                  \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn + rm] */                                         \\\n            arm_access_memory(load, up, pre, s8, half_reg);                   \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn + rm] */                                         \\\n            arm_access_memory(load, up, pre, s16, half_reg);                  \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ORRS rd, rn, reg_op */                                             \\\n        arm_data_proc(orrs, reg_flags, flags);                                \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1A:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn + rm]! */                                             \\\n        switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, up, pre_wb, u16, half_reg);               \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored,up, pre_wb, u16, half_reg);                     \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store,up, pre_wb, u16, half_reg);                  \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* MOV rd, reg_op */                                                  \\\n        arm_data_proc_unary(mov, reg, no_flags);                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1B:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn + rm]! */                                         \\\n            arm_access_memory(load, up, pre_wb, u16, half_reg);               \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn + rm]! */                                        \\\n            arm_access_memory(load, up, pre_wb, s8, half_reg);                \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn + rm]! */                                        \\\n            arm_access_memory(load, up, pre_wb, s16, half_reg);               \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* MOVS rd, reg_op */                                                 \\\n        arm_data_proc_unary(movs, reg_flags, flags);                          \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1C:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn + imm] */                                             \\\n        switch((opcode & 0xF0))                                          \\\n\t\t  {                                                                     \\\n\t\t\tcase 0xD0:                                                             \\\n\t\t\t  /* LDRD rd, [rn + imm] */                                         \\\n\t\t\t  arm_access_memory(loadd, up, pre, u16, half_imm);               \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xF0:                                                             \\\n\t\t\t  /* STRD rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(stored,up, pre, u16, half_imm);                     \\\n\t\t\t  break;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t\tcase 0xB0:                                                             \\\n\t\t\t  /* STRH rd, [rn + imm] */                                        \\\n\t\t\t  arm_access_memory(store,up, pre, u16, half_imm);                  \\\n\t\t\t  break;                                                            \\\n\t\t  }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* BIC rd, rn, reg_op */                                              \\\n        arm_data_proc(bic, reg, no_flags);                                    \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1D:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn + imm] */                                         \\\n            arm_access_memory(load, up, pre, u16, half_imm);                  \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn + imm] */                                        \\\n            arm_access_memory(load, up, pre, s8, half_imm);                   \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn + imm] */                                        \\\n            arm_access_memory(load, up, pre, s16, half_imm);                  \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* BICS rd, rn, reg_op */                                             \\\n        arm_data_proc(bics, reg_flags, flags);                                \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1E:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        /* STRH rd, [rn + imm]! */                                            \\\n\t\tswitch((opcode >> 4) & 0x0F)                                          \\\n\t\t{                                                                     \\\n\t\t  case 0x0D:                                                             \\\n\t\t\t/* LDRD rd, [rn + imm] */                                         \\\n\t\t\tarm_access_memory(loadd, up, pre_wb, u16, half_imm);                \\\n\t\t\tbreak;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t  case 0x0F:                                                             \\\n\t\t\t/* STRD rd, [rn + imm] */                                        \\\n\t\t\tarm_access_memory(stored, up, pre_wb, u16, half_imm);                  \\\n\t\t\tbreak;                                                            \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t  case 0x0B:                                                             \\\n\t\t\t/* STRH rd, [rn + imm] */                                        \\\n\t\t\tarm_access_memory(store, up, pre_wb, u16, half_imm);                \\\n\t\t\tbreak;                                                            \\\n\t\t}                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* MVN rd, reg_op */                                                  \\\n        arm_data_proc_unary(mvn, reg, no_flags);                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1F:                                                                \\\n      if((opcode & 0x90) == 0x90)                                             \\\n      {                                                                       \\\n        switch((opcode >> 5) & 0x03)                                          \\\n        {                                                                     \\\n          case 1:                                                             \\\n            /* LDRH rd, [rn + imm]! */                                        \\\n            arm_access_memory(load, up, pre_wb, u16, half_imm);               \\\n            break;                                                            \\\n                                                                              \\\n          case 2:                                                             \\\n            /* LDRSB rd, [rn + imm]! */                                       \\\n            arm_access_memory(load, up, pre_wb, s8, half_imm);                \\\n            break;                                                            \\\n                                                                              \\\n          case 3:                                                             \\\n            /* LDRSH rd, [rn + imm]! */                                       \\\n            arm_access_memory(load, up, pre_wb, s16, half_imm);               \\\n            break;                                                            \\\n        }                                                                     \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* MVNS rd, rn, reg_op */                                             \\\n        arm_data_proc_unary(mvns, reg_flags, flags);                          \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x20:                                                                \\\n      /* AND rd, rn, imm */                                                   \\\n      arm_data_proc(and, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x21:                                                                \\\n      /* ANDS rd, rn, imm */                                                  \\\n      arm_data_proc(ands, imm_flags, flags);                                  \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x22:                                                                \\\n      /* EOR rd, rn, imm */                                                   \\\n      arm_data_proc(eor, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x23:                                                                \\\n      /* EORS rd, rn, imm */                                                  \\\n      arm_data_proc(eors, imm_flags, flags);                                  \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x24:                                                                \\\n      /* SUB rd, rn, imm */                                                   \\\n      arm_data_proc(sub, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x25:                                                                \\\n      /* SUBS rd, rn, imm */                                                  \\\n      arm_data_proc(subs, imm, flags);                                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x26:                                                                \\\n      /* RSB rd, rn, imm */                                                   \\\n      arm_data_proc(rsb, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x27:                                                                \\\n      /* RSBS rd, rn, imm */                                                  \\\n      arm_data_proc(rsbs, imm, flags);                                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x28:                                                                \\\n      /* ADD rd, rn, imm */                                                   \\\n      arm_data_proc(add, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x29:                                                                \\\n      /* ADDS rd, rn, imm */                                                  \\\n      arm_data_proc(adds, imm, flags);                                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2A:                                                                \\\n      /* ADC rd, rn, imm */                                                   \\\n      arm_data_proc(adc, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2B:                                                                \\\n      /* ADCS rd, rn, imm */                                                  \\\n      arm_data_proc(adcs, imm, flags);                                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2C:                                                                \\\n      /* SBC rd, rn, imm */                                                   \\\n      arm_data_proc(sbc, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2D:                                                                \\\n      /* SBCS rd, rn, imm */                                                  \\\n      arm_data_proc(sbcs, imm, flags);                                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2E:                                                                \\\n      /* RSC rd, rn, imm */                                                   \\\n      arm_data_proc(rsc, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2F:                                                                \\\n      /* RSCS rd, rn, imm */                                                  \\\n      arm_data_proc(rscs, imm, flags);                                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x30 ... 0x31:                                                       \\\n      /* TST rn, imm */                                                       \\\n      arm_data_proc_test(tst, imm);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x32:                                                                \\\n      /* MSR cpsr, imm */                                                     \\\n      arm_psr(imm, store, cpsr);                                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x33:                                                                \\\n      /* TEQ rn, imm */                                                       \\\n      arm_data_proc_test(teq, imm);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x34 ... 0x35:                                                       \\\n      /* CMP rn, imm */                                                       \\\n      arm_data_proc_test(cmp, imm);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x36:                                                                \\\n      /* MSR spsr, imm */                                                     \\\n      arm_psr(imm, store, spsr);                                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x37:                                                                \\\n      /* CMN rn, imm */                                                       \\\n      arm_data_proc_test(cmn, imm);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x38:                                                                \\\n      /* ORR rd, rn, imm */                                                   \\\n      arm_data_proc(orr, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x39:                                                                \\\n      /* ORRS rd, rn, imm */                                                  \\\n      arm_data_proc(orrs, imm_flags, flags);                                  \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3A:                                                                \\\n      /* MOV rd, imm */                                                       \\\n      arm_data_proc_unary(mov, imm, no_flags);                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3B:                                                                \\\n      /* MOVS rd, imm */                                                      \\\n      arm_data_proc_unary(movs, imm_flags, flags);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3C:                                                                \\\n      /* BIC rd, rn, imm */                                                   \\\n      arm_data_proc(bic, imm, no_flags);                                      \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3D:                                                                \\\n      /* BICS rd, rn, imm */                                                  \\\n      arm_data_proc(bics, imm_flags, flags);                                  \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3E:                                                                \\\n      /* MVN rd, imm */                                                       \\\n      arm_data_proc_unary(mvn, imm, no_flags);                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3F:                                                                \\\n      /* MVNS rd, imm */                                                      \\\n      arm_data_proc_unary(mvns, imm_flags, flags);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x40:                                                                \\\n      /* STR rd, [rn], -imm */                                                \\\n      arm_access_memory(store, down, post, u32, imm);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x41:                                                                \\\n      /* LDR rd, [rn], -imm */                                                \\\n      arm_access_memory(load, down, post, u32, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x42:                                                                \\\n      /* STRT rd, [rn], -imm */                                               \\\n      arm_access_memory(store, down, post, u32, imm);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x43:                                                                \\\n      /* LDRT rd, [rn], -imm */                                               \\\n      arm_access_memory(load, down, post, u32, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x44:                                                                \\\n      /* STRB rd, [rn], -imm */                                               \\\n      arm_access_memory(store, down, post, u8, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x45:                                                                \\\n      /* LDRB rd, [rn], -imm */                                               \\\n      arm_access_memory(load, down, post, u8, imm);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x46:                                                                \\\n      /* STRBT rd, [rn], -imm */                                              \\\n      arm_access_memory(store, down, post, u8, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x47:                                                                \\\n      /* LDRBT rd, [rn], -imm */                                              \\\n      arm_access_memory(load, down, post, u8, imm);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x48:                                                                \\\n      /* STR rd, [rn], +imm */                                                \\\n      arm_access_memory(store, up, post, u32, imm);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x49:                                                                \\\n      /* LDR rd, [rn], +imm */                                                \\\n      arm_access_memory(load, up, post, u32, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4A:                                                                \\\n      /* STRT rd, [rn], +imm */                                               \\\n      arm_access_memory(store, up, post, u32, imm);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4B:                                                                \\\n      /* LDRT rd, [rn], +imm */                                               \\\n      arm_access_memory(load, up, post, u32, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4C:                                                                \\\n      /* STRB rd, [rn], +imm */                                               \\\n      arm_access_memory(store, up, post, u8, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4D:                                                                \\\n      /* LDRB rd, [rn], +imm */                                               \\\n      arm_access_memory(load, up, post, u8, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4E:                                                                \\\n      /* STRBT rd, [rn], +imm */                                              \\\n      arm_access_memory(store, up, post, u8, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4F:                                                                \\\n      /* LDRBT rd, [rn], +imm */                                              \\\n      arm_access_memory(load, up, post, u8, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x50:                                                                \\\n      /* STR rd, [rn - imm] */                                                \\\n      arm_access_memory(store, down, pre, u32, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x51:                                                                \\\n      /* LDR rd, [rn - imm] */                                                \\\n      arm_access_memory(load, down, pre, u32, imm);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x52:                                                                \\\n      /* STR rd, [rn - imm]! */                                               \\\n      arm_access_memory(store, down, pre_wb, u32, imm);                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x53:                                                                \\\n      /* LDR rd, [rn - imm]! */                                               \\\n      arm_access_memory(load, down, pre_wb, u32, imm);                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x54:                                                                \\\n      /* STRB rd, [rn - imm] */                                               \\\n      arm_access_memory(store, down, pre, u8, imm);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x55:                                                                \\\n      /* LDRB rd, [rn - imm] */                                               \\\n      arm_access_memory(load, down, pre, u8, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x56:                                                                \\\n      /* STRB rd, [rn - imm]! */                                              \\\n      arm_access_memory(store, down, pre_wb, u8, imm);                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x57:                                                                \\\n      /* LDRB rd, [rn - imm]! */                                              \\\n      arm_access_memory(load, down, pre_wb, u8, imm);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x58:                                                                \\\n      /* STR rd, [rn + imm] */                                                \\\n      arm_access_memory(store, up, pre, u32, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x59:                                                                \\\n      /* LDR rd, [rn + imm] */                                                \\\n      arm_access_memory(load, up, pre, u32, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5A:                                                                \\\n      /* STR rd, [rn + imm]! */                                               \\\n      arm_access_memory(store, up, pre_wb, u32, imm);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5B:                                                                \\\n      /* LDR rd, [rn + imm]! */                                               \\\n      arm_access_memory(load, up, pre_wb, u32, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5C:                                                                \\\n      /* STRB rd, [rn + imm] */                                               \\\n      arm_access_memory(store, up, pre, u8, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5D:                                                                \\\n      /* LDRB rd, [rn + imm] */                                               \\\n      arm_access_memory(load, up, pre, u8, imm);                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5E:                                                                \\\n      /* STRB rd, [rn + imm]! */                                              \\\n      arm_access_memory(store, up, pre_wb, u8, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5F:                                                                \\\n      /* LDRBT rd, [rn + imm]! */                                             \\\n      arm_access_memory(load, up, pre_wb, u8, imm);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x60:                                                                \\\n      /* STR rd, [rn], -rm */                                                 \\\n      arm_access_memory(store, down, post, u32, reg);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x61:                                                                \\\n      /* LDR rd, [rn], -rm */                                                 \\\n      arm_access_memory(load, down, post, u32, reg);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x62:                                                                \\\n      /* STRT rd, [rn], -rm */                                                \\\n      arm_access_memory(store, down, post, u32, reg);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x63:                                                                \\\n      /* LDRT rd, [rn], -rm */                                                \\\n      arm_access_memory(load, down, post, u32, reg);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x64:                                                                \\\n      /* STRB rd, [rn], -rm */                                                \\\n      arm_access_memory(store, down, post, u8, reg);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x65:                                                                \\\n      /* LDRB rd, [rn], -rm */                                                \\\n      arm_access_memory(load, down, post, u8, reg);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x66:                                                                \\\n      /* STRBT rd, [rn], -rm */                                               \\\n      arm_access_memory(store, down, post, u8, reg);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x67:                                                                \\\n      /* LDRBT rd, [rn], -rm */                                               \\\n      arm_access_memory(load, down, post, u8, reg);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x68:                                                                \\\n      /* STR rd, [rn], +rm */                                                 \\\n      arm_access_memory(store, up, post, u32, reg);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x69:                                                                \\\n      /* LDR rd, [rn], +rm */                                                 \\\n      arm_access_memory(load, up, post, u32, reg);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x6A:                                                                \\\n      /* STRT rd, [rn], +rm */                                                \\\n      arm_access_memory(store, up, post, u32, reg);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x6B:                                                                \\\n      /* LDRT rd, [rn], +rm */                                                \\\n      arm_access_memory(load, up, post, u32, reg);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x6C:                                                                \\\n      /* STRB rd, [rn], +rm */                                                \\\n      arm_access_memory(store, up, post, u8, reg);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x6D:                                                                \\\n      /* LDRB rd, [rn], +rm */                                                \\\n      arm_access_memory(load, up, post, u8, reg);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x6E:                                                                \\\n      /* STRBT rd, [rn], +rm */                                               \\\n      arm_access_memory(store, up, post, u8, reg);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x6F:                                                                \\\n      /* LDRBT rd, [rn], +rm */                                               \\\n      arm_access_memory(load, up, post, u8, reg);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x70:                                                                \\\n      /* STR rd, [rn - rm] */                                                 \\\n      arm_access_memory(store, down, pre, u32, reg);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x71:                                                                \\\n      /* LDR rd, [rn - rm] */                                                 \\\n      arm_access_memory(load, down, pre, u32, reg);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x72:                                                                \\\n      /* STR rd, [rn - rm]! */                                                \\\n      arm_access_memory(store, down, pre_wb, u32, reg);                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x73:                                                                \\\n      /* LDR rd, [rn - rm]! */                                                \\\n      arm_access_memory(load, down, pre_wb, u32, reg);                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x74:                                                                \\\n      /* STRB rd, [rn - rm] */                                                \\\n      arm_access_memory(store, down, pre, u8, reg);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x75:                                                                \\\n      /* LDRB rd, [rn - rm] */                                                \\\n      arm_access_memory(load, down, pre, u8, reg);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x76:                                                                \\\n      /* STRB rd, [rn - rm]! */                                               \\\n      arm_access_memory(store, down, pre_wb, u8, reg);                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x77:                                                                \\\n      /* LDRB rd, [rn - rm]! */                                               \\\n      arm_access_memory(load, down, pre_wb, u8, reg);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x78:                                                                \\\n      /* STR rd, [rn + rm] */                                                 \\\n      arm_access_memory(store, up, pre, u32, reg);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x79:                                                                \\\n      /* LDR rd, [rn + rm] */                                                 \\\n      arm_access_memory(load, up, pre, u32, reg);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x7A:                                                                \\\n      /* STR rd, [rn + rm]! */                                                \\\n      arm_access_memory(store, up, pre_wb, u32, reg);                         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x7B:                                                                \\\n      /* LDR rd, [rn + rm]! */                                                \\\n      arm_access_memory(load, up, pre_wb, u32, reg);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x7C:                                                                \\\n      /* STRB rd, [rn + rm] */                                                \\\n      arm_access_memory(store, up, pre, u8, reg);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x7D:                                                                \\\n      /* LDRB rd, [rn + rm] */                                                \\\n      arm_access_memory(load, up, pre, u8, reg);                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x7E:                                                                \\\n      /* STRB rd, [rn + rm]! */                                               \\\n      arm_access_memory(store, up, pre_wb, u8, reg);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x7F:                                                                \\\n      /* LDRBT rd, [rn + rm]! */                                              \\\n      arm_access_memory(load, up, pre_wb, u8, reg);                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x80:                                                                \\\n      /* STMDA rn, rlist */                                                   \\\n      arm_block_memory(store, down_a, no, no);                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x81:                                                                \\\n      /* LDMDA rn, rlist */                                                   \\\n      arm_block_memory(load, down_a, no, no);                                 \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x82:                                                                \\\n      /* STMDA rn!, rlist */                                                  \\\n      arm_block_memory(store, down_a, down, no);                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x83:                                                                \\\n      /* LDMDA rn!, rlist */                                                  \\\n      arm_block_memory(load, down_a, down, no);                               \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x84:                                                                \\\n      /* STMDA rn, rlist^ */                                                  \\\n      arm_block_memory(store, down_a, no, yes);                               \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x85:                                                                \\\n      /* LDMDA rn, rlist^ */                                                  \\\n      arm_block_memory(load, down_a, no, yes);                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x86:                                                                \\\n      /* STMDA rn!, rlist^ */                                                 \\\n      arm_block_memory(store, down_a, down, yes);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x87:                                                                \\\n      /* LDMDA rn!, rlist^ */                                                 \\\n      arm_block_memory(load, down_a, down, yes);                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x88:                                                                \\\n      /* STMIA rn, rlist */                                                   \\\n      arm_block_memory(store, no, no, no);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x89:                                                                \\\n      /* LDMIA rn, rlist */                                                   \\\n      arm_block_memory(load, no, no, no);                                     \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x8A:                                                                \\\n      /* STMIA rn!, rlist */                                                  \\\n      arm_block_memory(store, no, up, no);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x8B:                                                                \\\n      /* LDMIA rn!, rlist */                                                  \\\n      arm_block_memory(load, no, up, no);                                     \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x8C:                                                                \\\n      /* STMIA rn, rlist^ */                                                  \\\n      arm_block_memory(store, no, no, yes);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x8D:                                                                \\\n      /* LDMIA rn, rlist^ */                                                  \\\n      arm_block_memory(load, no, no, yes);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x8E:                                                                \\\n      /* STMIA rn!, rlist^ */                                                 \\\n      arm_block_memory(store, no, up, yes);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x8F:                                                                \\\n      /* LDMIA rn!, rlist^ */                                                 \\\n      arm_block_memory(load, no, up, yes);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x90:                                                                \\\n      /* STMDB rn, rlist */                                                   \\\n      arm_block_memory(store, down_b, no, no);                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x91:                                                                \\\n      /* LDMDB rn, rlist */                                                   \\\n      arm_block_memory(load, down_b, no, no);                                 \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x92:                                                                \\\n      /* STMDB rn!, rlist */                                                  \\\n      arm_block_memory(store, down_b, down, no);                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x93:                                                                \\\n      /* LDMDB rn!, rlist */                                                  \\\n      arm_block_memory(load, down_b, down, no);                               \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x94:                                                                \\\n      /* STMDB rn, rlist^ */                                                  \\\n      arm_block_memory(store, down_b, no, yes);                               \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x95:                                                                \\\n      /* LDMDB rn, rlist^ */                                                  \\\n      arm_block_memory(load, down_b, no, yes);                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x96:                                                                \\\n      /* STMDB rn!, rlist^ */                                                 \\\n      arm_block_memory(store, down_b, down, yes);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x97:                                                                \\\n      /* LDMDB rn!, rlist^ */                                                 \\\n      arm_block_memory(load, down_b, down, yes);                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x98:                                                                \\\n      /* STMIB rn, rlist */                                                   \\\n      arm_block_memory(store, up, no, no);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x99:                                                                \\\n      /* LDMIB rn, rlist */                                                   \\\n      arm_block_memory(load, up, no, no);                                     \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9A:                                                                \\\n      /* STMIB rn!, rlist */                                                  \\\n      arm_block_memory(store, up, up, no);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9B:                                                                \\\n      /* LDMIB rn!, rlist */                                                  \\\n      arm_block_memory(load, up, up, no);                                     \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9C:                                                                \\\n      /* STMIB rn, rlist^ */                                                  \\\n      arm_block_memory(store, up, no, yes);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9D:                                                                \\\n      /* LDMIB rn, rlist^ */                                                  \\\n      arm_block_memory(load, up, no, yes);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9E:                                                                \\\n      /* STMIB rn!, rlist^ */                                                 \\\n      arm_block_memory(store, up, up, yes);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9F:                                                                \\\n      /* LDMIB rn!, rlist^ */                                                 \\\n      arm_block_memory(load, up, up, yes);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA0 ... 0xAF:                                                       \\\n    {                                                                         \\\n      /* B offset */                                                          \\\n\t\tif(condition == 0x0F)    \\\n\t\t{\\\narm_blx_imm();   \\\n}\\\n\t\t      else    \\\n\t\t      {\\\n      arm_b();                                                                \\\n}\\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    case 0xB0 ... 0xBF:                                                       \\\n    {                                                                         \\\n      /* BL offset */                                                         \\\n      if(condition == 0x0F)   \\\n      {\\\n    \t  arm_blx_imm();    \\\n      }\\\n      else     \\\n      {\\\n      arm_bl();                                                               \\\n      }\\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    case 0xC0 ... 0xEF:                                                       \\\n    {\\\n      /* coprocessor instructions, reserved on GBA */                         \\\n\t  if((opcode >> 20) & 0x01)\\\n\t  {\\\n\t\t  arm_mrc_emit();\\\n\t  }\\\n\t  else\\\n\t  {\\\n\t\t  arm_mcr_emit();\\\n\t  }\\\n\\\n      break;                                                                  \\\n    }\\\n                                                                              \\\n    case 0xF0 ... 0xFF:                                                       \\\n    {                                                                         \\\n      /* SWI comment */                                                       \\\n      arm_swi();                                                              \\\n      break;                                                                  \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  pc += 4                                                                     \\\n\n#define arm_flag_status()                                                     \\\n\nbool print_instruct=false;\n\n#define translate_thumb_instruction()                                         \\\n  flag_status = block_data[block_data_position].flag_data;                    \\\n  last_opcode = opcode;                                                       \\\n  opcode = _MMU_read16(dynarec_proc, MMU_AT_CODE, pc);                        \\\n  /*if(block_print)LOGE(\"instruction before trans %x pc %x\", opcode, pc);*/\\\n                                                                              \\\n  switch((opcode >> 8) & 0xFF)                                                \\\n  {                                                                           \\\n    case 0x00 ... 0x07:                                                       \\\n      /* LSL rd, rs, imm */                                                   \\\n      thumb_shift(shift, lsl, imm);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x08 ... 0x0F:                                                       \\\n      /* LSR rd, rs, imm */                                                   \\\n      thumb_shift(shift, lsr, imm);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x10 ... 0x17:                                                       \\\n      /* ASR rd, rs, imm */                                                   \\\n      thumb_shift(shift, asr, imm);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x18 ... 0x19:                                                       \\\n      /* ADD rd, rs, rn */                                                    \\\n      thumb_data_proc(add_sub, adds, reg, rd, rs, rn);                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1A ... 0x1B:                                                       \\\n      /* SUB rd, rs, rn */                                                    \\\n      thumb_data_proc(add_sub, subs, reg, rd, rs, rn);                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1C ... 0x1D:                                                       \\\n      /* ADD rd, rs, imm */                                                   \\\n      thumb_data_proc(add_sub_imm, adds, imm, rd, rs, imm);                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x1E ... 0x1F:                                                       \\\n      /* SUB rd, rs, imm */                                                   \\\n      thumb_data_proc(add_sub_imm, subs, imm, rd, rs, imm);                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x20:                                                                \\\n      /* MOV r0, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 0, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x21:                                                                \\\n      /* MOV r1, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 1, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x22:                                                                \\\n      /* MOV r2, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 2, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x23:                                                                \\\n      /* MOV r3, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 3, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x24:                                                                \\\n      /* MOV r4, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 4, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x25:                                                                \\\n      /* MOV r5, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 5, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x26:                                                                \\\n      /* MOV r6, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 6, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x27:                                                                \\\n      /* MOV r7, imm */                                                       \\\n      thumb_data_proc_unary(imm, movs, imm, 7, imm);                          \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x28:                                                                \\\n      /* CMP r0, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 0, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x29:                                                                \\\n      /* CMP r1, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 1, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2A:                                                                \\\n      /* CMP r2, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 2, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2B:                                                                \\\n      /* CMP r3, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 3, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2C:                                                                \\\n      /* CMP r4, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 4, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2D:                                                                \\\n      /* CMP r5, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 5, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2E:                                                                \\\n      /* CMP r6, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 6, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x2F:                                                                \\\n      /* CMP r7, imm */                                                       \\\n      thumb_data_proc_test(imm, cmp, imm, 7, imm);                            \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x30:                                                                \\\n      /* ADD r0, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 0, 0, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x31:                                                                \\\n      /* ADD r1, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 1, 1, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x32:                                                                \\\n      /* ADD r2, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 2, 2, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x33:                                                                \\\n      /* ADD r3, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 3, 3, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x34:                                                                \\\n      /* ADD r4, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 4, 4, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x35:                                                                \\\n      /* ADD r5, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 5, 5, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x36:                                                                \\\n      /* ADD r6, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 6, 6, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x37:                                                                \\\n      /* ADD r7, imm */                                                       \\\n      thumb_data_proc(imm, adds, imm, 7, 7, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x38:                                                                \\\n      /* SUB r0, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 0, 0, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x39:                                                                \\\n      /* SUB r1, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 1, 1, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3A:                                                                \\\n      /* SUB r2, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 2, 2, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3B:                                                                \\\n      /* SUB r3, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 3, 3, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3C:                                                                \\\n      /* SUB r4, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 4, 4, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3D:                                                                \\\n      /* SUB r5, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 5, 5, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3E:                                                                \\\n      /* SUB r6, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 6, 6, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x3F:                                                                \\\n      /* SUB r7, imm */                                                       \\\n      thumb_data_proc(imm, subs, imm, 7, 7, imm);                             \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x40:                                                                \\\n      switch((opcode >> 6) & 0x03)                                            \\\n      {                                                                       \\\n        case 0x00:                                                            \\\n          /* AND rd, rs */                                                    \\\n          thumb_data_proc(alu_op, ands, reg, rd, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x01:                                                            \\\n          /* EOR rd, rs */                                                    \\\n          thumb_data_proc(alu_op, eors, reg, rd, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x02:                                                            \\\n          /* LSL rd, rs */                                                    \\\n          thumb_shift(alu_op, lsl, reg);                                      \\\n          break;                                                              \\\n                                                                              \\\n        case 0x03:                                                            \\\n          /* LSR rd, rs */                                                    \\\n          thumb_shift(alu_op, lsr, reg);                                      \\\n          break;                                                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x41:                                                                \\\n      switch((opcode >> 6) & 0x03)                                            \\\n      {                                                                       \\\n        case 0x00:                                                            \\\n          /* ASR rd, rs */                                                    \\\n          thumb_shift(alu_op, asr, reg);                                      \\\n          break;                                                              \\\n                                                                              \\\n        case 0x01:                                                            \\\n          /* ADC rd, rs */                                                    \\\n          thumb_data_proc(alu_op, adcs, reg, rd, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x02:                                                            \\\n          /* SBC rd, rs */                                                    \\\n          thumb_data_proc(alu_op, sbcs, reg, rd, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x03:                                                            \\\n          /* ROR rd, rs */                                                    \\\n          thumb_shift(alu_op, ror, reg);                                      \\\n          break;                                                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x42:                                                                \\\n      switch((opcode >> 6) & 0x03)                                            \\\n      {                                                                       \\\n        case 0x00:                                                            \\\n          /* TST rd, rs */                                                    \\\n          thumb_data_proc_test(alu_op, tst, reg, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x01:                                                            \\\n          /* NEG rd, rs */                                                    \\\n          thumb_data_proc_unary(alu_op, neg, reg, rd, rs);                    \\\n          break;                                                              \\\n                                                                              \\\n        case 0x02:                                                            \\\n          /* CMP rd, rs */                                                    \\\n          thumb_data_proc_test(alu_op, cmp, reg, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x03:                                                            \\\n          /* CMN rd, rs */                                                    \\\n          thumb_data_proc_test(alu_op, cmn, reg, rd, rs);                     \\\n          break;                                                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x43:                                                                \\\n      switch((opcode >> 6) & 0x03)                                            \\\n      {                                                                       \\\n        case 0x00:                                                            \\\n          /* ORR rd, rs */                                                    \\\n          thumb_data_proc(alu_op, orrs, reg, rd, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x01:                                                            \\\n          /* MUL rd, rs */                                                    \\\n          thumb_data_proc(alu_op, muls, reg, rd, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x02:                                                            \\\n          /* BIC rd, rs */                                                    \\\n          thumb_data_proc(alu_op, bics, reg, rd, rd, rs);                     \\\n          break;                                                              \\\n                                                                              \\\n        case 0x03:                                                            \\\n          /* MVN rd, rs */                                                    \\\n          thumb_data_proc_unary(alu_op, mvns, reg, rd, rs);                   \\\n          break;                                                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x44:                                                                \\\n      /* ADD rd, rs */                                                        \\\n      thumb_data_proc_hi(add);                                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x45:                                                                \\\n      /* CMP rd, rs */                                                        \\\n      thumb_data_proc_test_hi(cmp);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x46:                                                                \\\n      /* MOV rd, rs */                                                        \\\n      thumb_data_proc_mov_hi();                                               \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x47:                                                                \\\n      /* BX rs */                                                             \\\n    \tif(((opcode >> 7) & 0x01) == 0x01)\\\n    \t{\\\n    \t\tthumb_blx_reg();\\\n    \t}\\\n    \telse\\\n    \t{\\\n      thumb_bx();                                                             \\\n    \t}\\\n      break;                                                                  \\\n                                                                              \\\n    case 0x48:                                                                \\\n      /* LDR r0, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 0, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x49:                                                                \\\n      /* LDR r1, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 1, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4A:                                                                \\\n      /* LDR r2, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 2, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4B:                                                                \\\n      /* LDR r3, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 3, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4C:                                                                \\\n      /* LDR r4, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 4, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4D:                                                                \\\n      /* LDR r5, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 5, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4E:                                                                \\\n      /* LDR r6, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 6, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x4F:                                                                \\\n      /* LDR r7, [pc + imm] */                                                \\\n      thumb_access_memory(load, imm, 7, 0, 0, pc_relative,                    \\\n       (pc & ~2) + (imm * 4) + 4, u32);                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x50 ... 0x51:                                                       \\\n      /* STR rd, [rb + ro] */                                                 \\\n      thumb_access_memory(store, mem_reg, rd, rb, ro, reg_reg, 0, u32);       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x52 ... 0x53:                                                       \\\n      /* STRH rd, [rb + ro] */                                                \\\n      thumb_access_memory(store, mem_reg, rd, rb, ro, reg_reg, 0, u16);       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x54 ... 0x55:                                                       \\\n      /* STRB rd, [rb + ro] */                                                \\\n      thumb_access_memory(store, mem_reg, rd, rb, ro, reg_reg, 0, u8);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x56 ... 0x57:                                                       \\\n      /* LDSB rd, [rb + ro] */                                                \\\n      thumb_access_memory(load, mem_reg, rd, rb, ro, reg_reg, 0, s8);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x58 ... 0x59:                                                       \\\n      /* LDR rd, [rb + ro] */                                                 \\\n      thumb_access_memory(load, mem_reg, rd, rb, ro, reg_reg, 0, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5A ... 0x5B:                                                       \\\n      /* LDRH rd, [rb + ro] */                                                \\\n      thumb_access_memory(load, mem_reg, rd, rb, ro, reg_reg, 0, u16);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5C ... 0x5D:                                                       \\\n      /* LDRB rd, [rb + ro] */                                                \\\n      thumb_access_memory(load, mem_reg, rd, rb, ro, reg_reg, 0, u8);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x5E ... 0x5F:                                                       \\\n      /* LDSH rd, [rb + ro] */                                                \\\n      thumb_access_memory(load, mem_reg, rd, rb, ro, reg_reg, 0, s16);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x60 ... 0x67:                                                       \\\n      /* STR rd, [rb + imm] */                                                \\\n      thumb_access_memory(store, mem_imm, rd, rb, 0, reg_imm, (imm * 4),      \\\n       u32);                                                                  \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x68 ... 0x6F:                                                       \\\n      /* LDR rd, [rb + imm] */                                                \\\n      thumb_access_memory(load, mem_imm, rd, rb, 0, reg_imm, (imm * 4), u32); \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x70 ... 0x77:                                                       \\\n      /* STRB rd, [rb + imm] */                                               \\\n      thumb_access_memory(store, mem_imm, rd, rb, 0, reg_imm, imm, u8);       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x78 ... 0x7F:                                                       \\\n      /* LDRB rd, [rb + imm] */                                               \\\n      thumb_access_memory(load, mem_imm, rd, rb, 0, reg_imm, imm, u8);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x80 ... 0x87:                                                       \\\n      /* STRH rd, [rb + imm] */                                               \\\n      thumb_access_memory(store, mem_imm, rd, rb, 0, reg_imm,                 \\\n       (imm * 2), u16);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x88 ... 0x8F:                                                       \\\n      /* LDRH rd, [rb + imm] */                                               \\\n      thumb_access_memory(load, mem_imm, rd, rb, 0, reg_imm, (imm * 2), u16); \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x90:                                                                \\\n      /* STR r0, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 0, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x91:                                                                \\\n      /* STR r1, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 1, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x92:                                                                \\\n      /* STR r2, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 2, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x93:                                                                \\\n      /* STR r3, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 3, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x94:                                                                \\\n      /* STR r4, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 4, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x95:                                                                \\\n      /* STR r5, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 5, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x96:                                                                \\\n      /* STR r6, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 6, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x97:                                                                \\\n      /* STR r7, [sp + imm] */                                                \\\n      thumb_access_memory(store, imm, 7, 13, 0, reg_imm_sp, imm, u32);        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x98:                                                                \\\n      /* LDR r0, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 0, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x99:                                                                \\\n      /* LDR r1, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 1, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9A:                                                                \\\n      /* LDR r2, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 2, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9B:                                                                \\\n      /* LDR r3, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 3, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9C:                                                                \\\n      /* LDR r4, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 4, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9D:                                                                \\\n      /* LDR r5, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 5, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9E:                                                                \\\n      /* LDR r6, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 6, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x9F:                                                                \\\n      /* LDR r7, [sp + imm] */                                                \\\n      thumb_access_memory(load, imm, 7, 13, 0, reg_imm_sp, imm, u32);         \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA0:                                                                \\\n      /* ADD r0, pc, +imm */                                                  \\\n      thumb_load_pc(0);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA1:                                                                \\\n      /* ADD r1, pc, +imm */                                                  \\\n      thumb_load_pc(1);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA2:                                                                \\\n      /* ADD r2, pc, +imm */                                                  \\\n      thumb_load_pc(2);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA3:                                                                \\\n      /* ADD r3, pc, +imm */                                                  \\\n      thumb_load_pc(3);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA4:                                                                \\\n      /* ADD r4, pc, +imm */                                                  \\\n      thumb_load_pc(4);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA5:                                                                \\\n      /* ADD r5, pc, +imm */                                                  \\\n      thumb_load_pc(5);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA6:                                                                \\\n      /* ADD r6, pc, +imm */                                                  \\\n      thumb_load_pc(6);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA7:                                                                \\\n      /* ADD r7, pc, +imm */                                                  \\\n      thumb_load_pc(7);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA8:                                                                \\\n      /* ADD r0, sp, +imm */                                                  \\\n      thumb_load_sp(0);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xA9:                                                                \\\n      /* ADD r1, sp, +imm */                                                  \\\n      thumb_load_sp(1);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xAA:                                                                \\\n      /* ADD r2, sp, +imm */                                                  \\\n      thumb_load_sp(2);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xAB:                                                                \\\n      /* ADD r3, sp, +imm */                                                  \\\n      thumb_load_sp(3);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xAC:                                                                \\\n      /* ADD r4, sp, +imm */                                                  \\\n      thumb_load_sp(4);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xAD:                                                                \\\n      /* ADD r5, sp, +imm */                                                  \\\n      thumb_load_sp(5);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xAE:                                                                \\\n      /* ADD r6, sp, +imm */                                                  \\\n      thumb_load_sp(6);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xAF:                                                                \\\n      /* ADD r7, sp, +imm */                                                  \\\n      thumb_load_sp(7);                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xB0 ... 0xB3:                                                       \\\n      if((opcode >> 7) & 0x01)                                                \\\n      {                                                                       \\\n        /* ADD sp, -imm */                                                    \\\n        thumb_adjust_sp(down);                                                \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        /* ADD sp, +imm */                                                    \\\n        thumb_adjust_sp(up);                                                  \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xB4:                                                                \\\n      /* PUSH rlist */                                                        \\\n      thumb_block_memory(store, down, no, 13);                                \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xB5:                                                                \\\n      /* PUSH rlist, lr */                                                    \\\n      thumb_block_memory(store, push_lr, push_lr, 13);                        \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xBC:                                                                \\\n      /* POP rlist */                                                         \\\n      thumb_block_memory(load, no, up, 13);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xBD:                                                                \\\n      /* POP rlist, pc */                                                     \\\n      thumb_block_memory(load, no, pop_pc, 13);                               \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC0:                                                                \\\n      /* STMIA r0!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 0);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC1:                                                                \\\n      /* STMIA r1!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 1);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC2:                                                                \\\n      /* STMIA r2!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 2);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC3:                                                                \\\n      /* STMIA r3!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 3);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC4:                                                                \\\n      /* STMIA r4!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 4);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC5:                                                                \\\n      /* STMIA r5!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 5);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC6:                                                                \\\n      /* STMIA r6!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 6);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC7:                                                                \\\n      /* STMIA r7!, rlist */                                                  \\\n      thumb_block_memory(store, no, up, 7);                                   \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC8:                                                                \\\n      /* LDMIA r0!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 0);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xC9:                                                                \\\n      /* LDMIA r1!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 1);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xCA:                                                                \\\n      /* LDMIA r2!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 2);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xCB:                                                                \\\n      /* LDMIA r3!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 3);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xCC:                                                                \\\n      /* LDMIA r4!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 4);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xCD:                                                                \\\n      /* LDMIA r5!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 5);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xCE:                                                                \\\n      /* LDMIA r6!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 6);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xCF:                                                                \\\n      /* LDMIA r7!, rlist */                                                  \\\n      thumb_block_memory(load, no, up, 7);                                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD0:                                                                \\\n      /* BEQ label */                                                         \\\n      thumb_conditional_branch(eq);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD1:                                                                \\\n      /* BNE label */                                                         \\\n      thumb_conditional_branch(ne);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD2:                                                                \\\n      /* BCS label */                                                         \\\n      thumb_conditional_branch(cs);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD3:                                                                \\\n      /* BCC label */                                                         \\\n      thumb_conditional_branch(cc);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD4:                                                                \\\n      /* BMI label */                                                         \\\n      thumb_conditional_branch(mi);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD5:                                                                \\\n      /* BPL label */                                                         \\\n      thumb_conditional_branch(pl);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD6:                                                                \\\n      /* BVS label */                                                         \\\n      thumb_conditional_branch(vs);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD7:                                                                \\\n      /* BVC label */                                                         \\\n      thumb_conditional_branch(vc);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD8:                                                                \\\n      /* BHI label */                                                         \\\n      thumb_conditional_branch(hi);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xD9:                                                                \\\n      /* BLS label */                                                         \\\n      thumb_conditional_branch(ls);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xDA:                                                                \\\n      /* BGE label */                                                         \\\n      thumb_conditional_branch(ge);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xDB:                                                                \\\n      /* BLT label */                                                         \\\n      thumb_conditional_branch(lt);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xDC:                                                                \\\n      /* BGT label */                                                         \\\n      thumb_conditional_branch(gt);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xDD:                                                                \\\n      /* BLE label */                                                         \\\n      thumb_conditional_branch(le);                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xDE:                                                                \\\n      /* B label */                                                         \\\n      thumb_b();                                           \\\n      break;                                                                  \\\n                                                                              \\\n    case 0xDF:                                                                \\\n    {                                                                         \\\n      /* SWI comment */                                                       \\\n      thumb_swi();                                                            \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    case 0xE0 ... 0xE7:                                                       \\\n    {                                                                         \\\n      /* B label */                                                           \\\n      thumb_b();                                                              \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    case 0xE8 ... 0xEF:                                                       \\\n    {                                                                         \\\n    \tif((last_opcode >= 0xF000) && (last_opcode < 0xF800))                   \\\n    \t      {                                                                       \\\n    \t        thumb_blx_imm();                                                          \\\n    \t      }                                                                       \\\nelse\\\n{\\\n\tLOGE(\"ruh roh pc %x opcode %x (%x)\", pc, opcode, dynarec_proc); \\\n\t/*exit(0);*/\\\n\tthumb_blh();\\\n}\\\n    }                                                                         \\\n                                                                              \\\n    case 0xF0 ... 0xF7:                                                       \\\n    {                                                                         \\\n      /* (low word) BL label */                                               \\\n      /* This should possibly generate code if not in conjunction with a BLH  \\\n         next, but I don't think anyone will do that. */                      \\\n      break;                                                                  \\\n    }                                                                         \\\n                                                                              \\\n    case 0xF8 ... 0xFF:                                                       \\\n    {                                                                         \\\n      /* (high word) BL label */                                              \\\n      /* This might not be preceeding a BL low word (Golden Sun 2), if so     \\\n         it must be handled like an indirect branch. */                       \\\n      if((last_opcode >= 0xF000) && (last_opcode < 0xF800))                   \\\n      {                                                                       \\\n        thumb_bl();                                                           \\\n      }                                                                       \\\n      else                                                                    \\\n      {                                                                       \\\n        thumb_blh();                                                          \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n  }                                                                           \\\n                                                                              \\\n  pc += 2                                                                     \\\n\n#define thumb_flag_modifies_all()                                             \\\n  flag_status |= 0xFF                                                         \\\n\n#define thumb_flag_modifies_zn()                                              \\\n  flag_status |= 0xCC                                                         \\\n\n#define thumb_flag_modifies_znc()                                             \\\n  flag_status |= 0xEE                                                         \\\n\n#define thumb_flag_modifies_zn_maybe_c()                                      \\\n  flag_status |= 0xCE                                                         \\\n\n#define thumb_flag_modifies_c()                                               \\\n  flag_status |= 0x22                                                         \\\n\n#define thumb_flag_requires_c()                                               \\\n  flag_status |= 0x200                                                        \\\n\n#define thumb_flag_requires_all()                                             \\\n  flag_status |= 0xF00                                                        \\\n\n#define thumb_flag_status()                                                   \\\n{                                                                             \\\n  u16 flag_status = 0;                                                        \\\n  switch((opcode >> 8) & 0xFF)                                                \\\n  {                                                                           \\\n    /* left shift by imm */                                                   \\\n    case 0x00 ... 0x07:                                                       \\\n      thumb_flag_modifies_zn();                                               \\\n      if(((opcode >> 6) & 0x1F) != 0)                                         \\\n      {                                                                       \\\n        thumb_flag_modifies_c();                                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    /* right shift by imm */                                                  \\\n    case 0x08 ... 0x17:                                                       \\\n      thumb_flag_modifies_znc();                                              \\\n      break;                                                                  \\\n                                                                              \\\n    /* add, subtract */                                                       \\\n    case 0x18 ... 0x1F:                                                       \\\n      thumb_flag_modifies_all();                                              \\\n      break;                                                                  \\\n                                                                              \\\n    /* mov reg, imm */                                                        \\\n    case 0x20 ... 0x27:                                                       \\\n      thumb_flag_modifies_zn();                                               \\\n      break;                                                                  \\\n                                                                              \\\n    /* cmp reg, imm; add, subtract */                                         \\\n    case 0x28 ... 0x3F:                                                       \\\n      thumb_flag_modifies_all();                                              \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x40:                                                                \\\n      switch((opcode >> 6) & 0x03)                                            \\\n      {                                                                       \\\n        case 0x00:                                                            \\\n          /* AND rd, rs */                                                    \\\n          thumb_flag_modifies_zn();                                           \\\n          break;                                                              \\\n                                                                              \\\n        case 0x01:                                                            \\\n          /* EOR rd, rs */                                                    \\\n          thumb_flag_modifies_zn();                                           \\\n          break;                                                              \\\n                                                                              \\\n        case 0x02:                                                            \\\n          /* LSL rd, rs */                                                    \\\n          thumb_flag_modifies_zn_maybe_c();                                   \\\n          break;                                                              \\\n                                                                              \\\n        case 0x03:                                                            \\\n          /* LSR rd, rs */                                                    \\\n          thumb_flag_modifies_zn_maybe_c();                                   \\\n          break;                                                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x41:                                                                \\\n      switch((opcode >> 6) & 0x03)                                            \\\n      {                                                                       \\\n        case 0x00:                                                            \\\n          /* ASR rd, rs */                                                    \\\n          thumb_flag_modifies_zn_maybe_c();                                   \\\n          break;                                                              \\\n                                                                              \\\n        case 0x01:                                                            \\\n          /* ADC rd, rs */                                                    \\\n          thumb_flag_modifies_all();                                          \\\n          thumb_flag_requires_c();                                            \\\n          break;                                                              \\\n                                                                              \\\n        case 0x02:                                                            \\\n          /* SBC rd, rs */                                                    \\\n          thumb_flag_modifies_all();                                          \\\n          thumb_flag_requires_c();                                            \\\n          break;                                                              \\\n                                                                              \\\n        case 0x03:                                                            \\\n          /* ROR rd, rs */                                                    \\\n          thumb_flag_modifies_zn_maybe_c();                                   \\\n          break;                                                              \\\n      }                                                                       \\\n      break;                                                                  \\\n                                                                              \\\n    /* TST, NEG, CMP, CMN */                                                  \\\n    case 0x42:                                                                \\\n      thumb_flag_modifies_all();                                              \\\n      break;                                                                  \\\n                                                                              \\\n    /* ORR, MUL, BIC, MVN */                                                  \\\n    case 0x43:                                                                \\\n      thumb_flag_modifies_zn();                                               \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x45:                                                                \\\n      /* CMP rd, rs */                                                        \\\n      thumb_flag_modifies_all();                                              \\\n      break;                                                                  \\\n                                                                              \\\n    /* mov might change PC (fall through if so) */                            \\\n    case 0x46:                                                                \\\n      if((opcode & 0xFF87) != 0x4687)                                         \\\n        break;                                                                \\\n                                                                              \\\n    /* branches (can change PC) */                                            \\\n    case 0x47:                                                                \\\n    case 0xBD:                                                                \\\n    case 0xD0 ... 0xE7:                                                       \\\n    case 0xF0 ... 0xFF:                                                       \\\n      thumb_flag_requires_all();                                              \\\n      break;                                                                  \\\n  }                                                                           \\\n  block_data[block_data_position].flag_data = flag_status;                    \\\n}                                                                             \\\n\nu8 *ram_block_ptrs[1024 * 64];\nu32 ram_block_tag_top = 0x0101;\n\nu8 *bios_block_ptrs[1024 * 8];\nu32 bios_block_tag_top = 0x0101;\n\n//begin page table stuff\n\nu32** dynarec_page_table[DYNAREC_PAGE_TABLE_SIZE];\n\nvoid write_smc_check(u32 adr)\n{\n//\tLOGE(\"write_smc_check(%x)\", adr);\n\n\tu32** page = dynarec_page_table[(adr & 0x0FFFFFFF)>>12];\n\tif(!page)\n\t\treturn;\n\n\tu32* trans_adr = page[(adr & 0xFFF)>>1];\n\tif(!trans_adr)\n\t\treturn;\n\n\tLOGE(\"self modifying code detected\");\n\tdynarec_cpu->R[CHANGED_PC_STATUS]=1;\n\t//hack but I dont think a block will go a whole page\n\t/*free((void*)(dynarec_page_table[idx]));\n\tdynarec_page_table[idx] = 0;\n\n\tif(idx > 0 && !dynarec_page_table[idx-1])\n\t{\n\t\tfree((void*)(dynarec_page_table[idx-1]));\n\t\tdynarec_page_table[idx-1]=0;\n\t}\n\n\tif(idx < DYNAREC_PAGE_TABLE_SIZE-1 && !dynarec_page_table[idx+1])\n\t{\n\t\tfree((void*)(dynarec_page_table[idx+1]));\n\t\tdynarec_page_table[idx+1]=0;\n\t}*/\n\tflush_translation_cache_rom();\n}\n//end page table stuff\n\n// This function will return a pointer to a translated block of code. If it\n// doesn't exist it will translate it, if it does it will pass it back.\n\n// type should be \"arm\", \"thumb\", or \"dual.\" For arm or thumb the PC should\n// be a real PC, for dual the least significant bit will determine if it's\n// ARM or Thumb mode.\n\n#define block_lookup_address_pc_arm()                                         \\\n  pc &= ~0x03\n\n#define block_lookup_address_pc_thumb()                                       \\\n  pc &= ~0x01                                                                 \\\n\n#define block_lookup_address_pc_dual()                                        \\\n  u32 thumb = pc & 0x01;                                                      \\\n                                                                              \\\n  if(thumb)                                                                   \\\n  {                                                                           \\\n    pc--;                                                                     \\\n    dynarec_cpu->R[REG_CPSR] |= 0x20;                                                    \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    pc = (pc + 2) & ~0x03;                                                    \\\n    dynarec_cpu->R[REG_CPSR] &= ~0x20;                                                   \\\n  }                                                                           \\\n\n#define ram_translation_region  TRANSLATION_REGION_RAM\n#define rom_translation_region  TRANSLATION_REGION_ROM\n#define bios_translation_region TRANSLATION_REGION_BIOS\n\n#define block_lookup_translate_arm(mem_type, smc_enable)                      \\\n  translation_result = translate_block_arm(pc, mem_type##_translation_region, \\\n   smc_enable)                                                                \\\n\n#define block_lookup_translate_thumb(mem_type, smc_enable)                    \\\n  translation_result = translate_block_thumb(pc,                              \\\n   mem_type##_translation_region, smc_enable)                                 \\\n\n#define block_lookup_translate_dual(mem_type, smc_enable)                     \\\n  if(thumb)                                                                   \\\n  {                                                                           \\\n    translation_result = translate_block_thumb(pc,                            \\\n     mem_type##_translation_region, smc_enable);                              \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    translation_result = translate_block_arm(pc,                              \\\n     mem_type##_translation_region, smc_enable);                              \\\n  }                                                                           \\\n\n// 0x0101 is the smallest tag that can be used. 0xFFFF is marked\n// in the middle of blocks and used for write guarding, it doesn't\n// indicate a valid block either (it's okay to compile a new block\n// that overlaps the earlier one, although this should be relatively\n// uncommon)\n\n#define fill_tag_arm(mem_type)                                                \\\n  location[0] = mem_type##_block_tag_top;                                     \\\n  location[1] = 0xFFFF                                                        \\\n\n#define fill_tag_thumb(mem_type)                                              \\\n  *location = mem_type##_block_tag_top                                        \\\n\n#define fill_tag_dual(mem_type)                                               \\\n  if(thumb)                                                                   \\\n    fill_tag_thumb(mem_type);                                                 \\\n  else                                                                        \\\n    fill_tag_arm(mem_type)                                                    \\\n\n#define block_lookup_translate(instruction_type, mem_type, smc_enable)        \\\n  block_tag = *location;                                                      \\\n  if((block_tag < 0x0101) || (block_tag == 0xFFFF))                           \\\n  {                                                                           \\\n    __label__ redo;                                                           \\\n    s32 translation_result;                                                   \\\n                                                                              \\\n    redo:                                                                     \\\n                                                                              \\\n    translation_recursion_level++;                                            \\\n    block_address = mem_type##_translation_ptr + block_prologue_size;         \\\n    mem_type##_block_ptrs[mem_type##_block_tag_top] = block_address;          \\\n    fill_tag_##instruction_type(mem_type);                                    \\\n    mem_type##_block_tag_top++;                                               \\\n                                                                              \\\n    block_lookup_translate_##instruction_type(mem_type, smc_enable);          \\\n    translation_recursion_level--;                                            \\\n                                                                              \\\n    /* If the translation failed then pass that failure on if we're in        \\\n       a recursive level, or try again if we've hit the bottom. */            \\\n    if(translation_result == -1)                                              \\\n    {                                                                         \\\n      if(translation_recursion_level)                                         \\\n        return NULL;                                                          \\\n                                                                              \\\n      goto redo;                                                              \\\n    }                                                                         \\\n                                                                              \\\n    if(translation_recursion_level == 0)                                      \\\n      translate_invalidate_dcache();                                          \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    block_address = mem_type##_block_ptrs[block_tag];                         \\\n  }                                                                           \\\n     /* u32 hash_target = ((pc * 2654435761U) >> 16) &                          \\\n\t          (ROM_BRANCH_HASH_SIZE - 1);                                            \\\n\t     u32 *block_ptr = rom_branch_hash[hash_target];                          \\\n\t     u32 **block_ptr_address = rom_branch_hash + hash_target;                \\\n\t                                                                                 \\\n\t          while(block_ptr)                                                        \\\n\t           {                                                                       \\\n\t             if(block_ptr[0] == pc)                                                \\\n\t           {                                                                     \\\n\t                block_address = (u8 *)(block_ptr + 2) + block_prologue_size;        \\\n\t                 break;                                                              \\\n\t                 }                                                                     \\\n\t                                                                                     \\\n\t                   block_ptr_address = (u32 **)(block_ptr + 1);                          \\\n\t                    block_ptr = (u32 *)block_ptr[1];                                      \\\n\t                  }                                                                       \\*/\nu32 translation_recursion_level = 0;\nu32 translation_flush_count = 0;\n\n#define block_lookup_address_builder(type)                                    \\\n__attribute__((noinline)) u8 function_cc *block_lookup_address_##type(u32 pc)                           \\\n{                                                                             \\\n  u16 *location;                                                              \\\n  u32 block_tag;                                                              \\\n  u8 *block_address;                                                          \\\n                                                                              \\\n  /* Starting at the beginning, we allow for one translation cache flush. */  \\\n  if(translation_recursion_level == 0)                                        \\\n    translation_flush_count = 0;                                              \\\n  block_lookup_address_pc_##type();                                           \\\n                                                                              \\\n  switch(pc >> 24)                                                            \\\n  {                                                                           \\\n    case 0x0 ... 0xE:                                                         \\\n    {                                                                         \\\n                                                                              \\\n      \t        u32 *block_ptr = retrieve_adr(pc);                          \\\n\t        u32** block_ptr_address = &block_ptr;               \\\n\t           block_address = (u8 *)(block_ptr + 2) + block_prologue_size;        \\\n\t           \\\n      if(block_ptr == NULL|| block_ptr == reinterpret_cast<u32*>(0xFFFFFFFF) || *block_ptr != pc)                                                   \\\n      {                                                                       \\\n        __label__ redo;                                                       \\\n        s32 translation_result;                                               \\\n                                                                              \\\n        redo:                                                                 \\\n                                                                              \\\n        translation_recursion_level++;                                        \\\n        ((u32 *)rom_translation_ptr)[0] = pc;                                 \\\n        ((u32 **)rom_translation_ptr)[1] = NULL;                              \\\n        *block_ptr_address = (u32 *)rom_translation_ptr;                      \\\n        rom_translation_ptr += 8;                                             \\\n        block_address = rom_translation_ptr + block_prologue_size;            \\\n        block_lookup_translate_##type(rom, 0);                                \\\n        translation_recursion_level--;                                        \\\n                                                                              \\\n        /* If the translation failed then pass that failure on if we're in    \\\n         a recursive level, or try again if we've hit the bottom. */          \\\n        if(translation_result == -1)                                          \\\n        {                                                                     \\\n          if(translation_recursion_level)                                     \\\n            return NULL;                                                      \\\n                                                                              \\\n          goto redo;                                                          \\\n        }                                                                     \\\n                                                                              \\\n        if(translation_recursion_level == 0)                                  \\\n          translate_invalidate_dcache();                                      \\\n      }                                                                       \\\n      break;                                                                  \\\n    }                                                                         \\\n\\\n    case 0xFF:\\\n    {\\\n\t        u32 *block_ptr = retrieve_adr(pc);                          \\\n    u32** block_ptr_address = &block_ptr;               \\\n       block_address = (u8 *)(block_ptr + 2) + block_prologue_size;        \\\n       \\\n\t\tif(block_ptr == NULL|| block_ptr == reinterpret_cast<u32*>(0xFFFFFFFF) || *block_ptr != pc)                                                   \\\n\t\t{                                                                       \\\n\t\t__label__ redo;                                                       \\\n\t\ts32 translation_result;                                               \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\tredo:                                                                 \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\ttranslation_recursion_level++;                                        \\\n\t\t((u32 *)bios_translation_ptr)[0] = pc;                                 \\\n\t\t((u32 **)bios_translation_ptr)[1] = NULL;                              \\\n\t\t*block_ptr_address = (u32 *)bios_translation_ptr;                      \\\n\t\tbios_translation_ptr += 8;                                             \\\n\t\tblock_address = bios_translation_ptr + block_prologue_size;            \\\n\t\tblock_lookup_translate_##type(bios, 0);                                \\\n\t\ttranslation_recursion_level--;                                        \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t/* If the translation failed then pass that failure on if we're in    \\\n\t\t a recursive level, or try again if we've hit the bottom. */          \\\n\t\tif(translation_result == -1)                                          \\\n\t\t{                                                                     \\\n\t\t  if(translation_recursion_level)                                     \\\n\t\t\treturn NULL;                                                      \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\t  goto redo;                                                          \\\n\t\t}                                                                     \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n\t\tif(translation_recursion_level == 0)                                  \\\n\t\t  translate_invalidate_dcache();                                      \\\n\t\t}                                                                       \\\n\t\tbreak;                                                                  \\\n    }\\\n                                                                              \\\n    default:                                                                  \\\n      /* If we're at the bottom, it means we're actually trying to jump to an \\\n         address that we can't handle. Otherwise, it means that code scanned  \\\n         has reached an address that can't be handled, which means that we    \\\n         have most likely hit an area that doesn't contain code yet (for      \\\n         instance, in RAM). If such a thing happens, return -1 and the        \\\n         block translater will naively link it (it'll be okay, since it       \\\n         should never be hit) */                                              \\\n      if(translation_recursion_level == 0)                                    \\\n      {                                                                       \\\n        LOGE(\"bad jump %x (%x) (%x)\", pc, dynarec_cpu->R[REG_PC],           \\\n         last_instruction);                                                   \\\n        sleep(10);\\\n        exit(1);                                                               \\\n      }                                                                       \\\n      block_address = (u8 *)(-1);                                             \\\n      break;                                                                  \\\n  }                                                                           \\\n  return block_address;                                                       \\\n}                                                                             \\\n\n\n__attribute__((noinline)) u8 function_cc *block_lookup_address_arm(u32 pc)\n{\n  u16 *location;\n  u32 block_tag;\n  u8 *block_address;\n\n  /* Starting at the beginning, we allow for one translation cache flush. */\n  if(translation_recursion_level == 0)\n    translation_flush_count = 0;\n  block_lookup_address_pc_arm();\n\n  switch(pc >> 24)\n  {\n    case 0x0 ... 0xE:\n    {\n\n      \t        u32 *block_ptr = retrieve_adr(pc);\n\t        u32** block_ptr_address = &block_ptr;\n\t           block_address = (u8 *)(block_ptr + 2) + block_prologue_size;\n\n      if(block_ptr == NULL|| block_ptr == reinterpret_cast<u32*>(0xFFFFFFFF) || *block_ptr != pc)\n      {\n\t  \n        __label__ redo;\n        s32 translation_result;\n\t\t\n\t\t/*if(block_ptr == NULL)\n\t\t{\n\t\t\t__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"new arm rom block, pc %x\", (unsigned long)pc);\n\t\t}\n\t\telse if(*block_ptr != pc)\n\t\t{\n\t\t\t__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"arm rom block collision, pc %x has entry %x\", (unsigned long)pc, (unsigned long)*block_ptr);\n\t\t}*/\n\n        redo:\n\n        translation_recursion_level++;\n        ((u32 *)rom_translation_ptr)[0] = pc;\n        ((u32 **)rom_translation_ptr)[1] = NULL;\n        *block_ptr_address = (u32 *)rom_translation_ptr;\n        rom_translation_ptr += 8;\n        block_address = rom_translation_ptr + block_prologue_size;\n        block_lookup_translate_arm(rom, 0);\n        translation_recursion_level--;\n\n        /* If the translation failed then pass that failure on if we're in\n         a recursive level, or try again if we've hit the bottom. */\n        if(translation_result == -1)\n        {\n          if(translation_recursion_level)\n            return NULL;\n\n          goto redo;\n        }\n\n        if(translation_recursion_level == 0)\n          translate_invalidate_dcache();\n      }\n\t  /*else\n\t  {\n\t\t\t__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"existing arm rom block found, pc %x\", (unsigned long)pc);\n\t  }*/\n      break;\n    }\n\n    case 0xFF:\n    {\n    \t u32 *block_ptr = retrieve_adr(pc);\n    \t    u32** block_ptr_address = &block_ptr;\n    \t       block_address = (u8 *)(block_ptr + 2) + block_prologue_size;\n\n    \t\t\tif(block_ptr == NULL|| block_ptr == reinterpret_cast<u32*>(0xFFFFFFFF) || *block_ptr != pc)\n    \t\t\t{\n    \t\t\t__label__ redo;\n    \t\t\ts32 translation_result;\n\t\t\t\t\n\t\t\t\t/*if(block_ptr == NULL)\n\t\t\t\t{\n\t\t\t\t\t__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"new arm bios block, pc %x\", (unsigned long)pc);\n\t\t\t\t}\n\t\t\t\telse if(*block_ptr != pc)\n\t\t\t\t{\n\t\t\t\t\t__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"arm bios block collision, pc %x has entry %x at %x\", (unsigned long)pc, (unsigned long)*block_ptr, (unsigned long)block_ptr);\n\t\t\t\t}*/\n\n    \t\t\tredo:\n\n    \t\t\ttranslation_recursion_level++;\n    \t\t\t((u32 *)bios_translation_ptr)[0] = pc;\n    \t\t\t((u32 **)bios_translation_ptr)[1] = NULL;\n    \t\t\t*block_ptr_address = (u32 *)bios_translation_ptr;\n    \t\t\tbios_translation_ptr += 8;\n    \t\t\tblock_address = bios_translation_ptr + block_prologue_size;\n    \t\t\tblock_lookup_translate_arm(bios, 0);\n    \t\t\ttranslation_recursion_level--;\n\n    \t\t\t/* If the translation failed then pass that failure on if we're in\n    \t\t\t a recursive level, or try again if we've hit the bottom. */\n    \t\t\tif(translation_result == -1)\n    \t\t\t{\n    \t\t\t  if(translation_recursion_level)\n    \t\t\t\treturn NULL;\n\n    \t\t\t  goto redo;\n    \t\t\t}\n\n    \t\t\tif(translation_recursion_level == 0)\n    \t\t\t  translate_invalidate_dcache();\n    \t\t\t}\n\t\t\t\t/*else\n\t\t\t\t{\n\t\t\t\t\t\t__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"existing arm bios block found, pc %x\", (unsigned long)pc);\n\t\t\t\t}*/\n    \t\t\tbreak;\n    }\n\n    default:\n      /* If we're at the bottom, it means we're actually trying to jump to an\n         address that we can't handle. Otherwise, it means that code scanned\n         has reached an address that can't be handled, which means that we\n         have most likely hit an area that doesn't contain code yet (for\n         instance, in RAM). If such a thing happens, return -1 and the\n         block translater will naively link it (it'll be okay, since it\n         should never be hit) */\n      if(translation_recursion_level == 0)\n      {\n    \t  LOGE(\"bad jump %x (%x) (%x)\", pc, dynarec_cpu->R[REG_PC],\n    \t           last_instruction);\n        sleep(10);\n        exit(1);\n      }\n      block_address = (u8 *)(-1);\n      break;\n  }\n  return block_address;\n}\n\n;\nblock_lookup_address_builder(thumb)\n;\nblock_lookup_address_builder(dual)\n;\n\n// Potential exit point: If the rd field is pc for instructions is 0x0F,\n// the instruction is b/bl/bx, or the instruction is ldm with PC in the\n// register list.\n// All instructions with upper 3 bits less than 100b have an rd field\n// except bx, where the bits must be 0xF there anyway, multiplies,\n// which cannot have 0xF in the corresponding fields, and msr, which\n// has 0x0F there but doesn't end things (therefore must be special\n// checked against). Because MSR and BX overlap both are checked for.\n\n#define arm_exit_point                                                        \\\n (((opcode < 0x8000000) && ((opcode & 0x000F000) == 0x000F000) &&             \\\n  ((opcode & 0xDB0F000) != 0x120F000)) ||                                     \\\n  ((opcode & 0x12FFF10) == 0x12FFF10) ||                                      \\\n  ((opcode & 0x8108000) == 0x8108000) ||                                      \\\n  ((opcode >= 0xA000000) && (opcode < 0xC000000)) ||\\\n  ((opcode >= 0xC000000) && (opcode < 0xEF00000) && (((opcode >> 12) & 0x0F) == 0x0F)) ||\\\n\t((opcode & 0xF0000000) == 0xF0000000))\\\n\n#define arm_opcode_branch                                                     \\\n  ((opcode & 0xE000000) == 0xA000000)                                         \\\n\n#define arm_opcode_swi                                                        \\\n  ((opcode & 0xF000000) == 0xF000000)                                         \\\n\n#define arm_opcode_unconditional_branch                                       \\\n  (condition == 0x0E || condition == 0x0F)                                                         \\\n\n#define arm_load_opcode()                                                     \\\n\t\topcode = _MMU_read32(dynarec_proc, MMU_AT_CODE, block_end_pc);\\\n\t\t        condition = opcode >> 28;\\\n\t\t        opcode &= 0xFFFFFFF;\\\n\t\t        block_end_pc += 4;\\\n\n#define arm_branch_target()                                                   \\\n\tif(condition == 0x0F)  \\\n\tbranch_target = ((block_end_pc + 4 + (((s32)(opcode & 0xFFFFFF) << 8) >> 6)) | 0x00000001 ) | (((opcode >> 24) & 0x01)<<1);   \\\nelse    \\\n  branch_target = (block_end_pc + 4 + (((s32)(opcode & 0xFFFFFF) << 8) >> 6)); \\\n\n// Contiguous conditional block flags modification - it will set 0x20 in the\n// condition's bits if this instruction modifies flags. Taken from the CPU\n// switch so it'd better be right this time.\n\n#define arm_set_condition(_condition)                                         \\\n  block_data[block_data_position].condition = _condition;                     \\\n  switch((opcode >> 20) & 0xFF)                                               \\\n  {                                                                           \\\n    case 0x01:                                                                \\\n    case 0x03:                                                                \\\n    case 0x09:                                                                \\\n    case 0x0B:                                                                \\\n    case 0x0D:                                                                \\\n    case 0x0F:                                                                \\\n      if((((opcode >> 5) & 0x03) == 0) || ((opcode & 0x90) != 0x90))          \\\n        block_data[block_data_position].condition |= 0x20;                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x05:                                                                \\\n    case 0x07:                                                                \\\n    case 0x11:                                                                \\\n    case 0x13:                                                                \\\n    case 0x15 ... 0x17:                                                       \\\n    case 0x19:                                                                \\\n    case 0x1B:                                                                \\\n    case 0x1D:                                                                \\\n    case 0x1F:                                                                \\\n      if((opcode & 0x90) != 0x90)                                             \\\n        block_data[block_data_position].condition |= 0x20;                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x12:                                                                \\\n      if(((opcode & 0x90) != 0x90) && !(opcode & 0x10))                       \\\n        block_data[block_data_position].condition |= 0x20;                    \\\n      break;                                                                  \\\n                                                                              \\\n    case 0x21:                                                                \\\n    case 0x23:                                                                \\\n    case 0x25:                                                                \\\n    case 0x27:                                                                \\\n    case 0x29:                                                                \\\n    case 0x2B:                                                                \\\n    case 0x2D:                                                                \\\n    case 0x2F ... 0x37:                                                       \\\n    case 0x39:                                                                \\\n    case 0x3B:                                                                \\\n    case 0x3D:                                                                \\\n    case 0x3F:                                                                \\\n      block_data[block_data_position].condition |= 0x20;                      \\\n    break;                                                                    \\\n  }                                                                           \\\n\n#define arm_link_block()                                                      \\\n{\tif((branch_target & 0x1) != 0x1)\\\n  {translation_target = block_lookup_address_arm(branch_target);     }           \\\nelse \\\n{translation_target = block_lookup_address_thumb((branch_target & 0xFFFFFFFE));}}\\\n\n#define arm_instruction_width 4\n\n#define arm_base_cycles()                                                     \\\n\n// For now this just sets a variable that says flags should always be\n// computed.\n\n#define arm_dead_flag_eliminate()                                             \\\n  flag_status = 0xF                                                           \\\n\n// The following Thumb instructions can exit:\n// b, bl, bx, swi, pop {... pc}, and mov pc, ..., the latter being a hireg\n// op only. Rather simpler to identify than the ARM set.\n\n#define thumb_exit_point                                                      \\\n  (((opcode >= 0xD000) && (opcode < 0xDF00)) ||                                      \\\n   ((opcode >= 0xE000) && (opcode < 0xF000)) ||                               \\\n   ((opcode & 0xFF00) == 0x4700) ||                                           \\\n   ((opcode & 0xFF00) == 0xBD00) ||                                           \\\n   ((opcode & 0xFF87) == 0x4687) ||                                           \\\n   (opcode >= 0xF800))                                                      \\\n\n#define thumb_opcode_branch                                                   \\\n  (((opcode >= 0xD000) && (opcode < 0xDF00)) ||                               \\\n   ((opcode >= 0xE000) && (opcode < 0xF000)) ||                               \\\n   (opcode >= 0xF800))                                                        \\\n\n#define thumb_opcode_swi                                                      \\\n  ((opcode & 0xFF00) == 0xDF00)                                               \\\n\n#define thumb_opcode_unconditional_branch                                     \\\n  ((opcode < 0xD000) || (opcode >= 0xDF00))                                   \\\n\n#define thumb_load_opcode()                                                   \\\n  last_opcode = opcode;                                                       \\\n\topcode = _MMU_read16(dynarec_proc, MMU_AT_CODE, block_end_pc);\\\n  block_end_pc += 2                                                           \\\n\n#define thumb_branch_target()                                                 \\\n  if(opcode < 0xE000)                                                         \\\n  {                                                                           \\\n    branch_target = block_end_pc + 2 + ((s8)(opcode & 0xFF) * 2);             \\\n  }                                                                           \\\n  else                                                                        \\\n                                                                              \\\n  if((opcode < 0xF800 && opcode >= 0xF000)|| opcode < 0xE800)                                                         \\\n  {                                                                           \\\n    branch_target = block_end_pc + 2 + ((s32)((opcode & 0x7FF) << 21) >> 20); \\\n  }                                                                           \\\n  else                                                                        \\\n  {                                                                           \\\n    if((last_opcode >= 0xF000) && (last_opcode < 0xF800))                     \\\n    {                                                                         \\\n      if(opcode >= 0xE800 && opcode < 0xF000)\\\n      {\\\n\tbranch_target =                                                         \\\n       ((block_end_pc + ((s32)((last_opcode & 0x07FF) << 21) >> 9) +           \\\n       ((opcode & 0x07FF) * 2))& 0xFFFFFFFC) | 0x1; /*sets last bit as blx flag*/ \\\n      }\\\n      else\\\n      {\\\n    \t  branch_target =                                                         \\\n    \t         (block_end_pc + ((s32)((last_opcode & 0x07FF) << 21) >> 9) +           \\\n    \t         ((opcode & 0x07FF) * 2));                                              \\\n      }\\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      goto no_direct_branch;                                                  \\\n    }                                                                         \\\n  }                                                                           \\\n\n#define thumb_set_condition(_condition)                                       \\\n\n#define thumb_link_block()                                                    \\\n  if(branch_target != 0x00000008 && ((branch_target & 0x1) != 0x1)) /*check last bit to see if blx flag set*/                                            \\\n    translation_target = block_lookup_address_thumb(branch_target);           \\\n  else                                                                        \\\n    translation_target = block_lookup_address_arm((branch_target & 0xFFFFFFFE))              \\\n\n#define thumb_instruction_width 2\n\n#define thumb_base_cycles()                                                   \\\n  //if(!(block_data_position & 0x02))   \\\n  //\t  cycle_count += MMU_codeFetchCycles<proc,32>(pc);  \\\n\n// Here's how this works: each instruction has three different sets of flag\n// attributes, each consisiting of a 4bit mask describing how that instruction\n// interacts with the 4 main flags (N/Z/C/V).\n// The first set, in bits 0:3, is the set of flags the instruction may\n// modify. After this pass this is changed to the set of flags the instruction\n// should modify - if the bit for the corresponding flag is not set then code\n// does not have to be generated to calculate the flag for that instruction.\n\n// The second set, in bits 7:4, is the set of flags that the instruction must\n// modify (ie, for shifts by the register values the instruction may not\n// always modify the C flag, and thus the C bit won't be set here).\n\n// The third set, in bits 11:8, is the set of flags that the instruction uses\n// in its computation, or the set of flags that will be needed after the\n// instruction is done. For any instructions that change the PC all of the\n// bits should be set because it is (for now) unknown what flags will be\n// needed after it arrives at its destination. Instructions that use the\n// carry flag as input will have it set as well.\n\n// The algorithm is a simple liveness analysis procedure: It starts at the\n// bottom of the instruction stream and sets a \"currently needed\" mask to\n// the flags needed mask of the current instruction. Then it moves down\n// an instruction, ANDs that instructions \"should generate\" mask by the\n// \"currently needed\" mask, then ANDs the \"currently needed\" mask by\n// the 1's complement of the instruction's \"must generate\" mask, and ORs\n// the \"currently needed\" mask by the instruction's \"flags needed\" mask.\n\n#define thumb_dead_flag_eliminate()                                           \\\n{                                                                             \\\n  u32 needed_mask;                                                            \\\n  needed_mask = block_data[block_data_position].flag_data >> 8;               \\\n                                                                              \\\n  block_data_position--;                                                      \\\n  while(block_data_position >= 0)                                             \\\n  {                                                                           \\\n    flag_status = block_data[block_data_position].flag_data;                  \\\n    block_data[block_data_position].flag_data =                               \\\n     (flag_status & needed_mask);                                             \\\n    needed_mask &= ~((flag_status >> 4) & 0x0F);                              \\\n    needed_mask |= flag_status >> 8;                                          \\\n    block_data_position--;                                                    \\\n  }                                                                           \\\n}                                                                             \\\n\n#define MAX_BLOCK_SIZE 8192\n#define MAX_EXITS      256\n\nblock_data_type block_data[8192];\nblock_exit_type block_exits[MAX_EXITS];\n\n#define smc_write_arm_yes()                                                   \\\n  if((ds_read32(block_end_pc) - 0x8000) == 0x0000) \\\n  {                                                                           \\\n\t  ds_write32(block_end_pc - 0x8000, 0xFFFFFFFF);                             \\\n  }                                                                           \\\n\n#define smc_write_thumb_yes()                                                 \\\n  if((ds_read16(block_end_pc) - 0x8000) == 0x0000) \\\n  {                                                                           \\\n    ds_write16(block_end_pc- 0x8000, 0xFFFF);   \\\n  }                                                                           \\\n\n#define smc_write_arm_no()                                                    \\\n\n#define smc_write_thumb_no()                                                  \\\n\n#define scan_block(type, smc_write_op)                                        \\\n{                                                                             \\\n  __label__ block_end;                                                        \\\n  /* Find the end of the block */                                             \\\n  do                                                                          \\\n  {                                                                           \\\n    check_pc_region(block_end_pc);                                            \\\n    smc_write_##type##_##smc_write_op();                                      \\\n    type##_load_opcode();                                                     \\\n    type##_flag_status();                                                     \\\n                                                                              \\\n    if(type##_exit_point)                                                     \\\n    {                                                                         \\\n      /* Branch/branch with link */                                           \\\n      if(type##_opcode_branch)                                                \\\n      {                                                                       \\\n        __label__ no_direct_branch;                                           \\\n        type##_branch_target();                                               \\\n        block_exits[block_exit_position].branch_target = branch_target;       \\\n        block_exit_position++;                                                \\\n                                                                              \\\n        /* Give the branch target macro somewhere to bail if it turns out to  \\\n           be an indirect branch (ala malformed Thumb bl) */                  \\\n        no_direct_branch:;                                                    \\\n      }                                                                       \\\n                                                                              \\\n      /* SWI branches to the BIOS, this will likely change when               \\\n         some HLE BIOS is implemented.CHANGED :D */                                     \\\n                                                                              \\\n      type##_set_condition(condition | 0x10);                                 \\\n                                                                              \\\n      /* Only unconditional branches can end the block. */                    \\\n      if(type##_opcode_unconditional_branch)                                  \\\n      {                                                                       \\\n        /* Check to see if any prior block exits branch after here,           \\\n           if so don't end the block. Starts from the top and works           \\\n           down because the most recent branch is most likely to              \\\n           join after the end (if/then form) */                               \\\n        for(i = block_exit_position - 2; i >= 0; i--)                         \\\n        {                                                                     \\\n          if(block_exits[i].branch_target == block_end_pc)                    \\\n            break;                                                            \\\n        }                                                                     \\\n                                                                              \\\n        if(i < 0)                                                             \\\n          break;                                                              \\\n      }                                                                       \\\n      if(block_exit_position == MAX_EXITS)                                    \\\n        break;                                                                \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      type##_set_condition(condition);                                        \\\n    }                                                                         \\\n                                                                              \\\n    for(i = 0; i < translation_gate_targets; i++)                             \\\n    {                                                                         \\\n      if(block_end_pc == translation_gate_target_pc[i])                       \\\n        goto block_end;                                                       \\\n    }                                                                         \\\n                                                                              \\\n    block_data[block_data_position].update_cycles = 0;                        \\\n    block_data_position++;                                                    \\\n    if((block_data_position == MAX_BLOCK_SIZE) ||                             \\\n     (block_end_pc == 0x3007FF0) || (block_end_pc == 0x203FFFF0))\t\t\t  \\\n    {                                                                         \\\n      break;                                                                  \\\n    }                                                                         \\\n  } while(1);                                                                 \\\n                                                                              \\\n  block_end:;                                                                 \\\n}                                                                             \\\n\n#define arm_fix_pc()                                                          \\\n  pc &= ~0x03                                                                 \\\n\n#define thumb_fix_pc()                                                        \\\n  pc &= ~0x01                                                                 \\\n\nbool enable_instruct_debug=false;\n\nu32 cycle_counter_arm9=0;\nbool block_print =false;\n\n__attribute__((noinline)) s32 translate_block_arm(u32 pc, translation_region_type translation_region,\n\t\tu32 smc_enable) {\n#define generate_indirect_branch_arm()                                         \\\n  ({                                                                           \\\n    if(condition == 0x0E)                                                     \\\n    {                                                                         \\\n      generate_cycle_update();                                                \\\n    }                                                                         \\\n    generate_indirect_branch_no_cycle_update(arm);                            \\\n  })                                                                           \\\n\n#define generate_indirect_branch_dual()                                        \\\n  ({                                                                           \\\n    if(condition == 0x0E)                                                     \\\n    {                                                                         \\\n      generate_cycle_update();                                                \\\n    }                                                                         \\\n    generate_indirect_branch_no_cycle_update(dual_arm);                       \\\n  })                                                                           \\\n                                                                              \\\n\n#define prepare_load_reg(scratch_reg, reg_index)                        \\\n  ({                                                                           \\\n\t  u32 out;\\\n    u32 reg_use = arm_register_allocation[reg_index];                         \\\n    if(reg_use == mem_reg)                                                    \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n      out=scratch_reg;                                                     \\\n    }                                                                         \\\n    else                                                                          \\\n    {\\\n    \tout= reg_use;                                                           \\\n    }\\\n    out;\\\n  })                                                                           \\\n                                                                              \\\n\n#define prepare_load_reg_pc(scratch_reg, reg_index, pc_offset)      \\\n  ({                                                                           \\\n\tu32 out;\\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      generate_load_pc(scratch_reg, pc + pc_offset);                          \\\n      out= scratch_reg;                                                     \\\n    }                                                                         \\\n    else\\\n    {\\\n    \tout=prepare_load_reg(scratch_reg, reg_index);                          \\\n    }\\\n    out;\\\n  })                                                                           \\\n                                                                              \\\n\n#define prepare_store_reg(scratch_reg, reg_index)                       \\\n  ({                                                                           \\\n    u32 reg_use = arm_register_allocation[reg_index];                         \\\n    reg_use==mem_reg ? scratch_reg : reg_use; \\\n  })                                                                           \\\n                                                                              \\\n\n#define complete_store_reg(scratch_reg, reg_index)                     \\\n  ({                                                                           \\\n    if(arm_register_allocation[reg_index] == mem_reg)                         \\\n    {                                                                         \\\n      ARM_STR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n    }                                                                         \\\n  })                                                                           \\\n\n#define complete_store_reg_pc_no_flags(scratch_reg, reg_index)         \\\n  ({                                                                           \\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      generate_indirect_branch_arm();                                         \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      complete_store_reg(scratch_reg, reg_index);                             \\\n    }                                                                         \\\n  })                                                                           \\\n                                                                              \\\n\n#define complete_store_reg_pc_flags(scratch_reg, reg_index)            \\\n  ({                                                                           \\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      if(condition == 0x0E)                                                   \\\n      {                                                                       \\\n        generate_cycle_update();                                              \\\n      }                                                                       \\\n      generate_function_call(execute_spsr_restore);                           \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      complete_store_reg(scratch_reg, reg_index);                             \\\n    }                                                                         \\\n  })                                                                           \\\n                                                                              \\\n\n#define generate_load_reg(ireg, reg_index)                             \\\n  ({                                                                           \\\n    s32 load_src = arm_register_allocation[reg_index];                        \\\n    if(load_src != mem_reg)                                                   \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, ireg, load_src);                                     \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  })                                                                           \\\n                                                                              \\\n\n#define generate_store_reg(ireg, reg_index)                            \\\n  ({                                                                           \\\n    s32 store_dest = arm_register_allocation[reg_index];                      \\\n    if(store_dest != mem_reg)                                                 \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, store_dest, ireg);                                   \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_STR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  })                                                                           \\\n\n\n\tu32 opcode = 0;\n\tu32 last_opcode;\n\tu32 condition;\n\tu32 last_condition;\n\tu32 block_start_pc = pc;\n\tu32 block_end_pc = pc;\n\tu32 block_exit_position = 0;\n\ts32 block_data_position = 0;\n\tu32 external_block_exit_position = 0;\n\tu32 branch_target;\n\tu32 cycle_count = 0;\n\tu8 *translation_target;\n\tu8 *backpatch_address = NULL;\n\tu8 *translation_ptr = NULL;\n\tu8 *translation_cache_limit = NULL;\n\ts32 i;\n\tu32 flag_status;\n\tu32 exec_cyc;\n\tu32 cond_pc;\n\tblock_exit_type external_block_exits[MAX_EXITS];\n\tarm_fix_pc();\n\n\tif(pc<0xFFFF0000)\n\t{\n\ttranslation_ptr = rom_translation_ptr;\n\ttranslation_cache_limit = rom_translation_cache + ROM_TRANSLATION_CACHE_SIZE\n\t\t\t- TRANSLATION_CACHE_LIMIT_THRESHOLD;\n\t}\n\telse\n\t{\n\n\t\ttranslation_ptr = bios_translation_ptr;\n\t\ttranslation_cache_limit = bios_translation_cache +\n\t\tBIOS_TRANSLATION_CACHE_SIZE;\n\t}\n\n\tgenerate_block_prologue();\n\n\t/* This is a function because it's used a lot more than it might seem (all\n\t of the data processing functions can access it), and its expansion was\n\t massacreing the compiler. */\n\n\tif (smc_enable) {\n\t\tscan_block(arm, yes);\n\t} else {\n\t\tscan_block(arm, no);\n\t}\n\n\tfor (i = 0; i < block_exit_position; i++) {\n\t\tbranch_target = block_exits[i].branch_target;\n\n\t\tif ((branch_target > block_start_pc)\n\t\t\t\t&& (branch_target < block_end_pc)) {\n\t\t\tblock_data[(branch_target - block_start_pc) / arm_instruction_width].update_cycles =\n\t\t\t\t\t1;\n\t\t}\n\t}\n\n\tarm_dead_flag_eliminate();\n\n\tblock_exit_position = 0;\n\tblock_data_position = 0;\n\n\tlast_condition = 0x0E;\n\n\t/*if((pc & 0xFFFF0000)== 0xFFFF0000)\n\t\tblock_print=false;\n\telse*/\n\t/*if(pc == 0x2005a50)\n\t\tblock_print=true;\n\t//if(pc == 0x021c7914)\n\t//{\n\tif(dynarec_proc == DEBUG_PROC  && block_print)\n\t\tLOGE(\"pc begin %x recur level %u\", pc, translation_recursion_level);*/\n\t//\t//enable_instruct_debug=true;\n\t//}\n\n\tadd_adr(pc, (u32*)(translation_ptr - 8 - block_prologue_size));\n\twhile (pc != block_end_pc) {\n\t\t//cycle_counter_arm9++;\n\t\t/*if(cycle_counter_arm9 <1000)\n\t\t\tLOGE(\"pc %x cycle %u\", pc, cycle_count);\n\t\telse\n\t\t\texit(0);*/\n//\t\tLOGE(\"arm pc %d\\n\", pc);\n\n\t\texec_cyc=0;\n\t\tblock_data[block_data_position].block_offset = translation_ptr;\n\n\n\t\tarm_base_cycles();\n\t\t//generate_step_debug();\n\n\n\t\ttranslate_arm_instruction();\n\n\t\t//if(pc != block_end_pc)\n\t//\t\t\t\t\t\tadd_adr(pc, reinterpret_cast<u32*>(0xFFFFFFFF));\n\n\n\t\tcycle_count+=exec_cyc;\n\n\t\tblock_data_position++;\n\n\t\t/* If it went too far the cache needs to be flushed and the process\n\t\t restarted. Because we might already be nested several stages in\n\t\t a simple recursive call here won't work, it has to pedal out to\n\t\t the beginning. */\n\n\t\tif (translation_ptr > translation_cache_limit) {\n\t\t\ttranslation_flush_count++;\n\n\t\t\tif(pc<0xFFFF0000) {\n\n\t\t\t\tflush_translation_cache_rom();}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\tflush_translation_cache_bios();\n\t\t\t}\n\n\t\t\treturn -1;\n\t\t}\n\t\t/* If the next instruction is a block entry point update the\n\t\t cycle counter and update */\n\t\tif (block_data[block_data_position].update_cycles == 1) {\n\t\t\tgenerate_cycle_update();\n\t\t}\n\t}\n\t//if(dynarec_proc ==DEBUG_PROC && block_print)\n\t//LOGE(\"arm pc end %d\", pc);\n\n\tfor (i = 0; i < translation_gate_targets; i++) {\n\t\tif (pc == translation_gate_target_pc[i]) {\n\t\t\tgenerate_translation_gate(arm);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (i = 0; i < block_exit_position; i++) {\n\t\tbranch_target = block_exits[i].branch_target;\n\n\t\tif ((branch_target >= block_start_pc)\n\t\t\t\t&& (branch_target < block_end_pc)) {\n\t\t\t/* Internal branch, patch to recorded address */\n\t\t\ttranslation_target = block_data[(branch_target - block_start_pc)\n\t\t\t\t\t/ arm_instruction_width].block_offset;\n\n\t\t\tgenerate_branch_patch_unconditional(block_exits[i].branch_source,\n\t\t\t\t\ttranslation_target);\n\t\t} else {\n\t\t\t/* External branch, save for later */\n\t\t\texternal_block_exits[external_block_exit_position].branch_target =\n\t\t\t\t\tbranch_target;\n\t\t\texternal_block_exits[external_block_exit_position].branch_source =\n\t\t\t\t\tblock_exits[i].branch_source;\n\t\t\texternal_block_exit_position++;\n\t\t}\n\t}\n\n\tif(pc<0xFFFF0000) {\n\n\t\trom_translation_ptr = translation_ptr;}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t bios_translation_ptr = translation_ptr;\n\t\t\t\t}\n\n\tfor (i = 0; i < external_block_exit_position; i++) {\n\t\tbranch_target = external_block_exits[i].branch_target;\n\t\tarm_link_block();\n\t\tif (translation_target == NULL)\n\t\t\treturn -1;\n\t\tgenerate_branch_patch_unconditional(\n\t\t\t\texternal_block_exits[i].branch_source, translation_target);\n\t}\n\n\treturn 0;\n\n#undef generate_indirect_branch_arm\n#undef generate_indirect_branch_dual\n#undef prepare_load_reg\n#undef prepare_load_reg_pc\n#undef prepare_store_reg\n#undef complete_store_reg\n#undef complete_store_reg_pc_no_flags\n#undef complete_store_reg_pc_flags\n#undef generate_load_reg\n#undef generate_store_reg\n}\n\n__attribute__((noinline)) s32 translate_block_thumb(u32 pc, translation_region_type translation_region,\n\t\tu32 smc_enable) {\n#define prepare_load_reg(scratch_reg, reg_index)                        \\\n  ({                                                                           \\\n\tu32 out;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \\\n    u32 reg_use = thumb_register_allocation[reg_index];                       \\\n    if(reg_use == mem_reg)                                                    \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n      out=scratch_reg;                                                     \\\n    }                                                                         \\\n    else\\\n    {\\\n    \tout=reg_use;                                                           \\\n    }\\\n    out;\\\n  })                                                                           \\\n                                                                              \\\n\n#define prepare_load_reg_pc(scratch_reg, reg_index, pc_offset)      \\\n  ({                                                                           \\\n\t  u32 out;\\\n    if(reg_index == 15)                                                       \\\n    {                                                                         \\\n      generate_load_pc(scratch_reg, pc + pc_offset);                          \\\n      out=scratch_reg;                                                     \\\n    }\\\n\telse\\\n\t{\\\n\t\tout=prepare_load_reg(scratch_reg, reg_index);                          \\\n\t}\\\n    out;\\\n  })                                                                           \\\n                                                                              \\\n\n#define prepare_store_reg(scratch_reg, reg_index)                       \\\n  ({                                                                           \\\n    u32 reg_use = thumb_register_allocation[reg_index];                       \\\n    reg_use==mem_reg ? scratch_reg : reg_use;\\\n  })                                                                           \\\n                                                                              \\\n\n#define complete_store_reg(scratch_reg, reg_index)                     \\\n  ({                                                                           \\\n    if(thumb_register_allocation[reg_index] == mem_reg)                       \\\n    {                                                                         \\\n      ARM_STR_IMM(0, scratch_reg, reg_base,                                   \\\n       (reg_base_offset + (reg_index * 4)));                                  \\\n    }                                                                         \\\n  })                                                                           \\\n                                                                              \\\n\n#define generate_load_reg(ireg, reg_index)                             \\\n  ({                                                                           \\\n    s32 load_src = thumb_register_allocation[reg_index];                      \\\n    if(load_src != mem_reg)                                                   \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, ireg, load_src);                                     \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_LDR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  })                                                                           \\\n                                                                              \\\n\n#define generate_store_reg(ireg, reg_index)                            \\\n  ({                                                                           \\\n    s32 store_dest = thumb_register_allocation[reg_index];                    \\\n    if(store_dest != mem_reg)                                                 \\\n    {                                                                         \\\n      ARM_MOV_REG_REG(0, store_dest, ireg);                                   \\\n    }                                                                         \\\n    else                                                                      \\\n    {                                                                         \\\n      ARM_STR_IMM(0, ireg, reg_base, (reg_base_offset + (reg_index * 4)));    \\\n    }                                                                         \\\n  })                                                                           \\\n\n\n\tu32 opcode = 0;\n\tu32 last_opcode;\n\tu32 condition;\n\tu32 last_condition;\n\tu32 block_start_pc = pc;\n\tu32 block_end_pc = pc;\n\tu32 block_exit_position = 0;\n\ts32 block_data_position = 0;\n\tu32 external_block_exit_position = 0;\n\tu32 branch_target;\n\tu32 cycle_count = 0;\n\tu8 *translation_target;\n\tu8 *backpatch_address = NULL;\n\tu8 *translation_ptr = NULL;\n\tu8 *translation_cache_limit = NULL;\n\ts32 i;\n\tu32 flag_status;\n\tu32 exec_cyc=0;\n\tblock_exit_type external_block_exits[MAX_EXITS];\n\tthumb_fix_pc();\n\n\tif(pc<0xFFFF0000)\n\t\t{\n\t\ttranslation_ptr = rom_translation_ptr;\n\t\ttranslation_cache_limit = rom_translation_cache + ROM_TRANSLATION_CACHE_SIZE\n\t\t\t\t- TRANSLATION_CACHE_LIMIT_THRESHOLD;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttranslation_ptr = bios_translation_ptr;\n\t\t\ttranslation_cache_limit = bios_translation_cache +\n\t\t\tBIOS_TRANSLATION_CACHE_SIZE;\n\t\t}\n\n\tgenerate_block_prologue();\n\n\t/* This is a function because it's used a lot more than it might seem (all\n\t of the data processing functions can access it), and its expansion was\n\t massacreing the compiler. */\n\n\tif (smc_enable) {\n\t\tscan_block(thumb, yes);\n\t} else {\n\t\tscan_block(thumb, no);\n\t}\n\n\tfor (i = 0; i < block_exit_position; i++) {\n\t\tbranch_target = block_exits[i].branch_target;\n\n\t\tif ((branch_target > block_start_pc)\n\t\t\t\t&& (branch_target < block_end_pc)) {\n\t\t\tblock_data[(branch_target - block_start_pc)\n\t\t\t\t\t/ thumb_instruction_width].update_cycles = 1;\n\t\t}\n\t}\n\n\tthumb_dead_flag_eliminate();\n\n\tblock_exit_position = 0;\n\tblock_data_position = 0;\n\n\tlast_condition = 0x0E;\n\t//if(dynarec_proc == DEBUG_PROC && block_print)\n\t//LOGE(\"thumb  pc begin %x recur level %u\", pc, translation_recursion_level);\n\n\tadd_adr(pc, (u32*)(translation_ptr - 8 - block_prologue_size));\n\twhile (pc != block_end_pc) {\n//\t\tLOGE(\"thumb pc %d\\n\", pc);\n\t\texec_cyc=0;\n\t\n\t\tblock_data[block_data_position].block_offset = translation_ptr;\n\n\t\tthumb_base_cycles();\n\t\t//generate_step_debug();\n\n\t\ttranslate_thumb_instruction();\n\n\t\t//if(pc != block_end_pc)\n\t\t//\t\t\tadd_adr(pc, reinterpret_cast<u32*>(0xFFFFFFFF));\n\n\t\tblock_data_position++;\n\n\t\t/* If it went too far the cache needs to be flushed and the process\n\t\t restarted. Because we might already be nested several stages in\n\t\t a simple recursive call here won't work, it has to pedal out to\n\t\t the beginning. */\n\t\tcycle_count+=exec_cyc;\n\n\t\tif (translation_ptr > translation_cache_limit) {\n\t\t\ttranslation_flush_count++;\n\n\t\t\tif(pc<0xFFFF0000) {\n\n\t\t\t\t\t\t\tflush_translation_cache_rom();}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tflush_translation_cache_bios();\n\t\t\t\t\t\t}\n\n\t\t\treturn -1;\n\t\t}\n\n\t\t/* If the next instruction is a block entry point update the\n\t\t cycle counter and update */\n\t\tif (block_data[block_data_position].update_cycles == 1) {\n\t\t\tgenerate_cycle_update();\n\t\t}\n\t}\n\t//if(dynarec_proc ==DEBUG_PROC && block_print)\n\t//LOGE(\"thumb pc end %d\", pc);\n\n\tfor (i = 0; i < translation_gate_targets; i++) {\n\t\tif (pc == translation_gate_target_pc[i]) {\n\t\t\tgenerate_translation_gate(thumb);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (i = 0; i < block_exit_position; i++) {\n\t\tbranch_target = block_exits[i].branch_target;\n\n\t\tif ((branch_target >= block_start_pc)\n\t\t\t\t&& (branch_target < block_end_pc)) {\n\t\t\t/* Internal branch, patch to recorded address */\n\t\t\ttranslation_target = block_data[(branch_target - block_start_pc)\n\t\t\t\t\t/ thumb_instruction_width].block_offset;\n\n\t\t\tgenerate_branch_patch_unconditional(block_exits[i].branch_source,\n\t\t\t\t\ttranslation_target);\n\t\t} else {\n\t\t\t/* External branch, save for later */\n\t\t\texternal_block_exits[external_block_exit_position].branch_target =\n\t\t\t\t\tbranch_target;\n\t\t\texternal_block_exits[external_block_exit_position].branch_source =\n\t\t\t\t\tblock_exits[i].branch_source;\n\t\t\texternal_block_exit_position++;\n\t\t}\n\t}\n\n\tif(pc<0xFFFF0000) {\n\n\t\t\trom_translation_ptr = translation_ptr;}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t bios_translation_ptr = translation_ptr; ;\n\t\t\t\t\t}\n\n\tfor (i = 0; i < external_block_exit_position; i++) {\n\t\tbranch_target = external_block_exits[i].branch_target;\n\t\tthumb_link_block();\n\t\tif (translation_target == NULL)\n\t\t\treturn -1;\n\t\tgenerate_branch_patch_unconditional(\n\t\t\t\texternal_block_exits[i].branch_source, translation_target);\n\t}\n\n\treturn 0;\n\n#undef prepare_load_reg\n#undef prepare_load_reg_pc\n#undef prepare_store_reg\n#undef complete_store_reg\n#undef generate_load_reg\n#undef generate_store_reg\n}\n\nvoid flush_translation_cache_ram() {\n\t//flush_ram_count++;\n\t/*  printf(\"ram flush %d (pc %x), %x to %x, %x to %x\\n\",\n\t flush_ram_count, reg[REG_PC], iwram_code_min, iwram_code_max,\n\t ewram_code_min, ewram_code_max); */\n\n#ifndef PC_BUILD\n\tinvalidate_icache_region(ram_translation_cache,\n\t\t\t(ram_translation_ptr - ram_translation_cache) + 0x100);\n#endif\n\t//ram_translation_ptr = ram_translation_cache;\n\t//last_ram_translation_ptr = ram_translation_cache;\n\tram_block_tag_top = 0x0101;\n\tif (iwram_code_min != 0xFFFFFFFF) {\n\t\tiwram_code_min &= 0x7FFF;\n\t\tiwram_code_max &= 0x7FFF;\n\t\t//memset(iwram + iwram_code_min, 0, iwram_code_max - iwram_code_min);\n\t}\n\n\tif (ewram_code_min != 0xFFFFFFFF) {\n\t\tu32 ewram_code_min_page;\n\t\tu32 ewram_code_max_page;\n\t\tu32 ewram_code_min_offset;\n\t\tu32 ewram_code_max_offset;\n\t\tu32 i;\n\n\t\tewram_code_min &= 0x3FFFF;\n\t\tewram_code_max &= 0x3FFFF;\n\n\t\tewram_code_min_page = ewram_code_min >> 15;\n\t\tewram_code_max_page = ewram_code_max >> 15;\n\t\tewram_code_min_offset = ewram_code_min & 0x7FFF;\n\t\tewram_code_max_offset = ewram_code_max & 0x7FFF;\n\n\t\tif (ewram_code_min_page == ewram_code_max_page) {\n\t\t\t//memset(ewram + (ewram_code_min_page * 0x10000) +\n\t\t\t//ewram_code_min_offset, 0,\n\t\t\t// ewram_code_max_offset - ewram_code_min_offset);\n\t\t} else {\n\t\t\tfor (i = ewram_code_min_page + 1; i < ewram_code_max_page; i++) {\n\t\t\t\t//memset(ewram + (i * 0x10000), 0, 0x8000);\n\t\t\t}\n\n\t\t\t//memset(ewram, 0, ewram_code_max_offset);\n\t\t}\n\t}\n\n\tiwram_code_min = 0xFFFFFFFF;\n\tiwram_code_max = 0xFFFFFFFF;\n\tewram_code_min = 0xFFFFFFFF;\n\tewram_code_max = 0xFFFFFFFF;\n}\n\nvoid flush_translation_cache_rom() {\n#ifndef PC_BUILD\n\tinvalidate_icache_region(rom_translation_cache,\n\t\t\trom_translation_ptr - rom_translation_cache + 0x100);\n#endif\n\n\trom_translation_ptr = rom_translation_cache;\n\tlast_rom_translation_ptr = rom_translation_cache;\n\tmemset(rom_branch_hash, 0, sizeof(rom_branch_hash));\n\tflush_page_table();\n}\n\nvoid flush_translation_cache_bios() {\n#ifndef PC_BUILD\n\tinvalidate_icache_region(bios_translation_cache,\n\t\t\tbios_translation_ptr - bios_translation_cache + 0x100);\n#endif\n\n\tbios_block_tag_top = 0x0101;\n\tbios_translation_ptr = bios_translation_cache;\n\tlast_bios_translation_ptr = bios_translation_cache;\n\t//LOGE(\"flush called\");\n\tmemset(bios_rom, 0, 0x8000);\n\twipe_bios();\n}\n\n#ifdef GP2X_BUILD\n#define cache_dump_prefix \"/mnt/dump/\"\n#else\n#define cache_dump_prefix \"\"\n#endif\n\n#define stdio_file_open_read  \"rb\"\n#define stdio_file_open_write \"wb\"\n\n#define file_close(filename_tag)                                            \\\n   fclose(filename_tag)                                                      \\\n\n#define file_write(filename_tag, buffer, size)                              \\\n\t    fwrite(buffer, size, 1, filename_tag)                                     \\\n\n#define file_open(filename_tag, filename, mode)                             \\\n  FILE *filename_tag = fopen(filename, stdio_file_open_##mode)              \\\n\n__attribute__((noinline)) void dump_translation_cache() {\n\t/*file_open(ram_cache, cache_dump_prefix \"ram_cache.bin\", write);\n\tfile_write(ram_cache, ram_translation_cache,\n\t\t\tram_translation_ptr - ram_translation_cache);\n\tfile_close(ram_cache);*/\n\n\tfile_open(rom_cache, cache_dump_prefix \"rom_cache.bin\", write);\n\tfile_write(rom_cache, rom_translation_cache,\n\t\t\trom_translation_ptr - rom_translation_cache);\n\tfile_close(rom_cache);\n\n\tfile_open(bios_cache, cache_dump_prefix \"bios_cache.bin\", write);\n\tfile_write(bios_cache, bios_translation_cache,\n\t\t\tbios_translation_ptr - bios_translation_cache);\n\tfile_close(bios_cache);\n}\n\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/dynarec.h",
    "content": "/*\r\n * Copyright (C) 2012 Qingping He\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License as\r\n * published by the Free Software Foundation; either version 2 of\r\n * the License, or (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n * General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r\n */\r\n\r\n#ifndef DYNAREC_H_\r\n#define DYNAREC_H_\r\n\r\n\r\n#define HAVE_DYNAREC\r\n\r\n#endif /* DYNAREC_H_ */\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/dynarec_linker.cpp",
    "content": "/*\r\n * Copyright (C) 2012 Qingping He\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License as\r\n * published by the Free Software Foundation; either version 2 of\r\n * the License, or (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n * General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r\n */\r\n\r\n#include \"dynarec_linker.h\"\r\n#include \"MMU.h\"\r\n#include \"cp15.h\"\r\nextern \"C\"\r\n{\r\n\r\n\r\nu32 dynarec_proc = ARMCPU_ARM9;\r\narmcpu_t* dynarec_cpu;\r\n\r\n\r\n\r\n\r\nu32 ds_read32(u32 b)\r\n{\r\n\tif(dynarec_proc == 0)\r\n\t{\r\n\t\tif((b & 0xFFFFC000ul) == MMU.DTCMRegion)\r\n\t\t\treturn *(u32*)(MMU.ARM9_DTCM + (b & 0x3FFCul));\r\n\t\tif ( (b & 0x0F000000ul) == 0x02000000ul)\r\n\t\t\treturn *(u32*)(MMU.MAIN_MEM + (b & 0x3FFFFCul));\r\n\t\treturn _MMU_ARM9_read32(b);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif ( (b & 0x0F000000ul) == 0x02000000ul)\r\n\t\t\treturn *(u32*)(MMU.MAIN_MEM + (b & 0x3FFFFCul));\r\n\t\treturn _MMU_ARM7_read32(b);\r\n\t}\r\n\t//return _MMU_read32(dynarec_proc, MMU_AT_DATA, (b) & 0xFFFFFFFC);\r\n}\r\n\r\nu16 ds_read16(u32 b)\r\n{\r\n\treturn _MMU_read16(dynarec_proc, MMU_AT_DATA, (b) & 0xFFFFFFFE);\r\n}\r\n\r\nu8 ds_read8(u32 b)\r\n{\r\n\treturn _MMU_read08(dynarec_proc, MMU_AT_DATA, b);\r\n}\r\n\r\nu32 read32_cycles(u32 adr)\r\n{\r\n\t//return dynarec_proc ? MMU_aluMemAccessCycles<ARMCPU_ARM7,32,MMU_AD_READ>(3,adr) : MMU_aluMemAccessCycles<ARMCPU_ARM9,32,MMU_AD_READ>(3,adr);\r\n\treturn dynarec_proc ? 2 : 4;\r\n}\r\n\r\nu32 read16_cycles(u32 adr)\r\n{\r\n\treturn dynarec_proc ? MMU_aluMemAccessCycles<ARMCPU_ARM7,16,MMU_AD_READ>(3,adr) : MMU_aluMemAccessCycles<ARMCPU_ARM9,16,MMU_AD_READ>(3,adr);\r\n}\r\n\r\nu32 read8_cycles(u32 adr)\r\n{\r\n\treturn dynarec_proc ? MMU_aluMemAccessCycles<ARMCPU_ARM7,8,MMU_AD_READ>(3,adr) : MMU_aluMemAccessCycles<ARMCPU_ARM9,8,MMU_AD_READ>(3,adr);\r\n}\r\n\r\n\r\nbool joke;\r\nbool joker()\r\n{\r\n\treturn joke;\r\n}\r\nu32 ds_write32(u32 b, u32 c)\r\n{\r\n\twrite_smc_check(b);\r\n\tif(dynarec_proc == 0)\r\n\t{\r\n\t\tif((b & 0xFFFFC000ul) == MMU.DTCMRegion)\r\n\t\t{\r\n\t\t\t*(u32*)(MMU.ARM9_DTCM + (b & 0x3FFCul)) = c;\r\n\t\t\t//return MMU_aluMemAccessCycles<ARMCPU_ARM9, 32,MMU_AD_WRITE>(2,b); //figure these out?\r\n\t\t\treturn 4;\r\n\t\t}\r\n\t\tif ( (b & 0x0F000000ul) == 0x02000000ul)\r\n\t\t{\r\n\t\t\t*(u32*)(MMU.MAIN_MEM + (b & 0x3FFFFCul)) = c;\r\n\t\t\t//return MMU_aluMemAccessCycles<ARMCPU_ARM9, 32,MMU_AD_WRITE>(2,b);\r\n\t\t\treturn 4;\r\n\t\t}\r\n\t\t_MMU_ARM9_write32(b,c);\r\n\t\t//return MMU_aluMemAccessCycles<ARMCPU_ARM9, 32,MMU_AD_WRITE>(2,b);\r\n\t\treturn 4;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif ( (b & 0x0F000000ul) == 0x02000000ul)\r\n\t\t{\r\n\t\t\t*(u32*)(MMU.MAIN_MEM + (b & 0x3FFFFCul)) = c;\r\n\t\t\t//return MMU_aluMemAccessCycles<ARMCPU_ARM7, 32,MMU_AD_WRITE>(2,b);\r\n\t\t\treturn 4;\r\n\t\t}\r\n\t\t_MMU_ARM7_write32(b,c);\r\n\t\t//return MMU_aluMemAccessCycles<ARMCPU_ARM7, 32,MMU_AD_WRITE>(2,b);\r\n\t\treturn 4;\r\n\t}\r\n\t_MMU_write32(dynarec_proc, MMU_AT_DATA, (b) & 0xFFFFFFFC,c);\r\n\t//return dynarec_proc ? MMU_aluMemAccessCycles<ARMCPU_ARM7, 32,MMU_AD_WRITE>(2,b) : MMU_aluMemAccessCycles<ARMCPU_ARM9, 32,MMU_AD_WRITE>(2,b);\r\n\treturn 4;\r\n}\r\n\r\nu32 ds_write16(u32 b, u16 c)\r\n{\r\n\t_MMU_write16(dynarec_proc, MMU_AT_DATA, (b) & 0xFFFFFFFE,c);\r\n\treturn dynarec_proc ? MMU_aluMemAccessCycles<ARMCPU_ARM7, 16,MMU_AD_WRITE>(2,b) : MMU_aluMemAccessCycles<ARMCPU_ARM9, 16 ,MMU_AD_WRITE>(2,b);\r\n}\r\n\r\nu32 ds_write8(u32 b, u8 c)\r\n{\r\n\t_MMU_write08(dynarec_proc, MMU_AT_DATA, b, c);\r\n\treturn dynarec_proc ? MMU_aluMemAccessCycles<ARMCPU_ARM7, 8 ,MMU_AD_WRITE>(2,b) : MMU_aluMemAccessCycles<ARMCPU_ARM9, 8,MMU_AD_WRITE>(2,b);\r\n}\r\n\r\nvoid arm_mcr(u32 pc)\r\n{\r\n\tu32 i=_MMU_read32(dynarec_proc, MMU_AT_CODE, pc-4);\r\n\t//store_dynarec_psr(&dynarec_cpu->CPSR, reg[Dynarec::REG_CPSR]);\r\n\tu32 cpnum = REG_POS(i, 8);\r\n\r\n\t\tif(cpnum !=15)\r\n\t\t{\r\n\t\t\t//LOGE(\"adr %x instruct %x cpnum %x\", reg[Dynarec::REG_PC], i, cpnum);\r\n\t\t}\r\n\t/*if(!cpu->codynarec_proc[cpnum])\r\n\t{\r\n\t\t//emu_halt();\r\n\t\t//INFO(\"Stopped (OP_MCR) \\n\");\r\n\t\tINFO(\"ARM%c: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated codynarec_processor)\\n\",\r\n\t\t\tdynarec_procNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\r\n\t\treturn 2;\r\n\t}*/\r\n\r\n\tarmcp15_moveARM2CP(dynarec_cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\r\n\t//cpu->codynarec_proc[cpnum]->moveARM2CP(cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&7, (i>>5)&7);\r\n\t//return 2;\r\n\t//load_dynarec_psr(&dynarec_cpu->CPSR, &reg[Dynarec::REG_CPSR]);\r\n}\r\n\r\nvoid arm_mrc(u32 pc)\r\n{\r\n\tu32 i=_MMU_read32(dynarec_proc, MMU_AT_CODE, pc-4);\r\n\t//if (dynarec_procNUM != 0) return 1;\r\n\t//store_dynarec_psr(&dynarec_cpu->CPSR, reg[Dynarec::REG_CPSR]);\r\n\tu32 cpnum = REG_POS(i, 8);\r\n\r\n\r\n\t\t//LOGE(\"adr %x instruct %x cpnum %x\", reg[Dynarec::REG_PC], i, cpnum);\r\n\r\n\t/*if(!cpu->codynarec_proc[cpnum])\r\n\t{\r\n\t\t//emu_halt();\r\n\t\t//INFO(\"Stopped (OP_MRC) \\n\");\r\n\t\tINFO(\"ARM%c: MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated codynarec_processor)\\n\",\r\n\t\t\tdynarec_procNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\r\n\t\treturn 2;\r\n\t}*/\r\n\r\n\t// ARM REF:\r\n\t//data = value from Codynarec_processor[cp_num]\r\n\t//if Rd is R15 then\r\n\t//\tN flag = data[31]\r\n\t//\tZ flag = data[30]\r\n\t//\tC flag = data[29]\r\n\t//\tV flag = data[28]\r\n\t//else /* Rd is not R15 */\r\n\t//\tRd = data\r\n\r\n\tarmcp15_moveCP2ARM(&dynarec_cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\r\n\r\n\tif (REG_POS(i, 12) == 15)\r\n\t{\r\n\t\tdynarec_cpu->R[Dynarec::REG_CPSR] = dynarec_cpu->R[REG_POS(i, 12)];\r\n\t\tLOGE(\"oh no\"); exit(0);\r\n\t}\r\n\t//cpu->codynarec_proc[cpnum]->moveCP2ARM(&cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&7, (i>>5)&7);\r\n\t//load_dynarec_psr(&dynarec_cpu->CPSR, &reg[Dynarec::REG_CPSR]);\r\n}\r\n\r\nu32 arm_swi_exec(u32 pc)\r\n{\r\n\tu32 i=_MMU_read32(dynarec_proc, MMU_AT_CODE, pc-4);\r\n\tLOGE(\"yoyo %x pc %x\", i, pc-4);\r\n\r\n\tu32 swinum = (i>>16)&0xFF;\r\n\r\n\t//ideas-style debug prints (execute this SWI with the null terminated string address in R0)\r\n\tif(swinum==0xFC)\r\n\t{\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t//if the user has changed the intVector to point away from the nds bioses,\r\n\t//then it doesn't really make any sense to use the builtin SWI's since\r\n\t//the bios ones aren't getting called anyway\r\n\tbool bypassBuiltinSWI =\r\n\t\t(dynarec_cpu->intVector == 0x00000000 && dynarec_proc==0)\r\n\t\t|| (dynarec_cpu->intVector == 0xFFFF0000 && dynarec_proc==1);\r\n\r\n\tif(dynarec_cpu->swi_tab && !bypassBuiltinSWI)\r\n\t{\r\n\t\tswinum &= 0x1F;\r\n\t\t//printf(\"%d ARM SWI %d \\n\",dynarec_procNUM,swinum);\r\n\t\tu32 val=dynarec_cpu->swi_tab[swinum]() + 3;\r\n\t\treturn val;\r\n\t}\r\n\telse\r\n\t{\r\n\t\t/* TODO (#1#): translocated SWI vectors */\r\n\t\t/* we use an irq thats not in the irq tab, as\r\n\t\t it was replaced duie to a changed intVector */\r\n\t\tStatus_Reg tmp;\r\n\t\ttmp.val = dynarec_cpu->R[16];\r\n\t\tarmcpu_switchMode(dynarec_cpu, SVC);\t\t\t\t/* enter svc mode */\r\n\t\tdynarec_cpu->R[14] = dynarec_cpu->R[15];\r\n\t\tdynarec_cpu->SPSR = tmp;\t\t\t\t\t\t\t/* save old CPSR as new SPSR */\r\n\t\tdynarec_cpu->R[16] &= ~0x20;\t\t\t\t/* handle as ARM32 code */\r\n\t\tdynarec_cpu->R[16] |= 0x80;\r\n\t\tdynarec_cpu->R[15] = dynarec_cpu->intVector + 0x08;\r\n\t\tdynarec_cpu->next_instruction = dynarec_cpu->R[15];\r\n\t\treturn 4;\r\n\t}\r\n\r\n\r\n}\r\n\r\nu32 thumb_swi_exec(u32 pc)\r\n{\r\n\tu32 i=_MMU_read16(dynarec_proc, MMU_AT_CODE, pc-2);\r\n\t//LOGE(\"yoyo %x\", i);\r\n\tu32 swinum = i & 0xFF;\r\n\r\n\t//if the user has changed the intVector to point away from the nds bioses,\r\n\t//then it doesn't really make any sense to use the builtin SWI's since\r\n\t//the bios ones aren't getting called anyway\r\n\tbool bypassBuiltinSWI =\r\n\t\t(dynarec_cpu->intVector == 0x00000000 && dynarec_proc==0)\r\n\t\t|| (dynarec_cpu->intVector == 0xFFFF0000 && dynarec_proc==1);\r\n\r\n\tif(dynarec_cpu->swi_tab && !bypassBuiltinSWI) {\r\n\t\t //zero 25-dec-2008 - in arm, we were masking to 0x1F.\r\n\t\t //this is probably safer since an invalid opcode could crash the emu\r\n\t\t //zero 30-jun-2009 - but they say that the ideas 0xFF should crash the device...\r\n\t\t //u32 swinum = cpu->instruction & 0xFF;\r\n\t\tswinum &= 0x1F;\r\n\t\t//printf(\"%d ARM SWI %d\\n\",PROCNUM,swinum);\r\n\t   return dynarec_cpu->swi_tab[swinum]() + 3;\r\n\t}\r\n\telse {\r\n\t   /* we use an irq thats not in the irq tab, as\r\n\t   it was replaced due to a changed intVector */\r\n\t   Status_Reg tmp;\r\n\t   tmp.val = dynarec_cpu->R[16];\r\n\t   armcpu_switchMode(dynarec_cpu, SVC);\t\t  /* enter svc mode */\r\n\t   dynarec_cpu->R[14] = dynarec_cpu->R[15];\t\t  /* jump to swi Vector */\r\n\t   dynarec_cpu->SPSR = tmp;\t\t\t\t\t/* save old CPSR as new SPSR */\r\n\t   dynarec_cpu->R[16] &= ~0x20;\t\t\t\t/* handle as ARM32 code */\r\n\t   dynarec_cpu->R[16] |= 0x80;\r\n\t   dynarec_cpu->R[15] = dynarec_cpu->intVector + 0x08;\r\n\t   dynarec_cpu->next_instruction = dynarec_cpu->R[15];\r\n\t   return 3;\r\n\t}\r\n\r\n}\r\n\r\nextern void flush_page_table();\r\n\r\nvoid dynarec_DeInit()\r\n{\r\n\tflush_page_table();\r\n\tLOGE(\"page table flushed\");\r\n}\r\n\r\n/*void dynarec_full_store()\r\n{\r\n\tarmcpu_switchMode(dynarec_cpu, reg[Dynarec::REG_CPSR] & 0x1F);\r\n\tstore_dynarec_arm();\r\n\r\n\tdynarec_cpu->R13_usr = reg_mode[MODE_USER][5]; dynarec_cpu->R14_usr = reg_mode[MODE_USER][6];\r\n\tdynarec_cpu->R13_svc = reg_mode[MODE_SUPERVISOR][5]; dynarec_cpu->R14_svc = reg_mode[MODE_SUPERVISOR][6];\r\n\tdynarec_cpu->R13_abt = reg_mode[MODE_ABORT][5]; dynarec_cpu->R14_abt = reg_mode[MODE_ABORT][6];\r\n\tdynarec_cpu->R13_und = reg_mode[MODE_UNDEFINED][5]; dynarec_cpu->R14_und = reg_mode[MODE_UNDEFINED][6];\r\n\tdynarec_cpu->R13_irq = reg_mode[MODE_IRQ][5]; dynarec_cpu->R14_irq = reg_mode[MODE_IRQ][6];\r\n\r\n\tdynarec_cpu->R8_fiq = reg_mode[MODE_FIQ][0];\r\n\tdynarec_cpu->R9_fiq = reg_mode[MODE_FIQ][1];\r\n\tdynarec_cpu->R10_fiq = reg_mode[MODE_FIQ][2];\r\n\tdynarec_cpu->R11_fiq = reg_mode[MODE_FIQ][3];\r\n\tdynarec_cpu->R12_fiq = reg_mode[MODE_FIQ][4];\r\n\tdynarec_cpu->R13_fiq = reg_mode[MODE_FIQ][5];\r\n\tdynarec_cpu->R14_fiq = reg_mode[MODE_FIQ][6];\r\n\r\n\tstore_dynarec_psr(&dynarec_cpu->SPSR_svc , spsr[MODE_SUPERVISOR]);\r\n\tstore_dynarec_psr(&dynarec_cpu->SPSR_abt , spsr[MODE_ABORT]);\r\n\tstore_dynarec_psr(&dynarec_cpu->SPSR_und , spsr[MODE_UNDEFINED]);\r\n\tstore_dynarec_psr(&dynarec_cpu->SPSR_irq , spsr[MODE_IRQ]);\r\n\tstore_dynarec_psr(&dynarec_cpu->SPSR_fiq , spsr[MODE_FIQ]);\r\n}\r\n\r\nvoid dynarec_full_load()\r\n{\r\n\tset_cpu_mode(cpu_modes[dynarec_cpu->CPSR.bits.mode]);\r\n\tload_dynarec_arm();\r\n\r\n\treg_mode[MODE_USER][5] = dynarec_cpu->R13_usr; reg_mode[MODE_USER][6] = dynarec_cpu->R14_usr;\r\n\treg_mode[MODE_SUPERVISOR][5] = dynarec_cpu->R13_svc; reg_mode[MODE_SUPERVISOR][6] = dynarec_cpu->R14_svc;\r\n\treg_mode[MODE_ABORT][5] = dynarec_cpu->R13_abt; reg_mode[MODE_ABORT][6] = dynarec_cpu->R14_abt;\r\n\treg_mode[MODE_UNDEFINED][5] = dynarec_cpu->R13_und; reg_mode[MODE_UNDEFINED][6] = dynarec_cpu->R14_und;\r\n\treg_mode[MODE_IRQ][5] = dynarec_cpu->R13_irq; reg_mode[MODE_IRQ][6] = dynarec_cpu->R14_irq;\r\n\r\n\treg_mode[MODE_FIQ][0] = dynarec_cpu->R8_fiq;\r\n\treg_mode[MODE_FIQ][1] = dynarec_cpu->R9_fiq;\r\n\treg_mode[MODE_FIQ][2] = dynarec_cpu->R10_fiq;\r\n\treg_mode[MODE_FIQ][3] = dynarec_cpu->R11_fiq ;\r\n\treg_mode[MODE_FIQ][4] = dynarec_cpu->R12_fiq;\r\n\treg_mode[MODE_FIQ][5] = dynarec_cpu->R13_fiq;\r\n\treg_mode[MODE_FIQ][6] = dynarec_cpu->R14_fiq;\r\n\r\n\tload_dynarec_psr(&dynarec_cpu->SPSR_svc , &spsr[MODE_SUPERVISOR]);\r\n\tload_dynarec_psr(&dynarec_cpu->SPSR_abt , &spsr[MODE_ABORT]);\r\n\tload_dynarec_psr(&dynarec_cpu->SPSR_und , &spsr[MODE_UNDEFINED]);\r\n\tload_dynarec_psr(&dynarec_cpu->SPSR_irq , &spsr[MODE_IRQ]);\r\n\tload_dynarec_psr(&dynarec_cpu->SPSR_fiq , &spsr[MODE_FIQ]);\r\n}*/\r\n\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/dynarec_linker.h",
    "content": "/*\r\n * Copyright (C) 2012 Qingping He\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License as\r\n * published by the Free Software Foundation; either version 2 of\r\n * the License, or (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\n * General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r\n */\r\n\r\n#ifndef DYNAREC_LINKER_H\r\n#define DYNAREC_LINKER_H\r\n\r\n#include \"types.h\"\r\n#include \"armcpu.h\"\r\n#include \"dynarec/cpu.h\"\r\n#include \"NDSSystem.h\"\r\n#include <android/log.h>\r\n#include \"../armcpu.h\"\r\n#include \"bios.h\"\r\n\r\nextern \"C\"\r\n{\r\n\r\nextern u32* spsr_pointer;\r\nextern u32 dynarec_proc;\r\nextern armcpu_t* dynarec_cpu;\r\n\r\n/*FORCEINLINE void switch_arm7()\r\n{\r\n\tdynarec_proc = 1;\r\n\tdynarec_cpu = &NDS_ARM7;\r\n\tspsr_pointer = &(NDS_ARM7.SPSR.val);\r\n}\r\n\r\nFORCEINLINE void switch_arm9()\r\n{\r\n\tdynarec_proc = 0;\r\n\tdynarec_cpu = &NDS_ARM9;\r\n\tspsr_pointer = &(NDS_ARM9.SPSR.val);\r\n}*/\r\n\r\n\r\nbool joker();\r\n\r\nvoid update_dynarec();\r\n\r\nvoid execute_arm_dynarec(u32 val);\r\n\r\nu32 ds_read32(u32 adr);\r\nu16 ds_read16(u32 adr);\r\nu8 ds_read8(u32 adr);\r\nu32 ds_write32(u32 adr, u32 val);\r\nu32 ds_write16(u32 adr, u16 val);\r\nu32 ds_write8(u32 adr, u8 val);\r\n\r\nu32 read8_cycles(u32 adr);\r\nu32 read16_cycles(u32 adr);\r\nu32 read32_cycles(u32 adr);\r\n\r\nu32 get_opcode();\r\n\r\nvoid load_pc();\r\nvoid arm_mrc(u32 pc);\r\nvoid arm_mcr(u32 pc);\r\n\r\n\r\n\r\n\r\n\r\n\r\nextern u32 reg_mode[7][7];\r\nextern u32 cpu_modes_cpsr[7];\r\n//extern cpu_mode_type cpu_modes[32];\r\n\r\nextern void flush_page_table();\r\n\r\nvoid dynarec_DeInit();\r\n\r\nvoid dynarec_full_load();\r\nvoid dynarec_full_store();\r\n\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/exophasejit.cpp",
    "content": "#include \"exophasejit.h\"\n#include \"cpu.h\"\n\n#include \"armcpu.h\"\n#include \"JitCommon.h\"\n#include \"debug.h\"\n\n#define TEMPLATE template<u32 PROCNUM>\n\nextern u32* spsr_pointer;\nextern u32 dynarec_proc;\nextern armcpu_t* dynarec_cpu;\n\nu32 total_cycle_arm7 = 0;\nu32 total_cycle_arm9 = 0;\n\nFORCEINLINE void switch_arm7()\n{\n\tdynarec_proc = 1;\n\tdynarec_cpu = &NDS_ARM7;\n\tspsr_pointer = &(NDS_ARM7.SPSR.val);\n}\n\nFORCEINLINE void switch_arm9()\n{\n\tdynarec_proc = 0;\n\tdynarec_cpu = &NDS_ARM9;\n\tspsr_pointer = &(NDS_ARM9.SPSR.val);\n}\n\nextern \"C\" u32 dynarec_exec();\n\nstatic void cpuReserve()\n{\n}\n\nstatic void cpuShutdown()\n{\n\tJitLutReset();\n}\n\nstatic void cpuReset()\n{\n\tJitLutReset();\n\t\n\tdynarec_cpu = &NDS_ARM9;\n\tdynarec_cpu->R[CHANGED_PC_STATUS] =1;\n\tspsr_pointer = &(dynarec_cpu->SPSR.val);\n\n\tdynarec_cpu = &NDS_ARM7;\n\tdynarec_cpu->R[CHANGED_PC_STATUS] =1;\n\tspsr_pointer = &(dynarec_cpu->SPSR.val);\n\n\tflush_translation_cache_rom();\n\tflush_translation_cache_ram();\n\tflush_translation_cache_bios();\n}\n\nstatic void cpuSync()\n{\n\tNDS_ARM7.instruct_adr = NDS_ARM7.R[15];\n\tNDS_ARM9.instruct_adr = NDS_ARM9.R[15];\n}\n\nTEMPLATE static void cpuClear(u32 Addr, u32 Size)\n{\n}\n\nTEMPLATE static u32 cpuExecute()\n{\n\tif (PROCNUM==ARMCPU_ARM9)\n\t\tswitch_arm9();\n\telse\n\t\tswitch_arm7();\n\n//\tif (PROCNUM==0)\n//\t\tLOGE(\"dynarec_cpu(%d)->PC : %x %x %x\\n\", PROCNUM, dynarec_cpu->R[15], dynarec_cpu->R[23], dynarec_cpu->R[31]);\n\n\tu32 c = dynarec_exec();\n\n//\tif (PROCNUM==ARMCPU_ARM9)\n//\t\ttotal_cycle_arm9 += c;\n//\telse\n//\t\ttotal_cycle_arm7 += c << 1;\n\n//\tINFO(\"%d\\n\",c);\n\n\treturn c;\n}\n\nstatic u32 cpuGetCacheReserve()\n{\n\treturn 64 * 1024;\n}\n\nstatic void cpuSetCacheReserve(u32 reserveInMegs)\n{\n}\n\nstatic const char* cpuDescription()\n{\n\treturn \"Arm Exophase Jit\";\n}\n\nCpuBase arm_exophasejit =\n{\n\tcpuReserve,\n\n\tcpuShutdown,\n\n\tcpuReset,\n\n\tcpuSync,\n\n\tcpuClear<0>, cpuClear<1>,\n\n\tcpuExecute<0>, cpuExecute<1>,\n\n\tcpuGetCacheReserve,\n\tcpuSetCacheReserve,\n\n\tcpuDescription\n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/exophasejit.h",
    "content": "#ifndef EXOPHASEJIT_H_\n#define EXOPHASEJIT_H_\n\n#include \"common.h\"\n#include \"CpuBase.h\"\n\nextern CpuBase arm_exophasejit;\n\n#endif /* EXOPHASEJIT_H_ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/warm.cpp",
    "content": "/*\n * wARM - exporting ARM processor specific privileged services to userspace\n * userspace part\n *\n * Copyright (c) Gražvydas \"notaz\" Ignotas, 2009\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of the organization nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n#include \"warm.h\"\n\nextern \"C\"\n{\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/ioctl.h>\n#include <sys/utsname.h>\n#include <sys/syscall.h>\n#include <errno.h>\n#include <android/log.h>\n\n\n/* provided by glibc */\nextern long init_module(void *, unsigned long, const char *);\nextern long delete_module(const char *, unsigned int);\n\nstatic int warm_fd = -1;\nstatic int kernel_version;\n\nstatic void sys_cacheflush(void *start, void *end)\n{\n\t//__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"sys_cacheflush %x %x\", (unsigned long)start, (unsigned long)end);\n\t__builtin___clear_cache(start,end);\n/*\n#ifdef __ARM_EABI__\n\t// EABI version *\n\tint num = __ARM_NR_cacheflush;\n\t__asm__(\"mov  r0, %0 ;\"\n\t\t\"mov  r1, %1 ;\"\n\t\t\"mov  r2, #0 ;\"\n\t\t\"mov  r7, %2 ;\"\n\t\t\"swi  0\" : : \"r\" (start), \"r\" (end), \"r\" (num)\n\t\t\t: \"r0\", \"r1\", \"r2\", \"r3\", \"r7\");\n#else\n\t// OABI\n\t__asm__(\"mov  r0, %0 ;\"\n\t\t\"mov  r1, %1 ;\"\n\t\t\"mov  r2, #0 ;\"\n\t\t\"swi  %2\" : : \"r\" (start), \"r\" (end), \"i\" __ARM_NR_cacheflush\n\t\t\t: \"r0\", \"r1\", \"r2\", \"r3\");\n#endif\n*/\n}\n\n/* Those are here because system() occasionaly fails on Wiz\n * with errno 12 for some unknown reason */\nstatic int manual_insmod_26(const char *fname, const char *opts)\n{\n\tunsigned long len, read_len;\n\tint ret = -1;\n\tvoid *buff;\n\tFILE *f;\n\n\tf = fopen(fname, \"rb\");\n\tif (f == NULL)\n\t\treturn -1;\n\n\tfseek(f, 0, SEEK_END);\n\tlen = ftell(f);\n\tfseek(f, 0, SEEK_SET);\n\n\tbuff = malloc(len);\n\tif (buff == NULL)\n\t\tgoto fail0;\n\n\tread_len = fread(buff, 1, len, f);\n\tif (read_len != len) {\n\t\tfprintf(stderr, \"failed to read module\\n\");\n\t\tgoto fail1;\n\t}\n\n\tret = init_module(buff, len, opts);\n\nfail1:\n\tfree(buff);\nfail0:\n\tfclose(f);\n\treturn ret;\n}\n\nstatic int manual_rmmod(const char *name)\n{\n\treturn delete_module(name, O_NONBLOCK|O_EXCL);\n}\n\nint warm_init(void)\n{\n\tstruct utsname unm;\n\tchar buff1[32], buff2[128];\n\tint ret;\n\n\tmemset(&unm, 0, sizeof(unm));\n\tuname(&unm);\n\n\tif (strlen(unm.release) < 3 || unm.release[1] != '.') {\n\t\tfprintf(stderr, \"unexpected version string: %s\\n\", unm.release);\n\t\tgoto fail;\n\t}\n\tkernel_version = ((unm.release[0] - '0') << 4) | (unm.release[2] - '0');\n\n\twarm_fd = open(\"/proc/warm\", O_RDWR);\n\tif (warm_fd >= 0)\n\t\treturn 0;\n\n\tsnprintf(buff1, sizeof(buff1), \"warm_%s.%s\", unm.release, kernel_version >= 0x26 ? \"ko\" : \"o\");\n\tsnprintf(buff2, sizeof(buff2), \"/sbin/insmod %s verbose=1\", buff1);\n\n\t/* try to insmod */\n\tret = system(buff2);\n\tif (ret != 0) {\n\t\tfprintf(stderr, \"system/insmod failed: %d %d\\n\", ret, errno);\n\t\tif (kernel_version >= 0x26) {\n\t\t\tret = manual_insmod_26(buff1, \"verbose=1\");\n\t\t\tif (ret != 0)\n\t\t\t\tfprintf(stderr, \"manual insmod also failed: %d\\n\", ret);\n\t\t}\n\t}\n\n\twarm_fd = open(\"/proc/warm\", O_RDWR);\n\tif (warm_fd >= 0)\n\t\treturn 0;\n\nfail:\n\tfprintf(stderr, \"wARM: can't init, acting as sys_cacheflush wrapper\\n\");\n\treturn -1;\n}\n\nvoid warm_finish(void)\n{\n\tchar name[32], cmd[64];\n\tint ret;\n\n\tif (warm_fd < 0)\n\t\treturn;\n\n\tclose(warm_fd);\n\twarm_fd = -1;\n\n\tif (kernel_version < 0x26) {\n\t\tstruct utsname unm;\n\t\tmemset(&unm, 0, sizeof(unm));\n\t\tuname(&unm);\n\t\tsnprintf(name, sizeof(name), \"warm_%s\", unm.release);\n\t}\n\telse\n\t\tstrcpy(name, \"warm\");\n\n\tsnprintf(cmd, sizeof(cmd), \"/sbin/rmmod %s\", name);\n\tret = system(cmd);\n\tif (ret != 0) {\n\t\tfprintf(stderr, \"system/rmmod failed: %d %d\\n\", ret, errno);\n\t\tmanual_rmmod(name);\n\t}\n}\n\nint warm_cache_op_range(int op, void *addr, unsigned long size)\n{\n\tstruct warm_cache_op wop;\n\tint ret;\n\n\tif (warm_fd < 0) {\n\t\t/* note that this won't work for warm_cache_op_all */\n\t\tsys_cacheflush(addr, (char *)addr + size);\n\t\treturn -1;\n\t}\n\n\twop.ops = op;\n\twop.addr = (unsigned long)addr;\n\twop.size = size;\n\n\tret = ioctl(warm_fd, WARMC_CACHE_OP, &wop);\n\tif (ret != 0) {\n\t\tperror(\"WARMC_CACHE_OP failed\");\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\nint warm_cache_op_all(int op)\n{\n\treturn warm_cache_op_range(op, NULL, (unsigned long)-1);\n}\n\nint warm_change_cb_range(int cb, int is_set, void *addr, unsigned long size)\n{\n\tstruct warm_change_cb ccb;\n\tint ret;\n\n\tif (warm_fd < 0)\n\t\treturn -1;\n\t\n\tccb.addr = (unsigned long)addr;\n\tccb.size = size;\n\tccb.cb = cb;\n\tccb.is_set = is_set;\n\n\tret = ioctl(warm_fd, WARMC_CHANGE_CB, &ccb);\n\tif (ret != 0) {\n\t\tperror(\"WARMC_CHANGE_CB failed\");\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\nint warm_change_cb_upper(int cb, int is_set)\n{\n\treturn warm_change_cb_range(cb, is_set, 0, 0);\n}\n\nunsigned long warm_virt2phys(const void *ptr)\n{\n\tunsigned long ptrio;\n\tint ret;\n\n\tptrio = (unsigned long)ptr;\n\tret = ioctl(warm_fd, WARMC_VIRT2PHYS, &ptrio);\n\tif (ret != 0) {\n\t\tperror(\"WARMC_VIRT2PHYS failed\");\n\t\treturn (unsigned long)-1;\n\t}\n\n\treturn ptrio;\n}\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/dynarec/warm.h",
    "content": "/*\n * wARM - exporting ARM processor specific privileged services to userspace\n * library functions\n *\n * Copyright (c) Gražvydas \"notaz\" Ignotas, 2009\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of the organization nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nextern \"C\"\n{\n#ifndef __WARM_H__\n#define __WARM_H__ 1\n\n/* cache operations (warm_cache_op_*):\n * o clean - write dirty data to memory, but also leave in cache.\n * o invalidate - throw away everything in cache, losing dirty data.\n *\n * Write buffer is always drained, no ops will only drain WB\n */\n#define WOP_D_CLEAN\t\t(1 << 0)\n#define WOP_D_INVALIDATE\t(1 << 1)\n#define WOP_I_INVALIDATE\t(1 << 2)\n\n/* change C and B bits (warm_change_cb_*)\n * if is_set in not zero, bits are set, else cleared.\n * the address for range function is virtual address.\n */\n#define WCB_C_BIT\t\t(1 << 0)\n#define WCB_B_BIT\t\t(1 << 1)\n\n#ifndef __ASSEMBLER__\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\nint warm_init(void);\n\nint warm_cache_op_range(int ops, void *virt_addr, unsigned long size);\nint warm_cache_op_all(int ops);\n\nint warm_change_cb_upper(int cb, int is_set);\nint warm_change_cb_range(int cb, int is_set, void *virt_addr, unsigned long size);\n\nunsigned long warm_virt2phys(const void *ptr);\n\nvoid warm_finish(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n/* internal */\n#define WARM_CODE\n#ifdef WARM_CODE\n\n#include <linux/ioctl.h>\n\n#define WARM_IOCTL_BASE 'A'\n\nstruct warm_cache_op\n{\n\tunsigned long addr;\n\tunsigned long size;\n\tint ops;\n};\n\nstruct warm_change_cb\n{\n\tunsigned long addr;\n\tunsigned long size;\n\tint cb;\n\tint is_set;\n};\n\n#define WARMC_CACHE_OP\t_IOW(WARM_IOCTL_BASE,  0, struct warm_cache_op)\n#define WARMC_CHANGE_CB\t_IOW(WARM_IOCTL_BASE,  1, struct warm_change_cb)\n#define WARMC_VIRT2PHYS\t_IOWR(WARM_IOCTL_BASE, 2, unsigned long)\n\n#endif /* WARM_CODE */\n#endif /* !__ASSEMBLER__ */\n#endif /* __WARM_H__ */\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/main.cpp",
    "content": "/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include <jni.h>\r\n#include <errno.h>\r\n\r\n#include <android/native_window_jni.h>\r\n\r\n#include <EGL/egl.h>\r\n#include <GLES/gl.h>\r\n#include <android/sensor.h>\r\n#include <android/bitmap.h>\r\n\r\n\r\n#include \"main.h\"\r\n#include \"../OGLES2Render.h\"\r\n#include \"../rasterize.h\"\r\n#include \"../SPU.h\"\r\n#include \"../debug.h\"\r\n#include \"../NDSSystem.h\"\r\n#include \"../path.h\"\r\n#include \"../GPU_OSD.h\"\r\n#include \"../addons.h\"\r\n#include \"../slot1.h\"\r\n#include \"../saves.h\"\r\n#include \"throttle.h\"\r\n#include \"video.h\"\r\n#include \"OpenArchive.h\"\r\n#include \"sndopensl.h\"\r\n#include \"cheatSystem.h\"\r\n#ifdef HAVE_NEON\r\n#include \"neontest.h\"\r\n#endif\r\n\r\n#define JNI(X,...) Java_com_opendoorstudios_ds4droid_DeSmuME_##X(JNIEnv* env, jclass* clazz, __VA_ARGS__)\r\n#define JNI_NOARGS(X) Java_com_opendoorstudios_ds4droid_DeSmuME_##X(JNIEnv* env, jclass* clazz)\r\nint scanline_filter_a = 0, scanline_filter_b = 2, scanline_filter_c = 2, scanline_filter_d = 4;\r\n\r\nunsigned int frameCount = 0;\r\n\r\nGPU3DInterface *core3DList[] = {\r\n\t&gpu3DNull,\r\n\t&gpu3Dgles2,\r\n\t&gpu3DRasterize,\r\n\tNULL\r\n};\r\n\r\nSoundInterface_struct *SNDCoreList[] = {\r\n\t&SNDDummy,\r\n\t&SNDOpenSL,\r\n\tNULL\r\n};\r\n\r\nvolatile bool execute = false;\r\nvolatile bool paused = true;\r\nvolatile BOOL pausedByMinimize = FALSE;\r\nbool autoframeskipenab=1;\r\nint frameskiprate=1;\r\nint lastskiprate=0;\r\nint emu_paused = 0;\r\nbool frameAdvance = false;\r\nbool continuousframeAdvancing = false;\r\nbool staterewindingenabled = false;\r\nstruct NDS_fw_config_data fw_config;\r\nbool FrameLimit = true;\r\nint sndcoretype, sndbuffersize;\r\nstatic int snd_synchmode=0;\r\nstatic int snd_synchmethod=0;\r\nAndroidBitmapInfo bitmapInfo;\r\nEGLSurface surface;\r\nEGLContext context;\r\nconst char* IniName = NULL;\r\nchar androidTempPath[1024];\r\nbool useMmapForRomLoading;\r\nextern bool enableMicrophone;\r\n\r\n#ifdef USE_PROFILER\r\nbool profiler_start = false;\r\nbool profiler_end = false;\r\n#include \"android-ndk-profiler/prof.h\"\r\n#endif\r\n\r\n#ifdef MEASURE_FIRST_FRAMES\r\nint mff_totalFrames = 0;\r\nunsigned int mff_totalTime = 0;\r\nbool mff_do = false;\r\nconst int mff_toMeasure = 600;\r\n#endif\r\n\r\n\r\n//triple buffering logic\r\nu16 displayBuffers[3][256*192*4];\r\nvolatile int currDisplayBuffer=-1;\r\nvolatile int newestDisplayBuffer=-2;\r\n\r\nstruct HudStruct2\r\n{\r\npublic:\r\n\tHudStruct2()\r\n\t{\r\n\t\tresetTransient();\r\n\t}\r\n\r\n\tvoid resetTransient()\r\n\t{\r\n\t\tfps = 0;\r\n\t\tfps3d = 0;\r\n\t\tcpuload[0] = cpuload[1] = 0;\r\n\t\tcpuloopIterationCount = 0;\r\n\t}\r\n\r\n\tvoid reset()\r\n\t{\r\n\t}\r\n\r\n\tint fps, fps3d, cpuload[2], cpuloopIterationCount;\r\n};\r\n\r\nHudStruct2 Hud;\r\n\r\nstruct MainLoopData\r\n{\r\n\tu64 freq;\r\n\tint framestoskip;\r\n\tint framesskipped;\r\n\tint skipnextframe;\r\n\tu64 lastticks;\r\n\tu64 curticks;\r\n\tu64 diffticks;\r\n\tu64 fpsticks;\r\n\tint fps;\r\n\tint fps3d;\r\n\tint fpsframecount;\r\n\tint toolframecount;\r\n}  mainLoopData = {0};\r\n\r\nVideoInfo video;\r\n\r\nvoid doBitmapDraw(u8* pixels, u8* dest, int width, int height, int stride, int pixelFormat, int verticalOffset, bool rotate);\r\n\r\nextern \"C\" {\r\n\r\nvoid logCallback(const Logger& logger, const char* message)\r\n{\r\n\tif(message)\r\n\t\tLOGI(\"%s\", message);\r\n}\r\n\r\n/**\r\n * Initialize an EGL context for the current display.\r\n */\r\nstatic bool android_opengl_init() {\r\n\t//call back into java here?\r\n\t\r\n\tconst EGLint attribs[] = {\r\n            EGL_RED_SIZE, 8,\r\n\t\t\tEGL_GREEN_SIZE, 8,\r\n\t\t\tEGL_BLUE_SIZE, 8,\r\n\t\t\tEGL_ALPHA_SIZE, 8,\r\n\t\t\tEGL_DEPTH_SIZE, 16,\r\n\t\t\tEGL_STENCIL_SIZE, 8,\r\n\t\t\tEGL_SURFACE_TYPE, EGL_PBUFFER_BIT,\r\n\t\t\tEGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,\r\n\t\t\tEGL_NONE \r\n    };\r\n\tEGLint major, minor;\r\n    EGLint w, h, format;\r\n    EGLint numConfigs;\r\n    EGLConfig config;\r\n    EGLSurface surface;\r\n    EGLContext context;\r\n\r\n    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);\r\n\r\n    eglInitialize(display, &major, &minor);\r\n\r\n    /* Here, the application chooses the configuration it desires. In this\r\n     * sample, we have a very simplified selection process, where we pick\r\n     * the first EGLConfig that matches our criteria */\r\n    eglChooseConfig(display, attribs, &config, 1, &numConfigs);\r\n\r\n\tconst EGLint surfaceAttribs[] = {\r\n            EGL_WIDTH, 256,\r\n\t\t\tEGL_HEIGHT, 256,\r\n\t\t\tEGL_LARGEST_PBUFFER, EGL_FALSE,\r\n\t\t\tEGL_NONE\r\n    };\r\n\t\r\n    surface = eglCreatePbufferSurface(display, config, surfaceAttribs);\r\n\r\n\tconst EGLint contextAttribs[] = {\r\n\t\t\tEGL_CONTEXT_CLIENT_VERSION, 2,\r\n\t\t\tEGL_NONE\r\n    };\r\n\r\n    context = eglCreateContext(display, config, NULL, contextAttribs);\r\n\r\n    if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {\r\n        LOGW(\"Unable to eglMakeCurrent\\n\");\r\n        return false;\r\n    }\r\n\t\r\n\tINFO(\"EGL(%u.%u): Created OpenGLES\\n\", major ,minor);\r\n    return true;\r\n}\r\n\r\n\r\n\r\nbool NDS_Pause(bool showMsg = true)\r\n{\r\n\tif(paused) return false;\r\n\r\n\temu_halt();\r\n\tpaused = TRUE;\r\n\tSPU_Pause(1);\r\n\twhile (!paused) {}\r\n\tif (showMsg) INFO(\"Emulation paused\\n\");\r\n\r\n\treturn true;\r\n}\r\n\r\nvoid NDS_UnPause(bool showMsg = true)\r\n{\r\n\tif (/*romloaded &&*/ paused)\r\n\t{\r\n\t\tpaused = FALSE;\r\n\t\tpausedByMinimize = FALSE;\r\n\t\texecute = TRUE;\r\n\t\tSPU_Pause(0);\r\n\t\tif (showMsg) INFO(\"Emulation unpaused\\n\");\r\n\r\n\t}\r\n}\r\n\r\nvoid nds4droid_display()\r\n{\r\n\r\n\tif(int diff = (currDisplayBuffer+1)%3 - newestDisplayBuffer)\r\n\t\tnewestDisplayBuffer += diff;\r\n\telse newestDisplayBuffer = (currDisplayBuffer+2)%3;\r\n\r\n\tmemcpy(displayBuffers[newestDisplayBuffer],GPU_screen,256*192*4);\r\n}\r\n\r\nstatic void nds4droid_throttle(bool allowSleep = true, int forceFrameSkip = -1)\r\n{\r\n\tint skipRate = (forceFrameSkip < 0) ? frameskiprate : forceFrameSkip;\r\n\tint ffSkipRate = (forceFrameSkip < 0) ? 9 : forceFrameSkip;\r\n\r\n\tif(lastskiprate != skipRate)\r\n\t{\r\n\t\tlastskiprate = skipRate;\r\n\t\tmainLoopData.framestoskip = 0; // otherwise switches to lower frameskip rates will lag behind\r\n\t}\r\n\r\n\tif(!mainLoopData.skipnextframe || forceFrameSkip == 0 || frameAdvance || (continuousframeAdvancing && !FastForward))\r\n\t{\r\n\t\tmainLoopData.framesskipped = 0;\r\n\r\n\t\tif (mainLoopData.framestoskip > 0)\r\n\t\t\tmainLoopData.skipnextframe = 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tmainLoopData.framestoskip--;\r\n\r\n\t\tif (mainLoopData.framestoskip < 1)\r\n\t\t\tmainLoopData.skipnextframe = 0;\r\n\t\telse\r\n\t\t\tmainLoopData.skipnextframe = 1;\r\n\r\n\t\tmainLoopData.framesskipped++;\r\n\r\n\t\tNDS_SkipNextFrame();\r\n\t}\r\n\r\n\tif(FastForward)\r\n\t{\r\n\t\tif(mainLoopData.framesskipped < ffSkipRate)\r\n\t\t{\r\n\t\t\tmainLoopData.skipnextframe = 1;\r\n\t\t\tmainLoopData.framestoskip = 1;\r\n\t\t}\r\n\t\tif (mainLoopData.framestoskip < 1)\r\n\t\t\tmainLoopData.framestoskip += ffSkipRate;\r\n\t}\r\n\telse if((/*autoframeskipenab && frameskiprate ||*/ FrameLimit) && allowSleep)\r\n\t{\r\n\t\tSpeedThrottle();\r\n\t}\r\n\r\n\tif (autoframeskipenab && frameskiprate)\r\n\t{\r\n\t\tif(!frameAdvance && !continuousframeAdvancing)\r\n\t\t{\r\n\t\t\tAutoFrameSkip_NextFrame();\r\n\t\t\tif (mainLoopData.framestoskip < 1)\r\n\t\t\t\tmainLoopData.framestoskip += AutoFrameSkip_GetSkipAmount(0,skipRate);\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (mainLoopData.framestoskip < 1)\r\n\t\t\tmainLoopData.framestoskip += skipRate;\r\n\t}\r\n\r\n\tif (frameAdvance && allowSleep)\r\n\t{\r\n\t\tframeAdvance = false;\r\n\t\temu_halt();\r\n\t\tSPU_Pause(1);\r\n\t}\r\n\tif(execute && emu_paused && !frameAdvance)\r\n\t{\r\n\t\t// safety net against running out of control in case this ever happens.\r\n\t\tNDS_UnPause(); NDS_Pause();\r\n\t}\r\n\r\n\t//ServiceDisplayThreadInvocations();\r\n}\r\n\r\nvoid nds4droid_user()\r\n{\r\n\tconst int kFramesPerToolUpdate = 1;\r\n\r\n\tHud.fps = mainLoopData.fps;\r\n\tHud.fps3d = mainLoopData.fps3d;\r\n\r\n\tnds4droid_display();\r\n\r\n\tgfx3d.frameCtrRaw++;\r\n\tif(gfx3d.frameCtrRaw == 60) {\r\n\t\tmainLoopData.fps3d = gfx3d.frameCtr;\r\n\t\tgfx3d.frameCtrRaw = 0;\r\n\t\tgfx3d.frameCtr = 0;\r\n\t}\r\n\r\n\tmainLoopData.toolframecount++;\r\n\r\n\t//Update_RAM_Search(); // Update_RAM_Watch() is also called.\r\n\r\n\tmainLoopData.fpsframecount++;\r\n\tmainLoopData.curticks = GetTickCount();\r\n\tbool oneSecond = mainLoopData.curticks >= mainLoopData.fpsticks + mainLoopData.freq;\r\n\tif(oneSecond) // TODO: print fps on screen in DDraw\r\n\t{\r\n\t\tmainLoopData.fps = mainLoopData.fpsframecount;\r\n\t\tmainLoopData.fpsframecount = 0;\r\n\t\tmainLoopData.fpsticks = GetTickCount();\r\n\t}\r\n\r\n\tif(nds.idleFrameCounter==0 || oneSecond) \r\n\t{\r\n\t\t//calculate a 16 frame arm9 load average\r\n\t\tfor(int cpu=0;cpu<2;cpu++)\r\n\t\t{\r\n\t\t\tint load = 0;\r\n\t\t\t//printf(\"%d: \",cpu);\r\n\t\t\tfor(int i=0;i<16;i++)\r\n\t\t\t{\r\n\t\t\t\t//blend together a few frames to keep low-framerate games from having a jittering load average\r\n\t\t\t\t//(they will tend to work 100% for a frame and then sleep for a while)\r\n\t\t\t\t//4 frames should handle even the slowest of games\r\n\t\t\t\ts32 sample = \r\n\t\t\t\t\tnds.runCycleCollector[cpu][(i+0+nds.idleFrameCounter)&15]\r\n\t\t\t\t+\tnds.runCycleCollector[cpu][(i+1+nds.idleFrameCounter)&15]\r\n\t\t\t\t+\tnds.runCycleCollector[cpu][(i+2+nds.idleFrameCounter)&15]\r\n\t\t\t\t+\tnds.runCycleCollector[cpu][(i+3+nds.idleFrameCounter)&15];\r\n\t\t\t\tsample /= 4;\r\n\t\t\t\tload = load/8 + sample*7/8;\r\n\t\t\t}\r\n\t\t\t//printf(\"\\n\");\r\n\t\t\tload = std::min(100,std::max(0,(int)(load*100/1120380)));\r\n\t\t\tHud.cpuload[cpu] = load;\r\n\t\t}\r\n\t}\r\n\r\n\tHud.cpuloopIterationCount = nds.cpuloopIterationCount;\r\n}\r\n\r\nvoid nds4droid_core()\r\n{\r\n#ifdef MEASURE_FIRST_FRAMES\r\n\tunsigned int start = GetTickCount();\r\n#endif\r\n\tNDS_beginProcessingInput();\r\n\tNDS_endProcessingInput();\r\n\tNDS_exec<false>();\r\n\tSPU_Emulate_user();\r\n#ifdef MEASURE_FIRST_FRAMES\r\n\tunsigned int end = GetTickCount();\r\n\tif(mff_do)\r\n\t{\r\n\t\tmff_totalTime += (end - start);\r\n\t\tif(++mff_totalFrames == mff_toMeasure)\r\n\t\t{\r\n\t\t\tLOGI(\"Total time for first %i frames: %i ms\", mff_toMeasure, mff_totalTime);\r\n\t\t\tmff_do = false;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid nds4droid_unpause()\r\n{\r\n\tif(!execute) NDS_Pause(false);\r\n\tif (emu_paused && autoframeskipenab && frameskiprate) AutoFrameSkip_IgnorePreviousDelay();\r\n\tNDS_UnPause();\r\n}\r\n\r\nbool doRomLoad(const char* path, const char* logical)\r\n{\r\n#ifdef USE_PROFILER\r\n\tif(profiler_start && !profiler_end)\r\n\t{\r\n\t\tmoncleanup();\r\n\t\tprofiler_end = true;\r\n\t\t\r\n\t\tINFO(\"profile end\\n\");\r\n\t}\r\n\tif(!profiler_start && !profiler_end)\r\n\t{\r\n\t\tsetenv(\"CPUPROFILE_FREQUENCY\", \"1000000\", 1);\r\n\t\tmonstartup(\"libdesmumeneon.so\");\r\n\t\tprofiler_start = true;\r\n\t\tINFO(\"profile start\\n\");\r\n\t}\r\n#endif\r\n\tNDS_Pause(false);\r\n\tif(NDS_LoadROM(path, logical) >= 0)\r\n\t{\r\n\t\tINFO(\"Loading %s was successful\\n\",path);\r\n\t\tnds4droid_unpause();\r\n\t\tif (autoframeskipenab && frameskiprate) AutoFrameSkip_IgnorePreviousDelay();\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nbool nds4droid_loadrom(const char* path)\r\n{\r\n\tchar LogicalName[1024], PhysicalName[1024];\r\n\r\n\tconst char* s_nonRomExtensions [] = {\"txt\", \"nfo\", \"htm\", \"html\", \"jpg\", \"jpeg\", \"png\", \"bmp\", \"gif\", \"mp3\", \"wav\", \"lnk\", \"exe\", \"bat\", \"gmv\", \"gm2\", \"lua\", \"luasav\", \"sav\", \"srm\", \"brm\", \"cfg\", \"wch\", \"gs*\", \"dst\"};\r\n\r\n\tif(!ObtainFile(path, LogicalName, PhysicalName, \"rom\", s_nonRomExtensions, ARRAY_SIZE(s_nonRomExtensions)))\r\n\t\treturn false;\r\n\t\t\r\n\treturn doRomLoad(path, PhysicalName);\r\n}\r\n\r\njint JNI(draw, jobject bitmapMain, jobject bitmapTouch, jboolean rotate)\r\n{\r\n\tint todo;\r\n\tbool alreadyDisplayed;\r\n\r\n\t{\r\n\t\t//find a buffer to display\r\n\t\ttodo = newestDisplayBuffer;\r\n\t\talreadyDisplayed = (todo == currDisplayBuffer);\r\n\r\n\t\t//something new to display:\r\n\t\tif(!alreadyDisplayed) {\r\n\t\t\t//start displaying a new buffer\r\n\t\t\tcurrDisplayBuffer = todo;\r\n\t\t\tvideo.srcBuffer = (u8*)displayBuffers[currDisplayBuffer];\r\n\t\t}\r\n\t}\r\n\r\n\t//convert pixel format to 32bpp for compositing\r\n\t//why do we do this over and over? well, we are compositing to\r\n\t//filteredbuffer32bpp, and it needs to get refreshed each frame..\r\n\t//const int size = video.size();\r\n\tconst int size = 256*384;\r\n\tu16* src = (u16*)video.srcBuffer;\r\n\tif(bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888)\r\n\t{\r\n\t\tu32* dest = video.buffer;\r\n\t\tfor(int i=0;i<size;++i)\r\n\t\t\t*dest++ = 0xFF000000ul | RGB15TO32_NOALPHA(*src++);\r\n\r\n\t\tvideo.filter();\r\n\t}\r\n\telse if(bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGB_565)\r\n\t{\r\n\t\tu16* dest = (u16*)video.buffer;\r\n\t\tfor(int i=0;i<size;++i)\r\n\t\t\t*dest++ = RGB15TO16_REVERSE(*src++);\r\n\t}\r\n\r\n\t//here the magic happens\r\n\tvoid* pixels = NULL;\r\n\t//LOGI(\"width = %i, height = %i\", bitmapInfo.width, bitmapInfo.height);\r\n\tif(AndroidBitmap_lockPixels(env,bitmapMain,&pixels) >= 0)\r\n\t{\r\n\t\tdoBitmapDraw((u8*)video.finalBuffer(), (u8*)pixels, bitmapInfo.width, bitmapInfo.height, bitmapInfo.stride, bitmapInfo.format, 0, rotate == JNI_TRUE);\r\n\t\tAndroidBitmap_unlockPixels(env, bitmapMain);\r\n\t}\r\n\tif(AndroidBitmap_lockPixels(env,bitmapTouch,&pixels) >= 0)\r\n\t{\r\n\t\tdoBitmapDraw((u8*)video.finalBuffer(), (u8*)pixels, bitmapInfo.width, bitmapInfo.height, bitmapInfo.stride, bitmapInfo.format, video.height / 2, rotate == JNI_TRUE);\r\n\t\tAndroidBitmap_unlockPixels(env, bitmapTouch);\r\n\t}\r\n\r\n\treturn ((Hud.fps & 0xFF)<<24)|((Hud.fps3d & 0xFF)<<16)|((Hud.cpuload[0] & 0xFF)<<8)|((Hud.cpuload[1] & 0xFF));\r\n}\r\n\r\nvoid JNI(resize, jobject bitmap)\r\n{\r\n\tAndroidBitmap_getInfo(env, bitmap, &bitmapInfo);\r\n\tif(bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888)\r\n\t\tLOGI(\"bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888\");\r\n\telse if(bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGB_565)\r\n\t\tLOGI(\"bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGB_565\");\r\n}\r\n\r\nint JNI_NOARGS(getNativeWidth)\r\n{\r\n\treturn video.width;\r\n}\r\n\r\nint JNI_NOARGS(getNativeHeight)\r\n{\r\n\treturn video.height;\r\n}\r\n\r\nvoid JNI(setFilter, int index)\r\n{\r\n\tvideo.setfilter(index);\r\n}\r\n\r\n\r\nvoid JNI_NOARGS(runCore)\r\n{\r\n\tnds4droid_core();\r\n\tnds4droid_user();\r\n\tnds4droid_throttle();\r\n}\r\n\r\nvoid JNI(setSoundPaused, int set)\r\n{\r\n\tif(sndcoretype != 1)\r\n\t\treturn;\r\n\tSNDOpenSLPaused(set == 0 ? false : true);\r\n}\r\n\r\nint JNI_NOARGS(runOther)\r\n{\r\n\tif(execute)\r\n\t{\r\n\t\tif(sndcoretype != 0)\r\n\t\t\tSPU_Emulate_user();\r\n\t\tnds4droid_user();\r\n\t\tnds4droid_throttle();\r\n\t\treturn mainLoopData.fps > 0 ? mainLoopData.fps : 1;\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\nvoid JNI(saveState, int slot)\r\n{\r\n\tsavestate_slot(slot);\r\n}\r\n\r\nvoid JNI(restoreState, int slot)\r\n{\r\n\tloadstate_slot(slot);\r\n#ifdef MEASURE_FIRST_FRAMES\r\n\tmff_do = true;\r\n\tmff_totalFrames = 0;\r\n\tmff_totalTime = 0;\r\n#endif\r\n}\r\n\r\nvoid loadSettings(JNIEnv* env)\r\n{\r\n\tCommonSettings.num_cores = sysconf( _SC_NPROCESSORS_ONLN );\r\n\tLOGI(\"%i cores detected\", CommonSettings.num_cores); \r\n\tCommonSettings.cheatsDisable = GetPrivateProfileBool(env,\"General\", \"cheatsDisable\", false, IniName);\r\n\tCommonSettings.autodetectBackupMethod = GetPrivateProfileInt(env,\"General\", \"autoDetectMethod\", 0, IniName);\r\n\tenableMicrophone = GetPrivateProfileBool(env, \"General\", \"EnableMicrophone\", true, IniName);\r\n\r\n\tvideo.rotation =  GetPrivateProfileInt(env,\"Video\",\"WindowRotate\", 0, IniName);\r\n\tvideo.rotation_userset =  GetPrivateProfileInt(env,\"Video\",\"WindowRotateSet\", video.rotation, IniName);\r\n\tvideo.layout_old = video.layout = GetPrivateProfileInt(env,\"Video\", \"LCDsLayout\", 0, IniName);\r\n\tvideo.swap = GetPrivateProfileInt(env,\"Video\", \"LCDsSwap\", 0, IniName);\r\n\r\n\tCommonSettings.hud.FpsDisplay = GetPrivateProfileBool(env,\"Display\",\"DisplayFps\", false, IniName);\r\n\tCommonSettings.hud.FrameCounterDisplay = GetPrivateProfileBool(env,\"Display\",\"FrameCounter\", false, IniName);\r\n\tCommonSettings.hud.ShowInputDisplay = GetPrivateProfileBool(env,\"Display\",\"DisplayInput\", false, IniName);\r\n\tCommonSettings.hud.ShowGraphicalInputDisplay = GetPrivateProfileBool(env,\"Display\",\"DisplayGraphicalInput\", false, IniName);\r\n\tCommonSettings.hud.ShowLagFrameCounter = GetPrivateProfileBool(env,\"Display\",\"DisplayLagCounter\", false, IniName);\r\n\tCommonSettings.hud.ShowMicrophone = GetPrivateProfileBool(env,\"Display\",\"DisplayMicrophone\", false, IniName);\r\n\tCommonSettings.hud.ShowRTC = GetPrivateProfileBool(env,\"Display\",\"DisplayRTC\", false, IniName);\r\n\tvideo.screengap = GetPrivateProfileInt(env,\"Display\", \"ScreenGap\", 0, IniName);\r\n\tCommonSettings.showGpu.main = GetPrivateProfileInt(env,\"Display\", \"MainGpu\", 1, IniName) != 0;\r\n\tCommonSettings.showGpu.sub = GetPrivateProfileInt(env,\"Display\", \"SubGpu\", 1, IniName) != 0;\r\n\tframeskiprate = GetPrivateProfileInt(env,\"Display\", \"FrameSkip\", 1, IniName);\r\n\r\n\tCommonSettings.micMode = (TCommonSettings::MicMode)GetPrivateProfileInt(env,\"MicSettings\", \"MicMode\", (int)TCommonSettings::InternalNoise, IniName);\r\n\r\n\tCommonSettings.spu_advanced = GetPrivateProfileBool(env,\"Sound\", \"SpuAdvanced\", false, IniName);\r\n\tCommonSettings.spuInterpolationMode = (SPUInterpolationMode)GetPrivateProfileInt(env, \"Sound\",\"SPUInterpolation\", 1, IniName);\r\n\tsnd_synchmode = GetPrivateProfileInt(env, \"Sound\",\"SynchMode\",0,IniName);\r\n\tsnd_synchmethod = GetPrivateProfileInt(env, \"Sound\",\"SynchMethod\",0,IniName);\r\n\r\n\tCommonSettings.advanced_timing = GetPrivateProfileBool(env,\"Emulation\", \"AdvancedTiming\", false, IniName);\r\n\tCommonSettings.CpuMode = GetPrivateProfileInt(env, \"Emulation\",\"CpuMode\", 2, IniName);\r\n\tCommonSettings.jit_max_block_size = GetPrivateProfileInt(env, \"Emulation\", \"JitSize\", 10, IniName);\r\n\t\r\n\tCommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = GetPrivateProfileInt(env,\"3D\", \"ZeldaShadowDepthHack\", 0, IniName);\r\n\tCommonSettings.GFX3D_HighResolutionInterpolateColor = GetPrivateProfileBool(env, \"3D\", \"HighResolutionInterpolateColor\", 0, IniName);\r\n\tCommonSettings.GFX3D_EdgeMark = GetPrivateProfileBool(env, \"3D\", \"EnableEdgeMark\", 0, IniName);\r\n\tCommonSettings.GFX3D_Fog = GetPrivateProfileBool(env, \"3D\", \"EnableFog\", 1, IniName);\r\n\tCommonSettings.GFX3D_Texture = GetPrivateProfileBool(env, \"3D\", \"EnableTexture\", 1, IniName);\r\n\tCommonSettings.GFX3D_LineHack = GetPrivateProfileBool(env, \"3D\", \"EnableLineHack\", 0, IniName);\r\n\tuseMmapForRomLoading = GetPrivateProfileBool(env, \"General\", \"UseMmap\", true, IniName);\r\n\tfw_config.language = GetPrivateProfileInt(env, \"Firmware\",\"Language\", 1, IniName);\r\n\r\n\tCommonSettings.wifi.mode = GetPrivateProfileInt(env,\"Wifi\", \"Mode\", 0, IniName);\r\n\tCommonSettings.wifi.infraBridgeAdapter = GetPrivateProfileInt(env,\"Wifi\", \"BridgeAdapter\", 0, IniName);\r\n}\r\n\r\nvoid JNI_NOARGS(reloadFirmware)\r\n{\r\n\tNDS_CreateDummyFirmware(&fw_config);\r\n}\r\n\r\nvoid JNI_NOARGS(loadSettings)\r\n{\r\n\tloadSettings(env);\r\n}\r\n\r\n\r\nvoid JNI(init, jobject _inst)\r\n{\r\n#ifdef HAVE_NEON\r\n\t//neontest();\r\n\tenable_runfast();\r\n#endif\r\n\tINFO(\"\");\r\n\r\n\tLogger::setCallbackAll(logCallback);\r\n\r\n\toglrender_init = android_opengl_init;\r\n\tInitDecoder();\r\n\t\r\n\tpath.ReadPathSettings();\r\n\tif (video.layout > 2)\r\n\t{\r\n\t\tvideo.layout = video.layout_old = 0;\r\n\t}\r\n\t\r\n\tloadSettings(env);\r\n\r\n\tDesmume_InitOnce();\r\n\t//gpu_SetRotateScreen(video.rotation);\r\n\tNDS_FillDefaultFirmwareConfigData(&fw_config);\r\n\tHud.reset();\r\n\t\r\n\tINFO(\"Init NDS\");\r\n\t\r\n\tint slot1_device_type = NDS_SLOT1_RETAIL;\r\n\tswitch (slot1_device_type)\r\n\t{\r\n\t\tcase NDS_SLOT1_NONE:\r\n\t\tcase NDS_SLOT1_RETAIL:\r\n\t\tcase NDS_SLOT1_R4:\r\n\t\tcase NDS_SLOT1_RETAIL_NAND:\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tslot1_device_type = NDS_SLOT1_RETAIL;\r\n\t\t\tbreak;\r\n\t}\r\n\t\r\n\tswitch (addon_type)\r\n\t{\r\n\tcase NDS_ADDON_NONE:\r\n\t\tbreak;\r\n\tcase NDS_ADDON_CFLASH:\r\n\t\tbreak;\r\n\tcase NDS_ADDON_RUMBLEPAK:\r\n\t\tbreak;\r\n\tcase NDS_ADDON_GBAGAME:\r\n\t\tif (!strlen(GBAgameName))\r\n\t\t{\r\n\t\t\taddon_type = NDS_ADDON_NONE;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t// TODO: check for file exist\r\n\t\tbreak;\r\n\tcase NDS_ADDON_GUITARGRIP:\r\n\t\tbreak;\r\n\tcase NDS_ADDON_EXPMEMORY:\r\n\t\tbreak;\r\n\tcase NDS_ADDON_PIANO:\r\n\t\tbreak;\r\n\tcase NDS_ADDON_PADDLE:\r\n\t\tbreak;\r\n\tdefault:\r\n\t\taddon_type = NDS_ADDON_NONE;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tslot1Change((NDS_SLOT1_TYPE)slot1_device_type);\r\n\taddonsChangePak(addon_type);\r\n\r\n\t\r\n\tNDS_Init();\r\n\t\r\n\tcur3DCore = GetPrivateProfileInt(env, \"3D\", \"Renderer\", 2, IniName);\r\n\tNDS_3D_ChangeCore(cur3DCore);\r\n\t\r\n\tLOG(\"Init sound core\\n\");\r\n\tsndcoretype = GetPrivateProfileInt(env, \"Sound\",\"SoundCore2\", SNDCORE_OPENSL, IniName);\r\n\tsndbuffersize = GetPrivateProfileInt(env, \"Sound\",\"SoundBufferSize2\", DESMUME_SAMPLE_RATE*8/60, IniName);\r\n\tSPU_ChangeSoundCore(sndcoretype, sndbuffersize);\r\n\tSPU_SetSynchMode(snd_synchmode,snd_synchmethod);\r\n\t\r\n\tstatic const char* nickname = \"emozilla\";\r\n\tfw_config.nickname_len = strlen(nickname);\r\n\tfor(int i = 0 ; i < fw_config.nickname_len ; ++i)\r\n\t\tfw_config.nickname[i] = nickname[i];\r\n\t\t\r\n\tstatic const char* message = \"desmume makes you happy!\";\r\n\tfw_config.message_len = strlen(message);\r\n\tfor(int i = 0 ; i < fw_config.message_len ; ++i)\r\n\t\tfw_config.message[i] = message[i];\r\n\t\r\n\tfw_config.language = GetPrivateProfileInt(env, \"Firmware\",\"Language\", 1, IniName);\r\n\t\t\r\n\tvideo.setfilter(GetPrivateProfileInt(env,\"Video\", \"Filter\", video.NONE, IniName));\r\n\t\r\n\tNDS_CreateDummyFirmware(&fw_config);\r\n\t\r\n\tInitSpeedThrottle();\r\n\t\r\n\tmainLoopData.freq = 1000;\r\n\tmainLoopData.lastticks = GetTickCount();\r\n}\r\n\r\nvoid JNI(changeCpuMode, int type)\r\n{\r\n\tarmcpu_setjitmode(type);\r\n}\r\n\r\nvoid JNI(change3D, int type)\r\n{\r\n\tNDS_3D_ChangeCore(cur3DCore = type);\r\n}\r\n\r\nvoid JNI(changeSound, int type)\r\n{\r\n\tSPU_ChangeSoundCore(sndcoretype = type, sndbuffersize);\r\n}\r\n\r\nvoid JNI(changeSoundSynchMode, int synchmode)\r\n{\r\n\tSPU_SetSynchMode(snd_synchmode = synchmode,snd_synchmethod);\r\n}\r\n\r\nvoid JNI(changeSoundSynchMethod, int synchmethod)\r\n{\r\n\tSPU_SetSynchMode(snd_synchmode,snd_synchmethod = synchmethod);\r\n}\r\n\r\njboolean JNI(loadRom, jstring path)\r\n{\r\n\tjboolean isCopy; \r\n\tconst char* szPath = env->GetStringUTFChars(path, &isCopy);\r\n\tbool ret = nds4droid_loadrom(szPath);\r\n\tenv->ReleaseStringUTFChars(path, szPath);\r\n\treturn ret ? JNI_TRUE : JNI_FALSE;\r\n}\r\n\r\nvoid JNI(setWorkingDir, jstring path, jstring temp)\r\n{\r\n\tjboolean isCopy; \r\n\tconst char* szPath = env->GetStringUTFChars(path, &isCopy);\r\n\tstrncpy(PathInfo::pathToModule, szPath, MAX_PATH);\r\n\tenv->ReleaseStringUTFChars(path, szPath);\r\n\t\r\n\tszPath = env->GetStringUTFChars(temp, &isCopy);\r\n\tstrncpy(androidTempPath, szPath, 1024);\r\n\tenv->ReleaseStringUTFChars(temp, szPath);\r\n}\r\n\r\nvoid JNI(touchScreenTouch, int x, int y)\r\n{\r\n\tif(x<0) x = 0; else if(x>255) x = 255;\r\n\tif(y<0) y = 0; else if(y>192) y = 192;\r\n\tNDS_setTouchPos(x,y);\r\n}\r\n\r\nvoid JNI_NOARGS(touchScreenRelease)\r\n{\r\n\tNDS_releaseTouch();\r\n}\r\n\r\nvoid JNI(setButtons, int l, int r, int up, int down, int left, int right, int a, int b, int x, int y, int start, int select, int lid)\r\n{\r\n\tNDS_setPad(right, left, down, up, select, start, b, a, y, x, l, r, false, !lid);\r\n}\r\n\r\njint JNI_NOARGS(getNumberOfCheats)\r\n{\r\n\treturn cheats == NULL ? 0 : cheats->getSize();\r\n}\r\n\r\njstring JNI(getCheatName, int pos)\r\n{\r\n\tif(cheats == NULL || pos < 0 || pos >= cheats->getSize())\r\n\t\treturn 0;\r\n\treturn env->NewStringUTF(cheats->getItemByIndex(pos)->description);\r\n}\r\n\r\njboolean JNI(getCheatEnabled, int pos)\r\n{\r\n\tif(cheats == NULL || pos < 0 || pos >= cheats->getSize())\r\n\t\treturn 0;\r\n\treturn cheats->getItemByIndex(pos)->enabled ? JNI_TRUE : JNI_FALSE;\r\n}\r\n\r\njstring JNI(getCheatCode, int pos)\r\n{\r\n\tif(cheats == NULL || pos < 0 || pos >= cheats->getSize())\r\n\t\treturn 0;\r\n\tchar buffer[1024] = {0};\r\n\tcheats->getXXcodeString(*cheats->getItemByIndex(pos), buffer);\r\n\tjstring ret = env->NewStringUTF(buffer);\r\n\treturn ret;\r\n}\r\n\r\njint JNI(getCheatType, int pos)\r\n{\r\n\tif(cheats == NULL || pos < 0 || pos >= cheats->getSize())\r\n\t\treturn 0;\r\n\treturn cheats->getItemByIndex(pos)->type;\r\n}\r\n\r\nvoid JNI(addCheat, jstring description, jstring code)\r\n{\r\n\tif(cheats == NULL)\r\n\t\treturn;\r\n\tjboolean isCopy;\r\n\tconst char* descBuff = env->GetStringUTFChars(description, &isCopy);\r\n\tconst char* codeBuff = env->GetStringUTFChars(code, &isCopy);\r\n\tcheats->add_AR(codeBuff, descBuff, TRUE);\r\n\tenv->ReleaseStringUTFChars(description, descBuff);\r\n\tenv->ReleaseStringUTFChars(code, codeBuff);\r\n}\r\n\r\nvoid JNI(updateCheat, jstring description, jstring code, jint pos)\r\n{\r\n\tif(cheats == NULL)\r\n\t\treturn;\r\n\tjboolean isCopy;\r\n\tconst char* descBuff = env->GetStringUTFChars(description, &isCopy);\r\n\tconst char* codeBuff = env->GetStringUTFChars(code, &isCopy);\r\n\tcheats->update_AR(codeBuff, descBuff, TRUE, pos);\r\n\tenv->ReleaseStringUTFChars(description, descBuff);\r\n\tenv->ReleaseStringUTFChars(code, codeBuff);\r\n}\r\n\r\nvoid JNI_NOARGS(saveCheats)\r\n{\r\n\tif(cheats)\r\n\t\tcheats->save();\r\n}\r\n\r\nvoid JNI(setCheatEnabled, int pos, jboolean enabled)\r\n{\r\n\tif(cheats)\r\n\t\tcheats->getItemByIndex(pos)->enabled = enabled == JNI_TRUE ? true : false;\r\n}\r\n\r\nvoid JNI(deleteCheat, jint pos)\r\n{\r\n\tif(cheats)\r\n\t\tcheats->remove(pos);\r\n}\r\n\r\nvoid JNI_NOARGS(closeRom)\r\n{\r\n\tNDS_FreeROM();\r\n\texecute = false;\r\n\tHud.resetTransient();\r\n\tNDS_Reset();\r\n}\r\n\r\nvoid JNI_NOARGS(exit)\r\n{\r\n#ifdef USE_PROFILER\r\n\tif(profiler_start && !profiler_end)\r\n\t{\r\n\t\tmoncleanup();\r\n\t\tprofiler_end = true;\r\n\t\t\r\n\t\tINFO(\"profile end\\n\");\r\n\t}\r\n#endif\r\n\texit(0);\r\n}\r\n\r\n} //end extern \"C\"\r\n\r\nunsigned int GetPrivateProfileInt(JNIEnv* env, const char* lpAppName, const char* lpKeyName, int nDefault, const char* lpFileName)\r\n{\r\n\tjclass javaClass = env->FindClass(\"com/opendoorstudios/ds4droid/DeSmuME\");\r\n\tif(!javaClass)\r\n\t\treturn nDefault;\r\n\tjmethodID getSettingInt = env->GetStaticMethodID(javaClass, \"getSettingInt\",\"(Ljava/lang/String;I)I\");\r\n\tjstring key = env->NewStringUTF(lpKeyName);\r\n\tint ret = env->CallStaticIntMethod(javaClass, getSettingInt, key, nDefault);\r\n\treturn ret;\r\n}\r\n\r\nbool GetPrivateProfileBool(JNIEnv* env, const char* lpAppName, const char* lpKeyName, bool bDefault, const char* lpFileName)\r\n{\r\n\treturn GetPrivateProfileInt(env, lpAppName, lpKeyName, bDefault ? 1 : 0, lpFileName);\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/main.h",
    "content": "/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _MAIN_H\r\n#define _MAIN_H\r\n\r\n#include <jni.h>\r\n#include <android/log.h>\r\n\r\nunsigned int GetPrivateProfileInt(JNIEnv* env, const char* lpAppName, const char* lpKeyName, int nDefault, const char* lpFileName);\r\nunsigned int GetTickCount();\r\n\r\n#ifdef __cplusplus\r\nbool GetPrivateProfileBool(JNIEnv* env, const char* lpAppName, const char* lpKeyName, bool bDefault, const char* lpFileName);\r\n\r\nextern \"C\" {\r\n#endif\r\n\r\n#define APPNAME \"nds4droid\"\r\n\r\n#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, APPNAME, __VA_ARGS__))\r\n#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, APPNAME, __VA_ARGS__))\r\n#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, APPNAME, __VA_ARGS__))\r\n\r\n\r\n//JNI callbacks go here\r\n\r\n#ifdef __cplusplus\r\n} //end extern \"C\"\r\n#endif\r\n\r\nextern unsigned int frameCount;\r\n\r\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/Android.mk",
    "content": "# Android ndk for math-neon\r\n# http://code.google.com/p/math-neon/\r\n\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\n\r\nLOCAL_MODULE \t\t:= \tlibmathneon\r\nLOCAL_SRC_FILES\t\t:=  math_acosf.c \\\r\n\t\t\t\t\t\tmath_ceilf.c \\\r\n\t\t\t\t\t\tmath_expf.c \\\r\n\t\t\t\t\t\tmath_frexpf.c \\\r\n\t\t\t\t\t\tmath_logf.c \\\r\n\t\t\t\t\t\tmath_modf.c \\\r\n\t\t\t\t\t\tmath_sinf.c \\\r\n\t\t\t\t\t\tmath_sqrtfv.c \\\r\n\t\t\t\t\t\tmath_vec3.c \\\r\n\t\t\t\t\t\tmath_asinf.c \\\r\n\t\t\t\t\t\tmath_cosf.c \\\r\n\t\t\t\t\t\tmath_fabsf.c \\\r\n\t\t\t\t\t\tmath_invsqrtf.c \\\r\n\t\t\t\t\t\tmath_mat2.c \\\r\n\t\t\t\t\t\tmath_powf.c \\\r\n\t\t\t\t\t\tmath_sinfv.c \\\r\n\t\t\t\t\t\tmath_tanf.c \\\r\n\t\t\t\t\t\tmath_vec4.c \\\r\n\t\t\t\t\t\tmath_atan2f.c \\\r\n\t\t\t\t\t\tmath_coshf.c \\\r\n\t\t\t\t\t\tmath_floorf.c \\\r\n\t\t\t\t\t\tmath_ldexpf.c \\\r\n\t\t\t\t\t\tmath_mat3.c \\\r\n\t\t\t\t\t\tmath_runfast.c \\\r\n\t\t\t\t\t\tmath_sinhf.c \\\r\n\t\t\t\t\t\tmath_tanhf.c \\\r\n\t\t\t\t\t\tmath_atanf.c \\\r\n\t\t\t\t\t\tmath_debug.c \\\r\n\t\t\t\t\t\tmath_fmodf.c \\\r\n\t\t\t\t\t\tmath_log10f.c \\\r\n\t\t\t\t\t\tmath_mat4.c \\\r\n\t\t\t\t\t\tmath_sincosf.c \\\r\n\t\t\t\t\t\tmath_sqrtf.c \\\r\n\t\t\t\t\t\tmath_vec2.c\r\nLOCAL_ARM_NEON \t\t\t:= true\r\nLOCAL_ARM_MODE \t\t\t:= arm\r\nLOCAL_CFLAGS\t\t\t:= -std=gnu99 -DHAVE_NEON=1 -march=armv7-a -marm -mfloat-abi=softfp -mfpu=neon\r\ninclude $(BUILD_STATIC_LIBRARY)"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/COPYING",
    "content": "\t\t   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/README",
    "content": "\r\nLibrary: \tMATH-NEON\r\nBy:\t\t\tLachlan Tychsen - Smith AKA Adventus\r\nLicence:\tGPLv3\r\n=======================================================================================\r\nThis project implements the cmath functions and some optimised matrix functions \r\nwith the aim of increasing the floating point performance of ARM Cortex A-8\r\nbased platforms. As well as implementing the functions in ARM NEON assembly, \r\nthey sacrifice error checking and some accuracy to achieve better performance.\r\n\r\nFunction Errors:\r\n=======================================================================================\r\nThe measurement and characterisations of the inaccuracies present within these \r\nfunctions is really a field within itself. For the benchmark i provide the \r\nmaximum absolute, maximum relative and root mean squared error compared to the\r\ncmath implementations over the specified range. However these values can be \r\nmisleading, especially for functions which quickly go to infinity. So its always a \r\ngood idea to test it within your actual program. In general, this library will not \r\nbe as accurate as cmath, however for many functions it is close enough to be\r\nnegilible. \r\n\t\r\nNotes:\r\n=======================================================================================\r\n- The *_c functions are c implementations of the *_neon code.\r\n- Like cmath, The errors present in the functions are very dependent on the \r\n  range which your operating in. So you should test them first.\r\n- Look in the \"math_neon.h\" file for discriptions of the functions. In some \r\n  function files there are also notes on the specific implementation.\r\n- The *_neon functions make certain assumptions about the location of arguments \r\n  that is incompatible with inlining. \r\n\t  \r\nContact:\r\n=======================================================================================\r\nName: \tLachlan Tychsen - Smith \r\nEmail: \tlachlan.ts@gmail.com\r\nForum:\tI also regularly check my GP32X.com forum messages, so you can PM \"Adventus\"."
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_acosf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\n/*\r\nTest func : acosf(x)\r\nTest Range: -1.0 < x < 1.0\r\nPeak Error:\t~0.005%\r\nRMS  Error: ~0.001%\r\n*/\r\n\r\nconst float __acosf_pi_2 = M_PI_2;\r\n\r\nfloat acosf_c(float x)\r\n{\r\n\treturn __acosf_pi_2 - asinf_c(x);\r\n}\r\n\r\n\r\nfloat acosf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasinf_neon_hfp(x);\r\n\tasm volatile (\r\n\t\"vdup.f32\t \td1, %0\t\t\t\t\t\\n\\t\"\t//d1 = {pi/2, pi/2};\r\n\t\"vsub.f32\t \td0, d1, d0\t\t\t\t\\n\\t\"\t//d0 = d1 - d0;\r\n\t::\"r\"(__acosf_pi_2):\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat acosf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tacosf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn acosf_c(x);\r\n#endif\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_asinf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\n/*\r\nTest func : asinf(x)\r\nTest Range: -1.0 < x < 1.0\r\nPeak Error:\t~0.005%\r\nRMS  Error: ~0.001%\r\n*/\r\n\r\n\r\nconst float __asinf_lut[4] = {\r\n\t0.105312459675071, \t//p7\r\n\t0.169303418571894,\t//p3\r\n\t0.051599985887214, \t//p5\r\n\t0.999954835104825\t//p1\r\n}; \r\n\r\nconst float __asinf_pi_2 = M_PI_2;\r\n\r\nfloat asinf_c(float x)\r\n{\r\n\r\n\tfloat a, b, c, d, r, ax;\r\n\tint m;\r\n\t\r\n\tunion {\r\n\t\tfloat f;\r\n\t\tint i;\r\n\t} xx;\r\n\r\n\tax = fabs(x);\r\n\td = 0.5;\r\n\td = d - ax*0.5;\r\n\t\t\r\n\t//fast invsqrt approx\r\n\txx.f = d;\r\n\txx.i = 0x5F3759DF - (xx.i >> 1);\t\t//VRSQRTE\r\n\tc = d * xx.f;\r\n\tb = (3.0f - c * xx.f) * 0.5;\t\t//VRSQRTS\r\n\txx.f = xx.f * b;\t\t\r\n\tc = d * xx.f;\r\n\tb = (3.0f - c * xx.f) * 0.5;\r\n    xx.f = xx.f * b;\t\r\n\r\n\t//fast inverse approx\r\n\td = xx.f;\r\n\tm = 0x3F800000 - (xx.i & 0x7F800000);\r\n\txx.i = xx.i + m;\r\n\txx.f = 1.41176471f - 0.47058824f * xx.f;\r\n\txx.i = xx.i + m;\r\n\tb = 2.0 - xx.f * d;\r\n\txx.f = xx.f * b;\t\r\n\tb = 2.0 - xx.f * d;\r\n\txx.f = xx.f * b;\r\n\t\r\n\t//if |x|>0.5 -> x = sqrt((1-x)/2)\r\n\txx.f = xx.f - ax;\t\r\n\ta = (ax > 0.5f);\r\n\td = __asinf_pi_2 * a;\r\n\tc = 1.0f - 3.0f * a;\r\n\tax = ax + xx.f * a;\r\n\t\t\r\n\t//polynomial evaluation\r\n\txx.f = ax * ax;\t\r\n\ta = (__asinf_lut[0] * ax) * xx.f + (__asinf_lut[2] * ax);\r\n\tb = (__asinf_lut[1] * ax) * xx.f + (__asinf_lut[3] * ax);\r\n\txx.f = xx.f * xx.f;\r\n\tr = b + a * xx.f; \r\n\tr = d + c * r;\r\n\r\n\ta = r + r;\r\n\tb = (x < 0.0f);\r\n\tr = r - a * b;\r\n\treturn r;\r\n}\r\n\r\n\r\nfloat asinf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\r\n\t\"vdup.f32\t \td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x, x};\r\n\t\"vdup.f32\t \td4, %1\t\t\t\t\t\\n\\t\"\t//d4 = {pi/2, pi/2};\r\n\t\"vmov.f32\t \td6, d0\t\t\t\t\t\\n\\t\"\t//d6 = d0;\r\n\t\"vabs.f32\t \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = fabs(d0) ;\r\n\r\n\t\"vmov.f32\t \td5, #0.5\t\t\t\t\\n\\t\"\t//d5 = 0.5;\r\n\t\"vmls.f32\t \td5, d0, d5\t\t\t\t\\n\\t\"\t//d5 = d5 - d0*d5;\r\n\r\n\t//fast invsqrt approx\r\n\t\"vmov.f32 \t\td1, d5\t\t\t\t\t\\n\\t\"\t//d1 = d5\r\n\t\"vrsqrte.f32 \td5, d5\t\t\t\t\t\\n\\t\"\t//d5 = ~ 1.0 / sqrt(d5)\r\n\t\"vmul.f32 \t\td2, d5, d1\t\t\t\t\\n\\t\"\t//d2 = d5 * d1\r\n\t\"vrsqrts.f32 \td3, d2, d5\t\t\t\t\\n\\t\"\t//d3 = (3 - d5 * d2) / 2 \t\r\n\t\"vmul.f32 \t\td5, d5, d3\t\t\t\t\\n\\t\"\t//d5 = d5 * d3\r\n\t\"vmul.f32 \t\td2, d5, d1\t\t\t\t\\n\\t\"\t//d2 = d5 * d1\t\r\n\t\"vrsqrts.f32 \td3, d2, d5\t\t\t\t\\n\\t\"\t//d3 = (3 - d5 * d3) / 2\t\r\n\t\"vmul.f32 \t\td5, d5, d3\t\t\t\t\\n\\t\"\t//d5 = d5 * d3\t\r\n\t\t\r\n\t//fast reciporical approximation\r\n\t\"vrecpe.f32\t\td1, d5\t\t\t\t\t\\n\\t\"\t//d1 = ~ 1 / d5; \r\n\t\"vrecps.f32\t\td2, d1, d5\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d5; \r\n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \r\n\t\"vrecps.f32\t\td2, d1, d5\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d5; \r\n\t\"vmul.f32\t\td5, d1, d2\t\t\t\t\\n\\t\"\t//d5 = d1 * d2; \r\n\t\r\n\t//if |x| > 0.5 -> ax = sqrt((1-ax)/2), r = pi/2\r\n\t\"vsub.f32\t\td5, d0, d5\t\t\t\t\\n\\t\"\t//d5 = d0 - d5; \r\n\t\"vmov.f32\t \td2, #0.5\t\t\t\t\\n\\t\"\t//d2 = 0.5;\r\n\t\"vcgt.f32\t \td3, d0, d2\t\t\t\t\\n\\t\"\t//d3 = (d0 > d2);\r\n\t\"vmov.f32\t\td1, #3.0 \t\t\t\t\\n\\t\"\t//d5 = 3.0; \t\r\n\t\"vshr.u32\t \td3, #31\t\t\t\t\t\\n\\t\"\t//d3 = d3 >> 31;\r\n\t\"vmov.f32\t\td16, #1.0 \t\t\t\t\\n\\t\"\t//d16 = 1.0; \t\r\n\t\"vcvt.f32.u32\td3, d3\t\t\t\t\t\\n\\t\"\t//d3 = (float) d3;\t\r\n\t\"vmls.f32\t\td0, d5, d3[0]\t\t\t\\n\\t\"\t//d0 = d0 - d5 * d3[0]; \t\r\n\t\"vmul.f32\t\td7, d4, d3[0] \t\t\t\\n\\t\"\t//d7 = d5 * d4; \t\t\r\n\t\"vmls.f32\t\td16, d1, d3[0] \t\t\t\\n\\t\"\t//d16 = d16 - d1 * d3; \t\r\n\t\t\r\n\t//polynomial:\r\n\t\"vmul.f32 \t\td2, d0, d0\t\t\t\t\\n\\t\"\t//d2 = d0*d0 = {ax^2, ax^2}\t\r\n\t\"vld1.32 \t\t{d4, d5}, [%0]\t\t\t\\n\\t\"\t//d4 = {p7, p3}, d5 = {p5, p1}\r\n\t\"vmul.f32 \t\td3, d2, d2\t\t\t\t\\n\\t\"\t//d3 = d2*d2 = {x^4, x^4}\t\t\r\n\t\"vmul.f32 \t\tq0, q2, d0[0]\t\t\t\\n\\t\"\t//q0 = q2 * d0[0] = {p7x, p3x, p5x, p1x}\r\n\t\"vmla.f32 \t\td1, d0, d2[0]\t\t\t\\n\\t\"\t//d1 = d1 + d0*d2[0] = {p5x + p7x^3, p1x + p3x^3}\t\t\r\n\t\"vmla.f32 \t\td1, d3, d1[0]\t\t\t\\n\\t\"\t//d1 = d1 + d3*d1[0] = {..., p1x + p3x^3 + p5x^5 + p7x^7}\t\t\r\n\r\n\t\"vmla.f32 \t\td7, d1, d16\t\t\t\t\\n\\t\"\t//d7 = d7 + d1*d16\t\t\r\n\r\n\t\"vadd.f32 \t\td2, d7, d7\t\t\t\t\\n\\t\"\t//d2 = d7 + d7\t\t\r\n\t\"vclt.f32\t \td3, d6, #0\t\t\t\t\\n\\t\"\t//d3 = (d6 < 0)\t\r\n\t\"vshr.u32\t \td3, #31\t\t\t\t\t\\n\\t\"\t//d3 = d3 >> 31;\r\n\t\"vcvt.f32.u32\td3, d3\t\t\t\t\t\\n\\t\"\t//d3 = (float) d3\t\r\n\t\"vmls.f32 \t\td7, d2, d3[0]\t\t\t\\n\\t\"\t//d7 = d7 - d2 * d3[0];\r\n\r\n\t\"vmov.f32 \t\ts0, s15\t\t\t\t\t\\n\\t\"\t//s0 = s3\r\n\r\n\t:: \"r\"(__asinf_lut),  \"r\"(__asinf_pi_2) \r\n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\", \"d6\", \"d7\"\r\n\t);\r\n#endif\r\n}\r\n\r\n\r\nfloat asinf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tasinf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn asinf_c(x);\r\n#endif\r\n}\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_atan2f.c",
    "content": "/*\nMath-NEON:  Neon Optimised Math Library based on cmath\nContact:    lachlan.ts@gmail.com\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\n\nThis library is free software; you can redistribute it and/or\nmodify it under the terms of the GNU Lesser General Public\nLicense as published by the Free Software Foundation; either\nversion 3 of the License, or (at your option) any later version.\n\nThis library is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nLesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public\nLicense along with this library; if not, write to the Free\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n*/\n\n#include \"math.h\"\n#include \"math_neon.h\"\n\nconst float __atan2f_lut[4] = {\n\t-0.0443265554792128,\t//p7\n\t-0.3258083974640975,\t//p3\n\t+0.1555786518463281,\t//p5\n\t+0.9997878412794807  \t//p1\n}; \n \nconst float __atan2f_pi_2 = M_PI_2;\n\nfloat atan2f_c(float y, float x)\n{\n\tfloat a, b, c, r, xx;\n\tint m;\n\tunion {\n\t\tfloat f;\n\t\tint i;\n\t} xinv;\n\n\t//fast inverse approximation (2x newton)\n\txx = fabs(x);\n\txinv.f = xx;\n\tm = 0x3F800000 - (xinv.i & 0x7F800000);\n\txinv.i = xinv.i + m;\n\txinv.f = 1.41176471f - 0.47058824f * xinv.f;\n\txinv.i = xinv.i + m;\n\tb = 2.0 - xinv.f * xx;\n\txinv.f = xinv.f * b;\t\n\tb = 2.0 - xinv.f * xx;\n\txinv.f = xinv.f * b;\n\t\n\tc = fabs(y * xinv.f);\n\n\t//fast inverse approximation (2x newton)\n\txinv.f = c;\n\tm = 0x3F800000 - (xinv.i & 0x7F800000);\n\txinv.i = xinv.i + m;\n\txinv.f = 1.41176471f - 0.47058824f * xinv.f;\n\txinv.i = xinv.i + m;\n\tb = 2.0 - xinv.f * c;\n\txinv.f = xinv.f * b;\t\n\tb = 2.0 - xinv.f * c;\n\txinv.f = xinv.f * b;\n\t\n\t//if |x| > 1.0 -> ax = -1/ax, r = pi/2\n\txinv.f = xinv.f + c;\n\ta = (c > 1.0f);\n\tc = c - a * xinv.f;\n\tr = a * __atan2f_pi_2;\n\t\n\t//polynomial evaluation\n\txx = c * c;\t\n\ta = (__atan2f_lut[0] * c) * xx + (__atan2f_lut[2] * c);\n\tb = (__atan2f_lut[1] * c) * xx + (__atan2f_lut[3] * c);\n\txx = xx * xx;\n\tr = r + a * xx; \n\tr = r + b;\n\n\t//determine quadrant and test for small x.\n\tb = M_PI;\n\tb = b - 2.0f * r;\n\tr = r + (x < 0.0f) * b;\n\tb = (fabs(x) < 0.000001f);\n\tc = !b;\n\tr = c * r;\n\tr = r + __atan2f_pi_2 * b;\n\tb = r + r;\n\tr = r - (y < 0.0f) * b;\n\t\n\treturn r;\n}\n\nfloat atan2f_neon_hfp(float y, float x)\n{\n#ifdef __MATH_NEON\n\tasm volatile (\n\n\t\"vdup.f32\t \td17, d0[1]\t\t\t\t\\n\\t\"\t//d17 = {x, x};\n\t\"vdup.f32\t \td16, d0[0]\t\t\t\t\\n\\t\"\t//d16 = {y, y};\n\t\n\t//1.0 / x\n\t\"vrecpe.f32\t\td18, d17\t\t\t\t\\n\\t\"\t//d16 = ~ 1 / d1; \n\t\"vrecps.f32\t\td19, d18, d17\t\t\t\\n\\t\"\t//d17 = 2.0 - d16 * d1; \n\t\"vmul.f32\t\td18, d18, d19\t\t\t\\n\\t\"\t//d16 = d16 * d17; \n\t\"vrecps.f32\t\td19, d18, d17\t\t\t\\n\\t\"\t//d17 = 2.0 - d16 * d1; \n\t\"vmul.f32\t\td18, d18, d19\t\t\t\\n\\t\"\t//d16 = d16 * d17; \n\n\t//y * (1.0 /x)\n\t\"vmul.f32\t\td0, d16, d18\t\t\t\\n\\t\"\t//d0 = d16 * d18; \n\n\n\t\"vdup.f32\t \td4, %1\t\t\t\t\t\\n\\t\"\t//d4 = {pi/2, pi/2};\n\t\"vmov.f32\t \td6, d0\t\t\t\t\t\\n\\t\"\t//d6 = d0;\n\t\"vabs.f32\t \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = fabs(d0) ;\n\n\t//fast reciporical approximation\n\t\"vrecpe.f32\t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = ~ 1 / d0; \n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \n\n\t//if |x| > 1.0 -> ax = 1/ax, r = pi/2\n\t\"vadd.f32\t\td1, d1, d0\t\t\t\t\\n\\t\"\t//d1 = d1 + d0; \n\t\"vmov.f32\t \td2, #1.0\t\t\t\t\\n\\t\"\t//d2 = 1.0;\n\t\"vcgt.f32\t \td3, d0, d2\t\t\t\t\\n\\t\"\t//d3 = (d0 > d2);\n\t\"vcvt.f32.u32\td3, d3\t\t\t\t\t\\n\\t\"\t//d3 = (float) d3;\n\t\"vmls.f32\t\td0, d1, d3\t\t\t\t\\n\\t\"\t//d0 = d0 - d1 * d3; \t\n\t\"vmul.f32\t\td7, d3, d4\t\t\t\t\\n\\t\"\t//d7 = d3 * d4; \t\n\t\t\n\t//polynomial:\n\t\"vmul.f32 \t\td2, d0, d0\t\t\t\t\\n\\t\"\t//d2 = d0*d0 = {ax^2, ax^2}\t\n\t\"vld1.32 \t\t{d4, d5}, [%0]\t\t\t\\n\\t\"\t//d4 = {p7, p3}, d5 = {p5, p1}\n\t\"vmul.f32 \t\td3, d2, d2\t\t\t\t\\n\\t\"\t//d3 = d2*d2 = {x^4, x^4}\t\t\n\t\"vmul.f32 \t\tq0, q2, d0[0]\t\t\t\\n\\t\"\t//q0 = q2 * d0[0] = {p7x, p3x, p5x, p1x}\n\t\"vmla.f32 \t\td1, d0, d2[0]\t\t\t\\n\\t\"\t//d1 = d1 + d0*d2[0] = {p5x + p7x^3, p1x + p3x^3}\t\t\n\t\"vmla.f32 \t\td1, d3, d1[0]\t\t\t\\n\\t\"\t//d1 = d1 + d3*d1[0] = {..., p1x + p3x^3 + p5x^5 + p7x^7}\t\t\n\t\"vadd.f32 \t\td1, d1, d7\t\t\t\t\\n\\t\"\t//d1 = d1 + d7\t\t\n\t\n\t\"vadd.f32 \t\td2, d1, d1\t\t\t\t\\n\\t\"\t//d2 = d1 + d1\t\t\n\t\"vclt.f32\t \td3, d6, #0\t\t\t\t\\n\\t\"\t//d3 = (d6 < 0)\t\n\t\"vcvt.f32.u32\td3, d3\t\t\t\t\t\\n\\t\"\t//d3 = (float) d3\t\n\t\"vmls.f32 \t\td1, d3, d2\t\t\t\t\\n\\t\"\t//d1 = d1 - d2 * d3;\n\n\t\"vmov.f32 \t\ts0, s3\t\t\t\t\t\\n\\t\"\t//s0 = s3\n\n\t:: \"r\"(__atan2f_lut),  \"r\"(__atan2f_pi_2) \n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\", \"d6\", \"d7\"\n\t);\n#endif\n}\n\n\nfloat atan2f_neon_sfp(float x, float y)\n{\n#ifdef __MATH_NEON\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\n\tasm volatile (\"vmov.f32 s1, r1 \t\t\\n\\t\");\n\tatan2f_neon_hfp(x, y);\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\n#else\n\treturn atan2f_c(y, x);\n#endif\n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_atanf.c",
    "content": "/*\nMath-NEON:  Neon Optimised Math Library based on cmath\nContact:    lachlan.ts@gmail.com\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\n\nThis library is free software; you can redistribute it and/or\nmodify it under the terms of the GNU Lesser General Public\nLicense as published by the Free Software Foundation; either\nversion 3 of the License, or (at your option) any later version.\n\nThis library is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nLesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public\nLicense along with this library; if not, write to the Free\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n*/\n\n#include \"math.h\"\n#include \"math_neon.h\"\n\nconst float __atanf_lut[4] = {\n\t-0.0443265554792128,\t//p7\n\t-0.3258083974640975,\t//p3\n\t+0.1555786518463281,\t//p5\n\t+0.9997878412794807  \t//p1\n}; \n \nconst float __atanf_pi_2 = M_PI_2;\n    \nfloat atanf_c(float x)\n{\n\n\tfloat a, b, r, xx;\n\tint m;\n\t\n\tunion {\n\t\tfloat f;\n\t\tint i;\n\t} xinv, ax;\n\n\tax.f = fabs(x);\n\t\n\t//fast inverse approximation (2x newton)\n\txinv.f = ax.f;\n\tm = 0x3F800000 - (xinv.i & 0x7F800000);\n\txinv.i = xinv.i + m;\n\txinv.f = 1.41176471f - 0.47058824f * xinv.f;\n\txinv.i = xinv.i + m;\n\tb = 2.0 - xinv.f * ax.f;\n\txinv.f = xinv.f * b;\t\n\tb = 2.0 - xinv.f * ax.f;\n\txinv.f = xinv.f * b;\n\t\n\t//if |x| > 1.0 -> ax = -1/ax, r = pi/2\n\txinv.f = xinv.f + ax.f;\n\ta = (ax.f > 1.0f);\n\tax.f = ax.f - a * xinv.f;\n\tr = a * __atanf_pi_2;\n\t\n\t//polynomial evaluation\n\txx = ax.f * ax.f;\t\n\ta = (__atanf_lut[0] * ax.f) * xx + (__atanf_lut[2] * ax.f);\n\tb = (__atanf_lut[1] * ax.f) * xx + (__atanf_lut[3] * ax.f);\n\txx = xx * xx;\n\tb = b + a * xx; \n\tr = r + b;\n\n\t//if x < 0 -> r = -r\n\ta = 2 * r;\n\tb = (x < 0.0f);\n\tr = r - a * b;\n\n\treturn r;\n}\n\n\nfloat atanf_neon_hfp(float x)\n{\n#ifdef __MATH_NEON\n\tasm volatile (\n\n\t\"vdup.f32\t \td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x, x};\n\n\t\"vdup.f32\t \td4, %1\t\t\t\t\t\\n\\t\"\t//d4 = {pi/2, pi/2};\n\t\"vmov.f32\t \td6, d0\t\t\t\t\t\\n\\t\"\t//d6 = d0;\n\t\"vabs.f32\t \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = fabs(d0) ;\n\n\t//fast reciporical approximation\n\t\"vrecpe.f32\t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = ~ 1 / d0; \n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \n\n\t\t\n\t//if |x| > 1.0 -> ax = -1/ax, r = pi/2\n\t\"vadd.f32\t\td1, d1, d0\t\t\t\t\\n\\t\"\t//d1 = d1 + d0; \n\t\"vmov.f32\t \td2, #1.0\t\t\t\t\\n\\t\"\t//d2 = 1.0;\n\t\"vcgt.f32\t \td3, d0, d2\t\t\t\t\\n\\t\"\t//d3 = (d0 > d2);\n\t\"vshr.u32\t \td3, #31\t\t\t\t\t\\n\\t\"\t//d3 = (d0 > d2);\n\t\"vcvt.f32.u32\td3, d3\t\t\t\t\t\\n\\t\"\t//d5 = (float) d3;\t\n\t\"vmls.f32\t\td0, d1, d3[0]\t\t\t\\n\\t\"\t//d0 = d0 - d1 * d3[0]; \t\n\t\"vmul.f32\t\td7, d4, d3[0] \t\t\t\\n\\t\"\t//d7 = d5 * d4; \t\n\t\n\t//polynomial:\n\t\"vmul.f32 \t\td2, d0, d0\t\t\t\t\\n\\t\"\t//d2 = d0*d0 = {ax^2, ax^2}\t\n\t\"vld1.32 \t\t{d4, d5}, [%0]\t\t\t\\n\\t\"\t//d4 = {p7, p3}, d5 = {p5, p1}\n\t\"vmul.f32 \t\td3, d2, d2\t\t\t\t\\n\\t\"\t//d3 = d2*d2 = {x^4, x^4}\t\t\n\t\"vmul.f32 \t\tq0, q2, d0[0]\t\t\t\\n\\t\"\t//q0 = q2 * d0[0] = {p7x, p3x, p5x, p1x}\n\t\"vmla.f32 \t\td1, d0, d2[0]\t\t\t\\n\\t\"\t//d1 = d1 + d0*d2[0] = {p5x + p7x^3, p1x + p3x^3}\t\t\n\t\"vmla.f32 \t\td1, d3, d1[0]\t\t\t\\n\\t\"\t//d1 = d1 + d3*d1[0] = {..., p1x + p3x^3 + p5x^5 + p7x^7}\t\t\n\t\"vadd.f32 \t\td1, d1, d7\t\t\t\t\\n\\t\"\t//d1 = d1 + d7\t\t\n\n\t\"vadd.f32 \t\td2, d1, d1\t\t\t\t\\n\\t\"\t//d2 = d1 + d1\t\t\n\t\"vclt.f32\t \td3, d6, #0\t\t\t\t\\n\\t\"\t//d3 = (d6 < 0)\t\n\t\"vshr.u32\t \td3, #31\t\t\t\t\t\\n\\t\"\t//d3 = (d0 > d2);\n\t\"vcvt.f32.u32\td3, d3\t\t\t\t\t\\n\\t\"\t//d3 = (float) d3\t\n\t\"vmls.f32 \t\td1, d3, d2\t\t\t\t\\n\\t\"\t//d1 = d1 - d2 * d3;\n\n\t\"vmov.f32 \t\ts0, s3\t\t\t\t\t\\n\\t\"\t//s0 = s3\n\n\t:: \"r\"(__atanf_lut),  \"r\"(__atanf_pi_2) \n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\", \"d6\", \"d7\"\n\t);\n\n#endif\n}\n\n\nfloat atanf_neon_sfp(float x)\n{\n#ifdef __MATH_NEON\n\tasm volatile (\"vdup.f32 d0, r0 \t\t\\n\\t\");\n\tatanf_neon_hfp(x);\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\n#else\n\treturn atanf_c(x);\n#endif\n};\n\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_ceilf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nAssumes the floating point value |x| < 2147483648\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nfloat ceilf_c(float x)\r\n{\r\n\tint n;\r\n\tfloat r;\t\r\n\tn = (int) x;\r\n\tr = (float) n;\r\n\tr = r + (x > r);\r\n\treturn r;\r\n}\r\n\r\nfloat ceilf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\r\n\t\"vcvt.s32.f32 \td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = (int) d0;\r\n\t\"vcvt.f32.s32 \td1, d1\t\t\t\t\t\\n\\t\"\t//d1 = (float) d1;\r\n\t\"vcgt.f32 \t\td0, d0, d1\t\t\t\t\\n\\t\"\t//d0 = (d0 > d1);\r\n\t\"vshr.u32 \t\td0, #31\t\t\t\t\t\\n\\t\"\t//d0 = d0 >> 31;\r\n\t\"vcvt.f32.u32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = (float) d0;\r\n\t\"vadd.f32 \t\td0, d1, d0\t\t\t\t\\n\\t\"\t//d0 = d1 + d0;\r\n\r\n\t::: \"d0\", \"d1\"\r\n\t);\r\n\t\t\r\n#endif\r\n}\r\n\r\nfloat ceilf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tceilf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn ceilf_c(x);\r\n#endif\r\n};\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_cosf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math_neon.h\"\r\n\r\nfloat cosf_c(float x)\r\n{\r\n\treturn sinf_c(x + M_PI_2);\r\n}\r\n\r\nfloat cosf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tfloat xx = x + M_PI_2;\r\n\treturn sinf_neon_hfp(xx);\r\n#endif\r\n}\r\n\r\nfloat cosf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vdup.f32 d0, r0 \t\t\\n\\t\");\r\n\tcosf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn cosf_c(x);\r\n#endif\r\n};\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_coshf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __coshf_rng[2] = {\r\n\t1.442695041f,\r\n\t0.693147180f\r\n};\r\n\r\nconst float __coshf_lut[16] = {\r\n\t0.00019578093328483123,\t//p7\r\n\t0.00019578093328483123,\t//p7\r\n\t0.0014122663401803872, \t//p6\r\n\t0.0014122663401803872, \t//p6\r\n\t0.008336936973260111, \t//p5\r\n\t0.008336936973260111, \t//p5\r\n\t0.04165989275009526, \t//p4\r\n\t0.04165989275009526, \t//p4\r\n\t0.16666570253074878, \t//p3\r\n\t0.16666570253074878, \t//p3\r\n\t0.5000006143673624, \t//p2\r\n\t0.5000006143673624, \t//p2\r\n\t1.000000059694879, \t\t//p1\r\n\t1.000000059694879, \t\t//p1\r\n\t0.9999999916728642,\t\t//p0\r\n\t0.9999999916728642\t\t//p0\r\n};\r\n\r\n  \r\nfloat coshf_c(float x)\r\n{\r\n\tfloat a, b, xx;\r\n\txx = -x;\r\n\ta = expf_c(x);\r\n\tb = expf_c(xx);\r\n\ta = a * 0.5f;\r\n\ta = a + 0.5f * b;\r\n\treturn a;\r\n}\r\n\r\n\r\nfloat coshf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vdup.f32 \t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x, x}\t\r\n\t\"fnegs \t\t\ts1, s1\t\t\t\t\t\\n\\t\"\t//s1 = -s1\r\n\t\r\n\t//Range Reduction:\r\n\t\"vld1.32 \t\td2, [%0]\t\t\t\t\\n\\t\"\t//d2 = {invrange, range}\r\n\t\"vld1.32 \t\t{d16, d17}, [%1]!\t\t\\n\\t\"\t\r\n\t\"vmul.f32 \t\td6, d0, d2[0]\t\t\t\\n\\t\"\t//d6 = d0 * d2[0] \r\n\t\"vcvt.s32.f32 \td6, d6\t\t\t\t\t\\n\\t\"\t//d6 = (int) d6\r\n\t\"vld1.32 \t\t{d18}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vcvt.f32.s32 \td1, d6\t\t\t\t\t\\n\\t\"\t//d1 = (float) d6\r\n\t\"vld1.32 \t\t{d19}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmls.f32 \t\td0, d1, d2[1]\t\t\t\\n\\t\"\t//d0 = d0 - d1 * d2[1]\r\n\t\"vld1.32 \t\t{d20}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\t\r\n\t//polynomial:\r\n\t\"vmla.f32 \t\td17, d16, d0\t\t\t\\n\\t\"\t//d17 = d17 + d16 * d0;\t\r\n\t\"vld1.32 \t\t{d21}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmla.f32 \t\td18, d17, d0\t\t\t\\n\\t\"\t//d18 = d18 + d17 * d0;\t\r\n\t\"vld1.32 \t\t{d22}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmla.f32 \t\td19, d18, d0\t\t\t\\n\\t\"\t//d19 = d19 + d18 * d0;\t\r\n\t\"vld1.32 \t\t{d23}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmla.f32 \t\td20, d19, d0\t\t\t\\n\\t\"\t//d20 = d20 + d19 * d0;\t\r\n\t\"vmla.f32 \t\td21, d20, d0\t\t\t\\n\\t\"\t//d21 = d21 + d20 * d0;\t\r\n\t\"vmla.f32 \t\td22, d21, d0\t\t\t\\n\\t\"\t//d22 = d22 + d21 * d0;\t\r\n\t\"vmla.f32 \t\td23, d22, d0\t\t\t\\n\\t\"\t//d23 = d23 + d22 * d0;\t\r\n\t\r\n\t//multiply by 2 ^ m \t\r\n\t\"vshl.i32 \t\td6, d6, #23\t\t\t\t\\n\\t\"\t//d6 = d6 << 23\t\t\r\n\t\"vadd.i32 \t\td0, d23, d6\t\t\t\t\\n\\t\"\t//d0 = d22 + d6\t\t\r\n\r\n\t\"vdup.f32 \t\td2, d0[1]\t\t\t\t\\n\\t\"\t//d2 = s1\t\t\r\n\t\"vmov.f32 \t\td1, #0.5\t\t\t\t\\n\\t\"\t//d1 = 0.5\t\t\r\n\t\"vadd.f32 \t\td0, d0, d2\t\t\t\t\\n\\t\"\t//d0 = d0 + d2\t\t\r\n\t\"vmul.f32 \t\td0, d1\t\t\t\t\t\\n\\t\"\t//d0 = d0 * d1\t\t\r\n\r\n\t:: \"r\"(__coshf_rng), \"r\"(__coshf_lut) \r\n    : \"d0\", \"d1\", \"q1\", \"q2\", \"d6\"\r\n\t);\r\n\t\t\r\n#endif\r\n}\r\n\r\nfloat coshf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tcoshf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn coshf_c(x);\r\n#endif\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_debug.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n\r\n#include \"math_neon.h\"\r\n#include <stdlib.h>\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <math.h>\r\n#include <time.h>\r\n#ifdef WIN32\r\n#include <time.h>\r\n#else\r\n#include <sys/time.h>\r\n#include <sys/resource.h>\r\n#endif\r\n\r\n#define randf()\t(rand() / (RAND_MAX + 1.0f))\r\n\r\n#ifdef ANDROID\r\n#include \"../main.h\"\r\n#include \"../neontest.h\"\r\n#define printf LOGI\r\n#endif\r\n\r\nstruct\ttest1_s {\r\n\tconst char*\tname;\r\n\tfloat \t\t(*func)(float);\t//the function\r\n\tfloat \t\t(*bench)(float);\t//the function to benchmark against.\r\n\tfloat \t\trng0, rng1;\r\n\tint\t\t\tnum;\r\n\tfloat \t\temaxabs;\r\n\tfloat \t\txmaxabs;\r\n\tfloat \t\temaxrel;\r\n\tfloat \t\txmaxrel;\r\n\tfloat \t\terms;\r\n\tint\t\t\ttime;\t\t\t\t//time to execute num functions;\r\n};\r\n\r\nstruct\ttest2_s {\r\n\tconst char*\tname;\r\n\tfloat \t\t(*func)(float, float);\t//the function\r\n\tfloat \t\t(*bench)(float, float);\t//the function to benchmark against.\r\n\tfloat \t\trng0, rng1;\r\n\tint\t\t\tnum;\r\n\tfloat \t\temaxabs;\r\n\tfloat \t\txmaxabs;\r\n\tfloat \t\temaxrel;\r\n\tfloat \t\txmaxrel;\r\n\tfloat \t\terms;\r\n\tint\t\t\ttime;\t\t\t\t//time to execute num functions;\r\n};\r\n\r\n\r\nfloat invsqrtf(float x){\r\n\treturn (1.0f / sqrtf(x));\r\n}\r\n\r\ntypedef struct test1_s test1_t;\r\ntypedef struct test2_s test2_t;\r\n\r\ntest1_t test1[51] = \r\n{\r\n\t{\"sinf       \", \tsinf, \t\tsinf, \t-M_PI, \t\tM_PI, \t500000},\r\n\t{\"sinf_c     \", \tsinf_c, \tsinf, \t-M_PI, \t\tM_PI, \t500000},\r\n\t{\"sinf_neon  \", \tsinf_neon, \tsinf, \t-M_PI, \t\tM_PI, \t500000},\r\n\t\r\n\t{\"cosf       \", \tcosf, \t\tcosf, \t-M_PI, \t\tM_PI, \t500000},\r\n\t{\"cosf_c     \", \tcosf_c, \tcosf, \t-M_PI, \t\tM_PI, \t500000},\r\n\t{\"cosf_neon  \", \tcosf_neon, \tcosf, \t-M_PI, \t\tM_PI, \t500000},\r\n\r\n\t{\"tanf       \", \ttanf, \t\ttanf, \t-M_PI_4, \tM_PI_4, 500000, 0, 0, 0},\r\n\t{\"tanf_c     \", \ttanf_c, \ttanf, \t-M_PI_4, \tM_PI_4, 500000, 0, 0, 0},\r\n\t{\"tanf_neon  \", \ttanf_neon, \ttanf, \t-M_PI_4, \tM_PI_4, 500000, 0, 0, 0},\r\n\r\n\t{\"asinf      \", \tasinf, \t\tasinf, \t-1, \t\t1, \t\t500000, 0, 0, 0},\r\n\t{\"asinf_c    \", \tasinf_c, \tasinf, \t-1, \t\t1,\t \t500000, 0, 0, 0},\r\n\t{\"asinf_neon \",\t\tasinf_neon,\tasinf, \t-1, \t\t1, \t\t500000, 0, 0, 0},\r\n\t\r\n\t{\"acosf      \", \tacosf, \t\tacosf, \t-1, \t\t1, \t\t500000, 0, 0, 0},\r\n\t{\"acosf_c    \", \tacosf_c, \tacosf, \t-1, \t\t1,\t \t500000, 0, 0, 0},\r\n\t{\"acosf_neon \",\t\tacosf_neon,\tacosf, \t-1, \t\t1, \t\t500000, 0, 0, 0},\r\n\t\r\n\t{\"atanf      \", \tatanf, \t\tatanf, \t-1, \t\t1, \t\t500000, 0, 0, 0},\r\n\t{\"atanf_c    \", \tatanf_c, \tatanf, \t-1, \t\t1,\t \t500000, 0, 0, 0},\r\n\t{\"atanf_neon \",\t\tatanf_neon,\tatanf, \t-1, \t\t1, \t\t500000, 0, 0, 0},\r\n\r\n\t{\"sinhf       \", \tsinhf, \t\tsinhf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\t{\"sinhf_c     \", \tsinhf_c, \tsinhf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\t{\"sinhf_neon  \", \tsinhf_neon, sinhf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\t\r\n\t{\"coshf       \", \tcoshf, \t\tcoshf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\t{\"coshf_c     \", \tcoshf_c, \tcoshf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\t{\"coshf_neon  \", \tcoshf_neon, coshf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\r\n\t{\"tanhf       \", \ttanhf, \t\ttanhf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\t{\"tanhf_c     \", \ttanhf_c, \ttanhf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\t{\"tanhf_neon  \", \ttanhf_neon, tanhf, \t-M_PI, \t\tM_PI, \t500000, 0, 0, 0},\r\n\r\n\t{\"expf       \", \texpf, \t\texpf, \t0, \t\t\t10, \t500000, 0, 0, 0},\r\n\t{\"expf_c     \", \texpf_c, \texpf, \t0, \t\t\t10, \t500000, 0, 0, 0},\r\n\t{\"expf_neon  \",\t\texpf_neon, \texpf, \t0, \t\t\t10, \t500000, 0, 0, 0},\r\n\t\r\n\t{\"logf       \", \tlogf, \t\tlogf, \t1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\t{\"logf_c     \", \tlogf_c, \tlogf, \t1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\t{\"logf_neon  \",\t\tlogf_neon, \tlogf, \t1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\r\n\t{\"log10f       \", \tlog10f, \tlog10f, 1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\t{\"log10f_c     \", \tlog10f_c, \tlog10f, 1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\t{\"log10f_neon  \",\tlog10f_neon,log10f, 1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\r\n\t{\"floorf     \", \tfloorf, \tfloorf, 1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\t{\"floorf_c   \", \tfloorf_c, \tfloorf, 1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\t{\"floorf_neon\",\t\tfloorf_neon,floorf, 1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\r\n\t{\"ceilf     \", \t\tceilf, \t\tceilf, \t1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\t{\"ceilf_c   \", \t\tceilf_c, \tceilf, \t1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\t{\"ceilf_neon\",\t\tceilf_neon,\tceilf, \t1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\r\n\t{\"fabsf     \", \t\tfabsf, \t\tfabsf, \t1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\t{\"fabsf_c   \", \t\tfabsf_c, \tfabsf, \t1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\t{\"fabsf_neon\",\t\tfabsf_neon,\tfabsf, \t1, \t\t\t1000, \t5000000, 0, 0, 0},\r\n\r\n\t{\"sqrtf      \", \tsqrtf, \t\tsqrtf, \t1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\t{\"sqrtf_c    \", \tsqrtf_c, \tsqrtf, \t1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\t{\"sqrtf_neon \",\t\tsqrtf_neon,\tsqrtf, \t1, \t\t\t1000, \t500000, 0, 0, 0},\r\n\r\n\t{\"invsqrtf      \", \tinvsqrtf, \t\tinvsqrtf, \t1, \t1000, \t500000, 0, 0, 0},\r\n\t{\"invsqrtf_c    \", \tinvsqrtf_c, \tinvsqrtf, \t1, \t1000, \t500000, 0, 0, 0},\r\n\t{\"invsqrtf_neon \",\tinvsqrtf_neon,\tinvsqrtf, \t1, \t1000, \t500000, 0, 0, 0},\r\n};\r\n\r\ntest2_t test2[9] = \r\n{\r\n\t{\"atan2f       \", \tatan2f, \tatan2f, 0.1, \t\t10, \t10000, 0, 0, 0},\r\n\t{\"atan2f_c     \", \tatan2f_c, \tatan2f, 0.1, \t\t10, \t10000, 0, 0, 0},\r\n\t{\"atan2f_neon  \", \tatan2f_neon,atan2f, 0.1, \t\t10, \t10000, 0, 0, 0},\r\n\t\r\n\t{\"powf       \", \tpowf, \t\tpowf, \t1, \t\t\t10, \t10000, 0, 0, 0},\r\n\t{\"powf_c     \", \tpowf_c, \tpowf, \t1, \t\t\t10, \t10000, 0, 0, 0},\r\n\t{\"powf_neon  \", \tpowf_neon, \tpowf, \t1, \t\t\t10, \t10000, 0, 0, 0},\r\n\r\n\t{\"fmodf       \", \tfmodf, \t\tfmodf, \t1, \t\t\t10, \t10000, 0, 0, 0},\r\n\t{\"fmodf_c     \", \tfmodf_c, \tfmodf, \t1, \t\t\t10, \t10000, 0, 0, 0},\r\n\t{\"fmodf_neon  \", \tfmodf_neon, fmodf, \t1, \t\t\t10, \t10000, 0, 0, 0},\r\n\r\n};\r\n\r\n\r\nvoid \r\ntest_mathfunc1(test1_t *tst)\r\n{\r\n\r\n\tfloat x;\r\n\tfloat dx = (tst->rng1 - tst->rng0) / ((float)tst->num);\r\n#ifndef WIN32\r\n\tstruct rusage ru;\r\n#endif\r\n\r\n\ttst->emaxabs = tst->xmaxabs = 0;\r\n\ttst->emaxrel = tst->xmaxrel = 0;\r\n\ttst->erms = 0;\r\n\tfor(x = tst->rng0; x < tst->rng1 ; x += dx){\t\r\n\t\tfloat r = (tst->func)((float)x);\r\n\t\tfloat rr = (tst->bench)((float)x);\r\n\t\tfloat dr = fabs(r - rr);\r\n\t\tfloat drr = dr * (100.0f / rr);\r\n\t\ttst->erms += dr*dr;\r\n\t\tif (dr > tst->emaxabs){\r\n\t\t\ttst->emaxabs = dr;\r\n\t\t\ttst->xmaxabs = x;\r\n\t\t}\r\n\t\tif (drr > tst->emaxrel){\r\n\t\t\ttst->emaxrel = drr;\r\n\t\t\ttst->xmaxrel = x;\r\n\t\t}\r\n\t}\r\n\ttst->erms = sqrt(tst->erms / ((float) tst->num));\r\n\t\r\n#ifdef WIN32\r\n\ttst->time = (1000 * clock()) / (CLOCKS_PER_SEC / 1000);\r\n#else\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\ttst->time = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n#endif\r\n\r\n\tfor(x = tst->rng0; x < tst->rng1 ; x += dx){\t\r\n\t\t(tst->func)((float)x);\r\n\t}\r\n\r\n#ifdef WIN32\r\n\ttst->time = (1000 * clock()) / (CLOCKS_PER_SEC / 1000) - tst->time;\r\n#else\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\ttst->time = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec - tst->time;\r\n#endif\r\n\r\n}\r\n\r\nvoid\r\ntest_mathfunc2(test2_t *tst)\r\n{\r\n\tfloat x, y;\r\n\tfloat rng = tst->rng1 - tst->rng0;\r\n\tfloat d = (rng * rng) / ((float) tst->num);\r\n#ifndef WIN32\r\n\tstruct rusage ru;\r\n#endif\r\n\r\n\ttst->emaxabs = tst->xmaxabs = 0;\r\n\ttst->emaxrel = tst->xmaxrel = 0;\r\n\tfor(y = (tst->rng0); y < (tst->rng1) ; y += d){\t\r\n\t\tfor(x = (tst->rng0); x < (tst->rng1); x += d){\t\r\n\t\t\tfloat r = (tst->func)((float)x, y);\r\n\t\t\tfloat rr = (tst->bench)((float)x, y);\r\n\t\t\tfloat dr = fabs(r - rr);\r\n\t\t\tfloat drr = dr * (100.0f / rr);\r\n\t\t\tif (dr > tst->emaxabs){\r\n\t\t\t\ttst->emaxabs = dr;\r\n\t\t\t\ttst->xmaxabs = x;\r\n\t\t\t}\r\n\t\t\tif (drr > tst->emaxrel && fabsf(rr) > 0.0001){\r\n\t\t\t\ttst->emaxrel = drr;\r\n\t\t\t\ttst->xmaxrel = x;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n#ifdef WIN32\r\n\ttst->time = (1000 * clock()) / (CLOCKS_PER_SEC / 1000) ;\r\n#else\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\ttst->time = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n#endif\r\n\r\n\tfor(y = tst->rng0; y < tst->rng1 ; y += d){\t\r\n\t\tfor(x = tst->rng0; x < tst->rng1 ; x += d){\t\r\n\t\t\t(tst->func)((float)x, (float)y);\r\n\t\t}\r\n\t}\r\n\r\n#ifdef WIN32\r\n\ttst->time = (1000 * clock()) / (CLOCKS_PER_SEC / 1000) - tst->time;\r\n#else\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\ttst->time = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec - tst->time;\r\n#endif\r\n\r\n}\r\n\r\nvoid test_vectorfunc()\r\n{\r\n\tfloat v0[4], v1[4], d[4];\r\n\t\r\n\tfor(int i=0;i<4;i++)\r\n\t{\r\n\t\tv0[i] = 10*randf() - 5;\r\n\t\tv1[i] = 10*randf() - 5;\r\n\t\td[i] = 10*randf() - 5;\t\t\r\n\t}\r\n\t\r\n\tint testnum = 5000000;\r\n\tstruct rusage ru;\r\n\tint v2t[3], v3t[3], v4t[3];\r\n\tfloat r;\r\n\t\r\n\tprintf(\"\\n\");\r\n\t\r\n\t//dot 2\r\n\t/*getrusage(RUSAGE_SELF, &ru);\t\r\n\tv2t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tr = dot2_c(v0, v1);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv2t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tr = dot2_neon(v0, v1);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv2t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tr = dot2_c(v0, v1);\r\n\tprintf(\"dot2_c = %f\\n\", r);\r\n\tr = dot2_neon(v0, v1);\r\n\tprintf(\"dot2_neon = %f\\n\", r);\r\n\t\r\n\tprintf(\"dot2: c=%i \\t neon=%i \\t rate=%.2f \\n\", v2t[1] - v2t[0], v2t[2] - v2t[1], \r\n\t(float)(v2t[1] - v2t[0]) / (float)(v2t[2] - v2t[1]));*/\r\n\r\n\t//normalize 2\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv2t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tnormalize2_c(v0, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv2t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tnormalize2_neon(v0, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv2t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\r\n\tnormalize2_c(v0, d);\r\n\tprintf(\"normalize2_c = [%.2f, %.2f]\\n\", d[0], d[1]);\r\n\tnormalize2_neon(v0, d);\r\n\tprintf(\"normalize2_neon = [%.2f, %.2f]\\n\", d[0], d[1]);\r\n\t\r\n\tprintf(\"normalize2: c=%i \\t neon=%i \\t rate=%.2f \\n\", v2t[1] - v2t[0], v2t[2] - v2t[1], \r\n\t(float)(v2t[1] - v2t[0]) / (float)(v2t[2] - v2t[1]));\r\n\tprintf(\"\\n\");\r\n\r\n\t\r\n\t//dot 3\r\n\t/*getrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tr = dot3_c(v0, v1);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tr = dot3_neon(v0, v1);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tr = dot3_c(v0, v1);\r\n\tprintf(\"dot3_c = %f\\n\", r);\r\n\tr = dot3_neon(v0, v1);\r\n\tprintf(\"dot3_neon = %f\\n\", r);\r\n\t\r\n\tprintf(\"dot3: c=%i \\t neon=%i \\t rate=%.2f \\n\", v3t[1] - v3t[0], v3t[2] - v3t[1], \r\n\t(float)(v3t[1] - v3t[0]) / (float)(v3t[2] - v3t[1]));*/\r\n\r\n\t//normalize 3\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tnormalize3_c(v0, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tnormalize3_neon(v0, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\r\n\tnormalize3_c(v0, d);\r\n\tprintf(\"normalize3_c = [%.2f, %.2f, %.2f]\\n\", d[0], d[1], d[2]);\r\n\tnormalize3_neon(v0, d);\r\n\tprintf(\"normalize3_neon = [%.2f, %.2f, %.2f]\\n\", d[0], d[1], d[2]);\r\n\t\r\n\tprintf(\"normalize3: c=%i \\t neon=%i \\t rate=%.2f \\n\", v3t[1] - v3t[0], v3t[2] - v3t[1], \r\n\t(float)(v3t[1] - v3t[0]) / (float)(v3t[2] - v3t[1]));\r\n\r\n\t//cross 3\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tcross3_c(v0, v1, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tcross3_neon(v0, v1, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv3t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\r\n\tcross3_c(v0, v1, d);\r\n\tprintf(\"cross3_c = [%.2f, %.2f, %.2f]\\n\", d[0], d[1], d[2]);\r\n\tcross3_neon(v0, v1, d);\r\n\tprintf(\"cross3_neon = [%.2f, %.2f, %.2f]\\n\", d[0], d[1], d[2]);\r\n\t\r\n\tprintf(\"cross3: c=%i \\t neon=%i \\t rate=%.2f \\n\", v3t[1] - v3t[0], v3t[2] - v3t[1], \r\n\t(float)(v3t[1] - v3t[0]) / (float)(v3t[2] - v3t[1]));\r\n\tprintf(\"\\n\");\r\n\r\n\r\n\t//dot 4\r\n\t/*getrusage(RUSAGE_SELF, &ru);\t\r\n\tv4t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tr = dot4_c(v0, v1);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv4t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tr = dot4_neon(v0, v1);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv4t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tr = dot4_c(v0, v1);\r\n\tprintf(\"dot4_c = %f\\n\", r);\r\n\tr = dot4_neon(v0, v1);\r\n\tprintf(\"dot4_neon = %f\\n\", r);\r\n\t\r\n\tprintf(\"dot4: c=%i \\t neon=%i \\t rate=%.2f \\n\", v4t[1] - v4t[0], v4t[2] - v4t[1], \r\n\t(float)(v4t[1] - v4t[0]) / (float)(v4t[2] - v4t[1]));*/\r\n\t\r\n\t//normalize 4\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv4t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tnormalize4_c(v0, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv4t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(int i=0;i < testnum; i++)\r\n\t{\r\n\t\tnormalize4_neon(v0, d);\r\n\t};\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tv4t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\r\n\tnormalize4_c(v0, d);\r\n\tprintf(\"normalize4_c = [%.2f, %.2f, %.2f, %.2f]\\n\", d[0], d[1], d[2], d[3]);\r\n\tnormalize4_neon(v0, d);\r\n\tprintf(\"normalize4_neon = [%.2f, %.2f, %.2f, %.2f]\\n\", d[0], d[1], d[2], d[3]);\r\n\t\r\n\tprintf(\"normalize4: c=%i \\t neon=%i \\t rate=%.2f \\n\", v4t[1] - v4t[0], v4t[2] - v4t[1], \r\n\t(float)(v4t[1] - v4t[0]) / (float)(v4t[2] - v4t[1]));\r\n\tprintf(\"\\n\");\r\n\r\n\r\n}\r\n\r\n\r\n\r\nvoid test_matrixfunc()\r\n{\r\n\tfloat m0[16], m1[16], m2[16];\r\n\tint m2t[3], m3t[3], m4t[3];\r\n\t\r\n\tint i;\r\n\tint testnum = 1000000;\r\n\tstruct rusage ru;\r\n\t\r\n\tfor(int i=0;i<16;i++)\r\n\t{\r\n\t\tm0[i] = 10.0f * randf() - 5.0f; \r\n\t\tm1[i] = 10.0f * randf() - 5.0f; \r\n\t\tm2[i] = 10.0f * randf() - 5.0f; \r\n\t}\r\n\r\n\r\n\t//matmul2 \r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm2t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatmul2_c(m0, m1, m2);\t\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm2t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatmul2_neon(m0, m1, m2);\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm2t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tmatmul2_c(m0, m1, m2);\t\r\n\tprintf(\"matmul2_c = \\n\");\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f|\\n\", m2[0], m2[2]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f|\\n\", m2[1], m2[3]);\r\n\r\n\tmatmul2_neon(m0, m1, m2);\t\r\n\tprintf(\"matmul2_neon = \\n\");\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f|\\n\", m2[0], m2[2]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f|\\n\", m2[1], m2[3]);\r\n\t\r\n\tprintf(\"matmul2: c=%i \\t neon=%i \\t rate=%.2f \\n\", m2t[1] - m2t[0], m2t[2] - m2t[1], \r\n\t\t(float)(m2t[1] - m2t[0]) / (float)(m2t[2] - m2t[1]));\r\n\r\n\r\n\t//matvec2 \r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm2t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatvec2_c(m0, m1, m2);\t\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm2t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatvec2_neon(m0, m1, m2);\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm2t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tmemset(m2, 0, 4*sizeof(float));\r\n\tmatvec2_c(m0, m1, m2);\t\r\n\tprintf(\"matvec2_c = |%.2f, %.2f|\\n\", m2[0], m2[1]);\r\n\t\r\n\tmemset(m2, 0, 4*sizeof(float));\r\n\tmatvec2_neon(m0, m1, m2);\t\r\n\tprintf(\"matvec2_neon = |%.2f, %.2f|\\n\", m2[0], m2[1]);\r\n\r\n\tprintf(\"matvec2: c=%i \\t neon=%i \\t rate=%.2f \\n\", m2t[1] - m2t[0], m2t[2] - m2t[1], \r\n\t\t(float)(m2t[1] - m2t[0]) / (float)(m2t[2] - m2t[1]));\r\n\r\n\t//MAT3\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm3t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatmul3_c(m0, m1, m2);\t\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm3t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatmul3_neon(m0, m1, m2);\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm3t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tmemset(m2, 0, 9*sizeof(float));\r\n\tmatmul3_c(m0, m1, m2);\t\r\n\tprintf(\"matmul3_c =\\n\");\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f|\\n\", m2[0], m2[3], m2[6]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f|\\n\", m2[1], m2[4], m2[7]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f|\\n\", m2[2], m2[5], m2[8]);\r\n\t\r\n\tmemset(m2, 0, 9*sizeof(float));\r\n\tmatmul3_neon(m0, m1, m2);\t\r\n\tprintf(\"matmul3_neon =\\n\");\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f|\\n\", m2[0], m2[3], m2[6]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f|\\n\", m2[1], m2[4], m2[7]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f|\\n\", m2[2], m2[5], m2[8]);\r\n\t\r\n\tprintf(\"matmul3: c=%i \\t neon=%i \\t rate=%.2f \\n\", m3t[1] - m3t[0], m3t[2] - m3t[1], \r\n\t\t(float)(m3t[1] - m3t[0]) / (float)(m3t[2] - m3t[1]));\r\n\r\n\t//matvec3\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm3t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatvec3_c(m0, m1, m2);\t\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm3t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatvec3_neon(m0, m1, m2);\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm3t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tmemset(m2, 0, 4*sizeof(float));\r\n\tmatvec3_c(m0, m1, m2);\t\r\n\tprintf(\"matvec3_c = |%.2f, %.2f, %.2f|\\n\", m2[0], m2[1], m2[2]);\r\n\r\n\tmemset(m2, 0, 4*sizeof(float));\r\n\tmatvec3_neon(m0, m1, m2);\t\r\n\tprintf(\"matvec3_neon = |%.2f, %.2f, %.2f|\\n\", m2[0], m2[1], m2[2]);\r\n\t\r\n\tprintf(\"matvec3: c=%i \\t neon=%i \\t rate=%.2f \\n\", m2t[1] - m2t[0], m2t[2] - m2t[1], \r\n\t\t(float)(m2t[1] - m2t[0]) / (float)(m2t[2] - m2t[1]));\r\n\r\n\t//MAT4\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm4t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatmul4_c(m0, m1, m2);\t\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm4t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatmul4_neon(m0, m1, m2);\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm4t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tmemset(m2, 0, 16*sizeof(float));\r\n\tmatmul4_c(m0, m1, m2);\t\r\n\tprintf(\"matmul4_c =\\n\");\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[0], m2[4], m2[8], m2[12]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[1], m2[5], m2[9], m2[13]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[2], m2[6], m2[10], m2[14]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[3], m2[7], m2[11], m2[15]);\r\n\t\r\n\tmemset(m2, 0, 16*sizeof(float));\r\n\tmatmul4_neon(m0, m1, m2);\t\r\n\tprintf(\"matmul4_neon =\\n\");\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[0], m2[4], m2[8], m2[12]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[1], m2[5], m2[9], m2[13]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[2], m2[6], m2[10], m2[14]);\r\n\tprintf(\"\\t\\t\\t|%.2f, %.2f, %.2f, %.2f|\\n\", m2[3], m2[7], m2[11], m2[15]);\r\n\t\r\n\tprintf(\"matmul4: c=%i \\t neon=%i \\t rate=%.2f \\n\", m4t[1] - m4t[0], m4t[2] - m4t[1], \r\n\t\t(float)(m4t[1] - m4t[0]) / (float)(m4t[2] - m4t[1]));\r\n\r\n\t//matvec4\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm4t[0] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatvec4_c(m0, m1, m2);\t\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm4t[1] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\tfor(i = 0; i < testnum; i++){\r\n\t\tmatvec4_neon(m0, m1, m2);\r\n\t}\r\n\tgetrusage(RUSAGE_SELF, &ru);\t\r\n\tm4t[2] = ru.ru_utime.tv_sec * 1000000 + ru.ru_utime.tv_usec;\r\n\r\n\tmemset(m2, 0, 4*sizeof(float));\r\n\tmatvec4_c(m0, m1, m2);\t\r\n\tprintf(\"matvec4_c = |%.2f, %.2f, %.2f, %f|\\n\", m2[0], m2[1], m2[2], m2[3]);\r\n\r\n\tmemset(m2, 0, 4*sizeof(float));\r\n\tmatvec4_neon(m0, m1, m2);\t\r\n\tprintf(\"matvec4_neon = |%.2f, %.2f, %.2f, %f|\\n\", m2[0], m2[1], m2[2], m2[3]);\r\n\t\r\n\tprintf(\"matvec4: c=%i \\t neon=%i \\t rate=%.2f \\n\", m2t[1] - m2t[0], m2t[2] - m2t[1], \r\n\t\t(float)(m2t[1] - m2t[0]) / (float)(m2t[2] - m2t[1]));\r\n\r\n\r\n}\r\n\r\nint math_debug_main(int argc, char** argv)\r\n{\t\r\n\r\n\tint i, ii;\r\n\tif (argc > 1 && strcmp(argv[1], \"-norunfast\") == 0){\r\n\t\tprintf(\"RUNFAST: Disabled \\n\");\r\n\t}else {\r\n\t\tprintf(\"RUNFAST: Enabled \\n\");\r\n\t\tenable_runfast();\r\n\t}\r\n\r\n\tsrand(time(NULL));\r\n\r\n#if 1\r\n\t//test single argument functions:\r\n\tprintf(\"------------------------------------------------------------------------------------------------------\\n\");\t\r\n\tprintf(\"MATRIX FUNCTION TESTS \\n\");\t\r\n\tprintf(\"------------------------------------------------------------------------------------------------------\\n\");\t\r\n\t\r\n\ttest_matrixfunc();\r\n\ttest_vectorfunc();\r\n\r\n\tprintf(\"------------------------------------------------------------------------------------------------------\\n\");\t\r\n\tprintf(\"CMATH FUNCTION TESTS \\n\");\t\r\n\tprintf(\"------------------------------------------------------------------------------------------------------\\n\");\t\r\n\tprintf(\"Function\\tRange\\t\\tNumber\\tABS Max Error\\tREL Max Error\\tRMS Error\\tTime\\tRate\\n\");\t\r\n\tprintf(\"------------------------------------------------------------------------------------------------------\\n\");\t\r\n\tfor(i = 0; i < 51; i++){\r\n\t\ttest_mathfunc1(&test1[i]);\t\r\n\t\t\r\n\t\tii = i - (i % 3);\r\n\t\tprintf(\"%s\\t\", test1[i].name);\r\n\t\tprintf(\"[%.2f, %.2f]\\t\", test1[i].rng0, test1[i].rng1);\r\n\t\tprintf(\"%i\\t\", test1[i].num);\r\n\t\tprintf(\"%.2e\\t\", test1[i].emaxabs);\r\n\t\tprintf(\"%.2e%%\\t\", test1[i].emaxrel);\r\n\t\tprintf(\"%.2e\\t\", test1[i].erms);\r\n\t\tprintf(\"%i\\t\", test1[i].time);\r\n\t\tprintf(\"x%.2f\\t\", (float)test1[ii].time / test1[i].time);\r\n\t\tprintf(\"\\n\");\r\n\t}\r\n\tfor(i = 0; i < 9; i++){\r\n\t\ttest_mathfunc2(&test2[i]);\r\n\t\r\n\t\tii = i - (i % 3);\r\n\t\t\r\n\t\tprintf(\"%s\\t\", test2[i].name);\r\n\t\tprintf(\"[%.2f, %.2f]\\t\", test2[i].rng0, test2[i].rng1);\r\n\t\tprintf(\"%i\\t\", test2[i].num);\r\n\t\tprintf(\"%.2e\\t\", test2[i].emaxabs);\r\n\t\tprintf(\"%.2e%%\\t\", test2[i].emaxrel);\r\n\t\tprintf(\"%.2e\\t\", test2[i].erms);\r\n\t\tprintf(\"%i\\t\", test2[i].time);\r\n\t\tprintf(\"x%.2f\\t\", (float)test2[ii].time / test2[i].time);\r\n\t\tprintf(\"\\n\");\r\n\t}\r\n\t\r\n#else\r\n\r\n\r\n\tfloat x = 0;\r\n\tfor(x = -M_PI_2; x < M_PI_2; x+= 0.01)\r\n\t{\r\n\t\tprintf(\"x=%.2f\\t in=%.2f\\t c=%.2f\\t neon=%.2f \\n\", x, sinhf(x), sinhf_c(x), sinhf_neon(x));\r\n\t}\r\n\r\n#endif\r\n\t\r\n\treturn 0;\r\n} \r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_expf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nBased on: \r\n\r\n\t\te ^ x = (1+m) * (2^n)\r\n\t\tx = log(1+m) + n * log(2)\r\n\t\tn = (int) (x * 1.0 / log(2))\r\n\t\t(1+m) = e ^ (x - n * log(2))\r\n\t\t(1+m) = Poly(x - n * log(2))\r\n\t\t\r\n\t\twhere Poly(x) is the Minimax approximation of e ^ x over the \r\n\t\trange [-Log(2), Log(2)]\r\n\r\nTest func : expf(x)\r\nTest Range: 0 < x < 50\r\nPeak Error:\t~0.00024%\r\nRMS  Error: ~0.00007%\r\n*/\r\n\r\n\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __expf_rng[2] = {\r\n\t1.442695041f,\r\n\t0.693147180f\r\n};\r\n\r\nconst float __expf_lut[8] = {\r\n\t0.9999999916728642,\t\t//p0\r\n\t0.04165989275009526, \t//p4\r\n\t0.5000006143673624, \t//p2\r\n\t0.0014122663401803872, \t//p6\r\n\t1.000000059694879, \t\t//p1\r\n\t0.008336936973260111, \t//p5\r\n\t0.16666570253074878, \t//p3\r\n\t0.00019578093328483123\t//p7\r\n};\r\n\r\nfloat expf_c(float x)\r\n{\r\n\tfloat a, b, c, d, xx;\r\n\tint m;\r\n\t\r\n\tunion {\r\n\t\tfloat   f;\r\n\t\tint \ti;\r\n\t} r;\r\n\t\t\r\n\t//Range Reduction:\r\n\tm = (int) (x * __expf_rng[0]);\r\n\tx = x - ((float) m) * __expf_rng[1];\t\r\n\t\r\n\t//Taylor Polynomial (Estrins)\r\n\ta = (__expf_lut[4] * x) + (__expf_lut[0]);\r\n\tb = (__expf_lut[6] * x) + (__expf_lut[2]);\r\n\tc = (__expf_lut[5] * x) + (__expf_lut[1]);\r\n\td = (__expf_lut[7] * x) + (__expf_lut[3]);\r\n\txx = x * x;\r\n\ta = a + b * xx; \r\n\tc = c + d * xx;\r\n\txx = xx* xx;\r\n\tr.f = a + c * xx; \r\n\t\r\n\t//multiply by 2 ^ m \r\n\tm = m << 23;\r\n\tr.i = r.i + m;\r\n\r\n\treturn r.f;\r\n}\r\n\r\nfloat expf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vdup.f32 \t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x, x}\r\n\t\r\n\t//Range Reduction:\r\n\t\"vld1.32 \t\td2, [%0]\t\t\t\t\\n\\t\"\t//d2 = {invrange, range}\r\n\t\"vmul.f32 \t\td6, d0, d2[0]\t\t\t\\n\\t\"\t//d6 = d0 * d2[0] \r\n\t\"vcvt.s32.f32 \td6, d6\t\t\t\t\t\\n\\t\"\t//d6 = (int) d6\r\n\t\"vcvt.f32.s32 \td1, d6\t\t\t\t\t\\n\\t\"\t//d1 = (float) d6\r\n\t\"vmls.f32 \t\td0, d1, d2[1]\t\t\t\\n\\t\"\t//d0 = d0 - d1 * d2[1]\r\n\t\t\r\n\t//polynomial:\r\n\t\"vmul.f32 \t\td1, d0, d0\t\t\t\t\\n\\t\"\t//d1 = d0*d0 = {x^2, x^2}\t\r\n\t\"vld1.32 \t\t{d2, d3, d4, d5}, [%1]\t\\n\\t\"\t//q1 = {p0, p4, p2, p6}, q2 = {p1, p5, p3, p7} ;\r\n\t\"vmla.f32 \t\tq1, q2, d0[0]\t\t\t\\n\\t\"\t//q1 = q1 + q2 * d0[0]\t\t\r\n\t\"vmla.f32 \t\td2, d3, d1[0]\t\t\t\\n\\t\"\t//d2 = d2 + d3 * d1[0]\t\t\r\n\t\"vmul.f32 \t\td1, d1, d1\t\t\t\t\\n\\t\"\t//d1 = d1 * d1 = {x^4, x^4}\t\r\n\t\"vmla.f32 \t\td2, d1, d2[1]\t\t\t\\n\\t\"\t//d2 = d2 + d1 * d2[1]\t\t\r\n\r\n\t//multiply by 2 ^ m \t\r\n\t\"vshl.i32 \t\td6, d6, #23\t\t\t\t\\n\\t\"\t//d6 = d6 << 23\t\t\r\n\t\"vadd.i32 \t\td0, d2, d6\t\t\t\t\\n\\t\"\t//d0 = d2 + d6\t\t\r\n\r\n\t:: \"r\"(__expf_rng), \"r\"(__expf_lut) \r\n    : \"d0\", \"d1\", \"q1\", \"q2\", \"d6\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat expf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\texpf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn expf_c(x);\r\n#endif\r\n};\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_fabsf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math_neon.h\"\r\n\r\n\t\r\nfloat fabsf_c(float x)\r\n{\r\n\tunion {\r\n\t\tint i;\r\n\t\tfloat f;\r\n\t} xx;\r\n\r\n\txx.f = x;\r\n\txx.i = xx.i & 0x7FFFFFFF;\r\n\treturn xx.f;\r\n}\r\n\r\nfloat fabsf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"fabss\t \t\ts0, s0\t\t\t\t\t\\n\\t\"\t//s0 = fabs(s0)\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat fabsf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"bic\t \t\tr0, r0, #0x80000000\t\t\\n\\t\"\t//r0 = r0 & ~(1 << 31)\r\n\t);\r\n#else\r\n\treturn fabsf_c(x);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_floorf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nAssumes the floating point value |x| < 2147483648\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nfloat floorf_c(float x)\r\n{\r\n\tint n;\r\n\tfloat r;\t\r\n\tn = (int) x;\r\n\tr = (float) n;\r\n\tr = r - (r > x);\r\n\treturn r;\r\n}\r\n\r\nfloat floorf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vcvt.s32.f32 \td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = (int) d0;\r\n\t\"vcvt.f32.s32 \td1, d1\t\t\t\t\t\\n\\t\"\t//d1 = (float) d1;\r\n\t\"vcgt.f32 \t\td0, d1, d0\t\t\t\t\\n\\t\"\t//d0 = (d1 > d0);\r\n\t\"vshr.u32 \t\td0, #31\t\t\t\t\t\\n\\t\"\t//d0 = d0 >> 31;\r\n\t\"vcvt.f32.u32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = (float) d0;\r\n\t\"vsub.f32 \t\td0, d1, d0\t\t\t\t\\n\\t\"\t//d0 = d1 - d0;\r\n\t::: \"d0\", \"d1\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat floorf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tfloorf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn floorf_c(x);\r\n#endif\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_fmodf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nAssumes the floating point value |x / y| < 2,147,483,648\r\n*/\r\n\r\n#include \"math_neon.h\"\r\n\r\nfloat fmodf_c(float x, float y)\r\n{\r\n\tint n;\r\n\tunion {\r\n\t\tfloat f;\r\n\t\tint   i;\r\n\t} yinv;\r\n\tfloat a;\r\n\t\r\n\t//fast reciporical approximation (4x Newton)\r\n\tyinv.f = y;\r\n\tn = 0x3F800000 - (yinv.i & 0x7F800000);\r\n\tyinv.i = yinv.i + n;\r\n\tyinv.f = 1.41176471f - 0.47058824f * yinv.f;\r\n\tyinv.i = yinv.i + n;\r\n\ta = 2.0 - yinv.f * y;\r\n\tyinv.f = yinv.f * a;\t\r\n\ta = 2.0 - yinv.f * y;\r\n\tyinv.f = yinv.f * a;\r\n\ta = 2.0 - yinv.f * y;\r\n\tyinv.f = yinv.f * a;\r\n\ta = 2.0 - yinv.f * y;\r\n\tyinv.f = yinv.f * a;\r\n\t\r\n\tn = (int)(x * yinv.f);\r\n\tx = x - ((float)n) * y;\r\n\treturn x;\r\n}\r\n\r\n\r\nfloat fmodf_neon_hfp(float x, float y)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vdup.f32 \t\td1, d0[1]\t\t\t\t\t\\n\\t\"\t//d1[0] = y\r\n\t\"vdup.f32 \t\td0, d0[0]\t\t\t\t\t\\n\\t\"\t//d1[0] = y\r\n\t\r\n\t//fast reciporical approximation\r\n\t\"vrecpe.f32 \td2, d1\t\t\t\t\t\\n\\t\"\t//d2 = ~1.0 / d1\r\n\t\"vrecps.f32\t\td3, d2, d1\t\t\t\t\\n\\t\"\t//d3 = 2.0 - d2 * d1; \r\n\t\"vmul.f32\t\td2, d2, d3\t\t\t\t\\n\\t\"\t//d2 = d2 * d3; \r\n\t\"vrecps.f32\t\td3, d2, d1\t\t\t\t\\n\\t\"\t//d3 = 2.0 - d2 * d1; \r\n\t\"vmul.f32\t\td2, d2, d3\t\t\t\t\\n\\t\"\t//d2 = d2 * d3; \r\n\t\"vrecps.f32\t\td3, d2, d1\t\t\t\t\\n\\t\"\t//d3 = 2.0 - d2 * d1; \r\n\t\"vmul.f32\t\td2, d2, d3\t\t\t\t\\n\\t\"\t//d2 = d2 * d3; \r\n\t\"vrecps.f32\t\td3, d2, d1\t\t\t\t\\n\\t\"\t//d3 = 2.0 - d2 * d1; \r\n\t\"vmul.f32\t\td2, d2, d3\t\t\t\t\\n\\t\"\t//d2 = d2 * d3; \r\n\r\n\t\"vmul.f32\t\td2, d2, d0\t\t\t\t\\n\\t\"\t//d2 = d2 * d0; \r\n\t\"vcvt.s32.f32\td2, d2\t\t\t\t\t\\n\\t\"\t//d2 = (int) d2; \r\n\t\"vcvt.f32.s32\td2, d2\t\t\t\t\t\\n\\t\"\t//d2 = (float) d2; \r\n\t\"vmls.f32\t\td0, d1, d2\t\t\t\t\\n\\t\"\t//d0 = d0 - d1 * d2; \r\n\r\n\t::: \"d0\", \"d1\", \"d2\", \"d3\"\r\n\t);\r\n#endif\r\n}\r\n\r\n\r\nfloat fmodf_neon_sfp(float x, float y)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tasm volatile (\"vmov.f32 s1, r1 \t\t\\n\\t\");\r\n\tfmodf_neon_hfp(x, y);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn fmodf_c(x,y);\r\n#endif\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_frexpf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nfloat frexpf_c(float x, int *e)\r\n{\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} r;\r\n\tint n;\r\n\t\r\n\tr.f = x;\r\n\tn = r.i >> 23;\r\n\tn = n & 0xFF;\r\n\tn = n - 126;\r\n\tr.i = r.i - (n << 23);\r\n\t*e = n;\r\n\treturn r.f;\r\n}\r\n\r\nfloat frexpf_neon_hfp(float x, int *e)\r\n{\r\n\treturn frexpf_c(x, e);\r\n}\r\n\r\nfloat frexpf_neon_sfp(float x, int *e)\r\n{\r\n\treturn frexpf_c(x, e);\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_invsqrtf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nfloat invsqrtf_c(float x)\r\n{\r\n\r\n\tfloat b, c;\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} a;\r\n\t\r\n\t//fast invsqrt approx\r\n\ta.f = x;\r\n\ta.i = 0x5F3759DF - (a.i >> 1);\t\t//VRSQRTE\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\t\t//VRSQRTS\r\n\ta.f = a.f * b;\t\t\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\r\n    a.f = a.f * b;\t\r\n\r\n\treturn a.f;\r\n}\r\n\r\nfloat invsqrtf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\t\r\n\t\"vmov.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = d0\r\n\t\"vrsqrte.f32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = ~ 1.0 / sqrt(d0)\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d3 = (3 - d0 * d2) / 2 \t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\t\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2\t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d4\t\r\n\t\t\r\n\t::: \"d0\", \"d1\", \"d2\", \"d3\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat invsqrtf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tinvsqrtf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn invsqrtf_c(x);\r\n#endif\r\n};\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_ldexpf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nfloat ldexpf_c(float m, int e)\r\n{\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} r;\r\n\tr.f = m;\r\n\tr.i += (e << 23);\r\n\treturn r.f;\r\n}\r\n\r\nfloat ldexpf_neon_hfp(float m, int e)\r\n{\r\n#ifdef __MATH_NEON\r\n\tfloat r;\r\n\tasm volatile (\r\n\t\"lsl \t\t\tr0, r0, #23\t\t\t\t\\n\\t\"\t//r0 = r0 << 23\t\r\n\t\"vdup.i32 \t\td1, r0\t\t\t\t\t\\n\\t\"\t//d1 = {r0, r0}\r\n\t\"vadd.i32 \t\td0, d0, d1\t\t\t\t\\n\\t\"\t//d0 = d0 + d1\r\n\t::: \"d0\", \"d1\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat ldexpf_neon_sfp(float m, int e)\r\n{\r\n#ifdef __MATH_NEON\r\n\tfloat r;\r\n\tasm volatile (\r\n\t\"lsl \t\t\tr1, r1, #23\t\t\t\t\\n\\t\"\t//r1 = r1 << 23\t\r\n\t\"vdup.f32 \t\td0, r0\t\t\t\t\t\\n\\t\"\t//d0 = {r0, r0}\t\r\n\t\"vdup.i32 \t\td1, r1\t\t\t\t\t\\n\\t\"\t//d1 = {r1, r1}\r\n\t\"vadd.i32 \t\td0, d0, d1\t\t\t\t\\n\\t\"\t//d0 = d0 + d1\r\n\t\"vmov.f32 \t\tr0, s0\t\t\t\t\t\\n\\t\"\t//r0 = s0\r\n\t::: \"d0\", \"d1\"\r\n\t);\r\n#else\r\n\treturn ldexpf_c(m,e);\r\n#endif\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_log10f.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nBased on: \r\n\r\n\t\tlog10(x) = log10((1+m) * (2^n))\r\n\t\tlog(x) = n * log10(2) + log10(1 + m)\r\n\t\tlog(1+m) = Poly(1+m)\r\n\t\t\r\n\t\twhere Poly(x) is the Minimax approximation of log10(x) over the \r\n\t\trange [1, 2]\r\n\r\nTest func : log10f(x)\r\nTest Range: 1 < x < 10000\r\nPeak Error:\t~0.000040%\r\nRMS  Error: ~0.000008%\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __log10f_rng =  0.3010299957f;\r\n\r\nconst float __log10f_lut[8] = {\r\n\t-0.99697286229624, \t\t//p0\r\n\t-1.07301643912502, \t\t//p4\r\n\t-2.46980061535534, \t\t//p2\r\n\t-0.07176870463131, \t\t//p6\r\n\t2.247870219989470, \t\t//p1\r\n\t0.366547581117400, \t\t//p5\r\n\t1.991005185100089, \t\t//p3\r\n\t0.006135635201050,\t\t//p7\r\n};\r\n\r\nfloat log10f_c(float x)\r\n{\r\n\tfloat a, b, c, d, xx;\r\n\tint m;\r\n\t\r\n\tunion {\r\n\t\tfloat   f;\r\n\t\tint \ti;\r\n\t} r;\r\n\t\r\n\t//extract exponent\r\n\tr.f = x;\r\n\tm = (r.i >> 23);\r\n\tm = m - 127;\r\n\tr.i = r.i - (m << 23);\r\n\t\t\r\n\t//Taylor Polynomial (Estrins)\r\n\txx = r.f * r.f;\r\n\ta = (__log10f_lut[4] * r.f) + (__log10f_lut[0]);\r\n\tb = (__log10f_lut[6] * r.f) + (__log10f_lut[2]);\r\n\tc = (__log10f_lut[5] * r.f) + (__log10f_lut[1]);\r\n\td = (__log10f_lut[7] * r.f) + (__log10f_lut[3]);\r\n\ta = a + b * xx;\r\n\tc = c + d * xx;\r\n\txx = xx * xx;\r\n\tr.f = a + c * xx;\r\n\r\n\t//add exponent\r\n\tr.f = r.f + ((float) m) * __log10f_rng;\r\n\r\n\treturn r.f;\r\n}\r\n\r\nfloat log10f_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\r\n\t\"vdup.f32\t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x,x};\r\n\t\r\n\t//extract exponent\r\n\t\"vmov.i32\t\td2, #127\t\t\t\t\\n\\t\"\t//d2 = 127;\r\n\t\"vshr.u32\t\td6, d0, #23\t\t\t\t\\n\\t\"\t//d6 = d0 >> 23;\r\n\t\"vsub.i32\t\td6, d6, d2\t\t\t\t\\n\\t\"\t//d6 = d6 - d2;\r\n\t\"vshl.u32\t\td1, d6, #23\t\t\t\t\\n\\t\"\t//d1 = d6 << 23;\r\n\t\"vsub.i32\t\td0, d0, d1\t\t\t\t\\n\\t\"\t//d0 = d0 + d1;\r\n\r\n\t//polynomial:\r\n\t\"vmul.f32 \t\td1, d0, d0\t\t\t\t\\n\\t\"\t//d1 = d0*d0 = {x^2, x^2}\t\r\n\t\"vld1.32 \t\t{d2, d3, d4, d5}, [%1]\t\\n\\t\"\t//q1 = {p0, p4, p2, p6}, q2 = {p1, p5, p3, p7} ;\r\n\t\"vmla.f32 \t\tq1, q2, d0[0]\t\t\t\\n\\t\"\t//q1 = q1 + q2 * d0[0]\t\t\r\n\t\"vmla.f32 \t\td2, d3, d1[0]\t\t\t\\n\\t\"\t//d2 = d2 + d3 * d1[0]\t\t\r\n\t\"vmul.f32 \t\td1, d1, d1\t\t\t\t\\n\\t\"\t//d1 = d1 * d1 = {x^4, x^4}\t\r\n\t\"vmla.f32 \t\td2, d1, d2[1]\t\t\t\\n\\t\"\t//d2 = d2 + d1 * d2[1]\t\t\r\n\r\n\t//add exponent \t\r\n\t\"vdup.32 \t\td7, %0\t\t\t\t\t\\n\\t\"\t//d7 = {rng, rng}\r\n\t\"vcvt.f32.s32 \td6, d6\t\t\t\t\t\\n\\t\"\t//d6 = (float) d6\r\n\t\"vmla.f32 \t\td2, d6, d7\t\t\t\t\\n\\t\"\t//d2 = d2 + d6 * d7\t\t\r\n\r\n\t\"vmov.f32 \t\ts0, s4\t\t\t\t\t\\n\\t\"\t//s0 = s4\r\n\r\n\t:: \"r\"(__log10f_rng), \"r\"(__log10f_lut) \r\n    : \"d0\", \"d1\", \"q1\", \"q2\", \"d6\", \"d7\"\r\n\t);\r\n#endif\r\n}\r\n\r\n\r\nfloat log10f_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tlog10f_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn log10f_c(x);\r\n#endif\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_logf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nBased on: \r\n\r\n\t\tlog(x) = log((1+m) * (2^n))\r\n\t\tlog(x) = n * log(2) + log(1 + m)\r\n\t\tlog(1+m) = Poly(1+m)\r\n\t\t\r\n\t\twhere Poly(x) is the Minimax approximation of log(x) over the \r\n\t\trange [1, 2]\r\n\r\nTest func : logf(x)\r\nTest Range: 1 < x < 10000\r\nPeak Error:\t~0.000601%\r\nRMS  Error: ~0.000005%\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __logf_rng =  0.693147180f;\r\n\r\nconst float __logf_lut[8] = {\r\n\t-2.295614848256274, \t//p0\r\n\t-2.470711633419806, \t//p4\r\n\t-5.686926051100417, \t//p2\r\n\t-0.165253547131978, \t//p6\r\n\t+5.175912446351073, \t//p1\r\n\t+0.844006986174912, \t//p5\r\n\t+4.584458825456749, \t//p3\r\n\t+0.014127821926000\t\t//p7\r\n};\r\n\r\nfloat logf_c(float x)\r\n{\r\n\tfloat a, b, c, d, xx;\r\n\tint m;\r\n\t\r\n\tunion {\r\n\t\tfloat   f;\r\n\t\tint \ti;\r\n\t} r;\r\n\t\r\n\t//extract exponent\r\n\tr.f = x;\r\n\tm = (r.i >> 23);\r\n\tm = m - 127;\r\n\tr.i = r.i - (m << 23);\r\n\t\t\r\n\t//Taylor Polynomial (Estrins)\r\n\txx = r.f * r.f;\r\n\ta = (__logf_lut[4] * r.f) + (__logf_lut[0]);\r\n\tb = (__logf_lut[6] * r.f) + (__logf_lut[2]);\r\n\tc = (__logf_lut[5] * r.f) + (__logf_lut[1]);\r\n\td = (__logf_lut[7] * r.f) + (__logf_lut[3]);\r\n\ta = a + b * xx;\r\n\tc = c + d * xx;\r\n\txx = xx * xx;\r\n\tr.f = a + c * xx;\r\n\r\n\t//add exponent\r\n\tr.f = r.f + ((float) m) * __logf_rng;\r\n\r\n\treturn r.f;\r\n}\r\n\r\nfloat logf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\r\n\t\"vdup.f32\t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x,x};\r\n\t\r\n\t//extract exponent\r\n\t\"vmov.i32\t\td2, #127\t\t\t\t\\n\\t\"\t//d2 = 127;\r\n\t\"vshr.u32\t\td6, d0, #23\t\t\t\t\\n\\t\"\t//d6 = d0 >> 23;\r\n\t\"vsub.i32\t\td6, d6, d2\t\t\t\t\\n\\t\"\t//d6 = d6 - d2;\r\n\t\"vshl.u32\t\td1, d6, #23\t\t\t\t\\n\\t\"\t//d1 = d6 << 23;\r\n\t\"vsub.i32\t\td0, d0, d1\t\t\t\t\\n\\t\"\t//d0 = d0 + d1;\r\n\r\n\t//polynomial:\r\n\t\"vmul.f32 \t\td1, d0, d0\t\t\t\t\\n\\t\"\t//d1 = d0*d0 = {x^2, x^2}\t\r\n\t\"vld1.32 \t\t{d2, d3, d4, d5}, [%1]\t\\n\\t\"\t//q1 = {p0, p4, p2, p6}, q2 = {p1, p5, p3, p7} ;\r\n\t\"vmla.f32 \t\tq1, q2, d0[0]\t\t\t\\n\\t\"\t//q1 = q1 + q2 * d0[0]\t\t\r\n\t\"vmla.f32 \t\td2, d3, d1[0]\t\t\t\\n\\t\"\t//d2 = d2 + d3 * d1[0]\t\t\r\n\t\"vmul.f32 \t\td1, d1, d1\t\t\t\t\\n\\t\"\t//d1 = d1 * d1 = {x^4, x^4}\t\r\n\t\"vmla.f32 \t\td2, d1, d2[1]\t\t\t\\n\\t\"\t//d2 = d2 + d1 * d2[1]\t\t\r\n\r\n\t//add exponent \t\r\n\t\"vdup.32 \t\td7, %0\t\t\t\t\t\\n\\t\"\t//d7 = {rng, rng}\r\n\t\"vcvt.f32.s32 \td6, d6\t\t\t\t\t\\n\\t\"\t//d6 = (float) d6\r\n\t\"vmla.f32 \t\td2, d6, d7\t\t\t\t\\n\\t\"\t//d2 = d2 + d6 * d7\t\t\r\n\r\n\t\"vmov.f32 \t\ts0, s4\t\t\t\t\t\\n\\t\"\t//s0 = s4\r\n\r\n\t:: \"r\"(__logf_rng), \"r\"(__logf_lut) \r\n    : \"d0\", \"d1\", \"q1\", \"q2\", \"d6\", \"d7\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat logf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tlogf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn logf_c(x);\r\n#endif\r\n};\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_mat2.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nMatrices are specified in column major format:\r\n\r\n| a c |\r\n| b d |\r\n\r\ntherefore m[2] = c\r\n*/\r\n\r\n#include \"math_neon.h\"\r\n\r\n//matrix matrix multipication. d = m0 * m1;\r\nvoid\r\nmatmul2_c(float m0[4], float m1[4], float d[4])\r\n{\t\r\n\td[0] = m0[0]*m1[0] + m0[2]*m1[1];\t\r\n\td[1] = m0[1]*m1[0] + m0[3]*m1[1];\r\n\td[2] = m0[0]*m1[2] + m0[2]*m1[3];\r\n\td[3] = m0[1]*m1[2] + m0[3]*m1[3];\r\n}\r\n\r\nvoid\r\nmatmul2_neon(float m0[4], float m1[4], float d[4])\r\n{\t\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d0, d1}, [%0]\t\t\t\\n\\t\"\t//Q1 = m0\r\n\t\"vld1.32 \t\t{d2, d3}, [%1]\t\t\t\\n\\t\"\t//Q2 = m1\r\n\t\r\n\t\"vmul.f32 \t\td4, d0, d2[0]\t\t\t\\n\\t\"\t//D4 = D0*D2[0]\r\n\t\"vmul.f32 \t\td5, d0, d3[0]\t\t\t\\n\\t\"\t//D5 = D0*D3[0]\r\n\t\"vmla.f32 \t\td4, d1, d2[1]\t\t\t\\n\\t\"\t//D4 += D1*D2[1]\r\n\t\"vmla.f32 \t\td5, d1, d3[1]\t\t\t\\n\\t\"\t//D5 += D1*D3[1]\r\n\t\r\n\t\"vst1.32 \t\t{d4, d5}, [%2] \t\t\t\\n\\t\"\t//Q4 = m+12\t\r\n\t:: \"r\"(m0), \"r\"(m1), \"r\"(d) \r\n    : \"q0\", \"q1\", \"q2\", \"memory\"\r\n\t);\t\r\n#else\r\n\tmatmul2_c(m0, m1, d);\r\n#endif\r\n}\r\n\r\n\r\n//matrix vector multiplication. d = m * v\r\nvoid\r\nmatvec2_c(float m[4], float v[2], float d[2])\r\n{\r\n\td[0] = m[0]*v[0] + m[2]*v[1];\r\n\td[1] = m[1]*v[0] + m[3]*v[1];\r\n}\r\n\r\nvoid\r\nmatvec2_neon(float m[4], float v[2], float d[2])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32        d0, [%1]\t\t\t\t\\n\\t\"\t//d0 = v\r\n\t\"vld1.32 \t\t{d1, d2}, [%0]\t\t\t\\n\\t\"\t//Q1 = m\r\n\t\r\n\t\"vmul.f32 \t\td3, d1, d0[0]\t\t\t\\n\\t\"\t//Q5 = Q1*d0[0]\r\n\t\"vmla.f32 \t\td3, d2, d0[1]\t\t\t\\n\\t\"\t//Q5 += Q1*d0[1] \r\n\t\r\n\t\"vst1.32 \t\td3, [%2] \t\t\t\t\\n\\t\"\t//Q4 = m+12\t\r\n\t:: \"r\"(m), \"r\"(v), \"r\"(d) \r\n    : \"d0\", \"d1\", \"d2\",\"d3\", \"memory\"\r\n\t);\t\r\n#else\r\n\tmatvec2_c(m, v, d);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_mat3.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nMatrices are specified in row major format:\r\n\r\n| x0 x2 |\r\n| x1 x3 |\r\n\r\ntherefore m[2] = x2\r\n\r\n*/\r\n\r\n#include \"math_neon.h\"\r\n\r\n//matrix matrix multipication. d = m0 * m1;\r\nvoid\r\nmatmul3_c(float m0[9], float m1[9], float d[9])\r\n{\r\n\td[0] = m0[0]*m1[0] + m0[3]*m1[1] + m0[6]*m1[2];\r\n\td[1] = m0[1]*m1[0] + m0[4]*m1[1] + m0[7]*m1[2];\r\n\td[2] = m0[2]*m1[0] + m0[5]*m1[1] + m0[8]*m1[2];\r\n\td[3] = m0[0]*m1[3] + m0[3]*m1[4] + m0[6]*m1[5];\r\n\td[4] = m0[1]*m1[3] + m0[4]*m1[4] + m0[7]*m1[5];\r\n\td[5] = m0[2]*m1[3] + m0[5]*m1[4] + m0[8]*m1[5];\r\n\td[6] = m0[0]*m1[6] + m0[3]*m1[7] + m0[6]*m1[8];\r\n\td[7] = m0[1]*m1[6] + m0[4]*m1[7] + m0[7]*m1[8];\r\n\td[8] = m0[2]*m1[6] + m0[5]*m1[7] + m0[8]*m1[8];\r\n}\r\n\r\nvoid \r\nmatmul3_neon(float m0[9], float m1[9], float d[9])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d0, d1}, [%1]!\t\t\t\\n\\t\"\t//q0 = m1\r\n\t\"vld1.32 \t\t{d2, d3}, [%1]!\t\t\t\\n\\t\"\t//q1 = m1+4\r\n\t\"flds \t\t\ts8, [%1]\t\t\t\t\\n\\t\"\t//q2 = m1+8\r\n\t\r\n\t\"vld1.32 \t\t{d6, d7}, [%0]\t\t\t\\n\\t\"\t//q3[0] = m0\r\n\t\"add \t\t\t%0, %0, #12\t\t\t\t\\n\\t\"\t//q3[0] = m0\r\n\t\"vld1.32 \t\t{d8, d9}, [%0]\t\t\t\\n\\t\"\t//q4[0] = m0+12\r\n\t\"add \t\t\t%0, %0, #12\t\t\t\t\\n\\t\"\t//q3[0] = m0\r\n\t\"vld1.32 \t\t{d10}, [%0]\t\t\t\t\\n\\t\"\t//q5[0] = m0+24\r\n\t\"add \t\t\t%0, %0, #8\t\t\t\t\\n\\t\"\t//q3[0] = m0\r\n\t\"flds \t\t\ts22, [%0]\t\t\t\t\\n\\t\"\t//q2 = m1+8\r\n\t\r\n\t\"vmul.f32 \t\tq6, q3, d0[0] \t\t\t\\n\\t\"\t//q12 = q3 * d0[0]\r\n\t\"vmul.f32 \t\tq7, q3, d1[1] \t\t\t\\n\\t\"\t//q13 = q3 * d2[0]\r\n\t\"vmul.f32 \t\tq8, q3, d3[0] \t\t\t\\n\\t\"\t//q14 = q3 * d4[0]\r\n\t\"vmla.f32 \t\tq6, q4, d0[1] \t\t\t\\n\\t\"\t//q12 = q9 * d0[1]\r\n\t\"vmla.f32 \t\tq7, q4, d2[0] \t\t\t\\n\\t\"\t//q13 = q9 * d2[1]\r\n\t\"vmla.f32 \t\tq8, q4, d3[1] \t\t\t\\n\\t\"\t//q14 = q9 * d4[1]\r\n\t\"vmla.f32 \t\tq6, q5, d1[0] \t\t\t\\n\\t\"\t//q12 = q10 * d0[0]\r\n\t\"vmla.f32 \t\tq7, q5, d2[1] \t\t\t\\n\\t\"\t//q13 = q10 * d2[0]\r\n\t\"vmla.f32 \t\tq8, q5, d4[0] \t\t\t\\n\\t\"\t//q14 = q10 * d4[0]\r\n\r\n\t\"vmov.f32 \t\tq0, q8 \t\t\t\t\t\\n\\t\"\t//q14 = q10 * d4[0]\r\n\t\"vst1.32 \t\t{d12, d13}, [%2] \t\t\\n\\t\"\t//d = q12\r\n\t\"add \t\t\t%2, %2, #12\t\t\t\t\\n\\t\"\t//q3[0] = m0\r\n\t\"vst1.32 \t\t{d14, d15}, [%2] \t\t\\n\\t\"\t//d+4 = q13\t\r\n\t\"add \t\t\t%2, %2, #12\t\t\t\t\\n\\t\"\t//q3[0] = m0\r\n\t\"vst1.32 \t\t{d0}, [%2] \t\t\t\t\\n\\t\"\t//d+8 = q14\t\r\n\t\"add \t\t\t%2, %2, #8\t\t\t\t\\n\\t\"\t//q3[0] = m0\r\n\t\"fsts \t\t\ts2, [%2] \t\t\t\t\\n\\t\"\t//d = q12\t\r\n\t\r\n\t: \"+r\"(m0), \"+r\"(m1), \"+r\"(d): \r\n    : \"d8\", \"d9\", \"d10\", \"d11\", \"d12\", \"d13\", \"d14\", \"d15\", \"memory\"\r\n\t);\t\r\n#else\r\n\tmatmul3_c(m0, m1, d);\r\n#endif\r\n};\r\n\r\n//matrix vector multiplication. d = m * v\r\nvoid\r\nmatvec3_c(float m[9], float v[3], float d[3])\r\n{\r\n\td[0] = m[0]*v[0] + m[3]*v[1] + m[6]*v[2];\r\n\td[1] = m[1]*v[0] + m[4]*v[1] + m[7]*v[2];\r\n\td[2] = m[2]*v[0] + m[5]*v[1] + m[8]*v[2];\r\n}\r\n\r\nvoid\r\nmatvec3_neon(float m[9], float v[3], float d[3])\r\n{\r\n#ifdef __MATH_NEON\r\n\tint tmp;\r\n\tasm volatile (\r\n\t\"mov \t\t\t%3, #12\t\t\t\t\t\\n\\t\"\t//r3 = 12\r\n\t\"vld1.32 \t\t{d0, d1}, [%1]\t\t\t\\n\\t\"\t//Q0 = v\r\n\t\"vld1.32 \t\t{d2, d3}, [%0], %3\t\t\\n\\t\"\t//Q1 = m\r\n\t\"vld1.32 \t\t{d4, d5}, [%0], %3\t\t\\n\\t\"\t//Q2 = m+12\r\n\t\"vld1.32 \t\t{d6, d7}, [%0], %3\t\t\\n\\t\"\t//Q3 = m+24\r\n\t\r\n\t\"vmul.f32 \t\tq9, q1, d0[0]\t\t\t\\n\\t\"\t//Q9 = Q1*Q0[0]\r\n\t\"vmla.f32 \t\tq9, q2, d0[1]\t\t\t\\n\\t\"\t//Q9 += Q2*Q0[1] \r\n\t\"vmla.f32 \t\tq9, q3, d1[0]\t\t\t\\n\\t\"\t//Q9 += Q3*Q0[2] \r\n\t\"vmov.f32 \t\tq0, q9\t\t\t\t\t\\n\\t\"\t//Q0 = q9\r\n\t\r\n\t\"vst1.32 \t\td0, [%2]! \t\t\t\t\\n\\t\"\t//r2 = D24\t\r\n\t\"fsts \t\t\ts2, [%2] \t\t\t\t\\n\\t\"\t//r2 = D25[0]\t\r\n\r\n\t: \"+r\"(m), \"+r\"(v), \"+r\"(d), \"+r\"(tmp):\r\n    : \"q0\", \"q9\", \"q10\",\"q11\", \"q12\", \"q13\", \"memory\"\r\n\t);\t\r\n#else\r\n\tmatvec3_c(m, v, d);\r\n#endif\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_mat4.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nMatrices are specified in row major format:\r\n\r\n| x0 x2 |\r\n| x1 x3 |\r\n\r\ntherefore m[2] = x2\r\n\r\n*/\r\n\r\n#include \"math_neon.h\"\r\n\r\n//matrix matrix multipication. d = m0 * m1;\r\nvoid\r\nmatmul4_c(float m0[16], float m1[16], float d[16])\r\n{\r\n\td[0] = m0[0]*m1[0] + m0[4]*m1[1] + m0[8]*m1[2] + m0[12]*m1[3];\r\n\td[1] = m0[1]*m1[0] + m0[5]*m1[1] + m0[9]*m1[2] + m0[13]*m1[3];\r\n\td[2] = m0[2]*m1[0] + m0[6]*m1[1] + m0[10]*m1[2] + m0[14]*m1[3];\r\n\td[3] = m0[3]*m1[0] + m0[7]*m1[1] + m0[11]*m1[2] + m0[15]*m1[3];\r\n\td[4] = m0[0]*m1[4] + m0[4]*m1[5] + m0[8]*m1[6] + m0[12]*m1[7];\r\n\td[5] = m0[1]*m1[4] + m0[5]*m1[5] + m0[9]*m1[6] + m0[13]*m1[7];\r\n\td[6] = m0[2]*m1[4] + m0[6]*m1[5] + m0[10]*m1[6] + m0[14]*m1[7];\r\n\td[7] = m0[3]*m1[4] + m0[7]*m1[5] + m0[11]*m1[6] + m0[15]*m1[7];\r\n\td[8] = m0[0]*m1[8] + m0[4]*m1[9] + m0[8]*m1[10] + m0[12]*m1[11];\r\n\td[9] = m0[1]*m1[8] + m0[5]*m1[9] + m0[9]*m1[10] + m0[13]*m1[11];\r\n\td[10] = m0[2]*m1[8] + m0[6]*m1[9] + m0[10]*m1[10] + m0[14]*m1[11];\r\n\td[11] = m0[3]*m1[8] + m0[7]*m1[9] + m0[11]*m1[10] + m0[15]*m1[11];\r\n\td[12] = m0[0]*m1[12] + m0[4]*m1[13] + m0[8]*m1[14] + m0[12]*m1[15];\r\n\td[13] = m0[1]*m1[12] + m0[5]*m1[13] + m0[9]*m1[14] + m0[13]*m1[15];\r\n\td[14] = m0[2]*m1[12] + m0[6]*m1[13] + m0[10]*m1[14] + m0[14]*m1[15];\r\n\td[15] = m0[3]*m1[12] + m0[7]*m1[13] + m0[11]*m1[14] + m0[15]*m1[15];\r\n}\r\n\r\nvoid \r\nmatmul4_neon(float m0[16], float m1[16], float d[16])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d0, d1}, [%1]!\t\t\t\\n\\t\"\t//q0 = m1\r\n\t\"vld1.32 \t\t{d2, d3}, [%1]!\t\t\t\\n\\t\"\t//q1 = m1+4\r\n\t\"vld1.32 \t\t{d4, d5}, [%1]!\t\t\t\\n\\t\"\t//q2 = m1+8\r\n\t\"vld1.32 \t\t{d6, d7}, [%1]\t\t\t\\n\\t\"\t//q3 = m1+12\r\n\t\"vld1.32 \t\t{d16, d17}, [%0]!\t\t\\n\\t\"\t//q8 = m0\r\n\t\"vld1.32 \t\t{d18, d19}, [%0]!\t\t\\n\\t\"\t//q9 = m0+4\r\n\t\"vld1.32 \t\t{d20, d21}, [%0]!\t\t\\n\\t\"\t//q10 = m0+8\r\n\t\"vld1.32 \t\t{d22, d23}, [%0]\t\t\\n\\t\"\t//q11 = m0+12\r\n\r\n\t\"vmul.f32 \t\tq12, q8, d0[0] \t\t\t\\n\\t\"\t//q12 = q8 * d0[0]\r\n\t\"vmul.f32 \t\tq13, q8, d2[0] \t\t\t\\n\\t\"\t//q13 = q8 * d2[0]\r\n\t\"vmul.f32 \t\tq14, q8, d4[0] \t\t\t\\n\\t\"\t//q14 = q8 * d4[0]\r\n\t\"vmul.f32 \t\tq15, q8, d6[0]\t \t\t\\n\\t\"\t//q15 = q8 * d6[0]\r\n\t\"vmla.f32 \t\tq12, q9, d0[1] \t\t\t\\n\\t\"\t//q12 = q9 * d0[1]\r\n\t\"vmla.f32 \t\tq13, q9, d2[1] \t\t\t\\n\\t\"\t//q13 = q9 * d2[1]\r\n\t\"vmla.f32 \t\tq14, q9, d4[1] \t\t\t\\n\\t\"\t//q14 = q9 * d4[1]\r\n\t\"vmla.f32 \t\tq15, q9, d6[1] \t\t\t\\n\\t\"\t//q15 = q9 * d6[1]\r\n\t\"vmla.f32 \t\tq12, q10, d1[0] \t\t\\n\\t\"\t//q12 = q10 * d0[0]\r\n\t\"vmla.f32 \t\tq13, q10, d3[0] \t\t\\n\\t\"\t//q13 = q10 * d2[0]\r\n\t\"vmla.f32 \t\tq14, q10, d5[0] \t\t\\n\\t\"\t//q14 = q10 * d4[0]\r\n\t\"vmla.f32 \t\tq15, q10, d7[0] \t\t\\n\\t\"\t//q15 = q10 * d6[0]\r\n\t\"vmla.f32 \t\tq12, q11, d1[1] \t\t\\n\\t\"\t//q12 = q11 * d0[1]\r\n\t\"vmla.f32 \t\tq13, q11, d3[1] \t\t\\n\\t\"\t//q13 = q11 * d2[1]\r\n\t\"vmla.f32 \t\tq14, q11, d5[1] \t\t\\n\\t\"\t//q14 = q11 * d4[1]\r\n\t\"vmla.f32 \t\tq15, q11, d7[1]\t \t\t\\n\\t\"\t//q15 = q11 * d6[1]\r\n\r\n\t\"vst1.32 \t\t{d24, d25}, [%2]! \t\t\\n\\t\"\t//d = q12\t\r\n\t\"vst1.32 \t\t{d26, d27}, [%2]!\t\t\\n\\t\"\t//d+4 = q13\t\r\n\t\"vst1.32 \t\t{d28, d29}, [%2]! \t\t\\n\\t\"\t//d+8 = q14\t\r\n\t\"vst1.32 \t\t{d30, d31}, [%2]\t \t\\n\\t\"\t//d+12 = q15\t\r\n\r\n\t: \"+r\"(m0), \"+r\"(m1), \"+r\"(d) : \r\n    : \"q0\", \"q1\", \"q2\", \"q3\", \"q8\", \"q9\", \"q10\", \"q11\", \"q12\", \"q13\", \"q14\", \"q15\",\r\n\t\"memory\"\r\n\t);\t\r\n#else\r\n\tmatmul4_c(m0, m1, d);\r\n#endif\r\n}\r\n\r\n\r\n//matrix vector multiplication. d = m * v\r\nvoid\r\nmatvec4_c(float m[16], float v[4], float d[4])\r\n{\r\n\td[0] = m[0]*v[0] + m[4]*v[1] + m[8]*v[2] + m[12]*v[3];\r\n\td[1] = m[1]*v[0] + m[5]*v[1] + m[9]*v[2] + m[13]*v[3];\r\n\td[2] = m[2]*v[0] + m[6]*v[1] + m[10]*v[2] + m[14]*v[3];\r\n\td[3] = m[3]*v[0] + m[7]*v[1] + m[11]*v[2] + m[15]*v[3];\r\n}\r\n\r\nvoid\r\nmatvec4_neon(float m[16], float v[4], float d[4])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d0, d1}, [%1]\t\t\t\\n\\t\"\t//Q0 = v\r\n\t\"vld1.32 \t\t{d18, d19}, [%0]!\t\t\\n\\t\"\t//Q1 = m\r\n\t\"vld1.32 \t\t{d20, d21}, [%0]!\t\t\\n\\t\"\t//Q2 = m+4\r\n\t\"vld1.32 \t\t{d22, d23}, [%0]!\t\t\\n\\t\"\t//Q3 = m+8\r\n\t\"vld1.32 \t\t{d24, d25}, [%0]!\t\t\\n\\t\"\t//Q4 = m+12\t\r\n\t\r\n\t\"vmul.f32 \t\tq13, q9, d0[0]\t\t\t\\n\\t\"\t//Q5 = Q1*Q0[0]\r\n\t\"vmla.f32 \t\tq13, q10, d0[1]\t\t\t\\n\\t\"\t//Q5 += Q1*Q0[1] \r\n\t\"vmla.f32 \t\tq13, q11, d1[0]\t\t\t\\n\\t\"\t//Q5 += Q2*Q0[2] \r\n\t\"vmla.f32 \t\tq13, q12, d1[1]\t\t\t\\n\\t\"\t//Q5 += Q3*Q0[3]\r\n\t\r\n\t\"vst1.32 \t\t{d26, d27}, [%2] \t\t\\n\\t\"\t//Q4 = m+12\t\r\n\t: \r\n\t: \"r\"(m), \"r\"(v), \"r\"(d) \r\n    : \"q0\", \"q9\", \"q10\",\"q11\", \"q12\", \"q13\", \"memory\"\r\n\t);\t\r\n#else\r\n\tmatvec4_c(m, v, d);\r\n#endif\r\n}\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_modf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nAssumes the floating point value |x| < 2,147,483,648\r\n*/\r\n\r\n#include \"math_neon.h\"\r\n\r\nfloat modf_c(float x, int *i)\r\n{\r\n\tint n;\r\n\tn = (int)x;\r\n\t*i = n;\r\n\tx = x - (float)n;\r\n\treturn x;\r\n}\r\n\r\n\r\nfloat modf_neon_hfp(float x, int *i)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\t\r\n\t\"vcvt.s32.f32\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = (int) d0; \r\n\t\"vcvt.f32.s32\td2, d1\t\t\t\t\t\\n\\t\"\t//d2 = (float) d1;\r\n\t\"vsub.f32\t\td0, d0, d2\t\t\t\t\\n\\t\"\t//d0 = d0 - d2; \r\n\t\"vstr.i32\t\ts2, [r0]\t\t\t\t\\n\\t\"\t//[r0] = d1[0] \r\n\t::: \"d0\", \"d1\", \"d2\"\r\n\t);\t\t\r\n#endif\r\n}\r\n\r\n\r\nfloat modf_neon_sfp(float x, int *i)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vdup.f32 \t\td0, r0\t\t\t\t\t\\n\\t\"\t//d0 = {x, x}\t\r\n\t\"vcvt.s32.f32\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = (int) d0; \r\n\t\"vcvt.f32.s32\td2, d1\t\t\t\t\t\\n\\t\"\t//d2 = (float) d1;\r\n\t\"vsub.f32\t\td0, d0, d2\t\t\t\t\\n\\t\"\t//d0 = d0 - d2; \r\n\t\"vstr.i32\t\ts2, [r1]\t\t\t\t\\n\\t\"\t//[r0] = d1[0] \r\n\t\"vmov.f32 \t\tr0, s0\t\t\t\t\t\\n\\t\"\t//r0 = d0[0];\r\n\t::: \"d0\", \"d1\", \"d2\"\r\n\t);\r\n\t\t\r\n#else\r\n\treturn modf_c(x, i);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_neon.h",
    "content": "/*\nMath-NEON:  Neon Optimised Math Library based on cmath\nContact:    lachlan.ts@gmail.com\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\n\nThis library is free software; you can redistribute it and/or\nmodify it under the terms of the GNU Lesser General Public\nLicense as published by the Free Software Foundation; either\nversion 3 of the License, or (at your option) any later version.\n\nThis library is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nLesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public\nLicense along with this library; if not, write to the Free\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n*/\n\n#ifndef __MATH_NEON_H__ \n#define __MATH_NEON_H__ \n\n#if !defined(__i386__) && defined(__arm__)\n//if defined neon ASM routines are used, otherwise all calls to *_neon \n//functions are rerouted to their equivalent *_c function.\n#define __MATH_NEON\t\t\t\n\n//Default Floating Point value ABI: 0=softfp, 1=hardfp. Only effects *_neon routines.\n//You can access the hardfp versions directly via the *_hard suffix. \n//You can access the softfp versions directly via the *_soft suffix. \n#define __MATH_FPABI \t1\t\n\n#endif\n\n#ifdef GCC\n#define ALIGN(A) __attribute__ ((aligned (A))\n#else\n#define ALIGN(A)\n#endif\n\n#ifndef _MATH_H\n#define M_PI\t\t3.14159265358979323846\t/* pi */\n#define M_PI_2\t\t1.57079632679489661923\t/* pi/2 */\n#define M_PI_4\t\t0.78539816339744830962\t/* pi/4 */\n#define M_E\t\t\t2.7182818284590452354\t/* e */\n#define M_LOG2E\t\t1.4426950408889634074\t/* log_2 e */\n#define M_LOG10E\t0.43429448190325182765\t/* log_10 e */\n#define M_LN2\t\t0.69314718055994530942\t/* log_e 2 */\n#define M_LN10\t\t2.30258509299404568402\t/* log_e 10 */\n#define M_1_PI\t\t0.31830988618379067154\t/* 1/pi */\n#define M_2_PI\t\t0.63661977236758134308\t/* 2/pi */\n#define M_2_SQRTPI\t1.12837916709551257390\t/* 2/sqrt(pi) */\n#define M_SQRT2\t\t1.41421356237309504880\t/* sqrt(2) */\n#define M_SQRT1_2\t0.70710678118654752440\t/* 1/sqrt(2) */\n#endif \n\n#if __MATH_FPABI == 1\n#define sinf_neon\t\tsinf_neon_hfp\n#define cosf_neon\t\tcosf_neon_hfp\n#define\tsincosf_neon\tsincosf_neon_hfp\n#define tanf_neon\t\ttanf_neon_hfp\n#define atanf_neon\t\tatanf_neon_hfp\n#define atan2f_neon\t\tatan2f_neon_hfp\n#define asinf_neon\t\tasinf_neon_hfp\n#define acosf_neon\t\tacosf_neon_hfp\n#define sinhf_neon\t\tsinhf_neon_hfp\n#define coshf_neon\t\tcoshf_neon_hfp\n#define tanhf_neon\t\ttanhf_neon_hfp\n#define expf_neon\t\texpf_neon_hfp\n#define logf_neon\t\tlogf_neon_hfp\n#define log10f_neon\t\tlog10f_neon_hfp\n#define powf_neon\t\tpowf_neon_hfp\n#define floorf_neon\t\tfloorf_neon_hfp\n#define ceilf_neon\t\tceilf_neon_hfp\n#define fabsf_neon\t\tfabsf_neon_hfp\n#define ldexpf_neon\t\tldexpf_neon_hfp\n#define frexpf_neon\t\tfrexpf_neon_hfp\n#define fmodf_neon\t\tfmodf_neon_hfp\n#define modf_neon\t\tmodf_neon_hfp\n#define sqrtf_neon\t\tsqrtf_neon_hfp\n#define invsqrtf_neon\tinvsqrtf_neon_hfp\n#else\n#define sinf_neon\t\tsinf_neon_sfp\n#define cosf_neon\t\tcosf_neon_sfp\n#define\tsincosf_neon\tsincosf_neon_sfp\n#define tanf_neon\t\ttanf_neon_sfp\n#define atanf_neon\t\tatanf_neon_sfp\n#define atan2f_neon\t\tatan2f_neon_sfp\n#define asinf_neon\t\tasinf_neon_sfp\n#define acosf_neon\t\tacosf_neon_sfp\n#define sinhf_neon\t\tsinhf_neon_sfp\n#define coshf_neon\t\tcoshf_neon_sfp\n#define tanhf_neon\t\ttanhf_neon_sfp\n#define expf_neon\t\texpf_neon_sfp\n#define logf_neon\t\tlogf_neon_sfp\n#define log10f_neon\t\tlog10f_neon_sfp\n#define powf_neon\t\tpowf_neon_sfp\n#define floorf_neon\t\tfloorf_neon_sfp\n#define ceilf_neon\t\tceilf_neon_sfp\n#define fabsf_neon\t\tfabsf_neon_sfp\n#define ldexpf_neon\t\tldexpf_neon_sfp\n#define frexpf_neon\t\tfrexpf_neon_sfp\n#define fmodf_neon\t\tfmodf_neon_sfp\n#define modf_neon\t\tmodf_neon_sfp\n#define sqrtf_neon\t\tsqrtf_neon_sfp\n#define invsqrtf_neon\tinvsqrtf_neon_sfp\n\n#define dot2_neon\t\tdot2_neon_sfp\n#define dot3_neon\t\tdot3_neon_sfp\n#define dot4_neon\t\tdot4_neon_sfp\n#endif\n\n/* \nfunction:\tenable_runfast\n\t\t\tthis function enables the floating point runfast mode on the \n\t\t\tARM Cortex A8.  \t\n*/\nvoid\t\tenable_runfast();\n\n\nfloat dot2_c(float v0[2], float v1[2]);\nfloat dot2_neon(float v0[2], float v1[2]);\nfloat dot3_c(float v0[3], float v1[3]);\nfloat dot3_neon(float v0[3], float v1[3]);\n#if 0 //funky ifdef problem... figure out later\nfloat dot4_c(float v0[4], float v1[4]);\nfloat dot4_neon(float v0[4], float v1[4]);\n#endif\n\nvoid cross3_c(float v0[3], float v1[3], float d[3]);\nvoid cross3_neon(float v0[3], float v1[3], float d[3]);\n\nvoid normalize2_c(float v[2], float d[2]);\nvoid normalize2_neon(float v[2], float d[2]);\nvoid normalize3_c(float v[3], float d[3]);\nvoid normalize3_neon(float v[3], float d[3]);\nvoid normalize4_c(float v[4], float d[4]);\nvoid normalize4_neon(float v[4], float d[4]);\n\n/* \nfunction:\tmatmul2\narguments:  m0 2x2 matrix, m1 2x2 matrix\nreturn: \td 2x2 matrix\nexpression: d = m0 * m1\n*/\nvoid\t\tmatmul2_c(float m0[4], float m1[4], float d[4]);\nvoid\t\tmatmul2_neon(float m0[4], float m1[4], float d[4]);\n\n/* \nfunction:\tmatmul3\narguments:  m0 3x3 matrix, m1 3x3 matrix\nreturn: \td 3x3 matrix\nexpression: d = m0 * m1\n*/\nvoid\t\tmatmul3_c(float m0[9], float m1[9], float d[9]);\nvoid\t\tmatmul3_neon(float m0[9], float m1[9], float d[9]);\n\n/* \nfunction:\tmatmul4\narguments:  m0 4x4 matrix, m1 4x4 matrix\nreturn: \td 4x4 matrix\nexpression: d = m0 * m1\n*/\nvoid\t\tmatmul4_c(float m0[16], float m1[16], float d[16]);\nvoid\t\tmatmul4_neon(float m0[16], float m1[16], float d[16]);\n\\\n/* \nfunction:\tmatvec2\narguments:  m 2x2 matrix, v 2 element vector\nreturn: \td 2x2 matrix\nexpression: d = m * v\n*/\nvoid\t\tmatvec2_c(float m[4], float v[2], float d[2]);\nvoid\t\tmatvec2_neon(float m[4], float v[2], float d[2]);\n\n/* \nfunction:\tmatvec3\narguments:  m 3x3 matrix, v 3 element vector\nreturn: \td 3x3 matrix\nexpression: d = m * v\n*/\nvoid\t\tmatvec3_c(float m[9], float v[3], float d[3]);\nvoid\t\tmatvec3_neon(float m[9], float v[3], float d[3]);\n\n/* \nfunction:\tmatvec4\narguments:  m 4x4 matrix, v 4 element vector\nreturn: \td 4x4 matrix\nexpression: d = m * v\n*/\nvoid\t\tmatvec4_c(float m[16], float v[4], float d[4]);\nvoid\t\tmatvec4_neon(float m[16], float v[4], float d[4]);\n\n/* \nfunction:\tsinf\narguments:  x radians\nreturn: \tthe sine function evaluated at x radians.\t\nexpression: r = sin(x) \t\n*/\nfloat \t\tsinf_c(float x);\nfloat \t\tsinf_neon_hfp(float x);\nfloat \t\tsinf_neon_sfp(float x);\n\n/* \nfunction:\tcosf\narguments:  x radians\nreturn: \tthe cosine function evaluated at x radians.\t\nexpression: r = cos(x) \t\nnotes:\t\tcomputed using cos(x) = sin(x + pi/2)\n*/\nfloat \t\tcosf_c(float x);\nfloat \t\tcosf_neon_hfp(float x);\nfloat \t\tcosf_neon_sfp(float x);\n\n/* \nfunction:\tsincosf\narguments:  x radians, r[2] result array.\nreturn: \tboth the sine and the cosine evaluated at x radians.\t\nexpression: r = {sin(x), cos(x)} \t\nnotes:\t\tfaster than evaluating seperately.\n*/\nvoid\t\tsincosf_c(float x, float r[2]);\nvoid\t\tsincosf_neon_hfp(float x, float r[2]);\nvoid\t\tsincosf_neon_sfp(float x, float r[2]);\n\n/* \nfunction:\tsinfv\nreturn: \tthe sine function evaluated at x[i] radians \t\nexpression: r[i] = sin(x[i])\t\nnotes:\t\tfaster than evaluating individually.\n\t\t\tr and x can be the same memory location.\n*/\nvoid\t\tsinfv_c(float *x, int n, float *r);\nvoid  \t\tsinfv_neon(float *x, int n, float *r);\n\n/* \nfunction:\ttanf\nreturn: \tthe tangent evaluated at x radians.\t\nexpression: r = tan(x) \t\nnotes:\t\tcomputed using tan(x) = sin(x) / cos(x)\n*/\nfloat \t\ttanf_c(float x);\nfloat \t\ttanf_neon_hfp(float x);\nfloat \t\ttanf_neon_sfp(float x);\n\n/* \nfunction:\tatanf\nreturn: \tthe arctangent evaluated at x.\t\nexpression: r = atan(x) \t\n*/\nfloat \t\tatanf_c(float x);\nfloat \t\tatanf_neon_hfp(float x);\nfloat \t\tatanf_neon_sfp(float x);\n\n/* \nfunction:\tatanf\nreturn: \tthe arctangent evaluated at x.\t\nexpression: r = atan(x) \t\n*/\nfloat \t\tatan2f_c(float y, float x);\nfloat \t\tatan2f_neon_hfp(float y, float x);\nfloat \t\tatan2f_neon_sfp(float y, float x);\n\n/* \nfunction:\tasinf\nreturn: \tthe arcsine evaluated at x.\t\nexpression: r = asin(x) \t\n*/\nfloat \t\tasinf_c(float x);\nfloat \t\tasinf_neon_hfp(float x);\nfloat \t\tasinf_neon_sfp(float x);\n\n/* \nfunction:\tacosf\nreturn: \tthe arcsine evaluated at x.\t\nexpression: r = asin(x) \t\n*/\nfloat \t\tacosf_c(float x);\nfloat \t\tacosf_neon_hfp(float x);\nfloat \t\tacosf_neon_sfp(float x);\n\n/* \nfunction:\tsinhf\nreturn: \tthe arcsine evaluated at x.\t\nexpression: r = asin(x) \t\n*/\nfloat \t\tsinhf_c(float x);\nfloat \t\tsinhf_neon_hfp(float x);\nfloat \t\tsinhf_neon_sfp(float x);\n\n/* \nfunction:\tcoshf\nreturn: \tthe arcsine evaluated at x.\t\nexpression: r = asin(x) \t\n*/\nfloat \t\tcoshf_c(float x);\nfloat \t\tcoshf_neon_hfp(float x);\nfloat \t\tcoshf_neon_sfp(float x);\n\n/* \nfunction:\ttanhf\nreturn: \tthe arcsine evaluated at x.\t\nexpression: r = asin(x) \t\n*/\nfloat \t\ttanhf_c(float x);\nfloat \t\ttanhf_neon_hfp(float x);\nfloat \t\ttanhf_neon_sfp(float x);\n\n/* \nfunction:\texpf\nreturn: \tthe natural exponential evaluated at x.\t\nexpression: r = e ** x\t\n*/\nfloat \t\texpf_c(float x);\nfloat \t\texpf_neon_hfp(float x);\nfloat \t\texpf_neon_sfp(float x);\n\n/* \nfunction:\tlogf\nreturn: \tthe value of the natural logarithm of x.\t\nexpression: r = ln(x)\t\nnotes:\t\tassumes x > 0\n*/\nfloat \t\tlogf_c(float x);\nfloat \t\tlogf_neon_hfp(float x);\nfloat \t\tlogf_neon_sfp(float x);\n\n/* \nfunction:\tlog10f\nreturn: \tthe value of the power 10 logarithm of x.\t\nexpression: r = log10(x)\t\nnotes:\t\tassumes x > 0\n*/\nfloat \t\tlog10f_c(float x);\nfloat \t\tlog10f_neon_hfp(float x);\nfloat \t\tlog10f_neon_sfp(float x);\n\n/* \nfunction:\tpowf\nreturn: \tx raised to the power of n, x ** n.\nexpression: r = x ** y\t\nnotes:\t\tcomputed using e ** (y * ln(x))\n*/\nfloat \t\tpowf_c(float x, float n);\nfloat \t\tpowf_neon_sfp(float x, float n);\nfloat \t\tpowf_neon_hfp(float x, float n);\n\n/* \nfunction:\tfloorf\nreturn: \tx rounded down (towards negative infinity) to its nearest \n\t\t\tinteger value.\t\nnotes:\t\tassumes |x| < 2 ** 31\n*/\nfloat \t\tfloorf_c(float x);\nfloat \t\tfloorf_neon_sfp(float x);\nfloat \t\tfloorf_neon_hfp(float x);\n\n/* \nfunction:\tceilf\nreturn: \tx rounded up (towards positive infinity) to its nearest \n\t\t\tinteger value.\t\nnotes:\t\tassumes |x| < 2 ** 31\n*/\nfloat \t\tceilf_c(float x);\nfloat \t\tceilf_neon_hfp(float x);\nfloat \t\tceilf_neon_sfp(float x);\n\n/* \nfunction:\tfabsf\nreturn: \tabsolute vvalue of x\t\nnotes:\t\tassumes |x| < 2 ** 31\n*/\nfloat \t\tfabsf_c(float x);\nfloat \t\tfabsf_neon_hfp(float x);\nfloat \t\tfabsf_neon_sfp(float x);\n\n/* \nfunction:\tldexpf\nreturn: \tthe value of m multiplied by 2 to the power of e. \nexpression: r = m * (2 ** e)\n*/\nfloat \t\tldexpf_c(float m, int e);\nfloat \t\tldexpf_neon_hfp(float m, int e);\nfloat \t\tldexpf_neon_sfp(float m, int e);\n\n/* \nfunction:\tfrexpf\nreturn: \tthe exponent and mantissa of x \n*/\nfloat \t\tfrexpf_c(float x, int *e);\nfloat \t\tfrexpf_neon_hfp(float x, int *e);\nfloat \t\tfrexpf_neon_sfp(float x, int *e);\n\n/* \nfunction:\tfmodf\nreturn: \tthe remainder of x divided by y, x % y\t\nexpression: r = x - floor(x / y) * y;\nnotes:\t\tassumes that |x / y| < 2 ** 31 \n*/\nfloat \t\tfmodf_c(float x, float y);\nfloat \t\tfmodf_neon_hfp(float x, float y);\nfloat \t\tfmodf_neon_sfp(float x, float y);\n\n/* \nfunction:\tmodf\nreturn: \tbreaks x into the integer (i) and fractional part (return)\nnotes:\t\tassumes that |x| < 2 ** 31 \n*/\nfloat \t\tmodf_c(float x, int *i);\nfloat \t\tmodf_neon_hfp(float x, int *i);\nfloat \t\tmodf_neon_sfp(float x, int *i);\n\n/* \nfunction:\tsqrtf\nreturn: \t(x^0.5)\nnotes:\t\t \n*/\nfloat \t\tsqrtf_c(float x);\nfloat \t\tsqrtf_neon_hfp(float x);\nfloat \t\tsqrtf_neon_sfp(float x);\n\n\n/* \nfunction:\tinvsqrtf\nreturn: \t1.0f / (x^0.5)\nnotes:\t\t \n*/\nfloat \t\tinvsqrtf_c(float x);\nfloat \t\tinvsqrtf_neon_hfp(float x);\nfloat \t\tinvsqrtf_neon_sfp(float x);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_powf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n/*\r\nBased on x ^ n = exp(n * log(x))\r\n\r\nTest func : powf(x, n)\r\nTest Range: (1,1) < (x, n) < (10, 10)\r\nPeak Error:\t~0.0010%\r\nRMS  Error: ~0.0002%\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __powf_rng[2] = {\r\n\t1.442695041f,\r\n\t0.693147180f\r\n};\r\n\r\nconst float __powf_lut[16] = {\r\n\t-2.295614848256274, \t//p0\tlog\r\n\t-2.470711633419806, \t//p4\r\n\t-5.686926051100417, \t//p2\r\n\t-0.165253547131978, \t//p6\r\n\t+5.175912446351073, \t//p1\r\n\t+0.844006986174912, \t//p5\r\n\t+4.584458825456749, \t//p3\r\n\t+0.014127821926000,\t\t//p7\r\n\t0.9999999916728642,\t\t//p0\texp\r\n\t0.04165989275009526, \t//p4\r\n\t0.5000006143673624, \t//p2\r\n\t0.0014122663401803872, \t//p6\r\n\t1.000000059694879, \t\t//p1\r\n\t0.008336936973260111, \t//p5\r\n\t0.16666570253074878, \t//p3\r\n\t0.00019578093328483123\t//p7\r\n};\r\n\r\nfloat powf_c(float x, float n)\r\n{\r\n\tfloat a, b, c, d, xx;\r\n\tint m;\r\n\t\r\n\tunion {\r\n\t\tfloat   f;\r\n\t\tint \ti;\r\n\t} r;\r\n\t\r\n\t//extract exponent\r\n\tr.f = x;\r\n\tm = (r.i >> 23);\r\n\tm = m - 127;\r\n\tr.i = r.i - (m << 23);\r\n\t\r\n\t//Taylor Polynomial (Estrins)\r\n\txx = r.f * r.f;\r\n\ta = (__powf_lut[4] * r.f) + (__powf_lut[0]);\r\n\tb = (__powf_lut[6] * r.f) + (__powf_lut[2]);\r\n\tc = (__powf_lut[5] * r.f) + (__powf_lut[1]);\r\n\td = (__powf_lut[7] * r.f) + (__powf_lut[3]);\r\n\ta = a + b * xx;\r\n\tc = c + d * xx;\r\n\txx = xx * xx;\r\n\tr.f = a + c * xx;\r\n\r\n\t//add exponent\r\n\tr.f = r.f + ((float) m) * __powf_rng[1];\r\n\r\n\tr.f = r.f * n;\r\n\r\n\r\n\t//Range Reduction:\r\n\tm = (int) (r.f * __powf_rng[0]);\r\n\tr.f = r.f - ((float) m) * __powf_rng[1];\t\r\n\t\r\n\t//Taylor Polynomial (Estrins)\r\n\ta = (__powf_lut[12] * r.f) + (__powf_lut[8]);\r\n\tb = (__powf_lut[14] * r.f) + (__powf_lut[10]);\r\n\tc = (__powf_lut[13] * r.f) + (__powf_lut[9]);\r\n\td = (__powf_lut[15] * r.f) + (__powf_lut[11]);\r\n\txx = r.f * r.f;\r\n\ta = a + b * xx; \r\n\tc = c + d * xx;\r\n\txx = xx* xx;\r\n\tr.f = a + c * xx; \r\n\t\r\n\t//multiply by 2 ^ m \r\n\tm = m << 23;\r\n\tr.i = r.i + m;\r\n\r\n\treturn r.f;\r\n}\r\n\r\nfloat powf_neon_hfp(float x, float n)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\t\r\n\t\"vdup.f32\t\td16, d0[1]\t\t\t\t\\n\\t\"\t//d16 = {y,y};\t\r\n\t\"vdup.f32\t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x,x};\r\n\t\r\n\t//extract exponent\r\n\t\"vmov.i32\t\td2, #127\t\t\t\t\\n\\t\"\t//d2 = 127;\r\n\t\"vshr.u32\t\td6, d0, #23\t\t\t\t\\n\\t\"\t//d6 = d0 >> 23;\r\n\t\"vsub.i32\t\td6, d6, d2\t\t\t\t\\n\\t\"\t//d6 = d6 - d2;\r\n\t\"vshl.u32\t\td1, d6, #23\t\t\t\t\\n\\t\"\t//d1 = d6 << 23;\r\n\t\"vsub.i32\t\td0, d0, d1\t\t\t\t\\n\\t\"\t//d0 = d0 + d1;\r\n\r\n\t//polynomial:\r\n\t\"vmul.f32 \t\td1, d0, d0\t\t\t\t\\n\\t\"\t//d1 = d0*d0 = {x^2, x^2}\t\r\n\t\"vld1.32 \t\t{d2, d3, d4, d5}, [%1]!\t\\n\\t\"\t//q1 = {p0, p4, p2, p6}, q2 = {p1, p5, p3, p7} ;\r\n\t\"vmla.f32 \t\tq1, q2, d0[0]\t\t\t\\n\\t\"\t//q1 = q1 + q2 * d0[0]\t\t\r\n\t\"vmla.f32 \t\td2, d3, d1[0]\t\t\t\\n\\t\"\t//d2 = d2 + d3 * d1[0]\t\t\r\n\t\"vmul.f32 \t\td1, d1, d1\t\t\t\t\\n\\t\"\t//d1 = d1 * d1 = {x^4, x^4}\t\r\n\t\"vmla.f32 \t\td2, d1, d2[1]\t\t\t\\n\\t\"\t//d2 = d2 + d1 * d2[1]\t\t\r\n\r\n\t//add exponent \t\r\n\t\"vld1.32 \t\td7, [%0]\t\t\t\t\\n\\t\"\t//d7 = {invrange, range}\r\n\t\"vcvt.f32.s32 \td6, d6\t\t\t\t\t\\n\\t\"\t//d6 = (float) d6\r\n\t\"vmla.f32 \t\td2, d6, d7[1]\t\t\t\\n\\t\"\t//d2 = d2 + d6 * d7[1]\t\t\r\n\r\n\t\"vdup.f32 \t\td0, d2[0]\t\t\t\t\\n\\t\"\t//d0 = d2[0]\t\t\r\n\t\"vmul.f32 \t\td0, d0, d16\t\t\t\t\\n\\t\"\t//d0 = d0 * d16\t\r\n\r\n\t//Range Reduction:\r\n\t\"vmul.f32 \t\td6, d0, d7[0]\t\t\t\\n\\t\"\t//d6 = d0 * d7[0] \r\n\t\"vcvt.u32.f32 \td6, d6\t\t\t\t\t\\n\\t\"\t//d6 = (int) d6\r\n\t\"vcvt.f32.u32 \td1, d6\t\t\t\t\t\\n\\t\"\t//d1 = (float) d6\r\n\t\"vmls.f32 \t\td0, d1, d7[1]\t\t\t\\n\\t\"\t//d0 = d0 - d1 * d7[1]\r\n\t\t\r\n\t//polynomial:\r\n\t\"vmul.f32 \t\td1, d0, d0\t\t\t\t\\n\\t\"\t//d1 = d0*d0 = {x^2, x^2}\t\r\n\t\"vld1.32 \t\t{d2, d3, d4, d5}, [%1]\t\\n\\t\"\t//q1 = {p0, p4, p2, p6}, q2 = {p1, p5, p3, p7} ;\r\n\t\"vmla.f32 \t\tq1, q2, d0[0]\t\t\t\\n\\t\"\t//q1 = q1 + q2 * d0[0]\t\t\r\n\t\"vmla.f32 \t\td2, d3, d1[0]\t\t\t\\n\\t\"\t//d2 = d2 + d3 * d1[0]\t\t\r\n\t\"vmul.f32 \t\td1, d1, d1\t\t\t\t\\n\\t\"\t//d1 = d1 * d1 = {x^4, x^4}\t\r\n\t\"vmla.f32 \t\td2, d1, d2[1]\t\t\t\\n\\t\"\t//d2 = d2 + d1 * d2[1]\t\t\r\n\r\n\t//multiply by 2 ^ m \t\r\n\t\"vshl.i32 \t\td6, d6, #23\t\t\t\t\\n\\t\"\t//d6 = d6 << 23\t\t\r\n\t\"vadd.i32 \t\td0, d2, d6\t\t\t\t\\n\\t\"\t//d0 = d2 + d6\t\t\r\n\r\n\r\n\t:: \"r\"(__powf_rng), \"r\"(__powf_lut) \r\n    : \"d0\", \"d1\", \"d2\",\"d3\", \"d4\", \"d5\", \"d6\", \"d7\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat powf_neon_sfp(float x, float n)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tasm volatile (\"vmov.f32 s1, r1 \t\t\\n\\t\");\r\n\tpowf_neon_hfp(x, n);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn powf_c(x, n);\r\n#endif\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_runfast.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n\r\nvoid \r\nenable_runfast()\r\n{\r\n#ifdef __arm__\r\n\tstatic const unsigned int x = 0x04086060;\r\n\tstatic const unsigned int y = 0x03000000;\r\n\tint r;\r\n\tasm volatile (\r\n\t\t\"fmrx\t%0, fpscr\t\t\t\\n\\t\"\t//r0 = FPSCR\r\n\t\t\"and\t%0, %0, %1\t\t\t\\n\\t\"\t//r0 = r0 & 0x04086060\r\n\t\t\"orr\t%0, %0, %2\t\t\t\\n\\t\"\t//r0 = r0 | 0x03000000\r\n\t\t\"fmxr\tfpscr, %0\t\t\t\\n\\t\"\t//FPSCR = r0\r\n\t\t: \"=r\"(r)\r\n\t\t: \"r\"(x), \"r\"(y)\r\n\t);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_sincosf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __sincosf_rng[2] = {\r\n\t2.0 / M_PI,\r\n\tM_PI / 2.0\r\n};\r\n\r\nconst float __sincosf_lut[8] = {\r\n\t-0.00018365f,\t//p7\r\n\t-0.00018365f,\t//p7\r\n\t+0.00830636f,\t//p5\r\n\t+0.00830636f,\t//p5\r\n\t-0.16664831f,\t//p3\r\n\t-0.16664831f,\t//p3\r\n\t+0.99999661f,\t//p1\r\n\t+0.99999661f,\t//p1\r\n};\r\n\r\nvoid sincosf_c( float x, float r[2])\r\n{\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} ax, bx;\r\n\t\r\n\tfloat y;\r\n\tfloat a, b, c, d, xx, yy;\r\n\tint m, n, o, p;\r\n\t\r\n\ty = x + __sincosf_rng[1];\r\n\tax.f = fabsf(x);\r\n\tbx.f = fabsf(y);\r\n\t\r\n\t//Range Reduction:\r\n\tm = (int) (ax.f * __sincosf_rng[0]);\t\r\n\to = (int) (bx.f * __sincosf_rng[0]);\t\r\n\tax.f = ax.f - (((float)m) * __sincosf_rng[1]);\r\n\tbx.f = bx.f - (((float)o) * __sincosf_rng[1]);\r\n\t\r\n\t//Test Quadrant\r\n\tn = m & 1;\r\n\tp = o & 1;\r\n\tax.f = ax.f - n * __sincosf_rng[1];\t\r\n\tbx.f = bx.f - p * __sincosf_rng[1];\t\r\n\tm = m >> 1;\r\n\to = o >> 1;\r\n\tn = n ^ m;\r\n\tp = p ^ o;\r\n\tm = (x < 0.0);\r\n\to = (y < 0.0);\r\n\tn = n ^ m;\t\r\n\tp = p ^ o;\t\r\n\tn = n << 31;\r\n\tp = p << 31;\r\n\tax.i = ax.i ^ n; \r\n\tbx.i = bx.i ^ p; \r\n\r\n\t//Taylor Polynomial\r\n\txx = ax.f * ax.f;\t\r\n\tyy = bx.f * bx.f;\r\n\tr[0] = __sincosf_lut[0];\r\n\tr[1] = __sincosf_lut[1];\r\n\tr[0] = r[0] * xx + __sincosf_lut[2];\r\n\tr[1] = r[1] * yy + __sincosf_lut[3];\r\n\tr[0] = r[0] * xx + __sincosf_lut[4];\r\n\tr[1] = r[1] * yy + __sincosf_lut[5];\r\n\tr[0] = r[0] * xx + __sincosf_lut[6];\r\n\tr[1] = r[1] * yy + __sincosf_lut[7];\r\n\tr[0] = r[0] * ax.f;\r\n\tr[1] = r[1] * bx.f;\r\n\r\n}\r\n\r\nvoid sincosf_neon_hfp(float x, float r[2])\r\n{\r\n\r\n//HACK: Assumes for softfp that r1 = x, and for hardfp that s0 = x.\r\n\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t//{x, y} = {x, x + pi/2}\r\n\t\"vdup.f32 \t\td1, d0[0]\t\t\t\t\\n\\t\"\t//d1 = {x, x}\r\n\t\"vld1.32 \t\td3, [%1]\t\t\t\t\\n\\t\"\t//d3 = {invrange, range}\r\n\t\"vadd.f32 \t\td0, d1, d3\t\t\t\t\\n\\t\"\t//d0 = d1 + d3\r\n\t\"vmov.f32 \t\ts0, s2\t\t\t\t\t\\n\\t\"\t//d0[0] = d1[0]\t\r\n\t\"vabs.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = {abs(x), abs(y)}\r\n\t\r\n\t//Range Reduction:\r\n\t\"vmul.f32 \t\td2, d1, d3[0]\t\t\t\\n\\t\"\t//d2 = d1 * d3[0] \r\n\t\"vcvt.u32.f32 \td2, d2\t\t\t\t\t\\n\\t\"\t//d2 = (int) d2\r\n\t\"vcvt.f32.u32 \td4, d2\t\t\t\t\t\\n\\t\"\t//d4 = (float) d2\r\n\t\"vmls.f32 \t\td1, d4, d3[1]\t\t\t\\n\\t\"\t//d1 = d1 - d4 * d3[1]\r\n\t\r\n\t//Checking Quadrant:\r\n\t//ax = ax - (k&1) * M_PI_2\r\n\t\"vmov.i32\t \td4, #1\t\t\t\t\t\\n\\t\"\t//d4 = 1\r\n\t\"vand.i32\t \td4, d4, d2\t\t\t\t\\n\\t\"\t//d4 = d4 & d2\r\n\t\"vcvt.f32.u32 \td5, d4\t\t\t\t\t\\n\\t\"\t//d5 = (float) d4\r\n\t\"vmls.f32 \t\td1, d5, d3[1]\t\t\t\\n\\t\"\t//d1 = d1 - d5 * d3[1]\r\n\r\n\t//ax = ax ^ ((k & 1) ^ (k >> 1) ^ (x < 0) << 31)\r\n\t\"vshr.u32 \t\td3, d2, #1\t\t\t\t\\n\\t\"\t//d3 = d2 >> 1\r\n\t\"veor.i32 \t\td4, d4, d3\t\t\t\t\\n\\t\"\t//d4 = d4 ^ d3\t\r\n\t\"vclt.f32 \t\td3, d0, #0\t\t\t\t\\n\\t\"\t//d3 = (d0 < 0.0)\r\n\t\"veor.i32 \t\td4, d4, d3\t\t\t\t\\n\\t\"\t//d4 = d4 ^ d3\t\r\n\t\"vshl.i32 \t\td4, d4, #31\t\t\t\t\\n\\t\"\t//d4 = d4 << 31\r\n\t\"veor.i32 \t\td0, d1, d4\t\t\t\t\\n\\t\"\t//d0 = d1 ^ d4\r\n\t\r\n\t//polynomial:\r\n\t\"vldm \t\t\t%2!, {d2, d3}\t \t\t\\n\\t\"\t//d2 = {p7, p7}, d3 = {p5, p5}, r3 += 4;\r\n\t\"vmul.f32 \t\td1, d0, d0\t\t\t\t\\n\\t\"\t//d1 = d0 * d0 = {x^2, y^2}\r\n\t\"vldm \t\t\t%2!, {d4}\t\t\t\t\\n\\t\"\t//d4 = {p3, p3}, r3 += 2;\r\n\t\"vmla.f32 \t\td3, d2, d1\t\t\t\t\\n\\t\"\t//d3 = d3 + d2 * d1;\t\r\n\t\"vldm\t \t\t%2!, {d5}\t\t\t\t\\n\\t\"\t//d5 = {p1, p1}, r3 += 2;\r\n\t\"vmla.f32 \t\td4, d3, d1\t\t\t\t\\n\\t\"\t//d4 = d4 + d3 * d1;\t\r\n\t\"vmla.f32 \t\td5, d4, d1\t\t\t\t\\n\\t\"\t//d5 = d5 + d4 * d1;\t\r\n\t\"vmul.f32 \t\td5, d5, d0\t\t\t\t\\n\\t\"\t//d5 = d5 * d0;\t\r\n\t\r\n\t\"vstm.f32 \t\t%0, {d5}\t\t\t\t\\n\\t\"\t//r[0] = d5[0], r[1]=d5[1];\t\r\n\t\r\n\t: \"+r\"(r)\r\n\t: \"r\"(__sincosf_rng), \"r\"(__sincosf_lut) \r\n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\"\r\n\t);\r\n#else\r\n\tsincosf_c(x, r);\r\n#endif\r\n}\r\n\r\nvoid sincosf_neon_sfp(float x, float r[2])\r\n{\r\n\tasm volatile (\"vdup.f32 d0, r0 \t\t\\n\\t\");\r\n\tsincosf_neon_hfp(x, r);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n};\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_sinf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include <math.h>\r\n#include \"math_neon.h\"\r\n\r\nstatic const float __sinf_rng[2] = {\r\n\t2.0 / M_PI,\r\n\tM_PI / 2.0\r\n} ALIGN(16);\r\n\r\nstatic const float __sinf_lut[4] = {\r\n\t-0.00018365f,\t//p7\r\n\t-0.16664831f,\t//p3\r\n\t+0.00830636f,\t//p5\r\n\t+0.99999661f,\t//p1\r\n} ALIGN(16);\r\n\r\nfloat sinf_c(float x)\r\n{\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} ax;\r\n\t\r\n\tfloat r, a, b, xx;\r\n\tint m, n;\r\n\t\r\n\tax.f = fabsf(x);\r\n\r\n\t//Range Reduction:\r\n\tm = (int) (ax.f * __sinf_rng[0]);\t\r\n\tax.f = ax.f - (((float)m) * __sinf_rng[1]);\r\n\r\n\t//Test Quadrant\r\n\tn = m & 1;\r\n\tax.f = ax.f - n * __sinf_rng[1];\t\r\n\tm = m >> 1;\r\n\tn = n ^ m;\r\n\tm = (x < 0.0);\r\n\tn = n ^ m;\t\r\n\tn = n << 31;\r\n\tax.i = ax.i ^ n; \r\n\r\n\t//Taylor Polynomial (Estrins)\r\n\txx = ax.f * ax.f;\t\r\n\ta = (__sinf_lut[0] * ax.f) * xx + (__sinf_lut[2] * ax.f);\r\n\tb = (__sinf_lut[1] * ax.f) * xx + (__sinf_lut[3] * ax.f);\r\n\txx = xx * xx;\r\n\tr = b + a * xx;\r\n\r\n\treturn r;\r\n}\r\n\r\nfloat sinf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\r\n\t\"vld1.32 \t\td3, [%0]\t\t\t\t\\n\\t\"\t//d3 = {invrange, range}\r\n\t\"vdup.f32 \t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x, x}\r\n\t\"vabs.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = {ax, ax}\r\n\t\r\n\t\"vmul.f32 \t\td2, d1, d3[0]\t\t\t\\n\\t\"\t//d2 = d1 * d3[0] \r\n\t\"vcvt.u32.f32 \td2, d2\t\t\t\t\t\\n\\t\"\t//d2 = (int) d2\r\n\t\"vmov.i32\t \td5, #1\t\t\t\t\t\\n\\t\"\t//d5 = 1\t\r\n\t\"vcvt.f32.u32 \td4, d2\t\t\t\t\t\\n\\t\"\t//d4 = (float) d2\t\r\n\t\"vshr.u32 \t\td7, d2, #1\t\t\t\t\\n\\t\"\t//d7 = d2 >> 1\r\n\t\"vmls.f32 \t\td1, d4, d3[1]\t\t\t\\n\\t\"\t//d1 = d1 - d4 * d3[1]\r\n\t\r\n\t\"vand.i32 \t\td5, d2, d5\t\t\t\t\\n\\t\"\t//d5 = d2 & d5\r\n\t\"vclt.f32 \t\td18, d0, #0\t\t\t\t\\n\\t\"\t//d18 = (d0 < 0.0)\r\n\t\"vcvt.f32.u32 \td6, d5\t\t\t\t\t\\n\\t\"\t//d6 = (float) d5\r\n\t\"vmls.f32 \t\td1, d6, d3[1]\t\t\t\\n\\t\"\t//d1 = d1 - d6 * d3[1]\r\n\t\"veor.i32 \t\td5, d5, d7\t\t\t\t\\n\\t\"\t//d5 = d5 ^ d7\t\r\n\t\"vmul.f32 \t\td2, d1, d1\t\t\t\t\\n\\t\"\t//d2 = d1*d1 = {x^2, x^2}\t\r\n\t\r\n\t\"vld1.32 \t\t{d16, d17}, [%1]\t\t\\n\\t\"\t//q8 = {p7, p3, p5, p1}\r\n\t\"veor.i32 \t\td5, d5, d18\t\t\t\t\\n\\t\"\t//d5 = d5 ^ d18\t\r\n\t\"vshl.i32 \t\td5, d5, #31\t\t\t\t\\n\\t\"\t//d5 = d5 << 31\r\n\t\"veor.i32 \t\td1, d1, d5\t\t\t\t\\n\\t\"\t//d1 = d1 ^ d5\r\n\t\r\n\t\"vmul.f32 \t\td3, d2, d2\t\t\t\t\\n\\t\"\t//d3 = d2*d2 = {x^4, x^4}\t\t\r\n\t\"vmul.f32 \t\tq0, q8, d1[0]\t\t\t\\n\\t\"\t//q0 = q8 * d1[0] = {p7x, p3x, p5x, p1x}\r\n\t\"vmla.f32 \t\td1, d0, d2[0]\t\t\t\\n\\t\"\t//d1 = d1 + d0*d2 = {p5x + p7x^3, p1x + p3x^3}\t\t\r\n\t\"vmla.f32 \t\td1, d3, d1[0]\t\t\t\\n\\t\"\t//d1 = d1 + d3*d0 = {...., p1x + p3x^3 + p5x^5 + p7x^7}\t\t\r\n\r\n\t\"vmov.f32 \t\ts0, s3\t\t\t\t\t\\n\\t\"\t//s0 = s3\r\n\t: \r\n\t: \"r\"(__sinf_rng), \"r\"(__sinf_lut) \r\n    : \"q0\", \"q1\", \"q2\", \"q3\", \"q8\", \"q9\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat sinf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vdup.f32 d0, r0 \t\t\\n\\t\");\r\n\tsinf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn sinf_c(x);\r\n#endif\r\n\r\n};\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_sinfv.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __sinfv_rng[2] = {\r\n\t2.0 / M_PI,\r\n\tM_PI / 2.0, \r\n};\r\n\r\nconst float __sinfv_lut[4] = {\r\n\t-0.00018365f,\t//p7\r\n\t-0.16664831f,\t//p3\r\n\t+0.00830636f,\t//p5\r\n\t+0.99999661f,\t//p1\r\n};\r\n\r\nvoid sinfv_c(float *x, int n, float *r)\r\n{\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} ax, bx;\r\n\t\r\n\tfloat aa, ab, ba, bb, axx, bxx;\r\n\tint am, bm, an, bn;\r\n\r\n\tif (n & 0x1) {\r\n\t\t*r++ = sinf_c(*x++);\r\n\t\tn--;\r\n\t}\r\n\r\n\tfloat rng0 = __sinfv_rng[0];\r\n\tfloat rng1 = __sinfv_rng[1];\r\n\r\n\twhile(n > 0){\r\n\t\t\r\n\t\tfloat x0 = *x++;\r\n\t\tfloat x1 = *x++;\r\n\t\t\r\n\t\tax.f = fabsf(x0);\r\n\t\tbx.f = fabsf(x1);\r\n\r\n\t\t//Range Reduction:\r\n\t\tam = (int) (ax.f * rng0);\t\r\n\t\tbm = (int) (bx.f * rng0);\t\r\n\t\t\r\n\t\tax.f = ax.f - (((float)am) * rng1);\r\n\t\tbx.f = bx.f - (((float)bm) * rng1);\r\n\r\n\t\t//Test Quadrant\r\n\t\tan = am & 1;\r\n\t\tbn = bm & 1;\r\n\t\tax.f = ax.f - an * rng1;\r\n\t\tbx.f = bx.f - bn * rng1;\r\n\t\tam = (am & 2) >> 1;\r\n\t\tbm = (bm & 2) >> 1;\r\n\t\tax.i = ax.i ^ ((an ^ am ^ (x0 < 0)) << 31);\r\n\t\tbx.i = bx.i ^ ((bn ^ bm ^ (x1 < 0)) << 31);\r\n\t\t\t\r\n\t\t//Taylor Polynomial (Estrins)\r\n\t\taxx = ax.f * ax.f;\t\r\n\t\tbxx = bx.f * bx.f;\t\r\n\t\taa = (__sinfv_lut[0] * ax.f) * axx + (__sinfv_lut[2] * ax.f);\r\n\t\tba = (__sinfv_lut[0] * bx.f) * bxx + (__sinfv_lut[2] * bx.f);\r\n\t\tab = (__sinfv_lut[1] * ax.f) * axx + (__sinfv_lut[3] * ax.f);\r\n\t\tbb = (__sinfv_lut[1] * bx.f) * bxx + (__sinfv_lut[3] * bx.f);\r\n\t\taxx = axx * axx;\r\n\t\tbxx = bxx * bxx;\r\n\t\t*r++ = ab + aa * axx;\r\n\t\t*r++ = bb + ba * bxx;\r\n\t\tn -= 2;\r\n\t}\r\n\t\r\n\t\r\n}\r\n\r\nvoid sinfv_neon(float *x, int n, float *r)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"\"\r\n\t:\r\n\t:\"r\"(x), \"r\"(n)\r\n\t);\r\n#else\r\n\tsinfv_c(x, n, r);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_sinhf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nconst float __sinhf_rng[2] = {\r\n\t1.442695041f,\r\n\t0.693147180f\r\n};\r\n\r\nconst float __sinhf_lut[16] = {\r\n\t0.00019578093328483123,\t//p7\r\n\t0.00019578093328483123,\t//p7\r\n\t0.0014122663401803872, \t//p6\r\n\t0.0014122663401803872, \t//p6\r\n\t0.008336936973260111, \t//p5\r\n\t0.008336936973260111, \t//p5\r\n\t0.04165989275009526, \t//p4\r\n\t0.04165989275009526, \t//p4\r\n\t0.16666570253074878, \t//p3\r\n\t0.16666570253074878, \t//p3\r\n\t0.5000006143673624, \t//p2\r\n\t0.5000006143673624, \t//p2\r\n\t1.000000059694879, \t\t//p1\r\n\t1.000000059694879, \t\t//p1\r\n\t0.9999999916728642,\t\t//p0\r\n\t0.9999999916728642\t\t//p0\r\n};\r\n\r\n\r\nfloat sinhf_c(float x)\r\n{\r\n\tfloat a, b, xx;\r\n\txx = -x;\r\n\ta = expf_c(x);\r\n\tb = expf_c(xx);\r\n\ta = a - b;\r\n\ta = a * 0.5f;\r\n\treturn a;\r\n}\r\n\r\n\r\nfloat sinhf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vdup.f32 \t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x, x}\t\r\n\t\"fnegs \t\t\ts1, s1\t\t\t\t\t\\n\\t\"\t//s1 = -s1\r\n\t\r\n\t//Range Reduction:\r\n\t\"vld1.32 \t\td2, [%0]\t\t\t\t\\n\\t\"\t//d2 = {invrange, range}\r\n\t\"vld1.32 \t\t{d16, d17}, [%1]!\t\t\\n\\t\"\t\r\n\t\"vmul.f32 \t\td6, d0, d2[0]\t\t\t\\n\\t\"\t//d6 = d0 * d2[0] \r\n\t\"vcvt.s32.f32 \td6, d6\t\t\t\t\t\\n\\t\"\t//d6 = (int) d6\r\n\t\"vld1.32 \t\t{d18}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vcvt.f32.s32 \td1, d6\t\t\t\t\t\\n\\t\"\t//d1 = (float) d6\r\n\t\"vld1.32 \t\t{d19}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmls.f32 \t\td0, d1, d2[1]\t\t\t\\n\\t\"\t//d0 = d0 - d1 * d2[1]\r\n\t\"vld1.32 \t\t{d20}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\t\r\n\t//polynomial:\r\n\t\"vmla.f32 \t\td17, d16, d0\t\t\t\\n\\t\"\t//d17 = d17 + d16 * d0;\t\r\n\t\"vld1.32 \t\t{d21}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmla.f32 \t\td18, d17, d0\t\t\t\\n\\t\"\t//d18 = d18 + d17 * d0;\t\r\n\t\"vld1.32 \t\t{d22}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmla.f32 \t\td19, d18, d0\t\t\t\\n\\t\"\t//d19 = d19 + d18 * d0;\t\r\n\t\"vld1.32 \t\t{d23}, [%1]!\t\t\t\\n\\t\"\t\r\n\t\"vmla.f32 \t\td20, d19, d0\t\t\t\\n\\t\"\t//d20 = d20 + d19 * d0;\t\r\n\t\"vmla.f32 \t\td21, d20, d0\t\t\t\\n\\t\"\t//d21 = d21 + d20 * d0;\t\r\n\t\"vmla.f32 \t\td22, d21, d0\t\t\t\\n\\t\"\t//d22 = d22 + d21 * d0;\t\r\n\t\"vmla.f32 \t\td23, d22, d0\t\t\t\\n\\t\"\t//d23 = d23 + d22 * d0;\t\r\n\t\r\n\t//multiply by 2 ^ m \t\r\n\t\"vshl.i32 \t\td6, d6, #23\t\t\t\t\\n\\t\"\t//d6 = d6 << 23\t\t\r\n\t\"vadd.i32 \t\td0, d23, d6\t\t\t\t\\n\\t\"\t//d0 = d22 + d6\t\t\r\n\r\n\t\"vdup.f32 \t\td2, d0[1]\t\t\t\t\\n\\t\"\t//d2 = s1\t\t\r\n\t\"vmov.f32 \t\td1, #0.5\t\t\t\t\\n\\t\"\t//d1 = 0.5\t\t\r\n\t\"vsub.f32 \t\td0, d0, d2\t\t\t\t\\n\\t\"\t//d0 = d0 - d2\t\t\r\n\t\"vmul.f32 \t\td0, d1\t\t\t\t\t\\n\\t\"\t//d0 = d0 * d1\t\t\r\n\r\n\t:: \"r\"(__sinhf_rng), \"r\"(__sinhf_lut) \r\n    : \"d0\", \"d1\", \"q1\", \"q2\", \"d6\"\r\n\t);\r\n\t\r\n#endif\r\n}\r\n\r\nfloat sinhf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tsinhf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn sinhf_c(x);\r\n#endif\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_sqrtf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n/*\r\nTest func : sqrtf(x)\r\nTest Range: 0 < x < 1,000,000,000\r\nPeak Error:\t~0.0010%\r\nRMS  Error: ~0.0005%\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nfloat sqrtf_c(float x)\r\n{\r\n\r\n\tfloat b, c;\r\n\tint m;\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} a;\r\n\t\r\n\t//fast invsqrt approx\r\n\ta.f = x;\r\n\ta.i = 0x5F3759DF - (a.i >> 1);\t\t//VRSQRTE\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\t\t//VRSQRTS\r\n\ta.f = a.f * b;\t\t\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\r\n    a.f = a.f * b;\t\r\n\r\n\t//fast inverse approx\r\n\tx = a.f;\r\n\tm = 0x3F800000 - (a.i & 0x7F800000);\r\n\ta.i = a.i + m;\r\n\ta.f = 1.41176471f - 0.47058824f * a.f;\r\n\ta.i = a.i + m;\r\n\tb = 2.0 - a.f * x;\r\n\ta.f = a.f * b;\t\r\n\tb = 2.0 - a.f * x;\r\n\ta.f = a.f * b;\r\n\r\n\treturn a.f;\r\n}\r\n\r\nfloat sqrtf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\t\r\n\t//fast invsqrt approx\r\n\t\"vmov.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = d0\r\n\t\"vrsqrte.f32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = ~ 1.0 / sqrt(d0)\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d3 = (3 - d0 * d2) / 2 \t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\t\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2\t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3\t\r\n\t\t\r\n\t//fast reciporical approximation\r\n\t\"vrecpe.f32\t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = ~ 1 / d0; \r\n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \r\n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \r\n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \r\n\t\"vmul.f32\t\td0, d1, d2\t\t\t\t\\n\\t\"\t//d0 = d1 * d2; \r\n\r\n\t::: \"d0\", \"d1\", \"d2\", \"d3\"\r\n\t);\r\n#endif\r\n}\r\n\r\nfloat sqrtf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\tsqrtf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn sqrtf_c(x);\r\n#endif\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_sqrtfv.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n/*\r\nTest func : sqrtf(x)\r\nTest Range: 0 < x < 1,000,000,000\r\nPeak Error:\t~0.0010%\r\nRMS  Error: ~0.0005%\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n\r\nvoid sqrtfv_c(float *x, int n, float *r)\r\n{\r\n\r\n\tfloat x0, x1;\r\n\tfloat b0, b1, c0, c1;\r\n\tint m0, m1;\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} a0, a1;\r\n\r\n\r\n\tif (n & 0x1){\r\n\t\t*r++ = sqrtf_c(*x++);\r\n\t\tn--;\r\n\t}\r\n\r\n\twhile(n > 0){\r\n\t\r\n\t\tx0 = *x++;\r\n\t\tx1 = *x++;\r\n\t\r\n\t\t//fast invsqrt approx\r\n\t\ta0.f = x0;\r\n\t\ta1.f = x1;\r\n\t\ta0.i = 0x5F3759DF - (a0.i >> 1);\t\t//VRSQRTE\r\n\t\ta1.i = 0x5F3759DF - (a1.i >> 1);\t\t//VRSQRTE\r\n\t\tc0 = x0 * a0.f;\r\n\t\tc1 = x1 * a1.f;\r\n\t\tb0 = (3.0f - c0 * a0.f) * 0.5;\t\t//VRSQRTS\r\n\t\tb1 = (3.0f - c1 * a1.f) * 0.5;\t\t//VRSQRTS\r\n\t\ta0.f = a0.f * b0;\t\t\r\n\t\ta1.f = a1.f * b1;\t\t\r\n\t\tc0 = x0 * a0.f;\r\n\t\tc1 = x1 * a1.f;\r\n\t\tb0 = (3.0f - c0 * a0.f) * 0.5;\t\t//VRSQRTS\r\n\t\tb1 = (3.0f - c1 * a1.f) * 0.5;\t\t//VRSQRTS\r\n\t\ta0.f = a0.f * b0;\t\t\r\n\t\ta1.f = a1.f * b1;\t\t\r\n\r\n\t\t//fast inverse approx\r\n\t\tc0 = a0.f;\r\n\t\tc0 = a1.f;\r\n\t\tm0 = 0x3F800000 - (a0.i & 0x7F800000);\r\n\t\tm1 = 0x3F800000 - (a1.i & 0x7F800000);\r\n\t\ta0.i = a0.i + m0;\r\n\t\ta1.i = a1.i + m1;\r\n\t\ta0.f = 1.41176471f - 0.47058824f * a0.f;\r\n\t\ta1.f = 1.41176471f - 0.47058824f * a1.f;\r\n\t\ta0.i = a0.i + m0;\r\n\t\ta1.i = a1.i + m1;\r\n\t\tb0 = 2.0 - a0.f * c0;\r\n\t\tb1 = 2.0 - a1.f * c1;\r\n\t\ta0.f = a0.f * b0;\t\r\n\t\ta1.f = a1.f * b1;\t\r\n\t\tb0 = 2.0 - a0.f * c0;\r\n\t\tb1 = 2.0 - a1.f * c1;\r\n\t\ta0.f = a0.f * b0;\r\n\t\ta1.f = a1.f * b1;\r\n\t\t\r\n\t\t*r++ = a0.f;\r\n\t\t*r++ = a1.f;\r\n\t\tn -= 2;\r\n\r\n\t}\r\n}\r\n\r\nvoid sqrtfv_neon(float *x, int n, float *r)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\r\n\t\"tst \t\t\tr1, #1 \t\t\t\t\t\\n\\t\"\t//r1 & 1\r\n\t\"beq \t\t\t1f \t\t\t\t\t\t\\n\\t\"\t//\r\n\r\n\t\"vld1.32\t\td0[0], [r0]! \t\t\t\\n\\t\"\t//s0 = *x++\r\n\t\"mov \t\t\tip, lr \t\t\t\t\t\\n\\t\"\t//ip = lr\r\n\t//\"bl \t\t\tsqrtf_neon_hfp \t\t\t\\n\\t\"\t//sqrtf_neon\r\n\t\"mov \t\t\tlr, ip \t\t\t\t\t\\n\\t\"\t//lr = ip\r\n\t\"vst1.32\t\td0[0], [r2]! \t\t\t\\n\\t\"\t//*r++ = r0\r\n\t\"subs \t\t\tr1, r1, #1\t\t\t\t\\n\\t\"\t//r1 = r1 - 1;\t\t\r\n\t\"bxeq \t\t\tlr\t\t\t\t\t\t\\n\\t\"\t//\r\n\r\n\t\"1:\t\t\t\t \t\t\t\t\t\t\\n\\t\"\t//\r\n\r\n\t\"vld1.32 \t\td0, [r0]! \t\t\t\t\\n\\t\"\t//d0 = (*x[0], *x[1]), x+=2;\r\n\t\r\n\t//fast invsqrt approx\r\n\t\"vmov.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = d0\r\n\t\"vrsqrte.f32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = ~ 1.0 / sqrt(d0)\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d3 = d0 * d2\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2 \t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d4\t\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d3 = d0 * d2\t\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2\t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d4\t\r\n\t\t\r\n\t//fast reciporical approximation\r\n\t\"vrecpe.f32\t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = ~ 1 / d0; \r\n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \r\n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \r\n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \r\n\t\"vmul.f32\t\td0, d1, d2\t\t\t\t\\n\\t\"\t//d0 = d1 * d2; \r\n\r\n\t\"vst1.64 \t\td0, [r2]!\t\t\t\t\\n\\t\"\t//*r++ = d0;\r\n\t\"subs \t\t\tr1, r1, #2\t\t\t\t\\n\\t\"\t//n = n - 2; update flags\r\n\t\"bgt \t\t\t1b \t\t\t\t\t\t\\n\\t\"\t//\r\n\r\n\t::: \"d0\", \"d1\", \"d2\", \"d3\"\r\n);\r\n#else\r\n\tsqrtfv_c(x, n, r);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_tanf.c",
    "content": "/*\nMath-NEON:  Neon Optimised Math Library based on cmath\nContact:    lachlan.ts@gmail.com\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\n\nThis library is free software; you can redistribute it and/or\nmodify it under the terms of the GNU Lesser General Public\nLicense as published by the Free Software Foundation; either\nversion 3 of the License, or (at your option) any later version.\n\nThis library is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nLesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public\nLicense along with this library; if not, write to the Free\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n*/\n\n#include \"math.h\"\n#include \"math_neon.h\"\n\nconst float __tanf_rng[2] = {\n\t2.0 / M_PI,\n\tM_PI / 2.0\n};\n\nconst float __tanf_lut[4] = {\n\t-0.00018365f,\t//p7\n\t-0.16664831f,\t//p3\n\t+0.00830636f,\t//p5\n\t+0.99999661f,\t//p1\n};\n \nfloat tanf_c(float x){\n\n\tunion {\n\t\tfloat f;\n\t\tint i;\n\t} ax, c;\n\n\tfloat r, a, b, xx, cc, cx;\n\tint m;\n\t\n\tax.f = fabsf(x);\n\n\t//Range Reduction:\n\tm = (int) (ax.f * __tanf_rng[0]);\t\n\tax.f = ax.f - (((float)m) * __tanf_rng[1]);\n\n\t//Test Quadrant\n\tax.f = ax.f - (m & 1) * __tanf_rng[1];\n\tax.i = ax.i ^ ((*(int*)&x) & 0x80000000);\n\t\t\n\t//Taylor Polynomial (Estrins)\n\txx = ax.f * ax.f;\t\n\ta = (__tanf_lut[0] * ax.f) * xx + (__tanf_lut[2] * ax.f);\n\tb = (__tanf_lut[1] * ax.f) * xx + (__tanf_lut[3] * ax.f);\n\txx = xx * xx;\n\tr = b + a * xx;\n\n\t//cosine\n\tc.f = 1.0 - r * r;\n\t\n\t//fast invsqrt approximation (2x newton iterations)\n    cc = c.f;\n\tc.i = 0x5F3759DF - (c.i >> 1);\t\t//VRSQRTE\n\tcx = cc * c.f;\n\ta = (3.0f - cx * c.f) / 2;\t\t\t//VRSQRTS\n\tc.f = c.f * a;\t\t\n\tcx = cc * c.f;\n\ta = (3.0f - cx * c.f) / 2;\n    c.f = c.f * a;\t\n\n\tr = r * c.f;\n\t\n\treturn r;\n}\n\n\nfloat tanf_neon_hfp(float x)\n{\n#ifdef __MATH_NEON\n\tasm volatile (\n\n\t\"vdup.f32 \t\td0, d0[0]\t\t\t\t\\n\\t\"\t//d0 = {x, x}\n\t\"vabs.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = {ax, ax}\n\t\n\t//Range Reduction:\n\t\"vld1.32 \t\td3, [%0]\t\t\t\t\\n\\t\"\t//d3 = {invrange, range}\n\t\"vmul.f32 \t\td2, d1, d3[0]\t\t\t\\n\\t\"\t//d2 = d1 * d3[0] \n\t\"vcvt.u32.f32 \td2, d2\t\t\t\t\t\\n\\t\"\t//d2 = (int) d2\n\t\"vcvt.f32.u32 \td4, d2\t\t\t\t\t\\n\\t\"\t//d4 = (float) d2\n\t\"vmls.f32 \t\td1, d4, d3[1]\t\t\t\\n\\t\"\t//d1 = d1 - d4 * d3[1]\n\t\n\t//Checking Quadrant:\n\t//ax = ax - (k&1) * M_PI_2\n\t\"vmov.i32 \t\td4, #1\t\t\t\t\t\\n\\t\"\t//d4 = 1\n\t\"vand.i32 \t\td2, d2, d4\t\t\t\t\\n\\t\"\t//d2 = d2 & d4\n\t\"vcvt.f32.u32 \td2, d2\t\t\t\t\t\\n\\t\"\t//d2 = (float) d2\n\t\"vmls.f32 \t\td1, d2, d3[1]\t\t\t\\n\\t\"\t//d1 = d1 - d2 * d3[1]\n\t\n\t//ax = ax ^ ( x.i & 0x800000000)\n\t\"vmov.i32 \t\td4, #0x80000000\t\t\t\\n\\t\"\t//d4 = 0x80000000\n\t\"vand.i32 \t\td0, d0, d4\t\t\t\t\\n\\t\"\t//d0 = d0 & d4\n\t\"veor.i32 \t\td1, d1, d0\t\t\t\t\\n\\t\"\t//d1 = d1 ^ d0\n\t\n\t//polynomial:\n\t\"vmul.f32 \t\td2, d1, d1\t\t\t\t\\n\\t\"\t//d2 = d1*d1 = {x^2, x^2}\t\n\t\"vld1.32 \t\t{d4, d5}, [%1]\t\t\t\\n\\t\"\t//d4 = {p7, p3}, d5 = {p5, p1}\n\t\"vmul.f32 \t\td3, d2, d2\t\t\t\t\\n\\t\"\t//d3 = d2*d2 = {x^4, x^4}\t\t\n\t\"vmul.f32 \t\tq0, q2, d1[0]\t\t\t\\n\\t\"\t//q0 = q2 * d1[0] = {p7x, p3x, p5x, p1x}\n\t\"vmla.f32 \t\td1, d0, d2[0]\t\t\t\\n\\t\"\t//d1 = d1 + d0*d2 = {p5x + p7x^3, p1x + p3x^3}\t\t\n\t\"vmla.f32 \t\td1, d3, d1[0]\t\t\t\\n\\t\"\t//d1 = d1 + d3*d0 = {..., p1x + p3x^3 + p5x^5 + p7x^7}\t\t\n\t\n\t//cosine\n\t\"vmov.f32 \t\ts1, #1.0\t\t\t\t\\n\\t\"\t//d0[1] = 1.0\n\t\"vmls.f32 \t\td0, d1, d1\t\t\t\t\\n\\t\"\t//d0 = {..., 1.0 - sx*sx}\n\t\n\t//invsqrt approx\n\t\"vmov.f32 \t\td2, d0\t\t\t\t\t\\n\\t\"\t//d2 = d0\n\t\"vrsqrte.f32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = ~ 1.0 / sqrt(d0)\n\t\"vmul.f32 \t\td3, d0, d2\t\t\t\t\\n\\t\"\t//d3 = d0 * d2\n\t\"vrsqrts.f32 \td4, d3, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2 \t\n\t\"vmul.f32 \t\td0, d0, d4\t\t\t\t\\n\\t\"\t//d0 = d0 * d4\t\n\t\"vmul.f32 \t\td3, d0, d2\t\t\t\t\\n\\t\"\t//d3 = d0 * d2\t\n\t\"vrsqrts.f32 \td4, d3, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2\t\n\t\"vmul.f32 \t\td0, d0, d4\t\t\t\t\\n\\t\"\t//d0 = d0 * d4\t\n\t\n\t\"vmul.f32 \t\td0, d0, d1\t\t\t\t\\n\\t\"\t//d0 = d0 * d1\n\t\n\t\"vmov.f32 \t\ts0, s1\t\t\t\t\t\\n\\t\"\t//s0 = s1\n\t\n\t:: \"r\"(__tanf_rng), \"r\"(__tanf_lut) \n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\"\n\t);\n#endif\n}\n\n\nfloat tanf_neon_sfp(float x)\n{\n#ifdef __MATH_NEON\n\tasm volatile (\"vdup.f32 d0, r0 \t\t\\n\\t\");\n\ttanf_neon_hfp(x);\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\n#else\n\treturn tanf_c(x);\n#endif\n};\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_tanhf.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n#include \"math.h\"\r\n#include \"math_neon.h\"\r\n \r\n/* \r\nTanH = (e^x - e^-x) / (e^x + e^-x)\r\nTanH = (e^x - e^-x)(e^x) / (e^x + e^-x)(e^x)\r\nTanH = (e^2x - 1) / (e^2x + 1)\r\n\r\n*/\r\n \r\nfloat tanhf_c(float x)\r\n{\r\n\tfloat a, b, c;\r\n\tint m;\r\n\tunion{\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} xx;\r\n\t\r\n\tx = 2.0f * x;\r\n\ta = expf_c(x);\r\n\tc = a + 1.0f;\r\n\t\t\r\n\t//reciporical approx.\r\n\txx.f = c;\r\n\tm = 0x3F800000 - (xx.i & 0x7F800000);\r\n\txx.i = xx.i + m;\r\n\txx.f = 1.41176471f - 0.47058824f * xx.f;\r\n\txx.i = xx.i + m;\r\n\tb = 2.0 - xx.f * c;\r\n\txx.f = xx.f * b;\t\r\n\tb = 2.0 - xx.f * c;\r\n\txx.f = xx.f * b;\r\n\tc = a - 1.0;\r\n\txx.f *= c;\r\n\treturn xx.f;\r\n}\r\n\r\n\r\nfloat tanhf_neon_hfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vadd.f32 d0, d0, d0 \t\t\\n\\t\");\r\n\texpf_neon_hfp(x);\r\n\tasm volatile (\r\n\t\"vmov.f32 \t\td2, #1.0 \t\t\t\t\\n\\t\"\r\n\t\"vsub.f32 \t\td3, d0, d2 \t\t\t\t\\n\\t\"\r\n\t\"vadd.f32 \t\td0, d0, d2 \t\t\t\t\\n\\t\"\r\n\r\n\t\"vrecpe.f32\t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = ~ 1 / d0; \r\n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \r\n\t\"vmul.f32\t\td1, d1, d2\t\t\t\t\\n\\t\"\t//d1 = d1 * d2; \r\n\t\"vrecps.f32\t\td2, d1, d0\t\t\t\t\\n\\t\"\t//d2 = 2.0 - d1 * d0; \r\n\t\"vmul.f32\t\td0, d1, d2\t\t\t\t\\n\\t\"\t//d0 = d1 * d2; \r\n\t\"vmul.f32\t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3; \t\r\n\t::: \"d0\", \"d1\", \"d2\", \"d3\"\r\n\t);\t\r\n#endif\r\n}\r\n\r\nfloat tanhf_neon_sfp(float x)\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\"vmov.f32 s0, r0 \t\t\\n\\t\");\r\n\ttanhf_neon_hfp(x);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn tanhf_c(x);\r\n#endif\r\n};\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_vec2.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n\r\n#include \"math_neon.h\"\r\n\r\n//vec2 scalar product\r\nfloat \r\ndot2_c(float v0[2], float v1[2])\r\n{\r\n\tfloat r;\r\n\tr = v0[0]*v1[0];\r\n\tr += v0[1]*v1[1];\r\n\treturn r;\r\n}\r\n\r\nvoid \r\nnormalize2_c(float v[2], float d[2])\r\n{\r\n\tfloat b, c, x;\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} a;\r\n\t\r\n\tx = v[0]*v[0];\r\n\tx += v[1]*v[1];\r\n\r\n\t//fast invsqrt approx\r\n\ta.f = x;\r\n\ta.i = 0x5F3759DF - (a.i >> 1);\t\t//VRSQRTE\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\t\t//VRSQRTS\r\n\ta.f = a.f * b;\t\t\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\r\n    a.f = a.f * b;\t\r\n\r\n\td[0] = v[0]*a.f;\r\n\td[1] = v[1]*a.f;\r\n}\r\n\r\nfloat \r\ndot2_neon_hfp(float v0[2], float v1[2])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d2}, [%0]\t\t\t\\n\\t\"\t//d2={x0,y0}\r\n\t\"vld1.32 \t\t{d4}, [%1]\t\t\t\\n\\t\"\t//d4={x1,y1}\r\n\t\"vmul.f32 \t\td0, d2, d4\t\t\t\\n\\t\"\t//d0 = d2*d4\r\n\t\"vpadd.f32 \t\td0, d0, d0\t\t\t\\n\\t\"\t//d0 = d[0] + d[1]\r\n\t:: \"r\"(v0), \"r\"(v1) \r\n    : \r\n\t);\t\r\n#endif\r\n}\r\n\r\nfloat \r\ndot2_neon_sfp(float v0[2], float v1[2])\r\n{\r\n#ifdef __MATH_NEON\r\n\tdot2_neon_hfp(v0, v1);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn dot2_c(v0, v1);\r\n#endif\r\n};\r\n\r\nvoid \r\nnormalize2_neon(float v[2], float d[2])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\td4, [%0]\t\t\t\t\\n\\t\"\t//d4 = {x0,y0}\r\n\t\"vmul.f32 \t\td0, d4, d4\t\t\t\t\\n\\t\"\t//d0 = d2*d2\r\n\t\"vpadd.f32 \t\td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = d[0] + d[1]\r\n\t\r\n\t\"vmov.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = d0\r\n\t\"vrsqrte.f32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = ~ 1.0 / sqrt(d0)\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d3 = (3 - d0 * d2) / 2 \t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\t\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d3 = (3 - d0 * d2) / 2\t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3\t\r\n\r\n\t\"vmul.f32 \t\td4, d4, d0[0]\t\t\t\\n\\t\"\t//d4 = d4*d0[0]\r\n\t\"vst1.32 \t\td4, [%1]\t\t\t\t\\n\\t\"\t//\r\n\t\r\n\t:: \"r\"(v), \"r\"(d) \r\n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"memory\"\r\n\t);\t\r\n#else\r\n\tnormalize2_c(v, d);\r\n#endif\r\n}\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_vec3.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n\r\n#include \"math_neon.h\"\r\n\r\n//vec4 scalar product\r\nfloat \r\ndot3_c(float v0[3], float v1[3])\r\n{\r\n\tfloat r;\r\n\tr = v0[0]*v1[0];\r\n\tr += v0[1]*v1[1];\r\n\tr += v0[2]*v1[2]; \r\n\treturn r;\r\n}\r\n\r\nvoid\r\ncross3_c(float v0[3], float v1[3], float d[3])\r\n{\r\n\td[0] = v0[1]*v1[2] - v0[2]*v1[1];\r\n\td[1] = v0[2]*v1[0] - v0[0]*v1[2];\r\n\td[2] = v0[0]*v1[1] - v0[1]*v1[0];\r\n}\r\n\r\nvoid \r\nnormalize3_c(float v[3], float d[3])\r\n{\r\n\tfloat b, c, x;\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} a;\r\n\t\r\n\tx = v[0]*v[0];\r\n\tx += v[1]*v[1];\r\n\tx += v[2]*v[2];\r\n\r\n\t//fast invsqrt approx\r\n\ta.f = x;\r\n\ta.i = 0x5F3759DF - (a.i >> 1);\t\t//VRSQRTE\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\t\t//VRSQRTS\r\n\ta.f = a.f * b;\t\t\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\r\n    a.f = a.f * b;\t\r\n\r\n\td[0] = v[0]*a.f;\r\n\td[1] = v[1]*a.f;\r\n\td[2] = v[2]*a.f;\r\n}\r\n\r\n\r\nfloat \r\ndot3_neon_hfp(float v0[3], float v1[3])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d2}, [%0]\t\t\t\\n\\t\"\t//d2={x0,y0}\r\n\t\"flds \t\t\ts6, [%0, #8]\t\t\\n\\t\"\t//d3[0]={z0}\r\n\t\"vld1.32 \t\t{d4}, [%1]\t\t\t\\n\\t\"\t//d4={x1,y1}\r\n\t\"flds \t\t\ts10, [%1, #8]\t\\n\\t\"\t//d5[0]={z1}\r\n\r\n\t\"vmul.f32 \t\td0, d2, d4\t\t\t\\n\\t\"\t//d0= d2*d4\r\n\t\"vpadd.f32 \t\td0, d0, d0\t\t\t\\n\\t\"\t//d0 = d[0] + d[1]\r\n\t\"vmla.f32 \t\td0, d3, d5\t\t\t\\n\\t\"\t//d0 = d0 + d3*d5 \r\n\t:: \"r\"(v0), \"r\"(v1) \r\n    : \"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\"\r\n\t);\t\r\n#endif\r\n}\r\n\r\nfloat \r\ndot3_neon_sfp(float v0[3], float v1[3])\r\n{\r\n#ifdef __MATH_NEON\r\n\tdot3_neon_hfp(v0, v1);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn dot3_c(v0, v1);\r\n#endif\r\n};\r\n\r\n\r\nvoid cross3_neon(float v0[3], float v1[3], float d[3])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"flds \t\t\ts3, [%0]\t\t\t\\n\\t\"\t//d1[1]={x0}\r\n\t\"add \t\t\t%0, %0, #4\t\t\t\\n\\t\"\t//\r\n\t\"vld1.32 \t\t{d0}, [%0]\t\t\t\\n\\t\"\t//d0={y0,z0}\r\n\t\"vmov.f32 \t\ts2, s1\t\t \t\t\\n\\t\"\t//d1[0]={z0}\r\n\r\n\t\"flds \t\t\ts5, [%1]\t\t\t\\n\\t\"\t//d2[1]={x1}\r\n\t\"add \t\t\t%1, %1, #4\t\t\t\\n\\t\"\t//\r\n\t\"vld1.32 \t\t{d3}, [%1]\t\t\t\\n\\t\"\t//d3={y1,z1}\r\n\t\"vmov.f32 \t\ts4, s7\t\t\t\t\\n\\t\"\t//d2[0]=d3[1]\r\n\t\r\n\t\"vmul.f32 \t\td4, d0, d2\t\t\t\\n\\t\"\t//d4=d0*d2\r\n\t\"vmls.f32 \t\td4, d1, d3\t\t\t\\n\\t\"\t//d4-=d1*d3\r\n\t\r\n\t\"vmul.f32 \t\td5, d3, d1[1]\t\t\\n\\t\"\t//d5=d3*d1[1]\r\n\t\"vmls.f32 \t\td5, d0, d2[1]\t\t\\n\\t\"\t//d5-=d0*d2[1]\r\n\t\r\n\t\"vst1.32 \t\td4, [%2]\t\t\t\\n\\t\"\t//\r\n\t\"add \t\t\t%2, %2, #8\t\t\t\\n\\t\"\t//\r\n\t\"fsts \t\t\ts10, [%2]\t\t\t\\n\\t\"\t//\r\n\t\r\n\t: \"+r\"(v0), \"+r\"(v1), \"+r\"(d):\r\n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\", \"memory\"\r\n\t);\t\r\n#else\r\n\tcross3_c(v0,v1,d);\r\n#endif\r\n}\r\n\r\nvoid \r\nnormalize3_neon(float v[3], float d[3])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d4}, [%0]\t\t\t\t\\n\\t\"\t//d4={x0,y0}\r\n\t\"flds \t\t\ts10, [%0, #8]\t\t\t\\n\\t\"\t//d5[0]={z0}\r\n\r\n\t\"vmul.f32 \t\td0, d4, d4\t\t\t\t\\n\\t\"\t//d0= d4*d4\r\n\t\"vpadd.f32 \t\td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = d[0] + d[1]\r\n\t\"vmla.f32 \t\td0, d5, d5\t\t\t\t\\n\\t\"\t//d0 = d0 + d5*d5 \r\n\t\r\n\t\"vmov.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = d0\r\n\t\"vrsqrte.f32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = ~ 1.0 / sqrt(d0)\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d3 = (3 - d0 * d2) / 2 \t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\t\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2\t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d4\t\r\n\r\n\t\"vmul.f32 \t\tq2, q2, d0[0]\t\t\t\\n\\t\"\t//d0= d2*d4\r\n\t\"vst1.32 \t\t{d4}, [%1]\t\t\t\t\\n\\t\"\t//\r\n\t\"fsts \t\t\ts10, [%1, #8]\t\t\t\\n\\t\"\t//\r\n\t\r\n\t:: \"r\"(v), \"r\"(d) \r\n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\", \"memory\"\r\n\t);\t\r\n#else\r\n\tnormalize3_c(v, d);\r\n#endif\r\n\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/math-neon/math_vec4.c",
    "content": "/*\r\nMath-NEON:  Neon Optimised Math Library based on cmath\r\nContact:    lachlan.ts@gmail.com\r\nCopyright (C) 2009  Lachlan Tychsen - Smith aka Adventus\r\n\r\nThis library is free software; you can redistribute it and/or\r\nmodify it under the terms of the GNU Lesser General Public\r\nLicense as published by the Free Software Foundation; either\r\nversion 3 of the License, or (at your option) any later version.\r\n\r\nThis library is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r\nLesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public\r\nLicense along with this library; if not, write to the Free\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n*/\r\n\r\n\r\n#include \"math_neon.h\"\r\n\r\n#include \"arm_neon.h\" \r\n\r\n//vec4 scalar product\r\nfloat \r\ndot4_c(float v0[4], float v1[4])\r\n{\r\n\tfloat r;\r\n\tr = v0[0]*v1[0];\r\n\tr += v0[1]*v1[1];\r\n\tr += v0[2]*v1[2]; \r\n\tr += v0[3]*v1[3];\r\n\treturn r;\r\n}\r\n\r\nvoid \r\nnormalize4_c(float v[4], float d[4])\r\n{\r\n\tfloat b, c, x;\r\n\tunion {\r\n\t\tfloat \tf;\r\n\t\tint \ti;\r\n\t} a;\r\n\t\r\n\tx = v[0]*v[0];\r\n\tx += v[1]*v[1];\r\n\tx += v[2]*v[2];\r\n\tx += v[3]*v[3];\r\n\r\n\t//fast invsqrt approx\r\n\ta.f = x;\r\n\ta.i = 0x5F3759DF - (a.i >> 1);\t\t//VRSQRTE\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\t\t//VRSQRTS\r\n\ta.f = a.f * b;\t\t\r\n\tc = x * a.f;\r\n\tb = (3.0f - c * a.f) * 0.5;\r\n    a.f = a.f * b;\t\r\n\r\n\td[0] = v[0]*a.f;\r\n\td[1] = v[1]*a.f;\r\n\td[2] = v[2]*a.f;\r\n\td[3] = v[3]*a.f;\r\n}\r\n\r\nvoid \r\nnormalize4_neon(float v[4], float d[4])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d4, d5}, [%0]\t\t\t\\n\\t\"\t//d2={x0,y0}, d3={z0, w0}\r\n\t\"vmul.f32 \t\td0, d4, d4\t\t\t\t\\n\\t\"\t//d0= d4*d4\r\n\t\"vmla.f32 \t\td0, d5, d5\t\t\t\t\\n\\t\"\t//d0 = d0 + d5*d5 \r\n\t\"vpadd.f32 \t\td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = d[0] + d[1]\r\n\t\r\n\t\"vmov.f32 \t\td1, d0\t\t\t\t\t\\n\\t\"\t//d1 = d0\r\n\t\"vrsqrte.f32 \td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = ~ 1.0 / sqrt(d0)\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d3 = (3 - d0 * d2) / 2 \t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d3\r\n\t\"vmul.f32 \t\td2, d0, d1\t\t\t\t\\n\\t\"\t//d2 = d0 * d1\t\r\n\t\"vrsqrts.f32 \td3, d2, d0\t\t\t\t\\n\\t\"\t//d4 = (3 - d0 * d3) / 2\t\r\n\t\"vmul.f32 \t\td0, d0, d3\t\t\t\t\\n\\t\"\t//d0 = d0 * d4\t\r\n\r\n\t\"vmul.f32 \t\tq2, q2, d0[0]\t\t\t\\n\\t\"\t//d0= d2*d4\r\n\t\"vst1.32 \t\t{d4, d5}, [%1]\t\t\t\\n\\t\"\t//d2={x0,y0}, d3={z0, w0}\r\n\t\r\n\t:: \"r\"(v), \"r\"(d) \r\n    : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"d5\", \"memory\"\r\n\t);\t\r\n#else\r\n\tnormalize4_c(v, d);\r\n#endif\r\n\r\n}\r\n\r\n\r\nfloat \r\ndot4_neon_hfp(float v0[4], float v1[4])\r\n{\r\n#ifdef __MATH_NEON\r\n\tasm volatile (\r\n\t\"vld1.32 \t\t{d2, d3}, [%0]\t\t\t\\n\\t\"\t//d2={x0,y0}, d3={z0, w0}\r\n\t\"vld1.32 \t\t{d4, d5}, [%1]\t\t\t\\n\\t\"\t//d4={x1,y1}, d5={z1, w1}\r\n\t\"vmul.f32 \t\td0, d2, d4\t\t\t\t\\n\\t\"\t//d0= d2*d4\r\n\t\"vmla.f32 \t\td0, d3, d5\t\t\t\t\\n\\t\"\t//d0 = d0 + d3*d5 \r\n\t\"vpadd.f32 \t\td0, d0\t\t\t\t\t\\n\\t\"\t//d0 = d[0] + d[1]\r\n\t:: \"r\"(v0), \"r\"(v1) : \r\n\t);\t\r\n#endif\r\n}\r\n\r\n#if 0 //funky ifdef problem... figure out later\r\n\r\nfloat32_t \r\ndot4_neon(float32x4_t v0, float32x4_t v1)\r\n{\t\r\n\tfloat32x2_t a, b, c, d, r;\r\n\ta = vget_high_f32(v0);\r\n\tb = vget_low_f32(v0);\r\n\tc = vget_high_f32(v1);\r\n\td = vget_low_f32(v1);\r\n\t\r\n\tr = vmul_f32(a, c);\r\n\tr = vmla_f32(r, b, d);\r\n\tr = vpadd_f32(r, r);\r\n\treturn vget_lane_f32(r, 0);\r\n}\r\n\r\nfloat \r\ndot4_neon_sfp(float v0[4], float v1[4])\r\n{\r\n#ifdef __MATH_NEON\r\n\tdot4_neon_hfp(v0, v1);\r\n\tasm volatile (\"vmov.f32 r0, s0 \t\t\\n\\t\");\r\n#else\r\n\treturn dot4_c(v0, v1);\r\n#endif\r\n};\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/mic.cpp",
    "content": "/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n/*\r\n\tThe NDS microphone produces 8-bit sound sampled at 16khz.\r\n\tThe sound data must be read sample-by-sample through the \r\n\tARM7 SPI device (touchscreen controller, channel 6).\r\n\r\n\tNote : I added these notes because the microphone isn't \r\n\tdocumented on GBATek.\r\n*/\r\n\r\n#include \"../mic.h\"\r\n#include \"readwrite.h\"\r\n#include \"main.h\"\r\n\r\n#include <SLES/OpenSLES.h>\r\n#include <SLES/OpenSLES_Android.h>\r\n\r\nextern SLObjectItf engineObject;\r\nextern SLEngineItf engineEngine;\r\n\r\nstatic SLObjectItf recorderObject = NULL;\r\nstatic SLRecordItf recorderRecord = NULL;\r\nstatic SLAndroidSimpleBufferQueueItf bqRecordBufferQueue;\r\nstatic bool samplesReady = false;\r\n\r\n#define MAX_NUMBER_INTERFACES 5 \r\n#define MAX_NUMBER_INPUT_DEVICES 3\r\n\r\n#define FAILED(X) (X) != SL_RESULT_SUCCESS\r\n\r\n#define MIC_BUFSIZE 2048\r\n\r\nstatic BOOL Mic_Inited = FALSE;\r\n\r\nstatic s16 Mic_Buffer[2][MIC_BUFSIZE];\r\n\r\nstatic int fullBuffer = -1;\r\nstatic int recordingBuffer = -1;\r\nstatic int fullBufferPos = 0;\r\n\r\n#define JNI(X,...) Java_com_opendoorstudios_ds4droid_DeSmuME_##X(JNIEnv* env, jclass* clazz, __VA_ARGS__)\r\n#define JNI_NOARGS(X) Java_com_opendoorstudios_ds4droid_DeSmuME_##X(JNIEnv* env, jclass* clazz)\r\n\r\nbool enableMicrophone = false;\r\n\r\nint lastBufferTime;\r\n\r\nvoid bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context)\r\n{\r\n\tint nextBuffer = recordingBuffer == 1 ? 0 : 1;\r\n\t(*bqRecordBufferQueue)->Enqueue(bqRecordBufferQueue, Mic_Buffer[nextBuffer], MIC_BUFSIZE * sizeof(s16));\r\n\tif(recordingBuffer != -1)\r\n\t{\r\n\t\tfullBufferPos = 0;\r\n\t\tfullBuffer = recordingBuffer;\r\n\t\t/*float bufferTime = GetTickCount() - lastBufferTime;\r\n\t\tbufferTime = 1000.0 / bufferTime;\r\n\t\tbufferTime *= MIC_BUFSIZE;*/\r\n\t\t//LOGI(\"Approx mic sample rate is %d\", (int)bufferTime);\r\n\t}\r\n\trecordingBuffer = nextBuffer;\r\n\t//lastBufferTime = GetTickCount();\r\n}\r\n\r\nextern \"C\"\r\n{\r\n\r\nvoid JNI(setMicPaused, int set)\r\n{\r\n\tif(Mic_Inited == TRUE)\r\n\t{\r\n\t\tif(set == 1)\r\n\t\t{\r\n\t\t\t(*recorderRecord)->SetRecordState(recorderRecord,SL_RECORDSTATE_STOPPED);\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t\tMic_Reset();\r\n\t\t\t(*recorderRecord)->SetRecordState(recorderRecord,SL_RECORDSTATE_RECORDING);\r\n\t\t\tbqRecorderCallback(bqRecordBufferQueue, NULL);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n}\r\n\r\nvoid Mic_DeInit()\r\n{\r\n\tif (recorderObject != NULL) {\r\n        (*recorderObject)->Destroy(recorderObject);\r\n\t\trecorderObject = NULL;\r\n\t}\r\n\t\r\n\t/*if (engineObject != NULL) {\r\n        (*engineObject)->Destroy(engineObject);\r\n\t\tengineObject = NULL;\r\n\t}*/\r\n\t\r\n\tMic_Inited = FALSE;\r\n}\r\n\r\nBOOL Mic_Init()\r\n{\r\n\tif(!enableMicrophone)\r\n\t\treturn FALSE;\r\n\tif(Mic_Inited == TRUE)\r\n\t\treturn TRUE;\r\n\tSLresult result;\r\n\tSLuint32 InputDeviceIDs[MAX_NUMBER_INPUT_DEVICES]; \r\n\tSLint32   numInputs = 0; \r\n\tSLboolean mic_available = SL_BOOLEAN_FALSE; \r\n\tSLuint32 mic_deviceID = 0; \r\n\tSLAudioIODeviceCapabilitiesItf AudioIODeviceCapabilitiesItf; \r\n\tSLAudioInputDescriptor        AudioInputDescriptor;\r\n\t\r\n\tMic_Inited = FALSE;\r\n\t\r\n\t//Some devices silently (literally haha) fail if you create multiple OpenSL ES instances.\r\n\t//So now we share it with the regular audio output driver\r\n\tif(engineObject == NULL)\r\n\t{\r\n\t\tif(FAILED(result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL)))\r\n\t\t\treturn FALSE;\r\n\r\n\t\tif(FAILED(result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE)))\r\n\t\t\treturn FALSE;\r\n\r\n\t\tif(FAILED(result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine)))\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\t\t\r\n\tSLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE,\r\n                      SL_IODEVICE_AUDIOINPUT,\r\n                      SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};\r\n\tSLDataSource audioSrc = {&loc_dev, NULL};\r\n\r\n\tSLDataLocator_AndroidSimpleBufferQueue loc_bq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};\r\n\t\r\n\t//it seems that at least on my phone (galaxy nexus) the mic samples are always 16 bits, regardless of what you ask for\r\n\t//the sampling rate does seem to be honored, though\r\n\tSLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_16,\r\n\t\t\t  SL_PCMSAMPLEFORMAT_FIXED_16 , SL_PCMSAMPLEFORMAT_FIXED_16 ,\r\n\t\t\t  SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};\r\n\t\t\t  \r\n\tSLDataSink audioSnk = {&loc_bq, &format_pcm};\r\n\t\r\n\tconst SLInterfaceID id[1] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE};\r\n\tconst SLboolean req[1] = {SL_BOOLEAN_TRUE};\r\n\t\r\n\tif(FAILED(result = (*engineEngine)->CreateAudioRecorder(engineEngine, &recorderObject, &audioSrc, &audioSnk, 1, id, req)))\r\n\t\treturn FALSE;\r\n\r\n\tif(FAILED(result = (*recorderObject)->Realize(recorderObject, SL_BOOLEAN_FALSE)))\r\n\t\treturn FALSE;\r\n\r\n\tif(FAILED(result = (*recorderObject)->GetInterface(recorderObject, SL_IID_RECORD, &recorderRecord)))\r\n\t\treturn FALSE;\r\n\t\t\r\n\tif(FAILED(result = (*recorderObject)->GetInterface(recorderObject, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &bqRecordBufferQueue)))\r\n\t\treturn FALSE;\r\n\t\t\r\n\tif(FAILED(result = (*bqRecordBufferQueue)->RegisterCallback(bqRecordBufferQueue, bqRecorderCallback, NULL)))\r\n\t\treturn FALSE;\r\n\t\t\r\n\tif(FAILED(result = (*recorderRecord)->SetRecordState(recorderRecord,SL_RECORDSTATE_RECORDING)))\r\n\t\treturn FALSE;\r\n\t\t\r\n\tMic_Reset();\r\n\t\r\n\tbqRecorderCallback(bqRecordBufferQueue, NULL);\r\n\t\r\n\tLOGI(\"OpenSL created (for audio input)\");\r\n\treturn Mic_Inited = TRUE;\r\n}\r\n\r\nvoid Mic_Reset()\r\n{\r\n\trecordingBuffer = fullBuffer = -1;\r\n\tfullBufferPos = 0;\r\n\t\r\n\tif(!Mic_Inited)\r\n\t\treturn;\r\n\r\n\tmemset(Mic_Buffer[0], 0x80, MIC_BUFSIZE);\r\n\tmemset(Mic_Buffer[1], 0x80, MIC_BUFSIZE);\r\n}\r\n\r\nu8 Mic_ReadSample()\r\n{\r\n\tu8 ret = 0;\r\n\t//static u8 print = 0;\r\n\tif(Mic_Inited == TRUE && fullBuffer != -1)\r\n\t{\r\n\t\tconst s16 original = Mic_Buffer[fullBuffer][fullBufferPos];\r\n\t\ts16 sixteen = original;\r\n\t\tsixteen /= 256; //16 bit -> 8 bit\r\n\t\tsixteen += 128; //pcm 8 bit encoding midpoint is 127, while it's signed 0 for 16-bit\r\n\t\tret = (u8)sixteen;\r\n\t\tif(fullBufferPos != (MIC_BUFSIZE-1))\r\n\t\t\t++fullBufferPos;\r\n\t\t/*if(++print == 10)\r\n\t\t{\r\n\t\t\tLOGI(\"Sound: original = %i, sixteen = %i, ret = %x\", (int)original, (int)sixteen, (int)ret);\r\n\t\t\tprint = 0;\r\n\t\t}*/\r\n\t\t\r\n\t}\r\n\treturn ret;\r\n\r\n}\r\n\r\nvoid mic_savestate(EMUFILE* os)\r\n{\r\n\twrite32le(-1,os);\r\n}\r\n\r\nbool mic_loadstate(EMUFILE* is, int size)\r\n{\r\n\tis->fseek(size, SEEK_CUR);\r\n\treturn TRUE;\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/neontest.cpp",
    "content": "/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"neontest.h\"\r\nextern \"C\" {\r\n#include \"math-neon/math_neon.h\"\r\n}\r\n#include \"../matrix.h\"\r\n#include \"main.h\"\r\n#include <stdio.h>\r\n#include <string.h>\r\n\r\ntemplate<int WIDTH, int HEIGHT> void printmatrix(float* matrix)\r\n{\r\n\tfor(int y = 0 ; y < HEIGHT ; ++y )\r\n\t{\r\n\t\tchar line[1024], work[1024];\r\n\t\tstrcpy(line,\"|\");\r\n\t\tfor(int x = 0 ; x < WIDTH ; ++x)\r\n\t\t{\r\n\t\t\tsprintf(work, \"%.2f%s\", matrix[(y * WIDTH) + x], x == WIDTH - 1 ? \"|\" : \", \");\r\n\t\t\tstrcat(line, work);\r\n\t\t}\r\n\t\tLOGI(\"%s\", line);\r\n\t}\r\n}\r\n\r\nvoid MatrixMultVec4x4Neon(float *matrix, float *vecPtr)\r\n{\r\n\tmatvec4_neon(matrix, vecPtr, vecPtr);\r\n}\r\n\r\nvoid MatrixMultVec3x3Neon(float *matrix, float *vecPtr)\r\n{\r\n\t//fails... looks like it's still packed like a 4x4 in matrix.cpp\r\n\tmatvec3_neon(matrix, vecPtr, vecPtr);\r\n}\r\n\r\nvoid MatrixMultiplyNeon(float * matrix, float * rightMatrix)\r\n{\r\n\tfloat ret[16];\r\n\tmatmul4_neon(matrix, rightMatrix, ret);\r\n\tmemcpy(matrix, ret, sizeof(float)*16);\r\n}\r\n\r\nvoid MatrixMultVec4x4_M2Neon(float *matrix, float *vecPtr)\r\n{\r\n\tmatvec4_neon(matrix+16, vecPtr, vecPtr);\r\n\tmatvec4_neon(matrix, vecPtr, vecPtr);\r\n}\r\n\r\nvoid testmultvec4x4()\r\n{\r\n\tLOGI(\"MatrixMultVec4x4\");\r\n\tfloat matrix1[] = {\r\n\t\t1.0f, 2.0f, 3.0f, 4.0f,\r\n\t\t5.0f, 6.0f, 7.0f, 8.0f,\r\n\t\t9.0f, 10.0f, 11.0f, 12.0f,\r\n\t\t13.0f, 14.0f, 15.0f, 16.0f\r\n\t};\r\n\t\r\n\tfloat vector[] = {\r\n\t\tM_PI,\r\n\t\tM_E,\r\n\t\tM_LN2,\r\n\t\tM_SQRT2\r\n\t};\r\n\t\r\n\tfloat vectorc[4], vectorneon[4];\r\n\t\r\n\tmemcpy(vectorc, vector, sizeof(float)* 4 );\r\n\tmemcpy(vectorneon, vector, sizeof(float)* 4 );\r\n\t\r\n\tprintmatrix<4,4>(matrix1);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,1>(vectorc);\r\n\tMatrixMultVec4x4(matrix1, vectorc);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<4,1>(vectorc);\t\r\n\t\r\n\tprintmatrix<4,4>(matrix1);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,1>(vectorneon);\r\n\tMatrixMultVec4x4Neon(matrix1, vectorneon);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<4,1>(vectorneon);\t\r\n}\r\nvoid testmultvec3x3()\r\n{\r\n\tLOGI(\"MatrixMultVec3x3\");\r\n\tfloat matrix1[] = {\r\n\t\t1.0f, 2.0f, 3.0f, \r\n\t\t5.0f, 6.0f, 7.0f,\r\n\t\t9.0f, 10.0f, 11.0f, \r\n\t};\r\n\t\r\n\tfloat vector[] = {\r\n\t\tM_PI,\r\n\t\tM_E,\r\n\t\tM_LN2,\r\n\t};\r\n\t\r\n\tfloat vectorc[3], vectorneon[3];\r\n\t\r\n\tmemcpy(vectorc, vector, sizeof(float)* 3 );\r\n\tmemcpy(vectorneon, vector, sizeof(float)* 3 );\r\n\t\r\n\tprintmatrix<3,3>(matrix1);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<3,1>(vectorc);\r\n\tMatrixMultVec3x3(matrix1, vectorc);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<3,1>(vectorc);\t\r\n\t\r\n\tprintmatrix<3,3>(matrix1);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<3,1>(vectorneon);\r\n\tMatrixMultVec3x3Neon(matrix1, vectorneon);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<3,1>(vectorneon);\t\r\n}\r\n\r\nvoid testmatrixmul()\r\n{\r\n\tLOGI(\"MatrixMultiply\");\r\n\t\r\n\tfloat matrix1[] = {\r\n\t\t1.0f, 2.0f, 3.0f, 4.0f,\r\n\t\t5.0f, 6.0f, 7.0f, 8.0f,\r\n\t\t9.0f, 10.0f, 11.0f, 12.0f,\r\n\t\t13.0f, 14.0f, 15.0f, 16.0f\r\n\t};\r\n\t\r\n\tfloat matrix2[] = {\r\n\t\t17.0f, 18.0f, 19.0f, 20.0f,\r\n\t\t21.0f, 22.0f, 23.0f, 24.0f,\r\n\t\t25.0f, 26.0f, 27.0f, 28.0f,\r\n\t\t29.0f, 30.0f, 31.0f, 32.0f\r\n\t};\r\n\t\r\n\tfloat matrixc[16], matrixneon[16];\r\n\t\r\n\tmemcpy(matrixc, matrix1, sizeof(float)* 16 );\r\n\tmemcpy(matrixneon, matrix1, sizeof(float)* 16 );\r\n\t\r\n\tprintmatrix<4,4>(matrixc);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,4>(matrix2);\r\n\tMatrixMultiply(matrixc, matrix2);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<4,4>(matrixc);\t\r\n\t\r\n\tprintmatrix<4,4>(matrixneon);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,4>(matrix2);\r\n\tMatrixMultiplyNeon(matrixneon, matrix2);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<4,4>(matrixneon);\t\r\n}\r\n\r\nvoid testmultvec4x4_m2()\r\n{\r\n\tLOGI(\"MatrixMultVec4x4_M2\");\r\n\tfloat matrix1[] = {\r\n\t\t1.0f, 2.0f, 3.0f, 4.0f,\r\n\t\t5.0f, 6.0f, 7.0f, 8.0f,\r\n\t\t9.0f, 10.0f, 11.0f, 12.0f,\r\n\t\t13.0f, 14.0f, 15.0f, 16.0f,\r\n\t\t17.0f, 18.0f, 19.0f, 20.0f,\r\n\t\t21.0f, 22.0f, 23.0f, 24.0f,\r\n\t\t25.0f, 26.0f, 27.0f, 28.0f,\r\n\t\t29.0f, 30.0f, 31.0f, 32.0f\r\n\t};\r\n\t\r\n\tfloat vector[] = {\r\n\t\tM_PI,\r\n\t\tM_E,\r\n\t\tM_LN2,\r\n\t\tM_SQRT2\r\n\t};\r\n\t\r\n\tfloat vectorc[4], vectorneon[4];\r\n\t\r\n\tmemcpy(vectorc, vector, sizeof(float)* 4 );\r\n\tmemcpy(vectorneon, vector, sizeof(float)* 4 );\r\n\t\r\n\tprintmatrix<4,4>(matrix1);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,4>(matrix1+16);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,1>(vectorc);\r\n\tMatrixMultVec4x4_M2(matrix1, vectorc);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<4,1>(vectorc);\t\r\n\t\r\n\tprintmatrix<4,4>(matrix1);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,4>(matrix1+16);\r\n\tLOGI(\"*\");\r\n\tprintmatrix<4,1>(vectorneon);\r\n\tMatrixMultVec4x4_M2Neon(matrix1, vectorneon);\r\n\tLOGI(\"=\");\r\n\tprintmatrix<4,1>(vectorneon);\t\r\n}\r\n\r\nvoid neontest()\r\n{\r\n\t//testmultvec4x4();\r\n\t//testmatrixmul();\r\n\t//testmultvec4x4_m2();\r\n\ttestmultvec3x3();\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/neontest.h",
    "content": "#ifndef _NEONTEST_H\r\n#define _NEONTEST_H\r\n\r\nvoid neontest();\r\n\r\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/ogl.cpp",
    "content": "/*\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/sndopensl.cpp",
    "content": "/*\tsndopensl.cpp\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"SPU.h\"\r\n#include \"sndopensl.h\"\r\n#include \"main.h\"\r\n\r\n#include <SLES/OpenSLES.h>\r\n#include <SLES/OpenSLES_Android.h>\r\n\r\nint SNDOpenSLInit(int buffersize);\r\nvoid SNDOpenSLDeInit();\r\nvoid SNDOpenSLUpdateAudio(s16 *buffer, u32 num_samples);\r\nu32 SNDOpenSLGetAudioSpace();\r\nvoid SNDOpenSLMuteAudio();\r\nvoid SNDOpenSLUnMuteAudio();\r\nvoid SNDOpenSLSetVolume(int volume);\r\nvoid SNDOpenSLClearAudioBuffer();\r\n\r\nSoundInterface_struct SNDOpenSL = {\r\n\tSNDCORE_OPENSL,\r\n\t\"OpenSL ES Sound Interface\",\r\n\tSNDOpenSLInit,\r\n\tSNDOpenSLDeInit,\r\n\tSNDOpenSLUpdateAudio,\r\n\tSNDOpenSLGetAudioSpace,\r\n\tSNDOpenSLMuteAudio,\r\n\tSNDOpenSLUnMuteAudio,\r\n\tSNDOpenSLSetVolume,\r\n\tSNDOpenSLClearAudioBuffer,\r\n};\r\n\r\n#define FAILED(X) (X) != SL_RESULT_SUCCESS\r\n\r\nSLObjectItf engineObject = NULL;\r\nSLEngineItf engineEngine;\r\nstatic SLObjectItf outputMixObject = NULL;\r\nstatic SLObjectItf bqPlayerObject = NULL;\r\nstatic SLPlayItf bqPlayerPlay;\r\nstatic SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue;\r\nstatic SLVolumeItf bqPlayerVolume;\r\nstatic bool everEnqueued = false;\r\n\r\n\r\nclass SoundBuffer\r\n{\r\npublic:\r\n\tSoundBuffer() : data(NULL)\r\n\t{\r\n\t\treset();\r\n\t}\r\n\t~SoundBuffer()\r\n\t{\r\n\t\treset();\r\n\t}\r\n\tvoid reset()\r\n\t{\r\n\t\tif(data != NULL)\r\n\t\t\tdelete [] data;\r\n\t\tdata = NULL;\r\n\t\tavail = true;\r\n\t\tsamples = 0;\r\n\t}\r\n\ts16* data;\r\n\tbool avail;\r\n\tint samples;\r\n};\r\n\r\nstatic const int NUM_BUFFERS = 2;\r\nSoundBuffer buffers[NUM_BUFFERS];\r\nSoundBuffer empty;\r\n\r\nstatic bool muted = false;\r\nstatic bool currentlyPlaying = false;\r\nstatic int soundbufsize = 0;\r\nstatic int nextSoundBuffer = -1;\r\nstatic SLmillibel maxVol;\r\n\r\nvoid bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context)\r\n{\r\n\tSLresult result;\r\n\tif(buffers[nextSoundBuffer].avail)\r\n\t{\r\n\t\tresult = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, empty.data, soundbufsize);\r\n\t\t//LOGI(\"Returned empty sound buffer\");\r\n\t\treturn;\r\n\t}\r\n\t//LOGI(\"Returned sound buffer %d\", nextSoundBuffer);\r\n\tresult = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, buffers[nextSoundBuffer].data, buffers[nextSoundBuffer].samples * sizeof(s16) * 2);\r\n\tbuffers[nextSoundBuffer == 0 ? 1 : 0].avail = true;\r\n}\r\n\r\nint SNDOpenSLInit(int buffersize)\r\n{\r\n\t\r\n\tSLresult result;\r\n\t\r\n\tif(engineObject == NULL)\r\n\t{\r\n\t\tif(FAILED(result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL)))\r\n\t\t\treturn -1;\r\n\r\n\t\tif(FAILED(result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE)))\r\n\t\t\treturn -1;\r\n\r\n\t\tif(FAILED(result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine)))\r\n\t\t\treturn -1;\r\n\t}\r\n\r\n    const SLInterfaceID mixids[1] = {SL_IID_VOLUME};\r\n    const SLboolean mixreq[1] = {SL_BOOLEAN_FALSE};\r\n    if(FAILED(result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, mixids, mixreq)))\r\n\t\treturn -1;\r\n\r\n    if(FAILED(result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE)))\r\n\t\treturn -1;\r\n\r\n\tSLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};\r\n\tSLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2, SL_SAMPLINGRATE_44_1,\r\n        SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,\r\n        SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT, SL_BYTEORDER_LITTLEENDIAN};\r\n\t\t\t\t   \r\n\tSLDataSource audioSrc = {&loc_bufq, &format_pcm};\r\n\tSLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, outputMixObject};\r\n    SLDataSink audioSnk = {&loc_outmix, NULL};\r\n\t\r\n    const SLInterfaceID playerids[2] = {SL_IID_BUFFERQUEUE, SL_IID_VOLUME};\r\n    const SLboolean playerreq[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};\r\n    if(FAILED(result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk, 2, playerids, playerreq)))\r\n\t\treturn -1;\r\n\t\t\r\n    if(FAILED(result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE)))\r\n\t\treturn -1;\r\n\r\n    if(FAILED((*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay)))\r\n\t\treturn -1;\r\n\r\n    if(FAILED(result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE, &bqPlayerBufferQueue)))\r\n\t\treturn -1;\r\n\t\t\r\n    if(FAILED((*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, NULL)))\r\n\t\treturn -1;\r\n\t\t\r\n    if(FAILED(result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume)))\r\n\t\treturn -1;\r\n\t\t\r\n\tif(FAILED(result = (*bqPlayerVolume)->GetMaxVolumeLevel(bqPlayerVolume, &maxVol)))\r\n\t\treturn -1;\r\n\t\t\r\n    if(FAILED(result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING)))\r\n\t\treturn -1;\r\n\t\t\r\n\tbuffers[0].reset();\r\n\tbuffers[1].reset();\r\n\tsoundbufsize = buffersize;\r\n\tif ((buffers[0].data = new s16[soundbufsize / sizeof(s16)]) == NULL)\r\n\t\treturn -1;\r\n\tif ((buffers[1].data = new s16[soundbufsize / sizeof(s16)]) == NULL)\r\n\t\treturn -1;\r\n\tif ((empty.data = new s16[soundbufsize / sizeof(s16)]) == NULL)\r\n\t\treturn -1;\r\n\r\n\tmemset(buffers[0].data, 0, soundbufsize);\r\n\tmemset(buffers[1].data, 0, soundbufsize);\r\n\tmemset(empty.data, 0, soundbufsize);\r\n\tmuted = false;\r\n\tcurrentlyPlaying = false;\r\n\tLOGI(\"OpenSL created (for audio output)\");\r\n\treturn 0;\r\n}\r\n\r\nvoid SNDOpenSLDeInit()\r\n{\r\n\tif (bqPlayerObject != NULL) {\r\n        (*bqPlayerObject)->Destroy(bqPlayerObject);\r\n\t\tbqPlayerObject = NULL;\r\n\t}\r\n\t\r\n\tif (outputMixObject != NULL) {\r\n        (*outputMixObject)->Destroy(outputMixObject);\r\n        outputMixObject = NULL;\r\n\t}\r\n\t\r\n\t/*if (engineObject != NULL) {\r\n        (*engineObject)->Destroy(engineObject);\r\n\t\tengineObject = NULL;\r\n\t}*/\r\n}\r\n\r\nvoid SNDOpenSLUpdateAudio(s16 *buffer, u32 num_samples)\r\n{\r\n\tfor(int i = 0 ; i < NUM_BUFFERS ; ++i)\r\n\t{\r\n\t\tif(buffers[i].avail)\r\n\t\t{\r\n\t\t\tmemcpy(buffers[i].data, buffer, sizeof(s16) * 2 * num_samples);\r\n\t\t\tint currentSoundBuffer = nextSoundBuffer;\r\n\t\t\tbuffers[i].samples = num_samples;\r\n\t\t\tbuffers[i].avail = false;\r\n\t\t\tnextSoundBuffer = i;\r\n\t\t\tif(!currentlyPlaying)\r\n\t\t\t{\r\n\t\t\t\t(*bqPlayerBufferQueue)->Clear(bqPlayerBufferQueue);\r\n\t\t\t\tbqPlayerCallback(bqPlayerBufferQueue, NULL);\r\n\t\t\t\tcurrentlyPlaying = true;\r\n\t\t\t}\r\n\t\t\t//LOGI(\"Copied %d samples to buffer %d\", num_samples, nextSoundBuffer);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\t//should never get here...\r\n}\r\n\r\nu32 SNDOpenSLGetAudioSpace()\r\n{\r\n\tfor(int i = 0 ; i < NUM_BUFFERS ; ++i)\r\n\t{\r\n\t\tif(buffers[i].avail)\r\n\t\t\treturn soundbufsize / (sizeof(s16) * 2);\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nvoid SNDOpenSLMuteAudio()\r\n{\r\n\t(*bqPlayerVolume)->SetMute(bqPlayerVolume, true);\r\n}\r\n\r\nvoid SNDOpenSLUnMuteAudio()\r\n{\r\n\t(*bqPlayerVolume)->SetMute(bqPlayerVolume, false);\r\n}\r\n\r\nvoid SNDOpenSLSetVolume(int volume)\r\n{\r\n\tSLmillibel level = 0;\r\n\tif(volume == 100)\r\n\t\tlevel = maxVol;\r\n\telse if(volume > 0)\r\n\t\tlevel = maxVol / (100 - volume - 1);\r\n\t(*bqPlayerVolume)->SetVolumeLevel(bqPlayerVolume, level);\r\n}\r\n\r\nvoid SNDOpenSLClearAudioBuffer()\r\n{\r\n\tfor(int i = 0 ; i < NUM_BUFFERS ; ++i)\r\n\t\tmemset(buffers[i].data, 0, soundbufsize);\r\n}\r\n\r\nvoid SNDOpenSLPaused(bool paused)\r\n{\r\n\tif(bqPlayerPlay == NULL)\r\n\t\treturn;\r\n\t(*bqPlayerPlay)->SetPlayState(bqPlayerPlay, paused ? SL_PLAYSTATE_STOPPED : SL_PLAYSTATE_PLAYING);\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/sndopensl.h",
    "content": "/*\tsndopensl.h\r\n\tCopyright (C) 2012 Jeffrey Quesnelle\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _SNDOPENSL_H\r\n#define _SNDOPENSL_H\r\n\r\n#define SNDCORE_OPENSL 1\r\n\r\nextern SoundInterface_struct SNDOpenSL;\r\n\r\nvoid SNDOpenSLPaused(bool paused);\r\n\r\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/throttle.cpp",
    "content": "//THIS SPEED THROTTLE WAS TAKEN FROM FCEUX.\r\n//Copyright (C) 2002 Xodnizel\r\n//(the code might look quite different by now, though...)\r\n\r\n/*\r\n\tMany Modifications Copyright (C) 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"../common.h\"\r\n#include \"../types.h\"\r\n#include \"../debug.h\"\r\n#ifndef ANDROID\r\n#include \"../console.h\"\r\n#endif\r\n#include \"throttle.h\"\r\n#include \"GPU_osd.h\"\r\n\r\nint FastForward=0;\r\nstatic u64 tmethod,tfreq,afsfreq;\r\nstatic const u64 core_desiredfps = 3920763; //59.8261\r\nstatic u64 desiredfps = core_desiredfps;\r\nstatic float desiredspf = 65536.0f / core_desiredfps;\r\n#ifdef ANDROID\r\nstatic int desiredFpsScalerIndex = 5;\r\n#else\r\nstatic int desiredFpsScalerIndex = GetPrivateProfileInt(\"Video\",\"FPS Scaler Index\", 5, IniName);\r\n#endif\r\n\r\nstatic u64 desiredFpsScalers [] = {\r\n\t1024,\r\n\t512, // 200%\r\n\t448, // 175%\r\n\t384, // 150%\r\n\t320, // 125%\r\n\t256, // 100%\r\n\t192,\r\n\t128, // 50%\r\n\t96,\r\n\t64, // 25%\r\n\t42,\r\n\t32,\r\n\t16,\r\n};\r\n\r\n#ifdef ANDROID\r\n#include <sys/time.h>\r\n#include <time.h>\r\n#include <android/log.h>\r\nunsigned int GetTickCount()\r\n{\r\n\ttimeval timer;\r\n\tgettimeofday(&timer, NULL);\r\n\treturn (timer.tv_sec * 1000) + (timer.tv_usec/1000);\r\n}\r\n\r\n#if 0\r\nunsigned long long RawGetTickCount()\r\n{\r\n\treturn clock();\r\n}\r\n\r\nunsigned long long RawGetTickPerSecond()\r\n{\r\n\treturn (unsigned long long)CLOCKS_PER_SEC;\r\n}\r\n#else\r\nunsigned long long RawGetTickCount()\r\n{\r\n\ttimespec timer;\r\n\tclock_gettime(CLOCK_MONOTONIC, &timer);\r\n\treturn ((unsigned long long)timer.tv_sec * 1000000000ULL) + timer.tv_nsec;\r\n}\r\n\r\nunsigned long long RawGetTickPerSecond()\r\n{\r\n\treturn 1000000000ULL;\r\n}\r\n#endif\r\n\r\nvoid Sleep(int ms)\r\n{\r\n\t//__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"Sleep of %i ms\",ms);\r\n\tusleep(ms * 1000);\r\n}\r\n\r\n#endif\r\n\r\nvoid IncreaseSpeed(void) {\r\n\r\n\tif(desiredFpsScalerIndex)\r\n\t\tdesiredFpsScalerIndex--;\r\n\tu64 desiredFpsScaler = desiredFpsScalers[desiredFpsScalerIndex];\r\n\tdesiredfps = core_desiredfps * desiredFpsScaler / 256;\r\n\tdesiredspf = 65536.0f / desiredfps;\r\n\tprintf(\"Throttle fps scaling increased to: %f\\n\",desiredFpsScaler/256.0);\r\n\tosd->addLine(\"Target FPS up to %2.04f\",desiredFpsScaler/256.0);\r\n\t#ifndef ANDROID\r\n\tWritePrivateProfileInt(\"Video\",\"FPS Scaler Index\", desiredFpsScalerIndex, IniName);\r\n\t#endif\r\n}\r\n\r\nvoid DecreaseSpeed(void) {\r\n\r\n\tif(desiredFpsScalerIndex != sizeof(desiredFpsScalers)/sizeof(desiredFpsScalers[0]) - 1)\r\n\t\tdesiredFpsScalerIndex++;\r\n\tu64 desiredFpsScaler = desiredFpsScalers[desiredFpsScalerIndex];\r\n\tdesiredfps = core_desiredfps * desiredFpsScaler / 256;\r\n\tdesiredspf = 65536.0f / desiredfps;\r\n\tprintf(\"Throttle fps scaling decreased to: %f\\n\",desiredFpsScaler/256.0);\r\n\tosd->addLine(\"Target FPS down to %2.04f\",desiredFpsScaler/256.0);\r\n#ifndef ANDROID\r\n\tWritePrivateProfileInt(\"Video\",\"FPS Scaler Index\", desiredFpsScalerIndex, IniName);\r\n#endif\r\n}\r\n\r\nstatic u64 GetCurTime(void)\r\n{\r\n#ifndef ANDROID\r\n\tif(tmethod)\r\n\t{\r\n\t\tu64 tmp;\r\n\t\tQueryPerformanceCounter((LARGE_INTEGER*)&tmp);\r\n\t\treturn tmp;\r\n\t}\r\n\telse\r\n#endif\r\n\t{\r\n\t\treturn (u64)GetTickCount();\r\n\t}\r\n}\r\n\r\nvoid InitSpeedThrottle(void)\r\n{\r\n\ttmethod=0;\r\n#ifndef ANDROID\r\n\tif(QueryPerformanceFrequency((LARGE_INTEGER*)&afsfreq))\r\n\t\ttmethod=1;\r\n\telse\r\n#endif\r\n\t\tafsfreq=1000;\r\n\ttfreq = afsfreq << 16;\r\n\r\n\tAutoFrameSkip_IgnorePreviousDelay();\r\n}\r\n\r\nstatic void AutoFrameSkip_BeforeThrottle();\r\n\r\nstatic u64 ltime;\r\n\r\nvoid SpeedThrottle()\r\n{\r\n\tAutoFrameSkip_BeforeThrottle();\r\n\r\nwaiter:\r\n\tif(FastForward)\r\n\t\treturn;\r\n\r\n\tu64 ttime = GetCurTime();\r\n\r\n\tif((ttime - ltime) < (tfreq / desiredfps))\r\n\t{\r\n\t\tu64 sleepy;\r\n\t\tsleepy = (tfreq / desiredfps) - (ttime - ltime);  \r\n\t\tsleepy *= 1000;\r\n\t\tif(tfreq >= 65536)\r\n\t\t\tsleepy /= afsfreq;\r\n\t\telse\r\n\t\t\tsleepy = 0;\r\n\t\tif(sleepy >= 10)\r\n\t\t\tSleep((sleepy / 2)); // reduce it further beacuse Sleep usually sleeps for more than the amount we tell it to\r\n#ifndef ANDROID\r\n\t\telse if(sleepy > 0) // spin for <1 millisecond waits\r\n\t\t\tSwitchToThread(); // limit to other threads on the same CPU core for other short waits\r\n#endif\r\n\t\tgoto waiter;\r\n\t}\r\n\tif( (ttime-ltime) >= (tfreq*4/desiredfps))\r\n\t\tltime=ttime;\r\n\telse\r\n\t\tltime+=tfreq/desiredfps;\r\n}\r\n\r\n\r\n// auto frameskip\r\n\r\nstatic u64 beginticks=0, endticks=0, preThrottleEndticks=0;\r\nstatic float fSkipFrames = 0;\r\nstatic float fSkipFramesError = 0;\r\nstatic int lastSkip = 0;\r\nstatic float lastError = 0;\r\nstatic float integral = 0;\r\n\r\nvoid AutoFrameSkip_IgnorePreviousDelay()\r\n{\r\n\tbeginticks = GetCurTime();\r\n\r\n\t// this seems to be a stable way of allowing the skip frames to\r\n\t// quickly adjust to a faster environment (e.g. after a loadstate)\r\n\t// without causing oscillation or a sudden change in skip rate\r\n\tfSkipFrames *= 0.5f;\r\n}\r\n\r\nstatic void AutoFrameSkip_BeforeThrottle()\r\n{\r\n\tpreThrottleEndticks = GetCurTime();\r\n}\r\n\r\nvoid AutoFrameSkip_NextFrame()\r\n{\r\n\tendticks = GetCurTime();\r\n\r\n\t// calculate time since last frame\r\n\tu64 diffticks = endticks - beginticks;\r\n\tfloat diff = (float)diffticks / afsfreq;\r\n\r\n\t// calculate time since last frame not including throttle sleep time\r\n\tif(!preThrottleEndticks) // if we didn't throttle, use the non-throttle time\r\n\t\tpreThrottleEndticks = endticks;\r\n\tu64 diffticksUnthrottled = preThrottleEndticks - beginticks;\r\n\tfloat diffUnthrottled = (float)diffticksUnthrottled / afsfreq;\r\n\r\n\r\n\tfloat error = diffUnthrottled - desiredspf;\r\n\r\n\r\n\t// reset way-out-of-range values\r\n\tif(diff > 1)\r\n\t\tdiff = 1;\r\n\tif(error > 1 || error < -1)\r\n\t\terror = 0;\r\n\tif(diffUnthrottled > 1)\r\n\t\tdiffUnthrottled = desiredspf;\r\n\r\n\tfloat derivative = (error - lastError) / diff;\r\n\tlastError = error;\r\n\r\n\tintegral = integral + (error * diff);\r\n\tintegral *= 0.99f; // since our integral isn't reliable, reduce it to 0 over time.\r\n\r\n\t// \"PID controller\" constants\r\n\t// this stuff is probably being done all wrong, but these seem to work ok\r\n\tstatic const float Kp = 40.0f;\r\n\tstatic const float Ki = 0.55f;\r\n\tstatic const float Kd = 0.04f;\r\n\r\n\tfloat errorTerm = error * Kp;\r\n\tfloat derivativeTerm = derivative * Kd;\r\n\tfloat integralTerm = integral * Ki;\r\n\tfloat adjustment = errorTerm + derivativeTerm + integralTerm;\r\n\r\n\t// apply the output adjustment\r\n\tfSkipFrames += adjustment;\r\n\r\n\t// if we're running too slowly, prevent the throttle from kicking in\r\n\tif(adjustment > 0 && fSkipFrames > 0)\r\n\t\tltime-=tfreq/desiredfps;\r\n\r\n\tpreThrottleEndticks = 0;\r\n\tbeginticks = GetCurTime();\r\n}\r\n\r\nint AutoFrameSkip_GetSkipAmount(int min, int max)\r\n{\r\n\tint rv = (int)fSkipFrames;\r\n\tfSkipFramesError += fSkipFrames - rv;\r\n\r\n\t// resolve accumulated fractional error\r\n\t// where doing so doesn't push us out of range\r\n\twhile(fSkipFramesError >= 1.0f && rv <= lastSkip && rv < max)\r\n\t{\r\n\t\tfSkipFramesError -= 1.0f;\r\n\t\trv++;\r\n\t}\r\n\twhile(fSkipFramesError <= -1.0f && rv >= lastSkip && rv > min)\r\n\t{\r\n\t\tfSkipFramesError += 1.0f;\r\n\t\trv--;\r\n\t}\r\n\r\n\t// restrict skip amount to requested range\r\n\tif(rv < min)\r\n\t\trv = min;\r\n\tif(rv > max)\r\n\t\trv = max;\r\n\r\n\t// limit maximum error accumulation (it's mainly only for fractional components)\r\n\tif(fSkipFramesError >= 4.0f)\r\n\t\tfSkipFramesError = 4.0f;\r\n\tif(fSkipFramesError <= -4.0f)\r\n\t\tfSkipFramesError = -4.0f;\r\n\r\n\t// limit ongoing skipframes to requested range + 1 on each side\r\n\tif(fSkipFrames < min-1)\r\n\t\tfSkipFrames = (float)min-1;\r\n\tif(fSkipFrames > max+1)\r\n\t\tfSkipFrames = (float)max+1;\r\n\r\n//\tprintf(\"%d\", rv);\r\n\r\n\tlastSkip = rv;\r\n\treturn rv;\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/throttle.h",
    "content": "/*\r\n\tCopyright (C) 2008-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _THROTTLE_H_\r\n#define _THROTTLE_H_\r\n\r\nextern int FastForward;\r\nextern bool FrameLimit;\r\nvoid IncreaseSpeed();\r\nvoid DecreaseSpeed();\r\n\r\nvoid InitSpeedThrottle();\r\nvoid SpeedThrottle();\r\n\r\nvoid AutoFrameSkip_NextFrame();\r\nvoid AutoFrameSkip_IgnorePreviousDelay();\r\nint AutoFrameSkip_GetSkipAmount(int min=0, int max=9);\r\n\r\n#ifdef ANDROID\r\nunsigned int GetTickCount();\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/android/video.h",
    "content": "/*\r\n\tCopyright (C) 2009-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"filter/filter.h\"\r\n\r\nclass VideoInfo\r\n{\r\npublic:\r\n\r\n\tint width;\r\n\tint height;\r\n\r\n\tint rotation;\r\n\tint rotation_userset;\r\n\tint screengap;\r\n\tint layout;\r\n\tint layout_old;\r\n\tint\tswap;\r\n\r\n\tint currentfilter;\r\n\r\n\tCACHE_ALIGN u8* srcBuffer;\r\n\tCACHE_ALIGN u32 buffer[16*256*192*2];\r\n\tCACHE_ALIGN u32 filteredbuffer[16*256*192*2];\r\n\r\n\tenum {\r\n\t\tNONE,\r\n\t\tHQ2X,\r\n\t\t_2XSAI,\r\n\t\tSUPER2XSAI,\r\n\t\tSUPEREAGLE,\r\n\t\tSCANLINE,\r\n\t\tBILINEAR,\r\n\t\tNEAREST2X,\r\n\t\tHQ2XS,\r\n\t\tLQ2X,\r\n\t\tLQ2XS,\r\n        EPX,\r\n        NEARESTPLUS1POINT5,\r\n        NEAREST1POINT5,\r\n        EPXPLUS,\r\n        EPX1POINT5,\r\n        EPXPLUS1POINT5,\r\n    HQ4X,\r\n\r\n\t\tNUM_FILTERS,\r\n\t};\r\n\r\n\r\n\tvoid reset() {\r\n\t\twidth = 256;\r\n\t\theight = 384;\r\n\t}\r\n\r\n\tvoid setfilter(int filter) {\r\n\r\n\t\tif(filter < 0 || filter >= NUM_FILTERS)\r\n\t\t\tfilter = NONE;\r\n\r\n\t\tcurrentfilter = filter;\r\n\r\n\t\tswitch(filter) {\r\n\r\n\t\t\tcase NONE:\r\n\t\t\t\twidth = 256;\r\n\t\t\t\theight = 384;\r\n\t\t\t\tbreak;\r\n\t\t\tcase EPX1POINT5:\r\n\t\t\tcase EPXPLUS1POINT5:\r\n\t\t\tcase NEAREST1POINT5:\r\n\t\t\tcase NEARESTPLUS1POINT5:\r\n\t\t\t\twidth = 256*3/2;\r\n\t\t\t\theight = 384*3/2;\r\n\t\t\t\tbreak;\r\n      case HQ4X:\r\n\t\t\t\twidth = 256*4;\r\n\t\t\t\theight = 384*4;\r\n        break;\r\n\t\t\tdefault:\r\n\t\t\t\twidth = 256*2;\r\n\t\t\t\theight = 384*2;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tSSurface src;\r\n\tSSurface dst;\r\n\r\n\tu16* finalBuffer() const\r\n\t{\r\n\t\tif(currentfilter == NONE)\r\n\t\t\treturn (u16*)buffer;\r\n\t\telse return (u16*)filteredbuffer;\r\n\t}\r\n\r\n\tvoid filter() {\r\n\r\n\t\tsrc.Height = 384;\r\n\t\tsrc.Width = 256;\r\n\t\tsrc.Pitch = 512;\r\n\t\tsrc.Surface = (u8*)buffer;\r\n\r\n\t\tdst.Height = height;\r\n\t\tdst.Width = width;\r\n\t\tdst.Pitch = width*2;\r\n\t\tdst.Surface = (u8*)filteredbuffer;\r\n\r\n\t\tswitch(currentfilter)\r\n\t\t{\r\n\t\t\tcase NONE:\r\n\t\t\t\tbreak;\r\n\t\t\tcase LQ2X:\r\n\t\t\t\tRenderLQ2X(src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase LQ2XS:\r\n\t\t\t\tRenderLQ2XS(src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase HQ2X:\r\n\t\t\t\tRenderHQ2X(src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase HQ4X:\r\n\t\t\t\tRenderHQ4X(src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase HQ2XS:\r\n\t\t\t\tRenderHQ2XS(src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase _2XSAI:\r\n\t\t\t\tRender2xSaI (src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase SUPER2XSAI:\r\n\t\t\t\tRenderSuper2xSaI (src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase SUPEREAGLE:\r\n\t\t\t\tRenderSuperEagle (src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase SCANLINE:\r\n\t\t\t\tRenderScanline(src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase BILINEAR:\r\n\t\t\t\tRenderBilinear(src, dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase NEAREST2X:\r\n\t\t\t\tRenderNearest2X(src,dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase EPX:\r\n\t\t\t\tRenderEPX(src,dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase EPXPLUS:\r\n\t\t\t\tRenderEPXPlus(src,dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase EPX1POINT5:\r\n\t\t\t\tRenderEPX_1Point5x(src,dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase EPXPLUS1POINT5:\r\n\t\t\t\tRenderEPXPlus_1Point5x(src,dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase NEAREST1POINT5:\r\n\t\t\t\tRenderNearest_1Point5x(src,dst);\r\n\t\t\t\tbreak;\r\n\t\t\tcase NEARESTPLUS1POINT5:\r\n\t\t\t\tRenderNearestPlus_1Point5x(src,dst);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tint size() {\r\n\t\treturn width*height;\r\n\t}\r\n\r\n\tint dividebyratio(int x) {\r\n\t\treturn x * 256 / width;\r\n\t}\r\n\r\n\tint rotatedwidth() {\r\n\t\tswitch(rotation) {\r\n\t\t\tcase 0:\r\n\t\t\t\treturn width;\r\n\t\t\tcase 90:\r\n\t\t\t\treturn height;\r\n\t\t\tcase 180:\r\n\t\t\t\treturn width;\r\n\t\t\tcase 270:\r\n\t\t\t\treturn height;\r\n\t\t\tdefault:\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tint rotatedheight() {\r\n\t\tswitch(rotation) {\r\n\t\t\tcase 0:\r\n\t\t\t\treturn height;\r\n\t\t\tcase 90:\r\n\t\t\t\treturn width;\r\n\t\t\tcase 180:\r\n\t\t\t\treturn height;\r\n\t\t\tcase 270:\r\n\t\t\t\treturn width;\r\n\t\t\tdefault:\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tint rotatedwidthgap() {\r\n\t\tswitch(rotation) {\r\n\t\t\tcase 0:\r\n\t\t\t\treturn width;\r\n\t\t\tcase 90:\r\n\t\t\t\treturn height + ((layout == 0) ? scaledscreengap() : 0);\r\n\t\t\tcase 180:\r\n\t\t\t\treturn width;\r\n\t\t\tcase 270:\r\n\t\t\t\treturn height + ((layout == 0) ? scaledscreengap() : 0);\r\n\t\t\tdefault:\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tint rotatedheightgap() {\r\n\t\tswitch(rotation) {\r\n\t\t\tcase 0:\r\n\t\t\t\treturn height + ((layout == 0) ? scaledscreengap() : 0);\r\n\t\t\tcase 90:\r\n\t\t\t\treturn width;\r\n\t\t\tcase 180:\r\n\t\t\t\treturn height + ((layout == 0) ? scaledscreengap() : 0);\r\n\t\t\tcase 270:\r\n\t\t\t\treturn width;\r\n\t\t\tdefault:\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tint scaledscreengap() {\r\n\t\treturn screengap * height / 384;\r\n\t}\r\n};\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/arm_instructions.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n// ARM core TODO:\n// - Check all the LDM/STM opcodes: quirks when Rb included in Rlist; opcodes\n//     operating on user registers (LDMXX2/STMXX2)\n// - Force User mode memory access for LDRx/STRx opcodes with bit24=0 and bit21=1\n//     (has to be done at memory side; once the PU is emulated well enough)\n// - Check LDMxx2/STMxx2 (those opcodes that act on User mode registers instead \n//     of current ones)\n\n//#define UNTESTEDOPCODEDEBUG\n#include \"cp15.h\"\n#include \"debug.h\"\n#include \"MMU.h\"\n#include \"armcpu.h\"\n#include \"NDSSystem.h\"\n#include \"MMU_timing.h\"\n\n#define cpu (&ARMPROC)\n#define TEMPLATE template<int PROCNUM> \n\n//-----------------------------------------------------------------------------\n//   Shifting macros\n//-----------------------------------------------------------------------------\n\n#define LSL_IMM \\\n\tu32 shift_op = cpu->R[REG_POS(i,0)]<<((i>>7)&0x1F);\n\n#define S_LSL_IMM \\\n\tu32 shift_op = ((i>>7)&0x1F); \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=cpu->R[REG_POS(i,0)]; \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N(cpu->R[REG_POS(i,0)], 32-shift_op); \\\n\t\tshift_op = cpu->R[REG_POS(i,0)]<<shift_op; \\\n\t}\n\n#define LSL_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tif(shift_op>=32) \\\n\t\tshift_op=0; \\\n\telse \\\n\t\tshift_op=cpu->R[REG_POS(i,0)]<<shift_op;\n\n#define S_LSL_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=cpu->R[REG_POS(i,0)]; \\\n\telse \\\n\tif(shift_op<32) \\\n\t{ \\\n\t\tc = BIT_N(cpu->R[REG_POS(i,0)], 32-shift_op); \\\n\t\tshift_op = cpu->R[REG_POS(i,0)]<<shift_op; \\\n\t} \\\n\telse \\\n\tif(shift_op==32) \\\n\t{ \\\n\t\tshift_op = 0; \\\n\t\tc = BIT0(cpu->R[REG_POS(i,0)]); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tshift_op = 0; \\\n\t\tc = 0; \\\n\t}\n\n#define LSR_IMM \\\n\tu32 shift_op = ((i>>7)&0x1F); \\\n\tif(shift_op!=0) \\\n\t\tshift_op = cpu->R[REG_POS(i,0)]>>shift_op;\n\n#define S_LSR_IMM \\\n\tu32 shift_op = ((i>>7)&0x1F); \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tc = BIT31(cpu->R[REG_POS(i,0)]); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \\\n\t\tshift_op = cpu->R[REG_POS(i,0)]>>shift_op; \\\n\t}\n\n#define LSR_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tif(shift_op>=32) \\\n\t\tshift_op = 0; \\\n\telse \\\n\t\tshift_op = cpu->R[REG_POS(i,0)]>>shift_op;\n\n#define S_LSR_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op = cpu->R[REG_POS(i,0)]; \\\n\t} \\\n\telse \\\n\tif(shift_op<32) \\\n\t{ \\\n\t\tc = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \\\n\t\tshift_op = cpu->R[REG_POS(i,0)]>>shift_op; \\\n\t} \\\n\telse \\\n\tif(shift_op==32) \\\n\t{ \\\n\t\tc = BIT31(cpu->R[REG_POS(i,0)]); \\\n\t\tshift_op = 0; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = 0; \\\n\t\tshift_op = 0; \\\n\t}\n\n#define ASR_IMM \\\n\tu32 shift_op = ((i>>7)&0x1F); \\\n\tif(shift_op==0) \\\n\t\tshift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \\\n\telse \\\n\t\tshift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op);\n\n#define S_ASR_IMM \\\n\tu32 shift_op = ((i>>7)&0x1F); \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \\\n\t\tc = BIT31(cpu->R[REG_POS(i,0)]); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \\\n\t\tshift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \\\n\t}\n\n#define ASR_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tif(shift_op==0) \\\n\t\tshift_op=cpu->R[REG_POS(i,0)]; \\\n\telse \\\n\tif(shift_op<32) \\\n\t\tshift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \\\n\telse \\\n\t\tshift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF;\n\n#define S_ASR_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=cpu->R[REG_POS(i,0)]; \\\n\telse \\\n\tif(shift_op<32) \\\n\t{ \\\n\t\tc = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \\\n\t\tshift_op = (u32)((s32)cpu->R[REG_POS(i,0)]>>shift_op); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT31(cpu->R[REG_POS(i,0)]); \\\n\t\tshift_op=BIT31(cpu->R[REG_POS(i,0)])*0xFFFFFFFF; \\\n\t}\n\n#define ROR_IMM \\\n\tu32 shift_op = ((i>>7)&0x1F); \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op = ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); \\\n\t} \\\n\telse \\\n\t\tshift_op = ROR(cpu->R[REG_POS(i,0)],shift_op);\n\n#define S_ROR_IMM \\\n\tu32 shift_op = ((i>>7)&0x1F); \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t{ \\\n\t\tshift_op = ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1); \\\n\t\tc = BIT0(cpu->R[REG_POS(i,0)]); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \\\n\t\tshift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); \\\n\t}\n\n#define ROR_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tif((shift_op==0)||((shift_op&0x1F)==0)) \\\n\t\tshift_op=cpu->R[REG_POS(i,0)]; \\\n\telse \\\n\t\tshift_op = ROR(cpu->R[REG_POS(i,0)],(shift_op&0x1F));\n\n#define S_ROR_REG \\\n\tu32 shift_op = (cpu->R[REG_POS(i,8)])&0xFF; \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif(shift_op==0) \\\n\t\tshift_op=cpu->R[REG_POS(i,0)]; \\\n\telse \\\n\t{ \\\n\t\tshift_op&=0x1F; \\\n\t\tif(shift_op==0) \\\n\t\t{ \\\n\t\t\tshift_op=cpu->R[REG_POS(i,0)]; \\\n\t\t\tc = BIT31(cpu->R[REG_POS(i,0)]); \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tc = BIT_N(cpu->R[REG_POS(i,0)], shift_op-1); \\\n\t\t\tshift_op = ROR(cpu->R[REG_POS(i,0)],shift_op); \\\n\t\t} \\\n\t}\n\n#define IMM_VALUE \\\n\tu32 shift_op = ROR((i&0xFF), (i>>7)&0x1E);\n\n#define S_IMM_VALUE \\\n\tu32 shift_op = ROR((i&0xFF), (i>>7)&0x1E); \\\n\tu32 c = cpu->CPSR.bits.C; \\\n\tif((i>>8)&0xF) \\\n\t\tc = BIT31(shift_op);\n\n#define IMM_OFF (((i>>4)&0xF0)+(i&0xF))\n\n#define IMM_OFF_12 ((i)&0xFFF)\n\n//-----------------------------------------------------------------------------\n//   Undefined instruction\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_UND(const u32 i)\n{\n\tTRAPUNDEF(cpu);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   AND / ANDS\n//   Timing: OK\n//-----------------------------------------------------------------------------\n\n#define OP_AND(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_ANDS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\treturn a;\n \nTEMPLATE static u32 FASTCALL  OP_AND_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_AND(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_AND(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_AND(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_AND(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_AND(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_AND(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_AND(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_AND(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_AND(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_ANDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tOP_ANDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;\n\tOP_ANDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;\n\tOP_ANDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_ANDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;\n\tOP_ANDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_ANDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_ANDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_AND_S_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_ANDS(1, 3);\n}\n\n//-----------------------------------------------------------------------------\n//   EOR / EORS\n//-----------------------------------------------------------------------------\n\n#define OP_EOR(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] ^ shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a; \n\n#define OP_EORS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] ^ shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\treturn a;\n\nTEMPLATE static u32 FASTCALL  OP_EOR_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_EOR(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_EOR(2, 4); \n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_EOR(1, 3); \n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_EOR(2, 4); \n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_EOR(1, 3); \n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_EOR(2, 4); \n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_EOR(1, 3); \n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_EOR(2, 4); \n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_EOR(1, 3); \n}\n\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_EORS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tOP_EORS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;\n\tOP_EORS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;\n\tOP_EORS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_EORS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;\n\tOP_EORS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_EORS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_EORS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_EOR_S_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_EORS(1, 3);\n}\n\n//-----------------------------------------------------------------------------\n//   SUB / SUBS\n//-----------------------------------------------------------------------------\n\n#define OP_SUB(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] - shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_SUBS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = v - shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\tcpu->CPSR.bits.C = !BorrowFrom(v, shift_op); \\\n\tcpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_POS(i,12)], v, shift_op); \\\n\treturn a;\n\nTEMPLATE static u32 FASTCALL  OP_SUB_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_SUB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_SUB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_SUB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_SUB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_SUB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_SUB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_SUB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_SUB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_SUB(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_LSL_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_IMM;\n\tOP_SUBS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_LSL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_REG;\n\tOP_SUBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_LSR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_IMM;\n\tOP_SUBS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_LSR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_REG;\n\tOP_SUBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_ASR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_IMM;\n\tOP_SUBS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_ASR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_REG;\n\tOP_SUBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_ROR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_IMM;\n\tOP_SUBS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_ROR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_REG;\n\tOP_SUBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SUB_S_IMM_VAL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tIMM_VALUE;\n\tOP_SUBS(1, 3);\n}\n\n//-----------------------------------------------------------------------------\n//   RSB / RSBS\n//-----------------------------------------------------------------------------\n\n#define OP_RSB(a, b) \\\n\tcpu->R[REG_POS(i,12)] = shift_op - cpu->R[REG_POS(i,16)]; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_RSBS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = shift_op - v; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\tcpu->CPSR.bits.C = !BorrowFrom(shift_op, v); \\\n\tcpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_POS(i,12)], shift_op, v); \\\n\treturn a;\n\t\nTEMPLATE static u32 FASTCALL  OP_RSB_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_RSB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_RSB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_RSB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_RSB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_RSB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_RSB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_RSB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_RSB(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_RSB(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_LSL_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_IMM;\n\tOP_RSBS(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_LSL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_REG;\n\tOP_RSBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_LSR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_IMM;\n\tOP_RSBS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_LSR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_REG;\n\tOP_RSBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_ASR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_IMM;\n\tOP_RSBS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_ASR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_REG;\n\tOP_RSBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_ROR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_IMM;\n\tOP_RSBS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_ROR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_REG;\n\tOP_RSBS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSB_S_IMM_VAL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tIMM_VALUE;\n\tOP_RSBS(1, 3);\n}\n\n//-----------------------------------------------------------------------------\n//   ADD / ADDS\n//-----------------------------------------------------------------------------\n\n#define OP_ADD(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] + shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_ADDS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = v + shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\tcpu->CPSR.bits.C = CarryFrom(v, shift_op); \\\n\tcpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_POS(i,12)], v, shift_op); \\\n\treturn a;\n\nTEMPLATE static u32 FASTCALL  OP_ADD_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_ADD(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_ADD(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_ADD(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_ADD(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_ADD(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_ADD(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_ADD(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_ADD(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_ADD(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_LSL_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_IMM;\n\tOP_ADDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_LSL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_REG;\n\tOP_ADDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_LSR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_IMM;\n\tOP_ADDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_LSR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_REG;\n\tOP_ADDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_ASR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_IMM;\n\tOP_ADDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_ASR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_REG;\n\tOP_ADDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_ROR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_IMM;\n\tOP_ADDS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_ROR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_REG;\n\tOP_ADDS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADD_S_IMM_VAL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tIMM_VALUE;\n\tOP_ADDS(1, 3);\n}\n\n//-----------------------------------------------------------------------------\n//   ADC / ADCS\n//-----------------------------------------------------------------------------\n#define OP_ADC(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] + shift_op + cpu->CPSR.bits.C; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_ADCS(a, b) \\\n\t{ \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = v + shift_op + cpu->CPSR.bits.C; \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tif (!cpu->CPSR.bits.C) \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = v + shift_op; \\\n\t\tcpu->CPSR.bits.C = cpu->R[REG_POS(i,12)] < v; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = v + shift_op + 1; \\\n\t\tcpu->CPSR.bits.C = cpu->R[REG_POS(i,12)] <= v; \\\n\t} \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\tcpu->CPSR.bits.V = BIT31((v ^ shift_op ^ -1) & (v ^ cpu->R[REG_POS(i, 12)]));\\\n\treturn a; \\\n\t}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_ADC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_ADC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_ADC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_ADC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_ADC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_ADC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_ADC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_ADC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_ADC(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_LSL_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_IMM;\n\tOP_ADCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_LSL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_REG;\n\tOP_ADCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_LSR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_IMM;\t\t  \n\tOP_ADCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_LSR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_REG;\t\t   \n\tOP_ADCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_ASR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_IMM;\n\tOP_ADCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_ASR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_REG;\t\t\t\t \n\tOP_ADCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_ROR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_IMM;\n\tOP_ADCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_ROR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_REG;\n\tOP_ADCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ADC_S_IMM_VAL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tIMM_VALUE;\n\tOP_ADCS(1, 3);\n}\n\n//-----------------------------------------------------------------------------\n//   SBC / SBCS\n//-----------------------------------------------------------------------------\n\n#define OP_SBC(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] - shift_op - !cpu->CPSR.bits.C; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_SBCS(a, b) \\\n\t{ \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = v - shift_op - !cpu->CPSR.bits.C; \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tif (!cpu->CPSR.bits.C) \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = v - shift_op - 1; \\\n\t\tcpu->CPSR.bits.C = v > shift_op; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = v - shift_op; \\\n\t\tcpu->CPSR.bits.C = v >= shift_op; \\\n\t} \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\tcpu->CPSR.bits.V = BIT31((v ^ shift_op) & (v ^ cpu->R[REG_POS(i, 12)])); \\\n\treturn a; \\\n\t}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_SBC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_SBC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_SBC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_SBC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_SBC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_SBC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_SBC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_SBC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_SBC(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_LSL_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_IMM;\n\tOP_SBCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_LSL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_REG;\n\tOP_SBCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_LSR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_IMM;\t\t  \n\tOP_SBCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_LSR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_REG;\t\t   \n\tOP_SBCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_ASR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_IMM;\n\tOP_SBCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_ASR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_REG;\t\t\t\t \n\tOP_SBCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_ROR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_IMM;\n\tOP_SBCS(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_ROR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_REG;\n\tOP_SBCS(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SBC_S_IMM_VAL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tIMM_VALUE;\n\tOP_SBCS(1, 3);\n}\n\n//-----------------------------------------------------------------------------\n//   RSC / RSCS\n//-----------------------------------------------------------------------------\n\n#define OP_RSC(a, b) \\\n\tcpu->R[REG_POS(i,12)] =  shift_op - cpu->R[REG_POS(i,16)] + cpu->CPSR.bits.C - 1; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_RSCS(a, b) \\\n\t{ \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = shift_op - v - !cpu->CPSR.bits.C; \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tif (!cpu->CPSR.bits.C) \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = shift_op - v - 1; \\\n\t\tcpu->CPSR.bits.C = shift_op > v; \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tcpu->R[REG_POS(i,12)] = shift_op - v; \\\n\t\tcpu->CPSR.bits.C = shift_op >= v; \\\n\t} \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\tcpu->CPSR.bits.V = BIT31((shift_op ^ v) & (shift_op ^ cpu->R[REG_POS(i, 12)])); \\\n\treturn a; \\\n\t}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_RSC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_RSC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_RSC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_RSC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_RSC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_RSC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_RSC(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_RSC(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_RSC(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_LSL_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_IMM;\n\tOP_RSCS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_LSL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSL_REG;\n\tOP_RSCS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_LSR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_IMM;\t\t  \n\tOP_RSCS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_LSR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tLSR_REG;\t\t   \n\tOP_RSCS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_ASR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_IMM;\n\tOP_RSCS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_ASR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tASR_REG;\t\t\t\t \n\tOP_RSCS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_ROR_IMM(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_IMM;\n\tOP_RSCS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_ROR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tROR_REG;\n\tOP_RSCS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_RSC_S_IMM_VAL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,16)];\n\tIMM_VALUE;\n\tOP_RSCS(1,3);\n}\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\n\n#define OP_TST(a) \\\n\t{ \\\n\tu32 tmp = cpu->R[REG_POS(i,16)] & shift_op; \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(tmp); \\\n\tcpu->CPSR.bits.Z = (tmp==0); \\\n\treturn a; \\\n\t}\n\nTEMPLATE static u32 FASTCALL  OP_TST_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_TST(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tOP_TST(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;\n\tOP_TST(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;\n\tOP_TST(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_TST(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;\n\tOP_TST(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_TST(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_TST(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TST_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_TST(1);\n}\n\n//-----------------------------------------------------------------------------\n//   TEQ\n//-----------------------------------------------------------------------------\n\n#define OP_TEQ(a) \\\n\t{ \\\n\tunsigned tmp = cpu->R[REG_POS(i,16)] ^ shift_op; \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(tmp); \\\n\tcpu->CPSR.bits.Z = (tmp==0); \\\n\treturn a; \\\n\t}\n\t\nTEMPLATE static u32 FASTCALL  OP_TEQ_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_TEQ(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tOP_TEQ(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;\n\tOP_TEQ(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;\n\tOP_TEQ(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_TEQ(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;\n\tOP_TEQ(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_TEQ(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_TEQ(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_TEQ_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_TEQ(1);\n}\n\n//-----------------------------------------------------------------------------\n//   CMP\n//-----------------------------------------------------------------------------\n\n#define OP_CMP(a) \\\n\t{ \\\n\tu32 tmp = cpu->R[REG_POS(i,16)] - shift_op; \\\n\tcpu->CPSR.bits.N = BIT31(tmp); \\\n\tcpu->CPSR.bits.Z = (tmp==0); \\\n\tcpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_POS(i,16)], shift_op); \\\n\tcpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_POS(i,16)], shift_op); \\\n\treturn a; \\\n\t}\n\t\nTEMPLATE static u32 FASTCALL  OP_CMP_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_CMP(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_CMP(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_CMP(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_CMP(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_CMP(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_CMP(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_CMP(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_CMP(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMP_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_CMP(1);\n}\n\n//-----------------------------------------------------------------------------\n//   CMN\n//-----------------------------------------------------------------------------\n\n#define OP_CMN(a) \\\n\t{ \\\n\tu32 tmp = cpu->R[REG_POS(i,16)] + shift_op; \\\n\tcpu->CPSR.bits.N = BIT31(tmp); \\\n\tcpu->CPSR.bits.Z = (tmp==0); \\\n\tcpu->CPSR.bits.C = CarryFrom(cpu->R[REG_POS(i,16)], shift_op); \\\n\tcpu->CPSR.bits.V = OverflowFromADD(tmp, cpu->R[REG_POS(i,16)], shift_op); \\\n\treturn a; \\\n\t}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_CMN(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_CMN(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_CMN(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_CMN(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_CMN(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_CMN(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_CMN(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_CMN(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_CMN_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_CMN(1);\n}\n\n//-----------------------------------------------------------------------------\n//   ORR / ORRS\n//-----------------------------------------------------------------------------\n\n#define OP_ORR(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] | shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\n#define OP_ORRS(a,b) \\\n\t{ \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] | shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\treturn a; \\\n\t}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_ORR(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_ORR(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_ORR(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_ORR(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_ORR(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_ORR(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_ORR(1, 3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_ORR(2, 4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_ORR(1, 3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_ORRS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tOP_ORRS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;\n\tOP_ORRS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;\n\tOP_ORRS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_ORRS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;\n\tOP_ORRS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_ORRS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_ORRS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_ORR_S_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_ORRS(1,3);\n}\n\n//-----------------------------------------------------------------------------\n//   MOV / MOVS\n//-----------------------------------------------------------------------------\n\n#define OP_MOV(a, b) \\\n\tcpu->R[REG_POS(i,12)] = shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = shift_op; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\t\n#define OP_MOVS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\treturn a;\n\nTEMPLATE static u32 FASTCALL  OP_MOV_LSL_IMM(const u32 i)\n{\n\tif (i == 0xE1A00000)\t// nop: MOV R0, R0\n\t\treturn 1;\n\n\tLSL_IMM;\n\tOP_MOV(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tif (REG_POS(i,0) == 15) shift_op += 4;\n\tOP_MOV(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_MOV(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_LSR_REG(const u32 i)\n{\n\tLSR_REG;  \n\tif (REG_POS(i,0) == 15) shift_op += 4;\n\tOP_MOV(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_MOV(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_MOV(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_MOV(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_MOV(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_MOV(1,3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_MOVS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tif (REG_POS(i,0) == 15) shift_op += 4;\n\tOP_MOVS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;   \n\tOP_MOVS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;  \n\tif (REG_POS(i,0) == 15) shift_op += 4;\n\tOP_MOVS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_MOVS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;  \n\tOP_MOVS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_MOVS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_MOVS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MOV_S_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_MOVS(1,3);\n}\n\n//-----------------------------------------------------------------------------\n//   BIC / BICS\n//-----------------------------------------------------------------------------\n\n#define OP_BIC(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & (~shift_op); \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\t\n#define OP_BICS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = cpu->R[REG_POS(i,16)] & (~shift_op); \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\treturn a;\n\t\nTEMPLATE static u32 FASTCALL  OP_BIC_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_BIC(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_BIC(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_BIC(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_BIC(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_BIC(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_BIC(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_BIC(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_BIC(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_BIC(1,3);\n}\n\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_BICS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tOP_BICS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;\n\tOP_BICS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;\n\tOP_BICS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_BICS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;\n\tOP_BICS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_BICS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_BICS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_BIC_S_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_BICS(1,3);\n}\n\n//-----------------------------------------------------------------------------\n//   MVN / MVNS\n//-----------------------------------------------------------------------------\n\n#define OP_MVN(a, b) \\\n\tcpu->R[REG_POS(i,12)] = ~shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\treturn a;\n\t\n#define OP_MVNS(a, b) \\\n\tcpu->R[REG_POS(i,12)] = ~shift_op; \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tStatus_Reg SPSR = cpu->SPSR; \\\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode); \\\n\t\tcpu->CPSR=SPSR; \\\n\t\tcpu->changeCPSR(); \\\n\t\tcpu->R[15] &= (0xFFFFFFFC|(((u32)cpu->CPSR.bits.T)<<1)); \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn b; \\\n\t} \\\n\tcpu->CPSR.bits.C = c; \\\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,12)]); \\\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,12)]==0); \\\n\treturn a;\n\t\nTEMPLATE static u32 FASTCALL  OP_MVN_LSL_IMM(const u32 i)\n{\n\tLSL_IMM;\n\tOP_MVN(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_LSL_REG(const u32 i)\n{\n\tLSL_REG;\n\tOP_MVN(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_LSR_IMM(const u32 i)\n{\n\tLSR_IMM;\n\tOP_MVN(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_LSR_REG(const u32 i)\n{\n\tLSR_REG;\n\tOP_MVN(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_ASR_IMM(const u32 i)\n{\n\tASR_IMM;\n\tOP_MVN(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_ASR_REG(const u32 i)\n{\n\tASR_REG;\n\tOP_MVN(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_ROR_IMM(const u32 i)\n{\n\tROR_IMM;\n\tOP_MVN(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_ROR_REG(const u32 i)\n{\n\tROR_REG;\n\tOP_MVN(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_IMM_VAL(const u32 i)\n{\n\tIMM_VALUE;\n\tOP_MVN(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_LSL_IMM(const u32 i)\n{\n\tS_LSL_IMM;\n\tOP_MVNS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_LSL_REG(const u32 i)\n{\n\tS_LSL_REG;\n\tOP_MVNS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_LSR_IMM(const u32 i)\n{\n\tS_LSR_IMM;\n\tOP_MVNS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_LSR_REG(const u32 i)\n{\n\tS_LSR_REG;\n\tOP_MVNS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_ASR_IMM(const u32 i)\n{\n\tS_ASR_IMM;\n\tOP_MVNS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_ASR_REG(const u32 i)\n{\n\tS_ASR_REG;\n\tOP_MVNS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_ROR_IMM(const u32 i)\n{\n\tS_ROR_IMM;\n\tOP_MVNS(1,3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_ROR_REG(const u32 i)\n{\n\tS_ROR_REG;\n\tOP_MVNS(2,4);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MVN_S_IMM_VAL(const u32 i)\n{\n\tS_IMM_VALUE;\n\tOP_MVNS(1,3);\n}\n\n//-----------------------------------------------------------------------------\n//   MUL / MULS / MLA / MLAS\n//-----------------------------------------------------------------------------\n\n#define MUL_Mxx_END(c) \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFFFF)) \\\n\t\treturn c+1; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFF)) \\\n\t\treturn c+2; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFF)) \\\n\t\treturn c+3; \\\n\treturn c+4; \\\n\n\nTEMPLATE static u32 FASTCALL  OP_MUL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tcpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v;\n\n\tMUL_Mxx_END(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MLA(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tcpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v + cpu->R[REG_POS(i,12)];\n\t\n\tMUL_Mxx_END(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MUL_S(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tcpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v;\n\t\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0);\n\t\n\tMUL_Mxx_END(1);\n}\n\nTEMPLATE static u32 FASTCALL  OP_MLA_S(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tcpu->R[REG_POS(i,16)] = cpu->R[REG_POS(i,0)] * v + cpu->R[REG_POS(i,12)];\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0);\n\n\tMUL_Mxx_END(2);\n}\n\n//-----------------------------------------------------------------------------\n//   UMULL / UMULLS / UMLAL / UMLALS\n//-----------------------------------------------------------------------------\n\n#define MUL_UMxxL_END(c) \\\n\tv >>= 8; \\\n\tif(v==0) \\\n\t\treturn c+1; \\\n\tv >>= 8; \\\n\tif(v==0) \\\n\t\treturn c+2; \\\n\tv >>= 8; \\\n\tif(v==0) \\\n\t\treturn c+3; \\\n\treturn c+4; \\\n\n\nTEMPLATE static u32 FASTCALL  OP_UMULL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tu64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v;\n\t\n\tcpu->R[REG_POS(i,12)] = (u32)res;\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32);\n\t  \n\tMUL_UMxxL_END(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_UMLAL(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tu64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v;\n\t\n\t// RdLo = (Rm * Rs)[31:0] + RdLo /* Unsigned multiplication */\n\t// RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo)\n\tu32 tmp = (u32)res;\t\t// low\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,12)] += tmp; \n\t\n\tMUL_UMxxL_END(3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_UMULL_S(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tu64 res = ((u64)cpu->R[REG_POS(i,0)] * (u64)v);\n\t\n\tcpu->R[REG_POS(i,12)] = (u32)res;\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32);\n\t\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) && (cpu->R[REG_POS(i,12)]==0);\n\n\tMUL_UMxxL_END(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_UMLAL_S(const u32 i)\n{\n\tu32 v = cpu->R[REG_POS(i,8)];\n\tu64 res = (u64)cpu->R[REG_POS(i,0)] * (u64)v;\n\t\n\t// RdLo = (Rm * Rs)[31:0] + RdLo /* Unsigned multiplication */\n\t// RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo)\n\tu32 tmp = (u32)res;\t\t// low\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,12)] += tmp; \n\t \n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0);\n\t\n\tMUL_UMxxL_END(3);\n}\n\n//-----------------------------------------------------------------------------\n//   SMULL / SMULLS / SMLAL / SMLALS\n//-----------------------------------------------------------------------------\n\n#define MUL_SMxxL_END(c) \\\n\tv &= 0xFFFFFFFF; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFFFF)) \\\n\t\treturn c+1; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFF)) \\\n\t\treturn c+2; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFF)) \\\n\t\treturn c+3; \\\n\treturn c+4; \\\n\n\nTEMPLATE static u32 FASTCALL  OP_SMULL(const u32 i)\n{\n\ts64 v = (s32)cpu->R[REG_POS(i,8)];\n\ts64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)];\n\t\n\tcpu->R[REG_POS(i,12)] = (u32)res;\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32);\t\n\t\n\tMUL_SMxxL_END(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLAL(const u32 i)\n{\n\t\n\ts64 v = (s32)cpu->R[REG_POS(i,8)];\n\ts64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)];\n\t\n\t//LOG(\"%08X * %08X + %08X%08X\\n\", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], cpu->R[REG_POS(i,16)], cpu->R[REG_POS(i,12)]);\n\n\tu32 tmp = (u32)res;\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,12)] += tmp;\n\t\n\t//LOG(\"= %08X%08X  %08X%08X\\n\", cpu->R[REG_POS(i,16)], cpu->R[REG_POS(i,12)], res);\n\t\n\tMUL_SMxxL_END(3);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMULL_S(const u32 i)\n{\n\ts64 v = (s32)cpu->R[REG_POS(i,8)];\n\ts64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)];\n\t\n\tcpu->R[REG_POS(i,12)] = (u32)res;\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32);\t\n\t\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0);\n\n\tMUL_SMxxL_END(2);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLAL_S(const u32 i)\n{\n\ts64 v = (s32)cpu->R[REG_POS(i,8)];\n\ts64 res = v * (s64)(s32)cpu->R[REG_POS(i,0)];\n\t\n\tu32 tmp = (u32)res;\n\tcpu->R[REG_POS(i,16)] = (u32)(res>>32) + cpu->R[REG_POS(i,16)] + CarryFrom(tmp, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,12)] += tmp;\n\t \n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_POS(i,16)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_POS(i,16)]==0) & (cpu->R[REG_POS(i,12)]==0);\n\n\tMUL_SMxxL_END(3);\n}\n\n//-----------------------------------------------------------------------------\n//   SWP / SWPB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_SWP(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tu32 tmp = ROR(READ32(cpu->mem_if->data, adr), (adr & 3)<<3);\n\t\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,0)]);\n\tcpu->R[REG_POS(i,12)] = tmp;\n\t\n\t u32 c = MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t c += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\treturn MMU_aluMemCycles<PROCNUM>(4, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_SWPB(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tu8 tmp = READ8(cpu->mem_if->data, adr);\n\tWRITE8(cpu->mem_if->data, adr, (u8)(cpu->R[REG_POS(i,0)]&0xFF));\n\tcpu->R[REG_POS(i,12)] = tmp;\n\n\t u32 c = MMU_memAccessCycles<PROCNUM,8,MMU_AD_READ>(adr);\n\t c += MMU_memAccessCycles<PROCNUM,8,MMU_AD_WRITE>(adr);\n\treturn MMU_aluMemCycles<PROCNUM>(4, c);\n}\n\n//-----------------------------------------------------------------------------\n//   LDRH\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n    return MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_PRE_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_PRE_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_PRE_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] =(u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_PRE_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_POS_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] += IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_POS_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] -= IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_POS_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRH_POS_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   STRH\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_STRH_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_PRE_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_PRE_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_PRE_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_PRE_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_POS_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] += IMM_OFF;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_POS_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] -= IMM_OFF;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_POS_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)];\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRH_POS_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)];\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   LDRSH\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_PRE_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_PRE_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_PRE_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_PRE_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_POS_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] += IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_POS_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] -= IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_POS_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSH_POS_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s16)READ16(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   LDRSB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_PRE_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_PRE_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_PRE_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_PRE_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_POS_INDE_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] += IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_POS_INDE_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] -= IMM_OFF;\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_POS_INDE_P_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] += cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRSB_POS_INDE_M_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] -= cpu->R[REG_POS(i,0)];\n\tcpu->R[REG_POS(i,12)] = (s32)((s8)READ8(cpu->mem_if->data, adr));\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   MRS / MSR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_MRS_CPSR(const u32 i)\n{\n\tcpu->R[REG_POS(i,12)] = cpu->CPSR.val;\n\t\n\treturn 1;\n}\n\nTEMPLATE static u32 FASTCALL  OP_MRS_SPSR(const u32 i)\n{\n\tcpu->R[REG_POS(i,12)] = cpu->SPSR.val;\n\t\n\treturn 1;\n}\n\n#define OP_MSR_CPSR_(operand) \\\n\tu32 byte_mask = (cpu->CPSR.bits.mode == USR)?(BIT19(i)?0xFF000000:0x00000000): \\\n\t\t\t\t\t\t\t\t\t\t\t\t(BIT16(i)?0x000000FF:0x00000000) | \\\n\t\t\t\t\t\t\t\t\t\t\t\t(BIT17(i)?0x0000FF00:0x00000000) | \\\n\t\t\t\t\t\t\t\t\t\t\t\t(BIT18(i)?0x00FF0000:0x00000000) | \\\n\t\t\t\t\t\t\t\t\t\t\t\t(BIT19(i)?0xFF000000:0x00000000); \\\n\tif(cpu->CPSR.bits.mode != USR && BIT16(i)) \\\n\t\t{ armcpu_switchMode(cpu, operand & 0x1F); } \\\n\tcpu->CPSR.val = (cpu->CPSR.val & ~byte_mask) | (operand & byte_mask); \\\n\tcpu->changeCPSR();\n\n#define OP_MSR_SPSR_(operand) \\\n\tif(cpu->CPSR.bits.mode == USR || cpu->CPSR.bits.mode == SYS) return 1; \\\n\tu32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) | \\\n\t\t\t\t\t(BIT17(i)?0x0000FF00:0x00000000) | \\\n\t\t\t\t\t(BIT18(i)?0x00FF0000:0x00000000) | \\\n\t\t\t\t\t(BIT19(i)?0xFF000000:0x00000000); \\\n\tcpu->SPSR.val = (cpu->SPSR.val & ~byte_mask) | (operand & byte_mask); \\\n\tcpu->changeCPSR();\n\n//#define __NEW_MSR\n#ifdef __NEW_MSR\n#define v4T_UNALLOC_MASK\t0x0FFFFF00\n#define v4T_USER_MASK\t\t0xF0000000\n#define v4T_PRIV_MASK\t\t0x0000000F\n#define v4T_STATE_MASK\t\t0x00000020\n\n#define v5TE_UNALLOC_MASK\t0x07FFFF00\n#define v5TE_USER_MASK\t\t0xF8000000\n#define v5TE_PRIV_MASK\t\t0x0000000F\n#define v5TE_STATE_MASK\t\t0x00000020\n#endif\n\nTEMPLATE static u32 FASTCALL  OP_MSR_CPSR(const u32 i)\n{\n\tu32 operand = cpu->R[REG_POS(i,0)];\n\t\n#ifdef __NEW_MSR\n\tu32 mask = 0;\n\tu32 byte_mask = (BIT16(i)?0x000000FF:0x00000000) |\n\t\t\t\t\t(BIT17(i)?0x0000FF00:0x00000000) |\n\t\t\t\t\t(BIT18(i)?0x00FF0000:0x00000000) |\n\t\t\t\t\t(BIT19(i)?0xFF000000:0x00000000);\n\t\n\tconst u32 unallocMask = PROCNUM?v4T_UNALLOC_MASK: v5TE_UNALLOC_MASK;\n\tconst u32 userMask =\tPROCNUM?v4T_USER_MASK\t: v5TE_USER_MASK;\n\tconst u32 privMask =\tPROCNUM?v4T_PRIV_MASK\t: v5TE_PRIV_MASK;\n\tconst u32 stateMask =\tPROCNUM?v4T_STATE_MASK\t: v5TE_STATE_MASK;\n\n\tif ((operand & unallocMask) != 0) printf(\"ARM%c: MSR_CPSR_REG UNPREDICTABLE UNALLOC (operand %08X)\\n\", PROCNUM?'7':'9', operand);\n\tif (cpu->CPSR.bits.mode != USR) // Privileged mode\n\t{\n\t\tif (BIT16(i)) armcpu_switchMode(cpu, operand & 0x1F);\n\t\tif ((operand & stateMask) != 0) \n\t\t\tprintf(\"ARM%c: MSR_CPSR_REG UNPREDICTABLE STATE (operand %08X)\\n\", PROCNUM?'7':'9', operand);\n\t\telse\n\t\t\tmask = byte_mask & (userMask | privMask);\n\t}\n\telse\n\t\tmask = byte_mask & userMask;\n\t\n\tu32 new_val = ((cpu->CPSR.val & (~mask)) | (operand & mask));\n\tcpu->CPSR.val = ((cpu->CPSR.val & (~mask)) | (operand & mask));\n\tcpu->changeCPSR();\n#else\n\tOP_MSR_CPSR_(operand);\n#endif\n\treturn 1;\n}\n\nTEMPLATE static u32 FASTCALL  OP_MSR_SPSR(const u32 i)\n{\n\t//printf(\"OP_MSR_SPSR\\n\");\n\tu32 operand = cpu->R[REG_POS(i,0)];\n\tOP_MSR_SPSR_(operand);\n\t\n\treturn 1;\n}\n\nTEMPLATE static u32 FASTCALL  OP_MSR_CPSR_IMM_VAL(const u32 i)\n{\n\t//printf(\"OP_MSR_CPSR_IMM_VAL\\n\");\n\tIMM_VALUE;\n\tOP_MSR_CPSR_(shift_op);\n\treturn 1;\n}\n\nTEMPLATE static u32 FASTCALL  OP_MSR_SPSR_IMM_VAL(const u32 i)\n{\n\t//printf(\"OP_MSR_SPSR_IMM_VAL\\n\");\n\tIMM_VALUE;\n\tOP_MSR_SPSR_(shift_op);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_BX(const u32 i)\n{\n\tu32 tmp = cpu->R[REG_POS(i, 0)];\n\n\tif (REG_POS(i, 0) == 15)\n\t{\n\t\t//printf(\"ARM%c: BX using PC as operand\\n\", PROCNUM?'7':'9');\n\t\t//emu_halt();\n\t}\n\tcpu->CPSR.bits.T = BIT0(tmp);\n\tcpu->R[15] = tmp & (0xFFFFFFFC|(cpu->CPSR.bits.T<<1));\n\tcpu->next_instruction = cpu->R[15];\n\treturn 3;\n}\n\nTEMPLATE static u32 FASTCALL  OP_BLX_REG(const u32 i)\n{\n\tu32 tmp = cpu->R[REG_POS(i, 0)];\n\t\n\tcpu->R[14] = cpu->next_instruction;\n\tcpu->CPSR.bits.T = BIT0(tmp);\n\tcpu->R[15] = tmp & (0xFFFFFFFC|(cpu->CPSR.bits.T<<1));\n\tcpu->next_instruction = cpu->R[15];\n\treturn 3;\n}\n\n#define SIGNEXTEND_24(i) (((s32)i<<8)>>8)\n\nTEMPLATE static u32 FASTCALL OP_B(const u32 i)\n{\n\tstatic const u32 mov_r12_r12 = 0xE1A0C00C;\n\tconst u32 last = _MMU_read32<PROCNUM,MMU_AT_DEBUG>(cpu->instruct_adr-4);\n\tif(last == mov_r12_r12)\n\t{\n\t\tconst u32 next = _MMU_read16<PROCNUM,MMU_AT_DEBUG>(cpu->instruct_adr+4);\n\t\tif(next == 0x6464)\n\t\t\tNocashMessage(cpu, 8);\n\t}\n\n\tu32 off = SIGNEXTEND_24(i);\n\tif(CONDITION(i)==0xF)\n\t{\n\t\tcpu->R[14] = cpu->next_instruction;\n\t\tcpu->CPSR.bits.T = 1;\n\t}\n\tcpu->R[15] += (off<<2);\n\tcpu->R[15] &= (0xFFFFFFFC|(cpu->CPSR.bits.T<<1));\n\tcpu->next_instruction = cpu->R[15];\n\n\treturn 3;\n}\n\nTEMPLATE static u32 FASTCALL  OP_BL(const u32 i)\n{\n\tu32 off = SIGNEXTEND_24(i);\n\tif(CONDITION(i)==0xF)\n\t{\n\t\tcpu->CPSR.bits.T = 1;\n\t\tcpu->R[15] += 2;\n\t}\n\tcpu->R[14] = cpu->next_instruction;\n\tcpu->R[15] += (off<<2);\n\tcpu->R[15] &= (0xFFFFFFFC|(cpu->CPSR.bits.T<<1));\n\tcpu->next_instruction = cpu->R[15];\n\n\treturn 3;\n}\n\n//-----------------------------------------------------------------------------\n//   CLZ\n//-----------------------------------------------------------------------------\n\nconst u8 CLZ_TAB[16]=\n{\n\t0,\t\t\t\t\t\t\t// 0000\n\t1,\t\t\t\t\t\t\t// 0001\n\t2, 2,\t\t\t\t\t\t// 001X\n\t3, 3, 3, 3,\t\t\t\t\t// 01XX\n\t4, 4, 4, 4, 4, 4, 4, 4\t\t// 1XXX\n};\n\nTEMPLATE static u32 FASTCALL  OP_CLZ(const u32 i)\n{\n\tu32 Rm = cpu->R[REG_POS(i,0)];\n\tu32 pos;\n\n\tif(Rm==0)\n\t{\n\t\tcpu->R[REG_POS(i,12)]=32;\n\t\treturn 2;\n\t}\n\t\n\tRm |= (Rm >>1);\n\tRm |= (Rm >>2);\n\tRm |= (Rm >>4);\n\tRm |= (Rm >>8);\n\tRm |= (Rm >>16);\n\t\n\tpos =\t \n\t\tCLZ_TAB[Rm&0xF] +\n\t\tCLZ_TAB[(Rm>>4)&0xF] +\n\t\tCLZ_TAB[(Rm>>8)&0xF] +\n\t\tCLZ_TAB[(Rm>>12)&0xF] +\n\t\tCLZ_TAB[(Rm>>16)&0xF] +\n\t\tCLZ_TAB[(Rm>>20)&0xF] +\n\t\tCLZ_TAB[(Rm>>24)&0xF] +\n\t\tCLZ_TAB[(Rm>>28)&0xF];\n\n\tcpu->R[REG_POS(i,12)]=32 - pos;\n\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   QADD / QDADD / QSUB / QDSUB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_QADD(const u32 i)\n{\n\tu32 res = cpu->R[REG_POS(i,16)]+cpu->R[REG_POS(i,0)];\n\n\t//LOG(\"spe add\\n\");\n\tif(SIGNED_OVERFLOW(cpu->R[REG_POS(i,16)],cpu->R[REG_POS(i,0)], res))\n\t{\n\t\tcpu->CPSR.bits.Q=1;\n\t\tcpu->R[REG_POS(i,12)]=0x80000000-BIT31(res);\n\t\treturn 2;\n\t}\n\tcpu->R[REG_POS(i,12)]=res;\n\tif(REG_POS(i,12)==15)\n\t{\n\t\tcpu->R[15] &= 0xFFFFFFFC;\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_QSUB(const u32 i)\n{\n\tu32 res = cpu->R[REG_POS(i,0)]-cpu->R[REG_POS(i,16)];\n\n\t//LOG(\"spe add\\n\");\n\tif(SIGNED_UNDERFLOW(cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,16)], res))\n\t{\n\t\tcpu->CPSR.bits.Q=1;\n\t\tcpu->R[REG_POS(i,12)]=0x80000000-BIT31(res);\n\t\treturn 2;\n\t}\n\tcpu->R[REG_POS(i,12)]=res;\n\tif(REG_POS(i,12)==15)\n\t{\n\t\tcpu->R[15] &= 0xFFFFFFFC;\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_QDADD(const u32 i)\n{\n\tu32 mul = cpu->R[REG_POS(i,16)]<<1;\n\tu32 res;\n\n\t//LOG(\"spe add\\n\");\n\tif(BIT31(cpu->R[REG_POS(i,16)])!=BIT31(mul))\n\t{\n\t\tcpu->CPSR.bits.Q=1;\n\t\tmul = 0x80000000-BIT31(mul);\n\t}\n\n\tres = mul + cpu->R[REG_POS(i,0)];\n\tif(SIGNED_OVERFLOW(cpu->R[REG_POS(i,0)],mul, res))\n\t{\n\t\tcpu->CPSR.bits.Q=1;\n\t\tcpu->R[REG_POS(i,12)]=0x80000000-BIT31(res);\n\t\treturn 2;\n\t}\n\tcpu->R[REG_POS(i,12)]=res;\n\tif(REG_POS(i,12)==15)\n\t{\n\t\tcpu->R[15] &= 0xFFFFFFFC;\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_QDSUB(const u32 i)\n{\n\tu32 mul = cpu->R[REG_POS(i,16)]<<1;\n\tu32 res;\n\n\t//LOG(\"spe add\\n\");\n\tif(BIT31(cpu->R[REG_POS(i,16)])!=BIT31(mul))\n\t{\n\t\tcpu->CPSR.bits.Q=1;\n\t\tmul = 0x80000000-BIT31(mul);\n\t}\n\n\tres = cpu->R[REG_POS(i,0)] - mul;\n\tif(SIGNED_UNDERFLOW(cpu->R[REG_POS(i,0)], mul, res))\n\t{\n\t\tcpu->CPSR.bits.Q=1;\n\t\tcpu->R[REG_POS(i,12)]=0x80000000-BIT31(res);\n\t\treturn 2;\n\t}\n\tcpu->R[REG_POS(i,12)]=res;\n\tif(REG_POS(i,12)==15)\n\t{\n\t\tcpu->R[15] &= 0xFFFFFFFC;\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   SMUL\n//-----------------------------------------------------------------------------\n\n#define HWORD(i)   ((s32)(((s32)(i))>>16))\n#define LWORD(i)   (s32)(((s32)((i)<<16))>>16)\n\nTEMPLATE static u32 FASTCALL  OP_SMUL_B_B(const u32 i)\n{\n\t// checked\n\t//INFO(\"SMUL_B_B\\n\");\n\tcpu->R[REG_POS(i,16)] = (u32)(LWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)]));\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMUL_B_T(const u32 i)\n{\n\t//INFO(\"SMUL_B_T\\n\");\n\tcpu->R[REG_POS(i,16)] = (u32)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)]));\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMUL_T_B(const u32 i)\n{\n\t//INFO(\"SMUL_T_B\\n\");\n\tcpu->R[REG_POS(i,16)] = (u32)(HWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)]));\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMUL_T_T(const u32 i)\n{\n\t//INFO(\"SMUL_T_T\\n\");\n\tcpu->R[REG_POS(i,16)] = (u32)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)]));\n\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   SMLA\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_SMLA_B_B(const u32 i)\n{\n\tu32 tmp = (u32)((s16)cpu->R[REG_POS(i,0)]* (s16)cpu->R[REG_POS(i,8)]);\n\n\tcpu->R[REG_POS(i,16)] = tmp + cpu->R[REG_POS(i,12)];\n\n\tif (OverflowFromADD(cpu->R[REG_POS(i,16)], tmp, cpu->R[REG_POS(i,12)]))\n\t\tcpu->CPSR.bits.Q = 1;\n\t//INFO(\"SMLABB %08X * %08X + %08X = %08X\\n\", (s16)cpu->R[REG_POS(i,0)], (s16)cpu->R[REG_POS(i,8)], cpu->R[REG_POS(i,12)], (s32)cpu->R[REG_POS(i,16)]);\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLA_B_T(const u32 i)\n{\n\tu32 tmp = (u32)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)]));\n\tu32 a = cpu->R[REG_POS(i,12)];\n\t\n\t//INFO(\"SMLABT R%d:%08X * R%d:%08X + R%d:%08X = %08X\\n\", REG_POS(i,0), cpu->R[REG_POS(i,0)], REG_POS(i,8), cpu->R[REG_POS(i,8)], REG_POS(i,12), a, tmp + a);\n\tcpu->R[REG_POS(i,16)] = tmp + a;\n\t\n\tif(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)]))\n\t\tcpu->CPSR.bits.Q = 1;\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLA_T_B(const u32 i)\n{\n\tu32 tmp = (u32)(HWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)]));\n\tu32 a = cpu->R[REG_POS(i,12)];\n\n\t//INFO(\"SMLATB %08X * %08X + %08X = %08X\\n\", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, tmp + a);\n\tcpu->R[REG_POS(i,16)] = tmp + a;\n\t\n\tif(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)]))\n\t\tcpu->CPSR.bits.Q = 1;\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLA_T_T(const u32 i)\n{\n\tu32 tmp = (u32)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)]));\n\tu32 a = cpu->R[REG_POS(i,12)];\n\n\t//INFO(\"SMLATT %08X * %08X + %08X = %08X\\n\", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, tmp + a);\n\tcpu->R[REG_POS(i,16)] = tmp + a;\n\t\n\tif(SIGNED_OVERFLOW(tmp, a, cpu->R[REG_POS(i,16)]))\n\t\tcpu->CPSR.bits.Q = 1;\n\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   SMLAL\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_SMLAL_B_B(const u32 i)\n{\n\ts64 tmp = (s64)(LWORD(cpu->R[REG_POS(i,0)])* LWORD(cpu->R[REG_POS(i,8)]));\n\tu64 res = (u64)tmp + cpu->R[REG_POS(i,12)];\n\n\t//INFO(\"SMLALBB %08X * %08X + %08X%08X = %08X%08X\\n\", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + (res + ((tmp<0)*0xFFFFFFFF))), (int)(u32) res);\n\n\tcpu->R[REG_POS(i,12)] = (u32) res;\n\tcpu->R[REG_POS(i,16)] += (res + ((tmp<0)*0xFFFFFFFF));\n\t\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLAL_B_T(const u32 i)\n{\n\ts64 tmp = (s64)(LWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)]));\n\tu64 res = (u64)tmp + cpu->R[REG_POS(i,12)];\n\t\n\t//INFO(\"SMLALBT %08X * %08X + %08X%08X = %08X%08X\\n\", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res);\n\n\tcpu->R[REG_POS(i,12)] = (u32) res;\n\tcpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF);\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLAL_T_B(const u32 i)\n{\n\ts64 tmp = (s64)(HWORD(cpu->R[REG_POS(i,0)])* (s64)LWORD(cpu->R[REG_POS(i,8)]));\n\tu64 res = (u64)tmp + cpu->R[REG_POS(i,12)];\n\t\n\t//INFO(\"SMLALTB %08X * %08X + %08X%08X = %08X%08X\\n\", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res);\n\n\tcpu->R[REG_POS(i,12)] = (u32) res;\n\tcpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF);\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLAL_T_T(const u32 i)\n{\n\ts64 tmp = (s64)(HWORD(cpu->R[REG_POS(i,0)])* HWORD(cpu->R[REG_POS(i,8)]));\n\tu64 res = (u64)tmp + cpu->R[REG_POS(i,12)];\n\t\n\t//INFO(\"SMLALTT %08X * %08X + %08X%08X = %08X%08X\\n\", (int)cpu->R[REG_POS(i,0)], (int)cpu->R[REG_POS(i,8)], (int)cpu->R[REG_POS(i,16)], (int)cpu->R[REG_POS(i,12)], (int)(cpu->R[REG_POS(i,16)] + res + ((tmp<0)*0xFFFFFFFF)), (int)(u32) res);\n\t\n\tcpu->R[REG_POS(i,12)] = (u32) res;\n\tcpu->R[REG_POS(i,16)] += res + ((tmp<0)*0xFFFFFFFF);\n\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   SMULW\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_SMULW_B(const u32 i)\n{\n\ts64 tmp = (s64)LWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]);\n\t\n\t//INFO(\"SMULWB %08X * %08X = %08X\\n\", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], ((tmp>>16)&0xFFFFFFFF));\n\t\n\tcpu->R[REG_POS(i,16)] = ((tmp>>16)&0xFFFFFFFF);\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMULW_T(const u32 i)\n{\n\ts64 tmp = (s64)HWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]);\n\t\n\t//INFO(\"SMULWT %08X * %08X = %08X\\n\", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], ((tmp>>16)&0xFFFFFFFF));\n\t\n\tcpu->R[REG_POS(i,16)] = ((tmp>>16)&0xFFFFFFFF);\n\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   SMLAW\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_SMLAW_B(const u32 i)\n{\n\ts64 tmp = (s64)LWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]);\n\tu32 a = cpu->R[REG_POS(i,12)];\n\t\n\t//INFO(\"SMLAWB %08X * %08X + %08X = %08X\\n\", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, (tmp>>16) + a);\n\t\n\ttmp = (tmp>>16);\n\t\n\tcpu->R[REG_POS(i,16)] = tmp + a;\n\t\t\n\tif(SIGNED_OVERFLOW((u32)tmp, a, cpu->R[REG_POS(i,16)]))\n\t\tcpu->CPSR.bits.Q = 1;\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_SMLAW_T(const u32 i)\n{\n\ts64 tmp = (s64)HWORD(cpu->R[REG_POS(i,8)]) * (s64)((s32)cpu->R[REG_POS(i,0)]);\n\tu32 a = cpu->R[REG_POS(i,12)];\n\t\n\t//INFO(\"SMLAWT %08X * %08X + %08X = %08X\\n\", cpu->R[REG_POS(i,0)], cpu->R[REG_POS(i,8)], a, ((tmp>>16)&0xFFFFFFFF) + a);\n\n\ttmp = ((tmp>>16)&0xFFFFFFFF);\n\tcpu->R[REG_POS(i,16)] = tmp + a;\n\n\tif(SIGNED_OVERFLOW((u32)tmp, a, cpu->R[REG_POS(i,16)]))\n\t\tcpu->CPSR.bits.Q = 1;\n\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   LDR\n//-----------------------------------------------------------------------------\n#define OP_LDR(a, b) \\\n\tcpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \\\n\t\\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tif (PROCNUM == 0) \\\n\t\t{ \\\n\t\t\tcpu->CPSR.bits.T = BIT0(cpu->R[15]); \\\n\t\t\tcpu->R[15] &= 0xFFFFFFFE; \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tcpu->R[15] &= 0xFFFFFFFC; \\\n\t\t} \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(b,adr); \\\n\t} \\\n\t\\\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(a,adr);\n\n// PRE\n#define OP_LDR_W(a, b) \\\n\tcpu->R[REG_POS(i,16)] = adr;\\\n\tcpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \\\n\t\\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tif (PROCNUM == 0) \\\n\t\t{ \\\n\t\t\tcpu->CPSR.bits.T = BIT0(cpu->R[15]); \\\n\t\t\tcpu->R[15] &= 0xFFFFFFFE; \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tcpu->R[15] &= 0xFFFFFFFC; \\\n\t\t} \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(b,adr); \\\n\t} \\\n\t\\\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(a,adr);\n\n// POST\n#define OP_LDR_W2(a, b, c) \\\n\tu32 adr = cpu->R[REG_POS(i,16)]; \\\n\tcpu->R[REG_POS(i,16)] = adr + c;\\\n\tcpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3)); \\\n\t\\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tif (PROCNUM == 0) \\\n\t\t{ \\\n\t\t\tcpu->CPSR.bits.T = BIT0(cpu->R[15]); \\\n\t\t\tcpu->R[15] &= 0xFFFFFFFE; \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tcpu->R[15] &= 0xFFFFFFFC; \\\n\t\t} \\\n\t\tcpu->next_instruction = cpu->R[15]; \\\n\t\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(b,adr); \\\n\t} \\\n\t\\\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(a,adr);\n\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tOP_LDR_W(3, 5);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_IMM_OFF_POSTIND(const u32 i)\n{\n\tOP_LDR_W2(3, 5, IMM_OFF_12);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_IMM_OFF_POSTIND(const u32 i)\n{\n\tOP_LDR_W2(3, 5, -IMM_OFF_12);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM;\n\tOP_LDR_W2(3, 5, shift_op);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM;\n\tOP_LDR_W2(3, 5, -shift_op);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tOP_LDR_W2(3, 5, shift_op);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tOP_LDR_W2(3, 5, -shift_op);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tOP_LDR_W2(3, 5, shift_op);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tOP_LDR_W2(3, 5, -shift_op);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_P_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tOP_LDR_W2(3, 5, shift_op);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDR_M_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tOP_LDR_W2(3, 5, -shift_op);\n}\n\n//-----------------------------------------------------------------------------\n//   LDREX\n//-----------------------------------------------------------------------------\nTEMPLATE static u32 FASTCALL  OP_LDREX(const u32 i)\n{\n\tprintf(\"LDREX\\n\");\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,12)] = ROR(READ32(cpu->mem_if->data, adr), 8*(adr&3));\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   LDRB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,12)] = READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_IMM_OFF_POSTIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr + IMM_OFF_12;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_IMM_OFF_POSTIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr - IMM_OFF_12;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_P_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRB_M_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\tcpu->R[REG_POS(i,12)] = (u32)READ8(cpu->mem_if->data, adr);\t\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   STR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_IMM_OFF_POSTIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + IMM_OFF_12;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_IMM_OFF_POSTIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - IMM_OFF_12;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_P_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STR_M_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   STREX\n//-----------------------------------------------------------------------------\nTEMPLATE static u32 FASTCALL  OP_STREX(const u32 i)\n{\n\tprintf(\"STREX\\n\");\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_POS(i,0)]);\n\tcpu->R[REG_POS(i,12)] = 0;\n\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   STRB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_LSL_IMM_OFF(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_LSR_IMM_OFF(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_ASR_IMM_OFF(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_ROR_IMM_OFF(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] + IMM_OFF_12;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_IMM_OFF_PREIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)] - IMM_OFF_12;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_LSL_IMM_OFF_PREIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_LSR_IMM_OFF_PREIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_ASR_IMM_OFF_PREIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] + shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_ROR_IMM_OFF_PREIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)] - shift_op;\n\tcpu->R[REG_POS(i,16)] = adr;\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_IMM_OFF_POSTIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + IMM_OFF_12;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_IMM_OFF_POSTIND(const u32 i)\n{\n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - IMM_OFF_12;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_LSL_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSL_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_LSR_IMM_OFF_POSTIND(const u32 i)\n{\n\tLSR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_ASR_IMM_OFF_POSTIND(const u32 i)\n{\n\tASR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_P_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr + shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STRB_M_ROR_IMM_OFF_POSTIND(const u32 i)\n{\n\tROR_IMM; \n\tu32 adr = cpu->R[REG_POS(i,16)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_POS(i,12)]);\n\tcpu->R[REG_POS(i,16)] = adr - shift_op;\n\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\n//-----------------------------------------------------------------------------\n//   LDMIA / LDMIB / LDMDA / LDMDB\n//-----------------------------------------------------------------------------\n\n#define OP_L_IA(reg, adr)  if(BIT##reg(i)) \\\n\t{ \\\n\t\tregistres[reg] = READ32(cpu->mem_if->data, start); \\\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start); \\\n\t\tadr += 4; \\\n\t}\n\n#define OP_L_IB(reg, adr)  if(BIT##reg(i)) \\\n\t{ \\\n\t\tadr += 4; \\\n\t\tregistres[reg] = READ32(cpu->mem_if->data, start); \\\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start); \\\n\t}\n\n#define OP_L_DA(reg, adr)  if(BIT##reg(i)) \\\n\t{ \\\n\t\tregistres[reg] = READ32(cpu->mem_if->data, start); \\\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start); \\\n\t\tadr -= 4; \\\n\t}\n\n#define OP_L_DB(reg, adr)  if(BIT##reg(i)) \\\n\t{ \\\n\t\tadr -= 4; \\\n\t\tregistres[reg] = READ32(cpu->mem_if->data, start); \\\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start); \\\n\t}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIA(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tu32 * registres = cpu->R;\n\t\n\tOP_L_IA(0, start);\n\tOP_L_IA(1, start);\n\tOP_L_IA(2, start);\n\tOP_L_IA(3, start);\n\tOP_L_IA(4, start);\n\tOP_L_IA(5, start);\n\tOP_L_IA(6, start);\n\tOP_L_IA(7, start);\n\tOP_L_IA(8, start);\n\tOP_L_IA(9, start);\n\tOP_L_IA(10, start);\n\tOP_L_IA(11, start);\n\tOP_L_IA(12, start);\n\tOP_L_IA(13, start);\n\tOP_L_IA(14, start);\n\t\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\t// TODO\n\t\t// The general-purpose registers loaded can include the PC. If they do, the word loaded for the PC is treated\n\t\t// as an address and a branch occurs to that address. In ARMv5 and above, bit[0] of the loaded value\n\t\t// determines whether execution continues after this branch in ARM state or in Thumb state, as though a BX\n\t\t// (loaded_value) instruction had been executed (but see also The T and J bits on page A2-15 for operation on\n\t\t// non-T variants of ARMv5). In earlier versions of the architecture, bits[1:0] of the loaded value are ignored\n\t\t// and execution continues in ARM state, as though the instruction MOV PC,(loaded_value) had been executed.\n\t\t//\n\t\t//value = Memory[address,4]\n\t\t//if (architecture version 5 or above) then\n\t\t//\tpc = value AND 0xFFFFFFFE\n\t\t//\tT Bit = value[0]\n\t\t//else\n\t\t//\tpc = value AND 0xFFFFFFFC\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\t\n\t\t//start += 4;\n\t\tcpu->next_instruction = registres[15];\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t}\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIB(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tu32 * registres = cpu->R;\n\t\n\tOP_L_IB(0, start);\n\tOP_L_IB(1, start);\n\tOP_L_IB(2, start);\n\tOP_L_IB(3, start);\n\tOP_L_IB(4, start);\n\tOP_L_IB(5, start);\n\tOP_L_IB(6, start);\n\tOP_L_IB(7, start);\n\tOP_L_IB(8, start);\n\tOP_L_IB(9, start);\n\tOP_L_IB(10, start);\n\tOP_L_IB(11, start);\n\tOP_L_IB(12, start);\n\tOP_L_IB(13, start);\n\tOP_L_IB(14, start);\n\t\n\tif(BIT15(i))\n\t{\n\t\tstart += 4;\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\tcpu->next_instruction = registres[15];\n\t\treturn MMU_aluMemCycles<PROCNUM>(4, c);\n\t}\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDA(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tu32 * registres = cpu->R;\n\t\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\tstart -= 4;\n\t\tcpu->next_instruction = registres[15];\n\t}\n\n\tOP_L_DA(14, start);\n\tOP_L_DA(13, start);\n\tOP_L_DA(12, start);\n\tOP_L_DA(11, start);\n\tOP_L_DA(10, start);\n\tOP_L_DA(9, start);\n\tOP_L_DA(8, start);\n\tOP_L_DA(7, start);\n\tOP_L_DA(6, start);\n\tOP_L_DA(5, start);\n\tOP_L_DA(4, start);\n\tOP_L_DA(3, start);\n\tOP_L_DA(2, start);\n\tOP_L_DA(1, start);\n\tOP_L_DA(0, start);\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDB(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tu32 * registres = cpu->R;\n\t\n\tif(BIT15(i))\n\t{\n\t\tstart -= 4;\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\tcpu->next_instruction = registres[15];\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t}\n\n\tOP_L_DB(14, start);\n\tOP_L_DB(13, start);\n\tOP_L_DB(12, start);\n\tOP_L_DB(11, start);\n\tOP_L_DB(10, start);\n\tOP_L_DB(9, start);\n\tOP_L_DB(8, start);\n\tOP_L_DB(7, start);\n\tOP_L_DB(6, start);\n\tOP_L_DB(5, start);\n\tOP_L_DB(4, start);\n\tOP_L_DB(3, start);\n\tOP_L_DB(2, start);\n\tOP_L_DB(1, start);\n\tOP_L_DB(0, start);\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIA_W(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF;\n\tu32 * registres = cpu->R;\n\n\tOP_L_IA(0, start);\n\tOP_L_IA(1, start);\n\tOP_L_IA(2, start);\n\tOP_L_IA(3, start);\n\tOP_L_IA(4, start);\n\tOP_L_IA(5, start);\n\tOP_L_IA(6, start);\n\tOP_L_IA(7, start);\n\tOP_L_IA(8, start);\n\tOP_L_IA(9, start);\n\tOP_L_IA(10, start);\n\tOP_L_IA(11, start);\n\tOP_L_IA(12, start);\n\tOP_L_IA(13, start);\n\tOP_L_IA(14, start);\n\t\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\tstart += 4;\n\t\tcpu->next_instruction = registres[15];\n\t}\n\n\tif(i & (1 << REG_POS(i,16))) {\n\t\tif(i & bitList)\n\t\t\tcpu->R[REG_POS(i,16)] = start;\n\t}\n\telse\n\t\tcpu->R[REG_POS(i,16)] = start;\n\n\treturn MMU_aluMemCycles<PROCNUM>(BIT15(i)?4:2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIB_W(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF;\n\t\n\tu32 * registres = cpu->R;\n\n\tOP_L_IB(0, start);\n\tOP_L_IB(1, start);\n\tOP_L_IB(2, start);\n\tOP_L_IB(3, start);\n\tOP_L_IB(4, start);\n\tOP_L_IB(5, start);\n\tOP_L_IB(6, start);\n\tOP_L_IB(7, start);\n\tOP_L_IB(8, start);\n\tOP_L_IB(9, start);\n\tOP_L_IB(10, start);\n\tOP_L_IB(11, start);\n\tOP_L_IB(12, start);\n\tOP_L_IB(13, start);\n\tOP_L_IB(14, start);\n\t\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp;\n\t\tstart += 4;\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\ttmp = READ32(cpu->mem_if->data, start);\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\tcpu->next_instruction = registres[15];\n\t}\n\n\tif(i & (1 << REG_POS(i,16))) {\n\t\tif(i & bitList)\n\t\t\tcpu->R[REG_POS(i,16)] = start;\n\t}\n\telse\n\t\tcpu->R[REG_POS(i,16)] = start;\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(BIT15(i)?4:2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDA_W(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF;\n\n\tu32 * registres = cpu->R;\n\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\tstart -= 4;\n\t\tcpu->next_instruction = registres[15];\n\t}\n\n\tOP_L_DA(14, start);\n\tOP_L_DA(13, start);\n\tOP_L_DA(12, start);\n\tOP_L_DA(11, start);\n\tOP_L_DA(10, start);\n\tOP_L_DA(9, start);\n\tOP_L_DA(8, start);\n\tOP_L_DA(7, start);\n\tOP_L_DA(6, start);\n\tOP_L_DA(5, start);\n\tOP_L_DA(4, start);\n\tOP_L_DA(3, start);\n\tOP_L_DA(2, start);\n\tOP_L_DA(1, start);\n\tOP_L_DA(0, start);\n\n\tif(i & (1 << REG_POS(i,16))) {\n\t\tif(i & bitList)\n\t\t\tcpu->R[REG_POS(i,16)] = start;\n\t}\n\telse\n\t\tcpu->R[REG_POS(i,16)] = start;\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDB_W(const u32 i)\n{\n\tu32 c = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 bitList = (~((2 << REG_POS(i,16))-1)) & 0xFFFF;\n\tu32 * registres = cpu->R;\n\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp;\n\t\tstart -= 4;\n\t\ttmp = READ32(cpu->mem_if->data, start);\n\t\tif (PROCNUM == 0)\n\t\t{\n\t\t\tcpu->CPSR.bits.T = BIT0(tmp);\n\t\t\tregistres[15] = tmp & 0xFFFFFFFE;\n\t\t}\n\t\telse\n\t\t\tregistres[15] = tmp & 0xFFFFFFFC;\n\t\tcpu->next_instruction = registres[15];\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t}\n\n\tOP_L_DB(14, start);\n\tOP_L_DB(13, start);\n\tOP_L_DB(12, start);\n\tOP_L_DB(11, start);\n\tOP_L_DB(10, start);\n\tOP_L_DB(9, start);\n\tOP_L_DB(8, start);\n\tOP_L_DB(7, start);\n\tOP_L_DB(6, start);\n\tOP_L_DB(5, start);\n\tOP_L_DB(4, start);\n\tOP_L_DB(3, start);\n\tOP_L_DB(2, start);\n\tOP_L_DB(1, start);\n\tOP_L_DB(0, start);\n\n\tif(i & (1 << REG_POS(i,16))) {\n\t\tif(i & bitList)\n\t\t\tcpu->R[REG_POS(i,16)] = start;\n\t}\n\telse\n\t\tcpu->R[REG_POS(i,16)] = start;\n\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIA2(const u32 i)\n{\n\tu32 oldmode = 0;\n\n\tu32 c = 0;\n\t\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 * registres;\n\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\n\tregistres = cpu->R;\n\t\t\t\n\tOP_L_IA(0, start);\n\tOP_L_IA(1, start);\n\tOP_L_IA(2, start);\n\tOP_L_IA(3, start);\n\tOP_L_IA(4, start);\n\tOP_L_IA(5, start);\n\tOP_L_IA(6, start);\n\tOP_L_IA(7, start);\n\tOP_L_IA(8, start);\n\tOP_L_IA(9, start);\n\tOP_L_IA(10, start);\n\tOP_L_IA(11, start);\n\tOP_L_IA(12, start);\n\tOP_L_IA(13, start);\n\tOP_L_IA(14, start);\n\t\n\tif(BIT15(i) == 0)\n\t{\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t}\n\telse\n\t{\n    \n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tStatus_Reg SPSR;\n\t\tcpu->R[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\tSPSR = cpu->SPSR;\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\t\tcpu->CPSR=SPSR;\n\t\tcpu->changeCPSR();\n\t\t//start += 4;\n\t\tcpu->next_instruction = cpu->R[15];\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t}\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIB2(const u32 i)\n{\n\tu32 oldmode = 0;\n\tu32 c = 0;\n\t\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 * registres;\n\n\tUNTESTEDOPCODELOG(\"Untested opcode: OP_LDMIB2 \\n\");\n\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\n\tregistres = cpu->R;\n\t\t\t\n\tOP_L_IB(0, start);\n\tOP_L_IB(1, start);\n\tOP_L_IB(2, start);\n\tOP_L_IB(3, start);\n\tOP_L_IB(4, start);\n\tOP_L_IB(5, start);\n\tOP_L_IB(6, start);\n\tOP_L_IB(7, start);\n\tOP_L_IB(8, start);\n\tOP_L_IB(9, start);\n\tOP_L_IB(10, start);\n\tOP_L_IB(11, start);\n\tOP_L_IB(12, start);\n\tOP_L_IB(13, start);\n\tOP_L_IB(14, start);\n\t\n\tif(BIT15(i) == 0)\n\t{\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t}\n\telse \n\t{\n\t\tu32 tmp;\n\t\tStatus_Reg SPSR;\n\t\tstart += 4;\n\t\ttmp = READ32(cpu->mem_if->data, start);\n\t\tregistres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\tSPSR = cpu->SPSR;\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\t\tcpu->CPSR=SPSR;\n\t\tcpu->changeCPSR();\n\t\tcpu->next_instruction = registres[15];\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t}\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDA2(const u32 i)\n{\n\t\t\n\tu32 oldmode = 0;\n\tu32 c = 0;\n\tu32 * registres;\n\t\n\tu32 start = cpu->R[REG_POS(i,16)];\n\n\tUNTESTEDOPCODELOG(\"Untested opcode: OP_LDMDA2 \\n\");\n\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\t\n\tregistres = cpu->R;\n\t\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tregistres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\tcpu->CPSR = cpu->SPSR;\n\t\tcpu->changeCPSR();\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\tstart -= 4;\n\t\tcpu->next_instruction = registres[15];\n\t}\n \n\tOP_L_DA(14, start);\n\tOP_L_DA(13, start);\n\tOP_L_DA(12, start);\n\tOP_L_DA(11, start);\n\tOP_L_DA(10, start);\n\tOP_L_DA(9, start);\n\tOP_L_DA(8, start);\n\tOP_L_DA(7, start);\n\tOP_L_DA(6, start);\n\tOP_L_DA(5, start);\n\tOP_L_DA(4, start);\n\tOP_L_DA(3, start);\n\tOP_L_DA(2, start);\n\tOP_L_DA(1, start);\n\tOP_L_DA(0, start);\n\t\n\tif(BIT15(i)==0)\n\t{\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t}\n\telse\n\t{\n\t\tStatus_Reg SPSR = cpu->SPSR;\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\t\tcpu->CPSR=SPSR;\n\t\tcpu->changeCPSR();\n\t}\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDB2(const u32 i)\n{\n\tu32 oldmode = 0;\n\tu32 c = 0;\n\tu32 * registres;\n\t\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\n\tregistres = cpu->R;\n\t\n\tif(BIT15(i))\n\t{\n\t\tu32 tmp;\n\t\tstart -= 4;\n\t\ttmp = READ32(cpu->mem_if->data, start);\n\t\tregistres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\tcpu->CPSR = cpu->SPSR;\n\t\tcpu->changeCPSR();\n\t\tcpu->next_instruction = registres[15];\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t}\n\n\tOP_L_DB(14, start);\n\tOP_L_DB(13, start);\n\tOP_L_DB(12, start);\n\tOP_L_DB(11, start);\n\tOP_L_DB(10, start);\n\tOP_L_DB(9, start);\n\tOP_L_DB(8, start);\n\tOP_L_DB(7, start);\n\tOP_L_DB(6, start);\n\tOP_L_DB(5, start);\n\tOP_L_DB(4, start);\n\tOP_L_DB(3, start);\n\tOP_L_DB(2, start);\n\tOP_L_DB(1, start);\n\tOP_L_DB(0, start);\n\t\n\tif(BIT15(i)==0)\n\t{\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t}\n\telse\n\t{\n\t\tStatus_Reg SPSR = cpu->SPSR;\n\t\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\t\tcpu->CPSR=SPSR;\n\t\tcpu->changeCPSR();\n\t}\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIA2_W(const u32 i)\n{\n\tu32 c = 0;\n\t\t\n\tu32 oldmode = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 * registres;\n\tu32 tmp;\n\tStatus_Reg SPSR;\n//\temu_halt();\t\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\n\tregistres = cpu->R;\n\t\n\tOP_L_IA(0, start);\n\tOP_L_IA(1, start);\n\tOP_L_IA(2, start);\n\tOP_L_IA(3, start);\n\tOP_L_IA(4, start);\n\tOP_L_IA(5, start);\n\tOP_L_IA(6, start);\n\tOP_L_IA(7, start);\n\tOP_L_IA(8, start);\n\tOP_L_IA(9, start);\n\tOP_L_IA(10, start);\n\tOP_L_IA(11, start);\n\tOP_L_IA(12, start);\n\tOP_L_IA(13, start);\n\tOP_L_IA(14, start);\n\t\n\tif(BIT15(i)==0)\n\t{\n\t\tif (!BIT_N(i, REG_POS(i,16)))\n\t\t\tregistres[REG_POS(i,16)] = start;\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n\t}\n\n\tif (!BIT_N(i, REG_POS(i,16)))\n\t\tregistres[REG_POS(i,16)] = start + 4;\n\ttmp = READ32(cpu->mem_if->data, start);\n\tregistres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\tSPSR = cpu->SPSR;\n\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\tcpu->CPSR=SPSR;\n\tcpu->changeCPSR();\n\tcpu->next_instruction = registres[15];\n\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMIB2_W(const u32 i)\n{\n\tu32 c = 0;\n\n\tu32 oldmode = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 * registres;\n\tu32 tmp;\n\tStatus_Reg SPSR;\n\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\n\tregistres = cpu->R;\n\n\tOP_L_IB(0, start);\n\tOP_L_IB(1, start);\n\tOP_L_IB(2, start);\n\tOP_L_IB(3, start);\n\tOP_L_IB(4, start);\n\tOP_L_IB(5, start);\n\tOP_L_IB(6, start);\n\tOP_L_IB(7, start);\n\tOP_L_IB(8, start);\n\tOP_L_IB(9, start);\n\tOP_L_IB(10, start);\n\tOP_L_IB(11, start);\n\tOP_L_IB(12, start);\n\tOP_L_IB(13, start);\n\tOP_L_IB(14, start);\n\t\n\tif(BIT15(i)==0)\n\t{\n\t\tif (!BIT_N(i, REG_POS(i,16)))\n\t\t\tregistres[REG_POS(i,16)] = start;\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t\t\n\t\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n\t}\n\n\tif (!BIT_N(i, REG_POS(i,16)))\n\t\tregistres[REG_POS(i,16)] = start + 4;\n\ttmp = READ32(cpu->mem_if->data, start + 4);\n\tregistres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\tcpu->CPSR = cpu->SPSR;\n\tcpu->changeCPSR();\n\tcpu->next_instruction = registres[15];\n\tSPSR = cpu->SPSR;\n\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\tcpu->CPSR=SPSR;\n\tcpu->changeCPSR();\n\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDA2_W(const u32 i)\n{\n\tu32 c = 0;\n\t\t\n\tu32 oldmode = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 * registres;\n\tStatus_Reg SPSR;\n//\temu_halt();\t\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\n\tregistres = cpu->R;\n\t\n\tif(BIT15(i))\n\t{\n\t\tif (BIT_N(i, REG_POS(i,16))) printf(\"error1_1\\n\");\n\t\tu32 tmp = READ32(cpu->mem_if->data, start);\n\t\tregistres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\tstart -= 4;\n\t\tcpu->next_instruction = registres[15];\n\t}\n\n\tOP_L_DA(14, start);\n\tOP_L_DA(13, start);\n\tOP_L_DA(12, start);\n\tOP_L_DA(11, start);\n\tOP_L_DA(10, start);\n\tOP_L_DA(9, start);\n\tOP_L_DA(8, start);\n\tOP_L_DA(7, start);\n\tOP_L_DA(6, start);\n\tOP_L_DA(5, start);\n\tOP_L_DA(4, start);\n\tOP_L_DA(3, start);\n\tOP_L_DA(2, start);\n\tOP_L_DA(1, start);\n\tOP_L_DA(0, start);\n\t\n\tif (!BIT_N(i, REG_POS(i,16)))\n\t\tregistres[REG_POS(i,16)] = start;\n\t\n\tif(BIT15(i)==0)\n\t{\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n\t}\n\n\tSPSR = cpu->SPSR;\n\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\tcpu->CPSR=SPSR;\n\tcpu->changeCPSR();\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDMDB2_W(const u32 i)\n{\n\tu32 c = 0;\n\t\t\n\tu32 oldmode = 0;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\tu32 * registres;\n\tStatus_Reg SPSR;\n//\temu_halt();\t\n\tif(BIT15(i)==0)\n\t{  \n\t\tif((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\toldmode = armcpu_switchMode(cpu, SYS);\n\t}\n\n\tregistres = cpu->R;\n\t\n\tif(BIT15(i))\n\t{\n\t\tif (BIT_N(i, REG_POS(i,16))) printf(\"error1_2\\n\");\n\t\tu32 tmp;\n\t\tstart -= 4;\n\t\ttmp = READ32(cpu->mem_if->data, start);\n\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(start);\n\t\tregistres[15] = tmp & (0XFFFFFFFC | (BIT0(tmp)<<1));\n\t\tcpu->CPSR = cpu->SPSR;\n\t\tcpu->changeCPSR();\n\t\tcpu->next_instruction = registres[15];\n\t}\n\n\tOP_L_DB(14, start);\n\tOP_L_DB(13, start);\n\tOP_L_DB(12, start);\n\tOP_L_DB(11, start);\n\tOP_L_DB(10, start);\n\tOP_L_DB(9, start);\n\tOP_L_DB(8, start);\n\tOP_L_DB(7, start);\n\tOP_L_DB(6, start);\n\tOP_L_DB(5, start);\n\tOP_L_DB(4, start);\n\tOP_L_DB(3, start);\n\tOP_L_DB(2, start);\n\tOP_L_DB(1, start);\n\tOP_L_DB(0, start);\n\t\n\tif (!BIT_N(i, REG_POS(i,16)))\n\t\tregistres[REG_POS(i,16)] = start;\n\t\n\tif(BIT15(i)==0)\n\t{\n\t\tarmcpu_switchMode(cpu, oldmode);\n\t\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n\t}\n\n\tSPSR = cpu->SPSR;\n\tarmcpu_switchMode(cpu, SPSR.bits.mode);\n\tcpu->CPSR=SPSR;\n\tcpu->changeCPSR();\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\n//-----------------------------------------------------------------------------\n//   STMIA / STMIB / STMDA / STMDB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL OP_STMIA(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart += 4;\n\t\t}\n\t}\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMIB(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tstart += 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDA(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart -= 4;\n\t\t}\n\t}\t\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDB(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tstart -= 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\t\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMIA_W(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart += 4;\n\t\t}\n\t}\n\t\n\tcpu->R[REG_POS(i,16)] = start;\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMIB_W(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tstart += 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\n\tcpu->R[REG_POS(i,16)] = start;\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDA_W(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart -= 4;\n\t\t}\n\t}\t\n\t\n\tcpu->R[REG_POS(i,16)] = start;\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDB_W(const u32 i)\n{\n\tu32 c = 0, b;\n\tu32 start = cpu->R[REG_POS(i,16)];\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tstart -= 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\t\n\t\n\tcpu->R[REG_POS(i,16)] = start;\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMIA2(const u32 i)\n{\n\tu32 c, b;\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\t\t\n\tc = 0;\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\n\n\tUNTESTEDOPCODELOG(\"Untested opcode: OP_STMIA2 \\n\");\n\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart += 4;\n\t\t}\n\t}\n\t\n\tarmcpu_switchMode(cpu, oldmode);\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMIB2(const u32 i)\n{\n\tu32 c, b;\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\t\t\n\tc = 0;\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\n\t\n\tUNTESTEDOPCODELOG(\"Untested opcode: OP_STMIB2 \\n\");\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tstart += 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\n\t\n\tarmcpu_switchMode(cpu, oldmode);\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDA2(const u32 i)\n{\n\tu32 c, b;\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\n\tc = 0;\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\t\n\t\n\tUNTESTEDOPCODELOG(\"Untested opcode: OP_STMDA2 \\n\");  \n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart -= 4;\n\t\t}\n\t}\t\n\t\n\tarmcpu_switchMode(cpu, oldmode);\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDB2(const u32 i)\n{\n\tu32 c, b;\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\n\tc=0;\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tstart -= 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\t\n\t\n\tarmcpu_switchMode(cpu, oldmode);\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMIA2_W(const u32 i)\n{\n\tu32 c, b;\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\t\n\tc=0;\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\n\t\n\tUNTESTEDOPCODELOG(\"Untested opcode: OP_STMIA2_W \\n\");\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart += 4;\n\t\t}\n\t}\n\t\n\tcpu->R[REG_POS(i,16)] = start;\n\t\n\tarmcpu_switchMode(cpu, oldmode);\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMIB2_W(const u32 i)\n{\n\tu32 c, b;\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\tc=0;\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, b))\n\t\t{\n\t\t\tstart += 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\n\tarmcpu_switchMode(cpu, oldmode);\n\tcpu->R[REG_POS(i,16)] = start;\n\t\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDA2_W(const u32 i)\n{\n\tu32 c, b;\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\t\t\n\tc = 0;\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\n\n\t UNTESTEDOPCODELOG(\"Untested opcode: OP_STMDA2_W \\n\");\n\t\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t\tstart -= 4;\n\t\t}\n\t}\t\n\t\n\tcpu->R[REG_POS(i,16)] = start;\n\t\n\tarmcpu_switchMode(cpu, oldmode);\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STMDB2_W(const u32 i)\n{\n\tu32 c, b;\t\n\tu32 start;\n\tu32 oldmode;\n\n\tif(cpu->CPSR.bits.mode==USR)\n\t\treturn 2;\n\t\t\n\tc = 0;\n\t\n\tstart = cpu->R[REG_POS(i,16)];\n\toldmode = armcpu_switchMode(cpu, SYS);\n\n\tUNTESTEDOPCODELOG(\"Untested opcode: OP_STMDB2_W \\n\");   \n\n\tfor(b=0; b<16; b++)\n\t{\n\t\tif(BIT_N(i, 15-b))\n\t\t{\n\t\t\tstart -= 4;\n\t\t\tWRITE32(cpu->mem_if->data, start, cpu->R[15-b]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(start);\n\t\t}\n\t}\t\n\t\n\tcpu->R[REG_POS(i,16)] = start;\n\t\n\tarmcpu_switchMode(cpu, oldmode);\n\treturn MMU_aluMemCycles<PROCNUM>(1, c);\n}\n\n//-----------------------------------------------------------------------------\n//   LDRD / STRD\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_LDRD_STRD_POST_INDEX(const u32 i)\n{\n\tu32 Rd_num = REG_POS( i, 12);\n\tu32 addr = cpu->R[REG_POS(i,16)];\n\tu32 index;\n\t//printf(\"%s POST\\n\", BIT5(i)?\"STRD\":\"LDRD\");\n\t/* I bit - immediate or register */\n\tif ( BIT22(i))\n\t\tindex = IMM_OFF;\n\telse\n\t\tindex = cpu->R[REG_POS(i,0)];\n\n\t// U bit - add or subtract\n\tif ( BIT23(i))\n\t\tcpu->R[REG_POS(i,16)] += index;\n\telse\n\t\tcpu->R[REG_POS(i,16)] -= index;\n\n\tu32 c = 0;\n\tif ( !(Rd_num & 0x1)) \n\t{\n\t\t// Store/Load\n\t\tif ( BIT5(i)) \n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, addr, cpu->R[Rd_num]);\n\t\t\tWRITE32(cpu->mem_if->data, addr + 4, cpu->R[Rd_num + 1]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr + 4);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcpu->R[Rd_num] = READ32(cpu->mem_if->data, addr);\n\t\t\tcpu->R[Rd_num + 1] = READ32(cpu->mem_if->data, addr + 4);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr + 4);\n\t\t}\n\t}\n\n\treturn MMU_aluMemCycles<PROCNUM>(3, c);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDRD_STRD_OFFSET_PRE_INDEX(const u32 i)\n{\n\tu32 Rd_num = REG_POS( i, 12);\n\tu32 addr = cpu->R[REG_POS(i,16)];\n\tu32 index;\n\n\t//printf(\"%s PRE\\n\", BIT5(i)?\"STRD\":\"LDRD\");\n\t// I bit - immediate or register\n\tif ( BIT22(i))\n\t\tindex = IMM_OFF;\n\telse\n\t\tindex = cpu->R[REG_POS(i,0)];\n\n\t// U bit - add or subtract\n\tif ( BIT23(i)) \n\t\taddr += index;\n\telse \n\t\taddr -= index;\n\n\tu32 c = 0;\n\tif ( !(Rd_num & 0x1))\n\t{\n\t\t// Store/Load\n\t\tif ( BIT5(i)) \n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, addr, cpu->R[Rd_num]);\n\t\t\tWRITE32(cpu->mem_if->data, addr + 4, cpu->R[Rd_num + 1]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(addr + 4);\n\t\t\t// W bit - writeback\n\t\t\tif ( BIT21(i))\n\t\t\t\tcpu->R[REG_POS(i,16)] = addr;\n\t\t}\n\t\telse \n\t\t{\n\t\t\t// W bit - writeback\n\t\t\tif ( BIT21(i))\n\t\t\t\tcpu->R[REG_POS(i,16)] = addr;\n\t\t\tcpu->R[Rd_num] = READ32(cpu->mem_if->data, addr);\n\t\t\tcpu->R[Rd_num + 1] = READ32(cpu->mem_if->data, addr + 4);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(addr + 4);\n\t\t}\n\t}\n\n\treturn MMU_aluMemCycles<PROCNUM>(3, c);\n}\n\n//-----------------------------------------------------------------------------\n//   STC\n//   the NDS has no coproc that responses to a STC, no feedback is given to the arm\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_STC_P_IMM_OFF(const u32 i)\n{\n\t//INFO(\"OP_STC_P_IMM_OFF\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STC_M_IMM_OFF(const u32 i)\n{\n\t//INFO(\"OP_STC_M_IMM_OFF\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STC_P_PREIND(const u32 i)\n{\n\t//INFO(\"OP_STC_P_PREIND\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STC_M_PREIND(const u32 i)\n{\n\t//INFO(\"OP_STC_M_PREIND\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STC_P_POSTIND(const u32 i)\n{\n\t//INFO(\"OP_STC_P_POSTIND: cp_num %i\\n\", (i>>8)&0x0F);\n\treturn TRAPUNDEF(cpu);\n\n\n}\n\nTEMPLATE static u32 FASTCALL  OP_STC_M_POSTIND(const u32 i)\n{\n\t//INFO(\"OP_STC_M_POSTIND\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_STC_OPTION(const u32 i)\n{\n\t//INFO(\"OP_STC_OPTION\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\n//-----------------------------------------------------------------------------\n//   LDC\n//   the NDS has no coproc that responses to a LDC, no feedback is given to the arm\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_LDC_P_IMM_OFF(const u32 i)\n{\n\t//INFO(\"OP_LDC_P_IMM_OFF\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDC_M_IMM_OFF(const u32 i)\n{\n\t//INFO(\"OP_LDC_M_IMM_OFF\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDC_P_PREIND(const u32 i)\n{\n\t//INFO(\"OP_LDC_P_PREIND\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDC_M_PREIND(const u32 i)\n{\n\t//INFO(\"OP_LDC_M_PREIND\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDC_P_POSTIND(const u32 i)\n{\n\t//INFO(\"OP_LDC_P_POSTIND\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDC_M_POSTIND(const u32 i)\n{\n\t//INFO(\"OP_LDC_M_POSTIND\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\nTEMPLATE static u32 FASTCALL  OP_LDC_OPTION(const u32 i)\n{\n\t//INFO(\"OP_LDC_OPTION\\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\n//-----------------------------------------------------------------------------\n//   MCR / MRC\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_MCR(const u32 i)\n{\n\tu32 cpnum = REG_POS(i, 8);\n\t\n\tif(cpnum != 15)\n\t{\n\t\t//emu_halt();\n\t\t//INFO(\"Stopped (OP_MCR) \\n\");\n\t\tINFO(\"ARM%c: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", \n\t\t\tPROCNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\n\t\treturn 2;\n\t}\n\n\tcp15.moveARM2CP(cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\n\n\treturn 2;\n}\n\nTEMPLATE static u32 FASTCALL  OP_MRC(const u32 i)\n{\n\t//if (PROCNUM != 0) return 1;\n\n\tu32 cpnum = REG_POS(i, 8);\n\t\n\tif(cpnum != 15)\n\t{\n\t\t//emu_halt();\n\t\t//INFO(\"Stopped (OP_MRC) \\n\");\n\t\tINFO(\"ARM%c: MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", \n\t\t\tPROCNUM?'7':'9', cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\n\t\treturn 2;\n\t}\n\n\t// ARM REF:\n\t//data = value from Coprocessor[cp_num]\n\t//if Rd is R15 then\n\t//\tN flag = data[31]\n\t//\tZ flag = data[30]\n\t//\tC flag = data[29]\n\t//\tV flag = data[28]\n\t//else /* Rd is not R15 */\n\t//\tRd = data\n\n\tu32 data = 0;\n\tcp15.moveCP2ARM(&data, REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\n\tif (REG_POS(i, 12) == 15)\n\t{\n\t\tcpu->CPSR.bits.N = BIT31(data);\n\t\tcpu->CPSR.bits.Z = BIT30(data);\n\t\tcpu->CPSR.bits.C = BIT29(data);\n\t\tcpu->CPSR.bits.V = BIT28(data);\n\t}\n\telse\n\t\tcpu->R[REG_POS(i, 12)] = data;\n\t//cpu->coproc[cpnum]->moveCP2ARM(&cpu->R[REG_POS(i, 12)], REG_POS(i, 16), REG_POS(i, 0), (i>>21)&7, (i>>5)&7);\n\treturn 4;\n}\n\n//-----------------------------------------------------------------------------\n//   SWI\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_SWI(const u32 i)\n{\n\tu32 swinum = (i>>16)&0xFF;\n\n\t//ideas-style debug prints (execute this SWI with the null terminated string address in R0)\n\tif(swinum==0xFC) \n\t{\n\t\tIdeasLog(cpu);\n\t\treturn 0;\n\t}\n\n\t//if the user has changed the intVector to point away from the nds bioses,\n\t//then it doesn't really make any sense to use the builtin SWI's since \n\t//the bios ones aren't getting called anyway\n\tbool bypassBuiltinSWI = \n\t\t(cpu->intVector == 0x00000000 && PROCNUM==0)\n\t\t|| (cpu->intVector == 0xFFFF0000 && PROCNUM==1);\n\n\tif(cpu->swi_tab && !bypassBuiltinSWI)\n\t{\n\t\tswinum &= 0x1F;\n\t\t//printf(\"%d ARM SWI %d \\n\",PROCNUM,swinum);\n\t\treturn cpu->swi_tab[swinum]() + 3;\n\t} \n\telse \n\t{\n\t\t/* TODO (#1#): translocated SWI vectors */\n\t\t/* we use an irq thats not in the irq tab, as\n\t\t it was replaced duie to a changed intVector */\n\t\tStatus_Reg tmp = cpu->CPSR;\n\t\tarmcpu_switchMode(cpu, SVC);\t\t\t\t/* enter svc mode */\n\t\tcpu->R[14] = cpu->next_instruction;\n\t\tcpu->SPSR = tmp;\t\t\t\t\t\t\t/* save old CPSR as new SPSR */\n\t\tcpu->CPSR.bits.T = 0;\t\t\t\t\t\t/* handle as ARM32 code */\n\t\tcpu->CPSR.bits.I = 1;\n\t\tcpu->changeCPSR();\n\t\tcpu->R[15] = cpu->intVector + 0x08;\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n}\n\n//-----------------------------------------------------------------------------\n//   BKPT\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL OP_BKPT(const u32 i)\n{\n\t/* ARM-ref\n\tif (not overridden by debug hardware)\n\t\tR14_abt = address of BKPT instruction + 4\n\t\tSPSR_abt = CPSR\n\t\tCPSR[4:0] = 0b10111 // Enter Abort mode \n\t\tCPSR[5] = 0 // Execute in ARM state\n\t\t// CPSR[6] is unchanged\n\t\tCPSR[7] = 1 // Disable normal interrupts\n\t\tCPSR[8] = 1 // Disable imprecise aborts - v6 only\n\t\tCPSR[9] = CP15_reg1_EEbit\n\t\tif high vectors configured then\n\t\t\tPC = 0xFFFF000C\n\t\telse\n\t\t\tPC = 0x0000000C\n\t*/\n\n\t/*\n\tstatic u32 last_bkpt = 0xFFFFFFFF;\n\tif(i != last_bkpt)\n\t\tprintf(\"ARM OP_BKPT triggered\\n\");\n\tlast_bkpt = i;\n\n\t//this is not 100% correctly emulated, but it does the job\n\tcpu->next_instruction = cpu->instruct_adr;\n\treturn 4;\n\t*/\n\n\tprintf(\"ARM OP_BKPT triggered\\n\");\n\tStatus_Reg tmp = cpu->CPSR;\n\tarmcpu_switchMode(cpu, ABT);\t\t\t\t// enter abt mode\n\tcpu->R[14] = cpu->instruct_adr + 4;\n\tcpu->SPSR = tmp;\t\t\t\t\t\t\t// save old CPSR as new SPSR\n\tcpu->CPSR.bits.T = 0;\t\t\t\t\t\t// handle as ARM32 code\n\tcpu->CPSR.bits.I = 1;\n\tcpu->changeCPSR();\n\tcpu->R[15] = cpu->intVector + 0x0C;\n\tcpu->next_instruction = cpu->R[15];\n\treturn 4;\n}\n\n//-----------------------------------------------------------------------------\n//   CDP\n//-----------------------------------------------------------------------------\n\nTEMPLATE static u32 FASTCALL  OP_CDP(const u32 i)\n{\n\t//INFO(\"Stopped (OP_CDP) \\n\");\n\treturn TRAPUNDEF(cpu);\n}\n\n//-----------------------------------------------------------------------------\n//   The End\n//-----------------------------------------------------------------------------\n\nconst OpFunc arm_instructions_set[2][4096] = {{\n#define TABDECL(x) x<0>\n#include \"instruction_tabdef.inc\"\n#undef TABDECL\n},{\n#define TABDECL(x) x<1>\n#include \"instruction_tabdef.inc\"\n#undef TABDECL\n}};\n\n#define TABDECL(x) #x\nconst char* arm_instruction_names[4096] = {\n#include \"instruction_tabdef.inc\"\n};\n#undef TABDECL\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/arm_instructions.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ARMINSTRUCTION_H\n#define ARMINSTRUCTION_H\n\n#include \"armcpu.h\"\n\ntypedef u32 (FASTCALL* ArmOpFunc)(const u32 i);\n\nextern const ArmOpFunc arm_instructions_set_0[4096];\nextern const ArmOpFunc arm_instructions_set_1[4096];\n\nextern const char* arm_instruction_names[4096];\n \n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/arm_jit.cpp",
    "content": " /*\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2011 Loren Merritt\n\tCopyright (C) 2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 3 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"types.h\"\n#ifdef HAVE_JIT\n#if !defined(__x86_64__) && !defined(__LP64) && !defined(__IA64__) && !defined(_M_X64) && !defined(_WIN64) && !defined(_M_IX86) && !defined(__INTEL__) && !defined(__i386__)\n#error \"ERROR: JIT compiler - unsupported target platform\"\n#endif\n#ifdef _WINDOWS\n// **** Windows port\n#else\n#include <sys/mman.h>\n#include <errno.h>\n#include <unistd.h>\n#include <stddef.h>\n#define HAVE_STATIC_CODE_BUFFER\n#endif\n#include \"instructions.h\"\n#include \"instruction_attributes.h\"\n#include \"Disassembler.h\"\n#include \"MMU.h\"\n#include \"MMU_timing.h\"\n#include \"utils/AsmJit/AsmJit.h\"\n#include \"arm_jit.h\"\n#include \"bios.h\"\n\n#define LOG_JIT_LEVEL 0\n#define PROFILER_JIT_LEVEL 0\n\n#if (PROFILER_JIT_LEVEL > 0)\n#include <algorithm>\n#endif\n\nusing namespace AsmJit;\n\n#if (LOG_JIT_LEVEL > 0)\n#define LOG_JIT 1\n#define JIT_COMMENT(...) c.comment(__VA_ARGS__)\n#define printJIT(buf, val) { \\\n\tJIT_COMMENT(\"printJIT(\\\"\"##buf\"\\\", val);\"); \\\n\tGpVar txt = c.newGpVar(kX86VarTypeGpz); \\\n\tGpVar data = c.newGpVar(kX86VarTypeGpz); \\\n\tGpVar io = c.newGpVar(kX86VarTypeGpd); \\\n\tc.lea(io, dword_ptr_abs(stdout)); \\\n\tc.lea(txt, dword_ptr_abs(&buf)); \\\n\tc.mov(data, *(GpVar*)&val); \\\n\tX86CompilerFuncCall* prn = c.call((uintptr_t)fprintf); \\\n\tprn->setPrototype(ASMJIT_CALL_CONV, FuncBuilder3<void, void*, void*, u32>()); \\\n\tprn->setArgument(0, io); \\\n\tprn->setArgument(1, txt); \\\n\tprn->setArgument(2, data); \\\n\tX86CompilerFuncCall* prn_flush = c.call((uintptr_t)fflush); \\\n\tprn_flush->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1<void, void*>()); \\\n\tprn_flush->setArgument(0, io); \\\n}\n#else\n#define LOG_JIT 0\n#define JIT_COMMENT(...)\n#define printJIT(buf, val)\n#endif\n\ntypedef u32 (FASTCALL* ArmOpCompiled)();\n\n#ifdef HAVE_STATIC_CODE_BUFFER\n// On x86_64, allocate jitted code from a static buffer to ensure that it's within 2GB of .text\n// Allows call instructions to use pcrel offsets, as opposed to slower indirect calls.\n// Reduces memory needed for function pointers.\n// FIXME win64 needs this too, x86_32 doesn't\n\nDS_ALIGN(4096) static u8 scratchpad[1<<25];\nstatic u8 *scratchptr;\n\nvoid arm_jit_reset();\n\nstruct ASMJIT_API StaticCodeGenerator : public Context\n{\n\tStaticCodeGenerator()\n\t{\n\t\tscratchptr = scratchpad;\n\t\tint align = (uintptr_t)scratchpad & (sysconf(_SC_PAGESIZE) - 1);\n\t\tint err = mprotect(scratchpad-align, sizeof(scratchpad)+align, PROT_READ|PROT_WRITE|PROT_EXEC);\n\t\tif(err)\n\t\t{\n\t\t\tfprintf(stderr, \"mprotect failed: %s\\n\", strerror(errno));\n\t\t\tabort();\n\t\t}\n\t}\n\n\tuint32_t generate(void** dest, Assembler* assembler)\n\t{\n\t\tuintptr_t size = assembler->getCodeSize();\n\t\tif(size == 0)\n\t\t{\n\t\t\t*dest = NULL;\n\t\t\treturn kErrorNoFunction;\n\t\t}\n\t\tif(size > (uintptr_t)(scratchpad+sizeof(scratchpad)-scratchptr))\n\t\t{\n\t\t\tfprintf(stderr, \"Out of memory for asmjit. Clearing code cache.\\n\");\n\t\t\tarm_jit_reset();\n\t\t\t// If arm_jit_reset didn't involve recompiling op_cmp, we could keep the current function.\n\t\t\t*dest = NULL;\n\t\t\treturn kErrorOk;\n\t\t}\n\t\tvoid *p = scratchptr;\n\t\tsize = assembler->relocCode(p);\n\t\tscratchptr += size;\n\t\t*dest = p;\n\t\treturn kErrorOk;\n\t}\n};\n\nstatic StaticCodeGenerator codegen;\nstatic X86Compiler c(&codegen);\n#else\nstatic X86Compiler c;\n#endif\n\nstatic void emit_branch(int cond, Label to);\nstatic void _armlog(u8 proc, u32 addr, u32 opcode);\n\nstatic FileLogger logger(stderr);\n\nstatic int PROCNUM;\nstatic int *PROCNUM_ptr = &PROCNUM;\nstatic int bb_opcodesize;\nstatic int bb_adr;\nstatic bool bb_thumb;\nstatic GpVar bb_cpu;\nstatic GpVar bb_cycles;\nstatic GpVar bb_total_cycles;\nstatic u32 bb_constant_cycles;\n\n#define cpu (&ARMPROC)\n#define bb_next_instruction (bb_adr + bb_opcodesize)\n#define bb_r15\t\t\t\t(bb_adr + 2 * bb_opcodesize)\n\n#define cpu_ptr(x)\t\t\tdword_ptr(bb_cpu, offsetof(armcpu_t, x))\n#define cpu_ptr_byte(x, y)\tbyte_ptr(bb_cpu, offsetof(armcpu_t, x) + y)\n#define flags_ptr\t\t\tcpu_ptr_byte(CPSR.val, 3)\n#define reg_ptr(x)\t\t\tdword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*(x))\n#define reg_pos_ptr(x)\t\tdword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x)))\n#define reg_pos_ptrL(x)\t\tword_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x)))\n#define reg_pos_ptrH(x)\t\tword_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x)) + 2)\n#define reg_pos_ptrB(x)\t\tbyte_ptr( bb_cpu, offsetof(armcpu_t, R) + 4*REG_POS(i,(x)))\n#define reg_pos_thumb(x)\tdword_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*((i>>(x))&0x7))\n#define reg_pos_thumbB(x)\tbyte_ptr(bb_cpu, offsetof(armcpu_t, R) + 4*((i>>(x))&0x7))\n#define cp15_ptr(x)\t\t\tdword_ptr(bb_cp15, offsetof(armcp15_t, x))\n#define mmu_ptr(x)\t\t\tdword_ptr(bb_mmu, offsetof(MMU_struct, x))\n#define mmu_ptr_byte(x)\t\tbyte_ptr(bb_mmu, offsetof(MMU_struct, x))\n#define _REG_NUM(i, n)\t\t((i>>(n))&0x7)\n\n#ifndef ASMJIT_X64\n#define r64 r32\n#endif\n\n// sequencer.reschedule = true;\n#define changeCPSR { \\\n\t\t\tX86CompilerFuncCall* ctxCPSR = c.call((void*)NDS_Reschedule); \\\n\t\t\tctxCPSR->setPrototype(kX86FuncConvDefault, FuncBuilder0<void>()); \\\n}\n\n#if (PROFILER_JIT_LEVEL > 0)\nstruct PROFILER_COUNTER_INFO\n{\n\tu64\tcount;\n\tchar name[64];\n};\n\nstruct JIT_PROFILER\n{\n\tJIT_PROFILER::JIT_PROFILER()\n\t{\n\t\tmemset(&arm_count[0], 0, sizeof(arm_count));\n\t\tmemset(&thumb_count[0], 0, sizeof(thumb_count));\n\t}\n\n\tu64 arm_count[4096];\n\tu64 thumb_count[1024];\n} profiler_counter[2];\n\nstatic GpVar bb_profiler;\n\n#define profiler_counter_arm(opcode)   qword_ptr(bb_profiler, offsetof(JIT_PROFILER, arm_count[INSTRUCTION_INDEX(opcode)]))\n#define profiler_counter_thumb(opcode) qword_ptr(bb_profiler, offsetof(JIT_PROFILER, thumb_count[opcode>>6]))\n\n#if (PROFILER_JIT_LEVEL > 1)\nstruct PROFILER_ENTRY\n{\n\tu32 addr;\n\tu32\tcycles;\n} profiler_entry[2][1<<26];\n\nstatic GpVar bb_profiler_entry;\n#endif\n\n#endif\n//-----------------------------------------------------------------------------\n//   Shifting macros\n//-----------------------------------------------------------------------------\n#define SET_NZCV(sign) { \\\n\tJIT_COMMENT(\"SET_NZCV\"); \\\n\tGpVar x = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar y = c.newGpVar(kX86VarTypeGpd); \\\n\tc.sets(x.r8Lo()); \\\n\tc.setz(y.r8Lo()); \\\n\tc.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \\\n\tif (sign) { c.setnc(y.r8Lo()); } else { c.setc(y.r8Lo()); } \\\n\tc.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \\\n\tc.seto(y.r8Lo()); \\\n\tc.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \\\n\tc.movzx(y, flags_ptr); \\\n\tc.shl(x, 4); \\\n\tc.and_(y, 0xF); \\\n\tc.or_(x, y); \\\n\tc.mov(flags_ptr, x.r8Lo()); \\\n\tc.unuse(x); \\\n\tc.unuse(y); \\\n\tJIT_COMMENT(\"end SET_NZCV\"); \\\n}\n\n#define SET_NZC { \\\n\tJIT_COMMENT(\"SET_NZC\"); \\\n\tGpVar x = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar y = c.newGpVar(kX86VarTypeGpd); \\\n\tc.sets(x.r8Lo()); \\\n\tc.setz(y.r8Lo()); \\\n\tc.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \\\n\tif (cf_change) { c.lea(x, ptr(rcf.r64(), x.r64(), kScale2Times)); c.unuse(rcf); } \\\n\tc.movzx(y, flags_ptr); \\\n\tc.shl(x, 6 - cf_change); \\\n\tc.and_(y, cf_change?0x1F:0x3F); \\\n\tc.or_(x, y); \\\n\tc.mov(flags_ptr, x.r8Lo()); \\\n\tJIT_COMMENT(\"end SET_NZC\"); \\\n}\n\n#define SET_NZC_SHIFTS_ZERO(cf) { \\\n\tJIT_COMMENT(\"SET_NZC_SHIFTS_ZERO\"); \\\n\tc.and_(flags_ptr, 0x1F); \\\n\tif(cf) \\\n\t{ \\\n\t\tc.shl(rcf, 5); \\\n\t\tc.or_(rcf, (1<<6)); \\\n\t\tc.or_(flags_ptr, rcf.r8Lo()); \\\n\t} \\\n\telse \\\n\t\tc.or_(flags_ptr, (1<<6)); \\\n\tJIT_COMMENT(\"end SET_NZC_SHIFTS_ZERO\"); \\\n}\n\n#define SET_NZ(clear_cv) { \\\n\tJIT_COMMENT(\"SET_NZ\"); \\\n\tGpVar x = c.newGpVar(kX86VarTypeGpz); \\\n\tGpVar y = c.newGpVar(kX86VarTypeGpz); \\\n\tc.sets(x.r8Lo()); \\\n\tc.setz(y.r8Lo()); \\\n\tc.lea(x, ptr(y.r64(), x.r64(), kScale2Times)); \\\n\tc.movzx(y, flags_ptr); \\\n\tc.and_(y, clear_cv?0x0F:0x3F); \\\n\tc.shl(x, 6); \\\n\tc.or_(x, y); \\\n\tc.mov(flags_ptr, x.r8Lo()); \\\n\tJIT_COMMENT(\"end SET_NZ\"); \\\n}\n\n#define SET_Q { \\\n\tJIT_COMMENT(\"SET_Q\"); \\\n\tGpVar x = c.newGpVar(kX86VarTypeGpz); \\\n\tc.seto(x.r8Lo()); \\\n\tc.shl(x, 3); \\\n\tc.or_(flags_ptr, x.r8Lo()); \\\n\tJIT_COMMENT(\"end SET_Q\"); \\\n}\n\n#define S_DST_R15 { \\\n\tJIT_COMMENT(\"S_DST_R15\"); \\\n\tGpVar SPSR = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd); \\\n\tc.mov(SPSR, cpu_ptr(SPSR.val)); \\\n\tc.mov(tmp, SPSR); \\\n\tc.and_(tmp, 0x1F); \\\n\tX86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \\\n\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder2<void, void*, u8>()); \\\n\tctx->setArgument(0, bb_cpu); \\\n\tctx->setArgument(1, tmp); \\\n\tc.mov(cpu_ptr(CPSR.val), SPSR); \\\n\tc.and_(SPSR, (1<<5)); \\\n\tc.shr(SPSR, 5); \\\n\tc.lea(tmp, ptr_abs((void*)0xFFFFFFFC, SPSR.r64(), kScale2Times)); \\\n\tc.and_(tmp, reg_ptr(15)); \\\n\tc.mov(cpu_ptr(next_instruction), tmp); \\\n\tc.unuse(tmp); \\\n\tJIT_COMMENT(\"end S_DST_R15\"); \\\n}\n\n// ============================================================================================= IMM\n#define LSL_IMM \\\n\tJIT_COMMENT(\"LSL_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu32 imm = ((i>>7)&0x1F); \\\n    GpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tif(imm) c.shl(rhs, imm); \\\n\tu32 rhs_first = cpu->R[REG_POS(i,0)] << imm;\n\n#define S_LSL_IMM \\\n\tJIT_COMMENT(\"S_LSL_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu8 cf_change = 0; \\\n\tGpVar rcf; \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tu32 imm = ((i>>7)&0x1F); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tif (imm)  \\\n\t{ \\\n\t\tcf_change = 1; \\\n\t\tc.shl(rhs, imm); \\\n\t\trcf = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.setc(rcf.r8Lo()); \\\n\t}\n\n#define LSR_IMM \\\n\tJIT_COMMENT(\"LSR_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu32 imm = ((i>>7)&0x1F); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tif(imm) \\\n\t{ \\\n\t\tc.mov(rhs, reg_pos_ptr(0)); \\\n\t\tc.shr(rhs, imm); \\\n\t} \\\n\telse \\\n\t\tc.mov(rhs, 0); \\\n\tu32 rhs_first = imm ? cpu->R[REG_POS(i,0)] >> imm : 0;\n\n#define S_LSR_IMM \\\n\tJIT_COMMENT(\"S_LSR_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu8 cf_change = 1; \\\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tu32 imm = ((i>>7)&0x1F); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tif (!imm) \\\n\t{ \\\n\t\tc.test(rhs, (1 << 31)); \\\n\t\tc.setnz(rcf.r8Lo()); \\\n\t\tc.xor_(rhs, rhs); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc.shr(rhs, imm); \\\n\t\tc.setc(rcf.r8Lo()); \\\n\t}\n\n#define ASR_IMM \\\n\tJIT_COMMENT(\"ASR_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu32 imm = ((i>>7)&0x1F); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tif(!imm) imm = 31; \\\n\tc.sar(rhs, imm); \\\n\tu32 rhs_first = (s32)cpu->R[REG_POS(i,0)] >> imm;\n\n#define S_ASR_IMM \\\n\tJIT_COMMENT(\"S_ASR_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu8 cf_change = 1; \\\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tu32 imm = ((i>>7)&0x1F); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tif (!imm) imm = 31; \\\n\tc.sar(rhs, imm); \\\n\timm==31?c.sets(rcf.r8Lo()):c.setc(rcf.r8Lo());\n\n#define ROR_IMM \\\n\tJIT_COMMENT(\"ROR_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu32 imm = ((i>>7)&0x1F); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tif (!imm) \\\n\t{ \\\n\t\tc.bt(flags_ptr, 5); \\\n\t\tc.rcr(rhs, 1); \\\n\t} \\\n\telse \\\n\t\tc.ror(rhs, imm); \\\n\tu32 rhs_first = imm?ROR(cpu->R[REG_POS(i,0)], imm) : ((u32)cpu->CPSR.bits.C<<31)|(cpu->R[REG_POS(i,0)]>>1);\n\n#define S_ROR_IMM \\\n\tJIT_COMMENT(\"S_ROR_IMM\"); \\\n\tbool rhs_is_imm = false; \\\n\tu8 cf_change = 1; \\\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tu32 imm = ((i>>7)&0x1F); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tif (!imm) \\\n\t{ \\\n\t\tc.bt(flags_ptr, 5); \\\n\t\tc.rcr(rhs, 1); \\\n\t} \\\n\telse \\\n\t\tc.ror(rhs, imm); \\\n\tc.setc(rcf.r8Lo());\n\n#define REG_OFF \\\n\tJIT_COMMENT(\"REG_OFF\"); \\\n\tbool rhs_is_imm = false; \\\n\tMem rhs = reg_pos_ptr(0); \\\n\tu32 rhs_first = cpu->R[REG_POS(i,0)];\n\n#define IMM_VAL \\\n\tJIT_COMMENT(\"IMM_VAL\"); \\\n\tbool rhs_is_imm = true; \\\n\tu32 rhs = ROR((i&0xFF), (i>>7)&0x1E); \\\n\tu32 rhs_first = rhs;\n\n#define S_IMM_VAL \\\n\tJIT_COMMENT(\"S_IMM_VAL\"); \\\n\tbool rhs_is_imm = true; \\\n\tu8 cf_change = 0; \\\n\tGpVar rcf; \\\n\tu32 rhs = ROR((i&0xFF), (i>>7)&0x1E); \\\n\tif ((i>>8)&0xF) \\\n\t{ \\\n\t\tcf_change = 1; \\\n\t\trcf = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.mov(rcf, BIT31(rhs)); \\\n\t} \\\n\tu32 rhs_first = rhs;\n\n#define IMM_OFF \\\n\tJIT_COMMENT(\"IMM_OFF\"); \\\n\tbool rhs_is_imm = true; \\\n\tu32 rhs = ((i>>4)&0xF0)+(i&0xF); \\\n\tu32 rhs_first = rhs;\n\n#define IMM_OFF_12 \\\n\tJIT_COMMENT(\"IMM_OFF_12\"); \\\n\tbool rhs_is_imm = true; \\\n\tu32 rhs = (i & 0xFFF); \\\n\tu32 rhs_first = rhs;\n\n// ============================================================================================= REG\n#define LSX_REG(name, x86inst, sign) \\\n\tJIT_COMMENT(#name); \\\n\tbool rhs_is_imm = false; \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar imm = c.newGpVar(kX86VarTypeGpz); \\\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpz); \\\n\tif(sign) c.mov(tmp, 31); \\\n\telse c.mov(tmp, 0); \\\n\tc.movzx(imm, reg_pos_ptrB(8)); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tc.cmp(imm, 31); \\\n\tif(sign) c.cmovg(imm, tmp); \\\n\telse c.cmovg(rhs, tmp); \\\n\tc.x86inst(rhs, imm); \\\n\tc.unuse(tmp);\n\n#define S_LSX_REG(name, x86inst, sign) \\\n\tJIT_COMMENT(#name); \\\n\tbool rhs_is_imm = false; \\\n\tu8 cf_change = 1; \\\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar imm = c.newGpVar(kX86VarTypeGpz); \\\n\tLabel __zero = c.newLabel(); \\\n\tLabel __lt32 = c.newLabel(); \\\n\tLabel __done = c.newLabel(); \\\n\tc.mov(imm, reg_pos_ptr(8)); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tc.and_(imm, 0xFF); \\\n\tc.jz(__zero); \\\n\tc.cmp(imm, 32); \\\n\tc.jl(__lt32); \\\n\tif(!sign) \\\n\t{ \\\n\t\tLabel __eq32 = c.newLabel(); \\\n\t\tc.je(__eq32); \\\n\t\t/* imm > 32 */ \\\n\t\tc.mov(rhs, 0); \\\n\t\tc.mov(rcf, 0); \\\n\t\tc.jmp(__done); \\\n\t\t/* imm == 32 */ \\\n\t\tc.bind(__eq32); \\\n\t} \\\n\tc.x86inst(rhs, 31); \\\n\tc.x86inst(rhs, 1); \\\n\tc.setc(rcf.r8Lo()); \\\n\tc.jmp(__done); \\\n\t/* imm == 0 */ \\\n\tc.bind(__zero); \\\n\tc.test(flags_ptr, (1 << 5)); \\\n\tc.setnz(rcf.r8Lo()); \\\n\tc.jmp(__done); \\\n\t/* imm < 32 */ \\\n\tc.bind(__lt32); \\\n\tc.x86inst(rhs, imm); \\\n\tc.setc(rcf.r8Lo()); \\\n\t/* done */ \\\n\tc.bind(__done);\n\n#define LSL_REG LSX_REG(LSL_REG, shl, 0)\n#define LSR_REG LSX_REG(LSR_REG, shr, 0)\n#define ASR_REG LSX_REG(ASR_REG, sar, 1)\n#define S_LSL_REG S_LSX_REG(S_LSL_REG, shl, 0)\n#define S_LSR_REG S_LSX_REG(S_LSR_REG, shr, 0)\n#define S_ASR_REG S_LSX_REG(S_ASR_REG, sar, 1)\n\n#define ROR_REG \\\n\tJIT_COMMENT(\"ROR_REG\"); \\\n\tbool rhs_is_imm = false; \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar imm = c.newGpVar(kX86VarTypeGpz); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tc.mov(imm, reg_pos_ptrB(8)); \\\n\tc.ror(rhs, imm.r8Lo());\n\n#define S_ROR_REG \\\n\tJIT_COMMENT(\"S_ROR_REG\"); \\\n\tbool rhs_is_imm = false; \\\n\tbool cf_change = 1; \\\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar imm = c.newGpVar(kX86VarTypeGpz); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tLabel __zero = c.newLabel(); \\\n\tLabel __zero_1F = c.newLabel(); \\\n\tLabel __done = c.newLabel(); \\\n\tc.mov(imm, reg_pos_ptr(8)); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tc.and_(imm, 0xFF); \\\n\tc.jz(__zero);\\\n\tc.and_(imm, 0x1F); \\\n\tc.jz(__zero_1F);\\\n\t/* imm&0x1F != 0 */ \\\n\tc.ror(rhs, imm); \\\n\tc.setc(rcf.r8Lo()); \\\n\tc.jmp(__done); \\\n\t/* imm&0x1F == 0 */ \\\n\tc.bind(__zero_1F); \\\n\tc.test(rhs, (1 << 31)); \\\n\tc.setnz(rcf.r8Lo()); \\\n\tc.jmp(__done); \\\n\t/* imm == 0 */ \\\n\tc.bind(__zero); \\\n\tc.test(flags_ptr, (1 << 5)); \\\n\tc.setnz(rcf.r8Lo()); \\\n\t/* done */ \\\n\tc.bind(__done);\n\n//==================================================================== common funcs\nstatic void emit_MMU_aluMemCycles(int alu_cycles, GpVar mem_cycles, int population)\n{\n\tif(PROCNUM==ARMCPU_ARM9)\n\t{\n\t\tif(population < alu_cycles)\n\t\t{\n\t\t\tGpVar x = c.newGpVar(kX86VarTypeGpd);\n\t\t\tc.mov(x, alu_cycles);\n\t\t\tc.cmp(mem_cycles, alu_cycles);\n\t\t\tc.cmovl(mem_cycles, x);\n\t\t}\n\t}\n\telse\n\t\tc.add(mem_cycles, alu_cycles);\n}\n\n//-----------------------------------------------------------------------------\n//   OPs\n//-----------------------------------------------------------------------------\n#define OP_ARITHMETIC(arg, x86inst, symmetric, flags) \\\n    arg; \\\n\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\tif(REG_POS(i,12) == REG_POS(i,16)) \\\n\t\tc.x86inst(reg_pos_ptr(12), rhs); \\\n\telse if(symmetric && !rhs_is_imm) \\\n\t{ \\\n\t\tc.x86inst(*(GpVar*)&rhs, reg_pos_ptr(16)); \\\n\t\tc.mov(reg_pos_ptr(12), rhs); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc.mov(lhs, reg_pos_ptr(16)); \\\n\t\tc.x86inst(lhs, rhs); \\\n\t\tc.mov(reg_pos_ptr(12), lhs); \\\n\t} \\\n\tif(flags) \\\n\t{ \\\n\t\tif(REG_POS(i,12)==15) \\\n\t\t{ \\\n\t\t\tS_DST_R15; \\\n\t\t\tc.add(bb_total_cycles, 2); \\\n\t\t\treturn 1; \\\n\t\t} \\\n\t\tSET_NZCV(!symmetric); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tif(REG_POS(i,12)==15) \\\n\t\t{ \\\n\t\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd); \\\n\t\t\tc.mov(tmp, reg_ptr(15)); \\\n\t\t\tc.mov(cpu_ptr(next_instruction), tmp); \\\n\t\t\tc.add(bb_total_cycles, 2); \\\n\t\t} \\\n\t} \\\n\treturn 1;\n\n#define OP_ARITHMETIC_R(arg, x86inst, flags) \\\n    arg; \\\n\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\tc.mov(lhs, rhs); \\\n\tc.x86inst(lhs, reg_pos_ptr(16)); \\\n\tc.mov(reg_pos_ptr(12), lhs); \\\n\tif(flags) \\\n\t{ \\\n\t\tif(REG_POS(i,12)==15) \\\n\t\t{ \\\n\t\t\tS_DST_R15; \\\n\t\t\tc.add(bb_total_cycles, 2); \\\n\t\t\treturn 1; \\\n\t\t} \\\n\t\tSET_NZCV(1); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tif(REG_POS(i,12)==15) \\\n\t\t{ \\\n\t\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd); \\\n\t\t\tc.mov(cpu_ptr(next_instruction), lhs); \\\n\t\t\tc.add(bb_total_cycles, 2); \\\n\t\t} \\\n\t} \\\n\treturn 1;\n\n#define OP_ARITHMETIC_S(arg, x86inst, symmetric) \\\n    arg; \\\n\tif(REG_POS(i,12) == REG_POS(i,16)) \\\n\t\tc.x86inst(reg_pos_ptr(12), rhs); \\\n\telse if(symmetric && !rhs_is_imm) \\\n\t{ \\\n\t\tc.x86inst(*(GpVar*)&rhs, reg_pos_ptr(16)); \\\n\t\tc.mov(reg_pos_ptr(12), rhs); \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.mov(lhs, reg_pos_ptr(16)); \\\n\t\tc.x86inst(lhs, rhs); \\\n\t\tc.mov(reg_pos_ptr(12), lhs); \\\n\t} \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tS_DST_R15; \\\n\t\tc.add(bb_total_cycles, 2); \\\n\t\treturn 1; \\\n\t} \\\n\tSET_NZC; \\\n\treturn 1;\n\n#define GET_CARRY(invert) { \\\n\tc.bt(flags_ptr, 5); \\\n\tif (invert) c.cmc(); }\n\nstatic int OP_AND_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, and_, 1, 0); }\nstatic int OP_AND_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, and_, 1, 0); }\nstatic int OP_AND_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, and_, 1, 0); }\nstatic int OP_AND_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, and_, 1, 0); }\nstatic int OP_AND_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, and_, 1, 0); }\nstatic int OP_AND_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, and_, 1, 0); }\nstatic int OP_AND_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, and_, 1, 0); }\nstatic int OP_AND_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, and_, 1, 0); }\nstatic int OP_AND_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, and_, 1, 0); }\n\nstatic int OP_EOR_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, xor_, 1, 0); }\nstatic int OP_EOR_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, xor_, 1, 0); }\nstatic int OP_EOR_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, xor_, 1, 0); }\nstatic int OP_EOR_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, xor_, 1, 0); }\nstatic int OP_EOR_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, xor_, 1, 0); }\nstatic int OP_EOR_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, xor_, 1, 0); }\nstatic int OP_EOR_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, xor_, 1, 0); }\nstatic int OP_EOR_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, xor_, 1, 0); }\nstatic int OP_EOR_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, xor_, 1, 0); }\n\nstatic int OP_ORR_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, or_, 1, 0); }\nstatic int OP_ORR_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, or_, 1, 0); }\nstatic int OP_ORR_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, or_, 1, 0); }\nstatic int OP_ORR_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, or_, 1, 0); }\nstatic int OP_ORR_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, or_, 1, 0); }\nstatic int OP_ORR_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, or_, 1, 0); }\nstatic int OP_ORR_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, or_, 1, 0); }\nstatic int OP_ORR_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, or_, 1, 0); }\nstatic int OP_ORR_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, or_, 1, 0); }\n\nstatic int OP_ADD_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, add, 1, 0); }\nstatic int OP_ADD_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, add, 1, 0); }\nstatic int OP_ADD_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, add, 1, 0); }\nstatic int OP_ADD_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, add, 1, 0); }\nstatic int OP_ADD_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, add, 1, 0); }\nstatic int OP_ADD_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, add, 1, 0); }\nstatic int OP_ADD_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, add, 1, 0); }\nstatic int OP_ADD_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, add, 1, 0); }\nstatic int OP_ADD_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, add, 1, 0); }\n\nstatic int OP_SUB_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, sub, 0, 0); }\nstatic int OP_SUB_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, sub, 0, 0); }\nstatic int OP_SUB_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, sub, 0, 0); }\nstatic int OP_SUB_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, sub, 0, 0); }\nstatic int OP_SUB_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, sub, 0, 0); }\nstatic int OP_SUB_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, sub, 0, 0); }\nstatic int OP_SUB_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, sub, 0, 0); }\nstatic int OP_SUB_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, sub, 0, 0); }\nstatic int OP_SUB_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, sub, 0, 0); }\n\nstatic int OP_RSB_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM, sub, 0); }\nstatic int OP_RSB_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG, sub, 0); }\nstatic int OP_RSB_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM, sub, 0); }\nstatic int OP_RSB_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG, sub, 0); }\nstatic int OP_RSB_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM, sub, 0); }\nstatic int OP_RSB_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG, sub, 0); }\nstatic int OP_RSB_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM, sub, 0); }\nstatic int OP_RSB_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG, sub, 0); }\nstatic int OP_RSB_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL, sub, 0); }\n\n// ================================ S instructions\nstatic int OP_AND_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, and_, 1); }\nstatic int OP_AND_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, and_, 1); }\nstatic int OP_AND_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, and_, 1); }\nstatic int OP_AND_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, and_, 1); }\nstatic int OP_AND_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, and_, 1); }\nstatic int OP_AND_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, and_, 1); }\nstatic int OP_AND_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, and_, 1); }\nstatic int OP_AND_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, and_, 1); }\nstatic int OP_AND_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, and_, 1); }\n\nstatic int OP_EOR_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, xor_, 1); }\nstatic int OP_EOR_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, xor_, 1); }\nstatic int OP_EOR_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, xor_, 1); }\nstatic int OP_EOR_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, xor_, 1); }\nstatic int OP_EOR_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, xor_, 1); }\nstatic int OP_EOR_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, xor_, 1); }\nstatic int OP_EOR_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, xor_, 1); }\nstatic int OP_EOR_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, xor_, 1); }\nstatic int OP_EOR_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, xor_, 1); }\n\nstatic int OP_ORR_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM, or_, 1); }\nstatic int OP_ORR_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG, or_, 1); }\nstatic int OP_ORR_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM, or_, 1); }\nstatic int OP_ORR_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG, or_, 1); }\nstatic int OP_ORR_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM, or_, 1); }\nstatic int OP_ORR_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG, or_, 1); }\nstatic int OP_ORR_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM, or_, 1); }\nstatic int OP_ORR_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG, or_, 1); }\nstatic int OP_ORR_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL, or_, 1); }\n\nstatic int OP_ADD_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, add, 1, 1); }\nstatic int OP_ADD_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, add, 1, 1); }\nstatic int OP_ADD_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, add, 1, 1); }\nstatic int OP_ADD_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, add, 1, 1); }\nstatic int OP_ADD_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, add, 1, 1); }\nstatic int OP_ADD_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, add, 1, 1); }\nstatic int OP_ADD_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, add, 1, 1); }\nstatic int OP_ADD_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, add, 1, 1); }\nstatic int OP_ADD_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, add, 1, 1); }\n\nstatic int OP_SUB_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM, sub, 0, 1); }\nstatic int OP_SUB_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG, sub, 0, 1); }\nstatic int OP_SUB_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM, sub, 0, 1); }\nstatic int OP_SUB_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG, sub, 0, 1); }\nstatic int OP_SUB_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM, sub, 0, 1); }\nstatic int OP_SUB_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG, sub, 0, 1); }\nstatic int OP_SUB_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM, sub, 0, 1); }\nstatic int OP_SUB_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG, sub, 0, 1); }\nstatic int OP_SUB_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL, sub, 0, 1); }\n\nstatic int OP_RSB_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM, sub, 1); }\nstatic int OP_RSB_S_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG, sub, 1); }\nstatic int OP_RSB_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM, sub, 1); }\nstatic int OP_RSB_S_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG, sub, 1); }\nstatic int OP_RSB_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM, sub, 1); }\nstatic int OP_RSB_S_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG, sub, 1); }\nstatic int OP_RSB_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM, sub, 1); }\nstatic int OP_RSB_S_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG, sub, 1); }\nstatic int OP_RSB_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL, sub, 1); }\n\nstatic int OP_ADC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(0), adc, 1, 0); }\nstatic int OP_ADC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(0), adc, 1, 0); }\n\nstatic int OP_ADC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(0), adc, 1, 1); }\nstatic int OP_ADC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(0), adc, 1, 1); }\n\nstatic int OP_SBC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(1), sbb, 0, 0); }\nstatic int OP_SBC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(1), sbb, 0, 0); }\n\nstatic int OP_SBC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; GET_CARRY(1), sbb, 0, 1); }\nstatic int OP_SBC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; GET_CARRY(1), sbb, 0, 1); }\n\nstatic int OP_RSC_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG; GET_CARRY(1), sbb, 0); }\nstatic int OP_RSC_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL; GET_CARRY(1), sbb, 0); }\n\nstatic int OP_RSC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_R(LSL_IMM; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_LSL_REG(const u32 i) { OP_ARITHMETIC_R(LSL_REG; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_R(LSR_IMM; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_LSR_REG(const u32 i) { OP_ARITHMETIC_R(LSR_REG; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_R(ASR_IMM; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_ASR_REG(const u32 i) { OP_ARITHMETIC_R(ASR_REG; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_R(ROR_IMM; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_ROR_REG(const u32 i) { OP_ARITHMETIC_R(ROR_REG; GET_CARRY(1), sbb, 1); }\nstatic int OP_RSC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_R(IMM_VAL; GET_CARRY(1), sbb, 1); }\n\nstatic int OP_BIC_LSL_IMM(const u32 i) { OP_ARITHMETIC(LSL_IMM; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_LSL_REG(const u32 i) { OP_ARITHMETIC(LSL_REG; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_LSR_IMM(const u32 i) { OP_ARITHMETIC(LSR_IMM; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_LSR_REG(const u32 i) { OP_ARITHMETIC(LSR_REG; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_ASR_IMM(const u32 i) { OP_ARITHMETIC(ASR_IMM; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_ASR_REG(const u32 i) { OP_ARITHMETIC(ASR_REG; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_ROR_IMM(const u32 i) { OP_ARITHMETIC(ROR_IMM; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_ROR_REG(const u32 i) { OP_ARITHMETIC(ROR_REG; c.not_(rhs), and_, 1, 0); }\nstatic int OP_BIC_IMM_VAL(const u32 i) { OP_ARITHMETIC(IMM_VAL; rhs = ~rhs,  and_, 1, 0); }\n\nstatic int OP_BIC_S_LSL_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSL_IMM; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_LSL_REG(const u32 i) { OP_ARITHMETIC_S(S_LSL_REG; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_LSR_IMM(const u32 i) { OP_ARITHMETIC_S(S_LSR_IMM; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_LSR_REG(const u32 i) { OP_ARITHMETIC_S(S_LSR_REG; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_ASR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ASR_IMM; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_ASR_REG(const u32 i) { OP_ARITHMETIC_S(S_ASR_REG; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_ROR_IMM(const u32 i) { OP_ARITHMETIC_S(S_ROR_IMM; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_ROR_REG(const u32 i) { OP_ARITHMETIC_S(S_ROR_REG; c.not_(rhs), and_, 1); }\nstatic int OP_BIC_S_IMM_VAL(const u32 i) { OP_ARITHMETIC_S(S_IMM_VAL; rhs = ~rhs,  and_, 1); }\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\n#define OP_TST_(arg) \\\n\targ; \\\n\tc.test(reg_pos_ptr(16), rhs); \\\n\tSET_NZC; \\\n\treturn 1;\n\nstatic int OP_TST_LSL_IMM(const u32 i) { OP_TST_(S_LSL_IMM); }\nstatic int OP_TST_LSL_REG(const u32 i) { OP_TST_(S_LSL_REG); }\nstatic int OP_TST_LSR_IMM(const u32 i) { OP_TST_(S_LSR_IMM); }\nstatic int OP_TST_LSR_REG(const u32 i) { OP_TST_(S_LSR_REG); }\nstatic int OP_TST_ASR_IMM(const u32 i) { OP_TST_(S_ASR_IMM); }\nstatic int OP_TST_ASR_REG(const u32 i) { OP_TST_(S_ASR_REG); }\nstatic int OP_TST_ROR_IMM(const u32 i) { OP_TST_(S_ROR_IMM); }\nstatic int OP_TST_ROR_REG(const u32 i) { OP_TST_(S_ROR_REG); }\nstatic int OP_TST_IMM_VAL(const u32 i) { OP_TST_(S_IMM_VAL); }\n\n//-----------------------------------------------------------------------------\n//   TEQ\n//-----------------------------------------------------------------------------\n#define OP_TEQ_(arg) \\\n\targ; \\\n\tif (!rhs_is_imm) \\\n\t\tc.xor_(*(GpVar*)&rhs, reg_pos_ptr(16)); \\\n\telse \\\n\t{ \\\n\t\tGpVar x = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.mov(x, rhs); \\\n\t\tc.xor_(x, reg_pos_ptr(16)); \\\n\t} \\\n\tSET_NZC; \\\n\treturn 1;\n\nstatic int OP_TEQ_LSL_IMM(const u32 i) { OP_TEQ_(S_LSL_IMM); }\nstatic int OP_TEQ_LSL_REG(const u32 i) { OP_TEQ_(S_LSL_REG); }\nstatic int OP_TEQ_LSR_IMM(const u32 i) { OP_TEQ_(S_LSR_IMM); }\nstatic int OP_TEQ_LSR_REG(const u32 i) { OP_TEQ_(S_LSR_REG); }\nstatic int OP_TEQ_ASR_IMM(const u32 i) { OP_TEQ_(S_ASR_IMM); }\nstatic int OP_TEQ_ASR_REG(const u32 i) { OP_TEQ_(S_ASR_REG); }\nstatic int OP_TEQ_ROR_IMM(const u32 i) { OP_TEQ_(S_ROR_IMM); }\nstatic int OP_TEQ_ROR_REG(const u32 i) { OP_TEQ_(S_ROR_REG); }\nstatic int OP_TEQ_IMM_VAL(const u32 i) { OP_TEQ_(S_IMM_VAL); }\n\n//-----------------------------------------------------------------------------\n//   CMP\n//-----------------------------------------------------------------------------\n#define OP_CMP(arg) \\\n\targ; \\\n\tc.cmp(reg_pos_ptr(16), rhs); \\\n\tSET_NZCV(1); \\\n\treturn 1;\n\nstatic int OP_CMP_LSL_IMM(const u32 i) { OP_CMP(LSL_IMM); }\nstatic int OP_CMP_LSL_REG(const u32 i) { OP_CMP(LSL_REG); }\nstatic int OP_CMP_LSR_IMM(const u32 i) { OP_CMP(LSR_IMM); }\nstatic int OP_CMP_LSR_REG(const u32 i) { OP_CMP(LSR_REG); }\nstatic int OP_CMP_ASR_IMM(const u32 i) { OP_CMP(ASR_IMM); }\nstatic int OP_CMP_ASR_REG(const u32 i) { OP_CMP(ASR_REG); }\nstatic int OP_CMP_ROR_IMM(const u32 i) { OP_CMP(ROR_IMM); }\nstatic int OP_CMP_ROR_REG(const u32 i) { OP_CMP(ROR_REG); }\nstatic int OP_CMP_IMM_VAL(const u32 i) { OP_CMP(IMM_VAL); }\n#undef OP_CMP\n\n//-----------------------------------------------------------------------------\n//   CMN\n//-----------------------------------------------------------------------------\n#define OP_CMN(arg) \\\n\targ; \\\n\tu32 rhs_imm = *(u32*)&rhs; \\\n\tint sign = rhs_is_imm && (rhs_imm != -rhs_imm); \\\n\tif(sign) \\\n\t\tc.cmp(reg_pos_ptr(16), -rhs_imm); \\\n\telse \\\n\t{ \\\n\t\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.mov(lhs, reg_pos_ptr(16)); \\\n\t\tc.add(lhs, rhs); \\\n\t} \\\n\tSET_NZCV(sign); \\\n\treturn 1;\n\nstatic int OP_CMN_LSL_IMM(const u32 i) { OP_CMN(LSL_IMM); }\nstatic int OP_CMN_LSL_REG(const u32 i) { OP_CMN(LSL_REG); }\nstatic int OP_CMN_LSR_IMM(const u32 i) { OP_CMN(LSR_IMM); }\nstatic int OP_CMN_LSR_REG(const u32 i) { OP_CMN(LSR_REG); }\nstatic int OP_CMN_ASR_IMM(const u32 i) { OP_CMN(ASR_IMM); }\nstatic int OP_CMN_ASR_REG(const u32 i) { OP_CMN(ASR_REG); }\nstatic int OP_CMN_ROR_IMM(const u32 i) { OP_CMN(ROR_IMM); }\nstatic int OP_CMN_ROR_REG(const u32 i) { OP_CMN(ROR_REG); }\nstatic int OP_CMN_IMM_VAL(const u32 i) { OP_CMN(IMM_VAL); }\n#undef OP_CMN\n\n//-----------------------------------------------------------------------------\n//   MOV\n//-----------------------------------------------------------------------------\n#define OP_MOV(arg) \\\n    arg; \\\n\tc.mov(reg_pos_ptr(12), rhs); \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tc.mov(cpu_ptr(next_instruction), rhs); \\\n\t\treturn 1; \\\n\t} \\\n    return 1;\n\nstatic int OP_MOV_LSL_IMM(const u32 i) { if (i == 0xE1A00000) { /* nop */ JIT_COMMENT(\"nop\"); return 1; } OP_MOV(LSL_IMM); }\nstatic int OP_MOV_LSL_REG(const u32 i) { OP_MOV(LSL_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); }\nstatic int OP_MOV_LSR_IMM(const u32 i) { OP_MOV(LSR_IMM); }\nstatic int OP_MOV_LSR_REG(const u32 i) { OP_MOV(LSR_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); }\nstatic int OP_MOV_ASR_IMM(const u32 i) { OP_MOV(ASR_IMM); }\nstatic int OP_MOV_ASR_REG(const u32 i) { OP_MOV(ASR_REG); }\nstatic int OP_MOV_ROR_IMM(const u32 i) { OP_MOV(ROR_IMM); }\nstatic int OP_MOV_ROR_REG(const u32 i) { OP_MOV(ROR_REG); }\nstatic int OP_MOV_IMM_VAL(const u32 i) { OP_MOV(IMM_VAL); }\n\n#define OP_MOV_S(arg) \\\n    arg; \\\n\tc.mov(reg_pos_ptr(12), rhs); \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tS_DST_R15; \\\n\t\tc.add(bb_total_cycles, 2); \\\n\t\treturn 1; \\\n\t} \\\n\tif(!rhs_is_imm) \\\n\t\tc.cmp(*(GpVar*)&rhs, 0); \\\n\telse \\\n\t\tc.cmp(reg_pos_ptr(12), 0); \\\n\tSET_NZC; \\\n    return 1;\n\nstatic int OP_MOV_S_LSL_IMM(const u32 i) { OP_MOV_S(S_LSL_IMM); }\nstatic int OP_MOV_S_LSL_REG(const u32 i) { OP_MOV_S(S_LSL_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); }\nstatic int OP_MOV_S_LSR_IMM(const u32 i) { OP_MOV_S(S_LSR_IMM); }\nstatic int OP_MOV_S_LSR_REG(const u32 i) { OP_MOV_S(S_LSR_REG; if (REG_POS(i,0) == 15) c.add(rhs, 4);); }\nstatic int OP_MOV_S_ASR_IMM(const u32 i) { OP_MOV_S(S_ASR_IMM); }\nstatic int OP_MOV_S_ASR_REG(const u32 i) { OP_MOV_S(S_ASR_REG); }\nstatic int OP_MOV_S_ROR_IMM(const u32 i) { OP_MOV_S(S_ROR_IMM); }\nstatic int OP_MOV_S_ROR_REG(const u32 i) { OP_MOV_S(S_ROR_REG); }\nstatic int OP_MOV_S_IMM_VAL(const u32 i) { OP_MOV_S(S_IMM_VAL); }\n\n//-----------------------------------------------------------------------------\n//   MVN\n//-----------------------------------------------------------------------------\nstatic int OP_MVN_LSL_IMM(const u32 i) { OP_MOV(LSL_IMM; c.not_(rhs)); }\nstatic int OP_MVN_LSL_REG(const u32 i) { OP_MOV(LSL_REG; c.not_(rhs)); }\nstatic int OP_MVN_LSR_IMM(const u32 i) { OP_MOV(LSR_IMM; c.not_(rhs)); }\nstatic int OP_MVN_LSR_REG(const u32 i) { OP_MOV(LSR_REG; c.not_(rhs)); }\nstatic int OP_MVN_ASR_IMM(const u32 i) { OP_MOV(ASR_IMM; c.not_(rhs)); }\nstatic int OP_MVN_ASR_REG(const u32 i) { OP_MOV(ASR_REG; c.not_(rhs)); }\nstatic int OP_MVN_ROR_IMM(const u32 i) { OP_MOV(ROR_IMM; c.not_(rhs)); }\nstatic int OP_MVN_ROR_REG(const u32 i) { OP_MOV(ROR_REG; c.not_(rhs)); }\nstatic int OP_MVN_IMM_VAL(const u32 i) { OP_MOV(IMM_VAL; rhs = ~rhs); }\n\nstatic int OP_MVN_S_LSL_IMM(const u32 i) { OP_MOV_S(S_LSL_IMM; c.not_(rhs)); }\nstatic int OP_MVN_S_LSL_REG(const u32 i) { OP_MOV_S(S_LSL_REG; c.not_(rhs)); }\nstatic int OP_MVN_S_LSR_IMM(const u32 i) { OP_MOV_S(S_LSR_IMM; c.not_(rhs)); }\nstatic int OP_MVN_S_LSR_REG(const u32 i) { OP_MOV_S(S_LSR_REG; c.not_(rhs)); }\nstatic int OP_MVN_S_ASR_IMM(const u32 i) { OP_MOV_S(S_ASR_IMM; c.not_(rhs)); }\nstatic int OP_MVN_S_ASR_REG(const u32 i) { OP_MOV_S(S_ASR_REG; c.not_(rhs)); }\nstatic int OP_MVN_S_ROR_IMM(const u32 i) { OP_MOV_S(S_ROR_IMM; c.not_(rhs)); }\nstatic int OP_MVN_S_ROR_REG(const u32 i) { OP_MOV_S(S_ROR_REG; c.not_(rhs)); }\nstatic int OP_MVN_S_IMM_VAL(const u32 i) { OP_MOV_S(S_IMM_VAL; rhs = ~rhs); }\n\n//-----------------------------------------------------------------------------\n//   QADD / QDADD / QSUB / QDSUB\n//-----------------------------------------------------------------------------\n// TODO\nstatic int OP_QADD(const u32 i) { printf(\"JIT: unimplemented OP_QADD\\n\"); return 0; }\nstatic int OP_QSUB(const u32 i) { printf(\"JIT: unimplemented OP_QSUB\\n\"); return 0; }\nstatic int OP_QDADD(const u32 i) { printf(\"JIT: unimplemented OP_QDADD\\n\"); return 0; }\nstatic int OP_QDSUB(const u32 i) { printf(\"JIT: unimplemented OP_QDSUB\\n\"); return 0; }\n\n//-----------------------------------------------------------------------------\n//   MUL\n//-----------------------------------------------------------------------------\nstatic void MUL_Mxx_END(GpVar x, bool sign, int cycles)\n{\n\tif(sign)\n\t{\n\t\tGpVar y = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(y, x);\n\t\tc.sar(x, 31);\n\t\tc.xor_(x, y);\n\t}\n\tc.or_(x, 1);\n\tc.bsr(bb_cycles, x);\n\tc.shr(bb_cycles, 3);\n\tc.add(bb_cycles, cycles+1);\n}\n\n#define OP_MUL_(op, width, sign, accum, flags) \\\n\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar hi; \\\n\tif (width) \\\n\t{ \\\n\t\thi = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.xor_(hi, hi); \\\n\t} \\\n\tc.mov(lhs, reg_pos_ptr(0)); \\\n\tc.mov(rhs, reg_pos_ptr(8)); \\\n\top; \\\n\tif(width && accum) \\\n\t{ \\\n\t\tif(flags) \\\n\t\t{ \\\n\t\t\tc.add(lhs, reg_pos_ptr(12)); \\\n\t\t\tc.adc(hi, reg_pos_ptr(16)); \\\n\t\t\tc.mov(reg_pos_ptr(12), lhs); \\\n\t\t\tc.mov(reg_pos_ptr(16), hi); \\\n\t\t\tc.or_(hi, lhs); SET_NZ(0); \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tc.add(reg_pos_ptr(12), lhs); \\\n\t\t\tc.adc(reg_pos_ptr(16), hi); \\\n\t\t} \\\n\t} \\\n\telse if(width) \\\n\t{ \\\n\t\tc.mov(reg_pos_ptr(12), lhs); \\\n\t\tc.mov(reg_pos_ptr(16), hi); \\\n\t\tif(flags) { c.cmp(hi, lhs); SET_NZ(0); } \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tif(accum) c.add(lhs, reg_pos_ptr(12)); \\\n\t\tc.mov(reg_pos_ptr(16), lhs); \\\n\t\tif(flags) { c.cmp(lhs, 0); SET_NZ(0); }\\\n\t} \\\n\tMUL_Mxx_END(rhs, sign, 1+width+accum); \\\n\treturn 1;\n\nstatic int OP_MUL(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 0, 0); }\nstatic int OP_MLA(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 1, 0); }\nstatic int OP_UMULL(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 0, 0); }\nstatic int OP_UMLAL(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 1, 0); }\nstatic int OP_SMULL(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 0, 0); }\nstatic int OP_SMLAL(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 1, 0); }\n\nstatic int OP_MUL_S(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 0, 1); }\nstatic int OP_MLA_S(const u32 i) { OP_MUL_(c.imul(lhs,rhs), 0, 1, 1, 1); }\nstatic int OP_UMULL_S(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 0, 1); }\nstatic int OP_UMLAL_S(const u32 i) { OP_MUL_(c.mul(hi,lhs,rhs), 1, 0, 1, 1); }\nstatic int OP_SMULL_S(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 0, 1); }\nstatic int OP_SMLAL_S(const u32 i) { OP_MUL_(c.imul(hi,lhs,rhs), 1, 1, 1, 1); }\n\n#define OP_MULxy_(op, x, y, width, accum, flags) \\\n\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar hi; \\\n\tc.movsx(lhs, reg_pos_ptr##x(0)); \\\n\tc.movsx(rhs, reg_pos_ptr##y(8)); \\\n\tif (width) \\\n\t{ \\\n\t\thi = c.newGpVar(kX86VarTypeGpd); \\\n\t} \\\n\top; \\\n\tif(width && accum) \\\n\t{ \\\n\t\tif(flags) \\\n\t\t{ \\\n\t\t\tc.add(lhs, reg_pos_ptr(12)); \\\n\t\t\tc.adc(hi, reg_pos_ptr(16)); \\\n\t\t\tc.mov(reg_pos_ptr(12), lhs); \\\n\t\t\tc.mov(reg_pos_ptr(16), hi); \\\n\t\t\tSET_Q; \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tc.add(reg_pos_ptr(12), lhs); \\\n\t\t\tc.adc(reg_pos_ptr(16), hi); \\\n\t\t} \\\n\t} \\\n\telse \\\n\tif(width) \\\n\t{ \\\n\t\tc.mov(reg_pos_ptr(12), lhs); \\\n\t\tc.mov(reg_pos_ptr(16), hi); \\\n\t\tif(flags) { SET_Q; }\\\n\t} \\\n\telse \\\n\t{ \\\n\t\tif (accum) c.add(lhs, reg_pos_ptr(12));  \\\n\t\tc.mov(reg_pos_ptr(16), lhs); \\\n\t\tif(flags) { SET_Q; }\\\n\t} \\\n\treturn 1;\n\n\n//-----------------------------------------------------------------------------\n//   SMUL\n//-----------------------------------------------------------------------------\nstatic int OP_SMUL_B_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, L, 0, 0, 0); }\nstatic int OP_SMUL_B_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, H, 0, 0, 0); }\nstatic int OP_SMUL_T_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, L, 0, 0, 0); }\nstatic int OP_SMUL_T_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, H, 0, 0, 0); }\n\n//-----------------------------------------------------------------------------\n//   SMLA\n//-----------------------------------------------------------------------------\nstatic int OP_SMLA_B_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, L, 0, 1, 1); }\nstatic int OP_SMLA_B_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), L, H, 0, 1, 1); }\nstatic int OP_SMLA_T_B(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, L, 0, 1, 1); }\nstatic int OP_SMLA_T_T(const u32 i) { OP_MULxy_(c.imul(lhs, rhs), H, H, 0, 1, 1); }\n\n//-----------------------------------------------------------------------------\n//   SMLAL\n//-----------------------------------------------------------------------------\nstatic int OP_SMLAL_B_B(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), L, L, 1, 1, 1); }\nstatic int OP_SMLAL_B_T(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), L, H, 1, 1, 1); }\nstatic int OP_SMLAL_T_B(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), H, L, 1, 1, 1); }\nstatic int OP_SMLAL_T_T(const u32 i) { OP_MULxy_(c.imul(hi,lhs,rhs), H, H, 1, 1, 1); }\n\n//-----------------------------------------------------------------------------\n//   SMULW / SMLAW\n//-----------------------------------------------------------------------------\n#ifdef ASMJIT_X64\n#define OP_SMxxW_(x, accum, flags) \\\n\tGpVar lhs = c.newGpVar(kX86VarTypeGpz); \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpz); \\\n\tc.movsx(lhs, reg_pos_ptr##x(8)); \\\n\tc.movsxd(rhs, reg_pos_ptr(0)); \\\n\tc.imul(lhs, rhs);  \\\n\tc.sar(lhs, 16); \\\n\tif (accum) c.add(lhs, reg_pos_ptr(12)); \\\n\tc.mov(reg_pos_ptr(16), lhs.r32()); \\\n\tif (flags) { SET_Q; } \\\n\treturn 1;\n#else\n#define OP_SMxxW_(x, accum, flags) \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar hi = c.newGpVar(kX86VarTypeGpd); \\\n\tc.xor_(hi, hi); \\\n\tc.movsx(lhs, reg_pos_ptr##x(8)); \\\n\tc.mov(rhs, reg_pos_ptr(0)); \\\n\tc.imul(hi, lhs, rhs); \\\n\tc.mov(lhs.r16(), hi.r16()); \\\n\tc.ror(lhs, 16); \\\n\tif (accum) c.add(lhs, reg_pos_ptr(12)); \\\n\tc.mov(reg_pos_ptr(16), lhs); \\\n\tif (flags) { SET_Q; } \\\n\treturn 1;\n#endif\n\nstatic int OP_SMULW_B(const u32 i) { OP_SMxxW_(L, 0, 0); }\nstatic int OP_SMULW_T(const u32 i) { OP_SMxxW_(H, 0, 0); }\nstatic int OP_SMLAW_B(const u32 i) { OP_SMxxW_(L, 1, 1); }\nstatic int OP_SMLAW_T(const u32 i) { OP_SMxxW_(H, 1, 1); }\n\n//-----------------------------------------------------------------------------\n//   MRS / MSR\n//-----------------------------------------------------------------------------\nstatic int OP_MRS_CPSR(const u32 i)\n{\n\tGpVar x = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(x, cpu_ptr(CPSR));\n\tc.mov(reg_pos_ptr(12), x);\n\treturn 1;\n}\n\nstatic int OP_MRS_SPSR(const u32 i)\n{\n\tGpVar x = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(x, cpu_ptr(SPSR));\n\tc.mov(reg_pos_ptr(12), x);\n\treturn 1;\n}\n\n// TODO: SPSR: if(cpu->CPSR.bits.mode == USR || cpu->CPSR.bits.mode == SYS) return 1;\n#define OP_MSR_(reg, args, sw) \\\n\tGpVar operand = c.newGpVar(kX86VarTypeGpd); \\\n\targs; \\\n\tc.mov(operand, rhs); \\\n\tswitch (((i>>16) & 0xF)) \\\n\t{ \\\n\t\tcase 0x1:\t\t/* bit 16 */ \\\n\t\t\t{ \\\n\t\t\t\tGpVar mode = c.newGpVar(kX86VarTypeGpd); \\\n\t\t\t\tLabel __skip = c.newLabel(); \\\n\t\t\t\tc.mov(mode, cpu_ptr(CPSR)); \\\n\t\t\t\tc.and_(mode, 0x1F); \\\n\t\t\t\tc.cmp(mode, USR); \\\n\t\t\t\tc.je(__skip); \\\n\t\t\t\tif (sw) \\\n\t\t\t\t{ \\\n\t\t\t\t\tc.mov(mode, rhs); \\\n\t\t\t\t\tc.and_(mode, 0x1F); \\\n\t\t\t\t\tX86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \\\n\t\t\t\t\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder2<void, void*, u8>()); \\\n\t\t\t\t\tctx->setArgument(0, bb_cpu); \\\n\t\t\t\t\tctx->setArgument(1, mode); \\\n\t\t\t\t} \\\n\t\t\t\tMem xPSR_memB = cpu_ptr_byte(reg, 0); \\\n\t\t\t\tc.mov(xPSR_memB, operand.r8Lo()); \\\n\t\t\t\tchangeCPSR; \\\n\t\t\t\tc.bind(__skip); \\\n\t\t\t} \\\n\t\t\treturn 1; \\\n\t\tcase 0x2:\t\t/* bit 17 */ \\\n\t\t\t{ \\\n\t\t\t\tGpVar mode = c.newGpVar(kX86VarTypeGpd); \\\n\t\t\t\tLabel __skip = c.newLabel(); \\\n\t\t\t\tc.mov(mode, cpu_ptr(CPSR)); \\\n\t\t\t\tc.and_(mode, 0x1F); \\\n\t\t\t\tc.cmp(mode, USR); \\\n\t\t\t\tc.je(__skip); \\\n\t\t\t\tMem xPSR_memB = cpu_ptr_byte(reg, 1); \\\n\t\t\t\tc.shr(operand, 8); \\\n\t\t\t\tc.mov(xPSR_memB, operand.r8Lo()); \\\n\t\t\t\tchangeCPSR; \\\n\t\t\t\tc.bind(__skip); \\\n\t\t\t} \\\n\t\t\treturn 1; \\\n\t\tcase 0x4:\t\t/* bit 18 */ \\\n\t\t\t{ \\\n\t\t\t\tGpVar mode = c.newGpVar(kX86VarTypeGpd); \\\n\t\t\t\tLabel __skip = c.newLabel(); \\\n\t\t\t\tc.mov(mode, cpu_ptr(CPSR)); \\\n\t\t\t\tc.and_(mode, 0x1F); \\\n\t\t\t\tc.cmp(mode, USR); \\\n\t\t\t\tc.je(__skip); \\\n\t\t\t\tMem xPSR_memB = cpu_ptr_byte(reg, 2); \\\n\t\t\t\tc.shr(operand, 16); \\\n\t\t\t\tc.mov(xPSR_memB, operand.r8Lo()); \\\n\t\t\t\tchangeCPSR; \\\n\t\t\t\tc.bind(__skip); \\\n\t\t\t} \\\n\t\t\treturn 1; \\\n\t\tcase 0x8:\t\t/* bit 19 */ \\\n\t\t\t{ \\\n\t\t\t\tMem xPSR_memB = cpu_ptr_byte(reg, 3); \\\n\t\t\t\tc.shr(operand, 24); \\\n\t\t\t\tc.mov(xPSR_memB, operand.r8Lo()); \\\n\t\t\t\tchangeCPSR; \\\n\t\t\t} \\\n\t\t\treturn 1; \\\n\t\tdefault: \\\n\t\t\tbreak; \\\n\t} \\\n\\\n\tstatic u32 byte_mask =\t(BIT16(i)?0x000000FF:0x00000000) | \\\n\t\t\t\t\t\t\t(BIT17(i)?0x0000FF00:0x00000000) | \\\n\t\t\t\t\t\t\t(BIT18(i)?0x00FF0000:0x00000000) | \\\n\t\t\t\t\t\t\t(BIT19(i)?0xFF000000:0x00000000); \\\n\tstatic u32 byte_mask_USR = (BIT19(i)?0xFF000000:0x00000000); \\\n\\\n\tMem xPSR_mem = cpu_ptr(reg.val); \\\n\tGpVar xPSR = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar mode = c.newGpVar(kX86VarTypeGpd); \\\n\tLabel __USR = c.newLabel(); \\\n\tLabel __done = c.newLabel(); \\\n\tc.mov(mode, cpu_ptr(CPSR.val)); \\\n\tc.and_(mode, 0x1F); \\\n\tc.cmp(mode, USR); \\\n\tc.je(__USR); \\\n\t/* mode != USR */ \\\n\tif (sw && BIT16(i)) \\\n\t{ \\\n\t\t/* armcpu_switchMode */ \\\n\t\tc.mov(mode, rhs); \\\n\t\tc.and_(mode, 0x1F); \\\n\t\tX86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode); \\\n\t\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder2<void, void*, u8>()); \\\n\t\tctx->setArgument(0, bb_cpu); \\\n\t\tctx->setArgument(1, mode); \\\n\t} \\\n\t/* cpu->CPSR.val = (cpu->CPSR.val & ~byte_mask) | (operand & byte_mask); */ \\\n\tc.mov(xPSR, xPSR_mem); \\\n\tc.and_(operand, byte_mask); \\\n\tc.and_(xPSR, ~byte_mask); \\\n\tc.or_(xPSR, operand); \\\n\tc.mov(xPSR_mem, xPSR); \\\n\tc.jmp(__done); \\\n\t/* mode == USR */ \\\n\tc.bind(__USR); \\\n\tc.mov(xPSR, xPSR_mem); \\\n\tc.and_(operand, byte_mask_USR); \\\n\tc.and_(xPSR, ~byte_mask_USR); \\\n\tc.or_(xPSR, operand); \\\n\tc.mov(xPSR_mem, xPSR); \\\n\tc.bind(__done); \\\n\tchangeCPSR; \\\n\treturn 1;\n\nstatic int OP_MSR_CPSR(const u32 i) { OP_MSR_(CPSR, REG_OFF, 1); }\nstatic int OP_MSR_SPSR(const u32 i) { OP_MSR_(SPSR, REG_OFF, 0); }\nstatic int OP_MSR_CPSR_IMM_VAL(const u32 i) { OP_MSR_(CPSR, IMM_VAL, 1); }\nstatic int OP_MSR_SPSR_IMM_VAL(const u32 i) { OP_MSR_(SPSR, IMM_VAL, 0); }\n\n//-----------------------------------------------------------------------------\n//   LDR\n//-----------------------------------------------------------------------------\ntypedef u32 (FASTCALL* OpLDR)(u32, u32*);\n\n// 98% of all memory accesses land in the same region as the first execution of\n// that instruction, so keep multiple copies with different fastpaths.\n// The copies don't need to differ in any way; the point is merely to cooperate\n// with x86 branch prediction.\n\nenum {\n\tMEMTYPE_GENERIC = 0, // no assumptions\n\tMEMTYPE_MAIN = 1,\n\tMEMTYPE_DTCM = 2,\n\tMEMTYPE_ERAM = 3,\n\tMEMTYPE_SWIRAM = 4,\n\tMEMTYPE_OTHER = 5, // memory that is known to not be MAIN, DTCM, ERAM, or SWIRAM\n};\n\nstatic u32 classify_adr(u32 adr, bool store)\n{\n\tif(PROCNUM==ARMCPU_ARM9 && (adr & ~0x3FFF) == MMU.DTCMRegion)\n\t\treturn MEMTYPE_DTCM;\n\telse if((adr & 0x0F000000) == 0x02000000)\n\t\treturn MEMTYPE_MAIN;\n\telse if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03800000)\n\t\treturn MEMTYPE_ERAM;\n\telse if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03000000)\n\t\treturn MEMTYPE_SWIRAM;\n\telse\n\t\treturn MEMTYPE_GENERIC;\n}\n\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_LDR(u32 adr, u32 *dstreg)\n{\n\tu32 data = READ32(cpu->mem_if->data, adr);\n\tif(adr&3)\n\t\tdata = ROR(data, 8*(adr&3));\n\t*dstreg = data;\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3,adr);\n}\n\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_LDRH(u32 adr, u32 *dstreg)\n{\n\t*dstreg = READ16(cpu->mem_if->data, adr);\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_LDRSH(u32 adr, u32 *dstreg)\n{\n\t*dstreg = (s16)READ16(cpu->mem_if->data, adr);\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3,adr);\n}\n\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_LDRB(u32 adr, u32 *dstreg)\n{\n\t*dstreg = READ8(cpu->mem_if->data, adr);\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_LDRSB(u32 adr, u32 *dstreg)\n{\n\t*dstreg = (s8)READ8(cpu->mem_if->data, adr);\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3,adr);\n}\n\n#define T(op) op<0,0>, op<0,1>, op<0,2>, NULL, NULL, op<1,0>, op<1,1>, NULL, op<1,3>, op<1,4>\nstatic const OpLDR LDR_tab[2][5]   = { T(OP_LDR) };\nstatic const OpLDR LDRH_tab[2][5]  = { T(OP_LDRH) };\nstatic const OpLDR LDRSH_tab[2][5] = { T(OP_LDRSH) };\nstatic const OpLDR LDRB_tab[2][5]  = { T(OP_LDRB) };\nstatic const OpLDR LDRSB_tab[2][5]  = { T(OP_LDRSB) };\n#undef T\n\nstatic u32 add(u32 lhs, u32 rhs) { return lhs + rhs; }\nstatic u32 sub(u32 lhs, u32 rhs) { return lhs - rhs; }\n\n#define OP_LDR_(mem_op, arg, sign_op, writeback) \\\n\tGpVar adr = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar dst = c.newGpVar(kX86VarTypeGpz); \\\n\tc.mov(adr, reg_pos_ptr(16)); \\\n\tc.lea(dst, reg_pos_ptr(12)); \\\n\targ; \\\n\tif(!rhs_is_imm || *(u32*)&rhs) \\\n\t{ \\\n\t\tif(writeback == 0) \\\n\t\t\tc.sign_op(adr, rhs); \\\n\t\telse if(writeback < 0) \\\n\t\t{ \\\n\t\t\tc.sign_op(adr, rhs); \\\n\t\t\tc.mov(reg_pos_ptr(16), adr); \\\n\t\t} \\\n\t\telse if(writeback > 0) \\\n\t\t{ \\\n\t\t\tGpVar tmp_reg = c.newGpVar(kX86VarTypeGpd); \\\n\t\t\tc.mov(tmp_reg, adr); \\\n\t\t\tc.sign_op(tmp_reg, rhs); \\\n\t\t\tc.mov(reg_pos_ptr(16), tmp_reg); \\\n\t\t} \\\n\t} \\\n\tu32 adr_first = sign_op(cpu->R[REG_POS(i,16)], rhs_first); \\\n\tX86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,0)]); \\\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2<u32, u32, u32*>()); \\\n\tctx->setArgument(0, adr); \\\n\tctx->setArgument(1, dst); \\\n\tctx->setReturn(bb_cycles); \\\n\tif(REG_POS(i,12)==15) \\\n\t{ \\\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.mov(tmp, reg_ptr(15)); \\\n\t\tif (PROCNUM == 0) \\\n\t\t{ \\\n\t\t\tGpVar thumb = c.newGpVar(kX86VarTypeGpz); \\\n\t\t\tc.mov(thumb, tmp); \\\n\t\t\tc.and_(thumb, 1); \\\n\t\t\tc.shl(thumb, 5); \\\n\t\t\tc.or_(cpu_ptr(CPSR), thumb.r64()); \\\n\t\t\tc.and_(tmp, 0xFFFFFFFE); \\\n\t\t} \\\n\t\telse \\\n\t\t{ \\\n\t\t\tc.and_(tmp, 0xFFFFFFFC); \\\n\t\t} \\\n\t\tc.mov(cpu_ptr(next_instruction), tmp); \\\n\t} \\\n\treturn 1;\n\n// LDR\nstatic int OP_LDR_P_IMM_OFF(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, 0); }\nstatic int OP_LDR_M_IMM_OFF(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, 0); }\nstatic int OP_LDR_P_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, 0); }\nstatic int OP_LDR_M_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, 0); }\nstatic int OP_LDR_P_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, 0); }\nstatic int OP_LDR_M_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, 0); }\nstatic int OP_LDR_P_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, 0); }\nstatic int OP_LDR_M_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, 0); }\nstatic int OP_LDR_P_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, 0); }\nstatic int OP_LDR_M_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, 0); }\n\nstatic int OP_LDR_P_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, -1); }\nstatic int OP_LDR_M_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, -1); }\nstatic int OP_LDR_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, -1); }\nstatic int OP_LDR_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, -1); }\nstatic int OP_LDR_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, -1); }\nstatic int OP_LDR_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, -1); }\nstatic int OP_LDR_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, -1); }\nstatic int OP_LDR_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, -1); }\nstatic int OP_LDR_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, -1); }\nstatic int OP_LDR_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, -1); }\nstatic int OP_LDR_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, add, 1); }\nstatic int OP_LDR_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, IMM_OFF_12, sub, 1); }\nstatic int OP_LDR_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, add, 1); }\nstatic int OP_LDR_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSL_IMM, sub, 1); }\nstatic int OP_LDR_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, add, 1); }\nstatic int OP_LDR_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, LSR_IMM, sub, 1); }\nstatic int OP_LDR_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, add, 1); }\nstatic int OP_LDR_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ASR_IMM, sub, 1); }\nstatic int OP_LDR_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, add, 1); }\nstatic int OP_LDR_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDR, ROR_IMM, sub, 1); }\n\n// LDRH\nstatic int OP_LDRH_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, 0); }\nstatic int OP_LDRH_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, 0); }\nstatic int OP_LDRH_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, 0); }\nstatic int OP_LDRH_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, 0); }\n\nstatic int OP_LDRH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, -1); }\nstatic int OP_LDRH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, -1); }\nstatic int OP_LDRH_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, -1); }\nstatic int OP_LDRH_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, -1); }\nstatic int OP_LDRH_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, add, 1); }\nstatic int OP_LDRH_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRH, IMM_OFF, sub, 1); }\nstatic int OP_LDRH_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, add, 1); }\nstatic int OP_LDRH_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRH, REG_OFF, sub, 1); }\n\n// LDRSH\nstatic int OP_LDRSH_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, 0); }\nstatic int OP_LDRSH_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, 0); }\nstatic int OP_LDRSH_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, 0); }\nstatic int OP_LDRSH_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, 0); }\n\nstatic int OP_LDRSH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, -1); }\nstatic int OP_LDRSH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, -1); }\nstatic int OP_LDRSH_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, -1); }\nstatic int OP_LDRSH_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, -1); }\nstatic int OP_LDRSH_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, add, 1); }\nstatic int OP_LDRSH_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSH, IMM_OFF, sub, 1); }\nstatic int OP_LDRSH_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, add, 1); }\nstatic int OP_LDRSH_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSH, REG_OFF, sub, 1); }\n\n// LDRB\nstatic int OP_LDRB_P_IMM_OFF(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, 0); }\nstatic int OP_LDRB_M_IMM_OFF(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, 0); }\nstatic int OP_LDRB_P_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, 0); }\nstatic int OP_LDRB_M_LSL_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, 0); }\nstatic int OP_LDRB_P_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, 0); }\nstatic int OP_LDRB_M_LSR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, 0); }\nstatic int OP_LDRB_P_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, 0); }\nstatic int OP_LDRB_M_ASR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, 0); }\nstatic int OP_LDRB_P_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, 0); }\nstatic int OP_LDRB_M_ROR_IMM_OFF(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, 0); }\n\nstatic int OP_LDRB_P_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, -1); }\nstatic int OP_LDRB_M_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, -1); }\nstatic int OP_LDRB_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, -1); }\nstatic int OP_LDRB_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, -1); }\nstatic int OP_LDRB_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, -1); }\nstatic int OP_LDRB_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, -1); }\nstatic int OP_LDRB_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, -1); }\nstatic int OP_LDRB_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, -1); }\nstatic int OP_LDRB_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, -1); }\nstatic int OP_LDRB_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, -1); }\nstatic int OP_LDRB_P_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, add, 1); }\nstatic int OP_LDRB_M_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, IMM_OFF_12, sub, 1); }\nstatic int OP_LDRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, add, 1); }\nstatic int OP_LDRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSL_IMM, sub, 1); }\nstatic int OP_LDRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, add, 1); }\nstatic int OP_LDRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, LSR_IMM, sub, 1); }\nstatic int OP_LDRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, add, 1); }\nstatic int OP_LDRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ASR_IMM, sub, 1); }\nstatic int OP_LDRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, add, 1); }\nstatic int OP_LDRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_LDR_(LDRB, ROR_IMM, sub, 1); }\n\n// LDRSB\nstatic int OP_LDRSB_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, 0); }\nstatic int OP_LDRSB_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, 0); }\nstatic int OP_LDRSB_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, 0); }\nstatic int OP_LDRSB_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, 0); }\n\nstatic int OP_LDRSB_PRE_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, -1); }\nstatic int OP_LDRSB_PRE_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, -1); }\nstatic int OP_LDRSB_PRE_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, -1); }\nstatic int OP_LDRSB_PRE_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, -1); }\nstatic int OP_LDRSB_POS_INDE_P_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, add, 1); }\nstatic int OP_LDRSB_POS_INDE_M_IMM_OFF(const u32 i) { OP_LDR_(LDRSB, IMM_OFF, sub, 1); }\nstatic int OP_LDRSB_POS_INDE_P_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, add, 1); }\nstatic int OP_LDRSB_POS_INDE_M_REG_OFF(const u32 i) { OP_LDR_(LDRSB, REG_OFF, sub, 1); }\n\n//-----------------------------------------------------------------------------\n//   STR\n//-----------------------------------------------------------------------------\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_STR(u32 adr, u32 data)\n{\n\tWRITE32(cpu->mem_if->data, adr, data);\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2,adr);\n}\n\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_STRH(u32 adr, u32 data)\n{\n\tWRITE16(cpu->mem_if->data, adr, data);\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2,adr);\n}\n\ntemplate<int PROCNUM, int memtype>\nstatic u32 FASTCALL OP_STRB(u32 adr, u32 data)\n{\n\tWRITE8(cpu->mem_if->data, adr, data);\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2,adr);\n}\n\ntypedef u32 (FASTCALL* OpSTR)(u32, u32);\n#define T(op) op<0,0>, op<0,1>, op<0,2>, op<1,0>, op<1,1>, NULL\nstatic const OpSTR STR_tab[2][3]   = { T(OP_STR) };\nstatic const OpSTR STRH_tab[2][3]  = { T(OP_STRH) };\nstatic const OpSTR STRB_tab[2][3]  = { T(OP_STRB) };\n#undef T\n\n#define OP_STR_(mem_op, arg, sign_op, writeback) \\\n\tGpVar adr = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar data = c.newGpVar(kX86VarTypeGpd); \\\n\tc.mov(adr, reg_pos_ptr(16)); \\\n\tc.mov(data, reg_pos_ptr(12)); \\\n\targ; \\\n\tif(!rhs_is_imm || *(u32*)&rhs) \\\n\t{ \\\n\t\tif(writeback == 0) \\\n\t\t\tc.sign_op(adr, rhs); \\\n\t\telse if(writeback < 0) \\\n\t\t{ \\\n\t\t\tc.sign_op(adr, rhs); \\\n\t\t\tc.mov(reg_pos_ptr(16), adr); \\\n\t\t} \\\n\t\telse if(writeback > 0) \\\n\t\t{ \\\n\t\t\tGpVar tmp_reg = c.newGpVar(kX86VarTypeGpd); \\\n\t\t\tc.mov(tmp_reg, adr); \\\n\t\t\tc.sign_op(tmp_reg, rhs); \\\n\t\t\tc.mov(reg_pos_ptr(16), tmp_reg); \\\n\t\t} \\\n\t} \\\n\tu32 adr_first = sign_op(cpu->R[REG_POS(i,16)], rhs_first); \\\n\tX86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,1)]); \\\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2<u32, u32, u32>()); \\\n\tctx->setArgument(0, adr); \\\n\tctx->setArgument(1, data); \\\n\tctx->setReturn(bb_cycles); \\\n\treturn 1;\n\nstatic int OP_STR_P_IMM_OFF(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, 0); }\nstatic int OP_STR_M_IMM_OFF(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, 0); }\nstatic int OP_STR_P_LSL_IMM_OFF(const u32 i) { OP_STR_(STR, LSL_IMM, add, 0); }\nstatic int OP_STR_M_LSL_IMM_OFF(const u32 i) { OP_STR_(STR, LSL_IMM, sub, 0); }\nstatic int OP_STR_P_LSR_IMM_OFF(const u32 i) { OP_STR_(STR, LSR_IMM, add, 0); }\nstatic int OP_STR_M_LSR_IMM_OFF(const u32 i) { OP_STR_(STR, LSR_IMM, sub, 0); }\nstatic int OP_STR_P_ASR_IMM_OFF(const u32 i) { OP_STR_(STR, ASR_IMM, add, 0); }\nstatic int OP_STR_M_ASR_IMM_OFF(const u32 i) { OP_STR_(STR, ASR_IMM, sub, 0); }\nstatic int OP_STR_P_ROR_IMM_OFF(const u32 i) { OP_STR_(STR, ROR_IMM, add, 0); }\nstatic int OP_STR_M_ROR_IMM_OFF(const u32 i) { OP_STR_(STR, ROR_IMM, sub, 0); }\n\nstatic int OP_STR_P_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, -1); }\nstatic int OP_STR_M_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, -1); }\nstatic int OP_STR_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSL_IMM, add, -1); }\nstatic int OP_STR_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSL_IMM, sub, -1); }\nstatic int OP_STR_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSR_IMM, add, -1); }\nstatic int OP_STR_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, LSR_IMM, sub, -1); }\nstatic int OP_STR_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ASR_IMM, add, -1); }\nstatic int OP_STR_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ASR_IMM, sub, -1); }\nstatic int OP_STR_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ROR_IMM, add, -1); }\nstatic int OP_STR_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STR, ROR_IMM, sub, -1); }\nstatic int OP_STR_P_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, add, 1); }\nstatic int OP_STR_M_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, IMM_OFF_12, sub, 1); }\nstatic int OP_STR_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSL_IMM, add, 1); }\nstatic int OP_STR_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSL_IMM, sub, 1); }\nstatic int OP_STR_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSR_IMM, add, 1); }\nstatic int OP_STR_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, LSR_IMM, sub, 1); }\nstatic int OP_STR_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ASR_IMM, add, 1); }\nstatic int OP_STR_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ASR_IMM, sub, 1); }\nstatic int OP_STR_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ROR_IMM, add, 1); }\nstatic int OP_STR_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STR, ROR_IMM, sub, 1); }\n\nstatic int OP_STRH_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, 0); }\nstatic int OP_STRH_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, 0); }\nstatic int OP_STRH_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, 0); }\nstatic int OP_STRH_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, 0); }\n\nstatic int OP_STRH_PRE_INDE_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, -1); }\nstatic int OP_STRH_PRE_INDE_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, -1); }\nstatic int OP_STRH_PRE_INDE_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, -1); }\nstatic int OP_STRH_PRE_INDE_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, -1); }\nstatic int OP_STRH_POS_INDE_P_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, add, 1); }\nstatic int OP_STRH_POS_INDE_M_IMM_OFF(const u32 i) { OP_STR_(STRH, IMM_OFF, sub, 1); }\nstatic int OP_STRH_POS_INDE_P_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, add, 1); }\nstatic int OP_STRH_POS_INDE_M_REG_OFF(const u32 i) { OP_STR_(STRH, REG_OFF, sub, 1); }\n\nstatic int OP_STRB_P_IMM_OFF(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, 0); }\nstatic int OP_STRB_M_IMM_OFF(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, 0); }\nstatic int OP_STRB_P_LSL_IMM_OFF(const u32 i) { OP_STR_(STRB, LSL_IMM, add, 0); }\nstatic int OP_STRB_M_LSL_IMM_OFF(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, 0); }\nstatic int OP_STRB_P_LSR_IMM_OFF(const u32 i) { OP_STR_(STRB, LSR_IMM, add, 0); }\nstatic int OP_STRB_M_LSR_IMM_OFF(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, 0); }\nstatic int OP_STRB_P_ASR_IMM_OFF(const u32 i) { OP_STR_(STRB, ASR_IMM, add, 0); }\nstatic int OP_STRB_M_ASR_IMM_OFF(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, 0); }\nstatic int OP_STRB_P_ROR_IMM_OFF(const u32 i) { OP_STR_(STRB, ROR_IMM, add, 0); }\nstatic int OP_STRB_M_ROR_IMM_OFF(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, 0); }\n\nstatic int OP_STRB_P_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, -1); }\nstatic int OP_STRB_M_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, -1); }\nstatic int OP_STRB_P_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSL_IMM, add, -1); }\nstatic int OP_STRB_M_LSL_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, -1); }\nstatic int OP_STRB_P_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSR_IMM, add, -1); }\nstatic int OP_STRB_M_LSR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, -1); }\nstatic int OP_STRB_P_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ASR_IMM, add, -1); }\nstatic int OP_STRB_M_ASR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, -1); }\nstatic int OP_STRB_P_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ROR_IMM, add, -1); }\nstatic int OP_STRB_M_ROR_IMM_OFF_PREIND(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, -1); }\nstatic int OP_STRB_P_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, add, 1); }\nstatic int OP_STRB_M_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, IMM_OFF_12, sub, 1); }\nstatic int OP_STRB_P_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSL_IMM, add, 1); }\nstatic int OP_STRB_M_LSL_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSL_IMM, sub, 1); }\nstatic int OP_STRB_P_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSR_IMM, add, 1); }\nstatic int OP_STRB_M_LSR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, LSR_IMM, sub, 1); }\nstatic int OP_STRB_P_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ASR_IMM, add, 1); }\nstatic int OP_STRB_M_ASR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ASR_IMM, sub, 1); }\nstatic int OP_STRB_P_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ROR_IMM, add, 1); }\nstatic int OP_STRB_M_ROR_IMM_OFF_POSTIND(const u32 i) { OP_STR_(STRB, ROR_IMM, sub, 1); }\n\n//-----------------------------------------------------------------------------\n//   LDRD / STRD\n//-----------------------------------------------------------------------------\ntypedef u32 (FASTCALL *LDRD_STRD_REG)(u32);\ntemplate<int PROCNUM, u8 Rnum>\nstatic u32 FASTCALL OP_LDRD_REG(u32 adr)\n{\n\tcpu->R[Rnum] = READ32(cpu->mem_if->data, adr);\n\tcpu->R[Rnum+1] = READ32(cpu->mem_if->data, adr+4);\n\treturn (MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr) + MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr+4));\n}\ntemplate<int PROCNUM, u8 Rnum>\nstatic u32 FASTCALL OP_STRD_REG(u32 adr)\n{\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[Rnum]);\n\tWRITE32(cpu->mem_if->data, adr + 4, cpu->R[Rnum + 1]);\n\treturn (MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr) + MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr+4));\n}\n#define T(op, proc) op<proc,0>, op<proc,1>, op<proc,2>, op<proc,3>, op<proc,4>, op<proc,5>, op<proc,6>, op<proc,7>, op<proc,8>, op<proc,9>, op<proc,10>, op<proc,11>, op<proc,12>, op<proc,13>, op<proc,14>, op<proc,15>\nstatic const LDRD_STRD_REG op_ldrd_tab[2][16] = { {T(OP_LDRD_REG, 0)}, {T(OP_LDRD_REG, 1)} };\nstatic const LDRD_STRD_REG op_strd_tab[2][16] = { {T(OP_STRD_REG, 0)}, {T(OP_STRD_REG, 1)} };\n#undef T\n\nstatic int OP_LDRD_STRD_POST_INDEX(const u32 i) \n{\n\tu8 Rd_num = REG_POS(i, 12);\n\t\n\tif (Rd_num == 14)\n\t{\n\t\tprintf(\"OP_LDRD_STRD_POST_INDEX: use R14!!!!\\n\");\n\t\treturn 0; // TODO: exception\n\t}\n\tif (Rd_num & 0x1)\n\t{\n\t\tprintf(\"OP_LDRD_STRD_POST_INDEX: ERROR!!!!\\n\");\n\t\treturn 0; // TODO: exception\n\t}\n\tGpVar Rd = c.newGpVar(kX86VarTypeGpd);\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd);\n\n\tc.mov(Rd, reg_pos_ptr(16));\n\tc.mov(addr, reg_pos_ptr(16));\n\n\t// I bit - immediate or register\n\tif (BIT22(i))\n\t{\n\t\tIMM_OFF;\n\t\tBIT23(i)?c.add(reg_pos_ptr(16), rhs):c.sub(reg_pos_ptr(16), rhs);\n\t}\n\telse\n\t{\n\t\tGpVar idx = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(idx, reg_pos_ptr(0));\n\t\tBIT23(i)?c.add(reg_pos_ptr(16), idx):c.sub(reg_pos_ptr(16), idx);\n\t}\n\n\tX86CompilerFuncCall *ctx = c.call((void*)(BIT5(i) ? op_strd_tab[PROCNUM][Rd_num] : op_ldrd_tab[PROCNUM][Rd_num]));\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1<u32, u32>());\n\tctx->setArgument(0, addr);\n\tctx->setReturn(bb_cycles);\n\temit_MMU_aluMemCycles(3, bb_cycles, 0);\n\treturn 1;\n}\n\nstatic int OP_LDRD_STRD_OFFSET_PRE_INDEX(const u32 i)\n{\n\tu8 Rd_num = REG_POS(i, 12);\n\t\n\tif (Rd_num == 14)\n\t{\n\t\tprintf(\"OP_LDRD_STRD_OFFSET_PRE_INDEX: use R14!!!!\\n\");\n\t\treturn 0; // TODO: exception\n\t}\n\tif (Rd_num & 0x1)\n\t{\n\t\tprintf(\"OP_LDRD_STRD_OFFSET_PRE_INDEX: ERROR!!!!\\n\");\n\t\treturn 0; // TODO: exception\n\t}\n\tGpVar Rd = c.newGpVar(kX86VarTypeGpd);\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd);\n\n\tc.mov(Rd, reg_pos_ptr(16));\n\tc.mov(addr, reg_pos_ptr(16));\n\n\t// I bit - immediate or register\n\tif (BIT22(i))\n\t{\n\t\tIMM_OFF;\n\t\tBIT23(i)?c.add(addr, rhs):c.sub(addr, rhs);\n\t}\n\telse\n\t\tBIT23(i)?c.add(addr, reg_pos_ptr(0)):c.sub(addr, reg_pos_ptr(0));\n\n\tif (BIT5(i))\t\t// Store\n\t{\n\t\tX86CompilerFuncCall *ctx = c.call((void*)op_strd_tab[PROCNUM][Rd_num]);\n\t\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1<u32, u32>());\n\t\tctx->setArgument(0, addr);\n\t\tctx->setReturn(bb_cycles);\n\t\tif (BIT21(i)) // W bit - writeback\n\t\t\tc.mov(reg_pos_ptr(16), addr);\n\t\temit_MMU_aluMemCycles(3, bb_cycles, 0);\n\t}\n\telse\t\t\t\t// Load\n\t{\n\t\tif (BIT21(i)) // W bit - writeback\n\t\t\tc.mov(reg_pos_ptr(16), addr);\n\t\tX86CompilerFuncCall *ctx = c.call((void*)op_ldrd_tab[PROCNUM][Rd_num]);\n\t\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1<u32, u32>());\n\t\tctx->setArgument(0, addr);\n\t\tctx->setReturn(bb_cycles);\n\t\temit_MMU_aluMemCycles(3, bb_cycles, 0);\n\t}\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   SWP/SWPB\n//-----------------------------------------------------------------------------\ntemplate<int PROCNUM>\nstatic u32 FASTCALL op_swp(u32 adr, u32 *Rd, u32 Rs)\n{\n\tu32 tmp = ROR(READ32(cpu->mem_if->data, adr), (adr & 3)<<3);\n\tWRITE32(cpu->mem_if->data, adr, Rs);\n\t*Rd = tmp;\n\treturn (MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr) + MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr));\n}\ntemplate<int PROCNUM>\nstatic u32 FASTCALL op_swpb(u32 adr, u32 *Rd, u32 Rs)\n{\n\tu32 tmp = READ8(cpu->mem_if->data, adr);\n\tWRITE8(cpu->mem_if->data, adr, Rs);\n\t*Rd = tmp;\n\treturn (MMU_memAccessCycles<PROCNUM,8,MMU_AD_READ>(adr) + MMU_memAccessCycles<PROCNUM,8,MMU_AD_WRITE>(adr));\n}\n\ntypedef u32 (FASTCALL *OP_SWP_SWPB)(u32, u32*, u32);\nstatic const OP_SWP_SWPB op_swp_tab[2][2] = {{ op_swp<0>, op_swp<1> }, { op_swpb<0>, op_swpb<1> }};\n\nstatic int op_swp_(const u32 i, int b)\n{\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd);\n\tGpVar Rd = c.newGpVar(kX86VarTypeGpz);\n\tGpVar Rs = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(addr, reg_pos_ptr(16));\n\tc.lea(Rd, reg_pos_ptr(12));\n\tif(b)\n\t\tc.movzx(Rs, reg_pos_ptrB(0));\n\telse\n\t\tc.mov(Rs, reg_pos_ptr(0));\n\tX86CompilerFuncCall *ctx = c.call((void*)op_swp_tab[b][PROCNUM]);\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder3<u32, u32, u32*, u32>());\n\tctx->setArgument(0, addr);\n\tctx->setArgument(1, Rd);\n\tctx->setArgument(2, Rs);\n\tctx->setReturn(bb_cycles);\n\temit_MMU_aluMemCycles(4, bb_cycles, 0);\n\treturn 1;\n}\n\nstatic int OP_SWP(const u32 i) { return op_swp_(i, 0); }\nstatic int OP_SWPB(const u32 i) { return op_swp_(i, 1); }\n\n//-----------------------------------------------------------------------------\n//   LDMIA / LDMIB / LDMDA / LDMDB / STMIA / STMIB / STMDA / STMDB\n//-----------------------------------------------------------------------------\nstatic u32 popcount(u32 x)\n{\n\tuint32_t pop = 0;\n\tfor(; x; x>>=1)\n\t\tpop += x&1;\n\treturn pop;\n}\n\nstatic u64 get_reg_list(u32 reg_mask, int dir)\n{\n\tu64 regs = 0;\n\tfor(int j=0; j<16; j++)\n\t{\n\t\tint k = dir<0 ? j : 15-j;\n\t\tif(BIT_N(reg_mask,k))\n\t\t\tregs = (regs << 4) | k;\n\t}\n\treturn regs;\n}\n\n#ifdef ASMJIT_X64\n// generic needs to spill regs and main doesn't; if it's inlined gcc isn't smart enough to keep the spills out of the common case.\n#define LDM_INLINE NOINLINE\n#else\n// spills either way, and we might as well save codesize by not having separate functions\n#define LDM_INLINE INLINE\n#endif\n\ntemplate <int PROCNUM, bool store, int dir>\nstatic LDM_INLINE u32 FASTCALL OP_LDM_STM_generic(u32 adr, u64 regs, int n)\n{\n\tu32 cycles = 0;\n\tadr &= ~3;\n\tdo {\n\t\tif(store) _MMU_write32<PROCNUM>(adr, cpu->R[regs&0xF]);\n\t\telse cpu->R[regs&0xF] = _MMU_read32<PROCNUM>(adr);\n\t\tcycles += MMU_memAccessCycles<PROCNUM,32,store?MMU_AD_WRITE:MMU_AD_READ>(adr);\n\t\tadr += 4*dir;\n\t\tregs >>= 4;\n\t} while(--n > 0);\n\treturn cycles;\n}\n\n#ifdef ENABLE_ADVANCED_TIMING\n#define ADV_CYCLES cycles += MMU_memAccessCycles<PROCNUM,32,store?MMU_AD_WRITE:MMU_AD_READ>(adr);\n#else\n#define ADV_CYCLES\n#endif\n\ntemplate <int PROCNUM, bool store, int dir>\nstatic LDM_INLINE u32 FASTCALL OP_LDM_STM_other(u32 adr, u64 regs, int n)\n{\n\tu32 cycles = 0;\n\tadr &= ~3;\n#ifndef ENABLE_ADVANCED_TIMING\n\tcycles = n * MMU_memAccessCycles<PROCNUM,32,store?MMU_AD_WRITE:MMU_AD_READ>(adr);\n#endif\n\tdo {\n\t\tif(PROCNUM==ARMCPU_ARM9)\n\t\t\tif(store) _MMU_ARM9_write32(adr, cpu->R[regs&0xF]);\n\t\t\telse cpu->R[regs&0xF] = _MMU_ARM9_read32(adr);\n\t\telse\n\t\t\tif(store) _MMU_ARM7_write32(adr, cpu->R[regs&0xF]);\n\t\t\telse cpu->R[regs&0xF] = _MMU_ARM7_read32(adr);\n\t\tADV_CYCLES;\n\t\tadr += 4*dir;\n\t\tregs >>= 4;\n\t} while(--n > 0);\n\treturn cycles;\n}\n\ntemplate <int PROCNUM, bool store, int dir, bool null_compiled>\nstatic FORCEINLINE u32 FASTCALL OP_LDM_STM_main(u32 adr, u64 regs, int n, u8 *ptr, u32 cycles)\n{\n#ifdef ENABLE_ADVANCED_TIMING\n\tcycles = 0;\n#endif\n\tuintptr_t *func = (uintptr_t *)&JITLUT_HANDLE(adr, PROCNUM);\n\n#define OP(j) { \\\n\t/* no need to zero functions in DTCM, since we can't execute from it */ \\\n\tif(null_compiled && store) \\\n\t{ \\\n\t\t*func = 0; \\\n\t\t*(func+1) = 0; \\\n\t} \\\n\tint Rd = ((uintptr_t)regs >> (j*4)) & 0xF; \\\n\tif(store) *(u32*)ptr = cpu->R[Rd]; \\\n\telse cpu->R[Rd] = *(u32*)ptr; \\\n\tADV_CYCLES; \\\n\tfunc += 2*dir; \\\n\tadr += 4*dir; \\\n\tptr += 4*dir; }\n\n\tdo {\n\t\tOP(0);\n\t\tif(n == 1) break;\n\t\tOP(1);\n\t\tif(n == 2) break;\n\t\tOP(2);\n\t\tif(n == 3) break;\n\t\tOP(3);\n\t\tregs >>= 16;\n\t\tn -= 4;\n\t} while(n > 0);\n\treturn cycles;\n#undef OP\n#undef ADV_CYCLES\n}\n\ntemplate <int PROCNUM, bool store, int dir>\nstatic u32 OP_LDM_STM(u32 adr, u64 regs, int n)\n{\n\t// TODO use classify_adr?\n\tu32 cycles;\n\tu8 *ptr;\n\n\tif((adr ^ (adr + (dir>0 ? (n-1)*4 : -15*4))) & ~0x3FFF) // a little conservative, but we don't want to run too many comparisons\n\t{\n\t\t// the memory region spans a page boundary, so we can't factor the address translation out of the loop\n\t\treturn OP_LDM_STM_generic<PROCNUM, store, dir>(adr, regs, n);\n\t}\n\telse if(PROCNUM==ARMCPU_ARM9 && (adr & ~0x3FFF) == MMU.DTCMRegion)\n\t{\n\t\t// don't special-case DTCM cycles, even though that would be both faster and more accurate,\n\t\t// because that wouldn't match the non-jitted version with !ACCOUNT_FOR_DATA_TCM_SPEED\n\t\tptr = MMU.ARM9_DTCM + (adr & 0x3FFC);\n\t\tcycles = n * MMU_memAccessCycles<PROCNUM,32,store?MMU_AD_WRITE:MMU_AD_READ>(adr);\n\t\tif(store)\n\t\t\treturn OP_LDM_STM_main<PROCNUM, store, dir, 0>(adr, regs, n, ptr, cycles);\n\t}\n\telse if((adr & 0x0F000000) == 0x02000000)\n\t{\n\t\tptr = MMU.MAIN_MEM + (adr & _MMU_MAIN_MEM_MASK32);\n\t\tcycles = n * ((PROCNUM==ARMCPU_ARM9) ? 4 : 2);\n\t}\n\telse if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03800000)\n\t{\n\t\tptr = MMU.ARM7_ERAM + (adr & 0xFFFC);\n\t\tcycles = n;\n\t}\n\telse if(PROCNUM==ARMCPU_ARM7 && !store && (adr & 0xFF800000) == 0x03000000)\n\t{\n\t\tptr = MMU.SWIRAM + (adr & 0x7FFC);\n\t\tcycles = n;\n\t}\n\telse\n\t\treturn OP_LDM_STM_other<PROCNUM, store, dir>(adr, regs, n);\n\n\treturn OP_LDM_STM_main<PROCNUM, store, dir, store>(adr, regs, n, ptr, cycles);\n}\n\ntypedef u32 (*LDMOpFunc)(u32,u64,int);\nstatic const LDMOpFunc op_ldm_stm_tab[2][2][2] = {{\n\t{ OP_LDM_STM<0,0,-1>, OP_LDM_STM<0,0,+1> },\n\t{ OP_LDM_STM<0,1,-1>, OP_LDM_STM<0,1,+1> },\n},{\n\t{ OP_LDM_STM<1,0,-1>, OP_LDM_STM<1,0,+1> },\n\t{ OP_LDM_STM<1,1,-1>, OP_LDM_STM<1,1,+1> },\n}};\n\nstatic void call_ldm_stm(GpVar adr, u32 bitmask, bool store, int dir)\n{\n\tif(bitmask)\n\t{\n\t\tGpVar n = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(n, popcount(bitmask));\n#ifdef ASMJIT_X64\n\t\tGpVar regs = c.newGpVar(kX86VarTypeGpz);\n\t\tc.mov(regs, get_reg_list(bitmask, dir));\n\t\tX86CompilerFuncCall *ctx = c.call((void*)op_ldm_stm_tab[PROCNUM][store][dir>0]);\n\t\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder3<u32, u32, uint64_t, int>());\n\t\tctx->setArgument(0, adr);\n\t\tctx->setArgument(1, regs);\n\t\tctx->setArgument(2, n);\n#else\n\t\t// same prototype, but we have to handle splitting of a u64 arg manually\n\t\tGpVar regs_lo = c.newGpVar(kX86VarTypeGpd);\n\t\tGpVar regs_hi = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(regs_lo, (u32)get_reg_list(bitmask, dir));\n\t\tc.mov(regs_hi, get_reg_list(bitmask, dir) >> 32);\n\t\tX86CompilerFuncCall *ctx = c.call((void*)op_ldm_stm_tab[PROCNUM][store][dir>0]);\n\t\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder4<u32, u32, u32, u32, int>());\n\t\tctx->setArgument(0, adr);\n\t\tctx->setArgument(1, regs_lo);\n\t\tctx->setArgument(2, regs_hi);\n\t\tctx->setArgument(3, n);\n#endif\n\t\tctx->setReturn(bb_cycles);\n\t}\n\telse\n\t\tbb_constant_cycles++;\n}\n\nstatic int op_bx(Mem srcreg, bool blx, bool test_thumb);\nstatic int op_bx_thumb(Mem srcreg, bool blx, bool test_thumb);\n\nstatic int op_ldm_stm(u32 i, bool store, int dir, bool before, bool writeback)\n{\n\tu32 bitmask = i & 0xFFFF;\n\tu32 pop = popcount(bitmask);\n\n\tGpVar adr = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(adr, reg_pos_ptr(16));\n\tif(before)\n\t\tc.add(adr, 4*dir);\n\n\tcall_ldm_stm(adr, bitmask, store, dir);\n\n\tif(BIT15(i) && !store)\n\t{\n\t\top_bx(reg_ptr(15), 0, PROCNUM == ARMCPU_ARM9);\n\t}\n\n\tif(writeback)\n\t{\n\t\t\n\t\tif(store || !(i & (1 << REG_POS(i,16))))\n\t\t{\n\t\t\tJIT_COMMENT(\"--- writeback\");\n\t\t\tc.add(reg_pos_ptr(16), 4*dir*pop);\n\t\t}\n\t\telse \n\t\t{\n\t\t\tu32 bitlist = (~((2 << REG_POS(i,16))-1)) & 0xFFFF;\n\t\t\tif(i & bitlist)\n\t\t\t{\n\t\t\t\tJIT_COMMENT(\"--- writeback\");\n\t\t\t\tc.add(adr, 4*dir*(pop-before));\n\t\t\t\tc.mov(reg_pos_ptr(16), adr);\n\t\t\t}\n\t\t}\n\t}\n\n\temit_MMU_aluMemCycles(store ? 1 : 2, bb_cycles, pop);\n\treturn 1;\n}\n\nstatic int OP_LDMIA(const u32 i) { return op_ldm_stm(i, 0, +1, 0, 0); }\nstatic int OP_LDMIB(const u32 i) { return op_ldm_stm(i, 0, +1, 1, 0); }\nstatic int OP_LDMDA(const u32 i) { return op_ldm_stm(i, 0, -1, 0, 0); }\nstatic int OP_LDMDB(const u32 i) { return op_ldm_stm(i, 0, -1, 1, 0); }\nstatic int OP_LDMIA_W(const u32 i) { return op_ldm_stm(i, 0, +1, 0, 1); }\nstatic int OP_LDMIB_W(const u32 i) { return op_ldm_stm(i, 0, +1, 1, 1); }\nstatic int OP_LDMDA_W(const u32 i) { return op_ldm_stm(i, 0, -1, 0, 1); }\nstatic int OP_LDMDB_W(const u32 i) { return op_ldm_stm(i, 0, -1, 1, 1); }\n\nstatic int OP_STMIA(const u32 i) { return op_ldm_stm(i, 1, +1, 0, 0); }\nstatic int OP_STMIB(const u32 i) { return op_ldm_stm(i, 1, +1, 1, 0); }\nstatic int OP_STMDA(const u32 i) { return op_ldm_stm(i, 1, -1, 0, 0); }\nstatic int OP_STMDB(const u32 i) { return op_ldm_stm(i, 1, -1, 1, 0); }\nstatic int OP_STMIA_W(const u32 i) { return op_ldm_stm(i, 1, +1, 0, 1); }\nstatic int OP_STMIB_W(const u32 i) { return op_ldm_stm(i, 1, +1, 1, 1); }\nstatic int OP_STMDA_W(const u32 i) { return op_ldm_stm(i, 1, -1, 0, 1); }\nstatic int OP_STMDB_W(const u32 i) { return op_ldm_stm(i, 1, -1, 1, 1); }\n\nstatic int op_ldm_stm2(u32 i, bool store, int dir, bool before, bool writeback)\n{\n\tu32 bitmask = i & 0xFFFF;\n\tu32 pop = popcount(bitmask);\n\tbool bit15 = BIT15(i);\n\n\t//printf(\"ARM%c: %s R%d:%08X, bitmask %02X\\n\", PROCNUM?'7':'9', (store?\"STM\":\"LDM\"), REG_POS(i, 16), cpu->R[REG_POS(i, 16)], bitmask);\n\tu32 adr_first = cpu->R[REG_POS(i, 16)];\n\n\tGpVar adr = c.newGpVar(kX86VarTypeGpd);\n\tGpVar oldmode = c.newGpVar(kX86VarTypeGpd);\n\n\tc.mov(adr, reg_pos_ptr(16));\n\tif(before)\n\t\tc.add(adr, 4*dir);\n\n\tif (!bit15 || store)\n\t{  \n\t\t//if((cpu->CPSR.bits.mode==USR)||(cpu->CPSR.bits.mode==SYS)) { printf(\"ERROR1\\n\"); return 1; }\n\t\t//oldmode = armcpu_switchMode(cpu, SYS);\n\t\tc.mov(oldmode, SYS);\n\t\tX86CompilerFuncCall *ctx = c.call((void*)armcpu_switchMode);\n\t\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder2<u32, void*, u8>());\n\t\tctx->setArgument(0, bb_cpu);\n\t\tctx->setArgument(1, oldmode);\n\t\tctx->setReturn(oldmode);\n\t}\n\n\tcall_ldm_stm(adr, bitmask, store, dir);\n\n\tif(!bit15 || store)\n\t{\n\t\t//armcpu_switchMode(cpu, oldmode);\n\t\tX86CompilerFuncCall *ctx = c.call((void*)armcpu_switchMode);\n\t\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder2<void, void*, u8>());\n\t\tctx->setArgument(0, bb_cpu);\n\t\tctx->setArgument(1, oldmode);\n\t}\n\telse\n\t{\n\t\tS_DST_R15;\n\t}\n\n\t// FIXME\n\tif(writeback)\n\t{\n\t\tif(store || !(i & (1 << REG_POS(i,16))))\n\t\t\tc.add(reg_pos_ptr(16), 4*dir*pop);\n\t\telse \n\t\t{\n\t\t\tu32 bitlist = (~((2 << REG_POS(i,16))-1)) & 0xFFFF;\n\t\t\tif(i & bitlist)\n\t\t\t{\n\t\t\t\tc.add(adr, 4*dir*(pop-before));\n\t\t\t\tc.mov(reg_pos_ptr(16), adr);\n\t\t\t}\n\t\t}\n\t}\n\n\temit_MMU_aluMemCycles(store ? 1 : 2, bb_cycles, pop);\n\treturn 1;\n}\n\nstatic int OP_LDMIA2(const u32 i) { return op_ldm_stm2(i, 0, +1, 0, 0); }\nstatic int OP_LDMIB2(const u32 i) { return op_ldm_stm2(i, 0, +1, 1, 0); }\nstatic int OP_LDMDA2(const u32 i) { return op_ldm_stm2(i, 0, -1, 0, 0); }\nstatic int OP_LDMDB2(const u32 i) { return op_ldm_stm2(i, 0, -1, 1, 0); }\nstatic int OP_LDMIA2_W(const u32 i) { return op_ldm_stm2(i, 0, +1, 0, 1); }\nstatic int OP_LDMIB2_W(const u32 i) { return op_ldm_stm2(i, 0, +1, 1, 1); }\nstatic int OP_LDMDA2_W(const u32 i) { return op_ldm_stm2(i, 0, -1, 0, 1); }\nstatic int OP_LDMDB2_W(const u32 i) { return op_ldm_stm2(i, 0, -1, 1, 1); }\n\nstatic int OP_STMIA2(const u32 i) { return op_ldm_stm2(i, 1, +1, 0, 0); }\nstatic int OP_STMIB2(const u32 i) { return op_ldm_stm2(i, 1, +1, 1, 0); }\nstatic int OP_STMDA2(const u32 i) { return op_ldm_stm2(i, 1, -1, 0, 0); }\nstatic int OP_STMDB2(const u32 i) { return op_ldm_stm2(i, 1, -1, 1, 0); }\nstatic int OP_STMIA2_W(const u32 i) { return op_ldm_stm2(i, 1, +1, 0, 1); }\nstatic int OP_STMIB2_W(const u32 i) { return op_ldm_stm2(i, 1, +1, 1, 1); }\nstatic int OP_STMDA2_W(const u32 i) { return op_ldm_stm2(i, 1, -1, 0, 1); }\nstatic int OP_STMDB2_W(const u32 i) { return op_ldm_stm2(i, 1, -1, 1, 1); }\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\n#define SIGNEXTEND_11(i) (((s32)i<<21)>>21)\n#define SIGNEXTEND_24(i) (((s32)i<<8)>>8)\n\nstatic int op_b(u32 i, bool bl)\n{\n\tu32 dst = bb_r15 + (SIGNEXTEND_24(i) << 2);\n\tif(CONDITION(i)==0xF)\n\t{\n\t\tif(bl)\n\t\t\tdst += 2;\n\t\tc.or_(cpu_ptr_byte(CPSR, 0), 1<<5);\n\t}\n\tif(bl || CONDITION(i)==0xF)\n\t\tc.mov(reg_ptr(14), bb_next_instruction);\n\n\tc.mov(cpu_ptr(instruct_adr), dst);\n\treturn 1;\n}\n\nstatic int OP_B(const u32 i) { return op_b(i, 0); }\nstatic int OP_BL(const u32 i) { return op_b(i, 1); }\n\nstatic int op_bx(Mem srcreg, bool blx, bool test_thumb)\n{\n\tGpVar dst = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(dst, srcreg);\n\n\tif(test_thumb)\n\t{\n\t\tGpVar mask = c.newGpVar(kX86VarTypeGpd);\n\t\tGpVar thumb = dst;\n\t\tdst = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(dst, thumb);\n\t\tc.and_(thumb, 1);\n\t\tc.lea(mask, ptr_abs((void*)0xFFFFFFFC, thumb.r64(), kScale2Times));\n\t\tc.shl(thumb, 5);\n\t\tc.or_(cpu_ptr_byte(CPSR, 0), thumb.r8Lo());\n\t\tc.and_(dst, mask);\n\t}\n\telse\n\t\tc.and_(dst, 0xFFFFFFFC);\n\n\tif(blx)\n\t\tc.mov(reg_ptr(14), bb_next_instruction);\n\tc.mov(cpu_ptr(instruct_adr), dst);\n\treturn 1;\n}\n\n//TODO: exeption when Rm=PC\nstatic int OP_BX(const u32 i) { return op_bx(reg_pos_ptr(0), 0, 1); }\nstatic int OP_BLX_REG(const u32 i) { return op_bx(reg_pos_ptr(0), 1, 1); }\n\n//-----------------------------------------------------------------------------\n//   CLZ\n//-----------------------------------------------------------------------------\nstatic int OP_CLZ(const u32 i)\n{\n\tGpVar res = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(res, 0x3F);\n\tc.bsr(res, reg_pos_ptr(0));\n\tc.xor_(res, 0x1F);\n\tc.mov(reg_pos_ptr(12), res);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   MCR / MRC\n//-----------------------------------------------------------------------------\n#define MASKPRECALC \\\n{ \\\n\tX86CompilerFuncCall* ctxM = c.call((void*)maskPrecalc); \\\n\tctxM->setPrototype(kX86FuncConvDefault, FuncBuilder0<Void>()); \\\n}\nstatic int OP_MCR(const u32 i)\n{\n\tif (PROCNUM == ARMCPU_ARM7) return 0;\n\n\tu32 cpnum = REG_POS(i, 8);\n\tif(cpnum != 15)\n\t{\n\t\t// TODO - exception?\n\t\tprintf(\"JIT: MCR P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", \n\t\t\tcpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\n\t\treturn 2;\n\t}\n\tif (REG_POS(i, 12) == 15)\n\t{\n\t\tprintf(\"JIT: MCR Rd=R15\\n\");\n\t\treturn 2;\n\t}\n\n\tu8 CRn =  REG_POS(i, 16);\t\t// Cn\n\tu8 CRm =  REG_POS(i, 0);\t\t// Cm\n\tu8 opcode1 = ((i>>21)&0x7);\t\t// opcode1\n\tu8 opcode2 = ((i>>5)&0x7);\t\t// opcode2\n\n\tGpVar bb_cp15 = c.newGpVar(kX86VarTypeGpz);\n\tGpVar data = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(data, reg_pos_ptr(12));\n\tc.mov(bb_cp15, (uintptr_t)&cp15);\n\n\tbool bUnknown = false;\n\tswitch(CRn)\n\t{\n\t\tcase 1:\n\t\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t\t{\n\t\t\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\t\t\t// On the NDS bit0,2,7,12..19 are R/W, Bit3..6 are always set, all other bits are always zero.\n\t\t\t\t//MMU.ARM9_RW_MODE = BIT7(val);\n\t\t\t\tGpVar bb_mmu = c.newGpVar(kX86VarTypeGpz);\n\t\t\t\tc.mov(bb_mmu, (uintptr_t)&MMU);\n\t\t\t\tMem rwmode = mmu_ptr_byte(ARM9_RW_MODE);\n\t\t\t\tMem ldtbit = cpu_ptr_byte(LDTBit, 0);\n\t\t\t\tc.test(data, (1<<7));\n\t\t\t\tc.setnz(rwmode);\n\t\t\t\t//cpu->intVector = 0xFFFF0000 * (BIT13(val));\n\t\t\t\tGpVar vec = c.newGpVar(kX86VarTypeGpd);\n\t\t\t\tc.mov(tmp, 0xFFFF0000);\n\t\t\t\tc.xor_(vec, vec);\n\t\t\t\tc.test(data, (1 << 13));\n\t\t\t\tc.cmovnz(vec, tmp);\n\t\t\t\tc.mov(cpu_ptr(intVector), vec);\n\t\t\t\t//cpu->LDTBit = !BIT15(val); //TBit\n\t\t\t\tc.test(data, (1 << 15));\n\t\t\t\tc.setz(ldtbit);\n\t\t\t\t//ctrl = (val & 0x000FF085) | 0x00000078;\n\t\t\t\tc.and_(data, 0x000FF085);\n\t\t\t\tc.or_(data, 0x00000078);\n\t\t\t\tc.mov(cp15_ptr(ctrl), data);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tif((opcode1==0) && (CRm==0))\n\t\t\t{\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t// DCConfig = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(DCConfig), data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t// ICConfig = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(ICConfig), data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t\t{\n\t\t\t\t//writeBuffCtrl = val;\n\t\t\t\tc.mov(cp15_ptr(writeBuffCtrl), data);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tif((opcode1==0) && (CRm==0))\n\t\t\t{\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t//DaccessPerm = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(DaccessPerm), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t//IaccessPerm = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(IaccessPerm), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\tif((opcode1==0) && (opcode2==0))\n\t\t\t{\n\t\t\t\tswitch(CRm)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t//protectBaseSize0 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize0), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t//protectBaseSize1 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize1), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t//protectBaseSize2 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize2), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t//protectBaseSize3 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize3), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\t//protectBaseSize4 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize4), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\t//protectBaseSize5 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize5), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 6:\n\t\t\t\t\t\t//protectBaseSize6 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize6), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 7:\n\t\t\t\t\t\t//protectBaseSize7 = val;\n\t\t\t\t\t\tc.mov(cp15_ptr(protectBaseSize7), data);\n\t\t\t\t\t\tMASKPRECALC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tif((CRm==0)&&(opcode1==0)&&((opcode2==4)))\n\t\t\t{\n\t\t\t\t//CP15wait4IRQ;\n\t\t\t\tc.mov(cpu_ptr(waitIRQ), true);\n\t\t\t\tc.mov(cpu_ptr(halt_IE_and_IF), true);\n\t\t\t\t//IME set deliberately omitted: only SWI sets IME to 1\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\tif((opcode1==0))\n\t\t\t{\n\t\t\t\tswitch(CRm)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tswitch(opcode2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t//DcacheLock = val;\n\t\t\t\t\t\t\t\tc.mov(cp15_ptr(DcacheLock), data);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t//IcacheLock = val;\n\t\t\t\t\t\t\t\tc.mov(cp15_ptr(IcacheLock), data);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tswitch(opcode2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//MMU.DTCMRegion = DTCMRegion = val & 0x0FFFF000;\n\t\t\t\t\t\t\t\t\tc.and_(data, 0x0FFFF000);\n\t\t\t\t\t\t\t\t\tGpVar bb_mmu = c.newGpVar(kX86VarTypeGpz);\n\t\t\t\t\t\t\t\t\tc.mov(bb_mmu, (uintptr_t)&MMU);\n\t\t\t\t\t\t\t\t\tc.mov(mmu_ptr(DTCMRegion), data);\n\t\t\t\t\t\t\t\t\tc.mov(cp15_ptr(DTCMRegion), data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//ITCMRegion = val;\n\t\t\t\t\t\t\t\t\t//ITCM base is not writeable!\n\t\t\t\t\t\t\t\t\tGpVar bb_mmu = c.newGpVar(kX86VarTypeGpz);\n\t\t\t\t\t\t\t\t\tc.mov(bb_mmu, (uintptr_t)&MMU);\n\t\t\t\t\t\t\t\t\tc.mov(mmu_ptr(ITCMRegion), 0);\n\t\t\t\t\t\t\t\t\tc.mov(cp15_ptr(ITCMRegion), data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tcase 15:\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t}\n\n\tif (bUnknown)\n\t{\n\t\t//printf(\"Unknown MCR command: MRC P15, 0, R%i, C%i, C%i, %i, %i\\n\", REG_POS(i, 12), CRn, CRm, opcode1, opcode2);\n\t\treturn 1;\n\t}\n\n\treturn 1;\n}\nstatic int OP_MRC(const u32 i)\n{\n\tif (PROCNUM == ARMCPU_ARM7) return 0;\n\n\tu32 cpnum = REG_POS(i, 8);\n\tif(cpnum != 15)\n\t{\n\t\tprintf(\"MRC P%i, 0, R%i, C%i, C%i, %i, %i (don't allocated coprocessor)\\n\", cpnum, REG_POS(i, 12), REG_POS(i, 16), REG_POS(i, 0), (i>>21)&0x7, (i>>5)&0x7);\n\t\treturn 2;\n\t}\n\n\tu8 CRn =  REG_POS(i, 16);\t\t// Cn\n\tu8 CRm =  REG_POS(i, 0);\t\t// Cm\n\tu8 opcode1 = ((i>>21)&0x7);\t\t// opcode1\n\tu8 opcode2 = ((i>>5)&0x7);\t\t// opcode2\n\n\tGpVar bb_cp15 = c.newGpVar(kX86VarTypeGpz);\n\tGpVar data = c.newGpVar(kX86VarTypeGpd);\n\n\tc.mov(bb_cp15, (uintptr_t)&cp15);\n\t\n\tbool bUnknown = false;\n\tswitch(CRn)\n\t{\n\t\tcase 0:\n\t\t\tif((opcode1 == 0)&&(CRm==0))\n\t\t\t{\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t// *R = cacheType;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(cacheType));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t// *R = TCMSize;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(TCMSize));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\t\t// FIXME\n\t\t\t\t\t\t// *R = IDCode;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(IDCode));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\n\t\tcase 1:\n\t\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t\t{\n\t\t\t\t// *R = ctrl;\n\t\t\t\tc.mov(data, cp15_ptr(ctrl));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\n\t\tcase 2:\n\t\t\tif((opcode1==0) && (CRm==0))\n\t\t\t{\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t// *R = DCConfig;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(DCConfig));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t// *R = ICConfig;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(ICConfig));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 3:\n\t\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t\t{\n\t\t\t\t// *R = writeBuffCtrl;\n\t\t\t\tc.mov(data, cp15_ptr(writeBuffCtrl));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 5:\n\t\t\tif((opcode1==0) && (CRm==0))\n\t\t\t{\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t// *R = DaccessPerm;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(DaccessPerm));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t// *R = IaccessPerm;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(IaccessPerm));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 6:\n\t\t\tif((opcode1==0) && (opcode2==0))\n\t\t\t{\n\t\t\t\tswitch(CRm)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t// *R = protectBaseSize0;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize0));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t// *R = protectBaseSize1;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t// *R = protectBaseSize2;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize2));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t// *R = protectBaseSize3;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize3));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\t// *R = protectBaseSize4;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize4));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\t// *R = protectBaseSize5;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize5));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 6:\n\t\t\t\t\t\t// *R = protectBaseSize6;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize6));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 7:\n\t\t\t\t\t\t// *R = protectBaseSize7;\n\t\t\t\t\t\tc.mov(data, cp15_ptr(protectBaseSize7));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 7:\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\n\t\tcase 9:\n\t\t\tif(opcode1 == 0)\n\t\t\t{\n\t\t\t\tswitch(CRm)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tswitch(opcode2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t//*R = DcacheLock;\n\t\t\t\t\t\t\t\tc.mov(data, cp15_ptr(DcacheLock));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t//*R = IcacheLock;\n\t\t\t\t\t\t\t\tc.mov(data, cp15_ptr(IcacheLock));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tswitch(opcode2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t//*R = DTCMRegion;\n\t\t\t\t\t\t\t\tc.mov(data, cp15_ptr(DTCMRegion));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t//*R = ITCMRegion;\n\t\t\t\t\t\t\t\tc.mov(data, cp15_ptr(ITCMRegion));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbUnknown = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 13:\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 15:\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbUnknown = true;\n\t\t\tbreak;\n\t}\n\n\tif (bUnknown)\n\t{\n\t\t//printf(\"Unknown MRC command: MRC P15, 0, R%i, C%i, C%i, %i, %i\\n\", REG_POS(i, 12), CRn, CRm, opcode1, opcode2);\n\t\treturn 1;\n\t}\n\n\tif (REG_POS(i, 12) == 15)\t// set NZCV\n\t{\n\t\t//CPSR.bits.N = BIT31(data);\n\t\t//CPSR.bits.Z = BIT30(data);\n\t\t//CPSR.bits.C = BIT29(data);\n\t\t//CPSR.bits.V = BIT28(data);\n\t\tc.and_(data, 0xF0000000);\n\t\tc.and_(cpu_ptr(CPSR), 0x0FFFFFFF);\n\t\tc.or_(cpu_ptr(CPSR), data);\n\t}\n\telse\n\t\tc.mov(reg_pos_ptr(12), data);\n\n\treturn 1;\n}\n\nu32 op_swi(u8 swinum)\n{\n\tif(cpu->swi_tab)\n\t{\n#if defined(_M_X64) || defined(__x86_64__)\n\t\t// TODO:\n\t\treturn 0;\n#else\n\t\tX86CompilerFuncCall *ctx = c.call((void*)ARM_swi_tab[PROCNUM][swinum]);\n\t\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder0<u32>());\n\t\tctx->setReturn(bb_cycles);\n\t\tc.add(bb_cycles, 3);\n\t\treturn 1;\n#endif\n\t}\n\n\tGpVar oldCPSR = c.newGpVar(kX86VarTypeGpd);\n\tGpVar mode = c.newGpVar(kX86VarTypeGpd);\n\tMem CPSR = cpu_ptr(CPSR.val);\n\tJIT_COMMENT(\"store CPSR to x86 stack\");\n\tc.mov(oldCPSR, CPSR);\n\tJIT_COMMENT(\"enter SVC mode\");\n\tc.mov(mode, imm(SVC));\n\tX86CompilerFuncCall* ctx = c.call((void*)armcpu_switchMode);\n\tctx->setPrototype(kX86FuncConvDefault, FuncBuilder2<void, void*, u8>());\n\tctx->setArgument(0, bb_cpu);\n\tctx->setArgument(1, mode);\n\tc.unuse(mode);\n\tJIT_COMMENT(\"store next instruction address to R14\");\n\tc.mov(reg_ptr(14), bb_next_instruction);\n\tJIT_COMMENT(\"save old CPSR as new SPSR\");\n\tc.mov(cpu_ptr(SPSR.val), oldCPSR);\n\tJIT_COMMENT(\"CPSR: clear T, set I\");\n\tGpVar _cpsr = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(_cpsr, CPSR);\n\tc.and_(_cpsr, ~(1 << 5));\t/* clear T */\n\tc.or_(_cpsr, (1 << 7));\t\t/* set I */\n\tc.mov(CPSR, _cpsr);\n\tc.unuse(_cpsr);\n\tJIT_COMMENT(\"set next instruction\");\n\tc.mov(cpu_ptr(next_instruction), imm(cpu->intVector+0x08));\n\t\n\treturn 1;\n}\n\nstatic int OP_SWI(const u32 i) { return op_swi((i >> 16) & 0x1F); }\n\n//-----------------------------------------------------------------------------\n//   BKPT\n//-----------------------------------------------------------------------------\nstatic int OP_BKPT(const u32 i) { printf(\"JIT: unimplemented OP_BKPT\\n\"); return 0; }\n\n//-----------------------------------------------------------------------------\n//   THUMB\n//-----------------------------------------------------------------------------\n#define OP_SHIFTS_IMM(x86inst) \\\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd); \\\n\tu8 cf_change = 1; \\\n\tconst u32 rhs = ((i>>6) & 0x1F); \\\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3)) \\\n\t\tc.x86inst(reg_pos_thumb(0), rhs); \\\n\telse \\\n\t{ \\\n\t\tGpVar lhs = c.newGpVar(kX86VarTypeGpd); \\\n\t\tc.mov(lhs, reg_pos_thumb(3)); \\\n\t\tc.x86inst(lhs, rhs); \\\n\t\tc.mov(reg_pos_thumb(0), lhs); \\\n\t\tc.unuse(lhs); \\\n\t} \\\n\tc.setc(rcf.r8Lo()); \\\n\tSET_NZC; \\\n\treturn 1;\n\n#define OP_SHIFTS_REG(x86inst, bit) \\\n\tu8 cf_change = 1; \\\n\tGpVar imm = c.newGpVar(kX86VarTypeGpz); \\\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd); \\\n\tLabel __eq32 = c.newLabel(); \\\n\tLabel __ls32 = c.newLabel(); \\\n\tLabel __zero = c.newLabel(); \\\n\tLabel __done = c.newLabel(); \\\n\t\\\n\tc.mov(imm, reg_pos_thumb(3)); \\\n\tc.and_(imm, 0xFF); \\\n\tc.jz(__zero); \\\n\tc.cmp(imm, 32); \\\n\tc.jl(__ls32); \\\n\tc.je(__eq32); \\\n\t/* imm > 32 */ \\\n\tc.mov(reg_pos_thumb(0), 0); \\\n\tSET_NZC_SHIFTS_ZERO(0); \\\n\tc.jmp(__done); \\\n\t/* imm == 32 */ \\\n\tc.bind(__eq32); \\\n\tc.test(reg_pos_thumb(0), (1 << bit)); \\\n\tc.setnz(rcf.r8Lo()); \\\n\tc.mov(reg_pos_thumb(0), 0); \\\n\tSET_NZC_SHIFTS_ZERO(1); \\\n\tc.jmp(__done); \\\n\t/* imm == 0 */ \\\n\tc.bind(__zero); \\\n\tc.cmp(reg_pos_thumb(0), 0); \\\n\tSET_NZ(0); \\\n\tc.jmp(__done); \\\n\t/* imm < 32 */ \\\n\tc.bind(__ls32); \\\n\tc.x86inst(reg_pos_thumb(0), imm); \\\n\tc.setc(rcf.r8Lo()); \\\n\tSET_NZC; \\\n\tc.bind(__done); \\\n\treturn 1;\n\n#define OP_LOGIC(x86inst, _conv) \\\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd); \\\n\tc.mov(rhs, reg_pos_thumb(3)); \\\n\tif (_conv==1) c.not_(rhs); \\\n\tc.x86inst(reg_pos_thumb(0), rhs); \\\n\tSET_NZ(0); \\\n\treturn 1;\n\n//-----------------------------------------------------------------------------\n//   LSL / LSR / ASR / ROR\n//-----------------------------------------------------------------------------\nstatic int OP_LSL_0(const u32 i) \n{\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3))\n\t\tc.cmp(reg_pos_thumb(0), 0);\n\telse\n\t{\n\t\tGpVar rhs = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(rhs, reg_pos_thumb(3));\n\t\tc.mov(reg_pos_thumb(0), rhs);\n\t\tc.cmp(rhs, 0);\n\t}\n\tSET_NZ(0);\n\treturn 1;\n}\nstatic int OP_LSL(const u32 i) { OP_SHIFTS_IMM(shl); }\nstatic int OP_LSL_REG(const u32 i) { OP_SHIFTS_REG(shl, 0); }\nstatic int OP_LSR_0(const u32 i) \n{\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd);\n\tc.test(reg_pos_thumb(3), (1 << 31));\n\tc.setnz(rcf.r8Lo());\n\tSET_NZC_SHIFTS_ZERO(1);\n\tc.mov(reg_pos_thumb(0), 0);\n\treturn 1;\n}\nstatic int OP_LSR(const u32 i) { OP_SHIFTS_IMM(shr); }\nstatic int OP_LSR_REG(const u32 i) { OP_SHIFTS_REG(shr, 31); }\nstatic int OP_ASR_0(const u32 i)\n{\n\tu8 cf_change = 1;\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd);\n\tGpVar rhs = c.newGpVar(kX86VarTypeGpd);\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3))\n\t\tc.sar(reg_pos_thumb(0), 31);\n\telse\n\t{\n\t\tc.mov(rhs, reg_pos_thumb(3));\n\t\tc.sar(rhs, 31);\n\t\tc.mov(reg_pos_thumb(0), rhs);\n\t}\n\tc.sets(rcf.r8Lo());\n\tSET_NZC;\n\treturn 1;\n}\nstatic int OP_ASR(const u32 i) { OP_SHIFTS_IMM(sar); }\nstatic int OP_ASR_REG(const u32 i) \n{\n\tu8 cf_change = 1;\n\tLabel __gr0 = c.newLabel();\n\tLabel __lt32 = c.newLabel();\n\tLabel __done = c.newLabel();\n\tLabel __setFlags = c.newLabel();\n\tGpVar imm = c.newGpVar(kX86VarTypeGpz);\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(imm, reg_pos_thumb(3));\n\tc.and_(imm, 0xFF);\n\tc.jnz(__gr0);\n\t/* imm == 0 */\n\tc.cmp(reg_pos_thumb(0), 0);\n\tSET_NZ(0);\n\tc.jmp(__done);\n\t/* imm > 0 */\n\tc.bind(__gr0);\n\tc.cmp(imm, 32);\n\tc.jl(__lt32);\n\t/* imm > 31 */\n\tc.sar(reg_pos_thumb(0), 31);\n\tc.sets(rcf.r8Lo());\n\tc.jmp(__setFlags);\n\t/* imm < 32 */\n\tc.bind(__lt32);\n\tc.sar(reg_pos_thumb(0), imm);\n\tc.setc(rcf.r8Lo());\n\tc.bind(__setFlags);\n\tSET_NZC;\n\tc.bind(__done);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   ROR\n//-----------------------------------------------------------------------------\nstatic int OP_ROR_REG(const u32 i)\n{\n\tu8 cf_change = 1;\n\tGpVar imm = c.newGpVar(kX86VarTypeGpz);\n\tGpVar rcf = c.newGpVar(kX86VarTypeGpd);\n\tLabel __zero = c.newLabel();\n\tLabel __zero_1F = c.newLabel();\n\tLabel __done = c.newLabel();\n\n\tc.mov(imm, reg_pos_thumb(3));\n\tc.and_(imm, 0xFF);\n\tc.jz(__zero);\n\tc.and_(imm, 0x1F);\n\tc.jz(__zero_1F);\n\tc.ror(reg_pos_thumb(0), imm);\n\tc.setc(rcf.r8Lo());\n\tSET_NZC;\n\tc.jmp(__done);\n\t/* imm & 0x1F == 0 */\n\tc.bind(__zero_1F);\n\tc.cmp(reg_pos_thumb(0), 0);\n\tc.sets(rcf.r8Lo());\n\tSET_NZC;\n\tc.jmp(__done);\n\t/* imm == 0 */\n\tc.bind(__zero);\n\tc.cmp(reg_pos_thumb(0), 0);\n\tSET_NZ(0);\n\tc.bind(__done);\n\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   AND / ORR / EOR / BIC\n//-----------------------------------------------------------------------------\nstatic int OP_AND(const u32 i) { OP_LOGIC(and_, 0); }\nstatic int OP_ORR(const u32 i) { OP_LOGIC(or_,  0); }\nstatic int OP_EOR(const u32 i) { OP_LOGIC(xor_, 0); }\nstatic int OP_BIC(const u32 i) { OP_LOGIC(and_, 1); }\n\n//-----------------------------------------------------------------------------\n//   NEG\n//-----------------------------------------------------------------------------\nstatic int OP_NEG(const u32 i)\n{\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3))\n\t\tc.neg(reg_pos_thumb(0));\n\telse\n\t{\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(tmp, reg_pos_thumb(3));\n\t\tc.neg(tmp);\n\t\tc.mov(reg_pos_thumb(0), tmp);\n\t}\n\tSET_NZCV(1);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   ADD\n//-----------------------------------------------------------------------------\nstatic int OP_ADD_IMM3(const u32 i) \n{\n\tu32 imm3 = (i >> 6) & 0x07;\n\n\tif (imm3 == 0)\t// mov 2\n\t{\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(tmp, reg_pos_thumb(3));\n\t\tc.mov(reg_pos_thumb(0), tmp);\n\t\tc.cmp(tmp, 0);\n\t\tSET_NZ(1);\n\t\treturn 1;\n\t}\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3))\n\t{\n\t\tc.add(reg_pos_thumb(0), imm3);\n\t}\n\telse\n\t{\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(tmp, reg_pos_thumb(3));\n\t\tc.add(tmp, imm3);\n\t\tc.mov(reg_pos_thumb(0), tmp);\n\t}\n\tSET_NZCV(0);\n\treturn 1;\n}\nstatic int OP_ADD_IMM8(const u32 i) \n{\n\tc.add(reg_pos_thumb(8), (i & 0xFF));\n\tSET_NZCV(0);\n\n\treturn 1; \n}\nstatic int OP_ADD_REG(const u32 i) \n{\n\t//cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)];\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3))\n\t{\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(tmp, reg_pos_thumb(6));\n\t\tc.add(reg_pos_thumb(0), tmp);\n\t}\n\telse\n\t\tif (_REG_NUM(i, 0) == _REG_NUM(i, 6))\n\t\t{\n\t\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\t\tc.mov(tmp, reg_pos_thumb(3));\n\t\t\tc.add(reg_pos_thumb(0), tmp);\n\t\t}\n\t\telse\n\t\t\t{\n\t\t\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\t\t\tc.mov(tmp, reg_pos_thumb(3));\n\t\t\t\tc.add(tmp, reg_pos_thumb(6));\n\t\t\t\tc.mov(reg_pos_thumb(0), tmp);\n\t\t\t}\n\tSET_NZCV(0);\n\treturn 1; \n}\nstatic int OP_ADD_SPE(const u32 i)\n{\n\tu32 Rd = _REG_NUM(i, 0) | ((i>>4)&8);\n\t//cpu->R[Rd] += cpu->R[REG_POS(i, 3)];\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_ptr(Rd));\n\tc.add(tmp, reg_pos_ptr(3));\n\tc.mov(reg_ptr(Rd), tmp);\n\t\n\tif(Rd==15)\n\t\tc.mov(cpu_ptr(next_instruction), tmp);\n\t\t\n\treturn 1;\n}\n\nstatic int OP_ADD_2PC(const u32 i)\n{\n\tu32 imm = ((i&0xFF)<<2);\n\tc.mov(reg_pos_thumb(8), (bb_r15 & 0xFFFFFFFC) + imm);\n\treturn 1;\n}\n\nstatic int OP_ADD_2SP(const u32 i)\n{\n\tu32 imm = ((i&0xFF)<<2);\n\t//cpu->R[REG_NUM(i, 8)] = cpu->R[13] + ((i&0xFF)<<2);\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_ptr(13));\n\tif (imm) c.add(tmp, imm);\n\tc.mov(reg_pos_thumb(8), tmp);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   SUB\n//-----------------------------------------------------------------------------\nstatic int OP_SUB_IMM3(const u32 i)\n{\n\tu32 imm3 = (i >> 6) & 0x07;\n\n\t// cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] - imm3;\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3))\n\t{\n\t\tc.sub(reg_pos_thumb(0), imm3);\n\t}\n\telse\n\t{\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(tmp, reg_pos_thumb(3));\n\t\tc.sub(tmp, imm3);\n\t\tc.mov(reg_pos_thumb(0), tmp);\n\t}\n\tSET_NZCV(1);\n\treturn 1;\n}\nstatic int OP_SUB_IMM8(const u32 i)\n{\n\t//cpu->R[REG_NUM(i, 8)] -= imm8;\n\tc.sub(reg_pos_thumb(8), (i & 0xFF));\n\tSET_NZCV(1);\n\treturn 1; \n}\nstatic int OP_SUB_REG(const u32 i)\n{\n\t// cpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)] - cpu->R[REG_NUM(i, 6)];\n\tif (_REG_NUM(i, 0) == _REG_NUM(i, 3))\n\t{\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(tmp, reg_pos_thumb(6));\n\t\tc.sub(reg_pos_thumb(0), tmp);\n\t}\n\telse\n\t{\n\t\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(tmp, reg_pos_thumb(3));\n\t\tc.sub(tmp, reg_pos_thumb(6));\n\t\tc.mov(reg_pos_thumb(0), tmp);\n\t}\n\tSET_NZCV(1);\n\treturn 1; \n}\n\n//-----------------------------------------------------------------------------\n//   ADC\n//-----------------------------------------------------------------------------\nstatic int OP_ADC_REG(const u32 i)\n{\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_thumb(3));\n\tGET_CARRY(0);\n\tc.adc(reg_pos_thumb(0), tmp);\n\tSET_NZCV(0);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   SBC\n//-----------------------------------------------------------------------------\nstatic int OP_SBC_REG(const u32 i)\n{\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_thumb(3));\n\tGET_CARRY(1);\n\tc.sbb(reg_pos_thumb(0), tmp);\n\tSET_NZCV(1);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   MOV / MVN\n//-----------------------------------------------------------------------------\nstatic int OP_MOV_IMM8(const u32 i)\n{\n\tc.mov(reg_pos_thumb(8), (i & 0xFF));\n\tc.cmp(reg_pos_thumb(8), 0);\n\tSET_NZ(0);\n\treturn 1;\n}\n\nstatic int OP_MOV_SPE(const u32 i)\n{\n\tu32 Rd = _REG_NUM(i, 0) | ((i>>4)&8);\n\t//cpu->R[Rd] = cpu->R[REG_POS(i, 3)];\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_ptr(3));\n\tc.mov(reg_ptr(Rd), tmp);\n\tif(Rd == 15)\n\t{\n\t\tc.mov(cpu_ptr(next_instruction), tmp);\n\t\tbb_constant_cycles += 2;\n\t}\n\t\n\treturn 1;\n}\n\nstatic int OP_MVN(const u32 i)\n{\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_thumb(3));\n\tc.not_(tmp);\n\tc.cmp(tmp, 0);\n\tc.mov(reg_pos_thumb(0), tmp);\n\tSET_NZ(0);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   MUL\n//-----------------------------------------------------------------------------\nstatic int OP_MUL_REG(const u32 i) \n{\n\tGpVar lhs = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(lhs, reg_pos_thumb(0));\n\tc.imul(lhs, reg_pos_thumb(3));\n\tc.cmp(lhs, 0);\n\tc.mov(reg_pos_thumb(0), lhs);\n\tSET_NZ(0);\n\tif (PROCNUM == ARMCPU_ARM7)\n\t\tc.mov(bb_cycles, 4);\n\telse\n\t\tMUL_Mxx_END(lhs, 0, 1);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   CMP / CMN\n//-----------------------------------------------------------------------------\nstatic int OP_CMP_IMM8(const u32 i) \n{\n\tc.cmp(reg_pos_thumb(8), (i & 0xFF));\n\tSET_NZCV(1);\n\treturn 1; \n}\n\nstatic int OP_CMP(const u32 i) \n{\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_thumb(3));\n\tc.cmp(reg_pos_thumb(0), tmp);\n\tSET_NZCV(1);\n\treturn 1; \n}\n\nstatic int OP_CMP_SPE(const u32 i) \n{\n\tu32 Rn = (i&7) | ((i>>4)&8);\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_ptr(3));\n\tc.cmp(reg_ptr(Rn), tmp);\n\tSET_NZCV(1);\n\treturn 1; \n}\n\nstatic int OP_CMN(const u32 i) \n{\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_thumb(0));\n\tc.add(tmp, reg_pos_thumb(3));\n\tSET_NZCV(0);\n\treturn 1; \n}\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\nstatic int OP_TST(const u32 i)\n{\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(tmp, reg_pos_thumb(3));\n\tc.test(reg_pos_thumb(0), tmp);\n\tSET_NZ(0);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   STR / LDR / STRB / LDRB\n//-----------------------------------------------------------------------------\n#define STR_THUMB(mem_op, offset) \\\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar data = c.newGpVar(kX86VarTypeGpd); \\\n\tu32 adr_first = cpu->R[_REG_NUM(i, 3)]; \\\n\t \\\n\tc.mov(addr, reg_pos_thumb(3)); \\\n\tif ((offset) != -1) \\\n\t{ \\\n\t\tif ((offset) != 0) \\\n\t\t{ \\\n\t\t\tc.add(addr, (u32)(offset)); \\\n\t\t\tadr_first += (u32)(offset); \\\n\t\t} \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc.add(addr, reg_pos_thumb(6)); \\\n\t\tadr_first += cpu->R[_REG_NUM(i, 6)]; \\\n\t} \\\n\tc.mov(data, reg_pos_thumb(0)); \\\n\tX86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,1)]); \\\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2<Void, u32, u32>()); \\\n\tctx->setArgument(0, addr); \\\n\tctx->setArgument(1, data); \\\n\tctx->setReturn(bb_cycles); \\\n\treturn 1;\n\n#define LDR_THUMB(mem_op, offset) \\\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd); \\\n\tGpVar data = c.newGpVar(kX86VarTypeGpz); \\\n\tu32 adr_first = cpu->R[_REG_NUM(i, 3)]; \\\n\t \\\n\tc.mov(addr, reg_pos_thumb(3)); \\\n\tif ((offset) != -1) \\\n\t{ \\\n\t\tif ((offset) != 0) \\\n\t\t{ \\\n\t\t\tc.add(addr, (u32)(offset)); \\\n\t\t\tadr_first += (u32)(offset); \\\n\t\t} \\\n\t} \\\n\telse \\\n\t{ \\\n\t\tc.add(addr, reg_pos_thumb(6)); \\\n\t\tadr_first += cpu->R[_REG_NUM(i, 6)]; \\\n\t} \\\n\tc.lea(data, reg_pos_thumb(0)); \\\n\tX86CompilerFuncCall *ctx = c.call((void*)mem_op##_tab[PROCNUM][classify_adr(adr_first,0)]); \\\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2<Void, u32, u32*>()); \\\n\tctx->setArgument(0, addr); \\\n\tctx->setArgument(1, data); \\\n\tctx->setReturn(bb_cycles); \\\n\treturn 1;\n\nstatic int OP_STRB_IMM_OFF(const u32 i) { STR_THUMB(STRB, ((i>>6)&0x1F)); }\nstatic int OP_LDRB_IMM_OFF(const u32 i) { LDR_THUMB(LDRB, ((i>>6)&0x1F)); }\nstatic int OP_STRB_REG_OFF(const u32 i) { STR_THUMB(STRB, -1); } \nstatic int OP_LDRB_REG_OFF(const u32 i) { LDR_THUMB(LDRB, -1); }\nstatic int OP_LDRSB_REG_OFF(const u32 i) { LDR_THUMB(LDRSB, -1); }\n\nstatic int OP_STRH_IMM_OFF(const u32 i) { STR_THUMB(STRH, ((i>>5)&0x3E)); }\nstatic int OP_LDRH_IMM_OFF(const u32 i) { LDR_THUMB(LDRH, ((i>>5)&0x3E)); }\nstatic int OP_STRH_REG_OFF(const u32 i) { STR_THUMB(STRH, -1); }\nstatic int OP_LDRH_REG_OFF(const u32 i) { LDR_THUMB(LDRH, -1); }\nstatic int OP_LDRSH_REG_OFF(const u32 i) { LDR_THUMB(LDRSH, -1); } \n\nstatic int OP_STR_IMM_OFF(const u32 i) { STR_THUMB(STR, ((i>>4)&0x7C)); }\nstatic int OP_LDR_IMM_OFF(const u32 i) { LDR_THUMB(LDR, ((i>>4)&0x7C)); } // FIXME: tempValue = (tempValue>>adr) | (tempValue<<(32-adr));\nstatic int OP_STR_REG_OFF(const u32 i) { STR_THUMB(STR, -1); }\nstatic int OP_LDR_REG_OFF(const u32 i) { LDR_THUMB(LDR, -1); }\n\nstatic int OP_STR_SPREL(const u32 i)\n{\n\tu32 imm = ((i&0xFF)<<2);\n\tu32 adr_first = cpu->R[13] + imm;\n\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(addr, reg_ptr(13));\n\tif (imm) c.add(addr, imm);\n\tGpVar data = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(data, reg_pos_thumb(8));\n\tX86CompilerFuncCall *ctx = c.call((void*)STR_tab[PROCNUM][classify_adr(adr_first,1)]);\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2<Void, u32, u32>());\n\tctx->setArgument(0, addr);\n\tctx->setArgument(1, data);\n\tctx->setReturn(bb_cycles);\n\treturn 1;\n}\n\nstatic int OP_LDR_SPREL(const u32 i)\n{\n\tu32 imm = ((i&0xFF)<<2);\n\tu32 adr_first = cpu->R[13] + imm;\n\t\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(addr, reg_ptr(13));\n\tif (imm) c.add(addr, imm);\n\tGpVar data = c.newGpVar(kX86VarTypeGpz);\n\tc.lea(data, reg_pos_thumb(8));\n\tX86CompilerFuncCall *ctx = c.call((void*)LDR_tab[PROCNUM][classify_adr(adr_first,0)]);\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2<Void, u32, u32*>());\n\tctx->setArgument(0, addr);\n\tctx->setArgument(1, data);\n\tctx->setReturn(bb_cycles);\n\treturn 1;\n}\n\nstatic int OP_LDR_PCREL(const u32 i)\n{\n\tu32 imm = ((i&0xFF)<<2);\n\tu32 adr_first = (bb_r15 & 0xFFFFFFFC) + imm;\n\tGpVar addr = c.newGpVar(kX86VarTypeGpd);\n\tGpVar data = c.newGpVar(kX86VarTypeGpz);\n\tc.mov(addr, adr_first);\n\tc.lea(data, reg_pos_thumb(8));\n\tX86CompilerFuncCall *ctx = c.call((void*)LDR_tab[PROCNUM][classify_adr(adr_first,0)]);\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder2<Void, u32, u32*>());\n\tctx->setArgument(0, addr);\n\tctx->setArgument(1, data);\n\tctx->setReturn(bb_cycles);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   STMIA / LDMIA\n//-----------------------------------------------------------------------------\nstatic int op_ldm_stm_thumb(u32 i, bool store)\n{\n\tu32 bitmask = i & 0xFF;\n\tu32 pop = popcount(bitmask);\n\n\t//if (BIT_N(i, _REG_NUM(i, 8)))\n\t//\tprintf(\"WARNING - %sIA with Rb in Rlist (THUMB)\\n\", store?\"STM\":\"LDM\");\n\n\tGpVar adr = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(adr, reg_pos_thumb(8));\n\n\tcall_ldm_stm(adr, bitmask, store, 1);\n\n\t// ARM_REF:\tTHUMB: Causes base register write-back, and is not optional\n\t// ARM_REF:\tIf the base register <Rn> is specified in <registers>, the final value of <Rn> is the loaded value\n\t//\t\t\t(not the written-back value).\n\tif (store)\n\t\tc.add(reg_pos_thumb(8), 4*pop);\n\telse\n\t{\n\t\tif (!BIT_N(i, _REG_NUM(i, 8)))\n\t\t\tc.add(reg_pos_thumb(8), 4*pop);\n\t}\n\n\temit_MMU_aluMemCycles(store ? 2 : 3, bb_cycles, pop);\n\treturn 1;\n}\n\nstatic int OP_LDMIA_THUMB(const u32 i) { return op_ldm_stm_thumb(i, 0); }\nstatic int OP_STMIA_THUMB(const u32 i) { return op_ldm_stm_thumb(i, 1); }\n\n//-----------------------------------------------------------------------------\n//   Adjust SP\n//-----------------------------------------------------------------------------\nstatic int OP_ADJUST_P_SP(const u32 i) { c.add(reg_ptr(13), ((i&0x7F)<<2)); return 1; }\nstatic int OP_ADJUST_M_SP(const u32 i) { c.sub(reg_ptr(13), ((i&0x7F)<<2)); return 1; }\n\n//-----------------------------------------------------------------------------\n//   PUSH / POP\n//-----------------------------------------------------------------------------\nstatic int op_push_pop(u32 i, bool store, bool pc_lr)\n{\n\tu32 bitmask = (i & 0xFF);\n\tbitmask |= pc_lr << (store ? 14 : 15);\n\tu32 pop = popcount(bitmask);\n\tint dir = store ? -1 : 1;\n\n\tGpVar adr = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(adr, reg_ptr(13));\n\tif(store)\n\t\tc.sub(adr, 4);\n\n\tcall_ldm_stm(adr, bitmask, store, dir);\n\n\tif(pc_lr && !store)\n\t\top_bx_thumb(reg_ptr(15), 0, PROCNUM == ARMCPU_ARM9);\n\tc.add(reg_ptr(13), 4*dir*pop);\n\n\temit_MMU_aluMemCycles(store ? (pc_lr?4:3) : (pc_lr?5:2), bb_cycles, pop);\n\treturn 1;\n}\n\nstatic int OP_PUSH(const u32 i)    { return op_push_pop(i, 1, 0); }\nstatic int OP_PUSH_LR(const u32 i) { return op_push_pop(i, 1, 1); }\nstatic int OP_POP(const u32 i)     { return op_push_pop(i, 0, 0); }\nstatic int OP_POP_PC(const u32 i)  { return op_push_pop(i, 0, 1); }\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\nstatic int OP_B_COND(const u32 i)\n{\n\tLabel skip = c.newLabel();\n\n\tu32 dst = bb_r15 + ((u32)((s8)(i&0xFF))<<1);\n\n\tc.mov(cpu_ptr(instruct_adr), bb_next_instruction);\n\n\temit_branch((i>>8)&0xF, skip);\n\tc.mov(cpu_ptr(instruct_adr), dst);\n\tc.add(bb_total_cycles, 2);\n\tc.bind(skip);\t\n\n\treturn 1;\n}\n\nstatic int OP_B_UNCOND(const u32 i)\n{\n\tu32 dst = bb_r15 + (SIGNEXTEND_11(i)<<1);\n\tc.mov(cpu_ptr(instruct_adr), dst);\n\treturn 1;\n}\n\nstatic int OP_BLX(const u32 i)\n{\n\tGpVar dst = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(dst, reg_ptr(14));\n\tc.add(dst, (i&0x7FF) << 1);\n\tc.and_(dst, 0xFFFFFFFC);\n\tc.mov(cpu_ptr(instruct_adr), dst);\n\tc.mov(reg_ptr(14), bb_next_instruction | 1);\n\t// reset T bit\n\tc.and_(cpu_ptr_byte(CPSR, 0), ~(1<<5));\n\treturn 1;\n}\n\nstatic int OP_BL_10(const u32 i)\n{\n\tu32 dst = bb_r15 + (SIGNEXTEND_11(i)<<12);\n\tc.mov(reg_ptr(14), dst);\n\treturn 1;\n}\n\nstatic int OP_BL_11(const u32 i) \n{\n\tGpVar dst = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(dst, reg_ptr(14));\n\tc.add(dst, (i&0x7FF) << 1);\n\tc.mov(cpu_ptr(instruct_adr), dst);\n\tc.mov(reg_ptr(14), bb_next_instruction | 1);\n\treturn 1;\n}\n\nstatic int op_bx_thumb(Mem srcreg, bool blx, bool test_thumb)\n{\n\tGpVar dst = c.newGpVar(kX86VarTypeGpd);\n\tGpVar thumb = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(dst, srcreg);\n\tc.mov(thumb, dst);\t\t\t\t\t\t\t\t// * cpu->CPSR.bits.T = BIT0(Rm);\n\tc.and_(thumb, 1);\t\t\t\t\t\t\t\t// *\n\tif (blx)\n\t\tc.mov(reg_ptr(14), bb_next_instruction | 1);\n\tif(test_thumb)\n\t{\n\t\tGpVar mask = c.newGpVar(kX86VarTypeGpd);\n\t\tc.lea(mask, ptr_abs((void*)0xFFFFFFFC, thumb.r64(), kScale2Times));\n\t\tc.and_(dst, mask);\n\t}\n\telse\n\t\tc.and_(dst, 0xFFFFFFFE);\n\t\n\tGpVar tmp = c.newGpVar(kX86VarTypeGpd);\t\t\t// *\n\tc.mov(tmp, cpu_ptr_byte(CPSR, 0));\t\t\t\t// *\n\tc.and_(tmp, ~(1<< 5));\t\t\t\t\t\t\t// *\n\tc.shl(thumb, 5);\t\t\t\t\t\t\t\t// *\n\tc.or_(tmp, thumb);\t\t\t\t\t\t\t\t// *\n\tc.mov(cpu_ptr_byte(CPSR, 0), tmp.r8Lo());\t\t// ******************************\n\n\tc.mov(cpu_ptr(instruct_adr), dst);\n\treturn 1;\n}\n\nstatic int OP_BX_THUMB(const u32 i) { if (REG_POS(i, 3) == 15) c.mov(reg_ptr(15), bb_r15); return op_bx_thumb(reg_pos_ptr(3), 0, 0); }\nstatic int OP_BLX_THUMB(const u32 i) { return op_bx_thumb(reg_pos_ptr(3), 1, 1); }\n\nstatic int OP_SWI_THUMB(const u32 i) { return op_swi(i & 0x1F); }\n\n//-----------------------------------------------------------------------------\n//   Unimplemented; fall back to the C versions\n//-----------------------------------------------------------------------------\n\n#define OP_UND           NULL\n#define OP_LDREX         NULL\n#define OP_STREX         NULL\n#define OP_LDC_P_IMM_OFF NULL\n#define OP_LDC_M_IMM_OFF NULL\n#define OP_LDC_P_PREIND  NULL\n#define OP_LDC_M_PREIND  NULL\n#define OP_LDC_P_POSTIND NULL\n#define OP_LDC_M_POSTIND NULL\n#define OP_LDC_OPTION    NULL\n#define OP_STC_P_IMM_OFF NULL\n#define OP_STC_M_IMM_OFF NULL\n#define OP_STC_P_PREIND  NULL\n#define OP_STC_M_PREIND  NULL\n#define OP_STC_P_POSTIND NULL\n#define OP_STC_M_POSTIND NULL\n#define OP_STC_OPTION    NULL\n#define OP_CDP           NULL\n\n#define OP_UND_THUMB     NULL\n#define OP_BKPT_THUMB    NULL\n\n//-----------------------------------------------------------------------------\n//   Dispatch table\n//-----------------------------------------------------------------------------\n\ntypedef int (*ArmOpCompiler)(u32);\nstatic const ArmOpCompiler arm_instruction_compilers[4096] = {\n#define TABDECL(x) x\n#include \"instruction_tabdef.inc\"\n#undef TABDECL\n};\n\nstatic const ArmOpCompiler thumb_instruction_compilers[1024] = {\n#define TABDECL(x) x\n#include \"thumb_tabdef.inc\"\n#undef TABDECL\n};\n\n//-----------------------------------------------------------------------------\n//   Generic instruction wrapper\n//-----------------------------------------------------------------------------\n\ntemplate<int PROCNUM, int thumb>\nstatic u32 FASTCALL OP_DECODE()\n{\n\tu32 cycles;\n\tu32 adr = cpu->instruct_adr;\n\tif(thumb)\n\t{\n\t\tcpu->next_instruction = adr + 2;\n\t\tcpu->R[15] = adr + 4;\n\t\tu32 opcode = _MMU_read16<PROCNUM, MMU_AT_CODE>(adr);\n\t\t_armlog(PROCNUM, adr, opcode);\n\t\tcycles = thumb_instructions_set[PROCNUM][opcode>>6](opcode);\n\t}\n\telse\n\t{\n\t\tcpu->next_instruction = adr + 4;\n\t\tcpu->R[15] = adr + 8;\n\t\tu32 opcode = _MMU_read32<PROCNUM, MMU_AT_CODE>(adr);\n\t\t_armlog(PROCNUM, adr, opcode);\n\t\tif(CONDITION(opcode) == 0xE || TEST_COND(CONDITION(opcode), CODE(opcode), cpu->CPSR))\n\t\t\tcycles = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)](opcode);\n\t\telse\n\t\t\tcycles = 1;\n\t}\n\tcpu->instruct_adr = cpu->next_instruction;\n\treturn cycles;\n}\n\nstatic const ArmOpCompiled op_decode[2][2] = { OP_DECODE<0,0>, OP_DECODE<0,1>, OP_DECODE<1,0>, OP_DECODE<1,1> };\n\n//-----------------------------------------------------------------------------\n//   Compiler\n//-----------------------------------------------------------------------------\n\nstatic u32 instr_attributes(u32 opcode)\n{\n\treturn bb_thumb ? thumb_attributes[opcode>>6]\n\t\t : instruction_attributes[INSTRUCTION_INDEX(opcode)];\n}\n\nstatic bool instr_is_branch(u32 opcode)\n{\n\tu32 x = instr_attributes(opcode);\n\tif(bb_thumb)\n\t\treturn (x & BRANCH_ALWAYS)\n\t\t    || ((x & BRANCH_POS0) && ((opcode&7) | ((opcode>>4)&8)) == 15)\n\t\t\t|| (x & BRANCH_SWI)\n\t\t    || (x & JIT_BYPASS);\n\telse\n\t\treturn (x & BRANCH_ALWAYS)\n\t\t    || ((x & BRANCH_POS12) && REG_POS(opcode,12) == 15)\n\t\t    || ((x & BRANCH_LDM) && BIT15(opcode))\n\t\t\t|| (x & BRANCH_SWI)\n\t\t    || (x & JIT_BYPASS);\n}\n\nstatic bool instr_uses_r15(u32 opcode)\n{\n\tu32 x = instr_attributes(opcode);\n\tif(bb_thumb)\n\t\treturn ((x & SRCREG_POS0) && ((opcode&7) | ((opcode>>4)&8)) == 15)\n\t\t\t|| ((x & SRCREG_POS3) && REG_POS(opcode,3) == 15)\n\t\t\t|| (x & JIT_BYPASS);\n\telse\n\t\treturn ((x & SRCREG_POS0) && REG_POS(opcode,0) == 15)\n\t\t    || ((x & SRCREG_POS8) && REG_POS(opcode,8) == 15)\n\t\t    || ((x & SRCREG_POS12) && REG_POS(opcode,12) == 15)\n\t\t    || ((x & SRCREG_POS16) && REG_POS(opcode,16) == 15)\n\t\t    || ((x & SRCREG_STM) && BIT15(opcode))\n\t\t    || (x & JIT_BYPASS);\n}\n\nstatic bool instr_is_conditional(u32 opcode)\n{\n\tif(bb_thumb) return false;\n\t\n\treturn !(CONDITION(opcode) == 0xE\n\t         || (CONDITION(opcode) == 0xF && CODE(opcode) == 5));\n}\n\nstatic int instr_cycles(u32 opcode)\n{\n\tu32 x = instr_attributes(opcode);\n\tu32 c = (x & INSTR_CYCLES_MASK);\n\tif(c == INSTR_CYCLES_VARIABLE)\n\t{\n\t\tif ((x & BRANCH_SWI) && !cpu->swi_tab)\n\t\t\treturn 3;\n\t\t\n\t\treturn 0;\n\t}\n\tif(instr_is_branch(opcode) && !(instr_attributes(opcode) & (BRANCH_ALWAYS|BRANCH_LDM)))\n\t\tc += 2;\n\treturn c;\n}\n\nstatic bool instr_does_prefetch(u32 opcode)\n{\n\tu32 x = instr_attributes(opcode);\n\tif(bb_thumb)\n\t\treturn thumb_instruction_compilers[opcode>>6]\n\t\t\t   && (x & BRANCH_ALWAYS);\n\telse\n\t\treturn instr_is_branch(opcode) && arm_instruction_compilers[INSTRUCTION_INDEX(opcode)]\n\t\t\t   && ((x & BRANCH_ALWAYS) || (x & BRANCH_LDM));\n}\n\nstatic const char *disassemble(u32 opcode)\n{\n\tif(bb_thumb)\n\t\treturn thumb_instruction_names[opcode>>6];\n\tstatic char str[100];\n\tstrcpy(str, arm_instruction_names[INSTRUCTION_INDEX(opcode)]);\n\tstatic const char *conds[16] = {\"EQ\",\"NE\",\"CS\",\"CC\",\"MI\",\"PL\",\"VS\",\"VC\",\"HI\",\"LS\",\"GE\",\"LT\",\"GT\",\"LE\",\"AL\",\"NV\"};\n\tif(instr_is_conditional(opcode))\n\t{\n\t\tstrcat(str, \".\");\n\t\tstrcat(str, conds[CONDITION(opcode)]);\n\t}\n\treturn str;\n}\n\nstatic void sync_r15(u32 opcode, bool is_last, bool force)\n{\n\tif(instr_does_prefetch(opcode))\n\t{\n\t\tassert(!instr_uses_r15(opcode));\n\t\tif(force)\n\t\t{\n\t\t\tJIT_COMMENT(\"sync_r15: force instruct_adr %08Xh (PREFETCH)\", bb_adr);\n\t\t\tc.mov(cpu_ptr(instruct_adr), bb_next_instruction);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(force || (instr_attributes(opcode) & JIT_BYPASS) || (instr_attributes(opcode) & BRANCH_SWI) || (is_last && !instr_is_branch(opcode)))\n\t\t{\n\t\t\tJIT_COMMENT(\"sync_r15: next_instruction %08Xh - %s%s%s%s\", bb_next_instruction,\n\t\t\t\tforce?\" FORCE\":\"\",\n\t\t\t\t(instr_attributes(opcode) & JIT_BYPASS)?\" BYPASS\":\"\",\n\t\t\t\t(instr_attributes(opcode) & BRANCH_SWI)?\" SWI\":\"\",\n\t\t\t\t(is_last && !instr_is_branch(opcode))?\" LAST\":\"\"\n\t\t\t);\n\t\t\tc.mov(cpu_ptr(next_instruction), bb_next_instruction);\n\t\t}\n\t\tif(instr_uses_r15(opcode))\n\t\t{\n\t\t\tJIT_COMMENT(\"sync_r15: R15 %08Xh (USES R15)\", bb_r15);\n\t\t\tc.mov(reg_ptr(15), bb_r15);\n\t\t}\n\t\tif(instr_attributes(opcode) & JIT_BYPASS)\n\t\t{\n\t\t\tJIT_COMMENT(\"sync_r15: instruct_adr %08Xh (JIT_BYPASS)\", bb_adr);\n\t\t\tc.mov(cpu_ptr(instruct_adr), bb_adr);\n\t\t}\n\t}\n}\n\nstatic void emit_branch(int cond, Label to)\n{\n\tJIT_COMMENT(\"emit_branch cond %02X\", cond);\n\tstatic const u8 cond_bit[] = {0x40, 0x40, 0x20, 0x20, 0x80, 0x80, 0x10, 0x10};\n\tif(cond < 8)\n\t{\n\t\tc.test(flags_ptr, cond_bit[cond]);\n\t\t(cond & 1)?c.jnz(to):c.jz(to);\n\t}\n\telse\n\t{\n\t\tGpVar x = c.newGpVar(kX86VarTypeGpz);\n\t\tc.movzx(x, flags_ptr);\n\t\tc.and_(x, 0xF0);\n#if defined(_M_X64) || defined(__x86_64__)\n\t\tc.add(x, offsetof(armcpu_t,cond_table) + cond);\n\t\tc.test(byte_ptr(bb_cpu, x), 1);\n#else\n\t\tc.test(byte_ptr_abs((void*)(arm_cond_table + cond), x, kScaleNone), 1);\n#endif\n\t\tc.unuse(x);\n\t\tc.jz(to);\n\t}\n}\n\nstatic void emit_armop_call(u32 opcode)\n{\n\tArmOpCompiler fc = bb_thumb?\tthumb_instruction_compilers[opcode>>6]:\n\t\t\t\t\t\t\t\t\tarm_instruction_compilers[INSTRUCTION_INDEX(opcode)];\n\tif (fc && fc(opcode)) \n\t\treturn;\n\n\tJIT_COMMENT(\"call interpreter\");\n\tGpVar arg = c.newGpVar(kX86VarTypeGpd);\n\tc.mov(arg, opcode);\n\tOpFunc f = bb_thumb ? thumb_instructions_set[PROCNUM][opcode>>6]\n\t                     : arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(opcode)];\n\tX86CompilerFuncCall* ctx = c.call((void*)f);\n\tctx->setPrototype(ASMJIT_CALL_CONV, FuncBuilder1<u32, u32>());\n\tctx->setArgument(0, arg);\n\tctx->setReturn(bb_cycles);\n}\n\nstatic void _armlog(u8 proc, u32 addr, u32 opcode)\n{\n#if 0\n#if 0\n\tfprintf(stderr, \"\\t\\t;R0:%08X R1:%08X R2:%08X R3:%08X R4:%08X R5:%08X R6:%08X R7:%08X R8:%08X R9:%08X\\n\\t\\t;R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X| next %08X, N:%i Z:%i C:%i V:%i\\n\",\n\t\tcpu->R[0],  cpu->R[1],  cpu->R[2],  cpu->R[3],  cpu->R[4],  cpu->R[5],  cpu->R[6],  cpu->R[7], \n\t\tcpu->R[8],  cpu->R[9],  cpu->R[10],  cpu->R[11],  cpu->R[12],  cpu->R[13],  cpu->R[14],  cpu->R[15],\n\t\tcpu->next_instruction, cpu->CPSR.bits.N, cpu->CPSR.bits.Z, cpu->CPSR.bits.C, cpu->CPSR.bits.V);\n#endif\n\t#define INDEX22(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF))\n\tchar dasmbuf[4096];\n\tif(cpu->CPSR.bits.T)\n\t\tdes_thumb_instructions_set[((opcode)>>6)&1023](addr, opcode, dasmbuf);\n\telse\n\t\tdes_arm_instructions_set[INDEX22(opcode)](addr, opcode, dasmbuf);\n\t#undef INDEX22\n\tfprintf(stderr, \"%s%c %08X\\t%08X \\t%s\\n\", cpu->CPSR.bits.T?\"THUMB\":\"ARM\", proc?'7':'9', addr, opcode, dasmbuf); \n#else\n\treturn;\n#endif\n}\n\ntemplate<int PROCNUM>\nstatic u32 compile_basicblock()\n{\n#if LOG_JIT\n\tbool has_variable_cycles = FALSE;\n#endif\n\tu32 interpreted_cycles = 0;\n\tu32 start_adr = cpu->instruct_adr;\n\tu32 opcode = 0;\n\t\n\tbb_thumb = cpu->CPSR.bits.T;\n\tbb_opcodesize = bb_thumb ? 2 : 4;\n\n\tif (!JITLUT_MAPPED(start_adr & 0x0FFFFFFF, PROCNUM))\n\t{\n\t\tprintf(\"JIT: use unmapped memory address %08X\\n\", start_adr);\n\t\texecute = false;\n\t\treturn 1;\n\t}\n\n#if LOG_JIT\n\tfprintf(stderr, \"adr %08Xh %s%c\\n\", start_adr, ARMPROC.CPSR.bits.T ? \"THUMB\":\"ARM\", PROCNUM?'7':'9');\n#endif\n\n\tc.clear();\n\tc.newFunc(ASMJIT_CALL_CONV, FuncBuilder0<int>());\n\tc.getFunc()->setHint(kFuncHintNaked, true);\n\tc.getFunc()->setHint(kX86FuncHintPushPop, true);\n\t\n\tJIT_COMMENT(\"CPU ptr\");\n\tbb_cpu = c.newGpVar(kX86VarTypeGpz);\n\tc.mov(bb_cpu, (uintptr_t)&ARMPROC);\n\n\tJIT_COMMENT(\"reset bb_total_cycles\");\n\tbb_total_cycles = c.newGpVar(kX86VarTypeGpz);\n\tc.mov(bb_total_cycles, 0);\n\n#if (PROFILER_JIT_LEVEL > 0)\n\tJIT_COMMENT(\"Profiler ptr\");\n\tbb_profiler = c.newGpVar(kX86VarTypeGpz);\n\tc.mov(bb_profiler, (uintptr_t)&profiler_counter[PROCNUM]);\n#endif\n\n\tbb_constant_cycles = 0;\n\tfor(u32 i=0, bEndBlock = 0; bEndBlock == 0; i++)\n\t{\n\t\tbb_adr = start_adr + (i * bb_opcodesize);\n\t\tif(bb_thumb)\n\t\t\topcode = _MMU_read16<PROCNUM, MMU_AT_CODE>(bb_adr);\n\t\telse\n\t\t\topcode = _MMU_read32<PROCNUM, MMU_AT_CODE>(bb_adr);\n\n#if LOG_JIT\n\t\tchar dasmbuf[1024] = {0};\n\t\tif(bb_thumb)\n\t\t\tdes_thumb_instructions_set[opcode>>6](bb_adr, opcode, dasmbuf);\n\t\telse\n\t\t\tdes_arm_instructions_set[INSTRUCTION_INDEX(opcode)](bb_adr, opcode, dasmbuf);\n\t\tfprintf(stderr, \"%08X\\t%s\\t\\t; %s \\n\", bb_adr, dasmbuf, disassemble(opcode));\n#endif\n\n\t\tu32 cycles = instr_cycles(opcode);\n\n\t\tbEndBlock = (i >= (CommonSettings.jit_max_block_size - 1)) || instr_is_branch(opcode);\n\t\t\n#if LOG_JIT\n\t\tif (instr_is_conditional(opcode) && (cycles > 1) || (cycles == 0))\n\t\t\thas_variable_cycles = TRUE;\n#endif\n\t\tbb_cycles = c.newGpVar(kX86VarTypeGpz);\n\n\t\tbb_constant_cycles += instr_is_conditional(opcode) ? 1 : cycles;\n\n\t\tJIT_COMMENT(\"%s (PC:%08X)\", disassemble(opcode), bb_adr);\n\n#if (PROFILER_JIT_LEVEL > 0)\n\t\tJIT_COMMENT(\"*** profiler - counter\");\n\t\tif (bb_thumb)\n\t\t\tc.add(profiler_counter_thumb(opcode), 1);\n\t\telse\n\t\t\tc.add(profiler_counter_arm(opcode), 1);\n#endif\n\t\tif(instr_is_conditional(opcode))\n\t\t{\n\t\t\t// 25% of conditional instructions are immediately followed by\n\t\t\t// another with the same condition, but merging them into a\n\t\t\t// single branch has negligible effect on speed.\n\t\t\tif(bEndBlock) sync_r15(opcode, 1, 1);\n\t\t\tLabel skip = c.newLabel();\n\t\t\temit_branch(CONDITION(opcode), skip);\n\t\t\tif(!bEndBlock) sync_r15(opcode, 0, 0);\n\t\t\temit_armop_call(opcode);\n\t\t\t\n\t\t\tif(cycles == 0)\n\t\t\t{\n\t\t\t\tJIT_COMMENT(\"variable cycles\");\n\t\t\t\tc.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), bb_cycles.r64(), kScaleNone, -1));\n\t\t\t}\n\t\t\telse\n\t\t\t\tif (cycles > 1)\n\t\t\t\t{\n\t\t\t\t\tJIT_COMMENT(\"cycles (%d)\", cycles);\n\t\t\t\t\tc.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), -1));\n\t\t\t\t}\n\t\t\tc.bind(skip);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsync_r15(opcode, bEndBlock, 0);\n\t\t\temit_armop_call(opcode);\n\t\t\tif(cycles == 0)\n\t\t\t{\n\t\t\t\tJIT_COMMENT(\"variable cycles\");\n\t\t\t\tc.lea(bb_total_cycles, ptr(bb_total_cycles.r64(), bb_cycles.r64(), kScaleNone));\n\t\t\t}\n\t\t}\n\t\tinterpreted_cycles += op_decode[PROCNUM][bb_thumb]();\n\t}\n\t\n\tif(!instr_does_prefetch(opcode))\n\t{\n\t\tJIT_COMMENT(\"!instr_does_prefetch: copy next_instruction (%08X) to instruct_adr (%08X)\", cpu->next_instruction, cpu->instruct_adr);\n\t\tGpVar x = c.newGpVar(kX86VarTypeGpd);\n\t\tc.mov(x, cpu_ptr(next_instruction));\n\t\tc.mov(cpu_ptr(instruct_adr), x);\n\t\tc.unuse(x);\n\t\t//c.mov(cpu_ptr(instruct_adr), bb_adr);\n\t\t//c.mov(cpu_ptr(instruct_adr), bb_next_instruction);\n\t}\n\n\tJIT_COMMENT(\"total cycles (block)\");\n\n\tif (bb_constant_cycles > 0)\n\t\tc.add(bb_total_cycles, bb_constant_cycles);\n\n#if (PROFILER_JIT_LEVEL > 1)\n\tJIT_COMMENT(\"*** profiler - cycles\");\n\tu32 padr = ((start_adr & 0x07FFFFFE) >> 1);\n\tbb_profiler_entry = c.newGpVar(kX86VarTypeGpz);\n\tc.mov(bb_profiler_entry, (uintptr_t)&profiler_entry[PROCNUM][padr]);\n\tc.add(dword_ptr(bb_profiler_entry, offsetof(PROFILER_ENTRY, cycles)), bb_total_cycles);\n\tprofiler_entry[PROCNUM][padr].addr = start_adr;\n#endif\n\n\tc.ret(bb_total_cycles);\n#if LOG_JIT\n\tfprintf(stderr, \"cycles %d%s\\n\", bb_constant_cycles, has_variable_cycles ? \" + variable\" : \"\");\n#endif\n\tc.endFunc();\n\n\tArmOpCompiled f = (ArmOpCompiled)c.make();\n\tif(c.getError())\n\t{\n\t\tfprintf(stderr, \"JIT error at %s%c-%08X: %s\\n\", bb_thumb?\"THUMB\":\"ARM\", PROCNUM?'7':'9', start_adr, getErrorString(c.getError()));\n\t\tf = op_decode[PROCNUM][bb_thumb];\n\t}\n#if LOG_JIT\n\tuintptr_t baddr = (uintptr_t)f;\n\tfprintf(stderr, \"Block address %08lX\\n\\n\", baddr);\n\tfflush(stderr);\n#endif\n\t\n\tJITLUT_HANDLE(start_adr, PROCNUM) = (uintptr_t)f;\n\treturn interpreted_cycles;\n}\n\ntemplate<int PROCNUM> u32 arm_jit_compile()\n{\n\t*PROCNUM_ptr = PROCNUM;\n\n\t// prevent endless recompilation of self-modifying code, which would be a memleak since we only free code all at once.\n\t// also allows us to clear compiled_funcs[] while leaving it sparsely allocated, if the OS does memory overcommit.\n\t//u32 adr = cpu->instruct_adr;\n\t//if (!JitBlockModify(adr))\n\t//{\n\t//\t//printf(\"hot modify %x %d !!!.\\n\", adr, PROCNUM);\n\n\t//\tArmOpCompiled f = op_decode[PROCNUM][cpu->CPSR.bits.T];\n\t//\tJITLUT_HANDLE(adr, PROCNUM) = (uintptr_t)f;\n\t//\treturn f();\n\t//}\n\n\treturn compile_basicblock<PROCNUM>();\n}\n\ntemplate u32 arm_jit_compile<0>();\ntemplate u32 arm_jit_compile<1>();\n\nvoid arm_jit_reset()\n{\n#if LOG_JIT\n\tc.setLogger(&logger);\n#ifdef _WINDOWS\n\tfreopen(\"\\\\desmume_jit.log\", \"w\", stderr);\n#endif\n#endif\n#ifdef HAVE_STATIC_CODE_BUFFER\n\tscratchptr = scratchpad;\n#endif\n\n\tJitLutReset();\n\tprintf(\"JIT: max block size %d instruction(s)\\n\", CommonSettings.jit_max_block_size);\n\n\tc.clear();\n\n#if (PROFILER_JIT_LEVEL > 0)\n\treconstruct(&profiler_counter[0]);\n\treconstruct(&profiler_counter[1]);\n#if (PROFILER_JIT_LEVEL > 1)\n\tfor (u8 t = 0; t < 2; t++)\n\t{\n\t\tfor (u32 i = 0; i < (1<<26); i++)\n\t\t\tmemset(&profiler_entry[t][i], 0, sizeof(PROFILER_ENTRY));\n\t}\n#endif\n#endif\n}\n\n#if (PROFILER_JIT_LEVEL > 0)\nstatic int pcmp(PROFILER_COUNTER_INFO *info1, PROFILER_COUNTER_INFO *info2)\n{\n\treturn (int)(info2->count - info1->count);\n}\n\n#if (PROFILER_JIT_LEVEL > 1)\nstatic int pcmp_entry(PROFILER_ENTRY *info1, PROFILER_ENTRY *info2)\n{\n\treturn (int)(info1->cycles - info2->cycles);\n}\n#endif\n#endif\n\nvoid arm_jit_close()\n{\n#if (PROFILER_JIT_LEVEL > 0)\n\tprintf(\"Generating profile report...\");\n\n\tfor (u8 proc = 0; proc < 2; proc++)\n\t{\n\t\textern GameInfo gameInfo;\n\t\tu16 last[2] = {0};\n\t\tPROFILER_COUNTER_INFO *arm_info = NULL;\n\t\tPROFILER_COUNTER_INFO *thumb_info = NULL;\n\t\t\n\t\tarm_info = new PROFILER_COUNTER_INFO[4096];\n\t\tthumb_info = new PROFILER_COUNTER_INFO[1024];\n\t\tmemset(arm_info, 0, sizeof(PROFILER_COUNTER_INFO) * 4096);\n\t\tmemset(thumb_info, 0, sizeof(PROFILER_COUNTER_INFO) * 1024);\n\n\t\t// ARM\n\t\tlast[0] = 0;\n\t\tfor (u16 i=0; i < 4096; i++)\n\t\t{\n\t\t\tu16 t = 0;\n\t\t\tif (profiler_counter[proc].arm_count[i] == 0) continue;\n\n\t\t\tfor (t = 0; t < last[0]; t++)\n\t\t\t{\n\t\t\t\tif (strcmp(arm_instruction_names[i], arm_info[t].name) == 0)\n\t\t\t\t{\n\t\t\t\t\tarm_info[t].count += profiler_counter[proc].arm_count[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t == last[0])\n\t\t\t{\n\t\t\t\tstrcpy(arm_info[last[0]++].name, arm_instruction_names[i]);\n\t\t\t\tarm_info[t].count = profiler_counter[proc].arm_count[i];\n\t\t\t}\n\t\t}\n\n\t\t// THUMB\n\t\tlast[1] = 0;\n\t\tfor (u16 i=0; i < 1024; i++)\n\t\t{\n\t\t\tu16 t = 0;\n\t\t\tif (profiler_counter[proc].thumb_count[i] == 0) continue;\n\n\t\t\tfor (t = 0; t < last[1]; t++)\n\t\t\t{\n\t\t\t\tif (strcmp(thumb_instruction_names[i], thumb_info[t].name) == 0)\n\t\t\t\t{\n\t\t\t\t\tthumb_info[t].count += profiler_counter[proc].thumb_count[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t == last[1])\n\t\t\t{\n\t\t\t\tstrcpy(thumb_info[last[1]++].name, thumb_instruction_names[i]);\n\t\t\t\tthumb_info[t].count = profiler_counter[proc].thumb_count[i];\n\t\t\t}\n\t\t}\n\n\t\tstd::qsort(arm_info, last[0], sizeof(PROFILER_COUNTER_INFO), (int (*)(const void *, const void *))pcmp);\n\t\tstd::qsort(thumb_info, last[1], sizeof(PROFILER_COUNTER_INFO), (int (*)(const void *, const void *))pcmp);\n\n\t\tchar buf[MAX_PATH] = {0};\n\t\tsprintf(buf, \"\\\\desmume_jit%c_counter.profiler\", proc==0?'9':'7');\n\t\tFILE *fp = fopen(buf, \"w\");\n\t\tif (fp)\n\t\t{\n\t\t\tif (!gameInfo.isHomebrew)\n\t\t\t{\n\t\t\t\tfprintf(fp, \"Name:   %s\\n\", gameInfo.ROMname);\n\t\t\t\tfprintf(fp, \"Serial: %s\\n\", gameInfo.ROMserial);\n\t\t\t}\n\t\t\telse\n\t\t\t\tfprintf(fp, \"Homebrew\\n\");\n\t\t\tfprintf(fp, \"CPU: ARM%c\\n\\n\", proc==0?'9':'7');\n\n\t\t\tif (last[0])\n\t\t\t{\n\t\t\t\tfprintf(fp, \"========================================== ARM ==========================================\\n\");\n\t\t\t\tfor (int i=0; i < last[0]; i++)\n\t\t\t\t\tfprintf(fp, \"%30s: %20ld\\n\", arm_info[i].name, arm_info[i].count);\n\t\t\t\tfprintf(fp, \"\\n\");\n\t\t\t}\n\t\t\t\n\t\t\tif (last[1])\n\t\t\t{\n\t\t\t\tfprintf(fp, \"========================================== THUMB ==========================================\\n\");\n\t\t\t\tfor (int i=0; i < last[1]; i++)\n\t\t\t\t\tfprintf(fp, \"%30s: %20ld\\n\", thumb_info[i].name, thumb_info[i].count);\n\t\t\t\tfprintf(fp, \"\\n\");\n\t\t\t}\n\n\t\t\tfclose(fp);\n\t\t}\n\n\t\tdelete [] arm_info; arm_info = NULL;\n\t\tdelete [] thumb_info; thumb_info = NULL;\n\n#if (PROFILER_JIT_LEVEL > 1)\n\t\tsprintf(buf, \"\\\\desmume_jit%c_entry.profiler\", proc==0?'9':'7');\n\t\tfp = fopen(buf, \"w\");\n\t\tif (fp)\n\t\t{\n\t\t\tu32 count = 0;\n\t\t\tPROFILER_ENTRY *tmp = NULL;\n\n\t\t\tfprintf(fp, \"Entrypoints (cycles):\\n\");\n\t\t\ttmp = new PROFILER_ENTRY[1<<26];\n\t\t\tmemset(tmp, 0, sizeof(PROFILER_ENTRY) * (1<<26));\n\t\t\tfor (u32 i = 0; i < (1<<26); i++)\n\t\t\t{\n\t\t\t\tif (profiler_entry[proc][i].cycles == 0) continue;\n\t\t\t\tmemcpy(&tmp[count++], &profiler_entry[proc][i], sizeof(PROFILER_ENTRY));\n\t\t\t}\n\t\t\tstd::qsort(tmp, count, sizeof(PROFILER_ENTRY), (int (*)(const void *, const void *))pcmp_entry);\n\t\t\tif (!gameInfo.isHomebrew)\n\t\t\t{\n\t\t\t\tfprintf(fp, \"Name:   %s\\n\", gameInfo.ROMname);\n\t\t\t\tfprintf(fp, \"Serial: %s\\n\", gameInfo.ROMserial);\n\t\t\t}\n\t\t\telse\n\t\t\t\tfprintf(fp, \"Homebrew\\n\");\n\t\t\tfprintf(fp, \"CPU: ARM%c\\n\\n\", proc==0?'9':'7');\n\n\t\t\twhile ((count--) > 0)\n\t\t\t\tfprintf(fp, \"%08X: %20ld\\n\", tmp[count].addr, tmp[count].cycles);\n\n\t\t\tdelete [] tmp; tmp = NULL;\n\n\t\t\tfclose(fp);\n\t\t}\n#endif\n\t}\n\tprintf(\" done.\\n\");\n#endif\n}\n\n////////////////////////////////////////////////////////////////////\nstatic void cpuReserve()\n{\n}\n\nstatic void cpuShutdown()\n{\n\tarm_jit_close();\n}\n\nstatic void cpuReset()\n{\n\tarm_jit_reset();\n}\n\nstatic void cpuSync()\n{\n\tarmcpu_sync();\n}\n\ntemplate<int PROCNUM>\nstatic void cpuClear(u32 Addr, u32 Size)\n{\n\tif (Addr == 0 && Size == CPUBASE_FLUSHALL)\n\t{\n\t\tJitLutReset();\n\t}\n\telse\n\t{\n\t\tSize /= 2;\n\t\tfor (u32 i = 0; i < Size; i++)\n\t\t{\n\t\t\tconst u32 adr = Addr + i*2;\n\n\t\t\tif (JITLUT_MAPPED(adr, PROCNUM))\n\t\t\t\tJITLUT_HANDLE(adr, PROCNUM) = (uintptr_t)NULL;\n\t\t}\n\t}\n}\n\ntemplate<int PROCNUM>\nstatic u32 cpuExecute()\n{\n\tArmOpCompiled f = (ArmOpCompiled)JITLUT_HANDLE(ARMPROC.instruct_adr, PROCNUM);\n\treturn f ? f() : arm_jit_compile<PROCNUM>();\n}\n\nstatic u32 cpuGetCacheReserve()\n{\n\treturn (u32)-1;\n}\n\nstatic void cpuSetCacheReserve(u32 reserveInMegs)\n{\n}\n\nstatic const char* cpuDescription()\n{\n\treturn \"Arm Old Jit\";\n}\n\nCpuBase arm_oldjit = \n{\n\tcpuReserve,\n\n\tcpuShutdown,\n\n\tcpuReset,\n\n\tcpuSync,\n\n\tcpuClear<0>, cpuClear<1>,\n\n\tcpuExecute<0>, cpuExecute<1>,\n\n\tcpuGetCacheReserve,\n\tcpuSetCacheReserve,\n\n\tcpuDescription\n};\n\n#endif // HAVE_JIT\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/arm_jit.h",
    "content": "/*\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2011 Loren Merritt\n\tCopyright (C) 2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 3 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ARM_OLDJIT\n#define ARM_OLDJIT\n\n#include \"types.h\"\n#include \"CpuBase.h\"\n\nextern CpuBase arm_oldjit;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/armcpu.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2009-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <assert.h>\n#include <algorithm>\n#include \"types.h\"\n#include \"instructions.h\"\n#include \"cp15.h\"\n#include \"bios.h\"\n#include \"debug.h\"\n#include \"Disassembler.h\"\n#include \"NDSSystem.h\"\n#include \"MMU_timing.h\"\n#include \"armcpu_exec_inline.h\"\n#ifdef HAVE_LUA\n#include \"lua-engine.h\"\n#endif\n\n#ifdef HAVE_JIT\n#include \"arm_jit.h\"\n#include \"ArmThreadedInterpreter.h\"\n#include \"ArmLJit.h\"\n#endif\n\n#ifdef USE_EXOPHASEJIT\n#include \"dynarec/dynarec_linker.h\"\nu32 is_exophasejit = false;\n#endif\n\ntemplate<u32> static void armcpu_prefetch();\n\nFORCEINLINE void armcpu_prefetch(armcpu_t *armcpu) { \n\tif(armcpu->proc_ID==0) armcpu_prefetch<0>();\n\telse armcpu_prefetch<1>();\n}\n\nCACHE_ALIGN armcpu_t NDS_ARM7;\nCACHE_ALIGN armcpu_t NDS_ARM9;\n\n#define SWAP(a, b, c) do      \\\n\t              {       \\\n                         c=a; \\\n                         a=b; \\\n                         b=c; \\\n\t\t      }       \\\n                      while(0)\n\n#ifdef GDB_STUB\n\n#define STALLED_CYCLE_COUNT 10\n\nstatic void\nstall_cpu( void *instance) {\n  armcpu_t *armcpu = (armcpu_t *)instance;\n  printf(\"UNSTALL\\n\");\n  armcpu->stalled = 1;\n}\n                      \nstatic void\nunstall_cpu( void *instance) {\n  armcpu_t *armcpu = (armcpu_t *)instance;\n  printf(\"UNSTALL\\n\");\n  armcpu->stalled = 0;\n}\n\nstatic void\ninstall_post_exec_fn( void *instance,\n                      void (*ex_fn)( void *, u32 adr, int thumb),\n                      void *fn_data) {\n  armcpu_t *armcpu = (armcpu_t *)instance;\n\n  armcpu->post_ex_fn = ex_fn;\n  armcpu->post_ex_fn_data = fn_data;\n}\n\nstatic void\nremove_post_exec_fn( void *instance) {\n  armcpu_t *armcpu = (armcpu_t *)instance;\n\n  armcpu->post_ex_fn = NULL;\n}\n#endif\n\n#ifdef GDB_STUB\nstatic u32 read_cpu_reg( void *instance, u32 reg_num)\n{\n\tarmcpu_t *armcpu = (armcpu_t *)instance;\n\n\tif ( reg_num <= 14) {\n\t  return armcpu->R[reg_num];\n\t}\n\telse if ( reg_num == 15) {\n\t  return armcpu->instruct_adr;\n\t}\n\telse if ( reg_num == 16) {\n\t  //CPSR\n\t  return armcpu->CPSR.val;\n\t}\n}\n\nstatic void\nset_cpu_reg( void *instance, u32 reg_num, u32 value) {\n  armcpu_t *armcpu = (armcpu_t *)instance;\n\n  if ( reg_num <= 14) {\n    armcpu->R[reg_num] = value;\n  }\n  else if ( reg_num == 15) {\n    armcpu->next_instruction = value;\n  }\n  else if ( reg_num == 16) {\n    /* FIXME: setting the CPSR */\n  }\n}\n#endif\n\n#ifdef GDB_STUB\nint armcpu_new( armcpu_t *armcpu, u32 id,\n                struct armcpu_memory_iface *mem_if,\n                struct armcpu_ctrl_iface **ctrl_iface_ret)\n#else\nint armcpu_new( armcpu_t *armcpu, u32 id)\n#endif\n{\n\tarmcpu->proc_ID = id;\n\n#ifdef GDB_STUB\n\tarmcpu->mem_if = mem_if;\n\n\t/* populate the control interface */\n\tarmcpu->ctrl_iface.stall = stall_cpu;\n\tarmcpu->ctrl_iface.unstall = unstall_cpu;\n\tarmcpu->ctrl_iface.read_reg = read_cpu_reg;\n\tarmcpu->ctrl_iface.set_reg = set_cpu_reg;\n\tarmcpu->ctrl_iface.install_post_ex_fn = install_post_exec_fn;\n\tarmcpu->ctrl_iface.remove_post_ex_fn = remove_post_exec_fn;\n\tarmcpu->ctrl_iface.data = armcpu;\n\n\t*ctrl_iface_ret = &armcpu->ctrl_iface;\n\n\tarmcpu->post_ex_fn = NULL;\n#endif\n\n\tarmcpu->stalled = 0;\n\n\tarmcpu_init(armcpu, 0);\n\n\treturn 0;\n} \n\n//call this whenever CPSR is changed (other than CNVZQ or T flags); interrupts may need to be unleashed\nvoid armcpu_t::changeCPSR()\n{\n\t//but all it does is give them a chance to unleash by forcing an immediate reschedule\n\t//TODO - we could actually set CPSR through here and look for a change in the I bit\n\t//that would be a little optimization as well as a safety measure if we prevented setting CPSR directly\n\tNDS_Reschedule();\n}\n\nvoid armcpu_init(armcpu_t *armcpu, u32 adr)\n{\n#if defined(_M_X64) || defined(__x86_64__)\n\tmemcpy(&armcpu->cond_table[0], &arm_cond_table[0], sizeof(arm_cond_table));\n#endif\n\t\n\tarmcpu->LDTBit = (armcpu->proc_ID==0); //Si ARM9 utiliser le syte v5 pour le load\n\tarmcpu->intVector = 0xFFFF0000 * (armcpu->proc_ID==0);\n\tarmcpu->waitIRQ = FALSE;\n\tarmcpu->halt_IE_and_IF = FALSE;\n\tarmcpu->intrWaitARM_state = 0;\n\n//#ifdef GDB_STUB\n//    armcpu->irq_flag = 0;\n//#endif\n\n\tfor(int i = 0; i < 16; ++i)\n\t\tarmcpu->R[i] = 0;\n\t\n\tarmcpu->CPSR.val = armcpu->SPSR.val = SYS;\n\t\n\tarmcpu->R13_usr = armcpu->R14_usr = 0;\n\tarmcpu->R13_svc = armcpu->R14_svc = 0;\n\tarmcpu->R13_abt = armcpu->R14_abt = 0;\n\tarmcpu->R13_und = armcpu->R14_und = 0;\n\tarmcpu->R13_irq = armcpu->R14_irq = 0;\n\tarmcpu->R8_fiq = armcpu->R9_fiq = armcpu->R10_fiq = armcpu->R11_fiq = armcpu->R12_fiq = armcpu->R13_fiq = armcpu->R14_fiq = 0;\n\t\n\tarmcpu->SPSR_svc.val = armcpu->SPSR_abt.val = armcpu->SPSR_und.val = armcpu->SPSR_irq.val = armcpu->SPSR_fiq.val = 0;\n\n//#ifdef GDB_STUB\n//    armcpu->instruct_adr = adr;\n//\tarmcpu->R[15] = adr + 8;\n//#else\n\t//armcpu->R[15] = adr;\n//#endif\n\n\tarmcpu->next_instruction = adr;\n\t\n//#ifndef GDB_STUB\n\tarmcpu_prefetch(armcpu);\n//#endif\n}\n\nu32 armcpu_switchMode(armcpu_t *armcpu, u8 mode)\n{\n\tu32 oldmode = armcpu->CPSR.bits.mode;\n\t\n\tswitch(oldmode)\n\t{\n\t\tcase USR :\n\t\tcase SYS :\n\t\t\tarmcpu->R13_usr = armcpu->R[13];\n\t\t\tarmcpu->R14_usr = armcpu->R[14];\n\t\t\tbreak;\n\t\t\t\n\t\tcase FIQ :\n\t\t\t{\n                                u32 tmp;\n\t\t\t\tSWAP(armcpu->R[8], armcpu->R8_fiq, tmp);\n\t\t\t\tSWAP(armcpu->R[9], armcpu->R9_fiq, tmp);\n\t\t\t\tSWAP(armcpu->R[10], armcpu->R10_fiq, tmp);\n\t\t\t\tSWAP(armcpu->R[11], armcpu->R11_fiq, tmp);\n\t\t\t\tSWAP(armcpu->R[12], armcpu->R12_fiq, tmp);\n\t\t\t\tarmcpu->R13_fiq = armcpu->R[13];\n\t\t\t\tarmcpu->R14_fiq = armcpu->R[14];\n\t\t\t\tarmcpu->SPSR_fiq = armcpu->SPSR;\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase IRQ :\n\t\t\tarmcpu->R13_irq = armcpu->R[13];\n\t\t\tarmcpu->R14_irq = armcpu->R[14];\n\t\t\tarmcpu->SPSR_irq = armcpu->SPSR;\n\t\t\tbreak;\n\t\t\t\n\t\tcase SVC :\n\t\t\tarmcpu->R13_svc = armcpu->R[13];\n\t\t\tarmcpu->R14_svc = armcpu->R[14];\n\t\t\tarmcpu->SPSR_svc = armcpu->SPSR;\n\t\t\tbreak;\n\t\t\n\t\tcase ABT :\n\t\t\tarmcpu->R13_abt = armcpu->R[13];\n\t\t\tarmcpu->R14_abt = armcpu->R[14];\n\t\t\tarmcpu->SPSR_abt = armcpu->SPSR;\n\t\t\tbreak;\n\t\t\t\n\t\tcase UND :\n\t\t\tarmcpu->R13_und = armcpu->R[13];\n\t\t\tarmcpu->R14_und = armcpu->R[14];\n\t\t\tarmcpu->SPSR_und = armcpu->SPSR;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tswitch(mode)\n\t\t{\n\t\t\tcase USR :\n\t\t\tcase SYS :\n\t\t\t\tarmcpu->R[13] = armcpu->R13_usr;\n\t\t\t\tarmcpu->R[14] = armcpu->R14_usr;\n\t\t\t\t//SPSR = CPSR;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase FIQ :\n\t\t\t\t{\n\t\t\t\t\tu32 tmp;\n\t\t\t\t\tSWAP(armcpu->R[8], armcpu->R8_fiq, tmp);\n\t\t\t\t\tSWAP(armcpu->R[9], armcpu->R9_fiq, tmp);\n\t\t\t\t\tSWAP(armcpu->R[10], armcpu->R10_fiq, tmp);\n\t\t\t\t\tSWAP(armcpu->R[11], armcpu->R11_fiq, tmp);\n\t\t\t\t\tSWAP(armcpu->R[12], armcpu->R12_fiq, tmp);\n\t\t\t\t\tarmcpu->R[13] = armcpu->R13_fiq;\n\t\t\t\t\tarmcpu->R[14] = armcpu->R14_fiq;\n\t\t\t\t\tarmcpu->SPSR = armcpu->SPSR_fiq;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\tcase IRQ :\n\t\t\t\tarmcpu->R[13] = armcpu->R13_irq;\n\t\t\t\tarmcpu->R[14] = armcpu->R14_irq;\n\t\t\t\tarmcpu->SPSR = armcpu->SPSR_irq;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase SVC :\n\t\t\t\tarmcpu->R[13] = armcpu->R13_svc;\n\t\t\t\tarmcpu->R[14] = armcpu->R14_svc;\n\t\t\t\tarmcpu->SPSR = armcpu->SPSR_svc;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ABT :\n\t\t\t\tarmcpu->R[13] = armcpu->R13_abt;\n\t\t\t\tarmcpu->R[14] = armcpu->R14_abt;\n\t\t\t\tarmcpu->SPSR = armcpu->SPSR_abt;\n\t\t\t\tbreak;\n\t\t\t\t\n          case UND :\n\t\t\t\tarmcpu->R[13] = armcpu->R13_und;\n\t\t\t\tarmcpu->R[14] = armcpu->R14_und;\n\t\t\t\tarmcpu->SPSR = armcpu->SPSR_und;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault :\n\t\t\t\tprintf(\"switchMode: WRONG mode %02X\\n\",mode);\n\t\t\t\tbreak;\n\t}\n\t\n\tarmcpu->CPSR.bits.mode = mode & 0x1F;\n\tarmcpu->changeCPSR();\n\treturn oldmode;\n}\n\nvoid armcpu_changeCPSR(armcpu_t *armcpu)\n{\n\tarmcpu->changeCPSR();\n}\n\nu32 armcpu_Wait4IRQ(armcpu_t *cpu)\n{\n\tcpu->waitIRQ = TRUE;\n\tcpu->halt_IE_and_IF = TRUE;\n\n\treturn 1;\n}\n\n\n#if 0 /* not used */\nstatic BOOL FASTCALL test_EQ(Status_Reg CPSR) { return ( CPSR.bits.Z); }\nstatic BOOL FASTCALL test_NE(Status_Reg CPSR) { return (!CPSR.bits.Z); }\nstatic BOOL FASTCALL test_CS(Status_Reg CPSR) { return ( CPSR.bits.C); }\nstatic BOOL FASTCALL test_CC(Status_Reg CPSR) { return (!CPSR.bits.C); }\nstatic BOOL FASTCALL test_MI(Status_Reg CPSR) { return ( CPSR.bits.N); }\nstatic BOOL FASTCALL test_PL(Status_Reg CPSR) { return (!CPSR.bits.N); }\nstatic BOOL FASTCALL test_VS(Status_Reg CPSR) { return ( CPSR.bits.V); }\nstatic BOOL FASTCALL test_VC(Status_Reg CPSR) { return (!CPSR.bits.V); }\nstatic BOOL FASTCALL test_HI(Status_Reg CPSR) { return (CPSR.bits.C) && (!CPSR.bits.Z); }\nstatic BOOL FASTCALL test_LS(Status_Reg CPSR) { return (CPSR.bits.Z) || (!CPSR.bits.C); }\nstatic BOOL FASTCALL test_GE(Status_Reg CPSR) { return (CPSR.bits.N==CPSR.bits.V); }\nstatic BOOL FASTCALL test_LT(Status_Reg CPSR) { return (CPSR.bits.N!=CPSR.bits.V); }\nstatic BOOL FASTCALL test_GT(Status_Reg CPSR) { return (!CPSR.bits.Z) && (CPSR.bits.N==CPSR.bits.V); }\nstatic BOOL FASTCALL test_LE(Status_Reg CPSR) { return ( CPSR.bits.Z) || (CPSR.bits.N!=CPSR.bits.V); }\nstatic BOOL FASTCALL test_AL(Status_Reg CPSR) { return 1; }\n\nstatic BOOL (FASTCALL* test_conditions[])(Status_Reg CPSR)= {\n\ttest_EQ , test_NE ,\n\ttest_CS , test_CC ,\n\ttest_MI , test_PL ,\n\ttest_VS , test_VC ,\n\ttest_HI , test_LS ,\n\ttest_GE , test_LT ,\n\ttest_GT , test_LE ,\n\ttest_AL\n};\n#define TEST_COND2(cond, CPSR) \\\n\t(cond<15&&test_conditions[cond](CPSR))\n#endif\n\n//TODO - merge with armcpu_irqException?\n//http://www.ethernut.de/en/documents/arm-exceptions.html\n//http://docs.google.com/viewer?a=v&q=cache:V4ht1YkxprMJ:www.cs.nctu.edu.tw/~wjtsai/EmbeddedSystemDesign/Ch3-1.pdf+arm+exception+handling&hl=en&gl=us&pid=bl&srcid=ADGEEShx9VTHbUhWdDOrTVRzLkcCsVfJiijncNDkkgkrlJkLa7D0LCpO8fQ_hhU3DTcgZh9rcZWWQq4TYhhCovJ625h41M0ZUX3WGasyzWQFxYzDCB-VS6bsUmpoJnRxAc-bdkD0qmsu&sig=AHIEtbR9VHvDOCRmZFQDUVwy53iJDjoSPQ\nvoid armcpu_exception(armcpu_t *cpu, u32 number)\n{\n\tMode cpumode = USR;\n\tswitch(number)\n\t{\n\tcase EXCEPTION_RESET: cpumode = SVC; break;\n\tcase EXCEPTION_UNDEFINED_INSTRUCTION: cpumode = UND; break;\n\tcase EXCEPTION_SWI: cpumode = SVC; break;\n\tcase EXCEPTION_PREFETCH_ABORT: cpumode = ABT; break;\n\tcase EXCEPTION_DATA_ABORT: cpumode = ABT; break;\n\tcase EXCEPTION_RESERVED_0x14: emu_halt(); break;\n\tcase EXCEPTION_IRQ: cpumode = IRQ; break;\n\tcase EXCEPTION_FAST_IRQ: cpumode = FIQ; break;\n\t}\n\n\tStatus_Reg tmp = cpu->CPSR;\n\tarmcpu_switchMode(cpu, cpumode);\t\t\t\t//enter new mode\n\tcpu->R[14] = cpu->next_instruction;\n\tcpu->SPSR = tmp;\t\t\t\t\t\t\t//save old CPSR as new SPSR\n\tcpu->CPSR.bits.T = 0;\t\t\t\t\t\t//handle as ARM32 code\n\tcpu->CPSR.bits.I = 1;\n\tcpu->changeCPSR();\n\tcpu->R[15] = cpu->intVector + number;\n\tcpu->next_instruction = cpu->R[15];\n\tprintf(\"armcpu_exception!\\n\");\n\t//extern bool dolog;\n\t//dolog=true;\n\n\t//HOW DOES THIS WORTK WITHOUT A PREFETCH, LIKE IRQ BELOW?\n\t//I REALLY WISH WE DIDNT PREFETCH BEFORE EXECUTING\n}\n\nBOOL armcpu_irqException(armcpu_t *armcpu)\n{\n    Status_Reg tmp;\n\n\t//TODO - remove GDB specific code\n//#ifdef GDB_STUB\n//\tarmcpu->irq_flag = 0;\n//#endif\n      \n\ttmp = armcpu->CPSR;\n\tarmcpu_switchMode(armcpu, IRQ);\n\n\t//TODO - remove GDB specific code\n//#ifdef GDB_STUB\n//\tarmcpu->R[14] = armcpu->next_instruction + 4;\n//#else\n\tarmcpu->R[14] = armcpu->instruct_adr + 4;\n//#endif\n\tarmcpu->SPSR = tmp;\n\tarmcpu->CPSR.bits.T = 0;\n\tarmcpu->CPSR.bits.I = 1;\n\tarmcpu->next_instruction = armcpu->intVector + 0x18;\n\tarmcpu->waitIRQ = 0;\n\n\t//must retain invariant of having next instruction to be executed prefetched\n\t//(yucky)\n\tarmcpu_prefetch(armcpu);\n\n\treturn TRUE;\n}\n\n//TODO - remove GDB specific code\n//BOOL\n//armcpu_flagIrq( armcpu_t *armcpu) {\n//  if(armcpu->CPSR.bits.I) return FALSE;\n//\n//  armcpu->waitIRQ = 0;\n//\n//#ifdef GDB_STUB\n//  armcpu->irq_flag = 1;\n//#endif\n//\n//  return TRUE;\n//}\n\nu32 TRAPUNDEF(armcpu_t* cpu)\n{\n\tINFO(\"ARM%c: Undefined instruction: 0x%08X (%s) PC=0x%08X\\n\", cpu->proc_ID?'7':'9', cpu->instruction, decodeIntruction(cpu->CPSR.bits.T, cpu->instruction), cpu->instruct_adr);\n\n\tif (((cpu->intVector != 0) ^ (cpu->proc_ID == ARMCPU_ARM9)))\n\t{\n\t\tarmcpu_exception(&NDS_ARM9,EXCEPTION_UNDEFINED_INSTRUCTION);\n\t\treturn 4;\n\t}\n\telse\n\t{\n\t\temu_halt();\n\t\treturn 4;\n\t}\n}\n\n//BOOL\n//armcpu_flagIrq( armcpu_t *armcpu) {\n//  if(armcpu->CPSR.bits.I) return FALSE;\n//\n//  armcpu->waitIRQ = 0;\n//\n//#ifdef GDB_STUB\n//  armcpu->irq_flag = 1;\n//#endif\n//\n//  return TRUE;\n//}\n\nvoid armcpu_sync()\n{\n\tNDS_ARM7.next_instruction = NDS_ARM7.instruct_adr;\n\tNDS_ARM9.next_instruction = NDS_ARM9.instruct_adr;\n\tarmcpu_prefetch<0>();\n\tarmcpu_prefetch<1>();\n}\n\nvoid armcpu_setjitmode(int jitmode)\n{\n\tCommonSettings.jit_max_block_size = CommonSettings.jit_max_block_size > 0 ? CommonSettings.jit_max_block_size : 1;\n#ifdef HAVE_JIT\n\tif (arm_cpubase)\n\t{\n\t\tarm_cpubase->Sync();\n\t\tarm_cpubase->Shutdown();\n\n\t\tarm_cpubase = NULL;\n\t}\n\n\tswitch (jitmode)\n\t{\n\tcase 0:\n\t\tarm_cpubase = NULL;\n\t\tbreak;\n\n\tcase 1:\n\t\tarm_cpubase = &arm_threadedinterpreter;\n\t\tbreak;\n\n\tcase 2:\n\t\tarm_cpubase = &arm_ljit;\n\t\tbreak;\n\n#if 0 //(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)\n\tcase 3:\n\t\tarm_cpubase = &arm_oldjit;\n\t\tbreak;\n#endif\n\n\tdefault:\n\t\tINFO(\"armcpu_setjitmode, unknow jitmode : %d\\n\", jitmode);\n\t\tarm_cpubase = &arm_threadedinterpreter;\n\t\tbreak;\n\t}\n\n\tif (arm_cpubase)\n\t{\n\t\tINFO(\"armcpu_setjitmode : %s\\n\", arm_cpubase->Description());\n\n\t\tarm_cpubase->Reserve();\n\t\tarm_cpubase->Reset();\n\t}\n\telse\n\t\tINFO(\"armcpu_setjitmode, jit off\\n\");\n#endif\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/armcpu.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ARM_CPU\n#define ARM_CPU\n\n#include \"types.h\"\n#include \"bits.h\"\n#include \"MMU.h\"\n#include \"common.h\"\n#include \"instructions.h\"\n#include \"cp15.h\"\n#include \"sequencer.h\"\n#define USE_BITFLOWCALC 0\n\n#define CODE(i)     (((i)>>25)&0x7)\n#define OPCODE(i)   (((i)>>21)&0xF)\n#define SIGNEBIT(i) BIT_N(i,20)\n\n#define EXCEPTION_RESET 0x00\n#define EXCEPTION_UNDEFINED_INSTRUCTION 0x04\n#define EXCEPTION_SWI 0x08\n#define EXCEPTION_PREFETCH_ABORT 0x0C\n#define EXCEPTION_DATA_ABORT 0x10\n#define EXCEPTION_RESERVED_0x14 0x14\n#define EXCEPTION_IRQ 0x18\n#define EXCEPTION_FAST_IRQ 0x1C\n\n#define INSTRUCTION_INDEX(i) ((((i)>>16)&0xFF0)|(((i)>>4)&0xF))\n\nFORCEINLINE u32 ROR(u32 i, u32 j)   { return ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j)))); }\n\n//template<typename T>\n//FORCEINLINE T UNSIGNED_OVERFLOW(T a,T b,T c) { return BIT31(((a)&(b)) | (((a)|(b))&(~c))); }\n//\n//template<typename T>\n//FORCEINLINE T UNSIGNED_UNDERFLOW(T a,T b,T c) { return BIT31(((~a)&(b)) | (((~a)|(b))&(c))); }\n\n#if USE_BITFLOWCALC\ntemplate<typename T>\nFORCEINLINE T SIGNED_OVERFLOW(T a,T b,T c) { return BIT31((~(a^b))&(a^c)); }\n\ntemplate<typename T>\nFORCEINLINE T SIGNED_UNDERFLOW(T a,T b,T c) { return BIT31((a^b)&(a^c)); }\n#else\ntemplate<typename T>\nFORCEINLINE T SIGNED_OVERFLOW(T a,T b,T c) { return BIT31(((a)&(b)&(~c)) | ((~a)&(~(b))&(c))); }\n\ntemplate<typename T>\nFORCEINLINE T SIGNED_UNDERFLOW(T a,T b,T c) { return BIT31(((a)&(~(b))&(~c)) | ((~a)&(b)&(c))); }\n#endif\n\n// ============================= CPRS flags funcs\nFORCEINLINE bool CarryFrom(s32 left, s32 right)\n{\n  u32 res  = (0xFFFFFFFFU - (u32)left);\n\n  return ((u32)right > res);\n}\n\nFORCEINLINE bool BorrowFrom(s32 left, s32 right)\n{\n  return ((u32)right > (u32)left);\n}\n\n#if USE_BITFLOWCALC\nFORCEINLINE bool OverflowFromADD(s32 alu_out, s32 left, s32 right)\n{\n    return BIT31((~(left^right))&(left^alu_out));\n}\n\nFORCEINLINE bool OverflowFromSUB(s32 alu_out, s32 left, s32 right)\n{\n    return BIT31((left^right)&(left^alu_out));\n}\n#else\nFORCEINLINE bool OverflowFromADD(s32 alu_out, s32 left, s32 right)\n{\n    return ((left >= 0 && right >= 0) || (left < 0 && right < 0))\n\t\t\t&& ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));\n}\n\nFORCEINLINE bool OverflowFromSUB(s32 alu_out, s32 left, s32 right)\n{\n    return ((left < 0 && right >= 0) || (left >= 0 && right < 0))\n\t\t\t&& ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));\n}\n#endif\n\n//zero 15-feb-2009 - these werent getting used and they were getting in my way\n//#define EQ\t0x0\n//#define NE\t0x1\n//#define CS\t0x2\n//#define CC\t0x3\n//#define MI\t0x4\n//#define PL\t0x5\n//#define VS\t0x6\n//#define VC\t0x7\n//#define HI\t0x8\n//#define LS\t0x9\n//#define GE\t0xA\n//#define LT\t0xB\n//#define GT\t0xC\n//#define LE\t0xD\n//#define AL\t0xE\n\nstatic const u8 arm_cond_table[16*16] = {\n    // N=0, Z=0, C=0, V=0\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,\t// 0x00\n    0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x20,\t// 0x00\n    // N=0, Z=0, C=0, V=1\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x00,\t// 0x10\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=0, Z=0, C=1, V=0\n    0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,\t// 0x20\n    0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x20,\n    // N=0, Z=0, C=1, V=1\n    0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,\t// 0x30\n    0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=0, Z=1, C=0, V=0\n    0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,\t// 0x40\n    0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20,\n    // N=0, Z=1, C=0, V=1\n    0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00,\t// 0x50\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=0, Z=1, C=1, V=0\n    0xFF,0x00,0xFF,0x00,0x00,0xFF,0x00,0xFF,\t// 0x60\n    0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20,\n    // N=0, Z=1, C=1, V=1\n    0xFF,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,\t// 0x70\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=1, Z=0, C=0, V=0\n    0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0xFF,\t// 0x80\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=1, Z=0, C=0, V=1\n    0x00,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0x00,\t// 0x90\n    0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x20,\n    // N=1, Z=0, C=1, V=0\n    0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0xFF,\t// 0xA0\n    0xFF,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=1, Z=0, C=1, V=1\n    0x00,0xFF,0xFF,0x00,0xFF,0x00,0xFF,0x00,\t// 0xB0\n    0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x20,\n    // N=1, Z=1, C=0, V=0\n    0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,\t// 0xC0\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=1, Z=1, C=0, V=1\n    0xFF,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,\t// 0xD0\n    0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20,\n    // N=1, Z=1, C=1, V=0\n    0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0xFF,\t// 0xE0\n    0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x20,\n    // N=1, Z=1, C=1, V=1\n    0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,\t// 0xF0\n    0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x20\n};\n\n#define TEST_COND(cond, inst, CPSR)   ((arm_cond_table[((CPSR.val >> 24) & 0xf0)|(cond)]) & (1 << (inst)))\n\n\nenum Mode\n{\n\tUSR = 0x10,\n\tFIQ = 0x11,\n\tIRQ = 0x12,\n\tSVC = 0x13,\n\tABT = 0x17,\n\tUND = 0x1B,\n\tSYS = 0x1F\n};\n\n#ifdef WORDS_BIGENDIAN\ntypedef union\n{\n\tstruct\n\t{\n\t\tu32 N : 1,\n\t\tZ : 1,\n\t\tC : 1,\n\t\tV : 1,\n\t\tQ : 1,\n\t\tRAZ : 19,\n\t\tI : 1,\n\t\tF : 1,\n\t\tT : 1,\n                mode : 5;\n\t} bits;\n        u32 val;\n} Status_Reg;\n#else\ntypedef union\n{\n\tstruct\n\t{\n                u32 mode : 5,\n\t\tT : 1,\n\t\tF : 1,\n\t\tI : 1,\n\t\tRAZ : 19,\n\t\tQ : 1,\n\t\tV : 1,\n\t\tC : 1,\n\t\tZ : 1,\n\t\tN : 1;\n\t} bits;\n        u32 val;\n} Status_Reg;\n#endif\n\n/**\n * The control interface to a CPU\n */\nstruct armcpu_ctrl_iface {\n  /** stall the processor */\n  void (*stall)( void *instance);\n\n  /** unstall the processor */\n  void (*unstall)( void *instance);\n\n  /** read a register value */\n  u32 (*read_reg)( void *instance, u32 reg_num);\n\n  /** set a register value */\n  void (*set_reg)( void *instance, u32 reg_num, u32 value);\n\n  /** install the post execute function */\n  void (*install_post_ex_fn)( void *instance,\n                              void (*fn)( void *, u32 adr, int thumb),\n                              void *fn_data);\n\n  /** remove the post execute function */\n  void (*remove_post_ex_fn)( void *instance);\n\n  /** the private data passed to all interface functions */\n  void *data;\n};\n\n\ntypedef void* armcp_t;\n\nstruct armcpu_t\n{\n\tu32 proc_ID;\n\tu32 instruction; //4\n\tu32 instruct_adr; //8\n\tu32 next_instruction; //12\n\n\tCACHE_ALIGN u32 R[16]; //16\n\tCACHE_ALIGN Status_Reg CPSR;  //80\n\tStatus_Reg SPSR;\n\n\tvoid changeCPSR();\n\n\tu32 R13_usr, R14_usr;\n\tu32 R13_svc, R14_svc;\n\tu32 R13_abt, R14_abt;\n\tu32 R13_und, R14_und;\n\tu32 R13_irq, R14_irq;\n\tu32 R8_fiq, R9_fiq, R10_fiq, R11_fiq, R12_fiq, R13_fiq, R14_fiq;\n\tStatus_Reg SPSR_svc, SPSR_abt, SPSR_und, SPSR_irq, SPSR_fiq;\n\n\tu32 intVector;\n\tu8 LDTBit;  //1 : ARMv5 style 0 : non ARMv5 (earlier)\n\tBOOL waitIRQ;\n\tBOOL halt_IE_and_IF; //the cpu is halted, waiting for IE&IF to signal something\n\tu8 intrWaitARM_state;\n\n\tBOOL BIOS_loaded;\n\n\tu32 (* *swi_tab)();\n\n\t// flag indicating if the processor is stalled (for debugging)\n\tint stalled;\n\n#if defined(_M_X64) || defined(__x86_64__)\n\tu8 cond_table[16*16];\n#endif\n\n#ifdef GDB_STUB\n  /** there is a pending irq for the cpu */\n  int irq_flag;\n\n  /** the post executed function (if installed) */\n  void (*post_ex_fn)( void *, u32 adr, int thumb);\n\n  /** data for the post executed function */\n  void *post_ex_fn_data;\n\n\n\n  /** the memory interface */\n  struct armcpu_memory_iface *mem_if;\n\n  /** the ctrl interface */\n  struct armcpu_ctrl_iface ctrl_iface;\n#endif\n};\n\n#ifdef GDB_STUB\nint armcpu_new( armcpu_t *armcpu, u32 id, struct armcpu_memory_iface *mem_if,\n                struct armcpu_ctrl_iface **ctrl_iface_ret);\n#else\nint armcpu_new( armcpu_t *armcpu, u32 id);\n#endif\nvoid armcpu_init(armcpu_t *armcpu, u32 adr);\nu32 armcpu_switchMode(armcpu_t *armcpu, u8 mode);\nvoid armcpu_changeCPSR(armcpu_t *armcpu);\n\nBOOL armcpu_irqException(armcpu_t *armcpu);\nBOOL armcpu_flagIrq( armcpu_t *armcpu);\nvoid armcpu_exception(armcpu_t *cpu, u32 number);\nu32 TRAPUNDEF(armcpu_t* cpu);\nu32 armcpu_Wait4IRQ(armcpu_t *cpu);\n\nextern CACHE_ALIGN armcpu_t NDS_ARM7;\nextern CACHE_ALIGN armcpu_t NDS_ARM9;\n\n\ntemplate<int PROCNUM, int cpuMode> u32 armcpu_exec();\n\nvoid armcpu_setjitmode(int jitmode);\nvoid armcpu_sync();\n\nstatic INLINE void setIF(int PROCNUM, u32 flag)\n{\n\t//don't set generated bits!!!\n\tassert(!(flag&0x00200000));\n\n\tMMU.reg_IF_bits[PROCNUM] |= flag;\n\n\tNDS_Reschedule();\n}\n\nstatic INLINE void NDS_makeIrq(int PROCNUM, u32 num)\n{\n\tsetIF(PROCNUM,1<<num);\n}\n\nstatic INLINE char *decodeIntruction(bool thumb_mode, u32 instr)\n{\n\tchar txt[20] = {0};\n\tu32 tmp = 0;\n\tif (thumb_mode == true)\n\t{\n\t\ttmp = (instr >> 6);\n\t\tstrcpy(txt, intToBin((u16)tmp)+6);\n\t}\n\telse\n\t{\n\t\ttmp = ((instr >> 16) & 0x0FF0) | ((instr >> 4) & 0x0F);\n\t\tstrcpy(txt, intToBin((u32)tmp)+20);\n\t}\n\treturn strdup(txt);\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/armcpu_exec_inline.h",
    "content": "/*\r\n\tCopyright (C) 2006 yopyop\r\n\tCopyright (C) 2006-2012 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _ARMCPU_EXEC_INLINE_H\r\n#define _ARMCPU_EXEC_INLINE_H\r\n\r\n#include \"arm_instructions.h\"\r\n#include \"thumb_instructions.h\"\r\n#include \"MMU_timing.h\"\r\n#include \"ArmThreadedInterpreter.h\"\r\n#include \"ArmLJit.h\"\r\n\r\ntemplate<u32> static void armcpu_prefetch();\r\n\r\ntemplate<u32 PROCNUM>\r\nstatic void armcpu_prefetch()\r\n{\r\n\tu32 curInstruction = ARMPROC.next_instruction;\r\n\r\n\tif(ARMPROC.CPSR.bits.T == 0)\r\n\t{\r\n\r\n\t\tcurInstruction &= 0xFFFFFFFC; //please don't change this to 0x0FFFFFFC -- the NDS will happily run on 0xF******* addresses all day long\r\n\t\t//please note that we must setup R[15] before reading the instruction since there is a protection\r\n\t\t//which prevents PC > 0x3FFF from reading the bios region\r\n\t\tARMPROC.instruct_adr = curInstruction;\r\n\t\tARMPROC.next_instruction = curInstruction + 4;\r\n\t\tARMPROC.R[15] = curInstruction + 8;\r\n\t\tARMPROC.instruction = _MMU_read32<PROCNUM, MMU_AT_CODE>(curInstruction);\r\n\r\n\t\tMMU_codeFetchCycles<PROCNUM,32>(curInstruction);\r\n\t\treturn;\r\n\t}\r\n\r\n\r\n\tcurInstruction &= 0xFFFFFFFE; //please don't change this to 0x0FFFFFFE -- the NDS will happily run on 0xF******* addresses all day long\r\n\t//please note that we must setup R[15] before reading the instruction since there is a protection\r\n\t//which prevents PC > 0x3FFF from reading the bios region\r\n\tARMPROC.instruct_adr = curInstruction;\r\n\tARMPROC.next_instruction = curInstruction + 2;\r\n\tARMPROC.R[15] = curInstruction + 4;\r\n\tARMPROC.instruction = _MMU_read16<PROCNUM, MMU_AT_CODE>(curInstruction);\r\n\r\n\r\n\tif(PROCNUM==0)\r\n\t{\r\n\t\t// arm9 fetches 2 instructions at a time in thumb mode\r\n\t\tif(!(curInstruction == ARMPROC.instruct_adr + 2 && (curInstruction & 2)))\r\n\t\t\tMMU_codeFetchCycles<PROCNUM,32>(curInstruction);\r\n\t\treturn;\r\n\t}\r\n\r\n\tMMU_codeFetchCycles<PROCNUM,16>(curInstruction);\r\n\treturn;\r\n}\r\n\r\ntemplate<int PROCNUM> u32 armcpu_exec()\r\n{\r\n\t// Usually, fetching and executing are processed parallelly.\r\n\t// So this function stores the cycles of each process to\r\n\t// the variables below, and returns appropriate cycle count.\r\n\tu32 cExecute;\r\n\r\n\tif(ARMPROC.CPSR.bits.T == 0)\r\n\t{\r\n\t\tconst u32 condition = CONDITION(ARMPROC.instruction); \r\n\t\tif(\r\n\t\t\tcondition == 0x0E  //fast path for unconditional instructions\r\n\t\t\t|| (TEST_COND(condition, CODE(ARMPROC.instruction), ARMPROC.CPSR)) //handles any condition\r\n\t\t\t)\r\n\t\t{\r\n\r\n\t\t\tcExecute = arm_instructions_set[PROCNUM][INSTRUCTION_INDEX(ARMPROC.instruction)](ARMPROC.instruction);\r\n\t\t}\r\n\t\telse\r\n\t\t\tcExecute = 1; // If condition=false: 1S cycle\r\n\r\n\t\tarmcpu_prefetch<PROCNUM>();\r\n\t\t//return MMU_fetchExecuteCycles<PROCNUM>(cExecute, cFetch);\r\n\t\treturn cExecute;\r\n\t}\r\n\r\n\tcExecute = thumb_instructions_set[PROCNUM][ARMPROC.instruction>>6](ARMPROC.instruction);\r\n\t\r\n\tarmcpu_prefetch<PROCNUM>();\r\n\t//return MMU_fetchExecuteCycles<PROCNUM>(cExecute, cFetch);\r\n\treturn cExecute;\r\n}\r\n\r\n\r\n\r\ntemplate<int PROCNUM, int cpuMode>\r\nu32 armcpu_exec()\r\n{\r\n\tif(cpuMode == 1)\r\n\t\treturn cpuExecute<PROCNUM>();\r\n\telse if(cpuMode == 0 || arm_cpubase == NULL)\r\n\t\treturn armcpu_exec<PROCNUM>();\r\n\treturn arm_cpubase->Execute[PROCNUM]();\r\n}\r\n\r\n\r\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/bios.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008-2012 DeSmuME team\n\t\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"cp15.h\"\n#include <math.h>\n#include \"MMU.h\"\n#include \"debug.h\"\n#include \"NDSSystem.h\"\n\n#define cpu (&ARMPROC)\n#define TEMPLATE template<int PROCNUM> \n\nstatic const u16 getsinetbl[] = {\n0x0000, 0x0324, 0x0648, 0x096A, 0x0C8C, 0x0FAB, 0x12C8, 0x15E2, \n0x18F9, 0x1C0B, 0x1F1A, 0x2223, 0x2528, 0x2826, 0x2B1F, 0x2E11, \n0x30FB, 0x33DF, 0x36BA, 0x398C, 0x3C56, 0x3F17, 0x41CE, 0x447A, \n0x471C, 0x49B4, 0x4C3F, 0x4EBF, 0x5133, 0x539B, 0x55F5, 0x5842, \n0x5A82, 0x5CB3, 0x5ED7, 0x60EB, 0x62F1, 0x64E8, 0x66CF, 0x68A6, \n0x6A6D, 0x6C23, 0x6DC9, 0x6F5E, 0x70E2, 0x7254, 0x73B5, 0x7504, \n0x7641, 0x776B, 0x7884, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE3, \n0x7D89, 0x7E1D, 0x7E9C, 0x7F09, 0x7F61, 0x7FA6, 0x7FD8, 0x7FF5\n};\n\nstatic const u16 getpitchtbl[] = {\n0x0000, 0x003B, 0x0076, 0x00B2, 0x00ED, 0x0128, 0x0164, 0x019F, \n0x01DB, 0x0217, 0x0252, 0x028E, 0x02CA, 0x0305, 0x0341, 0x037D, \n0x03B9, 0x03F5, 0x0431, 0x046E, 0x04AA, 0x04E6, 0x0522, 0x055F, \n0x059B, 0x05D8, 0x0614, 0x0651, 0x068D, 0x06CA, 0x0707, 0x0743, \n0x0780, 0x07BD, 0x07FA, 0x0837, 0x0874, 0x08B1, 0x08EF, 0x092C, \n0x0969, 0x09A7, 0x09E4, 0x0A21, 0x0A5F, 0x0A9C, 0x0ADA, 0x0B18, \n0x0B56, 0x0B93, 0x0BD1, 0x0C0F, 0x0C4D, 0x0C8B, 0x0CC9, 0x0D07, \n0x0D45, 0x0D84, 0x0DC2, 0x0E00, 0x0E3F, 0x0E7D, 0x0EBC, 0x0EFA, \n0x0F39, 0x0F78, 0x0FB6, 0x0FF5, 0x1034, 0x1073, 0x10B2, 0x10F1, \n0x1130, 0x116F, 0x11AE, 0x11EE, 0x122D, 0x126C, 0x12AC, 0x12EB, \n0x132B, 0x136B, 0x13AA, 0x13EA, 0x142A, 0x146A, 0x14A9, 0x14E9, \n0x1529, 0x1569, 0x15AA, 0x15EA, 0x162A, 0x166A, 0x16AB, 0x16EB, \n0x172C, 0x176C, 0x17AD, 0x17ED, 0x182E, 0x186F, 0x18B0, 0x18F0, \n0x1931, 0x1972, 0x19B3, 0x19F5, 0x1A36, 0x1A77, 0x1AB8, 0x1AFA, \n0x1B3B, 0x1B7D, 0x1BBE, 0x1C00, 0x1C41, 0x1C83, 0x1CC5, 0x1D07, \n0x1D48, 0x1D8A, 0x1DCC, 0x1E0E, 0x1E51, 0x1E93, 0x1ED5, 0x1F17, \n0x1F5A, 0x1F9C, 0x1FDF, 0x2021, 0x2064, 0x20A6, 0x20E9, 0x212C, \n0x216F, 0x21B2, 0x21F5, 0x2238, 0x227B, 0x22BE, 0x2301, 0x2344, \n0x2388, 0x23CB, 0x240E, 0x2452, 0x2496, 0x24D9, 0x251D, 0x2561, \n0x25A4, 0x25E8, 0x262C, 0x2670, 0x26B4, 0x26F8, 0x273D, 0x2781, \n0x27C5, 0x280A, 0x284E, 0x2892, 0x28D7, 0x291C, 0x2960, 0x29A5, \n0x29EA, 0x2A2F, 0x2A74, 0x2AB9, 0x2AFE, 0x2B43, 0x2B88, 0x2BCD, \n0x2C13, 0x2C58, 0x2C9D, 0x2CE3, 0x2D28, 0x2D6E, 0x2DB4, 0x2DF9, \n0x2E3F, 0x2E85, 0x2ECB, 0x2F11, 0x2F57, 0x2F9D, 0x2FE3, 0x302A, \n0x3070, 0x30B6, 0x30FD, 0x3143, 0x318A, 0x31D0, 0x3217, 0x325E, \n0x32A5, 0x32EC, 0x3332, 0x3379, 0x33C1, 0x3408, 0x344F, 0x3496, \n0x34DD, 0x3525, 0x356C, 0x35B4, 0x35FB, 0x3643, 0x368B, 0x36D3, \n0x371A, 0x3762, 0x37AA, 0x37F2, 0x383A, 0x3883, 0x38CB, 0x3913, \n0x395C, 0x39A4, 0x39ED, 0x3A35, 0x3A7E, 0x3AC6, 0x3B0F, 0x3B58, \n0x3BA1, 0x3BEA, 0x3C33, 0x3C7C, 0x3CC5, 0x3D0E, 0x3D58, 0x3DA1, \n0x3DEA, 0x3E34, 0x3E7D, 0x3EC7, 0x3F11, 0x3F5A, 0x3FA4, 0x3FEE, \n0x4038, 0x4082, 0x40CC, 0x4116, 0x4161, 0x41AB, 0x41F5, 0x4240, \n0x428A, 0x42D5, 0x431F, 0x436A, 0x43B5, 0x4400, 0x444B, 0x4495, \n0x44E1, 0x452C, 0x4577, 0x45C2, 0x460D, 0x4659, 0x46A4, 0x46F0, \n0x473B, 0x4787, 0x47D3, 0x481E, 0x486A, 0x48B6, 0x4902, 0x494E, \n0x499A, 0x49E6, 0x4A33, 0x4A7F, 0x4ACB, 0x4B18, 0x4B64, 0x4BB1, \n0x4BFE, 0x4C4A, 0x4C97, 0x4CE4, 0x4D31, 0x4D7E, 0x4DCB, 0x4E18, \n0x4E66, 0x4EB3, 0x4F00, 0x4F4E, 0x4F9B, 0x4FE9, 0x5036, 0x5084, \n0x50D2, 0x5120, 0x516E, 0x51BC, 0x520A, 0x5258, 0x52A6, 0x52F4, \n0x5343, 0x5391, 0x53E0, 0x542E, 0x547D, 0x54CC, 0x551A, 0x5569, \n0x55B8, 0x5607, 0x5656, 0x56A5, 0x56F4, 0x5744, 0x5793, 0x57E2, \n0x5832, 0x5882, 0x58D1, 0x5921, 0x5971, 0x59C1, 0x5A10, 0x5A60, \n0x5AB0, 0x5B01, 0x5B51, 0x5BA1, 0x5BF1, 0x5C42, 0x5C92, 0x5CE3, \n0x5D34, 0x5D84, 0x5DD5, 0x5E26, 0x5E77, 0x5EC8, 0x5F19, 0x5F6A, \n0x5FBB, 0x600D, 0x605E, 0x60B0, 0x6101, 0x6153, 0x61A4, 0x61F6, \n0x6248, 0x629A, 0x62EC, 0x633E, 0x6390, 0x63E2, 0x6434, 0x6487, \n0x64D9, 0x652C, 0x657E, 0x65D1, 0x6624, 0x6676, 0x66C9, 0x671C, \n0x676F, 0x67C2, 0x6815, 0x6869, 0x68BC, 0x690F, 0x6963, 0x69B6, \n0x6A0A, 0x6A5E, 0x6AB1, 0x6B05, 0x6B59, 0x6BAD, 0x6C01, 0x6C55, \n0x6CAA, 0x6CFE, 0x6D52, 0x6DA7, 0x6DFB, 0x6E50, 0x6EA4, 0x6EF9, \n0x6F4E, 0x6FA3, 0x6FF8, 0x704D, 0x70A2, 0x70F7, 0x714D, 0x71A2, \n0x71F7, 0x724D, 0x72A2, 0x72F8, 0x734E, 0x73A4, 0x73FA, 0x7450, \n0x74A6, 0x74FC, 0x7552, 0x75A8, 0x75FF, 0x7655, 0x76AC, 0x7702, \n0x7759, 0x77B0, 0x7807, 0x785E, 0x78B4, 0x790C, 0x7963, 0x79BA, \n0x7A11, 0x7A69, 0x7AC0, 0x7B18, 0x7B6F, 0x7BC7, 0x7C1F, 0x7C77, \n0x7CCF, 0x7D27, 0x7D7F, 0x7DD7, 0x7E2F, 0x7E88, 0x7EE0, 0x7F38, \n0x7F91, 0x7FEA, 0x8042, 0x809B, 0x80F4, 0x814D, 0x81A6, 0x81FF, \n0x8259, 0x82B2, 0x830B, 0x8365, 0x83BE, 0x8418, 0x8472, 0x84CB, \n0x8525, 0x857F, 0x85D9, 0x8633, 0x868E, 0x86E8, 0x8742, 0x879D, \n0x87F7, 0x8852, 0x88AC, 0x8907, 0x8962, 0x89BD, 0x8A18, 0x8A73, \n0x8ACE, 0x8B2A, 0x8B85, 0x8BE0, 0x8C3C, 0x8C97, 0x8CF3, 0x8D4F, \n0x8DAB, 0x8E07, 0x8E63, 0x8EBF, 0x8F1B, 0x8F77, 0x8FD4, 0x9030, \n0x908C, 0x90E9, 0x9146, 0x91A2, 0x91FF, 0x925C, 0x92B9, 0x9316, \n0x9373, 0x93D1, 0x942E, 0x948C, 0x94E9, 0x9547, 0x95A4, 0x9602, \n0x9660, 0x96BE, 0x971C, 0x977A, 0x97D8, 0x9836, 0x9895, 0x98F3, \n0x9952, 0x99B0, 0x9A0F, 0x9A6E, 0x9ACD, 0x9B2C, 0x9B8B, 0x9BEA, \n0x9C49, 0x9CA8, 0x9D08, 0x9D67, 0x9DC7, 0x9E26, 0x9E86, 0x9EE6, \n0x9F46, 0x9FA6, 0xA006, 0xA066, 0xA0C6, 0xA127, 0xA187, 0xA1E8, \n0xA248, 0xA2A9, 0xA30A, 0xA36B, 0xA3CC, 0xA42D, 0xA48E, 0xA4EF, \n0xA550, 0xA5B2, 0xA613, 0xA675, 0xA6D6, 0xA738, 0xA79A, 0xA7FC, \n0xA85E, 0xA8C0, 0xA922, 0xA984, 0xA9E7, 0xAA49, 0xAAAC, 0xAB0E, \n0xAB71, 0xABD4, 0xAC37, 0xAC9A, 0xACFD, 0xAD60, 0xADC3, 0xAE27, \n0xAE8A, 0xAEED, 0xAF51, 0xAFB5, 0xB019, 0xB07C, 0xB0E0, 0xB145, \n0xB1A9, 0xB20D, 0xB271, 0xB2D6, 0xB33A, 0xB39F, 0xB403, 0xB468, \n0xB4CD, 0xB532, 0xB597, 0xB5FC, 0xB662, 0xB6C7, 0xB72C, 0xB792, \n0xB7F7, 0xB85D, 0xB8C3, 0xB929, 0xB98F, 0xB9F5, 0xBA5B, 0xBAC1, \n0xBB28, 0xBB8E, 0xBBF5, 0xBC5B, 0xBCC2, 0xBD29, 0xBD90, 0xBDF7, \n0xBE5E, 0xBEC5, 0xBF2C, 0xBF94, 0xBFFB, 0xC063, 0xC0CA, 0xC132, \n0xC19A, 0xC202, 0xC26A, 0xC2D2, 0xC33A, 0xC3A2, 0xC40B, 0xC473, \n0xC4DC, 0xC544, 0xC5AD, 0xC616, 0xC67F, 0xC6E8, 0xC751, 0xC7BB, \n0xC824, 0xC88D, 0xC8F7, 0xC960, 0xC9CA, 0xCA34, 0xCA9E, 0xCB08, \n0xCB72, 0xCBDC, 0xCC47, 0xCCB1, 0xCD1B, 0xCD86, 0xCDF1, 0xCE5B, \n0xCEC6, 0xCF31, 0xCF9C, 0xD008, 0xD073, 0xD0DE, 0xD14A, 0xD1B5, \n0xD221, 0xD28D, 0xD2F8, 0xD364, 0xD3D0, 0xD43D, 0xD4A9, 0xD515, \n0xD582, 0xD5EE, 0xD65B, 0xD6C7, 0xD734, 0xD7A1, 0xD80E, 0xD87B, \n0xD8E9, 0xD956, 0xD9C3, 0xDA31, 0xDA9E, 0xDB0C, 0xDB7A, 0xDBE8, \n0xDC56, 0xDCC4, 0xDD32, 0xDDA0, 0xDE0F, 0xDE7D, 0xDEEC, 0xDF5B, \n0xDFC9, 0xE038, 0xE0A7, 0xE116, 0xE186, 0xE1F5, 0xE264, 0xE2D4, \n0xE343, 0xE3B3, 0xE423, 0xE493, 0xE503, 0xE573, 0xE5E3, 0xE654, \n0xE6C4, 0xE735, 0xE7A5, 0xE816, 0xE887, 0xE8F8, 0xE969, 0xE9DA, \n0xEA4B, 0xEABC, 0xEB2E, 0xEB9F, 0xEC11, 0xEC83, 0xECF5, 0xED66, \n0xEDD9, 0xEE4B, 0xEEBD, 0xEF2F, 0xEFA2, 0xF014, 0xF087, 0xF0FA, \n0xF16D, 0xF1E0, 0xF253, 0xF2C6, 0xF339, 0xF3AD, 0xF420, 0xF494, \n0xF507, 0xF57B, 0xF5EF, 0xF663, 0xF6D7, 0xF74C, 0xF7C0, 0xF834, \n0xF8A9, 0xF91E, 0xF992, 0xFA07, 0xFA7C, 0xFAF1, 0xFB66, 0xFBDC, \n0xFC51, 0xFCC7, 0xFD3C, 0xFDB2, 0xFE28, 0xFE9E, 0xFF14, 0xFF8A\n};\n\nstatic const u8 getvoltbl[] = {\n0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, \n0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, \n0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, \n0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, \n0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, \n0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, \n0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, \n0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, \n0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, \n0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, \n0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, \n0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, \n0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, \n0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, \n0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14, \n0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, \n0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C, \n0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, \n0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29, \n0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31, \n0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B, \n0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47, \n0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55, \n0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67, \n0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B, \n0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, \n0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, \n0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36, \n0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40, \n0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D, \n0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, \n0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70, \n0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43, \n0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, \n0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, \n0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75, \n0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46, \n0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, \n0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66, \n0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, \n0x7C, 0x7D, 0x7E, 0x7F\n};\n\nTEMPLATE static u32 bios_nop()\n{\n\tLOG(\"SWI: ARM%c Unimplemented BIOS function %02X was used. R0:%08X, R1:%08X, R2:%08X\\n\", PROCNUM?'7':'9',\n\t\t\t\t\t\t\t(cpu->instruction)&0x1F, cpu->R[0], cpu->R[1], cpu->R[2]);\n\treturn 3;\n}\n\nTEMPLATE static u32 WaitByLoop()\n{\n\tu32 elapsed;\n\t\n\t//printf(\"%lld waitbyloop\\n\",nds_timer);\n\t//INFO(\"ARM%c: SWI 0x03 (WaitByLoop)\\n\", PROCNUM?'7':'9');\n\tif (PROCNUM == ARMCPU_ARM9)\n\t{\n\t\tif (cp15.ctrl & ((1<<16)|(1<<18)))\t\t// DTCM or ITCM is on (cache)\n\t\t\telapsed = cpu->R[0] * 2;\n\t\telse\n\t\t\telapsed = cpu->R[0] * 8;\n\t}\n\telse\n\t\telapsed = cpu->R[0] * 4;\n\tcpu->R[0] = 0;\n\treturn elapsed;\n}\n\nTEMPLATE static u32 wait4IRQ()\n{\n   \tcpu->waitIRQ = TRUE;\n\tcpu->halt_IE_and_IF = TRUE;\n\treturn 1;\n}\n\nTEMPLATE static u32 intrWaitARM()\n{\n\t//TODO - account for differences between arm7 and arm9 (according to gbatek, the \"bug doesn't work\")\n\n\tconst u32 intrFlagAdr = (PROCNUM == ARMCPU_ARM7)\n\t\t? 0x380FFF8\n\t\t: (cp15.DTCMRegion&0xFFFFF000)+0x3FF8;\n\n\t//set IME=1\n\t//without this, no irq handlers can happen (even though IF&IE waits can happily happen)\n\t//and so no bits in the OS irq flag variable can get set by the handlers\n\t_MMU_write32<PROCNUM>(0x04000208, 1); \n\n\t//analyze the OS irq flag variable\n\tu32 intr = _MMU_read32<PROCNUM>(intrFlagAdr);\n\tu32 intrFlag = (cpu->R[1] & intr);\n\n\t//if the user requested us to discard flags, then clear the flag(s) we're going to be waiting on.\n\t//(be sure to only do this only on the first run through. use a little state machine to control that)\n\tif(cpu->intrWaitARM_state==0 && cpu->R[0]==1)\n\t{\n\t\tintr ^= intrFlag;\n\t\t_MMU_write32<PROCNUM>(intrFlagAdr, intr);\n\n\t\t//we want to make sure we wait at least once below\n\t\tintrFlag = 0;\n\t}\n\n\tcpu->intrWaitARM_state = 1;\n\n\t//now, if the condition is satisfied (and it won't be the first time through, no matter what, due to cares taken above)\n\tif(intrFlag)\n\t{\n\t\t//write back the OS irq flags with the ones we were waiting for cleared\n\t\tintr ^= intrFlag;\n\t\t_MMU_write32<PROCNUM>(intrFlagAdr, intr);\n\n\t\tcpu->intrWaitARM_state = 0;\n\t\treturn 1;\n\t}\n\n\t//the condition wasn't satisfied. this means that we need to halt, wait for some enabled interrupt,\n\t//and then ensure that we return to this opcode again to check the condition again\n\tcpu->waitIRQ = TRUE;\n\tcpu->halt_IE_and_IF = TRUE;\n\n\t//(rewire PC to jump back to this opcode)\n\tu32 instructAddr = cpu->instruct_adr;\n\tcpu->R[15] = instructAddr;\n\tcpu->next_instruction = instructAddr;\n\treturn 1;\n}\n\nTEMPLATE static u32 waitVBlankARM()\n{\n\tcpu->R[0] = 1;\n\tcpu->R[1] = 1;\n\treturn intrWaitARM<PROCNUM>();\n}\n\nTEMPLATE static u32 sleep()\n{\n\t_MMU_write08<PROCNUM>(0x04000301, 0xC0);\n\treturn 1;\n}\n\nTEMPLATE static u32 divide()\n{\n     s32 num = (s32)cpu->R[0];\n     s32 dnum = (s32)cpu->R[1];\n     \n     if(dnum==0) return 0;\n     \n\t s32 res = num / dnum;\n     cpu->R[0] = (u32)res;\n     cpu->R[1] = (u32)(num % dnum);\n     cpu->R[3] = (u32)abs(res);\n\n\t //INFO(\"ARM%c: SWI 0x09 (divide): in num %i, dnum %i, out R0:%i, R1:%i, R3:%i\\n\", PROCNUM?'7':'9', num, dnum, cpu->R[0], cpu->R[1], cpu->R[3]);\n\n     return 6;\n}\n\nTEMPLATE static u32 copy()\n{\n     u32 src = cpu->R[0];\n     u32 dst = cpu->R[1];\n     u32 cnt = cpu->R[2];\n\n\t //INFO(\"swi copy from %08X to %08X, cnt=%08X\\n\", src, dst, cnt);\n\n     switch(BIT26(cnt))\n     {\n          case 0:\n               src &= 0xFFFFFFFE;\n               dst &= 0xFFFFFFFE;\n               switch(BIT24(cnt))\n               {\n                    case 0:\n                         cnt &= 0x1FFFFF;\n                         while(cnt)\n                         {\n                              _MMU_write16<PROCNUM>(dst, _MMU_read16<PROCNUM>(src));\n                              cnt--;\n                              dst+=2;\n                              src+=2;\n                         }\n                         break;\n                    case 1:\n                         {\n                              u16 val = _MMU_read16<PROCNUM>(src);\n                              cnt &= 0x1FFFFF;\n                              while(cnt)\n                              {\n                                   _MMU_write16<PROCNUM>(dst, val);\n                                   cnt--;\n                                   dst+=2;\n                              }\n                         }\n                         break;\n               }\n               break;\n          case 1:\n               src &= 0xFFFFFFFC;\n               dst &= 0xFFFFFFFC;\n               switch(BIT24(cnt))\n               {\n                    case 0:\n                         cnt &= 0x1FFFFF;\n                         while(cnt)\n                         {\n                              _MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));\n                              cnt--;\n                              dst+=4;\n                              src+=4;\n                         }\n                         break;\n                    case 1:\n                         {\n                              u32 val = _MMU_read32<PROCNUM>(src);\n                              cnt &= 0x1FFFFF;\n                              while(cnt)\n                              {\n                                   _MMU_write32<PROCNUM>(dst, val);\n                                   cnt--;\n                                   dst+=4;\n                              }\n                         }\n                         break;\n               }\n               break;\n     }\n     return 1;\n}\n\nTEMPLATE static u32 fastCopy()\n{\n     u32 src = cpu->R[0] & 0xFFFFFFFC;\n     u32 dst = cpu->R[1] & 0xFFFFFFFC;\n     u32 cnt = cpu->R[2];\n\n\t //INFO(\"swi fastcopy from %08X to %08X, cnt=%08X\\n\", src, dst, cnt);\n\n     switch(BIT24(cnt))\n     {\n          case 0:\n               cnt &= 0x1FFFFF;\n               while(cnt)\n               {\n                    _MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));\n                    cnt--;\n                    dst+=4;\n                    src+=4;\n               }\n               break;\n          case 1:\n               {\n                    u32 val = _MMU_read32<PROCNUM>(src);\n                    cnt &= 0x1FFFFF;\n                    while(cnt)\n                    {\n                         _MMU_write32<PROCNUM>(dst, val);\n                         cnt--;\n                         dst+=4;\n                    }\n               }\n               break;\n     }\n     return 1;\n}\n\nTEMPLATE static u32 LZ77UnCompVram()\n{\n  int i1, i2;\n  int byteCount;\n  int byteShift;\n  u32 writeValue;\n  int len;\n  u32 source = cpu->R[0];\n  u32 dest = cpu->R[1];\n  u32 header = _MMU_read32<PROCNUM>(source);\n  source += 4;\n\n  //INFO(\"swi lz77uncompvram\\n\");\n\n  if(((source & 0xe000000) == 0) ||\n     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)\n    return 0;    \n\n  byteCount = 0;\n  byteShift = 0;\n  writeValue = 0;\n\n  len = header >> 8;\n\n  while(len > 0) {\n    u8 d = _MMU_read08<PROCNUM>(source++);\n\n    if(d) {\n      for(i1 = 0; i1 < 8; i1++) {\n        if(d & 0x80) {\n          int length;\n          int offset;\n          u32 windowOffset;\n          u16 data = _MMU_read08<PROCNUM>(source++) << 8;\n          data |= _MMU_read08<PROCNUM>(source++);\n          length = (data >> 12) + 3;\n          offset = (data & 0x0FFF);\n          windowOffset = dest + byteCount - offset - 1;\n          for(i2 = 0; i2 < length; i2++) {\n            writeValue |= (_MMU_read08<PROCNUM>(windowOffset++) << byteShift);\n            byteShift += 8;\n            byteCount++;\n\n            if(byteCount == 2) {\n              _MMU_write16<PROCNUM>(dest, writeValue);\n              dest += 2;\n              byteCount = 0;\n              byteShift = 0;\n              writeValue = 0;\n            }\n            len--;\n            if(len == 0)\n              return 0;\n          }\n        } else {\n          writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);\n          byteShift += 8;\n          byteCount++;\n          if(byteCount == 2) {\n            _MMU_write16<PROCNUM>(dest, writeValue);\n            dest += 2;\n            byteCount = 0;\n            byteShift = 0;\n            writeValue = 0;\n          }\n          len--;\n          if(len == 0)\n            return 0;\n        }\n        d <<= 1;\n      }\n    } else {\n      for(i1 = 0; i1 < 8; i1++) {\n        writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);\n        byteShift += 8;\n        byteCount++;\n        if(byteCount == 2) {\n          _MMU_write16<PROCNUM>(dest, writeValue);\n          dest += 2;      \n          byteShift = 0;\n          byteCount = 0;\n          writeValue = 0;\n        }\n        len--;\n        if(len == 0)\n          return 0;\n      }\n    }\n  }\n  return 1;\n}\n\nTEMPLATE static u32 LZ77UnCompWram()\n{\n  int i1, i2;\n  int len;\n  u32 source = cpu->R[0];\n  u32 dest = cpu->R[1];\n\n  u32 header = _MMU_read32<PROCNUM>(source);\n  source += 4;\n\n  //INFO(\"swi lz77uncompwram\\n\");\n\n  if(((source & 0xe000000) == 0) ||\n     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)\n    return 0;  \n  \n  len = header >> 8;\n\n  while(len > 0) {\n    u8 d = _MMU_read08<PROCNUM>(source++);\n\n    if(d) {\n      for(i1 = 0; i1 < 8; i1++) {\n        if(d & 0x80) {\n          int length;\n          int offset;\n          u32 windowOffset;\n          u16 data = _MMU_read08<PROCNUM>(source++) << 8;\n          data |= _MMU_read08<PROCNUM>(source++);\n          length = (data >> 12) + 3;\n          offset = (data & 0x0FFF);\n          windowOffset = dest - offset - 1;\n          for(i2 = 0; i2 < length; i2++) {\n            _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(windowOffset++));\n            len--;\n            if(len == 0)\n              return 0;\n          }\n        } else {\n          _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));\n          len--;\n          if(len == 0)\n            return 0;\n        }\n        d <<= 1;\n      }\n    } else {\n      for(i1 = 0; i1 < 8; i1++) {\n        _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));\n        len--;\n        if(len == 0)\n          return 0;\n      }\n    }\n  }\n  return 1;\n}\n\nTEMPLATE static u32 RLUnCompVram()\n{\n  int i;\n  int len;\n  int byteCount;\n  int byteShift;\n  u32 writeValue;\n  u32 source = cpu->R[0];\n  u32 dest = cpu->R[1];\n\n  u32 header = _MMU_read32<PROCNUM>(source);\n  source += 4;\n\n  //INFO(\"swi rluncompvram\\n\");\n\n  if(((source & 0xe000000) == 0) ||\n     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)\n    return 0;  \n  \n  len = header >> 8;\n  byteCount = 0;\n  byteShift = 0;\n  writeValue = 0;\n\n  while(len > 0) {\n    u8 d = _MMU_read08<PROCNUM>(source++);\n    int l = d & 0x7F;\n    if(d & 0x80) {\n      u8 data = _MMU_read08<PROCNUM>(source++);\n      l += 3;\n      for(i = 0;i < l; i++) {\n        writeValue |= (data << byteShift);\n        byteShift += 8;\n        byteCount++;\n\n        if(byteCount == 2) {\n          _MMU_write16<PROCNUM>(dest, writeValue);\n          dest += 2;\n          byteCount = 0;\n          byteShift = 0;\n          writeValue = 0;\n        }\n        len--;\n        if(len == 0)\n          return 0;\n      }\n    } else {\n      l++;\n      for(i = 0; i < l; i++) {\n        writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);\n        byteShift += 8;\n        byteCount++;\n        if(byteCount == 2) {\n          _MMU_write16<PROCNUM>(dest, writeValue);\n          dest += 2;\n          byteCount = 0;\n          byteShift = 0;\n          writeValue = 0;\n        }\n        len--;\n        if(len == 0)\n          return 0;\n      }\n    }\n  }\n  return 1;\n}\n\nTEMPLATE static u32 RLUnCompWram()\n{\n  int i;\n  int len;\n  u32 source = cpu->R[0];\n  u32 dest = cpu->R[1];\n\n  u32 header = _MMU_read32<PROCNUM>(source);\n  source += 4;\n\n  //INFO(\"swi rluncompwram\\n\");\n\n  if(((source & 0xe000000) == 0) ||\n     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)\n    return 0;  \n  \n  len = header >> 8;\n\n  while(len > 0) {\n    u8 d = _MMU_read08<PROCNUM>(source++);\n    int l = d & 0x7F;\n    if(d & 0x80) {\n      u8 data = _MMU_read08<PROCNUM>(source++);\n      l += 3;\n      for(i = 0;i < l; i++) {\n        _MMU_write08<PROCNUM>(dest++, data);\n        len--;\n        if(len == 0)\n          return 0;\n      }\n    } else {\n      l++;\n      for(i = 0; i < l; i++) {\n        _MMU_write08<PROCNUM>(dest++,  _MMU_read08<PROCNUM>(source++));\n        len--;\n        if(len == 0)\n          return 0;\n      }\n    }\n  }\n  return 1;\n}\n\nTEMPLATE static u32 UnCompHuffman()\n{\n  u32 source, dest, writeValue, header, treeStart, mask;\n  u32 data;\n  u8 treeSize, currentNode, rootNode;\n  int byteCount, byteShift, len, pos;\n  int writeData;\n\n  source = cpu->R[0];\n  dest = cpu->R[1];\n\n  header = _MMU_read08<PROCNUM>(source);\n  source += 4;\n\n  //INFO(\"swi uncomphuffman\\n\");\n\n  if(((source & 0xe000000) == 0) ||\n     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)\n    return 0;  \n  \n  treeSize = _MMU_read08<PROCNUM>(source++);\n\n  treeStart = source;\n\n  source += ((treeSize+1)<<1)-1; // minus because we already skipped one byte\n  \n  len = header >> 8;\n\n  mask = 0x80000000;\n  data = _MMU_read08<PROCNUM>(source);\n  source += 4;\n\n  pos = 0;\n  rootNode = _MMU_read08<PROCNUM>(treeStart);\n  currentNode = rootNode;\n  writeData = 0;\n  byteShift = 0;\n  byteCount = 0;\n  writeValue = 0;\n\n  if((header & 0x0F) == 8) {\n    while(len > 0) {\n      // take left\n      if(pos == 0)\n        pos++;\n      else\n        pos += (((currentNode & 0x3F)+1)<<1);\n      \n      if(data & mask) {\n        // right\n        if(currentNode & 0x40)\n          writeData = 1;\n        currentNode = _MMU_read08<PROCNUM>(treeStart+pos+1);\n      } else {\n        // left\n        if(currentNode & 0x80)\n          writeData = 1;\n        currentNode = _MMU_read08<PROCNUM>(treeStart+pos);\n      }\n      \n      if(writeData) {\n        writeValue |= (currentNode << byteShift);\n        byteCount++;\n        byteShift += 8;\n\n        pos = 0;\n        currentNode = rootNode;\n        writeData = 0;\n\n        if(byteCount == 4) {\n          byteCount = 0;\n          byteShift = 0;\n          _MMU_write08<PROCNUM>(dest, writeValue);\n          writeValue = 0;\n          dest += 4;\n          len -= 4;\n        }\n      }\n      mask >>= 1;\n      if(mask == 0) {\n        mask = 0x80000000;\n        data = _MMU_read08<PROCNUM>(source);\n        source += 4;\n      }\n    }\n  } else {\n    int halfLen = 0;\n    int value = 0;\n    while(len > 0) {\n      // take left\n      if(pos == 0)\n        pos++;\n      else\n        pos += (((currentNode & 0x3F)+1)<<1);\n\n      if((data & mask)) {\n        // right\n        if(currentNode & 0x40)\n          writeData = 1;\n        currentNode = _MMU_read08<PROCNUM>(treeStart+pos+1);\n      } else {\n        // left\n        if(currentNode & 0x80)\n          writeData = 1;\n        currentNode = _MMU_read08<PROCNUM>(treeStart+pos);\n      }\n      \n      if(writeData) {\n        if(halfLen == 0)\n          value |= currentNode;\n        else\n          value |= (currentNode<<4);\n\n        halfLen += 4;\n        if(halfLen == 8) {\n          writeValue |= (value << byteShift);\n          byteCount++;\n          byteShift += 8;\n          \n          halfLen = 0;\n          value = 0;\n\n          if(byteCount == 4) {\n            byteCount = 0;\n            byteShift = 0;\n            _MMU_write08<PROCNUM>(dest, writeValue);\n            dest += 4;\n            writeValue = 0;\n            len -= 4;\n          }\n        }\n        pos = 0;\n        currentNode = rootNode;\n        writeData = 0;\n      }\n      mask >>= 1;\n      if(mask == 0) {\n        mask = 0x80000000;\n        data = _MMU_read08<PROCNUM>(source);\n        source += 4;\n      }\n    }    \n  }\n  return 1;\n}\n\nTEMPLATE static u32 BitUnPack()\n{\n  u32 source,dest,header,base,d,temp;\n  int len,bits,revbits,dataSize,data,bitwritecount,mask,bitcount,addBase;\n  u8 b;\n\n  source = cpu->R[0];\n  dest = cpu->R[1];\n  header = cpu->R[2];\n\n  len = _MMU_read16<PROCNUM>(header);\n  bits = _MMU_read08<PROCNUM>(header+2);\n  switch (bits)\n  {\n\tcase 1:\n\tcase 2:\n\tcase 4:\n\tcase 8:\n\t  break;\n\tdefault: return (0);\t// error\n  }\n  dataSize = _MMU_read08<PROCNUM>(header+3);\n  switch (dataSize)\n  {\n\tcase 1:\n\tcase 2:\n\tcase 4:\n\tcase 8:\n\tcase 16:\n\tcase 32:\n\t  break;\n\tdefault: return (0);\t// error\n  }\n\n  revbits = 8 - bits; \n  // u32 value = 0;\n  base = _MMU_read08<PROCNUM>(header+4);\n  addBase = (base & 0x80000000) ? 1 : 0;\n  base &= 0x7fffffff;\n  \n  //INFO(\"SWI10: bitunpack src 0x%08X dst 0x%08X hdr 0x%08X (src len %05i src bits %02i dst bits %02i)\\n\\n\", source, dest, header, len, bits, dataSize);\n\n  data = 0; \n  bitwritecount = 0; \n  while(1) {\n    len -= 1;\n    if(len < 0)\n      break;\n    mask = 0xff >> revbits; \n    b = _MMU_read08<PROCNUM>(source); \n    source++;\n    bitcount = 0;\n    while(1) {\n      if(bitcount >= 8)\n        break;\n      d = b & mask;\n      temp = d >> bitcount;\n      if(!temp && addBase) {\n        temp += base;\n      }\n      data |= temp << bitwritecount;\n      bitwritecount += dataSize;\n      if(bitwritecount >= 32) {\n        _MMU_write08<PROCNUM>(dest, data);\n        dest += 4;\n        data = 0;\n        bitwritecount = 0;\n      }\n      mask <<= bits;\n      bitcount += bits;\n    }\n  }\n  return 1;\n}\n\nTEMPLATE static u32 Diff8bitUnFilterWram()\n{\n  u32 source,dest,header;\n  u8 data,diff;\n  int len;\n\n  source = cpu->R[0];\n  dest = cpu->R[1];\n\n  header = _MMU_read08<PROCNUM>(source);\n  source += 4;\n\n  //INFO(\"swi diff8bitunfilterwram\\n\");\n\n  if(((source & 0xe000000) == 0) ||\n     (( (source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0))\n    return 0;  \n\n  len = header >> 8;\n\n  data = _MMU_read08<PROCNUM>(source++);\n  _MMU_write08<PROCNUM>(dest++, data);\n  len--;\n  \n  while(len > 0) {\n    diff = _MMU_read08<PROCNUM>(source++);\n    data += diff;\n    _MMU_write08<PROCNUM>(dest++, data);\n    len--;\n  }\n  return 1;\n}\n\nTEMPLATE static u32 Diff16bitUnFilter()\n{\n  u32 source,dest,header;\n  u16 data;\n  int len;\n\n  source = cpu->R[0];\n  dest = cpu->R[1];\n\n  //INFO(\"swi diff16bitunfilter\\n\");\n\n  header = _MMU_read08<PROCNUM>(source);\n  source += 4;\n\n  if(((source & 0xe000000) == 0) ||\n     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)\n    return 0;  \n  \n  len = header >> 8;\n\n  data = _MMU_read16<PROCNUM>(source);\n  source += 2;\n  _MMU_write16<PROCNUM>(dest, data);\n  dest += 2;\n  len -= 2;\n  \n  while(len >= 2) {\n    u16 diff = _MMU_read16<PROCNUM>(source);\n    source += 2;\n    data += diff;\n    _MMU_write16<PROCNUM>(dest, data);\n    dest += 2;\n    len -= 2;\n  }\n  return 1;\n}\n\nTEMPLATE static u32 bios_sqrt()\n{\n     cpu->R[0] = (u32)sqrt((double)(cpu->R[0]));\n     return 1;\n}\n\nTEMPLATE static u32 setHaltCR()\n{ \n     _MMU_write08<PROCNUM>(0x4000300+cpu->proc_ID, cpu->R[0]);\n     return 1;\n}\n\nTEMPLATE static u32 getSineTab()\n{\n\t//ds returns garbage according to gbatek, but we must protect ourselves\n\tif(cpu->R[0] >= ARRAY_SIZE(getsinetbl))\n\t{\n\t\tprintf(\"Invalid SWI getSineTab: %08X\\n\",cpu->R[0]);\n\t\treturn 1;\n\t}\n\n\n\tcpu->R[0] = getsinetbl[cpu->R[0]];\n\treturn 1;\n}\n\nTEMPLATE static u32 getPitchTab()\n{ \n\t//ds returns garbage according to gbatek, but we must protect ourselves\n\tif(cpu->R[0] >= ARRAY_SIZE(getpitchtbl))\n\t{\n\t\tprintf(\"Invalid SWI getPitchTab: %08X\\n\",cpu->R[0]);\n\t\treturn 1;\n\t}\n\n\tcpu->R[0] = getpitchtbl[cpu->R[0]];\n\treturn 1;\n}\n\nTEMPLATE static u32 getVolumeTab()\n{ \n\t//ds returns garbage according to gbatek, but we must protect ourselves\n\tif(cpu->R[0] >= ARRAY_SIZE(getvoltbl))\n\t{\n\t\tprintf(\"Invalid SWI getVolumeTab: %08X\\n\",cpu->R[0]);\n\t\treturn 1;\n\t}\n\n\n    cpu->R[0] = getvoltbl[cpu->R[0]];\n    return 1;\n}\n\n\n//TEMPLATE static u32 getCRC16_old(u32 crc, u32 datap, u32 size)\n//{\n//  unsigned int i,j;\n//   \n//  const u16 val[] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 };\n//  for(i = 0; i < size; i++)\n//  {\n//    crc = crc ^ _MMU_read08<PROCNUM>(datap + i);\n//\n//    for(j = 0; j < 8; j++) {\n//      int do_bit = 0;\n//\n//      if ( crc & 0x1)\n//        do_bit = 1;\n//\n//      crc = crc >> 1;\n//\n//      if ( do_bit) {\n//        crc = crc ^ (val[j] << (7-j));\n//      }\n//    }\n//  }\n//  return crc;\n//}\n\nTEMPLATE static u32 getCRC16()\n{\n\t//gbatek is wrong.\n\n\t//dawn of sorrow uses this to checksum its save data;\n\t//if this implementation is wrong, then it won't match what the real bios returns, \n\t//and savefiles created with a bios will be invalid when loaded with non-bios (and vice-versa)\n\n\t//u32 old = getCRC16_old<PROCNUM>(cpu->R[0],cpu->R[1],cpu->R[2]);\n\n\tu16 crc = (u16)cpu->R[0];\n\tu32 datap = cpu->R[1];\n\tu32 size = cpu->R[2]>>1;\n\tu16 currVal = 0;\n\n\tconst u16 val[] = { 0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400};\n\n\tfor(u32 i = 0; i < size; i++)\n\t{\n\t\tcurrVal = _MMU_read16<PROCNUM>(datap + i*2);\n\n\t\tfor(int j=0;j<4;j++)\n\t\t{\n\t\t\tu16 tabVal = val[crc&0xF];\n\t\t\tcrc >>= 4;\n\t\t\tcrc ^= tabVal;\n\n\t\t\tu16 tempVal = currVal >> (4*j);\n\t\t\ttabVal = val[tempVal&0xF];\n\t\t\tcrc ^= tabVal;\n\t\t}\n\t}\n\n\tcpu->R[0] = crc;\n\t// R3 contains the last processed halfword \n\tcpu->R[3] = currVal;\n\treturn 1;\n}\n\nTEMPLATE static u32 isDebugger()\n{\n\t//gbatek has additional specifications which are not emulated here\n\tif(nds.Is_DebugConsole())\n\t\tcpu->R[0] = 1;\n\telse\n\t\tcpu->R[0] = 0;\n\treturn 1;\n}\n\nTEMPLATE static u32 SoundBias()\n{\n     u32 curBias = _MMU_read32<ARMCPU_ARM7>(0x04000504);\n\t u32 newBias = (curBias == 0) ? 0x000:0x200;\n\t u32 delay = (newBias > curBias) ? (newBias-curBias) : (curBias-newBias);\n\n\t _MMU_write32<ARMCPU_ARM7>(0x04000504, newBias);\n     return cpu->R[1] * delay;\n}\n\nTEMPLATE static u32 getBootProcs()\n{\n\tcpu->R[0] = 0x00000A2E;\n\tcpu->R[1] = 0x00002C3C;\n\tcpu->R[3] = 0x000005FF;\n\treturn 1;\n}\n\nu32 (* ARM_swi_tab[2][32])()={\n\t{\n         bios_nop<ARMCPU_ARM9>,             // 0x00\n         bios_nop<ARMCPU_ARM9>,             // 0x01\n         bios_nop<ARMCPU_ARM9>,             // 0x02\n         WaitByLoop<ARMCPU_ARM9>,           // 0x03\n         intrWaitARM<ARMCPU_ARM9>,          // 0x04\n         waitVBlankARM<ARMCPU_ARM9>,        // 0x05\n         wait4IRQ<ARMCPU_ARM9>,             // 0x06\n         bios_nop<ARMCPU_ARM9>,             // 0x07\n         bios_nop<ARMCPU_ARM9>,             // 0x08\n         divide<ARMCPU_ARM9>,               // 0x09\n         bios_nop<ARMCPU_ARM9>,             // 0x0A\n         copy<ARMCPU_ARM9>,                 // 0x0B\n         fastCopy<ARMCPU_ARM9>,             // 0x0C\n         bios_sqrt<ARMCPU_ARM9>,            // 0x0D\n         getCRC16<ARMCPU_ARM9>,             // 0x0E\n         isDebugger<ARMCPU_ARM9>,           // 0x0F\n         BitUnPack<ARMCPU_ARM9>,            // 0x10\n         LZ77UnCompWram<ARMCPU_ARM9>,       // 0x11\n         LZ77UnCompVram<ARMCPU_ARM9>,       // 0x12\n         UnCompHuffman<ARMCPU_ARM9>,        // 0x13\n         RLUnCompWram<ARMCPU_ARM9>,         // 0x14\n         RLUnCompVram<ARMCPU_ARM9>,         // 0x15\n         Diff8bitUnFilterWram<ARMCPU_ARM9>, // 0x16\n         bios_nop<ARMCPU_ARM9>,             // 0x17\n         Diff16bitUnFilter<ARMCPU_ARM9>,    // 0x18\n         bios_nop<ARMCPU_ARM9>,             // 0x19\n         bios_nop<ARMCPU_ARM9>,             // 0x1A\n         bios_nop<ARMCPU_ARM9>,             // 0x1B\n         bios_nop<ARMCPU_ARM9>,             // 0x1C\n         bios_nop<ARMCPU_ARM9>,             // 0x1D\n         bios_nop<ARMCPU_ARM9>,             // 0x1E\n         setHaltCR<ARMCPU_ARM9>,            // 0x1F\n\t},\n\t{\n         bios_nop<ARMCPU_ARM7>,             // 0x00\n         bios_nop<ARMCPU_ARM7>,             // 0x01\n         bios_nop<ARMCPU_ARM7>,             // 0x02\n         WaitByLoop<ARMCPU_ARM7>,           // 0x03\n         intrWaitARM<ARMCPU_ARM7>,          // 0x04\n         waitVBlankARM<ARMCPU_ARM7>,        // 0x05\n         wait4IRQ<ARMCPU_ARM7>,             // 0x06\n         sleep<ARMCPU_ARM7>,                // 0x07\n         SoundBias<ARMCPU_ARM7>,            // 0x08\n         divide<ARMCPU_ARM7>,               // 0x09\n         bios_nop<ARMCPU_ARM7>,             // 0x0A\n         copy<ARMCPU_ARM7>,                 // 0x0B\n         fastCopy<ARMCPU_ARM7>,             // 0x0C\n         bios_sqrt<ARMCPU_ARM7>,            // 0x0D\n         getCRC16<ARMCPU_ARM7>,             // 0x0E\n\t\t isDebugger<ARMCPU_ARM7>,           // 0x0F\n         BitUnPack<ARMCPU_ARM7>,            // 0x10\n         LZ77UnCompWram<ARMCPU_ARM7>,       // 0x11\n         LZ77UnCompVram<ARMCPU_ARM7>,       // 0x12\n         UnCompHuffman<ARMCPU_ARM7>,        // 0x13\n         RLUnCompWram<ARMCPU_ARM7>,         // 0x14\n         RLUnCompVram<ARMCPU_ARM7>,         // 0x15\n         Diff8bitUnFilterWram<ARMCPU_ARM7>, // 0x16\n         bios_nop<ARMCPU_ARM7>,             // 0x17\n         bios_nop<ARMCPU_ARM7>,             // 0x18\n         bios_nop<ARMCPU_ARM7>,             // 0x19\n         getSineTab<ARMCPU_ARM7>,           // 0x1A\n         getPitchTab<ARMCPU_ARM7>,          // 0x1B\n         getVolumeTab<ARMCPU_ARM7>,         // 0x1C\n         getBootProcs<ARMCPU_ARM7>,         // 0x1D\n         bios_nop<ARMCPU_ARM7>,             // 0x1E\n         setHaltCR<ARMCPU_ARM7>,            // 0x1F\n\t}\n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/bios.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef BIOS_H\n#define BIOS_H\n\n#include \"armcpu.h\"\n\nextern u32 (* ARM_swi_tab[2][32])();;\n\n#endif\n \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/bits.h",
    "content": "#ifndef BITS_H\n#define BITS_H\n\n#define BIT(n)  (1<<(n))\n\n#define BIT_N(i,n)  (((i)>>(n))&1)\n#define BIT0(i)     ((i)&1)\n#define BIT1(i)     BIT_N(i,1)\n#define BIT2(i)     BIT_N(i,2)\n#define BIT3(i)     BIT_N(i,3)\n#define BIT4(i)     BIT_N(i,4)\n#define BIT5(i)     BIT_N(i,5)\n#define BIT6(i)     BIT_N(i,6)\n#define BIT7(i)     BIT_N(i,7)\n#define BIT8(i)     BIT_N(i,8)\n#define BIT9(i)     BIT_N(i,9)\n#define BIT10(i)     BIT_N(i,10)\n#define BIT11(i)     BIT_N(i,11)\n#define BIT12(i)     BIT_N(i,12)\n#define BIT13(i)     BIT_N(i,13)\n#define BIT14(i)     BIT_N(i,14)\n#define BIT15(i)     BIT_N(i,15)\n#define BIT16(i)     BIT_N(i,16)\n#define BIT17(i)     BIT_N(i,17)\n#define BIT18(i)     BIT_N(i,18)\n#define BIT19(i)     BIT_N(i,19)\n#define BIT20(i)     BIT_N(i,20)\n#define BIT21(i)     BIT_N(i,21)\n#define BIT22(i)     BIT_N(i,22)\n#define BIT23(i)     BIT_N(i,23)\n#define BIT24(i)     BIT_N(i,24)\n#define BIT25(i)     BIT_N(i,25)\n#define BIT26(i)     BIT_N(i,26)\n#define BIT27(i)     BIT_N(i,27)\n#define BIT28(i)     BIT_N(i,28)\n#define BIT29(i)     BIT_N(i,29)\n#define BIT30(i)     BIT_N(i,30)\n#define BIT31(i)    ((i)>>31)\n\n#define CONDITION(i)  (i)>>28\n\n#define REG_POS(i,n)         (((i)>>n)&0xF)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/build.bat",
    "content": "configure\nmake clean\nmake\npause"
  },
  {
    "path": "app/src/main/jni/desmume/src/cheatSystem.cpp",
    "content": "/*\n\tCopyright (C) 2009-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <string.h>\n#include \"cheatSystem.h\"\n#include \"NDSSystem.h\"\n#include \"mem.h\"\n#include \"MMU.h\"\n#include \"debug.h\"\n#include \"utils/xstring.h\"\n\n#ifndef _MSC_VER\n#include <stdint.h>\n#endif\n\nCHEATS *cheats = NULL;\nCHEATSEARCH *cheatSearch = NULL;\n\nvoid CHEATS::clear()\n{\n\tlist.resize(0);\n\tcurrentGet = 0;\n}\n\nvoid CHEATS::init(char *path)\n{\n\tclear();\n\tstrcpy((char *)filename, path);\n\n\tload();\n}\n\nBOOL CHEATS::add(u8 size, u32 address, u32 val, char *description, BOOL enabled)\n{\n\tsize_t num = list.size();\n\tlist.push_back(CHEATS_LIST());\n\tlist[num].code[0][0] = address & 0x00FFFFFF;\n\tlist[num].code[0][1] = val;\n\tlist[num].num = 1;\n\tlist[num].type = 0;\n\tlist[num].size = size;\n\tthis->setDescription(description, num);\n\tlist[num].enabled = enabled;\n\treturn TRUE;\n}\n\nBOOL CHEATS::update(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos)\n{\n\tif (pos >= list.size()) return FALSE;\n\tlist[pos].code[0][0] = address & 0x00FFFFFF;\n\tlist[pos].code[0][1] = val;\n\tlist[pos].num = 1;\n\tlist[pos].type = 0;\n\tlist[pos].size = size;\n\tthis->setDescription(description, pos);\n\tlist[pos].enabled = enabled;\n\treturn TRUE;\n}\n\nvoid CHEATS::ARparser(CHEATS_LIST& list)\n{\n\tu8\ttype = 0;\n\tu8\tsubtype = 0;\n\tu32\thi = 0;\n\tu32\tlo = 0;\n\tu32\taddr = 0;\n\tu32\tval = 0;\n\t// AR temporary vars & flags\n\tu32\toffset = 0;\n\tu32\tdatareg = 0;\n\tu32\tloopcount = 0;\n\tu32\tcounter = 0;\n\tu32\tif_flag = 0;\n\ts32 loopbackline = 0;\n\tu32 loop_flag = 0;\n\t\n\tfor (int i=0; i < list.num; i++)\n\t{\n\t\ttype = list.code[i][0] >> 28;\n\t\tsubtype = (list.code[i][0] >> 24) & 0x0F;\n\n\t\thi = list.code[i][0] & 0x0FFFFFFF;\n\t\tlo = list.code[i][1];\n\n\t\tif (if_flag > 0) \n\t\t{\n\t\t\tif ( (type == 0x0D) && (subtype == 0)) if_flag--;\t// ENDIF\n\t\t\tif ( (type == 0x0D) && (subtype == 2))\t\t\t\t// NEXT & Flush\n\t\t\t{\n\t\t\t\tif (loop_flag)\n\t\t\t\t\ti = (loopbackline-1);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toffset = 0;\n\t\t\t\t\tdatareg = 0;\n\t\t\t\t\tloopcount = 0;\n\t\t\t\t\tcounter = 0;\n\t\t\t\t\tif_flag = 0;\n\t\t\t\t\tloop_flag = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch (type)\n\t\t{\n\t\t\tcase 0x00:\n\t\t\t{\n\t\t\t\tif (hi==0)\n\t\t\t\t{\n\t\t\t\t\t//manual hook\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\tif ((hi==0x0000AA99) && (lo==0))\t// 0000AA99 00000000   parameter bytes 9..10 for above code (padded with 00s)\n\t\t\t\t{\n\t\t\t\t\t//parameter bytes 9..10 for above code (padded with 00s)\n\t\t\t\t}\n\t\t\t\telse\t// 0XXXXXXX YYYYYYYY   word[XXXXXXX+offset] = YYYYYYYY\n\t\t\t\t{\n\t\t\t\t\taddr = hi + offset;\n\t\t\t\t\t_MMU_write32<ARMCPU_ARM9,MMU_AT_DEBUG>(addr, lo);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x01:\t// 1XXXXXXX 0000YYYY   half[XXXXXXX+offset] = YYYY\n\t\t\t\taddr = hi + offset;\n\t\t\t\t_MMU_write16<ARMCPU_ARM9,MMU_AT_DEBUG>(addr, lo);\n\t\t\tbreak;\n\n\t\t\tcase 0x02:\t// 2XXXXXXX 000000YY   byte[XXXXXXX+offset] = YY\n\t\t\t\taddr = hi + offset;\n\t\t\t\t_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(addr, lo);\n\t\t\tbreak;\n\n\t\t\tcase 0x03:\t// 3XXXXXXX YYYYYYYY   IF YYYYYYYY > word[XXXXXXX]   ;unsigned\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( lo > val )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x04:\t// 4XXXXXXX YYYYYYYY   IF YYYYYYYY < word[XXXXXXX]   ;unsigned\n\t\t\t\tif ((hi == 0x04332211) && (lo == 88776655))\t//44332211 88776655   parameter bytes 1..8 for above code  (example)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( lo < val )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x05:\t// 5XXXXXXX YYYYYYYY   IF YYYYYYYY = word[XXXXXXX]\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( lo == val )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x06:\t// 6XXXXXXX YYYYYYYY   IF YYYYYYYY <> word[XXXXXXX]\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( lo != val )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x07:\t// 7XXXXXXX ZZZZYYYY   IF YYYY > ((not ZZZZ) AND half[XXXXXXX])\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read16<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( (lo & 0xFFFF) > ( (~(lo >> 16)) & val) )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x08:\t// 8XXXXXXX ZZZZYYYY   IF YYYY < ((not ZZZZ) AND half[XXXXXXX])\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read16<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( (lo & 0xFFFF) < ( (~(lo >> 16)) & val) )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x09:\t// 9XXXXXXX ZZZZYYYY   IF YYYY = ((not ZZZZ) AND half[XXXXXXX])\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read16<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( (lo & 0xFFFF) == ( (~(lo >> 16)) & val) )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x0A:\t// AXXXXXXX ZZZZYYYY   IF YYYY <> ((not ZZZZ) AND half[XXXXXXX])\n\t\t\t\tif (hi == 0) hi = offset;\t// V1.54+\n\t\t\t\tval = _MMU_read16<ARMCPU_ARM9,MMU_AT_DEBUG>(hi);\n\t\t\t\tif ( (lo & 0xFFFF) != ( (~(lo >> 16)) & val) )\n\t\t\t\t{\n\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif_flag++;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x0B:\t// BXXXXXXX 00000000   offset = word[XXXXXXX+offset]\n\t\t\t\taddr = hi + offset;\n\t\t\t\toffset = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(addr);;\n\t\t\tbreak;\n\n\t\t\tcase 0x0C:\n\t\t\t\tswitch (subtype)\n\t\t\t\t{\n\t\t\t\t\tcase 0x0:\t// C0000000 YYYYYYYY   FOR loopcount=0 to YYYYYYYY  ;execute Y+1 times\n\t\t\t\t\t\tif (loopcount < (lo+1))\n\t\t\t\t\t\t\tloop_flag = 1;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tloop_flag = 0;\n\t\t\t\t\t\tloopcount++;\n\t\t\t\t\t\tloopbackline = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x4:\t// C4000000 00000000   offset = address of the C4000000 code ; V1.54\n\t\t\t\t\t\tprintf(\"AR: untested code C4\\n\");\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x5:\t// C5000000 XXXXYYYY   counter=counter+1, IF (counter AND YYYY) = XXXX ; V1.54\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\tif ( (counter & (lo & 0xFFFF)) == ((lo >> 8) & 0xFFFF) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (if_flag > 0) if_flag--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif_flag++;\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x6:\t// C6000000 XXXXXXXX   [XXXXXXXX]=offset ; V1.54\n\t\t\t\t\t\t_MMU_write32<ARMCPU_ARM9,MMU_AT_DEBUG>(lo, offset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0x0D:\n\t\t\t{\n\t\t\t\tswitch (subtype)\n\t\t\t\t{\n\t\t\t\t\tcase 0x0:\t// D0000000 00000000   ENDIF\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x1:\t// D1000000 00000000   NEXT loopcount\n\t\t\t\t\t\tif (loop_flag)\n\t\t\t\t\t\t\ti = (loopbackline-1);\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x2:\t// D2000000 00000000   NEXT loopcount, and then FLUSH everything\n\t\t\t\t\t\tif (loop_flag)\n\t\t\t\t\t\t\ti = (loopbackline-1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t\tdatareg = 0;\n\t\t\t\t\t\t\tloopcount = 0;\n\t\t\t\t\t\t\tcounter = 0;\n\t\t\t\t\t\t\tif_flag = 0;\n\t\t\t\t\t\t\tloop_flag = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x3:\t// D3000000 XXXXXXXX   offset = XXXXXXXX\n\t\t\t\t\t\toffset = lo;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x4:\t// D4000000 XXXXXXXX   datareg = datareg + XXXXXXXX\n\t\t\t\t\t\tdatareg += lo;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x5:\t// D5000000 XXXXXXXX   datareg = XXXXXXXX\n\t\t\t\t\t\tdatareg = lo;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x6:\t// D6000000 XXXXXXXX   word[XXXXXXXX+offset]=datareg, offset=offset+4\n\t\t\t\t\t\taddr = lo + offset;\n\t\t\t\t\t\t_MMU_write32<ARMCPU_ARM9,MMU_AT_DEBUG>(addr, datareg);\n\t\t\t\t\t\toffset += 4;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x7:\t// D7000000 XXXXXXXX   half[XXXXXXXX+offset]=datareg, offset=offset+2\n\t\t\t\t\t\taddr = lo + offset;\n\t\t\t\t\t\t_MMU_write16<ARMCPU_ARM9,MMU_AT_DEBUG>(addr, datareg);\n\t\t\t\t\t\toffset += 2;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x8:\t// D8000000 XXXXXXXX   byte[XXXXXXXX+offset]=datareg, offset=offset+1\n\t\t\t\t\t\taddr = lo + offset;\n\t\t\t\t\t\t_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(addr, datareg);\n\t\t\t\t\t\toffset += 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0x9:\t// D9000000 XXXXXXXX   datareg = word[XXXXXXXX+offset]\n\t\t\t\t\t\taddr = lo + offset;\n\t\t\t\t\t\tdatareg = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(addr);\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0xA:\t// DA000000 XXXXXXXX   datareg = half[XXXXXXXX+offset]\n\t\t\t\t\t\taddr = lo + offset;\n\t\t\t\t\t\tdatareg = _MMU_read16<ARMCPU_ARM9,MMU_AT_DEBUG>(addr);\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0xB:\t// DB000000 XXXXXXXX   datareg = byte[XXXXXXXX+offset] ;bugged on pre-v1.54\n\t\t\t\t\t\taddr = lo + offset;\n\t\t\t\t\t\tdatareg = _MMU_read08<ARMCPU_ARM9,MMU_AT_DEBUG>(addr);\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 0xC:\t// DC000000 XXXXXXXX   offset = offset + XXXXXXXX\n\t\t\t\t\t\toffset += lo;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0xE:\t\t// EXXXXXXX YYYYYYYY   Copy YYYYYYYY parameter bytes to [XXXXXXXX+offset...]\n\t\t\t{\n\t\t\t\tu8\t*tmp_code = (u8*)(list.code[i+1]);\n\t\t\t\tu32 addr = hi+offset;\n\t\t\t\tu32 maxByteReadLocation = ((2 * 4) * (MAX_XX_CODE - i - 1)) - 1; // 2 = 2 array dimensions, 4 = 4 bytes per array element\n\t\t\t\t\n\t\t\t\tif (lo <= maxByteReadLocation)\n\t\t\t\t{\n\t\t\t\t\tfor (u32 t = 0; t < lo; t++)\n\t\t\t\t\t{\n\t\t\t\t\t\tu8\ttmp = tmp_code[t];\n\t\t\t\t\t\t_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(addr, tmp);\n\t\t\t\t\t\taddr++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ti += (lo / 8);\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 0xF:\t\t// FXXXXXXX YYYYYYYY   Copy YYYYYYYY bytes from [offset..] to [XXXXXXX...]\n\t\t\t\tfor (u32 t = 0; t < lo; t++)\n\t\t\t\t{\n\t\t\t\t\tu8 tmp = _MMU_read08<ARMCPU_ARM9,MMU_AT_DEBUG>(offset+t);\n\t\t\t\t\t_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(hi+t, tmp);\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tdefault: PROGINFO(\"AR: ERROR unknown command 0x%2X at %08X:%08X\\n\", type, hi, lo); break;\n\t\t}\n\t}\n}\n\nBOOL CHEATS::add_AR_Direct(CHEATS_LIST cheat)\n{\n\tsize_t num = list.size();\n\tlist.push_back(cheat);\n\tlist[num].type = 1;\n\treturn TRUE;\n}\n\nBOOL CHEATS::add_AR(const char *code, const char *description, BOOL enabled)\n{\n\t//if (num == MAX_CHEAT_LIST) return FALSE;\n\tsize_t num = list.size();\n\n\tCHEATS_LIST temp;\n\tif (!CHEATS::XXCodeFromString(&temp, code)) return FALSE;\n\n\tlist.push_back(temp);\n\t\n\tlist[num].type = 1;\n\t\n\tthis->setDescription(description, num);\n\tlist[num].enabled = enabled;\n\treturn TRUE;\n}\n\nBOOL CHEATS::update_AR(const char *code, const char *description, BOOL enabled, u32 pos)\n{\n\tif (pos >= list.size()) return FALSE;\n\n\tif (code != NULL)\n\t{\n\t\tif (!CHEATS::XXCodeFromString(this->getItemByIndex(pos), code)) return FALSE;\n\t\tthis->setDescription(description, pos);\n\t\tlist[pos].type = 1;\n\t}\n\t\n\tlist[pos].enabled = enabled;\n\treturn TRUE;\n}\n\nBOOL CHEATS::add_CB(const char *code, const char *description, BOOL enabled)\n{\n\t//if (num == MAX_CHEAT_LIST) return FALSE;\n\tsize_t num = list.size();\n\n\tif (!CHEATS::XXCodeFromString(this->getItemByIndex(num), code)) return FALSE;\n\t\n\tlist[num].type = 2;\n\t\n\tthis->setDescription(description, num);\n\tlist[num].enabled = enabled;\n\treturn TRUE;\n}\n\nBOOL CHEATS::update_CB(const char *code, const char *description, BOOL enabled, u32 pos)\n{\n\tif (pos >= list.size()) return FALSE;\n\n\tif (code != NULL)\n\t{\n\t\tif (!CHEATS::XXCodeFromString(this->getItemByIndex(pos), code)) return FALSE;\n\t\tlist[pos].type = 2;\n\t\tthis->setDescription(description, pos);\n\t}\n\tlist[pos].enabled = enabled;\n\treturn TRUE;\n}\n\nBOOL CHEATS::remove(u32 pos)\n{\n\tif (pos >= list.size()) return FALSE;\n\tif (list.size() == 0) return FALSE;\n\n\tlist.erase(list.begin()+pos);\n\n\treturn TRUE;\n}\n\nvoid CHEATS::getListReset()\n{\n\tcurrentGet = 0;\n\treturn;\n}\n\nBOOL CHEATS::getList(CHEATS_LIST *cheat)\n{\n\tBOOL result = FALSE;\n\t\n\tif (currentGet >= this->list.size()) \n\t{\n\t\tthis->getListReset();\n\t\treturn result;\n\t}\n\t\n\tresult = this->get(cheat, currentGet++);\n\t\n\treturn result;\n}\n\nCHEATS_LIST* CHEATS::getListPtr()\n{\n\treturn &this->list[0];\n}\n\nBOOL CHEATS::get(CHEATS_LIST *cheat, u32 pos)\n{\n\tCHEATS_LIST *item = this->getItemByIndex(pos);\n\tif (item == NULL)\n\t{\n\t\treturn FALSE;\n\t}\n\t\n\t*cheat = *item;\n\t\n\treturn TRUE;\n}\n\nCHEATS_LIST* CHEATS::getItemByIndex(const u32 pos)\n{\n\tif (pos >= this->getSize())\n\t{\n\t\treturn NULL;\n\t}\n\t\n\treturn &this->list[pos];\n}\n\nu32\tCHEATS::getSize()\n{\n\treturn list.size();\n}\n\nvoid CHEATS::setDescription(const char *description, u32 pos)\n{\n\tstrncpy(list[pos].description, description, sizeof(list[pos].description));\n\tlist[pos].description[sizeof(list[pos].description) - 1] = '\\0';\n}\n\nBOOL CHEATS::save()\n{\n\tconst char\t*types[] = {\"DS\", \"AR\", \"CB\"};\n\tstd::string\tcheatLineStr = \"\";\n\tFILE\t\t*flist = fopen((char *)filename, \"w\");\n\n\tif (flist)\n\t{\n\t\tfprintf(flist, \"; DeSmuME cheats file. VERSION %i.%03i\\n\", CHEAT_VERSION_MAJOR, CHEAT_VERSION_MINOR);\n\t\tfprintf(flist, \"Name=%s\\n\", gameInfo.ROMname);\n\t\tfprintf(flist, \"Serial=%s\\n\", gameInfo.ROMserial);\n\t\tfputs(\"\\n; cheats list\\n\", flist);\n\t\tfor (size_t i = 0;  i < list.size(); i++)\n\t\t{\n\t\t\tif (list[i].num == 0) continue;\n\t\t\t\n\t\t\tchar buf1[8] = {0};\n\t\t\tsprintf(buf1, \"%s %c \", types[list[i].type], list[i].enabled?'1':'0');\n\t\t\tcheatLineStr = buf1;\n\t\t\t\n\t\t\tfor (int t = 0; t < list[i].num; t++)\n\t\t\t{\n\t\t\t\tchar buf2[10] = { 0 };\n\n\t\t\t\tu32 adr = list[i].code[t][0];\n\t\t\t\tif (list[i].type == 0)\n\t\t\t\t{\n\t\t\t\t\t//size of the cheat is written out as adr highest nybble\n\t\t\t\t\tadr &= 0x0FFFFFFF;\n\t\t\t\t\tadr |= (list[i].size << 28);\n\t\t\t\t}\n\t\t\t\tsprintf(buf2, \"%08X\", adr);\n\t\t\t\tcheatLineStr += buf2;\n\t\t\t\t\n\t\t\t\tsprintf(buf2, \"%08X\", list[i].code[t][1]);\n\t\t\t\tcheatLineStr += buf2;\n\t\t\t\tif (t < (list[i].num - 1))\n\t\t\t\t\tcheatLineStr += \",\";\n\t\t\t}\n\t\t\t\n\t\t\tcheatLineStr += \" ;\";\n\t\t\tcheatLineStr += trim(list[i].description);\n\t\t\tfprintf(flist, \"%s\\n\", cheatLineStr.c_str());\n\t\t}\n\t\tfputs(\"\\n\", flist);\n\t\tfclose(flist);\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nchar *CHEATS::clearCode(char *s)\n{\n\tchar\t*buf = s;\n\tif (!s) return NULL;\n\tif (!*s) return s;\n\n\tfor (u32 i = 0; i < strlen(s); i++)\n\t{\n\t\tif (s[i] == ';') break;\n\t\tif (strchr(hexValid, s[i]))\n\t\t{\n\t\t\t*buf = s[i];\n\t\t\tbuf++;\n\t\t}\n\t}\n\t*buf = 0;\n\treturn s;\n}\n\nBOOL CHEATS::load()\n{\n\tFILE *flist = fopen((char *)filename, \"r\");\n\tif (flist == NULL)\n\t{\n\t\treturn FALSE;\n\t}\n\t\n\tsize_t readSize = (MAX_XX_CODE * 17) + sizeof(list[0].description) + 7;\n\tif (readSize < CHEAT_FILE_MIN_FGETS_BUFFER)\n\t{\n\t\treadSize = CHEAT_FILE_MIN_FGETS_BUFFER;\n\t}\n\t\n\tchar *buf = (char *)malloc(readSize);\n\tif (buf == NULL)\n\t{\n\t\tfclose(flist);\n\t\treturn FALSE;\n\t}\n\t\n\treadSize *= sizeof(*buf);\n\t\n\tstd::string\t\tcodeStr = \"\";\n\tu32\t\t\t\tlast = 0;\n\tu32\t\t\t\tline = 0;\n\t\n\tINFO(\"Load cheats: %s\\n\", filename);\n\tclear();\n\tlast = 0; line = 0;\n\twhile (!feof(flist))\n\t{\n\t\tCHEATS_LIST\t\ttmp_cht;\n\t\tline++;\t\t\t\t// only for debug\n\t\tmemset(buf, 0, readSize);\n\t\tif (fgets(buf, readSize, flist) == NULL) {\n\t\t\t//INFO(\"Cheats: Failed to read from flist at line %i\\n\", line);\n\t\t\tcontinue;\n\t\t}\n\t\ttrim(buf);\n\t\tif ((strlen(buf) == 0) || (buf[0] == ';')) continue;\n\t\tif(!strncasecmp(buf,\"name=\",5)) continue;\n\t\tif(!strncasecmp(buf,\"serial=\",7)) continue;\n\n\t\tmemset(&tmp_cht, 0, sizeof(tmp_cht));\n\t\tif ((buf[0] == 'D') && (buf[1] == 'S'))\t\t// internal\n\t\t\ttmp_cht.type = 0;\n\t\telse\n\t\t\tif ((buf[0] == 'A') && (buf[1] == 'R'))\t// Action Replay\n\t\t\t\ttmp_cht.type = 1;\n\t\t\telse\n\t\t\t\tif ((buf[0] == 'B') && (buf[1] == 'S'))\t// Codebreaker\n\t\t\t\t\ttmp_cht.type = 2;\n\t\t\t\telse\n\t\t\t\t\tcontinue;\n\t\t// TODO: CB not supported\n\t\tif (tmp_cht.type == 3)\n\t\t{\n\t\t\tINFO(\"Cheats: Codebreaker code no supported at line %i\\n\", line);\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tcodeStr = (char *)(buf + 5);\n\t\tcodeStr = clearCode((char *)codeStr.c_str());\n\t\t\n\t\tif (codeStr.empty() || (codeStr.length() % 16 != 0))\n\t\t{\n\t\t\tINFO(\"Cheats: Syntax error at line %i\\n\", line);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttmp_cht.enabled = (buf[3] == '0')?FALSE:TRUE;\n\t\tu32 descr_pos = (u32)(std::max<s32>(strchr((char*)buf, ';') - buf, 0));\n\t\tif (descr_pos != 0)\n\t\t{\n\t\t\tstrncpy(tmp_cht.description, (buf + descr_pos + 1), sizeof(tmp_cht.description));\n\t\t\ttmp_cht.description[sizeof(tmp_cht.description) - 1] = '\\0';\n\t\t}\n\n\t\ttmp_cht.num = codeStr.length() / 16;\n\t\tif ((tmp_cht.type == 0) && (tmp_cht.num > 1))\n\t\t{\n\t\t\tINFO(\"Cheats: Too many values for internal cheat\\n\", line);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (int i = 0; i < tmp_cht.num; i++)\n\t\t{\n\t\t\tchar tmp_buf[9] = {0};\n\n\t\t\tstrncpy(tmp_buf, &codeStr[i * 16], 8);\n\t\t\tsscanf_s(tmp_buf, \"%x\", &tmp_cht.code[i][0]);\n\n\t\t\tif (tmp_cht.type == 0)\n\t\t\t{\n\t\t\t\ttmp_cht.size = std::min<u32>(3, ((tmp_cht.code[i][0] & 0xF0000000) >> 28));\n\t\t\t\ttmp_cht.code[i][0] &= 0x00FFFFFF;\n\t\t\t}\n\t\t\t\n\t\t\tstrncpy(tmp_buf, &codeStr[(i * 16) + 8], 8);\n\t\t\tsscanf_s(tmp_buf, \"%x\", &tmp_cht.code[i][1]);\n\t\t}\n\n\t\tlist.push_back(tmp_cht);\n\t\tlast++;\n\t}\n\t\n\tfree(buf);\n\tbuf = NULL;\n\n\tfclose(flist);\n\tINFO(\"Added %i cheat codes\\n\", list.size());\n\t\n\treturn TRUE;\n}\n\nvoid CHEATS::process()\n{\n\tif (CommonSettings.cheatsDisable) return;\n\tif (list.size() == 0) return;\n\tsize_t num = list.size();\n\tfor (size_t i = 0; i < num; i++)\n\t{\n\t\tif (!list[i].enabled) continue;\n\n\t\tswitch (list[i].type)\n\t\t{\n\t\t\tcase 0:\t\t// internal cheat system\n\t\t\t{\n\t\t\t\t//INFO(\"list at 0x02|%06X value %i (size %i)\\n\",list[i].code[0], list[i].lo[0], list[i].size);\n\t\t\t\tu32 addr = list[i].code[0][0] | 0x02000000;\n\t\t\t\tu32 val = list[i].code[0][1];\n\t\t\t\tswitch (list[i].size)\n\t\t\t\t{\n\t\t\t\tcase 0: \n\t\t\t\t\t_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(addr,val);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1: \n\t\t\t\t\t_MMU_write16<ARMCPU_ARM9,MMU_AT_DEBUG>(addr,val);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 tmp = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(addr);\n\t\t\t\t\t\ttmp &= 0xFF000000;\n\t\t\t\t\t\ttmp |= (val & 0x00FFFFFF);\n\t\t\t\t\t\t_MMU_write32<ARMCPU_ARM9,MMU_AT_DEBUG>(addr,tmp);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase 3: \n\t\t\t\t\t_MMU_write32<ARMCPU_ARM9,MMU_AT_DEBUG>(addr,val);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} //end case 0 internal cheat system\n\n\t\t\tcase 1:\t\t// Action Replay\n\t\t\t\tARparser(list[i]);\n\t\t\t\tbreak;\n\t\t\tcase 2:\t\t// Codebreaker\n\t\t\t\tbreak;\n\t\t\tdefault: continue;\n\t\t}\n\t}\n}\n\nvoid CHEATS::getXXcodeString(CHEATS_LIST list, char *res_buf)\n{\n\tchar\tbuf[50] = { 0 };\n\n\tfor (int i=0; i < list.num; i++)\n\t{\n\t\tsprintf(buf, \"%08X %08X\\n\", list.code[i][0], list.code[i][1]);\n\t\tstrcat(res_buf, buf);\n\t}\n}\n\nBOOL CHEATS::XXCodeFromString(CHEATS_LIST *cheatItem, const std::string codeString)\n{\n\treturn CHEATS::XXCodeFromString(cheatItem, codeString.c_str());\n}\n\nBOOL CHEATS::XXCodeFromString(CHEATS_LIST *cheatItem, const char *codeString)\n{\n\tBOOL result = FALSE;\n\t\n\tif (cheatItem == NULL || codeString == NULL)\n\t{\n\t\treturn result;\n\t}\n\t\n\tint\t\tcount = 0;\n\tu16\t\tt = 0;\n\tchar\ttmp_buf[sizeof(cheatItem->code) * 2 + 1];\n\tmemset(tmp_buf, 0, sizeof(tmp_buf));\n\t\n\tsize_t code_len = strlen(codeString);\n\t// remove wrong chars\n\tfor (size_t i=0; i < code_len; i++)\n\t{\n\t\tchar c = codeString[i];\n\t\t//apparently 100% of pokemon codes were typed with the letter O in place of zero in some places\n\t\t//so let's try to adjust for that here\n\t\tstatic const char *AR_Valid = \"Oo0123456789ABCDEFabcdef\";\n\t\tif (strchr(AR_Valid, c))\n\t\t{\n\t\t\tif(c=='o' || c=='O') c='0';\n\t\t\ttmp_buf[t++] = c;\n\t\t}\n\t}\n\t\n\tsize_t len = strlen(tmp_buf);\n\tif ((len % 16) != 0) return result;\t\t\t// error\n\t\n\t// TODO: syntax check\n\tcount = (len / 16);\n\tfor (int i=0; i < count; i++)\n\t{\n\t\tchar buf[9] = {0};\n\t\tmemcpy(buf, tmp_buf+(i*16), 8);\n\t\tsscanf(buf, \"%x\", &cheatItem->code[i][0]);\n\t\tmemcpy(buf, tmp_buf+(i*16) + 8, 8);\n\t\tsscanf(buf, \"%x\", &cheatItem->code[i][1]);\n\t}\n\t\n\tcheatItem->num = count;\n\tcheatItem->size = 0;\n\t\n\tresult = TRUE;\n\t\n\treturn result;\n}\n\n// ========================================== search\nBOOL CHEATSEARCH::start(u8 type, u8 size, u8 sign)\n{\n\tif (statMem) return FALSE;\n\tif (mem) return FALSE;\n\n\tstatMem = new u8 [ ( 4 * 1024 * 1024 ) / 8 ];\n\tmemset(statMem, 0xFF, ( 4 * 1024 * 1024 ) / 8);\n\n\t// comparative search type (need 8Mb RAM !!! (4+4))\n\tmem = new u8 [ ( 4 * 1024 * 1024 ) ];\n\tmemcpy(mem, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) );\n\n\t_type = type;\n\t_size = size;\n\t_sign = sign;\n\tamount = 0;\n\tlastRecord = 0;\n\t\n\t//INFO(\"Cheat search system is inited (type %s)\\n\", type?\"comparative\":\"exact\");\n\treturn TRUE;\n}\n\nBOOL CHEATSEARCH::close()\n{\n\tif (statMem)\n\t{\n\t\tdelete [] statMem;\n\t\tstatMem = NULL;\n\t}\n\n\tif (mem)\n\t{\n\t\tdelete [] mem;\n\t\tmem = NULL;\n\t}\n\tamount = 0;\n\tlastRecord = 0;\n\t//INFO(\"Cheat search system is closed\\n\");\n\treturn FALSE;\n}\n\nu32 CHEATSEARCH::search(u32 val)\n{\n\tamount = 0;\n\n\tswitch (_size)\n\t{\n\t\tcase 0:\t\t// 1 byte\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i++)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (1<<offs))\n\t\t\t\t{\n\t\t\t\t\tif ( T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == val )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (1<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(1<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 1:\t\t// 2 bytes\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i+=2)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (3<<offs))\n\t\t\t\t{\n\t\t\t\t\tif ( T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == val )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (3<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(3<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 2:\t\t// 3 bytes\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i+=3)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (0x7<<offs))\n\t\t\t\t{\n\t\t\t\t\tif ( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) == val )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (0x7<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(0x7<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 3:\t\t// 4 bytes\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i+=4)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (0xF<<offs))\n\t\t\t\t{\n\t\t\t\t\tif ( T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == val )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (0xF<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(0xF<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\t}\n\n\treturn (amount);\n}\n\nu32 CHEATSEARCH::search(u8 comp)\n{\n\tBOOL\tres = FALSE;\n\n\tamount = 0;\n\t\n\tswitch (_size)\n\t{\n\t\tcase 0:\t\t// 1 byte\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i++)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (1<<offs))\n\t\t\t\t{\n\t\t\t\t\tswitch (comp)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) > T1ReadByte(mem, i)); break;\n\t\t\t\t\t\tcase 1: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadByte(mem, i)); break;\n\t\t\t\t\t\tcase 2: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadByte(mem, i)); break;\n\t\t\t\t\t\tcase 3: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadByte(mem, i)); break;\n\t\t\t\t\t\tdefault: res = FALSE; break;\n\t\t\t\t\t}\n\t\t\t\t\tif ( res )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (1<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(1<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 1:\t\t// 2 bytes\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i+=2)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (3<<offs))\n\t\t\t\t{\n\t\t\t\t\tswitch (comp)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) > T1ReadWord(mem, i)); break;\n\t\t\t\t\t\tcase 1: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadWord(mem, i)); break;\n\t\t\t\t\t\tcase 2: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadWord(mem, i)); break;\n\t\t\t\t\t\tcase 3: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadWord(mem, i)); break;\n\t\t\t\t\t\tdefault: res = FALSE; break;\n\t\t\t\t\t}\n\t\t\t\t\tif ( res )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (3<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(3<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 2:\t\t// 3 bytes\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i+=3)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (7<<offs))\n\t\t\t\t{\n\t\t\t\t\tswitch (comp)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) > (T1ReadLong(mem, i) & 0x00FFFFFF) ); break;\n\t\t\t\t\t\tcase 1: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) < (T1ReadLong(mem, i) & 0x00FFFFFF) ); break;\n\t\t\t\t\t\tcase 2: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) == (T1ReadLong(mem, i) & 0x00FFFFFF) ); break;\n\t\t\t\t\t\tcase 3: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) != (T1ReadLong(mem, i) & 0x00FFFFFF) ); break;\n\t\t\t\t\t\tdefault: res = FALSE; break;\n\t\t\t\t\t}\n\t\t\t\t\tif ( res )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (7<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(7<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 3:\t\t// 4 bytes\n\t\t\tfor (u32 i = 0; i < (4 * 1024 * 1024); i+=4)\n\t\t\t{\n\t\t\t\tu32\taddr = (i >> 3);\n\t\t\t\tu32\toffs = (i % 8);\n\t\t\t\tif (statMem[addr] & (0xF<<offs))\n\t\t\t\t{\n\t\t\t\t\tswitch (comp)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) > T1ReadLong(mem, i)); break;\n\t\t\t\t\t\tcase 1: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadLong(mem, i)); break;\n\t\t\t\t\t\tcase 2: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadLong(mem, i)); break;\n\t\t\t\t\t\tcase 3: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadLong(mem, i)); break;\n\t\t\t\t\t\tdefault: res = FALSE; break;\n\t\t\t\t\t}\n\t\t\t\t\tif ( res )\n\t\t\t\t\t{\n\t\t\t\t\t\tstatMem[addr] |= (0xF<<offs);\n\t\t\t\t\t\tamount++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstatMem[addr] &= ~(0xF<<offs);\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\t}\n\n\tmemcpy(mem, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) );\n\n\treturn (amount);\n}\n\nu32 CHEATSEARCH::getAmount()\n{\n\treturn (amount);\n}\n\nBOOL CHEATSEARCH::getList(u32 *address, u32 *curVal)\n{\n\tu8\tstep = (_size+1);\n\tu8\tstepMem = 1;\n\tswitch (_size)\n\t{\n\t\tcase 1: stepMem = 0x3; break;\n\t\tcase 2: stepMem = 0x7; break;\n\t\tcase 3: stepMem = 0xF; break;\n\t}\n\n\tfor (u32 i = lastRecord; i < (4 * 1024 * 1024); i+=step)\n\t{\n\t\tu32\taddr = (i >> 3);\n\t\tu32\toffs = (i % 8);\n\t\tif (statMem[addr] & (stepMem<<offs))\n\t\t{\n\t\t\t*address = i;\n\t\t\tlastRecord = i+step;\n\t\t\t\n\t\t\tswitch (_size)\n\t\t\t{\n\t\t\t\tcase 0: *curVal=(u32)T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i); return TRUE;\n\t\t\t\tcase 1: *curVal=(u32)T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i); return TRUE;\n\t\t\t\tcase 2: *curVal=(u32)T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF; return TRUE;\n\t\t\t\tcase 3: *curVal=(u32)T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i); return TRUE;\n\t\t\t\tdefault: return TRUE;\n\t\t\t}\n\t\t}\n\t}\n\tlastRecord = 0;\n\treturn FALSE;\n}\n\nvoid CHEATSEARCH::getListReset()\n{\n\tlastRecord = 0;\n}\n\n// ========================================================================= Export\nvoid CHEATSEXPORT::R4decrypt(u8 *buf, u32 len, u32 n)\n{\n\tsize_t r = 0;\n\twhile (r < len)\n\t{\n\t\tsize_t i ;\n\t\tu16 key = n ^ 0x484A;\n\t\tfor (i = 0 ; i < 512 && i < len - r ; i ++)\n\t\t{\n\t\t\tu8 _xor = 0;\n\t\t\tif (key & 0x4000) _xor |= 0x80;\n\t\t\tif (key & 0x1000) _xor |= 0x40;\n\t\t\tif (key & 0x0800) _xor |= 0x20;\n\t\t\tif (key & 0x0200) _xor |= 0x10;\n\t\t\tif (key & 0x0080) _xor |= 0x08;\n\t\t\tif (key & 0x0040) _xor |= 0x04;\n\t\t\tif (key & 0x0002) _xor |= 0x02;\n\t\t\tif (key & 0x0001) _xor |= 0x01;\n\n\t\t\tu32 k = ((buf[i] << 8) ^ key) << 16;\n\t\t\tu32 x = k;\n\t\t\tfor (u8 j = 1; j < 32; j ++)\n\t\t\t\tx ^= k >> j;\n\t\t\tkey = 0x0000;\n\t\t\tif (BIT_N(x, 23)) key |= 0x8000;\n\t\t\tif (BIT_N(k, 22)) key |= 0x4000;\n\t\t\tif (BIT_N(k, 21)) key |= 0x2000;\n\t\t\tif (BIT_N(k, 20)) key |= 0x1000;\n\t\t\tif (BIT_N(k, 19)) key |= 0x0800;\n\t\t\tif (BIT_N(k, 18)) key |= 0x0400;\n\t\t\tif (BIT_N(k, 17) != BIT_N(x, 31)) key |= 0x0200;\n\t\t\tif (BIT_N(k, 16) != BIT_N(x, 30)) key |= 0x0100;\n\t\t\tif (BIT_N(k, 30) != BIT_N(k, 29)) key |= 0x0080;\n\t\t\tif (BIT_N(k, 29) != BIT_N(k, 28)) key |= 0x0040;\n\t\t\tif (BIT_N(k, 28) != BIT_N(k, 27)) key |= 0x0020;\n\t\t\tif (BIT_N(k, 27) != BIT_N(k, 26)) key |= 0x0010;\n\t\t\tif (BIT_N(k, 26) != BIT_N(k, 25)) key |= 0x0008;\n\t\t\tif (BIT_N(k, 25) != BIT_N(k, 24)) key |= 0x0004;\n\t\t\tif (BIT_N(k, 25) != BIT_N(x, 26)) key |= 0x0002;\n\t\t\tif (BIT_N(k, 24) != BIT_N(x, 25)) key |= 0x0001;\n\t\t\tbuf[i] ^= _xor;\n\t\t}\n\n\t\tbuf+= 512;\n\t\tr  += 512;\n\t\tn  += 1;\n\t}\n}\n\nbool CHEATSEXPORT::load(char *path)\n{\n\terror = 0;\n\n\tfp = fopen(path, \"rb\");\n\tif (!fp)\n\t{\n\t\tprintf(\"Error open database\\n\");\n\t\terror = 1;\n\t\treturn false;\n\t}\n\n\tconst char *headerID = \"R4 CheatCode\";\n\tchar buf[255] = {0};\n\tfread(buf, 1, strlen(headerID), fp);\n\tif (strncmp(buf, headerID, strlen(headerID)) != 0)\n\t{\n\t\t// check encrypted\n\t\tR4decrypt((u8 *)buf, strlen(headerID), 0);\n\t\tif (strcmp(buf, headerID) != 0)\n\t\t{\n\t\t\terror = 2;\n\t\t\treturn false;\n\t\t}\n\t\tencrypted = true;\n\t}\n\n\tfseek(fp, 0, SEEK_END);\n\tfsize = ftell(fp);\n\tfseek(fp, 0, SEEK_SET);\n\n\tif (!search())\n\t{\n\t\tprintf(\"ERROR: cheat in database not found\\n\");\n\t\terror = 3;\n\t\treturn false;\n\t}\n\t\n\tif (!getCodes())\n\t{\n\t\tprintf(\"ERROR: export cheats failed\\n\");\n\t\terror = 4;\n\t\treturn false;\n\t}\n\n\treturn true;\n}\nvoid CHEATSEXPORT::close()\n{\n\tif (fp)\n\t\tfclose(fp);\n\tif (cheats)\n\t{\n\t\tdelete [] cheats;\n\t\tcheats = NULL;\n\t}\n}\n\nbool CHEATSEXPORT::search()\n{\n\tif (!fp) return false;\n\n\tu32\t\tpos = 0x0100;\n\tFAT_R4\tfat_tmp = {0};\n\tu8\t\tbuf[512] = {0};\n\n\tCRC = 0;\n\tencOffset = 0;\n\tu32 t = 0;\n\tmemset(date, 0, sizeof(date));\n\tif (encrypted)\n\t{\n\t\tfseek(fp, 0, SEEK_SET);\n\t\tfread(&buf[0], 1, 512, fp);\n\t\tR4decrypt((u8 *)&buf[0], 512, 0);\n\t\tmemcpy(&date[0], &buf[0x10], 16);\n\t}\n\telse\n\t{\n\t\tfseek(fp, 0x10, SEEK_SET);\n\t\tfread(&date, 16, 1, fp);\n\t\tfseek(fp, pos, SEEK_SET);\n\t\tfread(&fat_tmp, sizeof(fat), 1, fp);\n\t}\n\n\twhile (1)\n\t{\n\t\tif (encrypted)\n\t\t{\n\t\t\tmemcpy(&fat, &buf[pos % 512], sizeof(fat));\n\t\t\tpos += sizeof(fat);\n\t\t\tif ((pos>>9) > t)\n\t\t\t{\n\t\t\t\tt++;\n\t\t\t\tfread(&buf[0], 1, 512, fp);\n\t\t\t\tR4decrypt((u8 *)&buf[0], 512, t);\n\t\t\t}\n\t\t\tmemcpy(&fat_tmp, &buf[pos % 512], sizeof(fat_tmp));\t// next\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmemcpy(&fat, &fat_tmp, sizeof(fat));\n\t\t\tfread(&fat_tmp, sizeof(fat_tmp), 1, fp);\n\t\t\t\n\t\t}\n\t\t//printf(\"serial: %s, offset %08X\\n\", fat.serial, fat.addr);\n\t\tif (memcmp(gameInfo.header.gameCode, &fat.serial[0], 4) == 0)\n\t\t{\n\t\t\tdataSize = fat_tmp.addr?(fat_tmp.addr - fat.addr):0;\n\t\t\tif (encrypted)\n\t\t\t{\n\t\t\t\tencOffset = fat.addr % 512;\n\t\t\t\tdataSize += encOffset;\n\t\t\t}\n\t\t\tif (!dataSize) return false;\n\t\t\tCRC = fat.CRC;\n\t\t\tchar buf[5] = {0};\n\t\t\tmemcpy(&buf, &fat.serial[0], 4);\n\t\t\tprintf(\"Cheats: found %s CRC %08X at 0x%08llX, size %i byte(s)\\n\", buf, fat.CRC, fat.addr, dataSize - encOffset);\n\t\t\treturn true;\n\t\t}\n\n\t\tif (fat.addr == 0) break;\n\t}\n\n\tmemset(&fat, 0, sizeof(FAT_R4));\n\treturn false;\n}\n\nbool CHEATSEXPORT::getCodes()\n{\n\tif (!fp) return false;\n\n\tu32\tpos = 0;\n\tu32\tpos_cht = 0;\n\n\tu8 *data = new u8 [dataSize+8];\n\tif (!data) return false;\n\tmemset(data, 0, dataSize+8);\n\t\n\tfseek(fp, fat.addr - encOffset, SEEK_SET);\n\n\tif (fread(data, 1, dataSize, fp) != dataSize)\n\t{\n\t\tdelete [] data;\n\t\tdata = NULL;\n\t\treturn false;\n\t}\n\n\tif (encrypted)\n\t\tR4decrypt(data, dataSize, fat.addr >> 9);\n\t\n\tintptr_t ptrMask = (~0 << 2);\n\tu8 *gameTitlePtr = (u8 *)data + encOffset;\n\t\n\tmemset(gametitle, 0, CHEAT_DB_GAME_TITLE_SIZE);\n\tmemcpy(gametitle, gameTitlePtr, strlen((const char *)gameTitlePtr));\n\t\n\tu32 *cmd = (u32 *)(((intptr_t)gameTitlePtr + strlen((const char *)gameTitlePtr) + 4) & ptrMask);\n\tnumCheats = cmd[0] & 0x0FFFFFFF;\n\tcmd += 9;\n\tcheats = new CHEATS_LIST[numCheats];\n\tmemset(cheats, 0, sizeof(CHEATS_LIST) * numCheats);\n\n\twhile (pos < numCheats)\n\t{\n\t\tu32 folderNum = 1;\n\t\tu8\t*folderName = NULL;\n\t\tu8\t*folderNote = NULL;\n\t\tif ((*cmd & 0xF0000000) == 0x10000000)\t// Folder\n\t\t{\n\t\t\tfolderNum = (*cmd  & 0x00FFFFFF);\n\t\t\tfolderName = (u8*)((intptr_t)cmd + 4);\n\t\t\tfolderNote = (u8*)((intptr_t)folderName + strlen((char*)folderName) + 1);\n\t\t\tpos++;\n\t\t\tcmd = (u32 *)(((intptr_t)folderName + strlen((char*)folderName) + 1 + strlen((char*)folderNote) + 1 + 3) & ptrMask);\n\t\t}\n\n\t\tfor (u32 i = 0; i < folderNum; i++)\t\t// in folder\n\t\t{\n\t\t\tu8 *cheatName = (u8 *)((intptr_t)cmd + 4);\n\t\t\tu8 *cheatNote = (u8 *)((intptr_t)cheatName + strlen((char*)cheatName) + 1);\n\t\t\tu32 *cheatData = (u32 *)(((intptr_t)cheatNote + strlen((char*)cheatNote) + 1 + 3) & ptrMask);\n\t\t\tu32 cheatDataLen = *cheatData++;\n\t\t\tu32 numberCodes = cheatDataLen / 2;\n\n\t\t\tif (numberCodes <= MAX_XX_CODE)\n\t\t\t{\n\t\t\t\tstd::string descriptionStr = \"\";\n\t\t\t\t\n\t\t\t\tif ( folderName && *folderName )\n\t\t\t\t{\n\t\t\t\t\tdescriptionStr += (char *)folderName;\n\t\t\t\t\tdescriptionStr += \": \";\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdescriptionStr += (char *)cheatName;\n\t\t\t\t\n\t\t\t\tif ( cheatNote && *cheatNote )\n\t\t\t\t{\n\t\t\t\t\tdescriptionStr += \" | \";\n\t\t\t\t\tdescriptionStr += (char *)cheatNote;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tstrncpy(cheats[pos_cht].description, descriptionStr.c_str(), sizeof(cheats[pos_cht].description));\n\t\t\t\tcheats[pos_cht].description[sizeof(cheats[pos_cht].description) - 1] = '\\0';\n\t\t\t\t\n\t\t\t\tcheats[pos_cht].num = numberCodes;\n\t\t\t\tcheats[pos_cht].type = 1;\n\n\t\t\t\tfor(u32 j = 0, t = 0; j < numberCodes; j++, t+=2 )\n\t\t\t\t{\n\t\t\t\t\tcheats[pos_cht].code[j][0] = (u32)*(cheatData+t);\n\t\t\t\t\t//printf(\"%i: %08X \", j, cheats[pos_cht].code[j][0]);\n\t\t\t\t\tcheats[pos_cht].code[j][1] = (u32)*(cheatData+t+1);\n\t\t\t\t\t//printf(\"%08X\\n\", cheats[pos_cht].code[j][1]);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tpos_cht++;\n\t\t\t}\n\n\t\t\tpos++;\n\t\t\tcmd = (u32 *)((intptr_t)cmd + ((*cmd + 1)*4));\n\t\t}\n\t\t\n\t};\n\n\tdelete [] data;\n\n\tnumCheats = pos_cht;\n\t//for (int i = 0; i < numCheats; i++)\n\t//\tprintf(\"%i: %s\\n\", i, cheats[i].description);\n\t\n\treturn true;\n}\n\nCHEATS_LIST *CHEATSEXPORT::getCheats()\n{\n\treturn cheats;\n}\nu32 CHEATSEXPORT::getCheatsNum()\n{\n\treturn numCheats;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/cheatSystem.h",
    "content": "/*\n\tCopyright (C) 2009-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdlib.h>\n#include <string.h>\n#include \"common.h\"\n#include <vector>\n\n#define CHEAT_VERSION_MAJOR\t\t\t2\n#define CHEAT_VERSION_MINOR\t\t\t0\n#define MAX_CHEAT_LIST\t\t\t\t100\n#define\tMAX_XX_CODE\t\t\t\t\t1024\n#define CHEAT_FILE_MIN_FGETS_BUFFER\t32768\n#define CHEAT_DB_GAME_TITLE_SIZE\t256\n\nstruct CHEATS_LIST\n{\n\tCHEATS_LIST()\n\t{\n\t\tmemset(this,0,sizeof(*this));\n\t\ttype = 0xFF;\n\t}\n\tu8\t\ttype;\t\t\t\t// 0 - internal cheat system\n\t\t\t\t\t\t\t\t// 1 - Action Replay\n\t\t\t\t\t\t\t\t// 2 - Codebreakers\n\tBOOL\tenabled;\n\t// TODO\n\tu8\t\tfreezeType;\t\t\t// 0 - normal freeze\n\t\t\t\t\t\t\t\t// 1 - can decrease\n\t\t\t\t\t\t\t\t// 2 - can increase\n\tu32\t\tcode[MAX_XX_CODE][2];\n\tchar\tdescription[1024];\n\tint\t\tnum;\n\tu8\t\tsize;\n};\n\nclass CHEATS\n{\nprivate:\n\tstd::vector<CHEATS_LIST> list;\n\tu8\t\t\t\t\tfilename[MAX_PATH];\n\tu32\t\t\t\t\tcurrentGet;\n\n\tvoid\tclear();\n\tvoid\tARparser(CHEATS_LIST& cheat);\n\tchar\t*clearCode(char *s);\n\npublic:\n\tCHEATS()\n\t\t: currentGet(0)\n\t{\n\t\tmemset(filename, 0, sizeof(filename));\n\t}\n\t~CHEATS() {}\n\n\tvoid\tinit(char *path);\n\tBOOL\tadd(u8 size, u32 address, u32 val, char *description, BOOL enabled);\n\tBOOL\tupdate(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos);\n\tBOOL\tadd_AR(const char *code, const char *description, BOOL enabled);\n\tBOOL\tupdate_AR(const char *code, const char *description, BOOL enabled, u32 pos);\n\tBOOL\tadd_AR_Direct(CHEATS_LIST cheat);\n\tBOOL\tadd_CB(const char *code, const char *description, BOOL enabled);\n\tBOOL\tupdate_CB(const char *code, const char *description, BOOL enabled, u32 pos);\n\tBOOL\tremove(u32 pos);\n\tvoid\tgetListReset();\n\tBOOL\tgetList(CHEATS_LIST *cheat);\n\tCHEATS_LIST*\tgetListPtr();\n\tBOOL\tget(CHEATS_LIST *cheat, u32 pos);\n\tCHEATS_LIST*\tgetItemByIndex(const u32 pos);\n\tu32\t\tgetSize();\n\tvoid\tsetDescription(const char *description, u32 pos);\n\tBOOL\tsave();\n\tBOOL\tload();\n\tvoid\tprocess();\n\tvoid\tgetXXcodeString(CHEATS_LIST cheat, char *res_buf);\n\t\n\tstatic BOOL XXCodeFromString(CHEATS_LIST *cheatItem, const std::string codeString);\n\tstatic BOOL XXCodeFromString(CHEATS_LIST *cheatItem, const char *codeString);\n};\n\nclass CHEATSEARCH\n{\nprivate:\n\tu8\t*statMem;\n\tu8\t*mem;\n\tu32\tamount;\n\tu32\tlastRecord;\n\n\tu32\t_type;\n\tu32\t_size;\n\tu32\t_sign;\n\npublic:\n\tCHEATSEARCH()\n\t\t\t: statMem(0), mem(0), amount(0), lastRecord(0), _type(0), _size(0), _sign(0) \n\t{}\n\t~CHEATSEARCH() { close(); }\n\tBOOL start(u8 type, u8 size, u8 sign);\n\tBOOL close();\n\tu32 search(u32 val);\n\tu32 search(u8 comp);\n\tu32 getAmount();\n\tBOOL getList(u32 *address, u32 *curVal);\n\tvoid getListReset();\n};\n\nenum CHEATS_DB_TYPE\n{\n\tCHEATS_DB_R4 = 0\n};\n\n#pragma pack(push)\n#pragma pack(1)\ntypedef struct FAT_R4\n{\n\tu8\tserial[4];\n\tu32\tCRC;\n\tu64 addr;\n} FAT_R4;\n#pragma pack(pop)\n\nclass CHEATSEXPORT\n{\nprivate:\n\tCHEATS_DB_TYPE\t\ttype;\n\tbool\t\t\t\tencrypted;\n\tFILE\t\t\t\t*fp;\n\tu32\t\t\t\t\tfsize;\n\tu32\t\t\t\t\tdataSize;\n\tu32\t\t\t\t\tencOffset;\n\tFAT_R4\t\t\t\tfat;\n\tbool\t\t\t\tsearch();\n\tbool\t\t\t\tgetCodes();\n\tvoid\t\t\t\tR4decrypt(u8 *buf, u32 len, u32 n);\n\n\tu32\t\t\t\t\tnumCheats;\n\tCHEATS_LIST\t\t\t*cheats;\n\n\tu8\t\t\t\t\terror;\t\t//\t0 - no errors\n\t\t\t\t\t\t\t\t\t//\t1 - open failed/file not found\n\t\t\t\t\t\t\t\t\t//\t2 - file format is wrong (no valid header ID)\n\t\t\t\t\t\t\t\t\t//\t3 - cheat not found in database\n\t\t\t\t\t\t\t\t\t//\t4 - export error from database\n\npublic:\n\tCHEATSEXPORT() :\n\t\t\tfp(NULL),\n\t\t\tfsize(0),\n\t\t\tdataSize(0),\n\t\t\tencOffset(0),\n\t\t\ttype(CHEATS_DB_R4),\n\t\t\tencrypted(false),\n\t\t\tnumCheats(0),\n\t\t\tcheats(0),\n\t\t\tCRC(0),\n\t\t\terror(0)\n\t{\n\t\tmemset(date, 0, sizeof(date));\n\t\tgametitle = (u8 *)malloc(CHEAT_DB_GAME_TITLE_SIZE);\n\t\tmemset(gametitle, 0, CHEAT_DB_GAME_TITLE_SIZE);\n\t}\n\t~CHEATSEXPORT()\n\t{\n\t\tfree(gametitle);\n\t\tgametitle = NULL;\n\t}\n\n\tu8\t\t\t\t*gametitle;\n\tu8\t\t\t\tdate[17];\n\tu32\t\t\t\tCRC;\n\tbool\t\t\tload(char *path);\n\tvoid\t\t\tclose();\n\tCHEATS_LIST\t\t*getCheats();\n\tu32\t\t\t\tgetCheatsNum();\n\tu8\t\t\t\tgetErrorCode() { return error; }\n};\n\nextern CHEATS *cheats;\nextern CHEATSEARCH *cheatSearch;\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/commandline.cpp",
    "content": "/*\r\n\tCopyright (C) 2009-2012 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n//windows note: make sure this file gets compiled with _cdecl\r\n\r\n#include <glib.h>\r\n#include <algorithm>\r\n#include <stdio.h>\r\n#include \"commandline.h\"\r\n#include \"types.h\"\r\n#include \"movie.h\"\r\n#include \"addons.h\"\r\n#include \"slot1.h\"\r\n#include \"NDSSystem.h\"\r\n#include \"utils/xstring.h\"\r\n\r\nint _scanline_filter_a = 0, _scanline_filter_b = 2, _scanline_filter_c = 2, _scanline_filter_d = 4;\r\nint _commandline_linux_nojoy = 0;\r\n\r\nCommandLine::CommandLine()\r\n: is_cflash_configured(false)\r\n, error(NULL)\r\n, ctx(g_option_context_new (\"\"))\r\n, _play_movie_file(0)\r\n, _record_movie_file(0)\r\n, _cflash_image(0)\r\n, _cflash_path(0)\r\n, _gbaslot_rom(0)\r\n, _bios_arm9(NULL)\r\n, _bios_arm7(NULL)\r\n, _bios_swi(0)\r\n, _spu_advanced(0)\r\n, _num_cores(-1)\r\n, _rigorous_timing(0)\r\n, _advanced_timing(-1)\r\n, _slot1(NULL)\r\n, _slot1_fat_dir(NULL)\r\n, _cpu_mode(-1)\r\n, _jit_size(-1)\r\n, _console_type(NULL)\r\n, depth_threshold(-1)\r\n, load_slot(-1)\r\n, arm9_gdb_port(0)\r\n, arm7_gdb_port(0)\r\n, start_paused(FALSE)\r\n, autodetect_method(-1)\r\n{\r\n#ifndef _MSC_VER\r\n\tdisable_sound = 0;\r\n\tdisable_limiter = 0;\r\n#endif\r\n}\r\n\r\nCommandLine::~CommandLine()\r\n{\r\n\tif(error) g_error_free (error);\r\n\tg_option_context_free (ctx);\r\n}\r\n\r\nvoid CommandLine::loadCommonOptions()\r\n{\r\n\t//these options should be available in every port.\r\n\t//my advice is, do not be afraid of using #ifdef here if it makes sense.\r\n\t//but also see the gtk port for an example of how to combine this with other options\r\n\t//(you may need to use ifdefs to cause options to be entered in the desired order)\r\n\tstatic const GOptionEntry options[] = {\r\n\t\t{ \"load-slot\", 0, 0, G_OPTION_ARG_INT, &load_slot, \"Loads savegame from slot NUM\", \"NUM\"},\r\n\t\t{ \"play-movie\", 0, 0, G_OPTION_ARG_FILENAME, &_play_movie_file, \"Specifies a dsm format movie to play\", \"PATH_TO_PLAY_MOVIE\"},\r\n\t\t{ \"record-movie\", 0, 0, G_OPTION_ARG_FILENAME, &_record_movie_file, \"Specifies a path to a new dsm format movie\", \"PATH_TO_RECORD_MOVIE\"},\r\n\t\t{ \"start-paused\", 0, 0, G_OPTION_ARG_NONE, &start_paused, \"Indicates that emulation should start paused\", \"START_PAUSED\"},\r\n\t\t{ \"cflash-image\", 0, 0, G_OPTION_ARG_FILENAME, &_cflash_image, \"Requests cflash in gbaslot with fat image at this path\", \"CFLASH_IMAGE\"},\r\n\t\t{ \"cflash-path\", 0, 0, G_OPTION_ARG_FILENAME, &_cflash_path, \"Requests cflash in gbaslot with filesystem rooted at this path\", \"CFLASH_PATH\"},\r\n\t\t{ \"gbaslot-rom\", 0, 0, G_OPTION_ARG_FILENAME, &_gbaslot_rom, \"Requests this GBA rom in gbaslot\", \"GBASLOT_ROM\"},\r\n\t\t{ \"bios-arm9\", 0, 0, G_OPTION_ARG_FILENAME, &_bios_arm9, \"Uses the arm9 bios provided at the specified path\", \"BIOS_ARM9_PATH\"},\r\n\t\t{ \"bios-arm7\", 0, 0, G_OPTION_ARG_FILENAME, &_bios_arm7, \"Uses the arm7 bios provided at the specified path\", \"BIOS_ARM7_PATH\"},\r\n\t\t{ \"bios-swi\", 0, 0, G_OPTION_ARG_INT, &_bios_swi, \"Uses SWI from the provided bios files\", \"BIOS_SWI\"},\r\n\t\t{ \"spu-advanced\", 0, 0, G_OPTION_ARG_INT, &_spu_advanced, \"Uses advanced SPU capture functions\", \"SPU_ADVANCED\"},\r\n\t\t{ \"num-cores\", 0, 0, G_OPTION_ARG_INT, &_num_cores, \"Override numcores detection and use this many\", \"NUM_CORES\"},\r\n\t\t{ \"scanline-filter-a\", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_a, \"Intensity of fadeout for scanlines filter (topleft) (default 0)\", \"SCANLINE_FILTER_A\"},\r\n\t\t{ \"scanline-filter-b\", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_b, \"Intensity of fadeout for scanlines filter (topright) (default 2)\", \"SCANLINE_FILTER_B\"},\r\n\t\t{ \"scanline-filter-c\", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_c, \"Intensity of fadeout for scanlines filter (bottomleft) (default 2)\", \"SCANLINE_FILTER_C\"},\r\n\t\t{ \"scanline-filter-d\", 0, 0, G_OPTION_ARG_INT, &_scanline_filter_d, \"Intensity of fadeout for scanlines filter (bottomright) (default 4)\", \"SCANLINE_FILTER_D\"},\r\n\t\t{ \"rigorous-timing\", 0, 0, G_OPTION_ARG_INT, &_rigorous_timing, \"Use some rigorous timings instead of unrealistically generous (default 0)\", \"RIGOROUS_TIMING\"},\r\n\t\t{ \"advanced-timing\", 0, 0, G_OPTION_ARG_INT, &_advanced_timing, \"Use advanced BUS-level timing (default 1)\", \"ADVANCED_TIMING\"},\r\n\t\t{ \"slot1\", 0, 0, G_OPTION_ARG_STRING, &_slot1, \"Device to load in slot 1 (default retail)\", \"SLOT1\"},\r\n\t\t{ \"slot1-fat-dir\", 0, 0, G_OPTION_ARG_STRING, &_slot1_fat_dir, \"Directory to scan for slot 1\", \"SLOT1_DIR\"},\r\n\t\t{ \"depth-threshold\", 0, 0, G_OPTION_ARG_INT, &depth_threshold, \"Depth comparison threshold (default 0)\", \"DEPTHTHRESHOLD\"},\r\n\t\t{ \"console-type\", 0, 0, G_OPTION_ARG_STRING, &_console_type, \"Select console type: {fat,lite,ique,debug,dsi}\", \"CONSOLETYPE\" },\r\n\t\t{ \"cpu-mode\", 0, 0, G_OPTION_ARG_INT, &_cpu_mode, \"ARM CPU emulation mode: 0 - interpreter, 1 - thread interpreter, 2 - dynarec (default 1)\", NULL},\r\n\t\t{ \"jit-size\", 0, 0, G_OPTION_ARG_INT, &_jit_size, \"ARM JIT block size: 1..100 (1 - accuracy, 100 - faster) (default 100)\", NULL},\r\n#ifndef _MSC_VER\r\n\t\t{ \"disable-sound\", 0, 0, G_OPTION_ARG_NONE, &disable_sound, \"Disables the sound emulation\", NULL},\r\n\t\t{ \"disable-limiter\", 0, 0, G_OPTION_ARG_NONE, &disable_limiter, \"Disables the 60fps limiter\", NULL},\r\n\t\t{ \"nojoy\", 0, 0, G_OPTION_ARG_INT, &_commandline_linux_nojoy, \"Disables joystick support\", \"NOJOY\"},\r\n#endif\r\n#ifdef GDB_STUB\r\n\t\t{ \"arm9gdb\", 0, 0, G_OPTION_ARG_INT, &arm9_gdb_port, \"Enable the ARM9 GDB stub on the given port\", \"PORT_NUM\"},\r\n\t\t{ \"arm7gdb\", 0, 0, G_OPTION_ARG_INT, &arm7_gdb_port, \"Enable the ARM7 GDB stub on the given port\", \"PORT_NUM\"},\r\n#endif\r\n\t\t{ \"autodetect_method\", 0, 0, G_OPTION_ARG_INT, &autodetect_method, \"Autodetect backup method (0 - internal, 1 - from database)\", \"AUTODETECT_METHOD\"},\r\n\t\t{ NULL }\r\n\t};\r\n\r\n\tg_option_context_add_main_entries (ctx, options, \"options\");\r\n}\r\n\r\nstatic char mytoupper(char c) { return ::toupper(c); }\r\n\r\nstatic std::string strtoupper(const std::string& str)\r\n{\r\n\tstd::string ret = str;\r\n\tstd::transform(ret.begin(), ret.end(), ret.begin(), ::mytoupper);\r\n\treturn ret;\r\n}\r\n\r\nbool CommandLine::parse(int argc,char **argv)\r\n{\r\n\tg_option_context_parse (ctx, &argc, &argv, &error);\r\n\tif (error)\r\n\t{\r\n\t\tg_printerr(\"Error parsing command line arguments: %s\\n\", error->message);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif(_slot1_fat_dir) slot1_fat_dir = _slot1_fat_dir;\r\n\tif(_slot1) slot1 = _slot1; slot1 = strtoupper(slot1);\r\n\tif(_console_type) console_type = _console_type;\r\n\tif(_play_movie_file) play_movie_file = _play_movie_file;\r\n\tif(_record_movie_file) record_movie_file = _record_movie_file;\r\n\tif(_cflash_image) cflash_image = _cflash_image;\r\n\tif(_cflash_path) cflash_path = _cflash_path;\r\n\tif(_gbaslot_rom) gbaslot_rom = _gbaslot_rom;\r\n\r\n\tif(_num_cores != -1) CommonSettings.num_cores = _num_cores;\r\n\tif(_rigorous_timing) CommonSettings.rigorous_timing = true;\r\n\tif(_advanced_timing != -1) CommonSettings.advanced_timing = _advanced_timing==1;\r\n\tif(_cpu_mode != -1) CommonSettings.CpuMode = _cpu_mode;\r\n\tif(_jit_size != -1) \r\n\t{\r\n\t\tif ((_jit_size < 1) || (_jit_size > 100)) \r\n\t\t\tCommonSettings.jit_max_block_size = 100;\r\n\t\telse\r\n\t\t\tCommonSettings.jit_max_block_size = _jit_size;\r\n\t}\r\n\tif(depth_threshold != -1)\r\n\t\tCommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = depth_threshold;\r\n\r\n\r\n\t//process console type\r\n\tCommonSettings.DebugConsole = false;\r\n\tCommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT;\r\n\tconsole_type = strtoupper(console_type);\r\n\tif(console_type == \"\") {}\r\n\telse if(console_type == \"FAT\") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT;\r\n\telse if(console_type == \"LITE\") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_LITE;\r\n\telse if(console_type == \"IQUE\") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_IQUE;\r\n\telse if(console_type == \"DSI\") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_DSI;\r\n\telse if(console_type == \"DEBUG\")\r\n\t{\r\n\t\tCommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT;\r\n\t\tCommonSettings.DebugConsole = true;\r\n\t}\r\n\r\n\tif (autodetect_method != -1)\r\n\t\tCommonSettings.autodetectBackupMethod = autodetect_method;\r\n\r\n\t//TODO NOT MAX PRIORITY! change ARM9BIOS etc to be a std::string\r\n\tif(_bios_arm9) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM9BIOS,_bios_arm9); }\r\n\tif(_bios_arm7) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM7BIOS,_bios_arm7); }\r\n\tif(_bios_swi) CommonSettings.SWIFromBIOS = true;\r\n\tif(_spu_advanced) CommonSettings.spu_advanced = true;\r\n\r\n\tif (argc == 2)\r\n\t\tnds_file = argv[1];\r\n\tif (argc > 2)\r\n\t\treturn false;\r\n\r\n\treturn true;\r\n}\r\n\r\nbool CommandLine::validate()\r\n{\r\n\r\n\r\n\tif(slot1 != \"\")\r\n\t{\r\n\t\tif(slot1 != \"R4\" && slot1 != \"RETAIL\" && slot1 != \"NONE\" && slot1 != \"RETAILNAND\") {\r\n\t\t\tg_printerr(\"Invalid slot1 device specified.\\n\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tif (load_slot < -1 || load_slot > 10) {\r\n\t\tg_printerr(\"I only know how to load from slots 0-10; -1 means 'do not load savegame' and is default\\n\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif(play_movie_file != \"\" && record_movie_file != \"\") {\r\n\t\tg_printerr(\"Cannot both play and record a movie.\\n\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif(record_movie_file != \"\" && load_slot != -1) {\r\n\t\tg_printerr(\"Cannot both record a movie and load a savestate.\\n\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif(cflash_path != \"\" && cflash_image != \"\") {\r\n\t\tg_printerr(\"Cannot specify both cflash-image and cflash-path.\\n\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif((_bios_arm9 && !_bios_arm7) || (_bios_arm7 && !_bios_arm9)) {\r\n\t\tg_printerr(\"If either bios-arm7 or bios-arm9 are specified, both must be.\\n\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif(_bios_swi && (!_bios_arm7 || !_bios_arm9)) {\r\n\t\tg_printerr(\"If either bios-swi is used, bios-arm9 and bios-arm7 must be specified.\\n\");\r\n\t}\r\n\r\n\tif((_cflash_image && _gbaslot_rom) || (_cflash_path && _gbaslot_rom)) {\r\n\t\tg_printerr(\"Cannot specify both cflash and gbaslot rom (both occupy SLOT-2)\\n\");\r\n\t}\r\n\r\n\tif (autodetect_method < -1 || autodetect_method > 1) {\r\n\t\tg_printerr(\"Invalid autodetect save method (0 - internal, 1 - from database)\\n\");\r\n\t}\r\n\r\n\tif (_cpu_mode < -1 || _cpu_mode > 2) {\r\n\t\tg_printerr(\"Invalid cpu mode emulation (0 - interpreter, 1 - thread interpreter, 2 - dynarec)\\n\");\r\n\t}\r\n\tif (_jit_size < -1 && (_jit_size == 0 || _jit_size > 100)) {\r\n\t\tg_printerr(\"Invalid jit block size [1..100]. set to 100\\n\");\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\nvoid CommandLine::errorHelp(const char* binName)\r\n{\r\n\t//TODO - strip this down to just the filename\r\n\tg_printerr(\"USAGE: %s [options] [nds-file]\\n\", binName);\r\n\tg_printerr(\"USAGE: %s --help    - for help\\n\", binName);\r\n}\r\n\r\nvoid CommandLine::process_movieCommands()\r\n{\r\n\tif(play_movie_file != \"\")\r\n\t{\r\n\t\tFCEUI_LoadMovie(play_movie_file.c_str(),true,false,-1);\r\n\t}\r\n\telse if(record_movie_file != \"\")\r\n\t{\r\n\t\tFCEUI_SaveMovie(record_movie_file.c_str(), L\"\", 0, NULL, FCEUI_MovieGetRTCDefault());\r\n\t}\r\n}\r\n\r\nvoid CommandLine::process_addonCommands()\r\n{\r\n\tif (cflash_image != \"\")\r\n\t{\r\n\t\tCFlash_Mode = ADDON_CFLASH_MODE_File;\r\n\t\tCFlash_Path = cflash_image;\r\n\t\tis_cflash_configured = true;\r\n\t}\r\n\tif (cflash_path != \"\")\r\n\t{\r\n\t\tCFlash_Mode = ADDON_CFLASH_MODE_Path;\r\n\t\tCFlash_Path = cflash_path;\r\n\t\tis_cflash_configured = true;\r\n\t}\r\n\r\n\tif(slot1_fat_dir != \"\")\r\n\t\tslot1SetFatDir(slot1_fat_dir);\r\n\r\n\tif(slot1 == \"RETAIL\")\r\n\t\tslot1Change(NDS_SLOT1_RETAIL);\r\n\telse if(slot1 == \"R4\")\r\n\t\tslot1Change(NDS_SLOT1_R4);\r\n\telse if(slot1 == \"RETAILNAND\")\r\n\t\tslot1Change(NDS_SLOT1_RETAIL_NAND);\r\n}\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/commandline.h",
    "content": "/*\r\n\tCopyright (C) 2009-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _COMMANDLINE_H_\r\n#define _COMMANDLINE_H_\r\n\r\n#include <string>\r\n#include \"types.h\"\r\n\r\n//I hate C. we have to forward declare these with more detail than I like\r\ntypedef struct _GOptionContext GOptionContext;\r\ntypedef struct _GError GError;\r\n\r\n//hacky commandline options that i didnt want to route through commonoptions\r\nextern int _commandline_linux_nojoy;\r\n\r\n//this class will also eventually try to take over the responsibility of using the args that it handles\r\n//for example: preparing the emulator run by loading the rom, savestate, and/or movie in the correct pattern.\r\n//it should also populate CommonSettings with its initial values\r\n\r\nclass CommandLine\r\n{\r\npublic:\r\n\t//actual options: these may move to another sturct\r\n\tint load_slot;\r\n\tint depth_threshold;\r\n\tint autodetect_method;\r\n\tstd::string nds_file;\r\n\tstd::string play_movie_file;\r\n\tstd::string record_movie_file;\r\n\tint arm9_gdb_port, arm7_gdb_port;\r\n\tint start_paused;\r\n\tstd::string cflash_image;\r\n\tstd::string cflash_path;\r\n\tstd::string gbaslot_rom;\r\n\tstd::string slot1;\r\n\tstd::string console_type;\r\n\tstd::string slot1_fat_dir;\r\n#ifndef _MSC_VER\r\n\tint disable_sound;\r\n\tint disable_limiter;\r\n#endif\r\n\r\n\t//load up the common commandline options\r\n\tvoid loadCommonOptions();\r\n\t\r\n\tbool parse(int argc,char **argv);\r\n\r\n\t//validate the common commandline options\r\n\tbool validate();\r\n\r\n\t//process movie play/record commands\r\n\tvoid process_movieCommands();\r\n\t//etc.\r\n\tvoid process_addonCommands();\r\n\tbool is_cflash_configured;\r\n\t\r\n\t//print a little help message for cases when erroneous commandlines are entered\r\n\tvoid errorHelp(const char* binName);\r\n\r\n\tCommandLine();\r\n\t~CommandLine();\r\n\r\n\tGError *error;\r\n\tGOptionContext *ctx;\r\n\r\nprivate:\r\n\tchar* _play_movie_file;\r\n\tchar* _record_movie_file;\r\n\tchar* _cflash_image;\r\n\tchar* _cflash_path;\r\n\tchar* _gbaslot_rom;\r\n\tchar* _bios_arm9, *_bios_arm7;\r\n\tint _bios_swi;\r\n\tint _spu_advanced;\r\n\tint _num_cores;\r\n\tint _rigorous_timing;\r\n\tint _advanced_timing;\r\n\tint _cpu_mode;\r\n\tint _jit_size;\r\n\tchar* _slot1;\r\n\tchar *_slot1_fat_dir;\r\n\tchar* _console_type;\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/common.cpp",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n//TODO - move this into ndssystem where it belongs probably\n\n#include <string.h>\n#include <string>\n#include <stdarg.h>\n#include \"common.h\"\n\nchar *trim(char *s, int len)\n{\n\tchar *ptr = NULL;\n\tif (!s) return NULL;\n\tif (!*s) return s;\n\t\n\tif(len==-1)\n\t\tptr = s + strlen(s) - 1;\n\telse ptr = s+len - 1;\n\tfor (; (ptr >= s) && (!*ptr || isspace((u8)*ptr)) ; ptr--);\n\tptr[1] = '\\0';\n\treturn s;\n}\n\nchar *removeSpecialChars(char *s)\n{\n\tchar\t*buf = s;\n\tif (!s) return NULL;\n\tif (!*s) return s;\n\n\tfor (u32 i = 0; i < strlen(s); i++)\n\t{\n\t\tif (isspace((u8)s[i]) && (s[i] != 0x20))\n\t\t\t*buf = 0x20;\n\t\telse\n\t\t\t*buf = s[i];\n\t\tbuf++;\n\t}\n\t*buf = 0;\n\treturn s;\n}\n\nstatic MAKER makerCodes[] = {\n\t{ 0x3130, \"Nintendo\" },\n\t{ 0x3230, \"Rocket Games, Ajinomoto\" },\n\t{ 0x3330, \"Imagineer-Zoom\" },\n\t{ 0x3430, \"Gray Matter?\" },\n\t{ 0x3530, \"Zamuse\" },\n\t{ 0x3630, \"Falcom\" },\n\t{ 0x3730, \"Enix?\" },\n\t{ 0x3830, \"Capcom\" },\n\t{ 0x3930, \"Hot B Co.\" },\n\t{ 0x4130, \"Jaleco\" },\n\t{ 0x4230, \"Coconuts Japan\" },\n\t{ 0x4330, \"Coconuts Japan/G.X.Media\" },\n\t{ 0x4430, \"Micronet?\" },\n\t{ 0x4530, \"Technos\" },\n\t{ 0x4630, \"Mebio Software\" },\n\t{ 0x4730, \"Shouei System\" },\n\t{ 0x4830, \"Starfish\" },\n\t{ 0x4A30, \"Mitsui Fudosan/Dentsu\" },\n\t{ 0x4C30, \"Warashi Inc.\" },\n\t{ 0x4E30, \"Nowpro\" },\n\t{ 0x5030, \"Game Village\" },\n\t{ 0x3031, \"?????????????\" },\n\t{ 0x3231, \"Infocom\" },\n\t{ 0x3331, \"Electronic Arts Japan\" },\n\t{ 0x3531, \"Cobra Team\" },\n\t{ 0x3631, \"Human/Field\" },\n\t{ 0x3731, \"KOEI\" },\n\t{ 0x3831, \"Hudson Soft\" },\n\t{ 0x3931, \"S.C.P.\" },\n\t{ 0x4131, \"Yanoman\" },\n\t{ 0x4331, \"Tecmo Products\" },\n\t{ 0x4431, \"Japan Glary Business\" },\n\t{ 0x4531, \"Forum/OpenSystem\" },\n\t{ 0x4631, \"Virgin Games\" },\n\t{ 0x4731, \"SMDE\" },\n\t{ 0x4A31, \"Daikokudenki\" },\n\t{ 0x5031, \"Creatures Inc.\" },\n\t{ 0x5131, \"TDK Deep Impresion\" },\n\t{ 0x3032, \"Destination Software, KSS\" },\n\t{ 0x3132, \"Sunsoft/Tokai Engineering??\" },\n\t{ 0x3232, \"POW, VR 1 Japan??\" },\n\t{ 0x3332, \"Micro World\" },\n\t{ 0x3532, \"San-X\" },\n\t{ 0x3632, \"Enix\" },\n\t{ 0x3732, \"Loriciel/Electro Brain\" },\n\t{ 0x3832, \"Kemco Japan\" },\n\t{ 0x3932, \"Seta\" },\n\t{ 0x4132, \"Culture Brain\" },\n\t{ 0x4332, \"Palsoft\" },\n\t{ 0x4432, \"Visit Co.,Ltd.\" },\n\t{ 0x4532, \"Intec\" },\n\t{ 0x4632, \"System Sacom\" },\n\t{ 0x4732, \"Poppo\" },\n\t{ 0x4832, \"Ubisoft Japan\" },\n\t{ 0x4A32, \"Media Works\" },\n\t{ 0x4B32, \"NEC InterChannel\" },\n\t{ 0x4C32, \"Tam\" },\n\t{ 0x4D32, \"Jordan\" },\n\t{ 0x4E32, \"Smilesoft ???, Rocket ???\" },\n\t{ 0x5132, \"Mediakite\" },\n\t{ 0x3033, \"Viacom\" },\n\t{ 0x3133, \"Carrozzeria\" },\n\t{ 0x3233, \"Dynamic\" },\n\t{ 0x3433, \"Magifact\" },\n\t{ 0x3533, \"Hect\" },\n\t{ 0x3633, \"Codemasters\" },\n\t{ 0x3733, \"Taito/GAGA Communications\" },\n\t{ 0x3833, \"Laguna\" },\n\t{ 0x3933, \"Telstar Fun & Games, Event/Taito\" },\n\t{ 0x4233, \"Arcade Zone Ltd\" },\n\t{ 0x4333, \"Entertainment International/Empire Software?\" },\n\t{ 0x4433, \"Loriciel\" },\n\t{ 0x4533, \"Gremlin Graphics\" },\n\t{ 0x4633, \"K.Amusement Leasing Co.\" },\n\t{ 0x3034, \"Seika Corp.\" },\n\t{ 0x3134, \"Ubi Soft Entertainment\" },\n\t{ 0x3234, \"Sunsoft US?\" },\n\t{ 0x3434, \"Life Fitness\" },\n\t{ 0x3634, \"System 3\" },\n\t{ 0x3734, \"Spectrum Holobyte\" },\n\t{ 0x3934, \"IREM\" },\n\t{ 0x4234, \"Raya Systems\" },\n\t{ 0x4334, \"Renovation Products\" },\n\t{ 0x4434, \"Malibu Games\" },\n\t{ 0x4634, \"Eidos (was U.S. Gold <=1995)\" },\n\t{ 0x4734, \"Playmates Interactive?\" },\n\t{ 0x4A34, \"Fox Interactive\" },\n\t{ 0x4B34, \"Time Warner Interactive\" },\n\t{ 0x5134, \"Disney Interactive\" },\n\t{ 0x5334, \"Black Pearl\" },\n\t{ 0x5534, \"Advanced Productions\" },\n\t{ 0x5834, \"GT Interactive\" },\n\t{ 0x5934, \"RARE?\" },\n\t{ 0x5A34, \"Crave Entertainment\" },\n\t{ 0x3035, \"Absolute Entertainment\" },\n\t{ 0x3135, \"Acclaim\" },\n\t{ 0x3235, \"Activision\" },\n\t{ 0x3335, \"American Sammy\" },\n\t{ 0x3435, \"Take 2 Interactive (before it was GameTek)\" },\n\t{ 0x3535, \"Hi Tech\" },\n\t{ 0x3635, \"LJN LTD.\" },\n\t{ 0x3835, \"Mattel\" },\n\t{ 0x4135, \"Mindscape, Red Orb Entertainment?\" },\n\t{ 0x4235, \"Romstar\" },\n\t{ 0x4335, \"Taxan\" },\n\t{ 0x4435, \"Midway (before it was Tradewest)\" },\n\t{ 0x4635, \"American Softworks\" },\n\t{ 0x4735, \"Majesco Sales Inc\" },\n\t{ 0x4835, \"3DO\" },\n\t{ 0x4B35, \"Hasbro\" },\n\t{ 0x4C35, \"NewKidCo\" },\n\t{ 0x4D35, \"Telegames\" },\n\t{ 0x4E35, \"Metro3D\" },\n\t{ 0x5035, \"Vatical Entertainment\" },\n\t{ 0x5135, \"LEGO Media\" },\n\t{ 0x5335, \"Xicat Interactive\" },\n\t{ 0x5435, \"Cryo Interactive\" },\n\t{ 0x5735, \"Red Storm Entertainment\" },\n\t{ 0x5835, \"Microids\" },\n\t{ 0x5A35, \"Conspiracy/Swing\" },\n\t{ 0x3036, \"Titus\" },\n\t{ 0x3136, \"Virgin Interactive\" },\n\t{ 0x3236, \"Maxis\" },\n\t{ 0x3436, \"LucasArts Entertainment\" },\n\t{ 0x3736, \"Ocean\" },\n\t{ 0x3936, \"Electronic Arts\" },\n\t{ 0x4236, \"Laser Beam\" },\n\t{ 0x4536, \"Elite Systems\" },\n\t{ 0x4636, \"Electro Brain\" },\n\t{ 0x4736, \"The Learning Company\" },\n\t{ 0x4836, \"BBC\" },\n\t{ 0x4A36, \"Software 2000\" },\n\t{ 0x4C36, \"BAM! Entertainment\" },\n\t{ 0x4D36, \"Studio 3\" },\n\t{ 0x5136, \"Classified Games\" },\n\t{ 0x5336, \"TDK Mediactive\" },\n\t{ 0x5536, \"DreamCatcher\" },\n\t{ 0x5636, \"JoWood Produtions\" },\n\t{ 0x5736, \"SEGA\" },\n\t{ 0x5836, \"Wannado Edition\" },\n\t{ 0x5936, \"LSP\" },\n\t{ 0x5A36, \"ITE Media\" },\n\t{ 0x3037, \"Infogrames\" },\n\t{ 0x3137, \"Interplay\" },\n\t{ 0x3237, \"JVC\" },\n\t{ 0x3337, \"Parker Brothers\" },\n\t{ 0x3537, \"Sales Curve\" },\n\t{ 0x3837, \"THQ\" },\n\t{ 0x3937, \"Accolade\" },\n\t{ 0x4137, \"Triffix Entertainment\" },\n\t{ 0x4337, \"Microprose Software\" },\n\t{ 0x4437, \"Universal Interactive, Sierra, Simon & Schuster?\" },\n\t{ 0x4637, \"Kemco\" },\n\t{ 0x4737, \"Rage Software\" },\n\t{ 0x4837, \"Encore\" },\n\t{ 0x4A37, \"Zoo\" },\n\t{ 0x4B37, \"BVM\" },\n\t{ 0x4C37, \"Simon & Schuster Interactive\" },\n\t{ 0x4D37, \"Asmik Ace Entertainment Inc./AIA\" },\n\t{ 0x4E37, \"Empire Interactive?\" },\n\t{ 0x5137, \"Jester Interactive\" },\n\t{ 0x5437, \"Scholastic\" },\n\t{ 0x5537, \"Ignition Entertainment\" },\n\t{ 0x5737, \"Stadlbauer\" },\n\t{ 0x3038, \"Misawa\" },\n\t{ 0x3138, \"Teichiku\" },\n\t{ 0x3238, \"Namco Ltd.\" },\n\t{ 0x3338, \"LOZC\" },\n\t{ 0x3438, \"KOEI\" },\n\t{ 0x3638, \"Tokuma Shoten Intermedia\" },\n\t{ 0x3738, \"Tsukuda Original\" },\n\t{ 0x3838, \"DATAM-Polystar\" },\n\t{ 0x4238, \"Bulletproof Software\" },\n\t{ 0x4338, \"Vic Tokai Inc.\" },\n\t{ 0x4538, \"Character Soft\" },\n\t{ 0x4638, \"I'Max\" },\n\t{ 0x4738, \"Saurus\" },\n\t{ 0x4A38, \"General Entertainment\" },\n\t{ 0x4E38, \"Success\" },\n\t{ 0x5038, \"SEGA Japan\" },\n\t{ 0x3039, \"Takara Amusement\" },\n\t{ 0x3139, \"Chun Soft\" },\n\t{ 0x3239, \"Video System, McO'River???\" },\n\t{ 0x3339, \"BEC\" },\n\t{ 0x3539, \"Varie\" },\n\t{ 0x3639, \"Yonezawa/S'pal\" },\n\t{ 0x3739, \"Kaneko\" },\n\t{ 0x3939, \"Victor Interactive Software, Pack in Video\" },\n\t{ 0x4139, \"Nichibutsu/Nihon Bussan\" },\n\t{ 0x4239, \"Tecmo\" },\n\t{ 0x4339, \"Imagineer\" },\n\t{ 0x4639, \"Nova\" },\n\t{ 0x4739, \"Den'Z\" },\n\t{ 0x4839, \"Bottom Up\" },\n\t{ 0x4A39, \"TGL\" },\n\t{ 0x4C39, \"Hasbro Japan?\" },\n\t{ 0x4E39, \"Marvelous Entertainment\" },\n\t{ 0x5039, \"Keynet Inc.\" },\n\t{ 0x5139, \"Hands-On Entertainment\" },\n\t{ 0x3041, \"Telenet\" },\n\t{ 0x3141, \"Hori\" },\n\t{ 0x3441, \"Konami\" },\n\t{ 0x3541, \"K.Amusement Leasing Co.\" },\n\t{ 0x3641, \"Kawada\" },\n\t{ 0x3741, \"Takara\" },\n\t{ 0x3941, \"Technos Japan Corp.\" },\n\t{ 0x4141, \"JVC, Victor Musical Indutries\" },\n\t{ 0x4341, \"Toei Animation\" },\n\t{ 0x4441, \"Toho\" },\n\t{ 0x4641, \"Namco\" },\n\t{ 0x4741, \"Media Rings Corporation\" },\n\t{ 0x4841, \"J-Wing\" },\n\t{ 0x4A41, \"Pioneer LDC\" },\n\t{ 0x4B41, \"KID\" },\n\t{ 0x4C41, \"Mediafactory\" },\n\t{ 0x5041, \"Infogrames Hudson\" },\n\t{ 0x5141, \"Kiratto. Ludic Inc\" },\n\t{ 0x3042, \"Acclaim Japan\" },\n\t{ 0x3142, \"ASCII (was Nexoft?)\" },\n\t{ 0x3242, \"Bandai\" },\n\t{ 0x3442, \"Enix\" },\n\t{ 0x3642, \"HAL Laboratory\" },\n\t{ 0x3742, \"SNK\" },\n\t{ 0x3942, \"Pony Canyon\" },\n\t{ 0x4142, \"Culture Brain\" },\n\t{ 0x4242, \"Sunsoft\" },\n\t{ 0x4342, \"Toshiba EMI\" },\n\t{ 0x4442, \"Sony Imagesoft\" },\n\t{ 0x4642, \"Sammy\" },\n\t{ 0x4742, \"Magical\" },\n\t{ 0x4842, \"Visco\" },\n\t{ 0x4A42, \"Compile \" },\n\t{ 0x4C42, \"MTO Inc.\" },\n\t{ 0x4E42, \"Sunrise Interactive\" },\n\t{ 0x5042, \"Global A Entertainment\" },\n\t{ 0x5142, \"Fuuki\" },\n\t{ 0x3043, \"Taito\" },\n\t{ 0x3243, \"Kemco\" },\n\t{ 0x3343, \"Square\" },\n\t{ 0x3443, \"Tokuma Shoten\" },\n\t{ 0x3543, \"Data East\" },\n\t{ 0x3643, \"Tonkin House\t(was Tokyo Shoseki)\" },\n\t{ 0x3843, \"Koei\" },\n\t{ 0x4143, \"Konami/Ultra/Palcom\" },\n\t{ 0x4243, \"NTVIC/VAP\" },\n\t{ 0x4343, \"Use Co.,Ltd.\" },\n\t{ 0x4443, \"Meldac\" },\n\t{ 0x4543, \"Pony Canyon\" },\n\t{ 0x4643, \"Angel, Sotsu Agency/Sunrise\" },\n\t{ 0x4A43, \"Boss\" },\n\t{ 0x4743, \"Yumedia/Aroma Co., Ltd\" },\n\t{ 0x4B43, \"Axela/Crea-Tech?\" },\n\t{ 0x4C43, \"Sekaibunka-Sha, Sumire kobo?, Marigul Management Inc.?\" },\n\t{ 0x4D43, \"Konami Computer Entertainment Osaka\" },\n\t{ 0x5043, \"Enterbrain\" },\n\t{ 0x3044, \"Taito/Disco\" },\n\t{ 0x3144, \"Sofel\" },\n\t{ 0x3244, \"Quest, Bothtec\" },\n\t{ 0x3344, \"Sigma, ?????\" },\n\t{ 0x3444, \"Ask Kodansha\" },\n\t{ 0x3644, \"Naxat\" },\n\t{ 0x3744, \"Copya System\" },\n\t{ 0x3844, \"Capcom Co., Ltd.\" },\n\t{ 0x3944, \"Banpresto\" },\n\t{ 0x4144, \"TOMY\" },\n\t{ 0x4244, \"LJN Japan\" },\n\t{ 0x4444, \"NCS\" },\n\t{ 0x4544, \"Human Entertainment\" },\n\t{ 0x4644, \"Altron\" },\n\t{ 0x4744, \"Jaleco???\" },\n\t{ 0x4844, \"Gaps Inc.\" },\n\t{ 0x4C44, \"????\" },\n\t{ 0x4E44, \"Elf\" },\n\t{ 0x3045, \"Jaleco\" },\n\t{ 0x3145, \"????\" },\n\t{ 0x3245, \"Yutaka\" },\n\t{ 0x3345, \"Varie\" },\n\t{ 0x3445, \"T&ESoft\" },\n\t{ 0x3545, \"Epoch\" },\n\t{ 0x3745, \"Athena\" },\n\t{ 0x3845, \"Asmik\" },\n\t{ 0x3945, \"Natsume\" },\n\t{ 0x4145, \"King Records\" },\n\t{ 0x4245, \"Atlus\" },\n\t{ 0x4345, \"Epic/Sony Records\" },\n\t{ 0x4545, \"IGS\" },\n\t{ 0x4745, \"Chatnoir\" },\n\t{ 0x4845, \"Right Stuff\" },\n\t{ 0x4C45, \"Spike\" },\n\t{ 0x4D45, \"Konami Computer Entertainment Tokyo\" },\n\t{ 0x4E45, \"Alphadream Corporation\" },\n\t{ 0x3046, \"A Wave\" },\n\t{ 0x3146, \"Motown Software\" },\n\t{ 0x3246, \"Left Field Entertainment\" },\n\t{ 0x3346, \"Extreme Ent. Grp.\" },\n\t{ 0x3446, \"TecMagik\" },\n\t{ 0x3946, \"Cybersoft\" },\n\t{ 0x4246, \"Psygnosis\" },\n\t{ 0x4546, \"Davidson/Western Tech.\" },\n\t{ 0x3147, \"PCCW Japan\" },\n\t{ 0x3447, \"KiKi Co Ltd\" },\n\t{ 0x3547, \"Open Sesame Inc???\" },\n\t{ 0x3647, \"Sims\" },\n\t{ 0x3747, \"Broccoli\" },\n\t{ 0x3847, \"Avex\" },\n\t{ 0x3947, \"D3 Publisher\" },\n\t{ 0x4247, \"Konami Computer Entertainment Japan\" },\n\t{ 0x4447, \"Square-Enix\" },\n\t{ 0x4849, \"Yojigen\" },\n};\n\n#define makerNum sizeof(makerCodes) / sizeof(makerCodes[0])\n\nstd::string getDeveloperNameByID(u16 id)\n{\n\tfor (u32 i = 0; i < makerNum; i++)\n\t{\n\t\tif (makerCodes[i].code == id)\n\t\t{\n\t\t\treturn makerCodes[i].name;\n\t\t}\n\t}\n\treturn \"Unknown\";\n}\n\n\n// ===============================================================================\n// Message dialogs\n// ===============================================================================\n#define MSG_PRINT { \\\n\tva_list args; \\\n\tva_start (args, fmt); \\\n\tvprintf (fmt, args); \\\n\tva_end (args); \\\n}\nvoid msgFakeInfo(const char *fmt, ...)\n{\n\tMSG_PRINT;\n}\n\nbool msgFakeConfirm(const char *fmt, ...)\n{\n\tMSG_PRINT;\n\treturn true;\n}\n\nvoid msgFakeError(const char *fmt, ...)\n{\n\tMSG_PRINT;\n}\n\nvoid msgFakeWarn(const char *fmt, ...)\n{\n\tMSG_PRINT;\n}\n\nmsgBoxInterface msgBoxFake = {\n\tmsgFakeInfo,\n\tmsgFakeConfirm,\n\tmsgFakeError,\n\tmsgFakeWarn,\n};\n\nmsgBoxInterface *msgbox = &msgBoxFake;\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/common.h",
    "content": "/*\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n//TODO - dismantle this file\n\n#ifndef _COMMON_H_\n#define _COMMON_H_\n\n#include <string>\n#include <stdio.h>\n#include <string.h>\n#include \"types.h\"\n\n\n#if defined(WIN32)\n\n\t#include <winsock2.h>\n\t#include <windows.h>\n\n\t#define CLASSNAME \"DeSmuME\"\n\n\textern HINSTANCE hAppInst;\n\n\textern bool romloaded;\n\n\textern char IniName[MAX_PATH];\n\textern void GetINIPath();\n\textern void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file);\n\n\tbool GetPrivateProfileBool(const char* appname, const char* keyname, bool defval, const char* filename);\n\tvoid WritePrivateProfileBool(char* appname, char* keyname, bool val, char* file);\n\n#else\t\t// non Windows\n\n#define sscanf_s sscanf\n\n#endif\n\ntemplate<typename T>\nT reverseBits(T x)\n{\n\tT h = 0;\n\tT i = 0;\n\n\tfor (i = 0; i < sizeof(T)*8; i++)\n\t{\n\t\th = (h << 1) + (x & 1); \n\t\tx >>= 1; \n\t}\n\n\treturn h;\n}\n\ntemplate<typename T>\nchar *intToBin(T val)\n{\n\tchar buf[256] = {0};\n\tfor (int i = sizeof(T)*8, t = 0;  i > 0; --i, t++)\n\t{\n\t\tbuf[i-1] = (val & (1<<t))?'1':'0';\n\t}\n\treturn strdup(buf);\n}\n\nextern char *trim(char *s, int len=-1);\nextern char *removeSpecialChars(char *s);\n\n// ===============================================================================\n// Message dialogs\n// ===============================================================================\n#define CALL_CONVENTION\ntypedef struct\n{\n\tvoid (CALL_CONVENTION*  info)\t(const char *fmt, ...);\n\tbool (CALL_CONVENTION*  confirm)(const char *fmt, ...);\n\tvoid (CALL_CONVENTION*  error)\t(const char *fmt, ...);\n\tvoid (CALL_CONVENTION*  warn)\t(const char *fmt, ...);\n} msgBoxInterface;\n\nextern msgBoxInterface *msgbox;\n\n// ===============================================================================\n// Maker codes\n// ===============================================================================\n\nstruct MAKER\n{\n\tu16 code;\n\tconst char* name;\n};\n\nstd::string getDeveloperNameByID(u16 id);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/cp15.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdlib.h>\n\n#include \"cp15.h\"\n#include \"debug.h\"\n#include \"MMU.h\"\n\narmcp15_t cp15;\n\nbool armcp15_t::reset(armcpu_t * c)\n{\n\t//printf(\"CP15 Reset\\n\");\n\tcpu = c;\n\tIDCode = 0x41059461;\n\tcacheType = 0x0F0D2112;\n\tTCMSize = 0x00140180;\n\tctrl = 0x00012078;\n\tDCConfig = 0x0;    \n\tICConfig = 0x0;    \n\twriteBuffCtrl = 0x0;\n\tund = 0x0;\n\tDaccessPerm = 0x22222222;\n\tIaccessPerm = 0x22222222;\n\tprotectBaseSize0 = 0x0;\n\tprotectBaseSize1 = 0x0;\n\tprotectBaseSize2 = 0x0;\n\tprotectBaseSize3 = 0x0;\n\tprotectBaseSize4 = 0x0;\n\tprotectBaseSize5 = 0x0;\n\tprotectBaseSize6 = 0x0;\n\tprotectBaseSize7 = 0x0;\n\tcacheOp = 0x0;\n\tDcacheLock = 0x0;\n\tIcacheLock = 0x0;\n\tITCMRegion = 0x0C;\n\tDTCMRegion = 0x0080000A;\n\tprocessID = 0;\n\n\tMMU.ARM9_RW_MODE = BIT7(ctrl);\n\tcpu->intVector = 0xFFFF0000 * (BIT13(ctrl));\n\tcpu->LDTBit = !BIT15(ctrl); //TBit\n\n\t/* preset calculated regionmasks */\t\n\tfor (u8 i=0;i<8;i++) {\n\t\tregionWriteMask_USR[i] = 0 ;\n\t\tregionWriteMask_SYS[i] = 0 ;\n\t\tregionReadMask_USR[i] = 0 ;\n\t\tregionReadMask_SYS[i] = 0 ;\n\t\tregionExecuteMask_USR[i] = 0 ;\n\t\tregionExecuteMask_SYS[i] = 0 ;\n\t\tregionWriteSet_USR[i] = 0 ;\n\t\tregionWriteSet_SYS[i] = 0 ;\n\t\tregionReadSet_USR[i] = 0 ;\n\t\tregionReadSet_SYS[i] = 0 ;\n\t\tregionExecuteSet_USR[i] = 0 ;\n\t\tregionExecuteSet_SYS[i] = 0 ;\n\t} ;\n\n\treturn true;\n}\n\n#define ACCESSTYPE(val,n)   (((val) >> (4*n)) & 0x0F)\n#define SIZEIDENTIFIER(val) ((((val) >> 1) & 0x1F))\n#define SIZEBINARY(val)     (1 << (SIZEIDENTIFIER(val)+1))\n#define MASKFROMREG(val)    (~((SIZEBINARY(val)-1) | 0x3F))\n#define SETFROMREG(val)     ((val) & MASKFROMREG(val))\n/* sets the precalculated regions to mask,set for the affected accesstypes */\nvoid armcp15_t::setSingleRegionAccess(u32 dAccess,u32 iAccess,unsigned char num, u32 mask,u32 set) {\n\n\tswitch (ACCESSTYPE(dAccess,num)) {\n\t\tcase 4: /* UNP */\n\t\tcase 7: /* UNP */\n\t\tcase 8: /* UNP */\n\t\tcase 9: /* UNP */\n\t\tcase 10: /* UNP */\n\t\tcase 11: /* UNP */\n\t\tcase 12: /* UNP */\n\t\tcase 13: /* UNP */\n\t\tcase 14: /* UNP */\n\t\tcase 15: /* UNP */\n\t\tcase 0: /* no access at all */\n\t\t\tregionWriteMask_USR[num] = 0 ;\n\t\t\tregionWriteSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_USR[num] = 0 ;\n\t\t\tregionReadSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionWriteMask_SYS[num] = 0 ;\n\t\t\tregionWriteSet_SYS[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_SYS[num] = 0 ;\n\t\t\tregionReadSet_SYS[num] = 0xFFFFFFFF ;\n\t\t\tbreak ;\n\t\tcase 1: /* no access at USR, all to sys */\n\t\t\tregionWriteMask_USR[num] = 0 ;\n\t\t\tregionWriteSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_USR[num] = 0 ;\n\t\t\tregionReadSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionWriteMask_SYS[num] = mask ;\n\t\t\tregionWriteSet_SYS[num] = set ;\n\t\t\tregionReadMask_SYS[num] = mask ;\n\t\t\tregionReadSet_SYS[num] = set ;\n\t\t\tbreak ;\n\t\tcase 2: /* read at USR, all to sys */\n\t\t\tregionWriteMask_USR[num] = 0 ;\n\t\t\tregionWriteSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_USR[num] = mask ;\n\t\t\tregionReadSet_USR[num] = set ;\n\t\t\tregionWriteMask_SYS[num] = mask ;\n\t\t\tregionWriteSet_SYS[num] = set ;\n\t\t\tregionReadMask_SYS[num] = mask ;\n\t\t\tregionReadSet_SYS[num] = set ;\n\t\t\tbreak ;\n\t\tcase 3: /* all to USR, all to sys */\n\t\t\tregionWriteMask_USR[num] = mask ;\n\t\t\tregionWriteSet_USR[num] = set ;\n\t\t\tregionReadMask_USR[num] = mask ;\n\t\t\tregionReadSet_USR[num] = set ;\n\t\t\tregionWriteMask_SYS[num] = mask ;\n\t\t\tregionWriteSet_SYS[num] = set ;\n\t\t\tregionReadMask_SYS[num] = mask ;\n\t\t\tregionReadSet_SYS[num] = set ;\n\t\t\tbreak ;\n\t\tcase 5: /* no access at USR, read to sys */\n\t\t\tregionWriteMask_USR[num] = 0 ;\n\t\t\tregionWriteSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_USR[num] = 0 ;\n\t\t\tregionReadSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionWriteMask_SYS[num] = 0 ;\n\t\t\tregionWriteSet_SYS[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_SYS[num] = mask ;\n\t\t\tregionReadSet_SYS[num] = set ;\n\t\t\tbreak ;\n\t\tcase 6: /* read at USR, read to sys */\n\t\t\tregionWriteMask_USR[num] = 0 ;\n\t\t\tregionWriteSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_USR[num] = mask ;\n\t\t\tregionReadSet_USR[num] = set ;\n\t\t\tregionWriteMask_SYS[num] = 0 ;\n\t\t\tregionWriteSet_SYS[num] = 0xFFFFFFFF ;\n\t\t\tregionReadMask_SYS[num] = mask ;\n\t\t\tregionReadSet_SYS[num] = set ;\n\t\t\tbreak ;\n\t}\n\tswitch (ACCESSTYPE(iAccess,num)) {\n\t\tcase 4: /* UNP */\n\t\tcase 7: /* UNP */\n\t\tcase 8: /* UNP */\n\t\tcase 9: /* UNP */\n\t\tcase 10: /* UNP */\n\t\tcase 11: /* UNP */\n\t\tcase 12: /* UNP */\n\t\tcase 13: /* UNP */\n\t\tcase 14: /* UNP */\n\t\tcase 15: /* UNP */\n\t\tcase 0: /* no access at all */\n\t\t\tregionExecuteMask_USR[num] = 0 ;\n\t\t\tregionExecuteSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionExecuteMask_SYS[num] = 0 ;\n\t\t\tregionExecuteSet_SYS[num] = 0xFFFFFFFF ;\n\t\t\tbreak ;\n\t\tcase 1:\n\t\t\tregionExecuteMask_USR[num] = 0 ;\n\t\t\tregionExecuteSet_USR[num] = 0xFFFFFFFF ;\n\t\t\tregionExecuteMask_SYS[num] = mask ;\n\t\t\tregionExecuteSet_SYS[num] = set ;\n\t\t\tbreak ;\n\t\tcase 2:\n\t\tcase 3:\n\t\tcase 6:\n\t\t\tregionExecuteMask_USR[num] = mask ;\n\t\t\tregionExecuteSet_USR[num] = set ;\n\t\t\tregionExecuteMask_SYS[num] = mask ;\n\t\t\tregionExecuteSet_SYS[num] = set ;\n\t\t\tbreak ;\n\t}\n} ;\n\n/* precalculate region masks/sets from cp15 register */\nvoid armcp15_t::maskPrecalc()\n{\n#define precalc(num) {  \\\n\tu32 mask = 0, set = 0xFFFFFFFF ; /* (x & 0) == 0xFF..FF is allways false (disabled) */  \\\n\tif (BIT_N(protectBaseSize##num,0)) /* if region is enabled */ \\\n\t{    /* reason for this define: naming includes var */  \\\n\tmask = MASKFROMREG(protectBaseSize##num) ;   \\\n\tset = SETFROMREG(protectBaseSize##num) ; \\\n\tif (SIZEIDENTIFIER(protectBaseSize##num)==0x1F)  \\\n\t{   /* for the 4GB region, u32 suffers wraparound */   \\\n\tmask = 0 ; set = 0 ;   /* (x & 0) == 0  is allways true (enabled) */  \\\n} \\\n}  \\\n\tsetSingleRegionAccess(DaccessPerm,IaccessPerm,num,mask,set) ;  \\\n}\n\tprecalc(0) ;\n\tprecalc(1) ;\n\tprecalc(2) ;\n\tprecalc(3) ;\n\tprecalc(4) ;\n\tprecalc(5) ;\n\tprecalc(6) ;\n\tprecalc(7) ;\n#undef precalc\n}\n\nBOOL armcp15_t::isAccessAllowed(u32 address,u32 access)\n{\n\tint i ;\n\tif (!(ctrl & 1)) return TRUE ;        /* protection checking is not enabled */\n\tfor (i=0;i<8;i++) {\n\t\tswitch (access) {\n\t\tcase CP15_ACCESS_WRITEUSR:\n\t\t\tif ((address & regionWriteMask_USR[i]) == regionWriteSet_USR[i]) return TRUE ;\n\t\t\tbreak ;\n\t\tcase CP15_ACCESS_WRITESYS:\n\t\t\tif ((address & regionWriteMask_SYS[i]) == regionWriteSet_SYS[i]) return TRUE ;\n\t\t\tbreak ;\n\t\tcase CP15_ACCESS_READUSR:\n\t\t\tif ((address & regionReadMask_USR[i]) == regionReadSet_USR[i]) return TRUE ;\n\t\t\tbreak ;\n\t\tcase CP15_ACCESS_READSYS:\n\t\t\tif ((address & regionReadMask_SYS[i]) == regionReadSet_SYS[i]) return TRUE ;\n\t\t\tbreak ;\n\t\tcase CP15_ACCESS_EXECUSR:\n\t\t\tif ((address & regionExecuteMask_USR[i]) == regionExecuteSet_USR[i]) return TRUE ;\n\t\t\tbreak ;\n\t\tcase CP15_ACCESS_EXECSYS:\n\t\t\tif ((address & regionExecuteMask_SYS[i]) == regionExecuteSet_SYS[i]) return TRUE ;\n\t\t\tbreak ;\n\t\t}\n\t}\n\t/* when protections are enabled, but no region allows access, deny access */\n\treturn FALSE ;\n}\n\nBOOL armcp15_t::dataProcess(u8 CRd, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2)\n{\n\tLOG(\"Unsupported CP15 operation : DataProcess\\n\");\n\treturn FALSE;\n}\n\nBOOL armcp15_t::load(u8 CRd, u8 adr)\n{\n\tLOG(\"Unsupported CP15 operation : Load\\n\");\n\treturn FALSE;\n}\n\nBOOL armcp15_t::store(u8 CRd, u8 adr)\n{\n\tLOG(\"Unsupported CP15 operation : Store\\n\");\n\treturn FALSE;\n}\n\nBOOL armcp15_t::moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2)\n{\n\tif (!cpu)\n\t{\n\t\tprintf(\"ERROR: cp15 don\\'t allocated\\n\");\n\t\treturn FALSE;\n\t}\n\tif(cpu->CPSR.bits.mode == USR) return FALSE;\n\n\tswitch(CRn)\n\t{\n\tcase 0:\n\t\tif((opcode1 == 0)&&(CRm==0))\n\t\t{\n\t\t\tswitch(opcode2)\n\t\t\t{\n\t\t\tcase 1:\n\t\t\t\t*R = cacheType;\n\t\t\t\treturn TRUE;\n\t\t\tcase 2:\n\t\t\t\t*R = TCMSize;\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\t*R = IDCode;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 1:\n\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t{\n\t\t\t*R = ctrl;\n\t\t\t//LOG(\"CP15: CPtoARM ctrl %08X\\n\", ctrl);\n\t\t\treturn TRUE;\n\t\t}\n\t\treturn FALSE;\n\n\tcase 2:\n\t\tif((opcode1==0) && (CRm==0))\n\t\t{\n\t\t\tswitch(opcode2)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\t*R = DCConfig;\n\t\t\t\treturn TRUE;\n\t\t\tcase 1:\n\t\t\t\t*R = ICConfig;\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 3:\n\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t{\n\t\t\t*R = writeBuffCtrl;\n\t\t\t//LOG(\"CP15: CPtoARM writeBuffer ctrl %08X\\n\", writeBuffCtrl);\n\t\t\treturn TRUE;\n\t\t}\n\t\treturn FALSE;\n\tcase 5:\n\t\tif((opcode1==0) && (CRm==0))\n\t\t{\n\t\t\tswitch(opcode2)\n\t\t\t{\n\t\t\tcase 2:\n\t\t\t\t*R = DaccessPerm;\n\t\t\t\treturn TRUE;\n\t\t\tcase 3:\n\t\t\t\t*R = IaccessPerm;\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 6:\n\t\tif((opcode1==0) && (opcode2==0))\n\t\t{\n\t\t\tswitch(CRm)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\t*R = protectBaseSize0;\n\t\t\t\treturn TRUE;\n\t\t\tcase 1:\n\t\t\t\t*R = protectBaseSize1;\n\t\t\t\treturn TRUE;\n\t\t\tcase 2:\n\t\t\t\t*R = protectBaseSize2;\n\t\t\t\treturn TRUE;\n\t\t\tcase 3:\n\t\t\t\t*R = protectBaseSize3;\n\t\t\t\treturn TRUE;\n\t\t\tcase 4:\n\t\t\t\t*R = protectBaseSize4;\n\t\t\t\treturn TRUE;\n\t\t\tcase 5:\n\t\t\t\t*R = protectBaseSize5;\n\t\t\t\treturn TRUE;\n\t\t\tcase 6:\n\t\t\t\t*R = protectBaseSize6;\n\t\t\t\treturn TRUE;\n\t\t\tcase 7:\n\t\t\t\t*R = protectBaseSize7;\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 9:\n\t\tif((opcode1==0))\n\t\t{\n\t\t\tswitch(CRm)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t*R = DcacheLock;\n\t\t\t\t\treturn TRUE;\n\t\t\t\tcase 1:\n\t\t\t\t\t*R = IcacheLock;\n\t\t\t\t\treturn TRUE;\n\t\t\t\tdefault:\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\tcase 1:\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t*R = DTCMRegion;\n\t\t\t\t\treturn TRUE;\n\t\t\t\tcase 1:\n\t\t\t\t\t*R = ITCMRegion;\n\t\t\t\t\treturn TRUE;\n\t\t\t\tdefault:\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tdefault:\n\t\tLOG(\"Unsupported CP15 operation : MRC\\n\");\n\t\treturn FALSE;\n\t}\n}\n\nBOOL armcp15_t::moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2)\n{\n\tif (!cpu)\n\t{\n\t\tprintf(\"ERROR: cp15 don\\'t allocated\\n\");\n\t\treturn FALSE;\n\t}\n\tif(cpu->CPSR.bits.mode == USR) return FALSE;\n\n\tswitch(CRn)\n\t{\n\tcase 1:\n\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t{\n\n\t\t\t//On the NDS bit0,2,7,12..19 are R/W, Bit3..6 are always set, all other bits are always zero.\n\t\t\tctrl = (val & 0x000FF085) | 0x00000078;\n\t\t\tMMU.ARM9_RW_MODE = BIT7(val);\n\t\t\t//zero 31-jan-2010: change from 0x0FFF0000 to 0xFFFF0000 per gbatek\n\t\t\tu32 intVector_old = cpu->intVector;\n\t\t\tcpu->intVector = 0xFFFF0000 * (BIT13(val));\n\t\t\tcpu->LDTBit = !BIT15(val); //TBit\n\t\t\tif (intVector_old != cpu->intVector)\n\t\t\t{\n\t\t\t\tif (arm_cpubase)\n\t\t\t\t\tarm_cpubase->Clear[cpu->proc_ID](0, CPUBASE_FLUSHALL);\n\t\t\t}\n\t\t\t//LOG(\"CP15: ARMtoCP ctrl %08X (val %08X)\\n\", ctrl, val);\n\t\t\treturn TRUE;\n\t\t}\n\t\treturn FALSE;\n\tcase 2:\n\t\tif((opcode1==0) && (CRm==0))\n\t\t{\n\t\t\tswitch(opcode2)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tDCConfig = val;\n\t\t\t\treturn TRUE;\n\t\t\tcase 1:\n\t\t\t\tICConfig = val;\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 3:\n\t\tif((opcode1==0) && (opcode2==0) && (CRm==0))\n\t\t{\n\t\t\twriteBuffCtrl = val;\n\t\t\t//LOG(\"CP15: ARMtoCP writeBuffer ctrl %08X\\n\", writeBuffCtrl);\n\t\t\treturn TRUE;\n\t\t}\n\t\treturn FALSE;\n\tcase 5:\n\t\tif((opcode1==0) && (CRm==0))\n\t\t{\n\t\t\tswitch(opcode2)\n\t\t\t{\n\t\t\tcase 2:\n\t\t\t\tDaccessPerm = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 3:\n\t\t\t\tIaccessPerm = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 6:\n\t\tif((opcode1==0) && (opcode2==0))\n\t\t{\n\t\t\tswitch(CRm)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tprotectBaseSize0 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 1:\n\t\t\t\tprotectBaseSize1 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 2:\n\t\t\t\tprotectBaseSize2 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 3:\n\t\t\t\tprotectBaseSize3 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 4:\n\t\t\t\tprotectBaseSize4 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 5:\n\t\t\t\tprotectBaseSize5 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 6:\n\t\t\t\tprotectBaseSize6 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tcase 7:\n\t\t\t\tprotectBaseSize7 = val;\n\t\t\t\tmaskPrecalc();\n\t\t\t\treturn TRUE;\n\t\t\tdefault:\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 7:\n\t\tif((CRm==0)&&(opcode1==0)&&((opcode2==4)))\n\t\t{\n\t\t\t//CP15wait4IRQ;\n\t\t\tcpu->waitIRQ = TRUE;\n\t\t\tcpu->halt_IE_and_IF = TRUE;\n\n\t\t\t//IME set deliberately omitted: only SWI sets IME to 1\n\t\t\treturn TRUE;\n\t\t}\n\t\tif((CRm==5)&&(opcode1==0))\n\t\t{\n\t\t\tif (opcode2==0)\n\t\t\t{\n\t\t\t\tif (arm_cpubase)\n\t\t\t\t\tarm_cpubase->Clear[cpu->proc_ID](0, CPUBASE_FLUSHALL);\n\t\t\t\t//INFO(\"Flush entire ICache\\n\");\n\t\t\t}\n\t\t\telse if(opcode2==1 || opcode2==2)\n\t\t\t{\n\t\t\t\tif (arm_cpubase)\n\t\t\t\t\tarm_cpubase->Clear[cpu->proc_ID](val, 32);\n\t\t\t\t//INFO(\"Flush single cache line(%u) : 0x%x\\n\", opcode2, val);\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tcase 9:\n\t\tif((opcode1==0))\n\t\t{\n\t\t\tswitch(CRm)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\tDcacheLock = val;\n\t\t\t\t\treturn TRUE;\n\t\t\t\tcase 1:\n\t\t\t\t\tIcacheLock = val;\n\t\t\t\t\treturn TRUE;\n\t\t\t\tdefault:\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\tcase 1:\n\t\t\t\tswitch(opcode2)\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t{\n\t\t\t\t\t\tu32 DTCMRegion_old = MMU.DTCMRegion;\n\t\t\t\t\t\tMMU.DTCMRegion = DTCMRegion = val & 0x0FFFF000;\n\t\t\t\t\t\tif (DTCMRegion_old != DTCMRegion)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (arm_cpubase)\n\t\t\t\t\t\t\t\tarm_cpubase->Clear[cpu->proc_ID](0, CPUBASE_FLUSHALL);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn TRUE;\n\t\t\t\tcase 1:\n\t\t\t\t\tITCMRegion = val;\n\t\t\t\t\t//ITCM base is not writeable!\n\t\t\t\t\tMMU.ITCMRegion = 0;\n\t\t\t\t\treturn TRUE;\n\t\t\t\tdefault:\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n\tdefault:\n\t\treturn FALSE;\n\t}\n}\n\n// Save state\nvoid armcp15_t::saveone(EMUFILE* os)\n{\n\twrite32le(IDCode,os);\n\twrite32le(cacheType,os);\n    write32le(TCMSize,os);\n    write32le(ctrl,os);\n    write32le(DCConfig,os);\n    write32le(ICConfig,os);\n    write32le(writeBuffCtrl,os);\n    write32le(und,os);\n    write32le(DaccessPerm,os);\n    write32le(IaccessPerm,os);\n    write32le(protectBaseSize0,os);\n    write32le(protectBaseSize1,os);\n    write32le(protectBaseSize2,os);\n    write32le(protectBaseSize3,os);\n    write32le(protectBaseSize4,os);\n    write32le(protectBaseSize5,os);\n    write32le(protectBaseSize6,os);\n    write32le(protectBaseSize7,os);\n    write32le(cacheOp,os);\n    write32le(DcacheLock,os);\n    write32le(IcacheLock,os);\n    write32le(ITCMRegion,os);\n    write32le(DTCMRegion,os);\n    write32le(processID,os);\n    write32le(RAM_TAG,os);\n    write32le(testState,os);\n    write32le(cacheDbg,os);\n    for(int i=0;i<8;i++) write32le(regionWriteMask_USR[i],os);\n    for(int i=0;i<8;i++) write32le(regionWriteMask_SYS[i],os);\n    for(int i=0;i<8;i++) write32le(regionReadMask_USR[i],os);\n    for(int i=0;i<8;i++) write32le(regionReadMask_SYS[i],os);\n    for(int i=0;i<8;i++) write32le(regionExecuteMask_USR[i],os);\n    for(int i=0;i<8;i++) write32le(regionExecuteMask_SYS[i],os);\n    for(int i=0;i<8;i++) write32le(regionWriteSet_USR[i],os);\n    for(int i=0;i<8;i++) write32le(regionWriteSet_SYS[i],os);\n    for(int i=0;i<8;i++) write32le(regionReadSet_USR[i],os);\n    for(int i=0;i<8;i++) write32le(regionReadSet_SYS[i],os);\n    for(int i=0;i<8;i++) write32le(regionExecuteSet_USR[i],os);\n    for(int i=0;i<8;i++) write32le(regionExecuteSet_SYS[i],os);\n}\n\nbool armcp15_t::loadone(EMUFILE* is)\n{\n\tif(!read32le(&IDCode,is)) return false;\n\tif(!read32le(&cacheType,is)) return false;\n    if(!read32le(&TCMSize,is)) return false;\n    if(!read32le(&ctrl,is)) return false;\n    if(!read32le(&DCConfig,is)) return false;\n    if(!read32le(&ICConfig,is)) return false;\n    if(!read32le(&writeBuffCtrl,is)) return false;\n    if(!read32le(&und,is)) return false;\n    if(!read32le(&DaccessPerm,is)) return false;\n    if(!read32le(&IaccessPerm,is)) return false;\n    if(!read32le(&protectBaseSize0,is)) return false;\n    if(!read32le(&protectBaseSize1,is)) return false;\n    if(!read32le(&protectBaseSize2,is)) return false;\n    if(!read32le(&protectBaseSize3,is)) return false;\n    if(!read32le(&protectBaseSize4,is)) return false;\n    if(!read32le(&protectBaseSize5,is)) return false;\n    if(!read32le(&protectBaseSize6,is)) return false;\n    if(!read32le(&protectBaseSize7,is)) return false;\n    if(!read32le(&cacheOp,is)) return false;\n    if(!read32le(&DcacheLock,is)) return false;\n    if(!read32le(&IcacheLock,is)) return false;\n    if(!read32le(&ITCMRegion,is)) return false;\n    if(!read32le(&DTCMRegion,is)) return false;\n    if(!read32le(&processID,is)) return false;\n    if(!read32le(&RAM_TAG,is)) return false;\n    if(!read32le(&testState,is)) return false;\n    if(!read32le(&cacheDbg,is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionWriteMask_USR[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionWriteMask_SYS[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionReadMask_USR[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionReadMask_SYS[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionExecuteMask_USR[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionExecuteMask_SYS[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionWriteSet_USR[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionWriteSet_SYS[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionReadSet_USR[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionReadSet_SYS[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionExecuteSet_USR[i],is)) return false;\n    for(int i=0;i<8;i++) if(!read32le(&regionExecuteSet_SYS[i],is)) return false;\n\n    return true;\n}\n\n/* precalculate region masks/sets from cp15 register ----- JIT */\nvoid maskPrecalc()\n{\n#define precalc(num) {  \\\n\tu32 mask = 0, set = 0xFFFFFFFF ; /* (x & 0) == 0xFF..FF is allways false (disabled) */  \\\n\tif (BIT_N(cp15.protectBaseSize##num,0)) /* if region is enabled */ \\\n\t{    /* reason for this define: naming includes var */  \\\n\tmask = MASKFROMREG(cp15.protectBaseSize##num) ;   \\\n\tset = SETFROMREG(cp15.protectBaseSize##num) ; \\\n\tif (SIZEIDENTIFIER(cp15.protectBaseSize##num)==0x1F)  \\\n\t{   /* for the 4GB region, u32 suffers wraparound */   \\\n\tmask = 0 ; set = 0 ;   /* (x & 0) == 0  is allways true (enabled) */  \\\n} \\\n}  \\\n\tcp15.setSingleRegionAccess(cp15.DaccessPerm,cp15.IaccessPerm,num,mask,set) ;  \\\n}\n\tprecalc(0) ;\n\tprecalc(1) ;\n\tprecalc(2) ;\n\tprecalc(3) ;\n\tprecalc(4) ;\n\tprecalc(5) ;\n\tprecalc(6) ;\n\tprecalc(7) ;\n#undef precalc\n}\n\nBOOL armcp15_moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2)\n{\n\treturn cp15.moveARM2CP(val, CRn, CRm, opcode1, opcode2);\n}\n\nBOOL armcp15_moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2)\n{\n\treturn cp15.moveCP2ARM(R, CRn, CRm, opcode1, opcode2);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/cp15.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef __CP15_H__\n#define __CP15_H__\n\n#include \"armcpu.h\"\n#include \"emufile.h\"\n\n#define CP15_ACCESS_WRITE         0\n#define CP15_ACCESS_READ          2\n#define CP15_ACCESS_EXECUTE       4\n#define CP15_ACCESS_WRITEUSR      CP15_ACCESS_WRITE\n#define CP15_ACCESS_WRITESYS      1\n#define CP15_ACCESS_READUSR       CP15_ACCESS_READ\n#define CP15_ACCESS_READSYS       3\n#define CP15_ACCESS_EXECUSR       CP15_ACCESS_EXECUTE\n#define CP15_ACCESS_EXECSYS       5\n\nstruct armcp15_t\n{\npublic:\n        u32 IDCode;\n        u32 cacheType;\n        u32 TCMSize;\n        u32 ctrl;\n        u32 DCConfig;\n        u32 ICConfig;\n        u32 writeBuffCtrl;\n        u32 und;\n        u32 DaccessPerm;\n        u32 IaccessPerm;\n        u32 protectBaseSize0;\n        u32 protectBaseSize1;\n        u32 protectBaseSize2;\n        u32 protectBaseSize3;\n        u32 protectBaseSize4;\n        u32 protectBaseSize5;\n        u32 protectBaseSize6;\n        u32 protectBaseSize7;\n        u32 cacheOp;\n        u32 DcacheLock;\n        u32 IcacheLock;\n        u32 ITCMRegion;\n        u32 DTCMRegion;\n        u32 processID;\n        u32 RAM_TAG;\n        u32 testState;\n        u32 cacheDbg;\n        /* calculated bitmasks for the regions to decide rights uppon */\n        /* calculation is done in the MCR instead of on mem access for performance */\n        u32 regionWriteMask_USR[8] ;\n        u32 regionWriteMask_SYS[8] ;\n        u32 regionReadMask_USR[8] ;\n        u32 regionReadMask_SYS[8] ;\n        u32 regionExecuteMask_USR[8] ;\n        u32 regionExecuteMask_SYS[8] ;\n        u32 regionWriteSet_USR[8] ;\n        u32 regionWriteSet_SYS[8] ;\n        u32 regionReadSet_USR[8] ;\n        u32 regionReadSet_SYS[8] ;\n        u32 regionExecuteSet_USR[8] ;\n        u32 regionExecuteSet_SYS[8] ;\n\n\t\tarmcpu_t *cpu;\n\n\t\tvoid setSingleRegionAccess(u32 dAccess,u32 iAccess,unsigned char num, u32 mask,u32 set);\n\t\tvoid maskPrecalc();\n\npublic:\n\t\tarmcp15_t() :\tIDCode(0),\n\t\t\t\t\t\tcacheType(0),\n\t\t\t\t\t\tTCMSize(0),\n\t\t\t\t\t\tctrl(0),\n\t\t\t\t\t\tDCConfig(0),\n\t\t\t\t\t\tICConfig(0),\n\t\t\t\t\t\twriteBuffCtrl(0),\n\t\t\t\t\t\tund(0),\n\t\t\t\t\t\tDaccessPerm(0),\n\t\t\t\t\t\tIaccessPerm(0),\n\t\t\t\t\t\tprotectBaseSize0(0),\n\t\t\t\t\t\tprotectBaseSize1(0),\n\t\t\t\t\t\tprotectBaseSize2(0),\n\t\t\t\t\t\tprotectBaseSize3(0),\n\t\t\t\t\t\tprotectBaseSize4(0),\n\t\t\t\t\t\tprotectBaseSize5(0),\n\t\t\t\t\t\tprotectBaseSize6(0),\n\t\t\t\t\t\tprotectBaseSize7(0),\n\t\t\t\t\t\tcacheOp(0),\n\t\t\t\t\t\tDcacheLock(0),\n\t\t\t\t\t\tIcacheLock(0),\n\t\t\t\t\t\tITCMRegion(0),\n\t\t\t\t\t\tDTCMRegion(0),\n\t\t\t\t\t\tprocessID(0),\n\t\t\t\t\t\tRAM_TAG(0),\n\t\t\t\t\t\ttestState(0),\n\t\t\t\t\t\tcacheDbg(0),\n\t\t\t\t\t\tcpu(NULL)\n\t\t{\n\t\t\tmemset(&regionWriteMask_USR[0], 0, sizeof(regionWriteMask_USR));\n\t\t\tmemset(&regionWriteMask_SYS[0], 0, sizeof(regionWriteMask_SYS));\n\t\t\tmemset(&regionReadMask_USR[0], 0, sizeof(regionReadMask_USR));\n\t\t\tmemset(&regionReadMask_SYS[0], 0, sizeof(regionReadMask_SYS));\n\t\t\tmemset(&regionExecuteMask_USR[0], 0, sizeof(regionExecuteMask_USR));\n\t\t\tmemset(&regionExecuteMask_SYS[0], 0, sizeof(regionExecuteMask_SYS));\n\t\t\tmemset(&regionWriteSet_USR[0], 0, sizeof(regionWriteSet_USR));\n\t\t\tmemset(&regionWriteSet_SYS[0], 0, sizeof(regionWriteSet_SYS));\n\t\t\tmemset(&regionReadSet_USR[0], 0, sizeof(regionReadSet_USR));\n\t\t\tmemset(&regionReadSet_SYS[0], 0, sizeof(regionReadSet_SYS));\n\t\t\tmemset(&regionExecuteSet_USR[0], 0, sizeof(regionExecuteSet_USR));\n\t\t\tmemset(&regionExecuteSet_SYS[0], 0, sizeof(regionExecuteSet_SYS));\n\t\t}\n\t\tbool reset(armcpu_t * c);\n\t\tBOOL dataProcess(u8 CRd, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2);\n\t\tBOOL load(u8 CRd, u8 adr);\n\t\tBOOL store(u8 CRd, u8 adr);\n\t\tBOOL moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2);\n\t\tBOOL moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2);\n\t\tBOOL isAccessAllowed(u32 address,u32 access);\n\t\t// savestate\n\t\tvoid saveone(EMUFILE* os);\n\t\tbool loadone(EMUFILE* is);\n};\n\nextern armcp15_t cp15;\n\nvoid maskPrecalc();\nBOOL armcp15_moveARM2CP(u32 val, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2);\nBOOL armcp15_moveCP2ARM(u32 * R, u8 CRn, u8 CRm, u8 opcode1, u8 opcode2);\n\n#endif /* __CP15_H__*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ctrlssdl.cpp",
    "content": "/*\n\tCopyright (C) 2007 Pascal Giard\n\tCopyright (C) 2007-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"ctrlssdl.h\"\n#include \"saves.h\"\n#include \"SPU.h\"\n#include \"commandline.h\"\n#include \"NDSSystem.h\"\n#include \"GPU_osd.h\"\n#ifdef FAKE_MIC\n#include \"mic.h\"\n#endif\n\nu16 keyboard_cfg[NB_KEYS];\nu16 joypad_cfg[NB_KEYS];\nu16 nbr_joy;\nmouse_status mouse;\n\nstatic SDL_Joystick **open_joysticks = NULL;\n\n/* Keypad key names */\nconst char *key_names[NB_KEYS] =\n{\n  \"A\", \"B\", \"Select\", \"Start\",\n  \"Right\", \"Left\", \"Up\", \"Down\",\n  \"R\", \"L\", \"X\", \"Y\",\n  \"Debug\", \"Boost\"\n};\n\n/* Joypad Key Codes -- 4-digit Hexadecimal number\n * 1st digit: device ID (0 is first joypad, 1 is second, etc.)\n * 2nd digit: 0 - Axis, 1 - Hat/POV/D-Pad, 2 - Button\n * 3rd & 4th digit: (depends on input type)\n *  Negative Axis - 2 * axis index\n *  Positive Axis - 2 * axis index + 1\n *  Hat Right - 4 * hat index\n *  Hat Left - 4 * hat index + 1\n *  Hat Up - 4 * hat index + 2\n *  Hat Down - 4 * hat index + 3\n *  Button - button index\n */\n \n/* Default joypad configuration */\nconst u16 default_joypad_cfg[NB_KEYS] =\n  { 0x0201,  // A\n    0x0200,  // B\n    0x0205,  // select\n    0x0208,  // start\n    0x0001, // Right\n    0x0000, // Left\n    0x0002, // Up\n    0x0003, // Down\n    0x0207,  // R\n    0x0206,  // L\n    0x0204,  // X\n    0x0203,  // Y\n    0xFFFF, // DEBUG\n    0xFFFF  // BOOST\n  };\n\n/* Load default joystick and keyboard configurations */\nvoid load_default_config(const u16 kbCfg[])\n{\n  memcpy(keyboard_cfg, kbCfg, sizeof(keyboard_cfg));\n  memcpy(joypad_cfg, default_joypad_cfg, sizeof(joypad_cfg));\n}\n\n/* Set all buttons at once */\nstatic void set_joy_keys(const u16 joyCfg[])\n{\n  memcpy(joypad_cfg, joyCfg, sizeof(joypad_cfg));\n}\n\n/* Initialize joysticks */\nBOOL init_joy( void) {\n  int i;\n  BOOL joy_init_good = TRUE;\n\n  //user asked for no joystick\n  if(_commandline_linux_nojoy) {\n\t  printf(\"skipping joystick init\\n\");\n\t  return TRUE;\n  }\n\n  set_joy_keys(default_joypad_cfg);\n\n  if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1)\n    {\n      fprintf(stderr, \"Error trying to initialize joystick support: %s\\n\",\n              SDL_GetError());\n      return FALSE;\n    }\n\n  nbr_joy = SDL_NumJoysticks();\n\n  if ( nbr_joy > 0) {\n    printf(\"Found %d joysticks\\n\", nbr_joy);\n    open_joysticks =\n      (SDL_Joystick**)calloc( sizeof ( SDL_Joystick *), nbr_joy);\n\n    if ( open_joysticks != NULL) {\n      for (i = 0; i < nbr_joy; i++)\n        {\n          SDL_Joystick * joy = SDL_JoystickOpen(i);\n          printf(\"Joystick %d %s\\n\", i, SDL_JoystickName(i));\n          printf(\"Axes: %d\\n\", SDL_JoystickNumAxes(joy));\n          printf(\"Buttons: %d\\n\", SDL_JoystickNumButtons(joy));\n          printf(\"Trackballs: %d\\n\", SDL_JoystickNumBalls(joy));\n          printf(\"Hats: %d\\n\\n\", SDL_JoystickNumHats(joy));\n        }\n    }\n    else {\n      joy_init_good = FALSE;\n    }\n  }\n\n  return joy_init_good;\n}\n\n/* Unload joysticks */\nvoid uninit_joy( void)\n{\n  int i;\n\n  if ( open_joysticks != NULL) {\n    for (i = 0; i < SDL_NumJoysticks(); i++) {\n      SDL_JoystickClose( open_joysticks[i]);\n    }\n\n    free( open_joysticks);\n  }\n\n  open_joysticks = NULL;\n  SDL_QuitSubSystem(SDL_INIT_JOYSTICK);\n}\n\n/* Return keypad vector with given key set to 1 */\nu16 lookup_joy_key (u16 keyval) {\n  int i;\n  u16 Key = 0;\n\n  for(i = 0; i < NB_KEYS; i++)\n    if(keyval == joypad_cfg[i]) {\n      Key = KEYMASK_(i);\n      break;\n    }\n\n  return Key;\n}\n\n/* Return keypad vector with given key set to 1 */\nu16 lookup_key (u16 keyval) {\n  int i;\n  u16 Key = 0;\n\n  for(i = 0; i < NB_KEYS; i++)\n    if(keyval == keyboard_cfg[i]) {\n      Key = KEYMASK_(i);\n      break;\n    }\n\n  return Key;\n}\n\n/* Get pressed joystick key */\nu16 get_joy_key(int index) {\n  BOOL done = FALSE;\n  SDL_Event event;\n  u16 key = joypad_cfg[index];\n\n  /* Enable joystick events if needed */\n  if( SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE )\n    SDL_JoystickEventState(SDL_ENABLE);\n\n  while(SDL_WaitEvent(&event) && !done)\n    {\n      switch(event.type)\n        {\n        case SDL_JOYBUTTONDOWN:\n          printf( \"Device: %d; Button: %d\\n\", event.jbutton.which, event.jbutton.button );\n          key = ((event.jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event.jbutton.button & 255);\n          done = TRUE;\n          break;\n        case SDL_JOYAXISMOTION:\n          /* Dead zone of 50% */\n          if( (abs(event.jaxis.value) >> 14) != 0 )\n            {\n              key = ((event.jaxis.which & 15) << 12) | JOY_AXIS << 8 | ((event.jaxis.axis & 127) << 1);\n              if (event.jaxis.value > 0) {\n                printf( \"Device: %d; Axis: %d (+)\\n\", event.jaxis.which, event.jaxis.axis );\n                key |= 1;\n              }\n              else\n                printf( \"Device: %d; Axis: %d (-)\\n\", event.jaxis.which, event.jaxis.axis );\n              done = TRUE;\n            }\n          break;\n        case SDL_JOYHATMOTION:\n          /* Diagonal positions will be treated as two separate keys being activated, rather than a single diagonal key. */\n          /* JOY_HAT_* are sequential integers, rather than a bitmask */\n          if (event.jhat.value != SDL_HAT_CENTERED) {\n            key = ((event.jhat.which & 15) << 12) | JOY_HAT << 8 | ((event.jhat.hat & 63) << 2);\n            /* Can't just use a switch here because SDL_HAT_* make up a bitmask. We only want one of these when assigning keys. */\n            if ((event.jhat.value & SDL_HAT_UP) != 0) {\n              key |= JOY_HAT_UP;\n              printf( \"Device: %d; Hat: %d (Up)\\n\", event.jhat.which, event.jhat.hat );\n            }\n            else if ((event.jhat.value & SDL_HAT_RIGHT) != 0) {\n              key |= JOY_HAT_RIGHT;\n              printf( \"Device: %d; Hat: %d (Right)\\n\", event.jhat.which, event.jhat.hat );\n            }\n            else if ((event.jhat.value & SDL_HAT_DOWN) != 0) {\n              key |= JOY_HAT_DOWN;\n              printf( \"Device: %d; Hat: %d (Down)\\n\", event.jhat.which, event.jhat.hat );\n            }\n            else if ((event.jhat.value & SDL_HAT_LEFT) != 0) {\n              key |= JOY_HAT_LEFT;\n              printf( \"Device: %d; Hat: %d (Left)\\n\", event.jhat.which, event.jhat.hat );\n            }\n            done = TRUE;\n          }\n          break;\n        }\n    }\n\n  if( SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE )\n    SDL_JoystickEventState(SDL_IGNORE);\n\n  return key;\n}\n\n/* Get and set a new joystick key */\nu16 get_set_joy_key(int index) {\n  joypad_cfg[index] = get_joy_key(index);\n\n  return joypad_cfg[index];\n}\n\nstatic signed long\nscreen_to_touch_range( signed long scr, float size_ratio) {\n  return (signed long)((float)scr * size_ratio);\n}\n\n/* Set mouse coordinates */\nstatic void set_mouse_coord(signed long x,signed long y)\n{\n  if(x<0) x = 0; else if(x>255) x = 255;\n  if(y<0) y = 0; else if(y>192) y = 192;\n  mouse.x = x;\n  mouse.y = y;\n}\n\n/* Update NDS keypad */\nvoid update_keypad(u16 keys)\n{\n\tNDS_beginProcessingInput();\n\tUserButtons& input = NDS_getProcessingUserInput().buttons;\n\tinput.G = (keys>>12)&1;\n\tinput.E = (keys>>8)&1;\n\tinput.W = (keys>>9)&1;\n\tinput.X = (keys>>10)&1;\n\tinput.Y = (keys>>11)&1;\n\tinput.A = (keys>>0)&1;\n\tinput.B = (keys>>1)&1;\n\tinput.S = (keys>>3)&1;\n\tinput.T = (keys>>2)&1;\n\tinput.U = (keys>>6)&1;\n\tinput.D = (keys>>7)&1;\n\tinput.L = (keys>>5)&1;\n\tinput.R = (keys>>4)&1;\n\tinput.F = 0;\n\tNDS_endProcessingInput();\n}\n\n/* Retrieve current NDS keypad */\nu16 get_keypad( void)\n{\n  u16 keypad;\n  keypad = ~MMU.ARM7_REG[0x136];\n  keypad = (keypad & 0x3) << 10;\n#ifdef WORDS_BIGENDIAN\n  keypad |= ~(MMU.ARM9_REG[0x130] | (MMU.ARM9_REG[0x131] << 8)) & 0x3FF;\n#else\n  keypad |= ~((u16 *)MMU.ARM9_REG)[0x130>>1] & 0x3FF;\n#endif\n  return keypad;\n}\n\n/*\n * The internal joystick events processing function\n */\nstatic int\ndo_process_joystick_events( u16 *keypad, SDL_Event *event) {\n  int processed = 1;\n  u16 key_code;\n  u16 key;\n  u16 key_o;\n  u16 key_u;\n  u16 key_r;\n  u16 key_d;\n  u16 key_l;\n\n  switch ( event->type)\n    {\n      /* Joystick axis motion \n         Note: button constants have a 1bit offset. */\n    case SDL_JOYAXISMOTION:\n      key_code = ((event->jaxis.which & 15) << 12) | JOY_AXIS << 8 | ((event->jaxis.axis & 127) << 1);\n      if( (abs(event->jaxis.value) >> 14) != 0 )\n        {\n          if (event->jaxis.value > 0)\n            key_code |= 1;\n          key = lookup_joy_key( key_code );\n          key_o = lookup_joy_key( key_code ^ 1 );\n          if (key != 0)\n            ADD_KEY( *keypad, key );\n          if (key_o != 0)\n            RM_KEY( *keypad, key_o );\n        }\n      else\n        {\n          // Axis is zeroed\n          key = lookup_joy_key( key_code );\n          key_o = lookup_joy_key( key_code ^ 1 );\n          if (key != 0)\n            RM_KEY( *keypad, key );\n          if (key_o != 0)\n            RM_KEY( *keypad, key_o );\n        }\n      break;\n\n    case SDL_JOYHATMOTION:\n      /* Diagonal positions will be treated as two separate keys being activated, rather than a single diagonal key. */\n      /* JOY_HAT_* are sequential integers, rather than a bitmask */\n      key_code = ((event->jhat.which & 15) << 12) | JOY_HAT << 8 | ((event->jhat.hat & 63) << 2);\n      key_u = lookup_joy_key( key_code | JOY_HAT_UP );\n      key_r = lookup_joy_key( key_code | JOY_HAT_RIGHT );\n      key_d = lookup_joy_key( key_code | JOY_HAT_DOWN );\n      key_l = lookup_joy_key( key_code | JOY_HAT_LEFT );\n      if ((key_u != 0) && ((event->jhat.value & SDL_HAT_UP) != 0))\n        ADD_KEY( *keypad, key_u );\n      else if (key_u != 0)\n        RM_KEY( *keypad, key_u );\n      if ((key_r != 0) && ((event->jhat.value & SDL_HAT_RIGHT) != 0))\n        ADD_KEY( *keypad, key_r );\n      else if (key_r != 0)\n        RM_KEY( *keypad, key_r );\n      if ((key_d != 0) && ((event->jhat.value & SDL_HAT_DOWN) != 0))\n        ADD_KEY( *keypad, key_d );\n      else if (key_d != 0)\n        RM_KEY( *keypad, key_d );\n      if ((key_l != 0) && ((event->jhat.value & SDL_HAT_LEFT) != 0))\n        ADD_KEY( *keypad, key_l );\n      else if (key_l != 0)\n        RM_KEY( *keypad, key_l );\n      break;\n\n      /* Joystick button pressed */\n      /* FIXME: Add support for BOOST */\n    case SDL_JOYBUTTONDOWN:\n      key_code = ((event->jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event->jbutton.button & 255);\n      key = lookup_joy_key( key_code );\n      if (key != 0)\n        ADD_KEY( *keypad, key );\n      break;\n\n      /* Joystick button released */\n    case SDL_JOYBUTTONUP:\n      key_code = ((event->jbutton.which & 15) << 12) | JOY_BUTTON << 8 | (event->jbutton.button & 255);\n      key = lookup_joy_key( key_code );\n      if (key != 0)\n        RM_KEY( *keypad, key );\n      break;\n\n    default:\n      processed = 0;\n      break;\n    }\n\n  return processed;\n}\n\n/*\n * Process only the joystick events\n */\nvoid\nprocess_joystick_events( u16 *keypad) {\n  SDL_Event event;\n\n  /* IMPORTANT: Reenable joystick events iif needed. */\n  if(SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE)\n    SDL_JoystickEventState(SDL_ENABLE);\n\n  /* There's an event waiting to be processed? */\n  while (SDL_PollEvent(&event))\n    {\n      do_process_joystick_events( keypad, &event);\n    }\n}\n\nu16 shift_pressed;\n\nvoid\nprocess_ctrls_event( SDL_Event& event,\n                      struct ctrls_event_config *cfg)\n{\n  u16 key;\n  if ( !do_process_joystick_events( &cfg->keypad, &event)) {\n    switch (event.type)\n    {\n      case SDL_VIDEORESIZE:\n        cfg->resize_cb( event.resize.w, event.resize.h, cfg->screen_texture);\n        break;\n\n      case SDL_ACTIVEEVENT:\n        if (cfg->auto_pause && (event.active.state & SDL_APPINPUTFOCUS )) {\n          if (event.active.gain) {\n            cfg->focused = 1;\n            SPU_Pause(0);\n            osd->addLine(\"Auto pause disabled\");\n          } else {\n            cfg->focused = 0;\n            SPU_Pause(1);\n          }\n        }\n        break;\n\n      case SDL_KEYDOWN:\n        switch(event.key.keysym.sym){\n            case SDLK_LSHIFT:\n                shift_pressed |= 1;\n                break;\n            case SDLK_RSHIFT:\n                shift_pressed |= 2;\n                break;\n            default:\n                key = lookup_key(event.key.keysym.sym);\n                ADD_KEY( cfg->keypad, key );\n                break;\n        }\n        break;\n\n      case SDL_KEYUP:\n        switch(event.key.keysym.sym){\n            case SDLK_ESCAPE:\n                cfg->sdl_quit = 1;\n                break;\n\n#ifdef FAKE_MIC\n            case SDLK_m:\n                cfg->fake_mic = !cfg->fake_mic;\n                Mic_DoNoise(cfg->fake_mic);\n                if (cfg->fake_mic)\n                  osd->addLine(\"Fake mic enabled\");\n                else\n                  osd->addLine(\"Fake mic disabled\");\n                break;\n#endif\n\n            case SDLK_o:\n                cfg->boost = !cfg->boost;\n                if (cfg->boost)\n                  osd->addLine(\"Boost mode enabled\");\n                else\n                  osd->addLine(\"Boost mode disabled\");\n                break;\n\n            case SDLK_LSHIFT:\n                shift_pressed &= ~1;\n                break;\n            case SDLK_RSHIFT:\n                shift_pressed &= ~2;\n                break;\n\n            case SDLK_F1:\n            case SDLK_F2:\n            case SDLK_F3:\n            case SDLK_F4:\n            case SDLK_F5:\n            case SDLK_F6:\n            case SDLK_F7:\n            case SDLK_F8:\n            case SDLK_F9:\n            case SDLK_F10:\n                int prevexec;\n                prevexec = execute;\n                execute = FALSE;\n                SPU_Pause(1);\n                if(!shift_pressed){\n                    loadstate_slot(event.key.keysym.sym - SDLK_F1 + 1);\n                }else{\n                    savestate_slot(event.key.keysym.sym - SDLK_F1 + 1);\n                }\n                execute = prevexec;\n                SPU_Pause(!execute);\n                break;\n            default:\n                key = lookup_key(event.key.keysym.sym);\n                RM_KEY( cfg->keypad, key );\n                break;\n        }\n        break;\n\n      case SDL_MOUSEBUTTONDOWN:\n        if(event.button.button==1)\n          mouse.down = TRUE;\n                                            \n      case SDL_MOUSEMOTION:\n        if(!mouse.down)\n          break;\n        else {\n          signed long scaled_x =\n            screen_to_touch_range( event.button.x,\n                                     cfg->nds_screen_size_ratio);\n          signed long scaled_y =\n            screen_to_touch_range( event.button.y,\n                                     cfg->nds_screen_size_ratio);\n\n          if( scaled_y >= 192)\n            set_mouse_coord( scaled_x, scaled_y - 192);\n        }\n        break;\n\n      case SDL_MOUSEBUTTONUP:\n        if(mouse.down) mouse.click = TRUE;\n        mouse.down = FALSE;\n        break;\n\n      case SDL_QUIT:\n        cfg->sdl_quit = 1;\n        break;\n\n      default:\n        break;\n    }\n  }\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/ctrlssdl.h",
    "content": "/*\n\tCopyright (C) 2007 Pascal Giard\n\tCopyright (C) 2007-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef CTRLSSDL_H\n#define CTRLSSDL_H\n\n#ifdef HAVE_GL_GL_H\n#include <GL/gl.h>\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <SDL.h>\n#include \"MMU.h\"\n\n#include \"types.h\"\n\n#define ADD_KEY(keypad,key) ( (keypad) |= (key) )\n#define RM_KEY(keypad,key) ( (keypad) &= ~(key) )\n#define KEYMASK_(k)\t(1 << (k))\n\n#define JOY_AXIS  0\n#define JOY_HAT  1\n#define JOY_BUTTON  2\n\n#define JOY_HAT_RIGHT 0\n#define JOY_HAT_LEFT 1\n#define JOY_HAT_UP 2\n#define JOY_HAT_DOWN 3\n\n#define NB_KEYS\t\t14\n#define KEY_NONE\t\t0\n#define KEY_A\t\t\t1\n#define KEY_B\t\t\t2\n#define KEY_SELECT\t\t3\n#define KEY_START\t\t4\n#define KEY_RIGHT\t\t5\n#define KEY_LEFT\t\t6\n#define KEY_UP\t\t\t7\n#define KEY_DOWN\t\t8\n#define KEY_R\t\t\t9\n#define KEY_L\t\t\t10\n#define KEY_X\t\t\t11\n#define KEY_Y\t\t\t12\n#define KEY_DEBUG\t\t13\n#define KEY_BOOST\t\t14\n\n/* Keypad key names */\nextern const char *key_names[NB_KEYS];\n/* Current keyboard configuration */\nextern u16 keyboard_cfg[NB_KEYS];\n/* Current joypad configuration */\nextern u16 joypad_cfg[NB_KEYS];\n/* Number of detected joypads */\nextern u16 nbr_joy;\n\n#ifndef GTK_UI\nstruct mouse_status\n{\n  signed long x;\n  signed long y;\n  BOOL click;\n  BOOL down;\n};\n\nextern mouse_status mouse;\n#endif // !GTK_UI\n\nstruct ctrls_event_config {\n  unsigned short keypad;\n  float nds_screen_size_ratio;\n  int auto_pause;\n  int focused;\n  int sdl_quit;\n  int boost;\n  int fake_mic;\n#ifdef HAVE_GL_GL_H\n  GLuint *screen_texture;\n  void (*resize_cb)(u16 width, u16 height, GLuint *screen_texture);\n#else\n  void *screen_texture;\n  void (*resize_cb)(u16 width, u16 height, void *screen_texture);\n#endif\n};\n\nvoid load_default_config(const u16 kbCfg[]);\nBOOL init_joy( void);\nvoid uninit_joy( void);\nu16 get_joy_key(int index);\nu16 get_set_joy_key(int index);\nvoid update_keypad(u16 keys);\nu16 get_keypad( void);\nu16 lookup_key (u16 keyval);\nu16 lookup_joy_key (u16 keyval);\nvoid\nprocess_ctrls_event( SDL_Event& event,\n                      struct ctrls_event_config *cfg);\n\nvoid\nprocess_joystick_events( u16 *keypad);\n\n#endif /* CTRLSSDL_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/debug.cpp",
    "content": "/*\n\tCopyright (C) 2006 Guillaume Duhamel\n\tCopyright (C) 2006-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"debug.h\"\n\n#include <algorithm>\n#include <stdarg.h>\n#include <stdio.h>\n#include \"MMU.h\"\n#include \"armcpu.h\"\n#include \"instructions.h\"\n#include \"cp15.h\"\n#include \"NDSSystem.h\"\n#include \"utils/xstring.h\"\n#include \"movie.h\"\n\n#ifdef HAVE_LUA\n#include \"lua-engine.h\"\n#endif\n\narmcpu_t* TDebugEventData::cpu() { return procnum==0?&NDS_ARM9:&NDS_ARM7; }\n\nTDebugEventData DebugEventData;\nu32 debugFlag;\n\n//DEBUG CONFIGURATION\nconst bool debug_acl = false;\nconst bool debug_cacheMiss = false;\n\nstatic bool acl_check_access(u32 adr, u32 access) {\n\n\t//non-user modes get separate access handling, so check that here\n\tif(NDS_ARM9.CPSR.bits.mode != USR)\n\t\taccess |= 1;\n\t\n\tif (cp15.isAccessAllowed(adr,access)==FALSE) {\n\t\tHandleDebugEvent(DEBUG_EVENT_ACL_EXCEPTION);\n\t}\n\treturn true;\n}\n\nvoid HandleDebugEvent_ACL_Exception()\n{\n\tprintf(\"ACL EXCEPTION!\\n\");\n\tif(DebugEventData.memAccessType == MMU_AT_CODE)\n\t\tarmcpu_exception(DebugEventData.cpu(),EXCEPTION_PREFETCH_ABORT);\n\telse if(DebugEventData.memAccessType == MMU_AT_DATA)\n\t\tarmcpu_exception(DebugEventData.cpu(),EXCEPTION_DATA_ABORT);\n}\n\n\nstatic bool CheckRange(u32 adr, u32 min, u32 len)\n{\n\treturn (adr>=min && adr<min+len);\n}\n\nvoid HandleDebugEvent_Read()\n{\n\tif(!debug_acl) return;\n\tif(DebugEventData.procnum != ARMCPU_ARM9) return; //acl only valid on arm9\n\tacl_check_access(DebugEventData.addr,CP15_ACCESS_READ);\n}\n\nvoid HandleDebugEvent_Write()\n{\n\tif(!debug_acl) return;\n\tif(DebugEventData.procnum != ARMCPU_ARM9) return; //acl only valid on arm9\n\tacl_check_access(DebugEventData.addr,CP15_ACCESS_WRITE);\n}\n\nvoid HandleDebugEvent_Execute()\n{\n\t//HACKY BREAKPOINTS!\n\t//extern bool nds_debug_continuing[2];\n\t//if(!nds_debug_continuing[DebugEventData.procnum]) //dont keep hitting the same breakpoint\n\t//{\n\t//\tif((DebugEventData.addr & 0xFFFFFFF0) == 0x02000000)\n\t//\t{\n\t//\t\tvoid NDS_debug_break();\n\t//\t\tNDS_debug_break();\n\t//\t}\n\t//}\n\tif(!debug_acl) return;\n\tif(DebugEventData.procnum != ARMCPU_ARM9) return; //acl only valid on arm9\n\tacl_check_access(DebugEventData.addr,CP15_ACCESS_EXECUTE);\n}\n\nvoid HandleDebugEvent_CacheMiss()\n{\n\tif(!debug_cacheMiss) return;\n\textern int currFrameCounter;\n\tif(currFrameCounter<200) return;\n\tstatic FILE* outf = NULL;\n\tif(!outf) outf = fopen(\"c:\\\\miss.txt\",\"wb\");\n\tfprintf(outf,\"%05d,%08X,%d\\n\",currFrameCounter,DebugEventData.addr,DebugEventData.size);\n}\n\n//------------------------------------------------\nDebugStatistics DEBUG_statistics;\n\nDebugStatistics::DebugStatistics()\n{\n\tmemset(&blockCompileCounters,0,sizeof(blockCompileCounters));\n}\n\nDebugStatistics::InstructionHits::InstructionHits()\n{\n\tmemset(&arm,0,sizeof(arm));\n\tmemset(&thumb,0,sizeof(thumb));\n}\n\n\nstatic DebugStatistics::InstructionHits combinedHits[2];\n\ntemplate<int proc, int which>\nstatic bool debugStatsSort(int num1, int num2) {\n\tif(which==0) {\n\t\tif(combinedHits[proc].arm[num2] == combinedHits[proc].arm[num1]) return false;\n\t\tif(combinedHits[proc].arm[num1] == 0xFFFFFFFF) return false;\n\t\tif(combinedHits[proc].arm[num2] == 0xFFFFFFFF) return true;\n\t\treturn combinedHits[proc].arm[num2] < combinedHits[proc].arm[num1];\n\t}\n\telse {\n\t\tif(combinedHits[proc].thumb[num2] == combinedHits[proc].thumb[num1]) return false;\n\t\tif(combinedHits[proc].thumb[num1] == 0xFFFFFFFF) return false;\n\t\tif(combinedHits[proc].thumb[num2] == 0xFFFFFFFF) return true;\n\t\treturn combinedHits[proc].thumb[num2] < combinedHits[proc].thumb[num1];\n\t}\n}\n\nvoid DebugStatistics::print()\n{\n\t//consolidate opcodes with the same names\n\tfor(int i=0;i<2;i++) { \n\t\tcombinedHits[i] = DEBUG_statistics.instructionHits[i];\n\n\t\tfor(int j=0;j<4096;j++) {\n\t\t\tif(combinedHits[i].arm[j] == 0xFFFFFFFF) \n\t\t\t\tcontinue;\n\t\t\tstd::string name = arm_instruction_names[j];\n\t\t\tfor(int k=j+1;k<4096;k++) {\n\t\t\t\tif(combinedHits[i].arm[k] == 0xFFFFFFFF) \n\t\t\t\t\tcontinue;\n\t\t\t\tif(name == arm_instruction_names[k]) {\n\t\t\t\t\t//printf(\"combining %s with %d and %d\\n\",name.c_str(),combinedHits[i].arm[j],combinedHits[i].arm[k]);\n\t\t\t\t\tcombinedHits[i].arm[j] += combinedHits[i].arm[k];\n\t\t\t\t\tcombinedHits[i].arm[k] = 0xFFFFFFFF;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\tfor(int j=0;j<1024;j++) {\n\t\t\tif(combinedHits[i].thumb[j] == 0xFFFFFFFF) \n\t\t\t\tcontinue;\n\t\t\tstd::string name = thumb_instruction_names[j];\n\t\t\tfor(int k=j+1;k<1024;k++) {\n\t\t\t\tif(combinedHits[i].thumb[k] == 0xFFFFFFFF) \n\t\t\t\t\tcontinue;\n\t\t\t\tif(name == thumb_instruction_names[k]) {\n\t\t\t\t\t//printf(\"combining %s with %d and %d\\n\",name.c_str(),combinedHits[i].arm[j],combinedHits[i].arm[k]);\n\t\t\t\t\tcombinedHits[i].thumb[j] += combinedHits[i].thumb[k];\n\t\t\t\t\tcombinedHits[i].thumb[k] = 0xFFFFFFFF;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tInstructionHits sorts[2];\n\tfor(int i=0;i<2;i++) {\n\t\tfor(int j=0;j<4096;j++) sorts[i].arm[j] = j;\n\t\tfor(int j=0;j<1024;j++) sorts[i].thumb[j] = j;\n\t}\n\tstd::sort(sorts[0].arm, sorts[0].arm+4096, debugStatsSort<0,0>);\n\tstd::sort(sorts[0].thumb, sorts[0].thumb+1024, debugStatsSort<0,1>);\n\tstd::sort(sorts[1].arm, sorts[1].arm+4096, debugStatsSort<1,0>);\n\tstd::sort(sorts[1].thumb, sorts[1].thumb+1024, debugStatsSort<1,1>);\n\n\tint count[2] = {0};\n\tfor(int i=0;i<2;i++) {\n\t\tINFO(\"Block Compiled: %d:\\n\",blockCompileCounters[i]);\n\t\tINFO(\"Top arm instructions for ARM%d:\\n\",9-i*2);\n\t\tfor(int j=0;j<15;j++) {\n\t\t\tint val = sorts[i].arm[j];\n\t\t\tif (combinedHits[i].arm[val] > 0)\n\t\t\t{\n\t\t\t\tINFO(\"%010d: %s\\n\", combinedHits[i].arm[val], arm_instruction_names[val]);\n\t\t\t\tcount[i] += combinedHits[i].arm[val];\n\t\t\t}\n\t\t}\n\t\tprintf(\"Top thumb instructions for ARM%d:\\n\",9-i*2);\n\t\tfor(int j=0;j<15;j++) {\n\t\t\tint val = sorts[i].thumb[j];\n\t\t\tif (combinedHits[i].thumb[val] > 0)\n\t\t\t{\n\t\t\t\tINFO(\"%010d: %s\\n\", combinedHits[i].thumb[val], thumb_instruction_names[val]);\n\t\t\t\tcount[i] += combinedHits[i].thumb[val];\n\t\t\t}\n\t\t}\n\t}\n\n\tINFO(\"%d, %d, %d\\n\", count[0], count[1], count[0]+count[1]);\n}\n\nvoid DebugStatistics::printSequencerExecutionCounters()\n{\n\tfor(int i=0;i<21;i++) INFO(\"%06d \",sequencerExecutionCounters[i]);\n\tINFO(\"\\n\");\n}\n\nvoid DEBUG_reset()\n{\n\t//for now, just enable all debugging in developer builds\n#ifdef DEVELOPER\n\tdebugFlag = 1;\n#endif\n\n\tDEBUG_Notify = DebugNotify();\n\tDEBUG_statistics = DebugStatistics();\n\tprintf(\"DEBUG_reset: %08X\\n\",&DebugStatistics::print); //force a reference to this function\n}\n\nstatic void DEBUG_dumpMemory_fill(EMUFILE *fp, u32 size)\n{\n\tstatic std::vector<u8> buf;\n\tbuf.resize(size);\n\tmemset(&buf[0],0,size);\n\tfp->fwrite(&buf[0],size);\n}\n\nvoid DEBUG_dumpMemory(EMUFILE* fp)\n{\n\tfp->fseek(0x000000,SEEK_SET); fp->fwrite(MMU.MAIN_MEM,0x800000); //arm9 main mem (8192K)\n\tfp->fseek(0x900000,SEEK_SET); fp->fwrite(MMU.ARM9_DTCM,0x4000); //arm9 DTCM (16K)\n\tfp->fseek(0xA00000,SEEK_SET); fp->fwrite(MMU.ARM9_ITCM,0x8000); //arm9 ITCM (32K)\n\tfp->fseek(0xB00000,SEEK_SET); fp->fwrite(MMU.ARM9_LCD,0xA4000); //LCD mem 656K\n\tfp->fseek(0xC00000,SEEK_SET); fp->fwrite(MMU.ARM9_VMEM,0x800); //OAM\n\tfp->fseek(0xD00000,SEEK_SET); fp->fwrite(MMU.ARM7_ERAM,0x10000); //arm7 WRAM (64K)\n\tfp->fseek(0xE00000,SEEK_SET); fp->fwrite(MMU.ARM7_WIRAM,0x10000); //arm7 wifi RAM ?\n\tfp->fseek(0xF00000,SEEK_SET); fp->fwrite(MMU.SWIRAM,0x8000); //arm9/arm7 shared WRAM (32KB)\n}\n\n//----------------------------------------------------\n\nstd::vector<Logger *> Logger::channels;\n\n\nstatic void defaultCallback(const Logger& logger, const char * message) {\n\tlogger.getOutput() << message;\n}\n\nLogger::Logger() {\n\tout = &std::cout;\n\tcallback = defaultCallback;\n\tflags = 0;\n}\n\nLogger::~Logger() {\n\tfor(int i=0;i<(int)channels.size();i++)\n\t\tdelete channels[i];\n}\n\nvoid Logger::vprintf(const char * format, va_list l, const char * file, unsigned int line) {\n\tchar buffer[1024];\n\tchar * cur = buffer;\n\n\tif (flags & Logger::FILE) cur += sprintf(cur, \"%s:\", file);\n\tif (flags & Logger::LINE) cur += sprintf(cur, \"%d:\", line);\n\tif (flags) cur += sprintf(cur, \" \");\n\n\t::vsnprintf(cur, 1024, format, l);\n\tcallback(*this, buffer);\n}\n\nvoid Logger::setOutput(std::ostream * o) {\n\tout = o;\n}\n\nvoid Logger::setCallback(void (*cback)(const Logger& logger, const char * message)) {\n\tcallback = cback;\n}\n\nvoid Logger::setFlag(unsigned int flag) {\n\tthis->flags = flag;\n}\n\nvoid Logger::fixSize(unsigned int channel) {\n\twhile(channel >= channels.size()) {\n\t\tchannels.push_back(new Logger());\n\t}\n}\n\nstd::ostream& Logger::getOutput() const {\n\treturn *out;\n}\n\nvoid Logger::log(unsigned int channel, const char * file, unsigned int line, const char * format, ...) {\n\tfixSize(channel);\n\n\tva_list l;\n\tva_start(l, format);\n\tchannels[channel]->vprintf(format, l, file, line);\n\tva_end(l);\n}\n\nvoid Logger::log(unsigned int channel, const char * file, unsigned int line, std::ostream& os) {\n\tfixSize(channel);\n\n\tchannels[channel]->setOutput(&os);\n}\n\nvoid Logger::log(unsigned int channel, const char * file, unsigned int line, unsigned int flag) {\n\tfixSize(channel);\n\n\tchannels[channel]->setFlag(flag);\n}\n\nvoid Logger::log(unsigned int channel, const char * file, unsigned int line, void (*callback)(const Logger& logger, const char * message)) {\n\tfixSize(channel);\n\n\tchannels[channel]->setCallback(callback);\n}\n\nvoid Logger::setCallbackAll(void (*cback)(const Logger& logger, const char * message)) {\n\tfor(std::vector<Logger*>::iterator it = Logger::channels.begin() ; it != Logger::channels.end() ; ++it)\n\t\t(*it)->setCallback(cback);\n}\n\nvoid IdeasLog(armcpu_t* cpu)\n{\n\tu32 adr = cpu->R[0];\n\tfor(;;) {\n\t\tu8 c = _MMU_read08(cpu->proc_ID, MMU_AT_DEBUG, adr);\n\t\tadr++;\n\t\tif(!c) break;\n\t\tprintf(\"%c\",c);\n\t}\n\t//don't emit a newline. that is a pain in the butt.\n}\n\nvoid NocashMessage(armcpu_t* cpu, int offset)\n{\n\tu32 adr = cpu->instruct_adr + offset;\n\n\tstd::string todo;\n\tfor(;;) {\n\t\tu8 c = _MMU_read08(cpu->proc_ID, MMU_AT_DEBUG, adr);\n\t\tadr++;\n\t\tif(!c) break;\n\t\ttodo.push_back(c);\n\t}\n\n\t//r0,r1,r2,...,r15  show register content (displayed as 32bit Hex number)\n\t//sp,lr,pc          alias for r13,r14,r15\n\t//scanline          show current scanline number\n\t//frame             show total number of frames since coldboot\n\t//totalclks         show total number of clock cycles since coldboot\n\t//lastclks          show number of cycles since previous lastclks (or zeroclks)\n\t//zeroclks          resets the 'lastclks' counter\n\n\t//this is very inefficiently coded!\n\tchar tmp[100];\n\ttodo = mass_replace(todo,\"%sp%\",\"%r13%\");\n\ttodo = mass_replace(todo,\"%lr%\",\"%r14%\");\n\ttodo = mass_replace(todo,\"%pc%\",\"%r15%\");\n\tsprintf(tmp,\"%08X\",cpu->R[0]); todo = mass_replace(todo,\"%r0%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[1]); todo = mass_replace(todo,\"%r1%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[2]); todo = mass_replace(todo,\"%r2%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[3]); todo = mass_replace(todo,\"%r3%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[4]); todo = mass_replace(todo,\"%r4%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[5]); todo = mass_replace(todo,\"%r5%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[6]); todo = mass_replace(todo,\"%r6%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[7]); todo = mass_replace(todo,\"%r7%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[8]); todo = mass_replace(todo,\"%r8%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[9]); todo = mass_replace(todo,\"%r9%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[10]); todo = mass_replace(todo,\"%r10%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[11]); todo = mass_replace(todo,\"%r11%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[12]); todo = mass_replace(todo,\"%r12%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[13]); todo = mass_replace(todo,\"%r13%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[14]); todo = mass_replace(todo,\"%r14%\",tmp);\n\tsprintf(tmp,\"%08X\",cpu->R[15]); todo = mass_replace(todo,\"%r15%\",tmp);\n\tsprintf(tmp,\"%d\",nds.VCount); todo = mass_replace(todo,\"%scanline%\",tmp);\n\tsprintf(tmp,\"%d\",currFrameCounter); todo = mass_replace(todo,\"%frame%\",tmp);\n\tsprintf(tmp,\"%lld\",nds_timer); todo = mass_replace(todo,\"%totalclks%\",tmp);\n\n\tprintf(\"%s\",todo.c_str());\n}\n\n//-------\nDebugNotify DEBUG_Notify;\n\n//enable bits arent being used right now.\n//if you want exhaustive logging, move the print before the early return (or comment the early return)\n\n//the intent of this system is to provide a compact dialog box showing which debug notifies have been\n//triggered in this frame (with a glowing LED!) and which debug notifies have been triggered EVER\n//which can be cleared, like a clip indicator in an audio tool.\n//obviously all this isnt implemented yet.\n\nvoid DebugNotify::NextFrame()\n{\n#ifdef DEVELOPER\n\tpingBits.reset();\n#endif\n}\n\nvoid DebugNotify::ReadBeyondEndOfCart(u32 addr, u32 romsize)\n{\n#ifdef DEVELOPER\n\tif(!ping(DEBUG_NOTIFY_READ_BEYOND_END_OF_CART)) return;\n\tINFO(\"Reading beyond end of cart! ... %08X >= %08X\\n\",addr,romsize);\n#endif\n}\n\nbool DebugNotify::ping(EDEBUG_NOTIFY which)\n{\n\tbool wasPinged = pingBits[(int)which];\n\tpingBits[(int)which] = true;\n\treturn !wasPinged;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/debug.h",
    "content": "/*\n\tCopyright (C) 2006 Guillaume Duhamel\n\tCopyright (C) 2006-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef DEBUG_H\n#define DEBUG_H\n\n#include <vector>\n#include <iostream>\n#include <cstdarg>\n#include <bitset>\n\n#include \"types.h\"\n#include \"mem.h\"\n#include \"emufile.h\"\n\nstruct DebugStatistics\n{\n\tDebugStatistics();\n\tstruct InstructionHits {\n\t\tInstructionHits();\n\t\tu32 thumb[1024];\n\t\tu32 arm[4096];\n\t} instructionHits[2]; //one for each cpu\n\n\tu32 blockCompileCounters[2];\n\n\ts32 sequencerExecutionCounters[32];\n\n\tvoid print();\n\tvoid printSequencerExecutionCounters();\n};\n\nextern DebugStatistics DEBUG_statistics;\n\nvoid DEBUG_reset();\nvoid DEBUG_dumpMemory(EMUFILE* fp);\n\nstruct armcpu_t;\n\nclass Logger {\nprotected:\n\tvoid (*callback)(const Logger& logger, const char * format);\n\tstd::ostream * out;\n\tunsigned int flags;\n\n\tstatic void fixSize(unsigned int channel);\npublic:\n\tLogger();\n\t~Logger();\n\n\tvoid vprintf(const char * format, va_list l, const char * filename, unsigned int line);\n\tvoid setOutput(std::ostream * o);\n\tvoid setCallback(void (*cback)(const Logger& logger, const char * message));\n\tvoid setFlag(unsigned int flag);\n\n\tstd::ostream& getOutput() const;\n\n\tstatic const int LINE = 1;\n\tstatic const int FILE = 2;\n\t\n\tstatic std::vector<Logger *> channels;\n\n\tstatic void log(unsigned int channel, const char * file, unsigned int line, const char * format, ...);\n\tstatic void log(unsigned int channel, const char * file, unsigned int line, std::ostream& os);\n\tstatic void log(unsigned int channel, const char * file, unsigned int line, unsigned int flag);\n\tstatic void log(unsigned int channel, const char * file, unsigned int line, void (*callback)(const Logger& logger, const char * message));\n\n\tstatic void setCallbackAll(void (*cback)(const Logger& logger, const char * message));\n};\n\n#if defined(DEBUG) || defined(GPUDEBUG) || defined(DIVDEBUG) || defined(SQRTDEBUG) || defined(DMADEBUG) || defined(DEVELOPER)\n#define LOGC(channel, ...) Logger::log(channel, __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define LOGC(...) {}\n#endif\n\n#ifdef DEBUG\n#define LOG(...) LOGC(0, __VA_ARGS__)\n#else\n#define LOG(...) {}\n#endif\n\n#ifdef GPUDEBUG\n#define GPULOG(...) LOGC(1, __VA_ARGS__)\n#else\n#define GPULOG(...) {}\n#endif\n\n#ifdef DIVDEBUG\n#define DIVLOG(...) LOGC(2, __VA_ARGS__)\n#else\n#define DIVLOG(...) {}\n#endif\n\n#ifdef SQRTDEBUG\n#define SQRTLOG(...) LOGC(3, __VA_ARGS__)\n#else\n#define SQRTLOG(...) {}\n#endif\n\n#ifdef DMADEBUG\n#define DMALOG(...) LOGC(4, __VA_ARGS__)\n#else\n#define DMALOG(...) {}\n#endif\n\n#ifdef CFLASHDEBUG\n#define CFLASHLOG(...) LOGC(5, __VA_ARGS__)\n#else\n#define CFLASHLOG(...) {}\n#endif\n\n#ifdef UNTESTEDOPCODEDEBUG\n#define UNTESTEDOPCODELOG(...) LOGC(6, __VA_ARGS__)\n#else\n#define UNTESTEDOPCODELOG(...) {}\n#endif\n\n\n#ifdef DEVELOPER\n#define PROGINFO(...) LOGC(7, __VA_ARGS__)\n#else\n#define PROGINFO(...) {}\n#endif\n\n\n#define INFOC(channel, ...) Logger::log(channel, __FILE__, __LINE__, __VA_ARGS__)\n#define INFO(...) INFOC(10, __VA_ARGS__)\n\nvoid IdeasLog(armcpu_t* cpu);\nvoid NocashMessage(armcpu_t* cpu, int offset);\n\nenum EDEBUG_EVENT\n{\n\tDEBUG_EVENT_READ=1, //read from arm9 or arm7 bus, including cpu prefetch\n\tDEBUG_EVENT_WRITE=2, //write on arm9 or arm7 bus\n\tDEBUG_EVENT_EXECUTE=3, //prefetch on arm9 or arm7, triggered after the read event\n\tDEBUG_EVENT_ACL_EXCEPTION=4, //acl exception on arm9\n\tDEBUG_EVENT_CACHE_MISS=5, //cache miss on arm9\n};\n\nenum EDEBUG_NOTIFY\n{\n\tDEBUG_NOTIFY_READ_BEYOND_END_OF_CART,\n\tDEBUG_NOTIFY_MAX\n};\n\nclass DebugNotify\n{\npublic:\n\tvoid NextFrame();\n\tvoid ReadBeyondEndOfCart(u32 addr, u32 romsize);\nprivate:\n\tstd::bitset<DEBUG_NOTIFY_MAX> pingBits;\n\tstd::bitset<DEBUG_NOTIFY_MAX> enableBits;\n\tbool ping(EDEBUG_NOTIFY which);\n};\n\nextern DebugNotify DEBUG_Notify;\nstruct armcpu_t;\n\n//information about a debug event will be stuffed into here by the generator\nstruct TDebugEventData\n{\n\tMMU_ACCESS_TYPE memAccessType;\n\tu32 procnum, addr, size, val;\n\tarmcpu_t* cpu();\n};\n\nextern TDebugEventData DebugEventData;\n\n//bits in here are set according to what debug handlers are installed?\n//for now it is just a single bit\nextern u32 debugFlag;\n\nFORCEINLINE bool CheckDebugEvent(EDEBUG_EVENT event)\n{\n\t//for now, debug events are only handled in dev+ builds\n#ifndef DEVELOPER\n\treturn false;\n#endif\n\n\tif(!debugFlag) return false;\n\n\treturn true;\n}\n\nvoid HandleDebugEvent_Read();\nvoid HandleDebugEvent_Write();\nvoid HandleDebugEvent_Execute();\nvoid HandleDebugEvent_ACL_Exception();\nvoid HandleDebugEvent_CacheMiss();\n\ninline void HandleDebugEvent(EDEBUG_EVENT event)\n{\n\tswitch(event)\n\t{\n\tcase DEBUG_EVENT_READ: HandleDebugEvent_Read(); return;\n\tcase DEBUG_EVENT_WRITE: HandleDebugEvent_Write(); return;\n\tcase DEBUG_EVENT_EXECUTE: HandleDebugEvent_Execute(); return;\n\tcase DEBUG_EVENT_ACL_EXCEPTION: HandleDebugEvent_ACL_Exception(); return;\n\tcase DEBUG_EVENT_CACHE_MISS: HandleDebugEvent_CacheMiss(); return;\n\t}\n}\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/desmume.mk",
    "content": "AM_CFLAGS = \nAM_CPPFLAGS = -I$(top_srcdir)/src\nAM_LDFLAGS ="
  },
  {
    "path": "app/src/main/jni/desmume/src/desmume_config.cpp",
    "content": "/*\n\tCopyright (C) 2009-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <glib.h>\n#include <glib/gstdio.h>\n\n#include \"ctrlssdl.h\"\n#include \"desmume_config.h\"\n\nstatic const gchar *desmume_old_config_file = \".desmume.ini\";\nstatic const gchar *desmume_config_dir = \"desmume\";\nstatic const gchar *desmume_config_file = \"config\";\n\nGKeyFile *desmume_config_read_file(const u16 *kb_cfg)\n{\n    gchar *config_file, *config_dir, *old_config_file;\n    GKeyFile *keyfile;\n    GError *error = NULL;\n    gboolean ret;\n\n    old_config_file = g_build_filename(g_get_home_dir(), desmume_old_config_file, NULL);\n    config_file = g_build_filename(g_get_user_config_dir(), desmume_config_dir, desmume_config_file, NULL);\n\n    config_dir = g_build_filename(g_get_user_config_dir(), desmume_config_dir, NULL);\n    g_mkdir_with_parents(config_dir, 0755);\n\n    if (!g_file_test(config_file, G_FILE_TEST_IS_REGULAR) && g_file_test(old_config_file, G_FILE_TEST_IS_REGULAR)) {\n        ret = g_rename(old_config_file, config_file);\n        if (ret) {\n            g_printerr(\"Failed to move old config file %s to new location %s \\n\", old_config_file, config_file);\n        }\n    }\n\n    keyfile = g_key_file_new();\n    ret = g_key_file_load_from_file(keyfile, config_file, G_KEY_FILE_NONE, &error);\n    if (!ret) {\n        g_error_free(error);\n    }\n\n    g_free(config_file);\n    g_free(config_dir);\n    g_free(old_config_file);\n\n    load_default_config(kb_cfg);\n    desmume_config_read_keys(keyfile);\n    desmume_config_read_joykeys(keyfile);\n\n    return keyfile;\n}\n\nvoid desmume_config_dispose(GKeyFile *keyfile)\n{\n    g_key_file_free(keyfile);\n}\n\nstatic gboolean desmume_config_write_file(GKeyFile *keyfile)\n{\n    gchar *config_file;\n    gchar *config_dir;\n    gchar *data;\n    GError *error = NULL;\n    gsize length;\n    gboolean ret = TRUE;\n\n    config_dir = g_build_filename(g_get_user_config_dir(), desmume_config_dir, NULL);\n    g_mkdir_with_parents(config_dir, 0755);\n    config_file = g_build_filename(g_get_user_config_dir(), desmume_config_dir, desmume_config_file, NULL);\n    data = g_key_file_to_data(keyfile, &length, NULL);\n    ret = g_file_set_contents(config_file, data, length, &error);\n    if (!ret) {\n      g_error_free(error);\n    }\n\n    g_free(config_file);\n    g_free(config_dir);\n    g_free(data);\n\n    return ret;\n}\n\ngboolean desmume_config_update_keys(GKeyFile *keyfile)\n{\n    for(int i = 0; i < NB_KEYS; i++) {\n        g_key_file_set_integer(keyfile, \"KEYS\", key_names[i], keyboard_cfg[i]);\n    }\n\n    return desmume_config_write_file(keyfile);\n}\n\ngboolean desmume_config_update_joykeys(GKeyFile *keyfile)\n{\n    for(int i = 0; i < NB_KEYS; i++) {\n        g_key_file_set_integer(keyfile, \"JOYKEYS\", key_names[i], joypad_cfg[i]);\n    }\n\n    return desmume_config_write_file(keyfile);\n}\n\ngboolean desmume_config_read_keys(GKeyFile *keyfile)\n{\n    GError *error = NULL;\n\n    if (!g_key_file_has_group(keyfile, \"KEYS\"))\n        return TRUE;\n\n    for (int i = 0; i < NB_KEYS; i++) {\n        keyboard_cfg[i] = g_key_file_get_integer(keyfile, \"KEYS\", key_names[i], &error);\n        if (error != NULL) {\n            g_error_free(error);\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n\ngboolean desmume_config_read_joykeys(GKeyFile *keyfile)\n{\n    GError *error = NULL;\n\n    if (!g_key_file_has_group(keyfile, \"JOYKEYS\"))\n        return TRUE;\n\n    for (int i = 0; i < NB_KEYS; i++) {\n        joypad_cfg[i] = g_key_file_get_integer(keyfile, \"JOYKEYS\", key_names[i], &error);\n        if (error != NULL) {\n            g_error_free(error);\n            return FALSE;\n        }\n    }\n\n    return TRUE;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/desmume_config.h",
    "content": "/*\n\tCopyright (C) 2009-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _DESMUME_GTK_CONFIG\n#define _DESMUME_GTK_CONFIG\n\nGKeyFile *desmume_config_read_file(const u16 *);\nvoid desmume_config_dispose(GKeyFile *);\n\ngboolean desmume_config_update_keys(GKeyFile*);\ngboolean desmume_config_update_joykeys(GKeyFile*);\ngboolean desmume_config_read_keys(GKeyFile*);\ngboolean desmume_config_read_joykeys(GKeyFile*);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/driver.cpp",
    "content": "/*\r\n\tCopyright (C) 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"types.h\"\r\n#include \"driver.h\"\r\n#include \"rasterize.h\"\r\n#include \"gfx3d.h\"\r\n#include \"texcache.h\"\r\n\r\n\r\n#ifdef HAVE_WX\r\n#include \"wx/wxprec.h\"\r\n#include \"wx/wx.h\"\r\n#include \"wxdlg/wxdlg3dViewer.h\"\r\n\r\nconst int kViewportWidth = 256;\r\nconst int kViewportHeight = 192;\r\n\r\nstatic SoftRasterizerEngine engine;\r\nstatic Fragment _screen[kViewportWidth*kViewportHeight];\r\nstatic FragmentColor _screenColor[kViewportWidth*kViewportHeight];\r\n\r\nextern void _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine);\r\n\r\nclass Mywxdlg3dViewer : public wxdlg3dViewer\r\n{\r\npublic:\r\n\tMywxdlg3dViewer()\r\n\t\t: wxdlg3dViewer(NULL)\r\n\t{}\r\n\r\n\tvirtual void RepaintPanel()\r\n\t{\r\n\t\tRefresh(false);\r\n\t\tUpdate();\r\n\t}\r\n\r\n\tvoid NewFrame()\r\n\t{\r\n\t\tlistPolys->SetItemCount(viewer3d_state->polylist.count);\r\n\t\tlabelFrameCounter->SetLabel(wxString::Format(wxT(\"Frame: %d\"),viewer3d_state->frameNumber));\r\n\t\tlabelUserPolycount->SetLabel(wxString::Format(wxT(\"User Polys: %d\"),viewer3d_state->polylist.count));\r\n\t\tlabelFinalPolycount->SetLabel(wxString::Format(wxT(\"Final Polys: %d\"),viewer3d_state->polylist.count));\r\n\t\t//tree->DeleteAllItems();\r\n\t\t//tree->Freeze();\r\n\t\t//wxTreeItemId root = tree->AddRoot(\"\");\r\n\t\t//for(int i=0;i<viewer3d_state->polylist.count;i++)\r\n\t\t//{\r\n\t\t//\ttree->AppendItem(root,\"hai kirin\");\r\n\t\t//}\r\n\t\t//tree->Thaw();\r\n\t}\r\n\r\n\tvirtual wxString OnGetItemText(const wxListCtrl* list, long item, long column) const\r\n\t{\r\n\t\treturn wxT(\"hi\");\r\n\t}\r\n\r\n\tvirtual void OnListPolysSelected( wxListEvent& event )\r\n\t{\r\n\t\tpanelTexture->Refresh(false);\r\n\t\tengine._debug_drawClippedUserPoly = GetSelectedListviewItem(listPolys);\r\n\t}\r\n\r\n\tvoid RedrawPanel(wxClientDC* dc)\r\n\t{\r\n\t\t//------------\r\n\t\t//do the 3d work..\r\n\t\tengine.polylist = &viewer3d_state->polylist;\r\n\t\tengine.vertlist = &viewer3d_state->vertlist;\r\n\t\tengine.indexlist = &viewer3d_state->indexlist;\r\n\t\tengine.screen = _screen;\r\n\t\tengine.screenColor = _screenColor;\r\n\t\tengine.width = kViewportWidth;\r\n\t\tengine.height = kViewportHeight;\r\n\r\n\t\tengine.updateFogTable();\r\n\t\r\n\t\tengine.initFramebuffer(kViewportWidth,kViewportHeight,gfx3d.state.enableClearImage?true:false);\r\n\t\tengine.updateToonTable();\r\n\t\tengine.updateFloatColors();\r\n\t\tengine.performClipping(checkMaterialInterpolate->IsChecked());\r\n\t\tengine.performViewportTransforms<true>(kViewportWidth,kViewportHeight);\r\n\t\tengine.performBackfaceTests();\r\n\t\tengine.performCoordAdjustment(false);\r\n\t\tengine.setupTextures(false);\r\n\r\n\t\t_HACK_Viewer_ExecUnit(&engine);\r\n\t\t//------------\r\n\r\n\t\t//dc.SetBackground(*wxGREEN_BRUSH); dc.Clear();\r\n\t\tu8 framebuffer[kViewportWidth*kViewportHeight*3];\r\n\t\tfor(int y=0,i=0;y<kViewportHeight;y++)\r\n\t\t\tfor(int x=0;x<kViewportWidth;x++,i++) {\r\n\t\t\t\tframebuffer[i*3] = _screenColor[i].r<<2;\r\n\t\t\t\tframebuffer[i*3+1] = _screenColor[i].g<<2;\r\n\t\t\t\tframebuffer[i*3+2] = _screenColor[i].b<<2;\r\n\t\t\t}\r\n\t\twxImage image(kViewportWidth,kViewportHeight,framebuffer,true);\r\n\t\twxBitmap bitmap(image);\r\n\t\tdc->DrawBitmap(bitmap,0,0);\r\n\t}\r\n\r\n\tvirtual void _OnPaintPanel( wxPaintEvent& event )\r\n\t{\r\n\t\twxClientDC dc(wxDynamicCast(event.GetEventObject(), wxWindow));\r\n\t\tRedrawPanel(&dc);\r\n\t}\r\n\r\n\tint GetSelectedListviewItem(wxListCtrl* list)\r\n\t{\r\n\t\t return list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);\r\n\t}\r\n\r\n\tvirtual void OnPaintPanelTexture( wxPaintEvent& event )\r\n\t{\r\n\t\twxPaintDC dc(wxDynamicCast(event.GetEventObject(), wxWindow));\r\n\t\tdc.SetBackground(*wxBLACK_BRUSH); dc.Clear();\r\n\r\n\t\tint selection = GetSelectedListviewItem(listPolys);\r\n\t\tif(selection < 0) return;\r\n\t\tif(selection>=viewer3d_state->polylist.count) return;\r\n\r\n\t\tPOLY& poly = viewer3d_state->polylist.list[selection];\r\n\r\n\t\tTexCacheItem* texkey = TexCache_SetTexture(TexFormat_32bpp,poly.texParam,poly.texPalette);\r\n\t\tconst u32 w = texkey->sizeX;\r\n\t\tconst u32 h = texkey->sizeY;\r\n\t\tu8* const bmpdata = new u8[w*h*4];\r\n\t\tfor(u32 i=0;i<w*h;i++) {\r\n\t\t\t\tbmpdata[i*3] = texkey->decoded[i*4];\r\n\t\t\t\tbmpdata[i*3+1] = texkey->decoded[i*4+1];\r\n\t\t\t\tbmpdata[i*3+2] = texkey->decoded[i*4+2];\r\n\t\t\t}\r\n\t\tfor(u32 i=0;i<w*h;i++)\r\n\t\t\tbmpdata[w*h*3+i] = texkey->decoded[i*4+3];\r\n\r\n\t\t\r\n\t\twxImage image(w,h,false);\r\n\t\timage.InitAlpha();\r\n\t\timage.SetData(bmpdata,true);\r\n\t\timage.SetAlpha(bmpdata+w*h*3,true);\r\n\t\twxBitmap bitmap(image);\r\n\t\tdouble xscale = (double)panelTexture->GetSize().x / w;\r\n\t\tdouble yscale = (double)panelTexture->GetSize().y / h;\r\n\r\n\t\tdc.SetUserScale(xscale,yscale);\r\n\t\tdc.DrawBitmap(bitmap,0,0);\r\n\t\tdelete[] bmpdata;\r\n\t}\r\n};\r\n\r\nclass VIEW3D_Driver_WX : public VIEW3D_Driver\r\n{\r\npublic:\r\n\tVIEW3D_Driver_WX()\r\n\t\t: viewer(NULL)\r\n\t{}\r\n\t~VIEW3D_Driver_WX()\r\n\t{\r\n\t\tdelete viewer;\r\n\t}\r\n\r\n\tvirtual bool IsRunning() { return viewer != NULL; }\r\n\r\n\tvirtual void Launch()\r\n\t{\r\n\t\tif(viewer) return;\r\n\t\tdelete viewer;\r\n\t\tviewer = new Mywxdlg3dViewer();\r\n\t\tviewer->Show(true);\r\n\t}\r\n\r\n\tvoid Close()\r\n\t{\r\n\t\tdelete viewer;\r\n\t\tviewer = NULL;\r\n\t}\r\n\r\n\tvirtual void NewFrame()\r\n\t{\r\n\t\tif(!viewer) return;\r\n\t\tif(!viewer->IsShown()) {\r\n\t\t\tClose();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tviewer->NewFrame();\r\n\t\tviewer->RepaintPanel();\r\n\t}\r\n\r\nprivate:\r\n\tMywxdlg3dViewer *viewer;\r\n};\r\n\r\n#endif\r\n\r\nstatic VIEW3D_Driver nullView3d;\r\nBaseDriver::BaseDriver()\r\n: view3d(NULL)\r\n{\r\n\tVIEW3D_Shutdown();\r\n}\r\n\r\nvoid BaseDriver::VIEW3D_Shutdown()\r\n{\r\n\tif(view3d != &nullView3d) delete view3d;\r\n\tview3d = &nullView3d;\r\n}\r\n\r\nvoid BaseDriver::VIEW3D_Init()\r\n{\r\n\tVIEW3D_Shutdown();\r\n#ifdef HAVE_WX\r\n\tview3d = new VIEW3D_Driver_WX();\r\n#endif\r\n}\r\n\r\nBaseDriver::~BaseDriver()\r\n{\r\n}\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/driver.h",
    "content": "/*\r\n\tCopyright (C) 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _DRIVER_H_\r\n#define _DRIVER_H_\r\n\r\n#include \"types.h\"\r\n#include \"debug.h\"\r\n#include <stdio.h>\r\n\r\n#ifdef EXPERIMENTAL_WIFI_COMM\r\n#include <pcap.h>\r\n#endif\r\n\r\nclass VIEW3D_Driver\r\n{\r\npublic:\r\n\tvirtual void Launch() {}\r\n\tvirtual void NewFrame() {}\r\n\tvirtual bool IsRunning() { return false; }\r\n};\r\n\r\n//each platform needs to implement this, although it doesnt need to implement any functions\r\nclass BaseDriver {\r\npublic:\r\n\tBaseDriver();\r\n\t~BaseDriver();\r\n\r\n#ifdef EXPERIMENTAL_WIFI_COMM\r\n\tvirtual bool WIFI_SocketsAvailable() { return true; }\r\n\tvirtual bool WIFI_PCapAvailable() { return false; }\r\n\r\n\tvirtual void WIFI_GetUniqueMAC(u8* mac) {}\r\n\r\n\tvirtual bool WIFI_WFCWarning() { return false; }\r\n\r\n\tvirtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) { return -1; }\r\n\tvirtual void PCAP_freealldevs(pcap_if_t* alldevs) {}\r\n\tvirtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) { return NULL; }\r\n\tvirtual void PCAP_close(pcap_t* dev) {}\r\n\tvirtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) { return -1; }\r\n\tvirtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) { return -1; }\r\n\tvirtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) { return -1; }\r\n#endif\r\n\r\n\tvirtual void AVI_SoundUpdate(void* soundData, int soundLen) {}\r\n\tvirtual bool AVI_IsRecording() { return FALSE; }\r\n\tvirtual bool WAV_IsRecording() { return FALSE; }\r\n\r\n\tvirtual void USR_InfoMessage(const char *message) { LOG(\"%s\\n\", message); }\r\n\tvirtual void USR_RefreshScreen() {}\r\n\tvirtual void USR_SetDisplayPostpone(int milliseconds, bool drawNextFrame) {} // -1 == indefinitely, 0 == don't pospone, 500 == don't draw for 0.5 seconds\r\n\r\n\tenum eStepMainLoopResult\r\n\t{\r\n\t\tESTEP_NOT_IMPLEMENTED = -1,\r\n\t\tESTEP_CALL_AGAIN = 0,\r\n\t\tESTEP_DONE = 1,\r\n\t};\r\n\tvirtual eStepMainLoopResult EMU_StepMainLoop(bool allowSleep, bool allowPause, int frameSkip, bool disableUser, bool disableCore) { return ESTEP_NOT_IMPLEMENTED; } // -1 frameSkip == useCurrentDefault\r\n\tvirtual void EMU_PauseEmulation(bool pause) {}\r\n\tvirtual bool EMU_IsEmulationPaused() { return false; }\r\n\tvirtual bool EMU_IsFastForwarding() { return false; }\r\n\tvirtual bool EMU_HasEmulationStarted() { return true; }\r\n\tvirtual bool EMU_IsAtFrameBoundary() { return true; }\r\n\tvirtual void EMU_DebugIdleUpdate() {}\r\n\r\n\tenum eDebug_IOReg\r\n\t{\r\n\t\tEDEBUG_IOREG_DMA\r\n\t};\r\n\r\n\tvirtual void DEBUG_UpdateIORegView(eDebug_IOReg category) { }\r\n\r\n\tVIEW3D_Driver* view3d;\r\n\tvoid VIEW3D_Shutdown();\r\n\tvoid VIEW3D_Init();\r\n};\r\nextern BaseDriver* driver;\r\n\r\n#ifndef _WINDOWS\r\nclass UnixDriver : public BaseDriver\r\n{\r\n#ifdef EXPERIMENTAL_WIFI_COMM\r\n\tvirtual bool WIFI_SocketsAvailable() { return true; }\r\n\tvirtual bool WIFI_PCapAvailable() { return true; }\r\n\tvirtual bool WIFI_WFCWarning() { return false; }\r\n\r\n\tvirtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) {\r\n\t\treturn pcap_findalldevs(alldevs, errbuf); }\r\n\r\n\tvirtual void PCAP_freealldevs(pcap_if_t* alldevs) {\r\n\t\tpcap_freealldevs(alldevs); }\r\n\r\n\tvirtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) {\r\n\t\treturn pcap_open_live(source, snaplen, flags, readtimeout, errbuf); }\r\n\r\n\tvirtual void PCAP_close(pcap_t* dev) {\r\n\t\tpcap_close(dev); }\r\n\r\n\tvirtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) {\r\n\t\treturn pcap_setnonblock(dev, nonblock, errbuf); }\r\n\r\n\tvirtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) {\r\n\t\treturn pcap_sendpacket(dev, data, len); }\r\n\r\n\tvirtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) {\r\n\t\treturn pcap_dispatch(dev, num, callback, userdata); }\r\n#endif\r\n};\r\n#endif\r\n\r\n#endif //_DRIVER_H_\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/emufile.cpp",
    "content": "/*\r\nThe MIT License\r\n\r\nCopyright (C) 2009-2010 DeSmuME team\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\n#include \"emufile.h\"\r\n\r\n#include <vector>\r\n\r\nbool EMUFILE::readAllBytes(std::vector<u8>* dstbuf, const std::string& fname)\r\n{\r\n\tEMUFILE_FILE file(fname.c_str(),\"rb\");\r\n\tif(file.fail()) return false;\r\n\tint size = file.size();\r\n\tdstbuf->resize(size);\r\n\tfile.fread(&dstbuf->at(0),size);\r\n\treturn true;\r\n}\r\n\r\nsize_t EMUFILE_MEMORY::_fread(const void *ptr, size_t bytes){\r\n\tu32 remain = len-pos;\r\n\tu32 todo = std::min<u32>(remain,(u32)bytes);\r\n\tif(len==0)\r\n\t{\r\n\t\tfailbit = true;\r\n\t\treturn 0;\r\n\t}\r\n\tif(todo<=4)\r\n\t{\r\n\t\tu8* src = buf()+pos;\r\n\t\tu8* dst = (u8*)ptr;\r\n\t\tfor(size_t i=0;i<todo;i++)\r\n\t\t\t*dst++ = *src++;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tmemcpy((void*)ptr,buf()+pos,todo);\r\n\t}\r\n\tpos += todo;\r\n\tif(todo<bytes)\r\n\t\tfailbit = true;\r\n\treturn todo;\r\n}\r\n\r\nvoid EMUFILE_FILE::truncate(s32 length)\r\n{\r\n\t::fflush(fp);\r\n\t#ifdef _MSC_VER\r\n\t\t_chsize(_fileno(fp),length);\r\n\t#else\r\n\t\tftruncate(fileno(fp),length);\r\n\t#endif\r\n\tfclose(fp);\r\n\tfp = NULL;\r\n\topen(fname.c_str(),mode);\r\n}\r\n\r\n\r\nEMUFILE* EMUFILE_FILE::memwrap()\r\n{\r\n\tEMUFILE_MEMORY* mem = new EMUFILE_MEMORY(size());\r\n\tif(size()==0) return mem;\r\n\tfread(mem->buf(),size());\r\n\treturn mem;\r\n}\r\n\r\nEMUFILE* EMUFILE_MEMORY::memwrap()\r\n{\r\n\treturn this;\r\n}\r\n\r\nvoid EMUFILE::write64le(u64* val)\r\n{\r\n\twrite64le(*val);\r\n}\r\n\r\nvoid EMUFILE::write64le(u64 val)\r\n{\r\n#ifdef LOCAL_BE\r\n\tu8 s[8];\r\n\ts[0]=(u8)val;\r\n\ts[1]=(u8)(val>>8);\r\n\ts[2]=(u8)(val>>16);\r\n\ts[3]=(u8)(val>>24);\r\n\ts[4]=(u8)(val>>32);\r\n\ts[5]=(u8)(val>>40);\r\n\ts[6]=(u8)(val>>48);\r\n\ts[7]=(u8)(val>>56);\r\n\tfwrite((char*)&s,8);\r\n#else\r\n\tfwrite(&val,8);\r\n#endif\r\n}\r\n\r\n\r\nsize_t EMUFILE::read64le(u64 *Bufo)\r\n{\r\n\tu64 buf;\r\n\tif(fread((char*)&buf,8) != 8)\r\n\t\treturn 0;\r\n#ifndef LOCAL_BE\r\n\t*Bufo=buf;\r\n#else\r\n\t*Bufo = LE_TO_LOCAL_64(buf);\r\n#endif\r\n\treturn 1;\r\n}\r\n\r\nu64 EMUFILE::read64le()\r\n{\r\n\tu64 temp;\r\n\tread64le(&temp);\r\n\treturn temp;\r\n}\r\n\r\nvoid EMUFILE::write32le(u32* val)\r\n{\r\n\twrite32le(*val);\r\n}\r\n\r\nvoid EMUFILE::write32le(u32 val)\r\n{\r\n#ifdef LOCAL_BE\r\n\tu8 s[4];\r\n\ts[0]=(u8)val;\r\n\ts[1]=(u8)(val>>8);\r\n\ts[2]=(u8)(val>>16);\r\n\ts[3]=(u8)(val>>24);\r\n\tfwrite(s,4);\r\n#else\r\n\tfwrite(&val,4);\r\n#endif\r\n}\r\n\r\nsize_t EMUFILE::read32le(s32* Bufo) { return read32le((u32*)Bufo); }\r\n\r\nsize_t EMUFILE::read32le(u32* Bufo)\r\n{\r\n\tu32 buf;\r\n\tif(fread(&buf,4)<4)\r\n\t\treturn 0;\r\n#ifndef LOCAL_BE\r\n\t*(u32*)Bufo=buf;\r\n#else\r\n\t*(u32*)Bufo=((buf&0xFF)<<24)|((buf&0xFF00)<<8)|((buf&0xFF0000)>>8)|((buf&0xFF000000)>>24);\r\n#endif\r\n\treturn 1;\r\n}\r\n\r\nu32 EMUFILE::read32le()\r\n{\r\n\tu32 ret;\r\n\tread32le(&ret);\r\n\treturn ret;\r\n}\r\n\r\nvoid EMUFILE::write16le(u16* val)\r\n{\r\n\twrite16le(*val);\r\n}\r\n\r\nvoid EMUFILE::write16le(u16 val)\r\n{\r\n#ifdef LOCAL_BE\r\n\tu8 s[2];\r\n\ts[0]=(u8)val;\r\n\ts[1]=(u8)(val>>8);\r\n\tfwrite(s,2);\r\n#else\r\n\tfwrite(&val,2);\r\n#endif\r\n}\r\n\r\nsize_t EMUFILE::read16le(s16* Bufo) { return read16le((u16*)Bufo); }\r\n\r\nsize_t EMUFILE::read16le(u16* Bufo)\r\n{\r\n\tu32 buf;\r\n\tif(fread(&buf,2)<2)\r\n\t\treturn 0;\r\n#ifndef LOCAL_BE\r\n\t*(u16*)Bufo=buf;\r\n#else\r\n\t*Bufo = LE_TO_LOCAL_16(buf);\r\n#endif\r\n\treturn 1;\r\n}\r\n\r\nu16 EMUFILE::read16le()\r\n{\r\n\tu16 ret;\r\n\tread16le(&ret);\r\n\treturn ret;\r\n}\r\n\r\nvoid EMUFILE::write8le(u8* val)\r\n{\r\n\twrite8le(*val);\r\n}\r\n\r\n\r\nvoid EMUFILE::write8le(u8 val)\r\n{\r\n\tfwrite(&val,1);\r\n}\r\n\r\nsize_t EMUFILE::read8le(u8* val)\r\n{\r\n\treturn fread(val,1);\r\n}\r\n\r\nu8 EMUFILE::read8le()\r\n{\r\n\tu8 temp;\r\n\tfread(&temp,1);\r\n\treturn temp;\r\n}\r\n\r\nvoid EMUFILE::writedouble(double* val)\r\n{\r\n\twrite64le(double_to_u64(*val));\r\n}\r\nvoid EMUFILE::writedouble(double val)\r\n{\r\n\twrite64le(double_to_u64(val));\r\n}\r\n\r\ndouble EMUFILE::readdouble()\r\n{\r\n\tdouble temp;\r\n\treaddouble(&temp);\r\n\treturn temp;\r\n}\r\n\r\nsize_t EMUFILE::readdouble(double* val)\r\n{\r\n\tu64 temp;\r\n\tsize_t ret = read64le(&temp);\r\n\t*val = u64_to_double(temp);\r\n\treturn ret;\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/emufile.h",
    "content": "/*\r\nThe MIT License\r\n\r\nCopyright (C) 2009-2012 DeSmuME team\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\n//don't use emufile for files bigger than 2GB! you have been warned! some day this will be fixed.\r\n\r\n#ifndef EMUFILE_H\r\n#define EMUFILE_H\r\n\r\n#include <assert.h>\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <vector>\r\n#include <algorithm>\r\n#include <string>\r\n#include <stdarg.h>\r\n\r\n#include \"emufile_types.h\"\r\n\r\n#ifdef _MSC_VER\r\n#include <io.h>\r\n#else\r\n#include <unistd.h>\r\n#endif\r\n\r\nclass EMUFILE {\r\nprotected:\r\n\tbool failbit;\r\n\r\npublic:\r\n\tEMUFILE()\r\n\t\t: failbit(false)\r\n\t{}\r\n\r\n\r\n\t//returns a new EMUFILE which is guranteed to be in memory. the EMUFILE you call this on may be deleted. use the returned EMUFILE in its place\r\n\tvirtual EMUFILE* memwrap() = 0;\r\n\r\n\tvirtual ~EMUFILE() {}\r\n\t\r\n\tstatic bool readAllBytes(std::vector<u8>* buf, const std::string& fname);\r\n\r\n\tbool fail(bool unset=false) { bool ret = failbit; if(unset) unfail(); return ret; }\r\n\tvoid unfail() { failbit=false; }\r\n\r\n\tbool eof() { return size()==ftell(); }\r\n\r\n\tsize_t fread(const void *ptr, size_t bytes){\r\n\t\treturn _fread(ptr,bytes);\r\n\t}\r\n\r\n\tvoid unget() { fseek(-1,SEEK_CUR); }\r\n\r\n\t//virtuals\r\npublic:\r\n\r\n\tvirtual FILE *get_fp() = 0;\r\n\r\n\tvirtual int fprintf(const char *format, ...) = 0;\r\n\r\n\tvirtual int fgetc() = 0;\r\n\tvirtual int fputc(int c) = 0;\r\n\r\n\tvirtual size_t _fread(const void *ptr, size_t bytes) = 0;\r\n\r\n\t//removing these return values for now so we can find any code that might be using them and make sure\r\n\t//they handle the return values correctly\r\n\r\n\tvirtual void fwrite(const void *ptr, size_t bytes) = 0;\r\n\r\n\tvoid write64le(u64* val);\r\n\tvoid write64le(u64 val);\r\n\tsize_t read64le(u64* val);\r\n\tu64 read64le();\r\n\tvoid write32le(u32* val);\r\n\tvoid write32le(s32* val) { write32le((u32*)val); }\r\n\tvoid write32le(u32 val);\r\n\tsize_t read32le(u32* val);\r\n\tsize_t read32le(s32* val);\r\n\tu32 read32le();\r\n\tvoid write16le(u16* val);\r\n\tvoid write16le(s16* val) { write16le((u16*)val); }\r\n\tvoid write16le(u16 val);\r\n\tsize_t read16le(s16* Bufo);\r\n\tsize_t read16le(u16* val);\r\n\tu16 read16le();\r\n\tvoid write8le(u8* val);\r\n\tvoid write8le(u8 val);\r\n\tsize_t read8le(u8* val);\r\n\tu8 read8le();\r\n\tvoid writedouble(double* val);\r\n\tvoid writedouble(double val);\r\n\tdouble readdouble();\r\n\tsize_t readdouble(double* val);\r\n\r\n\tvirtual int fseek(int offset, int origin) = 0;\r\n\r\n\tvirtual int ftell() = 0;\r\n\tvirtual int size() = 0;\r\n\tvirtual void fflush() = 0;\r\n\r\n\tvirtual void truncate(s32 length) = 0;\r\n};\r\n\r\n//todo - handle read-only specially?\r\nclass EMUFILE_MEMORY : public EMUFILE { \r\nprotected:\r\n\tstd::vector<u8> *vec;\r\n\tbool ownvec;\r\n\ts32 pos, len;\r\n\r\n\tvoid reserve(u32 amt) {\r\n\t\tif(vec->size() < amt)\r\n\t\t\tvec->resize(amt);\r\n\t}\r\n\r\npublic:\r\n\r\n\tEMUFILE_MEMORY(std::vector<u8> *underlying) : vec(underlying), ownvec(false), pos(0), len((s32)underlying->size()) { }\r\n\tEMUFILE_MEMORY(u32 preallocate) : vec(new std::vector<u8>()), ownvec(true), pos(0), len(0) { \r\n\t\tvec->resize(preallocate);\r\n\t\tlen = preallocate;\r\n\t}\r\n\tEMUFILE_MEMORY() : vec(new std::vector<u8>()), ownvec(true), pos(0), len(0) { vec->reserve(1024); }\r\n\tEMUFILE_MEMORY(void* buf, s32 size) : vec(new std::vector<u8>()), ownvec(true), pos(0), len(size) { \r\n\t\tvec->resize(size);\r\n\t\tif(size != 0)\r\n\t\t\tmemcpy(&vec->front(),buf,size);\r\n\t}\r\n\r\n\t~EMUFILE_MEMORY() {\r\n\t\tif(ownvec) delete vec;\r\n\t}\r\n\r\n\tvirtual EMUFILE* memwrap();\r\n\r\n\tvirtual void truncate(s32 length)\r\n\t{\r\n\t\tvec->resize(length);\r\n\t\tlen = length;\r\n\t\tif(pos>length) pos=length;\r\n\t}\r\n\r\n\tu8* buf() { \r\n\t\tif(size()==0) reserve(1);\r\n\t\treturn &(*vec)[0];\r\n\t}\r\n\r\n\tstd::vector<u8>* get_vec() { return vec; };\r\n\r\n\tvirtual FILE *get_fp() { return NULL; }\r\n\r\n\tvirtual int fprintf(const char *format, ...) {\r\n\t\tva_list argptr;\r\n\t\tva_start(argptr, format);\r\n\r\n\t\t//we dont generate straight into the buffer because it will null terminate (one more byte than we want)\r\n\t\tint amt = vsnprintf(0,0,format,argptr);\r\n\t\tchar* tempbuf = new char[amt+1];\r\n\r\n\t\tva_end(argptr);\r\n\t\tva_start(argptr, format);\r\n\t\tvsprintf(tempbuf,format,argptr);\r\n\t\t\r\n        fwrite(tempbuf,amt);\r\n\t\tdelete[] tempbuf;\r\n\t\t\r\n        va_end(argptr);\r\n\t\treturn amt;\r\n\t};\r\n\r\n\tvirtual int fgetc() {\r\n\t\tu8 temp;\r\n\r\n\t\t//need an optimized codepath\r\n\t\t//if(_fread(&temp,1) != 1)\r\n\t\t//\treturn EOF;\r\n\t\t//else return temp;\r\n\t\tu32 remain = len-pos;\r\n\t\tif(remain<1) {\r\n\t\t\tfailbit = true;\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\ttemp = buf()[pos];\r\n\t\tpos++;\r\n\t\treturn temp;\r\n\t}\r\n\tvirtual int fputc(int c) {\r\n\t\tu8 temp = (u8)c;\r\n\t\t//TODO\r\n\t\t//if(fwrite(&temp,1)!=1) return EOF;\r\n\t\tfwrite(&temp,1);\r\n\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tvirtual size_t _fread(const void *ptr, size_t bytes);\r\n\r\n\t//removing these return values for now so we can find any code that might be using them and make sure\r\n\t//they handle the return values correctly\r\n\r\n\tvirtual void fwrite(const void *ptr, size_t bytes){\r\n\t\treserve(pos+(s32)bytes);\r\n\t\tmemcpy(buf()+pos,ptr,bytes);\r\n\t\tpos += (s32)bytes;\r\n\t\tlen = std::max(pos,len);\r\n\t}\r\n\r\n\tvirtual int fseek(int offset, int origin){ \r\n\t\t//work differently for read-only...?\r\n\t\tswitch(origin) {\r\n\t\t\tcase SEEK_SET:\r\n\t\t\t\tpos = offset;\r\n\t\t\t\tbreak;\r\n\t\t\tcase SEEK_CUR:\r\n\t\t\t\tpos += offset;\r\n\t\t\t\tbreak;\r\n\t\t\tcase SEEK_END:\r\n\t\t\t\tpos = size()+offset;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tassert(false);\r\n\t\t}\r\n\t\treserve(pos);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tvirtual int ftell() {\r\n\t\treturn pos;\r\n\t}\r\n\r\n\tvirtual void fflush() {}\r\n\r\n\tvoid trim()\r\n\t{\r\n\t\tvec->resize(len);\r\n\t}\r\n\r\n\tvirtual int size() { return (int)len; }\r\n};\r\n\r\nclass EMUFILE_FILE : public EMUFILE { \r\nprotected:\r\n\tFILE* fp;\r\n\tstd::string fname;\r\n\tchar mode[16];\r\n\r\nprivate:\r\n\tvoid open(const char* fname, const char* mode)\r\n\t{\r\n\t\tfp = fopen(fname,mode);\r\n\t\tif(!fp)\r\n\t\t\tfailbit = true;\r\n\t\tthis->fname = fname;\r\n\t\tstrcpy(this->mode,mode);\r\n\t}\r\n\r\npublic:\r\n\r\n\tEMUFILE_FILE(const std::string& fname, const char* mode) { open(fname.c_str(),mode); }\r\n\tEMUFILE_FILE(const char* fname, const char* mode) { open(fname,mode); }\r\n\r\n\tvirtual ~EMUFILE_FILE() {\r\n\t\tif(NULL != fp)\r\n\t\t\tfclose(fp);\r\n\t}\r\n\r\n\tvirtual FILE *get_fp() {\r\n\t\treturn fp; \r\n\t}\r\n\r\n\tvirtual EMUFILE* memwrap();\r\n\r\n\tbool is_open() { return fp != NULL; }\r\n\r\n\tvirtual void truncate(s32 length);\r\n\r\n\tvirtual int fprintf(const char *format, ...) {\r\n\t\tva_list argptr;\r\n\t\tva_start(argptr, format);\r\n\t\tint ret = ::vfprintf(fp, format, argptr);\r\n\t\tva_end(argptr);\r\n\t\treturn ret;\r\n\t};\r\n\r\n\tvirtual int fgetc() {\r\n\t\treturn ::fgetc(fp);\r\n\t}\r\n\tvirtual int fputc(int c) {\r\n\t\treturn ::fputc(c, fp);\r\n\t}\r\n\r\n\tvirtual size_t _fread(const void *ptr, size_t bytes){\r\n\t\tsize_t ret = ::fread((void*)ptr, 1, bytes, fp);\r\n\t\tif(ret < bytes)\r\n\t\t\tfailbit = true;\r\n\t\treturn ret;\r\n\t}\r\n\r\n\t//removing these return values for now so we can find any code that might be using them and make sure\r\n\t//they handle the return values correctly\r\n\r\n\tvirtual void fwrite(const void *ptr, size_t bytes){\r\n\t\tsize_t ret = ::fwrite((void*)ptr, 1, bytes, fp);\r\n\t\tif(ret < bytes)\r\n\t\t\tfailbit = true;\r\n\t}\r\n\r\n\tvirtual int fseek(int offset, int origin) { \r\n\t\treturn ::fseek(fp, offset, origin);\r\n\t}\r\n\r\n\tvirtual int ftell() {\r\n\t\treturn (u32)::ftell(fp);\r\n\t}\r\n\r\n\tvirtual int size() { \r\n\t\tint oldpos = ftell();\r\n\t\tfseek(0,SEEK_END);\r\n\t\tint len = ftell();\r\n\t\tfseek(oldpos,SEEK_SET);\r\n\t\treturn len;\r\n\t}\r\n\r\n\tvirtual void fflush() {\r\n\t\t::fflush(fp);\r\n\t}\r\n\r\n};\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/emufile_types.h",
    "content": "#ifndef EMUFILE_TYPES_H\r\n#define EMUFILE_TYPES_H\r\n\r\n#include \"types.h\"\r\n\r\n#endif //EMUFILE_TYPES_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/2xsai.cpp",
    "content": "#include \"filter.h\"\n#include \"types.h\"\n\n//ref: http://vba-rerecording.googlecode.com/svn/trunk/src/2xsai.cpp\n\nstatic u32 colorMask = 0xfefefe;\nstatic u32 lowPixelMask = 0x010101;\nstatic u32 qcolorMask = 0xfcfcfc;\nstatic u32 qlowpixelMask = 0x030303;\nstatic u32 redblueMask = 0xF81F;\nstatic u32 greenMask = 0x7E0;\n\nint Init_2xSaI(u32 BitFormat, u32 systemColorDepth)\n{\n  if(systemColorDepth == 16) {\n    if (BitFormat == 565) {\n      colorMask = 0xF7DEF7DE;\n      lowPixelMask = 0x08210821;\n      qcolorMask = 0xE79CE79C;\n      qlowpixelMask = 0x18631863;\n      redblueMask = 0xF81F;\n      greenMask = 0x7E0;\n    } else if (BitFormat == 555) {\n      colorMask = 0x7BDE7BDE;\n      lowPixelMask = 0x04210421;\n      qcolorMask = 0x739C739C;\n      qlowpixelMask = 0x0C630C63;\n      redblueMask = 0x7C1F;\n      greenMask = 0x3E0;\n    } else {\n      return 0;\n    }\n  } else if(systemColorDepth == 32) {\n    colorMask = 0xfefefe;\n    lowPixelMask = 0x010101;\n    qcolorMask = 0xfcfcfc;\n    qlowpixelMask = 0x030303;\n  } else\n    return 0;\n\n  return 1;\n}\n\nstatic inline int GetResult1 (u32 A, u32 B, u32 C, u32 D,\n                              u32 /* E */)\n{\n    int x = 0;\n    int y = 0;\n    int r = 0;\n\n    if (A == C)\n      x += 1;\n    else if (B == C)\n      y += 1;\n    if (A == D)\n      x += 1;\n    else if (B == D)\n      y += 1;\n    if (x <= 1)\n      r += 1;\n    if (y <= 1)\n      r -= 1;\n    return r;\n}\n\nstatic inline int GetResult2 (u32 A, u32 B, u32 C, u32 D,\n                              u32 /* E */)\n{\n  int x = 0;\n  int y = 0;\n  int r = 0;\n\n  if (A == C)\n    x += 1;\n  else if (B == C)\n    y += 1;\n  if (A == D)\n    x += 1;\n  else if (B == D)\n    y += 1;\n  if (x <= 1)\n    r -= 1;\n  if (y <= 1)\n    r += 1;\n  return r;\n}\n\nstatic inline int GetResult (u32 A, u32 B, u32 C, u32 D)\n{\n  int x = 0;\n  int y = 0;\n  int r = 0;\n\n  if (A == C)\n    x += 1;\n  else if (B == C)\n    y += 1;\n  if (A == D)\n    x += 1;\n  else if (B == D)\n    y += 1;\n  if (x <= 1)\n    r += 1;\n  if (y <= 1)\n    r -= 1;\n  return r;\n}\n\nstatic inline u32 INTERPOLATE (u32 A, u32 B)\n{\n  if (A != B) {\n    return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) +\n            (A & B & lowPixelMask));\n  } else\n    return A;\n}\n\nstatic inline u32 Q_INTERPOLATE (u32 A, u32 B, u32 C, u32 D)\n{\n  register u32 x = ((A & qcolorMask) >> 2) +\n    ((B & qcolorMask) >> 2) +\n    ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2);\n  register u32 y = (A & qlowpixelMask) +\n    (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask);\n\n  y = (y >> 2) & qlowpixelMask;\n  return x + y;\n}\n\n#define BLUE_MASK565 0x001F001F\n#define RED_MASK565 0xF800F800\n#define GREEN_MASK565 0x07E007E0\n\n#define BLUE_MASK555 0x001F001F\n#define RED_MASK555 0x7C007C00\n#define GREEN_MASK555 0x03E003E0\n\nvoid Super2xSaI (u8 *srcPtr, u32 srcPitch,\n                 u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch,\n                 int width, int height)\n{\n  u16 *bP;\n  u8  *dP;\n  u32 inc_bP;\n  u32 Nextline = srcPitch >> 1;\n\n    {\n      inc_bP = 1;\n\n      for (; height; height--) {\n        bP = (u16 *) srcPtr;\n        dP = (u8 *) dstPtr;\n\n        for (u32 finish = width; finish; finish -= inc_bP) {\n          u32 color4, color5, color6;\n          u32 color1, color2, color3;\n          u32 colorA0, colorA1, colorA2, colorA3,\n            colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;\n          u32 product1a, product1b, product2a, product2b;\n\n          //---------------------------------------    B1 B2\n          //                                         4  5  6 S2\n          //                                         1  2  3 S1\n          //                                           A1 A2\n\n          colorB0 = *(bP - Nextline - 1);\n          colorB1 = *(bP - Nextline);\n          colorB2 = *(bP - Nextline + 1);\n          colorB3 = *(bP - Nextline + 2);\n\n          color4 = *(bP - 1);\n          color5 = *(bP);\n          color6 = *(bP + 1);\n          colorS2 = *(bP + 2);\n\n          color1 = *(bP + Nextline - 1);\n          color2 = *(bP + Nextline);\n          color3 = *(bP + Nextline + 1);\n          colorS1 = *(bP + Nextline + 2);\n\n          colorA0 = *(bP + Nextline + Nextline - 1);\n          colorA1 = *(bP + Nextline + Nextline);\n          colorA2 = *(bP + Nextline + Nextline + 1);\n          colorA3 = *(bP + Nextline + Nextline + 2);\n\n          //--------------------------------------\n          if (color2 == color6 && color5 != color3) {\n            product2b = product1b = color2;\n          } else if (color5 == color3 && color2 != color6) {\n            product2b = product1b = color5;\n          } else if (color5 == color3 && color2 == color6) {\n            register int r = 0;\n\n            r += GetResult (color6, color5, color1, colorA1);\n            r += GetResult (color6, color5, color4, colorB1);\n            r += GetResult (color6, color5, colorA2, colorS1);\n            r += GetResult (color6, color5, colorB2, colorS2);\n\n            if (r > 0)\n              product2b = product1b = color6;\n            else if (r < 0)\n              product2b = product1b = color5;\n            else {\n              product2b = product1b = INTERPOLATE (color5, color6);\n            }\n          } else {\n            if (color6 == color3 && color3 == colorA1\n                && color2 != colorA2 && color3 != colorA0)\n              product2b =\n                Q_INTERPOLATE (color3, color3, color3, color2);\n            else if (color5 == color2 && color2 == colorA2\n                     && colorA1 != color3 && color2 != colorA3)\n              product2b =\n                Q_INTERPOLATE (color2, color2, color2, color3);\n            else\n              product2b = INTERPOLATE (color2, color3);\n\n            if (color6 == color3 && color6 == colorB1\n                && color5 != colorB2 && color6 != colorB0)\n              product1b =\n                Q_INTERPOLATE (color6, color6, color6, color5);\n            else if (color5 == color2 && color5 == colorB2\n                     && colorB1 != color6 && color5 != colorB3)\n              product1b =\n                Q_INTERPOLATE (color6, color5, color5, color5);\n            else\n              product1b = INTERPOLATE (color5, color6);\n          }\n\n          if (color5 == color3 && color2 != color6 && color4 == color5\n              && color5 != colorA2)\n            product2a = INTERPOLATE (color2, color5);\n          else\n            if (color5 == color1 && color6 == color5\n                && color4 != color2 && color5 != colorA0)\n              product2a = INTERPOLATE (color2, color5);\n            else\n              product2a = color2;\n\n          if (color2 == color6 && color5 != color3 && color1 == color2\n              && color2 != colorB2)\n            product1a = INTERPOLATE (color2, color5);\n          else\n            if (color4 == color2 && color3 == color2\n                && color1 != color5 && color2 != colorB0)\n              product1a = INTERPOLATE (color2, color5);\n            else\n              product1a = color5;\n\n#ifdef WORDS_BIGENDIAN\n          product1a = (product1a << 16) | product1b;\n          product2a = (product2a << 16) | product2b;\n#else\n          product1a = product1a | (product1b << 16);\n          product2a = product2a | (product2b << 16);\n#endif\n\n          *((u32 *) dP) = product1a;\n          *((u32 *) (dP + dstPitch)) = product2a;\n\n          bP += inc_bP;\n          dP += sizeof (u32);\n        }                       // end of for ( finish= width etc..)\n\n        srcPtr   += srcPitch;\n        dstPtr   += dstPitch * 2;\n//        deltaPtr += srcPitch;\n      }                 // endof: for (; height; height--)\n    }\n}\n\nvoid Super2xSaI32 (u8 *srcPtr, u32 srcPitch,\n                   u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch,\n                   int width, int height)\n{\n  u32 *bP;\n  u32 *dP;\n  u32 inc_bP;\n  u32 Nextline = srcPitch >> 2;\n  inc_bP = 1;\n\n  for (; height; height--) {\n    bP = (u32 *) srcPtr;\n    dP = (u32 *) dstPtr;\n\n    for (u32 finish = width; finish; finish -= inc_bP) {\n      u32 color4, color5, color6;\n      u32 color1, color2, color3;\n      u32 colorA0, colorA1, colorA2, colorA3,\n        colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;\n      u32 product1a, product1b, product2a, product2b;\n\n      //---------------------------------------    B1 B2\n      //                                         4  5  6 S2\n      //                                         1  2  3 S1\n      //                                           A1 A2\n\n      colorB0 = *(bP - Nextline - 1);\n      colorB1 = *(bP - Nextline);\n      colorB2 = *(bP - Nextline + 1);\n      colorB3 = *(bP - Nextline + 2);\n\n      color4 = *(bP - 1);\n      color5 = *(bP);\n      color6 = *(bP + 1);\n      colorS2 = *(bP + 2);\n\n      color1 = *(bP + Nextline - 1);\n      color2 = *(bP + Nextline);\n      color3 = *(bP + Nextline + 1);\n      colorS1 = *(bP + Nextline + 2);\n\n      colorA0 = *(bP + Nextline + Nextline - 1);\n      colorA1 = *(bP + Nextline + Nextline);\n      colorA2 = *(bP + Nextline + Nextline + 1);\n      colorA3 = *(bP + Nextline + Nextline + 2);\n\n      //--------------------------------------\n      if (color2 == color6 && color5 != color3) {\n        product2b = product1b = color2;\n      } else if (color5 == color3 && color2 != color6) {\n        product2b = product1b = color5;\n      } else if (color5 == color3 && color2 == color6) {\n        register int r = 0;\n\n        r += GetResult (color6, color5, color1, colorA1);\n        r += GetResult (color6, color5, color4, colorB1);\n        r += GetResult (color6, color5, colorA2, colorS1);\n        r += GetResult (color6, color5, colorB2, colorS2);\n\n        if (r > 0)\n          product2b = product1b = color6;\n        else if (r < 0)\n          product2b = product1b = color5;\n        else {\n          product2b = product1b = INTERPOLATE (color5, color6);\n        }\n      } else {\n        if (color6 == color3 && color3 == colorA1\n            && color2 != colorA2 && color3 != colorA0)\n          product2b =\n            Q_INTERPOLATE (color3, color3, color3, color2);\n        else if (color5 == color2 && color2 == colorA2\n                 && colorA1 != color3 && color2 != colorA3)\n          product2b =\n            Q_INTERPOLATE (color2, color2, color2, color3);\n        else\n          product2b = INTERPOLATE (color2, color3);\n\n        if (color6 == color3 && color6 == colorB1\n            && color5 != colorB2 && color6 != colorB0)\n          product1b =\n            Q_INTERPOLATE (color6, color6, color6, color5);\n        else if (color5 == color2 && color5 == colorB2\n                 && colorB1 != color6 && color5 != colorB3)\n          product1b =\n            Q_INTERPOLATE (color6, color5, color5, color5);\n        else\n          product1b = INTERPOLATE (color5, color6);\n      }\n\n      if (color5 == color3 && color2 != color6 && color4 == color5\n          && color5 != colorA2)\n        product2a = INTERPOLATE (color2, color5);\n      else\n        if (color5 == color1 && color6 == color5\n            && color4 != color2 && color5 != colorA0)\n          product2a = INTERPOLATE (color2, color5);\n        else\n          product2a = color2;\n\n      if (color2 == color6 && color5 != color3 && color1 == color2\n          && color2 != colorB2)\n        product1a = INTERPOLATE (color2, color5);\n      else\n        if (color4 == color2 && color3 == color2\n            && color1 != color5 && color2 != colorB0)\n          product1a = INTERPOLATE (color2, color5);\n        else\n          product1a = color5;\n      *(dP) = product1a;\n      *(dP+1) = product1b;\n      *(dP + (dstPitch >> 2)) = product2a;\n      *(dP + (dstPitch >> 2) + 1) = product2b;\n\n      bP += inc_bP;\n      dP += 2;\n    }                       // end of for ( finish= width etc..)\n\n    srcPtr   += srcPitch;\n    dstPtr   += dstPitch * 2;\n//        deltaPtr += srcPitch;\n  }                 // endof: for (; height; height--)\n}\n\nvoid SuperEagle (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n                 u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u8  *dP;\n  u16 *bP;\n//  u16 *xP;\n  u32 inc_bP;\n\n  {\n    inc_bP = 1;\n\n    u32 Nextline = srcPitch >> 1;\n\n    for (; height; height--) {\n      bP = (u16 *) srcPtr;\n//      xP = (u16 *) deltaPtr;\n      dP = dstPtr;\n      for (u32 finish = width; finish; finish -= inc_bP) {\n        u32 color4, color5, color6;\n        u32 color1, color2, color3;\n        u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;\n        u32 product1a, product1b, product2a, product2b;\n\n        colorB1 = *(bP - Nextline);\n        colorB2 = *(bP - Nextline + 1);\n\n        color4 = *(bP - 1);\n        color5 = *(bP);\n        color6 = *(bP + 1);\n        colorS2 = *(bP + 2);\n\n        color1 = *(bP + Nextline - 1);\n        color2 = *(bP + Nextline);\n        color3 = *(bP + Nextline + 1);\n        colorS1 = *(bP + Nextline + 2);\n\n        colorA1 = *(bP + Nextline + Nextline);\n        colorA2 = *(bP + Nextline + Nextline + 1);\n\n        // --------------------------------------\n        if (color2 == color6 && color5 != color3) {\n          product1b = product2a = color2;\n          if ((color1 == color2) || (color6 == colorB2)) {\n            product1a = INTERPOLATE (color2, color5);\n            product1a = INTERPOLATE (color2, product1a);\n            //                       product1a = color2;\n          } else {\n            product1a = INTERPOLATE (color5, color6);\n          }\n\n          if ((color6 == colorS2) || (color2 == colorA1)) {\n            product2b = INTERPOLATE (color2, color3);\n            product2b = INTERPOLATE (color2, product2b);\n            //                       product2b = color2;\n          } else {\n            product2b = INTERPOLATE (color2, color3);\n          }\n        } else if (color5 == color3 && color2 != color6) {\n          product2b = product1a = color5;\n\n          if ((colorB1 == color5) || (color3 == colorS1)) {\n            product1b = INTERPOLATE (color5, color6);\n            product1b = INTERPOLATE (color5, product1b);\n            //                       product1b = color5;\n          } else {\n            product1b = INTERPOLATE (color5, color6);\n          }\n\n          if ((color3 == colorA2) || (color4 == color5)) {\n            product2a = INTERPOLATE (color5, color2);\n            product2a = INTERPOLATE (color5, product2a);\n            //                       product2a = color5;\n          } else {\n            product2a = INTERPOLATE (color2, color3);\n          }\n\n        } else if (color5 == color3 && color2 == color6) {\n          register int r = 0;\n\n          r += GetResult (color6, color5, color1, colorA1);\n          r += GetResult (color6, color5, color4, colorB1);\n          r += GetResult (color6, color5, colorA2, colorS1);\n          r += GetResult (color6, color5, colorB2, colorS2);\n\n          if (r > 0) {\n            product1b = product2a = color2;\n            product1a = product2b = INTERPOLATE (color5, color6);\n          } else if (r < 0) {\n            product2b = product1a = color5;\n            product1b = product2a = INTERPOLATE (color5, color6);\n          } else {\n            product2b = product1a = color5;\n            product1b = product2a = color2;\n          }\n        } else {\n          product2b = product1a = INTERPOLATE (color2, color6);\n          product2b =\n            Q_INTERPOLATE (color3, color3, color3, product2b);\n          product1a =\n            Q_INTERPOLATE (color5, color5, color5, product1a);\n\n          product2a = product1b = INTERPOLATE (color5, color3);\n          product2a =\n            Q_INTERPOLATE (color2, color2, color2, product2a);\n          product1b =\n            Q_INTERPOLATE (color6, color6, color6, product1b);\n\n          //                    product1a = color5;\n          //                    product1b = color6;\n          //                    product2a = color2;\n          //                    product2b = color3;\n        }\n#ifdef WORDS_BIGENDIAN\n        product1a = (product1a << 16) | product1b;\n        product2a = (product2a << 16) | product2b;\n#else\n        product1a = product1a | (product1b << 16);\n        product2a = product2a | (product2b << 16);\n#endif\n\n        *((u32 *) dP) = product1a;\n        *((u32 *) (dP + dstPitch)) = product2a;\n//        *xP = color5;\n\n        bP += inc_bP;\n//        xP += inc_bP;\n        dP += sizeof (u32);\n      }                 // end of for ( finish= width etc..)\n\n      srcPtr += srcPitch;\n      dstPtr += dstPitch * 2;\n//      deltaPtr += srcPitch;\n    }                   // endof: for (height; height; height--)\n  }\n}\n\nvoid SuperEagle32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n                   u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u32  *dP;\n  u32 *bP;\n//  u32 *xP;\n  u32 inc_bP;\n\n  inc_bP = 1;\n\n  u32 Nextline = srcPitch >> 2;\n\n  for (; height; height--) {\n    bP = (u32 *) srcPtr;\n//    xP = (u32 *) deltaPtr;\n    dP = (u32 *)dstPtr;\n    for (u32 finish = width; finish; finish -= inc_bP) {\n      u32 color4, color5, color6;\n      u32 color1, color2, color3;\n      u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;\n      u32 product1a, product1b, product2a, product2b;\n\n      colorB1 = *(bP - Nextline);\n      colorB2 = *(bP - Nextline + 1);\n\n      color4 = *(bP - 1);\n      color5 = *(bP);\n      color6 = *(bP + 1);\n      colorS2 = *(bP + 2);\n\n      color1 = *(bP + Nextline - 1);\n      color2 = *(bP + Nextline);\n      color3 = *(bP + Nextline + 1);\n      colorS1 = *(bP + Nextline + 2);\n\n      colorA1 = *(bP + Nextline + Nextline);\n      colorA2 = *(bP + Nextline + Nextline + 1);\n\n      // --------------------------------------\n      if (color2 == color6 && color5 != color3) {\n        product1b = product2a = color2;\n        if ((color1 == color2) || (color6 == colorB2)) {\n          product1a = INTERPOLATE (color2, color5);\n          product1a = INTERPOLATE (color2, product1a);\n          //                       product1a = color2;\n        } else {\n          product1a = INTERPOLATE (color5, color6);\n        }\n\n        if ((color6 == colorS2) || (color2 == colorA1)) {\n          product2b = INTERPOLATE (color2, color3);\n          product2b = INTERPOLATE (color2, product2b);\n          //                       product2b = color2;\n        } else {\n          product2b = INTERPOLATE (color2, color3);\n        }\n      } else if (color5 == color3 && color2 != color6) {\n        product2b = product1a = color5;\n\n        if ((colorB1 == color5) || (color3 == colorS1)) {\n          product1b = INTERPOLATE (color5, color6);\n          product1b = INTERPOLATE (color5, product1b);\n          //                       product1b = color5;\n        } else {\n          product1b = INTERPOLATE (color5, color6);\n        }\n\n        if ((color3 == colorA2) || (color4 == color5)) {\n          product2a = INTERPOLATE (color5, color2);\n          product2a = INTERPOLATE (color5, product2a);\n          //                       product2a = color5;\n        } else {\n          product2a = INTERPOLATE (color2, color3);\n        }\n\n      } else if (color5 == color3 && color2 == color6) {\n        register int r = 0;\n\n        r += GetResult (color6, color5, color1, colorA1);\n        r += GetResult (color6, color5, color4, colorB1);\n        r += GetResult (color6, color5, colorA2, colorS1);\n        r += GetResult (color6, color5, colorB2, colorS2);\n\n        if (r > 0) {\n          product1b = product2a = color2;\n          product1a = product2b = INTERPOLATE (color5, color6);\n        } else if (r < 0) {\n          product2b = product1a = color5;\n          product1b = product2a = INTERPOLATE (color5, color6);\n        } else {\n          product2b = product1a = color5;\n          product1b = product2a = color2;\n        }\n      } else {\n        product2b = product1a = INTERPOLATE (color2, color6);\n        product2b =\n          Q_INTERPOLATE (color3, color3, color3, product2b);\n        product1a =\n          Q_INTERPOLATE (color5, color5, color5, product1a);\n\n        product2a = product1b = INTERPOLATE (color5, color3);\n        product2a =\n          Q_INTERPOLATE (color2, color2, color2, product2a);\n        product1b =\n          Q_INTERPOLATE (color6, color6, color6, product1b);\n\n        //                    product1a = color5;\n        //                    product1b = color6;\n        //                    product2a = color2;\n        //                    product2b = color3;\n      }\n      *(dP) = product1a;\n      *(dP+1) = product1b;\n      *(dP + (dstPitch >> 2)) = product2a;\n      *(dP + (dstPitch >> 2) +1) = product2b;\n//      *xP = color5;\n\n      bP += inc_bP;\n//      xP += inc_bP;\n      dP += 2;\n    }                 // end of for ( finish= width etc..)\n\n    srcPtr += srcPitch;\n    dstPtr += dstPitch * 2;\n//    deltaPtr += srcPitch;\n  }                   // endof: for (height; height; height--)\n}\n\nvoid _2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n             u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u8  *dP;\n  u16 *bP;\n  u32 inc_bP;\n\n  {\n    inc_bP = 1;\n\n    u32 Nextline = srcPitch >> 1;\n\n    for (; height; height--) {\n      bP = (u16 *) srcPtr;\n      dP = dstPtr;\n\n      for (u32 finish = width; finish; finish -= inc_bP) {\n\n        register u32 colorA, colorB;\n        u32 colorC, colorD,\n          colorE, colorF, colorG, colorH,\n          colorI, colorJ, colorK, colorL,\n\n          colorM, colorN, colorO, colorP;\n        u32 product, product1, product2;\n\n        //---------------------------------------\n        // Map of the pixels:                    I|E F|J\n        //                                       G|A B|K\n        //                                       H|C D|L\n        //                                       M|N O|P\n        colorI = *(bP - Nextline - 1);\n        colorE = *(bP - Nextline);\n        colorF = *(bP - Nextline + 1);\n        colorJ = *(bP - Nextline + 2);\n\n        colorG = *(bP - 1);\n        colorA = *(bP);\n        colorB = *(bP + 1);\n        colorK = *(bP + 2);\n\n        colorH = *(bP + Nextline - 1);\n        colorC = *(bP + Nextline);\n        colorD = *(bP + Nextline + 1);\n        colorL = *(bP + Nextline + 2);\n\n        colorM = *(bP + Nextline + Nextline - 1);\n        colorN = *(bP + Nextline + Nextline);\n        colorO = *(bP + Nextline + Nextline + 1);\n        colorP = *(bP + Nextline + Nextline + 2);\n\n        if ((colorA == colorD) && (colorB != colorC)) {\n          if (((colorA == colorE) && (colorB == colorL)) ||\n              ((colorA == colorC) && (colorA == colorF)\n               && (colorB != colorE) && (colorB == colorJ))) {\n            product = colorA;\n          } else {\n            product = INTERPOLATE (colorA, colorB);\n          }\n\n          if (((colorA == colorG) && (colorC == colorO)) ||\n              ((colorA == colorB) && (colorA == colorH)\n               && (colorG != colorC) && (colorC == colorM))) {\n            product1 = colorA;\n          } else {\n            product1 = INTERPOLATE (colorA, colorC);\n          }\n          product2 = colorA;\n        } else if ((colorB == colorC) && (colorA != colorD)) {\n          if (((colorB == colorF) && (colorA == colorH)) ||\n              ((colorB == colorE) && (colorB == colorD)\n               && (colorA != colorF) && (colorA == colorI))) {\n            product = colorB;\n          } else {\n            product = INTERPOLATE (colorA, colorB);\n          }\n\n          if (((colorC == colorH) && (colorA == colorF)) ||\n              ((colorC == colorG) && (colorC == colorD)\n               && (colorA != colorH) && (colorA == colorI))) {\n            product1 = colorC;\n          } else {\n            product1 = INTERPOLATE (colorA, colorC);\n          }\n          product2 = colorB;\n        } else if ((colorA == colorD) && (colorB == colorC)) {\n          if (colorA == colorB) {\n            product = colorA;\n            product1 = colorA;\n            product2 = colorA;\n          } else {\n            register int r = 0;\n\n            product1 = INTERPOLATE (colorA, colorC);\n            product = INTERPOLATE (colorA, colorB);\n\n            r += GetResult1 (colorA, colorB, colorG, colorE, colorI);\n            r += GetResult2 (colorB, colorA, colorK, colorF, colorJ);\n            r += GetResult2 (colorB, colorA, colorH, colorN, colorM);\n            r += GetResult1 (colorA, colorB, colorL, colorO, colorP);\n\n            if (r > 0)\n              product2 = colorA;\n            else if (r < 0)\n              product2 = colorB;\n            else {\n              product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);\n            }\n          }\n        } else {\n          product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);\n\n          if ((colorA == colorC) && (colorA == colorF)\n              && (colorB != colorE) && (colorB == colorJ)) {\n            product = colorA;\n          } else if ((colorB == colorE) && (colorB == colorD)\n                     && (colorA != colorF) && (colorA == colorI)) {\n            product = colorB;\n          } else {\n            product = INTERPOLATE (colorA, colorB);\n          }\n\n          if ((colorA == colorB) && (colorA == colorH)\n              && (colorG != colorC) && (colorC == colorM)) {\n            product1 = colorA;\n          } else if ((colorC == colorG) && (colorC == colorD)\n                     && (colorA != colorH) && (colorA == colorI)) {\n            product1 = colorC;\n          } else {\n            product1 = INTERPOLATE (colorA, colorC);\n          }\n        }\n\n#ifdef WORDS_BIGENDIAN\n        product = (colorA << 16) | product ;\n        product1 = (product1 << 16) | product2 ;\n#else\n        product = colorA | (product << 16);\n        product1 = product1 | (product2 << 16);\n#endif\n        *((s32 *) dP) = product;\n        *((u32 *) (dP + dstPitch)) = product1;\n\n        bP += inc_bP;\n        dP += sizeof (u32);\n      }                 // end of for ( finish= width etc..)\n\n      srcPtr += srcPitch;\n      dstPtr += dstPitch * 2;\n//      deltaPtr += srcPitch;\n    }                   // endof: for (height; height; height--)\n  }\n}\n\nvoid _2xSaI32 (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n               u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u32  *dP;\n  u32 *bP;\n  u32 inc_bP = 1;\n\n  u32 Nextline = srcPitch >> 2;\n\n  for (; height; height--) {\n    bP = (u32 *) srcPtr;\n    dP = (u32 *) dstPtr;\n\n    for (u32 finish = width; finish; finish -= inc_bP) {\n      register u32 colorA, colorB;\n      u32 colorC, colorD,\n        colorE, colorF, colorG, colorH,\n        colorI, colorJ, colorK, colorL,\n\n        colorM, colorN, colorO, colorP;\n      u32 product, product1, product2;\n\n      //---------------------------------------\n      // Map of the pixels:                    I|E F|J\n      //                                       G|A B|K\n      //                                       H|C D|L\n      //                                       M|N O|P\n      colorI = *(bP - Nextline - 1);\n      colorE = *(bP - Nextline);\n      colorF = *(bP - Nextline + 1);\n      colorJ = *(bP - Nextline + 2);\n\n      colorG = *(bP - 1);\n      colorA = *(bP);\n      colorB = *(bP + 1);\n      colorK = *(bP + 2);\n\n      colorH = *(bP + Nextline - 1);\n      colorC = *(bP + Nextline);\n      colorD = *(bP + Nextline + 1);\n      colorL = *(bP + Nextline + 2);\n\n      colorM = *(bP + Nextline + Nextline - 1);\n      colorN = *(bP + Nextline + Nextline);\n      colorO = *(bP + Nextline + Nextline + 1);\n      colorP = *(bP + Nextline + Nextline + 2);\n\n      if ((colorA == colorD) && (colorB != colorC)) {\n        if (((colorA == colorE) && (colorB == colorL)) ||\n            ((colorA == colorC) && (colorA == colorF)\n             && (colorB != colorE) && (colorB == colorJ))) {\n          product = colorA;\n        } else {\n          product = INTERPOLATE (colorA, colorB);\n        }\n\n        if (((colorA == colorG) && (colorC == colorO)) ||\n            ((colorA == colorB) && (colorA == colorH)\n             && (colorG != colorC) && (colorC == colorM))) {\n          product1 = colorA;\n        } else {\n          product1 = INTERPOLATE (colorA, colorC);\n        }\n        product2 = colorA;\n      } else if ((colorB == colorC) && (colorA != colorD)) {\n        if (((colorB == colorF) && (colorA == colorH)) ||\n            ((colorB == colorE) && (colorB == colorD)\n             && (colorA != colorF) && (colorA == colorI))) {\n          product = colorB;\n        } else {\n          product = INTERPOLATE (colorA, colorB);\n        }\n\n        if (((colorC == colorH) && (colorA == colorF)) ||\n            ((colorC == colorG) && (colorC == colorD)\n             && (colorA != colorH) && (colorA == colorI))) {\n          product1 = colorC;\n        } else {\n          product1 = INTERPOLATE (colorA, colorC);\n        }\n        product2 = colorB;\n      } else if ((colorA == colorD) && (colorB == colorC)) {\n        if (colorA == colorB) {\n          product = colorA;\n          product1 = colorA;\n          product2 = colorA;\n        } else {\n          register int r = 0;\n\n          product1 = INTERPOLATE (colorA, colorC);\n          product = INTERPOLATE (colorA, colorB);\n\n          r += GetResult1 (colorA, colorB, colorG, colorE, colorI);\n          r += GetResult2 (colorB, colorA, colorK, colorF, colorJ);\n          r += GetResult2 (colorB, colorA, colorH, colorN, colorM);\n          r += GetResult1 (colorA, colorB, colorL, colorO, colorP);\n\n          if (r > 0)\n            product2 = colorA;\n          else if (r < 0)\n            product2 = colorB;\n          else {\n            product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);\n          }\n        }\n      } else {\n        product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD);\n\n        if ((colorA == colorC) && (colorA == colorF)\n            && (colorB != colorE) && (colorB == colorJ)) {\n          product = colorA;\n        } else if ((colorB == colorE) && (colorB == colorD)\n                   && (colorA != colorF) && (colorA == colorI)) {\n          product = colorB;\n        } else {\n          product = INTERPOLATE (colorA, colorB);\n        }\n\n        if ((colorA == colorB) && (colorA == colorH)\n            && (colorG != colorC) && (colorC == colorM)) {\n          product1 = colorA;\n        } else if ((colorC == colorG) && (colorC == colorD)\n                   && (colorA != colorH) && (colorA == colorI)) {\n          product1 = colorC;\n        } else {\n          product1 = INTERPOLATE (colorA, colorC);\n        }\n      }\n      *(dP) = colorA;\n      *(dP + 1) = product;\n      *(dP + (dstPitch >> 2)) = product1;\n      *(dP + (dstPitch >> 2) + 1) = product2;\n\n      bP += inc_bP;\n      dP += 2;\n    }                 // end of for ( finish= width etc..)\n\n    srcPtr += srcPitch;\n    dstPtr += dstPitch * 2;\n//    deltaPtr += srcPitch;\n  }                   // endof: for (height; height; height--)\n}\n\nstatic u32 Bilinear (u32 A, u32 B, u32 x)\n{\n  unsigned long areaA, areaB;\n  unsigned long result;\n\n  if (A == B)\n    return A;\n\n  areaB = (x >> 11) & 0x1f;     // reduce 16 bit fraction to 5 bits\n  areaA = 0x20 - areaB;\n\n  A = (A & redblueMask) | ((A & greenMask) << 16);\n  B = (B & redblueMask) | ((B & greenMask) << 16);\n\n  result = ((areaA * A) + (areaB * B)) >> 5;\n\n  return (result & redblueMask) | ((result >> 16) & greenMask);\n}\n\nstatic u32 Bilinear4 (u32 A, u32 B, u32 C, u32 D, u32 x,\n                         u32 y)\n{\n  unsigned long areaA, areaB, areaC, areaD;\n  unsigned long result, xy;\n\n  x = (x >> 11) & 0x1f;\n  y = (y >> 11) & 0x1f;\n  xy = (x * y) >> 5;\n\n  A = (A & redblueMask) | ((A & greenMask) << 16);\n  B = (B & redblueMask) | ((B & greenMask) << 16);\n  C = (C & redblueMask) | ((C & greenMask) << 16);\n  D = (D & redblueMask) | ((D & greenMask) << 16);\n\n  areaA = 0x20 + xy - x - y;\n  areaB = x - xy;\n  areaC = y - xy;\n  areaD = xy;\n\n  result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5;\n\n  return (result & redblueMask) | ((result >> 16) & greenMask);\n}\n\nvoid Scale_2xSaI (u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n                  u8 *dstPtr, u32 dstPitch,\n                  u32 dstWidth, u32 dstHeight, int width, int height)\n{\n  u8  *dP;\n  u16 *bP;\n\n  u32 w;\n  u32 h;\n  u32 dw;\n  u32 dh;\n  u32 hfinish;\n  u32 wfinish;\n\n  u32 Nextline = srcPitch >> 1;\n\n  wfinish = (width - 1) << 16;  // convert to fixed point\n  dw = wfinish / (dstWidth - 1);\n  hfinish = (height - 1) << 16; // convert to fixed point\n  dh = hfinish / (dstHeight - 1);\n\n  for (h = 0; h < hfinish; h += dh) {\n    u32 y1, y2;\n\n    y1 = h & 0xffff;    // fraction part of fixed point\n    bP = (u16 *) (srcPtr + ((h >> 16) * srcPitch));\n    dP = dstPtr;\n    y2 = 0x10000 - y1;\n\n    w = 0;\n\n    for (; w < wfinish;) {\n      u32 A, B, C, D;\n      u32 E, F, G, H;\n      u32 I, J, K, L;\n      u32 x1, x2, a1, f1, f2;\n      u32 position, product1;\n\n      position = w >> 16;\n      A = bP[position]; // current pixel\n      B = bP[position + 1];     // next pixel\n      C = bP[position + Nextline];\n      D = bP[position + Nextline + 1];\n      E = bP[position - Nextline];\n      F = bP[position - Nextline + 1];\n      G = bP[position - 1];\n      H = bP[position + Nextline - 1];\n      I = bP[position + 2];\n      J = bP[position + Nextline + 2];\n      K = bP[position + Nextline + Nextline];\n      L = bP[position + Nextline + Nextline + 1];\n\n      x1 = w & 0xffff;  // fraction part of fixed point\n      x2 = 0x10000 - x1;\n\n      /*0*/\n      if (A == B && C == D && A == C)\n        product1 = A;\n      else /*1*/ if (A == D && B != C) {\n        f1 = (x1 >> 1) + (0x10000 >> 2);\n        f2 = (y1 >> 1) + (0x10000 >> 2);\n        if (y1 <= f1 && A == J && A != E)       // close to B\n          {\n            a1 = f1 - y1;\n            product1 = Bilinear (A, B, a1);\n          } else if (y1 >= f1 && A == G && A != L)      // close to C\n            {\n              a1 = y1 - f1;\n              product1 = Bilinear (A, C, a1);\n            }\n        else if (x1 >= f2 && A == E && A != J)  // close to B\n          {\n            a1 = x1 - f2;\n            product1 = Bilinear (A, B, a1);\n          }\n        else if (x1 <= f2 && A == L && A != G)  // close to C\n          {\n            a1 = f2 - x1;\n            product1 = Bilinear (A, C, a1);\n          }\n        else if (y1 >= x1)      // close to C\n          {\n            a1 = y1 - x1;\n            product1 = Bilinear (A, C, a1);\n          }\n        else if (y1 <= x1)      // close to B\n          {\n            a1 = x1 - y1;\n            product1 = Bilinear (A, B, a1);\n          }\n      }\n      else\n        /*2*/\n        if (B == C && A != D)\n          {\n            f1 = (x1 >> 1) + (0x10000 >> 2);\n            f2 = (y1 >> 1) + (0x10000 >> 2);\n            if (y2 >= f1 && B == H && B != F)   // close to A\n              {\n                a1 = y2 - f1;\n                product1 = Bilinear (B, A, a1);\n              }\n            else if (y2 <= f1 && B == I && B != K)      // close to D\n              {\n                a1 = f1 - y2;\n                product1 = Bilinear (B, D, a1);\n              }\n            else if (x2 >= f2 && B == F && B != H)      // close to A\n              {\n                a1 = x2 - f2;\n                product1 = Bilinear (B, A, a1);\n              }\n            else if (x2 <= f2 && B == K && B != I)      // close to D\n              {\n                a1 = f2 - x2;\n                product1 = Bilinear (B, D, a1);\n              }\n            else if (y2 >= x1)  // close to A\n              {\n                a1 = y2 - x1;\n                product1 = Bilinear (B, A, a1);\n              }\n            else if (y2 <= x1)  // close to D\n              {\n                a1 = x1 - y2;\n                product1 = Bilinear (B, D, a1);\n              }\n          }\n      /*3*/\n        else\n          {\n            product1 = Bilinear4 (A, B, C, D, x1, y1);\n          }\n\n      //end First Pixel\n      *(u32 *) dP = product1;\n      dP += 2;\n      w += dw;\n    }\n    dstPtr += dstPitch;\n  }\n}\n\nvoid Render2xSaI (SSurface Src, SSurface Dst)\n{\n    unsigned char *lpSrc, *lpDst;\n\n    lpSrc = Src.Surface;\n    lpDst = Dst.Surface;\n\n    _2xSaI32 (lpSrc, Src.Pitch*2, lpSrc,\n            lpDst, Dst.Pitch*2, Src.Width, Src.Height);\n\n}\n\nvoid RenderSuper2xSaI (SSurface Src, SSurface Dst)\n{\n\n    unsigned char *lpSrc, *lpDst;\n\n    lpSrc = Src.Surface;\n    lpDst = Dst.Surface;\n\n    Super2xSaI32 (lpSrc, Src.Pitch*2,\n                lpSrc,\n                lpDst, Dst.Pitch*2, Src.Width, Src.Height);\n\n}\n\nvoid RenderSuperEagle (SSurface Src, SSurface Dst)\n{\n\n    unsigned char *lpSrc, *lpDst;\n\n    lpSrc = Src.Surface;\n    lpDst = Dst.Surface;\n\n    SuperEagle32 (lpSrc, Src.Pitch*2,\n                lpSrc,\n                lpDst, Dst.Pitch*2, Src.Width, Src.Height);\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/bilinear.cpp",
    "content": "/**     Code adapted from Exult source code by Forgotten\n **\tScale.cc - Trying to scale with bilinear interpolation.\n **\n **\tWritten: 6/14/00 - JSF\n **/\n\n#include \"types.h\"\n\nint systemRedShift    = 16;\nint systemGreenShift  = 8;\nint systemBlueShift   = 0;\n/*\n#define RGB1(r,g,b) ((r)>>3) << systemRedShift |\\\n  ((g) >> 3) << systemGreenShift |\\\n  ((b) >> 3) << systemBlueShift\\\n*/\n#define RGB1(r,g,b) (((r))<<systemRedShift) | (((g)) << systemGreenShift) | (((b)) << systemBlueShift)\n\nstatic void fill_rgb_row_16(u16 *from, int src_width, u8 *row, int width)\n{\n  u8 *copy_start = row + src_width*3;\n  u8 *all_stop = row + width*3;\n  while (row < copy_start) {\n    u16 color = *from++;\n    *row++ = ((color >> systemRedShift) & 0x1f) << 3;\n    *row++ = ((color >> systemGreenShift) & 0x1f) << 3;\n    *row++ = ((color >> systemBlueShift) & 0x1f) << 3;\n  }\n  // any remaining elements to be written to 'row' are a replica of the\n  // preceding pixel\n  u8 *p = row-3;\n  while (row < all_stop) {\n    // we're guaranteed three elements per pixel; could unroll the loop\n    // further, especially with a Duff's Device, but the gains would be\n    // probably limited (judging by profiler output)\n    *row++ = *p++;\n    *row++ = *p++;\n    *row++ = *p++;\n  }\n}\n\nstatic void fill_rgb_row_32(u32 *from, int src_width, u8 *row, int width)\n{\n  u8 *copy_start = row + src_width*3;\n  u8 *all_stop = row + width*3;\n  while (row < copy_start) {\n    u32 color = *from++;\n    *row++ = ((color >> (systemRedShift)) ) ;\n    *row++ = ((color >> (systemGreenShift)) ) ;\n    *row++ = ((color >> (systemBlueShift)) ) ;\n  }\n  // any remaining elements to be written to 'row' are a replica of the\n  // preceding pixel\n  u8 *p = row-3;\n  while (row < all_stop) {\n    // we're guaranteed three elements per pixel; could unroll the loop\n    // further, especially with a Duff's Device, but the gains would be\n    // probably limited (judging by profiler output)\n    *row++ = *p++;\n    *row++ = *p++;\n    *row++ = *p++;\n  }\n}\n\nvoid Bilinear(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n              u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u8 row_cur[3*322];\n  u8 row_next[3*322];\n  u8 *rgb_row_cur = row_cur;\n  u8 *rgb_row_next = row_next;\n\n  u16 *to = (u16 *)dstPtr;\n  u16 *to_odd = (u16 *)(dstPtr + dstPitch);\n\n  int from_width = width;\n  u16 *from = (u16 *)srcPtr;\n  fill_rgb_row_16(from, from_width, rgb_row_cur, width+1);\n\n  for(int y = 0; y < height; y++) {\n    u16 *from_orig = from;\n    u16 *to_orig = to;\n\n    if (y+1 < height)\n      fill_rgb_row_16(from+width, from_width, rgb_row_next,\n                   width+1);\n    else\n      fill_rgb_row_16(from, from_width, rgb_row_next, width+1);\n\n    // every pixel in the src region, is extended to 4 pixels in the\n    // destination, arranged in a square 'quad'; if the current src\n    // pixel is 'a', then in what follows 'b' is the src pixel to the\n    // right, 'c' is the src pixel below, and 'd' is the src pixel to\n    // the right and down\n    u8 *cur_row  = rgb_row_cur;\n    u8 *next_row = rgb_row_next;\n    u8 *ar = cur_row++;\n    u8 *ag = cur_row++;\n    u8 *ab = cur_row++;\n    u8 *cr = next_row++;\n    u8 *cg = next_row++;\n    u8 *cb = next_row++;\n    for(int x=0; x < width; x++) {\n      u8 *br = cur_row++;\n      u8 *bg = cur_row++;\n      u8 *bb = cur_row++;\n      u8 *dr = next_row++;\n      u8 *dg = next_row++;\n      u8 *db = next_row++;\n\n      // upper left pixel in quad: just copy it in\n      *to++ = RGB1(*ar, *ag, *ab);\n\n      // upper right\n      *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1);\n\n      // lower left\n      *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1);\n\n      // lower right\n      *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2,\n                      (*ag+*bg+*cg+*dg)>>2,\n                      (*ab+*bb+*cb+*db)>>2);\n\n      // 'b' becomes 'a', 'd' becomes 'c'\n      ar = br;\n      ag = bg;\n      ab = bb;\n      cr = dr;\n      cg = dg;\n      cb = db;\n    }\n\n    // the \"next\" rgb row becomes the current; the old current rgb row is\n    // recycled and serves as the new \"next\" row\n    u8 *temp;\n    temp = rgb_row_cur;\n    rgb_row_cur = rgb_row_next;\n    rgb_row_next = temp;\n\n    // update the pointers for start of next pair of lines\n    from = (u16 *)((u8 *)from_orig + srcPitch);\n    to = (u16 *)((u8 *)to_orig + (dstPitch << 1));\n    to_odd = (u16 *)((u8 *)to + dstPitch);\n  }\n}\n\nstruct SSurface {\n\tunsigned char *Surface;\n\n\tunsigned int Pitch;\n\tunsigned int Width, Height;\n};\n\nvoid BilinearPlus(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n                  u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u8 row_cur[3*322];\n  u8 row_next[3*322];\n  u8 *rgb_row_cur = row_cur;\n  u8 *rgb_row_next = row_next;\n\n  u16 *to = (u16 *)dstPtr;\n  u16 *to_odd = (u16 *)(dstPtr + dstPitch);\n\n  int from_width = width;\n  u16 *from = (u16 *)srcPtr;\n  fill_rgb_row_16(from, from_width, rgb_row_cur, width+1);\n\n  for(int y = 0; y < height; y++) {\n    u16 *from_orig = from;\n    u16 *to_orig = to;\n\n    if (y+1 < height)\n      fill_rgb_row_16(from+width, from_width, rgb_row_next,\n                   width+1);\n    else\n      fill_rgb_row_16(from, from_width, rgb_row_next, width+1);\n\n    // every pixel in the src region, is extended to 4 pixels in the\n    // destination, arranged in a square 'quad'; if the current src\n    // pixel is 'a', then in what follows 'b' is the src pixel to the\n    // right, 'c' is the src pixel below, and 'd' is the src pixel to\n    // the right and down\n    u8 *cur_row  = rgb_row_cur;\n    u8 *next_row = rgb_row_next;\n    u8 *ar = cur_row++;\n    u8 *ag = cur_row++;\n    u8 *ab = cur_row++;\n    u8 *cr = next_row++;\n    u8 *cg = next_row++;\n    u8 *cb = next_row++;\n    for(int x=0; x < width; x++) {\n      u8 *br = cur_row++;\n      u8 *bg = cur_row++;\n      u8 *bb = cur_row++;\n      u8 *dr = next_row++;\n      u8 *dg = next_row++;\n      u8 *db = next_row++;\n\n      // upper left pixel in quad: just copy it in\n      //*to++ = manip.rgb(*ar, *ag, *ab);\n#ifdef USE_ORIGINAL_BILINEAR_PLUS\n      *to++ = RGB(\n                  (((*ar)<<2) +((*ar)) + (*cr+*br+*br) )>> 3,\n                  (((*ag)<<2) +((*ag)) + (*cg+*bg+*bg) )>> 3,\n                  (((*ab)<<2) +((*ab)) + (*cb+*bb+*bb) )>> 3);\n#else\n      *to++ = RGB1(\n                  (((*ar)<<3) +((*ar)<<1) + (*cr+*br+*br+*cr) )>> 4,\n                  (((*ag)<<3) +((*ag)<<1) + (*cg+*bg+*bg+*cg) )>> 4,\n                  (((*ab)<<3) +((*ab)<<1) + (*cb+*bb+*bb+*cb) )>> 4);\n#endif\n\n      // upper right\n      *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1);\n\n      // lower left\n      *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1);\n\n      // lower right\n      *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2,\n                      (*ag+*bg+*cg+*dg)>>2,\n                      (*ab+*bb+*cb+*db)>>2);\n\n      // 'b' becomes 'a', 'd' becomes 'c'\n      ar = br;\n      ag = bg;\n      ab = bb;\n      cr = dr;\n      cg = dg;\n      cb = db;\n    }\n\n    // the \"next\" rgb row becomes the current; the old current rgb row is\n    // recycled and serves as the new \"next\" row\n    u8 *temp;\n    temp = rgb_row_cur;\n    rgb_row_cur = rgb_row_next;\n    rgb_row_next = temp;\n\n    // update the pointers for start of next pair of lines\n    from = (u16 *)((u8 *)from_orig + srcPitch);\n    to = (u16 *)((u8 *)to_orig + (dstPitch << 1));\n    to_odd = (u16 *)((u8 *)to + dstPitch);\n  }\n}\n\nvoid Bilinear32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n                u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u8 row_cur[3*322];\n  u8 row_next[3*322];\n  u8 *rgb_row_cur = row_cur;\n  u8 *rgb_row_next = row_next;\n\n  u32 *to = (u32 *)dstPtr;\n  u32 *to_odd = (u32 *)(dstPtr + dstPitch);\n\n  int from_width = width;\n\n  u32 *from = (u32 *)srcPtr;\n  fill_rgb_row_32(from, from_width, rgb_row_cur, width+1);\n\n  for(int y = 0; y < height; y++) {\n    u32 *from_orig = from;\n    u32 *to_orig = to;\n\n    if (y+1 < height)\n      fill_rgb_row_32(from+width+1, from_width, rgb_row_next,\n                   width+1);\n    else\n      fill_rgb_row_32(from, from_width, rgb_row_next, width+1);\n\n    // every pixel in the src region, is extended to 4 pixels in the\n    // destination, arranged in a square 'quad'; if the current src\n    // pixel is 'a', then in what follows 'b' is the src pixel to the\n    // right, 'c' is the src pixel below, and 'd' is the src pixel to\n    // the right and down\n    u8 *cur_row  = rgb_row_cur;\n    u8 *next_row = rgb_row_next;\n    u8 *ar = cur_row++;\n    u8 *ag = cur_row++;\n    u8 *ab = cur_row++;\n    u8 *cr = next_row++;\n    u8 *cg = next_row++;\n    u8 *cb = next_row++;\n    for(int x=0; x < width; x++) {\n      u8 *br = cur_row++;\n      u8 *bg = cur_row++;\n      u8 *bb = cur_row++;\n      u8 *dr = next_row++;\n      u8 *dg = next_row++;\n      u8 *db = next_row++;\n\n      // upper left pixel in quad: just copy it in\n\t  int m = *ar;\n\t  int mm = *ag;\n\t  int mmmm = *ab;\n\t  int mmm =  RGB1(*ar, *ag, *ab);\n      *to++ = RGB1(*ar, *ag, *ab);\n\n      // upper right\n      *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1);\n\n      // lower left\n      *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1);\n\n      // lower right\n      *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2,\n                      (*ag+*bg+*cg+*dg)>>2,\n                      (*ab+*bb+*cb+*db)>>2);\n\n      // 'b' becomes 'a', 'd' becomes 'c'\n      ar = br;\n      ag = bg;\n      ab = bb;\n      cr = dr;\n      cg = dg;\n      cb = db;\n    }\n\n    // the \"next\" rgb row becomes the current; the old current rgb row is\n    // recycled and serves as the new \"next\" row\n    u8 *temp;\n    temp = rgb_row_cur;\n    rgb_row_cur = rgb_row_next;\n    rgb_row_next = temp;\n\n    // update the pointers for start of next pair of lines\n    from = (u32 *)((u8 *)from_orig + srcPitch);\n    to = (u32 *)((u8 *)to_orig + (dstPitch << 1));\n    to_odd = (u32 *)((u8 *)to + dstPitch);\n  }\n}\n\nvoid BilinearPlus32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n                    u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u8 row_cur[3*322];\n  u8 row_next[3*322];\n  u8 *rgb_row_cur = row_cur;\n  u8 *rgb_row_next = row_next;\n\n  u32 *to = (u32 *)dstPtr;\n  u32 *to_odd = (u32 *)(dstPtr + dstPitch);\n\n  int from_width = width;\n\n  u32 *from = (u32 *)srcPtr;\n  fill_rgb_row_32(from, from_width, rgb_row_cur, width+1);\n\n  for(int y = 0; y < height; y++) {\n    u32 *from_orig = from;\n    u32 *to_orig = to;\n\n    if (y+1 < height)\n      fill_rgb_row_32(from+width+1, from_width, rgb_row_next,\n                   width+1);\n    else\n      fill_rgb_row_32(from, from_width, rgb_row_next, width+1);\n\n    // every pixel in the src region, is extended to 4 pixels in the\n    // destination, arranged in a square 'quad'; if the current src\n    // pixel is 'a', then in what follows 'b' is the src pixel to the\n    // right, 'c' is the src pixel below, and 'd' is the src pixel to\n    // the right and down\n    u8 *cur_row  = rgb_row_cur;\n    u8 *next_row = rgb_row_next;\n    u8 *ar = cur_row++;\n    u8 *ag = cur_row++;\n    u8 *ab = cur_row++;\n    u8 *cr = next_row++;\n    u8 *cg = next_row++;\n    u8 *cb = next_row++;\n    for(int x=0; x < width; x++) {\n      u8 *br = cur_row++;\n      u8 *bg = cur_row++;\n      u8 *bb = cur_row++;\n      u8 *dr = next_row++;\n      u8 *dg = next_row++;\n      u8 *db = next_row++;\n\n      // upper left pixel in quad: just copy it in\n      //*to++ = manip.rgb(*ar, *ag, *ab);\n#ifdef USE_ORIGINAL_BILINEAR_PLUS\n      *to++ = RGB(\n                  (((*ar)<<2) +((*ar)) + (*cr+*br+*br) )>> 3,\n                  (((*ag)<<2) +((*ag)) + (*cg+*bg+*bg) )>> 3,\n                  (((*ab)<<2) +((*ab)) + (*cb+*bb+*bb) )>> 3);\n#else\n      *to++ = RGB1(\n                  (((*ar)<<3) +((*ar)<<1) + (*cr+*br+*br+*cr) )>> 4,\n                  (((*ag)<<3) +((*ag)<<1) + (*cg+*bg+*bg+*cg) )>> 4,\n                  (((*ab)<<3) +((*ab)<<1) + (*cb+*bb+*bb+*cb) )>> 4);\n#endif\n\n      // upper right\n      *to++ = RGB1((*ar+*br)>>1, (*ag+*bg)>>1, (*ab+*bb)>>1);\n\n      // lower left\n      *to_odd++ = RGB1((*ar+*cr)>>1, (*ag+*cg)>>1, (*ab+*cb)>>1);\n\n      // lower right\n      *to_odd++ = RGB1((*ar+*br+*cr+*dr)>>2,\n                      (*ag+*bg+*cg+*dg)>>2,\n                      (*ab+*bb+*cb+*db)>>2);\n\n      // 'b' becomes 'a', 'd' becomes 'c'\n      ar = br;\n      ag = bg;\n      ab = bb;\n      cr = dr;\n      cg = dg;\n      cb = db;\n    }\n\n    // the \"next\" rgb row becomes the current; the old current rgb row is\n    // recycled and serves as the new \"next\" row\n    u8 *temp;\n    temp = rgb_row_cur;\n    rgb_row_cur = rgb_row_next;\n    rgb_row_next = temp;\n\n    // update the pointers for start of next pair of lines\n    from = (u32 *)((u8 *)from_orig + srcPitch);\n    to = (u32 *)((u8 *)to_orig + (dstPitch << 1));\n    to_odd = (u32 *)((u8 *)to + dstPitch);\n  }\n}\nvoid RenderBilinear (SSurface Src, SSurface Dst)\n{\n\n    unsigned char *lpSrc, *lpDst;\n\n    lpSrc = Src.Surface;\n    lpDst = Dst.Surface;\n\n    Bilinear32 (lpSrc, Src.Pitch*2,\n                lpSrc,\n                lpDst, Dst.Pitch*2, Src.Width, Src.Height);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/epx.cpp",
    "content": "/*  Copyright (C) 2009 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"filter.h\"\r\n#include \"types.h\"\r\n#include \"interp.h\"\r\n\r\n// transforms each 1 pixel into a 2x2 block of output pixels\r\n// where each corner is selected based on equivalence of neighboring pixels\r\nvoid RenderEPX (SSurface Src, SSurface Dst)\r\n{\r\n\tuint32 *lpSrc;\r\n\r\n\tconst uint32 srcHeight = Src.Height;\r\n\tconst uint32 srcWidth = Src.Width;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tlpSrc = reinterpret_cast<uint32 *>(Src.Surface);\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tuint32 *lpDst = (uint32*)Dst.Surface;\r\n\r\n\tfor(uint32 j = 0; j < srcHeight; j++)\r\n\t{\r\n\t\tuint32* SrcLine = lpSrc + srcPitch*j;\r\n\t\tuint32* DstLine1 = lpDst + dstPitch*(j*2);\r\n\t\tuint32* DstLine2 = lpDst + dstPitch*(j*2+1);\r\n\t\tfor(uint32 i = 0; i < srcWidth; i++)\r\n\t\t{\r\n\t\t\tuint32 L = *(SrcLine-1);\r\n\t\t\tuint32 C = *(SrcLine);\r\n\t\t\tuint32 R = *(SrcLine+1);\r\n\t\t\tif(L != R)\r\n\t\t\t{\r\n\t\t\t\tuint32 U = *(SrcLine-srcPitch);\r\n\t\t\t\tuint32 D = *(SrcLine+srcPitch);\r\n\t\t\t\tif(U != D)\r\n\t\t\t\t{\r\n\t\t\t\t\t*DstLine1++ = (U == L) ? U : C;\r\n\t\t\t\t\t*DstLine1++ = (R == U) ? R : C;\r\n\t\t\t\t\t*DstLine2++ = (L == D) ? L : C;\r\n\t\t\t\t\t*DstLine2++ = (D == R) ? D : C;\r\n\t\t\t\t\tSrcLine++;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t*DstLine1++ = C; \r\n\t\t\t*DstLine1++ = C; \r\n\t\t\t*DstLine2++ = C; \r\n\t\t\t*DstLine2++ = C; \r\n\t\t\tSrcLine++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// transforms each 2x2 block of pixels into a 3x3 block of output pixels\r\n// where each pixel is selected based on equivalence of neighboring pixels\r\nvoid RenderEPX_1Point5x (SSurface Src, SSurface Dst)\r\n{\r\n\tu32 *lpSrc;\r\n\r\n\tu32 srcHeight = Src.Height;\r\n\tu32 srcWidth = Src.Width;\r\n\tu32 dstHeight = Dst.Height;\r\n\tu32 dstWidth = Dst.Width;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tlpSrc = reinterpret_cast<u32 *>(Src.Surface);\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tu32 *lpDst = (u32*)Dst.Surface;\r\n\r\n\tfor(uint32 yi=0, yo=0; yi < srcHeight; yi+=2, yo+=3)\r\n\t{\r\n\t\tu32* SrcLine = lpSrc + srcPitch*yi;\r\n\t\tu32* DstLine1 = lpDst + dstPitch*(yo);\r\n\t\tu32* DstLine2 = lpDst + dstPitch*(yo+1);\r\n\t\tu32* DstLine3 = lpDst + dstPitch*(yo+2);\r\n\t\tfor(uint32 xi=0; xi < srcWidth; xi+=2)\r\n\t\t{\r\n\t\t\tu32                                s10 = *(SrcLine-srcPitch),   s20 = *(SrcLine-srcPitch+1),   s30 = *(SrcLine-srcPitch+2);\r\n\t\t\tu32 s01 = *(SrcLine-1),            s11 = *(SrcLine),            s21 = *(SrcLine+1),            s31 = *(SrcLine+2);\r\n\t\t\tu32 s02 = *(SrcLine+srcPitch-1),   s12 = *(SrcLine+srcPitch),   s22 = *(SrcLine+srcPitch+1),   s32 = *(SrcLine+srcPitch+2);\r\n\t\t\tu32 s03 = *(SrcLine+2*srcPitch-1), s13 = *(SrcLine+2*srcPitch), s23 = *(SrcLine+2*srcPitch+1), s33 = *(SrcLine+2*srcPitch+2);\r\n\t\t\t*DstLine1++ =  s01==s10 && s10!=s21 && s01!=s12\r\n\t\t\t                                                             ? s01:s11;\r\n\t\t\t*DstLine1++ =  s10==s21 && s10!=s01 && s21!=s12\r\n\t\t\t                                                             ? s21:s11;\r\n\t\t\t*DstLine1++ = (s11==s20 && s20!=s31 && s11!=s22 && s21!=s30)\r\n\t\t\t           || (s20==s31 && s20!=s11 && s31!=s22 && s21!=s10) ? s20:s21;\r\n\t\t\t*DstLine2++ =  s01==s12 && s01!=s10 && s12!=s21\r\n\t\t\t                                                             ? s01:s11;\r\n\t\t\t*DstLine2++ =  s12==s21 && s01!=s12 && s10!=s21\r\n\t\t\t                                                             ? s21:s11;\r\n\t\t\t*DstLine2++ = (s11==s22 && s11!=s20 && s22!=s31 && s21!=s32)\r\n\t\t\t           || (s22==s31 && s11!=s22 && s20!=s31 && s21!=s12) ? s22:s21;\r\n\t\t\t*DstLine3++ = (s02==s11 && s11!=s22 && s02!=s13 && s12!=s03)\r\n\t\t\t           || (s02==s13 && s02!=s11 && s13!=s22 && s12!=s01) ? s02:s12;\r\n\t\t\t*DstLine3++ = (s11==s22 && s11!=s02 && s22!=s13 && s12!=s23)\r\n\t\t\t           || (s13==s22 && s02!=s13 && s11!=s22 && s12!=s21) ? s22:s12;\r\n\t\t    *DstLine3++ = s22;\r\n\t\t\tSrcLine+=2;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic u32 min(u32 a, u32 b) { return (a < b) ? a : b; }\r\nstatic u32 min3(u32 a, u32 b, u32 c) { return min(a,min(b,c)); }\r\nstatic u32 dist(u32 a, u32 b)\r\n{\r\n\treturn ABS( (a & 0x0000FF)      -  (b & 0x0000FF))*2\r\n\t     + ABS(((a & 0x00FF00)>>8)  - ((b & 0x00FF00)>>8))*3\r\n\t     + ABS(((a & 0xFF0000)>>16) - ((b & 0xFF0000)>>16))*3;\r\n}\r\n// note: we only use mix to make the arbitrary choice between two almost-equal colors.\r\n// this filter doesn't really do much interpolating or have the appearance of doing any.\r\n#define mix interp_32_11\r\n\r\n// transforms each 1 pixel into a 2x2 block of output pixels\r\n// where each corner is selected based on relative equivalence of neighboring pixels\r\nvoid RenderEPXPlus (SSurface Src, SSurface Dst)\r\n{\r\n\tuint32 *lpSrc;\r\n\r\n\tconst uint32 srcHeight = Src.Height;\r\n\tconst uint32 srcWidth = Src.Width;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tlpSrc = reinterpret_cast<uint32 *>(Src.Surface);\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tuint32 *lpDst = (uint32*)Dst.Surface;\r\n\r\n\tfor(uint32 j = 0; j < srcHeight; j++)\r\n\t{\r\n\t\tuint32* SrcLine = lpSrc + srcPitch*j;\r\n\t\tuint32* DstLine1 = lpDst + dstPitch*(j*2);\r\n\t\tuint32* DstLine2 = lpDst + dstPitch*(j*2+1);\r\n\t\tfor(uint32 i = 0; i < srcWidth; i++)\r\n\t\t{\r\n\t\t\tuint32 L = *(SrcLine-1);\r\n\t\t\tuint32 C = *(SrcLine);\r\n\t\t\tuint32 R = *(SrcLine+1);\r\n\t\t\tuint32 U = *(SrcLine-srcPitch);\r\n\t\t\tuint32 D = *(SrcLine+srcPitch);\r\n\t\t\t*DstLine1++ = dist(L,U) < min(dist(L,D),dist(R,U)) ? mix(L,U) : C;\r\n\t\t\t*DstLine1++ = dist(R,U) < min(dist(L,U),dist(R,D)) ? mix(R,U) : C;\r\n\t\t\t*DstLine2++ = dist(L,D) < min(dist(L,U),dist(R,D)) ? mix(L,D) : C;\r\n\t\t\t*DstLine2++ = dist(R,D) < min(dist(L,D),dist(R,U)) ? mix(R,D) : C;\r\n\t\t\tSrcLine++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// transforms each 2x2 block of pixels into a 3x3 block of output pixels\r\n// where each pixel is selected based on relative equivalence of neighboring pixels\r\nvoid RenderEPXPlus_1Point5x (SSurface Src, SSurface Dst)\r\n{\r\n\tu32 *lpSrc;\r\n\r\n\tu32 srcHeight = Src.Height;\r\n\tu32 srcWidth = Src.Width;\r\n\tu32 dstHeight = Dst.Height;\r\n\tu32 dstWidth = Dst.Width;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tlpSrc = reinterpret_cast<u32 *>(Src.Surface);\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tu32 *lpDst = (u32*)Dst.Surface;\r\n\r\n\tfor(uint32 yi=0, yo=0; yi < srcHeight; yi+=2, yo+=3)\r\n\t{\r\n\t\tu32* SrcLine = lpSrc + srcPitch*yi;\r\n\t\tu32* DstLine1 = lpDst + dstPitch*(yo);\r\n\t\tu32* DstLine2 = lpDst + dstPitch*(yo+1);\r\n\t\tu32* DstLine3 = lpDst + dstPitch*(yo+2);\r\n\t\tfor(uint32 xi=0; xi < srcWidth; xi+=2)\r\n\t\t{\r\n\t\t\tu32                                s10 = *(SrcLine-srcPitch),   s20 = *(SrcLine-srcPitch+1),   s30 = *(SrcLine-srcPitch+2);\r\n\t\t\tu32 s01 = *(SrcLine-1),            s11 = *(SrcLine),            s21 = *(SrcLine+1),            s31 = *(SrcLine+2);\r\n\t\t\tu32 s02 = *(SrcLine+srcPitch-1),   s12 = *(SrcLine+srcPitch),   s22 = *(SrcLine+srcPitch+1),   s32 = *(SrcLine+srcPitch+2);\r\n\t\t\tu32 s03 = *(SrcLine+2*srcPitch-1), s13 = *(SrcLine+2*srcPitch), s23 = *(SrcLine+2*srcPitch+1), s33 = *(SrcLine+2*srcPitch+2);\r\n\t\t\t*DstLine1++ =  dist(s01,s10) < min( dist(s10,s21),dist(s01,s12))\r\n\t\t\t                                                                                ? mix(s01,s10):s11;\r\n\t\t\t*DstLine1++ =  dist(s10,s21) < min( dist(s10,s01),dist(s21,s12))\r\n\t\t\t                                                                                ? mix(s10,s21):s11;\r\n\t\t\t*DstLine1++ =  dist(s11,s20) < min3(dist(s20,s31),dist(s11,s22),dist(s21,s30))  ? mix(s11,s20):\r\n\t\t\t               dist(s20,s31) < min3(dist(s20,s11),dist(s31,s22),dist(s21,s10))  ? mix(s20,s31):s21;\r\n\t\t\t*DstLine2++ =  dist(s01,s12) < min( dist(s01,s10),dist(s12,s21))\r\n\t\t\t                                                                                ? mix(s01,s12):s11;\r\n\t\t\t*DstLine2++ =  dist(s12,s21) < min( dist(s01,s12),dist(s10,s21))\r\n\t\t\t                                                                                ? mix(s12,s21):s11;\r\n\t\t\t*DstLine2++ =  dist(s11,s22) < min3(dist(s11,s20),dist(s22,s31),dist(s21,s32))  ? mix(s11,s22):\r\n\t\t\t               dist(s22,s31) < min3(dist(s11,s22),dist(s20,s31),dist(s21,s12))  ? mix(s22,s31):s21;\r\n\t\t\t*DstLine3++ =  dist(s02,s11) < min3(dist(s11,s22),dist(s02,s13),dist(s12,s03))  ? mix(s02,s11):\r\n\t\t\t               dist(s02,s13) < min3(dist(s02,s11),dist(s13,s22),dist(s12,s01))  ? mix(s02,s13):s12;\r\n\t\t\t*DstLine3++ =  dist(s11,s22) < min3(dist(s11,s02),dist(s22,s13),dist(s12,s23))  ? mix(s11,s22):\r\n\t\t\t               dist(s13,s22) < min3(dist(s02,s13),dist(s11,s22),dist(s12,s21))  ? mix(s13,s22):s12;\r\n\t\t    *DstLine3++ = s22;\r\n\t\t\tSrcLine+=2;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n// transforms each 2x2 block of pixels into 3x3 output which is\r\n// a 2x2 block that has 1 block of padding on the right and bottom sides\r\n// which are selected stupidly from neighboring pixels in the original 2x2 block\r\nvoid RenderNearest_1Point5x (SSurface Src, SSurface Dst)\r\n{\r\n\tuint32 *lpSrc;\r\n\r\n\tuint32 srcHeight = Src.Height;\r\n\tuint32 srcWidth = Src.Width;\r\n\tuint32 dstHeight = Dst.Height;\r\n\tuint32 dstWidth = Dst.Width;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tlpSrc = reinterpret_cast<uint32 *>(Src.Surface);\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tuint32 *lpDst = (uint32*)Dst.Surface;\r\n\r\n\tfor(uint32 yi = 0, yo = 0; yi < srcHeight; yi+=2, yo+=3)\r\n\t{\r\n\t\tu32* srcPix1 = lpSrc + srcPitch*(yi);\r\n\t\tu32* srcPix2 = lpSrc + srcPitch*(yi+1);\r\n\t\tu32* dstPix1 = lpDst + dstPitch*(yo);\r\n\t\tu32* dstPix2 = lpDst + dstPitch*(yo+1);\r\n\t\tu32* dstPix3 = lpDst + dstPitch*(yo+2);\r\n\r\n\t\tfor(uint32 xi = 0; xi < srcWidth; xi+=2)\r\n\t\t{\r\n\t\t\t*dstPix1++ = *srcPix1++;\r\n\t\t\t*dstPix1++ = *srcPix1;\r\n\t\t\t*dstPix1++ = *srcPix1++;\r\n\t\t\t*dstPix2++ = *srcPix2;\r\n\t\t\t*dstPix3++ = *srcPix2++;\r\n\t\t\t*dstPix2++ = *srcPix2;\r\n\t\t\t*dstPix3++ = *srcPix2;\r\n\t\t\t*dstPix2++ = *srcPix2;\r\n\t\t\t*dstPix3++ = *srcPix2++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nint CLAMP(const int value, const int high) \r\n{\r\n  int low = 0;\r\n  return value < low ? low : (value >= high ? high-1 : value); \r\n}\r\n\r\n// transforms each 2x2 block of pixels into 3x3 output which is\r\n// a 2x2 block that has 1 block of padding on the right and bottom sides\r\n// which are selected from neighboring pixels depending on matching diagonals\r\nvoid RenderNearestPlus_1Point5x (SSurface Src, SSurface Dst)\r\n{\r\n\tuint32 *lpSrc;\r\n\r\n\tuint32 srcHeight = Src.Height;\r\n\tuint32 srcWidth = Src.Width;\r\n\tuint32 dstHeight = Dst.Height;\r\n\tuint32 dstWidth = Dst.Width;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tlpSrc = reinterpret_cast<uint32 *>(Src.Surface);\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tuint32 *lpDst = (uint32*)Dst.Surface;\r\n\r\n \tu32* srcPix = lpSrc;\r\n\tu32* dstPix = lpDst;\r\n\r\n  for(uint32 j = 0, y = 0; j < srcHeight; j+=2, y+=3)\r\n\t{\r\n\r\n#define GET(dx,dy) *(srcPix+(CLAMP((dy)+j,srcHeight))*srcPitch+(CLAMP((dx)+i,srcWidth)))\r\n#define SET(dx,dy,val) *(dstPix+(dy+y)*dstPitch+(dx+x)) = (val)\r\n#define BETTER(dx,dy,dx2,dy2) (GET(dx,dy) == GET(dx2,dy2) && GET(dx2,dy) != GET(dx,dy2))\r\n\r\n\t\tfor(uint32 i = 0, x = 0; i < srcWidth; i+=2, x+=3) //, srcPix+=2, dstPix+=3\r\n\t\t{\r\n\t\t\tSET(0,0,GET(0,0));\r\n\t\t\tSET(1,0,GET(1,0));\r\n\t\t\tSET(2,0,GET(BETTER(2,0,1,-1)? 2:1,0));\r\n\t\t\tSET(0,1,GET(0,1));\r\n\t\t\tSET(1,1,GET(1,1));\r\n\t\t\tSET(2,1,GET(BETTER(1,0, 2,1)? 2:1,1));\r\n\t\t\tSET(0,2,GET(BETTER(0,2,-1,1)?-1:0,1));\r\n\t\t\tSET(1,2,GET(BETTER(0,1, 1,2)? 0:1,1));\r\n\t\t\tSET(2,2,GET(BETTER(2,1, 1,2)? 2:1,1));\r\n\t\t}\r\n\r\n#undef GET\r\n#undef SET\r\n#undef BETTER\r\n\t}\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/filter.h",
    "content": "/*\r\nCopyright (C) 2009-2011 DeSmuME team\r\n\r\nThis file is free software: you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation, either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis file is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\n\r\n\r\ntypedef struct {\r\n\tunsigned char *Surface;\r\n\r\n\tunsigned int Pitch;\r\n\tunsigned int Width, Height;\r\n} SSurface;\r\n\r\nvoid RenderNearest2X (SSurface Src, SSurface Dst);\r\nvoid RenderLQ2X (SSurface Src, SSurface Dst);\r\nvoid RenderLQ2XS (SSurface Src, SSurface Dst);\r\nvoid RenderHQ2X (SSurface Src, SSurface Dst);\r\nvoid RenderHQ4X (SSurface Src, SSurface Dst);\r\nvoid RenderHQ2XS (SSurface Src, SSurface Dst);\r\nvoid Render2xSaI (SSurface Src, SSurface Dst);\r\nvoid RenderSuper2xSaI (SSurface Src, SSurface Dst);\r\nvoid RenderSuperEagle (SSurface Src, SSurface Dst);\r\nvoid RenderScanline( SSurface Src, SSurface Dst);\r\nvoid RenderBilinear( SSurface Src, SSurface Dst);\r\nvoid RenderEPX( SSurface Src, SSurface Dst);\r\nvoid RenderEPXPlus( SSurface Src, SSurface Dst);\r\nvoid RenderEPX_1Point5x( SSurface Src, SSurface Dst);\r\nvoid RenderEPXPlus_1Point5x( SSurface Src, SSurface Dst);\r\nvoid RenderNearest_1Point5x( SSurface Src, SSurface Dst);\r\nvoid RenderNearestPlus_1Point5x( SSurface Src, SSurface Dst);\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/hq2x.cpp",
    "content": "/*\n * This file is part of the Advance project.\n *\n * Copyright (C) 2003 Andrea Mazzoleni\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n *\n * In addition, as a special exception, Andrea Mazzoleni\n * gives permission to link the code of this program with\n * the MAME library (or with modified versions of MAME that use the\n * same license as MAME), and distribute linked combinations including\n * the two.  You must obey the GNU General Public License in all\n * respects for all of the code used other than MAME.  If you modify\n * this file, you may extend this exception to your version of the\n * file, but you are not obligated to do so.  If you do not wish to\n * do so, delete this exception statement from your version.\n */\r\n\r\n#include \"filter.h\"\n#include \"interp.h\"\n\n//\n///***************************************************************************/\n///* HQ2x C implementation */\n//\n///*\n// * This effect is a rewritten implementation of the hq2x effect made by Maxim Stepin\n// */\n//\n//static void hq2x_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count)\n//{\n//  unsigned i;\n//\n//  for(i=0;i<count;++i) {\n//    unsigned char mask;\n//\n//    u16 c[9];\n//\n//    c[1] = src0[0];\n//    c[4] = src1[0];\n//    c[7] = src2[0];\n//\n//    if (i>0) {\n//      c[0] = src0[-1];\n//      c[3] = src1[-1];\n//      c[6] = src2[-1];\n//    } else {\n//      c[0] = c[1];\n//      c[3] = c[4];\n//      c[6] = c[7];\n//    }\n//\n//    if (i<count-1) {\n//      c[2] = src0[1];\n//      c[5] = src1[1];\n//      c[8] = src2[1];\n//    } else {\n//      c[2] = c[1];\n//      c[5] = c[4];\n//      c[8] = c[7];\n//    }\n//\n//    mask = 0;\n//\n//    if (interp_16_diff(c[0], c[4]))\n//      mask |= 1 << 0;\n//    if (interp_16_diff(c[1], c[4]))\n//      mask |= 1 << 1;\n//    if (interp_16_diff(c[2], c[4]))\n//      mask |= 1 << 2;\n//    if (interp_16_diff(c[3], c[4]))\n//      mask |= 1 << 3;\n//    if (interp_16_diff(c[5], c[4]))\n//      mask |= 1 << 4;\n//    if (interp_16_diff(c[6], c[4]))\n//      mask |= 1 << 5;\n//    if (interp_16_diff(c[7], c[4]))\n//      mask |= 1 << 6;\n//    if (interp_16_diff(c[8], c[4]))\n//      mask |= 1 << 7;\n//\n//#define P0 dst0[0]\n//#define P1 dst0[1]\n//#define P2 dst1[0]\n//#define P3 dst1[1]\n//#define MUR interp_16_diff(c[1], c[5]) // top-right\n//#define MDR interp_16_diff(c[5], c[7]) // bottom-right\n//#define MDL interp_16_diff(c[7], c[3]) // bottom-left\n//#define MUL interp_16_diff(c[3], c[1]) // top-left\n//#define IC(p0) c[p0]\n//#define I11(p0,p1) interp_16_11(c[p0], c[p1])\n//#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2])\n//#define I31(p0,p1) interp_16_31(c[p0], c[p1])\n//#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2])\n//#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2])\n//#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2])\n//#define I53(p0,p1) interp_16_53(c[p0], c[p1])\n//#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2])\n//#define I71(p0,p1) interp_16_71(c[p0], c[p1])\n//#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2])\n//#define I97(p0,p1) interp_16_97(c[p0], c[p1])\n//#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2])\n//#define I151(p0,p1) interp_16_151(c[p0], c[p1])\n//\n//    switch (mask) {\n//#include \"hq2x.h\"\n//    }\n//\n//#undef P0\n//#undef P1\n//#undef P2\n//#undef P3\n//#undef MUR\n//#undef MDR\n//#undef MDL\n//#undef MUL\n//#undef IC\n//#undef I11\n//#undef I211\n//#undef I31\n//#undef I332\n//#undef I431\n//#undef I521\n//#undef I53\n//#undef I611\n//#undef I71\n//#undef I772\n//#undef I97\n//#undef I1411\n//#undef I151\n//\n//    src0 += 1;\n//    src1 += 1;\n//    src2 += 1;\n//    dst0 += 2;\n//    dst1 += 2;\n//  }\n//}\n\nstatic void hq2x_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count)\n{\n  unsigned i;\n\n  for(i=0;i<count;++i) {\n    unsigned char mask;\n\n    u32 c[9];\n\n    c[1] = src0[0];\n    c[4] = src1[0];\n    c[7] = src2[0];\n\n    if (i>0) {\n      c[0] = src0[-1];\n      c[3] = src1[-1];\n      c[6] = src2[-1];\n    } else {\n      c[0] = c[1];\n      c[3] = c[4];\n      c[6] = c[7];\n    }\n\n    if (i<count-1) {\n      c[2] = src0[1];\n      c[5] = src1[1];\n      c[8] = src2[1];\n    } else {\n      c[2] = c[1];\n      c[5] = c[4];\n      c[8] = c[7];\n    }\n\n    mask = 0;\n\n    if (interp_32_diff(c[0], c[4]))\n      mask |= 1 << 0;\n    if (interp_32_diff(c[1], c[4]))\n      mask |= 1 << 1;\n    if (interp_32_diff(c[2], c[4]))\n      mask |= 1 << 2;\n    if (interp_32_diff(c[3], c[4]))\n      mask |= 1 << 3;\n    if (interp_32_diff(c[5], c[4]))\n      mask |= 1 << 4;\n    if (interp_32_diff(c[6], c[4]))\n      mask |= 1 << 5;\n    if (interp_32_diff(c[7], c[4]))\n      mask |= 1 << 6;\n    if (interp_32_diff(c[8], c[4]))\n      mask |= 1 << 7;\n\n#define P0 dst0[0]\n#define P1 dst0[1]\n#define P2 dst1[0]\n#define P3 dst1[1]\n#define MUR interp_32_diff(c[1], c[5]) // top-right\n#define MDR interp_32_diff(c[5], c[7]) // bottom-right\n#define MDL interp_32_diff(c[7], c[3]) // bottom-left\n#define MUL interp_32_diff(c[3], c[1]) // top-left\n#define IC(p0) c[p0]\n#define I11(p0,p1) interp_32_11(c[p0], c[p1])\n#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2])\n#define I31(p0,p1) interp_32_31(c[p0], c[p1])\n#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2])\n#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2])\n#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2])\n#define I53(p0,p1) interp_32_53(c[p0], c[p1])\n#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2])\n#define I71(p0,p1) interp_32_71(c[p0], c[p1])\n#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2])\n#define I97(p0,p1) interp_32_97(c[p0], c[p1])\n#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2])\n#define I151(p0,p1) interp_32_151(c[p0], c[p1])\n\n    switch (mask) {\n#include \"hq2x.h\"\n    }\n\n#undef P0\n#undef P1\n#undef P2\n#undef P3\n#undef MUR\n#undef MDR\n#undef MDL\n#undef MUL\n#undef IC\n#undef I11\n#undef I211\n#undef I31\n#undef I332\n#undef I431\n#undef I521\n#undef I53\n#undef I611\n#undef I71\n#undef I772\n#undef I97\n#undef I1411\n#undef I151\n\n    src0 += 1;\n    src1 += 1;\n    src2 += 1;\n    dst0 += 2;\n    dst1 += 2;\n  }\n}\n\n/***************************************************************************/\n/* HQ2xS C implementation */\n\n/*\n * This effect is derived from the hq2x effect made by Maxim Stepin\n */\n\n//static void hq2xS_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count)\n//{\n//  unsigned i;\n//\n//  for(i=0;i<count;++i) {\n//\tunsigned char mask;\n//\n//\tu16 c[9];\n//\n//\tc[1] = src0[0];\n//\tc[4] = src1[0];\n//\tc[7] = src2[0];\n//\n//\tif (i>0) {\n//\t c[0] = src0[-1];\n//\t c[3] = src1[-1];\n//\t c[6] = src2[-1];\n//\t} else {\n//\t c[0] = c[1];\n//\t c[3] = c[4];\n//\t c[6] = c[7];\n//\t}\n//\n//\tif (i<count-1) {\n//\t c[2] = src0[1];\n//\t c[5] = src1[1];\n//\t c[8] = src2[1];\n//\t} else {\n//\t c[2] = c[1];\n//\t c[5] = c[4];\n//\t c[8] = c[7];\n//\t}\n//\n//\tmask = 0;\n//\n//\t// hq2xS dynamic edge detection:\n//\t// simply comparing the center color against its surroundings will give bad results in many cases,\n//\t// so, instead, compare the center color relative to the max difference in brightness of this 3x3 block\n//\tint brightArray[9];\n//\tint maxBright = 0, minBright = 999999;\n//\tfor(int j = 0 ; j < 9 ; j++)\n//\t{\n//\t\tint r,g,b;\n//\t\tif (interp_bits_per_pixel == 16) {\n//\t\t\tb = (int)((c[j] & 0x1F)) << 3;\n//\t\t\tg = (int)((c[j] & 0x7E0)) >> 3;\n//\t\t\tr = (int)((c[j] & 0xF800)) >> 8;\n//\t\t} else {\n//\t\t\tb = (int)((c[j] & 0x1F)) << 3;\n//\t\t\tg = (int)((c[j] & 0x3E0)) >> 2;\n//\t\t\tr = (int)((c[j] & 0x7C00)) >> 7;\n//\t\t}\n//\t\tconst int bright = r+r+r + g+g+g + b+b;\n//\t\tif(bright > maxBright) maxBright = bright;\n//\t\tif(bright < minBright) minBright = bright;\n//\n//\t\tbrightArray[j] = bright;\n//\t}\n//\tint diffBright = ((maxBright - minBright) * 7) >> 4;\n//\tif(diffBright > 7)\n//\t{\n//\t\tconst int centerBright = brightArray[4];\n//\t\tif(ABS(brightArray[0] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 0;\n//\t\tif(ABS(brightArray[1] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 1;\n//\t\tif(ABS(brightArray[2] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 2;\n//\t\tif(ABS(brightArray[3] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 3;\n//\t\tif(ABS(brightArray[5] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 4;\n//\t\tif(ABS(brightArray[6] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 5;\n//\t\tif(ABS(brightArray[7] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 6;\n//\t\tif(ABS(brightArray[8] - centerBright) > diffBright)\n//\t\t\tmask |= 1 << 7;\n//\t}\n//\n//#define P0 dst0[0]\n//#define P1 dst0[1]\n//#define P2 dst1[0]\n//#define P3 dst1[1]\n//#define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right\n//#define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right\n//#define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left\n//#define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left\n//#define IC(p0) c[p0]\n//#define I11(p0,p1) interp_16_11(c[p0], c[p1])\n//#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2])\n//#define I31(p0,p1) interp_16_31(c[p0], c[p1])\n//#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2])\n//#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2])\n//#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2])\n//#define I53(p0,p1) interp_16_53(c[p0], c[p1])\n//#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2])\n//#define I71(p0,p1) interp_16_71(c[p0], c[p1])\n//#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2])\n//#define I97(p0,p1) interp_16_97(c[p0], c[p1])\n//#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2])\n//#define I151(p0,p1) interp_16_151(c[p0], c[p1])\n//\n//    switch (mask) {\n//#include \"hq2x.h\"\n//    }\n//\n//#undef P0\n//#undef P1\n//#undef P2\n//#undef P3\n//#undef MUR\n//#undef MDR\n//#undef MDL\n//#undef MUL\n//#undef IC\n//#undef I11\n//#undef I211\n//#undef I31\n//#undef I332\n//#undef I431\n//#undef I521\n//#undef I53\n//#undef I611\n//#undef I71\n//#undef I772\n//#undef I97\n//#undef I1411\n//#undef I151\n//\n//    src0 += 1;\n//    src1 += 1;\n//    src2 += 1;\n//    dst0 += 2;\n//    dst1 += 2;\n//  }\n//}\n\nstatic void hq2xS_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count)\n{\n  unsigned i;\n\n   for(i=0;i<count;++i) {\n      unsigned char mask;\n\n      u32 c[9];\n\n      c[1] = src0[0];\n      c[4] = src1[0];\n      c[7] = src2[0];\n\n      if (i>0) {\n         c[0] = src0[-1];\n         c[3] = src1[-1];\n         c[6] = src2[-1];\n      } else {\n         c[0] = src0[0];\n         c[3] = src1[0];\n         c[6] = src2[0];\n      }\n\n      if (i<count-1) {\n         c[2] = src0[1];\n         c[5] = src1[1];\n         c[8] = src2[1];\n      } else {\n         c[2] = src0[0];\n         c[5] = src1[0];\n         c[8] = src2[0];\n      }\n\n\tmask = 0;\n\t// hq2xS dynamic edge detection:\n\t// simply comparing the center color against its surroundings will give bad results in many cases,\n\t// so, instead, compare the center color relative to the max difference in brightness of this 3x3 block\n\tint brightArray[9];\n\tint maxBright = 0, minBright = 999999;\n\tfor(int j = 0 ; j < 9 ; j++)\n\t{\n\t\tconst int b = (int)((c[j] & 0xF8));\n\t\tconst int g = (int)((c[j] & 0xF800)) >> 8;\n\t\tconst int r = (int)((c[j] & 0xF80000)) >> 16;\n\t\tconst int bright = r+r+r + g+g+g + b+b;\n\t\tif(bright > maxBright) maxBright = bright;\n\t\tif(bright < minBright) minBright = bright;\n\n\t\tbrightArray[j] = bright;\n\t}\n\tint diffBright = ((maxBright - minBright) * 7) >> 4;\n\tif(diffBright > 7)\n\t{\n\t\tconst int centerBright = brightArray[4];\n\t\tif(ABS(brightArray[0] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 0;\n\t\tif(ABS(brightArray[1] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 1;\n\t\tif(ABS(brightArray[2] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 2;\n\t\tif(ABS(brightArray[3] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 3;\n\t\tif(ABS(brightArray[5] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 4;\n\t\tif(ABS(brightArray[6] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 5;\n\t\tif(ABS(brightArray[7] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 6;\n\t\tif(ABS(brightArray[8] - centerBright) > diffBright)\n\t\t\tmask |= 1 << 7;\n\t}\n#define P0 dst0[0]\n#define P1 dst0[1]\n#define P2 dst1[0]\n#define P3 dst1[1]\n#define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right\n#define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right\n#define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left\n#define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left\n#define IC(p0) c[p0]\n#define I11(p0,p1) interp_32_11(c[p0], c[p1])\n#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2])\n#define I31(p0,p1) interp_32_31(c[p0], c[p1])\n#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2])\n#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2])\n#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2])\n#define I53(p0,p1) interp_32_53(c[p0], c[p1])\n#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2])\n#define I71(p0,p1) interp_32_71(c[p0], c[p1])\n#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2])\n#define I97(p0,p1) interp_32_97(c[p0], c[p1])\n#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2])\n#define I151(p0,p1) interp_32_151(c[p0], c[p1])\n\n    switch (mask) {\n#include \"hq2x.h\"\n    }\n\n#undef P0\n#undef P1\n#undef P2\n#undef P3\n#undef MUR\n#undef MDR\n#undef MDL\n#undef MUL\n#undef IC\n#undef I11\n#undef I211\n#undef I31\n#undef I332\n#undef I431\n#undef I521\n#undef I53\n#undef I611\n#undef I71\n#undef I772\n#undef I97\n#undef I1411\n#undef I151\n\n    src0 += 1;\n    src1 += 1;\n    src2 += 1;\n    dst0 += 2;\n    dst1 += 2;\n  }\n}\n//\n//void hq2x(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n//          u8 *dstPtr, u32 dstPitch, int width, int height)\n//{\n//  u16 *dst0 = (u16 *)dstPtr;\n//  u16 *dst1 = dst0 + (dstPitch >> 1);\n//\n//  u16 *src0 = (u16 *)srcPtr;\n//  u16 *src1 = src0 + (srcPitch >> 1);\n//  u16 *src2 = src1 + (srcPitch >> 1);\n//\n//  hq2x_16_def(dst0, dst1, src0, src0, src1, width);\n//\n//  int count = height;\n//\n//  count -= 2;\n//  while(count) {\n//    dst0 += dstPitch;\n//    dst1 += dstPitch;\n//    hq2x_16_def(dst0, dst1, src0, src1, src2, width);\n//    src0 = src1;\n//    src1 = src2;\n//    src2 += srcPitch >> 1;\n//    --count;\n//  }\n//  dst0 += dstPitch;\n//  dst1 += dstPitch;\n//  hq2x_16_def(dst0, dst1, src0, src1, src1, width);\n//}\n\nvoid hq2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n            u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u32 *dst0 = (u32 *)dstPtr;\n  u32 *dst1 = dst0 + (dstPitch >> 2);\n\n  u32 *src0 = (u32 *)srcPtr;\n  u32 *src1 = src0 + (srcPitch >> 2);\n  u32 *src2 = src1 + (srcPitch >> 2);\n  hq2x_32_def(dst0, dst1, src0, src0, src1, width);\n\n  int count = height;\n\n  count -= 2;\n  while(count) {\n    dst0 += dstPitch >> 1;\n    dst1 += dstPitch >> 1;\n    hq2x_32_def(dst0, dst1, src0, src1, src2, width);\n    src0 = src1;\n    src1 = src2;\n    src2 += srcPitch >> 2;\n    --count;\n  }\n  dst0 += dstPitch >> 1;\n  dst1 += dstPitch >> 1;\n  hq2x_32_def(dst0, dst1, src0, src1, src1, width);\n}\n//\n//void hq2xS(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n//          u8 *dstPtr, u32 dstPitch, int width, int height)\n//{\n//  u16 *dst0 = (u16 *)dstPtr;\n//  u16 *dst1 = dst0 + (dstPitch >> 1);\n//\n//  u16 *src0 = (u16 *)srcPtr;\n//  u16 *src1 = src0 + (srcPitch >> 1);\n//  u16 *src2 = src1 + (srcPitch >> 1);\n//\n//  hq2xS_16_def(dst0, dst1, src0, src0, src1, width);\n//\n//  int count = height;\n//\n//  count -= 2;\n//  while(count) {\n//    dst0 += dstPitch;\n//    dst1 += dstPitch;\n//    hq2xS_16_def(dst0, dst1, src0, src1, src2, width);\n//    src0 = src1;\n//    src1 = src2;\n//    src2 += srcPitch >> 1;\n//    --count;\n//  }\n//  dst0 += dstPitch;\n//  dst1 += dstPitch;\n//  hq2xS_16_def(dst0, dst1, src0, src1, src1, width);\n//}\n\nvoid hq2xS32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\n            u8 *dstPtr, u32 dstPitch, int width, int height)\n{\n  u32 *dst0 = (u32 *)dstPtr;\n  u32 *dst1 = dst0 + (dstPitch >> 2);\n\n  u32 *src0 = (u32 *)srcPtr;\n  u32 *src1 = src0 + (srcPitch >> 2);\n  u32 *src2 = src1 + (srcPitch >> 2);\n  hq2xS_32_def(dst0, dst1, src0, src0, src1, width);\n\n  int count = height;\n\n  count -= 2;\n  while(count) {\n    dst0 += dstPitch >> 1;\n    dst1 += dstPitch >> 1;\n    hq2xS_32_def(dst0, dst1, src0, src1, src2, width);\n    src0 = src1;\n    src1 = src2;\n    src2 += srcPitch >> 2;\n    --count;\n  }\n  dst0 += dstPitch >> 1;\n  dst1 += dstPitch >> 1;\n  hq2xS_32_def(dst0, dst1, src0, src1, src1, width);\n}\n\n//void hq2x_init(unsigned bits_per_pixel)\n//{\n//  interp_set(bits_per_pixel);\n//}\n\nvoid RenderHQ2X (SSurface Src, SSurface Dst)\n{\n\n    unsigned char *lpSrc, *lpDst;\n\n    lpSrc = Src.Surface;\n    lpDst = Dst.Surface;\n\n    hq2x32 (lpSrc, Src.Pitch*2,\n                lpSrc,\n                lpDst, Dst.Pitch*2 , Src.Width, Src.Height);\n}\n\nvoid RenderHQ2XS (SSurface Src, SSurface Dst)\n{\n\n    unsigned char *lpSrc, *lpDst;\n\n    lpSrc = Src.Surface;\n    lpDst = Dst.Surface;\n\n    hq2xS32 (lpSrc, Src.Pitch*2,\n                lpSrc,\n                lpDst, Dst.Pitch*2 , Src.Width, Src.Height);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/hq2x.h",
    "content": "case 0 : \ncase 1 : \ncase 4 : \ncase 5 : \ncase 32 : \ncase 33 : \ncase 36 : \ncase 37 : \ncase 128 : \ncase 129 : \ncase 132 : \ncase 133 : \ncase 160 : \ncase 161 : \ncase 164 : \ncase 165 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I211(4, 1, 5);\n  P2 = I211(4, 3, 7);\n  P3 = I211(4, 5, 7);\n} break;\ncase 2 : \ncase 34 : \ncase 130 : \ncase 162 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I211(4, 3, 7);\n  P3 = I211(4, 5, 7);\n} break;\ncase 3 : \ncase 35 : \ncase 131 : \ncase 163 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 2);\n  P2 = I211(4, 3, 7);\n  P3 = I211(4, 5, 7);\n} break;\ncase 6 : \ncase 38 : \ncase 134 : \ncase 166 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 5);\n  P2 = I211(4, 3, 7);\n  P3 = I211(4, 5, 7);\n} break;\ncase 7 : \ncase 39 : \ncase 135 : \ncase 167 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 5);\n  P2 = I211(4, 3, 7);\n  P3 = I211(4, 5, 7);\n} break;\ncase 8 : \ncase 12 : \ncase 136 : \ncase 140 : \n{\n  P0 = I31(4, 0);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 6);\n  P3 = I211(4, 5, 7);\n} break;\ncase 9 : \ncase 13 : \ncase 137 : \ncase 141 : \n{\n  P0 = I31(4, 1);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 6);\n  P3 = I211(4, 5, 7);\n} break;\ncase 10 : \ncase 138 : \n{\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 11 : \ncase 139 : \n{\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 14 : \ncase 142 : \n{\n  P2 = I31(4, 6);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = I31(4, 0);\n    P1 = I31(4, 5);\n  } else {\n    P0 = I332(1, 3, 4);\n    P1 = I521(4, 1, 5);\n  }\n} break;\ncase 15 : \ncase 143 : \n{\n  P2 = I31(4, 6);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = IC(4);\n    P1 = I31(4, 5);\n  } else {\n    P0 = I332(1, 3, 4);\n    P1 = I521(4, 1, 5);\n  }\n} break;\ncase 16 : \ncase 17 : \ncase 48 : \ncase 49 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 2);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 8);\n} break;\ncase 18 : \ncase 50 : \n{\n  P0 = I31(4, 0);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 19 : \ncase 51 : \n{\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P0 = I31(4, 3);\n    P1 = I31(4, 2);\n  } else {\n    P0 = I521(4, 1, 3);\n    P1 = I332(1, 5, 4);\n  }\n} break;\ncase 20 : \ncase 21 : \ncase 52 : \ncase 53 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 1);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 8);\n} break;\ncase 22 : \ncase 54 : \n{\n  P0 = I31(4, 0);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 23 : \ncase 55 : \n{\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P0 = I31(4, 3);\n    P1 = IC(4);\n  } else {\n    P0 = I521(4, 1, 3);\n    P1 = I332(1, 5, 4);\n  }\n} break;\ncase 24 : \ncase 66 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 25 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 26 : \ncase 31 : \ncase 95 : \n{\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 27 : \ncase 75 : \n{\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 28 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 29 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 1);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 30 : \ncase 86 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 40 : \ncase 44 : \ncase 168 : \ncase 172 : \n{\n  P0 = I31(4, 0);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 7);\n  P3 = I211(4, 5, 7);\n} break;\ncase 41 : \ncase 45 : \ncase 169 : \ncase 173 : \n{\n  P0 = I31(4, 1);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 7);\n  P3 = I211(4, 5, 7);\n} break;\ncase 42 : \ncase 170 : \n{\n  P1 = I31(4, 2);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = I31(4, 0);\n    P2 = I31(4, 7);\n  } else {\n    P0 = I332(1, 3, 4);\n    P2 = I521(4, 3, 7);\n  }\n} break;\ncase 43 : \ncase 171 : \n{\n  P1 = I31(4, 2);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = IC(4);\n    P2 = I31(4, 7);\n  } else {\n    P0 = I332(1, 3, 4);\n    P2 = I521(4, 3, 7);\n  }\n} break;\ncase 46 : \ncase 174 : \n{\n  P1 = I31(4, 5);\n  P2 = I31(4, 7);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n} break;\ncase 47 : \ncase 175 : \n{\n  P1 = I31(4, 5);\n  P2 = I31(4, 7);\n  P3 = I211(4, 5, 7);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I1411(4, 1, 3);\n  }\n} break;\ncase 56 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n} break;\ncase 57 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n} break;\ncase 58 : \n{\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 59 : \n{\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 60 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n} break;\ncase 61 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 1);\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n} break;\ncase 62 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 63 : \n{\n  P2 = I31(4, 7);\n  P3 = I31(4, 8);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I1411(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 64 : \ncase 65 : \ncase 68 : \ncase 69 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 67 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 70 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 5);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 71 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 5);\n  P2 = I31(4, 6);\n  P3 = I31(4, 8);\n} break;\ncase 72 : \ncase 76 : \n{\n  P0 = I31(4, 0);\n  P1 = I211(4, 1, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n} break;\ncase 73 : \ncase 77 : \n{\n  P1 = I211(4, 1, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P0 = I31(4, 1);\n    P2 = I31(4, 6);\n  } else {\n    P0 = I521(4, 3, 1);\n    P2 = I332(3, 7, 4);\n  }\n} break;\ncase 74 : \ncase 107 : \ncase 123 : \n{\n  P1 = I31(4, 2);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 78 : \n{\n  P1 = I31(4, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n} break;\ncase 79 : \n{\n  P1 = I31(4, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 80 : \ncase 81 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 82 : \ncase 214 : \ncase 222 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 83 : \n{\n  P0 = I31(4, 3);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 84 : \ncase 85 : \n{\n  P0 = I211(4, 1, 3);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P1 = I31(4, 1);\n    P3 = I31(4, 8);\n  } else {\n    P1 = I521(4, 5, 1);\n    P3 = I332(5, 7, 4);\n  }\n} break;\ncase 87 : \n{\n  P0 = I31(4, 3);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 88 : \ncase 248 : \ncase 250 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 89 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n} break;\ncase 90 : \n{\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 91 : \n{\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 92 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n} break;\ncase 93 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 1);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n} break;\ncase 94 : \n{\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 96 : \ncase 97 : \ncase 100 : \ncase 101 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 3);\n  P3 = I31(4, 8);\n} break;\ncase 98 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 3);\n  P3 = I31(4, 8);\n} break;\ncase 99 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 2);\n  P2 = I31(4, 3);\n  P3 = I31(4, 8);\n} break;\ncase 102 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 5);\n  P2 = I31(4, 3);\n  P3 = I31(4, 8);\n} break;\ncase 103 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 5);\n  P2 = I31(4, 3);\n  P3 = I31(4, 8);\n} break;\ncase 104 : \ncase 108 : \n{\n  P0 = I31(4, 0);\n  P1 = I211(4, 1, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n} break;\ncase 105 : \ncase 109 : \n{\n  P1 = I211(4, 1, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P0 = I31(4, 1);\n    P2 = IC(4);\n  } else {\n    P0 = I521(4, 3, 1);\n    P2 = I332(3, 7, 4);\n  }\n} break;\ncase 106 : \ncase 120 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n} break;\ncase 110 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n} break;\ncase 111 : \n{\n  P1 = I31(4, 5);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I1411(4, 1, 3);\n  }\n} break;\ncase 112 : \ncase 113 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 2);\n  if (MDR) {\n    P2 = I31(4, 3);\n    P3 = I31(4, 8);\n  } else {\n    P2 = I521(4, 7, 3);\n    P3 = I332(5, 7, 4);\n  }\n} break;\ncase 114 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 3);\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 115 : \n{\n  P0 = I31(4, 3);\n  P2 = I31(4, 3);\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 116 : \ncase 117 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 1);\n  P2 = I31(4, 3);\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n} break;\ncase 118 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 3);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 119 : \n{\n  P2 = I31(4, 3);\n  P3 = I31(4, 8);\n  if (MUR) {\n    P0 = I31(4, 3);\n    P1 = IC(4);\n  } else {\n    P0 = I521(4, 1, 3);\n    P1 = I332(1, 5, 4);\n  }\n} break;\ncase 121 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n} break;\ncase 122 : \n{\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = I31(4, 8);\n  } else {\n    P3 = I611(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 124 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n} break;\ncase 125 : \n{\n  P1 = I31(4, 1);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P0 = I31(4, 1);\n    P2 = IC(4);\n  } else {\n    P0 = I521(4, 3, 1);\n    P2 = I332(3, 7, 4);\n  }\n} break;\ncase 126 : \n{\n  P0 = I31(4, 0);\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 127 : \n{\n  P3 = I31(4, 8);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I1411(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 144 : \ncase 145 : \ncase 176 : \ncase 177 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 2);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 7);\n} break;\ncase 146 : \ncase 178 : \n{\n  P0 = I31(4, 0);\n  P2 = I211(4, 3, 7);\n  if (MUR) {\n    P1 = I31(4, 2);\n    P3 = I31(4, 7);\n  } else {\n    P1 = I332(1, 5, 4);\n    P3 = I521(4, 5, 7);\n  }\n} break;\ncase 147 : \ncase 179 : \n{\n  P0 = I31(4, 3);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 7);\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 148 : \ncase 149 : \ncase 180 : \ncase 181 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 1);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 7);\n} break;\ncase 150 : \ncase 182 : \n{\n  P0 = I31(4, 0);\n  P2 = I211(4, 3, 7);\n  if (MUR) {\n    P1 = IC(4);\n    P3 = I31(4, 7);\n  } else {\n    P1 = I332(1, 5, 4);\n    P3 = I521(4, 5, 7);\n  }\n} break;\ncase 151 : \ncase 183 : \n{\n  P0 = I31(4, 3);\n  P2 = I211(4, 3, 7);\n  P3 = I31(4, 7);\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I1411(4, 1, 5);\n  }\n} break;\ncase 152 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n} break;\ncase 153 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n} break;\ncase 154 : \n{\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 155 : \n{\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 156 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n} break;\ncase 157 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 1);\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n} break;\ncase 158 : \n{\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 159 : \n{\n  P2 = I31(4, 6);\n  P3 = I31(4, 7);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I1411(4, 1, 5);\n  }\n} break;\ncase 184 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 7);\n  P3 = I31(4, 7);\n} break;\ncase 185 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  P2 = I31(4, 7);\n  P3 = I31(4, 7);\n} break;\ncase 186 : \n{\n  P2 = I31(4, 7);\n  P3 = I31(4, 7);\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 187 : \n{\n  P1 = I31(4, 2);\n  P3 = I31(4, 7);\n  if (MUL) {\n    P0 = IC(4);\n    P2 = I31(4, 7);\n  } else {\n    P0 = I332(1, 3, 4);\n    P2 = I521(4, 3, 7);\n  }\n} break;\ncase 188 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  P2 = I31(4, 7);\n  P3 = I31(4, 7);\n} break;\ncase 189 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 1);\n  P2 = I31(4, 7);\n  P3 = I31(4, 7);\n} break;\ncase 190 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 7);\n  if (MUR) {\n    P1 = IC(4);\n    P3 = I31(4, 7);\n  } else {\n    P1 = I332(1, 5, 4);\n    P3 = I521(4, 5, 7);\n  }\n} break;\ncase 191 : \n{\n  P2 = I31(4, 7);\n  P3 = I31(4, 7);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I1411(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I1411(4, 1, 5);\n  }\n} break;\ncase 192 : \ncase 193 : \ncase 196 : \ncase 197 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 6);\n  P3 = I31(4, 5);\n} break;\ncase 194 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 5);\n} break;\ncase 195 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 5);\n} break;\ncase 198 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 5);\n  P2 = I31(4, 6);\n  P3 = I31(4, 5);\n} break;\ncase 199 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 5);\n  P2 = I31(4, 6);\n  P3 = I31(4, 5);\n} break;\ncase 200 : \ncase 204 : \n{\n  P0 = I31(4, 0);\n  P1 = I211(4, 1, 5);\n  if (MDL) {\n    P2 = I31(4, 6);\n    P3 = I31(4, 5);\n  } else {\n    P2 = I332(3, 7, 4);\n    P3 = I521(4, 7, 5);\n  }\n} break;\ncase 201 : \ncase 205 : \n{\n  P0 = I31(4, 1);\n  P1 = I211(4, 1, 5);\n  P3 = I31(4, 5);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n} break;\ncase 202 : \n{\n  P1 = I31(4, 2);\n  P3 = I31(4, 5);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n} break;\ncase 203 : \n{\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  P3 = I31(4, 5);\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 206 : \n{\n  P1 = I31(4, 5);\n  P3 = I31(4, 5);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n} break;\ncase 207 : \n{\n  P2 = I31(4, 6);\n  P3 = I31(4, 5);\n  if (MUL) {\n    P0 = IC(4);\n    P1 = I31(4, 5);\n  } else {\n    P0 = I332(1, 3, 4);\n    P1 = I521(4, 1, 5);\n  }\n} break;\ncase 208 : \ncase 209 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 210 : \ncase 216 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 211 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 212 : \ncase 213 : \n{\n  P0 = I211(4, 1, 3);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P1 = I31(4, 1);\n    P3 = IC(4);\n  } else {\n    P1 = I521(4, 5, 1);\n    P3 = I332(5, 7, 4);\n  }\n} break;\ncase 215 : \n{\n  P0 = I31(4, 3);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I1411(4, 1, 5);\n  }\n} break;\ncase 217 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 218 : \n{\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 219 : \n{\n  P1 = I31(4, 2);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 220 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  if (MDL) {\n    P2 = I31(4, 6);\n  } else {\n    P2 = I611(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 221 : \n{\n  P0 = I31(4, 1);\n  P2 = I31(4, 6);\n  if (MDR) {\n    P1 = I31(4, 1);\n    P3 = IC(4);\n  } else {\n    P1 = I521(4, 5, 1);\n    P3 = I332(5, 7, 4);\n  }\n} break;\ncase 223 : \n{\n  P2 = I31(4, 6);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I1411(4, 1, 5);\n  }\n} break;\ncase 224 : \ncase 225 : \ncase 228 : \ncase 229 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I211(4, 1, 5);\n  P2 = I31(4, 3);\n  P3 = I31(4, 5);\n} break;\ncase 226 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 2);\n  P2 = I31(4, 3);\n  P3 = I31(4, 5);\n} break;\ncase 227 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 2);\n  P2 = I31(4, 3);\n  P3 = I31(4, 5);\n} break;\ncase 230 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 5);\n  P2 = I31(4, 3);\n  P3 = I31(4, 5);\n} break;\ncase 231 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 5);\n  P2 = I31(4, 3);\n  P3 = I31(4, 5);\n} break;\ncase 232 : \ncase 236 : \n{\n  P0 = I31(4, 0);\n  P1 = I211(4, 1, 5);\n  if (MDL) {\n    P2 = IC(4);\n    P3 = I31(4, 5);\n  } else {\n    P2 = I332(3, 7, 4);\n    P3 = I521(4, 7, 5);\n  }\n} break;\ncase 233 : \ncase 237 : \n{\n  P0 = I31(4, 1);\n  P1 = I211(4, 1, 5);\n  P3 = I31(4, 5);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I1411(4, 3, 7);\n  }\n} break;\ncase 234 : \n{\n  P1 = I31(4, 2);\n  P3 = I31(4, 5);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = I31(4, 0);\n  } else {\n    P0 = I611(4, 1, 3);\n  }\n} break;\ncase 235 : \n{\n  P1 = I31(4, 2);\n  P3 = I31(4, 5);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I1411(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 238 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 5);\n  if (MDL) {\n    P2 = IC(4);\n    P3 = I31(4, 5);\n  } else {\n    P2 = I332(3, 7, 4);\n    P3 = I521(4, 7, 5);\n  }\n} break;\ncase 239 : \n{\n  P1 = I31(4, 5);\n  P3 = I31(4, 5);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I1411(4, 3, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I1411(4, 1, 3);\n  }\n} break;\ncase 240 : \ncase 241 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 2);\n  if (MDR) {\n    P2 = I31(4, 3);\n    P3 = IC(4);\n  } else {\n    P2 = I521(4, 7, 3);\n    P3 = I332(5, 7, 4);\n  }\n} break;\ncase 242 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 3);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = I31(4, 2);\n  } else {\n    P1 = I611(4, 1, 5);\n  }\n} break;\ncase 243 : \n{\n  P0 = I31(4, 3);\n  P1 = I31(4, 2);\n  if (MDR) {\n    P2 = I31(4, 3);\n    P3 = IC(4);\n  } else {\n    P2 = I521(4, 7, 3);\n    P3 = I332(5, 7, 4);\n  }\n} break;\ncase 244 : \ncase 245 : \n{\n  P0 = I211(4, 1, 3);\n  P1 = I31(4, 1);\n  P2 = I31(4, 3);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I1411(4, 5, 7);\n  }\n} break;\ncase 246 : \n{\n  P0 = I31(4, 0);\n  P2 = I31(4, 3);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I1411(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 247 : \n{\n  P0 = I31(4, 3);\n  P2 = I31(4, 3);\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I1411(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I1411(4, 1, 5);\n  }\n} break;\ncase 249 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 2);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I1411(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n} break;\ncase 251 : \n{\n  P1 = I31(4, 2);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I1411(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I211(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I211(4, 1, 3);\n  }\n} break;\ncase 252 : \n{\n  P0 = I31(4, 0);\n  P1 = I31(4, 1);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I1411(4, 5, 7);\n  }\n} break;\ncase 253 : \n{\n  P0 = I31(4, 1);\n  P1 = I31(4, 1);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I1411(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I1411(4, 5, 7);\n  }\n} break;\ncase 254 : \n{\n  P0 = I31(4, 0);\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I211(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I1411(4, 5, 7);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I211(4, 1, 5);\n  }\n} break;\ncase 255 : \n{\n  if (MDL) {\n    P2 = IC(4);\n  } else {\n    P2 = I1411(4, 3, 7);\n  }\n  if (MDR) {\n    P3 = IC(4);\n  } else {\n    P3 = I1411(4, 5, 7);\n  }\n  if (MUL) {\n    P0 = IC(4);\n  } else {\n    P0 = I1411(4, 1, 3);\n  }\n  if (MUR) {\n    P1 = IC(4);\n  } else {\n    P1 = I1411(4, 1, 5);\n  }\n} break;\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/hq4x.cpp",
    "content": "/*\n * This file is part of the Advance project.\n *\n * Copyright (C) 2003, 2008 Andrea Mazzoleni\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n *\n * In addition, as a special exception, Andrea Mazzoleni\n * gives permission to link the code of this program with\n * the MAME library (or with modified versions of MAME that use the\n * same license as MAME), and distribute linked combinations including\n * the two.  You must obey the GNU General Public License in all\n * respects for all of the code used other than MAME.  If you modify\n * this file, you may extend this exception to your version of the\n * file, but you are not obligated to do so.  If you do not wish to\n * do so, delete this exception statement from your version.\n */\n\n#include \"filter.h\"\n#include \"interp.h\"\n\n/***************************************************************************/\n/* HQ4x C implementation */\n\n/*\n * This effect is a rewritten implementation of the hq4x effect made by Maxim Stepin\n */\n\n\nvoid hq4x_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, const u32* src0, const u32* src1, const u32* src2, unsigned count, unsigned flag)\n{\n\tunsigned i;\n\n\tfor(i=0;i<count;++i) {\n\t\tunsigned char mask;\n\n\t\tu32 c[9];\n\n\t\tc[1] = src0[0];\n\t\tc[4] = src1[0];\n\t\tc[7] = src2[0];\n\n\t\tc[0] = src0[-1];\n\t\tc[3] = src1[-1];\n\t\tc[6] = src2[-1];\n\n\t\tc[2] = src0[1];\n\t\tc[5] = src1[1];\n\t\tc[8] = src2[1];\n\n\t\tmask = 0;\n\n\t\tif (interp_32_diff(c[0], c[4]))\n\t\t\tmask |= 1 << 0;\n\t\tif (interp_32_diff(c[1], c[4]))\n\t\t\tmask |= 1 << 1;\n\t\tif (interp_32_diff(c[2], c[4]))\n\t\t\tmask |= 1 << 2;\n\t\tif (interp_32_diff(c[3], c[4]))\n\t\t\tmask |= 1 << 3;\n\t\tif (interp_32_diff(c[5], c[4]))\n\t\t\tmask |= 1 << 4;\n\t\tif (interp_32_diff(c[6], c[4]))\n\t\t\tmask |= 1 << 5;\n\t\tif (interp_32_diff(c[7], c[4]))\n\t\t\tmask |= 1 << 6;\n\t\tif (interp_32_diff(c[8], c[4]))\n\t\t\tmask |= 1 << 7;\n\n#define P(a, b) dst##b[a]\n#define MUR interp_32_diff(c[1], c[5])\n#define MDR interp_32_diff(c[5], c[7])\n#define MDL interp_32_diff(c[7], c[3])\n#define MUL interp_32_diff(c[3], c[1])\n#define I1(p0) c[p0]\n#define I2(i0, i1, p0, p1) interp_32_##i0##i1(c[p0], c[p1])\n#define I3(i0, i1, i2, p0, p1, p2) interp_32_##i0##i1##i2(c[p0], c[p1], c[p2])\n\n\t\tswitch (mask) {\n\t\t#include \"hq4x.dat\"\n\t\t}\n\n#undef P\n#undef MUR\n#undef MDR\n#undef MDL\n#undef MUL\n#undef I1\n#undef I2\n#undef I3\n\n\t\tsrc0 += 1;\n\t\tsrc1 += 1;\n\t\tsrc2 += 1;\n\t\tdst0 += 4;\n\t\tdst1 += 4;\n\t\tdst2 += 4;\n\t\tdst3 += 4;\n\t}\n}\n\n\nvoid RenderHQ4X (SSurface Src, SSurface Dst)\n{\n\n    u32 *lpSrc, *lpDst;\n\n    lpSrc = (u32*)Src.Surface;\n    lpDst = (u32*)Dst.Surface;\n\n    int dp = Dst.Pitch/2;\n    int sp = Src.Pitch/2;\n    for(int i=0;i<Src.Height;i++)\n    {\n      hq4x_32_def(lpDst,lpDst+dp,lpDst+dp*2,lpDst+dp*3,lpSrc,lpSrc+sp,lpSrc+sp*2,Src.Width,0);\n      lpDst += Dst.Pitch*2;\n      lpSrc += Src.Pitch/2;\n    }\n\n    //hq4x_32_def (lpSrc, Src.Pitch*2,\n    //            lpSrc,\n    //            lpDst, Dst.Pitch*2 , Src.Width, Src.Height);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/hq4x.h",
    "content": "/*\n * This file is part of the Advance project.\n *\n * Copyright (C) 2003, 2004, 2008 Andrea Mazzoleni\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n *\n * In addition, as a special exception, Andrea Mazzoleni\n * gives permission to link the code of this program with\n * the MAME library (or with modified versions of MAME that use the\n * same license as MAME), and distribute linked combinations including\n * the two.  You must obey the GNU General Public License in all\n * respects for all of the code used other than MAME.  If you modify\n * this file, you may extend this exception to your version of the\n * file, but you are not obligated to do so.  If you do not wish to\n * do so, delete this exception statement from your version.\n */\n\n#ifndef __HQ4X_H\n#define __HQ4X_H\n\n#include \"segment.h\"\n\nvoid hq4x_16_def(interp_uint16* dst0, interp_uint16* dst1, interp_uint16* dst2, interp_uint16* dst3, const interp_uint16* src0, const interp_uint16* src1, const interp_uint16* src2, unsigned count, unsigned flag);\nvoid hq4x_32_def(interp_uint32* dst0, interp_uint32* dst1, interp_uint32* dst2, interp_uint32* dst3, const interp_uint32* src0, const interp_uint32* src1, const interp_uint32* src2, unsigned count, unsigned flag);\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/interp.h",
    "content": "/*\n * This file is part of the Advance project.\n *\n * Copyright (C) 2003 Andrea Mazzoleni\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n *\n * In addition, as a special exception, Andrea Mazzoleni\n * gives permission to link the code of this program with\n * the MAME library (or with modified versions of MAME that use the\n * same license as MAME), and distribute linked combinations including\n * the two.  You must obey the GNU General Public License in all\n * respects for all of the code used other than MAME.  If you modify\n * this file, you may extend this exception to your version of the\n * file, but you are not obligated to do so.  If you do not wish to\n * do so, delete this exception statement from your version.\n */\n\n#ifndef __INTERP_H\n#define __INTERP_H\n\n#include \"types.h\"\n\n/***************************************************************************/\n/* Basic types */\n\n/***************************************************************************/\n/* interpolation */\n\n//extern unsigned interp_mask[2];\n//extern unsigned interp_bits_per_pixel;\n//\n//#define INTERP_16_MASK_1(v) (v & interp_mask[0])\n//#define INTERP_16_MASK_2(v) (v & interp_mask[1])\n//\n//static inline u16 interp_16_521(u16 p1, u16 p2, u16 p3)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*2 + INTERP_16_MASK_1(p3)*1) / 8)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*2 + INTERP_16_MASK_2(p3)*1) / 8);\n//}\n//\n//static inline u16 interp_16_332(u16 p1, u16 p2, u16 p3)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)*2) / 8)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)*2) / 8);\n//}\n//\n//static inline u16 interp_16_611(u16 p1, u16 p2, u16 p3)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*6 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 8)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*6 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 8);\n//}\n//\n//static inline u16 interp_16_71(u16 p1, u16 p2)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*7 + INTERP_16_MASK_1(p2)) / 8)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*7 + INTERP_16_MASK_2(p2)) / 8);\n//}\n//\n//static inline u16 interp_16_211(u16 p1, u16 p2, u16 p3)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*2 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 4)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*2 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 4);\n//}\n//\n//static inline u16 interp_16_772(u16 p1, u16 p2, u16 p3)\n//{\n//  return INTERP_16_MASK_1(((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2))*7 + INTERP_16_MASK_1(p3)*2) / 16)\n//    | INTERP_16_MASK_2(((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2))*7 + INTERP_16_MASK_2(p3)*2) / 16);\n//}\n//\n//static inline u16 interp_16_11(u16 p1, u16 p2)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2)) / 2)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2)) / 2);\n//}\n//\n//static inline u16 interp_16_31(u16 p1, u16 p2)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)) / 4)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)) / 4);\n//}\n//\n//static inline u16 interp_16_1411(u16 p1, u16 p2, u16 p3)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*14 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 16)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*14 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 16);\n//}\n//\n//static inline u16 interp_16_431(u16 p1, u16 p2, u16 p3)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*4 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)) / 8)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*4 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)) / 8);\n//}\n//\n//static inline u16 interp_16_53(u16 p1, u16 p2)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*3) / 8)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*3) / 8);\n//}\n//\n//static inline u16 interp_16_151(u16 p1, u16 p2)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*15 + INTERP_16_MASK_1(p2)) / 16)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*15 + INTERP_16_MASK_2(p2)) / 16);\n//}\n//\n//static inline u16 interp_16_97(u16 p1, u16 p2)\n//{\n//  return INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*9 + INTERP_16_MASK_1(p2)*7) / 16)\n//    | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*9 + INTERP_16_MASK_2(p2)*7) / 16);\n//}\n\n#define INTERP_32_MASK_1(v) (v & 0xFF00FF)\n#define INTERP_32_MASK_2(v) (v & 0x00FF00)\n\nstatic inline u32 interp_32_521(u32 p1, u32 p2, u32 p3)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*2 + INTERP_32_MASK_1(p3)*1) / 8)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*2 + INTERP_32_MASK_2(p3)*1) / 8);\n}\n\nstatic inline u32 interp_32_332(u32 p1, u32 p2, u32 p3)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)*2) / 8)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)*2) / 8);\n}\n\nstatic inline u32 interp_32_211(u32 p1, u32 p2, u32 p3)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*2 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 4)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*2 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 4);\n}\n\nstatic inline u32 interp_32_611(u32 p1, u32 p2, u32 p3)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*6 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 8)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*6 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 8);\n}\n\nstatic inline u32 interp_32_71(u32 p1, u32 p2)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*7 + INTERP_32_MASK_1(p2)) / 8)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*7 + INTERP_32_MASK_2(p2)) / 8);\n}\n\nstatic inline u32 interp_32_772(u32 p1, u32 p2, u32 p3)\n{\n  return INTERP_32_MASK_1(((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2))*7 + INTERP_32_MASK_1(p3)*2) / 16)\n    | INTERP_32_MASK_2(((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2))*7 + INTERP_32_MASK_2(p3)*2) / 16);\n}\n\nstatic inline u32 interp_32_11(u32 p1, u32 p2)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2)) / 2)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2)) / 2);\n}\n\nstatic inline u32 interp_32_31(u32 p1, u32 p2)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)) / 4)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)) / 4);\n}\n\nstatic inline u32 interp_32_1411(u32 p1, u32 p2, u32 p3)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*14 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 16)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*14 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 16);\n}\n\nstatic inline u32 interp_32_431(u32 p1, u32 p2, u32 p3)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*4 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)) / 8)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*4 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)) / 8);\n}\n\nstatic inline u32 interp_32_53(u32 p1, u32 p2)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*3) / 8)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*3) / 8);\n}\n\nstatic inline u32 interp_32_151(u32 p1, u32 p2)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*15 + INTERP_32_MASK_1(p2)) / 16)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*15 + INTERP_32_MASK_2(p2)) / 16);\n}\n\nstatic inline u32 interp_32_97(u32 p1, u32 p2)\n{\n  return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*9 + INTERP_32_MASK_1(p2)*7) / 16)\n    | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*9 + INTERP_32_MASK_2(p2)*7) / 16);\n}\n\n/***************************************************************************/\n/* diff */\n\n#define INTERP_Y_LIMIT (0x30*4)\n#define INTERP_U_LIMIT (0x07*4)\n#define INTERP_V_LIMIT (0x06*8)\n//\n//static int interp_16_diff(u16 p1, u16 p2)\n//{\n//  int r, g, b;\n//  int y, u, v;\n//\n//  if (p1 == p2)\n//    return 0;\n//\n//  if (interp_bits_per_pixel == 16) {\n//    b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;\n//    g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3;\n//    r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8;\n//  } else {\n//    b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;\n//    g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2;\n//    r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7;\n//  }\n//\n//  y = r + g + b;\n//  u = r - b;\n//  v = -r + 2*g - b;\n//\n//  if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT)\n//    return 1;\n//\n//  if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT)\n//    return 1;\n//\n//  if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT)\n//    return 1;\n//\n//return 0;\n//}\n\nstatic int interp_32_diff(u32 p1, u32 p2)\n{\n  int r, g, b;\n  int y, u, v;\n\n  if ((p1 & 0xF8F8F8) == (p2 & 0xF8F8F8))\n    return 0;\n\n  b = (int)((p1 & 0xFF) - (p2 & 0xFF));\n  g = (int)((p1 & 0xFF00) - (p2 & 0xFF00)) >> 8;\n  r = (int)((p1 & 0xFF0000) - (p2 & 0xFF0000)) >> 16;\n\n  y = r + g + b;\n  u = r - b;\n  v = -r + 2*g - b;\n\n  if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT)\n    return 1;\n\n  if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT)\n    return 1;\n\n  if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT)\n    return 1;\n\n  return 0;\n}\n\n\n#define INTERP_LIMIT2 (96000)\n//#define ABS(x) ((x) < 0 ? -(x) : (x))\nstatic FORCEINLINE u32 ABS(s32 x) { return (x+(x>>31))^(x>>31); } // faster\n#define MAX(x,y) ((x) > (y) ? (x) : (y))\n#define MIN(x,y) ((x) < (y) ? (x) : (y))\n//\n//static int interp_16_diff2(u16 p1, u16 p2)\n//{\n//  int r, g, b;\n//  int y, u, v;\n//\n//  if ((p1 & 0xF79E) == (p2 & 0xF79E))\n//    return 0;\n//\n//  if (interp_bits_per_pixel == 16) {\n//    b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;\n//    g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3;\n//    r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8;\n//  } else {\n//    b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3;\n//    g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2;\n//    r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7;\n//  }\n//\n////  yb =  30*r + 58*g + 12*b;\n//  y =  33*r + 36*g + 31*b;\n//  u = -14*r - 29*g + 44*b;\n//  v =  62*r - 51*g - 10*b;\n//\n//  if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2)\n//    return 1;\n//  return 0;\n//}\n\nstatic int interp_32_diff2(u32 p1, u32 p2)\n{\n  int r, g, b;\n  int y, u, v;\n\n  if ((p1 & 0xF0F0F0) == (p2 & 0xF0F0F0))\n    return 0;\n\n  b = (int)((p1 & 0xF8) - (p2 & 0xF8));\n  g = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8;\n  r = (int)((p1 & 0xF80000) - (p2 & 0xF80000)) >> 16;\n\n//  y =  30*r + 58*g + 12*b;\n  y =  33*r + 36*g + 31*b;\n  u = -14*r - 29*g + 44*b;\n  v =  62*r - 51*g - 10*b;\n\n  if (11*ABS(y) + 8*ABS(u) + 6*ABS(v) > INTERP_LIMIT2)\n    return 1;\n\n  return 0;\n}\n//\n//static void interp_set(unsigned bits_per_pixel)\n//{\n//  interp_bits_per_pixel = bits_per_pixel;\n//\n//  switch (bits_per_pixel) {\n//  case 15 :\n//    interp_mask[0] = 0x7C1F;\n//    interp_mask[1] = 0x03E0;\n//    break;\n//  case 16 :\n//    interp_mask[0] = 0xF81F;\n//    interp_mask[1] = 0x07E0;\n//    break;\n//  case 32 :\n//    interp_mask[0] = 0xFF00FF;\n//    interp_mask[1] = 0x00FF00;\n//    break;\n//  }\n//}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/lq2x.cpp",
    "content": "/*\r\n * This file is part of the Advance project.\r\n *\r\n * Copyright (C) 2003 Andrea Mazzoleni\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r\n *\r\n * In addition, as a special exception, Andrea Mazzoleni\r\n * gives permission to link the code of this program with\r\n * the MAME library (or with modified versions of MAME that use the\r\n * same license as MAME), and distribute linked combinations including\r\n * the two.  You must obey the GNU General Public License in all\r\n * respects for all of the code used other than MAME.  If you modify\r\n * this file, you may extend this exception to your version of the\r\n * file, but you are not obligated to do so.  If you do not wish to\r\n * do so, delete this exception statement from your version.\r\n */\r\n\r\n#include \"filter.h\"\r\n#include \"interp.h\"\r\n\r\n//static void lq2x_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count)\r\n//{\r\n//\tunsigned i;\r\n//\r\n//\tfor(i=0;i<count;++i) {\r\n//\t\tunsigned char mask;\r\n//\r\n//\t\tu16 c[9];\r\n//\r\n//\t\tc[1] = src0[0];\r\n//\t\tc[4] = src1[0];\r\n//\t\tc[7] = src2[0];\r\n//\r\n//\t\tif (i>0) {\r\n//\t\t\tc[0] = src0[-1];\r\n//\t\t\tc[3] = src1[-1];\r\n//\t\t\tc[6] = src2[-1];\r\n//\t\t} else {\r\n//\t\t\tc[0] = c[1];\r\n//\t\t\tc[3] = c[4];\r\n//\t\t\tc[6] = c[7];\r\n//\t\t}\r\n//\r\n//\t\tif (i<count-1) {\r\n//\t\t\tc[2] = src0[1];\r\n//\t\t\tc[5] = src1[1];\r\n//\t\t\tc[8] = src2[1];\r\n//\t\t} else {\r\n//\t\t\tc[2] = c[1];\r\n//\t\t\tc[5] = c[4];\r\n//\t\t\tc[8] = c[7];\r\n//\t\t}\r\n//\r\n//\t\tmask = 0;\r\n//\r\n//\t\tif (c[0] != c[4])\r\n//\t\t\tmask |= 1 << 0;\r\n//\t\tif (c[1] != c[4])\r\n//\t\t\tmask |= 1 << 1;\r\n//\t\tif (c[2] != c[4])\r\n//\t\t\tmask |= 1 << 2;\r\n//\t\tif (c[3] != c[4])\r\n//\t\t\tmask |= 1 << 3;\r\n//\t\tif (c[5] != c[4])\r\n//\t\t\tmask |= 1 << 4;\r\n//\t\tif (c[6] != c[4])\r\n//\t\t\tmask |= 1 << 5;\r\n//\t\tif (c[7] != c[4])\r\n//\t\t\tmask |= 1 << 6;\r\n//\t\tif (c[8] != c[4])\r\n//\t\t\tmask |= 1 << 7;\r\n//\r\n//#define P0 dst0[0]\r\n//#define P1 dst0[1]\r\n//#define P2 dst1[0]\r\n//#define P3 dst1[1]\r\n//#define MUR (c[1] != c[5])\r\n//#define MDR (c[5] != c[7])\r\n//#define MDL (c[7] != c[3])\r\n//#define MUL (c[3] != c[1])\r\n//#define IC(p0) c[p0]\r\n//#define I11(p0,p1) interp_16_11(c[p0], c[p1])\r\n//#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2])\r\n//#define I31(p0,p1) interp_16_31(c[p0], c[p1])\r\n//#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2])\r\n//#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2])\r\n//#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2])\r\n//#define I53(p0,p1) interp_16_53(c[p0], c[p1])\r\n//#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2])\r\n//#define I71(p0,p1) interp_16_71(c[p0], c[p1])\r\n//#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2])\r\n//#define I97(p0,p1) interp_16_97(c[p0], c[p1])\r\n//#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2])\r\n//#define I151(p0,p1) interp_16_151(c[p0], c[p1])\r\n//\r\n//\t\tswitch (mask) {\r\n//#include \"lq2x.h\"\r\n//\t\t}\r\n//\r\n//#undef P0\r\n//#undef P1\r\n//#undef P2\r\n//#undef P3\r\n//#undef MUR\r\n//#undef MDR\r\n//#undef MDL\r\n//#undef MUL\r\n//#undef IC\r\n//#undef I11\r\n//#undef I211\r\n//#undef I31\r\n//#undef I332\r\n//#undef I431\r\n//#undef I521\r\n//#undef I53\r\n//#undef I611\r\n//#undef I71\r\n//#undef I772\r\n//#undef I97\r\n//#undef I1411\r\n//#undef I151\r\n//\r\n//\t\tsrc0 += 1;\r\n//\t\tsrc1 += 1;\r\n//\t\tsrc2 += 1;\r\n//\t\tdst0 += 2;\r\n//\t\tdst1 += 2;\r\n//\t}\r\n//}\r\n//\r\n//static void lq2xS_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count)\r\n//{\r\n//   unsigned i;\r\n//\r\n//   for(i=0;i<count;++i) {\r\n//      unsigned char mask;\r\n//\r\n//      u16 c[9];\r\n//\r\n//      c[1] = src0[0];\r\n//      c[4] = src1[0];\r\n//      c[7] = src2[0];\r\n//\r\n//      if (i>0) {\r\n//         c[0] = src0[-1];\r\n//         c[3] = src1[-1];\r\n//         c[6] = src2[-1];\r\n//      } else {\r\n//         c[0] = c[1];\r\n//         c[3] = c[4];\r\n//         c[6] = c[7];\r\n//      }\r\n//\r\n//      if (i<count-1) {\r\n//         c[2] = src0[1];\r\n//         c[5] = src1[1];\r\n//         c[8] = src2[1];\r\n//      } else {\r\n//         c[2] = c[1];\r\n//         c[5] = c[4];\r\n//         c[8] = c[7];\r\n//      }\r\n//\r\n//    // lq2xS dynamic edge detection:\r\n//\t// simply comparing the center color against its surroundings will give bad results in many cases,\r\n//\t// so, instead, compare the center color relative to the max difference in brightness of this 3x3 block\r\n//\tint brightArray[9];\r\n//\tint maxBright = 0, minBright = 999999;\r\n//\tfor(int j = 0 ; j < 9 ; j++)\r\n//\t{\r\n//\t\tconst int b = (int)((c[j] & 0xF8));\r\n//\t\tconst int g = (int)((c[j] & 0xF800)) >> 8;\r\n//\t\tconst int r = (int)((c[j] & 0xF80000)) >> 16;\r\n//\t\tconst int bright = r+r+r + g+g+g + b+b;\r\n//\t\tif(bright > maxBright) maxBright = bright;\r\n//\t\tif(bright < minBright) minBright = bright;\r\n//\r\n//\t\tbrightArray[j] = bright;\r\n//\t}\r\n//\tint diffBright = ((maxBright - minBright) * 7) >> 4;\r\n//\tif(diffBright > 7)\r\n//\t{\r\n//\t\tconst int centerBright = brightArray[4];\r\n//\t\tif(ABS(brightArray[0] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 0;\r\n//\t\tif(ABS(brightArray[1] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 1;\r\n//\t\tif(ABS(brightArray[2] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 2;\r\n//\t\tif(ABS(brightArray[3] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 3;\r\n//\t\tif(ABS(brightArray[5] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 4;\r\n//\t\tif(ABS(brightArray[6] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 5;\r\n//\t\tif(ABS(brightArray[7] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 6;\r\n//\t\tif(ABS(brightArray[8] - centerBright) > diffBright)\r\n//\t\t\tmask |= 1 << 7;\r\n//\t}\r\n//\r\n//#define P0 dst0[0]\r\n//#define P1 dst0[1]\r\n//#define P2 dst1[0]\r\n//#define P3 dst1[1]\r\n//#define MUR false\r\n//#define MDR false\r\n//#define MDL false\r\n//#define MUL false\r\n//#define IC(p0) c[p0]\r\n//#define I11(p0,p1) interp_16_11(c[p0], c[p1])\r\n//#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2])\r\n//#define I31(p0,p1) interp_16_31(c[p0], c[p1])\r\n//#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2])\r\n//#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2])\r\n//#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2])\r\n//#define I53(p0,p1) interp_16_53(c[p0], c[p1])\r\n//#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2])\r\n//#define I71(p0,p1) interp_16_71(c[p0], c[p1])\r\n//#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2])\r\n//#define I97(p0,p1) interp_16_97(c[p0], c[p1])\r\n//#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2])\r\n//#define I151(p0,p1) interp_16_151(c[p0], c[p1])\r\n//\r\n//      switch (mask) {\r\n//#include \"lq2x.h\"\r\n//      }\r\n//\r\n//#undef P0\r\n//#undef P1\r\n//#undef P2\r\n//#undef P3\r\n//#undef MUR\r\n//#undef MDR\r\n//#undef MDL\r\n//#undef MUL\r\n//#undef IC\r\n//#undef I11\r\n//#undef I211\r\n//#undef I31\r\n//#undef I332\r\n//#undef I431\r\n//#undef I521\r\n//#undef I53\r\n//#undef I611\r\n//#undef I71\r\n//#undef I772\r\n//#undef I97\r\n//#undef I1411\r\n//#undef I151\r\n//\r\n//      src0 += 1;\r\n//      src1 += 1;\r\n//      src2 += 1;\r\n//      dst0 += 2;\r\n//      dst1 += 2;\r\n//   }\r\n//}\r\n\r\nstatic void lq2x_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count)\r\n{\r\n\tunsigned i;\r\n\r\n\tfor(i=0;i<count;++i) {\r\n\t\tunsigned char mask;\r\n\r\n\t\tu32 c[9];\r\n\r\n\t\tc[1] = src0[0];\r\n\t\tc[4] = src1[0];\r\n\t\tc[7] = src2[0];\r\n\r\n\t\tif (i>0) {\r\n\t\t\tc[0] = src0[-1];\r\n\t\t\tc[3] = src1[-1];\r\n\t\t\tc[6] = src2[-1];\r\n\t\t} else {\r\n\t\t\tc[0] = c[1];\r\n\t\t\tc[3] = c[4];\r\n\t\t\tc[6] = c[7];\r\n\t\t}\r\n\r\n\t\tif (i<count-1) {\r\n\t\t\tc[2] = src0[1];\r\n\t\t\tc[5] = src1[1];\r\n\t\t\tc[8] = src2[1];\r\n\t\t} else {\r\n\t\t\tc[2] = c[1];\r\n\t\t\tc[5] = c[4];\r\n\t\t\tc[8] = c[7];\r\n\t\t}\r\n\r\n\t\tmask = 0;\r\n\r\n\t\tif (c[0] != c[4])\r\n\t\t\tmask |= 1 << 0;\r\n\t\tif (c[1] != c[4])\r\n\t\t\tmask |= 1 << 1;\r\n\t\tif (c[2] != c[4])\r\n\t\t\tmask |= 1 << 2;\r\n\t\tif (c[3] != c[4])\r\n\t\t\tmask |= 1 << 3;\r\n\t\tif (c[5] != c[4])\r\n\t\t\tmask |= 1 << 4;\r\n\t\tif (c[6] != c[4])\r\n\t\t\tmask |= 1 << 5;\r\n\t\tif (c[7] != c[4])\r\n\t\t\tmask |= 1 << 6;\r\n\t\tif (c[8] != c[4])\r\n\t\t\tmask |= 1 << 7;\r\n\r\n#define P0 dst0[0]\r\n#define P1 dst0[1]\r\n#define P2 dst1[0]\r\n#define P3 dst1[1]\r\n#define MUR (c[1] != c[5])\r\n#define MDR (c[5] != c[7])\r\n#define MDL (c[7] != c[3])\r\n#define MUL (c[3] != c[1])\r\n#define IC(p0) c[p0]\r\n#define I11(p0,p1) interp_32_11(c[p0], c[p1])\r\n#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2])\r\n#define I31(p0,p1) interp_32_31(c[p0], c[p1])\r\n#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2])\r\n#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2])\r\n#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2])\r\n#define I53(p0,p1) interp_32_53(c[p0], c[p1])\r\n#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2])\r\n#define I71(p0,p1) interp_32_71(c[p0], c[p1])\r\n#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2])\r\n#define I97(p0,p1) interp_32_97(c[p0], c[p1])\r\n#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2])\r\n#define I151(p0,p1) interp_32_151(c[p0], c[p1])\r\n\r\n\t\tswitch (mask) {\r\n#include \"lq2x.h\"\r\n\t\t}\r\n\r\n#undef P0\r\n#undef P1\r\n#undef P2\r\n#undef P3\r\n#undef MUR\r\n#undef MDR\r\n#undef MDL\r\n#undef MUL\r\n#undef IC\r\n#undef I11\r\n#undef I211\r\n#undef I31\r\n#undef I332\r\n#undef I431\r\n#undef I521\r\n#undef I53\r\n#undef I611\r\n#undef I71\r\n#undef I772\r\n#undef I97\r\n#undef I1411\r\n#undef I151\r\n\r\n\t\tsrc0 += 1;\r\n\t\tsrc1 += 1;\r\n\t\tsrc2 += 1;\r\n\t\tdst0 += 2;\r\n\t\tdst1 += 2;\r\n\t}\r\n}\r\n\r\nstatic void lq2xS_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count)\r\n{\r\n   unsigned i;\r\n\r\n   for(i=0;i<count;++i) {\r\n      unsigned char mask = 0;\r\n\r\n      u32 c[9];\r\n\r\n      c[1] = src0[0];\r\n      c[4] = src1[0];\r\n      c[7] = src2[0];\r\n\r\n      if (i>0) {\r\n         c[0] = src0[-1];\r\n         c[3] = src1[-1];\r\n         c[6] = src2[-1];\r\n      } else {\r\n         c[0] = c[1];\r\n         c[3] = c[4];\r\n         c[6] = c[7];\r\n      }\r\n\r\n      if (i<count-1) {\r\n         c[2] = src0[1];\r\n         c[5] = src1[1];\r\n         c[8] = src2[1];\r\n      } else {\r\n         c[2] = c[1];\r\n         c[5] = c[4];\r\n         c[8] = c[7];\r\n      }\r\n\r\n       // lq2xS dynamic edge detection:\r\n\t// simply comparing the center color against its surroundings will give bad results in many cases,\r\n\t// so, instead, compare the center color relative to the max difference in brightness of this 3x3 block\r\n\tint brightArray[9];\r\n\tint maxBright = 0, minBright = 999999;\r\n\tfor(int j = 0 ; j < 9 ; j++)\r\n\t{\r\n\t\tconst int b = (int)((c[j] & 0xF8));\r\n\t\tconst int g = (int)((c[j] & 0xF800)) >> 8;\r\n\t\tconst int r = (int)((c[j] & 0xF80000)) >> 16;\r\n\t\tconst int bright = r+r+r + g+g+g + b+b;\r\n\t\tif(bright > maxBright) maxBright = bright;\r\n\t\tif(bright < minBright) minBright = bright;\r\n\r\n\t\tbrightArray[j] = bright;\r\n\t}\r\n\tint diffBright = ((maxBright - minBright) * 7) >> 4;\r\n\tif(diffBright > 7)\r\n\t{\r\n\t\tconst int centerBright = brightArray[4];\r\n\t\tif(ABS(brightArray[0] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 0;\r\n\t\tif(ABS(brightArray[1] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 1;\r\n\t\tif(ABS(brightArray[2] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 2;\r\n\t\tif(ABS(brightArray[3] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 3;\r\n\t\tif(ABS(brightArray[5] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 4;\r\n\t\tif(ABS(brightArray[6] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 5;\r\n\t\tif(ABS(brightArray[7] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 6;\r\n\t\tif(ABS(brightArray[8] - centerBright) > diffBright)\r\n\t\t\tmask |= 1 << 7;\r\n\t}\r\n\r\n#define P0 dst0[0]\r\n#define P1 dst0[1]\r\n#define P2 dst1[0]\r\n#define P3 dst1[1]\r\n#define MUR false\r\n#define MDR false\r\n#define MDL false\r\n#define MUL false\r\n#define IC(p0) c[p0]\r\n#define I11(p0,p1) interp_32_11(c[p0], c[p1])\r\n#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2])\r\n#define I31(p0,p1) interp_32_31(c[p0], c[p1])\r\n#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2])\r\n#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2])\r\n#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2])\r\n#define I53(p0,p1) interp_32_53(c[p0], c[p1])\r\n#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2])\r\n#define I71(p0,p1) interp_32_71(c[p0], c[p1])\r\n#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2])\r\n#define I97(p0,p1) interp_32_97(c[p0], c[p1])\r\n#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2])\r\n#define I151(p0,p1) interp_32_151(c[p0], c[p1])\r\n\r\n      switch (mask) {\r\n#include \"lq2x.h\"\r\n      }\r\n\r\n#undef P0\r\n#undef P1\r\n#undef P2\r\n#undef P3\r\n#undef MUR\r\n#undef MDR\r\n#undef MDL\r\n#undef MUL\r\n#undef IC\r\n#undef I11\r\n#undef I211\r\n#undef I31\r\n#undef I332\r\n#undef I431\r\n#undef I521\r\n#undef I53\r\n#undef I611\r\n#undef I71\r\n#undef I772\r\n#undef I97\r\n#undef I1411\r\n#undef I151\r\n\r\n      src0 += 1;\r\n      src1 += 1;\r\n      src2 += 1;\r\n      dst0 += 2;\r\n      dst1 += 2;\r\n   }\r\n}\r\n//void lq2x16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\r\n//\t\t\tu8 *dstPtr, u32 dstPitch, int width, int height)\r\n//{\r\n//\tu16 *dst0 = (u16 *)dstPtr;\r\n//\tu16 *dst1 = dst0 + (dstPitch >> 1);\r\n//\r\n//\tu16 *src0 = (u16 *)srcPtr;\r\n//\tu16 *src1 = src0 + (srcPitch >> 1);\r\n//\tu16 *src2 = src1 + (srcPitch >> 1);\r\n//\r\n//\tlq2x_16_def(dst0, dst1, src0, src0, src1, width);\r\n//\tif( height == 1 ) return;\r\n//\r\n//\tint count = height;\r\n//\r\n//\tcount -= 2;\r\n//\twhile(count>0) {\r\n//\t\tdst0 += dstPitch;\r\n//\t\tdst1 += dstPitch;\r\n//\t\tlq2x_16_def(dst0, dst1, src0, src1, src2, width);\r\n//\t\tsrc0 = src1;\r\n//\t\tsrc1 = src2;\r\n//\t\tsrc2 += srcPitch >> 1;\r\n//\t\t--count;\r\n//\t}\r\n//\tdst0 += dstPitch;\r\n//\tdst1 += dstPitch;\r\n//\tlq2x_16_def(dst0, dst1, src0, src1, src1, width);\r\n//}\r\n//\r\n//void lq2xS16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\r\n//\t\t\t u8 *dstPtr, u32 dstPitch, int width, int height)\r\n//{\r\n//   u16 *dst0 = (u16 *)dstPtr;\r\n//   u16 *dst1 = dst0 + (dstPitch >> 1);\r\n//\r\n//   u16 *src0 = (u16 *)srcPtr;\r\n//   u16 *src1 = src0 + (srcPitch >> 1);\r\n//   u16 *src2 = src1 + (srcPitch >> 1);\r\n//\r\n//        int count;\r\n//\r\n//   lq2xS_16_def(dst0, dst1, src0, src0, src1, width);\r\n//   if( height == 1 ) return;\r\n//\r\n//   count = height;\r\n//\r\n//   count -= 2;\r\n//   while(count>0) {\r\n//      dst0 += dstPitch;\r\n//      dst1 += dstPitch;\r\n//      lq2x_16_def(dst0, dst1, src0, src1, src2, width);\r\n//      src0 = src1;\r\n//      src1 = src2;\r\n//      src2 += srcPitch >> 1;\r\n//      --count;\r\n//   }\r\n//   dst0 += dstPitch;\r\n//   dst1 += dstPitch;\r\n//   lq2xS_16_def(dst0, dst1, src0, src1, src1, width);\r\n//}\r\n\r\nvoid lq2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\r\n\t\t\tu8 *dstPtr, u32 dstPitch, int width, int height)\r\n{\r\n\tu32 *dst0 = (u32 *)dstPtr;\r\n\tu32 *dst1 = dst0 + (dstPitch >> 2);\r\n\r\n\tu32 *src0 = (u32 *)srcPtr;\r\n\tu32 *src1 = src0 + (srcPitch >> 2);\r\n\tu32 *src2 = src1 + (srcPitch >> 2);\r\n\tlq2x_32_def(dst0, dst1, src0, src0, src1, width);\r\n\tif( height == 1 ) return;\r\n\r\n\tint count = height;\r\n\r\n\tcount -= 2;\r\n\twhile(count>0) {\r\n\t\tdst0 += dstPitch >> 1;\r\n\t\tdst1 += dstPitch >> 1;\r\n\t\tlq2x_32_def(dst0, dst1, src0, src1, src2, width);\r\n\t\tsrc0 = src1;\r\n\t\tsrc1 = src2;\r\n\t\tsrc2 += srcPitch >> 2;\r\n\t\t--count;\r\n\t}\r\n\tdst0 += dstPitch >> 1;\r\n\tdst1 += dstPitch >> 1;\r\n\tlq2x_32_def(dst0, dst1, src0, src1, src1, width);\r\n}\r\n\r\nvoid lq2xS32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,\r\n\t\t\t u8 *dstPtr, u32 dstPitch, int width, int height)\r\n{\r\n   u32 *dst0 = (u32 *)dstPtr;\r\n   u32 *dst1 = dst0 + (dstPitch >> 2);\r\n\r\n   u32 *src0 = (u32 *)srcPtr;\r\n   u32 *src1 = src0 + (srcPitch >> 2);\r\n   u32 *src2 = src1 + (srcPitch >> 2);\r\n\r\n        int count;\r\n\r\n   lq2xS_32_def(dst0, dst1, src0, src0, src1, width);\r\n   if( height == 1 ) return;\r\n\r\n   count = height;\r\n\r\n   count -= 2;\r\n   while(count>0) {\r\n      dst0 += dstPitch >> 1;\r\n      dst1 += dstPitch >> 1;\r\n      lq2x_32_def(dst0, dst1, src0, src1, src2, width);\r\n      src0 = src1;\r\n      src1 = src2;\r\n      src2 += srcPitch >> 2;\r\n      --count;\r\n   }\r\n   dst0 += dstPitch >> 1;\r\n   dst1 += dstPitch >> 1;\r\n   lq2xS_32_def(dst0, dst1, src0, src1, src1, width);\r\n}\r\n\r\n//void lq2x_init(unsigned bits_per_pixel)\r\n//{\r\n//\tinterp_set(bits_per_pixel);\r\n//}\r\n\r\nvoid RenderLQ2X (SSurface Src, SSurface Dst)\r\n{\r\n\r\n    unsigned char *lpSrc, *lpDst;\r\n\r\n    lpSrc = Src.Surface;\r\n    lpDst = Dst.Surface;\r\n\r\n    lq2x32 (lpSrc, Src.Pitch*2,\r\n                lpSrc,\r\n                lpDst, Dst.Pitch*2 , Src.Width, Src.Height);\r\n}\r\n\r\nvoid RenderLQ2XS (SSurface Src, SSurface Dst)\r\n{\r\n\r\n    unsigned char *lpSrc, *lpDst;\r\n\r\n    lpSrc = Src.Surface;\r\n    lpDst = Dst.Surface;\r\n\r\n    lq2xS32 (lpSrc, Src.Pitch*2,\r\n                lpSrc,\r\n                lpDst, Dst.Pitch*2 , Src.Width, Src.Height);\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/lq2x.h",
    "content": "case 0 : \r\ncase 2 : \r\ncase 4 : \r\ncase 6 : \r\ncase 8 : \r\ncase 12 : \r\ncase 16 : \r\ncase 20 : \r\ncase 24 : \r\ncase 28 : \r\ncase 32 : \r\ncase 34 : \r\ncase 36 : \r\ncase 38 : \r\ncase 40 : \r\ncase 44 : \r\ncase 48 : \r\ncase 52 : \r\ncase 56 : \r\ncase 60 : \r\ncase 64 : \r\ncase 66 : \r\ncase 68 : \r\ncase 70 : \r\ncase 96 : \r\ncase 98 : \r\ncase 100 : \r\ncase 102 : \r\ncase 128 : \r\ncase 130 : \r\ncase 132 : \r\ncase 134 : \r\ncase 136 : \r\ncase 140 : \r\ncase 144 : \r\ncase 148 : \r\ncase 152 : \r\ncase 156 : \r\ncase 160 : \r\ncase 162 : \r\ncase 164 : \r\ncase 166 : \r\ncase 168 : \r\ncase 172 : \r\ncase 176 : \r\ncase 180 : \r\ncase 184 : \r\ncase 188 : \r\ncase 192 : \r\ncase 194 : \r\ncase 196 : \r\ncase 198 : \r\ncase 224 : \r\ncase 226 : \r\ncase 228 : \r\ncase 230 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n} break;\r\ncase 1 : \r\ncase 5 : \r\ncase 9 : \r\ncase 13 : \r\ncase 17 : \r\ncase 21 : \r\ncase 25 : \r\ncase 29 : \r\ncase 33 : \r\ncase 37 : \r\ncase 41 : \r\ncase 45 : \r\ncase 49 : \r\ncase 53 : \r\ncase 57 : \r\ncase 61 : \r\ncase 65 : \r\ncase 69 : \r\ncase 97 : \r\ncase 101 : \r\ncase 129 : \r\ncase 133 : \r\ncase 137 : \r\ncase 141 : \r\ncase 145 : \r\ncase 149 : \r\ncase 153 : \r\ncase 157 : \r\ncase 161 : \r\ncase 165 : \r\ncase 169 : \r\ncase 173 : \r\ncase 177 : \r\ncase 181 : \r\ncase 185 : \r\ncase 189 : \r\ncase 193 : \r\ncase 197 : \r\ncase 225 : \r\ncase 229 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  P2 = IC(1);\r\n  P3 = IC(1);\r\n} break;\r\ncase 3 : \r\ncase 35 : \r\ncase 67 : \r\ncase 99 : \r\ncase 131 : \r\ncase 163 : \r\ncase 195 : \r\ncase 227 : \r\n{\r\n  P0 = IC(2);\r\n  P1 = IC(2);\r\n  P2 = IC(2);\r\n  P3 = IC(2);\r\n} break;\r\ncase 7 : \r\ncase 39 : \r\ncase 71 : \r\ncase 103 : \r\ncase 135 : \r\ncase 167 : \r\ncase 199 : \r\ncase 231 : \r\n{\r\n  P0 = IC(3);\r\n  P1 = IC(3);\r\n  P2 = IC(3);\r\n  P3 = IC(3);\r\n} break;\r\ncase 10 : \r\ncase 138 : \r\n{\r\n  P1 = IC(0);\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I211(0, 1, 3);\r\n  }\r\n} break;\r\ncase 11 : \r\ncase 27 : \r\ncase 75 : \r\ncase 139 : \r\ncase 155 : \r\ncase 203 : \r\n{\r\n  P1 = IC(2);\r\n  P2 = IC(2);\r\n  P3 = IC(2);\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n  } else {\r\n    P0 = I211(2, 1, 3);\r\n  }\r\n} break;\r\ncase 14 : \r\ncase 142 : \r\n{\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n    P1 = IC(0);\r\n  } else {\r\n    P0 = I332(1, 3, 0);\r\n    P1 = I31(0, 1);\r\n  }\r\n} break;\r\ncase 15 : \r\ncase 143 : \r\ncase 207 : \r\n{\r\n  P2 = IC(4);\r\n  P3 = IC(4);\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n    P1 = IC(4);\r\n  } else {\r\n    P0 = I332(1, 3, 4);\r\n    P1 = I31(4, 1);\r\n  }\r\n} break;\r\ncase 18 : \r\ncase 22 : \r\ncase 30 : \r\ncase 50 : \r\ncase 54 : \r\ncase 62 : \r\ncase 86 : \r\ncase 118 : \r\n{\r\n  P0 = IC(0);\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 19 : \r\ncase 51 : \r\n{\r\n  P2 = IC(2);\r\n  P3 = IC(2);\r\n  if (MUR) {\r\n    P0 = IC(2);\r\n    P1 = IC(2);\r\n  } else {\r\n    P0 = I31(2, 1);\r\n    P1 = I332(1, 5, 2);\r\n  }\r\n} break;\r\ncase 23 : \r\ncase 55 : \r\ncase 119 : \r\n{\r\n  P2 = IC(3);\r\n  P3 = IC(3);\r\n  if (MUR) {\r\n    P0 = IC(3);\r\n    P1 = IC(3);\r\n  } else {\r\n    P0 = I31(3, 1);\r\n    P1 = I332(1, 5, 3);\r\n  }\r\n} break;\r\ncase 26 : \r\n{\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I211(0, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 31 : \r\ncase 95 : \r\n{\r\n  P2 = IC(4);\r\n  P3 = IC(4);\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I211(4, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(4);\r\n  } else {\r\n    P1 = I211(4, 1, 5);\r\n  }\r\n} break;\r\ncase 42 : \r\ncase 170 : \r\n{\r\n  P1 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n    P2 = IC(0);\r\n  } else {\r\n    P0 = I332(1, 3, 0);\r\n    P2 = I31(0, 3);\r\n  }\r\n} break;\r\ncase 43 : \r\ncase 171 : \r\ncase 187 : \r\n{\r\n  P1 = IC(2);\r\n  P3 = IC(2);\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n    P2 = IC(2);\r\n  } else {\r\n    P0 = I332(1, 3, 2);\r\n    P2 = I31(2, 3);\r\n  }\r\n} break;\r\ncase 46 : \r\ncase 174 : \r\n{\r\n  P1 = IC(0);\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n} break;\r\ncase 47 : \r\ncase 175 : \r\n{\r\n  P1 = IC(4);\r\n  P2 = IC(4);\r\n  P3 = IC(4);\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I1411(4, 1, 3);\r\n  }\r\n} break;\r\ncase 58 : \r\ncase 154 : \r\ncase 186 : \r\n{\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I611(0, 1, 5);\r\n  }\r\n} break;\r\ncase 59 : \r\n{\r\n  P2 = IC(2);\r\n  P3 = IC(2);\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n  } else {\r\n    P0 = I211(2, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(2);\r\n  } else {\r\n    P1 = I611(2, 1, 5);\r\n  }\r\n} break;\r\ncase 63 : \r\n{\r\n  P2 = IC(4);\r\n  P3 = IC(4);\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I1411(4, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(4);\r\n  } else {\r\n    P1 = I211(4, 1, 5);\r\n  }\r\n} break;\r\ncase 72 : \r\ncase 76 : \r\ncase 104 : \r\ncase 106 : \r\ncase 108 : \r\ncase 110 : \r\ncase 120 : \r\ncase 124 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  P3 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n} break;\r\ncase 73 : \r\ncase 77 : \r\ncase 105 : \r\ncase 109 : \r\ncase 125 : \r\n{\r\n  P1 = IC(1);\r\n  P3 = IC(1);\r\n  if (MDL) {\r\n    P0 = IC(1);\r\n    P2 = IC(1);\r\n  } else {\r\n    P0 = I31(1, 3);\r\n    P2 = I332(3, 7, 1);\r\n  }\r\n} break;\r\ncase 74 : \r\n{\r\n  P1 = IC(0);\r\n  P3 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I211(0, 1, 3);\r\n  }\r\n} break;\r\ncase 78 : \r\ncase 202 : \r\ncase 206 : \r\n{\r\n  P1 = IC(0);\r\n  P3 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I611(0, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n} break;\r\ncase 79 : \r\n{\r\n  P1 = IC(4);\r\n  P3 = IC(4);\r\n  if (MDL) {\r\n    P2 = IC(4);\r\n  } else {\r\n    P2 = I611(4, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I211(4, 1, 3);\r\n  }\r\n} break;\r\ncase 80 : \r\ncase 208 : \r\ncase 210 : \r\ncase 216 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I211(0, 5, 7);\r\n  }\r\n} break;\r\ncase 81 : \r\ncase 209 : \r\ncase 217 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  P2 = IC(1);\r\n  if (MDR) {\r\n    P3 = IC(1);\r\n  } else {\r\n    P3 = I211(1, 5, 7);\r\n  }\r\n} break;\r\ncase 82 : \r\ncase 214 : \r\ncase 222 : \r\n{\r\n  P0 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I211(0, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 83 : \r\ncase 115 : \r\n{\r\n  P0 = IC(2);\r\n  P2 = IC(2);\r\n  if (MDR) {\r\n    P3 = IC(2);\r\n  } else {\r\n    P3 = I611(2, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(2);\r\n  } else {\r\n    P1 = I611(2, 1, 5);\r\n  }\r\n} break;\r\ncase 84 : \r\ncase 212 : \r\n{\r\n  P0 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P1 = IC(0);\r\n    P3 = IC(0);\r\n  } else {\r\n    P1 = I31(0, 5);\r\n    P3 = I332(5, 7, 0);\r\n  }\r\n} break;\r\ncase 85 : \r\ncase 213 : \r\ncase 221 : \r\n{\r\n  P0 = IC(1);\r\n  P2 = IC(1);\r\n  if (MDR) {\r\n    P1 = IC(1);\r\n    P3 = IC(1);\r\n  } else {\r\n    P1 = I31(1, 5);\r\n    P3 = I332(5, 7, 1);\r\n  }\r\n} break;\r\ncase 87 : \r\n{\r\n  P0 = IC(3);\r\n  P2 = IC(3);\r\n  if (MDR) {\r\n    P3 = IC(3);\r\n  } else {\r\n    P3 = I611(3, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(3);\r\n  } else {\r\n    P1 = I211(3, 1, 5);\r\n  }\r\n} break;\r\ncase 88 : \r\ncase 248 : \r\ncase 250 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I211(0, 5, 7);\r\n  }\r\n} break;\r\ncase 89 : \r\ncase 93 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  if (MDL) {\r\n    P2 = IC(1);\r\n  } else {\r\n    P2 = I611(1, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(1);\r\n  } else {\r\n    P3 = I611(1, 5, 7);\r\n  }\r\n} break;\r\ncase 90 : \r\n{\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I611(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I611(0, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I611(0, 1, 5);\r\n  }\r\n} break;\r\ncase 91 : \r\n{\r\n  if (MDL) {\r\n    P2 = IC(2);\r\n  } else {\r\n    P2 = I611(2, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(2);\r\n  } else {\r\n    P3 = I611(2, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n  } else {\r\n    P0 = I211(2, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(2);\r\n  } else {\r\n    P1 = I611(2, 1, 5);\r\n  }\r\n} break;\r\ncase 92 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I611(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I611(0, 5, 7);\r\n  }\r\n} break;\r\ncase 94 : \r\n{\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I611(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I611(0, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 107 : \r\ncase 123 : \r\n{\r\n  P1 = IC(2);\r\n  P3 = IC(2);\r\n  if (MDL) {\r\n    P2 = IC(2);\r\n  } else {\r\n    P2 = I211(2, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n  } else {\r\n    P0 = I211(2, 1, 3);\r\n  }\r\n} break;\r\ncase 111 : \r\n{\r\n  P1 = IC(4);\r\n  P3 = IC(4);\r\n  if (MDL) {\r\n    P2 = IC(4);\r\n  } else {\r\n    P2 = I211(4, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I1411(4, 1, 3);\r\n  }\r\n} break;\r\ncase 112 : \r\ncase 240 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  if (MDR) {\r\n    P2 = IC(0);\r\n    P3 = IC(0);\r\n  } else {\r\n    P2 = I31(0, 7);\r\n    P3 = I332(5, 7, 0);\r\n  }\r\n} break;\r\ncase 113 : \r\ncase 241 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  if (MDR) {\r\n    P2 = IC(1);\r\n    P3 = IC(1);\r\n  } else {\r\n    P2 = I31(1, 7);\r\n    P3 = I332(5, 7, 1);\r\n  }\r\n} break;\r\ncase 114 : \r\n{\r\n  P0 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I611(0, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I611(0, 1, 5);\r\n  }\r\n} break;\r\ncase 116 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I611(0, 5, 7);\r\n  }\r\n} break;\r\ncase 117 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  P2 = IC(1);\r\n  if (MDR) {\r\n    P3 = IC(1);\r\n  } else {\r\n    P3 = I611(1, 5, 7);\r\n  }\r\n} break;\r\ncase 121 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  if (MDL) {\r\n    P2 = IC(1);\r\n  } else {\r\n    P2 = I211(1, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(1);\r\n  } else {\r\n    P3 = I611(1, 5, 7);\r\n  }\r\n} break;\r\ncase 122 : \r\n{\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I611(0, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I611(0, 1, 5);\r\n  }\r\n} break;\r\ncase 126 : \r\n{\r\n  P0 = IC(0);\r\n  P3 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 127 : \r\n{\r\n  P3 = IC(4);\r\n  if (MDL) {\r\n    P2 = IC(4);\r\n  } else {\r\n    P2 = I211(4, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I1411(4, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(4);\r\n  } else {\r\n    P1 = I211(4, 1, 5);\r\n  }\r\n} break;\r\ncase 146 : \r\ncase 150 : \r\ncase 178 : \r\ncase 182 : \r\ncase 190 : \r\n{\r\n  P0 = IC(0);\r\n  P2 = IC(0);\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n    P3 = IC(0);\r\n  } else {\r\n    P1 = I332(1, 5, 0);\r\n    P3 = I31(0, 5);\r\n  }\r\n} break;\r\ncase 147 : \r\ncase 179 : \r\n{\r\n  P0 = IC(2);\r\n  P2 = IC(2);\r\n  P3 = IC(2);\r\n  if (MUR) {\r\n    P1 = IC(2);\r\n  } else {\r\n    P1 = I611(2, 1, 5);\r\n  }\r\n} break;\r\ncase 151 : \r\ncase 183 : \r\n{\r\n  P0 = IC(3);\r\n  P2 = IC(3);\r\n  P3 = IC(3);\r\n  if (MUR) {\r\n    P1 = IC(3);\r\n  } else {\r\n    P1 = I1411(3, 1, 5);\r\n  }\r\n} break;\r\ncase 158 : \r\n{\r\n  P2 = IC(0);\r\n  P3 = IC(0);\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 159 : \r\n{\r\n  P2 = IC(4);\r\n  P3 = IC(4);\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I211(4, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(4);\r\n  } else {\r\n    P1 = I1411(4, 1, 5);\r\n  }\r\n} break;\r\ncase 191 : \r\n{\r\n  P2 = IC(4);\r\n  P3 = IC(4);\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I1411(4, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(4);\r\n  } else {\r\n    P1 = I1411(4, 1, 5);\r\n  }\r\n} break;\r\ncase 200 : \r\ncase 204 : \r\ncase 232 : \r\ncase 236 : \r\ncase 238 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n    P3 = IC(0);\r\n  } else {\r\n    P2 = I332(3, 7, 0);\r\n    P3 = I31(0, 7);\r\n  }\r\n} break;\r\ncase 201 : \r\ncase 205 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  P3 = IC(1);\r\n  if (MDL) {\r\n    P2 = IC(1);\r\n  } else {\r\n    P2 = I611(1, 3, 7);\r\n  }\r\n} break;\r\ncase 211 : \r\n{\r\n  P0 = IC(2);\r\n  P1 = IC(2);\r\n  P2 = IC(2);\r\n  if (MDR) {\r\n    P3 = IC(2);\r\n  } else {\r\n    P3 = I211(2, 5, 7);\r\n  }\r\n} break;\r\ncase 215 : \r\n{\r\n  P0 = IC(3);\r\n  P2 = IC(3);\r\n  if (MDR) {\r\n    P3 = IC(3);\r\n  } else {\r\n    P3 = I211(3, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(3);\r\n  } else {\r\n    P1 = I1411(3, 1, 5);\r\n  }\r\n} break;\r\ncase 218 : \r\n{\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I611(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I211(0, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I611(0, 1, 5);\r\n  }\r\n} break;\r\ncase 219 : \r\n{\r\n  P1 = IC(2);\r\n  P2 = IC(2);\r\n  if (MDR) {\r\n    P3 = IC(2);\r\n  } else {\r\n    P3 = I211(2, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n  } else {\r\n    P0 = I211(2, 1, 3);\r\n  }\r\n} break;\r\ncase 220 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I611(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I211(0, 5, 7);\r\n  }\r\n} break;\r\ncase 223 : \r\n{\r\n  P2 = IC(4);\r\n  if (MDR) {\r\n    P3 = IC(4);\r\n  } else {\r\n    P3 = I211(4, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I211(4, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(4);\r\n  } else {\r\n    P1 = I1411(4, 1, 5);\r\n  }\r\n} break;\r\ncase 233 : \r\ncase 237 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  P3 = IC(1);\r\n  if (MDL) {\r\n    P2 = IC(1);\r\n  } else {\r\n    P2 = I1411(1, 3, 7);\r\n  }\r\n} break;\r\ncase 234 : \r\n{\r\n  P1 = IC(0);\r\n  P3 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(0);\r\n  } else {\r\n    P0 = I611(0, 1, 3);\r\n  }\r\n} break;\r\ncase 235 : \r\n{\r\n  P1 = IC(2);\r\n  P3 = IC(2);\r\n  if (MDL) {\r\n    P2 = IC(2);\r\n  } else {\r\n    P2 = I1411(2, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n  } else {\r\n    P0 = I211(2, 1, 3);\r\n  }\r\n} break;\r\ncase 239 : \r\n{\r\n  P1 = IC(4);\r\n  P3 = IC(4);\r\n  if (MDL) {\r\n    P2 = IC(4);\r\n  } else {\r\n    P2 = I1411(4, 3, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I1411(4, 1, 3);\r\n  }\r\n} break;\r\ncase 242 : \r\n{\r\n  P0 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I211(0, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I611(0, 1, 5);\r\n  }\r\n} break;\r\ncase 243 : \r\n{\r\n  P0 = IC(2);\r\n  P1 = IC(2);\r\n  if (MDR) {\r\n    P2 = IC(2);\r\n    P3 = IC(2);\r\n  } else {\r\n    P2 = I31(2, 7);\r\n    P3 = I332(5, 7, 2);\r\n  }\r\n} break;\r\ncase 244 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I1411(0, 5, 7);\r\n  }\r\n} break;\r\ncase 245 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  P2 = IC(1);\r\n  if (MDR) {\r\n    P3 = IC(1);\r\n  } else {\r\n    P3 = I1411(1, 5, 7);\r\n  }\r\n} break;\r\ncase 246 : \r\n{\r\n  P0 = IC(0);\r\n  P2 = IC(0);\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I1411(0, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 247 : \r\n{\r\n  P0 = IC(3);\r\n  P2 = IC(3);\r\n  if (MDR) {\r\n    P3 = IC(3);\r\n  } else {\r\n    P3 = I1411(3, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(3);\r\n  } else {\r\n    P1 = I1411(3, 1, 5);\r\n  }\r\n} break;\r\ncase 249 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  if (MDL) {\r\n    P2 = IC(1);\r\n  } else {\r\n    P2 = I1411(1, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(1);\r\n  } else {\r\n    P3 = I211(1, 5, 7);\r\n  }\r\n} break;\r\ncase 251 : \r\n{\r\n  P1 = IC(2);\r\n  if (MDL) {\r\n    P2 = IC(2);\r\n  } else {\r\n    P2 = I1411(2, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(2);\r\n  } else {\r\n    P3 = I211(2, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(2);\r\n  } else {\r\n    P0 = I211(2, 1, 3);\r\n  }\r\n} break;\r\ncase 252 : \r\n{\r\n  P0 = IC(0);\r\n  P1 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I1411(0, 5, 7);\r\n  }\r\n} break;\r\ncase 253 : \r\n{\r\n  P0 = IC(1);\r\n  P1 = IC(1);\r\n  if (MDL) {\r\n    P2 = IC(1);\r\n  } else {\r\n    P2 = I1411(1, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(1);\r\n  } else {\r\n    P3 = I1411(1, 5, 7);\r\n  }\r\n} break;\r\ncase 254 : \r\n{\r\n  P0 = IC(0);\r\n  if (MDL) {\r\n    P2 = IC(0);\r\n  } else {\r\n    P2 = I211(0, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(0);\r\n  } else {\r\n    P3 = I1411(0, 5, 7);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(0);\r\n  } else {\r\n    P1 = I211(0, 1, 5);\r\n  }\r\n} break;\r\ncase 255 : \r\n{\r\n  if (MDL) {\r\n    P2 = IC(4);\r\n  } else {\r\n    P2 = I1411(4, 3, 7);\r\n  }\r\n  if (MDR) {\r\n    P3 = IC(4);\r\n  } else {\r\n    P3 = I1411(4, 5, 7);\r\n  }\r\n  if (MUL) {\r\n    P0 = IC(4);\r\n  } else {\r\n    P0 = I1411(4, 1, 3);\r\n  }\r\n  if (MUR) {\r\n    P1 = IC(4);\r\n  } else {\r\n    P1 = I1411(4, 1, 5);\r\n  }\r\n} break;\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/filter/scanline.cpp",
    "content": "/*  Copyright (C) 2009 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"filter.h\"\r\n#include \"types.h\"\r\n#include <stdio.h>\r\n#include <string.h>\r\n\r\ntypedef u64 uint64;\r\n\r\nextern CACHE_ALIGN u16 fadeOutColors[17][0x8000];\r\n\r\nextern int scanline_filter_a, scanline_filter_b;\r\nstatic int fac_a, fac_b;\r\n\r\nFORCEINLINE void ScanLine16( uint16 *lpDst, uint16 *lpSrc, unsigned int Width){\r\n\twhile(Width--){\r\n\t\t*lpDst++ = *lpSrc;\r\n\t\t*lpDst++ = fadeOutColors[scanline_filter_a][(*lpSrc++)];\r\n\t}\r\n}\r\n\r\nFORCEINLINE void ScanLine16_2( uint16 *lpDst, uint16 *lpSrc, unsigned int Width){\r\n\twhile(Width--){\r\n\t\t*lpDst++ = fadeOutColors[scanline_filter_a][(*lpSrc)];\r\n\t\t*lpDst++ = fadeOutColors[scanline_filter_b][(*lpSrc++)];\r\n\t}\r\n}\r\n\r\nFORCEINLINE void ScanLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){\r\n\twhile(Width--){\r\n\t\t*lpDst++ = *lpSrc;\r\n\t\tu8* u8dst = (u8*)lpDst;\r\n\t\tu8* u8src = (u8*)lpSrc;\r\n\t\t*u8dst++ = *u8src++ * fac_a / 16;\r\n\t\t*u8dst++ = *u8src++ * fac_a / 16;\r\n\t\t*u8dst++ = *u8src++ * fac_a / 16;\r\n\t\tlpDst++; \r\n\t\tlpSrc++;\r\n\t}\r\n}\r\n\r\nFORCEINLINE void ScanLine32_2( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){\r\n\twhile(Width--){\r\n\t\tu8* u8dst = (u8*)lpDst;\r\n\t\tu8* u8src = (u8*)lpSrc;\r\n\t\t*u8dst++ = *u8src++ * fac_a / 16;\r\n\t\t*u8dst++ = *u8src++ * fac_a / 16;\r\n\t\t*u8dst++ = *u8src++ * fac_a / 16;\r\n\t\tu8dst++;\r\n\t\tu8src = (u8*)lpSrc;\r\n\t\t*u8dst++ = *u8src++ * fac_b / 16;\r\n\t\t*u8dst++ = *u8src++ * fac_b / 16;\r\n\t\t*u8dst++ = *u8src++ * fac_b / 16;\r\n\t\tu8dst++; u8src++;\r\n\t\tlpDst+=2; \r\n\t\tlpSrc++;\r\n\t}\r\n}\r\n\r\n\r\nFORCEINLINE void DoubleLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){\r\n\twhile(Width--){\r\n\t\t*lpDst++ = *lpSrc;\r\n\t\t*lpDst++ = *lpSrc++;\r\n\t}\r\n}\r\n\r\nvoid RenderScanline( SSurface Src, SSurface Dst)\r\n{\r\n\tfac_a = (16-scanline_filter_a);\r\n\tfac_b = (16-scanline_filter_b);\r\n\tunsigned int H;\r\n\r\n\tconst uint32 srcHeight = Src.Height;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tu32* lpSrc = (u32*)Src.Surface;\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tu32 *lpDst = (u32*)Dst.Surface;\r\n\tfor (H = 0; H < srcHeight; H++, lpSrc += srcPitch)\r\n\t\tScanLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch,\r\n\t\tScanLine32_2 (lpDst, lpSrc, Src.Width), lpDst += dstPitch;\r\n\t\t//memset (lpDst, 0, 512*2), lpDst += dstPitch;\r\n}\r\n\r\nvoid RenderNearest2X (SSurface Src, SSurface Dst)\r\n{\r\n\tuint32 *lpSrc;\r\n\tunsigned int H;\r\n\r\n\tconst uint32 srcHeight = Src.Height;\r\n\r\n\tconst unsigned int srcPitch = Src.Pitch >> 1;\r\n\tlpSrc = reinterpret_cast<uint32 *>(Src.Surface);\r\n\r\n\tconst unsigned int dstPitch = Dst.Pitch >> 1;\r\n\tuint32 *lpDst = (uint32*)Dst.Surface;\r\n\tfor (H = 0; H < srcHeight; H++, lpSrc += srcPitch)\r\n\t\tDoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch,\r\n\t\tDoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch;\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/firmware.cpp",
    "content": "/*\t\r\n\tCopyright (C) 2009-2011 DeSmuME Team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"firmware.h\"\r\n#include \"NDSSystem.h\"\r\n#include \"path.h\"\r\n\r\n#define DWNUM(i) ((i) >> 2)\r\n\r\nbool CFIRMWARE::getKeyBuf()\r\n{\r\n\tFILE *file = fopen(CommonSettings.ARM7BIOS, \"rb\");\r\n\tif (!file) return false;\r\n\r\n\tfseek(file, 0x30, SEEK_SET);\r\n\tsize_t res = fread(keyBuf, 4, 0x412, file);\r\n\tfclose(file);\r\n\treturn (res == 0x412);\r\n}\r\n\r\nvoid CFIRMWARE::crypt64BitUp(u32 *ptr)\r\n{\r\n\tu32 Y = ptr[0];\r\n\tu32 X = ptr[1];\r\n\r\n\tfor(u32 i = 0x00; i <= 0x0F; i++)\r\n\t{\r\n\t\tu32 Z = (keyBuf[i] ^ X);\r\n\t\tX = keyBuf[DWNUM(0x048 + (((Z >> 24) & 0xFF) << 2))];\r\n\t\tX = (keyBuf[DWNUM(0x448 + (((Z >> 16) & 0xFF) << 2))] + X);\r\n\t\tX = (keyBuf[DWNUM(0x848 + (((Z >> 8) & 0xFF) << 2))] ^ X);\r\n\t\tX = (keyBuf[DWNUM(0xC48 + ((Z & 0xFF) << 2))] + X);\r\n\t\tX = (Y ^ X);\r\n\t\tY = Z;\r\n\t}\r\n\r\n\tptr[0] = (X ^ keyBuf[DWNUM(0x40)]);\r\n\tptr[1] = (Y ^ keyBuf[DWNUM(0x44)]);\r\n}\r\n\r\nvoid CFIRMWARE::crypt64BitDown(u32 *ptr)\r\n{\r\n\tu32 Y = ptr[0];\r\n\tu32 X = ptr[1];\r\n\r\n\tfor(u32 i = 0x11; i >= 0x02; i--)\r\n\t{\r\n\t\tu32 Z = (keyBuf[i] ^ X);\r\n\t\tX = keyBuf[DWNUM(0x048 + (((Z >> 24) & 0xFF) << 2))];\r\n\t\tX = (keyBuf[DWNUM(0x448 + (((Z >> 16) & 0xFF) << 2))] + X);\r\n\t\tX = (keyBuf[DWNUM(0x848 + (((Z >> 8)  & 0xFF) << 2))] ^ X);\r\n\t\tX = (keyBuf[DWNUM(0xC48 + ((Z & 0xFF) << 2))] + X);\r\n\t\tX = (Y ^ X);\r\n\t\tY = Z;\r\n\t}\r\n\r\n\tptr[0] = (X ^ keyBuf[DWNUM(0x04)]);\r\n\tptr[1] = (Y ^ keyBuf[DWNUM(0x00)]);\r\n}\r\n\r\n#define bswap32(val) (((val & 0x000000FF) << 24) | ((val & 0x0000FF00) << 8) | ((val & 0x00FF0000) >> 8) | ((val & 0xFF000000) >> 24))\r\nvoid CFIRMWARE::applyKeycode(u32 modulo)\r\n{\r\n\tcrypt64BitUp(&keyCode[1]);\r\n\tcrypt64BitUp(&keyCode[0]);\r\n\r\n\tu32 scratch[2] = {0x00000000, 0x00000000};\r\n\r\n\tfor(u32 i = 0; i <= 0x44; i += 4)\r\n\t{\r\n\t\tkeyBuf[DWNUM(i)] = (keyBuf[DWNUM(i)] ^ bswap32(keyCode[DWNUM(i % modulo)]));\r\n\t}\r\n\r\n\tfor(u32 i = 0; i <= 0x1040; i += 8)\r\n\t{\r\n\t\tcrypt64BitUp(scratch);\r\n\t\tkeyBuf[DWNUM(i)] = scratch[1];\r\n\t\tkeyBuf[DWNUM(i+4)] = scratch[0];\r\n\t}\r\n}\r\n#undef bswap32\r\n\r\nbool CFIRMWARE::initKeycode(u32 idCode, int level, u32 modulo)\r\n{\r\n\tif(getKeyBuf() == FALSE)\r\n\t\treturn FALSE;\r\n\r\n\tkeyCode[0] = idCode;\r\n\tkeyCode[1] = (idCode >> 1);\r\n\tkeyCode[2] = (idCode << 1);\r\n\r\n\tif(level >= 1) applyKeycode(modulo);\r\n\tif(level >= 2) applyKeycode(modulo);\r\n\r\n\tkeyCode[1] <<= 1;\r\n\tkeyCode[2] >>= 1;\r\n\r\n\tif(level >= 3) applyKeycode(modulo);\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nu16 CFIRMWARE::getBootCodeCRC16()\r\n{\r\n\tunsigned int i, j;\r\n\tu32 crc = 0xFFFF;\r\n\tconst u16 val[8] = {0xC0C1, 0xC181, 0xC301, 0xC601, 0xCC01, 0xD801, 0xF001, 0xA001};\r\n\r\n\tfor(i = 0; i < size9; i++)\r\n\t{\r\n\t\tcrc = (crc ^ tmp_data9[i]);\r\n\r\n\t\tfor(j = 0; j < 8; j++) \r\n\t\t{\r\n\t\t\tif(crc & 0x0001)\r\n\t\t\t\tcrc = ((crc >> 1) ^ (val[j] << (7-j)));\r\n\t\t\telse\r\n\t\t\t\tcrc =  (crc >> 1);\r\n\t\t}\r\n\t}\r\n\r\n\tfor(i = 0; i < size7; i++)\r\n\t{\r\n\t\tcrc = (crc ^ tmp_data7[i]);\r\n\r\n\t\tfor(j = 0; j < 8; j++) \r\n\t\t{\r\n\t\t\tif(crc & 0x0001)\r\n\t\t\t\tcrc = ((crc >> 1) ^ (val[j] << (7-j)));\r\n\t\t\telse\r\n\t\t\t\tcrc =  (crc >> 1);\r\n\t\t}\r\n\t}\r\n\r\n\treturn (crc & 0xFFFF);\r\n}\r\n\r\nu32 CFIRMWARE::decrypt(const u8 *in, u8* &out)\r\n{\r\n\tu32 curBlock[2] = { 0 };\r\n\tu32 blockSize = 0;\r\n\tu32 xLen = 0;\r\n\r\n\tu32 i = 0, j = 0;\r\n\tu32 xIn = 4, xOut = 0;\r\n\tu32 len = 0;\r\n\tu32 offset = 0;\r\n\tu32 windowOffset = 0;\r\n\tu8 d = 0;\r\n\tu16 data = 0;\r\n\r\n\tmemcpy(curBlock, in, 8);\r\n\tcrypt64BitDown(curBlock);\r\n\tblockSize = (curBlock[0] >> 8);\r\n\r\n\tif (blockSize == 0) return (0);\r\n\r\n\tout = new u8 [blockSize];\r\n\tif (!out ) return (0);\r\n\tmemset(out, 0xFF, blockSize);\r\n\r\n\txLen = blockSize;\r\n\twhile(xLen > 0)\r\n\t{\r\n\t\td = T1ReadByte((u8*)curBlock, (xIn % 8));\r\n\t\txIn++;\r\n\t\tif((xIn % 8) == 0)\r\n\t\t{\r\n\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t\tcrypt64BitDown(curBlock);\r\n\t\t}\r\n\r\n\t\tfor(i = 0; i < 8; i++)\r\n\t\t{\r\n\t\t\tif(d & 0x80)\r\n\t\t\t{\r\n\t\t\t\tdata = (T1ReadByte((u8*)curBlock, (xIn % 8)) << 8);\r\n\t\t\t\txIn++;\r\n\t\t\t\tif((xIn % 8) == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t\t\t\tcrypt64BitDown(curBlock);\r\n\t\t\t\t}\r\n\t\t\t\tdata |= T1ReadByte((u8*)curBlock, (xIn % 8));\r\n\t\t\t\txIn++;\r\n\t\t\t\tif((xIn % 8) == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t\t\t\tcrypt64BitDown(curBlock);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlen = (data >> 12) + 3;\r\n\t\t\t\toffset = (data & 0xFFF);\r\n\t\t\t\twindowOffset = (xOut - offset - 1);\r\n\r\n\t\t\t\tfor(j = 0; j < len; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tT1WriteByte(out, xOut, T1ReadByte(out, windowOffset));\r\n\t\t\t\t\txOut++;\r\n\t\t\t\t\twindowOffset++;\r\n\r\n\t\t\t\t\txLen--;\r\n\t\t\t\t\tif(xLen == 0) return (blockSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tT1WriteByte(out, xOut, T1ReadByte((u8*)curBlock, (xIn % 8)));\r\n\t\t\t\txOut++;\r\n\t\t\t\txIn++;\r\n\t\t\t\tif((xIn % 8) == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t\t\t\tcrypt64BitDown(curBlock);\r\n\t\t\t\t}\r\n\r\n\t\t\t\txLen--;\r\n\t\t\t\tif(xLen == 0) return (blockSize);\r\n\t\t\t}\r\n\r\n\t\t\td = ((d << 1) & 0xFF);\r\n\t\t}\r\n\t}\r\n\t\r\n\treturn (blockSize);\r\n}\r\n\r\nu32 CFIRMWARE::decompress(const u8 *in, u8* &out)\r\n{\r\n\tu32 curBlock[2] = { 0 };\r\n\tu32 blockSize = 0;\r\n\tu32 xLen = 0;\r\n\r\n\tu32 i = 0, j = 0;\r\n\tu32 xIn = 4, xOut = 0;\r\n\tu32 len = 0;\r\n\tu32 offset = 0;\r\n\tu32 windowOffset = 0;\r\n\tu8 d = 0;\r\n\tu16 data = 0;\r\n\r\n\tmemcpy(curBlock, in, 8);\r\n\tblockSize = (curBlock[0] >> 8);\r\n\r\n\tif (blockSize == 0) return (0);\r\n\r\n\tout = new u8 [blockSize];\r\n\tif (!out ) return (0);\r\n\tmemset(out, 0xFF, blockSize);\r\n\r\n\txLen = blockSize;\r\n\twhile(xLen > 0)\r\n\t{\r\n\t\td = T1ReadByte((u8*)curBlock, (xIn % 8));\r\n\t\txIn++;\r\n\t\tif((xIn % 8) == 0)\r\n\t\t{\r\n\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t}\r\n\r\n\t\tfor(i = 0; i < 8; i++)\r\n\t\t{\r\n\t\t\tif(d & 0x80)\r\n\t\t\t{\r\n\t\t\t\tdata = (T1ReadByte((u8*)curBlock, (xIn % 8)) << 8);\r\n\t\t\t\txIn++;\r\n\t\t\t\tif((xIn % 8) == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t\t\t}\r\n\t\t\t\tdata |= T1ReadByte((u8*)curBlock, (xIn % 8));\r\n\t\t\t\txIn++;\r\n\t\t\t\tif((xIn % 8) == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlen = (data >> 12) + 3;\r\n\t\t\t\toffset = (data & 0xFFF);\r\n\t\t\t\twindowOffset = (xOut - offset - 1);\r\n\r\n\t\t\t\tfor(j = 0; j < len; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tT1WriteByte(out, xOut, T1ReadByte(out, windowOffset));\r\n\t\t\t\t\txOut++;\r\n\t\t\t\t\twindowOffset++;\r\n\r\n\t\t\t\t\txLen--;\r\n\t\t\t\t\tif(xLen == 0) return (blockSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tT1WriteByte(out, xOut, T1ReadByte((u8*)curBlock, (xIn % 8)));\r\n\t\t\t\txOut++;\r\n\t\t\t\txIn++;\r\n\t\t\t\tif((xIn % 8) == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(curBlock, in + xIn, 8);\r\n\t\t\t\t}\r\n\r\n\t\t\t\txLen--;\r\n\t\t\t\tif(xLen == 0) return (blockSize);\r\n\t\t\t}\r\n\r\n\t\t\td = ((d << 1) & 0xFF);\r\n\t\t}\r\n\t}\r\n\t\r\n\treturn (blockSize);\r\n}\r\n//================================================================================\r\nbool CFIRMWARE::load()\r\n{\r\n\tu32 size = 0;\r\n\tu8\t*data = NULL;\r\n\tu16 shift1 = 0, shift2 = 0, shift3 = 0, shift4 = 0;\r\n\tu32 part1addr = 0, part2addr = 0, part3addr = 0, part4addr = 0, part5addr = 0;\r\n\tu32 part1ram = 0, part2ram = 0;\r\n\t\r\n\tu32\tsrc = 0;\r\n\t\r\n\tif (CommonSettings.UseExtFirmware == false)\r\n\t\treturn false;\r\n\tif (strlen(CommonSettings.Firmware) == 0)\r\n\t\treturn false;\r\n\t\r\n\tFILE\t*fp = fopen(CommonSettings.Firmware, \"rb\");\r\n\tif (!fp)\r\n\t\treturn false;\r\n\tfseek(fp, 0, SEEK_END);\r\n\tsize = ftell(fp);\r\n\tfseek(fp, 0, SEEK_SET);\r\n\tif( (size != 256*1024) && (size != 512*1024) )\r\n\t{\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n\r\n#if 1\r\n\tif (size == 512*1024)\r\n\t{\r\n\t\tINFO(\"ERROR: 32Mbit (512Kb) firmware not supported\\n\");\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n#endif\r\n\r\n\tdata = new u8 [size];\r\n\tif (!data)\r\n\t{\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (fread(data, 1, size, fp) != size)\r\n\t{\r\n\t\tdelete [] data;\r\n\t\tfclose(fp);\r\n\t\treturn false; \r\n\t}\r\n\r\n\tmemcpy(&header, data, sizeof(header));\r\n\tif ((header.fw_identifier & 0x00FFFFFF) != 0x0043414D)\r\n\t{\r\n\t\tdelete [] data;\r\n\t\tdata = NULL;\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tshift1 = ((header.shift_amounts >> 0) & 0x07);\r\n\tshift2 = ((header.shift_amounts >> 3) & 0x07);\r\n\tshift3 = ((header.shift_amounts >> 6) & 0x07);\r\n\tshift4 = ((header.shift_amounts >> 9) & 0x07);\r\n\r\n\t// todo - add support for 512Kb \r\n\tpart1addr = (header.part1_rom_boot9_addr << (2 + shift1));\r\n\tpart1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2)));\r\n\tpart2addr = (header.part2_rom_boot7_addr << (2+shift3));\r\n\tpart2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4)));\r\n\tpart3addr = (header.part3_rom_gui9_addr << 3);\r\n\tpart4addr = (header.part4_rom_wifi7_addr << 3);\r\n\tpart5addr = (header.part5_data_gfx_addr << 3);\r\n\r\n\tARM9bootAddr = part1ram;\r\n\tARM7bootAddr = part2ram;\r\n\r\n\tif(initKeycode(header.fw_identifier, 1, 0xC) == FALSE)\r\n\t{\r\n\t\tdelete [] data;\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n\r\n#if 0\r\n\tcrypt64BitDown((u32*)&data[0x18]);\r\n#else\r\n\t// fix touch coords\r\n\tdata[0x18] = 0x00;\r\n\tdata[0x19] = 0x00;\r\n\tdata[0x1A] = 0x00;\r\n\tdata[0x1B] = 0x00;\r\n\r\n\tdata[0x1C] = 0x00;\r\n\tdata[0x1D] = 0xFF;\r\n\tdata[0x1E] = 0x00;\r\n\tdata[0x1F] = 0x00;\r\n#endif\r\n\r\n\tif(initKeycode(header.fw_identifier, 2, 0xC) == FALSE)\r\n\t{\r\n\t\tdelete [] data;\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tsize9 = decrypt(data + part1addr, tmp_data9);\r\n\tif (!tmp_data9)\r\n\t{\r\n\t\tdelete [] data;\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tsize7 = decrypt(data + part2addr, tmp_data7);\r\n\tif (!tmp_data7)\r\n\t{\r\n\t\tdelete [] tmp_data9;\r\n\t\tdelete [] data;\r\n\t\tfclose(fp);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tu16 crc16_mine = getBootCodeCRC16();\r\n\r\n\tif (crc16_mine != header.part12_boot_crc16)\r\n\t{\r\n\t\tINFO(\"Firmware: ERROR: the boot code CRC16 (0x%04X) doesn't match the value in the firmware header (0x%04X)\", crc16_mine, header.part12_boot_crc16);\r\n\t\tdelete [] tmp_data9;\r\n\t\tdelete [] tmp_data7;\r\n\t\tdelete [] data;\r\n\t\tfclose(fp); \r\n\t\treturn false;\r\n\t}\r\n\r\n\t// Copy firmware boot codes to their respective locations\r\n\tsrc = 0;\r\n\tfor(u32 i = 0; i < (size9 >> 2); i++)\r\n\t{\r\n\t\t_MMU_write32<ARMCPU_ARM9>(part1ram, T1ReadLong(tmp_data9, src));\r\n\t\tsrc += 4; part1ram += 4;\r\n\t}\r\n\r\n\tsrc = 0;\r\n\tfor(u32 i = 0; i < (size7 >> 2); i++)\r\n\t{\r\n\t\t_MMU_write32<ARMCPU_ARM7>(part2ram, T1ReadLong(tmp_data7, src));\r\n\t\tsrc += 4; part2ram += 4;\r\n\t}\r\n\tdelete [] tmp_data7;\r\n\tdelete [] tmp_data9;\r\n\r\n\tpatched = false;\r\n\tif (data[0x17C] != 0xFF)\r\n\t\tpatched = true;\r\n\r\n\tINFO(\"Firmware:\\n\");\r\n\tINFO(\"- path: %s\\n\", CommonSettings.Firmware);\r\n\tINFO(\"- size: %i bytes (%i Mbit)\\n\", size, size/1024/8);\r\n\tINFO(\"- CRC : 0x%04X\\n\", header.part12_boot_crc16);\r\n\tINFO(\"- header: \\n\");\r\n\tINFO(\"   * size firmware %i\\n\", ((header.shift_amounts >> 12) & 0xF) * 128 * 1024);\r\n\tINFO(\"   * ARM9 boot code address:     0x%08X\\n\", part1addr);\r\n\tINFO(\"   * ARM9 boot code RAM address: 0x%08X\\n\", ARM9bootAddr);\r\n\tINFO(\"   * ARM9 unpacked size:         0x%08X (%i) bytes\\n\", size9, size9);\r\n\tINFO(\"   * ARM9 GUI code address:      0x%08X\\n\", part3addr);\r\n\tINFO(\"\\n\");\r\n\tINFO(\"   * ARM7 boot code address:     0x%08X\\n\", part2addr);\r\n\tINFO(\"   * ARM7 boot code RAM address: 0x%08X\\n\", ARM7bootAddr);\r\n\tINFO(\"   * ARM7 WiFi code address:     0x%08X\\n\", part4addr);\r\n\tINFO(\"   * ARM7 unpacked size:         0x%08X (%i) bytes\\n\", size7, size7);\r\n\tINFO(\"\\n\");\r\n\tINFO(\"   * Data/GFX address:           0x%08X\\n\", part5addr);\r\n\r\n\tif (patched)\r\n\t{\r\n\t\tu32 patch_offset = 0x3FC80;\r\n\t\tif (data[0x17C] > 1)\r\n\t\t\tpatch_offset = 0x3F680;\r\n\r\n\t\tmemcpy(&header, data + patch_offset, sizeof(header));\r\n\r\n\t\tshift1 = ((header.shift_amounts >> 0) & 0x07);\r\n\t\tshift2 = ((header.shift_amounts >> 3) & 0x07);\r\n\t\tshift3 = ((header.shift_amounts >> 6) & 0x07);\r\n\t\tshift4 = ((header.shift_amounts >> 9) & 0x07);\r\n\r\n\t\t// todo - add support for 512Kb \r\n\t\tpart1addr = (header.part1_rom_boot9_addr << (2 + shift1));\r\n\t\tpart1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2)));\r\n\t\tpart2addr = (header.part2_rom_boot7_addr << (2+shift3));\r\n\t\tpart2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4)));\r\n\r\n\t\tARM9bootAddr = part1ram;\r\n\t\tARM7bootAddr = part2ram;\r\n\r\n\t\tsize9 = decompress(data + part1addr, tmp_data9);\r\n\t\tif (!tmp_data9) \r\n\t\t{\r\n\t\t\tdelete [] data;\r\n\t\t\tfclose(fp);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tsize7 = decompress(data + part2addr, tmp_data7);\r\n\t\tif (!tmp_data7)\r\n\t\t{\r\n\t\t\tdelete [] tmp_data9;\r\n\t\t\tdelete [] data;\r\n\t\t\tfclose(fp);\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\t// Copy firmware boot codes to their respective locations\r\n\t\tsrc = 0;\r\n\t\tfor(u32 i = 0; i < (size9 >> 2); i++)\r\n\t\t{\r\n\t\t\t_MMU_write32<ARMCPU_ARM9>(part1ram, T1ReadLong(tmp_data9, src));\r\n\t\t\tsrc += 4; part1ram += 4;\r\n\t\t}\r\n\r\n\t\tsrc = 0;\r\n\t\tfor(u32 i = 0; i < (size7 >> 2); i++)\r\n\t\t{\r\n\t\t\t_MMU_write32<ARMCPU_ARM7>(part2ram, T1ReadLong(tmp_data7, src));\r\n\t\t\tsrc += 4; part2ram += 4;\r\n\t\t}\r\n\t\tdelete [] tmp_data7;\r\n\t\tdelete [] tmp_data9;\r\n\r\n\t\tINFO(\"\\nFlashme:\\n\");\r\n\t\tINFO(\"- header: \\n\");\r\n\t\tINFO(\"   * ARM9 boot code address:     0x%08X\\n\", part1addr);\r\n\t\tINFO(\"   * ARM9 boot code RAM address: 0x%08X\\n\", ARM9bootAddr);\r\n\t\tINFO(\"   * ARM9 unpacked size:         0x%08X (%i) bytes\\n\", size9, size9);\r\n\t\tINFO(\"\\n\");\r\n\t\tINFO(\"   * ARM7 boot code address:     0x%08X\\n\", part2addr);\r\n\t\tINFO(\"   * ARM7 boot code RAM address: 0x%08X\\n\", ARM7bootAddr);\r\n\t\tINFO(\"   * ARM7 unpacked size:         0x%08X (%i) bytes\\n\", size7, size7);\r\n\t}\r\n\r\n\t// Generate the path for the external firmware config file.\r\n\tstd::string extFilePath = CFIRMWARE::GetExternalFilePath();\r\n\tstrncpy(MMU.fw.userfile, extFilePath.c_str(), MAX_PATH);\r\n\r\n\tfclose(fp);\r\n\tfp = fopen(MMU.fw.userfile, \"rb\");\r\n\tif (fp)\r\n\t{\r\n\t\tfseek(fp, 0, SEEK_END);\r\n\t\tif (ftell(fp) == (0x100 + 0x1D6 + 0x300))\r\n\t\t{\r\n\t\t\tfseek(fp, 0, SEEK_SET);\r\n\t\t\tchar buf[0x301];\r\n\t\t\tmemset(buf, 0, sizeof(buf));\r\n\t\t\tif (fread(buf, 1, 0x100, fp) == 0x100)\r\n\t\t\t{\r\n\t\t\t\tprintf(\"- loaded firmware config from %s:\\n\", MMU.fw.userfile);\r\n\t\t\t\tmemcpy(&data[0x3FE00], &buf[0], 0x100);\r\n\t\t\t\tmemcpy(&data[0x3FF00], &buf[0], 0x100);\r\n\t\t\t\tprintf(\"   * User settings\\n\");\r\n\t\t\t\tmemset(buf, 0, sizeof(buf));\r\n\t\t\t\tif (fread(buf, 1, 0x1D6, fp) == 0x1D6)\r\n\t\t\t\t{\r\n\t\t\t\t\tmemcpy(&data[0x002A], &buf[0], 0x1D6);\r\n\t\t\t\t\tprintf(\"   * WiFi settings\\n\");\r\n\r\n\t\t\t\t\tmemset(buf, 0, sizeof(buf));\r\n\t\t\t\t\tif (fread(buf, 1, 0x300, fp) == 0x300)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmemcpy(&data[0x3FA00], &buf[0], 0x300);\r\n\t\t\t\t\t\tprintf(\"   * WiFi AP settings\\n\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t\tprintf(\"- failed loading firmware config from %s (wrong file size)\\n\", MMU.fw.userfile);\r\n\t\tfclose(fp);\r\n\t}\r\n\tprintf(\"\\n\");\r\n\r\n\t// TODO: add 512Kb support\r\n\tmemcpy(MMU.fw.data, data, 256*1024);\r\n\tMMU.fw.fp = NULL;\r\n\r\n\tdelete [] data; data = NULL;\r\n\treturn true;\r\n}\r\n\r\nstd::string CFIRMWARE::GetExternalFilePath()\r\n{\r\n\tstd::string fwPath = CommonSettings.Firmware;\r\n\tstd::string fwFileName = Path::GetFileNameFromPathWithoutExt(fwPath);\r\n\tstd::string configPath = path.pathToBattery;\r\n\tstd::string finalPath = configPath + DIRECTORY_DELIMITER_CHAR + fwFileName + FILE_EXT_DELIMITER_CHAR + FW_CONFIG_FILE_EXT;\r\n\r\n\treturn finalPath;\r\n}\r\n\r\n//=====================================================================================================\r\nstatic u32\r\ncalc_CRC16( u32 start, const u8 *data, int count) {\r\n\tint i,j;\r\n\tu32 crc = start & 0xffff;\r\n\tconst u16 val[8] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 };\r\n\tfor(i = 0; i < count; i++)\r\n\t{\r\n\t\tcrc = crc ^ data[i];\r\n\r\n\t\tfor(j = 0; j < 8; j++) {\r\n\t\t\tint do_bit = 0;\r\n\r\n\t\t\tif ( crc & 0x1)\r\n\t\t\t\tdo_bit = 1;\r\n\r\n\t\t\tcrc = crc >> 1;\r\n\r\n\t\t\tif ( do_bit) {\r\n\t\t\t\tcrc = crc ^ (val[j] << (7-j));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn crc;\r\n}\r\n\r\nint copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data)\r\n{\r\n\t/*\r\n\t* Determine which of the two user settings in the firmware is the current\r\n\t* and valid one and then copy this into the destination buffer.\r\n\t*\r\n\t* The current setting will have a greater count.\r\n\t* Settings are only valid if its CRC16 is correct.\r\n\t*/\r\n\tint user1_valid = 0;\r\n\tint user2_valid = 0;\r\n\tu32 user_settings_offset;\r\n\tu32 fw_crc;\r\n\tu32 crc;\r\n\tint copy_good = 0;\r\n\r\n\tuser_settings_offset = fw_data[0x20];\r\n\tuser_settings_offset |= fw_data[0x21] << 8;\r\n\tuser_settings_offset <<= 3;\r\n\r\n\tif ( user_settings_offset <= 0x3FE00) {\r\n\t\ts32 copy_settings_offset = -1;\r\n\r\n\t\tcrc = calc_CRC16( 0xffff, &fw_data[user_settings_offset],\r\n\t\t\tNDS_FW_USER_SETTINGS_MEM_BYTE_COUNT);\r\n\t\tfw_crc = fw_data[user_settings_offset + 0x72];\r\n\t\tfw_crc |= fw_data[user_settings_offset + 0x73] << 8;\r\n\t\tif ( crc == fw_crc) {\r\n\t\t\tuser1_valid = 1;\r\n\t\t}\r\n\r\n\t\tcrc = calc_CRC16( 0xffff, &fw_data[user_settings_offset + 0x100],\r\n\t\t\tNDS_FW_USER_SETTINGS_MEM_BYTE_COUNT);\r\n\t\tfw_crc = fw_data[user_settings_offset + 0x100 + 0x72];\r\n\t\tfw_crc |= fw_data[user_settings_offset + 0x100 + 0x73] << 8;\r\n\t\tif ( crc == fw_crc) {\r\n\t\t\tuser2_valid = 1;\r\n\t\t}\r\n\r\n\t\tif ( user1_valid) {\r\n\t\t\tif ( user2_valid) {\r\n\t\t\t\tu16 count1, count2;\r\n\r\n\t\t\t\tcount1 = fw_data[user_settings_offset + 0x70];\r\n\t\t\t\tcount1 |= fw_data[user_settings_offset + 0x71] << 8;\r\n\r\n\t\t\t\tcount2 = fw_data[user_settings_offset + 0x100 + 0x70];\r\n\t\t\t\tcount2 |= fw_data[user_settings_offset + 0x100 + 0x71] << 8;\r\n\r\n\t\t\t\tif ( count2 > count1) {\r\n\t\t\t\t\tcopy_settings_offset = user_settings_offset + 0x100;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcopy_settings_offset = user_settings_offset;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tcopy_settings_offset = user_settings_offset;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if ( user2_valid) {\r\n\t\t\t/* copy the second user settings */\r\n\t\t\tcopy_settings_offset = user_settings_offset + 0x100;\r\n\t\t}\r\n\r\n\t\tif ( copy_settings_offset > 0) {\r\n\t\t\tmemcpy( dest_buffer, &fw_data[copy_settings_offset],\r\n\t\t\t\tNDS_FW_USER_SETTINGS_MEM_BYTE_COUNT);\r\n\t\t\tcopy_good = 1;\r\n\t\t}\r\n\t}\r\n\r\n\treturn copy_good;\r\n}\r\n\r\nstatic void fill_user_data_area( struct NDS_fw_config_data *user_settings,u8 *data, int count)\r\n{\r\n\tu32 crc;\r\n\tint i;\r\n\tu8 *ts_cal_data_area;\r\n\r\n\tmemset( data, 0, 0x100);\r\n\r\n\t// version\r\n\tdata[0x00] = 5;\r\n\tdata[0x01] = 0;\r\n\r\n\t// colour\r\n\tdata[0x02] = user_settings->fav_colour;\r\n\r\n\t// birthday month and day\r\n\tdata[0x03] = user_settings->birth_month;\r\n\tdata[0x04] = user_settings->birth_day;\r\n\r\n\t//nickname and length\r\n\tfor ( i = 0; i < MAX_FW_NICKNAME_LENGTH; i++) {\r\n\t\tdata[0x06 + (i * 2)] = user_settings->nickname[i] & 0xff;\r\n\t\tdata[0x06 + (i * 2) + 1] = (user_settings->nickname[i] >> 8) & 0xff;\r\n\t}\r\n\r\n\tdata[0x1a] = user_settings->nickname_len;\r\n\r\n\t//Message\r\n\tfor ( i = 0; i < MAX_FW_MESSAGE_LENGTH; i++) {\r\n\t\tdata[0x1c + (i * 2)] = user_settings->message[i] & 0xff;\r\n\t\tdata[0x1c + (i * 2) + 1] = (user_settings->message[i] >> 8) & 0xff;\r\n\t}\r\n\r\n\tdata[0x50] = user_settings->message_len;\r\n\r\n\t//touch screen calibration\r\n\tts_cal_data_area = &data[0x58];\r\n\tfor ( i = 0; i < 2; i++) {\r\n\t\t// ADC x y\r\n\t\t*ts_cal_data_area++ = user_settings->touch_cal[i].adc_x & 0xff;\r\n\t\t*ts_cal_data_area++ = (user_settings->touch_cal[i].adc_x >> 8) & 0xff;\r\n\t\t*ts_cal_data_area++ = user_settings->touch_cal[i].adc_y & 0xff;\r\n\t\t*ts_cal_data_area++ = (user_settings->touch_cal[i].adc_y >> 8) & 0xff;\r\n\r\n\t\t//screen x y\r\n\t\t*ts_cal_data_area++ = user_settings->touch_cal[i].screen_x;\r\n\t\t*ts_cal_data_area++ = user_settings->touch_cal[i].screen_y;\r\n\t}\r\n\r\n\t//language and flags\r\n\tdata[0x64] = user_settings->language;\r\n\tdata[0x65] = 0xfc;\r\n\r\n\t//update count and crc\r\n\tdata[0x70] = count & 0xff;\r\n\tdata[0x71] = (count >> 8) & 0xff;\r\n\r\n\tcrc = calc_CRC16( 0xffff, data, 0x70);\r\n\tdata[0x72] = crc & 0xff;\r\n\tdata[0x73] = (crc >> 8) & 0xff;\r\n\r\n\tmemset( &data[0x74], 0xff, 0x100 - 0x74);\r\n}\r\n\r\n// creates an firmware flash image, which contains all needed info to initiate a wifi connection\r\nint NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings)\r\n{\r\n\t//Create the firmware header\r\n\r\n\tmemset( MMU.fw.data, 0, 0x40000);\r\n\r\n\t//firmware identifier\r\n\tMMU.fw.data[0x8] = 'M';\r\n\tMMU.fw.data[0x8 + 1] = 'A';\r\n\tMMU.fw.data[0x8 + 2] = 'C';\r\n\tMMU.fw.data[0x8 + 3] = 'P';\r\n\r\n\t// DS type\r\n\tif ( user_settings->ds_type == NDS_CONSOLE_TYPE_LITE)\r\n\t\tMMU.fw.data[0x1d] = 0x20;\r\n\telse\r\n\t\tMMU.fw.data[0x1d] = 0xff;\r\n\r\n\t//User Settings offset 0x3fe00 / 8\r\n\tMMU.fw.data[0x20] = 0xc0;\r\n\tMMU.fw.data[0x21] = 0x7f;\r\n\r\n\r\n\t//User settings (at 0x3FE00 and 0x3FF00)\r\n\r\n\tfill_user_data_area( user_settings, &MMU.fw.data[ 0x3FE00], 0);\r\n\tfill_user_data_area( user_settings, &MMU.fw.data[ 0x3FF00], 1);\r\n\r\n\t// Wifi config length\r\n\tMMU.fw.data[0x2C] = 0x38;\r\n\tMMU.fw.data[0x2D] = 0x01;\r\n\r\n\tMMU.fw.data[0x2E] = 0x00;\r\n\r\n\t//Wifi version\r\n\tMMU.fw.data[0x2F] = 0x00;\r\n\r\n\t//MAC address\r\n\tmemcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac));\r\n\r\n\t//Enabled channels\r\n\tMMU.fw.data[0x3C] = 0xFE;\r\n\tMMU.fw.data[0x3D] = 0x3F;\r\n\r\n\tMMU.fw.data[0x3E] = 0xFF;\r\n\tMMU.fw.data[0x3F] = 0xFF;\r\n\r\n\t//RF related\r\n\tMMU.fw.data[0x40] = 0x02;\r\n\tMMU.fw.data[0x41] = 0x18;\r\n\tMMU.fw.data[0x42] = 0x0C;\r\n\r\n\tMMU.fw.data[0x43] = 0x01;\r\n\r\n\t//Wifi I/O init values\r\n\tmemcpy((MMU.fw.data + 0x44), FW_WIFIInit, sizeof(FW_WIFIInit));\r\n\r\n\t//Wifi BB init values\r\n\tmemcpy((MMU.fw.data + 0x64), FW_BBInit, sizeof(FW_BBInit));\r\n\r\n\t//Wifi RF init values\r\n\tmemcpy((MMU.fw.data + 0xCE), FW_RFInit, sizeof(FW_RFInit));\r\n\r\n\t//Wifi channel-related init values\r\n\tmemcpy((MMU.fw.data + 0xF2), FW_RFChannel, sizeof(FW_RFChannel));\r\n\tmemcpy((MMU.fw.data + 0x146), FW_BBChannel, sizeof(FW_BBChannel));\r\n\tmemset((MMU.fw.data + 0x154), 0x10, 0xE);\r\n\r\n\t//WFC profiles\r\n\tmemcpy((MMU.fw.data + 0x3FA40), &FW_WFCProfile1, sizeof(FW_WFCProfile));\r\n\tmemcpy((MMU.fw.data + 0x3FB40), &FW_WFCProfile2, sizeof(FW_WFCProfile));\r\n\tmemcpy((MMU.fw.data + 0x3FC40), &FW_WFCProfile3, sizeof(FW_WFCProfile));\r\n\t(*(u16*)(MMU.fw.data + 0x3FAFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FA00), 0xFE);\r\n\t(*(u16*)(MMU.fw.data + 0x3FBFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FB00), 0xFE);\r\n\t(*(u16*)(MMU.fw.data + 0x3FCFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FC00), 0xFE);\r\n\r\n\r\n\tMMU.fw.data[0x162] = 0x19;\r\n\tmemset((MMU.fw.data + 0x163), 0xFF, 0x9D);\r\n\r\n\t//Wifi settings CRC16\r\n\t(*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138);\r\n\r\n\tif (&CommonSettings.fw_config != user_settings)\r\n\t\tmemcpy(&CommonSettings.fw_config, user_settings, sizeof(struct NDS_fw_config_data));\r\n\r\n\treturn TRUE ;\r\n}\r\n\r\nvoid NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config) {\r\n\tconst char *default_nickname = \"DeSmuME\";\r\n\tconst char *default_message = \"DeSmuME makes you happy!\";\r\n\tint i;\r\n\tint str_length;\r\n\r\n\tmemset( fw_config, 0, sizeof( struct NDS_fw_config_data));\r\n\tfw_config->ds_type = NDS_CONSOLE_TYPE_FAT;\r\n\r\n\tfw_config->fav_colour = 7;\r\n\r\n\tfw_config->birth_day = 23;\r\n\tfw_config->birth_month = 6;\r\n\r\n\tstr_length = strlen( default_nickname);\r\n\tfor ( i = 0; i < str_length; i++) {\r\n\t\tfw_config->nickname[i] = default_nickname[i];\r\n\t}\r\n\tfw_config->nickname_len = str_length;\r\n\r\n\tstr_length = strlen( default_message);\r\n\tfor ( i = 0; i < str_length; i++) {\r\n\t\tfw_config->message[i] = default_message[i];\r\n\t}\r\n\tfw_config->message_len = str_length;\r\n\r\n\t//default to English\r\n\tfw_config->language = 1;\r\n\r\n\t// default touchscreen calibration\r\n\r\n\t//ANCIENT DESMUME VALUES\r\n\tfw_config->touch_cal[0].adc_x = 0x200;\r\n\tfw_config->touch_cal[0].adc_y = 0x200;\r\n\tfw_config->touch_cal[0].screen_x = 0x20 + 1; // calibration screen coords are 1-based,\r\n\tfw_config->touch_cal[0].screen_y = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong.\r\n\t//VALUES FROM NOCASH\r\n\t//fw_config->touch_cal[0].adc_x = 0x02DF;\r\n\t//fw_config->touch_cal[0].adc_y = 0x032C;\r\n\t//fw_config->touch_cal[0].screen_x = 0x20;\r\n\t//fw_config->touch_cal[0].screen_y = 0x20;\r\n\r\n\t//ANCIENT DESMUME VALUES\r\n\tfw_config->touch_cal[1].adc_x = 0xe00;\r\n\tfw_config->touch_cal[1].adc_y = 0x800;\r\n\tfw_config->touch_cal[1].screen_x = 0xe0 + 1;\r\n\tfw_config->touch_cal[1].screen_y = 0x80 + 1;\r\n\t//VALUES FROM NOCASH\r\n\t//fw_config->touch_cal[1].adc_x = 0x0D3B;\r\n\t//fw_config->touch_cal[1].adc_y = 0x0CE7;\r\n\t//fw_config->touch_cal[1].screen_x = 0xE0;\r\n\t//fw_config->touch_cal[1].screen_y = 0xA0;\r\n}\r\n\r\nvoid NDS_PatchFirmwareMAC()\r\n{\r\n\tmemcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac));\r\n\t(*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138);\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/firmware.h",
    "content": "/*\r\n\tCopyright (C) 2009-2011 DeSmuME Team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _FIRMWARE_H_\r\n#define _FIRMWARE_H_\r\n#include \"common.h\"\r\n\r\n// the count of bytes copied from the firmware into memory \r\n#define NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT 0x70\r\n\r\n#define FW_CONFIG_FILE_EXT \"dfc\"\r\n\r\nclass CFIRMWARE\r\n{\r\nprivate:\r\n\tu8\t\t*tmp_data9;\r\n\tu8\t\t*tmp_data7;\r\n\tu32\t\tsize9, size7;\r\n\r\n\tu32\t\tkeyBuf[0x412];\r\n\tu32\t\tkeyCode[3];\r\n\r\n\tbool\tgetKeyBuf();\r\n\tvoid\tcrypt64BitUp(u32 *ptr);\r\n\tvoid\tcrypt64BitDown(u32 *ptr);\r\n\tvoid\tapplyKeycode(u32 modulo);\r\n\tbool\tinitKeycode(u32 idCode, int level, u32 modulo);\r\n\tu16\t\tgetBootCodeCRC16();\r\n\tu32\t\tdecrypt(const u8 *in, u8* &out);\r\n\tu32\t\tdecompress(const u8 *in, u8* &out);\r\n\r\npublic:\r\n\tCFIRMWARE(): size9(0), size7(0), ARM9bootAddr(0), ARM7bootAddr(0), patched(0) {};\r\n\t\r\n\tbool load();\r\n\r\n\tstatic std::string GetExternalFilePath();\r\n\r\n\tu32 getID()\r\n\t{\r\n\t\treturn header.fw_identifier;\r\n\t}\r\n\r\n\tstruct HEADER\r\n\t{\r\n\t\tu16\tpart3_rom_gui9_addr;\t\t// 000h\r\n\t\tu16\tpart4_rom_wifi7_addr;\t\t// 002h\r\n\t\tu16\tpart34_gui_wifi_crc16;\t\t// 004h\r\n\t\tu16\tpart12_boot_crc16;\t\t\t// 006h\r\n\t\tu32\tfw_identifier;\t\t\t\t// 008h\r\n\t\tu16\tpart1_rom_boot9_addr;\t\t// 00Ch\r\n\t\tu16\tpart1_ram_boot9_addr;\t\t// 00Eh\r\n\t\tu16\tpart2_rom_boot7_addr;\t\t// 010h\r\n\t\tu16\tpart2_ram_boot7_addr;\t\t// 012h\r\n\t\tu16\tshift_amounts;\t\t\t\t// 014h\r\n\t\tu16\tpart5_data_gfx_addr;\t\t// 016h\r\n\r\n\t\tu8\tfw_timestamp[5];\t\t\t// 018h\r\n\t\tu8\tconsole_type;\t\t\t\t// 01Dh\r\n\t\tu16\tunused1;\t\t\t\t\t// 01Eh\r\n\t\tu16\tuser_settings_offset;\t\t// 020h\r\n\t\tu16\tunknown1;\t\t\t\t\t// 022h\r\n\t\tu16\tunknown2;\t\t\t\t\t// 024h\r\n\t\tu16\tpart5_crc16;\t\t\t\t// 026h\r\n\t\tu16\tunused2;\t\t\t\t\t// 028h\t- FFh filled \r\n\t} header;\r\n\r\n\tu32\t\tARM9bootAddr;\r\n\tu32\t\tARM7bootAddr;\r\n\tbool\tpatched;\r\n};\r\n\r\nint copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data);\r\nint NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings);\r\nvoid NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config);\r\nvoid NDS_PatchFirmwareMAC();\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/fs-linux.cpp",
    "content": "/*  Copyright (C) 2006 Guillaume Duhamel\n\n    This file is part of DeSmuME\n\n    DeSmuME is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    DeSmuME is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with DeSmuME; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n*/\n\n#include \"fs.h\"\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <dirent.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\ntypedef struct {\n\tDIR * dir;\n\tchar * path;\n} FsLinuxDir;\n\nconst char FS_SEPARATOR = '/';\n\nvoid * FsReadFirst(const char * path, FsEntry * entry) {\n\tFsLinuxDir * dir;\n\tstruct dirent * e;\n\tstruct stat s;\n\tchar buffer[512+1]; /* DirSpec[256] + '/' + dirent.d_name[256] */\n\tDIR * tmp;\n\n\tdir = (FsLinuxDir*)malloc(sizeof(FsLinuxDir));\n\tif (!dir)\n\t\treturn NULL;\n\n\ttmp = opendir(path);\n\tif (!tmp) {\n\t\tfree(dir);\n\t\treturn NULL;\n\t}\n\tdir->dir = tmp;\n\n\te = readdir(tmp);\n\tif (!e) {\n\t\tclosedir(tmp);\n\t\tfree(dir);\n\t\treturn NULL;\n\t}\n\tstrcpy(entry->cFileName, e->d_name);\n\t// there's no 8.3 file names support on linux :)\n\tstrcpy(entry->cAlternateFileName, \"\");\n\tentry->flags = 0;\n\n\tdir->path = strdup(path);\n\tsprintf(buffer, \"%s/%s\", dir->path, e->d_name);\n\n\tstat(buffer, &s);\n\tif (S_ISDIR(s.st_mode)) {\n\t\tentry->flags = FS_IS_DIR;\n\t\tentry->fileSize = 0;\n\t} else {\n\t\tentry->fileSize = s.st_size;\n\t}\n\n\treturn dir;\n}\n\nint FsReadNext(void * search, FsEntry * entry) {\n\tFsLinuxDir * dir = (FsLinuxDir*)search;\n\tstruct dirent * e;\n\tstruct stat s;\n\tchar buffer[1024];\n\n\te = readdir(dir->dir);\n\tif (!e)\n\t\treturn 0;\n\n\tstrcpy(entry->cFileName, e->d_name);\n\t// there's no 8.3 file names support on linux :)\n\tstrcpy(entry->cAlternateFileName, \"\");\n\tentry->flags = 0;\n\n\tsprintf(buffer, \"%s/%s\", dir->path, e->d_name);\n\n\tstat(buffer, &s);\n\tif (S_ISDIR(s.st_mode)) {\n\t\tentry->flags = FS_IS_DIR;\n                entry->fileSize = 0;\n\t} else {\n          entry->fileSize = s.st_size;\n\t}\n\n\treturn 1;\n}\n\nvoid FsClose(void * search) {\n\tFsLinuxDir *linuxdir = (FsLinuxDir *) search; \n\tDIR * dir = linuxdir->dir;\n\n\tclosedir(dir);\n\tfree(linuxdir->path);\n\tfree(search);\n}\n\nint FsError(void) {\n\treturn 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/fs-windows.cpp",
    "content": "/*\n\tCopyright (C) 2006 Guillaume Duhamel\n\tCopyright (C) 2006-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"fs.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <windows.h>\n\nconst char FS_SEPARATOR = '\\\\';\n\nvoid * FsReadFirst(const char * p, FsEntry * entry) {\n\tWIN32_FIND_DATA FindFileData;\n\tHANDLE hFind;\n\tHANDLE * ret;\n\tchar path[1024];\n\tif (strlen(p)+3 >sizeof(path)) return NULL ;\n\n\tsprintf(path, \"%s\\\\*\", p);\n\n\thFind = FindFirstFile(path, &FindFileData);\n\tif (hFind == INVALID_HANDLE_VALUE)\n\t\treturn NULL;\n\n\tstrncpy(entry->cFileName, FindFileData.cFileName,256);\n\tentry->cFileName[255] = 0 ;\n\tstrncpy(entry->cAlternateFileName, FindFileData.cAlternateFileName,14);\n\tentry->cAlternateFileName[13] = 0 ;\n\tentry->flags = 0;\n\tif (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n\t\tentry->flags = FS_IS_DIR;\n                entry->fileSize = 0;\n\t} else {\n          entry->fileSize = FindFileData.nFileSizeLow;\n        }\n\n\tret = (void**)malloc(sizeof(HANDLE));\n\t*ret = hFind;\n\treturn ret;\n}\n\nint FsReadNext(void * search, FsEntry * entry) {\n\tWIN32_FIND_DATA FindFileData;\n\tHANDLE * h = (HANDLE *) search;\n\tint ret;\n\n\tret = FindNextFile(*h, &FindFileData);\n\n\tstrncpy(entry->cFileName, FindFileData.cFileName,256);\n\tentry->cFileName[255] = 0 ;\n\tstrncpy(entry->cAlternateFileName, FindFileData.cAlternateFileName,14);\n\tentry->cAlternateFileName[13] = 0 ;\n\tentry->flags = 0;\n\tif (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n\t\tentry->flags = FS_IS_DIR;\n                entry->fileSize = 0;\n\t} else {\n          entry->fileSize = FindFileData.nFileSizeLow;\n        }\n\n\treturn ret;\n}\n\nvoid FsClose(void * search) {\n\tFindClose(*((HANDLE *) search));\n}\n\nint FsError(void) {\n\tif (GetLastError() == ERROR_NO_MORE_FILES)\n\t\treturn FS_ERR_NO_MORE_FILES;\n\n\treturn FS_ERR_UNKNOWN;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/fs.h",
    "content": "/*\n\tCopyright (C) 2006 Guillaume Duhamel\n\tCopyright (C) 2007-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef FS_H\n#define FS_H\n\n#include \"types.h\"\n\n#define FS_IS_DIR 1\n\n#define FS_ERR_UNKNOWN -1\n#define FS_ERR_NO_MORE_FILES 1\n\nextern const char FS_SEPARATOR;\n\ntypedef struct {\n\tchar cFileName[256];\n\tchar cAlternateFileName[14];\n\tu32 flags;\n\tu32 fileSize;\n} FsEntry;\n\nvoid * FsReadFirst(const char * path, FsEntry * entry);\nint FsReadNext(void * search, FsEntry * entry);\nvoid FsClose(void * search);\nint FsError(void);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/gdbstub.h",
    "content": "/*\n\tCopyright (C) 2006 Ben Jaques\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _GDBSTUB_H_\n#define _GDBSTUB_H_ 1\n\n#include \"types.h\"\n\ntypedef void *gdbstub_handle_t;\n\n/*\n * The function interface\n */\n\ngdbstub_handle_t\ncreateStub_gdb( u16 port,\n                struct armcpu_memory_iface **cpu_memio,\n                struct armcpu_memory_iface *direct_memio);\n\nvoid\ndestroyStub_gdb( gdbstub_handle_t stub);\n\nvoid\nactivateStub_gdb( gdbstub_handle_t stub,\n                  struct armcpu_ctrl_iface *cpu_ctrl);\n\n  /*\n   * An implementation of the following functions is required\n   * for the GDB stub to function.\n   */\nvoid *\ncreateThread_gdb( void (WINAPI *thread_function)( void *data),\n                  void *thread_data);\n\nvoid\njoinThread_gdb( void *thread_handle);\n\n#endif /* End of _GDBSTUB_H_ */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/gfx3d.cpp",
    "content": "/*\t\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n//This file implements the geometry engine hardware component.\n//This handles almost all of the work of 3d rendering, leaving the renderer\n//plugin responsible only for drawing primitives.\n\n//#define FLUSHMODE_HACK\n\n//---------------\n//TODO TODO TODO TODO\n//make up mind once and for all whether fog, toon, etc. should reside in memory buffers (for easier handling in MMU)\n//if they do, then we need to copy them out in doFlush!!!\n//---------------\n\n#include <algorithm>\n#include <assert.h>\n#include <math.h>\n#include <string.h>\n#include \"armcpu.h\"\n#include \"debug.h\"\n#include \"gfx3d.h\"\n#include \"matrix.h\"\n#include \"bits.h\"\n#include \"MMU.h\"\n#include \"render3D.h\"\n#include \"mem.h\"\n#include \"types.h\"\n#include \"saves.h\"\n#include \"NDSSystem.h\"\n#include \"readwrite.h\"\n#include \"FIFO.h\"\n#include \"movie.h\" //only for currframecounter which really ought to be moved into the core emu....\n#include <queue>\n\n//#define _SHOW_VTX_COUNTERS\t// show polygon/vertex counters on screen\n#ifdef _SHOW_VTX_COUNTERS\nu32 max_polys, max_verts;\n#include \"GPU_OSD.h\"\n#endif\n\n\n/*\nthoughts on flush timing:\nI think a flush is supposed to queue up and wait to happen during vblank sometime.\nBut, we have some games that continue to do work after a flush but before a vblank.\nSince our timing is bad anyway, and we're not sure when the flush is really supposed to happen,\nthen this leaves us in a bad situation.\nWhat makes it worse is that if flush is supposed to be deferred, then we have to queue these\nerrant geometry commands. That would require a better gxfifo we have now, and some mechanism to block\nwhile the geometry engine is stalled (which doesnt exist).\nSince these errant games are nevertheless using flush command to represent the end of a frame, we deem this\na good time to execute an actual flush.\nI think we originally didnt do this because we found some game that it glitched, but that may have been\nresolved since then by deferring actual rendering to the next vcount=0 (giving textures enough time to upload).\nBut since we're not sure how we'll eventually want this, I am leaving it sort of reconfigurable, doing all the work\nin this function: */\nstatic void gfx3d_doFlush();\n\n#define GFX_NOARG_COMMAND 0x00\n#define GFX_INVALID_COMMAND 0xFF\n#define GFX_UNDEFINED_COMMAND 0xCC\nstatic const u8 gfx3d_commandTypes[] = {\n\t/* 00 */ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //invalid commands; no parameters\n\t/* 10 */ 0x01,0x00,0x01,0x01,0x01,0x00,0x10,0x0C, 0x10,0x0C,0x09,0x03,0x03,0xCC,0xCC,0xCC, //matrix commands\n\t/* 20 */ 0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0xCC,0xCC,0xCC,0xCC, //vertex and per-vertex material commands\n\t/* 30 */ 0x01,0x01,0x01,0x01,0x20,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //lighting engine material commands\n\t/* 40 */ 0x01,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //begin and end\n\t/* 50 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //swapbuffers\n\t/* 60 */ 0x01,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //viewport\n\t/* 70 */ 0x03,0x02,0x01,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, //tests\n\t//0x80:\n\t/* 80 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,\n\t/* 90 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,\n\t/* A0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,\n\t/* B0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,\n\t/* C0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,\n\t/* D0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,\n\t/* E0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,\n\t/* F0 */ 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC, 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC\n};\n\nclass GXF_Hardware\n{\npublic:\n\tGXF_Hardware()\n\t{\n\t\treset();\n\t}\n\tvoid reset() {\n\t\tcountdown = 0;\n\t\tcommandCursor = 4;\n\t\tfor(int i=0;i<4;i++) {\n\t\t\tcommandsPending[i].command = 0;\n\t\t\tcommandsPending[i].countdown = 0;\n\t\t}\n\t\tsize = 0;\n\t}\n\n\tvoid receive(u32 val) \n\t{\n\t\tif (size > 0)\n\t\t{\n\t\t\tGFX_FIFOsend(front().command, val);\n\t\t\tfront().countdown--;\n\t\t\tif (front().countdown == 0) \n\t\t\t{\n\t\t\t\tsize--; \n\t\t\t\tif (size == 0) return;\n\t\t\t\tdequeue();\n\n\t\t\t\twhile (gfx3d_commandTypes[front().command] == GFX_NOARG_COMMAND)\n\t\t\t\t{\n\t\t\t\t\tGFX_FIFOsend(front().command, 0);\n\t\t\t\t\tsize--; \n\t\t\t\t\tif (size == 0) break;\n\t\t\t\t\tdequeue();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (val == 0) return;\t// nop\n\n\t\t\tconst u8 commands[] = { val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF, (val>>24)&0xFF };\n\t\t\tconst u8 commandTypes[] = { gfx3d_commandTypes[commands[0]], gfx3d_commandTypes[commands[1]], gfx3d_commandTypes[commands[2]], gfx3d_commandTypes[commands[3]] };\n\n\t\t\tcommandCursor = 0;\n\t\t\tsize = 0;\n\n\t\t\t// A \"command without parameters\" is one of the four following commands:\n\t\t\t// - PushMatrix\n\t\t\t// - LoadIdentity\n\t\t\t// - End\n\t\t\t// - Commands undefined within the region between 0x10 and 0xFF\n\n\t\t\tfor (u8 i = 0; i < 4; i++)\n\t\t\t{\n\t\t\t\tif (commandTypes[i] == GFX_INVALID_COMMAND)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"gfx3D: invalid command (%02X)\\n\", commands[i]);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (commandTypes[i] == GFX_UNDEFINED_COMMAND)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"gfx3D: undefined command (%02X)\\n\", commands[i]);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcommandsPending[size].command = commands[i];\n\t\t\t\tcommandsPending[size].countdown = commandTypes[i];\n\t\t\t\t//printf(\"%i: CMD %02X size %i\\n\", i, commands[i], commandsPending[size].countdown);\n\t\t\t\tif ((commandsPending[size].countdown == 0) && (size == 0)) // cmd 0x11, 0x15, 0x41 - no params\n\t\t\t\t{\n\t\t\t\t\tGFX_FIFOsend(commands[i], 0);\n\n\t\t\t\t\twhile ((i < 4) && commands[i+1] != 0 && gfx3d_commandTypes[commands[i+1]] == GFX_NOARG_COMMAND)\n\t\t\t\t\t\tGFX_FIFOsend(commands[++i], 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsize++;\n\t\t\t}\n\t\t}\n\t}\n\n\tstruct CommandItem {\n\t\tu8 command, countdown;\n\t} commandsPending[4];\n\n\tu32 commandCursor;\n\tu8 countdown;\n\nprivate:\n\tvoid dequeue() { commandCursor++; }\n\tCommandItem& front() { return commandsPending[commandCursor]; }\n\tu32 size;\npublic:\n\n\tvoid savestate(EMUFILE *f)\n\t{\n\t\t//TODO - next time we invalidate savestates, simplify this format.\n\t\twrite32le(1,f); //version\n\t\twrite32le(size,f);\n\t\twrite32le(commandCursor,f);\n\t\tfor(u32 i=0;i<4;i++) write8le(commandsPending[i].command,f);\n\t\tfor(u32 i=0;i<4;i++) write8le(commandsPending[i].countdown,f);\n\t\twrite8le(countdown,f);\n\t}\n\t\n\tbool loadstate(EMUFILE *f)\n\t{\n\t\tu32 version;\n\t\tif(read32le(&version,f) != 1) return false;\n\t\tif(version > 1) return false;\n\n\t\tif (version == 0)\n\t\t{\n\t\t\tread32le(&size,f);\n\t\t\tcommandCursor = 4-size;\n\t\t\tfor(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i-commandCursor].command,f);\n\t\t\tread32le(&size,f);\n\t\t\tsize = 4-commandCursor;\n\t\t\tfor(u32 i=commandCursor;i<4;i++) read8le(&commandsPending[i-commandCursor].countdown,f);\n\t\t}\n\t\telse\n\t\tif (version == 1)\n\t\t{\n\t\t\tread32le(&size,f);\n\t\t\tread32le(&commandCursor,f);\n\t\t\tfor(u32 i=0;i<4;i++) read8le(&commandsPending[i].command,f);\n\t\t\tfor(u32 i=0;i<4;i++) read8le(&commandsPending[i].countdown,f);\n\t\t}\n\n\t\tread8le(&countdown,f);\n\n\t\treturn true;\n\t}\n\n} gxf_hardware;\n\n//these were 4 for the longest time (this is MUCH, MUCH less than their theoretical values)\n//but it was changed to 1 for strawberry shortcake, which was issuing direct commands \n//while the fifo was full, apparently expecting the fifo not to be full by that time.\n//in general we are finding that 3d takes less time than we think....\n//although maybe the true culprit was charging the cpu less time for the dma.\n#define GFX_DELAY(x) NDS_RescheduleGXFIFO(1);\n#define GFX_DELAY_M2(x) NDS_RescheduleGXFIFO(1);\n\nusing std::max;\nusing std::min;\n\nGFX3D gfx3d;\nViewer3d_State* viewer3d_state = NULL;\nstatic GFX3D_Clipper boxtestClipper;\n\n//tables that are provided to anyone\nCACHE_ALIGN u32 color_15bit_to_24bit_reverse[32768];\nCACHE_ALIGN u32 color_15bit_to_24bit[32768];\nCACHE_ALIGN u16 color_15bit_to_16bit_reverse[32768];\nCACHE_ALIGN u8 mixTable555[32][32][32];\nCACHE_ALIGN u32 dsDepthExtend_15bit_to_24bit[32768];\n\n//is this a crazy idea? this table spreads 5 bits evenly over 31 from exactly 0 to INT_MAX\nCACHE_ALIGN const int material_5bit_to_31bit[] = {\n\t0x00000000, 0x04210842, 0x08421084, 0x0C6318C6,\n\t0x10842108, 0x14A5294A, 0x18C6318C, 0x1CE739CE,\n\t0x21084210, 0x25294A52, 0x294A5294, 0x2D6B5AD6,\n\t0x318C6318, 0x35AD6B5A, 0x39CE739C, 0x3DEF7BDE,\n\t0x42108421, 0x46318C63, 0x4A5294A5, 0x4E739CE7,\n\t0x5294A529, 0x56B5AD6B, 0x5AD6B5AD, 0x5EF7BDEF,\n\t0x6318C631, 0x6739CE73, 0x6B5AD6B5, 0x6F7BDEF7,\n\t0x739CE739, 0x77BDEF7B, 0x7BDEF7BD, 0x7FFFFFFF\n};\n\nCACHE_ALIGN const u8 material_5bit_to_6bit[] = {\n\t0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E,\n\t0x10, 0x12, 0x14, 0x16, 0x19, 0x1A, 0x1C, 0x1E,\n\t0x21, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D, 0x2F,\n\t0x31, 0x33, 0x35, 0x37, 0x39, 0x3B, 0x3D, 0x3F\n};\n\nCACHE_ALIGN const u8 material_5bit_to_8bit[] = {\n\t0x00, 0x08, 0x10, 0x18, 0x21, 0x29, 0x31, 0x39,\n\t0x42, 0x4A, 0x52, 0x5A, 0x63, 0x6B, 0x73, 0x7B,\n\t0x84, 0x8C, 0x94, 0x9C, 0xA5, 0xAD, 0xB5, 0xBD,\n\t0xC6, 0xCE, 0xD6, 0xDE, 0xE7, 0xEF, 0xF7, 0xFF\n};\n\nCACHE_ALIGN const u8 material_3bit_to_8bit[] = {\n\t0x00, 0x24, 0x49, 0x6D, 0x92, 0xB6, 0xDB, 0xFF\n};\n\n//maybe not very precise\nCACHE_ALIGN const u8 material_3bit_to_5bit[] = {\n\t0, 4, 8, 13, 17, 22, 26, 31\n};\n\n//TODO - generate this in the static init method more accurately\nCACHE_ALIGN const u8 material_3bit_to_6bit[] = {\n\t0, 8, 16, 26, 34, 44, 52, 63\n};\n\n//private acceleration tables\nstatic float float16table[65536];\nstatic float float10Table[1024];\nstatic float float10RelTable[1024];\nstatic float normalTable[1024];\n\n#define fix2float(v)    (((float)((s32)(v))) / (float)(1<<12))\n#define fix10_2float(v) (((float)((s32)(v))) / (float)(1<<9))\n\nCACHE_ALIGN u8 gfx3d_convertedScreen[256*192*4];\n\n// Matrix stack handling\nCACHE_ALIGN MatrixStack\tmtxStack[4] = {\n\tMatrixStack(1, 0), // Projection stack\n\tMatrixStack(31, 1), // Coordinate stack\n\tMatrixStack(31, 2), // Directional stack\n\tMatrixStack(1, 3), // Texture stack\n};\n\nint _hack_getMatrixStackLevel(int which) { return mtxStack[which].position; }\n\n#ifdef GFX3D_USE_FLOAT\nstatic CACHE_ALIGN float\tmtxCurrent [4][16];\nstatic CACHE_ALIGN float\tmtxTemporal[16];\n#else\nstatic CACHE_ALIGN s32\t\tmtxCurrent [4][16];\nstatic CACHE_ALIGN s32\t\tmtxTemporal[16];\n#endif\nstatic u32 mode = 0;\n\n// Indexes for matrix loading/multiplication\nstatic u8 ML4x4ind = 0;\nstatic u8 ML4x3ind = 0;\nstatic u8 MM4x4ind = 0;\nstatic u8 MM4x3ind = 0;\nstatic u8 MM3x3ind = 0;\n\n// Data for vertex submission\nstatic CACHE_ALIGN s16\t\ts16coord[4] = {0, 0, 0, 0};\nstatic char\t\tcoordind = 0;\nstatic u32 vtxFormat = GFX3D_TRIANGLES;\nstatic BOOL inBegin = FALSE;\n\n// Data for basic transforms\n#ifdef GFX3D_USE_FLOAT\nstatic CACHE_ALIGN float\ttrans[4] = {0, 0, 0, 0};\n#else\nstatic CACHE_ALIGN s32\ttrans[4] = {0, 0, 0, 0};\n#endif\nstatic int\t\ttransind = 0;\n#ifdef GFX3D_USE_FLOAT\nstatic CACHE_ALIGN float\tscale[4] = {0, 0, 0, 0};\n#else\nstatic CACHE_ALIGN s32\tscale[4] = {0, 0, 0, 0};\n#endif\nstatic int\t\tscaleind = 0;\nstatic u32 viewport = 0;\n\n//various other registers\n#ifdef GFX3D_USE_FLOAT\nstatic float _t=0, _s=0;\nstatic float last_t, last_s;\n#else\nstatic s32 _t=0, _s=0;\nstatic s32 last_t, last_s;\n#endif\nstatic u32 clCmd = 0;\nstatic u32 clInd = 0;\n\nstatic u32 clInd2 = 0;\nBOOL isSwapBuffers = FALSE;\n\nstatic u32 BTind = 0;\nstatic u32 PTind = 0;\nstatic CACHE_ALIGN u16 BTcoords[6] = {0, 0, 0, 0, 0, 0};\nstatic CACHE_ALIGN float PTcoords[4] = {0.0, 0.0, 0.0, 1.0};\n\n//raw ds format poly attributes\nstatic u32 polyAttr=0,textureFormat=0, texturePalette=0, polyAttrPending=0;\n\n//the current vertex color, 5bit values\nstatic u8 colorRGB[4] = { 31,31,31,31 };\n\nu32 control = 0;\n\n//light state:\nstatic u32 lightColor[4] = {0,0,0,0};\nstatic s32 lightDirection[4] = {0,0,0,0};\n//material state:\nstatic u16 dsDiffuse, dsAmbient, dsSpecular, dsEmission;\n//used for indexing the shininess table during parameters to shininess command\nstatic int shininessInd = 0;\n\n\n//-----------cached things:\n//these dont need to go into the savestate. they can be regenerated from HW registers\n//from polygonattr:\nstatic unsigned int cullingMask=0;\nstatic u32 envMode=0;\nstatic u32 lightMask=0;\n//other things:\nstatic int texCoordinateTransform = 0;\n#ifdef GFX3D_USE_FLOAT\nstatic CACHE_ALIGN float cacheLightDirection[4][4];\nstatic CACHE_ALIGN float cacheHalfVector[4][4];\n#else\nstatic CACHE_ALIGN s32 cacheLightDirection[4][4];\nstatic CACHE_ALIGN s32 cacheHalfVector[4][4];\n#endif\n//------------------\n\n#define RENDER_FRONT_SURFACE 0x80\n#define RENDER_BACK_SURFACE 0X40\n\n\n//-------------poly and vertex lists and such things\nPOLYLIST* polylists = NULL;\nPOLYLIST* polylist = NULL;\nVERTLIST* vertlists = NULL;\nVERTLIST* vertlist = NULL;\nint\t\t\tpolygonListCompleted = 0;\n\nint listTwiddle = 1;\nint triStripToggle;\n\n//list-building state\nstruct tmpVertInfo {\n\t//the number of verts registered in this list\n\tint count;\n\t//indices to the main vert list\n\tint map[4];\n\t//indicates that the first poly in a list has been completed\n\tBOOL first;\n} tempVertInfo;\n\n\nstatic void twiddleLists() {\n\tlistTwiddle++;\n\tlistTwiddle &= 1;\n\tpolylist = &polylists[listTwiddle];\n\tvertlist = &vertlists[listTwiddle];\n\tpolylist->count = 0;\n\tvertlist->count = 0;\n}\n\nstatic BOOL flushPending = FALSE;\nstatic BOOL drawPending = FALSE;\n//------------------------------------------------------------\n\nstatic void makeTables() {\n\n\t//produce the color bits of a 24bpp color from a DS RGB15 using bit logic (internal use only)\n\t#define RGB15TO24_BITLOGIC(col) ( (material_5bit_to_8bit[((col)>>10)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[(col)&0x1F] )\n\t\n\t//produce the color bits of a 24bpp color from a DS RGB15 using bit logic (internal use only). RGB are reverse of usual\n\t#define RGB15TO24_BITLOGIC_REVERSE(col) ( (material_5bit_to_8bit[(col)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[((col)>>10)&0x1F] )\n\n\tfor(u16 i=0;i<32768;i++)\n\t{\n\t\tcolor_15bit_to_24bit[i] = LE_TO_LOCAL_32( RGB15TO24_BITLOGIC(i) );\n\t\tcolor_15bit_to_24bit_reverse[i] = LE_TO_LOCAL_32( RGB15TO24_BITLOGIC_REVERSE(i) );\n\t\tcolor_15bit_to_16bit_reverse[i] = (((i & 0x001F) << 11) | (material_5bit_to_6bit[(i & 0x03E0) >> 5] << 5) | ((i & 0x7C00) >> 10));\n\t\t\n\t\t// 15-bit to 24-bit depth formula from http://nocash.emubase.de/gbatek.htm#ds3drearplane\n\t\tdsDepthExtend_15bit_to_24bit[i] = LE_TO_LOCAL_32( (i*0x200)+((i+1)>>15)*0x01FF );\n\t}\n\n\tfor (int i = 0; i < 65536; i++)\n\t\tfloat16table[i] = fix2float((signed short)i);\n\n\tfor (int i = 0; i < 1024; i++)\n\t\tfloat10Table[i] = ((signed short)(i<<6)) / (float)(1<<12);\n\n\tfor (int i = 0; i < 1024; i++)\n\t\tfloat10RelTable[i] = ((signed short)(i<<6)) / (float)(1<<18);\n\n\tfor (int i = 0; i < 1024; i++)\n\t\tnormalTable[i] = ((signed short)(i<<6)) / (float)(1<<15);\n\n\tfor(int r=0;r<=31;r++) \n\t\tfor(int oldr=0;oldr<=31;oldr++) \n\t\t\tfor(int a=0;a<=31;a++)  {\n\t\t\t\tint temp = (r*a + oldr*(31-a)) / 31;\n\t\t\t\tmixTable555[a][r][oldr] = temp;\n\t\t\t}\n}\n\nvoid gfx3d_init()\n{\n\tgxf_hardware.reset();\n\t//gxf_hardware.test();\n\tint zzz=9;\n\n\t//DWORD start = timeGetTime();\n\t//for(int i=0;i<1000000000;i++)\n\t//\tMatrixMultVec4x4(mtxCurrent[0],mtxCurrent[1]);\n\t//DWORD end = timeGetTime();\n\t//DWORD diff = end-start;\n\n\t//start = timeGetTime();\n\t//for(int i=0;i<1000000000;i++)\n\t//\tMatrixMultVec4x4_b(mtxCurrent[0],mtxCurrent[1]);\n\t//end = timeGetTime();\n\t//DWORD diff2 = end-start;\n\n\t//printf(\"SPEED TEST %d %d\\n\",diff,diff2);\n\n\tif(polylists == NULL) { polylists = new POLYLIST[2]; polylist = &polylists[0]; }\n\tif(vertlists == NULL) { vertlists = new VERTLIST[2]; vertlist = &vertlists[0]; }\n\tmakeTables();\n\tgfx3d_reset();\n\n/*#ifdef GFX3D_USE_FLOAT\n\tINFO(\"GFX3D: USE_FLOAT\\n\");\n#else\n\tINFO(\"GFX3D: USE_FIXEDPOINT\\n\");\n#endif*/\n}\n\nvoid gfx3d_reset()\n{\n\tgpu3D->NDS_3D_RenderFinish();\n\t\n#ifdef _SHOW_VTX_COUNTERS\n\tmax_polys = max_verts = 0;\n#endif\n\n\treconstruct(&gfx3d);\n\tdelete viewer3d_state;\n\tviewer3d_state = new Viewer3d_State();\n\t\n\tgxf_hardware.reset();\n\n\tcontrol = 0;\n\tdrawPending = FALSE;\n\tflushPending = FALSE;\n\tmemset(polylists, 0, sizeof(POLYLIST)*2);\n\tmemset(vertlists, 0, sizeof(VERTLIST)*2);\n\tgfx3d.state.invalidateToon = true;\n\tlistTwiddle = 1;\n\ttwiddleLists();\n\tgfx3d.polylist = polylist;\n\tgfx3d.vertlist = vertlist;\n\n\tpolyAttr = 0;\n\ttextureFormat = 0;\n\ttexturePalette = 0;\n\tpolyAttrPending = 0;\n\tmode = 0;\n\ts16coord[0] = s16coord[1] = s16coord[2] = s16coord[3] = 0;\n\tcoordind = 0;\n\tvtxFormat = GFX3D_TRIANGLES;\n\tmemset(trans, 0, sizeof(trans));\n\ttransind = 0;\n\tmemset(scale, 0, sizeof(scale));\n\tscaleind = 0;\n\tviewport = 0;\n\tmemset(gxPIPE.cmd, 0, sizeof(gxPIPE.cmd));\n\tmemset(gxPIPE.param, 0, sizeof(gxPIPE.param));\n\tmemset(colorRGB, 0, sizeof(colorRGB));\n\tmemset(&tempVertInfo, 0, sizeof(tempVertInfo));\n\n\tMatrixInit (mtxCurrent[0]);\n\tMatrixInit (mtxCurrent[1]);\n\tMatrixInit (mtxCurrent[2]);\n\tMatrixInit (mtxCurrent[3]);\n\tMatrixInit (mtxTemporal);\n\n\tMatrixStackInit(&mtxStack[0]);\n\tMatrixStackInit(&mtxStack[1]);\n\tMatrixStackInit(&mtxStack[2]);\n\tMatrixStackInit(&mtxStack[3]);\n\n\tclCmd = 0;\n\tclInd = 0;\n\n\tML4x4ind = 0;\n\tML4x3ind = 0;\n\tMM4x4ind = 0;\n\tMM4x3ind = 0;\n\tMM3x3ind = 0;\n\n\tBTind = 0;\n\tPTind = 0;\n\n\t_t=0;\n\t_s=0;\n\tlast_t = 0;\n\tlast_s = 0;\n\tviewport = 0xBFFF0000;\n\n\tmemset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen));\n\n\tgfx3d.state.clearDepth = DS_DEPTH15TO24(0x7FFF);\n\t\n\tclInd2 = 0;\n\tisSwapBuffers = FALSE;\n\n\tGFX_PIPEclear();\n\tGFX_FIFOclear();\n}\n\n\n//================================================================================= Geometry Engine\n//=================================================================================\n//=================================================================================\n\nFORCEINLINE float vec3dot(float* a, float* b) {\n\treturn (((a[0]) * (b[0])) + ((a[1]) * (b[1])) + ((a[2]) * (b[2])));\n}\n\nFORCEINLINE s32 mul_fixed32(s32 a, s32 b)\n{\n\treturn fx32_shiftdown(fx32_mul(a,b));\n}\n\nFORCEINLINE s32 vec3dot_fixed32(const s32* a, const s32* b) {\n\treturn fx32_shiftdown(fx32_mul(a[0],b[0]) + fx32_mul(a[1],b[1]) + fx32_mul(a[2],b[2]));\n}\n\n#define SUBMITVERTEX(ii, nn) polylist->list[polylist->count].vertIndexes[ii] = tempVertInfo.map[nn];\n//Submit a vertex to the GE\nstatic void SetVertex()\n{\n#ifdef GFX3D_USE_FLOAT\n\tfloat coord[3] = {\n\t\t\tfloat16table[(u16)s16coord[0]],\n\t\t\tfloat16table[(u16)s16coord[1]],\n\t\t\tfloat16table[(u16)s16coord[2]]\n\t};\n\n\tDS_ALIGN(16) float coordTransformed[4] = { coord[0], coord[1], coord[2], 1.f };\n#else\n\ts32 coord[3] = {\n\t\ts16coord[0],\n\t\ts16coord[1],\n\t\ts16coord[2]\n\t};\n\n\tDS_ALIGN(16) s32 coordTransformed[4] = { coord[0], coord[1], coord[2], (1<<12) };\n#endif\n\tif (texCoordinateTransform == 3)\n\t{\n#ifdef GFX3D_USE_FLOAT\n\t\tlast_s =((coord[0]*mtxCurrent[3][0] +\n\t\t\t\t\tcoord[1]*mtxCurrent[3][4] +\n\t\t\t\t\tcoord[2]*mtxCurrent[3][8]) + _s * 16.0f) / 16.0f;\n\t\tlast_t =((coord[0]*mtxCurrent[3][1] +\n\t\t\t\t\tcoord[1]*mtxCurrent[3][5] +\n\t\t\t\t\tcoord[2]*mtxCurrent[3][9]) + _t * 16.0f) / 16.0f;\n#else\n\t\t//Tested by: Eledees The Adventures of Kai and Zero (E) [title screen and frontend menus]\n\t\tlast_s = (s32)(((s64)s16coord[0] * mtxCurrent[3][0] + \n\t\t\t\t\t\t\t\t(s64)s16coord[1] * mtxCurrent[3][4] + \n\t\t\t\t\t\t\t\t(s64)s16coord[2] * mtxCurrent[3][8] + \n\t\t\t\t\t\t\t\t(((s64)(_s))<<24))>>24);\n\t\tlast_t = (s32)(((s64)s16coord[0] * mtxCurrent[3][1] + \n\t\t\t\t\t\t\t\t(s64)s16coord[1] * mtxCurrent[3][5] + \n\t\t\t\t\t\t\t\t(s64)s16coord[2] * mtxCurrent[3][9] + \n\t\t\t\t\t\t\t\t(((s64)(_t))<<24))>>24);\n#endif\n\t}\n\n\t//refuse to do anything if we have too many verts or polys\n\tpolygonListCompleted = 0;\n\tif(vertlist->count >= VERTLIST_SIZE) \n\t\t\treturn;\n\tif(polylist->count >= POLYLIST_SIZE) \n\t\t\treturn;\n\t\n\t//TODO - think about keeping the clip matrix concatenated,\n\t//so that we only have to multiply one matrix here\n\t//(we could lazy cache the concatenated clip matrix and only generate it\n\t//when we need to)\n\tMatrixMultVec4x4_M2(mtxCurrent[0], coordTransformed);\n\n\t//printf(\"%f %f %f\\n\",s16coord[0]/4096.0f,s16coord[1]/4096.0f,s16coord[2]/4096.0f);\n\t//printf(\"x %f %f %f %f\\n\",mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f);\n\t//printf(\" = %f %f %f %f\\n\",coordTransformed[0]/4096.0f,coordTransformed[1]/4096.0f,coordTransformed[2]/4096.0f,coordTransformed[3]/4096.0f);\n\n\t//TODO - culling should be done here.\n\t//TODO - viewport transform?\n\n\tint continuation = 0;\n\tif(vtxFormat==GFX3D_TRIANGLE_STRIP && !tempVertInfo.first)\n\t\tcontinuation = 2;\n\telse if(vtxFormat==GFX3D_QUAD_STRIP && !tempVertInfo.first)\n\t\tcontinuation = 2;\n\n\t//record the vertex\n\t//VERT &vert = tempVertList.list[tempVertList.count];\n\tint vertIndex = vertlist->count + tempVertInfo.count - continuation;\n\tif(vertIndex<0) {\n\t\tprintf(\"wtf\\n\");\n\t}\n\tVERT &vert = vertlist->list[vertIndex];\n\n\t//printf(\"%f %f %f\\n\",coordTransformed[0],coordTransformed[1],coordTransformed[2]);\n\t//if(coordTransformed[1] > 20) \n\t//\tcoordTransformed[1] = 20;\n\n\t//printf(\"y-> %f\\n\",coord[1]);\n\n\t//if(mtxCurrent[1][14]>15) {\n\t//\tprintf(\"ACK!\\n\");\n\t//\tprintf(\"----> modelview 1 state for that ack:\\n\");\n\t//\t//MatrixPrint(mtxCurrent[1]);\n\t//}\n\n#ifdef GFX3D_USE_FLOAT\n\tvert.texcoord[0] = last_s;\n\tvert.texcoord[1] = last_t;\n\tvert.coord[0] = coordTransformed[0];\n\tvert.coord[1] = coordTransformed[1];\n\tvert.coord[2] = coordTransformed[2];\n\tvert.coord[3] = coordTransformed[3];\n#else\n\tvert.texcoord[0] = last_s/16.0f;\n\tvert.texcoord[1] = last_t/16.0f;\n\tvert.coord[0] = coordTransformed[0]/4096.0f;\n\tvert.coord[1] = coordTransformed[1]/4096.0f;\n\tvert.coord[2] = coordTransformed[2]/4096.0f;\n\tvert.coord[3] = coordTransformed[3]/4096.0f;\n#endif\n\tvert.color[0] = GFX3D_5TO6(colorRGB[0]);\n\tvert.color[1] = GFX3D_5TO6(colorRGB[1]);\n\tvert.color[2] = GFX3D_5TO6(colorRGB[2]);\n\ttempVertInfo.map[tempVertInfo.count] = vertlist->count + tempVertInfo.count - continuation;\n\ttempVertInfo.count++;\n\n\t//possibly complete a polygon\n\t{\n\t\tpolygonListCompleted = 2;\n\t\tswitch(vtxFormat) {\n\t\t\tcase GFX3D_TRIANGLES:\n\t\t\t\tif(tempVertInfo.count!=3)\n\t\t\t\t\tbreak;\n\t\t\t\tpolygonListCompleted = 1;\n\t\t\t\t//vertlist->list[polylist->list[polylist->count].vertIndexes[i] = vertlist->count++] = tempVertList.list[n];\n\t\t\t\tSUBMITVERTEX(0,0);\n\t\t\t\tSUBMITVERTEX(1,1);\n\t\t\t\tSUBMITVERTEX(2,2);\n\t\t\t\tvertlist->count+=3;\n\t\t\t\tpolylist->list[polylist->count].type = 3;\n\t\t\t\ttempVertInfo.count = 0;\n\t\t\t\tbreak;\n\t\t\tcase GFX3D_QUADS:\n\t\t\t\tif(tempVertInfo.count!=4)\n\t\t\t\t\tbreak;\n\t\t\t\tpolygonListCompleted = 1;\n\t\t\t\tSUBMITVERTEX(0,0);\n\t\t\t\tSUBMITVERTEX(1,1);\n\t\t\t\tSUBMITVERTEX(2,2);\n\t\t\t\tSUBMITVERTEX(3,3);\n\t\t\t\tvertlist->count+=4;\n\t\t\t\tpolylist->list[polylist->count].type = 4;\n\t\t\t\ttempVertInfo.count = 0;\n\t\t\t\tbreak;\n\t\t\tcase GFX3D_TRIANGLE_STRIP:\n\t\t\t\tif(tempVertInfo.count!=3)\n\t\t\t\t\tbreak;\n\t\t\t\tpolygonListCompleted = 1;\n\t\t\t\tSUBMITVERTEX(0,0);\n\t\t\t\tSUBMITVERTEX(1,1);\n\t\t\t\tSUBMITVERTEX(2,2);\n\t\t\t\tpolylist->list[polylist->count].type = 3;\n\n\t\t\t\tif(triStripToggle)\n\t\t\t\t\ttempVertInfo.map[1] = vertlist->count+2-continuation;\n\t\t\t\telse\n\t\t\t\t\ttempVertInfo.map[0] = vertlist->count+2-continuation;\n\t\t\t\t\n\t\t\t\tif(tempVertInfo.first)\n\t\t\t\t\tvertlist->count+=3;\n\t\t\t\telse\n\t\t\t\t\tvertlist->count+=1;\n\n\t\t\t\ttriStripToggle ^= 1;\n\t\t\t\ttempVertInfo.first = false;\n\t\t\t\ttempVertInfo.count = 2;\n\t\t\t\tbreak;\n\t\t\tcase GFX3D_QUAD_STRIP:\n\t\t\t\tif(tempVertInfo.count!=4)\n\t\t\t\t\tbreak;\n\t\t\t\tpolygonListCompleted = 1;\n\t\t\t\tSUBMITVERTEX(0,0);\n\t\t\t\tSUBMITVERTEX(1,1);\n\t\t\t\tSUBMITVERTEX(2,3);\n\t\t\t\tSUBMITVERTEX(3,2);\n\t\t\t\tpolylist->list[polylist->count].type = 4;\n\t\t\t\ttempVertInfo.map[0] = vertlist->count+2-continuation;\n\t\t\t\ttempVertInfo.map[1] = vertlist->count+3-continuation;\n\t\t\t\tif(tempVertInfo.first)\n\t\t\t\t\tvertlist->count+=4;\n\t\t\t\telse vertlist->count+=2;\n\t\t\t\ttempVertInfo.first = false;\n\t\t\t\ttempVertInfo.count = 2;\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\treturn;\n\t\t}\n\n\t\tif(polygonListCompleted == 1)\n\t\t{\n\t\t\tPOLY &poly = polylist->list[polylist->count];\n\t\t\t\n\t\t\tpoly.vtxFormat = vtxFormat;\n\n\t\t\t// Line segment detect\n\t\t\t// Tested\" Castlevania POR - warp stone, trajectory of ricochet, \"Eye of Decay\"\n\t\t\tif (!(textureFormat & (7 << 26)))\t// no texture\n\t\t\t{\n\t\t\t\tbool duplicated = false;\n\t\t\t\tVERT &vert0 = vertlist->list[poly.vertIndexes[0]];\n\t\t\t\tVERT &vert1 = vertlist->list[poly.vertIndexes[1]];\n\t\t\t\tVERT &vert2 = vertlist->list[poly.vertIndexes[2]];\n\t\t\t\tif ( (vert0.x == vert1.x) && (vert0.y == vert1.y) ) duplicated = true;\n\t\t\t\telse\n\t\t\t\t\tif ( (vert1.x == vert2.x) && (vert1.y == vert2.y) ) duplicated = true;\n\t\t\t\t\telse\n\t\t\t\t\t\tif ( (vert0.y == vert1.y) && (vert1.y == vert2.y) ) duplicated = true;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif ( (vert0.x == vert1.x) && (vert1.x == vert2.x) ) duplicated = true;\n\t\t\t\tif (duplicated)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"Line Segmet detected (poly type %i, mode %i, texparam %08X)\\n\", poly.type, poly.vtxFormat, textureFormat);\n\t\t\t\t\tpoly.vtxFormat = vtxFormat + 4;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpoly.polyAttr = polyAttr;\n\t\t\tpoly.texParam = textureFormat;\n\t\t\tpoly.texPalette = texturePalette;\n\t\t\tpoly.viewport = viewport;\n\t\t\tpolylist->count++;\n\t\t}\n\t}\n}\n\nstatic void gfx3d_glPolygonAttrib_cache()\n{\n\t// Light enable/disable\n\tlightMask = (polyAttr&0xF);\n\n\t// texture environment\n\tenvMode = (polyAttr&0x30)>>4;\n\n\t// back face culling\n\tcullingMask = (polyAttr>>6)&3;\n}\n\nstatic void gfx3d_glTexImage_cache()\n{\n\ttexCoordinateTransform = (textureFormat>>30);\n}\n\nstatic void gfx3d_glLightDirection_cache(int index)\n{\n#ifdef GFX3D_USE_FLOAT\n\ts32 v = lightDirection[index];\n\n\t// Convert format into floating point value\n\tcacheLightDirection[index][0] = normalTable[v&1023];\n\tcacheLightDirection[index][1] = normalTable[(v>>10)&1023];\n\tcacheLightDirection[index][2] = normalTable[(v>>20)&1023];\n\tcacheLightDirection[index][3] = 0;\n\n\t/* Multiply the vector by the directional matrix */\n\tMatrixMultVec3x3(mtxCurrent[2], cacheLightDirection[index]);\n\n\t/* Calculate the half vector */\n\tfloat lineOfSight[4] = {0.0f, 0.0f, -1.0f, 0.0f};\n\tfor(int i = 0; i < 4; i++)\n\t{\n\t\tcacheHalfVector[index][i] = ((cacheLightDirection[index][i] + lineOfSight[i]) / 2.0f);\n\t}\n#else\n\ts32 v = lightDirection[index];\n\n\ts16 x = ((v<<22)>>22)<<3;\n\ts16 y = ((v<<12)>>22)<<3;\n\ts16 z = ((v<<2)>>22)<<3;\n\n\tcacheLightDirection[index][0] = x;\n\tcacheLightDirection[index][1] = y;\n\tcacheLightDirection[index][2] = z;\n\tcacheLightDirection[index][3] = 0;\n\n\t//Multiply the vector by the directional matrix\n\tMatrixMultVec3x3_fixed(mtxCurrent[2], cacheLightDirection[index]);\n\n\t//Calculate the half angle vector\n\ts32 lineOfSight[4] = {0, 0, (-1)<<12, 0};\n\tfor(int i = 0; i < 4; i++)\n\t{\n\t\tcacheHalfVector[index][i] = ((cacheLightDirection[index][i] + lineOfSight[i]));\n\t}\n\n\t//normalize the half angle vector\n\t//can't believe the hardware really does this... but yet it seems...\n\ts32 halfLength = ((s32)(sqrt((double)vec3dot_fixed32(cacheHalfVector[index],cacheHalfVector[index]))))<<6;\n\n\tif(halfLength!=0)\n\t{\n\t\thalfLength = abs(halfLength);\n\t\thalfLength >>= 6;\n\t\tfor(int i = 0; i < 4; i++)\n\t\t{\n\t\t\ts32 temp = cacheHalfVector[index][i];\n\t\t\ttemp <<= 6;\n\t\t\ttemp /= halfLength;\n\t\t\tcacheHalfVector[index][i] = temp;\n\t\t}\n\t}\n#endif\n}\n\n\n//===============================================================================\nstatic void gfx3d_glMatrixMode(u32 v)\n{\n\tmode = (v&3);\n\n\tGFX_DELAY(1);\n}\n\nstatic void gfx3d_glPushMatrix()\n{\n\t//this command always works on both pos and vector when either pos or pos-vector are the current mtx mode\n\tshort mymode = (mode==1?2:mode);\n\n\tMatrixStackPushMatrix(&mtxStack[mymode], mtxCurrent[mymode]);\n\n\tGFX_DELAY(17);\n\n\tif(mymode==2)\n\t\tMatrixStackPushMatrix (&mtxStack[1], mtxCurrent[1]);\n}\n\nstatic void gfx3d_glPopMatrix(s32 i)\n{\n\t// The stack has only one level (at address 0) in projection mode, \n\t// in that mode, the parameter value is ignored, the offset is always +1 in that mode.\n\tif (mode == 0) i = 1;\n\n\t//this command always works on both pos and vector when either pos or pos-vector are the current mtx mode\n\tshort mymode = (mode==1?2:mode);\n\n\t//i = (i<<26)>>26;\n\t//previously, we sign extended here. that isnt really necessary since the stacks are apparently modularly addressed. so i am somewhat doubtful that this is a real concept.\n\t//example:\n\t//suppose we had a -30 that would be %100010.\n\t//which is the same as adding 34. if our stack was at 17 then one way is 17-30(+32)=19 and the other way is 17+34(-32)=19\n\t\n\t//please note that our ability to skip treating this as signed is dependent on the modular addressing later. if that ever changes, we need to change this back.\n\n\tMatrixStackPopMatrix(mtxCurrent[mymode], &mtxStack[mymode], i);\n\n\tGFX_DELAY(36);\n\n\tif (mymode == 2)\n\t\tMatrixStackPopMatrix(mtxCurrent[1], &mtxStack[1], i);\n}\n\nstatic void gfx3d_glStoreMatrix(u32 v)\n{\n\t//this command always works on both pos and vector when either pos or pos-vector are the current mtx mode\n\tshort mymode = (mode==1?2:mode);\n\n\t//limit height of these stacks.\n\t//without the mymode==3 namco classics galaxian will try to use pos=1 and overrun the stack, corrupting emu\n\tif(mymode==0 || mymode==3)\n\t\tv = 0;\n\n\tv &= 31;\n\n\t//according to gbatek, 31 works but sets the stack overflow flag\n\t//spider-man 2 tests this on the spiderman model (and elsewhere)\n\t//i am somewhat skeptical of this, but we'll leave it this way for now.\n\t//a test shouldnt be too hard\n\tif(v==31)\n\t\tMMU_new.gxstat.se = 1;\n\n\tMatrixStackLoadMatrix (&mtxStack[mymode], v, mtxCurrent[mymode]);\n\n\tGFX_DELAY(17);\n\n\tif(mymode==2)\n\t\tMatrixStackLoadMatrix (&mtxStack[1], v, mtxCurrent[1]);\n}\n\nstatic void gfx3d_glRestoreMatrix(u32 v)\n{\n\t//this command always works on both pos and vector when either pos or pos-vector are the current mtx mode\n\tshort mymode = (mode==1?2:mode);\n\n\t//limit height of these stacks\n\t//without the mymode==3 namco classics galaxian will try to use pos=1 and overrun the stack, corrupting emu\n\tif(mymode==0 || mymode==3)\n\t\tv = 0;\n\n\tv &= 31;\n\n\t//according to gbatek, 31 works but sets the stack overflow flag\n\t//spider-man 2 tests this on the spiderman model (and elsewhere)\n\t//i am somewhat skeptical of this, but we'll leave it this way for now.\n\t//a test shouldnt be too hard\n\tif(v==31)\n\t\tMMU_new.gxstat.se = 1;\n\n\n\tMatrixCopy (mtxCurrent[mymode], MatrixStackGetPos(&mtxStack[mymode], v));\n\n\tGFX_DELAY(36);\n\n\tif (mymode == 2)\n\t\tMatrixCopy (mtxCurrent[1], MatrixStackGetPos(&mtxStack[1], v));\n}\n\nstatic void gfx3d_glLoadIdentity()\n{\n\tMatrixIdentity (mtxCurrent[mode]);\n\n\tGFX_DELAY(19);\n\n\tif (mode == 2)\n\t\tMatrixIdentity (mtxCurrent[1]);\n\n\t//printf(\"identity: %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n}\n\nstatic BOOL gfx3d_glLoadMatrix4x4(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\tmtxCurrent[mode][ML4x4ind] = (float)((v<<4)>>4);\n#else\n\tmtxCurrent[mode][ML4x4ind] = v;\n#endif\n\n\t++ML4x4ind;\n\tif(ML4x4ind<16) return FALSE;\n\tML4x4ind = 0;\n\n\tGFX_DELAY(19);\n\n#ifdef GFX3D_USE_FLOAT\n\tvector_fix2float<4>(mtxCurrent[mode], 4096.f);\n#endif\n\n\tif (mode == 2)\n\t\tMatrixCopy (mtxCurrent[1], mtxCurrent[2]);\n\n\t//printf(\"load4x4: matrix %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n\treturn TRUE;\n}\n\nstatic BOOL gfx3d_glLoadMatrix4x3(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\tmtxCurrent[mode][ML4x3ind] = (float)((v<<4)>>4);\n#else\n\tmtxCurrent[mode][ML4x3ind] = v;\n#endif\n\n\tML4x3ind++;\n\tif((ML4x3ind & 0x03) == 3) ML4x3ind++;\n\tif(ML4x3ind<16) return FALSE;\n\tML4x3ind = 0;\n\n#ifdef GFX3D_USE_FLOAT\n\tvector_fix2float<4>(mtxCurrent[mode], 4096.f);\n#endif\n\n\t//fill in the unusued matrix values\n\tmtxCurrent[mode][3] = mtxCurrent[mode][7] = mtxCurrent[mode][11] = 0;\n#ifdef GFX3D_USE_FLOAT\n\tmtxCurrent[mode][15] = 1.f;\n#else\n\tmtxCurrent[mode][15] = (1<<12);\n#endif\n\n\tGFX_DELAY(30);\n\n\tif (mode == 2)\n\t\tMatrixCopy (mtxCurrent[1], mtxCurrent[2]);\n\t//printf(\"load4x3: matrix %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n\treturn TRUE;\n}\n\nstatic BOOL gfx3d_glMultMatrix4x4(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\tmtxTemporal[MM4x4ind] = (float)((v<<4)>>4);\n#else\n\tmtxTemporal[MM4x4ind] = v;\n#endif\n\n\tMM4x4ind++;\n\tif(MM4x4ind<16) return FALSE;\n\tMM4x4ind = 0;\n\n\tGFX_DELAY(35);\n\n#ifdef GFX3D_USE_FLOAT\n\tvector_fix2float<4>(mtxTemporal, 4096.f);\n#endif\n\n\tMatrixMultiply (mtxCurrent[mode], mtxTemporal);\n\n\tif (mode == 2)\n\t{\n\t\tMatrixMultiply (mtxCurrent[1], mtxTemporal);\n\t\tGFX_DELAY_M2(30);\n\t}\n\n\t//printf(\"mult4x4: matrix %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n\n\tMatrixIdentity (mtxTemporal);\n\treturn TRUE;\n}\n\nstatic BOOL gfx3d_glMultMatrix4x3(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\tmtxTemporal[MM4x3ind] = (float)((v<<4)>>4);\n#else\n\tmtxTemporal[MM4x3ind] = v;\n#endif\n\n\tMM4x3ind++;\n\tif((MM4x3ind & 0x03) == 3) MM4x3ind++;\n\tif(MM4x3ind<16) return FALSE;\n\tMM4x3ind = 0;\n\n\tGFX_DELAY(31);\n\n#ifdef GFX3D_USE_FLOAT\n\tvector_fix2float<4>(mtxTemporal, 4096.f);\n#endif\n\n\t//fill in the unusued matrix values\n\tmtxTemporal[3] = mtxTemporal[7] = mtxTemporal[11] = 0;\n#ifdef GFX3D_USE_FLOAT\n\tmtxTemporal[15] = 1.f;\n#else\n\tmtxTemporal[15] = 1<<12;\n#endif\n\n\tMatrixMultiply (mtxCurrent[mode], mtxTemporal);\n\n\tif (mode == 2)\n\t{\n\t\tMatrixMultiply (mtxCurrent[1], mtxTemporal);\n\t\tGFX_DELAY_M2(30);\n\t}\n\n\t//printf(\"mult4x3: matrix %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n\n\t//does this really need to be done?\n\tMatrixIdentity (mtxTemporal);\n\treturn TRUE;\n}\n\nstatic BOOL gfx3d_glMultMatrix3x3(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\tmtxTemporal[MM3x3ind] = (float)((v<<4)>>4);\n#else\n\tmtxTemporal[MM3x3ind] = v;\n#endif\n\n\tMM3x3ind++;\n\tif((MM3x3ind & 0x03) == 3) MM3x3ind++;\n\tif(MM3x3ind<12) return FALSE;\n\tMM3x3ind = 0;\n\n\tGFX_DELAY(28);\n\n#ifdef GFX3D_USE_FLOAT\n\tvector_fix2float<3>(mtxTemporal, 4096.f);\n#endif\n\n\t//fill in the unusued matrix values\n\tmtxTemporal[3] = mtxTemporal[7] = mtxTemporal[11] = 0;\n#ifdef GFX3D_USE_FLOAT\n\tmtxTemporal[15] = 1;\n#else\n\tmtxTemporal[15] = 1<<12;\n#endif\n\tmtxTemporal[12] = mtxTemporal[13] = mtxTemporal[14] = 0;\n\n\tMatrixMultiply (mtxCurrent[mode], mtxTemporal);\n\n\tif (mode == 2)\n\t{\n\t\tMatrixMultiply (mtxCurrent[1], mtxTemporal);\n\t\tGFX_DELAY_M2(30);\n\t}\n\n\t//printf(\"mult3x3: matrix %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n\n\n\t//does this really need to be done?\n\tMatrixIdentity (mtxTemporal);\n\treturn TRUE;\n}\n\nstatic BOOL gfx3d_glScale(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\tscale[scaleind] = fix2float(v);\n#else\n\tscale[scaleind] = v;\n#endif\n\t++scaleind;\n\n\tif(scaleind<3) return FALSE;\n\tscaleind = 0;\n\n\tMatrixScale (mtxCurrent[(mode==2?1:mode)], scale);\n\t//printf(\"scale: matrix %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n\n\tGFX_DELAY(22);\n\n\t//note: pos-vector mode should not cause both matrices to scale.\n\t//the whole purpose is to keep the vector matrix orthogonal\n\t//so, I am leaving this commented out as an example of what not to do.\n\t//if (mode == 2)\n\t//\tMatrixScale (mtxCurrent[1], scale);\n\treturn TRUE;\n}\n\nstatic BOOL gfx3d_glTranslate(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\ttrans[transind] = fix2float(v);\n#else\n\ttrans[transind] = v;\n#endif\n\t++transind;\n\n\tif(transind<3) return FALSE;\n\ttransind = 0;\n\n\tMatrixTranslate (mtxCurrent[mode], trans);\n\n\tGFX_DELAY(22);\n\n\tif (mode == 2)\n\t{\n\t\tMatrixTranslate (mtxCurrent[1], trans);\n\t\tGFX_DELAY_M2(30);\n\t}\n\n\t//printf(\"translate: matrix %d to: \\n\",mode); MatrixPrint(mtxCurrent[1]);\n\n\treturn TRUE;\n}\n\nstatic void gfx3d_glColor3b(u32 v)\n{\n\tcolorRGB[0] = (v&0x1F);\n\tcolorRGB[1] = ((v>>5)&0x1F);\n\tcolorRGB[2] = ((v>>10)&0x1F);\n\tGFX_DELAY(1);\n}\n\nstatic void gfx3d_glNormal(s32 v)\n{\n#ifdef GFX3D_USE_FLOAT\n\tDS_ALIGN(16) float normal[4] = { normalTable[v&1023],\n\t\t\t\t\t\tnormalTable[(v>>10)&1023],\n\t\t\t\t\t\tnormalTable[(v>>20)&1023],\n\t\t\t\t\t\t1};\n#else\n\ts16 nx = ((v<<22)>>22)<<3;\n\ts16 ny = ((v<<12)>>22)<<3;\n\ts16 nz = ((v<<2)>>22)<<3;\n\n\tCACHE_ALIGN s32 normal[4] =  { nx,ny,nz,(1<<12) };\n#endif\n\tif (texCoordinateTransform == 2)\n\t{\n#ifdef GFX3D_USE_FLOAT\n\t\tlast_s =(\t(normal[0] *mtxCurrent[3][0] + normal[1] *mtxCurrent[3][4] +\n\t\t\t\t\t normal[2] *mtxCurrent[3][8]) + (_s*16.0f)) / 16.0f;\n\t\tlast_t =(\t(normal[0] *mtxCurrent[3][1] + normal[1] *mtxCurrent[3][5] +\n\t\t\t\t\t normal[2] *mtxCurrent[3][9]) + (_t*16.0f)) / 16.0f;\n#else\n\t\t//SM64 highlight rendered star in main menu tests this\n\t\t//also smackdown 2010 player textures tested this (needed cast on _s and _t)\n\t\tlast_s = (s32)(((s64)normal[0] * mtxCurrent[3][0] + (s64)normal[1] * mtxCurrent[3][4] + (s64)normal[2] * mtxCurrent[3][8] + (((s64)_s)<<24))>>24);\n\t\tlast_t = (s32)(((s64)normal[0] * mtxCurrent[3][1] + (s64)normal[1] * mtxCurrent[3][5] + (s64)normal[2] * mtxCurrent[3][9] + (((s64)_t)<<24))>>24);\n#endif\n\t}\n\n#ifdef GFX3D_USE_FLOAT\n\tMatrixMultVec3x3 (mtxCurrent[2], normal);\n#else\n\tMatrixMultVec3x3_fixed(mtxCurrent[2],normal);\n#endif\n\n\t//apply lighting model\n\tu8 diffuse[3] = {\n\t\t(dsDiffuse)&0x1F,\n\t\t(dsDiffuse>>5)&0x1F,\n\t\t(dsDiffuse>>10)&0x1F };\n\n\tu8 ambient[3] = {\n\t\t(dsAmbient)&0x1F,\n\t\t(dsAmbient>>5)&0x1F,\n\t\t(dsAmbient>>10)&0x1F };\n\n\tu8 emission[3] = {\n\t\t(dsEmission)&0x1F,\n\t\t(dsEmission>>5)&0x1F,\n\t\t(dsEmission>>10)&0x1F };\n\n\tu8 specular[3] = {\n\t\t(dsSpecular)&0x1F,\n\t\t(dsSpecular>>5)&0x1F,\n\t\t(dsSpecular>>10)&0x1F };\n\n\tint vertexColor[3] = { emission[0], emission[1], emission[2] };\n\n\tfor(int i=0; i<4; i++)\n\t{\n\t\tif(!((lightMask>>i)&1)) continue;\n\n\t\tu8 _lightColor[3] = {\n\t\t\t(lightColor[i])&0x1F,\n\t\t\t(lightColor[i]>>5)&0x1F,\n\t\t\t(lightColor[i]>>10)&0x1F };\n\n#ifdef GFX3D_USE_FLOAT\n\t\tfloat diffuseLevel = std::max(0.0f, -vec3dot(cacheLightDirection[i], normal));\n\n\t\tfloat tempNegativeHalf[] = {-cacheHalfVector[i][0],-cacheHalfVector[i][1],-cacheHalfVector[i][2],-cacheHalfVector[i][3]};\n\t\tfloat shininessLevel = pow(std::max(0.0f, vec3dot(tempNegativeHalf, normal)), 2);\n#else\n\t\t//This formula is the one used by the DS\n\t\t//Reference : http://nocash.emubase.de/gbatek.htm#ds3dpolygonlightparameters\n\t\ts32 fixed_diffuse = std::max(0,-vec3dot_fixed32(cacheLightDirection[i],normal));\n\t\t\n\t\t//todo - this could be cached in this form\n\t\ts32 fixedTempNegativeHalf[] = {-cacheHalfVector[i][0],-cacheHalfVector[i][1],-cacheHalfVector[i][2],-cacheHalfVector[i][3]};\n\t\ts32 dot = vec3dot_fixed32(fixedTempNegativeHalf, normal);\n\n\t\ts32 fixedshininess = 0;\n\t\tif(dot>0) //prevent shininess on opposite side\n\t\t{\n\t\t\t//we have cos(a). it seems that we need cos(2a). trig identity is a fast way to get it.\n\t\t\t//cos^2(a)=(1/2)(1+cos(2a))\n\t\t\t//2*cos^2(a)-1=cos(2a)\n\t\t\tfixedshininess = 2*mul_fixed32(dot,dot)-4096;\n\t\t\t//gbatek is almost right but not quite!\n\t\t}\n\n\t\t//this seems to need to be saturated, or else the table will overflow.\n\t\t//even without a table, failure to saturate is bad news\n\t\tfixedshininess = std::min(fixedshininess,4095);\n\t\tfixedshininess = std::max(fixedshininess,0);\n#endif\n\t\tif(dsSpecular & 0x8000)\n\t\t{\n#ifdef GFX3D_USE_FLOAT\n\t\t\tint shininessIndex = (int)(shininessLevel * 128);\n\t\t\tif(shininessIndex >= (int)ARRAY_SIZE(gfx3d.state.shininessTable)) {\n\t\t\t\tshininessIndex = 0;\n\t\t\t}\n\t\t\tshininessLevel = gfx3d.state.shininessTable[shininessIndex];\n#else\n\t\t\t//shininess is 20.12 fixed point, so >>5 gives us .7 which is 128 entries\n\t\t\t//the entries are 8bits each so <<4 gives us .12 again, compatible with the lighting formulas below\n\t\t\t//(according to other normal nds procedures, we might should fill the bottom bits with 1 or 0 according to rules...)\n\t\t\tfixedshininess = gfx3d.state.shininessTable[fixedshininess>>5]<<4;\n#endif\n\t\t}\n\n\t\tfor(int c = 0; c < 3; c++)\n\t\t{\n#ifdef GFX3D_USE_FLOAT\n\t\t\tvertexColor[c] += (int)(((specular[c] * _lightColor[c] * shininessLevel)\n\t\t\t\t+ (diffuse[c] * _lightColor[c] * diffuseLevel)\n\t\t\t\t+ (ambient[c] * _lightColor[c])) / 31.0f);\n#else\n\t\t\ts32 specComp = ((specular[c] * _lightColor[c] * fixedshininess)>>17);  //5 bits for color*color and 12 bits for the shininess\n\t\t\ts32 diffComp = ((diffuse[c] * _lightColor[c] * fixed_diffuse)>>17); //5bits for the color*color and 12 its for the diffuse\n\t\t\ts32 ambComp = ((ambient[c] * _lightColor[c])>>5); //5bits for color*color\n\t\t\tvertexColor[c] += specComp + diffComp + ambComp;\n#endif\n\t\t}\n\t}\n\n\tfor(int c=0;c<3;c++)\n\t{\n\t\tcolorRGB[c] = std::min(31,vertexColor[c]);\n\t}\n\n\tGFX_DELAY(9);\n\tGFX_DELAY_M2((lightMask) & 0x01);\n\tGFX_DELAY_M2((lightMask>>1) & 0x01);\n\tGFX_DELAY_M2((lightMask>>2) & 0x01);\n\tGFX_DELAY_M2((lightMask>>3) & 0x01);\n}\n\nstatic void gfx3d_glTexCoord(s32 val)\n{\n#ifdef GFX3D_USE_FLOAT\n\t_s = ((val<<16)>>16);\n\t_t = (val>>16);\n\n\t_s /= 16.0f;\n\t_t /= 16.0f;\n#else\n\t_s = ((val<<16)>>16);\n\t_t = (val>>16);\n#endif\n\tif (texCoordinateTransform == 1)\n\t{\n#ifdef GFX3D_USE_FLOAT\n\t\tlast_s =_s*mtxCurrent[3][0] + _t*mtxCurrent[3][4] +\n\t\t\t\t0.0625f*mtxCurrent[3][8] + 0.0625f*mtxCurrent[3][12];\n\t\tlast_t =_s*mtxCurrent[3][1] + _t*mtxCurrent[3][5] +\n\t\t\t\t0.0625f*mtxCurrent[3][9] + 0.0625f*mtxCurrent[3][13];\n#else\n\t\t//dragon quest 4 overworld will test this\n\t\tlast_s = (s32)(((s64)(_s<<12) * mtxCurrent[3][0] + (s64)(_t<<12) * mtxCurrent[3][4] + ((s64)mtxCurrent[3][8]<<12) + ((s64)mtxCurrent[3][12]<<12))>>24);\n\t\tlast_t = (s32)(((s64)(_s<<12) * mtxCurrent[3][1] + (s64)(_t<<12) * mtxCurrent[3][5] + ((s64)mtxCurrent[3][9]<<12) + ((s64)mtxCurrent[3][13]<<12))>>24);\n#endif\n\t}\n\telse if(texCoordinateTransform == 0)\n\t{\n\t\tlast_s=_s;\n\t\tlast_t=_t;\n\t}\n\tGFX_DELAY(1);\n}\n\nstatic BOOL gfx3d_glVertex16b(s32 v)\n{\n\tif(coordind==0)\n\t{\n\t\ts16coord[0] = (v<<16)>>16;\n\t\ts16coord[1] = (v>>16)&0xFFFF;\n\n\t\t++coordind;\n\t\treturn FALSE;\n\t}\n\n\ts16coord[2] = (v<<16)>>16;\n\n\tcoordind = 0;\n\tSetVertex ();\n\n\tGFX_DELAY(9);\n\treturn TRUE;\n}\n\nstatic void gfx3d_glVertex10b(s32 v)\n{\n\t//TODO TODO TODO - contemplate the sign extension - shift in zeroes or ones? zeroes is certainly more normal..\n\ts16coord[0] = ((v<<22)>>22)<<6;\n\ts16coord[1] = ((v<<12)>>22)<<6;\n\ts16coord[2] = ((v<<2)>>22)<<6;\n\n\tGFX_DELAY(8);\n\tSetVertex ();\n}\n\ntemplate<int ONE, int TWO>\nstatic void gfx3d_glVertex3_cord(s32 v)\n{\n\ts16coord[ONE]\t\t= (v<<16)>>16;\n\ts16coord[TWO]\t\t= (v>>16);\n\n\tSetVertex ();\n\n\tGFX_DELAY(8);\n}\n\nstatic void gfx3d_glVertex_rel(s32 v)\n{\n\ts16 x = ((v<<22)>>22);\n\ts16 y = ((v<<12)>>22);\n\ts16 z = ((v<<2)>>22);\n\n\ts16coord[0] += x;\n\ts16coord[1] += y;\n\ts16coord[2] += z;\n\n\n\tSetVertex ();\n\n\tGFX_DELAY(8);\n}\n\nstatic void gfx3d_glPolygonAttrib (u32 val)\n{\n\tif(inBegin) {\n\t\t//PROGINFO(\"Set polyattr in the middle of a begin/end pair.\\n  (This won't be activated until the next begin)\\n\");\n\t\t//TODO - we need some some similar checking for teximageparam etc.\n\t}\n\tpolyAttrPending = val;\n\tGFX_DELAY(1);\n}\n\nstatic void gfx3d_glTexImage(u32 val)\n{\n\ttextureFormat = val;\n\tgfx3d_glTexImage_cache();\n\tGFX_DELAY(1);\n}\n\nstatic void gfx3d_glTexPalette(u32 val)\n{\n\ttexturePalette = val;\n\tGFX_DELAY(1);\n}\n\n/*\n\t0-4   Diffuse Reflection Red\n\t5-9   Diffuse Reflection Green\n\t10-14 Diffuse Reflection Blue\n\t15    Set Vertex Color (0=No, 1=Set Diffuse Reflection Color as Vertex Color)\n\t16-20 Ambient Reflection Red\n\t21-25 Ambient Reflection Green\n\t26-30 Ambient Reflection Blue\n*/\nstatic void gfx3d_glMaterial0(u32 val)\n{\n\tdsDiffuse = val&0xFFFF;\n\tdsAmbient = val>>16;\n\n\tif (BIT15(val))\n\t{\n\t\tcolorRGB[0] = (val)&0x1F;\n\t\tcolorRGB[1] = (val>>5)&0x1F;\n\t\tcolorRGB[2] = (val>>10)&0x1F;\n\t}\n\tGFX_DELAY(4);\n}\n\nstatic void gfx3d_glMaterial1(u32 val)\n{\n\tdsSpecular = val&0xFFFF;\n\tdsEmission = val>>16;\n\tGFX_DELAY(4);\n}\n\n/*\n\t0-9   Directional Vector's X component (1bit sign + 9bit fractional part)\n\t10-19 Directional Vector's Y component (1bit sign + 9bit fractional part)\n\t20-29 Directional Vector's Z component (1bit sign + 9bit fractional part)\n\t30-31 Light Number                     (0..3)\n*/\nstatic void gfx3d_glLightDirection (u32 v)\n{\n\tint index = v>>30;\n\n\tlightDirection[index] = (s32)(v&0x3FFFFFFF);\n\tgfx3d_glLightDirection_cache(index);\n\tGFX_DELAY(6);\n}\n\nstatic void gfx3d_glLightColor (u32 v)\n{\n\tint index = v>>30;\n\tlightColor[index] = v;\n\tGFX_DELAY(1);\n}\n\nstatic BOOL gfx3d_glShininess (u32 val)\n{\n#ifdef GFX3D_USE_FLOAT\n\tgfx3d.state.shininessTable[shininessInd++] = ((val & 0xFF) / 256.0f);\n\tgfx3d.state.shininessTable[shininessInd++] = (((val >> 8) & 0xFF) / 256.0f);\n\tgfx3d.state.shininessTable[shininessInd++] = (((val >> 16) & 0xFF) / 256.0f);\n\tgfx3d.state.shininessTable[shininessInd++] = (((val >> 24) & 0xFF) / 256.0f);\n#else\n\tgfx3d.state.shininessTable[shininessInd++] = ((val & 0xFF));\n\tgfx3d.state.shininessTable[shininessInd++] = (((val >> 8) & 0xFF));\n\tgfx3d.state.shininessTable[shininessInd++] = (((val >> 16) & 0xFF));\n\tgfx3d.state.shininessTable[shininessInd++] = (((val >> 24) & 0xFF));\n#endif\n\tif (shininessInd < 128) return FALSE;\n\tshininessInd = 0;\n\tGFX_DELAY(32);\n\treturn TRUE;\n}\n\nstatic void gfx3d_glBegin(u32 v)\n{\n\tinBegin = TRUE;\n\tvtxFormat = v&0x03;\n\ttriStripToggle = 0;\n\ttempVertInfo.count = 0;\n\ttempVertInfo.first = true;\n\tpolyAttr = polyAttrPending;\n\tgfx3d_glPolygonAttrib_cache();\n\tGFX_DELAY(1);\n}\n\nstatic void gfx3d_glEnd(void)\n{\n\ttempVertInfo.count = 0;\n\tinBegin = FALSE;\n\tGFX_DELAY(1);\n}\n\n// swap buffers - skipped\n\nstatic void gfx3d_glViewPort(u32 v)\n{\n\tviewport = v;\n\tGFX_DELAY(1);\n}\n\nstatic BOOL gfx3d_glBoxTest(u32 v)\n{\n\t//printf(\"boxtest\\n\");\n\tMMU_new.gxstat.tr = 0;\t\t// clear boxtest bit\n\tMMU_new.gxstat.tb = 1;\t\t// busy\n\n\tBTcoords[BTind++] = v & 0xFFFF;\n\tBTcoords[BTind++] = v >> 16;\n\n\tif (BTind < 5) return FALSE;\n\tBTind = 0;\n\n\tMMU_new.gxstat.tb = 0;\t\t// clear busy\n\tGFX_DELAY(103);\n\n#if 0\n\tINFO(\"BoxTEST: x %f y %f width %f height %f depth %f\\n\", \n\t\t\t\tBTcoords[0], BTcoords[1], BTcoords[2], BTcoords[3], BTcoords[4], BTcoords[5]);\n\t/*for (int i = 0; i < 16; i++)\n\t{\n\t\tINFO(\"mtx1[%i] = %f \", i, mtxCurrent[1][i]);\n\t\tif ((i+1) % 4 == 0) INFO(\"\\n\");\n\t}\n\tINFO(\"\\n\");*/\n#endif\n\n\t//(crafted to be clear, not fast.)\n\n\t//nanostray title, ff4, ice age 3 depend on this and work\n\t//garfields nightmare and strawberry shortcake DO DEPEND on the overflow behavior.\n\n\tu16 ux = BTcoords[0];\n\tu16 uy = BTcoords[1];\n\tu16 uz = BTcoords[2];\n\tu16 uw = BTcoords[3];\n\tu16 uh = BTcoords[4];\n\tu16 ud = BTcoords[5];\n\n\t//craft the coords by adding extents to startpoint\n\tfloat x = float16table[ux];\n\tfloat y = float16table[uy];\n\tfloat z = float16table[uz];\n\tfloat xw = float16table[(ux+uw)&0xFFFF]; //&0xFFFF not necessary for u16+u16 addition but added for emphasis\n\tfloat yh = float16table[(uy+uh)&0xFFFF];\n\tfloat zd = float16table[(uz+ud)&0xFFFF];\n\n\t//eight corners of cube\n\tVERT verts[8];\n\tverts[0].set_coord(x,y,z,1);\n\tverts[1].set_coord(xw,y,z,1);\n\tverts[2].set_coord(xw,yh,z,1);\n\tverts[3].set_coord(x,yh,z,1);\n\tverts[4].set_coord(x,y,zd,1);\n\tverts[5].set_coord(xw,y,zd,1);\n\tverts[6].set_coord(xw,yh,zd,1);\n\tverts[7].set_coord(x,yh,zd,1);\n\n\t//craft the faces of the box (clockwise)\n\tPOLY polys[6];\n\tpolys[0].setVertIndexes(7,6,5,4); //near \n\tpolys[1].setVertIndexes(0,1,2,3); //far\n\tpolys[2].setVertIndexes(0,3,7,4); //left\n\tpolys[3].setVertIndexes(6,2,1,5); //right\n\tpolys[4].setVertIndexes(3,2,6,7); //top\n\tpolys[5].setVertIndexes(0,4,5,1); //bottom\n\n\t//setup the clipper\n\tGFX3D_Clipper::TClippedPoly tempClippedPoly;\n\tboxtestClipper.clippedPolys = &tempClippedPoly;\n\tboxtestClipper.reset();\n\n\t////-----------------------------\n\t////awesome hack:\n\t////emit the box as geometry for testing\n\t//for(int i=0;i<6;i++) \n\t//{\n\t//\tPOLY* poly = &polys[i];\n\t//\tVERT* vertTable[4] = {\n\t//\t\t&verts[poly->vertIndexes[0]],\n\t//\t\t&verts[poly->vertIndexes[1]],\n\t//\t\t&verts[poly->vertIndexes[2]],\n\t//\t\t&verts[poly->vertIndexes[3]]\n\t//\t};\n\n\t//\tgfx3d_glBegin(1);\n\t//\tfor(int i=0;i<4;i++) {\n\t//\t\tcoord[0] = vertTable[i]->x;\n\t//\t\tcoord[1] = vertTable[i]->y;\n\t//\t\tcoord[2] = vertTable[i]->z;\n\t//\t\tSetVertex();\n\t//\t}\n\t//\tgfx3d_glEnd();\n\t//}\n\t////---------------------\n\n\t//transform all coords\n\tfor(int i=0;i<8;i++) {\n\t\t//MatrixMultVec4x4_M2(mtxCurrent[0], verts[i].coord);\n\n#ifdef GFX3D_USE_FLOAT\n\t\t_NOSSE_MatrixMultVec4x4(mtxCurrent[1],verts[i].coord);\n\t\t_NOSSE_MatrixMultVec4x4(mtxCurrent[0],verts[i].coord);\n#else\n\t\tCACHE_ALIGN float temp1[16] = {mtxCurrent[1][0]/4096.0f,mtxCurrent[1][1]/4096.0f,mtxCurrent[1][2]/4096.0f,mtxCurrent[1][3]/4096.0f,mtxCurrent[1][4]/4096.0f,mtxCurrent[1][5]/4096.0f,mtxCurrent[1][6]/4096.0f,mtxCurrent[1][7]/4096.0f,mtxCurrent[1][8]/4096.0f,mtxCurrent[1][9]/4096.0f,mtxCurrent[1][10]/4096.0f,mtxCurrent[1][11]/4096.0f,mtxCurrent[1][12]/4096.0f,mtxCurrent[1][13]/4096.0f,mtxCurrent[1][14]/4096.0f,mtxCurrent[1][15]/4096.0f};\n\t\tCACHE_ALIGN float temp0[16] = {mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f,mtxCurrent[0][4]/4096.0f,mtxCurrent[0][5]/4096.0f,mtxCurrent[0][6]/4096.0f,mtxCurrent[0][7]/4096.0f,mtxCurrent[0][8]/4096.0f,mtxCurrent[0][9]/4096.0f,mtxCurrent[0][10]/4096.0f,mtxCurrent[0][11]/4096.0f,mtxCurrent[0][12]/4096.0f,mtxCurrent[0][13]/4096.0f,mtxCurrent[0][14]/4096.0f,mtxCurrent[0][15]/4096.0f};\n\t\t_NOSSE_MatrixMultVec4x4(temp1,verts[i].coord);\n\t\t_NOSSE_MatrixMultVec4x4(temp0,verts[i].coord);\n#endif\n\t}\n\n\t//clip each poly\n\tfor(int i=0;i<6;i++) \n\t{\n\t\tPOLY* poly = &polys[i];\n\t\tVERT* vertTable[4] = {\n\t\t\t&verts[poly->vertIndexes[0]],\n\t\t\t&verts[poly->vertIndexes[1]],\n\t\t\t&verts[poly->vertIndexes[2]],\n\t\t\t&verts[poly->vertIndexes[3]]\n\t\t};\n\n\t\tboxtestClipper.clipPoly<false>(poly,vertTable);\n\t\t\n\t\t//if any portion of this poly was retained, then the test passes.\n\t\tif(boxtestClipper.clippedPolyCounter>0) {\n\t\t\t//printf(\"%06d PASS %d\\n\",boxcounter,gxFIFO.size);\n\t\t\tMMU_new.gxstat.tr = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(MMU_new.gxstat.tr == 0)\n\t{\n\t\t//printf(\"%06d FAIL %d\\n\",boxcounter,gxFIFO.size);\n\t}\n\t\n\treturn TRUE;\n}\n\nstatic BOOL gfx3d_glPosTest(u32 v)\n{\n\t//printf(\"postest\\n\");\n\t//this is apparently tested by transformers decepticons and ultimate spiderman\n\n\t//printf(\"POSTEST\\n\");\n\tMMU_new.gxstat.tb = 1;\n\n\tPTcoords[PTind++] = float16table[v & 0xFFFF];\n\tPTcoords[PTind++] = float16table[v >> 16];\n\n\tif (PTind < 3) return FALSE;\n\tPTind = 0;\n\t\n\tPTcoords[3] = 1.0f;\n\n#ifdef GFX3D_USE_FLOAT\n\tMatrixMultVec4x4(mtxCurrent[1], PTcoords);\n\tMatrixMultVec4x4(mtxCurrent[0], PTcoords);\n#else\n\tCACHE_ALIGN float temp1[16] = {mtxCurrent[1][0]/4096.0f,mtxCurrent[1][1]/4096.0f,mtxCurrent[1][2]/4096.0f,mtxCurrent[1][3]/4096.0f,mtxCurrent[1][4]/4096.0f,mtxCurrent[1][5]/4096.0f,mtxCurrent[1][6]/4096.0f,mtxCurrent[1][7]/4096.0f,mtxCurrent[1][8]/4096.0f,mtxCurrent[1][9]/4096.0f,mtxCurrent[1][10]/4096.0f,mtxCurrent[1][11]/4096.0f,mtxCurrent[1][12]/4096.0f,mtxCurrent[1][13]/4096.0f,mtxCurrent[1][14]/4096.0f,mtxCurrent[1][15]/4096.0f};\n\tCACHE_ALIGN float temp0[16] = {mtxCurrent[0][0]/4096.0f,mtxCurrent[0][1]/4096.0f,mtxCurrent[0][2]/4096.0f,mtxCurrent[0][3]/4096.0f,mtxCurrent[0][4]/4096.0f,mtxCurrent[0][5]/4096.0f,mtxCurrent[0][6]/4096.0f,mtxCurrent[0][7]/4096.0f,mtxCurrent[0][8]/4096.0f,mtxCurrent[0][9]/4096.0f,mtxCurrent[0][10]/4096.0f,mtxCurrent[0][11]/4096.0f,mtxCurrent[0][12]/4096.0f,mtxCurrent[0][13]/4096.0f,mtxCurrent[0][14]/4096.0f,mtxCurrent[0][15]/4096.0f};\n\n\tMatrixMultVec4x4(temp1, PTcoords);\n\tMatrixMultVec4x4(temp0, PTcoords);\n#endif\n\tMMU_new.gxstat.tb = 0;\n\n\tGFX_DELAY(9);\n\n\treturn TRUE;\n}\n\nstatic void gfx3d_glVecTest(u32 v)\n{\n\t//printf(\"vectest\\n\");\n\tGFX_DELAY(5);\n\n\t//this is tested by phoenix wright in its evidence inspector modelviewer\n\t//i am not sure exactly what it is doing, maybe it is testing to ensure\n\t//that the normal vector for the point of interest is camera-facing.\n\n\tCACHE_ALIGN float normal[4] = { normalTable[v&1023],\n\t\t\t\t\t\tnormalTable[(v>>10)&1023],\n\t\t\t\t\t\tnormalTable[(v>>20)&1023],\n\t\t\t\t\t\t0};\n\n#ifdef GFX3D_USE_FLOAT\n\tMatrixMultVec4x4(mtxCurrent[2], normal);\n#else\n\tCACHE_ALIGN float temp[16] = {mtxCurrent[2][0]/4096.0f,mtxCurrent[2][1]/4096.0f,mtxCurrent[2][2]/4096.0f,mtxCurrent[2][3]/4096.0f,mtxCurrent[2][4]/4096.0f,mtxCurrent[2][5]/4096.0f,mtxCurrent[2][6]/4096.0f,mtxCurrent[2][7]/4096.0f,mtxCurrent[2][8]/4096.0f,mtxCurrent[2][9]/4096.0f,mtxCurrent[2][10]/4096.0f,mtxCurrent[2][11]/4096.0f,mtxCurrent[2][12]/4096.0f,mtxCurrent[2][13]/4096.0f,mtxCurrent[2][14]/4096.0f,mtxCurrent[2][15]/4096.0f};\n\tMatrixMultVec4x4(temp, normal);\n#endif\n\ts16 x = (s16)(normal[0]*4096);\n\ts16 y = (s16)(normal[1]*4096);\n\ts16 z = (s16)(normal[2]*4096);\n\n\tMMU_new.gxstat.tb = 0;\t\t// clear busy\n\tT1WriteWord(MMU.MMU_MEM[0][0x40], 0x630, x);\n\tT1WriteWord(MMU.MMU_MEM[0][0x40], 0x632, y);\n\tT1WriteWord(MMU.MMU_MEM[0][0x40], 0x634, z);\n\n}\n//================================================================================= Geometry Engine\n//================================================================================= (end)\n//=================================================================================\n\nvoid VIEWPORT::decode(u32 v) \n{\n\tx = (v&0xFF);\n\ty = std::min(191,(int)(((v>>8)&0xFF)));\n\twidth = (((v>>16)&0xFF)+1)-(v&0xFF);\n\theight = ((v>>24)+1)-((v>>8)&0xFF);\n}\n\nvoid gfx3d_glFogColor(u32 v)\n{\n\tgfx3d.state.fogColor = v;\n}\n\nvoid gfx3d_glFogOffset (u32 v)\n{\n\tgfx3d.state.fogOffset = (v&0x7fff);\n}\n\nvoid gfx3d_glClearDepth(u32 v)\n{\n\tgfx3d.state.clearDepth = DS_DEPTH15TO24(v);\n}\n\n// Ignored for now\nvoid gfx3d_glSwapScreen(unsigned int screen)\n{\n}\n\nint gfx3d_GetNumPolys()\n{\n\t//so is this in the currently-displayed or currently-built list?\n\treturn (polylists[listTwiddle].count);\n}\n\nint gfx3d_GetNumVertex()\n{\n\t//so is this in the currently-displayed or currently-built list?\n\treturn (vertlists[listTwiddle].count);\n}\n\nvoid gfx3d_UpdateToonTable(u8 offset, u16 val)\n{\n\tgfx3d.state.invalidateToon = true;\n\tgfx3d.state.u16ToonTable[offset] = val;\n\t//printf(\"toon %d set to %04X\\n\",offset,val);\n}\n\nvoid gfx3d_UpdateToonTable(u8 offset, u32 val)\n{\n\t//C.O.P. sets toon table via this method\n\tgfx3d.state.invalidateToon = true;\n\tgfx3d.state.u16ToonTable[offset] = val & 0xFFFF;\n\tgfx3d.state.u16ToonTable[offset+1] = val >> 16;\n\t//printf(\"toon %d set to %04X\\n\",offset,gfx3d.state.u16ToonTable[offset]);\n\t//printf(\"toon %d set to %04X\\n\",offset+1,gfx3d.state.u16ToonTable[offset+1]);\n}\n\ns32 gfx3d_GetClipMatrix (unsigned int index)\n{\n#ifdef GFX3D_USE_FLOAT\n\tfloat val = MatrixGetMultipliedIndex (index, mtxCurrent[0], mtxCurrent[1]);\n\n\tval *= (1<<12);\n#else\n\ts32 val = MatrixGetMultipliedIndex (index, mtxCurrent[0], mtxCurrent[1]);\n#endif\n\t//printf(\"reading clip matrix: %d\\n\",index);\n\n\treturn (s32)val;\n}\n\ns32 gfx3d_GetDirectionalMatrix (unsigned int index)\n{\n\tint _index = (((index / 3) * 4) + (index % 3));\n\n#ifdef GFX3D_USE_FLOAT\n\treturn (s32)(mtxCurrent[2][_index]*(1<<12));\n#else\n\treturn mtxCurrent[2][_index];\n#endif\n}\n\nvoid gfx3d_glAlphaFunc(u32 v)\n{\n\tgfx3d.state.alphaTestRef = v&31;\n}\n\nunsigned int gfx3d_glGetPosRes(unsigned int index)\n{\n\treturn (unsigned int)(PTcoords[index] * 4096.0f);\n}\n\n//#define _3D_LOG_EXEC\n#ifdef _3D_LOG_EXEC\nstatic void log3D(u8 cmd, u32 param)\n{\n\tINFO(\"3D command 0x%02X: \", cmd);\n\tswitch (cmd)\n\t\t{\n\t\t\tcase 0x10:\t\t// MTX_MODE - Set Matrix Mode (W)\n\t\t\t\tprintf(\"MTX_MODE(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x11:\t\t// MTX_PUSH - Push Current Matrix on Stack (W)\n\t\t\t\tprintf(\"MTX_PUSH()\\t\");\n\t\t\tbreak;\n\t\t\tcase 0x12:\t\t// MTX_POP - Pop Current Matrix from Stack (W)\n\t\t\t\tprintf(\"MTX_POP(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x13:\t\t// MTX_STORE - Store Current Matrix on Stack (W)\n\t\t\t\tprintf(\"MTX_STORE(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x14:\t\t// MTX_RESTORE - Restore Current Matrix from Stack (W)\n\t\t\t\tprintf(\"MTX_RESTORE(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x15:\t\t// MTX_IDENTITY - Load Unit Matrix to Current Matrix (W)\n\t\t\t\tprintf(\"MTX_IDENTIFY()\\t\");\n\t\t\tbreak;\n\t\t\tcase 0x16:\t\t// MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W)\n\t\t\t\tprintf(\"MTX_LOAD_4x4(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x17:\t\t// MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W)\n\t\t\t\tprintf(\"MTX_LOAD_4x3(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x18:\t\t// MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W)\n\t\t\t\tprintf(\"MTX_MULT_4x4(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x19:\t\t// MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W)\n\t\t\t\tprintf(\"MTX_MULT_4x3(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x1A:\t\t// MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W)\n\t\t\t\tprintf(\"MTX_MULT_3x3(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x1B:\t\t// MTX_SCALE - Multiply Current Matrix by Scale Matrix (W)\n\t\t\t\tprintf(\"MTX_SCALE(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x1C:\t\t// MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W)\n\t\t\t\tprintf(\"MTX_TRANS(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x20:\t\t// COLOR - Directly Set Vertex Color (W)\n\t\t\t\tprintf(\"COLOR(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x21:\t\t// NORMAL - Set Normal Vector (W)\n\t\t\t\tprintf(\"NORMAL(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x22:\t\t// TEXCOORD - Set Texture Coordinates (W)\n\t\t\t\tprintf(\"TEXCOORD(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x23:\t\t// VTX_16 - Set Vertex XYZ Coordinates (W)\n\t\t\t\tprintf(\"VTX_16(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x24:\t\t// VTX_10 - Set Vertex XYZ Coordinates (W)\n\t\t\t\tprintf(\"VTX_10(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x25:\t\t// VTX_XY - Set Vertex XY Coordinates (W)\n\t\t\t\tprintf(\"VTX_XY(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x26:\t\t// VTX_XZ - Set Vertex XZ Coordinates (W)\n\t\t\t\tprintf(\"VTX_XZ(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x27:\t\t// VTX_YZ - Set Vertex YZ Coordinates (W)\n\t\t\t\tprintf(\"VTX_YZ(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x28:\t\t// VTX_DIFF - Set Relative Vertex Coordinates (W)\n\t\t\t\tprintf(\"VTX_DIFF(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x29:\t\t// POLYGON_ATTR - Set Polygon Attributes (W)\n\t\t\t\tprintf(\"POLYGON_ATTR(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x2A:\t\t// TEXIMAGE_PARAM - Set Texture Parameters (W)\n\t\t\t\tprintf(\"TEXIMAGE_PARAM(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x2B:\t\t// PLTT_BASE - Set Texture Palette Base Address (W)\n\t\t\t\tprintf(\"PLTT_BASE(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x30:\t\t// DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W)\n\t\t\t\tprintf(\"DIF_AMB(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x31:\t\t// SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W)\n\t\t\t\tprintf(\"SPE_EMI(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x32:\t\t// LIGHT_VECTOR - Set Light's Directional Vector (W)\n\t\t\t\tprintf(\"LIGHT_VECTOR(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x33:\t\t// LIGHT_COLOR - Set Light Color (W)\n\t\t\t\tprintf(\"LIGHT_COLOR(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x34:\t\t// SHININESS - Specular Reflection Shininess Table (W)\n\t\t\t\tprintf(\"SHININESS(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x40:\t\t// BEGIN_VTXS - Start of Vertex List (W)\n\t\t\t\tprintf(\"BEGIN_VTXS(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x41:\t\t// END_VTXS - End of Vertex List (W)\n\t\t\t\tprintf(\"END_VTXS()\\t\");\n\t\t\tbreak;\n\t\t\tcase 0x50:\t\t// SWAP_BUFFERS - Swap Rendering Engine Buffer (W)\n\t\t\t\tprintf(\"SWAP_BUFFERS(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x60:\t\t// VIEWPORT - Set Viewport (W)\n\t\t\t\tprintf(\"VIEWPORT(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x70:\t\t// BOX_TEST - Test if Cuboid Sits inside View Volume (W)\n\t\t\t\tprintf(\"BOX_TEST(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x71:\t\t// POS_TEST - Set Position Coordinates for Test (W)\n\t\t\t\tprintf(\"POS_TEST(%08X)\", param);\n\t\t\tbreak;\n\t\t\tcase 0x72:\t\t// VEC_TEST - Set Directional Vector for Test (W)\n\t\t\t\tprintf(\"VEC_TEST(%08X)\", param);\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tINFO(\"!!! Unknown(%08X)\", param);\n\t\t\tbreak;\n\t\t}\n\t\tprintf(\"\\t\\t(FIFO size %i)\\n\", gxFIFO.size);\n}\n#endif\n\nstatic void gfx3d_execute(u8 cmd, u32 param)\n{\n#ifdef _3D_LOG_EXEC\n\tlog3D(cmd, param);\n#endif\n\n\tswitch (cmd)\n\t{\n\t\tcase 0x10:\t\t// MTX_MODE - Set Matrix Mode (W)\n\t\t\tgfx3d_glMatrixMode(param);\n\t\tbreak;\n\t\tcase 0x11:\t\t// MTX_PUSH - Push Current Matrix on Stack (W)\n\t\t\tgfx3d_glPushMatrix();\n\t\tbreak;\n\t\tcase 0x12:\t\t// MTX_POP - Pop Current Matrix from Stack (W)\n\t\t\tgfx3d_glPopMatrix(param);\n\t\tbreak;\n\t\tcase 0x13:\t\t// MTX_STORE - Store Current Matrix on Stack (W)\n\t\t\tgfx3d_glStoreMatrix(param);\n\t\tbreak;\n\t\tcase 0x14:\t\t// MTX_RESTORE - Restore Current Matrix from Stack (W)\n\t\t\tgfx3d_glRestoreMatrix(param);\n\t\tbreak;\n\t\tcase 0x15:\t\t// MTX_IDENTITY - Load Unit Matrix to Current Matrix (W)\n\t\t\tgfx3d_glLoadIdentity();\n\t\tbreak;\n\t\tcase 0x16:\t\t// MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W)\n\t\t\tgfx3d_glLoadMatrix4x4(param);\n\t\tbreak;\n\t\tcase 0x17:\t\t// MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W)\n\t\t\tgfx3d_glLoadMatrix4x3(param);\n\t\tbreak;\n\t\tcase 0x18:\t\t// MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W)\n\t\t\tgfx3d_glMultMatrix4x4(param);\n\t\tbreak;\n\t\tcase 0x19:\t\t// MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W)\n\t\t\tgfx3d_glMultMatrix4x3(param);\n\t\tbreak;\n\t\tcase 0x1A:\t\t// MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W)\n\t\t\tgfx3d_glMultMatrix3x3(param);\n\t\tbreak;\n\t\tcase 0x1B:\t\t// MTX_SCALE - Multiply Current Matrix by Scale Matrix (W)\n\t\t\tgfx3d_glScale(param);\n\t\tbreak;\n\t\tcase 0x1C:\t\t// MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W)\n\t\t\tgfx3d_glTranslate(param);\n\t\tbreak;\n\t\tcase 0x20:\t\t// COLOR - Directly Set Vertex Color (W)\n\t\t\tgfx3d_glColor3b(param);\n\t\tbreak;\n\t\tcase 0x21:\t\t// NORMAL - Set Normal Vector (W)\n\t\t\tgfx3d_glNormal(param);\n\t\tbreak;\n\t\tcase 0x22:\t\t// TEXCOORD - Set Texture Coordinates (W)\n\t\t\tgfx3d_glTexCoord(param);\n\t\tbreak;\n\t\tcase 0x23:\t\t// VTX_16 - Set Vertex XYZ Coordinates (W)\n\t\t\tgfx3d_glVertex16b(param);\n\t\tbreak;\n\t\tcase 0x24:\t\t// VTX_10 - Set Vertex XYZ Coordinates (W)\n\t\t\tgfx3d_glVertex10b(param);\n\t\tbreak;\n\t\tcase 0x25:\t\t// VTX_XY - Set Vertex XY Coordinates (W)\n\t\t\tgfx3d_glVertex3_cord<0,1>(param);\n\t\tbreak;\n\t\tcase 0x26:\t\t// VTX_XZ - Set Vertex XZ Coordinates (W)\n\t\t\tgfx3d_glVertex3_cord<0,2>(param);\n\t\tbreak;\n\t\tcase 0x27:\t\t// VTX_YZ - Set Vertex YZ Coordinates (W)\n\t\t\tgfx3d_glVertex3_cord<1,2>(param);\n\t\tbreak;\n\t\tcase 0x28:\t\t// VTX_DIFF - Set Relative Vertex Coordinates (W)\n\t\t\tgfx3d_glVertex_rel(param);\n\t\tbreak;\n\t\tcase 0x29:\t\t// POLYGON_ATTR - Set Polygon Attributes (W)\n\t\t\tgfx3d_glPolygonAttrib(param);\n\t\tbreak;\n\t\tcase 0x2A:\t\t// TEXIMAGE_PARAM - Set Texture Parameters (W)\n\t\t\tgfx3d_glTexImage(param);\n\t\tbreak;\n\t\tcase 0x2B:\t\t// PLTT_BASE - Set Texture Palette Base Address (W)\n\t\t\tgfx3d_glTexPalette(param);\n\t\tbreak;\n\t\tcase 0x30:\t\t// DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W)\n\t\t\tgfx3d_glMaterial0(param);\n\t\tbreak;\n\t\tcase 0x31:\t\t// SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W)\n\t\t\tgfx3d_glMaterial1(param);\n\t\tbreak;\n\t\tcase 0x32:\t\t// LIGHT_VECTOR - Set Light's Directional Vector (W)\n\t\t\tgfx3d_glLightDirection(param);\n\t\tbreak;\n\t\tcase 0x33:\t\t// LIGHT_COLOR - Set Light Color (W)\n\t\t\tgfx3d_glLightColor(param);\n\t\tbreak;\n\t\tcase 0x34:\t\t// SHININESS - Specular Reflection Shininess Table (W)\n\t\t\tgfx3d_glShininess(param);\n\t\tbreak;\n\t\tcase 0x40:\t\t// BEGIN_VTXS - Start of Vertex List (W)\n\t\t\tgfx3d_glBegin(param);\n\t\tbreak;\n\t\tcase 0x41:\t\t// END_VTXS - End of Vertex List (W)\n\t\t\tgfx3d_glEnd();\n\t\tbreak;\n\t\tcase 0x50:\t\t// SWAP_BUFFERS - Swap Rendering Engine Buffer (W)\n\t\t\tgfx3d_glFlush(param);\n\t\tbreak;\n\t\tcase 0x60:\t\t// VIEWPORT - Set Viewport (W)\n\t\t\tgfx3d_glViewPort(param);\n\t\tbreak;\n\t\tcase 0x70:\t\t// BOX_TEST - Test if Cuboid Sits inside View Volume (W)\n\t\t\tgfx3d_glBoxTest(param);\n\t\tbreak;\n\t\tcase 0x71:\t\t// POS_TEST - Set Position Coordinates for Test (W)\n\t\t\tgfx3d_glPosTest(param);\n\t\tbreak;\n\t\tcase 0x72:\t\t// VEC_TEST - Set Directional Vector for Test (W)\n\t\t\tgfx3d_glVecTest(param);\n\t\tbreak;\n\t\tdefault:\n\t\t\tINFO(\"Unknown execute FIFO 3D command 0x%02X with param 0x%08X\\n\", cmd, param);\n\t\tbreak;\n\t}\n}\n\nvoid gfx3d_execute3D()\n{\n\tu8\tcmd = 0;\n\tu32\tparam = 0;\n\n#ifndef FLUSHMODE_HACK\n\tif (isSwapBuffers) return;\n#endif\n\n\t//this is a SPEED HACK\n\t//fifo is currently emulated more accurately than it probably needs to be.\n\t//without this batch size the emuloop will escape way too often to run fast.\n\tconst int HACK_FIFO_BATCH_SIZE = 64;\n\n\tint i;\n\tfor(i=0;i<HACK_FIFO_BATCH_SIZE;i++) {\n\t\tif(GFX_PIPErecv(&cmd, &param))\n\t\t{\n\t\t\t//if (isSwapBuffers) printf(\"Executing while swapbuffers is pending: %d:%08X\\n\",cmd,param);\n\n\t\t\t//since we did anything at all, incur a pipeline motion cost.\n\t\t\t//also, we can't let gxfifo sequencer stall until the fifo is empty.\n\t\t\t//see...\n\t\t\t//GFX_DELAY(1); \n\n\t\t\t//..these guys will ordinarily set a delay, but multi-param operations won't\n\t\t\t//for the earlier params.\n\t\t\t//printf(\"%05d:%03d:%12lld: executed 3d: %02X %08X\\n\",currFrameCounter, nds.VCount, nds_timer , cmd, param);\n\t\t\tgfx3d_execute(cmd, param);\n\n\t\t} else break;\n\t}\n\t\n\tif(i > 0)\n\t{\n\t\t//this is a COMPATIBILITY HACK.\n\t\t//this causes 3d to take virtually no time whatsoever to execute.\n\t\t//this was done for marvel nemesis, but a similar family of \n\t\t//hacks for ridiculously fast 3d execution has proven necessary for a number of games.\n\t\t//the true answer is probably dma bus blocking.. but lets go ahead and try this and\n\t\t//check the compatibility, at the very least it will be nice to know if any games suffer from\n\t\t//3d running too fast\n\t\tMMU.gfx3dCycles = nds_timer+1;\n\t\tNDS_Reschedule();\n\t}\n\n}\n\nvoid gfx3d_glFlush(u32 v)\n{\n\t//printf(\"-------------FLUSH------------- (vcount=%d\\n\",nds.VCount);\n\tgfx3d.state.pendingFlushCommand = v;\n#if 0\n\tif (isSwapBuffers)\n\t{\n\t\tINFO(\"Error: swapBuffers already use\\n\");\n\t}\n#endif\n\t\n\tisSwapBuffers = TRUE;\n\n\t//printf(\"%05d:%03d:%12lld: FLUSH\\n\",currFrameCounter, nds.VCount, nds_timer);\n\t\n\t//well, the game wanted us to flush.\n\t//it may be badly timed. lets just flush it.\n#ifdef FLUSHMODE_HACK\n\tgfx3d_doFlush();\n#endif\n\n\tGFX_DELAY(1);\n}\n\nstatic bool gfx3d_ysort_compare(int num1, int num2)\n{\n\tconst POLY &poly1 = polylist->list[num1];\n\tconst POLY &poly2 = polylist->list[num2];\n\n\t//this may be verified by checking the game create menus in harvest moon island of happiness\n\t//also the buttons in the knights in the nightmare frontend depend on this and the perspective division\n\tif (poly1.maxy < poly2.maxy) return true;\n\tif (poly1.maxy > poly2.maxy) return false;\n\tif (poly1.miny < poly2.miny) return true;\n\tif (poly1.miny > poly2.miny) return false;\n\t//notably, the main shop interface in harvest moon will not have a correct RTN button\n\t//i think this is due to a math error rounding its position to one pixel too high and it popping behind\n\t//the bar that it sits on.\n\t//everything else in all the other menus that I could find looks right..\n\n\t//make sure we respect the game's ordering in cases of complete ties\n\t//this makes it a stable sort.\n\t//this must be a stable sort or else advance wars DOR will flicker in the main map mode\n\tif (num1 < num2) return true;\n\telse return false;\n}\n\nstatic void gfx3d_doFlush()\n{\n\tgfx3d.frameCtr++;\n\n\t//the renderer will get the lists we just built\n\tgfx3d.polylist = polylist;\n\tgfx3d.vertlist = vertlist;\n\n\t//and also our current render state\n\tif(BIT1(control)) gfx3d.state.shading = GFX3D_State::HIGHLIGHT;\n\telse gfx3d.state.shading = GFX3D_State::TOON;\n\tgfx3d.state.enableTexturing = BIT0(control);\n\tgfx3d.state.enableAlphaTest = BIT2(control);\n\tgfx3d.state.enableAlphaBlending = BIT3(control);\n\tgfx3d.state.enableAntialiasing = BIT4(control);\n\tgfx3d.state.enableEdgeMarking = BIT5(control);\n\tgfx3d.state.enableFogAlphaOnly = BIT6(control);\n\tgfx3d.state.enableFog = BIT7(control);\n\tgfx3d.state.enableClearImage = BIT14(control);\n\tgfx3d.state.fogShift = (control>>8)&0xF;\n\tgfx3d.state.sortmode = BIT0(gfx3d.state.activeFlushCommand);\n\tgfx3d.state.wbuffer = BIT1(gfx3d.state.activeFlushCommand);\n\n\tgfx3d.renderState = gfx3d.state;\n\t\n\t// Override render states per user settings\n\tif(!CommonSettings.GFX3D_Texture)\n\t\tgfx3d.renderState.enableTexturing = false;\n\t\n\tif(!CommonSettings.GFX3D_EdgeMark)\n\t\tgfx3d.renderState.enableEdgeMarking = false;\n\t\n\tif(!CommonSettings.GFX3D_Fog)\n\t\tgfx3d.renderState.enableFog = false;\n\t\n\tgfx3d.state.activeFlushCommand = gfx3d.state.pendingFlushCommand;\n\n\tint polycount = polylist->count;\n#ifdef _SHOW_VTX_COUNTERS\n\tmax_polys = max((u32)polycount, max_polys);\n\tmax_verts = max((u32)vertlist->count, max_verts);\n\tosd->addFixed(180, 20, \"%i/%i\", polycount, vertlist->count);\t\t// current\n\tosd->addFixed(180, 35, \"%i/%i\", max_polys, max_verts);\t\t// max\n#endif\n\n\t//find the min and max y values for each poly.\n\t//TODO - this could be a small waste of time if we are manual sorting the translucent polys\n\t//TODO - this _MUST_ be moved later in the pipeline, after clipping.\n\t//the w-division here is just an approximation to fix the shop in harvest moon island of happiness\n\t//also the buttons in the knights in the nightmare frontend depend on this\n\tfor(int i=0; i<polycount; i++)\n\t{\n\t\tPOLY &poly = polylist->list[i];\n\t\tfloat verty = vertlist->list[poly.vertIndexes[0]].y;\n\t\tfloat vertw = vertlist->list[poly.vertIndexes[0]].w;\n\t\tverty = 1.0f-(verty+vertw)/(2*vertw);\n\t\tpoly.miny = poly.maxy = verty;\n\n\t\tfor(int j=1; j<poly.type; j++)\n\t\t{\n\t\t\tverty = vertlist->list[poly.vertIndexes[j]].y;\n\t\t\tvertw = vertlist->list[poly.vertIndexes[j]].w;\n\t\t\tverty = 1.0f-(verty+vertw)/(2*vertw);\n\t\t\tpoly.miny = min(poly.miny, verty);\n\t\t\tpoly.maxy = max(poly.maxy, verty);\n\t\t}\n\n\t}\n\n\t//we need to sort the poly list with alpha polys last\n\t//first, look for opaque polys\n\tint ctr=0;\n\tfor(int i=0;i<polycount;i++) {\n\t\tPOLY &poly = polylist->list[i];\n\t\tif(!poly.isTranslucent())\n\t\t\tgfx3d.indexlist.list[ctr++] = i;\n\t}\n\tint opaqueCount = ctr;\n\t//then look for translucent polys\n\tfor(int i=0;i<polycount;i++) {\n\t\tPOLY &poly = polylist->list[i];\n\t\tif(poly.isTranslucent())\n\t\t\tgfx3d.indexlist.list[ctr++] = i;\n\t}\n\n\t//now we have to sort the opaque polys by y-value.\n\t//(test case: harvest moon island of happiness character cretor UI)\n\t//should this be done after clipping??\n\tstd::sort(gfx3d.indexlist.list, gfx3d.indexlist.list + opaqueCount, gfx3d_ysort_compare);\n\t\n\tif(!gfx3d.state.sortmode)\n\t{\n\t\t//if we are autosorting translucent polys, we need to do this also\n\t\t//TODO - this is unverified behavior. need a test case\n\t\tstd::sort(gfx3d.indexlist.list + opaqueCount, gfx3d.indexlist.list + polycount, gfx3d_ysort_compare);\n\t}\n\n\t//switch to the new lists\n\ttwiddleLists();\n\n\tif(driver->view3d->IsRunning())\n\t{\n\t\tviewer3d_state->frameNumber = currFrameCounter;\n\t\tviewer3d_state->state = gfx3d.state;\n\t\tviewer3d_state->polylist = *gfx3d.polylist;\n\t\tviewer3d_state->vertlist = *gfx3d.vertlist;\n\t\tviewer3d_state->indexlist = gfx3d.indexlist;\n\t\tdriver->view3d->NewFrame();\n\t}\n\n\tdrawPending = TRUE;\n}\n\nvoid gfx3d_VBlankSignal()\n{\n\tif (isSwapBuffers)\n\t{\n#ifndef FLUSHMODE_HACK\n\t\tgfx3d_doFlush();\n#endif\n\t\tGFX_DELAY(392);\n\t\tisSwapBuffers = FALSE;\n\t}\n}\n\nvoid gfx3d_VBlankEndSignal(bool skipFrame)\n{\n\tif (!drawPending) return;\n\tif(skipFrame) return;\n\n\tdrawPending = FALSE;\n\n\tif(!CommonSettings.showGpu.main)\n\t{\n\t\tmemset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen));\n\t\treturn;\n\t}\n\t\n\tgpu3D->NDS_3D_Render();\n}\n\n//#define _3D_LOG\n\nvoid gfx3d_sendCommandToFIFO(u32 val)\n{\n\t//printf(\"gxFIFO: send val=0x%08X, size=%03i (fifo)\\n\", val, gxFIFO.size);\n\n\tgxf_hardware.receive(val);\n}\n\nvoid gfx3d_sendCommand(u32 cmd, u32 param)\n{\n\tcmd = (cmd & 0x01FF) >> 2;\n\n\t//printf(\"gxFIFO: send 0x%02X: val=0x%08X, size=%03i (direct)\\n\", cmd, param, gxFIFO.size);\n\n#ifdef _3D_LOG\n\tINFO(\"gxFIFO: send 0x%02X: val=0x%08X, pipe %02i, fifo %03i (direct)\\n\", cmd, param, gxPIPE.tail, gxFIFO.tail);\n#endif\n\n\tswitch (cmd)\n\t{\n\t\tcase 0x10:\t\t// MTX_MODE - Set Matrix Mode (W)\n\t\tcase 0x11:\t\t// MTX_PUSH - Push Current Matrix on Stack (W)\n\t\tcase 0x12:\t\t// MTX_POP - Pop Current Matrix from Stack (W)\n\t\tcase 0x13:\t\t// MTX_STORE - Store Current Matrix on Stack (W)\n\t\tcase 0x14:\t\t// MTX_RESTORE - Restore Current Matrix from Stack (W)\n\t\tcase 0x15:\t\t// MTX_IDENTITY - Load Unit Matrix to Current Matrix (W)\n\t\tcase 0x16:\t\t// MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W)\n\t\tcase 0x17:\t\t// MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W)\n\t\tcase 0x18:\t\t// MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W)\n\t\tcase 0x19:\t\t// MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W)\n\t\tcase 0x1A:\t\t// MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W)\n\t\tcase 0x1B:\t\t// MTX_SCALE - Multiply Current Matrix by Scale Matrix (W)\n\t\tcase 0x1C:\t\t// MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W)\n\t\tcase 0x20:\t\t// COLOR - Directly Set Vertex Color (W)\n\t\tcase 0x21:\t\t// NORMAL - Set Normal Vector (W)\n\t\tcase 0x22:\t\t// TEXCOORD - Set Texture Coordinates (W)\n\t\tcase 0x23:\t\t// VTX_16 - Set Vertex XYZ Coordinates (W)\n\t\tcase 0x24:\t\t// VTX_10 - Set Vertex XYZ Coordinates (W)\n\t\tcase 0x25:\t\t// VTX_XY - Set Vertex XY Coordinates (W)\n\t\tcase 0x26:\t\t// VTX_XZ - Set Vertex XZ Coordinates (W)\n\t\tcase 0x27:\t\t// VTX_YZ - Set Vertex YZ Coordinates (W)\n\t\tcase 0x28:\t\t// VTX_DIFF - Set Relative Vertex Coordinates (W)\n\t\tcase 0x29:\t\t// POLYGON_ATTR - Set Polygon Attributes (W)\n\t\tcase 0x2A:\t\t// TEXIMAGE_PARAM - Set Texture Parameters (W)\n\t\tcase 0x2B:\t\t// PLTT_BASE - Set Texture Palette Base Address (W)\n\t\tcase 0x30:\t\t// DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W)\n\t\tcase 0x31:\t\t// SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W)\n\t\tcase 0x32:\t\t// LIGHT_VECTOR - Set Light's Directional Vector (W)\n\t\tcase 0x33:\t\t// LIGHT_COLOR - Set Light Color (W)\n\t\tcase 0x34:\t\t// SHININESS - Specular Reflection Shininess Table (W)\n\t\tcase 0x40:\t\t// BEGIN_VTXS - Start of Vertex List (W)\n\t\tcase 0x41:\t\t// END_VTXS - End of Vertex List (W)\n\t\tcase 0x60:\t\t// VIEWPORT - Set Viewport (W)\n\t\tcase 0x70:\t\t// BOX_TEST - Test if Cuboid Sits inside View Volume (W)\n\t\tcase 0x71:\t\t// POS_TEST - Set Position Coordinates for Test (W)\n\t\tcase 0x72:\t\t// VEC_TEST - Set Directional Vector for Test (W)\n\t\t\t//printf(\"mmu: sending %02X: %08X\\n\", cmd,param);\n\t\t\tGFX_FIFOsend(cmd, param);\n\t\t\tbreak;\n\t\tcase 0x50:\t\t// SWAP_BUFFERS - Swap Rendering Engine Buffer (W)\n\t\t\t//printf(\"mmu: sending %02X: %08X\\n\", cmd,param);\n\t\t\tGFX_FIFOsend(cmd, param);\n\t\tbreak;\n\t\tdefault:\n\t\t\tINFO(\"Unknown 3D command %03X with param 0x%08X (directport)\\n\", cmd, param);\n\t\t\tbreak;\n\t}\n}\n\n\n\nvoid gfx3d_Control(u32 v)\n{\n\tcontrol = v;\n}\n\n//--------------\n//other misc stuff\nvoid gfx3d_glGetMatrix(unsigned int m_mode, int index, float* dest)\n{\n#ifdef GFX3D_USE_FLOAT\n\tif(index == -1)\n\t{\n\t\tMatrixCopy(dest, mtxCurrent[m_mode]);\n\t\treturn;\n\t}\n\n\tMatrixCopy(dest, MatrixStackGetPos(&mtxStack[m_mode], index));\n#else\n\ts32* src;\n\tif(index==-1)\n\t\tsrc = mtxCurrent[m_mode];\n\telse src=MatrixStackGetPos(&mtxStack[m_mode],index);\n\tfor(int i=0;i<16;i++)\n\t\tdest[i] = src[i]/4096.0f;\n#endif\n}\n\nvoid gfx3d_glGetLightDirection(unsigned int index, unsigned int* dest)\n{\n\t*dest = lightDirection[index];\n}\n\nvoid gfx3d_glGetLightColor(unsigned int index, unsigned int* dest)\n{\n\t*dest = lightColor[index];\n}\n\nvoid gfx3d_GetLineData(int line, u8** dst)\n{\n\tgpu3D->NDS_3D_RenderFinish();\n\t*dst = gfx3d_convertedScreen+((line)<<(8+2));\n}\n\nvoid gfx3d_GetLineData15bpp(int line, u16** dst)\n{\n\t//TODO - this is not very thread safe!!!\n\tstatic u16 buf[256];\n\t*dst = buf;\n\n\tu8* lineData;\n\tgfx3d_GetLineData(line, &lineData);\n\tfor(int i=0;i<256;i++)\n\t{\n\t\tconst u8 r = lineData[i*4+0];\n\t\tconst u8 g = lineData[i*4+1];\n\t\tconst u8 b = lineData[i*4+2];\n\t\tconst u8 a = lineData[i*4+3];\n\t\tbuf[i] = R6G6B6TORGB15(r,g,b) | (a==0?0:0x8000);\n\t}\n}\n\n\n//http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node17.html\n//talks about the state required to process verts in quadlists etc. helpful ideas.\n//consider building a little state structure that looks exactly like this describes\n\nSFORMAT SF_GFX3D[]={\n\t{ \"GCTL\", 4, 1, &control}, // no longer regenerated indirectly, see comment in loadstate()\n\t{ \"GPAT\", 4, 1, &polyAttr},\n\t{ \"GPAP\", 4, 1, &polyAttrPending},\n\t{ \"GINB\", 4, 1, &inBegin},\n\t{ \"GTFM\", 4, 1, &textureFormat},\n\t{ \"GTPA\", 4, 1, &texturePalette},\n\t{ \"GMOD\", 4, 1, &mode},\n\t{ \"GMTM\", 4,16, mtxTemporal},\n\t{ \"GMCU\", 4,64, mtxCurrent},\n\t{ \"ML4I\", 1, 1, &ML4x4ind},\n\t{ \"ML3I\", 1, 1, &ML4x3ind},\n\t{ \"MM4I\", 1, 1, &MM4x4ind},\n\t{ \"MM3I\", 1, 1, &MM4x3ind},\n\t{ \"MMxI\", 1, 1, &MM3x3ind},\n\t{ \"GSCO\", 4, 1, s16coord},\n\t{ \"GCOI\", 1, 1, &coordind},\n\t{ \"GVFM\", 4, 1, &vtxFormat},\n\t{ \"GTRN\", 4, 4, trans},\n\t{ \"GTRI\", 1, 1, &transind},\n\t{ \"GSCA\", 4, 4, scale},\n\t{ \"GSCI\", 1, 1, &scaleind},\n\t{ \"G_T_\", 4, 1, &_t},\n\t{ \"G_S_\", 4, 1, &_s},\n\t{ \"GL_T\", 4, 1, &last_t},\n\t{ \"GL_S\", 4, 1, &last_s},\n\t{ \"GLCM\", 4, 1, &clCmd},\n\t{ \"GLIN\", 4, 1, &clInd},\n\t{ \"GLI2\", 4, 1, &clInd2},\n\t{ \"GLSB\", 4, 1, &isSwapBuffers},\n\t{ \"GLBT\", 4, 1, &BTind},\n\t{ \"GLPT\", 4, 1, &PTind},\n\t{ \"GLPC\", 4, 4, PTcoords},\n\t{ \"GBTC\", 2, 6, &BTcoords[0]},\n\t{ \"GFHE\", 4, 1, &gxFIFO.head},\n\t{ \"GFTA\", 4, 1, &gxFIFO.tail},\n\t{ \"GFSZ\", 4, 1, &gxFIFO.size},\n\t{ \"GFMS\", 4, 1, &gxFIFO.matrix_stack_op_size},\n\t{ \"GFCM\", 1, HACK_GXIFO_SIZE, &gxFIFO.cmd[0]},\n\t{ \"GFPM\", 4, HACK_GXIFO_SIZE, &gxFIFO.param[0]},\n\t{ \"GPHE\", 1, 1, &gxPIPE.head},\n\t{ \"GPTA\", 1, 1, &gxPIPE.tail},\n\t{ \"GPSZ\", 1, 1, &gxPIPE.size},\n\t{ \"GPCM\", 1, 4, &gxPIPE.cmd[0]},\n\t{ \"GPPM\", 4, 4, &gxPIPE.param[0]},\n\t{ \"GCOL\", 1, 4, &colorRGB[0]},\n\t{ \"GLCO\", 4, 4, lightColor},\n\t{ \"GLDI\", 4, 4, lightDirection},\n\t{ \"GMDI\", 2, 1, &dsDiffuse},\n\t{ \"GMAM\", 2, 1, &dsAmbient},\n\t{ \"GMSP\", 2, 1, &dsSpecular},\n\t{ \"GMEM\", 2, 1, &dsEmission},\n\t{ \"GFLP\", 4, 1, &flushPending},\n\t{ \"GDRP\", 4, 1, &drawPending},\n\t{ \"GSET\", 4, 1, &gfx3d.state.enableTexturing},\n\t{ \"GSEA\", 4, 1, &gfx3d.state.enableAlphaTest},\n\t{ \"GSEB\", 4, 1, &gfx3d.state.enableAlphaBlending},\n\t{ \"GSEX\", 4, 1, &gfx3d.state.enableAntialiasing},\n\t{ \"GSEE\", 4, 1, &gfx3d.state.enableEdgeMarking},\n\t{ \"GSEC\", 4, 1, &gfx3d.state.enableClearImage},\n\t{ \"GSEF\", 4, 1, &gfx3d.state.enableFog},\n\t{ \"GSEO\", 4, 1, &gfx3d.state.enableFogAlphaOnly},\n\t{ \"GFSH\", 4, 1, &gfx3d.state.fogShift},\n\t{ \"GSSH\", 4, 1, &gfx3d.state.shading},\n\t{ \"GSWB\", 4, 1, &gfx3d.state.wbuffer},\n\t{ \"GSSM\", 4, 1, &gfx3d.state.sortmode},\n\t{ \"GSAR\", 1, 1, &gfx3d.state.alphaTestRef},\n\t{ \"GSVP\", 4, 1, &viewport},\n\t{ \"GSCC\", 4, 1, &gfx3d.state.clearColor},\n\t{ \"GSCD\", 4, 1, &gfx3d.state.clearDepth},\n\t{ \"GSFC\", 4, 4, &gfx3d.state.fogColor},\n\t{ \"GSFO\", 4, 1, &gfx3d.state.fogOffset},\n\t{ \"GST4\", 2, 32, gfx3d.state.u16ToonTable},\n#ifdef GFX3D_USE_FLOAT\n\t{ \"GSSU\", 4, 128, &gfx3d.state.shininessTable[0]},\n#else\n\t{ \"GSSU\", 1, 128, &gfx3d.state.shininessTable[0]},\n#endif\n\t{ \"GSSI\", 4, 1, &shininessInd},\n\t{ \"GSAF\", 4, 1, &gfx3d.state.activeFlushCommand},\n\t{ \"GSPF\", 4, 1, &gfx3d.state.pendingFlushCommand},\n\t//------------------------\n\t{ \"GTST\", 4, 1, &triStripToggle},\n\t{ \"GTVC\", 4, 1, &tempVertInfo.count},\n\t{ \"GTVM\", 4, 4, tempVertInfo.map},\n\t{ \"GTVF\", 4, 1, &tempVertInfo.first},\n\t{ \"G3CX\", 1, 4*256*192, gfx3d_convertedScreen},\n\t{ 0 }\n};\n\n//-------------savestate\nvoid gfx3d_savestate(EMUFILE* os)\n{\n\tgpu3D->NDS_3D_RenderFinish();\n\t\n\t//version\n\twrite32le(4,os);\n\n\t//dump the render lists\n\tOSWRITE(vertlist->count);\n\tfor(int i=0;i<vertlist->count;i++)\n\t\tvertlist->list[i].save(os);\n\tOSWRITE(polylist->count);\n\tfor(int i=0;i<polylist->count;i++)\n\t\tpolylist->list[i].save(os);\n\n\tfor(int i=0;i<4;i++)\n\t{\n\t\tOSWRITE(mtxStack[i].position);\n\t\tfor(int j=0;j<mtxStack[i].size*16;j++)\n\t\t\tOSWRITE(mtxStack[i].matrix[j]);\n\t}\n\n\tgxf_hardware.savestate(os);\n\n\t// evidently these need to be saved because we don't cache the matrix that would need to be used to properly regenerate them\n\tOSWRITE(cacheLightDirection);\n\tOSWRITE(cacheHalfVector);\n}\n\nbool gfx3d_loadstate(EMUFILE* is, int size)\n{\n\tint version;\n\tif(read32le(&version,is) != 1) return false;\n\tif(size==8) version = 0;\n\n\n\tgfx3d_glPolygonAttrib_cache();\n\tgfx3d_glTexImage_cache();\n\tgfx3d_glLightDirection_cache(0);\n\tgfx3d_glLightDirection_cache(1);\n\tgfx3d_glLightDirection_cache(2);\n\tgfx3d_glLightDirection_cache(3);\n\n\t//jiggle the lists. and also wipe them. this is clearly not the best thing to be doing.\n\tlistTwiddle = 0;\n\tpolylist = &polylists[listTwiddle];\n\tvertlist = &vertlists[listTwiddle];\n\n\tif(version>=1)\n\t{\n\t\tOSREAD(vertlist->count);\n\t\tfor(int i=0;i<vertlist->count;i++)\n\t\t\tvertlist->list[i].load(is);\n\t\tOSREAD(polylist->count);\n\t\tfor(int i=0;i<polylist->count;i++)\n\t\t\tpolylist->list[i].load(is);\n\t}\n\n\tif(version>=2)\n\t{\n\t\tfor(int i=0;i<4;i++)\n\t\t{\n\t\t\tOSREAD(mtxStack[i].position);\n\t\t\tfor(int j=0;j<mtxStack[i].size*16;j++)\n\t\t\t\tOSREAD(mtxStack[i].matrix[j]);\n\t\t}\n\t}\n\n\tif(version>=3) {\n\t\tgxf_hardware.loadstate(is);\n\t}\n\n\tgfx3d.polylist = &polylists[listTwiddle^1];\n\tgfx3d.vertlist = &vertlists[listTwiddle^1];\n\tgfx3d.polylist->count=0;\n\tgfx3d.vertlist->count=0;\n\n\tif(version >= 4)\n\t{\n\t\tOSREAD(cacheLightDirection);\n\t\tOSREAD(cacheHalfVector);\n\t}\n\n\treturn true;\n}\n\n//-------------------\n//clipping\n//-------------------\n\n// this is optional for now in case someone has trouble with the new method\n// or wants to toggle it to compare\n#define OPTIMIZED_CLIPPING_METHOD\n\n//#define CLIPLOG(X) printf(X);\n//#define CLIPLOG2(X,Y,Z) printf(X,Y,Z);\n#define CLIPLOG(X)\n#define CLIPLOG2(X,Y,Z)\n\ntemplate<typename T>\nstatic T interpolate(const float ratio, const T& x0, const T& x1) {\n\treturn (T)(x0 + (float)(x1-x0) * (ratio));\n}\n\n\n//http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/as6/discussion.shtml\n#ifdef OPTIMIZED_CLIPPING_METHOD\ntemplate<int coord, int which> static FORCEINLINE VERT clipPoint(bool hirez, VERT* inside, VERT* outside)\n#else\nstatic FORCEINLINE VERT clipPoint(VERT* inside, VERT* outside, int coord, int which)\n#endif\n{\n\tVERT ret;\n\n\tfloat coord_inside = inside->coord[coord];\n\tfloat coord_outside = outside->coord[coord];\n\tfloat w_inside = inside->coord[3];\n\tfloat w_outside = outside->coord[3];\n\n\tfloat t;\n\n\tif(which==-1) {\n\t\tw_outside = -w_outside;\n\t\tw_inside = -w_inside;\n\t}\n\t\n\tt = (coord_inside - w_inside)/ ((w_outside-w_inside) - (coord_outside-coord_inside));\n\t\n\n#define INTERP(X) ret . X = interpolate(t, inside-> X ,outside-> X )\n\t\n\tINTERP(coord[0]); INTERP(coord[1]); INTERP(coord[2]); INTERP(coord[3]);\n\tINTERP(texcoord[0]); INTERP(texcoord[1]);\n\n\t//if(CommonSettings.GFX3D_HighResolutionInterpolateColor)\n\tif(hirez)\n\t{\n\t\tINTERP(fcolor[0]); INTERP(fcolor[1]); INTERP(fcolor[2]);\n\t}\n\telse\n\t{\n\t\tINTERP(color[0]); INTERP(color[1]); INTERP(color[2]);\n\t\tret.color_to_float();\n\t}\n\n\t//this seems like a prudent measure to make sure that math doesnt make a point pop back out\n\t//of the clip volume through interpolation\n\tif(which==-1)\n\t\tret.coord[coord] = -ret.coord[3];\n\telse\n\t\tret.coord[coord] = ret.coord[3];\n\n\treturn ret;\n}\n\n#ifdef OPTIMIZED_CLIPPING_METHOD\n\n#define MAX_SCRATCH_CLIP_VERTS (4*6 + 40)\nstatic VERT scratchClipVerts [MAX_SCRATCH_CLIP_VERTS];\nstatic int numScratchClipVerts = 0;\n\ntemplate <int coord, int which, class Next>\nclass ClipperPlane\n{\npublic:\n\tClipperPlane(Next& next) : m_next(next) {}\n\n\tvoid init(VERT* verts)\n\t{\n\t\tm_prevVert =  NULL;\n\t\tm_firstVert = NULL;\n\t\tm_next.init(verts);\n\t}\n\n\tvoid clipVert(bool hirez, VERT* vert)\n\t{\n\t\tif(m_prevVert)\n\t\t\tthis->clipSegmentVsPlane(hirez, m_prevVert, vert);\n\t\telse\n\t\t\tm_firstVert = vert;\n\t\tm_prevVert = vert;\n\t}\n\n\t// closes the loop and returns the number of clipped output verts\n\tint finish(bool hirez)\n\t{\n\t\tthis->clipVert(hirez, m_firstVert);\n\t\treturn m_next.finish(hirez);\n\t}\n\nprivate:\n\n\tVERT* m_prevVert;\n\tVERT* m_firstVert;\n\tNext& m_next;\n\n\tFORCEINLINE void clipSegmentVsPlane(bool hirez, VERT* vert0, VERT* vert1)\n\t{\n\t\tfloat* vert0coord = vert0->coord;\n\t\tfloat* vert1coord = vert1->coord;\n\t\tbool out0, out1;\n\t\tif(which==-1) \n\t\t\tout0 = vert0coord[coord] < -vert0coord[3];\n\t\telse \n\t\t\tout0 = vert0coord[coord] > vert0coord[3];\n\t\tif(which==-1) \n\t\t\tout1 = vert1coord[coord] < -vert1coord[3];\n\t\telse\n\t\t\tout1 = vert1coord[coord] > vert1coord[3];\n\n\t\t//CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure.\n\t\t//if(coord==2 && which==1) {\n\t\t//\tout0 = vert0coord[2] < 0;\n\t\t//\tout1 = vert1coord[2] < 0;\n\t\t//}\n\n\t\t//both outside: insert no points\n\t\tif(out0 && out1) {\n\t\t\tCLIPLOG(\" both outside\\n\");\n\t\t}\n\n\t\t//both inside: insert the next point\n\t\tif(!out0 && !out1) \n\t\t{\n\t\t\tCLIPLOG(\" both inside\\n\");\n\t\t\tm_next.clipVert(hirez,vert1);\n\t\t}\n\n\t\t//exiting volume: insert the clipped point\n\t\tif(!out0 && out1)\n\t\t{\n\t\t\tCLIPLOG(\" exiting\\n\");\n\t\t\tassert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS);\n\t\t\tscratchClipVerts[numScratchClipVerts] = clipPoint<coord, which>(hirez,vert0,vert1);\n\t\t\tm_next.clipVert(hirez,&scratchClipVerts[numScratchClipVerts++]);\n\t\t}\n\n\t\t//entering volume: insert clipped point and the next (interior) point\n\t\tif(out0 && !out1) {\n\t\t\tCLIPLOG(\" entering\\n\");\n\t\t\tassert((u32)numScratchClipVerts < MAX_SCRATCH_CLIP_VERTS);\n\t\t\tscratchClipVerts[numScratchClipVerts] = clipPoint<coord, which>(hirez,vert1,vert0);\n\t\t\tm_next.clipVert(hirez,&scratchClipVerts[numScratchClipVerts++]);\n\t\t\tm_next.clipVert(hirez,vert1);\n\t\t}\n\t}\n};\n\nclass ClipperOutput\n{\npublic:\n\tvoid init(VERT* verts)\n\t{\n\t\tm_nextDestVert = verts;\n\t\tm_numVerts = 0;\n\t}\n\tvoid clipVert(bool hirez, VERT* vert)\n\t{\n\t\tassert((u32)m_numVerts < MAX_CLIPPED_VERTS);\n\t\t*m_nextDestVert++ = *vert;\n\t\tm_numVerts++;\n\t}\n\tint finish(bool hirez)\n\t{\n\t\treturn m_numVerts;\n\t}\nprivate:\n\tVERT* m_nextDestVert;\n\tint m_numVerts;\n};\n\n// see \"Template juggling with Sutherland-Hodgman\" http://www.codeguru.com/cpp/misc/misc/graphics/article.php/c8965__2/\n// for the idea behind setting things up like this.\nstatic ClipperOutput clipperOut;\ntypedef ClipperPlane<2, 1,ClipperOutput> Stage6; static Stage6 clipper6 (clipperOut); // back plane //TODO - we need to parameterize back plane clipping\ntypedef ClipperPlane<2,-1,Stage6> Stage5;        static Stage5 clipper5 (clipper6); // front plane\ntypedef ClipperPlane<1, 1,Stage5> Stage4;        static Stage4 clipper4 (clipper5); // top plane\ntypedef ClipperPlane<1,-1,Stage4> Stage3;        static Stage3 clipper3 (clipper4); // bottom plane\ntypedef ClipperPlane<0, 1,Stage3> Stage2;        static Stage2 clipper2 (clipper3); // right plane\ntypedef ClipperPlane<0,-1,Stage2> Stage1;        static Stage1 clipper  (clipper2); // left plane\n\ntemplate<bool hirez> void GFX3D_Clipper::clipPoly(POLY* poly, VERT** verts)\n{\n\tCLIPLOG(\"==Begin poly==\\n\");\n\n\tint type = poly->type;\n\tnumScratchClipVerts = 0;\n\n\tclipper.init(clippedPolys[clippedPolyCounter].clipVerts);\n\tfor(int i=0;i<type;i++)\n\t\tclipper.clipVert(hirez,verts[i]);\n\tint outType = clipper.finish(hirez);\n\n\tassert((u32)outType < MAX_CLIPPED_VERTS);\n\tif(outType < 3)\n\t{\n\t\t//a totally clipped poly. discard it.\n\t\t//or, a degenerate poly. we're not handling these right now\n\t}\n\telse\n\t{\n\t\tclippedPolys[clippedPolyCounter].type = outType;\n\t\tclippedPolys[clippedPolyCounter].poly = poly;\n\t\tclippedPolyCounter++;\n\t}\n}\n//these templates needed to be instantiated manually\ntemplate void GFX3D_Clipper::clipPoly<true>(POLY* poly, VERT** verts);\ntemplate void GFX3D_Clipper::clipPoly<false>(POLY* poly, VERT** verts);\n\nvoid GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which)\n{\n\t// not used (it's probably ok to delete this function)\n\tassert(0);\n}\n\nvoid GFX3D_Clipper::clipPolyVsPlane(const int coord, int which)\n{\n\t// not used (it's probably ok to delete this function)\n\tassert(0);\n}\n\n#else // if not OPTIMIZED_CLIPPING_METHOD:\n\nFORCEINLINE void GFX3D_Clipper::clipSegmentVsPlane(VERT** verts, const int coord, int which)\n{\n\tbool out0, out1;\n\tif(which==-1) \n\t\tout0 = verts[0]->coord[coord] < -verts[0]->coord[3];\n\telse \n\t\tout0 = verts[0]->coord[coord] > verts[0]->coord[3];\n\tif(which==-1) \n\t\tout1 = verts[1]->coord[coord] < -verts[1]->coord[3];\n\telse\n\t\tout1 = verts[1]->coord[coord] > verts[1]->coord[3];\n\n\t//CONSIDER: should we try and clip things behind the eye? does this code even successfully do it? not sure.\n\t//if(coord==2 && which==1) {\n\t//\tout0 = verts[0]->coord[2] < 0;\n\t//\tout1 = verts[1]->coord[2] < 0;\n\t//}\n\n\t//both outside: insert no points\n\tif(out0 && out1) {\n\t\tCLIPLOG(\" both outside\\n\");\n\t}\n\n\t//both inside: insert the first point\n\tif(!out0 && !out1) \n\t{\n\t\tCLIPLOG(\" both inside\\n\");\n\t\toutClippedPoly.clipVerts[outClippedPoly.type++] = *verts[1];\n\t}\n\n\t//exiting volume: insert the clipped point and the first (interior) point\n\tif(!out0 && out1)\n\t{\n\t\tCLIPLOG(\" exiting\\n\");\n\t\toutClippedPoly.clipVerts[outClippedPoly.type++] = clipPoint(verts[0],verts[1], coord, which);\n\t}\n\n\t//entering volume: insert clipped point\n\tif(out0 && !out1) {\n\t\tCLIPLOG(\" entering\\n\");\n\t\toutClippedPoly.clipVerts[outClippedPoly.type++] = clipPoint(verts[1],verts[0], coord, which);\n\t\toutClippedPoly.clipVerts[outClippedPoly.type++] = *verts[1];\n\n\t}\n}\n\nFORCEINLINE void GFX3D_Clipper::clipPolyVsPlane(const int coord, int which)\n{\n\toutClippedPoly.type = 0;\n\tCLIPLOG2(\"Clipping coord %d against %f\\n\",coord,x);\n\tfor(int i=0;i<tempClippedPoly.type;i++)\n\t{\n\t\tVERT* testverts[2] = {&tempClippedPoly.clipVerts[i],&tempClippedPoly.clipVerts[(i+1)%tempClippedPoly.type]};\n\t\tclipSegmentVsPlane(testverts, coord, which);\n\t}\n\n\t//this doesnt seem to help any. leaving it until i decide to get rid of it\n\t//int j = index_start_table[tempClippedPoly.type-3];\n\t//for(int i=0;i<tempClippedPoly.type;i++,j+=2)\n\t//{\n\t//\tVERT* testverts[2] = {&tempClippedPoly.clipVerts[index_lookup_table[j]],&tempClippedPoly.clipVerts[index_lookup_table[j+1]]};\n\t//\tclipSegmentVsPlane(testverts, coord, which);\n\t//}\n\n\ttempClippedPoly = outClippedPoly;\n}\n\n\nvoid GFX3D_Clipper::clipPoly(POLY* poly, VERT** verts)\n{\n\tint type = poly->type;\n\n\tCLIPLOG(\"==Begin poly==\\n\");\n\n\ttempClippedPoly.clipVerts[0] = *verts[0];\n\ttempClippedPoly.clipVerts[1] = *verts[1];\n\ttempClippedPoly.clipVerts[2] = *verts[2];\n\tif(type==4)\n\t\ttempClippedPoly.clipVerts[3] = *verts[3];\n\n\t\n\ttempClippedPoly.type = type;\n\n\tclipPolyVsPlane(0, -1); \n\tclipPolyVsPlane(0, 1);\n\tclipPolyVsPlane(1, -1);\n\tclipPolyVsPlane(1, 1);\n\tclipPolyVsPlane(2, -1);\n\tclipPolyVsPlane(2, 1);\n\t//TODO - we need to parameterize back plane clipping\n\n\t\n\tif(tempClippedPoly.type < 3)\n\t{\n\t\t//a totally clipped poly. discard it.\n\t\t//or, a degenerate poly. we're not handling these right now\n\t}\n\telse\n\t{\n\t\t//TODO - build right in this list instead of copying\n\t\tclippedPolys[clippedPolyCounter] = tempClippedPoly;\n\t\tclippedPolys[clippedPolyCounter].poly = poly;\n\t\tclippedPolyCounter++;\n\t}\n\n}\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/gfx3d.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _GFX3D_H_\n#define _GFX3D_H_\n\n#include <iosfwd>\n#include <ostream>\n#include <istream>\n#include \"types.h\"\n#include \"emufile.h\"\n\n\n//geometry engine command numbers\n#define GFX3D_NOP 0x00\n#define GFX3D_MTX_MODE 0x10\n#define GFX3D_MTX_PUSH 0x11\n#define GFX3D_MTX_POP 0x12\n#define GFX3D_MTX_STORE 0x13\n#define GFX3D_MTX_RESTORE 0x14\n#define GFX3D_MTX_IDENTITY 0x15\n#define GFX3D_MTX_LOAD_4x4 0x16\n#define GFX3D_MTX_LOAD_4x3 0x17\n#define GFX3D_MTX_MULT_4x4 0x18\n#define GFX3D_MTX_MULT_4x3 0x19\n#define GFX3D_MTX_MULT_3x3 0x1A\n#define GFX3D_MTX_SCALE 0x1B\n#define GFX3D_MTX_TRANS 0x1C\n#define GFX3D_COLOR 0x20\n#define GFX3D_NORMAL 0x21\n#define GFX3D_TEXCOORD 0x22\n#define GFX3D_VTX_16 0x23\n#define GFX3D_VTX_10 0x24\n#define GFX3D_XY 0x25\n#define GFX3D_XZ 0x26\n#define GFX3D_YZ 0x27\n#define GFX3D_DIFF 0x28\n#define GFX3D_POLYGON_ATTR 0x29\n#define GFX3D_TEXIMAGE_PARAM 0x2A\n#define GFX3D_PLTT_BASE 0x2B\n#define GFX3D_DIF_AMB 0x30\n#define GFX3D_SPE_EMI 0x31\n#define GFX3D_LIGHT_VECTOR 0x32\n#define GFX3D_LIGHT_COLOR 0x33\n#define GFX3D_SHININESS 0x34\n#define GFX3D_BEGIN_VTXS 0x40\n#define GFX3D_END_VTXS 0x41\n#define GFX3D_SWAP_BUFFERS 0x50\n#define GFX3D_VIEWPORT 0x60\n#define GFX3D_BOX_TEST 0x70\n#define GFX3D_POS_TEST 0x71\n#define GFX3D_VEC_TEST 0x72\n#define GFX3D_NOP_NOARG_HACK 0xDD\n\t\t\n//produce a 32bpp color from a DS RGB16\n#ifdef WORDS_BIGENDIAN\n\t#define RGB16TO32(col,alpha) ( (alpha) | ((((col) & 0x7C00)>>7)<<8) | ((((col) & 0x03E0)>>2)<<16) | ((((col) & 0x001F)<<3)<<24) )\n#else\n\t#define RGB16TO32(col,alpha) ( ((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x03E0)>>2)<<8) | (((col) & 0x001F)<<3) )\n#endif\n\n//produce a 32bpp color from a ds RGB15, using a table\n#define RGB15TO32_NOALPHA(col) ( color_15bit_to_24bit[col&0x7FFF] )\n\n//produce a 32bpp color from a ds RGB15 plus an 8bit alpha, using a table\n#ifdef WORDS_BIGENDIAN\n\t#define RGB15TO32(col,alpha8) ( (alpha8) | color_15bit_to_24bit[(col)&0x7FFF] )\n#else\n\t#define RGB15TO32(col,alpha8) ( ((alpha8)<<24) | color_15bit_to_24bit[(col)&0x7FFF] )\n#endif\n\n//produce a 5555 32bit color from a ds RGB15 plus an 5bit alpha\n#ifdef WORDS_BIGENDIAN\n\t#define RGB15TO5555(col,alpha5) ( (alpha5) | ((((col) & 0x7C00)>>10)<<8) | ((((col) & 0x03E0)>>5)<<16) | (((col) & 0x001F)<<24) )\n#else\n\t#define RGB15TO5555(col,alpha5) ( ((alpha5)<<24) | ((((col) & 0x7C00)>>10)<<16) | ((((col) & 0x03E0)>>5)<<8) | ((col) & 0x001F) )\n#endif\n\n//produce a 6665 32bit color from a ds RGB15 plus an 5bit alpha\ninline u32 RGB15TO6665(u16 col, u8 alpha5)\n{\n\tconst u16 r = (col&0x001F)>>0;\n\tconst u16 g = (col&0x03E0)>>5;\n\tconst u16 b = (col&0x7C00)>>10;\n\t\n#ifdef WORDS_BIGENDIAN\n\tconst u32 ret = alpha5 | (((b<<1)+1)<<8) | (((g<<1)+1)<<16) | (((r<<1)+1)<<24);\n#else\n\tconst u32 ret = (alpha5<<24) | (((b<<1)+1)<<16) | (((g<<1)+1)<<8) | ((r<<1)+1);\n#endif\n\t\n\treturn ret;\n}\n\n//produce a 24bpp color from a ds RGB15, using a table\n#define RGB15TO24_REVERSE(col) ( color_15bit_to_24bit_reverse[(col)&0x7FFF] )\n\n//produce a 16bpp color from a ds RGB15, using a table\n#define RGB15TO16_REVERSE(col) ( color_15bit_to_16bit_reverse[(col)&0x7FFF] )\n\n//produce a 32bpp color from a ds RGB15 plus an 8bit alpha, not using a table (but using other tables)\n#ifdef WORDS_BIGENDIAN\n\t#define RGB15TO32_DIRECT(col,alpha8) ( (alpha8) | (material_5bit_to_8bit[((col)>>10)&0x1F] << 8) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<16) | (material_5bit_to_8bit[(col)&0x1F]<<24) )\n#else\n\t#define RGB15TO32_DIRECT(col,alpha8) ( ((alpha8)<<24) | (material_5bit_to_8bit[((col)>>10)&0x1F]<<16) | (material_5bit_to_8bit[((col)>>5)&0x1F]<<8) | material_5bit_to_8bit[(col)&0x1F] )\n#endif\n\n//produce a 15bpp color from individual 5bit components\n#define R5G5B5TORGB15(r,g,b) ( (r) | ((g)<<5) | ((b)<<10) )\n\n//produce a 16bpp color from individual 5bit components\n#define R6G6B6TORGB15(r,g,b) ( ((r)>>1) | (((g)&0x3E)<<4) | (((b)&0x3E)<<9) )\n\n#define GFX3D_5TO6(x) ((x)?(((x)<<1)+1):0)\n\n// 15-bit to 24-bit depth formula from http://nocash.emubase.de/gbatek.htm#ds3drearplane\n#define DS_DEPTH15TO24(depth) ( dsDepthExtend_15bit_to_24bit[(depth) & 0x7FFF] )\n\n// POLYGON PRIMITIVE TYPES\nenum\n{\n\tGFX3D_TRIANGLES\t\t\t= 0,\n\tGFX3D_QUADS\t\t\t\t= 1,\n\tGFX3D_TRIANGLE_STRIP\t= 2,\n\tGFX3D_QUAD_STRIP\t\t= 3,\n\tGFX3D_LINE\t\t\t\t= 4\n};\n\n// POLYGON ATTRIBUTES - BIT LOCATIONS\nenum\n{\n\tPOLYGON_ATTR_ENABLE_LIGHT0_BIT\t\t\t\t= 0,\n\tPOLYGON_ATTR_ENABLE_LIGHT1_BIT\t\t\t\t= 1,\n\tPOLYGON_ATTR_ENABLE_LIGHT2_BIT\t\t\t\t= 2,\n\tPOLYGON_ATTR_ENABLE_LIGHT3_BIT\t\t\t\t= 3,\n\tPOLYGON_ATTR_MODE_BIT\t\t\t\t\t\t= 4, // Bits 4 - 5\n\tPOLYGON_ATTR_ENABLE_BACK_SURFACE_BIT\t\t= 6,\n\tPOLYGON_ATTR_ENABLE_FRONT_SURFACE_BIT\t\t= 7,\n\t// Bits 8 - 10 unused\n\tPOLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_BIT\t= 11,\n\tPOLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_BIT\t= 12,\n\tPOLYGON_ATTR_ENABLE_ONE_DOT_RENDER_BIT\t\t= 13,\n\tPOLYGON_ATTR_ENABLE_DEPTH_TEST_BIT\t\t\t= 14,\n\tPOLYGON_ATTR_ENABLE_FOG_BIT\t\t\t\t\t= 15,\n\tPOLYGON_ATTR_ALPHA_BIT\t\t\t\t\t\t= 16, // Bits 16 - 20\n\t// Bits 21 - 23 unused\n\tPOLYGON_ATTR_POLYGON_ID_BIT\t\t\t\t\t= 24, // Bits 24 - 29\n\t// Bits 30 - 31 unused\n};\n\n// POLYGON ATTRIBUTES - BIT MASKS\nenum\n{\n\tPOLYGON_ATTR_ENABLE_LIGHT0_MASK\t\t\t\t= 0x01 << POLYGON_ATTR_ENABLE_LIGHT0_BIT,\n\tPOLYGON_ATTR_ENABLE_LIGHT1_MASK\t\t\t\t= 0x01 << POLYGON_ATTR_ENABLE_LIGHT1_BIT,\n\tPOLYGON_ATTR_ENABLE_LIGHT2_MASK\t\t\t\t= 0x01 << POLYGON_ATTR_ENABLE_LIGHT2_BIT,\n\tPOLYGON_ATTR_ENABLE_LIGHT3_MASK\t\t\t\t= 0x01 << POLYGON_ATTR_ENABLE_LIGHT3_BIT,\n\tPOLYGON_ATTR_MODE_MASK\t\t\t\t\t\t= 0x03 << POLYGON_ATTR_MODE_BIT,\n\tPOLYGON_ATTR_ENABLE_BACK_SURFACE_MASK\t\t= 0x01 << POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT,\n\tPOLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK\t\t= 0x01 << POLYGON_ATTR_ENABLE_FRONT_SURFACE_BIT,\n\tPOLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_MASK\t= 0x01 << POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_BIT,\n\tPOLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_MASK = 0x01 << POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_BIT,\n\tPOLYGON_ATTR_ENABLE_ONE_DOT_RENDER_MASK\t\t= 0x01 << POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_BIT,\n\tPOLYGON_ATTR_ENABLE_DEPTH_TEST_MASK\t\t\t= 0x01 << POLYGON_ATTR_ENABLE_DEPTH_TEST_BIT,\n\tPOLYGON_ATTR_ENABLE_FOG_MASK\t\t\t\t= 0x01 << POLYGON_ATTR_ENABLE_FOG_BIT,\n\tPOLYGON_ATTR_ALPHA_MASK\t\t\t\t\t\t= 0x1F << POLYGON_ATTR_ALPHA_BIT,\n\tPOLYGON_ATTR_POLYGON_ID_MASK\t\t\t\t= 0x3F << POLYGON_ATTR_POLYGON_ID_BIT\n};\n\n// TEXTURE PARAMETERS - BIT LOCATIONS\nenum\n{\n\tTEXTURE_PARAM_VRAM_OFFSET_BIT\t\t\t\t= 0,  // Bits 0 - 15\n\tTEXTURE_PARAM_ENABLE_REPEAT_S_BIT\t\t\t= 16,\n\tTEXTURE_PARAM_ENABLE_REPEAT_T_BIT\t\t\t= 17,\n\tTEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_BIT\t= 18,\n\tTEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_BIT\t= 19,\n\tTEXTURE_PARAM_SIZE_S_BIT\t\t\t\t\t= 20, // Bits 20 - 22\n\tTEXTURE_PARAM_SIZE_T_BIT\t\t\t\t\t= 23, // Bits 23 - 25\n\tTEXTURE_PARAM_FORMAT_BIT\t\t\t\t\t= 26, // Bits 26 - 28\n\tTEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_BIT\t= 29,\n\tTEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT\t\t= 30  // Bits 30 - 31\n};\n\n// TEXTURE PARAMETERS - BIT MASKS\nenum\n{\n\tTEXTURE_PARAM_VRAM_OFFSET_MASK\t\t\t\t= 0xFFFF << TEXTURE_PARAM_VRAM_OFFSET_BIT,\n\tTEXTURE_PARAM_ENABLE_REPEAT_S_MASK\t\t\t= 0x01 << TEXTURE_PARAM_ENABLE_REPEAT_S_BIT,\n\tTEXTURE_PARAM_ENABLE_REPEAT_T_MASK\t\t\t= 0x01 << TEXTURE_PARAM_ENABLE_REPEAT_T_BIT,\n\tTEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_MASK\t= 0x01 << TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_BIT,\n\tTEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_MASK\t= 0x01 << TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_BIT,\n\tTEXTURE_PARAM_SIZE_S_MASK\t\t\t\t\t= 0x07 << TEXTURE_PARAM_SIZE_S_BIT,\n\tTEXTURE_PARAM_SIZE_T_MASK\t\t\t\t\t= 0x07 << TEXTURE_PARAM_SIZE_T_BIT,\n\tTEXTURE_PARAM_FORMAT_MASK\t\t\t\t\t= 0x07 << TEXTURE_PARAM_FORMAT_BIT,\n\tTEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_MASK = 0x01 << TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_BIT,\n\tTEXTURE_PARAM_COORD_TRANSFORM_MODE_MASK\t\t= 0x03 << TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT\n};\n\n// TEXTURE PARAMETERS - FORMAT ID\nenum\n{\n\tTEXMODE_NONE\t\t\t\t\t\t\t\t= 0,\n\tTEXMODE_A3I5\t\t\t\t\t\t\t\t= 1,\n\tTEXMODE_I2\t\t\t\t\t\t\t\t\t= 2,\n\tTEXMODE_I4\t\t\t\t\t\t\t\t\t= 3,\n\tTEXMODE_I8\t\t\t\t\t\t\t\t\t= 4,\n\tTEXMODE_4X4\t\t\t\t\t\t\t\t\t= 5,\n\tTEXMODE_A5I3\t\t\t\t\t\t\t\t= 6,\n\tTEXMODE_16BPP\t\t\t\t\t\t\t\t= 7\n};\n\nvoid gfx3d_init();\nvoid gfx3d_reset();\n\n#define OSWRITE(x) os->fwrite((char*)&(x),sizeof((x)));\n#define OSREAD(x) is->fread((char*)&(x),sizeof((x)));\n\ntypedef struct\n{\n\tu8\t\tenableLightFlags;\n\tbool\tenableLight0;\n\tbool\tenableLight1;\n\tbool\tenableLight2;\n\tbool\tenableLight3;\n\tu8\t\tpolygonMode;\n\tu8\t\tsurfaceCullingMode;\n\tbool\tenableRenderBackSurface;\n\tbool\tenableRenderFrontSurface;\n\tbool\tenableAlphaDepthWrite;\n\tbool\tenableRenderOnFarPlaneIntersect;\n\tbool\tenableRenderOneDot;\n\tbool\tenableDepthTest;\n\tbool\tenableRenderFog;\n\tbool\tisWireframe;\n\tbool\tisOpaque;\n\tbool\tisTranslucent;\n\tu8\t\talpha;\n\tu8\t\tpolygonID;\n} PolygonAttributes;\n\ntypedef struct\n{\n\tu16\t\tVRAMOffset;\n\tbool\tenableRepeatS;\n\tbool\tenableRepeatT;\n\tbool\tenableMirroredRepeatS;\n\tbool\tenableMirroredRepeatT;\n\tu8\t\tsizeS;\n\tu8\t\tsizeT;\n\tu8\t\ttexFormat;\n\tbool\tenableTransparentColor0;\n\tu8\t\tcoordTransformMode;\n} PolygonTexParams;\n\nstruct POLY {\n\tint type; //tri or quad\n\tu8 vtxFormat;\n\tu16 vertIndexes[4]; //up to four verts can be referenced by this poly\n\tu32 polyAttr, texParam, texPalette; //the hardware rendering params\n\tu32 viewport;\n\tfloat miny, maxy;\n\n\tvoid setVertIndexes(int a, int b, int c, int d=-1)\n\t{\n\t\tvertIndexes[0] = a;\n\t\tvertIndexes[1] = b;\n\t\tvertIndexes[2] = c;\n\t\tif(d != -1) { vertIndexes[3] = d; type = 4; }\n\t\telse type = 3;\n\t}\n\t\n\tu8 getAttributeEnableLightFlags() const\n\t{\n\t\treturn ((polyAttr & (POLYGON_ATTR_ENABLE_LIGHT0_MASK |\n\t\t\t\t\t\t\t POLYGON_ATTR_ENABLE_LIGHT1_MASK |\n\t\t\t\t\t\t\t POLYGON_ATTR_ENABLE_LIGHT2_MASK |\n\t\t\t\t\t\t\t POLYGON_ATTR_ENABLE_LIGHT3_MASK)) >> POLYGON_ATTR_ENABLE_LIGHT0_BIT);\n\t}\n\t\n\tbool getAttributeEnableLight0() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT0_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableLight1() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT1_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableLight2() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT2_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableLight3() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_LIGHT3_MASK) > 0);\n\t}\n\t\n\tu8 getAttributePolygonMode() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_MODE_MASK) >> POLYGON_ATTR_MODE_BIT);\n\t}\n\t\n\tu8 getAttributeEnableFaceCullingFlags() const\n\t{\n\t\treturn ((polyAttr & (POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK |\n\t\t\t\t\t\t\t POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK)) >> POLYGON_ATTR_ENABLE_BACK_SURFACE_BIT);\n\t}\n\t\n\tbool getAttributeEnableBackSurface() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_BACK_SURFACE_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableFrontSurface() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_FRONT_SURFACE_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableAlphaDepthWrite() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_ALPHA_DEPTH_WRITE_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableRenderOnFarPlaneIntersect() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_RENDER_ON_FAR_PLANE_INTERSECT_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableOneDotRender() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_ONE_DOT_RENDER_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableDepthTest() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_DEPTH_TEST_MASK) > 0);\n\t}\n\t\n\tbool getAttributeEnableFog() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ENABLE_FOG_MASK) > 0);\n\t}\n\t\n\tu8 getAttributeAlpha() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_ALPHA_MASK) >> POLYGON_ATTR_ALPHA_BIT);\n\t}\n\t\n\tu8 getAttributePolygonID() const\n\t{\n\t\treturn ((polyAttr & POLYGON_ATTR_POLYGON_ID_MASK) >> POLYGON_ATTR_POLYGON_ID_BIT);\n\t}\n\t\n\tPolygonAttributes getAttributes() const\n\t{\n\t\tPolygonAttributes theAttr;\n\t\t\n\t\ttheAttr.enableLightFlags\t\t\t\t= this->getAttributeEnableLightFlags();\n\t\ttheAttr.enableLight0\t\t\t\t\t= this->getAttributeEnableLight0();\n\t\ttheAttr.enableLight1\t\t\t\t\t= this->getAttributeEnableLight1();\n\t\ttheAttr.enableLight2\t\t\t\t\t= this->getAttributeEnableLight2();\n\t\ttheAttr.enableLight3\t\t\t\t\t= this->getAttributeEnableLight3();\n\t\ttheAttr.polygonMode\t\t\t\t\t\t= this->getAttributePolygonMode();\n\t\ttheAttr.surfaceCullingMode\t\t\t\t= this->getAttributeEnableFaceCullingFlags();\n\t\ttheAttr.enableRenderBackSurface\t\t\t= this->getAttributeEnableBackSurface();\n\t\ttheAttr.enableRenderFrontSurface\t\t= this->getAttributeEnableFrontSurface();\n\t\ttheAttr.enableAlphaDepthWrite\t\t\t= this->getAttributeEnableAlphaDepthWrite();\n\t\ttheAttr.enableRenderOnFarPlaneIntersect\t= this->getAttributeEnableRenderOnFarPlaneIntersect();\n\t\ttheAttr.enableRenderOneDot\t\t\t\t= this->getAttributeEnableOneDotRender();\n\t\ttheAttr.enableDepthTest\t\t\t\t\t= this->getAttributeEnableDepthTest();\n\t\ttheAttr.enableRenderFog\t\t\t\t\t= this->getAttributeEnableFog();\n\t\ttheAttr.alpha\t\t\t\t\t\t\t= this->getAttributeAlpha();\n\t\ttheAttr.isWireframe\t\t\t\t\t\t= this->isWireframe();\n\t\ttheAttr.isOpaque\t\t\t\t\t\t= this->isOpaque();\n\t\ttheAttr.isTranslucent\t\t\t\t\t= this->isTranslucent();\n\t\ttheAttr.polygonID\t\t\t\t\t\t= this->getAttributePolygonID();\n\t\t\n\t\treturn theAttr;\n\t}\n\t\n\tu16 getTexParamVRAMOffset() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_VRAM_OFFSET_MASK) >> TEXTURE_PARAM_VRAM_OFFSET_BIT);\n\t}\n\t\n\tbool getTexParamEnableRepeatS() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_ENABLE_REPEAT_S_MASK) > 0);\n\t}\n\t\n\tbool getTexParamEnableRepeatT() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_ENABLE_REPEAT_T_MASK) > 0);\n\t}\n\t\n\tbool getTexParamEnableMirroredRepeatS() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_S_MASK) > 0);\n\t}\n\t\n\tbool getTexParamEnableMirroredRepeatT() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_ENABLE_MIRRORED_REPEAT_T_MASK) > 0);\n\t}\n\t\n\tu8 getTexParamSizeS() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_SIZE_S_MASK) >> TEXTURE_PARAM_SIZE_S_BIT);\n\t}\n\t\n\tu8 getTexParamSizeT() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_SIZE_T_MASK) >> TEXTURE_PARAM_SIZE_T_BIT);\n\t}\n\t\n\tu8 getTexParamTexFormat() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_FORMAT_MASK) >> TEXTURE_PARAM_FORMAT_BIT);\n\t}\n\t\n\tbool getTexParamEnableTransparentColor0() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_ENABLE_TRANSPARENT_COLOR0_MASK) > 0);\n\t}\n\t\n\tu8 getTexParamCoordTransformMode() const\n\t{\n\t\treturn ((texParam & TEXTURE_PARAM_COORD_TRANSFORM_MODE_MASK) >> TEXTURE_PARAM_COORD_TRANSFORM_MODE_BIT);\n\t}\n\t\n\tPolygonTexParams getTexParams() const\n\t{\n\t\tPolygonTexParams theTexParams;\n\t\t\n\t\ttheTexParams.VRAMOffset\t\t\t\t\t= this->getTexParamVRAMOffset();\n\t\ttheTexParams.enableRepeatS\t\t\t\t= this->getTexParamEnableRepeatS();\n\t\ttheTexParams.enableRepeatT\t\t\t\t= this->getTexParamEnableRepeatT();\n\t\ttheTexParams.enableMirroredRepeatS\t\t= this->getTexParamEnableMirroredRepeatS();\n\t\ttheTexParams.enableMirroredRepeatT\t\t= this->getTexParamEnableMirroredRepeatT();\n\t\ttheTexParams.sizeS\t\t\t\t\t\t= this->getTexParamSizeS();\n\t\ttheTexParams.sizeT\t\t\t\t\t\t= this->getTexParamSizeT();\n\t\ttheTexParams.texFormat\t\t\t\t\t= this->getTexParamTexFormat();\n\t\ttheTexParams.enableTransparentColor0\t= this->getTexParamEnableTransparentColor0();\n\t\ttheTexParams.coordTransformMode\t\t\t= this->getTexParamCoordTransformMode();\n\t\t\n\t\treturn theTexParams;\n\t}\n\t\n\tbool isWireframe() const\n\t{\n\t\treturn (this->getAttributeAlpha() == 0);\n\t}\n\t\n\tbool isOpaque() const\n\t{\n\t\treturn (this->getAttributeAlpha() == 31);\n\t}\n\t\n\tbool isTranslucent() const\n\t{\n\t\t// First, check if the polygon is wireframe or opaque.\n\t\t// If neither, then it must be translucent.\n\t\tif (!this->isWireframe() && !this->isOpaque())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t// Also check for translucent texture format.\n\t\tu8 texFormat = this->getTexParamTexFormat();\n\t\t\n\t\t//a5i3 or a3i5 -> translucent\n\t\tif(texFormat == TEXMODE_A3I5 || texFormat == TEXMODE_A5I3) \n\t\t\treturn true;\n\t\t\n\t\treturn false;\n\t}\n\n\tvoid save(EMUFILE* os)\n\t{\n\t\tOSWRITE(type); \n\t\tOSWRITE(vertIndexes[0]); OSWRITE(vertIndexes[1]); OSWRITE(vertIndexes[2]); OSWRITE(vertIndexes[3]);\n\t\tOSWRITE(polyAttr); OSWRITE(texParam); OSWRITE(texPalette);\n\t\tOSWRITE(viewport);\n\t\tOSWRITE(miny);\n\t\tOSWRITE(maxy);\n\t}\n\n\tvoid load(EMUFILE* is)\n\t{\n\t\tOSREAD(type); \n\t\tOSREAD(vertIndexes[0]); OSREAD(vertIndexes[1]); OSREAD(vertIndexes[2]); OSREAD(vertIndexes[3]);\n\t\tOSREAD(polyAttr); OSREAD(texParam); OSREAD(texPalette);\n\t\tOSREAD(viewport);\n\t\tOSREAD(miny);\n\t\tOSREAD(maxy);\n\t}\n};\n\n#define POLYLIST_SIZE 100000\nstruct POLYLIST {\n\tPOLY list[POLYLIST_SIZE];\n\tint count;\n};\n\nstruct VERT {\n\tunion {\n\t\tfloat coord[4];\n\t\tstruct {\n\t\t\tfloat x,y,z,w;\n\t\t};\n\t};\n\tunion {\n\t\tfloat texcoord[2];\n\t\tstruct {\n\t\t\tfloat u,v;\n\t\t};\n\t};\n\tvoid set_coord(float x, float y, float z, float w) { \n\t\tthis->x = x; \n\t\tthis->y = y; \n\t\tthis->z = z; \n\t\tthis->w = w; \n\t}\n\tvoid set_coord(float* coords) { \n\t\tx = coords[0];\n\t\ty = coords[1];\n\t\tz = coords[2];\n\t\tw = coords[3];\n\t}\n\tu8 color[3];\n\tfloat fcolor[3];\n\tvoid color_to_float() {\n\t\tfcolor[0] = color[0];\n\t\tfcolor[1] = color[1];\n\t\tfcolor[2] = color[2];\n\t}\n\tvoid save(EMUFILE* os)\n\t{\n\t\tOSWRITE(x); OSWRITE(y); OSWRITE(z); OSWRITE(w);\n\t\tOSWRITE(u); OSWRITE(v);\n\t\tOSWRITE(color[0]); OSWRITE(color[1]); OSWRITE(color[2]);\n\t\tOSWRITE(fcolor[0]); OSWRITE(fcolor[1]); OSWRITE(fcolor[2]);\n\t}\n\tvoid load(EMUFILE* is)\n\t{\n\t\tOSREAD(x); OSREAD(y); OSREAD(z); OSREAD(w);\n\t\tOSREAD(u); OSREAD(v);\n\t\tOSREAD(color[0]); OSREAD(color[1]); OSREAD(color[2]);\n\t\tOSREAD(fcolor[0]); OSREAD(fcolor[1]); OSREAD(fcolor[2]);\n\t}\n};\n\n#define VERTLIST_SIZE 400000\n//#define VERTLIST_SIZE 10000\nstruct VERTLIST {\n\tVERT list[VERTLIST_SIZE];\n\tint count;\n};\n\nstruct INDEXLIST {\n\tint list[POLYLIST_SIZE];\n};\n\n\nstruct VIEWPORT {\n\tint x, y, width, height;\n\tvoid decode(u32 v);\n};\n\n//ok, imagine the plane that cuts diagonally across a cube such that it clips\n//out to be a hexagon. within that plane, draw a quad such that it cuts off\n//four corners of the hexagon, and you will observe a decagon\n#define MAX_CLIPPED_VERTS 10\n\nclass GFX3D_Clipper\n{\npublic:\n\t\n\tstruct TClippedPoly\n\t{\n\t\tint type; //otherwise known as \"count\" of verts\n\t\tPOLY* poly;\n\t\tVERT clipVerts[MAX_CLIPPED_VERTS];\n\t};\n\n\t//the entry point for poly clipping\n\ttemplate<bool hirez> void clipPoly(POLY* poly, VERT** verts);\n\n\t//the output of clipping operations goes into here.\n\t//be sure you init it before clipping!\n\tTClippedPoly *clippedPolys;\n\tint clippedPolyCounter;\n\tvoid reset() { clippedPolyCounter=0; }\n\nprivate:\n\tTClippedPoly tempClippedPoly;\n\tTClippedPoly outClippedPoly;\n\tFORCEINLINE void clipSegmentVsPlane(VERT** verts, const int coord, int which);\n\tFORCEINLINE void clipPolyVsPlane(const int coord, int which);\n};\n\n//used to communicate state to the renderer\nstruct GFX3D_State\n{\n\tGFX3D_State()\n\t\t: enableTexturing(true)\n\t\t, enableAlphaTest(true)\n\t\t, enableAlphaBlending(true)\n\t\t, enableAntialiasing(false)\n\t\t, enableEdgeMarking(false)\n\t\t, enableClearImage(false)\n\t\t, enableFog(false)\n\t\t, enableFogAlphaOnly(false)\n\t\t, shading(TOON)\n\t\t, alphaTestRef(0)\n\t\t, activeFlushCommand(0)\n\t\t, pendingFlushCommand(0)\n\t\t, clearDepth(1)\n\t\t, clearColor(0)\n\t\t, fogColor(0)\n\t\t, fogOffset(0)\n\t\t, fogShift(0)\n\t\t, invalidateToon(true)\n\t{\n\t\tfor(u32 i=0;i<ARRAY_SIZE(shininessTable);i++)\n\t\t\tshininessTable[i] = 0;\n\n\t\tfor(u32 i=0;i<ARRAY_SIZE(u16ToonTable);i++)\n\t\t\tu16ToonTable[i] = 0;\n\t}\n\n\tBOOL enableTexturing, enableAlphaTest, enableAlphaBlending, \n\t\tenableAntialiasing, enableEdgeMarking, enableClearImage, enableFog, enableFogAlphaOnly;\n\n\tstatic const u32 TOON = 0;\n\tstatic const u32 HIGHLIGHT = 1;\n\tu32 shading;\n\n\tBOOL wbuffer, sortmode;\n\tu8 alphaTestRef;\n\tu32 activeFlushCommand;\n\tu32 pendingFlushCommand;\n\n\tu32 clearDepth;\n\tu32 clearColor;\n\t#include \"PACKED.h\"\n\tstruct {\n\t\tu32 fogColor;\n\t\tu32 pad[3]; //for savestate compatibility as of 26-jul-09\n\t};\n\t#include \"PACKED_END.h\"\n\tu32 fogOffset;\n\tu32 fogShift;\n\n\tbool invalidateToon;\n\tu16 u16ToonTable[32];\n#ifdef GFX3D_USE_FLOAT\n\tfloat shininessTable[128];\n#else\n\tu8 shininessTable[128];\n#endif\n};\n\nstruct Viewer3d_State\n{\n\tint frameNumber;\n\tGFX3D_State state;\n\tVERTLIST vertlist;\n\tPOLYLIST polylist;\n\tINDEXLIST indexlist;\n};\n\nextern Viewer3d_State* viewer3d_state;\n\nstruct GFX3D\n{\n\tGFX3D()\n\t\t: polylist(0)\n\t\t, vertlist(0)\n\t\t, frameCtr(0)\n\t\t, frameCtrRaw(0) {\n\t}\n\n\t//currently set values\n\tGFX3D_State state;\n\n\t//values used for the currently-rendered frame (committed with each flush)\n\tGFX3D_State renderState;\n\n\tPOLYLIST* polylist;\n\tVERTLIST* vertlist;\n\tINDEXLIST indexlist;\n\n\t//ticks every time flush() is called\n\tint frameCtr;\n\n\t//you can use this to track how many real frames passed, for comparing to frameCtr;\n\tint frameCtrRaw;\n};\nextern GFX3D gfx3d;\n\n//---------------------\n\nextern CACHE_ALIGN u32 color_15bit_to_24bit[32768];\nextern CACHE_ALIGN u32 color_15bit_to_24bit_reverse[32768];\nextern CACHE_ALIGN u16 color_15bit_to_16bit_reverse[32768];\nextern CACHE_ALIGN u32 dsDepthExtend_15bit_to_24bit[32768];\nextern CACHE_ALIGN u8 mixTable555[32][32][32];\nextern CACHE_ALIGN const int material_5bit_to_31bit[32];\nextern CACHE_ALIGN const u8 material_5bit_to_8bit[32];\nextern CACHE_ALIGN const u8 material_3bit_to_5bit[8];\nextern CACHE_ALIGN const u8 material_3bit_to_6bit[8];\nextern CACHE_ALIGN const u8 material_3bit_to_8bit[8];\n\n//these contain the 3d framebuffer converted into the most useful format\n//they are stored here instead of in the renderers in order to consolidate the buffers\nextern CACHE_ALIGN u8 gfx3d_convertedScreen[256*192*4];\nextern CACHE_ALIGN u8 gfx3d_convertedAlpha[256*192*2]; //see cpp for explanation of illogical *2\n\nextern BOOL isSwapBuffers;\n\nint _hack_getMatrixStackLevel(int);\n\nvoid gfx3d_glFlush(u32 v);\n// end GE commands\n\nvoid gfx3d_glFogColor(u32 v);\nvoid gfx3d_glFogOffset (u32 v);\nvoid gfx3d_glClearDepth(u32 v);\nvoid gfx3d_glSwapScreen(u32 screen);\nint gfx3d_GetNumPolys();\nint gfx3d_GetNumVertex();\nvoid gfx3d_UpdateToonTable(u8 offset, u16 val);\nvoid gfx3d_UpdateToonTable(u8 offset, u32 val);\ns32 gfx3d_GetClipMatrix (u32 index);\ns32 gfx3d_GetDirectionalMatrix (u32 index);\nvoid gfx3d_glAlphaFunc(u32 v);\nu32 gfx3d_glGetPosRes(u32 index);\nu16 gfx3d_glGetVecRes(u32 index);\nvoid gfx3d_VBlankSignal();\nvoid gfx3d_VBlankEndSignal(bool skipFrame);\nvoid gfx3d_Control(u32 v);\nvoid gfx3d_execute3D();\nvoid gfx3d_sendCommandToFIFO(u32 val);\nvoid gfx3d_sendCommand(u32 cmd, u32 param);\n\n//other misc stuff\nvoid gfx3d_glGetMatrix(u32 mode, int index, float* dest);\nvoid gfx3d_glGetLightDirection(u32 index, u32* dest);\nvoid gfx3d_glGetLightColor(u32 index, u32* dest);\n\nvoid gfx3d_GetLineData(int line, u8** dst);\nvoid gfx3d_GetLineData15bpp(int line, u16** dst);\n\nstruct SFORMAT;\nextern SFORMAT SF_GFX3D[];\nvoid gfx3d_savestate(EMUFILE* os);\nbool gfx3d_loadstate(EMUFILE* is, int size);\n\nvoid gfx3d_ClearStack();\n\n#endif //_GFX3D_H_\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/instruction_attributes.h",
    "content": "/*\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2011 Loren Merritt\n\tCopyright (C) 2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 3 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef instruction_attributes_H_\n#define instruction_attributes_H_\n\n#include \"types.h\"\n\n#define INSTR_CYCLES_MASK  0x7\n#define INSTR_CYCLES(c) c       // constant cycles. does not include the penalty for writing to r15 for instructions other than dedicated branches.\n#define INSTR_CYCLES_VARIABLE 0 // duration to be determined at runtime\n#define INSTR_CYCLES_V INSTR_CYCLES_VARIABLE\n\n#define SRCREG_NONE     0x0000\n#define SRCREG_POS0     0x0008\n#define SRCREG_POS3     0x0010\n#define SRCREG_POS8     0x0020\n#define SRCREG_POS12    0x0040\n#define SRCREG_POS16    0x0080\n#define SRCREG_STM      0x0100\n\n#define BRANCH_NEVER   0x00000000\n#define BRANCH_ALWAYS  0x00000800\n#define BRANCH_POS0    0x00001000 // branch if (REG_NUM(i,0)|((i>>4)&8))==15\n#define BRANCH_POS12   0x00002000 // branch if REG_POS(i,12)==15\n#define BRANCH_LDM     0x00004000\n#define BRANCH_SWI     0x00008000 // branch if use external SWI - if (cpu->swi_tab == NULL)\n\n#define JIT_BYPASS     0x80000000 // JIT makes no assumptions about what this instruction does\n\nstatic const u32 instruction_attributes[4096] = {\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_MUL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_AND_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_MUL_S\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_POS_INDE_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_POS_INDE_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_AND_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_POS_INDE_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_MLA\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_EOR_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_MLA_S\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_EOR_S_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SUB_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_POS_INDE_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_POS_INDE_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SUB_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_POS_INDE_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSB_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSB_S_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_UMULL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADD_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_UMULL_S\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_POS_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_POS_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADD_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_POS_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_UMLAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ADC_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_UMLAL_S\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ADC_S_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_POS_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_POST_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_SBC_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULL_S\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_POS_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_POS_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_SBC_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_POS_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_RSC_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSL_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_S\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_LSR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ASR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_RSC_S_ROR_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MRS_CPSR\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QADD\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_B_B\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_SWP\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_T_B\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_M_REG_OFF\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_B_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLA_T_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_LSL_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_LSR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_ASR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TST_ROR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TST_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0, //OP_MSR_CPSR\nINSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS0, //OP_BX\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS0, //OP_BLX_REG\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QSUB\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_BKPT\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLAW_B\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULW_B\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_M_REG_OFF\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12, //OP_SMLAW_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMULW_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_LSL_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_LSR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_ASR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_TEQ_ROR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_PRE_INDE_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_PRE_INDE_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_TEQ_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_PRE_INDE_M_REG_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MRS_SPSR\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QDADD\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_B_B\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_SWPB\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_T_B\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_M_IMM_OFF\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_B_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS12 | SRCREG_POS16, //OP_SMLAL_T_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_LSL_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_LSR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_ASR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMP_ROR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMP_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0, //OP_MSR_SPSR\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0, //OP_CLZ\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_QDSUB\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_B_B\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_T_B\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_M_IMM_OFF\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_B_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8, //OP_SMUL_T_T\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_LSL_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_LSR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_ASR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_CMN_ROR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_PRE_INDE_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_PRE_INDE_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_CMN_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_PRE_INDE_M_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_ORR_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_ORR_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MOV_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRH_PRE_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSB_PRE_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MOV_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRSH_PRE_INDE_P_REG_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8 | SRCREG_POS16, //OP_BIC_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_BIC_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRH_PRE_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRD_STRD_OFFSET_PRE_INDEX\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSL_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_LSL_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_LSR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ASR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_ASR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ROR_IMM\nINSTR_CYCLES(2) | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS8, //OP_MVN_S_ROR_REG\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSL_IMM\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_LSR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRH_PRE_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ASR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSB_PRE_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS0, //OP_MVN_S_ROR_IMM\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRSH_PRE_INDE_P_IMM_OFF\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_AND_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_EOR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SUB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSB_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADD_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ADC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_SBC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_RSC_S_IMM_VAL\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TST_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_CPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_TEQ_IMM_VAL\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMP_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MSR_SPSR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS16, //OP_CMN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_ORR_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MOV_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_POS16, //OP_BIC_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES(1) | BRANCH_POS12 | SRCREG_NONE, //OP_MVN_S_IMM_VAL\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_POSTIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_M_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS16, //OP_LDR_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS16, //OP_LDRB_P_IMM_OFF_PREIND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_POSTIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_M_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STR_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_POS12 | SRCREG_POS0 | SRCREG_POS16, //OP_LDR_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS12 | SRCREG_POS16, //OP_STRB_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSL_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_LSR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ASR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS16, //OP_LDRB_P_ROR_IMM_OFF_PREIND\nJIT_BYPASS, //OP_UND\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIA2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMDB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_NEVER | SRCREG_STM | SRCREG_POS16, //OP_STMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES_V  | BRANCH_LDM | SRCREG_POS16, //OP_LDMIB2_W\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_B\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BL\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_STC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_LDC_M_POSTIND\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_STC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_LDC_OPTION\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_STC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_LDC_P_POSTIND\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_LDC_M_IMM_OFF\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_STC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_LDC_M_PREIND\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_LDC_P_IMM_OFF\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_STC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_LDC_P_PREIND\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(2) | BRANCH_NEVER,  //OP_MCR\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nJIT_BYPASS, //OP_CDP\nINSTR_CYCLES(3) | BRANCH_NEVER,  //OP_MRC\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI\n};\n\nstatic const u32 thumb_attributes[1024] = {\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL_0\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR_0\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_LSR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR_0\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ASR\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM3\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MOV_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SUB_IMM8\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_AND\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_EOR\nINSTR_CYCLES(2) | BRANCH_NEVER, //OP_LSL_REG\nINSTR_CYCLES(2) | BRANCH_NEVER, //OP_LSR_REG\nINSTR_CYCLES(2) | BRANCH_NEVER, //OP_ASR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADC_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_SBC_REG\nINSTR_CYCLES(2) | BRANCH_NEVER, //OP_ROR_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_TST\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_NEG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_CMN\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ORR\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_MUL_REG\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_BIC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_MVN\nINSTR_CYCLES(1) | BRANCH_POS0  | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE\nINSTR_CYCLES(1) | BRANCH_POS0  | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE\nINSTR_CYCLES(1) | BRANCH_POS0  | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE\nINSTR_CYCLES(1) | BRANCH_POS0  | SRCREG_POS0 | SRCREG_POS3, //OP_ADD_SPE\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE\nINSTR_CYCLES(1) | BRANCH_NEVER | SRCREG_POS0 | SRCREG_POS3, //OP_CMP_SPE\nINSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE\nINSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE\nINSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE\nINSTR_CYCLES(1) | BRANCH_POS0 | SRCREG_POS3, //OP_MOV_SPE\nINSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BX_THUMB\nINSTR_CYCLES(3) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BX_THUMB\nINSTR_CYCLES(4) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BLX_THUMB\nINSTR_CYCLES(4) | BRANCH_ALWAYS | SRCREG_POS3, //OP_BLX_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_PCREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRSH_REG_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRB_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDRH_IMM_OFF\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDR_SPREL\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2PC\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADD_2SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_P_SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_P_SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_M_SP\nINSTR_CYCLES(1) | BRANCH_NEVER, //OP_ADJUST_M_SP\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH_LR\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH_LR\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH_LR\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_PUSH_LR\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_POP\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_POP\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_POP\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_POP\nINSTR_CYCLES_V  | BRANCH_ALWAYS, //OP_POP_PC\nINSTR_CYCLES_V  | BRANCH_ALWAYS, //OP_POP_PC\nINSTR_CYCLES_V  | BRANCH_ALWAYS, //OP_POP_PC\nINSTR_CYCLES_V  | BRANCH_ALWAYS, //OP_POP_PC\nJIT_BYPASS, //OP_BKPT_THUMB\nJIT_BYPASS, //OP_BKPT_THUMB\nJIT_BYPASS, //OP_BKPT_THUMB\nJIT_BYPASS, //OP_BKPT_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nJIT_BYPASS, //OP_UND_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_STMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES_V  | BRANCH_NEVER, //OP_LDMIA_THUMB\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_COND\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI_THUMB\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI_THUMB\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI_THUMB\nINSTR_CYCLES_V  | BRANCH_SWI, //OP_SWI_THUMB\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(1) | BRANCH_ALWAYS, //OP_B_UNCOND\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(3) | BRANCH_ALWAYS, //OP_BLX\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(1) | BRANCH_NEVER , //OP_BL_10\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\nINSTR_CYCLES(4) | BRANCH_ALWAYS, //OP_BL_11\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/instruction_tabdef.inc",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2007-2012 DeSmuME team\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* 0000 0000 0000 */ TABDECL(OP_AND_LSL_IMM),\t\t// OP_AND_LSL_IMM\n/* 0000 0000 0001 */ TABDECL(OP_AND_LSL_REG),\t\t// OP_AND_LSL_REG\n/* 0000 0000 0010 */ TABDECL(OP_AND_LSR_IMM),\t\t// OP_AND_LSR_IMM\n/* 0000 0000 0011 */ TABDECL(OP_AND_LSR_REG),\t\t// OP_AND_LSR_REG\n/* 0000 0000 0100 */ TABDECL(OP_AND_ASR_IMM),\t\t// OP_AND_ASR_IMM\n/* 0000 0000 0101 */ TABDECL(OP_AND_ASR_REG),\t\t// OP_AND_ASR_REG\n/* 0000 0000 0110 */ TABDECL(OP_AND_ROR_IMM),\t\t// OP_AND_ROR_IMM\n/* 0000 0000 0111 */ TABDECL(OP_AND_ROR_REG),\t\t// OP_AND_ROR_REG\n/* 0000 0000 1000 */ TABDECL(OP_AND_LSL_IMM),\t\t// OP_AND_LSL_IMM\n/* 0000 0000 1001 */ TABDECL(OP_MUL),\t\t// OP_MUL\n/* 0000 0000 1010 */ TABDECL(OP_AND_LSR_IMM),\t\t// OP_AND_LSR_IMM\n/* 0000 0000 1011 */ TABDECL(OP_STRH_POS_INDE_M_REG_OFF),\t\t// OP_STRH_POS_INDE_M_REG_OFF\n/* 0000 0000 1100 */ TABDECL(OP_AND_ASR_IMM),\t\t// OP_AND_ASR_IMM\n/* 0000 0000 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n/* 0000 0000 1110 */ TABDECL(OP_AND_ROR_IMM),\t\t// OP_AND_ROR_IMM\n/* 0000 0000 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n\n/* 0000 0001 0000 */ TABDECL(OP_AND_S_LSL_IMM),\t\t// OP_AND_S_LSL_IMM\n/* 0000 0001 0001 */ TABDECL(OP_AND_S_LSL_REG),\t\t// OP_AND_S_LSL_REG\n/* 0000 0001 0010 */ TABDECL(OP_AND_S_LSR_IMM),\t\t// OP_AND_S_LSR_IMM\n/* 0000 0001 0011 */ TABDECL(OP_AND_S_LSR_REG),\t\t// OP_AND_S_LSR_REG\n/* 0000 0001 0100 */ TABDECL(OP_AND_S_ASR_IMM),\t\t// OP_AND_S_ASR_IMM\n/* 0000 0001 0101 */ TABDECL(OP_AND_S_ASR_REG),\t\t// OP_AND_S_ASR_REG\n/* 0000 0001 0110 */ TABDECL(OP_AND_S_ROR_IMM),\t\t// OP_AND_S_ROR_IMM\n/* 0000 0001 0111 */ TABDECL(OP_AND_S_ROR_REG),\t\t// OP_AND_S_ROR_REG\n/* 0000 0001 1000 */ TABDECL(OP_AND_S_LSL_IMM),\t\t// OP_AND_S_LSL_IMM\n/* 0000 0001 1001 */ TABDECL(OP_MUL_S),\t\t// OP_MUL_S\n/* 0000 0001 1010 */ TABDECL(OP_AND_S_LSR_IMM),\t\t// OP_AND_S_LSR_IMM\n/* 0000 0001 1011 */ TABDECL(OP_LDRH_POS_INDE_M_REG_OFF),\t\t// OP_LDRH_POS_INDE_M_REG_OFF\n/* 0000 0001 1100 */ TABDECL(OP_AND_S_ASR_IMM),\t\t// OP_AND_S_ASR_IMM\n/* 0000 0001 1101 */ TABDECL(OP_LDRSB_POS_INDE_M_REG_OFF),\t\t// OP_LDRSB_POS_INDE_M_REG_OFF\n/* 0000 0001 1110 */ TABDECL(OP_AND_S_ROR_IMM),\t\t// OP_AND_S_ROR_IMM\n/* 0000 0001 1111 */ TABDECL(OP_LDRSH_POS_INDE_M_REG_OFF),\t\t// OP_LDRSH_POS_INDE_M_REG_OFF\n\n/* 0000 0010 0000 */ TABDECL(OP_EOR_LSL_IMM),\t\t// OP_EOR_LSL_IMM\n/* 0000 0010 0001 */ TABDECL(OP_EOR_LSL_REG),\t\t// OP_EOR_LSL_REG\n/* 0000 0010 0010 */ TABDECL(OP_EOR_LSR_IMM),\t\t// OP_EOR_LSR_IMM\n/* 0000 0010 0011 */ TABDECL(OP_EOR_LSR_REG),\t\t// OP_EOR_LSR_REG\n/* 0000 0010 0100 */ TABDECL(OP_EOR_ASR_IMM),\t\t// OP_EOR_ASR_IMM\n/* 0000 0010 0101 */ TABDECL(OP_EOR_ASR_REG),\t\t// OP_EOR_ASR_REG\n/* 0000 0010 0110 */ TABDECL(OP_EOR_ROR_IMM),\t\t// OP_EOR_ROR_IMM\n/* 0000 0010 0111 */ TABDECL(OP_EOR_ROR_REG),\t\t// OP_EOR_ROR_REG\n/* 0000 0010 1000 */ TABDECL(OP_EOR_LSL_IMM),\t\t// OP_EOR_LSL_IMM\n/* 0000 0010 1001 */ TABDECL(OP_MLA),\t\t// OP_MLA\n/* 0000 0010 1010 */ TABDECL(OP_EOR_LSR_IMM),\t\t// OP_EOR_LSR_IMM\n/* 0000 0010 1011 */ TABDECL(OP_UND),\n/* 0000 0010 1100 */ TABDECL(OP_EOR_ASR_IMM),\t\t// OP_EOR_ASR_IMM\n/* 0000 0010 1101 */ TABDECL(OP_UND),\n/* 0000 0010 1110 */ TABDECL(OP_EOR_ROR_IMM),\t\t// OP_EOR_ROR_IMM\n/* 0000 0010 1111 */ TABDECL(OP_UND),\n\n/* 0000 0011 0000 */ TABDECL(OP_EOR_S_LSL_IMM),\t\t// OP_EOR_S_LSL_IMM\n/* 0000 0011 0001 */ TABDECL(OP_EOR_S_LSL_REG),\t\t// OP_EOR_S_LSL_REG\n/* 0000 0011 0010 */ TABDECL(OP_EOR_S_LSR_IMM),\t\t// OP_EOR_S_LSR_IMM\n/* 0000 0011 0011 */ TABDECL(OP_EOR_S_LSR_REG),\t\t// OP_EOR_S_LSR_REG\n/* 0000 0011 0100 */ TABDECL(OP_EOR_S_ASR_IMM),\t\t// OP_EOR_S_ASR_IMM\n/* 0000 0011 0101 */ TABDECL(OP_EOR_S_ASR_REG),\t\t// OP_EOR_S_ASR_REG\n/* 0000 0011 0110 */ TABDECL(OP_EOR_S_ROR_IMM),\t\t// OP_EOR_S_ROR_IMM\n/* 0000 0011 0111 */ TABDECL(OP_EOR_S_ROR_REG),\t\t// OP_EOR_S_ROR_REG\n/* 0000 0011 1000 */ TABDECL(OP_EOR_S_LSL_IMM),\t\t// OP_EOR_S_LSL_IMM\n/* 0000 0011 1001 */ TABDECL(OP_MLA_S),\t\t// OP_MLA_S\n/* 0000 0011 1010 */ TABDECL(OP_EOR_S_LSR_IMM),\t\t// OP_EOR_S_LSR_IMM\n/* 0000 0011 1011 */ TABDECL(OP_UND),\n/* 0000 0011 1100 */ TABDECL(OP_EOR_S_ASR_IMM),\t\t// OP_EOR_S_ASR_IMM\n/* 0000 0011 1101 */ TABDECL(OP_UND),\n/* 0000 0011 1110 */ TABDECL(OP_EOR_S_ROR_IMM),\t\t// OP_EOR_S_ROR_IMM\n/* 0000 0011 1111 */ TABDECL(OP_UND),\n\n/* 0000 0100 0000 */ TABDECL(OP_SUB_LSL_IMM),\t\t// OP_SUB_LSL_IMM\n/* 0000 0100 0001 */ TABDECL(OP_SUB_LSL_REG),\t\t// OP_SUB_LSL_REG\n/* 0000 0100 0010 */ TABDECL(OP_SUB_LSR_IMM),\t\t// OP_SUB_LSR_IMM\n/* 0000 0100 0011 */ TABDECL(OP_SUB_LSR_REG),\t\t// OP_SUB_LSR_REG\n/* 0000 0100 0100 */ TABDECL(OP_SUB_ASR_IMM),\t\t// OP_SUB_ASR_IMM\n/* 0000 0100 0101 */ TABDECL(OP_SUB_ASR_REG),\t\t// OP_SUB_ASR_REG\n/* 0000 0100 0110 */ TABDECL(OP_SUB_ROR_IMM),\t\t// OP_SUB_ROR_IMM\n/* 0000 0100 0111 */ TABDECL(OP_SUB_ROR_REG),\t\t// OP_SUB_ROR_REG\n/* 0000 0100 1000 */ TABDECL(OP_SUB_LSL_IMM),\t\t// OP_SUB_LSL_IMM\n/* 0000 0100 1001 */ TABDECL(OP_UND),\n/* 0000 0100 1010 */ TABDECL(OP_SUB_LSR_IMM),\t\t// OP_SUB_LSR_IMM\n/* 0000 0100 1011 */ TABDECL(OP_STRH_POS_INDE_M_IMM_OFF),\t\t// OP_STRH_POS_INDE_M_IMM_OFF\n/* 0000 0100 1100 */ TABDECL(OP_SUB_ASR_IMM),\t\t// OP_SUB_ASR_IMM\n/* 0000 0100 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n/* 0000 0100 1110 */ TABDECL(OP_SUB_ROR_IMM),\t\t// OP_SUB_ROR_IMM\n/* 0000 0100 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n\n/* 0000 0101 0000 */ TABDECL(OP_SUB_S_LSL_IMM),\t\t// OP_SUB_S_LSL_IMM\n/* 0000 0101 0001 */ TABDECL(OP_SUB_S_LSL_REG),\t\t// OP_SUB_S_LSL_REG\n/* 0000 0101 0010 */ TABDECL(OP_SUB_S_LSR_IMM),\t\t// OP_SUB_S_LSR_IMM\n/* 0000 0101 0011 */ TABDECL(OP_SUB_S_LSR_REG),\t\t// OP_SUB_S_LSR_REG\n/* 0000 0101 0100 */ TABDECL(OP_SUB_S_ASR_IMM),\t\t// OP_SUB_S_ASR_IMM\n/* 0000 0101 0101 */ TABDECL(OP_SUB_S_ASR_REG),\t\t// OP_SUB_S_ASR_REG\n/* 0000 0101 0110 */ TABDECL(OP_SUB_S_ROR_IMM),\t\t// OP_SUB_S_ROR_IMM\n/* 0000 0101 0111 */ TABDECL(OP_SUB_S_ROR_REG),\t\t// OP_SUB_S_ROR_REG\n/* 0000 0101 1000 */ TABDECL(OP_SUB_S_LSL_IMM),\t\t// OP_SUB_S_LSL_IMM\n/* 0000 0101 1001 */ TABDECL(OP_UND),\n/* 0000 0101 1010 */ TABDECL(OP_SUB_S_LSR_IMM),\t\t// OP_SUB_S_LSR_IMM\n/* 0000 0101 1011 */ TABDECL(OP_LDRH_POS_INDE_M_IMM_OFF),\t\t// OP_LDRH_POS_INDE_M_IMM_OFF\n/* 0000 0101 1100 */ TABDECL(OP_SUB_S_ASR_IMM),\t\t// OP_SUB_S_ASR_IMM\n/* 0000 0101 1101 */ TABDECL(OP_LDRSB_POS_INDE_M_IMM_OFF),\t\t// OP_LDRSB_POS_INDE_M_IMM_OFF\n/* 0000 0101 1110 */ TABDECL(OP_SUB_S_ROR_IMM),\t\t// OP_SUB_S_ROR_IMM\n/* 0000 0101 1111 */ TABDECL(OP_LDRSH_POS_INDE_M_IMM_OFF),\t\t// OP_LDRSH_POS_INDE_M_IMM_OFF\n\n/* 0000 0110 0000 */ TABDECL(OP_RSB_LSL_IMM),\t\t// OP_RSB_LSL_IMM\n/* 0000 0110 0001 */ TABDECL(OP_RSB_LSL_REG),\t\t// OP_RSB_LSL_REG\n/* 0000 0110 0010 */ TABDECL(OP_RSB_LSR_IMM),\t\t// OP_RSB_LSR_IMM\n/* 0000 0110 0011 */ TABDECL(OP_RSB_LSR_REG),\t\t// OP_RSB_LSR_REG\n/* 0000 0110 0100 */ TABDECL(OP_RSB_ASR_IMM),\t\t// OP_RSB_ASR_IMM\n/* 0000 0110 0101 */ TABDECL(OP_RSB_ASR_REG),\t\t// OP_RSB_ASR_REG\n/* 0000 0110 0110 */ TABDECL(OP_RSB_ROR_IMM),\t\t// OP_RSB_ROR_IMM\n/* 0000 0110 0111 */ TABDECL(OP_RSB_ROR_REG),\t\t// OP_RSB_ROR_REG\n/* 0000 0110 1000 */ TABDECL(OP_RSB_LSL_IMM),\t\t// OP_RSB_LSL_IMM\n/* 0000 0110 1001 */ TABDECL(OP_UND),\n/* 0000 0110 1010 */ TABDECL(OP_RSB_LSR_IMM),\t\t// OP_RSB_LSR_IMM\n/* 0000 0110 1011 */ TABDECL(OP_UND),\n/* 0000 0110 1100 */ TABDECL(OP_RSB_ASR_IMM),\t\t// OP_RSB_ASR_IMM\n/* 0000 0110 1101 */ TABDECL(OP_UND),\n/* 0000 0110 1110 */ TABDECL(OP_RSB_ROR_IMM),\t\t// OP_RSB_ROR_IMM\n/* 0000 0110 1111 */ TABDECL(OP_UND),\n\n/* 0000 0111 0000 */ TABDECL(OP_RSB_S_LSL_IMM),\t\t// OP_RSB_S_LSL_IMM\n/* 0000 0111 0001 */ TABDECL(OP_RSB_S_LSL_REG),\t\t// OP_RSB_S_LSL_REG\n/* 0000 0111 0010 */ TABDECL(OP_RSB_S_LSR_IMM),\t\t// OP_RSB_S_LSR_IMM\n/* 0000 0111 0011 */ TABDECL(OP_RSB_S_LSR_REG),\t\t// OP_RSB_S_LSR_REG\n/* 0000 0111 0100 */ TABDECL(OP_RSB_S_ASR_IMM),\t\t// OP_RSB_S_ASR_IMM\n/* 0000 0111 0101 */ TABDECL(OP_RSB_S_ASR_REG),\t\t// OP_RSB_S_ASR_REG\n/* 0000 0111 0110 */ TABDECL(OP_RSB_S_ROR_IMM),\t\t// OP_RSB_S_ROR_IMM\n/* 0000 0111 0111 */ TABDECL(OP_RSB_S_ROR_REG),\t\t// OP_RSB_S_ROR_REG\n/* 0000 0111 1000 */ TABDECL(OP_RSB_S_LSL_IMM),\t\t// OP_RSB_S_LSL_IMM\n/* 0000 0111 1001 */ TABDECL(OP_UND),\n/* 0000 0111 1010 */ TABDECL(OP_RSB_S_LSR_IMM),\t\t// OP_RSB_S_LSR_IMM\n/* 0000 0111 1011 */ TABDECL(OP_UND),\n/* 0000 0111 1100 */ TABDECL(OP_RSB_S_ASR_IMM),\t\t// OP_RSB_S_ASR_IMM\n/* 0000 0111 1101 */ TABDECL(OP_UND),\n/* 0000 0111 1110 */ TABDECL(OP_RSB_S_ROR_IMM),\t\t// OP_RSB_S_ROR_IMM\n/* 0000 0111 1111 */ TABDECL(OP_UND),\n\n/* 0000 1000 0000 */ TABDECL(OP_ADD_LSL_IMM),\t\t// OP_ADD_LSL_IMM\n/* 0000 1000 0001 */ TABDECL(OP_ADD_LSL_REG),\t\t// OP_ADD_LSL_REG\n/* 0000 1000 0010 */ TABDECL(OP_ADD_LSR_IMM),\t\t// OP_ADD_LSR_IMM\n/* 0000 1000 0011 */ TABDECL(OP_ADD_LSR_REG),\t\t// OP_ADD_LSR_REG\n/* 0000 1000 0100 */ TABDECL(OP_ADD_ASR_IMM),\t\t// OP_ADD_ASR_IMM\n/* 0000 1000 0101 */ TABDECL(OP_ADD_ASR_REG),\t\t// OP_ADD_ASR_REG\n/* 0000 1000 0110 */ TABDECL(OP_ADD_ROR_IMM),\t\t// OP_ADD_ROR_IMM\n/* 0000 1000 0111 */ TABDECL(OP_ADD_ROR_REG),\t\t// OP_ADD_ROR_REG\n/* 0000 1000 1000 */ TABDECL(OP_ADD_LSL_IMM),\t\t// OP_ADD_LSL_IMM\n/* 0000 1000 1001 */ TABDECL(OP_UMULL),\t\t// OP_UMULL\n/* 0000 1000 1010 */ TABDECL(OP_ADD_LSR_IMM),\t\t// OP_ADD_LSR_IMM\n/* 0000 1000 1011 */ TABDECL(OP_STRH_POS_INDE_P_REG_OFF),\t\t// OP_STRH_POS_INDE_P_REG_OFF\n/* 0000 1000 1100 */ TABDECL(OP_ADD_ASR_IMM),\t\t// OP_ADD_ASR_IMM\n/* 0000 1000 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n/* 0000 1000 1110 */ TABDECL(OP_ADD_ROR_IMM),\t\t// OP_ADD_ROR_IMM\n/* 0000 1000 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n\n/* 0000 1001 0000 */ TABDECL(OP_ADD_S_LSL_IMM),\t\t// OP_ADD_S_LSL_IMM\n/* 0000 1001 0001 */ TABDECL(OP_ADD_S_LSL_REG),\t\t// OP_ADD_S_LSL_REG\n/* 0000 1001 0010 */ TABDECL(OP_ADD_S_LSR_IMM),\t\t// OP_ADD_S_LSR_IMM\n/* 0000 1001 0011 */ TABDECL(OP_ADD_S_LSR_REG),\t\t// OP_ADD_S_LSR_REG\n/* 0000 1001 0100 */ TABDECL(OP_ADD_S_ASR_IMM),\t\t// OP_ADD_S_ASR_IMM\n/* 0000 1001 0101 */ TABDECL(OP_ADD_S_ASR_REG),\t\t// OP_ADD_S_ASR_REG\n/* 0000 1001 0110 */ TABDECL(OP_ADD_S_ROR_IMM),\t\t// OP_ADD_S_ROR_IMM\n/* 0000 1001 0111 */ TABDECL(OP_ADD_S_ROR_REG),\t\t// OP_ADD_S_ROR_REG\n/* 0000 1001 1000 */ TABDECL(OP_ADD_S_LSL_IMM),\t\t// OP_ADD_S_LSL_IMM\n/* 0000 1001 1001 */ TABDECL(OP_UMULL_S),\t\t// OP_UMULL_S\n/* 0000 1001 1010 */ TABDECL(OP_ADD_S_LSR_IMM),\t\t// OP_ADD_S_LSR_IMM\n/* 0000 1001 1011 */ TABDECL(OP_LDRH_POS_INDE_P_REG_OFF),\t\t// OP_LDRH_POS_INDE_P_REG_OFF\n/* 0000 1001 1100 */ TABDECL(OP_ADD_S_ASR_IMM),\t\t// OP_ADD_S_ASR_IMM\n/* 0000 1001 1101 */ TABDECL(OP_LDRSB_POS_INDE_P_REG_OFF),\t\t// OP_LDRSB_POS_INDE_P_REG_OFF\n/* 0000 1001 1110 */ TABDECL(OP_ADD_S_ROR_IMM),\t\t// OP_ADD_S_ROR_IMM\n/* 0000 1001 1111 */ TABDECL(OP_LDRSH_POS_INDE_P_REG_OFF),\t\t// OP_LDRSH_POS_INDE_P_REG_OFF\n\n/* 0000 1010 0000 */ TABDECL(OP_ADC_LSL_IMM),\t\t// OP_ADC_LSL_IMM\n/* 0000 1010 0001 */ TABDECL(OP_ADC_LSL_REG),\t\t// OP_ADC_LSL_REG\n/* 0000 1010 0010 */ TABDECL(OP_ADC_LSR_IMM),\t\t// OP_ADC_LSR_IMM\n/* 0000 1010 0011 */ TABDECL(OP_ADC_LSR_REG),\t\t// OP_ADC_LSR_REG\n/* 0000 1010 0100 */ TABDECL(OP_ADC_ASR_IMM),\t\t// OP_ADC_ASR_IMM\n/* 0000 1010 0101 */ TABDECL(OP_ADC_ASR_REG),\t\t// OP_ADC_ASR_REG\n/* 0000 1010 0110 */ TABDECL(OP_ADC_ROR_IMM),\t\t// OP_ADC_ROR_IMM\n/* 0000 1010 0111 */ TABDECL(OP_ADC_ROR_REG),\t\t// OP_ADC_ROR_REG\n/* 0000 1010 1000 */ TABDECL(OP_ADC_LSL_IMM),\t\t// OP_ADC_LSL_IMM\n/* 0000 1010 1001 */ TABDECL(OP_UMLAL),\t\t// OP_UMLAL\n/* 0000 1010 1010 */ TABDECL(OP_ADC_LSR_IMM),\t\t// OP_ADC_LSR_IMM\n/* 0000 1010 1011 */ TABDECL(OP_UND),\n/* 0000 1010 1100 */ TABDECL(OP_ADC_ASR_IMM),\t\t// OP_ADC_ASR_IMM\n/* 0000 1010 1101 */ TABDECL(OP_UND),\n/* 0000 1010 1110 */ TABDECL(OP_ADC_ROR_IMM),\t\t// OP_ADC_ROR_IMM\n/* 0000 1010 1111 */ TABDECL(OP_UND),\n\n/* 0000 1011 0000 */ TABDECL(OP_ADC_S_LSL_IMM),\t\t// OP_ADC_S_LSL_IMM\n/* 0000 1011 0001 */ TABDECL(OP_ADC_S_LSL_REG),\t\t// OP_ADC_S_LSL_REG\n/* 0000 1011 0010 */ TABDECL(OP_ADC_S_LSR_IMM),\t\t// OP_ADC_S_LSR_IMM\n/* 0000 1011 0011 */ TABDECL(OP_ADC_S_LSR_REG),\t\t// OP_ADC_S_LSR_REG\n/* 0000 1011 0100 */ TABDECL(OP_ADC_S_ASR_IMM),\t\t// OP_ADC_S_ASR_IMM\n/* 0000 1011 0101 */ TABDECL(OP_ADC_S_ASR_REG),\t\t// OP_ADC_S_ASR_REG\n/* 0000 1011 0110 */ TABDECL(OP_ADC_S_ROR_IMM),\t\t// OP_ADC_S_ROR_IMM\n/* 0000 1011 0111 */ TABDECL(OP_ADC_S_ROR_REG),\t\t// OP_ADC_S_ROR_REG\n/* 0000 1011 1000 */ TABDECL(OP_ADC_S_LSL_IMM),\t\t// OP_ADC_S_LSL_IMM\n/* 0000 1011 1001 */ TABDECL(OP_UMLAL_S),\t\t// OP_UMLAL_S\n/* 0000 1011 1010 */ TABDECL(OP_ADC_S_LSR_IMM),\t\t// OP_ADC_S_LSR_IMM\n/* 0000 1011 1011 */ TABDECL(OP_UND),\n/* 0000 1011 1100 */ TABDECL(OP_ADC_S_ASR_IMM),\t\t// OP_ADC_S_ASR_IMM\n/* 0000 1011 1101 */ TABDECL(OP_UND),\n/* 0000 1011 1110 */ TABDECL(OP_ADC_S_ROR_IMM),\t\t// OP_ADC_S_ROR_IMM\n/* 0000 1011 1111 */ TABDECL(OP_UND),\n\n/* 0000 1100 0000 */ TABDECL(OP_SBC_LSL_IMM),\t\t// OP_SBC_LSL_IMM\n/* 0000 1100 0001 */ TABDECL(OP_SBC_LSL_REG),\t\t// OP_SBC_LSL_REG\n/* 0000 1100 0010 */ TABDECL(OP_SBC_LSR_IMM),\t\t// OP_SBC_LSR_IMM\n/* 0000 1100 0011 */ TABDECL(OP_SBC_LSR_REG),\t\t// OP_SBC_LSR_REG\n/* 0000 1100 0100 */ TABDECL(OP_SBC_ASR_IMM),\t\t// OP_SBC_ASR_IMM\n/* 0000 1100 0101 */ TABDECL(OP_SBC_ASR_REG),\t\t// OP_SBC_ASR_REG\n/* 0000 1100 0110 */ TABDECL(OP_SBC_ROR_IMM),\t\t// OP_SBC_ROR_IMM\n/* 0000 1100 0111 */ TABDECL(OP_SBC_ROR_REG),\t\t// OP_SBC_ROR_REG\n/* 0000 1100 1000 */ TABDECL(OP_SBC_LSL_IMM),\t\t// OP_SBC_LSL_IMM\n/* 0000 1100 1001 */ TABDECL(OP_SMULL),\t\t// OP_SMULL\n/* 0000 1100 1010 */ TABDECL(OP_SBC_LSR_IMM),\t\t// OP_SBC_LSR_IMM\n/* 0000 1100 1011 */ TABDECL(OP_STRH_POS_INDE_P_IMM_OFF),\t\t// OP_STRH_POS_INDE_P_IMM_OFF\n/* 0000 1100 1100 */ TABDECL(OP_SBC_ASR_IMM),\t\t// OP_SBC_ASR_IMM\n/* 0000 1100 1101 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n/* 0000 1100 1110 */ TABDECL(OP_SBC_ROR_IMM),\t\t// OP_SBC_ROR_IMM\n/* 0000 1100 1111 */ TABDECL(OP_LDRD_STRD_POST_INDEX),\t\t// OP_LDRD_STRD_POST_INDEX\n\n/* 0000 1101 0000 */ TABDECL(OP_SBC_S_LSL_IMM),\t\t// OP_SBC_S_LSL_IMM\n/* 0000 1101 0001 */ TABDECL(OP_SBC_S_LSL_REG),\t\t// OP_SBC_S_LSL_REG\n/* 0000 1101 0010 */ TABDECL(OP_SBC_S_LSR_IMM),\t\t// OP_SBC_S_LSR_IMM\n/* 0000 1101 0011 */ TABDECL(OP_SBC_S_LSR_REG),\t\t// OP_SBC_S_LSR_REG\n/* 0000 1101 0100 */ TABDECL(OP_SBC_S_ASR_IMM),\t\t// OP_SBC_S_ASR_IMM\n/* 0000 1101 0101 */ TABDECL(OP_SBC_S_ASR_REG),\t\t// OP_SBC_S_ASR_REG\n/* 0000 1101 0110 */ TABDECL(OP_SBC_S_ROR_IMM),\t\t// OP_SBC_S_ROR_IMM\n/* 0000 1101 0111 */ TABDECL(OP_SBC_S_ROR_REG),\t\t// OP_SBC_S_ROR_REG\n/* 0000 1101 1000 */ TABDECL(OP_SBC_S_LSL_IMM),\t\t// OP_SBC_S_LSL_IMM\n/* 0000 1101 1001 */ TABDECL(OP_SMULL_S),\t\t// OP_SMULL_S\n/* 0000 1101 1010 */ TABDECL(OP_SBC_S_LSR_IMM),\t\t// OP_SBC_S_LSR_IMM\n/* 0000 1101 1011 */ TABDECL(OP_LDRH_POS_INDE_P_IMM_OFF),\t\t// OP_LDRH_POS_INDE_P_IMM_OFF\n/* 0000 1101 1100 */ TABDECL(OP_SBC_S_ASR_IMM),\t\t// OP_SBC_S_ASR_IMM\n/* 0000 1101 1101 */ TABDECL(OP_LDRSB_POS_INDE_P_IMM_OFF),\t\t// OP_LDRSB_POS_INDE_P_IMM_OFF\n/* 0000 1101 1110 */ TABDECL(OP_SBC_S_ROR_IMM),\t\t// OP_SBC_S_ROR_IMM\n/* 0000 1101 1111 */ TABDECL(OP_LDRSH_POS_INDE_P_IMM_OFF),\t\t// OP_LDRSH_POS_INDE_P_IMM_OFF\n\n/* 0000 1110 0000 */ TABDECL(OP_RSC_LSL_IMM),\t\t// OP_RSC_LSL_IMM\n/* 0000 1110 0001 */ TABDECL(OP_RSC_LSL_REG),\t\t// OP_RSC_LSL_REG\n/* 0000 1110 0010 */ TABDECL(OP_RSC_LSR_IMM),\t\t// OP_RSC_LSR_IMM\n/* 0000 1110 0011 */ TABDECL(OP_RSC_LSR_REG),\t\t// OP_RSC_LSR_REG\n/* 0000 1110 0100 */ TABDECL(OP_RSC_ASR_IMM),\t\t// OP_RSC_ASR_IMM\n/* 0000 1110 0101 */ TABDECL(OP_RSC_ASR_REG),\t\t// OP_RSC_ASR_REG\n/* 0000 1110 0110 */ TABDECL(OP_RSC_ROR_IMM),\t\t// OP_RSC_ROR_IMM\n/* 0000 1110 0111 */ TABDECL(OP_RSC_ROR_REG),\t\t// OP_RSC_ROR_REG\n/* 0000 1110 1000 */ TABDECL(OP_RSC_LSL_IMM),\t\t// OP_RSC_LSL_IMM\n/* 0000 1110 1001 */ TABDECL(OP_SMLAL),\t\t// OP_SMLAL\n/* 0000 1110 1010 */ TABDECL(OP_RSC_LSR_IMM),\t\t// OP_RSC_LSR_IMM\n/* 0000 1110 1011 */ TABDECL(OP_UND),\n/* 0000 1110 1100 */ TABDECL(OP_RSC_ASR_IMM),\t\t// OP_RSC_ASR_IMM\n/* 0000 1110 1101 */ TABDECL(OP_UND),\n/* 0000 1110 1110 */ TABDECL(OP_RSC_ROR_IMM),\t\t// OP_RSC_ROR_IMM\n/* 0000 1110 1111 */ TABDECL(OP_UND),\n\n/* 0000 1111 0000 */ TABDECL(OP_RSC_S_LSL_IMM),\t\t// OP_RSC_S_LSL_IMM\n/* 0000 1111 0001 */ TABDECL(OP_RSC_S_LSL_REG),\t\t// OP_RSC_S_LSL_REG\n/* 0000 1111 0010 */ TABDECL(OP_RSC_S_LSR_IMM),\t\t// OP_RSC_S_LSR_IMM\n/* 0000 1111 0011 */ TABDECL(OP_RSC_S_LSR_REG),\t\t// OP_RSC_S_LSR_REG\n/* 0000 1111 0100 */ TABDECL(OP_RSC_S_ASR_IMM),\t\t// OP_RSC_S_ASR_IMM\n/* 0000 1111 0101 */ TABDECL(OP_RSC_S_ASR_REG),\t\t// OP_RSC_S_ASR_REG\n/* 0000 1111 0110 */ TABDECL(OP_RSC_S_ROR_IMM),\t\t// OP_RSC_S_ROR_IMM\n/* 0000 1111 0111 */ TABDECL(OP_RSC_S_ROR_REG),\t\t// OP_RSC_S_ROR_REG\n/* 0000 1111 1000 */ TABDECL(OP_RSC_S_LSL_IMM),\t\t// OP_RSC_S_LSL_IMM\n/* 0000 1111 1001 */ TABDECL(OP_SMLAL_S),\t\t// OP_SMLAL_S\n/* 0000 1111 1010 */ TABDECL(OP_RSC_S_LSR_IMM),\t\t// OP_RSC_S_LSR_IMM\n/* 0000 1111 1011 */ TABDECL(OP_UND),\n/* 0000 1111 1100 */ TABDECL(OP_RSC_S_ASR_IMM),\t\t// OP_RSC_S_ASR_IMM\n/* 0000 1111 1101 */ TABDECL(OP_UND),\n/* 0000 1111 1110 */ TABDECL(OP_RSC_S_ROR_IMM),\t\t// OP_RSC_S_ROR_IMM\n/* 0000 1111 1111 */ TABDECL(OP_UND),\n\n/* 0001 0000 0000 */ TABDECL(OP_MRS_CPSR),\t\t// OP_MRS_CPSR\n/* 0001 0000 0001 */ TABDECL(OP_UND),\n/* 0001 0000 0010 */ TABDECL(OP_UND),\n/* 0001 0000 0011 */ TABDECL(OP_UND),\n/* 0001 0000 0100 */ TABDECL(OP_UND),\n/* 0001 0000 0101 */ TABDECL(OP_QADD),\t\t// OP_QADD\n/* 0001 0000 0110 */ TABDECL(OP_UND),\n/* 0001 0000 0111 */ TABDECL(OP_UND),\n/* 0001 0000 1000 */ TABDECL(OP_SMLA_B_B),\t\t// OP_SMLA_B_B\n/* 0001 0000 1001 */ TABDECL(OP_SWP),\t\t// OP_SWP\n/* 0001 0000 1010 */ TABDECL(OP_SMLA_T_B),\t\t// OP_SMLA_T_B\n/* 0001 0000 1011 */ TABDECL(OP_STRH_M_REG_OFF),\t\t// OP_STRH_M_REG_OFF\n/* 0001 0000 1100 */ TABDECL(OP_SMLA_B_T),\t\t// OP_SMLA_B_T\n/* 0001 0000 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 0000 1110 */ TABDECL(OP_SMLA_T_T),\t\t// OP_SMLA_T_T\n/* 0001 0000 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 0001 0000 */ TABDECL(OP_TST_LSL_IMM),\t\t// OP_TST_LSL_IMM\n/* 0001 0001 0001 */ TABDECL(OP_TST_LSL_REG),\t\t// OP_TST_LSL_REG\n/* 0001 0001 0010 */ TABDECL(OP_TST_LSR_IMM),\t\t// OP_TST_LSR_IMM\n/* 0001 0001 0011 */ TABDECL(OP_TST_LSR_REG),\t\t// OP_TST_LSR_REG\n/* 0001 0001 0100 */ TABDECL(OP_TST_ASR_IMM),\t\t// OP_TST_ASR_IMM\n/* 0001 0001 0101 */ TABDECL(OP_TST_ASR_REG),\t\t// OP_TST_ASR_REG\n/* 0001 0001 0110 */ TABDECL(OP_TST_ROR_IMM),\t\t// OP_TST_ROR_IMM\n/* 0001 0001 0111 */ TABDECL(OP_TST_ROR_REG),\t\t// OP_TST_ROR_REG\n/* 0001 0001 1000 */ TABDECL(OP_TST_LSL_IMM),\t\t// OP_TST_LSL_IMM\n/* 0001 0001 1001 */ TABDECL(OP_UND),\n/* 0001 0001 1010 */ TABDECL(OP_TST_LSR_IMM),\t\t// OP_TST_LSR_IMM\n/* 0001 0001 1011 */ TABDECL(OP_LDRH_M_REG_OFF),\t\t// OP_LDRH_M_REG_OFF\n/* 0001 0001 1100 */ TABDECL(OP_TST_ASR_IMM),\t\t// OP_TST_ASR_IMM\n/* 0001 0001 1101 */ TABDECL(OP_LDRSB_M_REG_OFF),\t\t// OP_LDRSB_M_REG_OFF\n/* 0001 0001 1110 */ TABDECL(OP_TST_ROR_IMM),\t\t// OP_TST_ROR_IMM\n/* 0001 0001 1111 */ TABDECL(OP_LDRSH_M_REG_OFF),\t\t// OP_LDRSH_M_REG_OFF\n\n/* 0001 0010 0000 */ TABDECL(OP_MSR_CPSR),\t\t// OP_MSR_CPSR\n/* 0001 0010 0001 */ TABDECL(OP_BX),\t\t// OP_BX\n/* 0001 0010 0010 */ TABDECL(OP_UND),\n/* 0001 0010 0011 */ TABDECL(OP_BLX_REG),\t\t// OP_BLX_REG\n/* 0001 0010 0100 */ TABDECL(OP_UND),\n/* 0001 0010 0101 */ TABDECL(OP_QSUB),\t\t// OP_QSUB\n/* 0001 0010 0110 */ TABDECL(OP_UND),\n/* 0001 0010 0111 */ TABDECL(OP_BKPT),\t\t// OP_BKPT\n/* 0001 0010 1000 */ TABDECL(OP_SMLAW_B),\t\t// OP_SMLAW_B\n/* 0001 0010 1001 */ TABDECL(OP_UND),\n/* 0001 0010 1010 */ TABDECL(OP_SMULW_B),\t\t// OP_SMULW_B\n/* 0001 0010 1011 */ TABDECL(OP_STRH_PRE_INDE_M_REG_OFF),\t\t// OP_STRH_PRE_INDE_M_REG_OFF\n/* 0001 0010 1100 */ TABDECL(OP_SMLAW_T),\t\t// OP_SMLAW_T\n/* 0001 0010 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 0010 1110 */ TABDECL(OP_SMULW_T),\t\t// OP_SMULW_T\n/* 0001 0010 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 0011 0000 */ TABDECL(OP_TEQ_LSL_IMM),\t\t// OP_TEQ_LSL_IMM\n/* 0001 0011 0001 */ TABDECL(OP_TEQ_LSL_REG),\t\t// OP_TEQ_LSL_REG\n/* 0001 0011 0010 */ TABDECL(OP_TEQ_LSR_IMM),\t\t// OP_TEQ_LSR_IMM\n/* 0001 0011 0011 */ TABDECL(OP_TEQ_LSR_REG),\t\t// OP_TEQ_LSR_REG\n/* 0001 0011 0100 */ TABDECL(OP_TEQ_ASR_IMM),\t\t// OP_TEQ_ASR_IMM\n/* 0001 0011 0101 */ TABDECL(OP_TEQ_ASR_REG),\t\t// OP_TEQ_ASR_REG\n/* 0001 0011 0110 */ TABDECL(OP_TEQ_ROR_IMM),\t\t// OP_TEQ_ROR_IMM\n/* 0001 0011 0111 */ TABDECL(OP_TEQ_ROR_REG),\t\t// OP_TEQ_ROR_REG\n/* 0001 0011 1000 */ TABDECL(OP_TEQ_LSL_IMM),\t\t// OP_TEQ_LSL_IMM\n/* 0001 0011 1001 */ TABDECL(OP_UND),\n/* 0001 0011 1010 */ TABDECL(OP_TEQ_LSR_IMM),\t\t// OP_TEQ_LSR_IMM\n/* 0001 0011 1011 */ TABDECL(OP_LDRH_PRE_INDE_M_REG_OFF),\t\t// OP_LDRH_PRE_INDE_M_REG_OFF\n/* 0001 0011 1100 */ TABDECL(OP_TEQ_ASR_IMM),\t\t// OP_TEQ_ASR_IMM\n/* 0001 0011 1101 */ TABDECL(OP_LDRSB_PRE_INDE_M_REG_OFF),\t\t// OP_LDRSB_PRE_INDE_M_REG_OFF\n/* 0001 0011 1110 */ TABDECL(OP_TEQ_ROR_IMM),\t\t// OP_TEQ_ROR_IMM\n/* 0001 0011 1111 */ TABDECL(OP_LDRSH_PRE_INDE_M_REG_OFF),\t\t// OP_LDRSH_PRE_INDE_M_REG_OFF\n\n/* 0001 0100 0000 */ TABDECL(OP_MRS_SPSR),\t\t// OP_MRS_SPSR\n/* 0001 0100 0001 */ TABDECL(OP_UND),\n/* 0001 0100 0010 */ TABDECL(OP_UND),\n/* 0001 0100 0011 */ TABDECL(OP_UND),\n/* 0001 0100 0100 */ TABDECL(OP_UND),\n/* 0001 0100 0101 */ TABDECL(OP_QDADD),\t\t// OP_QDADD\n/* 0001 0100 0110 */ TABDECL(OP_UND),\n/* 0001 0100 0111 */ TABDECL(OP_UND),\n/* 0001 0100 1000 */ TABDECL(OP_SMLAL_B_B),\t\t// OP_SMLAL_B_B\n/* 0001 0100 1001 */ TABDECL(OP_SWPB),\t\t// OP_SWPB\n/* 0001 0100 1010 */ TABDECL(OP_SMLAL_T_B),\t\t// OP_SMLAL_T_B\n/* 0001 0100 1011 */ TABDECL(OP_STRH_M_IMM_OFF),\t\t// OP_STRH_M_IMM_OFF\n/* 0001 0100 1100 */ TABDECL(OP_SMLAL_B_T),\t\t// OP_SMLAL_B_T\n/* 0001 0100 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 0100 1110 */ TABDECL(OP_SMLAL_T_T),\t\t// OP_SMLAL_T_T\n/* 0001 0100 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 0101 0000 */ TABDECL(OP_CMP_LSL_IMM),\t\t// OP_CMP_LSL_IMM\n/* 0001 0101 0001 */ TABDECL(OP_CMP_LSL_REG),\t\t// OP_CMP_LSL_REG\n/* 0001 0101 0010 */ TABDECL(OP_CMP_LSR_IMM),\t\t// OP_CMP_LSR_IMM\n/* 0001 0101 0011 */ TABDECL(OP_CMP_LSR_REG),\t\t// OP_CMP_LSR_REG\n/* 0001 0101 0100 */ TABDECL(OP_CMP_ASR_IMM),\t\t// OP_CMP_ASR_IMM\n/* 0001 0101 0101 */ TABDECL(OP_CMP_ASR_REG),\t\t// OP_CMP_ASR_REG\n/* 0001 0101 0110 */ TABDECL(OP_CMP_ROR_IMM),\t\t// OP_CMP_ROR_IMM\n/* 0001 0101 0111 */ TABDECL(OP_CMP_ROR_REG),\t\t// OP_CMP_ROR_REG\n/* 0001 0101 1000 */ TABDECL(OP_CMP_LSL_IMM),\t\t// OP_CMP_LSL_IMM\n/* 0001 0101 1001 */ TABDECL(OP_UND),\n/* 0001 0101 1010 */ TABDECL(OP_CMP_LSR_IMM),\t\t// OP_CMP_LSR_IMM\n/* 0001 0101 1011 */ TABDECL(OP_LDRH_M_IMM_OFF),\t\t// OP_LDRH_M_IMM_OFF\n/* 0001 0101 1100 */ TABDECL(OP_CMP_ASR_IMM),\t\t// OP_CMP_ASR_IMM\n/* 0001 0101 1101 */ TABDECL(OP_LDRSB_M_IMM_OFF),\t\t// OP_LDRSB_M_IMM_OFF\n/* 0001 0101 1110 */ TABDECL(OP_CMP_ROR_IMM),\t\t// OP_CMP_ROR_IMM\n/* 0001 0101 1111 */ TABDECL(OP_LDRSH_M_IMM_OFF),\t\t// OP_LDRSH_M_IMM_OFF\n\n/* 0001 0110 0000 */ TABDECL(OP_MSR_SPSR),\t\t// OP_MSR_SPSR\n/* 0001 0110 0001 */ TABDECL(OP_CLZ),\t\t// OP_CLZ\n/* 0001 0110 0010 */ TABDECL(OP_UND),\n/* 0001 0110 0011 */ TABDECL(OP_UND),\n/* 0001 0110 0100 */ TABDECL(OP_UND),\n/* 0001 0110 0101 */ TABDECL(OP_QDSUB),\t\t// OP_QDSUB\n/* 0001 0110 0110 */ TABDECL(OP_UND),\n/* 0001 0110 0111 */ TABDECL(OP_UND),\n/* 0001 0110 1000 */ TABDECL(OP_SMUL_B_B),\t\t// OP_SMUL_B_B\n/* 0001 0110 1001 */ TABDECL(OP_UND),\n/* 0001 0110 1010 */ TABDECL(OP_SMUL_T_B),\t\t// OP_SMUL_T_B\n/* 0001 0110 1011 */ TABDECL(OP_STRH_PRE_INDE_M_IMM_OFF),\t\t// OP_STRH_PRE_INDE_M_IMM_OFF\n/* 0001 0110 1100 */ TABDECL(OP_SMUL_B_T),\t\t// OP_SMUL_B_T\n/* 0001 0110 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 0110 1110 */ TABDECL(OP_SMUL_T_T),\t\t// OP_SMUL_T_T\n/* 0001 0110 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 0111 0000 */ TABDECL(OP_CMN_LSL_IMM),\t\t// OP_CMN_LSL_IMM\n/* 0001 0111 0001 */ TABDECL(OP_CMN_LSL_REG),\t\t// OP_CMN_LSL_REG\n/* 0001 0111 0010 */ TABDECL(OP_CMN_LSR_IMM),\t\t// OP_CMN_LSR_IMM\n/* 0001 0111 0011 */ TABDECL(OP_CMN_LSR_REG),\t\t// OP_CMN_LSR_REG\n/* 0001 0111 0100 */ TABDECL(OP_CMN_ASR_IMM),\t\t// OP_CMN_ASR_IMM\n/* 0001 0111 0101 */ TABDECL(OP_CMN_ASR_REG),\t\t// OP_CMN_ASR_REG\n/* 0001 0111 0110 */ TABDECL(OP_CMN_ROR_IMM),\t\t// OP_CMN_ROR_IMM\n/* 0001 0111 0111 */ TABDECL(OP_CMN_ROR_REG),\t\t// OP_CMN_ROR_REG\n/* 0001 0111 1000 */ TABDECL(OP_CMN_LSL_IMM),\t\t// OP_CMN_LSL_IMM\n/* 0001 0111 1001 */ TABDECL(OP_UND),\n/* 0001 0111 1010 */ TABDECL(OP_CMN_LSR_IMM),\t\t// OP_CMN_LSR_IMM\n/* 0001 0111 1011 */ TABDECL(OP_LDRH_PRE_INDE_M_IMM_OFF),\t\t// OP_LDRH_PRE_INDE_M_IMM_OFF\n/* 0001 0111 1100 */ TABDECL(OP_CMN_ASR_IMM),\t\t// OP_CMN_ASR_IMM\n/* 0001 0111 1101 */ TABDECL(OP_LDRSB_PRE_INDE_M_IMM_OFF),\t\t// OP_LDRSB_PRE_INDE_M_IMM_OFF\n/* 0001 0111 1110 */ TABDECL(OP_CMN_ROR_IMM),\t\t// OP_CMN_ROR_IMM\n/* 0001 0111 1111 */ TABDECL(OP_LDRSH_PRE_INDE_M_IMM_OFF),\t\t// OP_LDRSH_PRE_INDE_M_IMM_OFF\n\n/* 0001 1000 0000 */ TABDECL(OP_ORR_LSL_IMM),\t\t// OP_ORR_LSL_IMM\n/* 0001 1000 0001 */ TABDECL(OP_ORR_LSL_REG),\t\t// OP_ORR_LSL_REG\n/* 0001 1000 0010 */ TABDECL(OP_ORR_LSR_IMM),\t\t// OP_ORR_LSR_IMM\n/* 0001 1000 0011 */ TABDECL(OP_ORR_LSR_REG),\t\t// OP_ORR_LSR_REG\n/* 0001 1000 0100 */ TABDECL(OP_ORR_ASR_IMM),\t\t// OP_ORR_ASR_IMM\n/* 0001 1000 0101 */ TABDECL(OP_ORR_ASR_REG),\t\t// OP_ORR_ASR_REG\n/* 0001 1000 0110 */ TABDECL(OP_ORR_ROR_IMM),\t\t// OP_ORR_ROR_IMM\n/* 0001 1000 0111 */ TABDECL(OP_ORR_ROR_REG),\t\t// OP_ORR_ROR_REG\n/* 0001 1000 1000 */ TABDECL(OP_ORR_LSL_IMM),\t\t// OP_ORR_LSL_IMM\n/* 0001 1000 1001 */ TABDECL(OP_STREX),\t\t\t\t// OP_STREX\n/* 0001 1000 1010 */ TABDECL(OP_ORR_LSR_IMM),\t\t// OP_ORR_LSR_IMM\n/* 0001 1000 1011 */ TABDECL(OP_STRH_P_REG_OFF),\t\t// OP_STRH_P_REG_OFF\n/* 0001 1000 1100 */ TABDECL(OP_ORR_ASR_IMM),\t\t// OP_ORR_ASR_IMM\n/* 0001 1000 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 1000 1110 */ TABDECL(OP_ORR_ROR_IMM),\t\t// OP_ORR_ROR_IMM\n/* 0001 1000 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 1001 0000 */ TABDECL(OP_ORR_S_LSL_IMM),\t\t// OP_ORR_S_LSL_IMM\n/* 0001 1001 0001 */ TABDECL(OP_ORR_S_LSL_REG),\t\t// OP_ORR_S_LSL_REG\n/* 0001 1001 0010 */ TABDECL(OP_ORR_S_LSR_IMM),\t\t// OP_ORR_S_LSR_IMM\n/* 0001 1001 0011 */ TABDECL(OP_ORR_S_LSR_REG),\t\t// OP_ORR_S_LSR_REG\n/* 0001 1001 0100 */ TABDECL(OP_ORR_S_ASR_IMM),\t\t// OP_ORR_S_ASR_IMM\n/* 0001 1001 0101 */ TABDECL(OP_ORR_S_ASR_REG),\t\t// OP_ORR_S_ASR_REG\n/* 0001 1001 0110 */ TABDECL(OP_ORR_S_ROR_IMM),\t\t// OP_ORR_S_ROR_IMM\n/* 0001 1001 0111 */ TABDECL(OP_ORR_S_ROR_REG),\t\t// OP_ORR_S_ROR_REG\n/* 0001 1001 1000 */ TABDECL(OP_ORR_S_LSL_IMM),\t\t// OP_ORR_S_LSL_IMM\n/* 0001 1001 1001 */ TABDECL(OP_LDREX),\t\t\t\t// OP_LDREX\n/* 0001 1001 1010 */ TABDECL(OP_ORR_S_LSR_IMM),\t\t// OP_ORR_S_LSR_IMM\n/* 0001 1001 1011 */ TABDECL(OP_LDRH_P_REG_OFF),\t\t// OP_LDRH_P_REG_OFF\n/* 0001 1001 1100 */ TABDECL(OP_ORR_S_ASR_IMM),\t\t// OP_ORR_S_ASR_IMM\n/* 0001 1001 1101 */ TABDECL(OP_LDRSB_P_REG_OFF),\t\t// OP_LDRSB_P_REG_OFF\n/* 0001 1001 1110 */ TABDECL(OP_ORR_S_ROR_IMM),\t\t// OP_ORR_S_ROR_IMM\n/* 0001 1001 1111 */ TABDECL(OP_LDRSH_P_REG_OFF),\t\t// OP_LDRSH_P_REG_OFF\n\n/* 0001 1010 0000 */ TABDECL(OP_MOV_LSL_IMM),\t\t// OP_MOV_LSL_IMM\n/* 0001 1010 0001 */ TABDECL(OP_MOV_LSL_REG),\t\t// OP_MOV_LSL_REG\n/* 0001 1010 0010 */ TABDECL(OP_MOV_LSR_IMM),\t\t// OP_MOV_LSR_IMM\n/* 0001 1010 0011 */ TABDECL(OP_MOV_LSR_REG),\t\t// OP_MOV_LSR_REG\n/* 0001 1010 0100 */ TABDECL(OP_MOV_ASR_IMM),\t\t// OP_MOV_ASR_IMM\n/* 0001 1010 0101 */ TABDECL(OP_MOV_ASR_REG),\t\t// OP_MOV_ASR_REG\n/* 0001 1010 0110 */ TABDECL(OP_MOV_ROR_IMM),\t\t// OP_MOV_ROR_IMM\n/* 0001 1010 0111 */ TABDECL(OP_MOV_ROR_REG),\t\t// OP_MOV_ROR_REG\n/* 0001 1010 1000 */ TABDECL(OP_MOV_LSL_IMM),\t\t// OP_MOV_LSL_IMM\n/* 0001 1010 1001 */ TABDECL(OP_UND),\n/* 0001 1010 1010 */ TABDECL(OP_MOV_LSR_IMM),\t\t// OP_MOV_LSR_IMM\n/* 0001 1010 1011 */ TABDECL(OP_STRH_PRE_INDE_P_REG_OFF),\t\t// OP_STRH_PRE_INDE_P_REG_OFF\n/* 0001 1010 1100 */ TABDECL(OP_MOV_ASR_IMM),\t\t// OP_MOV_ASR_IMM\n/* 0001 1010 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 1010 1110 */ TABDECL(OP_MOV_ROR_IMM),\t\t// OP_MOV_ROR_IMM\n/* 0001 1010 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 1011 0000 */ TABDECL(OP_MOV_S_LSL_IMM),\t\t// OP_MOV_S_LSL_IMM\n/* 0001 1011 0001 */ TABDECL(OP_MOV_S_LSL_REG),\t\t// OP_MOV_S_LSL_REG\n/* 0001 1011 0010 */ TABDECL(OP_MOV_S_LSR_IMM),\t\t// OP_MOV_S_LSR_IMM\n/* 0001 1011 0011 */ TABDECL(OP_MOV_S_LSR_REG),\t\t// OP_MOV_S_LSR_REG\n/* 0001 1011 0100 */ TABDECL(OP_MOV_S_ASR_IMM),\t\t// OP_MOV_S_ASR_IMM\n/* 0001 1011 0101 */ TABDECL(OP_MOV_S_ASR_REG),\t\t// OP_MOV_S_ASR_REG\n/* 0001 1011 0110 */ TABDECL(OP_MOV_S_ROR_IMM),\t\t// OP_MOV_S_ROR_IMM\n/* 0001 1011 0111 */ TABDECL(OP_MOV_S_ROR_REG),\t\t// OP_MOV_S_ROR_REG\n/* 0001 1011 1000 */ TABDECL(OP_MOV_S_LSL_IMM),\t\t// OP_MOV_S_LSL_IMM\n/* 0001 1011 1001 */ TABDECL(OP_UND),\n/* 0001 1011 1010 */ TABDECL(OP_MOV_S_LSR_IMM),\t\t// OP_MOV_S_LSR_IMM\n/* 0001 1011 1011 */ TABDECL(OP_LDRH_PRE_INDE_P_REG_OFF),\t\t// OP_LDRH_PRE_INDE_P_REG_OFF\n/* 0001 1011 1100 */ TABDECL(OP_MOV_S_ASR_IMM),\t\t// OP_MOV_S_ASR_IMM\n/* 0001 1011 1101 */ TABDECL(OP_LDRSB_PRE_INDE_P_REG_OFF),\t\t// OP_LDRSB_PRE_INDE_P_REG_OFF\n/* 0001 1011 1110 */ TABDECL(OP_MOV_S_ROR_IMM),\t\t// OP_MOV_S_ROR_IMM\n/* 0001 1011 1111 */ TABDECL(OP_LDRSH_PRE_INDE_P_REG_OFF),\t\t// OP_LDRSH_PRE_INDE_P_REG_OFF\n\n/* 0001 1100 0000 */ TABDECL(OP_BIC_LSL_IMM),\t\t// OP_BIC_LSL_IMM\n/* 0001 1100 0001 */ TABDECL(OP_BIC_LSL_REG),\t\t// OP_BIC_LSL_REG\n/* 0001 1100 0010 */ TABDECL(OP_BIC_LSR_IMM),\t\t// OP_BIC_LSR_IMM\n/* 0001 1100 0011 */ TABDECL(OP_BIC_LSR_REG),\t\t// OP_BIC_LSR_REG\n/* 0001 1100 0100 */ TABDECL(OP_BIC_ASR_IMM),\t\t// OP_BIC_ASR_IMM\n/* 0001 1100 0101 */ TABDECL(OP_BIC_ASR_REG),\t\t// OP_BIC_ASR_REG\n/* 0001 1100 0110 */ TABDECL(OP_BIC_ROR_IMM),\t\t// OP_BIC_ROR_IMM\n/* 0001 1100 0111 */ TABDECL(OP_BIC_ROR_REG),\t\t// OP_BIC_ROR_REG\n/* 0001 1100 1000 */ TABDECL(OP_BIC_LSL_IMM),\t\t// OP_BIC_LSL_IMM\n/* 0001 1100 1001 */ TABDECL(OP_UND),\n/* 0001 1100 1010 */ TABDECL(OP_BIC_LSR_IMM),\t\t// OP_BIC_LSR_IMM\n/* 0001 1100 1011 */ TABDECL(OP_STRH_P_IMM_OFF),\t\t// OP_STRH_P_IMM_OFF\n/* 0001 1100 1100 */ TABDECL(OP_BIC_ASR_IMM),\t\t// OP_BIC_ASR_IMM\n/* 0001 1100 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 1100 1110 */ TABDECL(OP_BIC_ROR_IMM),\t\t// OP_BIC_ROR_IMM\n/* 0001 1100 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 1101 0000 */ TABDECL(OP_BIC_S_LSL_IMM),\t\t// OP_BIC_S_LSL_IMM\n/* 0001 1101 0001 */ TABDECL(OP_BIC_S_LSL_REG),\t\t// OP_BIC_S_LSL_REG\n/* 0001 1101 0010 */ TABDECL(OP_BIC_S_LSR_IMM),\t\t// OP_BIC_S_LSR_IMM\n/* 0001 1101 0011 */ TABDECL(OP_BIC_S_LSR_REG),\t\t// OP_BIC_S_LSR_REG\n/* 0001 1101 0100 */ TABDECL(OP_BIC_S_ASR_IMM),\t\t// OP_BIC_S_ASR_IMM\n/* 0001 1101 0101 */ TABDECL(OP_BIC_S_ASR_REG),\t\t// OP_BIC_S_ASR_REG\n/* 0001 1101 0110 */ TABDECL(OP_BIC_S_ROR_IMM),\t\t// OP_BIC_S_ROR_IMM\n/* 0001 1101 0111 */ TABDECL(OP_BIC_S_ROR_REG),\t\t// OP_BIC_S_ROR_REG\n/* 0001 1101 1000 */ TABDECL(OP_BIC_S_LSL_IMM),\t\t// OP_BIC_S_LSL_IMM\n/* 0001 1101 1001 */ TABDECL(OP_UND),\n/* 0001 1101 1010 */ TABDECL(OP_BIC_S_LSR_IMM),\t\t// OP_BIC_S_LSR_IMM\n/* 0001 1101 1011 */ TABDECL(OP_LDRH_P_IMM_OFF),\t\t// OP_LDRH_P_IMM_OFF\n/* 0001 1101 1100 */ TABDECL(OP_BIC_S_ASR_IMM),\t\t// OP_BIC_S_ASR_IMM\n/* 0001 1101 1101 */ TABDECL(OP_LDRSB_P_IMM_OFF),\t\t// OP_LDRSB_P_IMM_OFF\n/* 0001 1101 1110 */ TABDECL(OP_BIC_S_ROR_IMM),\t\t// OP_BIC_S_ROR_IMM\n/* 0001 1101 1111 */ TABDECL(OP_LDRSH_P_IMM_OFF),\t\t// OP_LDRSH_P_IMM_OFF\n\n/* 0001 1110 0000 */ TABDECL(OP_MVN_LSL_IMM),\t\t// OP_MVN_LSL_IMM\n/* 0001 1110 0001 */ TABDECL(OP_MVN_LSL_REG),\t\t// OP_MVN_LSL_REG\n/* 0001 1110 0010 */ TABDECL(OP_MVN_LSR_IMM),\t\t// OP_MVN_LSR_IMM\n/* 0001 1110 0011 */ TABDECL(OP_MVN_LSR_REG),\t\t// OP_MVN_LSR_REG\n/* 0001 1110 0100 */ TABDECL(OP_MVN_ASR_IMM),\t\t// OP_MVN_ASR_IMM\n/* 0001 1110 0101 */ TABDECL(OP_MVN_ASR_REG),\t\t// OP_MVN_ASR_REG\n/* 0001 1110 0110 */ TABDECL(OP_MVN_ROR_IMM),\t\t// OP_MVN_ROR_IMM\n/* 0001 1110 0111 */ TABDECL(OP_MVN_ROR_REG),\t\t// OP_MVN_ROR_REG\n/* 0001 1110 1000 */ TABDECL(OP_MVN_LSL_IMM),\t\t// OP_MVN_LSL_IMM\n/* 0001 1110 1001 */ TABDECL(OP_UND),\n/* 0001 1110 1010 */ TABDECL(OP_MVN_LSR_IMM),\t\t// OP_MVN_LSR_IMM\n/* 0001 1110 1011 */ TABDECL(OP_STRH_PRE_INDE_P_IMM_OFF),\t\t// OP_STRH_PRE_INDE_P_IMM_OFF\n/* 0001 1110 1100 */ TABDECL(OP_MVN_ASR_IMM),\t\t// OP_MVN_ASR_IMM\n/* 0001 1110 1101 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n/* 0001 1110 1110 */ TABDECL(OP_MVN_ROR_IMM),\t\t// OP_MVN_ROR_IMM\n/* 0001 1110 1111 */ TABDECL(OP_LDRD_STRD_OFFSET_PRE_INDEX),\t\t// OP_LDRD_STRD_OFFSET_PRE_INDEX\n\n/* 0001 1111 0000 */ TABDECL(OP_MVN_S_LSL_IMM),\t\t// OP_MVN_S_LSL_IMM\n/* 0001 1111 0001 */ TABDECL(OP_MVN_S_LSL_REG),\t\t// OP_MVN_S_LSL_REG\n/* 0001 1111 0010 */ TABDECL(OP_MVN_S_LSR_IMM),\t\t// OP_MVN_S_LSR_IMM\n/* 0001 1111 0011 */ TABDECL(OP_MVN_S_LSR_REG),\t\t// OP_MVN_S_LSR_REG\n/* 0001 1111 0100 */ TABDECL(OP_MVN_S_ASR_IMM),\t\t// OP_MVN_S_ASR_IMM\n/* 0001 1111 0101 */ TABDECL(OP_MVN_S_ASR_REG),\t\t// OP_MVN_S_ASR_REG\n/* 0001 1111 0110 */ TABDECL(OP_MVN_S_ROR_IMM),\t\t// OP_MVN_S_ROR_IMM\n/* 0001 1111 0111 */ TABDECL(OP_MVN_S_ROR_REG),\t\t// OP_MVN_S_ROR_REG\n/* 0001 1111 1000 */ TABDECL(OP_MVN_S_LSL_IMM),\t\t// OP_MVN_S_LSL_IMM\n/* 0001 1111 1001 */ TABDECL(OP_UND),\n/* 0001 1111 1010 */ TABDECL(OP_MVN_S_LSR_IMM),\t\t// OP_MVN_S_LSR_IMM\n/* 0001 1111 1011 */ TABDECL(OP_LDRH_PRE_INDE_P_IMM_OFF),\t\t// OP_LDRH_PRE_INDE_P_IMM_OFF\n/* 0001 1111 1100 */ TABDECL(OP_MVN_S_ASR_IMM),\t\t// OP_MVN_S_ASR_IMM\n/* 0001 1111 1101 */ TABDECL(OP_LDRSB_PRE_INDE_P_IMM_OFF),\t\t// OP_LDRSB_PRE_INDE_P_IMM_OFF\n/* 0001 1111 1110 */ TABDECL(OP_MVN_S_ROR_IMM),\t\t// OP_MVN_S_ROR_IMM\n/* 0001 1111 1111 */ TABDECL(OP_LDRSH_PRE_INDE_P_IMM_OFF),\t\t// OP_LDRSH_PRE_INDE_P_IMM_OFF\n\n/* 0010 0000 0000 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 0001 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 0010 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 0011 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 0100 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 0101 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 0110 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 0111 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1000 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1001 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1010 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1011 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1100 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1101 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1110 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n/* 0010 0000 1111 */ TABDECL(OP_AND_IMM_VAL),\t\t// OP_AND_IMM_VAL\n\n/* 0010 0001 0000 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 0001 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 0010 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 0011 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 0100 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 0101 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 0110 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 0111 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1000 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1001 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1010 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1011 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1100 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1101 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1110 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n/* 0010 0001 1111 */ TABDECL(OP_AND_S_IMM_VAL),\t\t// OP_AND_S_IMM_VAL\n\n/* 0010 0010 0000 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 0001 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 0010 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 0011 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 0100 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 0101 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 0110 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 0111 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1000 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1001 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1010 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1011 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1100 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1101 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1110 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n/* 0010 0010 1111 */ TABDECL(OP_EOR_IMM_VAL),\t\t// OP_EOR_IMM_VAL\n\n/* 0010 0011 0000 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 0001 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 0010 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 0011 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 0100 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 0101 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 0110 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 0111 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1000 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1001 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1010 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1011 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1100 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1101 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1110 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n/* 0010 0011 1111 */ TABDECL(OP_EOR_S_IMM_VAL),\t\t// OP_EOR_S_IMM_VAL\n\n/* 0010 0100 0000 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 0001 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 0010 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 0011 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 0100 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 0101 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 0110 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 0111 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1000 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1001 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1010 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1011 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1100 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1101 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1110 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n/* 0010 0100 1111 */ TABDECL(OP_SUB_IMM_VAL),\t\t// OP_SUB_IMM_VAL\n\n/* 0010 0101 0000 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 0001 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 0010 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 0011 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 0100 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 0101 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 0110 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 0111 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1000 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1001 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1010 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1011 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1100 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1101 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1110 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n/* 0010 0101 1111 */ TABDECL(OP_SUB_S_IMM_VAL),\t\t// OP_SUB_S_IMM_VAL\n\n/* 0010 0110 0000 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 0001 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 0010 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 0011 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 0100 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 0101 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 0110 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 0111 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1000 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1001 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1010 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1011 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1100 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1101 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1110 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n/* 0010 0110 1111 */ TABDECL(OP_RSB_IMM_VAL),\t\t// OP_RSB_IMM_VAL\n\n/* 0010 0111 0000 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 0001 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 0010 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 0011 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 0100 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 0101 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 0110 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 0111 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1000 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1001 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1010 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1011 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1100 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1101 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1110 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n/* 0010 0111 1111 */ TABDECL(OP_RSB_S_IMM_VAL),\t\t// OP_RSB_S_IMM_VAL\n\n/* 0010 1000 0000 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 0001 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 0010 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 0011 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 0100 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 0101 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 0110 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 0111 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1000 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1001 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1010 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1011 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1100 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1101 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1110 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n/* 0010 1000 1111 */ TABDECL(OP_ADD_IMM_VAL),\t\t// OP_ADD_IMM_VAL\n\n/* 0010 1001 0000 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 0001 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 0010 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 0011 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 0100 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 0101 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 0110 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 0111 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1000 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1001 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1010 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1011 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1100 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1101 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1110 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n/* 0010 1001 1111 */ TABDECL(OP_ADD_S_IMM_VAL),\t\t// OP_ADD_S_IMM_VAL\n\n/* 0010 1010 0000 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 0001 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 0010 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 0011 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 0100 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 0101 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 0110 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 0111 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1000 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1001 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1010 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1011 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1100 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1101 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1110 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n/* 0010 1010 1111 */ TABDECL(OP_ADC_IMM_VAL),\t\t// OP_ADC_IMM_VAL\n\n/* 0010 1011 0000 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 0001 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 0010 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 0011 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 0100 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 0101 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 0110 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 0111 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1000 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1001 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1010 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1011 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1100 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1101 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1110 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n/* 0010 1011 1111 */ TABDECL(OP_ADC_S_IMM_VAL),\t\t// OP_ADC_S_IMM_VAL\n\n/* 0010 1100 0000 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 0001 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 0010 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 0011 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 0100 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 0101 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 0110 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 0111 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1000 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1001 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1010 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1011 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1100 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1101 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1110 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n/* 0010 1100 1111 */ TABDECL(OP_SBC_IMM_VAL),\t\t// OP_SBC_IMM_VAL\n\n/* 0010 1101 0000 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 0001 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 0010 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 0011 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 0100 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 0101 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 0110 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 0111 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1000 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1001 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1010 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1011 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1100 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1101 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1110 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n/* 0010 1101 1111 */ TABDECL(OP_SBC_S_IMM_VAL),\t\t// OP_SBC_S_IMM_VAL\n\n/* 0010 1110 0000 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 0001 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 0010 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 0011 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 0100 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 0101 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 0110 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 0111 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1000 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1001 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1010 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1011 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1100 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1101 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1110 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n/* 0010 1110 1111 */ TABDECL(OP_RSC_IMM_VAL),\t\t// OP_RSC_IMM_VAL\n\n/* 0010 1111 0000 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 0001 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 0010 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 0011 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 0100 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 0101 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 0110 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 0111 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1000 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1001 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1010 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1011 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1100 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1101 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1110 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n/* 0010 1111 1111 */ TABDECL(OP_RSC_S_IMM_VAL),\t\t// OP_RSC_S_IMM_VAL\n\n/* 0011 0000 0000 */ TABDECL(OP_UND),\n/* 0011 0000 0001 */ TABDECL(OP_UND),\n/* 0011 0000 0010 */ TABDECL(OP_UND),\n/* 0011 0000 0011 */ TABDECL(OP_UND),\n/* 0011 0000 0100 */ TABDECL(OP_UND),\n/* 0011 0000 0101 */ TABDECL(OP_UND),\n/* 0011 0000 0110 */ TABDECL(OP_UND),\n/* 0011 0000 0111 */ TABDECL(OP_UND),\n/* 0011 0000 1000 */ TABDECL(OP_UND),\n/* 0011 0000 1001 */ TABDECL(OP_UND),\n/* 0011 0000 1010 */ TABDECL(OP_UND),\n/* 0011 0000 1011 */ TABDECL(OP_UND),\n/* 0011 0000 1100 */ TABDECL(OP_UND),\n/* 0011 0000 1101 */ TABDECL(OP_UND),\n/* 0011 0000 1110 */ TABDECL(OP_UND),\n/* 0011 0000 1111 */ TABDECL(OP_UND),\n\n/* 0011 0001 0000 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 0001 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 0010 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 0011 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 0100 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 0101 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 0110 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 0111 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1000 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1001 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1010 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1011 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1100 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1101 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1110 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n/* 0011 0001 1111 */ TABDECL(OP_TST_IMM_VAL),\t\t// OP_TST_IMM_VAL\n\n/* 0011 0010 0000 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 0001 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 0010 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 0011 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 0100 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 0101 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 0110 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 0111 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1000 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1001 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1010 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1011 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1100 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1101 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1110 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n/* 0011 0010 1111 */ TABDECL(OP_MSR_CPSR_IMM_VAL),\t\t// OP_MSR_CPSR_IMM_VAL\n\n/* 0011 0011 0000 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 0001 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 0010 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 0011 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 0100 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 0101 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 0110 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 0111 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1000 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1001 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1010 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1011 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1100 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1101 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1110 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n/* 0011 0011 1111 */ TABDECL(OP_TEQ_IMM_VAL),\t\t// OP_TEQ_IMM_VAL\n\n/* 0011 0100 0000 */ TABDECL(OP_UND),\n/* 0011 0100 0001 */ TABDECL(OP_UND),\n/* 0011 0100 0010 */ TABDECL(OP_UND),\n/* 0011 0100 0011 */ TABDECL(OP_UND),\n/* 0011 0100 0100 */ TABDECL(OP_UND),\n/* 0011 0100 0101 */ TABDECL(OP_UND),\n/* 0011 0100 0110 */ TABDECL(OP_UND),\n/* 0011 0100 0111 */ TABDECL(OP_UND),\n/* 0011 0100 1000 */ TABDECL(OP_UND),\n/* 0011 0100 1001 */ TABDECL(OP_UND),\n/* 0011 0100 1010 */ TABDECL(OP_UND),\n/* 0011 0100 1011 */ TABDECL(OP_UND),\n/* 0011 0100 1100 */ TABDECL(OP_UND),\n/* 0011 0100 1101 */ TABDECL(OP_UND),\n/* 0011 0100 1110 */ TABDECL(OP_UND),\n/* 0011 0100 1111 */ TABDECL(OP_UND),\n\n/* 0011 0101 0000 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 0001 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 0010 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 0011 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 0100 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 0101 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 0110 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 0111 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1000 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1001 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1010 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1011 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1100 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1101 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1110 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n/* 0011 0101 1111 */ TABDECL(OP_CMP_IMM_VAL),\t\t// OP_CMP_IMM_VAL\n\n/* 0011 0110 0000 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 0001 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 0010 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 0011 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 0100 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 0101 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 0110 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 0111 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1000 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1001 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1010 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1011 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1100 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1101 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1110 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n/* 0011 0110 1111 */ TABDECL(OP_MSR_SPSR_IMM_VAL),\t\t// OP_MSR_SPSR_IMM_VAL\n\n/* 0011 0111 0000 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 0001 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 0010 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 0011 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 0100 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 0101 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 0110 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 0111 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1000 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1001 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1010 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1011 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1100 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1101 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1110 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n/* 0011 0111 1111 */ TABDECL(OP_CMN_IMM_VAL),\t\t// OP_CMN_IMM_VAL\n\n/* 0011 1000 0000 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 0001 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 0010 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 0011 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 0100 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 0101 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 0110 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 0111 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1000 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1001 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1010 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1011 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1100 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1101 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1110 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n/* 0011 1000 1111 */ TABDECL(OP_ORR_IMM_VAL),\t\t// OP_ORR_IMM_VAL\n\n/* 0011 1001 0000 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 0001 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 0010 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 0011 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 0100 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 0101 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 0110 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 0111 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1000 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1001 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1010 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1011 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1100 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1101 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1110 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n/* 0011 1001 1111 */ TABDECL(OP_ORR_S_IMM_VAL),\t\t// OP_ORR_S_IMM_VAL\n\n/* 0011 1010 0000 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 0001 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 0010 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 0011 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 0100 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 0101 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 0110 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 0111 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1000 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1001 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1010 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1011 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1100 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1101 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1110 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n/* 0011 1010 1111 */ TABDECL(OP_MOV_IMM_VAL),\t\t// OP_MOV_IMM_VAL\n\n/* 0011 1011 0000 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 0001 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 0010 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 0011 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 0100 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 0101 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 0110 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 0111 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1000 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1001 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1010 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1011 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1100 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1101 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1110 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n/* 0011 1011 1111 */ TABDECL(OP_MOV_S_IMM_VAL),\t\t// OP_MOV_S_IMM_VAL\n\n/* 0011 1100 0000 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 0001 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 0010 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 0011 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 0100 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 0101 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 0110 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 0111 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1000 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1001 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1010 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1011 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1100 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1101 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1110 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n/* 0011 1100 1111 */ TABDECL(OP_BIC_IMM_VAL),\t\t// OP_BIC_IMM_VAL\n\n/* 0011 1101 0000 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 0001 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 0010 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 0011 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 0100 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 0101 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 0110 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 0111 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1000 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1001 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1010 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1011 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1100 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1101 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1110 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n/* 0011 1101 1111 */ TABDECL(OP_BIC_S_IMM_VAL),\t\t// OP_BIC_S_IMM_VAL\n\n/* 0011 1110 0000 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 0001 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 0010 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 0011 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 0100 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 0101 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 0110 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 0111 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1000 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1001 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1010 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1011 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1100 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1101 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1110 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n/* 0011 1110 1111 */ TABDECL(OP_MVN_IMM_VAL),\t\t// OP_MVN_IMM_VAL\n\n/* 0011 1111 0000 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 0001 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 0010 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 0011 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 0100 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 0101 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 0110 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 0111 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1000 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1001 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1010 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1011 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1100 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1101 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1110 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n/* 0011 1111 1111 */ TABDECL(OP_MVN_S_IMM_VAL),\t\t// OP_MVN_S_IMM_VAL\n\n/* 0100 0000 0000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 0001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 0010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 0011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 0100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 0101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 0110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 0111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0000 1111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n\n/* 0100 0001 0000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 0001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 0010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 0011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 0100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 0101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 0110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 0111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0001 1111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n\n/* 0100 0010 0000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 0001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 0010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 0011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 0100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 0101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 0110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 0111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1000 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1001 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1010 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1011 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1100 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1101 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1110 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n/* 0100 0010 1111 */ TABDECL(OP_STR_M_IMM_OFF_POSTIND),\t\t// OP_STR_M_IMM_OFF_POSTIND\n\n/* 0100 0011 0000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 0001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 0010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 0011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 0100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 0101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 0110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 0111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1000 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1001 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1010 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1011 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1100 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1101 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1110 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n/* 0100 0011 1111 */ TABDECL(OP_LDR_M_IMM_OFF_POSTIND),\t\t// OP_LDR_M_IMM_OFF_POSTIND\n\n/* 0100 0100 0000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 0001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 0010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 0011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 0100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 0101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 0110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 0111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0100 1111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n\n/* 0100 0101 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0101 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n\n/* 0100 0110 0000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 0001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 0010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 0011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 0100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 0101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 0110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 0111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1000 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1001 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1010 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1011 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1100 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1101 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1110 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n/* 0100 0110 1111 */ TABDECL(OP_STRB_M_IMM_OFF_POSTIND),\t\t// OP_STRB_M_IMM_OFF_POSTIND\n\n/* 0100 0111 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n/* 0100 0111 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_IMM_OFF_POSTIND\n\n/* 0100 1000 0000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 0001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 0010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 0011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 0100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 0101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 0110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 0111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1000 1111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n\n/* 0100 1001 0000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 0001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 0010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 0011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 0100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 0101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 0110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 0111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1001 1111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n\n/* 0100 1010 0000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 0001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 0010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 0011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 0100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 0101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 0110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 0111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1000 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1001 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1010 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1011 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1100 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1101 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1110 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n/* 0100 1010 1111 */ TABDECL(OP_STR_P_IMM_OFF_POSTIND),\t\t// OP_STR_P_IMM_OFF_POSTIND\n\n/* 0100 1011 0000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 0001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 0010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 0011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 0100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 0101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 0110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 0111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1000 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1001 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1010 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1011 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1100 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1101 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1110 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n/* 0100 1011 1111 */ TABDECL(OP_LDR_P_IMM_OFF_POSTIND),\t\t// OP_LDR_P_IMM_OFF_POSTIND\n\n/* 0100 1100 0000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 0001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 0010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 0011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 0100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 0101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 0110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 0111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1100 1111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n\n/* 0100 1101 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1101 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n\n/* 0100 1110 0000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 0001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 0010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 0011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 0100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 0101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 0110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 0111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1000 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1001 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1010 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1011 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1100 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1101 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1110 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n/* 0100 1110 1111 */ TABDECL(OP_STRB_P_IMM_OFF_POSTIND),\t\t// OP_STRB_P_IMM_OFF_POSTIND\n\n/* 0100 1111 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n/* 0100 1111 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_IMM_OFF_POSTIND\n\n/* 0101 0000 0000 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 0001 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 0010 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 0011 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 0100 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 0101 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 0110 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 0111 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1000 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1001 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1010 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1011 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1100 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1101 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1110 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n/* 0101 0000 1111 */ TABDECL(OP_STR_M_IMM_OFF),\t\t// OP_STR_M_IMM_OFF\n\n/* 0101 0001 0000 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 0001 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 0010 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 0011 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 0100 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 0101 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 0110 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 0111 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1000 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1001 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1010 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1011 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1100 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1101 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1110 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n/* 0101 0001 1111 */ TABDECL(OP_LDR_M_IMM_OFF),\t\t// OP_LDR_M_IMM_OFF\n\n/* 0101 0010 0000 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 0001 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 0010 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 0011 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 0100 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 0101 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 0110 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 0111 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1000 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1001 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1010 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1011 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1100 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1101 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1110 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n/* 0101 0010 1111 */ TABDECL(OP_STR_M_IMM_OFF_PREIND),\t\t// OP_STR_M_IMM_OFF_PREIND\n\n/* 0101 0011 0000 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 0001 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 0010 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 0011 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 0100 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 0101 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 0110 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 0111 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1000 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1001 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1010 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1011 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1100 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1101 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1110 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n/* 0101 0011 1111 */ TABDECL(OP_LDR_M_IMM_OFF_PREIND),\t\t// OP_LDR_M_IMM_OFF_PREIND\n\n/* 0101 0100 0000 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 0001 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 0010 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 0011 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 0100 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 0101 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 0110 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 0111 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1000 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1001 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1010 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1011 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1100 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1101 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1110 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n/* 0101 0100 1111 */ TABDECL(OP_STRB_M_IMM_OFF),\t\t// OP_STRB_M_IMM_OFF\n\n/* 0101 0101 0000 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 0001 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 0010 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 0011 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 0100 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 0101 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 0110 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 0111 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1000 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1001 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1010 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1011 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1100 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1101 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1110 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n/* 0101 0101 1111 */ TABDECL(OP_LDRB_M_IMM_OFF),\t\t// OP_LDRB_M_IMM_OFF\n\n/* 0101 0110 0000 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 0001 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 0010 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 0011 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 0100 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 0101 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 0110 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 0111 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1000 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1001 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1010 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1011 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1100 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1101 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1110 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n/* 0101 0110 1111 */ TABDECL(OP_STRB_M_IMM_OFF_PREIND),\t\t// OP_STRB_M_IMM_OFF_PREIND\n\n/* 0101 0111 0000 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 0001 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 0010 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 0011 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 0100 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 0101 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 0110 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 0111 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1000 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1001 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1010 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1011 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1100 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1101 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1110 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n/* 0101 0111 1111 */ TABDECL(OP_LDRB_M_IMM_OFF_PREIND),\t\t// OP_LDRB_M_IMM_OFF_PREIND\n\n/* 0101 1000 0000 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 0001 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 0010 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 0011 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 0100 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 0101 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 0110 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 0111 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1000 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1001 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1010 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1011 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1100 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1101 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1110 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n/* 0101 1000 1111 */ TABDECL(OP_STR_P_IMM_OFF),\t\t// OP_STR_P_IMM_OFF\n\n/* 0101 1001 0000 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 0001 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 0010 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 0011 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 0100 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 0101 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 0110 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 0111 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1000 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1001 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1010 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1011 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1100 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1101 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1110 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n/* 0101 1001 1111 */ TABDECL(OP_LDR_P_IMM_OFF),\t\t// OP_LDR_P_IMM_OFF\n\n/* 0101 1010 0000 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 0001 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 0010 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 0011 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 0100 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 0101 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 0110 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 0111 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1000 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1001 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1010 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1011 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1100 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1101 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1110 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n/* 0101 1010 1111 */ TABDECL(OP_STR_P_IMM_OFF_PREIND),\t\t// OP_STR_P_IMM_OFF_PREIND\n\n/* 0101 1011 0000 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 0001 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 0010 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 0011 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 0100 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 0101 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 0110 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 0111 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1000 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1001 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1010 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1011 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1100 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1101 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1110 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n/* 0101 1011 1111 */ TABDECL(OP_LDR_P_IMM_OFF_PREIND),\t\t// OP_LDR_P_IMM_OFF_PREIND\n\n/* 0101 1100 0000 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 0001 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 0010 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 0011 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 0100 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 0101 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 0110 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 0111 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1000 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1001 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1010 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1011 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1100 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1101 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1110 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n/* 0101 1100 1111 */ TABDECL(OP_STRB_P_IMM_OFF),\t\t// OP_STRB_P_IMM_OFF\n\n/* 0101 1101 0000 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 0001 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 0010 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 0011 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 0100 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 0101 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 0110 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 0111 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1000 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1001 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1010 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1011 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1100 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1101 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1110 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n/* 0101 1101 1111 */ TABDECL(OP_LDRB_P_IMM_OFF),\t\t// OP_LDRB_P_IMM_OFF\n\n/* 0101 1110 0000 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 0001 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 0010 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 0011 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 0100 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 0101 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 0110 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 0111 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1000 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1001 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1010 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1011 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1100 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1101 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1110 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n/* 0101 1110 1111 */ TABDECL(OP_STRB_P_IMM_OFF_PREIND),\t\t// OP_STRB_P_IMM_OFF_PREIND\n\n/* 0101 1111 0000 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 0001 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 0010 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 0011 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 0100 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 0101 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 0110 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 0111 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1000 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1001 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1010 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1011 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1100 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1101 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1110 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n/* 0101 1111 1111 */ TABDECL(OP_LDRB_P_IMM_OFF_PREIND),\t\t// OP_LDRB_P_IMM_OFF_PREIND\n\n/* 0110 0000 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0000 0001 */ TABDECL(OP_UND),\n/* 0110 0000 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0000 0011 */ TABDECL(OP_UND),\n/* 0110 0000 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0000 0101 */ TABDECL(OP_UND),\n/* 0110 0000 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0000 0111 */ TABDECL(OP_UND),\n/* 0110 0000 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0000 1001 */ TABDECL(OP_UND),\n/* 0110 0000 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0000 1011 */ TABDECL(OP_UND),\n/* 0110 0000 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0000 1101 */ TABDECL(OP_UND),\n/* 0110 0000 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0000 1111 */ TABDECL(OP_UND),\n\n/* 0110 0001 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0001 0001 */ TABDECL(OP_UND),\n/* 0110 0001 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0001 0011 */ TABDECL(OP_UND),\n/* 0110 0001 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0001 0101 */ TABDECL(OP_UND),\n/* 0110 0001 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0001 0111 */ TABDECL(OP_UND),\n/* 0110 0001 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0001 1001 */ TABDECL(OP_UND),\n/* 0110 0001 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0001 1011 */ TABDECL(OP_UND),\n/* 0110 0001 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0001 1101 */ TABDECL(OP_UND),\n/* 0110 0001 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0001 1111 */ TABDECL(OP_UND),\n\n/* 0110 0010 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0010 0001 */ TABDECL(OP_UND),\n/* 0110 0010 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0010 0011 */ TABDECL(OP_UND),\n/* 0110 0010 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0010 0101 */ TABDECL(OP_UND),\n/* 0110 0010 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0010 0111 */ TABDECL(OP_UND),\n/* 0110 0010 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0010 1001 */ TABDECL(OP_UND),\n/* 0110 0010 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0010 1011 */ TABDECL(OP_UND),\n/* 0110 0010 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0010 1101 */ TABDECL(OP_UND),\n/* 0110 0010 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0010 1111 */ TABDECL(OP_UND),\n\n/* 0110 0011 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0011 0001 */ TABDECL(OP_UND),\n/* 0110 0011 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0011 0011 */ TABDECL(OP_UND),\n/* 0110 0011 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0011 0101 */ TABDECL(OP_UND),\n/* 0110 0011 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0011 0111 */ TABDECL(OP_UND),\n/* 0110 0011 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSL_IMM_OFF_POSTIND\n/* 0110 0011 1001 */ TABDECL(OP_UND),\n/* 0110 0011 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_LSR_IMM_OFF_POSTIND\n/* 0110 0011 1011 */ TABDECL(OP_UND),\n/* 0110 0011 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ASR_IMM_OFF_POSTIND\n/* 0110 0011 1101 */ TABDECL(OP_UND),\n/* 0110 0011 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDR_M_ROR_IMM_OFF_POSTIND\n/* 0110 0011 1111 */ TABDECL(OP_UND),\n\n/* 0110 0100 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0100 0001 */ TABDECL(OP_UND),\n/* 0110 0100 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0100 0011 */ TABDECL(OP_UND),\n/* 0110 0100 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0100 0101 */ TABDECL(OP_UND),\n/* 0110 0100 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0100 0111 */ TABDECL(OP_UND),\n/* 0110 0100 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0100 1001 */ TABDECL(OP_UND),\n/* 0110 0100 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0100 1011 */ TABDECL(OP_UND),\n/* 0110 0100 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0100 1101 */ TABDECL(OP_UND),\n/* 0110 0100 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0100 1111 */ TABDECL(OP_UND),\n\n/* 0110 0101 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0101 0001 */ TABDECL(OP_UND),\n/* 0110 0101 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0101 0011 */ TABDECL(OP_UND),\n/* 0110 0101 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0101 0101 */ TABDECL(OP_UND),\n/* 0110 0101 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0101 0111 */ TABDECL(OP_UND),\n/* 0110 0101 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0101 1001 */ TABDECL(OP_UND),\n/* 0110 0101 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0101 1011 */ TABDECL(OP_UND),\n/* 0110 0101 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0101 1101 */ TABDECL(OP_UND),\n/* 0110 0101 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0101 1111 */ TABDECL(OP_UND),\n\n/* 0110 0110 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0110 0001 */ TABDECL(OP_UND),\n/* 0110 0110 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0110 0011 */ TABDECL(OP_UND),\n/* 0110 0110 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0110 0101 */ TABDECL(OP_UND),\n/* 0110 0110 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0110 0111 */ TABDECL(OP_UND),\n/* 0110 0110 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0110 1001 */ TABDECL(OP_UND),\n/* 0110 0110 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0110 1011 */ TABDECL(OP_UND),\n/* 0110 0110 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0110 1101 */ TABDECL(OP_UND),\n/* 0110 0110 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0110 1111 */ TABDECL(OP_UND),\n\n/* 0110 0111 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0111 0001 */ TABDECL(OP_UND),\n/* 0110 0111 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0111 0011 */ TABDECL(OP_UND),\n/* 0110 0111 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0111 0101 */ TABDECL(OP_UND),\n/* 0110 0111 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0111 0111 */ TABDECL(OP_UND),\n/* 0110 0111 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSL_IMM_OFF_POSTIND\n/* 0110 0111 1001 */ TABDECL(OP_UND),\n/* 0110 0111 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_LSR_IMM_OFF_POSTIND\n/* 0110 0111 1011 */ TABDECL(OP_UND),\n/* 0110 0111 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ASR_IMM_OFF_POSTIND\n/* 0110 0111 1101 */ TABDECL(OP_UND),\n/* 0110 0111 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_M_ROR_IMM_OFF_POSTIND\n/* 0110 0111 1111 */ TABDECL(OP_UND),\n\n/* 0110 1000 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1000 0001 */ TABDECL(OP_UND),\n/* 0110 1000 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSR_IMM_OFF_POSTIND\n/* 0110 1000 0011 */ TABDECL(OP_UND),\n/* 0110 1000 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ASR_IMM_OFF_POSTIND\n/* 0110 1000 0101 */ TABDECL(OP_UND),\n/* 0110 1000 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ROR_IMM_OFF_POSTIND\n/* 0110 1000 0111 */ TABDECL(OP_UND),\n/* 0110 1000 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1000 1001 */ TABDECL(OP_UND),\n/* 0110 1000 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSR_IMM_OFF_POSTIND\n/* 0110 1000 1011 */ TABDECL(OP_UND),\n/* 0110 1000 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ASR_IMM_OFF_POSTIND\n/* 0110 1000 1101 */ TABDECL(OP_UND),\n/* 0110 1000 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ROR_IMM_OFF_POSTIND\n/* 0110 1000 1111 */ TABDECL(OP_UND),\n\n/* 0110 1001 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1001 0001 */ TABDECL(OP_UND),\n/* 0110 1001 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSR_IMM_OFF_POSTIND\n/* 0110 1001 0011 */ TABDECL(OP_UND),\n/* 0110 1001 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND),\t\t// OP_LDR_P_ASR_IMM_OFF_POSTIND\n/* 0110 1001 0101 */ TABDECL(OP_UND),\n/* 0110 1001 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND),\t\t// OP_LDR_P_ROR_IMM_OFF_POSTIND\n/* 0110 1001 0111 */ TABDECL(OP_UND),\n/* 0110 1001 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1001 1001 */ TABDECL(OP_UND),\n/* 0110 1001 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSR_IMM_OFF_POSTIND\n/* 0110 1001 1011 */ TABDECL(OP_UND),\n/* 0110 1001 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_POSTIND),\t\t// OP_LDR_P_ASR_IMM_OFF_POSTIND\n/* 0110 1001 1101 */ TABDECL(OP_UND),\n/* 0110 1001 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_POSTIND),\t\t// OP_LDR_P_ROR_IMM_OFF_POSTIND\n/* 0110 1001 1111 */ TABDECL(OP_UND),\n\n/* 0110 1010 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1010 0001 */ TABDECL(OP_UND),\n/* 0110 1010 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSR_IMM_OFF_POSTIND\n/* 0110 1010 0011 */ TABDECL(OP_UND),\n/* 0110 1010 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ASR_IMM_OFF_POSTIND\n/* 0110 1010 0101 */ TABDECL(OP_UND),\n/* 0110 1010 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ROR_IMM_OFF_POSTIND\n/* 0110 1010 0111 */ TABDECL(OP_UND),\n/* 0110 1010 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1010 1001 */ TABDECL(OP_UND),\n/* 0110 1010 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STR_P_LSR_IMM_OFF_POSTIND\n/* 0110 1010 1011 */ TABDECL(OP_UND),\n/* 0110 1010 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ASR_IMM_OFF_POSTIND\n/* 0110 1010 1101 */ TABDECL(OP_UND),\n/* 0110 1010 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STR_P_ROR_IMM_OFF_POSTIND\n/* 0110 1010 1111 */ TABDECL(OP_UND),\n\n/* 0110 1011 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 0001 */ TABDECL(OP_UND),\n/* 0110 1011 0010 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 0011 */ TABDECL(OP_UND),\n/* 0110 1011 0100 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 0101 */ TABDECL(OP_UND),\n/* 0110 1011 0110 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 0111 */ TABDECL(OP_UND),\n/* 0110 1011 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 1001 */ TABDECL(OP_UND),\n/* 0110 1011 1010 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 1011 */ TABDECL(OP_UND),\n/* 0110 1011 1100 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 1101 */ TABDECL(OP_UND),\n/* 0110 1011 1110 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDR_P_LSL_IMM_OFF_POSTIND\n/* 0110 1011 1111 */ TABDECL(OP_UND),\n\n/* 0110 1100 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1100 0001 */ TABDECL(OP_UND),\n/* 0110 1100 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1100 0011 */ TABDECL(OP_UND),\n/* 0110 1100 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1100 0101 */ TABDECL(OP_UND),\n/* 0110 1100 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1100 0111 */ TABDECL(OP_UND),\n/* 0110 1100 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1100 1001 */ TABDECL(OP_UND),\n/* 0110 1100 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1100 1011 */ TABDECL(OP_UND),\n/* 0110 1100 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1100 1101 */ TABDECL(OP_UND),\n/* 0110 1100 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1100 1111 */ TABDECL(OP_UND),\n\n/* 0110 1101 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1101 0001 */ TABDECL(OP_UND),\n/* 0110 1101 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1101 0011 */ TABDECL(OP_UND),\n/* 0110 1101 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1101 0101 */ TABDECL(OP_UND),\n/* 0110 1101 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1101 0111 */ TABDECL(OP_UND),\n/* 0110 1101 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1101 1001 */ TABDECL(OP_UND),\n/* 0110 1101 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1101 1011 */ TABDECL(OP_UND),\n/* 0110 1101 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1101 1101 */ TABDECL(OP_UND),\n/* 0110 1101 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1101 1111 */ TABDECL(OP_UND),\n\n/* 0110 1110 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1110 0001 */ TABDECL(OP_UND),\n/* 0110 1110 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1110 0011 */ TABDECL(OP_UND),\n/* 0110 1110 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1110 0101 */ TABDECL(OP_UND),\n/* 0110 1110 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1110 0111 */ TABDECL(OP_UND),\n/* 0110 1110 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1110 1001 */ TABDECL(OP_UND),\n/* 0110 1110 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1110 1011 */ TABDECL(OP_UND),\n/* 0110 1110 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1110 1101 */ TABDECL(OP_UND),\n/* 0110 1110 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_STRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1110 1111 */ TABDECL(OP_UND),\n\n/* 0110 1111 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1111 0001 */ TABDECL(OP_UND),\n/* 0110 1111 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1111 0011 */ TABDECL(OP_UND),\n/* 0110 1111 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1111 0101 */ TABDECL(OP_UND),\n/* 0110 1111 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1111 0111 */ TABDECL(OP_UND),\n/* 0110 1111 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSL_IMM_OFF_POSTIND\n/* 0110 1111 1001 */ TABDECL(OP_UND),\n/* 0110 1111 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_LSR_IMM_OFF_POSTIND\n/* 0110 1111 1011 */ TABDECL(OP_UND),\n/* 0110 1111 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ASR_IMM_OFF_POSTIND\n/* 0110 1111 1101 */ TABDECL(OP_UND),\n/* 0110 1111 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_POSTIND),\t\t// OP_LDRB_P_ROR_IMM_OFF_POSTIND\n/* 0110 1111 1111 */ TABDECL(OP_UND),\n\n/* 0111 0000 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF),\t\t// OP_STR_M_LSL_IMM_OFF\n/* 0111 0000 0001 */ TABDECL(OP_UND),\n/* 0111 0000 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF),\t\t// OP_STR_M_LSR_IMM_OFF\n/* 0111 0000 0011 */ TABDECL(OP_UND),\n/* 0111 0000 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF),\t\t// OP_STR_M_ASR_IMM_OFF\n/* 0111 0000 0101 */ TABDECL(OP_UND),\n/* 0111 0000 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF),\t\t// OP_STR_M_ROR_IMM_OFF\n/* 0111 0000 0111 */ TABDECL(OP_UND),\n/* 0111 0000 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF),\t\t// OP_STR_M_LSL_IMM_OFF\n/* 0111 0000 1001 */ TABDECL(OP_UND),\n/* 0111 0000 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF),\t\t// OP_STR_M_LSR_IMM_OFF\n/* 0111 0000 1011 */ TABDECL(OP_UND),\n/* 0111 0000 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF),\t\t// OP_STR_M_ASR_IMM_OFF\n/* 0111 0000 1101 */ TABDECL(OP_UND),\n/* 0111 0000 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF),\t\t// OP_STR_M_ROR_IMM_OFF\n/* 0111 0000 1111 */ TABDECL(OP_UND),\n\n/* 0111 0001 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF),\t\t// OP_LDR_M_LSL_IMM_OFF\n/* 0111 0001 0001 */ TABDECL(OP_UND),\n/* 0111 0001 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF),\t\t// OP_LDR_M_LSR_IMM_OFF\n/* 0111 0001 0011 */ TABDECL(OP_UND),\n/* 0111 0001 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF),\t\t// OP_LDR_M_ASR_IMM_OFF\n/* 0111 0001 0101 */ TABDECL(OP_UND),\n/* 0111 0001 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF),\t\t// OP_LDR_M_ROR_IMM_OFF\n/* 0111 0001 0111 */ TABDECL(OP_UND),\n/* 0111 0001 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF),\t\t// OP_LDR_M_LSL_IMM_OFF\n/* 0111 0001 1001 */ TABDECL(OP_UND),\n/* 0111 0001 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF),\t\t// OP_LDR_M_LSR_IMM_OFF\n/* 0111 0001 1011 */ TABDECL(OP_UND),\n/* 0111 0001 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF),\t\t// OP_LDR_M_ASR_IMM_OFF\n/* 0111 0001 1101 */ TABDECL(OP_UND),\n/* 0111 0001 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF),\t\t// OP_LDR_M_ROR_IMM_OFF\n/* 0111 0001 1111 */ TABDECL(OP_UND),\n\n/* 0111 0010 0000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_PREIND),\t\t// OP_STR_M_LSL_IMM_OFF_PREIND\n/* 0111 0010 0001 */ TABDECL(OP_UND),\n/* 0111 0010 0010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_PREIND),\t\t// OP_STR_M_LSR_IMM_OFF_PREIND\n/* 0111 0010 0011 */ TABDECL(OP_UND),\n/* 0111 0010 0100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_PREIND),\t\t// OP_STR_M_ASR_IMM_OFF_PREIND\n/* 0111 0010 0101 */ TABDECL(OP_UND),\n/* 0111 0010 0110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_PREIND),\t\t// OP_STR_M_ROR_IMM_OFF_PREIND\n/* 0111 0010 0111 */ TABDECL(OP_UND),\n/* 0111 0010 1000 */ TABDECL(OP_STR_M_LSL_IMM_OFF_PREIND),\t\t// OP_STR_M_LSL_IMM_OFF_PREIND\n/* 0111 0010 1001 */ TABDECL(OP_UND),\n/* 0111 0010 1010 */ TABDECL(OP_STR_M_LSR_IMM_OFF_PREIND),\t\t// OP_STR_M_LSR_IMM_OFF_PREIND\n/* 0111 0010 1011 */ TABDECL(OP_UND),\n/* 0111 0010 1100 */ TABDECL(OP_STR_M_ASR_IMM_OFF_PREIND),\t\t// OP_STR_M_ASR_IMM_OFF_PREIND\n/* 0111 0010 1101 */ TABDECL(OP_UND),\n/* 0111 0010 1110 */ TABDECL(OP_STR_M_ROR_IMM_OFF_PREIND),\t\t// OP_STR_M_ROR_IMM_OFF_PREIND\n/* 0111 0010 1111 */ TABDECL(OP_UND),\n\n/* 0111 0011 0000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_PREIND),\t\t// OP_LDR_M_LSL_IMM_OFF_PREIND\n/* 0111 0011 0001 */ TABDECL(OP_UND),\n/* 0111 0011 0010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_PREIND),\t\t// OP_LDR_M_LSR_IMM_OFF_PREIND\n/* 0111 0011 0011 */ TABDECL(OP_UND),\n/* 0111 0011 0100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_PREIND),\t\t// OP_LDR_M_ASR_IMM_OFF_PREIND\n/* 0111 0011 0101 */ TABDECL(OP_UND),\n/* 0111 0011 0110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_PREIND),\t\t// OP_LDR_M_ROR_IMM_OFF_PREIND\n/* 0111 0011 0111 */ TABDECL(OP_UND),\n/* 0111 0011 1000 */ TABDECL(OP_LDR_M_LSL_IMM_OFF_PREIND),\t\t// OP_LDR_M_LSL_IMM_OFF_PREIND\n/* 0111 0011 1001 */ TABDECL(OP_UND),\n/* 0111 0011 1010 */ TABDECL(OP_LDR_M_LSR_IMM_OFF_PREIND),\t\t// OP_LDR_M_LSR_IMM_OFF_PREIND\n/* 0111 0011 1011 */ TABDECL(OP_UND),\n/* 0111 0011 1100 */ TABDECL(OP_LDR_M_ASR_IMM_OFF_PREIND),\t\t// OP_LDR_M_ASR_IMM_OFF_PREIND\n/* 0111 0011 1101 */ TABDECL(OP_UND),\n/* 0111 0011 1110 */ TABDECL(OP_LDR_M_ROR_IMM_OFF_PREIND),\t\t// OP_LDR_M_ROR_IMM_OFF_PREIND\n/* 0111 0011 1111 */ TABDECL(OP_UND),\n\n/* 0111 0100 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF),\t\t// OP_STRB_M_LSL_IMM_OFF\n/* 0111 0100 0001 */ TABDECL(OP_UND),\n/* 0111 0100 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF),\t\t// OP_STRB_M_LSR_IMM_OFF\n/* 0111 0100 0011 */ TABDECL(OP_UND),\n/* 0111 0100 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF),\t\t// OP_STRB_M_ASR_IMM_OFF\n/* 0111 0100 0101 */ TABDECL(OP_UND),\n/* 0111 0100 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF),\t\t// OP_STRB_M_ROR_IMM_OFF\n/* 0111 0100 0111 */ TABDECL(OP_UND),\n/* 0111 0100 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF),\t\t// OP_STRB_M_LSL_IMM_OFF\n/* 0111 0100 1001 */ TABDECL(OP_UND),\n/* 0111 0100 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF),\t\t// OP_STRB_M_LSR_IMM_OFF\n/* 0111 0100 1011 */ TABDECL(OP_UND),\n/* 0111 0100 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF),\t\t// OP_STRB_M_ASR_IMM_OFF\n/* 0111 0100 1101 */ TABDECL(OP_UND),\n/* 0111 0100 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF),\t\t// OP_STRB_M_ROR_IMM_OFF\n/* 0111 0100 1111 */ TABDECL(OP_UND),\n\n/* 0111 0101 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF),\t\t// OP_LDRB_M_LSL_IMM_OFF\n/* 0111 0101 0001 */ TABDECL(OP_UND),\n/* 0111 0101 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF),\t\t// OP_LDRB_M_LSR_IMM_OFF\n/* 0111 0101 0011 */ TABDECL(OP_UND),\n/* 0111 0101 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF),\t\t// OP_LDRB_M_ASR_IMM_OFF\n/* 0111 0101 0101 */ TABDECL(OP_UND),\n/* 0111 0101 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF),\t\t// OP_LDRB_M_ROR_IMM_OFF\n/* 0111 0101 0111 */ TABDECL(OP_UND),\n/* 0111 0101 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF),\t\t// OP_LDRB_M_LSL_IMM_OFF\n/* 0111 0101 1001 */ TABDECL(OP_UND),\n/* 0111 0101 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF),\t\t// OP_LDRB_M_LSR_IMM_OFF\n/* 0111 0101 1011 */ TABDECL(OP_UND),\n/* 0111 0101 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF),\t\t// OP_LDRB_M_ASR_IMM_OFF\n/* 0111 0101 1101 */ TABDECL(OP_UND),\n/* 0111 0101 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF),\t\t// OP_LDRB_M_ROR_IMM_OFF\n/* 0111 0101 1111 */ TABDECL(OP_UND),\n\n/* 0111 0110 0000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_PREIND),\t\t// OP_STRB_M_LSL_IMM_OFF_PREIND\n/* 0111 0110 0001 */ TABDECL(OP_UND),\n/* 0111 0110 0010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_PREIND),\t\t// OP_STRB_M_LSR_IMM_OFF_PREIND\n/* 0111 0110 0011 */ TABDECL(OP_UND),\n/* 0111 0110 0100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_PREIND),\t\t// OP_STRB_M_ASR_IMM_OFF_PREIND\n/* 0111 0110 0101 */ TABDECL(OP_UND),\n/* 0111 0110 0110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_PREIND),\t\t// OP_STRB_M_ROR_IMM_OFF_PREIND\n/* 0111 0110 0111 */ TABDECL(OP_UND),\n/* 0111 0110 1000 */ TABDECL(OP_STRB_M_LSL_IMM_OFF_PREIND),\t\t// OP_STRB_M_LSL_IMM_OFF_PREIND\n/* 0111 0110 1001 */ TABDECL(OP_UND),\n/* 0111 0110 1010 */ TABDECL(OP_STRB_M_LSR_IMM_OFF_PREIND),\t\t// OP_STRB_M_LSR_IMM_OFF_PREIND\n/* 0111 0110 1011 */ TABDECL(OP_UND),\n/* 0111 0110 1100 */ TABDECL(OP_STRB_M_ASR_IMM_OFF_PREIND),\t\t// OP_STRB_M_ASR_IMM_OFF_PREIND\n/* 0111 0110 1101 */ TABDECL(OP_UND),\n/* 0111 0110 1110 */ TABDECL(OP_STRB_M_ROR_IMM_OFF_PREIND),\t\t// OP_STRB_M_ROR_IMM_OFF_PREIND\n/* 0111 0110 1111 */ TABDECL(OP_UND),\n\n/* 0111 0111 0000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_PREIND),\t\t// OP_LDRB_M_LSL_IMM_OFF_PREIND\n/* 0111 0111 0001 */ TABDECL(OP_UND),\n/* 0111 0111 0010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_PREIND),\t\t// OP_LDRB_M_LSR_IMM_OFF_PREIND\n/* 0111 0111 0011 */ TABDECL(OP_UND),\n/* 0111 0111 0100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_PREIND),\t\t// OP_LDRB_M_ASR_IMM_OFF_PREIND\n/* 0111 0111 0101 */ TABDECL(OP_UND),\n/* 0111 0111 0110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_PREIND),\t\t// OP_LDRB_M_ROR_IMM_OFF_PREIND\n/* 0111 0111 0111 */ TABDECL(OP_UND),\n/* 0111 0111 1000 */ TABDECL(OP_LDRB_M_LSL_IMM_OFF_PREIND),\t\t// OP_LDRB_M_LSL_IMM_OFF_PREIND\n/* 0111 0111 1001 */ TABDECL(OP_UND),\n/* 0111 0111 1010 */ TABDECL(OP_LDRB_M_LSR_IMM_OFF_PREIND),\t\t// OP_LDRB_M_LSR_IMM_OFF_PREIND\n/* 0111 0111 1011 */ TABDECL(OP_UND),\n/* 0111 0111 1100 */ TABDECL(OP_LDRB_M_ASR_IMM_OFF_PREIND),\t\t// OP_LDRB_M_ASR_IMM_OFF_PREIND\n/* 0111 0111 1101 */ TABDECL(OP_UND),\n/* 0111 0111 1110 */ TABDECL(OP_LDRB_M_ROR_IMM_OFF_PREIND),\t\t// OP_LDRB_M_ROR_IMM_OFF_PREIND\n/* 0111 0111 1111 */ TABDECL(OP_UND),\n\n/* 0111 1000 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF),\t\t// OP_STR_P_LSL_IMM_OFF\n/* 0111 1000 0001 */ TABDECL(OP_UND),\n/* 0111 1000 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF),\t\t// OP_STR_P_LSR_IMM_OFF\n/* 0111 1000 0011 */ TABDECL(OP_UND),\n/* 0111 1000 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF),\t\t// OP_STR_P_ASR_IMM_OFF\n/* 0111 1000 0101 */ TABDECL(OP_UND),\n/* 0111 1000 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF),\t\t// OP_STR_P_ROR_IMM_OFF\n/* 0111 1000 0111 */ TABDECL(OP_UND),\n/* 0111 1000 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF),\t\t// OP_STR_P_LSL_IMM_OFF\n/* 0111 1000 1001 */ TABDECL(OP_UND),\n/* 0111 1000 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF),\t\t// OP_STR_P_LSR_IMM_OFF\n/* 0111 1000 1011 */ TABDECL(OP_UND),\n/* 0111 1000 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF),\t\t// OP_STR_P_ASR_IMM_OFF\n/* 0111 1000 1101 */ TABDECL(OP_UND),\n/* 0111 1000 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF),\t\t// OP_STR_P_ROR_IMM_OFF\n/* 0111 1000 1111 */ TABDECL(OP_UND),\n\n/* 0111 1001 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF),\t\t// OP_LDR_P_LSL_IMM_OFF\n/* 0111 1001 0001 */ TABDECL(OP_UND),\n/* 0111 1001 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF),\t\t// OP_LDR_P_LSR_IMM_OFF\n/* 0111 1001 0011 */ TABDECL(OP_UND),\n/* 0111 1001 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF),\t\t// OP_LDR_P_ASR_IMM_OFF\n/* 0111 1001 0101 */ TABDECL(OP_UND),\n/* 0111 1001 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF),\t\t// OP_LDR_P_ROR_IMM_OFF\n/* 0111 1001 0111 */ TABDECL(OP_UND),\n/* 0111 1001 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF),\t\t// OP_LDR_P_LSL_IMM_OFF\n/* 0111 1001 1001 */ TABDECL(OP_UND),\n/* 0111 1001 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF),\t\t// OP_LDR_P_LSR_IMM_OFF\n/* 0111 1001 1011 */ TABDECL(OP_UND),\n/* 0111 1001 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF),\t\t// OP_LDR_P_ASR_IMM_OFF\n/* 0111 1001 1101 */ TABDECL(OP_UND),\n/* 0111 1001 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF),\t\t// OP_LDR_P_ROR_IMM_OFF\n/* 0111 1001 1111 */ TABDECL(OP_UND),\n\n/* 0111 1010 0000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_PREIND),\t\t// OP_STR_P_LSL_IMM_OFF_PREIND\n/* 0111 1010 0001 */ TABDECL(OP_UND),\n/* 0111 1010 0010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_PREIND),\t\t// OP_STR_P_LSR_IMM_OFF_PREIND\n/* 0111 1010 0011 */ TABDECL(OP_UND),\n/* 0111 1010 0100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_PREIND),\t\t// OP_STR_P_ASR_IMM_OFF_PREIND\n/* 0111 1010 0101 */ TABDECL(OP_UND),\n/* 0111 1010 0110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_PREIND),\t\t// OP_STR_P_ROR_IMM_OFF_PREIND\n/* 0111 1010 0111 */ TABDECL(OP_UND),\n/* 0111 1010 1000 */ TABDECL(OP_STR_P_LSL_IMM_OFF_PREIND),\t\t// OP_STR_P_LSL_IMM_OFF_PREIND\n/* 0111 1010 1001 */ TABDECL(OP_UND),\n/* 0111 1010 1010 */ TABDECL(OP_STR_P_LSR_IMM_OFF_PREIND),\t\t// OP_STR_P_LSR_IMM_OFF_PREIND\n/* 0111 1010 1011 */ TABDECL(OP_UND),\n/* 0111 1010 1100 */ TABDECL(OP_STR_P_ASR_IMM_OFF_PREIND),\t\t// OP_STR_P_ASR_IMM_OFF_PREIND\n/* 0111 1010 1101 */ TABDECL(OP_UND),\n/* 0111 1010 1110 */ TABDECL(OP_STR_P_ROR_IMM_OFF_PREIND),\t\t// OP_STR_P_ROR_IMM_OFF_PREIND\n/* 0111 1010 1111 */ TABDECL(OP_UND),\n\n/* 0111 1011 0000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_PREIND),\t\t// OP_LDR_P_LSL_IMM_OFF_PREIND\n/* 0111 1011 0001 */ TABDECL(OP_UND),\n/* 0111 1011 0010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_PREIND),\t\t// OP_LDR_P_LSR_IMM_OFF_PREIND\n/* 0111 1011 0011 */ TABDECL(OP_UND),\n/* 0111 1011 0100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_PREIND),\t\t// OP_LDR_P_ASR_IMM_OFF_PREIND\n/* 0111 1011 0101 */ TABDECL(OP_UND),\n/* 0111 1011 0110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_PREIND),\t\t// OP_LDR_P_ROR_IMM_OFF_PREIND\n/* 0111 1011 0111 */ TABDECL(OP_UND),\n/* 0111 1011 1000 */ TABDECL(OP_LDR_P_LSL_IMM_OFF_PREIND),\t\t// OP_LDR_P_LSL_IMM_OFF_PREIND\n/* 0111 1011 1001 */ TABDECL(OP_UND),\n/* 0111 1011 1010 */ TABDECL(OP_LDR_P_LSR_IMM_OFF_PREIND),\t\t// OP_LDR_P_LSR_IMM_OFF_PREIND\n/* 0111 1011 1011 */ TABDECL(OP_UND),\n/* 0111 1011 1100 */ TABDECL(OP_LDR_P_ASR_IMM_OFF_PREIND),\t\t// OP_LDR_P_ASR_IMM_OFF_PREIND\n/* 0111 1011 1101 */ TABDECL(OP_UND),\n/* 0111 1011 1110 */ TABDECL(OP_LDR_P_ROR_IMM_OFF_PREIND),\t\t// OP_LDR_P_ROR_IMM_OFF_PREIND\n/* 0111 1011 1111 */ TABDECL(OP_UND),\n\n/* 0111 1100 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF),\t\t// OP_STRB_P_LSL_IMM_OFF\n/* 0111 1100 0001 */ TABDECL(OP_UND),\n/* 0111 1100 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF),\t\t// OP_STRB_P_LSR_IMM_OFF\n/* 0111 1100 0011 */ TABDECL(OP_UND),\n/* 0111 1100 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF),\t\t// OP_STRB_P_ASR_IMM_OFF\n/* 0111 1100 0101 */ TABDECL(OP_UND),\n/* 0111 1100 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF),\t\t// OP_STRB_P_ROR_IMM_OFF\n/* 0111 1100 0111 */ TABDECL(OP_UND),\n/* 0111 1100 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF),\t\t// OP_STRB_P_LSL_IMM_OFF\n/* 0111 1100 1001 */ TABDECL(OP_UND),\n/* 0111 1100 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF),\t\t// OP_STRB_P_LSR_IMM_OFF\n/* 0111 1100 1011 */ TABDECL(OP_UND),\n/* 0111 1100 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF),\t\t// OP_STRB_P_ASR_IMM_OFF\n/* 0111 1100 1101 */ TABDECL(OP_UND),\n/* 0111 1100 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF),\t\t// OP_STRB_P_ROR_IMM_OFF\n/* 0111 1100 1111 */ TABDECL(OP_UND),\n\n/* 0111 1101 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF),\t\t// OP_LDRB_P_LSL_IMM_OFF\n/* 0111 1101 0001 */ TABDECL(OP_UND),\n/* 0111 1101 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF),\t\t// OP_LDRB_P_LSR_IMM_OFF\n/* 0111 1101 0011 */ TABDECL(OP_UND),\n/* 0111 1101 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF),\t\t// OP_LDRB_P_ASR_IMM_OFF\n/* 0111 1101 0101 */ TABDECL(OP_UND),\n/* 0111 1101 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF),\t\t// OP_LDRB_P_ROR_IMM_OFF\n/* 0111 1101 0111 */ TABDECL(OP_UND),\n/* 0111 1101 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF),\t\t// OP_LDRB_P_LSL_IMM_OFF\n/* 0111 1101 1001 */ TABDECL(OP_UND),\n/* 0111 1101 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF),\t\t// OP_LDRB_P_LSR_IMM_OFF\n/* 0111 1101 1011 */ TABDECL(OP_UND),\n/* 0111 1101 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF),\t\t// OP_LDRB_P_ASR_IMM_OFF\n/* 0111 1101 1101 */ TABDECL(OP_UND),\n/* 0111 1101 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF),\t\t// OP_LDRB_P_ROR_IMM_OFF\n/* 0111 1101 1111 */ TABDECL(OP_UND),\n\n/* 0111 1110 0000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_PREIND),\t\t// OP_STRB_P_LSL_IMM_OFF_PREIND\n/* 0111 1110 0001 */ TABDECL(OP_UND),\n/* 0111 1110 0010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_PREIND),\t\t// OP_STRB_P_LSR_IMM_OFF_PREIND\n/* 0111 1110 0011 */ TABDECL(OP_UND),\n/* 0111 1110 0100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_PREIND),\t\t// OP_STRB_P_ASR_IMM_OFF_PREIND\n/* 0111 1110 0101 */ TABDECL(OP_UND),\n/* 0111 1110 0110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_PREIND),\t\t// OP_STRB_P_ROR_IMM_OFF_PREIND\n/* 0111 1110 0111 */ TABDECL(OP_UND),\n/* 0111 1110 1000 */ TABDECL(OP_STRB_P_LSL_IMM_OFF_PREIND),\t\t// OP_STRB_P_LSL_IMM_OFF_PREIND\n/* 0111 1110 1001 */ TABDECL(OP_UND),\n/* 0111 1110 1010 */ TABDECL(OP_STRB_P_LSR_IMM_OFF_PREIND),\t\t// OP_STRB_P_LSR_IMM_OFF_PREIND\n/* 0111 1110 1011 */ TABDECL(OP_UND),\n/* 0111 1110 1100 */ TABDECL(OP_STRB_P_ASR_IMM_OFF_PREIND),\t\t// OP_STRB_P_ASR_IMM_OFF_PREIND\n/* 0111 1110 1101 */ TABDECL(OP_UND),\n/* 0111 1110 1110 */ TABDECL(OP_STRB_P_ROR_IMM_OFF_PREIND),\t\t// OP_STRB_P_ROR_IMM_OFF_PREIND\n/* 0111 1110 1111 */ TABDECL(OP_UND),\n\n/* 0111 1111 0000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_PREIND),\t\t// OP_LDRB_P_LSL_IMM_OFF_PREIND\n/* 0111 1111 0001 */ TABDECL(OP_UND),\n/* 0111 1111 0010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_PREIND),\t\t// OP_LDRB_P_LSR_IMM_OFF_PREIND\n/* 0111 1111 0011 */ TABDECL(OP_UND),\n/* 0111 1111 0100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_PREIND),\t\t// OP_LDRB_P_ASR_IMM_OFF_PREIND\n/* 0111 1111 0101 */ TABDECL(OP_UND),\n/* 0111 1111 0110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_PREIND),\t\t// OP_LDRB_P_ROR_IMM_OFF_PREIND\n/* 0111 1111 0111 */ TABDECL(OP_UND),\n/* 0111 1111 1000 */ TABDECL(OP_LDRB_P_LSL_IMM_OFF_PREIND),\t\t// OP_LDRB_P_LSL_IMM_OFF_PREIND\n/* 0111 1111 1001 */ TABDECL(OP_UND),\n/* 0111 1111 1010 */ TABDECL(OP_LDRB_P_LSR_IMM_OFF_PREIND),\t\t// OP_LDRB_P_LSR_IMM_OFF_PREIND\n/* 0111 1111 1011 */ TABDECL(OP_UND),\n/* 0111 1111 1100 */ TABDECL(OP_LDRB_P_ASR_IMM_OFF_PREIND),\t\t// OP_LDRB_P_ASR_IMM_OFF_PREIND\n/* 0111 1111 1101 */ TABDECL(OP_UND),\n/* 0111 1111 1110 */ TABDECL(OP_LDRB_P_ROR_IMM_OFF_PREIND),\t\t// OP_LDRB_P_ROR_IMM_OFF_PREIND\n/* 0111 1111 1111 */ TABDECL(OP_UND),\n\n/* 1000 0000 0000 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 0001 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 0010 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 0011 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 0100 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 0101 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 0110 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 0111 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1000 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1001 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1010 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1011 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1100 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1101 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1110 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n/* 1000 0000 1111 */ TABDECL(OP_STMDA),\t\t// OP_STMDA\n\n/* 1000 0001 0000 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 0001 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 0010 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 0011 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 0100 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 0101 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 0110 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 0111 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1000 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1001 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1010 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1011 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1100 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1101 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1110 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n/* 1000 0001 1111 */ TABDECL(OP_LDMDA),\t\t// OP_LDMDA\n\n/* 1000 0010 0000 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 0001 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 0010 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 0011 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 0100 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 0101 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 0110 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 0111 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1000 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1001 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1010 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1011 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1100 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1101 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1110 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n/* 1000 0010 1111 */ TABDECL(OP_STMDA_W),\t\t// OP_STMDA_W\n\n/* 1000 0011 0000 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 0001 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 0010 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 0011 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 0100 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 0101 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 0110 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 0111 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1000 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1001 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1010 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1011 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1100 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1101 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1110 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n/* 1000 0011 1111 */ TABDECL(OP_LDMDA_W),\t\t// OP_LDMDA_W\n\n/* 1000 0100 0000 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 0001 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 0010 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 0011 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 0100 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 0101 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 0110 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 0111 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1000 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1001 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1010 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1011 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1100 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1101 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1110 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n/* 1000 0100 1111 */ TABDECL(OP_STMDA2),\t\t// OP_STMDA2\n\n/* 1000 0101 0000 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 0001 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 0010 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 0011 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 0100 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 0101 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 0110 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 0111 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1000 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1001 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1010 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1011 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1100 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1101 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1110 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n/* 1000 0101 1111 */ TABDECL(OP_LDMDA2),\t\t// OP_LDMDA2\n\n/* 1000 0110 0000 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 0001 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 0010 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 0011 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 0100 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 0101 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 0110 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 0111 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1000 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1001 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1010 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1011 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1100 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1101 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1110 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n/* 1000 0110 1111 */ TABDECL(OP_STMDA2_W),\t\t// OP_STMDA2_W\n\n/* 1000 0111 0000 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 0001 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 0010 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 0011 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 0100 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 0101 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 0110 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 0111 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1000 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1001 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1010 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1011 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1100 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1101 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1110 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n/* 1000 0111 1111 */ TABDECL(OP_LDMDA2_W),\t\t// OP_LDMDA2_W\n\n/* 1000 1000 0000 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 0001 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 0010 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 0011 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 0100 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 0101 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 0110 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 0111 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1000 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1001 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1010 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1011 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1100 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1101 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1110 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n/* 1000 1000 1111 */ TABDECL(OP_STMIA),\t\t// OP_STMIA\n\n/* 1000 1001 0000 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 0001 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 0010 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 0011 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 0100 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 0101 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 0110 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 0111 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1000 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1001 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1010 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1011 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1100 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1101 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1110 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n/* 1000 1001 1111 */ TABDECL(OP_LDMIA),\t\t// OP_LDMIA\n\n/* 1000 1010 0000 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 0001 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 0010 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 0011 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 0100 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 0101 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 0110 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 0111 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1000 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1001 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1010 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1011 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1100 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1101 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1110 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n/* 1000 1010 1111 */ TABDECL(OP_STMIA_W),\t\t// OP_STMIA_W\n\n/* 1000 1011 0000 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 0001 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 0010 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 0011 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 0100 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 0101 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 0110 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 0111 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1000 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1001 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1010 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1011 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1100 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1101 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1110 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n/* 1000 1011 1111 */ TABDECL(OP_LDMIA_W),\t\t// OP_LDMIA_W\n\n/* 1000 1100 0000 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 0001 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 0010 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 0011 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 0100 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 0101 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 0110 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 0111 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1000 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1001 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1010 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1011 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1100 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1101 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1110 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n/* 1000 1100 1111 */ TABDECL(OP_STMIA2),\t\t// OP_STMIA2\n\n/* 1000 1101 0000 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 0001 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 0010 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 0011 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 0100 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 0101 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 0110 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 0111 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1000 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1001 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1010 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1011 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1100 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1101 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1110 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n/* 1000 1101 1111 */ TABDECL(OP_LDMIA2),\t\t// OP_LDMIA2\n\n/* 1000 1110 0000 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 0001 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 0010 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 0011 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 0100 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 0101 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 0110 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 0111 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1000 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1001 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1010 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1011 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1100 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1101 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1110 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n/* 1000 1110 1111 */ TABDECL(OP_STMIA2_W),\t\t// OP_STMIA2_W\n\n/* 1000 1111 0000 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 0001 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 0010 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 0011 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 0100 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 0101 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 0110 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 0111 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1000 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1001 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1010 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1011 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1100 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1101 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1110 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n/* 1000 1111 1111 */ TABDECL(OP_LDMIA2_W),\t\t// OP_LDMIA2_W\n\n/* 1001 0000 0000 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 0001 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 0010 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 0011 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 0100 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 0101 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 0110 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 0111 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1000 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1001 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1010 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1011 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1100 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1101 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1110 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n/* 1001 0000 1111 */ TABDECL(OP_STMDB),\t\t// OP_STMDB\n\n/* 1001 0001 0000 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 0001 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 0010 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 0011 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 0100 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 0101 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 0110 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 0111 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1000 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1001 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1010 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1011 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1100 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1101 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1110 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n/* 1001 0001 1111 */ TABDECL(OP_LDMDB),\t\t// OP_LDMDB\n\n/* 1001 0010 0000 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 0001 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 0010 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 0011 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 0100 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 0101 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 0110 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 0111 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1000 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1001 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1010 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1011 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1100 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1101 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1110 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n/* 1001 0010 1111 */ TABDECL(OP_STMDB_W),\t\t// OP_STMDB_W\n\n/* 1001 0011 0000 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 0001 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 0010 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 0011 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 0100 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 0101 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 0110 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 0111 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1000 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1001 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1010 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1011 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1100 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1101 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1110 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n/* 1001 0011 1111 */ TABDECL(OP_LDMDB_W),\t\t// OP_LDMDB_W\n\n/* 1001 0100 0000 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 0001 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 0010 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 0011 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 0100 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 0101 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 0110 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 0111 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1000 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1001 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1010 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1011 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1100 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1101 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1110 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n/* 1001 0100 1111 */ TABDECL(OP_STMDB2),\t\t// OP_STMDB2\n\n/* 1001 0101 0000 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 0001 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 0010 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 0011 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 0100 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 0101 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 0110 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 0111 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1000 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1001 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1010 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1011 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1100 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1101 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1110 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n/* 1001 0101 1111 */ TABDECL(OP_LDMDB2),\t\t// OP_LDMDB2\n\n/* 1001 0110 0000 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 0001 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 0010 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 0011 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 0100 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 0101 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 0110 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 0111 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1000 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1001 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1010 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1011 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1100 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1101 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1110 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n/* 1001 0110 1111 */ TABDECL(OP_STMDB2_W),\t\t// OP_STMDB2_W\n\n/* 1001 0111 0000 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 0001 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 0010 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 0011 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 0100 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 0101 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 0110 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 0111 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1000 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1001 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1010 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1011 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1100 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1101 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1110 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n/* 1001 0111 1111 */ TABDECL(OP_LDMDB2_W),\t\t// OP_LDMDB2_W\n\n/* 1001 1000 0000 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 0001 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 0010 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 0011 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 0100 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 0101 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 0110 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 0111 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1000 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1001 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1010 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1011 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1100 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1101 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1110 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n/* 1001 1000 1111 */ TABDECL(OP_STMIB),\t\t// OP_STMIB\n\n/* 1001 1001 0000 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 0001 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 0010 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 0011 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 0100 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 0101 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 0110 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 0111 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1000 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1001 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1010 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1011 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1100 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1101 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1110 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n/* 1001 1001 1111 */ TABDECL(OP_LDMIB),\t\t// OP_LDMIB\n\n/* 1001 1010 0000 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 0001 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 0010 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 0011 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 0100 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 0101 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 0110 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 0111 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1000 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1001 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1010 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1011 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1100 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1101 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1110 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n/* 1001 1010 1111 */ TABDECL(OP_STMIB_W),\t\t// OP_STMIB_W\n\n/* 1001 1011 0000 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 0001 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 0010 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 0011 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 0100 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 0101 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 0110 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 0111 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1000 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1001 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1010 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1011 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1100 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1101 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1110 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n/* 1001 1011 1111 */ TABDECL(OP_LDMIB_W),\t\t// OP_LDMIB_W\n\n/* 1001 1100 0000 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 0001 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 0010 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 0011 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 0100 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 0101 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 0110 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 0111 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1000 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1001 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1010 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1011 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1100 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1101 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1110 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n/* 1001 1100 1111 */ TABDECL(OP_STMIB2),\t\t// OP_STMIB2\n\n/* 1001 1101 0000 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 0001 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 0010 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 0011 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 0100 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 0101 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 0110 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 0111 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1000 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1001 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1010 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1011 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1100 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1101 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1110 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n/* 1001 1101 1111 */ TABDECL(OP_LDMIB2),\t\t// OP_LDMIB2\n\n/* 1001 1110 0000 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 0001 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 0010 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 0011 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 0100 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 0101 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 0110 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 0111 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1000 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1001 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1010 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1011 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1100 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1101 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1110 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n/* 1001 1110 1111 */ TABDECL(OP_STMIB2_W),\t\t// OP_STMIB2_W\n\n/* 1001 1111 0000 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 0001 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 0010 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 0011 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 0100 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 0101 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 0110 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 0111 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1000 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1001 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1010 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1011 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1100 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1101 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1110 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n/* 1001 1111 1111 */ TABDECL(OP_LDMIB2_W),\t\t// OP_LDMIB2_W\n\n/* 1010 0000 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0000 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 0001 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0001 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 0010 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0010 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 0011 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0011 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 0100 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0100 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 0101 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0101 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 0110 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0110 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 0111 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 0111 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1000 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1000 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1001 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1001 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1010 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1010 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1011 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1011 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1100 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1100 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1101 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1101 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1110 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1110 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1010 1111 0000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 0001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 0010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 0011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 0100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 0101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 0110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 0111 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1000 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1001 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1010 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1011 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1100 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1101 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1110 */ TABDECL(OP_B),\t\t// OP_B\n/* 1010 1111 1111 */ TABDECL(OP_B),\t\t// OP_B\n\n/* 1011 0000 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0000 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 0001 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0001 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 0010 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0010 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 0011 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0011 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 0100 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0100 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 0101 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0101 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 0110 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0110 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 0111 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 0111 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1000 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1000 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1001 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1001 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1010 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1010 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1011 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1011 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1100 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1100 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1101 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1101 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1110 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1110 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1011 1111 0000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 0001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 0010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 0011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 0100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 0101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 0110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 0111 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1000 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1001 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1010 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1011 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1100 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1101 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1110 */ TABDECL(OP_BL),\t\t// OP_BL\n/* 1011 1111 1111 */ TABDECL(OP_BL),\t\t// OP_BL\n\n/* 1100 0000 0000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 0001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 0010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 0011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 0100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 0101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 0110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 0111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0000 1111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n\n/* 1100 0001 0000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 0001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 0010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 0011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 0100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 0101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 0110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 0111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0001 1111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n\n/* 1100 0010 0000 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 0001 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 0010 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 0011 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 0100 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 0101 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 0110 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 0111 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1000 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1001 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1010 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1011 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1100 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1101 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1110 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0010 1111 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n\n/* 1100 0011 0000 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 0001 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 0010 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 0011 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 0100 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 0101 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 0110 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 0111 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1000 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1001 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1010 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1011 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1100 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1101 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1110 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0011 1111 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n\n/* 1100 0100 0000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 0001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 0010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 0011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 0100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 0101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 0110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 0111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 0100 1111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n\n/* 1100 0101 0000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 0001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 0010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 0011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 0100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 0101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 0110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 0111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 0101 1111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n\n/* 1100 0110 0000 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 0001 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 0010 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 0011 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 0100 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 0101 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 0110 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 0111 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1000 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1001 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1010 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1011 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1100 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1101 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1110 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n/* 1100 0110 1111 */ TABDECL(OP_STC_M_POSTIND),\t\t// OP_STC_M_POSTIND\n\n/* 1100 0111 0000 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 0001 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 0010 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 0011 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 0100 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 0101 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 0110 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 0111 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1000 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1001 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1010 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1011 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1100 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1101 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1110 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n/* 1100 0111 1111 */ TABDECL(OP_LDC_M_POSTIND),\t\t// OP_LDC_M_POSTIND\n\n/* 1100 1000 0000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 0001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 0010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 0011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 0100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 0101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 0110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 0111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1000 1111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n\n/* 1100 1001 0000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 0001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 0010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 0011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 0100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 0101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 0110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 0111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1001 1111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n\n/* 1100 1010 0000 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 0001 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 0010 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 0011 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 0100 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 0101 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 0110 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 0111 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1000 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1001 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1010 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1011 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1100 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1101 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1110 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1010 1111 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n\n/* 1100 1011 0000 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 0001 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 0010 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 0011 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 0100 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 0101 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 0110 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 0111 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1000 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1001 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1010 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1011 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1100 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1101 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1110 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1011 1111 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n\n/* 1100 1100 0000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 0001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 0010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 0011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 0100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 0101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 0110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 0111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1000 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1001 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1010 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1011 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1100 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1101 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1110 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n/* 1100 1100 1111 */ TABDECL(OP_STC_OPTION),\t\t// OP_STC_OPTION\n\n/* 1100 1101 0000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 0001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 0010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 0011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 0100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 0101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 0110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 0111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1000 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1001 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1010 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1011 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1100 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1101 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1110 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n/* 1100 1101 1111 */ TABDECL(OP_LDC_OPTION),\t\t// OP_LDC_OPTION\n\n/* 1100 1110 0000 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 0001 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 0010 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 0011 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 0100 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 0101 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 0110 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 0111 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1000 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1001 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1010 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1011 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1100 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1101 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1110 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n/* 1100 1110 1111 */ TABDECL(OP_STC_P_POSTIND),\t\t// OP_STC_P_POSTIND\n\n/* 1100 1111 0000 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 0001 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 0010 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 0011 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 0100 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 0101 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 0110 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 0111 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1000 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1001 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1010 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1011 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1100 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1101 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1110 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n/* 1100 1111 1111 */ TABDECL(OP_LDC_P_POSTIND),\t\t// OP_LDC_P_POSTIND\n\n/* 1101 0000 0000 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 0001 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 0010 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 0011 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 0100 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 0101 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 0110 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 0111 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1000 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1001 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1010 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1011 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1100 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1101 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1110 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0000 1111 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n\n/* 1101 0001 0000 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 0001 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 0010 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 0011 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 0100 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 0101 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 0110 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 0111 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1000 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1001 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1010 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1011 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1100 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1101 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1110 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0001 1111 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n\n/* 1101 0010 0000 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 0001 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 0010 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 0011 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 0100 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 0101 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 0110 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 0111 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1000 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1001 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1010 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1011 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1100 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1101 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1110 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0010 1111 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n\n/* 1101 0011 0000 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 0001 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 0010 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 0011 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 0100 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 0101 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 0110 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 0111 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1000 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1001 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1010 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1011 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1100 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1101 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1110 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0011 1111 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n\n/* 1101 0100 0000 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 0001 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 0010 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 0011 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 0100 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 0101 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 0110 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 0111 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1000 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1001 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1010 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1011 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1100 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1101 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1110 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n/* 1101 0100 1111 */ TABDECL(OP_STC_M_IMM_OFF),\t\t// OP_STC_M_IMM_OFF\n\n/* 1101 0101 0000 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 0001 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 0010 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 0011 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 0100 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 0101 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 0110 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 0111 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1000 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1001 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1010 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1011 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1100 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1101 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1110 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n/* 1101 0101 1111 */ TABDECL(OP_LDC_M_IMM_OFF),\t\t// OP_LDC_M_IMM_OFF\n\n/* 1101 0110 0000 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 0001 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 0010 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 0011 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 0100 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 0101 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 0110 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 0111 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1000 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1001 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1010 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1011 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1100 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1101 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1110 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n/* 1101 0110 1111 */ TABDECL(OP_STC_M_PREIND),\t\t// OP_STC_M_PREIND\n\n/* 1101 0111 0000 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 0001 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 0010 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 0011 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 0100 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 0101 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 0110 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 0111 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1000 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1001 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1010 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1011 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1100 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1101 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1110 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n/* 1101 0111 1111 */ TABDECL(OP_LDC_M_PREIND),\t\t// OP_LDC_M_PREIND\n\n/* 1101 1000 0000 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 0001 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 0010 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 0011 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 0100 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 0101 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 0110 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 0111 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1000 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1001 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1010 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1011 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1100 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1101 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1110 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1000 1111 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n\n/* 1101 1001 0000 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 0001 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 0010 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 0011 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 0100 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 0101 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 0110 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 0111 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1000 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1001 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1010 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1011 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1100 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1101 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1110 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1001 1111 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n\n/* 1101 1010 0000 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 0001 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 0010 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 0011 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 0100 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 0101 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 0110 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 0111 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1000 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1001 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1010 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1011 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1100 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1101 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1110 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1010 1111 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n\n/* 1101 1011 0000 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 0001 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 0010 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 0011 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 0100 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 0101 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 0110 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 0111 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1000 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1001 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1010 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1011 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1100 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1101 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1110 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1011 1111 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n\n/* 1101 1100 0000 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 0001 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 0010 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 0011 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 0100 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 0101 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 0110 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 0111 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1000 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1001 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1010 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1011 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1100 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1101 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1110 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n/* 1101 1100 1111 */ TABDECL(OP_STC_P_IMM_OFF),\t\t// OP_STC_P_IMM_OFF\n\n/* 1101 1101 0000 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 0001 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 0010 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 0011 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 0100 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 0101 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 0110 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 0111 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1000 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1001 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1010 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1011 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1100 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1101 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1110 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n/* 1101 1101 1111 */ TABDECL(OP_LDC_P_IMM_OFF),\t\t// OP_LDC_P_IMM_OFF\n\n/* 1101 1110 0000 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 0001 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 0010 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 0011 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 0100 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 0101 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 0110 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 0111 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1000 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1001 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1010 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1011 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1100 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1101 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1110 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n/* 1101 1110 1111 */ TABDECL(OP_STC_P_PREIND),\t\t// OP_STC_P_PREIND\n\n/* 1101 1111 0000 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 0001 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 0010 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 0011 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 0100 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 0101 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 0110 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 0111 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1000 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1001 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1010 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1011 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1100 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1101 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1110 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n/* 1101 1111 1111 */ TABDECL(OP_LDC_P_PREIND),\t\t// OP_LDC_P_PREIND\n\n/* 1110 0000 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0000 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0000 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0000 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0000 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0000 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0000 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0000 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0000 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 0001 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0001 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0001 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0001 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0001 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0001 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0001 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0001 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0001 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1110 0010 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0010 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0010 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0010 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0010 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0010 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0010 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0010 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0010 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 0011 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0011 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0011 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0011 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0011 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0011 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0011 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0011 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0011 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1110 0100 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0100 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0100 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0100 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0100 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0100 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0100 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0100 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0100 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 0101 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0101 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0101 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0101 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0101 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0101 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0101 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0101 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0101 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1110 0110 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0110 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0110 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0110 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0110 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0110 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0110 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 0110 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0110 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 0111 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0111 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0111 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0111 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0111 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0111 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0111 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 0111 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 0111 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1110 1000 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1000 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1000 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1000 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1000 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1000 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1000 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1000 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1000 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 1001 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1001 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1001 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1001 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1001 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1001 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1001 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1001 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1001 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1110 1010 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1010 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1010 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1010 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1010 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1010 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1010 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1010 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1010 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 1011 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1011 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1011 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1011 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1011 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1011 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1011 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1011 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1011 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1110 1100 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1100 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1100 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1100 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1100 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1100 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1100 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1100 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1100 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 1101 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1101 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1101 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1101 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1101 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1101 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1101 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1101 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1101 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1110 1110 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 0001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1110 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 0011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1110 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 0101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1110 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 0111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1110 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 1001 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1110 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 1011 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1110 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 1101 */ TABDECL(OP_MCR),\t\t// OP_MCR\n/* 1110 1110 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1110 1111 */ TABDECL(OP_MCR),\t\t// OP_MCR\n\n/* 1110 1111 0000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 0001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1111 0010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 0011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1111 0100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 0101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1111 0110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 0111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1111 1000 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 1001 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1111 1010 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 1011 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1111 1100 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 1101 */ TABDECL(OP_MRC),\t\t// OP_MRC\n/* 1110 1111 1110 */ TABDECL(OP_CDP),\t\t// OP_CDP\n/* 1110 1111 1111 */ TABDECL(OP_MRC),\t\t// OP_MRC\n\n/* 1111 0000 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0000 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 0001 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0001 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 0010 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0010 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 0011 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0011 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 0100 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0100 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 0101 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0101 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 0110 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0110 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 0111 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 0111 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1000 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1000 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1001 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1001 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1010 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1010 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1011 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1011 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1100 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1100 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1101 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1101 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1110 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1110 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n/* 1111 1111 0000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 0001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 0010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 0011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 0100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 0101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 0110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 0111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1000 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1001 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1010 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1011 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1100 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1101 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1110 */ TABDECL(OP_SWI),\t\t// OP_SWI\n/* 1111 1111 1111 */ TABDECL(OP_SWI),\t\t// OP_SWI\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/instructions.h",
    "content": "/*\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 3 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _INSTRUCIONS_H_\n#define _INSTRUCIONS_H_\n\ntypedef u32 (FASTCALL* OpFunc)(const u32 i);\nextern const OpFunc arm_instructions_set[2][4096];\nextern const char* arm_instruction_names[4096];\nextern const OpFunc thumb_instructions_set[2][1024];\nextern const char* thumb_instruction_names[1024];\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/lua-engine.cpp",
    "content": "/*\r\n\tCopyright (C) 2009-2012 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"types.h\"\r\n#include \"lua-engine.h\"\r\n#include \"movie.h\"\r\n#include <assert.h>\r\n#include <vector>\r\n#include <map>\r\n#include <string>\r\n#include <algorithm>\r\n#include \"zlib.h\"\r\n#include \"NDSSystem.h\"\r\n#include \"movie.h\"\r\n#include \"GPU_osd.h\"\r\n#include \"saves.h\"\r\n#include \"emufile.h\"\r\n#if defined(WIN32) && !defined(WXPORT)\r\n#include <windows.h>\r\n#include \"main.h\"\r\n#include \"video.h\"\r\n#include \"resource.h\"\r\n#endif\r\n#ifdef WIN32\r\n#include <direct.h>\r\n#else\r\n#include <unistd.h>\r\n#endif\r\n\r\nusing namespace std;\r\n\r\n\r\n// functions that maybe aren't part of the Lua engine\r\n// but didn't make sense to add to BaseDriver (at least not yet)\r\nstatic bool IsHardwareAddressValid(u32 address) {\r\n\t// maybe TODO? let's say everything is valid.\r\n\treturn true;\r\n}\r\n\r\n\r\n// actual lua engine follows\r\n// adapted from gens-rr, nitsuja + upthorn\r\n\r\nextern \"C\" {\r\n\t#include \"lua.h\"\r\n\t#include \"lauxlib.h\"\r\n\t#include \"lualib.h\"\r\n\t#include \"lstate.h\"\r\n};\r\n\r\nenum SpeedMode\r\n{\r\n\tSPEEDMODE_NORMAL,\r\n\tSPEEDMODE_NOTHROTTLE,\r\n\tSPEEDMODE_TURBO,\r\n\tSPEEDMODE_MAXIMUM,\r\n};\r\n\r\nstruct LuaGUIData\r\n{\r\n\tu32* data;\r\n\tint stridePix;\r\n\tint xOrigin, yOrigin;\r\n\tint xMin, yMin, xMax, yMax;\r\n};\r\n\r\nstruct LuaSubMenuData\r\n{\r\n\tPlatformMenu menu;\r\n\tPlatformMenu subMenu;\r\n\tPlatformMenuItem menuItem;\r\n\tLuaSubMenuData(PlatformMenu _menu, PlatformMenu _subMenu, PlatformMenuItem _menuItem)\r\n\t{\r\n\t\tmenu = _menu;\r\n\t\tsubMenu = _subMenu;\r\n\t\tmenuItem = _menuItem;\r\n\t}\r\n};\r\n\r\nstruct LuaMenuData\r\n{\r\n\tstd::vector<LuaSubMenuData> subMenuData;\r\n\tstd::map<PlatformMenuItem, PlatformMenu> menuItemMap;\r\n};\r\n\r\nstatic const char* menuCallbackIDString = \"menuhandlers\";\r\n\r\nstruct LuaContextInfo {\r\n\tlua_State* L; // the Lua state\r\n\tbool started; // script has been started and hasn't yet been terminated, although it may not be currently running\r\n\tbool running; // script is currently running code (either the main call to the script or the callbacks it registered)\r\n\tbool returned; // main call to the script has returned (but it may still be active if it registered callbacks)\r\n\tbool crashed; // true if script has errored out\r\n\tbool restart; // if true, tells the script-running code to restart the script when the script stops\r\n\tbool restartLater; // set to true when a still-running script is stopped so that RestartAllLuaScripts can know which scripts to restart\r\n\tunsigned int worryCount; // counts up as the script executes, gets reset when the application is able to process messages, triggers a warning prompt if it gets too high\r\n\tbool stopWorrying; // set to true if the user says to let the script run forever despite appearing to be frozen\r\n\tbool panic; // if set to true, tells the script to terminate as soon as it can do so safely (used because directly calling lua_close() or luaL_error() is unsafe in some contexts)\r\n\tbool ranExit; // used to prevent a registered exit callback from ever getting called more than once\r\n\tbool guiFuncsNeedDeferring; // true whenever GUI drawing would be cleared by the next emulation update before it would be visible, and thus needs to be deferred until after the next emulation update\r\n\tint numDeferredFuncs; // number of deferred function calls accumulated, used to impose an arbitrary limit to avoid running out of memory\r\n\tbool ranFrameAdvance; // false if emu.frameadvance() hasn't been called yet\r\n\tint transparencyModifier; // values less than 255 will scale down the opacity of whatever the GUI renders, values greater than 255 will increase the opacity of anything transparent the GUI renders\r\n\tSpeedMode speedMode; // determines how emu.frameadvance() acts\r\n\tchar panicMessage [72]; // a message to print if the script terminates due to panic being set\r\n\tstd::string lastFilename; // path to where the script last ran from so that restart can work (note: storing the script in memory instead would not be useful because we always want the most up-to-date script from file)\r\n\tstd::string nextFilename; // path to where the script should run from next, mainly used in case the restart flag is true\r\n\tunsigned int dataSaveKey; // crc32 of the save data key, used to decide which script should get which data... by default (if no key is specified) it's calculated from the script filename\r\n\tunsigned int dataLoadKey; // same as dataSaveKey but set through registerload instead of registersave if the two differ\r\n\tbool dataSaveLoadKeySet; // false if the data save keys are unset or set to their default value\r\n\tbool rerecordCountingDisabled; // true if this script has disabled rerecord counting for the savestates it loads\r\n\tstd::vector<std::string> persistVars; // names of the global variables to persist, kept here so their associated values can be output when the script exits\r\n\tLuaSaveData newDefaultData; // data about the default state of persisted global variables, which we save on script exit so we can detect when the default value has changed to make it easier to reset persisted variables\r\n\tunsigned int numMemHooks; // number of registered memory functions (1 per hooked byte)\r\n\tLuaGUIData guiData;\r\n\tLuaMenuData menuData;\r\n\t// callbacks into the lua window... these don't need to exist per context the way I'm using them, but whatever\r\n\tvoid(*print)(int uid, const char* str);\r\n\tvoid(*onstart)(int uid);\r\n\tvoid(*onstop)(int uid, bool statusOK);\r\n};\r\nstd::map<int, LuaContextInfo*> luaContextInfo;\r\nstd::map<lua_State*, int> luaStateToUIDMap;\r\nint g_numScriptsStarted = 0;\r\nbool g_anyScriptsHighSpeed = false;\r\nbool g_stopAllScriptsEnabled = true;\r\n\r\n#define USE_INFO_STACK\r\n#ifdef USE_INFO_STACK\r\n\tstd::vector<LuaContextInfo*> infoStack;\r\n\t#define GetCurrentInfo() (*infoStack.front()) // should be faster but relies on infoStack correctly being updated to always have the current info in the first element\r\n#else\r\n\tstd::map<lua_State*, LuaContextInfo*> luaStateToContextMap;\r\n\t#define GetCurrentInfo() (*luaStateToContextMap[L->l_G->mainthread]) // should always work but might be slower\r\n#endif\r\n\r\n//#define ASK_USER_ON_FREEZE // dialog on freeze is disabled now because it seems to be unnecessary, but this can be re-defined to enable it\r\n\r\n\r\nstatic std::map<lua_CFunction, const char*> s_cFuncInfoMap;\r\n\r\n// using this macro you can define a callable-from-Lua function\r\n// while associating with it some information about its arguments.\r\n// that information will show up if the user tries to print the function\r\n// or otherwise convert it to a string.\r\n// (for example, \"writebyte=function(addr,value)\" instead of \"writebyte=function:0A403490\")\r\n// note that the user can always use addressof(func) if they want to retrieve the address.\r\n#define DEFINE_LUA_FUNCTION(name, argstring) \\\r\n\tstatic int name(lua_State* L); \\\r\n\tstatic const char* name##_args = s_cFuncInfoMap[name] = argstring; \\\r\n\tstatic int name(lua_State* L)\r\n\r\n#ifdef _MSC_VER\r\n\t#define snprintf _snprintf\r\n\t#define vscprintf _vscprintf\r\n#else\r\n\t#define stricmp strcasecmp\r\n\t#define strnicmp strncasecmp\r\n\t#define __forceinline __attribute__((always_inline))\r\n#endif\r\n\r\n\r\nstatic const char* luaCallIDStrings [] =\r\n{\r\n\t\"CALL_BEFOREEMULATION\",\r\n\t\"CALL_AFTEREMULATION\",\r\n\t\"CALL_AFTEREMULATIONGUI\",\r\n\t\"CALL_BEFOREEXIT\",\r\n\t\"CALL_BEFORESAVE\",\r\n\t\"CALL_AFTERLOAD\",\r\n\t\"CALL_ONSTART\",\r\n\t\"CALL_ONINITMENU\",\r\n\r\n\t\"CALL_HOTKEY_1\",\r\n\t\"CALL_HOTKEY_2\",\r\n\t\"CALL_HOTKEY_3\",\r\n\t\"CALL_HOTKEY_4\",\r\n\t\"CALL_HOTKEY_5\",\r\n\t\"CALL_HOTKEY_6\",\r\n\t\"CALL_HOTKEY_7\",\r\n\t\"CALL_HOTKEY_8\",\r\n\t\"CALL_HOTKEY_9\",\r\n\t\"CALL_HOTKEY_10\",\r\n\t\"CALL_HOTKEY_11\",\r\n\t\"CALL_HOTKEY_12\",\r\n\t\"CALL_HOTKEY_13\",\r\n\t\"CALL_HOTKEY_14\",\r\n\t\"CALL_HOTKEY_15\",\r\n\t\"CALL_HOTKEY_16\",\r\n};\r\nstatic const int _makeSureWeHaveTheRightNumberOfStrings [sizeof(luaCallIDStrings)/sizeof(*luaCallIDStrings) == LUACALL_COUNT ? 1 : 0];\r\n\r\nstatic const char* luaMemHookTypeStrings [] =\r\n{\r\n\t\"MEMHOOK_WRITE\",\r\n\t\"MEMHOOK_READ\",\r\n\t\"MEMHOOK_EXEC\",\r\n\r\n\t\"MEMHOOK_WRITE_SUB\",\r\n\t\"MEMHOOK_READ_SUB\",\r\n\t\"MEMHOOK_EXEC_SUB\",\r\n};\r\nstatic const int _makeSureWeHaveTheRightNumberOfStrings2 [sizeof(luaMemHookTypeStrings)/sizeof(*luaMemHookTypeStrings) == LUAMEMHOOK_COUNT ? 1 : 0];\r\n\r\nvoid StopScriptIfFinished(int uid, bool justReturned = false);\r\nvoid SetSaveKey(LuaContextInfo& info, const char* key);\r\nvoid SetLoadKey(LuaContextInfo& info, const char* key);\r\nvoid RefreshScriptStartedStatus();\r\nvoid RefreshScriptSpeedStatus();\r\n\r\nstatic char* rawToCString(lua_State* L, int idx=0);\r\nstatic const char* toCString(lua_State* L, int idx=0);\r\n\r\nstatic void CalculateMemHookRegions(LuaMemHookType hookType);\r\n\r\nstatic int memory_registerHook(lua_State* L, LuaMemHookType hookType, int defaultSize)\r\n{\r\n\t// get first argument: address\r\n\tunsigned int addr = luaL_checkinteger(L,1);\r\n\t//if((addr & ~0xFFFFFF) == ~0xFFFFFF)\r\n\t//\taddr &= 0xFFFFFF;\r\n\r\n\t// get optional second argument: size\r\n\tint size = defaultSize;\r\n\tint funcIdx = 2;\r\n\tif(lua_isnumber(L,2))\r\n\t{\r\n\t\tsize = luaL_checkinteger(L,2);\r\n\t\tif(size < 0)\r\n\t\t{\r\n\t\t\tsize = -size;\r\n\t\t\taddr -= size;\r\n\t\t}\r\n\t\tfuncIdx++;\r\n\t}\r\n\r\n\t// check last argument: callback function\r\n\tbool clearing = lua_isnil(L,funcIdx);\r\n\tif(!clearing)\r\n\t\tluaL_checktype(L, funcIdx, LUA_TFUNCTION);\r\n\tlua_settop(L,funcIdx);\r\n\r\n\t// get the address-to-callback table for this hook type of the current script\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]);\r\n\r\n\t// count how many callback functions we'll be displacing\r\n\tint numFuncsAfter = clearing ? 0 : size;\r\n\tint numFuncsBefore = 0;\r\n\tfor(unsigned int i = addr; i != addr+size; i++)\r\n\t{\r\n\t\tlua_rawgeti(L, -1, i);\r\n\t\tif(lua_isfunction(L, -1))\r\n\t\t\tnumFuncsBefore++;\r\n\t\tlua_pop(L,1);\r\n\t}\r\n\r\n\t// put the callback function in the address slots\r\n\tfor(unsigned int i = addr; i != addr+size; i++)\r\n\t{\r\n\t\tlua_pushvalue(L, -2);\r\n\t\tlua_rawseti(L, -2, i);\r\n\t}\r\n\r\n\t// adjust the count of active hooks\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tinfo.numMemHooks += numFuncsAfter - numFuncsBefore;\r\n\r\n\t// re-cache regions of hooked memory across all scripts\r\n\tCalculateMemHookRegions(hookType);\r\n\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 0;\r\n}\r\n\r\nLuaMemHookType MatchHookTypeToCPU(lua_State* L, LuaMemHookType hookType)\r\n{\r\n\tint cpuID = 0;\r\n\r\n\tint cpunameIndex = 0;\r\n\tif(lua_type(L,2) == LUA_TSTRING)\r\n\t\tcpunameIndex = 2;\r\n\telse if(lua_type(L,3) == LUA_TSTRING)\r\n\t\tcpunameIndex = 3;\r\n\r\n\tif(cpunameIndex)\r\n\t{\r\n\t\tconst char* cpuName = lua_tostring(L, cpunameIndex);\r\n//\t\tif(!stricmp(cpuName, \"sub\") || !stricmp(cpuName, \"s68k\"))\r\n//\t\t\tcpuID = 1;\r\n\t\tlua_remove(L, cpunameIndex);\r\n\t}\r\n\r\n//\tswitch(cpuID)\r\n//\t{\r\n//\tcase 0: // m68k:\r\n//\t\treturn hookType;\r\n//\r\n//\tcase 1: // s68k:\r\n//\t\tswitch(hookType)\r\n//\t\t{\r\n//\t\tcase LUAMEMHOOK_WRITE: return LUAMEMHOOK_WRITE_SUB;\r\n//\t\tcase LUAMEMHOOK_READ: return LUAMEMHOOK_READ_SUB;\r\n//\t\tcase LUAMEMHOOK_EXEC: return LUAMEMHOOK_EXEC_SUB;\r\n//\t\t}\r\n//\t}\r\n\treturn hookType;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(memory_registerwrite, \"address,[size=1,][cpuname=\\\"main\\\",]func\")\r\n{\r\n#ifndef HAVE_LUA\r\n\tluaL_error(L, \"memory.registerwrite failed: function is not available in this build.\");\r\n#endif\r\n\treturn memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_WRITE), 1);\r\n}\r\nDEFINE_LUA_FUNCTION(memory_registerread, \"address,[size=1,][cpuname=\\\"main\\\",]func\")\r\n{\r\n#ifndef HAVE_LUA\r\n\tluaL_error(L, \"memory.registerread failed: function is not available in this build.\");\r\n#endif\r\n\treturn memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_READ), 1);\r\n}\r\nDEFINE_LUA_FUNCTION(memory_registerexec, \"address,[size=2,][cpuname=\\\"main\\\",]func\")\r\n{\r\n#ifndef HAVE_LUA\r\n\tluaL_error(L, \"memory.registerexec failed: function is not available in this build.\");\r\n#endif\r\n\treturn memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_EXEC), 2);\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_registerbefore, \"func\")\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEMULATION]);\r\n\tlua_insert(L,1);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEMULATION]);\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_registerafter, \"func\")\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATION]);\r\n\tlua_insert(L,1);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATION]);\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_registerexit, \"func\")\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]);\r\n\tlua_insert(L,1);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]);\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_registerstart, \"func\") // TODO: use call registered LUACALL_ONSTART functions on reset\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONSTART]);\r\n\tlua_insert(L,1);\r\n\tlua_pushvalue(L,-1); // copy the function so we can also call it\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONSTART]);\r\n\tif (!lua_isnil(L,-1) && driver->EMU_HasEmulationStarted())\r\n\t\tlua_call(L,0,0); // call the function now since the game has already started and this start function hasn't been called yet\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(gui_register, \"func\")\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATIONGUI]);\r\n\tlua_insert(L,1);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTEREMULATIONGUI]);\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(state_registersave, \"func[,savekey]\")\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tif (!lua_isnoneornil(L,2))\r\n\t\tSetSaveKey(GetCurrentInfo(), rawToCString(L,2));\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFORESAVE]);\r\n\tlua_insert(L,1);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFORESAVE]);\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(state_registerload, \"func[,loadkey]\")\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tif (!lua_isnoneornil(L,2))\r\n\t\tSetLoadKey(GetCurrentInfo(), rawToCString(L,2));\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTERLOAD]);\r\n\tlua_insert(L,1);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_AFTERLOAD]);\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(input_registerhotkey, \"keynum,func\")\r\n{\r\n\tint hotkeyNumber = luaL_checkinteger(L,1);\r\n\tif(hotkeyNumber < 1 || hotkeyNumber > 16)\r\n\t{\r\n\t\tluaL_error(L, \"input.registerhotkey(n,func) requires 1 <= n <= 16, but got n = %d.\", hotkeyNumber);\r\n\t\treturn 0;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tconst char* key = luaCallIDStrings[LUACALL_SCRIPT_HOTKEY_1 + hotkeyNumber-1];\r\n\t\tlua_getfield(L, LUA_REGISTRYINDEX, key);\r\n\t\tlua_replace(L,1);\r\n\t\tif (!lua_isnil(L,2))\r\n\t\t\tluaL_checktype(L, 2, LUA_TFUNCTION);\r\n\t\tlua_settop(L,2);\r\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, key);\r\n\t\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\t\treturn 1;\r\n\t}\r\n}\r\n\r\nstatic int doPopup(lua_State* L, const char* deftype, const char* deficon)\r\n{\r\n\tconst char* str = toCString(L,1);\r\n\tconst char* type = lua_type(L,2) == LUA_TSTRING ? lua_tostring(L,2) : deftype;\r\n\tconst char* icon = lua_type(L,3) == LUA_TSTRING ? lua_tostring(L,3) : deficon;\r\n\r\n\tint itype = -1, iters = 0;\r\n\twhile(itype == -1 && iters++ < 2)\r\n\t{\r\n\t\tif(!stricmp(type, \"ok\")) itype = 0;\r\n\t\telse if(!stricmp(type, \"yesno\")) itype = 1;\r\n\t\telse if(!stricmp(type, \"yesnocancel\")) itype = 2;\r\n\t\telse if(!stricmp(type, \"okcancel\")) itype = 3;\r\n\t\telse if(!stricmp(type, \"abortretryignore\")) itype = 4;\r\n\t\telse type = deftype;\r\n\t}\r\n\tassert(itype >= 0 && itype <= 4);\r\n\tif(!(itype >= 0 && itype <= 4)) itype = 0;\r\n\r\n\tint iicon = -1; iters = 0;\r\n\twhile(iicon == -1 && iters++ < 2)\r\n\t{\r\n\t\tif(!stricmp(icon, \"message\") || !stricmp(icon, \"notice\")) iicon = 0;\r\n\t\telse if(!stricmp(icon, \"question\")) iicon = 1;\r\n\t\telse if(!stricmp(icon, \"warning\")) iicon = 2;\r\n\t\telse if(!stricmp(icon, \"error\")) iicon = 3;\r\n\t\telse icon = deficon;\r\n\t}\r\n\tassert(iicon >= 0 && iicon <= 3);\r\n\tif(!(iicon >= 0 && iicon <= 3)) iicon = 0;\r\n\r\n\tstatic const char * const titles [] = {\"Notice\", \"Question\", \"Warning\", \"Error\"};\r\n\tconst char* answer = \"ok\";\r\n#if defined(_WIN32) && !defined(WXPORT)\r\n\tstatic const int etypes [] = {MB_OK, MB_YESNO, MB_YESNOCANCEL, MB_OKCANCEL, MB_ABORTRETRYIGNORE};\r\n\tstatic const int eicons [] = {MB_ICONINFORMATION, MB_ICONQUESTION, MB_ICONWARNING, MB_ICONERROR};\r\n//\tDialogsOpen++;\r\n\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\tEnableWindow(MainWindow->getHWnd(), false);\r\n//\tif (Full_Screen)\r\n//\t{\r\n//\t\twhile (ShowCursor(false) >= 0);\r\n//\t\twhile (ShowCursor(true) < 0);\r\n//\t}\r\n\tint ianswer = MessageBox((HWND)uid, str, titles[iicon], etypes[itype] | eicons[iicon]);\r\n\tEnableWindow(MainWindow->getHWnd(), true);\r\n//\tDialogsOpen--;\r\n\tswitch(ianswer)\r\n\t{\r\n\t\tcase IDOK: answer = \"ok\"; break;\r\n\t\tcase IDCANCEL: answer = \"cancel\"; break;\r\n\t\tcase IDABORT: answer = \"abort\"; break;\r\n\t\tcase IDRETRY: answer = \"retry\"; break;\r\n\t\tcase IDIGNORE: answer = \"ignore\"; break;\r\n\t\tcase IDYES: answer = \"yes\"; break;\r\n\t\tcase IDNO: answer = \"no\"; break;\r\n\t}\r\n#else\r\n\t// NYI (assume first answer for now)\r\n\tswitch(itype)\r\n\t{\r\n\t\tcase 0: case 3: answer = \"ok\"; break;\r\n\t\tcase 1: case 2: answer = \"yes\"; break;\r\n\t\tcase 4: answer = \"abort\"; break;\r\n\t}\r\n#endif\r\n\r\n\tlua_pushstring(L, answer);\r\n\treturn 1;\r\n}\r\n\r\n// string gui.popup(string message, string type = \"ok\", string icon = \"message\")\r\n// string input.popup(string message, string type = \"yesno\", string icon = \"question\")\r\nDEFINE_LUA_FUNCTION(gui_popup, \"message[,type=\\\"ok\\\"[,icon=\\\"message\\\"]]\")\r\n{\r\n\treturn doPopup(L, \"ok\", \"message\");\r\n}\r\nDEFINE_LUA_FUNCTION(input_popup, \"message[,type=\\\"yesno\\\"[,icon=\\\"question\\\"]]\")\r\n{\r\n\treturn doPopup(L, \"yesno\", \"question\");\r\n}\r\n\r\nstatic const char* FilenameFromPath(const char* path)\r\n{\r\n\tconst char* slash1 = strrchr(path, '\\\\');\r\n\tconst char* slash2 = strrchr(path, '/');\r\n\tif(slash1) slash1++;\r\n\tif(slash2) slash2++;\r\n\tconst char* rv = path;\r\n\trv = std::max(rv, slash1);\r\n\trv = std::max(rv, slash2);\r\n\tif(!rv) rv = \"\";\r\n\treturn rv;\r\n}\r\n\r\nvoid TrimFilenameFromPath(char* path)\r\n{\r\n\tchar* slash1 = strrchr(path, '\\\\');\r\n\tchar* slash2 = strrchr(path, '/');\r\n\tchar* slash = slash1;\r\n\tif (slash == NULL || slash2 > slash) {\r\n\t\tslash = slash2;\r\n\t}\r\n\tif (slash != NULL) {\r\n\t\t*(slash + 1) = '\\0';\r\n\t}\r\n}\r\n\r\n\r\nstatic void toCStringConverter(lua_State* L, int i, char*& ptr, int& remaining);\r\n\r\n// compare the contents of two items on the Lua stack to determine if they differ\r\n// only works for relatively simple, saveable items (numbers, strings, bools, nil, and possibly-nested tables of those, up to a certain max length)\r\n// not the best implementation, but good enough for what it's currently used for\r\nstatic bool luaValueContentsDiffer(lua_State* L, int idx1, int idx2)\r\n{\r\n\tstatic const int maxLen = 8192;\r\n\tstatic char str1[maxLen];\r\n\tstatic char str2[maxLen];\r\n\tstr1[0] = 0;\r\n\tstr2[0] = 0;\r\n\tchar* ptr1 = str1;\r\n\tchar* ptr2 = str2;\r\n\tint remaining1 = maxLen;\r\n\tint remaining2 = maxLen;\r\n\ttoCStringConverter(L, idx1, ptr1, remaining1);\r\n\ttoCStringConverter(L, idx2, ptr2, remaining2);\r\n\treturn (remaining1 != remaining2) || (strcmp(str1,str2) != 0);\r\n}\r\n\r\n\r\n// fills output with the path\r\n// also returns a pointer to the first character in the filename (non-directory) part of the path\r\nstatic char* ConstructScriptSaveDataPath(char* output, int bufferSize, LuaContextInfo& info)\r\n{\r\n//\tGet_State_File_Name(output); TODO\r\n\tchar* slash1 = strrchr(output, '\\\\');\r\n\tchar* slash2 = strrchr(output, '/');\r\n\tif(slash1) slash1[1] = '\\0';\r\n\tif(slash2) slash2[1] = '\\0';\r\n\tchar* rv = output + strlen(output);\r\n\tstrncat(output, \"u.\", bufferSize-(strlen(output)+1));\r\n\tif(!info.dataSaveLoadKeySet)\r\n\t\tstrncat(output, FilenameFromPath(info.lastFilename.c_str()), bufferSize-(strlen(output)+1));\r\n\telse\r\n\t\tsnprintf(output+strlen(output), bufferSize-(strlen(output)+1), \"%X\", info.dataSaveKey);\r\n\tstrncat(output, \".luasav\", bufferSize-(strlen(output)+1));\r\n\treturn rv;\r\n}\r\n\r\n// emu.persistglobalvariables({\r\n//   variable1 = defaultvalue1,\r\n//   variable2 = defaultvalue2,\r\n//   etc\r\n// })\r\n// takes a table with variable names as the keys and default values as the values,\r\n// and defines each of those variables names as a global variable,\r\n// setting them equal to the values they had the last time the script exited,\r\n// or (if that isn't available) setting them equal to the provided default values.\r\n// as a special case, if you want the default value for a variable to be nil,\r\n// then put the variable name alone in quotes as an entry in the table without saying \"= nil\".\r\n// this special case is because tables in lua don't store nil valued entries.\r\n// also, if you change the default value that will reset the variable to the new default.\r\nDEFINE_LUA_FUNCTION(emu_persistglobalvariables, \"variabletable\")\r\n{\r\n\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\r\n\t// construct a path we can load the persistent variables from\r\n\tchar path [1024] = {0};\r\n\tchar* pathTypeChrPtr = ConstructScriptSaveDataPath(path, 1024, info);\r\n\r\n\t// load the previously-saved final variable values from file\r\n\tLuaSaveData exitData;\r\n\t{\r\n\t\t*pathTypeChrPtr = 'e';\r\n\t\tFILE* persistFile = fopen(path, \"rb\");\r\n\t\tif(persistFile)\r\n\t\t{\r\n\t\t\texitData.ImportRecords(persistFile);\r\n\t\t\tfclose(persistFile);\r\n\t\t}\r\n\t}\r\n\r\n\t// load the previously-saved default variable values from file\r\n\tLuaSaveData defaultData;\r\n\t{\r\n\t\t*pathTypeChrPtr = 'd';\r\n\t\tFILE* defaultsFile = fopen(path, \"rb\");\r\n\t\tif(defaultsFile)\r\n\t\t{\r\n\t\t\tdefaultData.ImportRecords(defaultsFile);\r\n\t\t\tfclose(defaultsFile);\r\n\t\t}\r\n\t}\r\n\r\n\t// loop through the passed-in variables,\r\n\t// exposing a global variable to the script for each one\r\n\t// while also keeping a record of their names\r\n\t// so we can save them (to the persistFile) later when the script exits\r\n\tint numTables = lua_gettop(L);\r\n\tfor(int i = 1; i <= numTables; i++)\r\n\t{\r\n\t\tluaL_checktype(L, i, LUA_TTABLE);\r\n\r\n\t\tlua_pushnil(L); // before first key\r\n\t\tint keyIndex = lua_gettop(L);\r\n\t\tint valueIndex = keyIndex + 1;\r\n\t\twhile(lua_next(L, i))\r\n\t\t{\r\n\t\t\tint keyType = lua_type(L, keyIndex);\r\n\t\t\tint valueType = lua_type(L, valueIndex);\r\n\t\t\tif(keyType == LUA_TSTRING && valueType <= LUA_TTABLE && valueType != LUA_TLIGHTUSERDATA)\r\n\t\t\t{\r\n\t\t\t\t// variablename = defaultvalue,\r\n\r\n\t\t\t\t// duplicate the key first because lua_next() needs to eat that\r\n\t\t\t\tlua_pushvalue(L, keyIndex);\r\n\t\t\t\tlua_insert(L, keyIndex);\r\n\t\t\t}\r\n\t\t\telse if(keyType == LUA_TNUMBER && valueType == LUA_TSTRING)\r\n\t\t\t{\r\n\t\t\t\t// \"variablename\",\r\n\t\t\t\t// or [index] = \"variablename\",\r\n\r\n\t\t\t\t// defaultvalue is assumed to be nil\r\n\t\t\t\tlua_pushnil(L);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tluaL_error(L, \"'%s' = '%s' entries are not allowed in the table passed to emu.persistglobalvariables()\", lua_typename(L,keyType), lua_typename(L,valueType));\r\n\t\t\t}\r\n\r\n\t\t\tint varNameIndex = valueIndex;\r\n\t\t\tint defaultIndex = valueIndex+1;\r\n\r\n\t\t\t// keep track of the variable name for later\r\n\t\t\tconst char* varName = lua_tostring(L, varNameIndex);\r\n\t\t\tinfo.persistVars.push_back(varName);\r\n\t\t\tunsigned int varNameCRC = crc32(0, (const unsigned char*)varName, strlen(varName));\r\n\t\t\tinfo.newDefaultData.SaveRecordPartial(uid, varNameCRC, defaultIndex);\r\n\r\n\t\t\t// load the previous default value for this variable if it exists.\r\n\t\t\t// if the new default is different than the old one,\r\n\t\t\t// assume the user wants to set the value to the new default value\r\n\t\t\t// instead of the previously-saved exit value.\r\n\t\t\tbool attemptPersist = true;\r\n\t\t\tdefaultData.LoadRecord(uid, varNameCRC, 1);\r\n\t\t\tlua_pushnil(L);\r\n\t\t\tif(luaValueContentsDiffer(L, defaultIndex, defaultIndex+1))\r\n\t\t\t\tattemptPersist = false;\r\n\t\t\tlua_settop(L, defaultIndex);\r\n\r\n\t\t\tif(attemptPersist)\r\n\t\t\t{\r\n\t\t\t\t// load the previous saved value for this variable if it exists\r\n\t\t\t\texitData.LoadRecord(uid, varNameCRC, 1);\r\n\t\t\t\tif(lua_gettop(L) > defaultIndex)\r\n\t\t\t\t\tlua_remove(L, defaultIndex); // replace value with loaded record\r\n\t\t\t\tlua_settop(L, defaultIndex);\r\n\t\t\t}\r\n\r\n\t\t\t// set the global variable\r\n\t\t\tlua_settable(L, LUA_GLOBALSINDEX);\r\n\r\n\t\t\tassert(lua_gettop(L) == keyIndex);\r\n\t\t}\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic const char* deferredGUIIDString = \"lazygui\";\r\nstatic const char* deferredJoySetIDString = \"lazyjoy\";\r\n#define MAX_DEFERRED_COUNT 16384\r\n\r\n// store the most recent C function call from Lua (and all its arguments)\r\n// for later evaluation\r\nvoid DeferFunctionCall(lua_State* L, const char* idstring)\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tif(info.numDeferredFuncs < MAX_DEFERRED_COUNT)\r\n\t\tinfo.numDeferredFuncs++;\r\n\telse\r\n\t\treturn; // too many deferred functions on the same frame, silently discard the rest\r\n\r\n\t// there might be a cleaner way of doing this using lua_pushcclosure and lua_getref\r\n\r\n\tint num = lua_gettop(L);\r\n\r\n\t// get the C function pointer\r\n\t//lua_CFunction cf = lua_tocfunction(L, -(num+1));\r\n\tlua_CFunction cf = (L->ci->func)->value.gc->cl.c.f;\r\n\tassert(cf);\r\n\tlua_pushcfunction(L,cf);\r\n\r\n\t// make a list of the function and its arguments (and also pop those arguments from the stack)\r\n\tlua_createtable(L, num+1, 0);\r\n\tlua_insert(L, 1);\r\n\tfor(int n = num+1; n > 0; n--)\r\n\t\tlua_rawseti(L, 1, n);\r\n\r\n\t// put the list into a global array\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, idstring);\r\n\tlua_insert(L, 1);\r\n\tint curSize = lua_objlen(L, 1);\r\n\tlua_rawseti(L, 1, curSize+1);\r\n\r\n\t// clean the stack\r\n\tlua_settop(L, 0);\r\n}\r\n\r\nstatic const char* refStashString = \"refstash\";\r\n\r\nvoid CallDeferredFunctions(lua_State* L, const char* idstring)\r\n{\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, idstring);\r\n\tint numCalls = lua_objlen(L, -1);\r\n\tif(numCalls > 0)\r\n\t{\r\n\t\t// save and pop any extra things that were on the stack\r\n\t\tint top = lua_gettop(L);\r\n\t\tint stashRef = -1;\r\n\t\tif(top > 1)\r\n\t\t{\r\n\t\t\tlua_insert(L, 1);\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, refStashString);\r\n\t\t\tlua_insert(L, 2);\r\n\t\t\tlua_createtable(L, top-1, 0);\r\n\t\t\tlua_insert(L, 3);\r\n\t\t\tfor(int remaining = top; remaining-- > 1;)\r\n\t\t\t\tlua_rawseti(L, 3, remaining);\r\n\t\t\tassert(lua_gettop(L) == 3);\r\n\t\t\tstashRef = luaL_ref(L, 2);\r\n\t\t\tlua_pop(L, 1);\r\n\t\t}\r\n\t\t\r\n\t\t// loop through all the queued function calls\r\n\t\tfor(int i = 1; i <= numCalls; i++)\r\n\t\t{\r\n\t\t\tlua_rawgeti(L, 1, i);  // get the function+arguments list\r\n\t\t\tint listSize = lua_objlen(L, 2);\r\n\r\n\t\t\t// push the arguments and the function\r\n\t\t\tfor(int j = 1; j <= listSize; j++)\r\n\t\t\t\tlua_rawgeti(L, 2, j);\r\n\r\n\t\t\t// get and pop the function\r\n\t\t\tlua_CFunction cf = lua_tocfunction(L, -1);\r\n\t\t\tlua_pop(L, 1);\r\n\r\n\t\t\t// shift first argument to slot 1 and call the function\r\n\t\t\tlua_remove(L, 2);\r\n\t\t\tlua_remove(L, 1);\r\n\t\t\tcf(L);\r\n\r\n\t\t\t// prepare for next iteration\r\n\t\t\tlua_settop(L, 0);\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, idstring);\r\n\t\t}\r\n\r\n\t\t// clear the list of deferred functions\r\n\t\tlua_newtable(L);\r\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, idstring);\r\n\t\tLuaContextInfo& info = GetCurrentInfo();\r\n\t\tinfo.numDeferredFuncs -= numCalls;\r\n\t\tif(info.numDeferredFuncs < 0)\r\n\t\t\tinfo.numDeferredFuncs = 0;\r\n\r\n\t\t// restore the stack\r\n\t\tlua_settop(L, 0);\r\n\t\tif(top > 1)\r\n\t\t{\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, refStashString);\r\n\t\t\tlua_rawgeti(L, 1, stashRef);\r\n\t\t\tfor(int i = 1; i <= top-1; i++)\r\n\t\t\t\tlua_rawgeti(L, 2, i);\r\n\t\t\tluaL_unref(L, 1, stashRef);\r\n\t\t\tlua_remove(L, 2);\r\n\t\t\tlua_remove(L, 1);\r\n\t\t}\r\n\t\tassert(lua_gettop(L) == top - 1);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tlua_pop(L, 1);\r\n\t}\r\n}\r\n\r\nbool DeferGUIFuncIfNeeded(lua_State* L)\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tif(info.speedMode == SPEEDMODE_MAXIMUM)\r\n\t{\r\n\t\t// if the mode is \"maximum\" then discard all GUI function calls\r\n\t\t// and pretend it was because we deferred them\r\n\t\treturn true;\r\n\t}\r\n\tif(info.guiFuncsNeedDeferring)\r\n\t{\r\n\t\t// defer whatever function called this one until later\r\n\t\tDeferFunctionCall(L, deferredGUIIDString);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// ok to run the function right now\r\n\treturn false;\r\n}\r\n\r\nvoid worry(lua_State* L, int intensity)\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tinfo.worryCount += intensity;\r\n}\r\n\r\nstatic inline bool isalphaorunderscore(char c)\r\n{\r\n\treturn isalpha(c) || c == '_';\r\n}\r\n\r\nstatic std::vector<const void*> s_tableAddressStack; // prevents infinite recursion of a table within a table (when cycle is found, print something like table:parent)\r\nstatic std::vector<const void*> s_metacallStack; // prevents infinite recursion if something's __tostring returns another table that contains that something (when cycle is found, print the inner result without using __tostring)\r\n\r\n#define APPENDPRINT { int _n = snprintf(ptr, remaining,\r\n#define END ); if(_n >= 0) { ptr += _n; remaining -= _n; } else { remaining = 0; } }\r\nstatic void toCStringConverter(lua_State* L, int i, char*& ptr, int& remaining)\r\n{\r\n\tif(remaining <= 0)\r\n\t\treturn;\r\n\r\n\tconst char* str = ptr; // for debugging\r\n\r\n\t// if there is a __tostring metamethod then call it\r\n\tint usedMeta = luaL_callmeta(L, i, \"__tostring\");\r\n\tif(usedMeta)\r\n\t{\r\n\t\tstd::vector<const void*>::const_iterator foundCycleIter = std::find(s_metacallStack.begin(), s_metacallStack.end(), lua_topointer(L,i));\r\n\t\tif(foundCycleIter != s_metacallStack.end())\r\n\t\t{\r\n\t\t\tlua_pop(L, 1);\r\n\t\t\tusedMeta = false;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\ts_metacallStack.push_back(lua_topointer(L,i));\r\n\t\t\ti = lua_gettop(L);\r\n\t\t}\r\n\t}\r\n\r\n\tswitch(lua_type(L, i))\r\n\t{\r\n\t\tcase LUA_TNONE: break;\r\n\t\tcase LUA_TNIL: APPENDPRINT \"nil\" END break;\r\n\t\tcase LUA_TBOOLEAN: APPENDPRINT lua_toboolean(L,i) ? \"true\" : \"false\" END break;\r\n\t\tcase LUA_TSTRING: APPENDPRINT \"%s\",lua_tostring(L,i) END break;\r\n\t\tcase LUA_TNUMBER: APPENDPRINT \"%.12Lg\",lua_tonumber(L,i) END break;\r\n\t\tcase LUA_TFUNCTION: \r\n\t\t\tif((L->base + i-1)->value.gc->cl.c.isC)\r\n\t\t\t{\r\n\t\t\t\tlua_CFunction func = lua_tocfunction(L, i);\r\n\t\t\t\tstd::map<lua_CFunction, const char*>::iterator iter = s_cFuncInfoMap.find(func);\r\n\t\t\t\tif(iter == s_cFuncInfoMap.end())\r\n\t\t\t\t\tgoto defcase;\r\n\t\t\t\tAPPENDPRINT \"function(%s)\", iter->second END \r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tAPPENDPRINT \"function(\" END \r\n\t\t\t\tProto* p = (L->base + i-1)->value.gc->cl.l.p;\r\n\t\t\t\tint numParams = p->numparams + (p->is_vararg?1:0);\r\n\t\t\t\tfor (int n=0; n<p->numparams; n++)\r\n\t\t\t\t{\r\n\t\t\t\t\tAPPENDPRINT \"%s\", getstr(p->locvars[n].varname) END \r\n\t\t\t\t\tif(n != numParams-1)\r\n\t\t\t\t\t\tAPPENDPRINT \",\" END\r\n\t\t\t\t}\r\n\t\t\t\tif(p->is_vararg)\r\n\t\t\t\t\tAPPENDPRINT \"...\" END\r\n\t\t\t\tAPPENDPRINT \")\" END\r\n\t\t\t}\r\n\t\t\tbreak;\r\ndefcase:default: APPENDPRINT \"%s:%p\",luaL_typename(L,i),lua_topointer(L,i) END break;\r\n\t\tcase LUA_TTABLE:\r\n\t\t{\r\n\t\t\t// first make sure there's enough stack space\r\n\t\t\tif(!lua_checkstack(L, 4))\r\n\t\t\t{\r\n\t\t\t\t// note that even if lua_checkstack never returns false,\r\n\t\t\t\t// that doesn't mean we didn't need to call it,\r\n\t\t\t\t// because calling it retrieves stack space past LUA_MINSTACK\r\n\t\t\t\tgoto defcase;\r\n\t\t\t}\r\n\r\n\t\t\tstd::vector<const void*>::const_iterator foundCycleIter = std::find(s_tableAddressStack.begin(), s_tableAddressStack.end(), lua_topointer(L,i));\r\n\t\t\tif(foundCycleIter != s_tableAddressStack.end())\r\n\t\t\t{\r\n\t\t\t\tint parentNum = s_tableAddressStack.end() - foundCycleIter;\r\n\t\t\t\tif(parentNum > 1)\r\n\t\t\t\t\tAPPENDPRINT \"%s:parent^%d\",luaL_typename(L,i),parentNum END\r\n\t\t\t\telse\r\n\t\t\t\t\tAPPENDPRINT \"%s:parent\",luaL_typename(L,i) END\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ts_tableAddressStack.push_back(lua_topointer(L,i));\r\n\t\t\t\tstruct Scope { ~Scope(){ s_tableAddressStack.pop_back(); } } scope;\r\n\r\n\t\t\t\tAPPENDPRINT \"{\" END\r\n\r\n\t\t\t\tlua_pushnil(L); // first key\r\n\t\t\t\tint keyIndex = lua_gettop(L);\r\n\t\t\t\tint valueIndex = keyIndex + 1;\r\n\t\t\t\tbool first = true;\r\n\t\t\t\tbool skipKey = true; // true if we're still in the \"array part\" of the table\r\n\t\t\t\tlua_Number arrayIndex = (lua_Number)0;\r\n\t\t\t\twhile(lua_next(L, i))\r\n\t\t\t\t{\r\n\t\t\t\t\tif(first)\r\n\t\t\t\t\t\tfirst = false;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tAPPENDPRINT \", \" END\r\n\t\t\t\t\tif(skipKey)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tarrayIndex += (lua_Number)1;\r\n\t\t\t\t\t\tbool keyIsNumber = (lua_type(L, keyIndex) == LUA_TNUMBER);\r\n\t\t\t\t\t\tskipKey = keyIsNumber && (lua_tonumber(L, keyIndex) == arrayIndex);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!skipKey)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbool keyIsString = (lua_type(L, keyIndex) == LUA_TSTRING);\r\n\t\t\t\t\t\tbool invalidLuaIdentifier = (!keyIsString || !isalphaorunderscore(*lua_tostring(L, keyIndex)));\r\n\t\t\t\t\t\tif(invalidLuaIdentifier)\r\n\t\t\t\t\t\t\tif(keyIsString)\r\n\t\t\t\t\t\t\t\tAPPENDPRINT \"['\" END\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tAPPENDPRINT \"[\" END\r\n\r\n\t\t\t\t\t\ttoCStringConverter(L, keyIndex, ptr, remaining); // key\r\n\r\n\t\t\t\t\t\tif(invalidLuaIdentifier)\r\n\t\t\t\t\t\t\tif(keyIsString)\r\n\t\t\t\t\t\t\t\tAPPENDPRINT \"']=\" END\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tAPPENDPRINT \"]=\" END\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tAPPENDPRINT \"=\" END\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbool valueIsString = (lua_type(L, valueIndex) == LUA_TSTRING);\r\n\t\t\t\t\tif(valueIsString)\r\n\t\t\t\t\t\tAPPENDPRINT \"'\" END\r\n\r\n\t\t\t\t\ttoCStringConverter(L, valueIndex, ptr, remaining); // value\r\n\r\n\t\t\t\t\tif(valueIsString)\r\n\t\t\t\t\t\tAPPENDPRINT \"'\" END\r\n\r\n\t\t\t\t\tlua_pop(L, 1);\r\n\r\n\t\t\t\t\tif(remaining <= 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlua_settop(L, keyIndex-1); // stack might not be clean yet if we're breaking early\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tAPPENDPRINT \"}\" END\r\n\t\t\t}\r\n\t\t}\tbreak;\r\n\t}\r\n\r\n\tif(usedMeta)\r\n\t{\r\n\t\ts_metacallStack.pop_back();\r\n\t\tlua_pop(L, 1);\r\n\t}\r\n}\r\n\r\nstatic const int s_tempStrMaxLen = 64 * 1024;\r\nstatic char s_tempStr [s_tempStrMaxLen];\r\n\r\nstatic char* rawToCString(lua_State* L, int idx)\r\n{\r\n\tint a = idx>0 ? idx : 1;\r\n\tint n = idx>0 ? idx : lua_gettop(L);\r\n\r\n\tchar* ptr = s_tempStr;\r\n\t*ptr = 0;\r\n\r\n\tint remaining = s_tempStrMaxLen;\r\n\tfor(int i = a; i <= n; i++)\r\n\t{\r\n\t\ttoCStringConverter(L, i, ptr, remaining);\r\n\t\tif(i != n)\r\n\t\t\tAPPENDPRINT \" \" END\r\n\t}\r\n\r\n\tif(remaining < 3)\r\n\t{\r\n\t\twhile(remaining < 6)\r\n\t\t\tremaining++, ptr--;\r\n\t\tAPPENDPRINT \"...\" END\r\n\t}\r\n\tAPPENDPRINT \"\\r\\n\" END\r\n\t// the trailing newline is so print() can avoid having to do wasteful things to print its newline\r\n\t// (string copying would be wasteful and calling info.print() twice can be extremely slow)\r\n\t// at the cost of functions that don't want the newline needing to trim off the last two characters\r\n\t// (which is a very fast operation and thus acceptable in this case)\r\n\r\n\treturn s_tempStr;\r\n}\r\n#undef APPENDPRINT\r\n#undef END\r\n\r\n\r\n// replacement for luaB_tostring() that is able to show the contents of tables (and formats numbers better, and show function prototypes)\r\n// can be called directly from lua via tostring(), assuming tostring hasn't been reassigned\r\nDEFINE_LUA_FUNCTION(tostring, \"...\")\r\n{\r\n\tchar* str = rawToCString(L);\r\n\tstr[strlen(str)-2] = 0; // hack: trim off the \\r\\n (which is there to simplify the print function's task)\r\n\tlua_pushstring(L, str);\r\n\treturn 1;\r\n}\r\n\r\n// like rawToCString, but will check if the global Lua function tostring()\r\n// has been replaced with a custom function, and call that instead if so\r\nstatic const char* toCString(lua_State* L, int idx)\r\n{\r\n\tint a = idx>0 ? idx : 1;\r\n\tint n = idx>0 ? idx : lua_gettop(L);\r\n\tlua_getglobal(L, \"tostring\");\r\n\tlua_CFunction cf = lua_tocfunction(L,-1);\r\n\tif(cf == tostring) // optimization: if using our own C tostring function, we can bypass the call through Lua and all the string object allocation that would entail\r\n\t{\r\n\t\tlua_pop(L,1);\r\n\t\treturn rawToCString(L, idx);\r\n\t}\r\n\telse // if the user overrided the tostring function, we have to actually call it and store the temporarily allocated string it returns\r\n\t{\r\n\t\tlua_pushstring(L, \"\");\r\n\t\tfor (int i=a; i<=n; i++) {\r\n\t\t\tlua_pushvalue(L, -2);  // function to be called\r\n\t\t\tlua_pushvalue(L, i);   // value to print\r\n\t\t\tlua_call(L, 1, 1);\r\n\t\t\tif(lua_tostring(L, -1) == NULL)\r\n\t\t\t\tluaL_error(L, LUA_QL(\"tostring\") \" must return a string to \" LUA_QL(\"print\"));\r\n\t\t\tlua_pushstring(L, (i<n) ? \" \" : \"\\r\\n\");\r\n\t\t\tlua_concat(L, 3);\r\n\t\t}\r\n\t\tconst char* str = lua_tostring(L, -1);\r\n\t\tstrncpy(s_tempStr, str, s_tempStrMaxLen);\r\n\t\ts_tempStr[s_tempStrMaxLen-1] = 0;\r\n\t\tlua_pop(L, 2);\r\n\t\treturn s_tempStr;\r\n\t}\r\n}\r\n\r\n// replacement for luaB_print() that goes to the appropriate textbox instead of stdout\r\nDEFINE_LUA_FUNCTION(print, \"...\")\r\n{\r\n\tconst char* str = toCString(L);\r\n\r\n\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\r\n\tif(info.print)\r\n\t\tinfo.print(uid, str);\r\n\telse\r\n\t\tputs(str);\r\n\r\n\tworry(L, 100);\r\n\treturn 0;\r\n}\r\n\r\n\r\nDEFINE_LUA_FUNCTION(emu_message, \"str\")\r\n{\r\n\tconst char* str = toCString(L);\r\n\tdriver->USR_InfoMessage(str);\r\n\treturn 0;\r\n}\r\n\r\n// provides an easy way to copy a table from Lua\r\n// (simple assignment only makes an alias, but sometimes an independent table is desired)\r\n// currently this function only performs a shallow copy,\r\n// but I think it should be changed to do a deep copy (possibly of configurable depth?)\r\n// that maintains the internal table reference structure\r\nDEFINE_LUA_FUNCTION(copytable, \"origtable\")\r\n{\r\n\tint origIndex = 1; // we only care about the first argument\r\n\tint origType = lua_type(L, origIndex);\r\n\tif(origType == LUA_TNIL)\r\n\t{\r\n\t\tlua_pushnil(L);\r\n\t\treturn 1;\r\n\t}\r\n\tif(origType != LUA_TTABLE)\r\n\t{\r\n\t\tluaL_typerror(L, 1, lua_typename(L, LUA_TTABLE));\r\n\t\tlua_pushnil(L);\r\n\t\treturn 1;\r\n\t}\r\n\t\r\n\tlua_createtable(L, lua_objlen(L,1), 0);\r\n\tint copyIndex = lua_gettop(L);\r\n\r\n\tlua_pushnil(L); // first key\r\n\tint keyIndex = lua_gettop(L);\r\n\tint valueIndex = keyIndex + 1;\r\n\r\n\twhile(lua_next(L, origIndex))\r\n\t{\r\n\t\tlua_pushvalue(L, keyIndex);\r\n\t\tlua_pushvalue(L, valueIndex);\r\n\t\tlua_rawset(L, copyIndex); // copytable[key] = value\r\n\t\tlua_pop(L, 1);\r\n\t}\r\n\r\n\t// copy the reference to the metatable as well, if any\r\n\tif(lua_getmetatable(L, origIndex))\r\n\t\tlua_setmetatable(L, copyIndex);\r\n\r\n\treturn 1; // return the new table\r\n}\r\n\r\n// because print traditionally shows the address of tables,\r\n// and the print function I provide instead shows the contents of tables,\r\n// I also provide this function\r\n// (otherwise there would be no way to see a table's address, AFAICT)\r\nDEFINE_LUA_FUNCTION(addressof, \"table_or_function\")\r\n{\r\n\tconst void* ptr = lua_topointer(L,-1);\r\n\tlua_pushinteger(L, (lua_Integer)ptr);\r\n\treturn 1;\r\n}\r\n\r\n// the following bit operations are ported from LuaBitOp 1.0.1,\r\n// because it can handle the sign bit (bit 31) correctly.\r\n\r\n/*\r\n** Lua BitOp -- a bit operations library for Lua 5.1.\r\n** http://bitop.luajit.org/\r\n**\r\n** Copyright (C) 2008-2009 Mike Pall. All rights reserved.\r\n**\r\n** Permission is hereby granted, free of charge, to any person obtaining\r\n** a copy of this software and associated documentation files (the\r\n** \"Software\"), to deal in the Software without restriction, including\r\n** without limitation the rights to use, copy, modify, merge, publish,\r\n** distribute, sublicense, and/or sell copies of the Software, and to\r\n** permit persons to whom the Software is furnished to do so, subject to\r\n** the following conditions:\r\n**\r\n** The above copyright notice and this permission notice shall be\r\n** included in all copies or substantial portions of the Software.\r\n**\r\n** THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n**\r\n** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]\r\n*/\r\n\r\n#ifdef _MSC_VER\r\n/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */\r\ntypedef __int32 int32_t;\r\ntypedef unsigned __int32 uint32_t;\r\ntypedef unsigned __int64 uint64_t;\r\n#else\r\n#include <stdint.h>\r\n#endif\r\n\r\ntypedef int32_t SBits;\r\ntypedef uint32_t UBits;\r\n\r\ntypedef union {\r\n  lua_Number n;\r\n#ifdef LUA_NUMBER_DOUBLE\r\n  uint64_t b;\r\n#else\r\n  UBits b;\r\n#endif\r\n} BitNum;\r\n\r\n/* Convert argument to bit type. */\r\nstatic UBits barg(lua_State *L, int idx)\r\n{\r\n  BitNum bn;\r\n  UBits b;\r\n  bn.n = lua_tonumber(L, idx);\r\n#if defined(LUA_NUMBER_DOUBLE)\r\n  bn.n += 6755399441055744.0;  /* 2^52+2^51 */\r\n#ifdef SWAPPED_DOUBLE\r\n  b = (UBits)(bn.b >> 32);\r\n#else\r\n  b = (UBits)bn.b;\r\n#endif\r\n#elif defined(LUA_NUMBER_INT) || defined(LUA_NUMBER_LONG) || \\\r\n      defined(LUA_NUMBER_LONGLONG) || defined(LUA_NUMBER_LONG_LONG) || \\\r\n      defined(LUA_NUMBER_LLONG)\r\n  if (sizeof(UBits) == sizeof(lua_Number))\r\n    b = bn.b;\r\n  else\r\n    b = (UBits)(SBits)bn.n;\r\n#elif defined(LUA_NUMBER_FLOAT)\r\n#error \"A 'float' lua_Number type is incompatible with this library\"\r\n#else\r\n#error \"Unknown number type, check LUA_NUMBER_* in luaconf.h\"\r\n#endif\r\n  if (b == 0 && !lua_isnumber(L, idx))\r\n    luaL_typerror(L, idx, \"number\");\r\n  return b;\r\n}\r\n\r\n/* Return bit type. */\r\n#define BRET(b)  lua_pushnumber(L, (lua_Number)(SBits)(b)); return 1;\r\n\r\nDEFINE_LUA_FUNCTION(bit_tobit, \"x\") { BRET(barg(L, 1)) }\r\nDEFINE_LUA_FUNCTION(bit_bnot, \"x\") { BRET(~barg(L, 1)) }\r\n\r\n#define BIT_OP(func, opr) \\\r\n  DEFINE_LUA_FUNCTION(func, \"x1 [,x2...]\") { int i; UBits b = barg(L, 1); \\\r\n    for (i = lua_gettop(L); i > 1; i--) b opr barg(L, i); BRET(b) }\r\nBIT_OP(bit_band, &=)\r\nBIT_OP(bit_bor, |=)\r\nBIT_OP(bit_bxor, ^=)\r\n\r\n#define bshl(b, n)  (b << n)\r\n#define bshr(b, n)  (b >> n)\r\n#define bsar(b, n)  ((SBits)b >> n)\r\n#define brol(b, n)  ((b << n) | (b >> (32-n)))\r\n#define bror(b, n)  ((b << (32-n)) | (b >> n))\r\n#define BIT_SH(func, fn) \\\r\n  DEFINE_LUA_FUNCTION(func, \"x, n\") { \\\r\n    UBits b = barg(L, 1); UBits n = barg(L, 2) & 31; BRET(fn(b, n)) }\r\nBIT_SH(bit_lshift, bshl)\r\nBIT_SH(bit_rshift, bshr)\r\nBIT_SH(bit_arshift, bsar)\r\nBIT_SH(bit_rol, brol)\r\nBIT_SH(bit_ror, bror)\r\n\r\nDEFINE_LUA_FUNCTION(bit_bswap, \"x\")\r\n{\r\n  UBits b = barg(L, 1);\r\n  b = (b >> 24) | ((b >> 8) & 0xff00) | ((b & 0xff00) << 8) | (b << 24);\r\n  BRET(b)\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(bit_tohex, \"x [,n]\")\r\n{\r\n  UBits b = barg(L, 1);\r\n  SBits n = lua_isnone(L, 2) ? 8 : (SBits)barg(L, 2);\r\n  const char *hexdigits = \"0123456789abcdef\";\r\n  char buf[8];\r\n  int i;\r\n  if (n < 0) { n = -n; hexdigits = \"0123456789ABCDEF\"; }\r\n  if (n > 8) n = 8;\r\n  for (i = (int)n; --i >= 0; ) { buf[i] = hexdigits[b & 15]; b >>= 4; }\r\n  lua_pushlstring(L, buf, (size_t)n);\r\n  return 1;\r\n}\r\n\r\nstatic const struct luaL_Reg bit_funcs[] = {\r\n  { \"tobit\",\tbit_tobit },\r\n  { \"bnot\",\tbit_bnot },\r\n  { \"band\",\tbit_band },\r\n  { \"bor\",\tbit_bor },\r\n  { \"bxor\",\tbit_bxor },\r\n  { \"lshift\",\tbit_lshift },\r\n  { \"rshift\",\tbit_rshift },\r\n  { \"arshift\",\tbit_arshift },\r\n  { \"rol\",\tbit_rol },\r\n  { \"ror\",\tbit_ror },\r\n  { \"bswap\",\tbit_bswap },\r\n  { \"tohex\",\tbit_tohex },\r\n  { NULL, NULL }\r\n};\r\n\r\n/* Signed right-shifts are implementation-defined per C89/C99.\r\n** But the de facto standard are arithmetic right-shifts on two's\r\n** complement CPUs. This behaviour is required here, so test for it.\r\n*/\r\n#define BAD_SAR\t\t(bsar(-8, 2) != (SBits)-2)\r\n\r\nbool luabitop_validate(lua_State *L) // originally named as luaopen_bit\r\n{\r\n  UBits b;\r\n  lua_pushnumber(L, (lua_Number)1437217655L);\r\n  b = barg(L, -1);\r\n  if (b != (UBits)1437217655L || BAD_SAR) {  /* Perform a simple self-test. */\r\n    const char *msg = \"compiled with incompatible luaconf.h\";\r\n#ifdef LUA_NUMBER_DOUBLE\r\n#if defined(_WIN32) && !defined(WXPORT)\r\n    if (b == (UBits)1610612736L)\r\n      msg = \"use D3DCREATE_FPU_PRESERVE with DirectX\";\r\n#endif\r\n    if (b == (UBits)1127743488L)\r\n      msg = \"not compiled with SWAPPED_DOUBLE\";\r\n#endif\r\n    if (BAD_SAR)\r\n      msg = \"arithmetic right-shift broken\";\r\n    luaL_error(L, \"bit library self-test failed (%s)\", msg);\r\n    return false;\r\n  }\r\n  return true;\r\n}\r\n\r\n// LuaBitOp ends here\r\n\r\nDEFINE_LUA_FUNCTION(bitshift, \"num,shift\")\r\n{\r\n\tint shift = luaL_checkinteger(L,2);\r\n\tif (shift < 0) {\r\n\t\tlua_pushinteger(L, -shift);\r\n\t\tlua_replace(L, 2);\r\n\t\treturn bit_lshift(L);\r\n\t}\r\n\telse\r\n\t\treturn bit_rshift(L);\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(bitbit, \"whichbit\")\r\n{\r\n\tint rv = 0;\r\n\tint numArgs = lua_gettop(L);\r\n\tfor(int i = 1; i <= numArgs; i++) {\r\n\t\tint where = luaL_checkinteger(L,i);\r\n\t\tif (where >= 0 && where < 32)\r\n\t\t\trv |= (1 << where);\r\n\t}\r\n\tlua_settop(L,0);\r\n\tBRET(rv);\r\n}\r\n\r\nint emu_wait(lua_State* L);\r\nint dontworry(LuaContextInfo& info);\r\n\r\nvoid indicateBusy(lua_State* L, bool busy)\r\n{\r\n\t// disabled because there have been complaints about this message being useless spam.\r\n\t// the script window's title changing should be sufficient, I guess.\r\n/*\tif(busy)\r\n\t{\r\n\t\tconst char* fmt = \"script became busy (frozen?)\";\r\n\t\tva_list argp;\r\n\t\tva_start(argp, fmt);\r\n\t\tluaL_where(L, 0);\r\n\t\tlua_pushvfstring(L, fmt, argp);\r\n\t\tva_end(argp);\r\n\t\tlua_concat(L, 2);\r\n\t\tLuaContextInfo& info = GetCurrentInfo();\r\n\t\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\t\tif(info.print)\r\n\t\t{\r\n\t\t\tinfo.print(uid, lua_tostring(L,-1));\r\n\t\t\tinfo.print(uid, \"\\r\\n\");\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfprintf(stderr, \"%s\\n\", lua_tostring(L,-1));\r\n\t\t}\r\n\t\tlua_pop(L, 1);\r\n\t}\r\n*/\r\n#if defined(_WIN32) && !defined(WXPORT)\r\n\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\tHWND hDlg = (HWND)uid;\r\n\tchar str [1024];\r\n\tGetWindowText(hDlg, str, 1000);\r\n\tchar* extra = strchr(str, '<');\r\n\tif(busy)\r\n\t{\r\n\t\tif(!extra)\r\n\t\t\textra = str + strlen(str), *extra++ = ' ';\r\n\t\tstrcpy(extra, \"<BUSY>\");\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif(extra)\r\n\t\t\textra[-1] = 0;\r\n\t}\r\n\tSetWindowText(hDlg, str);\r\n#endif\r\n}\r\n\r\n\r\n#define HOOKCOUNT 4096\r\n#define MAX_WORRY_COUNT 6000\r\nvoid LuaRescueHook(lua_State* L, lua_Debug *dbg)\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\r\n\tinfo.worryCount++;\r\n\r\n\tif(info.stopWorrying && !info.panic)\r\n\t{\r\n\t\tif(info.worryCount > (MAX_WORRY_COUNT >> 2))\r\n\t\t{\r\n\t\t\t// the user already said they're OK with the script being frozen,\r\n\t\t\t// but we don't trust their judgement completely,\r\n\t\t\t// so periodically update the main loop so they have a chance to manually stop it\r\n\t\t\tinfo.worryCount = 0;\r\n\t\t\temu_wait(L);\r\n\t\t\tinfo.stopWorrying = true;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif(info.worryCount > MAX_WORRY_COUNT || info.panic)\r\n\t{\r\n\t\tinfo.worryCount = 0;\r\n\t\tinfo.stopWorrying = false;\r\n\r\n\t\tbool stoprunning = true;\r\n\t\tbool stopworrying = true;\r\n\t\tif(!info.panic)\r\n\t\t{\r\n\t\t\tSPU_ClearOutputBuffer();\r\n#if defined(ASK_USER_ON_FREEZE) && defined(_WIN32) && !defined(WXPORT)\r\n\t\t\tDialogsOpen++;\r\n\t\t\tint answer = MessageBox(HWnd, \"A Lua script has been running for quite a while. Maybe it is in an infinite loop.\\n\\nWould you like to stop the script?\\n\\n(Yes to stop it now,\\n No to keep running and not ask again,\\n Cancel to keep running but ask again later)\", \"Lua Alert\", MB_YESNOCANCEL | MB_DEFBUTTON3 | MB_ICONASTERISK);\r\n\t\t\tDialogsOpen--;\r\n\t\t\tif(answer == IDNO)\r\n\t\t\t\tstoprunning = false;\r\n\t\t\tif(answer == IDCANCEL)\r\n\t\t\t\tstopworrying = false;\r\n#else\r\n\t\t\tstoprunning = false;\r\n#endif\r\n\t\t}\r\n\r\n\t\tif(!stoprunning && stopworrying)\r\n\t\t{\r\n\t\t\tinfo.stopWorrying = true; // don't remove the hook because we need it still running for RequestAbortLuaScript to work\r\n\t\t\tindicateBusy(info.L, true);\r\n\t\t}\r\n\r\n\t\tif(stoprunning)\r\n\t\t{\r\n\t\t\t//lua_sethook(L, NULL, 0, 0);\r\n\t\t\tassert(L->errfunc || L->errorJmp);\r\n\t\t\tluaL_error(L, info.panic ? info.panicMessage : \"terminated by user\");\r\n\t\t}\r\n\r\n\t\tinfo.panic = false;\r\n\t}\r\n}\r\n\r\nvoid printfToOutput(const char* fmt, ...)\r\n{\r\n\tva_list list;\r\n\tva_start(list, fmt);\r\n\tint len = vscprintf(fmt, list);\r\n\tchar* str = new char[len+1];\r\n\tvsprintf(str, fmt, list);\r\n\tva_end(list);\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tif(info.print)\r\n\t{\r\n\t\tlua_State* L = info.L;\r\n\t\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\t\tinfo.print(uid, str);\r\n\t\tinfo.print(uid, \"\\r\\n\");\r\n\t\tworry(L,300);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfprintf(stdout, \"%s\\n\", str);\r\n\t}\r\n\tdelete[] str;\r\n}\r\n\r\nbool FailVerifyAtFrameBoundary(lua_State* L, const char* funcName, int unstartedSeverity=2, int inframeSeverity=2)\r\n{\r\n\tif (!driver->EMU_HasEmulationStarted())\r\n\t{\r\n\t\tstatic const char* msg = \"cannot call %s() when emulation has not started.\";\r\n\t\tswitch(unstartedSeverity)\r\n\t\t{\r\n\t\tcase 0: break;\r\n\t\tcase 1: printfToOutput(msg, funcName); break;\r\n\t\tdefault: case 2: luaL_error(L, msg, funcName); break;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\tif(!driver->EMU_IsAtFrameBoundary())\r\n\t{\r\n\t\tstatic const char* msg = \"cannot call %s() inside an emulation frame.\";\r\n\t\tswitch(inframeSeverity)\r\n\t\t{\r\n\t\tcase 0: break;\r\n\t\tcase 1: printfToOutput(msg, funcName); break;\r\n\t\tdefault: case 2: luaL_error(L, msg, funcName); break;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n\r\n// wrapper for EMU_StepMainLoop that provides a default implementation if ESTEP_NOT_IMPLEMENTED is returned.\r\n// which only works if called from a function whose return value will get returned to Lua directly.\r\n// TODO: actually implement the default case by making the main thread we use into a coroutine and resuming it periodically\r\nstatic bool stepped_emulation = false; // <-- this is the result of running the macro\r\n#define StepEmulationOnce(allowSleep, allowPause, frameSkip, disableUser, disableCore) \\\r\n\tswitch(driver->EMU_StepMainLoop(allowSleep, allowPause, frameSkip, disableUser, disableCore)) \\\r\n\t{\tdefault: \\\r\n\t\tcase BaseDriver::ESTEP_NOT_IMPLEMENTED: /*return lua_yield(L, 0);*/ luaL_error(L, \"Lua frame advance functions are not yet implemented for this platform, and neither is the fallback implementation.\"); break;/*TODO*/ \\\r\n\t\tcase BaseDriver::ESTEP_CALL_AGAIN: stepped_emulation = !driver->EMU_HasEmulationStarted(); break; \\\r\n\t\tcase BaseDriver::ESTEP_DONE: stepped_emulation = true; break; \\\r\n\t}\r\n\r\n// same as StepEmulationOnce, except calls EMU_StepMainLoop multiple times if it returns ESTEP_CALL_AGAIN\r\n#define StepEmulation(allowSleep, allowPause, frameSkip, disableUser, disableCore) \\\r\n\tdo { \\\r\n\t\tStepEmulationOnce(allowSleep, allowPause, frameSkip, disableUser, disableCore); \\\r\n\t\tif(stepped_emulation || (info).panic) break; \\\r\n\t} while(true)\r\n\r\n\r\n// note: caller must return the value this returns to Lua (at least if nonzero)\r\nint StepEmulationAtSpeed(lua_State* L, SpeedMode speedMode, bool allowPause)\r\n{\r\n\tint postponeTime;\r\n\tbool drawNextFrame;\r\n\tint worryIntensity;\r\n\tbool allowSleep;\r\n\tint frameSkip;\r\n\tbool disableUserFeedback;\r\n\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tswitch(speedMode)\r\n\t{\r\n\t\tdefault:\r\n\t\tcase SPEEDMODE_NORMAL:\r\n\t\t\tpostponeTime = 0, drawNextFrame = true, worryIntensity = 300;\r\n\t\t\tallowSleep = true;\r\n\t\t\tframeSkip = -1;\r\n\t\t\tdisableUserFeedback = false;\r\n\t\t\tbreak;\r\n\t\tcase SPEEDMODE_NOTHROTTLE:\r\n\t\t\tpostponeTime = 250, drawNextFrame = true, worryIntensity = 200;\r\n\t\t\tallowSleep = driver->EMU_IsEmulationPaused();\r\n\t\t\tframeSkip = driver->EMU_IsFastForwarding() ? -1 : 0;\r\n\t\t\tdisableUserFeedback = false;\r\n\t\t\tbreak;\r\n\t\tcase SPEEDMODE_TURBO:\r\n\t\t\tpostponeTime = 500, drawNextFrame = true, worryIntensity = 150;\r\n\t\t\tallowSleep = driver->EMU_IsEmulationPaused();\r\n\t\t\tframeSkip = 16;\r\n\t\t\tdisableUserFeedback = false;\r\n\t\t\tbreak;\r\n\t\tcase SPEEDMODE_MAXIMUM:\r\n\t\t\tpostponeTime = 1000, drawNextFrame = false, worryIntensity = 100;\r\n\t\t\tallowSleep = driver->EMU_IsEmulationPaused();\r\n\t\t\tframeSkip = 65535;\r\n\t\t\tdisableUserFeedback = true;\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tdriver->USR_SetDisplayPostpone(postponeTime, drawNextFrame);\r\n\tallowPause ? dontworry(info) : worry(L, worryIntensity);\r\n\r\n\tif(!allowPause && driver->EMU_IsEmulationPaused())\r\n\t\tdriver->EMU_PauseEmulation(false);\r\n\r\n\tStepEmulation(allowSleep, allowPause, frameSkip, disableUserFeedback, false);\r\n\treturn 0;\r\n}\r\n\r\n// acts similar to normal emulation update\r\nDEFINE_LUA_FUNCTION(emu_emulateframe, \"\")\r\n{\r\n\tif(FailVerifyAtFrameBoundary(L, \"emu.emulateframe\", 0,1))\r\n\t\treturn 0;\r\n\r\n\treturn StepEmulationAtSpeed(L, SPEEDMODE_NORMAL, false);\r\n}\r\n\r\n// acts as a fast-forward emulation update that still renders every frame\r\nDEFINE_LUA_FUNCTION(emu_emulateframefastnoskipping, \"\")\r\n{\r\n\tif(FailVerifyAtFrameBoundary(L, \"emu.emulateframefastnoskipping\", 0,1))\r\n\t\treturn 0;\r\n\r\n\treturn StepEmulationAtSpeed(L, SPEEDMODE_NOTHROTTLE, false);\r\n}\r\n\r\n// acts as a fast-forward emulation update\r\nDEFINE_LUA_FUNCTION(emu_emulateframefast, \"\")\r\n{\r\n\tif(FailVerifyAtFrameBoundary(L, \"emu.emulateframefast\", 0,1))\r\n\t\treturn 0;\r\n\r\n\treturn StepEmulationAtSpeed(L, SPEEDMODE_TURBO, false);\r\n}\r\n\r\n// acts as an extremely-fast-forward emulation update\r\n// that also doesn't render any graphics or generate any sounds\r\nDEFINE_LUA_FUNCTION(emu_emulateframeinvisible, \"\")\r\n{\r\n\tif(FailVerifyAtFrameBoundary(L, \"emu.emulateframeinvisible\", 0,1))\r\n\t\treturn 0;\r\n\r\n\treturn StepEmulationAtSpeed(L, SPEEDMODE_MAXIMUM, false);\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_speedmode, \"mode\")\r\n{\r\n\tSpeedMode newSpeedMode = SPEEDMODE_NORMAL;\r\n\tif(lua_isnumber(L,1))\r\n\t\tnewSpeedMode = (SpeedMode)luaL_checkinteger(L,1);\r\n\telse\r\n\t{\r\n\t\tconst char* str = luaL_checkstring(L,1);\r\n\t\tif(!stricmp(str, \"normal\"))\r\n\t\t\tnewSpeedMode = SPEEDMODE_NORMAL;\r\n\t\telse if(!stricmp(str, \"nothrottle\"))\r\n\t\t\tnewSpeedMode = SPEEDMODE_NOTHROTTLE;\r\n\t\telse if(!stricmp(str, \"turbo\"))\r\n\t\t\tnewSpeedMode = SPEEDMODE_TURBO;\r\n\t\telse if(!stricmp(str, \"maximum\"))\r\n\t\t\tnewSpeedMode = SPEEDMODE_MAXIMUM;\r\n\t}\r\n\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tinfo.speedMode = newSpeedMode;\r\n\tRefreshScriptSpeedStatus();\r\n\treturn 0;\r\n}\r\n\r\n\r\n// tells the emulation to wait while the script is doing calculations\r\n// can call this periodically instead of emu.frameadvance\r\n// note that the user can use hotkeys at this time\r\n// (e.g. a savestate could possibly get loaded before emu.wait() returns)\r\nDEFINE_LUA_FUNCTION(emu_wait, \"\")\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tStepEmulationOnce(false, false, -1, true, true);\r\n\tdontworry(info);\r\n\treturn 0;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nDEFINE_LUA_FUNCTION(emu_frameadvance, \"\")\r\n{\r\n\tif(FailVerifyAtFrameBoundary(L, \"emu.frameadvance\", 0,1))\r\n\t\treturn emu_wait(L);\r\n\r\n\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\r\n\tif(!info.ranFrameAdvance)\r\n\t{\r\n\t\t// otherwise we'll never see the first frame of GUI drawing\r\n\t\tif(info.speedMode != SPEEDMODE_MAXIMUM)\r\n\t\t\tdriver->USR_RefreshScreen();\r\n\t\tinfo.ranFrameAdvance = true;\r\n\t}\r\n\r\n\treturn StepEmulationAtSpeed(L, info.speedMode, true);\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_pause, \"\")\r\n{\r\n\tdriver->EMU_PauseEmulation(true);\r\n\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tStepEmulation(true, true, 0, true, true);\r\n\r\n\t// allow the user to not have to manually unpause\r\n\t// after restarting a script that used emu.pause()\r\n\tif(info.panic)\r\n\t\tdriver->EMU_PauseEmulation(false);\r\n\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_unpause, \"\")\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tdriver->EMU_PauseEmulation(false);\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_redraw, \"\")\r\n{\r\n\tdriver->USR_RefreshScreen();\r\n\tworry(L,250);\r\n\treturn 0;\r\n}\r\n\r\n\r\n\r\nDEFINE_LUA_FUNCTION(memory_readbyte, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tunsigned char value = (unsigned char)(_MMU_read08<ARMCPU_ARM9>(address) & 0xFF);\r\n\tlua_settop(L,0);\r\n\tlua_pushinteger(L, value);\r\n\treturn 1; // we return the number of return values\r\n}\r\nDEFINE_LUA_FUNCTION(memory_readbytesigned, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tsigned char value = (signed char)(_MMU_read08<ARMCPU_ARM9>(address) & 0xFF);\r\n\tlua_settop(L,0);\r\n\tlua_pushinteger(L, value);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(vram_readword, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tu16 value = T1ReadWord(MMU.ARM9_LCD,address);\r\n\tlua_settop(L,0);\r\n\tlua_pushinteger(L, value);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(memory_readword, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tunsigned short value = (unsigned short)(_MMU_read16<ARMCPU_ARM9>(address) & 0xFFFF);\r\n\tlua_settop(L,0);\r\n\tlua_pushinteger(L, value);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(memory_readwordsigned, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tsigned short value = (signed short)(_MMU_read16<ARMCPU_ARM9>(address) & 0xFFFF);\r\n\tlua_settop(L,0);\r\n\tlua_pushinteger(L, value);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(memory_readdword, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tunsigned long value = (unsigned long)(_MMU_read32<ARMCPU_ARM9>(address));\r\n\tlua_settop(L,0);\r\n\tlua_pushnumber(L, value); // can't use pushinteger in this case (out of range)\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(memory_readdwordsigned, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tsigned long value = (signed long)(_MMU_read32<ARMCPU_ARM9>(address));\r\n\tlua_settop(L,0);\r\n\tlua_pushinteger(L, value);\r\n\treturn 1;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(memory_writebyte, \"address,value\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tunsigned char value = (unsigned char)(luaL_checkinteger(L,2) & 0xFF);\r\n\t_MMU_write08<ARMCPU_ARM9>(address, value);\r\n\treturn 0;\r\n}\r\nDEFINE_LUA_FUNCTION(memory_writeword, \"address,value\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tunsigned short value = (unsigned short)(luaL_checkinteger(L,2) & 0xFFFF);\r\n\t_MMU_write16<ARMCPU_ARM9>(address, value);\r\n\treturn 0;\r\n}\r\nDEFINE_LUA_FUNCTION(vram_writeword, \"address,value\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tu16 value = (u16)(luaL_checkinteger(L,2) & 0xFFFF);\r\n\tT1WriteWord(MMU.ARM9_LCD,address,value);\r\n\treturn 0;\r\n}\r\nDEFINE_LUA_FUNCTION(memory_writedword, \"address,value\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tunsigned long value = (unsigned long)(luaL_checkinteger(L,2));\r\n\t_MMU_write32<ARMCPU_ARM9>(address, value);\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(memory_readbyterange, \"address,length\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tint length = luaL_checkinteger(L,2);\r\n\r\n\tif(length < 0)\r\n\t{\r\n\t\taddress += length;\r\n\t\tlength = -length;\r\n\t}\r\n\r\n\t// push the array\r\n\tlua_createtable(L, abs(length), 0);\r\n\r\n\t// put all the values into the (1-based) array\r\n\tfor(int a = address, n = 1; n <= length; a++, n++)\r\n\t{\r\n\t\tif(IsHardwareAddressValid(a))\r\n\t\t{\r\n\t\t\tunsigned char value = (unsigned char)(_MMU_read08<ARMCPU_ARM9>(a) & 0xFF);\r\n\t\t\tlua_pushinteger(L, value);\r\n\t\t\tlua_rawseti(L, -2, n);\r\n\t\t}\r\n\t\t// else leave the value nil\r\n\t}\r\n\r\n\treturn 1;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(memory_isvalid, \"address\")\r\n{\r\n\tint address = luaL_checkinteger(L,1);\r\n\tlua_settop(L,0);\r\n\tlua_pushboolean(L, IsHardwareAddressValid(address));\r\n\treturn 1;\r\n}\r\n\r\nstruct registerPointerMap\r\n{\r\n\tconst char* registerName;\r\n\tunsigned int* pointer;\r\n\tint dataSize;\r\n};\r\n\r\n#define RPM_ENTRY(name,var) {name, (unsigned int*)&var, sizeof(var)},\r\n\r\nregisterPointerMap arm9PointerMap [] = {\r\n\tRPM_ENTRY(\"r0\", NDS_ARM9.R[0])\r\n\tRPM_ENTRY(\"r1\", NDS_ARM9.R[1])\r\n\tRPM_ENTRY(\"r2\", NDS_ARM9.R[2])\r\n\tRPM_ENTRY(\"r3\", NDS_ARM9.R[3])\r\n\tRPM_ENTRY(\"r4\", NDS_ARM9.R[4])\r\n\tRPM_ENTRY(\"r5\", NDS_ARM9.R[5])\r\n\tRPM_ENTRY(\"r6\", NDS_ARM9.R[6])\r\n\tRPM_ENTRY(\"r7\", NDS_ARM9.R[7])\r\n\tRPM_ENTRY(\"r8\", NDS_ARM9.R[8])\r\n\tRPM_ENTRY(\"r9\", NDS_ARM9.R[9])\r\n\tRPM_ENTRY(\"r10\", NDS_ARM9.R[10])\r\n\tRPM_ENTRY(\"r11\", NDS_ARM9.R[11])\r\n\tRPM_ENTRY(\"r12\", NDS_ARM9.R[12])\r\n\tRPM_ENTRY(\"r13\", NDS_ARM9.R[13])\r\n\tRPM_ENTRY(\"r14\", NDS_ARM9.R[14])\r\n\tRPM_ENTRY(\"r15\", NDS_ARM9.R[15])\r\n\tRPM_ENTRY(\"cpsr\", NDS_ARM9.CPSR.val)\r\n\tRPM_ENTRY(\"spsr\", NDS_ARM9.SPSR.val)\r\n\t{}\r\n};\r\nregisterPointerMap arm7PointerMap [] = {\r\n\tRPM_ENTRY(\"r0\", NDS_ARM7.R[0])\r\n\tRPM_ENTRY(\"r1\", NDS_ARM7.R[1])\r\n\tRPM_ENTRY(\"r2\", NDS_ARM7.R[2])\r\n\tRPM_ENTRY(\"r3\", NDS_ARM7.R[3])\r\n\tRPM_ENTRY(\"r4\", NDS_ARM7.R[4])\r\n\tRPM_ENTRY(\"r5\", NDS_ARM7.R[5])\r\n\tRPM_ENTRY(\"r6\", NDS_ARM7.R[6])\r\n\tRPM_ENTRY(\"r7\", NDS_ARM7.R[7])\r\n\tRPM_ENTRY(\"r8\", NDS_ARM7.R[8])\r\n\tRPM_ENTRY(\"r9\", NDS_ARM7.R[9])\r\n\tRPM_ENTRY(\"r10\", NDS_ARM7.R[10])\r\n\tRPM_ENTRY(\"r11\", NDS_ARM7.R[11])\r\n\tRPM_ENTRY(\"r12\", NDS_ARM7.R[12])\r\n\tRPM_ENTRY(\"r13\", NDS_ARM7.R[13])\r\n\tRPM_ENTRY(\"r14\", NDS_ARM7.R[14])\r\n\tRPM_ENTRY(\"r15\", NDS_ARM7.R[15])\r\n\tRPM_ENTRY(\"cpsr\", NDS_ARM7.CPSR.val)\r\n\tRPM_ENTRY(\"spsr\", NDS_ARM7.SPSR.val)\r\n\t{}\r\n};\r\n\r\nstruct cpuToRegisterMap\r\n{\r\n\tconst char* cpuName;\r\n\tregisterPointerMap* rpmap;\r\n}\r\ncpuToRegisterMaps [] =\r\n{\r\n\t{\"arm9.\", arm9PointerMap},\r\n\t{\"main.\", arm9PointerMap},\r\n\t{\"arm7.\", arm7PointerMap},\r\n\t{\"sub.\",  arm7PointerMap},\r\n\t{\"\", arm9PointerMap},\r\n};\r\n\r\n\r\nDEFINE_LUA_FUNCTION(memory_getregister, \"cpu_dot_registername_string\")\r\n{\r\n\tconst char* qualifiedRegisterName = luaL_checkstring(L,1);\r\n\tlua_settop(L,0);\r\n\tfor(int cpu = 0; cpu < sizeof(cpuToRegisterMaps)/sizeof(*cpuToRegisterMaps); cpu++)\r\n\t{\r\n\t\tcpuToRegisterMap ctrm = cpuToRegisterMaps[cpu];\r\n\t\tint cpuNameLen = strlen(ctrm.cpuName);\r\n\t\tif(!strnicmp(qualifiedRegisterName, ctrm.cpuName, cpuNameLen))\r\n\t\t{\r\n\t\t\tqualifiedRegisterName += cpuNameLen;\r\n\t\t\tfor(int reg = 0; ctrm.rpmap[reg].dataSize; reg++)\r\n\t\t\t{\r\n\t\t\t\tregisterPointerMap rpm = ctrm.rpmap[reg];\r\n\t\t\t\tif(!stricmp(qualifiedRegisterName, rpm.registerName))\r\n\t\t\t\t{\r\n\t\t\t\t\tswitch(rpm.dataSize)\r\n\t\t\t\t\t{ default:\r\n\t\t\t\t\tcase 1: lua_pushinteger(L, *(unsigned char*)rpm.pointer); break;\r\n\t\t\t\t\tcase 2: lua_pushinteger(L, *(unsigned short*)rpm.pointer); break;\r\n\t\t\t\t\tcase 4: lua_pushinteger(L, *(unsigned long*)rpm.pointer); break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlua_pushnil(L);\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n\tlua_pushnil(L);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(memory_setregister, \"cpu_dot_registername_string,value\")\r\n{\r\n\tconst char* qualifiedRegisterName = luaL_checkstring(L,1);\r\n\tunsigned long value = (unsigned long)(luaL_checkinteger(L,2));\r\n\tlua_settop(L,0);\r\n\tfor(int cpu = 0; cpu < sizeof(cpuToRegisterMaps)/sizeof(*cpuToRegisterMaps); cpu++)\r\n\t{\r\n\t\tcpuToRegisterMap ctrm = cpuToRegisterMaps[cpu];\r\n\t\tint cpuNameLen = strlen(ctrm.cpuName);\r\n\t\tif(!strnicmp(qualifiedRegisterName, ctrm.cpuName, cpuNameLen))\r\n\t\t{\r\n\t\t\tqualifiedRegisterName += cpuNameLen;\r\n\t\t\tfor(int reg = 0; ctrm.rpmap[reg].dataSize; reg++)\r\n\t\t\t{\r\n\t\t\t\tregisterPointerMap rpm = ctrm.rpmap[reg];\r\n\t\t\t\tif(!stricmp(qualifiedRegisterName, rpm.registerName))\r\n\t\t\t\t{\r\n\t\t\t\t\tswitch(rpm.dataSize)\r\n\t\t\t\t\t{ default:\r\n\t\t\t\t\tcase 1: *(unsigned char*)rpm.pointer = (unsigned char)(value & 0xFF); break;\r\n\t\t\t\t\tcase 2: *(unsigned short*)rpm.pointer = (unsigned short)(value & 0xFFFF); break;\r\n\t\t\t\t\tcase 4: *(unsigned long*)rpm.pointer = value; break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(state_create, \"[location]\")\r\n{\r\n\tif(lua_isnumber(L,1))\r\n\t{\r\n\t\t// simply return the integer that got passed in\r\n\t\t// (that's as good a savestate object as any for a numbered savestate slot)\r\n\t\tlua_settop(L,1);\r\n\t\treturn 1;\r\n\t}\r\n\r\n\t// allocate a pointer to an in-memory/anonymous savestate\r\n\tEMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)lua_newuserdata(L, sizeof(EMUFILE_MEMORY*));\r\n\t*ppEmuFile = new EMUFILE_MEMORY();\r\n\tluaL_getmetatable(L, \"EMUFILE_MEMORY*\");\r\n\tlua_setmetatable(L, -2);\r\n\r\n\treturn 1;\r\n}\r\n\r\n// savestate.save(location [, option])\r\n// saves the current emulation state to the given location\r\n// you can pass in either a savestate file number (an integer),\r\n// OR you can pass in a savestate object that was returned by savestate.create()\r\n// if option is \"quiet\" then any warning messages will be suppressed\r\n// if option is \"scriptdataonly\" then the state will not actually be saved, but any save callbacks will still get called and their results will be saved (see savestate.registerload()/savestate.registersave())\r\nDEFINE_LUA_FUNCTION(state_save, \"location[,option]\")\r\n{\r\n\t//const char* option = (lua_type(L,2) == LUA_TSTRING) ? lua_tostring(L,2) : NULL;\r\n\t//if(option)\r\n\t//{\r\n\t//\tif(!stricmp(option, \"quiet\")) // I'm not sure if saving can generate warning messages, but we might as well support suppressing them should they turn out to exist\r\n\t//\t\tg_disableStatestateWarnings = true;\r\n\t//\telse if(!stricmp(option, \"scriptdataonly\")) // TODO\r\n\t//\t\tg_onlyCallSavestateCallbacks = true;\r\n\t//}\r\n\t//struct Scope { ~Scope(){ g_disableStatestateWarnings = false; g_onlyCallSavestateCallbacks = false; } } scope; // needs to run even if the following code throws an exception... maybe I should have put this in a \"finally\" block instead, but this project seems to have something against using the \"try\" statement\r\n\r\n\tif(/*!g_onlyCallSavestateCallbacks &&*/ FailVerifyAtFrameBoundary(L, \"savestate.save\", 2,2))\r\n\t\treturn 0;\r\n\r\n\tint type = lua_type(L,1);\r\n\tswitch(type)\r\n\t{\r\n\t\tcase LUA_TNUMBER: // numbered save file\r\n\t\tdefault:\r\n\t\t{\r\n\t\t\tint stateNumber = luaL_checkinteger(L,1);\r\n\t\t\tsavestate_slot(stateNumber);\r\n\t\t}\treturn 0;\r\n\t\tcase LUA_TUSERDATA: // in-memory save slot\r\n\t\t{\r\n\t\t\tEMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, \"EMUFILE_MEMORY*\");\r\n\t\t\t(*ppEmuFile)->fseek(0, SEEK_SET);\r\n\r\n\t\t\tif((*ppEmuFile)->fail())\r\n\t\t\t\tluaL_error(L, \"failed to save, savestate object was dead.\");\r\n\r\n\t\t\tsavestate_save(*ppEmuFile, 0);\r\n\r\n\t\t\tif((*ppEmuFile)->fail())\r\n\t\t\t\tluaL_error(L, \"failed to save savestate!\");\r\n\t\t\tif((*ppEmuFile)->size() == 0)\r\n\t\t\t\tluaL_error(L, \"failed to save, savestate became empty somehow.\");\r\n\t\t}\treturn 0;\r\n\t}\r\n}\r\n\r\n// savestate.load(location [, option])\r\n// loads the current emulation state from the given location\r\n// you can pass in either a savestate file number (an integer),\r\n// OR you can pass in a savestate object that was returned by savestate.create() and has already saved to with savestate.save()\r\n// if option is \"quiet\" then any warning messages will be suppressed\r\n// if option is \"scriptdataonly\" then the state will not actually be loaded, but load callbacks will still get called and supplied with the data saved by save callbacks (see savestate.registerload()/savestate.registersave())\r\nDEFINE_LUA_FUNCTION(state_load, \"location[,option]\")\r\n{\r\n\t//const char* option = (lua_type(L,2) == LUA_TSTRING) ? lua_tostring(L,2) : NULL;\r\n\t//if(option)\r\n\t//{\r\n\t//\tif(!stricmp(option, \"quiet\"))\r\n\t//\t\tg_disableStatestateWarnings = true;\r\n\t//\telse if(!stricmp(option, \"scriptdataonly\")) // TODO\r\n\t//\t\tg_onlyCallSavestateCallbacks = true;\r\n\t//}\r\n\t//struct Scope { ~Scope(){ g_disableStatestateWarnings = false; g_onlyCallSavestateCallbacks = false; } } scope; // needs to run even if the following code throws an exception... maybe I should have put this in a \"finally\" block instead, but this project seems to have something against using the \"try\" statement\r\n\r\n\tif(/*!g_onlyCallSavestateCallbacks &&*/ FailVerifyAtFrameBoundary(L, \"savestate.load\", 2,2))\r\n\t\treturn 0;\r\n\r\n//\tg_disableStatestateWarnings = lua_toboolean(L,2) != 0;\r\n\r\n\tint type = lua_type(L,1);\r\n\tswitch(type)\r\n\t{\r\n\t\tcase LUA_TNUMBER: // numbered save file\r\n\t\tdefault:\r\n\t\t{\r\n\t\t\t//LuaContextInfo& info = GetCurrentInfo();\r\n\t\t\t//if(info.rerecordCountingDisabled)\r\n\t\t\t//\tSkipNextRerecordIncrement = true;\r\n\t\t\tint stateNumber = luaL_checkinteger(L,1);\r\n\t\t\tloadstate_slot(stateNumber);\r\n\t\t}\treturn 0;\r\n\t\tcase LUA_TUSERDATA: // in-memory save slot\r\n\t\t{\r\n\t\t\tEMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, \"EMUFILE_MEMORY*\");\r\n\t\t\t(*ppEmuFile)->fseek(0, SEEK_SET);\r\n\r\n\t\t\tif((*ppEmuFile)->fail())\r\n\t\t\t\tluaL_error(L, \"failed to load, savestate object was dead.\");\r\n\t\t\tif((*ppEmuFile)->size() == 0)\r\n\t\t\t\tluaL_error(L, \"failed to load, savestate wasn't saved first.\");\r\n\r\n\t\t\tsavestate_load(*ppEmuFile);\r\n\r\n\t\t\tif((*ppEmuFile)->fail())\r\n\t\t\t\tluaL_error(L, \"failed to load savestate!\");\r\n\t\t}\treturn 0;\r\n\t}\r\n}\r\n\r\n// savestate.loadscriptdata(location)\r\n// returns the user data associated with the given savestate\r\n// without actually loading the rest of that savestate or calling any callbacks.\r\n// you can pass in either a savestate file number (an integer),\r\n// OR you can pass in a savestate object that was returned by savestate.create()\r\n// but note that currently only non-anonymous savestates can have associated scriptdata\r\n//\r\n// also note that this returns the same values\r\n// that would be passed into a registered load function.\r\n// the main reason this exists also is so you can register a load function that\r\n// chooses whether or not to load the scriptdata instead of always loading it,\r\n// and also to provide a nicer interface for loading scriptdata\r\n// without needing to trigger savestate loading first\r\nDEFINE_LUA_FUNCTION(state_loadscriptdata, \"location\")\r\n{\r\n\tint type = lua_type(L,1);\r\n\tswitch(type)\r\n\t{\r\n\t\tcase LUA_TNUMBER: // numbered save file\r\n\t\tdefault:\r\n\t\t{\r\n\t\t\t// TODO\r\n\t\t\t//int stateNumber = luaL_checkinteger(L,1);\r\n\t\t\t//Set_Current_State(stateNumber, false,false);\r\n\t\t\t//char Name [1024] = {0};\r\n\t\t\t//Get_State_File_Name(Name);\r\n\t\t\t//{\r\n\t\t\t//\tLuaSaveData saveData;\r\n\r\n\t\t\t//\tchar luaSaveFilename [512];\r\n\t\t\t//\tstrncpy(luaSaveFilename, Name, 512);\r\n\t\t\t//\tluaSaveFilename[512-(1+7/*strlen(\".luasav\")*/)] = '\\0';\r\n\t\t\t//\tstrcat(luaSaveFilename, \".luasav\");\r\n\t\t\t//\tFILE* luaSaveFile = fopen(luaSaveFilename, \"rb\");\r\n\t\t\t//\tif(luaSaveFile)\r\n\t\t\t//\t{\r\n\t\t\t//\t\tsaveData.ImportRecords(luaSaveFile);\r\n\t\t\t//\t\tfclose(luaSaveFile);\r\n\r\n\t\t\t//\t\tint uid = luaStateToUIDMap[L->l_G->mainthread];\r\n\t\t\t//\t\tLuaContextInfo& info = GetCurrentInfo();\r\n\r\n\t\t\t//\t\tlua_settop(L, 0);\r\n\t\t\t//\t\tsaveData.LoadRecord(uid, info.dataLoadKey, (unsigned int)-1);\r\n\t\t\t//\t\treturn lua_gettop(L);\r\n\t\t\t//\t}\r\n\t\t\t//}\r\n\t\t}\treturn 0;\r\n\t\tcase LUA_TUSERDATA: // in-memory save slot\r\n\t\t{\t// there can be no user data associated with those, at least not yet\r\n\t\t}\treturn 0;\r\n\t}\r\n}\r\n\r\n// savestate.savescriptdata(location)\r\n// same as savestate.save(location, \"scriptdataonly\")\r\n// only provided for consistency with savestate.loadscriptdata(location)\r\nDEFINE_LUA_FUNCTION(state_savescriptdata, \"location\")\r\n{\r\n\tlua_settop(L, 1);\r\n\tlua_pushstring(L, \"scriptdataonly\");\r\n\treturn state_save(L);\r\n}\r\n\r\n#ifndef PUBLIC_RELEASE\r\n#include \"gfx3d.h\"\r\nclass EMUFILE_MEMORY_VERIFIER : public EMUFILE_MEMORY { \r\npublic:\r\n\tEMUFILE_MEMORY_VERIFIER(EMUFILE_MEMORY* underlying) : EMUFILE_MEMORY(underlying->get_vec()) { }\r\n\r\n\tstd::vector<std::string> differences;\r\n\r\n\tvirtual void fwrite(const void *ptr, size_t bytes)\r\n\t{\r\n\t\tif(!failbit)\r\n\t\t{\r\n\t\t\tu8* dst = buf()+pos;\r\n\t\t\tconst u8* src = (const u8*)ptr;\r\n\t\t\tint differencesAddedThisCall = 0;\r\n\t\t\tfor(int i = pos; i < (int)bytes+pos; i++)\r\n\t\t\t{\r\n\t\t\t\tif(*src != *dst)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(differences.size() == 100)\r\n\t\t\t\t\t\tfailbit = true;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tchar temp [256];\r\n\t\t\t\t\t\tsprintf(temp, \" \" /*\"mismatch at \"*/ \"byte %d(0x%X at 0x%X): %d(0x%X) != %d(0x%X)\\n\", i, i, dst, *src,*src, *dst,*dst);\r\n\r\n\t\t\t\t\t\tif(ptr == GPU_screen || ptr == gfx3d_convertedScreen) // ignore screen-only differences since frame skipping can cause them and it's probably ok\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\tdifferences.push_back(temp); // <-- probably the best place for a breakpoint\r\n\r\n\t\t\t\t\t\tif(++differencesAddedThisCall == 4)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsrc++;\r\n\t\t\t\tdst++;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpos += bytes;\r\n\t}\r\n};\r\n\r\n// like savestate.save() except instead of actually saving\r\n// it compares against what's already in the savestate\r\n// and throws an error if any differences are found.\r\n// only useful for development (catching desyncs).\r\nDEFINE_LUA_FUNCTION(state_verify, \"location[,option]\")\r\n{\r\n\tint type = lua_type(L,1);\r\n\tswitch(type)\r\n\t{\r\n\t\tcase LUA_TNUMBER: // numbered save file\r\n\t\tdefault:\r\n\t\t{\r\n\t\t\tluaL_error(L, \"savestate.verify only works for in-memory saves.\");\r\n\t\t}\treturn 0;\r\n\t\tcase LUA_TUSERDATA: // in-memory save slot\r\n\t\t{\r\n\t\t\tEMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, \"EMUFILE_MEMORY*\");\r\n\r\n\t\t\tif((*ppEmuFile)->fail())\r\n\t\t\t\tluaL_error(L, \"failed to verify, savestate object was dead.\");\r\n\r\n\t\t\tEMUFILE_MEMORY_VERIFIER verifier (*ppEmuFile);\r\n\t\t\tsavestate_save(&verifier, 0);\r\n\t\t\tif(verifier.differences.size())\r\n\t\t\t{\r\n\t\t\t\tfputs(\"\\n\", stdout);\r\n\t\t\t\tfor(unsigned int i = 0; i < verifier.differences.size(); i++)\r\n\t\t\t\t\tfputs(verifier.differences[i].c_str(), stdout);\r\n\t\t\t\tluaL_error(L, \"failed to verify savestate! %s\", verifier.differences[0].c_str());\r\n\t\t\t}\r\n\t\t}\treturn 0;\r\n\t}\r\n}\r\n\r\n#endif\r\n\r\n\r\n\r\n\r\n\r\n\r\n//joypad lib\r\n\r\nstatic const char *button_mappings[] = {\r\n//   G   E   W   X   Y   A   B   S       T        U    D      L      R       F\r\n\"debug\",\"R\",\"L\",\"X\",\"Y\",\"A\",\"B\",\"start\",\"select\",\"up\",\"down\",\"left\",\"right\",\"lid\"\r\n};\r\n\r\nstatic int joy_getArgControllerNum(lua_State* L, int& index)\r\n{\r\n\t// well, I think there's only one controller,\r\n\t// but this should probably stay here for cross-emulator consistency\r\n\tint type = lua_type(L,index);\r\n\tif(type == LUA_TSTRING || type == LUA_TNUMBER)\r\n\t\tindex++;\r\n\treturn 1;\r\n}\r\n\r\n// joypad.set(table buttons)\r\n//\r\n//  Sets the joypad state (takes effect at the next frame boundary)\r\n//    true -> pressed\r\n//    false -> unpressed\r\n//    nil -> no change\r\nDEFINE_LUA_FUNCTION(joy_set, \"buttonTable\")\r\n{\r\n\tif(movieMode == MOVIEMODE_PLAY) // don't allow tampering with a playing movie's input\r\n\t\treturn 0; // (although it might be useful sometimes...)\r\n\r\n\tif(!NDS_isProcessingUserInput())\r\n\t{\r\n\t\t// defer this function until when we are processing input\r\n\t\tDeferFunctionCall(L, deferredJoySetIDString);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tint index = 1;\r\n\t(void)joy_getArgControllerNum(L, index);\r\n\tluaL_checktype(L, index, LUA_TTABLE);\r\n\r\n\tUserButtons& buttons = NDS_getProcessingUserInput().buttons;\r\n\r\n\tfor(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++)\r\n\t{\r\n\t\tconst char* name = button_mappings[i];\r\n\t\tlua_getfield(L, index, name);\r\n\t\tif (!lua_isnil(L,-1))\r\n\t\t{\r\n\t\t\tbool pressed = lua_toboolean(L,-1) != 0;\r\n\t\t\tbuttons.array[i] = pressed;\r\n\t\t}\r\n\t\tlua_pop(L,1);\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\n// table joypad.read()\r\n//\r\n//  Reads the joypad state (what the game sees)\r\nint joy_get_internal(lua_State* L, bool reportUp, bool reportDown)\r\n{\r\n\tint index = 1;\r\n\t(void)joy_getArgControllerNum(L, index);\r\n\r\n\tlua_newtable(L);\r\n\r\n\tconst UserButtons& buttons = NDS_getFinalUserInput().buttons;\r\n\r\n\tfor(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++)\r\n\t{\r\n\t\tconst char* name = button_mappings[i];\r\n\t\tbool pressed = buttons.array[i];\r\n\t\tif((pressed && reportDown) || (!pressed && reportUp))\r\n\t\t{\r\n\t\t\tlua_pushboolean(L, pressed);\r\n\t\t\tlua_setfield(L, -2, name);\r\n\t\t}\r\n\t}\r\n\r\n\treturn 1;\r\n}\r\n// joypad.get()\r\n// returns a table of every game button,\r\n// true meaning currently-held and false meaning not-currently-held\r\n// (as of last frame boundary)\r\n// this WILL read input from a currently-playing movie\r\nDEFINE_LUA_FUNCTION(joy_get, \"\")\r\n{\r\n\treturn joy_get_internal(L, true, true);\r\n}\r\n// joypad.getdown()\r\n// returns a table of every game button that is currently held\r\nDEFINE_LUA_FUNCTION(joy_getdown, \"\")\r\n{\r\n\treturn joy_get_internal(L, false, true);\r\n}\r\n// joypad.getup()\r\n// returns a table of every game button that is not currently held\r\nDEFINE_LUA_FUNCTION(joy_getup, \"\")\r\n{\r\n\treturn joy_get_internal(L, true, false);\r\n}\r\n\r\n// table joypad.peek()\r\n//\r\n//  Reads the joypad state (what the user is currently pressing/requesting)\r\nint joy_peek_internal(lua_State* L, bool reportUp, bool reportDown)\r\n{\r\n\tint index = 1;\r\n\t(void)joy_getArgControllerNum(L, index);\r\n\r\n\tlua_newtable(L);\r\n\r\n\tconst UserButtons& buttons = NDS_getRawUserInput().buttons;\r\n\r\n\tfor(int i = 0; i < sizeof(button_mappings)/sizeof(*button_mappings); i++)\r\n\t{\r\n\t\tconst char* name = button_mappings[i];\r\n\t\tbool pressed = buttons.array[i];\r\n\t\tif((pressed && reportDown) || (!pressed && reportUp))\r\n\t\t{\r\n\t\t\tlua_pushboolean(L, pressed);\r\n\t\t\tlua_setfield(L, -2, name);\r\n\t\t}\r\n\t}\r\n\r\n\treturn 1;\r\n}\r\n\r\n// joypad.peek()\r\n// returns a table of every game button,\r\n// true meaning currently-held and false meaning not-currently-held\r\n// peek checks which joypad buttons are physically pressed,\r\n// so it will NOT read input from a playing movie,\r\n// it CAN read mid-frame input,\r\n// and it will NOT pay attention to stuff like disabled L+R/U+D\r\nDEFINE_LUA_FUNCTION(joy_peek, \"\")\r\n{\r\n\treturn joy_peek_internal(L, true, true);\r\n}\r\n// joypad.peekdown()\r\n// returns a table of every game button that is currently held (according to what joypad.peek() would return)\r\nDEFINE_LUA_FUNCTION(joy_peekdown, \"\")\r\n{\r\n\treturn joy_peek_internal(L, false, true);\r\n}\r\n// joypad.peekup()\r\n// returns a table of every game button that is not currently held (according to what joypad.peek() would return)\r\nDEFINE_LUA_FUNCTION(joy_peekup, \"\")\r\n{\r\n\treturn joy_peek_internal(L, true, false);\r\n}\r\n\r\n\r\nstatic const struct ColorMapping\r\n{\r\n\tconst char* name;\r\n\tint value;\r\n}\r\ns_colorMapping [] =\r\n{\r\n\t{\"white\",     0xFFFFFFFF},\r\n\t{\"black\",     0x000000FF},\r\n\t{\"clear\",     0x00000000},\r\n\t{\"gray\",      0x7F7F7FFF},\r\n\t{\"grey\",      0x7F7F7FFF},\r\n\t{\"red\",       0xFF0000FF},\r\n\t{\"orange\",    0xFF7F00FF},\r\n\t{\"yellow\",    0xFFFF00FF},\r\n\t{\"chartreuse\",0x7FFF00FF},\r\n\t{\"green\",     0x00FF00FF},\r\n\t{\"teal\",      0x00FF7FFF},\r\n\t{\"cyan\" ,     0x00FFFFFF},\r\n\t{\"blue\",      0x0000FFFF},\r\n\t{\"purple\",    0x7F00FFFF},\r\n\t{\"magenta\",   0xFF00FFFF},\r\n};\r\n\r\ninline int getcolor_unmodified(lua_State *L, int idx, int defaultColor)\r\n{\r\n\tint type = lua_type(L,idx);\r\n\tswitch(type)\r\n\t{\r\n\t\tcase LUA_TNUMBER:\r\n\t\t{\r\n\t\t\treturn lua_tointeger(L,idx);\r\n\t\t}\tbreak;\r\n\t\tcase LUA_TSTRING:\r\n\t\t{\r\n\t\t\tconst char* str = lua_tostring(L,idx);\r\n\t\t\tif(*str == '#')\r\n\t\t\t{\r\n\t\t\t\tint color;\r\n\t\t\t\tsscanf(str+1, \"%X\", &color);\r\n\t\t\t\tint len = strlen(str+1);\r\n\t\t\t\tint missing = std::max(0, 8-len);\r\n\t\t\t\tcolor <<= missing << 2;\r\n\t\t\t\tif(missing >= 2) color |= 0xFF;\r\n\t\t\t\treturn color;\r\n\t\t\t}\r\n\t\t\telse for(int i = 0; i<sizeof(s_colorMapping)/sizeof(*s_colorMapping); i++)\r\n\t\t\t{\r\n\t\t\t\tif(!stricmp(str,s_colorMapping[i].name))\r\n\t\t\t\t\treturn s_colorMapping[i].value;\r\n\t\t\t}\r\n\t\t\tif(!strnicmp(str, \"rand\", 4))\r\n\t\t\t\treturn ((rand()*255/RAND_MAX) << 8) | ((rand()*255/RAND_MAX) << 16) | ((rand()*255/RAND_MAX) << 24) | 0xFF;\r\n\t\t}\tbreak;\r\n\t\tcase LUA_TTABLE:\r\n\t\t{\r\n\t\t\tint color = 0xFF;\r\n\t\t\tlua_pushnil(L); // first key\r\n\t\t\tint keyIndex = lua_gettop(L);\r\n\t\t\tint valueIndex = keyIndex + 1;\r\n\t\t\tbool first = true;\r\n\t\t\twhile(lua_next(L, idx))\r\n\t\t\t{\r\n\t\t\t\tbool keyIsString = (lua_type(L, keyIndex) == LUA_TSTRING);\r\n\t\t\t\tbool keyIsNumber = (lua_type(L, keyIndex) == LUA_TNUMBER);\r\n\t\t\t\tint key = keyIsString ? tolower(*lua_tostring(L, keyIndex)) : (keyIsNumber ? lua_tointeger(L, keyIndex) : 0);\r\n\t\t\t\tint value = lua_tointeger(L, valueIndex);\r\n\t\t\t\tif(value < 0) value = 0;\r\n\t\t\t\tif(value > 255) value = 255;\r\n\t\t\t\tswitch(key)\r\n\t\t\t\t{\r\n\t\t\t\tcase 1: case 'r': color |= value << 24; break;\r\n\t\t\t\tcase 2: case 'g': color |= value << 16; break;\r\n\t\t\t\tcase 3: case 'b': color |= value << 8; break;\r\n\t\t\t\tcase 4: case 'a': color = (color & ~0xFF) | value; break;\r\n\t\t\t\t}\r\n\t\t\t\tlua_pop(L, 1);\r\n\t\t\t}\r\n\t\t\treturn color;\r\n\t\t}\tbreak;\r\n\t\tcase LUA_TFUNCTION:\r\n\t\t\treturn 0;\r\n\t}\r\n\treturn defaultColor;\r\n}\r\nint getcolor(lua_State *L, int idx, int defaultColor)\r\n{\r\n\tint color = getcolor_unmodified(L, idx, defaultColor);\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tif(info.transparencyModifier != 255)\r\n\t{\r\n\t\tint alpha = (((color & 0xFF) * info.transparencyModifier) / 255);\r\n\t\tif(alpha > 255) alpha = 255;\r\n\t\tcolor = (color & ~0xFF) | alpha;\r\n\t}\r\n\treturn color;\r\n}\r\n\r\n// r,g,b,a = gui.parsecolor(color)\r\n// examples:\r\n// local r,g,b = gui.parsecolor(\"green\")\r\n// local r,g,b,a = gui.parsecolor(0x7F3FFF7F)\r\nDEFINE_LUA_FUNCTION(gui_parsecolor, \"color\")\r\n{\r\n\tint color = getcolor_unmodified(L, 1, 0);\r\n\tint r = (color & 0xFF000000) >> 24;\r\n\tint g = (color & 0x00FF0000) >> 16;\r\n\tint b = (color & 0x0000FF00) >> 8;\r\n\tint a = (color & 0x000000FF);\r\n\tlua_pushinteger(L, r);\r\n\tlua_pushinteger(L, g);\r\n\tlua_pushinteger(L, b);\r\n\tlua_pushinteger(L, a);\r\n\treturn 4;\r\n}\r\n\r\n\r\n\r\nstatic inline void blend32(u32 *dstPixel, u32 color)\r\n{\r\n\tu8 *dst = (u8*) dstPixel;\r\n\tint r = (color & 0xFF000000) >> 24;\r\n\tint g = (color & 0x00FF0000) >> 16;\r\n\tint b = (color & 0x0000FF00) >> 8;\r\n\tint a = color & 0x000000FF;\r\n\r\n\tif (a == 255) {\r\n\t\t// direct copy\r\n\t\tdst[0] = b;\r\n\t\tdst[1] = g;\r\n\t\tdst[2] = r;\r\n\t\tdst[3] = a;\r\n\t}\r\n\telse if (a == 0) {\r\n\t\t// do not copy\r\n\t}\r\n\telse {\r\n\t\t// alpha-blending\r\n\t\tu8 bo = dst[0];\r\n\t\tu8 go = dst[1];\r\n\t\tu8 ro = dst[2];\r\n\t\tu8 ao = dst[3];\r\n        dst[0] = (((b - bo) * a + (bo << 8)) >> 8);\r\n        dst[1] = (((g - go) * a + (go << 8)) >> 8);\r\n        dst[2] = (((r - ro) * a + (ro << 8)) >> 8);\r\n        dst[3] =  ((a + ao) - ((a * ao + 0xFF) >> 8));\r\n\t}\r\n}\r\n\r\nstatic LuaGUIData curGuiData;\r\n\r\nstatic void prepare_drawing()\r\n{\r\n\tcurGuiData = GetCurrentInfo().guiData;\r\n}\r\nstatic void prepare_reading()\r\n{\r\n\tcurGuiData = GetCurrentInfo().guiData;\r\n\tu32* buf = (u32*)aggDraw.screen->buf().buf();\r\n\tif(buf)\r\n\t{\r\n\t\tcurGuiData.data = buf;\r\n\t\tcurGuiData.stridePix = aggDraw.screen->buf().stride_abs() / 4;\r\n\t}\r\n\telse\r\n\t{\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\t\textern VideoInfo video;\r\n\t\tcurGuiData.data = video.buffer;\r\n\t\tcurGuiData.stridePix = 256;\r\n#endif\r\n\t}\r\n}\r\n\r\n// note: prepare_drawing or prepare_reading must be called,\r\n// before any of the following bunch of gui functions will work properly.\r\n\r\n\r\n// negative -> top\r\n// positive -> bottom\r\n// 0 -> both\r\nstatic void restrict_to_screen(int ySelectScreen)\r\n{\r\n\tif(ySelectScreen > 0)\r\n\t\tcurGuiData.yMin = (curGuiData.yMin + curGuiData.yMax) >> 1;\r\n\telse if(ySelectScreen < 0)\r\n\t\tcurGuiData.yMax = (curGuiData.yMin + curGuiData.yMax) >> 1;\r\n}\r\n\r\n// check if a pixel is in the lua canvas\r\nstatic FORCEINLINE bool gui_checkboundary(int x, int y) {\r\n\treturn !(x < curGuiData.xMin || x >= curGuiData.xMax || y < curGuiData.yMin || y >= curGuiData.yMax);\r\n}\r\nstatic FORCEINLINE void gui_adjust_coord(int& x, int& y) {\r\n\tx += curGuiData.xOrigin;\r\n\ty += curGuiData.yOrigin;\r\n}\r\nstatic FORCEINLINE bool gui_checkbox(int x1, int y1, int x2, int y2) {\r\n\tif((x1 <  curGuiData.xMin && x2 <  curGuiData.xMin)\r\n\t|| (x1 >= curGuiData.xMax && x2 >= curGuiData.xMax)\r\n\t|| (y1 <  curGuiData.yMin && y2 <  curGuiData.yMin)\r\n\t|| (y1 >= curGuiData.yMax && y2 >= curGuiData.yMax))\r\n\t\treturn false;\r\n\treturn true;\r\n}\r\n\r\n// write a pixel (do not check boundaries for speedup)\r\nstatic FORCEINLINE void gui_drawpixel_unchecked(int x, int y, u32 color) {\r\n\tblend32((u32*) &curGuiData.data[y*curGuiData.stridePix+x], color);\r\n}\r\n\r\n// write a pixel (check boundaries)\r\nstatic FORCEINLINE void gui_drawpixel_checked(int x, int y, u32 color) {\r\n\tif (gui_checkboundary(x, y))\r\n\t\tgui_drawpixel_unchecked(x, y, color);\r\n}\r\n\r\nstatic FORCEINLINE u32 gui_getpixel_unchecked(int x, int y) {\r\n\treturn curGuiData.data[y*curGuiData.stridePix+x];\r\n}\r\nstatic FORCEINLINE u32 gui_adjust_coord_and_getpixel(int x, int y) {\r\n\tx += curGuiData.xOrigin;\r\n\ty += curGuiData.yOrigin;\r\n\tx = min(max(x, curGuiData.xMin), curGuiData.xMax-1);\r\n\ty = min(max(y, curGuiData.yMin), curGuiData.yMax-1);\r\n\treturn gui_getpixel_unchecked(x, y);\r\n}\r\n\r\n// draw a line (checks boundaries)\r\nstatic void gui_drawline_internal(int x1, int y1, int x2, int y2, bool lastPixel, u32 color)\r\n{\r\n\t// Note: New version of Bresenham's Line Algorithm\r\n\t// http://groups.google.co.jp/group/rec.games.roguelike.development/browse_thread/thread/345f4c42c3b25858/29e07a3af3a450e6?show_docid=29e07a3af3a450e6\r\n\r\n\tint swappedx = 0;\r\n\tint swappedy = 0;\r\n\r\n\tint xtemp = x1-x2;\r\n\tint ytemp = y1-y2;\r\n\tif (xtemp == 0 && ytemp == 0) {\r\n\t\tgui_drawpixel_checked(x1, y1, color);\r\n\t\treturn;\r\n\t}\r\n\tif (xtemp < 0) {\r\n\t\txtemp = -xtemp;\r\n\t\tswappedx = 1;\r\n\t}\r\n\tif (ytemp < 0) {\r\n\t\tytemp = -ytemp;\r\n\t\tswappedy = 1;\r\n\t}\r\n\r\n\tint delta_x = xtemp << 1;\r\n\tint delta_y = ytemp << 1;\r\n\r\n\tsigned char ix = x1 > x2?1:-1;\r\n\tsigned char iy = y1 > y2?1:-1;\r\n\r\n\tif (lastPixel)\r\n\t\tgui_drawpixel_checked(x2, y2, color);\r\n\r\n\tif (delta_x >= delta_y) {\r\n\t\tint error = delta_y - (delta_x >> 1);\r\n\r\n\t\twhile (x2 != x1) {\r\n\t\t\tif (error == 0 && !swappedx)\r\n\t\t\t\tgui_drawpixel_checked(x2+ix, y2, color);\r\n\t\t\tif (error >= 0) {\r\n\t\t\t\tif (error || (ix > 0)) {\r\n\t\t\t\t\ty2 += iy;\r\n\t\t\t\t\terror -= delta_x;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx2 += ix;\r\n\t\t\tgui_drawpixel_checked(x2, y2, color);\r\n\t\t\tif (error == 0 && swappedx)\r\n\t\t\t\tgui_drawpixel_checked(x2, y2+iy, color);\r\n\t\t\terror += delta_y;\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\tint error = delta_x - (delta_y >> 1);\r\n\r\n\t\twhile (y2 != y1) {\r\n\t\t\tif (error == 0 && !swappedy)\r\n\t\t\t\tgui_drawpixel_checked(x2, y2+iy, color);\r\n\t\t\tif (error >= 0) {\r\n\t\t\t\tif (error || (iy > 0)) {\r\n\t\t\t\t\tx2 += ix;\r\n\t\t\t\t\terror -= delta_y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ty2 += iy;\r\n\t\t\tgui_drawpixel_checked(x2, y2, color);\r\n\t\t\tif (error == 0 && swappedy)\r\n\t\t\t\tgui_drawpixel_checked(x2+ix, y2, color);\r\n\t\t\terror += delta_x;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic const u8 Small_Font_Data[] =\r\n{\r\n#define I +0,\r\n#define a +1\r\n#define b +2\r\n#define c +4\r\n#define d +8\r\n#define e +16\r\n//  !\"#$%&'\r\n           I     c     I   b   d   I           I      d    I a b       I     c     I     c     I\r\n           I     c     I   b   d   I   b   d   I    c d e  I a b     e I   b   d   I     c     I\r\n           I     c     I           I a b c d e I  b        I       d   I   b c     I           I\r\n           I     c     I           I   b   d   I  b c      I     c     I   b       I           I\r\n           I     c     I           I a b c d e I      d e  I   b       I a   c   e I           I\r\n           I           I           I   b   d   I        e  I a     d e I a     d   I           I\r\n           I     c     I           I           I  b c d    I       d e I   b c   e I           I\r\n           I           I           I           I    c      I           I           I           I\r\n// ()*+,-./\r\n        e  I   b       I           I           I           I           I           I        e  I\r\n      d    I     c     I  b     e  I     c     I           I           I           I        e  I\r\n      d    I     c     I    c d    I     c     I           I           I           I      d    I\r\n      d    I     c     I  b c d e  I a b c d e I           I  b c d e  I           I      d    I\r\n      d    I     c     I    c d    I     c     I           I           I           I    c      I\r\n      d    I     c     I  b     e  I     c     I      d    I           I    c d    I    c      I\r\n      d    I     c     I           I           I      d    I           I    c d    I  b        I\r\n        e  I   b       I           I           I    c      I           I           I  b        I\r\n// 01234567\r\n    c d    I      d    I    c d    I    c d    I  b     e  I  b c d e  I    c d    I  b c d e  I\r\n  b     e  I    c d    I  b     e  I  b     e  I  b     e  I  b        I  b     e  I        e  I\r\n  b     e  I      d    I        e  I        e  I  b     e  I  b        I  b        I      d    I\r\n  b     e  I      d    I      d    I    c d    I  b c d e  I  b c d    I  b c d    I      d    I\r\n  b     e  I      d    I    c      I        e  I        e  I        e  I  b     e  I    c      I\r\n  b     e  I      d    I  b        I  b     e  I        e  I        e  I  b     e  I    c      I\r\n    c d    I    c d e  I  b c d e  I    c d    I        e  I  b c d    I    c d    I  b        I\r\n           I           I           I           I           I           I           I           I\r\n// 89:;<=>?\r\n    c d    I    c d    I           I           I        e  I           I  b        I    c d    I\r\n  b     e  I  b     e  I           I           I      d    I           I    c      I  b     e  I\r\n  b     e  I  b     e  I    c d    I      d    I    c      I  b c d e  I      d    I        e  I\r\n    c d    I    c d e  I    c d    I      d    I  b        I           I        e  I      d    I\r\n  b     e  I        e  I           I           I    c      I  b c d e  I      d    I    c      I\r\n  b     e  I  b     e  I    c d    I      d    I      d    I           I    c      I           I\r\n    c d    I    c d    I    c d    I      d    I        e  I           I  b        I    c      I\r\n           I           I           I    c      I           I           I           I           I\r\n// @ABCDEFG\r\n   b c d   I    c d    I  b c d    I    c d    I  b c d    I  b c d e  I  b c d e  I    c d    I\r\n a       e I  b     e  I  b     e  I  b     e  I  b     e  I  b        I  b        I  b     e  I\r\n a     d e I  b     e  I  b     e  I  b        I  b     e  I  b        I  b        I  b        I\r\n a   c   e I  b c d e  I  b c d    I  b        I  b     e  I  b c d    I  b c d    I  b        I\r\n a     d e I  b     e  I  b     e  I  b        I  b     e  I  b        I  b        I  b   d e  I\r\n a         I  b     e  I  b     e  I  b     e  I  b     e  I  b        I  b        I  b     e  I\r\n   b c d e I  b     e  I  b c d    I    c d    I  b c d    I  b c d e  I  b        I    c d e  I\r\n           I           I           I           I           I           I           I           I\r\n// HIJKlMNO\r\n  b     e  I   b c d   I        e  I  b     e  I  b        I a       e I  b     e  I  b c d e  I\r\n  b     e  I     c     I        e  I  b     e  I  b        I a b   d e I  b c   e  I  b     e  I\r\n  b     e  I     c     I        e  I  b   d    I  b        I a   c   e I  b   d e  I  b     e  I\r\n  b c d e  I     c     I        e  I  b c      I  b        I a   c   e I  b     e  I  b     e  I\r\n  b     e  I     c     I        e  I  b   d    I  b        I a       e I  b     e  I  b     e  I\r\n  b     e  I     c     I  b     e  I  b     e  I  b        I a       e I  b     e  I  b     e  I\r\n  b     e  I   b c d   I    c d    I  b     e  I  b c d e  I a       e I  b     e  I  b c d e  I\r\n           I           I           I           I           I           I           I           I\r\n// PQRSTUVW\r\n  b c d    I    c d    I  b c d    I    c d e  I a b c d e I  b     e  I a       e I a       e I\r\n  b     e  I  b     e  I  b     e  I  b        I     c     I  b     e  I a       e I a       e I\r\n  b     e  I  b     e  I  b     e  I  b        I     c     I  b     e  I a       e I a       e I\r\n  b c d    I  b     e  I  b c d    I    c d    I     c     I  b     e  I a       e I a       e I\r\n  b        I  b     e  I  b     e  I        e  I     c     I  b     e  I   b   d   I a   c   e I\r\n  b        I  b     e  I  b     e  I        e  I     c     I  b     e  I   b   d   I a b   d e I\r\n  b        I    c d    I  b     e  I  b c d    I     c     I    c d    I     c     I a       e I\r\n           I      d e  I           I           I           I           I           I           I\r\n// XYZ[\\]^_\r\n a       e I a       e I a b c d e I      d e  I  b        I   b c     I     c     I           I\r\n a       e I a       e I         e I      d    I  b        I     c     I   b   d   I           I\r\n   b   d   I a       e I       d   I      d    I    c      I     c     I           I           I\r\n     c     I   b   d   I     c     I      d    I    c      I     c     I           I           I\r\n   b   d   I     c     I   b       I      d    I      d    I     c     I           I           I\r\n a       e I     c     I a         I      d    I      d    I     c     I           I           I\r\n a       e I     c     I a b c d e I      d    I        e  I     c     I           I           I\r\n           I           I           I      d e  I        e  I   b c     I           I a b c d e I\r\n// `abcdefg\r\n  b        I           I  b        I           I        e  I           I      d e  I           I\r\n    c      I           I  b        I           I        e  I           I    c      I           I\r\n           I    c d    I  b        I    c d    I        e  I    c d    I    c      I    c d e  I\r\n           I        e  I  b c d    I  b     e  I    c d e  I  b     e  I  b c d    I  b     e  I\r\n           I    c d e  I  b     e  I  b        I  b     e  I  b c d e  I    c      I  b     e  I\r\n           I  b     e  I  b     e  I  b        I  b     e  I  b        I    c      I    c d e  I\r\n           I    c d e  I  b c d    I    c d e  I    c d e  I    c d e  I    c      I        e  I\r\n           I           I           I           I           I           I           I    c d    I\r\n// hijklmno\r\n  b        I           I           I  b        I     c     I           I           I           I\r\n  b        I     c     I     c     I  b        I     c     I           I           I           I\r\n  b        I           I           I  b        I     c     I a b c d   I  b c d    I    c d    I\r\n  b c d    I     c     I     c     I  b   d e  I     c     I a   c   e I  b     e  I  b     e  I\r\n  b     e  I     c     I     c     I  b c      I     c     I a   c   e I  b     e  I  b     e  I\r\n  b     e  I     c     I     c     I  b   d    I     c     I a   c   e I  b     e  I  b     e  I\r\n  b     e  I     c     I     c     I  b     e  I     c     I a       e I  b     e  I    c d    I\r\n           I           I   b       I           I           I           I           I           I\r\n// pqrstuvw\r\n           I           I           I           I     c     I           I           I           I\r\n           I           I           I           I     c     I           I           I           I\r\n  b c d    I    c d e  I  b c d    I    c d e  I   b c d   I  b     e  I  b     e  I a       e I\r\n  b     e  I  b     e  I  b     e  I  b        I     c     I  b     e  I  b     e  I a       e I\r\n  b     e  I  b     e  I  b        I    c d    I     c     I  b     e  I  b     e  I a   c   e I\r\n  b c d    I    c d e  I  b        I        e  I     c     I  b     e  I    c d    I a b   d e I\r\n  b        I        e  I  b        I  b c d    I       d   I    c d e  I    c d    I a       e I\r\n  b        I        e  I           I           I           I           I           I           I\r\n// xyz{|}~\r\n           I           I           I      d e  I     c     I   b c     I           I           I\r\n           I           I           I      d    I     c     I     c     I           I   b   d   I\r\n  b     e  I  b     e  I  b c d e  I      d    I     c     I     c     I    c   e  I a   c   e I\r\n    c d    I  b     e  I        e  I    c d    I     c     I     c d   I  b   d    I a       e I\r\n    c d    I  b     e  I    c d    I    c d    I     c     I     c d   I           I   b   d   I\r\n  b     e  I    c d e  I  b        I      d    I     c     I     c     I           I     c     I\r\n  b     e  I        e  I  b c d e  I      d    I     c     I     c     I           I           I\r\n           I  b c d    I           I      d e  I     c     I   b c     I           I           I\r\n#undef I\r\n#undef a\r\n#undef b\r\n#undef c\r\n#undef d\r\n#undef e\r\n};\r\n\r\ntemplate<int dxdx, int dydy, int dxdy, int dydx>\r\nstatic void PutTextInternal (const char *str, int len, short x, short y, int color, int backcolor)\r\n{\r\n\tint Opac = color & 0xFF;\r\n\tint backOpac = backcolor & 0xFF;\r\n\tint origX = x;\r\n\tint origY = y;\r\n\r\n\tif(!Opac && !backOpac)\r\n\t\treturn;\r\n\r\n\twhile(*str && len)\r\n\t{\r\n\t\tif(dydy > 0 && y >= curGuiData.yMax) break;\r\n\t\tif(dydy < 0 && y < curGuiData.yMin) break;\r\n\t\tif(dxdy > 0 && x >= curGuiData.xMax) break;\r\n\t\tif(dxdy < 0 && x < curGuiData.xMin) break;\r\n\r\n\t\tint c = *str++;\r\n\t\tif(dxdx > 0 && x >= curGuiData.xMax\r\n\t\t|| dxdx < 0 && x < curGuiData.xMin\r\n\t\t|| dydx > 0 && y >= curGuiData.yMax\r\n\t\t|| dydx < 0 && y < curGuiData.yMin)\r\n\t\t{\r\n\t\t\twhile (c != '\\n') {\r\n\t\t\t\tc = *str;\r\n\t\t\t\tif (c == '\\0')\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tstr++;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(c == '\\n')\r\n\t\t{\r\n\t\t\tif(dydy)\r\n\t\t\t{\r\n\t\t\t\tx = origX;\r\n\t\t\t\ty += 10 * dydy;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ty = origY;\r\n\t\t\t\tx += 10 * dxdy;\r\n\t\t\t}\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\telse if(c == '\\t') // just in case\r\n\t\t{\r\n\t\t\tconst int tabSpace = 8;\r\n\t\t\tx += (tabSpace-(((x-origX)/5)%tabSpace))*5*dxdx;\r\n\t\t\ty += (tabSpace-(((y-origY)/5)%tabSpace))*5*dydx;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tc -= 32;\r\n\t\tif((unsigned int)c >= 96)\r\n\t\t\tcontinue;\r\n\r\n\t\tif(c)\r\n\t\t{\r\n\t\t\tconst u8* Cur_Glyph = (const unsigned char*)&Small_Font_Data + (c%8)+((c/8)*64);\r\n\t\t\tfor(int y2 = -1; y2 < 10; y2++)\r\n\t\t\t{\r\n\t\t\t\tfor(int x2 = -1; x2 < 6; x2++)\r\n\t\t\t\t{\r\n\t\t\t\t\tbool on = y2 >= 0 && y2 < 8 && (Cur_Glyph[y2*8] & (1 << x2));\r\n\t\t\t\t\tif(on)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tgui_drawpixel_checked(x+x2*dxdx+y2*dxdy, y+y2*dydy+x2*dydx, color);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(backOpac)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor(int y3 = max(0,y2-1); y3 <= min(7,y2+1); y3++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tfor(int x3 = max(0,x2-1); x3 <= min(4,x2+1); x3++)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ton |= y3 >= 0 && y3 < 8 && (Cur_Glyph[y3*8] & (1 << x3));\r\n\t\t\t\t\t\t\t\tif (on)\r\n\t\t\t\t\t\t\t\t\tgoto draw_outline; // speedup?\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(on)\r\n\t\t\t\t\t\t{\r\ndraw_outline:\r\n\t\t\t\t\t\t\tgui_drawpixel_checked(x+x2*dxdx+y2*dxdy, y+y2*dydy+x2*dydx, backcolor);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tx += 6*dxdx;\r\n\t\ty += 6*dydx;\r\n\t\tlen--;\r\n\t}\r\n}\r\n\r\nstatic int strlinelen(const char* string)\r\n{\r\n\tconst char* s = string;\r\n\twhile(*s && *s != '\\n')\r\n\t\ts++;\r\n\tif(*s)\r\n\t\ts++;\r\n\treturn s - string;\r\n}\r\n\r\nstatic void LuaDisplayString (const char *str, int x, int y, u32 color, u32 outlineColor)\r\n{\r\n\tif(!str)\r\n\t\treturn;\r\n\r\n#if 1\r\n\t//if(rotate == 0)\r\n\t\tPutTextInternal<1,1,0,0>(str, strlen(str), x, y, color, outlineColor);\r\n\t//else if(rotate == 90)\r\n\t//\tPutTextInternal<0,0,1,-1>(str, strlen(str), x, y, color, outlineColor);\r\n\t//else if\r\n#else\r\n\tconst char* ptr = str;\r\n\twhile(*ptr && y < curGuiData.yMax)\r\n\t{\r\n\t\tint len = strlinelen(ptr);\r\n\t\tint skip = 0;\r\n\t\tif(len < 1) len = 1;\r\n\r\n\t\t// break up the line if it's too long to display otherwise\r\n\t\tif(len > 63)\r\n\t\t{\r\n\t\t\tlen = 63;\r\n\t\t\tconst char* ptr2 = ptr + len-1;\r\n\t\t\tfor(int j = len-1; j; j--, ptr2--)\r\n\t\t\t{\r\n\t\t\t\tif(*ptr2 == ' ' || *ptr2 == '\\t')\r\n\t\t\t\t{\r\n\t\t\t\t\tlen = j;\r\n\t\t\t\t\tskip = 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tint xl = 0;\r\n\t\tint yl = curGuiData.yMin;\r\n\t\tint xh = (curGuiData.xMax - 1 - 1) - 4*len;\r\n\t\tint yh = curGuiData.yMax - 1;\r\n\t\tint x2 = min(max(x,xl),xh);\r\n\t\tint y2 = min(max(y,yl),yh);\r\n\r\n\t\tPutTextInternal<1,1,0,0>(ptr,len,x2,y2,color,outlineColor);\r\n\r\n\t\tptr += len + skip;\r\n\t\ty += 8;\r\n\t}\r\n#endif\r\n}\r\n\r\n\r\n\r\n\r\nDEFINE_LUA_FUNCTION(gui_text, \"x,y,str[,color=\\\"white\\\"[,outline=\\\"black\\\"]]\")\r\n{\r\n\tint x = luaL_checkinteger(L,1); // have to check for errors before deferring\r\n\tint y = luaL_checkinteger(L,2);\r\n\r\n\tif(DeferGUIFuncIfNeeded(L))\r\n\t\treturn 0; // we have to wait until later to call this function because we haven't emulated the next frame yet\r\n\t\t          // (the only way to avoid this deferring is to be in a gui.register or emu.registerafter callback)\r\n\r\n\tconst char* str = toCString(L,3); // better than using luaL_checkstring here (more permissive)\r\n\t\r\n\tif(str && *str)\r\n\t{\r\n\t\tint foreColor = getcolor(L,4,0xFFFFFFFF);\r\n\t\tint backColor = getcolor(L,5,0x000000FF);\r\n\r\n\t\tprepare_drawing();\r\n\t\tgui_adjust_coord(x,y);\r\n\r\n\t\tLuaDisplayString(str, x, y, foreColor, backColor);\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(gui_box, \"x1,y1,x2,y2[,fill[,outline]]\")\r\n{\r\n\tint x1 = luaL_checkinteger(L,1); // have to check for errors before deferring\r\n\tint y1 = luaL_checkinteger(L,2);\r\n\tint x2 = luaL_checkinteger(L,3);\r\n\tint y2 = luaL_checkinteger(L,4);\r\n\r\n\tif(DeferGUIFuncIfNeeded(L))\r\n\t\treturn 0;\r\n\r\n\tint fillcolor = getcolor(L,5,0xFFFFFF3F);\r\n\tint outlinecolor = getcolor(L,6,fillcolor|0xFF);\r\n\r\n\tprepare_drawing();\r\n\trestrict_to_screen(y1);\r\n\tgui_adjust_coord(x1,y1);\r\n\tgui_adjust_coord(x2,y2);\r\n\r\n\tif(!gui_checkbox(x1,y1,x2,y2))\r\n\t\treturn 0;\r\n\r\n\t// require x1,y1 <= x2,y2\r\n\tif (x1 > x2)\r\n\t\tstd::swap(x1,x2);\r\n\tif (y1 > y2)\r\n\t\tstd::swap(y1,y2);\r\n\r\n\t// avoid trying to draw lots of offscreen pixels\r\n\t// (this is intentionally 1 out from the edge here)\r\n\tx1 = min(max(x1, curGuiData.xMin-1), curGuiData.xMax);\r\n\tx2 = min(max(x2, curGuiData.xMin-1), curGuiData.xMax);\r\n\ty1 = min(max(y1, curGuiData.yMin-1), curGuiData.yMax);\r\n\ty2 = min(max(y2, curGuiData.yMin-1), curGuiData.yMax);\r\n\r\n\tif(outlinecolor & 0xFF)\r\n\t{\r\n\t\tif(y1 >= curGuiData.yMin)\r\n\t\t\tfor (short x = x1+1; x < x2; x++)\r\n\t\t\t\tgui_drawpixel_unchecked(x,y1,outlinecolor);\r\n\r\n\t\tif(x1 >= curGuiData.xMin && x1 < curGuiData.xMax)\r\n\t\t{\r\n\t\t\tif(y1 >= curGuiData.yMin)\r\n\t\t\t\tgui_drawpixel_unchecked(x1,y1,outlinecolor);\r\n\t\t\tfor (short y = y1+1; y < y2; y++)\r\n\t\t\t\tgui_drawpixel_unchecked(x1,y,outlinecolor);\r\n\t\t\tif(y2 < curGuiData.yMax)\r\n\t\t\t\tgui_drawpixel_unchecked(x1,y2,outlinecolor);\r\n\t\t}\r\n\r\n\t\tif(y1 != y2 && y2 < curGuiData.yMax)\r\n\t\t\tfor (short x = x1+1; x < x2; x++)\r\n\t\t\t\tgui_drawpixel_unchecked(x,y2,outlinecolor);\r\n\t\tif(x1 != x2 && x2 >= curGuiData.xMin && x2 < curGuiData.xMax)\r\n\t\t{\r\n\t\t\tif(y1 >= curGuiData.yMin)\r\n\t\t\t\tgui_drawpixel_unchecked(x2,y1,outlinecolor);\r\n\t\t\tfor (short y = y1+1; y < y2; y++)\r\n\t\t\t\tgui_drawpixel_unchecked(x2,y,outlinecolor);\r\n\t\t\tif(y2 < curGuiData.yMax)\r\n\t\t\t\tgui_drawpixel_unchecked(x2,y2,outlinecolor);\r\n\t\t}\r\n\t}\r\n\r\n\tif(fillcolor & 0xFF)\r\n\t{\r\n\t\tfor(short y = y1+1; y <= y2-1; y++)\r\n\t\t\tfor(short x = x1+1; x <= x2-1; x++)\r\n\t\t\t\tgui_drawpixel_unchecked(x,y,fillcolor);\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n// gui.setpixel(x,y,color)\r\n// color can be a RGB web color like '#ff7030', or with alpha RGBA like '#ff703060'\r\n//   or it can be an RGBA hex number like 0xFF703060\r\n//   or it can be a preset color like 'red', 'orange', 'blue', 'white', etc.\r\nDEFINE_LUA_FUNCTION(gui_pixel, \"x,y[,color=\\\"white\\\"]\")\r\n{\r\n\tint x = luaL_checkinteger(L,1); // have to check for errors before deferring\r\n\tint y = luaL_checkinteger(L,2);\r\n\r\n\tif(DeferGUIFuncIfNeeded(L))\r\n\t\treturn 0;\r\n\r\n\tint color = getcolor(L,3,0xFFFFFFFF);\r\n\tif(color & 0xFF)\r\n\t{\r\n\t\tprepare_drawing();\r\n\t\tgui_adjust_coord(x,y);\r\n\t\tgui_drawpixel_checked(x, y, color);\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n// r,g,b = gui.getpixel(x,y)\r\nDEFINE_LUA_FUNCTION(gui_getpixel, \"x,y\")\r\n{\r\n\tprepare_reading();\r\n\r\n\tint x = luaL_checkinteger(L,1);\r\n\tint y = luaL_checkinteger(L,2);\r\n\r\n\tu32 color = gui_adjust_coord_and_getpixel(x,y);\r\n\r\n\tint b = (color & 0x000000FF);\r\n\tint g = (color & 0x0000FF00) >> 8;\r\n\tint r = (color & 0x00FF0000) >> 16;\r\n\r\n\tlua_pushinteger(L, r);\r\n\tlua_pushinteger(L, g);\r\n\tlua_pushinteger(L, b);\r\n\r\n\treturn 3;\r\n}\r\nDEFINE_LUA_FUNCTION(gui_line, \"x1,y1,x2,y2[,color=\\\"white\\\"[,skipfirst=false]]\")\r\n{\r\n\tint x1 = luaL_checkinteger(L,1); // have to check for errors before deferring\r\n\tint y1 = luaL_checkinteger(L,2);\r\n\tint x2 = luaL_checkinteger(L,3);\r\n\tint y2 = luaL_checkinteger(L,4);\r\n\r\n\tif(DeferGUIFuncIfNeeded(L))\r\n\t\treturn 0;\r\n\r\n\tint color = getcolor(L,5,0xFFFFFFFF);\r\n\tint skipFirst = lua_toboolean(L,6);\r\n\r\n\tif(!(color & 0xFF))\r\n\t\treturn 0;\r\n\r\n\tprepare_drawing();\r\n\trestrict_to_screen(y1);\r\n\tgui_adjust_coord(x1,y1);\r\n\tgui_adjust_coord(x2,y2);\r\n\r\n\tif(!gui_checkbox(x1,y1,x2,y2))\r\n\t\treturn 0;\r\n\r\n\tgui_drawline_internal(x2, y2, x1, y1, !skipFirst, color);\r\n\r\n\treturn 0;\r\n}\r\n\r\n// gui.opacity(number alphaValue)\r\n// sets the transparency of subsequent draw calls\r\n// 0.0 is completely transparent, 1.0 is completely opaque\r\n// non-integer values are supported and meaningful, as are values greater than 1.0\r\n// it is not necessary to use this function to get transparency (or the less-recommended gui.transparency() either),\r\n// because you can provide an alpha value in the color argument of each draw call.\r\n// however, it can be convenient to be able to globally modify the drawing transparency\r\nDEFINE_LUA_FUNCTION(gui_setopacity, \"alpha_0_to_1\")\r\n{\r\n\tlua_Number opacF = luaL_checknumber(L,1);\r\n\topacF *= 255.0;\r\n\tif(opacF < 0) opacF = 0;\r\n\tint opac;\r\n\tlua_number2int(opac, opacF);\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tinfo.transparencyModifier = opac;\r\n\treturn 0;\r\n}\r\n\r\n// gui.transparency(number transparencyValue)\r\n// sets the transparency of subsequent draw calls\r\n// 0.0 is completely opaque, 4.0 is completely transparent\r\n// non-integer values are supported and meaningful, as are values less than 0.0\r\n// this is a legacy function, and the range is from 0 to 4 solely for this reason\r\n// it does the exact same thing as gui.opacity() but with a different argument range\r\nDEFINE_LUA_FUNCTION(gui_settransparency, \"transparency_4_to_0\")\r\n{\r\n\tlua_Number transp = luaL_checknumber(L,1);\r\n\tlua_Number opacF = 4 - transp;\r\n\topacF *= 255.0 / 4.0;\r\n\tif(opacF < 0) opacF = 0;\r\n\tint opac;\r\n\tlua_number2int(opac, opacF);\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tinfo.transparencyModifier = opac;\r\n\treturn 0;\r\n}\r\n\r\n// takes a screenshot and returns it in gdstr format\r\n// example: gd.createFromGdStr(gui.gdscreenshot()):png(\"outputimage.png\")\r\nDEFINE_LUA_FUNCTION(gui_gdscreenshot, \"[whichScreen='both']\")\r\n{\r\n\tprepare_reading();\r\n\r\n\tint selectedScreen = 0;\r\n\tif(lua_isboolean(L, 1))\r\n\t\tselectedScreen = lua_toboolean(L, 1) ? 1 : -1;\r\n\telse if(lua_isnumber(L, 1))\r\n\t\tselectedScreen = lua_tointeger(L, 1);\r\n\telse if(lua_isstring(L, 1))\r\n\t{\r\n\t\tconst char* str = lua_tostring(L, 1);\r\n\t\tif(!stricmp(str,\"top\"))\r\n\t\t\tselectedScreen = -1;\r\n\t\tif(!stricmp(str,\"bottom\"))\r\n\t\t\tselectedScreen = 1;\r\n\t}\r\n\trestrict_to_screen(selectedScreen);\r\n\r\n\tint width = curGuiData.xMax - curGuiData.xMin;\r\n\tint height = curGuiData.yMax - curGuiData.yMin;\r\n\tint size = 11 + width * height * 4;\r\n\r\n\tchar* str = new char[size+1]; // TODO: use _alloca instead (but I don't know which compilers support it)\r\n\tstr[size] = 0;\r\n\tunsigned char* ptr = (unsigned char*)str;\r\n\r\n\t// GD format header for truecolor image (11 bytes)\r\n\t*ptr++ = (65534 >> 8) & 0xFF;\r\n\t*ptr++ = (65534     ) & 0xFF;\r\n\t*ptr++ = (width >> 8) & 0xFF;\r\n\t*ptr++ = (width     ) & 0xFF;\r\n\t*ptr++ = (height >> 8) & 0xFF;\r\n\t*ptr++ = (height     ) & 0xFF;\r\n\t*ptr++ = 1;\r\n\t*ptr++ = 255;\r\n\t*ptr++ = 255;\r\n\t*ptr++ = 255;\r\n\t*ptr++ = 255;\r\n\r\n\tu8* Src = (u8*)curGuiData.data + (curGuiData.stridePix*4) * curGuiData.yMin;\r\n\r\n\tfor(int y = curGuiData.yMin; y < curGuiData.yMax; y++, Src += curGuiData.stridePix*4)\r\n\t{\r\n\t\tfor(int x = curGuiData.xMin; x < curGuiData.xMax; x++)\r\n\t\t{\r\n\t\t\t*ptr++ = 0 /* (255 - Src[4*x+3]) / 2 */; // alpha (0-127, 0=opaque, 127=transparent)\r\n\t\t\t*ptr++ = Src[4*x+2];\r\n\t\t\t*ptr++ = Src[4*x+1];\r\n\t\t\t*ptr++ = Src[4*x+0];\r\n\t\t}\r\n\t}\r\n\r\n\tlua_pushlstring(L, str, size);\r\n\tdelete[] str;\r\n\treturn 1;\r\n}\r\n\r\n// draws a gd image that's in gdstr format to the screen\r\n// example: gui.gdoverlay(gd.createFromPng(\"myimage.png\"):gdStr())\r\nDEFINE_LUA_FUNCTION(gui_gdoverlay, \"[dx=0,dy=0,]gdimage[,sx=0,sy=0,width,height][,alphamul]\")\r\n{\r\n\tint xStartDst = 0;\r\n\tint yStartDst = 0;\r\n\tint xStartSrc = 0;\r\n\tint yStartSrc = 0;\r\n\tint width, height;\r\n\tint numArgs = lua_gettop(L);\r\n\r\n\tint index = 1;\r\n\tif(lua_type(L,index) == LUA_TNUMBER)\r\n\t{\r\n\t\txStartDst = lua_tointeger(L,index++);\r\n\t\tif(lua_type(L,index) == LUA_TNUMBER)\r\n\t\t\tyStartDst = lua_tointeger(L,index++);\r\n\t}\r\n\r\n\tluaL_checktype(L,index,LUA_TSTRING); // have to check for errors before deferring\r\n\r\n\tif(DeferGUIFuncIfNeeded(L))\r\n\t\treturn 0;\r\n\r\n\tconst unsigned char* ptr = (const unsigned char*)lua_tostring(L,index++);\r\n\r\n\tconst bool defSrcRect = ((numArgs - index + 1) < 2);\r\n\tif (!defSrcRect) {\r\n\t\txStartSrc = luaL_checkinteger(L, index++);\r\n\t\tyStartSrc = luaL_checkinteger(L, index++);\r\n\t\twidth = luaL_checkinteger(L, index++);\r\n\t\theight = luaL_checkinteger(L, index++);\r\n\t}\r\n\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tint alphaMul = info.transparencyModifier;\r\n\tif(lua_isnumber(L, index))\r\n\t\talphaMul = (int)(alphaMul * lua_tonumber(L, index++));\r\n\tif(alphaMul <= 0)\r\n\t\treturn 0;\r\n\r\n\t// since there aren't that many possible opacity levels,\r\n\t// do the opacity modification calculations beforehand instead of per pixel\r\n\tint opacMap[256];\r\n\tfor(int i = 0; i < 128; i++)\r\n\t{\r\n\t\tint opac = 255 - ((i << 1) | (i & 1)); // gdAlphaMax = 127, not 255\r\n\t\topac = (opac * alphaMul) / 255;\r\n\t\tif(opac < 0) opac = 0;\r\n\t\tif(opac > 255) opac = 255;\r\n\t\topacMap[i] = opac;\r\n\t}\r\n\tfor(int i = 128; i < 256; i++)\r\n\t\topacMap[i] = 0; // what should we do for them, actually?\r\n\r\n\t// GD format header for truecolor image (11 bytes)\r\n\tptr++;\r\n\tbool trueColor = (*ptr++ == 254);\r\n\tint gdWidth = *ptr++ << 8;\r\n\tgdWidth |= *ptr++;\r\n\tint gdHeight = *ptr++ << 8;\r\n\tgdHeight |= *ptr++;\r\n\tint bytespp = (trueColor ? 4 : 1);\r\n\tif (defSrcRect) {\r\n\t\twidth = gdWidth;\r\n\t\theight = gdHeight;\r\n\t}\r\n\r\n\tif ((!trueColor && *ptr) || (trueColor && !*ptr)) {\r\n\t\tluaL_error(L, \"gdoverlay: inconsistent color type.\");\r\n\t\treturn 0;\r\n\t}\r\n\tptr++;\r\n\tint colorsTotal = 0;\r\n\tif (!trueColor) {\r\n\t\tcolorsTotal = *ptr++ << 8;\r\n\t\tcolorsTotal |= *ptr++;\r\n\t}\r\n\tint transparent = *ptr++ << 24;\r\n\ttransparent |= *ptr++ << 16;\r\n\ttransparent |= *ptr++ << 8;\r\n\ttransparent |= *ptr++;\r\n\tstruct { int r, g, b, a; } pal[256];\r\n\tif (!trueColor) for (int i = 0; i < 256; i++) {\r\n\t\tpal[i].r = *ptr++;\r\n\t\tpal[i].g = *ptr++;\r\n\t\tpal[i].b = *ptr++;\r\n\t\tpal[i].a = opacMap[*ptr++];\r\n\t}\r\n\r\n\tprepare_drawing();\r\n\tu8* Dst = (u8*)curGuiData.data;\r\n\tgui_adjust_coord(xStartDst,yStartDst);\r\n\r\n\tint xMin = curGuiData.xMin;\r\n\tint yMin = curGuiData.yMin;\r\n\tint xMax = curGuiData.xMax - 1;\r\n\tint yMax = curGuiData.yMax - 1;\r\n\tint strideBytes = curGuiData.stridePix * 4;\r\n\r\n\t// limit source rect\r\n\tif (xStartSrc < 0) {\r\n\t\twidth += xStartSrc;\r\n\t\txStartDst -= xStartSrc;\r\n\t\txStartSrc = 0;\r\n\t}\r\n\tif (yStartSrc < 0) {\r\n\t\theight += yStartSrc;\r\n\t\tyStartDst -= yStartSrc;\r\n\t\tyStartSrc = 0;\r\n\t}\r\n\tif (xStartSrc + width >= gdWidth)\r\n\t\twidth = gdWidth - xStartSrc;\r\n\tif (yStartSrc+height >= gdHeight)\r\n\t\theight = gdHeight - yStartSrc;\r\n\tif (width <= 0 || height <= 0)\r\n\t\treturn 0;\r\n\tptr += (yStartSrc * gdWidth + xStartSrc) * bytespp;\r\n\r\n\tDst += yStartDst * strideBytes;\r\n\tfor(int y = yStartDst; y < height+yStartDst && y < yMax; y++, Dst += strideBytes)\r\n\t{\r\n\t\tif(y < yMin)\r\n\t\t\tptr += gdWidth * bytespp;\r\n\t\telse\r\n\t\t{\r\n\t\t\tint xA = (xStartDst < xMin ? xMin : xStartDst);\r\n\t\t\tint xB = (xStartDst+width > xMax ? xMax : xStartDst+width);\r\n\t\t\tptr += (xA - xStartDst) * bytespp;\r\n\t\t\tfor(int x = xA; x < xB; x++)\r\n\t\t\t{\r\n\t\t\t\tif (trueColor) {\r\n\t\t\t\t\tint opac = opacMap[ptr[0]];\r\n\t\t\t\t\tu32 pix = (opac|(ptr[3]<<8)|(ptr[2]<<16)|(ptr[1]<<24));\r\n\t\t\t\t\tblend32((u32*)(Dst+x*4), pix);\r\n\t\t\t\t\tptr += 4;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tint palNo = ptr[0];\r\n\t\t\t\t\tu32 pix = (pal[palNo].a|(pal[palNo].b<<8)|(pal[palNo].g<<16)|(pal[palNo].r<<24));\r\n\t\t\t\t\tblend32((u32*)(Dst+x*4), pix);\r\n\t\t\t\t\tptr++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tptr += (gdWidth - (xB - xStartDst)) * bytespp;\r\n\t\t}\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic void GetCurrentScriptDir(char* buffer, int bufLen)\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tstrncpy(buffer, info.lastFilename.c_str(), bufLen);\r\n\tbuffer[bufLen-1] = 0;\r\n\tchar* slash = std::max(strrchr(buffer, '/'), strrchr(buffer, '\\\\'));\r\n\tif(slash)\r\n\t\tslash[1] = 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_openscript, \"filename\")\r\n{\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\tchar curScriptDir[1024]; GetCurrentScriptDir(curScriptDir, 1024); // make sure we can always find scripts that are in the same directory as the current script\r\n\tconst char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL;\r\n\textern const char* OpenLuaScript(const char* filename, const char* extraDirToCheck, bool makeSubservient);\r\n\tconst char* errorMsg = OpenLuaScript(filename, curScriptDir, true);\r\n\tif(errorMsg)\r\n\t\tluaL_error(L, errorMsg);\r\n#endif\r\n    return 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_reset, \"\")\r\n{\r\n\textern bool _HACK_DONT_STOPMOVIE;\r\n\t_HACK_DONT_STOPMOVIE = true;\r\n\tNDS_Reset();\r\n\t_HACK_DONT_STOPMOVIE = false;\r\n\treturn 0;\r\n}\r\n\r\nstatic bool IsLuaMenuItem(PlatformMenuItem menuItem)\r\n{\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\treturn (menuItem >= IDC_LUAMENU_RESERVE_START && menuItem <= IDC_LUAMENU_RESERVE_END);\r\n#else\r\n\treturn false;\r\n#endif\r\n}\r\n\r\nstatic bool SearchFreeMenuItem(PlatformMenu menu, PlatformMenuItem& menuItem)\r\n{\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\tfor (UINT menuItemId = IDC_LUAMENU_RESERVE_START; menuItemId <= IDC_LUAMENU_RESERVE_END; menuItemId++)\r\n\t{\r\n\t\tMENUITEMINFO mii;\r\n\t\tZeroMemory(&mii, sizeof(MENUITEMINFO));\r\n\t\tmii.cbSize = sizeof(MENUITEMINFO);\r\n\t\tmii.fMask = MIIM_ID;\r\n\t\tif (!GetMenuItemInfo(menu, menuItemId, FALSE, &mii) &&\r\n\t\t\tGetLastError() == ERROR_MENU_ITEM_NOT_FOUND)\r\n\t\t{\r\n\t\t\tmenuItem = menuItemId;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n#else\r\n\treturn false;\r\n#endif\r\n}\r\n\r\nstatic PlatformMenu AddSubMenu(PlatformMenu topMenu, PlatformMenu menu, const char* menuName)\r\n{\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tMENUITEMINFO mii;\r\n\r\n\t// search existing submenu\r\n\tfor (int index = 0; index < GetMenuItemCount(menu); index++)\r\n\t{\r\n\t\tZeroMemory(&mii, sizeof(MENUITEMINFO));\r\n\t\tmii.cbSize = sizeof(MENUITEMINFO);\r\n\t\tmii.fMask = MIIM_ID | MIIM_SUBMENU | MIIM_STRING;\r\n\t\tconst UINT bufferSize = 128;\r\n\t\tTCHAR menuItemText[bufferSize];\r\n\t\tmii.dwTypeData = menuItemText;\r\n\t\tmii.cch = bufferSize;\r\n\t\tGetMenuItemInfo(menu, index, TRUE, &mii);\r\n\r\n\t\t// if exists, return it\r\n\t\tif (mii.hSubMenu != NULL && lstrcmp(menuName, mii.dwTypeData) == 0)\r\n\t\t{\r\n\t\t\tif (IsLuaMenuItem(mii.wID))\r\n\t\t\t{\r\n\t\t\t\tinfo.menuData.subMenuData.push_back(LuaSubMenuData(menu, mii.hSubMenu, mii.wID));\r\n\t\t\t}\r\n\t\t\treturn mii.hSubMenu;\r\n\t\t}\r\n\t}\r\n\r\n\t// add new submenu\r\n\tUINT subMenuId;\r\n\tif (!SearchFreeMenuItem(topMenu, subMenuId))\r\n\t{\r\n\t\treturn NULL;\r\n\t}\r\n\tZeroMemory(&mii, sizeof(MENUITEMINFO));\r\n\tmii.cbSize = sizeof(MENUITEMINFO);\r\n\tmii.fMask = MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;\r\n\tmii.fType = MFT_STRING;\r\n\tmii.fState = MFS_ENABLED;\r\n\tmii.wID = subMenuId;\r\n\tmii.hSubMenu = CreatePopupMenu();\r\n\tmii.dwTypeData = (char*) menuName;\r\n\tif (!InsertMenuItem(menu, (UINT)-1, TRUE, &mii))\r\n\t{\r\n\t\tif (mii.hSubMenu != NULL)\r\n\t\t{\r\n\t\t\tDestroyMenu(mii.hSubMenu);\r\n\t\t}\r\n\t\treturn NULL;\r\n\t}\r\n\tinfo.menuData.subMenuData.push_back(LuaSubMenuData(menu, mii.hSubMenu, subMenuId));\r\n\treturn mii.hSubMenu;\r\n#else\r\n\treturn 0;\r\n#endif\r\n}\r\n\r\nbool AddMenuEntries(PlatformMenu topMenu, PlatformMenu menu)\r\n{\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tlua_State* L = info.L;\r\n\tluaL_checktype(L, -1, LUA_TTABLE);\r\n\tluaL_checkstack(L, 6, \"\");\r\n\r\n\t// for index = 1, #menuEntries\r\n\tunsigned int count = lua_objlen(L, -1);\r\n\tfor (unsigned int index = 1; index <= count; index++)\r\n\t{\r\n\t\t// switch(type(menuEntries[index]))\r\n\t\tlua_rawgeti(L, -1, index);\r\n\t\tif (lua_isnil(L, -1))\r\n\t\t{\r\n\t\t\tUINT menuItem;\r\n\t\t\tif (!SearchFreeMenuItem(topMenu, menuItem))\r\n\t\t\t{\r\n\t\t\t\tluaL_error(L, \"too many menu items\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tMENUITEMINFO mii;\r\n\t\t\tZeroMemory(&mii, sizeof(MENUITEMINFO));\r\n\t\t\tmii.cbSize = sizeof(MENUITEMINFO);\r\n\t\t\tmii.fMask = MIIM_ID | MIIM_FTYPE;\r\n\t\t\tmii.wID = menuItem;\r\n\t\t\tmii.fType = MFT_SEPARATOR;\r\n\t\t\tif (!InsertMenuItem(menu, menuItem, FALSE, &mii))\r\n\t\t\t{\r\n\t\t\t\tluaL_error(L, \"menu item addition failed\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tinfo.menuData.menuItemMap.insert(map<PlatformMenuItem, PlatformMenu>::value_type(menuItem, menu));\r\n\t\t\tlua_pop(L, 1);\r\n\t\t}\r\n\t\telse if (lua_istable(L, -1))\r\n\t\t{\r\n\t\t\tlua_rawgeti(L, -1, 1);\r\n\t\t\tconst char* menuName = luaL_checkstring(L, -1);\r\n\t\t\tlua_insert(L, -2);\r\n\r\n\t\t\tlua_rawgeti(L, -1, 2);\r\n\t\t\tif (lua_isfunction(L, -1))\r\n\t\t\t{\r\n\t\t\t\tUINT menuItem;\r\n\t\t\t\tif (!SearchFreeMenuItem(topMenu, menuItem))\r\n\t\t\t\t{\r\n\t\t\t\t\tluaL_error(L, \"too many menu items\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tMENUITEMINFO mii;\r\n\t\t\t\tZeroMemory(&mii, sizeof(MENUITEMINFO));\r\n\t\t\t\tmii.cbSize = sizeof(MENUITEMINFO);\r\n\t\t\t\tmii.fMask = MIIM_ID | MIIM_STRING;\r\n\t\t\t\tmii.wID = menuItem;\r\n\t\t\t\tmii.dwTypeData = (char*) menuName;\r\n\t\t\t\tif (!InsertMenuItem(menu, menuItem, FALSE, &mii))\r\n\t\t\t\t{\r\n\t\t\t\t\tluaL_error(L, \"menu item addition failed\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tinfo.menuData.menuItemMap.insert(map<PlatformMenuItem, PlatformMenu>::value_type(menuItem, menu));\r\n\r\n\t\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString);\r\n\t\t\t\tlua_insert(L, -2);\r\n\t\t\t\tlua_rawseti(L, -2, menuItem);\r\n\r\n\t\t\t\tlua_pop(L, 3);\r\n\t\t\t}\r\n\t\t\telse if (lua_istable(L, -1))\r\n\t\t\t{\r\n\t\t\t\tHMENU subMenu = AddSubMenu(topMenu, menu, menuName);\r\n\t\t\t\tif (subMenu == NULL)\r\n\t\t\t\t{\r\n\t\t\t\t\tluaL_error(L, \"menu item addition failed\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (!AddMenuEntries(topMenu, subMenu))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tlua_pop(L, 3);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tluaL_typerror(L, -1, \"function or table\");\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tluaL_typerror(L, -1, \"nil or table\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn true;\r\n#else\r\n\treturn false;\r\n#endif\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_addmenu, \"menuName, menuEntries\")\r\n{\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\tint nargs = lua_gettop(L);\r\n\tif (nargs > 1 && !lua_isnil(L, 1))\r\n\t{\r\n\t\tconst char* menuName = luaL_checkstring(L, 1);\r\n\t\tluaL_checktype(L, 2, LUA_TTABLE);\r\n\t\tlua_settop(L, 2); // drop redundant args\r\n\r\n\t\tHMENU menu = mainMenu;\r\n\t\tHMENU subMenu = AddSubMenu(menu, menu, menuName);\r\n\t\tif (subMenu != NULL)\r\n\t\t{\r\n\t\t\tAddMenuEntries(menu, subMenu);\r\n\t\t\tDrawMenuBar(MainWindow->getHWnd());\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tluaL_error(L, \"menu item addition failed\");\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\t//HMENU menu = NULL; // TODO: set popup (right-click) menu\r\n\t\t//int index = (nargs > 1) ? 2 : 1;\r\n\t\t//luaL_checktype(L, index, LUA_TTABLE);\r\n\t\t//lua_settop(L, index); // drop redundant args\r\n\t\t//AddMenuEntries(menu, menu);\r\n\t}\r\n#endif\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_setmenuiteminfo, \"menuItem, infoTable\")\r\n{\r\n\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tluaL_checktype(L, 2, LUA_TTABLE);\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tmap<PlatformMenuItem, PlatformMenu>::iterator it = info.menuData.menuItemMap.begin();\r\n\twhile(it != info.menuData.menuItemMap.end())\r\n\t{\r\n\t\tHMENU menu = (*it).second;\r\n\t\tUINT menuItem = (*it).first;\r\n\t\tlua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString);\r\n\t\tlua_rawgeti(L, -1, menuItem);\r\n\t\tif (lua_rawequal(L, 1, -1) != 0)\r\n\t\t{\r\n\t\t\tMENUITEMINFO mii;\r\n\t\t\tZeroMemory(&mii, sizeof(MENUITEMINFO));\r\n\t\t\tmii.cbSize = sizeof(MENUITEMINFO);\r\n\t\t\tmii.fMask = MIIM_STATE | MIIM_STRING;\r\n\t\t\tGetMenuItemInfo(menu, menuItem, FALSE, &mii);\r\n\r\n\t\t\tmii.fMask = 0;\r\n\r\n\t\t\tlua_getfield(L, 2, \"enabled\");\r\n\t\t\tif (lua_isboolean(L, -1))\r\n\t\t\t{\r\n\t\t\t\tmii.fMask |= MIIM_STATE;\r\n\t\t\t\tif (lua_toboolean(L, -1) != 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmii.fState &= ~MFS_DISABLED;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tmii.fState |= MFS_DISABLED;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (!lua_isnil(L, -1))\r\n\t\t\t{\r\n\t\t\t\tluaL_where(L, 0);\r\n\t\t\t\tluaL_error(L, \"%s bad argument \\\"enabled\\\" (boolean expected, got %s)\",\r\n\t\t\t\t\tluaL_optstring(L, -1, \"\"), luaL_typename(L, -2));\r\n\t\t\t}\r\n\t\t\tlua_pop(L, 1);\r\n\r\n\t\t\tlua_getfield(L, 2, \"checked\");\r\n\t\t\tif (lua_isboolean(L, -1))\r\n\t\t\t{\r\n\t\t\t\tmii.fMask |= MIIM_STATE;\r\n\t\t\t\tif (lua_toboolean(L, -1) != 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmii.fState |= MFS_CHECKED;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tmii.fState &= ~MFS_CHECKED;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (!lua_isnil(L, -1))\r\n\t\t\t{\r\n\t\t\t\tluaL_where(L, 0);\r\n\t\t\t\tluaL_error(L, \"%s bad argument \\\"checked\\\" (boolean expected, got %s)\",\r\n\t\t\t\t\tluaL_optstring(L, -1, \"\"), luaL_typename(L, -2));\r\n\t\t\t}\r\n\t\t\tlua_pop(L, 1);\r\n\r\n\t\t\tlua_getfield(L, 2, \"name\");\r\n\t\t\tif (lua_isstring(L, -1))\r\n\t\t\t{\r\n\t\t\t\tmii.fMask |= MIIM_STRING;\r\n\t\t\t\tmii.dwTypeData = (LPSTR) lua_tostring(L, -1);\r\n\t\t\t}\r\n\t\t\telse if (!lua_isnil(L, -1))\r\n\t\t\t{\r\n\t\t\t\tluaL_where(L, 0);\r\n\t\t\t\tluaL_error(L, \"%s bad argument \\\"name\\\" (string expected, got %s)\",\r\n\t\t\t\t\tluaL_optstring(L, -1, \"\"), luaL_typename(L, -2));\r\n\t\t\t}\r\n\t\t\tSetMenuItemInfo(menu, menuItem, FALSE, &mii);\r\n\t\t\tlua_pop(L, 1);\r\n\t\t}\r\n\t\tlua_pop(L, 1);\r\n\t\tit++;\r\n\t}\r\n#endif\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(emu_registermenustart, \"func\")\r\n{\r\n\tif (!lua_isnil(L,1))\r\n\t\tluaL_checktype(L, 1, LUA_TFUNCTION);\r\n\tlua_settop(L,1);\r\n\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONINITMENU]);\r\n\tlua_insert(L,1);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_ONINITMENU]);\r\n\tStopScriptIfFinished(luaStateToUIDMap[L->l_G->mainthread]);\r\n\treturn 1;\r\n}\r\n\r\n// TODO\r\n/*\r\nDEFINE_LUA_FUNCTION(emu_loadrom, \"filename\")\r\n{\r\n\tstruct Temp { Temp() {EnableStopAllLuaScripts(false);} ~Temp() {EnableStopAllLuaScripts(true);}} dontStopScriptsHere;\r\n\tconst char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL;\r\n\tchar curScriptDir[1024]; GetCurrentScriptDir(curScriptDir, 1024);\r\n\tfilename = MakeRomPathAbsolute(filename, curScriptDir);\r\n\tint result = GensLoadRom(filename);\r\n\tif(result <= 0)\r\n\t\tluaL_error(L, \"Failed to load ROM \\\"%s\\\": %s\", filename, result ? \"invalid or unsupported\" : \"cancelled or not found\");\r\n\tCallRegisteredLuaFunctions(LUACALL_ONSTART);\r\n    return 0;\r\n}\r\n*/\r\nDEFINE_LUA_FUNCTION(emu_getframecount, \"\")\r\n{\r\n\tlua_pushinteger(L, currFrameCounter);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_getlagcount, \"\")\r\n{\r\n\tlua_pushinteger(L, TotalLagFrames);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_lagged, \"\")\r\n{\r\n\tlua_pushboolean(L, LagFrameFlag);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_emulating, \"\")\r\n{\r\n\tlua_pushboolean(L, driver->EMU_HasEmulationStarted());\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_atframeboundary, \"\")\r\n{\r\n\tlua_pushboolean(L, driver->EMU_IsAtFrameBoundary());\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_getlength, \"\")\r\n{\r\n\tlua_pushinteger(L, currMovieData.records.size());\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_isactive, \"\")\r\n{\r\n\tlua_pushboolean(L, movieMode != MOVIEMODE_INACTIVE);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_rerecordcount, \"\")\r\n{\r\n\tlua_pushinteger(L, currMovieData.rerecordCount);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_setrerecordcount, \"\")\r\n{\r\n\tcurrMovieData.rerecordCount = luaL_checkinteger(L, 1);\r\n\treturn 0;\r\n}\r\nDEFINE_LUA_FUNCTION(emu_rerecordcounting, \"[enabled]\")\r\n{\r\n\tLuaContextInfo& info = GetCurrentInfo();\r\n\tif(lua_gettop(L) == 0)\r\n\t{\r\n\t\t// if no arguments given, return the current value\r\n\t\tlua_pushboolean(L, !info.rerecordCountingDisabled);\r\n\t\treturn 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\t// set rerecord disabling\r\n\t\tinfo.rerecordCountingDisabled = !lua_toboolean(L,1);\r\n\t\treturn 0;\r\n\t}\r\n}\r\nDEFINE_LUA_FUNCTION(movie_getreadonly, \"\")\r\n{\r\n\tlua_pushboolean(L, movie_readonly);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_setreadonly, \"readonly\")\r\n{\r\n\tmovie_readonly = lua_toboolean(L,1) != 0;\r\n\r\n//\telse if(!movie_readonly)\r\n//\t\tluaL_error(L, \"movie.setreadonly failed: write permission denied\");\r\n\r\n\treturn 0;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_isrecording, \"\")\r\n{\r\n\tlua_pushboolean(L, movieMode == MOVIEMODE_RECORD);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_isplaying, \"\")\r\n{\r\n\tlua_pushboolean(L, movieMode == MOVIEMODE_PLAY);\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_getmode, \"\")\r\n{\r\n\tswitch(movieMode)\r\n\t{\r\n\tcase MOVIEMODE_PLAY:\r\n\t\tlua_pushstring(L, \"playback\");\r\n\t\tbreak;\r\n\tcase MOVIEMODE_RECORD:\r\n\t\tlua_pushstring(L, \"record\");\r\n\t\tbreak;\r\n\tcase MOVIEMODE_INACTIVE:\r\n\t\tlua_pushstring(L, \"inactive\");\r\n\t\tbreak;\r\n\tcase MOVIEMODE_FINISHED:\r\n\t\tlua_pushstring(L, \"finished\");\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tlua_pushnil(L);\r\n\t\tbreak;\r\n\t}\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_getname, \"\")\r\n{\r\n\textern char curMovieFilename[512];\r\n\tlua_pushstring(L, curMovieFilename);\r\n\treturn 1;\r\n}\r\n// movie.play() -- plays a movie of the user's choice\r\n// movie.play(filename) -- starts playing a particular movie\r\n// throws an error (with a description) if for whatever reason the movie couldn't be played\r\nDEFINE_LUA_FUNCTION(movie_play, \"[filename]\")\r\n{\r\n\tconst char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL;\r\n\tconst char* errorMsg = FCEUI_LoadMovie(filename, true, false, 0);\r\n\tif(errorMsg)\r\n\t\tluaL_error(L, errorMsg);\r\n    return 0;\r\n}\r\nDEFINE_LUA_FUNCTION(movie_replay, \"\")\r\n{\r\n\tif(movieMode == MOVIEMODE_INACTIVE)\r\n\t\treturn 0;\r\n\tlua_settop(L, 0);\r\n\textern char curMovieFilename[512];\r\n\tlua_pushstring(L, curMovieFilename);\r\n\treturn movie_play(L);\r\n}\r\nDEFINE_LUA_FUNCTION(movie_close, \"\")\r\n{\r\n\tFCEUI_StopMovie();\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(sound_clear, \"\")\r\n{\r\n\tSPU_ClearOutputBuffer();\r\n\treturn 0;\r\n}\r\n\r\n#if defined(_WIN32) && !defined(WXPORT)\r\nconst char* s_keyToName[256] =\r\n{\r\n\tNULL,\r\n\t\"leftclick\",\r\n\t\"rightclick\",\r\n\tNULL,\r\n\t\"middleclick\",\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\t\"backspace\",\r\n\t\"tab\",\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\t\"enter\",\r\n\tNULL,\r\n\tNULL,\r\n\t\"shift\", // 0x10\r\n\t\"control\",\r\n\t\"alt\",\r\n\t\"pause\",\r\n\t\"capslock\",\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\t\"escape\",\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\t\"space\", // 0x20\r\n\t\"pageup\",\r\n\t\"pagedown\",\r\n\t\"end\",\r\n\t\"home\",\r\n\t\"left\",\r\n\t\"up\",\r\n\t\"right\",\r\n\t\"down\",\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\t\"insert\",\r\n\t\"delete\",\r\n\tNULL,\r\n\t\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\t\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\r\n\t\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\r\n\t\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\t\"numpad0\",\"numpad1\",\"numpad2\",\"numpad3\",\"numpad4\",\"numpad5\",\"numpad6\",\"numpad7\",\"numpad8\",\"numpad9\",\r\n\t\"numpad*\",\"numpad+\",\r\n\tNULL,\r\n\t\"numpad-\",\"numpad.\",\"numpad/\",\r\n\t\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\r\n\t\"F13\",\"F14\",\"F15\",\"F16\",\"F17\",\"F18\",\"F19\",\"F20\",\"F21\",\"F22\",\"F23\",\"F24\",\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\tNULL,\r\n\t\"numlock\",\r\n\t\"scrolllock\",\r\n\tNULL, // 0x92\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\tNULL, // 0xB9\r\n\t\"semicolon\",\r\n\t\"plus\",\r\n\t\"comma\",\r\n\t\"minus\",\r\n\t\"period\",\r\n\t\"slash\",\r\n\t\"tilde\",\r\n\tNULL, // 0xC1\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\tNULL, NULL, NULL, NULL, NULL, NULL, NULL,\r\n\tNULL, // 0xDA\r\n\t\"leftbracket\",\r\n\t\"backslash\",\r\n\t\"rightbracket\",\r\n\t\"quote\",\r\n};\r\n#endif\r\n\r\n\r\n// input.get()\r\n// takes no input, returns a lua table of entries representing the current input state,\r\n// independent of the joypad buttons the emulated game thinks are pressed\r\n// for example:\r\n//   if the user is holding the W key and the left mouse button\r\n//   and has the mouse at the bottom-right corner of the game screen,\r\n//   then this would return {W=true, leftclick=true, xmouse=319, ymouse=223}\r\nDEFINE_LUA_FUNCTION(input_getcurrentinputstatus, \"\")\r\n{\r\n\tlua_newtable(L);\r\n\r\n#if defined(_WIN32) && !defined(WXPORT)\r\n\t// keyboard and mouse button status\r\n\t{\r\n\t\textern bool allowBackgroundInput;\r\n\r\n\t\tunsigned char keys [256];\r\n\t\tif(!allowBackgroundInput)\r\n\t\t{\r\n\t\t\tif(GetKeyboardState(keys))\r\n\t\t\t{\r\n\t\t\t\tfor(int i = 1; i < 255; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tint mask = (i == VK_CAPITAL || i == VK_NUMLOCK || i == VK_SCROLL) ? 0x01 : 0x80;\r\n\t\t\t\t\tif(keys[i] & mask)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tconst char* name = s_keyToName[i];\r\n\t\t\t\t\t\tif(name)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tlua_pushboolean(L, true);\r\n\t\t\t\t\t\t\tlua_setfield(L, -2, name);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse // use a slightly different method that will detect background input:\r\n\t\t{\r\n\t\t\tfor(int i = 1; i < 255; i++)\r\n\t\t\t{\r\n\t\t\t\tconst char* name = s_keyToName[i];\r\n\t\t\t\tif(name)\r\n\t\t\t\t{\r\n\t\t\t\t\tint active;\r\n\t\t\t\t\tif(i == VK_CAPITAL || i == VK_NUMLOCK || i == VK_SCROLL)\r\n\t\t\t\t\t\tactive = GetKeyState(i) & 0x01;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tactive = GetAsyncKeyState(i) & 0x8000;\r\n\t\t\t\t\tif(active)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlua_pushboolean(L, true);\r\n\t\t\t\t\t\tlua_setfield(L, -2, name);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// mouse position in game screen pixel coordinates\r\n\t{\r\n\t\tvoid UnscaleScreenCoords(s32& x, s32& y);\r\n\t\tvoid ToDSScreenRelativeCoords(s32& x, s32& y, int bottomScreen);\r\n\r\n\t\tPOINT point;\r\n\t\tGetCursorPos(&point);\r\n\t\tScreenToClient(MainWindow->getHWnd(), &point);\r\n\t\ts32 x (point.x);\r\n\t\ts32 y (point.y);\r\n\r\n\t\tUnscaleScreenCoords(x,y);\r\n\t\tToDSScreenRelativeCoords(x,y,1);\r\n\r\n\t\tlua_pushinteger(L, x);\r\n\t\tlua_setfield(L, -2, \"xmouse\");\r\n\t\tlua_pushinteger(L, y);\r\n\t\tlua_setfield(L, -2, \"ymouse\");\r\n\t}\r\n\r\n\tworry(L,10);\r\n#else\r\n\t// NYI (well, return an empty table)\r\n#endif\r\n\r\n\treturn 1;\r\n}\r\n\r\n\r\n// resets our \"worry\" counter of the Lua state\r\nint dontworry(LuaContextInfo& info)\r\n{\r\n\tif(info.stopWorrying)\r\n\t{\r\n\t\tinfo.stopWorrying = false;\r\n\t\tif(info.worryCount)\r\n\t\t\tindicateBusy(info.L, false);\r\n\t}\r\n\tinfo.worryCount = 0;\r\n\treturn 0;\r\n}\r\n\r\n//agg basic shapes\r\n//TODO polygon and polyline, maybe the overloads for roundedRect and curve\r\n\r\n#include \"aggdraw.h\"\r\n\r\nstatic int line(lua_State *L) {\r\n\r\n\tdouble x1,y1,x2,y2;\r\n\tx1 = luaL_checknumber(L,1) + 0.5;\r\n\ty1 = luaL_checknumber(L,2) + 0.5;\r\n\tx2 = luaL_checknumber(L,3) + 0.5;\r\n\ty2 = luaL_checknumber(L,4) + 0.5;\r\n\r\n\taggDraw.hud->line(x1, y1, x2, y2);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int triangle(lua_State *L) {\r\n\r\n\tdouble x1,y1,x2,y2,x3,y3;\r\n\tx1 = luaL_checknumber(L,1) + 0.5;\r\n\ty1 = luaL_checknumber(L,2) + 0.5;\r\n\tx2 = luaL_checknumber(L,3) + 0.5;\r\n\ty2 = luaL_checknumber(L,4) + 0.5;\r\n\tx3 = luaL_checknumber(L,5) + 0.5;\r\n\ty3 = luaL_checknumber(L,6) + 0.5;\r\n\r\n\taggDraw.hud->triangle(x1, y1, x2, y2, x3, y3);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int rectangle(lua_State *L) {\r\n\r\n\tdouble x1,y1,x2,y2;\r\n\tx1 = luaL_checknumber(L,1) + 0.5;\r\n\ty1 = luaL_checknumber(L,2) + 0.5;\r\n\tx2 = luaL_checknumber(L,3) + 0.5;\r\n\ty2 = luaL_checknumber(L,4) + 0.5;\r\n\r\n\taggDraw.hud->rectangle(x1, y1, x2, y2);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int roundedRect(lua_State *L) {\r\n\r\n\tdouble x1,y1,x2,y2,r;\r\n\tx1 = luaL_checknumber(L,1) + 0.5;\r\n\ty1 = luaL_checknumber(L,2) + 0.5;\r\n\tx2 = luaL_checknumber(L,3) + 0.5;\r\n\ty2 = luaL_checknumber(L,4) + 0.5;\r\n\tr  = luaL_checknumber(L,5);\r\n\r\n\taggDraw.hud->roundedRect(x1, y1, x2, y2, r);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int ellipse(lua_State *L) {\r\n\r\n\tdouble cx,cy,rx,ry;\r\n\tcx = luaL_checknumber(L,1) + 0.5;\r\n\tcy = luaL_checknumber(L,2) + 0.5;\r\n\trx = luaL_checknumber(L,3);\r\n\try = luaL_checknumber(L,4);\r\n\r\n\taggDraw.hud->ellipse(cx, cy, rx, ry);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int arc(lua_State *L) {\r\n\r\n\tdouble cx,cy,rx,ry,start,sweep;\r\n\tcx = luaL_checknumber(L,1) + 0.5;\r\n\tcy = luaL_checknumber(L,2) + 0.5;\r\n\trx = luaL_checknumber(L,3);\r\n\try = luaL_checknumber(L,4);\r\n\tstart = luaL_checknumber(L,5);\r\n\tsweep = luaL_checknumber(L,6);\r\n\r\n\taggDraw.hud->arc(cx, cy,rx, ry, start, sweep);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int star(lua_State *L) {\r\n\r\n\tdouble cx,cy,r1,r2,startAngle;\r\n\tint numRays;\r\n\tcx = luaL_checknumber(L,1) + 0.5;\r\n\tcy = luaL_checknumber(L,2) + 0.5;\r\n\tr1 = luaL_checknumber(L,3);\r\n\tr2 = luaL_checknumber(L,4);\r\n\tstartAngle = luaL_checknumber(L,5);\r\n\tnumRays = luaL_checkinteger(L,6);\r\n\r\n\taggDraw.hud->star(cx, cy, r1, r2, startAngle, numRays);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int curve(lua_State *L) {\r\n\r\n\tdouble x1,y1,x2,y2,x3,y3;\r\n\tx1 = luaL_checknumber(L,1) + 0.5;\r\n\ty1 = luaL_checknumber(L,2) + 0.5;\r\n\tx2 = luaL_checknumber(L,3) + 0.5;\r\n\ty2 = luaL_checknumber(L,4) + 0.5;\r\n\tx3 = luaL_checknumber(L,5) + 0.5;\r\n\ty3 = luaL_checknumber(L,6) + 0.5;\r\n\r\n\taggDraw.hud->curve(x1, y1, x2, y2, x3, y3);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic const struct luaL_reg aggbasicshapes [] =\r\n{\r\n\t{\"line\", line},\r\n\t{\"triangle\", triangle},\r\n\t{\"rectangle\", rectangle},\r\n\t{\"roundedRect\", roundedRect},\r\n\t{\"ellipse\", ellipse},\r\n\t{\"arc\", arc},\r\n\t{\"star\", star},\r\n\t{\"curve\", curve},\r\n//\t{\"polygon\", polygon},\r\n//\t{\"polyline\", polyline},\r\n\t{NULL, NULL}\r\n};\r\n\r\n//agg general attributes\r\n//TODO missing functions, maybe the missing overloads \r\n\r\nstatic void getColorForAgg(lua_State *L, int&r,int&g,int&b,int&a)\r\n{\r\n\tif(lua_gettop(L) == 1)\r\n\t{\r\n\t\tint color = getcolor(L, 1, 0xFF);\r\n\t\tr = (color & 0xFF000000) >> 24;\r\n\t\tg = (color & 0x00FF0000) >> 16;\r\n\t\tb = (color & 0x0000FF00) >> 8;\r\n\t\ta = (color & 0x000000FF);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tr = luaL_optinteger(L,1,255);\r\n\t\tg = luaL_optinteger(L,2,255);\r\n\t\tb = luaL_optinteger(L,3,255);\r\n\t\ta = luaL_optinteger(L,4,255);\r\n\t}\r\n}\r\n\r\nstatic int fillColor(lua_State *L) {\r\n\r\n\tint r,g,b,a;\r\n\tgetColorForAgg(L, r,g,b,a);\r\n\r\n\taggDraw.hud->fillColor(r, g, b, a);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int noFill(lua_State *L) {\r\n\r\n\taggDraw.hud->noFill();\r\n\treturn 0;\r\n}\r\n\r\nstatic int lineColor(lua_State *L) {\r\n\r\n\tint r,g,b,a;\r\n\tgetColorForAgg(L, r,g,b,a);\r\n\r\n\taggDraw.hud->lineColor(r, g, b, a);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int noLine(lua_State *L) {\r\n\r\n\taggDraw.hud->noLine();\r\n\treturn 0;\r\n}\r\n\r\nstatic int lineWidth(lua_State *L) {\r\n\r\n\tdouble w;\r\n\tw = luaL_checknumber(L,1);\r\n\r\n\taggDraw.hud->lineWidth(w);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic const struct luaL_reg agggeneralattributes [] =\r\n{\r\n//\t{\"blendMode\", blendMode},\r\n//\t{\"imageBlendMode\", imageBlendMode},\r\n//\t{\"imageBlendColor\", imageBlendColor},\r\n//\t{\"masterAlpha\", masterAlpha},\r\n//\t{\"antiAliasGamma\", antiAliasGamma},\r\n//\t{\"font\", font},\r\n\t{\"fillColor\", fillColor},\r\n\t{\"noFill\", noFill},\r\n\t{\"lineColor\", lineColor},\r\n\t{\"noLine\", noLine},\r\n//\t{\"fillLinearGradient\", fillLinearGradient},\r\n//\t{\"lineLinearGradient\", lineLinearGradient},\r\n//\t{\"fillRadialGradient\", fillRadialGradient},\r\n//\t{\"lineRadialGradient\", lineRadialGradient},\r\n\t{\"lineWidth\", lineWidth},\r\n//\t{\"lineCap\", lineCap},\r\n//\t{\"lineJoin\", lineJoin},\r\n//\t{\"fillEvenOdd\", fillEvenOdd},\r\n\t{NULL, NULL}\r\n};\r\n\r\nstatic int setFont(lua_State *L) {\r\n\r\n\tconst char *choice;\r\n\tchoice = luaL_checkstring(L,1);\r\n\r\n\taggDraw.hud->setFont(choice);\r\n\treturn 0;\r\n}\r\n\r\nstatic int text(lua_State *L) {\r\n\tint x, y;\r\n\tconst char *choice;\r\n\r\n\tx = luaL_checkinteger(L, 1);\r\n\ty = luaL_checkinteger(L, 2);\r\n\tchoice = luaL_checkstring(L,3);\r\n\r\n\taggDraw.hud->renderTextDropshadowed(x,y,choice);\r\n\treturn 0;\r\n}\r\n\r\nstatic const struct luaL_reg aggcustom [] =\r\n{\r\n\t{\"setFont\", setFont},\r\n\t{\"text\", text},\r\n\t{NULL, NULL}\r\n};\r\n\r\n\r\n// gui.osdtext(int x, int y, string msg)\r\n//\r\n//  Displays the given text on the screen, using the same font and techniques as the\r\n//  main HUD.\r\n//\r\nstatic int gui_osdtext(lua_State *L)\r\n{\r\n\tint x = luaL_checkinteger(L,1); // have to check for errors before deferring\r\n\tint y = luaL_checkinteger(L,2);\r\n\r\n\tif(DeferGUIFuncIfNeeded(L))\r\n\t\treturn 0; // we have to wait until later to call this function because we haven't emulated the next frame yet\r\n\t\t          // (the only way to avoid this deferring is to be in a gui.register or emu.registerafter callback)\r\n\r\n\tconst char* msg = toCString(L,3);\r\n\r\n\tosd->addFixed(x, y, \"%s\", msg);\r\n\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_LUA_FUNCTION(stylus_read, \"\")\r\n{\r\n\t\r\n\tlua_newtable(L);\r\n\r\n\tlua_pushinteger(L, nds.scr_touchX >> 4);\r\n\tlua_setfield(L, -2, \"x\");\r\n\tlua_pushinteger(L, nds.scr_touchY >> 4);\r\n\tlua_setfield(L, -2, \"y\");\r\n\tlua_pushboolean(L, nds.isTouch);\r\n\tlua_setfield(L, -2, \"touch\");\t\r\n\r\n\treturn 1;\r\n}\r\nDEFINE_LUA_FUNCTION(stylus_peek, \"\")\r\n{\r\n\t\r\n\tlua_newtable(L);\r\n\r\n\tlua_pushinteger(L, NDS_getRawUserInput().touch.touchX >> 4);\r\n\tlua_setfield(L, -2, \"x\");\r\n\tlua_pushinteger(L, NDS_getRawUserInput().touch.touchY >> 4);\r\n\tlua_setfield(L, -2, \"y\");\r\n\tlua_pushboolean(L, NDS_getRawUserInput().touch.isTouch?1:0);\r\n\tlua_setfield(L, -2, \"touch\");\t\r\n\r\n\treturn 1;\r\n}\r\nstatic int toTouchValue(int pixCoord, int maximum)\r\n{\r\n\tpixCoord = std::min(std::max(pixCoord, 0), maximum-1);\r\n\treturn (pixCoord << 4) & 0x0FF0;\r\n}\r\nDEFINE_LUA_FUNCTION(stylus_write, \"table\")\r\n{\r\n\tif(movieMode == MOVIEMODE_PLAY) // don't allow tampering with a playing movie's input\r\n\t\treturn 0; // (although it might be useful sometimes...)\r\n\r\n\tif(!NDS_isProcessingUserInput())\r\n\t{\r\n\t\t// defer this function until when we are processing input\r\n\t\tDeferFunctionCall(L, deferredJoySetIDString);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tint index = 1;\r\n\tluaL_checktype(L, index, LUA_TTABLE);\r\n\r\n\tUserTouch& touch = NDS_getProcessingUserInput().touch;\r\n\r\n\tlua_getfield(L, index, \"x\");\r\n\tif (!lua_isnil(L,-1))\r\n\t\ttouch.touchX = toTouchValue(lua_tointeger(L, -1), 256);\r\n\tlua_pop(L, 1);\r\n\r\n\tlua_getfield(L, index, \"y\");\r\n\tif (!lua_isnil(L,-1))\r\n\t\ttouch.touchY = toTouchValue(lua_tointeger(L, -1), 192);\r\n\tlua_pop(L, 1);\r\n\r\n\tlua_getfield(L, index, \"touch\");\r\n\tif (!lua_isnil(L,-1))\r\n\t\ttouch.isTouch = lua_toboolean(L, -1) ? true : false;\r\n\tlua_pop(L, 1);\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int gcEMUFILE_MEMORY(lua_State *L)\r\n{\r\n\tEMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, \"EMUFILE_MEMORY*\");\r\n\tdelete (*ppEmuFile);\r\n\t*ppEmuFile = 0;\r\n\treturn 0;\r\n}\r\n\r\n\r\nstatic const struct luaL_reg styluslib [] =\r\n{\r\n\t{\"get\", stylus_read},\r\n\t{\"peek\", stylus_peek},\r\n\t{\"set\", stylus_write},\r\n\t// alternative names\r\n\t{\"read\", stylus_read},\r\n\t{\"write\", stylus_write},\r\n\t{NULL, NULL}\r\n};\r\n\r\nstatic const struct luaL_reg emulib [] =\r\n{\r\n\t{\"frameadvance\", emu_frameadvance},\r\n\t{\"speedmode\", emu_speedmode},\r\n\t{\"wait\", emu_wait},\r\n\t{\"pause\", emu_pause},\r\n\t{\"unpause\", emu_unpause},\r\n\t{\"emulateframe\", emu_emulateframe},\r\n\t{\"emulateframefastnoskipping\", emu_emulateframefastnoskipping},\r\n\t{\"emulateframefast\", emu_emulateframefast},\r\n\t{\"emulateframeinvisible\", emu_emulateframeinvisible},\r\n\t{\"redraw\", emu_redraw},\r\n\t{\"framecount\", emu_getframecount},\r\n\t{\"lagcount\", emu_getlagcount},\r\n\t{\"lagged\", emu_lagged},\r\n\t{\"emulating\", emu_emulating},\r\n\t{\"atframeboundary\", emu_atframeboundary},\r\n\t{\"registerbefore\", emu_registerbefore},\r\n\t{\"registerafter\", emu_registerafter},\r\n\t{\"registerstart\", emu_registerstart},\r\n\t{\"registerexit\", emu_registerexit},\r\n\t{\"persistglobalvariables\", emu_persistglobalvariables},\r\n\t{\"message\", emu_message},\r\n\t{\"print\", print}, // sure, why not\r\n\t{\"openscript\", emu_openscript},\r\n//\t{\"loadrom\", emu_loadrom},\r\n\t{\"reset\", emu_reset},\r\n\t{\"addmenu\", emu_addmenu},\r\n\t{\"setmenuiteminfo\", emu_setmenuiteminfo},\r\n\t{\"registermenustart\", emu_registermenustart},\r\n\t// alternative names\r\n//\t{\"openrom\", emu_loadrom},\r\n\t{NULL, NULL}\r\n};\r\nstatic const struct luaL_reg guilib [] =\r\n{\r\n\t{\"register\", gui_register},\r\n\t{\"text\", gui_text},\r\n\t{\"box\", gui_box},\r\n\t{\"line\", gui_line},\r\n\t{\"pixel\", gui_pixel},\r\n\t{\"getpixel\", gui_getpixel},\r\n\t{\"opacity\", gui_setopacity},\r\n\t{\"transparency\", gui_settransparency},\r\n\t{\"popup\", gui_popup},\r\n\t{\"parsecolor\", gui_parsecolor},\r\n\t{\"gdscreenshot\", gui_gdscreenshot},\r\n\t{\"gdoverlay\", gui_gdoverlay},\r\n\t{\"redraw\", emu_redraw}, // some people might think of this as more of a GUI function\r\n\t{\"osdtext\", gui_osdtext},\r\n\t// alternative names\r\n\t{\"drawtext\", gui_text},\r\n\t{\"drawbox\", gui_box},\r\n\t{\"drawline\", gui_line},\r\n\t{\"drawpixel\", gui_pixel},\r\n\t{\"setpixel\", gui_pixel},\r\n\t{\"writepixel\", gui_pixel},\r\n\t{\"readpixel\", gui_getpixel},\r\n\t{\"rect\", gui_box},\r\n\t{\"drawrect\", gui_box},\r\n\t{\"drawimage\", gui_gdoverlay},\r\n\t{\"image\", gui_gdoverlay},\r\n\t{NULL, NULL}\r\n};\r\nstatic const struct luaL_reg statelib [] =\r\n{\r\n\t{\"create\", state_create},\r\n\t{\"save\", state_save},\r\n\t{\"load\", state_load},\r\n#ifndef PUBLIC_RELEASE\r\n\t{\"verify\", state_verify}, // for desync catching\r\n#endif\r\n\t// TODO\r\n\t//{\"loadscriptdata\", state_loadscriptdata},\r\n\t//{\"savescriptdata\", state_savescriptdata},\r\n\t//{\"registersave\", state_registersave},\r\n\t//{\"registerload\", state_registerload},\r\n\t{NULL, NULL}\r\n};\r\nstatic const struct luaL_reg memorylib [] =\r\n{\r\n\t{\"readbyte\", memory_readbyte},\r\n\t{\"readbytesigned\", memory_readbytesigned},\r\n\t{\"readword\", memory_readword},\r\n\t{\"readwordsigned\", memory_readwordsigned},\r\n\t{\"readdword\", memory_readdword},\r\n\t{\"readdwordsigned\", memory_readdwordsigned},\r\n\t{\"readbyterange\", memory_readbyterange},\r\n\t{\"writebyte\", memory_writebyte},\r\n\t{\"writeword\", memory_writeword},\r\n\t{\"writedword\", memory_writedword},\r\n\t{\"isvalid\", memory_isvalid},\r\n\t{\"getregister\", memory_getregister},\r\n\t{\"setregister\", memory_setregister},\r\n\t// alternate naming scheme for word and double-word and unsigned\r\n\t{\"readbyteunsigned\", memory_readbyte},\r\n\t{\"readwordunsigned\", memory_readword},\r\n\t{\"readdwordunsigned\", memory_readdword},\r\n\t{\"readshort\", memory_readword},\r\n\t{\"readshortunsigned\", memory_readword},\r\n\t{\"readshortsigned\", memory_readwordsigned},\r\n\t{\"readlong\", memory_readdword},\r\n\t{\"readlongunsigned\", memory_readdword},\r\n\t{\"readlongsigned\", memory_readdwordsigned},\r\n\t{\"writeshort\", memory_writeword},\r\n\t{\"writelong\", memory_writedword},\r\n\r\n\t{\"vram_readword\", vram_readword},\r\n\t{\"vram_writeword\", vram_writeword},\r\n\r\n\t// memory hooks\r\n\t{\"registerwrite\", memory_registerwrite},\r\n\t{\"registerread\", memory_registerread},\r\n\t{\"registerexec\", memory_registerexec},\r\n\t// alternate names\r\n\t{\"register\", memory_registerwrite},\r\n\t{\"registerrun\", memory_registerexec},\r\n\t{\"registerexecute\", memory_registerexec},\r\n\r\n\t{NULL, NULL}\r\n};\r\nstatic const struct luaL_reg joylib [] =\r\n{\r\n\t{\"get\", joy_get},\r\n\t{\"getdown\", joy_getdown},\r\n\t{\"getup\", joy_getup},\r\n\t{\"peek\", joy_peek},\r\n\t{\"peekdown\", joy_peekdown},\r\n\t{\"peekup\", joy_peekup},\r\n\t{\"set\", joy_set},\r\n\t// alternative names\r\n\t{\"read\", joy_get},\r\n\t{\"write\", joy_set},\r\n\t{\"readdown\", joy_getdown},\r\n\t{\"readup\", joy_getup},\r\n\t{NULL, NULL}\r\n};\r\nstatic const struct luaL_reg inputlib [] =\r\n{\r\n\t{\"get\", input_getcurrentinputstatus},\r\n\t{\"registerhotkey\", input_registerhotkey},\r\n\t{\"popup\", input_popup},\r\n\t// alternative names\r\n\t{\"read\", input_getcurrentinputstatus},\r\n\t{NULL, NULL}\r\n};\r\nstatic const struct luaL_reg movielib [] =\r\n{\r\n\t{\"active\", movie_isactive},\r\n\t{\"recording\", movie_isrecording},\r\n\t{\"playing\", movie_isplaying},\r\n\t{\"mode\", movie_getmode},\r\n\r\n\t{\"length\", movie_getlength},\r\n\t{\"name\", movie_getname},\r\n\t{\"rerecordcount\", movie_rerecordcount},\r\n\t{\"setrerecordcount\", movie_setrerecordcount},\r\n\r\n\t{\"rerecordcounting\", emu_rerecordcounting},\r\n\t{\"readonly\", movie_getreadonly},\r\n\t{\"setreadonly\", movie_setreadonly},\r\n\t{\"framecount\", emu_getframecount}, // for those familiar with other emulators that have movie.framecount() instead of emulatorname.framecount()\r\n\r\n\t{\"play\", movie_play},\r\n\t{\"replay\", movie_replay},\r\n\t{\"stop\", movie_close},\r\n\r\n\t// alternative names\r\n\t{\"open\", movie_play},\r\n\t{\"close\", movie_close},\r\n\t{\"getname\", movie_getname},\r\n\t{\"playback\", movie_play},\r\n\t{\"getreadonly\", movie_getreadonly},\r\n\t{NULL, NULL}\r\n};\r\nstatic const struct luaL_reg soundlib [] =\r\n{\r\n\t{\"clear\", sound_clear},\r\n\t{NULL, NULL}\r\n};\r\n\r\nstatic const struct CFuncInfo\r\n{\r\n\tconst char* library;\r\n\tconst char* name;\r\n\tconst char* args;\r\n\tbool registry;\r\n}\r\ncFuncInfo [] = // this info is stored here to avoid having to change all of Lua's libraries to use something like DEFINE_LUA_FUNCTION\r\n{\r\n\t{LUA_STRLIBNAME, \"byte\", \"str[,start[,end]]\"},\r\n\t{LUA_STRLIBNAME, \"char\", \"...[bytes]\"},\r\n\t{LUA_STRLIBNAME, \"dump\", \"func\"},\r\n\t{LUA_STRLIBNAME, \"find\", \"str,pattern[,init[,plain]]\"},\r\n\t{LUA_STRLIBNAME, \"format\", \"formatstring,...\"},\r\n\t{LUA_STRLIBNAME, \"gfind\", \"!deprecated!\"},\r\n\t{LUA_STRLIBNAME, \"gmatch\", \"str,pattern\"},\r\n\t{LUA_STRLIBNAME, \"gsub\", \"str,pattern,repl[,n]\"},\r\n\t{LUA_STRLIBNAME, \"len\", \"str\"},\r\n\t{LUA_STRLIBNAME, \"lower\", \"str\"},\r\n\t{LUA_STRLIBNAME, \"match\", \"str,pattern[,init]\"},\r\n\t{LUA_STRLIBNAME, \"rep\", \"str,n\"},\r\n\t{LUA_STRLIBNAME, \"reverse\", \"str\"},\r\n\t{LUA_STRLIBNAME, \"sub\", \"str,start[,end]\"},\r\n\t{LUA_STRLIBNAME, \"upper\", \"str\"},\r\n\t{NULL, \"module\", \"name[,...]\"},\r\n\t{NULL, \"require\", \"modname\"},\r\n\t{LUA_LOADLIBNAME, \"loadlib\", \"libname,funcname\"},\r\n\t{LUA_LOADLIBNAME, \"seeall\", \"module\"},\r\n\t{LUA_COLIBNAME, \"create\", \"func\"},\r\n\t{LUA_COLIBNAME, \"resume\", \"co[,val1,...]\"},\r\n\t{LUA_COLIBNAME, \"running\", \"\"},\r\n\t{LUA_COLIBNAME, \"status\", \"co\"},\r\n\t{LUA_COLIBNAME, \"wrap\", \"func\"},\r\n\t{LUA_COLIBNAME, \"yield\", \"...\"},\r\n\t{NULL, \"assert\", \"cond[,message]\"},\r\n\t{NULL, \"collectgarbage\", \"opt[,arg]\"},\r\n\t{NULL, \"gcinfo\", \"\"},\r\n\t{NULL, \"dofile\", \"filename\"},\r\n\t{NULL, \"error\", \"message[,level]\"},\r\n\t{NULL, \"getfenv\", \"[level_or_func]\"},\r\n\t{NULL, \"getmetatable\", \"object\"},\r\n\t{NULL, \"ipairs\", \"arraytable\"},\r\n\t{NULL, \"load\", \"func[,chunkname]\"},\r\n\t{NULL, \"loadfile\", \"[filename]\"},\r\n\t{NULL, \"loadstring\", \"str[,chunkname]\"},\r\n\t{NULL, \"next\", \"table[,index]\"},\r\n\t{NULL, \"pairs\", \"table\"},\r\n\t{NULL, \"pcall\", \"func,arg1,...\"},\r\n\t{NULL, \"rawequal\", \"v1,v2\"},\r\n\t{NULL, \"rawget\", \"table,index\"},\r\n\t{NULL, \"rawset\", \"table,index,value\"},\r\n\t{NULL, \"select\", \"index,...\"},\r\n\t{NULL, \"setfenv\", \"level_or_func,envtable\"},\r\n\t{NULL, \"setmetatable\", \"table,metatable\"},\r\n\t{NULL, \"tonumber\", \"str_or_num[,base]\"},\r\n\t{NULL, \"type\", \"obj\"},\r\n\t{NULL, \"unpack\", \"list[,i=1[,j=#list]]\"},\r\n\t{NULL, \"xpcall\", \"func,errhandler\"},\r\n\t{NULL, \"newproxy\", \"hasmeta\"},\r\n\t{LUA_MATHLIBNAME, \"abs\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"acos\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"asin\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"atan\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"atan2\", \"y,x\"},\r\n\t{LUA_MATHLIBNAME, \"ceil\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"cos\", \"rads\"},\r\n\t{LUA_MATHLIBNAME, \"cosh\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"deg\", \"rads\"},\r\n\t{LUA_MATHLIBNAME, \"exp\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"floor\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"fmod\", \"x,y\"},\r\n\t{LUA_MATHLIBNAME, \"frexp\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"ldexp\", \"m,e\"},\r\n\t{LUA_MATHLIBNAME, \"log\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"log10\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"max\", \"x,...\"},\r\n\t{LUA_MATHLIBNAME, \"min\", \"x,...\"},\r\n\t{LUA_MATHLIBNAME, \"modf\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"pow\", \"x,y\"},\r\n\t{LUA_MATHLIBNAME, \"rad\", \"degs\"},\r\n\t{LUA_MATHLIBNAME, \"random\", \"[m[,n]]\"},\r\n\t{LUA_MATHLIBNAME, \"randomseed\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"sin\", \"rads\"},\r\n\t{LUA_MATHLIBNAME, \"sinh\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"sqrt\", \"x\"},\r\n\t{LUA_MATHLIBNAME, \"tan\", \"rads\"},\r\n\t{LUA_MATHLIBNAME, \"tanh\", \"x\"},\r\n\t{LUA_IOLIBNAME, \"close\", \"[file]\"},\r\n\t{LUA_IOLIBNAME, \"flush\", \"\"},\r\n\t{LUA_IOLIBNAME, \"input\", \"[file]\"},\r\n\t{LUA_IOLIBNAME, \"lines\", \"[filename]\"},\r\n\t{LUA_IOLIBNAME, \"open\", \"filename[,mode=\\\"r\\\"]\"},\r\n\t{LUA_IOLIBNAME, \"output\", \"[file]\"},\r\n\t{LUA_IOLIBNAME, \"popen\", \"prog,[model]\"},\r\n\t{LUA_IOLIBNAME, \"read\", \"...\"},\r\n\t{LUA_IOLIBNAME, \"tmpfile\", \"\"},\r\n\t{LUA_IOLIBNAME, \"type\", \"obj\"},\r\n\t{LUA_IOLIBNAME, \"write\", \"...\"},\r\n\t{LUA_OSLIBNAME, \"clock\", \"\"},\r\n\t{LUA_OSLIBNAME, \"date\", \"[format[,time]]\"},\r\n\t{LUA_OSLIBNAME, \"difftime\", \"t2,t1\"},\r\n\t{LUA_OSLIBNAME, \"execute\", \"[command]\"},\r\n\t{LUA_OSLIBNAME, \"exit\", \"[code]\"},\r\n\t{LUA_OSLIBNAME, \"getenv\", \"varname\"},\r\n\t{LUA_OSLIBNAME, \"remove\", \"filename\"},\r\n\t{LUA_OSLIBNAME, \"rename\", \"oldname,newname\"},\r\n\t{LUA_OSLIBNAME, \"setlocale\", \"locale[,category]\"},\r\n\t{LUA_OSLIBNAME, \"time\", \"[timetable]\"},\r\n\t{LUA_OSLIBNAME, \"tmpname\", \"\"},\r\n\t{LUA_DBLIBNAME, \"debug\", \"\"},\r\n\t{LUA_DBLIBNAME, \"getfenv\", \"o\"},\r\n\t{LUA_DBLIBNAME, \"gethook\", \"[thread]\"},\r\n\t{LUA_DBLIBNAME, \"getinfo\", \"[thread,]function[,what]\"},\r\n\t{LUA_DBLIBNAME, \"getlocal\", \"[thread,]level,local\"},\r\n\t{LUA_DBLIBNAME, \"getmetatable\", \"[object]\"},\r\n\t{LUA_DBLIBNAME, \"getregistry\", \"\"},\r\n\t{LUA_DBLIBNAME, \"getupvalue\", \"func,up\"},\r\n\t{LUA_DBLIBNAME, \"setfenv\", \"object,table\"},\r\n\t{LUA_DBLIBNAME, \"sethook\", \"[thread,]hook,mask[,count]\"},\r\n\t{LUA_DBLIBNAME, \"setlocal\", \"[thread,]level,local,value\"},\r\n\t{LUA_DBLIBNAME, \"setmetatable\", \"object,table\"},\r\n\t{LUA_DBLIBNAME, \"setupvalue\", \"func,up,value\"},\r\n\t{LUA_DBLIBNAME, \"traceback\", \"[thread,][message][,level]\"},\r\n\t{LUA_TABLIBNAME, \"concat\", \"table[,sep[,i[,j]]]\"},\r\n\t{LUA_TABLIBNAME, \"insert\", \"table,[pos,]value\"},\r\n\t{LUA_TABLIBNAME, \"maxn\", \"table\"},\r\n\t{LUA_TABLIBNAME, \"remove\", \"table[,pos]\"},\r\n\t{LUA_TABLIBNAME, \"sort\", \"table[,comp]\"},\r\n\t{LUA_TABLIBNAME, \"foreach\", \"table,func\"},\r\n\t{LUA_TABLIBNAME, \"foreachi\", \"table,func\"},\r\n\t{LUA_TABLIBNAME, \"getn\", \"table\"},\r\n\t{LUA_TABLIBNAME, \"maxn\", \"table\"},\r\n\t{LUA_TABLIBNAME, \"setn\", \"table,value\"}, // I know some of these are obsolete but they should still have argument info if they're exposed to the user\r\n\t{LUA_FILEHANDLE, \"setvbuf\", \"mode[,size]\", true},\r\n\t{LUA_FILEHANDLE, \"lines\", \"\", true},\r\n\t{LUA_FILEHANDLE, \"read\", \"...\", true},\r\n\t{LUA_FILEHANDLE, \"flush\", \"\", true},\r\n\t{LUA_FILEHANDLE, \"seek\", \"[whence][,offset]\", true},\r\n\t{LUA_FILEHANDLE, \"write\", \"...\", true},\r\n\t{LUA_FILEHANDLE, \"__tostring\", \"obj\", true},\r\n\t{LUA_FILEHANDLE, \"__gc\", \"\", true},\r\n\t{\"_LOADLIB\", \"__gc\", \"\", true},\r\n};\r\n\r\nvoid registerLibs(lua_State* L)\r\n{\r\n\tluaL_openlibs(L);\r\n\r\n\tluaL_register(L, \"emu\", emulib);\r\n\tluaL_register(L, \"gui\", guilib);\r\n\tluaL_register(L, \"stylus\", styluslib);\r\n\tluaL_register(L, \"savestate\", statelib);\r\n\tluaL_register(L, \"memory\", memorylib);\r\n\tluaL_register(L, \"joypad\", joylib); // for game input\r\n\tluaL_register(L, \"input\", inputlib); // for user input\r\n\tluaL_register(L, \"movie\", movielib);\r\n\tluaL_register(L, \"sound\", soundlib);\r\n\tluaL_register(L, \"bit\", bit_funcs); // LuaBitOp library\r\n\r\n\tluaL_register(L, \"agg\", aggbasicshapes);\r\n\tluaL_register(L, \"agg\", agggeneralattributes);\r\n\tluaL_register(L, \"agg\", aggcustom);\r\n\t\r\n\tlua_settop(L, 0); // clean the stack, because each call to luaL_register leaves a table on top\r\n\t\r\n\t// register a few utility functions outside of libraries (in the global namespace)\r\n\tlua_register(L, \"print\", print);\r\n\tlua_register(L, \"tostring\", tostring);\r\n\tlua_register(L, \"addressof\", addressof);\r\n\tlua_register(L, \"copytable\", copytable);\r\n\r\n\t// old bit operation functions\r\n\tlua_register(L, \"AND\", bit_band);\r\n\tlua_register(L, \"OR\", bit_bor);\r\n\tlua_register(L, \"XOR\", bit_bxor);\r\n\tlua_register(L, \"SHIFT\", bitshift);\r\n\tlua_register(L, \"BIT\", bitbit);\r\n\r\n\tluabitop_validate(L);\r\n\r\n\t// populate s_cFuncInfoMap the first time\r\n\tstatic bool once = true;\r\n\tif(once)\r\n\t{\r\n\t\tonce = false;\r\n\r\n\t\tfor(int i = 0; i < sizeof(cFuncInfo)/sizeof(*cFuncInfo); i++)\r\n\t\t{\r\n\t\t\tconst CFuncInfo& cfi = cFuncInfo[i];\r\n\t\t\tif(cfi.registry)\r\n\t\t\t{\r\n\t\t\t\tlua_getregistry(L);\r\n\t\t\t\tlua_getfield(L, -1, cfi.library);\r\n\t\t\t\tlua_remove(L, -2);\r\n\t\t\t\tlua_getfield(L, -1, cfi.name);\r\n\t\t\t\tlua_remove(L, -2);\r\n\t\t\t}\r\n\t\t\telse if(cfi.library)\r\n\t\t\t{\r\n\t\t\t\tlua_getfield(L, LUA_GLOBALSINDEX, cfi.library);\r\n\t\t\t\tlua_getfield(L, -1, cfi.name);\r\n\t\t\t\tlua_remove(L, -2);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tlua_getfield(L, LUA_GLOBALSINDEX, cfi.name);\r\n\t\t\t}\r\n\r\n\t\t\tlua_CFunction func = lua_tocfunction(L, -1);\r\n\t\t\ts_cFuncInfoMap[func] = cfi.args;\r\n\t\t\tlua_pop(L, 1);\r\n\t\t}\r\n\r\n\t\t// deal with some stragglers\r\n\t\tlua_getfield(L, LUA_GLOBALSINDEX, \"package\");\r\n\t\tlua_getfield(L, -1, \"loaders\");\r\n\t\tlua_remove(L, -2);\r\n\t\tif(lua_istable(L, -1))\r\n\t\t{\r\n\t\t\tfor(int i=1;;i++)\r\n\t\t\t{\r\n\t\t\t\tlua_rawgeti(L, -1, i);\r\n\t\t\t\tlua_CFunction func = lua_tocfunction(L, -1);\r\n\t\t\t\tlua_pop(L,1);\r\n\t\t\t\tif(!func)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\ts_cFuncInfoMap[func] = \"name\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tlua_pop(L,1);\r\n\t}\r\n\r\n\t// push arrays for storing hook functions in\r\n\tfor(int i = 0; i < LUAMEMHOOK_COUNT; i++)\r\n\t{\r\n\t\tlua_newtable(L);\r\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[i]);\r\n\t}\r\n\r\n\t// push an array for menu handlers\r\n\tlua_newtable(L);\r\n\tlua_setfield(L, LUA_REGISTRYINDEX, menuCallbackIDString);\r\n\r\n\t// register type\r\n\tluaL_newmetatable(L, \"EMUFILE_MEMORY*\");\r\n\tlua_pushcfunction(L, gcEMUFILE_MEMORY);\r\n\tlua_setfield(L, -2, \"__gc\");\r\n\tlua_pop(L, 1);\r\n}\r\n\r\nvoid ResetInfo(LuaContextInfo& info)\r\n{\r\n\tinfo.L = NULL;\r\n\tinfo.started = false;\r\n\tinfo.running = false;\r\n\tinfo.returned = false;\r\n\tinfo.crashed = false;\r\n\tinfo.restart = false;\r\n\tinfo.restartLater = false;\r\n\tinfo.worryCount = 0;\r\n\tinfo.stopWorrying = false;\r\n\tinfo.panic = false;\r\n\tinfo.ranExit = false;\r\n\tinfo.numDeferredFuncs = 0;\r\n\tinfo.ranFrameAdvance = false;\r\n\tinfo.transparencyModifier = 255;\r\n\tinfo.speedMode = SPEEDMODE_NORMAL;\r\n\tinfo.guiFuncsNeedDeferring = false;\r\n\tinfo.dataSaveKey = 0;\r\n\tinfo.dataLoadKey = 0;\r\n\tinfo.dataSaveLoadKeySet = false;\r\n\tinfo.rerecordCountingDisabled = false;\r\n\tinfo.numMemHooks = 0;\r\n\tinfo.persistVars.clear();\r\n\tinfo.newDefaultData.ClearRecords();\r\n\tinfo.guiData.data = (u32*)aggDraw.hud->buf().buf();\r\n\tinfo.guiData.stridePix = aggDraw.hud->buf().stride_abs() / 4;\r\n\tinfo.guiData.xMin = 0;\r\n\tinfo.guiData.xMax = 256;\r\n\tinfo.guiData.yMin = 0;\r\n\tinfo.guiData.yMax = 192 * 2;\r\n\tinfo.guiData.xOrigin = 0;\r\n\tinfo.guiData.yOrigin = 192;\r\n}\r\n\r\nvoid OpenLuaContext(int uid, void(*print)(int uid, const char* str), void(*onstart)(int uid), void(*onstop)(int uid, bool statusOK))\r\n{\r\n\tLuaContextInfo* newInfo = new LuaContextInfo();\r\n\tResetInfo(*newInfo);\r\n\tnewInfo->print = print;\r\n\tnewInfo->onstart = onstart;\r\n\tnewInfo->onstop = onstop;\r\n\tluaContextInfo[uid] = newInfo;\r\n}\r\n\r\nvoid RunLuaScriptFile(int uid, const char* filenameCStr)\r\n{\r\n\tif(luaContextInfo.find(uid) == luaContextInfo.end())\r\n\t\treturn;\r\n\tStopLuaScript(uid);\r\n\r\n\tLuaContextInfo& info = *luaContextInfo[uid];\r\n\r\n#ifdef USE_INFO_STACK\r\n\tinfoStack.insert(infoStack.begin(), &info);\r\n\tstruct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope; // doing it like this makes sure that the info stack gets cleaned up even if an exception is thrown\r\n#endif\r\n\r\n\tinfo.nextFilename = filenameCStr;\r\n\r\n\t// TODO: store script's current directory into LuaContextInfo\r\n\tstatic char dirnameCStr[MAX_PATH];\r\n\tstrcpy(dirnameCStr, filenameCStr);\r\n\tTrimFilenameFromPath(dirnameCStr);\r\n\tchdir(dirnameCStr);\r\n\r\n\tif(info.running)\r\n\t{\r\n\t\t// it's a little complicated, but... the call to luaL_dofile below\r\n\t\t// could call a C function that calls this very function again\r\n\t\t// additionally, if that happened then the above call to StopLuaScript\r\n\t\t// probably couldn't stop the script yet, so instead of continuing,\r\n\t\t// we'll set a flag that tells the first call of this function to loop again\r\n\t\t// when the script is able to stop safely\r\n\t\tinfo.restart = true;\r\n\t\treturn;\r\n\t}\r\n\r\n\tdo\r\n\t{\r\n\t\tstd::string filename = info.nextFilename;\r\n\r\n\t\tlua_State* L = lua_open();\r\n#ifndef USE_INFO_STACK\r\n\t\tluaStateToContextMap[L] = &info;\r\n#endif\r\n\t\tluaStateToUIDMap[L] = uid;\r\n\t\tResetInfo(info);\r\n\t\tinfo.L = L;\r\n\t\tinfo.guiFuncsNeedDeferring = true;\r\n\t\tinfo.lastFilename = filename;\r\n\r\n\t\tSetSaveKey(info, FilenameFromPath(filename.c_str()));\r\n\t\tinfo.dataSaveLoadKeySet = false;\r\n\r\n\t\tregisterLibs(L);\r\n\r\n\t\t// register a function to periodically check for inactivity\r\n\t\tlua_sethook(L, LuaRescueHook, LUA_MASKCOUNT, HOOKCOUNT);\r\n\r\n\t\t// deferred evaluation table\r\n\t\tlua_newtable(L);\r\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, deferredGUIIDString);\r\n\t\tlua_newtable(L);\r\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, deferredJoySetIDString);\r\n\t\tlua_newtable(L);\r\n\t\tlua_setfield(L, LUA_REGISTRYINDEX, refStashString);\r\n\r\n\t\tinfo.started = true;\r\n\t\tRefreshScriptStartedStatus();\r\n\t\tif(info.onstart)\r\n\t\t\tinfo.onstart(uid);\r\n\t\tinfo.running = true;\r\n\t\tRefreshScriptSpeedStatus();\r\n\t\tinfo.returned = false;\r\n\t\tint errorcode = luaL_dofile(L,filename.c_str());\r\n\t\tinfo.running = false;\r\n\t\tRefreshScriptSpeedStatus();\r\n\t\tinfo.returned = true;\r\n\r\n\t\tif (errorcode)\r\n\t\t{\r\n\t\t\tinfo.crashed = true;\r\n\t\t\tif(info.print)\r\n\t\t\t{\r\n\t\t\t\tinfo.print(uid, lua_tostring(L,-1));\r\n\t\t\t\tinfo.print(uid, \"\\r\\n\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfprintf(stderr, \"%s\\n\", lua_tostring(L,-1));\r\n\t\t\t}\r\n\t\t\tStopLuaScript(uid);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tdontworry(info);\r\n\t\t\tdriver->USR_RefreshScreen();\r\n\t\t\tStopScriptIfFinished(uid, true);\r\n\t\t}\r\n\t} while(info.restart);\r\n}\r\n\r\nvoid StopScriptIfFinished(int uid, bool justReturned)\r\n{\r\n\tLuaContextInfo& info = *luaContextInfo[uid];\r\n\tif(!info.returned)\r\n\t\treturn;\r\n\r\n\t// the script has returned, but it is not necessarily done running\r\n\t// because it may have registered a function that it expects to keep getting called\r\n\t// so check if it has any registered functions and stop the script only if it doesn't\r\n\r\n\tbool keepAlive = (info.numMemHooks != 0 || !info.menuData.menuItemMap.empty());\r\n\tfor(int calltype = 0; calltype < LUACALL_COUNT && !keepAlive; calltype++)\r\n\t{\r\n\t\tlua_State* L = info.L;\r\n\t\tif(L)\r\n\t\t{\r\n\t\t\tconst char* idstring = luaCallIDStrings[calltype];\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, idstring);\r\n\t\t\tbool isFunction = lua_isfunction(L, -1);\r\n\t\t\tlua_pop(L, 1);\r\n\r\n\t\t\tif(isFunction)\r\n\t\t\t\tkeepAlive = true;\r\n\t\t}\r\n\t}\r\n\r\n\tif(keepAlive)\r\n\t{\r\n\t\tif(justReturned)\r\n\t\t{\r\n\t\t\tif(info.print)\r\n\t\t\t\tinfo.print(uid, \"script returned but is still running registered functions\\r\\n\");\r\n\t\t\telse\r\n\t\t\t\tfprintf(stdout, \"%s\\n\", \"script returned but is still running registered functions\");\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif(info.print)\r\n\t\t\tinfo.print(uid, \"script finished running\\r\\n\");\r\n\t\telse\r\n\t\t\tfprintf(stdout, \"%s\\n\", \"script finished running\");\r\n\r\n\t\tStopLuaScript(uid);\r\n\t}\r\n}\r\n\r\nvoid RequestAbortLuaScript(int uid, const char* message)\r\n{\r\n\tif(luaContextInfo.find(uid) == luaContextInfo.end())\r\n\t\treturn;\r\n\tLuaContextInfo& info = *luaContextInfo[uid];\r\n\tlua_State* L = info.L;\r\n\tif(L)\r\n\t{\r\n\t\t// this probably isn't the right way to do it\r\n\t\t// but calling luaL_error here is positively unsafe\r\n\t\t// (it seemingly works fine but sometimes corrupts the emulation state in colorful ways)\r\n\t\t// and this works pretty well and is definitely safe, so screw it\r\n\t\tinfo.L->hookcount = 1; // run hook function as soon as possible\r\n\t\tinfo.panic = true; // and call luaL_error once we're inside the hook function\r\n\t\tif(message)\r\n\t\t{\r\n\t\t\tstrncpy(info.panicMessage, message, sizeof(info.panicMessage));\r\n\t\t\tinfo.panicMessage[sizeof(info.panicMessage)-1] = 0;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// attach file/line info because this is the case where it's most necessary to see that,\r\n\t\t\t// and often it won't be possible for the later luaL_error call to retrieve it otherwise.\r\n\t\t\t// this means sometimes printing multiple file/line numbers if luaL_error does find something,\r\n\t\t\t// but that's fine since more information is probably better anyway.\r\n\t\t\tluaL_where(L,0); // should be 0 and not 1 here to get useful (on force stop) messages\r\n\t\t\tconst char* whereString = lua_tostring(L,-1);\r\n\t\t\tsnprintf(info.panicMessage, sizeof(info.panicMessage), \"%sscript terminated\", whereString);\r\n\t\t\tlua_pop(L,1);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetSaveKey(LuaContextInfo& info, const char* key)\r\n{\r\n\tinfo.dataSaveKey = crc32(0, (const unsigned char*)key, strlen(key));\r\n\r\n\tif(!info.dataSaveLoadKeySet)\r\n\t{\r\n\t\tinfo.dataLoadKey = info.dataSaveKey;\r\n\t\tinfo.dataSaveLoadKeySet = true;\r\n\t}\r\n}\r\nvoid SetLoadKey(LuaContextInfo& info, const char* key)\r\n{\r\n\tinfo.dataLoadKey = crc32(0, (const unsigned char*)key, strlen(key));\r\n\r\n\tif(!info.dataSaveLoadKeySet)\r\n\t{\r\n\t\tinfo.dataSaveKey = info.dataLoadKey;\r\n\t\tinfo.dataSaveLoadKeySet = true;\r\n\t}\r\n}\r\n\r\nvoid HandleCallbackError(lua_State* L, LuaContextInfo& info, int uid, bool stopScript)\r\n{\r\n\tinfo.crashed = true;\r\n\tif(L->errfunc || L->errorJmp)\r\n\t\tluaL_error(L, lua_tostring(L,-1));\r\n\telse\r\n\t{\r\n\t\tif(info.print)\r\n\t\t{\r\n\t\t\tinfo.print(uid, lua_tostring(L,-1));\r\n\t\t\tinfo.print(uid, \"\\r\\n\");\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfprintf(stderr, \"%s\\n\", lua_tostring(L,-1));\r\n\t\t}\r\n\t\tif(stopScript)\r\n\t\t\tStopLuaScript(uid);\r\n\t}\r\n}\r\n\r\nvoid CallExitFunction(int uid)\r\n{\r\n\tLuaContextInfo& info = *luaContextInfo[uid];\r\n\tlua_State* L = info.L;\r\n\r\n\tif(!L)\r\n\t\treturn;\r\n\r\n\tdontworry(info);\r\n\r\n\t// first call the registered exit function if there is one\r\n\tif(!info.ranExit)\r\n\t{\r\n\t\tinfo.ranExit = true;\r\n\r\n#ifdef USE_INFO_STACK\r\n\t\tinfoStack.insert(infoStack.begin(), &info);\r\n\t\tstruct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope;\r\n#endif\r\n\r\n\t\t//lua_settop(L, 0);\r\n\t\tlua_getfield(L, LUA_REGISTRYINDEX, luaCallIDStrings[LUACALL_BEFOREEXIT]);\r\n\t\t\r\n\t\tint errorcode = 0;\r\n\t\tif (lua_isfunction(L, -1))\r\n\t\t{\r\n\t\t\tbool wasRunning = info.running;\r\n\t\t\tinfo.running = true;\r\n\t\t\tRefreshScriptSpeedStatus();\r\n\r\n\t\t\tbool wasPanic = info.panic;\r\n\t\t\tinfo.panic = false; // otherwise we could barely do anything in the exit function\r\n\r\n\t\t\terrorcode = lua_pcall(L, 0, 0, 0);\r\n\r\n\t\t\tinfo.panic |= wasPanic; // restore panic\r\n\r\n\t\t\tinfo.running = wasRunning;\r\n\t\t\tRefreshScriptSpeedStatus();\r\n\t\t}\r\n\r\n\t\t// save persisted variable info after the exit function runs (even if it crashed)\r\n\t\t{\r\n\t\t\t// gather the final value of the variables we're supposed to persist\r\n\t\t\tLuaSaveData newExitData;\r\n\t\t\t{\r\n\t\t\t\tint numPersistVars = info.persistVars.size();\r\n\t\t\t\tfor(int i = 0; i < numPersistVars; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst char* varName = info.persistVars[i].c_str();\r\n\t\t\t\t\tlua_getfield(L, LUA_GLOBALSINDEX, varName);\r\n\t\t\t\t\tint type = lua_type(L,-1);\r\n\t\t\t\t\tunsigned int varNameCRC = crc32(0, (const unsigned char*)varName, strlen(varName));\r\n\t\t\t\t\tnewExitData.SaveRecordPartial(uid, varNameCRC, -1);\r\n\t\t\t\t\tlua_pop(L,1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tchar path [1024] = {0};\r\n\t\t\tchar* pathTypeChrPtr = ConstructScriptSaveDataPath(path, 1024, info);\r\n\r\n\t\t\t*pathTypeChrPtr = 'd';\r\n\t\t\tif(info.newDefaultData.recordList)\r\n\t\t\t{\r\n\t\t\t\tFILE* defaultsFile = fopen(path, \"wb\");\r\n\t\t\t\tif(defaultsFile)\r\n\t\t\t\t{\r\n\t\t\t\t\tinfo.newDefaultData.ExportRecords(defaultsFile);\r\n\t\t\t\t\tfclose(defaultsFile);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse unlink(path);\r\n\r\n\t\t\t*pathTypeChrPtr = 'e';\r\n\t\t\tif(newExitData.recordList)\r\n\t\t\t{\r\n\t\t\t\tFILE* persistFile = fopen(path, \"wb\");\r\n\t\t\t\tif(persistFile)\r\n\t\t\t\t{\r\n\t\t\t\t\tnewExitData.ExportRecords(persistFile);\r\n\t\t\t\t\tfclose(persistFile);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse unlink(path);\r\n\t\t}\r\n\r\n\t\tif (errorcode)\r\n\t\t\tHandleCallbackError(L,info,uid,false);\r\n\r\n\t}\r\n}\r\n\r\nvoid StopLuaScript(int uid)\r\n{\r\n\tLuaContextInfo* infoPtr = luaContextInfo[uid];\r\n\tif(!infoPtr)\r\n\t\treturn;\r\n\r\n\tLuaContextInfo& info = *infoPtr;\r\n\r\n\tif(info.running)\r\n\t{\r\n\t\t// if it's currently running then we can't stop it now without crashing\r\n\t\t// so the best we can do is politely request for it to go kill itself\r\n\t\tRequestAbortLuaScript(uid);\r\n\t\treturn;\r\n\t}\r\n\r\n\tlua_State* L = info.L;\r\n\tif(L)\r\n\t{\r\n\t\tCallExitFunction(uid);\r\n\r\n\t\tif(info.onstop)\r\n\t\t{\r\n\t\t\tinfo.stopWorrying = true, info.worryCount++, dontworry(info); // clear \"busy\" status\r\n\t\t\tinfo.onstop(uid, !info.crashed); // must happen before closing L and after the exit function, otherwise the final GUI state of the script won't be shown properly or at all\r\n\t\t}\r\n\r\n\t\tif(info.started) // this check is necessary\r\n\t\t{\r\n\t\t\tlua_close(L);\r\n#ifndef USE_INFO_STACK\r\n\t\t\tluaStateToContextMap.erase(L);\r\n#endif\r\n\t\t\tluaStateToUIDMap.erase(L);\r\n\t\t\tinfo.L = NULL;\r\n\t\t\tinfo.started = false;\r\n\t\t\t\r\n\t\t\tinfo.numMemHooks = 0;\r\n\t\t\tfor(int i = 0; i < LUAMEMHOOK_COUNT; i++)\r\n\t\t\t\tCalculateMemHookRegions((LuaMemHookType)i);\r\n\r\n#if defined(WIN32) && !defined(WXPORT)\r\n\t\t\t// remove items\r\n\t\t\tmap<PlatformMenuItem, PlatformMenu>::iterator it = info.menuData.menuItemMap.begin();\r\n\t\t\twhile(it != info.menuData.menuItemMap.end())\r\n\t\t\t{\r\n\t\t\t\tHMENU menu = (*it).second;\r\n\t\t\t\tUINT menuItem = (*it).first;\r\n\t\t\t\tDeleteMenu(menu, menuItem, MF_BYCOMMAND);\r\n\t\t\t\tit++;\r\n\t\t\t}\r\n\t\t\tinfo.menuData.menuItemMap.clear();\r\n\r\n\t\t\t// remove submenus\r\n\t\t\tvector<LuaSubMenuData>::reverse_iterator rit = info.menuData.subMenuData.rbegin();\r\n\t\t\twhile(rit != info.menuData.subMenuData.rend())\r\n\t\t\t{\r\n\t\t\t\tHMENU menu = (*rit).menu;\r\n\t\t\t\tUINT menuItem = (*rit).menuItem;\r\n\r\n\t\t\t\tMENUITEMINFO mii;\r\n\t\t\t\tZeroMemory(&mii, sizeof(MENUITEMINFO));\r\n\t\t\t\tmii.cbSize = sizeof(MENUITEMINFO);\r\n\t\t\t\tmii.fMask = MIIM_SUBMENU;\r\n\t\t\t\tGetMenuItemInfo(menu, menuItem, FALSE, &mii);\r\n\t\t\t\tHMENU subMenu = mii.hSubMenu;\r\n\r\n\t\t\t\t// delete if it's empty\r\n\t\t\t\tif (GetMenuItemCount(subMenu) == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tDeleteMenu(menu, menuItem, MF_BYCOMMAND);\r\n\t\t\t\t}\r\n\t\t\t\trit++;\r\n\t\t\t}\r\n\t\t\tinfo.menuData.subMenuData.clear();\r\n\t\t\tDrawMenuBar(MainWindow->getHWnd());\r\n#endif\r\n\t\t}\r\n\t\tRefreshScriptStartedStatus();\r\n\t}\r\n}\r\n\r\nvoid CloseLuaContext(int uid)\r\n{\r\n\tStopLuaScript(uid);\r\n\tdelete luaContextInfo[uid];\r\n\tluaContextInfo.erase(uid);\r\n}\r\n\r\n\r\nTieredRegion hookedRegions [LUAMEMHOOK_COUNT];\r\n\r\n\r\n// currently disabled for desmume,\r\n// and the performance hit might not be accepable\r\n// unless we can switch the emulation into a whole separate path\r\n// that has this callback enabled.\r\nstatic void CalculateMemHookRegions(LuaMemHookType hookType)\r\n{\r\n\tstd::vector<unsigned int> hookedBytes;\r\n\tstd::map<int, LuaContextInfo*>::iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tif(info.numMemHooks)\r\n\t\t{\r\n\t\t\tlua_State* L = info.L;\r\n\t\t\tif(L)\r\n\t\t\t{\r\n\t\t\t\tint top = lua_gettop(L);\r\n\t\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]);\r\n\t\t\t\tlua_pushnil(L);\r\n\t\t\t\twhile(lua_next(L, -2))\r\n\t\t\t\t{\r\n\t\t\t\t\tif(lua_isfunction(L, -1))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tunsigned int addr = lua_tointeger(L, -2);\r\n\t\t\t\t\t\thookedBytes.push_back(addr);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlua_pop(L, 1);\r\n\t\t\t\t}\r\n\t\t\t\tif(!info.crashed)\r\n\t\t\t\t\tlua_settop(L, top);\r\n\t\t\t}\r\n\t\t}\r\n\t\t++iter;\r\n\t}\r\n\thookedRegions[hookType].Calculate(hookedBytes);\r\n}\r\n\r\n\r\n\r\n\r\n\r\nvoid CallRegisteredLuaMemHook_LuaMatch(unsigned int address, int size, unsigned int value, LuaMemHookType hookType)\r\n{\r\n\tstd::map<int, LuaContextInfo*>::iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tif(info.numMemHooks)\r\n\t\t{\r\n\t\t\tlua_State* L = info.L;\r\n\t\t\tif(L && !info.panic)\r\n\t\t\t{\r\n#ifdef USE_INFO_STACK\r\n\t\t\t\tinfoStack.insert(infoStack.begin(), &info);\r\n\t\t\t\tstruct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope;\r\n#endif\r\n\t\t\t\tint top = lua_gettop(L);\r\n\t\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[hookType]);\r\n\t\t\t\tfor(int i = address; i != address+size; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tlua_rawgeti(L, -1, i);\r\n\t\t\t\t\tif (lua_isfunction(L, -1))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tbool wasRunning = info.running;\r\n\t\t\t\t\t\tinfo.running = true;\r\n\t\t\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\t\t\tlua_pushinteger(L, address);\r\n\t\t\t\t\t\tlua_pushinteger(L, size);\r\n\t\t\t\t\t\tint errorcode = lua_pcall(L, 2, 0, 0);\r\n\t\t\t\t\t\tinfo.running = wasRunning;\r\n\t\t\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\t\t\tif (errorcode)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tint uid = iter->first;\r\n\t\t\t\t\t\t\tHandleCallbackError(L,info,uid,true);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlua_pop(L,1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(!info.crashed)\r\n\t\t\t\t\tlua_settop(L, top);\r\n\t\t\t}\r\n\t\t}\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\n\r\nvoid CallRegisteredLuaMenuHandlers(PlatformMenuItem menuItem)\r\n{\r\n\tstd::map<int, LuaContextInfo*>::iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tlua_State* L = info.L;\r\n\t\tif(L && !info.panic)\r\n\t\t{\r\n#ifdef USE_INFO_STACK\r\n\t\t\tinfoStack.insert(infoStack.begin(), &info);\r\n\t\t\tstruct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope;\r\n#endif\r\n\t\t\tint top = lua_gettop(L);\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, menuCallbackIDString);\r\n\t\t\tlua_rawgeti(L, -1, menuItem);\r\n\t\t\tif (lua_isfunction(L, -1))\r\n\t\t\t{\r\n\t\t\t\tbool wasRunning = info.running;\r\n\t\t\t\tinfo.running = true;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\tint errorcode = lua_pcall(L, 0, 0, 0);\r\n\t\t\t\tinfo.running = wasRunning;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\tif (errorcode)\r\n\t\t\t\t{\r\n\t\t\t\t\tint uid = iter->first;\r\n\t\t\t\t\tHandleCallbackError(L,info,uid,true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tlua_pop(L,1);\r\n\t\t\t}\r\n\t\t\tif(!info.crashed)\r\n\t\t\t\tlua_settop(L, top);\r\n\t\t}\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\n\r\nbool AnyLuaActive()\r\n{\r\n\tstd::map<int, LuaContextInfo*>::iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tif(info.started)\r\n\t\t\treturn true;\r\n\t\t++iter;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nvoid CallRegisteredLuaFunctions(LuaCallID calltype)\r\n{\r\n\tassert((unsigned int)calltype < (unsigned int)LUACALL_COUNT);\r\n\tconst char* idstring = luaCallIDStrings[calltype];\r\n\r\n\tstd::map<int, LuaContextInfo*>::iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tint uid = iter->first;\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tlua_State* L = info.L;\r\n\t\tif(L && (!info.panic || calltype == LUACALL_BEFOREEXIT))\r\n\t\t{\r\n#ifdef USE_INFO_STACK\r\n\t\t\tinfoStack.insert(infoStack.begin(), &info);\r\n\t\t\tstruct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope;\r\n#endif\r\n\t\t\t// handle deferred GUI function calls and disabling deferring when unnecessary\r\n\t\t\tif(calltype == LUACALL_AFTEREMULATIONGUI || calltype == LUACALL_AFTEREMULATION)\r\n\t\t\t\tinfo.guiFuncsNeedDeferring = false;\r\n\t\t\tif(calltype == LUACALL_AFTEREMULATIONGUI)\r\n\t\t\t\tCallDeferredFunctions(L, deferredGUIIDString);\r\n\t\t\tif(calltype == LUACALL_BEFOREEMULATION)\r\n\t\t\t{\r\n\t\t\t\tassert(NDS_isProcessingUserInput());\r\n\t\t\t\tCallDeferredFunctions(L, deferredJoySetIDString);\r\n\t\t\t}\r\n\r\n\t\t\tint top = lua_gettop(L);\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, idstring);\r\n\t\t\t\r\n\t\t\tif (lua_isfunction(L, -1))\r\n\t\t\t{\r\n\t\t\t\tbool wasRunning = info.running;\r\n\t\t\t\tinfo.running = true;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\tint errorcode = lua_pcall(L, 0, 0, 0);\r\n\t\t\t\tinfo.running = wasRunning;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\tif (errorcode)\r\n\t\t\t\t\tHandleCallbackError(L,info,uid,true);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tlua_pop(L, 1);\r\n\t\t\t}\r\n\r\n\t\t\tinfo.guiFuncsNeedDeferring = true;\r\n\t\t\tif(!info.crashed)\r\n\t\t\t{\r\n\t\t\t\tlua_settop(L, top);\r\n\t\t\t\tif(!info.panic)\r\n\t\t\t\t\tdontworry(info);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\nvoid CallRegisteredLuaSaveFunctions(int savestateNumber, LuaSaveData& saveData)\r\n{\r\n\tconst char* idstring = luaCallIDStrings[LUACALL_BEFORESAVE];\r\n\r\n\tstd::map<int, LuaContextInfo*>::iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tint uid = iter->first;\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tlua_State* L = info.L;\r\n\t\tif(L)\r\n\t\t{\r\n#ifdef USE_INFO_STACK\r\n\t\t\tinfoStack.insert(infoStack.begin(), &info);\r\n\t\t\tstruct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope;\r\n#endif\r\n\r\n\t\t\tint top = lua_gettop(L);\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, idstring);\r\n\t\t\t\r\n\t\t\tif (lua_isfunction(L, -1))\r\n\t\t\t{\r\n\t\t\t\tbool wasRunning = info.running;\r\n\t\t\t\tinfo.running = true;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\tlua_pushinteger(L, savestateNumber);\r\n\t\t\t\tint errorcode = lua_pcall(L, 1, LUA_MULTRET, 0);\r\n\t\t\t\tinfo.running = wasRunning;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\tif (errorcode)\r\n\t\t\t\t\tHandleCallbackError(L,info,uid,true);\r\n\t\t\t\tsaveData.SaveRecord(uid, info.dataSaveKey);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tlua_pop(L, 1);\r\n\t\t\t}\r\n\t\t\tif(!info.crashed)\r\n\t\t\t\tlua_settop(L, top);\r\n\t\t}\r\n\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\n\r\nvoid CallRegisteredLuaLoadFunctions(int savestateNumber, const LuaSaveData& saveData)\r\n{\r\n\tconst char* idstring = luaCallIDStrings[LUACALL_AFTERLOAD];\r\n\r\n\tstd::map<int, LuaContextInfo*>::iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tint uid = iter->first;\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tlua_State* L = info.L;\r\n\t\tif(L)\r\n\t\t{\r\n#ifdef USE_INFO_STACK\r\n\t\t\tinfoStack.insert(infoStack.begin(), &info);\r\n\t\t\tstruct Scope { ~Scope(){ infoStack.erase(infoStack.begin()); } } scope;\r\n#endif\r\n\r\n\t\t\tint top = lua_gettop(L);\r\n\t\t\tlua_getfield(L, LUA_REGISTRYINDEX, idstring);\r\n\t\t\t\r\n\t\t\tif (lua_isfunction(L, -1))\r\n\t\t\t{\r\n\t\t\t\tbool wasRunning = info.running;\r\n\t\t\t\tinfo.running = true;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\r\n\t\t\t\t// since the scriptdata can be very expensive to load\r\n\t\t\t\t// (e.g. the registered save function returned some huge tables)\r\n\t\t\t\t// check the number of parameters the registered load function expects\r\n\t\t\t\t// and don't bother loading the parameters it wouldn't receive anyway\r\n\t\t\t\tint numParamsExpected = (L->top - 1)->value.gc->cl.l.p->numparams;\r\n\t\t\t\tif(numParamsExpected) numParamsExpected--; // minus one for the savestate number we always pass in\r\n\r\n\t\t\t\tint prevGarbage = lua_gc(L, LUA_GCCOUNT, 0);\r\n\r\n\t\t\t\tlua_pushinteger(L, savestateNumber);\r\n\t\t\t\tsaveData.LoadRecord(uid, info.dataLoadKey, numParamsExpected);\r\n\t\t\t\tint n = lua_gettop(L) - 1;\r\n\r\n\t\t\t\tint errorcode = lua_pcall(L, n, 0, 0);\r\n\t\t\t\tinfo.running = wasRunning;\r\n\t\t\t\tRefreshScriptSpeedStatus();\r\n\t\t\t\tif (errorcode)\r\n\t\t\t\t\tHandleCallbackError(L,info,uid,true);\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tint newGarbage = lua_gc(L, LUA_GCCOUNT, 0);\r\n\t\t\t\t\tif(newGarbage - prevGarbage > 50)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// now seems to be a very good time to run the garbage collector\r\n\t\t\t\t\t\t// it might take a while now but that's better than taking 10 whiles 9 loads from now\r\n\t\t\t\t\t\tlua_gc(L, LUA_GCCOLLECT, 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tlua_pop(L, 1);\r\n\t\t\t}\r\n\t\t\tif(!info.crashed)\r\n\t\t\t\tlua_settop(L, top);\r\n\t\t}\r\n\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\nstatic const unsigned char* s_dbg_dataStart = NULL;\r\nstatic int s_dbg_dataSize = 0;\r\n\r\n\r\n// can't remember what the best way of doing this is...\r\n#if defined(i386) || defined(__i386) || defined(__i386__) || defined(M_I86) || defined(_M_IX86) || defined(_WIN32)\r\n\t#define IS_LITTLE_ENDIAN\r\n#endif\r\n\r\n// push a value's bytes onto the output stack\r\ntemplate<typename T>\r\nvoid PushBinaryItem(T item, std::vector<unsigned char>& output)\r\n{\r\n\tunsigned char* buf = (unsigned char*)&item;\r\n#ifdef IS_LITTLE_ENDIAN\r\n\tfor(int i = sizeof(T); i; i--)\r\n\t\toutput.push_back(*buf++);\r\n#else\r\n\tint vecsize = output.size();\r\n\tfor(int i = sizeof(T); i; i--)\r\n\t\toutput.insert(output.begin() + vecsize, *buf++);\r\n#endif\r\n}\r\n// read a value from the byte stream and advance the stream by its size\r\ntemplate<typename T>\r\nT AdvanceByteStream(const unsigned char*& data, unsigned int& remaining)\r\n{\r\n#ifdef IS_LITTLE_ENDIAN\r\n\tT rv = *(T*)data;\r\n\tdata += sizeof(T);\r\n#else\r\n\tT rv; unsigned char* rvptr = (unsigned char*)&rv;\r\n\tfor(int i = sizeof(T)-1; i>=0; i--)\r\n\t\trvptr[i] = *data++;\r\n#endif\r\n\tremaining -= sizeof(T);\r\n\treturn rv;\r\n}\r\n// advance the byte stream by a certain size without reading a value\r\nvoid AdvanceByteStream(const unsigned char*& data, unsigned int& remaining, int amount)\r\n{\r\n\tdata += amount;\r\n\tremaining -= amount;\r\n}\r\n\r\n#define LUAEXT_TLONG\t\t30 // 0x1E // 4-byte signed integer\r\n#define LUAEXT_TUSHORT\t\t31 // 0x1F // 2-byte unsigned integer\r\n#define LUAEXT_TSHORT\t\t32 // 0x20 // 2-byte signed integer\r\n#define LUAEXT_TBYTE\t\t33 // 0x21 // 1-byte unsigned integer\r\n#define LUAEXT_TNILS\t\t34 // 0x22 // multiple nils represented by a 4-byte integer (warning: becomes multiple stack entities)\r\n#define LUAEXT_TTABLE\t\t0x40 // 0x40 through 0x4F // tables of different sizes:\r\n#define LUAEXT_BITS_1A\t\t0x01 // size of array part fits in a 1-byte unsigned integer\r\n#define LUAEXT_BITS_2A\t\t0x02 // size of array part fits in a 2-byte unsigned integer\r\n#define LUAEXT_BITS_4A\t\t0x03 // size of array part fits in a 4-byte unsigned integer\r\n#define LUAEXT_BITS_1H\t\t0x04 // size of hash part fits in a 1-byte unsigned integer\r\n#define LUAEXT_BITS_2H\t\t0x08 // size of hash part fits in a 2-byte unsigned integer\r\n#define LUAEXT_BITS_4H\t\t0x0C // size of hash part fits in a 4-byte unsigned integer\r\n#define BITMATCH(x,y) (((x) & (y)) == (y))\r\n\r\nstatic void PushNils(std::vector<unsigned char>& output, int& nilcount)\r\n{\r\n\tint count = nilcount;\r\n\tnilcount = 0;\r\n\r\n\tstatic const int minNilsWorthEncoding = 6; // because a LUAEXT_TNILS entry is 5 bytes\r\n\r\n\tif(count < minNilsWorthEncoding)\r\n\t{\r\n\t\tfor(int i = 0; i < count; i++)\r\n\t\t\toutput.push_back(LUA_TNIL);\r\n\t}\r\n\telse\r\n\t{\r\n\t\toutput.push_back(LUAEXT_TNILS);\r\n\t\tPushBinaryItem<u32>(count, output);\r\n\t}\r\n}\r\n\r\n\r\nstatic void LuaStackToBinaryConverter(lua_State* L, int i, std::vector<unsigned char>& output)\r\n{\r\n\tint type = lua_type(L, i);\r\n\r\n\t// the first byte of every serialized item says what Lua type it is\r\n\toutput.push_back(type & 0xFF);\r\n\r\n\tswitch(type)\r\n\t{\r\n\t\tdefault:\r\n\t\t\t{\r\n\t\t\t\t//printf(\"wrote unknown type %d (0x%x)\\n\", type, type);\t\r\n\t\t\t\t//assert(0);\r\n\r\n\t\t\t\tLuaContextInfo& info = GetCurrentInfo();\r\n\t\t\t\tif(info.print)\r\n\t\t\t\t{\r\n\t\t\t\t\tchar errmsg [1024];\r\n\t\t\t\t\tsprintf(errmsg, \"values of type \\\"%s\\\" are not allowed to be returned from registered save functions.\\r\\n\", luaL_typename(L,i));\r\n\t\t\t\t\tinfo.print(luaStateToUIDMap[L->l_G->mainthread], errmsg);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tfprintf(stderr, \"values of type \\\"%s\\\" are not allowed to be returned from registered save functions.\\n\", luaL_typename(L,i));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase LUA_TNIL:\r\n\t\t\t// no information necessary beyond the type\r\n\t\t\tbreak;\r\n\t\tcase LUA_TBOOLEAN:\r\n\t\t\t// serialize as 0 or 1\r\n\t\t\toutput.push_back(lua_toboolean(L,i));\r\n\t\t\tbreak;\r\n\t\tcase LUA_TSTRING:\r\n\t\t\t// serialize as a 0-terminated string of characters\r\n\t\t\t{\r\n\t\t\t\tconst char* str = lua_tostring(L,i);\r\n\t\t\t\twhile(*str)\r\n\t\t\t\t\toutput.push_back(*str++);\r\n\t\t\t\toutput.push_back('\\0');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase LUA_TNUMBER:\r\n\t\t\t{\r\n\t\t\t\tdouble num = (double)lua_tonumber(L,i);\r\n\t\t\t\ts32 inum = (s32)lua_tointeger(L,i);\r\n\t\t\t\tif(num != inum)\r\n\t\t\t\t{\r\n\t\t\t\t\tPushBinaryItem(num, output);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif((inum & ~0xFF) == 0)\r\n\t\t\t\t\t\ttype = LUAEXT_TBYTE;\r\n\t\t\t\t\telse if((u16)(inum & 0xFFFF) == inum)\r\n\t\t\t\t\t\ttype = LUAEXT_TUSHORT;\r\n\t\t\t\t\telse if((s16)(inum & 0xFFFF) == inum)\r\n\t\t\t\t\t\ttype = LUAEXT_TSHORT;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\ttype = LUAEXT_TLONG;\r\n\t\t\t\t\toutput.back() = type;\r\n\t\t\t\t\tswitch(type)\r\n\t\t\t\t\t{\r\n\t\t\t\t\tcase LUAEXT_TLONG:\r\n\t\t\t\t\t\tPushBinaryItem<s32>(inum, output);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase LUAEXT_TUSHORT:\r\n\t\t\t\t\t\tPushBinaryItem<u16>(inum, output);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase LUAEXT_TSHORT:\r\n\t\t\t\t\t\tPushBinaryItem<s16>(inum, output);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase LUAEXT_TBYTE:\r\n\t\t\t\t\t\toutput.push_back(inum);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase LUA_TTABLE:\r\n\t\t\t// serialize as a type that describes how many bytes are used for storing the counts,\r\n\t\t\t// followed by the number of array entries if any, then the number of hash entries if any,\r\n\t\t\t// then a Lua value per array entry, then a (key,value) pair of Lua values per hashed entry\r\n\t\t\t// note that the structure of table references are not faithfully serialized (yet)\r\n\t\t{\r\n\t\t\tint outputTypeIndex = output.size() - 1;\r\n\t\t\tint arraySize = 0;\r\n\t\t\tint hashSize = 0;\r\n\r\n\t\t\tif(lua_checkstack(L, 4) && std::find(s_tableAddressStack.begin(), s_tableAddressStack.end(), lua_topointer(L,i)) == s_tableAddressStack.end())\r\n\t\t\t{\r\n\t\t\t\ts_tableAddressStack.push_back(lua_topointer(L,i));\r\n\t\t\t\tstruct Scope { ~Scope(){ s_tableAddressStack.pop_back(); } } scope;\r\n\r\n\t\t\t\tbool wasnil = false;\r\n\t\t\t\tint nilcount = 0;\r\n\t\t\t\tarraySize = lua_objlen(L, i);\r\n\t\t\t\tint arrayValIndex = lua_gettop(L) + 1;\r\n\t\t\t\tfor(int j = 1; j <= arraySize; j++)\r\n\t\t\t\t{\r\n\t\t\t        lua_rawgeti(L, i, j);\r\n\t\t\t\t\tbool isnil = lua_isnil(L, arrayValIndex);\r\n\t\t\t\t\tif(isnil)\r\n\t\t\t\t\t\tnilcount++;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(wasnil)\r\n\t\t\t\t\t\t\tPushNils(output, nilcount);\r\n\t\t\t\t\t\tLuaStackToBinaryConverter(L, arrayValIndex, output);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlua_pop(L, 1);\r\n\t\t\t\t\twasnil = isnil;\r\n\t\t\t\t}\r\n\t\t\t\tif(wasnil)\r\n\t\t\t\t\tPushNils(output, nilcount);\r\n\r\n\t\t\t\tif(arraySize)\r\n\t\t\t\t\tlua_pushinteger(L, arraySize); // before first key\r\n\t\t\t\telse\r\n\t\t\t\t\tlua_pushnil(L); // before first key\r\n\r\n\t\t\t\tint keyIndex = lua_gettop(L);\r\n\t\t\t\tint valueIndex = keyIndex + 1;\r\n\t\t\t\twhile(lua_next(L, i))\r\n\t\t\t\t{\r\n\t\t\t\t\tassert(lua_type(L, keyIndex) && \"nil key in Lua table, impossible\");\r\n\t\t\t\t\tassert(lua_type(L, valueIndex) && \"nil value in Lua table, impossible\");\r\n\t\t\t\t\tLuaStackToBinaryConverter(L, keyIndex, output);\r\n\t\t\t\t\tLuaStackToBinaryConverter(L, valueIndex, output);\r\n\t\t\t\t\tlua_pop(L, 1);\r\n\t\t\t\t\thashSize++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tint outputType = LUAEXT_TTABLE;\r\n\t\t\tif(arraySize & 0xFFFF0000)\r\n\t\t\t\toutputType |= LUAEXT_BITS_4A;\r\n\t\t\telse if(arraySize & 0xFF00)\r\n\t\t\t\toutputType |= LUAEXT_BITS_2A;\r\n\t\t\telse if(arraySize & 0xFF)\r\n\t\t\t\toutputType |= LUAEXT_BITS_1A;\r\n\t\t\tif(hashSize & 0xFFFF0000)\r\n\t\t\t\toutputType |= LUAEXT_BITS_4H;\r\n\t\t\telse if(hashSize & 0xFF00)\r\n\t\t\t\toutputType |= LUAEXT_BITS_2H;\r\n\t\t\telse if(hashSize & 0xFF)\r\n\t\t\t\toutputType |= LUAEXT_BITS_1H;\r\n\t\t\toutput[outputTypeIndex] = outputType;\r\n\r\n\t\t\tint insertIndex = outputTypeIndex;\r\n\t\t\tif(BITMATCH(outputType,LUAEXT_BITS_4A) || BITMATCH(outputType,LUAEXT_BITS_2A) || BITMATCH(outputType,LUAEXT_BITS_1A))\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), arraySize & 0xFF);\r\n\t\t\tif(BITMATCH(outputType,LUAEXT_BITS_4A) || BITMATCH(outputType,LUAEXT_BITS_2A))\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), (arraySize & 0xFF00) >> 8);\r\n\t\t\tif(BITMATCH(outputType,LUAEXT_BITS_4A))\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), (arraySize & 0x00FF0000) >> 16),\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), (arraySize & 0xFF000000) >> 24);\r\n\t\t\tif(BITMATCH(outputType,LUAEXT_BITS_4H) || BITMATCH(outputType,LUAEXT_BITS_2H) || BITMATCH(outputType,LUAEXT_BITS_1H))\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), hashSize & 0xFF);\r\n\t\t\tif(BITMATCH(outputType,LUAEXT_BITS_4H) || BITMATCH(outputType,LUAEXT_BITS_2H))\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), (hashSize & 0xFF00) >> 8);\r\n\t\t\tif(BITMATCH(outputType,LUAEXT_BITS_4H))\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), (hashSize & 0x00FF0000) >> 16),\r\n\t\t\t\toutput.insert(output.begin() + (++insertIndex), (hashSize & 0xFF000000) >> 24);\r\n\r\n\t\t}\tbreak;\r\n\t}\r\n}\r\n\r\n\r\n// complements LuaStackToBinaryConverter\r\nvoid BinaryToLuaStackConverter(lua_State* L, const unsigned char*& data, unsigned int& remaining)\r\n{\r\n\tassert(s_dbg_dataSize - (data - s_dbg_dataStart) == remaining);\r\n\r\n\tunsigned char type = AdvanceByteStream<unsigned char>(data, remaining);\r\n\r\n\tswitch(type)\r\n\t{\r\n\t\tdefault:\r\n\t\t\t{\r\n\t\t\t\t//printf(\"read unknown type %d (0x%x)\\n\", type, type);\r\n\t\t\t\t//assert(0);\r\n\r\n\t\t\t\tLuaContextInfo& info = GetCurrentInfo();\r\n\t\t\t\tif(info.print)\r\n\t\t\t\t{\r\n\t\t\t\t\tchar errmsg [1024];\r\n\t\t\t\t\tif(type <= 10 && type != LUA_TTABLE)\r\n\t\t\t\t\t\tsprintf(errmsg, \"values of type \\\"%s\\\" are not allowed to be loaded into registered load functions. The save state's Lua save data file might be corrupted.\\r\\n\", lua_typename(L,type));\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tsprintf(errmsg, \"The save state's Lua save data file seems to be corrupted.\\r\\n\");\r\n\t\t\t\t\tinfo.print(luaStateToUIDMap[L->l_G->mainthread], errmsg);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif(type <= 10 && type != LUA_TTABLE)\r\n\t\t\t\t\t\tfprintf(stderr, \"values of type \\\"%s\\\" are not allowed to be loaded into registered load functions. The save state's Lua save data file might be corrupted.\\n\", lua_typename(L,type));\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tfprintf(stderr, \"The save state's Lua save data file seems to be corrupted.\\n\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase LUA_TNIL:\r\n\t\t\tlua_pushnil(L);\r\n\t\t\tbreak;\r\n\t\tcase LUA_TBOOLEAN:\r\n\t\t\tlua_pushboolean(L, AdvanceByteStream<u8>(data, remaining));\r\n\t\t\tbreak;\r\n\t\tcase LUA_TSTRING:\r\n\t\t\tlua_pushstring(L, (const char*)data);\r\n\t\t\tAdvanceByteStream(data, remaining, strlen((const char*)data) + 1);\r\n\t\t\tbreak;\r\n\t\tcase LUA_TNUMBER:\r\n\t\t\tlua_pushnumber(L, AdvanceByteStream<double>(data, remaining));\r\n\t\t\tbreak;\r\n\t\tcase LUAEXT_TLONG:\r\n\t\t\tlua_pushinteger(L, AdvanceByteStream<s32>(data, remaining));\r\n\t\t\tbreak;\r\n\t\tcase LUAEXT_TUSHORT:\r\n\t\t\tlua_pushinteger(L, AdvanceByteStream<u16>(data, remaining));\r\n\t\t\tbreak;\r\n\t\tcase LUAEXT_TSHORT:\r\n\t\t\tlua_pushinteger(L, AdvanceByteStream<s16>(data, remaining));\r\n\t\t\tbreak;\r\n\t\tcase LUAEXT_TBYTE:\r\n\t\t\tlua_pushinteger(L, AdvanceByteStream<u8>(data, remaining));\r\n\t\t\tbreak;\r\n\t\tcase LUAEXT_TTABLE:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_1A:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_2A:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_4A:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_1H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_2H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_4H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_1H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_1H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_1H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_2H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_2H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_2H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_1A | LUAEXT_BITS_4H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_2A | LUAEXT_BITS_4H:\r\n\t\tcase LUAEXT_TTABLE | LUAEXT_BITS_4A | LUAEXT_BITS_4H:\r\n\t\t\t{\r\n\t\t\t\tunsigned int arraySize = 0;\r\n\t\t\t\tif(BITMATCH(type,LUAEXT_BITS_4A) || BITMATCH(type,LUAEXT_BITS_2A) || BITMATCH(type,LUAEXT_BITS_1A))\r\n\t\t\t\t\tarraySize |= AdvanceByteStream<u8>(data, remaining);\r\n\t\t\t\tif(BITMATCH(type,LUAEXT_BITS_4A) || BITMATCH(type,LUAEXT_BITS_2A))\r\n\t\t\t\t\tarraySize |= ((u16)AdvanceByteStream<u8>(data, remaining)) << 8;\r\n\t\t\t\tif(BITMATCH(type,LUAEXT_BITS_4A))\r\n\t\t\t\t\tarraySize |= ((u32)AdvanceByteStream<u8>(data, remaining)) << 16,\r\n\t\t\t\t\tarraySize |= ((u32)AdvanceByteStream<u8>(data, remaining)) << 24;\r\n\r\n\t\t\t\tunsigned int hashSize = 0;\r\n\t\t\t\tif(BITMATCH(type,LUAEXT_BITS_4H) || BITMATCH(type,LUAEXT_BITS_2H) || BITMATCH(type,LUAEXT_BITS_1H))\r\n\t\t\t\t\thashSize |= AdvanceByteStream<u8>(data, remaining);\r\n\t\t\t\tif(BITMATCH(type,LUAEXT_BITS_4H) || BITMATCH(type,LUAEXT_BITS_2H))\r\n\t\t\t\t\thashSize |= ((u16)AdvanceByteStream<u8>(data, remaining)) << 8;\r\n\t\t\t\tif(BITMATCH(type,LUAEXT_BITS_4H))\r\n\t\t\t\t\thashSize |= ((u32)AdvanceByteStream<u8>(data, remaining)) << 16,\r\n\t\t\t\t\thashSize |= ((u32)AdvanceByteStream<u8>(data, remaining)) << 24;\r\n\r\n\t\t\t\tlua_createtable(L, arraySize, hashSize);\r\n\r\n\t\t\t\tunsigned int n = 1;\r\n\t\t\t\twhile(n <= arraySize)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(*data == LUAEXT_TNILS)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tAdvanceByteStream(data, remaining, 1);\r\n\t\t\t\t\t\tn += AdvanceByteStream<u32>(data, remaining);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tBinaryToLuaStackConverter(L, data, remaining); // push value\r\n\t\t\t\t\t\tlua_rawseti(L, -2, n); // table[n] = value\r\n\t\t\t\t\t\tn++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor(unsigned int h = 1; h <= hashSize; h++)\r\n\t\t\t\t{\r\n\t\t\t\t\tBinaryToLuaStackConverter(L, data, remaining); // push key\r\n\t\t\t\t\tBinaryToLuaStackConverter(L, data, remaining); // push value\r\n\t\t\t\t\tlua_rawset(L, -3); // table[key] = value\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic const unsigned char luaBinaryMajorVersion = 9;\r\nstatic const unsigned char luaBinaryMinorVersion = 1;\r\n\r\nunsigned char* LuaStackToBinary(lua_State* L, unsigned int& size)\r\n{\r\n\tint n = lua_gettop(L);\r\n\tif(n == 0)\r\n\t\treturn NULL;\r\n\r\n\tstd::vector<unsigned char> output;\r\n\toutput.push_back(luaBinaryMajorVersion);\r\n\toutput.push_back(luaBinaryMinorVersion);\r\n\r\n\tfor(int i = 1; i <= n; i++)\r\n\t\tLuaStackToBinaryConverter(L, i, output);\r\n\r\n\tunsigned char* rv = new unsigned char [output.size()];\r\n\tmemcpy(rv, &output.front(), output.size());\r\n\tsize = output.size();\r\n\treturn rv;\r\n}\r\n\r\nvoid BinaryToLuaStack(lua_State* L, const unsigned char* data, unsigned int size, unsigned int itemsToLoad)\r\n{\r\n\tunsigned char major = *data++;\r\n\tunsigned char minor = *data++;\r\n\tsize -= 2;\r\n\tif(luaBinaryMajorVersion != major || luaBinaryMinorVersion != minor)\r\n\t\treturn;\r\n\r\n\twhile(size > 0 && itemsToLoad > 0)\r\n\t{\r\n\t\tBinaryToLuaStackConverter(L, data, size);\r\n\t\titemsToLoad--;\r\n\t}\r\n}\r\n\r\n// saves Lua stack into a record and pops it\r\nvoid LuaSaveData::SaveRecord(int uid, unsigned int key)\r\n{\r\n\tLuaContextInfo& info = *luaContextInfo[uid];\r\n\tlua_State* L = info.L;\r\n\tif(!L)\r\n\t\treturn;\r\n\r\n\tRecord* cur = new Record();\r\n\tcur->key = key;\r\n\tcur->data = LuaStackToBinary(L, cur->size);\r\n\tcur->next = NULL;\r\n\r\n\tlua_settop(L,0);\r\n\r\n\tif(cur->size <= 0)\r\n\t{\r\n\t\tdelete cur;\r\n\t\treturn;\r\n\t}\r\n\r\n\tRecord* last = recordList;\r\n\twhile(last && last->next)\r\n\t\tlast = last->next;\r\n\tif(last)\r\n\t\tlast->next = cur;\r\n\telse\r\n\t\trecordList = cur;\r\n}\r\n\r\n// pushes a record's data onto the Lua stack\r\nvoid LuaSaveData::LoadRecord(int uid, unsigned int key, unsigned int itemsToLoad) const\r\n{\r\n\tLuaContextInfo& info = *luaContextInfo[uid];\r\n\tlua_State* L = info.L;\r\n\tif(!L)\r\n\t\treturn;\r\n\r\n\tRecord* cur = recordList;\r\n\twhile(cur)\r\n\t{\r\n\t\tif(cur->key == key)\r\n\t\t{\r\n\t\t\ts_dbg_dataStart = cur->data;\r\n\t\t\ts_dbg_dataSize = cur->size;\r\n\t\t\tBinaryToLuaStack(L, cur->data, cur->size, itemsToLoad);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tcur = cur->next;\r\n\t}\r\n}\r\n\r\n// saves part of the Lua stack (at the given index) into a record and does NOT pop anything\r\nvoid LuaSaveData::SaveRecordPartial(int uid, unsigned int key, int idx)\r\n{\r\n\tLuaContextInfo& info = *luaContextInfo[uid];\r\n\tlua_State* L = info.L;\r\n\tif(!L)\r\n\t\treturn;\r\n\r\n\tif(idx < 0)\r\n\t\tidx += lua_gettop(L)+1;\r\n\r\n\tRecord* cur = new Record();\r\n\tcur->key = key;\r\n\tcur->next = NULL;\r\n\r\n\tif(idx <= lua_gettop(L))\r\n\t{\r\n\t\tstd::vector<unsigned char> output;\r\n\t\toutput.push_back(luaBinaryMajorVersion);\r\n\t\toutput.push_back(luaBinaryMinorVersion);\r\n\r\n\t\tLuaStackToBinaryConverter(L, idx, output);\r\n\r\n\t\tunsigned char* rv = new unsigned char [output.size()];\r\n\t\tmemcpy(rv, &output.front(), output.size());\r\n\t\tcur->size = output.size();\r\n\t\tcur->data = rv;\r\n\t}\r\n\r\n\tif(cur->size <= 0)\r\n\t{\r\n\t\tdelete cur;\r\n\t\treturn;\r\n\t}\r\n\r\n\tRecord* last = recordList;\r\n\twhile(last && last->next)\r\n\t\tlast = last->next;\r\n\tif(last)\r\n\t\tlast->next = cur;\r\n\telse\r\n\t\trecordList = cur;\r\n}\r\n\r\nvoid fwriteint(unsigned int value, FILE* file)\r\n{\r\n\tfor(int i=0;i<4;i++)\r\n\t{\r\n\t\tint w = value & 0xFF;\r\n\t\tfwrite(&w, 1, 1, file);\r\n\t\tvalue >>= 8;\r\n\t}\r\n}\r\nvoid freadint(unsigned int& value, FILE* file)\r\n{\r\n\tint rv = 0;\r\n\tfor(int i=0;i<4;i++)\r\n\t{\r\n\t\tint r = 0;\r\n\t\tfread(&r, 1, 1, file);\r\n\t\trv |= r << (i*8);\r\n\t}\r\n\tvalue = rv;\r\n}\r\n\r\n// writes all records to an already-open file\r\nvoid LuaSaveData::ExportRecords(void* fileV) const\r\n{\r\n\tFILE* file = (FILE*)fileV;\r\n\tif(!file)\r\n\t\treturn;\r\n\r\n\tRecord* cur = recordList;\r\n\twhile(cur)\r\n\t{\r\n\t\tfwriteint(cur->key, file);\r\n\t\tfwriteint(cur->size, file);\r\n\t\tfwrite(cur->data, cur->size, 1, file);\r\n\t\tcur = cur->next;\r\n\t}\r\n}\r\n\r\n// reads records from an already-open file\r\nvoid LuaSaveData::ImportRecords(void* fileV)\r\n{\r\n\tFILE* file = (FILE*)fileV;\r\n\tif(!file)\r\n\t\treturn;\r\n\r\n\tClearRecords();\r\n\r\n\tRecord rec;\r\n\tRecord* cur = &rec;\r\n\tRecord* last = NULL;\r\n\twhile(1)\r\n\t{\r\n\t\tfreadint(cur->key, file);\r\n\t\tfreadint(cur->size, file);\r\n\r\n\t\tif(feof(file) || ferror(file))\r\n\t\t\tbreak;\r\n\r\n\t\tcur->data = new unsigned char [cur->size];\r\n\t\tfread(cur->data, cur->size, 1, file);\r\n\r\n\t\tRecord* next = new Record();\r\n\t\tmemcpy(next, cur, sizeof(Record));\r\n\t\tnext->next = NULL;\r\n\r\n\t\tif(last)\r\n\t\t\tlast->next = next;\r\n\t\telse\r\n\t\t\trecordList = next;\r\n\t\tlast = next;\r\n\t}\r\n}\r\n\r\nvoid LuaSaveData::ClearRecords()\r\n{\r\n\tRecord* cur = recordList;\r\n\twhile(cur)\r\n\t{\r\n\t\tRecord* del = cur;\r\n\t\tcur = cur->next;\r\n\r\n\t\tdelete[] del->data;\r\n\t\tdelete del;\r\n\t}\r\n\r\n\trecordList = NULL;\r\n}\r\n\r\n\r\n\r\nvoid DontWorryLua() // everything's going to be OK\r\n{\r\n\tstd::map<int, LuaContextInfo*>::const_iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::const_iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tdontworry(*iter->second);\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\nvoid EnableStopAllLuaScripts(bool enable)\r\n{\r\n\tg_stopAllScriptsEnabled = enable;\r\n}\r\n\r\nvoid StopAllLuaScripts()\r\n{\r\n\tif(!g_stopAllScriptsEnabled)\r\n\t\treturn;\r\n\r\n\tstd::map<int, LuaContextInfo*>::const_iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::const_iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tint uid = iter->first;\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tbool wasStarted = info.started;\r\n\t\tStopLuaScript(uid);\r\n\t\tinfo.restartLater = wasStarted;\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\nvoid RestartAllLuaScripts()\r\n{\r\n\tif(!g_stopAllScriptsEnabled)\r\n\t\treturn;\r\n\r\n\tstd::map<int, LuaContextInfo*>::const_iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::const_iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tint uid = iter->first;\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tif(info.restartLater || info.started)\r\n\t\t{\r\n\t\t\tinfo.restartLater = false;\r\n\t\t\tRunLuaScriptFile(uid, info.lastFilename.c_str());\r\n\t\t}\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\n// sets anything that needs to depend on the total number of scripts running\r\nvoid RefreshScriptStartedStatus()\r\n{\r\n\tint numScriptsStarted = 0;\r\n\r\n\tstd::map<int, LuaContextInfo*>::const_iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::const_iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tif(info.started)\r\n\t\t\tnumScriptsStarted++;\r\n\t\t++iter;\r\n\t}\r\n\r\n//\tframeadvSkipLagForceDisable = (numScriptsStarted != 0); // disable while scripts are running because currently lag skipping makes lua callbacks get called twice per frame advance\r\n\tg_numScriptsStarted = numScriptsStarted;\r\n}\r\n\r\n// sets anything that needs to depend on speed mode or running status of scripts\r\nvoid RefreshScriptSpeedStatus()\r\n{\r\n\tg_anyScriptsHighSpeed = false;\r\n\r\n\tstd::map<int, LuaContextInfo*>::const_iterator iter = luaContextInfo.begin();\r\n\tstd::map<int, LuaContextInfo*>::const_iterator end = luaContextInfo.end();\r\n\twhile(iter != end)\r\n\t{\r\n\t\tLuaContextInfo& info = *iter->second;\r\n\t\tif(info.running)\r\n\t\t\tif(info.speedMode == SPEEDMODE_TURBO || info.speedMode == SPEEDMODE_MAXIMUM)\r\n\t\t\t\tg_anyScriptsHighSpeed = true;\r\n\t\t++iter;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/matrix.cpp",
    "content": "/*\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2007-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <math.h>\n#include <assert.h>\n#include \"matrix.h\"\n#include \"MMU.h\"\n\nvoid _NOSSE_MatrixMultVec4x4 (const float *matrix, float *vecPtr)\n{\n\tfloat x = vecPtr[0];\n\tfloat y = vecPtr[1];\n\tfloat z = vecPtr[2];\n\tfloat w = vecPtr[3];\n\n\tvecPtr[0] = x * matrix[0] + y * matrix[4] + z * matrix[ 8] + w * matrix[12];\n\tvecPtr[1] = x * matrix[1] + y * matrix[5] + z * matrix[ 9] + w * matrix[13];\n\tvecPtr[2] = x * matrix[2] + y * matrix[6] + z * matrix[10] + w * matrix[14];\n\tvecPtr[3] = x * matrix[3] + y * matrix[7] + z * matrix[11] + w * matrix[15];\n}\n\nvoid MatrixMultVec4x4 (const s32 *matrix, s32 *vecPtr)\n{\n\tconst s32 x = vecPtr[0];\n\tconst s32 y = vecPtr[1];\n\tconst s32 z = vecPtr[2];\n\tconst s32 w = vecPtr[3];\n\n\tvecPtr[0] = fx32_shiftdown(fx32_mul(x,matrix[0]) + fx32_mul(y,matrix[4]) + fx32_mul(z,matrix [8]) + fx32_mul(w,matrix[12]));\n\tvecPtr[1] = fx32_shiftdown(fx32_mul(x,matrix[1]) + fx32_mul(y,matrix[5]) + fx32_mul(z,matrix[ 9]) + fx32_mul(w,matrix[13]));\n\tvecPtr[2] = fx32_shiftdown(fx32_mul(x,matrix[2]) + fx32_mul(y,matrix[6]) + fx32_mul(z,matrix[10]) + fx32_mul(w,matrix[14]));\n\tvecPtr[3] = fx32_shiftdown(fx32_mul(x,matrix[3]) + fx32_mul(y,matrix[7]) + fx32_mul(z,matrix[11]) + fx32_mul(w,matrix[15]));\n}\n\nvoid MatrixMultVec3x3_fixed(const s32 *matrix, s32 *vecPtr)\n{\n\tconst s32 x = vecPtr[0];\n\tconst s32 y = vecPtr[1];\n\tconst s32 z = vecPtr[2];\n\n\tvecPtr[0] = fx32_shiftdown(fx32_mul(x,matrix[0]) + fx32_mul(y,matrix[4]) + fx32_mul(z,matrix[8]));\n\tvecPtr[1] = fx32_shiftdown(fx32_mul(x,matrix[1]) + fx32_mul(y,matrix[5]) + fx32_mul(z,matrix[9]));\n\tvecPtr[2] = fx32_shiftdown(fx32_mul(x,matrix[2]) + fx32_mul(y,matrix[6]) + fx32_mul(z,matrix[10]));\n}\n\n#ifdef HAVE_NEON\n//-------------------------\n//switched NEON functions: implementations for NEON\nvoid MatrixMultVec3x3 (const float *matrix, float *vecPtr)\n{\n\tfloat x = vecPtr[0];\n\tfloat y = vecPtr[1];\n\tfloat z = vecPtr[2];\n\n\tvecPtr[0] = x * matrix[0] + y * matrix[4] + z * matrix[ 8];\n\tvecPtr[1] = x * matrix[1] + y * matrix[5] + z * matrix[ 9];\n\tvecPtr[2] = x * matrix[2] + y * matrix[6] + z * matrix[10];\n}\n\nvoid MatrixTranslate\t(float *matrix, const float *ptr)\n{\n\tmatrix[12] += (matrix[0]*ptr[0])+(matrix[4]*ptr[1])+(matrix[ 8]*ptr[2]);\n\tmatrix[13] += (matrix[1]*ptr[0])+(matrix[5]*ptr[1])+(matrix[ 9]*ptr[2]);\n\tmatrix[14] += (matrix[2]*ptr[0])+(matrix[6]*ptr[1])+(matrix[10]*ptr[2]);\n\tmatrix[15] += (matrix[3]*ptr[0])+(matrix[7]*ptr[1])+(matrix[11]*ptr[2]);\n}\n\nvoid MatrixScale (float *matrix, const float *ptr)\n{\n\tmatrix[0]  *= ptr[0];\n\tmatrix[1]  *= ptr[0];\n\tmatrix[2]  *= ptr[0];\n\tmatrix[3]  *= ptr[0];\n\n\tmatrix[4]  *= ptr[1];\n\tmatrix[5]  *= ptr[1];\n\tmatrix[6]  *= ptr[1];\n\tmatrix[7]  *= ptr[1];\n\n\tmatrix[8] *= ptr[2];\n\tmatrix[9] *= ptr[2];\n\tmatrix[10] *= ptr[2];\n\tmatrix[11] *= ptr[2];\n}\n\n#elif !defined(ENABLE_SSE)\n//-------------------------\n//switched SSE functions: implementations for no SSE\nvoid MatrixMultVec4x4 (const float *matrix, float *vecPtr)\n{\n\t_NOSSE_MatrixMultVec4x4(matrix, vecPtr);\n}\n\n\nvoid MatrixMultVec3x3 (const float *matrix, float *vecPtr)\n{\n\tfloat x = vecPtr[0];\n\tfloat y = vecPtr[1];\n\tfloat z = vecPtr[2];\n\n\tvecPtr[0] = x * matrix[0] + y * matrix[4] + z * matrix[ 8];\n\tvecPtr[1] = x * matrix[1] + y * matrix[5] + z * matrix[ 9];\n\tvecPtr[2] = x * matrix[2] + y * matrix[6] + z * matrix[10];\n}\n\nvoid MatrixMultiply (float *matrix, const float *rightMatrix)\n{\n\tfloat tmpMatrix[16];\n\n\ttmpMatrix[0]  = (matrix[0]*rightMatrix[0])+(matrix[4]*rightMatrix[1])+(matrix[8]*rightMatrix[2])+(matrix[12]*rightMatrix[3]);\n\ttmpMatrix[1]  = (matrix[1]*rightMatrix[0])+(matrix[5]*rightMatrix[1])+(matrix[9]*rightMatrix[2])+(matrix[13]*rightMatrix[3]);\n\ttmpMatrix[2]  = (matrix[2]*rightMatrix[0])+(matrix[6]*rightMatrix[1])+(matrix[10]*rightMatrix[2])+(matrix[14]*rightMatrix[3]);\n\ttmpMatrix[3]  = (matrix[3]*rightMatrix[0])+(matrix[7]*rightMatrix[1])+(matrix[11]*rightMatrix[2])+(matrix[15]*rightMatrix[3]);\n\n\ttmpMatrix[4]  = (matrix[0]*rightMatrix[4])+(matrix[4]*rightMatrix[5])+(matrix[8]*rightMatrix[6])+(matrix[12]*rightMatrix[7]);\n\ttmpMatrix[5]  = (matrix[1]*rightMatrix[4])+(matrix[5]*rightMatrix[5])+(matrix[9]*rightMatrix[6])+(matrix[13]*rightMatrix[7]);\n\ttmpMatrix[6]  = (matrix[2]*rightMatrix[4])+(matrix[6]*rightMatrix[5])+(matrix[10]*rightMatrix[6])+(matrix[14]*rightMatrix[7]);\n\ttmpMatrix[7]  = (matrix[3]*rightMatrix[4])+(matrix[7]*rightMatrix[5])+(matrix[11]*rightMatrix[6])+(matrix[15]*rightMatrix[7]);\n\n\ttmpMatrix[8]  = (matrix[0]*rightMatrix[8])+(matrix[4]*rightMatrix[9])+(matrix[8]*rightMatrix[10])+(matrix[12]*rightMatrix[11]);\n\ttmpMatrix[9]  = (matrix[1]*rightMatrix[8])+(matrix[5]*rightMatrix[9])+(matrix[9]*rightMatrix[10])+(matrix[13]*rightMatrix[11]);\n\ttmpMatrix[10] = (matrix[2]*rightMatrix[8])+(matrix[6]*rightMatrix[9])+(matrix[10]*rightMatrix[10])+(matrix[14]*rightMatrix[11]);\n\ttmpMatrix[11] = (matrix[3]*rightMatrix[8])+(matrix[7]*rightMatrix[9])+(matrix[11]*rightMatrix[10])+(matrix[15]*rightMatrix[11]);\n\n\ttmpMatrix[12] = (matrix[0]*rightMatrix[12])+(matrix[4]*rightMatrix[13])+(matrix[8]*rightMatrix[14])+(matrix[12]*rightMatrix[15]);\n\ttmpMatrix[13] = (matrix[1]*rightMatrix[12])+(matrix[5]*rightMatrix[13])+(matrix[9]*rightMatrix[14])+(matrix[13]*rightMatrix[15]);\n\ttmpMatrix[14] = (matrix[2]*rightMatrix[12])+(matrix[6]*rightMatrix[13])+(matrix[10]*rightMatrix[14])+(matrix[14]*rightMatrix[15]);\n\ttmpMatrix[15] = (matrix[3]*rightMatrix[12])+(matrix[7]*rightMatrix[13])+(matrix[11]*rightMatrix[14])+(matrix[15]*rightMatrix[15]);\n\n\tmemcpy (matrix, tmpMatrix, sizeof(float)*16);\n}\n\nvoid MatrixTranslate\t(float *matrix, const float *ptr)\n{\n\tmatrix[12] += (matrix[0]*ptr[0])+(matrix[4]*ptr[1])+(matrix[ 8]*ptr[2]);\n\tmatrix[13] += (matrix[1]*ptr[0])+(matrix[5]*ptr[1])+(matrix[ 9]*ptr[2]);\n\tmatrix[14] += (matrix[2]*ptr[0])+(matrix[6]*ptr[1])+(matrix[10]*ptr[2]);\n\tmatrix[15] += (matrix[3]*ptr[0])+(matrix[7]*ptr[1])+(matrix[11]*ptr[2]);\n}\n\nvoid MatrixScale (float *matrix, const float *ptr)\n{\n\tmatrix[0]  *= ptr[0];\n\tmatrix[1]  *= ptr[0];\n\tmatrix[2]  *= ptr[0];\n\tmatrix[3]  *= ptr[0];\n\n\tmatrix[4]  *= ptr[1];\n\tmatrix[5]  *= ptr[1];\n\tmatrix[6]  *= ptr[1];\n\tmatrix[7]  *= ptr[1];\n\n\tmatrix[8] *= ptr[2];\n\tmatrix[9] *= ptr[2];\n\tmatrix[10] *= ptr[2];\n\tmatrix[11] *= ptr[2];\n}\n\n#endif //switched c/asm functions\n//-----------------------------------------\n\nvoid MatrixInit  (s32 *matrix)\n{\n\tmemset (matrix, 0, sizeof(s32)*16);\n\tmatrix[0] = matrix[5] = matrix[10] = matrix[15] = 1<<12;\n}\n\nvoid MatrixInit  (float *matrix)\n{\n\tmemset (matrix, 0, sizeof(float)*16);\n\tmatrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.f;\n}\n\nvoid MatrixTranspose(float *matrix)\n{\n\tfloat temp;\n#define swap(A,B) temp = matrix[A];matrix[A] = matrix[B]; matrix[B] = temp;\n\tswap(1,4);\n\tswap(2,8);\n\tswap(3,0xC);\n\tswap(6,9);\n\tswap(7,0xD);\n\tswap(0xB,0xE);\n#undef swap\n}\n\nvoid MatrixTranspose(s32 *matrix)\n{\n\ts32 temp;\n#define swap(A,B) temp = matrix[A];matrix[A] = matrix[B]; matrix[B] = temp;\n\tswap(1,4);\n\tswap(2,8);\n\tswap(3,0xC);\n\tswap(6,9);\n\tswap(7,0xD);\n\tswap(0xB,0xE);\n#undef swap\n}\n\nvoid\tMatrixIdentity\t\t\t(s32 *matrix)\n{\n\tmatrix[1] = matrix[2] = matrix[3] = matrix[4] = 0;\n\tmatrix[6] = matrix[7] = matrix[8] = matrix[9] = 0;\n\tmatrix[11] = matrix[12] = matrix[13] = matrix[14] = 0;\n\tmatrix[0] = matrix[5] = matrix[10] = matrix[15] = 1<<12;\n}\n\nvoid MatrixIdentity\t(float *matrix)\n{\n\tmatrix[1] = matrix[2] = matrix[3] = matrix[4] = 0.0f;\n\tmatrix[6] = matrix[7] = matrix[8] = matrix[9] = 0.0f;\n\tmatrix[11] = matrix[12] = matrix[13] = matrix[14] = 0.0f;\n\tmatrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.f;\n}\n\nfloat MatrixGetMultipliedIndex (int index, float *matrix, float *rightMatrix)\n{\n\tint iMod = index%4, iDiv = (index>>2)<<2;\n\n\treturn\t(matrix[iMod  ]*rightMatrix[iDiv  ])+(matrix[iMod+ 4]*rightMatrix[iDiv+1])+\n\t\t\t(matrix[iMod+8]*rightMatrix[iDiv+2])+(matrix[iMod+12]*rightMatrix[iDiv+3]);\n}\n\ns32 MatrixGetMultipliedIndex (int index, s32 *matrix, s32 *rightMatrix)\n{\n\tint iMod = index%4, iDiv = (index>>2)<<2;\n\n\ts64 temp = ((s64)matrix[iMod  ]*rightMatrix[iDiv  ])+((s64)matrix[iMod+ 4]*rightMatrix[iDiv+1])+\n\t\t\t((s64)matrix[iMod+8]*rightMatrix[iDiv+2])+((s64)matrix[iMod+12]*rightMatrix[iDiv+3]);\n\n\treturn (s32)(temp>>12);\n}\n\nvoid MatrixSet (float *matrix, int x, int y, float value)\n{\n\tmatrix [x+(y<<2)] = value;\n}\n\nvoid MatrixSet (s32 *matrix, int x, int y, s32 value)\n{\n\tmatrix [x+(y<<2)] = value;\n}\n\nvoid MatrixCopy (float* matrixDST, const float* matrixSRC)\n{\n\tmemcpy(matrixDST,matrixSRC,sizeof(float)*16);\n}\n\nvoid MatrixCopy (s32* matrixDST, const s32* matrixSRC)\n{\n\tmemcpy(matrixDST,matrixSRC,sizeof(s32)*16);\n}\n\nint MatrixCompare (const float* matrixDST, const float* matrixSRC)\n{\n\treturn memcmp((void*)matrixDST, matrixSRC, sizeof(float)*16);\n}\n\nint MatrixCompare (const s32* matrixDST, const s32* matrixSRC)\n{\n\treturn memcmp((void*)matrixDST, matrixSRC, sizeof(s32)*16);\n}\n\nvoid MatrixStackInit(MatrixStack *stack)\n{\n\tfor (int i = 0; i < stack->size; i++)\n\t{\n\t\tMatrixInit(&stack->matrix[i*16]);\n\t}\n\tstack->position = 0;\n}\n\nvoid MatrixStackSetMaxSize (MatrixStack *stack, int size)\n{\n\tint i;\n\n\tstack->size = (size + 1);\n\n\tif (stack->matrix != NULL) {\n\t\tfree (stack->matrix);\n\t}\n#ifdef GFX3D_USE_FLOAT\n\tstack->matrix = new float[stack->size*16*sizeof(float)];\n#else\n\tstack->matrix = new s32[stack->size*16*sizeof(s32)];\n#endif\n\tfor (i = 0; i < stack->size; i++)\n\t{\n\t\tMatrixInit (&stack->matrix[i*16]);\n\t}\n\n\tstack->size--;\n}\n\n\nMatrixStack::MatrixStack(int size, int type)\n{\n\tMatrixStackSetMaxSize(this,size);\n\tthis->type = type;\n}\n\nstatic void MatrixStackSetStackPosition (MatrixStack *stack, int pos)\n{\n\tstack->position += pos;\n\n\tif((stack->position < 0) || (stack->position > stack->size))\n\t\tMMU_new.gxstat.se = 1;\n\n\t//once upon a time, we tried clamping to the size.\n\t//this utterly broke sims 2 apartment pets.\n\t//changing to wrap around made it work perfectly\n\tstack->position = ((u32)stack->position) & stack->size;\n}\n\n#ifdef GFX3D_USE_FLOAT\nvoid MatrixStackPushMatrix (MatrixStack *stack, const float *ptr)\n#else\nvoid MatrixStackPushMatrix (MatrixStack *stack, const s32 *ptr)\n#endif\n{\n\t//printf(\"Push %i pos %i\\n\", stack->type, stack->position);\n\tif ((stack->type == 0) || (stack->type == 3))\n\t\tMatrixCopy (&stack->matrix[0], ptr);\n\telse\n\t\tMatrixCopy (&stack->matrix[stack->position*16], ptr);\n\tMatrixStackSetStackPosition (stack, 1);\n}\n\n#ifdef GFX3D_USE_FLOAT\nvoid MatrixStackPopMatrix (float *mtxCurr, MatrixStack *stack, int size)\n#else\nvoid MatrixStackPopMatrix (s32 *mtxCurr, MatrixStack *stack, int size)\n#endif\n{\n\t//printf(\"Pop %i pos %i (change %d)\\n\", stack->type, stack->position, -size);\n\tMatrixStackSetStackPosition(stack, -size);\n\tif ((stack->type == 0) || (stack->type == 3))\n\t\tMatrixCopy (mtxCurr, &stack->matrix[0]);\n\telse\n\t\tMatrixCopy (mtxCurr, &stack->matrix[stack->position*16]);\n}\n\n#ifdef GFX3D_USE_FLOAT\nfloat * MatrixStackGetPos (MatrixStack *stack, int pos)\n#else\ns32 * MatrixStackGetPos (MatrixStack *stack, int pos)\n#endif\n{\n\tassert(pos<31);\n\treturn &stack->matrix[pos*16];\n}\n\n#ifdef GFX3D_USE_FLOAT\nfloat * MatrixStackGet (MatrixStack *stack)\n#else\ns32 * MatrixStackGet (MatrixStack *stack)\n#endif\n{\n\treturn &stack->matrix[stack->position*16];\n}\n\n#ifdef GFX3D_USE_FLOAT\nvoid MatrixStackLoadMatrix (MatrixStack *stack, int pos, const float *ptr)\n#else\nvoid MatrixStackLoadMatrix (MatrixStack *stack, int pos, const s32 *ptr)\n#endif\n{\n\tassert(pos<31);\n\tMatrixCopy (&stack->matrix[pos*16], ptr);\n}\n\nvoid Vector2Copy(float *dst, const float *src)\n{\n\tdst[0] = src[0];\n\tdst[1] = src[1];\n}\n\nvoid Vector2Add(float *dst, const float *src)\n{\n\tdst[0] += src[0];\n\tdst[1] += src[1];\n}\n\nvoid Vector2Subtract(float *dst, const float *src)\n{\n\tdst[0] -= src[0];\n\tdst[1] -= src[1];\n}\n\nfloat Vector2Dot(const float *a, const float *b)\n{\n\treturn (a[0]*b[0]) + (a[1]*b[1]);\n}\n\n/* http://www.gamedev.net/community/forums/topic.asp?topic_id=289972 */\nfloat Vector2Cross(const float *a, const float *b)\n{\n\treturn (a[0]*b[1]) - (a[1]*b[0]);\n}\n\nfloat Vector3Dot(const float *a, const float *b) \n{\n\treturn a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n}\n\nvoid Vector3Cross(float* dst, const float *a, const float *b) \n{\n\tdst[0] = a[1]*b[2] - a[2]*b[1];\n\tdst[1] = a[2]*b[0] - a[0]*b[2];\n\tdst[2] = a[0]*b[1] - a[1]*b[0];\n}\n\n\nfloat Vector3Length(const float *a)\n{\n\tfloat lengthSquared = Vector3Dot(a,a);\n\tfloat length = sqrt(lengthSquared);\n\treturn length;\n}\n\nvoid Vector3Add(float *dst, const float *src)\n{\n\tdst[0] += src[0];\n\tdst[1] += src[1];\n\tdst[2] += src[2];\n}\n\nvoid Vector3Subtract(float *dst, const float *src)\n{\n\tdst[0] -= src[0];\n\tdst[1] -= src[1];\n\tdst[2] -= src[2];\n}\n\nvoid Vector3Scale(float *dst, const float scale)\n{\n\tdst[0] *= scale;\n\tdst[1] *= scale;\n\tdst[2] *= scale;\n}\n\nvoid Vector3Copy(float *dst, const float *src)\n{\n\tdst[0] = src[0];\n\tdst[1] = src[1];\n\tdst[2] = src[2];\n}\n\nvoid Vector3Normalize(float *dst)\n{\n\tfloat length = Vector3Length(dst);\n\tVector3Scale(dst,1.0f/length);\n}\n\nvoid Vector4Copy(float *dst, const float *src)\n{\n\tdst[0] = src[0];\n\tdst[1] = src[1];\n\tdst[2] = src[2];\n\tdst[3] = src[3];\n}\n\n\nvoid MatrixMultiply (s32 *matrix, const s32 *rightMatrix)\n{\n\ts32 tmpMatrix[16];\n\n\ttmpMatrix[0]  = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[0])+fx32_mul(matrix[4],rightMatrix[1])+fx32_mul(matrix[8],rightMatrix[2])+fx32_mul(matrix[12],rightMatrix[3]));\n\ttmpMatrix[1]  = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[0])+fx32_mul(matrix[5],rightMatrix[1])+fx32_mul(matrix[9],rightMatrix[2])+fx32_mul(matrix[13],rightMatrix[3]));\n\ttmpMatrix[2]  = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[0])+fx32_mul(matrix[6],rightMatrix[1])+fx32_mul(matrix[10],rightMatrix[2])+fx32_mul(matrix[14],rightMatrix[3]));\n\ttmpMatrix[3]  = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[0])+fx32_mul(matrix[7],rightMatrix[1])+fx32_mul(matrix[11],rightMatrix[2])+fx32_mul(matrix[15],rightMatrix[3]));\n\n\ttmpMatrix[4]  = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[4])+fx32_mul(matrix[4],rightMatrix[5])+fx32_mul(matrix[8],rightMatrix[6])+fx32_mul(matrix[12],rightMatrix[7]));\n\ttmpMatrix[5]  = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[4])+fx32_mul(matrix[5],rightMatrix[5])+fx32_mul(matrix[9],rightMatrix[6])+fx32_mul(matrix[13],rightMatrix[7]));\n\ttmpMatrix[6]  = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[4])+fx32_mul(matrix[6],rightMatrix[5])+fx32_mul(matrix[10],rightMatrix[6])+fx32_mul(matrix[14],rightMatrix[7]));\n\ttmpMatrix[7]  = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[4])+fx32_mul(matrix[7],rightMatrix[5])+fx32_mul(matrix[11],rightMatrix[6])+fx32_mul(matrix[15],rightMatrix[7]));\n\n\ttmpMatrix[8]  = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[8])+fx32_mul(matrix[4],rightMatrix[9])+fx32_mul(matrix[8],rightMatrix[10])+fx32_mul(matrix[12],rightMatrix[11]));\n\ttmpMatrix[9]  = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[8])+fx32_mul(matrix[5],rightMatrix[9])+fx32_mul(matrix[9],rightMatrix[10])+fx32_mul(matrix[13],rightMatrix[11]));\n\ttmpMatrix[10] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[8])+fx32_mul(matrix[6],rightMatrix[9])+fx32_mul(matrix[10],rightMatrix[10])+fx32_mul(matrix[14],rightMatrix[11]));\n\ttmpMatrix[11] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[8])+fx32_mul(matrix[7],rightMatrix[9])+fx32_mul(matrix[11],rightMatrix[10])+fx32_mul(matrix[15],rightMatrix[11]));\n\n\ttmpMatrix[12] = fx32_shiftdown(fx32_mul(matrix[0],rightMatrix[12])+fx32_mul(matrix[4],rightMatrix[13])+fx32_mul(matrix[8],rightMatrix[14])+fx32_mul(matrix[12],rightMatrix[15]));\n\ttmpMatrix[13] = fx32_shiftdown(fx32_mul(matrix[1],rightMatrix[12])+fx32_mul(matrix[5],rightMatrix[13])+fx32_mul(matrix[9],rightMatrix[14])+fx32_mul(matrix[13],rightMatrix[15]));\n\ttmpMatrix[14] = fx32_shiftdown(fx32_mul(matrix[2],rightMatrix[12])+fx32_mul(matrix[6],rightMatrix[13])+fx32_mul(matrix[10],rightMatrix[14])+fx32_mul(matrix[14],rightMatrix[15]));\n\ttmpMatrix[15] = fx32_shiftdown(fx32_mul(matrix[3],rightMatrix[12])+fx32_mul(matrix[7],rightMatrix[13])+fx32_mul(matrix[11],rightMatrix[14])+fx32_mul(matrix[15],rightMatrix[15]));\n\n\tmemcpy(matrix,tmpMatrix,sizeof(s32)*16);\n}\n\nvoid MatrixScale(s32 *matrix, const s32 *ptr)\n{\n\t//zero 21-sep-2010 - verified unrolling seems faster on my cpu\n\tMACRODO_N(12,\n\t\tmatrix[X] = fx32_shiftdown(fx32_mul(matrix[X],ptr[X>>2]))\n\t\t);\n}\n\nvoid MatrixTranslate(s32 *matrix, const s32 *ptr)\n{\n\tMACRODO_N(4,\n\t{\n\t\ts64 temp = fx32_shiftup(matrix[X+12]);\n\t\ttemp += fx32_mul(matrix[X+0],ptr[0]);\n\t\ttemp += fx32_mul(matrix[X+4],ptr[1]);\n\t\ttemp += fx32_mul(matrix[X+8],ptr[2]);\n\t\tmatrix[X+12] = fx32_shiftdown(temp);\n\t});\n}\n\nvoid MatrixMultVec4x4_M2(const s32 *matrix, s32 *vecPtr)\n{\n\tMatrixMultVec4x4(matrix+16,vecPtr);\n\tMatrixMultVec4x4(matrix,vecPtr);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/matrix.h",
    "content": "/*  \n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2007-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef MATRIX_H\n#define MATRIX_H\n\n#include <math.h>\n#include <string.h>\n\n#include \"types.h\"\n#include \"mem.h\"\n\n#ifdef ENABLE_SSE\n#include <xmmintrin.h>\n#endif\n\n#ifdef ENABLE_SSE2\n#include <emmintrin.h>\n#endif\n\n#ifdef HAVE_NEON\nextern \"C\" {\n#include \"android/math-neon/math_neon.h\"\n}\n#endif\n\n#ifdef GFX3D_USE_FLOAT\nstruct MatrixStack\n{\n\tMatrixStack(int size, int type);\n\tfloat\t*matrix;\n\ts32\t\tposition;\n\ts32\t\tsize;\n\tu8\t\ttype;\n};\n#else\nstruct MatrixStack\n{\n\tMatrixStack(int size, int type);\n\ts32\t\t*matrix;\n\ts32\t\tposition;\n\ts32\t\tsize;\n\tu8\t\ttype;\n};\n#endif\n\nvoid\tMatrixInit\t\t\t\t(float *matrix);\nvoid\tMatrixInit\t\t\t\t(s32 *matrix);\n\n//In order to conditionally use these asm optimized functions in visual studio\n//without having to make new build types to exclude the assembly files.\n//a bit sloppy, but there aint much to it\n\nfloat\tMatrixGetMultipliedIndex\t(int index, float *matrix, float *rightMatrix);\ns32\tMatrixGetMultipliedIndex\t(int index, s32 *matrix, s32 *rightMatrix);\nvoid\tMatrixSet\t\t\t\t(float *matrix, int x, int y, float value);\nvoid\tMatrixSet\t\t\t\t(s32 *matrix, int x, int y, s32 value);\nvoid\tMatrixCopy\t\t\t\t(float * matrixDST, const float * matrixSRC);\nvoid\tMatrixCopy\t\t\t\t(s32 * matrixDST, const s32 * matrixSRC);\nint\t\tMatrixCompare\t\t\t\t(const float * matrixDST, const float * matrixSRC);\nint\t\tMatrixCompare\t\t\t\t(const s32 * matrixDST, const s32 * matrixSRC);\nvoid\tMatrixIdentity\t\t\t(float *matrix);\nvoid\tMatrixIdentity\t\t\t(s32 *matrix);\nvoid\tMatrixTranspose\t\t\t\t(float *matrix);\nvoid\tMatrixTranspose\t\t\t\t(s32 *matrix);\n\nvoid\tMatrixStackInit\t\t\t\t(MatrixStack *stack);\nvoid\tMatrixStackSetMaxSize\t\t(MatrixStack *stack, int size);\n#ifdef GFX3D_USE_FLOAT\nvoid\tMatrixStackPushMatrix\t\t(MatrixStack *stack, const float *ptr);\nvoid\tMatrixStackPopMatrix\t\t(float *mtxCurr, MatrixStack *stack, int size);\nfloat*\tMatrixStackGetPos\t\t\t(MatrixStack *stack, int pos);\nfloat*\tMatrixStackGet\t\t\t\t(MatrixStack *stack);\nvoid\tMatrixStackLoadMatrix\t\t(MatrixStack *stack, int pos, const float *ptr);\n#else\nvoid\tMatrixStackPushMatrix\t\t(MatrixStack *stack, const s32 *ptr);\nvoid\tMatrixStackPopMatrix\t\t(s32 *mtxCurr, MatrixStack *stack, int size);\ns32*\tMatrixStackGetPos\t\t\t(MatrixStack *stack, int pos);\ns32*\tMatrixStackGet\t\t\t\t(MatrixStack *stack);\nvoid\tMatrixStackLoadMatrix\t\t(MatrixStack *stack, int pos, const s32 *ptr);\n#endif\n\nvoid Vector2Copy(float *dst, const float *src);\nvoid Vector2Add(float *dst, const float *src);\nvoid Vector2Subtract(float *dst, const float *src);\nfloat Vector2Dot(const float *a, const float *b);\nfloat Vector2Cross(const float *a, const float *b);\n\nfloat Vector3Dot(const float *a, const float *b);\nvoid Vector3Cross(float* dst, const float *a, const float *b);\nfloat Vector3Length(const float *a);\nvoid Vector3Add(float *dst, const float *src);\nvoid Vector3Subtract(float *dst, const float *src);\nvoid Vector3Scale(float *dst, const float scale);\nvoid Vector3Copy(float *dst, const float *src);\nvoid Vector3Normalize(float *dst);\n\nvoid Vector4Copy(float *dst, const float *src);\n\n//these functions are an unreliable, inaccurate floor.\n//it should only be used for positive numbers\n//this isnt as fast as it could be if we used a visual c++ intrinsic, but those appear not to be universally available\nFORCEINLINE u32 u32floor(float f)\n{\n#ifdef ENABLE_SSE2\n\treturn (u32)_mm_cvtt_ss2si(_mm_set_ss(f));\n#else\n\treturn (u32)f;\n#endif\n}\nFORCEINLINE u32 u32floor(double d)\n{\n#ifdef ENABLE_SSE2\n\treturn (u32)_mm_cvttsd_si32(_mm_set_sd(d));\n#else\n\treturn (u32)d;\n#endif\n}\n\n//same as above but works for negative values too.\n//be sure that the results are the same thing as floorf!\nFORCEINLINE s32 s32floor(float f)\n{\n#ifdef ENABLE_SSE2\n\treturn _mm_cvtss_si32( _mm_add_ss(_mm_set_ss(-0.5f),_mm_add_ss(_mm_set_ss(f), _mm_set_ss(f))) ) >> 1;\n#else\n\treturn (s32)floorf(f);\n#endif\n}\nFORCEINLINE s32 s32floor(double d)\n{\n\treturn s32floor((float)d);\n}\n\n//switched SSE2 functions\n//-------------\n#ifdef ENABLE_SSE2\n\ntemplate<int NUM>\nFORCEINLINE void memset_u16_le(void* dst, u16 val)\n{\n\tu32 u32val;\n\t//just for the endian safety\n\tT1WriteWord((u8*)&u32val,0,val);\n\tT1WriteWord((u8*)&u32val,2,val);\n\t////const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val);\n\t\n#if defined(__GNUC__) || defined(__INTEL_COMPILER)\n\tconst __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val);\n\tMACRODO_N(NUM/8,_mm_store_si128((__m128i*)((u8*)dst+(X)*16), temp));\n#else\n\t__m128 temp; temp.m128_i32[0] = u32val;\n\t//MACRODO_N(NUM/8,_mm_store_si128((__m128i*)((u8*)dst+(X)*16), temp));\n\tMACRODO_N(NUM/8,_mm_store_ps1((float*)((u8*)dst+(X)*16), temp));\n#endif\n}\n\n#else //no sse2\n\ntemplate<int NUM>\nstatic FORCEINLINE void memset_u16_le(void* dst, u16 val)\n{\n\tfor(int i=0;i<NUM;i++)\n\t\tT1WriteWord((u8*)dst,i<<1,val);\n}\n\n#endif\n\n// NOSSE version always used in gfx3d.cpp\nvoid _NOSSE_MatrixMultVec4x4 (const float *matrix, float *vecPtr);\nvoid MatrixMultVec3x3_fixed(const s32 *matrix, s32 *vecPtr);\n\n//---------------------------\n//switched SSE functions\n#ifdef ENABLE_SSE\n\nstruct SSE_MATRIX\n{\n\tSSE_MATRIX(const float *matrix)\n\t\t: row0(_mm_load_ps(matrix))\n\t\t, row1(_mm_load_ps(matrix+4))\n\t\t, row2(_mm_load_ps(matrix+8))\n\t\t, row3(_mm_load_ps(matrix+12))\n\t{}\n\n\tunion {\n\t\t__m128 rows[4];\n\t\tstruct { __m128 row0; __m128 row1; __m128 row2; __m128 row3; };\n\t};\n\t\t\n};\n\nFORCEINLINE __m128 _util_MatrixMultVec4x4_(const SSE_MATRIX &mat, __m128 vec)\n{\n\t__m128 xmm5 = _mm_shuffle_ps(vec, vec, B8(01010101));\n\t__m128 xmm6 = _mm_shuffle_ps(vec, vec, B8(10101010));\n\t__m128 xmm7 = _mm_shuffle_ps(vec, vec, B8(11111111));\n\t__m128 xmm4 = _mm_shuffle_ps(vec, vec, B8(00000000));\n\n\txmm4 = _mm_mul_ps(xmm4,mat.row0);\n\txmm5 = _mm_mul_ps(xmm5,mat.row1);\n\txmm6 = _mm_mul_ps(xmm6,mat.row2);\n\txmm7 = _mm_mul_ps(xmm7,mat.row3);\n\txmm4 = _mm_add_ps(xmm4,xmm5);\n\txmm4 = _mm_add_ps(xmm4,xmm6);\n\txmm4 = _mm_add_ps(xmm4,xmm7);\n\treturn xmm4;\n}\n\nFORCEINLINE void MatrixMultiply(float * matrix, const float * rightMatrix)\n{\n\t//this seems to generate larger code, including many movaps, but maybe it is less harsh on the registers than the\n\t//more hand-tailored approach\n\t__m128 row0 = _util_MatrixMultVec4x4_((SSE_MATRIX)matrix,_mm_load_ps(rightMatrix)); \n\t__m128 row1 = _util_MatrixMultVec4x4_((SSE_MATRIX)matrix,_mm_load_ps(rightMatrix+4));\n\t__m128 row2 = _util_MatrixMultVec4x4_((SSE_MATRIX)matrix,_mm_load_ps(rightMatrix+8)); \n\t__m128 row3 = _util_MatrixMultVec4x4_((SSE_MATRIX)matrix,_mm_load_ps(rightMatrix+12));\n\t_mm_store_ps(matrix,row0); \n\t_mm_store_ps(matrix+4,row1); \n\t_mm_store_ps(matrix+8,row2);\n\t_mm_store_ps(matrix+12,row3);\n}\n\n\n\nFORCEINLINE void MatrixMultVec4x4(const float *matrix, float *vecPtr)\n{\n\t_mm_store_ps(vecPtr,_util_MatrixMultVec4x4_((SSE_MATRIX)matrix,_mm_load_ps(vecPtr)));\n}\n\nFORCEINLINE void MatrixMultVec4x4_M2(const float *matrix, float *vecPtr)\n{\n\t//there are hardly any gains from merging these manually\n\tMatrixMultVec4x4(matrix+16,vecPtr);\n\tMatrixMultVec4x4(matrix,vecPtr);\n}\n\nFORCEINLINE void MatrixMultVec3x3(const float * matrix, float * vecPtr)\n{\n\tconst __m128 vec = _mm_load_ps(vecPtr);\n\n\t__m128 xmm5 = _mm_shuffle_ps(vec, vec, B8(01010101));\n\t__m128 xmm6 = _mm_shuffle_ps(vec, vec, B8(10101010));\n\t__m128 xmm4 = _mm_shuffle_ps(vec, vec, B8(00000000));\n\n\tconst SSE_MATRIX mat(matrix);\n\n\txmm4 = _mm_mul_ps(xmm4,mat.row0);\n\txmm5 = _mm_mul_ps(xmm5,mat.row1);\n\txmm6 = _mm_mul_ps(xmm6,mat.row2);\n\txmm4 = _mm_add_ps(xmm4,xmm5);\n\txmm4 = _mm_add_ps(xmm4,xmm6);\n\n\t_mm_store_ps(vecPtr,xmm4);\n}\n\nFORCEINLINE void MatrixTranslate(float *matrix, const float *ptr)\n{\n\t__m128 xmm4 = _mm_load_ps(ptr);\n\t__m128 xmm5 = _mm_shuffle_ps(xmm4, xmm4, B8(01010101));\n\t__m128 xmm6 = _mm_shuffle_ps(xmm4, xmm4, B8(10101010));\n\txmm4 = _mm_shuffle_ps(xmm4, xmm4, B8(00000000));\n\t\n\txmm4 = _mm_mul_ps(xmm4,_mm_load_ps(matrix));\n\txmm5 = _mm_mul_ps(xmm5,_mm_load_ps(matrix+4));\n\txmm6 = _mm_mul_ps(xmm6,_mm_load_ps(matrix+8));\n\txmm4 = _mm_add_ps(xmm4,xmm5);\n\txmm4 = _mm_add_ps(xmm4,xmm6);\n\txmm4 = _mm_add_ps(xmm4,_mm_load_ps(matrix+12));\n\t_mm_store_ps(matrix+12,xmm4);\n}\n\nFORCEINLINE void MatrixScale(float *matrix, const float *ptr)\n{\n\t__m128 xmm4 = _mm_load_ps(ptr);\n\t__m128 xmm5 = _mm_shuffle_ps(xmm4, xmm4, B8(01010101));\n\t__m128 xmm6 = _mm_shuffle_ps(xmm4, xmm4, B8(10101010));\n\txmm4 = _mm_shuffle_ps(xmm4, xmm4, B8(00000000));\n\t\n\txmm4 = _mm_mul_ps(xmm4,_mm_load_ps(matrix));\n\txmm5 = _mm_mul_ps(xmm5,_mm_load_ps(matrix+4));\n\txmm6 = _mm_mul_ps(xmm6,_mm_load_ps(matrix+8));\n\t_mm_store_ps(matrix,xmm4);\n\t_mm_store_ps(matrix+4,xmm5);\n\t_mm_store_ps(matrix+8,xmm6);\n}\n\ntemplate<int NUM_ROWS>\nFORCEINLINE void vector_fix2float(float* matrix, const float divisor)\n{\n\tCTASSERT(NUM_ROWS==3 || NUM_ROWS==4);\n\n\tconst __m128 val = _mm_set_ps1(divisor);\n\n\t_mm_store_ps(matrix,_mm_div_ps(_mm_load_ps(matrix),val));\n\t_mm_store_ps(matrix+4,_mm_div_ps(_mm_load_ps(matrix+4),val));\n\t_mm_store_ps(matrix+8,_mm_div_ps(_mm_load_ps(matrix+8),val));\n\tif(NUM_ROWS==4)\n\t\t_mm_store_ps(matrix+12,_mm_div_ps(_mm_load_ps(matrix+12),val));\n}\n\n//WARNING: I do not think this is as fast as a memset, for some reason.\n//at least in vc2005 with sse enabled. better figure out why before using it\ntemplate<int NUM>\nstatic FORCEINLINE void memset_u8(void* _dst, u8 val)\n{\n\tmemset(_dst,val,NUM);\n\t//const u8* dst = (u8*)_dst;\n\t//u32 u32val = (val<<24)|(val<<16)|(val<<8)|val;\n\t//const __m128i temp = _mm_set_epi32(u32val,u32val,u32val,u32val);\n\t//MACRODO_N(NUM/16,_mm_store_si128((__m128i*)(dst+(X)*16), temp));\n}\n\n#elif defined(HAVE_NEON)\n\nFORCEINLINE void MatrixMultVec4x4(float *matrix, float *vecPtr)\n{\n\tmatvec4_neon(matrix, vecPtr, vecPtr);\n}\n\nFORCEINLINE void MatrixMultVec4x4_M2(float *matrix, float *vecPtr)\n{\n\tmatvec4_neon(matrix+16, vecPtr, vecPtr);\n\tmatvec4_neon(matrix, vecPtr, vecPtr);\n}\n\nFORCEINLINE void MatrixMultiply(float * matrix, float * rightMatrix)\n{\n\tfloat ret[16];\n\tmatmul4_neon(matrix, rightMatrix, ret);\n\tmemcpy(matrix, ret, sizeof(float)*16);\n}\n\n//TODO: NEON implementations\nvoid MatrixMultVec3x3(const float * matrix, float * vecPtr);\nvoid MatrixTranslate(float *matrix, const float *ptr);\nvoid MatrixScale(float * matrix, const float * ptr);\ntemplate<int NUM_ROWS>\nFORCEINLINE void vector_fix2float(float* matrix, const float divisor)\n{\n\tfor(int i=0;i<NUM_ROWS*4;i++)\n\t\tmatrix[i] /= divisor;\n}\n\ntemplate<int NUM>\nstatic FORCEINLINE void memset_u8(void* dst, u8 val)\n{\n\tmemset(dst,val,NUM);\n}\n\n#else //no sse\n\nvoid MatrixMultVec4x4 (const float *matrix, float *vecPtr);\nvoid MatrixMultVec3x3(const float * matrix, float * vecPtr);\nvoid MatrixMultiply(float * matrix, const float * rightMatrix);\nvoid MatrixTranslate(float *matrix, const float *ptr);\nvoid MatrixScale(float * matrix, const float * ptr);\n\nFORCEINLINE void MatrixMultVec4x4_M2(const float *matrix, float *vecPtr)\n{\n\t//there are hardly any gains from merging these manually\n\tMatrixMultVec4x4(matrix+16,vecPtr);\n\tMatrixMultVec4x4(matrix,vecPtr);\n}\n\ntemplate<int NUM_ROWS>\nFORCEINLINE void vector_fix2float(float* matrix, const float divisor)\n{\n\tfor(int i=0;i<NUM_ROWS*4;i++)\n\t\tmatrix[i] /= divisor;\n}\n\ntemplate<int NUM>\nstatic FORCEINLINE void memset_u8(void* dst, u8 val)\n{\n\tmemset(dst,val,NUM);\n}\n\n#endif //switched SSE functions\n\nvoid MatrixMultVec4x4 (const s32 *matrix, s32 *vecPtr);\n\nvoid MatrixMultVec4x4_M2(const s32 *matrix, s32 *vecPtr);\n\nvoid MatrixMultiply(s32* matrix, const s32* rightMatrix);\nvoid MatrixScale(s32 *matrix, const s32 *ptr);\nvoid MatrixTranslate(s32 *matrix, const s32 *ptr);\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/mc.cpp",
    "content": "/*\n\tCopyright (C) 2006 thoduv\n\tCopyright (C) 2006-2007 Theo Berkau\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdlib.h>\n#include <string.h>\n#include \"debug.h\"\n#include \"types.h\"\n#include \"mc.h\"\n#include \"movie.h\"\n#include \"readwrite.h\"\n#include \"NDSSystem.h\"\n#define TIXML_USE_STL\n#include \"utils/tinyxml/tinyxml.h\"\n\n//temporary hack until we have better error reporting facilities\n#ifdef _WINDOWS\n#include <windows.h>\n#elif defined(_XBOX)\n#include <xtl.h>\t// it`s really need?\n#endif\n\n#define FW_CMD_READ             0x03\n#define FW_CMD_WRITEDISABLE     0x04\n#define FW_CMD_READSTATUS       0x05\n#define FW_CMD_WRITEENABLE      0x06\n#define FW_CMD_PAGEWRITE        0x0A\n#define FW_CMD_READ_ID\t\t\t0x9F\n\n#define BM_CMD_AUTODETECT       0xFF\n#define BM_CMD_WRITESTATUS      0x01\n#define BM_CMD_WRITELOW         0x02\n#define BM_CMD_READLOW          0x03\n#define BM_CMD_WRITEDISABLE     0x04\n#define BM_CMD_READSTATUS       0x05\n#define BM_CMD_WRITEENABLE      0x06\n#define BM_CMD_WRITEHIGH        0x0A\n#define BM_CMD_READHIGH         0x0B\n\n/* FLASH*/\n#define COMM_PAGE_WRITE\t\t0x0A\n#define COMM_PAGE_ERASE\t\t0xDB\n#define COMM_SECTOR_ERASE\t0xD8\n#define COMM_CHIP_ERASE\t\t0xC7\n#define CARDFLASH_READ_BYTES_FAST\t0x0B    /* Not used*/\n#define CARDFLASH_DEEP_POWDOWN\t\t0xB9    /* Not used*/\n#define CARDFLASH_WAKEUP\t\t\t0xAB    /* Not used*/\n\n//since r2203 this was 0x00.\n//but baby pals proves finally that it should be 0xFF:\n//the game reads its initial sound volumes from uninitialized data, and if it is 0, the game will be silent\n//if it is 0xFF then the game starts with its sound and music at max, as presumably it is supposed to.\n//so in r3303 I finally changed it (no$ appears definitely to initialized to 0xFF)\nstatic const u8 kUninitializedSaveDataValue = 0xFF; \n\nstatic const char* kDesmumeSaveCookie = \"|-DESMUME SAVE-|\";\n\nstatic const u32 saveSizes[] = {512,\t\t\t// 4k\n\t\t\t\t\t\t\t\t8*1024,\t\t\t// 64k\n\t\t\t\t\t\t\t\t32*1024,\t\t// 512k\n\t\t\t\t\t\t\t\t64*1024,\t\t// 1Mbit\n\t\t\t\t\t\t\t\t256*1024,\t\t// 2Mbit\n\t\t\t\t\t\t\t\t512*1024,\t\t// 4Mbit\n\t\t\t\t\t\t\t\t1024*1024,\t\t// 8Mbit\n\t\t\t\t\t\t\t\t2048*1024,\t\t// 16Mbit\n\t\t\t\t\t\t\t\t4096*1024,\t\t// 32Mbit\n\t\t\t\t\t\t\t\t8192*1024,\t\t// 64Mbit\n\t\t\t\t\t\t\t\t16384*1024,\t\t// 128Mbit\n\t\t\t\t\t\t\t\t32768*1024,\t\t// 256Mbit\n\t\t\t\t\t\t\t\t65536*1024,\t\t// 512Mbit\n\t\t\t\t\t\t\t\t0xFFFFFFFF};\nstatic const u32 saveSizes_count = ARRAY_SIZE(saveSizes);\n\n//the lookup table from user save types to save parameters\nconst SAVE_TYPE save_types[] = {\n\t{\"Autodetect\", MC_TYPE_AUTODETECT,1},\n\t{\"EEPROM 4kbit\",MC_TYPE_EEPROM1,MC_SIZE_4KBITS},\n\t{\"EEPROM 64kbit\",MC_TYPE_EEPROM2,MC_SIZE_64KBITS},\n\t{\"EEPROM 512kbit\",MC_TYPE_EEPROM2,MC_SIZE_512KBITS},\n\t{\"FRAM 256kbit\",MC_TYPE_FRAM,MC_SIZE_256KBITS},\n\t{\"FLASH 2Mbit\",MC_TYPE_FLASH,MC_SIZE_2MBITS},\n\t{\"FLASH 4Mbit\",MC_TYPE_FLASH,MC_SIZE_4MBITS},\n\t{\"FLASH 8Mbit\",MC_TYPE_FLASH,MC_SIZE_8MBITS},\n\t{\"FLASH 16Mbit\",MC_TYPE_FLASH,MC_SIZE_16MBITS},\n\t{\"FLASH 32Mbit\",MC_TYPE_FLASH,MC_SIZE_32MBITS},\n\t{\"FLASH 64Mbit\",MC_TYPE_FLASH,MC_SIZE_64MBITS},\n\t{\"FLASH 128Mbit\",MC_TYPE_FLASH,MC_SIZE_128MBITS},\n\t{\"FLASH 256Mbit\",MC_TYPE_FLASH,MC_SIZE_256MBITS},\n\t{\"FLASH 512Mbit\",MC_TYPE_FLASH,MC_SIZE_512MBITS}\n};\n\n\n//forces the currently selected backup type to be current\n//(can possibly be used to repair poorly chosen save types discovered late in gameplay i.e. pokemon gamers)\nvoid backup_forceManualBackupType()\n{\n\tMMU_new.backupDevice.forceManualBackupType();\n}\n\nvoid backup_setManualBackupType(int type)\n{\n\tCommonSettings.manualBackupType = type;\n}\n\nvoid mc_init(memory_chip_t *mc, int type)\n{\n        mc->com = 0;\n        mc->addr = 0;\n        mc->addr_shift = 0;\n        mc->data = NULL;\n        mc->size = 0;\n        mc->write_enable = FALSE;\n        mc->writeable_buffer = FALSE;\n        mc->type = type;\n        mc->autodetectsize = 0;\n                               \n        switch(mc->type)\n        {\n           case MC_TYPE_EEPROM1:\n              mc->addr_size = 1;\n              break;\n           case MC_TYPE_EEPROM2:\n           case MC_TYPE_FRAM:\n              mc->addr_size = 2;\n              break;\n           case MC_TYPE_FLASH:\n              mc->addr_size = 3;\n              break;\n           default: break;\n        }\n}\n\nu8 *mc_alloc(memory_chip_t *mc, u32 size)\n{\n\tu8 *buffer;\n\tbuffer = new u8[size];\n\tmemset(buffer,0,size);\n\n\tif (mc->data) delete [] mc->data;\n\tmc->data = buffer;\n\tif(!buffer) { return NULL; }\n\tmc->size = size;\n\tmc->writeable_buffer = TRUE;\n\n\treturn buffer;\n}\n\nvoid mc_free(memory_chip_t *mc)\n{\n    if(mc->data) delete[] mc->data;\n    mc_init(mc, 0);\n}\n\nvoid fw_reset_com(memory_chip_t *mc)\n{\n\tif(mc->com == FW_CMD_PAGEWRITE)\n\t{\n\t\tif (mc->fp)\n\t\t{\n\t\t\tfseek(mc->fp, 0, SEEK_SET);\n\t\t\tfwrite(mc->data, mc->size, 1, mc->fp);\n\t\t}\n\n\t\tif (mc->isFirmware&&CommonSettings.UseExtFirmware)\n\t\t{\n\t\t\t// copy User Settings 1 to User Settings 0 area\n\t\t\tmemcpy(&mc->data[0x3FE00], &mc->data[0x3FF00], 0x100);\n\t\t\t\n\t\t\tprintf(\"Firmware: save config\");\n\t\t\tFILE *fp = fopen(mc->userfile, \"wb\");\n\t\t\tif (fp)\n\t\t\t{\n\t\t\t\tif (fwrite(&mc->data[0x3FF00], 1, 0x100, fp) == 0x100)\t\t// User Settings\n\t\t\t\t{\n\t\t\t\t\tif (fwrite(&mc->data[0x0002A], 1, 0x1D6, fp) == 0x1D6)  // WiFi Settings\n\t\t\t\t\t{\n\t\t\t\t\t\tif (fwrite(&mc->data[0x3FA00], 1, 0x300, fp) == 0x300)  // WiFi AP Settings\n\t\t\t\t\t\t\tprintf(\" - done\\n\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tprintf(\" - failed\\n\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfclose(fp);\n\t\t\t}\n\t\t\telse\n\t\t\t\tprintf(\" - failed\\n\");\n\t\t}\n\n\t\tmc->write_enable = FALSE;\n\t}\n\n\tmc->com = 0;\n}\n\nu8 fw_transfer(memory_chip_t *mc, u8 data)\n{\n\tif(mc->com == FW_CMD_READ || mc->com == FW_CMD_PAGEWRITE) /* check if we are in a command that needs 3 bytes address */\n\t{\n\t\tif(mc->addr_shift > 0)   /* if we got a complete address */\n\t\t{\n\t\t\tmc->addr_shift--;\n\t\t\tmc->addr |= data << (mc->addr_shift * 8); /* argument is a byte of address */\n\t\t}\n\t\telse    /* if we have received 3 bytes of address, proceed command */\n\t\t{\n\t\t\tswitch(mc->com)\n\t\t\t{\n\t\t\t\tcase FW_CMD_READ:\n\t\t\t\t\tif(mc->addr < mc->size)  /* check if we can read */\n\t\t\t\t\t{\n\t\t\t\t\t\tdata = mc->data[mc->addr];       /* return byte */\n\t\t\t\t\t\tmc->addr++;      /* then increment address */\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase FW_CMD_PAGEWRITE:\n\t\t\t\t\tif(mc->addr < mc->size)\n\t\t\t\t\t{\n\t\t\t\t\t\tmc->data[mc->addr] = data;       /* write byte */\n\t\t\t\t\t\tmc->addr++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\telse if(mc->com == FW_CMD_READ_ID)\n\t{\n\t\tswitch(mc->addr)\n\t\t{\n\t\t//here is an ID string measured from an old ds fat: 62 16 00 (0x62=sanyo)\n\t\t//but we chose to use an ST from martin's ds fat string so programs might have a clue as to the firmware size:\n\t\t//20 40 12\n\t\tcase 0: \n\t\t\tdata = 0x20;\n\t\t\tmc->addr=1; \n\t\t\tbreak;\n\t\tcase 1: \n\t\t\tdata = 0x40; //according to gbatek this is the device ID for the flash on someone's ds fat\n\t\t\tmc->addr=2; \n\t\t\tbreak;\n\t\tcase 2: \n\t\t\tdata = 0x12;\n\t\t\tmc->addr = 0; \n\t\t\tbreak;\n\t\t}\n\t}\n\telse if(mc->com == FW_CMD_READSTATUS)\n\t{\n\t\treturn (mc->write_enable ? 0x02 : 0x00);\n\t}\n\telse\t//finally, check if it's a new command\n\t{\n\t\tswitch(data)\n\t\t{\n\t\t\tcase 0: break;\t//nothing\n\n\t\t\tcase FW_CMD_READ_ID:\n\t\t\t\tmc->addr = 0;\n\t\t\t\tmc->com = FW_CMD_READ_ID;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase FW_CMD_READ:    //read command\n\t\t\t\tmc->addr = 0;\n\t\t\t\tmc->addr_shift = 3;\n\t\t\t\tmc->com = FW_CMD_READ;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase FW_CMD_WRITEENABLE:     //enable writing\n\t\t\t\tif(mc->writeable_buffer) { mc->write_enable = TRUE; }\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase FW_CMD_WRITEDISABLE:    //disable writing\n\t\t\t\tmc->write_enable = FALSE;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase FW_CMD_PAGEWRITE:       //write command\n\t\t\t\tif(mc->write_enable)\n\t\t\t\t{\n\t\t\t\t\tmc->addr = 0;\n\t\t\t\t\tmc->addr_shift = 3;\n\t\t\t\t\tmc->com = FW_CMD_PAGEWRITE;\n\t\t\t\t}\n\t\t\t\telse { data = 0; }\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase FW_CMD_READSTATUS:  //status register command\n\t\t\t\tmc->com = FW_CMD_READSTATUS;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tprintf(\"Unhandled FW command: %02X\\n\", data);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n\treturn data;\n}\t\n\nbool BackupDevice::save_state(EMUFILE* os)\n{\n\tu32 version = 2;\n\t//v0\n\twrite32le(version,os);\n\twrite32le(write_enable,os);\n\twrite32le(com,os);\n\twrite32le(addr_size,os);\n\twrite32le(addr_counter,os);\n\twrite32le((u32)state,os);\n\twritebuffer(data,os);\n\twritebuffer(data_autodetect,os);\n\t//v1\n\twrite32le(addr,os);\n\t//v2\n\twrite8le(motionInitState,os);\n\twrite8le(motionFlag,os);\n\treturn true;\n}\n\nbool BackupDevice::load_state(EMUFILE* is)\n{\n\tu32 version;\n\tif(read32le(&version,is)!=1) return false;\n\tif(version>=0)\n\t{\n\t\treadbool(&write_enable,is);\n\t\tread32le(&com,is);\n\t\tread32le(&addr_size,is);\n\t\tread32le(&addr_counter,is);\n\t\tu32 temp;\n\t\tread32le(&temp,is);\n\t\tstate = (STATE)temp;\n\t\treadbuffer(data,is);\n\t\treadbuffer(data_autodetect,is);\n\t}\n\tif(version>=1)\n\t\tread32le(&addr,is);\n\tif(version>=2)\n\t{\n\t\tread8le(&motionInitState,is);\n\t\tread8le(&motionFlag,is);\n\t}\n\n\treturn true;\n}\n\nBackupDevice::BackupDevice()\n{\n\tisMovieMode = false;\n\treset();\n}\n\n//due to unfortunate shortcomings in the emulator architecture, \n//at reset-time, we won't have a filename to the .dsv file.\n//so the only difference between load_rom (init) and reset is that\n//one of them saves the filename\nvoid BackupDevice::load_rom(const char* filename)\n{\n\tisMovieMode = false;\n\tthis->filename = filename;\n\treset();\n}\n\nvoid BackupDevice::movie_mode()\n{\n\tisMovieMode = true;\n\treset();\n}\n\nvoid BackupDevice::reset_hardware()\n{\n\twrite_enable = FALSE;\n\tcom = 0;\n\taddr = addr_counter = 0;\n\tmotionInitState = MOTION_INIT_STATE_IDLE;\n\tmotionFlag = MOTION_FLAG_NONE;\n\tstate = DETECTING;\n\tflushPending = false;\n\tlazyFlushPending = false;\n}\n\nvoid BackupDevice::reset()\n{\n\tmemset(&info, 0, sizeof(info));\n\treset_hardware();\n\tresize(0);\n\tdata_autodetect.resize(0);\n\taddr_size = 0;\n\tloadfile();\n\n\t//if the user has requested a manual choice for backup type, and we havent imported a raw save file, then apply it now\n\tif(state == DETECTING && CommonSettings.manualBackupType != MC_TYPE_AUTODETECT)\n\t{\n\t\tstate = RUNNING;\n\t\tint savetype = save_types[CommonSettings.manualBackupType].media_type;\n\t\tint savesize = save_types[CommonSettings.manualBackupType].size;\n\t\tensure((u32)savesize); //expand properly if necessary\n\t\tresize(savesize); //truncate if necessary\n\t\taddr_size = addr_size_for_old_save_type(savetype);\n\t\tflush();\n\t}\n}\n\nvoid BackupDevice::close_rom()\n{\n\tflush();\n}\n\nu8 BackupDevice::searchFileSaveType(u32 size)\n{\n\tfor (u8 i = 1; i < MAX_SAVE_TYPES; i++)\n\t{\n\t\tif (size == save_types[i].size)\n\t\t\treturn (i-1);\n\t}\n\treturn 0xFF;\n}\n\nvoid BackupDevice::reset_command()\n{\n\t//printf(\"MC RESET\\n\");\n\t//for a performance hack, save files are only flushed after each reset command\n\t//(hopefully, after each page)\n\tif(flushPending)\n\t{\n\t\tflush();\n\t\tflushPending = false;\n\t\tlazyFlushPending = false;\n\t}\n\n\tif(state == DETECTING && data_autodetect.size()>0)\n\t{\n\t\t//we can now safely detect the save address size\n\t\tu32 autodetect_size = data_autodetect.size();\n\n\t\tprintf(\"Autodetecting with autodetect_size=%d\\n\",autodetect_size);\n\n\t\tconst u8 sm64_sig[] = {0x01,0x80,0x00,0x00};\n\t\tif(autodetect_size == 4 && !memcmp(&data_autodetect[0],sm64_sig,4))\n\t\t{\n\t\t\taddr_size = 2;\n\t\t}\n\t\telse //detect based on rules\n\t\t\tswitch(autodetect_size)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\t\tmsgbox->error(\"Catastrophic error while autodetecting save type.\\nIt will need to be specified manually\\n\");\n\t\t\t\taddr_size = 1; //choose 1 just to keep the busted savefile from growing too big\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t //the modern typical case for small eeproms\n\t\t\t\taddr_size = 1;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t//another modern typical case..\n\t\t\t\t//but unfortunately we select this case on accident sometimes when what it meant to do was present the archaic 1+2 case\n\t\t\t\t//(the archaic 1+2 case is: specifying one address byte, and then reading the first two bytes, instead of the first one byte, as most other games would do.)\n\t\t\t\t//so, we're gonna hack in checks for the games that are doing this\n\t\t\t\taddr_size = 2;\n\t\t\t\tif(!memcmp(gameInfo.header.gameCode,\"AL3E\",4)) addr_size = 1; //spongebob atlantis squarepantis.\n\t\t\t\tif(!memcmp(gameInfo.header.gameCode,\"AH5E\",4)) addr_size = 1; //over the hedge \n\t\t\t\tif(!memcmp(gameInfo.header.gameCode,\"AQ3E\",4)) addr_size = 1; //spider-man 3\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\t//a modern typical case\n\t\t\t\taddr_size = 3;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t//the archaic case: write the address and then some modulo-4 number of bytes\n\t\t\t\t//why modulo 4? who knows.\n\t\t\t\t//SM64 (KOR) makes it here with autodetect_size=11 and nothing interesting in the buffer\n\t\t\t\taddr_size = autodetect_size & 3;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\tstate = RUNNING;\n\t\tdata_autodetect.resize(0);\n\t\tflush();\n\t}\n\n\tcom = 0;\n}\nu8 BackupDevice::data_command(u8 val, int cpu)\n{\n\t//printf(\"MC CMD: %02X\\n\",val);\n\n\t//motion: some guessing here... hope it doesn't break anything\n\tif(com == BM_CMD_READLOW && motionInitState == MOTION_INIT_STATE_RECEIVED_4_B && val == 0)\n\t{\n\t\tmotionInitState = MOTION_INIT_STATE_IDLE;\n\t\tmotionFlag |= MOTION_FLAG_ENABLED;\n\t\t//return 0x04; //return 0x04 to enable motion!!!!!\n\t\treturn 0; //but we return 0 to disable it! since we don't emulate it anyway\n\t}\n\n\t//if the game firmly believes we have motion support, then ignore all motion commands, since theyre not emulated.\n\tif(motionFlag & MOTION_FLAG_SENSORMODE)\n\t{\n\t\treturn 0;\n\t}\n\n\tif(com == BM_CMD_READLOW || com == BM_CMD_WRITELOW)\n\t{\n\t\t//handle data or address\n\t\tif(state == DETECTING)\n\t\t{\n\t\t\tif(com == BM_CMD_WRITELOW)\n\t\t\t{\n\t\t\t\tprintf(\"Unexpected backup device initialization sequence using writes!\\n\");\n\t\t\t}\n\n\t\t\t//just buffer the data until we're no longer detecting\n\t\t\tdata_autodetect.push_back(val);\n\t\t\tval = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(addr_counter<addr_size)\n\t\t\t{\n\t\t\t\t//continue building address\n\t\t\t\taddr <<= 8;\n\t\t\t\taddr |= val;\n\t\t\t\taddr_counter++;\n\t\t\t\t//if(addr_counter==addr_size) printf(\"ADR: %08X\\n\",addr);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//why does tomb raider underworld access 0x180 and go clear through to 0x280?\n\t\t\t\t//should this wrap around at 0 or at 0x100?\n\t\t\t\tif(addr_size == 1) addr &= 0x1FF; \n\n\t\t\t\t//address is complete\n\t\t\t\tensure(addr+1);\n\t\t\t\tif(com == BM_CMD_READLOW)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"READ ADR: %08X\\n\",addr);\n\t\t\t\t\tval = data[addr];\n\t\t\t\t\t//flushPending = true; //is this a good idea? it may slow stuff down, but it is helpful for debugging\n\t\t\t\t\tlazyFlushPending = true; //lets do this instead\n\t\t\t\t\t//printf(\"read: %08X\\n\",addr);\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tif(write_enable)\n\t\t\t\t\t{\n\t\t\t\t\t\t//printf(\"WRITE ADR: %08X\\n\",addr);\n\t\t\t\t\t\tdata[addr] = val;\n\t\t\t\t\t\tflushPending = true;\n\t\t\t\t\t\t//printf(\"writ: %08X\\n\",addr);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taddr++;\n\n\t\t\t}\n\t\t}\n\t}\n\telse if(com == BM_CMD_READSTATUS)\n\t{\n\t\t//handle request to read status\n\t\tLOG(\"Backup Memory Read Status: %02X\\n\", write_enable << 1);\n\t\treturn (write_enable << 1) | (3<<2);\n\t}\n\telse\n\t{\n\t\t//there is no current command. receive one\n\t\tswitch(val)\n\t\t{\n\t\t\tcase 0: break; //??\n\n\t\t\tcase 0xFE:\n\t\t\t\tif(motionInitState == MOTION_INIT_STATE_IDLE) { motionInitState = MOTION_INIT_STATE_FE; return 0; }\n\t\t\t\tbreak;\n\t\t\tcase 0xFD:\n\t\t\t\tif(motionInitState == MOTION_INIT_STATE_FE) { motionInitState = MOTION_INIT_STATE_FD; return 0; }\n\t\t\t\tbreak;\n\t\t\tcase 0xFB:\n\t\t\t\tif(motionInitState == MOTION_INIT_STATE_FD) { motionInitState = MOTION_INIT_STATE_FB; return 0; }\n\t\t\t\tbreak;\n\t\t\tcase 0xF8:\n\t\t\t\t//enable sensor mode\n\t\t\t\tif(motionInitState == MOTION_INIT_STATE_FD) \n\t\t\t\t{\n\t\t\t\t\tmotionInitState = MOTION_INIT_STATE_IDLE;\n\t\t\t\t\tmotionFlag |= MOTION_FLAG_SENSORMODE;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0xF9:\n\t\t\t\t//disable sensor mode\n\t\t\t\tif(motionInitState == MOTION_INIT_STATE_FD) \n\t\t\t\t{\n\t\t\t\t\tmotionInitState = MOTION_INIT_STATE_IDLE;\n\t\t\t\t\tmotionFlag &= ~MOTION_FLAG_SENSORMODE;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 8:\n\t\t\t\tprintf(\"COMMAND%c: Unverified Backup Memory command: %02X FROM %08X\\n\",(cpu==ARMCPU_ARM9)?'9':'7',val, (cpu==ARMCPU_ARM9)?NDS_ARM9.instruct_adr:NDS_ARM7.instruct_adr);\n\t\t\t\tval = 0xAA;\n\t\t\t\tbreak;\n\n\t\t\tcase BM_CMD_WRITEDISABLE:\n\t\t\t\tswitch(motionInitState)\n\t\t\t\t{\n\t\t\t\tcase MOTION_INIT_STATE_IDLE: motionInitState = MOTION_INIT_STATE_RECEIVED_4; break;\n\t\t\t\tcase MOTION_INIT_STATE_RECEIVED_4: motionInitState = MOTION_INIT_STATE_RECEIVED_4_B; break;\n\t\t\t\t}\n\t\t\t\twrite_enable = FALSE;\n\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\tcase BM_CMD_READSTATUS:\n\t\t\t\tcom = BM_CMD_READSTATUS;\n\t\t\t\tval = (write_enable << 1) | (3<<2);\n\t\t\t\tbreak;\n\n\t\t\tcase BM_CMD_WRITEENABLE:\n\t\t\t\twrite_enable = TRUE;\n\t\t\t\tbreak;\n\n\t\t\tcase BM_CMD_WRITELOW:\n\t\t\tcase BM_CMD_READLOW:\n\t\t\t\t//printf(\"XLO: %08X\\n\",addr);\n\t\t\t\tcom = val;\n\t\t\t\taddr_counter = 0;\n\t\t\t\taddr = 0;\n\t\t\t\tbreak;\n\n\t\t\tcase BM_CMD_WRITEHIGH:\n\t\t\tcase BM_CMD_READHIGH:\n\t\t\t\t//printf(\"XHI: %08X\\n\",addr);\n\t\t\t\tif(val == BM_CMD_WRITEHIGH) val = BM_CMD_WRITELOW;\n\t\t\t\tif(val == BM_CMD_READHIGH) val = BM_CMD_READLOW;\n\t\t\t\tcom = val;\n\t\t\t\taddr_counter = 0;\n\t\t\t\taddr = 0;\n\t\t\t\tif(addr_size==1) {\n\t\t\t\t\t//\"write command that's only available on ST M95040-W that I know of\"\n\t\t\t\t\t//this makes sense, since this device would only have a 256 bytes address space with writelow\n\t\t\t\t\t//and writehigh would allow access to the upper 256 bytes\n\t\t\t\t\t//but it was detected in pokemon diamond also during the main save process\n\t\t\t\t\taddr = 0x1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tprintf(\"COMMAND%c: Unhandled Backup Memory command: %02X FROM %08X\\n\",(cpu==ARMCPU_ARM9)?'9':'7',val, (cpu==ARMCPU_ARM9)?NDS_ARM9.instruct_adr:NDS_ARM7.instruct_adr);\n\t\t\t\tbreak;\n\t\t} //switch(val)\n\n\t\t//motion control state machine broke, return to ground\n\t\tmotionInitState = MOTION_INIT_STATE_IDLE;\n\t}\n\treturn val;\n}\n\n//guarantees that the data buffer has room enough for the specified number of bytes\nvoid BackupDevice::ensure(u32 addr)\n{\n\tu32 size = data.size();\n\tif(size<addr)\n\t{\n\t\tresize(addr);\n\t}\n}\n\nvoid BackupDevice::resize(u32 size)\n{\n\tsize_t old_size = data.size();\n\tdata.resize(size);\n\tfor(u32 i=old_size;i<size;i++)\n\t\tdata[i] = kUninitializedSaveDataValue;\n}\n\nu32 BackupDevice::addr_size_for_old_save_size(int bupmem_size)\n{\n\tswitch(bupmem_size) {\n\t\tcase MC_SIZE_4KBITS: \n\t\t\treturn 1;\n\t\tcase MC_SIZE_64KBITS: \n\t\tcase MC_SIZE_256KBITS:\n\t\tcase MC_SIZE_512KBITS:\n\t\t\treturn 2;\n\t\tcase MC_SIZE_1MBITS:\n\t\tcase MC_SIZE_2MBITS:\n\t\tcase MC_SIZE_4MBITS:\n\t\tcase MC_SIZE_8MBITS:\n\t\tcase MC_SIZE_16MBITS:\n\t\tcase MC_SIZE_64MBITS:\n\t\t\treturn 3;\n\t\tdefault:\n\t\t\treturn 0xFFFFFFFF;\n\t}\n}\n\nu32 BackupDevice::addr_size_for_old_save_type(int bupmem_type)\n{\n\tswitch(bupmem_type)\n\t{\n\t\tcase MC_TYPE_EEPROM1:\n\t\t\treturn 1;\n\t\tcase MC_TYPE_EEPROM2:\n\t\tcase MC_TYPE_FRAM:\n              return 2;\n\t\tcase MC_TYPE_FLASH:\n\t\t\treturn 3;\n\t\tdefault:\n\t\t\treturn 0xFFFFFFFF;\n\t}\n}\n\n\nvoid BackupDevice::load_old_state(u32 addr_size, u8* data, u32 datasize)\n{\n\tstate = RUNNING;\n\tthis->addr_size = addr_size;\n\tresize(datasize);\n\tmemcpy(&this->data[0],data,datasize);\n\n\t//dump back out as a dsv, just to keep things sane\n\tflush();\n}\n\n//======================================================================= no$GBA\n//=======================================================================\n//=======================================================================\nconst char no_GBA_HEADER_ID[] = \"NocashGbaBackupMediaSavDataFile\";\nconst char no_GBA_HEADER_SRAM_ID[] = \"SRAM\";\n\nu32 BackupDevice::get_save_nogba_size(const char* fname)\n{\n\tFILE *fsrc = fopen(fname, \"rb\");\n\tif (fsrc)\n\t{\n\t\tchar src[0x50] = {0};\n\t\tu32 fsize = 0;\n\t\tfseek(fsrc, 0, SEEK_END);\n\t\tfsize = ftell(fsrc);\n\t\tfseek(fsrc, 0, SEEK_SET);\n\t\tif (fsize < 0x50) { fclose(fsrc); return 0xFFFFFFFF; }\n\t\tmemset(&src[0], 0, sizeof(src));\n\t\tif (fread(src, 1, sizeof(src), fsrc) != sizeof(src))  { fclose(fsrc); return 0xFFFFFFFF; }\n\n\t\tfor (u8 i = 0; i < 0x1F; i++)\n\t\t\tif (src[i] != no_GBA_HEADER_ID[i]) { fclose(fsrc); return 0xFFFFFFFF; }\n\t\tif (src[0x1F] != 0x1A) { fclose(fsrc); return 0xFFFFFFFF; }\n\t\tfor (int i = 0; i < 0x4; i++)\n\t\t\tif (src[i+0x40] != no_GBA_HEADER_SRAM_ID[i]) { fclose(fsrc); return 0xFFFFFFFF; }\n\t\t\n\t\tu32 compressMethod = *((u32*)(src+0x44));\n\t\tif (compressMethod == 0)\n\t\t\t{ fclose(fsrc); return *((u32*)(src+0x48)); }\n\t\telse\n\t\t\tif (compressMethod == 1)\n\t\t\t\t{ fclose(fsrc); return *((u32*)(src+0x4C)); }\n\t\tfclose(fsrc);\n\t}\n\treturn 0xFFFFFFFF;\n}\n\nstatic int no_gba_unpackSAV(void *in_buf, u32 fsize, void *out_buf, u32 &size)\n{\n\tu8\t*src = (u8 *)in_buf;\n\tu8\t*dst = (u8 *)out_buf;\n\tu32 src_pos = 0;\n\tu32 dst_pos = 0;\n\tu8\tcc = 0;\n\tu32\tsize_unpacked = 0;\n\tu32\tsize_packed = 0;\n\tu32\tcompressMethod = 0;\n\n\tif (fsize < 0x50) return (1);\n\n\tfor (int i = 0; i < 0x1F; i++)\n\t{\n\t\tif (src[i] != no_GBA_HEADER_ID[i]) return (2);\n\t}\n\tif (src[0x1F] != 0x1A) return (2);\n\tfor (int i = 0; i < 0x4; i++)\n\t{\n\t\tif (src[i+0x40] != no_GBA_HEADER_SRAM_ID[i]) return (2);\n\t}\n\n\tcompressMethod = *((u32*)(src+0x44));\n\n\tif (compressMethod == 0)\t\t\t\t// unpacked\n\t{\n\t\tsize_unpacked = *((u32*)(src+0x48));\n\t\tsrc_pos = 0x4C;\n\t\tfor (u32 i = 0; i < size_unpacked; i++)\n\t\t{\n\t\t\tdst[dst_pos++] = src[src_pos++];\n\t\t}\n\t\tsize = dst_pos;\n\t\treturn (0);\n\t}\n\n\tif (compressMethod == 1)\t\t\t\t// packed (method 1)\n\t{\n\t\tsize_packed = *((u32*)(src+0x48));\n\t\tsize_unpacked = *((u32*)(src+0x4C));\n\n\t\tsrc_pos = 0x50;\n\t\twhile (true)\n\t\t{\n\t\t\tcc = src[src_pos++];\n\t\t\t\n\t\t\tif (cc == 0) \n\t\t\t{\n\t\t\t\tsize = dst_pos;\n\t\t\t\treturn (0);\n\t\t\t}\n\n\t\t\tif (cc == 0x80)\n\t\t\t{\n\t\t\t\tu16 tsize = *((u16*)(src+src_pos+1));\n\t\t\t\tfor (int t = 0; t < tsize; t++)\n\t\t\t\t\tdst[dst_pos++] = src[src_pos];\n\t\t\t\tsrc_pos += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (cc > 0x80)\t\t// repeat\n\t\t\t{\n\t\t\t\tcc -= 0x80;\n\t\t\t\tfor (int t = 0; t < cc; t++)\n\t\t\t\t\tdst[dst_pos++] = src[src_pos];\n\t\t\t\tsrc_pos++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// copy\n\t\t\tfor (int t = 0; t < cc; t++)\n\t\t\t\tdst[dst_pos++] = src[src_pos++];\n\t\t}\n\t\tsize = dst_pos;\n\t\treturn (0);\n\t}\n\treturn (200);\n}\n\nstatic u32 no_gba_savTrim(void *buf, u32 size)\n{\n\tu32 rows = size / 16;\n\tu32 pos = (size - 16);\n\tu8\t*src = (u8*)buf;\n\n\tfor (unsigned int i = 0; i < rows; i++, pos -= 16)\n\t{\n\t\tif (src[pos] == 0xFF)\n\t\t{\n\t\t\tfor (int t = 0; t < 16; t++)\n\t\t\t{\n\t\t\t\tif (src[pos+t] != 0xFF) return (pos+16);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn (pos+16);\n\t\t}\n\t}\n\treturn (size);\n}\n\nstatic u32 no_gba_fillLeft(u32 size)\n{\n\tfor (u32 i = 1; i < ARRAY_SIZE(save_types); i++)\n\t{\n\t\tif (size <= (u32)save_types[i].size)\n\t\t\treturn (size + (save_types[i].size - size));\n\t}\n\treturn size;\n}\n\nbool BackupDevice::load_no_gba(const char *fname, u32 force_size)\n{\n\tFILE\t*fsrc = fopen(fname, \"rb\");\n\tu8\t\t*in_buf = NULL;\n\tu8\t\t*out_buf = NULL;\n\n\tif (fsrc)\n\t{\n\t\tu32 fsize = 0;\n\t\tfseek(fsrc, 0, SEEK_END);\n\t\tfsize = ftell(fsrc);\n\t\tfseek(fsrc, 0, SEEK_SET);\n\t\t//printf(\"Open %s file (size %i bytes)\\n\", fname, fsize);\n\n\t\tin_buf = new u8 [fsize];\n\n\t\tif (fread(in_buf, 1, fsize, fsrc) == fsize)\n\t\t{\n\t\t\tout_buf = new u8 [8 * 1024 * 1024 / 8];\n\t\t\tu32 size = 0;\n\n\t\t\tmemset(out_buf, 0xFF, 8 * 1024 * 1024 / 8);\n\t\t\tif (no_gba_unpackSAV(in_buf, fsize, out_buf, size) == 0)\n\t\t\t{\n\t\t\t\tif (force_size > 0)\n\t\t\t\t\tsize = force_size;\n\t\t\t\t//printf(\"New size %i byte(s)\\n\", size);\n\t\t\t\tsize = no_gba_savTrim(out_buf, size);\n\t\t\t\t//printf(\"--- new size after trim %i byte(s)\\n\", size);\n\t\t\t\tsize = no_gba_fillLeft(size);\n\t\t\t\t//printf(\"--- new size after fill %i byte(s)\\n\", size);\n\t\t\t\traw_applyUserSettings(size, (force_size > 0));\n\t\t\t\tresize(size);\n\t\t\t\tfor (u32 tt = 0; tt < size; tt++)\n\t\t\t\t\tdata[tt] = out_buf[tt];\n\n\t\t\t\t//dump back out as a dsv, just to keep things sane\n\t\t\t\tflush();\n\t\t\t\tprintf(\"---- Loaded no$GBA save\\n\");\n\n\t\t\t\tif (in_buf) delete [] in_buf;\n\t\t\t\tif (out_buf) delete [] out_buf;\n\t\t\t\tfclose(fsrc);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (out_buf) delete [] out_buf;\n\t\t}\n\t\tif (in_buf) delete [] in_buf;\n\t\tfclose(fsrc);\n\t}\n\n\treturn false;\n}\n\nbool BackupDevice::save_no_gba(const char* fname)\n{\n\tFILE* outf = fopen(fname,\"wb\");\n\tif(!outf) return false;\n\tu32 size = data.size();\n\tu32 padSize = pad_up_size(size);\n\tif(data.size()>0)\n\t\tfwrite(&data[0],1,size,outf);\n\tfor(u32 i=size;i<padSize;i++)\n\t\tfputc(0xFF,outf);\n\n\tif (padSize < 512 * 1024)\n\t{\n\t\tfor(u32 i=padSize; i<512 * 1024; i++)\n\t\t\tfputc(0xFF,outf);\n\t}\n\tfclose(outf);\n\treturn true;\n}\n//======================================================================= end\n//=======================================================================\n//======================================================================= no$GBA\n\n\nvoid BackupDevice::loadfile()\n{\n\t//never use save files if we are in movie mode\n\tif(isMovieMode) return;\n\tif(filename.length() ==0) return; //No sense crashing if no filename supplied\n\n\tEMUFILE_FILE* inf = new EMUFILE_FILE(filename.c_str(),\"rb\");\n\tif(inf->fail())\n\t{\n\t\tdelete inf;\n\t\t//no dsv found; we need to try auto-importing a file with .sav extension \n\t\tprintf(\"DeSmuME .dsv save file not found. Trying to load an old raw .sav file.\\n\");\n\t\t\n\t\t//change extension to sav\n\t\tchar tmp[MAX_PATH];\n\t\tstrcpy(tmp,filename.c_str());\n\t\ttmp[strlen(tmp)-3] = 0;\n\t\tstrcat(tmp,\"sav\");\n\n\t\tinf = new EMUFILE_FILE(tmp,\"rb\");\n\t\tif(inf->fail())\n\t\t{\n\t\t\tdelete inf;\n\t\t\tprintf(\"Missing save file %s\\n\",filename.c_str());\n\t\t\treturn;\n\t\t}\n\t\tdelete inf;\n\n\t\tif (!load_no_gba(tmp))\n\t\t\tload_raw(tmp);\n\t}\n\telse\n\t{\n\t\t//scan for desmume save footer\n\t\tconst s32 cookieLen = (s32)strlen(kDesmumeSaveCookie);\n\t\tchar *sigbuf = new char[cookieLen];\n\t\tinf->fseek(-cookieLen, SEEK_END);\n\t\tinf->fread(sigbuf,cookieLen);\n\t\tint cmp = memcmp(sigbuf,kDesmumeSaveCookie,cookieLen);\n\t\tdelete[] sigbuf;\n\t\tif(cmp)\n\t\t{\n\t\t\t//maybe it is a misnamed raw save file. try loading it that way\n\t\t\tprintf(\"Not a DeSmuME .dsv save file. Trying to load as raw.\\n\");\n\t\t\tdelete inf;\n\t\t\tif (!load_no_gba(filename.c_str()))\n\t\t\t\tload_raw(filename.c_str());\n\t\t\treturn;\n\t\t}\n\t\t//desmume format\n\t\tinf->fseek(-cookieLen, SEEK_END);\n\t\tinf->fseek(-4, SEEK_CUR);\n\t\tu32 version = 0xFFFFFFFF;\n\t\tread32le(&version,inf);\n\t\tif(version!=0) {\n\t\t\tprintf(\"Unknown save file format\\n\");\n\t\t\treturn;\n\t\t}\n\t\tinf->fseek(-24, SEEK_CUR);\n\t\tread32le(&info.size,inf);\n\t\tread32le(&info.padSize,inf);\n\t\tread32le(&info.type,inf);\n\t\tread32le(&info.addr_size,inf);\n\t\tread32le(&info.mem_size,inf);\n\n\t\tu32 left = 0;\n\t\tif (CommonSettings.autodetectBackupMethod == 1)\n\t\t{\n\t\t\tif (advsc.isLoaded())\n\t\t\t{\n\t\t\t\tinfo.type = advsc.getSaveType();\n\t\t\t\tif (info.type != 0xFF && info.type != 0xFE)\n\t\t\t\t{\n\t\t\t\t\tinfo.type++;\n\t\t\t\t\tu32 adv_size = save_types[info.type].size;\n\t\t\t\t\tif (info.size > adv_size)\n\t\t\t\t\t\tinfo.size = adv_size;\n\t\t\t\t\telse\n\t\t\t\t\t\tif (info.size < adv_size)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tleft = adv_size - info.size;\n\t\t\t\t\t\t\tinfo.size = adv_size;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//establish the save data\n\t\tresize(info.size);\n\t\tinf->fseek(0, SEEK_SET);\n\t\tif(info.size>0)\n\t\t\tinf->fread(&data[0],info.size - left); //read all the raw data we have\n\t\tstate = RUNNING;\n\t\taddr_size = info.addr_size;\n\t\t//none of the other fields are used right now\n\n\n\t\tif (CommonSettings.autodetectBackupMethod != 1 && info.type == 0) \n\t\t{\n\t\t\tinfo.type = searchFileSaveType(info.size);\n\t\t\tif (info.type == 0xFF) info.type = 0;\n\t\t}\n\n\t\tu32 ss = info.size * 8 / 1024;\n\t\tif (ss >= 1024)\n\t\t{\n\t\t\tss /= 1024;\n\t\t\tprintf(\"Backup size: %i Mbit\\n\", ss);\n\t\t}\n\t\telse\n\t\t\tprintf(\"Backup size: %i Kbit\\n\", ss);\n\n\t\tdelete inf;\n\t}\n}\n\nbool BackupDevice::save_raw(const char* filename)\n{\n\tFILE* outf = fopen(filename,\"wb\");\n\tif(!outf) return false;\n\tu32 size = data.size();\n\tu32 padSize = pad_up_size(size);\n\tif(data.size()>0)\n\t\tfwrite(&data[0],1,size,outf);\n\tfor(u32 i=size;i<padSize;i++)\n\t\tfputc(kUninitializedSaveDataValue,outf);\n\tfclose(outf);\n\treturn true;\n}\n\nu32 BackupDevice::pad_up_size(u32 startSize)\n{\n\tu32 size = startSize;\n\tu32 ctr=0;\n\twhile(ctr<saveSizes_count && size > saveSizes[ctr]) ctr++;\n\tu32 padSize = saveSizes[ctr];\n\tif(padSize == 0xFFFFFFFF)\n\t{\n\t\tprintf(\"PANIC! Couldn't pad up save size. Refusing to pad.\\n\");\n\t\tpadSize = startSize;\n\t}\n\t\treturn padSize;\n}\n\nvoid BackupDevice::lazy_flush()\n{\n\tif(flushPending || lazyFlushPending)\n\t{\n\t\tlazyFlushPending = flushPending = false;\n\t\tflush();\n\t}\n}\n\nvoid BackupDevice::flush()\n{\n\t//never use save files if we are in movie mode\n\tif(isMovieMode) return;\n\n\tif (filename.length() == 0) return;\n\n\tEMUFILE* outf = new EMUFILE_FILE(filename.c_str(),\"wb\");\n\tif(!outf->fail())\n\t{\n\t\tif(data.size()>0)\n\t\t\toutf->fwrite(&data[0],data.size());\n\t\t\n\t\t//write the footer. we use a footer so that we can maximize the chance of the\n\t\t//save file being recognized as a raw save file by other emulators etc.\n\t\t\n\t\t//first, pad up to the next largest known save size.\n\t\tu32 size = data.size();\n\t\tu32 padSize = pad_up_size(size);\n\n\t\tfor(u32 i=size;i<padSize;i++)\n\t\t\toutf->fputc(kUninitializedSaveDataValue);\n\n\t\t//this is just for humans to read\n\t\toutf->fprintf(\"|<--Snip above here to create a raw sav by excluding this DeSmuME savedata footer:\");\n\n\t\t//and now the actual footer\n\t\twrite32le(size,outf); //the size of data that has actually been written\n\t\twrite32le(padSize,outf); //the size we padded it to\n\t\twrite32le(info.type,outf); //save memory type\n\t\twrite32le(addr_size,outf);\n\t\twrite32le(info.size,outf); //save memory size\n\t\twrite32le(0,outf); //version number\n\t\toutf->fprintf(\"%s\", kDesmumeSaveCookie); //this is what we'll use to recognize the desmume format save\n\n\t\tdelete outf;\n\t}\n\telse\n\t{\n\t\tdelete outf;\n\t\tprintf(\"Unable to open savefile %s\\n\", filename.c_str());\n\t}\n}\n\nvoid BackupDevice::raw_applyUserSettings(u32& size, bool manual)\n{\n\t//respect the user's choice of backup memory type\n\tif(CommonSettings.manualBackupType == MC_TYPE_AUTODETECT && !manual)\n\t{\n\t\taddr_size = addr_size_for_old_save_size(size);\n\t\tresize(size);\n\t}\n\telse\n\t{\n\t\tu32 type = CommonSettings.manualBackupType;\n\t\tif (manual)\n\t\t{\n\t\t\tu32 res = searchFileSaveType(size);\n\t\t\tif (res != 0xFF) type = (res + 1); // +1 - skip autodetect\n\t\t}\n\t\tint savetype = save_types[type].media_type;\n\t\tint savesize = save_types[type].size;\n\t\taddr_size = addr_size_for_old_save_type(savetype);\n\t\tif((u32)savesize<size) size = savesize;\n\t\tresize(savesize);\n\t}\n\n\tstate = RUNNING;\n}\n\nu32 BackupDevice::get_save_raw_size(const char* fname)\n{\n\tFILE* inf = fopen(fname,\"rb\");\n\tif (!inf) return 0xFFFFFFFF;\n\n\tfseek(inf, 0, SEEK_END);\n\tu32 size = (u32)ftell(inf);\n\tfclose(inf);\n\treturn size;\n}\n\nbool BackupDevice::load_raw(const char* filename, u32 force_size)\n{\n\tFILE* inf = fopen(filename,\"rb\");\n\n\tif (!inf) return false;\n\n\tfseek(inf, 0, SEEK_END);\n\tu32 size = (u32)ftell(inf);\n\tu32 left = 0;\n\t\n\tif (force_size > 0)\n\t{\n\t\tif (size > force_size)\n\t\t\tsize = force_size;\n\t\telse\n\t\t\tif (size < force_size)\n\t\t\t{\n\t\t\t\tleft = force_size - size;\n\t\t\t\tsize = force_size;\n\t\t\t}\n\t}\n\n\tfseek(inf, 0, SEEK_SET);\n\n\traw_applyUserSettings(size, (force_size > 0));\n\n\tfread(&data[0],1,size-left,inf);\n\tfclose(inf);\n\n\t//dump back out as a dsv, just to keep things sane\n\tflush();\n\n\treturn true;\n}\n\nu32 BackupDevice::get_save_duc_size(const char* fname)\n{\n\tFILE* inf = fopen(fname,\"rb\");\n\tif (!inf) return 0xFFFFFFFF;\n\n\tfseek(inf, 0, SEEK_END);\n\tu32 size = (u32)ftell(inf);\n\tfclose(inf);\n\tif (size < 500) return 0xFFFFFFFF;\n\treturn (size - 500);\n}\n\nbool BackupDevice::load_duc(const char* filename, u32 force_size)\n{\n  u32 size;\n   char id[16];\n   FILE* file = fopen(filename, \"rb\");\n   \n   if(!file) return false;\n\n   fseek(file, 0, SEEK_END);\n   size = (u32)ftell(file) - 500;\n   fseek(file, 0, SEEK_SET);\n\n   // Make sure we really have the right file\n   fread((void *)id, sizeof(char), 16, file);\n\n   if (memcmp(id, \"ARDS000000000001\", 16) != 0)\n   {\n\t\tprintf(\"Not recognized as a valid DUC file\\n\");\n\t\tfclose(file);\n\t\treturn false;\n   }\n   // Skip the rest of the header since we don't need it\n   fseek(file, 500, SEEK_SET);\n\n\tu32 left = 0;\n\tif (force_size > 0)\n\t{\n\t\tif (size > force_size)\n\t\t\tsize = force_size;\n\t\telse\n\t\t\tif (size < force_size)\n\t\t\t{\n\t\t\t\tleft = force_size - size;\n\t\t\t\tsize = force_size;\n\t\t\t}\n\t}\n\n   raw_applyUserSettings(size, (force_size > 0));\n\n   ensure((u32)size);\n\n   fread(&data[0],1,size-left,file);\n   fclose(file);\n\n   //choose \n\n   flush();\n\n   return true;\n\n}\n\nbool BackupDevice::load_movie(EMUFILE* is) {\n\n\tconst s32 cookieLen = (s32)strlen(kDesmumeSaveCookie);\n\n\tis->fseek(-cookieLen, SEEK_END);\n\tis->fseek(-4, SEEK_CUR);\n\n\tu32 version = 0xFFFFFFFF;\n\tis->fread((char*)&version,4);\n\tif(version!=0) {\n\t\tprintf(\"Unknown save file format\\n\");\n\t\treturn false;\n\t}\n\tis->fseek(-24, SEEK_CUR);\n\n\tstruct{\n\t\tu32 size,padSize,type,addr_size,mem_size;\n\t}info;\n\n\tis->fread((char*)&info.size,4);\n\tis->fread((char*)&info.padSize,4);\n\tis->fread((char*)&info.type,4);\n\tis->fread((char*)&info.addr_size,4);\n\tis->fread((char*)&info.mem_size,4);\n\n\t//establish the save data\n\tresize(info.size);\n\tis->fseek(0, SEEK_SET);\n\tif(info.size>0)\n\t\tis->fread((char*)&data[0],info.size);\n\n\tstate = RUNNING;\n\taddr_size = info.addr_size;\n\t//none of the other fields are used right now\n\n\treturn true;\n}\n\nvoid BackupDevice::forceManualBackupType()\n{\n\taddr_size = addr_size_for_old_save_size(save_types[CommonSettings.manualBackupType].size);\n\tstate = RUNNING;\n}\n\n// ============================================= ADVANsCEne\nu8 ADVANsCEne::checkDB(const char *serial, u32 crc)\n{\n\tloaded = false;\n\tFILE *fp = fopen(database_path, \"rb\");\n\tif (fp)\n\t{\n\t\tchar buf[64];\n\t\tmemset(buf, 0, sizeof(buf));\n\t\tif (fread(buf, 1, strlen(_ADVANsCEne_BASE_ID), fp) == strlen(_ADVANsCEne_BASE_ID))\n\t\t{\n\t\t\t//printf(\"ID: %s\\n\", buf);\n\t\t\tif (strcmp(buf, _ADVANsCEne_BASE_ID) == 0)\n\t\t\t{\n\t\t\t\tif (fread(&versionBase[0], 1, 2, fp) == 2)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"Version base: %i.%i\\n\", versionBase[0], versionBase[1]);\n\t\t\t\t\tif (fread(&version[0], 1, 4, fp) == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\t//printf(\"Version: %c%c%c%c\\n\", version[3], version[2], version[1], version[0]);\n\t\t\t\t\t\tif (fread(&createTime, 1, sizeof(time_t), fp) == sizeof(time_t))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmemset(buf, 0,sizeof(buf));\n\t\t\t\t\t\t\t// serial(8) + crc32(4) + save_type(1) = 13 + reserved(8) = 21\n\t\t\t\t\t\t\twhile (true)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (fread(buf, 1, 21, fp) != 21) break;\n\n\t\t\t\t\t\t\t\tbool serialFound = (memcmp(&buf[4], serial, 4) == 0);\n\t\t\t\t\t\t\t\tu32 dbcrc = LE_TO_LOCAL_32(*(u32*)(buf+8));\n\t\t\t\t\t\t\t\tbool crcFound = (crc == dbcrc);\n\n\t\t\t\t\t\t\t\tif(serialFound || crcFound)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfoundAsCrc = crcFound;\n\t\t\t\t\t\t\t\t\tfoundAsSerial = serialFound;\n\t\t\t\t\t\t\t\t\tmemcpy(&crc32, &buf[8], 4);\n\t\t\t\t\t\t\t\t\t//printf(\"%s founded: crc32=%04X, save type %02X\\n\", serial, crc32, buf[12]);\n\t\t\t\t\t\t\t\t\tsaveType = buf[12];\n\t\t\t\t\t\t\t\t\tfclose(fp);\n\t\t\t\t\t\t\t\t\tloaded = true;\n\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfclose(fp);\n\t}\n\treturn false;\n}\n\n\n\nbool ADVANsCEne::getXMLConfig(const char *in_filaname)\n{\n\tTiXmlDocument\t*xml = NULL;\n\tTiXmlElement\t*el = NULL;\n\tTiXmlElement\t*el_configuration = NULL;\n\tTiXmlElement\t*el_newDat = NULL;\n\t\n\txml = new TiXmlDocument();\n\tif (!xml) return false;\n\tif (!xml->LoadFile(in_filaname)) return false;\n\tel = xml->FirstChildElement(\"dat\");\n\tif (!el) return false;\n\tel_configuration = el->FirstChildElement(\"configuration\");\n\tif (!el_configuration) return false;\n\tel = el_configuration->FirstChildElement(\"datName\"); if (el) { datName = el->GetText() ? el->GetText() : \"\"; }\n\tel = el_configuration->FirstChildElement(\"datVersion\"); if (el) { datVersion = el->GetText() ? el->GetText() : \"\"; }\n\t\n\tel_newDat = el_configuration->FirstChildElement(\"newDat\");\n\tif (!el_newDat) return false;\n\tel = el_newDat->FirstChildElement(\"datVersionURL\"); if (el) { urlVersion = el->GetText() ? el->GetText() : \"\"; }\n\tel = el_newDat->FirstChildElement(\"datURL\"); if (el) { urlDat = el->GetText() ? el->GetText() : \"\"; }\n\n\tdelete xml;\n\treturn true;\n}\n\nu32 ADVANsCEne::convertDB(const char *in_filaname)\n{\n\t//these strings are contained in the xml file, verbatim, so they function as enum values\n\t//we leave the strings here rather than pooled elsewhere to remind us that theyre part of the advanscene format.\n\tconst char *saveTypeNames[] = {\n\t\t\"Eeprom - 4 kbit\",\t\t// EEPROM 4kbit\n\t\t\"Eeprom - 64 kbit\",\t\t// EEPROM 64kbit\n\t\t\"Eeprom - 512 kbit\",\t// EEPROM 512kbit\n\t\t\"Fram - 256 kbit\",\t\t// FRAM 256kbit !\n\t\t\"Flash - 2 mbit\",\t\t// FLASH 2Mbit\n\t\t\"Flash - 4 mbit\",\t\t// FLASH 4Mbit\n\t\t\"Flash - 8 mbit\",\t\t// FLASH 8Mbit\n\t\t\"Flash - 16 mbit\",\t\t// FLASH 16Mbit !\n\t\t\"Flash - 32 mbit\",\t\t// FLASH 32Mbit !\n\t\t\"Flash - 64 mbit\",\t\t// FLASH 64Mbit\n\t\t\"Flash - 128 mbit\",\t\t// FLASH 128Mbit !\n\t\t\"Flash - 256 mbit\",\t\t// FLASH 256Mbit !\n\t\t\"Flash - 512 mbit\"\t\t// FLASH 512Mbit !\n\t};\n\n\tTiXmlDocument\t*xml = NULL;\n\tTiXmlElement\t*el = NULL;\n\tTiXmlElement\t*el_serial = NULL;\n\tTiXmlElement\t*el_games = NULL;\n\tTiXmlElement\t*el_crc32 = NULL;\n\tTiXmlElement\t*el_saveType = NULL;\n\tFILE\t\t\t*fp;\n\tu32\t\t\t\tcrc32 = 0;\n\tu32\t\t\t\treserved = 0;\n\n\tlastImportErrorMessage = \"\";\n\n\tprintf(\"Converting DB...\\n\");\n\tif (getXMLConfig(in_filaname))\n\t{\n\t\tif (datName.size()==0) return 0;\n\t\tif (datName != _ADVANsCEne_BASE_NAME) return 0;\n\t}\n\n\tfp = fopen(database_path, \"wb\");\n\tif (!fp) return 0;\n\n\t// Header\n\tfwrite(_ADVANsCEne_BASE_ID, 1, strlen(_ADVANsCEne_BASE_ID), fp);\n\tfputc(_ADVANsCEne_BASE_VERSION_MAJOR, fp);\n\tfputc(_ADVANsCEne_BASE_VERSION_MINOR, fp);\n\tif (datVersion.size()) \n\t\tfwrite(&datVersion[0], 1, datVersion.size(), fp);\n\telse\n\t\tfputc(0, fp);\n\ttime_t __time = time(NULL);\n\tfwrite(&__time, 1, sizeof(time_t), fp);\n\n\txml = new TiXmlDocument();\n\tif (!xml) { fclose(fp); return 0; }\n\tif (!xml->LoadFile(in_filaname)) { fclose(fp); return 0; }\n\tel = xml->FirstChildElement(\"dat\");\n\tif (!el) { fclose(fp); return 0; }\n\tel_games = el->FirstChildElement(\"games\");\n\tif (!el_games) { fclose(fp); return 0; }\n\tel = el_games->FirstChildElement(\"game\");\n\tif (!el) { fclose(fp); return 0; }\n\tu32 count = 0;\n\twhile (el)\n\t{\n\t\tTiXmlElement* title = el->FirstChildElement(\"title\");\n\t\tif(title)\n\t\t{\n\t\t\t//just a little diagnostic\n\t\t\t//printf(\"Importing %s\\n\",title->GetText());\n\t\t}\n\t\telse { fclose(fp); return 0; }\n\n\t\tel_serial = el->FirstChildElement(\"serial\");\n\t\t\n\t\tif(!el_serial)\n\t\t{\n\t\t\tlastImportErrorMessage = \"Missing <serial> element. Did you use the right xml file? We need the RtoolDS one.\";\n\t\t\tfclose(fp); \n\t\t\treturn 0;\n\t\t}\n\t\tif (fwrite(el_serial->GetText(), 1, 8, fp) != 8)\n\t\t{\n\t\t\tlastImportErrorMessage = \"Error writing output file\";\n\t\t\tfclose(fp); return 0;\n\t\t}\n\n\n\t\t// CRC32\n\t\tel_crc32 = el->FirstChildElement(\"files\"); \n\t\tsscanf_s(el_crc32->FirstChildElement(\"romCRC\")->GetText(), \"%x\", &crc32);\n\t\tif (fwrite(&crc32, 1, sizeof(u32), fp) != sizeof(u32))\n\t\t{\n\t\t\tfclose(fp); return 0;\n\t\t}\n\t\t// Save type\n\t\tel_saveType = el->FirstChildElement(\"saveType\"); \n\t\tif (el_saveType)\n\t\t{\n\t\t\tconst char *tmp = el_saveType->GetText();\n\t\t\tif (tmp)\n\t\t\t{\n\t\t\t\tif (strcmp(tmp, \"None\")  == 0)\n\t\t\t\t\tfputc(0xFE, fp);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbool bUnknown = true;\n\t\t\t\t\tfor (u8 i = 0; i < MAX_SAVE_TYPES; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (strcmp(saveTypeNames[i], \"\") == 0) continue;\n\t\t\t\t\t\tif (strcasecmp(tmp, saveTypeNames[i]) == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfputc(i, fp);\n\t\t\t\t\t\t\tbUnknown = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (bUnknown)\n\t\t\t\t\t\tfputc(0xFF, fp);\t// Unknown\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tfputc(0xFF, fp);\t// Unknown\n\t\t}\n\t\tfwrite(&reserved, 1, sizeof(u32), fp);\n\t\tfwrite(&reserved, 1, sizeof(u32), fp);\n\t\tcount++;\n\t\tel = el->NextSiblingElement(\"game\");\n\t}\n\tprintf(\"\\n\");\n\tdelete xml;\n\tfclose(fp);\n\tif (count > 0) \n\t\tprintf(\"done\\n\");\n\telse\n\t\tprintf(\"error\\n\");\n\tprintf(\"ADVANsCEne converter: %i found\\n\", count);\n\treturn count;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/mc.h",
    "content": "/*\n\tCopyright (C) 2006 thoduv\n\tCopyright (C) 2006 Theo Berkau\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef __FW_H__\n#define __FW_H__\n\n#include <stdio.h>\n#include <vector>\n#include <string>\n#include \"types.h\"\n#include \"emufile.h\"\n#include \"common.h\"\n#include \"utils/tinyxml/tinyxml.h\"\n\n#define MAX_SAVE_TYPES 13\n#define MC_TYPE_AUTODETECT      0x0\n#define MC_TYPE_EEPROM1         0x1\n#define MC_TYPE_EEPROM2         0x2\n#define MC_TYPE_FLASH           0x3\n#define MC_TYPE_FRAM            0x4\n\n#define MC_SIZE_4KBITS                  0x000200\n#define MC_SIZE_64KBITS                 0x002000\n#define MC_SIZE_256KBITS                0x008000\n#define MC_SIZE_512KBITS                0x010000\n#define MC_SIZE_1MBITS                  0x020000\n#define MC_SIZE_2MBITS                  0x040000\n#define MC_SIZE_4MBITS                  0x080000\n#define MC_SIZE_8MBITS                  0x100000\n#define MC_SIZE_16MBITS                 0x200000\n#define MC_SIZE_32MBITS                 0x400000\n#define MC_SIZE_64MBITS                 0x800000\n#define MC_SIZE_128MBITS                0x1000000\n#define MC_SIZE_256MBITS                0x2000000\n#define MC_SIZE_512MBITS                0x4000000\n\n// ============================================= ADVANsCEne\n#define _ADVANsCEne_BASE_ID \"DeSmuME database (ADVANsCEne)\\0x1A\"\n#define _ADVANsCEne_BASE_VERSION_MAJOR 1\n#define _ADVANsCEne_BASE_VERSION_MINOR 0\n#define _ADVANsCEne_BASE_NAME \"ADVANsCEne Nintendo DS Collection\"\nclass ADVANsCEne\n{\nprivate:\n\tchar\t\t\tdatabase_path[MAX_PATH];\t\t// DeSmuME save types \n\tu8\t\t\t\tversionBase[2];\n\tchar\t\t\tversion[4];\n\ttime_t\t\t\tcreateTime;\n\tu8\t\t\t\tsaveType;\n\tu32\t\t\t\tcrc32;\n\tbool\t\t\tloaded;\n\tbool foundAsCrc, foundAsSerial;\n\n\t// XML\n\tstd::string datName;\n\tstd::string datVersion;\n\tstd::string\turlVersion;\n\tstd::string urlDat;\n\tbool getXMLConfig(const char *in_filaname);\n\npublic:\n\tADVANsCEne() :\tsaveType(0xFF),\n\t\t\t\t\tcrc32(0),\n\t\t\t\t\tloaded(false)\n\t{\n\t\tmemset(database_path, 0, sizeof(database_path));\n\t\tmemset(versionBase, 0, sizeof(versionBase));\n\t\tmemset(version, 0, sizeof(version));\n\t}\n\tvoid setDatabase(const char *path) { loaded = false; strcpy(database_path, path); }\n\tu32 convertDB(const char *in_filaname);\n\tu8 checkDB(const char *serial, u32 crc);\n\tu32 getSaveType() { return saveType; }\n\tu32 getCRC32() { return crc32; }\n\tbool isLoaded() { return loaded; }\n\tconst char* getIdMethod() { \n\t\tif(foundAsCrc) return \"CRC\";\n\t\tif(foundAsSerial) return \"Serial\";\n\t\treturn \"\";\n\t}\n\tstd::string lastImportErrorMessage;\n};\n\n\nstruct memory_chip_t\n{\n\tu8 com;\t//persistent command actually handled\n\tu32 addr;        //current address for reading/writing\n\tu8 addr_shift;   //shift for address (since addresses are transfered by 3 bytes units)\n\tu8 addr_size;    //size of addr when writing/reading\n\n\tBOOL write_enable;\t//is write enabled ?\n\n\tu8 *data;       //memory data\n\tu32 size;       //memory size\n\tBOOL writeable_buffer;\t//is \"data\" writeable ?\n\tint type; //type of Memory\n\tchar *filename;\n\tFILE *fp;\n\tu8 autodetectbuf[32768];\n\tint autodetectsize;\n\t\n\t// needs only for firmware\n\tbool isFirmware;\n\tchar userfile[MAX_PATH];\n};\n\n//the new backup system by zeromus\nclass BackupDevice\n{\npublic:\n\tBackupDevice();\n\n\t//signals the save system that we are in our regular mode, loading up a rom. initializes for that case.\n\tvoid load_rom(const char* filename);\n\t//signals the save system that we are in MOVIE mode. doesnt load up a rom, and never saves it. initializes for that case.\n\tvoid movie_mode();\n\n\tvoid reset();\n\tvoid close_rom();\n\tvoid forceManualBackupType();\n\tvoid reset_hardware();\n\tstd::string getFilename() { return filename; }\n\tu8 searchFileSaveType(u32 size);\n\n\tbool save_state(EMUFILE* os);\n\tbool load_state(EMUFILE* is);\n\t\n\t//commands from mmu\n\tvoid reset_command();\n\tu8 data_command(u8,int);\n\tstd::vector<u8> data;\n\n\t//this info was saved before the last reset (used for savestate compatibility)\n\tstruct SavedInfo\n\t{\n\t\tu32 addr_size;\n\t} savedInfo;\n\n\t//and these are used by old savestates\n\tvoid load_old_state(u32 addr_size, u8* data, u32 datasize);\n\tstatic u32 addr_size_for_old_save_size(int bupmem_size);\n\tstatic u32 addr_size_for_old_save_type(int bupmem_type);\n\n\tstatic u32 pad_up_size(u32 startSize);\n\tvoid raw_applyUserSettings(u32& size, bool manual = false);\n\n\tbool load_duc(const char* filename, u32 force_size = 0);\n\tbool load_no_gba(const char *fname, u32 force_size = 0);\n\tbool save_no_gba(const char* fname);\n\tbool load_raw(const char* filename, u32 force_size = 0);\n\tbool save_raw(const char* filename);\n\tbool load_movie(EMUFILE* is);\n\tu32 get_save_duc_size(const char* filename);\n\tu32 get_save_nogba_size(const char* filename);\n\tu32 get_save_raw_size(const char* filename);\n\n\t//call me once a second or so to lazy flush the save data\n\t//here's the reason for this system: we want to dump save files when theyre READ\n\t//so that we have a better idea earlier on how large they are. but it slows things down\n\t//way too much if we flush whenever we read.\n\tvoid lazy_flush();\n\tvoid flush();\n\n\tstruct {\n\t\t\tu32 size,padSize,type,addr_size,mem_size;\n\t\t} info;\n\n\tbool isMovieMode;\nprivate:\n\tstd::string filename;\n\t\n\tbool write_enable;\t//is write enabled?\n\tu32 com;\t//persistent command actually handled\n\tu32 addr_size, addr_counter;\n\tu32 addr;\n\n\tstd::vector<u8> data_autodetect;\n\tenum STATE {\n\t\tDETECTING = 0, RUNNING = 1\n\t} state;\n\n\tenum MOTION_INIT_STATE\n\t{\n\t\tMOTION_INIT_STATE_IDLE, MOTION_INIT_STATE_RECEIVED_4, MOTION_INIT_STATE_RECEIVED_4_B,\n\t\tMOTION_INIT_STATE_FE, MOTION_INIT_STATE_FD, MOTION_INIT_STATE_FB\n\t};\n\tenum MOTION_FLAG\n\t{\n\t\tMOTION_FLAG_NONE=0,\n\t\tMOTION_FLAG_ENABLED=1,\n\t\tMOTION_FLAG_SENSORMODE=2\n\t};\n\tu8 motionInitState, motionFlag;\n\n\tvoid loadfile();\n\tbool _loadfile(const char *fname);\n\tvoid ensure(u32 addr);\n\n\tbool flushPending, lazyFlushPending;\n\nprivate:\n\tvoid resize(u32 size);\n};\n\n#define NDS_FW_SIZE_V1 (256 * 1024)\t\t/* size of fw memory on nds v1 */\n#define NDS_FW_SIZE_V2 (512 * 1024)\t\t/* size of fw memory on nds v2 */\n\nvoid mc_init(memory_chip_t *mc, int type);    /* reset and init values for memory struct */\nu8 *mc_alloc(memory_chip_t *mc, u32 size);  /* alloc mc memory */\nvoid mc_realloc(memory_chip_t *mc, int type, u32 size);      /* realloc mc memory */\nvoid mc_load_file(memory_chip_t *mc, const char* filename); /* load save file and setup fp */\nvoid mc_free(memory_chip_t *mc);    /* delete mc memory */\nvoid fw_reset_com(memory_chip_t *mc);       /* reset communication with mc */\nu8 fw_transfer(memory_chip_t *mc, u8 data);\n\nvoid backup_setManualBackupType(int type);\nvoid backup_forceManualBackupType();\n\nstruct SAVE_TYPE\n{\n\tconst char* descr;\n\tint media_type;\n\tint size;\n};\n\nextern const SAVE_TYPE save_types[];\n\n#endif /*__FW_H__*/\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/mem.h",
    "content": "/*\n\tCopyright (C) 2005 Theo Berkau\n\tCopyright (C) 2005-2006 Guillaume Duhamel\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef MEM_H\n#define MEM_H\n\n#include <stdlib.h>\n#include <assert.h>\n#include \"types.h\"\n\n//this was originally declared in MMU.h but we suffered some organizational problems and had to remove it\nenum MMU_ACCESS_TYPE\n{\n\tMMU_AT_CODE, //used for cpu prefetches\n\tMMU_AT_DATA, //used for cpu read/write\n\tMMU_AT_GPU, //used for gpu read/write\n\tMMU_AT_DMA, //used for dma read/write (blocks access to TCM)\n\tMMU_AT_DEBUG, //used for emulator debugging functions (bypasses some debug handling)\n};\n\nstatic INLINE u8 T1ReadByte(u8* const mem, const u32 addr)\n{\n   return mem[addr];\n}\n\nstatic INLINE u16 T1ReadWord_guaranteedAligned(void* const mem, const u32 addr)\n{\n\t//assert((addr&1)==0);\n#ifdef WORDS_BIGENDIAN\n   return (((u8*)mem)[addr + 1] << 8) | ((u8*)mem)[addr];\n#else\n   return *(u16*)((u8*)mem + addr);\n#endif\n}\n\nstatic INLINE u16 T1ReadWord(void* const mem, const u32 addr)\n{\n#ifdef WORDS_BIGENDIAN\n   return (((u8*)mem)[addr + 1] << 8) | ((u8*)mem)[addr];\n#else\n   return *((u16 *) ((u8*)mem + addr));\n#endif\n}\n\nstatic INLINE u32 T1ReadLong_guaranteedAligned(u8* const  mem, const u32 addr)\n{\n\t//assert((addr&3)==0);\n#ifdef WORDS_BIGENDIAN\n   return (mem[addr + 3] << 24 | mem[addr + 2] << 16 |\n           mem[addr + 1] << 8 | mem[addr]);\n#else\n\treturn *(u32*)(mem + addr);\n#endif\n}\n\n\nstatic INLINE u32 T1ReadLong(u8* const  mem, u32 addr)\n{\n   addr &= ~3;\n#ifdef WORDS_BIGENDIAN\n   return (mem[addr + 3] << 24 | mem[addr + 2] << 16 |\n           mem[addr + 1] << 8 | mem[addr]);\n#else\n   return *(u32*)(mem + addr);\n#endif\n}\n\nstatic INLINE u64 T1ReadQuad(u8* const mem, const u32 addr)\n{\n#ifdef WORDS_BIGENDIAN\n   return (u64(mem[addr + 7]) << 56 | u64(mem[addr + 6]) << 48 |\n           u64(mem[addr + 5]) << 40 | u64(mem[addr + 4]) << 32 |\n           u64(mem[addr + 3]) << 24 | u64(mem[addr + 2]) << 16 |\n           u64(mem[addr + 1]) << 8  | u64(mem[addr    ]));\n#else\n   return *((u64 *) (mem + addr));\n#endif\n}\n\nstatic INLINE void T1WriteByte(u8* const mem, const u32 addr, const u8 val)\n{\n   mem[addr] = val;\n}\n\nstatic INLINE void T1WriteWord(u8* const mem, const u32 addr, const u16 val)\n{\n#ifdef WORDS_BIGENDIAN\n   mem[addr + 1] = val >> 8;\n   mem[addr] = val & 0xFF;\n#else\n   *((u16 *) (mem + addr)) = val;\n#endif\n}\n\nstatic INLINE void T1WriteLong(u8* const mem, const u32 addr, const u32 val)\n{\n#ifdef WORDS_BIGENDIAN\n   mem[addr + 3] = val >> 24;\n   mem[addr + 2] = (val >> 16) & 0xFF;\n   mem[addr + 1] = (val >> 8) & 0xFF;\n   mem[addr] = val & 0xFF;\n#else\n   *((u32 *) (mem + addr)) = val;\n#endif\n}\n\nstatic INLINE void T1WriteQuad(u8* const mem, const u32 addr, const u64 val)\n{\n#ifdef WORDS_BIGENDIAN\n\tmem[addr + 7] = (val >> 56);\n\tmem[addr + 6] = (val >> 48) & 0xFF;\n\tmem[addr + 5] = (val >> 40) & 0xFF;\n\tmem[addr + 4] = (val >> 32) & 0xFF;\n\tmem[addr + 3] = (val >> 24) & 0xFF;\n    mem[addr + 2] = (val >> 16) & 0xFF;\n    mem[addr + 1] = (val >> 8) & 0xFF;\n    mem[addr] = val & 0xFF;\n#else\n\t*((u64 *) (mem + addr)) = val;\n#endif\n}\n\n//static INLINE u8 T2ReadByte(u8* const  mem, const u32 addr)\n//{\n//#ifdef WORDS_BIGENDIAN\n//   return mem[addr ^ 1];\n//#else\n//   return mem[addr];\n//#endif\n//}\n//\n\nstatic INLINE u16 HostReadWord(u8* const mem, const u32 addr)\n{\n   return *((u16 *) (mem + addr));\n}\n\n//\n//static INLINE u32 T2ReadLong(u8* const mem, const u32 addr)\n//{\n//#ifdef WORDS_BIGENDIAN\n//   return *((u16 *) (mem + addr + 2)) << 16 | *((u16 *) (mem + addr));\n//#else\n//   return *((u32 *) (mem + addr));\n//#endif\n//}\n//\n//static INLINE void T2WriteByte(u8* const mem, const u32 addr, const u8 val)\n//{\n//#ifdef WORDS_BIGENDIAN\n//   mem[addr ^ 1] = val;\n//#else\n//   mem[addr] = val;\n//#endif\n//}\n\nstatic INLINE void HostWriteWord(u8* const mem, const u32 addr, const u16 val)\n{\n   *((u16 *) (mem + addr)) = val;\n}\n\nstatic INLINE void HostWriteTwoWords(u8* const mem, const u32 addr, const u32 val)\n{\n#ifdef WORDS_BIGENDIAN\n   *((u16 *) (mem + addr + 2)) = val >> 16;\n   *((u16 *) (mem + addr)) = val & 0xFFFF;\n#else\n   *((u32 *) (mem + addr)) = val;\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/metaspu/SndOut.cpp",
    "content": "/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2\r\n * Developed and maintained by the Pcsx2 Development Team.\r\n * \r\n * Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz]\r\n *\r\n * SPU2-X is free software: you can redistribute it and/or modify it under the terms\r\n * of the GNU Lesser General Public License as published by the Free Software Found-\r\n * ation, either version 3 of the License, or (at your option) any later version.\r\n *\r\n * SPU2-X is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\r\n * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r\n * PURPOSE.  See the GNU Lesser General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU Lesser General Public License\r\n * along with SPU2-X.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n//#include \"Global.h\"\r\n#include \"types.h\"\r\n#include \"SndOut.h\"\r\n#include <assert.h>\r\n\r\n//----------------\r\nint SndOutLatencyMS = 160;\r\nbool timeStretchDisabled = false;\r\n//----------------\r\n\r\nStereoOut32 StereoOut32::Empty( 0, 0 );\r\n\r\nStereoOut32::StereoOut32( const StereoOut16& src ) :\r\n\tLeft( src.Left ),\r\n\tRight( src.Right )\r\n{\r\n}\r\n\r\nStereoOut32::StereoOut32( const StereoOutFloat& src ) :\r\n\tLeft( (s32)(src.Left * 2147483647.0f) ),\r\n\tRight( (s32)(src.Right * 2147483647.0f) )\r\n{\r\n}\r\n\r\nStereoOut16 StereoOut32::DownSample() const\r\n{\r\n\treturn StereoOut16(\r\n\t\tLeft >> SndOutVolumeShift,\r\n\t\tRight >> SndOutVolumeShift\r\n\t);\r\n}\r\n\r\nStereoOut32 StereoOut16::UpSample() const\r\n{\r\n\treturn StereoOut32(\r\n\t\tLeft << SndOutVolumeShift,\r\n\t\tRight << SndOutVolumeShift\r\n\t);\r\n\r\n}\r\n\r\n\r\n//class NullOutModule: public SndOutModule\r\n//{\r\n//public:\r\n//\ts32  Init()  { return 0; }\r\n//\tvoid Close() { }\r\n//\ts32  Test() const { return 0; }\r\n//\tvoid Configure(uptr parent)  { }\r\n//\tbool Is51Out() const { return false; }\r\n//\tint GetEmptySampleCount() const { return 0; }\r\n//\t\r\n//\tconst wchar_t* GetIdent() const\r\n//\t{\r\n//\t\treturn L\"nullout\";\r\n//\t}\r\n//\r\n//\tconst wchar_t* GetLongName() const\r\n//\t{\r\n//\t\treturn L\"No Sound (Emulate SPU2 only)\";\r\n//\t}\r\n//\r\n//\tvoid ReadSettings()\r\n//\t{\r\n//\t}\r\n//\r\n//\tvoid WriteSettings() const\r\n//\t{\r\n//\t}\r\n//\r\n//} NullOut;\r\n//\r\n//SndOutModule* mods[]=\r\n//{\r\n//\t&NullOut,\r\n//#ifdef _MSC_VER\r\n//\tXAudio2Out,\r\n//\tDSoundOut,\r\n//\tWaveOut,\r\n//#endif\r\n//\tNULL\t\t// signals the end of our list\r\n//};\r\n//\r\n//int FindOutputModuleById( const wchar_t* omodid )\r\n//{\r\n//\tint modcnt = 0;\r\n//\twhile( mods[modcnt] != NULL )\r\n//\t{\r\n//\t\tif( wcscmp( mods[modcnt]->GetIdent(), omodid ) == 0 )\r\n//\t\t\tbreak;\r\n//\t\t++modcnt;\r\n//\t}\r\n//\treturn modcnt;\r\n//}\r\n\r\nStereoOut32 *SndBuffer::m_buffer;\r\ns32 SndBuffer::m_size;\r\ns32 SndBuffer::m_rpos;\r\ns32 SndBuffer::m_wpos;\r\ns32 SndBuffer::m_data;\r\n\r\nbool SndBuffer::m_underrun_freeze;\r\nStereoOut32* SndBuffer::sndTempBuffer = NULL;\r\nStereoOut16* SndBuffer::sndTempBuffer16 = NULL;\r\nint SndBuffer::sndTempProgress = 0;\r\n\r\nstatic int GetAlignedBufferSize( int comp )\r\n{\r\n\treturn (comp + SndOutPacketSize-1) & ~(SndOutPacketSize-1);\r\n}\r\n\r\n// Returns TRUE if there is data to be output, or false if no data\r\n// is available to be copied.\r\nbool SndBuffer::CheckUnderrunStatus( int& nSamples, int& quietSampleCount )\r\n{\r\n\tquietSampleCount = 0;\r\n\tif( m_underrun_freeze )\r\n\t{\t\t\t\r\n\t\tint toFill = (int)(m_size * ( timeStretchDisabled ? 0.50f : 0.1f ) );\r\n\t\ttoFill = GetAlignedBufferSize( toFill );\r\n\r\n\t\t// toFill is now aligned to a SndOutPacket\r\n\r\n\t\tif( m_data < toFill )\r\n\t\t{\r\n\t\t\tquietSampleCount = nSamples;\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tm_underrun_freeze = false;\r\n\t\t//TODO\r\n\t\t//if( MsgOverruns() )\r\n\t\t\tprintf(\" * SPU2 > Underrun compensation (%d packets buffered)\\n\", toFill / SndOutPacketSize );\r\n\t\tlastPct = 0.0;\t\t// normalize timestretcher\r\n\t}\r\n\telse if( m_data < nSamples )\r\n\t{\r\n\t\tnSamples = m_data;\r\n\t\tquietSampleCount = SndOutPacketSize - m_data;\r\n\t\tm_underrun_freeze = true;\r\n\r\n\t\tif( !timeStretchDisabled )\r\n\t\t\ttimeStretchUnderrun();\r\n\r\n\t\treturn nSamples != 0;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\nvoid SndBuffer::_InitFail()\r\n{\r\n\t// If a failure occurs, just initialize the NoSound driver.  This'll allow\r\n\t// the game to emulate properly (hopefully), albeit without sound.\r\n\t//OutputModule = FindOutputModuleById( NullOut.GetIdent() );\r\n\t//mods[OutputModule]->Init();\r\n}\r\n\r\nvoid SndBuffer::_WriteSamples(StereoOut32 *bData, int nSamples)\r\n{\r\n\tint free = m_size-m_data;\r\n\tm_predictData = 0;\r\n\r\n\tassert( m_data <= m_size );\r\n\r\n\t// Problem:\r\n\t//  If the SPU2 gets out of sync with the SndOut device, the writepos of the\r\n\t//  circular buffer will overtake the readpos, leading to a prolonged period\r\n\t//  of hopscotching read/write accesses (ie, lots of staticy crap sound for\r\n\t//  several seconds).\r\n\t//\r\n\t// Compromise:\r\n\t//  When an overrun occurs, we adapt by discarding a portion of the buffer.\r\n\t//  The older portion of the buffer is discarded rather than incoming data,\r\n\t//  so that the overall audio synchronization is better.\r\n\r\n\tif( free < nSamples )\r\n\t{\r\n\t\t// Buffer overrun!\r\n\t\t// Dump samples from the read portion of the buffer instead of dropping\r\n\t\t// the newly written stuff.\r\n\r\n\t\ts32 comp;\r\n\r\n\t\tif( !timeStretchDisabled )\r\n\t\t{\r\n\t\t\tcomp = timeStretchOverrun();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Toss half the buffer plus whatever's being written anew:\r\n\t\t\tcomp = GetAlignedBufferSize( (m_size + nSamples ) / 2 );\r\n\t\t\tif( comp > (m_size-SndOutPacketSize) ) comp = m_size-SndOutPacketSize;\r\n\t\t}\r\n\r\n\t\tm_data -= comp;\r\n\t\tm_rpos = (m_rpos+comp) % m_size;\r\n\t\t//TODO\r\n\t\t//if( MsgOverruns() )\r\n\t\t\tprintf(\" * SPU2 > Overrun Compensation (%d packets tossed)\\n\", comp / SndOutPacketSize );\r\n\t\tlastPct = 0.0;\t\t// normalize the timestretcher\r\n\t}\r\n\r\n\t// copy in two phases, since there's a chance the packet\r\n\t// wraps around the buffer (it'd be nice to deal in packets only, but\r\n\t// the timestretcher and DSP options require flexibility).\r\n\r\n\tconst int endPos = m_wpos + nSamples;\r\n\tconst int secondCopyLen = endPos - m_size;\r\n\tStereoOut32* wposbuffer = &m_buffer[m_wpos];\r\n\r\n\tm_data += nSamples;\r\n\tif( secondCopyLen > 0 )\r\n\t{\r\n\t\tnSamples -= secondCopyLen;\r\n\t\tmemcpy( m_buffer, &bData[nSamples], secondCopyLen * sizeof( *bData ) );\r\n\t\tm_wpos = secondCopyLen;\r\n\t}\r\n\telse\r\n\t\tm_wpos += nSamples;\r\n\r\n\tmemcpy( wposbuffer, bData, nSamples * sizeof( *bData ) );\r\n}\r\n\r\nvoid SndBuffer::Init()\r\n{\r\n\t//if( mods[OutputModule] == NULL )\r\n\t//{\r\n\t//\t_InitFail();\r\n\t//\treturn;\r\n\t//}\r\n\r\n\t// initialize sound buffer\r\n\t// Buffer actually attempts to run ~50%, so allocate near double what\r\n\t// the requested latency is:\r\n\r\n\r\n\tm_rpos = 0;\r\n\tm_wpos = 0;\r\n\tm_data = 0;\r\n\r\n\ttry\r\n\t{\r\n\t\tconst float latencyMS = SndOutLatencyMS * (timeStretchDisabled ? 1.5f : 2.0f );\r\n\t\tm_size = GetAlignedBufferSize( (int)(latencyMS * SampleRate / 1000.0f ) );\r\n\t\tm_buffer = new StereoOut32[m_size];\r\n\t\tm_underrun_freeze = false;\r\n\r\n\t\tsndTempBuffer = new StereoOut32[SndOutPacketSize];\r\n\t\tsndTempBuffer16 = new StereoOut16[SndOutPacketSize];\r\n\t}\r\n\tcatch( std::bad_alloc& )\r\n\t{\r\n\t\t// out of memory exception (most likely)\r\n\r\n\t\tprintf( \"Out of memory error occurred while initializing SPU2.\" );\r\n\t\t_InitFail();\r\n\t\treturn;\r\n\t}\r\n\r\n\t// clear buffers!\r\n\t// Fixes loopy sounds on emu resets.\r\n\tmemset( sndTempBuffer, 0, sizeof(StereoOut32) * SndOutPacketSize );\r\n\tmemset( sndTempBuffer16, 0, sizeof(StereoOut16) * SndOutPacketSize );\r\n\r\n\tsndTempProgress = 0;\r\n\r\n\tsoundtouchInit();\t\t// initializes the timestretching\r\n\r\n\t// some crap\r\n\t//spdif_set51(mods[OutputModule]->Is51Out());\r\n\r\n\t// initialize module\r\n\t//if( mods[OutputModule]->Init() == -1 ) _InitFail();\r\n}\r\n\r\nvoid SndBuffer::Cleanup()\r\n{\r\n\t//mods[OutputModule]->Close();\r\n\r\n\tsoundtouchCleanup();\r\n\r\n\t//safe_delete_array( m_buffer );\r\n\t//safe_delete_array( sndTempBuffer );\r\n\t//safe_delete_array( sndTempBuffer16 );\r\n\tdelete[] m_buffer;\r\n\tdelete[] sndTempBuffer;\r\n\tdelete[] sndTempBuffer16;\r\n}\r\n\r\nint SndBuffer::m_dsp_progress = 0;\r\n\r\nint SndBuffer::m_timestretch_progress = 0;\r\nint SndBuffer::ssFreeze = 0;\r\n\r\nvoid SndBuffer::ClearContents()\r\n{\r\n\tSndBuffer::soundtouchClearContents();\r\n\tSndBuffer::ssFreeze = 30; //Delays sound output for about half a second.\r\n}\r\n\r\nvoid SndBuffer::Write( const StereoOut32& Sample )\r\n{\r\n\t// Log final output to wavefile.\r\n\t//WaveDump::WriteCore( 1, CoreSrc_External, Sample.DownSample() );\r\n\r\n\t//RecordWrite( Sample.DownSample() );\r\n\r\n\t//if(mods[OutputModule] == &NullOut) // null output doesn't need buffering or stretching! :p\r\n\t//\treturn;\r\n\r\n\tsndTempBuffer[sndTempProgress++] = Sample;\r\n\r\n\t// If we haven't accumulated a full packet yet, do nothing more:\r\n\tif(sndTempProgress < SndOutPacketSize) return;\r\n\tsndTempProgress = 0;\r\n\r\n\t//Don't play anything directly after loading a savestate, avoids static killing your speakers.\r\n//\tif ( ssFreeze > 0 )\r\n//\t{\t\r\n//\t\tssFreeze--;\r\n//\t\treturn;\r\n//\t}\r\n//#ifndef __LINUX__\r\n//\telse if( dspPluginEnabled )\r\n//\t{\r\n//\t\t// Convert in, send to winamp DSP, and convert out.\r\n//\r\n//\t\tfor( int i=0; i<SndOutPacketSize; ++i ) { sndTempBuffer16[i] = sndTempBuffer[i].DownSample(); }\r\n//\t\tm_dsp_progress += DspProcess( (s16*)sndTempBuffer16, SndOutPacketSize );\r\n//\r\n//\t\t// Some ugly code to ensure full packet handling:\r\n//\t\tint ei = 0;\r\n//\t\twhile( m_dsp_progress >= SndOutPacketSize )\r\n//\t\t{\r\n//\t\t\tfor( int i=0; i<SndOutPacketSize; ++i, ++ei ) { sndTempBuffer[i] = sndTempBuffer16[ei].UpSample(); }\r\n//\r\n//\t\t\tif( !timeStretchDisabled )\r\n//\t\t\t\ttimeStretchWrite();\r\n//\t\t\telse\r\n//\t\t\t\t_WriteSamples(sndTempBuffer, sndTempProgress);\r\n//\r\n//\t\t\tm_dsp_progress -= SndOutPacketSize;\r\n//\t\t}\r\n//\t\t\r\n//\t\t// copy any leftovers to the front of the dsp buffer.\r\n//\t\tif( m_dsp_progress > 0 )\r\n//\t\t{\r\n//\t\t\tmemcpy( &sndTempBuffer16[ei], sndTempBuffer16,\r\n//\t\t\t\tsizeof(sndTempBuffer16[0]) * m_dsp_progress\r\n//\t\t\t);\r\n//\t\t}\r\n//\t}\r\n//#endif\r\n//\telse\r\n\t{\r\n\t\tif( !timeStretchDisabled )\r\n\t\t\ttimeStretchWrite();\r\n\t\telse\r\n\t\t\t_WriteSamples(sndTempBuffer, SndOutPacketSize);\r\n\t}\r\n}\r\n\r\ns32 SndBuffer::Test()\r\n{\r\n\t//if( mods[OutputModule] == NULL )\r\n\t//\treturn -1;\r\n\r\n\t//return mods[OutputModule]->Test();\r\n\treturn 0;\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/metaspu/SndOut.h",
    "content": "/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2\r\n * Developed and maintained by the Pcsx2 Development Team.\r\n * \r\n * Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz]\r\n *\r\n * SPU2-X is free software: you can redistribute it and/or modify it under the terms\r\n * of the GNU Lesser General Public License as published by the Free Software Found-\r\n * ation, either version 3 of the License, or (at your option) any later version.\r\n *\r\n * SPU2-X is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\r\n * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r\n * PURPOSE.  See the GNU Lesser General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU Lesser General Public License\r\n * along with SPU2-X.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#include <algorithm>\r\n\r\nstruct StereoOut16;\r\nstruct StereoOut32;\r\nstruct StereoOutFloat;\r\n\r\nstruct StereoOut32\r\n{\r\n\tstatic StereoOut32 Empty;\r\n\r\n\ts32 Left;\r\n\ts32 Right;\r\n\r\n\tStereoOut32() :\r\n\t\tLeft( 0 ),\r\n\t\tRight( 0 )\r\n\t{\r\n\t}\r\n\r\n\tStereoOut32( s32 left, s32 right ) :\r\n\t\tLeft( left ),\r\n\t\tRight( right )\r\n\t{\r\n\t}\r\n\r\n\tStereoOut32( const StereoOut16& src );\r\n\texplicit StereoOut32( const StereoOutFloat& src );\r\n\r\n\tStereoOut16 DownSample() const;\r\n\r\n\tStereoOut32 operator+( const StereoOut32& right ) const\r\n\t{\r\n\t\treturn StereoOut32(\r\n\t\t\tLeft + right.Left,\r\n\t\t\tRight + right.Right\r\n\t\t);\r\n\t}\r\n\r\n\tStereoOut32 operator/( int src ) const\r\n\t{\r\n\t\treturn StereoOut32( Left / src, Right / src );\r\n\t}\r\n};\r\n\r\n\r\n// Number of stereo samples per SndOut block.\r\n// All drivers must work in units of this size when communicating with\r\n// SndOut.\r\nstatic const int SndOutPacketSize = 512;\r\n\r\n// Overall master volume shift.\r\n// Converts the mixer's 32 bit value into a 16 bit value.\r\n//static const int SndOutVolumeShift = 13;\r\n\r\n//edit - zeromus 23-oct-2009\r\n//this is hardcoded differently for metaspu\r\nstatic const int SndOutVolumeShift = 0;\r\n\r\n// Samplerate of the SPU2. For accurate playback we need to match this\r\n// exactly.  Trying to scale samplerates and maintain SPU2's Ts timing accuracy\r\n// is too problematic. :)\r\n//this is hardcoded differently for metaspu\r\n//edit - zeromus 23-oct-2009\r\n////static const int SampleRate = 48000;\r\n//static const int SampleRate = 44100;\r\n//edit - nitsuja: make it use the global sample rate define\r\n#include \"../SPU.h\"\r\nstatic const int SampleRate = DESMUME_SAMPLE_RATE;\r\n\r\nextern int FindOutputModuleById( const wchar_t* omodid );\r\n\r\nstruct StereoOut16\r\n{\r\n\ts16 Left;\r\n\ts16 Right;\r\n\r\n\tStereoOut16() :\r\n\t\tLeft( 0 ),\r\n\t\tRight( 0 )\r\n\t{\r\n\t}\r\n\r\n\tStereoOut16( const StereoOut32& src ) :\r\n\t\tLeft( (s16)src.Left ),\r\n\t\tRight( (s16)src.Right )\r\n\t{\r\n\t}\r\n\r\n\tStereoOut16( s16 left, s16 right ) :\r\n\t\tLeft( left ),\r\n\t\tRight( right )\r\n\t{\r\n\t}\r\n\r\n\tStereoOut32 UpSample() const;\r\n\r\n\tvoid ResampleFrom( const StereoOut32& src )\r\n\t{\r\n\t\t// Use StereoOut32's built in conversion\r\n\t\t*this = src.DownSample();\r\n\t}\r\n};\r\n\r\nstruct StereoOutFloat\r\n{\r\n\tfloat Left;\r\n\tfloat Right;\r\n\r\n\tStereoOutFloat() :\r\n\t\tLeft( 0 ),\r\n\t\tRight( 0 )\r\n\t{\r\n\t}\r\n\r\n\texplicit StereoOutFloat( const StereoOut32& src ) :\r\n\t\tLeft( src.Left / 2147483647.0f ),\r\n\t\tRight( src.Right / 2147483647.0f )\r\n\t{\r\n\t}\r\n\r\n\texplicit StereoOutFloat( s32 left, s32 right ) :\r\n\t\tLeft( left / 2147483647.0f ),\r\n\t\tRight( right / 2147483647.0f )\r\n\t{\r\n\t}\r\n\r\n\tStereoOutFloat( float left, float right ) :\r\n\t\tLeft( left ),\r\n\t\tRight( right )\r\n\t{\r\n\t}\r\n};\r\n\r\n//struct Stereo21Out16\r\n//{\r\n//\ts16 Left;\r\n//\ts16 Right;\r\n//\ts16 LFE;\r\n//\r\n//\tvoid ResampleFrom( const StereoOut32& src )\r\n//\t{\r\n//\t\tLeft = src.Left >> SndOutVolumeShift;\r\n//\t\tRight = src.Right >> SndOutVolumeShift;\r\n//\t\tLFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1);\r\n//\t}\r\n//};\r\n//\r\n//struct StereoQuadOut16\r\n//{\r\n//\ts16 Left;\r\n//\ts16 Right;\r\n//\ts16 LeftBack;\r\n//\ts16 RightBack;\r\n//\r\n//\tvoid ResampleFrom( const StereoOut32& src )\r\n//\t{\r\n//\t\tLeft = src.Left >> SndOutVolumeShift;\r\n//\t\tRight = src.Right >> SndOutVolumeShift;\r\n//\t\tLeftBack = src.Left >> SndOutVolumeShift;\r\n//\t\tRightBack = src.Right >> SndOutVolumeShift;\r\n//\t}\r\n//};\r\n//\r\n//struct Stereo41Out16\r\n//{\r\n//\ts16 Left;\r\n//\ts16 Right;\r\n//\ts16 LFE;\r\n//\ts16 LeftBack;\r\n//\ts16 RightBack;\r\n//\r\n//\tvoid ResampleFrom( const StereoOut32& src )\r\n//\t{\r\n//\t\tLeft = src.Left >> SndOutVolumeShift;\r\n//\t\tRight = src.Right >> SndOutVolumeShift;\r\n//\t\tLFE = (src.Left + src.Right) >> (SndOutVolumeShift + 1);\r\n//\t\tLeftBack = src.Left >> SndOutVolumeShift;\r\n//\t\tRightBack = src.Right >> SndOutVolumeShift;\r\n//\t}\r\n//};\r\n//\r\n//struct Stereo51Out16\r\n//{\r\n//\ts16 Left;\r\n//\ts16 Right;\r\n//\ts16 Center;\r\n//\ts16 LFE;\r\n//\ts16 LeftBack;\r\n//\ts16 RightBack;\r\n//\r\n//\t// Implementation Note: Center and Subwoofer/LFE -->\r\n//\t// This method is simple and sounds nice.  It relies on the speaker/soundcard\r\n//\t// systems do to their own low pass / crossover.  Manual lowpass is wasted effort\r\n//\t// and can't match solid state results anyway.\r\n//\r\n//\tvoid ResampleFrom( const StereoOut32& src )\r\n//\t{\r\n//\t\tLeft = src.Left >> SndOutVolumeShift;\r\n//\t\tRight = src.Right >> SndOutVolumeShift;\r\n//\t\tCenter = (src.Left + src.Right) >> (SndOutVolumeShift + 1);\r\n//\t\tLFE = Center;\r\n//\t\tLeftBack = src.Left >> SndOutVolumeShift;\r\n//\t\tRightBack = src.Right >> SndOutVolumeShift;\r\n//\t}\r\n//};\r\n//\r\n//struct Stereo51Out16DplII\r\n//{\r\n//\ts16 Left;\r\n//\ts16 Right;\r\n//\ts16 Center;\r\n//\ts16 LFE;\r\n//\ts16 LeftBack;\r\n//\ts16 RightBack;\r\n//\r\n//\tvoid ResampleFrom( const StereoOut32& src )\r\n//\t{\r\n//\t\tstatic const u8 sLogTable[256] = {\r\n//\t\t\t0x00,0x3C,0x60,0x78,0x8C,0x9C,0xA8,0xB4,0xBE,0xC8,0xD0,0xD8,0xDE,0xE4,0xEA,0xF0,\r\n//\t\t\t0xF6,0xFA,0xFE,0x04,0x08,0x0C,0x10,0x14,0x16,0x1A,0x1E,0x20,0x24,0x26,0x2A,0x2C,\r\n//\t\t\t0x2E,0x32,0x34,0x36,0x38,0x3A,0x3E,0x40,0x42,0x44,0x46,0x48,0x4A,0x4C,0x4E,0x50,\r\n//\t\t\t0x50,0x52,0x54,0x56,0x58,0x5A,0x5A,0x5C,0x5E,0x60,0x60,0x62,0x64,0x66,0x66,0x68,\r\n//\t\t\t0x6A,0x6A,0x6C,0x6E,0x6E,0x70,0x70,0x72,0x74,0x74,0x76,0x76,0x78,0x7A,0x7A,0x7C,\r\n//\t\t\t0x7C,0x7E,0x7E,0x80,0x80,0x82,0x82,0x84,0x84,0x86,0x86,0x88,0x88,0x8A,0x8A,0x8C,\r\n//\t\t\t0x8C,0x8C,0x8E,0x8E,0x90,0x90,0x92,0x92,0x92,0x94,0x94,0x96,0x96,0x96,0x98,0x98,\r\n//\t\t\t0x9A,0x9A,0x9A,0x9C,0x9C,0x9C,0x9E,0x9E,0xA0,0xA0,0xA0,0xA2,0xA2,0xA2,0xA4,0xA4,\r\n//\t\t\t0xA4,0xA6,0xA6,0xA6,0xA8,0xA8,0xA8,0xAA,0xAA,0xAA,0xAC,0xAC,0xAC,0xAC,0xAE,0xAE,\r\n//\t\t\t0xAE,0xB0,0xB0,0xB0,0xB2,0xB2,0xB2,0xB2,0xB4,0xB4,0xB4,0xB6,0xB6,0xB6,0xB6,0xB8,\r\n//\t\t\t0xB8,0xB8,0xB8,0xBA,0xBA,0xBA,0xBC,0xBC,0xBC,0xBC,0xBE,0xBE,0xBE,0xBE,0xC0,0xC0,\r\n//\t\t\t0xC0,0xC0,0xC2,0xC2,0xC2,0xC2,0xC2,0xC4,0xC4,0xC4,0xC4,0xC6,0xC6,0xC6,0xC6,0xC8,\r\n//\t\t\t0xC8,0xC8,0xC8,0xC8,0xCA,0xCA,0xCA,0xCA,0xCC,0xCC,0xCC,0xCC,0xCC,0xCE,0xCE,0xCE,\r\n//\t\t\t0xCE,0xCE,0xD0,0xD0,0xD0,0xD0,0xD0,0xD2,0xD2,0xD2,0xD2,0xD2,0xD4,0xD4,0xD4,0xD4,\r\n//\t\t\t0xD4,0xD6,0xD6,0xD6,0xD6,0xD6,0xD8,0xD8,0xD8,0xD8,0xD8,0xD8,0xDA,0xDA,0xDA,0xDA,\r\n//\t\t\t0xDA,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xE0,0xE0,0xE0,\r\n//\t\t};\r\n//\r\n//\t\tstatic s32 Gfl=0,Gfr=0;\r\n//\t\tstatic s32 LMax=0,RMax=0;\r\n//\r\n//\t\tstatic s32 LAccum;\r\n//\t\tstatic s32 RAccum;\r\n//\t\tstatic s32 ANum;\r\n//\r\n//\t\ts32 ValL = src.Left >> (SndOutVolumeShift-8);\r\n//\t\ts32 ValR = src.Right >> (SndOutVolumeShift-8);\r\n//\r\n//\t\ts32 XL = abs(ValL>>8);\r\n//\t\ts32 XR = abs(ValR>>8);\r\n//\r\n//\t\tif(XL>LMax) LMax = XL;\r\n//\t\tif(XR>RMax) RMax = XR;\r\n//\r\n//\t\tANum++;\r\n//\t\tif(ANum>=128)\r\n//\t\t{\r\n//\t\t\tANum=0;\r\n//\t\t\tLAccum = 1+((LAccum * 224 + LMax * 31)>>8);\r\n//\t\t\tRAccum = 1+((RAccum * 224 + RMax * 31)>>8);\r\n//\r\n//\t\t\tLMax = 0;\r\n//\t\t\tRMax = 0;\r\n//\r\n//\t\t\ts32 Tfl=(RAccum)*255/(LAccum);\r\n//\t\t\ts32 Tfr=(LAccum)*255/(RAccum);\r\n//\r\n//\t\t\tint gMax = std::max(Tfl,Tfr);\r\n//\t\t\tTfl = Tfl*255/gMax;\r\n//\t\t\tTfr = Tfr*255/gMax;\r\n//\r\n//\t\t\tif(Tfl>255) Tfl=255;\r\n//\t\t\tif(Tfr>255) Tfr=255;\r\n//\t\t\tif(Tfl<1) Tfl=1;\r\n//\t\t\tif(Tfr<1) Tfr=1;\r\n//\r\n//\t\t\tGfl = (Gfl * 200 + Tfl * 56)>>8;\r\n//\t\t\tGfr = (Gfr * 200 + Tfr * 56)>>8;\r\n//\r\n//\t\t}\r\n//\r\n//\t\ts32 L,R,C,SUB,SL,SR;\r\n//\r\n//\t\tC=(ValL+ValR)>>1; //16.8\r\n//\r\n//\t\tValL-=C;//16.8\r\n//\t\tValR-=C;//16.8\r\n//\r\n//\t\tL=ValL>>8; //16.0\r\n//\t\tR=ValR>>8; //16.0\r\n//\t\tC=C>>8;    //16.0\r\n//\t\tSUB = C;\r\n//\r\n//\t\t{\r\n//\t\t\ts32 Cfl = 1+sLogTable[Gfl];\r\n//\t\t\ts32 Cfr = 1+sLogTable[Gfr];\r\n//\r\n//\t\t\ts32 VL=(ValL>>4) * Cfl; //16.12\r\n//\t\t\ts32 VR=(ValR>>4) * Cfr;\r\n//\r\n//\t\t\t//s32 SC = (VL-VR)>>15;\r\n//\r\n//\t\t\tSL = (((VR/148 - VL/209)>>4)*Cfr)>>8;\r\n//\t\t\tSR = (((VR/209 - VL/148)>>4)*Cfl)>>8;\r\n//\r\n//\t\t}\r\n//\r\n//\t\t// Random-ish values to get it to compile\r\n//\t\tint GainL = 200;\r\n//\t\tint GainR = 200;\r\n//\t\tint GainC = 180;\r\n//\t\tint GainSL = 230;\r\n//\t\tint GainSR = 230;\r\n//\t\tint GainLFE = 200;\r\n//\t\tint AddCLR = 55;\r\n//\r\n//\t\tint AddCX  = (C * AddCLR)>>8;\r\n//\r\n//\t\tLeft\t= (((L   * GainL  ))>>8) + AddCX;\r\n//\t\tRight\t= (((R   * GainR  ))>>8) + AddCX;\r\n//\t\tCenter\t= (((C   * GainC  ))>>8);\r\n//\t\tLFE\t\t= (((SUB * GainLFE))>>8);\r\n//\t\tLeftBack\t= (((SL  * GainSL ))>>8);\r\n//\t\tRightBack\t= (((SR  * GainSR ))>>8);\r\n//\t}\r\n//};\r\n//\r\n//struct Stereo71Out16\r\n//{\r\n//\ts16 Left;\r\n//\ts16 Right;\r\n//\ts16 Center;\r\n//\ts16 LFE;\r\n//\ts16 LeftBack;\r\n//\ts16 RightBack;\r\n//\ts16 LeftSide;\r\n//\ts16 RightSide;\r\n//\r\n//\tvoid ResampleFrom( const StereoOut32& src )\r\n//\t{\r\n//\t\tLeft = src.Left >> SndOutVolumeShift;\r\n//\t\tRight = src.Right >> SndOutVolumeShift;\r\n//\t\tCenter = (src.Left + src.Right) >> (SndOutVolumeShift + 1);\r\n//\t\tLFE = Center;\r\n//\t\tLeftBack = src.Left >> SndOutVolumeShift;\r\n//\t\tRightBack = src.Right >> SndOutVolumeShift;\r\n//\r\n//\t\tLeftSide = src.Left >> (SndOutVolumeShift+1);\r\n//\t\tRightSide = src.Right >> (SndOutVolumeShift+1);\r\n//\t}\r\n//};\r\n//\r\n//struct Stereo21Out32\r\n//{\r\n//\ts32 Left;\r\n//\ts32 Right;\r\n//\ts32 LFE;\r\n//};\r\n//\r\n//struct Stereo41Out32\r\n//{\r\n//\ts32 Left;\r\n//\ts32 Right;\r\n//\ts32 LFE;\r\n//\ts32 LeftBack;\r\n//\ts32 RightBack;\r\n//};\r\n//\r\n//struct Stereo51Out32\r\n//{\r\n//\ts32 Left;\r\n//\ts32 Right;\r\n//\ts32 Center;\r\n//\ts32 LFE;\r\n//\ts32 LeftBack;\r\n//\ts32 RightBack;\r\n//};\r\n\r\n// Developer Note: This is a static class only (all static members).\r\nclass SndBuffer\r\n{\r\nprivate:\r\n\tstatic bool m_underrun_freeze;\r\n\tstatic s32 m_predictData;\r\n\tstatic float lastPct;\r\n\r\n\tstatic StereoOut32* sndTempBuffer;\r\n\tstatic StereoOut16* sndTempBuffer16;\r\n\r\n\tstatic int sndTempProgress;\r\n\tstatic int m_dsp_progress;\r\n\r\n\tstatic int m_timestretch_progress;\r\n\tstatic int m_timestretch_writepos;\r\n\r\n\tstatic StereoOut32 *m_buffer;\r\n\tstatic s32 m_size;\r\n\tstatic s32 m_rpos;\r\n\tstatic s32 m_wpos;\r\n\tstatic s32 m_data;\r\n\r\n\tstatic float lastEmergencyAdj;\r\n\tstatic float cTempo;\r\n\tstatic float eTempo;\r\n\tstatic int freezeTempo;\r\n\tstatic int ssFreeze;\r\n\r\n\tstatic void _InitFail();\r\n\tstatic void _WriteSamples(StereoOut32* bData, int nSamples);\r\n\tstatic bool CheckUnderrunStatus( int& nSamples, int& quietSampleCount );\r\n\r\n\tstatic void soundtouchInit();\r\n\tstatic void soundtouchClearContents();\r\n\tstatic void soundtouchCleanup();\r\n\tstatic void timeStretchWrite();\r\n\tstatic void timeStretchUnderrun();\r\n\tstatic s32 timeStretchOverrun();\r\n\r\n\tstatic void PredictDataWrite( int samples );\r\n\tstatic float GetStatusPct();\r\n\tstatic void UpdateTempoChange();\r\n\r\npublic:\r\n\tstatic void Init();\r\n\tstatic void Cleanup();\r\n\tstatic void Write( const StereoOut32& Sample );\r\n\tstatic s32 Test();\r\n\tstatic void ClearContents();\r\n\r\n\t// Note: When using with 32 bit output buffers, the user of this function is responsible\r\n\t// for shifting the values to where they need to be manually.  The fixed point depth of\r\n\t// the sample output is determined by the SndOutVolumeShift, which is the number of bits\r\n\t// to shift right to get a 16 bit result.\r\n\ttemplate< typename T >\r\n\tstatic void ReadSamples( T* bData )\r\n\t{\r\n\t\tint nSamples = SndOutPacketSize;\r\n\r\n\t\t// Problem:\r\n\t\t//  If the SPU2 gets even the least bit out of sync with the SndOut device,\r\n\t\t//  the readpos of the circular buffer will overtake the writepos,\r\n\t\t//  leading to a prolonged period of hopscotching read/write accesses (ie,\r\n\t\t//  lots of staticy crap sound for several seconds).\r\n\t\t//\r\n\t\t// Fix:\r\n\t\t//  If the read position overtakes the write position, abort the\r\n\t\t//  transfer immediately and force the SndOut driver to wait until\r\n\t\t//  the read buffer has filled up again before proceeding.\r\n\t\t//  This will cause one brief hiccup that can never exceed the user's\r\n\t\t//  set buffer length in duration.\r\n\r\n\t\tint quietSamples;\r\n\t\tif( CheckUnderrunStatus( nSamples, quietSamples ) )\r\n\t\t{\r\n\t\t\tassert( nSamples <= SndOutPacketSize );\r\n\r\n\t\t\t// [Air] [TODO]: This loop is probably a candidate for SSE2 optimization.\r\n\r\n\t\t\tconst int endPos = m_rpos + nSamples;\r\n\t\t\tconst int secondCopyLen = endPos - m_size;\r\n\t\t\tconst StereoOut32* rposbuffer = &m_buffer[m_rpos];\r\n\r\n\t\t\tm_data -= nSamples;\r\n\r\n\t\t\tif( secondCopyLen > 0 )\r\n\t\t\t{\r\n\t\t\t\tnSamples -= secondCopyLen;\r\n\t\t\t\tfor( int i=0; i<secondCopyLen; i++ )\r\n\t\t\t\t\tbData[nSamples+i].ResampleFrom( m_buffer[i] );\r\n\t\t\t\tm_rpos = secondCopyLen;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tm_rpos += nSamples;\r\n\r\n\t\t\tfor( int i=0; i<nSamples; i++ )\r\n\t\t\t\tbData[i].ResampleFrom( rposbuffer[i] );\r\n\t\t}\r\n\r\n\t\t// If quietSamples != 0 it means we have an underrun...\r\n\t\t// Let's just dull out some silence, because that's usually the least\r\n\t\t// painful way of dealing with underruns:\r\n\t\tmemset( bData, 0, quietSamples * sizeof(T) );\r\n\t}\r\n};\r\n\r\n//class SndOutModule\r\n//{\r\n//public:\r\n//\t// Virtual destructor, because it helps fight C+++ funny-business.\r\n//\tvirtual ~SndOutModule() {}\r\n//\r\n//\t// Returns a unique identification string for this driver.\r\n//\t// (usually just matches the driver's cpp filename)\r\n//\tvirtual const wchar_t* GetIdent() const=0;\r\n//\r\n//\t// Returns the long name / description for this driver.\r\n//\t// (for use in configuration screen)\r\n//\tvirtual const wchar_t* GetLongName() const=0;\r\n//\r\n//\tvirtual s32  Init()=0;\r\n//\tvirtual void Close()=0;\r\n//\tvirtual s32  Test() const=0;\r\n//\r\n//\t// Gui function: Used to open the configuration box for this driver.\r\n//\tvirtual void Configure(uptr parent)=0;\r\n//\r\n//\t// Loads settings from the INI file for this driver\r\n//\tvirtual void ReadSettings()=0;\r\n//\r\n//\t// Saves settings to the INI file for this driver\r\n//\tvirtual void WriteSettings() const=0;\r\n//\r\n//\tvirtual bool Is51Out() const=0;\r\n//\r\n//\t// Returns the number of empty samples in the output buffer.\r\n//\t// (which is effectively the amount of data played since the last update)\r\n//\tvirtual int GetEmptySampleCount() const=0;\r\n//};\r\n//\r\n//\r\n//#ifdef _MSC_VER\r\n////internal\r\n//extern SndOutModule* WaveOut;\r\n//extern SndOutModule* DSoundOut;\r\n//extern SndOutModule* XAudio2Out;\r\n//#endif\r\n//\r\n//extern SndOutModule* mods[];\r\n//\r\n//// =====================================================================================================\r\n//\r\n//extern void RecordStart();\r\n//extern void RecordStop();\r\n//extern void RecordWrite( const StereoOut16& sample );\r\n//\r\n//extern s32  DspLoadLibrary(wchar_t *fileName, int modNum);\r\n//extern void DspCloseLibrary();\r\n//extern int  DspProcess(s16 *buffer, int samples);\r\n//extern void DspUpdate(); // to let the Dsp process window messages\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/metaspu/Timestretcher.cpp",
    "content": "/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2\r\n* Developed and maintained by the Pcsx2 Development Team.\r\n* \r\n* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz]\r\n*\r\n* SPU2-X is free software: you can redistribute it and/or modify it under the terms\r\n* of the GNU Lesser General Public License as published by the Free Software Found-\r\n* ation, either version 3 of the License, or (at your option) any later version.\r\n*\r\n* SPU2-X is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\r\n* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r\n* PURPOSE.  See the GNU Lesser General Public License for more details.\r\n*\r\n* You should have received a copy of the GNU Lesser General Public License\r\n* along with SPU2-X.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n//#include \"Global.h\"\r\n#include <math.h>\r\n#include \"types.h\"\r\n#include \"SndOut.h\"\r\n//#include \"SoundTouch/WavFile.h\"\r\n\r\n#ifdef HAVE_LIBSOUNDTOUCH\r\n#include <SoundTouch.h>\r\n#else\r\n#include \"SoundTouch/SoundTouch.h\"\r\n#endif\r\n\r\n#ifdef _WINDOWS\r\n#include \"win32/Dialogs.h\"\r\n#endif\r\n\r\n\r\nstatic soundtouch::SoundTouch* pSoundTouch = NULL;\r\nstatic int ts_stats_stretchblocks = 0;\r\nstatic int ts_stats_normalblocks = 0;\r\nstatic int ts_stats_logcounter = 0;\r\n\r\n\r\n// data prediction amount, used to \"commit\" data that hasn't\r\n// finished timestretch processing.\r\ns32 SndBuffer::m_predictData;\r\n\r\n// records last buffer status (fill %, range -100 to 100, with 0 being 50% full)\r\nfloat SndBuffer::lastPct;\r\nfloat SndBuffer::lastEmergencyAdj;\r\n\r\nfloat SndBuffer::cTempo = 1;\r\nfloat SndBuffer::eTempo = 1;\r\nint SndBuffer::freezeTempo = 0;\r\n\r\nvoid SndBuffer::PredictDataWrite( int samples )\r\n{\r\n\tm_predictData += samples;\r\n}\r\n\r\n// Calculate the buffer status percentage.\r\n// Returns range from -1.0 to 1.0\r\n//    1.0 = buffer overflow!\r\n//    0.0 = buffer nominal (50% full)\r\n//   -1.0 = buffer underflow!\r\nfloat SndBuffer::GetStatusPct()\r\n{\r\n\t// Get the buffer status of the output driver too, so that we can\r\n\t// obtain a more accurate overall buffer status.\r\n\r\n\tint drvempty = 0;\r\n\t//int drvempty = mods[OutputModule]->GetEmptySampleCount(); // / 2;\r\n\t//TODO \r\n\r\n\t//ConLog( \"Data %d >>> driver: %d   predict: %d\\n\", data, drvempty, predictData );\r\n\r\n\tfloat result = (float)(m_data + m_predictData - drvempty) - (m_size/2);\r\n\tresult /= (m_size/2);\r\n\treturn result;\r\n}\r\n\r\nvoid SndBuffer::UpdateTempoChange()\r\n{\r\n\tif( --freezeTempo > 0 )\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tfloat statusPct = GetStatusPct();\r\n\tfloat pctChange = statusPct - lastPct;\r\n\r\n\tfloat tempoChange;\r\n\tfloat emergencyAdj = 0;\r\n\tfloat newcee = cTempo;\t\t// workspace var. for cTempo\r\n\r\n\t// IMPORTANT!\r\n\t// If you plan to tweak these values, make sure you're using a release build\r\n\t// OUTSIDE THE DEBUGGER to test it!  The Visual Studio debugger can really cause\r\n\t// erratic behavior in the audio buffers, and makes the timestretcher seem a\r\n\t// lot more inconsistent than it really is.\r\n\r\n\t// We have two factors.\r\n\t//   * Distance from nominal buffer status (50% full)\r\n\t//   * The change from previous update to this update.\r\n\r\n\t// Prediction based on the buffer change:\r\n\t// (linear seems to work better here)\r\n\r\n\ttempoChange = pctChange * 0.75f;\r\n\r\n\tif( statusPct * tempoChange < 0.0f )\r\n\t{\r\n\t\t// only apply tempo change if it is in synch with the buffer status.\r\n\t\t// In other words, if the buffer is high (over 0%), and is decreasing,\r\n\t\t// ignore it.  It'll just muck things up.\r\n\r\n\t\ttempoChange = 0;\r\n\t}\r\n\r\n\t// Sudden spikes in framerate can cause the nominal buffer status\r\n\t// to go critical, in which case we have to enact an emergency\r\n\t// stretch. The following cubic formulas do that.  Values near\r\n\t// the extremeites give much larger results than those near 0.\r\n\t// And the value is added only this time, and does not accumulate.\r\n\t// (otherwise a large value like this would cause problems down the road)\r\n\r\n\t// Constants:\r\n\t// Weight - weights the statusPct's \"emergency\" consideration.\r\n\t//   higher values here will make the buffer perform more drastic\r\n\t//   compensations at the outer edges of the buffer (at -75 or +75%\r\n\t//   or beyond, for example).\r\n\r\n\t// Range - scales the adjustment to the given range (more or less).\r\n\t//   The actual range is dependent on the weight used, so if you increase\r\n\t//   Weight you'll usually want to decrease Range somewhat to compensate.\r\n\r\n\t// Prediction based on the buffer fill status:\r\n\r\n\tconst float statusWeight = 2.99f;\r\n\tconst float statusRange = 0.068f;\r\n\r\n\t// \"non-emergency\" deadzone:  In this area stretching will be strongly discouraged.\r\n\t// Note: due tot he nature of timestretch latency, it's always a wee bit harder to\r\n\t// cope with low fps (underruns) than it is high fps (overruns).  So to help out a\r\n\t// little, the low-end portions of this check are less forgiving than the high-sides.\r\n\r\n\tif( cTempo < 0.965f || cTempo > 1.060f ||\r\n\t\tpctChange < -0.38f || pctChange > 0.54f ||\r\n\t\tstatusPct < -0.32f || statusPct > 0.39f ||\r\n\t\teTempo < 0.89f || eTempo > 1.19f )\r\n\t{\r\n\t\temergencyAdj = ( pow( statusPct*statusWeight, 3.0f ) * statusRange);\r\n\t}\r\n\r\n\t// Smooth things out by factoring our previous adjustment into this one.\r\n\t// It helps make the system 'feel' a little smarter by  giving it at least\r\n\t// one packet worth of history to help work off of:\r\n\r\n\temergencyAdj = (emergencyAdj * 0.75f) + (lastEmergencyAdj * 0.25f );\r\n\r\n\tlastEmergencyAdj = emergencyAdj;\r\n\tlastPct = statusPct;\r\n\r\n\t// Accumulate a fraction of the tempo change into the tempo itself.\r\n\t// This helps the system run \"smarter\" to games that run consistently\r\n\t// fast or slow by altering the base tempo to something closer to the\r\n\t// game's active speed.  In tests most games normalize within 2 seconds\r\n\t// at 100ms latency, which is pretty good (larger buffers normalize even\r\n\t// quicker).\r\n\r\n\tnewcee += newcee * (tempoChange+emergencyAdj) * 0.03f;\r\n\r\n\t// Apply tempoChange as a scale of cTempo.  That way the effect is proportional\r\n\t// to the current tempo.  (otherwise tempos rate of change at the extremes would\r\n\t// be too drastic)\r\n\r\n\tfloat newTempo = newcee + ( emergencyAdj * cTempo );\r\n\r\n\t// ... and as a final optimization, only stretch if the new tempo is outside\r\n\t// a nominal threshold.  Keep this threshold check small, because it could\r\n\t// cause some serious side effects otherwise. (enlarging the cTempo check above\r\n\t// is usually better/safer)\r\n\tif( newTempo < 0.970f || newTempo > 1.045f )\r\n\t{\r\n\t\tcTempo = (float)newcee;\r\n\r\n\t\tif( newTempo < 0.10f ) newTempo = 0.10f;\r\n\t\telse if( newTempo > 10.0f ) newTempo = 10.0f;\r\n\r\n\t\tif( cTempo < 0.15f ) cTempo = 0.15f;\r\n\t\telse if( cTempo > 7.5f ) cTempo = 7.5f;\r\n\r\n\t\tpSoundTouch->setTempo( eTempo = (float)newTempo );\r\n\t\tts_stats_stretchblocks++;\r\n\r\n\t\t/*ConLog(\" * SPU2: [Nominal %d%%] [Emergency: %d%%] (baseTempo: %d%% ) (newTempo: %d%%) (buffer: %d%%)\\n\",\r\n\t\t\t//(relation < 0.0) ? \"Normalize\" : \"\",\r\n\t\t\t(int)(tempoChange * 100.0 * 0.03),\r\n\t\t\t(int)(emergencyAdj * 100.0),\r\n\t\t\t(int)(cTempo * 100.0),\r\n\t\t\t(int)(newTempo * 100.0),\r\n\t\t\t(int)(statusPct * 100.0)\r\n\t\t);*/\r\n\t}\r\n\telse\r\n\t{\r\n\t\t// Nominal operation -- turn off stretching.\r\n\t\t// note: eTempo 'slides' toward 1.0 for smoother audio and better\r\n\t\t// protection against spikes.\r\n\t\tif( cTempo != 1.0f )\r\n\t\t{\r\n\t\t\tcTempo = 1.0f;\r\n\t\t\teTempo = ( 1.0f + eTempo ) * 0.5f;\r\n\t\t\tpSoundTouch->setTempo( eTempo );\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif( eTempo != cTempo )\r\n\t\t\t\tpSoundTouch->setTempo( eTempo=cTempo );\r\n\t\t\tts_stats_normalblocks++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SndBuffer::timeStretchUnderrun()\r\n{\r\n\t// timeStretcher failed it's job.  We need to slow down the audio some.\r\n\r\n\tcTempo -= (cTempo * 0.12f);\r\n\teTempo -= (eTempo * 0.30f);\r\n\tif( eTempo < 0.1f ) eTempo = 0.1f;\r\n\tpSoundTouch->setTempo( eTempo );\r\n}\r\n\r\ns32 SndBuffer::timeStretchOverrun()\r\n{\r\n\t// If we overran it means the timestretcher failed.  We need to speed\r\n\t// up audio playback.\r\n\tcTempo += cTempo * 0.12f;\r\n\teTempo += eTempo * 0.40f;\r\n\tif( eTempo > 7.5f ) eTempo = 7.5f;\r\n\tpSoundTouch->setTempo( eTempo );\r\n\r\n\t// Throw out just a little bit (two packets worth) to help\r\n\t// give the TS some room to work:\r\n\r\n\treturn SndOutPacketSize*2;\r\n}\r\n\r\nstatic void CvtPacketToFloat( StereoOut32* srcdest )\r\n{\r\n\tStereoOutFloat* dest = (StereoOutFloat*)srcdest;\r\n\tconst StereoOut32* src = (StereoOut32*)srcdest;\r\n\tfor( uint i=0; i<SndOutPacketSize; ++i, ++dest, ++src )\r\n\t\t*dest = (StereoOutFloat)*src;\r\n}\r\n\r\n// Parameter note: Size should always be a multiple of 128, thanks!\r\nstatic void CvtPacketToInt( StereoOut32* srcdest, uint size )\r\n{\r\n\t//jASSUME( (size & 127) == 0 );\r\n\t\r\n\tconst StereoOutFloat* src = (StereoOutFloat*)srcdest;\r\n\tStereoOut32* dest = srcdest;\r\n\r\n\tfor( uint i=0; i<size; ++i, ++dest, ++src )\r\n\t\t*dest = (StereoOut32)*src;\r\n}\r\n\r\nvoid SndBuffer::timeStretchWrite()\r\n{\r\n\tbool progress = false;\r\n\r\n\t// data prediction helps keep the tempo adjustments more accurate.\r\n\t// The timestretcher returns packets in belated \"clump\" form.\r\n\t// Meaning that most of the time we'll get nothing back, and then\r\n\t// suddenly we'll get several chunks back at once.  Thus we use\r\n\t// data prediction to make the timestretcher more responsive.\r\n\r\n\tPredictDataWrite( (int)( SndOutPacketSize / eTempo ) );\r\n\tCvtPacketToFloat( sndTempBuffer );\r\n\r\n\tpSoundTouch->putSamples( (float*)sndTempBuffer, SndOutPacketSize );\r\n\r\n\tint tempProgress;\r\n\twhile( tempProgress = pSoundTouch->receiveSamples( (float*)sndTempBuffer, SndOutPacketSize),\r\n\t\ttempProgress != 0 )\r\n\t{\r\n\t\t// Hint: It's assumed that pSoundTouch will return chunks of 128 bytes (it always does as\r\n\t\t// long as the SSE optimizations are enabled), which means we can do our own SSE opts here.\r\n\t\t\r\n\t\tCvtPacketToInt( sndTempBuffer, tempProgress );\r\n\t\t_WriteSamples( sndTempBuffer, tempProgress );\r\n\t\tprogress = true;\r\n\t}\r\n\r\n\tUpdateTempoChange();\r\n\r\n\t//TODO\r\n\t//if( MsgOverruns() )\r\n\t{\r\n\t\tif( progress )\r\n\t\t{\r\n\t\t\tif( ++ts_stats_logcounter > 300 )\r\n\t\t\t{\r\n\t\t\t\tts_stats_logcounter = 0;\r\n\t\t\t\tprintf( \" * SPU2 > Timestretch Stats > %d%% of packets stretched.\\n\",\r\n\t\t\t\t\t( ts_stats_stretchblocks * 100 ) / ( ts_stats_normalblocks + ts_stats_stretchblocks ) );\r\n\t\t\t\tts_stats_normalblocks = 0;\r\n\t\t\t\tts_stats_stretchblocks = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SndBuffer::soundtouchInit()\r\n{\r\n\tpSoundTouch = new soundtouch::SoundTouch();\r\n\tpSoundTouch->setSampleRate(SampleRate);\r\n\tpSoundTouch->setChannels(2);\r\n\r\n\tpSoundTouch->setSetting( SETTING_USE_QUICKSEEK, 0 );\r\n\tpSoundTouch->setSetting( SETTING_USE_AA_FILTER, 0 );\r\n\r\n#ifdef _WINDOWS\r\n\tSoundtouchCfg::ApplySettings( *pSoundTouch );\r\n#endif\r\n\r\n\tpSoundTouch->setTempo(1);\r\n\r\n\t// some timestretch management vars:\r\n\r\n\tcTempo = 1.0;\r\n\teTempo = 1.0;\r\n\tlastPct = 0;\r\n\tlastEmergencyAdj = 0;\r\n\r\n\t// just freeze tempo changes for a while at startup.\r\n\t// the driver buffers are bogus anyway.\r\n\tfreezeTempo = 16;\r\n\tm_predictData = 0;\r\n}\r\n\r\n// reset timestretch management vars, and delay updates a bit:\r\nvoid SndBuffer::soundtouchClearContents()\r\n{\r\n\tif( pSoundTouch == NULL ) return;\r\n\r\n\tpSoundTouch->clear();\r\n\tpSoundTouch->setTempo(1);\r\n\r\n\tcTempo = 1.0;\r\n\teTempo = 1.0;\r\n\tlastPct = 0;\r\n\tlastEmergencyAdj = 0;\r\n\r\n\tfreezeTempo = 16;\r\n\tm_predictData = 0;\r\n}\r\n\r\nvoid SndBuffer::soundtouchCleanup()\r\n{\r\n\t//safe_delete( pSoundTouch );\r\n\tdelete pSoundTouch;\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/metaspu/metaspu.cpp",
    "content": "/*  Copyright 2009 DeSmuME team\r\n\r\n    This file is part of DeSmuME\r\n\r\n    DeSmuME is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    DeSmuME is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with DeSmuME; if not, write to the Free Software\r\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\r\n*/\r\n\r\n#include \"types.h\"\r\n#include \"metaspu.h\"\r\n#include <queue>\r\n#include <vector>\r\n#include <assert.h>\r\n\r\n//for pcsx2 method\r\n#if defined(_MSC_VER) || defined(HAVE_LIBSOUNDTOUCH) || defined(DESMUME_COCOA)\r\n#include \"SndOut.h\"\r\n#endif\r\n\r\n\r\ntemplate<typename T> inline T _abs(T val)\r\n{\r\n\tif(val<0) return -val;\r\n\telse return val;\r\n}\r\n\r\ntemplate<typename T> inline T moveValueTowards(T val, T target, T incr)\r\n{\r\n\tincr = _abs(incr);\r\n\tT delta = _abs(target-val);\r\n\tif(val<target) val += incr;\r\n\telse if(val>target) val -= incr;\r\n\tT newDelta = _abs(target-val);\r\n\tif(newDelta >= delta)\r\n\t\tval = target;\r\n\treturn val;\r\n}\r\n\r\n\r\nclass ZeromusSynchronizer : public ISynchronizingAudioBuffer\r\n{\r\npublic:\r\n\tZeromusSynchronizer()\r\n\t\t: mixqueue_go(false)\r\n\t\t,\r\n\t\t#ifdef NDEBUG\r\n\t\tadjustobuf(200,1000)\r\n\t\t#else\r\n\t\tadjustobuf(22000,44000)\r\n\t\t#endif\r\n\t{\r\n\r\n\t}\r\n\r\n\tbool mixqueue_go;\r\n\r\n\tvirtual void enqueue_samples(s16* buf, int samples_provided)\r\n\t{\r\n\t\tfor(int i=0;i<samples_provided;i++) {\r\n\t\t\ts16 left = *buf++;\r\n\t\t\ts16 right = *buf++;\r\n\t\t\tadjustobuf.enqueue(left,right);\r\n\t\t}\r\n\t}\r\n\r\n\t//returns the number of samples actually supplied, which may not match the number requested\r\n\tvirtual int output_samples(s16* buf, int samples_requested)\r\n\t{\r\n\t\tint done = 0;\r\n\t\tif(!mixqueue_go) {\r\n\t\t\tif(adjustobuf.size > 200)\r\n\t\t\t\tmixqueue_go = true;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfor(int i=0;i<samples_requested;i++) {\r\n\t\t\t\tif(adjustobuf.size==0) {\r\n\t\t\t\t\tmixqueue_go = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdone++;\r\n\t\t\t\ts16 left, right;\r\n\t\t\t\tadjustobuf.dequeue(left,right);\r\n\t\t\t\t*buf++ = left;\r\n\t\t\t\t*buf++ = right;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn done;\r\n\t}\r\n\r\nprivate:\r\n\tclass Adjustobuf\r\n\t{\r\n\tpublic:\r\n\t\tAdjustobuf(int _minLatency, int _maxLatency)\r\n\t\t\t: size(0)\r\n\t\t\t, minLatency(_minLatency)\r\n\t\t\t, maxLatency(_maxLatency)\r\n\t\t{\r\n\t\t\trollingTotalSize = 0;\r\n\t\t\ttargetLatency = (maxLatency + minLatency)/2;\r\n\t\t\trate = 1.0f;\r\n\t\t\tcursor = 0.0f;\r\n\t\t\tcurr[0] = curr[1] = 0;\r\n\t\t\tkAverageSize = 80000;\r\n\t\t}\r\n\r\n\t\tfloat rate, cursor;\r\n\t\tint minLatency, targetLatency, maxLatency;\r\n\t\tstd::queue<s16> buffer;\r\n\t\tint size;\r\n\t\ts16 curr[2];\r\n\r\n\t\tstd::queue<int> statsHistory;\r\n\r\n\t\tvoid enqueue(s16 left, s16 right) \r\n\t\t{\r\n\t\t\tbuffer.push(left);\r\n\t\t\tbuffer.push(right);\r\n\t\t\tsize++;\r\n\t\t}\r\n\r\n\t\ts64 rollingTotalSize;\r\n\r\n\t\tu32 kAverageSize;\r\n\r\n\t\tvoid addStatistic()\r\n\t\t{\r\n\t\t\tstatsHistory.push(size);\r\n\t\t\trollingTotalSize += size;\r\n\t\t\tif(statsHistory.size()>kAverageSize)\r\n\t\t\t{\r\n\t\t\t\trollingTotalSize -= statsHistory.front();\r\n\t\t\t\tstatsHistory.pop();\r\n\r\n\t\t\t\tfloat averageSize = (float)(rollingTotalSize / kAverageSize);\r\n\t\t\t\t//static int ctr=0;  ctr++; if((ctr&127)==0) printf(\"avg size: %f curr size: %d rate: %f\\n\",averageSize,size,rate);\r\n\t\t\t\t{\r\n\t\t\t\t\tfloat targetRate;\r\n\t\t\t\t\tif(averageSize < targetLatency)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttargetRate = 1.0f - (targetLatency-averageSize)/kAverageSize;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(averageSize > targetLatency) {\r\n\t\t\t\t\t\ttargetRate = 1.0f + (averageSize-targetLatency)/kAverageSize;\r\n\t\t\t\t\t} else targetRate = 1.0f;\r\n\t\t\t\t\r\n\t\t\t\t\t//rate = moveValueTowards(rate,targetRate,0.001f);\r\n\t\t\t\t\trate = targetRate;\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t}\r\n\r\n\t\tvoid dequeue(s16& left, s16& right)\r\n\t\t{\r\n\t\t\tleft = right = 0; \r\n\t\t\taddStatistic();\r\n\t\t\tif(size==0) { return; }\r\n\t\t\tcursor += rate;\r\n\t\t\twhile(cursor>1.0f) {\r\n\t\t\t\tcursor -= 1.0f;\r\n\t\t\t\tif(size>0) {\r\n\t\t\t\t\tcurr[0] = buffer.front(); buffer.pop();\r\n\t\t\t\t\tcurr[1] = buffer.front(); buffer.pop();\r\n\t\t\t\t\tsize--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tleft = curr[0]; \r\n\t\t\tright = curr[1];\r\n\t\t}\r\n\t} adjustobuf;\r\n};\r\n\r\nclass NitsujaSynchronizer : public ISynchronizingAudioBuffer\r\n{\r\nprivate:\r\n\tstruct ssamp\r\n\t{\r\n\t\ts16 l, r;\r\n\t\tssamp() {}\r\n\t\tssamp(s16 ll, s16 rr) : l(ll), r(rr) {}\r\n\t};\r\n\r\n\tstd::vector<ssamp> sampleQueue;\r\n\r\n\t// returns values going between 0 and y-1 in a saw wave pattern, based on x\r\n\tstatic FORCEINLINE int pingpong(int x, int y)\r\n\t{\r\n\t\tx %= 2*y;\r\n\t\tif(x >= y)\r\n\t\t\tx = 2*y - x - 1;\r\n\t\treturn x;\r\n\r\n\t\t// in case we want to switch to odd buffer sizes for more sharpness\r\n\t\t//x %= 2*(y-1);\r\n\t\t//if(x >= y)\r\n\t\t//\tx = 2*(y-1) - x;\r\n\t\t//return x;\r\n\t}\r\n\r\n\tstatic FORCEINLINE ssamp crossfade (ssamp lhs, ssamp rhs,  int cur, int start, int end)\r\n\t{\r\n\t\tif(cur <= start)\r\n\t\t\treturn lhs;\r\n\t\tif(cur >= end)\r\n\t\t\treturn rhs;\r\n\r\n\t\t// in case we want sine wave interpolation instead of linear here\r\n\t\t//float ang = 3.14159f * (float)(cur - start) / (float)(end - start);\r\n\t\t//cur = start + (int)((1-cosf(ang))*0.5f * (end - start));\r\n\r\n\t\tint inNum = cur - start;\r\n\t\tint outNum = end - cur;\r\n\t\tint denom = end - start;\r\n\r\n\t\tint lrv = ((int)lhs.l * outNum + (int)rhs.l * inNum) / denom;\r\n\t\tint rrv = ((int)lhs.r * outNum + (int)rhs.r * inNum) / denom;\r\n\r\n\t\treturn ssamp(lrv,rrv);\r\n\t}\r\n\r\n\tstatic FORCEINLINE void emit_sample(s16*& outbuf, ssamp sample)\r\n\t{\r\n\t\t*outbuf++ = sample.l;\r\n\t\t*outbuf++ = sample.r;\r\n\t}\r\n\r\n\tstatic FORCEINLINE void emit_samples(s16*& outbuf, const ssamp* samplebuf, int samples)\r\n\t{\r\n\t\tfor(int i=0;i<samples;i++)\r\n\t\t\temit_sample(outbuf,samplebuf[i]);\r\n\t}\r\n\r\npublic:\r\n\tNitsujaSynchronizer()\r\n\t{}\r\n\r\n\tvirtual void enqueue_samples(s16* buf, int samples_provided)\r\n\t{\r\n\t\tfor(int i=0;i<samples_provided;i++)\r\n\t\t{\r\n\t\t\tsampleQueue.push_back(ssamp(buf[0],buf[1]));\r\n\t\t\tbuf += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tvirtual int output_samples(s16* buf, int samples_requested)\r\n\t{\r\n\t\tint audiosize = samples_requested;\r\n\t\tint queued = sampleQueue.size();\r\n\r\n\t\t// I am too lazy to deal with odd numbers\r\n\t\taudiosize &= ~1;\r\n\t\tqueued &= ~1;\r\n\r\n\t\tif(queued > 0x200 && audiosize > 0) // is there any work to do?\r\n\t\t{\r\n\t\t\t// are we going at normal speed?\r\n\t\t\t// or more precisely, are the input and output queues/buffers of similar size?\r\n\t\t\tif(queued > 900 || audiosize > queued * 2)\r\n\t\t\t{\r\n\t\t\t\t// not normal speed. we have to resample it somehow in this case.\r\n\t\t\t\tif(audiosize <= queued)\r\n\t\t\t\t{\r\n\t\t\t\t\t// fast forward speed\r\n\t\t\t\t\t// this is the easy case, just crossfade it and it sounds ok\r\n\t\t\t\t\tfor(int i = 0; i < audiosize; i++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint j = i + queued - audiosize;\r\n\t\t\t\t\t\tssamp outsamp = crossfade(sampleQueue[i],sampleQueue[j], i,0,audiosize);\r\n\t\t\t\t\t\temit_sample(buf,outsamp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t// slow motion speed\r\n\t\t\t\t\t// here we take a very different approach,\r\n\t\t\t\t\t// instead of crossfading it, we select a single sample from the queue\r\n\t\t\t\t\t// and make sure that the index we use to select a sample is constantly moving\r\n\t\t\t\t\t// and that it starts at the first sample in the queue and ends on the last one.\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// hopefully the index doesn't move discontinuously or we'll get slight crackling\r\n\t\t\t\t\t// (there might still be a minor bug here that causes this occasionally)\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// here's a diagram of how the index we sample from moves:\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// queued (this axis represents the index we sample from. the top means the end of the queue)\r\n\t\t\t\t\t// ^\r\n\t\t\t\t\t// |   --> audiosize (this axis represents the output index we write to, right meaning forward in output time/position)\r\n\t\t\t\t\t// |   A           C       C  end\r\n\t\t\t\t\t//    A A     B   C C     C\r\n\t\t\t\t\t//   A   A   A B C   C   C\r\n\t\t\t\t\t//  A     A A   B     C C\r\n\t\t\t\t\t// A       A           C\r\n\t\t\t\t\t// start\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// yes, this means we are spending some stretches of time playing the sound backwards,\r\n\t\t\t\t\t// but the stretches are short enough that this doesn't sound weird.\r\n\t\t\t\t\t// this lets us avoid most crackling problems due to the endpoints matching up.\r\n\r\n\t\t\t\t\t// first calculate a shorter-than-full window\r\n\t\t\t\t\t// that has minimal slope at the endpoints\r\n\t\t\t\t\t// (to further reduce crackling, especially in sine waves)\r\n\t\t\t\t\tint beststart = 0, extraAtEnd = 0;\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint bestend = queued;\r\n\t\t\t\t\t\tstatic const int worstdiff = 99999999;\r\n\t\t\t\t\t\tint beststartdiff = worstdiff;\r\n\t\t\t\t\t\tint bestenddiff = worstdiff;\r\n\t\t\t\t\t\tfor(int i = 0; i < 128; i+=2)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tint diff = abs(sampleQueue[i].l - sampleQueue[i+1].l) + abs(sampleQueue[i].r - sampleQueue[i+1].r);\r\n\t\t\t\t\t\t\tif(diff < beststartdiff)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbeststartdiff = diff;\r\n\t\t\t\t\t\t\t\tbeststart = i;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfor(int i = queued-3; i > queued-3-128; i-=2)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tint diff = abs(sampleQueue[i].l - sampleQueue[i+1].l) + abs(sampleQueue[i].r - sampleQueue[i+1].r);\r\n\t\t\t\t\t\t\tif(diff < bestenddiff)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbestenddiff = diff;\r\n\t\t\t\t\t\t\t\tbestend = i+1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\textraAtEnd = queued - bestend;\r\n\t\t\t\t\t\tqueued = bestend - beststart;\r\n\r\n\t\t\t\t\t\tint oksize = queued;\r\n\t\t\t\t\t\twhile(oksize + queued*2 + beststart + extraAtEnd <= samples_requested)\r\n\t\t\t\t\t\t\toksize += queued*2;\r\n\t\t\t\t\t\taudiosize = oksize;\r\n\r\n\t\t\t\t\t\tfor(int x = 0; x < beststart; x++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\temit_sample(buf,sampleQueue[x]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + beststart);\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tint midpointX = audiosize >> 1;\r\n\t\t\t\t\tint midpointY = queued >> 1;\r\n\r\n\t\t\t\t\t// all we need to do here is calculate the X position of the leftmost \"B\" in the above diagram.\r\n\t\t\t\t\t// TODO: we should calculate it with a simple equation like\r\n\t\t\t\t\t//   midpointXOffset = min(something,somethingElse);\r\n\t\t\t\t\t// but it's a little difficult to work it out exactly\r\n\t\t\t\t\t// so here's a stupid search for the value for now:\r\n\r\n\t\t\t\t\tint prevA = 999999;\r\n\t\t\t\t\tint midpointXOffset = queued/2;\r\n\t\t\t\t\twhile(true)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint a = abs(pingpong(midpointX - midpointXOffset, queued) - midpointY) - midpointXOffset;\r\n\t\t\t\t\t\tif(((a > 0) != (prevA > 0) || (a < 0) != (prevA < 0)) && prevA != 999999)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif((a + prevA)&1) // there's some sort of off-by-one problem with this search since we're moving diagonally...\r\n\t\t\t\t\t\t\t\tmidpointXOffset++; // but this fixes it most of the time...\r\n\t\t\t\t\t\t\tbreak; // found it\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tprevA = a;\r\n\t\t\t\t\t\tmidpointXOffset--;\r\n\t\t\t\t\t\tif(midpointXOffset < 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tmidpointXOffset = 0;\r\n\t\t\t\t\t\t\tbreak; // failed to find it. the two sides probably meet exactly in the center.\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tint leftMidpointX = midpointX - midpointXOffset;\r\n\t\t\t\t\tint rightMidpointX = midpointX + midpointXOffset;\r\n\t\t\t\t\tint leftMidpointY = pingpong(leftMidpointX, queued);\r\n\t\t\t\t\tint rightMidpointY = (queued-1) - pingpong((int)audiosize-1 - rightMidpointX + queued*2, queued);\r\n\r\n\t\t\t\t\t// output the left almost-half of the sound (section \"A\")\r\n\t\t\t\t\tfor(int x = 0; x < leftMidpointX; x++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint i = pingpong(x, queued);\r\n\t\t\t\t\t\temit_sample(buf,sampleQueue[i]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// output the middle stretch (section \"B\")\r\n\t\t\t\t\tint y = leftMidpointY;\r\n\t\t\t\t\tint dyMidLeft  = (leftMidpointY  < midpointY) ? 1 : -1;\r\n\t\t\t\t\tint dyMidRight = (rightMidpointY > midpointY) ? 1 : -1;\r\n\t\t\t\t\tfor(int x = leftMidpointX; x < midpointX; x++, y+=dyMidLeft)\r\n\t\t\t\t\t\temit_sample(buf,sampleQueue[y]);\r\n\t\t\t\t\tfor(int x = midpointX; x < rightMidpointX; x++, y+=dyMidRight)\r\n\t\t\t\t\t\temit_sample(buf,sampleQueue[y]);\r\n\r\n\t\t\t\t\t// output the end of the queued sound (section \"C\")\r\n\t\t\t\t\tfor(int x = rightMidpointX; x < audiosize; x++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint i = (queued-1) - pingpong((int)audiosize-1 - x + queued*2, queued);\r\n\t\t\t\t\t\temit_sample(buf,sampleQueue[i]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfor(int x = 0; x < extraAtEnd; x++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint i = queued + x;\r\n\t\t\t\t\t\temit_sample(buf,sampleQueue[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tqueued += extraAtEnd;\r\n\t\t\t\t\taudiosize += beststart + extraAtEnd;\r\n\t\t\t\t} //end else\r\n\r\n\t\t\t\tsampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + queued);\r\n\t\t\t\treturn audiosize;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t// normal speed\r\n\t\t\t\t// just output the samples straightforwardly.\r\n\t\t\t\t//\r\n\t\t\t\t// at almost-full speeds (like 50/60 FPS)\r\n\t\t\t\t// what will happen is that we rapidly fluctuate between entering this branch\r\n\t\t\t\t// and entering the \"slow motion speed\" branch above.\r\n\t\t\t\t// but that's ok! because all of these branches sound similar enough that we can get away with it.\r\n\t\t\t\t// so the two cases actually complement each other.\r\n\r\n\t\t\t\tif(audiosize >= queued)\r\n\t\t\t\t{\r\n\t\t\t\t\temit_samples(buf,&sampleQueue[0],queued);\r\n\t\t\t\t\tsampleQueue.erase(sampleQueue.begin(), sampleQueue.begin() + queued);\r\n\t\t\t\t\treturn queued;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\temit_samples(buf,&sampleQueue[0],audiosize);\r\n\t\t\t\t\tsampleQueue.erase(sampleQueue.begin(), sampleQueue.begin()+audiosize);\r\n\t\t\t\t\treturn audiosize;\r\n\t\t\t\t}\r\n\r\n\t\t\t} //end normal speed\r\n\r\n\t\t} //end if there is any work to do\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t} //output_samples\r\n\r\nprivate:\r\n\r\n}; //NitsujaSynchronizer\r\n\r\n\r\n#if defined(_MSC_VER) || defined(HAVE_LIBSOUNDTOUCH) || defined(DESMUME_COCOA)\r\nclass PCSX2Synchronizer : public ISynchronizingAudioBuffer\r\n{\r\npublic:\r\n\tstd::queue<s16> readySamples;\r\n\tPCSX2Synchronizer()\r\n\t{\r\n\t\tSndBuffer::Init();\r\n\t}\r\n\tvirtual void enqueue_samples(s16* buf, int samples_provided)\r\n\t{\r\n\t\tfor(int i=0;i<samples_provided;i++)\r\n\t\t{\r\n\t\t\tStereoOut32 so32(buf[0],buf[1]);\r\n\t\t\tSndBuffer::Write(so32);\r\n\t\t\tbuf++;\r\n\t\t\tbuf++;\r\n\t\t}\r\n\t}\r\n\r\n\tvirtual int output_samples(s16* buf, int samples_requested)\r\n\t{\r\n\t\tfor(int i=0;i<samples_requested;i++) {\r\n\t\t\tif(readySamples.size()==0) {\r\n\t\t\t\t//SndOutPacketSize\r\n\t\t\t\tStereoOut16 temp[SndOutPacketSize*2];\r\n\t\t\t\tSndBuffer::ReadSamples( temp );\r\n\t\t\t\tfor(int i=0;i<SndOutPacketSize;i++) {\r\n\t\t\t\t\treadySamples.push(temp[i].Left);\r\n\t\t\t\t\treadySamples.push(temp[i].Right);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t*buf++ = readySamples.front(); readySamples.pop();\r\n\t\t\t*buf++ = readySamples.front(); readySamples.pop();\r\n\t\t}\r\n\t\treturn samples_requested;\r\n\t}\r\n};\r\n#endif\r\n\r\n\r\nISynchronizingAudioBuffer* metaspu_construct(ESynchMethod method)\r\n{\r\n\tswitch(method)\r\n\t{\r\n\tcase ESynchMethod_N: return new NitsujaSynchronizer();\r\n\tcase ESynchMethod_Z: return new ZeromusSynchronizer();\r\n#if defined(_MSC_VER) || defined(HAVE_LIBSOUNDTOUCH) || defined(DESMUME_COCOA)\r\n\tcase ESynchMethod_P: return new PCSX2Synchronizer();\r\n#endif\r\n\tdefault: return NULL;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/metaspu/metaspu.h",
    "content": "/*  Copyright 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n//-------------------------\r\n//this file contains the METASPU system\r\n//which is designed to handle the task of audio synchronization\r\n//and is designed to be as portable between multiple emulators\r\n//-------------------------\r\n\r\n\r\n#ifndef _METASPU_H_\r\n#define _METASPU_H_\r\n\r\n#include <algorithm>\r\n\r\ntemplate< typename T >\r\nstatic FORCEINLINE void Clampify( T& src, T min, T max )\r\n{\r\n\tsrc = std::min( std::max( src, min ), max );\r\n}\r\n\r\ntemplate< typename T >\r\nstatic FORCEINLINE T GetClamped( T src, T min, T max )\r\n{\r\n\treturn std::min( std::max( src, min ), max );\r\n}\r\n\r\nclass ISynchronizingAudioBuffer\r\n{\r\npublic:\r\n\tvirtual void enqueue_samples(s16* buf, int samples_provided) = 0;\r\n\r\n\t//returns the number of samples actually supplied, which may not match the number requested\r\n\tvirtual int output_samples(s16* buf, int samples_requested) = 0;\r\n};\r\n\r\nenum ESynchMode\r\n{\r\n\tESynchMode_DualSynchAsynch,\r\n\tESynchMode_Synchronous\r\n};\r\n\r\nenum ESynchMethod\r\n{\r\n\tESynchMethod_N, //nitsuja's\r\n\tESynchMethod_Z, //zero's\r\n\tESynchMethod_P, //PCSX2 spu2-x\r\n};\r\n\r\nISynchronizingAudioBuffer* metaspu_construct(ESynchMethod method);\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/mic.cpp",
    "content": "/* mic.cpp - this file is part of DeSmuME\n *\n * Copyright (C) 2009-2011 DeSmuME Team\n *\n * This file is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * This file is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n#ifndef WIN32\n\n#include <stdlib.h>\n#include \"mic.h\"\n#include \"NDSSystem.h\"\n#include \"readwrite.h\"\n\n#define MIC_NULL_SAMPLE_VALUE 0\n#define MIC_MAX_BUFFER_SAMPLES 320\n#define MIC_BUFFER_SIZE (sizeof(u8) * MIC_MAX_BUFFER_SAMPLES)\n#define NUM_INTERNAL_NOISE_SAMPLES 32\n\nstatic u8 *micSampleBuffer = NULL; // Pointer to the internal sample buffer.\nstatic u8 *micReadPosition = NULL; // Pointer to the read position of the internal sample buffer.\nstatic u8 *micWritePosition = NULL; // Pointer to the write position of the internal sample buffer.\nstatic unsigned int micBufferFillCount; // The number of readable samples in the internal sample buffer.\n\nstatic void Mic_BufferClear(void)\n{\n\tif (micSampleBuffer == NULL) {\n\t\treturn;\n\t}\n\n\tmemset(micSampleBuffer, MIC_NULL_SAMPLE_VALUE, MIC_BUFFER_SIZE);\n\tmicReadPosition = micSampleBuffer;\n\tmicWritePosition = micSampleBuffer;\n\tmicBufferFillCount = 0;\n}\n\nBOOL Mic_Init(void)\n{\n\tBOOL result = FALSE;\n\n\tu8 *newBuffer = (u8 *)malloc(MIC_BUFFER_SIZE);\n\tif (newBuffer == NULL) {\n\t\treturn result;\n\t}\n\n\tmicSampleBuffer = newBuffer;\n\tMic_BufferClear();\n\tresult = TRUE;\n\n\treturn result;\n}\n\nvoid Mic_DeInit(void)\n{\n\tfree(micSampleBuffer);\n\tmicSampleBuffer = NULL;\n}\n\nvoid Mic_Reset(void)\n{\n\t*micReadPosition = MIC_NULL_SAMPLE_VALUE;\n\tmicWritePosition = micReadPosition;\n\tmicBufferFillCount = 0;\n}\n\nstatic bool Mic_GetActivate(void)\n{\n\treturn NDS_getFinalUserInput().mic.micButtonPressed;\n}\n\nstatic bool Mic_IsBufferFull(void)\n{\n\treturn (micBufferFillCount >= MIC_MAX_BUFFER_SAMPLES);\n}\n\nstatic bool Mic_IsBufferEmpty(void)\n{\n\treturn (micBufferFillCount == 0);\n}\n\nstatic u8 Mic_DefaultBufferRead(void)\n{\n\tu8 theSample = MIC_NULL_SAMPLE_VALUE;\n\n\tif (micSampleBuffer == NULL) {\n\t\treturn theSample;\n\t}\n\n\ttheSample = *micReadPosition;\n\n\tif (Mic_IsBufferEmpty()) {\n\t\treturn theSample;\n\t}\n\n\tmicReadPosition++;\n\tmicBufferFillCount--;\n\n\t// Move the pointer back to start if we reach the end of the memory block.\n\tif (micReadPosition >= (micSampleBuffer + MIC_BUFFER_SIZE)) {\n\t\tmicReadPosition = micSampleBuffer;\n\t}\n\n\treturn theSample;\n}\n\nu8 Mic_ReadSample(void)\n{\n\t// All mic modes other than Physical must have the mic hotkey pressed in order\n\t// to work.\n\tif (CommonSettings.micMode != TCommonSettings::Physical && !Mic_GetActivate()) {\n\t\treturn MIC_NULL_SAMPLE_VALUE;\n\t}\n\n\treturn Mic_DefaultBufferRead();\n}\n\nstatic void Mic_DefaultBufferWrite(u8 theSample)\n{\n\tif (micSampleBuffer == NULL || Mic_IsBufferFull()) {\n\t\treturn;\n\t}\n\n\t*micWritePosition = theSample;\n\tmicWritePosition++;\n\tmicBufferFillCount++;\n\n\t// Move the pointer back to start if we reach the end of the memory block.\n\tif (micWritePosition >= (micSampleBuffer + MIC_BUFFER_SIZE)) {\n\t\tmicWritePosition = micSampleBuffer;\n\t}\n}\n\nstatic u8 Mic_GenerateInternalNoiseSample(void)\n{\n\tconst u8 noiseSample[NUM_INTERNAL_NOISE_SAMPLES] =\n\t{\n\t\t0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFF, \n\t\t0xF4, 0xE1, 0xBF, 0x9A, 0x71, 0x58, 0x5B, 0x5F, 0x62, 0xC2, 0x25, 0x05, 0x01, 0x01, 0x01, 0x01\n\t};\n\tstatic unsigned int i = 0;\n\n\tif (++i >= NUM_INTERNAL_NOISE_SAMPLES) {\n\t\ti = 0;\n\t}\n\n\treturn noiseSample[i];\n}\n\nstatic u8 Mic_GenerateWhiteNoiseSample(void)\n{\n\treturn (u8)(rand() & 0xFF);\n}\n\nstatic u8 Mic_GenerateNullSample(void)\n{\n\treturn MIC_NULL_SAMPLE_VALUE;\n}\n\nvoid Mic_DoNoise(BOOL noise)\n{\n\tu8 (*generator) (void) = NULL;\n\n\tif (micSampleBuffer == NULL) {\n\t\treturn;\n\t}\n\n\tif (!noise) {\n\t\tgenerator = &Mic_GenerateNullSample;\n\t} else if (CommonSettings.micMode == TCommonSettings::InternalNoise) {\n\t\tgenerator = &Mic_GenerateInternalNoiseSample;\n\t} else if (CommonSettings.micMode == TCommonSettings::Random) {\n\t\tgenerator = &Mic_GenerateWhiteNoiseSample;\n\t}\n\n\tif (generator == NULL) {\n\t\treturn;\n\t}\n\n\twhile (micBufferFillCount < MIC_MAX_BUFFER_SAMPLES) {\n\t\tMic_DefaultBufferWrite(generator());\n\t}\n}\n\nvoid mic_savestate(EMUFILE* os)\n{\n\twrite32le(-1,os);\n}\n\nbool mic_loadstate(EMUFILE* is, int size)\n{\n\tis->fseek(size, SEEK_CUR);\n\treturn TRUE;\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/mic.h",
    "content": "/*\n\tCopyright (C) 2009-2011 DeSmuME Team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef MIC_H\n#define MIC_H\n\n#include <iostream>\n#include \"emufile.h\"\n#include \"types.h\"\n\n#ifdef WIN32\nstatic char MicSampleName[256];\nbool LoadSample(const char *name);\n#endif\n\nextern int MicDisplay;\n\n#ifdef FAKE_MIC\nvoid Mic_DoNoise(BOOL);\n#endif\n\nBOOL Mic_Init(void);\nvoid Mic_Reset(void);\nvoid Mic_DeInit(void);\nu8 Mic_ReadSample(void);\n\nvoid mic_savestate(EMUFILE* os);\nbool mic_loadstate(EMUFILE* is, int size);\n\n#endif // MIC_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/mic_alsa.cpp",
    "content": "/*\r\n\tCopyright (C) 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\n\n#include <alsa/asoundlib.h>\n#include <glib.h>\n#include \"types.h\"\n#include \"mic.h\"\n#include \"debug.h\"\n#include \"readwrite.h\"\n#include \"emufile.h\"\n\n#define MIC_BUFSIZE 4096\n\nBOOL Mic_Inited = FALSE;\nu8 Mic_Buffer[2][MIC_BUFSIZE];\nu16 Mic_BufPos;\nu8 Mic_PlayBuf;\nu8 Mic_WriteBuf;\n\nint MicButtonPressed;\n\n/* Alsa stuff */\nstatic snd_pcm_t *pcm_handle;\n\nBOOL Mic_Init()\n{\n    snd_pcm_hw_params_t *hwparams;\n    snd_pcm_uframes_t mic_bufsize, periods;\n    int err;\n\n    if (Mic_Inited)\n        return TRUE;\n\n    if ((err = snd_pcm_open(&pcm_handle, \"default\", SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) {\n        g_printerr(\"Failed to open device: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    /* Hardware params */\n    snd_pcm_hw_params_alloca(&hwparams);\n    if ((err = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0) {\n        g_printerr(\"Failed to setup hw parameters: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    if ((err = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {\n        g_printerr(\"Failed to set access: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    /* 8bit signed, mono, 16000hz */\n    if ((err = snd_pcm_hw_params_set_format(pcm_handle, hwparams, SND_PCM_FORMAT_S8)) < 0) {\n        g_printerr(\"Failed to set format: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    if ((err = snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 1)) < 0) {\n        g_printerr(\"Failed to set channels: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    if ((err = snd_pcm_hw_params_set_rate(pcm_handle, hwparams, 16000, 0)) < 0) {\n        g_printerr(\"Failed to set rate: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    if ((err = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) {\n        g_printerr(\"Failed to set hw parameters: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    /* Query the driver for buffer and period sizes */\n    if ((err = snd_pcm_hw_params_get_buffer_size(hwparams, &mic_bufsize)) < 0) {\n        g_printerr(\"Failed to get buffer size: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    if ((err = snd_pcm_hw_params_get_period_size(hwparams, &periods, 0)) < 0) {\n        g_printerr(\"Failed to get period size: %s\\n\", snd_strerror(err));\n        return FALSE;\n    }\n\n    Mic_Inited = TRUE;\n    Mic_Reset();\n\n    return TRUE;\n}\n\nvoid Mic_Reset()\n{\n    if (!Mic_Inited)\n        return;\n\n    memset(Mic_Buffer, 0, MIC_BUFSIZE * 2);\n    Mic_BufPos = 0;\n    Mic_PlayBuf = 1;\n    Mic_WriteBuf = 0;\n}\n\nvoid Mic_DeInit()\n{\n    if (!Mic_Inited)\n        return;\n\n    Mic_Inited = FALSE;\n\n    snd_pcm_drop(pcm_handle);\n    snd_pcm_close(pcm_handle);\n}\n\nstatic void snd_pcm_read()\n{\n    int error;\n\n    error = snd_pcm_readi(pcm_handle, Mic_Buffer[Mic_WriteBuf], MIC_BUFSIZE);\n    if (error < 0)\n        error = snd_pcm_recover(pcm_handle, error, 0);\n    if (error < 0)\n       LOG(\"snd_pcm_readi FAIL!: %s\\n\", snd_strerror(error));\n}\n\nu8 Mic_ReadSample()\n{\n    u8 tmp;\n    u8 ret;\n\n    if (!Mic_Inited)\n        return 0;\n\n    tmp = Mic_Buffer[Mic_PlayBuf][Mic_BufPos >> 1];\n\n    if (Mic_BufPos & 0x1) {\n        ret = ((tmp & 0x1) << 7);\n    } else {\n        ret = ((tmp & 0xFE) >> 1);\n        snd_pcm_read();\n    }\n\n    Mic_BufPos++;\n    if (Mic_BufPos >= (MIC_BUFSIZE << 1)) {\n        snd_pcm_read();\n        Mic_BufPos = 0;\n        Mic_PlayBuf ^= 1;\n        Mic_WriteBuf ^= 1;\n    }\n\n    return ret;\n}\n\n/* FIXME: stub! */\nvoid mic_savestate(EMUFILE* os)\n{\n    write32le((u32)(-1),os);\n}\n\nbool mic_loadstate(EMUFILE* is, int size) \n{\n    is->fseek(size, SEEK_CUR);\n    return TRUE;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/mic_openal.cpp",
    "content": "/*\n\tCopyright (C) 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\n\n\n#ifndef WIN32\n\n#include <AL/al.h>\n#include <AL/alc.h>\n\n#include \"types.h\"\n#include \"mic.h\"\n#include \"readwrite.h\"\n#include \"emufile.h\"\n#include \"debug.h\"\n\n#define MIC_BUFSIZE 512\n\nBOOL Mic_Inited = FALSE;\nu8 Mic_Buffer[2][2*MIC_BUFSIZE];\nu16 Mic_BufPos;\nu8 Mic_PlayBuf;\nu8 Mic_WriteBuf;\n\nint MicButtonPressed;\n\nALCdevice *alDevice;\nALCdevice *alCaptureDevice;\nALCcontext *alContext;\n\nBOOL Mic_Init()\n{\n  ALenum err;\n  const char *szDefaultCaptureDevice;\n\n  if (!(alDevice = alcOpenDevice(0))) {\n    INFO(\"Failed to Initialize Open AL\\n\");\n    return FALSE;\n  }\n  if( !(alContext = alcCreateContext(alDevice, 0))) {\n    INFO(\"Failed to create OpenAL context\\n\");\n    return FALSE;\n  }\n  if( !alcMakeContextCurrent(alContext)) {\n    INFO(\"Failed to make OpenAL context current\\n\");\n    return FALSE;\n  }\n  alDistanceModel(AL_INVERSE_DISTANCE);\n\n  szDefaultCaptureDevice = alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);\n  LOG(\"Default OpenAL Capture Device is '%s'\\n\\n\", szDefaultCaptureDevice);\n\n  alCaptureDevice = alcCaptureOpenDevice(szDefaultCaptureDevice, 16000, AL_FORMAT_STEREO8, MIC_BUFSIZE);\n  err = alGetError();\n  if (err != AL_NO_ERROR) {\n    INFO(\"Failed to alCaptureOpenDevice, ALenum %i\\n\", err);\n    return 0;\n  }\n  alcCaptureStart(alCaptureDevice);\n\n  Mic_Inited = TRUE;\n  Mic_Reset();\n\n  return TRUE;\n}\n\nvoid Mic_Reset()\n{\n  if (!Mic_Inited)\n    return;\n\n  memset(Mic_Buffer, 0, MIC_BUFSIZE*2*2);\n  Mic_BufPos = 0;\n  Mic_PlayBuf = 1;\n  Mic_WriteBuf = 0;\n}\n\nvoid Mic_DeInit()\n{\n  if (!Mic_Inited)\n    return;\n\n  Mic_Inited = FALSE;\n\n  if (alDevice) {\n    if (alCaptureDevice) {\n      alcCaptureStop(alCaptureDevice);\n      alcCaptureCloseDevice(alCaptureDevice);\n    }\n    if (alContext) {\n      alcMakeContextCurrent(0);\n      alcDestroyContext(alContext);\n    }\n    alcCloseDevice(alDevice);\n  }\n}\n\n\nstatic void alReadSound()\n{\n  ALenum err;\n  int num;\n\n  alcGetIntegerv(alCaptureDevice, ALC_CAPTURE_SAMPLES, 1, &num);\n  if (num < MIC_BUFSIZE-1) {\n    LOG(\"not enough microphone data waiting! (%i samples)\\n\", num);\n  } else {\n    LOG(\"%i samples waiting\\n\", num);\n  }\n  if (num > MIC_BUFSIZE)\n    num = MIC_BUFSIZE;\n\n  alcCaptureSamples(alCaptureDevice, Mic_Buffer[Mic_WriteBuf], num);\n  err = alGetError();\n  if (err != AL_NO_ERROR) {\n    INFO(\"Failed to alcCaptureSamples, ALenum %i\\n\", err);\n    return;\n  }\n}\n\nu8 Mic_ReadSample()\n{\n  static u8 stats_max;\n  static u8 stats_min;\n  u8 ret;\n\n  if (Mic_BufPos >= MIC_BUFSIZE) {\n    alReadSound();\n    Mic_BufPos = 0;\n    Mic_PlayBuf ^= 1;\n    Mic_WriteBuf ^= 1;\n  }\n\n  ret = Mic_Buffer[Mic_PlayBuf][Mic_BufPos >> 1];\n  if (ret > stats_max)\n    stats_max = ret;\n  if (ret < stats_min)\n    stats_min = ret;\n  Mic_BufPos += 2;\n\n  return ret;\n}\n\nvoid mic_savestate(EMUFILE* os)\n{\n\twrite32le(-1,os);\n}\n\nbool mic_loadstate(EMUFILE* is, int size)\n{\n\tis->fseek(size, SEEK_CUR);\n\treturn TRUE;\n}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/movie.cpp",
    "content": "/*\r\n\tCopyright 2008-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#define WIN32_LEAN_AND_MEAN\r\n#include <assert.h>\r\n#include <limits.h>\r\n#include <ctype.h>\r\n#include <time.h>\r\n#include \"utils/guid.h\"\r\n#include \"utils/xstring.h\"\r\n#include \"utils/datetime.h\"\r\n#include \"movie.h\"\r\n#include \"NDSSystem.h\"\r\n#include \"readwrite.h\"\r\n#include \"debug.h\"\r\n#include \"rtc.h\"\r\n#include \"common.h\"\r\n#include \"mic.h\"\r\n#include \"version.h\"\r\n#include \"GPU_osd.h\"\r\n#include \"path.h\"\r\n#include \"emufile.h\"\r\n\r\nusing namespace std;\r\nbool freshMovie = false;\t  //True when a movie loads, false when movie is altered.  Used to determine if a movie has been altered since opening\r\nbool autoMovieBackup = true;\r\n\r\n#define FCEU_PrintError LOG\r\n\r\n#define MOVIE_VERSION 1\r\n\r\n#ifdef WIN32\r\n#include \".\\windows\\main.h\"\r\n#endif\r\n\r\n//----movie engine main state\r\n\r\nEMOVIEMODE movieMode = MOVIEMODE_INACTIVE;\r\n\r\n//this should not be set unless we are in MOVIEMODE_RECORD!\r\nEMUFILE* osRecordingMovie = 0;\r\n\r\nint currFrameCounter;\r\nuint32 cur_input_display = 0;\r\nint pauseframe = -1;\r\nbool movie_readonly = true;\r\n\r\nchar curMovieFilename[512] = {0};\r\nMovieData currMovieData;\r\nint currRerecordCount;\r\nbool movie_reset_command = false;\r\n//--------------\r\n\r\n\r\nvoid MovieData::clearRecordRange(int start, int len)\r\n{\r\n\tfor(int i=0;i<len;i++)\r\n\t\trecords[i+start].clear();\r\n}\r\n\r\nvoid MovieData::insertEmpty(int at, int frames)\r\n{\r\n\tif(at == -1) \r\n\t{\r\n\t\tint currcount = records.size();\r\n\t\trecords.resize(records.size()+frames);\r\n\t\tclearRecordRange(currcount,frames);\r\n\t}\r\n\telse\r\n\t{\r\n\t\trecords.insert(records.begin()+at,frames,MovieRecord());\r\n\t\tclearRecordRange(at,frames);\r\n\t}\r\n}\r\n\r\n\r\n\r\nvoid MovieRecord::clear()\r\n{ \r\n\tpad = 0;\r\n\tcommands = 0;\r\n\ttouch.padding = 0;\r\n}\r\n\r\n\r\nbool MovieRecord::Compare(MovieRecord& compareRec)\r\n{\r\n\t//Check pad\r\n\tif (this->pad != compareRec.pad) \r\n\t\treturn false;\r\n\r\n\t//Check Stylus\r\n\tif (this->touch.padding != compareRec.touch.padding) return false;\r\n\tif (this->touch.touch != compareRec.touch.touch) return false;\r\n\tif (this->touch.x != compareRec.touch.x) return false;\r\n\tif (this->touch.y != compareRec.touch.y) return false;\r\n\r\n\t//Check comamnds\r\n\t//if new commands are ever recordable, they need to be added here if we go with this method\r\n\tif(this->command_reset() != compareRec.command_reset()) return false;\r\n\tif(this->command_microphone() != compareRec.command_microphone()) return false;\r\n\tif(this->command_lid() != compareRec.command_lid()) return false;\r\n\t\r\n\treturn true;\r\n}\r\n\r\nconst char MovieRecord::mnemonics[13] = {'R','L','D','U','T','S','B','A','Y','X','W','E','G'};\r\nvoid MovieRecord::dumpPad(EMUFILE* fp, u16 pad)\r\n{\r\n\t//these are mnemonics for each joystick bit.\r\n\t//since we usually use the regular joypad, these will be more helpful.\r\n\t//but any character other than ' ' or '.' should count as a set bit\r\n\t//maybe other input types will need to be encoded another way..\r\n\tfor(int bit=0;bit<13;bit++)\r\n\t{\r\n\t\tint bitmask = (1<<(12-bit));\r\n\t\tchar mnemonic = mnemonics[bit];\r\n\t\t//if the bit is set write the mnemonic\r\n\t\tif(pad & bitmask)\r\n\t\t\tfp->fputc(mnemonic);\r\n\t\telse //otherwise write an unset bit\r\n\t\t\tfp->fputc('.');\r\n\t}\r\n}\r\n\r\n\r\nvoid MovieRecord::parsePad(EMUFILE* fp, u16& pad)\r\n{\r\n\t\r\n\tchar buf[13];\r\n\tfp->fread(buf,13);\r\n\tpad = 0;\r\n\tfor(int i=0;i<13;i++)\r\n\t{\r\n\t\tpad <<= 1;\r\n\t\tpad |= ((buf[i]=='.'||buf[i]==' ')?0:1);\r\n\t}\r\n}\r\n\r\n\r\nvoid MovieRecord::parse(MovieData* md, EMUFILE* fp)\r\n{\r\n\t//by the time we get in here, the initial pipe has already been extracted\r\n\r\n\t//extract the commands\r\n\tcommands = u32DecFromIstream(fp);\r\n\t\r\n\tfp->fgetc(); //eat the pipe\r\n\r\n\tparsePad(fp, pad);\r\n\ttouch.x = u32DecFromIstream(fp);\r\n\ttouch.y = u32DecFromIstream(fp);\r\n\ttouch.touch = u32DecFromIstream(fp);\r\n\t\t\r\n\tfp->fgetc(); //eat the pipe\r\n\r\n\t//should be left at a newline\r\n}\r\n\r\n\r\nvoid MovieRecord::dump(MovieData* md, EMUFILE* fp, int index)\r\n{\r\n\t//dump the misc commands\r\n\t//*os << '|' << setw(1) << (int)commands;\r\n\tfp->fputc('|');\r\n\tputdec<uint8,1,true>(fp,commands);\r\n\r\n\tfp->fputc('|');\r\n\tdumpPad(fp, pad);\r\n\tputdec<u8,3,true>(fp,touch.x); fp->fputc(' ');\r\n\tputdec<u8,3,true>(fp,touch.y); fp->fputc(' ');\r\n\tputdec<u8,1,true>(fp,touch.touch);\r\n\tfp->fputc('|');\r\n\t\r\n\t//each frame is on a new line\r\n\tfp->fputc('\\n');\r\n}\r\n\r\nDateTime FCEUI_MovieGetRTCDefault()\r\n{\r\n\t// compatible with old desmume\r\n\treturn DateTime(2009,1,1,0,0,0);\r\n}\r\n\r\nMovieData::MovieData()\r\n\t: version(MOVIE_VERSION)\r\n\t, emuVersion(EMU_DESMUME_VERSION_NUMERIC())\r\n\t, romChecksum(0)\r\n\t, rerecordCount(0)\r\n\t, binaryFlag(false)\r\n\t, rtcStart(FCEUI_MovieGetRTCDefault())\r\n{\r\n}\r\n\r\nvoid MovieData::truncateAt(int frame)\r\n{\r\n\tif((int)records.size() > frame)\r\n\t\trecords.resize(frame);\r\n}\r\n\r\n\r\nvoid MovieData::installValue(std::string& key, std::string& val)\r\n{\r\n\t//todo - use another config system, or drive this from a little data structure. because this is gross\r\n\tif(key == \"version\")\r\n\t\tinstallInt(val,version);\r\n\telse if(key == \"emuVersion\")\r\n\t\tinstallInt(val,emuVersion);\r\n\telse if(key == \"rerecordCount\")\r\n\t\tinstallInt(val,rerecordCount);\r\n\telse if(key == \"romFilename\")\r\n\t\tromFilename = val;\r\n\telse if(key == \"romChecksum\") {\r\n\t\t// TODO: The current implementation of reading the checksum doesn't work correctly, and can\r\n\t\t// cause crashes when the MovieData object is deallocated. (This is caused by StringToBytes()\r\n\t\t// overrunning romChecksum into romSerial, making romSerial undefined.) Set romChecksum to\r\n\t\t// some dummy value for now to prevent crashing. This is okay, since romChecksum isn't actually\r\n\t\t// used in practice at this time. - rogerman, 2012/08/24\r\n\t\t//StringToBytes(val,&romChecksum,MD5DATA::size);\r\n\t\t\r\n\t\tromChecksum = 0;\r\n\t}\r\n\telse if(key == \"romSerial\")\r\n\t\tromSerial = val;\r\n\telse if(key == \"guid\")\r\n\t\tguid = Desmume_Guid::fromString(val);\r\n\telse if(key == \"rtcStart\") {\r\n\t\t// sloppy format check and parse\r\n\t\tconst char *validFormatStr = \"####-##-##T##:##:##Z\";\r\n\t\tbool validFormat = true;\r\n\t\tfor (int i = 0; validFormatStr[i] != '\\0'; i++) {\r\n\t\t\tif (validFormatStr[i] != val[i] && \r\n\t\t\t\t\t!(validFormatStr[i] == '#' && isdigit(val[i]))) {\r\n\t\t\t\tvalidFormat = false;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (validFormat) {\r\n\t\t\tstruct tm t;\r\n\t\t\tconst char *s = val.data();\r\n\t\t\tint year = atoi(&s[0]);\r\n\t\t\tint mon = atoi(&s[5]);\r\n\t\t\tint day = atoi(&s[8]);\r\n\t\t\tint hour = atoi(&s[11]);\r\n\t\t\tint min = atoi(&s[14]);\r\n\t\t\tint sec = atoi(&s[17]);\r\n\t\t\trtcStart = DateTime(year,mon,day,hour,min,sec);\r\n\t\t}\r\n\t}\r\n\telse if(key == \"rtcStartNew\") {\r\n\t\tDateTime::TryParse(val.c_str(),rtcStart);\r\n\t}\r\n\telse if(key == \"comment\")\r\n\t\tcomments.push_back(mbstowcs(val));\r\n\telse if(key == \"binary\")\r\n\t\tinstallBool(val,binaryFlag);\r\n\telse if(key == \"savestate\")\r\n\t{\r\n\t\tint len = Base64StringToBytesLength(val);\r\n\t\tif(len == -1) len = HexStringToBytesLength(val); // wasn't base64, try hex\r\n\t\tif(len >= 1)\r\n\t\t{\r\n\t\t\tsavestate.resize(len);\r\n\t\t\tStringToBytes(val,&savestate[0],len); // decodes either base64 or hex\r\n\t\t}\r\n\t}\r\n\telse if(key == \"sram\")\r\n\t{\r\n\t\tint len = Base64StringToBytesLength(val);\r\n\t\tif(len == -1) len = HexStringToBytesLength(val); // wasn't base64, try hex\r\n\t\tif(len >= 1)\r\n\t\t{\r\n\t\t\tsram.resize(len);\r\n\t\t\tStringToBytes(val,&sram[0],len); // decodes either base64 or hex\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\nint MovieData::dump(EMUFILE* fp, bool binary)\r\n{\r\n\tint start = fp->ftell();\r\n\tfp->fprintf(\"version %d\\n\", version);\r\n\tfp->fprintf(\"emuVersion %d\\n\", emuVersion);\r\n\tfp->fprintf(\"rerecordCount %d\\n\", rerecordCount);\r\n\r\n\tfp->fprintf(\"romFilename %s\\n\", romFilename.c_str());\r\n\tfp->fprintf(\"romChecksum %s\\n\", u32ToHexString(gameInfo.crc).c_str());\r\n\tfp->fprintf(\"romSerial %s\\n\", romSerial.c_str());\r\n\tfp->fprintf(\"guid %s\\n\", guid.toString().c_str());\r\n\tfp->fprintf(\"useExtBios %d\\n\", CommonSettings.UseExtBIOS?1:0);\r\n\tfp->fprintf(\"advancedTiming %d\\n\", CommonSettings.advanced_timing?1:0);\r\n\r\n\tif(CommonSettings.UseExtBIOS)\r\n\t\tfp->fprintf(\"swiFromBios %d\\n\", CommonSettings.SWIFromBIOS?1:0);\r\n\r\n\tfp->fprintf(\"useExtFirmware %d\\n\", CommonSettings.UseExtFirmware?1:0);\r\n\r\n\tif(CommonSettings.UseExtFirmware) {\r\n\t\tfp->fprintf(\"bootFromFirmware %d\\n\", CommonSettings.BootFromFirmware?1:0);\r\n\t}\r\n\telse {\r\n\t\tchar temp_str[27];\r\n\t\tint i;\r\n\r\n\t\t/* FIXME: harshly only use the lower byte of the UTF-16 character.\r\n\t\t * This would cause strange behaviour if the user could set UTF-16 but\r\n\t\t * they cannot yet.\r\n\t\t */\r\n\t\tfor (i = 0; i < CommonSettings.fw_config.nickname_len; i++) {\r\n\t\t\ttemp_str[i] = CommonSettings.fw_config.nickname[i];\r\n\t\t}\r\n\t\ttemp_str[i] = '\\0';\r\n\t\tfp->fprintf(\"firmNickname %s\\n\", temp_str);\r\n\t\tfor (i = 0; i < CommonSettings.fw_config.message_len; i++) {\r\n\t\t\ttemp_str[i] = CommonSettings.fw_config.message[i];\r\n\t\t}\r\n\t\ttemp_str[i] = '\\0';\r\n\t\tfp->fprintf(\"firmMessage %s\\n\", temp_str);\r\n\t\tfp->fprintf(\"firmFavColour %d\\n\", CommonSettings.fw_config.fav_colour);\r\n\t\tfp->fprintf(\"firmBirthMonth %d\\n\", CommonSettings.fw_config.birth_month);\r\n\t\tfp->fprintf(\"firmBirthDay %d\\n\", CommonSettings.fw_config.birth_day);\r\n\t\tfp->fprintf(\"firmLanguage %d\\n\", CommonSettings.fw_config.language);\r\n\t}\r\n\r\n\tfp->fprintf(\"rtcStartNew %s\\n\", rtcStart.ToString().c_str());\r\n\r\n\tfor(uint32 i=0;i<comments.size();i++)\r\n\t\tfp->fprintf(\"comment %s\\n\", wcstombs(comments[i]).c_str());\r\n\t\r\n\tif(binary)\r\n\t\tfp->fprintf(\"binary 1\\n\");\r\n\r\n\tif(savestate.size() != 0)\r\n\t\tfp->fprintf(\"savestate %s\\n\", BytesToString(&savestate[0],savestate.size()).c_str());\r\n\tif(sram.size() != 0)\r\n\t\tfp->fprintf(\"sram %s\\n\", BytesToString(&sram[0],sram.size()).c_str());\r\n\r\n\tif(binary)\r\n\t{\r\n\t\t//put one | to start the binary dump\r\n\t\tfp->fputc('|');\r\n\t\tfor(int i=0;i<(int)records.size();i++)\r\n\t\t\trecords[i].dumpBinary(this,fp,i);\r\n\t}\r\n\telse\r\n\t\tfor(int i=0;i<(int)records.size();i++)\r\n\t\t\trecords[i].dump(this,fp,i);\r\n\r\n\tint end = fp->ftell();\r\n\treturn end-start;\r\n}\r\n\r\n//yuck... another custom text parser.\r\nbool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader)\r\n{\r\n\t//TODO - start with something different. like 'desmume movie version 1\"\r\n\tint curr = fp->ftell();\r\n\r\n\t//movie must start with \"version 1\"\r\n\tchar buf[9];\r\n\tcurr = fp->ftell();\r\n\tfp->fread(buf,9);\r\n\tfp->fseek(curr, SEEK_SET);\r\n//\tif(fp->fail()) return false;\r\n\tif(memcmp(buf,\"version 1\",9)) \r\n\t\treturn false;\r\n\r\n\tstd::string key,value;\r\n\tenum {\r\n\t\tNEWLINE, KEY, SEPARATOR, VALUE, RECORD, COMMENT\r\n\t} state = NEWLINE;\r\n\tbool bail = false;\r\n\tfor(;;)\r\n\t{\r\n\t\tbool iswhitespace, isrecchar, isnewline;\r\n\t\tint c;\r\n\t\tif(size--<=0) goto bail;\r\n\t\tc = fp->fgetc();\r\n\t\tif(c == -1)\r\n\t\t\tgoto bail;\r\n\t\tiswhitespace = (c==' '||c=='\\t');\r\n\t\tisrecchar = (c=='|');\r\n\t\tisnewline = (c==10||c==13);\r\n\t\tif(isrecchar && movieData.binaryFlag && !stopAfterHeader)\r\n\t\t{\r\n\t\t\tLoadFM2_binarychunk(movieData, fp, size);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tswitch(state)\r\n\t\t{\r\n\t\tcase NEWLINE:\r\n\t\t\tif(isnewline) goto done;\r\n\t\t\tif(iswhitespace) goto done;\r\n\t\t\tif(isrecchar) \r\n\t\t\t\tgoto dorecord;\r\n\t\t\t//must be a key\r\n\t\t\tkey = \"\";\r\n\t\t\tvalue = \"\";\r\n\t\t\tgoto dokey;\r\n\t\t\tbreak;\r\n\t\tcase RECORD:\r\n\t\t\t{\r\n\t\t\t\tdorecord:\r\n\t\t\t\tif (stopAfterHeader) return true;\r\n\t\t\t\tint currcount = movieData.records.size();\r\n\t\t\t\tmovieData.records.resize(currcount+1);\r\n\t\t\t\tint preparse = fp->ftell();\r\n\t\t\t\tmovieData.records[currcount].parse(&movieData, fp);\r\n\t\t\t\tint postparse = fp->ftell();\r\n\t\t\t\tsize -= (postparse-preparse);\r\n\t\t\t\tstate = NEWLINE;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\tcase KEY:\r\n\t\t\tdokey: //dookie\r\n\t\t\tstate = KEY;\r\n\t\t\tif(iswhitespace) goto doseparator;\r\n\t\t\tif(isnewline) goto commit;\r\n\t\t\tkey += c;\r\n\t\t\tbreak;\r\n\t\tcase SEPARATOR:\r\n\t\t\tdoseparator:\r\n\t\t\tstate = SEPARATOR;\r\n\t\t\tif(isnewline) goto commit;\r\n\t\t\tif(!iswhitespace) goto dovalue;\r\n\t\t\tbreak;\r\n\t\tcase VALUE:\r\n\t\t\tdovalue:\r\n\t\t\tstate = VALUE;\r\n\t\t\tif(isnewline) goto commit;\r\n\t\t\tvalue += c;\r\n\t\t\tbreak;\r\n\t\tcase COMMENT:\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tgoto done;\r\n\r\n\t\tbail:\r\n\t\tbail = true;\r\n\t\tif(state == VALUE) goto commit;\r\n\t\tgoto done;\r\n\t\tcommit:\r\n\t\tmovieData.installValue(key,value);\r\n\t\tstate = NEWLINE;\r\n\t\tdone: ;\r\n\t\tif(bail) break;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\nstatic void closeRecordingMovie()\r\n{\r\n\tif(osRecordingMovie)\r\n\t{\r\n\t\tdelete osRecordingMovie;\r\n\t\tosRecordingMovie = 0;\r\n\t}\r\n}\r\n\r\n/// Stop movie playback.\r\nstatic void StopPlayback()\r\n{\r\n\tdriver->USR_InfoMessage(\"Movie playback stopped.\");\r\n\tmovieMode = MOVIEMODE_INACTIVE;\r\n}\r\n\r\n/// Stop movie playback without closing the movie.\r\nstatic void FinishPlayback()\r\n{\r\n\tdriver->USR_InfoMessage(\"Movie finished playing.\");\r\n\tmovieMode = MOVIEMODE_FINISHED;\r\n}\r\n\r\n\r\n/// Stop movie recording\r\nstatic void StopRecording()\r\n{\r\n\tdriver->USR_InfoMessage(\"Movie recording stopped.\");\r\n\tmovieMode = MOVIEMODE_INACTIVE;\r\n\t\r\n\tcloseRecordingMovie();\r\n}\r\n\r\n\r\n\r\nvoid FCEUI_StopMovie()\r\n{\r\n\tif(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED)\r\n\t\tStopPlayback();\r\n\telse if(movieMode == MOVIEMODE_RECORD)\r\n\t\tStopRecording();\r\n\r\n\tcurMovieFilename[0] = 0;\r\n\tfreshMovie = false;\r\n}\r\n\r\n\r\n//begin playing an existing movie\r\nconst char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe)\r\n{\r\n\t//if(!tasedit && !FCEU_IsValidUI(FCEUI_PLAYMOVIE))\r\n\t//\treturn;\r\n\r\n\t// FIXME: name==null indicates to BROWSE to retrieve fname from user (or stdin if that's impossible),\r\n\t// when called from movie_play\r\n\tassert(fname);\r\n\tif(!fname)\r\n\t\treturn \"LoadMovie doesn't support browsing yet\";\r\n\r\n\t//mbg 6/10/08 - we used to call StopMovie here, but that cleared curMovieFilename and gave us crashes...\r\n\tif(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED)\r\n\t\tStopPlayback();\r\n\telse if(movieMode == MOVIEMODE_RECORD)\r\n\t\tStopRecording();\r\n\t//--------------\r\n\r\n\tcurrMovieData = MovieData();\r\n\t\r\n\tstrcpy(curMovieFilename, fname);\r\n\t//FCEUFILE *fp = FCEU_fopen(fname,0,\"rb\",0);\r\n\t//if (!fp) return;\r\n\t//if(fp->isArchive() && !_read_only) {\r\n\t//\tFCEU_PrintError(\"Cannot open a movie in read+write from an archive.\");\r\n\t//\treturn;\r\n\t//}\r\n\r\n\t//LoadFM2(currMovieData, fp->stream, INT_MAX, false);\r\n\t\r\n\t\r\n\tbool loadedfm2 = false;\r\n\tbool opened = false;\r\n//\t{\r\n\t\tEMUFILE* fp = new EMUFILE_FILE(fname, \"rb\");\r\n//\t\tif(fs.is_open())\r\n//\t\t{\r\n\t\t\tloadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false);\r\n\t\t\topened = true;\r\n//\t\t}\r\n//\t\tfs.close();\r\n\t\tdelete fp;\r\n//\t}\r\n\tif(!opened)\r\n\t{\r\n\t\t// for some reason fs.open doesn't work, it has to be a whole new fstream object\r\n//\t\tfstream fs (fname, std::ios_base::in);\r\n\t\tloadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false);\r\n//\t\tfs.close();\r\n\t\tdelete fp;\r\n\t}\r\n\r\n\tif(!loadedfm2)\r\n\t\treturn \"failed to load movie\";\r\n\r\n\t//TODO\r\n\t//fully reload the game to reinitialize everything before playing any movie\r\n\t//poweron(true);\r\n\r\n\t// reset firmware (some games can write to it)\r\n\tif (CommonSettings.UseExtFirmware == false)\r\n\t{\r\n\t\tNDS_CreateDummyFirmware(&CommonSettings.fw_config);\r\n\t}\r\n\r\n\tNDS_Reset();\r\n\r\n\t////WE NEED TO LOAD A SAVESTATE\r\n\t//if(currMovieData.savestate.size() != 0)\r\n\t//{\r\n\t//\tbool success = MovieData::loadSavestateFrom(&currMovieData.savestate);\r\n\t//\tif(!success) return;\r\n\t//}\r\n\tlagframecounter=0;\r\n\tLagFrameFlag=0;\r\n\tlastLag=0;\r\n\tTotalLagFrames=0;\r\n\r\n\tcurrFrameCounter = 0;\r\n\tpauseframe = _pauseframe;\r\n\tmovie_readonly = _read_only;\r\n\tmovieMode = MOVIEMODE_PLAY;\r\n\tcurrRerecordCount = currMovieData.rerecordCount;\r\n\tMMU_new.backupDevice.movie_mode();\r\n\tif(currMovieData.sram.size() != 0)\r\n\t{\r\n\t\tbool success = MovieData::loadSramFrom(&currMovieData.sram);\r\n\t\tif(!success) return \"failed to load sram\";\r\n\t}\r\n\tfreshMovie = true;\r\n\tClearAutoHold();\r\n\r\n\tif(movie_readonly)\r\n\t\tdriver->USR_InfoMessage(\"Replay started Read-Only.\");\r\n\telse\r\n\t\tdriver->USR_InfoMessage(\"Replay started Read+Write.\");\r\n\r\n\treturn NULL; // success\r\n}\r\n\r\nstatic void openRecordingMovie(const char* fname)\r\n{\r\n\t//osRecordingMovie = FCEUD_UTF8_fstream(fname, \"wb\");\r\n\tosRecordingMovie = new EMUFILE_FILE(fname, \"wb\");\r\n\t/*if(!osRecordingMovie)\r\n\t\tFCEU_PrintError(\"Error opening movie output file: %s\",fname);*/\r\n\tstrcpy(curMovieFilename, fname);\r\n}\r\n\r\nbool MovieData::loadSramFrom(std::vector<u8>* buf)\r\n{\r\n\tEMUFILE_MEMORY ms(buf);\r\n\tMMU_new.backupDevice.load_movie(&ms);\r\n\treturn true;\r\n}\r\n\r\n//static bool FCEUSS_SaveSRAM(EMUFILE* outstream, const std::string& fname)\r\n//{\r\n//\t//a temp memory stream. we'll dump some data here and then compress\r\n//\t//TODO - support dumping directly without compressing to save a buffer copy\r\n////TODO\r\n///*\tmemorystream ms;\r\n//\r\n//\t//size it\r\n//\tFILE * fp = fopen( fname.c_str(), \"r\" );\r\n//\tif(!fp)\r\n//\t\treturn 0;\r\n//\t\r\n//\tfseek( fp, 0, SEEK_END );\r\n//\tint size = ftell(fp);\r\n//\tfclose(fp);\r\n//\r\n//\tfilebuf fb;\r\n//\tfb.open (fname.c_str(), ios::in | ios::binary);//ios::in\r\n//\tistream is(&fb);\r\n//\r\n//\tchar *buffer = new char[size];\r\n//\r\n//\tis.read(buffer, size);\r\n//\r\n//\toutstream->write((char*)buffer,size);\r\n//\r\n//\tfb.close();\r\n//*/\r\n//\r\n//\r\n//\treturn true;\r\n//}\r\n\r\n//begin recording a new movie\r\n//TODO - BUG - the record-from-another-savestate doesnt work.\r\nvoid FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart)\r\n{\r\n\t//if(!FCEU_IsValidUI(FCEUI_RECORDMOVIE))\r\n\t//\treturn;\r\n\r\n\tassert(fname);\r\n\r\n\tFCEUI_StopMovie();\r\n\r\n\topenRecordingMovie(fname);\r\n\r\n\tcurrFrameCounter = 0;\r\n\t//LagCounterReset();\r\n\r\n\tcurrMovieData = MovieData();\r\n\tcurrMovieData.guid.newGuid();\r\n\r\n\tif(author != L\"\") currMovieData.comments.push_back(L\"author \" + author);\r\n\tcurrMovieData.romChecksum = gameInfo.crc;\r\n\tcurrMovieData.romSerial = gameInfo.ROMserial;\r\n\tcurrMovieData.romFilename = path.GetRomName();\r\n\tcurrMovieData.rtcStart = rtcstart;\r\n\r\n\t// reset firmware (some games can write to it)\r\n\tif (CommonSettings.UseExtFirmware == false)\r\n\t{\r\n\t\tNDS_CreateDummyFirmware(&CommonSettings.fw_config);\r\n\t}\r\n\r\n\tNDS_Reset();\r\n\r\n\t//todo ?\r\n\t//poweron(true);\r\n\t//else\r\n\t//\tMovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION);\r\n\r\n\tif(flag == 1)\r\n\t\tEMUFILE::readAllBytes(&currMovieData.sram, sramfname);\r\n\r\n\t//we are going to go ahead and dump the header. from now on we will only be appending frames\r\n\tcurrMovieData.dump(osRecordingMovie, false);\r\n\r\n\tcurrFrameCounter=0;\r\n\tlagframecounter=0;\r\n\tLagFrameFlag=0;\r\n\tlastLag=0;\r\n\tTotalLagFrames=0;\r\n\r\n\tmovieMode = MOVIEMODE_RECORD;\r\n\tmovie_readonly = false;\r\n\tcurrRerecordCount = 0;\r\n\tMMU_new.backupDevice.movie_mode();\r\n\r\n\tif(currMovieData.sram.size() != 0)\r\n\t{\r\n\t\tbool success = MovieData::loadSramFrom(&currMovieData.sram);\r\n\t\tif(!success) return;\r\n\t}\r\n\r\n\tdriver->USR_InfoMessage(\"Movie recording started.\");\r\n}\r\n\r\n\r\n //the main interaction point between the emulator and the movie system.\r\n //either dumps the current joystick state or loads one state from the movie.\r\n //deprecated, should use the two functions it has been split into directly\r\n void FCEUMOV_AddInputState()\r\n {\r\n\t FCEUMOV_HandlePlayback();\r\n\t FCEUMOV_HandleRecording();\r\n }\r\n\r\n void FCEUMOV_HandlePlayback()\r\n {\r\n\t if(movieMode == MOVIEMODE_PLAY)\r\n\t {\r\n\t\t //stop when we run out of frames\r\n\t\t if(currFrameCounter == (int)currMovieData.records.size())\r\n\t\t {\r\n\t\t\t FinishPlayback();\r\n\t\t }\r\n\t\t else\r\n\t\t {\r\n\t\t\t UserInput& input = NDS_getProcessingUserInput();\r\n\r\n\t\t\t MovieRecord* mr = &currMovieData.records[currFrameCounter];\r\n\r\n\t\t\t if(mr->command_microphone()) input.mic.micButtonPressed = 1;\r\n\t\t\t else input.mic.micButtonPressed = 0;\r\n\r\n\t\t\t if(mr->command_reset()) NDS_Reset();\r\n\r\n\t\t\t if(mr->command_lid()) input.buttons.F = true;\r\n\t\t\t else input.buttons.F = false;\r\n\r\n\t\t\t u16 pad = mr->pad;\r\n\t\t\t input.buttons.R = (((pad>>12)&1)!=0);\r\n\t\t\t input.buttons.L = (((pad>>11)&1)!=0);\r\n\t\t\t input.buttons.D = (((pad>>10)&1)!=0);\r\n\t\t\t input.buttons.U = (((pad>>9)&1)!=0);\r\n\t\t\t input.buttons.T = (((pad>>8)&1)!=0);\r\n\t\t\t input.buttons.S = (((pad>>7)&1)!=0);\r\n\t\t\t input.buttons.B = (((pad>>6)&1)!=0);\r\n\t\t\t input.buttons.A = (((pad>>5)&1)!=0);\r\n\t\t\t input.buttons.Y = (((pad>>4)&1)!=0);\r\n\t\t\t input.buttons.X = (((pad>>3)&1)!=0);\r\n\t\t\t input.buttons.W = (((pad>>2)&1)!=0);\r\n\t\t\t input.buttons.E = (((pad>>1)&1)!=0);\r\n\t\t\t input.buttons.G = (((pad>>0)&1)!=0);\r\n\r\n\t\t\t input.touch.touchX = mr->touch.x << 4;\r\n\t\t\t input.touch.touchY = mr->touch.y << 4;\r\n\t\t\t input.touch.isTouch = mr->touch.touch != 0;\r\n\t\t }\r\n\r\n\t\t //if we are on the last frame, then pause the emulator if the player requested it\r\n\t\t if(currFrameCounter == (int)currMovieData.records.size()-1)\r\n\t\t {\r\n\t\t\t /*if(FCEUD_PauseAfterPlayback())\r\n\t\t\t {\r\n\t\t\t FCEUI_ToggleEmulationPause();\r\n\t\t\t }*/\r\n\t\t }\r\n\r\n\t\t //pause the movie at a specified frame \r\n\t\t //if(FCEUMOV_ShouldPause() && FCEUI_EmulationPaused()==0)\r\n\t\t //{\r\n\t\t //\tFCEUI_ToggleEmulationPause();\r\n\t\t //\tFCEU_DispMessage(\"Paused at specified movie frame\");\r\n\t\t //}\r\n\r\n\t\t // it's apparently un-threadsafe to do this here\r\n\t\t // (causes crazy flickering in other OSD elements, at least)\r\n\t\t // and it's also pretty annoying,\r\n\t\t // and the framecounter display already conveys this info as well.\r\n\t\t // so, I'm disabling this, at least for now.\r\n//\t\t osd->addFixed(180, 176, \"%s\", \"Playback\");\r\n\r\n\t }\r\n }\r\n\r\n void FCEUMOV_HandleRecording()\r\n {\r\n\t if(movieMode == MOVIEMODE_RECORD)\r\n\t {\r\n\t\t const UserInput& input = NDS_getFinalUserInput();\r\n\r\n\t\t MovieRecord mr;\r\n\r\n\t\t mr.commands = 0;\r\n\r\n\t\t if(input.mic.micButtonPressed == 1)\r\n\t\t\t mr.commands = MOVIECMD_MIC;\r\n\r\n\t\t mr.pad = nds.pad;\r\n\r\n\t\t if(input.buttons.F)\r\n\t\t\t mr.commands = MOVIECMD_LID;\r\n\r\n\t\t if(movie_reset_command) {\r\n\t\t\t mr.commands = MOVIECMD_RESET;\r\n\t\t\t movie_reset_command = false;\r\n\t\t }\r\n\r\n\t\t mr.touch.touch = input.touch.isTouch ? 1 : 0;\r\n\t\t mr.touch.x = input.touch.isTouch ? input.touch.touchX >> 4 : 0;\r\n\t\t mr.touch.y = input.touch.isTouch ? input.touch.touchY >> 4 : 0;\r\n\r\n\t\t assert(mr.touch.touch || (!mr.touch.x && !mr.touch.y));\r\n\t\t //assert(nds.touchX == input.touch.touchX && nds.touchY == input.touch.touchY);\r\n\t\t //assert((mr.touch.x << 4) == nds.touchX && (mr.touch.y << 4) == nds.touchY);\r\n\r\n\t\t mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size());\r\n\t\t currMovieData.records.push_back(mr);\r\n\r\n\t\t // it's apparently un-threadsafe to do this here\r\n\t\t // (causes crazy flickering in other OSD elements, at least)\r\n\t\t // and it's also pretty annoying,\r\n\t\t // and the framecounter display already conveys this info as well.\r\n\t\t // so, I'm disabling this, at least for now.\r\n//\t\t osd->addFixed(180, 176, \"%s\", \"Recording\");\r\n\t }\r\n\r\n\t /*extern uint8 joy[4];\r\n\t memcpy(&cur_input_display,joy,4);*/\r\n }\r\n\r\n\r\n//TODO \r\nstatic void FCEUMOV_AddCommand(int cmd)\r\n{\r\n\t// do nothing if not recording a movie\r\n\tif(movieMode != MOVIEMODE_RECORD)\r\n\t\treturn;\r\n\t\r\n\t//printf(\"%d\\n\",cmd);\r\n\r\n\t//MBG TODO BIG TODO TODO TODO\r\n\t//DoEncode((cmd>>3)&0x3,cmd&0x7,1);\r\n}\r\n\r\n//little endian 4-byte cookies\r\nstatic const int kMOVI = 0x49564F4D;\r\nstatic const int kNOMO = 0x4F4D4F4E;\r\n\r\nvoid mov_savestate(EMUFILE* fp)\r\n{\r\n\t//we are supposed to dump the movie data into the savestate\r\n\t//if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)\r\n\t//\treturn currMovieData.dump(os, true);\r\n\t//else return 0;\r\n\tif(movieMode != MOVIEMODE_INACTIVE)\r\n\t{\r\n\t\twrite32le(kMOVI,fp);\r\n\t\tcurrMovieData.dump(fp, true);\r\n\t}\r\n\telse\r\n\t{\r\n\t\twrite32le(kNOMO,fp);\r\n\t}\r\n}\r\n\r\n\r\nbool CheckTimelines(MovieData& stateMovie, MovieData& currMovie, int& errorFr)\r\n{\r\n\tbool isInTimeline = true;\r\n\tint length;\r\n\r\n\t//First check, make sure we are checking is for a post-movie savestate, we just want to adjust the length for now, we will handle this situation later in another function\r\n\tif (currFrameCounter <= stateMovie.getNumRecords())\r\n\t\tlength = currFrameCounter;\t\t\t\t\t\t\t//Note: currFrameCounter corresponds to the framecounter in the savestate\r\n\telse if (currFrameCounter > currMovie.getNumRecords())  //Now that we know the length of the records of the savestate we plan to load, let's match the length against the movie\r\n\t\tlength = currMovie.getNumRecords();\t\t\t\t    //If length < currMovie records then this is a \"future\" event from the current movie, againt we will handle this situation later, we just want to find the right number of frames to compare\r\n\telse\r\n\t\tlength = stateMovie.getNumRecords();\r\n\r\n\tfor (int x = 0; x < length; x++)\r\n\t{\r\n\t\tif (!stateMovie.records[x].Compare(currMovie.records[x]))\r\n\t\t{\r\n\t\t\tisInTimeline = false;\r\n\t\t\terrorFr = x;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn isInTimeline;\r\n}\r\n\r\n\r\nstatic bool load_successful;\r\n\r\nbool mov_loadstate(EMUFILE* fp, int size)\r\n{\r\n\tload_successful = false;\r\n\r\n\tu32 cookie;\r\n\tif(read32le(&cookie,fp) != 1) return false;\r\n\tif(cookie == kNOMO)\r\n\t{\r\n\t\tif(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)\r\n\t\t\tFinishPlayback();\r\n\t\treturn true;\r\n\t}\r\n\telse if(cookie != kMOVI)\r\n\t\treturn false;\r\n\r\n\tsize -= 4;\r\n\r\n\tif (!movie_readonly && autoMovieBackup && freshMovie) //If auto-backup is on, movie has not been altered this session and the movie is in read+write mode\r\n\t{\r\n\t\tFCEUI_MakeBackupMovie(false);\t//Backup the movie before the contents get altered, but do not display messages\t\t\t\t\t\t  \r\n\t}\r\n\r\n\t//a little rule: cant load states in read+write mode with a movie from an archive.\r\n\t//so we are going to switch it to readonly mode in that case\r\n//\tif(!movie_readonly \r\n//\t\t//*&& FCEU_isFileInArchive(curMovieFilename)*/\r\n//\t\t) {\r\n//\t\tFCEU_PrintError(\"Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only.\");\r\n//\t\tmovie_readonly = true;\r\n//\t}\r\n\r\n\tMovieData tempMovieData = MovieData();\r\n\t//int curr = fp->ftell();\r\n\tif(!LoadFM2(tempMovieData, fp, size, false)) {\r\n\t\t\r\n\t//\tis->seekg((uint32)curr+size);\r\n\t/*\textern bool FCEU_state_loading_old_format;\r\n\t\tif(FCEU_state_loading_old_format) {\r\n\t\t\tif(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_RECORD) {\r\n\t\t\t\tFCEUI_StopMovie();\t\t\t\r\n\t\t\t\tFCEU_PrintError(\"You have tried to use an old savestate while playing a movie. This is unsupported (since the old savestate has old-format movie data in it which can't be converted on the fly)\");\r\n\t\t\t}\r\n\t\t}*/\r\n\t\treturn false;\r\n\t}\r\n\r\n\t//----------------\r\n\t//complex TAS logic for loadstate\r\n\t//fully conforms to the savestate logic documented in the Laws of TAS\r\n\t//http://tasvideos.org/LawsOfTAS/OnSavestates.html\r\n\t//----------------\r\n\t\t\r\n\t/*\r\n\tPlayback or Recording + Read-only\r\n\r\n    * Check that GUID of movie and savestate-movie must match or else error\r\n          o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway.\r\n                + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted if user has backup savstates enabled else stop movie\r\n    * Check that movie and savestate-movie are in same timeline. If not then this is a wrong timeline error.\r\n          o on error: a message informing that the savestate doesn't belong to this movie\r\n                + failstate: loadstate attempt canceled, movie can resume as if not attempted if user has backup savestates enabled else stop movie\r\n    * Check that savestate-movie is not greater than movie. If not then this is a future event error and is not allowed in read-only\r\n          o on error: message informing that the savestate is from a frame after the last frame of the movie\r\n                + failstate - loadstate attempt cancelled, movie can resume if user has backup savesattes enabled, else stop movie\r\n    * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate\r\n          o on post-movie: See post-movie event section. \r\n    * All error checks have passed, state will be loaded\r\n    * Movie contained in the savestate will be discarded\r\n    * Movie is now in Playback mode \r\n\r\n\tPlayback, Recording + Read+write\r\n\r\n    * Check that GUID of movie and savestate-movie must match or else error\r\n          o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway.\r\n                + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted (stop movie if resume fails)canceled, movie can resume if backup savestates enabled else stopmovie\r\n    * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate\r\n          o on post-movie: See post-movie event section. \r\n    * savestate passed all error checks and will now be loaded in its entirety and replace movie (note: there will be no truncation yet)\r\n    * current framecount will be set to savestate framecount\r\n    * on the next frame of input, movie will be truncated to framecount\r\n          o (note: savestate-movie can be a future event of the movie timeline, or a completely new timeline and it is still allowed) \r\n    * Rerecord count of movie will be incremented\r\n    * Movie is now in record mode \r\n\r\n\tPost-movie savestate event\r\n\r\n    * Whan a savestate is loaded and is determined that the savestate-movie length is less than the savestate framecount then it is a post-movie savestate. These occur when a savestate was made during Movie Finished mode. \r\n\t* If read+write, the entire savestate movie will be loaded and replace current movie.\r\n    * If read-only, the savestate movie will be discarded\r\n    * Mode will be switched to Move Finished\r\n    * Savestate will be loaded\r\n    * Current framecount changes to savestate framecount\r\n    * User will have control of input as if Movie inactive mode \r\n\t*/\r\n\r\n\r\n\tif(movieMode != MOVIEMODE_INACTIVE)\r\n\t{\r\n\t\t//handle moviefile mismatch\r\n\t\tif(tempMovieData.guid != currMovieData.guid)\r\n\t\t{\r\n\t\t\t//mbg 8/18/08 - this code  can be used to turn the error message into an OK/CANCEL\r\n\t\t\t#if defined(WIN32) && !defined(WXPORT)\r\n\t\t\t\tstd::string msg = \"There is a mismatch between savestate's movie and current movie.\\ncurrent: \" + currMovieData.guid.toString() + \"\\nsavestate: \" + tempMovieData.guid.toString() + \"\\n\\nThis means that you have loaded a savestate belonging to a different movie than the one you are playing now.\\n\\nContinue loading this savestate anyway?\";\r\n\t\t\t\tint result = MessageBox(MainWindow->getHWnd(),msg.c_str(),\"Error loading savestate\",MB_OKCANCEL);\r\n\t\t\t\tif(result == IDCANCEL)\r\n\t\t\t\t\treturn false;\r\n\t\t\t#else\r\n\t\t\t\tFCEU_PrintError(\"Mismatch between savestate's movie and current movie.\\ncurrent: %s\\nsavestate: %s\\n\",currMovieData.guid.toString().c_str(),tempMovieData.guid.toString().c_str());\r\n\t\t\t\treturn false;\r\n\t\t\t#endif\r\n\t\t}\r\n\r\n\t\tcloseRecordingMovie();\r\n\r\n\t\tif(!movie_readonly)\r\n\t\t{\r\n\t\t\tcurrMovieData = tempMovieData;\r\n\t\t\tcurrMovieData.rerecordCount = currRerecordCount;\r\n\t\t}\r\n\r\n\t\tif(currFrameCounter > (int)currMovieData.records.size())\r\n\t\t{\r\n\t\t\t// if the frame counter is longer than our current movie,\r\n\t\t\t// switch to \"finished\" mode.\r\n\t\t\t// this is a mode that behaves like \"inactive\"\r\n\t\t\t// except it permits switching to play/record by loading an earlier savestate.\r\n\t\t\t// (and we continue to store the finished movie in savestates made while finished)\r\n\t\t\tosd->setLineColor(255,0,0); // let's make the text red too to hopefully catch the user's attention a bit.\r\n\t\t\tFinishPlayback();\r\n\t\t\tosd->setLineColor(255,255,255);\r\n\r\n\t\t\t//FCEU_PrintError(\"Savestate is from a frame (%d) after the final frame in the movie (%d). This is not permitted.\", currFrameCounter, currMovieData.records.size()-1);\r\n\t\t\t//return false;\r\n\t\t}\r\n\t\telse if(movie_readonly)\r\n\t\t{\r\n\t\t\t//-------------------------------------------------------------\r\n\t\t\t//this code would reload the movie from disk. allegedly it is helpful to hexers, but\r\n\t\t\t//it is way too slow with dsm format. so it is only here as a reminder, and in case someone\r\n\t\t\t//wants to play with it\r\n\t\t\t//-------------------------------------------------------------\r\n\t\t\t//{\r\n\t\t\t//\tfstream fs (curMovieFilename);\r\n\t\t\t//\tif(!LoadFM2(tempMovieData, &fs, INT_MAX, false))\r\n\t\t\t//\t{\r\n\t\t\t//\t\tFCEU_PrintError(\"Failed to reload DSM after loading savestate\");\r\n\t\t\t//\t}\r\n\t\t\t//\tfs.close();\r\n\t\t\t//\tcurrMovieData = tempMovieData;\r\n\t\t\t//}\r\n\t\t\t//-------------------------------------------------------------\r\n\r\n\t\t\tmovieMode = MOVIEMODE_PLAY;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t//\t#ifdef _S9XLUA_H\r\n\t\t//\tif(!FCEU_LuaRerecordCountSkip())\r\n\t\t\t\tcurrRerecordCount++;\r\n\t\t//\t#endif\r\n\t\t\t\r\n\t\t\tcurrMovieData.rerecordCount = currRerecordCount;\r\n\t\t\tcurrMovieData.truncateAt(currFrameCounter);\r\n\r\n\t\t\topenRecordingMovie(curMovieFilename);\r\n\t\t\tif(!osRecordingMovie)\r\n\t\t\t{\r\n\t\t\t   osd->setLineColor(255, 0, 0);\r\n\t\t\t   osd->addLine(\"Can't save movie file!\");\r\n\t\t\t}\r\n\r\n\t\t\t//printf(\"DUMPING MOVIE: %d FRAMES\\n\",currMovieData.records.size());\r\n\t\t\tcurrMovieData.dump(osRecordingMovie, false);\r\n\t\t\tmovieMode = MOVIEMODE_RECORD;\r\n\t\t}\r\n\t}\r\n\t\r\n\tload_successful = true;\r\n\tfreshMovie = false;\r\n\r\n\treturn true;\r\n}\r\n\r\nstatic void FCEUMOV_PreLoad(void)\r\n{\r\n\tload_successful=0;\r\n}\r\n\r\nstatic bool FCEUMOV_PostLoad(void)\r\n{\r\n\tif(movieMode == MOVIEMODE_INACTIVE)\r\n\t\treturn true;\r\n\telse\r\n\t\treturn load_successful;\r\n}\r\n\r\n\r\nbool FCEUI_MovieGetInfo(EMUFILE* fp, MOVIE_INFO& info, bool skipFrameCount)\r\n{\r\n\t//MovieData md;\r\n\t//if(!LoadFM2(md, fp, INT_MAX, skipFrameCount))\r\n\t//\treturn false;\r\n\t//\r\n\t//info.movie_version = md.version;\r\n\t//info.poweron = md.savestate.size()==0;\r\n\t//info.pal = md.palFlag;\r\n\t//info.nosynchack = true;\r\n\t//info.num_frames = md.records.size();\r\n\t//info.md5_of_rom_used = md.romChecksum;\r\n\t//info.emu_version_used = md.emuVersion;\r\n\t//info.name_of_rom_used = md.romFilename;\r\n\t//info.rerecord_count = md.rerecordCount;\r\n\t//info.comments = md.comments;\r\n\r\n\treturn true;\r\n}\r\n\r\nbool MovieRecord::parseBinary(MovieData* md, EMUFILE* fp)\r\n{\r\n\tcommands=fp->fgetc();\r\n\tfp->fread((char *) &pad, sizeof pad);\r\n\tfp->fread((char *) &touch.x, sizeof touch.x);\r\n\tfp->fread((char *) &touch.y, sizeof touch.y);\r\n\tfp->fread((char *) &touch.touch, sizeof touch.touch);\r\n\treturn true;\r\n}\r\n\r\n\r\nvoid MovieRecord::dumpBinary(MovieData* md, EMUFILE* fp, int index)\r\n{\r\n\tfp->fputc(md->records[index].commands);\r\n\tfp->fwrite((char *) &md->records[index].pad, sizeof md->records[index].pad);\r\n\tfp->fwrite((char *) &md->records[index].touch.x, sizeof md->records[index].touch.x);\r\n\tfp->fwrite((char *) &md->records[index].touch.y, sizeof md->records[index].touch.y);\r\n\tfp->fwrite((char *) &md->records[index].touch.touch, sizeof md->records[index].touch.touch);\r\n}\r\n\r\nvoid LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size)\r\n{\r\n\tint recordsize = 1; //1 for the command\r\n\r\n\trecordsize = 6;\r\n\r\n\tassert(size%6==0);\r\n\r\n\t//find out how much remains in the file\r\n\tint curr = fp->ftell();\r\n\tfp->fseek(0,SEEK_END);\r\n\tint end = fp->ftell();\r\n\tint flen = end-curr;\r\n\tfp->fseek(curr,SEEK_SET);\r\n\r\n\t//the amount todo is the min of the limiting size we received and the remaining contents of the file\r\n\tint todo = std::min(size, flen);\r\n\r\n\tint numRecords = todo/recordsize;\r\n\t//printf(\"LOADED MOVIE: %d records; currFrameCounter: %d\\n\",numRecords,currFrameCounter);\r\n\tmovieData.records.resize(numRecords);\r\n\tfor(int i=0;i<numRecords;i++)\r\n\t{\r\n\t\tmovieData.records[i].parseBinary(&movieData,fp);\r\n\t}\r\n}\r\n\r\n#include <sstream>\r\n\r\nstatic bool CheckFileExists(const char* filename)\r\n{\r\n\t//This function simply checks to see if the given filename exists\r\n\tstring checkFilename; \r\n\r\n\tif (filename)\r\n\t\tcheckFilename = filename;\r\n\t\t\t\r\n\t//Check if this filename exists\r\n\tFILE* fp = fopen(checkFilename.c_str(), \"rb\");\r\n\t\t\r\n\tif (!fp)\r\n\t{\r\n\t\treturn false; \r\n\t}\r\n\telse\r\n\t{\r\n\t\tfclose(fp);\r\n\t\treturn true; \r\n\t}\r\n}\r\n\r\nvoid FCEUI_MakeBackupMovie(bool dispMessage)\r\n{\r\n\t//This function generates backup movie files\r\n\tstring currentFn;\t\t\t\t\t//Current movie fillename\r\n\tstring backupFn;\t\t\t\t\t//Target backup filename\r\n\tstring tempFn;\t\t\t\t\t\t//temp used in back filename creation\r\n\tstringstream stream;\r\n\tint x;\t\t\t\t\t\t\t\t//Temp variable for string manip\r\n\tbool exist = false;\t\t\t\t\t//Used to test if filename exists\r\n\tbool overflow = false;\t\t\t\t//Used for special situation when backup numbering exceeds limit\r\n\r\n\tcurrentFn = curMovieFilename;\t\t//Get current moviefilename\r\n\tbackupFn = curMovieFilename;\t\t//Make backup filename the same as current moviefilename\r\n\tx = backupFn.find_last_of(\".\");\t\t //Find file extension\r\n\tbackupFn = backupFn.substr(0,x);\t//Remove extension\r\n\ttempFn = backupFn;\t\t\t\t\t//Store the filename at this point\r\n\tfor (unsigned int backNum=0;backNum<999;backNum++) //999 = arbituary limit to backup files\r\n\t{\r\n\t\tstream.str(\"\");\t\t\t\t\t //Clear stream\r\n\t\tif (backNum > 99)\r\n\t\t\tstream << \"-\" << backNum;\t //assign backNum to stream\r\n\t\t else if (backNum <= 99 && backNum >= 10)\r\n\t\t\tstream << \"-0\" << backNum;      //Make it 010, etc if two digits\r\n\t\telse\r\n\t\t\tstream << \"-00\" << backNum;\t //Make it 001, etc if single digit\r\n\t\tbackupFn.append(stream.str());\t //add number to bak filename\r\n\t\tbackupFn.append(\".bak\");\t\t //add extension\r\n\r\n\t\texist = CheckFileExists(backupFn.c_str());\t//Check if file exists\r\n\t\t\r\n\t\tif (!exist) \r\n\t\t\tbreak;\t\t\t\t\t\t//Yeah yeah, I should use a do loop or something\r\n\t\telse\r\n\t\t{\r\n\t\t\tbackupFn = tempFn;\t\t\t//Before we loop again, reset the filename\r\n\t\t\t\r\n\t\t\tif (backNum == 999)\t\t\t//If 999 exists, we have overflowed, let's handle that\r\n\t\t\t{\r\n\t\t\t\tbackupFn.append(\"-001.bak\"); //We are going to simply overwrite 001.bak\r\n\t\t\t\toverflow = true;\t\t//Flag that we have exceeded limit\r\n\t\t\t\tbreak;\t\t\t\t\t//Just in case\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tMovieData md = currMovieData;\t\t\t\t\t\t\t\t//Get current movie data\r\n\tEMUFILE* outf = new EMUFILE_FILE(backupFn.c_str(),\"wb\"); //FCEUD_UTF8_fstream(backupFn, \"wb\");\t//open/create file\r\n\tmd.dump(outf,false);\t\t\t\t\t\t\t\t\t\t//dump movie data\r\n\tdelete outf;\t\t\t\t\t\t\t\t\t\t\t\t//clean up, delete file object\r\n\t\r\n\t//TODO, decide if fstream successfully opened the file and print error message if it doesn't\r\n\r\n\tif (dispMessage)\t//If we should inform the user \r\n\t{\r\n//\t\tif (overflow)\r\n//\t\t\tFCEUI_DispMessage(\"Backup overflow, overwriting %s\",backupFn.c_str()); //Inform user of overflow\r\n//\t\telse\r\n//\t\t\tFCEUI_DispMessage(\"%s created\",backupFn.c_str()); //Inform user of backup filename\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/movie.h",
    "content": "/*\n\tCopyright 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef __MOVIE_H_\n#define __MOVIE_H_\n\n#include <vector>\n#include <map>\n#include <string>\n#include <stdlib.h>\n#include <time.h>\n#include \"emufile.h\"\n\n#include \"utils/datetime.h\"\n#include \"utils/guid.h\"\n#include \"utils/md5.h\"\n\n#ifdef ANDROID\n#include \"utils/xstring.h\"\n#endif\n\ntypedef struct\n{\n\tint movie_version;\t\t\t\t\t// version of the movie format in the file\n\tu32 num_frames;\n\tu32 rerecord_count;\n\tbool poweron;\n\tu32 emu_version_used;\n\tMD5DATA md5_of_rom_used;\n\tstd::string name_of_rom_used;\n\n\tstd::vector<std::wstring> comments;\n\tstd::vector<std::string> subtitles;\n} MOVIE_INFO;\n\nenum EMOVIEMODE\n{\n\tMOVIEMODE_INACTIVE = 0,\n\tMOVIEMODE_RECORD = 1,\n\tMOVIEMODE_PLAY = 2,\n\tMOVIEMODE_FINISHED = 3,\n};\n\nenum EMOVIECMD\n{\n\tMOVIECMD_MIC = 1,\n\tMOVIECMD_RESET = 2,\n\tMOVIECMD_LID = 4,\n};\n\n//RLDUTSBAYXWEG\n\nclass MovieData;\nclass MovieRecord\n{\n\npublic:\n\tu16 pad;\n\t\n\tunion {\n\t\tstruct {\n\t\t\tu8 x, y;\n\t\t\tu8 touch;\n\t\t};\n\n\t\tu32 padding;\n\t} touch;\n\t\n\t//misc commands like reset, etc.\n\t//small now to save space; we might need to support more commands later.\n\t//the disk format will support up to 64bit if necessary\n\tuint8 commands;\n\tbool command_reset() { return (commands&MOVIECMD_RESET)!=0; }\n\tbool command_microphone() { return (commands&MOVIECMD_MIC)!=0; }\n\tbool command_lid() { return (commands&MOVIECMD_LID)!=0; }\n\n\tvoid toggleBit(int bit)\n\t{\n\t\tpad ^= mask(bit);\n\t}\n\n\tvoid setBit(int bit)\n\t{\n\t\tpad |= mask(bit);\n\t}\n\n\tvoid clearBit(int bit)\n\t{\n\t\tpad &= ~mask(bit);\n\t}\n\n\tvoid setBitValue(int bit, bool val)\n\t{\n\t\tif(val) setBit(bit);\n\t\telse clearBit(bit);\n\t}\n\n\tbool checkBit(int bit)\n\t{\n\t\treturn (pad & mask(bit))!=0;\n\t}\n\n\tbool Compare(MovieRecord& compareRec);\n\tvoid clear();\n\t\n\tvoid parse(MovieData* md, EMUFILE* fp);\n\tbool parseBinary(MovieData* md, EMUFILE* fp);\n\tvoid dump(MovieData* md, EMUFILE* fp, int index);\n\tvoid dumpBinary(MovieData* md, EMUFILE* fp, int index);\n\tvoid parsePad(EMUFILE* fp, u16& pad);\n\tvoid dumpPad(EMUFILE* fp, u16 pad);\n\t\n\tstatic const char mnemonics[13];\n\nprivate:\n\tint mask(int bit) { return 1<<bit; }\n};\n\n\nclass MovieData\n{\npublic:\n\tMovieData();\n\t\n\n\tint version;\n\tint emuVersion;\n\t//todo - somehow force mutual exclusion for poweron and reset (with an error in the parser)\n\t\n\tu32 romChecksum;\n\tstd::string romSerial;\n\tstd::string romFilename;\n\tstd::vector<u8> savestate;\n\tstd::vector<u8> sram;\n\tstd::vector<MovieRecord> records;\n\tstd::vector<std::wstring> comments;\n\t\n\tint rerecordCount;\n\tDesmume_Guid guid;\n\n\tDateTime rtcStart;\n\n\t//was the frame data stored in binary?\n\tbool binaryFlag;\n\n\tint getNumRecords() { return records.size(); }\n\n\tclass TDictionary : public std::map<std::string,std::string>\n\t{\n\tpublic:\n\t\tbool containsKey(std::string key)\n\t\t{\n\t\t\treturn find(key) != end();\n\t\t}\n\n\t\tvoid tryInstallBool(std::string key, bool& val)\n\t\t{\n\t\t\tif(containsKey(key))\n\t\t\t\tval = atoi(operator [](key).c_str())!=0;\n\t\t}\n\n\t\tvoid tryInstallString(std::string key, std::string& val)\n\t\t{\n\t\t\tif(containsKey(key))\n\t\t\t\tval = operator [](key);\n\t\t}\n\n\t\tvoid tryInstallInt(std::string key, int& val)\n\t\t{\n\t\t\tif(containsKey(key))\n\t\t\t\tval = atoi(operator [](key).c_str());\n\t\t}\n\n\t};\n\n\tvoid truncateAt(int frame);\n\tvoid installValue(std::string& key, std::string& val);\n\tint dump(EMUFILE* fp, bool binary);\n\tvoid clearRecordRange(int start, int len);\n\tvoid insertEmpty(int at, int frames);\n\t\n\tstatic bool loadSavestateFrom(std::vector<u8>* buf);\n\tstatic void dumpSavestateTo(std::vector<u8>* buf, int compressionLevel);\n\n\tstatic bool loadSramFrom(std::vector<u8>* buf);\n\t//void TryDumpIncremental();\n\nprivate:\n\tvoid installInt(std::string& val, int& var)\n\t{\n\t\tvar = atoi(val.c_str());\n\t}\n\n\tvoid installBool(std::string& val, bool& var)\n\t{\n\t\tvar = atoi(val.c_str())!=0;\n\t}\n};\n\nextern int currFrameCounter;\nextern EMOVIEMODE movieMode;\t\t//adelikat: main needs this for frame counter display\nextern MovieData currMovieData;\t\t//adelikat: main needs this for frame counter display\n\nextern bool movie_reset_command;\n\nbool FCEUI_MovieGetInfo(EMUFILE* fp, MOVIE_INFO& info, bool skipFrameCount);\nvoid FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart);\nconst char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe); // returns NULL on success, errmsg on failure\nvoid FCEUI_StopMovie();\nvoid FCEUMOV_AddInputState();\nvoid FCEUMOV_HandlePlayback();\nvoid FCEUMOV_HandleRecording();\nvoid mov_savestate(EMUFILE* fp);\nbool mov_loadstate(EMUFILE* fp, int size);\nvoid LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size);\nbool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader);\nextern bool movie_readonly;\nextern bool ShowInputDisplay;\nvoid FCEUI_MakeBackupMovie(bool dispMessage);\nDateTime FCEUI_MovieGetRTCDefault();\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/movie_r7b.cpp",
    "content": "/*\n\tCopyright 2008-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define WIN32_LEAN_AND_MEAN\n#include <assert.h>\n#include <limits.h>\n#include <ctype.h>\n#include <time.h>\n#include \"utils/guid.h\"\n#include \"utils/xstring.h\"\n#include \"utils/datetime.h\"\n#include \"movie.h\"\n#include \"NDSSystem.h\"\n#include \"readwrite.h\"\n#include \"debug.h\"\n#include \"rtc.h\"\n#include \"common.h\"\n#include \"mic.h\"\n#include \"version.h\"\n#include \"GPU_osd.h\"\n#include \"path.h\"\n#include \"emufile.h\"\n\nusing namespace std;\nbool freshMovie = false;\t  //True when a movie loads, false when movie is altered.  Used to determine if a movie has been altered since opening\nbool autoMovieBackup = true;\n\n#define FCEU_PrintError LOG\n\n#define MOVIE_VERSION 1\n\n#ifdef WIN32\n#include \".\\windows\\main.h\"\n#endif\n\n//----movie engine main state\n\nEMOVIEMODE movieMode = MOVIEMODE_INACTIVE;\n\n//this should not be set unless we are in MOVIEMODE_RECORD!\nEMUFILE* osRecordingMovie = 0;\n\nint currFrameCounter;\nuint32 cur_input_display = 0;\nint pauseframe = -1;\nbool movie_readonly = true;\n\nchar curMovieFilename[512] = {0};\nMovieData currMovieData;\nint currRerecordCount;\nbool movie_reset_command = false;\n//--------------\n\n\nvoid MovieData::clearRecordRange(int start, int len)\n{\n\tfor(int i=0;i<len;i++)\n\t\trecords[i+start].clear();\n}\n\nvoid MovieData::insertEmpty(int at, int frames)\n{\n\tif(at == -1) \n\t{\n\t\tint currcount = records.size();\n\t\trecords.resize(records.size()+frames);\n\t\tclearRecordRange(currcount,frames);\n\t}\n\telse\n\t{\n\t\trecords.insert(records.begin()+at,frames,MovieRecord());\n\t\tclearRecordRange(at,frames);\n\t}\n}\n\n\n\nvoid MovieRecord::clear()\n{ \n\tpad = 0;\n\tcommands = 0;\n\ttouch.padding = 0;\n}\n\n\nbool MovieRecord::Compare(MovieRecord& compareRec)\n{\n\t//Check pad\n\tif (this->pad != compareRec.pad) \n\t\treturn false;\n\n\t//Check Stylus\n\tif (this->touch.padding != compareRec.touch.padding) return false;\n\tif (this->touch.touch != compareRec.touch.touch) return false;\n\tif (this->touch.x != compareRec.touch.x) return false;\n\tif (this->touch.y != compareRec.touch.y) return false;\n\n\t//Check comamnds\n\t//if new commands are ever recordable, they need to be added here if we go with this method\n\tif(this->command_reset() != compareRec.command_reset()) return false;\n\tif(this->command_microphone() != compareRec.command_microphone()) return false;\n\tif(this->command_lid() != compareRec.command_lid()) return false;\n\t\n\treturn true;\n}\n\nconst char MovieRecord::mnemonics[13] = {'R','L','D','U','T','S','B','A','Y','X','W','E','G'};\nvoid MovieRecord::dumpPad(EMUFILE* fp, u16 pad)\n{\n\t//these are mnemonics for each joystick bit.\n\t//since we usually use the regular joypad, these will be more helpful.\n\t//but any character other than ' ' or '.' should count as a set bit\n\t//maybe other input types will need to be encoded another way..\n\tfor(int bit=0;bit<13;bit++)\n\t{\n\t\tint bitmask = (1<<(12-bit));\n\t\tchar mnemonic = mnemonics[bit];\n\t\t//if the bit is set write the mnemonic\n\t\tif(pad & bitmask)\n\t\t\tfp->fputc(mnemonic);\n\t\telse //otherwise write an unset bit\n\t\t\tfp->fputc('.');\n\t}\n}\n\n\nvoid MovieRecord::parsePad(EMUFILE* fp, u16& pad)\n{\n\t\n\tchar buf[13];\n\tfp->fread(buf,13);\n\tpad = 0;\n\tfor(int i=0;i<13;i++)\n\t{\n\t\tpad <<= 1;\n\t\tpad |= ((buf[i]=='.'||buf[i]==' ')?0:1);\n\t}\n}\n\n\nvoid MovieRecord::parse(MovieData* md, EMUFILE* fp)\n{\n\t//by the time we get in here, the initial pipe has already been extracted\n\n\t//extract the commands\n\tcommands = u32DecFromIstream(fp);\n\t\n\tfp->fgetc(); //eat the pipe\n\n\tparsePad(fp, pad);\n\ttouch.x = u32DecFromIstream(fp);\n\ttouch.y = u32DecFromIstream(fp);\n\ttouch.touch = u32DecFromIstream(fp);\n\t\t\n\tfp->fgetc(); //eat the pipe\n\n\t//should be left at a newline\n}\n\n\nvoid MovieRecord::dump(MovieData* md, EMUFILE* fp, int index)\n{\n\t//dump the misc commands\n\t//*os << '|' << setw(1) << (int)commands;\n\tfp->fputc('|');\n\tputdec<uint8,1,true>(fp,commands);\n\n\tfp->fputc('|');\n\tdumpPad(fp, pad);\n\tputdec<u8,3,true>(fp,touch.x); fp->fputc(' ');\n\tputdec<u8,3,true>(fp,touch.y); fp->fputc(' ');\n\tputdec<u8,1,true>(fp,touch.touch);\n\tfp->fputc('|');\n\t\n\t//each frame is on a new line\n\tfp->fputc('\\n');\n}\n\nDateTime FCEUI_MovieGetRTCDefault()\n{\n\t// compatible with old desmume\n\treturn DateTime(2009,1,1,0,0,0);\n}\n\nMovieData::MovieData()\n\t: version(MOVIE_VERSION)\n\t, emuVersion(EMU_DESMUME_VERSION_NUMERIC())\n\t, romChecksum(0)\n\t, rerecordCount(0)\n\t, binaryFlag(false)\n\t, rtcStart(FCEUI_MovieGetRTCDefault())\n{\n}\n\nvoid MovieData::truncateAt(int frame)\n{\n\tif((int)records.size() > frame)\n\t\trecords.resize(frame);\n}\n\n\nvoid MovieData::installValue(std::string& key, std::string& val)\n{\n\t//todo - use another config system, or drive this from a little data structure. because this is gross\n\tif(key == \"version\")\n\t\tinstallInt(val,version);\n\telse if(key == \"emuVersion\")\n\t\tinstallInt(val,emuVersion);\n\telse if(key == \"rerecordCount\")\n\t\tinstallInt(val,rerecordCount);\n\telse if(key == \"romFilename\")\n\t\tromFilename = val;\n\telse if(key == \"romChecksum\")\n\t\tStringToBytes(val,&romChecksum,MD5DATA::size);\n\telse if(key == \"romSerial\")\n\t\tromSerial = val;\n\telse if(key == \"guid\")\n\t\tguid = Desmume_Guid::fromString(val);\n\telse if(key == \"rtcStart\") {\n\t\t// sloppy format check and parse\n\t\tconst char *validFormatStr = \"####-##-##T##:##:##Z\";\n\t\tbool validFormat = true;\n\t\tfor (int i = 0; validFormatStr[i] != '\\0'; i++) {\n\t\t\tif (validFormatStr[i] != val[i] && \n\t\t\t\t\t!(validFormatStr[i] == '#' && isdigit(val[i]))) {\n\t\t\t\tvalidFormat = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (validFormat) {\n\t\t\tstruct tm t;\n\t\t\tconst char *s = val.data();\n\t\t\tint year = atoi(&s[0]);\n\t\t\tint mon = atoi(&s[5]);\n\t\t\tint day = atoi(&s[8]);\n\t\t\tint hour = atoi(&s[11]);\n\t\t\tint min = atoi(&s[14]);\n\t\t\tint sec = atoi(&s[17]);\n\t\t\trtcStart = DateTime(year,mon,day,hour,min,sec);\n\t\t}\n\t}\n\telse if(key == \"rtcStartNew\") {\n\t\tDateTime::TryParse(val.c_str(),rtcStart);\n\t}\n\telse if(key == \"comment\")\n\t\tcomments.push_back(mbstowcs(val));\n\telse if(key == \"binary\")\n\t\tinstallBool(val,binaryFlag);\n\telse if(key == \"savestate\")\n\t{\n\t\tint len = Base64StringToBytesLength(val);\n\t\tif(len == -1) len = HexStringToBytesLength(val); // wasn't base64, try hex\n\t\tif(len >= 1)\n\t\t{\n\t\t\tsavestate.resize(len);\n\t\t\tStringToBytes(val,&savestate[0],len); // decodes either base64 or hex\n\t\t}\n\t}\n\telse if(key == \"sram\")\n\t{\n\t\tint len = Base64StringToBytesLength(val);\n\t\tif(len == -1) len = HexStringToBytesLength(val); // wasn't base64, try hex\n\t\tif(len >= 1)\n\t\t{\n\t\t\tsram.resize(len);\n\t\t\tStringToBytes(val,&sram[0],len); // decodes either base64 or hex\n\t\t}\n\t}\n}\n\n\nint MovieData::dump(EMUFILE* fp, bool binary)\n{\n\tint start = fp->ftell();\n\tfp->fprintf(\"version %d\\n\", version);\n\tfp->fprintf(\"emuVersion %d\\n\", emuVersion);\n\tfp->fprintf(\"rerecordCount %d\\n\", rerecordCount);\n\n\tfp->fprintf(\"romFilename %s\\n\", romFilename.c_str());\n\tfp->fprintf(\"romChecksum %s\\n\", u32ToHexString(gameInfo.crc).c_str());\n\tfp->fprintf(\"romSerial %s\\n\", romSerial.c_str());\n\tfp->fprintf(\"guid %s\\n\", guid.toString().c_str());\n\tfp->fprintf(\"useExtBios %d\\n\", CommonSettings.UseExtBIOS?1:0);\n\tfp->fprintf(\"advancedTiming %d\\n\", CommonSettings.advanced_timing?1:0);\n\n\tif(CommonSettings.UseExtBIOS)\n\t\tfp->fprintf(\"swiFromBios %d\\n\", CommonSettings.SWIFromBIOS?1:0);\n\n\tfp->fprintf(\"useExtFirmware %d\\n\", CommonSettings.UseExtFirmware?1:0);\n\n\tif(CommonSettings.UseExtFirmware) {\n\t\tfp->fprintf(\"bootFromFirmware %d\\n\", CommonSettings.BootFromFirmware?1:0);\n\t}\n\telse {\n\t\tchar temp_str[27];\n\t\tint i;\n\n\t\t/* FIXME: harshly only use the lower byte of the UTF-16 character.\n\t\t * This would cause strange behaviour if the user could set UTF-16 but\n\t\t * they cannot yet.\n\t\t */\n\t\tfor (i = 0; i < CommonSettings.InternalFirmConf.nickname_len; i++) {\n\t\t\ttemp_str[i] = CommonSettings.InternalFirmConf.nickname[i];\n\t\t}\n\t\ttemp_str[i] = '\\0';\n\t\tfp->fprintf(\"firmNickname %s\\n\", temp_str);\n\t\tfor (i = 0; i < CommonSettings.InternalFirmConf.message_len; i++) {\n\t\t\ttemp_str[i] = CommonSettings.InternalFirmConf.message[i];\n\t\t}\n\t\ttemp_str[i] = '\\0';\n\t\tfp->fprintf(\"firmMessage %s\\n\", temp_str);\n\t\tfp->fprintf(\"firmFavColour %d\\n\", CommonSettings.InternalFirmConf.fav_colour);\n\t\tfp->fprintf(\"firmBirthMonth %d\\n\", CommonSettings.InternalFirmConf.birth_month);\n\t\tfp->fprintf(\"firmBirthDay %d\\n\", CommonSettings.InternalFirmConf.birth_day);\n\t\tfp->fprintf(\"firmLanguage %d\\n\", CommonSettings.InternalFirmConf.language);\n\t}\n\n\tfp->fprintf(\"rtcStartNew %s\\n\", rtcStart.ToString().c_str());\n\n\tfor(uint32 i=0;i<comments.size();i++)\n\t\tfp->fprintf(\"comment %s\\n\", wcstombs(comments[i]).c_str());\n\t\n\tif(binary)\n\t\tfp->fprintf(\"binary 1\\n\");\n\n\tif(savestate.size() != 0)\n\t\tfp->fprintf(\"savestate %s\\n\", BytesToString(&savestate[0],savestate.size()).c_str());\n\tif(sram.size() != 0)\n\t\tfp->fprintf(\"sram %s\\n\", BytesToString(&sram[0],sram.size()).c_str());\n\n\tif(binary)\n\t{\n\t\t//put one | to start the binary dump\n\t\tfp->fputc('|');\n\t\tfor(int i=0;i<(int)records.size();i++)\n\t\t\trecords[i].dumpBinary(this,fp,i);\n\t}\n\telse\n\t\tfor(int i=0;i<(int)records.size();i++)\n\t\t\trecords[i].dump(this,fp,i);\n\n\tint end = fp->ftell();\n\treturn end-start;\n}\n\n//yuck... another custom text parser.\nbool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader)\n{\n\t//TODO - start with something different. like 'desmume movie version 1\"\n\tint curr = fp->ftell();\n\n\t//movie must start with \"version 1\"\n\tchar buf[9];\n\tcurr = fp->ftell();\n\tfp->fread(buf,9);\n\tfp->fseek(curr, SEEK_SET);\n//\tif(fp->fail()) return false;\n\tif(memcmp(buf,\"version 1\",9)) \n\t\treturn false;\n\n\tstd::string key,value;\n\tenum {\n\t\tNEWLINE, KEY, SEPARATOR, VALUE, RECORD, COMMENT\n\t} state = NEWLINE;\n\tbool bail = false;\n\tfor(;;)\n\t{\n\t\tbool iswhitespace, isrecchar, isnewline;\n\t\tint c;\n\t\tif(size--<=0) goto bail;\n\t\tc = fp->fgetc();\n\t\tif(c == -1)\n\t\t\tgoto bail;\n\t\tiswhitespace = (c==' '||c=='\\t');\n\t\tisrecchar = (c=='|');\n\t\tisnewline = (c==10||c==13);\n\t\tif(isrecchar && movieData.binaryFlag && !stopAfterHeader)\n\t\t{\n\t\t\tLoadFM2_binarychunk(movieData, fp, size);\n\t\t\treturn true;\n\t\t}\n\t\tswitch(state)\n\t\t{\n\t\tcase NEWLINE:\n\t\t\tif(isnewline) goto done;\n\t\t\tif(iswhitespace) goto done;\n\t\t\tif(isrecchar) \n\t\t\t\tgoto dorecord;\n\t\t\t//must be a key\n\t\t\tkey = \"\";\n\t\t\tvalue = \"\";\n\t\t\tgoto dokey;\n\t\t\tbreak;\n\t\tcase RECORD:\n\t\t\t{\n\t\t\t\tdorecord:\n\t\t\t\tif (stopAfterHeader) return true;\n\t\t\t\tint currcount = movieData.records.size();\n\t\t\t\tmovieData.records.resize(currcount+1);\n\t\t\t\tint preparse = fp->ftell();\n\t\t\t\tmovieData.records[currcount].parse(&movieData, fp);\n\t\t\t\tint postparse = fp->ftell();\n\t\t\t\tsize -= (postparse-preparse);\n\t\t\t\tstate = NEWLINE;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\tcase KEY:\n\t\t\tdokey: //dookie\n\t\t\tstate = KEY;\n\t\t\tif(iswhitespace) goto doseparator;\n\t\t\tif(isnewline) goto commit;\n\t\t\tkey += c;\n\t\t\tbreak;\n\t\tcase SEPARATOR:\n\t\t\tdoseparator:\n\t\t\tstate = SEPARATOR;\n\t\t\tif(isnewline) goto commit;\n\t\t\tif(!iswhitespace) goto dovalue;\n\t\t\tbreak;\n\t\tcase VALUE:\n\t\t\tdovalue:\n\t\t\tstate = VALUE;\n\t\t\tif(isnewline) goto commit;\n\t\t\tvalue += c;\n\t\t\tbreak;\n\t\tcase COMMENT:\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tgoto done;\n\n\t\tbail:\n\t\tbail = true;\n\t\tif(state == VALUE) goto commit;\n\t\tgoto done;\n\t\tcommit:\n\t\tmovieData.installValue(key,value);\n\t\tstate = NEWLINE;\n\t\tdone: ;\n\t\tif(bail) break;\n\t}\n\n\treturn true;\n}\n\n\nstatic void closeRecordingMovie()\n{\n\tif(osRecordingMovie)\n\t{\n\t\tdelete osRecordingMovie;\n\t\tosRecordingMovie = 0;\n\t}\n}\n\n/// Stop movie playback.\nstatic void StopPlayback()\n{\n\tdriver->USR_InfoMessage(\"Movie playback stopped.\");\n\tmovieMode = MOVIEMODE_INACTIVE;\n}\n\n/// Stop movie playback without closing the movie.\nstatic void FinishPlayback()\n{\n\tdriver->USR_InfoMessage(\"Movie finished playing.\");\n\tmovieMode = MOVIEMODE_FINISHED;\n}\n\n\n/// Stop movie recording\nstatic void StopRecording()\n{\n\tdriver->USR_InfoMessage(\"Movie recording stopped.\");\n\tmovieMode = MOVIEMODE_INACTIVE;\n\t\n\tcloseRecordingMovie();\n}\n\n\n\nvoid FCEUI_StopMovie()\n{\n\tif(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED)\n\t\tStopPlayback();\n\telse if(movieMode == MOVIEMODE_RECORD)\n\t\tStopRecording();\n\n\tcurMovieFilename[0] = 0;\n\tfreshMovie = false;\n}\n\n\n//begin playing an existing movie\nconst char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe)\n{\n\t//if(!tasedit && !FCEU_IsValidUI(FCEUI_PLAYMOVIE))\n\t//\treturn;\n\n\t// FIXME: name==null indicates to BROWSE to retrieve fname from user (or stdin if that's impossible),\n\t// when called from movie_play\n\tassert(fname);\n\tif(!fname)\n\t\treturn \"LoadMovie doesn't support browsing yet\";\n\n\t//mbg 6/10/08 - we used to call StopMovie here, but that cleared curMovieFilename and gave us crashes...\n\tif(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED)\n\t\tStopPlayback();\n\telse if(movieMode == MOVIEMODE_RECORD)\n\t\tStopRecording();\n\t//--------------\n\n\tcurrMovieData = MovieData();\n\t\n\tstrcpy(curMovieFilename, fname);\n\t//FCEUFILE *fp = FCEU_fopen(fname,0,\"rb\",0);\n\t//if (!fp) return;\n\t//if(fp->isArchive() && !_read_only) {\n\t//\tFCEU_PrintError(\"Cannot open a movie in read+write from an archive.\");\n\t//\treturn;\n\t//}\n\n\t//LoadFM2(currMovieData, fp->stream, INT_MAX, false);\n\t\n\t\n\tbool loadedfm2 = false;\n\tbool opened = false;\n//\t{\n\t\tEMUFILE* fp = new EMUFILE_FILE(fname, \"rb\");\n//\t\tif(fs.is_open())\n//\t\t{\n\t\t\tloadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false);\n\t\t\topened = true;\n//\t\t}\n//\t\tfs.close();\n\t\tdelete fp;\n//\t}\n\tif(!opened)\n\t{\n\t\t// for some reason fs.open doesn't work, it has to be a whole new fstream object\n//\t\tfstream fs (fname, std::ios_base::in);\n\t\tloadedfm2 = LoadFM2(currMovieData, fp, INT_MAX, false);\n//\t\tfs.close();\n\t\tdelete fp;\n\t}\n\n\tif(!loadedfm2)\n\t\treturn \"failed to load movie\";\n\n\t//TODO\n\t//fully reload the game to reinitialize everything before playing any movie\n\t//poweron(true);\n\n\tNDS_Reset();\n\n\t////WE NEED TO LOAD A SAVESTATE\n\t//if(currMovieData.savestate.size() != 0)\n\t//{\n\t//\tbool success = MovieData::loadSavestateFrom(&currMovieData.savestate);\n\t//\tif(!success) return;\n\t//}\n\tlagframecounter=0;\n\tLagFrameFlag=0;\n\tlastLag=0;\n\tTotalLagFrames=0;\n\n\tcurrFrameCounter = 0;\n\tpauseframe = _pauseframe;\n\tmovie_readonly = _read_only;\n\tmovieMode = MOVIEMODE_PLAY;\n\tcurrRerecordCount = currMovieData.rerecordCount;\n\tMMU_new.backupDevice.movie_mode();\n\tif(currMovieData.sram.size() != 0)\n\t{\n\t\tbool success = MovieData::loadSramFrom(&currMovieData.sram);\n\t\tif(!success) return \"failed to load sram\";\n\t}\n\tfreshMovie = true;\n\tClearAutoHold();\n\n\tif(movie_readonly)\n\t\tdriver->USR_InfoMessage(\"Replay started Read-Only.\");\n\telse\n\t\tdriver->USR_InfoMessage(\"Replay started Read+Write.\");\n\n\treturn NULL; // success\n}\n\nstatic void openRecordingMovie(const char* fname)\n{\n\t//osRecordingMovie = FCEUD_UTF8_fstream(fname, \"wb\");\n\tosRecordingMovie = new EMUFILE_FILE(fname, \"wb\");\n\t/*if(!osRecordingMovie)\n\t\tFCEU_PrintError(\"Error opening movie output file: %s\",fname);*/\n\tstrcpy(curMovieFilename, fname);\n}\n\nbool MovieData::loadSramFrom(std::vector<u8>* buf)\n{\n\tEMUFILE_MEMORY ms(buf);\n\tMMU_new.backupDevice.load_movie(&ms);\n\treturn true;\n}\n\n//static bool FCEUSS_SaveSRAM(EMUFILE* outstream, const std::string& fname)\n//{\n//\t//a temp memory stream. we'll dump some data here and then compress\n//\t//TODO - support dumping directly without compressing to save a buffer copy\n////TODO\n///*\tmemorystream ms;\n//\n//\t//size it\n//\tFILE * fp = fopen( fname.c_str(), \"r\" );\n//\tif(!fp)\n//\t\treturn 0;\n//\t\n//\tfseek( fp, 0, SEEK_END );\n//\tint size = ftell(fp);\n//\tfclose(fp);\n//\n//\tfilebuf fb;\n//\tfb.open (fname.c_str(), ios::in | ios::binary);//ios::in\n//\tistream is(&fb);\n//\n//\tchar *buffer = new char[size];\n//\n//\tis.read(buffer, size);\n//\n//\toutstream->write((char*)buffer,size);\n//\n//\tfb.close();\n//*/\n//\n//\n//\treturn true;\n//}\n\n//begin recording a new movie\n//TODO - BUG - the record-from-another-savestate doesnt work.\nvoid FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart)\n{\n\t//if(!FCEU_IsValidUI(FCEUI_RECORDMOVIE))\n\t//\treturn;\n\n\tassert(fname);\n\n\tFCEUI_StopMovie();\n\n\topenRecordingMovie(fname);\n\n\tcurrFrameCounter = 0;\n\t//LagCounterReset();\n\n\tcurrMovieData = MovieData();\n\tcurrMovieData.guid.newGuid();\n\n\tif(author != WSTR(L\"\")) currMovieData.comments.push_back(WSTR(L\"author \") + author);\n\tcurrMovieData.romChecksum = gameInfo.crc;\n\tcurrMovieData.romSerial = gameInfo.ROMserial;\n\tcurrMovieData.romFilename = path.GetRomName();\n\tcurrMovieData.rtcStart = rtcstart;\n\n\tNDS_Reset();\n\n\t//todo ?\n\t//poweron(true);\n\t//else\n\t//\tMovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION);\n\n\tif(flag == 1)\n\t\tEMUFILE::readAllBytes(&currMovieData.sram, sramfname);\n\n\t//we are going to go ahead and dump the header. from now on we will only be appending frames\n\tcurrMovieData.dump(osRecordingMovie, false);\n\n\tcurrFrameCounter=0;\n\tlagframecounter=0;\n\tLagFrameFlag=0;\n\tlastLag=0;\n\tTotalLagFrames=0;\n\n\tmovieMode = MOVIEMODE_RECORD;\n\tmovie_readonly = false;\n\tcurrRerecordCount = 0;\n\tMMU_new.backupDevice.movie_mode();\n\n\tif(currMovieData.sram.size() != 0)\n\t{\n\t\tbool success = MovieData::loadSramFrom(&currMovieData.sram);\n\t\tif(!success) return;\n\t}\n\n\tdriver->USR_InfoMessage(\"Movie recording started.\");\n}\n\n\n //the main interaction point between the emulator and the movie system.\n //either dumps the current joystick state or loads one state from the movie.\n //deprecated, should use the two functions it has been split into directly\n void FCEUMOV_AddInputState()\n {\n\t FCEUMOV_HandlePlayback();\n\t FCEUMOV_HandleRecording();\n }\n\n void FCEUMOV_HandlePlayback()\n {\n\t if(movieMode == MOVIEMODE_PLAY)\n\t {\n\t\t //stop when we run out of frames\n\t\t if(currFrameCounter == (int)currMovieData.records.size())\n\t\t {\n\t\t\t FinishPlayback();\n\t\t }\n\t\t else\n\t\t {\n\t\t\t UserInput& input = NDS_getProcessingUserInput();\n\n\t\t\t MovieRecord* mr = &currMovieData.records[currFrameCounter];\n\n\t\t\t if(mr->command_microphone()) input.mic.micButtonPressed = 1;\n\t\t\t else input.mic.micButtonPressed = 0;\n\n\t\t\t if(mr->command_reset()) NDS_Reset();\n\n\t\t\t if(mr->command_lid()) input.buttons.F = true;\n\t\t\t else input.buttons.F = false;\n\n\t\t\t u16 pad = mr->pad;\n\t\t\t input.buttons.R = (((pad>>12)&1)!=0);\n\t\t\t input.buttons.L = (((pad>>11)&1)!=0);\n\t\t\t input.buttons.D = (((pad>>10)&1)!=0);\n\t\t\t input.buttons.U = (((pad>>9)&1)!=0);\n\t\t\t input.buttons.T = (((pad>>8)&1)!=0);\n\t\t\t input.buttons.S = (((pad>>7)&1)!=0);\n\t\t\t input.buttons.B = (((pad>>6)&1)!=0);\n\t\t\t input.buttons.A = (((pad>>5)&1)!=0);\n\t\t\t input.buttons.Y = (((pad>>4)&1)!=0);\n\t\t\t input.buttons.X = (((pad>>3)&1)!=0);\n\t\t\t input.buttons.W = (((pad>>2)&1)!=0);\n\t\t\t input.buttons.E = (((pad>>1)&1)!=0);\n\t\t\t input.buttons.G = (((pad>>0)&1)!=0);\n\n\t\t\t input.touch.touchX = mr->touch.x << 4;\n\t\t\t input.touch.touchY = mr->touch.y << 4;\n\t\t\t input.touch.isTouch = mr->touch.touch != 0;\n\t\t }\n\n\t\t //if we are on the last frame, then pause the emulator if the player requested it\n\t\t if(currFrameCounter == (int)currMovieData.records.size()-1)\n\t\t {\n\t\t\t /*if(FCEUD_PauseAfterPlayback())\n\t\t\t {\n\t\t\t FCEUI_ToggleEmulationPause();\n\t\t\t }*/\n\t\t }\n\n\t\t //pause the movie at a specified frame \n\t\t //if(FCEUMOV_ShouldPause() && FCEUI_EmulationPaused()==0)\n\t\t //{\n\t\t //\tFCEUI_ToggleEmulationPause();\n\t\t //\tFCEU_DispMessage(\"Paused at specified movie frame\");\n\t\t //}\n\n\t\t // it's apparently un-threadsafe to do this here\n\t\t // (causes crazy flickering in other OSD elements, at least)\n\t\t // and it's also pretty annoying,\n\t\t // and the framecounter display already conveys this info as well.\n\t\t // so, I'm disabling this, at least for now.\n//\t\t osd->addFixed(180, 176, \"%s\", \"Playback\");\n\n\t }\n }\n\n void FCEUMOV_HandleRecording()\n {\n\t if(movieMode == MOVIEMODE_RECORD)\n\t {\n\t\t const UserInput& input = NDS_getFinalUserInput();\n\n\t\t MovieRecord mr;\n\n\t\t mr.commands = 0;\n\n\t\t if(input.mic.micButtonPressed == 1)\n\t\t\t mr.commands = MOVIECMD_MIC;\n\n\t\t mr.pad = nds.pad;\n\n\t\t if(input.buttons.F)\n\t\t\t mr.commands = MOVIECMD_LID;\n\n\t\t if(movie_reset_command) {\n\t\t\t mr.commands = MOVIECMD_RESET;\n\t\t\t movie_reset_command = false;\n\t\t }\n\n\t\t mr.touch.touch = input.touch.isTouch ? 1 : 0;\n\t\t mr.touch.x = input.touch.isTouch ? input.touch.touchX >> 4 : 0;\n\t\t mr.touch.y = input.touch.isTouch ? input.touch.touchY >> 4 : 0;\n\n\t\t assert(mr.touch.touch || (!mr.touch.x && !mr.touch.y));\n\t\t //assert(nds.touchX == input.touch.touchX && nds.touchY == input.touch.touchY);\n\t\t //assert((mr.touch.x << 4) == nds.touchX && (mr.touch.y << 4) == nds.touchY);\n\n\t\t mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size());\n\t\t currMovieData.records.push_back(mr);\n\n\t\t // it's apparently un-threadsafe to do this here\n\t\t // (causes crazy flickering in other OSD elements, at least)\n\t\t // and it's also pretty annoying,\n\t\t // and the framecounter display already conveys this info as well.\n\t\t // so, I'm disabling this, at least for now.\n//\t\t osd->addFixed(180, 176, \"%s\", \"Recording\");\n\t }\n\n\t /*extern uint8 joy[4];\n\t memcpy(&cur_input_display,joy,4);*/\n }\n\n\n//TODO \nstatic void FCEUMOV_AddCommand(int cmd)\n{\n\t// do nothing if not recording a movie\n\tif(movieMode != MOVIEMODE_RECORD)\n\t\treturn;\n\t\n\t//printf(\"%d\\n\",cmd);\n\n\t//MBG TODO BIG TODO TODO TODO\n\t//DoEncode((cmd>>3)&0x3,cmd&0x7,1);\n}\n\n//little endian 4-byte cookies\nstatic const int kMOVI = 0x49564F4D;\nstatic const int kNOMO = 0x4F4D4F4E;\n\nvoid mov_savestate(EMUFILE* fp)\n{\n\t//we are supposed to dump the movie data into the savestate\n\t//if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)\n\t//\treturn currMovieData.dump(os, true);\n\t//else return 0;\n\tif(movieMode != MOVIEMODE_INACTIVE)\n\t{\n\t\twrite32le(kMOVI,fp);\n\t\tcurrMovieData.dump(fp, true);\n\t}\n\telse\n\t{\n\t\twrite32le(kNOMO,fp);\n\t}\n}\n\n\nbool CheckTimelines(MovieData& stateMovie, MovieData& currMovie, int& errorFr)\n{\n\tbool isInTimeline = true;\n\tint length;\n\n\t//First check, make sure we are checking is for a post-movie savestate, we just want to adjust the length for now, we will handle this situation later in another function\n\tif (currFrameCounter <= stateMovie.getNumRecords())\n\t\tlength = currFrameCounter;\t\t\t\t\t\t\t//Note: currFrameCounter corresponds to the framecounter in the savestate\n\telse if (currFrameCounter > currMovie.getNumRecords())  //Now that we know the length of the records of the savestate we plan to load, let's match the length against the movie\n\t\tlength = currMovie.getNumRecords();\t\t\t\t    //If length < currMovie records then this is a \"future\" event from the current movie, againt we will handle this situation later, we just want to find the right number of frames to compare\n\telse\n\t\tlength = stateMovie.getNumRecords();\n\n\tfor (int x = 0; x < length; x++)\n\t{\n\t\tif (!stateMovie.records[x].Compare(currMovie.records[x]))\n\t\t{\n\t\t\tisInTimeline = false;\n\t\t\terrorFr = x;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn isInTimeline;\n}\n\n\nstatic bool load_successful;\n\nbool mov_loadstate(EMUFILE* fp, int size)\n{\n\tload_successful = false;\n\n\tu32 cookie;\n\tif(read32le(&cookie,fp) != 1) return false;\n\tif(cookie == kNOMO)\n\t{\n\t\tif(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)\n\t\t\tFinishPlayback();\n\t\treturn true;\n\t}\n\telse if(cookie != kMOVI)\n\t\treturn false;\n\n\tsize -= 4;\n\n\tif (!movie_readonly && autoMovieBackup && freshMovie) //If auto-backup is on, movie has not been altered this session and the movie is in read+write mode\n\t{\n\t\tFCEUI_MakeBackupMovie(false);\t//Backup the movie before the contents get altered, but do not display messages\t\t\t\t\t\t  \n\t}\n\n\t//a little rule: cant load states in read+write mode with a movie from an archive.\n\t//so we are going to switch it to readonly mode in that case\n//\tif(!movie_readonly \n//\t\t//*&& FCEU_isFileInArchive(curMovieFilename)*/\n//\t\t) {\n//\t\tFCEU_PrintError(\"Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only.\");\n//\t\tmovie_readonly = true;\n//\t}\n\n\tMovieData tempMovieData = MovieData();\n\t//int curr = fp->ftell();\n\tif(!LoadFM2(tempMovieData, fp, size, false)) {\n\t\t\n\t//\tis->seekg((uint32)curr+size);\n\t/*\textern bool FCEU_state_loading_old_format;\n\t\tif(FCEU_state_loading_old_format) {\n\t\t\tif(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_RECORD) {\n\t\t\t\tFCEUI_StopMovie();\t\t\t\n\t\t\t\tFCEU_PrintError(\"You have tried to use an old savestate while playing a movie. This is unsupported (since the old savestate has old-format movie data in it which can't be converted on the fly)\");\n\t\t\t}\n\t\t}*/\n\t\treturn false;\n\t}\n\n\t//----------------\n\t//complex TAS logic for loadstate\n\t//fully conforms to the savestate logic documented in the Laws of TAS\n\t//http://tasvideos.org/LawsOfTAS/OnSavestates.html\n\t//----------------\n\t\t\n\t/*\n\tPlayback or Recording + Read-only\n\n    * Check that GUID of movie and savestate-movie must match or else error\n          o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway.\n                + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted if user has backup savstates enabled else stop movie\n    * Check that movie and savestate-movie are in same timeline. If not then this is a wrong timeline error.\n          o on error: a message informing that the savestate doesn't belong to this movie\n                + failstate: loadstate attempt canceled, movie can resume as if not attempted if user has backup savestates enabled else stop movie\n    * Check that savestate-movie is not greater than movie. If not then this is a future event error and is not allowed in read-only\n          o on error: message informing that the savestate is from a frame after the last frame of the movie\n                + failstate - loadstate attempt cancelled, movie can resume if user has backup savesattes enabled, else stop movie\n    * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate\n          o on post-movie: See post-movie event section. \n    * All error checks have passed, state will be loaded\n    * Movie contained in the savestate will be discarded\n    * Movie is now in Playback mode \n\n\tPlayback, Recording + Read+write\n\n    * Check that GUID of movie and savestate-movie must match or else error\n          o on error: a message informing that the savestate doesn't belong to this movie. This is a GUID mismatch error. Give user a choice to load it anyway.\n                + failstate: if use declines, loadstate attempt canceled, movie can resume as if not attempted (stop movie if resume fails)canceled, movie can resume if backup savestates enabled else stopmovie\n    * Check that savestate framcount <= savestate movie length. If not this is a post-movie savestate\n          o on post-movie: See post-movie event section. \n    * savestate passed all error checks and will now be loaded in its entirety and replace movie (note: there will be no truncation yet)\n    * current framecount will be set to savestate framecount\n    * on the next frame of input, movie will be truncated to framecount\n          o (note: savestate-movie can be a future event of the movie timeline, or a completely new timeline and it is still allowed) \n    * Rerecord count of movie will be incremented\n    * Movie is now in record mode \n\n\tPost-movie savestate event\n\n    * Whan a savestate is loaded and is determined that the savestate-movie length is less than the savestate framecount then it is a post-movie savestate. These occur when a savestate was made during Movie Finished mode. \n\t* If read+write, the entire savestate movie will be loaded and replace current movie.\n    * If read-only, the savestate movie will be discarded\n    * Mode will be switched to Move Finished\n    * Savestate will be loaded\n    * Current framecount changes to savestate framecount\n    * User will have control of input as if Movie inactive mode \n\t*/\n\n\n\tif(movieMode != MOVIEMODE_INACTIVE)\n\t{\n\t\t//handle moviefile mismatch\n\t\tif(tempMovieData.guid != currMovieData.guid)\n\t\t{\n\t\t\t//mbg 8/18/08 - this code  can be used to turn the error message into an OK/CANCEL\n\t\t\t#if defined(WIN32) && !defined(WXPORT)\n\t\t\t\tstd::string msg = \"There is a mismatch between savestate's movie and current movie.\\ncurrent: \" + currMovieData.guid.toString() + \"\\nsavestate: \" + tempMovieData.guid.toString() + \"\\n\\nThis means that you have loaded a savestate belonging to a different movie than the one you are playing now.\\n\\nContinue loading this savestate anyway?\";\n\t\t\t\tint result = MessageBox(MainWindow->getHWnd(),msg.c_str(),\"Error loading savestate\",MB_OKCANCEL);\n\t\t\t\tif(result == IDCANCEL)\n\t\t\t\t\treturn false;\n\t\t\t#else\n\t\t\t\tFCEU_PrintError(\"Mismatch between savestate's movie and current movie.\\ncurrent: %s\\nsavestate: %s\\n\",currMovieData.guid.toString().c_str(),tempMovieData.guid.toString().c_str());\n\t\t\t\treturn false;\n\t\t\t#endif\n\t\t}\n\n\t\tcloseRecordingMovie();\n\n\t\tif(!movie_readonly)\n\t\t{\n\t\t\tcurrMovieData = tempMovieData;\n\t\t\tcurrMovieData.rerecordCount = currRerecordCount;\n\t\t}\n\n\t\tif(currFrameCounter > (int)currMovieData.records.size())\n\t\t{\n\t\t\t// if the frame counter is longer than our current movie,\n\t\t\t// switch to \"finished\" mode.\n\t\t\t// this is a mode that behaves like \"inactive\"\n\t\t\t// except it permits switching to play/record by loading an earlier savestate.\n\t\t\t// (and we continue to store the finished movie in savestates made while finished)\n\t\t\tosd->setLineColor(255,0,0); // let's make the text red too to hopefully catch the user's attention a bit.\n\t\t\tFinishPlayback();\n\t\t\tosd->setLineColor(255,255,255);\n\n\t\t\t//FCEU_PrintError(\"Savestate is from a frame (%d) after the final frame in the movie (%d). This is not permitted.\", currFrameCounter, currMovieData.records.size()-1);\n\t\t\t//return false;\n\t\t}\n\t\telse if(movie_readonly)\n\t\t{\n\t\t\t//-------------------------------------------------------------\n\t\t\t//this code would reload the movie from disk. allegedly it is helpful to hexers, but\n\t\t\t//it is way too slow with dsm format. so it is only here as a reminder, and in case someone\n\t\t\t//wants to play with it\n\t\t\t//-------------------------------------------------------------\n\t\t\t//{\n\t\t\t//\tfstream fs (curMovieFilename);\n\t\t\t//\tif(!LoadFM2(tempMovieData, &fs, INT_MAX, false))\n\t\t\t//\t{\n\t\t\t//\t\tFCEU_PrintError(\"Failed to reload DSM after loading savestate\");\n\t\t\t//\t}\n\t\t\t//\tfs.close();\n\t\t\t//\tcurrMovieData = tempMovieData;\n\t\t\t//}\n\t\t\t//-------------------------------------------------------------\n\n\t\t\tmovieMode = MOVIEMODE_PLAY;\n\t\t}\n\t\telse\n\t\t{\n\t\t//\t#ifdef _S9XLUA_H\n\t\t//\tif(!FCEU_LuaRerecordCountSkip())\n\t\t\t\tcurrRerecordCount++;\n\t\t//\t#endif\n\t\t\t\n\t\t\tcurrMovieData.rerecordCount = currRerecordCount;\n\t\t\tcurrMovieData.truncateAt(currFrameCounter);\n\n\t\t\topenRecordingMovie(curMovieFilename);\n\t\t\tif(!osRecordingMovie)\n\t\t\t{\n\t\t\t   osd->setLineColor(255, 0, 0);\n\t\t\t   osd->addLine(\"Can't save movie file!\");\n\t\t\t}\n\n\t\t\t//printf(\"DUMPING MOVIE: %d FRAMES\\n\",currMovieData.records.size());\n\t\t\tcurrMovieData.dump(osRecordingMovie, false);\n\t\t\tmovieMode = MOVIEMODE_RECORD;\n\t\t}\n\t}\n\t\n\tload_successful = true;\n\tfreshMovie = false;\n\n\treturn true;\n}\n\nstatic void FCEUMOV_PreLoad(void)\n{\n\tload_successful=0;\n}\n\nstatic bool FCEUMOV_PostLoad(void)\n{\n\tif(movieMode == MOVIEMODE_INACTIVE)\n\t\treturn true;\n\telse\n\t\treturn load_successful;\n}\n\n\nbool FCEUI_MovieGetInfo(EMUFILE* fp, MOVIE_INFO& info, bool skipFrameCount)\n{\n\t//MovieData md;\n\t//if(!LoadFM2(md, fp, INT_MAX, skipFrameCount))\n\t//\treturn false;\n\t//\n\t//info.movie_version = md.version;\n\t//info.poweron = md.savestate.size()==0;\n\t//info.pal = md.palFlag;\n\t//info.nosynchack = true;\n\t//info.num_frames = md.records.size();\n\t//info.md5_of_rom_used = md.romChecksum;\n\t//info.emu_version_used = md.emuVersion;\n\t//info.name_of_rom_used = md.romFilename;\n\t//info.rerecord_count = md.rerecordCount;\n\t//info.comments = md.comments;\n\n\treturn true;\n}\n\nbool MovieRecord::parseBinary(MovieData* md, EMUFILE* fp)\n{\n\tcommands=fp->fgetc();\n\tfp->fread((char *) &pad, sizeof pad);\n\tfp->fread((char *) &touch.x, sizeof touch.x);\n\tfp->fread((char *) &touch.y, sizeof touch.y);\n\tfp->fread((char *) &touch.touch, sizeof touch.touch);\n\treturn true;\n}\n\n\nvoid MovieRecord::dumpBinary(MovieData* md, EMUFILE* fp, int index)\n{\n\tfp->fputc(md->records[index].commands);\n\tfp->fwrite((char *) &md->records[index].pad, sizeof md->records[index].pad);\n\tfp->fwrite((char *) &md->records[index].touch.x, sizeof md->records[index].touch.x);\n\tfp->fwrite((char *) &md->records[index].touch.y, sizeof md->records[index].touch.y);\n\tfp->fwrite((char *) &md->records[index].touch.touch, sizeof md->records[index].touch.touch);\n}\n\nvoid LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size)\n{\n\tint recordsize = 1; //1 for the command\n\n\trecordsize = 6;\n\n\tassert(size%6==0);\n\n\t//find out how much remains in the file\n\tint curr = fp->ftell();\n\tfp->fseek(0,SEEK_END);\n\tint end = fp->ftell();\n\tint flen = end-curr;\n\tfp->fseek(curr,SEEK_SET);\n\n\t//the amount todo is the min of the limiting size we received and the remaining contents of the file\n\tint todo = std::min(size, flen);\n\n\tint numRecords = todo/recordsize;\n\t//printf(\"LOADED MOVIE: %d records; currFrameCounter: %d\\n\",numRecords,currFrameCounter);\n\tmovieData.records.resize(numRecords);\n\tfor(int i=0;i<numRecords;i++)\n\t{\n\t\tmovieData.records[i].parseBinary(&movieData,fp);\n\t}\n}\n\n#include <sstream>\n\nstatic bool CheckFileExists(const char* filename)\n{\n\t//This function simply checks to see if the given filename exists\n\tstring checkFilename; \n\n\tif (filename)\n\t\tcheckFilename = filename;\n\t\t\t\n\t//Check if this filename exists\n\tFILE* fp = fopen(checkFilename.c_str(), \"rb\");\n\t\t\n\tif (!fp)\n\t{\n\t\treturn false; \n\t}\n\telse\n\t{\n\t\tfclose(fp);\n\t\treturn true; \n\t}\n}\n\nvoid FCEUI_MakeBackupMovie(bool dispMessage)\n{\n\t//This function generates backup movie files\n\tstring currentFn;\t\t\t\t\t//Current movie fillename\n\tstring backupFn;\t\t\t\t\t//Target backup filename\n\tstring tempFn;\t\t\t\t\t\t//temp used in back filename creation\n\tstringstream stream;\n\tint x;\t\t\t\t\t\t\t\t//Temp variable for string manip\n\tbool exist = false;\t\t\t\t\t//Used to test if filename exists\n\tbool overflow = false;\t\t\t\t//Used for special situation when backup numbering exceeds limit\n\n\tcurrentFn = curMovieFilename;\t\t//Get current moviefilename\n\tbackupFn = curMovieFilename;\t\t//Make backup filename the same as current moviefilename\n\tx = backupFn.find_last_of(\".\");\t\t //Find file extension\n\tbackupFn = backupFn.substr(0,x);\t//Remove extension\n\ttempFn = backupFn;\t\t\t\t\t//Store the filename at this point\n\tfor (unsigned int backNum=0;backNum<999;backNum++) //999 = arbituary limit to backup files\n\t{\n\t\tstream.str(\"\");\t\t\t\t\t //Clear stream\n\t\tif (backNum > 99)\n\t\t\tstream << \"-\" << backNum;\t //assign backNum to stream\n\t\t else if (backNum <= 99 && backNum >= 10)\n\t\t\tstream << \"-0\" << backNum;      //Make it 010, etc if two digits\n\t\telse\n\t\t\tstream << \"-00\" << backNum;\t //Make it 001, etc if single digit\n\t\tbackupFn.append(stream.str());\t //add number to bak filename\n\t\tbackupFn.append(\".bak\");\t\t //add extension\n\n\t\texist = CheckFileExists(backupFn.c_str());\t//Check if file exists\n\t\t\n\t\tif (!exist) \n\t\t\tbreak;\t\t\t\t\t\t//Yeah yeah, I should use a do loop or something\n\t\telse\n\t\t{\n\t\t\tbackupFn = tempFn;\t\t\t//Before we loop again, reset the filename\n\t\t\t\n\t\t\tif (backNum == 999)\t\t\t//If 999 exists, we have overflowed, let's handle that\n\t\t\t{\n\t\t\t\tbackupFn.append(\"-001.bak\"); //We are going to simply overwrite 001.bak\n\t\t\t\toverflow = true;\t\t//Flag that we have exceeded limit\n\t\t\t\tbreak;\t\t\t\t\t//Just in case\n\t\t\t}\n\t\t}\n\t}\n\n\tMovieData md = currMovieData;\t\t\t\t\t\t\t\t//Get current movie data\n\tEMUFILE* outf = new EMUFILE_FILE(backupFn.c_str(),\"wb\"); //FCEUD_UTF8_fstream(backupFn, \"wb\");\t//open/create file\n\tmd.dump(outf,false);\t\t\t\t\t\t\t\t\t\t//dump movie data\n\tdelete outf;\t\t\t\t\t\t\t\t\t\t\t\t//clean up, delete file object\n\t\n\t//TODO, decide if fstream successfully opened the file and print error message if it doesn't\n\n\tif (dispMessage)\t//If we should inform the user \n\t{\n//\t\tif (overflow)\n//\t\t\tFCEUI_DispMessage(\"Backup overflow, overwriting %s\",backupFn.c_str()); //Inform user of overflow\n//\t\telse\n//\t\t\tFCEUI_DispMessage(\"%s created\",backupFn.c_str()); //Inform user of backup filename\n\t}\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/path.cpp",
    "content": "/*\r\n\tCopyright (C) 2009-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"types.h\"\r\n\r\n#include \"path.h\"\r\n#include <stdio.h>\r\n\r\nchar PathInfo::pathToModule[MAX_PATH];\r\n\r\n//-----------------------------------\r\n//This is taken from mono Path.cs\r\nstatic const char InvalidPathChars[] = {\r\n\t'\\x22', '\\x3C', '\\x3E', '\\x7C', '\\x00', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\x07',\r\n\t'\\x08', '\\x09', '\\x0A', '\\x0B', '\\x0C', '\\x0D', '\\x0E', '\\x0F', '\\x10', '\\x11', '\\x12', \r\n\t'\\x13', '\\x14', '\\x15', '\\x16', '\\x17', '\\x18', '\\x19', '\\x1A', '\\x1B', '\\x1C', '\\x1D', \r\n\t'\\x1E', '\\x1F'\r\n};\r\n\r\n//but it is sort of windows-specific. Does it work in linux? Maybe we'll have to make it smarter\r\nstatic const char VolumeSeparatorChar = ':';\r\nstatic const char AltDirectorySeparatorChar = '/';\r\nstatic bool dirEqualsVolume = (DIRECTORY_DELIMITER_CHAR == VolumeSeparatorChar);\r\n\r\n\r\nbool Path::IsPathRooted (const std::string &path)\r\n{\r\n\tif (path.empty()) {\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tif (path.find_first_of(InvalidPathChars) != std::string::npos) {\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\tchar c = path[0];\r\n\treturn (c == DIRECTORY_DELIMITER_CHAR \t||\r\n\t\t\tc == AltDirectorySeparatorChar \t||\r\n\t\t\t(!dirEqualsVolume && path.size() > 1 && path[1] == VolumeSeparatorChar));\r\n}\r\n\r\nstd::string Path::GetFileDirectoryPath(std::string filePath)\r\n{\r\n\tif (filePath.empty()) {\r\n\t\treturn \"\";\r\n\t}\r\n\t\r\n\tsize_t i = filePath.find_last_of(DIRECTORY_DELIMITER_CHAR);\r\n\tif (i == std::string::npos) {\r\n\t\treturn filePath;\r\n\t}\r\n\t\r\n\treturn filePath.substr(0, i);\r\n}\r\n\r\nstd::string Path::GetFileNameFromPath(std::string filePath)\r\n{\r\n\tif (filePath.empty()) {\r\n\t\treturn \"\";\r\n\t}\r\n\t\r\n\tsize_t i = filePath.find_last_of(DIRECTORY_DELIMITER_CHAR);\r\n\tif (i == std::string::npos) {\r\n\t\treturn filePath;\r\n\t}\r\n\t\r\n\treturn filePath.substr(i + 1);\r\n}\r\n\r\nstd::string Path::GetFileNameWithoutExt(std::string fileName)\r\n{\r\n\tif (fileName.empty()) {\r\n\t\treturn \"\";\r\n\t}\r\n\t\r\n\tsize_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR);\r\n\tif (i == std::string::npos) {\r\n\t\treturn fileName;\r\n\t}\r\n\t\r\n\treturn fileName.substr(0, i);\r\n}\r\n\r\nstd::string Path::GetFileNameFromPathWithoutExt(std::string filePath)\r\n{\r\n\tif (filePath.empty()) {\r\n\t\treturn \"\";\r\n\t}\r\n\t\r\n\tstd::string fileName = GetFileNameFromPath(filePath);\r\n\t\r\n\treturn GetFileNameWithoutExt(fileName);\r\n}\r\n\r\nstd::string Path::GetFileExt(std::string fileName)\r\n{\r\n\tif (fileName.empty()) {\r\n\t\treturn \"\";\r\n\t}\r\n\t\r\n\tsize_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR);\r\n\tif (i == std::string::npos) {\r\n\t\treturn fileName;\r\n\t}\r\n\t\r\n\treturn fileName.substr(i + 1);\r\n}\r\n\r\n//-----------------------------------\r\n#ifdef _WINDOWS\r\nvoid FCEUD_MakePathDirs(const char *fname)\r\n{\r\n\tchar path[MAX_PATH];\r\n\tconst char* div = fname;\r\n\r\n\tdo\r\n\t{\r\n\t\tconst char* fptr = strchr(div, '\\\\');\r\n\r\n\t\tif(!fptr)\r\n\t\t{\r\n\t\t\tfptr = strchr(div, '/');\r\n\t\t}\r\n\r\n\t\tif(!fptr)\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tint off = fptr - fname;\r\n\t\tstrncpy(path, fname, off);\r\n\t\tpath[off] = '\\0';\r\n\t\tmkdir(path);\r\n\r\n\t\tdiv = fptr + 1;\r\n\t\t\r\n\t\twhile(div[0] == '\\\\' || div[0] == '/')\r\n\t\t{\r\n\t\t\tdiv++;\r\n\t\t}\r\n\r\n\t} while(1);\r\n}\r\n#endif\r\n//------------------------------"
  },
  {
    "path": "app/src/main/jni/desmume/src/path.h",
    "content": "/*\r\n\tCopyright (C) 2009-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include <string>\r\n\r\n#ifdef _MSC_VER\r\n#define mkdir _mkdir\r\n#endif\r\n\r\n#if defined(_WINDOWS)\r\n#include <winsock2.h>\r\n#include <windows.h>\r\n#include <direct.h>\r\n#include \"winutil.h\"\r\n#include \"common.h\"\r\n#if !defined(WXPORT)\r\n#include \"resource.h\"\r\n#else\r\n#include <glib.h>\r\n#endif /* !WXPORT */\r\n#elif !defined(DESMUME_COCOA) && !defined(ANDROID)\r\n#include <glib.h>\r\n#endif /* _WINDOWS */\r\n\r\n#include \"time.h\"\r\n#include \"utils/xstring.h\"\r\n\r\n#ifdef _WINDOWS\r\n#define FILE_EXT_DELIMITER_CHAR\t\t'.'\r\n#define DIRECTORY_DELIMITER_CHAR\t'\\\\'\r\n#else\r\n#define FILE_EXT_DELIMITER_CHAR\t\t'.'\r\n#define DIRECTORY_DELIMITER_CHAR\t'/'\r\n#endif\r\n\r\n#ifdef _WINDOWS\r\nvoid FCEUD_MakePathDirs(const char *fname);\r\n#endif\r\n\r\nclass Path\r\n{\r\npublic:\r\n\tstatic bool IsPathRooted (const std::string &path);\r\n\tstatic std::string GetFileDirectoryPath(std::string filePath);\r\n\tstatic std::string GetFileNameFromPath(std::string filePath);\r\n\tstatic std::string GetFileNameWithoutExt(std::string fileName);\r\n\tstatic std::string GetFileNameFromPathWithoutExt(std::string filePath);\r\n\tstatic std::string GetFileExt(std::string fileName);\r\n};\r\n\r\nclass PathInfo\r\n{\r\npublic:\r\n\r\n\tstd::string path;\r\n\tstd::string RomName;\r\n\tstd::string RomDirectory;\r\n\r\n\t#define MAX_FORMAT\t\t20\r\n\t#define SECTION\t\t\t\"PathSettings\"\r\n\r\n\t#define ROMKEY\t\t\t\"Roms\"\r\n\t#define BATTERYKEY\t\t\"Battery\"\r\n\t#define STATEKEY\t\t\"States\"\r\n\t#define SCREENSHOTKEY\t\"Screenshots\"\r\n\t#define AVIKEY\t\t\t\"AviFiles\"\r\n\t#define CHEATKEY\t\t\"Cheats\"\r\n\t#define R4FORMATKEY\t\t\"R4format\"\r\n\t#define SOUNDKEY\t\t\"SoundSamples\"\r\n\t#define FIRMWAREKEY\t\t\"Firmware\"\r\n\t#define FORMATKEY\t\t\"format\"\r\n\t#define DEFAULTFORMATKEY \"defaultFormat\"\r\n\t#define NEEDSSAVINGKEY\t\"needsSaving\"\r\n\t#define LASTVISITKEY\t\"lastVisit\"\r\n\t#define LUAKEY\t\t\t\"Lua\"\r\n\tchar screenshotFormat[MAX_FORMAT];\r\n\tbool savelastromvisit;\r\n\r\n\tenum KnownPath\r\n\t{\r\n\t\tFIRSTKNOWNPATH = 0,\r\n\t\tROMS = 0,\r\n\t\tBATTERY,\r\n\t\tSTATES, \r\n\t\tSCREENSHOTS,\r\n\t\tAVI_FILES,\r\n\t\tCHEATS,\r\n\t\tSOUNDS,\r\n\t\tFIRMWARE,\r\n\t\tMODULE,\r\n\t\tMAXKNOWNPATH = MODULE\r\n\t};\r\n\r\n\tchar pathToRoms[MAX_PATH];\r\n\tchar pathToBattery[MAX_PATH];\r\n\tchar pathToStates[MAX_PATH];\r\n\tchar pathToScreenshots[MAX_PATH];\r\n\tchar pathToAviFiles[MAX_PATH];\r\n\tchar pathToCheats[MAX_PATH];\r\n\tchar pathToSounds[MAX_PATH];\r\n\tchar pathToFirmware[MAX_PATH];\r\n\tstatic char pathToModule[MAX_PATH];\r\n\tchar pathToLua[MAX_PATH];\r\n\r\n\tvoid init(const char *filename) {\r\n\r\n\t\tpath = std::string(filename);\r\n\r\n\t\t//extract the internal part of the logical rom name\r\n\t\tstd::vector<std::string> parts = tokenize_str(filename,\"|\");\r\n\t\tSetRomName(parts[parts.size()-1].c_str());\r\n\t\tLoadModulePath();\r\n#if !defined(WIN32) && !defined(DESMUME_COCOA)\r\n\t\tReadPathSettings();\r\n#endif\r\n\t\t\r\n\t}\r\n\r\n\tvoid LoadModulePath()\r\n\t{\r\n#ifdef ANDROID\r\n\t\treturn; //set from java\r\n#elif defined(_WINDOWS)\r\n\r\n\t\tchar *p;\r\n\t\tZeroMemory(pathToModule, sizeof(pathToModule));\r\n\r\n\t\tGetModuleFileName(NULL, pathToModule, sizeof(pathToModule));\r\n\t\tp = pathToModule + lstrlen(pathToModule);\r\n\t\twhile (p >= pathToModule && *p != DIRECTORY_DELIMITER_CHAR) p--;\r\n\t\tif (++p >= pathToModule) *p = 0;\r\n#elif defined(DESMUME_COCOA)\r\n\t\tstd::string pathStr = Path::GetFileDirectoryPath(path);\r\n\r\n\t\tstrncpy(pathToModule, pathStr.c_str(), MAX_PATH);\r\n#else\r\n\t\tchar *cwd = g_build_filename(g_get_user_config_dir(), \"desmume\", NULL);\r\n\t\tg_mkdir_with_parents(cwd, 0755);\r\n\t\tstrncpy(pathToModule, cwd, MAX_PATH);\r\n\t\tg_free(cwd);\r\n#endif\r\n\t}\r\n\r\n\tenum Action\r\n\t{\r\n\t\tGET,\r\n\t\tSET\r\n\t};\r\n\r\n\tvoid GetDefaultPath(char *pathToDefault, const char *key, int maxCount)\r\n\t{\r\n#ifdef _WINDOWS\r\n\t\tstd::string temp = (std::string)\".\" + DIRECTORY_DELIMITER_CHAR + pathToDefault;\r\n\t\tstrncpy(pathToDefault, temp.c_str(), maxCount);\r\n#elif ANDROID\r\n\t\tsnprintf(pathToDefault, maxCount, \"%s/%s\", pathToModule, key); \r\n#else\r\n\t\tstrncpy(pathToDefault, pathToModule, maxCount);\r\n#endif\r\n\t}\r\n\r\n\tvoid ReadKey(char *pathToRead, const char *key)\r\n\t{\r\n#ifdef _WINDOWS\r\n\t\tGetPrivateProfileString(SECTION, key, key, pathToRead, MAX_PATH, IniName);\r\n\t\tif(strcmp(pathToRead, key) == 0) {\r\n\t\t\t//since the variables are all intialized in this file they all use MAX_PATH\r\n\t\t\tGetDefaultPath(pathToRead, key, MAX_PATH);\r\n\t\t}\r\n#else\r\n\t\t//since the variables are all intialized in this file they all use MAX_PATH\r\n\t\tGetDefaultPath(pathToRead, key, MAX_PATH);\r\n#endif\r\n\t}\r\n\r\n\tvoid ReadPathSettings()\r\n\t{\r\n\t\tif( ( strcmp(pathToModule, \"\") == 0) || !pathToModule)\r\n\t\t\tLoadModulePath();\r\n\r\n\t\tReadKey(pathToRoms, ROMKEY);\r\n\t\tReadKey(pathToBattery, BATTERYKEY);\r\n\t\tReadKey(pathToStates, STATEKEY);\r\n\t\tReadKey(pathToScreenshots, SCREENSHOTKEY);\r\n\t\tReadKey(pathToAviFiles, AVIKEY);\r\n\t\tReadKey(pathToCheats, CHEATKEY);\r\n\t\tReadKey(pathToSounds, SOUNDKEY);\r\n\t\tReadKey(pathToFirmware, FIRMWAREKEY);\r\n\t\tReadKey(pathToLua, LUAKEY);\r\n#ifdef _WINDOWS\r\n\t\tGetPrivateProfileString(SECTION, FORMATKEY, \"%f_%s_%r\", screenshotFormat, MAX_FORMAT, IniName);\r\n\t\tsavelastromvisit\t= GetPrivateProfileBool(SECTION, LASTVISITKEY, true, IniName);\r\n\t\tcurrentimageformat\t= (ImageFormat)GetPrivateProfileInt(SECTION, DEFAULTFORMATKEY, PNG, IniName);\r\n\t\tr4Format = (R4Format)GetPrivateProfileInt(SECTION, R4FORMATKEY, R4_CHEAT_DAT, IniName);\r\n#endif\r\n\t/*\r\n\t\tneedsSaving\t\t= GetPrivateProfileInt(SECTION, NEEDSSAVINGKEY, TRUE, IniName);\r\n\t\tif(needsSaving)\r\n\t\t{\r\n\t\t\tneedsSaving = FALSE;\r\n\t\t\tWritePathSettings();\r\n\t\t}*/\r\n\t}\r\n\r\n\tvoid SwitchPath(Action action, KnownPath path, char *buffer)\r\n\t{\r\n\t\tchar *pathToCopy = 0;\r\n\t\tswitch(path)\r\n\t\t{\r\n\t\tcase ROMS:\r\n\t\t\tpathToCopy = pathToRoms;\r\n\t\t\tbreak;\r\n\t\tcase BATTERY:\r\n\t\t\tpathToCopy = pathToBattery;\r\n\t\t\tbreak;\r\n\t\tcase STATES:\r\n\t\t\tpathToCopy = pathToStates;\r\n\t\t\tbreak;\r\n\t\tcase SCREENSHOTS:\r\n\t\t\tpathToCopy = pathToScreenshots;\r\n\t\t\tbreak;\r\n\t\tcase AVI_FILES:\r\n\t\t\tpathToCopy = pathToAviFiles;\r\n\t\t\tbreak;\r\n\t\tcase CHEATS:\r\n\t\t\tpathToCopy = pathToCheats;\r\n\t\t\tbreak;\r\n\t\tcase SOUNDS:\r\n\t\t\tpathToCopy = pathToSounds;\r\n\t\t\tbreak;\r\n\t\tcase FIRMWARE:\r\n\t\t\tpathToCopy = pathToFirmware;\r\n\t\t\tbreak;\r\n\t\tcase MODULE:\r\n\t\t\tpathToCopy = pathToModule;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif(action == GET)\r\n\t\t{\r\n\t\t\tstd::string thePath = pathToCopy;\r\n\t\t\tstd::string relativePath = (std::string)\".\" + DIRECTORY_DELIMITER_CHAR;\r\n\t\t\t\r\n\t\t\tint len = (int)thePath.size()-1;\r\n\r\n\t\t\tif(len == -1)\r\n\t\t\t\tthePath = relativePath;\r\n\t\t\telse \r\n\t\t\t\tif(thePath[len] != DIRECTORY_DELIMITER_CHAR) \r\n\t\t\t\t\tthePath += DIRECTORY_DELIMITER_CHAR;\r\n\t\r\n\t\t\tif(!Path::IsPathRooted(thePath))\r\n\t\t\t{\r\n\t\t\t\tthePath = (std::string)pathToModule + thePath;\r\n\t\t\t}\r\n\r\n\t\t\tstrncpy(buffer, thePath.c_str(), MAX_PATH);\r\n\t\t\t#ifdef _WINDOWS\r\n\t\t\tFCEUD_MakePathDirs(buffer);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\telse if(action == SET)\r\n\t\t{\r\n\t\t\tint len = strlen(buffer)-1;\r\n\t\t\tif(buffer[len] == DIRECTORY_DELIMITER_CHAR) \r\n\t\t\t\tbuffer[len] = '\\0';\r\n\r\n\t\t\tstrncpy(pathToCopy, buffer, MAX_PATH);\r\n\t\t}\r\n\t}\r\n\r\n\tstd::string getpath(KnownPath path)\r\n\t{\r\n\t\tchar temp[MAX_PATH];\r\n\t\tSwitchPath(GET, path, temp);\r\n\t\treturn temp;\r\n\t}\r\n\r\n\tvoid getpath(KnownPath path, char *buffer)\r\n\t{\r\n\t\tSwitchPath(GET, path, buffer);\r\n\t}\r\n\r\n\tvoid setpath(KnownPath path, char *buffer)\r\n\t{\r\n\t\tSwitchPath(SET, path, buffer);\r\n\t}\r\n\r\n\tvoid getfilename(char *buffer, int maxCount)\r\n\t{\r\n\t\tstrcpy(buffer,noextension().c_str());\r\n\t}\r\n\r\n\tvoid getpathnoext(KnownPath path, char *buffer)\r\n\t{\r\n\t\tgetpath(path, buffer);\r\n\t\tstrcat(buffer, GetRomNameWithoutExtension().c_str());\r\n\t}\r\n\r\n\tstd::string extension()\r\n\t{\r\n\t\treturn Path::GetFileExt(path);\r\n\t}\r\n\r\n\tstd::string noextension()\r\n\t{\r\n\t\tstd::string romNameWithPath = Path::GetFileDirectoryPath(path) + DIRECTORY_DELIMITER_CHAR + Path::GetFileNameWithoutExt(RomName);\r\n\t\t\r\n\t\treturn romNameWithPath;\r\n\t}\r\n\r\n\tvoid formatname(char *output)\r\n\t{\r\n\t\tstd::string file;\r\n\t\ttime_t now = time(NULL);\r\n\t\ttm *time_struct = localtime(&now);\r\n\t\tsrand((unsigned int)now);\r\n\r\n\t\tfor(int i = 0; i < MAX_FORMAT;i++) \r\n\t\t{\t\t\r\n\t\t\tchar *c = &screenshotFormat[i];\r\n\t\t\tchar tmp[MAX_PATH] = {0};\r\n\r\n\t\t\tif(*c == '%')\r\n\t\t\t{\r\n\t\t\t\tc = &screenshotFormat[++i];\r\n\t\t\t\tswitch(*c)\r\n\t\t\t\t{\r\n\t\t\t\tcase 'f':\r\n\t\t\t\t\t\r\n\t\t\t\t\tstrcat(tmp, GetRomNameWithoutExtension().c_str());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'D':\r\n\t\t\t\t\tstrftime(tmp, MAX_PATH, \"%d\", time_struct);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'M':\r\n\t\t\t\t\tstrftime(tmp, MAX_PATH, \"%m\", time_struct);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'Y':\r\n\t\t\t\t\tstrftime(tmp, MAX_PATH, \"%Y\", time_struct);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'h':\r\n\t\t\t\t\tstrftime(tmp, MAX_PATH, \"%H\", time_struct);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'm':\r\n\t\t\t\t\tstrftime(tmp, MAX_PATH, \"%M\", time_struct);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 's':\r\n\t\t\t\t\tstrftime(tmp, MAX_PATH, \"%S\", time_struct);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'r':\r\n\t\t\t\t\tsprintf(tmp, \"%d\", rand() % RAND_MAX);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tint j;\r\n\t\t\t\tfor(j=i;j<MAX_FORMAT-i;j++)\r\n\t\t\t\t\tif(screenshotFormat[j] != '%')\r\n\t\t\t\t\t\ttmp[j-i]=screenshotFormat[j];\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\ttmp[j-i]='\\0';\r\n\t\t\t}\r\n\t\t\tfile += tmp;\r\n\t\t}\r\n\t\tstrncpy(output, file.c_str(), MAX_PATH);\r\n\t}\r\n\r\n\tenum R4Format\r\n\t{\r\n#if defined(_WINDOWS) && !defined(WXPORT)\r\n\t\tR4_CHEAT_DAT = IDC_R4TYPE1,\r\n\t\tR4_USRCHEAT_DAT = IDC_R4TYPE2\r\n#else\r\n\t\tR4_CHEAT_DAT,\r\n\t\tR4_USRCHEAT_DAT\r\n#endif\r\n\t};\r\n\tR4Format r4Format;\r\n\r\n\tenum ImageFormat\r\n\t{\r\n#if defined(_WINDOWS) && !defined(WXPORT)\r\n\t\tPNG = IDC_PNG,\r\n\t\tBMP = IDC_BMP\r\n#else\r\n\t\tPNG,\r\n\t\tBMP\r\n#endif\r\n\t};\r\n\r\n\tImageFormat currentimageformat;\r\n\r\n\tImageFormat imageformat() {\r\n\t\treturn currentimageformat;\r\n\t}\r\n\r\n\tvoid SetRomName(const char *filename)\r\n\t{\r\n\t\tstd::string romPath = filename;\r\n\r\n\t\tRomName = Path::GetFileNameFromPath(romPath);\r\n\t\tRomDirectory = Path::GetFileDirectoryPath(romPath);\r\n\t}\r\n\r\n\tconst char *GetRomName()\r\n\t{\r\n\t\treturn RomName.c_str();\r\n\t}\r\n\r\n\tstd::string GetRomNameWithoutExtension()\r\n\t{\r\n\t\treturn Path::GetFileNameWithoutExt(RomName);\r\n\t}\r\n\r\n\tbool isdsgba(std::string fileName)\r\n\t{\r\n\t\tsize_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR);\r\n\t\t\r\n\t\tif (i != std::string::npos) {\r\n\t\t\tfileName = fileName.substr(i - 2);\r\n\t\t}\r\n\t\t\r\n\t\tif(fileName == \"ds.gba\") {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\t\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nextern PathInfo path;\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/rasterize.cpp",
    "content": "/*\n\tCopyright (C) 2009-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n//nothing in this file should be assumed to be accurate\n//\n//the shape rasterizers contained herein are based on code supplied by Chris Hecker from \n//http://chrishecker.com/Miscellaneous_Technical_Articles\n\n\n//TODO - due to a late change of a y-coord flipping, our winding order is wrong\n//this causes us to have to flip the verts for every front-facing poly.\n//a performance improvement would be to change the winding order logic\n//so that this is done less frequently\n\n#include \"rasterize.h\"\n\n#include <algorithm>\n#include <assert.h>\n#include <math.h>\n#include <string.h>\n\n#ifndef _MSC_VER\n#include <stdint.h>\n#endif\n\n#include \"bits.h\"\n#include \"common.h\"\n#include \"matrix.h\"\n#include \"render3D.h\"\n#include \"gfx3d.h\"\n#include \"texcache.h\"\n#include \"NDSSystem.h\"\n#include \"utils/task.h\"\n\n#ifdef ANDROID\n#include <android/log.h>\n#endif\n\n//#undef FORCEINLINE\n//#define FORCEINLINE\n//#undef INLINE\n//#define INLINE\n\nusing std::min;\nusing std::max;\nusing std::swap;\n\ntemplate<typename T> T _min(T a, T b, T c) { return min(min(a,b),c); }\ntemplate<typename T> T _max(T a, T b, T c) { return max(max(a,b),c); }\ntemplate<typename T> T _min(T a, T b, T c, T d) { return min(_min(a,b,d),c); }\ntemplate<typename T> T _max(T a, T b, T c, T d) { return max(_max(a,b,d),c); }\n\nstatic const int kUnsetTranslucentPolyID = 255;\n\nstatic CACHE_ALIGN u8 modulate_table[64][64];\nstatic CACHE_ALIGN u8 decal_table[32][64][64];\nstatic CACHE_ALIGN u8 index_lookup_table[65];\nstatic CACHE_ALIGN u8 index_start_table[8];\n\nstatic bool softRastHasNewData = false;\n\n////optimized float floor useful in limited cases\n////from http://www.stereopsis.com/FPU.html#convert\n////(unfortunately, it relies on certain FPU register settings)\n//int Real2Int(double val)\n//{\n//\tconst double _double2fixmagic = 68719476736.0*1.5;     //2^36 * 1.5,  (52-_shiftamt=36) uses limited precisicion to floor\n//\tconst int _shiftamt        = 16;                    //16.16 fixed point representation,\n//\n//\t#ifdef WORDS_BIGENDIAN\n//\t\t#define iman_\t\t\t\t1\n//\t#else\n//\t\t#define iman_\t\t\t\t0\n//\t#endif\n//\n//\tval\t\t= val + _double2fixmagic;\n//\treturn ((int*)&val)[iman_] >> _shiftamt; \n//}\n\n//// this probably relies on rounding settings..\n//int Real2Int(float val)\n//{\n//\t//val -= 0.5f;\n//\t//int temp;\n//\t//__asm {\n//\t//\tfld val;\n//\t//\tfistp temp;\n//\t//}\n//\t//return temp;\n//\treturn 0;\n//}\n\n\n//doesnt work yet\nstatic FORCEINLINE int fastFloor(float f)\n{\n\tfloat temp = f + 1.f;\n\tint ret = (*((u32*)&temp))&0x7FFFFF;\n\treturn ret;\n}\n\n\n//INLINE static void SubmitVertex(int vert_index, VERT& rawvert)\n//{\n//\tverts[vert_index] = &rawvert;\n//}\n\nstatic Fragment _screen[256*192];\nstatic FragmentColor _screenColor[256*192];\n\nstatic FORCEINLINE int iround(float f) {\n\treturn (int)f; //lol\n}\n\n\ntypedef int fixed28_4;\n\n// handle floor divides and mods correctly \nstatic FORCEINLINE void FloorDivMod(long Numerator, long Denominator, long &Floor, long &Mod, bool& failure)\n{\n\t//These must be caused by invalid or degenerate shapes.. not sure yet.\n\t//check it out in the mario face intro of SM64\n\t//so, we have to take out the assert.\n\t//I do know that we handle SOME invalid shapes without crashing,\n\t//since I see them acting poppy in a way that doesnt happen in the HW.. so alas it is also incorrect.\n\t//This particular incorrectness is not likely ever to get fixed!\n\n\t//assert(Denominator > 0);\t\t\n\n\t//but we have to bail out since our handling for these cases currently steps scanlines \n\t//the wrong way and goes totally nuts (freezes)\n\tif(Denominator<=0) \n\t\tfailure = true;\n\n\tif(Numerator >= 0) {\n\t\t// positive case, C is okay\n\t\tFloor = Numerator / Denominator;\n\t\tMod = Numerator % Denominator;\n\t} else {\n\t\t// Numerator is negative, do the right thing\n\t\tFloor = -((-Numerator) / Denominator);\n\t\tMod = (-Numerator) % Denominator;\n\t\tif(Mod) {\n\t\t\t// there is a remainder\n\t\t\tFloor--; Mod = Denominator - Mod;\n\t\t}\n\t}\n}\n\nstatic FORCEINLINE fixed28_4 FloatToFixed28_4( float Value ) {\n\treturn (fixed28_4)(Value * 16);\n}\nstatic FORCEINLINE float Fixed28_4ToFloat( fixed28_4 Value ) {\n\treturn Value / 16.0f;\n}\n//inline fixed16_16 FloatToFixed16_16( float Value ) {\n//\treturn (fixed16_6)(Value * 65536);\n//}\n//inline float Fixed16_16ToFloat( fixed16_16 Value ) {\n//\treturn Value / 65536.0;\n//}\nstatic FORCEINLINE fixed28_4 Fixed28_4Mul( fixed28_4 A, fixed28_4 B ) {\n\t// could make this asm to prevent overflow\n\treturn (A * B) / 16;\t// 28.4 * 28.4 = 24.8 / 16 = 28.4\n}\nstatic FORCEINLINE int Ceil28_4( fixed28_4 Value ) {\n\tint ReturnValue;\n\tint Numerator = Value - 1 + 16;\n\tif(Numerator >= 0) {\n\t\tReturnValue = Numerator/16;\n\t} else {\n\t\t// deal with negative numerators correctly\n\t\tReturnValue = -((-Numerator)/16);\n\t\tReturnValue -= ((-Numerator) % 16) ? 1 : 0;\n\t}\n\treturn ReturnValue;\n}\n\nstruct edge_fx_fl {\n\tedge_fx_fl() {}\n\tedge_fx_fl(int Top, int Bottom, VERT** verts, bool& failure);\n\tFORCEINLINE int Step();\n\n\tVERT** verts;\n\tlong X, XStep, Numerator, Denominator;\t\t\t// DDA info for x\n\tlong ErrorTerm;\n\tint Y, Height;\t\t\t\t\t// current y and vertical count\n\t\n\tstruct Interpolant {\n\t\tfloat curr, step, stepExtra;\n\t\tFORCEINLINE void doStep() { curr += step; }\n\t\tFORCEINLINE void doStepExtra() { curr += stepExtra; }\n\t\tFORCEINLINE void initialize(float value) {\n\t\t\tcurr = value;\n\t\t\tstep = 0;\n\t\t\tstepExtra = 0;\n\t\t}\n\t\tFORCEINLINE void initialize(float top, float bottom, float dx, float dy, long XStep, float XPrestep, float YPrestep) {\n\t\t\tdx = 0;\n\t\t\tdy *= (bottom-top);\n\t\t\tcurr = top + YPrestep * dy + XPrestep * dx;\n\t\t\tstep = XStep * dx + dy;\n\t\t\tstepExtra = dx;\n\t\t}\n\t};\n\t\n\tstatic const int NUM_INTERPOLANTS = 7;\n\tunion {\n\t\tstruct {\n\t\t\tInterpolant invw,z,u,v,color[3];\n\t\t};\n\t\tInterpolant interpolants[NUM_INTERPOLANTS];\n\t};\n\tvoid FORCEINLINE doStepInterpolants() { for(int i=0;i<NUM_INTERPOLANTS;i++) interpolants[i].doStep(); }\n\tvoid FORCEINLINE doStepExtraInterpolants() { for(int i=0;i<NUM_INTERPOLANTS;i++) interpolants[i].doStepExtra(); }\n};\n\nFORCEINLINE edge_fx_fl::edge_fx_fl(int Top, int Bottom, VERT** verts, bool& failure) {\n\tthis->verts = verts;\n\tY = Ceil28_4((fixed28_4)verts[Top]->y);\n\tint YEnd = Ceil28_4((fixed28_4)verts[Bottom]->y);\n\tHeight = YEnd - Y;\n\tX = Ceil28_4((fixed28_4)verts[Top]->x);\n\tint XEnd = Ceil28_4((fixed28_4)verts[Bottom]->x);\n\tint Width = XEnd - X; // can be negative\n\n\t// even if Height == 0, give some info for horizontal line poly\n\tif(Height != 0 || Width != 0)\n\t{\n\t\tlong dN = long(verts[Bottom]->y - verts[Top]->y);\n\t\tlong dM = long(verts[Bottom]->x - verts[Top]->x);\n\t\tif (dN != 0)\n\t\t{\n\t\t\tlong InitialNumerator = (long)(dM*16*Y - dM*verts[Top]->y + dN*verts[Top]->x - 1 + dN*16);\n\t\t\tFloorDivMod(InitialNumerator,dN*16,X,ErrorTerm,failure);\n\t\t\tFloorDivMod(dM*16,dN*16,XStep,Numerator,failure);\n\t\t\tDenominator = dN*16;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tXStep = Width;\n\t\t\tNumerator = 0;\n\t\t\tErrorTerm = 0;\n\t\t\tDenominator = 1;\n\t\t\tdN = 1;\n\t\t}\n\t\n\t\tfloat YPrestep = Fixed28_4ToFloat((fixed28_4)(Y*16 - verts[Top]->y));\n\t\tfloat XPrestep = Fixed28_4ToFloat((fixed28_4)(X*16 - verts[Top]->x));\n\n\t\tfloat dy = 1/Fixed28_4ToFloat(dN);\n\t\tfloat dx = 1/Fixed28_4ToFloat(dM);\n\t\t\n\t\tinvw.initialize(1/verts[Top]->w,1/verts[Bottom]->w,dx,dy,XStep,XPrestep,YPrestep);\n\t\tu.initialize(verts[Top]->u,verts[Bottom]->u,dx,dy,XStep,XPrestep,YPrestep);\n\t\tv.initialize(verts[Top]->v,verts[Bottom]->v,dx,dy,XStep,XPrestep,YPrestep);\n\t\tz.initialize(verts[Top]->z,verts[Bottom]->z,dx,dy,XStep,XPrestep,YPrestep);\n\t\tfor(int i=0;i<3;i++)\n\t\t\tcolor[i].initialize(verts[Top]->fcolor[i],verts[Bottom]->fcolor[i],dx,dy,XStep,XPrestep,YPrestep);\n\t}\n\telse\n\t{\n\t\t// even if Width == 0 && Height == 0, give some info for pixel poly\n\t\t// example: Castlevania Portrait of Ruin, warp stone\n\t\tXStep = 1;\n\t\tNumerator = 0;\n\t\tDenominator = 1;\n\t\tErrorTerm = 0;\n\t\tinvw.initialize(1/verts[Top]->w);\n\t\tu.initialize(verts[Top]->u);\n\t\tv.initialize(verts[Top]->v);\n\t\tz.initialize(verts[Top]->z);\n\t\tfor(int i=0;i<3;i++)\n\t\t\tcolor[i].initialize(verts[Top]->fcolor[i]);\n\t}\n}\n\nFORCEINLINE int edge_fx_fl::Step() {\n\tX += XStep; Y++; Height--;\n\tdoStepInterpolants();\n\n\tErrorTerm += Numerator;\n\tif(ErrorTerm >= Denominator) {\n\t\tX++;\n\t\tErrorTerm -= Denominator;\n\t\tdoStepExtraInterpolants();\n\t}\n\treturn Height;\n}\t\n\n\n\nstatic FORCEINLINE void alphaBlend(FragmentColor & dst, const FragmentColor & src)\n{\n\tif(gfx3d.renderState.enableAlphaBlending)\n\t{\n\t\tif(src.a == 31 || dst.a == 0)\n\t\t{\n\t\t\tdst = src;\n\t\t}\n\t\t//else if(src.a == 0) { } //this is not necessary since it was handled earlier\n\t\telse\n\t\t{\n\t\t\tu8 alpha = src.a+1;\n\t\t\tu8 invAlpha = 32 - alpha;\n\t\t\tdst.r = (alpha*src.r + invAlpha*dst.r)>>5;\n\t\t\tdst.g = (alpha*src.g + invAlpha*dst.g)>>5;\n\t\t\tdst.b = (alpha*src.b + invAlpha*dst.b)>>5;\n\t\t}\n\n\t\tdst.a = max(src.a,dst.a);\n\t}\n\telse\n\t{\n\t\tif(src.a == 0)\n\t\t{\n\t\t\t//do nothing; the fragment is totally transparent\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdst = src;\n\t\t}\n\t}\n}\n\n// TODO: wire-frame\nstruct PolyAttr\n{\n\tu32 val;\n\n\tbool decalMode;\n\tbool translucentDepthWrite;\n\tbool drawBackPlaneIntersectingPolys;\n\tu8 polyid;\n\tu8 alpha;\n\tbool backfacing;\n\tbool translucent;\n\tu8 fogged;\n\n\tbool isVisible(bool backfacing) \n\t{\n\t\t//this was added after adding multi-bit stencil buffer\n\t\t//it seems that we also need to prevent drawing back faces of shadow polys for rendering\n\t\tu32 mode = (val>>4)&0x3;\n\t\tif(mode==3 && polyid !=0) return !backfacing;\n\t\t//another reasonable possibility is that we should be forcing back faces to draw (mariokart doesnt use them)\n\t\t//and then only using a single bit buffer (but a cursory test of this doesnt actually work)\n\t\t//\n\t\t//this code needs to be here for shadows in wizard of oz to work.\n\n\t\tswitch((val>>6)&3) {\n\t\t\tcase 0: return false;\n\t\t\tcase 1: return backfacing;\n\t\t\tcase 2: return !backfacing;\n\t\t\tcase 3: return true;\n\t\t\tdefault: assert(false); return false;\n\t\t}\n\t}\n\n\tvoid setup(u32 polyAttr)\n\t{\n\t\tval = polyAttr;\n\t\tdecalMode = BIT14(val);\n\t\ttranslucentDepthWrite = BIT11(val);\n\t\tpolyid = (polyAttr>>24)&0x3F;\n\t\talpha = (polyAttr>>16)&0x1F;\n\t\tdrawBackPlaneIntersectingPolys = BIT12(val);\n\t\tfogged = BIT15(val);\n\t}\n\n};\n\ntemplate<bool RENDERER>\nclass RasterizerUnit\n{\npublic:\n\n\tint SLI_MASK, SLI_VALUE;\n\tbool _debug_thisPoly;\n\n\tRasterizerUnit()\n\t\t: _debug_thisPoly(false)\n\t{\n\t}\n\n\tTexCacheItem* lastTexKey;\n\t\n\tVERT* verts[MAX_CLIPPED_VERTS];\n\n    PolyAttr polyAttr;\n\tint polynum;\n\n\n\tstruct Sampler\n\t{\n\t\tSampler() {}\n\n\t\tbool enabled;\n\t\tint width, height;\n\t\tint wmask, hmask;\n\t\tint wrap;\n\t\tint wshift;\n\t\tint texFormat;\n\t\tvoid setup(u32 texParam)\n\t\t{\n\t\t\ttexFormat = (texParam>>26)&7;\n\t\t\twshift = ((texParam>>20)&0x07) + 3;\n\t\t\twidth=(1 << wshift);\n\t\t\theight=(8 << ((texParam>>23)&0x07));\n\t\t\twmask = width-1;\n\t\t\thmask = height-1;\n\t\t\twrap = (texParam>>16)&0xF;\n\t\t\tenabled = gfx3d.renderState.enableTexturing && (texFormat!=0);\n\t\t}\n\n\t\t/*FORCEINLINE void clamp(int &val, const int size, const int sizemask){\n\t\t\tif(val<0) val = 0;\n\t\t\tif(val>sizemask) val = sizemask;\n\t\t}*/\n\n\t\t//jeffq: branchless clamp\n\t\t#define clamp(val, unused, sizemax) \\\n\t\t\t((val = val + ( -val & ( val >> 31 ) )), (val = sizemax + ( ( val - sizemax ) & ( (val - sizemax) >> 31))))\n\n\n\t\t/*FORCEINLINE void hclamp(int &val) { clamp(val,width,wmask); }\n\t\tFORCEINLINE void vclamp(int &val) { clamp(val,height,hmask); }*/\n\n\t\t#define hclamp(val) clamp(val,width,wmask)\n\t\t#define vclamp(val) clamp(val,height,hmask)\n\n\t\t/*FORCEINLINE void repeat(int &val, const int size, const int sizemask) {\n\t\t\tval &= sizemask;\n\t\t}*/\n\n\t\t#define repeat(val, unused, sizemask) val &= sizemask\n\n\t\t/*FORCEINLINE void hrepeat(int &val) { repeat(val,width,wmask); }\n\t\tFORCEINLINE void vrepeat(int &val) { repeat(val,height,hmask); }*/\n\n\t\t#define hrepeat(val) repeat(val,width,wmask)\n\t\t#define vrepeat(val) repeat(val,height,hmask)\n\n\t\tFORCEINLINE void flip(int &val, const int size, const int sizemask) {\n\t\t\tval &= ((size<<1)-1);\n\t\t\tif(val>=size) val = (size<<1)-val-1;\n\t\t}\n\t\tFORCEINLINE void hflip(int &val) { flip(val,width,wmask); }\n\t\tFORCEINLINE void vflip(int &val) { flip(val,height,hmask); }\n\n\t\tFORCEINLINE void dowrap(int& iu, int& iv)\n\t\t{\n\t\t\tswitch(wrap) {\n\t\t\t\t//flip none\n\t\t\t\tcase 0x0: hclamp(iu); vclamp(iv); break;\n\t\t\t\tcase 0x1: hrepeat(iu); vclamp(iv); break;\n\t\t\t\tcase 0x2: hclamp(iu); vrepeat(iv); break;\n\t\t\t\tcase 0x3: hrepeat(iu); vrepeat(iv); break;\n\t\t\t\t//flip S\n\t\t\t\tcase 0x4: hclamp(iu); vclamp(iv); break;\n\t\t\t\tcase 0x5: hflip(iu); vclamp(iv); break;\n\t\t\t\tcase 0x6: hclamp(iu); vrepeat(iv); break;\n\t\t\t\tcase 0x7: hflip(iu); vrepeat(iv); break;\n\t\t\t\t//flip T\n\t\t\t\tcase 0x8: hclamp(iu); vclamp(iv); break;\n\t\t\t\tcase 0x9: hrepeat(iu); vclamp(iv); break;\n\t\t\t\tcase 0xA: hclamp(iu); vflip(iv); break;\n\t\t\t\tcase 0xB: hrepeat(iu); vflip(iv); break;\n\t\t\t\t//flip both\n\t\t\t\tcase 0xC: hclamp(iu); vclamp(iv); break;\n\t\t\t\tcase 0xD: hflip(iu); vclamp(iv); break;\n\t\t\t\tcase 0xE: hclamp(iu); vflip(iv); break;\n\t\t\t\tcase 0xF: hflip(iu); vflip(iv); break;\n\t\t\t}\n\t\t}\n\t} sampler;\n\n\tFORCEINLINE FragmentColor sample(float u, float v)\n\t{\n\t\tstatic const FragmentColor white = MakeFragmentColor(63,63,63,31);\n\t\tif(!sampler.enabled) return white;\n\n\t\t//finally, we can use floor here. but, it is slower than we want.\n\t\t//the best solution is probably to wait until the pipeline is full of fixed point\n\t\ts32 iu = s32floor(u);\n\t\ts32 iv = s32floor(v);\n\t\tsampler.dowrap(iu,iv);\n\n\t\tFragmentColor color;\n\t\tcolor.color = ((u32*)lastTexKey->decoded)[(iv<<sampler.wshift)+iu];\n\t\treturn color;\n\t}\n\n\tstruct Shader\n\t{\n\t\tu8 mode;\n\t\tfloat invu, invv, w;\n\t\tFragmentColor materialColor;\n\t} shader;\n\n\tFORCEINLINE void shade(FragmentColor& dst)\n\t{\n\t\tFragmentColor texColor;\n\t\tfloat u,v;\n\n\t\tswitch(shader.mode)\n\t\t{\n\t\tcase 0: //modulate\n\t\t\tu = shader.invu*shader.w;\n\t\t\tv = shader.invv*shader.w;\n\t\t\ttexColor = sample(u,v);\n\t\t\tdst.r = modulate_table[texColor.r][shader.materialColor.r];\n\t\t\tdst.g = modulate_table[texColor.g][shader.materialColor.g];\n\t\t\tdst.b = modulate_table[texColor.b][shader.materialColor.b];\n\t\t\tdst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1;\n\t\t\t//dst.a = 28;\n\t\t\t//#ifdef _MSC_VER\n\t\t\t//if(GetAsyncKeyState(VK_SHIFT)) {\n\t\t\t//\t//debugging tricks\n\t\t\t//\tdst = shader.materialColor;\n\t\t\t//\tif(GetAsyncKeyState(VK_TAB)) {\n\t\t\t//\t\tu8 alpha = dst.a;\n\t\t\t//\t\tdst.color = polynum*8+8;\n\t\t\t//\t\tdst.a = alpha;\n\t\t\t//\t}\n\t\t\t//}\n\t\t\t//#endif\n\t\t\tbreak;\n\t\tcase 1: //decal\n\t\t\tif(sampler.enabled)\n\t\t\t{\n\t\t\t\tu = shader.invu*shader.w;\n\t\t\t\tv = shader.invv*shader.w;\n\t\t\t\ttexColor = sample(u,v);\n\t\t\t\tdst.r = decal_table[texColor.a][texColor.r][shader.materialColor.r];\n\t\t\t\tdst.g = decal_table[texColor.a][texColor.g][shader.materialColor.g];\n\t\t\t\tdst.b = decal_table[texColor.a][texColor.b][shader.materialColor.b];\n\t\t\t\tdst.a = shader.materialColor.a;\n\t\t\t} else dst = shader.materialColor;\n\t\t\tbreak;\n\t\tcase 2: //toon/highlight shading\n\t\t\t{\n\t\t\t\tu = shader.invu*shader.w;\n\t\t\t\tv = shader.invv*shader.w;\n\t\t\t\ttexColor = sample(u,v);\n\t\t\t\tFragmentColor toonColor = engine->toonTable[shader.materialColor.r>>1];\n\t\t\t\n\t\t\t\tif(gfx3d.renderState.shading == GFX3D_State::HIGHLIGHT)\n\t\t\t\t{\n\t\t\t\t\tdst.r = modulate_table[texColor.r][shader.materialColor.r];\n\t\t\t\t\tdst.g = modulate_table[texColor.g][shader.materialColor.r];\n\t\t\t\t\tdst.b = modulate_table[texColor.b][shader.materialColor.r];\n\t\t\t\t\tdst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1;\n\n\t\t\t\t\tdst.r = min<u8>(63, (dst.r + toonColor.r));\n\t\t\t\t\tdst.g = min<u8>(63, (dst.g + toonColor.g));\n\t\t\t\t\tdst.b = min<u8>(63, (dst.b + toonColor.b));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdst.r = modulate_table[texColor.r][toonColor.r];\n\t\t\t\t\tdst.g = modulate_table[texColor.g][toonColor.g];\n\t\t\t\t\tdst.b = modulate_table[texColor.b][toonColor.b];\n\t\t\t\t\tdst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 3: //shadows\n\t\t\t//is this right? only with the material color?\n\t\t\tdst = shader.materialColor;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid setupShader(u32 polyattr)\n\t{\n\t\tshader.mode = (polyattr>>4)&0x3;\n\t}\n\n\tFORCEINLINE void pixel(int adr,float r, float g, float b, float invu, float invv, float w, float z)\n\t{\n\t\tFragment &destFragment = engine->screen[adr];\n\t\tFragmentColor &destFragmentColor = engine->screenColor[adr];\n\n\t\t//not sure about this\n\t\t//this value was chosen to make the skybox, castle window decals, and water level render correctly in SM64\n\t\tconst u32 depth = gfx3d.renderState.wbuffer ? w*4096 : ((u32)(z*0x7FFF))<<9;\n\n\t\tif(polyAttr.decalMode)\n\t\t{\n\t\t\t/*if ( CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack > 0)\n\t\t\t{\n\t\t\t\tif(depth<destFragment.depth - CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack\n\t\t\t\t\t|| depth>destFragment.depth + CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack) \n\t\t\t\t{\n\t\t\t\t\tgoto depth_fail;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse*/\n\t\t\t{\n\t\t\t\tif(depth != destFragment.depth)\n\t\t\t\t{\n\t\t\t\t\tgoto depth_fail;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(depth>=destFragment.depth) \n\t\t\t{\n\t\t\t\tgoto depth_fail;\n\t\t\t}\n\t\t}\n\n\t\t//handle shadow polys\n\t\tif(shader.mode == 3)\n\t\t{\n\t\t\tif(polyAttr.polyid == 0)\n\t\t\t{\n\t\t\t\tgoto rejected_fragment;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(destFragment.stencil==0)\n\t\t\t\t{\n\t\t\t\t\tgoto rejected_fragment;\n\t\t\t\t}\t\n\n\t\t\t\t//shadow polys have a special check here to keep from self-shadowing when user\n\t\t\t\t//has tried to prevent it from happening\n\t\t\t\t//if this isnt here, then the vehicle select in mariokart will look terrible\n\t\t\t\tif(destFragment.polyid.opaque == polyAttr.polyid)\n\t\t\t\t\tgoto rejected_fragment;\n\t\t\t}\n\t\t}\n\t\t\n\t\tshader.w = w;\n\t\tshader.invu = invu;\n\t\tshader.invv = invv;\n\n\t\t//perspective-correct the colors\n\t\tr = (r * w) + 0.5f;\n\t\tg = (g * w) + 0.5f;\n\t\tb = (b * w) + 0.5f;\n\n\n\t\t//this is a HACK: \n\t\t//we are being very sloppy with our interpolation precision right now\n\t\t//and rather than fix it, i just want to clamp it\n\t\tshader.materialColor.r = max(0U,min(63U,u32floor(r)));\n\t\tshader.materialColor.g = max(0U,min(63U,u32floor(g)));\n\t\tshader.materialColor.b = max(0U,min(63U,u32floor(b)));\n\n\t\tshader.materialColor.a = polyAttr.alpha;\n\n\t\t//pixel shader\n\t\tFragmentColor shaderOutput;\n\t\tshade(shaderOutput);\n\n\t\t//we shouldnt do any of this if we generated a totally transparent pixel\n\t\tif(shaderOutput.a != 0)\n\t\t{\n\t\t\t//alpha test (don't have any test cases for this...? is it in the right place...?)\n\t\t\tif(gfx3d.renderState.enableAlphaTest)\n\t\t\t{\n\t\t\t\tif(shaderOutput.a < gfx3d.renderState.alphaTestRef)\n\t\t\t\t\tgoto rejected_fragment;\n\t\t\t}\n\n\t\t\t//handle polyids\n\t\t\tbool isOpaquePixel = shaderOutput.a == 31;\n\t\t\tif(isOpaquePixel)\n\t\t\t{\n\t\t\t\tdestFragment.polyid.opaque = polyAttr.polyid;\n\t\t\t\tdestFragment.isTranslucentPoly = polyAttr.translucent?1:0;\n\t\t\t\tdestFragment.fogged = polyAttr.fogged;\n\t\t\t\tdestFragmentColor = shaderOutput;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//dont overwrite pixels on translucent polys with the same polyids\n\t\t\t\tif(destFragment.polyid.translucent == polyAttr.polyid)\n\t\t\t\t\tgoto rejected_fragment;\n\t\t\t\n\t\t\t\t//originally we were using a test case of shadows-behind-trees in sm64ds\n\t\t\t\t//but, it looks bad in that game. this is actually correct\n\t\t\t\t//if this isnt correct, then complex shape cart shadows in mario kart don't work right\n\t\t\t\tdestFragment.polyid.translucent = polyAttr.polyid;\n\n\t\t\t\t//alpha blending and write color\n\t\t\t\talphaBlend(destFragmentColor, shaderOutput);\n\n\t\t\t\tdestFragment.fogged &= polyAttr.fogged;\n\t\t\t}\n\n\t\t\t//depth writing\n\t\t\tif(isOpaquePixel || polyAttr.translucentDepthWrite)\n\t\t\t\tdestFragment.depth = depth;\n\n\t\t}\n\n\t\t//shadow cases: (need multi-bit stencil buffer to cope with all of these, especially the mariokart compelx shadows)\n\t\t//1. sm64 (standing near signs and blocks)\n\t\t//2. mariokart (no glitches in shadow shape in kart selector)\n\t\t//3. mariokart (no junk beneath platform in kart selector / no shadow beneath grate floor in bowser stage)\n\t\t//(specifically, the shadows in mario kart are complicated concave shapes)\n\n\t\tgoto done;\n\t\tdepth_fail:\n\t\tif(shader.mode == 3 && polyAttr.polyid == 0)\n\t\t\tdestFragment.stencil++;\n\t\trejected_fragment:\n\t\tdone:\n\t\t;\n\n\t\tif(shader.mode == 3 && polyAttr.polyid != 0 && destFragment.stencil)\n\t\t\tdestFragment.stencil--;\n\t}\n\n\t//draws a single scanline\n\tFORCEINLINE void drawscanline(edge_fx_fl *pLeft, edge_fx_fl *pRight, bool lineHack)\n\t{\n\t\tint XStart = pLeft->X;\n\t\tint width = pRight->X - XStart;\n\n\t\t// HACK: workaround for vertical/slant line poly\n\t\tif (lineHack && width == 0)\n\t\t{\n\t\t\tint leftWidth = pLeft->XStep;\n\t\t\tif (pLeft->ErrorTerm + pLeft->Numerator >= pLeft->Denominator)\n\t\t\t\tleftWidth++;\n\t\t\tint rightWidth = pRight->XStep;\n\t\t\tif (pRight->ErrorTerm + pRight->Numerator >= pRight->Denominator)\n\t\t\t\trightWidth++;\n\t\t\twidth = max(1, max(abs(leftWidth), abs(rightWidth)));\n\t\t}\n\n\t\t//these are the starting values, taken from the left edge\n\t\tfloat invw = pLeft->invw.curr;\n\t\tfloat u = pLeft->u.curr;\n\t\tfloat v = pLeft->v.curr;\n\t\tfloat z = pLeft->z.curr;\n\t\tfloat color[3] = {\n\t\t\tpLeft->color[0].curr,\n\t\t\tpLeft->color[1].curr,\n\t\t\tpLeft->color[2].curr };\n\n\t\t//our dx values are taken from the steps up until the right edge\n\t\tfloat invWidth = 1.0f / width;\n\t\tfloat dinvw_dx = (pRight->invw.curr - invw) * invWidth;\n\t\tfloat du_dx = (pRight->u.curr - u) * invWidth;\n\t\tfloat dv_dx = (pRight->v.curr - v) * invWidth;\n\t\tfloat dz_dx = (pRight->z.curr - z) * invWidth;\n\t\tfloat dc_dx[3] = {\n\t\t\t(pRight->color[0].curr - color[0]) * invWidth,\n\t\t\t(pRight->color[1].curr - color[1]) * invWidth,\n\t\t\t(pRight->color[2].curr - color[2]) * invWidth };\n\n\t\tint adr = (pLeft->Y*engine->width)+XStart;\n\n\t\t//CONSIDER: in case some other math is wrong (shouldve been clipped OK), we might go out of bounds here.\n\t\t//better check the Y value.\n\t\tif(RENDERER && (pLeft->Y<0 || pLeft->Y>191)) {\n\t\t\tprintf(\"rasterizer rendering at y=%d! oops!\\n\",pLeft->Y);\n\t\t\treturn;\n\t\t}\n\t\tif(!RENDERER && (pLeft->Y<0 || pLeft->Y>=engine->height)) {\n\t\t\tprintf(\"rasterizer rendering at y=%d! oops!\\n\",pLeft->Y);\n\t\t\treturn;\n\t\t}\n\n\t\tint x = XStart;\n\n\t\tif(x<0)\n\t\t{\n\t\t\tif(RENDERER && !lineHack)\n\t\t\t{\n\t\t\t\tprintf(\"rasterizer rendering at x=%d! oops!\\n\",x);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinvw += dinvw_dx * -x;\n\t\t\tu += du_dx * -x;\n\t\t\tv += dv_dx * -x;\n\t\t\tz += dz_dx * -x;\n\t\t\tcolor[0] += dc_dx[0] * -x;\n\t\t\tcolor[1] += dc_dx[1] * -x;\n\t\t\tcolor[2] += dc_dx[2] * -x;\n\t\t\tadr += -x;\n\t\t\twidth -= -x;\n\t\t\tx = 0;\n\t\t}\n\t\tif(x+width > (RENDERER?256:engine->width))\n\t\t{\n\t\t\tif(RENDERER && !lineHack)\n\t\t\t{\n\t\t\t\tprintf(\"rasterizer rendering at x=%d! oops!\\n\",x+width-1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twidth = (RENDERER?256:engine->width)-x;\n\t\t}\n\n\t\twhile(width-- > 0)\n\t\t{\n\t\t\tpixel(adr,color[0],color[1],color[2],u,v,1.0f/invw,z);\n\t\t\tadr++;\n\t\t\tx++;\n\n\t\t\tinvw += dinvw_dx;\n\t\t\tu += du_dx;\n\t\t\tv += dv_dx;\n\t\t\tz += dz_dx;\n\t\t\tcolor[0] += dc_dx[0];\n\t\t\tcolor[1] += dc_dx[1];\n\t\t\tcolor[2] += dc_dx[2];\n\t\t}\n\t}\n\n\t//runs several scanlines, until an edge is finished\n\ttemplate<bool SLI>\n\tvoid runscanlines(edge_fx_fl *left, edge_fx_fl *right, bool horizontal, bool lineHack)\n\t{\n\t\t//oh lord, hack city for edge drawing\n\n\t\t//do not overstep either of the edges\n\t\tint Height = min(left->Height,right->Height);\n\t\tbool first=true;\n\n\t\t//HACK: special handling for horizontal line poly\n\t\tif (lineHack && left->Height == 0 && right->Height == 0 && left->Y<192 && left->Y>=0)\n\t\t{\n\t\t\tbool draw = (!SLI || (left->Y & SLI_MASK) == SLI_VALUE);\n\t\t\tif(draw) drawscanline(left,right,lineHack);\n\t\t}\n\n\t\twhile(Height--) {\n\t\t\tbool draw = (!SLI || (left->Y & SLI_MASK) == SLI_VALUE);\n\t\t\tif(draw) drawscanline(left,right,lineHack);\n\t\t\tconst int xl = left->X;\n\t\t\tconst int xr = right->X;\n\t\t\tconst int y = left->Y;\n\t\t\tleft->Step();\n\t\t\tright->Step();\n\n\t\t\tif(!RENDERER && _debug_thisPoly)\n\t\t\t{\n\t\t\t\t//debug drawing\n\t\t\t\tbool top = (horizontal&&first);\n\t\t\t\tbool bottom = (!Height&&horizontal);\n\t\t\t\tif(Height || top || bottom)\n\t\t\t\t{\n\t\t\t\t\tif(draw)\n\t\t\t\t\t{\n\t\t\t\t\t\tint nxl = left->X;\n\t\t\t\t\t\tint nxr = right->X;\n\t\t\t\t\t\tif(top) {\n\t\t\t\t\t\t\tint xs = min(xl,xr);\n\t\t\t\t\t\t\tint xe = max(xl,xr);\n\t\t\t\t\t\t\tfor(int x=xs;x<=xe;x++) {\n\t\t\t\t\t\t\t\tint adr = (y*engine->width)+x;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].r = 63;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].g = 0;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].b = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if(bottom) {\n\t\t\t\t\t\t\tint xs = min(xl,xr);\n\t\t\t\t\t\t\tint xe = max(xl,xr);\n\t\t\t\t\t\t\tfor(int x=xs;x<=xe;x++) {\n\t\t\t\t\t\t\t\tint adr = (y*engine->width)+x;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].r = 63;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].g = 0;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].b = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint xs = min(xl,nxl);\n\t\t\t\t\t\t\tint xe = max(xl,nxl);\n\t\t\t\t\t\t\tfor(int x=xs;x<=xe;x++) {\n\t\t\t\t\t\t\t\tint adr = (y*engine->width)+x;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].r = 63;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].g = 0;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].b = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\txs = min(xr,nxr);\n\t\t\t\t\t\t\txe = max(xr,nxr);\n\t\t\t\t\t\t\tfor(int x=xs;x<=xe;x++) {\n\t\t\t\t\t\t\t\tint adr = (y*engine->width)+x;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].r = 63;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].g = 0;\n\t\t\t\t\t\t\t\tengine->screenColor[adr].b = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t\n\t//rotates verts counterclockwise\n\ttemplate<int type>\n\tINLINE void rot_verts() {\n\t\t#define ROTSWAP(X) if(type>X) swap(verts[X-1],verts[X]);\n\t\tROTSWAP(1); ROTSWAP(2); ROTSWAP(3); ROTSWAP(4);\n\t\tROTSWAP(5); ROTSWAP(6); ROTSWAP(7); ROTSWAP(8); ROTSWAP(9);\n\t}\n\n\t//rotate verts until vert0.y is minimum, and then vert0.x is minimum in case of ties\n\t//this is a necessary precondition for our shape engine\n\ttemplate<int type>\n\tvoid sort_verts(bool backwards) {\n\t\t//if the verts are backwards, reorder them first\n\t\tif(backwards)\n\t\t\tfor(int i=0;i<type/2;i++)\n\t\t\t\tswap(verts[i],verts[type-i-1]);\n\n\t\tfor(;;)\n\t\t{\n\t\t\t//this was the only way we could get this to unroll\n\t\t\t#define CHECKY(X) if(type>X) if(verts[0]->y > verts[X]->y) goto doswap;\n\t\t\tCHECKY(1); CHECKY(2); CHECKY(3); CHECKY(4);\n\t\t\tCHECKY(5); CHECKY(6); CHECKY(7); CHECKY(8); CHECKY(9);\n\t\t\tbreak;\n\t\t\t\n\t\tdoswap:\n\t\t\trot_verts<type>();\n\t\t}\n\t\t\n\t\twhile(verts[0]->y == verts[1]->y && verts[0]->x > verts[1]->x)\n\t\t{\n\t\t\trot_verts<type>();\n\t\t\t// hack for VC++ 2010 (bug in compiler optimization?)\n\t\t\t// freeze on 3D\n\t\t\t// TODO: study it\n\t\t\t#if defined(_MSC_VER) && _MSC_VER == 1600\n\t\t\t\tSleep(0); // nop\n\t\t\t#endif\n\t\t}\n\t\t\n\t}\n\n\t//This function can handle any convex N-gon up to octagons\n\t//verts must be clockwise.\n\t//I didnt reference anything for this algorithm but it seems like I've seen it somewhere before.\n\t//Maybe it is like crow's algorithm\n\ttemplate<bool SLI>\n\tvoid shape_engine(int type, bool backwards, bool lineHack)\n\t{\n\t\tbool failure = false;\n\n\t\tswitch(type) {\n\t\t\tcase 3: sort_verts<3>(backwards); break;\n\t\t\tcase 4: sort_verts<4>(backwards); break;\n\t\t\tcase 5: sort_verts<5>(backwards); break;\n\t\t\tcase 6: sort_verts<6>(backwards); break;\n\t\t\tcase 7: sort_verts<7>(backwards); break;\n\t\t\tcase 8: sort_verts<8>(backwards); break;\n\t\t\tcase 9: sort_verts<9>(backwards); break;\n\t\t\tcase 10: sort_verts<10>(backwards); break;\n\t\t\tdefault: printf(\"skipping type %d\\n\",type); return;\n\t\t}\n\n\t\t//we are going to step around the polygon in both directions starting from vert 0.\n\t\t//right edges will be stepped over clockwise and left edges stepped over counterclockwise.\n\t\t//these variables track that stepping, but in order to facilitate wrapping we start extra high\n\t\t//for the counter we're decrementing.\n\t\tint lv = type, rv = 0;\n\n\t\tedge_fx_fl left, right;\n\t\tbool step_left = true, step_right = true;\n\t\tfor(;;) {\n\t\t\t//generate new edges if necessary. we must avoid regenerating edges when they are incomplete\n\t\t\t//so that they can be continued on down the shape\n\t\t\tassert(rv != type);\n\t\t\tint _lv = lv==type?0:lv; //make sure that we ask for vert 0 when the variable contains the starting value\n\t\t\tif(step_left) left = edge_fx_fl(_lv,lv-1,(VERT**)&verts, failure);\n\t\t\tif(step_right) right = edge_fx_fl(rv,rv+1,(VERT**)&verts, failure);\n\t\t\tstep_left = step_right = false;\n\n\t\t\t//handle a failure in the edge setup due to nutty polys\n\t\t\tif(failure) \n\t\t\t\treturn;\n\n\t\t\tbool horizontal = left.Y == right.Y;\n\t\t\trunscanlines<SLI>(&left,&right,horizontal, lineHack);\n\n\t\t\t//if we ran out of an edge, step to the next one\n\t\t\tif(right.Height == 0) {\n\t\t\t\tstep_right = true;\n\t\t\t\trv++;\n\t\t\t} \n\t\t\tif(left.Height == 0) {\n\t\t\t\tstep_left = true;\n\t\t\t\tlv--;\n\t\t\t}\n\n\t\t\t//this is our completion condition: when our stepped edges meet in the middle\n\t\t\tif(lv<=rv+1) break;\n\t\t}\n\n\t}\n\n\tSoftRasterizerEngine* engine;\n\n\ttemplate<bool SLI>\n\tFORCEINLINE void mainLoop(SoftRasterizerEngine* const engine)\n\t{\n\t\tthis->engine = engine;\n\t\tlastTexKey = NULL;\n\n\t\tu32 lastPolyAttr = 0;\n\t\tu32 lastTextureFormat = 0, lastTexturePalette = 0;\n\n\t\t//iterate over polys\n\t\tbool first=true;\n\t\tfor(int i=0;i<engine->clippedPolyCounter;i++)\n\t\t{\n\t\t\tif(!RENDERER) _debug_thisPoly = (i==engine->_debug_drawClippedUserPoly);\n\t\t\tif(!engine->polyVisible[i]) continue;\n\t\t\tpolynum = i;\n\n\t\t\tGFX3D_Clipper::TClippedPoly &clippedPoly = engine->clippedPolys[i];\n\t\t\tPOLY *poly = clippedPoly.poly;\n\t\t\tint type = clippedPoly.type;\n\n\t\t\tif(first || lastPolyAttr != poly->polyAttr)\n\t\t\t{\n\t\t\t\tpolyAttr.setup(poly->polyAttr);\n\t\t\t\tpolyAttr.translucent = poly->isTranslucent();\n\t\t\t\tlastPolyAttr = poly->polyAttr;\n\t\t\t}\n\n\n\t\t\tif(first || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette)\n\t\t\t{\n\t\t\t\tsampler.setup(poly->texParam);\n\t\t\t\tlastTextureFormat = poly->texParam;\n\t\t\t\tlastTexturePalette = poly->texPalette;\n\t\t\t}\n\n\t\t\tfirst = false;\n\n\t\t\tlastTexKey = engine->polyTexKeys[i];\n\n\t\t\t//hmm... shader gets setup every time because it depends on sampler which may have just changed\n\t\t\tsetupShader(poly->polyAttr);\n\n\t\t\tfor(int j=0;j<type;j++)\n\t\t\t\tthis->verts[j] = &clippedPoly.clipVerts[j];\n\t\t\tfor(int j=type;j<MAX_CLIPPED_VERTS;j++)\n\t\t\t\tthis->verts[j] = NULL;\n\n\t\t\tpolyAttr.backfacing = engine->polyBackfacing[i];\n\n\t\t\tshape_engine<SLI>(type,!polyAttr.backfacing, (poly->vtxFormat & 4) && CommonSettings.GFX3D_LineHack);\n\t\t}\n\t}\n\n\n}; //rasterizerUnit\n\nstatic SoftRasterizerEngine mainSoftRasterizer;\n\n#define _MAX_CORES 16\nstatic Task rasterizerUnitTask[_MAX_CORES];\nstatic RasterizerUnit<true> rasterizerUnit[_MAX_CORES];\nstatic RasterizerUnit<false> _HACK_viewer_rasterizerUnit;\nstatic unsigned int rasterizerCores = 0;\nstatic bool rasterizerUnitTasksInited = false;\n\nstatic void* execRasterizerUnit(void* arg)\n{\n\tintptr_t which = (intptr_t)arg;\n\trasterizerUnit[which].mainLoop<true>(&mainSoftRasterizer);\n\treturn 0;\n}\n\nstatic char SoftRastInit(void)\n{\n\tchar result = Default3D_Init();\n\tif (result == 0)\n\t{\n\t\treturn result;\n\t}\n\t\n\tif(!rasterizerUnitTasksInited)\n\t{\n\t\trasterizerUnitTasksInited = true;\n\n\t\t_HACK_viewer_rasterizerUnit.SLI_MASK = 1;\n\t\t_HACK_viewer_rasterizerUnit.SLI_VALUE = 0;\n\n\t\trasterizerCores = CommonSettings.num_cores;\n\t\tif (rasterizerCores > _MAX_CORES) \n\t\t\trasterizerCores = _MAX_CORES;\n\t\tif(CommonSettings.num_cores <= 1)\n\t\t{\n\t\t\trasterizerCores = 1;\n\t\t\trasterizerUnit[0].SLI_MASK = 0;\n\t\t\trasterizerUnit[0].SLI_VALUE = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (u8 i = 0; i < rasterizerCores; i++)\n\t\t\t{\n\t\t\t\trasterizerUnit[i].SLI_MASK = (rasterizerCores - 1);\n\t\t\t\trasterizerUnit[i].SLI_VALUE = i;\n\t\t\t\trasterizerUnitTask[i].start(false);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tstatic bool tables_generated = false;\n\tif(!tables_generated)\n\t{\n\t\ttables_generated = true;\n\n\t\tfor(int i=0;i<64;i++)\n\t\t{\n\t\t\tfor(int j=0;j<64;j++)\n\t\t\t{\n\t\t\t\tmodulate_table[i][j] = ((i+1) * (j+1) - 1) >> 6;\t\n\t\t\t\tfor(int a=0;a<32;a++)\n\t\t\t\t\tdecal_table[a][i][j] = ((i*a) + (j*(31-a))) >> 5;\n\t\t\t}\n\t\t}\n\n\t\t//these tables are used to increment through vert lists without having to do wrapping logic/math\n\t\tint idx=0;\n\t\tfor(int i=3;i<=8;i++)\n\t\t{\n\t\t\tindex_start_table[i-3] = idx;\n\t\t\tfor(int j=0;j<i;j++) {\n\t\t\t\tint a = j;\n\t\t\t\tint b = j+1;\n\t\t\t\tif(b==i) b = 0;\n\t\t\t\tindex_lookup_table[idx++] = a;\n\t\t\t\tindex_lookup_table[idx++] = b;\n\t\t\t}\n\t\t}\n\t}\n\n\tTexCache_Reset();\n\n\tprintf(\"SoftRast Initialized with cores=%d\\n\",rasterizerCores);\n\treturn 1;\n}\n\nstatic void SoftRastReset()\n{\n\tif (rasterizerCores > 1)\n\t{\n\t\tfor(unsigned int i = 0; i < rasterizerCores; i++)\n\t\t{\n\t\t\trasterizerUnitTask[i].finish();\n\t\t}\n\t}\n\t\n\tsoftRastHasNewData = false;\n\t\n\tDefault3D_Reset();\n}\n\nstatic void SoftRastClose()\n{\n\tif (rasterizerCores > 1)\n\t{\n\t\tfor(unsigned int i = 0; i < rasterizerCores; i++)\n\t\t{\n\t\t\trasterizerUnitTask[i].finish();\n\t\t\trasterizerUnitTask[i].shutdown();\n\t\t}\n\t}\n\t\n\trasterizerUnitTasksInited = false;\n\tsoftRastHasNewData = false;\n\t\n\tDefault3D_Close();\n}\n\nstatic void SoftRastVramReconfigureSignal()\n{\n\tDefault3D_VramReconfigureSignal();\n}\n\nstatic void SoftRastConvertFramebuffer()\n{\n\tmemcpy(gfx3d_convertedScreen,_screenColor,256*192*4);\n}\n\nvoid SoftRasterizerEngine::initFramebuffer(const int width, const int height, const bool clearImage)\n{\n\tconst int todo = width*height;\n\n\tFragment clearFragment;\n\tFragmentColor clearFragmentColor;\n\tclearFragment.isTranslucentPoly = 0;\n\tclearFragmentColor.r = GFX3D_5TO6(gfx3d.renderState.clearColor&0x1F);\n\tclearFragmentColor.g = GFX3D_5TO6((gfx3d.renderState.clearColor>>5)&0x1F);\n\tclearFragmentColor.b = GFX3D_5TO6((gfx3d.renderState.clearColor>>10)&0x1F);\n\tclearFragmentColor.a = ((gfx3d.renderState.clearColor>>16)&0x1F);\n\tclearFragment.polyid.opaque = (gfx3d.renderState.clearColor>>24)&0x3F;\n\t//special value for uninitialized translucent polyid. without this, fires in spiderman2 dont display\n\t//I am not sure whether it is right, though. previously this was cleared to 0, as a guess,\n\t//but in spiderman2 some fires with polyid 0 try to render on top of the background\n\tclearFragment.polyid.translucent = kUnsetTranslucentPolyID; \n\tclearFragment.depth = gfx3d.renderState.clearDepth;\n\tclearFragment.stencil = 0;\n\tclearFragment.isTranslucentPoly = 0;\n\tclearFragment.fogged = BIT15(gfx3d.renderState.clearColor);\n\tfor(int i=0;i<todo;i++)\n\t\tmemcpy(&screen[i], &clearFragment, sizeof(Fragment));\n\n\tif(clearImage)\n\t{\n\t\t//need to handle this somehow..\n\t\tassert(width==256 && height==192);\n\n\t\tu16* clearImage = (u16*)MMU.texInfo.textureSlotAddr[2];\n\t\tu16* clearDepth = (u16*)MMU.texInfo.textureSlotAddr[3];\n\n\t\t//the lion, the witch, and the wardrobe (thats book 1, suck it you new-school numberers)\n\t\t//uses the scroll registers in the main game engine\n\t\tu16 scroll = T1ReadWord(MMU.ARM9_REG,0x356); //CLRIMAGE_OFFSET\n\t\tu16 xscroll = scroll&0xFF;\n\t\tu16 yscroll = (scroll>>8)&0xFF;\n\n\t\tFragmentColor *dstColor = screenColor;\n\t\tFragment *dst = screen;\n\n\t\tfor(int iy=0;iy<192;iy++) {\n\t\t\tint y = ((iy + yscroll)&255)<<8;\n\t\t\tfor(int ix=0;ix<256;ix++) {\n\t\t\t\tint x = (ix + xscroll)&255;\n\t\t\t\tint adr = y + x;\n\t\t\t\t\n\t\t\t\t//this is tested by harry potter and the order of the phoenix.\n\t\t\t\t//TODO (optimization) dont do this if we are mapped to blank memory (such as in sonic chronicles)\n\t\t\t\t//(or use a special zero fill in the bulk clearing above)\n\t\t\t\tu16 col = clearImage[adr];\n\t\t\t\tdstColor->color = RGB15TO6665(col,31*(col>>15));\n\t\t\t\t\n\t\t\t\t//this is tested quite well in the sonic chronicles main map mode\n\t\t\t\t//where depth values are used for trees etc you can walk behind\n\t\t\t\tu16 depth = clearDepth[adr];\n\t\t\t\tdst->fogged = BIT15(depth);\n\t\t\t\tdst->depth = DS_DEPTH15TO24(depth);\n\n\t\t\t\tdstColor++;\n\t\t\t\tdst++;\n\t\t\t}\n\t\t}\n\t}\n\telse \n\t\tfor(int i=0;i<todo;i++)\n\t\t\tmemcpy(&screenColor[i], &clearFragmentColor, sizeof(FragmentColor));\n}\n\nvoid SoftRasterizerEngine::updateToonTable()\n{\n\t//convert the toon colors\n\tfor(int i=0;i<32;i++) {\n\t\t#ifdef WORDS_BIGENDIAN\n\t\t\tconst u32 u32temp = RGB15TO32_NOALPHA(gfx3d.renderState.u16ToonTable[i]);\n\t\t\ttoonTable[i].r = (u32temp >> 2) & 0x3F;\n\t\t\ttoonTable[i].g = (u32temp >> 10) & 0x3F;\n\t\t\ttoonTable[i].b = (u32temp >> 18) & 0x3F;\n\t\t#else\n\t\t\ttoonTable[i].color = (RGB15TO32_NOALPHA(gfx3d.renderState.u16ToonTable[i])>>2)&0x3F3F3F3F;\n\t\t#endif\n\t\t//printf(\"%d %d %d %d\\n\",toonTable[i].r,toonTable[i].g,toonTable[i].b,toonTable[i].a);\n\t}\n}\n\nvoid SoftRasterizerEngine::updateFogTable()\n{\n\tu8* fogDensity = MMU.MMU_MEM[ARMCPU_ARM9][0x40] + 0x360;\n#if 0\n\t//TODO - this might be a little slow; \n\t//we might need to hash all the variables and only recompute this when something changes\n\tconst int increment = (0x400 >> gfx3d.renderState.fogShift);\n\tfor(u32 i=0;i<32768;i++) {\n\t\tif(i<gfx3d.renderState.fogOffset) {\n\t\t\tfogTable[i] = fogDensity[0];\n\t\t\tcontinue;\n\t\t}\n\t\tfor(int j=0;j<32;j++) {\n\t\t\tu32 value = gfx3d.renderState.fogOffset + increment*(j+1);\n\t\t\tif(i<=value) {\n\t\t\t\tif(j==0) {\n\t\t\t\t\tfogTable[i] = fogDensity[0];\n\t\t\t\t\tgoto done;\n\t\t\t\t} else {\n\t\t\t\t\tfogTable[i] = ((value-i)*(fogDensity[j-1]) + (increment-(value-i))*(fogDensity[j]))/increment;\n\t\t\t\t\tgoto done;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfogTable[i] = (fogDensity[31]);\n\t\tdone: ;\n\t}\n#else\n\t// this should behave exactly the same as the previous loop,\n\t// except much faster. (because it's not a 2d loop and isn't so branchy either)\n\t// maybe it's fast enough to not need to be cached, now.\n\tconst int increment = ((1 << 10) >> gfx3d.renderState.fogShift);\n\tconst int incrementDivShift = 10 - gfx3d.renderState.fogShift;\n\tu32 fogOffset = min<u32>(max<u32>(gfx3d.renderState.fogOffset, 0), 32768);\n\tu32 iMin = min<u32>(32768, (( 1 + 1) << incrementDivShift) + fogOffset + 1 - increment);\n\tu32 iMax = min<u32>(32768, ((32 + 1) << incrementDivShift) + fogOffset + 1 - increment);\n\tassert(iMin <= iMax);\n\tmemset(fogTable, fogDensity[0], iMin);\n\tfor(u32 i = iMin; i < iMax; i++) {\n\t\tint num = (i - fogOffset + (increment-1));\n\t\tint j = (num >> incrementDivShift) - 1;\n\t\tu32 value = (num & ~(increment-1)) + fogOffset;\n\t\tu32 diff = value - i;\n\t\tassert(j >= 1 && j < 32);\n\t\tfogTable[i] = ((diff*(fogDensity[j-1]) + (increment-diff)*(fogDensity[j])) >> incrementDivShift);\n\t}\n\tmemset(fogTable+iMax, fogDensity[31], 32768-iMax);\n#endif\n}\n\nvoid SoftRasterizerEngine::updateFloatColors()\n{\n\t//convert colors to float to get more precision in case we need it\n\tfor(int i=0;i<vertlist->count;i++)\n\t\tvertlist->list[i].color_to_float();\n}\n\nSoftRasterizerEngine::SoftRasterizerEngine()\n\t: _debug_drawClippedUserPoly(-1)\n{\n\tthis->clippedPolys = clipper.clippedPolys = new GFX3D_Clipper::TClippedPoly[POLYLIST_SIZE*2];\n}\n\nvoid SoftRasterizerEngine::framebufferProcess()\n{\n\t// this looks ok although it's still pretty much a hack,\n\t// it needs to be redone with low-level accuracy at some point,\n\t// but that should probably wait until the shape renderer is more accurate.\n\t// a good test case for edge marking is Sonic Rush:\n\t// - the edges are completely sharp/opaque on the very brief title screen intro,\n\t// - the level-start intro gets a pseudo-antialiasing effect around the silhouette,\n\t// - the character edges in-level are clearly transparent, and also show well through shield powerups.\n\tif(gfx3d.renderState.enableEdgeMarking)\n\t{ \n\t\t//TODO - need to test and find out whether these get grabbed at flush time, or at render time\n\t\t//we can do this by rendering a 3d frame and then freezing the system, but only changing the edge mark colors\n\t\tFragmentColor edgeMarkColors[8];\n\t\tint edgeMarkDisabled[8];\n\n\t\tfor(int i=0;i<8;i++)\n\t\t{\n\t\t\tu16 col = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x330+i*2);\n\t\t\tedgeMarkColors[i].color = RGB15TO5555(col,gfx3d.state.enableAntialiasing ? 0x0F : 0x1F);\n\t\t\tedgeMarkColors[i].r = GFX3D_5TO6(edgeMarkColors[i].r);\n\t\t\tedgeMarkColors[i].g = GFX3D_5TO6(edgeMarkColors[i].g);\n\t\t\tedgeMarkColors[i].b = GFX3D_5TO6(edgeMarkColors[i].b);\n\n\t\t\t// this seems to be the only thing that selectively disables edge marking\n\t\t\tedgeMarkDisabled[i] = (col == 0x7FFF);\n\t\t}\n\n\t\tfor(int i=0,y=0;y<192;y++)\n\t\t{\n\t\t\tfor(int x=0;x<256;x++,i++)\n\t\t\t{\n\t\t\t\tFragment destFragment = screen[i];\n\t\t\t\tu8 self = destFragment.polyid.opaque;\n\t\t\t\tif(edgeMarkDisabled[self>>3]) continue;\n\t\t\t\tif(destFragment.isTranslucentPoly) continue;\n\n\t\t\t\t// > is used instead of != to prevent double edges\n\t\t\t\t// between overlapping polys of different IDs.\n\t\t\t\t// also note that the edge generally goes on the outside, not the inside, (maybe needs to change later)\n\t\t\t\t// and that polys with the same edge color can make edges against each other.\n\n\t\t\t\tFragmentColor edgeColor = edgeMarkColors[self>>3];\n\n#define PIXOFFSET(dx,dy) ((dx)+(256*(dy)))\n#define ISEDGE(dx,dy) ((x+(dx)!=256) && (x+(dx)!=-1) && (y+(dy)!=192) && (y+(dy)!=-1) && self > screen[i+PIXOFFSET(dx,dy)].polyid.opaque)\n#define DRAWEDGE(dx,dy) alphaBlend(screenColor[i+PIXOFFSET(dx,dy)], edgeColor)\n\n\t\t\t\tbool upleft    = ISEDGE(-1,-1);\n\t\t\t\tbool up        = ISEDGE( 0,-1);\n\t\t\t\tbool upright   = ISEDGE( 1,-1);\n\t\t\t\tbool left      = ISEDGE(-1, 0);\n\t\t\t\tbool right     = ISEDGE( 1, 0);\n\t\t\t\tbool downleft  = ISEDGE(-1, 1);\n\t\t\t\tbool down      = ISEDGE( 0, 1);\n\t\t\t\tbool downright = ISEDGE( 1, 1);\n\n\t\t\t\tif(upleft && upright && downleft && !downright)\n\t\t\t\t\tDRAWEDGE(-1,-1);\n\t\t\t\tif(up && !down)\n\t\t\t\t\tDRAWEDGE(0,-1);\n\t\t\t\tif(upleft && upright && !downleft && downright)\n\t\t\t\t\tDRAWEDGE(1,-1);\n\t\t\t\tif(left && !right)\n\t\t\t\t\tDRAWEDGE(-1,0);\n\t\t\t\tif(right && !left)\n\t\t\t\t\tDRAWEDGE(1,0);\n\t\t\t\tif(upleft && !upright && downleft && downright)\n\t\t\t\t\tDRAWEDGE(-1,1);\n\t\t\t\tif(down && !up)\n\t\t\t\t\tDRAWEDGE(0,1);\n\t\t\t\tif(!upleft && upright && downleft && downright)\n\t\t\t\t\tDRAWEDGE(1,1);\n\n#undef PIXOFFSET\n#undef ISEDGE\n#undef DRAWEDGE\n\n\t\t\t}\n\t\t}\n\t}\n\n\tif(gfx3d.renderState.enableFog)\n\t{\n\t\tu32 r = GFX3D_5TO6((gfx3d.renderState.fogColor)&0x1F);\n\t\tu32 g = GFX3D_5TO6((gfx3d.renderState.fogColor>>5)&0x1F);\n\t\tu32 b = GFX3D_5TO6((gfx3d.renderState.fogColor>>10)&0x1F);\n\t\tu32 a = (gfx3d.renderState.fogColor>>16)&0x1F;\n\t\tfor(int i=0;i<256*192;i++)\n\t\t{\n\t\t\tFragment &destFragment = screen[i];\n\t\t\tif(!destFragment.fogged) continue;\n\t\t\tFragmentColor &destFragmentColor = screenColor[i];\n\t\t\tu32 fogIndex = destFragment.depth>>9;\n\t\t\tassert(fogIndex<32768);\n\t\t\tu8 fog = fogTable[fogIndex];\n\t\t\tif(fog==127) fog=128;\n\t\t\tif(!gfx3d.renderState.enableFogAlphaOnly)\n\t\t\t{\n\t\t\t\tdestFragmentColor.r = ((128-fog)*destFragmentColor.r + r*fog)>>7;\n\t\t\t\tdestFragmentColor.g = ((128-fog)*destFragmentColor.g + g*fog)>>7;\n\t\t\t\tdestFragmentColor.b = ((128-fog)*destFragmentColor.b + b*fog)>>7;\n\t\t\t}\n\t\t\tdestFragmentColor.a = ((128-fog)*destFragmentColor.a + a*fog)>>7;\n\t\t}\n\t}\n\n\t////debug alpha channel framebuffer contents\n\t//for(int i=0;i<256*192;i++)\n\t//{\n\t//\tFragmentColor &destFragmentColor = screenColor[i];\n\t//\tdestFragmentColor.r = destFragmentColor.a;\n\t//\tdestFragmentColor.g = destFragmentColor.a;\n\t//\tdestFragmentColor.b = destFragmentColor.a;\n\t//}\n}\n\nvoid SoftRasterizerEngine::performClipping(bool hirez)\n{\n\t//submit all polys to clipper\n\tclipper.reset();\n\tfor(int i=0;i<polylist->count;i++)\n\t{\n\t\tPOLY* poly = &polylist->list[indexlist->list[i]];\n\t\tVERT* clipVerts[4] = {\n\t\t\t&vertlist->list[poly->vertIndexes[0]],\n\t\t\t&vertlist->list[poly->vertIndexes[1]],\n\t\t\t&vertlist->list[poly->vertIndexes[2]],\n\t\t\tpoly->type==4\n\t\t\t\t?&vertlist->list[poly->vertIndexes[3]]\n\t\t\t\t:NULL\n\t\t};\n\n\t\tif(hirez)\n\t\t\tclipper.clipPoly<true>(poly,clipVerts);\n\t\telse\n\t\t\tclipper.clipPoly<false>(poly,clipVerts);\n\t}\n\tclippedPolyCounter = clipper.clippedPolyCounter;\n}\n\ntemplate<bool CUSTOM> void SoftRasterizerEngine::performViewportTransforms(int width, int height)\n{\n\tconst float xfactor = width/256.0f;\n\tconst float yfactor = height/192.0f;\n\tconst float xmax = 256.0f*xfactor-(CUSTOM?0.001f:0); //fudge factor to keep from overrunning render buffers\n\tconst float ymax = 192.0f*yfactor-(CUSTOM?0.001f:0);\n\n\n\t//viewport transforms\n\tfor(int i=0;i<clippedPolyCounter;i++)\n\t{\n\t\tGFX3D_Clipper::TClippedPoly &poly = clippedPolys[i];\n\t\tfor(int j=0;j<poly.type;j++)\n\t\t{\n\t\t\tVERT &vert = poly.clipVerts[j];\n\n\t\t\t//homogeneous divide\n\t\t\tvert.coord[0] = (vert.coord[0]+vert.coord[3]) / (2*vert.coord[3]);\n\t\t\tvert.coord[1] = (vert.coord[1]+vert.coord[3]) / (2*vert.coord[3]);\n\t\t\tvert.coord[2] = (vert.coord[2]+vert.coord[3]) / (2*vert.coord[3]);\n\t\t\tvert.texcoord[0] /= vert.coord[3];\n\t\t\tvert.texcoord[1] /= vert.coord[3];\n\n\t\t\t//CONSIDER: do we need to guarantee that these are in bounds? perhaps not.\n\t\t\t//vert.coord[0] = max(0.0f,min(1.0f,vert.coord[0]));\n\t\t\t//vert.coord[1] = max(0.0f,min(1.0f,vert.coord[1]));\n\t\t\t//vert.coord[2] = max(0.0f,min(1.0f,vert.coord[2]));\n\n\t\t\t//perspective-correct the colors\n\t\t\tvert.fcolor[0] /= vert.coord[3];\n\t\t\tvert.fcolor[1] /= vert.coord[3];\n\t\t\tvert.fcolor[2] /= vert.coord[3];\n\n\t\t\t//viewport transformation\n\t\t\tVIEWPORT viewport;\n\t\t\tviewport.decode(poly.poly->viewport);\n\t\t\tvert.coord[0] *= viewport.width * xfactor;\n\t\t\tvert.coord[0] += viewport.x * xfactor;\n\t\t\tvert.coord[1] *= viewport.height * yfactor;\n\t\t\tvert.coord[1] += viewport.y * yfactor;\n\t\t\tvert.coord[1] = ymax - vert.coord[1];\n\n\t\t\t//well, i guess we need to do this to keep Princess Debut from rendering huge polys.\n\t\t\t//there must be something strange going on\n\t\t\tvert.coord[0] = max(0.0f,min(xmax,vert.coord[0]));\n\t\t\tvert.coord[1] = max(0.0f,min(ymax,vert.coord[1]));\n\t\t}\n\t}\n}\n//these templates needed to be instantiated manually\ntemplate void SoftRasterizerEngine::performViewportTransforms<true>(int width, int height);\ntemplate void SoftRasterizerEngine::performViewportTransforms<false>(int width, int height);\n\nvoid SoftRasterizerEngine::performCoordAdjustment(const bool skipBackfacing)\n{\n\tfor(int i=0;i<clippedPolyCounter;i++)\n\t{\n\t\tGFX3D_Clipper::TClippedPoly &clippedPoly = clippedPolys[i];\n\t\tint type = clippedPoly.type;\n\t\tVERT* verts = &clippedPoly.clipVerts[0];\n\n\t\t//here is a hack which needs to be removed.\n\t\t//at some point our shape engine needs these to be converted to \"fixed point\"\n\t\t//which is currently just a float\n\t\tfor(int j=0;j<type;j++)\n\t\t\tfor(int k=0;k<2;k++)\n\t\t\t\tverts[j].coord[k] = (float)iround(16.0f * verts[j].coord[k]);\n\t}\n}\n\nvoid SoftRasterizerEngine::setupTextures(const bool skipBackfacing)\n{\n\tTexCacheItem* lastTexKey = NULL;\n\tu32 lastTextureFormat = 0, lastTexturePalette = 0;\n\tbool needInitTexture = true;\n\tfor(int i=0;i<clippedPolyCounter;i++)\n\t{\n\t\tGFX3D_Clipper::TClippedPoly &clippedPoly = clippedPolys[i];\n\t\tPOLY *poly = clippedPoly.poly;\n\n\t\tPolyAttr polyAttr;\n\t\tpolyAttr.setup(poly->polyAttr);\n\n\t\t//make sure all the textures we'll need are cached\n\t\t//(otherwise on a multithreaded system there will be multiple writers-- \n\t\t//this SHOULD be read-only, although some day the texcache may collect statistics or something\n\t\t//and then it won't be safe.\n\t\tif(needInitTexture || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette)\n\t\t{\n\t\t\tlastTexKey = TexCache_SetTexture(TexFormat_15bpp,poly->texParam,poly->texPalette);\n\t\t\tlastTextureFormat = poly->texParam;\n\t\t\tlastTexturePalette = poly->texPalette;\n\t\t\tneedInitTexture = false;\n\t\t}\n\n\t\t//printf(\"%08X %d\\n\",poly->texParam,rasterizerUnit[0].textures.currentNum);\n\t\tpolyTexKeys[i] = lastTexKey;\n\t}\n}\n\nvoid SoftRasterizerEngine::performBackfaceTests()\n{\n\tfor(int i=0;i<clippedPolyCounter;i++)\n\t{\n\t\tGFX3D_Clipper::TClippedPoly &clippedPoly = clippedPolys[i];\n\t\tPOLY *poly = clippedPoly.poly;\n\t\tint type = clippedPoly.type;\n\t\tVERT* verts = &clippedPoly.clipVerts[0];\n\n\t\tPolyAttr polyAttr;\n\t\tpolyAttr.setup(poly->polyAttr);\n\n\t\t//HACK: backface culling\n\t\t//this should be moved to gfx3d, but first we need to redo the way the lists are built\n\t\t//because it is too convoluted right now.\n\t\t//(must we throw out verts if a poly gets backface culled? if not, then it might be easier)\n\t\t\t\n\t\t//an older approach\n\t\t//(not good enough for quads and other shapes)\n\t\t//float ab[2], ac[2]; Vector2Copy(ab, verts[1].coord); Vector2Copy(ac, verts[2].coord); Vector2Subtract(ab, verts[0].coord); \n\t\t//Vector2Subtract(ac, verts[0].coord); float cross = Vector2Cross(ab, ac); polyAttr.backfacing = (cross>0); \n\n\t\t//a better approach\n\t\t// we have to support somewhat non-convex polygons (see NSMB world map 1st screen).\n\t\t// this version should handle those cases better.\n\t\tint n = type - 1;\n\t\tfloat facing = (verts[0].y + verts[n].y) * (verts[0].x - verts[n].x)\n\t\t\t\t\t + (verts[1].y + verts[0].y) * (verts[1].x - verts[0].x)\n\t\t\t\t\t + (verts[2].y + verts[1].y) * (verts[2].x - verts[1].x);\n\t\tfor(int j = 2; j < n; j++)\n\t\t\tfacing += (verts[j+1].y + verts[j].y) * (verts[j+1].x - verts[j].x);\n\t\t\n\t\tpolyBackfacing[i] = polyAttr.backfacing = (facing < 0);\n\t\tpolyVisible[i] = polyAttr.isVisible(polyAttr.backfacing);\n\t}\n}\n\nvoid _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine)\n{\n\t_HACK_viewer_rasterizerUnit.mainLoop<false>(engine);\n}\n\nstatic void SoftRastRender()\n{\n\t// Force threads to finish before rendering with new data\n\tif (rasterizerCores > 1)\n\t{\n\t\tfor(unsigned int i = 0; i < rasterizerCores; i++)\n\t\t{\n\t\t\trasterizerUnitTask[i].finish();\n\t\t}\n\t}\n\t\n\tmainSoftRasterizer.polylist = gfx3d.polylist;\n\tmainSoftRasterizer.vertlist = gfx3d.vertlist;\n\tmainSoftRasterizer.indexlist = &gfx3d.indexlist;\n\tmainSoftRasterizer.screen = _screen;\n\tmainSoftRasterizer.screenColor = _screenColor;\n\tmainSoftRasterizer.width = 256;\n\tmainSoftRasterizer.height = 192;\n\n\t//setup fog variables (but only if fog is enabled)\n\tif(gfx3d.renderState.enableFog)\n\t\tmainSoftRasterizer.updateFogTable();\n\t\n\tmainSoftRasterizer.initFramebuffer(256,192,gfx3d.renderState.enableClearImage?true:false);\n\tmainSoftRasterizer.updateToonTable();\n\tmainSoftRasterizer.updateFloatColors();\n\tmainSoftRasterizer.performClipping(CommonSettings.GFX3D_HighResolutionInterpolateColor);\n\tmainSoftRasterizer.performViewportTransforms<false>(256,192);\n\tmainSoftRasterizer.performBackfaceTests();\n\tmainSoftRasterizer.performCoordAdjustment(true);\n\tmainSoftRasterizer.setupTextures(true);\n\n\tsoftRastHasNewData = true;\n\t\n\tif (rasterizerCores > 1)\n\t{\n\t\tfor(unsigned int i = 0; i < rasterizerCores; i++)\n\t\t{\n\t\t\trasterizerUnitTask[i].execute(&execRasterizerUnit, (void *)i);\n\t\t}\n\t}\n\telse\n\t{\n\t\trasterizerUnit[0].mainLoop<false>(&mainSoftRasterizer);\n\t}\n}\n\nstatic void SoftRastRenderFinish()\n{\n\tif (!softRastHasNewData)\n\t{\n\t\treturn;\n\t}\n\t\n\tif (rasterizerCores > 1)\n\t{\n\t\tfor(unsigned int i = 0; i < rasterizerCores; i++)\n\t\t{\n\t\t\trasterizerUnitTask[i].finish();\n\t\t}\n\t}\n\t\n\tTexCache_EvictFrame();\n\t\n\tmainSoftRasterizer.framebufferProcess();\n\t\n\t//\tprintf(\"rendered %d of %d polys after backface culling\\n\",gfx3d.polylist->count-culled,gfx3d.polylist->count);\n\tSoftRastConvertFramebuffer();\n\t\n\tsoftRastHasNewData = false;\n}\n\nGPU3DInterface gpu3DRasterize = {\n\t\"SoftRasterizer\",\n\tSoftRastInit,\n\tSoftRastReset,\n\tSoftRastClose,\n\tSoftRastRender,\n\tSoftRastRenderFinish,\n\tSoftRastVramReconfigureSignal\n};\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/rasterize.h",
    "content": "/*\n\tCopyright (C) 2009-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _RASTERIZE_H_\n#define _RASTERIZE_H_\n\n#include \"render3D.h\"\n#include \"gfx3d.h\"\n\nextern GPU3DInterface gpu3DRasterize;\n\nunion FragmentColor {\n\tu32 color;\n\tstruct {\n\t\tu8 r,g,b,a;\n\t};\n};\n\ninline FragmentColor MakeFragmentColor(u8 r, u8 g,u8 b,u8 a)\n{\n\tFragmentColor ret;\n\tret.r = r; ret.g = g; ret.b = b; ret.a = a;\n\treturn ret;\n}\n\nstruct Fragment\n{\n\tu32 depth;\n\n\tstruct\n\t{\n\t\tu8 opaque, translucent;\n\t} polyid;\n\n\tu8 stencil;\n\n\tstruct\n\t{\n\t\tu8 isTranslucentPoly:1;\n\t\tu8 fogged:1;\n\t};\n};\n\nclass TexCacheItem;\n\nclass SoftRasterizerEngine\n{\npublic:\n\t//debug:\n\tint _debug_drawClippedUserPoly;\n\n\tSoftRasterizerEngine();\n\t\n\tvoid initFramebuffer(const int width, const int height, const bool clearImage);\n\tvoid framebufferProcess();\n\tvoid updateToonTable();\n\tvoid updateFogTable();\n\tvoid updateFloatColors();\n\tvoid performClipping(bool hirez);\n\ttemplate<bool CUSTOM> void performViewportTransforms(int width, int height);\n\tvoid performCoordAdjustment(const bool skipBackfacing);\n\tvoid performBackfaceTests();\n\tvoid setupTextures(const bool skipBackfacing);\n\n\tFragmentColor toonTable[32];\n\tu8 fogTable[32768];\n\tGFX3D_Clipper clipper;\n\tGFX3D_Clipper::TClippedPoly *clippedPolys;\n\tint clippedPolyCounter;\n\tTexCacheItem* polyTexKeys[POLYLIST_SIZE];\n\tbool polyVisible[POLYLIST_SIZE];\n\tbool polyBackfacing[POLYLIST_SIZE];\n\tFragment *screen;\n\tFragmentColor *screenColor;\n\tPOLYLIST* polylist;\n\tVERTLIST* vertlist;\n\tINDEXLIST* indexlist;\n\tint width, height;\n};\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/readwrite.cpp",
    "content": "/*\n\tCopyright (C) 2006-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"readwrite.h\"\n#include \"types.h\"\n\n//well. just for the sake of consistency\nint write8le(u8 b, EMUFILE*os)\n{\n\tos->fwrite((char*)&b,1);\n\treturn 1;\n}\n\n//well. just for the sake of consistency\nint read8le(u8 *Bufo, EMUFILE*is)\n{\n\tif(is->_fread((char*)Bufo,1) != 1)\n\t\treturn 0;\n\treturn 1;\n}\n\n///writes a little endian 16bit value to the specified file\nint write16le(u16 b, EMUFILE *fp)\n{\n\tu8 s[2];\n\ts[0]=(u8)b;\n\ts[1]=(u8)(b>>8);\n\tfp->fwrite(s,2);\n\treturn 2;\n}\n\n\n///writes a little endian 32bit value to the specified file\nint write32le(u32 b, EMUFILE *fp)\n{\n\tu8 s[4];\n\ts[0]=(u8)b;\n\ts[1]=(u8)(b>>8);\n\ts[2]=(u8)(b>>16);\n\ts[3]=(u8)(b>>24);\n\tfp->fwrite(s,4);\n\treturn 4;\n}\n\nvoid writebool(bool b, EMUFILE* os) { write32le(b?1:0,os); }\n\nint write64le(u64 b, EMUFILE* os)\n{\n\tu8 s[8];\n\ts[0]=(u8)b;\n\ts[1]=(u8)(b>>8);\n\ts[2]=(u8)(b>>16);\n\ts[3]=(u8)(b>>24);\n\ts[4]=(u8)(b>>32);\n\ts[5]=(u8)(b>>40);\n\ts[6]=(u8)(b>>48);\n\ts[7]=(u8)(b>>56);\n\tos->fwrite((char*)&s,8);\n\treturn 8;\n}\n\n\nint read32le(u32 *Bufo, EMUFILE *fp)\n{\n\tu32 buf;\n\tif(fp->_fread(&buf,4)<4)\n\t\treturn 0;\n#ifdef LOCAL_LE\n\t*(u32*)Bufo=buf;\n#else\n\t*(u32*)Bufo=((buf&0xFF)<<24)|((buf&0xFF00)<<8)|((buf&0xFF0000)>>8)|((buf&0xFF000000)>>24);\n#endif\n\treturn 1;\n}\n\nint read16le(u16 *Bufo, EMUFILE *is)\n{\n\tu16 buf;\n\tif(is->_fread((char*)&buf,2) != 2)\n\t\treturn 0;\n#ifdef LOCAL_LE\n\t*Bufo=buf;\n#else\n\t*Bufo = LE_TO_LOCAL_16(buf);\n#endif\n\treturn 1;\n}\n\nint read64le(u64 *Bufo, EMUFILE *is)\n{\n\tu64 buf;\n\tif(is->_fread((char*)&buf,8) != 8)\n\t\treturn 0;\n#ifdef LOCAL_LE\n\t*Bufo=buf;\n#else\n\t*Bufo = LE_TO_LOCAL_64(buf);\n#endif\n\treturn 1;\n}\n\nstatic int read32le(u32 *Bufo, std::istream *is)\n{\n\tu32 buf;\n\tif(is->read((char*)&buf,4).gcount() != 4)\n\t\treturn 0;\n#ifdef LOCAL_LE\n\t*(u32*)Bufo=buf;\n#else\n\t*(u32*)Bufo=((buf&0xFF)<<24)|((buf&0xFF00)<<8)|((buf&0xFF0000)>>8)|((buf&0xFF000000)>>24);\n#endif\n\treturn 1;\n}\n\nint readbool(bool *b, EMUFILE* is)\n{\n\tu32 temp;\n\tint ret = read32le(&temp,is);\n\t*b = temp!=0;\n\treturn ret;\n}\n\nint readbuffer(std::vector<u8> &vec, EMUFILE* is)\n{\n\tu32 size;\n\tif(read32le(&size,is) != 1) return 0;\n\tvec.resize(size);\n\tif(size>0) is->fread((char*)&vec[0],size);\n\treturn 1;\n}\n\nint writebuffer(std::vector<u8>& vec, EMUFILE* os)\n{\n\tu32 size = vec.size();\n\twrite32le(size,os);\n\tif(size>0) os->fwrite((char*)&vec[0],size);\n\treturn 1;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/readwrite.h",
    "content": "/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _READWRITE_H_\n#define _READWRITE_H_\n\n#include \"types.h\"\n#include \"emufile.h\"\n#include <iostream>\n#include <cstdio>\n#include <vector>\n\n//well. just for the sake of consistency\nint write8le(u8 b, EMUFILE *fp);\ninline int write8le(u8* b, EMUFILE *fp) { return write8le(*b,fp); }\nint write16le(u16 b, EMUFILE* os);\nint write32le(u32 b, EMUFILE* os);\nint write64le(u64 b, EMUFILE* os);\ninline int write_double_le(double b, EMUFILE*is) { u64 temp = double_to_u64(b); int ret = write64le(temp,is); return ret; }\n\nint read8le(u8 *Bufo, EMUFILE*is);\nint read16le(u16 *Bufo, EMUFILE*is);\ninline int read16le(s16 *Bufo, EMUFILE*is) { return read16le((u16*)Bufo,is); }\nint read32le(u32 *Bufo, EMUFILE*is);\ninline int read32le(s32 *Bufo, EMUFILE*is) { return read32le((u32*)Bufo,is); }\nint read64le(u64 *Bufo, EMUFILE*is);\ninline int read_double_le(double *Bufo, EMUFILE*is) { u64 temp; int ret = read64le(&temp,is); *Bufo = u64_to_double(temp); return ret; }\nint read16le(u16 *Bufo, std::istream *is);\n\n\ntemplate<typename T>\nint readle(T *Bufo, EMUFILE*is)\n{\n\tCTASSERT(sizeof(T)==1||sizeof(T)==2||sizeof(T)==4||sizeof(T)==8);\n\tswitch(sizeof(T)) {\n\t\tcase 1: return read8le((u8*)Bufo,is);\n\t\tcase 2: return read16le((u16*)Bufo,is);\n\t\tcase 4: return read32le((u32*)Bufo,is);\n\t\tcase 8: return read64le((u64*)Bufo,is);\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\n\n\nint readbool(bool *b, EMUFILE* is);\nvoid writebool(bool b, EMUFILE* os);\n\nint readbuffer(std::vector<u8> &vec, EMUFILE* is);\nint writebuffer(std::vector<u8>& vec, EMUFILE* os);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/registers.h",
    "content": "/*\n\tCopyright (C) 2006 Theo Berkau\n\tCopyright (C) 2006-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef REGISTERS_H\n#define REGISTERS_H\n\n#define REG_REGION_MASK                         0x0FFFEF80\n#define REG_BASE_DISPx                          0x04000000\n#define REG_BASE_DISPA                          0x04000000\n#define REG_BASE_DISPB                          0x04001000\n#define REG_BASE_DMA                            0x04000080\n#define REG_BASE_SIORTCTIMERS                   0x04000100\n#define REG_BASE_ROMIPC                         0x04000180\n#define REG_BASE_MEMIRQ                         0x04000200\n#define REG_BASE_MATH                           0x04000280\n#define REG_BASE_OTHER                          0x04000300\n#define REG_BASE_RCVPORTS                       0x04100000\n\n// Display Engine A\n#define REG_DISPA_DISPCNT                       0x04000000\n#define REG_DISPA_VCOUNT                        0x04000006\n#define REG_DISPA_BG0CNT                        0x04000008\n#define REG_DISPA_BG1CNT                        0x0400000A\n#define REG_DISPA_BG2CNT                        0x0400000C\n#define REG_DISPA_BG3CNT                        0x0400000E\n#define REG_DISPA_BG0HOFS                       0x04000010\n#define REG_DISPA_BG0VOFS                       0x04000012\n#define REG_DISPA_BG1HOFS                       0x04000014\n#define REG_DISPA_BG1VOFS                       0x04000016\n#define REG_DISPA_BG2HOFS                       0x04000018\n#define REG_DISPA_BG2VOFS                       0x0400001A\n#define REG_DISPA_BG3HOFS                       0x0400001C\n#define REG_DISPA_BG3VOFS                       0x0400001E\n#define REG_DISPA_BG2PA                         0x04000020\n#define REG_DISPA_BG2PB                         0x04000022\n#define REG_DISPA_BG2PC                         0x04000024\n#define REG_DISPA_BG2PD                         0x04000026\n#define REG_DISPA_BG2XL                         0x04000028\n#define REG_DISPA_BG2XH                         0x0400002A\n#define REG_DISPA_BG2YL                         0x0400002C\n#define REG_DISPA_BG2YH                         0x0400002E\n#define REG_DISPA_BG3PA                         0x04000030\n#define REG_DISPA_BG3PB                         0x04000032\n#define REG_DISPA_BG3PC                         0x04000034\n#define REG_DISPA_BG3PD                         0x04000036\n#define REG_DISPA_BG3XL                         0x04000038\n#define REG_DISPA_BG3XH                         0x0400003A\n#define REG_DISPA_BG3YL                         0x0400003C\n#define REG_DISPA_BG3YH                         0x0400003E\n#define REG_DISPA_WIN0H                         0x04000040\n#define REG_DISPA_WIN1H                         0x04000042\n#define REG_DISPA_WIN0V                         0x04000044\n#define REG_DISPA_WIN1V                         0x04000046\n#define REG_DISPA_WININ                         0x04000048\n#define REG_DISPA_WINOUT                        0x0400004A\n#define REG_DISPA_MOSAIC                        0x0400004C\n#define REG_DISPA_BLDCNT                        0x04000050\n#define REG_DISPA_BLDALPHA                      0x04000052\n#define REG_DISPA_BLDY                          0x04000054\n#define REG_DISPA_MASTERBRIGHT                  0x0400006C\n\n// DMA\n#define _REG_DMA_CONTROL_MIN                    0x040000B0\n#define REG_DMA0SAD                             0x040000B0\n#define REG_DMA0SADL                            0x040000B0\n#define REG_DMA0SADH                            0x040000B2\n#define REG_DMA0DAD                             0x040000B4\n#define REG_DMA0DADL                            0x040000B4\n#define REG_DMA0DADH                            0x040000B6\n#define REG_DMA0CNTL                            0x040000B8\n#define REG_DMA0CNTH                            0x040000BA\n#define REG_DMA1SAD                             0x040000BC\n#define REG_DMA1SADL                            0x040000BC\n#define REG_DMA1SADH                            0x040000BE\n#define REG_DMA1DAD                             0x040000C0\n#define REG_DMA1DADL                            0x040000C0\n#define REG_DMA1DADH                            0x040000C2\n#define REG_DMA1CNTL                            0x040000C4\n#define REG_DMA1CNTH                            0x040000C6\n#define REG_DMA2SAD                             0x040000C8\n#define REG_DMA2SADL                            0x040000C8\n#define REG_DMA2SADH                            0x040000CA\n#define REG_DMA2DAD                             0x040000CC\n#define REG_DMA2DADL                            0x040000CC\n#define REG_DMA2DADH                            0x040000CE\n#define REG_DMA2CNTL                            0x040000D0\n#define REG_DMA2CNTH                            0x040000D2\n#define REG_DMA3SAD                             0x040000D4\n#define REG_DMA3SADL                            0x040000D4\n#define REG_DMA3SADH                            0x040000D6\n#define REG_DMA3DAD                             0x040000D8\n#define REG_DMA3DADL                            0x040000D8\n#define REG_DMA3DADH                            0x040000DA\n#define REG_DMA3CNTL                            0x040000DC\n#define REG_DMA3CNTH                            0x040000DE\n#define _REG_DMA_CONTROL_MAX                    0x040000DF\n#define REG_DMA0FILL                            0x040000E0\n#define REG_DMA1FILL                            0x040000E4\n#define REG_DMA2FILL                            0x040000E8\n#define REG_DMA3FILL                            0x040000EC\n\n// Timers\n#define REG_TM0CNTL                             0x04000100\n#define REG_TM0CNTH                             0x04000102\n#define REG_TM1CNTL                             0x04000104\n#define REG_TM1CNTH                             0x04000106\n#define REG_TM2CNTL                             0x04000108\n#define REG_TM2CNTH                             0x0400010A\n#define REG_TM3CNTL                             0x0400010C\n#define REG_TM3CNTH                             0x0400010E\n\n// SIO/Keypad Input/RTC\n#define REG_SIODATA32                           0x04000120\n#define REG_SIOCNT                              0x04000128\n#define REG_KEYINPUT                            0x04000130\n#define REG_KEYCNT                              0x04000132\n#define REG_RCNT                                0x04000134\n#define REG_EXTKEYIN                            0x04000136\n#define REG_RTC                                 0x04000138\n\n// IPC\n#define REG_IPCSYNC                             0x04000180\n#define REG_IPCFIFOCNT                          0x04000184\n#define REG_IPCFIFOSEND                         0x04000188\n\n// ROM\n#define REG_AUXSPICNT                           0x040001A0\n#define REG_AUXSPIDATA                          0x040001A2\n#define REG_GCROMCTRL                           0x040001A4\n#define REG_GCCMDOUT                            0x040001A8\n#define REG_ENCSEED0L                           0x040001B0\n#define REG_ENCSEED1L                           0x040001B4\n#define REG_ENCSEED0H                           0x040001B8\n#define REG_ENCSEED1H                           0x040001BC\n#define REG_SPICNT                              0x040001C0\n#define REG_SPIDATA                             0x040001C2\n\n// Memory/IRQ\n#define REG_EXMEMCNT                            0x04000204\n#define REG_WIFIWAITCNT                         0x04000206\n#define REG_IME                                 0x04000208\n#define REG_IE                                  0x04000210\n#define REG_IF                                  0x04000214\n#define REG_VRAMCNTA                            0x04000240\n#define REG_VRAMSTAT                            0x04000240\n#define REG_VRAMCNTB                            0x04000241\n#define REG_WRAMSTAT                            0x04000241\n#define REG_VRAMCNTC                            0x04000242\n#define REG_VRAMCNTD                            0x04000243\n#define REG_VRAMCNTE                            0x04000244\n#define REG_VRAMCNTF                            0x04000245\n#define REG_VRAMCNTG                            0x04000246\n#define REG_WRAMCNT                             0x04000247\n#define REG_VRAMCNTH                            0x04000248\n#define REG_VRAMCNTI                            0x04000249\n\n// Math\n#define REG_DIVCNT                              0x04000280\n#define REG_DIVNUMER                            0x04000290\n#define REG_DIVDENOM                            0x04000298\n#define REG_DIVRESULT                           0x040002A0\n#define REG_DIVREMRESULT                        0x040002A8\n#define REG_SQRTCNT                             0x040002B0\n#define REG_SQRTRESULT                          0x040002B4\n#define REG_SQRTPARAM                           0x040002B8\n\n// Other \n#define REG_POSTFLG                             0x04000300\n#define REG_HALTCNT                             0x04000301\n#define REG_POWCNT1                             0x04000304\n#define REG_POWCNT2                             0x04000304\n#define REG_BIOSPROT                            0x04000308\n\n#define REG_DISPB_DISPCNT                       0x04001000\n#define REG_DISPB_BG0CNT                        0x04001008\n#define REG_DISPB_BG1CNT                        0x0400100A\n#define REG_DISPB_BG2CNT                        0x0400100C\n#define REG_DISPB_BG3CNT                        0x0400100E\n#define REG_DISPB_BG0HOFS                       0x04001010\n#define REG_DISPB_BG0VOFS                       0x04001012\n#define REG_DISPB_BG1HOFS                       0x04001014\n#define REG_DISPB_BG1VOFS                       0x04001016\n#define REG_DISPB_BG2HOFS                       0x04001018\n#define REG_DISPB_BG2VOFS                       0x0400101A\n#define REG_DISPB_BG3HOFS                       0x0400101C\n#define REG_DISPB_BG3VOFS                       0x0400101E\n#define REG_DISPB_BG2PA                         0x04001020\n#define REG_DISPB_BG2PB                         0x04001022\n#define REG_DISPB_BG2PC                         0x04001024\n#define REG_DISPB_BG2PD                         0x04001026\n#define REG_DISPB_BG2XL                         0x04001028\n#define REG_DISPB_BG2XH                         0x0400102A\n#define REG_DISPB_BG2YL                         0x0400102C\n#define REG_DISPB_BG2YH                         0x0400102E\n#define REG_DISPB_BG3PA                         0x04001030\n#define REG_DISPB_BG3PB                         0x04001032\n#define REG_DISPB_BG3PC                         0x04001034\n#define REG_DISPB_BG3PD                         0x04001036\n#define REG_DISPB_BG3XL                         0x04001038\n#define REG_DISPB_BG3XH                         0x0400103A\n#define REG_DISPB_BG3YL                         0x0400103C\n#define REG_DISPB_BG3YH                         0x0400103E\n#define REG_DISPB_WIN0H                         0x04001040\n#define REG_DISPB_WIN1H                         0x04001042\n#define REG_DISPB_WIN0V                         0x04001044\n#define REG_DISPB_WIN1V                         0x04001046\n#define REG_DISPB_WININ                         0x04001048\n#define REG_DISPB_WINOUT                        0x0400104A\n#define REG_DISPB_MOSAIC                        0x0400104C\n#define REG_DISPB_BLDCNT                        0x04001050\n#define REG_DISPB_BLDALPHA                      0x04001052\n#define REG_DISPB_BLDY                          0x04001054\n#define REG_DISPB_MASTERBRIGHT                  0x0400106C\n\n// Receive ports\n#define REG_IPCFIFORECV                         0x04100000\n#define REG_GCDATAIN                            0x04100010\n\n\n\n\n\n#define REG_DISPB                               0x00001000\n// core A and B specific\n#define REG_DISPx_DISPCNT                       0x04000000\n#define REG_DISPx_VCOUNT                        0x04000006\n#define REG_DISPx_BG0CNT                        0x04000008\n#define REG_DISPx_BG1CNT                        0x0400000A\n#define REG_DISPx_BG2CNT                        0x0400000C\n#define REG_DISPx_BG3CNT                        0x0400000E\n#define REG_DISPx_BG0HOFS                       0x04000010\n#define REG_DISPx_BG0VOFS                       0x04000012\n#define REG_DISPx_BG1HOFS                       0x04000014\n#define REG_DISPx_BG1VOFS                       0x04000016\n#define REG_DISPx_BG2HOFS                       0x04000018\n#define REG_DISPx_BG2VOFS                       0x0400001A\n#define REG_DISPx_BG3HOFS                       0x0400001C\n#define REG_DISPx_BG3VOFS                       0x0400001E\n#define REG_DISPx_BG2PA                         0x04000020\n#define REG_DISPx_BG2PB                         0x04000022\n#define REG_DISPx_BG2PC                         0x04000024\n#define REG_DISPx_BG2PD                         0x04000026\n#define REG_DISPx_BG2XL                         0x04000028\n#define REG_DISPx_BG2XH                         0x0400002A\n#define REG_DISPx_BG2YL                         0x0400002C\n#define REG_DISPx_BG2YH                         0x0400002E\n#define REG_DISPx_BG3PA                         0x04000030\n#define REG_DISPx_BG3PB                         0x04000032\n#define REG_DISPx_BG3PC                         0x04000034\n#define REG_DISPx_BG3PD                         0x04000036\n#define REG_DISPx_BG3XL                         0x04000038\n#define REG_DISPx_BG3XH                         0x0400003A\n#define REG_DISPx_BG3YL                         0x0400003C\n#define REG_DISPx_BG3YH                         0x0400003E\n#define REG_DISPx_WIN0H                         0x04000040\n#define REG_DISPx_WIN1H                         0x04000042\n#define REG_DISPx_WIN0V                         0x04000044\n#define REG_DISPx_WIN1V                         0x04000046\n#define REG_DISPx_WININ                         0x04000048\n#define REG_DISPx_WINOUT                        0x0400004A\n#define REG_DISPx_MOSAIC                        0x0400004C\n#define REG_DISPx_BLDCNT                        0x04000050\n#define REG_DISPx_BLDALPHA                      0x04000052\n#define REG_DISPx_BLDY                          0x04000054\n#define REG_DISPx_MASTERBRIGHT                  0x0400006C\n// core A specific\n#define REG_DISPA_DISPSTAT                      0x04000004\n#define REG_DISPA_DISP3DCNT                     0x04000060\n#define REG_DISPA_DISPCAPCNT                    0x04000064\n#define REG_DISPA_DISPMMEMFIFO                  0x04000068\n\n#define REG_DISPA_DISP3DCNT_BIT_RDLINES_UNDERFLOW 0x1000\n#define REG_DISPA_DISP3DCNT_BIT_RAM_OVERFLOW 0x2000\n#define REG_DISPA_DISP3DCNT_BITS_ACK (REG_DISPA_DISP3DCNT_BIT_RDLINES_UNDERFLOW|REG_DISPA_DISP3DCNT_BIT_RAM_OVERFLOW)\n\n\n#define eng_3D_RDLINES_COUNT   0x04000320\n#define eng_3D_EDGE_COLOR      0x04000330\n#define eng_3D_ALPHA_TEST_REF  0x04000340\n#define eng_3D_CLEAR_COLOR     0x04000350\n#define eng_3D_CLEAR_DEPTH     0x04000354\n#define eng_3D_CLRIMAGE_OFFSET 0x04000356\n#define eng_3D_FOG_COLOR       0x04000358\n#define eng_3D_FOG_OFFSET      0x0400035C\n#define eng_3D_FOG_TABLE       0x04000360\n#define eng_3D_TOON_TABLE      0x04000380\n#define eng_3D_GXFIFO          0x04000400\n\n// 3d commands\n#define cmd_3D_MTX_MODE        0x04000440\n#define cmd_3D_MTX_PUSH        0x04000444\n#define cmd_3D_MTX_POP         0x04000448\n#define cmd_3D_MTX_STORE       0x0400044C\n#define cmd_3D_MTX_RESTORE     0x04000450\n#define cmd_3D_MTX_IDENTITY    0x04000454\n#define cmd_3D_MTX_LOAD_4x4    0x04000458\n#define cmd_3D_MTX_LOAD_4x3    0x0400045C\n#define cmd_3D_MTX_MULT_4x4    0x04000460\n#define cmd_3D_MTX_MULT_4x3    0x04000464\n#define cmd_3D_MTX_MULT_3x3    0x04000468\n#define cmd_3D_MTX_SCALE       0x0400046C\n#define cmd_3D_MTX_TRANS       0x04000470\n#define cmd_3D_COLOR           0x04000480\n#define cmd_3D_NORMA           0x04000484\n#define cmd_3D_TEXCOORD        0x04000488\n#define cmd_3D_VTX_16          0x0400048C\n#define cmd_3D_VTX_10          0x04000490\n#define cmd_3D_VTX_XY          0x04000494\n#define cmd_3D_VTX_XZ          0x04000498\n#define cmd_3D_VTX_YZ          0x0400049C\n#define cmd_3D_VTX_DIFF        0x040004A0\n#define cmd_3D_POLYGON_ATTR    0x040004A4\n#define cmd_3D_TEXIMAGE_PARAM  0x040004A8\n#define cmd_3D_PLTT_BASE       0x040004AC\n#define cmd_3D_DIF_AMB         0x040004C0\n#define cmd_3D_SPE_EMI         0x040004C4\n#define cmd_3D_LIGHT_VECTOR    0x040004C8\n#define cmd_3D_LIGHT_COLOR     0x040004CC\n#define cmd_3D_SHININESS       0x040004D0\n#define cmd_3D_BEGIN_VTXS      0x04000500\n#define cmd_3D_END_VTXS        0x04000504\n#define cmd_3D_SWAP_BUFFERS    0x04000540\n#define cmd_3D_VIEWPORT        0x04000580\n#define cmd_3D_BOX_TEST        0x040005C0\n#define cmd_3D_POS_TEST        0x040005C4\n#define cmd_3D_VEC_TEST        0x040005C8\n\n#define eng_3D_GXSTAT          0x04000600\n#define eng_3D_RAM_COUNT       0x04000604\n#define eng_3D_DISP_1DOT_DEPTH 0x04000610\n#define eng_3D_POS_RESULT      0x04000620\n#define eng_3D_VEC_RESULT      0x04000630\n#define eng_3D_CLIPMTX_RESULT  0x04000640\n#define eng_3D_VECMTX_RESULT   0x04000680\n\n//DSI\n#define REG_DSIMODE 0x04004000\n\n#define IPCFIFOCNT_SENDEMPTY 0x0001\n#define IPCFIFOCNT_SENDFULL 0x0002\n#define IPCFIFOCNT_SENDIRQEN 0x0004\n#define IPCFIFOCNT_SENDCLEAR 0x0008\n#define IPCFIFOCNT_RECVEMPTY 0x0100\n#define IPCFIFOCNT_RECVFULL 0x0200\n#define IPCFIFOCNT_RECVIRQEN 0x0400\n#define IPCFIFOCNT_FIFOERROR 0x4000\n#define IPCFIFOCNT_FIFOENABLE 0x8000\n#define IPCFIFOCNT_WRITEABLE (IPCFIFOCNT_SENDIRQEN | IPCFIFOCNT_RECVIRQEN | IPCFIFOCNT_FIFOENABLE)\n\n#define IPCSYNC_IRQ_SEND 0x2000\n#define IPCSYNC_IRQ_RECV 0x4000\n\n#define IRQ_BIT_LCD_VBLANK 0\n#define IRQ_BIT_LCD_HBLANK 1\n#define IRQ_BIT_LCD_VMATCH 2\n#define IRQ_BIT_TIMER_0 3\n#define IRQ_BIT_TIMER_1 4\n#define IRQ_BIT_TIMER_2 5\n#define IRQ_BIT_TIMER_3 6\n#define IRQ_BIT_ARM7_SIO 7\n#define IRQ_BIT_DMA_0 8\n#define IRQ_BIT_DMA_2 9\n#define IRQ_BIT_DMA_3 10\n#define IRQ_BIT_DMA_4 11\n#define IRQ_BIT_KEYPAD 12\n#define IRQ_BIT_GAMEPAK 13\n#define IRQ_BIT_IPCSYNC 16\n#define IRQ_BIT_IPCFIFO_SENDEMPTY 17\n#define IRQ_BIT_IPCFIFO_RECVNONEMPTY 18\n#define IRQ_BIT_GC_TRANSFER_COMPLETE 19\n#define IRQ_BIT_GC_IREQ_MC 20\n#define IRQ_BIT_ARM9_GXFIFO 21\n#define IRQ_BIT_ARM7_FOLD 22\n#define IRQ_BIT_ARM7_SPI 23\n#define IRQ_BIT_ARM7_WIFI 24\n\n#define IRQ_MASK_LCD_VBLANK (1<<0)\n#define IRQ_MASK_LCD_HBLANK (1<<1)\n#define IRQ_MASK_LCD_VMATCH (1<<2)\n#define IRQ_MASK_TIMER_0 (1<<3)\n#define IRQ_MASK_TIMER_1 (1<<4)\n#define IRQ_MASK_TIMER_2 (1<<5)\n#define IRQ_MASK_TIMER_3 (1<<6)\n#define IRQ_MASK_ARM7_SIO (1<<7)\n#define IRQ_MASK_DMA_0 (1<<8)\n#define IRQ_MASK_DMA_2 (1<<9)\n#define IRQ_MASK_DMA_3 (1<<10)\n#define IRQ_MASK_DMA_4 (1<<11)\n#define IRQ_MASK_KEYPAD (1<<12)\n#define IRQ_MASK_GAMEPAK (1<<13)\n#define IRQ_MASK_IPCSYNC (1<<16)\n#define IRQ_MASK_IPCFIFO_SENDEMPTY (1<<17)\n#define IRQ_MASK_IPCFIFO_RECVNONEMPTY (1<<18)\n#define IRQ_MASK_GC_TRANSFER_COMPLETE (1<<19)\n#define IRQ_MASK_GC_IREQ_MC (1<<20)\n#define IRQ_MASK_ARM9_GXFIFO (1<<21)\n#define IRQ_MASK_ARM7_FOLD (1<<22)\n#define IRQ_MASK_ARM7_SPI (1<<23)\n#define IRQ_MASK_ARM7_WIFI (1<<24)\n\n#define TSC_MEASURE_TEMP1    0\n#define TSC_MEASURE_Y        1\n#define TSC_MEASURE_BATTERY  2\n#define TSC_MEASURE_Z1       3\n#define TSC_MEASURE_Z2       4\n#define TSC_MEASURE_X        5\n#define TSC_MEASURE_AUX      6\n#define TSC_MEASURE_TEMP2    7\n\n#define EXMEMCNT_MASK_SLOT2_ARM7 (1<<7)\n#define EXMEMCNT_MASK_SLOT2_SRAM_TIME (3)\n#define EXMEMCNT_MASK_SLOT2_ROM_1ST_TIME (3<<2)\n#define EXMEMCNT_MASK_SLOT2_ROM_2ND_TIME (1<<4)\n#define EXMEMCNT_MASK_SLOT2_CLOCKRATE (3<<5)\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/render3D.cpp",
    "content": "/*\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"render3D.h\"\n#include \"gfx3d.h\"\n#include \"MMU.h\"\n#include \"texcache.h\"\n\nint cur3DCore = GPU3D_NULL;\n\nGPU3DInterface gpu3DNull = { \n\t\"None\",\n\tDefault3D_Init,\n\tDefault3D_Reset,\n\tDefault3D_Close,\n\tDefault3D_Render,\n\tDefault3D_RenderFinish,\n\tDefault3D_VramReconfigureSignal\n};\n\nGPU3DInterface *gpu3D = &gpu3DNull;\nstatic bool default3DAlreadyClearedLayer = false;\n\nchar Default3D_Init()\n{\n\tdefault3DAlreadyClearedLayer = false;\n\t\n\treturn 1;\n}\n\nvoid Default3D_Reset()\n{\n\tdefault3DAlreadyClearedLayer = false;\n\t\n\tTexCache_Reset();\n}\n\nvoid Default3D_Close()\n{\n\tmemset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));\n\tdefault3DAlreadyClearedLayer = false;\n}\n\nvoid Default3D_Render()\n{\n\tif (!default3DAlreadyClearedLayer)\n\t{\n\t\tmemset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));\n\t\tdefault3DAlreadyClearedLayer = true;\n\t}\n}\n\nvoid Default3D_RenderFinish()\n{\n\t// Do nothing\n}\n\nvoid Default3D_VramReconfigureSignal()\n{\n\tTexCache_Invalidate();\n}\n\nvoid NDS_3D_SetDriver (int core3DIndex)\n{\n\tcur3DCore = core3DIndex;\n\tgpu3D = core3DList[cur3DCore];\n}\n\nbool NDS_3D_ChangeCore(int newCore)\n{\n\tgpu3D->NDS_3D_Close();\n\tNDS_3D_SetDriver(newCore);\n\tif(gpu3D->NDS_3D_Init() == 0)\n\t{\n\t\tNDS_3D_SetDriver(GPU3D_NULL);\n\t\tgpu3D->NDS_3D_Init();\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nRender3DError Render3D::BeginRender(const GFX3D_State *renderState)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::PostRender()\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::EndRender(const u64 frameCount)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::UpdateToonTable(const u16 *toonTableBuffer)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::ClearFramebuffer(const GFX3D_State *renderState)\n{\n\tRender3DError error = RENDER3DERROR_NOERR;\n\t\n\tstruct GFX3D_ClearColor\n\t{\n\t\tu8 r;\n\t\tu8 g;\n\t\tu8 b;\n\t\tu8 a;\n\t} clearColor;\n\t\n\tclearColor.r = renderState->clearColor & 0x1F;\n\tclearColor.g = (renderState->clearColor >> 5) & 0x1F;\n\tclearColor.b = (renderState->clearColor >> 10) & 0x1F;\n\tclearColor.a = (renderState->clearColor >> 16) & 0x1F;\n\t\n\tconst u8 clearStencil = (renderState->clearColor >> 24) & 0x3F;\n\t\n\tif (renderState->enableClearImage)\n\t{\n\t\tconst u16 *__restrict clearColorBuffer = (u16 *__restrict)MMU.texInfo.textureSlotAddr[2];\n\t\tconst u16 *__restrict clearDepthBuffer = (u16 *__restrict)MMU.texInfo.textureSlotAddr[3];\n\t\tconst u16 scrollBits = T1ReadWord(MMU.ARM9_REG, 0x356); //CLRIMAGE_OFFSET\n\t\tconst u8 xScroll = scrollBits & 0xFF;\n\t\tconst u8 yScroll = (scrollBits >> 8) & 0xFF;\n\t\t\n\t\terror = this->UpdateClearImage(clearColorBuffer, clearDepthBuffer, clearStencil, xScroll, yScroll);\n\t\tif (error == RENDER3DERROR_NOERR)\n\t\t{\n\t\t\terror = this->ClearUsingImage();\n\t\t}\n\t\telse\n\t\t{\n\t\t\terror = this->ClearUsingValues(clearColor.r, clearColor.g, clearColor.b, clearColor.a, renderState->clearDepth, clearStencil);\n\t\t}\n\t}\n\telse\n\t{\n\t\terror = this->ClearUsingValues(clearColor.r, clearColor.g, clearColor.b, clearColor.a, renderState->clearDepth, clearStencil);\n\t}\n\t\n\treturn error;\n}\n\nRender3DError Render3D::ClearUsingImage() const\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::SetupPolygon(const POLY *thePoly)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::SetupTexture(const POLY *thePoly, bool enableTexturing)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::SetupViewport(const POLY *thePoly)\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::Reset()\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::Render(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, const u64 frameCount)\n{\n\tRender3DError error = RENDER3DERROR_NOERR;\n\t\n\terror = this->BeginRender(renderState);\n\tif (error != RENDER3DERROR_NOERR)\n\t{\n\t\treturn error;\n\t}\n\t\n\tthis->UpdateToonTable(renderState->u16ToonTable);\n\tthis->ClearFramebuffer(renderState);\n\t\n\tthis->PreRender(renderState, vertList, polyList, indexList);\n\tthis->DoRender(renderState, vertList, polyList, indexList);\n\tthis->PostRender();\n\t\n\tthis->EndRender(frameCount);\n\t\n\treturn error;\n}\n\nRender3DError Render3D::RenderFinish()\n{\n\treturn RENDER3DERROR_NOERR;\n}\n\nRender3DError Render3D::VramReconfigureSignal()\n{\n\tTexCache_Invalidate();\t\n\treturn RENDER3DERROR_NOERR;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/render3D.h",
    "content": "/*\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2007-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef RENDER3D_H\n#define RENDER3D_H\n\n#include \"gfx3d.h\"\n#include \"types.h\"\n\n//not using this right now\n#define CALL_CONVENTION\n\ntypedef struct Render3DInterface\n{\n\t// The name of the plugin, this name will appear in the plugins list\n\tconst char * name;\n\n\t//called once when the plugin starts up\n\tchar (CALL_CONVENTION*  NDS_3D_Init)\t\t\t\t\t();\n\t\n\t//called when the emulator resets (is this necessary?)\n\tvoid (CALL_CONVENTION*  NDS_3D_Reset)\t\t\t\t\t();\n\t\n\t//called when the plugin shuts down\n\tvoid (CALL_CONVENTION*  NDS_3D_Close)\t\t\t\t\t();\n\t\n\t//called when the renderer should do its job and render the current display lists\n\tvoid (CALL_CONVENTION*  NDS_3D_Render)\t\t\t\t\t();\n\t\n\t// Called whenever 3D rendering needs to finish. This function should block the calling thread\n\t// and only release the block when 3D rendering is finished. (Before reading the 3D layer, be\n\t// sure to always call this function.)\n\tvoid (CALL_CONVENTION*\tNDS_3D_RenderFinish)\t\t\t();\n\n\t//called when the emulator reconfigures its vram. you may need to invalidate your texture cache.\n\tvoid (CALL_CONVENTION*  NDS_3D_VramReconfigureSignal)\t();\n\n} GPU3DInterface;\n\nextern int cur3DCore;\n\n// gpu 3D core list, per port\nextern GPU3DInterface *core3DList[];\n\n// Default null plugin\n#define GPU3D_NULL 0\nextern GPU3DInterface gpu3DNull;\n\n// Extern pointer\nextern GPU3DInterface *gpu3D;\n\nchar Default3D_Init();\nvoid Default3D_Reset();\nvoid Default3D_Close();\nvoid Default3D_Render();\nvoid Default3D_RenderFinish();\nvoid Default3D_VramReconfigureSignal();\n\nvoid NDS_3D_SetDriver (int core3DIndex);\nbool NDS_3D_ChangeCore(int newCore);\n\nenum Render3DErrorCode\n{\n\tRENDER3DERROR_NOERR = 0\n};\n\ntypedef int Render3DError;\n\nclass Render3D\n{\nprotected:\n\tvirtual Render3DError BeginRender(const GFX3D_State *renderState);\n\tvirtual Render3DError PreRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);\n\tvirtual Render3DError DoRender(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);\n\tvirtual Render3DError PostRender();\n\tvirtual Render3DError EndRender(const u64 frameCount);\n\t\n\tvirtual Render3DError UpdateClearImage(const u16 *__restrict colorBuffer, const u16 *__restrict depthBuffer, const u8 clearStencil, const u8 xScroll, const u8 yScroll);\n\tvirtual Render3DError UpdateToonTable(const u16 *toonTableBuffer);\n\t\n\tvirtual Render3DError ClearFramebuffer(const GFX3D_State *renderState);\n\tvirtual Render3DError ClearUsingImage() const;\n\tvirtual Render3DError ClearUsingValues(const u8 r, const u8 g, const u8 b, const u8 a, const u32 clearDepth, const u8 clearStencil) const;\n\t\n\tvirtual Render3DError SetupPolygon(const POLY *thePoly);\n\tvirtual Render3DError SetupTexture(const POLY *thePoly, bool enableTexturing);\n\tvirtual Render3DError SetupViewport(const POLY *thePoly);\n\t\npublic:\n\tvirtual Render3DError Reset();\n\tvirtual Render3DError Render(const GFX3D_State *renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList, const u64 frameCount);\n\tvirtual Render3DError RenderFinish();\n\tvirtual Render3DError VramReconfigureSignal();\n};\n\n#endif\n \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/rtc.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008 CrazyMax\n\tCopyright (C) 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n// TODO: interrupt handler\n\n#include \"rtc.h\"\n#include \"common.h\"\n#include \"debug.h\"\n#include \"armcpu.h\"\n#include <string.h>\n#include \"saves.h\"\n#ifdef WIN32\n#include \"windows/main.h\"\n#endif\n#include \"movie.h\"\n\n\ntypedef struct\n{\n\t// RTC registers\n\tu8\tregStatus1;\n\tu8\tregStatus2;\n\tu8\tregAdjustment;\n\tu8\tregFree;\n\n\t// BUS\n\tu8\t_prevSCK;\n\tu8\t_prevCS;\n\tu8\t_prevSIO;\n\tu8\t_SCK;\n\tu8\t_CS;\n\tu8\t_SIO;\n\tu8\t_DD;\n\tu16\t_REG;\n\n\t// command & data\n\tu8\tcmd;\n\tu8\tcmdStat;\n\tu8\tbitsCount;\n\tu8\tdata[8];\n\n\tu8 cmdBitsSize[8];\n} _RTC;\n\n_RTC\trtc;\n\nSFORMAT SF_RTC[]={\n\t{ \"R000\", 1, 1, &rtc.regStatus1},\n\t{ \"R010\", 1, 1, &rtc.regStatus2},\n\t{ \"R020\", 1, 1, &rtc.regAdjustment},\n\t{ \"R030\", 1, 1, &rtc.regFree},\n\n\t{ \"R040\", 1, 1, &rtc._prevSCK},\n\t{ \"R050\", 1, 1, &rtc._prevCS},\n\t{ \"R060\", 1, 1, &rtc._prevSIO},\n\t{ \"R070\", 1, 1, &rtc._SCK},\n\t{ \"R080\", 1, 1, &rtc._CS},\n\t{ \"R090\", 1, 1, &rtc._SIO},\n\t{ \"R100\", 1, 1, &rtc._DD},\n\t{ \"R110\", 2, 1, &rtc._REG},\n\n\t{ \"R120\", 1, 1, &rtc.cmd},\n\t{ \"R130\", 1, 1, &rtc.cmdStat},\n\t{ \"R140\", 1, 1, &rtc.bitsCount},\n\t{ \"R150\", 1, 8, &rtc.data[0]},\n\n\t{ \"R160\", 1, 8, &rtc.cmdBitsSize[0]},\n\n\t{ 0 }\n};\n\nstatic const u8 kDefaultCmdBitsSize[8] = {8, 8, 56, 24, 0, 24, 8, 8};\n\nstatic inline u8 toBCD(u8 x)\n{\n\treturn ((x / 10) << 4) | (x % 10);\n}\n\nbool moviemode=false;\n\nDateTime rtcGetTime(void)\n{\n\tDateTime tm;\n\tif(movieMode == MOVIEMODE_INACTIVE) {\n\t\treturn DateTime::get_Now();\n\t}\n\telse {\n\t\t//now, you might think it is silly to go through all these conniptions\n\t\t//when we could just assume that there are 60fps and base the seconds on frameCounter/60\n\t\t//but, we were imagining that one day we might need more precision\n\n\t\tconst u32 arm9rate_unitsperframe = 560190<<1;\n\t\tconst u32 arm9rate_unitspersecond = (u32)(arm9rate_unitsperframe * 59.8261);\n\n\t\tu64 totalcycles = (u64)arm9rate_unitsperframe * currFrameCounter;\n\t\tu64 totalseconds=totalcycles/arm9rate_unitspersecond;\n\n\t\tDateTime timer = currMovieData.rtcStart;\n\t\treturn timer.AddSeconds(totalseconds);\n\t}\n}\n\nstatic void rtcRecv()\n{\n\t//INFO(\"RTC Read command 0x%02X\\n\", (rtc.cmd >> 1));\n\n\tmemset(&rtc.data[0], 0, sizeof(rtc.data));\n\tswitch (rtc.cmd >> 1)\n\t{\n\t\tcase 0:\t\t\t\t// status register 1\n\t\t\t//INFO(\"RTC: read regstatus1 (0x%02X)\\n\", rtc.regStatus1);\n\t\t\trtc.regStatus1 &= 0x0F;\n\t\t\trtc.data[0] = rtc.regStatus1;\n\t\t\t//rtc.regStatus1 &= 0x7F;\n\t\t\tbreak;\n\t\tcase 1:\t\t\t\t// status register 2\n\t\t\t//INFO(\"RTC: read regstatus2 (0x%02X)\\n\", rtc.regStatus1);\n\t\t\trtc.data[0] = rtc.regStatus2;\n\t\t\tbreak;\n\t\tcase 2:\t\t\t\t// date & time\n\t\t\t{\n\t\t\t\t//INFO(\"RTC: read date & time\\n\");\n\t\t\t\tDateTime tm = rtcGetTime();\n\t\t\t\trtc.data[0] = toBCD(tm.get_Year() % 100);\n\t\t\t\trtc.data[1] = toBCD(tm.get_Month());\n\t\t\t\trtc.data[2] = toBCD(tm.get_Day());\n\n\t\t\t\t//zero 24-apr-2010 - this is nonsense.\n\t\t\t\t//but it is so wrong, someone mustve thought they knew what they were doing, so i am leaving it...\n\t\t\t\t//rtc.data[3] = (tm.tm_wday + 6) & 7;\n\t\t\t\t//if (rtc.data[3] == 7) rtc.data[3] = 6;\n\n\t\t\t\t//do this instead (gbatek seems to say monday=0 but i don't think that is right)\n\t\t\t\t//0=sunday is necessary to make animal crossing behave\n\t\t\t\t//maybe it means \"custom assignment\" can be specified by the game\n\t\t\t\trtc.data[3] = tm.get_DayOfWeek();\n\n\t\t\t\tint hour = tm.get_Hour(); \n\t\t\t\tif (!(rtc.regStatus1 & 0x02)) hour %= 12;\n\t\t\t\trtc.data[4] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour);\n\t\t\t\trtc.data[5] =  toBCD(tm.get_Minute());\n\t\t\t\trtc.data[6] =  toBCD(tm.get_Second());\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 3:\t\t\t\t// time\n\t\t\t{\n\t\t\t\t//INFO(\"RTC: read time\\n\");\n\t\t\t\tDateTime tm = rtcGetTime();\n\t\t\t\tint hour = tm.get_Hour(); \n\t\t\t\tif (!(rtc.regStatus1 & 0x02)) hour %= 12;\n\t\t\t\trtc.data[0] = ((hour < 12) ? 0x00 : 0x40) | toBCD(hour);\n\t\t\t\trtc.data[1] =  toBCD(tm.get_Minute());\n\t\t\t\trtc.data[2] =  toBCD(tm.get_Second());\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 4:\t\t\t\t// freq/alarm 1\n\t\t\t/*if (cmdBitsSize[0x04] == 8)\n\t\t\t\tINFO(\"RTC: read INT1 freq\\n\");\n\t\t\telse\n\t\t\t\tINFO(\"RTC: read INT1 alarm1\\n\");*/\n\t\t\t//NDS_makeARM7Int(7);\n\t\t\tbreak;\n\t\tcase 5:\t\t\t\t// alarm 2\n\t\t\t//INFO(\"RTC: read alarm 2\\n\");\n\t\t\tbreak;\n\t\tcase 6:\t\t\t\t// clock adjust\n\t\t\t//INFO(\"RTC: read clock adjust\\n\");\n\t\t\trtc.data[0] = rtc.regAdjustment;\n\t\t\tbreak;\n\t\tcase 7:\t\t\t\t// free register\n\t\t\t//INFO(\"RTC: read free register\\n\");\n\t\t\trtc.data[0] = rtc.regFree;\n\t\t\tbreak;\n\t}\n}\n\nstatic void rtcSend()\n{\n\t//INFO(\"RTC write command 0x%02X\\n\", (rtc.cmd >> 1));\n\tswitch (rtc.cmd >> 1)\n\t{\n\t\tcase 0:\t\t\t\t// status register 1\n\t\t\t//INFO(\"RTC: write regstatus1 0x%02X\\n\", rtc.data[0]);\n\t\t//\trtc.regStatus1 &= 0xF1;\n\t\t//\trtc.regStatus1 |= (rtc.data[0] | 0x0E);\n\t\t\trtc.regStatus1 = rtc.data[0];\n\t\t\tbreak;\n\t\tcase 1:\t\t\t\t// status register 2\n\t\t\t//INFO(\"RTC: write regstatus2 0x%02X\\n\", rtc.data[0]);\n\t\t\trtc.regStatus2 = rtc.data[0];\n\t\t\tbreak;\n\t\tcase 2:\t\t\t\t// date & time\n\t\t\t//INFO(\"RTC: write date & time : %02X %02X %02X %02X %02X %02X %02X\\n\", rtc.data[0], rtc.data[1], rtc.data[2], rtc.data[3], rtc.data[4], rtc.data[5], rtc.data[6]);\n\t\tbreak;\n\t\tcase 3:\t\t\t\t// time\n\t\t\t//INFO(\"RTC: write time : %02X %02X %02X\\n\", rtc.data[0], rtc.data[1], rtc.data[2]);\n\t\tbreak;\n\t\tcase 4:\t\t\t\t// freq/alarm 1\n\t\t\t/*if (cmdBitsSize[0x04] == 8)\n\t\t\t\tINFO(\"RTC: write INT1 freq 0x%02X\\n\", rtc.data[0]);\n\t\t\telse\n\t\t\t\tINFO(\"RTC: write INT1 alarm1 0x%02X\\n\", rtc.data[0]);*/\n\t\tbreak;\n\t\tcase 5:\t\t\t\t// alarm 2\n\t\t\t//INFO(\"RTC: write alarm 2\\n\");\n\t\tbreak;\n\t\tcase 6:\t\t\t\t// clock adjust\n\t\t\t//INFO(\"RTC: write clock adjust\\n\");\n\t\t\trtc.regAdjustment = rtc.data[0];\n\t\t\tbreak;\n\t\tcase 7:\t\t\t\t// free register\n\t\t\t//INFO(\"RTC: write free register\\n\");\n\t\t\trtc.regFree = rtc.data[0];\n\t\tbreak;\n\t}\n}\n\nvoid rtcInit() \n{\n\tmemset(&rtc, 0, sizeof(rtc));\n\tmemcpy(&rtc.cmdBitsSize[0],kDefaultCmdBitsSize,8);\n\n\trtc.regStatus1 |= 0x02;\n}\n\nu16 rtcRead() \n{ \n\t//INFO(\"MMU Read RTC 0x%02X (%03i)\\n\", rtc._REG, rtc.bitsCount);\n\treturn (rtc._REG); \n}\n\nvoid rtcWrite(u16 val)\n{\n\t//INFO(\"MMU Write RTC 0x%02X (%03i)\\n\", val, rtc.bitsCount);\n\trtc._DD  = (val & 0x10) >> 4;\n\trtc._SIO = rtc._DD?(val & 0x01):rtc._prevSIO;\n\trtc._SCK = (val & 0x20)?((val & 0x02) >> 1):rtc._prevSCK;\n\trtc._CS  = (val & 0x40)?((val & 0x04) >> 2):rtc._prevCS;\n\n\tswitch (rtc.cmdStat)\n\t{\n\t\tcase 0:\n\t\t\tif ( (!rtc._prevCS) && (rtc._prevSCK) && (rtc._CS) && (rtc._SCK) )\n\t\t\t{\n\t\t\t\trtc.cmdStat = 1;\n\t\t\t\trtc.bitsCount = 0;\n\t\t\t\trtc.cmd = 0;\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 1:\n\t\t\tif (!rtc._CS) \n\t\t\t{\n\t\t\t\trtc.cmdStat = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (rtc._SCK && rtc._DD) break;\n\t\t\tif (!rtc._SCK && !rtc._DD) break;\n\n\t\t\trtc.cmd |= (rtc._SIO << rtc.bitsCount );\n\t\t\trtc.bitsCount ++;\n\t\t\tif (rtc.bitsCount == 8)\n\t\t\t{\n\t\t\t\t//INFO(\"RTC command 0x%02X\\n\", rtc.cmd);\n\n\t\t\t\t// Little-endian command\n\t\t\t\tif((rtc.cmd & 0x0F) == 0x06)\n\t\t\t\t{\n\t\t\t\t\tu8 tmp = rtc.cmd;\n\t\t\t\t\trtc.cmd = ((tmp & 0x80) >> 7) | ((tmp & 0x40) >> 5) | ((tmp & 0x20) >> 3) | ((tmp & 0x10) >> 1);\n\t\t\t\t}\n\t\t\t\t// Big-endian command\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trtc.cmd &= 0x0F;\n\t\t\t\t}\n\n\t\t\t\tif((rtc._prevSCK) && (!rtc._SCK))\n\t\t\t\t{\n\t\t\t\t\trtc.bitsCount = 0;\n\t\t\t\t\tif ((rtc.cmd >> 1) == 0x04)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((rtc.regStatus2 & 0x0F) == 0x04)\n\t\t\t\t\t\t\trtc.cmdBitsSize[rtc.cmd >> 1] = 24;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\trtc.cmdBitsSize[rtc.cmd >> 1] = 8;\n\t\t\t\t\t}\n\t\t\t\t\tif (rtc.cmd & 0x01)\n\t\t\t\t\t{\n\t\t\t\t\t\trtc.cmdStat = 4;\n\t\t\t\t\t\trtcRecv();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trtc.cmdStat = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\tbreak;\n\n\t\tcase 3:\t\t\t// write:\n\t\t\tif( (rtc._prevSCK) && (!rtc._SCK) )\n\t\t\t{\n\t\t\t\tif(rtc._SIO) rtc.data[rtc.bitsCount >> 3] |= (1 << (rtc.bitsCount & 0x07));\n\t\t\t\trtc.bitsCount++;\n\t\t\t\tif (rtc.bitsCount == rtc.cmdBitsSize[rtc.cmd >> 1])\n\t\t\t\t{\n\t\t\t\t\trtcSend();\n\t\t\t\t\trtc.cmdStat = 0;\n\t\t\t\t}\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 4:\t\t\t// read:\n\t\t\tif( (rtc._prevSCK) && (!rtc._SCK) )\n\t\t\t{\n\t\t\t\trtc._REG = val;\n\t\t\t\tif((rtc.data[(rtc.bitsCount >> 3)] >> (rtc.bitsCount & 0x07)) & 0x01) \n\t\t\t\t\trtc._REG |= 0x01;\n\t\t\t\telse\n\t\t\t\t\trtc._REG &= ~0x01;\n\n\t\t\t\trtc.bitsCount++;\n\t\t\t\tif (rtc.bitsCount == rtc.cmdBitsSize[rtc.cmd >> 1] || (!(val & 0x04)))\n\t\t\t\t\trtc.cmdStat = 0;\n\t\t\t}\n\t\tbreak;\n\n\t}\n\n\trtc._prevSIO = rtc._SIO;\n\trtc._prevSCK = rtc._SCK;\n\trtc._prevCS  = rtc._CS;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/rtc.h",
    "content": "/*\n\tCopyright 2006 yopyop\n\tCopyright 2008 CrazyMax\n\tCopyright 2008-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _RTC_H_\n#define _RTC_H_\n#include <stdlib.h>\n#include <time.h>\n#include \"types.h\"\n#include \"utils/datetime.h\"\n\nDateTime rtcGetTime(void);\n\nextern\tvoid rtcInit();\nextern\tu16 rtcRead();\nextern\tvoid rtcWrite(u16 val);\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/saves.cpp",
    "content": "/*\n\tCopyright (C) 2006 Normmatt\n\tCopyright (C) 2006 Theo Berkau\n\tCopyright (C) 2007 Pascal Giard\n\tCopyright (C) 2008-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n//MUST SAVE ADDONS! OMG HOW DID WE FORGET THAT\n\n#ifdef HAVE_LIBZ\n#include <zlib.h>\n#endif\n#include <stack>\n#include <set>\n#include <stdio.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <time.h>\n#include <fstream>\n#include \"saves.h\"\n#include \"MMU.h\"\n#include \"NDSSystem.h\"\n#include \"render3D.h\"\n#include \"cp15.h\"\n#include \"GPU_osd.h\"\n#include \"version.h\"\n\n#include \"readwrite.h\"\n#include \"gfx3d.h\"\n#include \"movie.h\"\n#include \"mic.h\"\n#include \"MMU_timing.h\"\n\n#include \"path.h\"\n\n#ifdef _WINDOWS\n#include \"windows/main.h\"\n#elif defined(ANDROID)\n#include \"android/main.h\"\n#endif\n\nint lastSaveState = 0;\t\t//Keeps track of last savestate used for quick save/load functions\n\n//void*v is actually a void** which will be indirected before reading\n//since this isnt supported right now, it is declared in here to make things compile\n#define SS_INDIRECT            0x80000000\n\nsavestates_t savestates[NB_STATES];\n\n#define SAVESTATE_VERSION       12\nstatic const char* magic = \"DeSmuME SState\\0\";\n\n//a savestate chunk loader can set this if it wants to permit a silent failure (for compatibility)\nstatic bool SAV_silent_fail_flag;\n\nSFORMAT SF_NDS_HEADER[]={\n\t{ \"GINF\", 1, sizeof(gameInfo.header), &gameInfo.header},\n\t{ \"GRSZ\", 1, 4, &gameInfo.romsize},\n\t{ 0 }\n};\n\nSFORMAT SF_ARM7[]={\n\t{ \"7INS\", 4, 1, &NDS_ARM7.instruction },\n\t{ \"7INA\", 4, 1, &NDS_ARM7.instruct_adr },\n\t{ \"7INN\", 4, 1, &NDS_ARM7.next_instruction },\n\t{ \"7REG\", 4,16, NDS_ARM7.R },\n\t{ \"7CPS\", 4, 1, &NDS_ARM7.CPSR },\n\t{ \"7SPS\", 4, 1, &NDS_ARM7.SPSR },\n\t{ \"7DUS\", 4, 1, &NDS_ARM7.R13_usr },\n\t{ \"7EUS\", 4, 1, &NDS_ARM7.R14_usr },\n\t{ \"7DSV\", 4, 1, &NDS_ARM7.R13_svc },\n\t{ \"7ESV\", 4, 1, &NDS_ARM7.R14_svc },\n\t{ \"7DAB\", 4, 1, &NDS_ARM7.R13_abt },\n\t{ \"7EAB\", 4, 1, &NDS_ARM7.R14_abt },\n\t{ \"7DUN\", 4, 1, &NDS_ARM7.R13_und },\n\t{ \"7EUN\", 4, 1, &NDS_ARM7.R14_und },\n\t{ \"7DIR\", 4, 1, &NDS_ARM7.R13_irq },\n\t{ \"7EIR\", 4, 1, &NDS_ARM7.R14_irq },\n\t{ \"78FI\", 4, 1, &NDS_ARM7.R8_fiq },\n\t{ \"79FI\", 4, 1, &NDS_ARM7.R9_fiq },\n\t{ \"7AFI\", 4, 1, &NDS_ARM7.R10_fiq },\n\t{ \"7BFI\", 4, 1, &NDS_ARM7.R11_fiq },\n\t{ \"7CFI\", 4, 1, &NDS_ARM7.R12_fiq },\n\t{ \"7DFI\", 4, 1, &NDS_ARM7.R13_fiq },\n\t{ \"7EFI\", 4, 1, &NDS_ARM7.R14_fiq },\n\t{ \"7SVC\", 4, 1, &NDS_ARM7.SPSR_svc },\n\t{ \"7ABT\", 4, 1, &NDS_ARM7.SPSR_abt },\n\t{ \"7UND\", 4, 1, &NDS_ARM7.SPSR_und },\n\t{ \"7IRQ\", 4, 1, &NDS_ARM7.SPSR_irq },\n\t{ \"7FIQ\", 4, 1, &NDS_ARM7.SPSR_fiq },\n\t{ \"7int\", 4, 1, &NDS_ARM7.intVector },\n\t{ \"7LDT\", 1, 1, &NDS_ARM7.LDTBit },\n\t{ \"7Wai\", 4, 1, &NDS_ARM7.waitIRQ },\n\t{ \"7hef\", 4, 1, &NDS_ARM7.halt_IE_and_IF },\n\t{ \"7iws\", 1, 1, &NDS_ARM7.intrWaitARM_state },\n\t{ 0 }\n};\n\nSFORMAT SF_ARM9[]={\n\t{ \"9INS\", 4, 1, &NDS_ARM9.instruction},\n\t{ \"9INA\", 4, 1, &NDS_ARM9.instruct_adr},\n\t{ \"9INN\", 4, 1, &NDS_ARM9.next_instruction},\n\t{ \"9REG\", 4,16, NDS_ARM9.R},\n\t{ \"9CPS\", 4, 1, &NDS_ARM9.CPSR},\n\t{ \"9SPS\", 4, 1, &NDS_ARM9.SPSR},\n\t{ \"9DUS\", 4, 1, &NDS_ARM9.R13_usr},\n\t{ \"9EUS\", 4, 1, &NDS_ARM9.R14_usr},\n\t{ \"9DSV\", 4, 1, &NDS_ARM9.R13_svc},\n\t{ \"9ESV\", 4, 1, &NDS_ARM9.R14_svc},\n\t{ \"9DAB\", 4, 1, &NDS_ARM9.R13_abt},\n\t{ \"9EAB\", 4, 1, &NDS_ARM9.R14_abt},\n\t{ \"9DUN\", 4, 1, &NDS_ARM9.R13_und},\n\t{ \"9EUN\", 4, 1, &NDS_ARM9.R14_und},\n\t{ \"9DIR\", 4, 1, &NDS_ARM9.R13_irq},\n\t{ \"9EIR\", 4, 1, &NDS_ARM9.R14_irq},\n\t{ \"98FI\", 4, 1, &NDS_ARM9.R8_fiq},\n\t{ \"99FI\", 4, 1, &NDS_ARM9.R9_fiq},\n\t{ \"9AFI\", 4, 1, &NDS_ARM9.R10_fiq},\n\t{ \"9BFI\", 4, 1, &NDS_ARM9.R11_fiq},\n\t{ \"9CFI\", 4, 1, &NDS_ARM9.R12_fiq},\n\t{ \"9DFI\", 4, 1, &NDS_ARM9.R13_fiq},\n\t{ \"9EFI\", 4, 1, &NDS_ARM9.R14_fiq},\n\t{ \"9SVC\", 4, 1, &NDS_ARM9.SPSR_svc},\n\t{ \"9ABT\", 4, 1, &NDS_ARM9.SPSR_abt},\n\t{ \"9UND\", 4, 1, &NDS_ARM9.SPSR_und},\n\t{ \"9IRQ\", 4, 1, &NDS_ARM9.SPSR_irq},\n\t{ \"9FIQ\", 4, 1, &NDS_ARM9.SPSR_fiq},\n\t{ \"9int\", 4, 1, &NDS_ARM9.intVector},\n\t{ \"9LDT\", 1, 1, &NDS_ARM9.LDTBit},\n\t{ \"9Wai\", 4, 1, &NDS_ARM9.waitIRQ},\n\t{ \"9hef\", 4, 1, &NDS_ARM9.halt_IE_and_IF },\n\t{ \"9iws\", 1, 1, &NDS_ARM9.intrWaitARM_state },\n\t{ 0 }\n};\n\nSFORMAT SF_MEM[]={\n\t{ \"ITCM\", 1, sizeof(MMU.ARM9_ITCM),   MMU.ARM9_ITCM},\n\t{ \"DTCM\", 1, sizeof(MMU.ARM9_DTCM),   MMU.ARM9_DTCM},\n\n\t //for legacy purposes, WRAX is a separate variable. shouldnt be a problem.\n\t{ \"WRAM\", 1, 0x400000, MMU.MAIN_MEM},\n\t{ \"WRAX\", 1, 0x400000, MMU.MAIN_MEM+0x400000},\n\n\t//NOTE - this is not as large as the allocated memory.\n\t//the memory is overlarge due to the way our memory map system is setup\n\t//but there are actually no more registers than this\n\t{ \"9REG\", 1, 0x2000,   MMU.ARM9_REG},\n\n\t{ \"VMEM\", 1, sizeof(MMU.ARM9_VMEM),    MMU.ARM9_VMEM},\n\t{ \"OAMS\", 1, sizeof(MMU.ARM9_OAM),    MMU.ARM9_OAM},\n\n\t//this size is specially chosen to avoid saving the blank space at the end\n\t{ \"LCDM\", 1, 0xA4000,\t\tMMU.ARM9_LCD},\n\t{ 0 }\n};\n\nSFORMAT SF_NDS[]={\n\t{ \"_WCY\", 4, 1, &nds.wifiCycle},\n\t{ \"_TCY\", 8, 8, nds.timerCycle},\n\t{ \"_VCT\", 4, 1, &nds.VCount},\n\t{ \"_OLD\", 4, 1, &nds.old},\n\t{ \"_TPX\", 2, 1, &nds.adc_touchX},\n\t{ \"_TPY\", 2, 1, &nds.adc_touchY},\n\t{ \"_TPC\", 2, 1, &nds.adc_jitterctr},\n\t{ \"_STX\", 2, 1, &nds.scr_touchX},\n\t{ \"_STY\", 2, 1, &nds.scr_touchY},\n\t{ \"_TPB\", 4, 1, &nds.isTouch},\n\t{ \"_DBG\", 4, 1, &nds._DebugConsole},\n\t{ \"_ENS\", 4, 1, &nds.ensataEmulation},\n\t{ \"_TYP\", 4, 1, &nds.ConsoleType},\n\t{ \"_ENH\", 4, 1, &nds.ensataHandshake},\n\t{ \"_ENI\", 4, 1, &nds.ensataIpcSyncCounter},\n\t{ \"_SLP\", 4, 1, &nds.sleeping},\n\t{ \"_FBS\", 4, 1, &nds.freezeBus},\n\t{ \"_CEJ\", 4, 1, &nds.cardEjected},\n\t{ \"_PDL\", 2, 1, &nds.paddle},\n\t{ \"_P00\", 1, 1, &nds.power1.lcd},\n\t{ \"_P01\", 1, 1, &nds.power1.gpuMain},\n\t{ \"_P02\", 1, 1, &nds.power1.gfx3d_render},\n\t{ \"_P03\", 1, 1, &nds.power1.gfx3d_geometry},\n\t{ \"_P04\", 1, 1, &nds.power1.gpuSub},\n\t{ \"_P05\", 1, 1, &nds.power1.dispswap},\n\t{ \"_P06\", 1, 1, &nds.power2.speakers},\n\t{ \"_P07\", 1, 1, &nds.power2.wifi},\n\t{ 0 }\n};\n\nSFORMAT SF_MMU[]={\n\t{ \"M7BI\", 1, sizeof(MMU.ARM7_BIOS), MMU.ARM7_BIOS},\n\t{ \"M7ER\", 1, sizeof(MMU.ARM7_ERAM), MMU.ARM7_ERAM},\n\t{ \"M7RG\", 1, sizeof(MMU.ARM7_REG), MMU.ARM7_REG},\n\t{ \"M7WI\", 1, sizeof(MMU.ARM7_WIRAM), MMU.ARM7_WIRAM},\n\t{ \"MSWI\", 1, sizeof(MMU.SWIRAM), MMU.SWIRAM},\n\t{ \"M9RW\", 1, 1,       &MMU.ARM9_RW_MODE},\n\t{ \"MDTC\", 4, 1,       &MMU.DTCMRegion},\n\t{ \"MITC\", 4, 1,       &MMU.ITCMRegion},\n\t{ \"MTIM\", 2, 8,       MMU.timer},\n\t{ \"MTMO\", 4, 8,       MMU.timerMODE},\n\t{ \"MTON\", 4, 8,       MMU.timerON},\n\t{ \"MTRN\", 4, 8,       MMU.timerRUN},\n\t{ \"MTRL\", 2, 8,       MMU.timerReload},\n\t{ \"MIME\", 4, 2,       MMU.reg_IME},\n\t{ \"MIE_\", 4, 2,       MMU.reg_IE},\n\t{ \"MIF_\", 4, 2,       MMU.reg_IF_bits},\n\t{ \"MIFP\", 4, 2,       MMU.reg_IF_pending},\n\n\t{ \"MGXC\", 8, 1,       &MMU.gfx3dCycles},\n\t\n\t{ \"M_SX\", 1, 2,       &MMU.SPI_CNT},\n\t{ \"M_SC\", 1, 2,       &MMU.SPI_CMD},\n\t{ \"MASX\", 1, 2,       &MMU.AUX_SPI_CNT},\n\t{ \"MASC\", 1, 2,       &MMU.AUX_SPI_CMD},\n\n\t{ \"MWRA\", 1, 2,       &MMU.WRAMCNT},\n\n\t{ \"MDV1\", 4, 1,       &MMU.divRunning},\n\t{ \"MDV2\", 8, 1,       &MMU.divResult},\n\t{ \"MDV3\", 8, 1,       &MMU.divMod},\n\t{ \"MDV5\", 8, 1,       &MMU.divCycles},\n\n\t{ \"MSQ1\", 4, 1,       &MMU.sqrtRunning},\n\t{ \"MSQ2\", 4, 1,       &MMU.sqrtResult},\n\t{ \"MSQ4\", 8, 1,       &MMU.sqrtCycles},\n\t\n\t//begin memory chips\n\t{ \"BUCO\", 1, 1,       &MMU.fw.com},\n\t{ \"BUAD\", 4, 1,       &MMU.fw.addr},\n\t{ \"BUAS\", 1, 1,       &MMU.fw.addr_shift},\n\t{ \"BUAZ\", 1, 1,       &MMU.fw.addr_size},\n\t{ \"BUWE\", 4, 1,       &MMU.fw.write_enable},\n\t{ \"BUWR\", 4, 1,       &MMU.fw.writeable_buffer},\n\t//end memory chips\n\n\t{ \"MC0A\", 4, 1,       &MMU.dscard[0].address},\n\t{ \"MC0T\", 4, 1,       &MMU.dscard[0].transfer_count},\n\t{ \"MC1A\", 4, 1,       &MMU.dscard[1].address},\n\t{ \"MC1T\", 4, 1,       &MMU.dscard[1].transfer_count},\n\t//{ \"MCHT\", 4, 1,       &MMU.CheckTimers},\n\t//{ \"MCHD\", 4, 1,       &MMU.CheckDMAs},\n\n\t//fifos\n\t{ \"F0TH\", 1, 1,       &ipc_fifo[0].head},\n\t{ \"F0TL\", 1, 1,       &ipc_fifo[0].tail},\n\t{ \"F0SZ\", 1, 1,       &ipc_fifo[0].size},\n\t{ \"F0BF\", 4, 16,      ipc_fifo[0].buf},\n\t{ \"F1TH\", 1, 1,       &ipc_fifo[1].head},\n\t{ \"F1TL\", 1, 1,       &ipc_fifo[1].tail},\n\t{ \"F1SZ\", 1, 1,       &ipc_fifo[1].size},\n\t{ \"F1BF\", 4, 16,      ipc_fifo[1].buf},\n\n\t{ \"FDHD\", 4, 1,       &disp_fifo.head},\n\t{ \"FDTL\", 4, 1,       &disp_fifo.tail},\n\t{ \"FDBF\", 4, 0x6000,  disp_fifo.buf},\n\n\t{ \"PMCN\", 1, 1,\t\t\t&MMU.powerMan_CntReg},\n\t{ \"PMCW\", 4, 1,\t\t\t&MMU.powerMan_CntRegWritten},\n\t{ \"PMCR\", 1, 5,\t\t\t&MMU.powerMan_Reg},\n\n\t{ \"MR3D\", 4, 1,\t\t&MMU.reg_DISP3DCNT_bits},\n\t\n\t{ 0 }\n};\n\nSFORMAT SF_MOVIE[]={\n\t{ \"FRAC\", 4, 1, &currFrameCounter},\n\t{ \"LAGC\", 4, 1, &TotalLagFrames},\n\t{ 0 }\n};\n\n// TODO: integrate the new wifi state variables once everything is settled\nSFORMAT SF_WIFI[]={\n\t{ \"W000\", 4, 1, &wifiMac.powerOn},\n\t{ \"W010\", 4, 1, &wifiMac.powerOnPending},\n\n\t{ \"W020\", 2, 1, &wifiMac.rfStatus},\n\t{ \"W030\", 2, 1, &wifiMac.rfPins},\n\n\t{ \"W040\", 2, 1, &wifiMac.IE},\n\t{ \"W050\", 2, 1, &wifiMac.IF},\n\n\t{ \"W060\", 2, 1, &wifiMac.macMode},\n\t{ \"W070\", 2, 1, &wifiMac.wepMode},\n\t{ \"W080\", 4, 1, &wifiMac.WEP_enable},\n\n\t{ \"W100\", 2, 1, &wifiMac.TXCnt},\n\t{ \"W120\", 2, 1, &wifiMac.TXStat},\n\n\t{ \"W200\", 2, 1, &wifiMac.RXCnt},\n\t{ \"W210\", 2, 1, &wifiMac.RXCheckCounter},\n\n\t{ \"W220\", 1, 6, &wifiMac.mac.bytes},\n\t{ \"W230\", 1, 6, &wifiMac.bss.bytes},\n\n\t{ \"W240\", 2, 1, &wifiMac.aid},\n\t{ \"W250\", 2, 1, &wifiMac.pid},\n\t{ \"W260\", 2, 1, &wifiMac.retryLimit},\n\n\t{ \"W270\", 4, 1, &wifiMac.crystalEnabled},\n\t{ \"W280\", 8, 1, &wifiMac.usec},\n\t{ \"W290\", 4, 1, &wifiMac.usecEnable},\n\t{ \"W300\", 8, 1, &wifiMac.ucmp},\n\t{ \"W310\", 4, 1, &wifiMac.ucmpEnable},\n\t{ \"W320\", 2, 1, &wifiMac.eCount},\n\t{ \"W330\", 4, 1, &wifiMac.eCountEnable},\n\n\t{ \"WR00\", 4, 1, &wifiMac.RF.CFG1.val},\n\t{ \"WR01\", 4, 1, &wifiMac.RF.IFPLL1.val},\n\t{ \"WR02\", 4, 1, &wifiMac.RF.IFPLL2.val},\n\t{ \"WR03\", 4, 1, &wifiMac.RF.IFPLL3.val},\n\t{ \"WR04\", 4, 1, &wifiMac.RF.RFPLL1.val},\n\t{ \"WR05\", 4, 1, &wifiMac.RF.RFPLL2.val},\n\t{ \"WR06\", 4, 1, &wifiMac.RF.RFPLL3.val},\n\t{ \"WR07\", 4, 1, &wifiMac.RF.RFPLL4.val},\n\t{ \"WR08\", 4, 1, &wifiMac.RF.CAL1.val},\n\t{ \"WR09\", 4, 1, &wifiMac.RF.TXRX1.val},\n\t{ \"WR10\", 4, 1, &wifiMac.RF.PCNT1.val},\n\t{ \"WR11\", 4, 1, &wifiMac.RF.PCNT2.val},\n\t{ \"WR12\", 4, 1, &wifiMac.RF.VCOT1.val},\n\n\t{ \"W340\", 1, 105, &wifiMac.BB.data[0]},\n\n\t{ \"W350\", 2, 1, &wifiMac.rfIOCnt.val},\n\t{ \"W360\", 2, 1, &wifiMac.rfIOStatus.val},\n\t{ \"W370\", 4, 1, &wifiMac.rfIOData.val},\n\t{ \"W380\", 2, 1, &wifiMac.bbIOCnt.val},\n\n\t{ \"W400\", 2, 0x1000, &wifiMac.RAM[0]},\n\t{ \"W410\", 2, 1, &wifiMac.RXRangeBegin},\n\t{ \"W420\", 2, 1, &wifiMac.RXRangeEnd},\n\t{ \"W430\", 2, 1, &wifiMac.RXWriteCursor},\n\t{ \"W460\", 2, 1, &wifiMac.RXReadCursor},\n\t{ \"W470\", 2, 1, &wifiMac.RXUnits},\n\t{ \"W480\", 2, 1, &wifiMac.RXBufCount},\n\t{ \"W490\", 2, 1, &wifiMac.CircBufReadAddress},\n\t{ \"W500\", 2, 1, &wifiMac.CircBufWriteAddress},\n\t{ \"W510\", 2, 1, &wifiMac.CircBufRdEnd},\n\t{ \"W520\", 2, 1, &wifiMac.CircBufRdSkip},\n\t{ \"W530\", 2, 1, &wifiMac.CircBufWrEnd},\n\t{ \"W540\", 2, 1, &wifiMac.CircBufWrSkip},\n\n\t{ \"W580\", 2, 0x800, &wifiMac.IOPorts[0]},\n\t{ \"W590\", 2, 1, &wifiMac.randomSeed},\n\n\t{ 0 }\n};\n\nextern SFORMAT SF_RTC[];\n\nstatic u8 reserveVal = 0;\nSFORMAT reserveChunks[] = {\n\t{ \"RESV\", 1, 1, &reserveVal},\n\t{ 0 }\n};\n\nstatic void mmu_savestate(EMUFILE* os)\n{\n\tu32 version = 8;\n\twrite32le(version,os);\n\t\n\t//version 2:\n\tMMU_new.backupDevice.save_state(os);\n\t\n\t//version 3:\n\tMMU_new.gxstat.savestate(os);\n\tfor(int i=0;i<2;i++)\n\t\tfor(int j=0;j<4;j++)\n\t\t\tMMU_new.dma[i][j].savestate(os);\n\n\tMMU_timing.arm9codeFetch.savestate(os, version);\n\tMMU_timing.arm9dataFetch.savestate(os, version);\n\tMMU_timing.arm7codeFetch.savestate(os, version);\n\tMMU_timing.arm7dataFetch.savestate(os, version);\n\tMMU_timing.arm9codeCache.savestate(os, version);\n\tMMU_timing.arm9dataCache.savestate(os, version);\n\n\t//version 4:\n\tMMU_new.sqrt.savestate(os);\n\tMMU_new.div.savestate(os);\n\n\t//version 6:\n\tMMU_new.dsi_tsc.save_state(os);\n\n\t//version 8:\n\tos->write32le(MMU.fw.size);\n\tos->fwrite(MMU.fw.data,MMU.fw.size);\n}\n\nstatic bool mmu_loadstate(EMUFILE* is, int size)\n{\n\t//read version\n\tu32 version;\n\tif(read32le(&version,is) != 1) return false;\n\t\n\tif(version == 0 || version == 1)\n\t{\n\t\tu32 bupmem_size;\n\t\tu32 addr_size;\n\n\t\tif(version == 0)\n\t\t{\n\t\t\t//version 0 was buggy and didnt save the type. \n\t\t\t//it would silently fail if there was a size mismatch\n\t\t\tSAV_silent_fail_flag = true;\n\t\t\tif(read32le(&bupmem_size,is) != 1) return false;\n\t\t\t//if(bupmem_size != MMU.bupmem.size) return false; //mismatch between current initialized and saved size\n\t\t\taddr_size = BackupDevice::addr_size_for_old_save_size(bupmem_size);\n\t\t}\n\t\telse if(version == 1)\n\t\t{\n\t\t\t//version 1 reinitializes the save system with the type that was saved\n\t\t\tu32 bupmem_type;\n\t\t\tif(read32le(&bupmem_type,is) != 1) return false;\n\t\t\tif(read32le(&bupmem_size,is) != 1) return false;\n\t\t\taddr_size = BackupDevice::addr_size_for_old_save_type(bupmem_type);\n\t\t\tif(addr_size == 0xFFFFFFFF)\n\t\t\t\taddr_size = BackupDevice::addr_size_for_old_save_size(bupmem_size);\n\t\t}\n\n\t\tif(addr_size == 0xFFFFFFFF)\n\t\t\treturn false;\n\n\t\tu8* temp = new u8[bupmem_size];\n\t\tis->fread((char*)temp,bupmem_size);\n\t\tMMU_new.backupDevice.load_old_state(addr_size,temp,bupmem_size);\n\t\tdelete[] temp;\n\t\tif(is->fail()) return false;\n\t}\n\n\tif(version < 2) return true;\n\n\tbool ok = MMU_new.backupDevice.load_state(is);\n\n\tif(version < 3) return ok;\n\n\tok &= MMU_new.gxstat.loadstate(is);\n\t\n\tfor(int i=0;i<2;i++)\n\t\tfor(int j=0;j<4;j++)\n\t\t\tok &= MMU_new.dma[i][j].loadstate(is);\n\n\tok &= MMU_timing.arm9codeFetch.loadstate(is, version);\n\tok &= MMU_timing.arm9dataFetch.loadstate(is, version);\n\tok &= MMU_timing.arm7codeFetch.loadstate(is, version);\n\tok &= MMU_timing.arm7dataFetch.loadstate(is, version);\n\tok &= MMU_timing.arm9codeCache.loadstate(is, version);\n\tok &= MMU_timing.arm9dataCache.loadstate(is, version);\n\n\tif(version < 4) return ok;\n\n\tok &= MMU_new.sqrt.loadstate(is,version);\n\tok &= MMU_new.div.loadstate(is,version);\n\n\t//to prevent old savestates from confusing IF bits, mask out ones which had been stored but should have been generated\n\tMMU.reg_IF_bits[0] &= ~0x00200000;\n\tMMU.reg_IF_bits[1] &= ~0x00000000;\n\n\tMMU_new.gxstat.fifo_low = gxFIFO.size <= 127;\n\tMMU_new.gxstat.fifo_empty = gxFIFO.size == 0;\n\n\tif(version < 5)\n\t\tMMU.reg_DISP3DCNT_bits = T1ReadWord(MMU.ARM9_REG,0x60);\n\n\tif(version < 6) return ok;\n\n\tMMU_new.dsi_tsc.load_state(is);\n\n\t//version 6\n\tif(version < 7)\n\t{\n\t\t//recover WRAMCNT from the stashed WRAMSTAT memory location\n\t\tMMU.WRAMCNT = MMU.MMU_MEM[ARMCPU_ARM7][0x40][0x241];\n\t}\n\n\tif(version<8) return ok;\n\n\t//version 8:\n\tdelete[] MMU.fw.data;\n\tMMU.fw.size = is->read32le();\n\tMMU.fw.data = new u8[size];\n\tis->fread(MMU.fw.data,MMU.fw.size);\n\n\treturn ok;\n}\n\nstatic void cp15_savestate(EMUFILE* os)\n{\n\t//version\n\twrite32le(1,os);\n\n\tcp15.saveone(os);\n\t//ARM7 not have coprocessor\n\t//cp15_saveone((armcp15_t *)NDS_ARM7.coproc[15],os);\n}\n\nstatic bool cp15_loadstate(EMUFILE* is, int size)\n{\n\t//read version\n\tu32 version;\n\tif(read32le(&version,is) != 1) return false;\n\tif(version > 1) return false;\n\n\tif(!cp15.loadone(is)) return false;\n\t\n\tif(version == 0)\n\t{\n\t\t//ARM7 not have coprocessor\n\t\tu8 *tmp_buf = new u8 [sizeof(armcp15_t)];\n\t\tif (!tmp_buf) return false;\n\t\tif(!cp15.loadone(is)) return false;\n\t\tdelete [] tmp_buf;\n\t\ttmp_buf = NULL;\n\t}\n\n\treturn true;\n}\n\n\n\n/* Format time and convert to string */\nstatic char * format_time(time_t cal_time)\n{\n  struct tm *time_struct;\n  static char str[64];\n\n  time_struct=localtime(&cal_time);\n  strftime(str, sizeof str, \"%d-%b-%Y %H:%M:%S\", time_struct);\n\n  return(str);\n}\n\nvoid clear_savestates()\n{\n  u8 i;\n  for( i = 0; i < NB_STATES; i++ )\n    savestates[i].exists = FALSE;\n}\n\n// Scan for existing savestates and update struct\nvoid scan_savestates()\n{\n  struct stat sbuf;\n  char filename[MAX_PATH+1];\n\n  clear_savestates();\n\n  for(int i = 0; i < NB_STATES; i++ )\n    {\n     path.getpathnoext(path.STATES, filename);\n\t  \n\t  if (strlen(filename) + strlen(\".dst\") + strlen(\"-2147483648\") /* = biggest string for i */ >MAX_PATH) return ;\n      sprintf(filename+strlen(filename), \".ds%d\", i);\n      if( stat(filename,&sbuf) == -1 ) continue;\n      savestates[i].exists = TRUE;\n      strncpy(savestates[i].date, format_time(sbuf.st_mtime),40);\n\t  savestates[i].date[40-1] = '\\0';\n    }\n\n  return ;\n}\n\nvoid savestate_slot(int num)\n{\n   struct stat sbuf;\n   char filename[MAX_PATH+1];\n\n\tlastSaveState = num;\t\t//Set last savestate used\n\n    path.getpathnoext(path.STATES, filename);\n\n   if (strlen(filename) + strlen(\".dsx\") + strlen(\"-2147483648\") /* = biggest string for num */ >MAX_PATH) return ;\n   sprintf(filename+strlen(filename), \".ds%d\", num);\n\n   if (savestate_save(filename))\n   {\n\t   osd->setLineColor(255, 255, 255);\n\t   if(num == 10) //autosave\n\t\t\tosd->addLine(\"Saved autosave\");\n\t   else\n\t\t\tosd->addLine(\"Saved to %i slot\", num);\n   }\n   else\n   {\n\t   osd->setLineColor(255, 0, 0);\n\t   if(num == 10) //autosave\n\t\t\tosd->addLine(\"Error saving autosave\");\n\t   else\t\n\t\t\tosd->addLine(\"Error saving %i slot\", num);\n\t   return;\n   }\n\n   if (num >= 0 && num < NB_STATES)\n   {\n\t   if (stat(filename,&sbuf) != -1)\n\t   {\n\t\t   savestates[num].exists = TRUE;\n\t\t   strncpy(savestates[num].date, format_time(sbuf.st_mtime),40);\n\t\t   savestates[num].date[40-1] = '\\0';\n\t   }\n   }\n}\n\nvoid loadstate_slot(int num)\n{\n   char filename[MAX_PATH];\n\n   lastSaveState = num;\t\t//Set last savestate used\n\n    path.getpathnoext(path.STATES, filename);\n\n   if (strlen(filename) + strlen(\".dsx\") + strlen(\"-2147483648\") /* = biggest string for num */ >MAX_PATH) return ;\n   sprintf(filename+strlen(filename), \".ds%d\", num);\n   if (savestate_load(filename))\n   {\n\t   osd->setLineColor(255, 255, 255);\n\t   if(num == 10) //autosave\n\t\t\tosd->addLine(\"Loaded autosave\");\n\t   else\n\t\t\tosd->addLine(\"Loaded from %i slot\", num);\n   }\n   else\n   {\n\t   osd->setLineColor(255, 0, 0);\n\t   if(num == 10) //autosave\n\t\t\tosd->addLine(\"Error loading autosave\");\n\t   else\n\t\t\tosd->addLine(\"Error loading %i slot\", num);\n   }\n}\n\n\n// note: guessSF is so we don't have to do a linear search through the SFORMAT array every time\n// in the (most common) case that we already know where the next entry is.\nstatic const SFORMAT *CheckS(const SFORMAT *guessSF, const SFORMAT *firstSF, u32 size, u32 count, char *desc)\n{\n\tconst SFORMAT *sf = guessSF ? guessSF : firstSF;\n\twhile(sf->v)\n\t{\n\t\t//NOT SUPPORTED RIGHT NOW\n\t\t//if(sf->size==~0)\t\t// Link to another SFORMAT structure.\n\t\t//{\n\t\t//\tSFORMAT *tmp;\n\t\t//\tif((tmp= CheckS((SFORMAT *)sf->v, tsize, desc) ))\n\t\t//\t\treturn(tmp);\n\t\t//\tsf++;\n\t\t//\tcontinue;\n\t\t//}\n\t\tif(!memcmp(desc,sf->desc,4))\n\t\t{\n\t\t\tif(sf->size != size || sf->count != count)\n\t\t\t\treturn 0;\n\t\t\treturn sf;\n\t\t}\n\n\t\t// failed to find it, have to keep iterating\n\t\tif(guessSF)\n\t\t{\n\t\t\tsf = firstSF;\n\t\t\tguessSF = NULL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsf++;\n\t\t}\n\t}\n\treturn 0;\n}\n\n\nstatic bool ReadStateChunk(EMUFILE* is, const SFORMAT *sf, int size)\n{\n\tconst SFORMAT *tmp = NULL;\n\tconst SFORMAT *guessSF = NULL;\n\tint temp = is->ftell();\n\n\twhile(is->ftell()<temp+size)\n\t{\n\t\tu32 sz, count;\n\n\t\tchar toa[4];\n\t\tis->fread(toa,4);\n\t\tif(is->fail())\n\t\t\treturn false;\n\n\t\tif(!read32le(&sz,is)) return false;\n\t\tif(!read32le(&count,is)) return false;\n\n\t\tif((tmp=CheckS(guessSF,sf,sz,count,toa)))\n\t\t{\n\t\t#ifdef LOCAL_LE\n\t\t\t// no need to ever loop one at a time if not flipping byte order\n\t\t\tis->fread((char *)tmp->v,sz*count);\n\t\t#else\n\t\t\tif(sz == 1) {\n\t\t\t\t//special case: read a huge byte array\n\t\t\t\tis->fread((char *)tmp->v,count);\n\t\t\t} else {\n\t\t\t\tfor(unsigned int i=0;i<count;i++)\n\t\t\t\t{\n\t\t\t\t\tis->fread((char *)tmp->v + i*sz,sz);\n                    FlipByteOrder((u8*)tmp->v + i*sz,sz);\n\t\t\t\t}\n\t\t\t}\n\t\t#endif\n\t\t\tguessSF = tmp + 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tis->fseek(sz*count,SEEK_CUR);\n\t\t\tguessSF = NULL;\n\t\t}\n\t} // while(...)\n\treturn true;\n}\n\n\n\nstatic int SubWrite(EMUFILE* os, const SFORMAT *sf)\n{\n\tuint32 acc=0;\n\n#ifdef DEBUG\n\tstd::set<std::string> keyset;\n#endif\n\n\tconst SFORMAT* temp = sf;\n\twhile(temp->v) {\n\t\tconst SFORMAT* seek = sf;\n\t\twhile(seek->v && seek != temp) {\n\t\t\tif(!strcmp(seek->desc,temp->desc)) {\n\t\t\t\tprintf(\"ERROR! duplicated chunk name: %s\\n\", temp->desc);\n\t\t\t}\n\t\t\tseek++;\n\t\t}\n\t\ttemp++;\n\t}\n\n\twhile(sf->v)\n\t{\n\t\t//not supported right now\n\t\t//if(sf->size==~0)\t\t//Link to another struct\n\t\t//{\n\t\t//\tuint32 tmp;\n\n\t\t//\tif(!(tmp=SubWrite(os,(SFORMAT *)sf->v)))\n\t\t//\t\treturn(0);\n\t\t//\tacc+=tmp;\n\t\t//\tsf++;\n\t\t//\tcontinue;\n\t\t//}\n\n\t\tint count = sf->count;\n\t\tint size = sf->size;\n\n        //add size of current node to the accumulator\n\t\tacc += 4 + sizeof(sf->size) + sizeof(sf->count);\n\t\tacc += count * size;\n\n\t\tif(os)\t\t\t//Are we writing or calculating the size of this block?\n\t\t{\n\t\t\tos->fwrite(sf->desc,4);\n\t\t\twrite32le(sf->size,os);\n\t\t\twrite32le(sf->count,os);\n\n\t\t\t#ifdef DEBUG\n\t\t\t//make sure we dont dup any keys\n\t\t\tif(keyset.find(sf->desc) != keyset.end())\n\t\t\t{\n\t\t\t\tprintf(\"duplicate save key!\\n\");\n\t\t\t\tassert(false);\n\t\t\t}\n\t\t\tkeyset.insert(sf->desc);\n\t\t\t#endif\n\n\n\t\t#ifdef LOCAL_LE\n\t\t\t// no need to ever loop one at a time if not flipping byte order\n\t\t\tos->fwrite((char *)sf->v,size*count);\n\t\t#else\n\t\t\tif(size == 1) {\n\t\t\t\t//special case: write a huge byte array\n\t\t\t\tos->fwrite((char *)sf->v,count);\n\t\t\t} else {\n\t\t\t\tfor(int i=0;i<count;i++) {\n\t\t\t\t\tFlipByteOrder((u8*)sf->v + i*size, size);\n\t\t\t\t\tos->fwrite((char*)sf->v + i*size,size);\n\t\t\t\t\t//Now restore the original byte order.\n\t\t\t\t\tFlipByteOrder((u8*)sf->v + i*size, size);\n\t\t\t\t}\n\t\t\t}\n\t\t#endif\n\t\t}\n\t\tsf++;\n\t}\n\n\treturn(acc);\n}\n\nstatic int savestate_WriteChunk(EMUFILE* os, int type, const SFORMAT *sf)\n{\n\twrite32le(type,os);\n\tif(!sf) return 4;\n\tint bsize = SubWrite((EMUFILE*)0,sf);\n\twrite32le(bsize,os);\n\n\tif(!SubWrite(os,sf))\n\t{\n\t\treturn 8;\n\t}\n\treturn (bsize+8);\n}\n\nstatic void savestate_WriteChunk(EMUFILE* os, int type, void (*saveproc)(EMUFILE* os))\n{\n\tu32 pos1 = os->ftell();\n\n\t//write the type, size(placeholder), and data\n\twrite32le(type,os);\n\tos->fseek(4, SEEK_CUR); // skip the size, we write that later\n\tsaveproc(os);\n\n\t//get the size\n\tu32 pos2 = os->ftell();\n\tassert(pos2 != (u32)-1); // if this assert fails, saveproc did something bad\n\tu32 size = (pos2 - pos1) - (2 * sizeof(u32));\n\n\t//fill in the actual size\n\tos->fseek(pos1 + sizeof(u32),SEEK_SET);\n\twrite32le(size,os);\n\tos->fseek(pos2,SEEK_SET);\n\n/*\n// old version of this function,\n// for reference in case the new one above starts misbehaving somehow:\n\n\t// - this is retarded. why not write placeholders for size and then write directly to the stream\n\t//and then go back and fill them in\n\n\t//get the size\n\tmemorystream mstemp;\n\tsaveproc(&mstemp);\n\tmstemp.flush();\n\tu32 size = mstemp.size();\n\n\t//write the type, size, and data\n\twrite32le(type,os);\n\twrite32le(size,os);\n\tos->write(mstemp.buf(),size);\n*/\n}\n\nstatic void writechunks(EMUFILE* os);\n\nbool savestate_save(EMUFILE* outstream, int compressionLevel)\n{\n#ifdef HAVE_JIT \n\tif (arm_cpubase)\n\t\tarm_cpubase->Sync();\n#endif\n\t#ifndef HAVE_LIBZ\n\tcompressionLevel = Z_NO_COMPRESSION;\n\t#endif\n\n\tEMUFILE_MEMORY ms;\n\tEMUFILE* os;\n\t\n\tif(compressionLevel != Z_NO_COMPRESSION)\n\t{\n\t\t//generate the savestate in memory first\n\t\tos = (EMUFILE*)&ms;\n\t\twritechunks(os);\n\t}\n\telse\n\t{\n\t\tos = outstream;\n\t\tos->fseek(32,SEEK_SET); //skip the header\n\t\twritechunks(os);\n\t}\n\n\t//save the length of the file\n\tu32 len = os->ftell();\n\n\tu32 comprlen = 0xFFFFFFFF;\n\tu8* cbuf;\n\n\t//compress the data\n\tint error = Z_OK;\n\tif(compressionLevel != Z_NO_COMPRESSION)\n\t{\n\t\tcbuf = ms.buf();\n\t\tuLongf comprlen2;\n\t\t//worst case compression.\n\t\t//zlib says \"0.1% larger than sourceLen plus 12 bytes\"\n\t\tcomprlen = (len>>9)+12 + len;\n\t\tcbuf = new u8[comprlen];\n\t\t// Workaround to make it compile under linux 64bit\n\t\tcomprlen2 = comprlen;\n\t\terror = compress2(cbuf,&comprlen2,ms.buf(),len,compressionLevel);\n\t\tcomprlen = (u32)comprlen2;\n\t}\n\n\t//dump the header\n\toutstream->fseek(0,SEEK_SET);\n\toutstream->fwrite(magic,16);\n\twrite32le(SAVESTATE_VERSION,outstream);\n\twrite32le(EMU_DESMUME_VERSION_NUMERIC(),outstream); //desmume version\n\twrite32le(len,outstream); //uncompressed length\n\twrite32le(comprlen,outstream); //compressed length (-1 if it is not compressed)\n\n\tif(compressionLevel != Z_NO_COMPRESSION)\n\t{\n\t\toutstream->fwrite((char*)cbuf,comprlen==(u32)-1?len:comprlen);\n\t\tdelete[] cbuf;\n\t}\n\n\treturn error == Z_OK;\n}\n\nbool savestate_save (const char *file_name)\n{\n\tEMUFILE_MEMORY ms;\n\tsize_t elems_written;\n#ifdef HAVE_LIBZ\n\tif(!savestate_save(&ms, Z_DEFAULT_COMPRESSION))\n#else\n\tif(!savestate_save(&ms, 0))\n#endif\n\t\treturn false;\n\tFILE* file = fopen(file_name,\"wb\");\n\tif(file)\n\t{\n\t\telems_written = fwrite(ms.buf(),1,ms.size(),file);\n\t\tfclose(file);\n\t\treturn (elems_written == ms.size());\n\t} else return false;\n}\n\nstatic void writechunks(EMUFILE* os) {\n\tsavestate_WriteChunk(os,1,SF_ARM9);\n\tsavestate_WriteChunk(os,2,SF_ARM7);\n\tsavestate_WriteChunk(os,3,cp15_savestate);\n\tsavestate_WriteChunk(os,4,SF_MEM);\n\tsavestate_WriteChunk(os,5,SF_NDS);\n\tsavestate_WriteChunk(os,51,nds_savestate);\n\tsavestate_WriteChunk(os,60,SF_MMU);\n\tsavestate_WriteChunk(os,61,mmu_savestate);\n\tsavestate_WriteChunk(os,7,gpu_savestate);\n\tsavestate_WriteChunk(os,8,spu_savestate);\n\tsavestate_WriteChunk(os,81,mic_savestate);\n\tsavestate_WriteChunk(os,90,SF_GFX3D);\n\tsavestate_WriteChunk(os,91,gfx3d_savestate);\n\tsavestate_WriteChunk(os,100,SF_MOVIE);\n\tsavestate_WriteChunk(os,101,mov_savestate);\n\tsavestate_WriteChunk(os,110,SF_WIFI);\n\tsavestate_WriteChunk(os,120,SF_RTC);\n\tsavestate_WriteChunk(os,130,SF_NDS_HEADER);\n\t// reserved for future versions\n\tsavestate_WriteChunk(os,140,reserveChunks);\n\tsavestate_WriteChunk(os,150,reserveChunks);\n\tsavestate_WriteChunk(os,160,reserveChunks);\n\tsavestate_WriteChunk(os,170,reserveChunks);\n\tsavestate_WriteChunk(os,180,reserveChunks);\n\t// ============================\n\tsavestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0);\n}\n\nstatic bool ReadStateChunks(EMUFILE* is, s32 totalsize)\n{\n\tbool ret = true;\n\tbool haveInfo = false;\n\t\n\tu32 romsize = 0;\n\tNDS_header header;\n\tSFORMAT SF_HEADER[]={\n\t\t{ \"GINF\", 1, sizeof(header), &header},\n\t\t{ \"GRSZ\", 1, 4, &romsize},\n\t\t{ 0 }\n\t};\n\tmemset(&header, 0, sizeof(header));\n\n\twhile(totalsize > 0)\n\t{\n\t\tu32 size = 0;\n\t\tu32 t = 0;\n\t\tif(!read32le(&t,is))  { ret=false; break; }\n\t\tif(t == 0xFFFFFFFF) break;\n\t\tif(!read32le(&size,is))  { ret=false; break; }\n\t\tswitch(t)\n\t\t{\n\t\t\tcase 1: if(!ReadStateChunk(is,SF_ARM9,size)) ret=false; break;\n\t\t\tcase 2: if(!ReadStateChunk(is,SF_ARM7,size)) ret=false; break;\n\t\t\tcase 3: if(!cp15_loadstate(is,size)) ret=false; break;\n\t\t\tcase 4: if(!ReadStateChunk(is,SF_MEM,size)) ret=false; break;\n\t\t\tcase 5: if(!ReadStateChunk(is,SF_NDS,size)) ret=false; break;\n\t\t\tcase 51: if(!nds_loadstate(is,size)) ret=false; break;\n\t\t\tcase 60: if(!ReadStateChunk(is,SF_MMU,size)) ret=false; break;\n\t\t\tcase 61: if(!mmu_loadstate(is,size)) ret=false; break;\n\t\t\tcase 7: if(!gpu_loadstate(is,size)) ret=false; break;\n\t\t\tcase 8: if(!spu_loadstate(is,size)) ret=false; break;\n\t\t\tcase 81: if(!mic_loadstate(is,size)) ret=false; break;\n\t\t\tcase 90: if(!ReadStateChunk(is,SF_GFX3D,size)) ret=false; break;\n\t\t\tcase 91: if(!gfx3d_loadstate(is,size)) ret=false; break;\n\t\t\tcase 100: if(!ReadStateChunk(is,SF_MOVIE, size)) ret=false; break;\n\t\t\tcase 101: if(!mov_loadstate(is, size)) ret=false; break;\n\t\t\tcase 110: if(!ReadStateChunk(is,SF_WIFI,size)) ret=false; break;\n\t\t\tcase 120: if(!ReadStateChunk(is,SF_RTC,size)) ret=false; break;\n\t\t\tcase 130: if(!ReadStateChunk(is,SF_HEADER,size)) ret=false; else haveInfo=true; break;\n\t\t\t// reserved for future versions\n\t\t\tcase 140:\n\t\t\tcase 150:\n\t\t\tcase 160:\n\t\t\tcase 170:\n\t\t\tcase 180:\n\t\t\t\tif(!ReadStateChunk(is,reserveChunks,size)) ret=false;\n\t\t\tbreak;\n\t\t\t// ============================\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t\tif(!ret)\n\t\t\treturn false;\n\t}\n\n\tif (haveInfo)\n\t{\n\t\tchar buf[14] = {0};\n\t\tmemset(&buf[0], 0, sizeof(buf));\n\t\tmemcpy(buf, header.gameTile, sizeof(header.gameTile));\n\t\tprintf(\"Savestate info:\\n\");\n\t\tprintf(\"\\tGame title: %s\\n\", buf);\n\t\tprintf(\"\\tGame code: %c%c%c%c\\n\", header.gameCode[3], header.gameCode[2], header.gameCode[1], header.gameCode[0]);\n\t\tprintf(\"\\tMaker code: %c%c (0x%04X) - %s\\n\", header.makerCode & 0xFF, header.makerCode >> 8, header.makerCode, getDeveloperNameByID(header.makerCode).c_str());\n\t\tprintf(\"\\tDevice capacity: %dMb (real size %dMb)\\n\", ((128 * 1024) << header.cardSize) / (1024 * 1024), romsize / (1024 * 1024));\n\t\tprintf(\"\\tCRC16: %04Xh\\n\", header.CRC16);\n\t\tprintf(\"\\tHeader CRC16: %04Xh\\n\", header.headerCRC16);\n\n\t\tif (gameInfo.romsize != romsize || memcmp(&gameInfo.header, &header, sizeof(header)) != 0)\n\t\t\tmsgbox->warn(\"The savestate you are loading does not match the ROM you are running.\\nYou should find the correct ROM\");\n\t}\n\n\treturn ret;\n}\n\nstatic void loadstate()\n{\n    // This should regenerate the vram banks\n    for (int i = 0; i < 0xA; i++)\n       _MMU_write08<ARMCPU_ARM9>(0x04000240+i, _MMU_read08<ARMCPU_ARM9>(0x04000240+i));\n\n    // This should regenerate the graphics power control register\n    _MMU_write16<ARMCPU_ARM9>(0x04000304, _MMU_read16<ARMCPU_ARM9>(0x04000304));\n\n\t// This should regenerate the graphics configuration\n\t//zero 27-jul-09 : was formerly up to 7F but that wrote to dispfifo which is dumb (one of nitsuja's desynch bugs [that he found, not caused])\n\t//so then i brought it down to 66 but this resulted in a conceptual bug with affine start registers, which shouldnt get regenerated\n\t//so then i just made this exhaustive list\n //   for (int i = REG_BASE_DISPA; i<=REG_BASE_DISPA + 0x66; i+=2)\n\t//_MMU_write16<ARMCPU_ARM9>(i, _MMU_read16<ARMCPU_ARM9>(i));\n //   for (int i = REG_BASE_DISPB; i<=REG_BASE_DISPB + 0x7F; i+=2)\n\t//_MMU_write16<ARMCPU_ARM9>(i, _MMU_read16<ARMCPU_ARM9>(i));\n\tstatic const u8 mainRegenAddr[] = {0x00,0x02,0x08,0x0a,0x0c,0x0e,0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x50,0x52,0x54,0x64,0x66,0x6c};\n\tstatic const u8 subRegenAddr[] =  {0x00,0x02,0x08,0x0a,0x0c,0x0e,0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x50,0x52,0x54,0x6c};\n\tfor(u32 i=0;i<ARRAY_SIZE(mainRegenAddr);i++)\n\t\t_MMU_write16<ARMCPU_ARM9>(REG_BASE_DISPA+mainRegenAddr[i], _MMU_read16<ARMCPU_ARM9>(REG_BASE_DISPA+mainRegenAddr[i]));\n\tfor(u32 i=0;i<ARRAY_SIZE(subRegenAddr);i++)\n\t\t_MMU_write16<ARMCPU_ARM9>(REG_BASE_DISPB+subRegenAddr[i], _MMU_read16<ARMCPU_ARM9>(REG_BASE_DISPB+subRegenAddr[i]));\n\t// no need to restore 0x60 since control and MMU.ARM9_REG are both in the savestates, and restoring it could mess up the ack bits anyway\n\n\tSetupMMU(nds.Is_DebugConsole(),nds.Is_DSI());\n\n\texecute = !driver->EMU_IsEmulationPaused();\n}\n\nbool savestate_load(EMUFILE* is)\n{\n\tSAV_silent_fail_flag = false;\n\tchar header[16];\n\tis->fread(header,16);\n\tif(is->fail() || memcmp(header,magic,16))\n\t\treturn false;\n\n\tu32 ssversion,dversion,len,comprlen;\n\tif(!read32le(&ssversion,is)) return false;\n\tif(!read32le(&dversion,is)) return false;\n\tif(!read32le(&len,is)) return false;\n\tif(!read32le(&comprlen,is)) return false;\n\n\tif(ssversion != SAVESTATE_VERSION) return false;\n\n\tstd::vector<u8> buf(len);\n\n\tif(comprlen != 0xFFFFFFFF) {\n#ifndef HAVE_LIBZ\n\t\t//without libz, we can't decompress this savestate\n\t\treturn false;\n#endif\n\t\tstd::vector<char> cbuf(comprlen);\n\t\tis->fread(&cbuf[0],comprlen);\n\t\tif(is->fail()) return false;\n\n#ifdef HAVE_LIBZ\n\t\tuLongf uncomprlen = len;\n\t\tint error = uncompress((uint8*)&buf[0],&uncomprlen,(uint8*)&cbuf[0],comprlen);\n\t\tif(error != Z_OK || uncomprlen != len)\n\t\t\treturn false;\n#endif\n\t} else {\n\t\tis->fread((char*)&buf[0],len-32);\n\t}\n\n\t//GO!! READ THE SAVESTATE\n\t//THERE IS NO GOING BACK NOW\n\t//reset the emulator first to clean out the host's state\n\n\t//while the series of resets below should work,\n\t//we are testing the robustness of the savestate system with this full reset.\n\t//the full reset wipes more things, so we can make sure that they are being restored correctly\n\textern bool _HACK_DONT_STOPMOVIE;\n\t_HACK_DONT_STOPMOVIE = true;\n\tNDS_Reset();\n\t_HACK_DONT_STOPMOVIE = false;\n\n\t//reset some options to their old defaults which werent saved\n\tnds._DebugConsole = FALSE;\n\n\t//GPU_Reset(MainScreen.gpu, 0);\n\t//GPU_Reset(SubScreen.gpu, 1);\n\t//gfx3d_reset();\n\t//gpu3D->NDS_3D_Reset();\n\t//SPU_Reset();\n\n\tEMUFILE_MEMORY mstemp(&buf);\n\tbool x = ReadStateChunks(&mstemp,(s32)len);\n\n\tif(!x && !SAV_silent_fail_flag)\n\t{\n\t\tmsgbox->error(\"Error loading savestate. It failed halfway through;\\nSince there is no savestate backup system, your current game session is wrecked\");\n\t\treturn false;\n\t}\n\n\tloadstate();\n\n\tif(nds.ConsoleType != CommonSettings.ConsoleType) {\n\t\tprintf(\"WARNING: forcing console type to: ConsoleType=%d\\n\",nds.ConsoleType);\n\t}\n\n\tif((nds._DebugConsole!=0) != CommonSettings.DebugConsole) {\n\t\t\tprintf(\"WARNING: forcing console debug mode to: debugmode=%s\\n\",nds._DebugConsole?\"TRUE\":\"FALSE\");\n\t}\n\n\n\treturn true;\n}\n\nbool savestate_load(const char *file_name)\n{\n\tEMUFILE_FILE f(file_name,\"rb\");\n\tif(f.fail()) return false;\n\n\treturn savestate_load(&f);\n}\n\nstatic std::stack<EMUFILE_MEMORY*> rewindFreeList;\nstatic std::vector<EMUFILE_MEMORY*> rewindbuffer;\n\nint rewindstates = 16;\nint rewindinterval = 4;\n\nvoid rewindsave () {\n\n\tif(currFrameCounter % rewindinterval)\n\t\treturn;\n\n\t//printf(\"rewindsave\"); printf(\"%d%s\", currFrameCounter, \"\\n\");\n\n\t\n\tEMUFILE_MEMORY *ms;\n\tif(!rewindFreeList.empty()) {\n\t\tms = rewindFreeList.top();\n\t\trewindFreeList.pop();\n\t} else {\n\t\tms = new EMUFILE_MEMORY(1024*1024*12);\n\t}\n\n\tif(!savestate_save(ms, Z_NO_COMPRESSION))\n\t\treturn;\n\n\trewindbuffer.push_back(ms);\n\t\n\tif((int)rewindbuffer.size() > rewindstates) {\n\t\tdelete *rewindbuffer.begin();\n\t\trewindbuffer.erase(rewindbuffer.begin());\n\t}\n}\n\nvoid dorewind()\n{\n\tif(currFrameCounter % rewindinterval)\n\t\treturn;\n\n\t//printf(\"rewind\\n\");\n\n\tint size = rewindbuffer.size();\n\n\tif(size < 1) {\n\t\tprintf(\"rewind buffer empty\\n\");\n\t\treturn;\n\t}\n\n\tprintf(\"%d\", size);\n\n\tEMUFILE_MEMORY* loadms = rewindbuffer[size-1];\n\tloadms->fseek(32, SEEK_SET);\n\n\tReadStateChunks(loadms,loadms->size()-32);\n\tloadstate();\n\n\tif(rewindbuffer.size()>1)\n\t{\n\t\trewindFreeList.push(loadms);\n\t\trewindbuffer.pop_back();\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/saves.h",
    "content": "/*\n\tCopyright (C) 2006 Normmatt\n\tCopyright (C) 2007 Pascal Giard\n\tCopyright (C) 2007-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _SRAM_H\n#define _SRAM_H\n\n#include \"types.h\"\n\n#define NB_STATES 11\n\nextern int lastSaveState;\n\ntypedef struct \n{\n  BOOL exists;\n  char date[40];\n} savestates_t;\n\n\nstruct SFORMAT\n{\n\t//a string description of the element\n\tconst char *desc;\n\n\t//the size of each element\n\tu32 size;\n\n\t//the number of each element\n\tu32 count;\n\n\t//a void* to the data or a void** to the data\n\tvoid *v;\n};\n\nextern savestates_t savestates[NB_STATES];\n\nvoid clear_savestates();\nvoid scan_savestates();\nu8 sram_read (u32 address);\nvoid sram_write (u32 address, u8 value);\nint sram_load (const char *file_name);\nint sram_save (const char *file_name);\n\nbool savestate_load (const char *file_name);\nbool savestate_save (const char *file_name);\n\nvoid savestate_slot(int num);\nvoid loadstate_slot(int num);\n\nbool savestate_load(class EMUFILE* is);\nbool savestate_save(class EMUFILE* outstream, int compressionLevel);\n\nvoid dorewind();\nvoid rewindsave();\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/sequencer.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _SEQUENCER_H\n#define _SEQUENCER_H\n\n#include \"types.h\"\n#include \"emufile.h\"\n\nstruct TSequenceItem\n{\n\tu64 timestamp;\n\tu32 param;\n\tbool enabled;\n\n\tvirtual void save(EMUFILE* os);\n\tvirtual bool load(EMUFILE* is);\n\tFORCEINLINE bool isTriggered();\n\tFORCEINLINE u64 next();\n};\n\nstruct TSequenceItem_GXFIFO : public TSequenceItem\n{\n\tFORCEINLINE bool isTriggered();\n\tFORCEINLINE void exec();\n\tFORCEINLINE u64 next();\n};\n\nextern TSequenceItem_GXFIFO& sequencer_gfxfifo;\nextern bool& sequencer_reschedule;\nextern u64 nds_timer;\n\nFORCEINLINE void NDS_Reschedule() \n{\n\tsequencer_reschedule = true;\n}\n\n#define NDS_RescheduleGXFIFO(cost)\t\t\t\\\n{\t\t\t\t\t\t\t\t\t\t\t\\\n\tif(!sequencer_gfxfifo.enabled) {\t\t\\\n\t\tMMU.gfx3dCycles = nds_timer;\t\t\\\n\t\tsequencer_gfxfifo.enabled = true;\t\\\n\t}\t\t\t\t\t\t\t\t\t\t\\\n\tMMU.gfx3dCycles += cost;\t\t\t\t\\\n\tNDS_Reschedule();\t\t\t\t\t\t\\\n}\n\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/shaders.h",
    "content": "/*\n\tCopyright (C) 2008-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* Predefined OpenGL shaders */\n\n/* Vertex shader */\nconst char *vertexShader = \n{\"\\\n\tattribute vec4 inPosition; \\n\\\n\tattribute vec2 inTexCoord0; \\n\\\n\tattribute vec3 inColor; \\n\\\n\t\\n\\\n\tuniform float polyAlpha; \\n\\\n\tuniform vec2 texScale; \\n\\\n\t\\n\\\n\tvarying vec4 vtxPosition; \\n\\\n\tvarying vec2 vtxTexCoord; \\n\\\n\tvarying vec4 vtxColor; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\t// Keep the projection matrix as a placeholder in case we need to use one in the future. \\n\\\n\t\tmat4 projectionMtx\t= mat4(\tvec4(1.0, 0.0, 0.0, 0.0), \\n\\\n\t\t\t\t\t\t\t\t\tvec4(0.0, 1.0, 0.0, 0.0), \\n\\\n\t\t\t\t\t\t\t\t\tvec4(0.0, 0.0, 1.0, 0.0), \\n\\\n\t\t\t\t\t\t\t\t\tvec4(0.0, 0.0, 0.0, 1.0));\\n\\\n\t\t\\n\\\n\t\tmat2 texScaleMtx\t= mat2(\tvec2(texScale.x,        0.0), \\n\\\n\t\t\t\t\t\t\t\t\tvec2(       0.0, texScale.y)); \\n\\\n\t\t\\n\\\n\t\tvtxPosition = projectionMtx * inPosition; \\n\\\n\t\tvtxTexCoord = texScaleMtx * inTexCoord0; \\n\\\n\t\tvtxColor = vec4(inColor * 4.0, polyAlpha); \\n\\\n\t\t\\n\\\n\t\tgl_Position = vtxPosition; \\n\\\n\t} \\n\\\n\"};\n\n/* precision mediump float; \\n\\ */\n/* Fragment shader */\nconst char *fragmentShader = \n{\"\\\n\tuniform sampler2D texMainRender; \\n\\\n\tuniform sampler2D texToonTable; \\n\\\n\tuniform int polyID; \\n\\\n\tuniform bool hasTexture; \\n\\\n\tuniform int polygonMode; \\n\\\n\tuniform int toonShadingMode; \\n\\\n\tuniform int oglWBuffer; \\n\\\n\tuniform bool enableAlphaTest; \\n\\\n\tuniform float alphaTestRef; \\n\\\n\t\\n\\\n\tvarying vec4 vtxPosition; \\n\\\n\tvarying vec2 vtxTexCoord; \\n\\\n\tvarying vec4 vtxColor; \\n\\\n\t\\n\\\n\tvoid main() \\n\\\n\t{ \\n\\\n\t\tvec4 texColor = vec4(1.0, 1.0, 1.0, 1.0); \\n\\\n\t\tvec4 flagColor; \\n\\\n\t\tfloat flagDepth; \\n\\\n\t\t\\n\\\n\t\tif(hasTexture) \\n\\\n\t\t{ \\n\\\n\t\t\ttexColor = texture2D(texMainRender, vtxTexCoord); \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tflagColor = texColor; \\n\\\n\t\t\\n\\\n\t\tif(polygonMode == 0) \\n\\\n\t\t{ \\n\\\n\t\t\tflagColor = vtxColor * texColor; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 1) \\n\\\n\t\t{ \\n\\\n\t\t\tif (texColor.a == 0.0 || !hasTexture) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tflagColor.rgb = vtxColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse if (texColor.a == 1.0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tflagColor.rgb = texColor.rgb; \\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tflagColor.rgb = texColor.rgb * (1.0-texColor.a) + vtxColor.rgb * texColor.a;\\n\\\n\t\t\t} \\n\\\n\t\t\t\\n\\\n\t\t\tflagColor.a = vtxColor.a; \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 2) \\n\\\n\t\t{ \\n\\\n\t\t\tif (toonShadingMode == 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tvec3 toonColor = vec3(texture2D(texToonTable, vec2(vtxColor.r, 0)).rgb); \\n\\\n\t\t\t\tflagColor.rgb = texColor.rgb * toonColor.rgb;\\n\\\n\t\t\t\tflagColor.a = texColor.a * vtxColor.a;\\n\\\n\t\t\t} \\n\\\n\t\t\telse \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tvec3 toonColor = vec3(texture2D(texToonTable, vec2(vtxColor.r, 0)).rgb); \\n\\\n\t\t\t\tflagColor.rgb = texColor.rgb * vtxColor.rgb + toonColor.rgb; \\n\\\n\t\t\t\tflagColor.a = texColor.a * vtxColor.a; \\n\\\n\t\t\t} \\n\\\n\t\t} \\n\\\n\t\telse if(polygonMode == 3) \\n\\\n\t\t{ \\n\\\n\t\t\tif (polyID != 0) \\n\\\n\t\t\t{ \\n\\\n\t\t\t\tflagColor = vtxColor; \\n\\\n\t\t\t} \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tif (flagColor.a == 0.0 || (enableAlphaTest && flagColor.a < alphaTestRef)) \\n\\\n\t\t{ \\n\\\n\t\t\tdiscard; \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tif (oglWBuffer == 1) \\n\\\n\t\t{ \\n\\\n\t\t\t// TODO \\n\\\n\t\t\tflagDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \\n\\\n\t\t} \\n\\\n\t\telse \\n\\\n\t\t{ \\n\\\n\t\t\tflagDepth = (vtxPosition.z / vtxPosition.w) * 0.5 + 0.5; \\n\\\n\t\t} \\n\\\n\t\t\\n\\\n\t\tgl_FragColor = flagColor; \\n\\\n\t\tgl_FragDepth = flagDepth; \\n\\\n\t} \\n\\\n\"};\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/slot1.cpp",
    "content": "/*\r\n\tCopyright (C) 2010-2012 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include <string>\r\n\r\n#include \"types.h\"\r\n#include \"slot1.h\"\r\n\r\n#include \"NDSSystem.h\"\r\n#include \"emufile.h\"\r\n#include \"utils/vfat.h\"\r\n\r\nextern SLOT1INTERFACE slot1None;\r\nextern SLOT1INTERFACE slot1Retail;\r\nextern SLOT1INTERFACE slot1R4;\r\nextern SLOT1INTERFACE slot1Retail_NAND;\r\n\r\nstatic EMUFILE* fatImage = NULL;\r\nstatic std::string fatDir;\r\n\r\nSLOT1INTERFACE slot1List[NDS_SLOT1_COUNT] = {\r\n\t\tslot1None,\r\n\t\tslot1Retail,\r\n\t\tslot1R4,\r\n\t\tslot1Retail_NAND\r\n};\r\n\r\nSLOT1INTERFACE slot1_device = slot1Retail; //default for frontends that dont even configure this\r\nNDS_SLOT1_TYPE slot1_device_type = NDS_SLOT1_RETAIL;\r\n\r\nstatic void scanDir()\r\n{\r\n\tif(fatDir == \"\") return;\r\n\t\r\n\tif (fatImage)\r\n\t{\r\n\t\tdelete fatImage;\r\n\t\tfatImage = NULL;\r\n\t}\r\n\r\n\tVFAT vfat;\r\n\tif(vfat.build(fatDir.c_str(),16))\r\n\t{\r\n\t\tfatImage = vfat.detach();\r\n\t}\r\n}\r\n\r\nBOOL slot1Init()\r\n{\r\n\tif (slot1_device_type == NDS_SLOT1_R4)\r\n\t\tscanDir();\r\n\treturn slot1_device.init();\r\n}\r\n\r\nvoid slot1Close()\r\n{\r\n\tslot1_device.close();\r\n\t\r\n\t//be careful to do this second, maybe the device will write something more\r\n\tif (fatImage)\r\n\t{\r\n\t\tdelete fatImage;\r\n\t\tfatImage = NULL;\r\n\t}\r\n}\r\n\r\nvoid slot1Reset()\r\n{\r\n\tslot1_device.reset();\r\n}\r\n\r\nBOOL slot1Change(NDS_SLOT1_TYPE changeToType)\r\n{\r\n\tif(changeToType == slot1_device_type) return FALSE; //nothing to do\r\n\tif (changeToType > NDS_SLOT1_COUNT || changeToType < 0) return FALSE;\r\n\tslot1_device.close();\r\n\tslot1_device_type = changeToType;\r\n\tslot1_device = slot1List[slot1_device_type];\r\n\tif (changeToType == NDS_SLOT1_R4)\r\n\t\tscanDir();\r\n\tprintf(\"Slot 1: %s\\n\", slot1_device.name);\r\n\tprintf(\"sending eject signal to SLOT-1\\n\");\r\n\tNDS_TriggerCardEjectIRQ();\r\n\treturn slot1_device.init();\r\n}\r\n\r\nvoid slot1SetFatDir(const std::string& dir)\r\n{\r\n\t//printf(\"FAT path %s\\n\", dir.c_str());\r\n\tfatDir = dir;\r\n}\r\n\r\nstd::string slot1GetFatDir()\r\n{\r\n\treturn fatDir;\r\n}\r\n\r\nEMUFILE* slot1GetFatImage()\r\n{\r\n\treturn fatImage;\r\n}\r\n\r\nNDS_SLOT1_TYPE slot1GetCurrentType()\r\n{\r\n\treturn slot1_device_type;\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/slot1.h",
    "content": "/*\r\n\tCopyright (C) 2010-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef __SLOT1_H__\r\n#define __SLOT1_H__\r\n\r\n#include <string>\r\n#include \"common.h\"\r\n#include \"types.h\"\r\n#include \"debug.h\"\r\n\r\nclass EMUFILE;\r\n\r\nstruct SLOT1INTERFACE\r\n{\r\n\t// The name of the plugin, this name will appear in the plugins list\r\n\tconst char * name;\r\n\r\n\t//called once when the plugin starts up\r\n\tBOOL (*init)(void);\r\n\t\r\n\t//called when the emulator resets\r\n\tvoid (*reset)(void);\r\n\t\r\n\t//called when the plugin shuts down\r\n\tvoid (*close)(void);\r\n\t\r\n\t//called when the user configurating plugin\r\n\tvoid (*config)(void);\r\n\r\n\t//called when the emulator write to addon\r\n\tvoid (*write08)(u8 PROCNUM, u32 adr, u8 val);\r\n\tvoid (*write16)(u8 PROCNUM, u32 adr, u16 val);\r\n\tvoid (*write32)(u8 PROCNUM, u32 adr, u32 val);\r\n\r\n\t//called when the emulator read from addon\r\n\tu8  (*read08)(u8 PROCNUM, u32 adr);\r\n\tu16 (*read16)(u8 PROCNUM, u32 adr);\r\n\tu32 (*read32)(u8 PROCNUM, u32 adr);\r\n\t\r\n\t//called when the user get info about addon pak (description)\r\n\tvoid (*info)(char *info);\r\n}; \r\n\r\nenum NDS_SLOT1_TYPE\r\n{\r\n\tNDS_SLOT1_NONE,\r\n\tNDS_SLOT1_RETAIL,\r\n\tNDS_SLOT1_R4,\r\n\tNDS_SLOT1_RETAIL_NAND,\t\t// used in Made in Ore/WarioWare D.I.Y.\r\n\tNDS_SLOT1_COUNT\t\t// use for counter addons - MUST TO BE LAST!!!\r\n};\r\n\r\nextern SLOT1INTERFACE slot1_device;\t\t\t\t\t\t// current slot1 device\r\nextern SLOT1INTERFACE slot1List[NDS_SLOT1_COUNT];\r\n\r\nBOOL slot1Init();\r\nvoid slot1Close();\r\nvoid slot1Reset();\r\nBOOL slot1Change(NDS_SLOT1_TYPE type);\t\t\t\t// change current adddon\r\nvoid slot1SetFatDir(const std::string& dir);\r\nstd::string slot1GetFatDir();\r\nNDS_SLOT1_TYPE slot1GetCurrentType();\r\nEMUFILE* slot1GetFatImage();\r\n#endif //__SLOT1_H__\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/sndsdl.cpp",
    "content": "/*\n\tCopyright (C) 2005-2006 Theo Berkau\n\tCopyright (C) 2006-2010 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdlib.h>\n#include <string.h>\n\n#include <SDL.h>\n#include \"types.h\"\n#include \"SPU.h\"\n#include \"sndsdl.h\"\n#include \"debug.h\"\n\n#ifdef _XBOX\n#include <xtl.h>\n#include <VectorIntrinsics.h>\n#include <process.h>\n#endif\n\nint SNDSDLInit(int buffersize);\nvoid SNDSDLDeInit();\nvoid SNDSDLUpdateAudio(s16 *buffer, u32 num_samples);\nu32 SNDSDLGetAudioSpace();\nvoid SNDSDLMuteAudio();\nvoid SNDSDLUnMuteAudio();\nvoid SNDSDLSetVolume(int volume);\n\nSoundInterface_struct SNDSDL = {\nSNDCORE_SDL,\n\"SDL Sound Interface\",\nSNDSDLInit,\nSNDSDLDeInit,\nSNDSDLUpdateAudio,\nSNDSDLGetAudioSpace,\nSNDSDLMuteAudio,\nSNDSDLUnMuteAudio,\nSNDSDLSetVolume\n};\n\nstatic u16 *stereodata16;\nstatic u32 soundoffset;\nstatic volatile u32 soundpos;\nstatic u32 soundlen;\nstatic u32 soundbufsize;\nstatic SDL_AudioSpec audiofmt;\n\n//////////////////////////////////////////////////////////////////////////////\n#ifdef _XBOX\nstatic volatile bool doterminate;\nstatic volatile bool terminated;\n\nDWORD WINAPI SNDXBOXThread( LPVOID )\n{\n\tfor(;;) {\n\t\tif(doterminate) break;\n\t\t{\n\t\t\tSPU_Emulate_user();\n\t\t}\n\t\tSleep(10);\n\t}\n\tterminated = true;\n\treturn 0;\n}\n#endif\n\n\nstatic void MixAudio(void *userdata, Uint8 *stream, int len) {\n   int i;\n   Uint8 *soundbuf=(Uint8 *)stereodata16;\n\n   for (i = 0; i < len; i++)\n   {\n      if (soundpos >= soundbufsize)\n         soundpos = 0;\n\n      stream[i] = soundbuf[soundpos];\n      soundpos++;\n   }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nint SNDSDLInit(int buffersize)\n{\n   if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0)\n      return -1;\n\n   audiofmt.freq = 44100;\n   audiofmt.format = AUDIO_S16SYS;\n   audiofmt.channels = 2;\n   audiofmt.samples = (audiofmt.freq / 60) * 2;\n   audiofmt.callback = MixAudio;\n   audiofmt.userdata = NULL;\n\n   //samples should be a power of 2 according to SDL-doc\n   //so normalize it to the nearest power of 2 here\n   u32 normSamples = 512;\n   while (normSamples < audiofmt.samples) \n      normSamples <<= 1;\n\n   audiofmt.samples = normSamples;\n   \n   soundlen = audiofmt.freq / 60; // 60 for NTSC\n   soundbufsize = buffersize * sizeof(s16) * 2;\n\n   if (SDL_OpenAudio(&audiofmt, NULL) != 0)\n   {\n      return -1;\n   }\n\n   if ((stereodata16 = (u16 *)malloc(soundbufsize)) == NULL)\n      return -1;\n\n   memset(stereodata16, 0, soundbufsize);\n\n   soundpos = 0;\n\n   SDL_PauseAudio(0);\n\n#ifdef _XBOX\n   \tdoterminate = false;\n\tterminated = false;\n\tCreateThread(0,0,SNDXBOXThread,0,0,0);\n#endif\n\n   return 0;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SNDSDLDeInit()\n{\n#ifdef _XBOX\n\tdoterminate = true;\n\twhile(!terminated) {\n\t\tSleep(1);\n\t}\n#endif\n   SDL_CloseAudio();\n\n   if (stereodata16)\n      free(stereodata16);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SNDSDLUpdateAudio(s16 *buffer, u32 num_samples)\n{\n   u32 copy1size=0, copy2size=0;\n   SDL_LockAudio();\n\n   if ((soundbufsize - soundoffset) < (num_samples * sizeof(s16) * 2))\n   {\n      copy1size = (soundbufsize - soundoffset);\n      copy2size = (num_samples * sizeof(s16) * 2) - copy1size;\n   }\n   else\n   {\n      copy1size = (num_samples * sizeof(s16) * 2);\n      copy2size = 0;\n   }\n\n   memcpy((((u8 *)stereodata16)+soundoffset), buffer, copy1size);\n//   ScspConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)(((u8 *)stereodata16)+soundoffset), copy1size / sizeof(s16) / 2);\n\n   if (copy2size)\n      memcpy(stereodata16, ((u8 *)buffer)+copy1size, copy2size);\n//      ScspConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)stereodata16, copy2size / sizeof(s16) / 2);\n\n   soundoffset += copy1size + copy2size;\n   soundoffset %= soundbufsize;\n\n   SDL_UnlockAudio();\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nu32 SNDSDLGetAudioSpace()\n{\n   u32 freespace=0;\n\n   if (soundoffset > soundpos)\n      freespace = soundbufsize - soundoffset + soundpos;\n   else\n      freespace = soundpos - soundoffset;\n\n   return (freespace / sizeof(s16) / 2);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SNDSDLMuteAudio()\n{\n   SDL_PauseAudio(1);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SNDSDLUnMuteAudio()\n{\n   SDL_PauseAudio(0);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid SNDSDLSetVolume(int volume)\n{\n}\n\n//////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/sndsdl.h",
    "content": "/*\n\tCopyright 2005-2006 Theo Berkau\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef SNDSDL_H\n#define SNDSDL_H\n\n#define SNDCORE_SDL 2\n\nextern SoundInterface_struct SNDSDL;\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/texcache.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <string.h>\n#include <algorithm>\n#include <assert.h>\n#include <map>\n\n#include \"texcache.h\"\n\n#include \"bits.h\"\n#include \"common.h\"\n#include \"debug.h\"\n#include \"gfx3d.h\"\n#include \"NDSSystem.h\"\n\nusing std::min;\nusing std::max;\n\n//only dump this from ogl renderer. for now, softrasterizer creates things in an incompatible pixel format\n//#define DEBUG_DUMP_TEXTURE\n\n#define CONVERT(color,alpha) ((TEXFORMAT == TexFormat_32bpp)?(RGB15TO32(color,alpha)):RGB15TO6665(color,alpha))\n\n//This class represents a number of regions of memory which should be viewed as contiguous\nclass MemSpan\n{\npublic:\n\tstatic const int MAXSIZE = 17; //max size for textures: 1024*1024*2 bytes / 128*1024 banks + 1 for wraparound\n\n\tMemSpan() \n\t\t: numItems(0), size(0)\n\t{}\n\n\tint numItems;\n\n\tstruct Item {\n\t\tu32 start;\n\t\tu32 len;\n\t\tu8* ptr;\n\t\tu32 ofs; //offset within the memspan\n\t} items[MAXSIZE];\n\n\tint size;\n\n\t//this MemSpan shall be considered the first argument to a standard memcmp\n\t//the length shall be as specified in this MemSpan, unless you specify otherwise\n\tint memcmp(void* buf2, int size=-1)\n\t{\n\t\tif(size==-1) size = this->size;\n\t\tsize = min(this->size,size);\n\t\tfor(int i=0;i<numItems;i++)\n\t\t{\n\t\t\tItem &item = items[i];\n\t\t\tint todo = min((int)item.len,size);\n\t\t\tsize -= todo;\n\t\t\tint temp = ::memcmp(item.ptr,((u8*)buf2)+item.ofs,todo);\n\t\t\tif(temp) return temp;\n\t\t\tif(size == 0) break;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t//TODO - get rid of duplication between these two methods.\n\n\t//dumps the memspan to the specified buffer\n\t//you may set size to limit the size to be copied\n\tint dump(void* buf, int size=-1)\n\t{\n\t\tif(size==-1) size = this->size;\n\t\tsize = min(this->size,size);\n\t\tu8* bufptr = (u8*)buf;\n\t\tint done = 0;\n\t\tfor(int i=0;i<numItems;i++)\n\t\t{\n\t\t\tItem item = items[i];\n\t\t\tint todo = min((int)item.len,size);\n\t\t\tsize -= todo;\n\t\t\tdone += todo;\n\t\t\tmemcpy(bufptr,item.ptr,todo);\n\t\t\tbufptr += todo;\n\t\t\tif(size==0) return done;\n\t\t}\n\t\treturn done;\n\t}\n\n\t// this function does the same than dump\n\t// but works for both little and big endian\n\t// when buf is an u16 array\n\tint dump16(void* buf, int size=-1)\n\t{\n\t\tif(size==-1) size = this->size;\n\t\tsize = min(this->size,size);\n\t\tu16* bufptr = (u16*)buf;\n\t\tint done = 0;\n\t\tfor(int i=0;i<numItems;i++)\n\t\t{\n\t\t\tItem item = items[i];\n\t\t\tu8 * src = (u8 *) item.ptr;\n\t\t\tint todo = min((int)item.len,size);\n\t\t\tsize -= todo;\n\t\t\tdone += todo;\n\t\t\tfor(int j = 0;j < todo / 2;j++)\n\t\t\t{\n\t\t\t\tu16 tmp;\n\t\t\t\ttmp = *src++;\n\t\t\t\ttmp |= *(src++) << 8;\n\t\t\t\t*bufptr++ = tmp;\n\t\t\t}\n\t\t\tif(size==0) return done;\n\t\t}\n\t\treturn done;\n\t}\n};\n\n//creates a MemSpan in texture memory\nstatic MemSpan MemSpan_TexMem(u32 ofs, u32 len) \n{\n\tMemSpan ret;\n\tret.size = len;\n\tu32 currofs = 0;\n\twhile(len) {\n\t\tMemSpan::Item &curr = ret.items[ret.numItems++];\n\t\tcurr.start = ofs&0x1FFFF;\n\t\tu32 slot = (ofs>>17)&3; //slots will wrap around\n\t\tcurr.len = min(len,0x20000-curr.start);\n\t\tcurr.ofs = currofs;\n\t\tlen -= curr.len;\n\t\tofs += curr.len;\n\t\tcurrofs += curr.len;\n\t\tu8* ptr = MMU.texInfo.textureSlotAddr[slot];\n\t\t\n\t\t//TODO - dont alert if the masterbrightnesses are max or min\n\t\tif(ptr == MMU.blank_memory) {\n\t\t\tPROGINFO(\"Tried to reference unmapped texture memory: slot %d\\n\",slot);\n\t\t}\n\t\tcurr.ptr = ptr + curr.start;\n\t}\n\treturn ret;\n}\n\n//creates a MemSpan in texture palette memory\nstatic MemSpan MemSpan_TexPalette(u32 ofs, u32 len) \n{\n\tMemSpan ret;\n\tret.size = len;\n\tu32 currofs = 0;\n\twhile(len) {\n\t\tMemSpan::Item &curr = ret.items[ret.numItems++];\n\t\tcurr.start = ofs&0x3FFF;\n\t\tu32 slot = (ofs>>14)&7; //this masks to 8 slots, but there are really only 6\n\t\tif(slot>5) {\n\t\t\tPROGINFO(\"Texture palette overruns texture memory. Wrapping at palette slot 0.\\n\");\n\t\t\tslot -= 5;\n\t\t}\n\t\tcurr.len = min(len,0x4000-curr.start);\n\t\tcurr.ofs = currofs;\n\t\tlen -= curr.len;\n\t\tofs += curr.len;\n\t\t//if(len != 0) \n\t\t\t//here is an actual test case of bank spanning\n\t\tcurrofs += curr.len;\n\t\tu8* ptr = MMU.texInfo.texPalSlot[slot];\n\t\t\n\t\t//TODO - dont alert if the masterbrightnesses are max or min\n\t\tif(ptr == MMU.blank_memory) {\n\t\t\tPROGINFO(\"Tried to reference unmapped texture palette memory: 16k slot #%d\\n\",slot);\n\t\t}\n\t\tcurr.ptr = ptr + curr.start;\n\t}\n\treturn ret;\n}\n\n#if defined (DEBUG_DUMP_TEXTURE) && defined (WIN32)\n#define DO_DEBUG_DUMP_TEXTURE\nstatic void DebugDumpTexture(TexCacheItem* item)\n{\n\tstatic int ctr=0;\n\tchar fname[100];\n\tsprintf(fname,\"c:\\\\dump\\\\%d.bmp\", ctr);\n\tctr++;\n\n\tNDS_WriteBMP_32bppBuffer(item->sizeX,item->sizeY,item->decoded,fname);\n}\n#endif\n\nclass TexCache\n{\npublic:\n\tTexCache()\n\t\t: cache_size(0)\n\t{}\n\n\tTTexCacheItemMultimap index;\n\n\t//this ought to be enough for anyone\n\t//static const u32 kMaxCacheSize = 64*1024*1024; \n\t//changed by zeromus on 15-dec. I couldnt find any games that were getting anywhere NEAR 64\n\tstatic const u32 kMaxCacheSize = 16*1024*1024; \n\t//metal slug burns through sprites so fast, it can test it pretty quickly though\n\n\t//this is not really precise, it is off by a constant factor\n\tu32 cache_size;\n\n\tvoid list_remove(TexCacheItem* item)\n\t{\n\t\tindex.erase(item->iterator);\n\t\tcache_size -= item->decode_len;\n\t}\n\n\tvoid list_push_front(TexCacheItem* item)\n\t{\n\t\titem->iterator = index.insert(std::make_pair(item->texformat,item));\n\t\tcache_size += item->decode_len;\n\t}\n\n\ttemplate<TexCache_TexFormat TEXFORMAT>\n\tTexCacheItem* scan(u32 format, u32 texpal)\n\t{\n\t\t//for each texformat, number of palette entries\n\t\tstatic const int palSizes[] = {0, 32, 4, 16, 256, 0, 8, 0};\n\n\t\t//for each texformat, multiplier from numtexels to numbytes (fixed point 30.2)\n\t\tstatic const int texSizes[] = {0, 4, 1, 2, 4, 1, 4, 8};\n\n\t\t//used to hold a copy of the palette specified for this texture\n\t\tu16 pal[256];\n\n\t\tu32 textureMode = (unsigned short)((format>>26)&0x07);\n\t\tu32 sizeX=(8 << ((format>>20)&0x07));\n\t\tu32 sizeY=(8 << ((format>>23)&0x07));\n\t\tu32 imageSize = sizeX*sizeY;\n\n\t\tu8 *adr;\n\n\t\tu32 paletteAddress;\n\n\t\tswitch (textureMode)\n\t\t{\n\t\tcase TEXMODE_I2:\n\t\t\tpaletteAddress = texpal<<3;\n\t\t\tbreak;\n\t\tcase TEXMODE_A3I5: //a3i5\n\t\tcase TEXMODE_I4: //i4\n\t\tcase TEXMODE_I8: //i8\n\t\tcase TEXMODE_A5I3: //a5i3\n\t\tcase TEXMODE_16BPP: //16bpp\n\t\tcase TEXMODE_4X4: //4x4\n\t\tdefault:\n\t\t\tpaletteAddress = texpal<<4;\n\t\t\tbreak;\n\t\t}\n\n\t\t//analyze the texture memory mapping and the specifications of this texture\n\t\tint palSize = palSizes[textureMode];\n\t\tint texSize = (imageSize*texSizes[textureMode])>>2; //shifted because the texSizes multiplier is fixed point\n\t\tMemSpan ms = MemSpan_TexMem((format&0xFFFF)<<3,texSize);\n\t\tMemSpan mspal = MemSpan_TexPalette(paletteAddress,palSize*2);\n\n\t\t//determine the location for 4x4 index data\n\t\tu32 indexBase;\n\t\tif((format & 0xc000) == 0x8000) indexBase = 0x30000;\n\t\telse indexBase = 0x20000;\n\n\t\tu32 indexOffset = (format&0x3FFF)<<2;\n\n\t\tint indexSize = 0;\n\t\tMemSpan msIndex;\n\t\tif(textureMode == TEXMODE_4X4)\n\t\t{\n\t\t\tindexSize = imageSize>>3;\n\t\t\tmsIndex = MemSpan_TexMem(indexOffset+indexBase,indexSize);\n\t\t}\n\n\n\t\t//dump the palette to a temp buffer, so that we don't have to worry about memory mapping.\n\t\t//this isnt such a problem with texture memory, because we read sequentially from it.\n\t\t//however, we read randomly from palette memory, so the mapping is more costly.\n\t\t#ifdef WORDS_BIGENDIAN\n\t\t\tmspal.dump16(pal);\n\t\t#else\n\t\t\tmspal.dump(pal);\n\t\t#endif\n\n\t\t\t//TODO - as a special optimization, keep the last item returned and check it first\n\n\t\tfor(std::pair<TTexCacheItemMultimap::iterator,TTexCacheItemMultimap::iterator>\n\t\t\titers = index.equal_range(format);\n\t\t\titers.first != iters.second;\n\t\t\t++iters.first)\n\t\t{\n\t\t\tTexCacheItem* curr = iters.first->second;\n\t\t\t\n\t\t\t//conditions where we reject matches:\n\t\t\t//when the teximage or texpal params dont match \n\t\t\t//(this is our key for identifying textures in the cache)\n\t\t\t//NEW: due to using format as a key we dont need to check this anymore\n\t\t\t//if(curr->texformat != format) continue;\n\t\t\tif(curr->texpal != texpal) continue;\n\n\t\t\t//we're being asked for a different format than what we had cached.\n\t\t\t//TODO - this could be done at the entire cache level instead of checking repeatedly\n\t\t\tif(curr->cacheFormat != TEXFORMAT) goto REJECT;\n\n\t\t\t//the texture matches params, but isnt suspected invalid. accept it.\n\t\t\tif (!curr->suspectedInvalid) return curr;\n\n\t\t\t//we suspect the texture may be invalid. we need to do a byte-for-byte comparison to re-establish that it is valid:\n\n\t\t\t//when the palettes dont match:\n\t\t\t//note that we are considering 4x4 textures to have a palette size of 0.\n\t\t\t//they really have a potentially HUGE palette, too big for us to handle like a normal palette,\n\t\t\t//so they go through a different system\n\t\t\tif(mspal.size != 0 && memcmp(curr->dump.palette,pal,mspal.size)) goto REJECT;\n\n\t\t\t//when the texture data doesn't match\n\t\t\tif(ms.memcmp(&curr->dump.texture[0],curr->dump.textureSize)) goto REJECT;\n\n\t\t\t//if the texture is 4x4 then the index data must match\n\t\t\tif(textureMode == TEXMODE_4X4)\n\t\t\t{\n\t\t\t\tif(msIndex.memcmp(curr->dump.texture + curr->dump.textureSize,curr->dump.indexSize)) goto REJECT; \n\t\t\t}\n\n\t\t\t//we found a match. just return it\n\t\t\t//REMINDER to make it primary/newest when we have smarter code\n\t\t\t//list_remove(curr);\n\t\t\t//list_push_front(curr);\n\t\t\tcurr->suspectedInvalid = false;\n\t\t\treturn curr;\n\n\t\tREJECT:\n\t\t\t//we found a cached item for the current address, but the data is stale.\n\t\t\t//for a variety of complicated reasons, we need to throw it out right this instant.\n\t\t\tlist_remove(curr);\n\t\t\tdelete curr;\n\t\t\tbreak;\n\t\t}\n\n\t\t//item was not found. recruit an existing one (the oldest), or create a new one\n\t\t//evict(); //reduce the size of the cache if necessary\n\t\t//TODO - as a peculiarity of the texcache, eviction must happen after the entire 3d frame runs\n\t\t//to support separate cache and read passes\n\t\tTexCacheItem* newitem = new TexCacheItem();\n\t\tnewitem->suspectedInvalid = false;\n\t\tnewitem->texformat = format;\n\t\tnewitem->cacheFormat = TEXFORMAT;\n\t\tnewitem->texpal = texpal;\n\t\tnewitem->sizeX=sizeX;\n\t\tnewitem->sizeY=sizeY;\n\t\tnewitem->invSizeX=1.0f/((float)(sizeX));\n\t\tnewitem->invSizeY=1.0f/((float)(sizeY));\n\t\tnewitem->decode_len = sizeX*sizeY*4;\n\t\tnewitem->mode = textureMode;\n\t\tnewitem->decoded = new u8[newitem->decode_len];\n\t\tlist_push_front(newitem);\n\t\t//printf(\"allocating: up to %d with %d items\\n\",cache_size,index.size());\n\n\t\tu32 *dwdst = (u32*)newitem->decoded;\n\t\t\n\t\t//dump palette data for cache keying\n\t\tif(palSize)\n\t\t{\n\t\t\tmemcpy(newitem->dump.palette, pal, palSize*2);\n\t\t}\n\n\t\t//dump texture and 4x4 index data for cache keying\n\t\tconst int texsize = newitem->dump.textureSize = ms.size;\n\t\tconst int indexsize = newitem->dump.indexSize = msIndex.size;\n\t\tnewitem->dump.texture = new u8[texsize+indexsize];\n\t\tms.dump(&newitem->dump.texture[0],newitem->dump.maxTextureSize); //dump texture\n\t\tif(textureMode == TEXMODE_4X4)\n\t\t\tmsIndex.dump(newitem->dump.texture+newitem->dump.textureSize,newitem->dump.indexSize); //dump 4x4\n\n\n\t\t//============================================================================ \n\t\t//Texture conversion\n\t\t//============================================================================ \n\n\t\tconst u32 opaqueColor = TEXFORMAT==TexFormat_32bpp?255:31;\n\t\tu32 palZeroTransparent = (1-((format>>29)&1))*opaqueColor;\n\n\t\tswitch (newitem->mode)\n\t\t{\n\t\tcase TEXMODE_A3I5:\n\t\t\t{\n\t\t\t\tfor(int j=0;j<ms.numItems;j++) {\n\t\t\t\t\tadr = ms.items[j].ptr;\n\t\t\t\t\tfor(u32 x = 0; x < ms.items[j].len; x++)\n\t\t\t\t\t{\n\t\t\t\t\t\tu16 c = pal[*adr&31];\n\t\t\t\t\t\tu8 alpha = *adr>>5;\n\t\t\t\t\t\tif(TEXFORMAT == TexFormat_15bpp)\n\t\t\t\t\t\t\t*dwdst++ = RGB15TO6665(c,material_3bit_to_5bit[alpha]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t*dwdst++ = RGB15TO32(c,material_3bit_to_8bit[alpha]);\n\t\t\t\t\t\tadr++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\tcase TEXMODE_I2:\n\t\t\t{\n\t\t\t\tfor(int j=0;j<ms.numItems;j++) {\n\t\t\t\t\tadr = ms.items[j].ptr;\n\t\t\t\t\tfor(u32 x = 0; x < ms.items[j].len; x++)\n\t\t\t\t\t{\n\t\t\t\t\t\tu8 bits;\n\t\t\t\t\t\tu16 c;\n\n\t\t\t\t\t\tbits = (*adr)&0x3;\n\t\t\t\t\t\tc = pal[bits];\n\t\t\t\t\t\t*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);\n\n\t\t\t\t\t\tbits = ((*adr)>>2)&0x3;\n\t\t\t\t\t\tc = pal[bits];\n\t\t\t\t\t\t*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);\n\n\t\t\t\t\t\tbits = ((*adr)>>4)&0x3;\n\t\t\t\t\t\tc = pal[bits];\n\t\t\t\t\t\t*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);\n\n\t\t\t\t\t\tbits = ((*adr)>>6)&0x3;\n\t\t\t\t\t\tc = pal[bits];\n\t\t\t\t\t\t*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);\n\n\t\t\t\t\t\tadr++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase TEXMODE_I4:\n\t\t\t{\n\t\t\t\tfor(int j=0;j<ms.numItems;j++) {\n\t\t\t\t\tadr = ms.items[j].ptr;\n\t\t\t\t\tfor(u32 x = 0; x < ms.items[j].len; x++)\n\t\t\t\t\t{\n\t\t\t\t\t\tu8 bits;\n\t\t\t\t\t\tu16 c;\n\n\t\t\t\t\t\tbits = (*adr)&0xF;\n\t\t\t\t\t\tc = pal[bits];\n\t\t\t\t\t\t*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);\n\n\t\t\t\t\t\tbits = ((*adr)>>4);\n\t\t\t\t\t\tc = pal[bits];\n\t\t\t\t\t\t*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);\n\t\t\t\t\t\tadr++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase TEXMODE_I8:\n\t\t\t{\n\t\t\t\tfor(int j=0;j<ms.numItems;j++) {\n\t\t\t\t\tadr = ms.items[j].ptr;\n\t\t\t\t\tfor(u32 x = 0; x < ms.items[j].len; ++x)\n\t\t\t\t\t{\n\t\t\t\t\t\tu16 c = pal[*adr];\n\t\t\t\t\t\t*dwdst++ = CONVERT(c,(*adr == 0) ? palZeroTransparent : opaqueColor);\n\t\t\t\t\t\tadr++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TEXMODE_4X4:\n\t\t\t{\n\t\t\t\t//RGB16TO32 is used here because the other conversion macros result in broken interpolation logic\n\n\t\t\t\tif(ms.numItems != 1) {\n\t\t\t\t\tPROGINFO(\"Your 4x4 texture has overrun its texture slot.\\n\");\n\t\t\t\t}\n\t\t\t\t//this check isnt necessary since the addressing is tied to the texture data which will also run out:\n\t\t\t\t//if(msIndex.numItems != 1) PROGINFO(\"Your 4x4 texture index has overrun its slot.\\n\");\n\n\t#define PAL4X4(offset) ( *(u16*)( MMU.texInfo.texPalSlot[((paletteAddress + (offset)*2)>>14)&0x7] + ((paletteAddress + (offset)*2)&0x3FFF) ) )\n\n\t\t\t\tu16* slot1;\n\t\t\t\tu32* map = (u32*)ms.items[0].ptr;\n\t\t\t\tu32 limit = ms.items[0].len<<2;\n\t\t\t\tu32 d = 0;\n\t\t\t\tif ( (format & 0xc000) == 0x8000)\n\t\t\t\t\t// texel are in slot 2\n\t\t\t\t\tslot1=(u16*)&MMU.texInfo.textureSlotAddr[1][((format & 0x3FFF)<<2)+0x010000];\n\t\t\t\telse \n\t\t\t\t\tslot1=(u16*)&MMU.texInfo.textureSlotAddr[1][(format & 0x3FFF)<<2];\n\n\t\t\t\tu16 yTmpSize = (sizeY>>2);\n\t\t\t\tu16 xTmpSize = (sizeX>>2);\n\n\t\t\t\t//this is flagged whenever a 4x4 overruns its slot.\n\t\t\t\t//i am guessing we just generate black in that case\n\t\t\t\tbool dead = false;\n\n\t\t\t\tfor (int y = 0; y < yTmpSize; y ++)\n\t\t\t\t{\n\t\t\t\t\tu32 tmpPos[4]={(y<<2)*sizeX,((y<<2)+1)*sizeX,\n\t\t\t\t\t\t((y<<2)+2)*sizeX,((y<<2)+3)*sizeX};\n\t\t\t\t\tfor (int x = 0; x < xTmpSize; x ++, d++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(d >= limit)\n\t\t\t\t\t\t\tdead = true;\n\n\t\t\t\t\t\tif(dead) {\n\t\t\t\t\t\t\tfor (int sy = 0; sy < 4; sy++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tu32 currentPos = (x<<2) + tmpPos[sy];\n\t\t\t\t\t\t\t\tdwdst[currentPos] = dwdst[currentPos+1] = dwdst[currentPos+2] = dwdst[currentPos+3] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tu32 currBlock\t= map[d];\n\t\t\t\t\t\tu16 pal1\t\t= slot1[d];\n\t\t\t\t\t\tu16 pal1offset\t= (pal1 & 0x3FFF)<<1;\n\t\t\t\t\t\tu8  mode\t\t= pal1>>14;\n\t\t\t\t\t\tu32 tmp_col[4];\n\t\t\t\t\t\t\n\t\t\t\t\t\ttmp_col[0]=RGB16TO32(PAL4X4(pal1offset),255);\n\t\t\t\t\t\ttmp_col[1]=RGB16TO32(PAL4X4(pal1offset+1),255);\n\n\t\t\t\t\t\tswitch (mode) \n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\ttmp_col[2]=RGB16TO32(PAL4X4(pal1offset+2),255);\n\t\t\t\t\t\t\ttmp_col[3]=RGB16TO32(0x7FFF,0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\ttmp_col[2]=(((tmp_col[0]&0xFF)+(tmp_col[1]&0xff))>>1)|\n\t\t\t\t\t\t\t\t(((tmp_col[0]&(0xFF<<8))+(tmp_col[1]&(0xFF<<8)))>>1)|\n\t\t\t\t\t\t\t\t(((tmp_col[0]&(0xFF<<16))+(tmp_col[1]&(0xFF<<16)))>>1)|\n\t\t\t\t\t\t\t\t(0xff<<24);\n\t\t\t\t\t\t\ttmp_col[3]=RGB16TO32(0x7FFF,0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\ttmp_col[2]=RGB16TO32(PAL4X4(pal1offset+2),255);\n\t\t\t\t\t\t\ttmp_col[3]=RGB16TO32(PAL4X4(pal1offset+3),255);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3: \n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tu32 red1, red2;\n\t\t\t\t\t\t\t\tu32 green1, green2;\n\t\t\t\t\t\t\t\tu32 blue1, blue2;\n\t\t\t\t\t\t\t\tu16 tmp1, tmp2;\n\n\t\t\t\t\t\t\t\tred1=tmp_col[0]&0xff;\n\t\t\t\t\t\t\t\tgreen1=(tmp_col[0]>>8)&0xff;\n\t\t\t\t\t\t\t\tblue1=(tmp_col[0]>>16)&0xff;\n\t\t\t\t\t\t\t\tred2=tmp_col[1]&0xff;\n\t\t\t\t\t\t\t\tgreen2=(tmp_col[1]>>8)&0xff;\n\t\t\t\t\t\t\t\tblue2=(tmp_col[1]>>16)&0xff;\n\n\t\t\t\t\t\t\t\ttmp1=((red1*5+red2*3)>>6)|\n\t\t\t\t\t\t\t\t\t(((green1*5+green2*3)>>6)<<5)|\n\t\t\t\t\t\t\t\t\t(((blue1*5+blue2*3)>>6)<<10);\n\t\t\t\t\t\t\t\ttmp2=((red2*5+red1*3)>>6)|\n\t\t\t\t\t\t\t\t\t(((green2*5+green1*3)>>6)<<5)|\n\t\t\t\t\t\t\t\t\t(((blue2*5+blue1*3)>>6)<<10);\n\n\t\t\t\t\t\t\t\ttmp_col[2]=RGB16TO32(tmp1,255);\n\t\t\t\t\t\t\t\ttmp_col[3]=RGB16TO32(tmp2,255);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(TEXFORMAT==TexFormat_15bpp)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor(int i=0;i<4;i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttmp_col[i] >>= 2;\n\t\t\t\t\t\t\t\ttmp_col[i] &= 0x3F3F3F3F;\n\t\t\t\t\t\t\t\tu32 a = tmp_col[i]>>24;\n\t\t\t\t\t\t\t\ttmp_col[i] &= 0x00FFFFFF;\n\t\t\t\t\t\t\t\ttmp_col[i] |= (a>>1)<<24;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//TODO - this could be more precise for 32bpp mode (run it through the color separation table)\n\n\t\t\t\t\t\t//set all 16 texels\n\t\t\t\t\t\tfor (int sy = 0; sy < 4; sy++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Texture offset\n\t\t\t\t\t\t\tu32 currentPos = (x<<2) + tmpPos[sy];\n\t\t\t\t\t\t\tu8 currRow = (u8)((currBlock>>(sy<<3))&0xFF);\n\n\t\t\t\t\t\t\tdwdst[currentPos] = tmp_col[currRow&3];\n\t\t\t\t\t\t\tdwdst[currentPos+1] = tmp_col[(currRow>>2)&3];\n\t\t\t\t\t\t\tdwdst[currentPos+2] = tmp_col[(currRow>>4)&3];\n\t\t\t\t\t\t\tdwdst[currentPos+3] = tmp_col[(currRow>>6)&3];\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase TEXMODE_A5I3:\n\t\t\t{\n\t\t\t\tfor(int j=0;j<ms.numItems;j++) {\n\t\t\t\t\tadr = ms.items[j].ptr;\n\t\t\t\t\tfor(u32 x = 0; x < ms.items[j].len; ++x)\n\t\t\t\t\t{\n\t\t\t\t\t\tu16 c = pal[*adr&0x07];\n\t\t\t\t\t\tu8 alpha = (*adr>>3);\n\t\t\t\t\t\tif(TEXFORMAT == TexFormat_15bpp)\n\t\t\t\t\t\t\t*dwdst++ = RGB15TO6665(c,alpha);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t*dwdst++ = RGB15TO32(c,material_5bit_to_8bit[alpha]);\n\t\t\t\t\t\tadr++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase TEXMODE_16BPP:\n\t\t\t{\n\t\t\t\tfor(int j=0;j<ms.numItems;j++) {\n\t\t\t\t\tu16* map = (u16*)ms.items[j].ptr;\n\t\t\t\t\tint len = ms.items[j].len>>1;\n\t\t\t\t\tfor(int x = 0; x < len; ++x)\n\t\t\t\t\t{\n\t\t\t\t\t\tu16 c = map[x];\n\t\t\t\t\t\tint alpha = ((c&0x8000)?opaqueColor:0);\n\t\t\t\t\t\t*dwdst++ = CONVERT(c&0x7FFF,alpha);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} //switch(texture format)\n\n#ifdef DO_DEBUG_DUMP_TEXTURE\n\tDebugDumpTexture(newitem);\n#endif\n\n\t\treturn newitem;\n\t} //scan()\n\n\tvoid invalidate()\n\t{\n\t\tfor(TTexCacheItemMultimap::iterator it(index.begin()); it != index.end(); ++it)\n\t\t\tit->second->suspectedInvalid = true;\n\t}\n\n\tvoid evict(u32 target = kMaxCacheSize)\n\t{\n\t\t//debug print\n\t\t//printf(\"%d %d/%d\\n\",index.size(),cache_size/1024,target/1024);\n\n\t\t//dont do anything unless we're over the target\n\t\tif(cache_size<target) return;\n\n\t\t//aim at cutting the cache to half of the max size\n\t\ttarget/=2;\n\n\t\t//evicts items in an arbitrary order until it is less than the max cache size\n\t\t//TODO - do this based on age and not arbitrarily\n\t\twhile(cache_size > target)\n\t\t{\n\t\t\tif(index.size()==0) break; //just in case.. doesnt seem possible, cache_size wouldve been 0\n\n\t\t\tTexCacheItem* item = index.begin()->second;\n\t\t\tlist_remove(item);\n\t\t\t//printf(\"evicting! totalsize:%d\\n\",cache_size);\n\t\t\tdelete item;\n\t\t}\n\t}\n} texCache;\n\nvoid TexCache_Reset()\n{\n\ttexCache.evict(0);\n}\n\nvoid TexCache_Invalidate()\n{\n\t//note that this gets called whether texdata or texpalette gets reconfigured.\n\ttexCache.invalidate();\n}\n\nTexCacheItem* TexCache_SetTexture(TexCache_TexFormat TEXFORMAT, u32 format, u32 texpal)\n{\n\tswitch(TEXFORMAT)\n\t{\n\tcase TexFormat_32bpp: return texCache.scan<TexFormat_32bpp>(format,texpal);\n\tcase TexFormat_15bpp: return texCache.scan<TexFormat_15bpp>(format,texpal);\n\tdefault: assert(false); return NULL;\n\t}\n}\n\n//call this periodically to keep the tex cache clean\nvoid TexCache_EvictFrame()\n{\n\ttexCache.evict();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/texcache.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2007 shash\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _TEXCACHE_H_\n#define _TEXCACHE_H_\n\n#include \"common.h\"\n#include <map>\n\nenum TexCache_TexFormat\n{\n\tTexFormat_None, //used when nothing yet is cached\n\tTexFormat_32bpp, //used by ogl renderer\n\tTexFormat_15bpp //used by rasterizer\n};\n\nclass TexCacheItem;\n\ntypedef std::multimap<u32,TexCacheItem*> TTexCacheItemMultimap;\n\nclass TexCacheItem\n{\npublic:\n\tTexCacheItem() \n\t\t: decode_len(0)\n\t\t, decoded(NULL)\n\t\t, suspectedInvalid(false)\n\t\t, deleteCallback(NULL)\n\t\t, cacheFormat(TexFormat_None)\n\t{}\n\t~TexCacheItem() {\n\t\tdelete[] decoded;\n\t\tif(deleteCallback) deleteCallback(this);\n\t}\n\tu32 decode_len;\n\tu32 mode;\n\tu8* decoded; //decoded texture data\n\tbool suspectedInvalid;\n\tTTexCacheItemMultimap::iterator iterator;\n\n\tu32 texformat, texpal;\n\tu32 sizeX, sizeY;\n\tfloat invSizeX, invSizeY;\n\n\tu64 texid; //used by ogl renderer for the texid\n\tvoid (*deleteCallback)(TexCacheItem*);\n\n\tTexCache_TexFormat cacheFormat;\n\n\tstruct Dump {\n\t\t~Dump() {\n\t\t\tdelete[] texture;\n\t\t}\n\t\tint textureSize, indexSize;\n\t\tstatic const int maxTextureSize=128*1024;\n\t\tu8* texture;\n\t\tu8 palette[256*2];\n\t} dump;\n};\n\nvoid TexCache_Invalidate();\nvoid TexCache_Reset();\nvoid TexCache_EvictFrame();\n\nTexCacheItem* TexCache_SetTexture(TexCache_TexFormat TEXFORMAT, u32 format, u32 texpal);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/thumb_instructions.cpp",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2008 shash\n\tCopyright (C) 2008-2013 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"bios.h\"\n#include \"debug.h\"\n#include \"MMU.h\"\n#include \"NDSSystem.h\"\n#include \"MMU_timing.h\"\n#include <assert.h>\n\n#define cpu (&ARMPROC)\n#define TEMPLATE template<int PROCNUM> \n\n#define REG_NUM(i, n) (((i)>>n)&0x7)\n\n//-----------------------------------------------------------------------------\n//   Undefined instruction\n//-----------------------------------------------------------------------------\nTEMPLATE static  u32 FASTCALL OP_UND_THUMB(const u32 i)\n{\n\tINFO(\"THUMB%c: Undefined instruction: 0x%08X (%s) PC=0x%08X\\n\", cpu->proc_ID?'7':'9', cpu->instruction, decodeIntruction(true, cpu->instruction), cpu->instruct_adr);\n\tTRAPUNDEF(cpu);\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   LSL\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_LSL_0(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 0)] = cpu->R[REG_NUM(i, 3)];\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_LSL(const u32 i)\n{\n\tu32 v = (i>>6) & 0x1F;\n\tcpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], 32-v);\n\tcpu->R[REG_NUM(i, 0)] = (cpu->R[REG_NUM(i, 3)] << v);\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_LSL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_NUM(i, 3)] & 0xFF;\n\n\tif(v == 0)\n\t{\n\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\treturn 2;\n\t}\t\n\tif(v<32)\n\t{\n\t\tcpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], 32-v);\n\t\tcpu->R[REG_NUM(i, 0)] <<= v;\n\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\treturn 2;\n\t}\n\tif(v==32)\n\t\tcpu->CPSR.bits.C = BIT0(cpu->R[REG_NUM(i, 0)]);\n\telse\n\t\tcpu->CPSR.bits.C = 0;\n\n\tcpu->R[REG_NUM(i, 0)] = 0;\n\tcpu->CPSR.bits.N = 0;\n\tcpu->CPSR.bits.Z = 1;\n\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   LSR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_LSR_0(const u32 i)\n{\n\tcpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 3)]);\n\tcpu->R[REG_NUM(i, 0)] = 0;\n\tcpu->CPSR.bits.N = 0;\n\tcpu->CPSR.bits.Z = 1;\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_LSR(const u32 i)\n{\n\tu32 v = (i>>6) & 0x1F;\n\tcpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], v-1);\n\tcpu->R[REG_NUM(i, 0)] = (cpu->R[REG_NUM(i, 3)] >> v);\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_LSR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_NUM(i, 3)] & 0xFF;\n\t\n\tif(v == 0)\n\t{\n\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\treturn 2;\n\t}\t\n\tif(v<32)\n\t{\n\t\tcpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1);\n\t\tcpu->R[REG_NUM(i, 0)] >>= v;\n\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\treturn 2;\n\t}\n\tif(v==32)\n\t\tcpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]);\n\telse\n\t\tcpu->CPSR.bits.C = 0;\n\tcpu->R[REG_NUM(i, 0)] = 0;\n\tcpu->CPSR.bits.N = 0;\n\tcpu->CPSR.bits.Z = 1;\n\t\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   ASR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_ASR_0(const u32 i)\n{\n\tcpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 3)]);\n\tcpu->R[REG_NUM(i, 0)] = BIT31(cpu->R[REG_NUM(i, 3)])*0xFFFFFFFF;\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ASR(const u32 i)\n{\n\tu32 v = (i>>6) & 0x1F;\n\tcpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 3)], v-1);\n\tcpu->R[REG_NUM(i, 0)] = (u32)(((s32)cpu->R[REG_NUM(i, 3)]) >> v);\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ASR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_NUM(i, 3)] & 0xFF;\n\t\n\tif(v == 0)\n\t{\n\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\treturn 2;\n\t}\t\n\tif(v<32)\n\t{\n\t\tcpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1);\n\t\tcpu->R[REG_NUM(i, 0)] = (u32)(((s32)cpu->R[REG_NUM(i, 0)]) >> v);\n\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\treturn 2;\n\t}\n\t\n\tcpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->R[REG_NUM(i, 0)] = BIT31(cpu->R[REG_NUM(i, 0)])*0xFFFFFFFF;\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   ADD\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_ADD_IMM3(const u32 i)\n{\n\tu32 imm3 = (i >> 6) & 0x07;\n\tu32 Rn = cpu->R[REG_NUM(i, 3)];\n\n\tif (imm3 == 0)\t// mov 2\n\t{\n\t\tcpu->R[REG_NUM(i, 0)] = Rn;\n\n\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\tcpu->CPSR.bits.C = 0;\n\t\tcpu->CPSR.bits.V = 0;\n\t\treturn 1;\n\t}\n\n\tcpu->R[REG_NUM(i, 0)] = Rn + imm3;\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\tcpu->CPSR.bits.C = CarryFrom(Rn, imm3);\n\tcpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 0)], Rn, imm3);\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ADD_IMM8(const u32 i)\n{\n\tu32 imm8 = (i & 0xFF);\n\tu32 Rd = cpu->R[REG_NUM(i, 8)];\n\n\tcpu->R[REG_NUM(i, 8)] = Rd + imm8;\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 8)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 8)] == 0);\n\tcpu->CPSR.bits.C = CarryFrom(Rd, imm8);\n\tcpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 8)], Rd, imm8);\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ADD_REG(const u32 i)\n{\n\tu32 Rn = cpu->R[REG_NUM(i, 3)];\n\tu32 Rm = cpu->R[REG_NUM(i, 6)];\n\n\tcpu->R[REG_NUM(i, 0)] = Rn + Rm;\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\tcpu->CPSR.bits.C = CarryFrom(Rn, Rm);\n\tcpu->CPSR.bits.V = OverflowFromADD(cpu->R[REG_NUM(i, 0)], Rn, Rm);\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ADD_SPE(const u32 i)\n{\n\tu32 Rd = REG_NUM(i, 0) | ((i>>4)&8);\n\t\n\tcpu->R[Rd] += cpu->R[REG_POS(i, 3)];\n\t\n\tif(Rd==15)\n\t{\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n\t\t\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ADD_2PC(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 8)] = (cpu->R[15]&0xFFFFFFFC) + ((i&0xFF)<<2);\n\t\t\t\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ADD_2SP(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 8)] = cpu->R[13] + ((i&0xFF)<<2);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   SUB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_SUB_IMM3(const u32 i)\n{\n\tu32 imm3 = (i>>6) & 0x07;\n\tu32 Rn = cpu->R[REG_NUM(i, 3)];\n\tu32 tmp = Rn - imm3;\n\n\tcpu->R[REG_NUM(i, 0)] = tmp;\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = (tmp == 0);\n\tcpu->CPSR.bits.C = !BorrowFrom(Rn, imm3);\n\tcpu->CPSR.bits.V = OverflowFromSUB(tmp, Rn, imm3);\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_SUB_IMM8(const u32 i)\n{\n\tu32 imm8 = (i & 0xFF);\n\tu32 Rd = cpu->R[REG_NUM(i, 8)];\n\tu32 tmp = Rd - imm8;\n\n\tcpu->R[REG_NUM(i, 8)] = tmp;\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = (tmp == 0);\n\tcpu->CPSR.bits.C = !BorrowFrom(Rd, imm8);\n\tcpu->CPSR.bits.V = OverflowFromSUB(tmp, Rd, imm8);\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_SUB_REG(const u32 i)\n{\n\tu32 Rn = cpu->R[REG_NUM(i, 3)];\n\tu32 Rm = cpu->R[REG_NUM(i, 6)];\n\tu32 tmp = Rn - Rm;\n\n\tcpu->R[REG_NUM(i, 0)] = tmp;\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = (tmp == 0);\n\tcpu->CPSR.bits.C = !BorrowFrom(Rn, Rm);\n\tcpu->CPSR.bits.V = OverflowFromSUB(tmp, Rn, Rm);\n\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   MOV\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_MOV_IMM8(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 8)] = (i & 0xFF);\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 8)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 8)] == 0;\n\t\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_MOV_SPE(const u32 i)\n{\n\tu32 Rd = REG_NUM(i, 0) | ((i>>4)&8);\n\t\n\tcpu->R[Rd] = cpu->R[REG_POS(i, 3)];\n\t\n\tif(Rd==15)\n\t{\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n\t\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   CMP\n//-----------------------------------------------------------------------------\nTEMPLATE static  u32 FASTCALL OP_CMP_IMM8(const u32 i)\n{\n\tu32 tmp = cpu->R[REG_NUM(i, 8)] - (i & 0xFF);\n\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = tmp == 0;\n\tcpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_NUM(i, 8)], (i & 0xFF));\n\tcpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_NUM(i, 8)], (i & 0xFF));\n\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_CMP(const u32 i)\n{\n\tu32 tmp = cpu->R[REG_NUM(i, 0)] - cpu->R[REG_NUM(i, 3)];\n\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = tmp == 0;\n\tcpu->CPSR.bits.C = !BorrowFrom(cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]);\n\tcpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]);\n\t\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_CMP_SPE(const u32 i)\n{\n\tu32 Rn = (i&7) | ((i>>4)&8);\n\n\tu32 tmp = cpu->R[Rn] - cpu->R[REG_POS(i, 3)];\n\t\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = tmp == 0;\n\tcpu->CPSR.bits.C = !BorrowFrom(cpu->R[Rn], cpu->R[REG_POS(i, 3)]);\n\tcpu->CPSR.bits.V = OverflowFromSUB(tmp, cpu->R[Rn], cpu->R[REG_POS(i, 3)]);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   AND\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_AND(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 0)] &= cpu->R[REG_NUM(i, 3)];\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   EOR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_EOR(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 0)] ^= cpu->R[REG_NUM(i, 3)];\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   ADC\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_ADC_REG(const u32 i)\n{\n\tu32 Rd = cpu->R[REG_NUM(i, 0)];\n\tu32 Rm = cpu->R[REG_NUM(i, 3)];\n\n\tif (!cpu->CPSR.bits.C)\n\t{\n\t\tcpu->R[REG_NUM(i, 0)] = Rd + Rm;\n\t\tcpu->CPSR.bits.C = cpu->R[REG_NUM(i, 0)] < Rm;\n\t}\n\telse\n\t{\n\t\tcpu->R[REG_NUM(i, 0)] = Rd + Rm + 1;\n\t\tcpu->CPSR.bits.C =  cpu->R[REG_NUM(i, 0)] <= Rm;\n\t}\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0);\n\tcpu->CPSR.bits.V = BIT31((Rd ^ Rm ^ -1) & (Rd ^ cpu->R[REG_NUM(i, 0)]));\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   SBC\n//-----------------------------------------------------------------------------\nTEMPLATE static  u32 FASTCALL OP_SBC_REG(const u32 i)\n{\n\tu32 Rd = cpu->R[REG_NUM(i, 0)];\n\tu32 Rm = cpu->R[REG_NUM(i, 3)];\n\n\tif (!cpu->CPSR.bits.C)\n\t{\n\t\tcpu->R[REG_NUM(i, 0)] = Rd - Rm - 1;\n\t\tcpu->CPSR.bits.C = Rd > Rm;\n\t}\n\telse\n\t{\n\t\tcpu->R[REG_NUM(i, 0)] = Rd - Rm;\n\t\tcpu->CPSR.bits.C = Rd >= Rm;\n\t}\n\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0);\n\tcpu->CPSR.bits.V = BIT31((Rd ^ Rm) & (Rd ^ cpu->R[REG_NUM(i, 0)]));\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   ROR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_ROR_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_NUM(i, 3)] & 0xFF;\n\t\n\tif(v == 0)\n\t{\n\t\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\t\treturn 2;\n\t}\n\t\n\tv &= 0x1F;\n\tif(v == 0)\n\t{\n\t\t\tcpu->CPSR.bits.C = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\t\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\t\t\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\t\treturn 2;\n\t}\n\tcpu->CPSR.bits.C = BIT_N(cpu->R[REG_NUM(i, 0)], v-1);\n\tcpu->R[REG_NUM(i, 0)] = ROR(cpu->R[REG_NUM(i, 0)], v);\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\n\treturn 2;\n}\n\n//-----------------------------------------------------------------------------\n//   TST\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_TST(const u32 i)\n{\n\tu32 tmp = cpu->R[REG_NUM(i, 0)] & cpu->R[REG_NUM(i, 3)];\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = (tmp == 0);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   NEG\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_NEG(const u32 i)\n{\n\tu32 Rm = cpu->R[REG_NUM(i, 3)];\n\n\tcpu->R[REG_NUM(i, 0)] = (u32)((s32)0 - (s32)Rm);\n\t\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0);\n\tcpu->CPSR.bits.C = !BorrowFrom(0, Rm);\n\tcpu->CPSR.bits.V = OverflowFromSUB(cpu->R[REG_NUM(i, 0)], 0, Rm);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   CMN\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_CMN(const u32 i)\n{\n\tu32 tmp = cpu->R[REG_NUM(i, 0)] + cpu->R[REG_NUM(i, 3)];\n\n\tcpu->CPSR.bits.N = BIT31(tmp);\n\tcpu->CPSR.bits.Z = tmp == 0;\n\tcpu->CPSR.bits.C = CarryFrom(cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]);\n\tcpu->CPSR.bits.V = OverflowFromADD(tmp, cpu->R[REG_NUM(i, 0)], cpu->R[REG_NUM(i, 3)]);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   ORR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_ORR(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 0)] |= cpu->R[REG_NUM(i, 3)];\n\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   BIC\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_BIC(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 0)] &= (~cpu->R[REG_NUM(i, 3)]);\n\t\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = (cpu->R[REG_NUM(i, 0)] == 0);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   MVN\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_MVN(const u32 i)\n{\n\tcpu->R[REG_NUM(i, 0)] = (~cpu->R[REG_NUM(i, 3)]);\n\t\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   MUL\n//-----------------------------------------------------------------------------\n\n#define MUL_Mxx_END_THUMB(c) \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFFFF)) \\\n\t\treturn c+1; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFFFF)) \\\n\t\treturn c+2; \\\n\tv >>= 8; \\\n\tif((v==0)||(v==0xFF)) \\\n\t\treturn c+3; \\\n\treturn c+4; \\\n\nTEMPLATE static  u32 FASTCALL OP_MUL_REG(const u32 i)\n{\n\tu32 v = cpu->R[REG_NUM(i, 3)];\n\n\t// FIXME:\n\t//------ Rd = (Rm * Rd)[31:0]\n\t//------ u64 res = ((u64)cpu->R[REG_NUM(i, 0)] * (u64)v));\n\t//------ cpu->R[REG_NUM(i, 0)] = (u32)(res  & 0xFFFFFFFF);\n\t//------ \n\t\n\tcpu->R[REG_NUM(i, 0)] *= v;\n\tcpu->CPSR.bits.N = BIT31(cpu->R[REG_NUM(i, 0)]);\n\tcpu->CPSR.bits.Z = cpu->R[REG_NUM(i, 0)] == 0;\n\t//The MUL instruction is defined to leave the C flag unchanged in ARMv5 and above.\n\t//In earlier versions of the architecture, the value of the C flag was UNPREDICTABLE\n\t//after a MUL instruction.\n\t\n\tif (PROCNUM == 1)\t// ARM4T 1S + mI, m = 3\n\t\treturn 4;\n\n\tMUL_Mxx_END_THUMB(1);\n}\n\n//-----------------------------------------------------------------------------\n//   STRB / LDRB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_STRB_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>6)&0x1F);\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_NUM(i, 0)]);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDRB_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>6)&0x1F);\n\tcpu->R[REG_NUM(i, 0)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3, adr);\n}\n\n\nTEMPLATE static  u32 FASTCALL OP_STRB_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)];\n\tWRITE8(cpu->mem_if->data, adr, (u8)cpu->R[REG_NUM(i, 0)]);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_WRITE>(2, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDRB_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)];\n\tcpu->R[REG_NUM(i, 0)] = (u32)READ8(cpu->mem_if->data, adr);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3, adr);\n}\n\n//-----------------------------------------------------------------------------\n//   LDRSB\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_LDRSB_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)];\n\tcpu->R[REG_NUM(i, 0)] = (u32)((s8)READ8(cpu->mem_if->data, adr));\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,8,MMU_AD_READ>(3, adr);\n}\n\n//-----------------------------------------------------------------------------\n//   STRH / LDRH\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_STRH_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>5)&0x3E);\n\tWRITE16(cpu->mem_if->data, adr, (u16)cpu->R[REG_NUM(i, 0)]);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDRH_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>5)&0x3E);\n\tcpu->R[REG_NUM(i, 0)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3, adr);\n}\n\n\nTEMPLATE static  u32 FASTCALL OP_STRH_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)];\n\tWRITE16(cpu->mem_if->data, adr, ((u16)cpu->R[REG_NUM(i, 0)]));\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_WRITE>(2, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDRH_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)];\n\tcpu->R[REG_NUM(i, 0)] = (u32)READ16(cpu->mem_if->data, adr);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3, adr);\n}\n\n//-----------------------------------------------------------------------------\n//   LDRSH\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_LDRSH_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)];\n\tcpu->R[REG_NUM(i, 0)] = (u32)((s16)READ16(cpu->mem_if->data, adr));\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,16,MMU_AD_READ>(3, adr);\n}\n\n//-----------------------------------------------------------------------------\n//   STR / LDR\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_STR_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>4)&0x7C);\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 0)]);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDR_IMM_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 3)] + ((i>>4)&0x7C);\n\tu32 tempValue = READ32(cpu->mem_if->data, adr);\n\tadr = (adr&3)*8;\n\ttempValue = (tempValue>>adr) | (tempValue<<(32-adr));\n\tcpu->R[REG_NUM(i, 0)] = tempValue;\n\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, adr);\n}\n\n\nTEMPLATE static  u32 FASTCALL OP_STR_REG_OFF(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 6)] + cpu->R[REG_NUM(i, 3)];\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 0)]);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDR_REG_OFF(const u32 i)\n{\n\tu32 adr = (cpu->R[REG_NUM(i, 3)] + cpu->R[REG_NUM(i, 6)]);\n\tu32 tempValue = READ32(cpu->mem_if->data, adr);\n\tadr = (adr&3)*8;\n\ttempValue = (tempValue>>adr) | (tempValue<<(32-adr));\n\tcpu->R[REG_NUM(i, 0)] = tempValue;\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_STR_SPREL(const u32 i)\n{\n\tu32 adr = cpu->R[13] + ((i&0xFF)<<2);\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[REG_NUM(i, 8)]);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_WRITE>(2, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDR_SPREL(const u32 i)\n{\n\tu32 adr = cpu->R[13] + ((i&0xFF)<<2);\n\tcpu->R[REG_NUM(i, 8)] = READ32(cpu->mem_if->data, adr);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, adr);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDR_PCREL(const u32 i)\n{\n\tu32 adr = (cpu->R[15]&0xFFFFFFFC) + ((i&0xFF)<<2);\n\t\n\tcpu->R[REG_NUM(i, 8)] = READ32(cpu->mem_if->data, adr);\n\t\t\t\n\treturn MMU_aluMemAccessCycles<PROCNUM,32,MMU_AD_READ>(3, adr);\n}\n\n//-----------------------------------------------------------------------------\n//   Adjust SP\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_ADJUST_P_SP(const u32 i)\n{\n\tcpu->R[13] += ((i&0x7F)<<2);\n\t\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_ADJUST_M_SP(const u32 i)\n{\n\tcpu->R[13] -= ((i&0x7F)<<2);\n\t\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   PUSH / POP\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_PUSH(const u32 i)\n{\n\tu32 adr = cpu->R[13] - 4;\n\tu32 c = 0, j;\n\t\n\tfor(j = 0; j<8; j++)\n\t\tif(BIT_N(i, 7-j))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, adr, cpu->R[7-j]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\tcpu->R[13] = adr + 4;\n\t\n\t return MMU_aluMemCycles<PROCNUM>(3, c);\n}\n\nTEMPLATE static  u32 FASTCALL OP_PUSH_LR(const u32 i)\n{\n\tu32 adr = cpu->R[13] - 4;\n\tu32 c = 0, j;\n\t\n\tWRITE32(cpu->mem_if->data, adr, cpu->R[14]);\n\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\tadr -= 4;\n\t\t\n\tfor(j = 0; j<8; j++)\n\t\tif(BIT_N(i, 7-j))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, adr, cpu->R[7-j]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr -= 4;\n\t\t}\n\tcpu->R[13] = adr + 4;\n\t\n\t return MMU_aluMemCycles<PROCNUM>(4, c);\n}\n\nTEMPLATE static  u32 FASTCALL OP_POP(const u32 i)\n{\n\tu32 adr = cpu->R[13];\n\tu32 c = 0, j;\n\n\tfor(j = 0; j<8; j++)\n\t\tif(BIT_N(i, j))\n\t\t{\n\t\t\tcpu->R[j] = READ32(cpu->mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\tcpu->R[13] = adr;\t  \n\t\n\t return MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\n// In ARMv5 and above, bit[0] of the loaded value\n// determines whether execution continues after this branch in ARM state or in Thumb state, as though the\n// following instruction had been executed:\n// BX (loaded_value)\n// In T variants of ARMv4, bit[0] of the loaded value is ignored and execution continues in Thumb state, as\n// though the following instruction had been executed:\n// MOV PC,(loaded_value)\nTEMPLATE static  u32 FASTCALL OP_POP_PC(const u32 i)\n{\n\tu32 adr = cpu->R[13];\n\tu32 c = 0, j;\n\tu32 v = 0;\n\n\tfor(j = 0; j<8; j++)\n\t\tif(BIT_N(i, j))\n\t\t{\n\t\t\tcpu->R[j] = READ32(cpu->mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t}\n\n\tv = READ32(cpu->mem_if->data, adr);\n\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\tif(PROCNUM==0)\n\t\tcpu->CPSR.bits.T = BIT0(v);\n\n\tcpu->R[15] = v & 0xFFFFFFFE;\n\tcpu->next_instruction = cpu->R[15];\n\t\n\tcpu->R[13] = adr + 4;\n\t return MMU_aluMemCycles<PROCNUM>(5, c);\n}\n\n//-----------------------------------------------------------------------------\n//   STMIA / LDMIA\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_STMIA_THUMB(const u32 i)\n{\n\tu32 adr = cpu->R[REG_NUM(i, 8)];\n\tu32 c = 0, j;\n\tu32 erList = 1; //Empty Register List\n\n\t// ------ ARM_REF:\n\t// ------ If <Rn> is specified in <registers>:\n\t// ------\t* If <Rn> is the lowest-numbered register specified in <registers>, the original value of <Rn> is stored.\n\t// ------\t* Otherwise, the stored value of <Rn> is UNPREDICTABLE.\n\tif (BIT_N(i, REG_NUM(i, 8)))\n\t\tprintf(\"STMIA with Rb in Rlist\\n\");\n\n\tfor(j = 0; j<8; j++)\n\t{\n\t\tif(BIT_N(i, j))\n\t\t{\n\t\t\tWRITE32(cpu->mem_if->data, adr, cpu->R[j]);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_WRITE>(adr);\n\t\t\tadr += 4;\n\t\t\terList = 0; //Register List isnt empty\n\t\t}\n\t}\n\n\tif (erList)\n\t\t printf(\"STMIA with Empty Rlist\\n\");\n\n\tcpu->R[REG_NUM(i, 8)] = adr;\n\treturn MMU_aluMemCycles<PROCNUM>(2, c);\n}\n\nTEMPLATE static  u32 FASTCALL OP_LDMIA_THUMB(const u32 i)\n{\n\tu32 regIndex = REG_NUM(i, 8);\n\tu32 adr = cpu->R[regIndex];\n\tu32 c = 0, j;\n\tu32 erList = 1; //Empty Register List\n\n\t//if (BIT_N(i, regIndex))\n\t//\t printf(\"LDMIA with Rb in Rlist at %08X\\n\",cpu->instruct_adr);\n\n\tfor(j = 0; j<8; j++)\n\t{\n\t\tif(BIT_N(i, j))\n\t\t{\n\t\t\tcpu->R[j] = READ32(cpu->mem_if->data, adr);\n\t\t\tc += MMU_memAccessCycles<PROCNUM,32,MMU_AD_READ>(adr);\n\t\t\tadr += 4;\n\t\t\terList = 0; //Register List isnt empty\n\t\t}\n\t}\n\n\tif (erList)\n\t\t printf(\"LDMIA with Empty Rlist\\n\");\n\n\t// ARM_REF:\tTHUMB: Causes base register write-back, and is not optional\n\t// ARM_REF:\tIf the base register <Rn> is specified in <registers>, the final value of <Rn> is the loaded value\n\t//\t\t\t(not the written-back value).\n\tif (!BIT_N(i, regIndex))\n\t\tcpu->R[regIndex] = adr;\n   \n\treturn MMU_aluMemCycles<PROCNUM>(3, c);\n}\n\n//-----------------------------------------------------------------------------\n//   BKPT\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_BKPT_THUMB(const u32 i)\n{\n\tprintf(\"THUMB%c: OP_BKPT triggered\\n\", PROCNUM?'7':'9');\n\tStatus_Reg tmp = cpu->CPSR;\n\tarmcpu_switchMode(cpu, ABT);\t\t\t\t// enter abt mode\n\tcpu->R[14] = cpu->instruct_adr + 4;\n\tcpu->SPSR = tmp;\t\t\t\t\t\t\t// save old CPSR as new SPSR\n\tcpu->CPSR.bits.T = 0;\t\t\t\t\t\t// handle as ARM32 code\n\tcpu->CPSR.bits.I = 1;\n\tcpu->changeCPSR();\n\tcpu->R[15] = cpu->intVector + 0x0C;\n\tcpu->next_instruction = cpu->R[15];\n\treturn 1;\n}\n\n//-----------------------------------------------------------------------------\n//   SWI\n//-----------------------------------------------------------------------------\n\nTEMPLATE static  u32 FASTCALL OP_SWI_THUMB(const u32 i)\n{\n\tu32 swinum = i & 0xFF;\n\n\t//ideas-style debug prints (execute this SWI with the null terminated string address in R0)\n\tif(swinum==0xFC) {\n\t\tIdeasLog(cpu);\n\t\treturn 0;\n\t}\n\n\t//if the user has changed the intVector to point away from the nds bioses,\n\t//then it doesn't really make any sense to use the builtin SWI's since \n\t//the bios ones aren't getting called anyway\n\tbool bypassBuiltinSWI = \n\t\t(cpu->intVector == 0x00000000 && PROCNUM==0)\n\t\t|| (cpu->intVector == 0xFFFF0000 && PROCNUM==1);\n\n\tif(cpu->swi_tab && !bypassBuiltinSWI) {\n\t\t//zero 25-dec-2008 - in arm, we were masking to 0x1F. \n\t\t//this is probably safer since an invalid opcode could crash the emu\n\t\t//zero 30-jun-2009 - but they say that the ideas 0xFF should crash the device...\n\t\t//u32 swinum = cpu->instruction & 0xFF;\n\t\tswinum &= 0x1F;\n\t\t//printf(\"%d ARM SWI %d\\n\",PROCNUM,swinum);\n\t\treturn cpu->swi_tab[swinum]() + 3;  \n\t}\n\telse {\n\t\t/* we use an irq thats not in the irq tab, as\n\t\tit was replaced due to a changed intVector */\n\t\tStatus_Reg tmp = cpu->CPSR;\n\t\tarmcpu_switchMode(cpu, SVC);\t\t  /* enter svc mode */\n\t\tcpu->R[14] = cpu->next_instruction;\t\t  /* jump to swi Vector */\n\t\tcpu->SPSR = tmp;\t\t\t\t\t/* save old CPSR as new SPSR */\n\t\tcpu->CPSR.bits.T = 0;\t\t\t\t/* handle as ARM32 code */\n\t\tcpu->CPSR.bits.I = 1;\n\t\tcpu->changeCPSR();\n\t\tcpu->R[15] = cpu->intVector + 0x08;\n\t\tcpu->next_instruction = cpu->R[15];\n\t\treturn 3;\n\t}\n}\n\n//-----------------------------------------------------------------------------\n//   Branch\n//-----------------------------------------------------------------------------\n#define SIGNEEXT_IMM11(i)\t(((i)&0x7FF) | (BIT10(i) * 0xFFFFF800))\n#define SIGNEXTEND_11(i) (((s32)i<<21)>>21)\n\nTEMPLATE static  u32 FASTCALL OP_B_COND(const u32 i)\n{\n\tif(!TEST_COND((i>>8)&0xF, 0, cpu->CPSR))\n\t\treturn 1;\n\t\n\tcpu->R[15] += (u32)((s8)(i&0xFF))<<1;\n\tcpu->next_instruction = cpu->R[15];\n\treturn 3;\n}\n\nTEMPLATE static  u32 FASTCALL OP_B_UNCOND(const u32 i)\n{\n\t//nocash message detection\n\tconst u16 last = _MMU_read16<PROCNUM,MMU_AT_DEBUG>(cpu->instruct_adr-2);\n\tconst u16 next = _MMU_read16<PROCNUM,MMU_AT_DEBUG>(cpu->instruct_adr+2);\n\tstatic const u16 mov_r12_r12 = 0x46E4;\n\tif(last == mov_r12_r12 && next == 0x6464)\n\t{\n\t\tNocashMessage(cpu,6);\n\t}\n\n\tcpu->R[15] += (SIGNEEXT_IMM11(i)<<1);\n\tcpu->next_instruction = cpu->R[15];\n\treturn 1;\n}\n \nTEMPLATE static  u32 FASTCALL OP_BLX(const u32 i)\n{\n\tcpu->R[15] = (cpu->R[14] + ((i&0x7FF)<<1))&0xFFFFFFFC;\n\tcpu->R[14] = cpu->next_instruction | 1;\n\tcpu->next_instruction = cpu->R[15];\n\tcpu->CPSR.bits.T = 0;\n\treturn 3;\n}\n\nTEMPLATE static  u32 FASTCALL OP_BL_10(const u32 i)\n{\n\tcpu->R[14] = cpu->R[15] + (SIGNEXTEND_11(i)<<12);\n\treturn 1;\n}\n\nTEMPLATE static  u32 FASTCALL OP_BL_11(const u32 i)\n{\n\tcpu->R[15] = (cpu->R[14] + ((i&0x7FF)<<1));\n\tcpu->R[14] = cpu->next_instruction | 1;\n\tcpu->next_instruction = cpu->R[15];\n\treturn 4;\n}\n\nTEMPLATE static  u32 FASTCALL OP_BX_THUMB(const u32 i)\n{\n\t// When using PC as operand with BX opcode, switch to ARM state and jump to (instruct_adr+4)\n\t// Reference: http://nocash.emubase.de/gbatek.htm#thumb5hiregisteroperationsbranchexchange\n\n#if 0\n\tif (REG_POS(i, 3) == 15)\n\t{\n\t\t cpu->CPSR.bits.T = 0;\n\t\t cpu->R[15] &= 0xFFFFFFFC;\n\t\t cpu->next_instruction = cpu->R[15];\n\t}\n\telse\n\t{\n\t\tu32 Rm = cpu->R[REG_POS(i, 3)];\n\n\t\tcpu->CPSR.bits.T = BIT0(Rm);\n\t\tcpu->R[15] = (Rm & 0xFFFFFFFE);\n\t\tcpu->next_instruction = cpu->R[15];\n\t}\n#else\n\tu32 Rm = cpu->R[REG_POS(i, 3)];\n\t//----- ARM_REF:\n\t//----- Register 15 can be specified for <Rm>. If this is done, R15 is read as normal for Thumb code,\n\t//----- that is, it is the address of the BX instruction itself plus 4. If the BX instruction is at a\n\t//----- word-aligned address, this results in a branch to the next word, executing in ARM state.\n\t//----- However, if the BX instruction is not at a word-aligned address, this means that the results of\n\t//----- the instruction are UNPREDICTABLE (because the value read for R15 has bits[1:0]==0b10).\n\tif (Rm == 15)\n\t{\n\t\t//printf(\"THUMB%c: BX using PC as operand\\n\", PROCNUM?'7':'9');\n\t\t//emu_halt();\n\t}\n\tcpu->CPSR.bits.T = BIT0(Rm);\n\tcpu->R[15] = (Rm & (0xFFFFFFFC|(1<<cpu->CPSR.bits.T)));\n\tcpu->next_instruction = cpu->R[15];\n#endif\n\treturn 3;\n}\n\nTEMPLATE static  u32 FASTCALL OP_BLX_THUMB(const u32 i)\n{\n\tu32 Rm = cpu->R[REG_POS(i, 3)];\n\tcpu->CPSR.bits.T = BIT0(Rm);\n\tcpu->R[15] = Rm & 0xFFFFFFFE;\n\tcpu->R[14] = cpu->next_instruction | 1;\n\tcpu->next_instruction = cpu->R[15];\n\t\n\treturn 4;\n}\n\n//-----------------------------------------------------------------------------\n//   The End\n//-----------------------------------------------------------------------------\n\nconst OpFunc thumb_instructions_set[2][1024] = {{\n#define TABDECL(x) x<0>\n#include \"thumb_tabdef.inc\"\n#undef TABDECL\n},{\n#define TABDECL(x) x<1>\n#include \"thumb_tabdef.inc\"\n#undef TABDECL\n}};\n\n#define TABDECL(x) #x\nconst char* thumb_instruction_names[1024] = {\n#include \"thumb_tabdef.inc\"\n};\n#undef TABDECL\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/thumb_instructions.h",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2006-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef THUMB_INSTRUCTIONS_H\n#define THUMB_INSTRUCTIONS_H\n\n#include \"armcpu.h\"\n\ntypedef u32 (FASTCALL* ThumbOpFunc)(const u32 i);\n\nextern const ThumbOpFunc thumb_instructions_set_0[1024];\nextern const ThumbOpFunc thumb_instructions_set_1[1024];\n\nextern const char* thumb_instruction_names[1024];\n\n#endif\n \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/thumb_tabdef.inc",
    "content": "/*\n\tCopyright (C) 2006 yopyop\n\tCopyright (C) 2007-2012 DeSmuME team\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* 00 0000 0000 */ TABDECL(OP_LSL_0),\t\t// OP_LSL_0\n/* 00 0000 0001 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 0010 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 0011 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 0100 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 0101 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 0110 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 0111 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1000 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1001 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1010 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1011 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1100 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1101 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1110 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0000 1111 */ TABDECL(OP_LSL),\t\t// OP_LSL\n\n/* 00 0001 0000 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 0001 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 0010 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 0011 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 0100 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 0101 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 0110 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 0111 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1000 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1001 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1010 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1011 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1100 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1101 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1110 */ TABDECL(OP_LSL),\t\t// OP_LSL\n/* 00 0001 1111 */ TABDECL(OP_LSL),\t\t// OP_LSL\n\n/* 00 0010 0000 */ TABDECL(OP_LSR_0),\t\t// OP_LSR_0\n/* 00 0010 0001 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 0010 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 0011 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 0100 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 0101 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 0110 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 0111 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1000 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1001 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1010 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1011 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1100 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1101 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1110 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0010 1111 */ TABDECL(OP_LSR),\t\t// OP_LSR\n\n/* 00 0011 0000 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 0001 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 0010 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 0011 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 0100 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 0101 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 0110 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 0111 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1000 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1001 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1010 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1011 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1100 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1101 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1110 */ TABDECL(OP_LSR),\t\t// OP_LSR\n/* 00 0011 1111 */ TABDECL(OP_LSR),\t\t// OP_LSR\n\n/* 00 0100 0000 */ TABDECL(OP_ASR_0),\t\t// OP_ASR_0\n/* 00 0100 0001 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 0010 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 0011 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 0100 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 0101 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 0110 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 0111 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1000 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1001 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1010 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1011 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1100 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1101 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1110 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0100 1111 */ TABDECL(OP_ASR),\t\t// OP_ASR\n\n/* 00 0101 0000 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 0001 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 0010 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 0011 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 0100 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 0101 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 0110 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 0111 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1000 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1001 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1010 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1011 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1100 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1101 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1110 */ TABDECL(OP_ASR),\t\t// OP_ASR\n/* 00 0101 1111 */ TABDECL(OP_ASR),\t\t// OP_ASR\n\n/* 00 0110 0000 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 0001 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 0010 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 0011 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 0100 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 0101 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 0110 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 0111 */ TABDECL(OP_ADD_REG),\t\t// OP_ADD_REG\n/* 00 0110 1000 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n/* 00 0110 1001 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n/* 00 0110 1010 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n/* 00 0110 1011 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n/* 00 0110 1100 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n/* 00 0110 1101 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n/* 00 0110 1110 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n/* 00 0110 1111 */ TABDECL(OP_SUB_REG),\t\t// OP_SUB_REG\n\n/* 00 0111 0000 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 0001 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 0010 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 0011 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 0100 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 0101 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 0110 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 0111 */ TABDECL(OP_ADD_IMM3),\t\t// OP_ADD_IMM3\n/* 00 0111 1000 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n/* 00 0111 1001 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n/* 00 0111 1010 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n/* 00 0111 1011 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n/* 00 0111 1100 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n/* 00 0111 1101 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n/* 00 0111 1110 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n/* 00 0111 1111 */ TABDECL(OP_SUB_IMM3),\t\t// OP_SUB_IMM3\n\n/* 00 1000 0000 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 0001 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 0010 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 0011 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 0100 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 0101 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 0110 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 0111 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1000 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1001 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1010 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1011 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1100 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1101 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1110 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1000 1111 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n\n/* 00 1001 0000 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 0001 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 0010 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 0011 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 0100 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 0101 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 0110 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 0111 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1000 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1001 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1010 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1011 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1100 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1101 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1110 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n/* 00 1001 1111 */ TABDECL(OP_MOV_IMM8),\t\t// OP_MOV_IMM8\n\n/* 00 1010 0000 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 0001 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 0010 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 0011 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 0100 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 0101 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 0110 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 0111 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1000 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1001 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1010 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1011 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1100 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1101 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1110 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1010 1111 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n\n/* 00 1011 0000 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 0001 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 0010 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 0011 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 0100 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 0101 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 0110 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 0111 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1000 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1001 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1010 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1011 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1100 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1101 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1110 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n/* 00 1011 1111 */ TABDECL(OP_CMP_IMM8),\t\t// OP_CMP_IMM8\n\n/* 00 1100 0000 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 0001 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 0010 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 0011 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 0100 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 0101 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 0110 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 0111 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1000 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1001 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1010 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1011 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1100 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1101 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1110 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1100 1111 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n\n/* 00 1101 0000 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 0001 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 0010 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 0011 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 0100 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 0101 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 0110 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 0111 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1000 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1001 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1010 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1011 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1100 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1101 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1110 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n/* 00 1101 1111 */ TABDECL(OP_ADD_IMM8),\t\t// OP_ADD_IMM8\n\n/* 00 1110 0000 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 0001 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 0010 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 0011 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 0100 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 0101 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 0110 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 0111 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1000 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1001 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1010 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1011 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1100 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1101 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1110 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1110 1111 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n\n/* 00 1111 0000 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 0001 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 0010 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 0011 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 0100 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 0101 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 0110 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 0111 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1000 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1001 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1010 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1011 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1100 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1101 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1110 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n/* 00 1111 1111 */ TABDECL(OP_SUB_IMM8),\t\t// OP_SUB_IMM8\n\n/* 01 0000 0000 */ TABDECL(OP_AND),\t\t// OP_AND\n/* 01 0000 0001 */ TABDECL(OP_EOR),\t\t// OP_EOR\n/* 01 0000 0010 */ TABDECL(OP_LSL_REG),\t\t// OP_LSL_REG\n/* 01 0000 0011 */ TABDECL(OP_LSR_REG),\t\t// OP_LSR_REG\n/* 01 0000 0100 */ TABDECL(OP_ASR_REG),\t\t// OP_ASR_REG\n/* 01 0000 0101 */ TABDECL(OP_ADC_REG),\t\t// OP_ADC_REG\n/* 01 0000 0110 */ TABDECL(OP_SBC_REG),\t\t// OP_SBC_REG\n/* 01 0000 0111 */ TABDECL(OP_ROR_REG),\t\t// OP_ROR_REG\n/* 01 0000 1000 */ TABDECL(OP_TST),\t\t// OP_TST\n/* 01 0000 1001 */ TABDECL(OP_NEG),\t\t// OP_NEG\n/* 01 0000 1010 */ TABDECL(OP_CMP),\t\t// OP_CMP\n/* 01 0000 1011 */ TABDECL(OP_CMN),\t\t// OP_CMN\n/* 01 0000 1100 */ TABDECL(OP_ORR),\t\t// OP_ORR\n/* 01 0000 1101 */ TABDECL(OP_MUL_REG),\t\t// OP_MUL_REG\n/* 01 0000 1110 */ TABDECL(OP_BIC),\t\t// OP_BIC\n/* 01 0000 1111 */ TABDECL(OP_MVN),\t\t// OP_MVN\n\n/* 01 0001 0000 */ TABDECL(OP_ADD_SPE),\t\t// OP_ADD_SPE\n/* 01 0001 0001 */ TABDECL(OP_ADD_SPE),\t\t// OP_ADD_SPE\n/* 01 0001 0010 */ TABDECL(OP_ADD_SPE),\t\t// OP_ADD_SPE\n/* 01 0001 0011 */ TABDECL(OP_ADD_SPE),\t\t// OP_ADD_SPE\n/* 01 0001 0100 */ TABDECL(OP_CMP_SPE),\t\t// OP_CMP_SPE\n/* 01 0001 0101 */ TABDECL(OP_CMP_SPE),\t\t// OP_CMP_SPE\n/* 01 0001 0110 */ TABDECL(OP_CMP_SPE),\t\t// OP_CMP_SPE\n/* 01 0001 0111 */ TABDECL(OP_CMP_SPE),\t\t// OP_CMP_SPE\n/* 01 0001 1000 */ TABDECL(OP_MOV_SPE),\t\t// OP_MOV_SPE\n/* 01 0001 1001 */ TABDECL(OP_MOV_SPE),\t\t// OP_MOV_SPE\n/* 01 0001 1010 */ TABDECL(OP_MOV_SPE),\t\t// OP_MOV_SPE\n/* 01 0001 1011 */ TABDECL(OP_MOV_SPE),\t\t// OP_MOV_SPE\n/* 01 0001 1100 */ TABDECL(OP_BX_THUMB),\t\t// OP_BX_THUMB\n/* 01 0001 1101 */ TABDECL(OP_BX_THUMB),\t\t// OP_BX_THUMB\n/* 01 0001 1110 */ TABDECL(OP_BLX_THUMB),\t\t// OP_BLX_THUMB\n/* 01 0001 1111 */ TABDECL(OP_BLX_THUMB),\t\t// OP_BLX_THUMB\n\n/* 01 0010 0000 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 0001 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 0010 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 0011 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 0100 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 0101 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 0110 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 0111 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1000 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1001 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1010 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1011 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1100 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1101 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1110 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0010 1111 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n\n/* 01 0011 0000 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 0001 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 0010 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 0011 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 0100 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 0101 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 0110 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 0111 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1000 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1001 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1010 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1011 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1100 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1101 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1110 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n/* 01 0011 1111 */ TABDECL(OP_LDR_PCREL),\t\t// OP_LDR_PCREL\n\n/* 01 0100 0000 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 0001 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 0010 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 0011 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 0100 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 0101 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 0110 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 0111 */ TABDECL(OP_STR_REG_OFF),\t\t// OP_STR_REG_OFF\n/* 01 0100 1000 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n/* 01 0100 1001 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n/* 01 0100 1010 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n/* 01 0100 1011 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n/* 01 0100 1100 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n/* 01 0100 1101 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n/* 01 0100 1110 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n/* 01 0100 1111 */ TABDECL(OP_STRH_REG_OFF),\t\t// OP_STRH_REG_OFF\n\n/* 01 0101 0000 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 0001 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 0010 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 0011 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 0100 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 0101 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 0110 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 0111 */ TABDECL(OP_STRB_REG_OFF),\t\t// OP_STRB_REG_OFF\n/* 01 0101 1000 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n/* 01 0101 1001 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n/* 01 0101 1010 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n/* 01 0101 1011 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n/* 01 0101 1100 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n/* 01 0101 1101 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n/* 01 0101 1110 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n/* 01 0101 1111 */ TABDECL(OP_LDRSB_REG_OFF),\t\t// OP_LDRSB_REG_OFF\n\n/* 01 0110 0000 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 0001 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 0010 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 0011 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 0100 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 0101 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 0110 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 0111 */ TABDECL(OP_LDR_REG_OFF),\t\t// OP_LDR_REG_OFF\n/* 01 0110 1000 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n/* 01 0110 1001 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n/* 01 0110 1010 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n/* 01 0110 1011 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n/* 01 0110 1100 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n/* 01 0110 1101 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n/* 01 0110 1110 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n/* 01 0110 1111 */ TABDECL(OP_LDRH_REG_OFF),\t\t// OP_LDRH_REG_OFF\n\n/* 01 0111 0000 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 0001 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 0010 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 0011 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 0100 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 0101 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 0110 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 0111 */ TABDECL(OP_LDRB_REG_OFF),\t\t// OP_LDRB_REG_OFF\n/* 01 0111 1000 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n/* 01 0111 1001 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n/* 01 0111 1010 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n/* 01 0111 1011 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n/* 01 0111 1100 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n/* 01 0111 1101 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n/* 01 0111 1110 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n/* 01 0111 1111 */ TABDECL(OP_LDRSH_REG_OFF),\t\t// OP_LDRSH_REG_OFF\n\n/* 01 1000 0000 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 0001 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 0010 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 0011 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 0100 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 0101 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 0110 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 0111 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1000 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1001 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1010 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1011 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1100 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1101 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1110 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1000 1111 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n\n/* 01 1001 0000 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 0001 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 0010 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 0011 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 0100 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 0101 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 0110 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 0111 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1000 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1001 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1010 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1011 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1100 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1101 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1110 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n/* 01 1001 1111 */ TABDECL(OP_STR_IMM_OFF),\t\t// OP_STR_IMM_OFF\n\n/* 01 1010 0000 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 0001 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 0010 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 0011 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 0100 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 0101 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 0110 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 0111 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1000 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1001 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1010 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1011 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1100 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1101 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1110 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1010 1111 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n\n/* 01 1011 0000 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 0001 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 0010 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 0011 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 0100 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 0101 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 0110 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 0111 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1000 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1001 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1010 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1011 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1100 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1101 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1110 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n/* 01 1011 1111 */ TABDECL(OP_LDR_IMM_OFF),\t\t// OP_LDR_IMM_OFF\n\n/* 01 1100 0000 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 0001 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 0010 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 0011 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 0100 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 0101 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 0110 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 0111 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1000 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1001 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1010 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1011 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1100 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1101 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1110 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1100 1111 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n\n/* 01 1101 0000 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 0001 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 0010 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 0011 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 0100 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 0101 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 0110 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 0111 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1000 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1001 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1010 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1011 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1100 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1101 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1110 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n/* 01 1101 1111 */ TABDECL(OP_STRB_IMM_OFF),\t\t// OP_STRB_IMM_OFF\n\n/* 01 1110 0000 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 0001 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 0010 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 0011 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 0100 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 0101 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 0110 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 0111 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1000 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1001 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1010 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1011 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1100 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1101 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1110 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1110 1111 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n\n/* 01 1111 0000 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 0001 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 0010 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 0011 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 0100 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 0101 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 0110 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 0111 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1000 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1001 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1010 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1011 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1100 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1101 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1110 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n/* 01 1111 1111 */ TABDECL(OP_LDRB_IMM_OFF),\t\t// OP_LDRB_IMM_OFF\n\n/* 10 0000 0000 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 0001 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 0010 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 0011 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 0100 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 0101 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 0110 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 0111 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1000 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1001 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1010 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1011 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1100 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1101 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1110 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0000 1111 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n\n/* 10 0001 0000 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 0001 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 0010 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 0011 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 0100 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 0101 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 0110 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 0111 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1000 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1001 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1010 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1011 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1100 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1101 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1110 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n/* 10 0001 1111 */ TABDECL(OP_STRH_IMM_OFF),\t\t// OP_STRH_IMM_OFF\n\n/* 10 0010 0000 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 0001 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 0010 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 0011 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 0100 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 0101 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 0110 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 0111 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1000 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1001 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1010 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1011 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1100 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1101 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1110 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0010 1111 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n\n/* 10 0011 0000 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 0001 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 0010 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 0011 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 0100 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 0101 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 0110 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 0111 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1000 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1001 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1010 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1011 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1100 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1101 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1110 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n/* 10 0011 1111 */ TABDECL(OP_LDRH_IMM_OFF),\t\t// OP_LDRH_IMM_OFF\n\n/* 10 0100 0000 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 0001 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 0010 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 0011 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 0100 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 0101 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 0110 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 0111 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1000 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1001 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1010 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1011 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1100 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1101 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1110 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0100 1111 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n\n/* 10 0101 0000 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 0001 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 0010 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 0011 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 0100 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 0101 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 0110 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 0111 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1000 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1001 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1010 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1011 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1100 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1101 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1110 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n/* 10 0101 1111 */ TABDECL(OP_STR_SPREL),\t\t// OP_STR_SPREL\n\n/* 10 0110 0000 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 0001 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 0010 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 0011 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 0100 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 0101 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 0110 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 0111 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1000 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1001 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1010 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1011 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1100 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1101 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1110 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0110 1111 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n\n/* 10 0111 0000 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 0001 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 0010 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 0011 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 0100 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 0101 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 0110 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 0111 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1000 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1001 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1010 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1011 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1100 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1101 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1110 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n/* 10 0111 1111 */ TABDECL(OP_LDR_SPREL),\t\t// OP_LDR_SPREL\n\n/* 10 1000 0000 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 0001 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 0010 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 0011 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 0100 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 0101 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 0110 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 0111 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1000 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1001 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1010 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1011 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1100 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1101 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1110 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1000 1111 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n\n/* 10 1001 0000 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 0001 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 0010 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 0011 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 0100 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 0101 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 0110 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 0111 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1000 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1001 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1010 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1011 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1100 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1101 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1110 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n/* 10 1001 1111 */ TABDECL(OP_ADD_2PC),\t\t// OP_ADD_2PC\n\n/* 10 1010 0000 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 0001 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 0010 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 0011 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 0100 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 0101 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 0110 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 0111 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1000 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1001 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1010 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1011 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1100 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1101 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1110 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1010 1111 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n\n/* 10 1011 0000 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 0001 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 0010 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 0011 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 0100 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 0101 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 0110 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 0111 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1000 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1001 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1010 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1011 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1100 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1101 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1110 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n/* 10 1011 1111 */ TABDECL(OP_ADD_2SP),\t\t// OP_ADD_2SP\n\n/* 10 1100 0000 */ TABDECL(OP_ADJUST_P_SP),\t\t// OP_ADJUST_P_SP\n/* 10 1100 0001 */ TABDECL(OP_ADJUST_P_SP),\t\t// OP_ADJUST_P_SP\n/* 10 1100 0010 */ TABDECL(OP_ADJUST_M_SP),\t\t// OP_ADJUST_M_SP\n/* 10 1100 0011 */ TABDECL(OP_ADJUST_M_SP),\t\t// OP_ADJUST_M_SP\n/* 10 1100 0100 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 0101 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 0110 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 0111 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1000 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1001 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1010 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1011 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1100 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1101 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1110 */ TABDECL(OP_UND_THUMB),\n/* 10 1100 1111 */ TABDECL(OP_UND_THUMB),\n\n/* 10 1101 0000 */ TABDECL(OP_PUSH),\t\t// OP_PUSH\n/* 10 1101 0001 */ TABDECL(OP_PUSH),\t\t// OP_PUSH\n/* 10 1101 0010 */ TABDECL(OP_PUSH),\t\t// OP_PUSH\n/* 10 1101 0011 */ TABDECL(OP_PUSH),\t\t// OP_PUSH\n/* 10 1101 0100 */ TABDECL(OP_PUSH_LR),\t\t// OP_PUSH_LR\n/* 10 1101 0101 */ TABDECL(OP_PUSH_LR),\t\t// OP_PUSH_LR\n/* 10 1101 0110 */ TABDECL(OP_PUSH_LR),\t\t// OP_PUSH_LR\n/* 10 1101 0111 */ TABDECL(OP_PUSH_LR),\t\t// OP_PUSH_LR\n/* 10 1101 1000 */ TABDECL(OP_UND_THUMB),\n/* 10 1101 1001 */ TABDECL(OP_UND_THUMB),\n/* 10 1101 1010 */ TABDECL(OP_UND_THUMB),\n/* 10 1101 1011 */ TABDECL(OP_UND_THUMB),\n/* 10 1101 1100 */ TABDECL(OP_UND_THUMB),\n/* 10 1101 1101 */ TABDECL(OP_UND_THUMB),\n/* 10 1101 1110 */ TABDECL(OP_UND_THUMB),\n/* 10 1101 1111 */ TABDECL(OP_UND_THUMB),\n\n/* 10 1110 0000 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 0001 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 0010 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 0011 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 0100 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 0101 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 0110 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 0111 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1000 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1001 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1010 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1011 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1100 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1101 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1110 */ TABDECL(OP_UND_THUMB),\n/* 10 1110 1111 */ TABDECL(OP_UND_THUMB),\n\n/* 10 1111 0000 */ TABDECL(OP_POP),\t\t// OP_POP\n/* 10 1111 0001 */ TABDECL(OP_POP),\t\t// OP_POP\n/* 10 1111 0010 */ TABDECL(OP_POP),\t\t// OP_POP\n/* 10 1111 0011 */ TABDECL(OP_POP),\t\t// OP_POP\n/* 10 1111 0100 */ TABDECL(OP_POP_PC),\t\t// OP_POP_PC\n/* 10 1111 0101 */ TABDECL(OP_POP_PC),\t\t// OP_POP_PC\n/* 10 1111 0110 */ TABDECL(OP_POP_PC),\t\t// OP_POP_PC\n/* 10 1111 0111 */ TABDECL(OP_POP_PC),\t\t// OP_POP_PC\n/* 10 1111 1000 */ TABDECL(OP_BKPT_THUMB),\t\t// OP_BKPT_THUMB\n/* 10 1111 1001 */ TABDECL(OP_BKPT_THUMB),\t\t// OP_BKPT_THUMB\n/* 10 1111 1010 */ TABDECL(OP_BKPT_THUMB),\t\t// OP_BKPT_THUMB\n/* 10 1111 1011 */ TABDECL(OP_BKPT_THUMB),\t\t// OP_BKPT_THUMB\n/* 10 1111 1100 */ TABDECL(OP_UND_THUMB),\n/* 10 1111 1101 */ TABDECL(OP_UND_THUMB),\n/* 10 1111 1110 */ TABDECL(OP_UND_THUMB),\n/* 10 1111 1111 */ TABDECL(OP_UND_THUMB),\n\n/* 11 0000 0000 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 0001 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 0010 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 0011 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 0100 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 0101 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 0110 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 0111 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1000 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1001 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1010 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1011 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1100 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1101 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1110 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0000 1111 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n\n/* 11 0001 0000 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 0001 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 0010 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 0011 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 0100 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 0101 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 0110 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 0111 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1000 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1001 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1010 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1011 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1100 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1101 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1110 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n/* 11 0001 1111 */ TABDECL(OP_STMIA_THUMB),\t\t// OP_STMIA_THUMB\n\n/* 11 0010 0000 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 0001 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 0010 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 0011 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 0100 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 0101 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 0110 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 0111 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1000 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1001 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1010 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1011 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1100 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1101 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1110 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0010 1111 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n\n/* 11 0011 0000 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 0001 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 0010 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 0011 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 0100 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 0101 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 0110 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 0111 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1000 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1001 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1010 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1011 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1100 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1101 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1110 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n/* 11 0011 1111 */ TABDECL(OP_LDMIA_THUMB),\t\t// OP_LDMIA_THUMB\n\n/* 11 0100 0000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 0001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 0010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 0011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 0100 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 0101 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 0110 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 0111 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1100 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1101 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1110 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0100 1111 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n\n/* 11 0101 0000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 0001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 0010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 0011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 0100 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 0101 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 0110 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 0111 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1100 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1101 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1110 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0101 1111 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n\n/* 11 0110 0000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 0001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 0010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 0011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 0100 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 0101 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 0110 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 0111 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1100 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1101 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1110 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0110 1111 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n\n/* 11 0111 0000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 0001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 0010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 0011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 0100 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 0101 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 0110 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 0111 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 1000 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 1001 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 1010 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 1011 */ TABDECL(OP_B_COND),\t\t// OP_B_COND\n/* 11 0111 1100 */ TABDECL(OP_SWI_THUMB),\t\t// OP_SWI_THUMB\n/* 11 0111 1101 */ TABDECL(OP_SWI_THUMB),\t\t// OP_SWI_THUMB\n/* 11 0111 1110 */ TABDECL(OP_SWI_THUMB),\t\t// OP_SWI_THUMB\n/* 11 0111 1111 */ TABDECL(OP_SWI_THUMB),\t\t// OP_SWI_THUMB\n\n/* 11 1000 0000 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 0001 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 0010 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 0011 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 0100 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 0101 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 0110 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 0111 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1000 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1001 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1010 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1011 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1100 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1101 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1110 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1000 1111 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n\n/* 11 1001 0000 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 0001 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 0010 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 0011 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 0100 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 0101 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 0110 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 0111 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1000 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1001 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1010 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1011 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1100 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1101 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1110 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n/* 11 1001 1111 */ TABDECL(OP_B_UNCOND),\t\t// OP_B_UNCOND\n\n/* 11 1010 0000 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 0001 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 0010 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 0011 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 0100 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 0101 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 0110 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 0111 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1000 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1001 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1010 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1011 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1100 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1101 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1110 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1010 1111 */ TABDECL(OP_BLX),\t\t// OP_BLX\n\n/* 11 1011 0000 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 0001 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 0010 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 0011 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 0100 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 0101 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 0110 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 0111 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1000 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1001 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1010 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1011 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1100 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1101 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1110 */ TABDECL(OP_BLX),\t\t// OP_BLX\n/* 11 1011 1111 */ TABDECL(OP_BLX),\t\t// OP_BLX\n\n/* 11 1100 0000 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 0001 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 0010 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 0011 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 0100 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 0101 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 0110 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 0111 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1000 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1001 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1010 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1011 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1100 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1101 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1110 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1100 1111 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n\n/* 11 1101 0000 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 0001 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 0010 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 0011 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 0100 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 0101 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 0110 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 0111 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1000 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1001 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1010 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1011 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1100 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1101 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1110 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n/* 11 1101 1111 */ TABDECL(OP_BL_10),\t\t// OP_BL_10\n\n/* 11 1110 0000 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 0001 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 0010 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 0011 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 0100 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 0101 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 0110 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 0111 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1000 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1001 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1010 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1011 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1100 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1101 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1110 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1110 1111 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n\n/* 11 1111 0000 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 0001 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 0010 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 0011 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 0100 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 0101 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 0110 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 0111 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1000 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1001 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1010 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1011 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1100 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1101 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1110 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n/* 11 1111 1111 */ TABDECL(OP_BL_11),\t\t// OP_BL_11\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/types.h",
    "content": "/*\n\tCopyright (C) 2005 Guillaume Duhamel\n\tCopyright (C) 2008-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef TYPES_HPP\n#define TYPES_HPP\n\n//analyze microsoft compilers\n#ifdef _MSC_VER\n#define _WINDOWS\n//todo - everyone will want to support this eventually, i suppose\n#include \"config.h\"\n#endif\n\n//enforce a constraint: gdb stub requires developer\n#if defined(GDB_STUB) && !defined(DEVELOPER)\n#define DEVELOPER\n#endif\n\n#ifdef DEVELOPER\n#define IF_DEVELOPER(X) X\n#else\n#define IF_DEVELOPER(X)\n#endif\n\n#ifdef _WINDOWS\n\t//#define HAVE_WX //not useful yet....\n\t#define HAVE_LIBAGG\n\t#define ENABLE_SSE\n\t#define ENABLE_SSE2\n\t#ifdef DEVELOPER\n\t\t#define HAVE_LUA\n\t#endif\n\t#define HAVE_JIT\n#endif\n\n#ifdef __GNUC__\n#ifdef __SSE__\n#define ENABLE_SSE\n#endif\n#ifdef __SSE2__\n#define ENABLE_SSE2\n#endif\n#endif\n\n#ifdef NOSSE\n#undef ENABLE_SSE\n#endif\n\n#ifdef NOSSE2\n#undef ENABLE_SSE2\n#endif\n\n#ifdef _MSC_VER \n#define strcasecmp(x,y) _stricmp(x,y)\n#define strncasecmp(x, y, l) strnicmp(x, y, l)\n#define snprintf _snprintf\n#else\n#define WINAPI\n#endif\n\n#ifdef __GNUC__\n#include <limits.h>\n#ifndef PATH_MAX\n#define MAX_PATH 1024\n#else\n#define MAX_PATH PATH_MAX\n#endif\n#endif\n\n#if defined(WIN32) || defined(_WIN32)\n#define _alloca16(x)\t((void *)((((int)_alloca( (x)+15 )) + 15) & ~15))\n#define _alloca32(x)\t((void *)((((int)_alloca( (x)+31 )) + 31) & ~31))\n#else\n#include <alloca.h>\n#define _alloca\t\t\talloca\n#define _alloca16(x)\t((void *)((((int)alloca( (x)+15 )) + 15) & ~15))\n#define _alloca32(x)\t((void *)((((int)_alloca( (x)+31 )) + 31) & ~31))\n#endif\n\n#if defined(_MSC_VER) || defined(__INTEL_COMPILER)\n#define DS_ALIGN(X) __declspec(align(X))\n#elif defined(__GNUC__)\n#define DS_ALIGN(X) __attribute__ ((aligned (X)))\n#else\n#define DS_ALIGN(X)\n#endif\n\n#ifdef __arm__\n#define CACHE_ALIGN DS_ALIGN(64)\n#else\n#define CACHE_ALIGN DS_ALIGN(32)\n#endif\n\n//use this for example when you want a byte value to be better-aligned\n#define FAST_ALIGN DS_ALIGN(4)\n\n#ifdef __MINGW32__ \n#define FASTCALL __attribute__((fastcall))\n#define ASMJIT_CALL_CONV kX86FuncConvGccFastCall\n#define HAVE_FASTCALL\n#elif defined (__i386__) && !defined(__clang__)\n#define FASTCALL __attribute__((regparm(3)))\n#define ASMJIT_CALL_CONV kX86FuncConvGccRegParm3\n#define HAVE_FASTCALL\n#elif defined(_MSC_VER) || defined(__INTEL_COMPILER)\n#define FASTCALL __fastcall\n#define ASMJIT_CALL_CONV kX86FuncConvMsFastCall\n#define HAVE_FASTCALL\n#else\n#define FASTCALL\n#define ASMJIT_CALL_CONV kX86FuncConvDefault\n//#define HAVE_FASTCALL\n#endif\n\n#ifdef _MSC_VER\n#define _CDECL_ __cdecl\n#else\n#define _CDECL_\n#endif\n\n#ifndef INLINE\n#if defined(_MSC_VER) || defined(__INTEL_COMPILER)\n#define INLINE _inline\n#else\n#define INLINE inline\n#endif\n#endif\n\n#ifndef FORCEINLINE\n#if defined(_MSC_VER) || defined(__INTEL_COMPILER)\n#define FORCEINLINE __forceinline\n#define MSC_FORCEINLINE __forceinline\n#else\n#define FORCEINLINE inline __attribute__((always_inline)) \n#define MSC_FORCEINLINE\n#endif\n#endif\n\n#ifndef NOINLINE\n#ifdef __GNUC__\n#define NOINLINE __attribute__((noinline))\n#else\n#define NOINLINE __declspec(noinline)\n#endif\n#endif\n\n#if defined(__LP64__)\ntypedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned int u32;\ntypedef unsigned long long u64;\n\ntypedef signed char s8;\ntypedef signed short s16;\ntypedef signed int s32;\ntypedef signed long long s64;\n#else\ntypedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned int u32;\n#if defined(_MSC_VER) || defined(__INTEL_COMPILER)\ntypedef unsigned __int64 u64;\n#else\ntypedef unsigned long long u64;\n#endif\n\ntypedef signed char s8;\ntypedef signed short s16;\ntypedef signed int s32;\n#if defined(_MSC_VER) || defined(__INTEL_COMPILER)\ntypedef __int64 s64;\n#else\ntypedef signed long long s64;\n#endif\n#endif\n\ntypedef u8  uint8;\ntypedef u16 uint16;\n\n#ifndef OBJ_C\ntypedef u32 uint32;\n#else\n#define uint32 u32 //uint32 is defined in Leopard somewhere, avoid conflicts\n#endif\n\n/*---------- GPU3D fixed-points types -----------*/\n\ntypedef s32 f32;\n#define inttof32(n)          ((n) << 12)\n#define f32toint(n)          ((n) >> 12)\n#define floattof32(n)        ((int32)((n) * (1 << 12)))\n#define f32tofloat(n)        (((float)(n)) / (float)(1<<12))\n\ntypedef s16 t16;\n#define f32tot16(n)          ((t16)(n >> 8))\n#define inttot16(n)          ((n) << 4)\n#define t16toint(n)          ((n) >> 4)\n#define floattot16(n)        ((t16)((n) * (1 << 4)))\n#define t16ofloat(n)         (((float)(n)) / (float)(1<<4))\n\ntypedef s16 v16;\n#define inttov16(n)          ((n) << 12)\n#define f32tov16(n)          (n)\n#define floattov16(n)        ((v16)((n) * (1 << 12)))\n#define v16toint(n)          ((n) >> 12)\n#define v16tofloat(n)        (((float)(n)) / (float)(1<<12))\n\ntypedef s16 v10;\n#define inttov10(n)          ((n) << 9)\n#define f32tov10(n)          ((v10)(n >> 3))\n#define v10toint(n)          ((n) >> 9)\n#define floattov10(n)        ((v10)((n) * (1 << 9)))\n#define v10tofloat(n)        (((float)(n)) / (float)(1<<9))\n\n/*----------------------*/\n\n#ifndef OBJ_C\ntypedef int BOOL;\n#else\n//apple also defines BOOL\ntypedef int desmume_BOOL;\n#define BOOL desmume_BOOL\n#endif\n\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#ifndef FALSE\n#define FALSE 0\n#endif\n\n#ifdef __BIG_ENDIAN__\n#ifndef WORDS_BIGENDIAN\n#define WORDS_BIGENDIAN\n#endif\n#endif\n\n#ifdef WORDS_BIGENDIAN\n# define LOCAL_BE\n#else\n# define LOCAL_LE\n#endif\n\n/* little endian (ds' endianess) to local endianess convert macros */\n#ifdef LOCAL_BE\t/* local arch is big endian */\n# define LE_TO_LOCAL_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff))\n# define LE_TO_LOCAL_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff))\n# define LE_TO_LOCAL_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff00)|(((x)>>40)&0xff00)|(((x)>>56)&0xff))\n# define LOCAL_TO_LE_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff))\n# define LOCAL_TO_LE_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff))\n# define LOCAL_TO_LE_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff00)|(((x)>>40)&0xff00)|(((x)>>56)&0xff))\n#else\t\t/* local arch is little endian */\n# define LE_TO_LOCAL_16(x) (x)\n# define LE_TO_LOCAL_32(x) (x)\n# define LE_TO_LOCAL_64(x) (x)\n# define LOCAL_TO_LE_16(x) (x)\n# define LOCAL_TO_LE_32(x) (x)\n# define LOCAL_TO_LE_64(x) (x)\n#endif\n\n// kilobytes and megabytes macro\n#define MB(x) ((x)*1024*1024)\n#define KB(x) ((x)*1024)\n\n#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))\n\n#define CPU_STR(c) ((c==ARM9)?\"ARM9\":\"ARM7\")\ntypedef enum\n{\n\tARM9 = 0,\n\tARM7 = 1\n} cpu_id_t;\n\n///endian-flips count bytes.  count should be even and nonzero.\ninline void FlipByteOrder(u8 *src, u32 count)\n{\n\tu8 *start=src;\n\tu8 *end=src+count-1;\n\n\tif((count&1) || !count)        return;         /* This shouldn't happen. */\n\n\twhile(count--)\n\t{\n\t\tu8 tmp;\n\n\t\ttmp=*end;\n\t\t*end=*start;\n\t\t*start=tmp;\n\t\tend--;\n\t\tstart++;\n\t}\n}\n\n\n\ninline u64 double_to_u64(double d) {\n\tunion {\n\t\tu64 a;\n\t\tdouble b;\n\t} fuxor;\n\tfuxor.b = d;\n\treturn fuxor.a;\n}\n\ninline double u64_to_double(u64 u) {\n\tunion {\n\t\tu64 a;\n\t\tdouble b;\n\t} fuxor;\n\tfuxor.a = u;\n\treturn fuxor.b;\n}\n\ninline u32 float_to_u32(float f) {\n\tunion {\n\t\tu32 a;\n\t\tfloat b;\n\t} fuxor;\n\tfuxor.b = f;\n\treturn fuxor.a;\n}\n\ninline float u32_to_float(u32 u) {\n\tunion {\n\t\tu32 a;\n\t\tfloat b;\n\t} fuxor;\n\tfuxor.a = u;\n\treturn fuxor.b;\n}\n\n\n///stores a 32bit value into the provided byte array in guaranteed little endian form\ninline void en32lsb(u8 *buf, u32 morp)\n{ \n\tbuf[0]=(u8)(morp);\n\tbuf[1]=(u8)(morp>>8);\n\tbuf[2]=(u8)(morp>>16);\n\tbuf[3]=(u8)(morp>>24);\n} \n\ninline void en16lsb(u8* buf, u16 morp)\n{\n\tbuf[0]=(u8)morp;\n\tbuf[1]=(u8)(morp>>8);\n}\n\n///unpacks a 64bit little endian value from the provided byte array into host byte order\ninline u64 de64lsb(u8 *morp)\n{\n\treturn morp[0]|(morp[1]<<8)|(morp[2]<<16)|(morp[3]<<24)|((u64)morp[4]<<32)|((u64)morp[5]<<40)|((u64)morp[6]<<48)|((u64)morp[7]<<56);\n}\n\n///unpacks a 32bit little endian value from the provided byte array into host byte order\ninline u32 de32lsb(u8 *morp)\n{\n\treturn morp[0]|(morp[1]<<8)|(morp[2]<<16)|(morp[3]<<24);\n}\n\n///unpacks a 16bit little endian value from the provided byte array into host byte order\ninline u16 de16lsb(u8 *morp)\n{\n\treturn morp[0]|(morp[1]<<8);\n}\n\n#ifndef ARRAY_SIZE\n//taken from winnt.h\nextern \"C++\" // templates cannot be declared to have 'C' linkage\ntemplate <typename T, size_t N>\nchar (*BLAHBLAHBLAH( UNALIGNED T (&)[N] ))[N];\n\n#define ARRAY_SIZE(A) (sizeof(*BLAHBLAHBLAH(A)))\n#endif\n\n\n//fairly standard for loop macros\n#define MACRODO1(TRICK,TODO) { const int X = TRICK; TODO; }\n#define MACRODO2(X,TODO)   { MACRODO1((X),TODO)   MACRODO1(((X)+1),TODO) }\n#define MACRODO4(X,TODO)   { MACRODO2((X),TODO)   MACRODO2(((X)+2),TODO) }\n#define MACRODO8(X,TODO)   { MACRODO4((X),TODO)   MACRODO4(((X)+4),TODO) }\n#define MACRODO16(X,TODO)  { MACRODO8((X),TODO)   MACRODO8(((X)+8),TODO) }\n#define MACRODO32(X,TODO)  { MACRODO16((X),TODO)  MACRODO16(((X)+16),TODO) }\n#define MACRODO64(X,TODO)  { MACRODO32((X),TODO)  MACRODO32(((X)+32),TODO) }\n#define MACRODO128(X,TODO) { MACRODO64((X),TODO)  MACRODO64(((X)+64),TODO) }\n#define MACRODO256(X,TODO) { MACRODO128((X),TODO) MACRODO128(((X)+128),TODO) }\n\n//this one lets you loop any number of times (as long as N<256)\n#define MACRODO_N(N,TODO) {\\\n\tif((N)&0x100) MACRODO256(0,TODO); \\\n\tif((N)&0x080) MACRODO128((N)&(0x100),TODO); \\\n\tif((N)&0x040) MACRODO64((N)&(0x100|0x080),TODO); \\\n\tif((N)&0x020) MACRODO32((N)&(0x100|0x080|0x040),TODO); \\\n\tif((N)&0x010) MACRODO16((N)&(0x100|0x080|0x040|0x020),TODO); \\\n\tif((N)&0x008) MACRODO8((N)&(0x100|0x080|0x040|0x020|0x010),TODO); \\\n\tif((N)&0x004) MACRODO4((N)&(0x100|0x080|0x040|0x020|0x010|0x008),TODO); \\\n\tif((N)&0x002) MACRODO2((N)&(0x100|0x080|0x040|0x020|0x010|0x008|0x004),TODO); \\\n\tif((N)&0x001) MACRODO1((N)&(0x100|0x080|0x040|0x020|0x010|0x008|0x004|0x002),TODO); \\\n}\n\n//---------------------------\n//Binary constant generator macro By Tom Torfs - donated to the public domain\n\n//turn a numeric literal into a hex constant\n//(avoids problems with leading zeroes)\n//8-bit constants max value 0x11111111, always fits in unsigned long\n#define HEX__(n) 0x##n##LU\n\n//8-bit conversion function \n#define B8__(x) ((x&0x0000000FLU)?1:0) \\\n+((x&0x000000F0LU)?2:0) \\\n+((x&0x00000F00LU)?4:0) \\\n+((x&0x0000F000LU)?8:0) \\\n+((x&0x000F0000LU)?16:0) \\\n+((x&0x00F00000LU)?32:0) \\\n+((x&0x0F000000LU)?64:0) \\\n+((x&0xF0000000LU)?128:0)\n\n//for upto 8-bit binary constants\n#define B8(d) ((unsigned char)B8__(HEX__(d)))\n\n// for upto 16-bit binary constants, MSB first\n#define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) \\\n+ B8(dlsb))\n\n// for upto 32-bit binary constants, MSB first */\n#define B32(dmsb,db2,db3,dlsb) (((unsigned long)B8(dmsb)<<24) \\\n+ ((unsigned long)B8(db2)<<16) \\\n+ ((unsigned long)B8(db3)<<8) \\\n+ B8(dlsb))\n\n//Sample usage:\n//B8(01010101) = 85\n//B16(10101010,01010101) = 43605\n//B32(10000000,11111111,10101010,01010101) = 2164238933\n//---------------------------\n\n#ifndef CTASSERT\n#define\tCTASSERT(x)\t\ttypedef char __assert ## y[(x) ? 1 : -1]\n#endif\n\nstatic const char hexValid[23] = {\"0123456789ABCDEFabcdef\"};\n\n\ntemplate<typename T> inline void reconstruct(T* t) { \n\tt->~T();\n\tnew(t) T();\n}\n\n//-------------fixed point speedup macros\n\n#ifdef _WIN32\n#include <intrin.h>\n#endif\n\nFORCEINLINE s64 fx32_mul(const s32 a, const s32 b)\n{\n#ifdef _WIN32\n\treturn __emul(a,b);\n#else\n\treturn ((s64)a)*((s64)b);\n#endif\n}\n\nFORCEINLINE s32 fx32_shiftdown(const s64 a)\n{\n#ifdef _WIN32\n\treturn (s32)__ll_rshift(a,12);\n#else\n\treturn (s32)(a>>12);\n#endif\n}\n\nFORCEINLINE s64 fx32_shiftup(const s32 a)\n{\n#ifdef _WIN32\n\treturn __ll_lshift(a,12);\n#else\n\treturn ((s64)a)<<12;\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/AsmJit.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_ASMJIT_H\n#define _ASMJIT_ASMJIT_H\n\n//! @mainpage\n//!\n//! @brief AsmJit is a complete x86/x64 JIT Assembler for C++ language.\n//! \n//! It supports FPU, MMX, 3dNow, SSE, SSE2, SSE3 and SSE4 intrinsics, powerful\n//! compiler that helps to write portable functions for 32-bit (x86) and 64-bit\n//! (x64) architectures. AsmJit can be used to create functions at runtime that\n//! can be called from existing (but also generated) C/C++ code.\n//!\n//! AsmJit is a cross-platform library that supports various compilers and\n//! operating systems. Currently only limitation is x86 (32-bit) or x64 (64-bit)\n//! processor. Currently tested operating systems are Windows (32-bit and 64-bit),\n//! Linux (32-bit and 64-bit) and MacOSX (32-bit and 64-bit).\n//!\n//! @section AsmJit_Main_Introduction Introduction\n//!\n//! AsmJit library contains two main classes for code generation with different\n//! goals. First main code generation class is called @c AsmJit::Assembler and \n//! contains low level API that can be used to generate JIT binary code. It \n//! directly emits binary stream that represents encoded x86/x64 assembler \n//! opcodes. Together with operands and labels it can be used to generate \n//! complete code. For details look to @ref AsmJit_Core and @ref AsmJit_Compiler\n//! sections.\n//!\n//! There is also class named @c AsmJit::Compiler that allows to develop \n//! cross-platform assembler code without worring about function calling\n//! conventions and registers allocation. It can be also used to write 32-bit\n//! and 64-bit portable code. Compiler is recommended class to use for code\n//! generation.\n//!\n//! Everything in AsmJit library is in @c AsmJit namespace.\n//!\n//! @section AsmJit_Main_CodeGeneration Code Generation\n//!\n//! - @ref AsmJit_Core \"Assembler core\" - Operands, intrinsics and low-level assembler.\n//! - @ref AsmJit_Compiler \"Compiler\" - High level code generation.\n//! - @ref AsmJit_CpuInfo \"Cpu Information\" - Get information about host processor.\n//! - @ref AsmJit_Logging \"Logging\" - Logging and error handling.\n//! - @ref AsmJit_MemoryManagement \"Memory Management\" - Virtual memory management.\n//!\n//! @section AsmJit_Main_Configuration Configuration, Definitions and Utilities\n//!\n//! - @ref AsmJit_Config \"Configuration\" - Macros used to configure AsmJit.\n//!\n//! @section AsmJit_Main_HomePage AsmJit Homepage\n//!\n//! - http://code.google.com/p/asmjit/\n//!\n//! @section AsmJit_Main_ResourcesX86 External X86/X64 Assembler Resources\n//! - http://www.agner.org/optimize/\n//! - http://www.mark.masmcode.com/ (Assembler Tips)\n//! - http://avisynth.org/mediawiki/Filter_SDK/Assembler_optimizing (Optimizing)\n//! - http://www.ragestorm.net/distorm/ (Disassembling)\n//!\n//! @section AsmJit_Main_Terminology Terminology\n//!\n//! - <b>Non-volatile (preserved) register</b> - Register that can't be changed\n//!   by callee (callee must save and restore it if it want to use it inside).\n//!\n//! - <b>Volatile (non-preserved) register</b> - The opossite. Register that can\n//!   be freely used by callee. The caller must free all registers before calling\n//!   other function.\n\n\n//! @defgroup AsmJit_Core Assembler core (operands, intrinsics and low-level assembler).\n//!\n//! Contains classes related to @c AsmJit::Assembler that're directly used \n//! to generate machine code stream. It's one of oldest and fastest method \n//! to generate machine code using AsmJit library.\n//!\n//! - See @c AsmJit::Assembler class for low level code generation \n//!   documentation.\n//! - See @c AsmJit::Operand for AsmJit operand's overview.\n//!\n//! @section AsmJit_Core_Registers Registers\n//!\n//! There are static objects that represents X86 and X64 registers. They can \n//! be used directly (like @c eax, @c mm, @c xmm, ...) or created through \n//! these functions:\n//!\n//! - @c AsmJit::mk_gpb() - make general purpose byte register\n//! - @c AsmJit::mk_gpw() - make general purpose word register\n//! - @c AsmJit::mk_gpd() - make general purpose dword register\n//! - @c AsmJit::mk_gpq() - make general purpose qword register\n//! - @c AsmJit::mk_mm() - make mmx register\n//! - @c AsmJit::mk_xmm() - make sse register\n//! - @c AsmJit::st() - make x87 register\n//!\n//! @section AsmJit_Core_Addressing Addressing\n//!\n//! X86 and x64 architectures contains several addressing modes and most ones\n//! are possible with AsmJit library. Memory represents are represented by\n//! @c AsmJit::Mem class. These functions are used to make operands that \n//! represents memory addresses:\n//!\n//! - @c AsmJit::ptr()\n//! - @c AsmJit::byte_ptr()\n//! - @c AsmJit::word_ptr()\n//! - @c AsmJit::dword_ptr()\n//! - @c AsmJit::qword_ptr()\n//! - @c AsmJit::tword_ptr()\n//! - @c AsmJit::dqword_ptr()\n//! - @c AsmJit::mmword_ptr()\n//! - @c AsmJit::xmmword_ptr()\n//! - @c AsmJit::sysint_ptr()\n//!\n//! Most useful function to make pointer should be @c AsmJit::ptr(). It creates\n//! pointer to the target with unspecified size. Unspecified size works in all\n//! intrinsics where are used registers (this means that size is specified by\n//! register operand or by instruction itself). For example @c AsmJit::ptr() \n//! can't be used with @c AsmJit::Assembler::inc() instruction. In this case\n//! size must be specified and it's also reason to make difference between \n//! pointer sizes.\n//!\n//! Supported are simple address forms (register + displacement) and complex\n//! address forms (register + (register << shift) + displacement).\n//!\n//! @section AsmJit_Core_Immediates Immediates\n//!\n//! Immediate values are constants thats passed directly after instruction \n//! opcode. To create such value use @c AsmJit::imm() or @c AsmJit::uimm()\n//! methods to create signed or unsigned immediate value.\n//!\n//! @sa @c AsmJit::Compiler.\n\n\n//! @defgroup AsmJit_Compiler Compiler (high-level code generation).\n//!\n//! Contains classes related to @c AsmJit::Compiler that can be used\n//! to generate code using high-level constructs.\n//!\n//! - See @c Compiler class for high level code generation \n//!   documentation - calling conventions, function declaration\n//!   and variables management.\n\n//! @defgroup AsmJit_Config Configuration.\n//!\n//! Contains macros that can be redefined to fit into any project.\n\n\n//! @defgroup AsmJit_CpuInfo CPU information.\n//!\n//! X86 or x64 cpuid instruction allows to get information about processor \n//! vendor and it's features. It's always used to detect features like MMX, \n//! SSE and other newer ones.\n//!\n//! AsmJit library supports low level cpuid call implemented internally as \n//! C++ function using inline assembler or intrinsics and also higher level \n//! CPU features detection. The low level function (also used by higher level \n//! one) is @c AsmJit::cpuid().\n//!\n//! AsmJit library also contains higher level function @c AsmJit::getCpuInfo()\n//! that returns features detected by the library. The detection process is\n//! done only once and it's cached for all next calls. @c AsmJit::CpuInfo \n//! structure not contains only information through @c AsmJit::cpuid(), but\n//! there is also small multiplatform code to detect number of processors \n//! (or cores) through operating system API.\n//!\n//! It's recommended to use @c AsmJit::cpuInfo to detect and check for\n//! host processor features.\n//!\n//! Example how to use AsmJit::cpuid():\n//!\n//! @code\n//! // All functions and structures are in AsmJit namesapce.\n//! using namespace AsmJit;\n//!\n//! // Here will be retrieved result of cpuid call.\n//! CpuId out;\n//!\n//! // Use cpuid function to do the job.\n//! cpuid(0 /* eax */, &out /* eax, ebx, ecx, edx */);\n//!\n//! // Id eax argument to cpuid is 0, ebx, ecx and edx registers \n//! // are filled with cpu vendor.\n//! char vendor[13];\n//! memcpy(i->vendor, &out.ebx, 4);\n//! memcpy(i->vendor + 4, &out.edx, 4);\n//! memcpy(i->vendor + 8, &out.ecx, 4);\n//! vendor[12] = '\\0';\n//! \n//! // Print vendor\n//! puts(vendor);\n//! @endcode\n//!\n//! If you want to use AsmJit::cpuid() function instead of higher level \n//! @c AsmJit::getCpuInfo(), please read processor manuals provided by Intel,\n//! AMD or other manufacturers for cpuid instruction details.\n//!\n//! Example of using @c AsmJit::getCpuInfo():\n//!\n//! @code\n//! // All functions and structures are in AsmJit namesapce.\n//! using namespace AsmJit;\n//!\n//! // Call to cpuInfo return CpuInfo structure that shouldn't be modified.\n//! // Make it const by default.\n//! const CpuInfo *i = getCpuInfo();\n//!\n//! // Now you are able to get specific features.\n//!\n//! // Processor has SSE2\n//! if (i->features & kX86FeatureSse2)\n//! {\n//!   // your code...\n//! }\n//! // Processor has MMX\n//! else if (i->features & kX86Feature_MMX)\n//! {\n//!   // your code...\n//! }\n//! // Processor is old, no SSE2 or MMX support.\n//! else\n//! {\n//!   // your code...\n//! }\n//! @endcode\n//!\n//! Better example is in AsmJit/Test/testcpu.cpp file.\n//!\n//! @sa AsmJit::cpuid, @c AsmJit::cpuInfo.\n\n\n//! @defgroup AsmJit_Logging Logging and error handling.\n//!\n//! Contains classes related to loging assembler output. Currently logging\n//! is implemented in @c AsmJit::Logger class.You can override\n//! @c AsmJit::Logger::log() to log messages into your stream. There is also\n//! @c FILE based logger implemented in @c AsmJit::FileLogger class.\n//!\n//! To log your assembler output to FILE stream use this code:\n//!\n//! @code\n//! // Create assembler\n//! Assembler a;\n//!\n//! // Create and set file based logger\n//! FileLogger logger(stderr);\n//! a.setLogger(&logger);\n//! @endcode\n//!\n//! You can see that logging goes through @c Assembler. If you are using \n//! @c Compiler and you want to log messages in correct assembler order,\n//! you should look at @ref Compiler::comment() method. It allows  you to \n//! insert text message into items stream so the @c Compiler is able to\n//! send messages to @ref Assembler in correct order.\n//!\n//! @sa @c AsmJit::Logger, @c AsmJit::FileLogger.\n\n\n//! @defgroup AsmJit_MemoryManagement Virtual memory management.\n//!\n//! Using @c AsmJit::Assembler or @c AsmJit::Compiler to generate machine \n//! code is not final step. Each generated code needs to run in memory \n//! that is not protected against code execution. To alloc this code it's\n//! needed to use operating system functions provided to enable execution\n//! code in specified memory block or to allocate memory that is not\n//! protected. The solution is always to use @c See AsmJit::Assembler::make() \n//! and @c AsmJit::Compiler::make() functions that can allocate memory and\n//! relocate code for you. But AsmJit also contains classes for manual memory\n//! management thats internally used by AsmJit but can be used by programmers\n//! too.\n//!\n//! Memory management contains low level and high level classes related to\n//! allocating and freeing virtual memory. Low level class is \n//! @c AsmJit::VirtualMemory that can allocate and free full pages of\n//! virtual memory provided by operating system. Higher level class is\n//! @c AsmJit::MemoryManager that is able to manage complete allocation and\n//! free mechanism. It internally uses larger chunks of memory to make\n//! allocation fast and effective.\n//!\n//! Using @c AsmJit::VirtualMemory::alloc() is cross-platform way how to \n//! allocate this kind of memory without worrying about operating system \n//! and it's API. Each memory block that is no longer needed should be \n//! freed by @c AsmJit::VirtualMemory::free() method. If you want better\n//! comfort and malloc()/free() interface, look at the \n//! @c AsmJit::MemoryManager class.\n//!\n//! @sa @c AsmJit::VirtualMemory, @ AsmJit::MemoryManager.\n\n\n//! @addtogroup AsmJit_Config\n//! @{\n\n//! @def ASMJIT_WINDOWS\n//! @brief Macro that is declared if AsmJit is compiled for Windows.\n\n//! @def ASMJIT_POSIX\n//! @brief Macro that is declared if AsmJit is compiled for unix like \n//! operating system.\n\n//! @def ASMJIT_API\n//! @brief Attribute that's added to classes that can be exported if AsmJit\n//! is compiled as a dll library.\n\n//! @def ASMJIT_MALLOC\n//! @brief Function to call to allocate dynamic memory.\n\n//! @def ASMJIT_REALLOC\n//! @brief Function to call to reallocate dynamic memory.\n\n//! @def ASMJIT_FREE\n//! @brief Function to call to free dynamic memory.\n\n//! @def ASMJIT_ASSERT\n//! @brief Assertion macro. Default implementation calls \n//! @c AsmJit::assertionFailure() function.\n\n//! @}\n\n\n//! @namespace AsmJit\n//! @brief Main AsmJit library namespace.\n//!\n//! There are not other namespaces used in AsmJit library.\n\n// ----------------------------------------------------------------------------\n// [Dependencies - Core]\n// ----------------------------------------------------------------------------\n\n#include \"core.h\"\n\n// ----------------------------------------------------------------------------\n// [Dependencies - X86 / X64]\n// ----------------------------------------------------------------------------\n\n#if defined(ASMJIT_X86) || defined(ASMJIT_X64)\n#include \"x86.h\"\n#endif // ASMJIT_X86 || ASMJIT_X64\n\n// [Guard]\n#endif // _ASMJIT_ASMJIT_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/COPYING.txt",
    "content": "Copyright (c) 2008-2012, Petr Kobalicek <kobalicek.petr@gmail.com>\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/Config.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CONFIG_H\n#define _ASMJIT_CONFIG_H\n\n// This file is designed to be modifyable. Platform specific changes should\n// be applied to this file so it's guaranteed that never versions of AsmJit\n// library will never overwrite generated config files.\n//\n// So modify this file by your build system or by hand.\n\n// ============================================================================\n// [AsmJit - OS]\n// ============================================================================\n\n// Provides definitions about your operating system. It's detected by default,\n// so override it if you have problems with automatic detection.\n//\n// #define ASMJIT_WINDOWS\n// #define ASMJIT_POSIX\n\n// ============================================================================\n// [AsmJit - Architecture]\n// ============================================================================\n\n// Provides definitions about your cpu architecture. It's detected by default,\n// so override it if you have problems with automatic detection.\n\n// #define ASMJIT_X86\n// #define ASMJIT_X64\n\n// ============================================================================\n// [AsmJit - API]\n// ============================================================================\n\n// If you are embedding AsmJit library into your project (statically), undef\n// ASMJIT_API macro.\n#define ASMJIT_API\n\n// ============================================================================\n// [AsmJit - Memory Management]\n// ============================================================================\n\n// #define ASMJIT_MALLOC ::malloc\n// #define ASMJIT_REALLOC ::realloc\n// #define ASMJIT_FREE ::free\n\n// ============================================================================\n// [AsmJit - Debug]\n// ============================================================================\n\n// Turn debug on/off (to bypass autodetection)\n// #define ASMJIT_DEBUG\n// #define ASMJIT_NO_DEBUG\n\n// Setup custom assertion code.\n// #define ASMJIT_ASSERT(exp) do { if (!(exp)) ::AsmJit::assertionFailure(__FILE__, __LINE__, #exp); } while(0)\n\n// [Guard]\n#endif // _ASMJIT_CONFIG_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/apibegin.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [MSVC]\n#if defined(_MSC_VER)\n\n// Disable some warnings we know about\n#pragma warning(push)\n#pragma warning(disable: 4127) // conditional expression is constant\n#pragma warning(disable: 4251) // struct needs to have dll-interface to be used\n                               // by clients of struct ...\n#pragma warning(disable: 4275) // non dll-interface struct ... used as base for\n                               // dll-interface struct\n#pragma warning(disable: 4355) // this used in base member initializer list\n#pragma warning(disable: 4800) // forcing value to bool 'true' or 'false'\n\n// Rename symbols.\n#define vsnprintf _vsnprintf\n#define snprintf _snprintf\n\n#endif // _MSC_VER\n\n// [GNUC]\n#if defined(__GNUC__)\n// GCC warnings fix: I can't understand why GCC has no interface to push/pop\n// specific warnings.\n// # if (__GNUC__ * 10000  + __GNUC_MINOR__ * 100  + __GNUC_PATCHLEVEL__) >= 402001\n// #  pragma GCC diagnostic ignored \"-w\"\n// # endif\n#endif // __GNUC__\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/apiend.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [MSVC]\n#if defined(_MSC_VER)\n\n// Pop disabled warnings by ApiBegin.h\n#pragma warning(pop)\n\n// Rename symbols back.\n#undef vsnprintf\n#undef snprintf\n\n#endif // _MSC_VER\n\n// [GNUC]\n#if defined(__GNUC__)\n#endif // __GNUC__\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/assembler.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assembler.h\"\n#include \"../core/memorymanager.h\"\n#include \"../core/intutil.h\"\n\n// [Dependenceis - C]\n#include <stdarg.h>\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Assembler - Construction / Destruction]\n// ============================================================================\n\nAssembler::Assembler(Context* context) :\n  _zoneMemory(16384 - sizeof(ZoneChunk) - 32),\n  _buffer(),\n  _context(context != NULL \n    ? context\n    : static_cast<Context*>(JitContext::getGlobal())),\n  _logger(NULL),\n  _error(kErrorOk),\n  _properties(0),\n  _emitOptions(0),\n  _trampolineSize(0),\n  _inlineComment(NULL),\n  _unusedLinks(NULL)\n{\n}\n\nAssembler::~Assembler()\n{\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Logging]\n// ============================================================================\n\nvoid Assembler::setLogger(Logger* logger)\n{\n  _logger = logger;\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Error Handling]\n// ============================================================================\n\nvoid Assembler::setError(uint32_t error)\n{\n  _error = error;\n  if (_error == kErrorOk)\n    return;\n\n  if (_logger)\n    _logger->logFormat(\"*** ASSEMBLER ERROR: %s (%u).\\n\", getErrorString(error), (unsigned int)error);\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Properties]\n// ============================================================================\n\nuint32_t Assembler::getProperty(uint32_t propertyId) const\n{\n  if (propertyId > 31)\n    return 0;\n\n  return (_properties & (IntUtil::maskFromIndex(propertyId))) != 0;\n}\n\nvoid Assembler::setProperty(uint32_t propertyId, uint32_t value)\n{\n  if (propertyId > 31)\n    return;\n\n  if (value)\n    _properties |= IntUtil::maskFromIndex(propertyId);\n  else\n    _properties &= ~IntUtil::maskFromIndex(propertyId);\n}\n\n// ============================================================================\n// [AsmJit::Assembler - TakeCode]\n// ============================================================================\n\nuint8_t* Assembler::takeCode()\n{\n  uint8_t* code = _buffer.take();\n  _relocData.clear();\n  _zoneMemory.clear();\n\n  if (_error != kErrorOk)\n    setError(kErrorOk);\n\n  return code;\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Clear / Reset]\n// ============================================================================\n\nvoid Assembler::clear()\n{\n  _purge();\n\n  if (_error != kErrorOk)\n    setError(kErrorOk);\n}\n\nvoid Assembler::reset()\n{\n  _purge();\n\n  _zoneMemory.reset();\n  _buffer.reset();\n\n  _labels.reset();\n  _relocData.reset();\n\n  if (_error != kErrorOk)\n    setError(kErrorOk);\n}\n\nvoid Assembler::_purge()\n{\n  _zoneMemory.clear();\n  _buffer.clear();\n \n  _emitOptions = 0;\n  _trampolineSize = 0;\n\n  _inlineComment = NULL;\n  _unusedLinks = NULL;\n  \n  _labels.clear();\n  _relocData.clear();\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Emit]\n// ============================================================================\n\nvoid Assembler::embed(const void* data, size_t len)\n{\n  if (!canEmit())\n    return;\n\n  if (_logger)\n  {\n    size_t i, j;\n    size_t max;\n\n    char buf[128];\n    char dot[] = \".data \";\n    char* p;\n\n    memcpy(buf, dot, ASMJIT_ARRAY_SIZE(dot) - 1);\n\n    for (i = 0; i < len; i += 16)\n    {\n      max = (len - i < 16) ? len - i : 16;\n      p = buf + ASMJIT_ARRAY_SIZE(dot) - 1;\n\n      for (j = 0; j < max; j++)\n        p += sprintf(p, \"%02X\", reinterpret_cast<const uint8_t *>(data)[i+j]);\n\n      *p++ = '\\n';\n      *p = '\\0';\n\n      _logger->logString(buf);\n    }\n  }\n\n  _buffer.emitData(data, len);\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Helpers]\n// ============================================================================\n\nAssembler::LabelLink* Assembler::_newLabelLink()\n{\n  LabelLink* link = _unusedLinks;\n\n  if (link)\n  {\n    _unusedLinks = link->prev;\n  }\n  else\n  {\n    link = (LabelLink*)_zoneMemory.alloc(sizeof(LabelLink));\n    if (link == NULL) return NULL;\n  }\n\n  // clean link\n  link->prev = NULL;\n  link->offset = 0;\n  link->displacement = 0;\n  link->relocId = -1;\n\n  return link;\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/assembler.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_ASSEMBLER_H\n#define _ASMJIT_CORE_ASSEMBLER_H\n\n// [Dependencies - AsmJit]\n#include \"../core/buffer.h\"\n#include \"../core/context.h\"\n#include \"../core/defs.h\"\n#include \"../core/logger.h\"\n#include \"../core/podvector.h\"\n#include \"../core/zonememory.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::Assembler]\n// ============================================================================\n\n//! @brief Base class for @ref Assembler.\n//!\n//! This class implements core setialization API only. The platform specific\n//! methods and intrinsics is implemented by derived classes.\n//!\n//! @sa @c Assembler.\nstruct Assembler\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Creates Assembler instance.\n  ASMJIT_API Assembler(Context* context);\n  //! @brief Destroys Assembler instance\n  ASMJIT_API virtual ~Assembler();\n\n  // --------------------------------------------------------------------------\n  // [LabelLink]\n  // --------------------------------------------------------------------------\n\n  //! @brief Data structure used to link linked-labels.\n  struct LabelLink\n  {\n    //! @brief Previous link.\n    LabelLink* prev;\n    //! @brief Offset.\n    sysint_t offset;\n    //! @brief Inlined displacement.\n    sysint_t displacement;\n    //! @brief RelocId if link must be absolute when relocated.\n    sysint_t relocId;\n  };\n\n  // --------------------------------------------------------------------------\n  // [LabelData]\n  // --------------------------------------------------------------------------\n\n  //! @brief Label data.\n  struct LabelData\n  {\n    //! @brief Label offset.\n    sysint_t offset;\n    //! @brief Label links chain.\n    LabelLink* links;\n  };\n\n  // --------------------------------------------------------------------------\n  // [RelocData]\n  // --------------------------------------------------------------------------\n\n  // X86 architecture uses 32-bit absolute addressing model by memory operands,\n  // but 64-bit mode uses relative addressing model (RIP + displacement). In\n  // code we are always using relative addressing model for referencing labels\n  // and embedded data. In 32-bit mode we must patch all references to absolute\n  // address before we can call generated function. We are patching only memory\n  // operands.\n\n  //! @brief Code relocation data (relative vs absolute addresses).\n  struct RelocData\n  {\n    //! @brief Type of relocation.\n    uint32_t type;\n    //! @brief Size of relocation (4 or 8 bytes).\n    uint32_t size;\n    //! @brief Offset from code begin address.\n    sysint_t offset;\n\n    //! @brief Relative displacement or absolute address.\n    union\n    {\n      //! @brief Relative displacement from code begin address (not to @c offset).\n      sysint_t destination;\n      //! @brief Absolute address where to jump;\n      void* address;\n    };\n  };\n\n  // --------------------------------------------------------------------------\n  // [Context]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get code generator.\n  inline Context* getContext() const\n  { return _context; }\n\n  // --------------------------------------------------------------------------\n  // [Memory Management]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get zone memory manager.\n  inline ZoneMemory* getZoneMemory() const\n  { return const_cast<ZoneMemory*>(&_zoneMemory); }\n\n  // --------------------------------------------------------------------------\n  // [Logging]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get logger.\n  inline Logger* getLogger() const\n  { return _logger; }\n\n  //! @brief Set logger to @a logger.\n  ASMJIT_API virtual void setLogger(Logger* logger);\n\n  // --------------------------------------------------------------------------\n  // [Error Handling]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get error code.\n  inline uint32_t getError() const\n  { return _error; }\n\n  //! @brief Set error code.\n  //!\n  //! This method is virtual, because higher classes can use it to catch all\n  //! errors.\n  ASMJIT_API virtual void setError(uint32_t error);\n\n  // --------------------------------------------------------------------------\n  // [Properties]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get assembler property.\n  ASMJIT_API virtual uint32_t getProperty(uint32_t propertyId) const;\n\n  //! @brief Set assembler property.\n  ASMJIT_API virtual void setProperty(uint32_t propertyId, uint32_t value);\n\n  // --------------------------------------------------------------------------\n  // [Capacity]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get capacity of internal code buffer.\n  inline size_t getCapacity() const\n  { return _buffer.getCapacity(); }\n\n  // --------------------------------------------------------------------------\n  // [Offset]\n  // --------------------------------------------------------------------------\n\n  //! @brief Return current offset in buffer.\n  inline size_t getOffset() const\n  { return _buffer.getOffset(); }\n\n  //! @brief Set offset to @a o and returns previous offset.\n  //!\n  //! This method can be used to truncate code (previous offset is not\n  //! recorded) or to overwrite instruction stream at position @a o.\n  //!\n  //! @return Previous offset value that can be uset to set offset back later.\n  inline size_t toOffset(size_t o)\n  { return _buffer.toOffset(o); }\n\n  // --------------------------------------------------------------------------\n  // [GetCode / GetCodeSize]\n  // --------------------------------------------------------------------------\n\n  //! @brief Return start of assembler code buffer.\n  //!\n  //! Note that buffer address can change if you emit instruction or something\n  //! else. Use this pointer only when you finished or make sure you do not\n  //! use returned pointer after emitting.\n  inline uint8_t* getCode() const\n  { return _buffer.getData(); }\n\n  //! @brief Return current offset in buffer (same as <code>getOffset() + getTramplineSize()</code>).\n  inline size_t getCodeSize() const\n  { return _buffer.getOffset() + getTrampolineSize(); }\n\n  // --------------------------------------------------------------------------\n  // [TakeCode]\n  // --------------------------------------------------------------------------\n\n  //! @brief Take internal code buffer and NULL all pointers (you take the ownership).\n  ASMJIT_API uint8_t* takeCode();\n\n  // --------------------------------------------------------------------------\n  // [Clear / Reset]\n  // --------------------------------------------------------------------------\n\n  //! @brief Clear everything, but not deallocate buffers.\n  ASMJIT_API void clear();\n\n  //! @brief Reset everything (means also to free all buffers).\n  ASMJIT_API void reset();\n\n  //! @brief Called by clear() and reset() to clear all data related to derived\n  //! class implementation.\n  ASMJIT_API virtual void _purge();\n\n  // --------------------------------------------------------------------------\n  // [EnsureSpace]\n  // --------------------------------------------------------------------------\n\n  //! @brief Ensure space for next instruction.\n  //!\n  //! Note that this method can return false. It's rare and probably you never\n  //! get this, but in some situations it's still possible.\n  inline bool ensureSpace()\n  { return _buffer.ensureSpace(); }\n\n  // --------------------------------------------------------------------------\n  // [GetTrampolineSize]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get size of all possible trampolines needed to successfuly generate\n  //! relative jumps to absolute addresses. This value is only non-zero if jmp\n  //! of call instructions were used with immediate operand (this means jump or\n  //! call absolute address directly).\n  //!\n  //! Currently only _emitJmpOrCallReloc() method can increase trampoline size\n  //! value.\n  inline size_t getTrampolineSize() const\n  { return _trampolineSize; }\n\n  // --------------------------------------------------------------------------\n  // [Buffer - Getters]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get byte at position @a pos.\n  inline uint8_t getByteAt(size_t pos) const\n  { return _buffer.getByteAt(pos); }\n  \n  //! @brief Get word at position @a pos.\n  inline uint16_t getWordAt(size_t pos) const\n  { return _buffer.getWordAt(pos); }\n  \n  //! @brief Get dword at position @a pos.\n  inline uint32_t getDWordAt(size_t pos) const\n  { return _buffer.getDWordAt(pos); }\n  \n  //! @brief Get qword at position @a pos.\n  inline uint64_t getQWordAt(size_t pos) const\n  { return _buffer.getQWordAt(pos); }\n\n  //! @brief Get int32_t at position @a pos.\n  inline int32_t getInt32At(size_t pos) const\n  { return (int32_t)_buffer.getDWordAt(pos); }\n\n  //! @brief Get int64_t at position @a pos.\n  inline int64_t getInt64At(size_t pos) const\n  { return (int64_t)_buffer.getQWordAt(pos); }\n\n  //! @brief Get intptr_t at position @a pos.\n  inline intptr_t getIntPtrTAt(size_t pos) const\n  { return _buffer.getIntPtrTAt(pos); }\n\n  //! @brief Get uintptr_t at position @a pos.\n  inline uintptr_t getUIntPtrTAt(size_t pos) const\n  { return _buffer.getUIntPtrTAt(pos); }\n\n  //! @brief Get uintptr_t at position @a pos.\n  inline size_t getSizeTAt(size_t pos) const\n  { return _buffer.getSizeTAt(pos); }\n\n  // --------------------------------------------------------------------------\n  // [Buffer - Setters]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set byte at position @a pos.\n  inline void setByteAt(size_t pos, uint8_t x)\n  { _buffer.setByteAt(pos, x); }\n  \n  //! @brief Set word at position @a pos.\n  inline void setWordAt(size_t pos, uint16_t x)\n  { _buffer.setWordAt(pos, x); }\n  \n  //! @brief Set dword at position @a pos.\n  inline void setDWordAt(size_t pos, uint32_t x)\n  { _buffer.setDWordAt(pos, x); }\n  \n  //! @brief Set qword at position @a pos.\n  inline void setQWordAt(size_t pos, uint64_t x)\n  { _buffer.setQWordAt(pos, x); }\n  \n  //! @brief Set int32_t at position @a pos.\n  inline void setInt32At(size_t pos, int32_t x)\n  { _buffer.setDWordAt(pos, (uint32_t)x); }\n\n  //! @brief Set int64_t at position @a pos.\n  inline void setInt64At(size_t pos, int64_t x)\n  { _buffer.setQWordAt(pos, (uint64_t)x); }\n\n  //! @brief Set intptr_t at position @a pos.\n  inline void setIntPtrTAt(size_t pos, intptr_t x)\n  { _buffer.setIntPtrTAt(pos, x); }\n\n  //! @brief Set uintptr_t at position @a pos.\n  inline void setUInt64At(size_t pos, uintptr_t x)\n  { _buffer.setUIntPtrTAt(pos, x); }\n\n  //! @brief Set size_t at position @a pos.\n  inline void setSizeTAt(size_t pos, size_t x)\n  { _buffer.setSizeTAt(pos, x); }\n\n  // --------------------------------------------------------------------------\n  // [CanEmit]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether the instruction can be emitted.\n  //!\n  //! This function behaves like @c ensureSpace(), but it also checks if\n  //! assembler is in error state and in that case it returns @c false.\n  //! Assembler internally always uses this function before new instruction is\n  //! emitted.\n  //!\n  //! It's implemented like:\n  //!   <code>return ensureSpace() && !getError();</code>\n  inline bool canEmit()\n  {\n    // If there is an error, we can't emit another instruction until last error\n    // is cleared by calling @c setError(kErrorOk). If something caused the\n    // error while generating code it's probably fatal in all cases. You can't\n    // use generated code anymore, because you are not sure about the status.\n    if (_error)\n      return false;\n\n    // The ensureSpace() method returns true on success and false on failure. We\n    // are catching return value and setting error code here.\n    if (ensureSpace())\n      return true;\n\n    // If we are here, there is memory allocation error. Note that this is HEAP\n    // allocation error, virtual allocation error can be caused only by\n    // AsmJit::VirtualMemory class!\n    setError(kErrorNoHeapMemory);\n    return false;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Emit]\n  //\n  // These functions are not protected against buffer overrun. Each place of\n  // code which calls these functions ensures that there is some space using\n  // canEmit() method. Emitters are internally protected in AsmJit::Buffer,\n  // but only in debug builds.\n  // --------------------------------------------------------------------------\n\n  //! @brief Emit Byte to internal buffer.\n  inline void _emitByte(uint8_t x)\n  { _buffer.emitByte(x); }\n\n  //! @brief Emit word (2 bytes) to internal buffer.\n  inline void _emitWord(uint16_t x)\n  { _buffer.emitWord(x); }\n\n  //! @brief Emit dword (4 bytes) to internal buffer.\n  inline void _emitDWord(uint32_t x)\n  { _buffer.emitDWord(x); }\n\n  //! @brief Emit qword (8 bytes) to internal buffer.\n  inline void _emitQWord(uint64_t x)\n  { _buffer.emitQWord(x); }\n\n  //! @brief Emit Int32 (4 bytes) to internal buffer.\n  inline void _emitInt32(int32_t x)\n  { _buffer.emitDWord((uint32_t)x); }\n\n  //! @brief Emit Int64 (8 bytes) to internal buffer.\n  inline void _emitInt64(int64_t x)\n  { _buffer.emitQWord((uint64_t)x); }\n\n  //! @brief Emit intptr_t (4 or 8 bytes) to internal buffer.\n  inline void _emitIntPtrT(intptr_t x)\n  { _buffer.emitIntPtrT(x); }\n\n  //! @brief Emit uintptr_t (4 or 8 bytes) to internal buffer.\n  inline void _emitUIntPtrT(uintptr_t x)\n  { _buffer.emitUIntPtrT(x); }\n\n  //! @brief Emit size_t (4 or 8 bytes) to internal buffer.\n  inline void _emitSizeT(size_t x)\n  { _buffer.emitSizeT(x); }\n\n  //! @brief Embed data into instruction stream.\n  ASMJIT_API void embed(const void* data, size_t len);\n\n  // --------------------------------------------------------------------------\n  // [Reloc]\n  // --------------------------------------------------------------------------\n\n  //! @brief Relocate code to a given address @a dst.\n  //!\n  //! @param dst Where the relocated code should me stored. The pointer can be\n  //! address returned by virtual memory allocator or your own address if you\n  //! want only to store the code for later reuse (or load, etc...).\n  //! @param addressBase Base address used for relocation. When using JIT code\n  //! generation, this will be the same as @a dst, only casted to system\n  //! integer type. But when generating code for remote process then the value\n  //! can be different.\n  //!\n  //! @retval The bytes used. Code-generator can create trampolines which are\n  //! used when calling other functions inside the JIT code. However, these\n  //! trampolines can be unused so the relocCode() returns the exact size needed\n  //! for the function.\n  //!\n  //! A given buffer will be overwritten, to get number of bytes required use\n  //! @c getCodeSize().\n  virtual size_t relocCode(void* dst, sysuint_t addressBase) const = 0;\n\n  //! @brief Simplifed version of @c relocCode() method designed for JIT.\n  //!\n  //! @overload\n  inline size_t relocCode(void* dst) const\n  { return relocCode(dst, (uintptr_t)dst); }\n\n  // --------------------------------------------------------------------------\n  // [Make]\n  // --------------------------------------------------------------------------\n\n  //! @brief Make is convenience method to make currently serialized code and\n  //! return pointer to generated function.\n  //!\n  //! What you need is only to cast this pointer to your function type and call\n  //! it. Note that if there was an error and calling @c getError() method not\n  //! returns @c kErrorOk (zero) then this function always return @c NULL and\n  //! error value remains the same.\n  virtual void* make() = 0;\n\n  // --------------------------------------------------------------------------\n  // [Helpers]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API LabelLink* _newLabelLink();\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief ZoneMemory management.\n  ZoneMemory _zoneMemory;\n  //! @brief Binary code buffer.\n  Buffer _buffer;\n\n  //! @brief Context (for example @ref JitContext).\n  Context* _context;\n  //! @brief Logger.\n  Logger* _logger;\n\n  //! @brief Error code.\n  uint32_t _error;\n  //! @brief Properties.\n  uint32_t _properties;\n  //! @brief Emit flags for next instruction (cleared after emit).\n  uint32_t _emitOptions;\n  //! @brief Size of possible trampolines.\n  uint32_t _trampolineSize;\n\n  //! @brief Inline comment that will be logged by the next instruction and\n  //! set to NULL.\n  const char* _inlineComment;\n  //! @brief Linked list of unused links (@c LabelLink* structures)\n  LabelLink* _unusedLinks;\n\n  //! @brief Labels data.\n  PodVector<LabelData> _labels;\n  //! @brief Relocations data.\n  PodVector<RelocData> _relocData;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_ASSEMBLER_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/assert.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\n// helpers\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Assert]\n// ============================================================================\n\nvoid assertionFailure(const char* file, int line, const char* exp)\n{\n  fprintf(stderr,\n    \"*** ASSERTION FAILURE at %s (line %d)\\n\"\n    \"*** %s\\n\", file, line, exp);\n\n  exit(1);\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/assert.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_ASSERT_H\n#define _ASMJIT_CORE_ASSERT_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::Assert]\n// ============================================================================\n\n//! @brief Called in debug build on assertion failure.\n//! @param file Source file name where it happened.\n//! @param line Line in the source file.\n//! @param exp Expression what failed.\n//!\n//! If you have problems with assertions simply put a breakpoint into\n//! AsmJit::assertionFailure() method (AsmJit/Core/Assert.cpp file) and examine\n//! call stack.\nASMJIT_API void assertionFailure(const char* file, int line, const char* exp);\n\n// ============================================================================\n// [ASMJIT_ASSERT]\n// ============================================================================\n\n#if defined(ASMJIT_DEBUG)\n\n#if !defined(ASMJIT_ASSERT)\n#define ASMJIT_ASSERT(exp) \\\n  do { \\\n    if (!(exp)) ::AsmJit::assertionFailure(__FILE__, __LINE__, #exp); \\\n  } while(0)\n#endif\n\n#else\n\n#if !defined(ASMJIT_ASSERT)\n#define ASMJIT_ASSERT(exp) ASMJIT_NOP()\n#endif\n\n#endif // DEBUG\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_ASSERT_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/buffer.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/buffer.h\"\n#include \"../core/defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Buffer]\n// ============================================================================\n\nvoid Buffer::emitData(const void* ptr, size_t len)\n{\n  size_t max = getCapacity() - getOffset();\n\n  if (max < len && !realloc(getOffset() + len))\n  {\n    return;\n  }\n\n  memcpy(_cur, ptr, len);\n  _cur += len;\n}\n\nbool Buffer::realloc(size_t to)\n{\n  if (getCapacity() < to)\n  {\n    size_t len = getOffset();\n    uint8_t *newdata;\n\n    if (_data != NULL)\n      newdata = (uint8_t*)ASMJIT_REALLOC(_data, to);\n    else\n      newdata = (uint8_t*)ASMJIT_MALLOC(to);\n\n    if (newdata == NULL)\n      return false;\n\n    _data = newdata;\n    _cur = newdata + len;\n    _max = newdata + to;\n    _max -= (to >= kBufferGrow) ? kBufferGrow : to;\n\n    _capacity = to;\n  }\n\n  return true;\n}\n\nbool Buffer::grow()\n{\n  size_t to = _capacity;\n\n  if (to < 512)\n    to = 1024;\n  else if (to > 65536)\n    to += 65536;\n  else\n    to <<= 1;\n\n  return realloc(to);\n}\n\nvoid Buffer::reset()\n{\n  if (_data == NULL)\n    return;\n  ASMJIT_FREE(_data);\n\n  _data = NULL;\n  _cur = NULL;\n  _max = NULL;\n  _capacity = 0;\n}\n\nuint8_t* Buffer::take()\n{\n  uint8_t* data = _data;\n\n  _data = NULL;\n  _cur = NULL;\n  _max = NULL;\n  _capacity = 0;\n\n  return data;\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/buffer.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_BUFFER_H\n#define _ASMJIT_CORE_BUFFER_H\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/build.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [Forward Declarations]\n// ============================================================================\n\nstruct Buffer;\n\n// ============================================================================\n// [AsmJit::Buffer]\n// ============================================================================\n\n//! @brief Buffer used to store instruction stream in AsmJit.\n//! \n//! This class can be dangerous, if you don't know how it works. Assembler\n//! instruction stream is usually constructed by multiple calls of emit\n//! functions that emits bytes, words, dwords or qwords. But to decrease\n//! AsmJit library size and improve performance, we are not checking for\n//! buffer overflow for each emit operation, but only once in highler level\n//! emit instruction.\n//!\n//! So, if you want to use this class, you need to do buffer checking yourself\n//! by using @c ensureSpace() method. It's designed to grow buffer if needed.\n//! Threshold for growing is named @c growThreshold() and it means count of\n//! bytes for emitting single operation. Default size is set to 16 bytes,\n//! because x86 and x64 instruction can't be larger (so it's space to hold 1\n//! instruction).\n//!\n//! Example using Buffer:\n//!\n//! @code\n//! // Buffer instance, growThreshold == 16\n//! // (no memory allocated in constructor).\n//! AsmJit::Buffer buf(16);\n//!\n//! // Begin of emit stream, ensure space can fail on out of memory error.\n//! if (buf.ensureSpace()) \n//! {\n//!   // here, you can emit up to 16 (growThreshold) bytes\n//!   buf.emitByte(0x00);\n//!   buf.emitByte(0x01);\n//!   buf.emitByte(0x02);\n//!   buf.emitByte(0x03);\n//!   ...\n//! }\n//! @endcode\nstruct Buffer\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline Buffer() :\n    _data(NULL),\n    _cur(NULL),\n    _max(NULL),\n    _capacity(0)\n  {\n  }\n\n  inline ~Buffer()\n  {\n    if (_data) ASMJIT_FREE(_data);\n  }\n\n  //! @brief Get start of buffer.\n  inline uint8_t* getData() const { return _data; }\n\n  //! @brief Get current pointer in code buffer.\n  inline uint8_t* getCur() const { return _cur; }\n\n  //! @brief Get maximum pointer in code buffer for growing.\n  inline uint8_t* getMax() const { return _max; }\n\n  //! @brief Get current offset in buffer.\n  inline size_t getOffset() const { return (size_t)(_cur - _data); }\n\n  //! @brief Get capacity of buffer.\n  inline size_t getCapacity() const { return _capacity; }\n\n  //! @brief Ensure space for next instruction\n  inline bool ensureSpace() { return (_cur >= _max) ? grow() : true; }\n\n  //! @brief Sets offset to @a o and returns previous offset.\n  //!\n  //! This method can be used to truncate buffer or it's used to\n  //! overwrite specific position in buffer by Assembler.\n  inline size_t toOffset(size_t offset)\n  {\n    ASMJIT_ASSERT(offset < _capacity);\n\n    size_t prev = (size_t)(_cur - _data);\n    _cur = _data + offset;\n    return prev;\n  }\n\n  //! @brief Reallocate buffer.\n  //!\n  //! It's only used for growing, buffer is never reallocated to smaller \n  //! number than current capacity() is.\n  ASMJIT_API bool realloc(size_t to);\n\n  //! @brief Used to grow the buffer.\n  //!\n  //! It will typically realloc to twice size of capacity(), but if capacity()\n  //! is large, it will use smaller steps.\n  ASMJIT_API bool grow();\n\n  //! @brief Clear everything, but not deallocate buffer.\n  inline void clear() { _cur = _data; }\n\n  //! @brief Free buffer and NULL all pointers.\n  ASMJIT_API void reset();\n\n  //! @brief Take ownership of the buffer data and purge @c Buffer instance.\n  ASMJIT_API uint8_t* take();\n\n  // --------------------------------------------------------------------------\n  // [Emit]\n  // --------------------------------------------------------------------------\n\n  //! @brief Emit Byte.\n  inline void emitByte(uint8_t x)\n  {\n    ASMJIT_ASSERT(getOffset() + 1 <= _capacity);\n\n    *_cur++ = x;\n  }\n\n  //! @brief Emit Word (2 bytes).\n  inline void emitWord(uint16_t x)\n  {\n    ASMJIT_ASSERT(getOffset() + 2 <= _capacity);\n\n    *(uint16_t *)_cur = x;\n    _cur += 2;\n  }\n\n  //! @brief Emit DWord (4 bytes).\n  inline void emitDWord(uint32_t x)\n  {\n    ASMJIT_ASSERT(getOffset() + 4 <= _capacity);\n\n    *(uint32_t *)_cur = x;\n    _cur += 4;\n  }\n\n  //! @brief Emit QWord (8 bytes).\n  inline void emitQWord(uint64_t x)\n  {\n    ASMJIT_ASSERT(getOffset() + 8 <= _capacity);\n\n    *(uint64_t *)_cur = x;\n    _cur += 8;\n  }\n\n  //! @brief Emit intptr_t (4 or 8 bytes).\n  inline void emitIntPtrT(intptr_t x)\n  {\n    ASMJIT_ASSERT(getOffset() + sizeof(intptr_t) <= _capacity);\n\n    *(intptr_t *)_cur = x;\n    _cur += sizeof(intptr_t);\n  }\n\n  //! @brief Emit uintptr_t (4 or 8 bytes).\n  inline void emitUIntPtrT(uintptr_t x)\n  {\n    ASMJIT_ASSERT(getOffset() + sizeof(uintptr_t) <= _capacity);\n\n    *(uintptr_t *)_cur = x;\n    _cur += sizeof(uintptr_t);\n  }\n\n  //! @brief Emit size_t (4 or 8 bytes).\n  inline void emitSizeT(size_t x)\n  {\n    ASMJIT_ASSERT(getOffset() + sizeof(size_t) <= _capacity);\n\n    *(size_t *)_cur = x;\n    _cur += sizeof(size_t);\n  }\n\n  //! @brief Emit custom data. \n  ASMJIT_API void emitData(const void* ptr, size_t len);\n\n  // --------------------------------------------------------------------------\n  // [Get / Set]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set byte at position @a pos.\n  inline uint8_t getByteAt(size_t pos) const\n  {\n    ASMJIT_ASSERT(pos + 1 <= _capacity);\n\n    return *reinterpret_cast<const uint8_t*>(_data + pos);\n  }\n\n  //! @brief Set word at position @a pos.\n  inline uint16_t getWordAt(size_t pos) const\n  {\n    ASMJIT_ASSERT(pos + 2 <= _capacity);\n\n    return *reinterpret_cast<const uint16_t*>(_data + pos);\n  }\n\n  //! @brief Set dword at position @a pos.\n  inline uint32_t getDWordAt(size_t pos) const\n  {\n    ASMJIT_ASSERT(pos + 4 <= _capacity);\n\n    return *reinterpret_cast<const uint32_t*>(_data + pos);\n  }\n\n  //! @brief Set qword at position @a pos.\n  inline uint64_t getQWordAt(size_t pos) const\n  {\n    ASMJIT_ASSERT(pos + 8 <= _capacity);\n\n    return *reinterpret_cast<const uint64_t*>(_data + pos);\n  }\n\n  //! @brief Set intptr_t at position @a pos.\n  inline intptr_t getIntPtrTAt(size_t pos) const\n  {\n    ASMJIT_ASSERT(pos + sizeof(intptr_t) <= _capacity);\n\n    return *reinterpret_cast<const intptr_t*>(_data + pos);\n  }\n\n  //! @brief Set uintptr_t at position @a pos.\n  inline uintptr_t getUIntPtrTAt(size_t pos) const\n  {\n    ASMJIT_ASSERT(pos + sizeof(uintptr_t) <= _capacity);\n\n    return *reinterpret_cast<const uintptr_t*>(_data + pos);\n  }\n\n  //! @brief Set size_t at position @a pos.\n  inline uintptr_t getSizeTAt(size_t pos) const\n  {\n    ASMJIT_ASSERT(pos + sizeof(size_t) <= _capacity);\n\n    return *reinterpret_cast<const size_t*>(_data + pos);\n  }\n\n  //! @brief Set byte at position @a pos.\n  inline void setByteAt(size_t pos, uint8_t x)\n  {\n    ASMJIT_ASSERT(pos + 1 <= _capacity);\n\n    *reinterpret_cast<uint8_t*>(_data + pos) = x;\n  }\n\n  //! @brief Set word at position @a pos.\n  inline void setWordAt(size_t pos, uint16_t x)\n  {\n    ASMJIT_ASSERT(pos + 2 <= _capacity);\n\n    *reinterpret_cast<uint16_t*>(_data + pos) = x;\n  }\n\n  //! @brief Set dword at position @a pos.\n  inline void setDWordAt(size_t pos, uint32_t x)\n  {\n    ASMJIT_ASSERT(pos + 4 <= _capacity);\n\n    *reinterpret_cast<uint32_t*>(_data + pos) = x;\n  }\n\n  //! @brief Set qword at position @a pos.\n  inline void setQWordAt(size_t pos, uint64_t x)\n  {\n    ASMJIT_ASSERT(pos + 8 <= _capacity);\n\n    *reinterpret_cast<uint64_t*>(_data + pos) = x;\n  }\n\n  //! @brief Set intptr_t at position @a pos.\n  inline void setIntPtrTAt(size_t pos, intptr_t x)\n  {\n    ASMJIT_ASSERT(pos + sizeof(intptr_t) <= _capacity);\n\n    *reinterpret_cast<intptr_t*>(_data + pos) = x;\n  }\n\n  //! @brief Set uintptr_t at position @a pos.\n  inline void setUIntPtrTAt(size_t pos, uintptr_t x)\n  {\n    ASMJIT_ASSERT(pos + sizeof(uintptr_t) <= _capacity);\n\n    *reinterpret_cast<uintptr_t*>(_data + pos) = x;\n  }\n\n  //! @brief Set size_t at position @a pos.\n  inline void setSizeTAt(size_t pos, size_t x)\n  {\n    ASMJIT_ASSERT(pos + sizeof(size_t) <= _capacity);\n\n    *reinterpret_cast<size_t*>(_data + pos) = x;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  // All members are public, because they can be accessed and modified by \n  // Assembler/Compiler directly.\n\n  //! @brief Beginning position of buffer.\n  uint8_t* _data;\n  //! @brief Current position in buffer.\n  uint8_t* _cur;\n  //! @brief Maximum position in buffer for realloc.\n  uint8_t* _max;\n\n  //! @brief Buffer capacity (in bytes).\n  size_t _capacity;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n#endif // _ASMJIT_CORE_BUFFER_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/build.h",
    "content": "// [AsmJit]\r\n// Complete JIT Assembler for C++ Language.\r\n//\r\n// [License]\r\n// Zlib - See COPYING file in this package.\r\n\r\n// [Guard]\r\n#ifndef _ASMJIT_CORE_BUILD_H\r\n#define _ASMJIT_CORE_BUILD_H\r\n\r\n// [Include]\r\n#include \"../Config.h\"\r\n\r\n#if defined(ASMJIT_EXPORTS)\r\n# if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\r\n#  define _CRT_SECURE_NO_WARNINGS\r\n# endif // _MSC_VER\r\n#endif // ASMJIT_EXPORTS\r\n\r\n// Here should be optional include files that's needed fo successfuly\r\n// use macros defined here. Remember, AsmJit uses only AsmJit namespace\r\n// and all macros are used within it.\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n\r\n#include <new>\r\n\r\n// ============================================================================\r\n// [AsmJit - OS]\r\n// ============================================================================\r\n\r\n#if defined(WINDOWS) || defined(_WINDOWS) || defined(__WINDOWS__) || defined(_WIN32) || defined(_WIN64)\r\n# define ASMJIT_WINDOWS\r\n#elif defined(__linux__)     || defined(__unix__)    || \\\r\n      defined(__OpenBSD__)   || defined(__FreeBSD__) || defined(__NetBSD__) || \\\r\n      defined(__DragonFly__) || defined(__BSD__)     || defined(__FREEBSD__) || \\\r\n      defined(__APPLE__)\r\n# define ASMJIT_POSIX\r\n#else\r\n# warning \"AsmJit - Can't match operating system, using ASMJIT_POSIX\"\r\n# define ASMJIT_POSIX\r\n#endif\r\n\r\n// ============================================================================\r\n// [AsmJit - Architecture]\r\n// ============================================================================\r\n\r\n// define it only if it's not defined. In some systems we can\r\n// use -D command in compiler to bypass this autodetection.\r\n#if !defined(ASMJIT_X86) && !defined(ASMJIT_X64)\r\n# if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || \\\r\n     defined(_M_X64)     || defined(_WIN64) \r\n#  define ASMJIT_X64 // x86-64\r\n# else\r\n// _M_IX86, __INTEL__, __i386__\r\n#  define ASMJIT_X86\r\n# endif\r\n#endif\r\n\r\n// ============================================================================\r\n// [AsmJit - API]\r\n// ============================================================================\r\n\r\n// Make AsmJit as shared library by default.\r\n#if !defined(ASMJIT_API)\r\n# if defined(ASMJIT_WINDOWS)\r\n#  if defined(__GNUC__)\r\n#   if defined(ASMJIT_EXPORTS)\r\n#    define ASMJIT_API __attribute__((dllexport))\r\n#   else\r\n#    define ASMJIT_API __attribute__((dllimport))\r\n#   endif // ASMJIT_EXPORTS\r\n#  else\r\n#   if defined(ASMJIT_EXPORTS)\r\n#    define ASMJIT_API __declspec(dllexport)\r\n#   else\r\n#    define ASMJIT_API __declspec(dllimport)\r\n#   endif // ASMJIT_EXPORTS\r\n#  endif // __GNUC__\r\n# else\r\n#  if defined(__GNUC__)\r\n#   if __GNUC__ >= 4\r\n#    define ASMJIT_API __attribute__((visibility(\"default\")))\r\n#    define ASMJIT_VAR extern ASMJIT_API\r\n#   endif // __GNUC__ >= 4\r\n#  endif // __GNUC__\r\n# endif\r\n#endif // ASMJIT_API\r\n\r\n#if !defined(ASMJIT_VAR)\r\n# if defined(ASMJIT_API)\r\n#  define ASMJIT_VAR extern ASMJIT_API\r\n# else\r\n#  define ASMJIT_VAR\r\n# endif // ASMJIT_API\r\n#endif // !ASMJIT_VAR\r\n\r\n// [AsmJit - Memory Management]\r\n#if !defined(ASMJIT_MALLOC)\r\n# define ASMJIT_MALLOC ::malloc\r\n#endif // ASMJIT_MALLOC\r\n\r\n#if !defined(ASMJIT_REALLOC)\r\n# define ASMJIT_REALLOC ::realloc\r\n#endif // ASMJIT_REALLOC\r\n\r\n#if !defined(ASMJIT_FREE)\r\n# define ASMJIT_FREE ::free\r\n#endif // ASMJIT_FREE\r\n\r\n// ============================================================================\r\n// [AsmJit - Calling Conventions]\r\n// ============================================================================\r\n\r\n#if defined(ASMJIT_X86)\r\n# if defined(__GNUC__)\r\n#  define ASMJIT_REGPARM_1 __attribute__((regparm(1)))\r\n#  define ASMJIT_REGPARM_2 __attribute__((regparm(2)))\r\n#  define ASMJIT_REGPARM_3 __attribute__((regparm(3)))\r\n#  define ASMJIT_FASTCALL  __attribute__((fastcall))\r\n#  define ASMJIT_STDCALL   __attribute__((stdcall))\r\n#  define ASMJIT_CDECL     __attribute__((cdecl))\r\n# else\r\n#  define ASMJIT_FASTCALL   __fastcall\r\n#  define ASMJIT_STDCALL    __stdcall\r\n#  define ASMJIT_CDECL      __cdecl\r\n# endif\r\n#else\r\n# define ASMJIT_FASTCALL\r\n# define ASMJIT_STDCALL\r\n# define ASMJIT_CDECL\r\n#endif // ASMJIT_X86\r\n\r\n#if !defined(ASMJIT_UNUSED)\r\n# define ASMJIT_UNUSED(var) ((void)var)\r\n#endif // ASMJIT_UNUSED\r\n\r\n#if !defined(ASMJIT_NOP)\r\n# define ASMJIT_NOP() ((void)0)\r\n#endif // ASMJIT_NOP\r\n\r\n// [AsmJit - C++ Compiler Support]\r\n#define ASMJIT_TYPE_TO_TYPE(_Type_) _Type_ \r\n#define ASMJIT_HAS_STANDARD_DEFINE_OPTIONS\r\n#define ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION\r\n\r\n// Support for VC6\r\n#if defined(_MSC_VER) && (_MSC_VER < 1400)\r\n\r\nnamespace AsmJit {\r\n  template<typename T>\r\n  struct _Type2Type { typedef T Type; };\r\n}\r\n\r\n#undef ASMJIT_TYPE_TO_TYPE\r\n#define ASMJIT_TYPE_TO_TYPE(_Type_) ::AsmJit::_Type2Type<_Type_>::Type\r\n\r\n#undef ASMJIT_HAS_STANDARD_DEFINE_OPTIONS\r\n#undef ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION\r\n\r\n#endif\r\n\r\n// ============================================================================\r\n// [AsmJit - Types]\r\n// ============================================================================\r\n\r\n#if defined(__MINGW32__) || defined(__MINGW64__)\r\n# include <sys/types.h>\r\n#endif // __MINGW32__ || __MINGW64__\r\n\r\n#if defined(_MSC_VER) && (_MSC_VER < 1600)\r\n# if (_MSC_VER < 1300)\r\ntypedef signed char int8_t;\r\ntypedef signed short int16_t;\r\ntypedef signed int int32_t;\r\ntypedef signed __int64 int64_t;\r\ntypedef unsigned char uint8_t;\r\ntypedef unsigned short uint16_t;\r\ntypedef unsigned int uint32_t;\r\ntypedef unsigned __int64 uint64_t;\r\n# else\r\ntypedef signed __int8 int8_t;\r\ntypedef signed __int16 int16_t;\r\ntypedef signed __int32 int32_t;\r\ntypedef signed __int64 int64_t;\r\ntypedef unsigned __int8 uint8_t;\r\ntypedef unsigned __int16 uint16_t;\r\ntypedef unsigned __int32 uint32_t;\r\ntypedef unsigned __int64 uint64_t;\r\n# endif // _MSC_VER\r\n#else\r\n# include <stdint.h>\r\n# include <limits.h>\r\n#endif \r\n\r\ntypedef unsigned char uchar;\r\ntypedef unsigned short ushort;\r\ntypedef unsigned int uint;\r\ntypedef unsigned long ulong;\r\n\r\n#if defined(ASMJIT_X86)\r\ntypedef int32_t sysint_t;\r\ntypedef uint32_t sysuint_t;\r\n#else\r\ntypedef int64_t sysint_t;\r\ntypedef uint64_t sysuint_t;\r\n#endif\r\n\r\n#if defined(_MSC_VER)\r\n# define ASMJIT_INT64_C(num) num##i64\r\n# define ASMJIT_UINT64_C(num) num##ui64\r\n#else\r\n# define ASMJIT_INT64_C(num) num##LL\r\n# define ASMJIT_UINT64_C(num) num##ULL\r\n#endif\r\n\r\n// ============================================================================\r\n// [AsmJit - C++ Macros]\r\n// ============================================================================\r\n\r\n#define ASMJIT_ARRAY_SIZE(A) (sizeof(A) / sizeof(*A))\r\n\r\n#define ASMJIT_NO_COPY(__type__) \\\r\nprivate: \\\r\n  inline __type__(const __type__& other); \\\r\n  inline __type__& operator=(const __type__& other); \\\r\npublic:\r\n\r\n// ============================================================================\r\n// [AsmJit - Debug]\r\n// ============================================================================\r\n\r\n// If ASMJIT_DEBUG and ASMJIT_NO_DEBUG is not defined then ASMJIT_DEBUG will be\r\n// detected using the compiler specific macros. This enables to set the build \r\n// type using IDE.\r\n#if !defined(ASMJIT_DEBUG) && !defined(ASMJIT_NO_DEBUG)\r\n\r\n#if defined(_DEBUG)\r\n#define ASMJIT_DEBUG\r\n#endif // _DEBUG\r\n\r\n#endif // !ASMJIT_DEBUG && !ASMJIT_NO_DEBUG\r\n\r\n// ============================================================================\r\n// [AsmJit - Initialize/DontInitialize]\r\n// ============================================================================\r\n\r\n// TODO: This should be moved to AsmJit namespace!\r\n\r\n// Skip documenting this.\r\n#if !defined(ASMJIT_NODOC)\r\nstruct _Initialize {};\r\nstruct _DontInitialize {};\r\n#endif // !ASMJIT_NODOC\r\n\r\n// ============================================================================\r\n// [AsmJit - Void]\r\n// ============================================================================\r\n\r\n// TODO: This should be moved to AsmJit namespace!\r\n\r\n//! @brief Void type which can be used in @ref FunctionDeclaration templates.\r\nstruct Void {};\r\n\r\n// ============================================================================\r\n// [asmjit_cast<>]\r\n// ============================================================================\r\n\r\n//! @brief Cast used to cast pointer to function. It's like reinterpret_cast<>, \r\n//! but uses internally C style cast to work with MinGW.\r\n//!\r\n//! If you are using single compiler and @c reinterpret_cast<> works for you,\r\n//! there is no reason to use @c asmjit_cast<>. If you are writing\r\n//! cross-platform software with various compiler support, consider using\r\n//! @c asmjit_cast<> instead of @c reinterpret_cast<>.\r\ntemplate<typename T, typename Z>\r\nstatic inline T asmjit_cast(Z* p) { return (T)p; }\r\n\r\n// ============================================================================\r\n// [AsmJit - OS Support]\r\n// ============================================================================\r\n\r\n#if defined(ASMJIT_WINDOWS)\r\n#include <Windows.h>\r\n#endif // ASMJIT_WINDOWS\r\n\r\n#if defined(__APPLE__)\r\n#include <AvailabilityMacros.h>\r\n\r\n#ifndef MAC_OS_X_VERSION_10_7\r\n// In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here.\r\nstatic size_t strnlen(const char *s, size_t n)\r\n{\r\n\tconst char *p = (const char *)memchr(s, 0, n);\r\n\treturn(p ? p-s : n);\r\n}\r\n#endif\r\n\r\n#endif // __APPLE__\r\n\r\n// [Guard]\r\n#endif // _ASMJIT_CORE_BUILD_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compiler.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assembler.h\"\n#include \"../core/compiler.h\"\n#include \"../core/compilercontext.h\"\n#include \"../core/compilerfunc.h\"\n#include \"../core/compileritem.h\"\n#include \"../core/cpuinfo.h\"\n#include \"../core/intutil.h\"\n#include \"../core/logger.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Compiler - Construction / Destruction]\n// ============================================================================\n\nCompiler::Compiler(Context* context) :\n  _zoneMemory(16384 - sizeof(ZoneChunk) - 32),\n  _linkMemory(1024 - 32),\n  _context(context != NULL ? context : static_cast<Context*>(JitContext::getGlobal())),\n  _logger(NULL),\n  _error(0),\n  _properties(0),\n  _emitOptions(0),\n  _finished(false),\n  _first(NULL),\n  _last(NULL),\n  _current(NULL),\n  _func(NULL),\n  _cc(NULL),\n  _varNameId(0)\n{\n}\n\nCompiler::~Compiler()\n{\n  reset();\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Logging]\n// ============================================================================\n\nvoid Compiler::setLogger(Logger* logger)\n{\n  _logger = logger;\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Error Handling]\n// ============================================================================\n\nvoid Compiler::setError(uint32_t error)\n{\n  _error = error;\n  if (_error == kErrorOk)\n    return;\n\n  if (_logger)\n    _logger->logFormat(\"*** COMPILER ERROR: %s (%u).\\n\", getErrorString(error), (unsigned int)error);\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Properties]\n// ============================================================================\n\nuint32_t Compiler::getProperty(uint32_t propertyId)\n{\n  if (propertyId > 31)\n    return 0;\n\n  return (_properties & IntUtil::maskFromIndex(propertyId)) != 0;\n}\n\nvoid Compiler::setProperty(uint32_t propertyId, uint32_t value)\n{\n  if (propertyId > 31)\n    return;\n\n  if (value)\n    _properties |= IntUtil::maskFromIndex(propertyId);\n  else\n    _properties &= ~IntUtil::maskFromIndex(propertyId);\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Clear / Reset]\n// ============================================================================\n\nvoid Compiler::clear()\n{\n  _purge();\n\n  if (_error != kErrorOk)\n    setError(kErrorOk);\n}\n\nvoid Compiler::reset()\n{\n  _purge();\n\n  _zoneMemory.reset();\n  _linkMemory.reset();\n\n  _targets.reset();\n  _vars.reset();\n\n  if (_error != kErrorOk)\n    setError(kErrorOk);\n}\n\nvoid Compiler::_purge()\n{\n  _zoneMemory.clear();\n  _linkMemory.clear();\n\n  _emitOptions = 0;\n  _finished = false;\n\n  _first = NULL;\n  _last = NULL;\n  _current = NULL;\n  _func = NULL;\n\n  _targets.clear();\n  _vars.clear();\n\n  _cc = NULL;\n  _varNameId = 0;\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Item Management]\n// ============================================================================\n\nCompilerItem* Compiler::setCurrentItem(CompilerItem* item)\n{\n  CompilerItem* old = _current;\n  _current = item;\n  return old;\n}\n\nvoid Compiler::addItem(CompilerItem* item)\n{\n  ASMJIT_ASSERT(item != NULL);\n  ASMJIT_ASSERT(item->_prev == NULL);\n  ASMJIT_ASSERT(item->_next == NULL);\n\n  if (_current == NULL)\n  {\n    if (_first == NULL)\n    {\n      _first = item;\n      _last = item;\n    }\n    else\n    {\n      item->_next = _first;\n      _first->_prev = item;\n      _first = item;\n    }\n  }\n  else\n  {\n    CompilerItem* prev = _current;\n    CompilerItem* next = _current->_next;\n\n    item->_prev = prev;\n    item->_next = next;\n\n    prev->_next = item;\n    if (next)\n      next->_prev = item;\n    else\n      _last = item;\n  }\n\n  _current = item;\n}\n\nvoid Compiler::addItemAfter(CompilerItem* item, CompilerItem* ref)\n{\n  ASMJIT_ASSERT(item != NULL);\n  ASMJIT_ASSERT(item->_prev == NULL);\n  ASMJIT_ASSERT(item->_next == NULL);\n  ASMJIT_ASSERT(ref != NULL);\n\n  CompilerItem* prev = ref;\n  CompilerItem* next = ref->_next;\n\n  item->_prev = prev;\n  item->_next = next;\n\n  prev->_next = item;\n  if (next)\n    next->_prev = item;\n  else\n    _last = item;\n}\n\nvoid Compiler::removeItem(CompilerItem* item)\n{\n  CompilerItem* prev = item->_prev;\n  CompilerItem* next = item->_next;\n\n  if (_first == item) { _first = next; } else { prev->_next = next; }\n  if (_last  == item) { _last  = prev; } else { next->_prev = prev; }\n\n  item->_prev = NULL;\n  item->_next = NULL;\n\n  if (_current == item)\n    _current = prev;\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Comment]\n// ============================================================================\n\nvoid Compiler::comment(const char* fmt, ...)\n{\n  char buf[128];\n  char* p = buf;\n\n  if (fmt)\n  {\n    *p++ = ';';\n    *p++ = ' ';\n\n    va_list ap;\n    va_start(ap, fmt);\n    p += vsnprintf(p, 100, fmt, ap);\n    va_end(ap);\n  }\n\n  *p++ = '\\n';\n  *p   = '\\0';\n\n  CompilerComment* item = Compiler_newItem<CompilerComment>(this, buf);\n  addItem(item);\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Embed]\n// ============================================================================\n\nvoid Compiler::embed(const void* data, size_t len)\n{\n  // Align length to 16 bytes.\n  size_t alignedSize = IntUtil::align<size_t>(len, sizeof(uintptr_t));\n  void* p = _zoneMemory.alloc(sizeof(CompilerEmbed) - sizeof(void*) + alignedSize);\n\n  if (p == NULL)\n    return;\n\n  CompilerEmbed* item = new(p) CompilerEmbed(this, data, len);\n  addItem(item);\n}\n\n} // AsmJit namespace\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compiler.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_COMPILER_H\n#define _ASMJIT_CORE_COMPILER_H\n\n// [Dependencies - AsmJit]\n#include \"../core/assembler.h\"\n#include \"../core/context.h\"\n#include \"../core/func.h\"\n#include \"../core/operand.h\"\n#include \"../core/podvector.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [Forward Declarations]\n// ============================================================================\n\nstruct Compiler;\nstruct CompilerAlign;\nstruct CompilerComment;\nstruct CompilerContext;\nstruct CompilerEmbed;\nstruct CompilerFuncCall;\nstruct CompilerFuncDecl;\nstruct CompilerFuncEnd;\nstruct CompilerInst;\nstruct CompilerItem;\nstruct CompilerMark;\nstruct CompilerState;\nstruct CompilerTarget;\nstruct CompilerVar;\n\n// ============================================================================\n// [AsmJit::CompilerState]\n// ============================================================================\n\n//! @brief Compiler state base.\nstruct CompilerState\n{\n};\n\n// ============================================================================\n// [AsmJit::CompilerVar]\n// ============================================================================\n\n//! @brief Compiler variable base.\nstruct CompilerVar\n{\n  // --------------------------------------------------------------------------\r\n  // [Accessors]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Get variable name.\r\n  inline const char* getName() const { return _name; }\r\n  //! @brief Get variable id.\r\n  inline uint32_t getId() const { return _id; }\r\n\r\n  //! @brief Get variable type.\r\n  inline uint32_t getType() const { return _type; }\r\n  //! @brief Get variable class.\r\n  inline uint32_t getClass() const { return _class; }\r\n  //! @brief Get variable priority.\r\n  inline uint32_t getPriority() const { return _priority; }\r\n  //! @brief Get variable size.\r\n  inline uint32_t getSize() const { return _size; }\r\n\r\n  //! @brief Get whether the variable is a function argument.\r\n  inline bool isArgument() const { return static_cast<bool>(_isRegArgument | _isMemArgument); }\r\n  //! @brief Get whether the variable is a function argument passed through register.\r\n  inline bool isRegArgument() const { return static_cast<bool>(_isRegArgument); }\r\n  //! @brief Get whether the variable is a function argument passed through memory.\r\n  inline bool isMemArgument() const { return static_cast<bool>(_isMemArgument); }\r\n\r\n  //! @brief Get variable content can be calculated by a simple instruction.\r\n  inline bool isCalculated() const { return static_cast<bool>(_isCalculated); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Variable name.\r\n  const char* _name;\r\n  //! @brief Variable id.\r\n  uint32_t _id;\r\n\r\n  //! @brief Variable type.\r\n  uint8_t _type;\r\n  //! @brief Variable class.\r\n  uint8_t _class;\r\n  //! @brief Variable priority.\r\n  uint8_t _priority;\r\n\r\n  //! @brief Whether the variable is a function argument passed through register.\r\n  uint8_t _isRegArgument : 1;\r\n  //! @brief Whether the variable is a function argument passed through memory.\r\n  uint8_t _isMemArgument : 1;\r\n  //! @brief Whether variable content can be calculated by a simple instruction.\r\n  //!\r\n  //! This is used mainly by MMX and SSE2 code. This flag indicates that \r\n  //! register allocator should never reserve memory for this variable, because\r\n  //! the content can be generated by a single instruction (for example PXOR).\r\n  uint8_t _isCalculated : 1;\r\n  //! @internal.\r\n  uint8_t _unused : 5;\r\n\r\n  //! @brief Variable size.\r\n  uint32_t _size;\r\n};\n\n// ============================================================================\n// [AsmJit::Compiler]\n// ============================================================================\n\n//! @brief Compiler.\n//!\n//! @sa @ref Assembler.\nstruct Compiler\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref Compiler instance.\n  ASMJIT_API Compiler(Context* context);\n  //! @brief Destroy the @ref Compiler instance.\n  ASMJIT_API virtual ~Compiler();\n\n  // --------------------------------------------------------------------------\n  // [Context]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get code generator.\n  inline Context* getContext() const\n  { return _context; }\n\n  // --------------------------------------------------------------------------\n  // [Memory Management]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get zone memory manager.\n  inline ZoneMemory& getZoneMemory()\n  { return _zoneMemory; }\n\n  //! @brief Get link memory manager.\n  inline ZoneMemory& getLinkMemory()\n  { return _linkMemory; }\n\n  // --------------------------------------------------------------------------\n  // [Logging]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get logger.\n  inline Logger* getLogger() const\n  { return _logger; }\n\n  //! @brief Set logger to @a logger.\n  ASMJIT_API virtual void setLogger(Logger* logger);\n\n  // --------------------------------------------------------------------------\n  // [Error Handling]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get error code.\n  inline uint32_t getError() const\n  { return _error; }\n\n  //! @brief Set error code.\n  //!\n  //! This method is virtual, because higher classes can use it to catch all\n  //! errors.\n  ASMJIT_API virtual void setError(uint32_t error);\n\n  // --------------------------------------------------------------------------\n  // [Properties]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler property.\n  ASMJIT_API virtual uint32_t getProperty(uint32_t propertyId);\n  //! @brief Set compiler property.\n  ASMJIT_API virtual void setProperty(uint32_t propertyId, uint32_t value);\n\n  // --------------------------------------------------------------------------\n  // [Clear / Reset]\n  // --------------------------------------------------------------------------\n\n  //! @brief Clear everything, but not deallocate buffers.\n  //!\n  //! @note This method will destroy your code.\n  ASMJIT_API void clear();\n\n  //! @brief Free internal buffer, all emitters and NULL all pointers.\n  //!\n  //! @note This method will destroy your code.\n  ASMJIT_API void reset();\n\n  //! @brief Called by clear() and reset() to clear all data related to derived\n  //! class implementation.\n  ASMJIT_API virtual void _purge();\n\n  // --------------------------------------------------------------------------\n  // [Item Management]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get first item.\n  inline CompilerItem* getFirstItem() const\n  { return _first; }\n\n  //! @brief Get last item.\n  inline CompilerItem* getLastItem() const\n  { return _last; }\n\n  //! @brief Get current item.\n  //!\n  //! @note If this method returns @c NULL it means that nothing has been \n  //! emitted yet.\n  inline CompilerItem* getCurrentItem() const\n  { return _current; }\n\n  //! @brief Get current function.\n  inline CompilerFuncDecl* getFunc() const\n  { return _func; }\n\n  //! @brief Set current item to @a item and return the previous current one.\n  ASMJIT_API CompilerItem* setCurrentItem(CompilerItem* item);\n\n  //! @brief Add item after current item to @a item and set current item to \n  //! @a item.\n  ASMJIT_API void addItem(CompilerItem* item);\n\n  //! @brief Add item after @a ref.\n  ASMJIT_API void addItemAfter(CompilerItem* item, CompilerItem* ref);\n\n  //! @brief Remove item @a item.\n  ASMJIT_API void removeItem(CompilerItem* item);\n\n  // --------------------------------------------------------------------------\n  // [Comment]\n  // --------------------------------------------------------------------------\n\n  //! @brief Emit a single comment line.\n  //!\n  //! @note Comment is not directly sent to logger, but instead it's stored as\n  //! @ref CompilerComment item emitted when @c serialize() method is called.\n  ASMJIT_API void comment(const char* fmt, ...);\n\n  // --------------------------------------------------------------------------\n  // [Embed]\n  // --------------------------------------------------------------------------\n\n  //! @brief Embed data.\n  ASMJIT_API void embed(const void* data, size_t len);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief ZoneMemory allocator, used to allocate compiler items.\n  ZoneMemory _zoneMemory;\n  //! @brief ZoneMemory allocator, used to alloc small data structures like\n  //! linked lists.\n  ZoneMemory _linkMemory;\n\n  //! @brief Context.\n  Context* _context;\n  //! @brief Logger.\n  Logger* _logger;\n\n  //! @brief Error code.\n  uint32_t _error;\n  //! @brief Properties.\n  uint32_t _properties;\n  //! @brief Contains options for next emitted instruction, clear after each emit.\n  uint32_t _emitOptions;\n  //! @brief Whether compiler was finished the job (register allocator, etc...).\n  uint32_t _finished;\n\n  //! @brief First item.\n  CompilerItem* _first;\n  //! @brief Last item.\n  CompilerItem* _last;\n  //! @brief Current item.\n  CompilerItem* _current;\n  //! @brief Current function.\n  CompilerFuncDecl* _func;\n\n  //! @brief Targets.\n  PodVector<CompilerTarget*> _targets;\n  //! @brief Variables.\n  PodVector<CompilerVar*> _vars;\n\n  //! @brief Compiler context instance, only available after prepare().\n  CompilerContext* _cc;\n\n  //! @brief Variable name id (used to generate unique names per function).\n  int _varNameId;\n};\n\n// ============================================================================\n// [AsmJit::Compiler - Helpers]\n// ============================================================================\n\ntemplate<typename T, typename Compiler>\ninline T* Compiler_newItem(Compiler* self)\n{\n  void* addr = self->getZoneMemory().alloc(sizeof(T));\n  return new(addr) T(self);\n}\n\ntemplate<typename T, typename Compiler, typename P1>\ninline T* Compiler_newItem(Compiler* self, P1 p1)\n{\n  void* addr = self->getZoneMemory().alloc(sizeof(T));\n  return new(addr) T(self, p1);\n}\n\ntemplate<typename T, typename Compiler, typename P1, typename P2>\ninline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2)\n{\n  void* addr = self->getZoneMemory().alloc(sizeof(T));\n  return new(addr) T(self, p1, p2);\n}\n\ntemplate<typename T, typename Compiler, typename P1, typename P2, typename P3>\ninline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3)\n{\n  void* addr = self->getZoneMemory().alloc(sizeof(T));\n  return new(addr) T(self, p1, p2, p3);\n}\n\ntemplate<typename T, typename Compiler, typename P1, typename P2, typename P3, typename P4>\ninline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3, P4 p4)\n{\n  void* addr = self->getZoneMemory().alloc(sizeof(T));\n  return new(addr) T(self, p1, p2, p3, p4);\n}\n\ntemplate<typename T, typename Compiler, typename P1, typename P2, typename P3, typename P4, typename P5>\ninline T* Compiler_newItem(Compiler* self, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)\n{\n  void* addr = self->getZoneMemory().alloc(sizeof(T));\n  return new(addr) T(self, p1, p2, p3, p4, p5);\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_COMPILER_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compilercontext.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/compilercontext.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerContext - Construction / Destruction]\n// ============================================================================\n\nCompilerContext::CompilerContext(Compiler* compiler) :\n  _zoneMemory(8192 - sizeof(ZoneChunk) - 32),\n  _compiler(compiler),\n  _func(NULL),\n  _start(NULL),\n  _stop(NULL),\n  _extraBlock(NULL),\n  _state(NULL),\n  _active(NULL),\n  _currentOffset(0),\n  _isUnreachable(0)\n{\n}\n\nCompilerContext::~CompilerContext()\n{\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compilercontext.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_COMPILERCONTEXT_H\n#define _ASMJIT_CORE_COMPILERCONTEXT_H\n\n// [Dependencies - AsmJit]\n#include \"../core/compiler.h\"\n#include \"../core/compilerfunc.h\"\n#include \"../core/compileritem.h\"\n#include \"../core/zonememory.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerContext]\n// ============================================================================\n\nstruct CompilerContext\n{\n  ASMJIT_NO_COPY(CompilerContext)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API CompilerContext(Compiler* compiler);\n  ASMJIT_API virtual ~CompilerContext();\n\n  // --------------------------------------------------------------------------\n  // [Accessor]\n  // --------------------------------------------------------------------------\n\n  inline Compiler* getCompiler() const\n  { return _compiler; }\n  \n  inline CompilerFuncDecl* getFunc() const\n  { return _func; }\n\n  inline CompilerItem* getExtraBlock() const\n  { return _extraBlock; }\n  \n  inline void setExtraBlock(CompilerItem* item)\n  { _extraBlock = item; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief ZoneMemory manager.\n  ZoneMemory _zoneMemory;\n\n  //! @brief Compiler.\n  Compiler* _compiler;\n  //! @brief Function.\n  CompilerFuncDecl* _func;\n\n  //! @brief Start of the current active scope.\n  CompilerItem* _start;\n  //! @brief End of the current active scope.\n  CompilerItem* _stop;\n  //! @brief Item that is used to insert some code after the function body.\n  CompilerItem* _extraBlock;\n\n  //! @brief Current state (used by register allocator).\n  CompilerState* _state;\n  //! @brief Link to circular double-linked list containing all active variables\n  //! of the current state.\n  CompilerVar* _active;\n\n  //! @brief Current offset, used in prepare() stage. Each item should increment it.\n  uint32_t _currentOffset;\n  //! @brief Whether current code is unreachable.\n  uint32_t _isUnreachable;\n};\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_COMPILERCONTEXT_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compilerfunc.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assembler.h\"\n#include \"../core/compiler.h\"\n#include \"../core/compilerfunc.h\"\n#include \"../core/compileritem.h\"\n#include \"../core/intutil.h\"\n#include \"../core/logger.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerFuncDecl - Construction / Destruction]\n// ============================================================================\n\nCompilerFuncDecl::CompilerFuncDecl(Compiler* compiler) :\n  CompilerItem(compiler, kCompilerItemFuncDecl),\n  _entryTarget(NULL),\n  _exitTarget(NULL),\n  _end(NULL),\n  _decl(NULL),\n  _vars(NULL),\n  _funcHints(0),\n  _funcFlags(0),\n  _funcCallStackSize(0)\n{\n}\n\nCompilerFuncDecl::~CompilerFuncDecl()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerFuncDecl - Hints]\n// ============================================================================\n\nvoid CompilerFuncDecl::setHint(uint32_t hint, uint32_t value)\n{\n  if (hint > 31)\n    return;\n\n  if (value)\n    _funcHints |= IntUtil::maskFromIndex(hint);\n  else\n    _funcHints &= ~IntUtil::maskFromIndex(hint);\n}\n\nuint32_t CompilerFuncDecl::getHint(uint32_t hint) const\n{\n  if (hint > 31)\n    return 0;\n  \n  return (_funcHints & IntUtil::maskFromIndex(hint)) != 0;\n}\n\n// ============================================================================\n// [AsmJit::CompilerFuncEnd - Construction / Destruction]\n// ============================================================================\n\nCompilerFuncEnd::CompilerFuncEnd(Compiler* compiler, CompilerFuncDecl* func) :\n  CompilerItem(compiler, kCompilerItemFuncEnd),\n  _func(func)\n{\n}\n\nCompilerFuncEnd::~CompilerFuncEnd()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerFuncEnd - Interface]\n// ============================================================================\n\nCompilerItem* CompilerFuncEnd::translate(CompilerContext& cc)\n{\n  _isTranslated = true;\n  return NULL;\n}\n\n// ============================================================================\n// [AsmJit::CompilerFuncRet - Construction / Destruction]\n// ============================================================================\n\nCompilerFuncRet::CompilerFuncRet(Compiler* compiler, CompilerFuncDecl* func, const Operand* first, const Operand* second) :\n  CompilerItem(compiler, kCompilerItemFuncRet),\n  _func(func)\n{\n  if (first != NULL)\n    _ret[0] = *first;\n\n  if (second != NULL)\n    _ret[1] = *second;\n}\n\nCompilerFuncRet::~CompilerFuncRet()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerFuncRet - Misc]\n// ============================================================================\n\nbool CompilerFuncRet::mustEmitJump() const\n{\n  // Iterate over next items until we found an item which emits a real instruction.\n  CompilerItem* item = this->getNext();\n\n  while (item)\n  {\n    switch (item->getType())\n    {\n      // Interesting item.\n      case kCompilerItemEmbed:\n      case kCompilerItemInst:\n      case kCompilerItemFuncCall:\n      case kCompilerItemFuncRet:\n        return true;\n\n      // Non-interesting item.\n      case kCompilerItemComment:\n      case kCompilerItemMark:\n      case kCompilerItemAlign:\n      case kCompilerItemHint:\n        break;\n\n      case kCompilerItemTarget:\n        if (static_cast<CompilerTarget*>(item)->getLabel().getId() == getFunc()->getExitLabel().getId())\n          return false;\n        break;\n\n      // Invalid items - these items shouldn't be here. We are inside the \n      // function, after prolog.\n      case kCompilerItemFuncDecl:\n        break;\n\n      // We can't go forward from here.\n      case kCompilerItemFuncEnd:\n        return false;\n    }\n\n    item = item->getNext();\n  }\n\n  return false;\n}\n\n// ============================================================================\n// [AsmJit::CompilerFuncCall - Construction / Destruction]\n// ============================================================================\n\nCompilerFuncCall::CompilerFuncCall(Compiler* compiler, CompilerFuncDecl* caller, const Operand* target) :\n  CompilerItem(compiler, kCompilerItemFuncCall),\n  _caller(caller),\n  _decl(NULL),\n  _args(NULL)\n{\n  if (target != NULL)\n    _target = *target;\n}\n\nCompilerFuncCall::~CompilerFuncCall()\n{\n}\n\n} // AsmJit namespace\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compilerfunc.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_COMPILERFUNC_H\n#define _ASMJIT_CORE_COMPILERFUNC_H\n\n// [Dependencies - AsmJit]\n#include \"../core/compiler.h\"\n#include \"../core/compileritem.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerFuncDecl]\n// ============================================================================\n\n//! @brief Compiler function declaration item.\n//!\n//! Functions are base blocks for generating assembler output. Each generated\n//! assembler stream needs standard entry and leave sequences thats compatible\n//! with the operating system conventions (ABI).\n//!\n//! Function class can be used to generate function prolog) and epilog sequences\n//! that are compatible with the demanded calling convention and to allocate and\n//! manage variables that can be allocated/spilled during compilation time.\n//!\n//! @note To create a function use @c Compiler::newFunc() method, do not \n//! create any form of compiler function items using new operator.\n//!\n//! @sa @ref CompilerState, @ref CompilerVar.\nstruct CompilerFuncDecl : public CompilerItem\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @c CompilerFuncDecl instance.\n  //!\n  //! @note Always use @c AsmJit::Compiler::newFunc() to create @c Function\n  //! instance.\n  ASMJIT_API CompilerFuncDecl(Compiler* compiler);\n  //! @brief Destroy the @c CompilerFuncDecl instance.\n  ASMJIT_API virtual ~CompilerFuncDecl();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get function entry label.\n  //!\n  //! Entry label can be used to call this function from another code that's\n  //! being generated.\n  inline const Label& getEntryLabel() const\n  { return _entryLabel; }\n\n  //! @brief Get function exit label.\n  //!\n  //! Use exit label to jump to function epilog.\n  inline const Label& getExitLabel() const\n  { return _exitLabel; }\n\n  //! @brief Get function entry target.\n  inline CompilerTarget* getEntryTarget() const\n  { return _entryTarget; }\n\n  //! @brief Get function exit target.\n  inline CompilerTarget* getExitTarget() const\n  { return _exitTarget; }\n\n  //! @brief Get function end item.\n  inline CompilerFuncEnd* getEnd() const\n  { return _end; }\n\n  //! @brief Get function declaration.\n  inline FuncDecl* getDecl() const\n  { return _decl; }\n\n  //! @brief Get function arguments as variables.\n  inline CompilerVar** getVars() const\n  { return _vars; }\n\n  //! @brief Get function argument at @a index.\n  inline CompilerVar* getVar(uint32_t index) const\n  {\n    ASMJIT_ASSERT(index < _decl->getArgumentsCount());\n    return _vars[index];\n  }\n\n  //! @brief Get function hints.\n  inline uint32_t getFuncHints() const\n  { return _funcHints; }\n\n  //! @brief Get function flags.\n  inline uint32_t getFuncFlags() const\n  { return _funcFlags; }\n\n  //! @brief Get whether the _funcFlags has @a flag\n  inline bool hasFuncFlag(uint32_t flag) const\n  { return (_funcFlags & flag) != 0; }\n\n  //! @brief Set function @a flag.\n  inline void setFuncFlag(uint32_t flag)\n  { _funcFlags |= flag; }\n\n  //! @brief Clear function @a flag.\n  inline void clearFuncFlag(uint32_t flag)\n  { _funcFlags &= ~flag; }\n  \n  //! @brief Get whether the function is also a caller.\n  inline bool isCaller() const\n  { return hasFuncFlag(kFuncFlagIsCaller); }\n\n  //! @brief Get whether the function is finished.\n  inline bool isFinished() const\n  { return hasFuncFlag(kFuncFlagIsFinished); }\n\n  //! @brief Get whether the function is naked.\n  inline bool isNaked() const\n  { return hasFuncFlag(kFuncFlagIsNaked); }\n\n  //! @brief Get stack size needed to call other functions.\n  inline int32_t getFuncCallStackSize() const\n  { return _funcCallStackSize; }\n\n  // --------------------------------------------------------------------------\n  // [Hints]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set function hint.\n  ASMJIT_API virtual void setHint(uint32_t hint, uint32_t value);\n  //! @brief Get function hint.\n  ASMJIT_API virtual uint32_t getHint(uint32_t hint) const;\n\n  // --------------------------------------------------------------------------\n  // [Prototype]\n  // --------------------------------------------------------------------------\n\n  virtual void setPrototype(\n    uint32_t convention, \n    uint32_t returnType,\n    const uint32_t* arguments, \n    uint32_t argumentsCount) = 0;\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Function entry label.\n  Label _entryLabel;\n  //! @brief Function exit label.\n  Label _exitLabel;\n  \n  //! @brief Function entry target.\n  CompilerTarget* _entryTarget;\n  //! @brief Function exit target.\n  CompilerTarget* _exitTarget;\n\n  //! @brief Function end item.\n  CompilerFuncEnd* _end;\n\n  //! @brief Function declaration.\n  FuncDecl* _decl;\n  //! @brief Function arguments as compiler variables.\n  CompilerVar** _vars;\n\n  //! @brief Function hints;\n  uint32_t _funcHints;\n  //! @brief Function flags.\n  uint32_t _funcFlags;\n\n  //! @brief Stack size needed to call other functions.\n  int32_t _funcCallStackSize;\n};\n\n// ============================================================================\n// [AsmJit::CompilerFuncEnd]\n// ============================================================================\n\n//! @brief Compiler function end item.\n//!\n//! This item does nothing; it's only used by @ref Compiler to mark  specific \n//! location in the code. The @c CompilerFuncEnd is similar to @c CompilerMark,\n//! except that it overrides @c translate() to return @c NULL.\nstruct CompilerFuncEnd : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerFuncEnd)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerMark instance.\n  ASMJIT_API CompilerFuncEnd(Compiler* compiler, CompilerFuncDecl* func);\n  //! @brief Destroy the @ref CompilerMark instance.\n  ASMJIT_API virtual ~CompilerFuncEnd();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n  \n  //! @brief Get related function.\n  inline CompilerFuncDecl* getFunc() const\n  { return _func; }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Related function.\n  CompilerFuncDecl* _func;\n};\n\n// ============================================================================\n// [AsmJit::CompilerFuncRet]\n// ============================================================================\n\n//! @brief Compiler return from function item.\nstruct CompilerFuncRet : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerFuncRet)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerFuncRet instance.\n  ASMJIT_API CompilerFuncRet(Compiler* compiler, CompilerFuncDecl* func,\n    const Operand* first, const Operand* second);\n  //! @brief Destroy the @ref CompilerFuncRet instance.\n  ASMJIT_API virtual ~CompilerFuncRet();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @Brief Get the related function.\n  inline CompilerFuncDecl* getFunc() const\n  { return _func; }\n\n  //! @brief Get the first return operand.\n  inline Operand& getFirst()\n  { return _ret[0]; }\n  \n  //! @overload\n  inline const Operand& getFirst() const\n  { return _ret[0]; }\n\n  //! @brief Get the second return operand.\n  inline Operand& getSecond()\n  { return _ret[1]; }\n \n  //! @overload\n  inline const Operand& getSecond() const\n  { return _ret[1]; }\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether jump to epilog has to be emitted.\n  ASMJIT_API bool mustEmitJump() const;\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Related function.\n  CompilerFuncDecl* _func;\n  //! @brief Return operand(s).\n  Operand _ret[2];\n};\n\n// ============================================================================\n// [AsmJit::CompilerFuncCall]\n// ============================================================================\n\n//! @brief Compiler function call item.\nstruct CompilerFuncCall : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerFuncCall)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerFuncCall instance.\n  ASMJIT_API CompilerFuncCall(Compiler* compiler, CompilerFuncDecl* caller, const Operand* target);\n  //! @brief Destroy the @ref CompilerFuncCall instance.\n  ASMJIT_API virtual ~CompilerFuncCall();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get caller.\n  inline CompilerFuncDecl* getCaller() const\n  { return _caller; }\n\n  //! @brief Get function declaration.\n  inline FuncDecl* getDecl() const\n  { return _decl; }\n\n  //! @brief Get target operand.\n  inline Operand& getTarget()\n  { return _target; }\n\n  //! @overload\n  inline const Operand& getTarget() const \n  { return _target; }\n\n  // --------------------------------------------------------------------------\n  // [Prototype]\n  // --------------------------------------------------------------------------\n\n  virtual void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) = 0;\n\n  //! @brief Set function prototype.\n  inline void setPrototype(uint32_t convention, const FuncPrototype& func)\n  { setPrototype(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Caller (the function which does the call).\n  CompilerFuncDecl* _caller;\n  //! @brief Function declaration.\n  FuncDecl* _decl;\n\n  //! @brief Operand (address of function, register, label, ...).\n  Operand _target;\n  //! @brief Return operands.\n  Operand _ret[2];\n  //! @brief Arguments operands.\n  Operand* _args;\n};\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_COMPILERFUNC_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compileritem.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assembler.h\"\n#include \"../core/compiler.h\"\n#include \"../core/compilercontext.h\"\n#include \"../core/compilerfunc.h\"\n#include \"../core/compileritem.h\"\n#include \"../core/intutil.h\"\n#include \"../core/logger.h\"\n\n// [Dependencies - C]\n#include <stdarg.h>\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerItem - Construction / Destruction]\n// ============================================================================\n\nCompilerItem::CompilerItem(Compiler* compiler, uint32_t type) :\n  _compiler(compiler),\n  _prev(NULL),\n  _next(NULL),\n  _comment(NULL),\n  _type(static_cast<uint8_t>(type)),\n  _isTranslated(false),\n  _isUnreachable(false),\n  _reserved(0),\n  _offset(kInvalidValue)\n{\n}\n\nCompilerItem::~CompilerItem()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerItem - Interface]\n// ============================================================================\n\nvoid CompilerItem::prepare(CompilerContext& cc)\n{\n  _offset = cc._currentOffset;\n}\n\nCompilerItem* CompilerItem::translate(CompilerContext& cc)\n{\n  return translated();\n}\n\nvoid CompilerItem::emit(Assembler& a) {}\nvoid CompilerItem::post(Assembler& a) {}\n\n// ============================================================================\n// [AsmJit::CompilerItem - Misc]\n// ============================================================================\n\nint CompilerItem::getMaxSize() const\n{\n  // Default maximum size is -1 which means that it's not known.\n  return -1;\n}\n\nbool CompilerItem::_tryUnuseVar(CompilerVar* v)\n{\n  return false;\n}\n\n// ============================================================================\n// [AsmJit::CompilerItem - Comment]\n// ============================================================================\n\nvoid CompilerItem::setComment(const char* str)\n{\n  _comment = _compiler->getZoneMemory().sdup(str);\n}\n\nvoid CompilerItem::formatComment(const char* fmt, ...)\n{\n  // The capacity should be large enough.\n  char buf[128];\n\n  va_list ap;\n  va_start(ap, fmt);\n  vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap);\n  va_end(ap);\n\n  // I don't know if vsnprintf can produce non-null terminated string, in case\n  // it can, we terminate it here.\n  buf[ASMJIT_ARRAY_SIZE(buf) - 1] = '\\0';\n\n  setComment(buf);\n}\n\n// ============================================================================\n// [AsmJit::CompilerMark - Construction / Destruction]\n// ============================================================================\n\nCompilerMark::CompilerMark(Compiler* compiler) :\n  CompilerItem(compiler, kCompilerItemMark)\n{\n}\n\nCompilerMark::~CompilerMark()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerMark - Misc]\n// ============================================================================\n\nint CompilerMark::getMaxSize() const\n{\n  return 0;\n}\n\n// ============================================================================\n// [AsmJit::CompilerComment - Construction / Destruction]\n// ============================================================================\n\nCompilerComment::CompilerComment(Compiler* compiler, const char* str) :\n  CompilerItem(compiler, kCompilerItemComment)\n{\n  if (str != NULL)\n    setComment(str);\n}\n\nCompilerComment::~CompilerComment()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerComment - Interface]\n// ============================================================================\n\nvoid CompilerComment::emit(Assembler& a)\n{\n  Logger* logger = a.getLogger();\n  if (logger == NULL || !logger->isUsed())\n    return;\n\n  logger->logString(logger->getInstructionPrefix());\n  logger->logString(getComment());\n}\n\n// ============================================================================\n// [AsmJit::CompilerComment - Misc]\n// ============================================================================\n\nint CompilerComment::getMaxSize() const\n{\n  return 0;\n}\n\n// ============================================================================\n// [AsmJit::CompilerEmbed - Construction / Destruction]\n// ============================================================================\n\nCompilerEmbed::CompilerEmbed(Compiler* compiler, const void* data, size_t length) :\n  CompilerItem(compiler, kCompilerItemEmbed)\n{\n  _length = length;\n  memcpy(_data, data, length);\n}\n\nCompilerEmbed::~CompilerEmbed()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerEmbed - Interface]\n// ============================================================================\n\nvoid CompilerEmbed::emit(Assembler& a)\n{\n  a.embed(_data, _length);\n}\n\n// ============================================================================\n// [AsmJit::CompilerEmbed - Misc]\n// ============================================================================\n\nint CompilerEmbed::getMaxSize() const\n{\n  return (int)_length;;\n}\n\n// ============================================================================\n// [AsmJit::CompilerAlign - Construction / Destruction]\n// ============================================================================\n\nCompilerAlign::CompilerAlign(Compiler* compiler, uint32_t size) :\n  CompilerItem(compiler, kCompilerItemAlign), _size(size)\n{\n}\n\nCompilerAlign::~CompilerAlign()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerAlign - Misc]\n// ============================================================================\n\nint CompilerAlign::getMaxSize() const\n{\n  if (_size == 0)\n    return 0;\n  else\n    return static_cast<int>(_size - 1);\n}\n\n// ============================================================================\n// [AsmJit::CompilerHint - Construction / Destruction]\n// ============================================================================\n\nCompilerHint::CompilerHint(Compiler* compiler, CompilerVar* var, uint32_t hintId, uint32_t hintValue) :\n  CompilerItem(compiler, kCompilerItemHint),\n  _var(var),\n  _hintId(hintId),\n  _hintValue(hintValue)\n{\n  ASMJIT_ASSERT(var != NULL);\n}\n\nCompilerHint::~CompilerHint()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerTarget - Construction / Destruction]\n// ============================================================================\n\nCompilerTarget::CompilerTarget(Compiler* compiler, const Label& label) :\n  CompilerItem(compiler, kCompilerItemTarget),\n  _label(label),\n  _from(NULL),\n  _state(NULL),\n  _jumpsCount(0)\n{\n}\n\nCompilerTarget::~CompilerTarget()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerTarget - Misc]\n// ============================================================================\n\nint CompilerTarget::getMaxSize() const\n{\n  return 0;\n}\n\n// ============================================================================\n// [AsmJit::CompilerInst - Construction / Destruction]\n// ============================================================================\n\nCompilerInst::CompilerInst(Compiler* compiler, uint32_t code, Operand* opData, uint32_t opCount) :\n  CompilerItem(compiler, kCompilerItemInst),\n  _code(code),\n  _emitOptions(static_cast<uint8_t>(compiler->_emitOptions)),\n  _instFlags(0),\n  _operandsCount(static_cast<uint8_t>(opCount)),\n  _variablesCount(0),\n  _operands(opData)\n{\n  // Each created instruction takes emit options and clears it.\n  compiler->_emitOptions = 0;\n}\n\nCompilerInst::~CompilerInst()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerInst - GetJumpTarget]\n// ============================================================================\n\nCompilerTarget* CompilerInst::getJumpTarget() const\n{\n  return NULL;\n}\n\n} // AsmJit namespace\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/compileritem.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_COMPILERITEM_H\n#define _ASMJIT_CORE_COMPILERITEM_H\n\n// [Dependencies - AsmJit]\n#include \"../core/compiler.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerItem]\n// ============================================================================\n\n//! @brief Compiler item.\n//!\n//! @ref CompilerItem represents items generated by compiler by calling its\n//! methods to build functions, instruction stream, bind labels, etc... Each\n//! item contains its type information and virtual methods which are called at\n//! various compilation steps.\nstruct CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerItem)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create new @ref CompilerItem.\n  //!\n  //! @note Always use @ref Compiler to create an item!\n  ASMJIT_API CompilerItem(Compiler* compiler, uint32_t type);\n\n  //! @brief Destroy @ref CompilerItem.\n  //!\n  //! @note @ref Compiler keeps links into all items so it can destroy them \n  //! when code generation finished or in the case that @ref Compiler was \n  //! destroyed early (for example if an error happened). Never destroy items\n  //! manually!\n  ASMJIT_API virtual ~CompilerItem();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get associated compiler instance.\n  inline Compiler* getCompiler() const\n  { return _compiler; }\n\n  //! @brief Get previous item in the compiler stream.\n  inline CompilerItem* getPrev() const\n  { return _prev; }\n\n  //! @brief Get next item in the compiler stream.\n  inline CompilerItem* getNext() const\n  { return _next; }\n\n  //! @brief Get comment string.\n  inline const char* getComment() const\n  { return _comment; }\n\n  //! @brief Get type of item, see @ref kCompilerItem.\n  inline uint32_t getType() const\n  { return _type; }\n\n  //! @brief Get whether the item was translated.\n  inline bool isTranslated() const\n  { return _isTranslated; }\n\n  //! @brief Get whether the item is unreachable.\n  inline bool isUnreachable() const\n  { return _isUnreachable; }\n\n  //! @brief Get the item offset in the compiler stream.\n  //!\n  //! The offset is not byte offset, each item increments offset by 1 and this\n  //! value is then used by register allocator. The offset is set by compiler\n  //! by the register allocator, don't use it in your code.\n  inline uint32_t getOffset() const\n  { return _offset; }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  //! @brief Step 1. Extract item variables, update statistics, ...\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  //! @brief Step 2. Translate instruction, alloc variables, ...\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n  //! @brief Step 3. Emit to @c Assembler.\n  ASMJIT_API virtual void emit(Assembler& a);\n  //! @brief Step 4. Last post step (verify, add data, etc).\n  ASMJIT_API virtual void post(Assembler& a);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get maximum size of of this when serialized into @ref Assembler \n  //! item in bytes.\n  ASMJIT_API virtual int getMaxSize() const;\n\n  //! @brief Try to unuse the variable @a.\n  //!\n  //! Returns @c true only if the variable will be unused by the instruction,\n  //! otherwise @c false is returned.\n  ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v);\n\n  // --------------------------------------------------------------------------\n  // [Comment]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set comment string to @a str.\n  ASMJIT_API void setComment(const char* str);\n\n  //! @brief Format comment string using @a fmt string and variable argument list.\n  ASMJIT_API void formatComment(const char* fmt, ...);\n\n  // --------------------------------------------------------------------------\n  // [Protected]\n  // --------------------------------------------------------------------------\n\nprotected:\n  //! @brief Mark item as translated and return next.\n  inline CompilerItem* translated()\n  {\n    ASMJIT_ASSERT(_isTranslated == false);\n\n    _isTranslated = true;\n    return _next;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\npublic:\n  //! @brief Compiler which owns this item.\n  Compiler* _compiler;\n  //! @brief Previous item.\n  CompilerItem* _prev;\n  //! @brief Next item.\n  CompilerItem* _next;\n  //! @brief Inline comment string, initially set to NULL.\n  const char* _comment;\n\n  //! @brief Type of the item, see @ref kCompilerItem.\n  uint32_t _type : 8;\n  //! @brief Whether the item was translated, see @c translate().\n  uint32_t _isTranslated : 1;\n  //! @brief Whether the item is unreachable.\n  uint32_t _isUnreachable : 1;\n  //! @brief Reserved for future use.\n  uint32_t _reserved : 22;\n\n  //! @brief Stream offset (not byte-offset).\n  uint32_t _offset;\n};\n\n// ============================================================================\n// [AsmJit::CompilerMark]\n// ============================================================================\n\n//! @brief Compiler mark item.\n//!\n//! This item does nothing and it's only used by @ref Compiler to mark some\n//! specific location in the compiler stream.\nstruct CompilerMark : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerMark)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerMark instance.\n  ASMJIT_API CompilerMark(Compiler* compiler);\n  //! @brief Destroy the @ref CompilerMark instance.\n  ASMJIT_API virtual ~CompilerMark();\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n};\n\n// ============================================================================\n// [AsmJit::CompilerComment]\n// ============================================================================\n\n//! @brief Compiler comment item.\n//!\n//! Comments allows to comment your assembler stream for better debugging\n//! and visualization. Comments are usually ignored in release builds unless\n//! the logger is present.\nstruct CompilerComment : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerComment)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerComment instance.\n  ASMJIT_API CompilerComment(Compiler* compiler, const char* comment = NULL);\n  //! @brief Destroy the @ref CompilerComment instance.\n  ASMJIT_API virtual ~CompilerComment();\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void emit(Assembler& a);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n};\n\n// ============================================================================\n// [AsmJit::CompilerEmbed]\n// ============================================================================\n\n//! @brief Compiler embed item.\n//!\n//! Embed item is used to embed data into final assembler stream. The data is\n//! considered to be RAW, there is no analysis.\nstruct CompilerEmbed : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerEmbed)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerEmbed instance.\n  ASMJIT_API CompilerEmbed(Compiler* compiler, const void* data, size_t length);\n  //! @brief Destroy the @ref CompilerEmbed instance.\n  ASMJIT_API virtual ~CompilerEmbed();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get pointer to embedded data.\n  uint8_t* getData() const\n  { return const_cast<uint8_t*>(_data); }\n\n  //! @brief Get length of embedded data.\n  size_t getLength() const\n  { return _length; }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void emit(Assembler& a);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Data length.\n  size_t _length;\n  //! @brief Data buffer (that will be embedded to the assembler stream).\n  uint8_t _data[sizeof(void*)];\n};\n\n// ============================================================================\n// [AsmJit::CompilerAlign]\n// ============================================================================\n\n//! @brief Compiler align item.\nstruct CompilerAlign : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerAlign)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerAlign instance.\n  ASMJIT_API CompilerAlign(Compiler* compiler, uint32_t size = 0);\n  //! @brief Destroy the @ref CompilerAlign instance.\n  ASMJIT_API virtual ~CompilerAlign();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get align size in bytes.\n  inline uint32_t getSize() const\n  { return _size; }\n\n  //! @brief Set align size in bytes to @a size.\n  inline void setSize(uint32_t size)\n  { _size = size; }\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Align size.\n  uint32_t _size;\n};\n\n// ============================================================================\n// [AsmJit::CompilerHint]\n// ============================================================================\n\n//! @brief Compiler variable hint item.\nstruct CompilerHint : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerHint)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerHint instance.\n  ASMJIT_API CompilerHint(Compiler* compiler, CompilerVar* var, uint32_t hintId, uint32_t hintValue);\n  //! @brief Destroy the @ref CompilerHint instance.\n  ASMJIT_API virtual ~CompilerHint();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get variable.\n  inline CompilerVar* getVar() const\n  { return _var; }\n\n  //! @brief Get hint it (see @ref kVarHint).\n  inline uint32_t getHintId() const\n  { return _hintId; }\n  \n  //! @brief Set hint it (see @ref kVarHint).\n  inline void setHintId(uint32_t hintId)\n  { _hintId = hintId; }\n\n  //! @brief Get hint value.\n  inline uint32_t getHintValue() const\n  { return _hintValue; }\n  \n  //! @brief Set hint value.\n  inline void setHintValue(uint32_t hintValue)\n  { _hintValue = hintValue; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Variable.\n  CompilerVar* _var;\n  //! @brief Variable hint id.\n  uint32_t _hintId;\n  //! @brief Variable hint value.\n  uint32_t _hintValue;\n};\n\n// ============================================================================\n// [AsmJit::CompilerTarget]\n// ============================================================================\n\n//! @brief Compiler target item.\nstruct CompilerTarget : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerTarget)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerTarget instance.\n  ASMJIT_API CompilerTarget(Compiler* compiler, const Label& target);\n  //! @brief Destroy the @ref CompilerTarget instance.\n  ASMJIT_API virtual ~CompilerTarget();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Return label bound to this target.\n  inline const Label& getLabel() const\n  { return _label; }\n\n  //! @brief Get first jmp instruction.\n  inline CompilerInst* getFrom() const\n  { return _from; }\n\n  //! @brief Get register allocator state for this target.\n  inline CompilerState* getState() const\n  { return _state; }\n\n  //! @brief Get number of jumps to this target.\n  inline uint32_t getJumpsCount() const\n  { return _jumpsCount; }\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Label.\n  Label _label;\n  //! @brief First jump instruction that points to this target (label).\n  CompilerInst* _from;\n  //! @brief State at this location.\n  CompilerState* _state;\n  //! @brief Count of jumps here.\n  uint32_t _jumpsCount;\n};\n\n// ============================================================================\n// [AsmJit::CompilerInst]\n// ============================================================================\n\n//! @brief Compiler instruction item.\nstruct CompilerInst : public CompilerItem\n{\n  ASMJIT_NO_COPY(CompilerInst)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerInst instance.\n  ASMJIT_API CompilerInst(Compiler* compiler, uint32_t code, Operand* opData, uint32_t opCount);\n  //! @brief Destroy the @ref CompilerInst instance.\n  ASMJIT_API virtual ~CompilerInst();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get instruction code, see @c kInstCode.\n  inline uint32_t getCode() const\n  { return _code; }\n\n  //! @brief Set instruction code to @a code.\n  //!\n  //! Please do not modify instruction code if you are not know what you are\n  //! doing. Incorrect instruction code or operands can raise assertion() at\n  //! runtime.\n  inline void setCode(uint32_t code)\n  { _code = code; }\n\n  //! @brief Get emit options (compiler specific).\n  inline uint32_t getEmitOptions() const\n  { return _emitOptions; }\n\n  //! @brief Get instruction flags (compiler specific).\n  inline uint32_t getInstFlags() const\n  { return _instFlags; }\n\n  //! @brief Get whether the instruction has flag @a flag.\n  inline bool hasInstFlag(uint8_t flag) const\n  { return (_instFlags & flag) != 0; }\n\n  //! @brief Set instruction @a flag.\n  inline void setInstFlag(uint8_t flag)\n  { _instFlags |= flag; }\n\n  //! @brief Clear instruction @a flag.\n  inline void clearInstFlag(uint8_t flag)\n  { _instFlags &= ~flag; }\n\n  //! @brief Get count of operands in operands array.\n  inline uint32_t getOperandsCount() const\n  { return _operandsCount; }\n\n  //! @brief Get count of variables in variables array.\n  inline uint32_t getVariablesCount() const\n  { return _variablesCount; }\n\n  //! @brief Get operands array (3 operands total).\n  inline Operand* getOperands() { return _operands; }\n  //! @brief Get operands array (3 operands total).\n  inline const Operand* getOperands() const { return _operands; }\n\n  // --------------------------------------------------------------------------\n  // [GetJumpTarget]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get possible jump target.\n  //!\n  //! If this instruction is conditional or normal jump then return value is\n  //! the label location (@ref CompilerTarget), otherwise the return value is \n  //! @c NULL.\n  ASMJIT_API virtual CompilerTarget* getJumpTarget() const;\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Instruction code, see @c kInstCode.\n  uint32_t _code;\n\n  //! @brief Emit options.\n  uint8_t _emitOptions;\n  //! @brief Instruction flags.\n  uint8_t _instFlags;\n  //! @brief Operands count.\n  uint8_t _operandsCount;\n  //! @brief Variables count.\n  uint8_t _variablesCount;\n\n  //! @brief Operands.\n  Operand* _operands;\n};\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_COMPILERITEM_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/context.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assembler.h\"\n#include \"../core/context.h\"\n#include \"../core/defs.h\"\n#include \"../core/memorymanager.h\"\n#include \"../core/memorymarker.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Context - Construction / Destruction]\n// ============================================================================\n\nContext::Context() {}\nContext::~Context() {}\n\n// ============================================================================\n// [AsmJit::JitContext - Construction / Destruction]\n// ============================================================================\n\nJitContext::JitContext() :\n  _memoryManager(NULL),\n  _memoryMarker(NULL),\n  _allocType(kMemAllocFreeable)\n{\n}\n\nJitContext::~JitContext()\n{\n}\n\n// ============================================================================\n// [AsmJit::JitContext - Generate]\n// ============================================================================\n\nuint32_t JitContext::generate(void** dest, Assembler* assembler)\n{\n  // Disallow empty code generation.\n  size_t codeSize = assembler->getCodeSize();\n  if (codeSize == 0)\n  {\n    *dest = NULL;\n    return kErrorNoFunction;\n  }\n\n  // Switch to global memory manager if not provided.\n  MemoryManager* memmgr = getMemoryManager();\n\n  if (memmgr == NULL)\n    memmgr = MemoryManager::getGlobal();\n\n  void* p = memmgr->alloc(codeSize, getAllocType());\n  if (p == NULL)\n  {\n    *dest = NULL;\n    return kErrorNoVirtualMemory;\n  }\n\n  // Relocate the code.\n  size_t relocatedSize = assembler->relocCode(p);\n\n  // Return unused memory to MemoryManager.\n  if (relocatedSize < codeSize)\n    memmgr->shrink(p, relocatedSize);\n\n  // Mark memory if MemoryMarker provided.\n  if (_memoryMarker)\n    _memoryMarker->mark(p, relocatedSize);\n\n  // Return the code.\n  *dest = p;\n  return kErrorOk;\n}\n\n// ============================================================================\n// [AsmJit::JitContext - GetGlobal]\n// ============================================================================\n\nJitContext* JitContext::getGlobal()\n{\n  static JitContext global;\n  return &global;\n}\n\n} // AsmJit namespace\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/context.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_CONTEXT_H\n#define _ASMJIT_CORE_CONTEXT_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [Forward Declarations]\n// ============================================================================\n\nstruct Assembler;\nstruct MemoryManager;\nstruct MemoryMarker;\n\n// ============================================================================\n// [AsmJit::Context]\n// ============================================================================\n\n//! @brief Class for changing behavior of code generated by @ref Assembler and\n//! @ref Compiler.\nstruct Context\n{\n  ASMJIT_NO_COPY(Context)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a @c Context instance.\n  ASMJIT_API Context();\n  //! @brief Destroy the @c Context instance.\n  ASMJIT_API virtual ~Context();\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  //! @brief Allocate memory for code generated in @a assembler and reloc it\n  //! to target location.\n  //!\n  //! This method is universal allowing any pre-process / post-process work\n  //! with code generated by @c Assembler or @c Compiler. Because @c Compiler\n  //! always uses @c Assembler it's allowed to access only the @c Assembler\n  //! instance.\n  //!\n  //! This method is always last step when using code generation. You can use\n  //! it to allocate memory for JIT code, saving code to remote process or a \n  //! shared library.\n  //!\n  //! @retrurn Error value, see @c kError.\n  virtual uint32_t generate(void** dest, Assembler* assembler) = 0;\n};\n\n// ============================================================================\n// [AsmJit::JitContext]\n// ============================================================================\n\nstruct JitContext : public Context\n{\n  ASMJIT_NO_COPY(JitContext)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a @c JitContext instance.\n  ASMJIT_API JitContext();\n  //! @brief Destroy the @c JitContext instance.\n  ASMJIT_API virtual ~JitContext();\n\n  // --------------------------------------------------------------------------\n  // [Memory Manager and Alloc Type]\n  // --------------------------------------------------------------------------\n\n  // Note: These members can be ignored by all derived classes. They are here\n  // only to privide default implementation. All other implementations (remote\n  // code patching or making dynamic loadable libraries/executables) ignore\n  // members accessed by these accessors.\n\n  //! @brief Get the @c MemoryManager instance.\n  inline MemoryManager* getMemoryManager() const\n  { return _memoryManager; }\n\n  //! @brief Set the @c MemoryManager instance.\n  inline void setMemoryManager(MemoryManager* memoryManager)\n  { _memoryManager = memoryManager; }\n\n  //! @brief Get the type of allocation.\n  inline uint32_t getAllocType() const\n  { return _allocType; }\n\n  //! @brief Set the type of allocation.\n  inline void setAllocType(uint32_t allocType)\n  { _allocType = allocType; }\n\n  // --------------------------------------------------------------------------\n  // [Memory Marker]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get the @c MemoryMarker instance.\n  inline MemoryMarker* getMemoryMarker() const\n  { return _memoryMarker; }\n\n  //! @brief Set the @c MemoryMarker instance.\n  inline void setMemoryMarker(MemoryMarker* memoryMarker)\n  { _memoryMarker = memoryMarker; }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual uint32_t generate(void** dest, Assembler* assembler);\n\n  // --------------------------------------------------------------------------\n  // [Statics]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API static JitContext* getGlobal();\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Memory manager.\n  MemoryManager* _memoryManager;\n  //! @brief Memory marker.\n  MemoryMarker* _memoryMarker;\n\n  //! @brief Type of allocation.\n  uint32_t _allocType;\n};\n\n} // AsmJit namespace\n\n// [Guard]\n#endif // _ASMJIT_CORE_CONTEXT_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/cpuinfo.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/cpuinfo.h\"\n\n#if defined(ASMJIT_X86) || defined(ASMJIT_X64)\n#include \"../x86/x86cpuinfo.h\"\n#else\n// ?\n#endif // ASMJIT_X86 || ASMJIT_X64\n\n// [Dependencies - Windows]\n#if defined(ASMJIT_WINDOWS)\n# include <windows.h>\n#endif // ASMJIT_WINDOWS\n\n// [Dependencies - Posix]\n#if defined(ASMJIT_POSIX)\n# include <errno.h>\n//# include <sys/statvfs.h>\n# include <sys/utsname.h>\n# include <unistd.h>\n#endif // ASMJIT_POSIX\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CpuInfo - DetectNumberOfProcessors]\n// ============================================================================\n\nuint32_t CpuInfo::detectNumberOfProcessors()\n{\n#if defined(ASMJIT_WINDOWS)\n  SYSTEM_INFO info;\n  ::GetSystemInfo(&info);\n  return info.dwNumberOfProcessors;\n#elif defined(ASMJIT_POSIX) && defined(_SC_NPROCESSORS_ONLN)\n  // It seems that sysconf returns the number of \"logical\" processors on both\n  // mac and linux.  So we get the number of \"online logical\" processors.\n  long res = ::sysconf(_SC_NPROCESSORS_ONLN);\n  if (res == -1) return 1;\n\n  return static_cast<uint32_t>(res);\n#else\n  return 1;\n#endif\n}\n\n// ============================================================================\n// [AsmJit::CpuInfo - GetGlobal]\n// ============================================================================\n\n#if defined(ASMJIT_X86) || defined(ASMJIT_X64)\nstruct InitializedCpuInfo : public X86CpuInfo\n{\n  inline InitializedCpuInfo() :\n    X86CpuInfo()\n  {\n    x86CpuDetect(this);\n  }\n};\n#else\n#error \"AsmJit::CpuInfo - Unsupported CPU or compiler.\"\n#endif // ASMJIT_X86 || ASMJIT_X64\n\nconst CpuInfo* CpuInfo::getGlobal()\n{\n#if defined(ASMJIT_X86) || defined(ASMJIT_X64)\n  static InitializedCpuInfo cpuInfo;\n#else\n#error \"AsmJit::CpuInfo - Unsupported CPU or compiler.\"\n#endif // ASMJIT_X86 || ASMJIT_X64\n  return &cpuInfo;\n}\n\n} // AsmJit\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/cpuinfo.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_CPUINFO_H\n#define _ASMJIT_CORE_CPUINFO_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::CpuInfo]\n// ============================================================================\n\n//! @brief Informations about host cpu.\nstruct CpuInfo\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline CpuInfo(uint32_t size = sizeof(CpuInfo)) :\n    _size(size)\n  {\n  }\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get CPU vendor string.\n  inline const char* getVendorString() const { return _vendorString; }\n  //! @brief Get CPU brand string.\n  inline const char* getBrandString() const { return _brandString; }\n\n  //! @brief Get CPU vendor ID.\n  inline uint32_t getVendorId() const { return _vendorId; }\n  //! @brief Get CPU family ID.\n  inline uint32_t getFamily() const { return _family; }\n  //! @brief Get CPU model ID.\n  inline uint32_t getModel() const { return _model; }\n  //! @brief Get CPU stepping.\n  inline uint32_t getStepping() const { return _stepping; }\n  //! @brief Get CPU count.\n  inline uint32_t getNumberOfProcessors() const { return _numberOfProcessors; }\n  //! @brief Get CPU features.\n  inline uint32_t getFeatures() const { return _features; }\n  //! @brief Get CPU bugs.\n  inline uint32_t getBugs() const { return _bugs; }\n\n  //! @brief Get whether CPU has feature @a feature.\n  inline bool hasFeature(uint32_t feature) { return (_features & feature) != 0; }\n  //! @brief Get whether CPU has bug @a bug.\n  inline bool hasBug(uint32_t bug) { return (_bugs & bug) != 0; }\n\n  // --------------------------------------------------------------------------\n  // [Statics]\n  // --------------------------------------------------------------------------\n\n  //! @brief Detect number of processors.\n  ASMJIT_API static uint32_t detectNumberOfProcessors();\n\n  //! @brief Get global instance of @ref CpuInfo.\n  ASMJIT_API static const CpuInfo* getGlobal();\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Size of CpuInfo structure (in bytes).\n  uint32_t _size;\n\n  //! @brief Cpu short vendor string.\n  char _vendorString[16];\n  //! @brief Cpu long vendor string (brand).\n  char _brandString[64];\n\n  //! @brief Cpu vendor id (see @c AsmJit::CpuInfo::VendorId enum).\n  uint32_t _vendorId;\n  //! @brief Cpu family ID.\n  uint32_t _family;\n  //! @brief Cpu model ID.\n  uint32_t _model;\n  //! @brief Cpu stepping.\n  uint32_t _stepping;\n  //! @brief Number of processors or cores.\n  uint32_t _numberOfProcessors;\n  //! @brief Cpu features bitfield, see @c AsmJit::CpuInfo::Feature enum).\n  uint32_t _features;\n  //! @brief Cpu bugs bitfield, see @c AsmJit::CpuInfo::Bug enum).\n  uint32_t _bugs;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_CPUINFO_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/defs.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::getErrorString]\n// ============================================================================\n\nconst char* getErrorString(uint32_t error)\n{\n  static const char* errorMessage[] = {\n    \"No error\",\n\n    \"No heap memory\",\n    \"No virtual memory\",\n\n    \"Unknown instruction\",\n    \"Illegal instruction\",\n    \"Illegal addressing\",\n    \"Illegal short jump\",\n\n    \"No function defined\",\n    \"Incomplete function\",\n\n    \"Not enough registers\",\n    \"Registers overlap\",\n\n    \"Incompatible argument\",\n    \"Incompatible return value\",\n\n    \"Unknown error\"\n  };\n\n  // Saturate error code to be able to use errorMessage[].\n  if (error > kErrorCount)\n    error = kErrorCount;\n\n  return errorMessage[error];\n}\n\n} // AsmJit\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/defs.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_DEFS_H\n#define _ASMJIT_CORE_DEFS_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::Global]\n// ============================================================================\n\nenum\n{\n  //! @brief Invalid operand identifier.\n  kInvalidValue = 0xFFFFFFFFU,\n  //! @brief Minimum reserved bytes in @ref Buffer.\n  kBufferGrow = 32U\n};\n\nstatic const size_t kInvalidSize = (size_t)-1;\n\n// ============================================================================\n// [AsmJit::kStringBuilderOpType]\n// ============================================================================\n\n//! @brief String builder operation.\nenum kStringBuilderOpType\n{\n  //! @brief Replace the current content by a given content.\n  kStringBuilderOpSet = 0,\n  //! @brief Append a given content to the current content.\n  kStringBuilderOpAppend = 1\n};\n\n// ============================================================================\n// [AsmJit::kStringBuilderNumType]\n// ============================================================================\n\nenum kStringBuilderNumFlags\n{\n  kStringBuilderNumShowSign = (1U << 0),\n  kStringBuilderNumShowSpace = (1U << 1),\n  kStringBuilderNumAlternate = (1U << 2),\n  kStringBuilderNumSigned = (1U << 31)\n};\n\n// ============================================================================\n// [AsmJit::kLoggerOption]\n// ============================================================================\n\nenum kLoggerFlag\n{\n  //! @brief Whether logger is enabled or disabled.\n  //!\n  //! Default @c true.\n  kLoggerIsEnabled = 0x00000001,\n\n  //! @brief Whether logger is enabled and can be used.\n  //!\n  //! This value can be set by inherited classes to inform @c Logger that\n  //! assigned stream (or something that can log output) is invalid. If\n  //! @c _used is false it means that there is no logging output and AsmJit\n  //! shouldn't use this logger (because all messages will be lost).\n  //!\n  //! This is designed only to optimize cases that logger exists, but its\n  //! configured not to output messages. The API inside Logging and AsmJit\n  //! should only check this value when needed. The API outside AsmJit should\n  //! check only whether logging is @c _enabled.\n  //!\n  //! Default @c true.\n  kLoggerIsUsed = 0x00000002,\n\n  //! @brief Whether to output instructions also in binary form.\n  kLoggerOutputBinary = 0x00000010,\n  //! @brief Whether to output immediates as hexadecimal numbers.\n  kLoggerOutputHexImmediate = 0x00000020,\n  //! @brief Whether to output displacements as hexadecimal numbers.\n  kLoggerOutputHexDisplacement = 0x00000040\n};\n\n// ============================================================================\n// [AsmJit::kCpu]\n// ============================================================================\n\n//! @brief Cpu vendor IDs.\n//!\n//! Cpu vendor IDs are specific for AsmJit library. Vendor ID is not directly\n//! read from cpuid result, instead it's based on CPU vendor string.\nenum kCpu\n{\n  //! @brief Unknown CPU vendor.\n  kCpuUnknown = 0,\n\n  //! @brief Intel CPU vendor.\n  kCpuIntel = 1,\n  //! @brief AMD CPU vendor.\n  kCpuAmd = 2,\n  //! @brief National Semiconductor CPU vendor (applies also to Cyrix processors).\n  kCpuNSM = 3,\n  //! @brief Transmeta CPU vendor.\n  kCpuTransmeta = 4,\n  //! @brief VIA CPU vendor.\n  kCpuVia = 5\n};\n\n// ============================================================================\n// [AsmJit::kMemAllocType]\n// ============================================================================\n\n//! @brief Types of allocation used by @c AsmJit::MemoryManager::alloc() method.\nenum kMemAllocType\n{\n  //! @brief Allocate memory that can be freed by @c AsmJit::MemoryManager::free()\n  //! method.\n  kMemAllocFreeable = 0,\n  //! @brief Allocate permanent memory that will be never freed.\n  kMemAllocPermanent = 1\n};\n\n// ============================================================================\n// [AsmJit::kOperandType]\n// ============================================================================\n\n//! @brief Operand types that can be encoded in @c Op operand.\nenum kOperandType\n{\n  //! @brief Operand is none, used only internally (not initialized Operand).\n  //!\n  //! This operand is not valid.\n  kOperandNone = 0x00,\n  //! @brief Operand is label.\n  kOperandLabel = 0x01,\n  //! @brief Operand is register.\n  kOperandReg = 0x02,\n  //! @brief Operand is variable.\n  kOperandVar = 0x04,\n  //! @brief Operand is memory.\n  kOperandMem = 0x08,\n  //! @brief Operand is immediate.\n  kOperandImm = 0x10\n};\n\n// ============================================================================\n// [AsmJit::kOperandMemType]\n// ============================================================================\n\n//! @brief Type of memory operand.\nenum kOperandMemType\n{\n  //! @brief Operand is combination of register(s) and displacement (native).\n  kOperandMemNative = 0,\n  //! @brief Operand is label.\n  kOperandMemLabel = 1,\n  //! @brief Operand is absolute memory location (supported mainly in 32-bit mode)\n  kOperandMemAbsolute = 2,\n};\n\n// ============================================================================\n// [AsmJit::kOperandId]\n// ============================================================================\n\n//! @brief Operand ID masks used to determine the operand type.\nenum kOperandId\n{\n  //! @brief Operand id type mask (part used for operand type).\n  kOperandIdTypeMask = 0xC0000000,\n  //! @brief Label operand mark id.\n  kOperandIdTypeLabel = 0x40000000,\n  //! @brief Variable operand mark id.\n  kOperandIdTypeVar = 0x80000000,\n\n  //! @brief Operand id value mask (part used for IDs).\n  kOperandIdValueMask = 0x3FFFFFFF\n};\n\n// ============================================================================\n// [AsmJit::kRegType / kRegIndex]\n// ============================================================================\n\nenum\n{\n  //! @brief Mask for register type.\n  kRegTypeMask = 0xFF00,\n\n  //! @brief Mask for register code (index).\n  kRegIndexMask = 0xFF,\n  //! @brief Invalid register index.\n  kRegIndexInvalid = 0xFF\n};\n\n// ============================================================================\n// [AsmJit::kCondHint]\n// ============================================================================\n\n//! @brief Condition hint.\nenum kCondHint\n{\n  //! @brief No hint.\n  kCondHintNone = 0x00,\n  //! @brief Condition is likely to be taken.\n  kCondHintLikely = 0x01,\n  //! @brief Condition is unlikely to be taken.\n  kCondHintUnlikely = 0x02\n};\n\n// ============================================================================\n// [AsmJit::kFuncAnonymous]\n// ============================================================================\n\nenum\n{\n  //! @brief Maximum allowed arguments per function declaration / call.\n  kFuncArgsMax = 32,\n  //! @brief Invalid stack offset in function or function parameter. \n  kFuncStackInvalid = -1\n};\n\n// ============================================================================\n// [AsmJit::kFuncConv]\n// ============================================================================\n\nenum kFuncConv\n{\n  //! @brief Calling convention is invalid (can't be used).\n  kFuncConvNone = 0\n};\n\n// ============================================================================\n// [AsmJit::kFuncHint]\n// ============================================================================\n\n//! @brief Function hints.\nenum kFuncHint\n{\n  //! @brief Make naked function (without using ebp/erp in prolog / epilog).\n  kFuncHintNaked = 0\n};\n\n// ============================================================================\n// [AsmJit::kFuncFlags]\n// ============================================================================\n\n//! @brief Function flags.\nenum kFuncFlags\n{\n  //! @brief Whether another function is called from this function.\n  //!\n  //! If another function is called from this function, it's needed to prepare\n  //! stack for it. If this member is true then it's likely that true will be\n  //! also @c _isEspAdjusted one.\n  kFuncFlagIsCaller = (1U << 0),\n\n  //! @brief Whether the function is finished using @c Compiler::endFunc().\n  kFuncFlagIsFinished = (1U << 1),\n\n  //! @brief Whether the function is using naked (minimal) prolog / epilog.\n  kFuncFlagIsNaked = (1U << 2)\n};\n\n// ============================================================================\n// [AsmJit::kFuncArgsDirection]\n// ============================================================================\n\n//! @brief Function arguments direction.\nenum kFuncArgsDirection\n{\n  //! @brief Arguments are passed left to right.\n  //!\n  //! This arguments direction is unusual to C programming, it's used by pascal\n  //! compilers and in some calling conventions by Borland compiler).\n  kFuncArgsLTR = 0,\n  //! @brief Arguments are passed right ro left\n  //!\n  //! This is default argument direction in C programming.\n  kFuncArgsRTL = 1\n};\n\n// ============================================================================\n// [AsmJit::kInstCode]\n// ============================================================================\n\nenum kInstCode\n{\n  //! @brief No instruction.\n  kInstNone = 0\n};\n\n// ============================================================================\n// [AsmJit::kVarAllocFlags]\n// ============================================================================\n\n//! @brief Variable alloc mode.\nenum kVarAllocFlags\n{\n  //! @brief Allocating variable to read only.\n  //!\n  //! Read only variables are used to optimize variable spilling. If variable\n  //! is some time ago deallocated and it's not marked as changed (so it was\n  //! all the life time read only) then spill is simply NOP (no mov instruction\n  //! is generated to move it to it's home memory location).\n  kVarAllocRead = 0x01,\n  //! @brief Allocating variable to write only (overwrite).\n  //!\n  //! Overwriting means that if variable is in memory, there is no generated\n  //! instruction to move variable from memory to register, because that\n  //! register will be overwritten by next instruction. This is used as a\n  //! simple optimization to improve generated code by @c Compiler.\n  kVarAllocWrite = 0x02,\n  //! @brief Allocating variable to read / write.\n  //!\n  //! Variable allocated for read / write is marked as changed. This means that\n  //! if variable must be later spilled into memory, mov (or similar)\n  //! instruction will be generated.\n  kVarAllocReadWrite = 0x03,\n\n  //! @brief Variable can be allocated in register.\n  kVarAllocRegister = 0x04,\n  //! @brief Variable can be allocated only to a special register.\n  kVarAllocSpecial = 0x08,\n\n  //! @brief Variable can be allocated in memory.\n  kVarAllocMem = 0x10,\n\n  //! @brief Unuse the variable after use.\n  kVarAllocUnuseAfterUse = 0x20\n};\n\n// ============================================================================\n// [AsmJit::kVarHint]\n// ============================================================================\n\n//! @brief Variable hint (used by @ref Compiler).\n//!\n//! @sa @ref Compiler.\nenum kVarHint\n{\n  //! @brief Alloc variable.\n  kVarHintAlloc = 0,\n  //! @brief Spill variable.\n  kVarHintSpill = 1,\n  //! @brief Save variable if modified.\n  kVarHintSave = 2,\n  //! @brief Save variable if modified and mark it as unused.\n  kVarHintSaveAndUnuse = 3,\n  //! @brief Mark variable as unused.\n  kVarHintUnuse = 4\n};\n\n// ============================================================================\n// [AsmJit::kVarPolicy]\n// ============================================================================\n\n//! @brief Variable allocation method.\n//!\n//! Variable allocation method is used by compiler and it means if compiler\n//! should first allocate preserved registers or not. Preserved registers are\n//! registers that must be saved / restored by generated function.\n//!\n//! This option is for people who are calling C/C++ functions from JIT code so\n//! Compiler can recude generating push/pop sequences before and after call,\n//! respectively.\nenum kVarPolicy\n{\n  //! @brief Allocate preserved registers first.\n  kVarPolicyPreservedFirst = 0,\n  //! @brief Allocate preserved registers last (default).\n  kVarPolicyPreservedLast = 1\n};\n\n// ============================================================================\n// [AsmJit::kVarState]\n// ============================================================================\n\n//! @brief State of variable.\n//!\n//! @note State of variable is used only during make process and it's not\n//! visible to the developer.\nenum kVarState\n{\n  //! @brief Variable is currently not used.\n  kVarStateUnused = 0,\n  //! @brief Variable is in register.\n  //!\n  //! Variable is currently allocated in register.\n  kVarStateReg = 1,\n  //! @brief Variable is in memory location or spilled.\n  //!\n  //! Variable was spilled from register to memory or variable is used for\n  //! memory only storage.\n  kVarStateMem = 2\n};\n\n// ============================================================================\n// [AsmJit::kVarType]\n// ============================================================================\n\nenum kVarType\n{\n  //! @brief Invalid variable type.\n  kVarTypeInvalid = 0xFF\n};\n\n// ============================================================================\n// [AsmJit::kScale]\n// ============================================================================\n\n//! @brief Scale which can be used for addressing (it the target instruction\n//! supports it).\n//!\n//! See @c Op and addressing methods like @c byte_ptr(), @c word_ptr(),\n//! @c dword_ptr(), etc...\nenum kScale\n{\n  //! @brief No scale.\n  kScaleNone = 0,\n  //! @brief Scale 2 times (same as shifting to left by 1).\n  kScale2Times = 1,\n  //! @brief Scale 4 times (same as shifting to left by 2).\n  kScale4Times = 2,\n  //! @brief Scale 8 times (same as shifting to left by 3).\n  kScale8Times = 3\n};\n\n// ============================================================================\n// [AsmJit::kSize]\n// ============================================================================\n\n//! @brief Size of registers and pointers.\nenum kSize\n{\n  //! @brief 1 byte size.\n  kSizeByte   = 1,\n  //! @brief 2 bytes size.\n  kSizeWord   = 2,\n  //! @brief 4 bytes size.\n  kSizeDWord  = 4,\n  //! @brief 8 bytes size.\n  kSizeQWord  = 8,\n  //! @brief 10 bytes size.\n  kSizeTWord  = 10,\n  //! @brief 16 bytes size.\n  kSizeDQWord = 16\n};\n\n// ============================================================================\n// [AsmJit::kRelocMode]\n// ============================================================================\n\nenum kRelocMode\n{\n  kRelocAbsToAbs = 0,\n  kRelocRelToAbs = 1,\n  kRelocAbsToRel = 2,\n  kRelocTrampoline = 3\n};\n\n// ============================================================================\n// [AsmJit::kCompilerItem]\n// ============================================================================\n\n//! @brief Type of @ref CompilerItem.\n//!\n//! Each @c CompilerItem contains information about its type. Compiler can \n//! optimize instruction stream by analyzing items and each type is hint\n//! for it. The most used/serialized items are instructions\n//! (@c kCompilerItemInst).\nenum kCompilerItem\n{\n  //! @brief Invalid item (can't be used).\n  kCompilerItemNone = 0,\n  //! @brief Item is mark, see @ref CompilerMark.\n  kCompilerItemMark,\n  //! @brief Item is comment, see @ref CompilerComment.\n  kCompilerItemComment,\n  //! @brief Item is embedded data, see @ref CompilerEmbed.\n  kCompilerItemEmbed,\n  //! @brief Item is .align directive, see @ref CompilerAlign.\n  kCompilerItemAlign,\n  //! @brief Item is variable hint (alloc, spill, use, unuse), see @ref CompilerHint.\n  kCompilerItemHint,\n  //! @brief Item is instruction, see @ref CompilerInst.\n  kCompilerItemInst,\n  //! @brief Item is target, see @ref CompilerTarget.\n  kCompilerItemTarget,\n  //! @brief Item is function call, see @ref CompilerFuncCall.\n  kCompilerItemFuncCall,\n  //! @brief Item is function declaration, see @ref CompilerFuncDecl.\n  kCompilerItemFuncDecl,\n  //! @brief Item is an end of the function, see @ref CompilerFuncEnd.\n  kCompilerItemFuncEnd,\n  //! @brief Item is function return, see @ref CompilerFuncRet.\n  kCompilerItemFuncRet\n};\n\n// ============================================================================\n// [AsmJit::kError]\n// ============================================================================\n\n//! @brief Error codes.\nenum kError\n{\n  //! @brief No error (success).\n  //!\n  //! This is default state and state you want.\n  kErrorOk = 0,\n\n  //! @brief Memory allocation error (@c ASMJIT_MALLOC returned @c NULL).\n  kErrorNoHeapMemory = 1,\n  //! @brief Virtual memory allocation error (@c VirtualMemory returned @c NULL).\n  kErrorNoVirtualMemory = 2,\n\n  //! @brief Unknown instruction. This happens only if instruction code is\n  //! out of bounds. Shouldn't happen.\n  kErrorUnknownInstruction = 3,\n  //! @brief Illegal instruction, usually generated by AsmJit::Assembler\n  //! class when emitting instruction opcode. If this error is generated the\n  //! target buffer is not affected by this invalid instruction.\n  //!\n  //! You can also get this error code if you are under x64 (64-bit x86) and\n  //! you tried to decode instruction using AH, BH, CH or DH register with REX\n  //! prefix. These registers can't be accessed if REX prefix is used and AsmJit\n  //! didn't check for this situation in intrinsics (@c Compiler takes care of\n  //! this and rearrange registers if needed).\n  //!\n  //! Examples that will raise @c kErrorIllegalInstruction error (a is\n  //! @c Assembler instance):\n  //!\n  //! @code\n  //! a.mov(dword_ptr(eax), al); // Invalid address size.\n  //! a.mov(byte_ptr(r10), ah);  // Undecodable instruction (AH used with r10\n  //!                            // which can be encoded only using REX prefix)\n  //! @endcode\n  //!\n  //! @note In debug mode you get assertion failure instead of setting error\n  //! code.\n  kErrorIllegalInstruction = 4,\n  //! @brief Illegal addressing used (unencodable).\n  kErrorIllegalAddressing = 5,\n  //! @brief Short jump instruction used, but displacement is out of bounds.\n  kErrorIllegalShortJump = 6,\n\n  //! @brief No function defined.\n  kErrorNoFunction = 7,\n  //! @brief Function generation is not finished by using @c Compiler::endFunc()\n  //! or something bad happened during generation related to function. This can\n  //! be missing compiler item, etc...\n  kErrorIncompleteFunction = 8,\n\n  //! @brief Compiler can't allocate registers, because all of them are used.\n  //!\n  //! @note AsmJit is able to spill registers so this error really shouldn't\n  //! happen unless all registers have priority 0 (which means never spill).\n  kErrorNoRegisters = 9,\n  //! @brief Compiler can't allocate one register to multiple destinations.\n  //!\n  //! This error can only happen using special instructions like cmpxchg8b and\n  //! others where there are more destination operands (implicit).\n  kErrorOverlappedRegisters = 10,\n\n  //! @brief Tried to call function using incompatible argument.\n  kErrorIncompatibleArgumentType = 11,\n  //! @brief Incompatible return value.\n  kErrorIncompatibleReturnType = 12,\n\n  //! @brief Count of error codes by AsmJit. Can grow in future.\n  kErrorCount\n};\n\n// ============================================================================\n// [AsmJit::API]\n// ============================================================================\n\n//! @brief Translates error code (see @c kError) into text representation.\nASMJIT_API const char* getErrorString(uint32_t error);\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_DEFS_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/func.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/func.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n} // AsmJit\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/func.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_FUNC_H\n#define _ASMJIT_CORE_FUNC_H\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [Forward Declaration]\n// ============================================================================\n\ntemplate<typename T>\nstruct TypeId;\n\n// ============================================================================\n// [AsmJit::TypeId]\n// ============================================================================\n\n#if defined(ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION)\n\n#define ASMJIT_DECLARE_TYPE_CORE(_PtrId_) \\\n  template<typename T> \\\n  struct TypeId \\\n  { \\\n    enum \\\n    { \\\n      Id = static_cast<int>(::AsmJit::kVarTypeInvalid) \\\n    }; \\\n  }; \\\n  \\\n  template<typename T> \\\n  struct TypeId<T*> { enum { Id = _PtrId_ }; }\n\n#else\n\n// Code without partial template specialization is a bit complex. We need to\n// determine whether the size of the return value of this function is equal\n// to sizeof(char) or sizeof(void*). Any sizeof() can be used to distinguish\n// between these two, but these are commonly used in other libraries as well.\ntemplate<typename T>\nchar TypeId_NoPtiHelper(T*(*)());\n// And specialization.\nvoid* TypeId_NoPtiHelper(...);\n\n#define ASMJIT_DECLARE_TYPE_CORE(_PtrId_) \\\n  template<typename T> \\\n  struct TypeId \\\n  { \\\n    enum \\\n    { \\\n      Id = (sizeof( ::AsmJit::TypeId_NoPtiHelper((T(*)())0) ) == sizeof(char) \\\n        ? static_cast<int>(_PtrId_) \\\n        : static_cast<int>(::AsmJit::kVarTypeInvalid)) \\\n    }; \\\n  }\n\n#endif // ASMJIT_HAS_PARTIAL_TEMPLATE_SPECIALIZATION\n\n//! @brief Declare C/C++ type-id mapped to @c AsmJit::kX86VarType.\n#define ASMJIT_DECLARE_TYPE_ID(_T_, _Id_) \\\n  template<> \\\n  struct TypeId<_T_> { enum { Id = _Id_ }; }\n\n// ============================================================================\n// [AsmJit::FuncArg]\n// ============================================================================\n\n//! @brief Function argument translated from @ref FuncPrototype.\nstruct FuncArg\n{\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  inline uint32_t getVarType() const\n  { return _varType; }\n\n  inline uint32_t getRegIndex() const\n  { return _regIndex; }\n\n  inline bool hasRegIndex() const\n  { return _regIndex != kRegIndexInvalid; }\n\n  inline int32_t getStackOffset() const\n  { return static_cast<int32_t>(_stackOffset); }\n\n  inline bool hasStackOffset() const\n  { return _stackOffset != kFuncStackInvalid; }\n\n  //! @brief Get whether the argument is assigned, for private use only.\n  inline bool isAssigned() const\n  { return (_regIndex != kRegIndexInvalid) | (_stackOffset != kFuncStackInvalid); }\n\n  // --------------------------------------------------------------------------\n  // [Reset]\n  // --------------------------------------------------------------------------\n\n  //! @brief Reset the function argument to \"unassigned state\".\n  inline void reset()\n  { _packed = 0xFFFFFFFF; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  union\n  {\n    struct\n    {\n      //! @brief Variable type, see @c kVarType.\n      uint8_t _varType;\n      //! @brief Register index is argument is passed through register.\n      uint8_t _regIndex;\n      //! @brief Stack offset if argument is passed through stack.\n      int16_t _stackOffset;\n    };\n\n    //! @brief All members packed into single 32-bit integer.\n    uint32_t _packed;\n  };\n};\n\n// ============================================================================\n// [AsmJit::FuncPrototype]\n// ============================================================================\n\n//! @brief Function prototype.\n//!\n//! Function prototype contains information about function return type, count\n//! of arguments and their types. Function definition is low level structure\n//! which doesn't contain platform or calling convention specific information.\nstruct FuncPrototype\n{\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get function return value.\n  inline uint32_t getReturnType() const\n  { return _returnType; }\n\n  //! @brief Get count of function arguments.\n  inline uint32_t getArgumentsCount() const\n  { return _argumentsCount; }\n\n  //! @brief Get argument at index @a id.\n  inline uint32_t getArgument(uint32_t id) const\n  {\n    ASMJIT_ASSERT(id < _argumentsCount);\n    return _arguments[id];\n  }\n\n  //! @brief Get function arguments' IDs.\n  inline const uint32_t* getArguments() const\n  { return _arguments; }\n\n  //! @brief Set function definition - return type and arguments.\n  inline void _setPrototype(uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount)\n  {\n    _returnType = returnType;\n    _arguments = arguments;\n    _argumentsCount = argumentsCount;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  uint32_t _returnType;\n  uint32_t _argumentsCount;\n  const uint32_t* _arguments;\n};\n\n// ============================================================================\n// [AsmJit::FuncDecl]\n// ============================================================================\n\n//! @brief Function declaration.\nstruct FuncDecl\n{\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get function return value or @ref kInvalidValue if it's void.\n  inline uint32_t getReturnType() const\n  { return _returnType; }\n\n  //! @brief Get count of function arguments.\n  inline uint32_t getArgumentsCount() const\n  { return _argumentsCount; }\n\n  //! @brief Get function arguments array.\n  inline FuncArg* getArguments()\n  { return _arguments; }\n\n  //! @brief Get function arguments array (const).\n  inline const FuncArg* getArguments() const\n  { return _arguments; }\n\n  //! @brief Get function argument at index @a index.\n  inline FuncArg& getArgument(size_t index)\n  {\n    ASMJIT_ASSERT(index < static_cast<size_t>(_argumentsCount));\n    return _arguments[index];\n  }\n\n  //! @brief Get function argument at index @a index.\n  inline const FuncArg& getArgument(size_t index) const\n  {\n    ASMJIT_ASSERT(index < static_cast<size_t>(_argumentsCount));\n    return _arguments[index];\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Function return type.\n  uint8_t _returnType;\n  //! @brief Count of arguments (in @c _argumentsList).\n  uint8_t _argumentsCount;\n  //! @brief Reserved for future use (alignment).\n  uint8_t _reserved0[2];\n\n  //! @brief Function arguments array.\n  FuncArg _arguments[kFuncArgsMax];\n};\n\n// ============================================================================\n// [AsmJit::FuncBuilderX]\n// ============================================================================\n\n//! @brief Custom function builder for up to 32 function arguments.\nstruct FuncBuilderX : public FuncPrototype\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline FuncBuilderX()\n  { _setPrototype(kVarTypeInvalid, _argumentsData, 0); }\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  template<typename T>\n  inline void setReturnTypeT()\n  { setReturnTypeRaw(TypeId<ASMJIT_TYPE_TO_TYPE(T)>::Id); }\n\n  template<typename T>\n  inline void setArgumentT(uint32_t id)\n  { setArgumentRaw(id, TypeId<ASMJIT_TYPE_TO_TYPE(T)>::Id); }\n\n  template<typename T>\n  inline void addArgumentT()\n  { addArgumentRaw(TypeId<ASMJIT_TYPE_TO_TYPE(T)>::Id); }\n\n  inline void setReturnTypeRaw(uint32_t returnType)\n  { _returnType = returnType; }\n\n  inline void setArgumentRaw(uint32_t id, uint32_t type)\n  {\n    ASMJIT_ASSERT(id < _argumentsCount);\n    _argumentsData[id] = type;\n  }\n\n  inline void addArgumentRaw(uint32_t type)\n  {\n    ASMJIT_ASSERT(_argumentsCount < kFuncArgsMax);\n    _argumentsData[_argumentsCount++] = type;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  uint32_t _argumentsData[kFuncArgsMax];\n};\n\n//! @brief Class used to build function without arguments.\ntemplate<typename RET>\nstruct FuncBuilder0 : public FuncPrototype\n{\n  inline FuncBuilder0()\n  {\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, NULL, 0);\n  }\n};\n\n//! @brief Class used to build function with 1 argument.\ntemplate<typename RET, typename P0>\nstruct FuncBuilder1 : public FuncPrototype\n{\n  inline FuncBuilder1()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 2 arguments.\ntemplate<typename RET, typename P0, typename P1>\nstruct FuncBuilder2 : public FuncPrototype\n{\n  inline FuncBuilder2()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 3 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2>\nstruct FuncBuilder3 : public FuncPrototype\n{\n  inline FuncBuilder3()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 4 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2, typename P3>\nstruct FuncBuilder4 : public FuncPrototype\n{\n  inline FuncBuilder4()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P3)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 5 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2, typename P3, typename P4>\nstruct FuncBuilder5 : public FuncPrototype\n{\n  inline FuncBuilder5()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P3)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P4)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 6 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2, typename P3, typename P4, typename P5>\nstruct FuncBuilder6 : public FuncPrototype\n{\n  inline FuncBuilder6()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P3)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P4)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P5)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 7 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>\nstruct FuncBuilder7 : public FuncPrototype\n{\n  inline FuncBuilder7()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P3)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P4)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P5)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P6)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 8 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>\nstruct FuncBuilder8 : public FuncPrototype\n{\n  inline FuncBuilder8()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P3)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P4)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P5)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P6)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P7)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 9 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>\nstruct FuncBuilder9 : public FuncPrototype\n{\n  inline FuncBuilder9()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P3)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P4)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P5)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P6)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P7)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P8)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n//! @brief Class used to build function with 10 arguments.\ntemplate<typename RET, typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9>\nstruct FuncBuilder10 : public FuncPrototype\n{\n  inline FuncBuilder10()\n  {\n    static const uint32_t arguments[] =\n    {\n      TypeId<ASMJIT_TYPE_TO_TYPE(P0)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P1)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P2)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P3)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P4)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P5)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P6)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P7)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P8)>::Id,\n      TypeId<ASMJIT_TYPE_TO_TYPE(P9)>::Id\n    };\n\n    _setPrototype(TypeId<ASMJIT_TYPE_TO_TYPE(RET)>::Id, arguments, ASMJIT_ARRAY_SIZE(arguments));\n  }\n};\n\n} // AsmJit namespace \n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_FUNC_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/intutil.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_INTUTIL_H\n#define _ASMJIT_CORE_INTUTIL_H\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::I32FPUnion]\n// ============================================================================\n\n//! @internal\n//!\n//! @brief used to cast from float to 32-bit integer and vica versa.\nunion I32FPUnion\n{\n  //! @brief 32-bit signed integer value.\n  int32_t i;\n  //! @brief 32-bit SP-FP value.\n  float f;\n};\n\n// ============================================================================\n// [AsmJit::I64FPUnion]\n// ============================================================================\n\n//! @internal\n//!\n//! @brief used to cast from double to 64-bit integer and vica versa.\nunion I64FPUnion\n{\n  //! @brief 64-bit signed integer value.\n  int64_t i;\n  //! @brief 64-bit DP-FP value.\n  double f;\n};\n\n// ============================================================================\n// [AsmJit::IntUtil]\n// ============================================================================\n\nnamespace IntUtil\n{\n  // --------------------------------------------------------------------------\n  // [Min/Max]\n  // --------------------------------------------------------------------------\n\n  // NOTE: Because some environments declare min() and max() as macros, we\n  // decided to use different name so we never collide.\n\n  template<typename T>\n  static inline T _min(const T& a, const T& b) { return a < b ? a : b; }\n  template<typename T>\n  static inline T _max(const T& a, const T& b) { return a > b ? a : b; }\n\n  // --------------------------------------------------------------------------\n  // [Limits]\n  // --------------------------------------------------------------------------\n\n  template<typename T>\n  static inline T maxValue() { return ~T(0); }\n\n  // --------------------------------------------------------------------------\n  // [IsInt / IsUInt]\n  // --------------------------------------------------------------------------\n\n  //! @brief Returns @c true if a given integer @a x is signed 8-bit integer\n  static inline bool isInt8(intptr_t x) { return x >= -128 && x <= 127; }\n  //! @brief Returns @c true if a given integer @a x is unsigned 8-bit integer\n  static inline bool isUInt8(intptr_t x) { return x >= 0 && x <= 255; }\n\n  //! @brief Returns @c true if a given integer @a x is signed 16-bit integer\n  static inline bool isInt16(intptr_t x) { return x >= -32768 && x <= 32767; }\n  //! @brief Returns @c true if a given integer @a x is unsigned 16-bit integer\n  static inline bool isUInt16(intptr_t x) { return x >= 0 && x <= 65535; }\n\n  //! @brief Returns @c true if a given integer @a x is signed 16-bit integer\n  static inline bool isInt32(intptr_t x)\n  {\n#if defined(ASMJIT_X86)\n    return true;\n#else\n    return x >= ASMJIT_INT64_C(-2147483648) && x <= ASMJIT_INT64_C(2147483647);\n#endif\n  }\n  //! @brief Returns @c true if a given integer @a x is unsigned 16-bit integer\n  static inline bool isUInt32(intptr_t x)\n  {\n#if defined(ASMJIT_X86)\n    return x >= 0;\n#else\n    return x >= 0 && x <= ASMJIT_INT64_C(4294967295);\n#endif\n  }\n\n  // --------------------------------------------------------------------------\n  // [Masking]\n  // --------------------------------------------------------------------------\n\n  static inline uint32_t maskFromIndex(uint32_t x)\n  {\n    ASMJIT_ASSERT(x < 32);\n    return (1U << x);\n  }\n\n  static inline uint32_t maskUpToIndex(uint32_t x)\n  {\n    if (x >= 32)\n      return 0xFFFFFFFF;\n    else\n      return (1U << x) - 1;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Bits]\n  // --------------------------------------------------------------------------\n\n  // From http://graphics.stanford.edu/~seander/bithacks.html .\n  static inline uint32_t bitCount(uint32_t x)\n  {\n    x = x - ((x >> 1) & 0x55555555U);\n    x = (x & 0x33333333U) + ((x >> 2) & 0x33333333U);\n    return (((x + (x >> 4)) & 0x0F0F0F0FU) * 0x01010101U) >> 24;\n  }\n\n  static inline uint32_t findFirstBit(uint32_t mask)\n  {\n    for (uint32_t i = 0; i < sizeof(uint32_t) * 8; i++, mask >>= 1)\n    {\n      if (mask & 0x1)\n        return i;\n    }\n\n    // kInvalidValue.\n    return 0xFFFFFFFF;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Alignment]\n  // --------------------------------------------------------------------------\n\n  template<typename T>\n  static inline bool isAligned(T base, T alignment)\n  {\n    return (base % alignment) == 0;\n  }\n\n  //! @brief Align @a base to @a alignment.\n  template<typename T>\n  static inline T align(T base, T alignment)\n  {\n    return (base + (alignment - 1)) & ~(alignment - 1);\n  }\n\n  //! @brief Get delta required to align @a base to @a alignment.\n  template<typename T>\n  static inline T delta(T base, T alignment)\n  {\n    return align(base, alignment) - base;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Round]\n  // --------------------------------------------------------------------------\n\n  template<typename T>\n  static inline T roundUp(T base, T alignment)\n  {\n    T over = base % alignment;\n    return base + (over > 0 ? alignment - over : 0);\n  }\n\n  template<typename T>\n  static inline T roundUpToPowerOf2(T base)\n  {\n    // Implementation is from \"Hacker's Delight\" by Henry S. Warren, Jr.,\n    // figure 3-3, page 48, where the function is called clp2.\n    base -= 1;\n\n    // I'm trying to make this portable and MSVC strikes me the warning C4293:\n    //   \"Shift count negative or too big, undefined behavior\"\n    // Fixing...\n#if defined(_MSC_VER)\n# pragma warning(push)\n# pragma warning(disable: 4293)\n#endif // _MSC_VER\n\n    base = base | (base >> 1);\n    base = base | (base >> 2);\n    base = base | (base >> 4);\n\n    if (sizeof(T) >= 2) base = base | (base >>  8);\n    if (sizeof(T) >= 4) base = base | (base >> 16);\n    if (sizeof(T) >= 8) base = base | (base >> 32);\n\n#if defined(_MSC_VER)\n# pragma warning(pop)\n#endif // _MSC_VER\n\n    return base + 1;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Cast]\n  // --------------------------------------------------------------------------\n\n  //! @brief Binary cast from 32-bit integer to SP-FP value (@c float).\n  static inline float int32AsFloat(int32_t i)\n  {\n    I32FPUnion u;\n    u.i = i;\n    return u.f;\n  }\n\n  //! @brief Binary cast SP-FP value (@c float) to 32-bit integer.\n  static inline int32_t floatAsInt32(float f)\n  {\n    I32FPUnion u;\n    u.f = f;\n    return u.i;\n  }\n\n  //! @brief Binary cast from 64-bit integer to DP-FP value (@c double).\n  static inline double int64AsDouble(int64_t i)\n  {\n    I64FPUnion u;\n    u.i = i;\n    return u.f;\n  }\n\n  //! @brief Binary cast from DP-FP value (@c double) to 64-bit integer.\n  static inline int64_t doubleAsInt64(double f)\n  {\n    I64FPUnion u;\n    u.f = f;\n    return u.i;\n  }\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_INTUTIL_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/lock.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_LOCK_H\n#define _ASMJIT_CORE_LOCK_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n\n// [Dependencies - Windows]\n#if defined(ASMJIT_WINDOWS)\n# include <windows.h>\n#endif // ASMJIT_WINDOWS\n\n// [Dependencies - Posix]\n#if defined(ASMJIT_POSIX)\n# include <pthread.h>\n#endif // ASMJIT_POSIX\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::Lock]\n// ============================================================================\n\n//! @brief Lock - used in thread-safe code for locking.\nstruct Lock\n{\n  ASMJIT_NO_COPY(Lock)\n\n  // --------------------------------------------------------------------------\n  // [Windows]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_WINDOWS)\n  typedef CRITICAL_SECTION Handle;\n\n  //! @brief Create a new @ref Lock instance.\n  inline Lock() { InitializeCriticalSection(&_handle); }\n  //! @brief Destroy the @ref Lock instance.\n  inline ~Lock() { DeleteCriticalSection(&_handle); }\n\n  //! @brief Lock.\n  inline void lock() { EnterCriticalSection(&_handle); }\n  //! @brief Unlock.\n  inline void unlock() { LeaveCriticalSection(&_handle); }\n\n#endif // ASMJIT_WINDOWS\n\n  // --------------------------------------------------------------------------\n  // [Posix]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_POSIX)\n  typedef pthread_mutex_t Handle;\n\n  //! @brief Create a new @ref Lock instance.\n  inline Lock() { pthread_mutex_init(&_handle, NULL); }\n  //! @brief Destroy the @ref Lock instance.\n  inline ~Lock() { pthread_mutex_destroy(&_handle); }\n\n  //! @brief Lock.\n  inline void lock() { pthread_mutex_lock(&_handle); }\n  //! @brief Unlock.\n  inline void unlock() { pthread_mutex_unlock(&_handle); }\n#endif // ASMJIT_POSIX\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get handle.\n  inline Handle& getHandle() { return _handle; }\n  //! @overload\n  inline const Handle& getHandle() const { return _handle; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Handle.\n  Handle _handle;\n};\n\n// ============================================================================\n// [AsmJit::AutoLock]\n// ============================================================================\n\n//! @brief Scope auto locker.\nstruct AutoLock\n{\n  ASMJIT_NO_COPY(AutoLock)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Locks @a target.\n  inline AutoLock(Lock& target) : _target(target)\n  {\n    _target.lock();\n  }\n\n  //! @brief Unlocks target.\n  inline ~AutoLock()\n  {\n    _target.unlock();\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Pointer to target (lock).\n  Lock& _target;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_LOCK_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/logger.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/logger.h\"\n\n// [Dependencies - C]\n#include <stdarg.h>\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Logger - Construction / Destruction]\n// ============================================================================\n\nLogger::Logger() :\n  _flags(kLoggerIsEnabled | kLoggerIsUsed)\n{\n  memset(_instructionPrefix, 0, ASMJIT_ARRAY_SIZE(_instructionPrefix));\n}\n\nLogger::~Logger()\n{\n}\n\n// ============================================================================\n// [AsmJit::Logger - Logging]\n// ============================================================================\n\nvoid Logger::logFormat(const char* fmt, ...)\n{\n  char buf[1024];\n  size_t len;\n\n  va_list ap;\n  va_start(ap, fmt);\n  len = vsnprintf(buf, 1023, fmt, ap);\n  va_end(ap);\n\n  logString(buf, len);\n}\n\n// ============================================================================\n// [AsmJit::Logger - Enabled]\n// ============================================================================\n\nvoid Logger::setEnabled(bool enabled)\n{\n  if (enabled)\n    _flags |= kLoggerIsEnabled | kLoggerIsUsed;\n  else\n    _flags &= ~(kLoggerIsEnabled | kLoggerIsUsed);\n}\n\n// ============================================================================\n// [AsmJit::Logger - LogBinary]\n// ============================================================================\n\nvoid Logger::setLogBinary(bool value)\n{\n  if (value)\n    _flags |= kLoggerOutputBinary;\n  else\n    _flags &= ~kLoggerOutputBinary;\n}\n\n// ============================================================================\n// [AsmJit::Logger - HexImmediate]\n// ============================================================================\n\nvoid Logger::setHexImmediate(bool value)\n{\n  if (value)\n    _flags |= kLoggerOutputHexImmediate;\n  else\n    _flags &= ~kLoggerOutputHexImmediate;\n}\n\n// ============================================================================\n// [AsmJit::Logger - HexDisplacement]\n// ============================================================================\n\nvoid Logger::setHexDisplacement(bool value)\n{\n  if (value)\n    _flags |= kLoggerOutputHexDisplacement;\n  else\n    _flags &= ~kLoggerOutputHexDisplacement;\n}\n\n// ============================================================================\n// [AsmJit::Logger - InstructionPrefix]\n// ============================================================================\n\nvoid Logger::setInstructionPrefix(const char* prefix)\n{\n  memset(_instructionPrefix, 0, ASMJIT_ARRAY_SIZE(_instructionPrefix));\n\n  if (!prefix)\n    return;\n\n  size_t length = strnlen(prefix, ASMJIT_ARRAY_SIZE(_instructionPrefix) - 1);\n  memcpy(_instructionPrefix, prefix, length);\n}\n\n// ============================================================================\n// [AsmJit::FileLogger - Construction / Destruction]\n// ============================================================================\n\nFileLogger::FileLogger(FILE* stream)\n  : _stream(NULL)\n{\n  setStream(stream);\n}\n\nFileLogger::~FileLogger()\n{\n}\n\n// ============================================================================\n// [AsmJit::FileLogger - Accessors]\n// ============================================================================\n\n//! @brief Set file stream.\nvoid FileLogger::setStream(FILE* stream)\n{\n  _stream = stream;\n\n  if (isEnabled() && _stream != NULL)\n    _flags |= kLoggerIsUsed;\n  else\n    _flags &= ~kLoggerIsUsed;\n}\n\n// ============================================================================\n// [AsmJit::FileLogger - Logging]\n// ============================================================================\n\nvoid FileLogger::logString(const char* buf, size_t len)\n{\n  if (!isUsed())\n    return;\n\n  if (len == kInvalidSize)\n    len = strlen(buf);\n\n  fwrite(buf, 1, len, _stream);\n}\n\n// ============================================================================\n// [AsmJit::FileLogger - Enabled]\n// ============================================================================\n\nvoid FileLogger::setEnabled(bool enabled)\n{\n  if (enabled)\n    _flags |= kLoggerIsEnabled | (_stream != NULL ? kLoggerIsUsed : 0);\n  else\n    _flags &= ~(kLoggerIsEnabled | kLoggerIsUsed);\n}\n\n// ============================================================================\n// [AsmJit::StringLogger - Construction / Destruction]\n// ============================================================================\n\nStringLogger::StringLogger()\n{\n}\n\nStringLogger::~StringLogger()\n{\n}\n\n// ============================================================================\n// [AsmJit::StringLogger - Logging]\n// ============================================================================\n\nvoid StringLogger::logString(const char* buf, size_t len)\n{\n  if (!isUsed())\n    return;\n  _stringBuilder.appendString(buf, len);\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/logger.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_LOGGER_H\n#define _ASMJIT_CORE_LOGGER_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n#include \"../core/defs.h\"\n#include \"../core/stringbuilder.h\"\n\n// [Dependencies - C]\n#include <stdarg.h>\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Logging\n//! @{\n\n// ============================================================================\n// [AsmJit::Logger]\n// ============================================================================\n\n//! @brief Abstract logging class.\n//!\n//! This class can be inherited and reimplemented to fit into your logging\n//! subsystem. When reimplementing use @c AsmJit::Logger::log() method to\n//! log into your stream.\n//!\n//! This class also contain @c _enabled member that can be used to enable\n//! or disable logging.\nstruct Logger\n{\n  ASMJIT_NO_COPY(Logger)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create logger.\n  ASMJIT_API Logger();\n  //! @brief Destroy logger.\n  ASMJIT_API virtual ~Logger();\n\n  // --------------------------------------------------------------------------\n  // [Logging]\n  // --------------------------------------------------------------------------\n\n  //! @brief Abstract method to log output.\n  //!\n  //! Default implementation that is in @c AsmJit::Logger is to do nothing.\n  //! It's virtual to fit to your logging system.\n  virtual void logString(const char* buf, size_t len = kInvalidSize) = 0;\n\n  //! @brief Log formatter message (like sprintf) sending output to @c logString() method.\n  ASMJIT_API virtual void logFormat(const char* fmt, ...);\n\n  // --------------------------------------------------------------------------\n  // [Flags]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get logger flags (used internally by Assembler/Compiler).\n  inline uint32_t getFlags() const { return _flags; }\n\n  // --------------------------------------------------------------------------\n  // [Enabled]\n  // --------------------------------------------------------------------------\n\n  //! @brief Return @c true if logging is enabled.\n  inline bool isEnabled() const { return (_flags & kLoggerIsEnabled) != 0; }\n\n  //! @brief Set logging to enabled or disabled.\n  ASMJIT_API virtual void setEnabled(bool enabled);\n\n  // --------------------------------------------------------------------------\n  // [Used]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether the logger should be used.\n  inline bool isUsed() const { return (_flags & kLoggerIsUsed) != 0; }\n\n  // --------------------------------------------------------------------------\n  // [LogBinary]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether logging of binary output is enabled.\n  inline bool getLogBinary() const { return (_flags & kLoggerOutputBinary) != 0; }\n  //! @brief Enable or disable binary output logging.\n  ASMJIT_API void setLogBinary(bool value);\n\n  // --------------------------------------------------------------------------\n  // [HexImmediate]\n  // --------------------------------------------------------------------------\n\n  inline bool getHexImmediate() const { return (_flags & kLoggerOutputHexImmediate) != 0; }\n  ASMJIT_API void setHexImmediate(bool value);\n\n  // --------------------------------------------------------------------------\n  // [HexDisplacement]\n  // --------------------------------------------------------------------------\n\n  inline bool getHexDisplacement() const { return (_flags & kLoggerOutputHexDisplacement) != 0; }\n  ASMJIT_API void setHexDisplacement(bool value);\n\n  // --------------------------------------------------------------------------\n  // [InstructionPrefix]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get instruction prefix.\n  inline const char* getInstructionPrefix() const { return _instructionPrefix; }\n  //! @brief Set instruction prefix.\n  ASMJIT_API void setInstructionPrefix(const char* prefix);\n  //! @brief Reset instruction prefix.\n  inline void resetInstructionPrefix() { setInstructionPrefix(NULL); }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Flags, see @ref kLoggerFlag.\n  uint32_t _flags;\n\n  //! @brief Instrictions and macro-instructions prefix.\n  char _instructionPrefix[12];\n};\n\n// ============================================================================\n// [AsmJit::FileLogger]\n// ============================================================================\n\n//! @brief Logger that can log to standard C @c FILE* stream.\nstruct FileLogger : public Logger\n{\n  ASMJIT_NO_COPY(FileLogger)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @c FileLogger.\n  //! @param stream FILE stream where logging will be sent (can be @c NULL\n  //! to disable logging).\n  ASMJIT_API FileLogger(FILE* stream = NULL);\n\n  //! @brief Destroy the @ref FileLogger.\n  ASMJIT_API virtual ~FileLogger();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get @c FILE* stream.\n  //!\n  //! @note Return value can be @c NULL.\n  inline FILE* getStream() const { return _stream; }\n\n  //! @brief Set @c FILE* stream.\n  //!\n  //! @param stream @c FILE stream where to log output (can be @c NULL to\n  //! disable logging).\n  ASMJIT_API void setStream(FILE* stream);\n\n  // --------------------------------------------------------------------------\n  // [Logging]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void logString(const char* buf, size_t len = kInvalidSize);\n\n  // --------------------------------------------------------------------------\n  // [Enabled]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void setEnabled(bool enabled);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief C file stream.\n  FILE* _stream;\n};\n\n// ============================================================================\n// [AsmJit::StringLogger]\n// ============================================================================\n\n//! @brief String logger.\nstruct StringLogger : public Logger\n{\n  ASMJIT_NO_COPY(StringLogger)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create new @ref StringLogger.\n  ASMJIT_API StringLogger();\n\n  //! @brief Destroy the @ref StringLogger.\n  ASMJIT_API virtual ~StringLogger();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get <code>char*</code> pointer which represents the serialized\n  //! string.\n  //!\n  //! The pointer is owned by @ref StringLogger, it can't be modified or freed.\n  inline const char* getString() const { return _stringBuilder.getData(); }\n\n  //! @brief Clear the serialized string.\n  inline void clearString() { _stringBuilder.clear(); }\n\n  // --------------------------------------------------------------------------\n  // [Logging]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void logString(const char* buf, size_t len = kInvalidSize);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Output.\n  StringBuilder _stringBuilder;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_LOGGER_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/memorymanager.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/lock.h\"\n#include \"../core/memorymanager.h\"\n#include \"../core/virtualmemory.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\n// This file contains implementation of virtual memory management for AsmJit\n// library. The initial concept is to keep this implementation simple but \n// efficient. There are several goals I decided to write implementation myself.\n//\n// Goals:\n// - We need usually to allocate blocks of 64 bytes long and more.\n// - Alignment of allocated blocks is large - 32 bytes or 64 bytes.\n// - Keep memory manager information outside allocated virtual memory pages\n//   (these pages allows execution of code).\n// - Keep implementation small.\n//\n// I think that implementation is not small and probably not too much readable,\n// so there is small know how.\n//\n// - Implementation is based on bit arrays and binary trees. Bit arrays \n//   contains information about allocated and unused blocks of memory. Each\n//   block size describes MemNode::density member. Count of blocks are\n//   stored in MemNode::blocks member. For example if density is 64 and \n//   count of blocks is 20, memory node contains 64*20 bytes of memory and\n//   smallest possible allocation (and also alignment) is 64 bytes. So density\n//   describes also memory alignment. Binary trees are used to enable fast\n//   lookup into all addresses allocated by memory manager instance. This is\n//   used mainly in MemoryManagerPrivate::free().\n//\n//   Bit array looks like this (empty = unused, X = used) - Size of block 64\n//   -------------------------------------------------------------------------\n//   | |X|X| | | | | |X|X|X|X|X|X| | | | | | | | | | | | |X| | | | |X|X|X| | |\n//   -------------------------------------------------------------------------\n//   Bits array shows that there are 12 allocated blocks of 64 bytes, so total \n//   allocated size is 768 bytes. Maximum count of continuous blocks is 12\n//   (see largest gap).\n\nnamespace AsmJit {\n\n// ============================================================================\n// [Bits Manipulation]\n// ============================================================================\n\n#define BITS_PER_ENTITY (sizeof(size_t) * 8)\n\nstatic void _SetBit(size_t* buf, size_t index)\n{\n  size_t i = index / BITS_PER_ENTITY; // size_t[]\n  size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index\n\n  buf += i;\n  *buf |= (size_t)1 << j;\n}\n\nstatic void _ClearBit(size_t* buf, size_t index)\n{\n  size_t i = index / BITS_PER_ENTITY; // size_t[]\n  size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index\n\n  buf += i;\n  *buf &= ~((size_t)1 << j);\n}\n\nstatic void _SetBits(size_t* buf, size_t index, size_t len)\n{\n  if (len == 0) return;\n\n  size_t i = index / BITS_PER_ENTITY; // size_t[]\n  size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index\n\n  // How many bytes process in the first group.\n  size_t c = BITS_PER_ENTITY - j;\n  if (c > len) c = len;\n\n  // Offset.\n  buf += i;\n\n  *buf++ |= ((~(size_t)0) >> (BITS_PER_ENTITY - c)) << j;\n  len -= c;\n\n  while (len >= BITS_PER_ENTITY)\n  {\n    *buf++ = ~(size_t)0;\n    len -= BITS_PER_ENTITY;\n  }\n\n  if (len)\n  {\n    *buf |= ((~(size_t)0) >> (BITS_PER_ENTITY - len));\n  }\n}\n\nstatic void _ClearBits(size_t* buf, size_t index, size_t len)\n{\n  if (len == 0) return;\n\n  size_t i = index / BITS_PER_ENTITY; // size_t[]\n  size_t j = index % BITS_PER_ENTITY; // size_t[][] bit index\n\n  // How many bytes process in the first group.\n  size_t c = BITS_PER_ENTITY - j;\n  if (c > len) c = len;\n\n  // Offset.\n  buf += i;\n\n  *buf++ &= ~(((~(size_t)0) >> (BITS_PER_ENTITY - c)) << j);\n  len -= c;\n\n  while (len >= BITS_PER_ENTITY)\n  {\n    *buf++ = 0;\n    len -= BITS_PER_ENTITY;\n  }\n\n  if (len)\n  {\n    *buf &= (~(size_t)0) << len;\n  }\n}\n\n// ============================================================================\n// [AsmJit::MemNode]\n// ============================================================================\n\n#define M_DIV(x, y) ((x) / (y))\n#define M_MOD(x, y) ((x) % (y))\n\ntemplate<typename T>\nstruct RbNode\n{\n  // --------------------------------------------------------------------------\n  // [Node red-black tree tree, key is mem pointer].\n  // --------------------------------------------------------------------------\n\n  // Implementation is based on article by Julienne Walker (Public Domain),\n  // including C code and original comments. Thanks for the excellent article.\n\n  // Left[0] and right[1] nodes.\n  T* node[2];\n  // Whether the node is RED.\n  uint32_t red;\n\n  // --------------------------------------------------------------------------\n  // [Chunk Memory]\n  // --------------------------------------------------------------------------\n\n  // Virtual memory address.\n  uint8_t* mem;\n};\n\n// Get whether the node is red (NULL or node with red flag).\ntemplate<typename T>\ninline bool isRed(RbNode<T>* node)\n{\n  return node != NULL && node->red;\n}\n\nstruct MemNode : public RbNode<MemNode>\n{\n  // --------------------------------------------------------------------------\n  // [Node double-linked list]\n  // --------------------------------------------------------------------------\n\n  MemNode* prev;        // Prev node in list.\n  MemNode* next;        // Next node in list.\n\n  // --------------------------------------------------------------------------\n  // [Chunk Data]\n  // --------------------------------------------------------------------------\n\n  size_t size;          // How many bytes contain this node.\n  size_t blocks;        // How many blocks are here.\n  size_t density;       // Minimum count of allocated bytes in this node (also alignment).\n  size_t used;          // How many bytes are used in this node.\n  size_t largestBlock;  // Contains largest block that can be allocated.\n\n  size_t* baUsed;       // Contains bits about used blocks.\n                        // (0 = unused, 1 = used).\n  size_t* baCont;       // Contains bits about continuous blocks.\n                        // (0 = stop, 1 = continue).\n\n  // --------------------------------------------------------------------------\n  // [Methods]\n  // --------------------------------------------------------------------------\n\n  // Get available space.\n  inline size_t getAvailable() const { return size - used; }\n\n  inline void fillData(MemNode* other)\n  {\n    mem = other->mem;\n\n    size = other->size;\n    blocks = other->blocks;\n    density = other->density;\n    used = other->used;\n    largestBlock = other->largestBlock;\n    baUsed = other->baUsed;\n    baCont = other->baCont;\n  }\n};\n\n// ============================================================================\n// [AsmJit::M_Permanent]\n// ============================================================================\n\n//! @brief Permanent node.\nstruct PermanentNode\n{\n  uint8_t* mem;            // Base pointer (virtual memory address).\n  size_t size;             // Count of bytes allocated.\n  size_t used;             // Count of bytes used.\n  PermanentNode* prev;     // Pointer to prev chunk or NULL.\n\n  // Get available space.\n  inline size_t getAvailable() const { return size - used; }\n};\n\n// ============================================================================\n// [AsmJit::MemoryManagerPrivate]\n// ============================================================================\n\nstruct MemoryManagerPrivate\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_WINDOWS)\n  MemoryManagerPrivate();\n#else\n  MemoryManagerPrivate(HANDLE hProcess);\n#endif // ASMJIT_WINDOWS\n  ~MemoryManagerPrivate();\n\n  // --------------------------------------------------------------------------\n  // [Allocation]\n  // --------------------------------------------------------------------------\n\n  MemNode* createNode(size_t size, size_t density);\n\n  void* allocPermanent(size_t vsize);\n  void* allocFreeable(size_t vsize);\n\n  bool free(void* address);\n  bool shrink(void* address, size_t used);\n  void freeAll(bool keepVirtualMemory);\n\n  // Helpers to avoid ifdefs in the code.\n  inline uint8_t* allocVirtualMemory(size_t size, size_t* vsize)\n  {\n#if !defined(ASMJIT_WINDOWS)\n    return (uint8_t*)VirtualMemory::alloc(size, vsize, true);\n#else\n    return (uint8_t*)VirtualMemory::allocProcessMemory(_hProcess, size, vsize, true);\n#endif\n  }\n\n  inline void freeVirtualMemory(void* vmem, size_t vsize)\n  {\n#if !defined(ASMJIT_WINDOWS)\n    VirtualMemory::free(vmem, vsize);\n#else\n    VirtualMemory::freeProcessMemory(_hProcess, vmem, vsize);\n#endif\n  }\n\n  // --------------------------------------------------------------------------\n  // [NodeList RB-Tree]\n  // --------------------------------------------------------------------------\n\n  bool checkTree();\n\n  void insertNode(MemNode* node);\n  MemNode* removeNode(MemNode* node);\n  MemNode* findPtr(uint8_t* mem);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_WINDOWS)\n  HANDLE _hProcess;            // Process where to allocate memory.\n#endif // ASMJIT_WINDOWS\n  Lock _lock;                  // Lock for thread safety.\n\n  size_t _newChunkSize;        // Default node size.\n  size_t _newChunkDensity;     // Default node density.\n  size_t _allocated;           // How many bytes are allocated.\n  size_t _used;                // How many bytes are used.\n\n  // Memory nodes list.\n  MemNode* _first;\n  MemNode* _last;\n  MemNode* _optimal;\n\n  // Memory nodes tree.\n  MemNode* _root;\n\n  // Permanent memory.\n  PermanentNode* _permanent;\n\n  // Whether to keep virtual memory after destroy.\n  bool _keepVirtualMemory;\n};\n\n// ============================================================================\n// [AsmJit::MemoryManagerPrivate - Construction / Destruction]\n// ============================================================================\n\n#if !defined(ASMJIT_WINDOWS)\nMemoryManagerPrivate::MemoryManagerPrivate() :\n#else\nMemoryManagerPrivate::MemoryManagerPrivate(HANDLE hProcess) :\n  _hProcess(hProcess),\n#endif\n  _newChunkSize(65536),\n  _newChunkDensity(64),\n  _allocated(0),\n  _used(0),\n  _root(NULL),\n  _first(NULL),\n  _last(NULL),\n  _optimal(NULL),\n  _permanent(NULL),\n  _keepVirtualMemory(false)\n{\n}\n\nMemoryManagerPrivate::~MemoryManagerPrivate()\n{\n  // Freeable memory cleanup - Also frees the virtual memory if configured to.\n  freeAll(_keepVirtualMemory);\n\n  // Permanent memory cleanup - Never frees the virtual memory.\n  PermanentNode* node = _permanent;\n  while (node)\n  {\n    PermanentNode* prev = node->prev;\n    ASMJIT_FREE(node);\n    node = prev;\n  }\n}\n\n// ============================================================================\n// [AsmJit::MemoryManagerPrivate - Allocation]\n// ============================================================================\n\n// Allocates virtual memory node and MemNode structure.\n//\n// Returns MemNode* on success, otherwise NULL.\nMemNode* MemoryManagerPrivate::createNode(size_t size, size_t density)\n{\n  size_t vsize;\n  uint8_t* vmem = allocVirtualMemory(size, &vsize);\n\n  // Out of memory.\n  if (vmem == NULL) return NULL;\n\n  size_t blocks = (vsize / density);\n  size_t bsize = (((blocks + 7) >> 3) + sizeof(size_t) - 1) & ~(size_t)(sizeof(size_t) - 1);\n\n  MemNode* node = reinterpret_cast<MemNode*>(ASMJIT_MALLOC(sizeof(MemNode)));\n  uint8_t* data = reinterpret_cast<uint8_t*>(ASMJIT_MALLOC(bsize * 2));\n\n  // Out of memory.\n  if (node == NULL || data == NULL)\n  {\n    freeVirtualMemory(vmem, vsize);\n    if (node) ASMJIT_FREE(node);\n    if (data) ASMJIT_FREE(data);\n    return NULL;\n  }\n\n  // Initialize RbNode data.\n  node->node[0] = NULL;\n  node->node[1] = NULL;\n  node->red = 1;\n  node->mem = vmem;\n\n  // Initialize MemNode data.\n  node->prev = NULL;\n  node->next = NULL;\n\n  node->size = vsize;\n  node->blocks = blocks;\n  node->density = density;\n  node->used = 0;\n  node->largestBlock = vsize;\n\n  memset(data, 0, bsize * 2);\n  node->baUsed = reinterpret_cast<size_t*>(data);\n  node->baCont = reinterpret_cast<size_t*>(data + bsize);\n\n  return node;\n}\n\nvoid* MemoryManagerPrivate::allocPermanent(size_t vsize)\n{\n  static const size_t permanentAlignment = 32;\n  static const size_t permanentNodeSize  = 32768;\n\n  size_t over = vsize % permanentAlignment;\n  if (over)\n    over = permanentAlignment - over;\n\n  size_t alignedSize = vsize + over;\n  AutoLock locked(_lock);\n\n  PermanentNode* node = _permanent;\n\n  // Try to find space in allocated chunks.\n  while (node && alignedSize > node->getAvailable()) node = node->prev;\n\n  // Or allocate new node.\n  if (node == NULL)\n  {\n    size_t nodeSize = permanentNodeSize;\n    if (vsize > nodeSize) nodeSize = vsize;\n\n    node = (PermanentNode*)ASMJIT_MALLOC(sizeof(PermanentNode));\n    // Out of memory.\n    if (node == NULL) return NULL;\n\n    node->mem = allocVirtualMemory(nodeSize, &node->size);\n    // Out of memory.\n    if (node->mem == NULL) \n    {\n      ASMJIT_FREE(node);\n      return NULL;\n    }\n\n    node->used = 0;\n    node->prev = _permanent;\n    _permanent = node;\n  }\n\n  // Finally, copy function code to our space we reserved for.\n  uint8_t* result = node->mem + node->used;\n\n  // Update Statistics.\n  node->used += alignedSize;\n  _used += alignedSize;\n\n  // Code can be null to only reserve space for code.\n  return (void*)result;\n}\n\nvoid* MemoryManagerPrivate::allocFreeable(size_t vsize)\n{\n  size_t i;               // Current index.\n  size_t need;            // How many we need to be freed.\n  size_t minVSize;\n\n  // Align to 32 bytes (our default alignment).\n  vsize = (vsize + 31) & ~(size_t)31;\n  if (vsize == 0) return NULL;\n\n  AutoLock locked(_lock);\n  MemNode* node = _optimal;\n\n  minVSize = _newChunkSize;\n\n  // Try to find memory block in existing nodes.\n  while (node)\n  {\n    // Skip this node?\n    if ((node->getAvailable() < vsize) || \n        (node->largestBlock < vsize && node->largestBlock != 0))\n    {\n      MemNode* next = node->next;\n      if (node->getAvailable() < minVSize && node == _optimal && next) _optimal = next;\n      node = next;\n      continue;\n    }\n\n    size_t* up = node->baUsed;    // Current ubits address.\n    size_t ubits;                 // Current ubits[0] value.\n    size_t bit;                   // Current bit mask.\n    size_t blocks = node->blocks; // Count of blocks in node.\n    size_t cont = 0;              // How many bits are currently freed in find loop.\n    size_t maxCont = 0;           // Largest continuous block (bits count).\n    size_t j;\n\n    need = M_DIV((vsize + node->density - 1), node->density);\n    i = 0;\n\n    // Try to find node that is large enough.\n    while (i < blocks)\n    {\n      ubits = *up++;\n\n      // Fast skip used blocks.\n      if (ubits == ~(size_t)0)\n      { \n        if (cont > maxCont) maxCont = cont;\n        cont = 0;\n\n        i += BITS_PER_ENTITY;\n        continue;\n      }\n\n      size_t max = BITS_PER_ENTITY;\n      if (i + max > blocks) max = blocks - i;\n\n      for (j = 0, bit = 1; j < max; bit <<= 1)\n      {\n        j++;\n        if ((ubits & bit) == 0)\n        {\n          if (++cont == need) { i += j; i -= cont; goto _Found; }\n          continue;\n        }\n\n        if (cont > maxCont) maxCont = cont;\n        cont = 0;\n      }\n\n      i += BITS_PER_ENTITY;\n    }\n\n    // Because we traversed entire node, we can set largest node size that\n    // will be used to cache next traversing..\n    node->largestBlock = maxCont * node->density;\n\n    node = node->next;\n  }\n\n  // If we are here, we failed to find existing memory block and we must\n  // allocate new.\n  {\n    size_t chunkSize = _newChunkSize;\n    if (chunkSize < vsize) chunkSize = vsize;\n\n    node = createNode(chunkSize, _newChunkDensity);\n    if (node == NULL) return NULL;\n\n    // Update binary tree.\n    insertNode(node);\n    ASMJIT_ASSERT(checkTree());\n\n    // Alloc first node at start.\n    i = 0;\n    need = (vsize + node->density - 1) / node->density;\n\n    // Update statistics.\n    _allocated += node->size;\n  }\n\n_Found:\n  // Update bits.\n  _SetBits(node->baUsed, i, need);\n  _SetBits(node->baCont, i, need - 1);\n\n  // Update statistics.\n  {\n    size_t u = need * node->density;\n    node->used += u;\n    node->largestBlock = 0;\n    _used += u;\n  }\n\n  // And return pointer to allocated memory.\n  uint8_t* result = node->mem + i * node->density;\n  ASMJIT_ASSERT(result >= node->mem && result <= node->mem + node->size - vsize);\n  return result;\n}\n\nbool MemoryManagerPrivate::free(void* address)\n{\n  if (address == NULL) return true;\n\n  AutoLock locked(_lock);\n\n  MemNode* node = findPtr((uint8_t*)address);\n  if (node == NULL)\n    return false;\n\n  size_t offset = (size_t)((uint8_t*)address - (uint8_t*)node->mem);\n  size_t bitpos = M_DIV(offset, node->density);\n  size_t i = (bitpos / BITS_PER_ENTITY);\n\n  size_t* up = node->baUsed + i;  // Current ubits address.\n  size_t* cp = node->baCont + i;  // Current cbits address.\n  size_t ubits = *up;             // Current ubits[0] value.\n  size_t cbits = *cp;             // Current cbits[0] value.\n  size_t bit = (size_t)1 << (bitpos % BITS_PER_ENTITY);\n\n  size_t cont = 0;\n  bool stop;\n\n  for (;;)\n  {\n    stop = (cbits & bit) == 0;\n    ubits &= ~bit;\n    cbits &= ~bit;\n\n    bit <<= 1;\n    cont++;\n\n    if (stop || bit == 0)\n    {\n      *up = ubits;\n      *cp = cbits;\n      if (stop) break;\n\n      ubits = *++up;\n      cbits = *++cp;\n      bit = 1;\n    }\n  }\n\n  // If the freed block is fully allocated node then it's needed to \n  // update 'optimal' pointer in memory manager.\n  if (node->used == node->size)\n  {\n    MemNode* cur = _optimal;\n\n    do {\n      cur = cur->prev;\n      if (cur == node) { _optimal = node; break; }\n    } while (cur);\n  }\n\n  // Statistics.\n  cont *= node->density;\n  if (node->largestBlock < cont) node->largestBlock = cont;\n  node->used -= cont;\n  _used -= cont;\n\n  // If page is empty, we can free it.\n  if (node->used == 0)\n  {\n    // Free memory associated with node (this memory is not accessed\n    // anymore so it's safe).\n    freeVirtualMemory(node->mem, node->size);\n    ASMJIT_FREE(node->baUsed);\n\n    node->baUsed = NULL;\n    node->baCont = NULL;\n\n    // Statistics.\n    _allocated -= node->size;\n\n    // Remove node. This function can return different node than\n    // passed into, but data is copied into previous node if needed.\n    ASMJIT_FREE(removeNode(node));\n    ASMJIT_ASSERT(checkTree());\n  }\n\n  return true;\n}\n\nbool MemoryManagerPrivate::shrink(void* address, size_t used)\n{\n  if (address == NULL) return false;\n  if (used == 0) return free(address);\n\n  AutoLock locked(_lock);\n\n  MemNode* node = findPtr((uint8_t*)address);\n  if (node == NULL)\n    return false;\n\n  size_t offset = (size_t)((uint8_t*)address - (uint8_t*)node->mem);\n  size_t bitpos = M_DIV(offset, node->density);\n  size_t i = (bitpos / BITS_PER_ENTITY);\n\n  size_t* up = node->baUsed + i;  // Current ubits address.\n  size_t* cp = node->baCont + i;  // Current cbits address.\n  size_t ubits = *up;             // Current ubits[0] value.\n  size_t cbits = *cp;             // Current cbits[0] value.\n  size_t bit = (size_t)1 << (bitpos % BITS_PER_ENTITY);\n\n  size_t cont = 0;\n  size_t usedBlocks = (used + node->density - 1) / node->density;\n\n  bool stop;\n\n  // Find the first block we can mark as free.\n  for (;;)\n  {\n    stop = (cbits & bit) == 0;\n    if (stop) return true;\n\n    if (++cont == usedBlocks) break;\n\n    bit <<= 1;\n    if (bit == 0)\n    {\n      ubits = *++up;\n      cbits = *++cp;\n      bit = 1;\n    }\n  }\n\n  // Free the tail blocks.\n  cont = ~(size_t)0;\n  goto _EnterFreeLoop;\n\n  for (;;)\n  {\n    stop = (cbits & bit) == 0;\n    ubits &= ~bit;\n_EnterFreeLoop:\n    cbits &= ~bit;\n\n    bit <<= 1;\n    cont++;\n\n    if (stop || bit == 0)\n    {\n      *up = ubits;\n      *cp = cbits;\n      if (stop) break;\n\n      ubits = *++up;\n      cbits = *++cp;\n      bit = 1;\n    }\n  }\n\n  // Statistics.\n  cont *= node->density;\n  if (node->largestBlock < cont) node->largestBlock = cont;\n  node->used -= cont;\n  _used -= cont;\n\n  return true;\n}\n\nvoid MemoryManagerPrivate::freeAll(bool keepVirtualMemory)\n{\n  MemNode* node = _first;\n\n  while (node)\n  {\n    MemNode* next = node->next;\n  \n    if (!keepVirtualMemory)\n      freeVirtualMemory(node->mem, node->size);\n\n    ASMJIT_FREE(node->baUsed);\n    ASMJIT_FREE(node);\n\n    node = next;\n  }\n\n  _allocated = 0;\n  _used = 0;\n\n  _root = NULL;\n  _first = NULL;\n  _last = NULL;\n  _optimal = NULL;\n}\n\n// ============================================================================\n// [AsmJit::MemoryManagerPrivate - NodeList RB-Tree]\n// ============================================================================\n\nstatic int rbAssert(MemNode* root)\n{\n  if (root == NULL) return 1;\n\n  MemNode* ln = root->node[0];\n  MemNode* rn = root->node[1];\n\n  // Red violation.\n  ASMJIT_ASSERT( !(isRed(root) && (isRed(ln) || isRed(rn))) );\n\n  int lh = rbAssert(ln);\n  int rh = rbAssert(rn);\n\n  // Invalid btree.\n  ASMJIT_ASSERT(ln == NULL || ln->mem < root->mem);\n  ASMJIT_ASSERT(rn == NULL || rn->mem > root->mem);\n\n  // Black violation.\n  ASMJIT_ASSERT( !(lh != 0 && rh != 0 && lh != rh) );\n\n  // Only count black links.\n  if (lh != 0 && rh != 0)\n    return isRed(root) ? lh : lh + 1;\n  else\n    return 0;\n}\n\nstatic inline MemNode* rbRotateSingle(MemNode* root, int dir)\n{\n  MemNode* save = root->node[!dir];\n\n  root->node[!dir] = save->node[dir];\n  save->node[dir] = root;\n\n  root->red = 1;\n  save->red = 0;\n\n  return save;\n}\n\nstatic inline MemNode* rbRotateDouble(MemNode* root, int dir)\n{\n  root->node[!dir] = rbRotateSingle(root->node[!dir], !dir);\n  return rbRotateSingle(root, dir);\n}\n\nbool MemoryManagerPrivate::checkTree()\n{\n  return rbAssert(_root) > 0;\n}\n\nvoid MemoryManagerPrivate::insertNode(MemNode* node)\n{\n  if (_root == NULL)\n  {\n    // Empty tree case.\n    _root = node;\n  }\n  else\n  {\n    // False tree root.\n    RbNode<MemNode> head = {0};\n\n    // Grandparent & parent.\n    MemNode* g = NULL;\n    MemNode* t = reinterpret_cast<MemNode*>(&head);\n\n    // Iterator & parent.\n    MemNode* p = NULL;\n    MemNode* q = t->node[1] = _root;\n\n    int dir = 0, last;\n\n    // Search down the tree.\n    for (;;)\n    {\n      if (q == NULL)\n      {\n        // Insert new node at the bottom.\n        q = node;\n        p->node[dir] = node;\n      }\n      else if (isRed(q->node[0]) && isRed(q->node[1]))\n      {\n        // Color flip.\n        q->red = 1;\n        q->node[0]->red = 0;\n        q->node[1]->red = 0;\n      }\n\n      // Fix red violation.\n      if (isRed(q) && isRed(p))\n      {\n        int dir2 = t->node[1] == g;\n        t->node[dir2] = (q == p->node[last]) ? rbRotateSingle(g, !last) : rbRotateDouble(g, !last);\n      }\n\n      // Stop if found.\n      if (q == node) break;\n\n      last = dir;\n      dir = q->mem < node->mem;\n\n      // Update helpers.\n      if (g != NULL) t = g;\n      g = p;\n      p = q;\n      q = q->node[dir];\n    }\n\n    // Update root.\n    _root = head.node[1];\n  }\n\n  // Make root black.\n  _root->red = 0;\n\n  // Link with others.\n  node->prev = _last;\n\n  if (_first == NULL)\n  {\n    _first = node;\n    _last = node;\n    _optimal = node;\n  }\n  else\n  {\n    node->prev = _last;\n    _last->next = node;\n    _last = node;\n  }\n}\n\nMemNode* MemoryManagerPrivate::removeNode(MemNode* node)\n{\n  // False tree root.\n  RbNode<MemNode> head = {0}; \n\n  // Helpers.\n  MemNode* q = reinterpret_cast<MemNode*>(&head);\n  MemNode* p = NULL;\n  MemNode* g = NULL;\n  // Found item.\n  MemNode* f = NULL;\n  int dir = 1;\n\n  // Set up.\n  q->node[1] = _root;\n\n  // Search and push a red down.\n  while (q->node[dir] != NULL)\n  {\n    int last = dir;\n\n    // Update helpers.\n    g = p;\n    p = q;\n    q = q->node[dir];\n    dir = q->mem < node->mem;\n\n    // Save found node.\n    if (q == node) f = q;\n\n    // Push the red node down.\n    if (!isRed(q) && !isRed(q->node[dir]))\n    {\n      if (isRed(q->node[!dir]))\n      {\n        p = p->node[last] = rbRotateSingle(q, dir);\n      }\n      else if (!isRed(q->node[!dir]))\n      {\n        MemNode* s = p->node[!last];\n\n        if (s != NULL)\n        {\n          if (!isRed(s->node[!last]) && !isRed(s->node[last]))\n          {\n            // Color flip.\n            p->red = 0;\n            s->red = 1;\n            q->red = 1;\n          }\n          else\n          {\n            int dir2 = g->node[1] == p;\n\n            if (isRed(s->node[last]))\n              g->node[dir2] = rbRotateDouble(p, last);\n            else if (isRed(s->node[!last]))\n              g->node[dir2] = rbRotateSingle(p, last);\n\n            // Ensure correct coloring.\n            q->red = g->node[dir2]->red = 1;\n            g->node[dir2]->node[0]->red = 0;\n            g->node[dir2]->node[1]->red = 0;\n          }\n        }\n      }\n    }\n  }\n\n  // Replace and remove.\n  ASMJIT_ASSERT(f != NULL);\n  ASMJIT_ASSERT(f != reinterpret_cast<MemNode*>(&head));\n  ASMJIT_ASSERT(q != reinterpret_cast<MemNode*>(&head));\n\n  if (f != q) f->fillData(q);\n  p->node[p->node[1] == q] = q->node[q->node[0] == NULL];\n\n  // Update root and make it black.\n  if ((_root = head.node[1]) != NULL) _root->red = 0;\n\n  // Unlink.\n  MemNode* next = q->next;\n  MemNode* prev = q->prev;\n\n  if (prev) { prev->next = next; } else { _first = next; }\n  if (next) { next->prev = prev; } else { _last  = prev; }\n  if (_optimal == q) { _optimal = prev ? prev : next; }\n\n  return q;\n}\n\nMemNode* MemoryManagerPrivate::findPtr(uint8_t* mem)\n{\n  MemNode* cur = _root;\n  while (cur)\n  {\n    uint8_t* curMem = cur->mem;\n    if (mem < curMem)\n    {\n      // Go left.\n      cur = cur->node[0];\n      continue;\n    }\n    else\n    {\n      uint8_t* curEnd = curMem + cur->size;\n      if (mem >= curEnd)\n      {\n        // Go right.\n        cur = cur->node[1];\n        continue;\n      }\n      else\n      {\n        // Match.\n        break;\n      }\n    }\n  }\n  return cur;\n}\n\n// ============================================================================\n// [AsmJit::MemoryManager]\n// ============================================================================\n\nMemoryManager::MemoryManager()\n{\n}\n\nMemoryManager::~MemoryManager()\n{\n}\n\nMemoryManager* MemoryManager::getGlobal()\n{\n  static VirtualMemoryManager memmgr;\n  return &memmgr;\n}\n\n// ============================================================================\n// [AsmJit::VirtualMemoryManager]\n// ============================================================================\n\n#if !defined(ASMJIT_WINDOWS)\nVirtualMemoryManager::VirtualMemoryManager()\n{\n  MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate();\n  _d = (void*)d;\n}\n#else\nVirtualMemoryManager::VirtualMemoryManager()\n{\n  MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(GetCurrentProcess());\n  _d = (void*)d;\n}\n\nVirtualMemoryManager::VirtualMemoryManager(HANDLE hProcess)\n{\n  MemoryManagerPrivate* d = new(std::nothrow) MemoryManagerPrivate(hProcess);\n  _d = (void*)d;\n}\n#endif // ASMJIT_WINDOWS\n\nVirtualMemoryManager::~VirtualMemoryManager()\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  delete d;\n}\n\nvoid* VirtualMemoryManager::alloc(size_t size, uint32_t type)\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n\n  if (type == kMemAllocPermanent) \n    return d->allocPermanent(size);\n  else\n    return d->allocFreeable(size);\n}\n\nbool VirtualMemoryManager::free(void* address)\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  return d->free(address);\n}\n\nbool VirtualMemoryManager::shrink(void* address, size_t used)\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  return d->shrink(address, used);\n}\n\nvoid VirtualMemoryManager::freeAll()\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n\n  // Calling MemoryManager::freeAll() will never keep allocated memory.\n  return d->freeAll(false);\n}\n\nsize_t VirtualMemoryManager::getUsedBytes()\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  return d->_used;\n}\n\nsize_t VirtualMemoryManager::getAllocatedBytes()\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  return d->_allocated;\n}\n\nbool VirtualMemoryManager::getKeepVirtualMemory() const\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  return d->_keepVirtualMemory;\n}\n\nvoid VirtualMemoryManager::setKeepVirtualMemory(bool keepVirtualMemory)\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  d->_keepVirtualMemory = keepVirtualMemory;\n}\n\n// ============================================================================\n// [AsmJit::VirtualMemoryManager - Debug]\n// ============================================================================\n\n#if defined(ASMJIT_MEMORY_MANAGER_DUMP)\n\nstruct GraphVizContext\n{\n  GraphVizContext();\n  ~GraphVizContext();\n\n  bool openFile(const char* fileName);\n  void closeFile();\n\n  void dumpNode(MemNode* node);\n  void connect(MemNode* node, MemNode* other, const char* dst);\n\n  FILE* file;\n};\n\nGraphVizContext::GraphVizContext() :\n  file(NULL)\n{\n}\n\nGraphVizContext::~GraphVizContext()\n{\n  closeFile();\n}\n\nbool GraphVizContext::openFile(const char* fileName)\n{\n  file = fopen(fileName, \"w\");\n  return file != NULL;\n}\n\nvoid GraphVizContext::closeFile()\n{\n  if (file) { fclose(file); file = NULL; }\n}\n\nvoid GraphVizContext::dumpNode(MemNode* node)\n{\n  fprintf(file, \"  NODE_%p [shape=record, style=filled, color=%s, label=\\\"<L>|<C>Mem: %p, Used: %d/%d|<R>\\\"];\\n\",\n    node,\n    node->red ? \"red\" : \"gray\",\n    node->mem, node->used, node->size);\n\n  if (node->node[0]) connect(node, node->node[0], \"L\");\n  if (node->node[1]) connect(node, node->node[1], \"R\");\n}\n\nvoid GraphVizContext::connect(MemNode* node, MemNode* other, const char* dst)\n{\n  dumpNode(other);\n\n  fprintf(file, \"  NODE_%p:%s -> NODE_%p:C\", node, dst, other);\n  if (other->red) fprintf(file, \" [style=bold, color=red]\");\n  fprintf(file, \";\\n\");\n}\n\nvoid VirtualMemoryManager::dump(const char* fileName)\n{\n  MemoryManagerPrivate* d = reinterpret_cast<MemoryManagerPrivate*>(_d);\n  GraphVizContext ctx;\n\n  if (!ctx.openFile(fileName))\n    return;\n\n  fprintf(ctx.file, \"digraph {\\n\");\n  if (d->_root) ctx.dumpNode(d->_root);\n  fprintf(ctx.file, \"}\\n\");\n}\n#endif // ASMJIT_MEMORY_MANAGER_DUMP\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/memorymanager.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_MEMORYMANAGER_H\n#define _ASMJIT_CORE_MEMORYMANAGER_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n#include \"../core/defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\n// [Debug]\n// #define ASMJIT_MEMORY_MANAGER_DUMP\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_MemoryManagement\n//! @{\n\n// ============================================================================\n// [AsmJit::MemoryManager]\n// ============================================================================\n\n//! @brief Virtual memory manager interface.\n//!\n//! This class is pure virtual. You can get default virtual memory manager using\n//! @c getGlobal() method. If you want to create more memory managers with same\n//! functionality as global memory manager use @c VirtualMemoryManager class.\nstruct MemoryManager\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create memory manager instance.\n  ASMJIT_API MemoryManager();\n  //! @brief Destroy memory manager instance, this means also to free all memory\n  //! blocks.\n  ASMJIT_API virtual ~MemoryManager();\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  //! @brief Allocate a @a size bytes of virtual memory.\n  //!\n  //! Note that if you are implementing your own virtual memory manager then you\n  //! can quitly ignore type of allocation. This is mainly for AsmJit to memory\n  //! manager that allocated memory will be never freed.\n  virtual void* alloc(size_t size, uint32_t type = kMemAllocFreeable) = 0;\n  //! @brief Free previously allocated memory at a given @a address.\n  virtual bool free(void* address) = 0;\n  //! @brief Free some tail memory.\n  virtual bool shrink(void* address, size_t used) = 0;\n  //! @brief Free all allocated memory.\n  virtual void freeAll() = 0;\n\n  //! @brief Get how many bytes are currently used.\n  virtual size_t getUsedBytes() = 0;\n  //! @brief Get how many bytes are currently allocated.\n  virtual size_t getAllocatedBytes() = 0;\n\n  // --------------------------------------------------------------------------\n  // [Statics]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get global memory manager instance.\n  //!\n  //! Global instance is instance of @c VirtualMemoryManager class. Global memory\n  //! manager is used by default by @ref Assembler::make() and @ref Compiler::make()\n  //! methods.\n  ASMJIT_API static MemoryManager* getGlobal();\n};\n\n// ============================================================================\n// [AsmJit::VirtualMemoryManager]\n// ============================================================================\n\n//! @brief Reference implementation of memory manager that uses\n//! @ref AsmJit::VirtualMemory class to allocate chunks of virtual memory\n//! and bit arrays to manage it.\nstruct VirtualMemoryManager : public MemoryManager\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a @c VirtualMemoryManager instance.\n  ASMJIT_API VirtualMemoryManager();\n\n#if defined(ASMJIT_WINDOWS)\n  //! @brief Create a @c VirtualMemoryManager instance for process @a hProcess.\n  //!\n  //! This is specialized version of constructor available only for windows and\n  //! usable to alloc/free memory of different process.\n  ASMJIT_API VirtualMemoryManager(HANDLE hProcess);\n#endif // ASMJIT_WINDOWS\n\n  //! @brief Destroy the @c VirtualMemoryManager instance, this means also to\n  //! free all blocks.\n  ASMJIT_API virtual ~VirtualMemoryManager();\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void* alloc(size_t size, uint32_t type = kMemAllocFreeable);\n  ASMJIT_API virtual bool free(void* address);\n  ASMJIT_API virtual bool shrink(void* address, size_t used);\n  ASMJIT_API virtual void freeAll();\n\n  ASMJIT_API virtual size_t getUsedBytes();\n  ASMJIT_API virtual size_t getAllocatedBytes();\n\n  // --------------------------------------------------------------------------\n  // [Virtual Memory Manager Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether to keep allocated memory after memory manager is\n  //! destroyed.\n  //!\n  //! @sa @c setKeepVirtualMemory().\n  ASMJIT_API bool getKeepVirtualMemory() const;\n\n  //! @brief Set whether to keep allocated memory after memory manager is\n  //! destroyed.\n  //!\n  //! This method is usable when patching code of remote process. You need to\n  //! allocate process memory, store generated assembler into it and patch the\n  //! method you want to redirect (into your code). This method affects only\n  //! VirtualMemoryManager destructor. After destruction all internal \n  //! structures are freed, only the process virtual memory remains.\n  //! \n  //! @note Memory allocated with kMemAllocPermanent is always kept.\n  //!\n  //! @sa @c getKeepVirtualMemory().\n  ASMJIT_API void setKeepVirtualMemory(bool keepVirtualMemory);\n\n  // --------------------------------------------------------------------------\n  // [Debug]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_MEMORY_MANAGER_DUMP)\n  //! @brief Dump memory manager tree into file.\n  //!\n  //! Generated output is using DOT language (from graphviz package).\n  ASMJIT_API void dump(const char* fileName);\n#endif // ASMJIT_MEMORY_MANAGER_DUMP\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Pointer to private data hidden from the public API.\n  void* _d;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_MEMORYMANAGER_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/memorymarker.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n#include \"../core/memorymarker.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::MemoryMarker]\n// ============================================================================\n\nMemoryMarker::MemoryMarker() {}\nMemoryMarker::~MemoryMarker() {}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/memorymarker.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_MEMORYMARKER_H\n#define _ASMJIT_CORE_MEMORYMARKER_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n#include \"../core/defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_MemoryManagement\n//! @{\n\n// ============================================================================\n// [AsmJit::MemoryMarker]\n// ============================================================================\n\n//! @brief Virtual memory marker interface.\nstruct MemoryMarker\n{\n  ASMJIT_NO_COPY(MemoryMarker)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API MemoryMarker();\n  ASMJIT_API virtual ~MemoryMarker();\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  virtual void mark(const void* ptr, size_t size) = 0;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_MEMORYMARKER_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/operand.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/operand.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Operand]\n// ============================================================================\n\nconst Operand noOperand;\n\n// ============================================================================\n// [AsmJit::Imm]\n// ============================================================================\n\n//! @brief Create signed immediate value operand.\nImm imm(sysint_t i)\n{ \n  return Imm(i, false);\n}\n\n//! @brief Create unsigned immediate value operand.\nImm uimm(sysuint_t i)\n{\n  return Imm((sysint_t)i, true);\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/operand.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_OPERAND_H\n#define _ASMJIT_CORE_OPERAND_H\n\n// [Dependencies - AsmJit]\n#include \"../core/defs.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::_OperandData]\n// ============================================================================\n\n//! @internal\n//! \n//! @brief Base operand data.\nstruct _OpBase\n{\n  //! @brief Type of operand, see @c kOperandType.\n  uint8_t op;\n  //! @brief Size of operand (register, address, immediate, or variable).\n  uint8_t size;\n  //! @brief Not used.\n  uint8_t reserved[2];\n\n  //! @brief Operand ID (private variable for @c Assembler and @c Compiler classes).\n  //!\n  //! @note Uninitialized operand has always zero id.\n  uint32_t id;\n};\n\n//! @internal\n//! \n//! @brief Label operand data.\nstruct _OpLabel\n{\n  //! @brief Type of operand, see @c kOperandType (in this case @c kOperandLabel).\n  uint8_t op;\n  //! @brief Size of label, currently not used.\n  uint8_t size;\n  //! @brief Not used.\n  uint8_t reserved[2];\n\n  //! @brief Operand ID.\n  uint32_t id;\n};\n\n//! @internal\n//! \n//! @brief Register operand data.\nstruct _OpReg\n{\n  //! @brief Type of operand, see @c kOperandType (in this case @c kOperandReg).\n  uint8_t op;\n  //! @brief Size of register.\n  uint8_t size;\n  //! @brief Not used.\n  uint8_t reserved[2];\n\n  //! @brief Operand id.\n  uint32_t id;\n  //! @brief Register/Variable code, see @c REG.\n  uint32_t code;\n};\n\n//! @internal\n//! \n//! @brief Variable operand data.\nstruct _OpVar\n{\n  //! @brief Type of operand, see @c kOperandType (in this case @c kOperandVar).\n  uint8_t op;\n  //! @brief Size of variable (0 if don't known).\n  uint8_t size;\n  //! @brief Not used.\n  uint8_t reserved[2];\n\n  //! @brief Operand ID.\n  uint32_t id;\n\n  //! @brief Type (and later also code) of register, see @c kX86RegType, @c kX86RegCode.\n  //!\n  //! @note Register code and variable code are two different things. In most\n  //! cases regCode is very related to varType, but general purpose registers \n  //! are divided to 64-bit, 32-bit, 16-bit and 8-bit entities so the regCode\n  //! can be used to access these, varType remains unchanged from the \n  //! initialization state. Variable type describes mainly variable type and\n  //! home memory size.\n  uint32_t regCode;\n\n  //! @brief Type of variable. See @c kX86VarType enum.\n  uint32_t varType;\n};\n\n//! @internal\n//!\n//! @brief Memory operand data.\nstruct _OpMem\n{\n  //! @brief Type of operand, see @c kOperandType (in this case @c kOperandMem).\n  uint8_t op;\n  //! @brief Size of pointer.\n  uint8_t size;\n\n  //! @brief Memory operand type, see @c kOperandMemType.\n  uint8_t type;\n  //! @brief Segment override prefix, see @c kX86Seg.\n  uint8_t segment : 4;\n  //! @brief Emit MOV/LEA instruction using 16-bit/32-bit form of base/index\n  //! registers.\n  uint8_t sizePrefix : 1;\n  //! @brief Index register shift/scale (0 to 3 inclusive, see @c kScale).\n  uint8_t shift : 3;\n\n  //! @brief Operand ID.\n  uint32_t id;\n\n  //! @brief Base register index, variable or label id.\n  uint32_t base;\n  //! @brief Index register index or variable id.\n  uint32_t index;\n\n  //! @brief Target (for 32-bit, absolute address).\n  void* target;\n  //! @brief Displacement.\n  sysint_t displacement;\n};\n\n//! @internal\n//! \n//! @brief Immediate operand data.\nstruct _OpImm\n{\n  //! @brief Type of operand, see @c kOperandType (in this case @c kOperandImm)..\n  uint8_t op;\n  //! @brief Size of immediate (or 0 to autodetect).\n  uint8_t size;\n  //! @brief @c true if immediate is unsigned.\n  uint8_t isUnsigned;\n  //! @brief Not used.\n  uint8_t reserved;\n\n  //! @brief Operand ID.\n  uint32_t id;\n  //! @brief Immediate value.\n  sysint_t value;\n};\n\n//! @internal\n//!\n//! @brief Binary operand data.\nstruct _OpBin\n{\n  //! @brief First four 32-bit integers.\n  uint32_t u32[4];\n  //! @brief Second two 32-bit or 64-bit integers.\n  uintptr_t uptr[2];\n};\n\n// ============================================================================\n// [AsmJit::Operand]\n// ============================================================================\n\n//! @brief Operand can contain register, memory location, immediate, or label.\nstruct Operand\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create an uninitialized operand.\n  inline Operand()\n  {\n    memset(this, 0, sizeof(Operand));\n    _base.id = kInvalidValue;\n  }\n\n  //! @brief Create a reference to @a other operand.\n  inline Operand(const Operand& other)\n  {\n    _init(other);\n  }\n\n#if !defined(ASMJIT_NODOC)\n  inline Operand(const _DontInitialize&) {}\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Init & Copy]\n  // --------------------------------------------------------------------------\n\n  //! @internal\n  //!\n  //! @brief Initialize operand to @a other (used by constructors).\n  inline void _init(const Operand& other)\n  { memcpy(this, &other, sizeof(Operand)); }\n\n  //! @internal\n  //!\n  //! @brief Initialize operand to @a other (used by assign operators).\n  inline void _copy(const Operand& other)\n  { memcpy(this, &other, sizeof(Operand)); }\n\n  // --------------------------------------------------------------------------\n  // [Data]\n  // --------------------------------------------------------------------------\n\n  template<typename T>\n  inline T& getData() { return reinterpret_cast<T&>(_base); }\n\n  template<typename T>\n  inline const T& getData() const { return reinterpret_cast<const T&>(_base); }\n\n  // --------------------------------------------------------------------------\n  // [Type]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get type of the operand, see @c kOperandType.\n  inline uint32_t getType() const\n  { return _base.op; }\n\n  //! @brief Get whether the operand is none (@c kOperandNone).\n  inline bool isNone() const\n  { return (_base.op == kOperandNone); }\n\n  //! @brief Get whether the operand is any (general purpose, mmx or sse) register (@c kOperandReg).\n  inline bool isReg() const\n  { return (_base.op == kOperandReg); }\n\n  //! @brief Get whether the operand is memory address (@c kOperandMem).\n  inline bool isMem() const\n  { return (_base.op == kOperandMem); }\n\n  //! @brief Get whether the operand is immediate (@c kOperandImm).\n  inline bool isImm() const\n  { return (_base.op == kOperandImm); }\n\n  //! @brief Get whether the operand is label (@c kOperandLabel).\n  inline bool isLabel() const\n  { return (_base.op == kOperandLabel); }\n\n  //! @brief Get whether the operand is variable (@c kOperandVar).\n  inline bool isVar() const\n  { return (_base.op == kOperandVar); }\n\n  //! @brief Get whether the operand is variable or memory.\n  inline bool isVarMem() const\n  { return ((_base.op & (kOperandVar | kOperandMem)) != 0); }\n\n  //! @brief Get whether the operand is register and type of register is @a regType.\n  inline bool isRegType(uint32_t regType) const\n  { return (_base.op == kOperandReg) & ((_reg.code & kRegTypeMask) == regType); }\n\n  //! @brief Get whether the operand is register and code of register is @a regCode.\n  inline bool isRegCode(uint32_t regCode) const\n  { return (_base.op == kOperandReg) & (_reg.code == regCode); }\n\n  //! @brief Get whether the operand is register and index of register is @a regIndex.\n  inline bool isRegIndex(uint32_t regIndex) const\n  { return (_base.op == kOperandReg) & ((_reg.code & kRegIndexMask) == (regIndex & kRegIndexMask)); }\n\n  //! @brief Get whether the operand is any register or memory.\n  inline bool isRegMem() const\n  { return ((_base.op & (kOperandReg | kOperandMem)) != 0); }\n\n  //! @brief Get whether the operand is register of @a regType type or memory.\n  inline bool isRegTypeMem(uint32_t regType) const\n  { return ((_base.op == kOperandReg) & ((_reg.code & kRegTypeMask) == regType)) | (_base.op == kOperandMem); }\n\n  // --------------------------------------------------------------------------\n  // [Size]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get size of the operand in bytes.\n  inline uint32_t getSize() const\n  { return _base.size; }\n\n  // --------------------------------------------------------------------------\n  // [Id]\n  // --------------------------------------------------------------------------\n\n  //! @brief Return operand Id (Operand Id's are used internally by \n  //! @c Assembler and @c Compiler classes).\n  //!\n  //! @note There is no way how to change or remove operand id. If you don't\n  //! need the operand just assign different operand to this one.\n  inline uint32_t getId() const\n  { return _base.id; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  union\n  {\n    //! @brief Base operand data.\n    _OpBase _base;\n    //! @brief Label operand data.\n    _OpLabel _lbl;\n    //! @brief Register operand data.\n    _OpReg _reg;\n    //! @brief Variable operand data.\n    _OpVar _var;\n    //! @brief Memory operand data.\n    _OpMem _mem;\n    //! @brief Immediate operand data.\n    _OpImm _imm;\n    //! @brief Binary data.\n    _OpBin _bin;\n  };\n};\n\nASMJIT_VAR const Operand noOperand;\n\n// ============================================================================\n// [AsmJit::Reg]\n// ============================================================================\n\n//! @brief Base class for all register operands.\nstruct Reg : public Operand\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new base register.\n  inline Reg(uint32_t code, uint32_t size) : Operand(_DontInitialize())\n  {\n    _reg.op = kOperandReg;\n    _reg.size = (uint8_t)size;\n    _reg.id = kInvalidValue;\n    _reg.code = code;\n  }\n\n  //! @brief Create a new reference to @a other.\n  inline Reg(const Reg& other) : Operand(other) {}\n\n#if !defined(ASMJIT_NODOC)\n  inline Reg(const _DontInitialize& dontInitialize) : Operand(dontInitialize) {}\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Reg Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get register code, see @c REG.\n  inline uint32_t getRegCode() const\n  { return (uint32_t)(_reg.code); }\n\n  //! @brief Get register type, see @c REG.\n  inline uint32_t getRegType() const\n  { return (uint32_t)(_reg.code & kRegTypeMask); }\n\n  //! @brief Get register index (value from 0 to 7/15).\n  inline uint32_t getRegIndex() const\n  { return (uint32_t)(_reg.code & kRegIndexMask); }\n\n  //! @brief Get whether register code is equal to @a code.\n  inline bool isRegCode(uint32_t code) const\n  { return _reg.code == code; }\n\n  //! @brief Get whether register code is equal to @a type.\n  inline bool isRegType(uint32_t type) const\n  { return (uint32_t)(_reg.code & kRegTypeMask) == type; }\n\n  //! @brief Get whether register index is equal to @a index.\n  inline bool isRegIndex(uint32_t index) const\n  { return (uint32_t)(_reg.code & kRegIndexMask) == index; }\n\n  //! @brief Set register code to @a code.\n  inline Reg& setCode(uint32_t code)\n  {\n    _reg.code = code;\n    return *this;\n  }\n\n  //! @brief Set register size to @a size.\n  inline Reg& setSize(uint32_t size)\n  {\n    _reg.size = static_cast<uint8_t>(size);\n    return *this;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n  inline Reg& operator=(const Reg& other)\n  { _copy(other); return *this; }\n\n  inline bool operator==(const Reg& other) const\n  { return getRegCode() == other.getRegCode(); }\n\n  inline bool operator!=(const Reg& other) const\n  { return getRegCode() != other.getRegCode(); }\n};\n\n// ============================================================================\n// [AsmJit::Imm]\n// ============================================================================\n\n//! @brief Immediate operand.\n//!\n//! Immediate operand is part of instruction (it's inlined after it).\n//!\n//! To create immediate operand, use @c imm() and @c uimm() constructors\n//! or constructors provided by @c Immediate class itself.\nstruct Imm : public Operand\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new immediate value (initial value is 0).\n  Imm() : Operand(_DontInitialize())\n  {\n    _imm.op = kOperandImm;\n    _imm.size = 0;\n    _imm.isUnsigned = false;\n    _imm.reserved = 0;\n\n    _imm.id = kInvalidValue;\n    _imm.value = 0;\n  }\n\n  //! @brief Create a new signed immediate value, assigning the value to @a i.\n  Imm(sysint_t i) : Operand(_DontInitialize())\n  {\n    _imm.op = kOperandImm;\n    _imm.size = 0;\n    _imm.isUnsigned = false;\n    _imm.reserved = 0;\n\n    _imm.id = kInvalidValue;\n    _imm.value = i;\n  }\n\n  //! @brief Create a new signed or unsigned immediate value, assigning the value to @a i.\n  Imm(sysint_t i, bool isUnsigned) : Operand(_DontInitialize())\n  {\n    _imm.op = kOperandImm;\n    _imm.size = 0;\n    _imm.isUnsigned = isUnsigned;\n    _imm.reserved = 0;\n\n    _imm.id = kInvalidValue;\n    _imm.value = i;\n  }\n\n  //! @brief Create a new immediate value from @a other.\n  inline Imm(const Imm& other) : Operand(other)\n  {\n  }\n\n  // --------------------------------------------------------------------------\n  // [Immediate Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether an immediate is unsigned value.\n  inline bool isUnsigned() const\n  { return _imm.isUnsigned != 0; }\n\n  //! @brief Get signed immediate value.\n  inline sysint_t getValue() const\n  { return _imm.value; }\n\n  //! @brief Get unsigned immediate value.\n  inline sysuint_t getUValue() const\n  { return static_cast<sysuint_t>(_imm.value); }\n\n  //! @brief Set immediate value as signed type to @a val.\n  inline Imm& setValue(sysint_t val, bool isUnsigned = false)\n  {\n    _imm.value = val;\n    _imm.isUnsigned = isUnsigned;\n    return *this;\n  }\n\n  //! @brief Set immediate value as unsigned type to @a val.\n  inline Imm& setUValue(sysuint_t val)\n  {\n    _imm.value = (sysint_t)val;\n    _imm.isUnsigned = true;\n    return *this;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n  //! @brief Assign a signed value @a val to the immediate operand.\n  inline Imm& operator=(sysint_t val)\n  { setValue(val); return *this; }\n\n  //! @brief Assign @a other to the immediate operand.\n  inline Imm& operator=(const Imm& other)\n  { _copy(other); return *this; }\n};\n\n//! @brief Create signed immediate value operand.\nASMJIT_API Imm imm(sysint_t i);\n\n//! @brief Create unsigned immediate value operand.\nASMJIT_API Imm uimm(sysuint_t i);\n\n// ============================================================================\n// [AsmJit::Label]\n// ============================================================================\n\n//! @brief Label (jump target or data location).\n//!\n//! Label represents locations typically used as jump targets, but may be also\n//! used as position where are stored constants or static variables. If you \n//! want to use @c Label you need first to associate it with @c Assembler or\n//! @c Compiler instance. To create new label use @c Assembler::newLabel() or\n//! @c Compiler::newLabel().\n//!\n//! Example of using labels:\n//!\n//! @code\n//! // Create Assembler or Compiler instance.\n//! X86Assembler a;\n//! \n//! // Create Label instance.\n//! Label L_1(a);\n//!\n//! // ... your code ...\n//!\n//! // Using label, see @c AsmJit::Assembler or @c AsmJit::Compiler.\n//! a.jump(L_1);\n//!\n//! // ... your code ...\n//!\n//! // Bind label to current position, see @c AsmJit::Assembler::bind() or\n//! // @c AsmJit::Compiler::bind().\n//! a.bind(L_1);\n//! @endcode\nstruct Label : public Operand\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create new, unassociated label.\n  inline Label() : Operand(_DontInitialize())\n  {\n    _lbl.op = kOperandLabel;\n    _lbl.size = 0;\n    _lbl.id = kInvalidValue;\n  }\n\n  //! @brief Create reference to another label.\n  inline Label(const Label& other) : Operand(other) {}\n\n  //! @brief Destroy the label.\n  inline ~Label() {}\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline Label& operator=(const Label& other)\n  { _copy(other); return *this; }\n\n  inline bool operator==(const Label& other) const { return _base.id == other._base.id; }\n  inline bool operator!=(const Label& other) const { return _base.id != other._base.id; }\n#endif // ASMJIT_NODOC\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Guard]\n#endif // _ASMJIT_CORE_OPERAND_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/podvector.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_PODVECTOR_H\n#define _ASMJIT_CORE_PODVECTOR_H\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/defs.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::PodVector<T>]\n// ============================================================================\n\n//! @brief Template used to store and manage array of POD data.\n//!\n//! This template has these adventages over other vector<> templates:\n//! - Non-copyable (designed to be non-copyable, we want it)\n//! - No copy-on-write (some implementations of stl can use it)\n//! - Optimized for working only with POD types\n//! - Uses ASMJIT_... memory management macros\ntemplate <typename T>\nstruct PodVector\n{\n  ASMJIT_NO_COPY(PodVector<T>)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create new instance of PodVector template. Data will not\n  //! be allocated (will be NULL).\n  inline PodVector() :\n    _data(NULL),\n    _length(0),\n    _capacity(0)\n  {\n  }\n  \n  //! @brief Destroy PodVector and free all data.\n  inline ~PodVector()\n  {\n    if (_data != NULL)\n      ASMJIT_FREE(_data);\n  }\n\n  // --------------------------------------------------------------------------\n  // [Data]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get data.\n  inline T* getData() { return _data; }\n  //! @overload\n  inline const T* getData() const { return _data; }\n\n  //! @brief Get length.\n  inline size_t getLength() const { return _length; }\n  //! @brief Get capacity.\n  inline size_t getCapacity() const { return _capacity; }\n\n  // --------------------------------------------------------------------------\n  // [Manipulation]\n  // --------------------------------------------------------------------------\n\n  //! @brief Clear vector data, but not free internal buffer.\n  void clear()\n  {\n    _length = 0;\n  }\n\n  //! @brief Clear vector data and free internal buffer.\n  void reset()\n  {\n    if (_data != NULL) \n    {\n      ASMJIT_FREE(_data);\n      _data = 0;\n      _length = 0;\n      _capacity = 0;\n    }\n  }\n\n  //! @brief Prepend @a item to vector.\n  bool prepend(const T& item)\n  {\n    if (_length == _capacity && !_grow()) return false;\n\n    memmove(_data + 1, _data, sizeof(T) * _length);\n    memcpy(_data, &item, sizeof(T));\n\n    _length++;\n    return true;\n  }\n\n  //! @brief Insert an @a item at the @a index.\n  bool insert(size_t index, const T& item)\n  {\n    ASMJIT_ASSERT(index <= _length);\n    if (_length == _capacity && !_grow()) return false;\n\n    T* dst = _data + index;\n    memmove(dst + 1, dst, _length - index);\n    memcpy(dst, &item, sizeof(T));\n\n    _length++;\n    return true;\n  }\n\n  //! @brief Append @a item to vector.\n  bool append(const T& item)\n  {\n    if (_length == _capacity && !_grow()) return false;\n\n    memcpy(_data + _length, &item, sizeof(T));\n\n    _length++;\n    return true;\n  }\n\n  //! @brief Get index of @a val or kInvalidSize if not found.\n  size_t indexOf(const T& val) const\n  {\n    size_t i = 0, len = _length;\n    for (i = 0; i < len; i++) { if (_data[i] == val) return i; }\n    return kInvalidSize;\n  }\n\n  //! @brief Remove element at index @a i.\n  void removeAt(size_t i)\n  {\n    ASMJIT_ASSERT(i < _length);\n\n    T* dst = _data + i;\n    _length--;\n    memmove(dst, dst + 1, _length - i);\n  }\n\n  //! @brief Swap this pod-vector with @a other.\n  void swap(PodVector<T>& other)\n  {\n    T* _tmp_data = _data;\n    size_t _tmp_length = _length;\n    size_t _tmp_capacity = _capacity;\n\n    _data = other._data;\n    _length = other._length;\n    _capacity = other._capacity;\n\n    other._data = _tmp_data;\n    other._length = _tmp_length;\n    other._capacity = _tmp_capacity;\n  }\n\n  //! @brief Get item at position @a i.\n  inline T& operator[](size_t i)\n  {\n    ASMJIT_ASSERT(i < _length);\n    return _data[i];\n  }\n  //! @brief Get item at position @a i.\n  inline const T& operator[](size_t i) const\n  {\n    ASMJIT_ASSERT(i < _length);\n    return _data[i];\n  }\n\n  //! @brief Append the item and return address so it can be initialized.\n  T* newItem()\n  {\n    if (_length == _capacity && !_grow()) return NULL;\n    return _data + (_length++);\n  }\n\n  // --------------------------------------------------------------------------\n  // [Private]\n  // --------------------------------------------------------------------------\n\n  //! @brief Called to grow internal array.\n  bool _grow()\n  {\n    return _realloc(_capacity < 16 ? 16 : _capacity * 2);\n  }\n\n  //! @brief Realloc internal array to fit @a to items.\n  bool _realloc(size_t to)\n  {\n    ASMJIT_ASSERT(to >= _length);\n\n    T* p = reinterpret_cast<T*>(_data ? ASMJIT_REALLOC(_data, to * sizeof(T)) : ASMJIT_MALLOC(to * sizeof(T)));\n\n    if (p == NULL)\n      return false;\n\n    _data = p;\n    _capacity = to;\n    return true;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Items data.\n  T* _data;\n  //! @brief Length of buffer (count of items in array).\n  size_t _length;\n  //! @brief Capacity of buffer (maximum items that can fit to current array).\n  size_t _capacity;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n#endif // _ASMJIT_CORE_PODVECTOR_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/stringbuilder.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/defs.h\"\n#include \"../core/intutil.h\"\n#include \"../core/stringbuilder.h\"\n\n// [Dependencies - C]\n#include <stdarg.h>\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// Should be placed in read-only memory.\nstatic const char StringBuilder_empty[4] = { 0 };\n\n// ============================================================================\n// [AsmJit::StringBuilder - Construction / Destruction]\n// ============================================================================\n\nStringBuilder::StringBuilder() :\n  _data(const_cast<char*>(StringBuilder_empty)),\n  _length(0),\n  _capacity(0),\n  _canFree(false)\n{\n}\n\nStringBuilder::~StringBuilder()\n{\n  if (_canFree)\n    ASMJIT_FREE(_data);\n}\n\n// ============================================================================\n// [AsmJit::StringBuilder - Prepare / Reserve]\n// ============================================================================\n\nchar* StringBuilder::prepare(uint32_t op, size_t len)\n{\n  // --------------------------------------------------------------------------\n  // [Set]\n  // --------------------------------------------------------------------------\n\n  if (op == kStringBuilderOpSet)\n  {\n    // We don't care here, but we can't return a NULL pointer since it indicates\n    // failure in memory allocation.\n    if (len == 0)\n    {\n      if (_data != StringBuilder_empty)\n        _data[0] = 0;\n\n      _length = 0;\n      return _data;\n    }\n\n    if (_capacity < len)\n    {\n      if (len >= IntUtil::maxValue<size_t>() - sizeof(uintptr_t) * 2)\n        return NULL;\n\n      size_t to = IntUtil::align<size_t>(len, sizeof(uintptr_t));\n      if (to < 256 - sizeof(uintptr_t))\n        to = 256 - sizeof(uintptr_t);\n\n      char* newData = static_cast<char*>(ASMJIT_MALLOC(to + sizeof(uintptr_t)));\n      if (newData == NULL)\n      {\n        clear();\n        return NULL;\n      }\n\n      if (_canFree)\n        ASMJIT_FREE(_data);\n\n      _data = newData;\n      _capacity = to + sizeof(uintptr_t) - 1;\n      _canFree = true;\n    }\n\n    _data[len] = 0;\n    _length = len;\n\n    ASMJIT_ASSERT(_length <= _capacity);\n    return _data;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Append]\n  // --------------------------------------------------------------------------\n\n  else\n  {\n    // We don't care here, but we can't return a NULL pointer since it indicates\n    // failure in memory allocation.\n    if (len == 0)\n      return _data + _length;\n\n    // Overflow.\n    if (IntUtil::maxValue<size_t>() - sizeof(uintptr_t) * 2 - _length < len)\n      return NULL;\n\n    size_t after = _length + len;\n    if (_capacity < after)\n    {\n      size_t to = _capacity;\n\n      if (to < 256)\n        to = 256;\n\n      while (to < 1024 * 1024 && to < after)\n      {\n        to *= 2;\n      }\n\n      if (to < after)\n      {\n        to = after;\n        if (to < (IntUtil::maxValue<size_t>() - 1024 * 32))\n          to = IntUtil::align<size_t>(to, 1024 * 32);\n      }\n\n      to = IntUtil::align<size_t>(to, sizeof(uintptr_t));\n      char* newData = static_cast<char*>(ASMJIT_MALLOC(to + sizeof(uintptr_t)));\n\n      if (newData == NULL)\n        return NULL;\n\n      ::memcpy(newData, _data, _length);\n\n      if (_canFree)\n        ASMJIT_FREE(_data);\n\n      _data = newData;\n      _capacity = to + sizeof(uintptr_t) - 1;\n      _canFree = true;\n    }\n\n    char* ret = _data + _length;\n    _data[after] = 0;\n    _length = after;\n\n    ASMJIT_ASSERT(_length <= _capacity);\n    return ret;\n  }\n}\n\nbool StringBuilder::reserve(size_t to)\n{\n  if (_capacity >= to)\n    return true;\n\n  if (to >= IntUtil::maxValue<size_t>() - sizeof(uintptr_t) * 2)\n    return false;\n\n  to = IntUtil::align<size_t>(to, sizeof(uintptr_t));\n\n  char* newData = static_cast<char*>(ASMJIT_MALLOC(to + sizeof(uintptr_t)));\n  if (newData == NULL)\n    return false;\n\n  ::memcpy(newData, _data, _length + 1);\n  if (_canFree)\n    ASMJIT_FREE(_data);\n\n  _data = newData;\n  _capacity = to + sizeof(uintptr_t) - 1;\n  _canFree = true;\n  return true;\n}\n\n// ============================================================================\n// [AsmJit::StringBuilder - Clear]\n// ============================================================================\n\nvoid StringBuilder::clear()\n{\n  if (_data != StringBuilder_empty)\n    _data[0] = 0;\n  _length = 0;\n}\n\n// ============================================================================\n// [AsmJit::StringBuilder - Methods]\n// ============================================================================\n\nbool StringBuilder::_opString(uint32_t op, const char* str, size_t len)\n{\n  if (len == kInvalidSize)\n    len = ::strlen(str);\n\n  char* p = prepare(op, len);\n  if (p == NULL)\n    return false;\n\n  ::memcpy(p, str, len);\n  return true;\n}\n\nbool StringBuilder::_opChars(uint32_t op, char c, size_t len)\n{\n  char* p = prepare(op, len);\n  if (p == NULL)\n    return false;\n\n  ::memset(p, c, len);\n  return true;\n}\n\nstatic const char StringBuilder_numbers[] = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\nbool StringBuilder::_opNumber(uint32_t op, uint64_t i, uint32_t base, size_t width, uint32_t flags)\n{\n  if (base < 2 || base > 36)\n    base = 10;\n\n  char buf[128];\n  char* p = buf + ASMJIT_ARRAY_SIZE(buf);\n\n  uint64_t orig = i;\n  char sign = '\\0';\n\n  // --------------------------------------------------------------------------\n  // [Sign]\n  // --------------------------------------------------------------------------\n\n  if ((flags & kStringBuilderNumSigned) != 0 && static_cast<int64_t>(i) < 0)\n  {\n    i = static_cast<uint64_t>(-static_cast<int64_t>(i));\n    sign = '-';\n  }\n  else if ((flags & kStringBuilderNumShowSign) != 0)\n  {\n    sign = '+';\n  }\n  else if ((flags & kStringBuilderNumShowSpace) != 0)\n  {\n    sign = ' ';\n  }\n\n  // --------------------------------------------------------------------------\n  // [Number]\n  // --------------------------------------------------------------------------\n\n  do {\n    uint64_t d = i / base;\n    uint64_t r = i % base;\n\n    *--p = StringBuilder_numbers[r];\n    i = d;\n  } while (i);\n\n  size_t numberLength = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p);\n\n  // --------------------------------------------------------------------------\n  // [Alternate Form]\n  // --------------------------------------------------------------------------\n\n  if ((flags & kStringBuilderNumAlternate) != 0)\n  {\n    if (base == 8)\n    {\n      if (orig != 0)\n        *--p = '0';\n    }\n    if (base == 16)\n    {\n      *--p = 'x';\n      *--p = '0';\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Width]\n  // --------------------------------------------------------------------------\n\n  if (sign != 0)\n    *--p = sign;\n\n  if (width > 256)\n    width = 256;\n\n  if (width <= numberLength)\n    width = 0;\n  else\n    width -= numberLength;\n\n  // --------------------------------------------------------------------------\n  // Write]\n  // --------------------------------------------------------------------------\n\n  size_t prefixLength = (size_t)(buf + ASMJIT_ARRAY_SIZE(buf) - p) - numberLength;\n  char* data = prepare(op, prefixLength + width + numberLength);\n\n  if (data == NULL)\n    return false;\n\n  ::memcpy(data, p, prefixLength);\n  data += prefixLength;\n\n  ::memset(data, '0', width);\n  data += width;\n\n  ::memcpy(data, p + prefixLength, numberLength);\n  return true;\n}\n\nbool StringBuilder::_opHex(uint32_t op, const void* data, size_t len)\n{\n  if (len >= IntUtil::maxValue<size_t>() / 2)\n    return false;\n\n  char* dst = prepare(op, len);\n  if (dst == NULL)\n    return false;\n\n  const char* src = static_cast<const char*>(data);\n  for (size_t i = 0; i < len; i++, dst += 2, src += 1)\n  {\n    dst[0] = StringBuilder_numbers[(src[0] >> 4) & 0xF];\n    dst[1] = StringBuilder_numbers[(src[0]     ) & 0xF];\n  }\n\n  return true;\n}\n\nbool StringBuilder::_opVFormat(uint32_t op, const char* fmt, va_list ap)\n{\n  char buf[1024];\n\n  vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), fmt, ap);\n  buf[ASMJIT_ARRAY_SIZE(buf) - 1] = '\\0';\n\n  return _opString(op, buf);\n}\n\nbool StringBuilder::setFormat(const char* fmt, ...)\n{\n  bool result;\n\n  va_list ap;\n  va_start(ap, fmt);\n  result = _opVFormat(kStringBuilderOpSet, fmt, ap);\n  va_end(ap);\n\n  return result;\n}\n\nbool StringBuilder::appendFormat(const char* fmt, ...)\n{\n  bool result;\n\n  va_list ap;\n  va_start(ap, fmt);\n  result = _opVFormat(kStringBuilderOpAppend, fmt, ap);\n  va_end(ap);\n\n  return result;\n}\n\nbool StringBuilder::eq(const char* str, size_t len) const\n{\n  const char* aData = _data;\n  const char* bData = str;\n\n  size_t aLength = _length;\n  size_t bLength = len;\n\n  if (bLength == kInvalidSize)\n  {\n    size_t i;\n    for (i = 0; i < aLength; i++)\n    {\n      if (aData[i] != bData[i] || bData[i] == 0)\n        return false;\n    }\n\n    return bData[i] == 0;\n  }\n  else\n  {\n    if (aLength != bLength)\n      return false;\n\n    return ::memcmp(aData, bData, aLength) == 0;\n  }\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/stringbuilder.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_STRINGBUILDER_H\n#define _ASMJIT_CORE_STRINGBUILDER_H\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/defs.h\"\n\n#include <stdarg.h>\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::StringBuilder]\n// ============================================================================\n\n//! @brief String builder.\n//!\n//! String builder was designed to be able to build a string using append like\n//! operation to append numbers, other strings, or signle characters. It can\n//! allocate it's own buffer or use a buffer created on the stack.\n//!\n//! String builder contains method specific to AsmJit functionality, used for\n//! logging or HTML output.\nstruct StringBuilder\n{\n  ASMJIT_NO_COPY(StringBuilder)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API StringBuilder();\n  ASMJIT_API ~StringBuilder();\n\n  inline StringBuilder(const _DontInitialize&) {}\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get string builder capacity.\n  inline size_t getCapacity() const\n  { return _capacity; }\n\n  //! @brief Get length.\n  inline size_t getLength() const\n  { return _length; }\n\n  //! @brief Get null-terminated string data.\n  inline char* getData()\n  { return _data; }\n\n  //! @brief Get null-terminated string data (const).\n  inline const char* getData() const\n  { return _data; }\n\n  // --------------------------------------------------------------------------\n  // [Prepare / Reserve]\n  // --------------------------------------------------------------------------\n\n  //! @brief Prepare to set/append.\n  ASMJIT_API char* prepare(uint32_t op, size_t len);\n\n  //! @brief Reserve @a to bytes in string builder.\n  ASMJIT_API bool reserve(size_t to);\n\n  // --------------------------------------------------------------------------\n  // [Clear]\n  // --------------------------------------------------------------------------\n\n  //! @brief Clear the content in String builder.\n  ASMJIT_API void clear();\n\n  // --------------------------------------------------------------------------\n  // [Methods]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API bool _opString(uint32_t op, const char* str, size_t len = kInvalidSize);\n  ASMJIT_API bool _opVFormat(uint32_t op, const char* fmt, va_list ap); \n  ASMJIT_API bool _opChars(uint32_t op, char c, size_t len);\n  ASMJIT_API bool _opNumber(uint32_t op, uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0);\n  ASMJIT_API bool _opHex(uint32_t op, const void* data, size_t length);\n\n  //! @brief Replace the current content by @a str of @a len.\n  inline bool setString(const char* str, size_t len = kInvalidSize)\n  { return _opString(kStringBuilderOpSet, str, len); }\n\n  //! @brief Replace the current content by formatted string @a fmt.\n  inline bool setVFormat(const char* fmt, va_list ap)\n  { return _opVFormat(kStringBuilderOpSet, fmt, ap); }\n\n  //! @brief Replace the current content by formatted string @a fmt.\n  ASMJIT_API bool setFormat(const char* fmt, ...);\n\n  //! @brief Replace the current content by @a c of @a len.\n  inline bool setChars(char c, size_t len)\n  { return _opChars(kStringBuilderOpSet, c, len); }\n\n  //! @brief Replace the current content by @a i..\n  inline bool setNumber(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0)\n  { return _opNumber(kStringBuilderOpSet, i, base, width, flags); }\n\n  //! @brief Append @a str of @a len.\n  inline bool appendString(const char* str, size_t len = kInvalidSize)\n  { return _opString(kStringBuilderOpAppend, str, len); }\n\n  //! @brief Append a formatted string @a fmt to the current content.\n  inline bool appendVFormat(const char* fmt, va_list ap)\n  { return _opVFormat(kStringBuilderOpAppend, fmt, ap); }\n\n  //! @brief Append a formatted string @a fmt to the current content.\n  ASMJIT_API bool appendFormat(const char* fmt, ...);\n\n  //! @brief Append @a c of @a len.\n  inline bool appendChars(char c, size_t len)\n  { return _opChars(kStringBuilderOpAppend, c, len); }\n\n  //! @brief Append @a i.\n  inline bool appendNumber(uint64_t i, uint32_t base = 0, size_t width = 0, uint32_t flags = 0)\n  { return _opNumber(kStringBuilderOpAppend, i, base, width, flags); }\n\n  //! @brief Check for equality with other @a str.\n  ASMJIT_API bool eq(const char* str, size_t len = kInvalidSize) const;\n\n  //! @brief Check for equality with StringBuilder @a other.\n  inline bool eq(const StringBuilder& other) const\n  { return eq(other._data); }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n  inline bool operator==(const StringBuilder& other) const { return  eq(other); }\n  inline bool operator!=(const StringBuilder& other) const { return !eq(other); }\n\n  inline bool operator==(const char* str) const { return  eq(str); }\n  inline bool operator!=(const char* str) const { return !eq(str); }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief String data.\n  char* _data;\n  //! @brief Length.\n  size_t _length;\n  //! @brief Capacity.\n  size_t _capacity;\n  //! @brief Whether the string can be freed.\n  size_t _canFree;\n};\n\n// ============================================================================\n// [AsmJit::StringBuilderT]\n// ============================================================================\n\ntemplate<size_t N>\nstruct StringBuilderT : public StringBuilder\n{\n  ASMJIT_NO_COPY(StringBuilderT<N>)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline StringBuilderT() :\n    StringBuilder(_DontInitialize())\n  {\n    _data = _embeddedData;\n    _data[0] = 0;\n\n    _length = 0;\n    _capacity = 0;\n    _canFree = false;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Embedded data.\n  char _embeddedData[(N + sizeof(uintptr_t)) & ~(sizeof(uintptr_t) - 1)];\n};\n\n//! @}\n\n} // AsmJit namespace\n\n#endif // _ASMJIT_CORE_STRINGBUILDER_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/stringutil.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/stringutil.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::StringUtil]\n// ============================================================================\n\nstatic const char letters[] = \"0123456789ABCDEF\";\n\nchar* StringUtil::copy(char* dst, const char* src, size_t len)\n{\n  if (src == NULL)\n    return dst;\n\n  if (len == kInvalidSize)\n  {\n    while (*src) *dst++ = *src++;\n  }\n  else\n  {\n    memcpy(dst, src, len);\n    dst += len;\n  }\n\n  return dst;\n}\n\nchar* StringUtil::fill(char* dst, const int c, size_t len)\n{\n  memset(dst, c, len);\n  return dst + len;\n}\n\nchar* StringUtil::hex(char* dst, const uint8_t* src, size_t len)\n{\n  for (size_t i = len; i; i--, dst += 2, src += 1)\n  {\n    dst[0] = letters[(src[0] >> 4) & 0xF];\n    dst[1] = letters[(src[0]     ) & 0xF];\n  }\n\n  return dst;\n}\n\n// Not too efficient, but this is mainly for debugging:)\nchar* StringUtil::utoa(char* dst, uintptr_t i, size_t base)\n{\n  ASMJIT_ASSERT(base <= 16);\n\n  char buf[128];\n  char* p = buf + 128;\n\n  do {\n    uintptr_t b = i % base;\n    *--p = letters[b];\n    i /= base;\n  } while (i);\n\n  return StringUtil::copy(dst, p, (size_t)(buf + 128 - p));\n}\n\nchar* StringUtil::itoa(char* dst, intptr_t i, size_t base)\n{\n  if (i < 0)\n  {\n    *dst++ = '-';\n    i = -i;\n  }\n\n  return StringUtil::utoa(dst, (size_t)i, base);\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/stringutil.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_STRINGUTIL_H\n#define _ASMJIT_CORE_STRINGUTIL_H\n\n// [Dependencies - AsmJit]\n#include \"../core/defs.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::StringUtil]\n// ============================================================================\n\n//! @brief String utilities.\nstruct StringUtil\n{\n  ASMJIT_API static char* copy(char* dst, const char* src, size_t len = kInvalidSize);\n  ASMJIT_API static char* fill(char* dst, const int c, size_t len);\n  ASMJIT_API static char* hex(char* dst, const uint8_t* src, size_t len);\n\n  ASMJIT_API static char* utoa(char* dst, uintptr_t i, size_t base = 10);\n  ASMJIT_API static char* itoa(char* dst, intptr_t i, size_t base = 10);\n\n  static inline void memset32(uint32_t* p, uint32_t c, size_t len)\n  {\n    for (size_t i = 0; i < len; i++) p[i] = c;\n  }\n};\n\n//! @}\n\n} // AsmJit namespace\n\n#endif // _ASMJIT_CORE_STRINGUTIL_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/virtualmemory.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/intutil.h\"\n#include \"../core/virtualmemory.h\"\n\n// [Dependencies - Windows]\n#if defined(ASMJIT_WINDOWS)\n# include <windows.h>\n#endif // ASMJIT_WINDOWS\n\n// [Dependencies - Posix]\n#if defined(ASMJIT_POSIX)\n# include <sys/types.h>\n# include <sys/mman.h>\n# include <unistd.h>\n#endif // ASMJIT_POSIX\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::VirtualMemory - Windows]\n// ============================================================================\n\n#if defined(ASMJIT_WINDOWS)\nstruct VirtualMemoryLocal\n{\n  VirtualMemoryLocal()\n   \n  {\n    SYSTEM_INFO info;\n    GetSystemInfo(&info);\n\n    alignment = info.dwAllocationGranularity;\n    pageSize = IntUtil::roundUpToPowerOf2<uint32_t>(info.dwPageSize);\n  }\n\n  size_t alignment;\n  size_t pageSize;\n};\n\nstatic VirtualMemoryLocal& vm()\n \n{\n  static VirtualMemoryLocal vm;\n  return vm;\n};\n\nvoid* VirtualMemory::alloc(size_t length, size_t* allocated, bool canExecute)\n \n{\n  return allocProcessMemory(GetCurrentProcess(), length, allocated, canExecute);\n}\n\nvoid VirtualMemory::free(void* addr, size_t length)\n \n{\n  return freeProcessMemory(GetCurrentProcess(), addr, length);\n}\n\nvoid* VirtualMemory::allocProcessMemory(HANDLE hProcess, size_t length, size_t* allocated, bool canExecute)\n \n{\n  // VirtualAlloc rounds allocated size to page size automatically.\n  size_t msize = IntUtil::roundUp(length, vm().pageSize);\n\n  // Windows XP SP2 / Vista allow Data Excution Prevention (DEP).\n  WORD protect = canExecute ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;\n  LPVOID mbase = VirtualAllocEx(hProcess, NULL, msize, MEM_COMMIT | MEM_RESERVE, protect);\n  if (mbase == NULL) return NULL;\n\n  ASMJIT_ASSERT(IntUtil::isAligned<size_t>(reinterpret_cast<size_t>(mbase), vm().alignment));\n\n  if (allocated != NULL)\n    *allocated = msize;\n  return mbase;\n}\n\nvoid VirtualMemory::freeProcessMemory(HANDLE hProcess, void* addr, size_t /* length */)\n \n{\n  VirtualFreeEx(hProcess, addr, 0, MEM_RELEASE);\n}\n\nsize_t VirtualMemory::getAlignment()\n \n{\n  return vm().alignment;\n}\n\nsize_t VirtualMemory::getPageSize()\n \n{\n  return vm().pageSize;\n}\n#endif // ASMJIT_WINDOWS\n\n// ============================================================================\n// [AsmJit::VirtualMemory - Posix]\n// ============================================================================\n\n#if defined(ASMJIT_POSIX)\n\n// MacOS uses MAP_ANON instead of MAP_ANONYMOUS.\n#if !defined(MAP_ANONYMOUS)\n# define MAP_ANONYMOUS MAP_ANON\n#endif // MAP_ANONYMOUS\n\nstruct VirtualMemoryLocal\n{\n  VirtualMemoryLocal()\n  {\n    alignment = pageSize = ::getpagesize();\n  }\n\n  size_t alignment;\n  size_t pageSize;\n};\n\nstatic VirtualMemoryLocal& vm()\n \n{\n  static VirtualMemoryLocal vm;\n  return vm;\n}\n\nvoid* VirtualMemory::alloc(size_t length, size_t* allocated, bool canExecute)\n \n{\n  size_t msize = IntUtil::roundUp<size_t>(length, vm().pageSize);\n  int protection = PROT_READ | PROT_WRITE | (canExecute ? PROT_EXEC : 0);\n\n  void* mbase = ::mmap(NULL, msize, protection, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n  if (mbase == MAP_FAILED)\n    return NULL;\n  \n  if (allocated != NULL)\n    *allocated = msize;\n  return mbase;\n}\n\nvoid VirtualMemory::free(void* addr, size_t length)\n \n{\n  munmap(addr, length);\n}\n\nsize_t VirtualMemory::getAlignment()\n \n{\n  return vm().alignment;\n}\n\nsize_t VirtualMemory::getPageSize()\n \n{\n  return vm().pageSize;\n}\n#endif // ASMJIT_POSIX\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/virtualmemory.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_VIRTUALMEMORY_H\n#define _ASMJIT_CORE_VIRTUALMEMORY_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::VirtualMemory]\n// ============================================================================\n\n//! @brief Class that helps with allocating memory for executing code\n//! generated by JIT compiler.\n//!\n//! There are defined functions that provides facility to allocate and free\n//! memory where can be executed code. If processor and operating system\n//! supports execution protection then you can't run code from normally\n//! malloc()'ed memory.\n//!\n//! Functions are internally implemented by operating system dependent way.\n//! VirtualAlloc() function is used for Windows operating system and mmap()\n//! for posix ones. If you want to study or create your own functions, look\n//! at VirtualAlloc() or mmap() documentation (depends on you target OS).\n//!\n//! Under posix operating systems is also useable mprotect() function, that\n//! can enable execution protection to malloc()'ed memory block.\nstruct VirtualMemory\n{\n  //! @brief Allocate virtual memory.\n  //!\n  //! Pages are readable/writeable, but they are not guaranteed to be\n  //! executable unless 'canExecute' is true. Returns the address of\n  //! allocated memory, or NULL if failed.\n  ASMJIT_API static void* alloc(size_t length, size_t* allocated, bool canExecute);\n\n  //! @brief Free memory allocated by @c alloc()\n  ASMJIT_API static void free(void* addr, size_t length);\n\n#if defined(ASMJIT_WINDOWS)\n  //! @brief Allocate virtual memory of @a hProcess.\n  //!\n  //! @note This function is Windows specific.\n  ASMJIT_API static void* allocProcessMemory(HANDLE hProcess, size_t length, size_t* allocated, bool canExecute);\n\n  //! @brief Free virtual memory of @a hProcess.\n  //!\n  //! @note This function is Windows specific.\n  ASMJIT_API static void freeProcessMemory(HANDLE hProcess, void* addr, size_t length);\n#endif // ASMJIT_WINDOWS\n\n  //! @brief Get the alignment guaranteed by alloc().\n  ASMJIT_API static size_t getAlignment();\n\n  //! @brief Get size of single page.\n  ASMJIT_API static size_t getPageSize();\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_VIRTUALMEMORY_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/zonememory.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/defs.h\"\n#include \"../core/intutil.h\"\n#include \"../core/zonememory.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::ZoneMemory]\n// ============================================================================\n\nZoneMemory::ZoneMemory(size_t chunkSize)\n{\n  _chunks = NULL;\n  _total = 0;\n  _chunkSize = chunkSize;\n}\n\nZoneMemory::~ZoneMemory()\n{\n  reset();\n}\n\nvoid* ZoneMemory::alloc(size_t size)\n{\n  ZoneChunk* cur = _chunks;\n\n  // Align to 4 or 8 bytes.\n  size = IntUtil::align<size_t>(size, sizeof(size_t));\n\n  if (cur == NULL || cur->getRemainingBytes() < size)\n  {\n    size_t chSize = _chunkSize;\n \n    if (chSize < size)\n      chSize = size;\n\n    cur = (ZoneChunk*)ASMJIT_MALLOC(sizeof(ZoneChunk) - sizeof(void*) + chSize);\n    if (cur == NULL)\n      return NULL;\n\n    cur->prev = _chunks;\n    cur->pos = 0;\n    cur->size = chSize;\n\n    _chunks = cur;\n  }\n\n  uint8_t* p = cur->data + cur->pos;\n  cur->pos += size;\n  _total += size;\n\n  ASMJIT_ASSERT(cur->pos <= cur->size);\n  return (void*)p;\n}\n\nchar* ZoneMemory::sdup(const char* str)\n{\n  if (str == NULL) return NULL;\n\n  size_t len = strlen(str);\n  if (len == 0) return NULL;\n\n  // Include NULL terminator and limit string length.\n  if (++len > 256)\n    len = 256;\n\n  char* m = reinterpret_cast<char*>(alloc(IntUtil::align<size_t>(len, 16)));\n  if (m == NULL)\n    return NULL;\n\n  memcpy(m, str, len);\n  m[len - 1] = '\\0';\n  return m;\n}\n\nvoid ZoneMemory::clear()\n{\n  ZoneChunk* cur = _chunks;\n\n  if (cur == NULL)\n    return;\n\n  cur = cur->prev;\n  while (cur != NULL)\n  {\n    ZoneChunk* prev = cur->prev;\n    ASMJIT_FREE(cur);\n    cur = prev;\n  }\n\n  _chunks->pos = 0;\n  _chunks->prev = NULL;\n  _total = 0;\n}\n\nvoid ZoneMemory::reset()\n{\n  ZoneChunk* cur = _chunks;\n\n  _chunks = NULL;\n  _total = 0;\n\n  while (cur != NULL)\n  {\n    ZoneChunk* prev = cur->prev;\n    ASMJIT_FREE(cur);\n    cur = prev;\n  }\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core/zonememory.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_ZONEMEMORY_H\n#define _ASMJIT_CORE_ZONEMEMORY_H\n\n// [Dependencies - AsmJit]\n#include \"../core/build.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_Core\n//! @{\n\n// ============================================================================\n// [AsmJit::ZoneChunk]\n// ============================================================================\n\n//! @internal\n//!\n//! @brief One allocated chunk of memory.\nstruct ZoneChunk\n{\n  // --------------------------------------------------------------------------\n  // [Methods]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get count of remaining (unused) bytes in chunk.\n  inline size_t getRemainingBytes() const { return size - pos; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Link to previous chunk.\n  ZoneChunk* prev;\n  //! @brief Position in this chunk.\n  size_t pos;\n  //! @brief Size of this chunk (in bytes).\n  size_t size;\n\n  //! @brief Data.\n  uint8_t data[sizeof(void*)];\n};\n\n// ============================================================================\n// [AsmJit::ZoneMemory]\n// ============================================================================\n\n//! @brief Memory allocator designed to fast alloc memory that will be freed\n//! in one step.\n//!\n//! @note This is hackery for performance. Concept is that objects created\n//! by @c ZoneMemory are freed all at once. This means that lifetime of \n//! these objects are the same as the zone object itself.\nstruct ZoneMemory\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create new instance of @c ZoneMemory.\n  //! @param chunkSize Default size for one zone chunk.\n  ASMJIT_API ZoneMemory(size_t chunkSize);\n\n  //! @brief Destroy @ref ZoneMemory instance.\n  ASMJIT_API ~ZoneMemory();\n\n  // --------------------------------------------------------------------------\n  // [Methods]\n  // --------------------------------------------------------------------------\n\n  //! @brief Allocate @c size bytes of memory and return pointer to it.\n  //!\n  //! Pointer allocated by this way will be valid until @c ZoneMemory object\n  //! is destroyed. To create class by this way use placement @c new and \n  //! @c delete operators:\n  //!\n  //! @code\n  //! // Example of allocating simple class\n  //!\n  //! // Your class\n  //! class Object\n  //! {\n  //!   // members...\n  //! };\n  //!\n  //! // Your function\n  //! void f()\n  //! {\n  //!   // We are using AsmJit namespace\n  //!   using namespace AsmJit\n  //!\n  //!   // Create zone object with chunk size of 65536 bytes.\n  //!   ZoneMemory zone(65536);\n  //!\n  //!   // Create your objects using zone object allocating, for example:\n  //!   Object* obj = new(zone.alloc(sizeof(YourClass))) Object();\n  //! \n  //!   // ... lifetime of your objects ...\n  //! \n  //!   // Destroy your objects:\n  //!   obj->~Object();\n  //!\n  //!   // ZoneMemory destructor will free all memory allocated through it, \n  //!   // alternative is to call @c zone.reset().\n  //! }\n  //! @endcode\n  ASMJIT_API void* alloc(size_t size);\n\n  //! @brief Helper to duplicate string.\n  ASMJIT_API char* sdup(const char* str);\n\n  //! @brief Free all allocated memory except first block that remains for reuse.\n  //!\n  //! Note that this method will invalidate all instances using this memory\n  //! allocated by this zone instance.\n  ASMJIT_API void clear();\n\n  //! @brief Free all allocated memory at once.\n  //!\n  //! Note that this method will invalidate all instances using this memory\n  //! allocated by this zone instance.\n  ASMJIT_API void reset();\n\n  //! @brief Get total size of allocated objects - by @c alloc().\n  inline size_t getTotal() const { return _total; }\n  //! @brief Get (default) chunk size.\n  inline size_t getChunkSize() const { return _chunkSize; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Last allocated chunk of memory.\n  ZoneChunk* _chunks;\n  //! @brief Total size of allocated objects - by @c alloc() method.\n  size_t _total;\n  //! @brief One chunk size.\n  size_t _chunkSize;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n#endif // _ASMJIT_CORE_ZONEMEMORY_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/core.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_CORE_H\n#define _ASMJIT_CORE_H\n\n// [Dependencies - AsmJit]\n#include \"core/build.h\"\n\n#include \"core/assembler.h\"\n#include \"core/assert.h\"\n#include \"core/buffer.h\"\n#include \"core/compiler.h\"\n#include \"core/compilercontext.h\"\n#include \"core/compilerfunc.h\"\n#include \"core/compileritem.h\"\n#include \"core/cpuinfo.h\"\n#include \"core/defs.h\"\n#include \"core/func.h\"\n#include \"core/intutil.h\"\n#include \"core/lock.h\"\n#include \"core/logger.h\"\n#include \"core/memorymanager.h\"\n#include \"core/memorymarker.h\"\n#include \"core/operand.h\"\n#include \"core/podvector.h\"\n#include \"core/stringbuilder.h\"\n#include \"core/stringutil.h\"\n#include \"core/virtualmemory.h\"\n#include \"core/zonememory.h\"\n\n// [Guard]\n#endif // _ASMJIT_CORE_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86assembler.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assembler.h\"\n#include \"../core/context.h\"\n#include \"../core/cpuinfo.h\"\n#include \"../core/defs.h\"\n#include \"../core/intutil.h\"\n#include \"../core/logger.h\"\n#include \"../core/memorymanager.h\"\n#include \"../core/memorymarker.h\"\n#include \"../core/stringutil.h\"\n\n#include \"../x86/x86assembler.h\"\n#include \"../x86/x86cpuinfo.h\"\n#include \"../x86/x86defs.h\"\n#include \"../x86/x86operand.h\"\n#include \"../x86/x86util.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [Constants]\n// ============================================================================\n\nenum { kMaxCommentLength = 80 };\n\n// ============================================================================\n// [AsmJit::X64TrampolineWriter]\n// ============================================================================\n\n#if defined(ASMJIT_X64)\n//! @brief Class used to determine size of trampoline and as trampoline writer.\nstruct X64TrampolineWriter\n{\n  // Size of trampoline\n  enum\n  {\n    kSizeJmp = 6,\n    kSizeAddr = 8,\n    kSizeTotal = kSizeJmp + kSizeAddr\n  };\n\n  // Write trampoline into code at address @a code that will jump to @a target.\n  static void writeTrampoline(uint8_t* code, uint64_t target)\n  {\n    code[0] = 0xFF;                                       // Jmp OpCode.\n    code[1] = 0x25;                                       // ModM (RIP addressing).\n    ((uint32_t*)(code + 2))[0] = 0;                       // Offset (zero).\n    ((uint64_t*)(code + kSizeJmp))[0] = (uint64_t)target; // Absolute address.\n  }\n};\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::X86Assembler - Construction / Destruction]\n// ============================================================================\n\nX86Assembler::X86Assembler(Context* context) :\n  Assembler(context)\n{\n  _properties = IntUtil::maskFromIndex(kX86PropertyOptimizedAlign);\n}\n\nX86Assembler::~X86Assembler()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86Assembler - Buffer - Setters (X86-Extensions)]\n// ============================================================================\n\nvoid X86Assembler::setVarAt(size_t pos, sysint_t i, uint8_t isUnsigned, uint32_t size)\n{\n  if (size == 1 && !isUnsigned) setByteAt (pos, (int8_t  )i);\n  else if (size == 1 &&  isUnsigned) setByteAt (pos, (uint8_t )i);\n  else if (size == 2 && !isUnsigned) setWordAt (pos, (int16_t )i);\n  else if (size == 2 &&  isUnsigned) setWordAt (pos, (uint16_t)i);\n  else if (size == 4 && !isUnsigned) setDWordAt(pos, (int32_t )i);\n  else if (size == 4 &&  isUnsigned) setDWordAt(pos, (uint32_t)i);\n\n#if defined(ASMJIT_X64)\n  else if (size == 8 && !isUnsigned) setQWordAt(pos, (int64_t )i);\n  else if (size == 8 &&  isUnsigned) setQWordAt(pos, (uint64_t)i);\n#endif // ASMJIT_X64\n\n  else\n    ASMJIT_ASSERT(0);\n}\n\n// ============================================================================\n// [AsmJit::X86Assembler - Emit]\n// ============================================================================\n\nvoid X86Assembler::_emitModM(\n  uint8_t opReg, const Mem& mem, sysint_t immSize)\n{\n  ASMJIT_ASSERT(mem.getType() == kOperandMem);\n\n  uint8_t baseReg = mem.getBase() & 0x7;\n  uint8_t indexReg = mem.getIndex() & 0x7;\n  sysint_t disp = mem.getDisplacement();\n  uint32_t shift = mem.getShift();\n\n  if (mem.getMemType() == kOperandMemNative)\n  {\n    // [base + displacemnt]\n    if (!mem.hasIndex())\n    {\n      // ESP/RSP/R12 == 4\n      if (baseReg == 4)\n      {\n        uint8_t mod = 0;\n\n        if (disp)\n          mod = IntUtil::isInt8(disp) ? 1 : 2;\n\n        _emitMod(mod, opReg, 4);\n        _emitSib(0, 4, 4);\n\n        if (disp)\n        {\n          if (IntUtil::isInt8(disp))\n            _emitByte((int8_t)disp);\n          else\n            _emitInt32((int32_t)disp);\n        }\n      }\n      // EBP/RBP/R13 == 5\n      else if (baseReg != 5 && disp == 0)\n      {\n        _emitMod(0, opReg, baseReg);\n      }\n      else if (IntUtil::isInt8(disp))\n      {\n        _emitMod(1, opReg, baseReg);\n        _emitByte((int8_t)disp);\n      }\n      else\n      {\n        _emitMod(2, opReg, baseReg);\n        _emitInt32((int32_t)disp);\n      }\n    }\n\n    // [base + index * scale + displacemnt]\n    else\n    {\n      // ASMJIT_ASSERT(indexReg != RID_ESP);\n\n      // EBP/RBP/R13 == 5\n      if (baseReg != 5 && disp == 0)\n      {\n        _emitMod(0, opReg, 4);\n        _emitSib(shift, indexReg, baseReg);\n      }\n      else if (IntUtil::isInt8(disp))\n      {\n        _emitMod(1, opReg, 4);\n        _emitSib(shift, indexReg, baseReg);\n        _emitByte((int8_t)disp);\n      }\n      else\n      {\n        _emitMod(2, opReg, 4);\n        _emitSib(shift, indexReg, baseReg);\n        _emitInt32((int32_t)disp);\n      }\n    }\n  }\n\n  // Address                       | 32-bit mode | 64-bit mode\n  // ------------------------------+-------------+---------------\n  // [displacement]                |   ABSOLUTE  | RELATIVE (RIP)\n  // [index * scale + displacemnt] |   ABSOLUTE  | ABSOLUTE (ZERO EXTENDED)\n  else\n  {\n    // - In 32-bit mode the absolute addressing model is used.\n    // - In 64-bit mode the relative addressing model is used together with\n    //   the absolute addressing. Main problem is that if instruction\n    //   contains SIB then relative addressing (RIP) is not possible.\n\n#if defined(ASMJIT_X86)\n\n    if (mem.hasIndex())\n    {\n      // ASMJIT_ASSERT(mem.getMemIndex() != 4); // ESP/RSP == 4\n      _emitMod(0, opReg, 4);\n      _emitSib(shift, indexReg, 5);\n    }\n    else\n    {\n      _emitMod(0, opReg, 5);\n    }\n\n    // X86 uses absolute addressing model, all relative addresses will be\n    // relocated to absolute ones.\n    if (mem.getMemType() == kOperandMemLabel)\n    {\n      LabelData& l_data = _labels[mem._mem.base & kOperandIdValueMask];\n      RelocData r_data;\n      uint32_t relocId = _relocData.getLength();\n\n      // Relative addressing will be relocated to absolute address.\n      r_data.type = kRelocRelToAbs;\n      r_data.size = 4;\n      r_data.offset = getOffset();\n      r_data.destination = disp;\n\n      if (l_data.offset != -1)\n      {\n        // Bound label.\n        r_data.destination += l_data.offset;\n\n        // Add a dummy DWORD.\n        _emitInt32(0);\n      }\n      else\n      {\n        // Non-bound label.\n        _emitDisplacement(l_data, -4 - immSize, 4)->relocId = relocId;\n      }\n\n      _relocData.append(r_data);\n    }\n    else\n    {\n      // Absolute address\n      _emitInt32( (int32_t)((uint8_t*)mem._mem.target + disp) );\n    }\n\n#else\n\n    // X64 uses relative addressing model\n    if (mem.getMemType() == kOperandMemLabel)\n    {\n      LabelData& l_data = _labels[mem._mem.base & kOperandIdValueMask];\n\n      if (mem.hasIndex())\n      {\n        // Indexing is not possible.\n        setError(kErrorIllegalAddressing);\n        return;\n      }\n\n      // Relative address (RIP +/- displacement).\n      _emitMod(0, opReg, 5);\n\n      disp -= (4 + immSize);\n\n      if (l_data.offset != -1)\n      {\n        // Bound label.\n        disp += getOffset() - l_data.offset;\n\n        // Displacement is known.\n        _emitInt32((int32_t)disp);\n      }\n      else\n      {\n        // Non-bound label.\n        _emitDisplacement(l_data, disp, 4);\n      }\n    }\n    else\n    {\n      // Absolute address (truncated to 32-bits), this kind of address requires\n      // SIB byte (4).\n      _emitMod(0, opReg, 4);\n\n      if (mem.hasIndex())\n      {\n        // ASMJIT_ASSERT(mem.getMemIndex() != 4); // ESP/RSP == 4\n        _emitSib(shift, indexReg, 5);\n      }\n      else\n      {\n        _emitSib(0, 4, 5);\n      }\n\n      // Truncate to 32-bits.\n      sysuint_t target = (sysuint_t)((uint8_t*)mem._mem.target + disp);\n\n      if (target > (sysuint_t)0xFFFFFFFF)\n      {\n        if (_logger) \n        {\n          _logger->logString(\"*** ASSEMBER WARNING - Absolute address truncated to 32-bits.\\n\");\n        }\n        target &= 0xFFFFFFFF;\n      }\n\n      _emitInt32( (int32_t)((uint32_t)target) );\n    }\n\n#endif // ASMJIT_X64\n\n  }\n}\n\nvoid X86Assembler::_emitModRM(\n  uint8_t opReg, const Operand& op, sysint_t immSize)\n{\n  ASMJIT_ASSERT(op.getType() == kOperandReg || op.getType() == kOperandMem);\n\n  if (op.getType() == kOperandReg)\n    _emitModR(opReg, reinterpret_cast<const Reg&>(op).getRegCode());\n  else\n    _emitModM(opReg, reinterpret_cast<const Mem&>(op), immSize);\n}\n\nvoid X86Assembler::_emitSegmentPrefix(const Operand& rm)\n{\n  static const uint8_t segmentCode[6] =\n  {\n    0x26, // ES\n    0x2E, // SS\n    0x36, // SS\n    0x3E, // DS\n    0x64, // FS\n    0x65  // GS\n  };\n\n  if (!rm.isMem())\n    return;\n\n  uint32_t seg = reinterpret_cast<const Mem&>(rm).getSegment();\n  if (seg >= kX86RegNumSeg)\n    return;\n\n  _emitByte(segmentCode[seg]);\n}\n\nvoid X86Assembler::_emitX86Inl(\n  uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t reg, bool forceRexPrefix)\n{\n  // 16-bit prefix.\n  if (i16bit) _emitByte(0x66);\n\n  // Instruction prefix.\n  if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24));\n\n  // REX prefix.\n#if defined(ASMJIT_X64)\n  _emitRexR(rexw, 0, reg, forceRexPrefix);\n#endif // ASMJIT_X64\n\n  // Instruction opcodes.\n  if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16));\n  if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >>  8));\n\n  _emitByte((uint8_t)(opCode & 0x000000FF) + (reg & 0x7));\n}\n\nvoid X86Assembler::_emitX86RM(\n  uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t o,\n  const Operand& op, sysint_t immSize, bool forceRexPrefix)\n{\n  // 16-bit prefix.\n  if (i16bit) _emitByte(0x66);\n\n  // Segment prefix.\n  _emitSegmentPrefix(op);\n\n  // Instruction prefix.\n  if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24));\n\n  // REX prefix.\n#if defined(ASMJIT_X64)\n  _emitRexRM(rexw, o, op, forceRexPrefix);\n#endif // ASMJIT_X64\n\n  // Instruction opcodes.\n  if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16));\n  if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >>  8));\n  _emitByte((uint8_t)(opCode & 0x000000FF));\n\n  // Mod R/M.\n  _emitModRM(o, op, immSize);\n}\n\nvoid X86Assembler::_emitFpu(uint32_t opCode)\n{\n  _emitOpCode(opCode);\n}\n\nvoid X86Assembler::_emitFpuSTI(uint32_t opCode, uint32_t sti)\n{\n  // Illegal stack offset.\n  ASMJIT_ASSERT(0 <= sti && sti < 8);\n  _emitOpCode(opCode + sti);\n}\n\nvoid X86Assembler::_emitFpuMEM(uint32_t opCode, uint8_t opReg, const Mem& mem)\n{\n  // Segment prefix.\n  _emitSegmentPrefix(mem);\n\n  // Instruction prefix.\n  if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24));\n\n  // REX prefix.\n#if defined(ASMJIT_X64)\n  _emitRexRM(0, opReg, mem, false);\n#endif // ASMJIT_X64\n\n  // Instruction opcodes.\n  if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16));\n  if (opCode & 0x0000FF00) _emitByte((uint8_t)((opCode & 0x0000FF00) >>  8));\n\n  _emitByte((uint8_t)((opCode & 0x000000FF)));\n  _emitModM(opReg, mem, 0);\n}\n\nvoid X86Assembler::_emitMmu(uint32_t opCode, uint8_t rexw, uint8_t opReg,\n  const Operand& src, sysint_t immSize)\n{\n  // Segment prefix.\n  _emitSegmentPrefix(src);\n\n  // Instruction prefix.\n  if (opCode & 0xFF000000) _emitByte((uint8_t)((opCode & 0xFF000000) >> 24));\n\n  // REX prefix.\n#if defined(ASMJIT_X64)\n  _emitRexRM(rexw, opReg, src, false);\n#endif // ASMJIT_X64\n\n  // Instruction opcodes.\n  if (opCode & 0x00FF0000) _emitByte((uint8_t)((opCode & 0x00FF0000) >> 16));\n\n  // No checking, MMX/SSE instructions have always two opcodes or more.\n  _emitByte((uint8_t)((opCode & 0x0000FF00) >> 8));\n  _emitByte((uint8_t)((opCode & 0x000000FF)));\n\n  if (src.isReg())\n    _emitModR(opReg, reinterpret_cast<const Reg&>(src).getRegCode());\n  else\n    _emitModM(opReg, reinterpret_cast<const Mem&>(src), immSize);\n}\n\nX86Assembler::LabelLink* X86Assembler::_emitDisplacement(\n  LabelData& l_data, sysint_t inlinedDisplacement, int size)\n{\n  ASMJIT_ASSERT(l_data.offset == -1);\n  ASMJIT_ASSERT(size == 1 || size == 4);\n\n  // Chain with label.\n  LabelLink* link = _newLabelLink();\n  link->prev = l_data.links;\n  link->offset = getOffset();\n  link->displacement = inlinedDisplacement;\n\n  l_data.links = link;\n\n  // Emit label size as dummy data.\n  if (size == 1)\n    _emitByte(0x01);\n  else // if (size == 4)\n    _emitDWord(0x04040404);\n\n  return link;\n}\n\nvoid X86Assembler::_emitJmpOrCallReloc(uint32_t instruction, void* target)\n{\n  RelocData rd;\n\n  rd.type = kRelocTrampoline;\n\n#if defined(ASMJIT_X64)\n  // If we are compiling in 64-bit mode, we can use trampoline if relative jump\n  // is not possible.\n  _trampolineSize += X64TrampolineWriter::kSizeTotal;\n#endif // ARCHITECTURE_SPECIFIC\n\n  rd.size = 4;\n  rd.offset = getOffset();\n  rd.address = target;\n\n  _relocData.append(rd);\n\n  // Emit dummy 32-bit integer (will be overwritten by relocCode()).\n  _emitInt32(0);\n}\n\n//! @internal\n//!\n//! @brief Get whether the extended register (additional eight registers\n//! introduced by 64-bit mode) is used.\nstatic inline bool X86Assembler_isExtRegisterUsed(const Operand& op)\n{\n  // Hacky, but correct.\n  // - If operand type is register then extended register is register with\n  //   index 8 and greater (8 to 15 inclusive).\n  // - If operand type is memory operand then we need to take care about\n  //   label (in _mem.base) and kInvalidValue, we just decrement the value\n  //   by 8 and check if it's at interval 0 to 7 inclusive (if it's there\n  //   then it's extended register.\n  return (op.isReg() && (op._reg.code & kRegIndexMask)  >= 8U) ||\n         (op.isMem() && ((((uint32_t)op._mem.base  - 8U) < 8U) ||\n                         (((uint32_t)op._mem.index - 8U) < 8U) ));\n}\n\n// Logging helpers.\nstatic const char* AssemblerX86_operandSize[] =\n{\n  NULL,\n  \"byte ptr \",\n  \"word ptr \",\n  NULL,\n  \"dword ptr \",\n  NULL,\n  NULL,\n  NULL,\n  \"qword ptr \",\n  NULL,\n  \"tword ptr \",\n  NULL,\n  NULL,\n  NULL,\n  NULL,\n  NULL,\n  \"dqword ptr \"\n};\n\nstatic const char X86Assembler_segmentName[] =\n  \"es:\\0\"\n  \"cs:\\0\"\n  \"ss:\\0\"\n  \"ds:\\0\"\n  \"fs:\\0\"\n  \"gs:\\0\"\n  \"\\0\\0\\0\\0\";\n\nstatic char* X86Assembler_dumpInstructionName(char* buf, uint32_t code)\n{\n  ASMJIT_ASSERT(code < _kX86InstCount);\n  return StringUtil::copy(buf, x86InstInfo[code].getName());\n}\n\nchar* X86Assembler_dumpRegister(char* buf, uint32_t type, uint32_t index)\n{\n  // NE == Not-Encodable.\n  const char reg8l[] = \"al\\0\\0\" \"cl\\0\\0\" \"dl\\0\\0\" \"bl\\0\\0\" \"spl\\0\"  \"bpl\\0\"  \"sil\\0\"  \"dil\\0\" ;\n  const char reg8h[] = \"ah\\0\\0\" \"ch\\0\\0\" \"dh\\0\\0\" \"bh\\0\\0\" \"NE\\0\\0\" \"NE\\0\\0\" \"NE\\0\\0\" \"NE\\0\\0\";\n  const char reg16[] = \"ax\\0\\0\" \"cx\\0\\0\" \"dx\\0\\0\" \"bx\\0\\0\" \"sp\\0\\0\" \"bp\\0\\0\" \"si\\0\\0\" \"di\\0\\0\";\n\n  switch (type)\n  {\n    case kX86RegTypeGpbLo:\n      if (index < 8)\n        return StringUtil::copy(buf, &reg8l[index*4]);\n\n      *buf++ = 'r';\n      goto _EmitID;\n\n    case kX86RegTypeGpbHi:\n      if (index < 4)\n        return StringUtil::copy(buf, &reg8h[index*4]);\n\n_EmitNE:\n      return StringUtil::copy(buf, \"NE\");\n\n    case kX86RegTypeGpw:\n      if (index < 8)\n        return StringUtil::copy(buf, &reg16[index*4]);\n\n      *buf++ = 'r';\n      buf = StringUtil::utoa(buf, index);\n      *buf++ = 'w';\n      return buf;\n\n    case kX86RegTypeGpd:\n      if (index < 8)\n      {\n        *buf++ = 'e';\n        return StringUtil::copy(buf, &reg16[index*4]);\n      }\n\n      *buf++ = 'r';\n      buf = StringUtil::utoa(buf, index);\n      *buf++ = 'd';\n      return buf;\n    \n    case kX86RegTypeGpq:\n      *buf++ = 'r';\n\n      if (index < 8)\n        return StringUtil::copy(buf, &reg16[index*4]);\n\n_EmitID:\n      return StringUtil::utoa(buf, index);\n    \n    case kX86RegTypeX87:\n      *buf++ = 's';\n      *buf++ = 't';\n      goto _EmitID;\n    \n    case kX86RegTypeMm:\n      *buf++ = 'm';\n      *buf++ = 'm';\n      goto _EmitID;\n    \n    case kX86RegTypeXmm:\n      *buf++ = 'x';\n      *buf++ = 'm';\n      *buf++ = 'm';\n      goto _EmitID;\n    \n    case kX86RegTypeYmm:\n      *buf++ = 'y';\n      *buf++ = 'm';\n      *buf++ = 'm';\n      goto _EmitID;\n\n    case kX86RegTypeSeg:\n      if (index < kX86RegNumSeg)\n        return StringUtil::copy(buf, &X86Assembler_segmentName[index*4], 2);\n      \n      goto _EmitNE;\n\n    default:\n      return buf;\n  }\n}\n\nchar* X86Assembler_dumpOperand(char* buf, const Operand* op, uint32_t memRegType, uint32_t loggerFlags)\n{\n  if (op->isReg())\n  {\n    const Reg& reg = reinterpret_cast<const Reg&>(*op);\n    return X86Assembler_dumpRegister(buf, reg.getRegType(), reg.getRegIndex());\n  }\n  else if (op->isMem())\n  {\n    const Mem& mem = reinterpret_cast<const Mem&>(*op);\n    uint32_t seg = mem.getSegment();\n\n    bool isAbsolute = false;\n\n    if (op->getSize() <= 16)\n      buf = StringUtil::copy(buf, AssemblerX86_operandSize[op->getSize()]);\n\n    if (seg < kX86RegNumSeg)\n      buf = StringUtil::copy(buf, &X86Assembler_segmentName[seg * 4]);\n\n    *buf++ = '[';\n\n    switch (mem.getMemType())\n    {\n      case kOperandMemNative:\n      {\n        // [base + index << shift + displacement]\n        buf = X86Assembler_dumpRegister(buf, memRegType, mem.getBase());\n        break;\n      }\n      case kOperandMemLabel:\n      {\n        // [label + index << shift + displacement]\n        buf += sprintf(buf, \"L.%u\", mem.getBase() & kOperandIdValueMask);\n        break;\n      }\n      case kOperandMemAbsolute:\n      {\n        // [absolute]\n        isAbsolute = true;\n        buf = StringUtil::utoa(buf, (sysuint_t)mem.getTarget() + mem.getDisplacement(), 16);\n        break;\n      }\n    }\n\n    if (mem.hasIndex())\n    {\n      buf = StringUtil::copy(buf, \" + \");\n      buf = X86Assembler_dumpRegister(buf, memRegType, mem.getIndex());\n\n      if (mem.getShift())\n      {\n        buf = StringUtil::copy(buf, \" * \");\n        *buf++ = \"1248\"[mem.getShift() & 3];\n      }\n    }\n\n    if (mem.getDisplacement() && !isAbsolute)\n    {\n      sysint_t d = mem.getDisplacement();\n      uint32_t base = 10;\n      char sign = '+';\n\n      if (d < 0)\n      {\n        d = -d;\n        sign = '-';\n      }\n\n      buf[0] = ' ';\n      buf[1] = sign;\n      buf[2] = ' ';\n      buf += 3;\n\n      if ((loggerFlags & kLoggerOutputHexDisplacement) != 0 && d > 9)\n      {\n        buf[0] = '0';\n        buf[1] = 'x';\n        buf += 2;\n        base = 16;\n      }\n\n      buf = StringUtil::utoa(buf, static_cast<uintptr_t>(d), base);\n    }\n\n    *buf++ = ']';\n    return buf;\n  }\n  else if (op->isImm())\n  {\n    const Imm& i = reinterpret_cast<const Imm&>(*op);\n\n    sysuint_t value = i.getUValue();\n    uint32_t base = 10;\n\n    if ((loggerFlags & kLoggerOutputHexImmediate) && value > 9)\n      base = 16;\n\n    if (i.isUnsigned() || base == 16)\n    {\n      return StringUtil::utoa(buf, value, base);\n    }\n    else\n    {\n      return StringUtil::itoa(buf, static_cast<sysint_t>(value), base);\n    }\n  }\n  else if (op->isLabel())\n  {\n    return buf + sprintf(buf, \"L.%u\", op->getId() & kOperandIdValueMask);\n  }\n  else\n  {\n    return StringUtil::copy(buf, \"None\");\n  }\n}\n\nstatic char* X86Assembler_dumpInstruction(char* buf,\n  uint32_t code, uint32_t emitOptions,\n  const Operand* o0,\n  const Operand* o1,\n  const Operand* o2,\n  uint32_t memRegType,\n  uint32_t loggerFlags)\n{\n  // Rex, lock, and short prefix.\n  if (emitOptions & kX86EmitOptionRex)\n    buf = StringUtil::copy(buf, \"rex \", 4);\n  \n  if (emitOptions & kX86EmitOptionLock)\n    buf = StringUtil::copy(buf, \"lock \", 5);\n  \n  if (emitOptions & kX86EmitOptionShortJump)\n    buf = StringUtil::copy(buf, \"short \", 6);\n\n  // Dump instruction name.\n  buf = X86Assembler_dumpInstructionName(buf, code);\n\n  // Dump operands.\n  if (!o0->isNone()) { *buf++ = ' ';               buf = X86Assembler_dumpOperand(buf, o0, memRegType, loggerFlags); }\n  if (!o1->isNone()) { *buf++ = ','; *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o1, memRegType, loggerFlags); }\n  if (!o2->isNone()) { *buf++ = ','; *buf++ = ' '; buf = X86Assembler_dumpOperand(buf, o2, memRegType, loggerFlags); }\n\n  return buf;\n}\n\nstatic char* X86Assembler_dumpComment(char* buf, size_t len, const uint8_t* binaryData, size_t binaryLen, const char* comment)\n{\n  size_t currentLength = len;\n  size_t commentLength = comment ? strnlen(comment, kMaxCommentLength) : 0;\n\n  if (binaryLen || commentLength)\n  {\n    size_t align = 32;\n    char sep = ';';\n\n    for (size_t i = (binaryLen == 0); i < 2; i++)\n    {\n      char* bufBegin = buf;\n\n      // Append align.\n      if (currentLength < align) \n      {\n        buf = StringUtil::fill(buf, ' ', align - currentLength);\n      }\n\n      // Append separator.\n      if (sep)\n      {\n        *buf++ = sep;\n        *buf++ = ' ';\n      }\n\n      // Append binary data or comment.\n      if (i == 0)\n      {\n        buf = StringUtil::hex(buf, binaryData, binaryLen);\n        if (commentLength == 0)\n          break;\n      }\n      else\n      {\n        buf = StringUtil::copy(buf, comment, commentLength);\n      }\n\n      currentLength += (size_t)(buf - bufBegin);\n      align += 18;\n      sep = '|';\n    }\n  }\n\n  *buf++ = '\\n';\n  return buf;\n}\n\nstatic const _OpReg _patchedHiRegs[4] =\n{\n  // Operand   |Size|Reserved0|Reserved1| OperandId    | RegisterCode          |\n  // ----------+----+---------+---------+--------------+-----------------------+\n  { kOperandReg, 1, {0        ,0       }, kInvalidValue, kX86RegTypeGpbLo | 4 },\n  { kOperandReg, 1, {0        ,0       }, kInvalidValue, kX86RegTypeGpbLo | 5 },\n  { kOperandReg, 1, {0        ,0       }, kInvalidValue, kX86RegTypeGpbLo | 6 },\n  { kOperandReg, 1, {0        ,0       }, kInvalidValue, kX86RegTypeGpbLo | 7 }\n};\n\nvoid X86Assembler::_emitInstruction(uint32_t code)\n{\n  _emitInstruction(code, &noOperand, &noOperand, &noOperand);\n}\n\nvoid X86Assembler::_emitInstruction(uint32_t code, const Operand* o0)\n{\n  _emitInstruction(code, o0, &noOperand, &noOperand);\n}\n\nvoid X86Assembler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1)\n{\n  _emitInstruction(code, o0, o1, &noOperand);\n}\n\nvoid X86Assembler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2)\n{\n  ASMJIT_ASSERT(o0 != NULL);\n  ASMJIT_ASSERT(o1 != NULL);\n  ASMJIT_ASSERT(o2 != NULL);\n\n  const Operand* _loggerOperands[3];\n\n  uint32_t bLoHiUsed = 0;\n#if defined(ASMJIT_X86)\n  uint32_t forceRexPrefix = false;\n#else\n  uint32_t forceRexPrefix = _emitOptions & kX86EmitOptionRex;\n#endif\n  uint32_t memRegType = kX86RegTypeGpz;\n\n#if defined(ASMJIT_DEBUG)\n  bool assertIllegal = false;\n#endif // ASMJIT_DEBUG\n\n  const Imm* immOperand = NULL;\n  uint32_t immSize;\n\n#define _FINISHED() \\\n  goto _End\n\n#define _FINISHED_IMMEDIATE(_Operand_, _Size_) \\\n  do { \\\n    immOperand = reinterpret_cast<const Imm*>(_Operand_); \\\n    immSize = (_Size_); \\\n    goto _EmitImmediate; \\\n  } while (0)\n\n  // Convert operands to kOperandNone if needed.\n  if (o0->isReg()) bLoHiUsed |= o0->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi);\n  if (o1->isReg()) bLoHiUsed |= o1->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi);\n  if (o2->isReg()) bLoHiUsed |= o2->_reg.code & (kX86RegTypeGpbLo | kX86RegTypeGpbHi);\n\n  size_t beginOffset = getOffset();\n  const X86InstInfo* id = &x86InstInfo[code];\n\n  if (code >= _kX86InstCount)\n  {\n    setError(kErrorUnknownInstruction);\n    goto _Cleanup;\n  }\n\n  // Check if register operand is BPL, SPL, SIL, DIL and do action that depends\n  // to current mode:\n  //   - 64-bit: - Force REX prefix.\n  //\n  // Check if register operand is AH, BH, CH or DH and do action that depends\n  // to current mode:\n  //   - 32-bit: - Patch operand index (index += 4), because we are using\n  //               different index what is used in opcode.\n  //   - 64-bit: - Check whether there is REX prefix and raise error if it is.\n  //             - Do the same as in 32-bit mode - patch register index.\n  //\n  // NOTE: This is a hit hacky, but I added this to older code-base and I have\n  // no energy to rewrite it. Maybe in future all of this can be cleaned up!\n  if (bLoHiUsed | forceRexPrefix)\n  {\n    _loggerOperands[0] = o0;\n    _loggerOperands[1] = o1;\n    _loggerOperands[2] = o2;\n\n#if defined(ASMJIT_X64)\n    // Check if there is register that makes this instruction un-encodable.\n\n    forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o0);\n    forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o1);\n    forceRexPrefix |= (uint32_t)X86Assembler_isExtRegisterUsed(*o2);\n\n    if      (o0->isRegType(kX86RegTypeGpbLo) && (o0->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true;\n    else if (o1->isRegType(kX86RegTypeGpbLo) && (o1->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true;\n    else if (o2->isRegType(kX86RegTypeGpbLo) && (o2->_reg.code & kRegIndexMask) >= 4) forceRexPrefix = true;\n\n    if ((bLoHiUsed & kX86RegTypeGpbHi) != 0 && forceRexPrefix)\n    {\n      goto _IllegalInstruction;\n    }\n#endif // ASMJIT_X64\n\n    // Patch GPB.HI operand index.\n    if ((bLoHiUsed & kX86RegTypeGpbHi) != 0)\n    {\n      if (o0->isRegType(kX86RegTypeGpbHi)) o0 = reinterpret_cast<const Operand*>(&_patchedHiRegs[o0->_reg.code & kRegIndexMask]);\n      if (o1->isRegType(kX86RegTypeGpbHi)) o1 = reinterpret_cast<const Operand*>(&_patchedHiRegs[o1->_reg.code & kRegIndexMask]);\n      if (o2->isRegType(kX86RegTypeGpbHi)) o2 = reinterpret_cast<const Operand*>(&_patchedHiRegs[o2->_reg.code & kRegIndexMask]);\n    }\n  }\n\n  // Check for buffer space (and grow if needed).\n  if (!canEmit()) goto _Cleanup;\n\n  if (_emitOptions & kX86EmitOptionLock)\n  {\n    if (!id->isLockable())\n      goto _IllegalInstruction;\n    _emitByte(0xF0);\n  }\n\n  switch (id->getGroup())\n  {\n    case kX86InstGroupNone:\n    {\n      _FINISHED();\n    }\n\n    case kX86InstGroupEmit:\n    {\n      _emitOpCode(id->_opCode[0]);\n      _FINISHED();\n    }\n\n    case kX86InstGroupArith:\n    {\n      uint32_t opCode = id->_opCode[0];\n      uint8_t opReg = (uint8_t)id->_opCodeR;\n\n      // Mem <- Reg\n      if (o0->isMem() && o1->isReg())\n      {\n        _emitX86RM(opCode + (o1->getSize() != 1),\n          o1->getSize() == 2,\n          o1->getSize() == 8,\n          reinterpret_cast<const GpReg&>(*o1).getRegCode(),\n          reinterpret_cast<const Operand&>(*o0),\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      // Reg <- Reg|Mem\n      if (o0->isReg() && o1->isRegMem())\n      {\n        _emitX86RM(opCode + 2 + (o0->getSize() != 1),\n          o0->getSize() == 2,\n          o0->getSize() == 8,\n          reinterpret_cast<const GpReg&>(*o0).getRegCode(),\n          reinterpret_cast<const Operand&>(*o1),\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      // Alternate Form - AL, AX, EAX, RAX.\n      if (o0->isRegIndex(0) && o1->isImm())\n      {\n        if (o0->getSize() == 1 || !IntUtil::isInt8(static_cast<const Imm*>(o1)->getValue()))\n        {\n          if (o0->getSize() == 2)\n            _emitByte(0x66); // 16-bit.\n          else if (o0->getSize() == 8)\n            _emitByte(0x48); // REX.W.\n\n          _emitByte((opReg << 3) | (0x04 + (o0->getSize() != 1)));\n          _FINISHED_IMMEDIATE(o1, IntUtil::_min<uint32_t>(o0->getSize(), 4));\n        }\n      }\n\n      if (o0->isRegMem() && o1->isImm())\n      {\n        const Imm& imm = reinterpret_cast<const Imm&>(*o1);\n        immSize = IntUtil::isInt8(imm.getValue()) ? 1 : IntUtil::_min<uint32_t>(o0->getSize(), 4);\n\n        _emitX86RM(id->_opCode[1] + (o0->getSize() != 1 ? (immSize != 1 ? 1 : 3) : 0),\n          o0->getSize() == 2,\n          o0->getSize() == 8,\n          opReg, reinterpret_cast<const Operand&>(*o0),\n          immSize, forceRexPrefix);\n        _FINISHED_IMMEDIATE(&imm, immSize);\n      }\n\n      break;\n    }\n\n    case kX86InstGroupBSwap:\n    {\n      if (o0->isReg())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n\n#if defined(ASMJIT_X64)\n        _emitRexR(dst.getRegType() == kX86RegTypeGpq, 1, dst.getRegCode(), forceRexPrefix);\n#endif // ASMJIT_X64\n        _emitByte(0x0F);\n        _emitModR(1, dst.getRegCode());\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupBTest:\n    {\n      if (o0->isRegMem() && o1->isReg())\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n        const GpReg& src = reinterpret_cast<const GpReg&>(*o1);\n\n        _emitX86RM(id->_opCode[0],\n          src.isRegType(kX86RegTypeGpw),\n          src.isRegType(kX86RegTypeGpq),\n          src.getRegCode(),\n          dst,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      if (o0->isRegMem() && o1->isImm())\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n        const Imm& src = reinterpret_cast<const Imm&>(*o1);\n\n        _emitX86RM(id->_opCode[1],\n          dst.getSize() == 2,\n          dst.getSize() == 8,\n          (uint8_t)id->_opCodeR,\n          dst,\n          1, forceRexPrefix);\n        _FINISHED_IMMEDIATE(o1, 1);\n      }\n\n      break;\n    }\n\n    case kX86InstGroupCall:\n    {\n      if (o0->isRegTypeMem(kX86RegTypeGpz))\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n        _emitX86RM(0xFF,\n          0,\n          0, 2, dst,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      if (o0->isImm())\n      {\n        const Imm& imm = reinterpret_cast<const Imm&>(*o0);\n        _emitByte(0xE8);\n        _emitJmpOrCallReloc(kX86InstGroupCall, (void*)imm.getValue());\n        _FINISHED();\n      }\n\n      if (o0->isLabel())\n      {\n        LabelData& l_data = _labels[reinterpret_cast<const Label*>(o0)->getId() & kOperandIdValueMask];\n\n        if (l_data.offset != -1)\n        {\n          // Bound label.\n          static const sysint_t rel32_size = 5;\n          sysint_t offs = l_data.offset - getOffset();\n\n          ASMJIT_ASSERT(offs <= 0);\n\n          _emitByte(0xE8);\n          _emitInt32((int32_t)(offs - rel32_size));\n        }\n        else\n        {\n          // Non-bound label.\n          _emitByte(0xE8);\n          _emitDisplacement(l_data, -4, 4);\n        }\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupCrc32:\n    {\n      if (o0->isReg() && o1->isRegMem())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n        const Operand& src = reinterpret_cast<const Operand&>(*o1);\n        ASMJIT_ASSERT(dst.getRegType() == kX86RegTypeGpd || dst.getRegType() == kX86RegTypeGpq);\n\n        _emitX86RM(id->_opCode[0] + (src.getSize() != 1),\n          src.getSize() == 2,\n          dst.getRegType() == 8, dst.getRegCode(), src,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupEnter:\n    {\n      if (o0->isImm() && o1->isImm())\n      {\n        _emitByte(0xC8);\n        _emitWord((uint16_t)(uintptr_t)reinterpret_cast<const Imm&>(*o2).getValue());\n        _emitByte((uint8_t )(uintptr_t)reinterpret_cast<const Imm&>(*o1).getValue());\n        _FINISHED();\n      }\n      break;\n    }\n\n    case kX86InstGroupIMul:\n    {\n      // 1 operand\n      if (o0->isRegMem() && o1->isNone() && o2->isNone())\n      {\n        const Operand& src = reinterpret_cast<const Operand&>(*o0);\n        _emitX86RM(0xF6 + (src.getSize() != 1),\n          src.getSize() == 2,\n          src.getSize() == 8, 5, src,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n      // 2 operands\n      else if (o0->isReg() && !o1->isNone() && o2->isNone())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n        ASMJIT_ASSERT(!dst.isRegType(kX86RegTypeGpw));\n\n        if (o1->isRegMem())\n        {\n          const Operand& src = reinterpret_cast<const Operand&>(*o1);\n\n          _emitX86RM(0x0FAF,\n            dst.isRegType(kX86RegTypeGpw),\n            dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src,\n            0, forceRexPrefix);\n          _FINISHED();\n        }\n        else if (o1->isImm())\n        {\n          const Imm& imm = reinterpret_cast<const Imm&>(*o1);\n\n          if (IntUtil::isInt8(imm.getValue()))\n          {\n            _emitX86RM(0x6B,\n              dst.isRegType(kX86RegTypeGpw),\n              dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), dst,\n              1, forceRexPrefix);\n            _FINISHED_IMMEDIATE(&imm, 1);\n          }\n          else\n          {\n            immSize = dst.isRegType(kX86RegTypeGpw) ? 2 : 4;\n            _emitX86RM(0x69,\n              dst.isRegType(kX86RegTypeGpw),\n              dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), dst,\n              immSize, forceRexPrefix);\n            _FINISHED_IMMEDIATE(&imm, immSize);\n          }\n        }\n      }\n      // 3 operands\n      else if (o0->isReg() && o1->isRegMem() && o2->isImm())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n        const Operand& src = reinterpret_cast<const Operand&>(*o1);\n        const Imm& imm = reinterpret_cast<const Imm&>(*o2);\n\n        if (IntUtil::isInt8(imm.getValue()))\n        {\n          _emitX86RM(0x6B,\n            dst.isRegType(kX86RegTypeGpw),\n            dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src,\n            1, forceRexPrefix);\n          _FINISHED_IMMEDIATE(&imm, 1);\n        }\n        else\n        {\n          immSize = dst.isRegType(kX86RegTypeGpw) ? 2 : 4;\n          _emitX86RM(0x69,\n            dst.isRegType(kX86RegTypeGpw),\n            dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src,\n            immSize, forceRexPrefix);\n          _FINISHED_IMMEDIATE(&imm, immSize);\n        }\n      }\n\n      break;\n    }\n\n    case kX86InstGroupIncDec:\n    {\n      if (o0->isRegMem())\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n\n        // INC [r16|r32] in 64-bit mode is not encodable.\n#if defined(ASMJIT_X86)\n        if ((dst.isReg()) && (dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpd)))\n        {\n          _emitX86Inl(id->_opCode[0],\n            dst.isRegType(kX86RegTypeGpw),\n            0, reinterpret_cast<const Reg&>(dst).getRegCode(),\n            false);\n          _FINISHED();\n        }\n#endif // ASMJIT_X86\n\n        _emitX86RM(id->_opCode[1] + (dst.getSize() != 1),\n          dst.getSize() == 2,\n          dst.getSize() == 8, (uint8_t)id->_opCodeR, dst,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupJcc:\n    {\n      if (o0->isLabel())\n      {\n        LabelData& l_data = _labels[reinterpret_cast<const Label*>(o0)->getId() & kOperandIdValueMask];\n\n        uint32_t hint = (uint32_t)(o1->isImm() ? reinterpret_cast<const Imm&>(*o1).getValue() : 0);\n        bool isShortJump = (_emitOptions & kX86EmitOptionShortJump) != 0;\n\n        // Emit jump hint if configured for that.\n        if ((hint & (kCondHintLikely | kCondHintUnlikely)) && (_properties & (1 << kX86PropertyJumpHints)))\n        {\n          if (hint & kCondHintLikely)\n            _emitByte(kX86CondPrefixLikely);\n          else if (hint & kCondHintUnlikely)\n            _emitByte(kX86CondPrefixUnlikely);\n        }\n\n        if (l_data.offset != -1)\n        {\n          // Bound label.\n          static const sysint_t rel8_size = 2;\n          static const sysint_t rel32_size = 6;\n          sysint_t offs = l_data.offset - getOffset();\n\n          ASMJIT_ASSERT(offs <= 0);\n\n          if (IntUtil::isInt8(offs - rel8_size))\n          {\n            _emitByte(0x70 | (uint8_t)id->_opCode[0]);\n            _emitByte((uint8_t)(int8_t)(offs - rel8_size));\n\n            // Change the emit options so logger can log instruction correctly.\n            _emitOptions |= kX86EmitOptionShortJump;\n          }\n          else\n          {\n            if (isShortJump && _logger)\n            {\n              _logger->logString(\"*** ASSEMBLER WARNING: Emitting long conditional jump, but short jump instruction forced!\\n\");\n              _emitOptions &= ~kX86EmitOptionShortJump;\n            }\n\n            _emitByte(0x0F);\n            _emitByte(0x80 | (uint8_t)id->_opCode[0]);\n            _emitInt32((int32_t)(offs - rel32_size));\n          }\n        }\n        else\n        {\n          // Non-bound label.\n          if (isShortJump)\n          {\n            _emitByte(0x70 | (uint8_t)id->_opCode[0]);\n            _emitDisplacement(l_data, -1, 1);\n          }\n          else\n          {\n            _emitByte(0x0F);\n            _emitByte(0x80 | (uint8_t)id->_opCode[0]);\n            _emitDisplacement(l_data, -4, 4);\n          }\n        }\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupJmp:\n    {\n      if (o0->isRegMem())\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n\n        _emitX86RM(0xFF,\n          0,\n          0, 4, dst,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      if (o0->isImm())\n      {\n        const Imm& imm = reinterpret_cast<const Imm&>(*o0);\n        _emitByte(0xE9);\n        _emitJmpOrCallReloc(kX86InstGroupJmp, (void*)imm.getValue());\n        _FINISHED();\n      }\n\n      if (o0->isLabel())\n      {\n        LabelData& l_data = _labels[reinterpret_cast<const Label*>(o0)->getId() & kOperandIdValueMask];\n        bool isShortJump = (_emitOptions & kX86EmitOptionShortJump) != 0;\n\n        if (l_data.offset != -1)\n        {\n          // Bound label.\n          const sysint_t rel8_size = 2;\n          const sysint_t rel32_size = 5;\n          sysint_t offs = l_data.offset - getOffset();\n\n          if (IntUtil::isInt8(offs - rel8_size))\n          {\n            _emitByte(0xEB);\n            _emitByte((uint8_t)(int8_t)(offs - rel8_size));\n\n            // Change the emit options so logger can log instruction correctly.\n            _emitOptions |= kX86EmitOptionShortJump;\n          }\n          else\n          {\n            if (isShortJump)\n            {\n              if (_logger)\n              {\n                _logger->logString(\"*** ASSEMBLER WARNING: Emitting long jump, but short jump instruction forced!\\n\");\n                _emitOptions &= ~kX86EmitOptionShortJump;\n              }\n            }\n\n            _emitByte(0xE9);\n            _emitInt32((int32_t)(offs - rel32_size));\n          }\n        }\n        else\n        {\n          // Non-bound label.\n          if (isShortJump)\n          {\n            _emitByte(0xEB);\n            _emitDisplacement(l_data, -1, 1);\n          }\n          else\n          {\n            _emitByte(0xE9);\n            _emitDisplacement(l_data, -4, 4);\n          }\n        }\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupLea:\n    {\n      if (o0->isReg() && o1->isMem())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n        const Mem& src = reinterpret_cast<const Mem&>(*o1);\n\n        // Size override prefix support.\n        if (src.getSizePrefix())\n        {\n          _emitByte(0x67);\n#if defined(ASMJIT_X86)\n          memRegType = kX86RegTypeGpw;\n#else\n          memRegType = kX86RegTypeGpd;\n#endif\n        }\n\n        _emitX86RM(0x8D,\n          dst.isRegType(kX86RegTypeGpw),\n          dst.isRegType(kX86RegTypeGpq), dst.getRegCode(), src,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMem:\n    {\n      if (o0->isMem())\n      {\n        _emitX86RM(id->_opCode[0], 0, (uint8_t)id->_opCode[1], (uint8_t)id->_opCodeR, reinterpret_cast<const Mem&>(*o0), 0, forceRexPrefix);\n        _FINISHED();\n      }\n      break;\n    }\n\n    case kX86InstGroupMov:\n    {\n      const Operand& dst = *o0;\n      const Operand& src = *o1;\n\n      switch (dst.getType() << 4 | src.getType())\n      {\n        // Reg <- Reg/Mem\n        case (kOperandReg << 4) | kOperandReg:\n        {\n          // Reg <- Sreg\n          if (src.isRegType(kX86RegTypeSeg))\n          {\n            ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpw) ||\n                          dst.isRegType(kX86RegTypeGpd) ||\n                          dst.isRegType(kX86RegTypeGpq) );\n\n            _emitX86RM(0x8C,\n              dst.getSize() == 2,\n              dst.getSize() == 8,\n              reinterpret_cast<const SegmentReg&>(src).getRegCode(),\n              reinterpret_cast<const Operand&>(dst),\n              0, forceRexPrefix);\n            _FINISHED();\n          }\n\n          // Sreg <- Reg/Mem\n          if (dst.isRegType(kX86RegTypeSeg))\n          {\n            ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpw   ) ||\n                          src.isRegType(kX86RegTypeGpd   ) ||\n                          src.isRegType(kX86RegTypeGpq   ) );\n\n_Emit_Mov_Sreg_RM:\n            _emitX86RM(0x8E,\n              src.getSize() == 2,\n              src.getSize() == 8,\n              reinterpret_cast<const SegmentReg&>(dst).getRegCode(),\n              reinterpret_cast<const Operand&>(src),\n              0, forceRexPrefix);\n            _FINISHED();\n          }\n\n          ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpbLo) ||\n                        src.isRegType(kX86RegTypeGpbHi) ||\n                        src.isRegType(kX86RegTypeGpw   ) ||\n                        src.isRegType(kX86RegTypeGpd   ) ||\n                        src.isRegType(kX86RegTypeGpq   ) );\n          // ... fall through ...\n        }\n        case (kOperandReg << 4) | kOperandMem:\n        {\n          // Sreg <- Mem\n          if (dst.isRegType(kX86RegTypeSeg))\n          {\n            goto _Emit_Mov_Sreg_RM;\n          }\n\n          ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpbLo) ||\n                        dst.isRegType(kX86RegTypeGpbHi) ||\n                        dst.isRegType(kX86RegTypeGpw   ) ||\n                        dst.isRegType(kX86RegTypeGpd   ) ||\n                        dst.isRegType(kX86RegTypeGpq   ) );\n\n          _emitX86RM(0x0000008A + (dst.getSize() != 1),\n            dst.isRegType(kX86RegTypeGpw),\n            dst.isRegType(kX86RegTypeGpq),\n            reinterpret_cast<const GpReg&>(dst).getRegCode(),\n            reinterpret_cast<const Operand&>(src),\n            0, forceRexPrefix);\n          _FINISHED();\n        }\n\n        // Reg <- Imm\n        case (kOperandReg << 4) | kOperandImm:\n        {\n          const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n          const Imm& src = reinterpret_cast<const Imm&>(*o1);\n\n          // In 64-bit mode the immediate can be 64-bits long if the\n          // destination operand type is register (otherwise 32-bits).\n          immSize = dst.getSize();\n\n#if defined(ASMJIT_X64)\n          // Optimize instruction size by using 32-bit immediate if value can\n          // fit into it.\n          if (immSize == 8 && IntUtil::isInt32(src.getValue()))\n          {\n            _emitX86RM(0xC7,\n              0, // 16BIT\n              1, // REX.W\n              0, // O\n              dst,\n              0, forceRexPrefix);\n            immSize = 4;\n          }\n          else\n          {\n#endif // ASMJIT_X64\n            _emitX86Inl((dst.getSize() == 1 ? 0xB0 : 0xB8),\n              dst.isRegType(kX86RegTypeGpw),\n              dst.isRegType(kX86RegTypeGpq),\n              dst.getRegCode(), forceRexPrefix);\n#if defined(ASMJIT_X64)\n          }\n#endif // ASMJIT_X64\n\n          _FINISHED_IMMEDIATE(&src, immSize);\n        }\n\n        // Mem <- Reg/Sreg\n        case (kOperandMem << 4) | kOperandReg:\n        {\n          if (src.isRegType(kX86RegTypeSeg))\n          {\n            // Mem <- Sreg\n            _emitX86RM(0x8C,\n              dst.getSize() == 2,\n              dst.getSize() == 8,\n              reinterpret_cast<const SegmentReg&>(src).getRegCode(),\n              reinterpret_cast<const Operand&>(dst),\n              0, forceRexPrefix);\n            _FINISHED();\n          }\n          else\n          {\n            // Mem <- Reg\n            ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpbLo) ||\n                          src.isRegType(kX86RegTypeGpbHi) ||\n                          src.isRegType(kX86RegTypeGpw   ) ||\n                          src.isRegType(kX86RegTypeGpd   ) ||\n                          src.isRegType(kX86RegTypeGpq   ) );\n\n            _emitX86RM(0x88 + (src.getSize() != 1),\n              src.isRegType(kX86RegTypeGpw),\n              src.isRegType(kX86RegTypeGpq),\n              reinterpret_cast<const GpReg&>(src).getRegCode(),\n              reinterpret_cast<const Operand&>(dst),\n              0, forceRexPrefix);\n            _FINISHED();\n          }\n        }\n\n        // Mem <- Imm\n        case (kOperandMem << 4) | kOperandImm:\n        {\n          immSize = IntUtil::_min<uint32_t>(dst.getSize(), 4);\n\n          _emitX86RM(0xC6 + (dst.getSize() != 1),\n            dst.getSize() == 2,\n            dst.getSize() == 8,\n            0,\n            reinterpret_cast<const Operand&>(dst),\n            immSize, forceRexPrefix);\n          _FINISHED_IMMEDIATE(&src, immSize);\n        }\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMovPtr:\n    {\n      if ((o0->isReg() && o1->isImm()) || (o0->isImm() && o1->isReg()))\n      {\n        bool reverse = o1->getType() == kOperandReg;\n        uint8_t opCode = !reverse ? 0xA0 : 0xA2;\n        const GpReg& reg = reinterpret_cast<const GpReg&>(!reverse ? *o0 : *o1);\n        const Imm& imm = reinterpret_cast<const Imm&>(!reverse ? *o1 : *o0);\n\n        if (reg.getRegIndex() != 0)\n          goto _IllegalInstruction;\n\n        if (reg.isRegType(kX86RegTypeGpw)) _emitByte(0x66);\n#if defined(ASMJIT_X64)\n        _emitRexR(reg.getSize() == 8, 0, 0, forceRexPrefix);\n#endif // ASMJIT_X64\n        _emitByte(opCode + (reg.getSize() != 1));\n        _FINISHED_IMMEDIATE(&imm, sizeof(sysint_t));\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMovSxMovZx:\n    {\n      if (o0->isReg() && o1->isRegMem())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n        const Operand& src = reinterpret_cast<const Operand&>(*o1);\n\n        if (dst.getSize() == 1)\n          goto _IllegalInstruction;\n        \n        if (src.getSize() != 1 && src.getSize() != 2)\n          goto _IllegalInstruction;\n        \n        if (src.getSize() == 2 && dst.getSize() == 2)\n          goto _IllegalInstruction;\n\n        _emitX86RM(id->_opCode[0] + (src.getSize() != 1),\n          dst.isRegType(kX86RegTypeGpw),\n          dst.isRegType(kX86RegTypeGpq),\n          dst.getRegCode(),\n          src,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n#if defined(ASMJIT_X64)\n    case kX86InstGroupMovSxD:\n    {\n      if (o0->isReg() && o1->isRegMem())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n        const Operand& src = reinterpret_cast<const Operand&>(*o1);\n        _emitX86RM(0x00000063,\n          0,\n          1, dst.getRegCode(), src,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n#endif // ASMJIT_X64\n\n    case kX86InstGroupPush:\n    {\n      if (o0->isRegType(kX86RegTypeSeg))\n      {\n        static const uint32_t opcodeList[] =\n        {\n          0x06,   // ES.\n          0x0E,   // CS.\n          0x16,   // SS.\n          0x1E,   // DS.\n          0x0FA0, // FS.\n          0x0FA8  // GS.\n        };\n\n        unsigned int segment = reinterpret_cast<const SegmentReg*>(o0)->getRegIndex();\n        ASMJIT_ASSERT(segment < kX86SegCount);\n\n        unsigned int opcode = opcodeList[segment];\n\n        if (opcode > 0xFF)\n          _emitByte(opcode >> 8);\n        _emitByte(opcode & 0xFF);\n\n        _FINISHED();\n      }\n\n      // This section is only for immediates, memory/register operands are handled in kX86InstGroupPop.\n      if (o0->isImm())\n      {\n        const Imm& imm = reinterpret_cast<const Imm&>(*o0);\n\n        if (IntUtil::isInt8(imm.getValue()))\n        {\n          _emitByte(0x6A);\n          _FINISHED_IMMEDIATE(&imm, 1);\n        }\n        else\n        {\n          _emitByte(0x68);\n          _FINISHED_IMMEDIATE(&imm, 4);\n        }\n      }\n\n      // ... goto kX86InstGroupPop ...\n    }\n\n    case kX86InstGroupPop:\n    {\n      if (o0->isRegType(kX86RegTypeSeg))\n      {\n        static const uint32_t opcodeList[] =\n        {\n          0x07,   // ES.\n          0,      // CS.\n          0x17,   // SS.\n          0x1F,   // DS.\n          0x0FA1, // FS.\n          0x0FA9  // GS.\n        };\n\n        unsigned int segment = reinterpret_cast<const SegmentReg*>(o0)->getRegIndex();\n        ASMJIT_ASSERT(segment < kX86SegCount);\n\n        unsigned int opcode = opcodeList[segment];\n        ASMJIT_ASSERT(opcode != 0);\n\n        if (opcode > 0xFF)\n          _emitByte(opcode >> 8);\n        _emitByte(opcode & 0xFF);\n\n        _FINISHED();\n      }\n\n      if (o0->isReg())\n      {\n        ASMJIT_ASSERT(o0->isRegType(kX86RegTypeGpw) || o0->isRegType(kX86RegTypeGpz));\n        _emitX86Inl(id->_opCode[0], o0->isRegType(kX86RegTypeGpw), 0, reinterpret_cast<const GpReg&>(*o0).getRegCode(), forceRexPrefix);\n        _FINISHED();\n      }\n\n      if (o0->isMem())\n      {\n        _emitX86RM(id->_opCode[1], o0->getSize() == 2, 0, (uint8_t)id->_opCodeR, reinterpret_cast<const Operand&>(*o0), 0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupRegRm:\n    {\n      if (o0->isReg() && o1->isRegMem())\n      {\n        const GpReg& dst = reinterpret_cast<const GpReg&>(*o0);\n        const Operand& src = reinterpret_cast<const Operand&>(*o1);\n        ASMJIT_ASSERT(dst.getSize() != 1);\n\n        _emitX86RM(id->_opCode[0],\n          dst.getRegType() == kX86RegTypeGpw,\n          dst.getRegType() == kX86RegTypeGpq, dst.getRegCode(), src,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupRm:\n    {\n      if (o0->isRegMem())\n      {\n        const Operand& op = reinterpret_cast<const Operand&>(*o0);\n        _emitX86RM(id->_opCode[0] + (op.getSize() != 1),\n          op.getSize() == 2,\n          op.getSize() == 8, (uint8_t)id->_opCodeR, op,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupRmByte:\n    {\n      if (o0->isRegMem())\n      {\n        const Operand& op = reinterpret_cast<const Operand&>(*o0);\n\n        // Only BYTE register or BYTE/TYPELESS memory location can be used.\n        ASMJIT_ASSERT(op.getSize() <= 1);\n        \n        _emitX86RM(id->_opCode[0], false, false, 0, op, 0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupRmReg:\n    {\n      if (o0->isRegMem() && o1->isReg())\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n        const GpReg& src = reinterpret_cast<const GpReg&>(*o1);\n        _emitX86RM(id->_opCode[0] + (src.getSize() != 1),\n          src.getRegType() == kX86RegTypeGpw,\n          src.getRegType() == kX86RegTypeGpq, src.getRegCode(), dst,\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupRep:\n    {\n      uint32_t opCode = id->_opCode[0];\n      uint32_t opSize = id->_opCode[1];\n\n      // Emit REP prefix (1 BYTE).\n      _emitByte(opCode >> 24);\n\n      if (opSize != 1) opCode++; // D, Q and W form.\n      if (opSize == 2) _emitByte(0x66); // 16-bit prefix.\n#if defined(ASMJIT_X64)\n      else if (opSize == 8) _emitByte(0x48); // REX.W prefix.\n#endif // ASMJIT_X64\n\n      // Emit opcode (1 BYTE).\n      _emitByte(opCode & 0xFF);\n      _FINISHED();\n    }\n\n    case kX86InstGroupRet:\n    {\n      if (o0->isNone())\n      {\n        _emitByte(0xC3);\n        _FINISHED();\n      }\n      else if (o0->isImm())\n      {\n        const Imm& imm = reinterpret_cast<const Imm&>(*o0);\n        ASMJIT_ASSERT(IntUtil::isUInt16(imm.getValue()));\n\n        if (imm.getValue() == 0)\n        {\n          _emitByte(0xC3);\n          _FINISHED();\n        }\n        else\n        {\n          _emitByte(0xC2);\n          _FINISHED_IMMEDIATE(&imm, 2);\n        }\n      }\n\n      break;\n    }\n\n    case kX86InstGroupRot:\n    {\n      if (o0->isRegMem() && (o1->isRegCode(kX86RegCl) || o1->isImm()))\n      {\n        // generate opcode. For these operations is base 0xC0 or 0xD0.\n        bool useImm8 = o1->isImm() && reinterpret_cast<const Imm&>(*o1).getValue() != 1;\n        uint32_t opCode = useImm8 ? 0xC0 : 0xD0;\n\n        // size and operand type modifies the opcode\n        if (o0->getSize() != 1) opCode |= 0x01;\n        if (o1->getType() == kOperandReg) opCode |= 0x02;\n\n        _emitX86RM(opCode,\n          o0->getSize() == 2,\n          o0->getSize() == 8,\n          (uint8_t)id->_opCodeR, reinterpret_cast<const Operand&>(*o0),\n          useImm8 ? 1 : 0, forceRexPrefix);\n\n        if (useImm8)\n          _FINISHED_IMMEDIATE(o1, 1);\n        else\n          _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupShldShrd:\n    {\n      if (o0->isRegMem() && o1->isReg() && (o2->isImm() || (o2->isReg() && o2->isRegCode(kX86RegCl))))\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n        const GpReg& src1 = reinterpret_cast<const GpReg&>(*o1);\n        const Operand& src2 = reinterpret_cast<const Operand&>(*o2);\n\n        ASMJIT_ASSERT(dst.getSize() == src1.getSize());\n\n        _emitX86RM(id->_opCode[0] + src2.isReg(),\n          src1.isRegType(kX86RegTypeGpw),\n          src1.isRegType(kX86RegTypeGpq),\n          src1.getRegCode(), dst,\n          src2.isImm() ? 1 : 0, forceRexPrefix);\n        if (src2.isImm())\n          _FINISHED_IMMEDIATE(&src2, 1);\n        else\n          _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupTest:\n    {\n      if (o0->isRegMem() && o1->isReg())\n      {\n        ASMJIT_ASSERT(o0->getSize() == o1->getSize());\n        _emitX86RM(0x84 + (o1->getSize() != 1),\n          o1->getSize() == 2, o1->getSize() == 8,\n          reinterpret_cast<const Reg&>(*o1).getRegCode(),\n          reinterpret_cast<const Operand&>(*o0),\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      // Alternate Form - AL, AX, EAX, RAX.\n      if (o0->isRegIndex(0) && o1->isImm())\n      {\n        immSize = IntUtil::_min<uint32_t>(o0->getSize(), 4);\n\n        if (o0->getSize() == 2) _emitByte(0x66); // 16-bit.\n#if defined(ASMJIT_X64)\n        _emitRexRM(o0->getSize() == 8, 0, reinterpret_cast<const Operand&>(*o0), forceRexPrefix);\n#endif // ASMJIT_X64\n        _emitByte(0xA8 + (o0->getSize() != 1));\n        _FINISHED_IMMEDIATE(o1, immSize);\n      }\n\n      if (o0->isRegMem() && o1->isImm())\n      {\n        immSize = IntUtil::_min<uint32_t>(o0->getSize(), 4);\n\n        if (o0->getSize() == 2) _emitByte(0x66); // 16-bit.\n        _emitSegmentPrefix(reinterpret_cast<const Operand&>(*o0)); // Segment prefix.\n#if defined(ASMJIT_X64)\n        _emitRexRM(o0->getSize() == 8, 0, reinterpret_cast<const Operand&>(*o0), forceRexPrefix);\n#endif // ASMJIT_X64\n        _emitByte(0xF6 + (o0->getSize() != 1));\n        _emitModRM(0, reinterpret_cast<const Operand&>(*o0), immSize);\n        _FINISHED_IMMEDIATE(o1, immSize);\n      }\n\n      break;\n    }\n\n    case kX86InstGroupXchg:\n    {\n      if (o0->isRegMem() && o1->isReg())\n      {\n        const Operand& dst = reinterpret_cast<const Operand&>(*o0);\n        const GpReg& src = reinterpret_cast<const GpReg&>(*o1);\n\n        if (src.isRegType(kX86RegTypeGpw)) _emitByte(0x66); // 16-bit.\n        _emitSegmentPrefix(dst); // segment prefix\n#if defined(ASMJIT_X64)\n        _emitRexRM(src.isRegType(kX86RegTypeGpq), src.getRegCode(), dst, forceRexPrefix);\n#endif // ASMJIT_X64\n\n        // Special opcode for index 0 registers (AX, EAX, RAX vs register).\n        if ((dst.getType() == kOperandReg && dst.getSize() > 1) &&\n            (reinterpret_cast<const GpReg&>(dst).getRegCode() == 0 ||\n             reinterpret_cast<const GpReg&>(src).getRegCode() == 0 ))\n        {\n          uint8_t index = reinterpret_cast<const GpReg&>(dst).getRegCode() | src.getRegCode();\n          _emitByte(0x90 + index);\n          _FINISHED();\n        }\n\n        _emitByte(0x86 + (src.getSize() != 1));\n        _emitModRM(src.getRegCode(), dst, 0);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMovBE:\n    {\n      if (o0->isReg() && o1->isMem())\n      {\n        _emitX86RM(0x000F38F0,\n          o0->isRegType(kX86RegTypeGpw),\n          o0->isRegType(kX86RegTypeGpq),\n          reinterpret_cast<const GpReg&>(*o0).getRegCode(),\n          reinterpret_cast<const Mem&>(*o1),\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      if (o0->isMem() && o1->isReg())\n      {\n        _emitX86RM(0x000F38F1,\n          o1->isRegType(kX86RegTypeGpw),\n          o1->isRegType(kX86RegTypeGpq),\n          reinterpret_cast<const GpReg&>(*o1).getRegCode(),\n          reinterpret_cast<const Mem&>(*o0),\n          0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupX87StM:\n    {\n      if (o0->isRegType(kX86RegTypeX87))\n      {\n        uint8_t i1 = reinterpret_cast<const X87Reg&>(*o0).getRegIndex();\n        uint8_t i2 = 0;\n\n        if (code != kX86InstFCom && code != kX86InstFComP)\n        {\n          if (!o1->isRegType(kX86RegTypeX87))\n            goto _IllegalInstruction;\n          i2 = reinterpret_cast<const X87Reg&>(*o1).getRegIndex();\n        }\n        else if (i1 != 0 && i2 != 0)\n        {\n          goto _IllegalInstruction;\n        }\n\n        _emitByte(i1 == 0\n          ? ((id->_opCode[0] & 0xFF000000) >> 24)\n          : ((id->_opCode[0] & 0x00FF0000) >> 16));\n        _emitByte(i1 == 0\n          ? ((id->_opCode[0] & 0x0000FF00) >>  8) + i2\n          : ((id->_opCode[0] & 0x000000FF)      ) + i1);\n        _FINISHED();\n      }\n\n      if (o0->isMem() && (o0->getSize() == 4 || o0->getSize() == 8) && o1->isNone())\n      {\n        const Mem& m = reinterpret_cast<const Mem&>(*o0);\n\n        // Segment prefix.\n        _emitSegmentPrefix(m);\n\n        _emitByte(o0->getSize() == 4\n          ? ((id->_opCode[0] & 0xFF000000) >> 24)\n          : ((id->_opCode[0] & 0x00FF0000) >> 16));\n        _emitModM((uint8_t)id->_opCodeR, m, 0);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupX87StI:\n    {\n      if (o0->isRegType(kX86RegTypeX87))\n      {\n        uint8_t i = reinterpret_cast<const X87Reg&>(*o0).getRegIndex();\n        _emitByte((uint8_t)((id->_opCode[0] & 0x0000FF00) >> 8));\n        _emitByte((uint8_t)((id->_opCode[0] & 0x000000FF) + i));\n        _FINISHED();\n      }\n      break;\n    }\n\n    case kX86InstGroupX87Status:\n    {\n      if (o0->isReg() &&\n          reinterpret_cast<const Reg&>(*o0).getRegType() <= kX86RegTypeGpq &&\n          reinterpret_cast<const Reg&>(*o0).getRegIndex() == 0)\n      {\n        _emitOpCode(id->_opCode[1]);\n        _FINISHED();\n      }\n\n      if (o0->isMem())\n      {\n        _emitX86RM(id->_opCode[0], 0, 0, (uint8_t)id->_opCodeR, reinterpret_cast<const Mem&>(*o0), 0, forceRexPrefix);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupX87FldFst:\n    {\n      if (o0->isRegType(kX86RegTypeX87))\n      {\n        _emitByte((uint8_t)((id->_opCode[1] & 0xFF000000) >> 24));\n        _emitByte((uint8_t)((id->_opCode[1] & 0x00FF0000) >> 16) +\n          reinterpret_cast<const X87Reg&>(*o0).getRegIndex());\n        _FINISHED();\n      }\n\n      // ... fall through to kX86InstGroupX87Mem ...\n    }\n\n    case kX86InstGroupX87Mem:\n    {\n      if (!o0->isMem())\n        goto _IllegalInstruction;\n      const Mem& m = reinterpret_cast<const Mem&>(*o0);\n\n      uint8_t opCode = 0x00, mod = 0;\n\n      if (o0->getSize() == 2 && (id->_opFlags[0] & kX86InstOpStM2))\n      {\n        opCode = (uint8_t)((id->_opCode[0] & 0xFF000000) >> 24);\n        mod    = (uint8_t)id->_opCodeR;\n      }\n      if (o0->getSize() == 4 && (id->_opFlags[0] & kX86InstOpStM4))\n      {\n        opCode = (uint8_t)((id->_opCode[0] & 0x00FF0000) >> 16);\n        mod    = (uint8_t)id->_opCodeR;\n      }\n      if (o0->getSize() == 8 && (id->_opFlags[0] & kX86InstOpStM8))\n      {\n        opCode = (uint8_t)((id->_opCode[0] & 0x0000FF00) >>  8);\n        mod    = (uint8_t)((id->_opCode[0] & 0x000000FF)      );\n      }\n\n      if (opCode)\n      {\n        _emitSegmentPrefix(m);\n        _emitByte(opCode);\n        _emitModM(mod, m, 0);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMmuMov:\n    {\n      ASMJIT_ASSERT(id->_opFlags[0] != 0);\n      ASMJIT_ASSERT(id->_opFlags[1] != 0);\n\n      // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm\n      if ((o0->isMem()                 && (id->_opFlags[0] & kX86InstOpMem) == 0) ||\n          (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) ||\n          (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) ||\n          (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) ||\n          (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) ||\n          (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) ||\n          (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) ||\n          (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) ||\n          (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) ||\n          (o1->isMem()                 && (id->_opFlags[1] & kX86InstOpMem) == 0) )\n      {\n        goto _IllegalInstruction;\n      }\n\n      // Illegal.\n      if (o0->isMem() && o1->isMem())\n        goto _IllegalInstruction;\n\n      uint8_t rexw = ((id->_opFlags[0] | id->_opFlags[1]) & kX86InstOpNoRex)\n        ? 0\n        : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq);\n\n      // (X)MM|Reg <- (X)MM|Reg\n      if (o0->isReg() && o1->isReg())\n      {\n        _emitMmu(id->_opCode[0], rexw,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Reg&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      // (X)MM|Reg <- Mem\n      if (o0->isReg() && o1->isMem())\n      {\n        _emitMmu(id->_opCode[0], rexw,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Mem&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      // Mem <- (X)MM|Reg\n      if (o0->isMem() && o1->isReg())\n      {\n        _emitMmu(id->_opCode[1], rexw,\n          reinterpret_cast<const Reg&>(*o1).getRegCode(),\n          reinterpret_cast<const Mem&>(*o0),\n          0);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMmuMovD:\n    {\n      if ((o0->isRegType(kX86RegTypeMm) || o0->isRegType(kX86RegTypeXmm)) && (o1->isRegType(kX86RegTypeGpd) || o1->isMem()))\n      {\n        _emitMmu(o0->isRegType(kX86RegTypeXmm) ? 0x66000F6E : 0x00000F6E, 0,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Operand&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      if ((o0->isRegType(kX86RegTypeGpd) || o0->isMem()) && (o1->isRegType(kX86RegTypeMm) || o1->isRegType(kX86RegTypeXmm)))\n      {\n        _emitMmu(o1->isRegType(kX86RegTypeXmm) ? 0x66000F7E : 0x00000F7E, 0,\n          reinterpret_cast<const Reg&>(*o1).getRegCode(),\n          reinterpret_cast<const Operand&>(*o0),\n          0);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMmuMovQ:\n    {\n      if (o0->isRegType(kX86RegTypeMm) && o1->isRegType(kX86RegTypeMm))\n      {\n        _emitMmu(0x00000F6F, 0,\n          reinterpret_cast<const MmReg&>(*o0).getRegCode(),\n          reinterpret_cast<const MmReg&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      if (o0->isRegType(kX86RegTypeXmm) && o1->isRegType(kX86RegTypeXmm))\n      {\n        _emitMmu(0xF3000F7E, 0,\n          reinterpret_cast<const XmmReg&>(*o0).getRegCode(),\n          reinterpret_cast<const XmmReg&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      // Convenience - movdq2q\n      if (o0->isRegType(kX86RegTypeMm) && o1->isRegType(kX86RegTypeXmm))\n      {\n        _emitMmu(0xF2000FD6, 0,\n          reinterpret_cast<const MmReg&>(*o0).getRegCode(),\n          reinterpret_cast<const XmmReg&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      // Convenience - movq2dq\n      if (o0->isRegType(kX86RegTypeXmm) && o1->isRegType(kX86RegTypeMm))\n      {\n        _emitMmu(0xF3000FD6, 0,\n          reinterpret_cast<const XmmReg&>(*o0).getRegCode(),\n          reinterpret_cast<const MmReg&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      if (o0->isRegType(kX86RegTypeMm) && o1->isMem())\n      {\n        _emitMmu(0x00000F6F, 0,\n          reinterpret_cast<const MmReg&>(*o0).getRegCode(),\n          reinterpret_cast<const Mem&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      if (o0->isRegType(kX86RegTypeXmm) && o1->isMem())\n      {\n        _emitMmu(0xF3000F7E, 0,\n          reinterpret_cast<const XmmReg&>(*o0).getRegCode(),\n          reinterpret_cast<const Mem&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      if (o0->isMem() && o1->isRegType(kX86RegTypeMm))\n      {\n        _emitMmu(0x00000F7F, 0,\n          reinterpret_cast<const MmReg&>(*o1).getRegCode(),\n          reinterpret_cast<const Mem&>(*o0),\n          0);\n        _FINISHED();\n      }\n\n      if (o0->isMem() && o1->isRegType(kX86RegTypeXmm))\n      {\n        _emitMmu(0x66000FD6, 0,\n          reinterpret_cast<const XmmReg&>(*o1).getRegCode(),\n          reinterpret_cast<const Mem&>(*o0),\n          0);\n        _FINISHED();\n      }\n\n#if defined(ASMJIT_X64)\n      if ((o0->isRegType(kX86RegTypeMm) || o0->isRegType(kX86RegTypeXmm)) && (o1->isRegType(kX86RegTypeGpq) || o1->isMem()))\n      {\n        _emitMmu(o0->isRegType(kX86RegTypeXmm) ? 0x66000F6E : 0x00000F6E, 1,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Operand&>(*o1),\n          0);\n        _FINISHED();\n      }\n\n      if ((o0->isRegType(kX86RegTypeGpq) || o0->isMem()) && (o1->isRegType(kX86RegTypeMm) || o1->isRegType(kX86RegTypeXmm)))\n      {\n        _emitMmu(o1->isRegType(kX86RegTypeXmm) ? 0x66000F7E : 0x00000F7E, 1,\n          reinterpret_cast<const Reg&>(*o1).getRegCode(),\n          reinterpret_cast<const Operand&>(*o0),\n          0);\n        _FINISHED();\n      }\n#endif // ASMJIT_X64\n\n      break;\n    }\n\n    case kX86InstGroupMmuExtract:\n    {\n      if (!(o0->isRegMem() &&\n           (o1->isRegType(kX86RegTypeXmm) || (code == kX86InstPExtrW && o1->isRegType(kX86RegTypeMm))) &&\n            o2->isImm()))\n      {\n        goto _IllegalInstruction;\n      }\n\n      uint32_t opCode = id->_opCode[0];\n      uint8_t isGpdGpq = o0->isRegType(kX86RegTypeGpd) | o0->isRegType(kX86RegTypeGpq);\n\n      if (code == kX86InstPExtrB && (o0->getSize() != 0 && o0->getSize() != 1) && !isGpdGpq)\n        goto _IllegalInstruction;\n      if (code == kX86InstPExtrW && (o0->getSize() != 0 && o0->getSize() != 2) && !isGpdGpq)\n        goto _IllegalInstruction;\n      if (code == kX86InstPExtrD && (o0->getSize() != 0 && o0->getSize() != 4) && !isGpdGpq)\n        goto _IllegalInstruction;\n      if (code == kX86InstPExtrQ && (o0->getSize() != 0 && o0->getSize() != 8) && !isGpdGpq)\n        goto _IllegalInstruction;\n\n      if (o1->isRegType(kX86RegTypeXmm)) opCode |= 0x66000000;\n\n      if (o0->isReg())\n      {\n        _emitMmu(opCode, id->_opCodeR | (uint8_t)o0->isRegType(kX86RegTypeGpq),\n          reinterpret_cast<const Reg&>(*o1).getRegCode(),\n          reinterpret_cast<const Reg&>(*o0), 1);\n        _FINISHED_IMMEDIATE(o2, 1);\n      }\n\n      if (o0->isMem())\n      {\n        _emitMmu(opCode, (uint8_t)id->_opCodeR,\n          reinterpret_cast<const Reg&>(*o1).getRegCode(),\n          reinterpret_cast<const Mem&>(*o0), 1);\n        _FINISHED_IMMEDIATE(o2, 1);\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMmuPrefetch:\n    {\n      if (o0->isMem() && o1->isImm())\n      {\n        const Mem& mem = reinterpret_cast<const Mem&>(*o0);\n        const Imm& hint = reinterpret_cast<const Imm&>(*o1);\n\n        _emitMmu(0x00000F18, 0, (uint8_t)hint.getValue(), mem, 0);\n        _FINISHED();\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMmuRmI:\n    {\n      ASMJIT_ASSERT(id->_opFlags[0] != 0);\n      ASMJIT_ASSERT(id->_opFlags[1] != 0);\n\n      // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm\n      if (!o0->isReg() ||\n          (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) ||\n          (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) ||\n          (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) ||\n          (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) ||\n          (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) ||\n          (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) ||\n          (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) ||\n          (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) ||\n          (o1->isMem()                   && (id->_opFlags[1] & kX86InstOpMem) == 0) ||\n          (o1->isImm()                   && (id->_opFlags[1] & kX86InstOpImm) == 0))\n      {\n        goto _IllegalInstruction;\n      }\n\n      uint32_t prefix =\n        ((id->_opFlags[0] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o0->isRegType(kX86RegTypeXmm)) ||\n        ((id->_opFlags[1] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o1->isRegType(kX86RegTypeXmm))\n          ? 0x66000000\n          : 0x00000000;\n\n      uint8_t rexw = ((id->_opFlags[0] | id->_opFlags[1]) & kX86InstOpNoRex)\n        ? 0\n        : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq);\n\n      // (X)MM <- (X)MM (opcode0)\n      if (o1->isReg())\n      {\n        if ((id->_opFlags[1] & (kX86InstOpMmXmm | kX86InstOpGqd)) == 0)\n          goto _IllegalInstruction;\n        _emitMmu(id->_opCode[0] | prefix, rexw,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Reg&>(*o1), 0);\n        _FINISHED();\n      }\n      // (X)MM <- Mem (opcode0)\n      if (o1->isMem())\n      {\n        if ((id->_opFlags[1] & kX86InstOpMem) == 0)\n          goto _IllegalInstruction;\n        _emitMmu(id->_opCode[0] | prefix, rexw,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Mem&>(*o1), 0);\n        _FINISHED();\n      }\n      // (X)MM <- Imm (opcode1+opcodeR)\n      if (o1->isImm())\n      {\n        if ((id->_opFlags[1] & kX86InstOpImm) == 0)\n          goto _IllegalInstruction;\n        _emitMmu(id->_opCode[1] | prefix, rexw,\n          (uint8_t)id->_opCodeR,\n          reinterpret_cast<const Reg&>(*o0), 1);\n        _FINISHED_IMMEDIATE(o1, 1);\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMmuRmImm8:\n    {\n      ASMJIT_ASSERT(id->_opFlags[0] != 0);\n      ASMJIT_ASSERT(id->_opFlags[1] != 0);\n\n      // Check parameters (X)MM|GP32_64 <- (X)MM|GP32_64|Mem|Imm\n      if (!o0->isReg() ||\n          (o0->isRegType(kX86RegTypeMm ) && (id->_opFlags[0] & kX86InstOpMm ) == 0) ||\n          (o0->isRegType(kX86RegTypeXmm) && (id->_opFlags[0] & kX86InstOpXmm) == 0) ||\n          (o0->isRegType(kX86RegTypeGpd) && (id->_opFlags[0] & kX86InstOpGd ) == 0) ||\n          (o0->isRegType(kX86RegTypeGpq) && (id->_opFlags[0] & kX86InstOpGq ) == 0) ||\n          (o1->isRegType(kX86RegTypeMm ) && (id->_opFlags[1] & kX86InstOpMm ) == 0) ||\n          (o1->isRegType(kX86RegTypeXmm) && (id->_opFlags[1] & kX86InstOpXmm) == 0) ||\n          (o1->isRegType(kX86RegTypeGpd) && (id->_opFlags[1] & kX86InstOpGd ) == 0) ||\n          (o1->isRegType(kX86RegTypeGpq) && (id->_opFlags[1] & kX86InstOpGq ) == 0) ||\n          (o1->isMem()                 && (id->_opFlags[1] & kX86InstOpMem) == 0) ||\n          !o2->isImm())\n      {\n        goto _IllegalInstruction;\n      }\n\n      uint32_t prefix =\n        ((id->_opFlags[0] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o0->isRegType(kX86RegTypeXmm)) ||\n        ((id->_opFlags[1] & kX86InstOpMmXmm) == kX86InstOpMmXmm && o1->isRegType(kX86RegTypeXmm))\n          ? 0x66000000\n          : 0x00000000;\n\n      uint8_t rexw = ((id->_opFlags[0]|id->_opFlags[1]) & kX86InstOpNoRex)\n        ? 0\n        : o0->isRegType(kX86RegTypeGpq) | o1->isRegType(kX86RegTypeGpq);\n\n      // (X)MM <- (X)MM (opcode0)\n      if (o1->isReg())\n      {\n        if ((id->_opFlags[1] & (kX86InstOpMmXmm | kX86InstOpGqd)) == 0)\ngoto _IllegalInstruction;\n        _emitMmu(id->_opCode[0] | prefix, rexw,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Reg&>(*o1), 1);\n        _FINISHED_IMMEDIATE(o2, 1);\n      }\n      // (X)MM <- Mem (opcode0)\n      if (o1->isMem())\n      {\n        if ((id->_opFlags[1] & kX86InstOpMem) == 0)\n          goto _IllegalInstruction;\n        _emitMmu(id->_opCode[0] | prefix, rexw,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Mem&>(*o1), 1);\n        _FINISHED_IMMEDIATE(o2, 1);\n      }\n\n      break;\n    }\n\n    case kX86InstGroupMmuRm3dNow:\n    {\n      if (o0->isRegType(kX86RegTypeMm) && (o1->isRegType(kX86RegTypeMm) || o1->isMem()))\n      {\n        _emitMmu(id->_opCode[0], 0,\n          reinterpret_cast<const Reg&>(*o0).getRegCode(),\n          reinterpret_cast<const Mem&>(*o1), 1);\n        _emitByte((uint8_t)id->_opCode[1]);\n        _FINISHED();\n      }\n\n      break;\n    }\n  }\n\n_IllegalInstruction:\n  // Set an error. If we run in release mode assertion will be not used, so we\n  // must inform about invalid state.\n  setError(kErrorIllegalInstruction);\n\n#if defined(ASMJIT_DEBUG)\n  assertIllegal = true;\n#endif // ASMJIT_DEBUG\n  goto _End;\n\n_EmitImmediate:\n  {\n    sysint_t value = immOperand->getValue();\n    switch (immSize)\n    {\n      case 1: _emitByte ((uint8_t )(sysuint_t)value); break;\n      case 2: _emitWord ((uint16_t)(sysuint_t)value); break;\n      case 4: _emitDWord((uint32_t)(sysuint_t)value); break;\n#if defined(ASMJIT_X64)\n      case 8: _emitQWord((uint64_t)(sysuint_t)value); break;\n#endif // ASMJIT_X64\n      default: ASMJIT_ASSERT(0);\n    }\n  }\n\n_End:\n  if (_logger\n#if defined(ASMJIT_DEBUG)\n      || assertIllegal\n#endif // ASMJIT_DEBUG\n     )\n  {\n    char bufStorage[512];\n    char* buf = bufStorage;\n\n    // Detect truncated operand.\n    Imm immTemporary(0);\n    uint32_t loggerFlags = 0;\n\n    // Use the original operands, because BYTE some of them were replaced.\n    if (bLoHiUsed)\n    {\n      o0 = _loggerOperands[0];\n      o1 = _loggerOperands[1];\n      o2 = _loggerOperands[2];\n    }\n\n    if (immOperand)\n    {\n      sysint_t value = immOperand->getValue();\n      bool isUnsigned = immOperand->isUnsigned();\n\n      switch (immSize)\n      {\n        case 1: if ( isUnsigned && !IntUtil::isUInt8 (value)) { immTemporary.setValue((uint8_t)(sysuint_t)value, true ); break; }\n                if (!isUnsigned && !IntUtil::isInt8  (value)) { immTemporary.setValue((uint8_t)(sysuint_t)value, false); break; }\n                break;\n        case 2: if ( isUnsigned && !IntUtil::isUInt16(value)) { immTemporary.setValue((uint16_t)(sysuint_t)value, true ); break; }\n                if (!isUnsigned && !IntUtil::isInt16 (value)) { immTemporary.setValue((uint16_t)(sysuint_t)value, false); break; }\n                break;\n        case 4: if ( isUnsigned && !IntUtil::isUInt32(value)) { immTemporary.setValue((uint32_t)(sysuint_t)value, true ); break; }\n                if (!isUnsigned && !IntUtil::isInt32 (value)) { immTemporary.setValue((uint32_t)(sysuint_t)value, false); break; }\n                break;\n      }\n\n      if (immTemporary.getValue() != 0)\n      {\n        if (o0 == immOperand) o0 = &immTemporary;\n        if (o1 == immOperand) o1 = &immTemporary;\n        if (o2 == immOperand) o2 = &immTemporary;\n      }\n    }\n\n    if (_logger)\n    {\n      buf = StringUtil::copy(buf, _logger->getInstructionPrefix());\n      loggerFlags = _logger->getFlags();\n    }\n\n    buf = X86Assembler_dumpInstruction(buf, code, _emitOptions, o0, o1, o2, memRegType, loggerFlags);\n\n    if ((loggerFlags & kLoggerOutputBinary) != 0)\n      buf = X86Assembler_dumpComment(buf, (size_t)(buf - bufStorage), getCode() + beginOffset, getOffset() - beginOffset, _inlineComment);\n    else\n      buf = X86Assembler_dumpComment(buf, (size_t)(buf - bufStorage), NULL, 0, _inlineComment);\n\n    // We don't need to NULL terminate the resulting string.\n#if defined(ASMJIT_DEBUG)\n    if (_logger)\n#endif // ASMJIT_DEBUG\n      _logger->logString(bufStorage, (size_t)(buf - bufStorage));\n\n#if defined(ASMJIT_DEBUG)\n    if (assertIllegal)\n    {\n      // Here we need to NULL terminate.\n      buf[0] = '\\0';\n\n      // Raise an assertion failure, because this situation shouldn't happen.\n      assertionFailure(__FILE__, __LINE__, bufStorage);\n    }\n#endif // ASMJIT_DEBUG\n  }\n\n_Cleanup:\n  _inlineComment = NULL;\n  _emitOptions = 0;\n}\n\nvoid X86Assembler::_emitJcc(uint32_t code, const Label* label, uint32_t hint)\n{\n  if (hint == kCondHintNone)\n  {\n    _emitInstruction(code, label);\n  }\n  else\n  {\n    Imm imm(hint);\n    _emitInstruction(code, label, &imm);\n  }\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Relocation helpers]\n// ============================================================================\n\nsize_t X86Assembler::relocCode(void* _dst, sysuint_t addressBase) const\n{\n  // Copy code to virtual memory (this is a given _dst pointer).\n  uint8_t* dst = reinterpret_cast<uint8_t*>(_dst);\n\n  size_t coff = _buffer.getOffset();\n  size_t csize = getCodeSize();\n\n  // We are copying the exact size of the generated code. Extra code for trampolines\n  // is generated on-the-fly by relocator (this code doesn't exist at the moment).\n  memcpy(dst, _buffer.getData(), coff);\n\n#if defined(ASMJIT_X64)\n  // Trampoline pointer.\n  uint8_t* tramp = dst + coff;\n#endif // ASMJIT_X64\n\n  // Relocate all recorded locations.\n  size_t i;\n  size_t len = _relocData.getLength();\n\n  for (i = 0; i < len; i++)\n  {\n    const RelocData& r = _relocData[i];\n    sysint_t val;\n\n#if defined(ASMJIT_X64)\n    // Whether to use trampoline, can be only used if relocation type is\n    // kRelocAbsToRel.\n    bool useTrampoline = false;\n#endif // ASMJIT_X64\n\n    // Be sure that reloc data structure is correct.\n    ASMJIT_ASSERT((size_t)(r.offset + r.size) <= csize);\n\n    switch (r.type)\n    {\n      case kRelocAbsToAbs:\n        val = (sysint_t)(r.address);\n        break;\n\n      case kRelocRelToAbs:\n        val = (sysint_t)(addressBase + r.destination);\n        break;\n\n      case kRelocAbsToRel:\n      case kRelocTrampoline:\n        val = (sysint_t)( (sysuint_t)r.address - (addressBase + (sysuint_t)r.offset + 4) );\n\n#if defined(ASMJIT_X64)\n        if (r.type == kRelocTrampoline && !IntUtil::isInt32(val))\n        {\n          val = (sysint_t)( (sysuint_t)tramp - ((sysuint_t)_dst + (sysuint_t)r.offset + 4) );\n          useTrampoline = true;\n        }\n#endif // ASMJIT_X64\n        break;\n\n      default:\n        ASMJIT_ASSERT(0);\n    }\n\n    switch (r.size)\n    {\n      case 4:\n        *reinterpret_cast<int32_t*>(dst + r.offset) = static_cast<int32_t>(val);\n        break;\n\n      case 8:\n        *reinterpret_cast<int64_t*>(dst + r.offset) = static_cast<int64_t>(val);\n        break;\n\n      default:\n        ASMJIT_ASSERT(0);\n    }\n\n#if defined(ASMJIT_X64)\n    if (useTrampoline)\n    {\n      if (getLogger())\n      {\n        getLogger()->logFormat(\"; Trampoline from %p -> %p\\n\", (int8_t*)addressBase + r.offset, r.address);\n      }\n\n      X64TrampolineWriter::writeTrampoline(tramp, (uint64_t)r.address);\n      tramp += X64TrampolineWriter::kSizeTotal;\n    }\n#endif // ASMJIT_X64\n  }\n\n#if defined(ASMJIT_X64)\n  return (size_t)(tramp - dst);\n#else\n  return (size_t)(coff);\n#endif // ASMJIT_X64\n}\n\n// ============================================================================\n// [AsmJit::Assembler - EmbedLabel]\n// ============================================================================\n\nvoid X86Assembler::embedLabel(const Label& label)\n{\n  ASMJIT_ASSERT(label.getId() != kInvalidValue);\n  if (!canEmit()) return;\n\n  LabelData& l_data = _labels[label.getId() & kOperandIdValueMask];\n  RelocData r_data;\n\n  if (_logger)\n  {\n    _logger->logFormat(sizeof(sysint_t) == 4 ? \".dd L.%u\\n\" : \".dq L.%u\\n\", (uint32_t)label.getId() & kOperandIdValueMask);\n  }\n\n  r_data.type = kRelocRelToAbs;\n  r_data.size = sizeof(sysint_t);\n  r_data.offset = getOffset();\n  r_data.destination = 0;\n\n  if (l_data.offset != -1)\n  {\n    // Bound label.\n    r_data.destination = l_data.offset;\n  }\n  else\n  {\n    // Non-bound label. Need to chain.\n    LabelLink* link = _newLabelLink();\n\n    link->prev = (LabelLink*)l_data.links;\n    link->offset = getOffset();\n    link->displacement = 0;\n    link->relocId = _relocData.getLength();\n\n    l_data.links = link;\n  }\n\n  _relocData.append(r_data);\n\n  // Emit dummy intptr_t (4 or 8 bytes that depends on address size).\n  _emitIntPtrT(0);\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Align]\n// ============================================================================\n\nvoid X86Assembler::align(uint32_t m)\n{\n  if (!canEmit())\n    return;\n\n  if (_logger) \n    _logger->logFormat(\"%s.align %u\\n\", _logger->getInstructionPrefix(), (uint)m);\n\n  if (!m) return;\n\n  if (m > 64)\n  {\n    ASMJIT_ASSERT(0);\n    return;\n  }\n\n  sysint_t i = m - (getOffset() % m);\n  if (i == m) return;\n\n  if (_properties & (1 << kX86PropertyOptimizedAlign))\n  {\n    const X86CpuInfo* ci = X86CpuInfo::getGlobal();\n\n    // NOPs optimized for Intel:\n    //   Intel 64 and IA-32 Architectures Software Developer's Manual\n    //   - Volume 2B \n    //   - Instruction Set Reference N-Z\n    //     - NOP\n\n    // NOPs optimized for AMD:\n    //   Software Optimization Guide for AMD Family 10h Processors (Quad-Core)\n    //   - 4.13 - Code Padding with Operand-Size Override and Multibyte NOP\n\n    // Intel and AMD.\n    static const uint8_t nop1[] = { 0x90 };\n    static const uint8_t nop2[] = { 0x66, 0x90 };\n    static const uint8_t nop3[] = { 0x0F, 0x1F, 0x00 };\n    static const uint8_t nop4[] = { 0x0F, 0x1F, 0x40, 0x00 };\n    static const uint8_t nop5[] = { 0x0F, 0x1F, 0x44, 0x00, 0x00 };\n    static const uint8_t nop6[] = { 0x66, 0x0F, 0x1F, 0x44, 0x00, 0x00 };\n    static const uint8_t nop7[] = { 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00 };\n    static const uint8_t nop8[] = { 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 };\n    static const uint8_t nop9[] = { 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 };\n\n    // AMD.\n    static const uint8_t nop10[] = { 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 };\n    static const uint8_t nop11[] = { 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 };\n\n    const uint8_t* p;\n    sysint_t n;\n\n    if (ci->getVendorId() == kCpuIntel && ((ci->getFamily() & 0x0F) == 6 || (ci->getFamily() & 0x0F) == 15))\n    {\n      do {\n        switch (i)\n        {\n          case  1: p = nop1; n = 1; break;\n          case  2: p = nop2; n = 2; break;\n          case  3: p = nop3; n = 3; break;\n          case  4: p = nop4; n = 4; break;\n          case  5: p = nop5; n = 5; break;\n          case  6: p = nop6; n = 6; break;\n          case  7: p = nop7; n = 7; break;\n          case  8: p = nop8; n = 8; break;\n          default: p = nop9; n = 9; break;\n        }\n\n        i -= n;\n        do { _emitByte(*p++); } while(--n);\n      } while (i);\n\n      return;\n    }\n\n    if (ci->getVendorId() == kCpuAmd && ci->getFamily() >= 0x0F)\n    {\n      do {\n        switch (i)\n        {\n          case  1: p = nop1 ; n =  1; break;\n          case  2: p = nop2 ; n =  2; break;\n          case  3: p = nop3 ; n =  3; break;\n          case  4: p = nop4 ; n =  4; break;\n          case  5: p = nop5 ; n =  5; break;\n          case  6: p = nop6 ; n =  6; break;\n          case  7: p = nop7 ; n =  7; break;\n          case  8: p = nop8 ; n =  8; break;\n          case  9: p = nop9 ; n =  9; break;\n          case 10: p = nop10; n = 10; break;\n          default: p = nop11; n = 11; break;\n        }\n\n        i -= n;\n        do { _emitByte(*p++); } while(--n);\n      } while (i);\n\n      return;\n    }\n#if defined(ASMJIT_X86)\n    // Legacy NOPs, 0x90 with 0x66 prefix.\n    do {\n      switch (i)\n      {\n        default: _emitByte(0x66); i--;\n        case  3: _emitByte(0x66); i--;\n        case  2: _emitByte(0x66); i--;\n        case  1: _emitByte(0x90); i--;\n      }\n    } while(i);\n#endif\n  }\n\n  // Legacy NOPs, only 0x90. In 64-bit mode, we can't use 0x66 prefix.\n  do {\n    _emitByte(0x90);\n  } while(--i);\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Label]\n// ============================================================================\n\nLabel X86Assembler::newLabel()\n{\n  Label label;\n  label._base.id = (uint32_t)_labels.getLength() | kOperandIdTypeLabel;\n\n  LabelData l_data;\n  l_data.offset = -1;\n  l_data.links = NULL;\n  _labels.append(l_data);\n\n  return label;\n}\n\nvoid X86Assembler::registerLabels(size_t count)\n{\n  // Duplicated newLabel() code, but we are not creating Label instances.\n  LabelData l_data;\n  l_data.offset = -1;\n  l_data.links = NULL;\n\n  for (size_t i = 0; i < count; i++)\n    _labels.append(l_data);\n}\n\nvoid X86Assembler::bind(const Label& label)\n{\n  // Only labels created by newLabel() can be used by Assembler.\n  ASMJIT_ASSERT(label.getId() != kInvalidValue);\n  // Never go out of bounds.\n  ASMJIT_ASSERT((label.getId() & kOperandIdValueMask) < _labels.getLength());\n\n  // Get label data based on label id.\n  LabelData& l_data = _labels[label.getId() & kOperandIdValueMask];\n\n  // Label can be bound only once.\n  ASMJIT_ASSERT(l_data.offset == -1);\n\n  // Log.\n  if (_logger) _logger->logFormat(\"L.%u:\\n\", (uint32_t)label.getId() & kOperandIdValueMask);\n\n  sysint_t pos = getOffset();\n\n  LabelLink* link = l_data.links;\n  LabelLink* prev = NULL;\n\n  while (link)\n  {\n    sysint_t offset = link->offset;\n\n    if (link->relocId != -1)\n    {\n      // If linked label points to RelocData then instead of writing relative\n      // displacement to assembler stream, we will write it to RelocData.\n      _relocData[link->relocId].destination += pos;\n    }\n    else\n    {\n      // Not using relocId, this means that we overwriting real displacement\n      // in assembler stream.\n      int32_t patchedValue = (int32_t)(pos - offset + link->displacement);\n      uint32_t size = getByteAt(offset);\n\n      // Only these size specifiers are allowed.\n      ASMJIT_ASSERT(size == 1 || size == 4);\n\n      if (size == 4)\n      {\n        setInt32At(offset, patchedValue);\n      }\n      else // if (size == 1)\n      {\n        if (IntUtil::isInt8(patchedValue))\n        {\n          setByteAt(offset, (uint8_t)(int8_t)patchedValue);\n        }\n        else\n        {\n          // Fatal error.\n          setError(kErrorIllegalShortJump);\n        }\n      }\n    }\n\n    prev = link->prev;\n    link = prev;\n  }\n\n  // Chain unused links.\n  link = l_data.links;\n  if (link)\n  {\n    if (prev == NULL) prev = link;\n\n    prev->prev = _unusedLinks;\n    _unusedLinks = link;\n  }\n\n  // Unlink label if it was linked.\n  l_data.offset = pos;\n  l_data.links = NULL;\n}\n\n// ============================================================================\n// [AsmJit::Assembler - Make]\n// ============================================================================\n\nvoid* X86Assembler::make()\n{\n  // Do nothing on error state or when no instruction was emitted.\n  if (_error || getCodeSize() == 0)\n    return NULL;\n\n  void* p;\n  _error = _context->generate(&p, this);\n  return p;\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86assembler.h",
    "content": "// [AsmJit]\r\n// Complete JIT Assembler for C++ Language.\r\n//\r\n// [License]\r\n// Zlib - See COPYING file in this package.\r\n\r\n// [Guard]\r\n#ifndef _ASMJIT_X86_X86ASSEMBLER_H\r\n#define _ASMJIT_X86_X86ASSEMBLER_H\r\n\r\n// [Dependencies - AsmJit]\r\n#include \"../core/assembler.h\"\r\n\r\n#include \"../x86/x86defs.h\"\r\n#include \"../x86/x86operand.h\"\r\n#include \"../x86/x86util.h\"\r\n\r\n// [Api-Begin]\r\n#include \"../core/apibegin.h\"\r\n\r\nnamespace AsmJit {\r\n\r\n//! @addtogroup AsmJit_X86\r\n//! @{\r\n\r\n// ============================================================================\r\n// [AsmJit::X86Assembler]\r\n// ============================================================================\r\n\r\n//! @brief X86Assembler - low level x86/x64 code generation.\r\n//!\r\n//! @ref X86Assembler is the main class in AsmJit for generating low level\r\n//! x86/x64 binary stream. It creates internal buffer where opcodes are stored\r\n//! and contains methods that mimics x86/x64 assembler instructions. Code \r\n//! generation should be safe, because basic type-checks are done by the C++\r\n//! compiler. It's nearly impossible to create invalid instruction (for example\r\n//! <code>mov [eax], [eax]</code> that will not be detected at compile time by\r\n//! C++ compiler.\r\n//!\r\n//! Each call to assembler intrinsics directly emits instruction to internal\r\n//! binary stream. Instruction emitting also contains runtime checks so it\r\n//! should be impossible to create an instruction that is not valid (except\r\n//! there is bug in AsmJit).\r\n//!\r\n//! @ref X86Assembler contains internal buffer where all emitted instructions\r\n//! are stored. Look at @ref Buffer for an implementation. To generate and\r\n//! allocate memory for function use @ref X86Assembler::make() method that will\r\n//! allocate memory using the provided memory manager (see @ref MemoryManager)\r\n//! and relocates the output code to the provided address. If you want to create\r\n//! your function manually, you should look at @ref VirtualMemory interface and\r\n//! use @ref X86Assembler::relocCode() method to relocate emitted code into\r\n//! provided memory location. You can also take the emitted buffer by @ref\r\n//! X86Assembler::take() to do something else with it. If you take buffer, you\r\n//! must free it manually by using @ref ASMJIT_FREE() macro.\r\n//!\r\n//! @section AsmJit_Assembler_CodeGeneration Code Generation\r\n//!\r\n//! To generate code is only needed to create instance of @c AsmJit::Assembler\r\n//! and to use intrinsics. See example how to do that:\r\n//!\r\n//! @code\r\n//! // Use AsmJit namespace.\r\n//! using namespace AsmJit;\r\n//!\r\n//! // Create Assembler instance.\r\n//! Assembler a;\r\n//!\r\n//! // Prolog.\r\n//! a.push(ebp);\r\n//! a.mov(ebp, esp);\r\n//!\r\n//! // Mov 1024 to EAX, EAX is also return value.\r\n//! a.mov(eax, imm(1024));\r\n//!\r\n//! // Epilog.\r\n//! a.mov(esp, ebp);\r\n//! a.pop(ebp);\r\n//!\r\n//! // Return.\r\n//! a.ret();\r\n//! @endcode\r\n//!\r\n//! You can see that syntax is very close to Intel one. Only difference is that\r\n//! you are calling functions that emits the binary code for you. All registers\r\n//! are in @c AsmJit namespace, so it's very comfortable to use it (look at\r\n//! first line). There is also used method @c AsmJit::imm() to create an\r\n//! immediate value. Use @c AsmJit::uimm() to create unsigned immediate value.\r\n//!\r\n//! There is also possibility to use memory addresses and immediates. To build\r\n//! memory address use @c ptr(), @c byte_ptr(), @c word_ptr(), @c dword_ptr()\r\n//! or other friend methods. In most cases you needs only @c ptr() method, but\r\n//! there are instructions where you must specify address size,\r\n//!\r\n//! for example (a is @c AsmJit::Assembler instance):\r\n//!\r\n//! @code\r\n//! a.mov(ptr(eax), imm(0));                   // mov ptr [eax], 0\r\n//! a.mov(ptr(eax), edx);                      // mov ptr [eax], edx\r\n//! @endcode\r\n//!\r\n//! But it's also possible to create complex addresses:\r\n//!\r\n//! @code\r\n//! // eax + ecx*x addresses\r\n//! a.mov(ptr(eax, ecx, kScaleNone), imm(0));     // mov ptr [eax + ecx], 0\r\n//! a.mov(ptr(eax, ecx, kScale2Times), imm(0));     // mov ptr [eax + ecx * 2], 0\r\n//! a.mov(ptr(eax, ecx, kScale4Times), imm(0));     // mov ptr [eax + ecx * 4], 0\r\n//! a.mov(ptr(eax, ecx, kScale8Times), imm(0));     // mov ptr [eax + ecx * 8], 0\r\n//! // eax + ecx*x + disp addresses\r\n//! a.mov(ptr(eax, ecx, kScaleNone,  4), imm(0)); // mov ptr [eax + ecx     +  4], 0\r\n//! a.mov(ptr(eax, ecx, kScale2Times,  8), imm(0)); // mov ptr [eax + ecx * 2 +  8], 0\r\n//! a.mov(ptr(eax, ecx, kScale4Times, 12), imm(0)); // mov ptr [eax + ecx * 4 + 12], 0\r\n//! a.mov(ptr(eax, ecx, kScale8Times, 16), imm(0)); // mov ptr [eax + ecx * 8 + 16], 0\r\n//! @endcode\r\n//!\r\n//! All addresses shown are using @c AsmJit::ptr() to make memory operand.\r\n//! Some assembler instructions (single operand ones) needs to specify memory\r\n//! operand size. For example calling <code>a.inc(ptr(eax))</code> can't be\r\n//! used. @c AsmJit::Assembler::inc(), @c AsmJit::Assembler::dec() and similar\r\n//! instructions can't be serialized without specifying how bytes they are\r\n//! operating on. See next code how assembler works:\r\n//!\r\n//! @code\r\n//! // [byte] address\r\n//! a.inc(byte_ptr(eax));                      // inc byte ptr [eax]\r\n//! a.dec(byte_ptr(eax));                      // dec byte ptr [eax]\r\n//! // [word] address\r\n//! a.inc(word_ptr(eax));                      // inc word ptr [eax]\r\n//! a.dec(word_ptr(eax));                      // dec word ptr [eax]\r\n//! // [dword] address\r\n//! a.inc(dword_ptr(eax));                     // inc dword ptr [eax]\r\n//! a.dec(dword_ptr(eax));                     // dec dword ptr [eax]\r\n//! @endcode\r\n//!\r\n//! @section AsmJit_Assembler_CallingJitCode Calling JIT Code\r\n//!\r\n//! While you are over from emitting instructions, you can make your function\r\n//! using @c AsmJit::Assembler::make() method. This method will use memory\r\n//! manager to allocate virtual memory and relocates generated code to it. For\r\n//! memory allocation is used global memory manager by default and memory is\r\n//! freeable, but of course this default behavior can be overridden specifying\r\n//! your memory manager and allocation type. If you want to do with code\r\n//! something else you can always override make() method and do what you want.\r\n//!\r\n//! You can get size of generated code by @c getCodeSize() or @c getOffset()\r\n//! methods. These methods returns you code size (or more precisely current code \r\n//! offset) in bytes. Use takeCode() to take internal buffer (all pointers in\r\n//! @c AsmJit::Assembler instance will be zeroed and current buffer returned)\r\n//! to use it. If you don't take it,  @c AsmJit::Assembler destructor will\r\n//! free it automatically. To alloc and run code manually don't use\r\n//! @c malloc()'ed memory, but instead use @c AsmJit::VirtualMemory::alloc()\r\n//! to get memory for executing (specify @c canExecute to @c true) or\r\n//! @c AsmJit::MemoryManager that provides more effective and comfortable way\r\n//! to allocate virtual memory.\r\n//!\r\n//! See next example how to allocate memory where you can execute code created\r\n//! by @c AsmJit::Assembler:\r\n//!\r\n//! @code\r\n//! using namespace AsmJit;\r\n//!\r\n//! Assembler a;\r\n//!\r\n//! // ... your code generation\r\n//!\r\n//! // your function prototype\r\n//! typedef void (*MyFn)();\r\n//!\r\n//! // make your function\r\n//! MyFn fn = asmjit_cast<MyFn>(a.make());\r\n//!\r\n//! // call your function\r\n//! fn();\r\n//!\r\n//! // If you don't need your function again, free it.\r\n//! MemoryManager::getGlobal()->free(fn);\r\n//! @endcode\r\n//!\r\n//! There is also low level alternative how to allocate virtual memory and\r\n//! relocate code to it:\r\n//!\r\n//! @code\r\n//! using namespace AsmJit;\r\n//!\r\n//! Assembler a;\r\n//! // Your code generation ...\r\n//!\r\n//! // Your function prototype.\r\n//! typedef void (*MyFn)();\r\n//!\r\n//! // Alloc memory for your function.\r\n//! MyFn fn = asmjit_cast<MyFn>(\r\n//!   MemoryManager::getGlobal()->alloc(a.getCodeSize());\r\n//!\r\n//! // Relocate the code (will make the function).\r\n//! a.relocCode(fn);\r\n//!\r\n//! // Call the generated function.\r\n//! fn();\r\n//!\r\n//! // If you don't need your function anymore, it should be freed.\r\n//! MemoryManager::getGlobal()->free(fn);\r\n//! @endcode\r\n//!\r\n//! @c note This was very primitive example how to call generated code.\r\n//! In real production code you will never alloc and free code for one run,\r\n//! you will usually use generated code many times.\r\n//!\r\n//! @section AsmJit_Assembler_Labels Labels\r\n//!\r\n//! While generating assembler code, you will usually need to create complex\r\n//! code with labels. Labels are fully supported and you can call @c jmp or\r\n//! @c je (and similar) instructions to initialized or yet uninitialized label.\r\n//! Each label expects to be bound into offset. To bind label to specific\r\n//! offset, use @c bind() method.\r\n//!\r\n//! See next example that contains complete code that creates simple memory\r\n//! copy function (in DWORD entities).\r\n//!\r\n//! @code\r\n//! // Example: Usage of Label (32-bit code).\r\n//! //\r\n//! // Create simple DWORD memory copy function:\r\n//! // ASMJIT_STDCALL void copy32(uint32_t* dst, const uint32_t* src, size_t count);\r\n//! using namespace AsmJit;\r\n//!\r\n//! // Assembler instance.\r\n//! Assembler a;\r\n//!\r\n//! // Constants.\r\n//! const int arg_offset = 8; // Arguments offset (STDCALL EBP).\r\n//! const int arg_size = 12;  // Arguments size.\r\n//!\r\n//! // Labels.\r\n//! Label L_Loop = a.newLabel();\r\n//!\r\n//! // Prolog.\r\n//! a.push(ebp);\r\n//! a.mov(ebp, esp);\r\n//! a.push(esi);\r\n//! a.push(edi);\r\n//!\r\n//! // Fetch arguments\r\n//! a.mov(esi, dword_ptr(ebp, arg_offset + 0)); // Get dst.\r\n//! a.mov(edi, dword_ptr(ebp, arg_offset + 4)); // Get src.\r\n//! a.mov(ecx, dword_ptr(ebp, arg_offset + 8)); // Get count.\r\n//!\r\n//! // Bind L_Loop label to here.\r\n//! a.bind(L_Loop);\r\n//!\r\n//! Copy 4 bytes.\r\n//! a.mov(eax, dword_ptr(esi));\r\n//! a.mov(dword_ptr(edi), eax);\r\n//!\r\n//! // Increment pointers.\r\n//! a.add(esi, 4);\r\n//! a.add(edi, 4);\r\n//!\r\n//! // Repeat loop until (--ecx != 0).\r\n//! a.dec(ecx);\r\n//! a.jz(L_Loop);\r\n//!\r\n//! // Epilog.\r\n//! a.pop(edi);\r\n//! a.pop(esi);\r\n//! a.mov(esp, ebp);\r\n//! a.pop(ebp);\r\n//!\r\n//! // Return: STDCALL convention is to pop stack in called function.\r\n//! a.ret(arg_size);\r\n//! @endcode\r\n//!\r\n//! If you need more abstraction for generating assembler code and you want\r\n//! to hide calling conventions between 32-bit and 64-bit operating systems,\r\n//! look at @c Compiler class that is designed for higher level code\r\n//! generation.\r\n//!\r\n//! @section AsmJit_Assembler_AdvancedCodeGeneration Advanced Code Generation\r\n//!\r\n//! This section describes some advanced generation features of @c Assembler\r\n//! class which can be simply overlooked. The first thing that is very likely\r\n//! needed is generic register support. In previous example the named registers\r\n//! were used. AsmJit contains functions which can convert register index into\r\n//! operand and back.\r\n//!\r\n//! Let's define function which can be used to generate some abstract code:\r\n//!\r\n//! @code\r\n//! // Simple function that generates dword copy.\r\n//! void genCopyDWord(\r\n//!   Assembler& a,\r\n//!   const GpReg& dst, const GpReg& src, const GpReg& tmp)\r\n//! {\r\n//!   a.mov(tmp, dword_ptr(src));\r\n//!   a.mov(dword_ptr(dst), tmp);\r\n//! }\r\n//! @endcode\r\n//!\r\n//! This function can be called like <code>genCopyDWord(a, edi, esi, ebx)</code>\r\n//! or by using existing @ref GpReg instances. This abstraction allows to join\r\n//! more code sections together without rewriting each to use specific registers.\r\n//! You need to take care only about implicit registers which may be used by \r\n//! several instructions (like mul, imul, div, idiv, shifting, etc...).\r\n//!\r\n//! Next, more advanced, but often needed technique is that you can build your\r\n//! own registers allocator. X86 architecture contains 8 general purpose registers,\r\n//! 8 MMX (MM) registers and 8 SSE (XMM) registers. The X64 (AMD64) architecture\r\n//! extends count of general purpose registers and SSE2 registers to 16. Use the\r\n//! @c kX86RegNumBase constant to get count of GP or XMM registers or @c kX86RegNumGp,\r\n//! @c kX86RegNumMm and @c kX86RegNumXmm constants individually.\r\n//!\r\n//! To build register from index (value from 0 inclusive to kRegNumXXX\r\n//! exclusive) use @ref gpd(), @ref gpq() or @ref gpz() functions. To create\r\n//! a 8 or 16-bit register use @ref gpw(), @ref gpb_lo() or @ref gpb_hi(). \r\n//! To create other registers there are similar methods like @ref mm(), @ref xmm()\r\n//! and @ref st().\r\n//!\r\n//! So our function call to genCopyDWord can be also used like this:\r\n//!\r\n//! @code\r\n//! genCopyDWord(a, gpd(kX86RegIndexEdi), gpd(kX86RegIndexEsi), gpd(kX86RegIndexEbx));\r\n//! @endcode\r\n//!\r\n//! kX86RegIndexXXX are constants defined by @ref kX86RegIndex enum. You can use your\r\n//! own register allocator (or register slot manager) to alloc / free registers\r\n//! so kX86RegIndexXXX values can be replaced by your variables (0 to kRegNumXXX-1).\r\n//!\r\n//! @sa @ref X86Compiler.\r\nstruct X86Assembler : public Assembler\r\n{\r\n  // --------------------------------------------------------------------------\r\n  // [Construction / Destruction]\r\n  // --------------------------------------------------------------------------\r\n\r\n  ASMJIT_API X86Assembler(Context* context = JitContext::getGlobal());\r\n  ASMJIT_API virtual ~X86Assembler();\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Buffer - Setters (X86-Extensions)]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Set custom variable @a i at position @a pos.\r\n  //!\r\n  //! @note This function is used to patch existing code.\r\n  ASMJIT_API void setVarAt(size_t pos, sysint_t i, uint8_t isUnsigned, uint32_t size);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Emit]\r\n  //\r\n  // These functions are not protected against buffer overrun. Each place of\r\n  // code which calls these functions ensures that there is some space using\r\n  // canEmit() method. Emitters are internally protected in AsmJit::Buffer,\r\n  // but only in debug builds.\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Emit single @a opCode without operands.\r\n  inline void _emitOpCode(uint32_t opCode)\r\n  {\r\n    // Instruction prefix.\r\n    if (opCode & 0xFF000000) _emitByte(static_cast<uint8_t>((opCode >> 24) & 0xFF));\r\n\r\n    // Instruction opcodes.\r\n    if (opCode & 0x00FF0000) _emitByte(static_cast<uint8_t>((opCode >> 16) & 0xFF));\r\n    if (opCode & 0x0000FF00) _emitByte(static_cast<uint8_t>((opCode >>  8) & 0xFF));\r\n\r\n    // Last opcode is always emitted (can be also 0x00).\r\n    _emitByte(static_cast<uint8_t>(opCode & 0xFF));\r\n  }\r\n\r\n  //! @brief Emit MODR/M byte.\r\n  inline void _emitMod(uint8_t m, uint8_t o, uint8_t r)\r\n  { _emitByte(((m & 0x03) << 6) | ((o & 0x07) << 3) | (r & 0x07)); }\r\n\r\n  //! @brief Emit SIB byte.\r\n  inline void _emitSib(uint8_t s, uint8_t i, uint8_t b)\r\n  { _emitByte(((s & 0x03) << 6) | ((i & 0x07) << 3) | (b & 0x07)); }\r\n\r\n  //! @brief Emit REX prefix (64-bit mode only).\r\n  inline void _emitRexR(uint8_t w, uint8_t opReg, uint8_t regCode, bool forceRexPrefix)\r\n  {\r\n#if defined(ASMJIT_X64)\r\n    uint32_t rex;\r\n\r\n    // w - Default operand size(0=Default, 1=64-bit).\r\n    // r - Register field (1=high bit extension of the ModR/M REG field).\r\n    // x - Index field not used in RexR\r\n    // b - Base field (1=high bit extension of the ModR/M or SIB Base field).\r\n    rex  = (static_cast<uint32_t>(forceRexPrefix != 0)) << 6; // Rex prefix code.\r\n    rex += (static_cast<uint32_t>(w      )            ) << 3; // Rex.W (w << 3).  \r\n    rex += (static_cast<uint32_t>(opReg  ) & 0x08     ) >> 1; // Rex.R (r << 2).\r\n    rex += (static_cast<uint32_t>(regCode) & 0x08     ) >> 3; // Rex.B (b << 0).\r\n\r\n    if (rex) _emitByte(static_cast<uint8_t>(rex | 0x40));\r\n#else\r\n    ASMJIT_UNUSED(w);\r\n    ASMJIT_UNUSED(opReg);\r\n    ASMJIT_UNUSED(regCode);\r\n    ASMJIT_UNUSED(forceRexPrefix);\r\n#endif // ASMJIT_X64\r\n  }\r\n\r\n  //! @brief Emit REX prefix (64-bit mode only).\r\n  inline void _emitRexRM(uint8_t w, uint8_t opReg, const Operand& rm, bool forceRexPrefix)\r\n  {\r\n#if defined(ASMJIT_X64)\r\n    uint32_t rex;\r\n    \r\n    // w - Default operand size(0=Default, 1=64-bit).\r\n    // r - Register field (1=high bit extension of the ModR/M REG field).\r\n    // x - Index field (1=high bit extension of the SIB Index field).\r\n    // b - Base field (1=high bit extension of the ModR/M or SIB Base field).\r\n\r\n    rex  = (static_cast<uint32_t>(forceRexPrefix != 0)) << 6; // Rex prefix code.\r\n    rex += (static_cast<uint32_t>(w      )            ) << 3; // Rex.W (w << 3).  \r\n    rex += (static_cast<uint32_t>(opReg  ) & 0x08     ) >> 1; // Rex.R (r << 2).\r\n\r\n    uint32_t b = 0;\r\n    uint32_t x = 0;\r\n\r\n    if (rm.isReg())\r\n    {\r\n      b = (static_cast<const Reg&>(rm).getRegCode() & 0x08) != 0;\r\n    }\r\n    else if (rm.isMem())\r\n    {\r\n      b = ((static_cast<const Mem&>(rm).getBase()  & 0x8) != 0) & (static_cast<const Mem&>(rm).getBase()  != kInvalidValue);\r\n      x = ((static_cast<const Mem&>(rm).getIndex() & 0x8) != 0) & (static_cast<const Mem&>(rm).getIndex() != kInvalidValue);\r\n    }\r\n\r\n    rex += static_cast<uint32_t>(x) << 1; // Rex.R (x << 1).\r\n    rex += static_cast<uint32_t>(b)     ; // Rex.B (b << 0).\r\n\r\n    if (rex) _emitByte(static_cast<uint8_t>(rex | 0x40));\r\n#else\r\n    ASMJIT_UNUSED(w);\r\n    ASMJIT_UNUSED(opReg);\r\n    ASMJIT_UNUSED(rm);\r\n#endif // ASMJIT_X64\r\n  }\r\n\r\n  //! @brief Emit Register / Register - calls _emitMod(3, opReg, r)\r\n  inline void _emitModR(uint8_t opReg, uint8_t r)\r\n  { _emitMod(3, opReg, r); }\r\n\r\n  //! @brief Emit Register / Register - calls _emitMod(3, opReg, r.code())\r\n  inline void _emitModR(uint8_t opReg, const Reg& r)\r\n  { _emitMod(3, opReg, r.getRegCode()); }\r\n\r\n  //! @brief Emit register / memory address combination to buffer.\r\n  //!\r\n  //! This method can hangle addresses from simple to complex ones with\r\n  //! index and displacement.\r\n  ASMJIT_API void _emitModM(uint8_t opReg, const Mem& mem, sysint_t immSize);\r\n\r\n  //! @brief Emit Reg<-Reg or Reg<-Reg|Mem ModRM (can be followed by SIB \r\n  //! and displacement) to buffer.\r\n  //!\r\n  //! This function internally calls @c _emitModM() or _emitModR() that depends\r\n  //! to @a op type.\r\n  //!\r\n  //! @note @a opReg is usually real register ID (see @c R) but some instructions\r\n  //! have specific format and in that cases @a opReg is part of opcode.\r\n  ASMJIT_API void _emitModRM(uint8_t opReg, const Operand& op, sysint_t immSize);\r\n\r\n  //! @brief Emit CS (code segmend) prefix.\r\n  //!\r\n  //! Behavior of this function is to emit code prefix only if memory operand\r\n  //! address uses code segment. Code segment is used through memory operand\r\n  //! with attached @c AsmJit::Label.\r\n  ASMJIT_API void _emitSegmentPrefix(const Operand& rm);\r\n\r\n  //! @brief Emit instruction where register is inlined to opcode.\r\n  ASMJIT_API void _emitX86Inl(uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t reg, bool forceRexPrefix);\r\n\r\n  //! @brief Emit instruction with reg/memory operand.\r\n  ASMJIT_API void _emitX86RM(uint32_t opCode, uint8_t i16bit, uint8_t rexw, uint8_t o,\r\n    const Operand& op, sysint_t immSize, bool forceRexPrefix);\r\n\r\n  //! @brief Emit FPU instruction with no operands.\r\n  ASMJIT_API void _emitFpu(uint32_t opCode);\r\n\r\n  //! @brief Emit FPU instruction with one operand @a sti (index of FPU register).\r\n  ASMJIT_API void _emitFpuSTI(uint32_t opCode, uint32_t sti);\r\n\r\n  //! @brief Emit FPU instruction with one operand @a opReg and memory operand @a mem.\r\n  ASMJIT_API void _emitFpuMEM(uint32_t opCode, uint8_t opReg, const Mem& mem);\r\n\r\n  //! @brief Emit MMX/SSE instruction.\r\n  ASMJIT_API void _emitMmu(uint32_t opCode, uint8_t rexw, uint8_t opReg, const Operand& src, sysint_t immSize);\r\n\r\n  //! @brief Emit displacement.\r\n  ASMJIT_API LabelLink* _emitDisplacement(LabelData& l_data, sysint_t inlinedDisplacement, int size);\r\n\r\n  //! @brief Emit relative relocation to absolute pointer @a target. It's needed\r\n  //! to add what instruction is emitting this, because in x64 mode the relative\r\n  //! displacement can be impossible to calculate and in this case the trampoline\r\n  //! is used.\r\n  ASMJIT_API void _emitJmpOrCallReloc(uint32_t instruction, void* target);\r\n\r\n  // Helpers to decrease binary code size. These four emit methods are just\r\n  // helpers thats used by assembler. They call emitX86() adding NULLs\r\n  // to first, second and third operand, if needed.\r\n\r\n  //! @brief Emit X86/FPU or MM/XMM instruction.\r\n  ASMJIT_API void _emitInstruction(uint32_t code);\r\n\r\n  //! @brief Emit X86/FPU or MM/XMM instruction.\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0);\r\n\r\n  //! @brief Emit X86/FPU or MM/XMM instruction.\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1);\r\n\r\n  //! @brief Emit X86/FPU or MM/XMM instruction.\r\n  //!\r\n  //! Operands @a o1, @a o2 or @a o3 can be @c NULL if they are not used.\r\n  //!\r\n  //! Hint: Use @c emitX86() helpers to emit instructions.\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2);\r\n\r\n  //! @brief Private method for emitting jcc.\r\n  ASMJIT_API void _emitJcc(uint32_t code, const Label* label, uint32_t hint);\r\n\r\n  //! @brief Private method for emitting short jcc.\r\n  inline void _emitShortJcc(uint32_t code, const Label* label, uint32_t hint)\r\n  {\r\n    _emitOptions |= kX86EmitOptionShortJump;\r\n    _emitJcc(code, label, hint);\r\n  }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [EmbedLabel]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Embed absolute label pointer (4 or 8 bytes).\r\n  ASMJIT_API void embedLabel(const Label& label);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Align]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Align target buffer to @a m bytes.\r\n  //!\r\n  //! Typical usage of this is to align labels at start of the inner loops.\r\n  //!\r\n  //! Inserts @c nop() instructions or CPU optimized NOPs.\r\n  ASMJIT_API void align(uint32_t m);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Label]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Create and return new label.\r\n  ASMJIT_API Label newLabel();\r\n\r\n  //! @brief Register labels (used by @c Compiler).\r\n  ASMJIT_API void registerLabels(size_t count);\r\n\r\n  //! @brief Bind label to the current offset.\r\n  //!\r\n  //! @note Label can be bound only once!\r\n  ASMJIT_API void bind(const Label& label);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Reloc]\r\n  // --------------------------------------------------------------------------\r\n\r\n  ASMJIT_API virtual size_t relocCode(void* dst, sysuint_t addressBase) const;\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Make]\r\n  // --------------------------------------------------------------------------\r\n\r\n  ASMJIT_API virtual void* make();\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Embed]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Add 8-bit integer data to the instuction stream.\r\n  inline void db(uint8_t  x) { embed(&x, 1); }\r\n  //! @brief Add 16-bit integer data to the instuction stream.\r\n  inline void dw(uint16_t x) { embed(&x, 2); }\r\n  //! @brief Add 32-bit integer data to the instuction stream.\r\n  inline void dd(uint32_t x) { embed(&x, 4); }\r\n  //! @brief Add 64-bit integer data to the instuction stream.\r\n  inline void dq(uint64_t x) { embed(&x, 8); }\r\n\r\n  //! @brief Add 8-bit integer data to the instuction stream.\r\n  inline void dint8(int8_t x) { embed(&x, sizeof(int8_t)); }\r\n  //! @brief Add 8-bit integer data to the instuction stream.\r\n  inline void duint8(uint8_t x) { embed(&x, sizeof(uint8_t)); }\r\n\r\n  //! @brief Add 16-bit integer data to the instuction stream.\r\n  inline void dint16(int16_t x) { embed(&x, sizeof(int16_t)); }\r\n  //! @brief Add 16-bit integer data to the instuction stream.\r\n  inline void duint16(uint16_t x) { embed(&x, sizeof(uint16_t)); }\r\n\r\n  //! @brief Add 32-bit integer data to the instuction stream.\r\n  inline void dint32(int32_t x) { embed(&x, sizeof(int32_t)); }\r\n  //! @brief Add 32-bit integer data to the instuction stream.\r\n  inline void duint32(uint32_t x) { embed(&x, sizeof(uint32_t)); }\r\n\r\n  //! @brief Add 64-bit integer data to the instuction stream.\r\n  inline void dint64(int64_t x) { embed(&x, sizeof(int64_t)); }\r\n  //! @brief Add 64-bit integer data to the instuction stream.\r\n  inline void duint64(uint64_t x) { embed(&x, sizeof(uint64_t)); }\r\n\r\n  //! @brief Add system-integer data to the instuction stream.\r\n  inline void dintptr(intptr_t x) { embed(&x, sizeof(intptr_t)); }\r\n  //! @brief Add system-integer data to the instuction stream.\r\n  inline void duintptr(uintptr_t x) { embed(&x, sizeof(uintptr_t)); }\r\n\r\n  //! @brief Add float data to the instuction stream.\r\n  inline void dfloat(float x) { embed(&x, sizeof(float)); }\r\n  //! @brief Add double data to the instuction stream.\r\n  inline void ddouble(double x) { embed(&x, sizeof(double)); }\r\n\r\n  //! @brief Add pointer data to the instuction stream.\r\n  inline void dptr(void* x) { embed(&x, sizeof(void*)); }\r\n\r\n  //! @brief Add MM data to the instuction stream.\r\n  inline void dmm(const MmData& x) { embed(&x, sizeof(MmData)); }\r\n  //! @brief Add XMM data to the instuction stream.\r\n  inline void dxmm(const XmmData& x) { embed(&x, sizeof(XmmData)); }\r\n\r\n  //! @brief Add data to the instuction stream.\r\n  inline void data(const void* data, size_t size) { embed(data, size); }\r\n\r\n  //! @brief Add data in a given structure instance to the instuction stream.\r\n  template<typename T>\r\n  inline void dstruct(const T& x) { embed(&x, sizeof(T)); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [X86 Instructions]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Add with Carry.\r\n  inline void adc(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n  //! @brief Add with Carry.\r\n  inline void adc(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n  //! @brief Add with Carry.\r\n  inline void adc(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n  //! @brief Add with Carry.\r\n  inline void adc(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n  //! @brief Add with Carry.\r\n  inline void adc(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n\r\n  //! @brief Add.\r\n  inline void add(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n  //! @brief Add.\r\n  inline void add(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n  //! @brief Add.\r\n  inline void add(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n  //! @brief Add.\r\n  inline void add(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n  //! @brief Add.\r\n  inline void add(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n\r\n  //! @brief Logical And.\r\n  inline void and_(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n  //! @brief Logical And.\r\n  inline void and_(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n  //! @brief Logical And.\r\n  inline void and_(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n  //! @brief Logical And.\r\n  inline void and_(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n  //! @brief Logical And.\r\n  inline void and_(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n\r\n  //! @brief Bit Scan Forward.\r\n  inline void bsf(const GpReg& dst, const GpReg& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsf, &dst, &src);\r\n  }\r\n  //! @brief Bit Scan Forward.\r\n  inline void bsf(const GpReg& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsf, &dst, &src);\r\n  }\r\n\r\n  //! @brief Bit Scan Reverse.\r\n  inline void bsr(const GpReg& dst, const GpReg& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsr, &dst, &src);\r\n  }\r\n  //! @brief Bit Scan Reverse.\r\n  inline void bsr(const GpReg& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsr, &dst, &src);\r\n  }\r\n\r\n  //! @brief Byte swap (32-bit or 64-bit registers only) (i486).\r\n  inline void bswap(const GpReg& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegType() == kX86RegTypeGpd || dst.getRegType() == kX86RegTypeGpq);\r\n    _emitInstruction(kX86InstBSwap, &dst);\r\n  }\r\n\r\n  //! @brief Bit test.\r\n  inline void bt(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n  //! @brief Bit test.\r\n  inline void bt(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n  //! @brief Bit test.\r\n  inline void bt(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n  //! @brief Bit test.\r\n  inline void bt(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n\r\n  //! @brief Bit test and set.\r\n  inline void bts(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n  //! @brief Bit test and set.\r\n  inline void bts(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n  //! @brief Bit test and set.\r\n  inline void bts(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n  //! @brief Bit test and set.\r\n  inline void bts(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n\r\n  //! @brief Call Procedure.\r\n  inline void call(const GpReg& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpz));\r\n    _emitInstruction(kX86InstCall, &dst);\r\n  }\r\n  //! @brief Call Procedure.\r\n  inline void call(const Mem& dst)\r\n  { _emitInstruction(kX86InstCall, &dst); }\r\n  //! @brief Call Procedure.\r\n  inline void call(const Imm& dst)\r\n  { _emitInstruction(kX86InstCall, &dst); }\r\n  //! @brief Call Procedure.\r\n  //! @overload\r\n  inline void call(void* dst)\r\n  {\r\n    Imm imm((sysint_t)dst);\r\n    _emitInstruction(kX86InstCall, &imm);\r\n  }\r\n\r\n  //! @brief Call Procedure.\r\n  inline void call(const Label& label)\r\n  { _emitInstruction(kX86InstCall, &label); }\r\n\r\n  //! @brief Convert Byte to Word (Sign Extend).\r\n  //!\r\n  //! AX <- Sign Extend AL\r\n  inline void cbw()\r\n  { _emitInstruction(kX86InstCbw); }\r\n\r\n  //! @brief Convert Word to DWord (Sign Extend).\r\n  //!\r\n  //! DX:AX <- Sign Extend AX\r\n  inline void cwd()\r\n  { _emitInstruction(kX86InstCwd); }\r\n\r\n  //! @brief Convert Word to DWord (Sign Extend).\r\n  //!\r\n  //! EAX <- Sign Extend AX\r\n  inline void cwde()\r\n  { _emitInstruction(kX86InstCwde); }\r\n\r\n  //! @brief Convert DWord to QWord (Sign Extend).\r\n  //!\r\n  //! EDX:EAX <- Sign Extend EAX\r\n  inline void cdq()\r\n  { _emitInstruction(kX86InstCdq); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Convert DWord to QWord (Sign Extend).\r\n  //!\r\n  //! RAX <- Sign Extend EAX\r\n  inline void cdqe()\r\n  { _emitInstruction(kX86InstCdqe); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Clear Carry flag\r\n  //!\r\n  //! This instruction clears the CF flag in the EFLAGS register.\r\n  inline void clc()\r\n  { _emitInstruction(kX86InstClc); }\r\n\r\n  //! @brief Clear Direction flag\r\n  //!\r\n  //! This instruction clears the DF flag in the EFLAGS register.\r\n  inline void cld()\r\n  { _emitInstruction(kX86InstCld); }\r\n\r\n  //! @brief Complement Carry Flag.\r\n  //!\r\n  //! This instruction complements the CF flag in the EFLAGS register.\r\n  //! (CF = NOT CF)\r\n  inline void cmc()\r\n  { _emitInstruction(kX86InstCmc); }\r\n\r\n  //! @brief Conditional Move.\r\n  inline void cmov(kX86Cond cc, const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); }\r\n\r\n  //! @brief Conditional Move.\r\n  inline void cmov(kX86Cond cc, const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); }\r\n\r\n  //! @brief Conditional Move.\r\n  inline void cmova  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovA  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmova  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovA  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovae (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovae (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovAE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovb  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovB  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovb  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovB  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovbe (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovbe (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovBE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovc  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovC  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovc  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovC  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmove  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovE  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmove  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovE  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovg  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovG  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovg  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovG  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovge (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovge (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovGE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovl  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovL  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovl  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovL  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovle (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovle (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovLE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovna (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovna (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNA , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnae(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnae(const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNAE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnb (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnb (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNB , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnbe(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnbe(const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNBE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnc (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnc (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNC , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovne (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovne (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovng (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovng (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNG , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnge(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnge(const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNGE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnl (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnl (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNL , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnle(const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnle(const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNLE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovno (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovno (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnp (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnp (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNP , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovns (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovns (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNS , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnz (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnz (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNZ , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovo  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovO  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovo  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovO  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovp  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovP  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovp  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovP  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpe (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpe (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovPE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpo (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpo (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovPO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovs  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovS  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovs  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovS  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovz  (const GpReg& dst, const GpReg& src) { _emitInstruction(kX86InstCMovZ  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovz  (const GpReg& dst, const Mem& src)   { _emitInstruction(kX86InstCMovZ  , &dst, &src); }\r\n\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n\r\n  //! @brief Compare and Exchange (i486).\r\n  inline void cmpxchg(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstCmpXCHG, &dst, &src); }\r\n  //! @brief Compare and Exchange (i486).\r\n  inline void cmpxchg(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstCmpXCHG, &dst, &src); }\r\n\r\n  //! @brief Compares the 64-bit value in EDX:EAX with the memory operand (Pentium).\r\n  //!\r\n  //! If the values are equal, then this instruction stores the 64-bit value\r\n  //! in ECX:EBX into the memory operand and sets the zero flag. Otherwise,\r\n  //! this instruction copies the 64-bit memory operand into the EDX:EAX\r\n  //! registers and clears the zero flag.\r\n  inline void cmpxchg8b(const Mem& dst)\r\n  { _emitInstruction(kX86InstCmpXCHG8B, &dst); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Compares the 128-bit value in RDX:RAX with the memory operand (X64).\r\n  //!\r\n  //! If the values are equal, then this instruction stores the 128-bit value\r\n  //! in RCX:RBX into the memory operand and sets the zero flag. Otherwise,\r\n  //! this instruction copies the 128-bit memory operand into the RDX:RAX\r\n  //! registers and clears the zero flag.\r\n  inline void cmpxchg16b(const Mem& dst)\r\n  { _emitInstruction(kX86InstCmpXCHG16B, &dst); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief CPU Identification (i486).\r\n  inline void cpuid()\r\n  { _emitInstruction(kX86InstCpuId); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Convert QWord to DQWord (Sign Extend).\r\n  //!\r\n  //! RDX:RAX <- Sign Extend RAX\r\n  inline void cqo()\r\n  { _emitInstruction(kX86InstCqo); }\r\n#endif // ASMJIT_X64\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Decimal adjust AL after addition\r\n  //!\r\n  //! This instruction adjusts the sum of two packed BCD values to create\r\n  //! a packed BCD result.\r\n  //!\r\n  //! @note This instruction is only available in 32-bit mode.\r\n  inline void daa()\r\n  { _emitInstruction(kX86InstDaa); }\r\n#endif // ASMJIT_X86\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Decimal adjust AL after subtraction\r\n  //!\r\n  //! This instruction adjusts the result of the subtraction of two packed\r\n  //! BCD values to create a packed BCD result.\r\n  //!\r\n  //! @note This instruction is only available in 32-bit mode.\r\n  inline void das()\r\n  { _emitInstruction(kX86InstDas); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Decrement by 1.\r\n  //! @note This instruction can be slower than sub(dst, 1)\r\n  inline void dec(const GpReg& dst)\r\n  { _emitInstruction(kX86InstDec, &dst); }\r\n  //! @brief Decrement by 1.\r\n  //! @note This instruction can be slower than sub(dst, 1)\r\n  inline void dec(const Mem& dst)\r\n  { _emitInstruction(kX86InstDec, &dst); }\r\n\r\n  //! @brief Unsigned divide.\r\n  //!\r\n  //! This instruction divides (unsigned) the value in the AL, AX, or EAX\r\n  //! register by the source operand and stores the result in the AX,\r\n  //! DX:AX, or EDX:EAX registers.\r\n  inline void div(const GpReg& src)\r\n  { _emitInstruction(kX86InstDiv, &src); }\r\n  //! @brief Unsigned divide.\r\n  //! @overload\r\n  inline void div(const Mem& src)\r\n  { _emitInstruction(kX86InstDiv, &src); }\r\n\r\n  //! @brief Make Stack Frame for Procedure Parameters.\r\n  inline void enter(const Imm& imm16, const Imm& imm8)\r\n  { _emitInstruction(kX86InstEnter, &imm16, &imm8); }\r\n\r\n  //! @brief Signed divide.\r\n  //!\r\n  //! This instruction divides (signed) the value in the AL, AX, or EAX\r\n  //! register by the source operand and stores the result in the AX,\r\n  //! DX:AX, or EDX:EAX registers.\r\n  inline void idiv(const GpReg& src)\r\n  { _emitInstruction(kX86InstIDiv, &src); }\r\n  //! @brief Signed divide.\r\n  //! @overload\r\n  inline void idiv(const Mem& src)\r\n  { _emitInstruction(kX86InstIDiv, &src); }\r\n\r\n  //! @brief Signed multiply.\r\n  //!\r\n  //! Source operand (in a general-purpose register or memory location)\r\n  //! is multiplied by the value in the AL, AX, or EAX register (depending\r\n  //! on the operand size) and the product is stored in the AX, DX:AX, or\r\n  //! EDX:EAX registers, respectively.\r\n  inline void imul(const GpReg& src)\r\n  { _emitInstruction(kX86InstIMul, &src); }\r\n  //! @overload\r\n  inline void imul(const Mem& src)\r\n  { _emitInstruction(kX86InstIMul, &src); }\r\n\r\n  //! @brief Signed multiply.\r\n  //!\r\n  //! Destination operand (the first operand) is multiplied by the source\r\n  //! operand (second operand). The destination operand is a general-purpose\r\n  //! register and the source operand is an immediate value, a general-purpose\r\n  //! register, or a memory location. The product is then stored in the\r\n  //! destination operand location.\r\n  inline void imul(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src); }\r\n  //! @brief Signed multiply.\r\n  //! @overload\r\n  inline void imul(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src); }\r\n  //! @brief Signed multiply.\r\n  //! @overload\r\n  inline void imul(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src); }\r\n\r\n  //! @brief Signed multiply.\r\n  //!\r\n  //! source operand (which can be a general-purpose register or a memory\r\n  //! location) is multiplied by the second source operand (an immediate\r\n  //! value). The product is then stored in the destination operand\r\n  //! (a general-purpose register).\r\n  inline void imul(const GpReg& dst, const GpReg& src, const Imm& imm)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src, &imm); }\r\n  //! @overload\r\n  inline void imul(const GpReg& dst, const Mem& src, const Imm& imm)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src, &imm); }\r\n\r\n  //! @brief Increment by 1.\r\n  //! @note This instruction can be slower than add(dst, 1)\r\n  inline void inc(const GpReg& dst)\r\n  { _emitInstruction(kX86InstInc, &dst); }\r\n  //! @brief Increment by 1.\r\n  //! @note This instruction can be slower than add(dst, 1)\r\n  inline void inc(const Mem& dst)\r\n  { _emitInstruction(kX86InstInc, &dst); }\r\n\r\n  //! @brief Interrupt 3 - trap to debugger.\r\n  inline void int3()\r\n  { _emitInstruction(kX86InstInt3); }\r\n\r\n  //! @brief Jump to label @a label if condition @a cc is met.\r\n  //!\r\n  //! This instruction checks the state of one or more of the status flags in\r\n  //! the EFLAGS register (CF, OF, PF, SF, and ZF) and, if the flags are in the\r\n  //! specified state (condition), performs a jump to the target instruction\r\n  //! specified by the destination operand. A condition code (cc) is associated\r\n  //! with each instruction to indicate the condition being tested for. If the\r\n  //! condition is not satisfied, the jump is not performed and execution\r\n  //! continues with the instruction following the Jcc instruction.\r\n  inline void j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone)\r\n  {\r\n    _emitJcc(X86Util::getJccInstFromCond(cc), &label, hint);\r\n  }\r\n\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void ja  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJA  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jae (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJAE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jb  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJB  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJBE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jc  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJC  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void je  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJE  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jg  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJG  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jge (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJGE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jl  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJL  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jle (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJLE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jna (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNA , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNAE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNB , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNBE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNC , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jne (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jng (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNG , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNGE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNL , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNLE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jno (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNO , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNP , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jns (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNS , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNZ , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jo  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJO  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jp  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJP  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPO , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void js  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJS  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jz  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJZ  , &label, hint); }\r\n\r\n  //! @brief Short jump to label @a label if condition @a cc is met.\r\n  //! @sa j()\r\n  inline void short_j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone)\r\n  {\r\n    _emitOptions |= kX86EmitOptionShortJump;\r\n    j(cc, label, hint);\r\n  }\r\n\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_ja  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJA  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jae (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJAE , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jb  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJB  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJBE , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jc  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJC  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_je  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJE  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jg  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJG  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jge (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJGE , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jl  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJL  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jle (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJLE , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jna (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNA , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNAE, &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNB , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNBE, &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNC , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jne (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNE , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jng (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNG , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNGE, &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNL , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNLE, &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jno (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNO , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNP , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jns (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNS , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJNZ , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jo  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJO  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jp  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJP  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJPE , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJPO , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_js  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJS  , &label, hint); }\r\n  //! @brief Short jump to label @a label if condition is met.\r\n  inline void short_jz  (const Label& label, uint32_t hint = kCondHintNone) { _emitShortJcc(kX86InstJZ  , &label, hint); }\r\n\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(const GpReg& dst)\r\n  { _emitInstruction(kX86InstJmp, &dst); }\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(const Mem& dst)\r\n  { _emitInstruction(kX86InstJmp, &dst); }\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(const Imm& dst)\r\n  { _emitInstruction(kX86InstJmp, &dst); }\r\n\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(void* dst)\r\n  {\r\n    Imm imm((sysint_t)dst);\r\n    _emitInstruction(kX86InstJmp, &imm);\r\n  }\r\n\r\n  //! @brief Jump.\r\n  //!\r\n  //! This instruction transfers program control to a different point\r\n  //! in the instruction stream without recording return information.\r\n  //! The destination (target) operand specifies the label of the\r\n  //! instruction being jumped to.\r\n  inline void jmp(const Label& label)\r\n  { _emitInstruction(kX86InstJmp, &label); }\r\n\r\n  //! @brief Short jump.\r\n  //! @sa jmp()\r\n  inline void short_jmp(const Label& label)\r\n  {\r\n    _emitOptions |= kX86EmitOptionShortJump;\r\n    _emitInstruction(kX86InstJmp, &label);\r\n  }\r\n\r\n  //! @brief Load Effective Address\r\n  //!\r\n  //! This instruction computes the effective address of the second\r\n  //! operand (the source operand) and stores it in the first operand\r\n  //! (destination operand). The source operand is a memory address\r\n  //! (offset part) specified with one of the processors addressing modes.\r\n  //! The destination operand is a general-purpose register.\r\n  inline void lea(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstLea, &dst, &src); }\r\n\r\n  //! @brief High Level Procedure Exit.\r\n  inline void leave()\r\n  { _emitInstruction(kX86InstLeave); }\r\n\r\n  //! @brief Move.\r\n  //!\r\n  //! This instruction copies the second operand (source operand) to the first\r\n  //! operand (destination operand). The source operand can be an immediate\r\n  //! value, general-purpose register, segment register, or memory location.\r\n  //! The destination register can be a general-purpose register, segment\r\n  //! register, or memory location. Both operands must be the same size, which\r\n  //! can be a byte, a word, or a DWORD.\r\n  //!\r\n  //! @note To move MMX or SSE registers to/from GP registers or memory, use\r\n  //! corresponding functions: @c movd(), @c movq(), etc. Passing MMX or SSE\r\n  //! registers to @c mov() is illegal.\r\n  inline void mov(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move from segment register.\r\n  //! @overload.\r\n  inline void mov(const GpReg& dst, const SegmentReg& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move from segment register.\r\n  //! @overload.\r\n  inline void mov(const Mem& dst, const SegmentReg& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move to segment register.\r\n  //! @overload.\r\n  inline void mov(const SegmentReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move to segment register.\r\n  //! @overload.\r\n  inline void mov(const SegmentReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move byte, word, dword or qword from absolute address @a src to\r\n  //! AL, AX, EAX or RAX register.\r\n  inline void mov_ptr(const GpReg& dst, void* src)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() == 0);\r\n    Imm imm((sysint_t)src);\r\n    _emitInstruction(kX86InstMovPtr, &dst, &imm);\r\n  }\r\n\r\n  //! @brief Move byte, word, dword or qword from AL, AX, EAX or RAX register\r\n  //! to absolute address @a dst.\r\n  inline void mov_ptr(void* dst, const GpReg& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getRegIndex() == 0);\r\n    Imm imm((sysint_t)dst);\r\n    _emitInstruction(kX86InstMovPtr, &imm, &src);\r\n  }\r\n\r\n  //! @brief Move with Sign-Extension.\r\n  //!\r\n  //! This instruction copies the contents of the source operand (register\r\n  //! or memory location) to the destination operand (register) and sign\r\n  //! extends the value to 16, 32 or 64-bits.\r\n  //!\r\n  //! @sa movsxd().\r\n  void movsx(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovSX, &dst, &src); }\r\n  //! @brief Move with Sign-Extension.\r\n  //! @overload\r\n  void movsx(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSX, &dst, &src); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move DWord to QWord with sign-extension.\r\n  inline void movsxd(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovSXD, &dst, &src); }\r\n  //! @brief Move DWord to QWord with sign-extension.\r\n  //! @overload\r\n  inline void movsxd(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSXD, &dst, &src); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Move with Zero-Extend.\r\n  //!\r\n  //! This instruction copies the contents of the source operand (register\r\n  //! or memory location) to the destination operand (register) and zero\r\n  //! extends the value to 16 or 32-bits. The size of the converted value\r\n  //! depends on the operand-size attribute.\r\n  inline void movzx(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovZX, &dst, &src); }\r\n  //! @brief Move with Zero-Extend.\r\n  //! @brief Overload\r\n  inline void movzx(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovZX, &dst, &src); }\r\n\r\n  //! @brief Unsigned multiply.\r\n  //!\r\n  //! Source operand (in a general-purpose register or memory location)\r\n  //! is multiplied by the value in the AL, AX, or EAX register (depending\r\n  //! on the operand size) and the product is stored in the AX, DX:AX, or\r\n  //! EDX:EAX registers, respectively.\r\n  inline void mul(const GpReg& src)\r\n  { _emitInstruction(kX86InstMul, &src); }\r\n  //! @brief Unsigned multiply.\r\n  //! @overload\r\n  inline void mul(const Mem& src)\r\n  { _emitInstruction(kX86InstMul, &src); }\r\n\r\n  //! @brief Two's Complement Negation.\r\n  inline void neg(const GpReg& dst)\r\n  { _emitInstruction(kX86InstNeg, &dst); }\r\n  //! @brief Two's Complement Negation.\r\n  inline void neg(const Mem& dst)\r\n  { _emitInstruction(kX86InstNeg, &dst); }\r\n\r\n  //! @brief No Operation.\r\n  //!\r\n  //! This instruction performs no operation. This instruction is a one-byte\r\n  //! instruction that takes up space in the instruction stream but does not\r\n  //! affect the machine context, except the EIP register. The NOP instruction\r\n  //! is an alias mnemonic for the XCHG (E)AX, (E)AX instruction.\r\n  inline void nop()\r\n  { _emitInstruction(kX86InstNop); }\r\n\r\n  //! @brief One's Complement Negation.\r\n  inline void not_(const GpReg& dst)\r\n  { _emitInstruction(kX86InstNot, &dst); }\r\n  //! @brief One's Complement Negation.\r\n  inline void not_(const Mem& dst)\r\n  { _emitInstruction(kX86InstNot, &dst); }\r\n\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n\r\n  //! @brief Pop a Value from the Stack.\r\n  //!\r\n  //! This instruction loads the value from the top of the stack to the location\r\n  //! specified with the destination operand and then increments the stack pointer.\r\n  //! The destination operand can be a general purpose register, memory location,\r\n  //! or segment register.\r\n  inline void pop(const GpReg& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpw) || dst.isRegType(kX86RegTypeGpz));\r\n    _emitInstruction(kX86InstPop, &dst);\r\n  }\r\n  //! @brief Pop a Segment Register from the Stack.\r\n  //!\r\n  //! @note There is no instruction to pop a cs segment register.\r\n  inline void pop(const SegmentReg& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() != kX86SegCs);\r\n    _emitInstruction(kX86InstPop, &dst);\r\n  }\r\n\r\n  inline void pop(const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == sizeof(sysint_t));\r\n    _emitInstruction(kX86InstPop, &dst);\r\n  }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Pop All General-Purpose Registers.\r\n  //!\r\n  //! Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX.\r\n  inline void popad()\r\n  { _emitInstruction(kX86InstPopAD); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Pop Stack into EFLAGS Register (32-bit or 64-bit).\r\n  inline void popf()\r\n  {\r\n#if defined(ASMJIT_X86)\r\n    popfd();\r\n#else\r\n    popfq();\r\n#endif\r\n  }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Pop Stack into EFLAGS Register (32-bit).\r\n  inline void popfd() { _emitInstruction(kX86InstPopFD); }\r\n#else\r\n  //! @brief Pop Stack into EFLAGS Register (64-bit).\r\n  inline void popfq() { _emitInstruction(kX86InstPopFQ); }\r\n#endif\r\n\r\n  //! @brief Push WORD/DWORD/QWORD Onto the Stack.\r\n  //!\r\n  //! @note 32-bit architecture pushed DWORD while 64-bit\r\n  //! pushes QWORD. 64-bit mode not provides instruction to\r\n  //! push 32-bit register/memory.\r\n  inline void push(const GpReg& src)\r\n  {\r\n    ASMJIT_ASSERT(src.isRegType(kX86RegTypeGpw) || src.isRegType(kX86RegTypeGpz));\r\n    _emitInstruction(kX86InstPush, &src);\r\n  }\r\n  //! @brief Push Segment Register Onto the Stack.\r\n  inline void push(const SegmentReg& src)\r\n  { _emitInstruction(kX86InstPush, &src); }\r\n  //! @brief Push WORD/DWORD/QWORD Onto the Stack.\r\n  inline void push(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == sizeof(sysint_t));\r\n    _emitInstruction(kX86InstPush, &src);\r\n  }\r\n  //! @brief Push WORD/DWORD/QWORD Onto the Stack.\r\n  inline void push(const Imm& src)\r\n  { _emitInstruction(kX86InstPush, &src); }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Push All General-Purpose Registers.\r\n  //!\r\n  //! Push EAX, ECX, EDX, EBX, original ESP, EBP, ESI, and EDI.\r\n  inline void pushad()\r\n  { _emitInstruction(kX86InstPushAD); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Push EFLAGS Register (32-bit or 64-bit) onto the Stack.\r\n  inline void pushf()\r\n  {\r\n#if defined(ASMJIT_X86)\r\n    pushfd();\r\n#else\r\n    pushfq();\r\n#endif\r\n  }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Push EFLAGS Register (32-bit) onto the Stack.\r\n  inline void pushfd() { _emitInstruction(kX86InstPushFD); }\r\n#else\r\n  //! @brief Push EFLAGS Register (64-bit) onto the Stack.\r\n  inline void pushfq() { _emitInstruction(kX86InstPushFQ); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcl(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n  //! @brief Rotate Bits Left.\r\n  inline void rcl(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcl(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n  //! @brief Rotate Bits Left.\r\n  inline void rcl(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcr(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n  //! @brief Rotate Bits Right.\r\n  inline void rcr(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcr(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n  //! @brief Rotate Bits Right.\r\n  inline void rcr(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n\r\n  //! @brief Read Time-Stamp Counter (Pentium).\r\n  inline void rdtsc()\r\n  { _emitInstruction(kX86InstRdtsc); }\r\n\r\n  //! @brief Read Time-Stamp Counter and Processor ID (New).\r\n  inline void rdtscp()\r\n  { _emitInstruction(kX86InstRdtscP); }\r\n\r\n  //! @brief Load ECX/RCX BYTEs from DS:[ESI/RSI] to AL.\r\n  inline void rep_lodsb()\r\n  { _emitInstruction(kX86InstRepLodSB); }\r\n\r\n  //! @brief Load ECX/RCX DWORDs from DS:[ESI/RSI] to EAX.\r\n  inline void rep_lodsd()\r\n  { _emitInstruction(kX86InstRepLodSD); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Load ECX/RCX QWORDs from DS:[ESI/RSI] to RAX.\r\n  inline void rep_lodsq()\r\n  { _emitInstruction(kX86InstRepLodSQ); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Load ECX/RCX WORDs from DS:[ESI/RSI] to AX.\r\n  inline void rep_lodsw()\r\n  { _emitInstruction(kX86InstRepLodSW); }\r\n\r\n  //! @brief Move ECX/RCX BYTEs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsb()\r\n  { _emitInstruction(kX86InstRepMovSB); }\r\n\r\n  //! @brief Move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsd()\r\n  { _emitInstruction(kX86InstRepMovSD); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move ECX/RCX QWORDs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsq()\r\n  { _emitInstruction(kX86InstRepMovSQ); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Move ECX/RCX WORDs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsw()\r\n  { _emitInstruction(kX86InstRepMovSW); }\r\n\r\n  //! @brief Fill ECX/RCX BYTEs at ES:[EDI/RDI] with AL.\r\n  inline void rep_stosb()\r\n  { _emitInstruction(kX86InstRepStoSB); }\r\n\r\n  //! @brief Fill ECX/RCX DWORDs at ES:[EDI/RDI] with EAX.\r\n  inline void rep_stosd()\r\n  { _emitInstruction(kX86InstRepStoSD); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Fill ECX/RCX QWORDs at ES:[EDI/RDI] with RAX.\r\n  inline void rep_stosq()\r\n  { _emitInstruction(kX86InstRepStoSQ); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Fill ECX/RCX WORDs at ES:[EDI/RDI] with AX.\r\n  inline void rep_stosw()\r\n  { _emitInstruction(kX86InstRepStoSW); }\r\n\r\n  //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsb()\r\n  { _emitInstruction(kX86InstRepECmpSB); }\r\n  \r\n  //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsd()\r\n  { _emitInstruction(kX86InstRepECmpSD); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsq()\r\n  { _emitInstruction(kX86InstRepECmpSQ); }\r\n#endif // ASMJIT_X64\r\n  \r\n  //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsw()\r\n  { _emitInstruction(kX86InstRepECmpSW); }\r\n\r\n  //! @brief Find non-AL BYTE starting at ES:[EDI/RDI].\r\n  inline void repe_scasb()\r\n  { _emitInstruction(kX86InstRepEScaSB); }\r\n  \r\n  //! @brief Find non-EAX DWORD starting at ES:[EDI/RDI].\r\n  inline void repe_scasd()\r\n  { _emitInstruction(kX86InstRepEScaSD); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Find non-RAX QWORD starting at ES:[EDI/RDI].\r\n  inline void repe_scasq()\r\n  { _emitInstruction(kX86InstRepEScaSQ); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Find non-AX WORD starting at ES:[EDI/RDI].\r\n  inline void repe_scasw()\r\n  { _emitInstruction(kX86InstRepEScaSW); }\r\n\r\n  //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repne_cmpsb()\r\n  { _emitInstruction(kX86InstRepNECmpSB); }\r\n\r\n  //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repne_cmpsd()\r\n  { _emitInstruction(kX86InstRepNECmpSD); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repne_cmpsq()\r\n  { _emitInstruction(kX86InstRepNECmpSQ); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repne_cmpsw()\r\n  { _emitInstruction(kX86InstRepNECmpSW); }\r\n\r\n  //! @brief Find AL, starting at ES:[EDI/RDI].\r\n  inline void repne_scasb()\r\n  { _emitInstruction(kX86InstRepNEScaSB); }\r\n\r\n  //! @brief Find EAX, starting at ES:[EDI/RDI].\r\n  inline void repne_scasd()\r\n  { _emitInstruction(kX86InstRepNEScaSD); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Find RAX, starting at ES:[EDI/RDI].\r\n  inline void repne_scasq()\r\n  { _emitInstruction(kX86InstRepNEScaSQ); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Find AX, starting at ES:[EDI/RDI].\r\n  inline void repne_scasw()\r\n  { _emitInstruction(kX86InstRepNEScaSW); }\r\n\r\n  //! @brief Return from Procedure.\r\n  inline void ret()\r\n  { _emitInstruction(kX86InstRet); }\r\n\r\n  //! @brief Return from Procedure.\r\n  inline void ret(const Imm& imm16)\r\n  { _emitInstruction(kX86InstRet, &imm16); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rol(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n  //! @brief Rotate Bits Left.\r\n  inline void rol(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rol(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n  //! @brief Rotate Bits Left.\r\n  inline void rol(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void ror(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n  //! @brief Rotate Bits Right.\r\n  inline void ror(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void ror(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n  //! @brief Rotate Bits Right.\r\n  inline void ror(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Store AH into Flags.\r\n  inline void sahf()\r\n  { _emitInstruction(kX86InstSahf); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sal(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n  //! @brief Shift Bits Left.\r\n  inline void sal(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sal(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n  //! @brief Shift Bits Left.\r\n  inline void sal(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sar(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n  //! @brief Shift Bits Right.\r\n  inline void sar(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sar(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n  //! @brief Shift Bits Right.\r\n  inline void sar(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n\r\n  //! @brief Set Byte on Condition.\r\n  inline void set(kX86Cond cc, const GpReg& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 1);\r\n    _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst);\r\n  }\r\n\r\n  //! @brief Set Byte on Condition.\r\n  inline void set(kX86Cond cc, const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() <= 1);\r\n    _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst);\r\n  }\r\n\r\n  //! @brief Set Byte on Condition.\r\n  inline void seta  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetA  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void seta  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetA  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setae (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetAE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setae (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetAE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setb  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetB  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setb  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetB  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setbe (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetBE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setbe (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetBE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setc  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetC  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setc  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetC  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sete  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetE  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sete  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetE  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setg  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetG  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setg  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetG  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setge (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetGE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setge (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetGE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setl  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetL  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setl  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetL  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setle (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetLE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setle (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetLE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setna (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNA , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setna (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNA , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnae(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNAE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnae(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNAE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnb (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNB , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnb (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNB , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnbe(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNBE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnbe(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNBE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnc (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNC , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnc (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNC , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setne (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setne (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setng (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNG , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setng (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNG , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnge(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNGE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnge(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNGE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnl (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNL , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnl (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNL , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnle(const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNLE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnle(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNLE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setno (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setno (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnp (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNP , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnp (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNP , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setns (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNS , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setns (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNS , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnz (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNZ , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnz (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNZ , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void seto  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetO  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void seto  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetO  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setp  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetP  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setp  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetP  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpe (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpe (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpo (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpo (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sets  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetS  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sets  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetS  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setz  (const GpReg& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetZ  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setz  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetZ  , &dst); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shl(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n  //! @brief Shift Bits Left.\r\n  inline void shl(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shl(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n  //! @brief Shift Bits Left.\r\n  inline void shl(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shr(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n  //! @brief Shift Bits Right.\r\n  inline void shr(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shr(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n  //! @brief Shift Bits Right.\r\n  inline void shr(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n\r\n  //! @brief Double Precision Shift Left.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shld(const GpReg& dst, const GpReg& src1, const GpReg& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n  //! @brief Double Precision Shift Left.\r\n  inline void shld(const GpReg& dst, const GpReg& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n  //! @brief Double Precision Shift Left.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shld(const Mem& dst, const GpReg& src1, const GpReg& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n  //! @brief Double Precision Shift Left.\r\n  inline void shld(const Mem& dst, const GpReg& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Right.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shrd(const GpReg& dst, const GpReg& src1, const GpReg& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n  //! @brief Double Precision Shift Right.\r\n  inline void shrd(const GpReg& dst, const GpReg& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n  //! @brief Double Precision Shift Right.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shrd(const Mem& dst, const GpReg& src1, const GpReg& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n  //! @brief Double Precision Shift Right.\r\n  inline void shrd(const Mem& dst, const GpReg& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n\r\n  //! @brief Set Carry Flag to 1.\r\n  inline void stc()\r\n  { _emitInstruction(kX86InstStc); }\r\n\r\n  //! @brief Set Direction Flag to 1.\r\n  inline void std()\r\n  { _emitInstruction(kX86InstStd); }\r\n\r\n  //! @brief Subtract.\r\n  inline void sub(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n  //! @brief Subtract.\r\n  inline void sub(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n  //! @brief Subtract.\r\n  inline void sub(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n  //! @brief Subtract.\r\n  inline void sub(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n  //! @brief Subtract.\r\n  inline void sub(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n\r\n  //! @brief Logical Compare.\r\n  inline void test(const GpReg& op1, const GpReg& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n  //! @brief Logical Compare.\r\n  inline void test(const GpReg& op1, const Imm& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n  //! @brief Logical Compare.\r\n  inline void test(const Mem& op1, const GpReg& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n  //! @brief Logical Compare.\r\n  inline void test(const Mem& op1, const Imm& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n\r\n  //! @brief Undefined instruction - Raise invalid opcode exception.\r\n  inline void ud2()\r\n  { _emitInstruction(kX86InstUd2); }\r\n\r\n  //! @brief Exchange and Add.\r\n  inline void xadd(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstXadd, &dst, &src); }\r\n  //! @brief Exchange and Add.\r\n  inline void xadd(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstXadd, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xchg(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstXchg, &dst, &src); }\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xchg(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstXchg, &dst, &src); }\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xchg(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXchg, &src, &dst); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const GpReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const GpReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [X87 Instructions (FPU)]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Compute 2^x - 1 (FPU).\r\n  inline void f2xm1()\r\n  { _emitInstruction(kX86InstF2XM1); }\r\n\r\n  //! @brief Absolute Value of st(0) (FPU).\r\n  inline void fabs()\r\n  { _emitInstruction(kX86InstFAbs); }\r\n\r\n  //! @brief Add @a src to @a dst and store result in @a dst (FPU).\r\n  //!\r\n  //! @note One of dst or src must be st(0).\r\n  inline void fadd(const X87Reg& dst, const X87Reg& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0);\r\n    _emitInstruction(kX86InstFAdd, &dst, &src);\r\n  }\r\n\r\n  //! @brief Add @a src to st(0) and store result in st(0) (FPU).\r\n  //!\r\n  //! @note SP-FP or DP-FP determined by @a adr size.\r\n  inline void fadd(const Mem& src)\r\n  { _emitInstruction(kX86InstFAdd, &src); }\r\n\r\n  //! @brief Add st(0) to @a dst and POP register stack (FPU).\r\n  inline void faddp(const X87Reg& dst = st(1))\r\n  { _emitInstruction(kX86InstFAddP, &dst); }\r\n\r\n  //! @brief Load Binary Coded Decimal (FPU).\r\n  inline void fbld(const Mem& src)\r\n  { _emitInstruction(kX86InstFBLd, &src); }\r\n\r\n  //! @brief Store BCD Integer and Pop (FPU).\r\n  inline void fbstp(const Mem& dst)\r\n  { _emitInstruction(kX86InstFBStP, &dst); }\r\n\r\n  //! @brief Change st(0) Sign (FPU).\r\n  inline void fchs()\r\n  { _emitInstruction(kX86InstFCHS); }\r\n\r\n  //! @brief Clear Exceptions (FPU).\r\n  //!\r\n  //! Clear floating-point exception flags after checking for pending unmasked\r\n  //! floating-point exceptions.\r\n  //!\r\n  //! Clears the floating-point exception flags (PE, UE, OE, ZE, DE, and IE),\r\n  //! the exception summary status flag (ES), the stack fault flag (SF), and\r\n  //! the busy flag (B) in the FPU status word. The FCLEX instruction checks\r\n  //! for and handles any pending unmasked floating-point exceptions before\r\n  //! clearing the exception flags.\r\n  inline void fclex()\r\n  { _emitInstruction(kX86InstFClex); }\r\n\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmovb(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovB, &src); }\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmovbe(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovBE, &src); }\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmove(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovE, &src); }\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmovnb(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovNB, &src); }\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmovnbe(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovNBE, &src); }\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmovne(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovNE, &src); }\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmovnu(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovNU, &src); }\r\n  //! @brief FP Conditional Move (FPU).\r\n  inline void fcmovu(const X87Reg& src)\r\n  { _emitInstruction(kX86InstFCMovU, &src); }\r\n\r\n  //! @brief Compare st(0) with @a reg (FPU).\r\n  inline void fcom(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFCom, &reg); }\r\n  //! @brief Compare st(0) with 4-byte or 8-byte FP at @a src (FPU).\r\n  inline void fcom(const Mem& src)\r\n  { _emitInstruction(kX86InstFCom, &src); }\r\n\r\n  //! @brief Compare st(0) with @a reg and pop the stack (FPU).\r\n  inline void fcomp(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFComP, &reg); }\r\n  //! @brief Compare st(0) with 4-byte or 8-byte FP at @a adr and pop the\r\n  //! stack (FPU).\r\n  inline void fcomp(const Mem& mem)\r\n  { _emitInstruction(kX86InstFComP, &mem); }\r\n\r\n  //! @brief Compare st(0) with st(1) and pop register stack twice (FPU).\r\n  inline void fcompp()\r\n  { _emitInstruction(kX86InstFComPP); }\r\n\r\n  //! @brief Compare st(0) and @a reg and Set EFLAGS (FPU).\r\n  inline void fcomi(const X87Reg& reg)\r\n  { _emitInstruction(kX86InstFComI, &reg); }\r\n\r\n  //! @brief Compare st(0) and @a reg and Set EFLAGS and pop the stack (FPU).\r\n  inline void fcomip(const X87Reg& reg)\r\n  { _emitInstruction(kX86InstFComIP, &reg); }\r\n\r\n  //! @brief Cosine (FPU).\r\n  //!\r\n  //! This instruction calculates the cosine of the source operand in\r\n  //! register st(0) and stores the result in st(0).\r\n  inline void fcos()\r\n  { _emitInstruction(kX86InstFCos); }\r\n\r\n  //! @brief Decrement Stack-Top Pointer (FPU).\r\n  //!\r\n  //! Subtracts one from the TOP field of the FPU status word (decrements\r\n  //! the top-ofstack pointer). If the TOP field contains a 0, it is set\r\n  //! to 7. The effect of this instruction is to rotate the stack by one\r\n  //! position. The contents of the FPU data registers and tag register\r\n  //! are not affected.\r\n  inline void fdecstp()\r\n  { _emitInstruction(kX86InstFDecStP); }\r\n\r\n  //! @brief Divide @a dst by @a src (FPU).\r\n  //!\r\n  //! @note One of @a dst or @a src register must be st(0).\r\n  inline void fdiv(const X87Reg& dst, const X87Reg& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0);\r\n    _emitInstruction(kX86InstFDiv, &dst, &src);\r\n  }\r\n  //! @brief Divide st(0) by 32-bit or 64-bit FP value (FPU).\r\n  inline void fdiv(const Mem& src)\r\n  { _emitInstruction(kX86InstFDiv, &src); }\r\n\r\n  //! @brief Divide @a reg by st(0) (FPU).\r\n  inline void fdivp(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFDivP, &reg); }\r\n\r\n  //! @brief Reverse Divide @a dst by @a src (FPU).\r\n  //!\r\n  //! @note One of @a dst or @a src register must be st(0).\r\n  inline void fdivr(const X87Reg& dst, const X87Reg& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0);\r\n    _emitInstruction(kX86InstFDivR, &dst, &src);\r\n  }\r\n  //! @brief Reverse Divide st(0) by 32-bit or 64-bit FP value (FPU).\r\n  inline void fdivr(const Mem& src)\r\n  { _emitInstruction(kX86InstFDivR, &src); }\r\n\r\n  //! @brief Reverse Divide @a reg by st(0) (FPU).\r\n  inline void fdivrp(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFDivRP, &reg); }\r\n\r\n  //! @brief Free Floating-Point Register (FPU).\r\n  //!\r\n  //! Sets the tag in the FPU tag register associated with register @a reg\r\n  //! to empty (11B). The contents of @a reg and the FPU stack-top pointer\r\n  //! (TOP) are not affected.\r\n  inline void ffree(const X87Reg& reg)\r\n  { _emitInstruction(kX86InstFFree, &reg); }\r\n\r\n  //! @brief Add 16-bit or 32-bit integer to st(0) (FPU).\r\n  inline void fiadd(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFIAdd, &src);\r\n  }\r\n\r\n  //! @brief Compare st(0) with 16-bit or 32-bit Integer (FPU).\r\n  inline void ficom(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFICom, &src);\r\n  }\r\n\r\n  //! @brief Compare st(0) with 16-bit or 32-bit Integer and pop the stack (FPU).\r\n  inline void ficomp(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFIComP, &src);\r\n  }\r\n\r\n  //! @brief Divide st(0) by 32-bit or 16-bit integer (@a src) (FPU).\r\n  inline void fidiv(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFIDiv, &src);\r\n  }\r\n\r\n  //! @brief Reverse Divide st(0) by 32-bit or 16-bit integer (@a src) (FPU).\r\n  inline void fidivr(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFIDivR, &src);\r\n  }\r\n\r\n  //! @brief Load 16-bit, 32-bit or 64-bit Integer and push it to the stack (FPU).\r\n  //!\r\n  //! Converts the signed-integer source operand into double extended-precision\r\n  //! floating point format and pushes the value onto the FPU register stack.\r\n  //! The source operand can be a word, doubleword, or quadword integer. It is\r\n  //! loaded without rounding errors. The sign of the source operand is\r\n  //! preserved.\r\n  inline void fild(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4 || src.getSize() == 8);\r\n    _emitInstruction(kX86InstFILd, &src);\r\n  }\r\n\r\n  //! @brief Multiply st(0) by 16-bit or 32-bit integer and store it\r\n  //! to st(0) (FPU).\r\n  inline void fimul(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFIMul, &src);\r\n  }\r\n\r\n  //! @brief Increment Stack-Top Pointer (FPU).\r\n  //!\r\n  //! Adds one to the TOP field of the FPU status word (increments the\r\n  //! top-of-stack pointer). If the TOP field contains a 7, it is set to 0.\r\n  //! The effect of this instruction is to rotate the stack by one position.\r\n  //! The contents of the FPU data registers and tag register are not affected.\r\n  //! This operation is not equivalent to popping the stack, because the tag\r\n  //! for the previous top-of-stack register is not marked empty.\r\n  inline void fincstp()\r\n  { _emitInstruction(kX86InstFIncStP); }\r\n\r\n  //! @brief Initialize Floating-Point Unit (FPU).\r\n  //!\r\n  //! Initialize FPU after checking for pending unmasked floating-point\r\n  //! exceptions.\r\n  inline void finit()\r\n  { _emitInstruction(kX86InstFInit); }\r\n\r\n  //! @brief Subtract 16-bit or 32-bit integer from st(0) and store result to\r\n  //! st(0) (FPU).\r\n  inline void fisub(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFISub, &src);\r\n  }\r\n\r\n  //! @brief Reverse Subtract 16-bit or 32-bit integer from st(0) and\r\n  //! store result to  st(0) (FPU).\r\n  inline void fisubr(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == 4);\r\n    _emitInstruction(kX86InstFISubR, &src);\r\n  }\r\n\r\n  //! @brief Initialize Floating-Point Unit (FPU).\r\n  //!\r\n  //! Initialize FPU without checking for pending unmasked floating-point\r\n  //! exceptions.\r\n  inline void fninit()\r\n  { _emitInstruction(kX86InstFNInit); }\r\n\r\n  //! @brief Store st(0) as 16-bit or 32-bit Integer to @a dst (FPU).\r\n  inline void fist(const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == 4);\r\n    _emitInstruction(kX86InstFISt, &dst);\r\n  }\r\n\r\n  //! @brief Store st(0) as 16-bit, 32-bit or 64-bit Integer to @a dst and pop\r\n  //! stack (FPU).\r\n  inline void fistp(const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == 4 || dst.getSize() == 8);\r\n    _emitInstruction(kX86InstFIStP, &dst);\r\n  }\r\n\r\n  //! @brief Push 32-bit, 64-bit or 80-bit Floating Point Value onto the FPU\r\n  //! register stack (FPU).\r\n  inline void fld(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8 || src.getSize() == 10);\r\n    _emitInstruction(kX86InstFLd, &src);\r\n  }\r\n\r\n  //! @brief Push @a reg onto the FPU register stack (FPU).\r\n  inline void fld(const X87Reg& reg)\r\n  { _emitInstruction(kX86InstFLd, &reg); }\r\n\r\n  //! @brief Push +1.0 onto the FPU register stack (FPU).\r\n  inline void fld1()\r\n  { _emitInstruction(kX86InstFLd1); }\r\n\r\n  //! @brief Push log2(10) onto the FPU register stack (FPU).\r\n  inline void fldl2t()\r\n  { _emitInstruction(kX86InstFLdL2T); }\r\n\r\n  //! @brief Push log2(e) onto the FPU register stack (FPU).\r\n  inline void fldl2e()\r\n  { _emitInstruction(kX86InstFLdL2E); }\r\n\r\n  //! @brief Push pi onto the FPU register stack (FPU).\r\n  inline void fldpi()\r\n  { _emitInstruction(kX86InstFLdPi); }\r\n\r\n  //! @brief Push log10(2) onto the FPU register stack (FPU).\r\n  inline void fldlg2()\r\n  { _emitInstruction(kX86InstFLdLg2); }\r\n\r\n  //! @brief Push ln(2) onto the FPU register stack (FPU).\r\n  inline void fldln2()\r\n  { _emitInstruction(kX86InstFLdLn2); }\r\n\r\n  //! @brief Push +0.0 onto the FPU register stack (FPU).\r\n  inline void fldz()\r\n  { _emitInstruction(kX86InstFLdZ); }\r\n\r\n  //! @brief Load x87 FPU Control Word (2 bytes) (FPU).\r\n  inline void fldcw(const Mem& src)\r\n  { _emitInstruction(kX86InstFLdCw, &src); }\r\n\r\n  //! @brief Load x87 FPU Environment (14 or 28 bytes) (FPU).\r\n  inline void fldenv(const Mem& src)\r\n  { _emitInstruction(kX86InstFLdEnv, &src); }\r\n\r\n  //! @brief Multiply @a dst by @a src and store result in @a dst (FPU).\r\n  //!\r\n  //! @note One of dst or src must be st(0).\r\n  inline void fmul(const X87Reg& dst, const X87Reg& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0);\r\n    _emitInstruction(kX86InstFMul, &dst, &src);\r\n  }\r\n  //! @brief Multiply st(0) by @a src and store result in st(0) (FPU).\r\n  //!\r\n  //! @note SP-FP or DP-FP determined by @a adr size.\r\n  inline void fmul(const Mem& src)\r\n  { _emitInstruction(kX86InstFMul, &src); }\r\n\r\n  //! @brief Multiply st(0) by @a dst and POP register stack (FPU).\r\n  inline void fmulp(const X87Reg& dst = st(1))\r\n  { _emitInstruction(kX86InstFMulP, &dst); }\r\n\r\n  //! @brief Clear Exceptions (FPU).\r\n  //!\r\n  //! Clear floating-point exception flags without checking for pending\r\n  //! unmasked floating-point exceptions.\r\n  //!\r\n  //! Clears the floating-point exception flags (PE, UE, OE, ZE, DE, and IE),\r\n  //! the exception summary status flag (ES), the stack fault flag (SF), and\r\n  //! the busy flag (B) in the FPU status word. The FCLEX instruction does\r\n  //! not checks for and handles any pending unmasked floating-point exceptions\r\n  //! before clearing the exception flags.\r\n  inline void fnclex()\r\n  { _emitInstruction(kX86InstFNClex); }\r\n\r\n  //! @brief No Operation (FPU).\r\n  inline void fnop()\r\n  { _emitInstruction(kX86InstFNop); }\r\n\r\n  //! @brief Save FPU State (FPU).\r\n  //!\r\n  //! Store FPU environment to m94byte or m108byte without\r\n  //! checking for pending unmasked FP exceptions.\r\n  //! Then re-initialize the FPU.\r\n  inline void fnsave(const Mem& dst)\r\n  { _emitInstruction(kX86InstFNSave, &dst); }\r\n\r\n  //! @brief Store x87 FPU Environment (FPU).\r\n  //!\r\n  //! Store FPU environment to @a dst (14 or 28 Bytes) without checking for\r\n  //! pending unmasked floating-point exceptions. Then mask all floating\r\n  //! point exceptions.\r\n  inline void fnstenv(const Mem& dst)\r\n  { _emitInstruction(kX86InstFNStEnv, &dst); }\r\n\r\n  //! @brief Store x87 FPU Control Word (FPU).\r\n  //!\r\n  //! Store FPU control word to @a dst (2 Bytes) without checking for pending\r\n  //! unmasked floating-point exceptions.\r\n  inline void fnstcw(const Mem& dst)\r\n  { _emitInstruction(kX86InstFNStCw, &dst); }\r\n\r\n  //! @brief Store x87 FPU Status Word (2 Bytes) (FPU).\r\n  inline void fnstsw(const GpReg& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.isRegCode(kX86RegAx));\r\n    _emitInstruction(kX86InstFNStSw, &dst);\r\n  }\r\n  //! @brief Store x87 FPU Status Word (2 Bytes) (FPU).\r\n  inline void fnstsw(const Mem& dst)\r\n  { _emitInstruction(kX86InstFNStSw, &dst); }\r\n\r\n  //! @brief Partial Arctangent (FPU).\r\n  //!\r\n  //! Replace st(1) with arctan(st(1)/st(0)) and pop the register stack.\r\n  inline void fpatan()\r\n  { _emitInstruction(kX86InstFPAtan); }\r\n\r\n  //! @brief Partial Remainder (FPU).\r\n  //!\r\n  //! Replace st(0) with the remainder obtained from dividing st(0) by st(1).\r\n  inline void fprem()\r\n  { _emitInstruction(kX86InstFPRem); }\r\n\r\n  //! @brief Partial Remainder (FPU).\r\n  //!\r\n  //! Replace st(0) with the IEEE remainder obtained from dividing st(0) by\r\n  //! st(1).\r\n  inline void fprem1()\r\n  { _emitInstruction(kX86InstFPRem1); }\r\n\r\n  //! @brief Partial Tangent (FPU).\r\n  //!\r\n  //! Replace st(0) with its tangent and push 1 onto the FPU stack.\r\n  inline void fptan()\r\n  { _emitInstruction(kX86InstFPTan); }\r\n\r\n  //! @brief Round to Integer (FPU).\r\n  //!\r\n  //! Rount st(0) to an Integer.\r\n  inline void frndint()\r\n  { _emitInstruction(kX86InstFRndInt); }\r\n\r\n  //! @brief Restore FPU State (FPU).\r\n  //!\r\n  //! Load FPU state from src (94 or 108 bytes).\r\n  inline void frstor(const Mem& src)\r\n  { _emitInstruction(kX86InstFRstor, &src); }\r\n\r\n  //! @brief Save FPU State (FPU).\r\n  //!\r\n  //! Store FPU state to 94 or 108-bytes after checking for\r\n  //! pending unmasked FP exceptions. Then reinitialize\r\n  //! the FPU.\r\n  inline void fsave(const Mem& dst)\r\n  { _emitInstruction(kX86InstFSave, &dst); }\r\n\r\n  //! @brief Scale (FPU).\r\n  //!\r\n  //! Scale st(0) by st(1).\r\n  inline void fscale()\r\n  { _emitInstruction(kX86InstFScale); }\r\n\r\n  //! @brief Sine (FPU).\r\n  //!\r\n  //! This instruction calculates the sine of the source operand in\r\n  //! register st(0) and stores the result in st(0).\r\n  inline void fsin()\r\n  { _emitInstruction(kX86InstFSin); }\r\n\r\n  //! @brief Sine and Cosine (FPU).\r\n  //!\r\n  //! Compute the sine and cosine of st(0); replace st(0) with\r\n  //! the sine, and push the cosine onto the register stack.\r\n  inline void fsincos()\r\n  { _emitInstruction(kX86InstFSinCos); }\r\n\r\n  //! @brief Square Root (FPU).\r\n  //!\r\n  //! Calculates square root of st(0) and stores the result in st(0).\r\n  inline void fsqrt()\r\n  { _emitInstruction(kX86InstFSqrt); }\r\n\r\n  //! @brief Store Floating Point Value (FPU).\r\n  //!\r\n  //! Store st(0) as 32-bit or 64-bit floating point value to @a dst.\r\n  inline void fst(const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 4 || dst.getSize() == 8);\r\n    _emitInstruction(kX86InstFSt, &dst);\r\n  }\r\n\r\n  //! @brief Store Floating Point Value (FPU).\r\n  //!\r\n  //! Store st(0) to @a reg.\r\n  inline void fst(const X87Reg& reg)\r\n  { _emitInstruction(kX86InstFSt, &reg); }\r\n\r\n  //! @brief Store Floating Point Value and Pop Register Stack (FPU).\r\n  //!\r\n  //! Store st(0) as 32-bit or 64-bit floating point value to @a dst\r\n  //! and pop register stack.\r\n  inline void fstp(const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 4 || dst.getSize() == 8 || dst.getSize() == 10);\r\n    _emitInstruction(kX86InstFStP, &dst);\r\n  }\r\n\r\n  //! @brief Store Floating Point Value and Pop Register Stack (FPU).\r\n  //!\r\n  //! Store st(0) to @a reg and pop register stack.\r\n  inline void fstp(const X87Reg& reg)\r\n  { _emitInstruction(kX86InstFStP, &reg); }\r\n\r\n  //! @brief Store x87 FPU Control Word (FPU).\r\n  //!\r\n  //! Store FPU control word to @a dst (2 Bytes) after checking for pending\r\n  //! unmasked floating-point exceptions.\r\n  inline void fstcw(const Mem& dst)\r\n  { _emitInstruction(kX86InstFStCw, &dst); }\r\n\r\n  //! @brief Store x87 FPU Environment (FPU).\r\n  //!\r\n  //! Store FPU environment to @a dst (14 or 28 Bytes) after checking for\r\n  //! pending unmasked floating-point exceptions. Then mask all floating\r\n  //! point exceptions.\r\n  inline void fstenv(const Mem& dst)\r\n  { _emitInstruction(kX86InstFStEnv, &dst); }\r\n\r\n  //! @brief Store x87 FPU Status Word (2 Bytes) (FPU).\r\n  inline void fstsw(const GpReg& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.isRegCode(kX86RegAx));\r\n    _emitInstruction(kX86InstFStSw, &dst);\r\n  }\r\n  //! @brief Store x87 FPU Status Word (2 Bytes) (FPU).\r\n  inline void fstsw(const Mem& dst)\r\n  { _emitInstruction(kX86InstFStSw, &dst); }\r\n\r\n  //! @brief Subtract @a src from @a dst and store result in @a dst (FPU).\r\n  //!\r\n  //! @note One of dst or src must be st(0).\r\n  inline void fsub(const X87Reg& dst, const X87Reg& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0);\r\n    _emitInstruction(kX86InstFSub, &dst, &src);\r\n  }\r\n  //! @brief Subtract @a src from st(0) and store result in st(0) (FPU).\r\n  //!\r\n  //! @note SP-FP or DP-FP determined by @a adr size.\r\n  inline void fsub(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8);\r\n    _emitInstruction(kX86InstFSub, &src);\r\n  }\r\n\r\n  //! @brief Subtract st(0) from @a dst and POP register stack (FPU).\r\n  inline void fsubp(const X87Reg& dst = st(1))\r\n  { _emitInstruction(kX86InstFSubP, &dst); }\r\n\r\n  //! @brief Reverse Subtract @a src from @a dst and store result in @a dst (FPU).\r\n  //!\r\n  //! @note One of dst or src must be st(0).\r\n  inline void fsubr(const X87Reg& dst, const X87Reg& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.getRegIndex() == 0 || src.getRegIndex() == 0);\r\n    _emitInstruction(kX86InstFSubR, &dst, &src);\r\n  }\r\n\r\n  //! @brief Reverse Subtract @a src from st(0) and store result in st(0) (FPU).\r\n  //!\r\n  //! @note SP-FP or DP-FP determined by @a adr size.\r\n  inline void fsubr(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 4 || src.getSize() == 8);\r\n    _emitInstruction(kX86InstFSubR, &src);\r\n  }\r\n\r\n  //! @brief Reverse Subtract st(0) from @a dst and POP register stack (FPU).\r\n  inline void fsubrp(const X87Reg& dst = st(1))\r\n  { _emitInstruction(kX86InstFSubRP, &dst); }\r\n\r\n  //! @brief Floating point test - Compare st(0) with 0.0. (FPU).\r\n  inline void ftst()\r\n  { _emitInstruction(kX86InstFTst); }\r\n\r\n  //! @brief Unordered Compare st(0) with @a reg (FPU).\r\n  inline void fucom(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFUCom, &reg); }\r\n\r\n  //! @brief Unordered Compare st(0) and @a reg, check for ordered values\r\n  //! and Set EFLAGS (FPU).\r\n  inline void fucomi(const X87Reg& reg)\r\n  { _emitInstruction(kX86InstFUComI, &reg); }\r\n\r\n  //! @brief UnorderedCompare st(0) and @a reg, Check for ordered values\r\n  //! and Set EFLAGS and pop the stack (FPU).\r\n  inline void fucomip(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFUComIP, &reg); }\r\n\r\n  //! @brief Unordered Compare st(0) with @a reg and pop register stack (FPU).\r\n  inline void fucomp(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFUComP, &reg); }\r\n\r\n  //! @brief Unordered compare st(0) with st(1) and pop register stack twice\r\n  //! (FPU).\r\n  inline void fucompp()\r\n  { _emitInstruction(kX86InstFUComPP); }\r\n\r\n  inline void fwait()\r\n  { _emitInstruction(kX86InstFWait); }\r\n\r\n  //! @brief Examine st(0) (FPU).\r\n  //!\r\n  //! Examines the contents of the ST(0) register and sets the condition code\r\n  //! flags C0, C2, and C3 in the FPU status word to indicate the class of\r\n  //! value or number in the register.\r\n  inline void fxam()\r\n  { _emitInstruction(kX86InstFXam); }\r\n\r\n  //! @brief Exchange Register Contents (FPU).\r\n  //!\r\n  //! Exchange content of st(0) with @a reg.\r\n  inline void fxch(const X87Reg& reg = st(1))\r\n  { _emitInstruction(kX86InstFXch, &reg); }\r\n\r\n  //! @brief Restore FP And MMX(tm) State And Streaming SIMD Extension State\r\n  //! (FPU, MMX, SSE).\r\n  //!\r\n  //! Load FP and MMX(tm) technology and Streaming SIMD Extension state from\r\n  //! src (512 bytes).\r\n  inline void fxrstor(const Mem& src)\r\n  { _emitInstruction(kX86InstFXRstor, &src); }\r\n\r\n  //! @brief Store FP and MMX(tm) State and Streaming SIMD Extension State\r\n  //! (FPU, MMX, SSE).\r\n  //!\r\n  //! Store FP and MMX(tm) technology state and Streaming SIMD Extension state\r\n  //! to dst (512 bytes).\r\n  inline void fxsave(const Mem& dst)\r\n  { _emitInstruction(kX86InstFXSave, &dst); }\r\n\r\n  //! @brief Extract Exponent and Significand (FPU).\r\n  //!\r\n  //! Separate value in st(0) into exponent and significand, store exponent\r\n  //! in st(0), and push the significand onto the register stack.\r\n  inline void fxtract()\r\n  { _emitInstruction(kX86InstFXtract); }\r\n\r\n  //! @brief Compute y * log2(x).\r\n  //!\r\n  //! Replace st(1) with (st(1) * log2st(0)) and pop the register stack.\r\n  inline void fyl2x()\r\n  { _emitInstruction(kX86InstFYL2X); }\r\n\r\n  //! @brief Compute y * log_2(x+1).\r\n  //!\r\n  //! Replace st(1) with (st(1) * (log2st(0) + 1.0)) and pop the register stack.\r\n  inline void fyl2xp1()\r\n  { _emitInstruction(kX86InstFYL2XP1); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [MMX]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Empty MMX state.\r\n  inline void emms()\r\n  { _emitInstruction(kX86InstEmms); }\r\n\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const Mem& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const GpReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const MmReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const Mem& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const GpReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const MmReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif\r\n\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packsswb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packsswb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packssdw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packssdw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n\r\n  //! @brief Pack with Unsigned Saturation (MMX).\r\n  inline void packuswb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n  //! @brief Pack with Unsigned Saturation (MMX).\r\n  inline void packuswb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n\r\n  //! @brief Packed BYTE Add (MMX).\r\n  inline void paddb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n  //! @brief Packed BYTE Add (MMX).\r\n  inline void paddb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n\r\n  //! @brief Packed WORD Add (MMX).\r\n  inline void paddw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n  //! @brief Packed WORD Add (MMX).\r\n  inline void paddw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n\r\n  //! @brief Packed DWORD Add (MMX).\r\n  inline void paddd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n  //! @brief Packed DWORD Add (MMX).\r\n  inline void paddd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n\r\n  //! @brief Logical AND (MMX).\r\n  inline void pand(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n  //! @brief Logical AND (MMX).\r\n  inline void pand(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n\r\n  //! @brief Logical AND Not (MMX).\r\n  inline void pandn(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n  //! @brief Logical AND Not (MMX).\r\n  inline void pandn(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (BYTES) (MMX).\r\n  inline void pcmpeqb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (BYTES) (MMX).\r\n  inline void pcmpeqb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (WORDS) (MMX).\r\n  inline void pcmpeqw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (WORDS) (MMX).\r\n  inline void pcmpeqw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (DWORDS) (MMX).\r\n  inline void pcmpeqd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (DWORDS) (MMX).\r\n  inline void pcmpeqd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (BYTES) (MMX).\r\n  inline void pcmpgtb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (BYTES) (MMX).\r\n  inline void pcmpgtb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (WORDS) (MMX).\r\n  inline void pcmpgtw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (WORDS) (MMX).\r\n  inline void pcmpgtw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (MMX).\r\n  inline void pcmpgtd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (MMX).\r\n  inline void pcmpgtd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High (MMX).\r\n  inline void pmulhw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n  //! @brief Packed Multiply High (MMX).\r\n  inline void pmulhw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply Low (MMX).\r\n  inline void pmullw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n  //! @brief Packed Multiply Low (MMX).\r\n  inline void pmullw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n\r\n  //! @brief Bitwise Logical OR (MMX).\r\n  inline void por(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n  //! @brief Bitwise Logical OR (MMX).\r\n  inline void por(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply and Add (MMX).\r\n  inline void pmaddwd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n  //! @brief Packed Multiply and Add (MMX).\r\n  inline void pmaddwd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void pslld(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void pslld(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void pslld(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllq(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllw(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psrad(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psrad(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psrad(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psraw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psraw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psraw(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrld(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrld(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrld(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlq(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlw(const MmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhbw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhbw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhwd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhwd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhdq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhdq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklbw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklbw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklwd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklwd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckldq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckldq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n\r\n  //! @brief Bitwise Exclusive OR (MMX).\r\n  inline void pxor(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n  //! @brief Bitwise Exclusive OR (MMX).\r\n  inline void pxor(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n\r\n  // -------------------------------------------------------------------------\r\n  // [3dNow]\r\n  // -------------------------------------------------------------------------\r\n\r\n  //! @brief Faster EMMS (3dNow!).\r\n  //!\r\n  //! @note Use only for early AMD processors where is only 3dNow! or SSE. If\r\n  //! CPU contains SSE2, it's better to use @c emms() ( @c femms() is mapped\r\n  //! to @c emms() ).\r\n  inline void femms()\r\n  { _emitInstruction(kX86InstFEmms); }\r\n\r\n  //! @brief Packed SP-FP to Integer Convert (3dNow!).\r\n  inline void pf2id(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPF2ID, &dst, &src); }\r\n  //! @brief Packed SP-FP to Integer Convert (3dNow!).\r\n  inline void pf2id(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPF2ID, &dst, &src); }\r\n\r\n  //! @brief  Packed SP-FP to Integer Word Convert (3dNow!).\r\n  inline void pf2iw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPF2IW, &dst, &src); }\r\n  //! @brief  Packed SP-FP to Integer Word Convert (3dNow!).\r\n  inline void pf2iw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPF2IW, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Accumulate (3dNow!).\r\n  inline void pfacc(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFAcc, &dst, &src); }\r\n  //! @brief Packed SP-FP Accumulate (3dNow!).\r\n  inline void pfacc(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Addition (3dNow!).\r\n  inline void pfadd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFAdd, &dst, &src); }\r\n  //! @brief Packed SP-FP Addition (3dNow!).\r\n  inline void pfadd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFAdd, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst == src (3dNow!).\r\n  inline void pfcmpeq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); }\r\n  //! @brief Packed SP-FP Compare - dst == src (3dNow!).\r\n  inline void pfcmpeq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst >= src (3dNow!).\r\n  inline void pfcmpge(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFCmpGE, &dst, &src); }\r\n  //! @brief Packed SP-FP Compare - dst >= src (3dNow!).\r\n  inline void pfcmpge(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFCmpGE, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst > src (3dNow!).\r\n  inline void pfcmpgt(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFCmpGT, &dst, &src); }\r\n  //! @brief Packed SP-FP Compare - dst > src (3dNow!).\r\n  inline void pfcmpgt(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFCmpGT, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Maximum (3dNow!).\r\n  inline void pfmax(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFMax, &dst, &src); }\r\n  //! @brief Packed SP-FP Maximum (3dNow!).\r\n  inline void pfmax(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFMax, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Minimum (3dNow!).\r\n  inline void pfmin(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFMin, &dst, &src); }\r\n  //! @brief Packed SP-FP Minimum (3dNow!).\r\n  inline void pfmin(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFMin, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Multiply (3dNow!).\r\n  inline void pfmul(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFMul, &dst, &src); }\r\n  //! @brief Packed SP-FP Multiply (3dNow!).\r\n  inline void pfmul(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFMul, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Negative Accumulate (3dNow!).\r\n  inline void pfnacc(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFNAcc, &dst, &src); }\r\n  //! @brief Packed SP-FP Negative Accumulate (3dNow!).\r\n  inline void pfnacc(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFNAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Mixed Accumulate (3dNow!).\r\n  inline void pfpnacc(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFPNAcc, &dst, &src); }\r\n  //! @brief Packed SP-FP Mixed Accumulate (3dNow!).\r\n  inline void pfpnacc(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFPNAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Approximation (3dNow!).\r\n  inline void pfrcp(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFRcp, &dst, &src); }\r\n  //! @brief Packed SP-FP Reciprocal Approximation (3dNow!).\r\n  inline void pfrcp(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRcp, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!).\r\n  inline void pfrcpit1(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); }\r\n  //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!).\r\n  inline void pfrcpit1(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!).\r\n  inline void pfrcpit2(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); }\r\n  //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!).\r\n  inline void pfrcpit2(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!).\r\n  inline void pfrsqit1(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); }\r\n  //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!).\r\n  inline void pfrsqit1(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!).\r\n  inline void pfrsqrt(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFRSqrt, &dst, &src); }\r\n  //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!).\r\n  inline void pfrsqrt(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRSqrt, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Subtract (3dNow!).\r\n  inline void pfsub(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFSub, &dst, &src); }\r\n  //! @brief Packed SP-FP Subtract (3dNow!).\r\n  inline void pfsub(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFSub, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reverse Subtract (3dNow!).\r\n  inline void pfsubr(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPFSubR, &dst, &src); }\r\n  //! @brief Packed SP-FP Reverse Subtract (3dNow!).\r\n  inline void pfsubr(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFSubR, &dst, &src); }\r\n\r\n  //! @brief Packed DWords to SP-FP (3dNow!).\r\n  inline void pi2fd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPI2FD, &dst, &src); }\r\n  //! @brief Packed DWords to SP-FP (3dNow!).\r\n  inline void pi2fd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPI2FD, &dst, &src); }\r\n\r\n  //! @brief Packed Words to SP-FP (3dNow!).\r\n  inline void pi2fw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPI2FW, &dst, &src); }\r\n  //! @brief Packed Words to SP-FP (3dNow!).\r\n  inline void pi2fw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPI2FW, &dst, &src); }\r\n\r\n  //! @brief Packed swap DWord (3dNow!)\r\n  inline void pswapd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSwapD, &dst, &src); }\r\n  //! @brief Packed swap DWord (3dNow!)\r\n  inline void pswapd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSwapD, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed SP-FP Add (SSE).\r\n  inline void addps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAddPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Add (SSE).\r\n  inline void addps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Add (SSE).\r\n  inline void addss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAddSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Add (SSE).\r\n  inline void addss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And Not For SP-FP (SSE).\r\n  inline void andnps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAndnPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical And Not For SP-FP (SSE).\r\n  inline void andnps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndnPS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And For SP-FP (SSE).\r\n  inline void andps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAndPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical And For SP-FP (SSE).\r\n  inline void andps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndPS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare (SSE).\r\n  inline void cmpps(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); }\r\n  //! @brief Packed SP-FP Compare (SSE).\r\n  inline void cmpps(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Scalar SP-FP Values (SSE).\r\n  inline void cmpss(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); }\r\n  //! @brief Compare Scalar SP-FP Values (SSE).\r\n  inline void cmpss(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE).\r\n  inline void comiss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstComISS, &dst, &src); }\r\n  //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE).\r\n  inline void comiss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstComISS, &dst, &src); }\r\n\r\n  //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE).\r\n  inline void cvtpi2ps(const XmmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); }\r\n  //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE).\r\n  inline void cvtpi2ps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (SSE).\r\n  inline void cvtps2pi(const MmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); }\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (SSE).\r\n  inline void cvtps2pi(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); }\r\n\r\n  //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE).\r\n  inline void cvtsi2ss(const XmmReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); }\r\n  //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE).\r\n  inline void cvtsi2ss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE).\r\n  inline void cvtss2si(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); }\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE).\r\n  inline void cvtss2si(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttps2pi(const MmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); }\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttps2pi(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttss2si(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); }\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttss2si(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Divide (SSE).\r\n  inline void divps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstDivPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Divide (SSE).\r\n  inline void divps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Divide (SSE).\r\n  inline void divss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstDivSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Divide (SSE).\r\n  inline void divss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivSS, &dst, &src); }\r\n\r\n  //! @brief Load Streaming SIMD Extension Control/Status (SSE).\r\n  inline void ldmxcsr(const Mem& src)\r\n  { _emitInstruction(kX86InstLdMXCSR, &src); }\r\n\r\n  //! @brief Byte Mask Write (SSE).\r\n  //!\r\n  //! @note The default memory location is specified by DS:EDI.\r\n  inline void maskmovq(const MmReg& data, const MmReg& mask)\r\n  { _emitInstruction(kX86InstMaskMovQ, &data, &mask); }\r\n\r\n  //! @brief Packed SP-FP Maximum (SSE).\r\n  inline void maxps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMaxPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Maximum (SSE).\r\n  inline void maxps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Maximum (SSE).\r\n  inline void maxss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMaxSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Maximum (SSE).\r\n  inline void maxss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxSS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Minimum (SSE).\r\n  inline void minps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMinPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Minimum (SSE).\r\n  inline void minps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Minimum (SSE).\r\n  inline void minss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMinSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Minimum (SSE).\r\n  inline void minss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinSS, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed SP-FP Values (SSE).\r\n  inline void movaps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovAPS, &dst, &src); }\r\n  //! @brief Move Aligned Packed SP-FP Values (SSE).\r\n  inline void movaps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovAPS, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed SP-FP Values (SSE).\r\n  inline void movaps(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovAPS, &dst, &src); }\r\n\r\n  //! @brief Move DWord.\r\n  inline void movd(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord.\r\n  inline void movd(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord.\r\n  inline void movd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord.\r\n  inline void movd(const XmmReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif // ASMJIT_X64\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const XmmReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Move 64 Bits Non Temporal (SSE).\r\n  inline void movntq(const Mem& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstMovNTQ, &dst, &src); }\r\n\r\n  //! @brief High to Low Packed SP-FP (SSE).\r\n  inline void movhlps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovHLPS, &dst, &src); }\r\n\r\n  //! @brief Move High Packed SP-FP (SSE).\r\n  inline void movhps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovHPS, &dst, &src); }\r\n\r\n  //! @brief Move High Packed SP-FP (SSE).\r\n  inline void movhps(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovHPS, &dst, &src); }\r\n\r\n  //! @brief Move Low to High Packed SP-FP (SSE).\r\n  inline void movlhps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovLHPS, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed SP-FP (SSE).\r\n  inline void movlps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovLPS, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed SP-FP (SSE).\r\n  inline void movlps(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovLPS, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Four Packed SP-FP Non Temporal (SSE).\r\n  inline void movntps(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovNTPS, &dst, &src); }\r\n\r\n  //! @brief Move Scalar SP-FP (SSE).\r\n  inline void movss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovSS, &dst, &src); }\r\n\r\n  //! @brief Move Scalar SP-FP (SSE).\r\n  inline void movss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSS, &dst, &src); }\r\n\r\n  //! @brief Move Scalar SP-FP (SSE).\r\n  inline void movss(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovSS, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed SP-FP Values (SSE).\r\n  inline void movups(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovUPS, &dst, &src); }\r\n  //! @brief Move Unaligned Packed SP-FP Values (SSE).\r\n  inline void movups(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovUPS, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed SP-FP Values (SSE).\r\n  inline void movups(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovUPS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Multiply (SSE).\r\n  inline void mulps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMulPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Multiply (SSE).\r\n  inline void mulps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Multiply (SSE).\r\n  inline void mulss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMulSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Multiply (SSE).\r\n  inline void mulss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulSS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical OR for SP-FP Data (SSE).\r\n  inline void orps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstOrPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical OR for SP-FP Data (SSE).\r\n  inline void orps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstOrPS, &dst, &src); }\r\n\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n\r\n  //! @brief Extract Word (SSE).\r\n  inline void pextrw(const GpReg& dst, const MmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Word (SSE).\r\n  inline void pinsrw(const MmReg& dst, const GpReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n  //! @brief Insert Word (SSE).\r\n  inline void pinsrw(const MmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Signed Integer Word Maximum (SSE).\r\n  inline void pmaxsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Maximum (SSE).\r\n  inline void pmaxsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE).\r\n  inline void pmaxub(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE).\r\n  inline void pmaxub(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n\r\n  //! @brief Packed Signed Integer Word Minimum (SSE).\r\n  inline void pminsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Minimum (SSE).\r\n  inline void pminsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE).\r\n  inline void pminub(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE).\r\n  inline void pminub(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n\r\n  //! @brief Move Byte Mask To Integer (SSE).\r\n  inline void pmovmskb(const GpReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMovMskB, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High Unsigned (SSE).\r\n  inline void pmulhuw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n  //! @brief Packed Multiply High Unsigned (SSE).\r\n  inline void pmulhuw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n\r\n  //! @brief Packed Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n  //! @brief Packed Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle word (SSE).\r\n  inline void pshufw(const MmReg& dst, const MmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); }\r\n  //! @brief Packed Shuffle word (SSE).\r\n  inline void pshufw(const MmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal (SSE).\r\n  inline void rcpps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstRcpPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Reciprocal (SSE).\r\n  inline void rcpps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstRcpPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Reciprocal (SSE).\r\n  inline void rcpss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstRcpSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Reciprocal (SSE).\r\n  inline void rcpss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstRcpSS, &dst, &src); }\r\n\r\n  //! @brief Prefetch (SSE).\r\n  inline void prefetch(const Mem& mem, const Imm& hint)\r\n  { _emitInstruction(kX86InstPrefetch, &mem, &hint); }\r\n\r\n  //! @brief Compute Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n  //! @brief Compute Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n\r\n  //! @brief Store fence (SSE).\r\n  inline void sfence()\r\n  { _emitInstruction(kX86InstSFence); }\r\n\r\n  //! @brief Shuffle SP-FP (SSE).\r\n  inline void shufps(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); }\r\n  //! @brief Shuffle SP-FP (SSE).\r\n  inline void shufps(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed SP-FP Square Root (SSE).\r\n  inline void sqrtps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Square Root (SSE).\r\n  inline void sqrtps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Square Root (SSE).\r\n  inline void sqrtss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Square Root (SSE).\r\n  inline void sqrtss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n\r\n  //! @brief Store Streaming SIMD Extension Control/Status (SSE).\r\n  inline void stmxcsr(const Mem& dst)\r\n  { _emitInstruction(kX86InstStMXCSR, &dst); }\r\n\r\n  //! @brief Packed SP-FP Subtract (SSE).\r\n  inline void subps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSubPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Subtract (SSE).\r\n  inline void subps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Subtract (SSE).\r\n  inline void subss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSubSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Subtract (SSE).\r\n  inline void subss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubSS, &dst, &src); }\r\n\r\n  //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE).\r\n  inline void ucomiss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstUComISS, &dst, &src); }\r\n  //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE).\r\n  inline void ucomiss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUComISS, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed SP-FP Data (SSE).\r\n  inline void unpckhps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstUnpckHPS, &dst, &src); }\r\n  //! @brief Unpack High Packed SP-FP Data (SSE).\r\n  inline void unpckhps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckHPS, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Packed SP-FP Data (SSE).\r\n  inline void unpcklps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstUnpckLPS, &dst, &src); }\r\n  //! @brief Unpack Low Packed SP-FP Data (SSE).\r\n  inline void unpcklps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckLPS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical Xor for SP-FP Data (SSE).\r\n  inline void xorps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstXorPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical Xor for SP-FP Data (SSE).\r\n  inline void xorps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXorPS, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE2]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed DP-FP Add (SSE2).\r\n  inline void addpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAddPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Add (SSE2).\r\n  inline void addpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Add (SSE2).\r\n  inline void addsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAddSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Add (SSE2).\r\n  inline void addsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And Not For DP-FP (SSE2).\r\n  inline void andnpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAndnPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical And Not For DP-FP (SSE2).\r\n  inline void andnpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndnPD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And For DP-FP (SSE2).\r\n  inline void andpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAndPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical And For DP-FP (SSE2).\r\n  inline void andpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndPD, &dst, &src); }\r\n\r\n  //! @brief Flush Cache Line (SSE2).\r\n  inline void clflush(const Mem& mem)\r\n  { _emitInstruction(kX86InstClFlush, &mem); }\r\n\r\n  //! @brief Packed DP-FP Compare (SSE2).\r\n  inline void cmppd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); }\r\n  //! @brief Packed DP-FP Compare (SSE2).\r\n  inline void cmppd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Scalar SP-FP Values (SSE2).\r\n  inline void cmpsd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); }\r\n  //! @brief Compare Scalar SP-FP Values (SSE2).\r\n  inline void cmpsd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void comisd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstComISD, &dst, &src); }\r\n  //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void comisd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstComISD, &dst, &src); }\r\n\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtdq2pd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); }\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtdq2pd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); }\r\n\r\n  //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2).\r\n  inline void cvtdq2ps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); }\r\n  //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2).\r\n  inline void cvtdq2ps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); }\r\n\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2dq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); }\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2dq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2pi(const MmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); }\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2pi(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); }\r\n\r\n  //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2).\r\n  inline void cvtpd2ps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); }\r\n  //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2).\r\n  inline void cvtpd2ps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); }\r\n\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtpi2pd(const XmmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); }\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtpi2pd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); }\r\n\r\n  //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtps2dq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); }\r\n  //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtps2dq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2).\r\n  inline void cvtps2pd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); }\r\n  //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2).\r\n  inline void cvtps2pd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); }\r\n\r\n  //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2).\r\n  inline void cvtsd2si(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); }\r\n  //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2).\r\n  inline void cvtsd2si(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); }\r\n\r\n  //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2).\r\n  inline void cvtsd2ss(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); }\r\n  //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2).\r\n  inline void cvtsd2ss(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); }\r\n\r\n  //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2).\r\n  inline void cvtsi2sd(const XmmReg& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); }\r\n  //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2).\r\n  inline void cvtsi2sd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); }\r\n\r\n  //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2).\r\n  inline void cvtss2sd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); }\r\n  //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2).\r\n  inline void cvtss2sd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2pi(const MmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); }\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2pi(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2dq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); }\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2dq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttps2dq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); }\r\n  //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttps2dq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2).\r\n  inline void cvttsd2si(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); }\r\n  //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2).\r\n  inline void cvttsd2si(const GpReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Divide (SSE2).\r\n  inline void divpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstDivPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Divide (SSE2).\r\n  inline void divpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Divide (SSE2).\r\n  inline void divsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstDivSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Divide (SSE2).\r\n  inline void divsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivSD, &dst, &src); }\r\n\r\n  //! @brief Load Fence (SSE2).\r\n  inline void lfence()\r\n  { _emitInstruction(kX86InstLFence); }\r\n\r\n  //! @brief Store Selected Bytes of Double Quadword (SSE2).\r\n  //!\r\n  //! @note Target is DS:EDI.\r\n  inline void maskmovdqu(const XmmReg& src, const XmmReg& mask)\r\n  { _emitInstruction(kX86InstMaskMovDQU, &src, &mask); }\r\n\r\n  //! @brief Return Maximum Packed Double-Precision FP Values (SSE2).\r\n  inline void maxpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMaxPD, &dst, &src); }\r\n  //! @brief Return Maximum Packed Double-Precision FP Values (SSE2).\r\n  inline void maxpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxPD, &dst, &src); }\r\n\r\n  //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2).\r\n  inline void maxsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMaxSD, &dst, &src); }\r\n  //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2).\r\n  inline void maxsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxSD, &dst, &src); }\r\n\r\n  //! @brief Memory Fence (SSE2).\r\n  inline void mfence()\r\n  { _emitInstruction(kX86InstMFence); }\r\n\r\n  //! @brief Return Minimum Packed DP-FP Values (SSE2).\r\n  inline void minpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMinPD, &dst, &src); }\r\n  //! @brief Return Minimum Packed DP-FP Values (SSE2).\r\n  inline void minpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinPD, &dst, &src); }\r\n\r\n  //! @brief Return Minimum Scalar DP-FP Value (SSE2).\r\n  inline void minsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMinSD, &dst, &src); }\r\n  //! @brief Return Minimum Scalar DP-FP Value (SSE2).\r\n  inline void minsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinSD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned DQWord (SSE2).\r\n  inline void movdqa(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovDQA, &dst, &src); }\r\n  //! @brief Move Aligned DQWord (SSE2).\r\n  inline void movdqa(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovDQA, &dst, &src); }\r\n\r\n  //! @brief Move Aligned DQWord (SSE2).\r\n  inline void movdqa(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovDQA, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Double Quadword (SSE2).\r\n  inline void movdqu(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovDQU, &dst, &src); }\r\n  //! @brief Move Unaligned Double Quadword (SSE2).\r\n  inline void movdqu(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovDQU, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Double Quadword (SSE2).\r\n  inline void movdqu(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovDQU, &dst, &src); }\r\n\r\n  //! @brief Extract Packed SP-FP Sign Mask (SSE2).\r\n  inline void movmskps(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovMskPS, &dst, &src); }\r\n\r\n  //! @brief Extract Packed DP-FP Sign Mask (SSE2).\r\n  inline void movmskpd(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovMskPD, &dst, &src); }\r\n\r\n  //! @brief Move Scalar Double-Precision FP Value (SSE2).\r\n  inline void movsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovSD, &dst, &src); }\r\n  //! @brief Move Scalar Double-Precision FP Value (SSE2).\r\n  inline void movsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSD, &dst, &src); }\r\n\r\n  //! @brief Move Scalar Double-Precision FP Value (SSE2).\r\n  inline void movsd(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovSD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movapd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovAPD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movapd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovAPD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movapd(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovAPD, &dst, &src); }\r\n\r\n  //! @brief Move Quadword from XMM to MMX Technology Register (SSE2).\r\n  inline void movdq2q(const MmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovDQ2Q, &dst, &src); }\r\n\r\n  //! @brief Move Quadword from MMX Technology to XMM Register (SSE2).\r\n  inline void movq2dq(const XmmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstMovQ2DQ, &dst, &src); }\r\n\r\n  //! @brief Move High Packed Double-Precision FP Value (SSE2).\r\n  inline void movhpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovHPD, &dst, &src); }\r\n\r\n  //! @brief Move High Packed Double-Precision FP Value (SSE2).\r\n  inline void movhpd(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovHPD, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed Double-Precision FP Value (SSE2).\r\n  inline void movlpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovLPD, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed Double-Precision FP Value (SSE2).\r\n  inline void movlpd(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovLPD, &dst, &src); }\r\n\r\n  //! @brief Store Double Quadword Using Non-Temporal Hint (SSE2).\r\n  inline void movntdq(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovNTDQ, &dst, &src); }\r\n\r\n  //! @brief Store Store DWORD Using Non-Temporal Hint (SSE2).\r\n  inline void movnti(const Mem& dst, const GpReg& src)\r\n  { _emitInstruction(kX86InstMovNTI, &dst, &src); }\r\n\r\n  //! @brief Store Packed Double-Precision FP Values Using Non-Temporal Hint (SSE2).\r\n  inline void movntpd(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovNTPD, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movupd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovUPD, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movupd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovUPD, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movupd(const Mem& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovUPD, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Multiply (SSE2).\r\n  inline void mulpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMulPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Multiply (SSE2).\r\n  inline void mulpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Multiply (SSE2).\r\n  inline void mulsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMulSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Multiply (SSE2).\r\n  inline void mulsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulSD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void orpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstOrPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void orpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstOrPD, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packsswb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packsswb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packssdw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packssdw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n\r\n  //! @brief Pack with Unsigned Saturation (SSE2).\r\n  inline void packuswb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n  //! @brief Pack with Unsigned Saturation (SSE2).\r\n  inline void packuswb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n\r\n  //! @brief Packed BYTE Add (SSE2).\r\n  inline void paddb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n  //! @brief Packed BYTE Add (SSE2).\r\n  inline void paddb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n\r\n  //! @brief Packed WORD Add (SSE2).\r\n  inline void paddw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n  //! @brief Packed WORD Add (SSE2).\r\n  inline void paddw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n\r\n  //! @brief Packed DWORD Add (SSE2).\r\n  inline void paddd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n  //! @brief Packed DWORD Add (SSE2).\r\n  inline void paddd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n\r\n  //! @brief Logical AND (SSE2).\r\n  inline void pand(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n  //! @brief Logical AND (SSE2).\r\n  inline void pand(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n\r\n  //! @brief Logical AND Not (SSE2).\r\n  inline void pandn(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n  //! @brief Logical AND Not (SSE2).\r\n  inline void pandn(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n\r\n  //! @brief Spin Loop Hint (SSE2).\r\n  inline void pause()\r\n  { _emitInstruction(kX86InstPause); }\r\n\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (BYTES) (SSE2).\r\n  inline void pcmpeqb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (BYTES) (SSE2).\r\n  inline void pcmpeqb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (WORDS) (SSE2).\r\n  inline void pcmpeqw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (WORDS) (SSE2).\r\n  inline void pcmpeqw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (DWORDS) (SSE2).\r\n  inline void pcmpeqd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (DWORDS) (SSE2).\r\n  inline void pcmpeqd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (BYTES) (SSE2).\r\n  inline void pcmpgtb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (BYTES) (SSE2).\r\n  inline void pcmpgtb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (WORDS) (SSE2).\r\n  inline void pcmpgtw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (WORDS) (SSE2).\r\n  inline void pcmpgtw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (SSE2).\r\n  inline void pcmpgtd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (SSE2).\r\n  inline void pcmpgtd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n\r\n  //! @brief Packed Signed Integer Word Maximum (SSE2).\r\n  inline void pmaxsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Maximum (SSE2).\r\n  inline void pmaxsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE2).\r\n  inline void pmaxub(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE2).\r\n  inline void pmaxub(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n\r\n  //! @brief Packed Signed Integer Word Minimum (SSE2).\r\n  inline void pminsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Minimum (SSE2).\r\n  inline void pminsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE2).\r\n  inline void pminub(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE2).\r\n  inline void pminub(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n\r\n  //! @brief Move Byte Mask (SSE2).\r\n  inline void pmovmskb(const GpReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovMskB, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High (SSE2).\r\n  inline void pmulhw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n  //! @brief Packed Multiply High (SSE2).\r\n  inline void pmulhw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High Unsigned (SSE2).\r\n  inline void pmulhuw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n  //! @brief Packed Multiply High Unsigned (SSE2).\r\n  inline void pmulhuw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply Low (SSE2).\r\n  inline void pmullw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n  //! @brief Packed Multiply Low (SSE2).\r\n  inline void pmullw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n\r\n  //! @brief Bitwise Logical OR (SSE2).\r\n  inline void por(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n  //! @brief Bitwise Logical OR (SSE2).\r\n  inline void por(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslld(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslld(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslld(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllq(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllw(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslldq(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psrad(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psrad(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psrad(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psraw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psraw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psraw(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply and Add (SSE2).\r\n  inline void pmaddwd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n  //! @brief Packed Multiply and Add (SSE2).\r\n  inline void pmaddwd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n\r\n  //! @brief Shuffle Packed DWORDs (SSE2).\r\n  inline void pshufd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); }\r\n  //! @brief Shuffle Packed DWORDs (SSE2).\r\n  inline void pshufd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Shuffle Packed High Words (SSE2).\r\n  inline void pshufhw(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); }\r\n  //! @brief Shuffle Packed High Words (SSE2).\r\n  inline void pshufhw(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Shuffle Packed Low Words (SSE2).\r\n  inline void pshuflw(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); }\r\n  //! @brief Shuffle Packed Low Words (SSE2).\r\n  inline void pshuflw(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrld(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrld(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrld(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlq(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n\r\n  //! @brief DQWord Shift Right Logical (MMX).\r\n  inline void psrldq(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlw(const XmmReg& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhbw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhbw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhwd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhwd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhdq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhdq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhqdq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhqdq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklbw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklbw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklwd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklwd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpckldq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpckldq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklqdq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklqdq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); }\r\n\r\n  //! @brief Bitwise Exclusive OR (SSE2).\r\n  inline void pxor(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n  //! @brief Bitwise Exclusive OR (SSE2).\r\n  inline void pxor(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n\r\n  //! @brief Shuffle DP-FP (SSE2).\r\n  inline void shufpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); }\r\n  //! @brief Shuffle DP-FP (SSE2).\r\n  inline void shufpd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compute Square Roots of Packed DP-FP Values (SSE2).\r\n  inline void sqrtpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSqrtPD, &dst, &src); }\r\n  //! @brief Compute Square Roots of Packed DP-FP Values (SSE2).\r\n  inline void sqrtpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtPD, &dst, &src); }\r\n\r\n  //! @brief Compute Square Root of Scalar DP-FP Value (SSE2).\r\n  inline void sqrtsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSqrtSD, &dst, &src); }\r\n  //! @brief Compute Square Root of Scalar DP-FP Value (SSE2).\r\n  inline void sqrtsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtSD, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Subtract (SSE2).\r\n  inline void subpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSubPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Subtract (SSE2).\r\n  inline void subpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Subtract (SSE2).\r\n  inline void subsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstSubSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Subtract (SSE2).\r\n  inline void subsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubSD, &dst, &src); }\r\n\r\n  //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void ucomisd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstUComISD, &dst, &src); }\r\n  //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void ucomisd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUComISD, &dst, &src); }\r\n\r\n  //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2).\r\n  inline void unpckhpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstUnpckHPD, &dst, &src); }\r\n  //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2).\r\n  inline void unpckhpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckHPD, &dst, &src); }\r\n\r\n  //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2).\r\n  inline void unpcklpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstUnpckLPD, &dst, &src); }\r\n  //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2).\r\n  inline void unpcklpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckLPD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void xorpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstXorPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void xorpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXorPD, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE3]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed DP-FP Add/Subtract (SSE3).\r\n  inline void addsubpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAddSubPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Add/Subtract (SSE3).\r\n  inline void addsubpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSubPD, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Add/Subtract (SSE3).\r\n  inline void addsubps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstAddSubPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Add/Subtract (SSE3).\r\n  inline void addsubps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSubPS, &dst, &src); }\r\n\r\n  //! @brief Store Integer with Truncation (SSE3).\r\n  inline void fisttp(const Mem& dst)\r\n  { _emitInstruction(kX86InstFISttP, &dst); }\r\n\r\n  //! @brief Packed DP-FP Horizontal Add (SSE3).\r\n  inline void haddpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstHAddPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Horizontal Add (SSE3).\r\n  inline void haddpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHAddPD, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Horizontal Add (SSE3).\r\n  inline void haddps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstHAddPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Horizontal Add (SSE3).\r\n  inline void haddps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHAddPS, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstHSubPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHSubPD, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstHSubPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHSubPS, &dst, &src); }\r\n\r\n  //! @brief Load Unaligned Integer 128 Bits (SSE3).\r\n  inline void lddqu(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstLdDQU, &dst, &src); }\r\n\r\n  //! @brief Set Up Monitor Address (SSE3).\r\n  inline void monitor()\r\n  { _emitInstruction(kX86InstMonitor); }\r\n\r\n  //! @brief Move One DP-FP and Duplicate (SSE3).\r\n  inline void movddup(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovDDup, &dst, &src); }\r\n  //! @brief Move One DP-FP and Duplicate (SSE3).\r\n  inline void movddup(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovDDup, &dst, &src); }\r\n\r\n  //! @brief Move Packed SP-FP High and Duplicate (SSE3).\r\n  inline void movshdup(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovSHDup, &dst, &src); }\r\n  //! @brief Move Packed SP-FP High and Duplicate (SSE3).\r\n  inline void movshdup(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSHDup, &dst, &src); }\r\n\r\n  //! @brief Move Packed SP-FP Low and Duplicate (SSE3).\r\n  inline void movsldup(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstMovSLDup, &dst, &src); }\r\n  //! @brief Move Packed SP-FP Low and Duplicate (SSE3).\r\n  inline void movsldup(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSLDup, &dst, &src); }\r\n\r\n  //! @brief Monitor Wait (SSE3).\r\n  inline void mwait()\r\n  { _emitInstruction(kX86InstMWait); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSSE3]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const MmReg& dst, const MmReg& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const MmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const MmReg& dst, const MmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const MmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE4.1]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); }\r\n  //! @brief Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendpd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendps(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); }\r\n  //! @brief Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendps(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Variable Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendvpd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstBlendVPD, &dst, &src); }\r\n  //! @brief Variable Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendvpd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstBlendVPD, &dst, &src); }\r\n\r\n  //! @brief Variable Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendvps(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstBlendVPS, &dst, &src); }\r\n  //! @brief Variable Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendvps(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstBlendVPS, &dst, &src); }\r\n\r\n  //! @brief Dot Product of Packed DP-FP Values (SSE4.1).\r\n  inline void dppd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); }\r\n  //! @brief Dot Product of Packed DP-FP Values (SSE4.1).\r\n  inline void dppd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Dot Product of Packed SP-FP Values (SSE4.1).\r\n  inline void dpps(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); }\r\n  //! @brief Dot Product of Packed SP-FP Values (SSE4.1).\r\n  inline void dpps(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Extract Packed SP-FP Value (SSE4.1).\r\n  inline void extractps(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); }\r\n  //! @brief Extract Packed SP-FP Value (SSE4.1).\r\n  inline void extractps(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Load Double Quadword Non-Temporal Aligned Hint (SSE4.1).\r\n  inline void movntdqa(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovNTDQA, &dst, &src); }\r\n\r\n  //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1).\r\n  inline void mpsadbw(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); }\r\n  //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1).\r\n  inline void mpsadbw(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Pack with Unsigned Saturation (SSE4.1).\r\n  inline void packusdw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPackUSDW, &dst, &src); }\r\n  //! @brief Pack with Unsigned Saturation (SSE4.1).\r\n  inline void packusdw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackUSDW, &dst, &src); }\r\n\r\n  //! @brief Variable Blend Packed Bytes (SSE4.1).\r\n  inline void pblendvb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPBlendVB, &dst, &src); }\r\n  //! @brief Variable Blend Packed Bytes (SSE4.1).\r\n  inline void pblendvb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPBlendVB, &dst, &src); }\r\n\r\n  //! @brief Blend Packed Words (SSE4.1).\r\n  inline void pblendw(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); }\r\n  //! @brief Blend Packed Words (SSE4.1).\r\n  inline void pblendw(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Packed Qword Data for Equal (SSE4.1).\r\n  inline void pcmpeqq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); }\r\n  //! @brief Compare Packed Qword Data for Equal (SSE4.1).\r\n  inline void pcmpeqq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); }\r\n\r\n  //! @brief Extract Byte (SSE4.1).\r\n  inline void pextrb(const GpReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); }\r\n  //! @brief Extract Byte (SSE4.1).\r\n  inline void pextrb(const Mem& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); }\r\n\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrd(const GpReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); }\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrd(const Mem& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrq(const GpReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); }\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrq(const Mem& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); }\r\n\r\n  //! @brief Extract Word (SSE4.1).\r\n  inline void pextrw(const GpReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); }\r\n  //! @brief Extract Word (SSE4.1).\r\n  inline void pextrw(const Mem& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Horizontal Word Minimum (SSE4.1).\r\n  inline void phminposuw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); }\r\n  //! @brief Packed Horizontal Word Minimum (SSE4.1).\r\n  inline void phminposuw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); }\r\n\r\n  //! @brief Insert Byte (SSE4.1).\r\n  inline void pinsrb(const XmmReg& dst, const GpReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); }\r\n  //! @brief Insert Byte (SSE4.1).\r\n  inline void pinsrb(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrd(const XmmReg& dst, const GpReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); }\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrq(const XmmReg& dst, const GpReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); }\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrq(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Word (SSE2).\r\n  inline void pinsrw(const XmmReg& dst, const GpReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n  //! @brief Insert Word (SSE2).\r\n  inline void pinsrw(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Maximum of Packed Word Integers (SSE4.1).\r\n  inline void pmaxuw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMaxUW, &dst, &src); }\r\n  //! @brief Maximum of Packed Word Integers (SSE4.1).\r\n  inline void pmaxuw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUW, &dst, &src); }\r\n\r\n  //! @brief Maximum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pmaxsb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMaxSB, &dst, &src); }\r\n  //! @brief Maximum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pmaxsb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSB, &dst, &src); }\r\n\r\n  //! @brief Maximum of Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmaxsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMaxSD, &dst, &src); }\r\n  //! @brief Maximum of Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmaxsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSD, &dst, &src); }\r\n\r\n  //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1).\r\n  inline void pmaxud(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMaxUD, &dst, &src); }\r\n  //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1).\r\n  inline void pmaxud(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUD, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pminsb(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMinSB, &dst, &src); }\r\n  //! @brief Minimum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pminsb(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSB, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Word Integers (SSE4.1).\r\n  inline void pminuw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMinUW, &dst, &src); }\r\n  //! @brief Minimum of Packed Word Integers (SSE4.1).\r\n  inline void pminuw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUW, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminud(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMinUD, &dst, &src); }\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminud(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUD, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminsd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMinSD, &dst, &src); }\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminsd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSD, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovSXBW, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXBW, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovSXBD, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXBD, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxwd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovSXWD, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxwd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXWD, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxwq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxwq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxdq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxdq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbw(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovZXBW, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbw(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXBW, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovZXBD, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXBD, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxwd(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovZXWD, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxwd(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXWD, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxwq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxwq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxdq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxdq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); }\r\n\r\n  //! @brief Multiply Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmuldq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMulDQ, &dst, &src); }\r\n  //! @brief Multiply Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmuldq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulDQ, &dst, &src); }\r\n\r\n  //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1).\r\n  inline void pmulld(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPMulLD, &dst, &src); }\r\n  //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1).\r\n  inline void pmulld(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulLD, &dst, &src); }\r\n\r\n  //! @brief Logical Compare (SSE4.1).\r\n  inline void ptest(const XmmReg& op1, const XmmReg& op2)\r\n  { _emitInstruction(kX86InstPTest, &op1, &op2); }\r\n  //! @brief Logical Compare (SSE4.1).\r\n  inline void ptest(const XmmReg& op1, const Mem& op2)\r\n  { _emitInstruction(kX86InstPTest, &op1, &op2); }\r\n\r\n  //! Round Packed SP-FP Values @brief (SSE4.1).\r\n  inline void roundps(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); }\r\n  //! Round Packed SP-FP Values @brief (SSE4.1).\r\n  inline void roundps(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Round Scalar SP-FP Values (SSE4.1).\r\n  inline void roundss(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); }\r\n  //! @brief Round Scalar SP-FP Values (SSE4.1).\r\n  inline void roundss(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Round Packed DP-FP Values (SSE4.1).\r\n  inline void roundpd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); }\r\n  //! @brief Round Packed DP-FP Values (SSE4.1).\r\n  inline void roundpd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Round Scalar DP-FP Values (SSE4.1).\r\n  inline void roundsd(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); }\r\n  //! @brief Round Scalar DP-FP Values (SSE4.1).\r\n  inline void roundsd(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE4.2]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2).\r\n  inline void crc32(const GpReg& dst, const GpReg& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq));\r\n    _emitInstruction(kX86InstCrc32, &dst, &src);\r\n  }\r\n  //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2).\r\n  inline void crc32(const GpReg& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(dst.isRegType(kX86RegTypeGpd) || dst.isRegType(kX86RegTypeGpq));\r\n    _emitInstruction(kX86InstCrc32, &dst, &src);\r\n  }\r\n\r\n  //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpestri(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpestri(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpestrm(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpestrm(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpistri(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpistri(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpistrm(const XmmReg& dst, const XmmReg& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpistrm(const XmmReg& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Packed Data for Greater Than (SSE4.2).\r\n  inline void pcmpgtq(const XmmReg& dst, const XmmReg& src)\r\n  { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); }\r\n  //! @brief Compare Packed Data for Greater Than (SSE4.2).\r\n  inline void pcmpgtq(const XmmReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); }\r\n\r\n  //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2).\r\n  inline void popcnt(const GpReg& dst, const GpReg& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    ASMJIT_ASSERT(src.getRegType() == dst.getRegType());\r\n    _emitInstruction(kX86InstPopCnt, &dst, &src);\r\n  }\r\n  //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2).\r\n  inline void popcnt(const GpReg& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstPopCnt, &dst, &src);\r\n  }\r\n\r\n  // -------------------------------------------------------------------------\r\n  // [AMD only]\r\n  // -------------------------------------------------------------------------\r\n\r\n  //! @brief Prefetch (3dNow - Amd).\r\n  //!\r\n  //! Loads the entire 64-byte aligned memory sequence containing the\r\n  //! specified memory address into the L1 data cache. The position of\r\n  //! the specified memory address within the 64-byte cache line is\r\n  //! irrelevant. If a cache hit occurs, or if a memory fault is detected,\r\n  //! no bus cycle is initiated and the instruction is treated as a NOP.\r\n  inline void amd_prefetch(const Mem& mem)\r\n  { _emitInstruction(kX86InstAmdPrefetch, &mem); }\r\n\r\n  //! @brief Prefetch and set cache to modified (3dNow - Amd).\r\n  //!\r\n  //! The PREFETCHW instruction loads the prefetched line and sets the\r\n  //! cache-line state to Modified, in anticipation of subsequent data\r\n  //! writes to the line. The PREFETCH instruction, by contrast, typically\r\n  //! sets the cache-line state to Exclusive (depending on the hardware\r\n  //! implementation).\r\n  inline void amd_prefetchw(const Mem& mem)\r\n  { _emitInstruction(kX86InstAmdPrefetchW, &mem); }\r\n\r\n  // -------------------------------------------------------------------------\r\n  // [Intel only]\r\n  // -------------------------------------------------------------------------\r\n\r\n  //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom).\r\n  inline void movbe(const GpReg& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstMovBE, &dst, &src);\r\n  }\r\n\r\n  //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom).\r\n  inline void movbe(const Mem& dst, const GpReg& src)\r\n  {\r\n    ASMJIT_ASSERT(!src.isGpb());\r\n    _emitInstruction(kX86InstMovBE, &dst, &src);\r\n  }\r\n\r\n  // -------------------------------------------------------------------------\r\n  // [Emit Options]\r\n  // -------------------------------------------------------------------------\r\n\r\n  //! @brief Assert LOCK# Signal Prefix.\r\n  //!\r\n  //! This instruction causes the processor's LOCK# signal to be asserted\r\n  //! during execution of the accompanying instruction (turns the\r\n  //! instruction into an atomic instruction). In a multiprocessor environment,\r\n  //! the LOCK# signal insures that the processor has exclusive use of any shared\r\n  //! memory while the signal is asserted.\r\n  //!\r\n  //! The LOCK prefix can be prepended only to the following instructions and\r\n  //! to those forms of the instructions that use a memory operand: ADD, ADC,\r\n  //! AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD,\r\n  //! and XCHG. An undefined opcode exception will be generated if the LOCK\r\n  //! prefix is used with any other instruction. The XCHG instruction always\r\n  //! asserts the LOCK# signal regardless of the presence or absence of the LOCK\r\n  //! prefix.\r\n  //!\r\n  //! @sa @c kX86EmitOptionLock.\r\n  inline void lock()\r\n  { _emitOptions |= kX86EmitOptionLock; }\r\n\r\n  //! @brief Force REX prefix to be emitted.\r\n  //!\r\n  //! This option should be used carefully, because there are unencodable\r\n  //! combinations. If you want to access ah, bh, ch or dh registers then you\r\n  //! can't emit REX prefix and it will cause an illegal instruction error.\r\n  //!\r\n  //! @note REX prefix is only valid for X64/AMD64 platform.\r\n  //!\r\n  //! @sa @c kX86EmitOptionRex.\r\n  inline void rex()\r\n  { _emitOptions |= kX86EmitOptionRex; }\r\n};\r\n\r\n//! @}\r\n\r\n} // AsmJit namespace\r\n\r\n// [Api-End]\r\n#include \"../core/apiend.h\"\r\n\r\n// [Guard]\r\n#endif // _ASMJIT_X86_X86ASSEMBLER_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compiler.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/intutil.h\"\n#include \"../core/stringutil.h\"\n\n#include \"../x86/x86assembler.h\"\n#include \"../x86/x86compiler.h\"\n#include \"../x86/x86compilercontext.h\"\n#include \"../x86/x86compilerfunc.h\"\n#include \"../x86/x86compileritem.h\"\n#include \"../x86/x86util.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerUtil]\n// ============================================================================\n\nbool CompilerUtil::isStack16ByteAligned()\n{\n  // Stack is always aligned to 16-bytes when using 64-bit OS.\n  bool result = (sizeof(uintptr_t) == 8);\n\n  // Modern Linux, APPLE and UNIX guarantees stack alignment to 16 bytes by\n  // default. I'm really not sure about all UNIX operating systems, because\n  // 16-byte alignment is an addition to an older specification.\n#if (defined(__linux__)   || \\\n     defined(__linux)     || \\\n     defined(linux)       || \\\n     defined(__unix__)    || \\\n     defined(__FreeBSD__) || \\\n     defined(__NetBSD__)  || \\\n     defined(__OpenBSD__) || \\\n     defined(__DARWIN__)  || \\\n     defined(__APPLE__)   )\n  result = true;\n#endif // __linux__\n\n  return result;\n}\n\n// ============================================================================\n// [AsmJit::X86Compiler - Construction / Destruction]\n// ============================================================================\n\nX86Compiler::X86Compiler(Context* context) : \n  Compiler(context)\n{\n  _properties |= IntUtil::maskFromIndex(kX86PropertyOptimizedAlign);\n}\n\nX86Compiler::~X86Compiler()\n{\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Function Builder]\n// ============================================================================\n\nX86CompilerFuncDecl* X86Compiler::newFunc_(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount)\n{\n  ASMJIT_ASSERT(_func == NULL);\n\n  X86CompilerFuncDecl* func = Compiler_newItem<X86CompilerFuncDecl>(this);\n\n  _func = func;\n  _varNameId = 0;\n\n  func->setPrototype(convention, returnType, arguments, argumentsCount);\n  addItem(func);\n\n  bind(func->_entryLabel);\n  func->_createVariables();\n\n  return func;\n}\n\nX86CompilerFuncDecl* X86Compiler::endFunc()\n{\n  X86CompilerFuncDecl* func = getFunc();\n  ASMJIT_ASSERT(func != NULL);\n\n  bind(func->_exitLabel);\n  addItem(func->_end);\n\n  func->setFuncFlag(kFuncFlagIsFinished);\n  _func = NULL;\n\n  return func;\n}\n\n// ============================================================================\n// [AsmJit::Compiler - EmitInstruction]\n// ============================================================================\n\nstatic inline X86CompilerInst* X86Compiler_newInstruction(X86Compiler* self, uint32_t code, Operand* opData, uint32_t opCount)\n{\n  if (code >= _kX86InstJBegin && code <= _kX86InstJEnd)\n  {\n    void* p = self->_zoneMemory.alloc(sizeof(X86CompilerJmpInst));\n    return new(p) X86CompilerJmpInst(self, code, opData, opCount);\n  }\n  else\n  {\n    void* p = self->_zoneMemory.alloc(sizeof(X86CompilerInst) + opCount * sizeof(Operand));\n    return new(p) X86CompilerInst(self, code, opData, opCount);\n  }\n}\n\nvoid X86Compiler::_emitInstruction(uint32_t code)\n{\n  X86CompilerInst* inst = X86Compiler_newInstruction(this, code, NULL, 0);\n\n  if (inst == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  addItem(inst);\n\n  if (_cc != NULL)\n  {\n    inst->_offset = _cc->_currentOffset;\n    inst->prepare(*_cc);\n  }\n}\n\nvoid X86Compiler::_emitInstruction(uint32_t code, const Operand* o0)\n{\n  Operand* operands = reinterpret_cast<Operand*>(_zoneMemory.alloc(1 * sizeof(Operand)));\n\n  if (operands == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  operands[0] = *o0;\n  X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 1);\n\n  if (inst == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  addItem(inst);\n\n  if (_cc != NULL)\n  {\n    inst->_offset = _cc->_currentOffset;\n    inst->prepare(*_cc);\n  }\n}\n\nvoid X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1)\n{\n  Operand* operands = reinterpret_cast<Operand*>(_zoneMemory.alloc(2 * sizeof(Operand)));\n\n  if (operands == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  operands[0] = *o0;\n  operands[1] = *o1;\n  X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 2);\n\n  if (inst == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  addItem(inst);\n\n  if (_cc)\n  {\n    inst->_offset = _cc->_currentOffset;\n    inst->prepare(*_cc);\n  }\n}\n\nvoid X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2)\n{\n  Operand* operands = reinterpret_cast<Operand*>(_zoneMemory.alloc(3 * sizeof(Operand)));\n\n  if (operands == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  operands[0] = *o0;\n  operands[1] = *o1;\n  operands[2] = *o2;\n  X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 3);\n\n  if (inst == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  addItem(inst);\n\n  if (_cc != NULL)\n  {\n    inst->_offset = _cc->_currentOffset;\n    inst->prepare(*_cc);\n  }\n}\n\nvoid X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3)\n{\n  Operand* operands = reinterpret_cast<Operand*>(_zoneMemory.alloc(4 * sizeof(Operand)));\n\n  if (operands == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  operands[0] = *o0;\n  operands[1] = *o1;\n  operands[2] = *o2;\n  operands[3] = *o3;\n  X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 4);\n\n  if (inst == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  addItem(inst);\n\n  if (_cc != NULL)\n  {\n    inst->_offset = _cc->_currentOffset;\n    inst->prepare(*_cc);\n  }\n}\n\nvoid X86Compiler::_emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3, const Operand* o4)\n{\n  Operand* operands = reinterpret_cast<Operand*>(_zoneMemory.alloc(5 * sizeof(Operand)));\n\n  if (operands == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  operands[0] = *o0;\n  operands[1] = *o1;\n  operands[2] = *o2;\n  operands[3] = *o3;\n  operands[4] = *o4;\n  X86CompilerInst* inst = X86Compiler_newInstruction(this, code, operands, 5);\n\n  if (inst == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  addItem(inst);\n\n  if (_cc != NULL)\n  {\n    inst->_offset = _cc->_currentOffset;\n    inst->prepare(*_cc);\n  }\n}\n\nvoid X86Compiler::_emitJcc(uint32_t code, const Label* label, uint32_t hint)\n{\n  if (hint == kCondHintNone)\n  {\n    _emitInstruction(code, label);\n  }\n  else\n  {\n    Imm imm(hint);\n    _emitInstruction(code, label, &imm);\n  }\n}\n\nX86CompilerFuncCall* X86Compiler::_emitCall(const Operand* o0)\n{\n  X86CompilerFuncDecl* func = getFunc();\n\n  if (func == NULL)\n  {\n    setError(kErrorNoFunction);\n    return NULL;\n  }\n\n  X86CompilerFuncCall* call = Compiler_newItem<X86CompilerFuncCall>(this, func, o0);\n  if (call == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return NULL;\n  }\n\n  addItem(call);\n  return call;\n}\n\nvoid X86Compiler::_emitReturn(const Operand* first, const Operand* second)\n{\n  X86CompilerFuncDecl* func = getFunc();\n\n  if (func == NULL)\n  {\n    setError(kErrorNoFunction);\n    return;\n  }\n\n  X86CompilerFuncRet* ret = Compiler_newItem<X86CompilerFuncRet>(this, func, first, second);\n\n  if (ret == NULL)\n  {\n    setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  addItem(ret);\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Align]\n// ============================================================================\n\nvoid X86Compiler::align(uint32_t m)\n{\n  addItem(Compiler_newItem<X86CompilerAlign>(this, m));\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Label]\n// ============================================================================\n\nLabel X86Compiler::newLabel()\n{\n  Label label;\n  label._base.id = static_cast<uint32_t>(_targets.getLength()) | kOperandIdTypeLabel;\n\n  CompilerTarget* target = Compiler_newItem<X86CompilerTarget>(this, label);\n  _targets.append(target);\n\n  return label;\n}\n\nvoid X86Compiler::bind(const Label& label)\n{\n  uint32_t id = label.getId() & kOperandIdValueMask;\n\n  ASMJIT_ASSERT(id != kInvalidValue);\n  ASMJIT_ASSERT(id < _targets.getLength());\n\n  addItem(_targets[id]);\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Variables]\n// ============================================================================\n\nX86CompilerVar* X86Compiler::_newVar(const char* name, uint32_t type, uint32_t size)\n{\n  X86CompilerVar* var = reinterpret_cast<X86CompilerVar*>(_zoneMemory.alloc(sizeof(X86CompilerVar)));\n  if (var == NULL) return NULL;\n\n  char nameBuffer[32];\n  if (name == NULL)\n  {\n    sprintf(nameBuffer, \"var_%d\", _varNameId);\n    name = nameBuffer;\n    _varNameId++;\n  }\n\n  var->_name = _zoneMemory.sdup(name);\n  var->_id = static_cast<uint32_t>(_vars.getLength()) | kOperandIdTypeVar;\n\n  var->_type = static_cast<uint8_t>(type);\n  var->_class = x86VarInfo[type].getClass();\n  var->_priority = 10;\n\n  var->_isRegArgument = false;\n  var->_isMemArgument = false;\n  var->_isCalculated = false;\n  var->_unused = 0;\n\n  var->_size = size;\n\n  var->firstItem = NULL;\n  var->lastItem = NULL;\n  var->funcScope = getFunc();\n  var->funcCall = NULL;\n\n  var->homeRegisterIndex = kRegIndexInvalid;\n  var->prefRegisterMask = 0;\n\n  var->homeMemoryOffset = 0;\n  var->homeMemoryData = NULL;\n\n  var->regIndex = kRegIndexInvalid;\n  var->workOffset = kInvalidValue;\n\n  var->nextActive = NULL;\n  var->prevActive = NULL;\n\n  var->state = kVarStateUnused;\n  var->changed = false;\n  var->saveOnUnuse = false;\n\n  var->regReadCount = 0;\n  var->regWriteCount = 0;\n  var->regRwCount = 0;\n\n  var->regGpbLoCount = 0;\n  var->regGpbHiCount = 0;\n\n  var->memReadCount = 0;\n  var->memWriteCount = 0;\n  var->memRwCount = 0;\n\n  var->tPtr = NULL;\n\n  _vars.append(var);\n  return var;\n}\n\nGpVar X86Compiler::newGpVar(uint32_t varType, const char* name)\n{\n  ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassGp) != 0);\n\n#if defined(ASMJIT_X86)\n  if (x86VarInfo[varType].getSize() > 4)\n  {\n    varType = kX86VarTypeGpd;\n    if (_logger)\n      _logger->logString(\"*** COMPILER WARNING: QWORD variable translated to DWORD, FIX YOUR CODE! ***\\n\");\n  }\n#endif // ASMJIT_X86\n\n  X86CompilerVar* var = _newVar(name, varType, x86VarInfo[varType].getSize());\n  return var->asGpVar();\n}\n\nGpVar X86Compiler::getGpArg(uint32_t argIndex)\n{\n  X86CompilerFuncDecl* func = getFunc();\n  GpVar var;\n\n  if (func != NULL)\n  {\n    X86FuncDecl* decl = func->getDecl();\n\n    if (argIndex < decl->getArgumentsCount())\n    {\n      X86CompilerVar* cv = func->getVar(argIndex);\n\n      var._var.id = cv->getId();\n      var._var.size = cv->getSize();\n      var._var.regCode = x86VarInfo[cv->getType()].getCode();\n      var._var.varType = cv->getType();\n    }\n  }\n\n  return var;\n}\n\nMmVar X86Compiler::newMmVar(uint32_t varType, const char* name)\n{\n  ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassMm) != 0);\n\n  X86CompilerVar* var = _newVar(name, varType, 8);\n  return var->asMmVar();\n}\n\nMmVar X86Compiler::getMmArg(uint32_t argIndex)\n{\n  X86CompilerFuncDecl* func = getFunc();\n  MmVar var;\n\n  if (func != NULL)\n  {\n    const X86FuncDecl* decl = func->getDecl();\n\n    if (argIndex < decl->getArgumentsCount())\n    {\n      X86CompilerVar* cv = func->getVar(argIndex);\n\n      var._var.id = cv->getId();\n      var._var.size = cv->getSize();\n      var._var.regCode = x86VarInfo[cv->getType()].getCode();\n      var._var.varType = cv->getType();\n    }\n  }\n\n  return var;\n}\n\nXmmVar X86Compiler::newXmmVar(uint32_t varType, const char* name)\n{\n  ASMJIT_ASSERT((varType < kX86VarTypeCount) && (x86VarInfo[varType].getClass() & kX86VarClassXmm) != 0);\n\n  X86CompilerVar* var = _newVar(name, varType, 16);\n  return var->asXmmVar();\n}\n\nXmmVar X86Compiler::getXmmArg(uint32_t argIndex)\n{\n  X86CompilerFuncDecl* func = getFunc();\n  XmmVar var;\n\n  if (func != NULL)\n  {\n    const X86FuncDecl* decl = func->getDecl();\n\n    if (argIndex < decl->getArgumentsCount())\n    {\n      X86CompilerVar* cv = func->getVar(argIndex);\n\n      var._var.id = cv->getId();\n      var._var.size = cv->getSize();\n      var._var.regCode = x86VarInfo[cv->getType()].getCode();\n      var._var.varType = cv->getType();\n    }\n  }\n\n  return var;\n}\n\nvoid X86Compiler::_vhint(Var& var, uint32_t hintId, uint32_t hintValue)\n{\n  if (var.getId() == kInvalidValue)\n    return;\n\n  X86CompilerVar* cv = _getVar(var.getId());\n  ASMJIT_ASSERT(cv != NULL);\n\n  X86CompilerHint* item = Compiler_newItem<X86CompilerHint>(this, cv, hintId, hintValue);\n  addItem(item);\n}\n\nvoid X86Compiler::alloc(Var& var)\n{\n  _vhint(var, kVarHintAlloc, kInvalidValue);\n}\n\nvoid X86Compiler::alloc(Var& var, uint32_t regIndex)\n{\n  if (regIndex > 31)\n    return;\n\n  _vhint(var, kVarHintAlloc, IntUtil::maskFromIndex(regIndex));\n}\n\nvoid X86Compiler::alloc(Var& var, const Reg& reg)\n{\n  _vhint(var, kVarHintAlloc, IntUtil::maskFromIndex(reg.getRegIndex()));\n}\n\nvoid X86Compiler::save(Var& var)\n{\n  _vhint(var, kVarHintSave, kInvalidValue);\n}\n\nvoid X86Compiler::spill(Var& var)\n{\n  _vhint(var, kVarHintSpill, kInvalidValue);\n}\n\nvoid X86Compiler::unuse(Var& var)\n{\n  _vhint(var, kVarHintUnuse, kInvalidValue);\n}\n\nuint32_t X86Compiler::getPriority(Var& var) const\n{\n  if (var.getId() == kInvalidValue)\n    return kInvalidValue;\n\n  X86CompilerVar* vdata = _getVar(var.getId());\n  ASMJIT_ASSERT(vdata != NULL);\n\n  return vdata->getPriority();\n}\n\nvoid X86Compiler::setPriority(Var& var, uint32_t priority)\n{\n  if (var.getId() == kInvalidValue)\n    return;\n\n  X86CompilerVar* vdata = _getVar(var.getId());\n  ASMJIT_ASSERT(vdata != NULL);\n\n  if (priority > 100) priority = 100;\n  vdata->_priority = static_cast<uint8_t>(priority);\n}\n\nbool X86Compiler::getSaveOnUnuse(Var& var) const\n{\n  if (var.getId() == kInvalidValue)\n    return false;\n\n  X86CompilerVar* vdata = _getVar(var.getId());\n  ASMJIT_ASSERT(vdata != NULL);\n\n  return (bool)vdata->saveOnUnuse;\n}\n\nvoid X86Compiler::setSaveOnUnuse(Var& var, bool value)\n{\n  if (var.getId() == kInvalidValue)\n    return;\n\n  X86CompilerVar* vdata = _getVar(var.getId());\n  ASMJIT_ASSERT(vdata != NULL);\n\n  vdata->saveOnUnuse = value;\n}\n\nvoid X86Compiler::rename(Var& var, const char* name)\n{\n  if (var.getId() == kInvalidValue)\n    return;\n\n  X86CompilerVar* vdata = _getVar(var.getId());\n  ASMJIT_ASSERT(vdata != NULL);\n\n  vdata->_name = _zoneMemory.sdup(name);\n}\n\n// ============================================================================\n// [AsmJit::Compiler - State]\n// ============================================================================\n\nX86CompilerState* X86Compiler::_newState(uint32_t memVarsCount)\n{\n  X86CompilerState* state = reinterpret_cast<X86CompilerState*>(_zoneMemory.alloc(\n    sizeof(X86CompilerState) + memVarsCount * sizeof(void*)));\n  return state;\n}\n\n// ============================================================================\n// [AsmJit::Compiler - Make]\n// ============================================================================\n\nvoid* X86Compiler::make()\n{\n  X86Assembler x86Asm(_context);\n\n  x86Asm._properties = _properties;\n  x86Asm.setLogger(_logger);\n\n  serialize(x86Asm);\n\n  if (this->getError())\n    return NULL;\n\n  if (x86Asm.getError())\n  {\n    setError(x86Asm.getError());\n    return NULL;\n  }\n\n  void* result = x86Asm.make();\n\n  if (_logger)\n  {\n    _logger->logFormat(\"*** COMPILER SUCCESS - Wrote %u bytes, code: %u, trampolines: %u.\\n\\n\",\n      (unsigned int)x86Asm.getCodeSize(),\n      (unsigned int)x86Asm.getOffset(),\n      (unsigned int)x86Asm.getTrampolineSize());\n  }\n\n  return result;\n}\n\nvoid X86Compiler::serialize(Assembler& a)\n{\n  X86CompilerContext x86Context(this);\n  X86Assembler& x86Asm = static_cast<X86Assembler&>(a);\n\n  CompilerItem* start = _first;\n  CompilerItem* stop = NULL;\n\n  // Register all labels.\n  x86Asm.registerLabels(_targets.getLength());\n\n  // Make code.\n  for (;;)\n  {\n    _cc = NULL;\n\n    // ------------------------------------------------------------------------\n    // [Find Function]\n    // ------------------------------------------------------------------------\n\n    for (;;)\n    {\n      if (start == NULL)\n        return;\n\n      if (start->getType() == kCompilerItemFuncDecl)\n        break;\n\n      start->emit(x86Asm);\n      start = start->getNext();\n    }\n\n    // ------------------------------------------------------------------------\n    // [Setup CompilerContext]\n    // ------------------------------------------------------------------------\n\n    stop = static_cast<X86CompilerFuncDecl*>(start)->getEnd();\n\n    x86Context._func = static_cast<X86CompilerFuncDecl*>(start);\n    x86Context._start = start;\n    x86Context._stop = stop;\n    x86Context._extraBlock = stop->getPrev();\n\n    // Detect whether the function generation was finished.\n    if (!x86Context._func->isFinished() || x86Context._func->getEnd()->getPrev() == NULL)\n    {\n      setError(kErrorIncompleteFunction);\n      return;\n    }\n\n    // ------------------------------------------------------------------------\n    // Step 1:\n    // - Assign/increment offset of each item.\n    // - Extract variables from instructions.\n    // - Prepare variables for register allocator:\n    //   - Update read(r) / write(w) / read/write(x) statistics.\n    //   - Update register / memory usage statistics.\n    //   - Find scope (first / last item) of variables.\n    // ------------------------------------------------------------------------\n\n    CompilerItem* cur;\n    for (cur = start; ; cur = cur->getNext())\n    {\n      cur->prepare(x86Context);\n      if (cur == stop)\n        break;\n    }\n\n    // We set compiler context also to Compiler so newly emitted instructions \n    // can call CompilerItem::prepare() on itself.\n    _cc = &x86Context;\n\n    // ------------------------------------------------------------------------\n    // Step 2:\n    // - Translate special instructions (imul, cmpxchg8b, ...).\n    // - Alloc registers.\n    // - Translate forward jumps.\n    // - Alloc memory operands (variables related).\n    // - Emit function prolog.\n    // - Emit function epilog.\n    // - Patch memory operands (variables related).\n    // - Dump function prototype and variable statistics (if enabled).\n    // ------------------------------------------------------------------------\n\n    // Translate special instructions and run alloc registers.\n    cur = start;\n\n    do {\n      do {\n        // Assign current offset of each item back to CompilerContext.\n        x86Context._currentOffset = cur->_offset;\n        // Assign previous item to compiler so each variable spill/alloc will\n        // be emitted before.\n        _current = cur->getPrev();\n\n        cur = cur->translate(x86Context);\n      } while (cur);\n\n      x86Context._isUnreachable = true;\n\n      size_t len = x86Context._backCode.getLength();\n      while (x86Context._backPos < len)\n      {\n        cur = x86Context._backCode[x86Context._backPos++]->getNext();\n        if (!cur->isTranslated()) break;\n\n        cur = NULL;\n      }\n    } while (cur);\n\n    // Translate forward jumps.\n    {\n      ForwardJumpData* j = x86Context._forwardJumps;\n      while (j != NULL)\n      {\n        x86Context._assignState(j->state);\n        _current = j->inst->getPrev();\n        j->inst->doJump(x86Context);\n        j = j->next;\n      }\n    }\n\n    // Alloc memory operands (variables related).\n    x86Context._allocMemoryOperands();\n\n    // Emit function prolog / epilog.\n    x86Context.getFunc()->_preparePrologEpilog(x86Context);\n\n    _current = x86Context._func->getEntryTarget();\n    x86Context.getFunc()->_emitProlog(x86Context);\n\n    _current = x86Context._func->getExitTarget();\n    x86Context.getFunc()->_emitEpilog(x86Context);\n\n    // Patch memory operands (variables related).\n    _current = _last;\n    x86Context._patchMemoryOperands(start, stop);\n\n    // Dump function prototype and variable statistics (if enabled).\n    if (_logger)\n      x86Context.getFunc()->_dumpFunction(x86Context);\n\n    // ------------------------------------------------------------------------\n    // Hack: need to register labels that was created by the Step 2.\n    // ------------------------------------------------------------------------\n\n    if (x86Asm._labels.getLength() < _targets.getLength())\n      x86Asm.registerLabels(_targets.getLength() - x86Asm._labels.getLength());\n\n    CompilerItem* extraBlock = x86Context._extraBlock;\n\n    // ------------------------------------------------------------------------\n    // Step 3:\n    // - Emit instructions to Assembler stream.\n    // ------------------------------------------------------------------------\n\n    for (cur = start; ; cur = cur->getNext())\n    {\n      cur->emit(x86Asm);\n      if (cur == extraBlock) break;\n    }\n\n    // ------------------------------------------------------------------------\n    // Step 4:\n    // - Emit everything else (post action).\n    // ------------------------------------------------------------------------\n\n    for (cur = start; ; cur = cur->getNext())\n    {\n      cur->post(x86Asm);\n      if (cur == extraBlock) break;\n    }\n\n    start = extraBlock->getNext();\n    x86Context._clear();\n  }\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compiler.h",
    "content": "// [AsmJit]\r\n// Complete JIT Assembler for C++ Language.\r\n//\r\n// [License]\r\n// Zlib - See COPYING file in this package.\r\n\r\n// [Guard]\r\n#ifndef _ASMJIT_X86_X86COMPILER_H\r\n#define _ASMJIT_X86_X86COMPILER_H\r\n\r\n// [Dependencies - AsmJit]\r\n#include \"../core/build.h\"\r\n#include \"../core/compiler.h\"\r\n#include \"../core/compilercontext.h\"\r\n#include \"../core/compilerfunc.h\"\r\n#include \"../core/compileritem.h\"\r\n\r\n#include \"../x86/x86assembler.h\"\r\n#include \"../x86/x86defs.h\"\r\n#include \"../x86/x86func.h\"\r\n#include \"../x86/x86util.h\"\r\n\r\n// [Api-Begin]\r\n#include \"../core/apibegin.h\"\r\n\r\n//! @internal\r\n//!\r\n//! @brief Mark methods not supported by @ref Compiler. These methods are\r\n//! usually used only in function prologs/epilogs or to manage stack.\r\n#define ASMJIT_NOT_SUPPORTED_BY_COMPILER 0\r\n\r\nnamespace AsmJit {\r\n\r\n//! @addtogroup AsmJit_X86\r\n//! @{\r\n\r\n// ============================================================================\r\n// [Forward Declarations]\r\n// ============================================================================\r\n\r\nstruct X86Compiler;\r\nstruct X86CompilerAlign;\r\nstruct X86CompilerContext;\r\nstruct X86CompilerFuncCall;\r\nstruct X86CompilerFuncDecl;\r\nstruct X86CompilerFuncEnd;\r\nstruct X86CompilerInst;\r\nstruct X86CompilerJmpInst;\r\nstruct X86CompilerState;\r\nstruct X86CompilerTarget;\r\nstruct X86CompilerVar;\r\n\r\n// ============================================================================\r\n// [AsmJit::X86CompilerVar]\r\n// ============================================================================\r\n\r\n//! @brief @ref X86Compiler variable.\r\nstruct X86CompilerVar : public CompilerVar\r\n{\r\n  // --------------------------------------------------------------------------\r\n  // [AsVar]\r\n  // --------------------------------------------------------------------------\r\n\r\n  inline GpVar asGpVar() const\r\n  {\r\n    GpVar var;\r\n    var._var.id = _id;\r\n    var._var.size = _size;\r\n    var._var.regCode = x86VarInfo[_type].getCode();\r\n    var._var.varType = _type;\r\n    return var;\r\n  }\r\n\r\n  inline MmVar asMmVar() const\r\n  {\r\n    MmVar var;\r\n    var._var.id = _id;\r\n    var._var.size = _size;\r\n    var._var.regCode = x86VarInfo[_type].getCode();\r\n    var._var.varType = _type;\r\n    return var;\r\n  }\r\n\r\n  inline XmmVar asXmmVar() const\r\n  {\r\n    XmmVar var;\r\n    var._var.id = _id;\r\n    var._var.size = _size;\r\n    var._var.regCode = x86VarInfo[_type].getCode();\r\n    var._var.varType = _type;\r\n    return var;\r\n  }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members - Scope]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief The first item where the variable is accessed.\r\n  //! @note If this member is @c NULL then variable isn't used.\r\n  CompilerItem* firstItem;\r\n  //! @brief The last item where the variable is accessed.\r\n  CompilerItem* lastItem;\r\n\r\n  //! @brief Scope (NULL if variable is global).\r\n  X86CompilerFuncDecl* funcScope;\r\n  //! @brief The first call which is after the @c firstItem.\r\n  X86CompilerFuncCall* funcCall;\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members - Home]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Home register index or @c kRegIndexInvalid (used by register allocator).\r\n  uint32_t homeRegisterIndex;\r\n  //! @brief Preferred registers mask.\r\n  uint32_t prefRegisterMask;\r\n\r\n  //! @brief Home memory address offset.\r\n  int32_t homeMemoryOffset;\r\n  //! @brief Used by @c CompilerContext, do not touch (initially NULL).\r\n  void* homeMemoryData;\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members - Actual]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Actual register index (connected with actual @c X86CompilerState).\r\n  uint32_t regIndex;\r\n  //! @brief Actual working offset. This member is set before register allocator\r\n  //! is called. If workOffset is same as CompilerContext::_currentOffset then\r\n  //! this variable is probably used in next instruction and can't be spilled.\r\n  uint32_t workOffset;\r\n\r\n  //! @brief Next active variable in circular double-linked list.\r\n  X86CompilerVar* nextActive;\r\n  //! @brief Previous active variable in circular double-linked list.\r\n  X86CompilerVar* prevActive;\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members - Flags]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Variable state (connected with actual @c X86CompilerState).\r\n  uint8_t state;\r\n  //! @brief Whether variable was changed (connected with actual @c X86CompilerState).\r\n  uint8_t changed;\r\n  //! @brief Save on unuse (at end of the variable scope).\r\n  uint8_t saveOnUnuse;\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members - Statistics]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Register read access statistics.\r\n  uint32_t regReadCount;\r\n  //! @brief Register write access statistics.\r\n  uint32_t regWriteCount;\r\n  //! @brief Register read/write access statistics (related to a single instruction).\r\n  uint32_t regRwCount;\r\n\r\n  //! @brief Register GpbLo access statistics.\r\n  uint32_t regGpbLoCount;\r\n  //! @brief Register GpbHi access statistics.\r\n  uint32_t regGpbHiCount;\r\n\r\n  //! @brief Memory read statistics.\r\n  uint32_t memReadCount;\r\n  //! @brief Memory write statistics.\r\n  uint32_t memWriteCount;\r\n  //! @brief Memory read+write statistics.\r\n  uint32_t memRwCount;\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members - Temporary]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Temporary data that can be used in prepare/translate stage.\r\n  //!\r\n  //! Initial value is NULL and it's expected that after use it's set back to\r\n  //! NULL.\r\n  //!\r\n  //! The temporary data is designed to be used by algorithms that need to\r\n  //! set some state into variables, do something and then clean-up. See\r\n  //! state switch and function call for details.\r\n  union\r\n  {\r\n    void* tPtr;\r\n    intptr_t tInt;\r\n  };\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::X86CompilerState]\r\n// ============================================================================\r\n\r\n//! @brief @ref X86Compiler state.\r\nstruct X86CompilerState : CompilerState\r\n{\r\n  enum\r\n  {\r\n    //! @brief Base for Gp registers.\r\n    kStateRegGpBase = 0,\r\n    //! @brief Base for Mm registers.\r\n    kStateRegMmBase = 16,\r\n    //! @brief Base for Xmm registers.\r\n    kStateRegXmmBase = 24,\r\n\r\n    //! @brief Count of all registers in @ref X86CompilerState.\r\n    kStateRegCount = 16 + 8 + 16\r\n  };\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Clear]\r\n  // --------------------------------------------------------------------------\r\n\r\n  inline void clear()\r\n  { memset(this, 0, sizeof(*this)); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Members]\r\n  // --------------------------------------------------------------------------\r\n\r\n  union\r\n  {\r\n    //! @brief All allocated variables in one array.\r\n    X86CompilerVar* regs[kStateRegCount];\r\n\r\n    struct\r\n    {\r\n      //! @brief Allocated GP registers.\r\n      X86CompilerVar* gp[16];\r\n      //! @brief Allocated MM registers.\r\n      X86CompilerVar* mm[8];\r\n      //! @brief Allocated XMM registers.\r\n      X86CompilerVar* xmm[16];\r\n    };\r\n  };\r\n\r\n  //! @brief Used GP registers bit-mask.\r\n  uint32_t usedGP;\r\n  //! @brief Used MM registers bit-mask.\r\n  uint32_t usedMM;\r\n  //! @brief Used XMM registers bit-mask.\r\n  uint32_t usedXMM;\r\n\r\n  //! @brief Changed GP registers bit-mask.\r\n  uint32_t changedGP;\r\n  //! @brief Changed MM registers bit-mask.\r\n  uint32_t changedMM;\r\n  //! @brief Changed XMM registers bit-mask.\r\n  uint32_t changedXMM;\r\n\r\n  //! @brief Count of variables in @c memVarsData.\r\n  uint32_t memVarsCount;\r\n  //! @brief Variables stored in memory (@c kVarStateMem).\r\n  //!\r\n  //! When saving / restoring state it's important to keep registers which are\r\n  //! still in memory. Register is always unused when it is going out-of-scope.\r\n  //! All variables which are not here are unused (@c kVarStateUnused).\r\n  X86CompilerVar* memVarsData[1];\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::VarMemBlock]\r\n// ============================================================================\r\n\r\nstruct VarMemBlock\r\n{\r\n  int32_t offset;\r\n  uint32_t size;\r\n\r\n  VarMemBlock* nextUsed;\r\n  VarMemBlock* nextFree;\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::VarAllocRecord]\r\n// ============================================================================\r\n\r\n//! @brief Variable alloc record (for each instruction that uses variables).\r\n//!\r\n//! Variable record contains pointer to variable data and register allocation\r\n//! flags. These flags are important to determine the best alloc instruction.\r\nstruct VarAllocRecord\r\n{\r\n  //! @brief Variable data (the structure owned by @c Compiler).\r\n  X86CompilerVar* vdata;\r\n  //! @brief Variable alloc flags, see @c kVarAllocFlags.\r\n  uint32_t vflags;\r\n  //! @brief Register mask (default is 0).\r\n  uint32_t regMask;\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::VarCallRecord]\r\n// ============================================================================\r\n\r\n//! @brief Variable call-fn record (for each callable that uses variables).\r\n//!\r\n//! This record contains variables that are used to call a function (using \r\n//! @c X86CompilerFuncCall item). Each variable contains the registers where\r\n//! it must be and registers where the value will be returned.\r\nstruct VarCallRecord\r\n{\r\n  //! @brief Variable data (the structure owned by @c Compiler).\r\n  X86CompilerVar* vdata;\r\n  uint32_t flags;\r\n\r\n  uint8_t inCount;\r\n  uint8_t inDone;\r\n\r\n  uint8_t outCount;\r\n  uint8_t outDone;\r\n\r\n  enum FLAGS\r\n  {\r\n    kFlagInGp = 0x0001,\r\n    kFlagInMm = 0x0002,\r\n    kFlagInXmm = 0x0004,\r\n    kFlagInStack = 0x0008,\r\n\r\n    kFlagOutEax = 0x0010,\r\n    kFlagOutEdx = 0x0020,\r\n    kFlagOutSt0 = 0x0040,\r\n    kFlagOutSt1 = 0x0080,\r\n    kFlagOutMm0 = 0x0100,\r\n    kFlagOutXmm0 = 0x0400,\r\n    kFlagOutXmm1 = 0x0800,\r\n\r\n    kFlagInMemPtr = 0x1000,\r\n    kFlagCallReg = 0x2000,\r\n    kFlagCallMem = 0x4000,\r\n    kFlagUnuseAfterUse = 0x8000\r\n  };\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::VarHintRecord]\r\n// ============================================================================\r\n\r\nstruct VarHintRecord\r\n{\r\n  X86CompilerVar* vdata;\r\n  uint32_t hint;\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::ForwardJumpData]\r\n// ============================================================================\r\n\r\nstruct ForwardJumpData\r\n{\r\n  X86CompilerJmpInst* inst;\r\n  X86CompilerState* state;\r\n  ForwardJumpData* next;\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::CompilerUtil]\r\n// ============================================================================\r\n\r\n//! @brief Static class that contains utility methods.\r\nstruct CompilerUtil\r\n{\r\n  ASMJIT_API static bool isStack16ByteAligned();\r\n};\r\n\r\n// ============================================================================\r\n// [AsmJit::X86Compiler]\r\n// ============================================================================\r\n\r\n//! @brief Compiler - high level code generation.\r\n//!\r\n//! This class is used to store instruction stream and allows to modify\r\n//! it on the fly. It uses different concept than @c AsmJit::Assembler class\r\n//! and in fact @c AsmJit::Assembler is only used as a backend. Compiler never\r\n//! emits machine code and each instruction you use is stored to instruction\r\n//! array instead. This allows to modify instruction stream later and for\r\n//! example to reorder instructions to make better performance.\r\n//!\r\n//! Using @c AsmJit::Compiler moves code generation to higher level. Higher\r\n//! level constructs allows to write more abstract and extensible code that\r\n//! is not possible with pure @c AsmJit::Assembler class. Because\r\n//! @c AsmJit::Compiler needs to create many objects and lifetime of these\r\n//! objects is small (same as @c AsmJit::Compiler lifetime itself) it uses\r\n//! very fast memory management model. This model allows to create object\r\n//! instances in nearly zero time (compared to @c malloc() or @c new()\r\n//! operators) so overhead by creating machine code by @c AsmJit::Compiler\r\n//! is minimized.\r\n//!\r\n//! @section AsmJit_Compiler_TheStory The Story\r\n//!\r\n//! Before telling you how Compiler works I'd like to write a story. I'd like\r\n//! to cover reasons why this class was created and why I'm recommending to use \r\n//! it. When I released the first version of AsmJit (0.1) it was a toy. The\r\n//! first function I wrote was function which is still available as testjit and\r\n//! which simply returns 1024. The reason why function works for both 32-bit/\r\n//! 64-bit mode and for Windows/Unix specific calling conventions is luck, no\r\n//! arguments usage and no registers usage except returning value in EAX/RAX.\r\n//!\r\n//! Then I started a project called BlitJit which was targetted to generating\r\n//! JIT code for computer graphics. After writing some lines I decided that I\r\n//! can't join pieces of code together without abstraction, should be\r\n//! pixels source pointer in ESI/RSI or EDI/RDI or it's completelly \r\n//! irrellevant? What about destination pointer and SSE2 register for reading\r\n//! input pixels? The simple answer might be \"just pick some one and use it\".\r\n//!\r\n//! Another reason for abstraction is function calling-conventions. It's really\r\n//! not easy to write assembler code for 32-bit and 64-bit platform supporting\r\n//! three calling conventions (32-bit is similar between Windows and Unix, but\r\n//! 64-bit calling conventions are different).\r\n//!\r\n//! At this time I realized that I can't write code which uses named registers,\r\n//! I need to abstract it. In most cases you don't need specific register, you\r\n//! need to emit instruction that does something with 'virtual' register(s),\r\n//! memory, immediate or label.\r\n//!\r\n//! The first version of AsmJit with Compiler was 0.5 (or 0.6?, can't remember).\r\n//! There was support for 32-bit and 64-bit mode, function calling conventions,\r\n//! but when emitting instructions the developer needed to decide which \r\n//! registers are changed, which are only read or completely overwritten. This\r\n//! model helped a lot when generating code, especially when joining more\r\n//! code-sections together, but there was also small possibility for mistakes.\r\n//! Simply the first version of Compiler was great improvement over low-level \r\n//! Assembler class, but the API design wasn't perfect.\r\n//!\r\n//! The second version of Compiler, completelly rewritten and based on \r\n//! different goals, is part of AsmJit starting at version 1.0. This version\r\n//! was designed after the first one and it contains serious improvements over\r\n//! the old one. The first improvement is that you just use instructions with \r\n//! virtual registers - called variables. When using compiler there is no way\r\n//! to use native registers, there are variables instead. AsmJit is smarter \r\n//! than before and it knows which register is needed only for read (r), \r\n//! read/write (w) or overwrite (x). Supported are also instructions which \r\n//! are using some registers in implicit way (these registers are not part of\r\n//! instruction definition in string form). For example to use CPUID instruction \r\n//! you must give it four variables which will be automatically allocated to\r\n//! input/output registers (EAX, EBX, ECX, EDX).\r\n//! \r\n//! Another improvement is algorithm used by a register allocator. In first\r\n//! version the registers were allocated when creating instruction stream. In\r\n//! new version registers are allocated after calling @c Compiler::make(). This\r\n//! means that register allocator has information about scope of all variables\r\n//! and their usage statistics. The algorithm to allocate registers is very\r\n//! simple and it's always called as a 'linear scan register allocator'. When\r\n//! you get out of registers the all possible variables are scored and the worst\r\n//! is spilled. Of course algorithm ignores the variables used for current\r\n//! instruction.\r\n//!\r\n//! In addition, because registers are allocated after the code stream is\r\n//! generated, the state switches between jumps are handled by Compiler too.\r\n//! You don't need to worry about jumps, compiler always do this dirty work \r\n//! for you.\r\n//!\r\n//! The nearly last thing I'd like to present is calling other functions from \r\n//! the generated code. AsmJit uses a @c FunctionPrototype class to hold\r\n//! the function parameters, their position in stack (or register index) and\r\n//! function return value. This class is used internally, but it can be\r\n//! used to create your own function calling-convention. All standard function\r\n//! calling conventions are implemented.\r\n//!\r\n//! Please enjoy the new version of Compiler, it was created for writing a\r\n//! low-level code using high-level API, leaving developer to concentrate to\r\n//! real problems and not to solving a register puzzle.\r\n//!\r\n//! @section AsmJit_Compiler_CodeGeneration Code Generation\r\n//!\r\n//! First that is needed to know about compiler is that compiler never emits\r\n//! machine code. It's used as a middleware between @c AsmJit::Assembler and\r\n//! your code. There is also convenience method @c make() that allows to\r\n//! generate machine code directly without creating @c AsmJit::Assembler\r\n//! instance.\r\n//!\r\n//! Comparison of generating machine code through @c Assembler and directly\r\n//! by @c Compiler:\r\n//!\r\n//! @code\r\n//! // Assembler instance is low level code generation class that emits\r\n//! // machine code.\r\n//! X86Assembler a;\r\n//!\r\n//! // Compiler instance is high level code generation class that stores all\r\n//! // instructions in internal representation.\r\n//! X86Compiler c;\r\n//!\r\n//! // ... put your code here ...\r\n//!\r\n//! // Final step - generate code. AsmJit::Compiler::serialize() will serialize\r\n//! // all instructions into Assembler and this ensures generating real machine\r\n//! // code.\r\n//! c.serialize(a);\r\n//!\r\n//! // Your function\r\n//! void* fn = a.make();\r\n//! @endcode\r\n//!\r\n//! Example how to generate machine code using only @c Compiler (preferred):\r\n//!\r\n//! @code\r\n//! // Compiler instance is enough.\r\n//! X86Compiler c;\r\n//!\r\n//! // ... put your code here ...\r\n//!\r\n//! // Your function\r\n//! void* fn = c.make();\r\n//! @endcode\r\n//!\r\n//! You can see that there is @c AsmJit::Compiler::serialize() function that\r\n//! emits instructions into @c AsmJit::Assembler(). This layered architecture\r\n//! means that each class is used for something different and there is no code\r\n//! duplication. For convenience there is also @c AsmJit::Compiler::make()\r\n//! method that can create your function using @c AsmJit::Assembler, but\r\n//! internally (this is preffered bahavior when using @c AsmJit::Compiler).\r\n//!\r\n//! The @c make() method allocates memory using @c Context instance passed\r\n//! into the @c X86Compiler constructor. If code generator is used to create JIT\r\n//! function then virtual memory allocated by @c MemoryManager is used. To get\r\n//! global memory manager use @c MemoryManager::getGlobal().\r\n//!\r\n//! @code\r\n//! // Compiler instance is enough.\r\n//! X86Compiler c;\r\n//!\r\n//! // ... put your code using Compiler instance ...\r\n//!\r\n//! // Your function\r\n//! void* fn = c.make();\r\n//!\r\n//! // Free it if you don't want it anymore\r\n//! // (using global memory manager instance)\r\n//! MemoryManager::getGlobal()->free(fn);\r\n//! @endcode\r\n//!\r\n//! @section AsmJit_Compiler_Functions Functions\r\n//!\r\n//! To build functions with @c Compiler, see @c AsmJit::Compiler::newFunc()\r\n//! method.\r\n//!\r\n//! @section AsmJit_Compiler_Variables Variables\r\n//!\r\n//! Compiler is able to manage variables and function arguments. Internally\r\n//! there is no difference between function argument and variable declared\r\n//! inside. To get function argument you use @c getGpArg() method and to declare\r\n//! variable use @c newGpVar(), @c newMmVar() and @c newXmmVar() methods. The @c newXXX()\r\n//! methods accept also parameter describing the variable type. For example\r\n//! the @c newGpVar() method always creates variable which size matches the target\r\n//! architecture size (for 32-bit target the 32-bit variable is created, for\r\n//! 64-bit target the variable size is 64-bit). To override this behavior the\r\n//! variable type must be specified.\r\n//!\r\n//! @code\r\n//! // Compiler and function declaration - void f(int*);\r\n//! X86Compiler c;\r\n//! c.newFunc(kX86FuncConvDefault, BuildFunction1<int*>());\r\n//!\r\n//! // Get argument variable (it's pointer).\r\n//! GpVar a1(c.getGpArg(0));\r\n//!\r\n//! // Create your variables.\r\n//! GpVar x1(c.newGpVar(kX86VarTypeGpd));\r\n//! GpVar x2(c.newGpVar(kX86VarTypeGpd));\r\n//!\r\n//! // Init your variables.\r\n//! c.mov(x1, 1);\r\n//! c.mov(x2, 2);\r\n//!\r\n//! // ... your code ...\r\n//! c.add(x1, x2);\r\n//! // ... your code ...\r\n//!\r\n//! // Store result to a given pointer in first argument\r\n//! c.mov(dword_ptr(a1), x1);\r\n//!\r\n//! // End of function body.\r\n//! c.endFunc();\r\n//!\r\n//! // Make the function.\r\n//! typedef void (*MyFn)(int*);\r\n//! MyFn fn = asmjit_cast<MyFn>(c.make());\r\n//! @endcode\r\n//!\r\n//! This code snipped needs to be explained. You can see that there are more \r\n//! variable types that can be used by @c Compiler. Most useful variables can\r\n//! be allocated using general purpose registers (@c GpVar), MMX registers \r\n//! (@c MmVar) or SSE registers (@c XmmVar).\r\n//!\r\n//! X86/X64 variable types:\r\n//! \r\n//! - @c kX86VarTypeGpd - 32-bit general purpose register (EAX, EBX, ...).\r\n//! - @c kX86VarTypeGpq - 64-bit general purpose register (RAX, RBX, ...).\r\n//! - @c kX86VarTypeGpz - 32-bit or 64-bit general purpose register, depends\r\n//!   to target architecture. Mapped to @c kX86VarTypeGpd or @c kX86VarTypeGpq.\r\n//!\r\n//! - @c kX86VarTypeX87 - 80-bit floating point stack register st(0 to 7).\r\n//! - @c kX86VarTypeX87SS - 32-bit floating point stack register st(0 to 7).\r\n//! - @c kX86VarTypeX87SD - 64-bit floating point stack register st(0 to 7).\r\n//!\r\n//! - @c VARIALBE_TYPE_MM - 64-bit MMX register.\r\n//!\r\n//! - @c kX86VarTypeXmm - 128-bit SSE register.\r\n//! - @c kX86VarTypeXmmSS - 128-bit SSE register which contains \r\n//!   scalar 32-bit single precision floating point.\r\n//! - @c kX86VarTypeXmmSD - 128-bit SSE register which contains\r\n//!   scalar 64-bit double precision floating point.\r\n//! - @c kX86VarTypeXmmPS - 128-bit SSE register which contains\r\n//!   4 packed 32-bit single precision floating points.\r\n//! - @c kX86VarTypeXmmPD - 128-bit SSE register which contains\r\n//!   2 packed 64-bit double precision floating points.\r\n//!\r\n//! Unified variable types:\r\n//!\r\n//! - @c kX86VarTypeInt32 - 32-bit general purpose register.\r\n//! - @c kX86VarTypeInt64 - 64-bit general purpose register.\r\n//! - @c kX86VarTypeIntPtr - 32-bit or 64-bit general purpose register / pointer.\r\n//!\r\n//! - @c kX86VarTypeFloat - 32-bit single precision floating point.\r\n//! - @c kX86VarTypeDouble - 64-bit double precision floating point.\r\n//!\r\n//! Variable states:\r\n//!\r\n//! - @c kVarStateUnused - State that is assigned to newly created\r\n//!   variables or to not used variables (dereferenced to zero).\r\n//! - @c kVarStateReg - State that means that variable is currently\r\n//!   allocated in register.\r\n//! - @c kVarStateMem - State that means that variable is currently\r\n//!   only in memory location.\r\n//!\r\n//! When you create new variable, initial state is always @c kVarStateUnused,\r\n//! allocating it to register or spilling to memory changes this state to\r\n//! @c kVarStateReg or @c kVarStateMem, respectively.\r\n//! During variable lifetime it's usual that its state is changed multiple\r\n//! times. To generate better code, you can control allocating and spilling\r\n//! by using up to four types of methods that allows it (see next list).\r\n//!\r\n//! Explicit variable allocating / spilling methods:\r\n//!\r\n//! - @c Compiler::alloc() - Explicit method to alloc variable into\r\n//!      register. You can use this before loops or code blocks.\r\n//!\r\n//! - @c Compiler::spill() - Explicit method to spill variable. If variable\r\n//!      is in register and you call this method, it's moved to its home memory\r\n//!      location. If variable is not in register no operation is performed.\r\n//!\r\n//! - @c Compiler::unuse() - Unuse variable (you can use this to end the\r\n//!      variable scope or sub-scope).\r\n//!\r\n//! Please see AsmJit tutorials (testcompiler.cpp and testvariables.cpp) for\r\n//! more complete examples.\r\n//!\r\n//! @section AsmJit_Compiler_MemoryManagement Memory Management\r\n//!\r\n//! @c Compiler Memory management follows these rules:\r\n//! - Everything created by @c Compiler is always freed by @c Compiler.\r\n//! - To get decent performance, compiler always uses larger memory buffer\r\n//!   for objects to allocate and when compiler instance is destroyed, this\r\n//!   buffer is freed. Destructors of active objects are called when\r\n//!   destroying compiler instance. Destructors of abadonded compiler\r\n//!   objects are called immediately after abadonding them.\r\n//! - This type of memory management is called 'zone memory management'.\r\n//!\r\n//! This means that you can't use any @c Compiler object after destructing it,\r\n//! it also means that each object like @c Label, @c Var and others are created\r\n//! and managed by @c Compiler itself. These objects contain ID which is used\r\n//! internally by Compiler to store additional information about these objects.\r\n//!\r\n//! @section AsmJit_Compiler_StateManagement Control-Flow and State Management.\r\n//!\r\n//! The @c Compiler automatically manages state of the variables when using\r\n//! control flow instructions like jumps, conditional jumps and calls. There\r\n//! is minimal heuristics for choosing the method how state is saved or restored.\r\n//!\r\n//! Generally the state can be changed only when using jump or conditional jump\r\n//! instruction. When using non-conditional jump then state change is embedded\r\n//! into the instruction stream before the jump. When using conditional jump\r\n//! the @c Compiler decides whether to restore state before the jump or whether\r\n//! to use another block where state is restored. The last case is that no-code\r\n//! have to be emitted and there is no state change (this is of course ideal).\r\n//!\r\n//! Choosing whether to embed 'restore-state' section before conditional jump\r\n//! is quite simple. If jump is likely to be 'taken' then code is embedded, if\r\n//! jump is unlikely to be taken then the small code section for state-switch\r\n//! will be generated instead.\r\n//!\r\n//! Next example is the situation where the extended code block is used to\r\n//! do state-change:\r\n//!\r\n//! @code\r\n//! X86Compiler c;\r\n//!\r\n//! c.newFunc(kX86FuncConvDefault, FuncBuilder0<Void>());\r\n//! c.getFunc()->setHint(kFuncHintNaked, true);\r\n//!\r\n//! // Labels.\r\n//! Label L0 = c.newLabel();\r\n//!\r\n//! // Variables.\r\n//! GpVar var0 = c.newGpVar();\r\n//! GpVar var1 = c.newGpVar();\r\n//!\r\n//! // Cleanup. After these two lines, the var0 and var1 will be always stored\r\n//! // in registers. Our example is very small, but in larger code the var0 can\r\n//! // be spilled by xor(var1, var1).\r\n//! c.xor_(var0, var0);\r\n//! c.xor_(var1, var1);\r\n//! c.cmp(var0, var1);\r\n//! // State:\r\n//! //   var0 - register.\r\n//! //   var1 - register.\r\n//!\r\n//! // We manually spill these variables.\r\n//! c.spill(var0);\r\n//! c.spill(var1);\r\n//! // State:\r\n//! //   var0 - memory.\r\n//! //   var1 - memory.\r\n//!\r\n//! // Conditional jump to L0. It will be always taken, but compiler thinks that\r\n//! // it is unlikely taken so it will embed state change code somewhere.\r\n//! c.je(L0);\r\n//!\r\n//! // Do something. The variables var0 and var1 will be allocated again.\r\n//! c.add(var0, 1);\r\n//! c.add(var1, 2);\r\n//! // State:\r\n//! //   var0 - register.\r\n//! //   var1 - register.\r\n//!\r\n//! // Bind label here, the state is not changed.\r\n//! c.bind(L0);\r\n//! // State:\r\n//! //   var0 - register.\r\n//! //   var1 - register.\r\n//!\r\n//! // We need to use var0 and var1, because if compiler detects that variables\r\n//! // are out of scope then it optimizes the state-change.\r\n//! c.sub(var0, var1);\r\n//! // State:\r\n//! //   var0 - register.\r\n//! //   var1 - register.\r\n//!\r\n//! c.endFunc();\r\n//! @endcode\r\n//!\r\n//! The output:\r\n//!\r\n//! @verbatim\r\n//! xor eax, eax                    ; xor var_0, var_0\r\n//! xor ecx, ecx                    ; xor var_1, var_1\r\n//! cmp eax, ecx                    ; cmp var_0, var_1\r\n//! mov [esp - 24], eax             ; spill var_0\r\n//! mov [esp - 28], ecx             ; spill var_1\r\n//! je L0_Switch\r\n//! mov eax, [esp - 24]             ; alloc var_0\r\n//! add eax, 1                      ; add var_0, 1\r\n//! mov ecx, [esp - 28]             ; alloc var_1\r\n//! add ecx, 2                      ; add var_1, 2\r\n//! L0:\r\n//! sub eax, ecx                    ; sub var_0, var_1\r\n//! ret\r\n//!\r\n//! ; state-switch begin\r\n//! L0_Switch0:\r\n//! mov eax, [esp - 24]             ; alloc var_0\r\n//! mov ecx, [esp - 28]             ; alloc var_1\r\n//! jmp short L0\r\n//! ; state-switch end\r\n//! @endverbatim\r\n//!\r\n//! You can see that the state-switch section was generated (see L0_Switch0).\r\n//! The compiler is unable to restore state immediately when emitting the\r\n//! forward jump (the code is generated from first to last instruction and\r\n//! the target state is simply not known at this time).\r\n//!\r\n//! To tell @c Compiler that you want to embed state-switch code before jump\r\n//! it's needed to create backward jump (where also processor expects that it\r\n//! will be taken). To demonstrate the possibility to embed state-switch before\r\n//! jump we use slightly modified code:\r\n//!\r\n//! @code\r\n//! X86Compiler c;\r\n//! \r\n//! c.newFunc(kX86FuncConvDefault, FuncBuilder0<Void>());\r\n//! c.getFunc()->setHint(kFuncHintNaked, true);\r\n//! \r\n//! // Labels.\r\n//! Label L0 = c.newLabel();\r\n//! \r\n//! // Variables.\r\n//! GpVar var0 = c.newGpVar();\r\n//! GpVar var1 = c.newGpVar();\r\n//! \r\n//! // Cleanup. After these two lines, the var0 and var1 will be always stored\r\n//! // in registers. Our example is very small, but in larger code the var0 can\r\n//! // be spilled by xor(var1, var1).\r\n//! c.xor_(var0, var0);\r\n//! c.xor_(var1, var1);\r\n//! // State:\r\n//! //   var0 - register.\r\n//! //   var1 - register.\r\n//! \r\n//! // We manually spill these variables.\r\n//! c.spill(var0);\r\n//! c.spill(var1);\r\n//! // State:\r\n//! //   var0 - memory.\r\n//! //   var1 - memory.\r\n//! \r\n//! // Bind our label here.\r\n//! c.bind(L0);\r\n//! \r\n//! // Do something, the variables will be allocated again.\r\n//! c.add(var0, 1);\r\n//! c.add(var1, 2);\r\n//! // State:\r\n//! //   var0 - register.\r\n//! //   var1 - register.\r\n//! \r\n//! // Backward conditional jump to L0. The default behavior is that it is taken\r\n//! // so state-change code will be embedded here.\r\n//! c.je(L0);\r\n//! \r\n//! c.endFunc();\r\n//! @endcode\r\n//!\r\n//! The output:\r\n//!\r\n//! @verbatim\r\n//! xor ecx, ecx                    ; xor var_0, var_0\r\n//! xor edx, edx                    ; xor var_1, var_1\r\n//! mov [esp - 24], ecx             ; spill var_0\r\n//! mov [esp - 28], edx             ; spill var_1\r\n//! L.2:\r\n//! mov ecx, [esp - 24]             ; alloc var_0\r\n//! add ecx, 1                      ; add var_0, 1\r\n//! mov edx, [esp - 28]             ; alloc var_1\r\n//! add edx, 2                      ; add var_1, 2\r\n//!\r\n//! ; state-switch begin\r\n//! mov [esp - 24], ecx             ; spill var_0\r\n//! mov [esp - 28], edx             ; spill var_1\r\n//! ; state-switch end\r\n//!\r\n//! je short L.2\r\n//! ret\r\n//! @endverbatim\r\n//!\r\n//! Please notice where the state-switch section is located. The @c Compiler \r\n//! decided that jump is likely to be taken so the state change is embedded\r\n//! before the conditional jump. To change this behavior into the previous\r\n//! case it's needed to add a hint (@c kCondHintLikely or @c kCondHintUnlikely).\r\n//!\r\n//! Replacing the <code>c.je(L0)</code> by <code>c.je(L0, kCondHintUnlikely)\r\n//! will generate code like this:\r\n//!\r\n//! @verbatim\r\n//! xor ecx, ecx                    ; xor var_0, var_0\r\n//! xor edx, edx                    ; xor var_1, var_1\r\n//! mov [esp - 24], ecx             ; spill var_0\r\n//! mov [esp - 28], edx             ; spill var_1\r\n//! L0:\r\n//! mov ecx, [esp - 24]             ; alloc var_0\r\n//! add ecx, 1                      ; add var_0, a\r\n//! mov edx, [esp - 28]             ; alloc var_1\r\n//! add edx, 2                      ; add var_1, 2\r\n//! je L0_Switch, 2\r\n//! ret\r\n//!\r\n//! ; state-switch begin\r\n//! L0_Switch:\r\n//! mov [esp - 24], ecx             ; spill var_0\r\n//! mov [esp - 28], edx             ; spill var_1\r\n//! jmp short L0\r\n//! ; state-switch end\r\n//! @endverbatim\r\n//!\r\n//! This section provided information about how state-change works. The \r\n//! behavior is deterministic and it can be overridden.\r\n//!\r\n//! @section AsmJit_Compiler_AdvancedCodeGeneration Advanced Code Generation\r\n//!\r\n//! This section describes advanced method of code generation available to\r\n//! @c Compiler (but also to @c Assembler). When emitting code to instruction\r\n//! stream the methods like @c mov(), @c add(), @c sub() can be called directly\r\n//! (advantage is static-type control performed also by C++ compiler) or \r\n//! indirectly using @c emit() method. The @c emit() method needs only \r\n//! instruction code and operands.\r\n//!\r\n//! Example of code generating by standard type-safe API:\r\n//!\r\n//! @code\r\n//! X86Compiler c;\r\n//! GpVar var0 = c.newGpVar();\r\n//! GpVar var1 = c.newGpVar();\r\n//!\r\n//! ...\r\n//!\r\n//! c.mov(var0, imm(0));\r\n//! c.add(var0, var1);\r\n//! c.sub(var0, var1);\r\n//! @endcode\r\n//!\r\n//! The code above can be rewritten as:\r\n//!\r\n//! @code\r\n//! X86Compiler c;\r\n//! GpVar var0 = c.newGpVar();\r\n//! GpVar var1 = c.newGpVar();\r\n//!\r\n//! ...\r\n//!\r\n//! c.emit(kX86InstMov, var0, imm(0));\r\n//! c.emit(kX86InstAdd, var0, var1);\r\n//! c.emit(kX86InstSub, var0, var1);\r\n//! @endcode\r\n//!\r\n//! The advantage of first snippet is very friendly API and type-safe control\r\n//! that is controlled by the C++ compiler. The advantage of second snippet is\r\n//! availability to replace or generate instruction code in different places.\r\n//! See the next example how the @c emit() method can be used to generate\r\n//! abstract code.\r\n//!\r\n//! Use case:\r\n//!\r\n//! @code\r\n//! bool emitArithmetic(Compiler& c, XmmVar& var0, XmmVar& var1, const char* op)\r\n//! {\r\n//!   uint code = kInstNone;\r\n//!\r\n//!   if (strcmp(op, \"ADD\") == 0)\r\n//!     code = kX86InstAddSS;\r\n//!   else if (strcmp(op, \"SUBTRACT\") == 0)\r\n//!     code = kX86InstSubSS;\r\n//!   else if (strcmp(op, \"MULTIPLY\") == 0)\r\n//!     code = kX86InstMulSS;\r\n//!   else if (strcmp(op, \"DIVIDE\") == 0)\r\n//!     code = kX86InstDivSS;\r\n//!   else\r\n//!     // Invalid parameter?\r\n//!     return false;\r\n//!\r\n//!   c.emit(code, var0, var1);\r\n//! }\r\n//! @endcode\r\n//!\r\n//! Other use cases are waiting for you! Be sure that instruction you are \r\n//! emitting is correct and encodable, because if not, Assembler will set\r\n//! error code to @c kErrorUnknownInstruction.\r\n//!\r\n//! @section AsmJit_Compiler_CompilerDetails Compiler Details\r\n//!\r\n//! This section is here for people interested in the compiling process. There\r\n//! are few steps that must be done for each compiled function (or your code).\r\n//!\r\n//! When your @c Compiler instance is ready, you can create function and add\r\n//! compiler-items using intrinsics or higher level methods implemented by the\r\n//! @c AsmJit::Compiler. When you are done (all instructions serialized) you\r\n//! should call @c AsmJit::Compiler::make() method which will analyze your code,\r\n//! allocate registers and memory for local variables and serialize all items\r\n//! to @c AsmJit::Assembler instance. Next steps shows what's done internally\r\n//! before code is serialized into @c AsmJit::Assembler\r\n//!   (implemented in @c AsmJit::Compiler::serialize() method).\r\n//!\r\n//! 1. Compiler try to match function and end-function items (these items\r\n//!    define function body and blocks).\r\n//!\r\n//! 2. For all items inside the function-body the virtual functions\r\n//!    are called in this order:\r\n//!    - CompilerItem::prepare()\r\n//!    - CompilerItem::translate()\r\n//!    - CompilerItem::emit()\r\n//!    - CompilerItem::post()\r\n//!\r\n//!    There is some extra work when emitting function prolog / epilog and\r\n//!    register allocator.\r\n//!\r\n//! 3. Emit jump tables data.\r\n//!\r\n//! When everything here ends, @c AsmJit::Assembler contains binary stream\r\n//! that needs only relocation to be callable by C/C++ code.\r\n//!\r\n//! @section AsmJit_Compiler_Differences Summary of Differences between @c Assembler and @c Compiler\r\n//!\r\n//! - Instructions are not translated to machine code immediately, they are\r\n//!   stored as emmitables, see @c AsmJit::CompilerItem.\r\n//! - Contains function builder and ability to call other functions.\r\n//! - Contains register allocator and variable management.\r\n//! - Contains a lot of helper methods to simplify the code generation not\r\n//!   available/possible in @c AsmJit::Assembler.\r\n//! - Ability to pre-process or post-process the code which is being generated.\r\nstruct X86Compiler : public Compiler\r\n{\r\n  // Special X86 instructions:\r\n  // - cpuid,\r\n  // - cbw, cwd, cwde, cdq, cdqe, cqo\r\n  // - cmpxchg\r\n  // - cmpxchg8b, cmpxchg16b,\r\n  // - daa, das,\r\n  // - imul, mul, idiv, div,\r\n  // - mov_ptr\r\n  // - lahf, sahf\r\n  // - maskmovq, maskmovdqu\r\n  // - enter, leave\r\n  // - ret\r\n  // - monitor, mwait\r\n  // - pop, popad, popfd, popfq,\r\n  // - push, pushad, pushfd, pushfq\r\n  // - rcl, rcr, rol, ror, sal, sar, shl, shr\r\n  // - shld, shrd\r\n  // - rdtsc. rdtscp\r\n  // - lodsb, lodsd, lodsq, lodsw\r\n  // - movsb, movsd, movsq, movsw\r\n  // - stosb, stosd, stosq, stosw\r\n  // - cmpsb, cmpsd, cmpsq, cmpsw\r\n  // - scasb, scasd, scasq, scasw\r\n  //\r\n  // Special X87 instructions:\r\n  // - fisttp\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Construction / Destruction]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Create a @ref X86Compiler instance.\r\n  ASMJIT_API X86Compiler(Context* context = JitContext::getGlobal());\r\n  //! @brief Destroy the @ref X86Compiler instance.\r\n  ASMJIT_API ~X86Compiler();\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Accessors]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Get current function as @ref X86CompilerFuncDecl.\r\n  //!\r\n  //! This method can be called within @c newFunc() and @c endFunc()\r\n  //! block to get current function you are working with. It's recommended\r\n  //! to store @c AsmJit::Function pointer returned by @c newFunc<> method,\r\n  //! because this allows you in future implement function sections outside of\r\n  //! function itself (yeah, this is possible!).\r\n  inline X86CompilerFuncDecl* getFunc() const\r\n  { return reinterpret_cast<X86CompilerFuncDecl*>(_func); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Function Builder]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Create a new function.\r\n  //!\r\n  //! @param cconv Calling convention to use (see @c kX86FuncConv enum)\r\n  //! @param params Function arguments prototype.\r\n  //!\r\n  //! This method is usually used as a first step when generating functions\r\n  //! by @c Compiler. First parameter @a cconv specifies function calling\r\n  //! convention to use. Second parameter @a params specifies function\r\n  //! arguments. To create function arguments are used templates\r\n  //! @c BuildFunction0<>, @c BuildFunction1<...>, @c BuildFunction2<...>,\r\n  //! etc...\r\n  //!\r\n  //! Templates with BuildFunction prefix are used to generate argument IDs\r\n  //! based on real C++ types. See next example how to generate function with\r\n  //! two 32-bit integer arguments.\r\n  //!\r\n  //! @code\r\n  //! // Building function using AsmJit::Compiler example.\r\n  //!\r\n  //! // Compiler instance\r\n  //! X86Compiler c;\r\n  //!\r\n  //! // Begin of function (also emits function @c Prolog)\r\n  //! c.newFunc(\r\n  //!   // Default calling convention (32-bit cdecl or 64-bit for host OS)\r\n  //!   kX86FuncConvDefault,\r\n  //!   // Using function builder to generate arguments list\r\n  //!   BuildFunction2<int, int>());\r\n  //!\r\n  //! // End of function (also emits function @c Epilog)\r\n  //! c.endFunc();\r\n  //! @endcode\r\n  //!\r\n  //! You can see that building functions is really easy. Previous code snipped\r\n  //! will generate code for function with two 32-bit integer arguments. You\r\n  //! can access arguments by @c AsmJit::Function::argument() method. Arguments\r\n  //! are indexed from 0 (like everything in C).\r\n  //!\r\n  //! @code\r\n  //! // Accessing function arguments through AsmJit::Function example.\r\n  //!\r\n  //! // Compiler instance\r\n  //! X86Compiler c;\r\n  //!\r\n  //! // Begin of function (also emits function @c Prolog)\r\n  //! c.newFunc(\r\n  //!   // Default calling convention (32-bit cdecl or 64-bit for host OS)\r\n  //!   kX86FuncConvDefault,\r\n  //!   // Using function builder to generate arguments list\r\n  //!   BuildFunction2<int, int>());\r\n  //!\r\n  //! // Arguments are like other variables, you need to reference them by\r\n  //! // variable operands:\r\n  //! GpVar a0 = c.getGpArg(0);\r\n  //! GpVar a1 = c.getGpArg(1);\r\n  //!\r\n  //! // Use them.\r\n  //! c.add(a0, a1);\r\n  //!\r\n  //! // End of function (emits function epilog and return)\r\n  //! c.endFunc();\r\n  //! @endcode\r\n  //!\r\n  //! Arguments are like variables. How to manipulate with variables is\r\n  //! documented in @c AsmJit::Compiler, variables section.\r\n  //!\r\n  //! @note To get current function use @c currentFunction() method or save\r\n  //! pointer to @c AsmJit::Function returned by @c AsmJit::Compiler::newFunc<>\r\n  //! method. Recommended is to save the pointer.\r\n  //!\r\n  //! @sa @c BuildFunction0, @c BuildFunction1, @c BuildFunction2, ...\r\n  inline X86CompilerFuncDecl* newFunc(uint32_t convention, const FuncPrototype& func)\r\n  { return newFunc_(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); }\r\n\r\n  //! @brief Create a new function (low level version).\r\n  //!\r\n  //! @param cconv Function calling convention (see @c AsmJit::kX86FuncConv).\r\n  //! @param args Function arguments (see @c AsmJit::kX86VarType).\r\n  //! @param count Arguments count.\r\n  //!\r\n  //! This method is internally called from @c newFunc() method and\r\n  //! contains arguments thats used internally by @c AsmJit::Compiler.\r\n  //!\r\n  //! @note To get current function use @c currentFunction() method.\r\n  ASMJIT_API X86CompilerFuncDecl* newFunc_(uint32_t convenion, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount);\r\n\r\n  //! @brief End of current function scope and all variables.\r\n  ASMJIT_API X86CompilerFuncDecl* endFunc();\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Emit]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Emit instruction with no operand.\r\n  ASMJIT_API void _emitInstruction(uint32_t code);\r\n\r\n  //! @brief Emit instruction with one operand.\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0);\r\n\r\n  //! @brief Emit instruction with two operands.\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1);\r\n\r\n  //! @brief Emit instruction with three operands.\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2);\r\n\r\n  //! @brief Emit instruction with four operands (Special instructions).\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3);\r\n\r\n  //! @brief Emit instruction with five operands (Special instructions).\r\n  ASMJIT_API void _emitInstruction(uint32_t code, const Operand* o0, const Operand* o1, const Operand* o2, const Operand* o3, const Operand* o4);\r\n\r\n  //! @brief Private method for emitting jcc.\r\n  ASMJIT_API void _emitJcc(uint32_t code, const Label* label, uint32_t hint);\r\n\r\n  //! @brief Private method for emitting function call.\r\n  ASMJIT_API X86CompilerFuncCall* _emitCall(const Operand* o0);\r\n\r\n  //! @brief Private method for returning a value from the function.\r\n  ASMJIT_API void _emitReturn(const Operand* first, const Operand* second);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Align]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Align target buffer to @a m bytes.\r\n  //!\r\n  //! Typical usage of this is to align labels at start of the inner loops.\r\n  //!\r\n  //! Inserts @c nop() instructions or CPU optimized NOPs.\r\n  ASMJIT_API void align(uint32_t m);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Label]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Create and return new label.\r\n  ASMJIT_API Label newLabel();\r\n\r\n  //! @brief Bind label to the current offset.\r\n  //!\r\n  //! @note Label can be bound only once!\r\n  ASMJIT_API void bind(const Label& label);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Variables]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Get compiler variable at @a id.\r\n  inline X86CompilerVar* _getVar(uint32_t id) const\r\n  {\r\n    ASMJIT_ASSERT(id != kInvalidValue);\r\n    return reinterpret_cast<X86CompilerVar*>(_vars[id & kOperandIdValueMask]);\r\n  }\r\n\r\n  //! @internal\r\n  //!\r\n  //! @brief Create a new variable data.\r\n  ASMJIT_API X86CompilerVar* _newVar(const char* name, uint32_t type, uint32_t size);\r\n\r\n  //! @brief Create a new general-purpose variable.\r\n  ASMJIT_API GpVar newGpVar(uint32_t varType = kX86VarTypeGpz, const char* name = NULL);\r\n  //! @brief Get argument as general-purpose variable.\r\n  ASMJIT_API GpVar getGpArg(uint32_t argIndex);\r\n\r\n  //! @brief Create a new MM variable.\r\n  ASMJIT_API MmVar newMmVar(uint32_t varType = kX86VarTypeMm, const char* name = NULL);\r\n  //! @brief Get argument as MM variable.\r\n  ASMJIT_API MmVar getMmArg(uint32_t argIndex);\r\n\r\n  //! @brief Create a new XMM variable.\r\n  ASMJIT_API XmmVar newXmmVar(uint32_t varType = kX86VarTypeXmm, const char* name = NULL);\r\n  //! @brief Get argument as XMM variable.\r\n  ASMJIT_API XmmVar getXmmArg(uint32_t argIndex);\r\n\r\n  //! @internal\r\n  //!\r\n  //! @brief Serialize variable hint.\r\n  ASMJIT_API void _vhint(Var& var, uint32_t hintId, uint32_t hintValue);\r\n\r\n  //! @brief Alloc variable @a var.\r\n  ASMJIT_API void alloc(Var& var);\r\n  //! @brief Alloc variable @a var using @a regIndex as a register index.\r\n  ASMJIT_API void alloc(Var& var, uint32_t regIndex);\r\n  //! @brief Alloc variable @a var using @a reg as a demanded register.\r\n  ASMJIT_API void alloc(Var& var, const Reg& reg);\r\n  //! @brief Spill variable @a var.\r\n  ASMJIT_API void spill(Var& var);\r\n  //! @brief Save variable @a var if modified.\r\n  ASMJIT_API void save(Var& var);\r\n  //! @brief Unuse variable @a var.\r\n  ASMJIT_API void unuse(Var& var);\r\n\r\n  //! @brief Get memory home of variable @a var.\r\n  ASMJIT_API void getMemoryHome(Var& var, GpVar* home, int* displacement = NULL);\r\n\r\n  //! @brief Set memory home of variable @a var.\r\n  //!\r\n  //! Default memory home location is on stack (ESP/RSP), but when needed the\r\n  //! bebahior can be changed by this method.\r\n  //!\r\n  //! It is an error to chaining memory home locations. For example the given \r\n  //! code is invalid:\r\n  //!\r\n  //! @code\r\n  //! X86Compiler c;\r\n  //!\r\n  //! ...\r\n  //! GpVar v0 = c.newGpVar();\r\n  //! GpVar v1 = c.newGpVar();\r\n  //! GpVar v2 = c.newGpVar();\r\n  //! GpVar v3 = c.newGpVar();\r\n  //!\r\n  //! c.setMemoryHome(v1, v0, 0); // Allowed, [v0] is memory home for v1.\r\n  //! c.setMemoryHome(v2, v0, 4); // Allowed, [v0+4] is memory home for v2.\r\n  //! c.setMemoryHome(v3, v2);    // CHAINING, NOT ALLOWED!\r\n  //! @endcode\r\n  ASMJIT_API void setMemoryHome(Var& var, const GpVar& home, int displacement = 0);\r\n\r\n  //! @brief Get priority of variable @a var.\r\n  ASMJIT_API uint32_t getPriority(Var& var) const;\r\n  //! @brief Set priority of variable @a var to @a priority.\r\n  ASMJIT_API void setPriority(Var& var, uint32_t priority);\r\n\r\n  //! @brief Get save-on-unuse @a var property.\r\n  ASMJIT_API bool getSaveOnUnuse(Var& var) const;\r\n  //! @brief Set save-on-unuse @a var property to @a value.\r\n  ASMJIT_API void setSaveOnUnuse(Var& var, bool value);\r\n\r\n  //! @brief Rename variable @a var to @a name.\r\n  //!\r\n  //! @note Only new name will appear in the logger.\r\n  ASMJIT_API void rename(Var& var, const char* name);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [State]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @internal\r\n  //!\r\n  //! @brief Create a new @ref X86CompilerState.\r\n  ASMJIT_API X86CompilerState* _newState(uint32_t memVarsCount);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Make]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Make is convenience method to make currently serialized code and\r\n  //! return pointer to generated function.\r\n  //!\r\n  //! What you need is only to cast this pointer to your function type and call\r\n  //! it. Note that if there was an error and calling @c getError() method doesn't\r\n  //! return @c kErrorOk (zero) then this function always returns @c NULL and\r\n  //! error value remains the same.\r\n  ASMJIT_API virtual void* make();\r\n\r\n  //! @brief Method that will emit everything to @c Assembler instance @a a.\r\n  ASMJIT_API virtual void serialize(Assembler& a);\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Data]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Get target from label @a id.\r\n  inline X86CompilerTarget* _getTarget(uint32_t id)\r\n  {\r\n    ASMJIT_ASSERT((id & kOperandIdTypeMask) == kOperandIdTypeLabel);\r\n    return reinterpret_cast<X86CompilerTarget*>(_targets[id & kOperandIdValueMask]);\r\n  }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Embed]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Add 8-bit integer data to the instuction stream.\r\n  inline void db(uint8_t  x) { embed(&x, 1); }\r\n  //! @brief Add 16-bit integer data to the instuction stream.\r\n  inline void dw(uint16_t x) { embed(&x, 2); }\r\n  //! @brief Add 32-bit integer data to the instuction stream.\r\n  inline void dd(uint32_t x) { embed(&x, 4); }\r\n  //! @brief Add 64-bit integer data to the instuction stream.\r\n  inline void dq(uint64_t x) { embed(&x, 8); }\r\n\r\n  //! @brief Add 8-bit integer data to the instuction stream.\r\n  inline void dint8(int8_t x) { embed(&x, sizeof(int8_t)); }\r\n  //! @brief Add 8-bit integer data to the instuction stream.\r\n  inline void duint8(uint8_t x) { embed(&x, sizeof(uint8_t)); }\r\n\r\n  //! @brief Add 16-bit integer data to the instuction stream.\r\n  inline void dint16(int16_t x) { embed(&x, sizeof(int16_t)); }\r\n  //! @brief Add 16-bit integer data to the instuction stream.\r\n  inline void duint16(uint16_t x) { embed(&x, sizeof(uint16_t)); }\r\n\r\n  //! @brief Add 32-bit integer data to the instuction stream.\r\n  inline void dint32(int32_t x) { embed(&x, sizeof(int32_t)); }\r\n  //! @brief Add 32-bit integer data to the instuction stream.\r\n  inline void duint32(uint32_t x) { embed(&x, sizeof(uint32_t)); }\r\n\r\n  //! @brief Add 64-bit integer data to the instuction stream.\r\n  inline void dint64(int64_t x) { embed(&x, sizeof(int64_t)); }\r\n  //! @brief Add 64-bit integer data to the instuction stream.\r\n  inline void duint64(uint64_t x) { embed(&x, sizeof(uint64_t)); }\r\n\r\n  //! @brief Add system-integer data to the instuction stream.\r\n  inline void dintptr(intptr_t x) { embed(&x, sizeof(intptr_t)); }\r\n  //! @brief Add system-integer data to the instuction stream.\r\n  inline void duintptr(uintptr_t x) { embed(&x, sizeof(uintptr_t)); }\r\n\r\n  //! @brief Add float data to the instuction stream.\r\n  inline void dfloat(float x) { embed(&x, sizeof(float)); }\r\n  //! @brief Add double data to the instuction stream.\r\n  inline void ddouble(double x) { embed(&x, sizeof(double)); }\r\n\r\n  //! @brief Add pointer data to the instuction stream.\r\n  inline void dptr(void* x) { embed(&x, sizeof(void*)); }\r\n\r\n  //! @brief Add MM data to the instuction stream.\r\n  inline void dmm(const MmData& x) { embed(&x, sizeof(MmData)); }\r\n  //! @brief Add XMM data to the instuction stream.\r\n  inline void dxmm(const XmmData& x) { embed(&x, sizeof(XmmData)); }\r\n\r\n  //! @brief Add data to the instuction stream.\r\n  inline void data(const void* data, size_t size) { embed(data, size); }\r\n\r\n  //! @brief Add data in a given structure instance to the instuction stream.\r\n  template<typename T>\r\n  inline void dstruct(const T& x) { embed(&x, sizeof(T)); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Custom Instructions]\r\n  // --------------------------------------------------------------------------\r\n\r\n  // These emitters are used by custom compiler code (register alloc / spill,\r\n  // prolog / epilog generator, ...).\r\n\r\n  inline void emit(uint32_t code)\r\n  { _emitInstruction(code); }\r\n\r\n  inline void emit(uint32_t code, const Operand& o0)\r\n  { _emitInstruction(code, &o0); }\r\n\r\n  inline void emit(uint32_t code, const Operand& o0, const Operand& o1)\r\n  { _emitInstruction(code, &o0, &o1); }\r\n\r\n  inline void emit(uint32_t code, const Operand& o0, const Operand& o1, const Operand& o2)\r\n  { _emitInstruction(code, &o0, &o1, &o2); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [X86 Instructions]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Add with Carry.\r\n  inline void adc(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n\r\n  //! @brief Add with Carry.\r\n  inline void adc(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n\r\n  //! @brief Add with Carry.\r\n  inline void adc(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n\r\n  //! @brief Add with Carry.\r\n  inline void adc(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n\r\n  //! @brief Add with Carry.\r\n  inline void adc(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdc, &dst, &src); }\r\n\r\n  //! @brief Add.\r\n  inline void add(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n\r\n  //! @brief Add.\r\n  inline void add(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n\r\n  //! @brief Add.\r\n  inline void add(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n\r\n  //! @brief Add.\r\n  inline void add(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n\r\n  //! @brief Add.\r\n  inline void add(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAdd, &dst, &src); }\r\n\r\n  //! @brief Logical And.\r\n  inline void and_(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n\r\n  //! @brief Logical And.\r\n  inline void and_(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n\r\n  //! @brief Logical And.\r\n  inline void and_(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n\r\n  //! @brief Logical And.\r\n  inline void and_(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n\r\n  //! @brief Logical And.\r\n  inline void and_(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstAnd, &dst, &src); }\r\n\r\n  //! @brief Bit Scan Forward.\r\n  inline void bsf(const GpVar& dst, const GpVar& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsf, &dst, &src);\r\n  }\r\n\r\n  //! @brief Bit Scan Forward.\r\n  inline void bsf(const GpVar& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsf, &dst, &src);\r\n  }\r\n\r\n  //! @brief Bit Scan Reverse.\r\n  inline void bsr(const GpVar& dst, const GpVar& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsr, &dst, &src);\r\n  }\r\n\r\n  //! @brief Bit Scan Reverse.\r\n  inline void bsr(const GpVar& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstBsr, &dst, &src);\r\n  }\r\n\r\n  //! @brief Byte swap (32-bit or 64-bit registers only) (i486).\r\n  inline void bswap(const GpVar& dst)\r\n  {\r\n    // ASMJIT_ASSERT(dst.getRegType() == kX86RegGPD || dst.getRegType() == kX86RegGPQ);\r\n    _emitInstruction(kX86InstBSwap, &dst);\r\n  }\r\n\r\n  //! @brief Bit test.\r\n  inline void bt(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n\r\n  //! @brief Bit test.\r\n  inline void bt(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n\r\n  //! @brief Bit test.\r\n  inline void bt(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n\r\n  //! @brief Bit test.\r\n  inline void bt(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBt, &dst, &src); }\r\n\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n\r\n  //! @brief Bit test and complement.\r\n  inline void btc(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtc, &dst, &src); }\r\n\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n\r\n  //! @brief Bit test and reset.\r\n  inline void btr(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBtr, &dst, &src); }\r\n\r\n  //! @brief Bit test and set.\r\n  inline void bts(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n\r\n  //! @brief Bit test and set.\r\n  inline void bts(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n\r\n  //! @brief Bit test and set.\r\n  inline void bts(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n\r\n  //! @brief Bit test and set.\r\n  inline void bts(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstBts, &dst, &src); }\r\n\r\n  //! @brief Call Procedure.\r\n  inline X86CompilerFuncCall* call(const GpVar& dst)\r\n  { return _emitCall(&dst); }\r\n\r\n  //! @brief Call Procedure.\r\n  inline X86CompilerFuncCall* call(const Mem& dst)\r\n  { return _emitCall(&dst); }\r\n\r\n  //! @brief Call Procedure.\r\n  inline X86CompilerFuncCall* call(const Imm& dst)\r\n  { return _emitCall(&dst); }\r\n\r\n  //! @brief Call Procedure.\r\n  //! @overload\r\n  inline X86CompilerFuncCall* call(void* dst)\r\n  {\r\n    Imm imm((sysint_t)dst);\r\n    return _emitCall(&imm);\r\n  }\r\n\r\n  //! @brief Call Procedure.\r\n  inline X86CompilerFuncCall* call(const Label& label)\r\n  { return _emitCall(&label); }\r\n\r\n  //! @brief Convert Byte to Word (Sign Extend).\r\n  inline void cbw(const GpVar& dst)\r\n  { _emitInstruction(kX86InstCbw, &dst); }\r\n\r\n  //! @brief Convert Word to DWord (Sign Extend).\r\n  inline void cwd(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCwd, &dst, &src); }\r\n\r\n  //! @brief Convert Word to DWord (Sign Extend).\r\n  inline void cwde(const GpVar& dst)\r\n  { _emitInstruction(kX86InstCwde, &dst); }\r\n\r\n  //! @brief Convert Word to DWord (Sign Extend).\r\n  inline void cdq(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCdq, &dst, &src); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Convert DWord to QWord (Sign Extend).\r\n  inline void cdqe(const GpVar& dst)\r\n  { _emitInstruction(kX86InstCdqe, &dst); }\r\n#endif // ASMJIT_X64\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Convert QWord to DQWord (Sign Extend).\r\n  inline void cqo(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCqo, &dst, &src); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Clear Carry flag\r\n  //!\r\n  //! This instruction clears the CF flag in the EFLAGS register.\r\n  inline void clc()\r\n  { _emitInstruction(kX86InstClc); }\r\n\r\n  //! @brief Clear Direction flag\r\n  //!\r\n  //! This instruction clears the DF flag in the EFLAGS register.\r\n  inline void cld()\r\n  { _emitInstruction(kX86InstCld); }\r\n\r\n  //! @brief Complement Carry Flag.\r\n  //!\r\n  //! This instruction complements the CF flag in the EFLAGS register.\r\n  //! (CF = NOT CF)\r\n  inline void cmc()\r\n  { _emitInstruction(kX86InstCmc); }\r\n\r\n  //! @brief Conditional Move.\r\n  inline void cmov(kX86Cond cc, const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); }\r\n\r\n  //! @brief Conditional Move.\r\n  inline void cmov(kX86Cond cc, const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(X86Util::getCMovccInstFromCond(cc), &dst, &src); }\r\n\r\n  //! @brief Conditional Move.\r\n  inline void cmova  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovA  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmova  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovA  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovae (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovAE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovae (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovAE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovb  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovB  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovb  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovB  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovbe (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovBE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovbe (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovBE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovc  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovC  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovc  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovC  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmove  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovE  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmove  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovE  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovg  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovG  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovg  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovG  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovge (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovGE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovge (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovGE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovl  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovL  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovl  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovL  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovle (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovLE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovle (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovLE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovna (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNA , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovna (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNA , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnae(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNAE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnae(const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNAE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnb (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNB , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnb (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNB , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnbe(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNBE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnbe(const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNBE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnc (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNC , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnc (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNC , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovne (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovne (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovng (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNG , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovng (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNG , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnge(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNGE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnge(const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNGE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnl (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNL , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnl (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNL , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnle(const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNLE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnle(const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNLE, &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovno (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovno (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnp (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNP , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnp (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNP , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovns (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNS , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovns (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNS , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnz (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovNZ , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovnz (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovNZ , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovo  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovO  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovo  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovO  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovp  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovP  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovp  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovP  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpe (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovPE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpe (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovPE , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpo (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovPO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovpo (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovPO , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovs  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovS  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovs  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovS  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovz  (const GpVar& dst, const GpVar& src) { _emitInstruction(kX86InstCMovZ  , &dst, &src); }\r\n  //! @brief Conditional Move.\r\n  inline void cmovz  (const GpVar& dst, const Mem& src)   { _emitInstruction(kX86InstCMovZ  , &dst, &src); }\r\n\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n\r\n  //! @brief Compare Two Operands.\r\n  inline void cmp(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstCmp, &dst, &src); }\r\n\r\n  //! @brief Compare and Exchange (i486).\r\n  inline void cmpxchg(const GpVar cmp_1_eax, const GpVar& cmp_2, const GpVar& src)\r\n  {\r\n    ASMJIT_ASSERT(cmp_1_eax.getId() != src.getId());\r\n    _emitInstruction(kX86InstCmpXCHG, &cmp_1_eax, &cmp_2, &src);\r\n  }\r\n\r\n  //! @brief Compare and Exchange (i486).\r\n  inline void cmpxchg(const GpVar cmp_1_eax, const Mem& cmp_2, const GpVar& src)\r\n  {\r\n    ASMJIT_ASSERT(cmp_1_eax.getId() != src.getId());\r\n    _emitInstruction(kX86InstCmpXCHG, &cmp_1_eax, &cmp_2, &src);\r\n  }\r\n\r\n  //! @brief Compares the 64-bit value in EDX:EAX with the memory operand (Pentium).\r\n  //!\r\n  //! If the values are equal, then this instruction stores the 64-bit value\r\n  //! in ECX:EBX into the memory operand and sets the zero flag. Otherwise,\r\n  //! this instruction copies the 64-bit memory operand into the EDX:EAX\r\n  //! registers and clears the zero flag.\r\n  inline void cmpxchg8b(\r\n    const GpVar& cmp_edx, const GpVar& cmp_eax,\r\n    const GpVar& cmp_ecx, const GpVar& cmp_ebx,\r\n    const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(cmp_edx.getId() != cmp_eax.getId() &&\r\n                  cmp_eax.getId() != cmp_ecx.getId() &&\r\n                  cmp_ecx.getId() != cmp_ebx.getId());\r\n\r\n    _emitInstruction(kX86InstCmpXCHG8B, &cmp_edx, &cmp_eax, &cmp_ecx, &cmp_ebx, &dst);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Compares the 128-bit value in RDX:RAX with the memory operand (X64).\r\n  //!\r\n  //! If the values are equal, then this instruction stores the 128-bit value\r\n  //! in RCX:RBX into the memory operand and sets the zero flag. Otherwise,\r\n  //! this instruction copies the 128-bit memory operand into the RDX:RAX\r\n  //! registers and clears the zero flag.\r\n  inline void cmpxchg16b(\r\n    const GpVar& cmp_edx, const GpVar& cmp_eax,\r\n    const GpVar& cmp_ecx, const GpVar& cmp_ebx,\r\n    const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(cmp_edx.getId() != cmp_eax.getId() &&\r\n                  cmp_eax.getId() != cmp_ecx.getId() &&\r\n                  cmp_ecx.getId() != cmp_ebx.getId());\r\n\r\n    _emitInstruction(kX86InstCmpXCHG16B, &cmp_edx, &cmp_eax, &cmp_ecx, &cmp_ebx, &dst);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief CPU Identification (i486).\r\n  inline void cpuid(\r\n    const GpVar& inout_eax,\r\n    const GpVar& out_ebx,\r\n    const GpVar& out_ecx,\r\n    const GpVar& out_edx)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(inout_eax.getId() != out_ebx.getId() &&\r\n                  out_ebx.getId() != out_ecx.getId() &&\r\n                  out_ecx.getId() != out_edx.getId());\r\n\r\n    _emitInstruction(kX86InstCpuId, &inout_eax, &out_ebx, &out_ecx, &out_edx);\r\n  }\r\n\r\n#if defined(ASMJIT_X86)\r\n  inline void daa(const GpVar& dst)\r\n  { _emitInstruction(kX86InstDaa, &dst); }\r\n#endif // ASMJIT_X86\r\n\r\n#if defined(ASMJIT_X86)\r\n  inline void das(const GpVar& dst)\r\n  { _emitInstruction(kX86InstDas, &dst); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Decrement by 1.\r\n  //! @note This instruction can be slower than sub(dst, 1)\r\n  inline void dec(const GpVar& dst)\r\n  { _emitInstruction(kX86InstDec, &dst); }\r\n\r\n  //! @brief Decrement by 1.\r\n  //! @note This instruction can be slower than sub(dst, 1)\r\n  inline void dec(const Mem& dst)\r\n  { _emitInstruction(kX86InstDec, &dst); }\r\n\r\n  //! @brief Unsigned divide.\r\n  //!\r\n  //! This instruction divides (unsigned) the value in the AL, AX, or EAX\r\n  //! register by the source operand and stores the result in the AX,\r\n  //! DX:AX, or EDX:EAX registers.\r\n  inline void div(const GpVar& dst_rem, const GpVar& dst_quot, const GpVar& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId());\r\n    _emitInstruction(kX86InstDiv, &dst_rem, &dst_quot, &src);\r\n  }\r\n\r\n  //! @brief Unsigned divide.\r\n  //! @overload\r\n  inline void div(const GpVar& dst_rem, const GpVar& dst_quot, const Mem& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId());\r\n    _emitInstruction(kX86InstDiv, &dst_rem, &dst_quot, &src);\r\n  }\r\n\r\n#if ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n  //! @brief Make Stack Frame for Procedure Parameters.\r\n  inline void enter(const Imm& imm16, const Imm& imm8)\r\n  { _emitInstruction(kX86InstEnter, &imm16, &imm8); }\r\n#endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n\r\n  //! @brief Signed divide.\r\n  //!\r\n  //! This instruction divides (signed) the value in the AL, AX, or EAX\r\n  //! register by the source operand and stores the result in the AX,\r\n  //! DX:AX, or EDX:EAX registers.\r\n  inline void idiv(const GpVar& dst_rem, const GpVar& dst_quot, const GpVar& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId());\r\n    _emitInstruction(kX86InstIDiv, &dst_rem, &dst_quot, &src);\r\n  }\r\n\r\n  //! @brief Signed divide.\r\n  //! @overload\r\n  inline void idiv(const GpVar& dst_rem, const GpVar& dst_quot, const Mem& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_rem.getId() != dst_quot.getId());\r\n    _emitInstruction(kX86InstIDiv, &dst_rem, &dst_quot, &src);\r\n  }\r\n\r\n  //! @brief Signed multiply.\r\n  //!\r\n  //! [dst_lo:dst_hi] = dst_hi * src.\r\n  inline void imul(const GpVar& dst_hi, const GpVar& dst_lo, const GpVar& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId());\r\n    _emitInstruction(kX86InstIMul, &dst_hi, &dst_lo, &src);\r\n  }\r\n\r\n  //! @overload\r\n  inline void imul(const GpVar& dst_hi, const GpVar& dst_lo, const Mem& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId());\r\n    _emitInstruction(kX86InstIMul, &dst_hi, &dst_lo, &src);\r\n  }\r\n\r\n  //! @brief Signed multiply.\r\n  //!\r\n  //! Destination operand (the first operand) is multiplied by the source\r\n  //! operand (second operand). The destination operand is a general-purpose\r\n  //! register and the source operand is an immediate value, a general-purpose\r\n  //! register, or a memory location. The product is then stored in the\r\n  //! destination operand location.\r\n  inline void imul(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src); }\r\n\r\n  //! @brief Signed multiply.\r\n  //! @overload\r\n  inline void imul(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src); }\r\n\r\n  //! @brief Signed multiply.\r\n  //! @overload\r\n  inline void imul(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src); }\r\n\r\n  //! @brief Signed multiply.\r\n  //!\r\n  //! source operand (which can be a general-purpose register or a memory\r\n  //! location) is multiplied by the second source operand (an immediate\r\n  //! value). The product is then stored in the destination operand\r\n  //! (a general-purpose register).\r\n  inline void imul(const GpVar& dst, const GpVar& src, const Imm& imm)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src, &imm); }\r\n\r\n  //! @overload\r\n  inline void imul(const GpVar& dst, const Mem& src, const Imm& imm)\r\n  { _emitInstruction(kX86InstIMul, &dst, &src, &imm); }\r\n\r\n  //! @brief Increment by 1.\r\n  //! @note This instruction can be slower than add(dst, 1)\r\n  inline void inc(const GpVar& dst)\r\n  { _emitInstruction(kX86InstInc, &dst); }\r\n\r\n  //! @brief Increment by 1.\r\n  //! @note This instruction can be slower than add(dst, 1)\r\n  inline void inc(const Mem& dst)\r\n  { _emitInstruction(kX86InstInc, &dst); }\r\n\r\n  //! @brief Interrupt 3 - trap to debugger.\r\n  inline void int3()\r\n  { _emitInstruction(kX86InstInt3); }\r\n\r\n  //! @brief Jump to label @a label if condition @a cc is met.\r\n  //!\r\n  //! This instruction checks the state of one or more of the status flags in\r\n  //! the EFLAGS register (CF, OF, PF, SF, and ZF) and, if the flags are in the\r\n  //! specified state (condition), performs a jump to the target instruction\r\n  //! specified by the destination operand. A condition code (cc) is associated\r\n  //! with each instruction to indicate the condition being tested for. If the\r\n  //! condition is not satisfied, the jump is not performed and execution\r\n  //! continues with the instruction following the Jcc instruction.\r\n  inline void j(kX86Cond cc, const Label& label, uint32_t hint = kCondHintNone)\r\n  { _emitJcc(X86Util::getJccInstFromCond(cc), &label, hint); }\r\n\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void ja  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJA  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jae (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJAE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jb  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJB  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jbe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJBE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jc  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJC  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void je  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJE  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jg  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJG  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jge (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJGE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jl  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJL  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jle (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJLE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jna (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNA , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnae(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNAE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnb (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNB , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnbe(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNBE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnc (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNC , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jne (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jng (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNG , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnge(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNGE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnl (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNL , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnle(const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNLE, &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jno (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNO , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnp (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNP , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jns (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNS , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jnz (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJNZ , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jo  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJO  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jp  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJP  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jpe (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPE , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jpo (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJPO , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void js  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJS  , &label, hint); }\r\n  //! @brief Jump to label @a label if condition is met.\r\n  inline void jz  (const Label& label, uint32_t hint = kCondHintNone) { _emitJcc(kX86InstJZ  , &label, hint); }\r\n\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(const GpVar& dst)\r\n  { _emitInstruction(kX86InstJmp, &dst); }\r\n\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(const Mem& dst)\r\n  { _emitInstruction(kX86InstJmp, &dst); }\r\n\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(const Imm& dst)\r\n  { _emitInstruction(kX86InstJmp, &dst); }\r\n\r\n  //! @brief Jump.\r\n  //! @overload\r\n  inline void jmp(void* dst)\r\n  {\r\n    Imm imm((sysint_t)dst);\r\n    _emitInstruction(kX86InstJmp, &imm);\r\n  }\r\n\r\n  //! @brief Jump.\r\n  //!\r\n  //! This instruction transfers program control to a different point\r\n  //! in the instruction stream without recording return information.\r\n  //! The destination (target) operand specifies the label of the\r\n  //! instruction being jumped to.\r\n  inline void jmp(const Label& label)\r\n  { _emitInstruction(kX86InstJmp, &label); }\r\n\r\n  //! @brief Load Effective Address\r\n  //!\r\n  //! This instruction computes the effective address of the second\r\n  //! operand (the source operand) and stores it in the first operand\r\n  //! (destination operand). The source operand is a memory address\r\n  //! (offset part) specified with one of the processors addressing modes.\r\n  //! The destination operand is a general-purpose register.\r\n  inline void lea(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstLea, &dst, &src); }\r\n\r\n#if ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n  //! @brief High Level Procedure Exit.\r\n  inline void leave()\r\n  { _emitInstruction(kX86InstLeave); }\r\n#endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n\r\n  //! @brief Move.\r\n  //!\r\n  //! This instruction copies the second operand (source operand) to the first\r\n  //! operand (destination operand). The source operand can be an immediate\r\n  //! value, general-purpose register, segment register, or memory location.\r\n  //! The destination register can be a general-purpose register, segment\r\n  //! register, or memory location. Both operands must be the same size, which\r\n  //! can be a byte, a word, or a DWORD.\r\n  //!\r\n  //! @note To move MMX or SSE registers to/from GP registers or memory, use\r\n  //! corresponding functions: @c movd(), @c movq(), etc. Passing MMX or SSE\r\n  //! registers to @c mov() is illegal.\r\n  inline void mov(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move.\r\n  //! @overload\r\n  inline void mov(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move from segment register.\r\n  //! @overload.\r\n  inline void mov(const GpVar& dst, const SegmentReg& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n  \r\n  //! @brief Move from segment register.\r\n  //! @overload.\r\n  inline void mov(const Mem& dst, const SegmentReg& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move to segment register.\r\n  //! @overload.\r\n  inline void mov(const SegmentReg& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move to segment register.\r\n  //! @overload.\r\n  inline void mov(const SegmentReg& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMov, &dst, &src); }\r\n\r\n  //! @brief Move byte, word, dword or qword from absolute address @a src to\r\n  //! AL, AX, EAX or RAX register.\r\n  inline void mov_ptr(const GpVar& dst, void* src)\r\n  {\r\n    Imm imm((sysint_t)src);\r\n    _emitInstruction(kX86InstMovPtr, &dst, &imm);\r\n  }\r\n\r\n  //! @brief Move byte, word, dword or qword from AL, AX, EAX or RAX register\r\n  //! to absolute address @a dst.\r\n  inline void mov_ptr(void* dst, const GpVar& src)\r\n  {\r\n    Imm imm((sysint_t)dst);\r\n    _emitInstruction(kX86InstMovPtr, &imm, &src);\r\n  }\r\n\r\n  //! @brief Move with Sign-Extension.\r\n  //!\r\n  //! This instruction copies the contents of the source operand (register\r\n  //! or memory location) to the destination operand (register) and sign\r\n  //! extends the value to 16, 32 or 64-bits.\r\n  //!\r\n  //! @sa movsxd().\r\n  void movsx(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovSX, &dst, &src); }\r\n\r\n  //! @brief Move with Sign-Extension.\r\n  //! @overload\r\n  void movsx(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSX, &dst, &src); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move DWord to QWord with sign-extension.\r\n  inline void movsxd(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovSXD, &dst, &src); }\r\n\r\n  //! @brief Move DWord to QWord with sign-extension.\r\n  //! @overload\r\n  inline void movsxd(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSXD, &dst, &src); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Move with Zero-Extend.\r\n  //!\r\n  //! This instruction copies the contents of the source operand (register\r\n  //! or memory location) to the destination operand (register) and zero\r\n  //! extends the value to 16 or 32-bits. The size of the converted value\r\n  //! depends on the operand-size attribute.\r\n  inline void movzx(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovZX, &dst, &src); }\r\n\r\n  //! @brief Move with Zero-Extend.\r\n  //! @brief Overload\r\n  inline void movzx(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovZX, &dst, &src); }\r\n\r\n  //! @brief Unsigned multiply.\r\n  //!\r\n  //! Source operand (in a general-purpose register or memory location)\r\n  //! is multiplied by the value in the AL, AX, or EAX register (depending\r\n  //! on the operand size) and the product is stored in the AX, DX:AX, or\r\n  //! EDX:EAX registers, respectively.\r\n  inline void mul(const GpVar& dst_hi, const GpVar& dst_lo, const GpVar& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId());\r\n    _emitInstruction(kX86InstMul, &dst_hi, &dst_lo, &src);\r\n  }\r\n\r\n  //! @brief Unsigned multiply.\r\n  //! @overload\r\n  inline void mul(const GpVar& dst_hi, const GpVar& dst_lo, const Mem& src)\r\n  {\r\n    // Destination variables must be different.\r\n    ASMJIT_ASSERT(dst_hi.getId() != dst_lo.getId());\r\n    _emitInstruction(kX86InstMul, &dst_hi, &dst_lo, &src);\r\n  }\r\n\r\n  //! @brief Two's Complement Negation.\r\n  inline void neg(const GpVar& dst)\r\n  { _emitInstruction(kX86InstNeg, &dst); }\r\n\r\n  //! @brief Two's Complement Negation.\r\n  inline void neg(const Mem& dst)\r\n  { _emitInstruction(kX86InstNeg, &dst); }\r\n\r\n  //! @brief No Operation.\r\n  //!\r\n  //! This instruction performs no operation. This instruction is a one-byte\r\n  //! instruction that takes up space in the instruction stream but does not\r\n  //! affect the machine context, except the EIP register. The NOP instruction\r\n  //! is an alias mnemonic for the XCHG (E)AX, (E)AX instruction.\r\n  inline void nop()\r\n  { _emitInstruction(kX86InstNop); }\r\n\r\n  //! @brief One's Complement Negation.\r\n  inline void not_(const GpVar& dst)\r\n  { _emitInstruction(kX86InstNot, &dst); }\r\n\r\n  //! @brief One's Complement Negation.\r\n  inline void not_(const Mem& dst)\r\n  { _emitInstruction(kX86InstNot, &dst); }\r\n\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n\r\n  //! @brief Logical Inclusive OR.\r\n  inline void or_(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstOr, &dst, &src); }\r\n\r\n  //! @brief Pop a Value from the Stack.\r\n  //!\r\n  //! This instruction loads the value from the top of the stack to the location\r\n  //! specified with the destination operand and then increments the stack pointer.\r\n  //! The destination operand can be a general purpose register, memory location,\r\n  //! or segment register.\r\n  inline void pop(const GpVar& dst)\r\n  { _emitInstruction(kX86InstPop, &dst); }\r\n\r\n  inline void pop(const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 2 || dst.getSize() == sizeof(sysint_t));\r\n    _emitInstruction(kX86InstPop, &dst);\r\n  }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Pop All General-Purpose Registers.\r\n  //!\r\n  //! Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX.\r\n  inline void popad()\r\n  { _emitInstruction(kX86InstPopAD); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Pop Stack into EFLAGS Register (32-bit or 64-bit).\r\n  inline void popf()\r\n  {\r\n#if defined(ASMJIT_X86)\r\n    popfd();\r\n#else\r\n    popfq();\r\n#endif\r\n  }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Pop Stack into EFLAGS Register (32-bit).\r\n  inline void popfd()\r\n  { _emitInstruction(kX86InstPopFD); }\r\n#else\r\n  //! @brief Pop Stack into EFLAGS Register (64-bit).\r\n  inline void popfq()\r\n  { _emitInstruction(kX86InstPopFQ); }\r\n#endif\r\n\r\n  //! @brief Push WORD/DWORD/QWORD Onto the Stack.\r\n  //!\r\n  //! @note 32-bit architecture pushed DWORD while 64-bit\r\n  //! pushes QWORD. 64-bit mode not provides instruction to\r\n  //! push 32-bit register/memory.\r\n  inline void push(const GpVar& src)\r\n  { _emitInstruction(kX86InstPush, &src); }\r\n\r\n  //! @brief Push WORD/DWORD/QWORD Onto the Stack.\r\n  inline void push(const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(src.getSize() == 2 || src.getSize() == sizeof(sysint_t));\r\n    _emitInstruction(kX86InstPush, &src);\r\n  }\r\n\r\n  //! @brief Push WORD/DWORD/QWORD Onto the Stack.\r\n  inline void push(const Imm& src)\r\n  { _emitInstruction(kX86InstPush, &src); }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Push All General-Purpose Registers.\r\n  //!\r\n  //! Push EAX, ECX, EDX, EBX, original ESP, EBP, ESI, and EDI.\r\n  inline void pushad()\r\n  { _emitInstruction(kX86InstPushAD); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Push EFLAGS Register (32-bit or 64-bit) onto the Stack.\r\n  inline void pushf()\r\n  {\r\n#if defined(ASMJIT_X86)\r\n    pushfd();\r\n#else\r\n    pushfq();\r\n#endif\r\n  }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Push EFLAGS Register (32-bit) onto the Stack.\r\n  inline void pushfd()\r\n  { _emitInstruction(kX86InstPushFD); }\r\n#else\r\n  //! @brief Push EFLAGS Register (64-bit) onto the Stack.\r\n  inline void pushfq()\r\n  { _emitInstruction(kX86InstPushFQ); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcl(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  inline void rcl(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcl(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  inline void rcl(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcl, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcr(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  inline void rcr(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rcr(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  inline void rcr(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRcr, &dst, &src); }\r\n\r\n  //! @brief Read Time-Stamp Counter (Pentium).\r\n  inline void rdtsc(const GpVar& dst_edx, const GpVar& dst_eax)\r\n  {\r\n    // Destination registers must be different.\r\n    ASMJIT_ASSERT(dst_edx.getId() != dst_eax.getId());\r\n    _emitInstruction(kX86InstRdtsc, &dst_edx, &dst_eax);\r\n  }\r\n\r\n  //! @brief Read Time-Stamp Counter and Processor ID (New).\r\n  inline void rdtscp(const GpVar& dst_edx, const GpVar& dst_eax, const GpVar& dst_ecx)\r\n  {\r\n    // Destination registers must be different.\r\n    ASMJIT_ASSERT(dst_edx.getId() != dst_eax.getId() && dst_eax.getId() != dst_ecx.getId());\r\n    _emitInstruction(kX86InstRdtscP, &dst_edx, &dst_eax, &dst_ecx);\r\n  }\r\n\r\n  //! @brief Load ECX/RCX BYTEs from DS:[ESI/RSI] to AL.\r\n  inline void rep_lodsb(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepLodSB, &dst_val, &src_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Load ECX/RCX DWORDs from DS:[ESI/RSI] to EAX.\r\n  inline void rep_lodsd(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepLodSD, &dst_val, &src_addr, &cnt_ecx);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Load ECX/RCX QWORDs from DS:[ESI/RSI] to RAX.\r\n  inline void rep_lodsq(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepLodSQ, &dst_val, &src_addr, &cnt_ecx);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Load ECX/RCX WORDs from DS:[ESI/RSI] to AX.\r\n  inline void rep_lodsw(const GpVar& dst_val, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=EAX,RAX, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_val.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepLodSW, &dst_val, &src_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Move ECX/RCX BYTEs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsb(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepMovSB, &dst_addr, &src_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsd(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepMovSD, &dst_addr, &src_addr, &cnt_ecx);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move ECX/RCX QWORDs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsq(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepMovSQ, &dst_addr, &src_addr, &cnt_ecx);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Move ECX/RCX WORDs from DS:[ESI/RSI] to ES:[EDI/RDI].\r\n  inline void rep_movsw(const GpVar& dst_addr, const GpVar& src_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=DS:ESI/RSI, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_addr.getId() && src_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepMovSW, &dst_addr, &src_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Fill ECX/RCX BYTEs at ES:[EDI/RDI] with AL.\r\n  inline void rep_stosb(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepStoSB, &dst_addr, &src_val, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Fill ECX/RCX DWORDs at ES:[EDI/RDI] with EAX.\r\n  inline void rep_stosd(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepStoSD, &dst_addr, &src_val, &cnt_ecx);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Fill ECX/RCX QWORDs at ES:[EDI/RDI] with RAX.\r\n  inline void rep_stosq(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepStoSQ, &dst_addr, &src_val, &cnt_ecx);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Fill ECX/RCX WORDs at ES:[EDI/RDI] with AX.\r\n  inline void rep_stosw(const GpVar& dst_addr, const GpVar& src_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to dst=ES:EDI,RDI, src=EAX/RAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(dst_addr.getId() != src_val.getId() && src_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepStoSW, &dst_addr, &src_val, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Repeated find nonmatching BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsb(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepECmpSB, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Repeated find nonmatching DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsd(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepECmpSD, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Repeated find nonmatching QWORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsq(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepECmpSQ, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Repeated find nonmatching WORDs in ES:[EDI/RDI] and DS:[ESI/RDI].\r\n  inline void repe_cmpsw(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepECmpSW, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Find non-AL BYTE starting at ES:[EDI/RDI].\r\n  inline void repe_scasb(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AL, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepEScaSB, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Find non-EAX DWORD starting at ES:[EDI/RDI].\r\n  inline void repe_scasd(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=EAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepEScaSD, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Find non-RAX QWORD starting at ES:[EDI/RDI].\r\n  inline void repe_scasq(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=RAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepEScaSQ, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Find non-AX WORD starting at ES:[EDI/RDI].\r\n  inline void repe_scasw(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepEScaSW, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Find matching BYTEs in [RDI] and [RSI].\r\n  inline void repne_cmpsb(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNECmpSB, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Find matching DWORDs in [RDI] and [RSI].\r\n  inline void repne_cmpsd(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNECmpSD, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Find matching QWORDs in [RDI] and [RSI].\r\n  inline void repne_cmpsq(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNECmpSQ, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Find matching WORDs in [RDI] and [RSI].\r\n  inline void repne_cmpsw(const GpVar& cmp1_addr, const GpVar& cmp2_addr, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, cmp2=ES:[EDI/RDI], cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_addr.getId() && cmp2_addr.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNECmpSW, &cmp1_addr, &cmp2_addr, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Find AL, starting at ES:[EDI/RDI].\r\n  inline void repne_scasb(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AL, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNEScaSB, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Find EAX, starting at ES:[EDI/RDI].\r\n  inline void repne_scasd(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=EAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNEScaSD, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Find RAX, starting at ES:[EDI/RDI].\r\n  inline void repne_scasq(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=RAX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNEScaSQ, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Find AX, starting at ES:[EDI/RDI].\r\n  inline void repne_scasw(const GpVar& cmp1_addr, const GpVar& cmp2_val, const GpVar& cnt_ecx)\r\n  {\r\n    // All registers must be unique, they will be reallocated to cmp1=ES:EDI,RDI, src=AX, cnt=ECX/RCX.\r\n    ASMJIT_ASSERT(cmp1_addr.getId() != cmp2_val.getId() && cmp2_val.getId() != cnt_ecx.getId());\r\n    _emitInstruction(kX86InstRepNEScaSW, &cmp1_addr, &cmp2_val, &cnt_ecx);\r\n  }\r\n\r\n  //! @brief Return from Procedure.\r\n  inline void ret()\r\n  { _emitReturn(NULL, NULL); }\r\n\r\n  //! @brief Return from Procedure.\r\n  inline void ret(const GpVar& first)\r\n  { _emitReturn(&first, NULL); }\r\n\r\n  //! @brief Return from Procedure.\r\n  inline void ret(const GpVar& first, const GpVar& second)\r\n  { _emitReturn(&first, &second); }\r\n\r\n  //! @brief Return from Procedure.\r\n  inline void ret(const XmmVar& first)\r\n  { _emitReturn(&first, NULL); }\r\n\r\n  //! @brief Return from Procedure.\r\n  inline void ret(const XmmVar& first, const XmmVar& second)\r\n  { _emitReturn(&first, &second); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rol(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  inline void rol(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void rol(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Left.\r\n  inline void rol(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRol, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void ror(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  inline void ror(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void ror(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n\r\n  //! @brief Rotate Bits Right.\r\n  inline void ror(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstRor, &dst, &src); }\r\n\r\n#if defined(ASMJIT_X86)\r\n  //! @brief Store @a var (allocated to AH/AX/EAX/RAX) into Flags.\r\n  inline void sahf(const GpVar& var)\r\n  { _emitInstruction(kX86InstSahf, &var); }\r\n#endif // ASMJIT_X86\r\n\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n\r\n  //! @brief Integer subtraction with borrow.\r\n  inline void sbb(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSbb, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sal(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  inline void sal(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sal(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  inline void sal(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSal, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sar(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  inline void sar(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void sar(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  inline void sar(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSar, &dst, &src); }\r\n\r\n  //! @brief Set Byte on Condition.\r\n  inline void set(kX86Cond cc, const GpVar& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() == 1);\r\n    _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst);\r\n  }\r\n\r\n  //! @brief Set Byte on Condition.\r\n  inline void set(kX86Cond cc, const Mem& dst)\r\n  {\r\n    ASMJIT_ASSERT(dst.getSize() <= 1);\r\n    _emitInstruction(X86Util::getSetccInstFromCond(cc), &dst);\r\n  }\r\n\r\n  //! @brief Set Byte on Condition.\r\n  inline void seta  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetA  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void seta  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetA  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setae (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetAE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setae (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetAE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setb  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetB  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setb  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetB  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setbe (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetBE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setbe (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetBE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setc  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetC  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setc  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetC  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sete  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetE  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sete  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetE  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setg  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetG  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setg  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetG  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setge (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetGE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setge (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetGE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setl  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetL  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setl  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetL  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setle (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetLE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setle (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetLE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setna (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNA , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setna (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNA , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnae(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNAE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnae(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNAE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnb (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNB , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnb (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNB , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnbe(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNBE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnbe(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNBE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnc (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNC , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnc (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNC , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setne (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setne (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setng (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNG , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setng (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNG , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnge(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNGE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnge(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNGE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnl (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNL , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnl (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNL , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnle(const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNLE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnle(const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNLE, &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setno (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setno (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnp (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNP , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnp (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNP , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setns (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNS , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setns (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNS , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnz (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetNZ , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setnz (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetNZ , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void seto  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetO  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void seto  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetO  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setp  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetP  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setp  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetP  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpe (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpe (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPE , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpo (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetPO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setpo (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetPO , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sets  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetS  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void sets  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetS  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setz  (const GpVar& dst) { ASMJIT_ASSERT(dst.getSize() == 1); _emitInstruction(kX86InstSetZ  , &dst); }\r\n  //! @brief Set Byte on Condition.\r\n  inline void setz  (const Mem& dst)   { ASMJIT_ASSERT(dst.getSize() <= 1); _emitInstruction(kX86InstSetZ  , &dst); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shl(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  inline void shl(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shl(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Left.\r\n  inline void shl(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShl, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shr(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  inline void shr(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  //! @note @a src register can be only @c cl.\r\n  inline void shr(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n\r\n  //! @brief Shift Bits Right.\r\n  inline void shr(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstShr, &dst, &src); }\r\n\r\n  //! @brief Double Precision Shift Left.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shld(const GpVar& dst, const GpVar& src1, const GpVar& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Left.\r\n  inline void shld(const GpVar& dst, const GpVar& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Left.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shld(const Mem& dst, const GpVar& src1, const GpVar& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Left.\r\n  inline void shld(const Mem& dst, const GpVar& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShld, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Right.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shrd(const GpVar& dst, const GpVar& src1, const GpVar& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Right.\r\n  inline void shrd(const GpVar& dst, const GpVar& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Right.\r\n  //! @note src2 register can be only @c cl register.\r\n  inline void shrd(const Mem& dst, const GpVar& src1, const GpVar& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n\r\n  //! @brief Double Precision Shift Right.\r\n  inline void shrd(const Mem& dst, const GpVar& src1, const Imm& src2)\r\n  { _emitInstruction(kX86InstShrd, &dst, &src1, &src2); }\r\n\r\n  //! @brief Set Carry Flag to 1.\r\n  inline void stc()\r\n  { _emitInstruction(kX86InstStc); }\r\n\r\n  //! @brief Set Direction Flag to 1.\r\n  inline void std()\r\n  { _emitInstruction(kX86InstStd); }\r\n\r\n  //! @brief Subtract.\r\n  inline void sub(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n\r\n  //! @brief Subtract.\r\n  inline void sub(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n\r\n  //! @brief Subtract.\r\n  inline void sub(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n\r\n  //! @brief Subtract.\r\n  inline void sub(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n\r\n  //! @brief Subtract.\r\n  inline void sub(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstSub, &dst, &src); }\r\n\r\n  //! @brief Logical Compare.\r\n  inline void test(const GpVar& op1, const GpVar& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n\r\n  //! @brief Logical Compare.\r\n  inline void test(const GpVar& op1, const Imm& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n\r\n  //! @brief Logical Compare.\r\n  inline void test(const Mem& op1, const GpVar& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n\r\n  //! @brief Logical Compare.\r\n  inline void test(const Mem& op1, const Imm& op2)\r\n  { _emitInstruction(kX86InstTest, &op1, &op2); }\r\n\r\n  //! @brief Undefined instruction - Raise invalid opcode exception.\r\n  inline void ud2()\r\n  { _emitInstruction(kX86InstUd2); }\r\n\r\n  //! @brief Exchange and Add.\r\n  inline void xadd(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstXadd, &dst, &src); }\r\n\r\n  //! @brief Exchange and Add.\r\n  inline void xadd(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstXadd, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xchg(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstXchg, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xchg(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstXchg, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xchg(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXchg, &src, &dst); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const GpVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n\r\n  //! @brief Exchange Register/Memory with Register.\r\n  inline void xor_(const Mem& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstXor, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [MMX]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Empty MMX state.\r\n  inline void emms()\r\n  { _emitInstruction(kX86InstEmms); }\r\n\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const Mem& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const GpVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n\r\n  //! @brief Move DWord (MMX).\r\n  inline void movd(const MmVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const Mem& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const GpVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif\r\n\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (MMX).\r\n  inline void movq(const MmVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif\r\n\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packsswb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packsswb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packssdw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (MMX).\r\n  inline void packssdw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n\r\n  //! @brief Pack with Unsigned Saturation (MMX).\r\n  inline void packuswb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n\r\n  //! @brief Pack with Unsigned Saturation (MMX).\r\n  inline void packuswb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n\r\n  //! @brief Packed BYTE Add (MMX).\r\n  inline void paddb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n\r\n  //! @brief Packed BYTE Add (MMX).\r\n  inline void paddb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n\r\n  //! @brief Packed WORD Add (MMX).\r\n  inline void paddw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n\r\n  //! @brief Packed WORD Add (MMX).\r\n  inline void paddw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n\r\n  //! @brief Packed DWORD Add (MMX).\r\n  inline void paddd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n\r\n  //! @brief Packed DWORD Add (MMX).\r\n  inline void paddd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (MMX).\r\n  inline void paddsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (MMX).\r\n  inline void paddusw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n\r\n  //! @brief Logical AND (MMX).\r\n  inline void pand(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n\r\n  //! @brief Logical AND (MMX).\r\n  inline void pand(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n\r\n  //! @brief Logical AND Not (MMX).\r\n  inline void pandn(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n\r\n  //! @brief Logical AND Not (MMX).\r\n  inline void pandn(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (BYTES) (MMX).\r\n  inline void pcmpeqb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (BYTES) (MMX).\r\n  inline void pcmpeqb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (WORDS) (MMX).\r\n  inline void pcmpeqw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (WORDS) (MMX).\r\n  inline void pcmpeqw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (DWORDS) (MMX).\r\n  inline void pcmpeqd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (DWORDS) (MMX).\r\n  inline void pcmpeqd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (BYTES) (MMX).\r\n  inline void pcmpgtb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (BYTES) (MMX).\r\n  inline void pcmpgtb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (WORDS) (MMX).\r\n  inline void pcmpgtw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (WORDS) (MMX).\r\n  inline void pcmpgtw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (MMX).\r\n  inline void pcmpgtd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (MMX).\r\n  inline void pcmpgtd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High (MMX).\r\n  inline void pmulhw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High (MMX).\r\n  inline void pmulhw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply Low (MMX).\r\n  inline void pmullw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply Low (MMX).\r\n  inline void pmullw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n\r\n  //! @brief Bitwise Logical OR (MMX).\r\n  inline void por(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n\r\n  //! @brief Bitwise Logical OR (MMX).\r\n  inline void por(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply and Add (MMX).\r\n  inline void pmaddwd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply and Add (MMX).\r\n  inline void pmaddwd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void pslld(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void pslld(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void pslld(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllq(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (MMX).\r\n  inline void psllw(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psrad(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psrad(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src);}\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psrad(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psraw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psraw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (MMX).\r\n  inline void psraw(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrld(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrld(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrld(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlq(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (MMX).\r\n  inline void psrlw(const MmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (MMX).\r\n  inline void psubd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (MMX).\r\n  inline void psubsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (MMX).\r\n  inline void psubusw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhbw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhbw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhwd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhwd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhdq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckhdq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklbw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklbw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklwd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpcklwd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckldq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed Data (MMX).\r\n  inline void punpckldq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n\r\n  //! @brief Bitwise Exclusive OR (MMX).\r\n  inline void pxor(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n\r\n  //! @brief Bitwise Exclusive OR (MMX).\r\n  inline void pxor(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [3dNow]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Faster EMMS (3dNow!).\r\n  //!\r\n  //! @note Use only for early AMD processors where is only 3dNow! or SSE. If\r\n  //! CPU contains SSE2, it's better to use @c emms() ( @c femms() is mapped\r\n  //! to @c emms() ).\r\n  inline void femms()\r\n  { _emitInstruction(kX86InstFEmms); }\r\n\r\n  //! @brief Packed SP-FP to Integer Convert (3dNow!).\r\n  inline void pf2id(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPF2ID, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP to Integer Convert (3dNow!).\r\n  inline void pf2id(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPF2ID, &dst, &src); }\r\n\r\n  //! @brief  Packed SP-FP to Integer Word Convert (3dNow!).\r\n  inline void pf2iw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPF2IW, &dst, &src); }\r\n\r\n  //! @brief  Packed SP-FP to Integer Word Convert (3dNow!).\r\n  inline void pf2iw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPF2IW, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Accumulate (3dNow!).\r\n  inline void pfacc(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Accumulate (3dNow!).\r\n  inline void pfacc(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Addition (3dNow!).\r\n  inline void pfadd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFAdd, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Addition (3dNow!).\r\n  inline void pfadd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFAdd, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst == src (3dNow!).\r\n  inline void pfcmpeq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst == src (3dNow!).\r\n  inline void pfcmpeq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFCmpEQ, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst >= src (3dNow!).\r\n  inline void pfcmpge(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFCmpGE, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst >= src (3dNow!).\r\n  inline void pfcmpge(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFCmpGE, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst > src (3dNow!).\r\n  inline void pfcmpgt(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFCmpGT, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare - dst > src (3dNow!).\r\n  inline void pfcmpgt(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFCmpGT, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Maximum (3dNow!).\r\n  inline void pfmax(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFMax, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Maximum (3dNow!).\r\n  inline void pfmax(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFMax, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Minimum (3dNow!).\r\n  inline void pfmin(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFMin, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Minimum (3dNow!).\r\n  inline void pfmin(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFMin, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Multiply (3dNow!).\r\n  inline void pfmul(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFMul, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Multiply (3dNow!).\r\n  inline void pfmul(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFMul, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Negative Accumulate (3dNow!).\r\n  inline void pfnacc(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFNAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Negative Accumulate (3dNow!).\r\n  inline void pfnacc(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFNAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Mixed Accumulate (3dNow!).\r\n  inline void pfpnacc(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFPNAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Mixed Accumulate (3dNow!).\r\n  inline void pfpnacc(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFPNAcc, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Approximation (3dNow!).\r\n  inline void pfrcp(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFRcp, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Approximation (3dNow!).\r\n  inline void pfrcp(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRcp, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!).\r\n  inline void pfrcpit1(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal, First Iteration Step (3dNow!).\r\n  inline void pfrcpit1(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRcpIt1, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!).\r\n  inline void pfrcpit2(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal, Second Iteration Step (3dNow!).\r\n  inline void pfrcpit2(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRcpIt2, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!).\r\n  inline void pfrsqit1(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Square Root, First Iteration Step (3dNow!).\r\n  inline void pfrsqit1(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRSqIt1, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!).\r\n  inline void pfrsqrt(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFRSqrt, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal Square Root Approximation (3dNow!).\r\n  inline void pfrsqrt(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFRSqrt, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Subtract (3dNow!).\r\n  inline void pfsub(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFSub, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Subtract (3dNow!).\r\n  inline void pfsub(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFSub, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reverse Subtract (3dNow!).\r\n  inline void pfsubr(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPFSubR, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Reverse Subtract (3dNow!).\r\n  inline void pfsubr(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPFSubR, &dst, &src); }\r\n\r\n  //! @brief Packed DWords to SP-FP (3dNow!).\r\n  inline void pi2fd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPI2FD, &dst, &src); }\r\n\r\n  //! @brief Packed DWords to SP-FP (3dNow!).\r\n  inline void pi2fd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPI2FD, &dst, &src); }\r\n\r\n  //! @brief Packed Words to SP-FP (3dNow!).\r\n  inline void pi2fw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPI2FW, &dst, &src); }\r\n\r\n  //! @brief Packed Words to SP-FP (3dNow!).\r\n  inline void pi2fw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPI2FW, &dst, &src); }\r\n\r\n  //! @brief Packed swap DWord (3dNow!)\r\n  inline void pswapd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSwapD, &dst, &src); }\r\n\r\n  //! @brief Packed swap DWord (3dNow!)\r\n  inline void pswapd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSwapD, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed SP-FP Add (SSE).\r\n  inline void addps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAddPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Add (SSE).\r\n  inline void addps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Add (SSE).\r\n  inline void addss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAddSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Add (SSE).\r\n  inline void addss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And Not For SP-FP (SSE).\r\n  inline void andnps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAndnPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical And Not For SP-FP (SSE).\r\n  inline void andnps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndnPS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And For SP-FP (SSE).\r\n  inline void andps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAndPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical And For SP-FP (SSE).\r\n  inline void andps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndPS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Compare (SSE).\r\n  inline void cmpps(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); }\r\n  //! @brief Packed SP-FP Compare (SSE).\r\n  inline void cmpps(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Scalar SP-FP Values (SSE).\r\n  inline void cmpss(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); }\r\n  //! @brief Compare Scalar SP-FP Values (SSE).\r\n  inline void cmpss(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE).\r\n  inline void comiss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstComISS, &dst, &src); }\r\n  //! @brief Scalar Ordered SP-FP Compare and Set EFLAGS (SSE).\r\n  inline void comiss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstComISS, &dst, &src); }\r\n\r\n  //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE).\r\n  inline void cvtpi2ps(const XmmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); }\r\n  //! @brief Packed Signed INT32 to Packed SP-FP Conversion (SSE).\r\n  inline void cvtpi2ps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPI2PS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (SSE).\r\n  inline void cvtps2pi(const MmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); }\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (SSE).\r\n  inline void cvtps2pi(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPS2PI, &dst, &src); }\r\n\r\n  //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE).\r\n  inline void cvtsi2ss(const XmmVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); }\r\n  //! @brief Scalar Signed INT32 to SP-FP Conversion (SSE).\r\n  inline void cvtsi2ss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSI2SS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE).\r\n  inline void cvtss2si(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); }\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (SSE).\r\n  inline void cvtss2si(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSS2SI, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttps2pi(const MmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); }\r\n  //! @brief Packed SP-FP to Packed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttps2pi(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPS2PI, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttss2si(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); }\r\n  //! @brief Scalar SP-FP to Signed INT32 Conversion (truncate) (SSE).\r\n  inline void cvttss2si(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttSS2SI, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Divide (SSE).\r\n  inline void divps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstDivPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Divide (SSE).\r\n  inline void divps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Divide (SSE).\r\n  inline void divss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstDivSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Divide (SSE).\r\n  inline void divss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivSS, &dst, &src); }\r\n\r\n  //! @brief Load Streaming SIMD Extension Control/Status (SSE).\r\n  inline void ldmxcsr(const Mem& src)\r\n  { _emitInstruction(kX86InstLdMXCSR, &src); }\r\n\r\n  //! @brief Byte Mask Write (SSE).\r\n  //!\r\n  //! @note The default memory location is specified by DS:EDI.\r\n  inline void maskmovq(const GpVar& dst_ptr, const MmVar& data, const MmVar& mask)\r\n  { _emitInstruction(kX86InstMaskMovQ, &dst_ptr, &data, &mask); }\r\n\r\n  //! @brief Packed SP-FP Maximum (SSE).\r\n  inline void maxps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMaxPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Maximum (SSE).\r\n  inline void maxps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Maximum (SSE).\r\n  inline void maxss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMaxSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Maximum (SSE).\r\n  inline void maxss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxSS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Minimum (SSE).\r\n  inline void minps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMinPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Minimum (SSE).\r\n  inline void minps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Minimum (SSE).\r\n  inline void minss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMinSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Minimum (SSE).\r\n  inline void minss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinSS, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed SP-FP Values (SSE).\r\n  inline void movaps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovAPS, &dst, &src); }\r\n  //! @brief Move Aligned Packed SP-FP Values (SSE).\r\n  inline void movaps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovAPS, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed SP-FP Values (SSE).\r\n  inline void movaps(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovAPS, &dst, &src); }\r\n\r\n  //! @brief Move DWord.\r\n  inline void movd(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord.\r\n  inline void movd(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord.\r\n  inline void movd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n  //! @brief Move DWord.\r\n  inline void movd(const XmmVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovD, &dst, &src); }\r\n\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif // ASMJIT_X64\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#if defined(ASMJIT_X64)\r\n  //! @brief Move QWord (SSE).\r\n  inline void movq(const XmmVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovQ, &dst, &src); }\r\n#endif // ASMJIT_X64\r\n\r\n  //! @brief Move 64 Bits Non Temporal (SSE).\r\n  inline void movntq(const Mem& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstMovNTQ, &dst, &src); }\r\n\r\n  //! @brief High to Low Packed SP-FP (SSE).\r\n  inline void movhlps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovHLPS, &dst, &src); }\r\n\r\n  //! @brief Move High Packed SP-FP (SSE).\r\n  inline void movhps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovHPS, &dst, &src); }\r\n\r\n  //! @brief Move High Packed SP-FP (SSE).\r\n  inline void movhps(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovHPS, &dst, &src); }\r\n\r\n  //! @brief Move Low to High Packed SP-FP (SSE).\r\n  inline void movlhps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovLHPS, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed SP-FP (SSE).\r\n  inline void movlps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovLPS, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed SP-FP (SSE).\r\n  inline void movlps(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovLPS, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Four Packed SP-FP Non Temporal (SSE).\r\n  inline void movntps(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovNTPS, &dst, &src); }\r\n\r\n  //! @brief Move Scalar SP-FP (SSE).\r\n  inline void movss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovSS, &dst, &src); }\r\n\r\n  //! @brief Move Scalar SP-FP (SSE).\r\n  inline void movss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSS, &dst, &src); }\r\n\r\n  //! @brief Move Scalar SP-FP (SSE).\r\n  inline void movss(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovSS, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed SP-FP Values (SSE).\r\n  inline void movups(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovUPS, &dst, &src); }\r\n  //! @brief Move Unaligned Packed SP-FP Values (SSE).\r\n  inline void movups(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovUPS, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed SP-FP Values (SSE).\r\n  inline void movups(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovUPS, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Multiply (SSE).\r\n  inline void mulps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMulPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Multiply (SSE).\r\n  inline void mulps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Multiply (SSE).\r\n  inline void mulss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMulSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Multiply (SSE).\r\n  inline void mulss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulSS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical OR for SP-FP Data (SSE).\r\n  inline void orps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstOrPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical OR for SP-FP Data (SSE).\r\n  inline void orps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstOrPS, &dst, &src); }\r\n\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n  //! @brief Packed Average (SSE).\r\n  inline void pavgw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n\r\n  //! @brief Extract Word (SSE).\r\n  inline void pextrw(const GpVar& dst, const MmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Word (SSE).\r\n  inline void pinsrw(const MmVar& dst, const GpVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n  //! @brief Insert Word (SSE).\r\n  inline void pinsrw(const MmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Signed Integer Word Maximum (SSE).\r\n  inline void pmaxsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Maximum (SSE).\r\n  inline void pmaxsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE).\r\n  inline void pmaxub(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE).\r\n  inline void pmaxub(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n\r\n  //! @brief Packed Signed Integer Word Minimum (SSE).\r\n  inline void pminsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Minimum (SSE).\r\n  inline void pminsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE).\r\n  inline void pminub(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE).\r\n  inline void pminub(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n\r\n  //! @brief Move Byte Mask To Integer (SSE).\r\n  inline void pmovmskb(const GpVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMovMskB, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High Unsigned (SSE).\r\n  inline void pmulhuw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n  //! @brief Packed Multiply High Unsigned (SSE).\r\n  inline void pmulhuw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n\r\n  //! @brief Packed Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n  //! @brief Packed Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle word (SSE).\r\n  inline void pshufw(const MmVar& dst, const MmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); }\r\n  //! @brief Packed Shuffle word (SSE).\r\n  inline void pshufw(const MmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed SP-FP Reciprocal (SSE).\r\n  inline void rcpps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstRcpPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Reciprocal (SSE).\r\n  inline void rcpps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstRcpPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Reciprocal (SSE).\r\n  inline void rcpss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstRcpSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Reciprocal (SSE).\r\n  inline void rcpss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstRcpSS, &dst, &src); }\r\n\r\n  //! @brief Prefetch (SSE).\r\n  inline void prefetch(const Mem& mem, const Imm& hint)\r\n  { _emitInstruction(kX86InstPrefetch, &mem, &hint); }\r\n\r\n  //! @brief Compute Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n  //! @brief Compute Sum of Absolute Differences (SSE).\r\n  inline void psadbw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSADBW, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Square Root Reciprocal (SSE).\r\n  inline void rsqrtss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n\r\n  //! @brief Store fence (SSE).\r\n  inline void sfence()\r\n  { _emitInstruction(kX86InstSFence); }\r\n\r\n  //! @brief Shuffle SP-FP (SSE).\r\n  inline void shufps(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); }\r\n  //! @brief Shuffle SP-FP (SSE).\r\n  inline void shufps(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed SP-FP Square Root (SSE).\r\n  inline void sqrtps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Square Root (SSE).\r\n  inline void sqrtps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Square Root (SSE).\r\n  inline void sqrtss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Square Root (SSE).\r\n  inline void sqrtss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtSS, &dst, &src); }\r\n\r\n  //! @brief Store Streaming SIMD Extension Control/Status (SSE).\r\n  inline void stmxcsr(const Mem& dst)\r\n  { _emitInstruction(kX86InstStMXCSR, &dst); }\r\n\r\n  //! @brief Packed SP-FP Subtract (SSE).\r\n  inline void subps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSubPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Subtract (SSE).\r\n  inline void subps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubPS, &dst, &src); }\r\n\r\n  //! @brief Scalar SP-FP Subtract (SSE).\r\n  inline void subss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSubSS, &dst, &src); }\r\n  //! @brief Scalar SP-FP Subtract (SSE).\r\n  inline void subss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubSS, &dst, &src); }\r\n\r\n  //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE).\r\n  inline void ucomiss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstUComISS, &dst, &src); }\r\n  //! @brief Unordered Scalar SP-FP compare and set EFLAGS (SSE).\r\n  inline void ucomiss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUComISS, &dst, &src); }\r\n\r\n  //! @brief Unpack High Packed SP-FP Data (SSE).\r\n  inline void unpckhps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstUnpckHPS, &dst, &src); }\r\n  //! @brief Unpack High Packed SP-FP Data (SSE).\r\n  inline void unpckhps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckHPS, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Packed SP-FP Data (SSE).\r\n  inline void unpcklps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstUnpckLPS, &dst, &src); }\r\n  //! @brief Unpack Low Packed SP-FP Data (SSE).\r\n  inline void unpcklps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckLPS, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical Xor for SP-FP Data (SSE).\r\n  inline void xorps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstXorPS, &dst, &src); }\r\n  //! @brief Bit-wise Logical Xor for SP-FP Data (SSE).\r\n  inline void xorps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXorPS, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE2]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed DP-FP Add (SSE2).\r\n  inline void addpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAddPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Add (SSE2).\r\n  inline void addpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Add (SSE2).\r\n  inline void addsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAddSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Add (SSE2).\r\n  inline void addsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And Not For DP-FP (SSE2).\r\n  inline void andnpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAndnPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical And Not For DP-FP (SSE2).\r\n  inline void andnpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndnPD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical And For DP-FP (SSE2).\r\n  inline void andpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAndPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical And For DP-FP (SSE2).\r\n  inline void andpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAndPD, &dst, &src); }\r\n\r\n  //! @brief Flush Cache Line (SSE2).\r\n  inline void clflush(const Mem& mem)\r\n  { _emitInstruction(kX86InstClFlush, &mem); }\r\n\r\n  //! @brief Packed DP-FP Compare (SSE2).\r\n  inline void cmppd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); }\r\n  //! @brief Packed DP-FP Compare (SSE2).\r\n  inline void cmppd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Scalar SP-FP Values (SSE2).\r\n  inline void cmpsd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); }\r\n  //! @brief Compare Scalar SP-FP Values (SSE2).\r\n  inline void cmpsd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstCmpSD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void comisd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstComISD, &dst, &src); }\r\n  //! @brief Scalar Ordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void comisd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstComISD, &dst, &src); }\r\n\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtdq2pd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); }\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtdq2pd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PD, &dst, &src); }\r\n\r\n  //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2).\r\n  inline void cvtdq2ps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); }\r\n  //! @brief Convert Packed Dword Integers to Packed SP-FP Values (SSE2).\r\n  inline void cvtdq2ps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtDQ2PS, &dst, &src); }\r\n\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2dq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); }\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2dq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPD2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2pi(const MmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); }\r\n  //! @brief Convert Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtpd2pi(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPD2PI, &dst, &src); }\r\n\r\n  //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2).\r\n  inline void cvtpd2ps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); }\r\n  //! @brief Convert Packed DP-FP Values to Packed SP-FP Values (SSE2).\r\n  inline void cvtpd2ps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPD2PS, &dst, &src); }\r\n\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtpi2pd(const XmmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); }\r\n  //! @brief Convert Packed Dword Integers to Packed DP-FP Values (SSE2).\r\n  inline void cvtpi2pd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPI2PD, &dst, &src); }\r\n\r\n  //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtps2dq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); }\r\n  //! @brief Convert Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvtps2dq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPS2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2).\r\n  inline void cvtps2pd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); }\r\n  //! @brief Convert Packed SP-FP Values to Packed DP-FP Values (SSE2).\r\n  inline void cvtps2pd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtPS2PD, &dst, &src); }\r\n\r\n  //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2).\r\n  inline void cvtsd2si(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); }\r\n  //! @brief Convert Scalar DP-FP Value to Dword Integer (SSE2).\r\n  inline void cvtsd2si(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSD2SI, &dst, &src); }\r\n\r\n  //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2).\r\n  inline void cvtsd2ss(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); }\r\n  //! @brief Convert Scalar DP-FP Value to Scalar SP-FP Value (SSE2).\r\n  inline void cvtsd2ss(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSD2SS, &dst, &src); }\r\n\r\n  //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2).\r\n  inline void cvtsi2sd(const XmmVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); }\r\n  //! @brief Convert Dword Integer to Scalar DP-FP Value (SSE2).\r\n  inline void cvtsi2sd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSI2SD, &dst, &src); }\r\n\r\n  //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2).\r\n  inline void cvtss2sd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); }\r\n  //! @brief Convert Scalar SP-FP Value to Scalar DP-FP Value (SSE2).\r\n  inline void cvtss2sd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvtSS2SD, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2pi(const MmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); }\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2pi(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPD2PI, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2dq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); }\r\n  //! @brief Convert with Truncation Packed DP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttpd2dq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPD2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttps2dq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); }\r\n  //! @brief Convert with Truncation Packed SP-FP Values to Packed Dword Integers (SSE2).\r\n  inline void cvttps2dq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttPS2DQ, &dst, &src); }\r\n\r\n  //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2).\r\n  inline void cvttsd2si(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); }\r\n  //! @brief Convert with Truncation Scalar DP-FP Value to Signed Dword Integer (SSE2).\r\n  inline void cvttsd2si(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCvttSD2SI, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Divide (SSE2).\r\n  inline void divpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstDivPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Divide (SSE2).\r\n  inline void divpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Divide (SSE2).\r\n  inline void divsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstDivSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Divide (SSE2).\r\n  inline void divsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstDivSD, &dst, &src); }\r\n\r\n  //! @brief Load Fence (SSE2).\r\n  inline void lfence()\r\n  { _emitInstruction(kX86InstLFence); }\r\n\r\n  //! @brief Store Selected Bytes of Double Quadword (SSE2).\r\n  //!\r\n  //! @note Target is DS:EDI.\r\n  inline void maskmovdqu(const GpVar& dst_ptr, const XmmVar& src, const XmmVar& mask)\r\n  { _emitInstruction(kX86InstMaskMovDQU, &dst_ptr, &src, &mask); }\r\n\r\n  //! @brief Return Maximum Packed Double-Precision FP Values (SSE2).\r\n  inline void maxpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMaxPD, &dst, &src); }\r\n  //! @brief Return Maximum Packed Double-Precision FP Values (SSE2).\r\n  inline void maxpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxPD, &dst, &src); }\r\n\r\n  //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2).\r\n  inline void maxsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMaxSD, &dst, &src); }\r\n  //! @brief Return Maximum Scalar Double-Precision FP Value (SSE2).\r\n  inline void maxsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMaxSD, &dst, &src); }\r\n\r\n  //! @brief Memory Fence (SSE2).\r\n  inline void mfence()\r\n  { _emitInstruction(kX86InstMFence); }\r\n\r\n  //! @brief Return Minimum Packed DP-FP Values (SSE2).\r\n  inline void minpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMinPD, &dst, &src); }\r\n  //! @brief Return Minimum Packed DP-FP Values (SSE2).\r\n  inline void minpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinPD, &dst, &src); }\r\n\r\n  //! @brief Return Minimum Scalar DP-FP Value (SSE2).\r\n  inline void minsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMinSD, &dst, &src); }\r\n  //! @brief Return Minimum Scalar DP-FP Value (SSE2).\r\n  inline void minsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMinSD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned DQWord (SSE2).\r\n  inline void movdqa(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovDQA, &dst, &src); }\r\n  //! @brief Move Aligned DQWord (SSE2).\r\n  inline void movdqa(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovDQA, &dst, &src); }\r\n\r\n  //! @brief Move Aligned DQWord (SSE2).\r\n  inline void movdqa(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovDQA, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Double Quadword (SSE2).\r\n  inline void movdqu(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovDQU, &dst, &src); }\r\n  //! @brief Move Unaligned Double Quadword (SSE2).\r\n  inline void movdqu(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovDQU, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Double Quadword (SSE2).\r\n  inline void movdqu(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovDQU, &dst, &src); }\r\n\r\n  //! @brief Extract Packed SP-FP Sign Mask (SSE2).\r\n  inline void movmskps(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovMskPS, &dst, &src); }\r\n\r\n  //! @brief Extract Packed DP-FP Sign Mask (SSE2).\r\n  inline void movmskpd(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovMskPD, &dst, &src); }\r\n\r\n  //! @brief Move Scalar Double-Precision FP Value (SSE2).\r\n  inline void movsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovSD, &dst, &src); }\r\n  //! @brief Move Scalar Double-Precision FP Value (SSE2).\r\n  inline void movsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSD, &dst, &src); }\r\n\r\n  //! @brief Move Scalar Double-Precision FP Value (SSE2).\r\n  inline void movsd(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovSD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movapd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovAPD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movapd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovAPD, &dst, &src); }\r\n\r\n  //! @brief Move Aligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movapd(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovAPD, &dst, &src); }\r\n\r\n  //! @brief Move Quadword from XMM to MMX Technology Register (SSE2).\r\n  inline void movdq2q(const MmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovDQ2Q, &dst, &src); }\r\n\r\n  //! @brief Move Quadword from MMX Technology to XMM Register (SSE2).\r\n  inline void movq2dq(const XmmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstMovQ2DQ, &dst, &src); }\r\n\r\n  //! @brief Move High Packed Double-Precision FP Value (SSE2).\r\n  inline void movhpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovHPD, &dst, &src); }\r\n\r\n  //! @brief Move High Packed Double-Precision FP Value (SSE2).\r\n  inline void movhpd(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovHPD, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed Double-Precision FP Value (SSE2).\r\n  inline void movlpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovLPD, &dst, &src); }\r\n\r\n  //! @brief Move Low Packed Double-Precision FP Value (SSE2).\r\n  inline void movlpd(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovLPD, &dst, &src); }\r\n\r\n  //! @brief Store Double Quadword Using Non-Temporal Hint (SSE2).\r\n  inline void movntdq(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovNTDQ, &dst, &src); }\r\n\r\n  //! @brief Store Store DWORD Using Non-Temporal Hint (SSE2).\r\n  inline void movnti(const Mem& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstMovNTI, &dst, &src); }\r\n\r\n  //! @brief Store Packed Double-Precision FP Values Using Non-Temporal Hint (SSE2).\r\n  inline void movntpd(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovNTPD, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movupd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovUPD, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movupd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovUPD, &dst, &src); }\r\n\r\n  //! @brief Move Unaligned Packed Double-Precision FP Values (SSE2).\r\n  inline void movupd(const Mem& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovUPD, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Multiply (SSE2).\r\n  inline void mulpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMulPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Multiply (SSE2).\r\n  inline void mulpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Multiply (SSE2).\r\n  inline void mulsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMulSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Multiply (SSE2).\r\n  inline void mulsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMulSD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void orpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstOrPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void orpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstOrPD, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packsswb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packsswb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSWB, &dst, &src); }\r\n\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packssdw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n  //! @brief Pack with Signed Saturation (SSE2).\r\n  inline void packssdw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackSSDW, &dst, &src); }\r\n\r\n  //! @brief Pack with Unsigned Saturation (SSE2).\r\n  inline void packuswb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n  //! @brief Pack with Unsigned Saturation (SSE2).\r\n  inline void packuswb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackUSWB, &dst, &src); }\r\n\r\n  //! @brief Packed BYTE Add (SSE2).\r\n  inline void paddb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n  //! @brief Packed BYTE Add (SSE2).\r\n  inline void paddb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddB, &dst, &src); }\r\n\r\n  //! @brief Packed WORD Add (SSE2).\r\n  inline void paddw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n  //! @brief Packed WORD Add (SSE2).\r\n  inline void paddw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddW, &dst, &src); }\r\n\r\n  //! @brief Packed DWORD Add (SSE2).\r\n  inline void paddd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n  //! @brief Packed DWORD Add (SSE2).\r\n  inline void paddd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddD, &dst, &src); }\r\n\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n  //! @brief Packed QWORD Add (SSE2).\r\n  inline void paddq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddQ, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n  //! @brief Packed Add with Saturation (SSE2).\r\n  inline void paddsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n  //! @brief Packed Add Unsigned with Saturation (SSE2).\r\n  inline void paddusw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAddUSW, &dst, &src); }\r\n\r\n  //! @brief Logical AND (SSE2).\r\n  inline void pand(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n  //! @brief Logical AND (SSE2).\r\n  inline void pand(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAnd, &dst, &src); }\r\n\r\n  //! @brief Logical AND Not (SSE2).\r\n  inline void pandn(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n  //! @brief Logical AND Not (SSE2).\r\n  inline void pandn(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAndN, &dst, &src); }\r\n\r\n  //! @brief Spin Loop Hint (SSE2).\r\n  inline void pause()\r\n  { _emitInstruction(kX86InstPause); }\r\n\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgB, &dst, &src); }\r\n\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n  //! @brief Packed Average (SSE2).\r\n  inline void pavgw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAvgW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (BYTES) (SSE2).\r\n  inline void pcmpeqb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (BYTES) (SSE2).\r\n  inline void pcmpeqb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (WORDS) (SSE2).\r\n  inline void pcmpeqw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (WORDS) (SSE2).\r\n  inline void pcmpeqw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Equal (DWORDS) (SSE2).\r\n  inline void pcmpeqd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n  //! @brief Packed Compare for Equal (DWORDS) (SSE2).\r\n  inline void pcmpeqd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqD, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (BYTES) (SSE2).\r\n  inline void pcmpgtb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (BYTES) (SSE2).\r\n  inline void pcmpgtb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtB, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (WORDS) (SSE2).\r\n  inline void pcmpgtw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (WORDS) (SSE2).\r\n  inline void pcmpgtw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtW, &dst, &src); }\r\n\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (SSE2).\r\n  inline void pcmpgtd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n  //! @brief Packed Compare for Greater Than (DWORDS) (SSE2).\r\n  inline void pcmpgtd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtD, &dst, &src); }\r\n\r\n  //! @brief Extract Word (SSE2).\r\n  inline void pextrw(const GpVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); }\r\n  //! @brief Extract Word (SSE2).\r\n  inline void pextrw(const Mem& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Signed Integer Word Maximum (SSE2).\r\n  inline void pmaxsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Maximum (SSE2).\r\n  inline void pmaxsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE2).\r\n  inline void pmaxub(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Maximum (SSE2).\r\n  inline void pmaxub(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUB, &dst, &src); }\r\n\r\n  //! @brief Packed Signed Integer Word Minimum (SSE2).\r\n  inline void pminsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n  //! @brief Packed Signed Integer Word Minimum (SSE2).\r\n  inline void pminsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSW, &dst, &src); }\r\n\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE2).\r\n  inline void pminub(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n  //! @brief Packed Unsigned Integer Byte Minimum (SSE2).\r\n  inline void pminub(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUB, &dst, &src); }\r\n\r\n  //! @brief Move Byte Mask (SSE2).\r\n  inline void pmovmskb(const GpVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovMskB, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High (SSE2).\r\n  inline void pmulhw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n  //! @brief Packed Multiply High (SSE2).\r\n  inline void pmulhw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High Unsigned (SSE2).\r\n  inline void pmulhuw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n  //! @brief Packed Multiply High Unsigned (SSE2).\r\n  inline void pmulhuw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHUW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply Low (SSE2).\r\n  inline void pmullw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n  //! @brief Packed Multiply Low (SSE2).\r\n  inline void pmullw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulLW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n  //! @brief Packed Multiply to QWORD (SSE2).\r\n  inline void pmuludq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulUDQ, &dst, &src); }\r\n\r\n  //! @brief Bitwise Logical OR (SSE2).\r\n  inline void por(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n  //! @brief Bitwise Logical OR (SSE2).\r\n  inline void por(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPOr, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslld(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslld(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslld(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllq(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void psllw(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllW, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Left Logical (SSE2).\r\n  inline void pslldq(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSllDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psrad(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psrad(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psrad(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psraw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psraw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n  //! @brief Packed Shift Right Arithmetic (SSE2).\r\n  inline void psraw(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSraW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n  //! @brief Packed Subtract (SSE2).\r\n  inline void psubq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubQ, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply and Add (SSE2).\r\n  inline void pmaddwd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n  //! @brief Packed Multiply and Add (SSE2).\r\n  inline void pmaddwd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddWD, &dst, &src); }\r\n\r\n  //! @brief Shuffle Packed DWORDs (SSE2).\r\n  inline void pshufd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); }\r\n  //! @brief Shuffle Packed DWORDs (SSE2).\r\n  inline void pshufd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Shuffle Packed High Words (SSE2).\r\n  inline void pshufhw(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); }\r\n  //! @brief Shuffle Packed High Words (SSE2).\r\n  inline void pshufhw(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufHW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Shuffle Packed Low Words (SSE2).\r\n  inline void pshuflw(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); }\r\n  //! @brief Shuffle Packed Low Words (SSE2).\r\n  inline void pshuflw(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPShufLW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrld(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrld(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrld(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlD, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlq(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlQ, &dst, &src); }\r\n\r\n  //! @brief DQWord Shift Right Logical (MMX).\r\n  inline void psrldq(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n  //! @brief Packed Shift Right Logical (SSE2).\r\n  inline void psrlw(const XmmVar& dst, const Imm& src)\r\n  { _emitInstruction(kX86InstPSrlW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n  //! @brief Packed Subtract with Saturation (SSE2).\r\n  inline void psubsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubSW, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSB, &dst, &src); }\r\n\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n  //! @brief Packed Subtract with Unsigned Saturation (SSE2).\r\n  inline void psubusw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSubUSW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhbw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhbw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHBW, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhwd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhwd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHWD, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhdq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhdq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhqdq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); }\r\n  //! @brief Unpack High Data (SSE2).\r\n  inline void punpckhqdq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckHQDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklbw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklbw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLBW, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklwd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklwd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLWD, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpckldq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpckldq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLDQ, &dst, &src); }\r\n\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklqdq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); }\r\n  //! @brief Unpack Low Data (SSE2).\r\n  inline void punpcklqdq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPunpckLQDQ, &dst, &src); }\r\n\r\n  //! @brief Bitwise Exclusive OR (SSE2).\r\n  inline void pxor(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n  //! @brief Bitwise Exclusive OR (SSE2).\r\n  inline void pxor(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPXor, &dst, &src); }\r\n\r\n  //! @brief Shuffle DP-FP (SSE2).\r\n  inline void shufpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); }\r\n  //! @brief Shuffle DP-FP (SSE2).\r\n  inline void shufpd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstShufPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compute Square Roots of Packed DP-FP Values (SSE2).\r\n  inline void sqrtpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSqrtPD, &dst, &src); }\r\n  //! @brief Compute Square Roots of Packed DP-FP Values (SSE2).\r\n  inline void sqrtpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtPD, &dst, &src); }\r\n\r\n  //! @brief Compute Square Root of Scalar DP-FP Value (SSE2).\r\n  inline void sqrtsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSqrtSD, &dst, &src); }\r\n  //! @brief Compute Square Root of Scalar DP-FP Value (SSE2).\r\n  inline void sqrtsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSqrtSD, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Subtract (SSE2).\r\n  inline void subpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSubPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Subtract (SSE2).\r\n  inline void subpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubPD, &dst, &src); }\r\n\r\n  //! @brief Scalar DP-FP Subtract (SSE2).\r\n  inline void subsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstSubSD, &dst, &src); }\r\n  //! @brief Scalar DP-FP Subtract (SSE2).\r\n  inline void subsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstSubSD, &dst, &src); }\r\n\r\n  //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void ucomisd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstUComISD, &dst, &src); }\r\n  //! @brief Scalar Unordered DP-FP Compare and Set EFLAGS (SSE2).\r\n  inline void ucomisd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUComISD, &dst, &src); }\r\n\r\n  //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2).\r\n  inline void unpckhpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstUnpckHPD, &dst, &src); }\r\n  //! @brief Unpack and Interleave High Packed Double-Precision FP Values (SSE2).\r\n  inline void unpckhpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckHPD, &dst, &src); }\r\n\r\n  //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2).\r\n  inline void unpcklpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstUnpckLPD, &dst, &src); }\r\n  //! @brief Unpack and Interleave Low Packed Double-Precision FP Values (SSE2).\r\n  inline void unpcklpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstUnpckLPD, &dst, &src); }\r\n\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void xorpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstXorPD, &dst, &src); }\r\n  //! @brief Bit-wise Logical OR for DP-FP Data (SSE2).\r\n  inline void xorpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstXorPD, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE3]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed DP-FP Add/Subtract (SSE3).\r\n  inline void addsubpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAddSubPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Add/Subtract (SSE3).\r\n  inline void addsubpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSubPD, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Add/Subtract (SSE3).\r\n  inline void addsubps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstAddSubPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Add/Subtract (SSE3).\r\n  inline void addsubps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstAddSubPS, &dst, &src); }\r\n\r\n#if ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n  // TODO: NOT IMPLEMENTED BY THE COMPILER.\r\n  //! @brief Store Integer with Truncation (SSE3).\r\n  inline void fisttp(const Mem& dst)\r\n  { _emitInstruction(kX86InstFISttP, &dst); }\r\n#endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n\r\n  //! @brief Packed DP-FP Horizontal Add (SSE3).\r\n  inline void haddpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstHAddPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Horizontal Add (SSE3).\r\n  inline void haddpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHAddPD, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Horizontal Add (SSE3).\r\n  inline void haddps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstHAddPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Horizontal Add (SSE3).\r\n  inline void haddps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHAddPS, &dst, &src); }\r\n\r\n  //! @brief Packed DP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstHSubPD, &dst, &src); }\r\n  //! @brief Packed DP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHSubPD, &dst, &src); }\r\n\r\n  //! @brief Packed SP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstHSubPS, &dst, &src); }\r\n  //! @brief Packed SP-FP Horizontal Subtract (SSE3).\r\n  inline void hsubps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstHSubPS, &dst, &src); }\r\n\r\n  //! @brief Load Unaligned Integer 128 Bits (SSE3).\r\n  inline void lddqu(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstLdDQU, &dst, &src); }\r\n\r\n#if ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n  //! @brief Set Up Monitor Address (SSE3).\r\n  inline void monitor()\r\n  { _emitInstruction(kX86InstMonitor); }\r\n#endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n\r\n  //! @brief Move One DP-FP and Duplicate (SSE3).\r\n  inline void movddup(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovDDup, &dst, &src); }\r\n  //! @brief Move One DP-FP and Duplicate (SSE3).\r\n  inline void movddup(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovDDup, &dst, &src); }\r\n\r\n  //! @brief Move Packed SP-FP High and Duplicate (SSE3).\r\n  inline void movshdup(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovSHDup, &dst, &src); }\r\n  //! @brief Move Packed SP-FP High and Duplicate (SSE3).\r\n  inline void movshdup(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSHDup, &dst, &src); }\r\n\r\n  //! @brief Move Packed SP-FP Low and Duplicate (SSE3).\r\n  inline void movsldup(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstMovSLDup, &dst, &src); }\r\n  //! @brief Move Packed SP-FP Low and Duplicate (SSE3).\r\n  inline void movsldup(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovSLDup, &dst, &src); }\r\n\r\n#if ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n  //! @brief Monitor Wait (SSE3).\r\n  inline void mwait()\r\n  { _emitInstruction(kX86InstMWait); }\r\n#endif // ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSSE3]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignB, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignW, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n  //! @brief Packed SIGN (SSSE3).\r\n  inline void psignd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPSignD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n  //! @brief Packed Horizontal Add (SSSE3).\r\n  inline void phaddd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Add and Saturate (SSSE3).\r\n  inline void phaddsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHAddSW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract (SSSE3).\r\n  inline void phsubd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubD, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n  //! @brief Packed Horizontal Subtract and Saturate (SSSE3).\r\n  inline void phsubsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHSubSW, &dst, &src); }\r\n\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n  //! @brief Multiply and Add Packed Signed and Unsigned Bytes (SSSE3).\r\n  inline void pmaddubsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMAddUBSW, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsB, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsW, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n  //! @brief Packed Absolute Value (SSSE3).\r\n  inline void pabsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPAbsD, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n  //! @brief Packed Multiply High with Round and Scale (SSSE3).\r\n  inline void pmulhrsw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulHRSW, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const MmVar& dst, const MmVar& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const MmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void pshufb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPShufB, &dst, &src); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const MmVar& dst, const MmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const MmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n  //! @brief Packed Shuffle Bytes (SSSE3).\r\n  inline void palignr(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPAlignR, &dst, &src, &imm8); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE4.1]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); }\r\n  //! @brief Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendpd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendps(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); }\r\n  //! @brief Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendps(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstBlendPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Variable Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendvpd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstBlendVPD, &dst, &src); }\r\n  //! @brief Variable Blend Packed DP-FP Values (SSE4.1).\r\n  inline void blendvpd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstBlendVPD, &dst, &src); }\r\n\r\n  //! @brief Variable Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendvps(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstBlendVPS, &dst, &src); }\r\n  //! @brief Variable Blend Packed SP-FP Values (SSE4.1).\r\n  inline void blendvps(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstBlendVPS, &dst, &src); }\r\n\r\n  //! @brief Dot Product of Packed DP-FP Values (SSE4.1).\r\n  inline void dppd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); }\r\n  //! @brief Dot Product of Packed DP-FP Values (SSE4.1).\r\n  inline void dppd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Dot Product of Packed SP-FP Values (SSE4.1).\r\n  inline void dpps(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); }\r\n  //! @brief Dot Product of Packed SP-FP Values (SSE4.1).\r\n  inline void dpps(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstDpPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Extract Packed SP-FP Value (SSE4.1).\r\n  inline void extractps(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); }\r\n  //! @brief Extract Packed SP-FP Value (SSE4.1).\r\n  inline void extractps(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstExtractPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Load Double Quadword Non-Temporal Aligned Hint (SSE4.1).\r\n  inline void movntdqa(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstMovNTDQA, &dst, &src); }\r\n\r\n  //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1).\r\n  inline void mpsadbw(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); }\r\n  //! @brief Compute Multiple Packed Sums of Absolute Difference (SSE4.1).\r\n  inline void mpsadbw(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstMPSADBW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Pack with Unsigned Saturation (SSE4.1).\r\n  inline void packusdw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPackUSDW, &dst, &src); }\r\n  //! @brief Pack with Unsigned Saturation (SSE4.1).\r\n  inline void packusdw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPackUSDW, &dst, &src); }\r\n\r\n  //! @brief Variable Blend Packed Bytes (SSE4.1).\r\n  inline void pblendvb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPBlendVB, &dst, &src); }\r\n  //! @brief Variable Blend Packed Bytes (SSE4.1).\r\n  inline void pblendvb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPBlendVB, &dst, &src); }\r\n\r\n  //! @brief Blend Packed Words (SSE4.1).\r\n  inline void pblendw(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); }\r\n  //! @brief Blend Packed Words (SSE4.1).\r\n  inline void pblendw(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPBlendW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Packed Qword Data for Equal (SSE4.1).\r\n  inline void pcmpeqq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); }\r\n  //! @brief Compare Packed Qword Data for Equal (SSE4.1).\r\n  inline void pcmpeqq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpEqQ, &dst, &src); }\r\n\r\n  //! @brief Extract Byte (SSE4.1).\r\n  inline void pextrb(const GpVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); }\r\n  //! @brief Extract Byte (SSE4.1).\r\n  inline void pextrb(const Mem& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrB, &dst, &src, &imm8); }\r\n\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrd(const GpVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); }\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrd(const Mem& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrq(const GpVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); }\r\n  //! @brief Extract Dword (SSE4.1).\r\n  inline void pextrq(const Mem& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPExtrQ, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Horizontal Word Minimum (SSE4.1).\r\n  inline void phminposuw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); }\r\n  //! @brief Packed Horizontal Word Minimum (SSE4.1).\r\n  inline void phminposuw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPHMinPOSUW, &dst, &src); }\r\n\r\n  //! @brief Insert Byte (SSE4.1).\r\n  inline void pinsrb(const XmmVar& dst, const GpVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); }\r\n  //! @brief Insert Byte (SSE4.1).\r\n  inline void pinsrb(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRB, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrd(const XmmVar& dst, const GpVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); }\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrq(const XmmVar& dst, const GpVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); }\r\n  //! @brief Insert Dword (SSE4.1).\r\n  inline void pinsrq(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRQ, &dst, &src, &imm8); }\r\n\r\n  //! @brief Insert Word (SSE2).\r\n  inline void pinsrw(const XmmVar& dst, const GpVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n  //! @brief Insert Word (SSE2).\r\n  inline void pinsrw(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPInsRW, &dst, &src, &imm8); }\r\n\r\n  //! @brief Maximum of Packed Word Integers (SSE4.1).\r\n  inline void pmaxuw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMaxUW, &dst, &src); }\r\n  //! @brief Maximum of Packed Word Integers (SSE4.1).\r\n  inline void pmaxuw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUW, &dst, &src); }\r\n\r\n  //! @brief Maximum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pmaxsb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMaxSB, &dst, &src); }\r\n  //! @brief Maximum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pmaxsb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSB, &dst, &src); }\r\n\r\n  //! @brief Maximum of Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmaxsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMaxSD, &dst, &src); }\r\n  //! @brief Maximum of Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmaxsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxSD, &dst, &src); }\r\n\r\n  //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1).\r\n  inline void pmaxud(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMaxUD, &dst, &src); }\r\n  //! @brief Maximum of Packed Unsigned Dword Integers (SSE4.1).\r\n  inline void pmaxud(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMaxUD, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pminsb(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMinSB, &dst, &src); }\r\n  //! @brief Minimum of Packed Signed Byte Integers (SSE4.1).\r\n  inline void pminsb(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSB, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Word Integers (SSE4.1).\r\n  inline void pminuw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMinUW, &dst, &src); }\r\n  //! @brief Minimum of Packed Word Integers (SSE4.1).\r\n  inline void pminuw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUW, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminud(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMinUD, &dst, &src); }\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminud(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinUD, &dst, &src); }\r\n\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminsd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMinSD, &dst, &src); }\r\n  //! @brief Minimum of Packed Dword Integers (SSE4.1).\r\n  inline void pminsd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMinSD, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovSXBW, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXBW, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovSXBD, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXBD, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxbq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXBQ, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxwd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovSXWD, &dst, &src); }\r\n  //! @brief Packed Move with Sign Extend (SSE4.1).\r\n  inline void pmovsxwd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXWD, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxwq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxwq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXWQ, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxdq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovsxdq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovSXDQ, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbw(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovZXBW, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbw(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXBW, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovZXBD, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXBD, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxbq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXBQ, &dst, &src); }\r\n\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxwd(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovZXWD, &dst, &src); }\r\n  //! @brief Packed Move with Zero Extend (SSE4.1).\r\n  inline void pmovzxwd(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXWD, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxwq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxwq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXWQ, &dst, &src); }\r\n\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxdq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); }\r\n  //! @brief (SSE4.1).\r\n  inline void pmovzxdq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMovZXDQ, &dst, &src); }\r\n\r\n  //! @brief Multiply Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmuldq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMulDQ, &dst, &src); }\r\n  //! @brief Multiply Packed Signed Dword Integers (SSE4.1).\r\n  inline void pmuldq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulDQ, &dst, &src); }\r\n\r\n  //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1).\r\n  inline void pmulld(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPMulLD, &dst, &src); }\r\n  //! @brief Multiply Packed Signed Integers and Store Low Result (SSE4.1).\r\n  inline void pmulld(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPMulLD, &dst, &src); }\r\n\r\n  //! @brief Logical Compare (SSE4.1).\r\n  inline void ptest(const XmmVar& op1, const XmmVar& op2)\r\n  { _emitInstruction(kX86InstPTest, &op1, &op2); }\r\n  //! @brief Logical Compare (SSE4.1).\r\n  inline void ptest(const XmmVar& op1, const Mem& op2)\r\n  { _emitInstruction(kX86InstPTest, &op1, &op2); }\r\n\r\n  //! Round Packed SP-FP Values @brief (SSE4.1).\r\n  inline void roundps(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); }\r\n  //! Round Packed SP-FP Values @brief (SSE4.1).\r\n  inline void roundps(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Round Scalar SP-FP Values (SSE4.1).\r\n  inline void roundss(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); }\r\n  //! @brief Round Scalar SP-FP Values (SSE4.1).\r\n  inline void roundss(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSS, &dst, &src, &imm8); }\r\n\r\n  //! @brief Round Packed DP-FP Values (SSE4.1).\r\n  inline void roundpd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); }\r\n  //! @brief Round Packed DP-FP Values (SSE4.1).\r\n  inline void roundpd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundPD, &dst, &src, &imm8); }\r\n\r\n  //! @brief Round Scalar DP-FP Values (SSE4.1).\r\n  inline void roundsd(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); }\r\n  //! @brief Round Scalar DP-FP Values (SSE4.1).\r\n  inline void roundsd(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstRoundSD, &dst, &src, &imm8); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [SSE4.2]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2).\r\n  inline void crc32(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstCrc32, &dst, &src); }\r\n  //! @brief Accumulate CRC32 Value (polynomial 0x11EDC6F41) (SSE4.2).\r\n  inline void crc32(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstCrc32, &dst, &src); }\r\n\r\n  //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpestri(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Explicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpestri(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrI, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpestrm(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Explicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpestrm(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpEStrM, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpistri(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Implicit Length Strings, Return Index (SSE4.2).\r\n  inline void pcmpistri(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrI, &dst, &src, &imm8); }\r\n\r\n  //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpistrm(const XmmVar& dst, const XmmVar& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); }\r\n  //! @brief Packed Compare Implicit Length Strings, Return Mask (SSE4.2).\r\n  inline void pcmpistrm(const XmmVar& dst, const Mem& src, const Imm& imm8)\r\n  { _emitInstruction(kX86InstPCmpIStrM, &dst, &src, &imm8); }\r\n\r\n  //! @brief Compare Packed Data for Greater Than (SSE4.2).\r\n  inline void pcmpgtq(const XmmVar& dst, const XmmVar& src)\r\n  { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); }\r\n  //! @brief Compare Packed Data for Greater Than (SSE4.2).\r\n  inline void pcmpgtq(const XmmVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPCmpGtQ, &dst, &src); }\r\n\r\n  //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2).\r\n  inline void popcnt(const GpVar& dst, const GpVar& src)\r\n  { _emitInstruction(kX86InstPopCnt, &dst, &src); }\r\n  //! @brief Return the Count of Number of Bits Set to 1 (SSE4.2).\r\n  inline void popcnt(const GpVar& dst, const Mem& src)\r\n  { _emitInstruction(kX86InstPopCnt, &dst, &src); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [AMD only]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Prefetch (3dNow - Amd).\r\n  //!\r\n  //! Loads the entire 64-byte aligned memory sequence containing the\r\n  //! specified memory address into the L1 data cache. The position of\r\n  //! the specified memory address within the 64-byte cache line is\r\n  //! irrelevant. If a cache hit occurs, or if a memory fault is detected,\r\n  //! no bus cycle is initiated and the instruction is treated as a NOP.\r\n  inline void amd_prefetch(const Mem& mem)\r\n  { _emitInstruction(kX86InstAmdPrefetch, &mem); }\r\n\r\n  //! @brief Prefetch and set cache to modified (3dNow - Amd).\r\n  //!\r\n  //! The PREFETCHW instruction loads the prefetched line and sets the\r\n  //! cache-line state to Modified, in anticipation of subsequent data\r\n  //! writes to the line. The PREFETCH instruction, by contrast, typically\r\n  //! sets the cache-line state to Exclusive (depending on the hardware\r\n  //! implementation).\r\n  inline void amd_prefetchw(const Mem& mem)\r\n  { _emitInstruction(kX86InstAmdPrefetchW, &mem); }\r\n\r\n  // --------------------------------------------------------------------------\r\n  // [Intel only]\r\n  // --------------------------------------------------------------------------\r\n\r\n  //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom).\r\n  inline void movbe(const GpVar& dst, const Mem& src)\r\n  {\r\n    ASMJIT_ASSERT(!dst.isGpb());\r\n    _emitInstruction(kX86InstMovBE, &dst, &src);\r\n  }\r\n\r\n  //! @brief Move Data After Swapping Bytes (SSE3 - Intel Atom).\r\n  inline void movbe(const Mem& dst, const GpVar& src)\r\n  {\r\n    ASMJIT_ASSERT(!src.isGpb());\r\n    _emitInstruction(kX86InstMovBE, &dst, &src);\r\n  }\r\n\r\n  // -------------------------------------------------------------------------\r\n  // [Emit Options]\r\n  // -------------------------------------------------------------------------\r\n\r\n  //! @brief Assert LOCK# Signal Prefix.\r\n  //!\r\n  //! This instruction causes the processor's LOCK# signal to be asserted\r\n  //! during execution of the accompanying instruction (turns the\r\n  //! instruction into an atomic instruction). In a multiprocessor environment,\r\n  //! the LOCK# signal insures that the processor has exclusive use of any shared\r\n  //! memory while the signal is asserted.\r\n  //!\r\n  //! The LOCK prefix can be prepended only to the following instructions and\r\n  //! to those forms of the instructions that use a memory operand: ADD, ADC,\r\n  //! AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD,\r\n  //! and XCHG. An undefined opcode exception will be generated if the LOCK\r\n  //! prefix is used with any other instruction. The XCHG instruction always\r\n  //! asserts the LOCK# signal regardless of the presence or absence of the LOCK\r\n  //! prefix.\r\n  inline void lock()\r\n  { _emitOptions |= kX86EmitOptionLock; }\r\n\r\n  //! @brief Force REX prefix to be emitted.\r\n  //!\r\n  //! This option should be used carefully, because there are unencodable\r\n  //! combinations. If you want to access ah, bh, ch or dh registers then you\r\n  //! can't emit REX prefix and it will cause an illegal instruction error.\r\n  //!\r\n  //! @note REX prefix is only valid for X64/AMD64 platform.\r\n  //!\r\n  //! @sa @c kX86EmitOptionRex.\r\n  inline void rex()\r\n  { _emitOptions |= kX86EmitOptionRex; }\r\n};\r\n\r\n//! @}\r\n\r\n} // AsmJit namespace\r\n\r\n#undef ASMJIT_NOT_SUPPORTED_BY_COMPILER\r\n\r\n// [Api-End]\r\n#include \"../core/apiend.h\"\r\n\r\n// [Guard]\r\n#endif // _ASMJIT_X86_X86COMPILER_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compilercontext.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/intutil.h\"\n#include \"../core/stringutil.h\"\n\n#include \"../x86/x86assembler.h\"\n#include \"../x86/x86compiler.h\"\n#include \"../x86/x86compilercontext.h\"\n#include \"../x86/x86compilerfunc.h\"\n#include \"../x86/x86compileritem.h\"\n#include \"../x86/x86util.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::CompilerContext - Construction / Destruction]\n// ============================================================================\n\nX86CompilerContext::X86CompilerContext(X86Compiler* x86Compiler) :\n  CompilerContext(x86Compiler)\n{\n  _state = &_x86State;\n\n  _clear();\n  _emitComments = x86Compiler->getLogger() != NULL;\n}\n\nX86CompilerContext::~X86CompilerContext()\n{\n}\n\n// ============================================================================\n// [AsmJit::CompilerContext - Clear]\n// ============================================================================\n\nvoid X86CompilerContext::_clear()\n{\n  _zoneMemory.clear();\n  _func = NULL;\n\n  _start = NULL;\n  _stop = NULL;\n\n  _x86State.clear();\n  _active = NULL;\n\n  _forwardJumps = NULL;\n\n  _currentOffset = 0;\n  _isUnreachable = 0;\n\n  _modifiedGpRegisters = 0;\n  _modifiedMmRegisters = 0;\n  _modifiedXmmRegisters = 0;\n\n  _allocableEBP = false;\n\n  _adjustESP = 0;\n\n  _argumentsBaseReg = kRegIndexInvalid; // Used by patcher.\n  _argumentsBaseOffset = 0;             // Used by patcher.\n  _argumentsActualDisp = 0;             // Used by translate().\n\n  _variablesBaseReg = kRegIndexInvalid; // Used by patcher.\n  _variablesBaseOffset = 0;             // Used by patcher.\n  _variablesActualDisp = 0;             // Used by translate()\n\n  _memUsed = NULL;\n  _memFree = NULL;\n\n  _mem4BlocksCount = 0;\n  _mem8BlocksCount = 0;\n  _mem16BlocksCount = 0;\n\n  _memBytesTotal = 0;\n\n  _backCode.clear();\n  _backPos = 0;\n}\n\n// ============================================================================\n// [AsmJit::CompilerContext - Construction / Destruction]\n// ============================================================================\n\nvoid X86CompilerContext::allocVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags)\n{\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n#endif // ASMJIT_X64\n      allocGpVar(var, regMask, vflags);\n      break;\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // TODO: X87 Support.\n      break;\n\n    case kX86VarTypeMm:\n      allocMmVar(var, regMask, vflags);\n      break;\n\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmSS:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmSD:\n    case kX86VarTypeXmmPD:\n      allocXmmVar(var, regMask, vflags);\n      break;\n  }\n\n  _postAlloc(var, vflags);\n}\n\nvoid X86CompilerContext::saveVar(X86CompilerVar* var)\n{\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n#endif // ASMJIT_X64\n      saveGpVar(var);\n      break;\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // TODO: X87 Support.\n      break;\n\n    case kX86VarTypeMm:\n      saveMmVar(var);\n      break;\n\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmSS:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmSD:\n    case kX86VarTypeXmmPD:\n      saveXmmVar(var);\n      break;\n  }\n}\n\nvoid X86CompilerContext::spillVar(X86CompilerVar* var)\n{\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n#endif // ASMJIT_X64\n      spillGpVar(var);\n      break;\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // TODO: X87 Support.\n      break;\n\n    case kX86VarTypeMm:\n      spillMmVar(var);\n      break;\n\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmSS:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmSD:\n    case kX86VarTypeXmmPD:\n      spillXmmVar(var);\n      break;\n  }\n}\n\nvoid X86CompilerContext::unuseVar(X86CompilerVar* var, uint32_t toState)\n{\n  ASMJIT_ASSERT(toState != kVarStateReg);\n\n  if (var->state == kVarStateReg)\n  {\n    uint32_t regIndex = var->regIndex;\n    switch (var->getType())\n    {\n      case kX86VarTypeGpd:\n#if defined(ASMJIT_X64)\n      case kX86VarTypeGpq:\n#endif // ASMJIT_X64\n        _x86State.gp[regIndex] = NULL;\n        _freedGpRegister(regIndex);\n        break;\n\n      case kX86VarTypeX87:\n      case kX86VarTypeX87SS:\n      case kX86VarTypeX87SD:\n        // TODO: X87 Support.\n        break;\n\n      case kX86VarTypeMm:\n        _x86State.mm[regIndex] = NULL;\n        _freedMmRegister(regIndex);\n        break;\n\n      case kX86VarTypeXmm:\n      case kX86VarTypeXmmSS:\n      case kX86VarTypeXmmPS:\n      case kX86VarTypeXmmSD:\n      case kX86VarTypeXmmPD:\n        _x86State.xmm[regIndex] = NULL;\n        _freedXmmRegister(regIndex);\n        break;\n    }\n  }\n\n  var->state = toState;\n  var->changed = false;\n  var->regIndex = kRegIndexInvalid;\n}\n\nvoid X86CompilerContext::allocGpVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags)\n{\n  uint32_t fullMask = IntUtil::maskUpToIndex(kX86RegNumGp) & ~IntUtil::maskFromIndex(kX86RegIndexEsp);\n  if (!_allocableEBP)\n    fullMask &= ~IntUtil::maskFromIndex(kX86RegIndexEbp);\n\n  // Fix the regMask (0 or full bit-array means that any register may be used).\n  if (regMask == 0)\n    regMask = 0xFFFFFFFF;\n  regMask &= fullMask;\n\n  // Working variables.\n  uint32_t i;\n  uint32_t mask;\n\n  // Last register code (aka home).\n  uint32_t home = var->homeRegisterIndex;\n  // New register code.\n  uint32_t idx = kRegIndexInvalid;\n\n  // Preserved GP variables.\n  uint32_t preservedGP = var->funcScope->getDecl()->getGpPreservedMask();\n\n  // Spill candidate.\n  X86CompilerVar* spillCandidate = NULL;\n\n  // Whether to alloc the non-preserved variables first.\n  bool nonPreservedFirst = true;\n\n  if (getFunc()->isCaller())\n    nonPreservedFirst = (var->funcCall == NULL) || (var->funcCall->getOffset() >= var->lastItem->getOffset());\n\n  // --------------------------------------------------------------------------\n  // [Already Allocated]\n  // --------------------------------------------------------------------------\n\n  // Go away if variable is already allocated.\n  if (var->state == kVarStateReg)\n  {\n    uint32_t oldIndex = var->regIndex;\n\n    // Already allocated in the right register.\n    if (IntUtil::maskFromIndex(oldIndex) & regMask)\n      return;\n\n    // Try to find unallocated register first.\n    mask = regMask & ~_x86State.usedGP;\n    if (mask != 0)\n    {\n      idx = IntUtil::findFirstBit((nonPreservedFirst && (mask & ~preservedGP) != 0) ? mask & ~preservedGP : mask);\n    }\n    // Then find the allocated and exchange later.\n    else\n    {\n      idx = IntUtil::findFirstBit(regMask & _x86State.usedGP);\n    }\n    ASMJIT_ASSERT(idx != kRegIndexInvalid);\n\n    X86CompilerVar* other = _x86State.gp[idx];\n    emitExchangeVar(var, idx, vflags, other);\n\n    _x86State.gp[oldIndex] = other;\n    _x86State.gp[idx     ] = var;\n\n    if (other)\n      other->regIndex = oldIndex;\n    else\n      _freedGpRegister(oldIndex);\n\n    // Update X86CompilerVar.\n    var->state = kVarStateReg;\n    var->regIndex = idx;\n    var->homeRegisterIndex = idx;\n\n    _allocatedGpRegister(idx);\n    return;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Find Unused GP]\n  // --------------------------------------------------------------------------\n\n  // Home register code.\n  if ((idx == kRegIndexInvalid) && \n      (home != kRegIndexInvalid) &&\n      (regMask          & IntUtil::maskFromIndex(home)) != 0 &&\n      (_x86State.usedGP & IntUtil::maskFromIndex(home)) == 0)\n  {\n    idx = home;\n    goto _Alloc;\n  }\n\n  // We start from 1, because EAX/RAX register is sometimes explicitly\n  // needed. So we trying to prevent reallocation in near future.\n  if (idx == kRegIndexInvalid)\n  {\n    for (i = 1, mask = (1 << i); i < kX86RegNumGp; i++, mask <<= 1)\n    {\n      if ((regMask & mask) != 0 && (_x86State.usedGP & mask) == 0)\n      {\n        // Convenience to alloc non-preserved first or non-preserved last.\n        if (nonPreservedFirst)\n        {\n          if (idx != kRegIndexInvalid && (preservedGP & mask) != 0)\n            continue;\n          \n          idx = i;\n          // If current register is preserved, we should try to find different\n          // one that is not. This can save one push / pop in prolog / epilog.\n          if ((preservedGP & mask) == 0)\n            break;\n        }\n        else\n        {\n          if (idx != kRegIndexInvalid && (preservedGP & mask) == 0)\n            continue;\n\n          idx = i;\n          // The opposite.\n          if ((preservedGP & mask) != 0)\n            break;\n        }\n      }\n    }\n  }\n\n  // If not found, try EAX/RAX.\n  if ((idx == kRegIndexInvalid) &&\n      (regMask          & IntUtil::maskFromIndex(kX86RegIndexEax)) != 0 &&\n      (_x86State.usedGP & IntUtil::maskFromIndex(kX86RegIndexEax)) == 0)\n  {\n    idx = kX86RegIndexEax;\n    goto _Alloc;\n  }\n\n  // If regMask contains restricted registers which may be used then everything\n  // is handled inside this block.\n  if ((idx == kRegIndexInvalid) && (regMask != fullMask))\n  {\n    // Try to find unallocated register first.\n    mask = regMask & ~_x86State.usedGP;\n    if (mask != 0)\n    {\n      idx = IntUtil::findFirstBit((nonPreservedFirst && (mask & ~preservedGP) != 0) ? (mask & ~preservedGP) : mask);\n      ASMJIT_ASSERT(idx != kRegIndexInvalid);\n    }\n    // Then find the allocated and spill later.\n    else\n    {\n      idx = IntUtil::findFirstBit(regMask & _x86State.usedGP);\n      ASMJIT_ASSERT(idx != kRegIndexInvalid);\n\n      // Spill register we need.\n      spillCandidate = _x86State.gp[idx];\n\n      // Jump to spill part of allocation.\n      goto L_Spill;\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Spill]\n  // --------------------------------------------------------------------------\n\n  // If register is still not found, spill other variable.\n  if (idx == kRegIndexInvalid)\n  {\n    if (spillCandidate == NULL)\n    {\n      spillCandidate = _getSpillCandidateGP();\n    }\n\n    // Spill candidate not found?\n    if (spillCandidate == NULL)\n    {\n      _compiler->setError(kErrorNoRegisters);\n      return;\n    }\n\nL_Spill:\n    // Prevented variables can't be spilled. _getSpillCandidate() never returns\n    // prevented variables, but when jumping to L_Spill it could happen.\n    if (spillCandidate->workOffset == _currentOffset)\n    {\n      _compiler->setError(kErrorOverlappedRegisters);\n      return;\n    }\n\n    idx = spillCandidate->regIndex;\n    spillGpVar(spillCandidate);\n  }\n\n  // --------------------------------------------------------------------------\n  // [Alloc]\n  // --------------------------------------------------------------------------\n\n_Alloc:\n  if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0)\n  {\n    emitLoadVar(var, idx);\n  }\n\n  // Update X86CompilerVar.\n  var->state = kVarStateReg;\n  var->regIndex = idx;\n  var->homeRegisterIndex = idx;\n\n  // Update CompilerState.\n  _allocatedVariable(var);\n}\n\nvoid X86CompilerContext::saveGpVar(X86CompilerVar* var)\n{\n  // Can't save variable that isn't allocated.\n  ASMJIT_ASSERT(var->state == kVarStateReg);\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  uint32_t idx = var->regIndex;\n  emitSaveVar(var, idx);\n\n  // Update X86CompilerVar.\n  var->changed = false;\n}\n\nvoid X86CompilerContext::spillGpVar(X86CompilerVar* var)\n{\n  // Can't spill variable that isn't allocated.\n  ASMJIT_ASSERT(var->state == kVarStateReg);\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  uint32_t idx = var->regIndex;\n\n  if (var->changed) emitSaveVar(var, idx);\n\n  // Update X86CompilerVar.\n  var->regIndex = kRegIndexInvalid;\n  var->state = kVarStateMem;\n  var->changed = false;\n\n  // Update CompilerState.\n  _x86State.gp[idx] = NULL;\n  _freedGpRegister(idx);\n}\n\nvoid X86CompilerContext::allocMmVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags)\n{\n  // Fix the regMask (0 or full bit-array means that any register may be used).\n  if (regMask == 0) regMask = IntUtil::maskUpToIndex(kX86RegNumMm);\n  regMask &= IntUtil::maskUpToIndex(kX86RegNumMm);\n\n  // Working variables.\n  uint32_t i;\n  uint32_t mask;\n\n  // Last register code (aka home).\n  uint32_t home = var->homeRegisterIndex;\n  // New register code.\n  uint32_t idx = kRegIndexInvalid;\n\n  // Preserved MM variables.\n  //\n  // NOTE: Currently MM variables are not preserved and there is no calling\n  // convention known to me that does that. But on the other side it's possible\n  // to write such calling convention.\n  uint32_t preservedMM = var->funcScope->getDecl()->getMmPreservedMask();\n\n  // Spill candidate.\n  X86CompilerVar* spillCandidate = NULL;\n\n  // Whether to alloc non-preserved first or last.\n  bool nonPreservedFirst = true;\n  if (this->getFunc()->isCaller())\n  {\n    nonPreservedFirst = var->funcCall == NULL || var->funcCall->getOffset() >= var->lastItem->getOffset();\n  }\n\n  // --------------------------------------------------------------------------\n  // [Already Allocated]\n  // --------------------------------------------------------------------------\n\n  // Go away if variable is already allocated.\n  if (var->state == kVarStateReg)\n  {\n    uint32_t oldIndex = var->regIndex;\n\n    // Already allocated in the right register.\n    if (IntUtil::maskFromIndex(oldIndex) & regMask) return;\n\n    // Try to find unallocated register first.\n    mask = regMask & ~_x86State.usedMM;\n    if (mask != 0)\n    {\n      idx = IntUtil::findFirstBit(\n        (nonPreservedFirst && (mask & ~preservedMM) != 0) ? mask & ~preservedMM : mask);\n    }\n    // Then find the allocated and exchange later.\n    else\n    {\n      idx = IntUtil::findFirstBit(regMask & _x86State.usedMM);\n    }\n    ASMJIT_ASSERT(idx != kRegIndexInvalid);\n\n    X86CompilerVar* other = _x86State.mm[idx];\n    if (other) spillMmVar(other);\n\n    emitMoveVar(var, idx, vflags);\n    _freedMmRegister(oldIndex);\n    _x86State.mm[idx] = var;\n\n    // Update X86CompilerVar.\n    var->state = kVarStateReg;\n    var->regIndex = idx;\n    var->homeRegisterIndex = idx;\n\n    _allocatedMmRegister(idx);\n    return;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Find Unused MM]\n  // --------------------------------------------------------------------------\n\n  // If regMask contains restricted registers which may be used then everything\n  // is handled in this block.\n  if (regMask != IntUtil::maskUpToIndex(kX86RegNumMm))\n  {\n    // Try to find unallocated register first.\n    mask = regMask & ~_x86State.usedMM;\n    if (mask != 0)\n    {\n      idx = IntUtil::findFirstBit(\n        (nonPreservedFirst && (mask & ~preservedMM) != 0) ? mask & ~preservedMM : mask);\n      ASMJIT_ASSERT(idx != kRegIndexInvalid);\n    }\n    // Then find the allocated and spill later.\n    else\n    {\n      idx = IntUtil::findFirstBit(regMask & _x86State.usedMM);\n      ASMJIT_ASSERT(idx != kRegIndexInvalid);\n\n      // Spill register we need.\n      spillCandidate = _x86State.mm[idx];\n\n      // Jump to spill part of allocation.\n      goto L_Spill;\n    }\n  }\n\n  // Home register code.\n  if (idx == kRegIndexInvalid && home != kRegIndexInvalid)\n  {\n    if ((_x86State.usedMM & (1U << home)) == 0) idx = home;\n  }\n\n  if (idx == kRegIndexInvalid)\n  {\n    for (i = 0, mask = (1 << i); i < kX86RegNumMm; i++, mask <<= 1)\n    {\n      if ((_x86State.usedMM & mask) == 0)\n      {\n        // Convenience to alloc non-preserved first or non-preserved last.\n        if (nonPreservedFirst)\n        {\n          if (idx != kRegIndexInvalid && (preservedMM & mask) != 0) continue;\n          idx = i;\n          // If current register is preserved, we should try to find different\n          // one that is not. This can save one push / pop in prolog / epilog.\n          if ((preservedMM & mask) == 0) break;\n        }\n        else\n        {\n          if (idx != kRegIndexInvalid && (preservedMM & mask) == 0) continue;\n          idx = i;\n          // The opposite.\n          if ((preservedMM & mask) != 0) break;\n        }\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Spill]\n  // --------------------------------------------------------------------------\n\n  // If register is still not found, spill other variable.\n  if (idx == kRegIndexInvalid)\n  {\n    if (spillCandidate == NULL) spillCandidate = _getSpillCandidateMM();\n\n    // Spill candidate not found?\n    if (spillCandidate == NULL)\n    {\n      _compiler->setError(kErrorNoRegisters);\n      return;\n    }\n\nL_Spill:\n\n    // Prevented variables can't be spilled. _getSpillCandidate() never returns\n    // prevented variables, but when jumping to L_spill it can happen.\n    if (spillCandidate->workOffset == _currentOffset)\n    {\n      _compiler->setError(kErrorOverlappedRegisters);\n      return;\n    }\n\n    idx = spillCandidate->regIndex;\n    spillMmVar(spillCandidate);\n  }\n\n  // --------------------------------------------------------------------------\n  // [Alloc]\n  // --------------------------------------------------------------------------\n\n  if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0)\n  {\n    emitLoadVar(var, idx);\n  }\n\n  // Update X86CompilerVar.\n  var->state = kVarStateReg;\n  var->regIndex = idx;\n  var->homeRegisterIndex = idx;\n\n  // Update CompilerState.\n  _allocatedVariable(var);\n}\n\nvoid X86CompilerContext::saveMmVar(X86CompilerVar* var)\n{\n  // Can't save variable that isn't allocated.\n  ASMJIT_ASSERT(var->state == kVarStateReg);\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  uint32_t idx = var->regIndex;\n  emitSaveVar(var, idx);\n\n  // Update X86CompilerVar.\n  var->changed = false;\n}\n\nvoid X86CompilerContext::spillMmVar(X86CompilerVar* var)\n{\n  // Can't spill variable that isn't allocated.\n  ASMJIT_ASSERT(var->state == kVarStateReg);\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  uint32_t idx = var->regIndex;\n\n  if (var->changed) emitSaveVar(var, idx);\n\n  // Update X86CompilerVar.\n  var->regIndex = kRegIndexInvalid;\n  var->state = kVarStateMem;\n  var->changed = false;\n\n  // Update CompilerState.\n  _x86State.mm[idx] = NULL;\n  _freedMmRegister(idx);\n}\n\nvoid X86CompilerContext::allocXmmVar(X86CompilerVar* var, uint32_t regMask, uint32_t vflags)\n{\n  // Fix the regMask (0 or full bit-array means that any register may be used).\n  if (regMask == 0) regMask = IntUtil::maskUpToIndex(kX86RegNumXmm);\n  regMask &= IntUtil::maskUpToIndex(kX86RegNumXmm);\n\n  // Working variables.\n  uint32_t i;\n  uint32_t mask;\n\n  // Last register code (aka home).\n  uint32_t home = var->homeRegisterIndex;\n  // New register code.\n  uint32_t idx = kRegIndexInvalid;\n\n  // Preserved XMM variables.\n  uint32_t preservedXMM = var->funcScope->getDecl()->getXmmPreservedMask();\n\n  // Spill candidate.\n  X86CompilerVar* spillCandidate = NULL;\n\n  // Whether to alloc non-preserved first or last.\n  bool nonPreservedFirst = true;\n\n  if (this->getFunc()->isCaller())\n    nonPreservedFirst = (var->funcCall == NULL) || (var->funcCall->getOffset() >= var->lastItem->getOffset());\n\n  // --------------------------------------------------------------------------\n  // [Already Allocated]\n  // --------------------------------------------------------------------------\n\n  // Go away if variable is already allocated.\n  if (var->state == kVarStateReg)\n  {\n    uint32_t oldIndex = var->regIndex;\n\n    // Already allocated in the right register.\n    if (IntUtil::maskFromIndex(oldIndex) & regMask) return;\n\n    // Try to find unallocated register first.\n    mask = regMask & ~_x86State.usedXMM;\n    if (mask != 0)\n    {\n      idx = IntUtil::findFirstBit(\n        (nonPreservedFirst && (mask & ~preservedXMM) != 0) ? mask & ~preservedXMM : mask);\n    }\n    // Then find the allocated and exchange later.\n    else\n    {\n      idx = IntUtil::findFirstBit(regMask & _x86State.usedXMM);\n    }\n    ASMJIT_ASSERT(idx != kRegIndexInvalid);\n\n    X86CompilerVar* other = _x86State.xmm[idx];\n    if (other) spillXmmVar(other);\n\n    emitMoveVar(var, idx, vflags);\n    _freedXmmRegister(oldIndex);\n    _x86State.xmm[idx] = var;\n\n    // Update X86CompilerVar.\n    var->state = kVarStateReg;\n    var->regIndex = idx;\n    var->homeRegisterIndex = idx;\n\n    _allocatedXmmRegister(idx);\n    return;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Find Unused XMM]\n  // --------------------------------------------------------------------------\n\n  // If regMask contains restricted registers which may be used then everything\n  // is handled in this block.\n  if (regMask != IntUtil::maskUpToIndex(kX86RegNumXmm))\n  {\n    // Try to find unallocated register first.\n    mask = regMask & ~_x86State.usedXMM;\n    if (mask != 0)\n    {\n      idx = IntUtil::findFirstBit(\n        (nonPreservedFirst && (mask & ~preservedXMM) != 0) ? mask & ~preservedXMM : mask);\n      ASMJIT_ASSERT(idx != kRegIndexInvalid);\n    }\n    // Then find the allocated and spill later.\n    else\n    {\n      idx = IntUtil::findFirstBit(regMask & _x86State.usedXMM);\n      ASMJIT_ASSERT(idx != kRegIndexInvalid);\n\n      // Spill register we need.\n      spillCandidate = _x86State.xmm[idx];\n\n      // Jump to spill part of allocation.\n      goto L_Spill;\n    }\n  }\n\n  // Home register code.\n  if (idx == kRegIndexInvalid && home != kRegIndexInvalid)\n  {\n    if ((_x86State.usedXMM & (1U << home)) == 0) idx = home;\n  }\n\n  if (idx == kRegIndexInvalid)\n  {\n    for (i = 0, mask = (1 << i); i < kX86RegNumXmm; i++, mask <<= 1)\n    {\n      if ((_x86State.usedXMM & mask) == 0)\n      {\n        // Convenience to alloc non-preserved first or non-preserved last.\n        if (nonPreservedFirst)\n        {\n          if (idx != kRegIndexInvalid && (preservedXMM & mask) != 0) continue;\n          idx = i;\n          // If current register is preserved, we should try to find different\n          // one that is not. This can save one push / pop in prolog / epilog.\n          if ((preservedXMM & mask) == 0) break;\n        }\n        else\n        {\n          if (idx != kRegIndexInvalid && (preservedXMM & mask) == 0) continue;\n          idx = i;\n          // The opposite.\n          if ((preservedXMM & mask) != 0) break;\n        }\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Spill]\n  // --------------------------------------------------------------------------\n\n  // If register is still not found, spill other variable.\n  if (idx == kRegIndexInvalid)\n  {\n    if (spillCandidate == NULL)\n      spillCandidate = _getSpillCandidateXMM();\n\n    // Spill candidate not found?\n    if (spillCandidate == NULL)\n    {\n      _compiler->setError(kErrorNoRegisters);\n      return;\n    }\n\nL_Spill:\n\n    // Prevented variables can't be spilled. _getSpillCandidate() never returns\n    // prevented variables, but when jumping to L_spill it can happen.\n    if (spillCandidate->workOffset == _currentOffset)\n    {\n      _compiler->setError(kErrorOverlappedRegisters);\n      return;\n    }\n\n    idx = spillCandidate->regIndex;\n    spillXmmVar(spillCandidate);\n  }\n\n  // --------------------------------------------------------------------------\n  // [Alloc]\n  // --------------------------------------------------------------------------\n\n  if (var->state == kVarStateMem && (vflags & kVarAllocRead) != 0)\n  {\n    emitLoadVar(var, idx);\n  }\n\n  // Update X86CompilerVar.\n  var->state = kVarStateReg;\n  var->regIndex = idx;\n  var->homeRegisterIndex = idx;\n\n  // Update CompilerState.\n  _allocatedVariable(var);\n}\n\nvoid X86CompilerContext::saveXmmVar(X86CompilerVar* var)\n{\n  // Can't save variable that isn't allocated.\n  ASMJIT_ASSERT(var->state == kVarStateReg);\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  uint32_t idx = var->regIndex;\n  emitSaveVar(var, idx);\n\n  // Update X86CompilerVar.\n  var->changed = false;\n}\n\nvoid X86CompilerContext::spillXmmVar(X86CompilerVar* var)\n{\n  // Can't spill variable that isn't allocated.\n  ASMJIT_ASSERT(var->state == kVarStateReg);\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  uint32_t idx = var->regIndex;\n\n  if (var->changed) emitSaveVar(var, idx);\n\n  // Update CompilerVar.\n  var->regIndex = kRegIndexInvalid;\n  var->state = kVarStateMem;\n  var->changed = false;\n\n  // Update CompilerState.\n  _x86State.xmm[idx] = NULL;\n  _freedXmmRegister(idx);\n}\n\nvoid X86CompilerContext::emitLoadVar(X86CompilerVar* var, uint32_t regIndex)\n{\n  X86Compiler* x86Compiler = getCompiler();\n  Mem m = _getVarMem(var);\n\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n      x86Compiler->emit(kX86InstMov, gpd(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n      x86Compiler->emit(kX86InstMov, gpq(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n#endif // ASMJIT_X64\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // TODO: X87 Support.\n      break;\n\n    case kX86VarTypeMm:\n      x86Compiler->emit(kX86InstMovQ, mm(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n\n    case kX86VarTypeXmm:\n      x86Compiler->emit(kX86InstMovDQA, xmm(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmSS:\n      x86Compiler->emit(kX86InstMovSS, xmm(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmSD:\n      x86Compiler->emit(kX86InstMovSD, xmm(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmPS:\n      x86Compiler->emit(kX86InstMovAPS, xmm(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmPD:\n      x86Compiler->emit(kX86InstMovAPD, xmm(regIndex), m);\n      if (_emitComments) goto _AddComment;\n      break;\n  }\n  return;\n\n_AddComment:\n  x86Compiler->getCurrentItem()->formatComment(\"Alloc %s\", var->getName());\n}\n\nvoid X86CompilerContext::emitSaveVar(X86CompilerVar* var, uint32_t regIndex)\n{\n  // Caller must ensure that variable is allocated.\n  ASMJIT_ASSERT(regIndex != kRegIndexInvalid);\n\n  X86Compiler* x86Compiler = getCompiler();\n  Mem m = _getVarMem(var);\n\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n      x86Compiler->emit(kX86InstMov, m, gpd(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n      x86Compiler->emit(kX86InstMov, m, gpq(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n#endif // ASMJIT_X64\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // TODO: X87 Support.\n      break;\n\n    case kX86VarTypeMm:\n      x86Compiler->emit(kX86InstMovQ, m, mm(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n\n    case kX86VarTypeXmm:\n      x86Compiler->emit(kX86InstMovDQA, m, xmm(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmSS:\n      x86Compiler->emit(kX86InstMovSS, m, xmm(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmSD:\n      x86Compiler->emit(kX86InstMovSD, m, xmm(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmPS:\n      x86Compiler->emit(kX86InstMovAPS, m, xmm(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n    case kX86VarTypeXmmPD:\n      x86Compiler->emit(kX86InstMovAPD, m, xmm(regIndex));\n      if (_emitComments) goto _AddComment;\n      break;\n  }\n  return;\n\n_AddComment:\n  x86Compiler->getCurrentItem()->formatComment(\"Spill %s\", var->getName());\n}\n\nvoid X86CompilerContext::emitMoveVar(X86CompilerVar* var, uint32_t regIndex, uint32_t vflags)\n{\n  // Caller must ensure that the given variable is allocated.\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  X86Compiler* x86Compiler = getCompiler();\n  if ((vflags & kVarAllocRead) == 0) return;\n\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n      x86Compiler->emit(kX86InstMov, gpd(regIndex), gpd(var->regIndex));\n      break;\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n      x86Compiler->emit(kX86InstMov, gpq(regIndex), gpq(var->regIndex));\n      break;\n#endif // ASMJIT_X64\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // TODO: X87 Support.\n      break;\n\n    case kX86VarTypeMm:\n      x86Compiler->emit(kX86InstMovQ, mm(regIndex), mm(var->regIndex));\n      break;\n\n    case kX86VarTypeXmm:\n      x86Compiler->emit(kX86InstMovDQA, xmm(regIndex), xmm(var->regIndex));\n      break;\n    case kX86VarTypeXmmSS:\n      x86Compiler->emit(kX86InstMovSS, xmm(regIndex), xmm(var->regIndex));\n      break;\n    case kX86VarTypeXmmSD:\n      x86Compiler->emit(kX86InstMovSD, xmm(regIndex), xmm(var->regIndex));\n      break;\n    case kX86VarTypeXmmPS:\n      x86Compiler->emit(kX86InstMovAPS, xmm(regIndex), xmm(var->regIndex));\n      break;\n    case kX86VarTypeXmmPD:\n      x86Compiler->emit(kX86InstMovAPD, xmm(regIndex), xmm(var->regIndex));\n      break;\n  }\n}\n\nvoid X86CompilerContext::emitExchangeVar(X86CompilerVar* var, uint32_t regIndex, uint32_t vflags, X86CompilerVar* other)\n{\n  // Caller must ensure that the given variable is allocated.\n  ASMJIT_ASSERT(var->regIndex != kRegIndexInvalid);\n\n  X86Compiler* x86Compiler = getCompiler();\n\n  // If other is not valid then we can just emit MOV (or other similar instruction).\n  if (other == NULL)\n  {\n    emitMoveVar(var, regIndex, vflags);\n    return;\n  }\n\n  // If we need to alloc for write-only operation then we can move other\n  // variable away instead of exchanging them.\n  if ((vflags & kVarAllocRead) == 0)\n  {\n    emitMoveVar(other, var->regIndex, kVarAllocRead);\n    return;\n  }\n\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n      x86Compiler->emit(kX86InstXchg, gpd(regIndex), gpd(var->regIndex));\n      break;\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n      x86Compiler->emit(kX86InstXchg, gpq(regIndex), gpq(var->regIndex));\n      break;\n#endif // ASMJIT_X64\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // TODO: X87 Support.\n      break;\n\n    // NOTE: MM and XMM registers shoudln't be exchanged using this way, it's\n    // correct, but instead of using one instruction we need three.\n\n    case kX86VarTypeMm:\n    {\n      MmReg a = mm(regIndex);\n      MmReg b = mm(var->regIndex);\n\n      x86Compiler->emit(kX86InstPXor, a, b);\n      x86Compiler->emit(kX86InstPXor, b, a);\n      x86Compiler->emit(kX86InstPXor, a, b);\n      break;\n    }\n\n    case kX86VarTypeXmmSS:\n    case kX86VarTypeXmmPS:\n    {\n      XmmReg a = xmm(regIndex);\n      XmmReg b = xmm(var->regIndex);\n\n      x86Compiler->emit(kX86InstXorPS, a, b);\n      x86Compiler->emit(kX86InstXorPS, b, a);\n      x86Compiler->emit(kX86InstXorPS, a, b);\n      break;\n    }\n\n    case kX86VarTypeXmmSD:\n    case kX86VarTypeXmmPD:\n    {\n      XmmReg a = xmm(regIndex);\n      XmmReg b = xmm(var->regIndex);\n\n      x86Compiler->emit(kX86InstXorPD, a, b);\n      x86Compiler->emit(kX86InstXorPD, b, a);\n      x86Compiler->emit(kX86InstXorPD, a, b);\n      break;\n    }\n\n    case kX86VarTypeXmm:\n    {\n      XmmReg a = xmm(regIndex);\n      XmmReg b = xmm(var->regIndex);\n\n      x86Compiler->emit(kX86InstPXor, a, b);\n      x86Compiler->emit(kX86InstPXor, b, a);\n      x86Compiler->emit(kX86InstPXor, a, b);\n      break;\n    }\n  }\n}\n\nvoid X86CompilerContext::_postAlloc(X86CompilerVar* var, uint32_t vflags)\n{\n  if (vflags & kVarAllocWrite)\n    var->changed = true;\n}\n\nvoid X86CompilerContext::_markMemoryUsed(X86CompilerVar* var)\n{\n  if (var->homeMemoryData != NULL) return;\n\n  VarMemBlock* mem = _allocMemBlock(var->getSize());\n  if (!mem) return;\n\n  var->homeMemoryData = mem;\n}\n\nMem X86CompilerContext::_getVarMem(X86CompilerVar* var)\n{\n  Mem m;\n  m._mem.id = var->getId();\n\n  if (!var->isMemArgument())\n    m._mem.displacement = _adjustESP;\n\n  _markMemoryUsed(var);\n  return m;\n}\n\nstatic int32_t getSpillScore(X86CompilerVar* var, uint32_t currentOffset)\n{\n  int32_t score = 0;\n\n  ASMJIT_ASSERT(var->lastItem != NULL);\n  uint32_t lastOffset = var->lastItem->getOffset();\n\n  if (lastOffset >= currentOffset)\n    score += (int32_t)(lastOffset - currentOffset);\n\n  // Each write access decreases probability of spill.\n  score -= static_cast<int32_t>(var->regWriteCount) + static_cast<int32_t>(var->regRwCount);\n  // Each read-only access increases probability of spill.\n  score += static_cast<int32_t>(var->regReadCount);\n\n  // Each memory access increases probability of spill.\n  score += static_cast<int32_t>(var->memWriteCount) + static_cast<int32_t>(var->memRwCount);\n  score += static_cast<int32_t>(var->memReadCount);\n\n  return score;\n}\n\nX86CompilerVar* X86CompilerContext::_getSpillCandidateGP()\n{\n  return _getSpillCandidateGeneric(_x86State.gp, kX86RegNumGp);\n}\n\nX86CompilerVar* X86CompilerContext::_getSpillCandidateMM()\n{\n  return _getSpillCandidateGeneric(_x86State.mm, kX86RegNumMm);\n}\n\nX86CompilerVar* X86CompilerContext::_getSpillCandidateXMM()\n{\n  return _getSpillCandidateGeneric(_x86State.xmm, kX86RegNumXmm);\n}\n\nX86CompilerVar* X86CompilerContext::_getSpillCandidateGeneric(X86CompilerVar** varArray, uint32_t count)\n{\n  uint32_t i;\n\n  X86CompilerVar* candidate = NULL;\n  uint32_t candidatePriority = 0;\n  int32_t candidateScore = 0;\n\n  uint32_t currentOffset = _compiler->getCurrentItem()->getOffset();\n\n  for (i = 0; i < count; i++)\n  {\n    // Get variable.\n    X86CompilerVar* cv = varArray[i];\n\n    // Never spill variables needed for next instruction.\n    if (cv == NULL || cv->workOffset == _currentOffset) continue;\n\n    uint32_t variablePriority = cv->getPriority();\n    int32_t variableScore = getSpillScore(cv, currentOffset);\n\n    if ((candidate == NULL) ||\n        (variablePriority > candidatePriority) ||\n        (variablePriority == candidatePriority && variableScore > candidateScore))\n    {\n      candidate = cv;\n      candidatePriority = variablePriority;\n      candidateScore = variableScore;\n    }\n  }\n\n  return candidate;\n}\n\nvoid X86CompilerContext::_addActive(X86CompilerVar* var)\n{\n  // Never call with variable that is already in active list.\n  ASMJIT_ASSERT(var->nextActive == NULL);\n  ASMJIT_ASSERT(var->prevActive == NULL);\n\n  if (_active == NULL)\n  {\n    var->nextActive = var;\n    var->prevActive = var;\n\n    _active = var;\n  }\n  else\n  {\n    X86CompilerVar* vlast = static_cast<X86CompilerVar*>(_active)->prevActive;\n\n    vlast->nextActive = var;\n    static_cast<X86CompilerVar*>(_active)->prevActive = var;\n\n    var->nextActive = static_cast<X86CompilerVar*>(_active);\n    var->prevActive = vlast;\n  }\n}\n\nvoid X86CompilerContext::_freeActive(X86CompilerVar* var)\n{\n  X86CompilerVar* next = var->nextActive;\n  X86CompilerVar* prev = var->prevActive;\n\n  if (prev == next)\n  {\n    _active = NULL;\n  }\n  else\n  {\n    if (_active == var)\n      _active = next;\n\n    prev->nextActive = next;\n    next->prevActive = prev;\n  }\n\n  var->nextActive = NULL;\n  var->prevActive = NULL;\n}\n\nvoid X86CompilerContext::_freeAllActive()\n{\n  if (_active == NULL)\n    return;\n\n  X86CompilerVar* cur = static_cast<X86CompilerVar*>(_active);\n  for (;;)\n  {\n    X86CompilerVar* next = cur->nextActive;\n\n    cur->nextActive = NULL;\n    cur->prevActive = NULL;\n\n    if (next == _active)\n      break;\n  }\n\n  _active = NULL;\n}\n\nvoid X86CompilerContext::_allocatedVariable(X86CompilerVar* var)\n{\n  uint32_t idx = var->regIndex;\n\n  switch (var->getType())\n  {\n    case kX86VarTypeGpd:\n    case kX86VarTypeGpq:\n      _x86State.gp[idx] = var;\n      _allocatedGpRegister(idx);\n      break;\n\n    case kX86VarTypeMm:\n      _x86State.mm[idx] = var;\n      _allocatedMmRegister(idx);\n      break;\n\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmSS:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmSD:\n    case kX86VarTypeXmmPD:\n      _x86State.xmm[idx] = var;\n      _allocatedXmmRegister(idx);\n      break;\n\n    default:\n      ASMJIT_ASSERT(0);\n      break;\n  }\n}\n\nvoid X86CompilerContext::translateOperands(Operand* operands, uint32_t count)\n{\n  X86Compiler* x86Compiler = getCompiler();\n  uint32_t i;\n\n  // Translate variables to registers.\n  for (i = 0; i < count; i++)\n  {\n    Operand& o = operands[i];\n\n    if (o.isVar())\n    {\n      X86CompilerVar* cv = x86Compiler->_getVar(o.getId());\n      ASMJIT_ASSERT(cv != NULL);\n\n      o._reg.op = kOperandReg;\n      o._reg.code |= cv->regIndex;\n    }\n    else if (o.isMem())\n    {\n      if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        // Memory access. We just increment here actual displacement.\n        X86CompilerVar* cv = x86Compiler->_getVar(o.getId());\n        ASMJIT_ASSERT(cv != NULL);\n\n        o._mem.displacement += cv->isMemArgument()\n          ? _argumentsActualDisp\n          : _variablesActualDisp;\n        // NOTE: This is not enough, variable position will be patched later\n        // by X86CompilerContext::_patchMemoryOperands().\n      }\n      else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(o._mem.base);\n        ASMJIT_ASSERT(cv != NULL);\n\n        o._mem.base = cv->regIndex;\n      }\n\n      if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(o._mem.index);\n        ASMJIT_ASSERT(cv != NULL);\n\n        o._mem.index = cv->regIndex;\n      }\n    }\n  }\n}\n\nvoid X86CompilerContext::addBackwardCode(X86CompilerJmpInst* from)\n{\n  _backCode.append(from);\n}\n\nvoid X86CompilerContext::addForwardJump(X86CompilerJmpInst* inst)\n{\n  ForwardJumpData* j =\n    reinterpret_cast<ForwardJumpData*>(_zoneMemory.alloc(sizeof(ForwardJumpData)));\n  if (j == NULL) { _compiler->setError(kErrorNoHeapMemory); return; }\n\n  j->inst = inst;\n  j->state = _saveState();\n  j->next = _forwardJumps;\n  _forwardJumps = j;\n}\n\nX86CompilerState* X86CompilerContext::_saveState()\n{\n  X86Compiler* x86Compiler = getCompiler();\n\n  // Get count of variables stored in memory.\n  uint32_t memVarsCount = 0;\n  X86CompilerVar* cur = static_cast<X86CompilerVar*>(_active);\n\n  if (cur)\n  {\n    do {\n      if (cur->state == kVarStateMem) memVarsCount++;\n      cur = cur->nextActive;\n    } while (cur != _active);\n  }\n\n  // Alloc X86CompilerState structure (using zone allocator) and copy current\n  // state into it.\n  X86CompilerState* state = x86Compiler->_newState(memVarsCount);\n  memcpy(state, &_x86State, sizeof(X86CompilerState));\n\n  // Clear changed flags.\n  state->changedGP = 0;\n  state->changedMM = 0;\n  state->changedXMM = 0;\n\n  uint i;\n  uint mask;\n\n  // Save variables stored in REGISTERs and CHANGE flag.\n  for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n  {\n    if (state->gp[i] && state->gp[i]->changed)\n      state->changedGP |= mask;\n  }\n\n  for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1)\n  {\n    if (state->mm[i] && state->mm[i]->changed)\n      state->changedMM |= mask;\n  }\n\n  for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1)\n  {\n    if (state->xmm[i] && state->xmm[i]->changed)\n      state->changedXMM |= mask;\n  }\n\n  // Save variables stored in MEMORY.\n  state->memVarsCount = memVarsCount;\n  memVarsCount = 0;\n\n  cur = static_cast<X86CompilerVar*>(_active);\n  if (cur)\n  {\n    do {\n      if (cur->state == kVarStateMem) state->memVarsData[memVarsCount++] = cur;\n      cur = cur->nextActive;\n    } while (cur != _active);\n  }\n\n  // Finished.\n  return state;\n}\n\nvoid X86CompilerContext::_assignState(X86CompilerState* state)\n{\n  Compiler* compiler = getCompiler();\n\n  memcpy(&_x86State, state, sizeof(X86CompilerState));\n  _x86State.memVarsCount = 0;\n\n  uint i, mask;\n  X86CompilerVar* cv;\n\n  // Unuse all variables first.\n  cv = static_cast<X86CompilerVar*>(_active);\n  if (cv)\n  {\n    do {\n      cv->state = kVarStateUnused;\n      cv = cv->nextActive;\n    } while (cv != _active);\n  }\n\n  // Assign variables stored in memory which are not unused.\n  for (i = 0; i < state->memVarsCount; i++)\n  {\n    state->memVarsData[i]->state = kVarStateMem;\n  }\n\n  // Assign allocated variables.\n  for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n  {\n    if ((cv = _x86State.gp[i]) != NULL)\n    {\n      cv->state = kVarStateReg;\n      cv->regIndex = i;\n      cv->changed = (_x86State.changedGP & mask) != 0;\n    }\n  }\n\n  for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1)\n  {\n    if ((cv = _x86State.mm[i]) != NULL)\n    {\n      cv->state = kVarStateReg;\n      cv->regIndex = i;\n      cv->changed = (_x86State.changedMM & mask) != 0;\n    }\n  }\n\n  for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1)\n  {\n    if ((cv = _x86State.xmm[i]) != NULL)\n    {\n      cv->state = kVarStateReg;\n      cv->regIndex = i;\n      cv->changed = (_x86State.changedXMM & mask) != 0;\n    }\n  }\n}\n\nvoid X86CompilerContext::_restoreState(X86CompilerState* state, uint32_t targetOffset)\n{\n  X86CompilerState* fromState = &_x86State;\n  X86CompilerState* toState = state;\n\n  // No change, rare...\n  if (fromState == toState)\n    return;\n\n  uint base;\n  uint i;\n\n  // --------------------------------------------------------------------------\n  // Set target state to all variables. cv->tInt is target state in this func.\n  // --------------------------------------------------------------------------\n\n  {\n    // UNUSED.\n    X86CompilerVar* cv = static_cast<X86CompilerVar*>(_active);\n    if (cv)\n    {\n      do {\n        cv->tInt = kVarStateUnused;\n        cv = cv->nextActive;\n      } while (cv != _active);\n    }\n\n    // MEMORY.\n    for (i = 0; i < toState->memVarsCount; i++)\n    {\n      toState->memVarsData[i]->tInt = kVarStateMem;\n    }\n\n    // REGISTER.\n    for (i = 0; i < X86CompilerState::kStateRegCount; i++)\n    {\n      if ((cv = toState->regs[i]) != NULL) cv->tInt = kVarStateReg;\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [GP-Registers Switch]\n  // --------------------------------------------------------------------------\n\n  // TODO.\n#if 0\n  for (i = 0; i < kX86RegNumGp; i++)\n  {\n    X86CompilerVar* fromVar = fromState->gp[i];\n    X86CompilerVar* toVar = toState->gp[i];\n\n    if (fromVar != toVar)\n    {\n      if (fromVar != NULL)\n      {\n        if (toVar != NULL)\n        {\n          if (fromState->gp[to\n        }\n        else\n        {\n          // It is possible that variable that was saved in state currently not\n          // exists (tInt is target scope!).\n          if (fromVar->tInt == kVarStateUnused)\n          {\n            unuseVar(fromVar, kVarStateUnused);\n          }\n          else\n          {\n            spillVar(fromVar);\n          }\n        }\n      }\n    }\n    else if (fromVar != NULL)\n    {\n      uint32_t mask = IntUtil::maskFromIndex(i);\n      // Variables are the same, we just need to compare changed flags.\n      if ((fromState->changedGP & mask) && !(toState->changedGP & mask)) saveVar(fromVar);\n    }\n  }\n#endif\n\n  // Spill.\n  for (base = 0, i = 0; i < X86CompilerState::kStateRegCount; i++)\n  {\n    // Change the base offset (from base offset so the register index can be calculated).\n    if (i == X86CompilerState::kStateRegMmBase || i == X86CompilerState::kStateRegXmmBase)\n      base = i;\n\n    uint32_t regIndex = i - base;\n    X86CompilerVar* fromVar = fromState->regs[i];\n    X86CompilerVar* toVar = toState->regs[i];\n\n    if (fromVar != toVar)\n    {\n      // Spill the register.\n      if (fromVar != NULL)\n      {\n        // It is possible that variable that was saved in state currently not\n        // exists (tInt is target scope!).\n        if (fromVar->tInt == kVarStateUnused)\n          unuseVar(fromVar, kVarStateUnused);\n        else\n          spillVar(fromVar);\n      }\n    }\n    else if (fromVar != NULL)\n    {\n      // Variables are the same, we just need to compare changed flags.\n      uint32_t mask = IntUtil::maskFromIndex(regIndex);\n\n      if ((fromState->changedGP & mask) && !(toState->changedGP & mask))\n        saveVar(fromVar);\n    }\n  }\n\n  // Alloc.\n  for (base = 0, i = 0; i < X86CompilerState::kStateRegCount; i++)\n  {\n    // Change the base offset (from base offset so the register index can be calculated).\n    if (i == X86CompilerState::kStateRegMmBase || i == X86CompilerState::kStateRegXmmBase)\n      base = i;\n\n    X86CompilerVar* fromVar = fromState->regs[i];\n    X86CompilerVar* toVar = toState->regs[i];\n\n    if (fromVar != toVar)\n    {\n      // Alloc register.\n      uint32_t regIndex = i - base;\n\n      if (toVar != NULL)\n        allocVar(toVar, IntUtil::maskFromIndex(regIndex), kVarAllocRead);\n    }\n\n    // TODO:\n    //if (toVar)\n    //{\n      // toVar->changed = to->changed;\n    //}\n  }\n\n  // --------------------------------------------------------------------------\n  // Update used masks.\n  // --------------------------------------------------------------------------\n\n  _x86State.usedGP = state->usedGP;\n  _x86State.usedMM = state->usedMM;\n  _x86State.usedXMM = state->usedXMM;\n\n  // --------------------------------------------------------------------------\n  // Update changed masks and cleanup.\n  // --------------------------------------------------------------------------\n\n  {\n    X86CompilerVar* cv = static_cast<X86CompilerVar*>(_active);\n    if (cv)\n    {\n      do {\n        if (cv->tInt != kVarStateReg)\n        {\n          cv->state = (int)cv->tInt;\n          cv->changed = false;\n        }\n\n        cv->tInt = 0;\n        cv = cv->nextActive;\n      } while (cv != _active);\n    }\n  }\n}\n\nVarMemBlock* X86CompilerContext::_allocMemBlock(uint32_t size)\n{\n  ASMJIT_ASSERT(size != 0);\n\n  // First try to find mem blocks.\n  VarMemBlock* mem = _memFree;\n  VarMemBlock* prev = NULL;\n\n  while (mem)\n  {\n    VarMemBlock* next = mem->nextFree;\n\n    if (mem->size == size)\n    {\n      if (prev)\n        prev->nextFree = next;\n      else\n        _memFree = next;\n\n      mem->nextFree = NULL;\n      return mem;\n    }\n\n    prev = mem;\n    mem = next;\n  }\n\n  // Never mind, create new.\n  mem = reinterpret_cast<VarMemBlock*>(_zoneMemory.alloc(sizeof(VarMemBlock)));\n  if (mem == NULL)\n  {\n    _compiler->setError(kErrorNoHeapMemory);\n    return NULL;\n  }\n\n  mem->offset = 0;\n  mem->size = size;\n\n  mem->nextUsed = _memUsed;\n  mem->nextFree = NULL;\n\n  _memUsed = mem;\n\n  switch (size)\n  {\n    case 16: _mem16BlocksCount++; break;\n    case 8: _mem8BlocksCount++; break;\n    case 4: _mem4BlocksCount++; break;\n  }\n\n  return mem;\n}\n\nvoid X86CompilerContext::_freeMemBlock(VarMemBlock* mem)\n{\n  // Add mem to free blocks.\n  mem->nextFree = _memFree;\n  _memFree = mem;\n}\n\nvoid X86CompilerContext::_allocMemoryOperands()\n{\n  VarMemBlock* mem;\n\n  // Variables are allocated in this order:\n  // 1. 16-byte variables.\n  // 2. 8-byte variables.\n  // 3. 4-byte variables.\n  // 4. All others.\n\n  uint32_t start16 = 0;\n  uint32_t start8 = start16 + _mem16BlocksCount * 16;\n  uint32_t start4 = start8  + _mem8BlocksCount * 8;\n  uint32_t startX = IntUtil::align<uint32_t>(start4 + _mem4BlocksCount * 4, 16);\n\n  for (mem = _memUsed; mem; mem = mem->nextUsed)\n  {\n    uint32_t size = mem->size;\n    uint32_t offset;\n\n    switch (size)\n    {\n      case 16:\n        offset = start16;\n        start16 += 16;\n        break;\n\n      case 8:\n        offset = start8;\n        start8 += 8;\n        break;\n\n      case 4:\n        offset = start4;\n        start4 += 4;\n        break;\n\n      default:\n        // Align to 16 bytes if size is 16 or more.\n        if (size >= 16)\n        {\n          size = IntUtil::align<uint32_t>(size, 16);\n          startX = IntUtil::align<uint32_t>(startX, 16);\n        }\n\n        offset = startX;\n        startX += size;\n        break;\n    }\n\n    mem->offset = (int32_t)offset;\n    _memBytesTotal += size;\n  }\n}\n\nvoid X86CompilerContext::_patchMemoryOperands(CompilerItem* start, CompilerItem* stop)\n{\n  CompilerItem* cur;\n\n  for (cur = start;; cur = cur->getNext())\n  {\n    if (cur->getType() == kCompilerItemInst)\n    {\n      Mem* mem = reinterpret_cast<X86CompilerInst*>(cur)->_memOp;\n\n      if (mem && (mem->_mem.id & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = getCompiler()->_getVar(mem->_mem.id);\n        ASMJIT_ASSERT(cv != NULL);\n\n        if (cv->isMemArgument())\n        {\n          mem->_mem.base = _argumentsBaseReg;\n          mem->_mem.displacement += cv->homeMemoryOffset;\n          mem->_mem.displacement += _argumentsBaseOffset;\n        }\n        else\n        {\n          VarMemBlock* mb = reinterpret_cast<VarMemBlock*>(cv->homeMemoryData);\n          ASMJIT_ASSERT(mb != NULL);\n\n          mem->_mem.base = _variablesBaseReg;\n          mem->_mem.displacement += mb->offset;\n          mem->_mem.displacement += _variablesBaseOffset;\n        }\n      }\n    }\n    if (cur == stop) break;\n  }\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compilercontext.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86COMPILERCONTEXT_H\n#define _ASMJIT_X86_X86COMPILERCONTEXT_H\n\n// [Dependencies - AsmJit]\n#include \"../core/intutil.h\"\n#include \"../core/podvector.h\"\n\n#include \"../x86/x86assembler.h\"\n#include \"../x86/x86compiler.h\"\n#include \"../x86/x86compilerfunc.h\"\n#include \"../x86/x86compileritem.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::X86CompilerContext]\n// ============================================================================\n\n//! @internal\n//!\n//! @brief Compiler context is used by @ref X86Compiler.\n//!\n//! X86Compiler context is used during compilation and normally developer doesn't\n//! need access to it. The context is user per function (it's reset after each\n//! function is generated).\nstruct X86CompilerContext : public CompilerContext\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerContext instance.\n  ASMJIT_API X86CompilerContext(X86Compiler* x86Compiler);\n  //! @brief Destroy the @ref X86CompilerContext instance.\n  ASMJIT_API ~X86CompilerContext();\n\n  // --------------------------------------------------------------------------\n  // [Accessor]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  //! @brief Get function as @ref X86CompilerFuncDecl.\n  inline X86CompilerFuncDecl* getFunc() const\n  { return reinterpret_cast<X86CompilerFuncDecl*>(_func); }\n\n  // --------------------------------------------------------------------------\n  // [Clear]\n  // --------------------------------------------------------------------------\n\n  //! @brief Clear context, preparing it for next function generation.\n  ASMJIT_API void _clear();\n\n  // --------------------------------------------------------------------------\n  // [Register Allocator]\n  // --------------------------------------------------------------------------\n\n  //! @brief Allocate variable\n  //!\n  //! Calls @c allocGpVar, @c allocMmVar or @c allocXmmVar methods.\n  ASMJIT_API void allocVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags);\n\n  //! @brief Save variable.\n  //!\n  //! Calls @c saveGpVar, @c saveMmVar or @c saveXmmVar methods.\n  ASMJIT_API void saveVar(X86CompilerVar* cv);\n\n  //! @brief Spill variable.\n  //!\n  //! Calls @c spillGpVar, @c spillMmVar or @c spillXmmVar methods.\n  ASMJIT_API void spillVar(X86CompilerVar* cv);\n\n  //! @brief Unuse variable (didn't spill, just forget about it).\n  ASMJIT_API void unuseVar(X86CompilerVar* cv, uint32_t toState);\n\n  //! @brief Helper method that is called for each variable per item.\n  inline void _unuseVarOnEndOfScope(CompilerItem* item, X86CompilerVar* cv)\n  {\n    if (cv->lastItem == item)\n      unuseVar(cv, kVarStateUnused);\n  }\n  //! @overload\n  inline void _unuseVarOnEndOfScope(CompilerItem* item, VarAllocRecord* rec)\n  {\n    X86CompilerVar* cv = rec->vdata;\n    if (cv->lastItem == item || (rec->vflags & kVarAllocUnuseAfterUse))\n      unuseVar(cv, kVarStateUnused);\n  }\n  //! @overload\n  inline void _unuseVarOnEndOfScope(CompilerItem* item, VarCallRecord* rec)\n  {\n    X86CompilerVar* v = rec->vdata;\n    if (v->lastItem == item || (rec->flags & VarCallRecord::kFlagUnuseAfterUse))\n      unuseVar(v, kVarStateUnused);\n  }\n\n  //! @brief Allocate variable (GP).\n  ASMJIT_API void allocGpVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags);\n  //! @brief Save variable (GP).\n  ASMJIT_API void saveGpVar(X86CompilerVar* cv);\n  //! @brief Spill variable (GP).\n  ASMJIT_API void spillGpVar(X86CompilerVar* cv);\n\n  //! @brief Allocate variable (MM).\n  ASMJIT_API void allocMmVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags);\n  //! @brief Save variable (MM).\n  ASMJIT_API void saveMmVar(X86CompilerVar* cv);\n  //! @brief Spill variable (MM).\n  ASMJIT_API void spillMmVar(X86CompilerVar* cv);\n\n  //! @brief Allocate variable (XMM).\n  ASMJIT_API void allocXmmVar(X86CompilerVar* cv, uint32_t regMask, uint32_t vflags);\n  //! @brief Save variable (XMM).\n  ASMJIT_API void saveXmmVar(X86CompilerVar* cv);\n  //! @brief Spill variable (XMM).\n  ASMJIT_API void spillXmmVar(X86CompilerVar* cv);\n\n  //! @brief Emit load variable instruction(s).\n  ASMJIT_API void emitLoadVar(X86CompilerVar* cv, uint32_t regIndex);\n  //! @brief Emit save variable instruction(s).\n  ASMJIT_API void emitSaveVar(X86CompilerVar* cv, uint32_t regIndex);\n\n  //! @brief Emit move variable instruction(s).\n  ASMJIT_API void emitMoveVar(X86CompilerVar* cv, uint32_t regIndex, uint32_t vflags);\n  //! @brief Emit exchange variable instruction(s).\n  ASMJIT_API void emitExchangeVar(X86CompilerVar* cv, uint32_t regIndex, uint32_t vflags, X86CompilerVar* other);\n\n  //! @brief Called each time a variable is alloceted.\n  ASMJIT_API void _postAlloc(X86CompilerVar* cv, uint32_t vflags);\n  //! @brief Marks variable home memory as used (must be called at least once\n  //! for each variable that uses function local memory - stack).\n  ASMJIT_API void _markMemoryUsed(X86CompilerVar* cv);\n\n  ASMJIT_API Mem _getVarMem(X86CompilerVar* cv);\n\n  ASMJIT_API X86CompilerVar* _getSpillCandidateGP();\n  ASMJIT_API X86CompilerVar* _getSpillCandidateMM();\n  ASMJIT_API X86CompilerVar* _getSpillCandidateXMM();\n  ASMJIT_API X86CompilerVar* _getSpillCandidateGeneric(X86CompilerVar** varArray, uint32_t count);\n\n  inline bool _isActive(X86CompilerVar* cv)\n  { return cv->nextActive != NULL; }\n  \n  ASMJIT_API void _addActive(X86CompilerVar* cv);\n  ASMJIT_API void _freeActive(X86CompilerVar* cv);\n  ASMJIT_API void _freeAllActive();\n\n  ASMJIT_API void _allocatedVariable(X86CompilerVar* cv);\n\n  inline void _allocatedGpRegister(uint32_t index)\n  {\n    _x86State.usedGP |= IntUtil::maskFromIndex(index);\n    _modifiedGpRegisters |= IntUtil::maskFromIndex(index);\n  }\n  \n  inline void _allocatedMmRegister(uint32_t index)\n  {\n    _x86State.usedMM |= IntUtil::maskFromIndex(index);\n    _modifiedMmRegisters |= IntUtil::maskFromIndex(index);\n  }\n  \n  inline void _allocatedXmmRegister(uint32_t index)\n  {\n    _x86State.usedXMM |= IntUtil::maskFromIndex(index);\n    _modifiedXmmRegisters |= IntUtil::maskFromIndex(index);\n  }\n\n  inline void _freedGpRegister(uint32_t index)\n  { _x86State.usedGP &= ~IntUtil::maskFromIndex(index); }\n\n  inline void _freedMmRegister(uint32_t index)\n  { _x86State.usedMM &= ~IntUtil::maskFromIndex(index); }\n\n  inline void _freedXmmRegister(uint32_t index)\n  { _x86State.usedXMM &= ~IntUtil::maskFromIndex(index); }\n\n  inline void _markGpRegisterModified(uint32_t index)\n  { _modifiedGpRegisters |= IntUtil::maskFromIndex(index); }\n\n  inline void _markMmRegisterModified(uint32_t index)\n  { _modifiedMmRegisters |= IntUtil::maskFromIndex(index); }\n\n  inline void _markXmmRegisterModified(uint32_t index)\n  { _modifiedXmmRegisters |= IntUtil::maskFromIndex(index); }\n\n  // TODO: Find code which uses this and improve.\n  inline void _newRegisterHomeIndex(X86CompilerVar* cv, uint32_t idx)\n  {\n    if (cv->homeRegisterIndex == kRegIndexInvalid)\n      cv->homeRegisterIndex = idx;\n    cv->prefRegisterMask |= (1U << idx);\n  }\n\n  // TODO: Find code which uses this and improve.\n  inline void _newRegisterHomeMask(X86CompilerVar* cv, uint32_t mask)\n  {\n    cv->prefRegisterMask |= mask;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operand Patcher]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API void translateOperands(Operand* operands, uint32_t count);\n\n  // --------------------------------------------------------------------------\n  // [Backward Code]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API void addBackwardCode(X86CompilerJmpInst* from);\n\n  // --------------------------------------------------------------------------\n  // [Forward Jump]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API void addForwardJump(X86CompilerJmpInst* inst);\n\n  // --------------------------------------------------------------------------\n  // [State]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API X86CompilerState* _saveState();\n  ASMJIT_API void _assignState(X86CompilerState* state);\n  ASMJIT_API void _restoreState(X86CompilerState* state, uint32_t targetOffset = kInvalidValue);\n\n  // --------------------------------------------------------------------------\n  // [Memory Allocator]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API VarMemBlock* _allocMemBlock(uint32_t size);\n  ASMJIT_API void _freeMemBlock(VarMemBlock* mem);\n\n  ASMJIT_API void _allocMemoryOperands();\n  ASMJIT_API void _patchMemoryOperands(CompilerItem* start, CompilerItem* stop);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief X86 specific compiler state (linked with @ref _state).\n  X86CompilerState _x86State;\n\n  //! @brief Forward jumps (single linked list).\n  ForwardJumpData* _forwardJumps;\n\n  //! @brief Global modified GP registers mask (per function).\n  uint32_t _modifiedGpRegisters;\n  //! @brief Global modified MM registers mask (per function).\n  uint32_t _modifiedMmRegisters;\n  //! @brief Global modified XMM registers mask (per function).\n  uint32_t _modifiedXmmRegisters;\n\n  //! @brief Whether the EBP/RBP register can be used by register allocator.\n  uint32_t _allocableEBP;\n\n  //! @brief ESP adjust constant (changed during PUSH/POP or when using\n  //! stack.\n  int _adjustESP;\n\n  //! @brief Function arguments base pointer (register).\n  uint32_t _argumentsBaseReg;\n  //! @brief Function arguments base offset.\n  int32_t _argumentsBaseOffset;\n  //! @brief Function arguments displacement.\n  int32_t _argumentsActualDisp;\n\n  //! @brief Function variables base pointer (register).\n  uint32_t _variablesBaseReg;\n  //! @brief Function variables base offset.\n  int32_t _variablesBaseOffset;\n  //! @brief Function variables displacement.\n  int32_t _variablesActualDisp;\n\n  //! @brief Used memory blocks (for variables, here is each created mem block\n  //! that can be also in _memFree list).\n  VarMemBlock* _memUsed;\n  //! @brief Free memory blocks (freed, prepared for another allocation).\n  VarMemBlock* _memFree;\n  //! @brief Count of 4-byte memory blocks used by the function.\n  uint32_t _mem4BlocksCount;\n  //! @brief Count of 8-byte memory blocks used by the function.\n  uint32_t _mem8BlocksCount;\n  //! @brief Count of 16-byte memory blocks used by the function.\n  uint32_t _mem16BlocksCount;\n  //! @brief Count of total bytes of stack memory used by the function.\n  uint32_t _memBytesTotal;\n\n  //! @brief List of items which need to be translated. These items are filled\n  //! by @c addBackwardCode().\n  PodVector<X86CompilerJmpInst*> _backCode;\n\n  //! @brief Backward code position (starts at 0).\n  sysuint_t _backPos;\n  //! @brief Whether to emit comments.\n  bool _emitComments;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_X86COMPILERCONTEXT_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compilerfunc.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/intutil.h\"\n#include \"../core/stringutil.h\"\n\n#include \"../x86/x86compiler.h\"\n#include \"../x86/x86compilercontext.h\"\n#include \"../x86/x86compilerfunc.h\"\n#include \"../x86/x86compileritem.h\"\n#include \"../x86/x86cpuinfo.h\"\n#include \"../x86/x86util.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::X86Assembler - Logging]\n// ============================================================================\n\n// Defined in AsmJit/X86/X86Assembler.cpp.\nchar* X86Assembler_dumpRegister(char* buf, uint32_t type, uint32_t index);\nchar* X86Assembler_dumpOperand(char* buf, const Operand* op, uint32_t memRegType, uint32_t loggerFlags);\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncDecl - Construction / Destructioin]\n// ============================================================================\n\nX86CompilerFuncDecl::X86CompilerFuncDecl(X86Compiler* x86Compiler) :\n  CompilerFuncDecl(x86Compiler),\n  _gpModifiedAndPreserved(0),\n  _mmModifiedAndPreserved(0),\n  _xmmModifiedAndPreserved(0),\n  _movDqInstCode(kInstNone),\n  _pePushPopStackSize(0),\n  _peMovStackSize(0),\n  _peAdjustStackSize(0),\n  _memStackSize(0),\n  _memStackSize16(0)\n{\n  _decl = &_x86Decl;\n\n  // Just clear to safe defaults.\n  _funcHints |= IntUtil::maskFromIndex(kX86FuncHintPushPop);\n\n  // Stack is always aligned to 16-bytes when using 64-bit OS.\n  if (CompilerUtil::isStack16ByteAligned())\n    _funcHints |= IntUtil::maskFromIndex(kX86FuncHintAssume16ByteAlignment);\n\n  _entryLabel = x86Compiler->newLabel();\n  _exitLabel = x86Compiler->newLabel();\n\n  _entryTarget = x86Compiler->_getTarget(_entryLabel.getId());\n  _exitTarget = x86Compiler->_getTarget(_exitLabel.getId());\n\n  _end = Compiler_newItem<X86CompilerFuncEnd>(x86Compiler, this);\n}\n\nX86CompilerFuncDecl::~X86CompilerFuncDecl()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncDecl - Interface]\n// ============================================================================\n\nvoid X86CompilerFuncDecl::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  _offset = x86Context._currentOffset++;\n\n  _prepareVariables(this);\n}\n\nCompilerItem* X86CompilerFuncDecl::translate(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n\n  _allocVariables(x86Context);\n  return translated();\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncDecl - Misc]\n// ============================================================================\n\nint X86CompilerFuncDecl::getMaxSize() const\n{\n  // NOP.\n  return 0;\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncDecl - Prototype]\n// ============================================================================\n\nvoid X86CompilerFuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount)\n{\n  _x86Decl.setPrototype(convention, returnType, arguments, argumentsCount);\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncDecl - Helpers]\n// ============================================================================\n\nvoid X86CompilerFuncDecl::_createVariables()\n{\n  X86Compiler* x86Compiler = getCompiler();\n\n  uint32_t i, count = _x86Decl.getArgumentsCount();\n  if (count == 0) return;\n\n  _vars = reinterpret_cast<CompilerVar**>(x86Compiler->getZoneMemory().alloc(count * sizeof(void*)));\n  if (_vars == NULL)\n  {\n    x86Compiler->setError(kErrorNoHeapMemory);\n    return;\n  }\n\n  char argNameStorage[64];\n  char* argName = NULL;\n\n  bool debug = x86Compiler->getLogger() != NULL;\n  if (debug) argName = argNameStorage;\n\n  for (i = 0; i < count; i++)\n  {\n    FuncArg& arg = _x86Decl.getArgument(i);\n\n    if (debug)\n      snprintf(argName, ASMJIT_ARRAY_SIZE(argNameStorage), \"arg_%u\", i);\n\n    uint32_t size = X86Util::getVarSizeFromVarType(arg.getVarType());\n    X86CompilerVar* cv = x86Compiler->_newVar(argName, arg.getVarType(), size);\n\n    if (arg.getRegIndex() != kRegIndexInvalid)\n    {\n      cv->_isRegArgument = true;\n      cv->regIndex = arg.getRegIndex();\n    }\n\n    if (arg.getStackOffset() != kFuncStackInvalid)\n    {\n      cv->_isMemArgument = true;\n      cv->homeMemoryOffset = arg.getStackOffset();\n    }\n\n    _vars[i] = cv;\n  }\n}\n\nvoid X86CompilerFuncDecl::_prepareVariables(CompilerItem* first)\n{\n  uint32_t count = _x86Decl.getArgumentsCount();\n  if (count == 0) return;\n\n  for (uint32_t i = 0; i < count; i++)\n  {\n    X86CompilerVar* cv = getVar(i);\n\n    // This is where variable scope starts.\n    cv->firstItem = first;\n    // If this will not be changed then it will be deallocated immediately.\n    cv->lastItem = first;\n  }\n}\n\nvoid X86CompilerFuncDecl::_allocVariables(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  uint32_t count = getDecl()->getArgumentsCount();\n\n  if (count == 0)\n    return;\n\n  for (uint32_t i = 0; i < count; i++)\n  {\n    X86CompilerVar* cv = getVar(i);\n\n    if (cv->firstItem != NULL || cv->isArgument())\n    {\n      // Variable is used.\n      if (cv->regIndex != kRegIndexInvalid)\n      {\n        cv->state = kVarStateReg;\n        // If variable is in register -> mark it as changed so it will not be\n        // lost by first spill.\n        cv->changed = true;\n        x86Context._allocatedVariable(cv);\n      }\n      else if (cv->isMemArgument())\n      {\n        cv->state = kVarStateMem;\n      }\n    }\n    else\n    {\n      // Variable is not used.\n      cv->regIndex = kRegIndexInvalid;\n    }\n  }\n}\n\nvoid X86CompilerFuncDecl::_preparePrologEpilog(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  const X86CpuInfo* cpuInfo = X86CpuInfo::getGlobal();\n\n  clearFuncFlag(\n    kX86FuncFlagPushPop    |\n    kX86FuncFlagEmitEmms   |\n    kX86FuncFlagEmitSFence |\n    kX86FuncFlagEmitLFence |\n    kX86FuncFlagAssume16ByteAlignment |\n    kX86FuncFlagPerform16ByteAlignment);\n\n  uint32_t accessibleMemoryBelowStack = 0;\n  if (getDecl()->getConvention() == kX86FuncConvX64U) \n    accessibleMemoryBelowStack = 128;\n\n  if (getHint(kX86FuncHintAssume16ByteAlignment ))\n    setFuncFlag(kX86FuncFlagAssume16ByteAlignment);\n\n  if (getHint(kX86FuncHintPerform16ByteAlignment))\n    setFuncFlag(kX86FuncFlagPerform16ByteAlignment);\n\n  if (getHint(kFuncHintNaked) != 0)\n    setFuncFlag(kFuncFlagIsNaked);\n\n  if (isCaller() && (x86Context._memBytesTotal > 0 || isAssumed16ByteAlignment()))\n    setFuncFlag(kX86FuncFlagIsEspAdjusted);\n\n  if (x86Context._memBytesTotal > accessibleMemoryBelowStack)\n    setFuncFlag(kX86FuncFlagIsEspAdjusted);\n\n  if (getHint(kX86FuncHintPushPop) != 0)\n    setFuncFlag(kX86FuncFlagPushPop);\n\n  if (getHint(kX86FuncHintEmms) != 0)\n    setFuncFlag(kX86FuncFlagEmitEmms);\n\n  if (getHint(kX86FuncHintSFence) != 0)\n    setFuncFlag(kX86FuncFlagEmitSFence);\n\n  if (getHint(kX86FuncHintLFence) != 0)\n    setFuncFlag(kX86FuncFlagEmitLFence);\n\n  // Updated to respect comment from issue #47, align also when using MMX code.\n  if (!isAssumed16ByteAlignment() && !isNaked() && (x86Context._mem16BlocksCount + (x86Context._mem8BlocksCount > 0)))\n  {\n    // Have to align stack to 16-bytes.\n    setFuncFlag(kX86FuncFlagIsEspAdjusted | kX86FuncFlagPerform16ByteAlignment);\n  }\n\n  _gpModifiedAndPreserved  = x86Context._modifiedGpRegisters  & _x86Decl.getGpPreservedMask() & (~IntUtil::maskFromIndex(kX86RegIndexEsp));\n  _mmModifiedAndPreserved  = x86Context._modifiedMmRegisters  & _x86Decl.getMmPreservedMask();\n  _xmmModifiedAndPreserved = x86Context._modifiedXmmRegisters & _x86Decl.getXmmPreservedMask();\n  _movDqInstCode = (isAssumed16ByteAlignment() | isPerformed16ByteAlignment()) ? kX86InstMovDQA : kX86InstMovDQU;\n\n  // Prolog & Epilog stack size.\n  {\n    int32_t memGpSize = IntUtil::bitCount(_gpModifiedAndPreserved) * sizeof(intptr_t);\n    int32_t memMmSize = IntUtil::bitCount(_mmModifiedAndPreserved) * 8;\n    int32_t memXmmSize = IntUtil::bitCount(_xmmModifiedAndPreserved) * 16;\n\n    if (hasFuncFlag(kX86FuncFlagPushPop))\n    {\n      _pePushPopStackSize = memGpSize;\n      _peMovStackSize = memXmmSize + IntUtil::align<int32_t>(memMmSize, 16);\n    }\n    else\n    {\n      _pePushPopStackSize = 0;\n      _peMovStackSize = memXmmSize + IntUtil::align<int32_t>(memMmSize + memGpSize, 16);\n    }\n  }\n\n  if (isPerformed16ByteAlignment())\n  {\n    _peAdjustStackSize += IntUtil::delta<int32_t>(_pePushPopStackSize, 16);\n  }\n  else\n  {\n    int32_t v = 16 - sizeof(uintptr_t);\n\n    if (!isNaked())\n      v -= sizeof(uintptr_t);\n\n    v -= _pePushPopStackSize & 15;\n\n    if (v < 0)\n      v += 16;\n\n    _peAdjustStackSize = v;\n\n    //_peAdjustStackSize += IntUtil::delta<int32_t>(_pePushPopStackSize + v, 16);\n  }\n\n  // Memory stack size.\n  _memStackSize = x86Context._memBytesTotal;\n  _memStackSize16 = IntUtil::align(_memStackSize, 16);\n\n  if (isNaked())\n  {\n    x86Context._argumentsBaseReg = kX86RegIndexEsp;\n    x86Context._argumentsBaseOffset = hasFuncFlag(kX86FuncFlagIsEspAdjusted)\n      ? (_funcCallStackSize + _memStackSize16 + _peMovStackSize + _pePushPopStackSize + _peAdjustStackSize)\n      : (_pePushPopStackSize);\n  }\n  else\n  {\n    x86Context._argumentsBaseReg = kX86RegIndexEbp;\n    x86Context._argumentsBaseOffset = sizeof(sysint_t);\n  }\n\n  x86Context._variablesBaseReg = kX86RegIndexEsp;\n  x86Context._variablesBaseOffset = _funcCallStackSize;\n\n  if (!hasFuncFlag(kX86FuncFlagIsEspAdjusted))\n    x86Context._variablesBaseOffset = -_memStackSize16 - _peMovStackSize - _peAdjustStackSize;\n}\n\nvoid X86CompilerFuncDecl::_dumpFunction(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n  Logger* logger = x86Compiler->getLogger();\n  ASMJIT_ASSERT(logger != NULL);\n\n  uint32_t i;\n  char _buf[1024];\n  char* p;\n\n  // Log function prototype.\n  {\n    uint32_t argumentsCount = _x86Decl.getArgumentsCount();\n    bool first = true;\n\n    logger->logString(\"; Function Prototype:\\n\");\n    logger->logString(\";\\n\");\n\n    for (i = 0; i < argumentsCount; i++)\n    {\n      const FuncArg& a = _x86Decl.getArgument(i);\n      X86CompilerVar* cv = getVar(i);\n\n      if (first)\n      {\n        logger->logString(\"; IDX| Type     | Sz | Home           |\\n\");\n        logger->logString(\"; ---+----------+----+----------------+\\n\");\n      }\n\n      char* memHome = memHome = _buf;\n\n      if (a.hasRegIndex())\n      {\n        Reg regOp(a.getRegIndex() | kX86RegTypeGpz, 0);\n        X86Assembler_dumpOperand(memHome, &regOp, kX86RegTypeGpz, 0)[0] = '\\0';\n      }\n      else\n      {\n        Mem memOp;\n        memOp._mem.base = kX86RegIndexEsp;\n        memOp._mem.displacement = a.getStackOffset();\n        X86Assembler_dumpOperand(memHome, &memOp, kX86RegTypeGpz, 0)[0] = '\\0';\n      }\n\n      logger->logFormat(\"; %-3u| %-9s| %-3u| %-15s|\\n\",\n        // Argument index.\n        i,\n        // Argument type.\n        cv->getType() < kX86VarTypeCount ? x86VarInfo[cv->getType()].getName() : \"invalid\",\n        // Argument size.\n        cv->getSize(),\n        // Argument memory home.\n        memHome\n      );\n\n      first = false;\n    }\n    logger->logString(\";\\n\");\n  }\n\n  // Log variables.\n  {\n    uint32_t variablesCount = (uint32_t)x86Compiler->_vars.getLength();\n    bool first = true;\n\n    logger->logString(\"; Variables:\\n\");\n    logger->logString(\";\\n\");\n\n    for (i = 0; i < variablesCount; i++)\n    {\n      X86CompilerVar* cv = static_cast<X86CompilerVar*>(x86Compiler->_vars[i]);\n\n      // If this variable is not related to this function then skip it.\n      if (cv->funcScope != this)\n        continue;\n\n      // Get some information about variable type.\n      const X86VarInfo& vinfo = x86VarInfo[cv->getType()];\n\n      if (first)\n      {\n        logger->logString(\"; ID | Type     | Sz | Home           | Register Access   | Memory Access     |\\n\");\n        logger->logString(\"; ---+----------+----+----------------+-------------------+-------------------+\\n\");\n      }\n\n      char* memHome = (char*)\"[None]\";\n      if (cv->homeMemoryData != NULL)\n      {\n        VarMemBlock* memBlock = reinterpret_cast<VarMemBlock*>(cv->homeMemoryData);\n        memHome = _buf;\n\n        Mem memOp;\n        if (cv->isMemArgument())\n        {\n          const FuncArg& a = _x86Decl.getArgument(i);\n\n          memOp._mem.base = x86Context._argumentsBaseReg;\n          memOp._mem.displacement += x86Context._argumentsBaseOffset;\n          memOp._mem.displacement += a.getStackOffset();\n        }\n        else\n        {\n          memOp._mem.base = x86Context._variablesBaseReg;\n          memOp._mem.displacement += x86Context._variablesBaseOffset;\n          memOp._mem.displacement += memBlock->offset;\n        }\n        X86Assembler_dumpOperand(memHome, &memOp, kX86RegTypeGpz, 0)[0] = '\\0';\n      }\n\n      logger->logFormat(\"; %-3u| %-9s| %-3u| %-15s| r=%-4uw=%-4ux=%-4u| r=%-4uw=%-4ux=%-4u|\\n\",\n        // Variable id.\n        (uint)(i & kOperandIdValueMask),\n        // Variable type.\n        cv->getType() < kX86VarTypeCount ? vinfo.getName() : \"invalid\",\n        // Variable size.\n        cv->getSize(),\n        // Variable memory home.\n        memHome,\n        // Register access count.\n        (unsigned int)cv->regReadCount,\n        (unsigned int)cv->regWriteCount,\n        (unsigned int)cv->regRwCount,\n        // Memory access count.\n        (unsigned int)cv->memReadCount,\n        (unsigned int)cv->memWriteCount,\n        (unsigned int)cv->memRwCount\n      );\n      first = false;\n    }\n    logger->logString(\";\\n\");\n  }\n\n  // Log modified registers.\n  {\n    p = _buf;\n\n    uint32_t r;\n    uint32_t modifiedRegisters = 0;\n\n    for (r = 0; r < 3; r++)\n    {\n      bool first = true;\n      uint32_t regs;\n      uint32_t type;\n\n      switch (r)\n      {\n        case 0:\n          regs = x86Context._modifiedGpRegisters;\n          type = kX86RegTypeGpz;\n          p = StringUtil::copy(p, \"; GP : \");\n          break;\n        case 1:\n          regs = x86Context._modifiedMmRegisters;\n          type = kX86RegTypeMm;\n          p = StringUtil::copy(p, \"; MM : \");\n          break;\n        case 2:\n          regs = x86Context._modifiedXmmRegisters;\n          type = kX86RegTypeXmm;\n          p = StringUtil::copy(p, \"; XMM: \");\n          break;\n        default:\n          ASMJIT_ASSERT(0);\n      }\n\n      for (i = 0; i < kX86RegNumBase; i++)\n      {\n        if ((regs & IntUtil::maskFromIndex(i)) != 0)\n        {\n          if (!first) { *p++ = ','; *p++ = ' '; }\n          p = X86Assembler_dumpRegister(p, type, i);\n          first = false;\n          modifiedRegisters++;\n        }\n      }\n      *p++ = '\\n';\n    }\n    *p = '\\0';\n\n    logger->logFormat(\"; Modified registers (%u):\\n\", (unsigned int)modifiedRegisters);\n    logger->logString(_buf);\n  }\n\n  logger->logString(\"\\n\");\n}\n\nvoid X86CompilerFuncDecl::_emitProlog(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n  // --------------------------------------------------------------------------\n  // [Init]\n  // --------------------------------------------------------------------------\n\n  uint32_t i, mask;\n  uint32_t preservedGP  = _gpModifiedAndPreserved;\n  uint32_t preservedMM  = _mmModifiedAndPreserved;\n  uint32_t preservedXMM = _xmmModifiedAndPreserved;\n\n  int32_t stackOffset = _getRequiredStackOffset();\n  int32_t stackPos;\n\n  // --------------------------------------------------------------------------\n  // [Prolog]\n  // --------------------------------------------------------------------------\n\n  if (x86Compiler->getLogger())\n    x86Compiler->comment(\"Prolog\");\n\n  // Emit standard prolog entry code (but don't do it if function is set to be\n  // naked).\n  //\n  // Also see the _prologEpilogStackAdjust variable. If function is naked (so\n  // prolog and epilog will not contain \"push ebp\" and \"mov ebp, esp\", we need\n  // to adjust stack by 8 bytes in 64-bit mode (this will give us that stack\n  // will remain aligned to 16 bytes).\n  if (!isNaked())\n  {\n    x86Compiler->emit(kX86InstPush, zbp);\n    x86Compiler->emit(kX86InstMov, zbp, zsp);\n  }\n\n  // Align manually stack-pointer to 16-bytes.\n  if (isPerformed16ByteAlignment())\n  {\n    ASMJIT_ASSERT(!isNaked());\n    x86Compiler->emit(kX86InstAnd, zsp, imm(-16));\n  }\n\n  // --------------------------------------------------------------------------\n  // [Save Gp - Push/Pop]\n  // --------------------------------------------------------------------------\n\n  if (preservedGP != 0 && hasFuncFlag(kX86FuncFlagPushPop))\n  {\n    for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n    {\n      if (preservedGP & mask)\n        x86Compiler->emit(kX86InstPush, gpz(i));\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Adjust Scack]\n  // --------------------------------------------------------------------------\n\n  if (isEspAdjusted())\n  {\n    stackPos = _memStackSize16 + _funcCallStackSize;\n    if (stackOffset != 0)\n      x86Compiler->emit(kX86InstSub, zsp, imm(stackOffset));\n  }\n  else\n  {\n    stackPos = -(_peMovStackSize + _peAdjustStackSize);\n    //if (_pePushPop) stackPos += IntUtil::bitCount(preservedGP) * sizeof(sysint_t);\n  }\n\n  // --------------------------------------------------------------------------\n  // [Save Xmm - MovDqa/MovDqu]\n  // --------------------------------------------------------------------------\n\n  if (preservedXMM != 0)\n  {\n    for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1)\n    {\n      if (preservedXMM & mask)\n      {\n        x86Compiler->emit(_movDqInstCode, dqword_ptr(zsp, stackPos), xmm(i));\n        stackPos += 16;\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Save Mm - MovQ]\n  // --------------------------------------------------------------------------\n\n  if (preservedMM != 0)\n  {\n    for (i = 0, mask = 1; i < 8; i++, mask <<= 1)\n    {\n      if (preservedMM & mask)\n      {\n        x86Compiler->emit(kX86InstMovQ, qword_ptr(zsp, stackPos), mm(i));\n        stackPos += 8;\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Save Gp - Mov]\n  // --------------------------------------------------------------------------\n\n  if (preservedGP != 0 && !hasFuncFlag(kX86FuncFlagPushPop))\n  {\n    for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n    {\n      if (preservedGP & mask)\n      {\n        x86Compiler->emit(kX86InstMov, sysint_ptr(zsp, stackPos), gpz(i));\n        stackPos += sizeof(sysint_t);\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [...]\n  // --------------------------------------------------------------------------\n\n  if (x86Compiler->getLogger())\n    x86Compiler->comment(\"Body\");\n}\n\nvoid X86CompilerFuncDecl::_emitEpilog(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n  const X86CpuInfo* cpuInfo = X86CpuInfo::getGlobal();\n\n  // --------------------------------------------------------------------------\n  // [Init]\n  // --------------------------------------------------------------------------\n\n  uint32_t i, mask;\n  uint32_t preservedGP  = _gpModifiedAndPreserved;\n  uint32_t preservedMM  = _mmModifiedAndPreserved;\n  uint32_t preservedXMM = _xmmModifiedAndPreserved;\n\n  int32_t stackOffset = _getRequiredStackOffset();\n  int32_t stackPos;\n  \n  if (isEspAdjusted()) \n    stackPos = _memStackSize16 + _funcCallStackSize;\n  else\n    stackPos = -(_peMovStackSize + _peAdjustStackSize);\n\n  // --------------------------------------------------------------------------\n  // [Epilog]\n  // --------------------------------------------------------------------------\n\n  if (x86Compiler->getLogger())\n    x86Compiler->comment(\"Epilog\");\n\n  // --------------------------------------------------------------------------\n  // [Restore Xmm - MovDqa/ModDqu]\n  // --------------------------------------------------------------------------\n\n  if (preservedXMM != 0)\n  {\n    for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1)\n    {\n      if (preservedXMM & mask)\n      {\n        x86Compiler->emit(_movDqInstCode, xmm(i), dqword_ptr(zsp, stackPos));\n        stackPos += 16;\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Restore Mm - MovQ]\n  // --------------------------------------------------------------------------\n\n  if (preservedMM != 0)\n  {\n    for (i = 0, mask = 1; i < 8; i++, mask <<= 1)\n    {\n      if (preservedMM & mask)\n      {\n        x86Compiler->emit(kX86InstMovQ, mm(i), qword_ptr(zsp, stackPos));\n        stackPos += 8;\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Restore Gp - Mov]\n  // --------------------------------------------------------------------------\n\n  if (preservedGP != 0 && !hasFuncFlag(kX86FuncFlagPushPop))\n  {\n    for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n    {\n      if (preservedGP & mask)\n      {\n        x86Compiler->emit(kX86InstMov, gpz(i), sysint_ptr(zsp, stackPos));\n        stackPos += sizeof(sysint_t);\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Adjust Stack]\n  // --------------------------------------------------------------------------\n\n  if (isEspAdjusted() && stackOffset != 0)\n    x86Compiler->emit(kX86InstAdd, zsp, imm(stackOffset));\n\n  // --------------------------------------------------------------------------\n  // [Restore Gp - Push/Pop]\n  // --------------------------------------------------------------------------\n\n  if (preservedGP != 0 && hasFuncFlag(kX86FuncFlagPushPop))\n  {\n    for (i = kX86RegNumGp - 1, mask = 1 << i; (int32_t)i >= 0; i--, mask >>= 1)\n    {\n      if (preservedGP & mask)\n        x86Compiler->emit(kX86InstPop, gpz(i));\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // [Emms]\n  // --------------------------------------------------------------------------\n\n  if (hasFuncFlag(kX86FuncFlagEmitEmms)) \n    x86Compiler->emit(kX86InstEmms);\n\n  // --------------------------------------------------------------------------\n  // [MFence/SFence/LFence]\n  // --------------------------------------------------------------------------\n\n  if (hasFuncFlag(kX86FuncFlagEmitSFence) & hasFuncFlag(kX86FuncFlagEmitLFence))\n    x86Compiler->emit(kX86InstMFence);\n  else if (hasFuncFlag(kX86FuncFlagEmitSFence))\n    x86Compiler->emit(kX86InstSFence);\n  else if (hasFuncFlag(kX86FuncFlagEmitLFence))\n    x86Compiler->emit(kX86InstLFence);\n\n  // --------------------------------------------------------------------------\n  // [Epilog]\n  // --------------------------------------------------------------------------\n\n  // Emit standard epilog leave code (if needed).\n  if (!isNaked())\n  {\n    // AMD seems to prefer LEAVE instead of MOV/POP sequence.\n    if (cpuInfo->getVendorId() == kCpuAmd)\n    {\n      x86Compiler->emit(kX86InstLeave);\n    }\n    else\n    {\n      x86Compiler->emit(kX86InstMov, zsp, zbp);\n      x86Compiler->emit(kX86InstPop, zbp);\n    }\n  }\n\n  // Emit return.\n  if (_x86Decl.getCalleePopsStack())\n    x86Compiler->emit(kX86InstRet, imm((int16_t)_x86Decl.getArgumentsStackSize()));\n  else\n    x86Compiler->emit(kX86InstRet);\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncDecl - Function-Call]\n// ============================================================================\n\nvoid X86CompilerFuncDecl::reserveStackForFunctionCall(int32_t size)\n{\n  size = IntUtil::align<int32_t>(size, 16);\n  if (size > _funcCallStackSize)\n    _funcCallStackSize = size;\n  setFuncFlag(kFuncFlagIsCaller);\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncEnd - Construction / Destruction]\n// ============================================================================\n\nX86CompilerFuncEnd::X86CompilerFuncEnd(X86Compiler* x86Compiler, X86CompilerFuncDecl* func) :\n  CompilerFuncEnd(x86Compiler, func)\n{\n}\n\nX86CompilerFuncEnd::~X86CompilerFuncEnd()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncEnd - Interface]\n// ============================================================================\n\nvoid X86CompilerFuncEnd::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  _offset = x86Context._currentOffset++;\n}\n\nCompilerItem* X86CompilerFuncEnd::translate(CompilerContext& cc)\n{\n  _isTranslated = true;\n  return NULL;\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncRet - Construction / Destruction]\n// ============================================================================\n\nX86CompilerFuncRet::X86CompilerFuncRet(X86Compiler* x86Compiler, X86CompilerFuncDecl* func, const Operand* first, const Operand* second) :\n  CompilerFuncRet(x86Compiler, func, first, second)\n{\n/*\n  // TODO:?\n\n  // Check whether the return value is compatible.\n  uint32_t retValType = function->_x86Decl.getReturnType();\n  bool valid = false;\n\n  switch (retValType)\n  {\n    case kX86VarTypeGpd:\n    case kX86VarTypeGpq:\n      if ((_ret[0].isVar() && (reinterpret_cast<const Var&>(_ret[0]).isGpVar())) ||\n          (_ret[0].isImm()))\n      {\n        valid = true;\n      }\n      break;\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      if ((_ret[0].isVar() && (reinterpret_cast<const Var&>(_ret[0]).isX87Var() ||\n                               reinterpret_cast<const Var&>(_ret[0]).isXmmVar() )) )\n      {\n        valid = true;\n      }\n      break;\n\n    case kX86VarTypeMm:\n      break;\n\n    case kVarTypeInvalid:\n      if (_ret[0].isNone() && \n          _ret[1].isNone())\n      {\n        valid = true;\n      }\n      break;\n\n    default:\n      break;\n  }\n\n  // Incompatible return value.\n  if (!valid)\n  {\n    c->setError(kErrorIncompatibleReturnType);\n  }\n*/\n}\n\nX86CompilerFuncRet::~X86CompilerFuncRet()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncRet - Interface]\n// ============================================================================\n\nvoid X86CompilerFuncRet::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = x86Context.getCompiler();\n\n  uint32_t retValType = getFunc()->_x86Decl.getReturnType();\n  _offset = x86Context._currentOffset;\n\n  if (retValType != kVarTypeInvalid)\n  {\n    uint32_t i;\n    for (i = 0; i < 2; i++)\n    {\n      Operand& o = _ret[i];\n\n      if (o.isVar())\n      {\n        ASMJIT_ASSERT(o.getId() != kInvalidValue);\n        X86CompilerVar* cv = x86Compiler->_getVar(o.getId());\n        ASMJIT_ASSERT(cv != NULL);\n\n        // First item (begin of variable scope).\n        if (cv->firstItem == NULL) cv->firstItem = this;\n\n        // Last item (end of variable scope).\n        cv->lastItem = this;\n\n        if (cv->workOffset == _offset) continue;\n        if (!x86Context._isActive(cv)) x86Context._addActive(cv);\n\n        cv->workOffset = _offset;\n        cv->regReadCount++;\n\n        if (X86Util::isVarTypeInt(cv->getType()) && X86Util::isVarTypeInt(retValType))\n        {\n          x86Context._newRegisterHomeIndex(cv, (i == 0) ? kX86RegIndexEax : kX86RegIndexEdx);\n        }\n      }\n    }\n  }\n\n  x86Context._currentOffset++;\n}\n\nCompilerItem* X86CompilerFuncRet::translate(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = x86Context.getCompiler();\n\n  // Check whether the return value is compatible.\n  uint32_t retValType = getFunc()->getDecl()->getReturnType();\n  uint32_t i;\n\n  switch (retValType)\n  {\n    case kX86VarTypeGpd:\n    case kX86VarTypeGpq:\n      for (i = 0; i < 2; i++)\n      {\n        uint32_t dstIndex = (i == 0) ? kX86RegIndexEax : kX86RegIndexEdx;\n        uint32_t srcIndex;\n\n        if (_ret[i].isVar())\n        {\n          if (reinterpret_cast<const Var&>(_ret[i]).isGpVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srcIndex = cv->regIndex;\n            if (srcIndex == kRegIndexInvalid)\n              x86Compiler->emit(kX86InstMov, gpz(dstIndex), x86Context._getVarMem(cv));\n            else if (dstIndex != srcIndex)\n              x86Compiler->emit(kX86InstMov, gpz(dstIndex), gpz(srcIndex));\n          }\n        }\n        else if (_ret[i].isImm())\n        {\n          x86Compiler->emit(kX86InstMov, gpz(dstIndex), _ret[i]);\n        }\n      }\n      break;\n\n    case kX86VarTypeX87:\n    case kX86VarTypeX87SS:\n    case kX86VarTypeX87SD:\n      // There is case that we need to return two values (Unix-ABI specific):\n      // - FLD #2\n      //-  FLD #1\n      i = 2;\n      do {\n        i--;\n        uint32_t dsti = i;\n        uint32_t srci;\n\n        if (_ret[i].isVar())\n        {\n          if (reinterpret_cast<const Var&>(_ret[i]).isX87Var())\n          {\n            // TODO: X87 Support.\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isXmmVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            if (srci != kRegIndexInvalid)\n              x86Context.saveXmmVar(cv);\n\n            switch (cv->getType())\n            {\n              case kX86VarTypeXmmSS:\n              case kX86VarTypeXmmPS:\n                x86Compiler->emit(kX86InstFLd, _BaseVarMem(reinterpret_cast<Var&>(_ret[i]), 4));\n                break;\n              case kX86VarTypeXmmSD:\n              case kX86VarTypeXmmPD:\n                x86Compiler->emit(kX86InstFLd, _BaseVarMem(reinterpret_cast<Var&>(_ret[i]), 8));\n                break;\n            }\n          }\n        }\n      } while (i != 0);\n      break;\n\n    case kX86VarTypeMm:\n      for (i = 0; i < 2; i++)\n      {\n        uint32_t dsti = i;\n        uint32_t srci;\n\n        if (_ret[i].isVar())\n        {\n          if (reinterpret_cast<const Var&>(_ret[i]).isGpVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            uint32_t inst = _ret[i].isRegType(kX86RegTypeGpq) ? kX86InstMovQ : kX86InstMovD;\n\n            if (srci == kRegIndexInvalid)\n              x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv));\n            else\n#if defined(ASMJIT_X86)\n              x86Compiler->emit(inst, mm(dsti), gpd(srci));\n#else\n              x86Compiler->emit(inst, mm(dsti), _ret[i].isRegType(kX86RegTypeGpq) ? gpq(srci) : gpd(srci));\n#endif\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isMmVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            uint32_t inst = kX86InstMovQ;\n\n            if (srci == kRegIndexInvalid)\n              x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv));\n            else if (dsti != srci)\n              x86Compiler->emit(inst, mm(dsti), mm(srci));\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isXmmVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            uint32_t inst = kX86InstMovQ;\n            if (reinterpret_cast<const Var&>(_ret[i]).getVarType() == kX86VarTypeXmmSS) inst = kX86InstMovD;\n\n            if (srci == kRegIndexInvalid)\n              x86Compiler->emit(inst, mm(dsti), x86Context._getVarMem(cv));\n            else\n              x86Compiler->emit(inst, mm(dsti), xmm(srci));\n          }\n        }\n      }\n      break;\n\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmPD:\n      for (i = 0; i < 2; i++)\n      {\n        uint32_t dsti = i;\n        uint32_t srci;\n\n        if (_ret[i].isVar())\n        {\n          if (reinterpret_cast<const Var&>(_ret[i]).isGpVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            uint32_t inst = _ret[i].isRegType(kX86RegTypeGpq) ? kX86InstMovQ : kX86InstMovD;\n\n            if (srci == kRegIndexInvalid)\n              x86Compiler->emit(inst, xmm(dsti), x86Context._getVarMem(cv));\n            else\n#if defined(ASMJIT_X86)\n              x86Compiler->emit(inst, xmm(dsti), gpd(srci));\n#else\n              x86Compiler->emit(inst, xmm(dsti), _ret[i].isRegType(kX86RegTypeGpq) ? gpq(srci) : gpd(srci));\n#endif\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isX87Var())\n          {\n            // TODO: X87 Support.\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isMmVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            if (srci == kRegIndexInvalid)\n              x86Compiler->emit(kX86InstMovQ, xmm(dsti), x86Context._getVarMem(cv));\n            else\n              x86Compiler->emit(kX86InstMovQ, xmm(dsti), mm(srci));\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isXmmVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            if (srci == kRegIndexInvalid)\n              x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv));\n            else if (dsti != srci)\n              x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci));\n          }\n        }\n      }\n      break;\n\n    case kX86VarTypeXmmSS:\n      for (i = 0; i < 2; i++)\n      {\n        uint32_t dsti = i;\n        uint32_t srci;\n\n        if (_ret[i].isVar())\n        {\n          if (reinterpret_cast<const Var&>(_ret[i]).isX87Var())\n          {\n            // TODO: X87 Support.\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isXmmVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            switch (cv->getType())\n            {\n              case kX86VarTypeXmm:\n                if (srci == kRegIndexInvalid)\n                  x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv));\n                else if (dsti != srci)\n                  x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci));\n                break;\n              case kX86VarTypeXmmSS:\n              case kX86VarTypeXmmPS:\n                if (srci == kRegIndexInvalid)\n                  x86Compiler->emit(kX86InstMovSS, xmm(dsti), x86Context._getVarMem(cv));\n                else\n                  x86Compiler->emit(kX86InstMovSS, xmm(dsti), xmm(srci));\n                break;\n              case kX86VarTypeXmmSD:\n              case kX86VarTypeXmmPD:\n                if (srci == kRegIndexInvalid)\n                  x86Compiler->emit(kX86InstCvtSD2SS, xmm(dsti), x86Context._getVarMem(cv));\n                else if (dsti != srci)\n                  x86Compiler->emit(kX86InstCvtSD2SS, xmm(dsti), xmm(srci));\n                break;\n            }\n          }\n        }\n      }\n      break;\n\n    case kX86VarTypeXmmSD:\n      for (i = 0; i < 2; i++)\n      {\n        uint32_t dsti = i;\n        uint32_t srci;\n\n        if (_ret[i].isVar())\n        {\n          if (reinterpret_cast<const Var&>(_ret[i]).isX87Var())\n          {\n            // TODO: X87 Support.\n          }\n          else if (reinterpret_cast<const Var&>(_ret[i]).isXmmVar())\n          {\n            X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n            ASMJIT_ASSERT(cv != NULL);\n\n            srci = cv->regIndex;\n            switch (cv->getType())\n            {\n              case kX86VarTypeXmm:\n                if (srci == kRegIndexInvalid)\n                  x86Compiler->emit(kX86InstMovDQA, xmm(dsti), x86Context._getVarMem(cv));\n                else if (dsti != srci)\n                  x86Compiler->emit(kX86InstMovDQA, xmm(dsti), xmm(srci));\n                break;\n              case kX86VarTypeXmmSS:\n              case kX86VarTypeXmmPS:\n                if (srci == kRegIndexInvalid)\n                  x86Compiler->emit(kX86InstCvtSS2SD, xmm(dsti), x86Context._getVarMem(cv));\n                else\n                  x86Compiler->emit(kX86InstCvtSS2SD, xmm(dsti), xmm(srci));\n                break;\n              case kX86VarTypeXmmSD:\n              case kX86VarTypeXmmPD:\n                if (srci == kRegIndexInvalid)\n                  x86Compiler->emit(kX86InstMovSD, xmm(dsti), x86Context._getVarMem(cv));\n                else\n                  x86Compiler->emit(kX86InstMovSD, xmm(dsti), xmm(srci));\n                break;\n            }\n          }\n        }\n      }\n      break;\n\n    case kInvalidValue:\n    default:\n      break;\n  }\n\n  if (mustEmitJump())\n  {\n    x86Context._isUnreachable = 1;\n  }\n\n  for (i = 0; i < 2; i++)\n  {\n    if (_ret[i].isVar())\n    {\n      X86CompilerVar* cv = x86Compiler->_getVar(_ret[i].getId());\n      x86Context._unuseVarOnEndOfScope(this, cv);\n    }\n  }\n\n  return translated();\n}\n\nvoid X86CompilerFuncRet::emit(Assembler& a)\n{\n  X86Assembler& x86Asm = static_cast<X86Assembler&>(a);\n\n  if (mustEmitJump())\n    x86Asm.jmp(getFunc()->getExitLabel());\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncRet - Misc]\n// ============================================================================\n\nint X86CompilerFuncRet::getMaxSize() const\n{\n  return mustEmitJump() ? 15 : 0;\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncCall - Construction / Destruction]\n// ============================================================================\n\nX86CompilerFuncCall::X86CompilerFuncCall(X86Compiler* x86Compiler, X86CompilerFuncDecl* caller, const Operand* target) : \n  CompilerFuncCall(x86Compiler, caller, target),\n  _gpParams(0),\n  _mmParams(0),\n  _xmmParams(0),\n  _variablesCount(0),\n  _variables(NULL)\n{\n}\n\nX86CompilerFuncCall::~X86CompilerFuncCall()\n{\n  memset(_argumentToVarRecord, 0, sizeof(VarCallRecord*) * kFuncArgsMax);\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncCall - Interface]\n// ============================================================================\n\nvoid X86CompilerFuncCall::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n  // Prepare is similar to X86CompilerInst::prepare(). We collect unique variables\n  // and update statistics, but we don't use standard alloc/free register calls.\n  //\n  // The calling function is also unique in variable allocator point of view,\n  // because we need to alloc some variables that may be destroyed be the \n  // callee (okay, may not, but this is not guaranteed).\n  _offset = x86Context._currentOffset;\n\n  // Tell EFunction that another function will be called inside. It needs this\n  // information to reserve stack for the call and to mark esp adjustable.\n  getCaller()->reserveStackForFunctionCall(static_cast<int32_t>(_x86Decl.getArgumentsStackSize()));\n\n  uint32_t i;\n  uint32_t argumentsCount = _x86Decl.getArgumentsCount();\n  uint32_t operandsCount = argumentsCount;\n  uint32_t variablesCount = 0;\n\n  // Create registers used as arguments mask.\n  for (i = 0; i < argumentsCount; i++)\n  {\n    const FuncArg& fArg = _x86Decl.getArguments()[i];\n\n    if (fArg.hasRegIndex())\n    {\n      switch (fArg.getVarType())\n      {\n        case kX86VarTypeGpd:\n        case kX86VarTypeGpq:\n          _gpParams |= IntUtil::maskFromIndex(fArg.getRegIndex());\n          break;\n        case kX86VarTypeMm:\n          _mmParams |= IntUtil::maskFromIndex(fArg.getRegIndex());\n          break;\n        case kX86VarTypeXmm:\n        case kX86VarTypeXmmSS:\n        case kX86VarTypeXmmPS:\n        case kX86VarTypeXmmSD:\n        case kX86VarTypeXmmPD:\n          _xmmParams |= IntUtil::maskFromIndex(fArg.getRegIndex());\n          break;\n        default:\n          ASMJIT_ASSERT(0);\n      }\n    }\n    else\n    {\n      x86Context.getFunc()->setFuncFlag(kX86FuncFlagIsEspAdjusted);\n    }\n  }\n\n  // Call address.\n  operandsCount++;\n\n  // The first and the second return value.\n  if (!_ret[0].isNone())\n    operandsCount++;\n  if (!_ret[1].isNone())\n    operandsCount++;\n\n#define __GET_VARIABLE(__vardata__) \\\n  { \\\n    X86CompilerVar* _candidate = __vardata__; \\\n    \\\n    for (var = cur; ;) \\\n    { \\\n      if (var == _variables) \\\n      { \\\n        var = cur++; \\\n        var->vdata = _candidate; \\\n        break; \\\n      } \\\n      \\\n      var--; \\\n      \\\n      if (var->vdata == _candidate) \\\n      { \\\n        break; \\\n      } \\\n    } \\\n    \\\n    ASMJIT_ASSERT(var != NULL); \\\n  }\n\n  for (i = 0; i < operandsCount; i++)\n  {\n    Operand& o = (i < argumentsCount) \n      ? (_args[i])\n      : (i == argumentsCount ? _target : _ret[i - argumentsCount - 1]);\n\n    if (o.isVar())\n    {\n      ASMJIT_ASSERT(o.getId() != kInvalidValue);\n      X86CompilerVar* cv = x86Compiler->_getVar(o.getId());\n      ASMJIT_ASSERT(cv != NULL);\n\n      if (cv->workOffset == _offset) continue;\n      if (!x86Context._isActive(cv)) x86Context._addActive(cv);\n\n      cv->workOffset = _offset;\n      variablesCount++;\n    }\n    else if (o.isMem())\n    {\n      if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(o.getId());\n        ASMJIT_ASSERT(cv != NULL);\n\n        x86Context._markMemoryUsed(cv);\n        if (!x86Context._isActive(cv)) x86Context._addActive(cv);\n\n        continue;\n      }\n      else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(o._mem.base);\n        ASMJIT_ASSERT(cv != NULL);\n\n        if (cv->workOffset == _offset) continue;\n        if (!x86Context._isActive(cv)) x86Context._addActive(cv);\n\n        cv->workOffset = _offset;\n        variablesCount++;\n      }\n\n      if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(o._mem.index);\n        ASMJIT_ASSERT(cv != NULL);\n\n        if (cv->workOffset == _offset) continue;\n        if (!x86Context._isActive(cv)) x86Context._addActive(cv);\n\n        cv->workOffset = _offset;\n        variablesCount++;\n      }\n    }\n  }\n\n  // Traverse all active variables and set their funcCall pointer to this\n  // call. This information can be used to choose between the preserved-first\n  // and preserved-last register allocation.\n  if (x86Context._active)\n  {\n    X86CompilerVar* first = static_cast<X86CompilerVar*>(x86Context._active);\n    X86CompilerVar* active = first;\n    do {\n      if (active->funcCall == NULL)\n        active->funcCall = this;\n      active = active->nextActive;\n    } while (active != first);\n  }\n\n  if (!variablesCount)\n  {\n    x86Context._currentOffset++;\n    return;\n  }\n\n  _variables = reinterpret_cast<VarCallRecord*>(x86Compiler->getZoneMemory().alloc(sizeof(VarCallRecord) * variablesCount));\n  if (!_variables)\n  {\n    x86Compiler->setError(kErrorNoHeapMemory);\n    x86Context._currentOffset++;\n    return;\n  }\n\n  _variablesCount = variablesCount;\n  memset(_variables, 0, sizeof(VarCallRecord) * variablesCount);\n\n  VarCallRecord* cur = _variables;\n  VarCallRecord* var = NULL;\n\n  for (i = 0; i < operandsCount; i++)\n  {\n    Operand& o = (i < argumentsCount) \n      ? (_args[i])\n      : (i == argumentsCount ? _target : _ret[i - argumentsCount - 1]);\n\n    if (o.isVar())\n    {\n      X86CompilerVar* cv = x86Compiler->_getVar(o.getId());\n      ASMJIT_ASSERT(cv != NULL);\n\n      __GET_VARIABLE(cv)\n      _argumentToVarRecord[i] = var;\n\n      if (i < argumentsCount)\n      {\n        const FuncArg& fArg = _x86Decl.getArgument(i);\n\n        if (fArg.hasRegIndex())\n        {\n          x86Context._newRegisterHomeIndex(cv, fArg.getRegIndex());\n\n          switch (fArg.getVarType())\n          {\n            case kX86VarTypeGpd:\n            case kX86VarTypeGpq:\n              var->flags |= VarCallRecord::kFlagInGp;\n              var->inCount++;\n              break;\n\n            case kX86VarTypeMm:\n              var->flags |= VarCallRecord::kFlagInMm;\n              var->inCount++;\n              break;\n\n            case kX86VarTypeXmm:\n            case kX86VarTypeXmmSS:\n            case kX86VarTypeXmmPS:\n            case kX86VarTypeXmmSD:\n            case kX86VarTypeXmmPD:\n              var->flags |= VarCallRecord::kFlagInXmm;\n              var->inCount++;\n              break;\n\n            default:\n              ASMJIT_ASSERT(0);\n          }\n        }\n        else\n        {\n          var->inCount++;\n        }\n\n        cv->regReadCount++;\n      }\n      else if (i == argumentsCount)\n      {\n        uint32_t mask = (~_x86Decl.getGpPreservedMask()) &\n                        (~_x86Decl.getGpArgumentsMask()) & \n                        (IntUtil::maskUpToIndex(kX86RegNumGp));\n\n        x86Context._newRegisterHomeIndex(cv, IntUtil::findFirstBit(mask));\n        x86Context._newRegisterHomeMask(cv, mask);\n\n        var->flags |= VarCallRecord::kFlagCallReg;\n        cv->regReadCount++;\n      }\n      else\n      {\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n          case kX86VarTypeGpq:\n            if (i == argumentsCount+1)\n              var->flags |= VarCallRecord::kFlagOutEax;\n            else\n              var->flags |= VarCallRecord::kFlagOutEdx;\n            break;\n\n          case kX86VarTypeX87:\n          case kX86VarTypeX87SS:\n          case kX86VarTypeX87SD:\n#if defined(ASMJIT_X86)\n            if (i == argumentsCount+1)\n              var->flags |= VarCallRecord::kFlagOutSt0;\n            else\n              var->flags |= VarCallRecord::kFlagOutSt1;\n#else\n            if (i == argumentsCount+1)\n              var->flags |= VarCallRecord::kFlagOutXmm0;\n            else\n              var->flags |= VarCallRecord::kFlagOutXmm1;\n#endif\n            break;\n\n          case kX86VarTypeMm:\n            var->flags |= VarCallRecord::kFlagOutMm0;\n            break;\n\n          case kX86VarTypeXmm:\n          case kX86VarTypeXmmPS:\n          case kX86VarTypeXmmPD:\n            if (i == argumentsCount+1)\n              var->flags |= VarCallRecord::kFlagOutXmm0;\n            else\n              var->flags |= VarCallRecord::kFlagOutXmm1;\n            break;\n\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmSD:\n#if defined(ASMJIT_X86)\n            if (i == argumentsCount+1)\n              var->flags |= VarCallRecord::kFlagOutSt0;\n            else\n              var->flags |= VarCallRecord::kFlagOutSt1;\n#else\n            if (i == argumentsCount+1)\n              var->flags |= VarCallRecord::kFlagOutXmm0;\n            else\n              var->flags |= VarCallRecord::kFlagOutXmm1;\n#endif\n            break;\n\n          default:\n            ASMJIT_ASSERT(0);\n        }\n\n        cv->regWriteCount++;\n      }\n    }\n    else if (o.isMem())\n    {\n      ASMJIT_ASSERT(i == argumentsCount);\n\n      if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(o.getId());\n        ASMJIT_ASSERT(cv != NULL);\n\n        cv->memReadCount++;\n      }\n      else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(reinterpret_cast<Mem&>(o).getBase());\n        ASMJIT_ASSERT(cv != NULL);\n\n        cv->regReadCount++;\n\n        __GET_VARIABLE(cv)\n        var->flags |= VarCallRecord::kFlagCallReg | VarCallRecord::kFlagCallMem;\n      }\n\n      if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* cv = x86Compiler->_getVar(reinterpret_cast<Mem&>(o).getIndex());\n        ASMJIT_ASSERT(cv != NULL);\n\n        cv->regReadCount++;\n\n        __GET_VARIABLE(cv)\n        var->flags |= VarCallRecord::kFlagCallReg | VarCallRecord::kFlagCallMem;\n      }\n    }\n  }\n\n  // Traverse all variables and update firstItem / lastItem. This\n  // function is called from iterator that scans items using forward\n  // direction so we can use this knowledge to optimize the process.\n  //\n  // Same code is in X86CompilerInst::prepare().\n  for (i = 0; i < _variablesCount; i++)\n  {\n    X86CompilerVar* v = _variables[i].vdata;\n\n    // First item (begin of variable scope).\n    if (v->firstItem == NULL) v->firstItem = this;\n\n    // Last item (end of variable scope).\n    v->lastItem = this;\n  }\n\n  x86Context._currentOffset++;\n\n#undef __GET_VARIABLE\n}\n\nCompilerItem* X86CompilerFuncCall::translate(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = x86Context.getCompiler();\n\n  uint32_t i;\n  uint32_t preserved, mask;\n\n  uint32_t temporaryGpReg;\n  uint32_t temporaryXmmReg;\n\n  uint32_t offset = x86Context._currentOffset;\n\n  // Constants.\n  const FuncArg* targs = _x86Decl.getArguments();\n\n  uint32_t argumentsCount = _x86Decl.getArgumentsCount();\n  uint32_t variablesCount = _variablesCount;\n\n  // Processed arguments kFuncArgsMax.\n  uint8_t processed[kFuncArgsMax] = { 0 };\n\n  x86Compiler->comment(\"Call\");\n\n  // These variables are used by the instruction so we set current offset\n  // to their work offsets -> The getSpillCandidate() method never returns \n  // the variable used by this instruction.\n  for (i = 0; i < variablesCount; i++)\n  {\n    _variables[i].vdata->workOffset = offset;\n\n    // Init back-reference to VarCallRecord.\n    _variables[i].vdata->tPtr = &_variables[i];\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 1:\n  //\n  // Spill variables which are not used by the function call and have to\n  // be destroyed. These registers may be used by callee.\n  // --------------------------------------------------------------------------\n\n  preserved = _x86Decl.getGpPreservedMask();\n  for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n  {\n    X86CompilerVar* cv = x86Context._x86State.gp[i];\n    if (cv && cv->workOffset != offset && (preserved & mask) == 0)\n      x86Context.spillGpVar(cv);\n  }\n\n  preserved = _x86Decl.getMmPreservedMask();\n  for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1)\n  {\n    X86CompilerVar* cv = x86Context._x86State.mm[i];\n    if (cv && cv->workOffset != offset && (preserved & mask) == 0)\n      x86Context.spillMmVar(cv);\n  }\n\n  preserved = _x86Decl.getXmmPreservedMask();\n  for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1)\n  {\n    X86CompilerVar* cv = x86Context._x86State.xmm[i];\n    if (cv && cv->workOffset != offset && (preserved & mask) == 0)\n      x86Context.spillXmmVar(cv);\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 2:\n  //\n  // Move all arguments to the stack which all already in registers.\n  // --------------------------------------------------------------------------\n\n  for (i = 0; i < argumentsCount; i++)\n  {\n    if (processed[i])\n      continue;\n\n    const FuncArg& argType = targs[i];\n    if (argType.hasRegIndex())\n      continue;\n\n    Operand& operand = _args[i];\n\n    if (operand.isVar())\n    {\n      VarCallRecord* rec = _argumentToVarRecord[i];\n      X86CompilerVar* cv = x86Compiler->_getVar(operand.getId());\n\n      if (cv->regIndex != kRegIndexInvalid)\n      {\n        _moveAllocatedVariableToStack(cc,\n          cv, argType);\n\n        rec->inDone++;\n        processed[i] = true;\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 3:\n  //\n  // Spill all non-preserved variables we moved to stack in STEP #2.\n  // --------------------------------------------------------------------------\n\n  for (i = 0; i < argumentsCount; i++)\n  {\n    VarCallRecord* rec = _argumentToVarRecord[i];\n    if (!rec || processed[i])\n      continue;\n\n    if (rec->inDone >= rec->inCount)\n    {\n      X86CompilerVar* cv = rec->vdata;\n      if (cv->regIndex == kRegIndexInvalid)\n        continue;\n\n      if (rec->outCount)\n      {\n        // Variable will be rewritten by function return value, it's not needed\n        // to spill it. It will be allocated again by X86CompilerFuncCall.\n        x86Context.unuseVar(rec->vdata, kVarStateUnused);\n      }\n      else\n      {\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n          case kX86VarTypeGpq:\n            if ((_x86Decl.getGpPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0)\n              x86Context.spillGpVar(cv);\n            break;\n          case kX86VarTypeMm:\n            if ((_x86Decl.getMmPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0)\n              x86Context.spillMmVar(cv);\n            break;\n          case kX86VarTypeXmm:\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPS:\n          case kX86VarTypeXmmPD:\n            if ((_x86Decl.getXmmPreservedMask() & IntUtil::maskFromIndex(cv->regIndex)) == 0)\n              x86Context.spillXmmVar(cv);\n            break;\n        }\n      }\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 4:\n  //\n  // Get temporary register that we can use to pass input function arguments.\n  // Now it's safe to do, because the non-needed variables should be spilled.\n  // --------------------------------------------------------------------------\n\n  temporaryGpReg = _findTemporaryGpRegister(cc);\n  temporaryXmmReg = _findTemporaryXmmRegister(cc);\n\n  // If failed to get temporary register then we need just to pick one.\n  if (temporaryGpReg == kRegIndexInvalid)\n  {\n    // TODO.\n  }\n  if (temporaryXmmReg == kRegIndexInvalid)\n  {\n    // TODO.\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 5:\n  //\n  // Move all remaining arguments to the stack (we can use temporary register).\n  // or allocate it to the primary register. Also move immediates.\n  // --------------------------------------------------------------------------\n\n  for (i = 0; i < argumentsCount; i++)\n  {\n    if (processed[i])\n      continue;\n\n    const FuncArg& argType = targs[i];\n\n    if (argType.hasRegIndex())\n      continue;\n\n    Operand& operand = _args[i];\n\n    if (operand.isVar())\n    {\n      VarCallRecord* rec = _argumentToVarRecord[i];\n      X86CompilerVar* cv = x86Compiler->_getVar(operand.getId());\n\n      _moveSpilledVariableToStack(cc,\n        cv, argType,\n        temporaryGpReg, temporaryXmmReg);\n\n      rec->inDone++;\n      processed[i] = true;\n    }\n    else if (operand.isImm())\n    {\n      // TODO.\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 6:\n  //\n  // Allocate arguments to registers.\n  // --------------------------------------------------------------------------\n\n  bool didWork;\n\n  do {\n    didWork = false;\n\n    for (i = 0; i < argumentsCount; i++)\n    {\n      if (processed[i])\n        continue;\n\n      VarCallRecord* rsrc = _argumentToVarRecord[i];\n\n      Operand& osrc = _args[i];\n      ASMJIT_ASSERT(osrc.isVar());\n      X86CompilerVar* vsrc = x86Compiler->_getVar(osrc.getId());\n\n      const FuncArg& srcArgType = targs[i];\n      X86CompilerVar* vdst = _getOverlappingVariable(cc, srcArgType);\n\n      if (vsrc == vdst)\n      {\n        rsrc->inDone++;\n        processed[i] = true;\n\n        didWork = true;\n        continue;\n      }\n      else if (vdst != NULL)\n      {\n        VarCallRecord* rdst = reinterpret_cast<VarCallRecord*>(vdst->tPtr);\n\n        if (rdst == NULL)\n        {\n          x86Context.spillVar(vdst);\n          vdst = NULL;\n        }\n        else if (rdst->inDone >= rdst->inCount && (rdst->flags & VarCallRecord::kFlagCallReg) == 0)\n        {\n          // Safe to spill.\n          if (rdst->outCount || vdst->lastItem == this)\n            x86Context.unuseVar(vdst, kVarStateUnused);\n          else\n            x86Context.spillVar(vdst);\n          vdst = NULL;\n        }\n        else\n        {\n          uint32_t x = _x86Decl.findArgumentByRegCode(X86Util::getRegCodeFromVarType(vsrc->getType(), vsrc->regIndex));\n          bool doSpill = true;\n\n          if ((vdst->getClass() & kX86VarClassGp) != 0)\n          {\n            // Try to emit mov to register which is possible for call() operand.\n            if (x == kInvalidValue && (rdst->flags & VarCallRecord::kFlagCallReg) != 0)\n            {\n              uint32_t rIndex;\n              uint32_t rBit;\n\n              // The mask which contains registers which are not-preserved\n              // (these that might be clobbered by the callee) and which are\n              // not used to pass function arguments. Each register contained\n              // in this mask is ideal to be used by call() instruction.\n              uint32_t possibleMask = (~_x86Decl.getGpPreservedMask()) &\n                                      (~_x86Decl.getGpArgumentsMask()) & \n                                      (IntUtil::maskUpToIndex(kX86RegNumGp));\n\n              if (possibleMask != 0)\n              {\n                for (rIndex = 0, rBit = 1; rIndex < kX86RegNumGp; rIndex++, rBit <<= 1)\n                {\n                  if ((possibleMask & rBit) != 0)\n                  {\n                    if (x86Context._x86State.gp[rIndex] == NULL) \n                    {\n                      // This is the best possible solution, the register is\n                      // free. We do not need to continue with this loop, the\n                      // rIndex will be used by the call().\n                      break;\n                    }\n                    else\n                    {\n                      // Wait until the register is freed or try to find another.\n                      doSpill = false;\n                      didWork = true;\n                    }\n                  }\n                }\n              }\n              else\n              {\n                // Try to find a register which is free and which is not used\n                // to pass a function argument.\n                possibleMask = _x86Decl.getGpPreservedMask();\n\n                for (rIndex = 0, rBit = 1; rIndex < kX86RegNumGp; rIndex++, rBit <<= 1)\n                {\n                  if ((possibleMask & rBit) != 0)\n                  {\n                    // Found one.\n                    if (x86Context._x86State.gp[rIndex] == NULL) break;\n                  }\n                }\n              }\n\n              if (rIndex < kX86RegNumGp)\n              {\n                if (temporaryGpReg == vsrc->regIndex) temporaryGpReg = rIndex;\n                x86Compiler->emit(kX86InstMov, gpz(rIndex), gpz(vsrc->regIndex));\n\n                x86Context._x86State.gp[vsrc->regIndex] = NULL;\n                x86Context._x86State.gp[rIndex] = vsrc;\n\n                vsrc->regIndex = rIndex;\n                x86Context._allocatedGpRegister(rIndex);\n\n                doSpill = false;\n                didWork = true;\n              }\n            }\n            // Emit xchg instead of spill/alloc if possible.\n            else if (x != kInvalidValue)\n            {\n              const FuncArg& dstArgType = targs[x];\n              if (X86Util::getVarClassFromVarType(dstArgType.getVarType()) == X86Util::getVarClassFromVarType(srcArgType.getVarType()))\n              {\n                uint32_t dstIndex = vdst->regIndex;\n                uint32_t srcIndex = vsrc->regIndex;\n\n                if (srcIndex == dstArgType.getRegIndex())\n                {\n#if defined(ASMJIT_X64)\n                  if (vdst->getType() != kX86VarTypeGpd || vsrc->getType() != kX86VarTypeGpd)\n                    x86Compiler->emit(kX86InstXchg, gpq(dstIndex), gpq(srcIndex));\n                  else\n#endif\n                    x86Compiler->emit(kX86InstXchg, gpd(dstIndex), gpd(srcIndex));\n\n                  x86Context._x86State.gp[srcIndex] = vdst;\n                  x86Context._x86State.gp[dstIndex] = vsrc;\n\n                  vdst->regIndex = srcIndex;\n                  vsrc->regIndex = dstIndex;\n\n                  rdst->inDone++;\n                  rsrc->inDone++;\n\n                  processed[i] = true;\n                  processed[x] = true;\n\n                  doSpill = false;\n                }\n              }\n            }\n          }\n\n          if (doSpill)\n          {\n            x86Context.spillVar(vdst);\n            vdst = NULL;\n          }\n        }\n      }\n\n      if (vdst == NULL)\n      {\n        VarCallRecord* rec = reinterpret_cast<VarCallRecord*>(vsrc->tPtr);\n\n        _moveSrcVariableToRegister(cc, vsrc, srcArgType);\n\n        switch (srcArgType.getVarType())\n        {\n          case kX86VarTypeGpd:\n          case kX86VarTypeGpq:\n            x86Context._markGpRegisterModified(srcArgType.getRegIndex());\n            break;\n          case kX86VarTypeMm:\n            x86Context._markMmRegisterModified(srcArgType.getRegIndex());\n            break;\n          case kX86VarTypeXmm:\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPS:\n          case kX86VarTypeXmmPD:\n            x86Context._markMmRegisterModified(srcArgType.getRegIndex());\n            break;\n        }\n\n        rec->inDone++;\n        processed[i] = true;\n      }\n    }\n  } while (didWork);\n\n  // --------------------------------------------------------------------------\n  // STEP 7:\n  //\n  // Allocate operand used by CALL instruction.\n  // --------------------------------------------------------------------------\n\n  for (i = 0; i < variablesCount; i++)\n  {\n    VarCallRecord& r = _variables[i];\n    if ((r.flags & VarCallRecord::kFlagCallReg) &&\n        (r.vdata->regIndex == kRegIndexInvalid))\n    {\n      // If the register is not allocated and the call form is 'call reg' then\n      // it's possible to keep it in memory.\n      if ((r.flags & VarCallRecord::kFlagCallMem) == 0)\n      {\n        _target = r.vdata->asGpVar().m();\n        break;\n      }\n\n      if (temporaryGpReg == kRegIndexInvalid)\n        temporaryGpReg = _findTemporaryGpRegister(cc);\n\n      x86Context.allocGpVar(r.vdata, \n        IntUtil::maskFromIndex(temporaryGpReg),\n        kVarAllocRegister | kVarAllocRead);\n    }\n  }\n\n  x86Context.translateOperands(&_target, 1);\n\n  // --------------------------------------------------------------------------\n  // STEP 8:\n  //\n  // Spill all preserved variables.\n  // --------------------------------------------------------------------------\n\n  preserved = _x86Decl.getGpPreservedMask();\n  for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n  {\n    X86CompilerVar* vdata = x86Context._x86State.gp[i];\n    if (vdata && (preserved & mask) == 0)\n    {\n      VarCallRecord* rec = reinterpret_cast<VarCallRecord*>(vdata->tPtr);\n      if (rec && (rec->outCount || rec->flags & VarCallRecord::kFlagUnuseAfterUse || vdata->lastItem == this))\n        x86Context.unuseVar(vdata, kVarStateUnused);\n      else\n        x86Context.spillGpVar(vdata);\n    }\n  }\n\n  preserved = _x86Decl.getMmPreservedMask();\n  for (i = 0, mask = 1; i < kX86RegNumMm; i++, mask <<= 1)\n  {\n    X86CompilerVar* vdata = x86Context._x86State.mm[i];\n    if (vdata && (preserved & mask) == 0)\n    {\n      VarCallRecord* rec = reinterpret_cast<VarCallRecord*>(vdata->tPtr);\n      if (rec && (rec->outCount || vdata->lastItem == this))\n        x86Context.unuseVar(vdata, kVarStateUnused);\n      else\n        x86Context.spillMmVar(vdata);\n    }\n  }\n\n  preserved = _x86Decl.getXmmPreservedMask();\n  for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1)\n  {\n    X86CompilerVar* vdata = x86Context._x86State.xmm[i];\n    if (vdata && (preserved & mask) == 0)\n    {\n      VarCallRecord* rec = reinterpret_cast<VarCallRecord*>(vdata->tPtr);\n      if (rec && (rec->outCount || vdata->lastItem == this))\n        x86Context.unuseVar(vdata, kVarStateUnused);\n      else\n        x86Context.spillXmmVar(vdata);\n    }\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 9:\n  //\n  // Emit CALL instruction.\n  // --------------------------------------------------------------------------\n\n  x86Compiler->emit(kX86InstCall, _target);\n\n  // Restore the stack offset.\n  if (_x86Decl.getCalleePopsStack())\n  {\n    int32_t s = static_cast<int32_t>(_x86Decl.getArgumentsStackSize());\n\n    if (s != 0)\n      x86Compiler->emit(kX86InstSub, zsp, imm(s));\n  }\n\n  // --------------------------------------------------------------------------\n  // STEP 10:\n  //\n  // Prepare others for return value(s) and cleanup.\n  // --------------------------------------------------------------------------\n\n  // Clear temp data, see AsmJit::X86CompilerVar::temp why it's needed.\n  for (i = 0; i < variablesCount; i++)\n  {\n    VarCallRecord* rec = &_variables[i];\n    X86CompilerVar* vdata = rec->vdata;\n\n    if (rec->flags & (VarCallRecord::kFlagOutEax | VarCallRecord::kFlagOutEdx))\n    {\n      if (vdata->getClass() & kX86VarClassGp)\n      {\n        x86Context.allocGpVar(vdata, \n          IntUtil::maskFromIndex((rec->flags & VarCallRecord::kFlagOutEax) != 0\n            ? kX86RegIndexEax\n            : kX86RegIndexEdx),\n          kVarAllocRegister | kVarAllocWrite);\n        vdata->changed = true;\n      }\n    }\n\n    if (rec->flags & (VarCallRecord::kFlagOutMm0))\n    {\n      if (vdata->getClass() & kX86VarClassMm)\n      {\n        x86Context.allocMmVar(vdata, IntUtil::maskFromIndex(kX86RegIndexMm0),\n          kVarAllocRegister | kVarAllocWrite);\n        vdata->changed = true;\n      }\n    }\n\n    if (rec->flags & (VarCallRecord::kFlagOutXmm0 | VarCallRecord::kFlagOutXmm1))\n    {\n      if (vdata->getClass() & kX86VarClassXmm)\n      {\n        x86Context.allocXmmVar(vdata, \n          IntUtil::maskFromIndex((rec->flags & VarCallRecord::kFlagOutXmm0) != 0\n            ? kX86RegIndexXmm0\n            : kX86RegIndexXmm1),\n          kVarAllocRegister | kVarAllocWrite);\n        vdata->changed = true;\n      }\n    }\n\n    if (rec->flags & (VarCallRecord::kFlagOutSt0 | VarCallRecord::kFlagOutSt1))\n    {\n      if (vdata->getClass() & kX86VarClassXmm)\n      {\n        Mem mem(x86Context._getVarMem(vdata));\n        x86Context.unuseVar(vdata, kVarStateMem);\n\n        switch (vdata->getType())\n        {\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmPS:\n          {\n            mem.setSize(4);\n            x86Compiler->emit(kX86InstFStP, mem);\n            break;\n          }\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPD:\n          {\n            mem.setSize(8);\n            x86Compiler->emit(kX86InstFStP, mem);\n            break;\n          }\n          default:\n          {\n            x86Compiler->comment(\"*** WARNING: Can't convert float return value to untyped XMM\\n\");\n            break;\n          }\n        }\n      }\n    }\n\n    // Cleanup.\n    vdata->tPtr = NULL;\n  }\n\n  for (i = 0; i < variablesCount; i++)\n  {\n    x86Context._unuseVarOnEndOfScope(this, &_variables[i]);\n  }\n\n  return translated();\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncCall - Misc]\n// ============================================================================\n\nint X86CompilerFuncCall::getMaxSize() const\n{\n  // TODO: Instruction max size.\n  return 15;\n}\n\nbool X86CompilerFuncCall::_tryUnuseVar(CompilerVar* _v)\n{\n  X86CompilerVar* cv = static_cast<X86CompilerVar*>(_v);\n\n  for (uint32_t i = 0; i < _variablesCount; i++)\n  {\n    if (_variables[i].vdata == cv)\n    {\n      _variables[i].flags |= VarCallRecord::kFlagUnuseAfterUse;\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncCall - Helpers]\n// ============================================================================\n\nuint32_t X86CompilerFuncCall::_findTemporaryGpRegister(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n\n  uint32_t i;\n  uint32_t mask;\n\n  uint32_t passedGP = _x86Decl.getGpArgumentsMask();\n  uint32_t candidate = kRegIndexInvalid;\n\n  // Find all registers used to pass function arguments. We shouldn't use these\n  // if possible.\n  for (i = 0, mask = 1; i < kX86RegNumGp; i++, mask <<= 1)\n  {\n    if (x86Context._x86State.gp[i] == NULL)\n    {\n      // If this register is used to pass arguments to function, we will mark\n      // it and use it only if there is no other one.\n      if ((passedGP & mask) != 0)\n        candidate = i;\n      else\n        return i;\n    }\n  }\n\n  return candidate;\n}\n\nuint32_t X86CompilerFuncCall::_findTemporaryXmmRegister(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n\n  uint32_t i;\n  uint32_t mask;\n\n  uint32_t passedXMM = _x86Decl.getXmmArgumentsMask();\n  uint32_t candidate = kRegIndexInvalid;\n\n  // Find all registers used to pass function arguments. We shouldn't use these\n  // if possible.\n  for (i = 0, mask = 1; i < kX86RegNumXmm; i++, mask <<= 1)\n  {\n    if (x86Context._x86State.xmm[i] == NULL)\n    {\n      // If this register is used to pass arguments to function, we will mark\n      // it and use it only if there is no other one.\n      if ((passedXMM & mask) != 0)\n        candidate = i;\n      else\n        return i;\n    }\n  }\n\n  return candidate;\n}\n\nX86CompilerVar* X86CompilerFuncCall::_getOverlappingVariable(CompilerContext& cc, const FuncArg& argType) const\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  ASMJIT_ASSERT(argType.getVarType() != kVarTypeInvalid);\n\n  switch (argType.getVarType())\n  {\n    case kX86VarTypeGpd:\n    case kX86VarTypeGpq:\n      return x86Context._x86State.gp[argType.getRegIndex()];\n    case kX86VarTypeMm:\n      return x86Context._x86State.mm[argType.getRegIndex()];\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmSS:\n    case kX86VarTypeXmmSD:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmPD:\n      return x86Context._x86State.xmm[argType.getRegIndex()];\n  }\n\n  return NULL;\n}\n\nvoid X86CompilerFuncCall::_moveAllocatedVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = x86Context.getCompiler();\n\n  ASMJIT_ASSERT(!argType.hasRegIndex());\n  ASMJIT_ASSERT(vdata->regIndex != kRegIndexInvalid);\n\n  uint32_t src = vdata->regIndex;\n  Mem dst = ptr(zsp, -(int)sizeof(uintptr_t) + argType.getStackOffset());\n\n  switch (vdata->getType())\n  {\n    case kX86VarTypeGpd:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeGpd:\n          x86Compiler->emit(kX86InstMov, dst, gpd(src));\n          return;\n#if defined(ASMJIT_X64)\n        case kX86VarTypeGpq:\n        case kX86VarTypeMm:\n          x86Compiler->emit(kX86InstMov, dst, gpq(src));\n          return;\n#endif // ASMJIT_X64\n      }\n      break;\n\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeGpd:\n          x86Compiler->emit(kX86InstMov, dst, gpd(src));\n          return;\n        case kX86VarTypeGpq:\n          x86Compiler->emit(kX86InstMov, dst, gpq(src));\n          return;\n        case kX86VarTypeMm:\n          x86Compiler->emit(kX86InstMovQ, dst, gpq(src));\n          return;\n      }\n      break;\n#endif // ASMJIT_X64\n\n    case kX86VarTypeMm:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeGpd:\n        case kX86VarTypeX87SS:\n        case kX86VarTypeXmmSS:\n          x86Compiler->emit(kX86InstMovD, dst, mm(src));\n          return;\n        case kX86VarTypeGpq:\n        case kX86VarTypeMm:\n        case kX86VarTypeX87SD:\n        case kX86VarTypeXmmSD:\n          x86Compiler->emit(kX86InstMovQ, dst, mm(src));\n          return;\n      }\n      break;\n\n    // We allow incompatible types here, because the called can convert them\n    // to correct format before function is called.\n\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmPD:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeXmm:\n          x86Compiler->emit(kX86InstMovDQU, dst, xmm(src));\n          return;\n        case kX86VarTypeXmmSS:\n        case kX86VarTypeXmmPS:\n          x86Compiler->emit(kX86InstMovUPS, dst, xmm(src));\n          return;\n        case kX86VarTypeXmmSD:\n        case kX86VarTypeXmmPD:\n          x86Compiler->emit(kX86InstMovUPD, dst, xmm(src));\n          return;\n      }\n      break;\n\n    case kX86VarTypeXmmSS:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeX87SS:\n        case kX86VarTypeXmm:\n        case kX86VarTypeXmmSS:\n        case kX86VarTypeXmmPS:\n        case kX86VarTypeXmmSD:\n        case kX86VarTypeXmmPD:\n          x86Compiler->emit(kX86InstMovSS, dst, xmm(src));\n          return;\n      }\n      break;\n\n    case kX86VarTypeXmmSD:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeX87SD:\n        case kX86VarTypeXmm:\n        case kX86VarTypeXmmSS:\n        case kX86VarTypeXmmPS:\n        case kX86VarTypeXmmSD:\n        case kX86VarTypeXmmPD:\n          x86Compiler->emit(kX86InstMovSD, dst, xmm(src));\n          return;\n      }\n      break;\n  }\n\n  x86Compiler->setError(kErrorIncompatibleArgumentType);\n}\n\nvoid X86CompilerFuncCall::_moveSpilledVariableToStack(CompilerContext& cc,\n  X86CompilerVar* cv, const FuncArg& argType,\n  uint32_t temporaryGpReg,\n  uint32_t temporaryXmmReg)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = x86Context.getCompiler();\n\n  ASMJIT_ASSERT(!argType.hasRegIndex());\n  ASMJIT_ASSERT(cv->regIndex == kRegIndexInvalid);\n\n  Mem src = x86Context._getVarMem(cv);\n  Mem dst = ptr(zsp, -(int)sizeof(sysint_t) + argType.getStackOffset());\n\n  switch (cv->getType())\n  {\n    case kX86VarTypeGpd:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeGpd:\n          x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src);\n          x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg));\n          return;\n#if defined(ASMJIT_X64)\n        case kX86VarTypeGpq:\n        case kX86VarTypeMm:\n          x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src);\n          x86Compiler->emit(kX86InstMov, dst, gpq(temporaryGpReg));\n          return;\n#endif // ASMJIT_X64\n      }\n      break;\n\n#if defined(ASMJIT_X64)\n    case kX86VarTypeGpq:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeGpd:\n          x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src);\n          x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg));\n          return;\n        case kX86VarTypeGpq:\n        case kX86VarTypeMm:\n          x86Compiler->emit(kX86InstMov, gpq(temporaryGpReg), src);\n          x86Compiler->emit(kX86InstMov, dst, gpq(temporaryGpReg));\n          return;\n      }\n      break;\n#endif // ASMJIT_X64\n\n    case kX86VarTypeMm:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeGpd:\n        case kX86VarTypeX87SS:\n        case kX86VarTypeXmmSS:\n          x86Compiler->emit(kX86InstMov, gpd(temporaryGpReg), src);\n          x86Compiler->emit(kX86InstMov, dst, gpd(temporaryGpReg));\n          return;\n        case kX86VarTypeGpq:\n        case kX86VarTypeMm:\n        case kX86VarTypeX87SD:\n        case kX86VarTypeXmmSD:\n          // TODO\n          return;\n      }\n      break;\n\n    // We allow incompatible types here, because the caller can convert them\n    // to correct format before function is called.\n\n    case kX86VarTypeXmm:\n    case kX86VarTypeXmmPS:\n    case kX86VarTypeXmmPD:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeXmm:\n          x86Compiler->emit(kX86InstMovDQU, xmm(temporaryXmmReg), src);\n          x86Compiler->emit(kX86InstMovDQU, dst, xmm(temporaryXmmReg));\n          return;\n        case kX86VarTypeXmmSS:\n        case kX86VarTypeXmmPS:\n          x86Compiler->emit(kX86InstMovUPS, xmm(temporaryXmmReg), src);\n          x86Compiler->emit(kX86InstMovUPS, dst, xmm(temporaryXmmReg));\n          return;\n        case kX86VarTypeXmmSD:\n        case kX86VarTypeXmmPD:\n          x86Compiler->emit(kX86InstMovUPD, xmm(temporaryXmmReg), src);\n          x86Compiler->emit(kX86InstMovUPD, dst, xmm(temporaryXmmReg));\n          return;\n      }\n      break;\n\n    case kX86VarTypeXmmSS:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeX87SS:\n        case kX86VarTypeXmm:\n        case kX86VarTypeXmmSS:\n        case kX86VarTypeXmmPS:\n        case kX86VarTypeXmmSD:\n        case kX86VarTypeXmmPD:\n          x86Compiler->emit(kX86InstMovSS, xmm(temporaryXmmReg), src);\n          x86Compiler->emit(kX86InstMovSS, dst, xmm(temporaryXmmReg));\n          return;\n      }\n      break;\n\n    case kX86VarTypeXmmSD:\n      switch (argType.getVarType())\n      {\n        case kX86VarTypeX87SD:\n        case kX86VarTypeXmm:\n        case kX86VarTypeXmmSS:\n        case kX86VarTypeXmmPS:\n        case kX86VarTypeXmmSD:\n        case kX86VarTypeXmmPD:\n          x86Compiler->emit(kX86InstMovSD, xmm(temporaryXmmReg), src);\n          x86Compiler->emit(kX86InstMovSD, dst, xmm(temporaryXmmReg));\n          return;\n      }\n      break;\n  }\n\n  x86Compiler->setError(kErrorIncompatibleArgumentType);\n}\n\nvoid X86CompilerFuncCall::_moveSrcVariableToRegister(CompilerContext& cc,\n  X86CompilerVar* cv, const FuncArg& argType)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = x86Context.getCompiler();\n\n  uint32_t dst = argType.getRegIndex();\n  uint32_t src = cv->regIndex;\n\n  if (src != kRegIndexInvalid)\n  {\n    switch (argType.getVarType())\n    {\n      case kX86VarTypeGpd:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n#if defined(ASMJIT_X64)\n          case kX86VarTypeGpq:\n#endif // ASMJIT_X64\n            x86Compiler->emit(kX86InstMov, gpd(dst), gpd(src));\n            return;\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovD, gpd(dst), mm(src));\n            return;\n        }\n        break;\n\n#if defined(ASMJIT_X64)\n      case kX86VarTypeGpq:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n            x86Compiler->emit(kX86InstMov, gpd(dst), gpd(src));\n            return;\n          case kX86VarTypeGpq:\n            x86Compiler->emit(kX86InstMov, gpq(dst), gpq(src));\n            return;\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, gpq(dst), mm(src));\n            return;\n        }\n        break;\n#endif // ASMJIT_X64\n\n      case kX86VarTypeMm:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n            x86Compiler->emit(kX86InstMovD, gpd(dst), gpd(src));\n            return;\n#if defined(ASMJIT_X64)\n          case kX86VarTypeGpq:\n            x86Compiler->emit(kX86InstMovQ, gpq(dst), gpq(src));\n            return;\n#endif // ASMJIT_X64\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, mm(dst), mm(src));\n            return;\n        }\n        break;\n\n      case kX86VarTypeXmm:\n      case kX86VarTypeXmmPS:\n      case kX86VarTypeXmmPD:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n            x86Compiler->emit(kX86InstMovD, xmm(dst), gpd(src));\n            return;\n#if defined(ASMJIT_X64)\n          case kX86VarTypeGpq:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), gpq(src));\n            return;\n#endif // ASMJIT_X64\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src));\n            return;\n          case kX86VarTypeXmm:\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmPS:\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPD:\n            x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src));\n            return;\n        }\n        break;\n\n      case kX86VarTypeXmmSS:\n        switch (cv->getType())\n        {\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src));\n            return;\n\n          case kX86VarTypeXmm:\n            x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src));\n            return;\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmPS:\n            x86Compiler->emit(kX86InstMovSS, xmm(dst), xmm(src));\n            return;\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPD:\n            x86Compiler->emit(kX86InstCvtSD2SS, xmm(dst), xmm(src));\n            return;\n        }\n        break;\n\n      case kX86VarTypeXmmSD:\n        switch (cv->getType())\n        {\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), mm(src));\n            return;\n\n          case kX86VarTypeXmm:\n            x86Compiler->emit(kX86InstMovDQA, xmm(dst), xmm(src));\n            return;\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmPS:\n            x86Compiler->emit(kX86InstCvtSS2SD, xmm(dst), xmm(src));\n            return;\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPD:\n            x86Compiler->emit(kX86InstMovSD, xmm(dst), xmm(src));\n            return;\n        }\n        break;\n    }\n  }\n  else\n  {\n    Mem mem = x86Context._getVarMem(cv);\n\n    switch (argType.getVarType())\n    {\n      case kX86VarTypeGpd:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n#if defined(ASMJIT_X64)\n          case kX86VarTypeGpq:\n#endif // ASMJIT_X64\n            x86Compiler->emit(kX86InstMov, gpd(dst), mem);\n            return;\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovD, gpd(dst), mem);\n            return;\n        }\n        break;\n\n#if defined(ASMJIT_X64)\n      case kX86VarTypeGpq:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n            x86Compiler->emit(kX86InstMov, gpd(dst), mem);\n            return;\n          case kX86VarTypeGpq:\n            x86Compiler->emit(kX86InstMov, gpq(dst), mem);\n            return;\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, gpq(dst), mem);\n            return;\n        }\n        break;\n#endif // ASMJIT_X64\n\n      case kX86VarTypeMm:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n            x86Compiler->emit(kX86InstMovD, gpd(dst), mem);\n            return;\n#if defined(ASMJIT_X64)\n          case kX86VarTypeGpq:\n            x86Compiler->emit(kX86InstMovQ, gpq(dst), mem);\n            return;\n#endif // ASMJIT_X64\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, mm(dst), mem);\n            return;\n        }\n        break;\n\n      case kX86VarTypeXmm:\n      case kX86VarTypeXmmPS:\n      case kX86VarTypeXmmPD:\n        switch (cv->getType())\n        {\n          case kX86VarTypeGpd:\n            x86Compiler->emit(kX86InstMovD, xmm(dst), mem);\n            return;\n#if defined(ASMJIT_X64)\n          case kX86VarTypeGpq:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), mem);\n            return;\n#endif // ASMJIT_X64\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), mem);\n            return;\n          case kX86VarTypeXmm:\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmPS:\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPD:\n            x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem);\n            return;\n        }\n        break;\n\n      case kX86VarTypeXmmSS:\n        switch (cv->getType())\n        {\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), mem);\n            return;\n\n          case kX86VarTypeXmm:\n            x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem);\n            return;\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmPS:\n            x86Compiler->emit(kX86InstMovSS, xmm(dst), mem);\n            return;\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPD:\n            x86Compiler->emit(kX86InstCvtSD2SS, xmm(dst), mem);\n            return;\n        }\n        break;\n\n      case kX86VarTypeXmmSD:\n        switch (cv->getType())\n        {\n          case kX86VarTypeMm:\n            x86Compiler->emit(kX86InstMovQ, xmm(dst), mem);\n            return;\n\n          case kX86VarTypeXmm:\n            x86Compiler->emit(kX86InstMovDQA, xmm(dst), mem);\n            return;\n          case kX86VarTypeXmmSS:\n          case kX86VarTypeXmmPS:\n            x86Compiler->emit(kX86InstCvtSS2SD, xmm(dst), mem);\n            return;\n          case kX86VarTypeXmmSD:\n          case kX86VarTypeXmmPD:\n            x86Compiler->emit(kX86InstMovSD, xmm(dst), mem);\n            return;\n        }\n        break;\n    }\n  }\n\n  x86Compiler->setError(kErrorIncompatibleArgumentType);\n}\n\n// Prototype & Arguments Management.\nvoid X86CompilerFuncCall::setPrototype(uint32_t callingConvention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount)\n{\n  _x86Decl.setPrototype(callingConvention, returnType, arguments, argumentsCount);\n  _args = reinterpret_cast<Operand*>(\n    getCompiler()->getZoneMemory().alloc(sizeof(Operand) * argumentsCount));\n  memset(_args, 0, sizeof(Operand) * argumentsCount);\n}\n\nbool X86CompilerFuncCall::setArgument(uint32_t i, const Var& var)\n{\n  ASMJIT_ASSERT(i < _x86Decl.getArgumentsCount());\n\n  if (i >= _x86Decl.getArgumentsCount())\n    return false;\n\n  _args[i] = var;\n  return true;\n}\n\nbool X86CompilerFuncCall::setArgument(uint32_t i, const Imm& imm)\n{\n  ASMJIT_ASSERT(i < _x86Decl.getArgumentsCount());\n\n  if (i >= _x86Decl.getArgumentsCount())\n    return false;\n\n  _args[i] = imm;\n  return true;\n}\n\nbool X86CompilerFuncCall::setReturn(const Operand& first, const Operand& second)\n{\n  _ret[0] = first;\n  _ret[1] = second;\n\n  return true;\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compilerfunc.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86COMPILERFUNC_H\n#define _ASMJIT_X86_X86COMPILERFUNC_H\n\n// [Dependencies - AsmJit]\n#include \"../x86/x86assembler.h\"\n#include \"../x86/x86compiler.h\"\n#include \"../x86/x86compileritem.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncDecl]\n// ============================================================================\n\n//! @brief @ref X86Compiler specific function declaration item.\nstruct X86CompilerFuncDecl : public CompilerFuncDecl\n{\n  ASMJIT_NO_COPY(X86CompilerFuncDecl)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerFuncDecl instance.\n  ASMJIT_API X86CompilerFuncDecl(X86Compiler* x86Compiler);\n  //! @brief Destroy the @ref X86CompilerFuncDecl instance.\n  ASMJIT_API virtual ~X86CompilerFuncDecl();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  //! @brief Get function end item as @ref X86CompilerFuncEnd.\n  inline X86CompilerFuncEnd* getEnd() const\n  { return reinterpret_cast<X86CompilerFuncEnd*>(_end); }\n\n  //! @brief Get function declaration as @ref X86FuncDecl.\n  inline X86FuncDecl* getDecl() const\n  { return reinterpret_cast<X86FuncDecl*>(_decl); }\n\n  //! @brief Get function arguments as variables as @ref X86CompilerVar.\n  inline X86CompilerVar** getVars() const\n  { return reinterpret_cast<X86CompilerVar**>(_vars); }\n\n  //! @brief Get function argument at @a index.\n  inline X86CompilerVar* getVar(uint32_t index) const\n  {\n    ASMJIT_ASSERT(index < _x86Decl.getArgumentsCount());\n    return reinterpret_cast<X86CompilerVar**>(_vars)[index];\n  }\n\n  //! @brief Get whether it's assumed that stack is aligned to 16 bytes.\n  inline bool isAssumed16ByteAlignment() const\n  { return hasFuncFlag(kX86FuncFlagAssume16ByteAlignment); }\n\n  //! @brief Get whether it's required to align stack to 16 bytes by function.\n  inline bool isPerformed16ByteAlignment() const\n  { return hasFuncFlag(kX86FuncFlagPerform16ByteAlignment); }\n\n  //! @brief Get whether the ESP is adjusted.\n  inline bool isEspAdjusted() const\n  { return hasFuncFlag(kX86FuncFlagIsEspAdjusted); }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n\n  // --------------------------------------------------------------------------\n  // [Prototype]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void setPrototype(\n    uint32_t convention, \n    uint32_t returnType,\n    const uint32_t* arguments, \n    uint32_t argumentsCount);\n\n  // --------------------------------------------------------------------------\n  // [Helpers]\n  // --------------------------------------------------------------------------\n\n  //! @internal\n  //!\n  //! @brief Get required stack offset needed to subtract/add Esp/Rsp in \n  //! prolog/epilog.\n  inline int32_t _getRequiredStackOffset() const\n  { return _funcCallStackSize + _memStackSize16 + _peMovStackSize + _peAdjustStackSize; }\n\n  //! @brief Create variables from FunctionPrototype declaration. This is just\n  //! parsing what FunctionPrototype generated for current function calling\n  //! convention and arguments.\n  ASMJIT_API void _createVariables();\n\n  //! @brief Prepare variables (ids, names, scope, registers).\n  ASMJIT_API void _prepareVariables(CompilerItem* first);\n\n  //! @brief Allocate variables (setting correct state, changing masks, etc).\n  ASMJIT_API void _allocVariables(CompilerContext& cc);\n\n  ASMJIT_API void _preparePrologEpilog(CompilerContext& cc);\n  ASMJIT_API void _dumpFunction(CompilerContext& cc);\n  ASMJIT_API void _emitProlog(CompilerContext& cc);\n  ASMJIT_API void _emitEpilog(CompilerContext& cc);\n\n  // --------------------------------------------------------------------------\n  // [Function-Call]\n  // --------------------------------------------------------------------------\n\n  //! @brief Reserve stack for calling other function and mark function as\n  //! callee.\n  ASMJIT_API void reserveStackForFunctionCall(int32_t size);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief X86 function decl.\n  X86FuncDecl _x86Decl;\n\n  //! @brief Modified and preserved GP registers mask.\n  uint32_t _gpModifiedAndPreserved;\n  //! @brief Modified and preserved MM registers mask.\n  uint32_t _mmModifiedAndPreserved;\n  //! @brief Modified and preserved XMM registers mask.\n  uint32_t _xmmModifiedAndPreserved;\n\n  //! @brief Id of MovDQWord instruction (@c kX86InstMovDQA or @c kX86InstMovDQU).\n  //!\n  //! The value is based on stack alignment. If it's guaranteed that stack\n  //! is aligned to 16-bytes then @c kX86InstMovDQA instruction is used, otherwise\n  //! the @c kX86InstMovDQU instruction is used for 16-byte mov.\n  uint32_t _movDqInstCode;\n\n  //! @brief Prolog / epilog stack size for PUSH/POP sequences.\n  int32_t _pePushPopStackSize;\n  //! @brief Prolog / epilog stack size for MOV sequences.\n  int32_t _peMovStackSize;\n  //! @brief Prolog / epilog stack adjust size (to make it 16-byte aligned).\n  int32_t _peAdjustStackSize;\n\n  //! @brief Memory stack size (for all variables and temporary memory).\n  int32_t _memStackSize;\n  //! @brief Like @c _memStackSize, but aligned to 16-bytes.\n  int32_t _memStackSize16;\n};\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncEnd]\n// ============================================================================\n\n//! @brief @ref X86Compiler function end item.\nstruct X86CompilerFuncEnd : public CompilerFuncEnd\n{\n  ASMJIT_NO_COPY(X86CompilerFuncEnd)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerFuncEnd instance.\n  ASMJIT_API X86CompilerFuncEnd(X86Compiler* x86Compiler, X86CompilerFuncDecl* func);\n  //! @brief Destroy the @ref X86CompilerFuncEnd instance.\n  ASMJIT_API virtual ~X86CompilerFuncEnd();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  //! @brief Get related function as @ref X86CompilerFuncDecl.\n  inline X86CompilerFuncDecl* getFunc() const\n  { return reinterpret_cast<X86CompilerFuncDecl*>(_func); }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n};\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncRet]\n// ============================================================================\n\n//! @brief Function return.\nstruct X86CompilerFuncRet : public CompilerFuncRet\n{\n  ASMJIT_NO_COPY(X86CompilerFuncRet)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerFuncRet instance.\n  ASMJIT_API X86CompilerFuncRet(X86Compiler* c, X86CompilerFuncDecl* func,\n    const Operand* first, const Operand* second);\n  //! @brief Destroy the @ref X86CompilerFuncRet instance.\n  ASMJIT_API virtual ~X86CompilerFuncRet();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  //! @Brief Get related function as @ref X86CompilerFuncDecl.\n  inline X86CompilerFuncDecl* getFunc() const\n  { return reinterpret_cast<X86CompilerFuncDecl*>(_func); }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n  ASMJIT_API virtual void emit(Assembler& a);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n};\n\n// ============================================================================\n// [AsmJit::X86CompilerFuncCall]\n// ============================================================================\n\n//! @brief Compiler function call item.\nstruct X86CompilerFuncCall : public CompilerFuncCall\n{\n  ASMJIT_NO_COPY(X86CompilerFuncCall)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerFuncCall instance.\n  ASMJIT_API X86CompilerFuncCall(X86Compiler* x86Compiler, X86CompilerFuncDecl* caller, const Operand* target);\n  //! @brief Destroy the @ref X86CompilerFuncCall instance.\n  ASMJIT_API virtual ~X86CompilerFuncCall();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  //! @brief Get caller as @ref X86CompilerFuncDecl.\n  inline X86CompilerFuncDecl* getCaller() const\n  { return reinterpret_cast<X86CompilerFuncDecl*>(_caller); }\n\n  //! @brief Get function prototype.\n  inline const X86FuncDecl* getDecl() const\n  { return reinterpret_cast<X86FuncDecl*>(_decl); }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n  ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v);\n\n  // --------------------------------------------------------------------------\n  // [Prototype]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount);\n\n  //! @brief Set function prototype.\n  inline void setPrototype(uint32_t convention, const FuncPrototype& func)\n  { setPrototype(convention, func.getReturnType(), func.getArguments(), func.getArgumentsCount()); }\n\n  //! @brief Set return value.\n  ASMJIT_API bool setReturn(const Operand& first, const Operand& second = Operand());\n\n  //! @brief Set function argument @a i to @a var.\n  ASMJIT_API bool setArgument(uint32_t i, const Var& var);\n  //! @brief Set function argument @a i to @a imm.\n  ASMJIT_API bool setArgument(uint32_t i, const Imm& imm);\n\n  // --------------------------------------------------------------------------\n  // [Internal]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API uint32_t _findTemporaryGpRegister(CompilerContext& cc);\n  ASMJIT_API uint32_t _findTemporaryXmmRegister(CompilerContext& cc);\n\n  ASMJIT_API X86CompilerVar* _getOverlappingVariable(CompilerContext& cc, const FuncArg& argType) const;\n\n  ASMJIT_API void _moveAllocatedVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType);\n  ASMJIT_API void _moveSpilledVariableToStack(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType,\n    uint32_t temporaryGpReg,\n    uint32_t temporaryXmmReg);\n  ASMJIT_API void _moveSrcVariableToRegister(CompilerContext& cc, X86CompilerVar* vdata, const FuncArg& argType);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief X86 declaration.\n  X86FuncDecl _x86Decl;\n\n  //! @brief Mask of GP registers used as function arguments.\n  uint32_t _gpParams;\n  //! @brief Mask of MM registers used as function arguments.\n  uint32_t _mmParams;\n  //! @brief Mask of XMM registers used as function arguments.\n  uint32_t _xmmParams;\n\n  //! @brief Variables count.\n  uint32_t _variablesCount;\n\n  //! @brief Variables (extracted from operands).\n  VarCallRecord* _variables;\n  //! @brief Argument index to @c VarCallRecord.\n  VarCallRecord* _argumentToVarRecord[kFuncArgsMax];\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_X86COMPILERFUNC_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compileritem.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/intutil.h\"\n#include \"../core/stringutil.h\"\n\n#include \"../x86/x86compiler.h\"\n#include \"../x86/x86compilercontext.h\"\n#include \"../x86/x86compilerfunc.h\"\n#include \"../x86/x86compileritem.h\"\n#include \"../x86/x86util.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::X86CompilerAlign - Construction / Destruction]\n// ============================================================================\n\nX86CompilerAlign::X86CompilerAlign(X86Compiler* x86Compiler, uint32_t size) :\n  CompilerAlign(x86Compiler, size)\n{\n}\n\nX86CompilerAlign::~X86CompilerAlign()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerAlign - Interface]\n// ============================================================================\n\nvoid X86CompilerAlign::emit(Assembler& a)\n{\n  X86Assembler& x86Asm = static_cast<X86Assembler&>(a);\n\n  x86Asm.align(_size);\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerTarget - Construction / Destruction]\n// ============================================================================\n\nX86CompilerTarget::X86CompilerTarget(X86Compiler* c, const Label& label) :\n  CompilerTarget(c, label)\n{\n}\n\nX86CompilerTarget::~X86CompilerTarget()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerTarget - Interface]\n// ============================================================================\n\nstatic X86CompilerTarget* X86CompilerTarget_removeUnreachableItems(X86CompilerTarget* target)\n{\n  CompilerItem* prev = target->getPrev();\n  CompilerItem* item = target->getNext();\n\n  ASMJIT_ASSERT(prev != NULL);\n  ASMJIT_ASSERT(item != NULL);\n\n  for (;;)\n  {\n    CompilerItem* next = item->getNext();\n    ASMJIT_ASSERT(next != NULL);\n\n    if (item->getType() == kCompilerItemTarget)\n      break;\n\n    item->_prev = NULL;\n    item->_next = NULL;\n    item->_isUnreachable = true;\n\n    item = next;\n  }\n\n  target->_prev = NULL;\n  target->_next = NULL;\n  target->_isTranslated = true;\n\n  prev->_next = item;\n  item->_prev = prev;\n\n  return static_cast<X86CompilerTarget*>(item);\n}\n\nvoid X86CompilerTarget::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  _offset = x86Context._currentOffset++;\n}\n\nCompilerItem* X86CompilerTarget::translate(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n\n  // If this X86CompilerTarget was already translated, it's needed to change\n  // the current state and return NULL to tell CompilerContext to process next\n  // untranslated item.\n  if (_isTranslated)\n  {\n    x86Context._restoreState(getState());\n    return NULL;\n  }\n\n  if (x86Context._isUnreachable)\n  {\n    // If the context has \"isUnreachable\" flag set and there is no state then\n    // it means that this code will be never called. This is a problem, because\n    // we are unable to assign a state to current location so we can't allocate\n    // registers for variables used inside. So instead of doing anything wrong\n    // we remove the unreachable code.\n    if (_state == NULL)\n      return X86CompilerTarget_removeUnreachableItems(this);\n\n    // Assign state to the compiler context. \n    x86Context._isUnreachable = 0;\n    x86Context._assignState(getState());\n  }\n  else\n  {\n    _state = x86Context._saveState();\n  }\n\n  return translated();\n}\n\nvoid X86CompilerTarget::emit(Assembler& a)\n{\n  X86Assembler& x86Asm = static_cast<X86Assembler&>(a);\n  x86Asm.bind(_label);\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerHint - Construction / Destruction]\n// ============================================================================\n\nX86CompilerHint::X86CompilerHint(X86Compiler* compiler, X86CompilerVar* var, uint32_t hintId, uint32_t hintValue) :\n  CompilerHint(compiler, var, hintId, hintValue)\n{\n}\n\nX86CompilerHint::~X86CompilerHint()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerHint - Interface]\n// ============================================================================\n\nvoid X86CompilerHint::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86CompilerVar* var = getVar();\n\n  _offset = x86Context._currentOffset;\n\n  // First item (begin of variable scope).\n  if (var->firstItem == NULL)\n    var->firstItem = this;\n\n  // Last item (end of variable scope).\n  CompilerItem* oldLast = var->lastItem;\n  var->lastItem = this;\n\n  switch (_hintId)\n  {\n    case kVarHintAlloc:\n    case kVarHintSpill:\n    case kVarHintSave:\n      if (!x86Context._isActive(var))\n        x86Context._addActive(var);\n      break;\n\n    case kVarHintSaveAndUnuse:\n      if (!x86Context._isActive(var))\n        x86Context._addActive(var);\n      break;\n\n    case kVarHintUnuse:\n      if (oldLast)\n        oldLast->_tryUnuseVar(var);\n      break;\n  }\n}\n\nCompilerItem* X86CompilerHint::translate(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86CompilerVar* var = getVar();\n\n  switch (_hintId)\n  {\n    case kVarHintAlloc:\n      x86Context.allocVar(var, _hintValue, kVarAllocRead);\n      break;\n\n    case kVarHintSpill:\n      if (var->state == kVarStateReg)\n        x86Context.spillVar(var);\n      break;\n\n    case kVarHintSave:\n    case kVarHintSaveAndUnuse:\n      if (var->state == kVarStateReg && var->changed)\n      {\n        x86Context.emitSaveVar(var, var->regIndex);\n        var->changed = false;\n      }\n      if (_hintId == kVarHintSaveAndUnuse)\n        goto _Unuse;\n      break;\n\n    case kVarHintUnuse:\n_Unuse:\n      x86Context.unuseVar(var, kVarStateUnused);\n      goto _End;\n  }\n\n  x86Context._unuseVarOnEndOfScope(this, var);\n\n_End:\n  return translated();\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerHint - Misc]\n// ============================================================================\n\nint X86CompilerHint::getMaxSize() const\n{\n  // Compiler hint is NOP, but it can generate other items which can do \n  // something - in such more items are added into the stream so we don't need\n  // to worry about this.\n  return 0;\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerInst - Construction / Destruction]\n// ============================================================================\n\nX86CompilerInst::X86CompilerInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) :\n  CompilerInst(x86Compiler, code, opData, opCount)\n{\n  uint32_t i;\n\n  _memOp = NULL;\n  _vars = NULL;\n  _variablesCount = 0;\n\n  for (i = 0; i < opCount; i++)\n  {\n    if (_operands[i].isMem())\n    {\n      _memOp = reinterpret_cast<Mem*>(&_operands[i]);\n      break;\n    }\n  }\n\n  const X86InstInfo* info = &x86InstInfo[_code];\n\n  if (info->isSpecial())\n    setInstFlag(kX86CompilerInstFlagIsSpecial);\n  if (info->isFpu())\n    setInstFlag(kX86CompilerInstFlagIsFpu);\n\n  if (isSpecial())\n  {\n    // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN}\n    switch (_code)\n    {\n      case kX86InstCpuId:\n        // Special...\n        break;\n\n      case kX86InstCbw:\n      case kX86InstCdq:\n      case kX86InstCdqe:\n      case kX86InstCwd:\n      case kX86InstCwde:\n      case kX86InstCqo:\n        // Special...\n        break;\n\n      case kX86InstCmpXCHG:\n      case kX86InstCmpXCHG8B:\n#if defined(ASMJIT_X64)\n      case kX86InstCmpXCHG16B:\n#endif // ASMJIT_X64\n        // Special...\n        break;\n\n#if defined(ASMJIT_X86)\n      case kX86InstDaa:\n      case kX86InstDas:\n        // Special...\n        break;\n#endif // ASMJIT_X86\n\n      case kX86InstIMul:\n        switch (_operandsCount)\n        {\n          case 2:\n            // IMUL dst, src is not special instruction.\n            clearInstFlag(kX86CompilerInstFlagIsSpecial);\n            break;\n          case 3:\n            // Only IMUL dst_hi, dst_lo, reg/mem is special, all others don't.\n            if (!(_operands[0].isVar() && _operands[1].isVar() && _operands[2].isVarMem()))\n              clearInstFlag(kX86CompilerInstFlagIsSpecial);\n            break;\n        }\n        break;\n      case kX86InstMul:\n      case kX86InstIDiv:\n      case kX86InstDiv:\n        // Special...\n        break;\n\n      case kX86InstMovPtr:\n        // Special...\n        break;\n\n      case kX86InstLahf:\n      case kX86InstSahf:\n        // Special...\n        break;\n\n      case kX86InstMaskMovQ:\n      case kX86InstMaskMovDQU:\n        // Special...\n        break;\n\n      case kX86InstEnter:\n      case kX86InstLeave:\n        // Special...\n        break;\n\n      case kX86InstRet:\n        // Special...\n        break;\n\n      case kX86InstMonitor:\n      case kX86InstMWait:\n        // Special...\n        break;\n\n      case kX86InstPop:\n      case kX86InstPopAD:\n      case kX86InstPopFD:\n      case kX86InstPopFQ:\n        // Special...\n        break;\n\n      case kX86InstPush:\n      case kX86InstPushAD:\n      case kX86InstPushFD:\n      case kX86InstPushFQ:\n        // Special...\n        break;\n\n      case kX86InstRcl:\n      case kX86InstRcr:\n      case kX86InstRol:\n      case kX86InstRor:\n      case kX86InstSal:\n      case kX86InstSar:\n      case kX86InstShl:\n      case kX86InstShr:\n        // Rot instruction is special only if last operand is variable (register).\n        if (!_operands[1].isVar())\n          clearInstFlag(kX86CompilerInstFlagIsSpecial);\n        break;\n\n      case kX86InstShld:\n      case kX86InstShrd:\n        // Shld/Shrd instruction is special only if last operand is variable (register).\n        if (!_operands[2].isVar())\n          clearInstFlag(kX86CompilerInstFlagIsSpecial);\n        break;\n\n      case kX86InstRdtsc:\n      case kX86InstRdtscP:\n        // Special...\n        break;\n\n      case kX86InstRepLodSB:\n      case kX86InstRepLodSD:\n      case kX86InstRepLodSQ:\n      case kX86InstRepLodSW:\n      case kX86InstRepMovSB:\n      case kX86InstRepMovSD:\n      case kX86InstRepMovSQ:\n      case kX86InstRepMovSW:\n      case kX86InstRepStoSB:\n      case kX86InstRepStoSD:\n      case kX86InstRepStoSQ:\n      case kX86InstRepStoSW:\n      case kX86InstRepECmpSB:\n      case kX86InstRepECmpSD:\n      case kX86InstRepECmpSQ:\n      case kX86InstRepECmpSW:\n      case kX86InstRepEScaSB:\n      case kX86InstRepEScaSD:\n      case kX86InstRepEScaSQ:\n      case kX86InstRepEScaSW:\n      case kX86InstRepNECmpSB:\n      case kX86InstRepNECmpSD:\n      case kX86InstRepNECmpSQ:\n      case kX86InstRepNECmpSW:\n      case kX86InstRepNEScaSB:\n      case kX86InstRepNEScaSD:\n      case kX86InstRepNEScaSQ:\n      case kX86InstRepNEScaSW:\n        // Special...\n        break;\n\n      default:\n        ASMJIT_ASSERT(0);\n    }\n    // ${SPECIAL_INSTRUCTION_HANDLING_END}\n  }\n}\n\nX86CompilerInst::~X86CompilerInst()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerInst - Interface]\n// ============================================================================\n\nvoid X86CompilerInst::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n#define __GET_VARIABLE(__vardata__) \\\n  { \\\n    X86CompilerVar* _candidate = __vardata__; \\\n    \\\n    for (var = cur; ;) \\\n    { \\\n      if (var == _vars) \\\n      { \\\n        var = cur++; \\\n        var->vdata = _candidate; \\\n        var->vflags = 0; \\\n        var->regMask = 0xFFFFFFFF; \\\n        break; \\\n      } \\\n      \\\n      var--; \\\n      \\\n      if (var->vdata == _candidate) \\\n      { \\\n        break; \\\n      } \\\n    } \\\n    \\\n    ASMJIT_ASSERT(var != NULL); \\\n  }\n\n  _offset = x86Context._currentOffset;\n\n  const X86InstInfo* id = &x86InstInfo[_code];\n\n  uint32_t i, len = _operandsCount;\n  uint32_t variablesCount = 0;\n\n  for (i = 0; i < len; i++)\n  {\n    Operand& o = _operands[i];\n\n    if (o.isVar())\n    {\n      ASMJIT_ASSERT(o.getId() != kInvalidValue);\n      X86CompilerVar* vdata = x86Compiler->_getVar(o.getId());\n      ASMJIT_ASSERT(vdata != NULL);\n\n      if (reinterpret_cast<Var*>(&o)->isGpVar())\n      {\n        if (reinterpret_cast<GpVar*>(&o)->isGpbLo()) { setInstFlag(kX86CompilerInstFlagIsGpbLoUsed); vdata->regGpbLoCount++; };\n        if (reinterpret_cast<GpVar*>(&o)->isGpbHi()) { setInstFlag(kX86CompilerInstFlagIsGpbHiUsed); vdata->regGpbHiCount++; };\n      }\n\n      if (vdata->workOffset != _offset)\n      {\n        if (!x86Context._isActive(vdata)) x86Context._addActive(vdata);\n\n        vdata->workOffset = _offset;\n        variablesCount++;\n      }\n    }\n    else if (o.isMem())\n    {\n      if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* vdata = x86Compiler->_getVar(o.getId());\n        ASMJIT_ASSERT(vdata != NULL);\n\n        x86Context._markMemoryUsed(vdata);\n\n        if (vdata->workOffset != _offset)\n        {\n          if (!x86Context._isActive(vdata)) x86Context._addActive(vdata);\n\n          vdata->workOffset = _offset;\n          variablesCount++;\n        }\n      }\n      else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.base);\n        ASMJIT_ASSERT(vdata != NULL);\n\n        if (vdata->workOffset != _offset)\n        {\n          if (!x86Context._isActive(vdata)) x86Context._addActive(vdata);\n\n          vdata->workOffset = _offset;\n          variablesCount++;\n        }\n      }\n\n      if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.index);\n        ASMJIT_ASSERT(vdata != NULL);\n\n        if (vdata->workOffset != _offset)\n        {\n          if (!x86Context._isActive(vdata)) x86Context._addActive(vdata);\n\n          vdata->workOffset = _offset;\n          variablesCount++;\n        }\n      }\n    }\n  }\n\n  if (!variablesCount)\n  {\n    x86Context._currentOffset++;\n    return;\n  }\n\n  _vars = reinterpret_cast<VarAllocRecord*>(x86Compiler->getZoneMemory().alloc(sizeof(VarAllocRecord) * variablesCount));\n  if (_vars == NULL)\n  {\n    x86Compiler->setError(kErrorNoHeapMemory);\n    x86Context._currentOffset++;\n    return;\n  }\n\n  _variablesCount = variablesCount;\n\n  VarAllocRecord* cur = _vars;\n  VarAllocRecord* var = NULL;\n\n  bool _isGpbUsed = hasInstFlag(kX86CompilerInstFlagIsGpbLoUsed) |\n                    hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed) ;\n  uint32_t gpRestrictMask = IntUtil::maskUpToIndex(kX86RegNumGp);\n\n#if defined(ASMJIT_X64)\n  if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed))\n  {\n    gpRestrictMask &= IntUtil::maskFromIndex(kX86RegIndexEax) |\n                      IntUtil::maskFromIndex(kX86RegIndexEbx) |\n                      IntUtil::maskFromIndex(kX86RegIndexEcx) |\n                      IntUtil::maskFromIndex(kX86RegIndexEdx) |\n                      IntUtil::maskFromIndex(kX86RegIndexEbp) |\n                      IntUtil::maskFromIndex(kX86RegIndexEsi) |\n                      IntUtil::maskFromIndex(kX86RegIndexEdi) ;\n  }\n#endif // ASMJIT_X64\n\n  for (i = 0; i < len; i++)\n  {\n    Operand& o = _operands[i];\n\n    if (o.isVar())\n    {\n      X86CompilerVar* vdata = x86Compiler->_getVar(o.getId());\n      ASMJIT_ASSERT(vdata != NULL);\n\n      __GET_VARIABLE(vdata)\n      var->vflags |= kVarAllocRegister;\n\n      if (_isGpbUsed)\n      {\n#if defined(ASMJIT_X86)\n        if (reinterpret_cast<GpVar*>(&o)->isGpb())\n        {\n          var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) |\n                          IntUtil::maskFromIndex(kX86RegIndexEbx) |\n                          IntUtil::maskFromIndex(kX86RegIndexEcx) |\n                          IntUtil::maskFromIndex(kX86RegIndexEdx) ;\n        }\n#else\n        // Restrict all BYTE registers to RAX/RBX/RCX/RDX if HI BYTE register\n        // is used (REX prefix makes HI BYTE addressing unencodable).\n        if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed))\n        {\n          if (reinterpret_cast<GpVar*>(&o)->isGpb())\n          {\n            var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) |\n                            IntUtil::maskFromIndex(kX86RegIndexEbx) |\n                            IntUtil::maskFromIndex(kX86RegIndexEcx) |\n                            IntUtil::maskFromIndex(kX86RegIndexEdx) ;\n          }\n        }\n#endif // ASMJIT_X86/X64\n      }\n\n      if (isSpecial())\n      {\n        // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN}\n        switch (_code)\n        {\n          case kX86InstCpuId:\n            switch (i)\n            {\n              case 0:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 3:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstCbw:\n          case kX86InstCdqe:\n          case kX86InstCwde:\n            switch (i)\n            {\n              case 0:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstCdq:\n          case kX86InstCwd:\n          case kX86InstCqo:\n            switch (i)\n            {\n              case 0:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstCmpXCHG:\n            switch (i)\n            {\n              case 0:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite;\n                break;\n              case 2:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstCmpXCHG8B:\n#if defined(ASMJIT_X64)\n          case kX86InstCmpXCHG16B:\n#endif // ASMJIT_X64\n            switch (i)\n            {\n              case 0:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 3:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n#if defined(ASMJIT_X86)\n          case kX86InstDaa:\n          case kX86InstDas:\n            ASMJIT_ASSERT(i == 0);\n            vdata->regRwCount++;\n            var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n            var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n            gpRestrictMask &= ~var->regMask;\n            break;\n#endif // ASMJIT_X86\n\n          case kX86InstIMul:\n          case kX86InstMul:\n          case kX86InstIDiv:\n          case kX86InstDiv:\n            switch (i)\n            {\n              case 0:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstMovPtr:\n            switch (i)\n            {\n              case 0:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstLahf:\n            ASMJIT_ASSERT(i == 0);\n            vdata->regWriteCount++;\n            var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n            var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n            gpRestrictMask &= ~var->regMask;\n            break;\n\n          case kX86InstSahf:\n            ASMJIT_ASSERT(i == 0);\n            vdata->regReadCount++;\n            var->vflags |= kVarAllocRead | kVarAllocSpecial;\n            var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n            gpRestrictMask &= ~var->regMask;\n            break;\n\n          case kX86InstMaskMovQ:\n          case kX86InstMaskMovDQU:\n            switch (i)\n            {\n              case 0:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n              case 2:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead;\n                break;\n            }\n            break;\n\n          case kX86InstEnter:\n          case kX86InstLeave:\n            // TODO: SPECIAL INSTRUCTION.\n            break;\n\n          case kX86InstRet:\n            // TODO: SPECIAL INSTRUCTION.\n            break;\n\n          case kX86InstMonitor:\n          case kX86InstMWait:\n            // TODO: MONITOR/MWAIT (COMPILER).\n            break;\n\n          case kX86InstPop:\n            // TODO: SPECIAL INSTRUCTION.\n            break;\n\n          case kX86InstPopAD:\n          case kX86InstPopFD:\n          case kX86InstPopFQ:\n            // TODO: SPECIAL INSTRUCTION.\n            break;\n\n          case kX86InstPush:\n            // TODO: SPECIAL INSTRUCTION.\n            break;\n\n          case kX86InstPushAD:\n          case kX86InstPushFD:\n          case kX86InstPushFQ:\n            // TODO: SPECIAL INSTRUCTION.\n            break;\n\n          case kX86InstRcl:\n          case kX86InstRcr:\n          case kX86InstRol:\n          case kX86InstRor:\n          case kX86InstSal:\n          case kX86InstSar:\n          case kX86InstShl:\n          case kX86InstShr:\n            switch (i)\n            {\n              case 0:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstShld:\n          case kX86InstShrd:\n            switch (i)\n            {\n              case 0:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead;\n                break;\n              case 2:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstRdtsc:\n          case kX86InstRdtscP:\n            switch (i)\n            {\n              case 0:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                ASMJIT_ASSERT(_code == kX86InstRdtscP);\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstRepLodSB:\n          case kX86InstRepLodSD:\n          case kX86InstRepLodSQ:\n          case kX86InstRepLodSW:\n            switch (i)\n            {\n              case 0:\n                vdata->regWriteCount++;\n                var->vflags |= kVarAllocWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstRepMovSB:\n          case kX86InstRepMovSD:\n          case kX86InstRepMovSQ:\n          case kX86InstRepMovSW:\n          case kX86InstRepECmpSB:\n          case kX86InstRepECmpSD:\n          case kX86InstRepECmpSQ:\n          case kX86InstRepECmpSW:\n          case kX86InstRepNECmpSB:\n          case kX86InstRepNECmpSD:\n          case kX86InstRepNECmpSQ:\n          case kX86InstRepNECmpSW:\n            switch (i)\n            {\n              case 0:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstRepStoSB:\n          case kX86InstRepStoSD:\n          case kX86InstRepStoSQ:\n          case kX86InstRepStoSW:\n            switch (i)\n            {\n              case 0:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          case kX86InstRepEScaSB:\n          case kX86InstRepEScaSD:\n          case kX86InstRepEScaSQ:\n          case kX86InstRepEScaSW:\n          case kX86InstRepNEScaSB:\n          case kX86InstRepNEScaSD:\n          case kX86InstRepNEScaSQ:\n          case kX86InstRepNEScaSW:\n            switch (i)\n            {\n              case 0:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 1:\n                vdata->regReadCount++;\n                var->vflags |= kVarAllocRead | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              case 2:\n                vdata->regRwCount++;\n                var->vflags |= kVarAllocReadWrite | kVarAllocSpecial;\n                var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx);\n                gpRestrictMask &= ~var->regMask;\n                break;\n              default:\n                ASMJIT_ASSERT(0);\n            }\n            break;\n\n          default:\n            ASMJIT_ASSERT(0);\n        }\n        // ${SPECIAL_INSTRUCTION_HANDLING_END}\n      }\n      else\n      {\n        if (i == 0)\n        {\n          // CMP/TEST instruction.\n          if (id->getCode() == kX86InstCmp || id->getCode() == kX86InstTest)\n          {\n            // Read-only case.\n            vdata->regReadCount++;\n            var->vflags |= kVarAllocRead;\n          }\n          // CVTTSD2SI/CVTTSS2SI instructions.\n          else if (id->getCode() == kX86InstCvttSD2SI || id->getCode() == kX86InstCvttSS2SI)\n          {\n            // In 32-bit mode the whole destination is replaced. In 64-bit mode\n            // we need to check whether the destination operand size is 64-bits.\n#if defined(ASMJIT_X64)\n            if (_operands[0].isRegType(kX86RegTypeGpq))\n            {\n#endif // ASMJIT_X64\n              // Write-only case.\n              vdata->regWriteCount++;\n              var->vflags |= kVarAllocWrite;\n#if defined(ASMJIT_X64)\n            }\n            else\n            {\n              // Read/Write.\n              vdata->regRwCount++;\n              var->vflags |= kVarAllocReadWrite;\n            }\n#endif // ASMJIT_X64\n          }\n          // MOV/MOVSS/MOVSD instructions.\n          //\n          // If instruction is MOV (source replaces the destination) or \n          // MOVSS/MOVSD and source operand is memory location then register\n          // allocator should know that previous destination value is lost \n          // (write only operation).\n          else if ((id->isMov()) ||\n                  ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD) /* && _operands[1].isMem() */) ||\n                  (id->getCode() == kX86InstIMul && _operandsCount == 3 && !isSpecial()))\n          {\n            // Write-only case.\n            vdata->regWriteCount++;\n            var->vflags |= kVarAllocWrite;\n          }\n          else if (id->getCode() == kX86InstLea)\n          {\n            // Write.\n            vdata->regWriteCount++;\n            var->vflags |= kVarAllocWrite;\n          }\n          else\n          {\n            // Read/Write.\n            vdata->regRwCount++;\n            var->vflags |= kVarAllocReadWrite;\n          }\n        }\n        else\n        {\n          // Second, third, ... operands are read-only.\n          vdata->regReadCount++;\n          var->vflags |= kVarAllocRead;\n        }\n\n        if (!_memOp && i < 2 && (id->_opFlags[i] & kX86InstOpMem) != 0)\n        {\n          var->vflags |= kVarAllocMem;\n        }\n      }\n\n      // If variable must be in specific register we could add some hint to allocator.\n      if (var->vflags & kVarAllocSpecial)\n      {\n        vdata->prefRegisterMask |= var->regMask;\n        x86Context._newRegisterHomeIndex(vdata, IntUtil::findFirstBit(var->regMask));\n      }\n    }\n    else if (o.isMem())\n    {\n      if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* vdata = x86Compiler->_getVar(o.getId());\n        ASMJIT_ASSERT(vdata != NULL);\n\n        __GET_VARIABLE(vdata)\n\n        if (i == 0)\n        {\n          // If variable is MOV instruction type (source replaces the destination)\n          // or variable is MOVSS/MOVSD instruction then register allocator should\n          // know that previous destination value is lost (write only operation).\n          if (id->isMov() || ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD)))\n          {\n            // Write only case.\n            vdata->memWriteCount++;\n          }\n          else\n          {\n            vdata->memRwCount++;\n          }\n        }\n        else\n        {\n          vdata->memReadCount++;\n        }\n      }\n      else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast<Mem&>(o).getBase());\n        ASMJIT_ASSERT(vdata != NULL);\n\n        __GET_VARIABLE(vdata)\n        vdata->regReadCount++;\n        var->vflags |= kVarAllocRegister | kVarAllocRead;\n        var->regMask &= gpRestrictMask;\n      }\n\n      if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar)\n      {\n        X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast<Mem&>(o).getIndex());\n        ASMJIT_ASSERT(vdata != NULL);\n\n        __GET_VARIABLE(vdata)\n        vdata->regReadCount++;\n        var->vflags |= kVarAllocRegister | kVarAllocRead;\n        var->regMask &= gpRestrictMask;\n      }\n    }\n  }\n\n  // Traverse all variables and update firstItem / lastItem. This\n  // function is called from iterator that scans items using forward\n  // direction so we can use this knowledge to optimize the process.\n  //\n  // Similar to X86CompilerFuncCall::prepare().\n  for (i = 0; i < _variablesCount; i++)\n  {\n    X86CompilerVar* v = _vars[i].vdata;\n\n    // Update GP register allocator restrictions.\n    if (X86Util::isVarTypeInt(v->getType()))\n    {\n      if (_vars[i].regMask == 0xFFFFFFFF) _vars[i].regMask &= gpRestrictMask;\n    }\n\n    // Update first/last item (begin of variable scope).\n    if (v->firstItem == NULL) v->firstItem = this;\n    v->lastItem = this;\n  }\n\n  // There are some instructions that can be used to clear or to set all bits\n  // in a register:\n  //\n  // - andn reg, reg        ; Set all bits in reg to 0.\n  // - xor/pxor reg, reg    ; Set all bits in reg to 0.\n  // - sub/psub reg, reg    ; Set all bits in reg to 0.\n  // - pcmpgt reg, reg      ; Set all bits in reg to 0.\n  // - pcmpeq reg, reg      ; Set all bits in reg to 1.\n  //\n  // There are also combinations which do nothing:\n  //\n  // - and reg, reg         ; Nop.\n  // - or reg, reg          ; Nop.\n  // - xchg reg, reg        ; Nop.\n\n  if (_variablesCount == 1 && _operandsCount > 1 && _operands[0].isVar() && _operands[1].isVar() && !_memOp)\n  {\n    switch (_code)\n    {\n      // ----------------------------------------------------------------------\n      // [Zeros/Ones]\n      // ----------------------------------------------------------------------\n\n      // ANDN Instructions.\n      case kX86InstPAndN:\n\n      // XOR Instructions.\n      case kX86InstXor:\n      case kX86InstXorPD:\n      case kX86InstXorPS:\n      case kX86InstPXor:\n\n      // SUB Instructions.\n      case kX86InstSub:\n      case kX86InstPSubB:\n      case kX86InstPSubW:\n      case kX86InstPSubD:\n      case kX86InstPSubQ:\n      case kX86InstPSubSB:\n      case kX86InstPSubSW:\n      case kX86InstPSubUSB:\n      case kX86InstPSubUSW:\n\n      // PCMPEQ Instructions.\n      case kX86InstPCmpEqB:\n      case kX86InstPCmpEqW:\n      case kX86InstPCmpEqD:\n      case kX86InstPCmpEqQ:\n\n      // PCMPGT Instructions.\n      case kX86InstPCmpGtB:\n      case kX86InstPCmpGtW:\n      case kX86InstPCmpGtD:\n      case kX86InstPCmpGtQ:\n        // Clear the read flag. This prevents variable alloc/spill.\n        _vars[0].vflags = kVarAllocWrite;\n        _vars[0].vdata->regReadCount--;\n        break;\n\n      // ----------------------------------------------------------------------\n      // [Nop]\n      // ----------------------------------------------------------------------\n\n      // AND Instructions.\n      case kX86InstAnd:\n      case kX86InstAndPD:\n      case kX86InstAndPS:\n      case kX86InstPAnd:\n\n      // OR Instructions.\n      case kX86InstOr:\n      case kX86InstOrPD:\n      case kX86InstOrPS:\n      case kX86InstPOr:\n        \n      // XCHG Instruction.\n      case kX86InstXchg:\n\n        // Clear the write flag.\n        _vars[0].vflags = kVarAllocRead;\n        _vars[0].vdata->regWriteCount--;\n        break;\n    }\n  }\n  x86Context._currentOffset++;\n\n#undef __GET_VARIABLE\n}\n\nCompilerItem* X86CompilerInst::translate(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n  uint32_t i;\n  uint32_t variablesCount = _variablesCount;\n\n  if (variablesCount > 0)\n  {\n    // These variables are used by the instruction and we set current offset\n    // to their work offsets -> getSpillCandidate never return the variable\n    // used this instruction.\n    for (i = 0; i < variablesCount; i++)\n    {\n      _vars[i].vdata->workOffset = x86Context._currentOffset;\n    }\n\n    // Alloc variables used by the instruction (special first).\n    for (i = 0; i < variablesCount; i++)\n    {\n      VarAllocRecord& r = _vars[i];\n      // Alloc variables with specific register first.\n      if ((r.vflags & kVarAllocSpecial) != 0)\n        x86Context.allocVar(r.vdata, r.regMask, r.vflags);\n    }\n\n    for (i = 0; i < variablesCount; i++)\n    {\n      VarAllocRecord& r = _vars[i];\n      // Alloc variables without specific register last.\n      if ((r.vflags & kVarAllocSpecial) == 0)\n        x86Context.allocVar(r.vdata, r.regMask, r.vflags);\n    }\n\n    x86Context.translateOperands(_operands, _operandsCount);\n  }\n\n  if (_memOp && (_memOp->getId() & kOperandIdTypeMask) == kOperandIdTypeVar)\n  {\n    X86CompilerVar* cv = x86Compiler->_getVar(_memOp->getId());\n    ASMJIT_ASSERT(cv != NULL);\n\n    switch (cv->state)\n    {\n      case kVarStateUnused:\n        cv->state = kVarStateMem;\n        break;\n      case kVarStateReg:\n        cv->changed = false;\n        x86Context.unuseVar(cv, kVarStateMem);\n        break;\n    }\n  }\n\n  for (i = 0; i < variablesCount; i++)\n  {\n    x86Context._unuseVarOnEndOfScope(this, &_vars[i]);\n  }\n\n  return translated();\n}\n\nvoid X86CompilerInst::emit(Assembler& a)\n{\n  X86Assembler& x86Asm = static_cast<X86Assembler&>(a);\n\n  x86Asm._inlineComment = _comment;\n  x86Asm._emitOptions = _emitOptions;\n\n  if (isSpecial())\n  {\n    // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN}\n    switch (_code)\n    {\n      case kX86InstCpuId:\n        x86Asm._emitInstruction(_code);\n        return;\n\n      case kX86InstCbw:\n      case kX86InstCdq:\n      case kX86InstCdqe:\n      case kX86InstCwd:\n      case kX86InstCwde:\n      case kX86InstCqo:\n        x86Asm._emitInstruction(_code);\n        return;\n\n      case kX86InstCmpXCHG:\n        x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]);\n        return;\n\n      case kX86InstCmpXCHG8B:\n#if defined(ASMJIT_X64)\n      case kX86InstCmpXCHG16B:\n#endif // ASMJIT_X64\n        x86Asm._emitInstruction(_code, &_operands[4]);\n        return;\n\n#if defined(ASMJIT_X86)\n      case kX86InstDaa:\n      case kX86InstDas:\n        x86Asm._emitInstruction(_code);\n        return;\n#endif // ASMJIT_X86\n\n      case kX86InstIMul:\n      case kX86InstMul:\n      case kX86InstIDiv:\n      case kX86InstDiv:\n        // INST dst_lo (implicit), dst_hi (implicit), src (explicit)\n        ASMJIT_ASSERT(_operandsCount == 3);\n        x86Asm._emitInstruction(_code, &_operands[2]);\n        return;\n\n      case kX86InstMovPtr:\n        break;\n\n      case kX86InstLahf:\n      case kX86InstSahf:\n        x86Asm._emitInstruction(_code);\n        return;\n\n      case kX86InstMaskMovQ:\n      case kX86InstMaskMovDQU:\n        x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]);\n        return;\n\n      case kX86InstEnter:\n      case kX86InstLeave:\n        // TODO: SPECIAL INSTRUCTION.\n        break;\n\n      case kX86InstRet:\n        // TODO: SPECIAL INSTRUCTION.\n        break;\n\n      case kX86InstMonitor:\n      case kX86InstMWait:\n        // TODO: MONITOR/MWAIT (COMPILER).\n        break;\n\n      case kX86InstPop:\n      case kX86InstPopAD:\n      case kX86InstPopFD:\n      case kX86InstPopFQ:\n        // TODO: SPECIAL INSTRUCTION.\n        break;\n\n      case kX86InstPush:\n      case kX86InstPushAD:\n      case kX86InstPushFD:\n      case kX86InstPushFQ:\n        // TODO: SPECIAL INSTRUCTION.\n        break;\n\n      case kX86InstRcl:\n      case kX86InstRcr:\n      case kX86InstRol:\n      case kX86InstRor:\n      case kX86InstSal:\n      case kX86InstSar:\n      case kX86InstShl:\n      case kX86InstShr:\n        x86Asm._emitInstruction(_code, &_operands[0], &cl);\n        return;\n\n      case kX86InstShld:\n      case kX86InstShrd:\n        x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &cl);\n        return;\n\n      case kX86InstRdtsc:\n      case kX86InstRdtscP:\n        x86Asm._emitInstruction(_code);\n        return;\n\n      case kX86InstRepLodSB:\n      case kX86InstRepLodSD:\n      case kX86InstRepLodSQ:\n      case kX86InstRepLodSW:\n      case kX86InstRepMovSB:\n      case kX86InstRepMovSD:\n      case kX86InstRepMovSQ:\n      case kX86InstRepMovSW:\n      case kX86InstRepStoSB:\n      case kX86InstRepStoSD:\n      case kX86InstRepStoSQ:\n      case kX86InstRepStoSW:\n      case kX86InstRepECmpSB:\n      case kX86InstRepECmpSD:\n      case kX86InstRepECmpSQ:\n      case kX86InstRepECmpSW:\n      case kX86InstRepEScaSB:\n      case kX86InstRepEScaSD:\n      case kX86InstRepEScaSQ:\n      case kX86InstRepEScaSW:\n      case kX86InstRepNECmpSB:\n      case kX86InstRepNECmpSD:\n      case kX86InstRepNECmpSQ:\n      case kX86InstRepNECmpSW:\n      case kX86InstRepNEScaSB:\n      case kX86InstRepNEScaSD:\n      case kX86InstRepNEScaSQ:\n      case kX86InstRepNEScaSW:\n        x86Asm._emitInstruction(_code);\n        return;\n\n      default:\n        ASMJIT_ASSERT(0);\n    }\n    // ${SPECIAL_INSTRUCTION_HANDLING_END}\n  }\n\n  switch (_operandsCount)\n  {\n    case 0:\n      x86Asm._emitInstruction(_code);\n      break;\n    case 1:\n      x86Asm._emitInstruction(_code, &_operands[0]);\n      break;\n    case 2:\n      x86Asm._emitInstruction(_code, &_operands[0], &_operands[1]);\n      break;\n    case 3:\n      x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &_operands[2]);\n      break;\n    default:\n      ASMJIT_ASSERT(0);\n      break;\n  }\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerInst - Misc]\n// ============================================================================\n\nint X86CompilerInst::getMaxSize() const\n{\n  // TODO: Instruction max size.\n  return 15;\n}\n\nbool X86CompilerInst::_tryUnuseVar(CompilerVar* _v)\n{\n  X86CompilerVar* cv = static_cast<X86CompilerVar*>(_v);\n\n  for (uint32_t i = 0; i < _variablesCount; i++)\n  {\n    if (_vars[i].vdata == cv)\n    {\n      _vars[i].vflags |= kVarAllocUnuseAfterUse;\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerJmpInst - Construction / Destruction]\n// ============================================================================\n\nX86CompilerJmpInst::X86CompilerJmpInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) :\n  X86CompilerInst(x86Compiler, code, opData, opCount)\n{\n  _jumpTarget = x86Compiler->_getTarget(_operands[0].getId());\n  _jumpTarget->_jumpsCount++;\n\n  _jumpNext = static_cast<X86CompilerJmpInst*>(_jumpTarget->_from);\n  _jumpTarget->_from = this;\n\n  // The 'jmp' is always taken, conditional jump can contain hint, we detect it.\n  if (getCode() == kX86InstJmp)\n    setInstFlag(kX86CompilerInstFlagIsTaken);\n  else if (opCount > 1 && opData[1].isImm() && reinterpret_cast<Imm*>(&opData[1])->getValue() == kCondHintLikely)\n    setInstFlag(kX86CompilerInstFlagIsTaken);\n}\n\nX86CompilerJmpInst::~X86CompilerJmpInst()\n{\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerJmpInst - Interface]\n// ============================================================================\n\nvoid X86CompilerJmpInst::prepare(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  _offset = x86Context._currentOffset;\n\n  // Update _isTaken to true if this is conditional backward jump. This behavior\n  // can be overridden by using kCondHintUnlikely when using the instruction.\n  if (getCode() != kX86InstJmp && _operandsCount == 1 && _jumpTarget->getOffset() < getOffset())\n  {\n    setInstFlag(kX86CompilerInstFlagIsTaken);\n  }\n\n  // Now patch all variables where jump location is in the active range.\n  if (_jumpTarget->getOffset() != kInvalidValue && x86Context._active)\n  {\n    X86CompilerVar* first = static_cast<X86CompilerVar*>(x86Context._active);\n    X86CompilerVar* var = first;\n    uint32_t jumpOffset = _jumpTarget->getOffset();\n\n    do {\n      if (var->firstItem)\n      {\n        ASMJIT_ASSERT(var->lastItem != NULL);\n        uint32_t start = var->firstItem->getOffset();\n        uint32_t end = var->lastItem->getOffset();\n\n        if (jumpOffset >= start && jumpOffset <= end)\n          var->lastItem = this;\n      }\n      var = var->nextActive;\n    } while (var != first);\n  }\n\n  x86Context._currentOffset++;\n}\n\nCompilerItem* X86CompilerJmpInst::translate(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n  // Translate using X86CompilerInst.\n  CompilerItem* ret = X86CompilerInst::translate(cc);\n\n  // We jump with item if its kX86InstJUMP (not based on condiiton) and it\n  // points into yet unknown location.\n  if (_code == kX86InstJmp && !_jumpTarget->isTranslated())\n  {\n    x86Context.addBackwardCode(this);\n    ret = _jumpTarget;\n  }\n  else\n  {\n    _state = x86Context._saveState();\n    if (_jumpTarget->isTranslated())\n    {\n      doJump(cc);\n    }\n    else\n    {\n      // State is not known, so we need to call doJump() later. Compiler will\n      // do it for us.\n      x86Context.addForwardJump(this);\n      _jumpTarget->_state = _state;\n    }\n\n    // Mark next code as unreachable, cleared by a next label (CompilerTarget).\n    if (_code == kX86InstJmp)\n      x86Context._isUnreachable = 1;\n  }\n\n  // Need to traverse over all active variables and unuse them if their scope ends\n  // here. \n  if (x86Context._active)\n  {\n    X86CompilerVar* first = static_cast<X86CompilerVar*>(x86Context._active);\n    X86CompilerVar* var = first;\n\n    do {\n      x86Context._unuseVarOnEndOfScope(this, var);\n      var = var->nextActive;\n    } while (var != first);\n  }\n\n  return ret;\n}\n\nvoid X86CompilerJmpInst::emit(Assembler& a)\n{\n  static const uint MAXIMUM_SHORT_JMP_SIZE = 127;\n\n  // Try to minimize size of jump using SHORT jump (8-bit displacement) by \n  // traversing into the target and calculating the maximum code size. We\n  // end when code size reaches MAXIMUM_SHORT_JMP_SIZE.\n  if (!(_emitOptions & kX86EmitOptionShortJump) && getJumpTarget()->getOffset() > getOffset())\n  {\n    // Calculate the code size.\n    uint codeSize = 0;\n    CompilerItem* cur = this->getNext();\n    CompilerItem* target = getJumpTarget();\n\n    while (cur)\n    {\n      if (cur == target)\n      {\n        // Target found, we can tell assembler to generate short form of jump.\n        _emitOptions |= kX86EmitOptionShortJump;\n        goto _End;\n      }\n\n      int s = cur->getMaxSize();\n      if (s == -1) break;\n\n      codeSize += (uint)s;\n      if (codeSize > MAXIMUM_SHORT_JMP_SIZE) break;\n\n      cur = cur->getNext();\n    }\n  }\n\n_End:\n  X86CompilerInst::emit(a);\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerJmpInst - DoJump]\n// ============================================================================\n\nvoid X86CompilerJmpInst::doJump(CompilerContext& cc)\n{\n  X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc);\n  X86Compiler* x86Compiler = getCompiler();\n\n  // The state have to be already known. The doJump() method is called by\n  // translate() or by Compiler in case that it's forward jump.\n  ASMJIT_ASSERT(_jumpTarget->getState());\n\n  if (getCode() == kX86InstJmp || (isTaken() && _jumpTarget->getOffset() < getOffset()))\n  {\n    // Instruction type is JMP or conditional jump that should be taken (likely).\n    // We can set state here instead of jumping out, setting state and jumping\n    // to _jumpTarget.\n    //\n    // NOTE: We can't use this technique if instruction is forward conditional\n    // jump. The reason is that when generating code we can't change state here,\n    // because the next instruction depends on it.\n    x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset());\n  }\n  else\n  {\n    // Instruction type is JMP or conditional jump that should be not normally\n    // taken. If we need add code that will switch between different states we\n    // add it after the end of function body (after epilog, using 'ExtraBlock').\n    CompilerItem* ext = x86Context.getExtraBlock();\n    CompilerItem* old = x86Compiler->setCurrentItem(ext);\n\n    x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset());\n\n    if (x86Compiler->getCurrentItem() != ext)\n    {\n      // Add the jump to the target.\n      x86Compiler->jmp(_jumpTarget->_label);\n      ext = x86Compiler->getCurrentItem();\n\n      // The x86Context._restoreState() method emitted some instructions so we need to\n      // patch the jump.\n      Label L = x86Compiler->newLabel();\n      x86Compiler->setCurrentItem(x86Context.getExtraBlock());\n      x86Compiler->bind(L);\n\n      // Finally, patch the jump target.\n      ASMJIT_ASSERT(_operandsCount > 0);\n      _operands[0] = L;                                 // Operand part (Label).\n      _jumpTarget = x86Compiler->_getTarget(L.getId()); // Compiler part (CompilerTarget).\n    }\n\n    x86Context.setExtraBlock(ext);\n    x86Compiler->setCurrentItem(old);\n\n    // Assign state back.\n    x86Context._assignState(static_cast<X86CompilerState*>(_state));\n  }\n}\n\n// ============================================================================\n// [AsmJit::X86CompilerJmpInst - GetJumpTarget]\n// ============================================================================\n\nCompilerTarget* X86CompilerJmpInst::getJumpTarget() const\n{\n  return _jumpTarget;\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86compileritem.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86COMPILERITEM_H\n#define _ASMJIT_X86_X86COMPILERITEM_H\n\n// [Dependencies - AsmJit]\n#include \"../x86/x86assembler.h\"\n#include \"../x86/x86compiler.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::X86CompilerAlign]\n// ============================================================================\n\n//! @brief Compiler align item.\nstruct X86CompilerAlign : public CompilerAlign\n{\n  ASMJIT_NO_COPY(X86CompilerAlign)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref CompilerAlign instance.\n  ASMJIT_API X86CompilerAlign(X86Compiler* x86Compiler, uint32_t size = 0);\n  //! @brief Destroy the @ref CompilerAlign instance.\n  ASMJIT_API virtual ~X86CompilerAlign();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void emit(Assembler& a);\n};\n\n// ============================================================================\n// [AsmJit::X86CompilerHint]\n// ============================================================================\n\n//! @brief @ref X86Compiler variable hint item.\nstruct X86CompilerHint : public CompilerHint\n{\n  ASMJIT_NO_COPY(X86CompilerHint)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerHint instance.\n  ASMJIT_API X86CompilerHint(X86Compiler* compiler, X86CompilerVar* var, uint32_t hintId, uint32_t hintValue);\n  //! @brief Destroy the @ref X86CompilerHint instance.\n  ASMJIT_API virtual ~X86CompilerHint();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get variable as @ref X86CompilerVar.\n  inline X86CompilerVar* getVar() const\n  { return reinterpret_cast<X86CompilerVar*>(_var); }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n};\n\n// ============================================================================\n// [AsmJit::X86CompilerTarget]\n// ============================================================================\n\n//! @brief X86Compiler target item.\nstruct X86CompilerTarget : public CompilerTarget\n{\n  ASMJIT_NO_COPY(X86CompilerTarget)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerTarget instance.\n  ASMJIT_API X86CompilerTarget(X86Compiler* x86Compiler, const Label& target);\n  //! @brief Destroy the @ref X86CompilerTarget instance.\n  ASMJIT_API virtual ~X86CompilerTarget();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  //! @brief Get state as @ref X86CompilerState.\n  inline X86CompilerState* getState() const\n  { return reinterpret_cast<X86CompilerState*>(_state); }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n  ASMJIT_API virtual void emit(Assembler& a);\n};\n\n// ============================================================================\n// [AsmJit::X86CompilerInst]\n// ============================================================================\n\n//! @brief @ref X86Compiler instruction item.\nstruct X86CompilerInst : public CompilerInst\n{\n  ASMJIT_NO_COPY(X86CompilerInst)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref X86CompilerInst instance.\n  ASMJIT_API X86CompilerInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount);\n  //! @brief Destroy the @ref X86CompilerInst instance.\n  ASMJIT_API virtual ~X86CompilerInst();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get compiler as @ref X86Compiler.\n  inline X86Compiler* getCompiler() const\n  { return reinterpret_cast<X86Compiler*>(_compiler); }\n\n  //! @brief Get whether the instruction is special.\n  inline bool isSpecial() const\n  { return (_instFlags & kX86CompilerInstFlagIsSpecial) != 0; }\n\n  //! @brief Get whether the instruction is FPU.\n  inline bool isFpu() const\n  { return (_instFlags & kX86CompilerInstFlagIsFpu) != 0; }\n\n  //! @brief Get whether the instruction is used with GpbLo register.\n  inline bool isGpbLoUsed() const\n  { return (_instFlags & kX86CompilerInstFlagIsGpbLoUsed) != 0; }\n\n  //! @brief Get whether the instruction is used with GpbHi register.\n  inline bool isGpbHiUsed() const\n  { return (_instFlags & kX86CompilerInstFlagIsGpbHiUsed) != 0; }\n\n  //! @brief Get memory operand.\n  inline Mem* getMemOp()\n  { return _memOp; }\n\n  //! @brief Set memory operand.\n  inline void setMemOp(Mem* memOp)\n  { _memOp = memOp; }\n\n  //! @brief Get operands array (3 operands total).\n  inline VarAllocRecord* getVars()\n  { return _vars; }\n\n  //! @brief Get operands array (3 operands total).\n  inline const VarAllocRecord* getVars() const\n  { return _vars; }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n  ASMJIT_API virtual void emit(Assembler& a);\n\n  // --------------------------------------------------------------------------\n  // [Misc]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual int getMaxSize() const;\n  ASMJIT_API virtual bool _tryUnuseVar(CompilerVar* v);\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Memory operand or NULL.\n  Mem* _memOp;\n  //! @brief Variables (extracted from operands).\n  VarAllocRecord* _vars;\n};\n\n// ============================================================================\n// [AsmJit::X86CompilerJmpInst]\n// ============================================================================\n\n//! @brief @ref X86Compiler \"jmp\" instruction item.\nstruct X86CompilerJmpInst : public X86CompilerInst\n{\n  ASMJIT_NO_COPY(X86CompilerJmpInst)\n\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API X86CompilerJmpInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount);\n  ASMJIT_API virtual ~X86CompilerJmpInst();\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  inline X86CompilerJmpInst* getJumpNext() const\n  { return _jumpNext; }\n  \n  inline bool isTaken() const\n  { return (_instFlags & kX86CompilerInstFlagIsTaken) != 0; }\n\n  // --------------------------------------------------------------------------\n  // [Interface]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual void prepare(CompilerContext& cc);\n  ASMJIT_API virtual CompilerItem* translate(CompilerContext& cc);\n  ASMJIT_API virtual void emit(Assembler& a);\n\n  // --------------------------------------------------------------------------\n  // [DoJump]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API void doJump(CompilerContext& cc);\n\n  // --------------------------------------------------------------------------\n  // [Jump]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API virtual CompilerTarget* getJumpTarget() const;\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Jump target.\n  X86CompilerTarget* _jumpTarget;\n  //! @brief Next jump to the same target in a single linked list.\n  X86CompilerJmpInst *_jumpNext;\n  //! @brief State associated with the jump.\n  X86CompilerState* _state;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_X86COMPILERITEM_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86cpuinfo.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../x86/x86cpuinfo.h\"\n#include \"../x86/x86defs.h\"\n\n// 2009-02-05: Thanks to Mike Tajmajer for VC7.1 compiler support. It shouldn't\n// affect x64 compilation, because x64 compiler starts with VS2005 (VC8.0).\n#if defined(_MSC_VER)\n# if _MSC_VER >= 1400\n#  include <intrin.h>\n# endif // _MSC_VER >= 1400 (>= VS2005)\n#endif // _MSC_VER\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::X86CpuVendor]\n// ============================================================================\n\nstruct X86CpuVendor\n{\n  uint32_t id;\n  char text[12];\n};\n\nstatic const X86CpuVendor x86CpuVendor[] = \n{\n  { kCpuIntel    , { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' } },\n\n  { kCpuAmd      , { 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' } },\n  { kCpuAmd      , { 'A', 'M', 'D', 'i', 's', 'b', 'e', 't', 't', 'e', 'r', '!' } },\n\n  { kCpuNSM      , { 'G', 'e', 'o', 'd', 'e', ' ', 'b', 'y', ' ', 'N', 'S', 'C' } },\n  { kCpuNSM      , { 'C', 'y', 'r', 'i', 'x', 'I', 'n', 's', 't', 'e', 'a', 'd' } },\n\n  { kCpuTransmeta, { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'T', 'M', 'x', '8', '6' } },\n  { kCpuTransmeta, { 'T', 'r', 'a', 'n', 's', 'm', 'e', 't', 'a', 'C', 'P', 'U' } },\n\n  { kCpuVia      , { 'V', 'I', 'A',  0 , 'V', 'I', 'A',  0 , 'V', 'I', 'A',  0  } },\n  { kCpuVia      , { 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' } }\n};\n\nstatic inline bool x86CpuVendorEq(const X86CpuVendor& info, const char* vendorString)\n{\n  const uint32_t* a = reinterpret_cast<const uint32_t*>(info.text);\n  const uint32_t* b = reinterpret_cast<const uint32_t*>(vendorString);\n\n  return (a[0] == b[0]) &\n         (a[1] == b[1]) &\n         (a[2] == b[2]) ;\n}\n\n// ============================================================================\n// [AsmJit::x86CpuSimplifyBrandString]\n// ============================================================================\n\nstatic inline void x86CpuSimplifyBrandString(char* s)\n{\n  // Always clear the current character in the buffer. This ensures that there\n  // is no garbage after the string NULL terminator.\n  char* d = s;\n\n  char prev = 0;\n  char curr = s[0];\n  s[0] = '\\0';\n\n  for (;;)\n  {\n    if (curr == 0) break;\n\n    if (curr == ' ')\n    {\n      if (prev == '@') goto _Skip;\n      if (s[1] == ' ' || s[1] == '@') goto _Skip;\n    }\n\n    d[0] = curr;\n    d++;\n    prev = curr;\n\n_Skip:\n    curr = *++s;\n    s[0] = '\\0';\n  }\n\n  d[0] = '\\0';\n}\n\n// ============================================================================\n// [AsmJit::x86CpuId]\n// ============================================================================\n\n// This is messy, I know. cpuid is implemented as intrinsic in VS2005, but\n// we should support other compilers as well. Main problem is that MS compilers\n// in 64-bit mode not allows to use inline assembler, so we need intrinsic and\n// we need also asm version.\n\n// x86CpuId() and detectCpuInfo() for x86 and x64 platforms begins here.\n#if defined(ASMJIT_X86) || defined(ASMJIT_X64)\nvoid x86CpuId(uint32_t in, X86CpuId* out)\n{\n#if defined(_MSC_VER)\n\n// 2009-02-05: Thanks to Mike Tajmajer for supporting VC7.1 compiler.\n// ASMJIT_X64 is here only for readibility, only VS2005 can compile 64-bit code.\n# if _MSC_VER >= 1400 || defined(ASMJIT_X64)\n  // Done by intrinsics.\n  __cpuid(reinterpret_cast<int*>(out->i), in);\n# else // _MSC_VER < 1400\n  uint32_t cpuid_in = in;\n  uint32_t* cpuid_out = out->i;\n\n  __asm\n  {\n    mov     eax, cpuid_in\n    mov     edi, cpuid_out\n    cpuid\n    mov     dword ptr[edi +  0], eax\n    mov     dword ptr[edi +  4], ebx\n    mov     dword ptr[edi +  8], ecx\n    mov     dword ptr[edi + 12], edx\n  }\n# endif // _MSC_VER < 1400\n\n#elif defined(__GNUC__)\n\n// Note, need to preserve ebx/rbx register!\n# if defined(ASMJIT_X86)\n#  define __myCpuId(a, b, c, d, inp) \\\n  asm (\"mov %%ebx, %%edi\\n\"    \\\n       \"cpuid\\n\"               \\\n       \"xchg %%edi, %%ebx\\n\"   \\\n       : \"=a\" (a), \"=D\" (b), \"=c\" (c), \"=d\" (d) : \"a\" (inp))\n# else\n#  define __myCpuId(a, b, c, d, inp) \\\n  asm (\"mov %%rbx, %%rdi\\n\"    \\\n       \"cpuid\\n\"               \\\n       \"xchg %%rdi, %%rbx\\n\"   \\\n       : \"=a\" (a), \"=D\" (b), \"=c\" (c), \"=d\" (d) : \"a\" (inp))\n# endif\n  __myCpuId(out->eax, out->ebx, out->ecx, out->edx, in);\n\n#endif // Compiler #ifdef.\n}\n\n// ============================================================================\n// [AsmJit::x86CpuDetect]\n// ============================================================================\n\nvoid x86CpuDetect(X86CpuInfo* out)\n{\n  uint32_t i;\n  X86CpuId regs;\n\n  // Clear everything except the '_size' member.\n  memset(reinterpret_cast<uint8_t*>(out) + sizeof(uint32_t),\n    0, sizeof(CpuInfo) - sizeof(uint32_t));\n\n  // Fill safe defaults.\n  memcpy(out->_vendorString, \"Unknown\", 8);\n  out->_numberOfProcessors = CpuInfo::detectNumberOfProcessors();\n\n  // Get vendor string/id.\n  x86CpuId(0, &regs);\n\n  memcpy(out->_vendorString, &regs.ebx, 4);\n  memcpy(out->_vendorString + 4, &regs.edx, 4);\n  memcpy(out->_vendorString + 8, &regs.ecx, 4);\n\n  for (i = 0; i < 3; i++)\n  {\n    if (x86CpuVendorEq(x86CpuVendor[i], out->_vendorString))\n    {\n      out->_vendorId = x86CpuVendor[i].id;\n      break;\n    }\n  }\n\n  // Get feature flags in ecx/edx, and family/model in eax.\n  x86CpuId(1, &regs);\n\n  // Fill family and model fields.\n  out->_family   = (regs.eax >> 8) & 0x0F;\n  out->_model    = (regs.eax >> 4) & 0x0F;\n  out->_stepping = (regs.eax     ) & 0x0F;\n\n  // Use extended family and model fields.\n  if (out->_family == 0x0F)\n  {\n    out->_family += ((regs.eax >> 20) & 0xFF);\n    out->_model  += ((regs.eax >> 16) & 0x0F) << 4;\n  }\n\n  out->_processorType        = ((regs.eax >> 12) & 0x03);\n  out->_brandIndex           = ((regs.ebx      ) & 0xFF);\n  out->_flushCacheLineSize   = ((regs.ebx >>  8) & 0xFF) * 8;\n  out->_maxLogicalProcessors = ((regs.ebx >> 16) & 0xFF);\n  out->_apicPhysicalId       = ((regs.ebx >> 24) & 0xFF);\n\n  if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureSse3;\n  if (regs.ecx & 0x00000002U) out->_features |= kX86FeaturePclMulDQ;\n  if (regs.ecx & 0x00000008U) out->_features |= kX86FeatureMonitorMWait;\n  if (regs.ecx & 0x00000200U) out->_features |= kX86FeatureSsse3;\n  if (regs.ecx & 0x00002000U) out->_features |= kX86FeatureCmpXchg16B;\n  if (regs.ecx & 0x00080000U) out->_features |= kX86FeatureSse41;\n  if (regs.ecx & 0x00100000U) out->_features |= kX86FeatureSse42;\n  if (regs.ecx & 0x00400000U) out->_features |= kX86FeatureMovBE;\n  if (regs.ecx & 0x00800000U) out->_features |= kX86FeaturePopCnt;\n  if (regs.ecx & 0x10000000U) out->_features |= kX86FeatureAvx;\n\n  if (regs.edx & 0x00000010U) out->_features |= kX86FeatureRdtsc;\n  if (regs.edx & 0x00000100U) out->_features |= kX86FeatureCmpXchg8B;\n  if (regs.edx & 0x00008000U) out->_features |= kX86FeatureCMov;\n  if (regs.edx & 0x00800000U) out->_features |= kX86FeatureMmx;\n  if (regs.edx & 0x01000000U) out->_features |= kX86FeatureFXSR;\n  if (regs.edx & 0x02000000U) out->_features |= kX86FeatureSse | kX86FeatureMmxExt;\n  if (regs.edx & 0x04000000U) out->_features |= kX86FeatureSse | kX86FeatureSse2;\n  if (regs.edx & 0x10000000U) out->_features |= kX86FeatureMultiThreading;\n\n  if (out->_vendorId == kCpuAmd && (regs.edx & 0x10000000U))\n  {\n    // AMD sets Multithreading to ON if it has more cores.\n    if (out->_numberOfProcessors == 1) out->_numberOfProcessors = 2;\n  }\n\n  // This comment comes from V8 and I think that its important:\n  //\n  // Opteron Rev E has i bug in which on very rare occasions i locked\n  // instruction doesn't act as i read-acquire barrier if followed by i\n  // non-locked read-modify-write instruction.  Rev F has this bug in \n  // pre-release versions, but not in versions released to customers,\n  // so we test only for Rev E, which is family 15, model 32..63 inclusive.\n\n  if (out->_vendorId == kCpuAmd && out->_family == 15 && out->_model >= 32 && out->_model <= 63) \n  {\n    out->_bugs |= kX86BugAmdLockMB;\n  }\n\n  // Calling cpuid with 0x80000000 as the in argument\n  // gets the number of valid extended IDs.\n\n  x86CpuId(0x80000000, &regs);\n\n  uint32_t exIds = regs.eax;\n  if (exIds > 0x80000004) exIds = 0x80000004;\n\n  uint32_t* brand = reinterpret_cast<uint32_t*>(out->_brandString);\n\n  for (i = 0x80000001; i <= exIds; i++)\n  {\n    x86CpuId(i, &regs);\n\n    switch (i)\n    {\n      case 0x80000001:\n        if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureLahfSahf;\n        if (regs.ecx & 0x00000020U) out->_features |= kX86FeatureLzCnt;\n        if (regs.ecx & 0x00000040U) out->_features |= kX86FeatureSse4A;\n        if (regs.ecx & 0x00000080U) out->_features |= kX86FeatureMSse;\n        if (regs.ecx & 0x00000100U) out->_features |= kX86FeaturePrefetch;\n\n        if (regs.edx & 0x00100000U) out->_features |= kX86FeatureExecuteDisableBit;\n        if (regs.edx & 0x00200000U) out->_features |= kX86FeatureFFXSR;\n        if (regs.edx & 0x00400000U) out->_features |= kX86FeatureMmxExt;\n        if (regs.edx & 0x08000000U) out->_features |= kX86FeatureRdtscP;\n        if (regs.edx & 0x20000000U) out->_features |= kX86Feature64Bit;\n        if (regs.edx & 0x40000000U) out->_features |= kX86Feature3dNowExt | kX86FeatureMmxExt;\n        if (regs.edx & 0x80000000U) out->_features |= kX86Feature3dNow;\n        break;\n\n      case 0x80000002:\n      case 0x80000003:\n      case 0x80000004:\n        *brand++ = regs.eax;\n        *brand++ = regs.ebx;\n        *brand++ = regs.ecx;\n        *brand++ = regs.edx;\n        break;\n\n      default:\n        // Additional features can be detected in the future.\n        break;\n    }\n  }\n\n  // Simplify the brand string (remove unnecessary spaces to make it printable).\n  x86CpuSimplifyBrandString(out->_brandString);\n}\n#endif\n\n} // AsmJit\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86cpuinfo.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86CPUINFO_H\n#define _ASMJIT_X86_X86CPUINFO_H\n\n// [Dependencies - AsmJit]\n#include \"../core/cpuinfo.h\"\n#include \"../core/defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::X86CpuId]\n// ============================================================================\n\n//! @brief X86 CpuId output.\nunion X86CpuId\n{\n  //! @brief EAX/EBX/ECX/EDX output.\n  uint32_t i[4];\n\n  struct\n  {\n    //! @brief EAX output.\n    uint32_t eax;\n    //! @brief EBX output.\n    uint32_t ebx;\n    //! @brief ECX output.\n    uint32_t ecx;\n    //! @brief EDX output.\n    uint32_t edx;\n  };\n};\n\n// ============================================================================\n// [AsmJit::X86CpuInfo]\n// ============================================================================\n\nstruct X86CpuInfo : public CpuInfo\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline X86CpuInfo(uint32_t size = sizeof(X86CpuInfo)) :\n    CpuInfo(size)\n  {\n  }\n\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get processor type.\n  inline uint32_t getProcessorType() const { return _processorType; }\n  //! @brief Get brand index.\n  inline uint32_t getBrandIndex() const { return _brandIndex; }\n  //! @brief Get flush cache line size.\n  inline uint32_t getFlushCacheLineSize() const { return _flushCacheLineSize; }\n  //! @brief Get maximum logical processors count.\n  inline uint32_t getMaxLogicalProcessors() const { return _maxLogicalProcessors; }\n  //! @brief Get APIC physical ID.\n  inline uint32_t getApicPhysicalId() const { return _apicPhysicalId; }\n\n  // --------------------------------------------------------------------------\n  // [Statics]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get global instance of @ref X86CpuInfo.\n  static inline const X86CpuInfo* getGlobal()\n  { return static_cast<const X86CpuInfo*>(CpuInfo::getGlobal()); }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Processor type.\n  uint32_t _processorType;\n  //! @brief Brand index.\n  uint32_t _brandIndex;\n  //! @brief Flush cache line size in bytes.\n  uint32_t _flushCacheLineSize;\n  //! @brief Maximum number of addressable IDs for logical processors.\n  uint32_t _maxLogicalProcessors;\n  //! @brief Initial APIC ID.\n  uint32_t _apicPhysicalId;\n};\n\n// ============================================================================\n// [AsmJit::x86CpuId]\n// ============================================================================\n\n#if defined(ASMJIT_X86) || defined(ASMJIT_X64)\n//! @brief Calls CPUID instruction with eax == @a in and stores output to @a out.\n//!\n//! @c cpuid() function has one input parameter that is passed to cpuid through \n//! eax register and results in four output values representing result of cpuid \n//! instruction (eax, ebx, ecx and edx registers).\nASMJIT_API void x86CpuId(uint32_t in, X86CpuId* out);\n\n// ============================================================================\n// [AsmJit::x86CpuDetect]\n// ============================================================================\n\n//! @brief Detect CPU features to CpuInfo structure @a out.\n//!\n//! @sa @c CpuInfo.\nASMJIT_API void x86CpuDetect(X86CpuInfo* out);\n#endif // ASMJIT_X86 || ASMJIT_X64\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_X86CPUINFO_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86defs.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../x86/x86defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::x86InstName]\n// ============================================================================\n\n// Following {DATA SECTION} is auto-generated by generate-defs.py tool using\n// X86InstInfo data.\n//\n// ${X86_INST_DATA:BEGIN}\nconst char x86InstName[] =\n  \"\\0\"\n  \"adc\\0\"\n  \"add\\0\"\n  \"addpd\\0\"\n  \"addps\\0\"\n  \"addsd\\0\"\n  \"addss\\0\"\n  \"addsubpd\\0\"\n  \"addsubps\\0\"\n  \"amd_prefetch\\0\"\n  \"amd_prefetchw\\0\"\n  \"and\\0\"\n  \"andnpd\\0\"\n  \"andnps\\0\"\n  \"andpd\\0\"\n  \"andps\\0\"\n  \"blendpd\\0\"\n  \"blendps\\0\"\n  \"blendvpd\\0\"\n  \"blendvps\\0\"\n  \"bsf\\0\"\n  \"bsr\\0\"\n  \"bswap\\0\"\n  \"bt\\0\"\n  \"btc\\0\"\n  \"btr\\0\"\n  \"bts\\0\"\n  \"call\\0\"\n  \"cbw\\0\"\n  \"cdq\\0\"\n  \"cdqe\\0\"\n  \"clc\\0\"\n  \"cld\\0\"\n  \"clflush\\0\"\n  \"cmc\\0\"\n  \"cmova\\0\"\n  \"cmovae\\0\"\n  \"cmovb\\0\"\n  \"cmovbe\\0\"\n  \"cmovc\\0\"\n  \"cmove\\0\"\n  \"cmovg\\0\"\n  \"cmovge\\0\"\n  \"cmovl\\0\"\n  \"cmovle\\0\"\n  \"cmovna\\0\"\n  \"cmovnae\\0\"\n  \"cmovnb\\0\"\n  \"cmovnbe\\0\"\n  \"cmovnc\\0\"\n  \"cmovne\\0\"\n  \"cmovng\\0\"\n  \"cmovnge\\0\"\n  \"cmovnl\\0\"\n  \"cmovnle\\0\"\n  \"cmovno\\0\"\n  \"cmovnp\\0\"\n  \"cmovns\\0\"\n  \"cmovnz\\0\"\n  \"cmovo\\0\"\n  \"cmovp\\0\"\n  \"cmovpe\\0\"\n  \"cmovpo\\0\"\n  \"cmovs\\0\"\n  \"cmovz\\0\"\n  \"cmp\\0\"\n  \"cmppd\\0\"\n  \"cmpps\\0\"\n  \"cmpsd\\0\"\n  \"cmpss\\0\"\n  \"cmpxchg\\0\"\n  \"cmpxchg16b\\0\"\n  \"cmpxchg8b\\0\"\n  \"comisd\\0\"\n  \"comiss\\0\"\n  \"cpuid\\0\"\n  \"cqo\\0\"\n  \"crc32\\0\"\n  \"cvtdq2pd\\0\"\n  \"cvtdq2ps\\0\"\n  \"cvtpd2dq\\0\"\n  \"cvtpd2pi\\0\"\n  \"cvtpd2ps\\0\"\n  \"cvtpi2pd\\0\"\n  \"cvtpi2ps\\0\"\n  \"cvtps2dq\\0\"\n  \"cvtps2pd\\0\"\n  \"cvtps2pi\\0\"\n  \"cvtsd2si\\0\"\n  \"cvtsd2ss\\0\"\n  \"cvtsi2sd\\0\"\n  \"cvtsi2ss\\0\"\n  \"cvtss2sd\\0\"\n  \"cvtss2si\\0\"\n  \"cvttpd2dq\\0\"\n  \"cvttpd2pi\\0\"\n  \"cvttps2dq\\0\"\n  \"cvttps2pi\\0\"\n  \"cvttsd2si\\0\"\n  \"cvttss2si\\0\"\n  \"cwd\\0\"\n  \"cwde\\0\"\n  \"daa\\0\"\n  \"das\\0\"\n  \"dec\\0\"\n  \"div\\0\"\n  \"divpd\\0\"\n  \"divps\\0\"\n  \"divsd\\0\"\n  \"divss\\0\"\n  \"dppd\\0\"\n  \"dpps\\0\"\n  \"emms\\0\"\n  \"enter\\0\"\n  \"extractps\\0\"\n  \"f2xm1\\0\"\n  \"fabs\\0\"\n  \"fadd\\0\"\n  \"faddp\\0\"\n  \"fbld\\0\"\n  \"fbstp\\0\"\n  \"fchs\\0\"\n  \"fclex\\0\"\n  \"fcmovb\\0\"\n  \"fcmovbe\\0\"\n  \"fcmove\\0\"\n  \"fcmovnb\\0\"\n  \"fcmovnbe\\0\"\n  \"fcmovne\\0\"\n  \"fcmovnu\\0\"\n  \"fcmovu\\0\"\n  \"fcom\\0\"\n  \"fcomi\\0\"\n  \"fcomip\\0\"\n  \"fcomp\\0\"\n  \"fcompp\\0\"\n  \"fcos\\0\"\n  \"fdecstp\\0\"\n  \"fdiv\\0\"\n  \"fdivp\\0\"\n  \"fdivr\\0\"\n  \"fdivrp\\0\"\n  \"femms\\0\"\n  \"ffree\\0\"\n  \"fiadd\\0\"\n  \"ficom\\0\"\n  \"ficomp\\0\"\n  \"fidiv\\0\"\n  \"fidivr\\0\"\n  \"fild\\0\"\n  \"fimul\\0\"\n  \"fincstp\\0\"\n  \"finit\\0\"\n  \"fist\\0\"\n  \"fistp\\0\"\n  \"fisttp\\0\"\n  \"fisub\\0\"\n  \"fisubr\\0\"\n  \"fld\\0\"\n  \"fld1\\0\"\n  \"fldcw\\0\"\n  \"fldenv\\0\"\n  \"fldl2e\\0\"\n  \"fldl2t\\0\"\n  \"fldlg2\\0\"\n  \"fldln2\\0\"\n  \"fldpi\\0\"\n  \"fldz\\0\"\n  \"fmul\\0\"\n  \"fmulp\\0\"\n  \"fnclex\\0\"\n  \"fninit\\0\"\n  \"fnop\\0\"\n  \"fnsave\\0\"\n  \"fnstcw\\0\"\n  \"fnstenv\\0\"\n  \"fnstsw\\0\"\n  \"fpatan\\0\"\n  \"fprem\\0\"\n  \"fprem1\\0\"\n  \"fptan\\0\"\n  \"frndint\\0\"\n  \"frstor\\0\"\n  \"fsave\\0\"\n  \"fscale\\0\"\n  \"fsin\\0\"\n  \"fsincos\\0\"\n  \"fsqrt\\0\"\n  \"fst\\0\"\n  \"fstcw\\0\"\n  \"fstenv\\0\"\n  \"fstp\\0\"\n  \"fstsw\\0\"\n  \"fsub\\0\"\n  \"fsubp\\0\"\n  \"fsubr\\0\"\n  \"fsubrp\\0\"\n  \"ftst\\0\"\n  \"fucom\\0\"\n  \"fucomi\\0\"\n  \"fucomip\\0\"\n  \"fucomp\\0\"\n  \"fucompp\\0\"\n  \"fwait\\0\"\n  \"fxam\\0\"\n  \"fxch\\0\"\n  \"fxrstor\\0\"\n  \"fxsave\\0\"\n  \"fxtract\\0\"\n  \"fyl2x\\0\"\n  \"fyl2xp1\\0\"\n  \"haddpd\\0\"\n  \"haddps\\0\"\n  \"hsubpd\\0\"\n  \"hsubps\\0\"\n  \"idiv\\0\"\n  \"imul\\0\"\n  \"inc\\0\"\n  \"int3\\0\"\n  \"ja\\0\"\n  \"jae\\0\"\n  \"jb\\0\"\n  \"jbe\\0\"\n  \"jc\\0\"\n  \"je\\0\"\n  \"jg\\0\"\n  \"jge\\0\"\n  \"jl\\0\"\n  \"jle\\0\"\n  \"jna\\0\"\n  \"jnae\\0\"\n  \"jnb\\0\"\n  \"jnbe\\0\"\n  \"jnc\\0\"\n  \"jne\\0\"\n  \"jng\\0\"\n  \"jnge\\0\"\n  \"jnl\\0\"\n  \"jnle\\0\"\n  \"jno\\0\"\n  \"jnp\\0\"\n  \"jns\\0\"\n  \"jnz\\0\"\n  \"jo\\0\"\n  \"jp\\0\"\n  \"jpe\\0\"\n  \"jpo\\0\"\n  \"js\\0\"\n  \"jz\\0\"\n  \"jmp\\0\"\n  \"lddqu\\0\"\n  \"ldmxcsr\\0\"\n  \"lahf\\0\"\n  \"lea\\0\"\n  \"leave\\0\"\n  \"lfence\\0\"\n  \"maskmovdqu\\0\"\n  \"maskmovq\\0\"\n  \"maxpd\\0\"\n  \"maxps\\0\"\n  \"maxsd\\0\"\n  \"maxss\\0\"\n  \"mfence\\0\"\n  \"minpd\\0\"\n  \"minps\\0\"\n  \"minsd\\0\"\n  \"minss\\0\"\n  \"monitor\\0\"\n  \"mov\\0\"\n  \"movapd\\0\"\n  \"movaps\\0\"\n  \"movbe\\0\"\n  \"movd\\0\"\n  \"movddup\\0\"\n  \"movdq2q\\0\"\n  \"movdqa\\0\"\n  \"movdqu\\0\"\n  \"movhlps\\0\"\n  \"movhpd\\0\"\n  \"movhps\\0\"\n  \"movlhps\\0\"\n  \"movlpd\\0\"\n  \"movlps\\0\"\n  \"movmskpd\\0\"\n  \"movmskps\\0\"\n  \"movntdq\\0\"\n  \"movntdqa\\0\"\n  \"movnti\\0\"\n  \"movntpd\\0\"\n  \"movntps\\0\"\n  \"movntq\\0\"\n  \"movq\\0\"\n  \"movq2dq\\0\"\n  \"movsd\\0\"\n  \"movshdup\\0\"\n  \"movsldup\\0\"\n  \"movss\\0\"\n  \"movsx\\0\"\n  \"movsxd\\0\"\n  \"movupd\\0\"\n  \"movups\\0\"\n  \"movzx\\0\"\n  \"mov_ptr\\0\"\n  \"mpsadbw\\0\"\n  \"mul\\0\"\n  \"mulpd\\0\"\n  \"mulps\\0\"\n  \"mulsd\\0\"\n  \"mulss\\0\"\n  \"mwait\\0\"\n  \"neg\\0\"\n  \"nop\\0\"\n  \"not\\0\"\n  \"or\\0\"\n  \"orpd\\0\"\n  \"orps\\0\"\n  \"pabsb\\0\"\n  \"pabsd\\0\"\n  \"pabsw\\0\"\n  \"packssdw\\0\"\n  \"packsswb\\0\"\n  \"packusdw\\0\"\n  \"packuswb\\0\"\n  \"paddb\\0\"\n  \"paddd\\0\"\n  \"paddq\\0\"\n  \"paddsb\\0\"\n  \"paddsw\\0\"\n  \"paddusb\\0\"\n  \"paddusw\\0\"\n  \"paddw\\0\"\n  \"palignr\\0\"\n  \"pand\\0\"\n  \"pandn\\0\"\n  \"pause\\0\"\n  \"pavgb\\0\"\n  \"pavgw\\0\"\n  \"pblendvb\\0\"\n  \"pblendw\\0\"\n  \"pcmpeqb\\0\"\n  \"pcmpeqd\\0\"\n  \"pcmpeqq\\0\"\n  \"pcmpeqw\\0\"\n  \"pcmpestri\\0\"\n  \"pcmpestrm\\0\"\n  \"pcmpgtb\\0\"\n  \"pcmpgtd\\0\"\n  \"pcmpgtq\\0\"\n  \"pcmpgtw\\0\"\n  \"pcmpistri\\0\"\n  \"pcmpistrm\\0\"\n  \"pextrb\\0\"\n  \"pextrd\\0\"\n  \"pextrq\\0\"\n  \"pextrw\\0\"\n  \"pf2id\\0\"\n  \"pf2iw\\0\"\n  \"pfacc\\0\"\n  \"pfadd\\0\"\n  \"pfcmpeq\\0\"\n  \"pfcmpge\\0\"\n  \"pfcmpgt\\0\"\n  \"pfmax\\0\"\n  \"pfmin\\0\"\n  \"pfmul\\0\"\n  \"pfnacc\\0\"\n  \"pfpnacc\\0\"\n  \"pfrcp\\0\"\n  \"pfrcpit1\\0\"\n  \"pfrcpit2\\0\"\n  \"pfrsqit1\\0\"\n  \"pfrsqrt\\0\"\n  \"pfsub\\0\"\n  \"pfsubr\\0\"\n  \"phaddd\\0\"\n  \"phaddsw\\0\"\n  \"phaddw\\0\"\n  \"phminposuw\\0\"\n  \"phsubd\\0\"\n  \"phsubsw\\0\"\n  \"phsubw\\0\"\n  \"pi2fd\\0\"\n  \"pi2fw\\0\"\n  \"pinsrb\\0\"\n  \"pinsrd\\0\"\n  \"pinsrq\\0\"\n  \"pinsrw\\0\"\n  \"pmaddubsw\\0\"\n  \"pmaddwd\\0\"\n  \"pmaxsb\\0\"\n  \"pmaxsd\\0\"\n  \"pmaxsw\\0\"\n  \"pmaxub\\0\"\n  \"pmaxud\\0\"\n  \"pmaxuw\\0\"\n  \"pminsb\\0\"\n  \"pminsd\\0\"\n  \"pminsw\\0\"\n  \"pminub\\0\"\n  \"pminud\\0\"\n  \"pminuw\\0\"\n  \"pmovmskb\\0\"\n  \"pmovsxbd\\0\"\n  \"pmovsxbq\\0\"\n  \"pmovsxbw\\0\"\n  \"pmovsxdq\\0\"\n  \"pmovsxwd\\0\"\n  \"pmovsxwq\\0\"\n  \"pmovzxbd\\0\"\n  \"pmovzxbq\\0\"\n  \"pmovzxbw\\0\"\n  \"pmovzxdq\\0\"\n  \"pmovzxwd\\0\"\n  \"pmovzxwq\\0\"\n  \"pmuldq\\0\"\n  \"pmulhrsw\\0\"\n  \"pmulhuw\\0\"\n  \"pmulhw\\0\"\n  \"pmulld\\0\"\n  \"pmullw\\0\"\n  \"pmuludq\\0\"\n  \"pop\\0\"\n  \"popad\\0\"\n  \"popcnt\\0\"\n  \"popfd\\0\"\n  \"popfq\\0\"\n  \"por\\0\"\n  \"prefetch\\0\"\n  \"psadbw\\0\"\n  \"pshufb\\0\"\n  \"pshufd\\0\"\n  \"pshufw\\0\"\n  \"pshufhw\\0\"\n  \"pshuflw\\0\"\n  \"psignb\\0\"\n  \"psignd\\0\"\n  \"psignw\\0\"\n  \"pslld\\0\"\n  \"pslldq\\0\"\n  \"psllq\\0\"\n  \"psllw\\0\"\n  \"psrad\\0\"\n  \"psraw\\0\"\n  \"psrld\\0\"\n  \"psrldq\\0\"\n  \"psrlq\\0\"\n  \"psrlw\\0\"\n  \"psubb\\0\"\n  \"psubd\\0\"\n  \"psubq\\0\"\n  \"psubsb\\0\"\n  \"psubsw\\0\"\n  \"psubusb\\0\"\n  \"psubusw\\0\"\n  \"psubw\\0\"\n  \"pswapd\\0\"\n  \"ptest\\0\"\n  \"punpckhbw\\0\"\n  \"punpckhdq\\0\"\n  \"punpckhqdq\\0\"\n  \"punpckhwd\\0\"\n  \"punpcklbw\\0\"\n  \"punpckldq\\0\"\n  \"punpcklqdq\\0\"\n  \"punpcklwd\\0\"\n  \"push\\0\"\n  \"pushad\\0\"\n  \"pushfd\\0\"\n  \"pushfq\\0\"\n  \"pxor\\0\"\n  \"rcl\\0\"\n  \"rcpps\\0\"\n  \"rcpss\\0\"\n  \"rcr\\0\"\n  \"rdtsc\\0\"\n  \"rdtscp\\0\"\n  \"rep lodsb\\0\"\n  \"rep lodsd\\0\"\n  \"rep lodsq\\0\"\n  \"rep lodsw\\0\"\n  \"rep movsb\\0\"\n  \"rep movsd\\0\"\n  \"rep movsq\\0\"\n  \"rep movsw\\0\"\n  \"rep stosb\\0\"\n  \"rep stosd\\0\"\n  \"rep stosq\\0\"\n  \"rep stosw\\0\"\n  \"repe cmpsb\\0\"\n  \"repe cmpsd\\0\"\n  \"repe cmpsq\\0\"\n  \"repe cmpsw\\0\"\n  \"repe scasb\\0\"\n  \"repe scasd\\0\"\n  \"repe scasq\\0\"\n  \"repe scasw\\0\"\n  \"repne cmpsb\\0\"\n  \"repne cmpsd\\0\"\n  \"repne cmpsq\\0\"\n  \"repne cmpsw\\0\"\n  \"repne scasb\\0\"\n  \"repne scasd\\0\"\n  \"repne scasq\\0\"\n  \"repne scasw\\0\"\n  \"ret\\0\"\n  \"rol\\0\"\n  \"ror\\0\"\n  \"roundpd\\0\"\n  \"roundps\\0\"\n  \"roundsd\\0\"\n  \"roundss\\0\"\n  \"rsqrtps\\0\"\n  \"rsqrtss\\0\"\n  \"sahf\\0\"\n  \"sal\\0\"\n  \"sar\\0\"\n  \"sbb\\0\"\n  \"seta\\0\"\n  \"setae\\0\"\n  \"setb\\0\"\n  \"setbe\\0\"\n  \"setc\\0\"\n  \"sete\\0\"\n  \"setg\\0\"\n  \"setge\\0\"\n  \"setl\\0\"\n  \"setle\\0\"\n  \"setna\\0\"\n  \"setnae\\0\"\n  \"setnb\\0\"\n  \"setnbe\\0\"\n  \"setnc\\0\"\n  \"setne\\0\"\n  \"setng\\0\"\n  \"setnge\\0\"\n  \"setnl\\0\"\n  \"setnle\\0\"\n  \"setno\\0\"\n  \"setnp\\0\"\n  \"setns\\0\"\n  \"setnz\\0\"\n  \"seto\\0\"\n  \"setp\\0\"\n  \"setpe\\0\"\n  \"setpo\\0\"\n  \"sets\\0\"\n  \"setz\\0\"\n  \"sfence\\0\"\n  \"shl\\0\"\n  \"shld\\0\"\n  \"shr\\0\"\n  \"shrd\\0\"\n  \"shufpd\\0\"\n  \"shufps\\0\"\n  \"sqrtpd\\0\"\n  \"sqrtps\\0\"\n  \"sqrtsd\\0\"\n  \"sqrtss\\0\"\n  \"stc\\0\"\n  \"std\\0\"\n  \"stmxcsr\\0\"\n  \"sub\\0\"\n  \"subpd\\0\"\n  \"subps\\0\"\n  \"subsd\\0\"\n  \"subss\\0\"\n  \"test\\0\"\n  \"ucomisd\\0\"\n  \"ucomiss\\0\"\n  \"ud2\\0\"\n  \"unpckhpd\\0\"\n  \"unpckhps\\0\"\n  \"unpcklpd\\0\"\n  \"unpcklps\\0\"\n  \"xadd\\0\"\n  \"xchg\\0\"\n  \"xor\\0\"\n  \"xorpd\\0\"\n  \"xorps\\0\"\n  ;\n\n#define INDEX_kInstNone 0\n#define INDEX_kX86InstAdc 1\n#define INDEX_kX86InstAdd 5\n#define INDEX_kX86InstAddPD 9\n#define INDEX_kX86InstAddPS 15\n#define INDEX_kX86InstAddSD 21\n#define INDEX_kX86InstAddSS 27\n#define INDEX_kX86InstAddSubPD 33\n#define INDEX_kX86InstAddSubPS 42\n#define INDEX_kX86InstAmdPrefetch 51\n#define INDEX_kX86InstAmdPrefetchW 64\n#define INDEX_kX86InstAnd 78\n#define INDEX_kX86InstAndnPD 82\n#define INDEX_kX86InstAndnPS 89\n#define INDEX_kX86InstAndPD 96\n#define INDEX_kX86InstAndPS 102\n#define INDEX_kX86InstBlendPD 108\n#define INDEX_kX86InstBlendPS 116\n#define INDEX_kX86InstBlendVPD 124\n#define INDEX_kX86InstBlendVPS 133\n#define INDEX_kX86InstBsf 142\n#define INDEX_kX86InstBsr 146\n#define INDEX_kX86InstBSwap 150\n#define INDEX_kX86InstBt 156\n#define INDEX_kX86InstBtc 159\n#define INDEX_kX86InstBtr 163\n#define INDEX_kX86InstBts 167\n#define INDEX_kX86InstCall 171\n#define INDEX_kX86InstCbw 176\n#define INDEX_kX86InstCdq 180\n#define INDEX_kX86InstCdqe 184\n#define INDEX_kX86InstClc 189\n#define INDEX_kX86InstCld 193\n#define INDEX_kX86InstClFlush 197\n#define INDEX_kX86InstCmc 205\n#define INDEX_kX86InstCMovA 209\n#define INDEX_kX86InstCMovAE 215\n#define INDEX_kX86InstCMovB 222\n#define INDEX_kX86InstCMovBE 228\n#define INDEX_kX86InstCMovC 235\n#define INDEX_kX86InstCMovE 241\n#define INDEX_kX86InstCMovG 247\n#define INDEX_kX86InstCMovGE 253\n#define INDEX_kX86InstCMovL 260\n#define INDEX_kX86InstCMovLE 266\n#define INDEX_kX86InstCMovNA 273\n#define INDEX_kX86InstCMovNAE 280\n#define INDEX_kX86InstCMovNB 288\n#define INDEX_kX86InstCMovNBE 295\n#define INDEX_kX86InstCMovNC 303\n#define INDEX_kX86InstCMovNE 310\n#define INDEX_kX86InstCMovNG 317\n#define INDEX_kX86InstCMovNGE 324\n#define INDEX_kX86InstCMovNL 332\n#define INDEX_kX86InstCMovNLE 339\n#define INDEX_kX86InstCMovNO 347\n#define INDEX_kX86InstCMovNP 354\n#define INDEX_kX86InstCMovNS 361\n#define INDEX_kX86InstCMovNZ 368\n#define INDEX_kX86InstCMovO 375\n#define INDEX_kX86InstCMovP 381\n#define INDEX_kX86InstCMovPE 387\n#define INDEX_kX86InstCMovPO 394\n#define INDEX_kX86InstCMovS 401\n#define INDEX_kX86InstCMovZ 407\n#define INDEX_kX86InstCmp 413\n#define INDEX_kX86InstCmpPD 417\n#define INDEX_kX86InstCmpPS 423\n#define INDEX_kX86InstCmpSD 429\n#define INDEX_kX86InstCmpSS 435\n#define INDEX_kX86InstCmpXCHG 441\n#define INDEX_kX86InstCmpXCHG16B 449\n#define INDEX_kX86InstCmpXCHG8B 460\n#define INDEX_kX86InstComISD 470\n#define INDEX_kX86InstComISS 477\n#define INDEX_kX86InstCpuId 484\n#define INDEX_kX86InstCqo 490\n#define INDEX_kX86InstCrc32 494\n#define INDEX_kX86InstCvtDQ2PD 500\n#define INDEX_kX86InstCvtDQ2PS 509\n#define INDEX_kX86InstCvtPD2DQ 518\n#define INDEX_kX86InstCvtPD2PI 527\n#define INDEX_kX86InstCvtPD2PS 536\n#define INDEX_kX86InstCvtPI2PD 545\n#define INDEX_kX86InstCvtPI2PS 554\n#define INDEX_kX86InstCvtPS2DQ 563\n#define INDEX_kX86InstCvtPS2PD 572\n#define INDEX_kX86InstCvtPS2PI 581\n#define INDEX_kX86InstCvtSD2SI 590\n#define INDEX_kX86InstCvtSD2SS 599\n#define INDEX_kX86InstCvtSI2SD 608\n#define INDEX_kX86InstCvtSI2SS 617\n#define INDEX_kX86InstCvtSS2SD 626\n#define INDEX_kX86InstCvtSS2SI 635\n#define INDEX_kX86InstCvttPD2DQ 644\n#define INDEX_kX86InstCvttPD2PI 654\n#define INDEX_kX86InstCvttPS2DQ 664\n#define INDEX_kX86InstCvttPS2PI 674\n#define INDEX_kX86InstCvttSD2SI 684\n#define INDEX_kX86InstCvttSS2SI 694\n#define INDEX_kX86InstCwd 704\n#define INDEX_kX86InstCwde 708\n#define INDEX_kX86InstDaa 713\n#define INDEX_kX86InstDas 717\n#define INDEX_kX86InstDec 721\n#define INDEX_kX86InstDiv 725\n#define INDEX_kX86InstDivPD 729\n#define INDEX_kX86InstDivPS 735\n#define INDEX_kX86InstDivSD 741\n#define INDEX_kX86InstDivSS 747\n#define INDEX_kX86InstDpPD 753\n#define INDEX_kX86InstDpPS 758\n#define INDEX_kX86InstEmms 763\n#define INDEX_kX86InstEnter 768\n#define INDEX_kX86InstExtractPS 774\n#define INDEX_kX86InstF2XM1 784\n#define INDEX_kX86InstFAbs 790\n#define INDEX_kX86InstFAdd 795\n#define INDEX_kX86InstFAddP 800\n#define INDEX_kX86InstFBLd 806\n#define INDEX_kX86InstFBStP 811\n#define INDEX_kX86InstFCHS 817\n#define INDEX_kX86InstFClex 822\n#define INDEX_kX86InstFCMovB 828\n#define INDEX_kX86InstFCMovBE 835\n#define INDEX_kX86InstFCMovE 843\n#define INDEX_kX86InstFCMovNB 850\n#define INDEX_kX86InstFCMovNBE 858\n#define INDEX_kX86InstFCMovNE 867\n#define INDEX_kX86InstFCMovNU 875\n#define INDEX_kX86InstFCMovU 883\n#define INDEX_kX86InstFCom 890\n#define INDEX_kX86InstFComI 895\n#define INDEX_kX86InstFComIP 901\n#define INDEX_kX86InstFComP 908\n#define INDEX_kX86InstFComPP 914\n#define INDEX_kX86InstFCos 921\n#define INDEX_kX86InstFDecStP 926\n#define INDEX_kX86InstFDiv 934\n#define INDEX_kX86InstFDivP 939\n#define INDEX_kX86InstFDivR 945\n#define INDEX_kX86InstFDivRP 951\n#define INDEX_kX86InstFEmms 958\n#define INDEX_kX86InstFFree 964\n#define INDEX_kX86InstFIAdd 970\n#define INDEX_kX86InstFICom 976\n#define INDEX_kX86InstFIComP 982\n#define INDEX_kX86InstFIDiv 989\n#define INDEX_kX86InstFIDivR 995\n#define INDEX_kX86InstFILd 1002\n#define INDEX_kX86InstFIMul 1007\n#define INDEX_kX86InstFIncStP 1013\n#define INDEX_kX86InstFInit 1021\n#define INDEX_kX86InstFISt 1027\n#define INDEX_kX86InstFIStP 1032\n#define INDEX_kX86InstFISttP 1038\n#define INDEX_kX86InstFISub 1045\n#define INDEX_kX86InstFISubR 1051\n#define INDEX_kX86InstFLd 1058\n#define INDEX_kX86InstFLd1 1062\n#define INDEX_kX86InstFLdCw 1067\n#define INDEX_kX86InstFLdEnv 1073\n#define INDEX_kX86InstFLdL2E 1080\n#define INDEX_kX86InstFLdL2T 1087\n#define INDEX_kX86InstFLdLg2 1094\n#define INDEX_kX86InstFLdLn2 1101\n#define INDEX_kX86InstFLdPi 1108\n#define INDEX_kX86InstFLdZ 1114\n#define INDEX_kX86InstFMul 1119\n#define INDEX_kX86InstFMulP 1124\n#define INDEX_kX86InstFNClex 1130\n#define INDEX_kX86InstFNInit 1137\n#define INDEX_kX86InstFNop 1144\n#define INDEX_kX86InstFNSave 1149\n#define INDEX_kX86InstFNStCw 1156\n#define INDEX_kX86InstFNStEnv 1163\n#define INDEX_kX86InstFNStSw 1171\n#define INDEX_kX86InstFPAtan 1178\n#define INDEX_kX86InstFPRem 1185\n#define INDEX_kX86InstFPRem1 1191\n#define INDEX_kX86InstFPTan 1198\n#define INDEX_kX86InstFRndInt 1204\n#define INDEX_kX86InstFRstor 1212\n#define INDEX_kX86InstFSave 1219\n#define INDEX_kX86InstFScale 1225\n#define INDEX_kX86InstFSin 1232\n#define INDEX_kX86InstFSinCos 1237\n#define INDEX_kX86InstFSqrt 1245\n#define INDEX_kX86InstFSt 1251\n#define INDEX_kX86InstFStCw 1255\n#define INDEX_kX86InstFStEnv 1261\n#define INDEX_kX86InstFStP 1268\n#define INDEX_kX86InstFStSw 1273\n#define INDEX_kX86InstFSub 1279\n#define INDEX_kX86InstFSubP 1284\n#define INDEX_kX86InstFSubR 1290\n#define INDEX_kX86InstFSubRP 1296\n#define INDEX_kX86InstFTst 1303\n#define INDEX_kX86InstFUCom 1308\n#define INDEX_kX86InstFUComI 1314\n#define INDEX_kX86InstFUComIP 1321\n#define INDEX_kX86InstFUComP 1329\n#define INDEX_kX86InstFUComPP 1336\n#define INDEX_kX86InstFWait 1344\n#define INDEX_kX86InstFXam 1350\n#define INDEX_kX86InstFXch 1355\n#define INDEX_kX86InstFXRstor 1360\n#define INDEX_kX86InstFXSave 1368\n#define INDEX_kX86InstFXtract 1375\n#define INDEX_kX86InstFYL2X 1383\n#define INDEX_kX86InstFYL2XP1 1389\n#define INDEX_kX86InstHAddPD 1397\n#define INDEX_kX86InstHAddPS 1404\n#define INDEX_kX86InstHSubPD 1411\n#define INDEX_kX86InstHSubPS 1418\n#define INDEX_kX86InstIDiv 1425\n#define INDEX_kX86InstIMul 1430\n#define INDEX_kX86InstInc 1435\n#define INDEX_kX86InstInt3 1439\n#define INDEX_kX86InstJA 1444\n#define INDEX_kX86InstJAE 1447\n#define INDEX_kX86InstJB 1451\n#define INDEX_kX86InstJBE 1454\n#define INDEX_kX86InstJC 1458\n#define INDEX_kX86InstJE 1461\n#define INDEX_kX86InstJG 1464\n#define INDEX_kX86InstJGE 1467\n#define INDEX_kX86InstJL 1471\n#define INDEX_kX86InstJLE 1474\n#define INDEX_kX86InstJNA 1478\n#define INDEX_kX86InstJNAE 1482\n#define INDEX_kX86InstJNB 1487\n#define INDEX_kX86InstJNBE 1491\n#define INDEX_kX86InstJNC 1496\n#define INDEX_kX86InstJNE 1500\n#define INDEX_kX86InstJNG 1504\n#define INDEX_kX86InstJNGE 1508\n#define INDEX_kX86InstJNL 1513\n#define INDEX_kX86InstJNLE 1517\n#define INDEX_kX86InstJNO 1522\n#define INDEX_kX86InstJNP 1526\n#define INDEX_kX86InstJNS 1530\n#define INDEX_kX86InstJNZ 1534\n#define INDEX_kX86InstJO 1538\n#define INDEX_kX86InstJP 1541\n#define INDEX_kX86InstJPE 1544\n#define INDEX_kX86InstJPO 1548\n#define INDEX_kX86InstJS 1552\n#define INDEX_kX86InstJZ 1555\n#define INDEX_kX86InstJmp 1558\n#define INDEX_kX86InstLdDQU 1562\n#define INDEX_kX86InstLdMXCSR 1568\n#define INDEX_kX86InstLahf 1576\n#define INDEX_kX86InstLea 1581\n#define INDEX_kX86InstLeave 1585\n#define INDEX_kX86InstLFence 1591\n#define INDEX_kX86InstMaskMovDQU 1598\n#define INDEX_kX86InstMaskMovQ 1609\n#define INDEX_kX86InstMaxPD 1618\n#define INDEX_kX86InstMaxPS 1624\n#define INDEX_kX86InstMaxSD 1630\n#define INDEX_kX86InstMaxSS 1636\n#define INDEX_kX86InstMFence 1642\n#define INDEX_kX86InstMinPD 1649\n#define INDEX_kX86InstMinPS 1655\n#define INDEX_kX86InstMinSD 1661\n#define INDEX_kX86InstMinSS 1667\n#define INDEX_kX86InstMonitor 1673\n#define INDEX_kX86InstMov 1681\n#define INDEX_kX86InstMovAPD 1685\n#define INDEX_kX86InstMovAPS 1692\n#define INDEX_kX86InstMovBE 1699\n#define INDEX_kX86InstMovD 1705\n#define INDEX_kX86InstMovDDup 1710\n#define INDEX_kX86InstMovDQ2Q 1718\n#define INDEX_kX86InstMovDQA 1726\n#define INDEX_kX86InstMovDQU 1733\n#define INDEX_kX86InstMovHLPS 1740\n#define INDEX_kX86InstMovHPD 1748\n#define INDEX_kX86InstMovHPS 1755\n#define INDEX_kX86InstMovLHPS 1762\n#define INDEX_kX86InstMovLPD 1770\n#define INDEX_kX86InstMovLPS 1777\n#define INDEX_kX86InstMovMskPD 1784\n#define INDEX_kX86InstMovMskPS 1793\n#define INDEX_kX86InstMovNTDQ 1802\n#define INDEX_kX86InstMovNTDQA 1810\n#define INDEX_kX86InstMovNTI 1819\n#define INDEX_kX86InstMovNTPD 1826\n#define INDEX_kX86InstMovNTPS 1834\n#define INDEX_kX86InstMovNTQ 1842\n#define INDEX_kX86InstMovQ 1849\n#define INDEX_kX86InstMovQ2DQ 1854\n#define INDEX_kX86InstMovSD 1862\n#define INDEX_kX86InstMovSHDup 1868\n#define INDEX_kX86InstMovSLDup 1877\n#define INDEX_kX86InstMovSS 1886\n#define INDEX_kX86InstMovSX 1892\n#define INDEX_kX86InstMovSXD 1898\n#define INDEX_kX86InstMovUPD 1905\n#define INDEX_kX86InstMovUPS 1912\n#define INDEX_kX86InstMovZX 1919\n#define INDEX_kX86InstMovPtr 1925\n#define INDEX_kX86InstMPSADBW 1933\n#define INDEX_kX86InstMul 1941\n#define INDEX_kX86InstMulPD 1945\n#define INDEX_kX86InstMulPS 1951\n#define INDEX_kX86InstMulSD 1957\n#define INDEX_kX86InstMulSS 1963\n#define INDEX_kX86InstMWait 1969\n#define INDEX_kX86InstNeg 1975\n#define INDEX_kX86InstNop 1979\n#define INDEX_kX86InstNot 1983\n#define INDEX_kX86InstOr 1987\n#define INDEX_kX86InstOrPD 1990\n#define INDEX_kX86InstOrPS 1995\n#define INDEX_kX86InstPAbsB 2000\n#define INDEX_kX86InstPAbsD 2006\n#define INDEX_kX86InstPAbsW 2012\n#define INDEX_kX86InstPackSSDW 2018\n#define INDEX_kX86InstPackSSWB 2027\n#define INDEX_kX86InstPackUSDW 2036\n#define INDEX_kX86InstPackUSWB 2045\n#define INDEX_kX86InstPAddB 2054\n#define INDEX_kX86InstPAddD 2060\n#define INDEX_kX86InstPAddQ 2066\n#define INDEX_kX86InstPAddSB 2072\n#define INDEX_kX86InstPAddSW 2079\n#define INDEX_kX86InstPAddUSB 2086\n#define INDEX_kX86InstPAddUSW 2094\n#define INDEX_kX86InstPAddW 2102\n#define INDEX_kX86InstPAlignR 2108\n#define INDEX_kX86InstPAnd 2116\n#define INDEX_kX86InstPAndN 2121\n#define INDEX_kX86InstPause 2127\n#define INDEX_kX86InstPAvgB 2133\n#define INDEX_kX86InstPAvgW 2139\n#define INDEX_kX86InstPBlendVB 2145\n#define INDEX_kX86InstPBlendW 2154\n#define INDEX_kX86InstPCmpEqB 2162\n#define INDEX_kX86InstPCmpEqD 2170\n#define INDEX_kX86InstPCmpEqQ 2178\n#define INDEX_kX86InstPCmpEqW 2186\n#define INDEX_kX86InstPCmpEStrI 2194\n#define INDEX_kX86InstPCmpEStrM 2204\n#define INDEX_kX86InstPCmpGtB 2214\n#define INDEX_kX86InstPCmpGtD 2222\n#define INDEX_kX86InstPCmpGtQ 2230\n#define INDEX_kX86InstPCmpGtW 2238\n#define INDEX_kX86InstPCmpIStrI 2246\n#define INDEX_kX86InstPCmpIStrM 2256\n#define INDEX_kX86InstPExtrB 2266\n#define INDEX_kX86InstPExtrD 2273\n#define INDEX_kX86InstPExtrQ 2280\n#define INDEX_kX86InstPExtrW 2287\n#define INDEX_kX86InstPF2ID 2294\n#define INDEX_kX86InstPF2IW 2300\n#define INDEX_kX86InstPFAcc 2306\n#define INDEX_kX86InstPFAdd 2312\n#define INDEX_kX86InstPFCmpEQ 2318\n#define INDEX_kX86InstPFCmpGE 2326\n#define INDEX_kX86InstPFCmpGT 2334\n#define INDEX_kX86InstPFMax 2342\n#define INDEX_kX86InstPFMin 2348\n#define INDEX_kX86InstPFMul 2354\n#define INDEX_kX86InstPFNAcc 2360\n#define INDEX_kX86InstPFPNAcc 2367\n#define INDEX_kX86InstPFRcp 2375\n#define INDEX_kX86InstPFRcpIt1 2381\n#define INDEX_kX86InstPFRcpIt2 2390\n#define INDEX_kX86InstPFRSqIt1 2399\n#define INDEX_kX86InstPFRSqrt 2408\n#define INDEX_kX86InstPFSub 2416\n#define INDEX_kX86InstPFSubR 2422\n#define INDEX_kX86InstPHAddD 2429\n#define INDEX_kX86InstPHAddSW 2436\n#define INDEX_kX86InstPHAddW 2444\n#define INDEX_kX86InstPHMinPOSUW 2451\n#define INDEX_kX86InstPHSubD 2462\n#define INDEX_kX86InstPHSubSW 2469\n#define INDEX_kX86InstPHSubW 2477\n#define INDEX_kX86InstPI2FD 2484\n#define INDEX_kX86InstPI2FW 2490\n#define INDEX_kX86InstPInsRB 2496\n#define INDEX_kX86InstPInsRD 2503\n#define INDEX_kX86InstPInsRQ 2510\n#define INDEX_kX86InstPInsRW 2517\n#define INDEX_kX86InstPMAddUBSW 2524\n#define INDEX_kX86InstPMAddWD 2534\n#define INDEX_kX86InstPMaxSB 2542\n#define INDEX_kX86InstPMaxSD 2549\n#define INDEX_kX86InstPMaxSW 2556\n#define INDEX_kX86InstPMaxUB 2563\n#define INDEX_kX86InstPMaxUD 2570\n#define INDEX_kX86InstPMaxUW 2577\n#define INDEX_kX86InstPMinSB 2584\n#define INDEX_kX86InstPMinSD 2591\n#define INDEX_kX86InstPMinSW 2598\n#define INDEX_kX86InstPMinUB 2605\n#define INDEX_kX86InstPMinUD 2612\n#define INDEX_kX86InstPMinUW 2619\n#define INDEX_kX86InstPMovMskB 2626\n#define INDEX_kX86InstPMovSXBD 2635\n#define INDEX_kX86InstPMovSXBQ 2644\n#define INDEX_kX86InstPMovSXBW 2653\n#define INDEX_kX86InstPMovSXDQ 2662\n#define INDEX_kX86InstPMovSXWD 2671\n#define INDEX_kX86InstPMovSXWQ 2680\n#define INDEX_kX86InstPMovZXBD 2689\n#define INDEX_kX86InstPMovZXBQ 2698\n#define INDEX_kX86InstPMovZXBW 2707\n#define INDEX_kX86InstPMovZXDQ 2716\n#define INDEX_kX86InstPMovZXWD 2725\n#define INDEX_kX86InstPMovZXWQ 2734\n#define INDEX_kX86InstPMulDQ 2743\n#define INDEX_kX86InstPMulHRSW 2750\n#define INDEX_kX86InstPMulHUW 2759\n#define INDEX_kX86InstPMulHW 2767\n#define INDEX_kX86InstPMulLD 2774\n#define INDEX_kX86InstPMulLW 2781\n#define INDEX_kX86InstPMulUDQ 2788\n#define INDEX_kX86InstPop 2796\n#define INDEX_kX86InstPopAD 2800\n#define INDEX_kX86InstPopCnt 2806\n#define INDEX_kX86InstPopFD 2813\n#define INDEX_kX86InstPopFQ 2819\n#define INDEX_kX86InstPOr 2825\n#define INDEX_kX86InstPrefetch 2829\n#define INDEX_kX86InstPSADBW 2838\n#define INDEX_kX86InstPShufB 2845\n#define INDEX_kX86InstPShufD 2852\n#define INDEX_kX86InstPShufW 2859\n#define INDEX_kX86InstPShufHW 2866\n#define INDEX_kX86InstPShufLW 2874\n#define INDEX_kX86InstPSignB 2882\n#define INDEX_kX86InstPSignD 2889\n#define INDEX_kX86InstPSignW 2896\n#define INDEX_kX86InstPSllD 2903\n#define INDEX_kX86InstPSllDQ 2909\n#define INDEX_kX86InstPSllQ 2916\n#define INDEX_kX86InstPSllW 2922\n#define INDEX_kX86InstPSraD 2928\n#define INDEX_kX86InstPSraW 2934\n#define INDEX_kX86InstPSrlD 2940\n#define INDEX_kX86InstPSrlDQ 2946\n#define INDEX_kX86InstPSrlQ 2953\n#define INDEX_kX86InstPSrlW 2959\n#define INDEX_kX86InstPSubB 2965\n#define INDEX_kX86InstPSubD 2971\n#define INDEX_kX86InstPSubQ 2977\n#define INDEX_kX86InstPSubSB 2983\n#define INDEX_kX86InstPSubSW 2990\n#define INDEX_kX86InstPSubUSB 2997\n#define INDEX_kX86InstPSubUSW 3005\n#define INDEX_kX86InstPSubW 3013\n#define INDEX_kX86InstPSwapD 3019\n#define INDEX_kX86InstPTest 3026\n#define INDEX_kX86InstPunpckHBW 3032\n#define INDEX_kX86InstPunpckHDQ 3042\n#define INDEX_kX86InstPunpckHQDQ 3052\n#define INDEX_kX86InstPunpckHWD 3063\n#define INDEX_kX86InstPunpckLBW 3073\n#define INDEX_kX86InstPunpckLDQ 3083\n#define INDEX_kX86InstPunpckLQDQ 3093\n#define INDEX_kX86InstPunpckLWD 3104\n#define INDEX_kX86InstPush 3114\n#define INDEX_kX86InstPushAD 3119\n#define INDEX_kX86InstPushFD 3126\n#define INDEX_kX86InstPushFQ 3133\n#define INDEX_kX86InstPXor 3140\n#define INDEX_kX86InstRcl 3145\n#define INDEX_kX86InstRcpPS 3149\n#define INDEX_kX86InstRcpSS 3155\n#define INDEX_kX86InstRcr 3161\n#define INDEX_kX86InstRdtsc 3165\n#define INDEX_kX86InstRdtscP 3171\n#define INDEX_kX86InstRepLodSB 3178\n#define INDEX_kX86InstRepLodSD 3188\n#define INDEX_kX86InstRepLodSQ 3198\n#define INDEX_kX86InstRepLodSW 3208\n#define INDEX_kX86InstRepMovSB 3218\n#define INDEX_kX86InstRepMovSD 3228\n#define INDEX_kX86InstRepMovSQ 3238\n#define INDEX_kX86InstRepMovSW 3248\n#define INDEX_kX86InstRepStoSB 3258\n#define INDEX_kX86InstRepStoSD 3268\n#define INDEX_kX86InstRepStoSQ 3278\n#define INDEX_kX86InstRepStoSW 3288\n#define INDEX_kX86InstRepECmpSB 3298\n#define INDEX_kX86InstRepECmpSD 3309\n#define INDEX_kX86InstRepECmpSQ 3320\n#define INDEX_kX86InstRepECmpSW 3331\n#define INDEX_kX86InstRepEScaSB 3342\n#define INDEX_kX86InstRepEScaSD 3353\n#define INDEX_kX86InstRepEScaSQ 3364\n#define INDEX_kX86InstRepEScaSW 3375\n#define INDEX_kX86InstRepNECmpSB 3386\n#define INDEX_kX86InstRepNECmpSD 3398\n#define INDEX_kX86InstRepNECmpSQ 3410\n#define INDEX_kX86InstRepNECmpSW 3422\n#define INDEX_kX86InstRepNEScaSB 3434\n#define INDEX_kX86InstRepNEScaSD 3446\n#define INDEX_kX86InstRepNEScaSQ 3458\n#define INDEX_kX86InstRepNEScaSW 3470\n#define INDEX_kX86InstRet 3482\n#define INDEX_kX86InstRol 3486\n#define INDEX_kX86InstRor 3490\n#define INDEX_kX86InstRoundPD 3494\n#define INDEX_kX86InstRoundPS 3502\n#define INDEX_kX86InstRoundSD 3510\n#define INDEX_kX86InstRoundSS 3518\n#define INDEX_kX86InstRSqrtPS 3526\n#define INDEX_kX86InstRSqrtSS 3534\n#define INDEX_kX86InstSahf 3542\n#define INDEX_kX86InstSal 3547\n#define INDEX_kX86InstSar 3551\n#define INDEX_kX86InstSbb 3555\n#define INDEX_kX86InstSetA 3559\n#define INDEX_kX86InstSetAE 3564\n#define INDEX_kX86InstSetB 3570\n#define INDEX_kX86InstSetBE 3575\n#define INDEX_kX86InstSetC 3581\n#define INDEX_kX86InstSetE 3586\n#define INDEX_kX86InstSetG 3591\n#define INDEX_kX86InstSetGE 3596\n#define INDEX_kX86InstSetL 3602\n#define INDEX_kX86InstSetLE 3607\n#define INDEX_kX86InstSetNA 3613\n#define INDEX_kX86InstSetNAE 3619\n#define INDEX_kX86InstSetNB 3626\n#define INDEX_kX86InstSetNBE 3632\n#define INDEX_kX86InstSetNC 3639\n#define INDEX_kX86InstSetNE 3645\n#define INDEX_kX86InstSetNG 3651\n#define INDEX_kX86InstSetNGE 3657\n#define INDEX_kX86InstSetNL 3664\n#define INDEX_kX86InstSetNLE 3670\n#define INDEX_kX86InstSetNO 3677\n#define INDEX_kX86InstSetNP 3683\n#define INDEX_kX86InstSetNS 3689\n#define INDEX_kX86InstSetNZ 3695\n#define INDEX_kX86InstSetO 3701\n#define INDEX_kX86InstSetP 3706\n#define INDEX_kX86InstSetPE 3711\n#define INDEX_kX86InstSetPO 3717\n#define INDEX_kX86InstSetS 3723\n#define INDEX_kX86InstSetZ 3728\n#define INDEX_kX86InstSFence 3733\n#define INDEX_kX86InstShl 3740\n#define INDEX_kX86InstShld 3744\n#define INDEX_kX86InstShr 3749\n#define INDEX_kX86InstShrd 3753\n#define INDEX_kX86InstShufPD 3758\n#define INDEX_kX86InstShufPS 3765\n#define INDEX_kX86InstSqrtPD 3772\n#define INDEX_kX86InstSqrtPS 3779\n#define INDEX_kX86InstSqrtSD 3786\n#define INDEX_kX86InstSqrtSS 3793\n#define INDEX_kX86InstStc 3800\n#define INDEX_kX86InstStd 3804\n#define INDEX_kX86InstStMXCSR 3808\n#define INDEX_kX86InstSub 3816\n#define INDEX_kX86InstSubPD 3820\n#define INDEX_kX86InstSubPS 3826\n#define INDEX_kX86InstSubSD 3832\n#define INDEX_kX86InstSubSS 3838\n#define INDEX_kX86InstTest 3844\n#define INDEX_kX86InstUComISD 3849\n#define INDEX_kX86InstUComISS 3857\n#define INDEX_kX86InstUd2 3865\n#define INDEX_kX86InstUnpckHPD 3869\n#define INDEX_kX86InstUnpckHPS 3878\n#define INDEX_kX86InstUnpckLPD 3887\n#define INDEX_kX86InstUnpckLPS 3896\n#define INDEX_kX86InstXadd 3905\n#define INDEX_kX86InstXchg 3910\n#define INDEX_kX86InstXor 3915\n#define INDEX_kX86InstXorPD 3919\n#define INDEX_kX86InstXorPS 3925\n// ${X86_INST_DATA:END}\n\n// ============================================================================\n// [AsmJit::x86InstInfo]\n// ============================================================================\n\n#define INST(_Code_, _Name_, _Group_, _Flags_, _OpFlags0_, _OpFlags1_, _OpReg_, _OpCode0_, _OpCode1_) \\\n  { _Code_, INDEX_##_Code_, _Group_, _Flags_, { _OpFlags0_, _OpFlags1_ }, _OpReg_, { _OpCode0_, _OpCode1_ } }\n\n#define G(_Group_) kX86InstGroup##_Group_\n#define F(_Flags_) kX86InstFlag##_Flags_\n#define O(_Op_) kX86InstOp##_Op_\n\nconst X86InstInfo x86InstInfo[] =\n{\n  // Instruction code           | Instruction name   | Instruction group| Instruction flags| Operand flags[0]    | Operand flags[1]    | r| opCode[0] | opcode[1]\n  INST(kInstNone                , \"\"                 , G(None)          , F(None)          , 0                   , 0                   , 0, 0         , 0),\n  INST(kX86InstAdc              , \"adc\"              , G(Arith)         , F(Lockable)      , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 2, 0x00000010, 0x00000080),\n  INST(kX86InstAdd              , \"add\"              , G(Arith)         , F(Lockable)      , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 0, 0x00000000, 0x00000080),\n  INST(kX86InstAddPD            , \"addpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F58, 0),\n  INST(kX86InstAddPS            , \"addps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F58, 0),\n  INST(kX86InstAddSD            , \"addsd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F58, 0),\n  INST(kX86InstAddSS            , \"addss\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F58, 0),\n  INST(kX86InstAddSubPD         , \"addsubpd\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000FD0, 0),\n  INST(kX86InstAddSubPS         , \"addsubps\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000FD0, 0),\n  INST(kX86InstAmdPrefetch      , \"amd_prefetch\"     , G(Mem)           , F(None)          , O(Mem)              , 0                   , 0, 0x00000F0D, 0),\n  INST(kX86InstAmdPrefetchW     , \"amd_prefetchw\"    , G(Mem)           , F(None)          , O(Mem)              , 0                   , 1, 0x00000F0D, 0),\n  INST(kX86InstAnd              , \"and\"              , G(Arith)         , F(Lockable)      , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 4, 0x00000020, 0x00000080),\n  INST(kX86InstAndnPD           , \"andnpd\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F55, 0),\n  INST(kX86InstAndnPS           , \"andnps\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F55, 0),\n  INST(kX86InstAndPD            , \"andpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F54, 0),\n  INST(kX86InstAndPS            , \"andps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F54, 0),\n  INST(kX86InstBlendPD          , \"blendpd\"          , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A0D, 0),\n  INST(kX86InstBlendPS          , \"blendps\"          , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A0C, 0),\n  INST(kX86InstBlendVPD         , \"blendvpd\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3815, 0),\n  INST(kX86InstBlendVPS         , \"blendvps\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3814, 0),\n  INST(kX86InstBsf              , \"bsf\"              , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000FBC, 0),\n  INST(kX86InstBsr              , \"bsr\"              , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000FBD, 0),\n  INST(kX86InstBSwap            , \"bswap\"            , G(BSwap)         , F(None)          , O(Gqd)              , 0                   , 0, 0         , 0),\n  INST(kX86InstBt               , \"bt\"               , G(BTest)         , F(None)          , O(Gqdw)|O(Mem)      , O(Gqdw)|O(Imm)      , 4, 0x00000FA3, 0x00000FBA),\n  INST(kX86InstBtc              , \"btc\"              , G(BTest)         , F(Lockable)      , O(Gqdw)|O(Mem)      , O(Gqdw)|O(Imm)      , 7, 0x00000FBB, 0x00000FBA),\n  INST(kX86InstBtr              , \"btr\"              , G(BTest)         , F(Lockable)      , O(Gqdw)|O(Mem)      , O(Gqdw)|O(Imm)      , 6, 0x00000FB3, 0x00000FBA),\n  INST(kX86InstBts              , \"bts\"              , G(BTest)         , F(Lockable)      , O(Gqdw)|O(Mem)      , O(Gqdw)|O(Imm)      , 5, 0x00000FAB, 0x00000FBA),\n  INST(kX86InstCall             , \"call\"             , G(Call)          , F(Jump)          , O(Gqd) |O(Mem)      , 0                   , 0, 0         , 0),\n  INST(kX86InstCbw              , \"cbw\"              , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x66000098, 0),\n  INST(kX86InstCdq              , \"cdq\"              , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x00000099, 0),\n  INST(kX86InstCdqe             , \"cdqe\"             , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x48000098, 0),\n  INST(kX86InstClc              , \"clc\"              , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000000F8, 0),\n  INST(kX86InstCld              , \"cld\"              , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000000FC, 0),\n  INST(kX86InstClFlush          , \"clflush\"          , G(Mem)           , F(None)          , O(Mem)              , 0                   , 7, 0x00000FAE, 0),\n  INST(kX86InstCmc              , \"cmc\"              , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000000F5, 0),\n  INST(kX86InstCMovA            , \"cmova\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F47, 0),\n  INST(kX86InstCMovAE           , \"cmovae\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F43, 0),\n  INST(kX86InstCMovB            , \"cmovb\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F42, 0),\n  INST(kX86InstCMovBE           , \"cmovbe\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F46, 0),\n  INST(kX86InstCMovC            , \"cmovc\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F42, 0),\n  INST(kX86InstCMovE            , \"cmove\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F44, 0),\n  INST(kX86InstCMovG            , \"cmovg\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4F, 0),\n  INST(kX86InstCMovGE           , \"cmovge\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4D, 0),\n  INST(kX86InstCMovL            , \"cmovl\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4C, 0),\n  INST(kX86InstCMovLE           , \"cmovle\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4E, 0),\n  INST(kX86InstCMovNA           , \"cmovna\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F46, 0),\n  INST(kX86InstCMovNAE          , \"cmovnae\"          , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F42, 0),\n  INST(kX86InstCMovNB           , \"cmovnb\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F43, 0),\n  INST(kX86InstCMovNBE          , \"cmovnbe\"          , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F47, 0),\n  INST(kX86InstCMovNC           , \"cmovnc\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F43, 0),\n  INST(kX86InstCMovNE           , \"cmovne\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F45, 0),\n  INST(kX86InstCMovNG           , \"cmovng\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4E, 0),\n  INST(kX86InstCMovNGE          , \"cmovnge\"          , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4C, 0),\n  INST(kX86InstCMovNL           , \"cmovnl\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4D, 0),\n  INST(kX86InstCMovNLE          , \"cmovnle\"          , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4F, 0),\n  INST(kX86InstCMovNO           , \"cmovno\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F41, 0),\n  INST(kX86InstCMovNP           , \"cmovnp\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4B, 0),\n  INST(kX86InstCMovNS           , \"cmovns\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F49, 0),\n  INST(kX86InstCMovNZ           , \"cmovnz\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F45, 0),\n  INST(kX86InstCMovO            , \"cmovo\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F40, 0),\n  INST(kX86InstCMovP            , \"cmovp\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4A, 0),\n  INST(kX86InstCMovPE           , \"cmovpe\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4A, 0),\n  INST(kX86InstCMovPO           , \"cmovpo\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F4B, 0),\n  INST(kX86InstCMovS            , \"cmovs\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F48, 0),\n  INST(kX86InstCMovZ            , \"cmovz\"            , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0x00000F44, 0),\n  INST(kX86InstCmp              , \"cmp\"              , G(Arith)         , F(None)          , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 7, 0x00000038, 0x00000080),\n  INST(kX86InstCmpPD            , \"cmppd\"            , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000FC2, 0),\n  INST(kX86InstCmpPS            , \"cmpps\"            , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000FC2, 0),\n  INST(kX86InstCmpSD            , \"cmpsd\"            , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000FC2, 0),\n  INST(kX86InstCmpSS            , \"cmpss\"            , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000FC2, 0),\n  INST(kX86InstCmpXCHG          , \"cmpxchg\"          , G(RmReg)         , F(Special)|F(Lockable), 0              , 0                   , 0, 0x00000FB0, 0),\n  INST(kX86InstCmpXCHG16B       , \"cmpxchg16b\"       , G(Mem)           , F(Special)       , O(Mem)              , 0                   , 1, 0x00000FC7, 1 /* RexW */),\n  INST(kX86InstCmpXCHG8B        , \"cmpxchg8b\"        , G(Mem)           , F(Special)       , O(Mem)              , 0                   , 1, 0x00000FC7, 0),\n  INST(kX86InstComISD           , \"comisd\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F2F, 0),\n  INST(kX86InstComISS           , \"comiss\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F2F, 0),\n  INST(kX86InstCpuId            , \"cpuid\"            , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x00000FA2, 0),\n  INST(kX86InstCqo              , \"cqo\"              , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x48000099, 0), // TODO, set RexW bit instead?\n  INST(kX86InstCrc32            , \"crc32\"            , G(Crc32)         , F(None)          , O(Gqd)              , O(GqdwbMem)         , 0, 0xF20F38F0, 0),\n  INST(kX86InstCvtDQ2PD         , \"cvtdq2pd\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF3000FE6, 0),\n  INST(kX86InstCvtDQ2PS         , \"cvtdq2ps\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x00000F5B, 0),\n  INST(kX86InstCvtPD2DQ         , \"cvtpd2dq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF2000FE6, 0),\n  INST(kX86InstCvtPD2PI         , \"cvtpd2pi\"         , G(MmuRmI)        , F(Mov)           , O(Mm)               , O(XmmMem)           , 0, 0x66000F2D, 0),\n  INST(kX86InstCvtPD2PS         , \"cvtpd2ps\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x66000F5A, 0),\n  INST(kX86InstCvtPI2PD         , \"cvtpi2pd\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(MmMem)            , 0, 0x66000F2A, 0),\n  INST(kX86InstCvtPI2PS         , \"cvtpi2ps\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(MmMem)            , 0, 0x00000F2A, 0),\n  INST(kX86InstCvtPS2DQ         , \"cvtps2dq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x66000F5B, 0),\n  INST(kX86InstCvtPS2PD         , \"cvtps2pd\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x00000F5A, 0),\n  INST(kX86InstCvtPS2PI         , \"cvtps2pi\"         , G(MmuRmI)        , F(Mov)           , O(Mm)               , O(XmmMem)           , 0, 0x00000F2D, 0),\n  INST(kX86InstCvtSD2SI         , \"cvtsd2si\"         , G(MmuRmI)        , F(Mov)           , O(Gqd)              , O(XmmMem)           , 0, 0xF2000F2D, 0),\n  INST(kX86InstCvtSD2SS         , \"cvtsd2ss\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F5A, 0),\n  INST(kX86InstCvtSI2SD         , \"cvtsi2sd\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(Gqd)|O(Mem)       , 0, 0xF2000F2A, 0),\n  INST(kX86InstCvtSI2SS         , \"cvtsi2ss\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(Gqd)|O(Mem)       , 0, 0xF3000F2A, 0),\n  INST(kX86InstCvtSS2SD         , \"cvtss2sd\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F5A, 0),\n  INST(kX86InstCvtSS2SI         , \"cvtss2si\"         , G(MmuRmI)        , F(None)          , O(Gqd)              , O(XmmMem)           , 0, 0xF3000F2D, 0),\n  INST(kX86InstCvttPD2DQ        , \"cvttpd2dq\"        , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x66000FE6, 0),\n  INST(kX86InstCvttPD2PI        , \"cvttpd2pi\"        , G(MmuRmI)        , F(Mov)           , O(Mm)               , O(XmmMem)           , 0, 0x66000F2C, 0),\n  INST(kX86InstCvttPS2DQ        , \"cvttps2dq\"        , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F5B, 0),\n  INST(kX86InstCvttPS2PI        , \"cvttps2pi\"        , G(MmuRmI)        , F(Mov)           , O(Mm)               , O(XmmMem)           , 0, 0x00000F2C, 0),\n  INST(kX86InstCvttSD2SI        , \"cvttsd2si\"        , G(MmuRmI)        , F(None)          , O(Gqd)              , O(XmmMem)           , 0, 0xF2000F2C, 0),\n  INST(kX86InstCvttSS2SI        , \"cvttss2si\"        , G(MmuRmI)        , F(None)          , O(Gqd)              , O(XmmMem)           , 0, 0xF3000F2C, 0),\n  INST(kX86InstCwd              , \"cwd\"              , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x66000099, 0),\n  INST(kX86InstCwde             , \"cwde\"             , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x00000098, 0),\n  INST(kX86InstDaa              , \"daa\"              , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x00000027, 0),\n  INST(kX86InstDas              , \"das\"              , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x0000002F, 0),\n  INST(kX86InstDec              , \"dec\"              , G(IncDec)        , F(Lockable)      , O(GqdwbMem)         , 0                   , 1, 0x00000048, 0x000000FE),\n  INST(kX86InstDiv              , \"div\"              , G(Rm)            , F(Special)       , 0                   , 0                   , 6, 0x000000F6, 0),\n  INST(kX86InstDivPD            , \"divpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F5E, 0),\n  INST(kX86InstDivPS            , \"divps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F5E, 0),\n  INST(kX86InstDivSD            , \"divsd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F5E, 0),\n  INST(kX86InstDivSS            , \"divss\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F5E, 0),\n  INST(kX86InstDpPD             , \"dppd\"             , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A41, 0),\n  INST(kX86InstDpPS             , \"dpps\"             , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A40, 0),\n  INST(kX86InstEmms             , \"emms\"             , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x00000F77, 0),\n  INST(kX86InstEnter            , \"enter\"            , G(Enter)         , F(Special)       , 0                   , 0                   , 0, 0x000000C8, 0),\n  INST(kX86InstExtractPS        , \"extractps\"        , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A17, 0),\n  INST(kX86InstF2XM1            , \"f2xm1\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F0, 0),\n  INST(kX86InstFAbs             , \"fabs\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9E1, 0),\n  INST(kX86InstFAdd             , \"fadd\"             , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 0, 0xD8DCC0C0, 0),\n  INST(kX86InstFAddP            , \"faddp\"            , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DEC0, 0),\n  INST(kX86InstFBLd             , \"fbld\"             , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 4, 0x000000DF, 0),\n  INST(kX86InstFBStP            , \"fbstp\"            , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 6, 0x000000DF, 0),\n  INST(kX86InstFCHS             , \"fchs\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9E0, 0),\n  INST(kX86InstFClex            , \"fclex\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x9B00DBE2, 0),\n  INST(kX86InstFCMovB           , \"fcmovb\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DAC0, 0),\n  INST(kX86InstFCMovBE          , \"fcmovbe\"          , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DAD0, 0),\n  INST(kX86InstFCMovE           , \"fcmove\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DAC8, 0),\n  INST(kX86InstFCMovNB          , \"fcmovnb\"          , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBC0, 0),\n  INST(kX86InstFCMovNBE         , \"fcmovnbe\"         , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBD0, 0),\n  INST(kX86InstFCMovNE          , \"fcmovne\"          , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBC8, 0),\n  INST(kX86InstFCMovNU          , \"fcmovnu\"          , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBD8, 0),\n  INST(kX86InstFCMovU           , \"fcmovu\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DAD8, 0),\n  INST(kX86InstFCom             , \"fcom\"             , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 2, 0xD8DCD0D0, 0),\n  INST(kX86InstFComI            , \"fcomi\"            , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBF0, 0),\n  INST(kX86InstFComIP           , \"fcomip\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DFF0, 0),\n  INST(kX86InstFComP            , \"fcomp\"            , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 3, 0xD8DCD8D8, 0),\n  INST(kX86InstFComPP           , \"fcompp\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000DED9, 0),\n  INST(kX86InstFCos             , \"fcos\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9FF, 0),\n  INST(kX86InstFDecStP          , \"fdecstp\"          , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F6, 0),\n  INST(kX86InstFDiv             , \"fdiv\"             , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 6, 0xD8DCF0F8, 0),\n  INST(kX86InstFDivP            , \"fdivp\"            , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DEF8, 0),\n  INST(kX86InstFDivR            , \"fdivr\"            , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 7, 0xD8DCF8F0, 0),\n  INST(kX86InstFDivRP           , \"fdivrp\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DEF0, 0),\n  INST(kX86InstFEmms            , \"femms\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x00000F0E, 0),\n  INST(kX86InstFFree            , \"ffree\"            , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DDC0, 0),\n  INST(kX86InstFIAdd            , \"fiadd\"            , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 0, 0xDEDA0000, 0),\n  INST(kX86InstFICom            , \"ficom\"            , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 2, 0xDEDA0000, 0),\n  INST(kX86InstFIComP           , \"ficomp\"           , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 3, 0xDEDA0000, 0),\n  INST(kX86InstFIDiv            , \"fidiv\"            , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 6, 0xDEDA0000, 0),\n  INST(kX86InstFIDivR           , \"fidivr\"           , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 7, 0xDEDA0000, 0),\n  INST(kX86InstFILd             , \"fild\"             , G(X87Mem)        , F(Fpu)           , O(StM2_4_8)         , 0                   , 0, 0xDFDBDF05, 0),\n  INST(kX86InstFIMul            , \"fimul\"            , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 1, 0xDEDA0000, 0),\n  INST(kX86InstFIncStP          , \"fincstp\"          , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F7, 0),\n  INST(kX86InstFInit            , \"finit\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x9B00DBE3, 0),\n  INST(kX86InstFISt             , \"fist\"             , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 2, 0xDFDB0000, 0),\n  INST(kX86InstFIStP            , \"fistp\"            , G(X87Mem)        , F(Fpu)           , O(StM2_4_8)         , 0                   , 3, 0xDFDBDF07, 0),\n  INST(kX86InstFISttP           , \"fisttp\"           , G(X87Mem)        , F(Fpu)           , O(StM2_4_8)         , 0                   , 1, 0xDFDBDD01, 0),\n  INST(kX86InstFISub            , \"fisub\"            , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 4, 0xDEDA0000, 0),\n  INST(kX86InstFISubR           , \"fisubr\"           , G(X87Mem)        , F(Fpu)           , O(StM2_4)           , 0                   , 5, 0xDEDA0000, 0),\n  INST(kX86InstFLd              , \"fld\"              , G(X87FldFst)     , F(Fpu)           , O(StM4_8_10)        , 0                   , 0, 0x00D9DD00, 0xD9C0DB05),\n  INST(kX86InstFLd1             , \"fld1\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9E8, 0),\n  INST(kX86InstFLdCw            , \"fldcw\"            , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 5, 0x000000D9, 0),\n  INST(kX86InstFLdEnv           , \"fldenv\"           , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 4, 0x000000D9, 0),\n  INST(kX86InstFLdL2E           , \"fldl2e\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9EA, 0),\n  INST(kX86InstFLdL2T           , \"fldl2t\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9E9, 0),\n  INST(kX86InstFLdLg2           , \"fldlg2\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9EC, 0),\n  INST(kX86InstFLdLn2           , \"fldln2\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9ED, 0),\n  INST(kX86InstFLdPi            , \"fldpi\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9EB, 0),\n  INST(kX86InstFLdZ             , \"fldz\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9EE, 0),\n  INST(kX86InstFMul             , \"fmul\"             , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 1, 0xD8DCC8C8, 0),\n  INST(kX86InstFMulP            , \"fmulp\"            , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DEC8, 0),\n  INST(kX86InstFNClex           , \"fnclex\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBE2, 0),\n  INST(kX86InstFNInit           , \"fninit\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBE3, 0),\n  INST(kX86InstFNop             , \"fnop\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9D0, 0),\n  INST(kX86InstFNSave           , \"fnsave\"           , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 6, 0x000000DD, 0),\n  INST(kX86InstFNStCw           , \"fnstcw\"           , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 7, 0x000000D9, 0),\n  INST(kX86InstFNStEnv          , \"fnstenv\"          , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 6, 0x000000D9, 0),\n  INST(kX86InstFNStSw           , \"fnstsw\"           , G(X87Status)     , F(Fpu)           , O(Mem)              , 0                   , 7, 0x000000DD, 0x0000DFE0),\n  INST(kX86InstFPAtan           , \"fpatan\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F3, 0),\n  INST(kX86InstFPRem            , \"fprem\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F8, 0),\n  INST(kX86InstFPRem1           , \"fprem1\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F5, 0),\n  INST(kX86InstFPTan            , \"fptan\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F2, 0),\n  INST(kX86InstFRndInt          , \"frndint\"          , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9FC, 0),\n  INST(kX86InstFRstor           , \"frstor\"           , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 4, 0x000000DD, 0),\n  INST(kX86InstFSave            , \"fsave\"            , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 6, 0x9B0000DD, 0),\n  INST(kX86InstFScale           , \"fscale\"           , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9FD, 0),\n  INST(kX86InstFSin             , \"fsin\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9FE, 0),\n  INST(kX86InstFSinCos          , \"fsincos\"          , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9FB, 0),\n  INST(kX86InstFSqrt            , \"fsqrt\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9FA, 0),\n  INST(kX86InstFSt              , \"fst\"              , G(X87FldFst)     , F(Fpu)           , O(StM4_8)           , 0                   , 2, 0x00D9DD02, 0xDDD00000),\n  INST(kX86InstFStCw            , \"fstcw\"            , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 7, 0x9B0000D9, 0),\n  INST(kX86InstFStEnv           , \"fstenv\"           , G(Mem)           , F(Fpu)           , O(Mem)              , 0                   , 6, 0x9B0000D9, 0),\n  INST(kX86InstFStP             , \"fstp\"             , G(X87FldFst)     , F(Fpu)           , O(StM4_8_10)        , 0                   , 3, 0x00D9DD03, 0xDDD8DB07),\n  INST(kX86InstFStSw            , \"fstsw\"            , G(X87Status)     , F(Fpu)           , O(Mem)              , 0                   , 7, 0x9B0000DD, 0x9B00DFE0),\n  INST(kX86InstFSub             , \"fsub\"             , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 4, 0xD8DCE0E8, 0),\n  INST(kX86InstFSubP            , \"fsubp\"            , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DEE8, 0),\n  INST(kX86InstFSubR            , \"fsubr\"            , G(X87StM)        , F(Fpu)           , 0                   , 0                   , 5, 0xD8DCE8E0, 0),\n  INST(kX86InstFSubRP           , \"fsubrp\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DEE0, 0),\n  INST(kX86InstFTst             , \"ftst\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9E4, 0),\n  INST(kX86InstFUCom            , \"fucom\"            , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DDE0, 0),\n  INST(kX86InstFUComI           , \"fucomi\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DBE8, 0),\n  INST(kX86InstFUComIP          , \"fucomip\"          , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DFE8, 0),\n  INST(kX86InstFUComP           , \"fucomp\"           , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000DDE8, 0),\n  INST(kX86InstFUComPP          , \"fucompp\"          , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000DAE9, 0),\n  INST(kX86InstFWait            , \"fwait\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x000000DB, 0),\n  INST(kX86InstFXam             , \"fxam\"             , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9E5, 0),\n  INST(kX86InstFXch             , \"fxch\"             , G(X87StI)        , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9C8, 0),\n  INST(kX86InstFXRstor          , \"fxrstor\"          , G(Mem)           , F(Fpu)           , 0                   , 0                   , 1, 0x00000FAE, 0),\n  INST(kX86InstFXSave           , \"fxsave\"           , G(Mem)           , F(Fpu)           , 0                   , 0                   , 0, 0x00000FAE, 0),\n  INST(kX86InstFXtract          , \"fxtract\"          , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F4, 0),\n  INST(kX86InstFYL2X            , \"fyl2x\"            , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F1, 0),\n  INST(kX86InstFYL2XP1          , \"fyl2xp1\"          , G(Emit)          , F(Fpu)           , 0                   , 0                   , 0, 0x0000D9F9, 0),\n  INST(kX86InstHAddPD           , \"haddpd\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F7C, 0),\n  INST(kX86InstHAddPS           , \"haddps\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F7C, 0),\n  INST(kX86InstHSubPD           , \"hsubpd\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F7D, 0),\n  INST(kX86InstHSubPS           , \"hsubps\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F7D, 0),\n  INST(kX86InstIDiv             , \"idiv\"             , G(Rm)            , F(Special)       , 0                   , 0                   , 7, 0x000000F6, 0),\n  INST(kX86InstIMul             , \"imul\"             , G(IMul)          , F(Special)       , 0                   , 0                   , 0, 0         , 0),\n  INST(kX86InstInc              , \"inc\"              , G(IncDec)        , F(Lockable)      , O(GqdwbMem)         , 0                   , 0, 0x00000040, 0x000000FE),\n  INST(kX86InstInt3             , \"int3\"             , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000000CC, 0),\n  INST(kX86InstJA               , \"ja\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x7       , 0),\n  INST(kX86InstJAE              , \"jae\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x3       , 0),\n  INST(kX86InstJB               , \"jb\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x2       , 0),\n  INST(kX86InstJBE              , \"jbe\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x6       , 0),\n  INST(kX86InstJC               , \"jc\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x2       , 0),\n  INST(kX86InstJE               , \"je\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x4       , 0),\n  INST(kX86InstJG               , \"jg\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xF       , 0),\n  INST(kX86InstJGE              , \"jge\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xD       , 0),\n  INST(kX86InstJL               , \"jl\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xC       , 0),\n  INST(kX86InstJLE              , \"jle\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xE       , 0),\n  INST(kX86InstJNA              , \"jna\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x6       , 0),\n  INST(kX86InstJNAE             , \"jnae\"             , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x2       , 0),\n  INST(kX86InstJNB              , \"jnb\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x3       , 0),\n  INST(kX86InstJNBE             , \"jnbe\"             , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x7       , 0),\n  INST(kX86InstJNC              , \"jnc\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x3       , 0),\n  INST(kX86InstJNE              , \"jne\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x5       , 0),\n  INST(kX86InstJNG              , \"jng\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xE       , 0),\n  INST(kX86InstJNGE             , \"jnge\"             , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xC       , 0),\n  INST(kX86InstJNL              , \"jnl\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xD       , 0),\n  INST(kX86InstJNLE             , \"jnle\"             , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xF       , 0),\n  INST(kX86InstJNO              , \"jno\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x1       , 0),\n  INST(kX86InstJNP              , \"jnp\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xB       , 0),\n  INST(kX86InstJNS              , \"jns\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x9       , 0),\n  INST(kX86InstJNZ              , \"jnz\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x5       , 0),\n  INST(kX86InstJO               , \"jo\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x0       , 0),\n  INST(kX86InstJP               , \"jp\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xA       , 0),\n  INST(kX86InstJPE              , \"jpe\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xA       , 0),\n  INST(kX86InstJPO              , \"jpo\"              , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0xB       , 0),\n  INST(kX86InstJS               , \"js\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x8       , 0),\n  INST(kX86InstJZ               , \"jz\"               , G(Jcc)           , F(Jump)          , 0                   , 0                   , 0, 0x4       , 0),\n  INST(kX86InstJmp              , \"jmp\"              , G(Jmp)           , F(Jump)          , 0                   , 0                   , 0, 0         , 0),\n  INST(kX86InstLdDQU            , \"lddqu\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(Mem)              , 0, 0xF2000FF0, 0),\n  INST(kX86InstLdMXCSR          , \"ldmxcsr\"          , G(Mem)           , F(None)          , O(Mem)              , 0                   , 2, 0x00000FAE, 0),\n  INST(kX86InstLahf             , \"lahf\"             , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x0000009F, 0),\n  INST(kX86InstLea              , \"lea\"              , G(Lea)           , F(None)          , O(Gqd)              , O(Mem)              , 0, 0         , 0),\n  INST(kX86InstLeave            , \"leave\"            , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x000000C9, 0),\n  INST(kX86InstLFence           , \"lfence\"           , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000FAEE8, 0),\n  INST(kX86InstMaskMovDQU       , \"maskmovdqu\"       , G(MmuRmI)        , F(Special)       , O(Xmm)              , O(Xmm)              , 0, 0x66000F57, 0),\n  INST(kX86InstMaskMovQ         , \"maskmovq\"         , G(MmuRmI)        , F(Special)       , O(Mm)               , O(Mm)               , 0, 0x00000FF7, 0),\n  INST(kX86InstMaxPD            , \"maxpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F5F, 0),\n  INST(kX86InstMaxPS            , \"maxps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F5F, 0),\n  INST(kX86InstMaxSD            , \"maxsd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F5F, 0),\n  INST(kX86InstMaxSS            , \"maxss\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F5F, 0),\n  INST(kX86InstMFence           , \"mfence\"           , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000FAEF0, 0),\n  INST(kX86InstMinPD            , \"minpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F5D, 0),\n  INST(kX86InstMinPS            , \"minps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F5D, 0),\n  INST(kX86InstMinSD            , \"minsd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F5D, 0),\n  INST(kX86InstMinSS            , \"minss\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F5D, 0),\n  INST(kX86InstMonitor          , \"monitor\"          , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x000F01C8, 0),\n  INST(kX86InstMov              , \"mov\"              , G(Mov)           , F(Mov)           , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 0, 0         , 0),\n  INST(kX86InstMovAPD           , \"movapd\"           , G(MmuMov)        , F(Mov)           , O(XmmMem)           , O(XmmMem)           , 0, 0x66000F28, 0x66000F29),\n  INST(kX86InstMovAPS           , \"movaps\"           , G(MmuMov)        , F(Mov)           , O(XmmMem)           , O(XmmMem)           , 0, 0x00000F28, 0x00000F29),\n  INST(kX86InstMovBE            , \"movbe\"            , G(MovBE)         , F(Mov)           , O(Gqdw)|O(Mem)      , O(Gqdw)|O(Mem)      , 0, 0x000F38F0, 0x000F38F1),\n  INST(kX86InstMovD             , \"movd\"             , G(MmuMovD)       , F(Mov)           , O(Gd)|O(MmXmmMem)   , O(Gd)|O(MmXmmMem)   , 0, 0         , 0),\n  INST(kX86InstMovDDup          , \"movddup\"          , G(MmuMov)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F12, 0),\n  INST(kX86InstMovDQ2Q          , \"movdq2q\"          , G(MmuMov)        , F(Mov)           , O(Mm)               , O(Xmm)              , 0, 0xF2000FD6, 0),\n  INST(kX86InstMovDQA           , \"movdqa\"           , G(MmuMov)        , F(Mov)           , O(XmmMem)           , O(XmmMem)           , 0, 0x66000F6F, 0x66000F7F),\n  INST(kX86InstMovDQU           , \"movdqu\"           , G(MmuMov)        , F(Mov)           , O(XmmMem)           , O(XmmMem)           , 0, 0xF3000F6F, 0xF3000F7F),\n  INST(kX86InstMovHLPS          , \"movhlps\"          , G(MmuMov)        , F(None)          , O(Xmm)              , O(Xmm)              , 0, 0x00000F12, 0),\n  INST(kX86InstMovHPD           , \"movhpd\"           , G(MmuMov)        , F(None)          , O(XmmMem)           , O(XmmMem)           , 0, 0x66000F16, 0x66000F17),\n  INST(kX86InstMovHPS           , \"movhps\"           , G(MmuMov)        , F(None)          , O(XmmMem)           , O(XmmMem)           , 0, 0x00000F16, 0x00000F17),\n  INST(kX86InstMovLHPS          , \"movlhps\"          , G(MmuMov)        , F(None)          , O(Xmm)              , O(Xmm)              , 0, 0x00000F16, 0),\n  INST(kX86InstMovLPD           , \"movlpd\"           , G(MmuMov)        , F(None)          , O(XmmMem)           , O(XmmMem)           , 0, 0x66000F12, 0x66000F13),\n  INST(kX86InstMovLPS           , \"movlps\"           , G(MmuMov)        , F(None)          , O(XmmMem)           , O(XmmMem)           , 0, 0x00000F12, 0x00000F13),\n  INST(kX86InstMovMskPD         , \"movmskpd\"         , G(MmuMov)        , F(Mov)           , O(Gqd)|O(NoRex)     , O(Xmm)              , 0, 0x66000F50, 0),\n  INST(kX86InstMovMskPS         , \"movmskps\"         , G(MmuMov)        , F(Mov)           , O(Gqd)|O(NoRex)     , O(Xmm)              , 0, 0x00000F50, 0),\n  INST(kX86InstMovNTDQ          , \"movntdq\"          , G(MmuMov)        , F(None)          , O(Mem)              , O(Xmm)              , 0, 0         , 0x66000FE7),\n  INST(kX86InstMovNTDQA         , \"movntdqa\"         , G(MmuMov)        , F(Mov)           , O(Xmm)              , O(Mem)              , 0, 0x660F382A, 0),\n  INST(kX86InstMovNTI           , \"movnti\"           , G(MmuMov)        , F(Mov)           , O(Mem)              , O(Gqd)              , 0, 0         , 0x00000FC3),\n  INST(kX86InstMovNTPD          , \"movntpd\"          , G(MmuMov)        , F(None)          , O(Mem)              , O(Xmm)              , 0, 0         , 0x66000F2B),\n  INST(kX86InstMovNTPS          , \"movntps\"          , G(MmuMov)        , F(None)          , O(Mem)              , O(Xmm)              , 0, 0         , 0x00000F2B),\n  INST(kX86InstMovNTQ           , \"movntq\"           , G(MmuMov)        , F(None)          , O(Mem)              , O(Mm)               , 0, 0         , 0x00000FE7),\n  INST(kX86InstMovQ             , \"movq\"             , G(MmuMovQ)       , F(Mov)           , O(Gq)|O(MmXmmMem)   , O(Gq)|O(MmXmmMem)   , 0, 0         , 0),\n  INST(kX86InstMovQ2DQ          , \"movq2dq\"          , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(Mm)               , 0, 0xF3000FD6, 0),\n  INST(kX86InstMovSD            , \"movsd\"            , G(MmuMov)        , F(None)          , O(XmmMem)           , O(XmmMem)           , 0, 0xF2000F10, 0xF2000F11),\n  INST(kX86InstMovSHDup         , \"movshdup\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F16, 0),\n  INST(kX86InstMovSLDup         , \"movsldup\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F12, 0),\n  INST(kX86InstMovSS            , \"movss\"            , G(MmuMov)        , F(None)          , O(XmmMem)           , O(XmmMem)           , 0, 0xF3000F10, 0xF3000F11),\n  INST(kX86InstMovSX            , \"movsx\"            , G(MovSxMovZx)    , F(None)          , O(Gqdw)             , O(GwbMem)           , 0, 0x00000FBE, 0),\n  INST(kX86InstMovSXD           , \"movsxd\"           , G(MovSxD)        , F(None)          , O(Gq)               , O(GdMem)            , 0, 0         , 0),\n  INST(kX86InstMovUPD           , \"movupd\"           , G(MmuMov)        , F(Mov)           , O(XmmMem)           , O(XmmMem)           , 0, 0x66000F10, 0x66000F11),\n  INST(kX86InstMovUPS           , \"movups\"           , G(MmuMov)        , F(Mov)           , O(XmmMem)           , O(XmmMem)           , 0, 0x00000F10, 0x00000F11),\n  INST(kX86InstMovZX            , \"movzx\"            , G(MovSxMovZx)    , F(Mov)           , O(Gqdw)             , O(GwbMem)           , 0, 0x00000FB6, 0),\n  INST(kX86InstMovPtr           , \"mov_ptr\"          , G(MovPtr)        , F(Mov)|F(Special), O(Gqdwb)            , O(Imm)              , 0, 0         , 0),\n  INST(kX86InstMPSADBW          , \"mpsadbw\"          , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A42, 0),\n  INST(kX86InstMul              , \"mul\"              , G(Rm)            , F(Special)       , 0                   , 0                   , 4, 0x000000F6, 0),\n  INST(kX86InstMulPD            , \"mulpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F59, 0),\n  INST(kX86InstMulPS            , \"mulps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F59, 0),\n  INST(kX86InstMulSD            , \"mulsd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F59, 0),\n  INST(kX86InstMulSS            , \"mulss\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F59, 0),\n  INST(kX86InstMWait            , \"mwait\"            , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x000F01C9, 0),\n  INST(kX86InstNeg              , \"neg\"              , G(Rm)            , F(Lockable)      , O(GqdwbMem)         , 0                   , 3, 0x000000F6, 0),\n  INST(kX86InstNop              , \"nop\"              , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x00000090, 0),\n  INST(kX86InstNot              , \"not\"              , G(Rm)            , F(Lockable)      , O(GqdwbMem)         , 0                   , 2, 0x000000F6, 0),\n  INST(kX86InstOr               , \"or\"               , G(Arith)         , F(Lockable)      , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 1, 0x00000008, 0x00000080),\n  INST(kX86InstOrPD             , \"orpd\"             , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F56, 0),\n  INST(kX86InstOrPS             , \"orps\"             , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F56, 0),\n  INST(kX86InstPAbsB            , \"pabsb\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F381C, 0),\n  INST(kX86InstPAbsD            , \"pabsd\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F381E, 0),\n  INST(kX86InstPAbsW            , \"pabsw\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F381D, 0),\n  INST(kX86InstPackSSDW         , \"packssdw\"         , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F6B, 0),\n  INST(kX86InstPackSSWB         , \"packsswb\"         , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F63, 0),\n  INST(kX86InstPackUSDW         , \"packusdw\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F382B, 0),\n  INST(kX86InstPackUSWB         , \"packuswb\"         , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F67, 0),\n  INST(kX86InstPAddB            , \"paddb\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FFC, 0),\n  INST(kX86InstPAddD            , \"paddd\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FFE, 0),\n  INST(kX86InstPAddQ            , \"paddq\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FD4, 0),\n  INST(kX86InstPAddSB           , \"paddsb\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FEC, 0),\n  INST(kX86InstPAddSW           , \"paddsw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FED, 0),\n  INST(kX86InstPAddUSB          , \"paddusb\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FDC, 0),\n  INST(kX86InstPAddUSW          , \"paddusw\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FDD, 0),\n  INST(kX86InstPAddW            , \"paddw\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FFD, 0),\n  INST(kX86InstPAlignR          , \"palignr\"          , G(MmuRmImm8)     , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3A0F, 0),\n  INST(kX86InstPAnd             , \"pand\"             , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FDB, 0),\n  INST(kX86InstPAndN            , \"pandn\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FDF, 0),\n  INST(kX86InstPause            , \"pause\"            , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0xF3000090, 0),\n  INST(kX86InstPAvgB            , \"pavgb\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FE0, 0),\n  INST(kX86InstPAvgW            , \"pavgw\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FE3, 0),\n  INST(kX86InstPBlendVB         , \"pblendvb\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3810, 0),\n  INST(kX86InstPBlendW          , \"pblendw\"          , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A0E, 0),\n  INST(kX86InstPCmpEqB          , \"pcmpeqb\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F74, 0),\n  INST(kX86InstPCmpEqD          , \"pcmpeqd\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F76, 0),\n  INST(kX86InstPCmpEqQ          , \"pcmpeqq\"          , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3829, 0),\n  INST(kX86InstPCmpEqW          , \"pcmpeqw\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F75, 0),\n  INST(kX86InstPCmpEStrI        , \"pcmpestri\"        , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A61, 0),\n  INST(kX86InstPCmpEStrM        , \"pcmpestrm\"        , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A60, 0),\n  INST(kX86InstPCmpGtB          , \"pcmpgtb\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F64, 0),\n  INST(kX86InstPCmpGtD          , \"pcmpgtd\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F66, 0),\n  INST(kX86InstPCmpGtQ          , \"pcmpgtq\"          , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3837, 0),\n  INST(kX86InstPCmpGtW          , \"pcmpgtw\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F65, 0),\n  INST(kX86InstPCmpIStrI        , \"pcmpistri\"        , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A63, 0),\n  INST(kX86InstPCmpIStrM        , \"pcmpistrm\"        , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A62, 0),\n  INST(kX86InstPExtrB           , \"pextrb\"           , G(MmuExtract)    , F(None)          , O(Gd)|O(Gb)|O(Mem)  , O(Xmm)              , 0, 0x000F3A14, 0),\n  INST(kX86InstPExtrD           , \"pextrd\"           , G(MmuExtract)    , F(None)          , O(Gd)      |O(Mem)  , O(Xmm)              , 0, 0x000F3A16, 0),\n  INST(kX86InstPExtrQ           , \"pextrq\"           , G(MmuExtract)    , F(None)          , O(Gqd)     |O(Mem)  , O(Xmm)              , 1, 0x000F3A16, 0),\n  INST(kX86InstPExtrW           , \"pextrw\"           , G(MmuExtract)    , F(None)          , O(Gd)      |O(Mem)  , O(MmXmm)            , 0, 0x000F3A15, 0),\n  INST(kX86InstPF2ID            , \"pf2id\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x1D),\n  INST(kX86InstPF2IW            , \"pf2iw\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x1C),\n  INST(kX86InstPFAcc            , \"pfacc\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xAE),\n  INST(kX86InstPFAdd            , \"pfadd\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x9E),\n  INST(kX86InstPFCmpEQ          , \"pfcmpeq\"          , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xB0),\n  INST(kX86InstPFCmpGE          , \"pfcmpge\"          , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x90),\n  INST(kX86InstPFCmpGT          , \"pfcmpgt\"          , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xA0),\n  INST(kX86InstPFMax            , \"pfmax\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xA4),\n  INST(kX86InstPFMin            , \"pfmin\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x94),\n  INST(kX86InstPFMul            , \"pfmul\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xB4),\n  INST(kX86InstPFNAcc           , \"pfnacc\"           , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x8A),\n  INST(kX86InstPFPNAcc          , \"pfpnacc\"          , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x8E),\n  INST(kX86InstPFRcp            , \"pfrcp\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x96),\n  INST(kX86InstPFRcpIt1         , \"pfrcpit1\"         , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xA6),\n  INST(kX86InstPFRcpIt2         , \"pfrcpit2\"         , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xB6),\n  INST(kX86InstPFRSqIt1         , \"pfrsqit1\"         , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xA7),\n  INST(kX86InstPFRSqrt          , \"pfrsqrt\"          , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x97),\n  INST(kX86InstPFSub            , \"pfsub\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x9A),\n  INST(kX86InstPFSubR           , \"pfsubr\"           , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xAA),\n  INST(kX86InstPHAddD           , \"phaddd\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3802, 0),\n  INST(kX86InstPHAddSW          , \"phaddsw\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3803, 0),\n  INST(kX86InstPHAddW           , \"phaddw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3801, 0),\n  INST(kX86InstPHMinPOSUW       , \"phminposuw\"       , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3841, 0),\n  INST(kX86InstPHSubD           , \"phsubd\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3806, 0),\n  INST(kX86InstPHSubSW          , \"phsubsw\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3807, 0),\n  INST(kX86InstPHSubW           , \"phsubw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3805, 0),\n  INST(kX86InstPI2FD            , \"pi2fd\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x0D),\n  INST(kX86InstPI2FW            , \"pi2fw\"            , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0x0C),\n  INST(kX86InstPInsRB           , \"pinsrb\"           , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(Gd) | O(Mem)      , 0, 0x660F3A20, 0),\n  INST(kX86InstPInsRD           , \"pinsrd\"           , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(Gd) | O(Mem)      , 0, 0x660F3A22, 0),\n  INST(kX86InstPInsRQ           , \"pinsrq\"           , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(Gq) | O(Mem)      , 0, 0x660F3A22, 0),\n  INST(kX86InstPInsRW           , \"pinsrw\"           , G(MmuRmImm8)     , F(None)          , O(MmXmm)            , O(Gd) | O(Mem)      , 0, 0x00000FC4, 0),\n  INST(kX86InstPMAddUBSW        , \"pmaddubsw\"        , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3804, 0),\n  INST(kX86InstPMAddWD          , \"pmaddwd\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FF5, 0),\n  INST(kX86InstPMaxSB           , \"pmaxsb\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F383C, 0),\n  INST(kX86InstPMaxSD           , \"pmaxsd\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F383D, 0),\n  INST(kX86InstPMaxSW           , \"pmaxsw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FEE, 0),\n  INST(kX86InstPMaxUB           , \"pmaxub\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FDE, 0),\n  INST(kX86InstPMaxUD           , \"pmaxud\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F383F, 0),\n  INST(kX86InstPMaxUW           , \"pmaxuw\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F383E, 0),\n  INST(kX86InstPMinSB           , \"pminsb\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3838, 0),\n  INST(kX86InstPMinSD           , \"pminsd\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3839, 0),\n  INST(kX86InstPMinSW           , \"pminsw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FEA, 0),\n  INST(kX86InstPMinUB           , \"pminub\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FDA, 0),\n  INST(kX86InstPMinUD           , \"pminud\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F383B, 0),\n  INST(kX86InstPMinUW           , \"pminuw\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F383A, 0),\n  INST(kX86InstPMovMskB         , \"pmovmskb\"         , G(MmuRmI)        , F(Mov)           , O(Gqd)              , O(MmXmm)            , 0, 0x00000FD7, 0),\n  INST(kX86InstPMovSXBD         , \"pmovsxbd\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3821, 0),\n  INST(kX86InstPMovSXBQ         , \"pmovsxbq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3822, 0),\n  INST(kX86InstPMovSXBW         , \"pmovsxbw\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3820, 0),\n  INST(kX86InstPMovSXDQ         , \"pmovsxdq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3825, 0),\n  INST(kX86InstPMovSXWD         , \"pmovsxwd\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3823, 0),\n  INST(kX86InstPMovSXWQ         , \"pmovsxwq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3824, 0),\n  INST(kX86InstPMovZXBD         , \"pmovzxbd\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3831, 0),\n  INST(kX86InstPMovZXBQ         , \"pmovzxbq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3832, 0),\n  INST(kX86InstPMovZXBW         , \"pmovzxbw\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3830, 0),\n  INST(kX86InstPMovZXDQ         , \"pmovzxdq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3835, 0),\n  INST(kX86InstPMovZXWD         , \"pmovzxwd\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3833, 0),\n  INST(kX86InstPMovZXWQ         , \"pmovzxwq\"         , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3834, 0),\n  INST(kX86InstPMulDQ           , \"pmuldq\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3828, 0),\n  INST(kX86InstPMulHRSW         , \"pmulhrsw\"         , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F380B, 0),\n  INST(kX86InstPMulHUW          , \"pmulhuw\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FE4, 0),\n  INST(kX86InstPMulHW           , \"pmulhw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FE5, 0),\n  INST(kX86InstPMulLD           , \"pmulld\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3840, 0),\n  INST(kX86InstPMulLW           , \"pmullw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FD5, 0),\n  INST(kX86InstPMulUDQ          , \"pmuludq\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FF4, 0),\n  INST(kX86InstPop              , \"pop\"              , G(Pop)           , F(Special)       , 0                   , 0                   , 0, 0x00000058, 0x0000008F),\n  INST(kX86InstPopAD            , \"popad\"            , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x00000061, 0),\n  INST(kX86InstPopCnt           , \"popcnt\"           , G(RegRm)         , F(None)          , O(Gqdw)             , O(GqdwMem)          , 0, 0xF3000FB8, 0),\n  INST(kX86InstPopFD            , \"popfd\"            , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x0000009D, 0),\n  INST(kX86InstPopFQ            , \"popfq\"            , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x0000009D, 0),\n  INST(kX86InstPOr              , \"por\"              , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FEB, 0),\n  INST(kX86InstPrefetch         , \"prefetch\"         , G(MmuPrefetch)   , F(None)          , O(Mem)              , O(Imm)              , 0, 0         , 0),\n  INST(kX86InstPSADBW           , \"psadbw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FF6, 0),\n  INST(kX86InstPShufB           , \"pshufb\"           , G(MmuRmI)        , F(Mov)           , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3800, 0),\n  INST(kX86InstPShufD           , \"pshufd\"           , G(MmuRmImm8)     , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x66000F70, 0),\n  INST(kX86InstPShufW           , \"pshufw\"           , G(MmuRmImm8)     , F(Mov)           , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F70, 0),\n  INST(kX86InstPShufHW          , \"pshufhw\"          , G(MmuRmImm8)     , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F70, 0),\n  INST(kX86InstPShufLW          , \"pshuflw\"          , G(MmuRmImm8)     , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F70, 0),\n  INST(kX86InstPSignB           , \"psignb\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3808, 0),\n  INST(kX86InstPSignD           , \"psignd\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F380A, 0),\n  INST(kX86InstPSignW           , \"psignw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x000F3809, 0),\n  INST(kX86InstPSllD            , \"pslld\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 6, 0x00000FF2, 0x00000F72),\n  INST(kX86InstPSllDQ           , \"pslldq\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(Imm)              , 7, 0         , 0x66000F73),\n  INST(kX86InstPSllQ            , \"psllq\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 6, 0x00000FF3, 0x00000F73),\n  INST(kX86InstPSllW            , \"psllw\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 6, 0x00000FF1, 0x00000F71),\n  INST(kX86InstPSraD            , \"psrad\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 4, 0x00000FE2, 0x00000F72),\n  INST(kX86InstPSraW            , \"psraw\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 4, 0x00000FE1, 0x00000F71),\n  INST(kX86InstPSrlD            , \"psrld\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 2, 0x00000FD2, 0x00000F72),\n  INST(kX86InstPSrlDQ           , \"psrldq\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(Imm)              , 3, 0         , 0x66000F73),\n  INST(kX86InstPSrlQ            , \"psrlq\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 2, 0x00000FD3, 0x00000F73),\n  INST(kX86InstPSrlW            , \"psrlw\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)|O(Imm)  , 2, 0x00000FD1, 0x00000F71),\n  INST(kX86InstPSubB            , \"psubb\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FF8, 0),\n  INST(kX86InstPSubD            , \"psubd\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FFA, 0),\n  INST(kX86InstPSubQ            , \"psubq\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FFB, 0),\n  INST(kX86InstPSubSB           , \"psubsb\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FE8, 0),\n  INST(kX86InstPSubSW           , \"psubsw\"           , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FE9, 0),\n  INST(kX86InstPSubUSB          , \"psubusb\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FD8, 0),\n  INST(kX86InstPSubUSW          , \"psubusw\"          , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FD9, 0),\n  INST(kX86InstPSubW            , \"psubw\"            , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FF9, 0),\n  INST(kX86InstPSwapD           , \"pswapd\"           , G(MmuRm3dNow)    , F(None)          , O(Mm)               , O(MmMem)            , 0, 0x00000F0F, 0xBB),\n  INST(kX86InstPTest            , \"ptest\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3817, 0),\n  INST(kX86InstPunpckHBW        , \"punpckhbw\"        , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F68, 0),\n  INST(kX86InstPunpckHDQ        , \"punpckhdq\"        , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F6A, 0),\n  INST(kX86InstPunpckHQDQ       , \"punpckhqdq\"       , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F6D, 0),\n  INST(kX86InstPunpckHWD        , \"punpckhwd\"        , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F69, 0),\n  INST(kX86InstPunpckLBW        , \"punpcklbw\"        , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F60, 0),\n  INST(kX86InstPunpckLDQ        , \"punpckldq\"        , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F62, 0),\n  INST(kX86InstPunpckLQDQ       , \"punpcklqdq\"       , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F6C, 0),\n  INST(kX86InstPunpckLWD        , \"punpcklwd\"        , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000F61, 0),\n  INST(kX86InstPush             , \"push\"             , G(Push)          , F(Special)       , 0                   , 0                   , 6, 0x00000050, 0x000000FF),\n  INST(kX86InstPushAD           , \"pushad\"           , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x00000060, 0),\n  INST(kX86InstPushFD           , \"pushfd\"           , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x0000009C, 0),\n  INST(kX86InstPushFQ           , \"pushfq\"           , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x0000009C, 0),\n  INST(kX86InstPXor             , \"pxor\"             , G(MmuRmI)        , F(None)          , O(MmXmm)            , O(MmXmmMem)         , 0, 0x00000FEF, 0),\n  INST(kX86InstRcl              , \"rcl\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 2, 0         , 0),\n  INST(kX86InstRcpPS            , \"rcpps\"            , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x00000F53, 0),\n  INST(kX86InstRcpSS            , \"rcpss\"            , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F53, 0),\n  INST(kX86InstRcr              , \"rcr\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 3, 0         , 0),\n  INST(kX86InstRdtsc            , \"rdtsc\"            , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x00000F31, 0),\n  INST(kX86InstRdtscP           , \"rdtscp\"           , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x000F01F9, 0),\n  INST(kX86InstRepLodSB         , \"rep lodsb\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AC, 1 /* Size of mem */),\n  INST(kX86InstRepLodSD         , \"rep lodsd\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AC, 4 /* Size of mem */),\n  INST(kX86InstRepLodSQ         , \"rep lodsq\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AC, 8 /* Size of mem */),\n  INST(kX86InstRepLodSW         , \"rep lodsw\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AC, 2 /* Size of mem */),\n  INST(kX86InstRepMovSB         , \"rep movsb\"        , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A4, 1 /* Size of mem */),\n  INST(kX86InstRepMovSD         , \"rep movsd\"        , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A4, 4 /* Size of mem */),\n  INST(kX86InstRepMovSQ         , \"rep movsq\"        , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A4, 8 /* Size of mem */),\n  INST(kX86InstRepMovSW         , \"rep movsw\"        , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A4, 2 /* Size of mem */),\n  INST(kX86InstRepStoSB         , \"rep stosb\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AA, 1 /* Size of mem */),\n  INST(kX86InstRepStoSD         , \"rep stosd\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AA, 4 /* Size of mem */),\n  INST(kX86InstRepStoSQ         , \"rep stosq\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AA, 8 /* Size of mem */),\n  INST(kX86InstRepStoSW         , \"rep stosw\"        , G(Rep)           , F(Special)       , O(Mem)              , 0                   , 0, 0xF30000AA, 2 /* Size of mem */),\n  INST(kX86InstRepECmpSB        , \"repe cmpsb\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A6, 1 /* Size of mem */),\n  INST(kX86InstRepECmpSD        , \"repe cmpsd\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A6, 4 /* Size of mem */),\n  INST(kX86InstRepECmpSQ        , \"repe cmpsq\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A6, 8 /* Size of mem */),\n  INST(kX86InstRepECmpSW        , \"repe cmpsw\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000A6, 2 /* Size of mem */),\n  INST(kX86InstRepEScaSB        , \"repe scasb\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000AE, 1 /* Size of mem */),\n  INST(kX86InstRepEScaSD        , \"repe scasd\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000AE, 4 /* Size of mem */),\n  INST(kX86InstRepEScaSQ        , \"repe scasq\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000AE, 8 /* Size of mem */),\n  INST(kX86InstRepEScaSW        , \"repe scasw\"       , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF30000AE, 2 /* Size of mem */),\n  INST(kX86InstRepNECmpSB       , \"repne cmpsb\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000A6, 1 /* Size of mem */),\n  INST(kX86InstRepNECmpSD       , \"repne cmpsd\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000A6, 4 /* Size of mem */),\n  INST(kX86InstRepNECmpSQ       , \"repne cmpsq\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000A6, 8 /* Size of mem */),\n  INST(kX86InstRepNECmpSW       , \"repne cmpsw\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000A6, 2 /* Size of mem */),\n  INST(kX86InstRepNEScaSB       , \"repne scasb\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000AE, 1 /* Size of mem */),\n  INST(kX86InstRepNEScaSD       , \"repne scasd\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000AE, 4 /* Size of mem */),\n  INST(kX86InstRepNEScaSQ       , \"repne scasq\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000AE, 8 /* Size of mem */),\n  INST(kX86InstRepNEScaSW       , \"repne scasw\"      , G(Rep)           , F(Special)       , O(Mem)              , O(Mem)              , 0, 0xF20000AE, 2 /* Size of mem */),\n  INST(kX86InstRet              , \"ret\"              , G(Ret)           , F(Special)       , 0                   , 0                   , 0, 0         , 0),\n  INST(kX86InstRol              , \"rol\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 0, 0         , 0),\n  INST(kX86InstRor              , \"ror\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 1, 0         , 0),\n  INST(kX86InstRoundPD          , \"roundpd\"          , G(MmuRmImm8)     , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A09, 0),\n  INST(kX86InstRoundPS          , \"roundps\"          , G(MmuRmImm8)     , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A08, 0),\n  INST(kX86InstRoundSD          , \"roundsd\"          , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A0B, 0),\n  INST(kX86InstRoundSS          , \"roundss\"          , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x660F3A0A, 0),\n  INST(kX86InstRSqrtPS          , \"rsqrtps\"          , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x00000F52, 0),\n  INST(kX86InstRSqrtSS          , \"rsqrtss\"          , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F52, 0),\n  INST(kX86InstSahf             , \"sahf\"             , G(Emit)          , F(Special)       , 0                   , 0                   , 0, 0x0000009E, 0),\n  INST(kX86InstSal              , \"sal\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 4, 0         , 0),\n  INST(kX86InstSar              , \"sar\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 7, 0         , 0),\n  INST(kX86InstSbb              , \"sbb\"              , G(Arith)         , F(Lockable)      , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 3, 0x00000018, 0x00000080),\n  INST(kX86InstSetA             , \"seta\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F97, 0),\n  INST(kX86InstSetAE            , \"setae\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F93, 0),\n  INST(kX86InstSetB             , \"setb\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F92, 0),\n  INST(kX86InstSetBE            , \"setbe\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F96, 0),\n  INST(kX86InstSetC             , \"setc\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F92, 0),\n  INST(kX86InstSetE             , \"sete\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F94, 0),\n  INST(kX86InstSetG             , \"setg\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9F, 0),\n  INST(kX86InstSetGE            , \"setge\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9D, 0),\n  INST(kX86InstSetL             , \"setl\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9C, 0),\n  INST(kX86InstSetLE            , \"setle\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9E, 0),\n  INST(kX86InstSetNA            , \"setna\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F96, 0),\n  INST(kX86InstSetNAE           , \"setnae\"           , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F92, 0),\n  INST(kX86InstSetNB            , \"setnb\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F93, 0),\n  INST(kX86InstSetNBE           , \"setnbe\"           , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F97, 0),\n  INST(kX86InstSetNC            , \"setnc\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F93, 0),\n  INST(kX86InstSetNE            , \"setne\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F95, 0),\n  INST(kX86InstSetNG            , \"setng\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9E, 0),\n  INST(kX86InstSetNGE           , \"setnge\"           , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9C, 0),\n  INST(kX86InstSetNL            , \"setnl\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9D, 0),\n  INST(kX86InstSetNLE           , \"setnle\"           , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9F, 0),\n  INST(kX86InstSetNO            , \"setno\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F91, 0),\n  INST(kX86InstSetNP            , \"setnp\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9B, 0),\n  INST(kX86InstSetNS            , \"setns\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F99, 0),\n  INST(kX86InstSetNZ            , \"setnz\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F95, 0),\n  INST(kX86InstSetO             , \"seto\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F90, 0),\n  INST(kX86InstSetP             , \"setp\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9A, 0),\n  INST(kX86InstSetPE            , \"setpe\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9A, 0),\n  INST(kX86InstSetPO            , \"setpo\"            , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F9B, 0),\n  INST(kX86InstSetS             , \"sets\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F98, 0),\n  INST(kX86InstSetZ             , \"setz\"             , G(RmByte)        , F(None)          , O(GbMem)            , 0                   , 0, 0x00000F94, 0),\n  INST(kX86InstSFence           , \"sfence\"           , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000FAEF8, 0),\n  INST(kX86InstShl              , \"shl\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 4, 0         , 0),\n  INST(kX86InstShld             , \"shld\"             , G(ShldShrd)      , F(Special)       , O(GqdwbMem)         , O(Gb)               , 0, 0x00000FA4, 0),\n  INST(kX86InstShr              , \"shr\"              , G(Rot)           , F(Special)       , O(GqdwbMem)         , O(Gb)|O(Imm)        , 5, 0         , 0),\n  INST(kX86InstShrd             , \"shrd\"             , G(ShldShrd)      , F(Special)       , O(GqdwbMem)         , O(Gqdwb)            , 0, 0x00000FAC, 0),\n  INST(kX86InstShufPD           , \"shufpd\"           , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000FC6, 0),\n  INST(kX86InstShufPS           , \"shufps\"           , G(MmuRmImm8)     , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000FC6, 0),\n  INST(kX86InstSqrtPD           , \"sqrtpd\"           , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x66000F51, 0),\n  INST(kX86InstSqrtPS           , \"sqrtps\"           , G(MmuRmI)        , F(Mov)           , O(Xmm)              , O(XmmMem)           , 0, 0x00000F51, 0),\n  INST(kX86InstSqrtSD           , \"sqrtsd\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F51, 0),\n  INST(kX86InstSqrtSS           , \"sqrtss\"           , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F51, 0),\n  INST(kX86InstStc              , \"stc\"              , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000000F9, 0),\n  INST(kX86InstStd              , \"std\"              , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x000000FD, 0),\n  INST(kX86InstStMXCSR          , \"stmxcsr\"          , G(Mem)           , F(None)          , O(Mem)              , 0                   , 3, 0x00000FAE, 0),\n  INST(kX86InstSub              , \"sub\"              , G(Arith)         , F(Lockable)      , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 5, 0x00000028, 0x00000080),\n  INST(kX86InstSubPD            , \"subpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F5C, 0),\n  INST(kX86InstSubPS            , \"subps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F5C, 0),\n  INST(kX86InstSubSD            , \"subsd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF2000F5C, 0),\n  INST(kX86InstSubSS            , \"subss\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0xF3000F5C, 0),\n  INST(kX86InstTest             , \"test\"             , G(Test)          , F(None)          , O(GqdwbMem)         , O(Gqdwb)|O(Imm)     , 0, 0         , 0),\n  INST(kX86InstUComISD          , \"ucomisd\"          , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F2E, 0),\n  INST(kX86InstUComISS          , \"ucomiss\"          , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F2E, 0),\n  INST(kX86InstUd2              , \"ud2\"              , G(Emit)          , F(None)          , 0                   , 0                   , 0, 0x00000F0B, 0),\n  INST(kX86InstUnpckHPD         , \"unpckhpd\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F15, 0),\n  INST(kX86InstUnpckHPS         , \"unpckhps\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F15, 0),\n  INST(kX86InstUnpckLPD         , \"unpcklpd\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F14, 0),\n  INST(kX86InstUnpckLPS         , \"unpcklps\"         , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F14, 0),\n  INST(kX86InstXadd             , \"xadd\"             , G(RmReg)         , F(Lockable)      , O(GqdwbMem)         , O(Gqdwb)            , 0, 0x00000FC0, 0),\n  INST(kX86InstXchg             , \"xchg\"             , G(Xchg)          , F(Lockable)      , O(GqdwbMem)         , O(Gqdwb)            , 0, 0         , 0),\n  INST(kX86InstXor              , \"xor\"              , G(Arith)         , F(Lockable)      , O(GqdwbMem)         , O(GqdwbMem)|O(Imm)  , 6, 0x00000030, 0x00000080),\n  INST(kX86InstXorPD            , \"xorpd\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x66000F57, 0),\n  INST(kX86InstXorPS            , \"xorps\"            , G(MmuRmI)        , F(None)          , O(Xmm)              , O(XmmMem)           , 0, 0x00000F57, 0)\n};\n\n#undef G\n#undef F\n#undef O\n\n#undef INST\n\n// ============================================================================\n// [AsmJit::x86VarInfo]\n// ============================================================================\n\n#define C(_Class_) kX86VarClass##_Class_\n#define F(_Flag_) kX86VarFlag##_Flag_\n\nconst X86VarInfo x86VarInfo[] = \n{\n  /*  0 */ { kX86RegTypeGpd   , 4 , C(Gp) , 0                , \"Gpd\"         },\n  /*  1 */ { kX86RegTypeGpq   , 8 , C(Gp) , 0                , \"Gpq\"         },\n  /*  2 */ { kX86RegTypeX87   , 4 , C(X87), F(SP)            , \"X87\"         },\n  /*  3 */ { kX86RegTypeX87   , 4 , C(X87), F(SP)            , \"X87.SS\"      },\n  /*  4 */ { kX86RegTypeX87   , 8 , C(X87), F(DP)            , \"X87.SD\"      },\n  /*  5 */ { kX86RegTypeMm    , 8 , C(Mm) , 0                , \"Mm\"          },\n  /*  6 */ { kX86RegTypeXmm   , 16, C(Xmm), 0                , \"Xmm\"         },\n  /*  7 */ { kX86RegTypeXmm   , 4 , C(Xmm), F(SP)            , \"Xmm.SS\"      },\n  /*  8 */ { kX86RegTypeXmm   , 8 , C(Xmm), F(DP)            , \"Xmm.SD\"      },\n  /*  9 */ { kX86RegTypeXmm   , 16, C(Xmm), F(SP) | F(Packed), \"Xmm.PS\"      },\n  /* 10 */ { kX86RegTypeXmm   , 16, C(Xmm), F(DP) | F(Packed), \"Xmm.PD\"      }\n};\n\n#undef F\n#undef C\n\n} // AsmJit namespace\n\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86defs.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86DEFS_H\n#define _ASMJIT_X86_X86DEFS_H\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::kX86Feature]\n// ============================================================================\n\n//! @brief X86 CPU features.\nenum kX86Feature\n{\n  //! @brief Cpu has RDTSC instruction.\n  kX86FeatureRdtsc = 1U << 0,\n  //! @brief Cpu has RDTSCP instruction.\n  kX86FeatureRdtscP = 1U << 1,\n  //! @brief Cpu has CMOV instruction (conditional move)\n  kX86FeatureCMov = 1U << 2,\n  //! @brief Cpu has CMPXCHG8B instruction\n  kX86FeatureCmpXchg8B = 1U << 3,\n  //! @brief Cpu has CMPXCHG16B instruction (64-bit processors)\n  kX86FeatureCmpXchg16B = 1U << 4,\n  //! @brief Cpu has CLFUSH instruction\n  kX86FeatureClFlush = 1U << 5,\n  //! @brief Cpu has PREFETCH instruction\n  kX86FeaturePrefetch = 1U << 6,\n  //! @brief Cpu supports LAHF and SAHF instrictions.\n  kX86FeatureLahfSahf = 1U << 7,\n  //! @brief Cpu supports FXSAVE and FXRSTOR instructions.\n  kX86FeatureFXSR = 1U << 8,\n  //! @brief Cpu supports FXSAVE and FXRSTOR instruction optimizations (FFXSR).\n  kX86FeatureFFXSR = 1U << 9,\n  //! @brief Cpu has MMX.\n  kX86FeatureMmx = 1U << 10,\n  //! @brief Cpu has extended MMX.\n  kX86FeatureMmxExt = 1U << 11,\n  //! @brief Cpu has 3dNow!\n  kX86Feature3dNow = 1U << 12,\n  //! @brief Cpu has enchanced 3dNow!\n  kX86Feature3dNowExt = 1U << 13,\n  //! @brief Cpu has SSE.\n  kX86FeatureSse = 1U << 14,\n  //! @brief Cpu has SSE2.\n  kX86FeatureSse2 = 1U << 15,\n  //! @brief Cpu has SSE3.\n  kX86FeatureSse3 = 1U << 16,\n  //! @brief Cpu has Supplemental SSE3 (SSSE3).\n  kX86FeatureSsse3 = 1U << 17,\n  //! @brief Cpu has SSE4.A.\n  kX86FeatureSse4A = 1U << 18,\n  //! @brief Cpu has SSE4.1.\n  kX86FeatureSse41 = 1U << 19,\n  //! @brief Cpu has SSE4.2.\n  kX86FeatureSse42 = 1U << 20,\n  //! @brief Cpu has AVX.\n  kX86FeatureAvx = 1U << 22,\n  //! @brief Cpu has Misaligned SSE (MSSE).\n  kX86FeatureMSse = 1U << 23,\n  //! @brief Cpu supports MONITOR and MWAIT instructions.\n  kX86FeatureMonitorMWait = 1U << 24,\n  //! @brief Cpu supports MOVBE instruction.\n  kX86FeatureMovBE = 1U << 25,\n  //! @brief Cpu supports POPCNT instruction.\n  kX86FeaturePopCnt = 1U << 26,\n  //! @brief Cpu supports LZCNT instruction.\n  kX86FeatureLzCnt = 1U << 27,\n  //! @brief Cpu supports PCLMULDQ set of instructions.\n  kX86FeaturePclMulDQ  = 1U << 28,\n  //! @brief Cpu supports multithreading.\n  kX86FeatureMultiThreading = 1U << 29,\n  //! @brief Cpu supports execute disable bit (execute protection).\n  kX86FeatureExecuteDisableBit = 1U << 30,\n  //! @brief 64-bit CPU.\n  kX86Feature64Bit = 1U << 31\n};\n\n// ============================================================================\n// [AsmJit::kX86Bug]\n// ============================================================================\n\n//! @brief X86 CPU bugs.\nenum kX86Bug\n{\n  //! @brief Whether the processor contains bug seen in some \n  //! AMD-Opteron processors.\n  kX86BugAmdLockMB = 1U << 0\n};\n\n// ============================================================================\n// [AsmJit::kX86Property]\n// ============================================================================\n\n//! @brief @ref X86Assembler and @ref X86Compiler properties.\nenum kX86Property\n{\n  //! @brief Optimize align for current processor.\n  //!\n  //! Default: @c true.\n  kX86PropertyOptimizedAlign = 0,\n\n  //! @brief Emit hints added to jcc() instructions.\n  //!\n  //! Default: @c true.\n  kX86PropertyJumpHints = 1\n};\n\n// ============================================================================\n// [AsmJit::kX86Seg]\n// ============================================================================\n\n//! @brief X86 segment codes.\nenum kX86Seg\n{\n  // DO NOT MODIFY INDEX CODES - They are used by _emitSegmentPrefix() and\n  // by logger in the following order:\n\n  //! @brief ES segment.\n  kX86SegEs = 0,\n  //! @brief CS segment.\n  kX86SegCs = 1,\n  //! @brief SS segment.\n  kX86SegSs = 2,\n  //! @brief DS segment.\n  kX86SegDs = 3,\n  //! @brief FS segment.\n  kX86SegFs = 4,\n  //! @brief GS segment.\n  kX86SegGs = 5,\n  //! @brief Count of segments.\n  kX86SegCount = 6,\n\n  //! @brief No segment override prefix.\n  kX86SegNone = 0xF\n};\n\n// ============================================================================\n// [AsmJit::kX86RegNum]\n// ============================================================================\n\n//! @brief X86 registers count.\n//!\n//! Count of general purpose registers and XMM registers depends on current\n//! mode. If application is compiled for 32-bit platform then this number is 8,\n//! 64-bit platforms have 8 extra general purpose and XMM registers (16 total).\nenum kX86RegNum\n{\n  //! @var kX86RegNumBase\n  //!\n  //! Count of general purpose registers and XMM registers depends on current\n  //! bit-mode. If application is compiled for 32-bit platform then this number\n  //! is 8, 64-bit platforms have 8 extra general purpose and XMM registers (16\n  //! total).\n#if defined(ASMJIT_X86)\n  kX86RegNumBase = 8,\n#else\n  kX86RegNumBase = 16,\n#endif // ASMJIT\n\n  //! @brief Count of general purpose registers.\n  //!\n  //! 8 in 32-bit mode and 16 in 64-bit mode.\n  kX86RegNumGp = kX86RegNumBase,\n\n  //! @brief Count of FPU stack registers (always 8).\n  kX86RegNumX87 = 8,\n  //! @brief Count of MM registers (always 8).\n  kX86RegNumMm = 8,\n\n  //! @brief Count of XMM registers.\n  //!\n  //! 8 in 32-bit mode and 16 in 64-bit mode.\n  kX86RegNumXmm = kX86RegNumBase,\n  //! @brief Count of YMM registers.\n  //!\n  //! 8 in 32-bit mode and 16 in 64-bit mode.\n  kX86RegNumYmm = kX86RegNumBase,\n\n  //! @brief Count of segment registers, including no segment (AsmJit specific).\n  //!\n  //! @note There are 6 segment registers, but AsmJit uses 0 as no segment, and\n  //! 1...6 as segment registers, this means that there are 7 segment registers\n  //! in AsmJit API, but only 6 can be used through @c Assembler or @c Compiler\n  //! API.\n  kX86RegNumSeg = 7\n};\n\n//! @brief X86 register types.\nenum kX86RegType\n{\n  // First byte contains register type (mask 0xFF00), Second byte contains\n  // register index code.\n\n  // --------------------------------------------------------------------------\n  // [GP Register Types]\n  // --------------------------------------------------------------------------\n\n  //! @brief 8-bit general purpose register type (LO).\n  kX86RegTypeGpbLo = 0x0100,\n  //! @brief 8-bit general purpose register type (HI, only AH, BH, CH, DH).\n  kX86RegTypeGpbHi = 0x0200,\n  //! @brief 16-bit general purpose register type.\n  kX86RegTypeGpw = 0x1000,\n  //! @brief 32-bit general purpose register type.\n  kX86RegTypeGpd = 0x2000,\n  //! @brief 64-bit general purpose register type.\n  kX86RegTypeGpq = 0x3000,\n\n  //! @var kX86RegTypeGpz\n  //! @brief 32-bit or 64-bit general purpose register type.\n#if defined(ASMJIT_X86)\n  kX86RegTypeGpz = kX86RegTypeGpd,\n#else\n  kX86RegTypeGpz = kX86RegTypeGpq,\n#endif\n\n  //! @brief X87 (FPU) register type.\n  kX86RegTypeX87 = 0x5000,\n  //! @brief 64-bit MM register type.\n  kX86RegTypeMm = 0x6000,\n\n  //! @brief 128-bit XMM register type.\n  kX86RegTypeXmm = 0x7000,\n  //! @brief 256-bit YMM register type.\n  kX86RegTypeYmm = 0x8000,\n\n  //! @brief 16-bit segment register type.\n  kX86RegTypeSeg = 0xD000\n};\n\n// ============================================================================\n// [AsmJit::kX86RegIndex]\n// ============================================================================\n\n//! @brief X86 register indices.\n//!\n//! These codes are real, don't miss with @c REG enum! and don't use these\n//! values if you are not writing AsmJit code.\nenum kX86RegIndex\n{\n  //! @brief ID for AX/EAX/RAX registers.\n  kX86RegIndexEax = 0,\n  //! @brief ID for CX/ECX/RCX registers.\n  kX86RegIndexEcx = 1,\n  //! @brief ID for DX/EDX/RDX registers.\n  kX86RegIndexEdx = 2,\n  //! @brief ID for BX/EBX/RBX registers.\n  kX86RegIndexEbx = 3,\n  //! @brief ID for SP/ESP/RSP registers.\n  kX86RegIndexEsp = 4,\n  //! @brief ID for BP/EBP/RBP registers.\n  kX86RegIndexEbp = 5,\n  //! @brief ID for SI/ESI/RSI registers.\n  kX86RegIndexEsi = 6,\n  //! @brief ID for DI/EDI/RDI registers.\n  kX86RegIndexEdi = 7,\n\n  //! @brief ID for AX/EAX/RAX registers.\n  kX86RegIndexRax = 0,\n  //! @brief ID for CX/ECX/RCX registers.\n  kX86RegIndexRcx = 1,\n  //! @brief ID for DX/EDX/RDX registers.\n  kX86RegIndexRdx = 2,\n  //! @brief ID for BX/EBX/RBX registers.\n  kX86RegIndexRbx = 3,\n  //! @brief ID for SP/ESP/RSP registers.\n  kX86RegIndexRsp = 4,\n  //! @brief ID for BP/EBP/RBP registers.\n  kX86RegIndexRbp = 5,\n  //! @brief ID for SI/ESI/RSI registers.\n  kX86RegIndexRsi = 6,\n  //! @brief ID for DI/EDI/RDI registers.\n  kX86RegIndexRdi = 7,\n\n  //! @brief ID for r8 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR8 = 8,\n  //! @brief ID for R9 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR9 = 9,\n  //! @brief ID for R10 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR10 = 10,\n  //! @brief ID for R11 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR11 = 11,\n  //! @brief ID for R12 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR12 = 12,\n  //! @brief ID for R13 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR13 = 13,\n  //! @brief ID for R14 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR14 = 14,\n  //! @brief ID for R15 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexR15 = 15,\n\n  //! @brief ID for mm0 register.\n  kX86RegIndexMm0 = 0,\n  //! @brief ID for mm1 register.\n  kX86RegIndexMm1 = 1,\n  //! @brief ID for mm2 register.\n  kX86RegIndexMm2 = 2,\n  //! @brief ID for mm3 register.\n  kX86RegIndexMm3 = 3,\n  //! @brief ID for mm4 register.\n  kX86RegIndexMm4 = 4,\n  //! @brief ID for mm5 register.\n  kX86RegIndexMm5 = 5,\n  //! @brief ID for mm6 register.\n  kX86RegIndexMm6 = 6,\n  //! @brief ID for mm7 register.\n  kX86RegIndexMm7 = 7,\n\n  //! @brief ID for xmm0 register.\n  kX86RegIndexXmm0 = 0,\n  //! @brief ID for xmm1 register.\n  kX86RegIndexXmm1 = 1,\n  //! @brief ID for xmm2 register.\n  kX86RegIndexXmm2 = 2,\n  //! @brief ID for xmm3 register.\n  kX86RegIndexXmm3 = 3,\n  //! @brief ID for xmm4 register.\n  kX86RegIndexXmm4 = 4,\n  //! @brief ID for xmm5 register.\n  kX86RegIndexXmm5 = 5,\n  //! @brief ID for xmm6 register.\n  kX86RegIndexXmm6 = 6,\n  //! @brief ID for xmm7 register.\n  kX86RegIndexXmm7 = 7,\n\n  //! @brief ID for xmm8 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm8 = 8,\n  //! @brief ID for xmm9 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm9 = 9,\n  //! @brief ID for xmm10 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm10 = 10,\n  //! @brief ID for xmm11 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm11 = 11,\n  //! @brief ID for xmm12 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm12 = 12,\n  //! @brief ID for xmm13 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm13 = 13,\n  //! @brief ID for xmm14 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm14 = 14,\n  //! @brief ID for xmm15 register (additional register introduced by 64-bit architecture).\n  kX86RegIndexXmm15 = 15,\n\n  //! @brief ID for ES segment register.\n  kX86RegIndexEs = 0,\n  //! @brief ID for CS segment register.\n  kX86RegIndexCs = 1,\n  //! @brief ID for SS segment register.\n  kX86RegIndexSs = 2,\n  //! @brief ID for DS segment register.\n  kX86RegIndexDs = 3,\n  //! @brief ID for FS segment register.\n  kX86RegIndexFs = 4,\n  //! @brief ID for GS segment register.\n  kX86RegIndexGs = 5\n};\n\n// ============================================================================\n// [AsmJit::kX86RegCode]\n// ============================================================================\n\n//! @brief X86 pseudo (not real X86) register codes used for generating opcodes.\n//!\n//! From this register code can be generated real x86 register ID, type of\n//! register and size of register.\nenum kX86RegCode\n{\n  // --------------------------------------------------------------------------\n  // [8-bit Registers]\n  // --------------------------------------------------------------------------\n\n  kX86RegAl = kX86RegTypeGpbLo,\n  kX86RegCl,\n  kX86RegDl,\n  kX86RegBl,\n#if defined(ASMJIT_X64)\n  kX86RegSpl,\n  kX86RegBpl,\n  kX86RegSil,\n  kX86RegDil,\n#endif // ASMJIT_X64\n\n#if defined(ASMJIT_X64)\n  kX86RegR8b,\n  kX86RegR9b,\n  kX86RegR10b,\n  kX86RegR11b,\n  kX86RegR12b,\n  kX86RegR13b,\n  kX86RegR14b,\n  kX86RegR15b,\n#endif // ASMJIT_X64\n\n  kX86RegAh = kX86RegTypeGpbHi,\n  kX86RegCh,\n  kX86RegDh,\n  kX86RegBh,\n\n  // --------------------------------------------------------------------------\n  // [16-bit Registers]\n  // --------------------------------------------------------------------------\n\n  kX86RegAx = kX86RegTypeGpw,\n  kX86RegCx,\n  kX86RegDx,\n  kX86RegBx,\n  kX86RegSp,\n  kX86RegBp,\n  kX86RegSi,\n  kX86RegDi,\n#if defined(ASMJIT_X64)\n  kX86RegR8w,\n  kX86RegR9w,\n  kX86RegR10w,\n  kX86RegR11w,\n  kX86RegR12w,\n  kX86RegR13w,\n  kX86RegR14w,\n  kX86RegR15w,\n#endif // ASMJIT_X64\n\n  // --------------------------------------------------------------------------\n  // [32-bit Registers]\n  // --------------------------------------------------------------------------\n\n  kX86RegEax = kX86RegTypeGpd,\n  kX86RegEcx,\n  kX86RegEdx,\n  kX86RegEbx,\n  kX86RegEsp,\n  kX86RegEbp,\n  kX86RegEsi,\n  kX86RegEdi,\n#if defined(ASMJIT_X64)\n  kX86RegR8d,\n  kX86RegR9d,\n  kX86RegR10d,\n  kX86RegR11d,\n  kX86RegR12d,\n  kX86RegR13d,\n  kX86RegR14d,\n  kX86RegR15d,\n#endif // ASMJIT_X64\n\n  // --------------------------------------------------------------------------\n  // [64-bit Registers]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_X64)\n  kX86RegRax = kX86RegTypeGpq,\n  kX86RegRcx,\n  kX86RegRdx,\n  kX86RegRbx,\n  kX86RegRsp,\n  kX86RegRbp,\n  kX86RegRsi,\n  kX86RegRdi,\n  kX86RegR8,\n  kX86RegR9,\n  kX86RegR10,\n  kX86RegR11,\n  kX86RegR12,\n  kX86RegR13,\n  kX86RegR14,\n  kX86RegR15,\n#endif // ASMJIT_X64\n\n  // --------------------------------------------------------------------------\n  // [MM Registers]\n  // --------------------------------------------------------------------------\n\n  kX86RegMm0 = kX86RegTypeMm,\n  kX86RegMm1,\n  kX86RegMm2,\n  kX86RegMm3,\n  kX86RegMm4,\n  kX86RegMm5,\n  kX86RegMm6,\n  kX86RegMm7,\n\n  // --------------------------------------------------------------------------\n  // [XMM Registers]\n  // --------------------------------------------------------------------------\n\n  kX86RegXmm0 = kX86RegTypeXmm,\n  kX86RegXmm1,\n  kX86RegXmm2,\n  kX86RegXmm3,\n  kX86RegXmm4,\n  kX86RegXmm5,\n  kX86RegXmm6,\n  kX86RegXmm7,\n#if defined(ASMJIT_X64)\n  kX86RegXmm8,\n  kX86RegXmm9,\n  kX86RegXmm10,\n  kX86RegXmm11,\n  kX86RegXmm12,\n  kX86RegXmm13,\n  kX86RegXmm14,\n  kX86RegXmm15,\n#endif // ASMJIT_X64\n\n  // --------------------------------------------------------------------------\n  // [Native registers (depends on 32-bit or 64-bit mode)]\n  // --------------------------------------------------------------------------\n\n  kX86RegZax = kX86RegTypeGpz,\n  kX86RegZcx,\n  kX86RegZdx,\n  kX86RegZbx,\n  kX86RegZsp,\n  kX86RegZbp,\n  kX86RegZsi,\n  kX86RegZdi,\n\n  // --------------------------------------------------------------------------\n  // [Segment registers]\n  // --------------------------------------------------------------------------\n\n  //! @brief ES segment register.\n  kX86RegEs = kX86RegTypeSeg,\n  //! @brief CS segment register.\n  kX86RegCs,\n  //! @brief SS segment register.\n  kX86RegSs,\n  //! @brief DS segment register.\n  kX86RegDs,\n  //! @brief FS segment register.\n  kX86RegFs,\n  //! @brief GS segment register.\n  kX86RegGs\n};\n\n// ============================================================================\n// [AsmJit::kX86Cond]\n// ============================================================================\n\n//! @brief X86 Condition codes.\nenum kX86Cond\n{\n  // Condition codes from processor manuals.\n  kX86CondA               = 0x07,\n  kX86CondAE              = 0x03,\n  kX86CondB               = 0x02,\n  kX86CondBE              = 0x06,\n  kX86CondC               = 0x02,\n  kX86CondE               = 0x04,\n  kX86CondG               = 0x0F,\n  kX86CondGE              = 0x0D,\n  kX86CondL               = 0x0C,\n  kX86CondLE              = 0x0E,\n  kX86CondNA              = 0x06,\n  kX86CondNAE             = 0x02,\n  kX86CondNB              = 0x03,\n  kX86CondNBE             = 0x07,\n  kX86CondNC              = 0x03,\n  kX86CondNE              = 0x05,\n  kX86CondNG              = 0x0E,\n  kX86CondNGE             = 0x0C,\n  kX86CondNL              = 0x0D,\n  kX86CondNLE             = 0x0F,\n  kX86CondNO              = 0x01,\n  kX86CondNP              = 0x0B,\n  kX86CondNS              = 0x09,\n  kX86CondNZ              = 0x05,\n  kX86CondO               = 0x00,\n  kX86CondP               = 0x0A,\n  kX86CondPE              = 0x0A,\n  kX86CondPO              = 0x0B,\n  kX86CondS               = 0x08,\n  kX86CondZ               = 0x04,\n\n  // Simplified condition codes.\n  kX86CondOverflow        = 0x00,\n  kX86CondNotOverflow     = 0x01,\n  kX86CondBelow           = 0x02,\n  kX86CondAboveEqual      = 0x03,\n  kX86CondEqual           = 0x04,\n  kX86CondNotEqual        = 0x05,\n  kX86CondBelowEqual      = 0x06,\n  kX86CondAbove           = 0x07,\n  kX86CondSign            = 0x08,\n  kX86CondNotSign         = 0x09,\n  kX86CondParityEven      = 0x0A,\n  kX86CondParityOdd       = 0x0B,\n  kX86CondLess            = 0x0C,\n  kX86CondGreaterEqual    = 0x0D,\n  kX86CondLessEqual       = 0x0E,\n  kX86CondGreater         = 0x0F,\n\n  // Aliases.\n  kX86CondZero            = 0x04,\n  kX86CondNotZero         = 0x05,\n  kX86CondNegative        = 0x08,\n  kX86CondPositive        = 0x09,\n\n  // X87 floating point only.\n  kX86CondFpuUnordered    = 0x10,\n  kX86CondFpuNotUnordered = 0x11,\n\n  //! @brief No condition code.\n  kX86CondNone            = 0x12\n};\n\n// ============================================================================\n// [AsmJit::kX86CondPrefix]\n// ============================================================================\n\n//! @brief X86 condition hint prefix code, see @ref kCondHint.\nenum kX86CondPrefix\n{\n  //! @brief Condition is likely to be taken.\n  kX86CondPrefixLikely = 0x3E,\n  //! @brief Condition is unlikely to be taken.\n  kX86CondPrefixUnlikely = 0x2E\n};\n\n// ============================================================================\n// [AsmJit::kX86PrefetchHint]\n// ============================================================================\n\n//! @brief X86 Prefetch hints.\nenum kX86PrefetchHint\n{\n  //! @brief Prefetch using NT hint.\n  kX86PrefetchNta = 0,\n  //! @brief Prefetch to L0 cache.\n  kX86PrefetchT0 = 1,\n  //! @brief Prefetch to L1 cache.\n  kX86PrefetchT1 = 2,\n  //! @brief Prefetch to L2 cache.\n  kX86PrefetchT2 = 3\n};\n\n// ============================================================================\n// [AsmJit::kX86FPSW]\n// ============================================================================\n\n//! @brief X86 FPU status-word.\nenum kX86FPSW\n{\n  kX86FPSW_Invalid        = 0x0001,\n  kX86FPSW_Denormalized   = 0x0002,\n  kX86FPSW_DivByZero      = 0x0004,\n  kX86FPSW_Overflow       = 0x0008,\n  kX86FPSW_Underflow      = 0x0010,\n  kX86FPSW_Precision      = 0x0020,\n  kX86FPSW_StackFault     = 0x0040,\n  kX86FPSW_Interrupt      = 0x0080,\n  kX86FPSW_C0             = 0x0100,\n  kX86FPSW_C1             = 0x0200,\n  kX86FPSW_C2             = 0x0400,\n  kX86FPSW_Top            = 0x3800,\n  kX86FPSW_C3             = 0x4000,\n  kX86FPSW_Busy           = 0x8000\n};\n\n// ============================================================================\n// [AsmJit::kX86FPCW]\n// ============================================================================\n\n//! @brief X86 FPU control-word.\nenum kX86FPCW\n{\n  // --------------------------------------------------------------------------\n  // [Exception-Mask]\n  // --------------------------------------------------------------------------\n\n  kX86FPCW_EM_Mask        = 0x003F, // Bits 0-5.\n\n  kX86FPCW_EM_Invalid     = 0x0001,\n  kX86FPCW_EM_Denormal    = 0x0002,\n  kX86FPCW_EM_DivByZero   = 0x0004,\n  kX86FPCW_EM_Overflow    = 0x0008,\n  kX86FPCW_EM_Underflow   = 0x0010,\n  kX86FPCW_EM_Inexact     = 0x0020,\n\n  // --------------------------------------------------------------------------\n  // [Precision-Control]\n  // --------------------------------------------------------------------------\n\n  kX86FPCW_PC_Mask        = 0x0300, // Bits 8-9.\n\n  kX86FPCW_PC_Float       = 0x0000,\n  kX86FPCW_PC_Reserved    = 0x0100,\n  kX86FPCW_PC_Double      = 0x0200,\n  kX86FPCW_PC_Extended    = 0x0300,\n\n  // --------------------------------------------------------------------------\n  // [Rounding-Control]\n  // --------------------------------------------------------------------------\n\n  kX86FPCW_RC_Mask        = 0x0C00, // Bits 10-11.\n\n  kX86FPCW_RC_Nearest     = 0x0000,\n  kX86FPCW_RC_Down        = 0x0400,\n  kX86FPCW_RC_Up          = 0x0800,\n  kX86FPCW_RC_Truncate    = 0x0C00,\n\n  // --------------------------------------------------------------------------\n  // [Infinity-Control]\n  // --------------------------------------------------------------------------\n\n  kX86FPCW_IC_Mask        = 0x1000, // Bit 12.\n\n  kX86FPCW_IC_Projective  = 0x0000,\n  kX86FPCW_IC_Affine      = 0x1000\n};\n\n// ============================================================================\n// [AsmJit::kX86EmitOption]\n// ============================================================================\n\n//! @brief Emit options, mainly for internal purposes.\nenum kX86EmitOption\n{\n  //! @brief Force REX prefix to be emitted.\n  //!\n  //! This option should be used carefully, because there are unencodable\n  //! combinations. If you want to access ah, bh, ch or dh registers then you\n  //! can't emit REX prefix and it will cause an illegal instruction error.\n  kX86EmitOptionRex = 0x1,\n\n  //! @brief Tell @c Assembler or @c Compiler to emit and validate lock prefix.\n  //!\n  //! If this option is used and instruction doesn't support LOCK prefix then\n  //! invalid instruction error is generated.\n  kX86EmitOptionLock = 0x2,\n\n  //! @brief Emit short/near jump or conditional jump instead of far one to\n  //! some bytes.\n  //!\n  //! @note This option could be dangerous in case that the short jump is not\n  //! possible (displacement can't fit into signed 8-bit integer). AsmJit can\n  //! automatically generate back short jumps, but always generates long forward\n  //! jumps, because the information about the code size between the instruction\n  //! and target is not known.\n  kX86EmitOptionShortJump = 0x4,\n\n  //! @brief Emit full immediate instead of BYTE in all cases.\n  //!\n  //! @note AsmJit is able to emit both forms of immediate value. In case that\n  //! the instruction supports short form and immediate can fit into a signed \n  //! 8-bit integer short for is preferred, but if for any reason the full form\n  //! is required it can be overridden by using this option.\n  kX86EmitOptionFullImmediate = 0x8\n};\n\n// ============================================================================\n// [AsmJit::kX86InstCode]\n// ============================================================================\n\n//! @brief X86 instruction codes.\n//!\n//! Note that these instruction codes are AsmJit specific. Each instruction is\n//! unique ID into AsmJit instruction table. Instruction codes are used together\n//! with AsmJit::Assembler and you can also use instruction codes to serialize\n//! instructions by @ref Assembler::_emitInstruction() or\n//! @ref Compiler::_emitInstruction()\nenum kX86InstCode\n{\n  kX86InstAdc = 1,         // X86/X64\n  kX86InstAdd,             // X86/X64\n  kX86InstAddPD,           // SSE2\n  kX86InstAddPS,           // SSE\n  kX86InstAddSD,           // SSE2\n  kX86InstAddSS,           // SSE\n  kX86InstAddSubPD,        // SSE3\n  kX86InstAddSubPS,        // SSE3\n  kX86InstAmdPrefetch,     // 3dNow!\n  kX86InstAmdPrefetchW,    // 3dNow!\n  kX86InstAnd,             // X86/X64\n  kX86InstAndnPD,          // SSE2\n  kX86InstAndnPS,          // SSE\n  kX86InstAndPD,           // SSE2\n  kX86InstAndPS,           // SSE\n  kX86InstBlendPD,         // SSE4.1\n  kX86InstBlendPS,         // SSE4.1\n  kX86InstBlendVPD,        // SSE4.1\n  kX86InstBlendVPS,        // SSE4.1\n  kX86InstBsf,             // X86/X64\n  kX86InstBsr,             // X86/X64\n  kX86InstBSwap,           // X86/X64 (i486)\n  kX86InstBt,              // X86/X64\n  kX86InstBtc,             // X86/X64\n  kX86InstBtr,             // X86/X64\n  kX86InstBts,             // X86/X64\n  kX86InstCall,            // X86/X64\n  kX86InstCbw,             // X86/X64\n  kX86InstCdq,             // X86/X64\n  kX86InstCdqe,            // X64 only\n  kX86InstClc,             // X86/X64\n  kX86InstCld,             // X86/X64\n  kX86InstClFlush,         // SSE2\n  kX86InstCmc,             // X86/X64\n\n  kX86InstCMov,            // Begin (cmovcc) (i586)\n  kX86InstCMovA=kX86InstCMov,//X86/X64 (cmovcc) (i586)\n  kX86InstCMovAE,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovB,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovBE,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovC,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovE,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovG,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovGE,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovL,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovLE,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNA,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNAE,         // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNB,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNBE,         // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNC,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNE,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNG,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNGE,         // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNL,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNLE,         // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNO,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNP,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNS,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovNZ,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovO,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovP,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovPE,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovPO,          // X86/X64 (cmovcc) (i586)\n  kX86InstCMovS,           // X86/X64 (cmovcc) (i586)\n  kX86InstCMovZ,           // X86/X64 (cmovcc) (i586)\n\n  kX86InstCmp,             // X86/X64\n  kX86InstCmpPD,           // SSE2\n  kX86InstCmpPS,           // SSE\n  kX86InstCmpSD,           // SSE2\n  kX86InstCmpSS,           // SSE\n  kX86InstCmpXCHG,         // X86/X64 (i486)\n  kX86InstCmpXCHG16B,      // X64 only\n  kX86InstCmpXCHG8B,       // X86/X64 (i586)\n  kX86InstComISD,          // SSE2\n  kX86InstComISS,          // SSE\n  kX86InstCpuId,           // X86/X64 (i486)\n  kX86InstCqo,             // X64 only\n  kX86InstCrc32,           // SSE4.2\n  kX86InstCvtDQ2PD,        // SSE2\n  kX86InstCvtDQ2PS,        // SSE2\n  kX86InstCvtPD2DQ,        // SSE2\n  kX86InstCvtPD2PI,        // SSE2\n  kX86InstCvtPD2PS,        // SSE2\n  kX86InstCvtPI2PD,        // SSE2\n  kX86InstCvtPI2PS,        // SSE\n  kX86InstCvtPS2DQ,        // SSE2\n  kX86InstCvtPS2PD,        // SSE2\n  kX86InstCvtPS2PI,        // SSE\n  kX86InstCvtSD2SI,        // SSE2\n  kX86InstCvtSD2SS,        // SSE2\n  kX86InstCvtSI2SD,        // SSE2\n  kX86InstCvtSI2SS,        // SSE\n  kX86InstCvtSS2SD,        // SSE2\n  kX86InstCvtSS2SI,        // SSE\n  kX86InstCvttPD2DQ,       // SSE2\n  kX86InstCvttPD2PI,       // SSE2\n  kX86InstCvttPS2DQ,       // SSE2\n  kX86InstCvttPS2PI,       // SSE\n  kX86InstCvttSD2SI,       // SSE2\n  kX86InstCvttSS2SI,       // SSE\n  kX86InstCwd,             // X86/X64\n  kX86InstCwde,            // X86/X64\n  kX86InstDaa,             // X86 only\n  kX86InstDas,             // X86 only\n  kX86InstDec,             // X86/X64\n  kX86InstDiv,             // X86/X64\n  kX86InstDivPD,           // SSE2\n  kX86InstDivPS,           // SSE\n  kX86InstDivSD,           // SSE2\n  kX86InstDivSS,           // SSE\n  kX86InstDpPD,            // SSE4.1\n  kX86InstDpPS,            // SSE4.1\n  kX86InstEmms,            // MMX\n  kX86InstEnter,           // X86/X64\n  kX86InstExtractPS,       // SSE4.1\n  kX86InstF2XM1,           // X87\n  kX86InstFAbs,            // X87\n  kX86InstFAdd,            // X87\n  kX86InstFAddP,           // X87\n  kX86InstFBLd,            // X87\n  kX86InstFBStP,           // X87\n  kX86InstFCHS,            // X87\n  kX86InstFClex,           // X87\n  kX86InstFCMovB,          // X87\n  kX86InstFCMovBE,         // X87\n  kX86InstFCMovE,          // X87\n  kX86InstFCMovNB,         // X87\n  kX86InstFCMovNBE,        // X87\n  kX86InstFCMovNE,         // X87\n  kX86InstFCMovNU,         // X87\n  kX86InstFCMovU,          // X87\n  kX86InstFCom,            // X87\n  kX86InstFComI,           // X87\n  kX86InstFComIP,          // X87\n  kX86InstFComP,           // X87\n  kX86InstFComPP,          // X87\n  kX86InstFCos,            // X87\n  kX86InstFDecStP,         // X87\n  kX86InstFDiv,            // X87\n  kX86InstFDivP,           // X87\n  kX86InstFDivR,           // X87\n  kX86InstFDivRP,          // X87\n  kX86InstFEmms,           // 3dNow!\n  kX86InstFFree,           // X87\n  kX86InstFIAdd,           // X87\n  kX86InstFICom,           // X87\n  kX86InstFIComP,          // X87\n  kX86InstFIDiv,           // X87\n  kX86InstFIDivR,          // X87\n  kX86InstFILd,            // X87\n  kX86InstFIMul,           // X87\n  kX86InstFIncStP,         // X87\n  kX86InstFInit,           // X87\n  kX86InstFISt,            // X87\n  kX86InstFIStP,           // X87\n  kX86InstFISttP,          // SSE3\n  kX86InstFISub,           // X87\n  kX86InstFISubR,          // X87\n  kX86InstFLd,             // X87\n  kX86InstFLd1,            // X87\n  kX86InstFLdCw,           // X87\n  kX86InstFLdEnv,          // X87\n  kX86InstFLdL2E,          // X87\n  kX86InstFLdL2T,          // X87\n  kX86InstFLdLg2,          // X87\n  kX86InstFLdLn2,          // X87\n  kX86InstFLdPi,           // X87\n  kX86InstFLdZ,            // X87\n  kX86InstFMul,            // X87\n  kX86InstFMulP,           // X87\n  kX86InstFNClex,          // X87\n  kX86InstFNInit,          // X87\n  kX86InstFNop,            // X87\n  kX86InstFNSave,          // X87\n  kX86InstFNStCw,          // X87\n  kX86InstFNStEnv,         // X87\n  kX86InstFNStSw,          // X87\n  kX86InstFPAtan,          // X87\n  kX86InstFPRem,           // X87\n  kX86InstFPRem1,          // X87\n  kX86InstFPTan,           // X87\n  kX86InstFRndInt,         // X87\n  kX86InstFRstor,          // X87\n  kX86InstFSave,           // X87\n  kX86InstFScale,          // X87\n  kX86InstFSin,            // X87\n  kX86InstFSinCos,         // X87\n  kX86InstFSqrt,           // X87\n  kX86InstFSt,             // X87\n  kX86InstFStCw,           // X87\n  kX86InstFStEnv,          // X87\n  kX86InstFStP,            // X87\n  kX86InstFStSw,           // X87\n  kX86InstFSub,            // X87\n  kX86InstFSubP,           // X87\n  kX86InstFSubR,           // X87\n  kX86InstFSubRP,          // X87\n  kX86InstFTst,            // X87\n  kX86InstFUCom,           // X87\n  kX86InstFUComI,          // X87\n  kX86InstFUComIP,         // X87\n  kX86InstFUComP,          // X87\n  kX86InstFUComPP,         // X87\n  kX86InstFWait,           // X87\n  kX86InstFXam,            // X87\n  kX86InstFXch,            // X87\n  kX86InstFXRstor,         // X87\n  kX86InstFXSave,          // X87\n  kX86InstFXtract,         // X87\n  kX86InstFYL2X,           // X87\n  kX86InstFYL2XP1,         // X87\n  kX86InstHAddPD,          // SSE3\n  kX86InstHAddPS,          // SSE3\n  kX86InstHSubPD,          // SSE3\n  kX86InstHSubPS,          // SSE3\n  kX86InstIDiv,            // X86/X64\n  kX86InstIMul,            // X86/X64\n  kX86InstInc,             // X86/X64\n  kX86InstInt3,            // X86/X64\n  kX86InstJ,               // Begin (jcc)\n  kX86InstJA = kX86InstJ,  // X86/X64 (jcc)\n  kX86InstJAE,             // X86/X64 (jcc)\n  kX86InstJB,              // X86/X64 (jcc)\n  kX86InstJBE,             // X86/X64 (jcc)\n  kX86InstJC,              // X86/X64 (jcc)\n  kX86InstJE,              // X86/X64 (jcc)\n  kX86InstJG,              // X86/X64 (jcc)\n  kX86InstJGE,             // X86/X64 (jcc)\n  kX86InstJL,              // X86/X64 (jcc)\n  kX86InstJLE,             // X86/X64 (jcc)\n  kX86InstJNA,             // X86/X64 (jcc)\n  kX86InstJNAE,            // X86/X64 (jcc)\n  kX86InstJNB,             // X86/X64 (jcc)\n  kX86InstJNBE,            // X86/X64 (jcc)\n  kX86InstJNC,             // X86/X64 (jcc)\n  kX86InstJNE,             // X86/X64 (jcc)\n  kX86InstJNG,             // X86/X64 (jcc)\n  kX86InstJNGE,            // X86/X64 (jcc)\n  kX86InstJNL,             // X86/X64 (jcc)\n  kX86InstJNLE,            // X86/X64 (jcc)\n  kX86InstJNO,             // X86/X64 (jcc)\n  kX86InstJNP,             // X86/X64 (jcc)\n  kX86InstJNS,             // X86/X64 (jcc)\n  kX86InstJNZ,             // X86/X64 (jcc)\n  kX86InstJO,              // X86/X64 (jcc)\n  kX86InstJP,              // X86/X64 (jcc)\n  kX86InstJPE,             // X86/X64 (jcc)\n  kX86InstJPO,             // X86/X64 (jcc)\n  kX86InstJS,              // X86/X64 (jcc)\n  kX86InstJZ,              // X86/X64 (jcc)\n  kX86InstJmp,             // X86/X64 (jmp)\n  kX86InstLdDQU,           // SSE3\n  kX86InstLdMXCSR,         // SSE\n  kX86InstLahf,            // X86/X64 (CPUID NEEDED)\n  kX86InstLea,             // X86/X64\n  kX86InstLeave,           // X86/X64\n  kX86InstLFence,          // SSE2\n  kX86InstMaskMovDQU,      // SSE2\n  kX86InstMaskMovQ,        // MMX-Ext\n  kX86InstMaxPD,           // SSE2\n  kX86InstMaxPS,           // SSE\n  kX86InstMaxSD,           // SSE2\n  kX86InstMaxSS,           // SSE\n  kX86InstMFence,          // SSE2\n  kX86InstMinPD,           // SSE2\n  kX86InstMinPS,           // SSE\n  kX86InstMinSD,           // SSE2\n  kX86InstMinSS,           // SSE\n  kX86InstMonitor,         // SSE3\n  kX86InstMov,             // X86/X64\n  kX86InstMovAPD,          // SSE2\n  kX86InstMovAPS,          // SSE\n  kX86InstMovBE,           // SSE3 - Intel-Atom\n  kX86InstMovD,            // MMX/SSE2\n  kX86InstMovDDup,         // SSE3\n  kX86InstMovDQ2Q,         // SSE2\n  kX86InstMovDQA,          // SSE2\n  kX86InstMovDQU,          // SSE2\n  kX86InstMovHLPS,         // SSE\n  kX86InstMovHPD,          // SSE2\n  kX86InstMovHPS,          // SSE\n  kX86InstMovLHPS,         // SSE\n  kX86InstMovLPD,          // SSE2\n  kX86InstMovLPS,          // SSE\n  kX86InstMovMskPD,        // SSE2\n  kX86InstMovMskPS,        // SSE2\n  kX86InstMovNTDQ,         // SSE2\n  kX86InstMovNTDQA,        // SSE4.1\n  kX86InstMovNTI,          // SSE2\n  kX86InstMovNTPD,         // SSE2\n  kX86InstMovNTPS,         // SSE\n  kX86InstMovNTQ,          // MMX-Ext\n  kX86InstMovQ,            // MMX/SSE/SSE2\n  kX86InstMovQ2DQ,         // SSE2\n  kX86InstMovSD,           // SSE2\n  kX86InstMovSHDup,        // SSE3\n  kX86InstMovSLDup,        // SSE3\n  kX86InstMovSS,           // SSE\n  kX86InstMovSX,           // X86/X64\n  kX86InstMovSXD,          // X86/X64\n  kX86InstMovUPD,          // SSE2\n  kX86InstMovUPS,          // SSE\n  kX86InstMovZX,           // X86/X64\n  kX86InstMovPtr,          // X86/X64\n  kX86InstMPSADBW,         // SSE4.1\n  kX86InstMul,             // X86/X64\n  kX86InstMulPD,           // SSE2\n  kX86InstMulPS,           // SSE\n  kX86InstMulSD,           // SSE2\n  kX86InstMulSS,           // SSE\n  kX86InstMWait,           // SSE3\n  kX86InstNeg,             // X86/X64\n  kX86InstNop,             // X86/X64\n  kX86InstNot,             // X86/X64\n  kX86InstOr,              // X86/X64\n  kX86InstOrPD,            // SSE2\n  kX86InstOrPS,            // SSE\n  kX86InstPAbsB,           // SSSE3\n  kX86InstPAbsD,           // SSSE3\n  kX86InstPAbsW,           // SSSE3\n  kX86InstPackSSDW,        // MMX/SSE2\n  kX86InstPackSSWB,        // MMX/SSE2\n  kX86InstPackUSDW,        // SSE4.1\n  kX86InstPackUSWB,        // MMX/SSE2\n  kX86InstPAddB,           // MMX/SSE2\n  kX86InstPAddD,           // MMX/SSE2\n  kX86InstPAddQ,           // SSE2\n  kX86InstPAddSB,          // MMX/SSE2\n  kX86InstPAddSW,          // MMX/SSE2\n  kX86InstPAddUSB,         // MMX/SSE2\n  kX86InstPAddUSW,         // MMX/SSE2\n  kX86InstPAddW,           // MMX/SSE2\n  kX86InstPAlignR,         // SSSE3\n  kX86InstPAnd,            // MMX/SSE2\n  kX86InstPAndN,           // MMX/SSE2\n  kX86InstPause,           // SSE2.\n  kX86InstPAvgB,           // MMX-Ext\n  kX86InstPAvgW,           // MMX-Ext\n  kX86InstPBlendVB,        // SSE4.1\n  kX86InstPBlendW,         // SSE4.1\n  kX86InstPCmpEqB,         // MMX/SSE2\n  kX86InstPCmpEqD,         // MMX/SSE2\n  kX86InstPCmpEqQ,         // SSE4.1\n  kX86InstPCmpEqW,         // MMX/SSE2    \n  kX86InstPCmpEStrI,       // SSE4.2\n  kX86InstPCmpEStrM,       // SSE4.2\n  kX86InstPCmpGtB,         // MMX/SSE2\n  kX86InstPCmpGtD,         // MMX/SSE2\n  kX86InstPCmpGtQ,         // SSE4.2\n  kX86InstPCmpGtW,         // MMX/SSE2\n  kX86InstPCmpIStrI,       // SSE4.2\n  kX86InstPCmpIStrM,       // SSE4.2\n  kX86InstPExtrB,          // SSE4.1\n  kX86InstPExtrD,          // SSE4.1        \n  kX86InstPExtrQ,          // SSE4.1\n  kX86InstPExtrW,          // MMX-Ext/SSE2\n  kX86InstPF2ID,           // 3dNow!\n  kX86InstPF2IW,           // Enhanced 3dNow!\n  kX86InstPFAcc,           // 3dNow!\n  kX86InstPFAdd,           // 3dNow!\n  kX86InstPFCmpEQ,         // 3dNow!\n  kX86InstPFCmpGE,         // 3dNow!\n  kX86InstPFCmpGT,         // 3dNow!\n  kX86InstPFMax,           // 3dNow!\n  kX86InstPFMin,           // 3dNow!\n  kX86InstPFMul,           // 3dNow!\n  kX86InstPFNAcc,          // Enhanced 3dNow!\n  kX86InstPFPNAcc,         // Enhanced 3dNow!\n  kX86InstPFRcp,           // 3dNow!\n  kX86InstPFRcpIt1,        // 3dNow!\n  kX86InstPFRcpIt2,        // 3dNow!\n  kX86InstPFRSqIt1,        // 3dNow!\n  kX86InstPFRSqrt,         // 3dNow!\n  kX86InstPFSub,           // 3dNow!\n  kX86InstPFSubR,          // 3dNow!\n  kX86InstPHAddD,          // SSSE3\n  kX86InstPHAddSW,         // SSSE3\n  kX86InstPHAddW,          // SSSE3\n  kX86InstPHMinPOSUW,      // SSE4.1\n  kX86InstPHSubD,          // SSSE3\n  kX86InstPHSubSW,         // SSSE3\n  kX86InstPHSubW,          // SSSE3\n  kX86InstPI2FD,           // 3dNow!\n  kX86InstPI2FW,           // Enhanced 3dNow!\n  kX86InstPInsRB,          // SSE4.1\n  kX86InstPInsRD,          // SSE4.1\n  kX86InstPInsRQ,          // SSE4.1\n  kX86InstPInsRW,          // MMX-Ext\n  kX86InstPMAddUBSW,       // SSSE3\n  kX86InstPMAddWD,         // MMX/SSE2\n  kX86InstPMaxSB,          // SSE4.1\n  kX86InstPMaxSD,          // SSE4.1\n  kX86InstPMaxSW,          // MMX-Ext\n  kX86InstPMaxUB,          // MMX-Ext\n  kX86InstPMaxUD,          // SSE4.1\n  kX86InstPMaxUW,          // SSE4.1\n  kX86InstPMinSB,          // SSE4.1\n  kX86InstPMinSD,          // SSE4.1\n  kX86InstPMinSW,          // MMX-Ext\n  kX86InstPMinUB,          // MMX-Ext\n  kX86InstPMinUD,          // SSE4.1\n  kX86InstPMinUW,          // SSE4.1\n  kX86InstPMovMskB,        // MMX-Ext\n  kX86InstPMovSXBD,        // SSE4.1\n  kX86InstPMovSXBQ,        // SSE4.1\n  kX86InstPMovSXBW,        // SSE4.1\n  kX86InstPMovSXDQ,        // SSE4.1\n  kX86InstPMovSXWD,        // SSE4.1\n  kX86InstPMovSXWQ,        // SSE4.1\n  kX86InstPMovZXBD,        // SSE4.1\n  kX86InstPMovZXBQ,        // SSE4.1\n  kX86InstPMovZXBW,        // SSE4.1\n  kX86InstPMovZXDQ,        // SSE4.1\n  kX86InstPMovZXWD,        // SSE4.1\n  kX86InstPMovZXWQ,        // SSE4.1\n  kX86InstPMulDQ,          // SSE4.1\n  kX86InstPMulHRSW,        // SSSE3\n  kX86InstPMulHUW,         // MMX-Ext\n  kX86InstPMulHW,          // MMX/SSE2\n  kX86InstPMulLD,          // SSE4.1\n  kX86InstPMulLW,          // MMX/SSE2\n  kX86InstPMulUDQ,         // SSE2\n  kX86InstPop,             // X86/X64\n  kX86InstPopAD,           // X86 only\n  kX86InstPopCnt,          // SSE4.2\n  kX86InstPopFD,           // X86 only\n  kX86InstPopFQ,           // X64 only\n  kX86InstPOr,             // MMX/SSE2\n  kX86InstPrefetch,        // MMX-Ext\n  kX86InstPSADBW,          // MMX-Ext\n  kX86InstPShufB,          // SSSE3\n  kX86InstPShufD,          // SSE2\n  kX86InstPShufW,          // MMX-Ext\n  kX86InstPShufHW,         // SSE2\n  kX86InstPShufLW,         // SSE2\n  kX86InstPSignB,          // SSSE3\n  kX86InstPSignD,          // SSSE3\n  kX86InstPSignW,          // SSSE3\n  kX86InstPSllD,           // MMX/SSE2\n  kX86InstPSllDQ,          // SSE2\n  kX86InstPSllQ,           // MMX/SSE2\n  kX86InstPSllW,           // MMX/SSE2\n  kX86InstPSraD,           // MMX/SSE2\n  kX86InstPSraW,           // MMX/SSE2\n  kX86InstPSrlD,           // MMX/SSE2\n  kX86InstPSrlDQ,          // SSE2\n  kX86InstPSrlQ,           // MMX/SSE2\n  kX86InstPSrlW,           // MMX/SSE2\n  kX86InstPSubB,           // MMX/SSE2\n  kX86InstPSubD,           // MMX/SSE2\n  kX86InstPSubQ,           // SSE2\n  kX86InstPSubSB,          // MMX/SSE2\n  kX86InstPSubSW,          // MMX/SSE2\n  kX86InstPSubUSB,         // MMX/SSE2\n  kX86InstPSubUSW,         // MMX/SSE2\n  kX86InstPSubW,           // MMX/SSE2\n  kX86InstPSwapD,          // Enhanced 3dNow!\n  kX86InstPTest,           // SSE4.1\n  kX86InstPunpckHBW,       // MMX/SSE2\n  kX86InstPunpckHDQ,       // MMX/SSE2\n  kX86InstPunpckHQDQ,      // SSE2\n  kX86InstPunpckHWD,       // MMX/SSE2\n  kX86InstPunpckLBW,       // MMX/SSE2\n  kX86InstPunpckLDQ,       // MMX/SSE2\n  kX86InstPunpckLQDQ,      // SSE2\n  kX86InstPunpckLWD,       // MMX/SSE2\n  kX86InstPush,            // X86/X64\n  kX86InstPushAD,          // X86 only\n  kX86InstPushFD,          // X86 only\n  kX86InstPushFQ,          // X64 only\n  kX86InstPXor,            // MMX/SSE2\n  kX86InstRcl,             // X86/X64\n  kX86InstRcpPS,           // SSE\n  kX86InstRcpSS,           // SSE\n  kX86InstRcr,             // X86/X64\n  kX86InstRdtsc,           // X86/X64\n  kX86InstRdtscP,          // X86/X64\n  kX86InstRepLodSB,        // X86/X64 (REP)\n  kX86InstRepLodSD,        // X86/X64 (REP)\n  kX86InstRepLodSQ,        // X64 only (REP)\n  kX86InstRepLodSW,        // X86/X64 (REP)\n  kX86InstRepMovSB,        // X86/X64 (REP)\n  kX86InstRepMovSD,        // X86/X64 (REP)\n  kX86InstRepMovSQ,        // X64 only (REP)\n  kX86InstRepMovSW,        // X86/X64 (REP)\n  kX86InstRepStoSB,        // X86/X64 (REP)\n  kX86InstRepStoSD,        // X86/X64 (REP)\n  kX86InstRepStoSQ,        // X64 only (REP)\n  kX86InstRepStoSW,        // X86/X64 (REP)\n  kX86InstRepECmpSB,       // X86/X64 (REP)\n  kX86InstRepECmpSD,       // X86/X64 (REP)\n  kX86InstRepECmpSQ,       // X64 only (REP)\n  kX86InstRepECmpSW,       // X86/X64 (REP)\n  kX86InstRepEScaSB,       // X86/X64 (REP)\n  kX86InstRepEScaSD,       // X86/X64 (REP)\n  kX86InstRepEScaSQ,       // X64 only (REP)\n  kX86InstRepEScaSW,       // X86/X64 (REP)\n  kX86InstRepNECmpSB,      // X86/X64 (REP)\n  kX86InstRepNECmpSD,      // X86/X64 (REP)\n  kX86InstRepNECmpSQ,      // X64 only (REP)\n  kX86InstRepNECmpSW,      // X86/X64 (REP)\n  kX86InstRepNEScaSB,      // X86/X64 (REP)\n  kX86InstRepNEScaSD,      // X86/X64 (REP)\n  kX86InstRepNEScaSQ,      // X64 only (REP)\n  kX86InstRepNEScaSW,      // X86/X64 (REP)\n  kX86InstRet,             // X86/X64\n  kX86InstRol,             // X86/X64\n  kX86InstRor,             // X86/X64\n  kX86InstRoundPD,         // SSE4.1\n  kX86InstRoundPS,         // SSE4.1\n  kX86InstRoundSD,         // SSE4.1\n  kX86InstRoundSS,         // SSE4.1\n  kX86InstRSqrtPS,         // SSE\n  kX86InstRSqrtSS,         // SSE\n  kX86InstSahf,            // X86/X64 (CPUID NEEDED)\n  kX86InstSal,             // X86/X64\n  kX86InstSar,             // X86/X64\n  kX86InstSbb,             // X86/X64\n  kX86InstSet,             // Begin (setcc)\n  kX86InstSetA=kX86InstSet,// X86/X64 (setcc)\n  kX86InstSetAE,           // X86/X64 (setcc)\n  kX86InstSetB,            // X86/X64 (setcc)\n  kX86InstSetBE,           // X86/X64 (setcc)\n  kX86InstSetC,            // X86/X64 (setcc)\n  kX86InstSetE,            // X86/X64 (setcc)\n  kX86InstSetG,            // X86/X64 (setcc)\n  kX86InstSetGE,           // X86/X64 (setcc)\n  kX86InstSetL,            // X86/X64 (setcc)\n  kX86InstSetLE,           // X86/X64 (setcc)\n  kX86InstSetNA,           // X86/X64 (setcc)\n  kX86InstSetNAE,          // X86/X64 (setcc)\n  kX86InstSetNB,           // X86/X64 (setcc)\n  kX86InstSetNBE,          // X86/X64 (setcc)\n  kX86InstSetNC,           // X86/X64 (setcc)\n  kX86InstSetNE,           // X86/X64 (setcc)\n  kX86InstSetNG,           // X86/X64 (setcc)\n  kX86InstSetNGE,          // X86/X64 (setcc)\n  kX86InstSetNL,           // X86/X64 (setcc)\n  kX86InstSetNLE,          // X86/X64 (setcc)\n  kX86InstSetNO,           // X86/X64 (setcc)\n  kX86InstSetNP,           // X86/X64 (setcc)\n  kX86InstSetNS,           // X86/X64 (setcc)\n  kX86InstSetNZ,           // X86/X64 (setcc)\n  kX86InstSetO,            // X86/X64 (setcc)\n  kX86InstSetP,            // X86/X64 (setcc)\n  kX86InstSetPE,           // X86/X64 (setcc)\n  kX86InstSetPO,           // X86/X64 (setcc)\n  kX86InstSetS,            // X86/X64 (setcc)\n  kX86InstSetZ,            // X86/X64 (setcc)\n  kX86InstSFence,          // MMX-Ext/SSE\n  kX86InstShl,             // X86/X64\n  kX86InstShld,            // X86/X64\n  kX86InstShr,             // X86/X64\n  kX86InstShrd,            // X86/X64\n  kX86InstShufPD,          // SSE2\n  kX86InstShufPS,          // SSE\n  kX86InstSqrtPD,          // SSE2\n  kX86InstSqrtPS,          // SSE\n  kX86InstSqrtSD,          // SSE2\n  kX86InstSqrtSS,          // SSE\n  kX86InstStc,             // X86/X64\n  kX86InstStd,             // X86/X64\n  kX86InstStMXCSR,         // SSE\n  kX86InstSub,             // X86/X64\n  kX86InstSubPD,           // SSE2\n  kX86InstSubPS,           // SSE\n  kX86InstSubSD,           // SSE2\n  kX86InstSubSS,           // SSE\n  kX86InstTest,            // X86/X64\n  kX86InstUComISD,         // SSE2\n  kX86InstUComISS,         // SSE\n  kX86InstUd2,             // X86/X64\n  kX86InstUnpckHPD,        // SSE2\n  kX86InstUnpckHPS,        // SSE\n  kX86InstUnpckLPD,        // SSE2\n  kX86InstUnpckLPS,        // SSE\n  kX86InstXadd,            // X86/X64 (i486)\n  kX86InstXchg,            // X86/X64 (i386)\n  kX86InstXor,             // X86/X64\n  kX86InstXorPD,           // SSE2\n  kX86InstXorPS,           // SSE\n\n  _kX86InstCount,\n\n  _kX86InstJBegin = kX86InstJ,\n  _kX86InstJEnd = kX86InstJmp\n};\n\n// ============================================================================\n// [AsmJit::kX86InstGroup]\n// ============================================================================\n\n//! @brief X86 instruction groups.\n//!\n//! This should be only used by assembler, because it's @c AsmJit::Assembler\n//! specific grouping. Each group represents one 'case' in the Assembler's \n//! main emit method.\nenum kX86InstGroup\n{\n  // Group categories.\n  kX86InstGroupNone,\n  kX86InstGroupEmit,\n\n  kX86InstGroupArith,\n  kX86InstGroupBSwap,\n  kX86InstGroupBTest,\n  kX86InstGroupCall,\n  kX86InstGroupCrc32,\n  kX86InstGroupEnter,\n  kX86InstGroupIMul,\n  kX86InstGroupIncDec,\n  kX86InstGroupJcc,\n  kX86InstGroupJmp,\n  kX86InstGroupLea,\n  kX86InstGroupMem,\n  kX86InstGroupMov,\n  kX86InstGroupMovPtr,\n  kX86InstGroupMovSxMovZx,\n  kX86InstGroupMovSxD,\n  kX86InstGroupPush,\n  kX86InstGroupPop,\n  kX86InstGroupRegRm,\n  kX86InstGroupRm,\n  kX86InstGroupRmByte,\n  kX86InstGroupRmReg,\n  kX86InstGroupRep,\n  kX86InstGroupRet,\n  kX86InstGroupRot,\n  kX86InstGroupShldShrd,\n  kX86InstGroupTest,\n  kX86InstGroupXchg,\n\n  // Group for x87 FP instructions in format mem or st(i), st(i) (fadd, fsub, fdiv, ...)\n  kX86InstGroupX87StM,\n  // Group for x87 FP instructions in format st(i), st(i)\n  kX86InstGroupX87StI,\n  // Group for fld/fst/fstp instruction, internally uses @ref kX86InstGroupX87StM group.\n  kX86InstGroupX87FldFst,\n  // Group for x87 FP instructions that uses Word, DWord, QWord or TWord memory pointer.\n  kX86InstGroupX87Mem,\n  // Group for x87 FSTSW/FNSTSW instructions\n  kX86InstGroupX87Status,\n\n  // Group for movbe instruction\n  kX86InstGroupMovBE,\n\n  // Group for MMX/SSE instructions in format (X)MM|Reg|Mem <- (X)MM|Reg|Mem,\n  // 0x66 prefix must be set manually in opcodes.\n  // - Primary opcode is used for instructions in (X)MM <- (X)MM/Mem format,\n  // - Secondary opcode is used for instructions in (X)MM/Mem <- (X)MM format.\n  kX86InstGroupMmuMov,\n  kX86InstGroupMmuMovD,\n  kX86InstGroupMmuMovQ,\n\n  // Group for pextrd, pextrq and pextrw instructions (it's special instruction\n  // not similar to others)\n  kX86InstGroupMmuExtract,\n  // Group for prefetch instruction\n  kX86InstGroupMmuPrefetch,\n\n  // Group for MMX/SSE instructions in format (X)MM|Reg <- (X)MM|Reg|Mem|Imm,\n  // 0x66 prefix is added for MMX instructions that used by SSE2 registers.\n  // - Primary opcode is used for instructions in (X)MM|Reg <- (X)MM|Reg|Mem format,\n  // - Secondary opcode is iused for instructions in (X)MM|Reg <- Imm format.\n  kX86InstGroupMmuRmI,\n  kX86InstGroupMmuRmImm8,\n  // Group for 3dNow instructions\n  kX86InstGroupMmuRm3dNow\n};\n\n// ============================================================================\n// [AsmJit::kX86InstFlags]\n// ============================================================================\n\n//! @brief X86 instruction type flags.\nenum kX86InstFlags\n{\n  //! @brief No flags.\n  kX86InstFlagNone = 0x00,\n\n  //! @brief Instruction is jump, conditional jump, call or ret.\n  kX86InstFlagJump = 0x01,\n\n  //! @brief Instruction will overwrite first operand - o[0].\n  kX86InstFlagMov = 0x02,\n\n  //! @brief Instruction is X87 FPU.\n  kX86InstFlagFpu = 0x04,\n\n  //! @brief Instruction can be prepended using LOCK prefix\n  //! (usable for multithreaded applications).\n  kX86InstFlagLockable = 0x08,\n\n  //! @brief Instruction is special, this is for @c Compiler.\n  kX86InstFlagSpecial = 0x10,\n\n  //! @brief Instruction always performs memory access.\n  //!\n  //! This flag is always combined with @c kX86InstFlagSpecial and signalizes\n  //! that there is an implicit address which is accessed (usually EDI/RDI or\n  //! ESI/EDI).\n  kX86InstFlagSpecialMem = 0x20\n};\n\n// ============================================================================\n// [AsmJit::kX86InstOp]\n// ============================================================================\n\n//! @brief X86 instruction operand flags.\nenum kX86InstOp\n{\n  // X86, MM, XMM\n  kX86InstOpGb          = 0x0001,\n  kX86InstOpGw          = 0x0002,\n  kX86InstOpGd          = 0x0004,\n  kX86InstOpGq          = 0x0008,\n  kX86InstOpMm          = 0x0010,\n  kX86InstOpXmm         = 0x0020,\n  kX86InstOpMem         = 0x0040,\n  kX86InstOpImm         = 0x0080,\n\n  kX86InstOpGbMem       = kX86InstOpGb     | kX86InstOpMem,\n  kX86InstOpGwMem       = kX86InstOpGw     | kX86InstOpMem,\n  kX86InstOpGdMem       = kX86InstOpGd     | kX86InstOpMem,\n  kX86InstOpGqMem       = kX86InstOpGq     | kX86InstOpMem,\n\n  kX86InstOpGqdwb       = kX86InstOpGq     | kX86InstOpGd | kX86InstOpGw | kX86InstOpGb,\n  kX86InstOpGqdw        = kX86InstOpGq     | kX86InstOpGd | kX86InstOpGw,\n  kX86InstOpGqd         = kX86InstOpGq     | kX86InstOpGd,\n  kX86InstOpGwb         = kX86InstOpGw     | kX86InstOpGb,\n\n  kX86InstOpGqdwbMem    = kX86InstOpGqdwb  | kX86InstOpMem,\n  kX86InstOpGqdwMem     = kX86InstOpGqdw   | kX86InstOpMem,\n  kX86InstOpGqdMem      = kX86InstOpGqd    | kX86InstOpMem,\n  kX86InstOpGwbMem      = kX86InstOpGwb    | kX86InstOpMem,\n\n  // MMX/XMM.\n  kX86InstOpMmMem       = kX86InstOpMm     | kX86InstOpMem,\n  kX86InstOpXmmMem      = kX86InstOpXmm    | kX86InstOpMem,\n  kX86InstOpMmXmm       = kX86InstOpMm     | kX86InstOpXmm,\n  kX86InstOpMmXmmMem    = kX86InstOpMmXmm  | kX86InstOpMem,\n\n  // X87.\n  kX86InstOpStM2        = kX86InstOpMem    | 0x0100,\n  kX86InstOpStM4        = kX86InstOpMem    | 0x0200,\n  kX86InstOpStM8        = kX86InstOpMem    | 0x0400,\n  kX86InstOpStM10       = kX86InstOpMem    | 0x0800,\n\n  kX86InstOpStM2_4      = kX86InstOpStM2   | kX86InstOpStM4,\n  kX86InstOpStM2_4_8    = kX86InstOpStM2_4 | kX86InstOpStM8,\n  kX86InstOpStM4_8      = kX86InstOpStM4   | kX86InstOpStM8,\n  kX86InstOpStM4_8_10   = kX86InstOpStM4_8 | kX86InstOpStM10,\n\n  // Don't emit REX prefix.\n  kX86InstOpNoRex       = 0x2000\n};\n\n// ============================================================================\n// [AsmJit::x86InstName]\n// ============================================================================\n\n//! @internal\n//! \n//! @brief X86 instruction names.\nASMJIT_VAR const char x86InstName[];\n\n// ============================================================================\n// [AsmJit::X86InstInfo]\n// ============================================================================\n\n//! @brief X86 instruction information.\nstruct X86InstInfo\n{\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get instruction code, see @ref kX86InstCode.\n  inline uint32_t getCode() const\n  { return _code; }\n\n  //! @brief Get instruction name string (null terminated string).\n  inline const char* getName() const\n  { return x86InstName + static_cast<uint32_t>(_nameIndex); }\n\n  //! @brief Get instruction name index (index to @ref x86InstName array).\n  inline uint32_t getNameIndex() const\n  { return _nameIndex; }\n\n  //! @brief Get instruction group, see @ref kX86InstGroup.\n  inline uint32_t getGroup() const\n  { return _group; }\n\n  //! @brief Get instruction flags, see @ref kX86InstFlags.\n  inline uint32_t getFlags() const\n  { return _group; }\n\n  //! @brief Get whether the instruction is conditional or standard jump.\n  inline bool isJump() const\n  { return (_flags & kX86InstFlagJump) != 0; }\n\n  //! @brief Get whether the instruction is MOV type.\n  inline bool isMov() const\n  { return (_flags & kX86InstFlagMov) != 0; }\n\n  //! @brief Get whether the instruction is X87 FPU type.\n  inline bool isFpu() const\n  { return (_flags & kX86InstFlagFpu) != 0; }\n\n  //! @brief Get whether the instruction can be prefixed by LOCK prefix.\n  inline bool isLockable() const\n  { return (_flags & kX86InstFlagLockable) != 0; }\n\n  //! @brief Get whether the instruction is special type (this is used by\n  //! @c Compiler to manage additional variables or functionality).\n  inline bool isSpecial() const\n  { return (_flags & kX86InstFlagSpecial) != 0; }\n\n  //! @brief Get whether the instruction is special type and it performs\n  //! memory access.\n  inline bool isSpecialMem() const\n  { return (_flags & kX86InstFlagSpecialMem) != 0; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Instruction code.\n  uint16_t _code;\n  //! @brief Instruction name index in x86InstName[] array.\n  uint16_t _nameIndex;\n  //! @brief Instruction group, used also by @c Compiler.\n  uint8_t _group;\n  //! @brief Instruction type flags.\n  uint8_t _flags;\n\n  //! @brief First and second operand flags (some groups depends on these settings, used also by @c Compiler).\n  uint16_t _opFlags[2];\n  //! @brief If instruction has only memory operand, this is register opcode.\n  uint16_t _opCodeR;\n  //! @brief Primary and secondary opcodes.\n  uint32_t _opCode[2];\n};\n\n// ============================================================================\n// [AsmJit::x86InstInfo]\n// ============================================================================\n\nASMJIT_VAR const X86InstInfo x86InstInfo[];\n\n// ============================================================================\n// [AsmJit::kX86FuncConv]\n// ============================================================================\n\n//! @brief X86 function calling conventions.\n//!\n//! Calling convention is scheme how function arguments are passed into \n//! function and how functions returns values. In assembler programming\n//! it's needed to always comply with function calling conventions, because\n//! even small inconsistency can cause undefined behavior or crash.\n//!\n//! List of calling conventions for 32-bit x86 mode:\n//! - @c kX86FuncConvCDecl - Calling convention for C runtime.\n//! - @c kX86FuncConvStdCall - Calling convention for WinAPI functions.\n//! - @c kX86FuncConvMsThisCall - Calling convention for C++ members under \n//!      Windows (produced by MSVC and all MSVC compatible compilers).\n//! - @c kX86FuncConvMsFastCall - Fastest calling convention that can be used\n//!      by MSVC compiler.\n//! - @c kX86FuncConv_BORNANDFASTCALL - Borland fastcall convention.\n//! - @c kX86FuncConvGccFastCall - GCC fastcall convention (2 register arguments).\n//! - @c kX86FuncConvGccRegParm1 - GCC regparm(1) convention.\n//! - @c kX86FuncConvGccRegParm2 - GCC regparm(2) convention.\n//! - @c kX86FuncConvGccRegParm3 - GCC regparm(3) convention.\n//!\n//! List of calling conventions for 64-bit x86 mode (x64):\n//! - @c kX86FuncConvX64W - Windows 64-bit calling convention (WIN64 ABI).\n//! - @c kX86FuncConvX64U - Unix 64-bit calling convention (AMD64 ABI).\n//!\n//! There is also @c kX86FuncConvDefault that is defined to fit best to your \n//! compiler.\n//!\n//! These types are used together with @c AsmJit::Compiler::newFunc() \n//! method.\nenum kX86FuncConv\n{\n  // --------------------------------------------------------------------------\n  // [X64]\n  // --------------------------------------------------------------------------\n\n  //! @brief X64 calling convention for Windows platform (WIN64 ABI).\n  //!\n  //! For first four arguments are used these registers:\n  //! - 1. 32/64-bit integer or floating point argument - rcx/xmm0\n  //! - 2. 32/64-bit integer or floating point argument - rdx/xmm1\n  //! - 3. 32/64-bit integer or floating point argument - r8/xmm2\n  //! - 4. 32/64-bit integer or floating point argument - r9/xmm3\n  //!\n  //! Note first four arguments here means arguments at positions from 1 to 4\n  //! (included). For example if second argument is not passed by register then\n  //! rdx/xmm1 register is unused.\n  //!\n  //! All other arguments are pushed on the stack in right-to-left direction.\n  //! Stack is aligned by 16 bytes. There is 32-byte shadow space on the stack\n  //! that can be used to save up to four 64-bit registers (probably designed to\n  //! be used to save first four arguments passed in registers).\n  //!\n  //! Arguments direction:\n  //! - Right to Left (except for first 4 parameters that's in registers)\n  //!\n  //! Stack is cleaned by:\n  //! - Caller.\n  //!\n  //! Return value:\n  //! - Integer types - RAX register.\n  //! - Floating points - XMM0 register.\n  //!\n  //! Stack is always aligned by 16 bytes.\n  //!\n  //! More information about this calling convention can be found on MSDN:\n  //! http://msdn.microsoft.com/en-us/library/9b372w95.aspx .\n  kX86FuncConvX64W = 1,\n\n  //! @brief X64 calling convention for Unix platforms (AMD64 ABI).\n  //!\n  //! First six 32 or 64-bit integer arguments are passed in rdi, rsi, rdx, \n  //! rcx, r8, r9 registers. First eight floating point or XMM arguments \n  //! are passed in xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7 registers.\n  //! This means that in registers can be transferred up to 14 arguments total.\n  //!\n  //! There is also RED ZONE below the stack pointer that can be used for \n  //! temporary storage. The red zone is the space from [rsp-128] to [rsp-8].\n  //! \n  //! Arguments direction:\n  //! - Right to Left (Except for arguments passed in registers).\n  //!\n  //! Stack is cleaned by:\n  //! - Caller.\n  //!\n  //! Return value:\n  //! - Integer types - RAX register.\n  //! - Floating points - XMM0 register.\n  //!\n  //! Stack is always aligned by 16 bytes.\n  kX86FuncConvX64U = 2,\n\n  // --------------------------------------------------------------------------\n  // [X86]\n  // --------------------------------------------------------------------------\n\n  //! @brief Cdecl calling convention (used by C runtime).\n  //!\n  //! Compatible across MSVC and GCC.\n  //!\n  //! Arguments direction:\n  //! - Right to Left\n  //!\n  //! Stack is cleaned by:\n  //! - Caller.\n  kX86FuncConvCDecl = 3,\n\n  //! @brief Stdcall calling convention (used by WinAPI).\n  //!\n  //! Compatible across MSVC and GCC.\n  //!\n  //! Arguments direction:\n  //! - Right to Left\n  //!\n  //! Stack is cleaned by:\n  //! - Callee.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  kX86FuncConvStdCall = 4,\n\n  //! @brief MSVC specific calling convention used by MSVC/Intel compilers\n  //! for struct/class methods.\n  //!\n  //! This is MSVC (and Intel) only calling convention used in Windows\n  //! world for C++ class methods. Implicit 'this' pointer is stored in\n  //! ECX register instead of storing it on the stack.\n  //!\n  //! Arguments direction:\n  //! - Right to Left (except this pointer in ECX)\n  //!\n  //! Stack is cleaned by:\n  //! - Callee.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  //!\n  //! C++ class methods that have variable count of arguments uses different\n  //! calling convention called cdecl.\n  //!\n  //! @note This calling convention is always used by MSVC for class methods,\n  //! it's implicit and there is no way how to override it.\n  kX86FuncConvMsThisCall = 5,\n\n  //! @brief MSVC specific fastcall.\n  //!\n  //! Two first parameters (evaluated from left-to-right) are in ECX:EDX \n  //! registers, all others on the stack in right-to-left order.\n  //!\n  //! Arguments direction:\n  //! - Right to Left (except to first two integer arguments in ECX:EDX)\n  //!\n  //! Stack is cleaned by:\n  //! - Callee.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  //!\n  //! @note This calling convention differs to GCC one in stack cleaning\n  //! mechanism.\n  kX86FuncConvMsFastCall = 6,\n\n  //! @brief Borland specific fastcall with 2 parameters in registers.\n  //!\n  //! Two first parameters (evaluated from left-to-right) are in ECX:EDX \n  //! registers, all others on the stack in left-to-right order.\n  //!\n  //! Arguments direction:\n  //! - Left to Right (except to first two integer arguments in ECX:EDX)\n  //!\n  //! Stack is cleaned by:\n  //! - Callee.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  //!\n  //! @note Arguments on the stack are in left-to-right order that differs\n  //! to other fastcall conventions used in different compilers.\n  kX86FuncConvBorlandFastCall = 7,\n\n  //! @brief GCC specific fastcall convention.\n  //!\n  //! Two first parameters (evaluated from left-to-right) are in ECX:EDX \n  //! registers, all others on the stack in right-to-left order.\n  //!\n  //! Arguments direction:\n  //! - Right to Left (except to first two integer arguments in ECX:EDX)\n  //!\n  //! Stack is cleaned by:\n  //! - Callee.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  //!\n  //! @note This calling convention should be compatible to\n  //! @c kX86FuncConvMsFastCall.\n  kX86FuncConvGccFastCall = 8,\n\n  //! @brief GCC specific regparm(1) convention.\n  //!\n  //! The first parameter (evaluated from left-to-right) is in EAX register,\n  //! all others on the stack in right-to-left order.\n  //!\n  //! Arguments direction:\n  //! - Right to Left (except to first one integer argument in EAX)\n  //!\n  //! Stack is cleaned by:\n  //! - Caller.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  kX86FuncConvGccRegParm1 = 9,\n\n  //! @brief GCC specific regparm(2) convention.\n  //!\n  //! Two first parameters (evaluated from left-to-right) are in EAX:EDX \n  //! registers, all others on the stack in right-to-left order.\n  //!\n  //! Arguments direction:\n  //! - Right to Left (except to first two integer arguments in EAX:EDX)\n  //!\n  //! Stack is cleaned by:\n  //! - Caller.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  kX86FuncConvGccRegParm2 = 10,\n\n  //! @brief GCC specific fastcall with 3 parameters in registers.\n  //!\n  //! Three first parameters (evaluated from left-to-right) are in \n  //! EAX:EDX:ECX registers, all others on the stack in right-to-left order.\n  //!\n  //! Arguments direction:\n  //! - Right to Left (except to first three integer arguments in EAX:EDX:ECX)\n  //!\n  //! Stack is cleaned by:\n  //! - Caller.\n  //!\n  //! Return value:\n  //! - Integer types - EAX:EDX registers.\n  //! - Floating points - st(0) register.\n  kX86FuncConvGccRegParm3 = 11,\n\n  // --------------------------------------------------------------------------\n  // [Detect]\n  // --------------------------------------------------------------------------\n\n  //! @def kX86FuncConvDefault\n  //! @brief Default calling convention for current platform / operating system.\n\n  //! @def kX86FuncConvCompatFastCall\n  //! @brief Compatibility for __fastcall calling convention.\n  //!\n  //! @note This enumeration is always set to a value which is compatible to\n  //! current compilers __fastcall calling convention. In 64-bit mode the value\n  //! is compatible to @ref kX86FuncConvX64W or @ref kX86FuncConvX64U.\n\n  //! @def kX86FuncConvCompatStdCall\n  //! @brief Compatibility for __stdcall calling convention.\n  //!\n  //! @note This enumeration is always set to a value which is compatible to\n  //! current compilers __stdcall calling convention. In 64-bit mode the value\n  //! is compatible to @ref kX86FuncConvX64W or @ref kX86FuncConvX64U.\n\n  //! @def kX86FuncConvCompatCDecl\n  //! @brief Default C calling convention based on current compiler's settings.\n\n#if defined(ASMJIT_X86)\n\n  kX86FuncConvDefault = kX86FuncConvCDecl,\n\n# if defined(_MSC_VER)\n  kX86FuncConvCompatFastCall = kX86FuncConvMsFastCall,\n# elif defined(__GNUC__)\n  kX86FuncConvCompatFastCall = kX86FuncConvGccFastCall,\n# elif defined(__BORLANDC__)\n  kX86FuncConvCompatFastCall = kX86FuncConvBorlandFastCall,\n# else\n#  error \"AsmJit::kX86FuncConvCompatFastCall not supported.\"\n# endif\n\n  kX86FuncConvCompatStdCall = kX86FuncConvStdCall,\n  kX86FuncConvCompatCDecl = kX86FuncConvCDecl\n\n#else\n\n# if defined(ASMJIT_WINDOWS)\n  kX86FuncConvDefault = kX86FuncConvX64W,\n# else\n  kX86FuncConvDefault = kX86FuncConvX64U,\n# endif\n\n  kX86FuncConvCompatFastCall = kX86FuncConvDefault,\n  kX86FuncConvCompatStdCall = kX86FuncConvDefault,\n  kX86FuncConvCompatCDecl = kX86FuncConvDefault\n\n#endif // ASMJIT_X86\n};\n\n// ============================================================================\n// [AsmJit::kX86FuncHint]\n// ============================================================================\n\n//! @brief X86 function hints.\nenum kX86FuncHint\n{\n  //! @brief Use push/pop sequences instead of mov sequences in function prolog\n  //! and epilog.\n  kX86FuncHintPushPop = 8,\n  //! @brief Add emms instruction to the function epilog.\n  kX86FuncHintEmms = 9,\n  //! @brief Add sfence instruction to the function epilog.\n  kX86FuncHintSFence = 10,\n  //! @brief Add lfence instruction to the function epilog.\n  kX86FuncHintLFence = 11,\n  //! @brief Assume that stack is aligned to 16-bytes.\n  kX86FuncHintAssume16ByteAlignment = 12,\n  //! @brief Perform 16-byte stack alignmend by function.\n  kX86FuncHintPerform16ByteAlignment = 13\n};\n\n// ============================================================================\n// [AsmJit::kX86FuncFlags]\n// ============================================================================\n\n//! @brief X86 function flags.\nenum kX86FuncFlags\n{\n  //! @brief Whether to emit prolog / epilog sequence using push & pop\n  //! instructions (the default).\n  kX86FuncFlagPushPop = (1U << 8),\n\n  //! @brief Whether to emit EMMS instruction in epilog (auto-detected).\n  kX86FuncFlagEmitEmms = (1U << 9),\n\n  //! @brief Whether to emit SFence instruction in epilog (auto-detected).\n  //!\n  //! @note @ref kX86FuncFlagEmitSFence and @ref kX86FuncFlagEmitLFence\n  //! combination will result in emitting mfence.\n  kX86FuncFlagEmitSFence = (1U << 10),\n\n  //! @brief Whether to emit LFence instruction in epilog (auto-detected).\n  //!\n  //! @note @ref kX86FuncFlagEmitSFence and @ref kX86FuncFlagEmitLFence\n  //! combination will result in emitting mfence.\n  kX86FuncFlagEmitLFence = (1U << 11),\n\n  //! @brief Whether the function stack is aligned by 16-bytes by OS.\n  //!\n  //! This is always true for 64-bit mode and for linux.\n  kX86FuncFlagAssume16ByteAlignment = (1U << 12),\n\n  //! @brief Whether the function stack (for variables) is aligned manually\n  //! by function to 16-bytes.\n  //!\n  //! This makes sense only if @ref kX86FuncFlagAssume16ByteAlignment is \n  //! false and MOVDQA instruction or other SSE/SSE2 instructions are used to\n  //! work with variables stored on the stack.\n  //!\n  //! Value is determined automatically by these factors, expectations are:\n  //!\n  //!   1. There is 16-byte wide variable which address was used (alloc, spill,\n  //!      op).\n  //!   2. Function can't be naked.\n  kX86FuncFlagPerform16ByteAlignment = (1U << 13),\n\n  //! @brief Whether the ESP register is adjusted by the stack size needed\n  //! to save registers and function variables.\n  //!\n  //! Esp is adjusted by 'sub' instruction in prolog and by add function in\n  //! epilog (only if function is not naked).\n  kX86FuncFlagIsEspAdjusted = (1U << 14)\n};\n\n// ============================================================================\n// [AsmJit::kX86CompilerInst]\n// ============================================================================\n\n//! @brief Instruction flags used by @ref X86CompilerInst item.\nenum kX86CompilerInstFlag\n{\n  //! @brief Whether the instruction is special.\n  kX86CompilerInstFlagIsSpecial = (1U << 0),\n  //! @brief Whether the instruction is FPU.\n  kX86CompilerInstFlagIsFpu = (1U << 1),\n  //! @brief Whether the one of the operands is GPB.Lo register.\n  kX86CompilerInstFlagIsGpbLoUsed = (1U << 2),\n  //! @brief Whether the one of the operands is GPB.Hi register.\n  kX86CompilerInstFlagIsGpbHiUsed = (1U << 3),\n\n  //! @brief Whether the jmp/jcc is likely to be taken.\n  kX86CompilerInstFlagIsTaken = (1U << 7)\n};\n\n// ============================================================================\n// [AsmJit::kX86VarClass]\n// ============================================================================\n\n//! @brief X86 variable class.\nenum kX86VarClass\n{\n  //! @brief No class (used internally).\n  kX86VarClassNone = 0,\n  //! @brief General purpose register.\n  kX86VarClassGp = 1,\n  //! @brief X87 floating point.\n  kX86VarClassX87 = 2,\n  //! @brief MMX register.\n  kX86VarClassMm = 3,\n  //! @brief XMM register.\n  kX86VarClassXmm = 4,\n\n  //! @brief Count of X86 variable classes.\n  kX86VarClassCount = 5\n};\n\n// ============================================================================\n// [AsmJit::kX86VarFlags]\n// ============================================================================\n\n//! @brief X86 variable class.\nenum kX86VarFlags\n{\n  //! @brief Variable contains single-precision floating-point(s).\n  kX86VarFlagSP = 0x10,\n  //! @brief Variable contains double-precision floating-point(s).\n  kX86VarFlagDP = 0x20,\n  //! @brief Variable is packed (for example float4x, double2x, ...).\n  kX86VarFlagPacked = 0x40\n};\n\n// ============================================================================\n// [AsmJit::kX86VarType]\n// ============================================================================\n\n//! @brief X86 variable type.\nenum kX86VarType\n{\n  // --------------------------------------------------------------------------\n  // [Platform Dependent]\n  // --------------------------------------------------------------------------\n\n  //! @brief Variable is 32-bit general purpose register.\n  kX86VarTypeGpd = 0,\n  //! @brief Variable is 64-bit general purpose register.\n  kX86VarTypeGpq = 1,\n\n  //! @var kX86VarTypeGpz\n  //! @brief Variable is system wide general purpose register (32-bit or 64-bit).\n#if defined(ASMJIT_X86)\n  kX86VarTypeGpz = kX86VarTypeGpd,\n#else\n  kX86VarTypeGpz = kX86VarTypeGpq,\n#endif\n\n  //! @brief Variable is X87 (FPU).\n  kX86VarTypeX87 = 2,\n  //! @brief Variable is X87 (FPU) SP-FP number (float).\n  kX86VarTypeX87SS = 3,\n  //! @brief Variable is X87 (FPU) DP-FP number (double).\n  kX86VarTypeX87SD = 4,\n\n  //! @brief Variable is MM register / memory location.\n  kX86VarTypeMm = 5,\n  //! @brief Variable is XMM register / memory location.\n  kX86VarTypeXmm = 6,\n\n  //! @brief Variable is SSE scalar SP-FP number.\n  kX86VarTypeXmmSS = 7,\n  //! @brief Variable is SSE packed SP-FP number (4 floats).\n  kX86VarTypeXmmPS = 8,\n\n  //! @brief Variable is SSE2 scalar DP-FP number.\n  kX86VarTypeXmmSD = 9,\n  //! @brief Variable is SSE2 packed DP-FP number (2 doubles).\n  kX86VarTypeXmmPD = 10,\n\n  //! @brief Count of variable types.\n  kX86VarTypeCount = 11,\n\n  // --------------------------------------------------------------------------\n  // [Platform Independent]\n  // --------------------------------------------------------------------------\n\n  //! @brief Variable is 32-bit integer.\n  kX86VarTypeInt32 = kX86VarTypeGpd,\n  //! @brief Variable is 64-bit integer.\n  kX86VarTypeInt64 = kX86VarTypeGpq,\n  //! @brief Variable is system dependent integer / pointer.\n  kX86VarTypeIntPtr = kX86VarTypeGpz,\n\n#if defined(ASMJIT_X86)\n  kX86VarTypeFloat = kX86VarTypeX87SS,\n  kX86VarTypeDouble = kX86VarTypeX87SD\n#else\n  kX86VarTypeFloat = kX86VarTypeXmmSS,\n  kX86VarTypeDouble = kX86VarTypeXmmSD\n#endif\n};\n\n// ============================================================================\n// [AsmJit::X86VarInfo]\n// ============================================================================\n\n//! @brief X86 variable information.\nstruct X86VarInfo\n{\n  // --------------------------------------------------------------------------\n  // [Accessors]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get register code base, see @ref kX86RegCode.\n  inline uint32_t getCode() const\n  { return _code; }\n\n  //! @brief Get register size in bytes.\n  inline uint32_t getSize() const\n  { return _size; }\n\n  //! @brief Get variable class, see @ref kX86VarClass.\n  inline uint32_t getClass() const\n  { return _class; }\n\n  //! @brief Get variable flags, see @ref kX86VarFlags.\n  inline uint32_t getFlags() const\n  { return _flags; }\n\n  //! @brief Get variable type name.\n  inline const char* getName() const\n  { return _name; }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Register code base, see @ref kX86RegCode.\n  uint32_t _code;\n  //! @brief Register size in bytes.\n  uint16_t _size;\n  //! @brief Variable class, see @ref kX86VarClass.\n  uint8_t _class;\n  //! @brief Variable flags, see @ref kX86VarFlags.\n  uint8_t _flags;\n  //! @brief Variable type name.\n  char _name[8];\n};\n\n// ============================================================================\n// [AsmJit::x86VarInfo]\n// ============================================================================\n\nASMJIT_VAR const X86VarInfo x86VarInfo[];\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_X86DEFS_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86func.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../core/assert.h\"\n#include \"../core/intutil.h\"\n#include \"../core/stringutil.h\"\n\n#include \"../x86/x86defs.h\"\n#include \"../x86/x86func.h\"\n#include \"../x86/x86util.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::X86FuncDecl - Accessors]\n// ============================================================================\n\nuint32_t X86FuncDecl::findArgumentByRegCode(uint32_t regCode) const\n{\n  uint32_t type = regCode & kRegTypeMask;\n  uint32_t idx = regCode & kRegIndexMask;\n\n  uint32_t clazz;\n\n  switch (type)\n  {\n    case kX86RegTypeGpd:\n    case kX86RegTypeGpq:\n      clazz = kX86VarClassGp;\n      break;\n\n    case kX86RegTypeX87:\n      clazz = kX86VarClassX87;\n      break;\n\n    case kX86RegTypeMm:\n      clazz = kX86VarClassMm;\n      break;\n\n    case kX86RegTypeXmm:\n      clazz = kX86VarClassXmm;\n      break;\n\n    default:\n      return kInvalidValue;\n  }\n\n  for (uint32_t i = 0; i < _argumentsCount; i++)\n  {\n    const FuncArg& arg = _arguments[i];\n\n    if (arg.getRegIndex() == idx && (X86Util::getVarClassFromVarType(arg.getVarType()) & clazz) != 0)\n      return i;\n  }\n\n  return kInvalidValue;\n}\n\n// ============================================================================\n// [AsmJit::X86FuncDecl - SetPrototype - InitCallingConvention]\n// ============================================================================\n\nstatic void X86FuncDecl_initCallingConvention(X86FuncDecl* self, uint32_t convention)\n{\n  uint32_t i;\n\n  // --------------------------------------------------------------------------\n  // [Inir]\n  // --------------------------------------------------------------------------\n\n  self->_convention = convention;\n  self->_calleePopsStack = false;\n  self->_argumentsDirection = kFuncArgsRTL;\n\n  for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_gpList); i++)\n    self->_gpList[i] = kRegIndexInvalid;\n\n  for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_xmmList); i++)\n    self->_xmmList[i] = kRegIndexInvalid;\n\n  self->_gpListMask = 0x0;\n  self->_mmListMask = 0x0;\n  self->_xmmListMask = 0x0;\n\n  self->_gpPreservedMask = 0x0;\n  self->_mmPreservedMask = 0x0;\n  self->_xmmPreservedMask = 0x0;\n\n  // --------------------------------------------------------------------------\n  // [X86 Calling Conventions]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_X86)\n  self->_gpPreservedMask = static_cast<uint16_t>(\n    IntUtil::maskFromIndex(kX86RegIndexEbx) |\n    IntUtil::maskFromIndex(kX86RegIndexEsp) |\n    IntUtil::maskFromIndex(kX86RegIndexEbp) |\n    IntUtil::maskFromIndex(kX86RegIndexEsi) |\n    IntUtil::maskFromIndex(kX86RegIndexEdi));\n  self->_xmmPreservedMask = 0;\n\n  switch (convention)\n  {\n    // ------------------------------------------------------------------------\n    // [CDecl]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvCDecl:\n      break;\n\n    // ------------------------------------------------------------------------\n    // [StdCall]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvStdCall:\n      self->_calleePopsStack = true;\n      break;\n\n    // ------------------------------------------------------------------------\n    // [MS-ThisCall]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvMsThisCall:\n      self->_calleePopsStack = true;\n\n      self->_gpList[0] = kX86RegIndexEcx;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexEcx));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [MS-FastCall]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvMsFastCall:\n      self->_calleePopsStack = true;\n\n      self->_gpList[0] = kX86RegIndexEcx;\n      self->_gpList[1] = kX86RegIndexEdx;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexEcx) |\n        IntUtil::maskFromIndex(kX86RegIndexEdx));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [Borland-FastCall]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvBorlandFastCall:\n      self->_calleePopsStack = true;\n      self->_argumentsDirection = kFuncArgsLTR;\n\n      self->_gpList[0] = kX86RegIndexEax;\n      self->_gpList[1] = kX86RegIndexEdx;\n      self->_gpList[2] = kX86RegIndexEcx;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexEax) |\n        IntUtil::maskFromIndex(kX86RegIndexEdx) |\n        IntUtil::maskFromIndex(kX86RegIndexEcx));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [Gcc-FastCall]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvGccFastCall:\n      self->_calleePopsStack = true;\n\n      self->_gpList[0] = kX86RegIndexEcx;\n      self->_gpList[1] = kX86RegIndexEdx;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexEcx) |\n        IntUtil::maskFromIndex(kX86RegIndexEdx));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [Gcc-Regparm(1)]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvGccRegParm1:\n      self->_calleePopsStack = false;\n\n      self->_gpList[0] = kX86RegIndexEax;\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexEax));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [Gcc-Regparm(2)]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvGccRegParm2:\n      self->_calleePopsStack = false;\n\n      self->_gpList[0] = kX86RegIndexEax;\n      self->_gpList[1] = kX86RegIndexEdx;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexEax) |\n        IntUtil::maskFromIndex(kX86RegIndexEdx));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [Gcc-Regparm(3)]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvGccRegParm3:\n      self->_calleePopsStack = false;\n\n      self->_gpList[0] = kX86RegIndexEax;\n      self->_gpList[1] = kX86RegIndexEdx;\n      self->_gpList[2] = kX86RegIndexEcx;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexEax) |\n        IntUtil::maskFromIndex(kX86RegIndexEdx) |\n        IntUtil::maskFromIndex(kX86RegIndexEcx));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [Illegal]\n    // ------------------------------------------------------------------------\n\n    default:\n      // Illegal calling convention.\n      ASMJIT_ASSERT(0);\n  }\n#endif // ASMJIT_X86\n\n  // --------------------------------------------------------------------------\n  // [X64 Calling Conventions]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_X64)\n  switch (convention)\n  {\n    // ------------------------------------------------------------------------\n    // [X64-Windows]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvX64W:\n      self->_gpList[0] = kX86RegIndexRcx;\n      self->_gpList[1] = kX86RegIndexRdx;\n      self->_gpList[2] = kX86RegIndexR8;\n      self->_gpList[3] = kX86RegIndexR9;\n\n      self->_xmmList[0] = kX86RegIndexXmm0;\n      self->_xmmList[1] = kX86RegIndexXmm1;\n      self->_xmmList[2] = kX86RegIndexXmm2;\n      self->_xmmList[3] = kX86RegIndexXmm3;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexRcx  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRdx  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR8   ) |\n        IntUtil::maskFromIndex(kX86RegIndexR9   ));\n\n      self->_xmmListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexXmm0 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm1 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm2 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm3 ));\n\n      self->_gpPreservedMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexRbx  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRsp  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRbp  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRsi  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRdi  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR12  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR13  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR14  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR15  ));\n\n      self->_xmmPreservedMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexXmm6 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm7 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm8 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm9 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm10) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm11) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm12) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm13) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm14) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm15));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [X64-Unix]\n    // ------------------------------------------------------------------------\n\n    case kX86FuncConvX64U:\n      self->_gpList[0] = kX86RegIndexRdi;\n      self->_gpList[1] = kX86RegIndexRsi;\n      self->_gpList[2] = kX86RegIndexRdx;\n      self->_gpList[3] = kX86RegIndexRcx;\n      self->_gpList[4] = kX86RegIndexR8;\n      self->_gpList[5] = kX86RegIndexR9;\n\n      self->_xmmList[0] = kX86RegIndexXmm0;\n      self->_xmmList[1] = kX86RegIndexXmm1;\n      self->_xmmList[2] = kX86RegIndexXmm2;\n      self->_xmmList[3] = kX86RegIndexXmm3;\n      self->_xmmList[4] = kX86RegIndexXmm4;\n      self->_xmmList[5] = kX86RegIndexXmm5;\n      self->_xmmList[6] = kX86RegIndexXmm6;\n      self->_xmmList[7] = kX86RegIndexXmm7;\n\n      self->_gpListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexRdi  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRsi  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRdx  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRcx  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR8   ) |\n        IntUtil::maskFromIndex(kX86RegIndexR9   ));\n\n      self->_xmmListMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexXmm0 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm1 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm2 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm3 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm4 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm5 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm6 ) |\n        IntUtil::maskFromIndex(kX86RegIndexXmm7 ));\n\n      self->_gpPreservedMask = static_cast<uint16_t>(\n        IntUtil::maskFromIndex(kX86RegIndexRbx  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRsp  ) |\n        IntUtil::maskFromIndex(kX86RegIndexRbp  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR12  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR13  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR14  ) |\n        IntUtil::maskFromIndex(kX86RegIndexR15  ));\n      break;\n\n    // ------------------------------------------------------------------------\n    // [Illegal]\n    // ------------------------------------------------------------------------\n\n    default:\n      // Illegal calling convention.\n      ASMJIT_ASSERT(0);\n  }\n#endif // ASMJIT_X64\n}\n\n// ============================================================================\n// [AsmJit::X86FuncDecl - SetPrototype - InitDefinition]\n// ============================================================================\n\nstatic void X86FuncDecl_initDefinition(X86FuncDecl* self,\n  uint32_t returnType, const uint32_t* argumentsData, uint32_t argumentsCount)\n{\n  ASMJIT_ASSERT(argumentsCount <= kFuncArgsMax);\n\n  // --------------------------------------------------------------------------\n  // [Init]\n  // --------------------------------------------------------------------------\n\n  int32_t i = 0;\n  int32_t gpPos = 0;\n  int32_t xmmPos = 0;\n  int32_t stackOffset = 0;\n\n  self->_returnType = returnType;\n  self->_argumentsCount = static_cast<uint8_t>(argumentsCount);\n\n  while (i < static_cast<int32_t>(argumentsCount))\n  {\n    FuncArg& arg = self->_arguments[i];\n\n    arg._varType = static_cast<uint8_t>(argumentsData[i]);\n    arg._regIndex = kRegIndexInvalid;\n    arg._stackOffset = kFuncStackInvalid;\n\n    i++;\n  }\n\n  while (i < kFuncArgsMax)\n  {\n    FuncArg& arg = self->_arguments[i];\n    arg.reset();\n\n    i++;\n  }\n\n  self->_argumentsStackSize = 0;\n  self->_gpArgumentsMask = 0x0;\n  self->_mmArgumentsMask = 0x0;\n  self->_xmmArgumentsMask = 0x0;\n\n  if (self->_argumentsCount == 0)\n    return;\n\n  // --------------------------------------------------------------------------\n  // [X86 Calling Conventions (32-bit)]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_X86)\n  // Register arguments (Integer), always left-to-right.\n  for (i = 0; i != argumentsCount; i++)\n  {\n    FuncArg& arg = self->_arguments[i];\n    uint32_t varType = arg.getVarType();\n\n    if (X86Util::isVarTypeInt(varType) && gpPos < 16 && self->_gpList[gpPos] != kRegIndexInvalid)\n    {\n      arg._regIndex = self->_gpList[gpPos++];\n      self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex()));\n    }\n  }\n\n  // Stack arguments.\n  int32_t iStart = static_cast<int32_t>(argumentsCount - 1);\n  int32_t iEnd   = -1;\n  int32_t iStep  = -1;\n\n  if (self->_argumentsDirection == kFuncArgsLTR)\n  {\n    iStart = 0;\n    iEnd   = static_cast<int32_t>(argumentsCount);\n    iStep  = 1;\n  }\n\n  for (i = iStart; i != iEnd; i += iStep)\n  {\n    FuncArg& arg = self->_arguments[i];\n    uint32_t varType = arg.getVarType();\n\n    if (arg.hasRegIndex())\n      continue;\n\n    if (X86Util::isVarTypeInt(varType))\n    {\n      stackOffset -= 4;\n      arg._stackOffset = static_cast<int16_t>(stackOffset);\n    }\n    else if (X86Util::isVarTypeFloat(varType))\n    {\n      int32_t size = static_cast<int32_t>(x86VarInfo[varType].getSize());\n      stackOffset -= size;\n      arg._stackOffset = static_cast<int16_t>(stackOffset);\n    }\n  }\n#endif // ASMJIT_X86\n\n  // --------------------------------------------------------------------------\n  // [X64 Calling Conventions (64-bit)]\n  // --------------------------------------------------------------------------\n\n#if defined(ASMJIT_X64)\n  // Windows 64-bit specific.\n  if (self->_convention == kX86FuncConvX64W)\n  {\n    int32_t max = argumentsCount < 4 ? argumentsCount : 4;\n\n    // Register arguments (Integer / FP), always left-to-right.\n    for (i = 0; i != max; i++)\n    {\n      FuncArg& arg = self->_arguments[i];\n      uint32_t varType = arg.getVarType();\n\n      if (X86Util::isVarTypeInt(varType))\n      {\n        arg._regIndex = self->_gpList[i];\n        self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex()));\n      }\n      else if (X86Util::isVarTypeFloat(varType))\n      {\n        arg._regIndex = self->_xmmList[i];\n        self->_xmmArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex()));\n      }\n    }\n\n    // Stack arguments (always right-to-left).\n    for (i = argumentsCount - 1; i != -1; i--)\n    {\n      FuncArg& arg = self->_arguments[i];\n      uint32_t varType = arg.getVarType();\n\n      if (arg.isAssigned())\n        continue;\n\n      if (X86Util::isVarTypeInt(varType))\n      {\n        stackOffset -= 8; // Always 8 bytes.\n        arg._stackOffset = stackOffset;\n      }\n      else if (X86Util::isVarTypeFloat(varType))\n      {\n        int32_t size = static_cast<int32_t>(x86VarInfo[varType].getSize());\n        stackOffset -= size;\n        arg._stackOffset = stackOffset;\n      }\n    }\n\n    // 32 bytes shadow space (X64W calling convention specific).\n    stackOffset -= 4 * 8;\n  }\n  // Linux/Unix 64-bit (AMD64 calling convention).\n  else\n  {\n    // Register arguments (Integer), always left-to-right.\n    for (i = 0; i != static_cast<int32_t>(argumentsCount); i++)\n    {\n      FuncArg& arg = self->_arguments[i];\n      uint32_t varType = arg.getVarType();\n\n      if (X86Util::isVarTypeInt(varType) && gpPos < 32 && self->_gpList[gpPos] != kRegIndexInvalid)\n      {\n        arg._regIndex = self->_gpList[gpPos++];\n        self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex()));\n      }\n    }\n\n    // Register arguments (FP), always left-to-right.\n    for (i = 0; i != static_cast<int32_t>(argumentsCount); i++)\n    {\n      FuncArg& arg = self->_arguments[i];\n      uint32_t varType = arg.getVarType();\n\n      if (X86Util::isVarTypeFloat(varType))\n      {\n        arg._regIndex = self->_xmmList[xmmPos++];\n        self->_xmmArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex()));\n      }\n    }\n\n    // Stack arguments.\n    for (i = argumentsCount - 1; i != -1; i--)\n    {\n      FuncArg& arg = self->_arguments[i];\n      uint32_t varType = arg.getVarType();\n\n      if (arg.isAssigned())\n        continue;\n\n      if (X86Util::isVarTypeInt(varType))\n      {\n        stackOffset -= 8;\n        arg._stackOffset = static_cast<int16_t>(stackOffset);\n      }\n      else if (X86Util::isVarTypeFloat(varType))\n      {\n        int32_t size = (int32_t)x86VarInfo[varType].getSize();\n\n        stackOffset -= size;\n        arg._stackOffset = static_cast<int16_t>(stackOffset);\n      }\n    }\n  }\n#endif // ASMJIT_X64\n\n  // Modify stack offset (all function parameters will be in positive stack\n  // offset that is never zero).\n  for (i = 0; i < (int32_t)argumentsCount; i++)\n  {\n    FuncArg& arg = self->_arguments[i];\n    if (!arg.hasRegIndex())\n    {\n      arg._stackOffset += static_cast<uint16_t>(static_cast<int32_t>(sizeof(uintptr_t)) - stackOffset);\n    }\n  }\n\n  self->_argumentsStackSize = (uint32_t)(-stackOffset);\n}\n\nvoid X86FuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount)\n{\n  // Limit maximum function arguments to kFuncArgsMax.\n  if (argumentsCount > kFuncArgsMax)\n    argumentsCount = kFuncArgsMax;\n\n  X86FuncDecl_initCallingConvention(this, convention);\n  X86FuncDecl_initDefinition(this, returnType, arguments, argumentsCount);\n}\n\n// ============================================================================\n// [AsmJit::X86FuncDecl - Reset]\n// ============================================================================\n\nvoid X86FuncDecl::reset()\n{\n  uint32_t i;\n\n  // --------------------------------------------------------------------------\n  // [Core]\n  // --------------------------------------------------------------------------\n\n  _returnType = kVarTypeInvalid;\n  _argumentsCount = 0;\n\n  _reserved0[0] = 0;\n  _reserved0[1] = 0;\n\n  for (i = 0; i < ASMJIT_ARRAY_SIZE(_arguments); i++)\n    _arguments[i].reset();\n\n  _argumentsStackSize = 0;\n  _gpArgumentsMask = 0x0;\n  _mmArgumentsMask = 0x0;\n  _xmmArgumentsMask = 0x0;\n\n  // --------------------------------------------------------------------------\n  // [Convention]\n  // --------------------------------------------------------------------------\n\n  _convention = kFuncConvNone;\n  _calleePopsStack = false;\n  _argumentsDirection = kFuncArgsRTL;\n  _reserved1 = 0;\n\n  for (i = 0; i < ASMJIT_ARRAY_SIZE(_gpList); i++)\n    _gpList[i] = kRegIndexInvalid;\n\n  for (i = 0; i < ASMJIT_ARRAY_SIZE(_xmmList); i++)\n    _xmmList[i] = kRegIndexInvalid;\n\n  _gpListMask = 0x0;\n  _mmListMask = 0x0;\n  _xmmListMask = 0x0;\n\n  _gpPreservedMask = 0x0;\n  _mmPreservedMask = 0x0;\n  _xmmPreservedMask = 0x0;\n}\n\n} // AsmJit namespace\n\n// [Api-Begin]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86func.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86FUNC_H\n#define _ASMJIT_X86_X86FUNC_H\n\n// [Dependencies - AsmJit]\n#include \"../core/defs.h\"\n#include \"../core/func.h\"\n\n#include \"../x86/x86defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::TypeId]\n// ============================================================================\n\nASMJIT_DECLARE_TYPE_CORE(kX86VarTypeIntPtr);\nASMJIT_DECLARE_TYPE_ID(void, kVarTypeInvalid);\nASMJIT_DECLARE_TYPE_ID(Void, kVarTypeInvalid);\n\nASMJIT_DECLARE_TYPE_ID(int8_t, kX86VarTypeGpd);\nASMJIT_DECLARE_TYPE_ID(uint8_t, kX86VarTypeGpd);\n\nASMJIT_DECLARE_TYPE_ID(int16_t, kX86VarTypeGpd);\nASMJIT_DECLARE_TYPE_ID(uint16_t, kX86VarTypeGpd);\n\nASMJIT_DECLARE_TYPE_ID(int32_t, kX86VarTypeGpd);\nASMJIT_DECLARE_TYPE_ID(uint32_t, kX86VarTypeGpd);\n\n#if defined(ASMJIT_X64)\nASMJIT_DECLARE_TYPE_ID(int64_t, kX86VarTypeGpq);\nASMJIT_DECLARE_TYPE_ID(uint64_t, kX86VarTypeGpq);\n#endif // ASMJIT_X64\n\nASMJIT_DECLARE_TYPE_ID(float, kX86VarTypeFloat);\nASMJIT_DECLARE_TYPE_ID(double, kX86VarTypeDouble);\n\n// ============================================================================\n// [AsmJit::X86FuncDecl]\n// ============================================================================\n\n//! @brief X86 function, including calling convention, arguments and their\n//! register indices or stack positions.\nstruct X86FuncDecl : public FuncDecl\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create a new @ref FunctionX86 instance.\n  inline X86FuncDecl()\n  { reset(); }\n\n  // --------------------------------------------------------------------------\n  // [Accessors - Core]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get stack size needed for function arguments passed on the stack.\n  inline uint32_t getArgumentsStackSize() const\n  { return _argumentsStackSize; }\n\n  //! @brief Get bit-mask of GP registers used to pass function arguments.\n  inline uint32_t getGpArgumentsMask() const\n  { return _gpArgumentsMask; }\n\n  //! @brief Get bit-mask of MM registers used to pass function arguments.\n  inline uint32_t getMmArgumentsMask() const\n  { return _mmArgumentsMask; }\n\n  //! @brief Get bit-mask of XMM registers used to pass function arguments.\n  inline uint32_t getXmmArgumentsMask() const\n  { return _xmmArgumentsMask; }\n\n  // --------------------------------------------------------------------------\n  // [Accessors - Convention]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get function calling convention, see @c kX86FuncConv.\n  inline uint32_t getConvention() const\n  { return _convention; }\n\n  //! @brief Get whether the callee pops the stack.\n  inline uint32_t getCalleePopsStack() const\n  { return _calleePopsStack; }\n\n  //! @brief Get direction of arguments passed on the stack.\n  //!\n  //! Direction should be always @c kFuncArgsRTL.\n  //!\n  //! @note This is related to used calling convention, it's not affected by\n  //! number of function arguments or their types.\n  inline uint32_t getArgumentsDirection() const\n  { return _argumentsDirection; }\n\n  //! @brief Get registers used to pass first integer parameters by current\n  //! calling convention.\n  //!\n  //! @note This is related to used calling convention, it's not affected by\n  //! number of function arguments or their types.\n  inline const uint8_t* getGpList() const\n  { return _gpList; }\n\n  //! @brief Get registers used to pass first SP-FP or DP-FPparameters by\n  //! current calling convention.\n  //!\n  //! @note This is related to used calling convention, it's not affected by\n  //! number of function arguments or their types.\n  inline const uint8_t* getXmmList() const\n  { return _xmmList; }\n\n  //! @brief Get bit-mask of GP registers which might be used for arguments.\n  inline uint32_t getGpListMask() const\n  { return _gpListMask; }\n\n  //! @brief Get bit-mask of MM registers which might be used for arguments.\n  inline uint32_t getMmListMask() const\n  { return _mmListMask; }\n\n  //! @brief Get bit-mask of XMM registers which might be used for arguments.\n  inline uint32_t getXmmListMask() const\n  { return _xmmListMask; }\n\n  //! @brief Get bit-mask of general purpose registers that's preserved\n  //! (non-volatile).\n  //!\n  //! @note This is related to used calling convention, it's not affected by\n  //! number of function arguments or their types.\n  inline uint32_t getGpPreservedMask() const\n  { return _gpPreservedMask; }\n\n  //! @brief Get bit-mask of MM registers that's preserved (non-volatile).\n  //!\n  //! @note No standardized calling function is not preserving MM registers.\n  //! This member is here for extension writers who need for some reason custom\n  //! calling convention that can be called through code generated by AsmJit\n  //! (or other runtime code generator).\n  inline uint32_t getMmPreservedMask() const\n  { return _mmPreservedMask; }\n\n  //! @brief Get bit-mask of XMM registers that's preserved (non-volatile).\n  //!\n  //! @note This is related to used calling convention, it's not affected by\n  //! number of function arguments or their types.\n  inline uint32_t getXmmPreservedMask() const\n  { return _xmmPreservedMask; }\n\n  // --------------------------------------------------------------------------\n  // [Methods]\n  // --------------------------------------------------------------------------\n\n  //! @brief Find argument ID by the register code.\n  ASMJIT_API uint32_t findArgumentByRegCode(uint32_t regCode) const;\n\n  // --------------------------------------------------------------------------\n  // [SetPrototype]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set function prototype.\n  //!\n  //! This will set function calling convention and setup arguments variables.\n  //!\n  //! @note This function will allocate variables, it can be called only once.\n  ASMJIT_API void setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount);\n\n  // --------------------------------------------------------------------------\n  // [Reset]\n  // --------------------------------------------------------------------------\n\n  ASMJIT_API void reset();\n\n  // --------------------------------------------------------------------------\n  // [Members - Core]\n  // --------------------------------------------------------------------------\n\n  //! @brief Count of bytes consumed by arguments on the stack.\n  uint16_t _argumentsStackSize;\n  //! @brief Bitmask for GP registers used as passed function arguments.\n  uint16_t _gpArgumentsMask;\n  //! @brief Bitmask for MM registers used as passed function arguments.\n  uint16_t _mmArgumentsMask;\n  //! @brief Bitmask for XMM registers used as passed function arguments.\n  uint16_t _xmmArgumentsMask;\n\n  // --------------------------------------------------------------------------\n  // [Membes - Convention]\n  //\n  // This section doesn't depend on function arguments or return type. It \n  // depends only on function calling convention and it's filled according to\n  // that value.\n  // --------------------------------------------------------------------------\n\n  //! @brief Calling convention.\n  uint8_t _convention;\n  //! @brief Whether a callee pops stack.\n  uint8_t _calleePopsStack;\n  //! @brief Direction for arguments passed on the stack, see @c kFuncArgsDirection.\n  uint8_t _argumentsDirection;\n  //! @brief Reserved for future use #1 (alignment).\n  uint8_t _reserved1;\n\n  //! @brief List of register IDs used for GP arguments (order is important).\n  //!\n  //! @note All registers in _gpList are also specified in @ref _gpListMask.\n  //! Unused fields are filled by @ref kRegIndexInvalid.\n  uint8_t _gpList[16];\n  //! @brief List of register IDs used for XMM arguments (order is important).\n  //!\n  //! @note All registers in _gpList are also specified in @ref _xmmListMask.\n  //! Unused fields are filled by @ref kRegIndexInvalid.\n  uint8_t _xmmList[16];\n\n  //! @brief Bitmask for GP registers which might be used by arguments.\n  //!\n  //! @note All registers in _gpListMask are also specified in @ref _gpList.\n  uint16_t _gpListMask;\n  //! @brief Bitmask for MM registers which might be used by arguments.\n  uint16_t _mmListMask;\n  //! @brief Bitmask for XMM registers which might be used by arguments.\n  //!\n  //! @note All registers in _xmmListMask are also specified in @ref _xmmList.\n  uint16_t _xmmListMask;\n\n  //! @brief Bitmask for GP registers preserved across the function call.\n  //!\n  //! @note Preserved register mask is complement to @ref _gpListMask.\n  uint16_t _gpPreservedMask;\n  //! @brief Bitmask for MM registers preserved across the function call.\n  //!\n  //! @note Preserved register mask is complement to @ref _mmListMask.\n  uint16_t _mmPreservedMask;\n  //! @brief Bitmask for XMM registers preserved across the function call.\n  //!\n  //! @note Preserved register mask is complement to @ref _xmmListMask.\n  uint16_t _xmmPreservedMask;\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_X86FUNC_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86operand.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../x86/x86defs.h\"\n#include \"../x86/x86operand.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::Registers - no_reg]\n// ============================================================================\n\nconst GpReg no_reg(_Initialize(), kInvalidValue);\n\n// ============================================================================\n// [AsmJit::Registers - 8-bit]\n// ============================================================================\n\nconst GpReg al(_Initialize(), kX86RegAl);\nconst GpReg cl(_Initialize(), kX86RegCl);\nconst GpReg dl(_Initialize(), kX86RegDl);\nconst GpReg bl(_Initialize(), kX86RegBl);\n\n#if defined(ASMJIT_X64)\nconst GpReg spl(_Initialize(), kX86RegSpl);\nconst GpReg bpl(_Initialize(), kX86RegBpl);\nconst GpReg sil(_Initialize(), kX86RegSil);\nconst GpReg dil(_Initialize(), kX86RegDil);\n\nconst GpReg r8b(_Initialize(), kX86RegR8b);\nconst GpReg r9b(_Initialize(), kX86RegR9b);\nconst GpReg r10b(_Initialize(), kX86RegR10b);\nconst GpReg r11b(_Initialize(), kX86RegR11b);\nconst GpReg r12b(_Initialize(), kX86RegR12b);\nconst GpReg r13b(_Initialize(), kX86RegR13b);\nconst GpReg r14b(_Initialize(), kX86RegR14b);\nconst GpReg r15b(_Initialize(), kX86RegR15b);\n#endif // ASMJIT_X64\n\nconst GpReg ah(_Initialize(), kX86RegAh);\nconst GpReg ch(_Initialize(), kX86RegCh);\nconst GpReg dh(_Initialize(), kX86RegDh);\nconst GpReg bh(_Initialize(), kX86RegBh);\n\n// ============================================================================\n// [AsmJit::Registers - 16-bit]\n// ============================================================================\n\nconst GpReg ax(_Initialize(), kX86RegAx);\nconst GpReg cx(_Initialize(), kX86RegCx);\nconst GpReg dx(_Initialize(), kX86RegDx);\nconst GpReg bx(_Initialize(), kX86RegBx);\nconst GpReg sp(_Initialize(), kX86RegSp);\nconst GpReg bp(_Initialize(), kX86RegBp);\nconst GpReg si(_Initialize(), kX86RegSi);\nconst GpReg di(_Initialize(), kX86RegDi);\n\n#if defined(ASMJIT_X64)\nconst GpReg r8w(_Initialize(), kX86RegR8w);\nconst GpReg r9w(_Initialize(), kX86RegR9w);\nconst GpReg r10w(_Initialize(), kX86RegR10w);\nconst GpReg r11w(_Initialize(), kX86RegR11w);\nconst GpReg r12w(_Initialize(), kX86RegR12w);\nconst GpReg r13w(_Initialize(), kX86RegR13w);\nconst GpReg r14w(_Initialize(), kX86RegR14w);\nconst GpReg r15w(_Initialize(), kX86RegR15w);\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - 32-bit]\n// ============================================================================\n\nconst GpReg eax(_Initialize(), kX86RegEax);\nconst GpReg ecx(_Initialize(), kX86RegEcx);\nconst GpReg edx(_Initialize(), kX86RegEdx);\nconst GpReg ebx(_Initialize(), kX86RegEbx);\nconst GpReg esp(_Initialize(), kX86RegEsp);\nconst GpReg ebp(_Initialize(), kX86RegEbp);\nconst GpReg esi(_Initialize(), kX86RegEsi);\nconst GpReg edi(_Initialize(), kX86RegEdi);\n\n#if defined(ASMJIT_X64)\nconst GpReg r8d(_Initialize(), kX86RegR8d);\nconst GpReg r9d(_Initialize(), kX86RegR9d);\nconst GpReg r10d(_Initialize(), kX86RegR10d);\nconst GpReg r11d(_Initialize(), kX86RegR11d);\nconst GpReg r12d(_Initialize(), kX86RegR12d);\nconst GpReg r13d(_Initialize(), kX86RegR13d);\nconst GpReg r14d(_Initialize(), kX86RegR14d);\nconst GpReg r15d(_Initialize(), kX86RegR15d);\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - 64-bit]\n// ============================================================================\n\n#if defined(ASMJIT_X64)\nconst GpReg rax(_Initialize(), kX86RegRax);\nconst GpReg rcx(_Initialize(), kX86RegRcx);\nconst GpReg rdx(_Initialize(), kX86RegRdx);\nconst GpReg rbx(_Initialize(), kX86RegRbx);\nconst GpReg rsp(_Initialize(), kX86RegRsp);\nconst GpReg rbp(_Initialize(), kX86RegRbp);\nconst GpReg rsi(_Initialize(), kX86RegRsi);\nconst GpReg rdi(_Initialize(), kX86RegRdi);\n\nconst GpReg r8(_Initialize(), kX86RegR8);\nconst GpReg r9(_Initialize(), kX86RegR9);\nconst GpReg r10(_Initialize(), kX86RegR10);\nconst GpReg r11(_Initialize(), kX86RegR11);\nconst GpReg r12(_Initialize(), kX86RegR12);\nconst GpReg r13(_Initialize(), kX86RegR13);\nconst GpReg r14(_Initialize(), kX86RegR14);\nconst GpReg r15(_Initialize(), kX86RegR15);\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - Native (AsmJit extension)]\n// ============================================================================\n\nconst GpReg zax(_Initialize(), kX86RegZax);\nconst GpReg zcx(_Initialize(), kX86RegZcx);\nconst GpReg zdx(_Initialize(), kX86RegZdx);\nconst GpReg zbx(_Initialize(), kX86RegZbx);\nconst GpReg zsp(_Initialize(), kX86RegZsp);\nconst GpReg zbp(_Initialize(), kX86RegZbp);\nconst GpReg zsi(_Initialize(), kX86RegZsi);\nconst GpReg zdi(_Initialize(), kX86RegZdi);\n\n// ============================================================================\n// [AsmJit::Registers - MM]\n// ============================================================================\n\nconst MmReg mm0(_Initialize(), kX86RegMm0);\nconst MmReg mm1(_Initialize(), kX86RegMm1);\nconst MmReg mm2(_Initialize(), kX86RegMm2);\nconst MmReg mm3(_Initialize(), kX86RegMm3);\nconst MmReg mm4(_Initialize(), kX86RegMm4);\nconst MmReg mm5(_Initialize(), kX86RegMm5);\nconst MmReg mm6(_Initialize(), kX86RegMm6);\nconst MmReg mm7(_Initialize(), kX86RegMm7);\n\n// ============================================================================\n// [AsmJit::Registers - XMM]\n// ============================================================================\n\nconst XmmReg xmm0(_Initialize(), kX86RegXmm0);\nconst XmmReg xmm1(_Initialize(), kX86RegXmm1);\nconst XmmReg xmm2(_Initialize(), kX86RegXmm2);\nconst XmmReg xmm3(_Initialize(), kX86RegXmm3);\nconst XmmReg xmm4(_Initialize(), kX86RegXmm4);\nconst XmmReg xmm5(_Initialize(), kX86RegXmm5);\nconst XmmReg xmm6(_Initialize(), kX86RegXmm6);\nconst XmmReg xmm7(_Initialize(), kX86RegXmm7);\n\n#if defined(ASMJIT_X64)\nconst XmmReg xmm8(_Initialize(), kX86RegXmm8);\nconst XmmReg xmm9(_Initialize(), kX86RegXmm9);\nconst XmmReg xmm10(_Initialize(), kX86RegXmm10);\nconst XmmReg xmm11(_Initialize(), kX86RegXmm11);\nconst XmmReg xmm12(_Initialize(), kX86RegXmm12);\nconst XmmReg xmm13(_Initialize(), kX86RegXmm13);\nconst XmmReg xmm14(_Initialize(), kX86RegXmm14);\nconst XmmReg xmm15(_Initialize(), kX86RegXmm15);\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - Segment]\n// ============================================================================\n\nconst SegmentReg cs(_Initialize(), kX86RegCs);\nconst SegmentReg ss(_Initialize(), kX86RegSs);\nconst SegmentReg ds(_Initialize(), kX86RegDs);\nconst SegmentReg es(_Initialize(), kX86RegEs);\nconst SegmentReg fs(_Initialize(), kX86RegFs);\nconst SegmentReg gs(_Initialize(), kX86RegGs);\n\n// ============================================================================\n// [AsmJit::Var]\n// ============================================================================\n\nMem _BaseVarMem(const Var& var, uint32_t size)\n{\n  Mem m; //(_DontInitialize());\n\n  m._mem.op = kOperandMem;\n  m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size);\n  m._mem.type = kOperandMemNative;\n  m._mem.segment = kX86SegNone;\n  m._mem.sizePrefix = 0;\n  m._mem.shift = 0;\n\n  m._mem.id = var.getId();\n  m._mem.base = kInvalidValue;\n  m._mem.index = kInvalidValue;\n\n  m._mem.target = NULL;\n  m._mem.displacement = 0;\n\n  return m;\n}\n\n\nMem _BaseVarMem(const Var& var, uint32_t size, sysint_t disp)\n{\n  Mem m; //(_DontInitialize());\n\n  m._mem.op = kOperandMem;\n  m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size);\n  m._mem.type = kOperandMemNative;\n  m._mem.segment = kX86SegNone;\n  m._mem.sizePrefix = 0;\n  m._mem.shift = 0;\n\n  m._mem.id = var.getId();\n\n  m._mem.base = kInvalidValue;\n  m._mem.index = kInvalidValue;\n\n  m._mem.target = NULL;\n  m._mem.displacement = disp;\n\n  return m;\n}\n\nMem _BaseVarMem(const Var& var, uint32_t size, const GpVar& index, uint32_t shift, sysint_t disp)\n{\n  Mem m; //(_DontInitialize());\n\n  m._mem.op = kOperandMem;\n  m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size);\n  m._mem.type = kOperandMemNative;\n  m._mem.segment = kX86SegNone;\n  m._mem.sizePrefix = 0;\n  m._mem.shift = shift;\n\n  m._mem.id = var.getId();\n\n  m._mem.base = kInvalidValue;\n  m._mem.index = index.getId();\n\n  m._mem.target = NULL;\n  m._mem.displacement = disp;\n\n  return m;\n}\n\n// ============================================================================\n// [AsmJit::Mem - ptr[]]\n// ============================================================================\n\nMem ptr(const Label& label, sysint_t disp, uint32_t size)\n{\n  return Mem(label, disp, size);\n}\n\nMem ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size)\n{\n  Mem m(label, disp, size);\n\n  m._mem.index = index.getRegIndex();\n  m._mem.shift = shift;\n\n  return m;\n}\n\nMem ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size)\n{\n  Mem m(label, disp, size);\n\n  m._mem.index = index.getId();\n  m._mem.shift = shift;\n\n  return m;\n}\n\n// ============================================================================\n// [AsmJit::Mem - ptr[] - Absolute Addressing]\n// ============================================================================\n\nASMJIT_API Mem ptr_abs(void* target, sysint_t disp, uint32_t size)\n{\n  Mem m;\n\n  m._mem.size = size;\n  m._mem.type = kOperandMemAbsolute;\n  m._mem.segment = kX86SegNone;\n\n  m._mem.target = target;\n  m._mem.displacement = disp;\n\n  return m;\n}\n\nASMJIT_API Mem ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size)\n{\n  Mem m;// (_DontInitialize());\n\n  m._mem.op = kOperandMem;\n  m._mem.size = size;\n  m._mem.type = kOperandMemAbsolute;\n  m._mem.segment = kX86SegNone;\n\n#if defined(ASMJIT_X86)\n  m._mem.sizePrefix = index.getSize() != 4;\n#else\n  m._mem.sizePrefix = index.getSize() != 8;\n#endif\n\n  m._mem.shift = shift;\n\n  m._mem.id = kInvalidValue;\n  m._mem.base = kInvalidValue;\n  m._mem.index = index.getRegIndex();\n\n  m._mem.target = target;\n  m._mem.displacement = disp;\n\n  return m;\n}\n\nASMJIT_API Mem ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size)\n{\n  Mem m;// (_DontInitialize());\n\n  m._mem.op = kOperandMem;\n  m._mem.size = size;\n  m._mem.type = kOperandMemAbsolute;\n  m._mem.segment = kX86SegNone;\n\n#if defined(ASMJIT_X86)\n  m._mem.sizePrefix = index.getSize() != 4;\n#else\n  m._mem.sizePrefix = index.getSize() != 8;\n#endif\n\n  m._mem.shift = shift;\n\n  m._mem.id = kInvalidValue;\n  m._mem.base = kInvalidValue;\n  m._mem.index = index.getId();\n\n  m._mem.target = target;\n  m._mem.displacement = disp;\n\n  return m;\n}\n\n// ============================================================================\n// [AsmJit::Mem - ptr[base + displacement]]\n// ============================================================================\n\nMem ptr(const GpReg& base, sysint_t disp, uint32_t size)\n{\n  return Mem(base, disp, size);\n}\n\nMem ptr(const GpReg& base, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size)\n{\n  return Mem(base, index, shift, disp, size);\n}\n\nMem ptr(const GpVar& base, sysint_t disp, uint32_t size)\n{\n  return Mem(base, disp, size);\n}\n\nMem ptr(const GpVar& base, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size)\n{\n  return Mem(base, index, shift, disp, size);\n}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86operand.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86OPERAND_H\n#define _ASMJIT_X86_X86OPERAND_H\n\n// [Dependencies - AsmJit]\n#include \"../core/defs.h\"\n#include \"../core/operand.h\"\n\n#include \"../x86/x86defs.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [Forward Declarations]\n// ============================================================================\n\nstruct GpReg;\nstruct GpVar;\nstruct Mem;\nstruct MmReg;\nstruct MmVar;\nstruct Var;\nstruct X87Reg;\nstruct X87Var;\nstruct XmmReg;\nstruct XmmVar;\n\nstruct SegmentReg;\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::MmData]\n// ============================================================================\n\n//! @brief Structure used for MMX specific data (64-bit).\n//!\n//! This structure can be used to load / store data from / to MMX register.\nunion MmData\n{\n  // --------------------------------------------------------------------------\n  // [Methods]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set all eight signed 8-bit integers.\n  inline void setSB(\n    int8_t x0, int8_t x1, int8_t x2, int8_t x3, int8_t x4, int8_t x5, int8_t x6, int8_t x7)\n  {\n    sb[0] = x0; sb[1] = x1; sb[2] = x2; sb[3] = x3; sb[4] = x4; sb[5] = x5; sb[6] = x6; sb[7] = x7;\n  }\n\n  //! @brief Set all eight unsigned 8-bit integers.\n  inline void setUB(\n    uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7)\n  {\n    ub[0] = x0; ub[1] = x1; ub[2] = x2; ub[3] = x3; ub[4] = x4; ub[5] = x5; ub[6] = x6; ub[7] = x7;\n  }\n\n  //! @brief Set all four signed 16-bit integers.\n  inline void setSW(\n    int16_t x0, int16_t x1, int16_t x2, int16_t x3)\n  {\n    sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3;\n  }\n\n  //! @brief Set all four unsigned 16-bit integers.\n  inline void setUW(\n    uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3)\n  {\n    uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3;\n  }\n\n  //! @brief Set all two signed 32-bit integers.\n  inline void setSD(\n    int32_t x0, int32_t x1)\n  {\n    sd[0] = x0; sd[1] = x1;\n  }\n\n  //! @brief Set all two unsigned 32-bit integers.\n  inline void setUD(\n    uint32_t x0, uint32_t x1)\n  {\n    ud[0] = x0; ud[1] = x1;\n  }\n\n  //! @brief Set signed 64-bit integer.\n  inline void setSQ(\n    int64_t x0)\n  {\n    sq[0] = x0;\n  }\n\n  //! @brief Set unsigned 64-bit integer.\n  inline void setUQ(\n    uint64_t x0)\n  {\n    uq[0] = x0;\n  }\n\n  //! @brief Set all two SP-FP values.\n  inline void setSF(\n    float x0, float x1)\n  {\n    sf[0] = x0; sf[1] = x1;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Array of eight signed 8-bit integers.\n  int8_t sb[8];\n  //! @brief Array of eight unsigned 8-bit integers.\n  uint8_t ub[8];\n  //! @brief Array of four signed 16-bit integers.\n  int16_t sw[4];\n  //! @brief Array of four unsigned 16-bit integers.\n  uint16_t uw[4];\n  //! @brief Array of two signed 32-bit integers.\n  int32_t sd[2];\n  //! @brief Array of two unsigned 32-bit integers.\n  uint32_t ud[2];\n  //! @brief Array of one signed 64-bit integer.\n  int64_t sq[1];\n  //! @brief Array of one unsigned 64-bit integer.\n  uint64_t uq[1];\n\n  //! @brief Array of two SP-FP values.\n  float sf[2];\n};\n\n// ============================================================================\n// [AsmJit::XmmData]\n// ============================================================================\n\n//! @brief Structure used for SSE specific data (128-bit).\n//!\n//! This structure can be used to load / store data from / to SSE register.\n//!\n//! @note Always align SSE data to 16-bytes.\nunion XmmData\n{\n  // --------------------------------------------------------------------------\n  // [Methods]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set all sixteen signed 8-bit integers.\n  inline void setSB(\n    int8_t x0, int8_t x1, int8_t x2 , int8_t x3 , int8_t x4 , int8_t x5 , int8_t x6 , int8_t x7 ,\n    int8_t x8, int8_t x9, int8_t x10, int8_t x11, int8_t x12, int8_t x13, int8_t x14, int8_t x15)\n  {\n    sb[0] = x0; sb[1] = x1; sb[ 2] = x2 ; sb[3 ] = x3 ; sb[4 ] = x4 ; sb[5 ] = x5 ; sb[6 ] = x6 ; sb[7 ] = x7 ;\n    sb[8] = x8; sb[9] = x9; sb[10] = x10; sb[11] = x11; sb[12] = x12; sb[13] = x13; sb[14] = x14; sb[15] = x15; \n  }\n\n  //! @brief Set all sixteen unsigned 8-bit integers.\n  inline void setUB(\n    uint8_t x0, uint8_t x1, uint8_t x2 , uint8_t x3 , uint8_t x4 , uint8_t x5 , uint8_t x6 , uint8_t x7 ,\n    uint8_t x8, uint8_t x9, uint8_t x10, uint8_t x11, uint8_t x12, uint8_t x13, uint8_t x14, uint8_t x15)\n  {\n    ub[0] = x0; ub[1] = x1; ub[ 2] = x2 ; ub[3 ] = x3 ; ub[4 ] = x4 ; ub[5 ] = x5 ; ub[6 ] = x6 ; ub[7 ] = x7 ;\n    ub[8] = x8; ub[9] = x9; ub[10] = x10; ub[11] = x11; ub[12] = x12; ub[13] = x13; ub[14] = x14; ub[15] = x15; \n  }\n\n  //! @brief Set all eight signed 16-bit integers.\n  inline void setSW(\n    int16_t x0, int16_t x1, int16_t x2, int16_t x3, int16_t x4, int16_t x5, int16_t x6, int16_t x7)\n  {\n    sw[0] = x0; sw[1] = x1; sw[2] = x2; sw[3] = x3; sw[4] = x4; sw[5] = x5; sw[6] = x6; sw[7] = x7;\n  }\n\n  //! @brief Set all eight unsigned 16-bit integers.\n  inline void setUW(\n    uint16_t x0, uint16_t x1, uint16_t x2, uint16_t x3, uint16_t x4, uint16_t x5, uint16_t x6, uint16_t x7)\n  {\n    uw[0] = x0; uw[1] = x1; uw[2] = x2; uw[3] = x3; uw[4] = x4; uw[5] = x5; uw[6] = x6; uw[7] = x7;\n  }\n\n  //! @brief Set all four signed 32-bit integers.\n  inline void setSD(\n    int32_t x0, int32_t x1, int32_t x2, int32_t x3)\n  {\n    sd[0] = x0; sd[1] = x1; sd[2] = x2; sd[3] = x3;\n  }\n\n  //! @brief Set all four unsigned 32-bit integers.\n  inline void setUD(\n    uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3)\n  {\n    ud[0] = x0; ud[1] = x1; ud[2] = x2; ud[3] = x3;\n  }\n\n  //! @brief Set all two signed 64-bit integers.\n  inline void setSQ(\n    int64_t x0, int64_t x1)\n  {\n    sq[0] = x0; sq[1] = x1;\n  }\n\n  //! @brief Set all two unsigned 64-bit integers.\n  inline void setUQ(\n    uint64_t x0, uint64_t x1)\n  {\n    uq[0] = x0; uq[1] = x1;\n  }\n\n  //! @brief Set all four SP-FP floats.\n  inline void setSF(\n    float x0, float x1, float x2, float x3)\n  {\n    sf[0] = x0; sf[1] = x1; sf[2] = x2; sf[3] = x3;\n  }\n\n  //! @brief Set all two DP-FP floats.\n  inline void setDF(\n    double x0, double x1)\n  {\n    df[0] = x0; df[1] = x1;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Members]\n  // --------------------------------------------------------------------------\n\n  //! @brief Array of sixteen signed 8-bit integers.\n  int8_t sb[16];\n  //! @brief Array of sixteen unsigned 8-bit integers.\n  uint8_t ub[16];\n  //! @brief Array of eight signed 16-bit integers.\n  int16_t sw[8];\n  //! @brief Array of eight unsigned 16-bit integers.\n  uint16_t uw[8];\n  //! @brief Array of four signed 32-bit integers.\n  int32_t sd[4];\n  //! @brief Array of four unsigned 32-bit integers.\n  uint32_t ud[4];\n  //! @brief Array of two signed 64-bit integers.\n  int64_t sq[2];\n  //! @brief Array of two unsigned 64-bit integers.\n  uint64_t uq[2];\n\n  //! @brief Array of four 32-bit single precision floating points.\n  float sf[4];\n  //! @brief Array of two 64-bit double precision floating points.\n  double df[2];\n};\n\n// ============================================================================\n// [AsmJit::GpReg]\n// ============================================================================\n\n//! @brief General purpose register.\n//!\n//! This class is for all general purpose registers (64, 32, 16 and 8-bit).\nstruct GpReg : public Reg\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create non-initialized general purpose register.\n  inline GpReg() : Reg(kInvalidValue, 0) {}\n  //! @brief Create a reference to @a other general purpose register.\n  inline GpReg(const GpReg& other) : Reg(other) {}\n\n#if !defined(ASMJIT_NODOC)\n  inline GpReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {}\n  inline GpReg(const _Initialize&, uint32_t code) : Reg(code, static_cast<uint32_t>(1U << ((code & kRegTypeMask) >> 12))) {}\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Reg Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set register code to @a code.\n  inline GpReg& setCode(uint32_t code)\n  {\n    _reg.code = code;\n    return *this;\n  }\n\n  //! @brief Set register size to @a size.\n  inline GpReg& setSize(uint32_t size)\n  {\n    _reg.size = static_cast<uint8_t>(size);\n    return *this;\n  }\n\n  // --------------------------------------------------------------------------\n  // [GpReg Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether the general purpose register is BYTE (8-bit) type.\n  inline bool isGpb() const { return (_reg.code & kRegTypeMask) <= kX86RegTypeGpbHi; }\n  //! @brief Get whether the general purpose register is LO-BYTE (8-bit) type.\n  inline bool isGpbLo() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpbLo; }\n  //! @brief Get whether the general purpose register is HI-BYTE (8-bit) type.\n  inline bool isGpbHi() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpbHi; }\n\n  //! @brief Get whether the general purpose register is WORD (16-bit) type.\n  inline bool isGpw() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpw; }\n  //! @brief Get whether the general purpose register is DWORD (32-bit) type.\n  //!\n  //! This is default type for 32-bit platforms.\n  inline bool isGpd() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpd; }\n  //! @brief Get whether the general purpose register is QWORD (64-bit) type.\n  //!\n  //! This is default type for 64-bit platforms.\n  inline bool isGpq() const { return (_reg.code & kRegTypeMask) == kX86RegTypeGpq; }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline GpReg& operator=(const GpReg& other) { _copy(other); return *this; }\n  inline bool operator==(const GpReg& other) const { return getRegCode() == other.getRegCode(); }\n  inline bool operator!=(const GpReg& other) const { return getRegCode() != other.getRegCode(); }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::X87Reg]\n// ============================================================================\n\n//! @brief 80-bit x87 floating point register.\n//!\n//! To create instance of x87 register, use @c st() function.\nstruct X87Reg : public Reg\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create non-initialized x87 register.\n  inline X87Reg() : Reg(kInvalidValue, 10) {}\n  //! @brief Create a reference to @a other x87 register.\n  inline X87Reg(const X87Reg& other) : Reg(other) {}\n\n#if !defined(ASMJIT_NODOC)\n  inline X87Reg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {}\n  inline X87Reg(const _Initialize&, uint32_t code) : Reg(code | kX86RegTypeX87, 10) {}\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Reg Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set register code to @a code.\n  inline X87Reg& setCode(uint32_t code)\n  {\n    _reg.code = code;\n    return *this;\n  }\n\n  //! @brief Set register size to @a size.\n  inline X87Reg& setSize(uint32_t size)\n  {\n    _reg.size = static_cast<uint8_t>(size);\n    return *this;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline X87Reg& operator=(const X87Reg& other) { _copy(other); return *this; }\n  inline bool operator==(const X87Reg& other) const { return getRegCode() == other.getRegCode(); }\n  inline bool operator!=(const X87Reg& other) const { return getRegCode() != other.getRegCode(); }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::MmReg]\n// ============================================================================\n\n//! @brief 64-bit MMX register.\nstruct MmReg : public Reg\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create non-initialized MM register.\n  inline MmReg() : Reg(kInvalidValue, 8) {}\n  //! @brief Create a reference to @a other MM register.\n  inline MmReg(const MmReg& other) : Reg(other) {}\n\n#if !defined(ASMJIT_NODOC)\n  inline MmReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {}\n  inline MmReg(const _Initialize&, uint32_t code) : Reg(code, 8) {}\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Reg Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set register code to @a code.\n  inline MmReg& setCode(uint32_t code)\n  {\n    _reg.code = code;\n    return *this;\n  }\n\n  //! @brief Set register size to @a size.\n  inline MmReg& setSize(uint32_t size)\n  {\n    _reg.size = static_cast<uint8_t>(size);\n    return *this;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline MmReg& operator=(const MmReg& other) { _copy(other); return *this; }\n  inline bool operator==(const MmReg& other) const { return getRegCode() == other.getRegCode(); }\n  inline bool operator!=(const MmReg& other) const { return getRegCode() != other.getRegCode(); }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::XmmReg]\n// ============================================================================\n\n//! @brief 128-bit SSE register.\nstruct XmmReg : public Reg\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create non-initialized XMM register.\n  inline XmmReg() : Reg(kInvalidValue, 16) {}\n  //! @brief Create a reference to @a other XMM register.\n  inline XmmReg(const _Initialize&, uint32_t code) : Reg(code, 16) {}\n\n#if !defined(ASMJIT_NODOC)\n  inline XmmReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {}\n  inline XmmReg(const XmmReg& other) : Reg(other) {}\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Reg Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set register code to @a code.\n  inline XmmReg& setCode(uint32_t code)\n  {\n    _reg.code = code;\n    return *this;\n  }\n\n  //! @brief Set register size to @a size.\n  inline XmmReg& setSize(uint32_t size)\n  {\n    _reg.size = static_cast<uint8_t>(size);\n    return *this;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline XmmReg& operator=(const XmmReg& other) { _copy(other); return *this; }\n  inline bool operator==(const XmmReg& other) const { return getRegCode() == other.getRegCode(); }\n  inline bool operator!=(const XmmReg& other) const { return getRegCode() != other.getRegCode(); }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::SegmentReg]\n// ============================================================================\n\n//! @brief Segment register.\nstruct SegmentReg : public Reg\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create non-initialized segment register.\n  inline SegmentReg() : Reg(kInvalidValue, 2) {}\n  //! @brief Create a reference to @a other segment register.\n  inline SegmentReg(const _Initialize&, uint32_t code) : Reg(code, 2) {}\n\n#if !defined(ASMJIT_NODOC)\n  inline SegmentReg(const _DontInitialize& dontInitialize) : Reg(dontInitialize) {}\n  inline SegmentReg(const SegmentReg& other) : Reg(other) {}\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Reg Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Set register code to @a code.\n  inline SegmentReg& setCode(uint32_t code)\n  {\n    _reg.code = code;\n    return *this;\n  }\n\n  //! @brief Set register size to @a size.\n  inline SegmentReg& setSize(uint32_t size)\n  {\n    _reg.size = static_cast<uint8_t>(size);\n    return *this;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline SegmentReg& operator=(const SegmentReg& other) { _copy(other); return *this; }\n  inline bool operator==(const SegmentReg& other) const { return getRegCode() == other.getRegCode(); }\n  inline bool operator!=(const SegmentReg& other) const { return getRegCode() != other.getRegCode(); }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::Registers - no_reg]\n// ============================================================================\n\n//! @brief No register, can be used only in @c Mem operand.\nASMJIT_VAR const GpReg no_reg;\n\n// ============================================================================\n// [AsmJit::Registers - 8-bit]\n// ============================================================================\n\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg al;\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg cl;\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg dl;\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg bl;\n\n#if defined(ASMJIT_X64)\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg spl;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg bpl;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg sil;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg dil;\n\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r8b;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r9b;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r10b;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r11b;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r12b;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r13b;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r14b;\n//! @brief 8-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r15b;\n#endif // ASMJIT_X64\n\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg ah;\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg ch;\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg dh;\n//! @brief 8-bit General purpose register.\nASMJIT_VAR const GpReg bh;\n\n// ============================================================================\n// [AsmJit::Registers - 16-bit]\n// ============================================================================\n\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg ax;\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg cx;\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg dx;\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg bx;\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg sp;\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg bp;\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg si;\n//! @brief 16-bit General purpose register.\nASMJIT_VAR const GpReg di;\n\n#if defined(ASMJIT_X64)\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r8w;\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r9w;\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r10w;\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r11w;\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r12w;\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r13w;\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r14w;\n//! @brief 16-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r15w;\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - 32-bit]\n// ============================================================================\n\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg eax;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg ecx;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg edx;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg ebx;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg esp;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg ebp;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg esi;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg edi;\n\n#if defined(ASMJIT_X64)\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r8d;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r9d;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r10d;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r11d;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r12d;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r13d;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r14d;\n//! @brief 32-bit General purpose register.\nASMJIT_VAR const GpReg r15d;\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - 64-bit]\n// ============================================================================\n\n#if defined(ASMJIT_X64)\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rax;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rcx;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rdx;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rbx;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rsp;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rbp;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rsi;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg rdi;\n\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r8;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r9;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r10;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r11;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r12;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r13;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r14;\n//! @brief 64-bit General purpose register (64-bit mode only).\nASMJIT_VAR const GpReg r15;\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - Native (AsmJit extension)]\n// ============================================================================\n\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zax;\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zcx;\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zdx;\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zbx;\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zsp;\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zbp;\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zsi;\n//! @brief 32-bit or 64-bit General purpose register.\nASMJIT_VAR const GpReg zdi;\n\n// ============================================================================\n// [AsmJit::Registers - MM]\n// ============================================================================\n\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm0;\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm1;\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm2;\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm3;\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm4;\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm5;\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm6;\n//! @brief 64-bit MM register.\nASMJIT_VAR const MmReg mm7;\n\n// ============================================================================\n// [AsmJit::Registers - XMM]\n// ============================================================================\n\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm0;\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm1;\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm2;\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm3;\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm4;\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm5;\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm6;\n//! @brief 128-bit XMM register.\nASMJIT_VAR const XmmReg xmm7;\n\n#if defined(ASMJIT_X64)\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm8;\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm9;\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm10;\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm11;\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm12;\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm13;\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm14;\n//! @brief 128-bit XMM register (64-bit mode only).\nASMJIT_VAR const XmmReg xmm15;\n#endif // ASMJIT_X64\n\n// ============================================================================\n// [AsmJit::Registers - Segment]\n// ============================================================================\n\n//! @brief CS segment register.\nASMJIT_VAR const SegmentReg cs;\n//! @brief SS segment register.\nASMJIT_VAR const SegmentReg ss;\n//! @brief DS segment register.\nASMJIT_VAR const SegmentReg ds;\n//! @brief ES segment register.\nASMJIT_VAR const SegmentReg es;\n//! @brief FS segment register.\nASMJIT_VAR const SegmentReg fs;\n//! @brief GS segment register.\nASMJIT_VAR const SegmentReg gs;\n\n// ============================================================================\n// [AsmJit::Registers - Register From Index]\n// ============================================================================\n\n//! @brief Get general purpose register of byte size.\nstatic inline GpReg gpb_lo(uint32_t index)\n{ return GpReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeGpbLo)); }\n\n//! @brief Get general purpose register of byte size.\nstatic inline GpReg gpb_hi(uint32_t index)\n{ return GpReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeGpbHi)); }\n\n//! @brief Get general purpose register of word size.\nstatic inline GpReg gpw(uint32_t index)\n{ return GpReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeGpw)); }\n\n//! @brief Get general purpose register of dword size.\nstatic inline GpReg gpd(uint32_t index)\n{ return GpReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeGpd)); }\n\n#if defined(ASMJIT_X64)\n//! @brief Get general purpose register of qword size (64-bit only).\nstatic inline GpReg gpq(uint32_t index)\n{ return GpReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeGpq)); }\n#endif\n\n//! @brief Get general purpose dword/qword register (depending to architecture).\nstatic inline GpReg gpz(uint32_t index)\n{ return GpReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeGpz)); }\n\n//! @brief Get MMX (MM) register .\nstatic inline MmReg mm(uint32_t index)\n{ return MmReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeMm)); }\n\n//! @brief Get SSE (XMM) register.\nstatic inline XmmReg xmm(uint32_t index)\n{ return XmmReg(_Initialize(), static_cast<uint32_t>(index | kX86RegTypeXmm)); }\n\n//! @brief Get x87 register with index @a i.\nstatic inline X87Reg st(uint32_t i)\n{\n  ASMJIT_ASSERT(i < 8);\n  return X87Reg(_Initialize(), static_cast<uint32_t>(i));\n}\n\n// ============================================================================\n// [AsmJit::Mem]\n// ============================================================================\n\n//! @brief Memory operand.\nstruct Mem : public Operand\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline Mem() :\n    Operand(_DontInitialize())\n  {\n    _mem.op = kOperandMem;\n    _mem.size = 0;\n    _mem.type = kOperandMemNative;\n    _mem.segment = kX86SegNone;\n    _mem.sizePrefix = 0;\n    _mem.shift = 0;\n\n    _mem.id = kInvalidValue;\n    _mem.base = kInvalidValue;\n    _mem.index = kInvalidValue;\n\n    _mem.target = NULL;\n    _mem.displacement = 0;\n  }\n\n  inline Mem(const Label& label, sysint_t displacement, uint32_t size = 0) :\n    Operand(_DontInitialize())\n  {\n    _mem.op = kOperandMem;\n    _mem.size = (uint8_t)size;\n    _mem.type = kOperandMemLabel;\n    _mem.segment = kX86SegNone;\n    _mem.sizePrefix = 0;\n    _mem.shift = 0;\n\n    _mem.id = kInvalidValue;\n    _mem.base = reinterpret_cast<const Operand&>(label)._base.id;\n    _mem.index = kInvalidValue;\n\n    _mem.target = NULL;\n    _mem.displacement = displacement;\n  }\n\n  inline Mem(const GpReg& base, sysint_t displacement, uint32_t size = 0) :\n    Operand(_DontInitialize())\n  {\n    _mem.op = kOperandMem;\n    _mem.size = (uint8_t)size;\n    _mem.type = kOperandMemNative;\n    _mem.segment = kX86SegNone;\n\n#if defined(ASMJIT_X86)\n    _mem.sizePrefix = base.getSize() != 4;\n#else\n    _mem.sizePrefix = base.getSize() != 8;\n#endif\n\n    _mem.shift = 0;\n\n    _mem.id = kInvalidValue;\n    _mem.base = base.getRegCode() & kRegIndexMask;\n    _mem.index = kInvalidValue;\n\n    _mem.target = NULL;\n    _mem.displacement = displacement;\n  }\n\n  inline Mem(const GpVar& base, sysint_t displacement, uint32_t size = 0) :\n    Operand(_DontInitialize())\n  {\n    _mem.op = kOperandMem;\n    _mem.size = (uint8_t)size;\n    _mem.type = kOperandMemNative;\n    _mem.segment = kX86SegNone;\n\n#if defined(ASMJIT_X86)\n    _mem.sizePrefix = (reinterpret_cast<const Operand&>(base)._var.size) != 4;\n#else\n    _mem.sizePrefix = (reinterpret_cast<const Operand&>(base)._var.size) != 8;\n#endif\n\n    _mem.shift = 0;\n\n    _mem.id = kInvalidValue;\n    _mem.base = reinterpret_cast<const Operand&>(base).getId();\n    _mem.index = kInvalidValue;\n\n    _mem.target = NULL;\n    _mem.displacement = displacement;\n  }\n\n  inline Mem(const GpReg& base, const GpReg& index, uint32_t shift, sysint_t displacement, uint32_t size = 0) :\n    Operand(_DontInitialize())\n  {\n    ASMJIT_ASSERT(shift <= 3);\n\n    _mem.op = kOperandMem;\n    _mem.size = (uint8_t)size;\n    _mem.type = kOperandMemNative;\n    _mem.segment = kX86SegNone;\n\n#if defined(ASMJIT_X86)\n    _mem.sizePrefix = (base.getSize() | index.getSize()) != 4;\n#else\n    _mem.sizePrefix = (base.getSize() | index.getSize()) != 8;\n#endif\n\n    _mem.shift = (uint8_t)shift;\n\n    _mem.id = kInvalidValue;\n    _mem.base = base.getRegIndex();\n    _mem.index = index.getRegIndex();\n\n    _mem.target = NULL;\n    _mem.displacement = displacement;\n  }\n\n  inline Mem(const GpVar& base, const GpVar& index, uint32_t shift, sysint_t displacement, uint32_t size = 0) :\n    Operand(_DontInitialize())\n  {\n    ASMJIT_ASSERT(shift <= 3);\n\n    _mem.op = kOperandMem;\n    _mem.size = (uint8_t)size;\n    _mem.type = kOperandMemNative;\n    _mem.segment = kX86SegNone;\n\n#if defined(ASMJIT_X86)\n    _mem.sizePrefix = (reinterpret_cast<const Operand&>(base )._var.size | \n                       reinterpret_cast<const Operand&>(index)._var.size ) != 4;\n#else\n    _mem.sizePrefix = (reinterpret_cast<const Operand&>(base )._var.size | \n                       reinterpret_cast<const Operand&>(index)._var.size ) != 8;\n#endif\n\n    _mem.shift = (uint8_t)shift;\n\n    _mem.id = kInvalidValue;\n    _mem.base = reinterpret_cast<const Operand&>(base).getId();\n    _mem.index = reinterpret_cast<const Operand&>(index).getId();\n\n    _mem.target = NULL;\n    _mem.displacement = displacement;\n  }\n\n  inline Mem(const Mem& other) :\n    Operand(other)\n  {\n  }\n\n  inline Mem(const _DontInitialize& dontInitialize) :\n    Operand(dontInitialize)\n  {\n  }\n\n  // --------------------------------------------------------------------------\n  // [Mem Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get type of memory operand, see @c kOperandMemType.\n  inline uint32_t getMemType() const\n  { return _mem.type; }\n\n  //! @brief Get memory operand segment, see @c kX86Seg.\n  inline uint32_t getSegment() const\n  { return _mem.segment; }\n\n  //! @brief Set memory operand segment, see @c kX86Seg.\n  inline Mem& setSegment(uint32_t seg)\n  {\n    _mem.segment = static_cast<uint8_t>(seg);\n    return *this;\n  }\n\n  //! @brief Set memory operand segment, see @c kX86Seg.\n  inline Mem& setSegment(const SegmentReg& seg)\n  {\n    _mem.segment = static_cast<uint8_t>(seg.getRegIndex());\n    return *this;\n  }\n\n  //! @brief Get whether the memory operand has segment override prefix.\n  inline bool hasSegment() const\n  { return _mem.segment >= kX86SegCount; }\n\n  //! @brief Get whether the memory operand has base register.\n  inline bool hasBase() const\n  { return _mem.base != kInvalidValue; }\n\n  //! @brief Get whether the memory operand has index.\n  inline bool hasIndex() const\n  { return _mem.index != kInvalidValue; }\n\n  //! @brief Get whether the memory operand has shift used.\n  inline bool hasShift() const\n  { return _mem.shift != 0; }\n\n  //! @brief Get memory operand base register or @c kInvalidValue.\n  inline uint32_t getBase() const\n  { return _mem.base; }\n\n  //! @brief Get memory operand index register or @c kInvalidValue.\n  inline uint32_t getIndex() const\n  { return _mem.index; }\n\n  //! @brief Get memory operand index scale (0, 1, 2 or 3).\n  inline uint32_t getShift() const\n  { return _mem.shift; }\n\n  //! @brief Get whether to use size-override prefix.\n  //!\n  //! @note This is useful only for MOV and LEA type of instructions.\n  inline bool getSizePrefix() const\n  { return _mem.sizePrefix; }\n  \n  //! @brief Set whether to use size-override prefix.\n  inline Mem& setSizePrefix(bool b)\n  {\n    _mem.sizePrefix = b;\n    return *this;\n  }\n\n  //! @brief Get absolute target address.\n  //!\n  //! @note You should always check if operand contains address by @c getMemType().\n  inline void* getTarget() const\n  { return _mem.target; }\n\n  //! @brief Set absolute target address.\n  inline Mem& setTarget(void* target)\n  {\n    _mem.target = target;\n    return *this;\n  }\n\n  //! @brief Set memory operand size.\n  inline Mem& setSize(uint32_t size)\n  {\n    _mem.size = size;\n    return *this;\n  }\n\n  //! @brief Get memory operand relative displacement.\n  inline sysint_t getDisplacement() const\n  { return _mem.displacement; }\n\n  //! @brief Set memory operand relative displacement.\n  inline Mem& setDisplacement(sysint_t displacement)\n  {\n    _mem.displacement = displacement;\n    return *this;\n  }\n\n  //! @brief Adjust memory operand relative displacement by @a displacement.\n  inline Mem& adjust(sysint_t displacement)\n  {\n    _mem.displacement += displacement;\n    return *this;\n  }\n\n  //! @brief Get new memory operand adjusted by @a displacement.\n  inline Mem adjusted(sysint_t displacement) const\n  {\n    Mem result(*this);\n    result.adjust(displacement);\n    return result;\n  }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline Mem& operator=(const Mem& other)\n  {\n    _copy(other);\n    return *this;\n  }\n\n  inline bool operator==(const Mem& other) const\n  {\n    return _bin.u32[0] == other._bin.u32[0] &&\n           _bin.u32[1] == other._bin.u32[1] &&\n           _bin.u32[2] == other._bin.u32[2] &&\n           _bin.u32[3] == other._bin.u32[3] &&\n           _bin.uptr[0] == other._bin.uptr[0] &&\n           _bin.uptr[1] == other._bin.uptr[1];\n  }\n\n  inline bool operator!=(const Mem& other) const\n  {\n    return !(*this == other);\n  }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::Var]\n// ============================================================================\n\nASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size);\nASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size, sysint_t disp);\nASMJIT_API Mem _BaseVarMem(const Var& var, uint32_t size, const GpVar& index, uint32_t shift, sysint_t disp);\n\n//! @brief Base class for all variables.\nstruct Var : public Operand\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline Var(const _DontInitialize& dontInitialize) :\n    Operand(dontInitialize)\n  {\n  }\n#endif // ASMJIT_NODOC\n\n  inline Var() :\n    Operand(_DontInitialize())\n  {\n    _var.op = kOperandVar;\n    _var.size = 0;\n    _var.regCode = kInvalidValue;\n    _var.varType = kInvalidValue;\n    _var.id = kInvalidValue;\n  }\n\n  inline Var(const Var& other) :\n    Operand(other)\n  {\n  }\n\n  // --------------------------------------------------------------------------\n  // [Type]\n  // --------------------------------------------------------------------------\n\n  inline uint32_t getVarType() const\n  { return _var.varType; }\n\n  inline bool isGpVar() const\n  { return _var.varType <= kX86VarTypeGpq; }\n\n  inline bool isX87Var() const\n  { return _var.varType >= kX86VarTypeX87 && _var.varType <= kX86VarTypeX87SD; }\n\n  inline bool isMmVar() const\n  { return _var.varType == kX86VarTypeMm; }\n\n  inline bool isXmmVar() const\n  { return _var.varType >= kX86VarTypeXmm && _var.varType <= kX86VarTypeXmmPD; }\n\n  // --------------------------------------------------------------------------\n  // [Memory Cast]\n  // --------------------------------------------------------------------------\n\n  //! @brief Cast this variable to memory operand.\n  //!\n  //! @note Size of operand depends on native variable type, you can use other\n  //! variants if you want specific one.\n  inline Mem m() const\n  { return _BaseVarMem(*this, kInvalidValue); }\n\n  //! @overload.\n  inline Mem m(sysint_t disp) const\n  { return _BaseVarMem(*this, kInvalidValue, disp); }\n\n  //! @overload.\n  inline Mem m(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const\n  { return _BaseVarMem(*this, kInvalidValue, index, shift, disp); }\n\n  //! @brief Cast this variable to 8-bit memory operand.\n  inline Mem m8() const\n  { return _BaseVarMem(*this, 1); }\n\n  //! @overload.\n  inline Mem m8(sysint_t disp) const\n  { return _BaseVarMem(*this, 1, disp); }\n\n  //! @overload.\n  inline Mem m8(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const\n  { return _BaseVarMem(*this, 1, index, shift, disp); }\n\n  //! @brief Cast this variable to 16-bit memory operand.\n  inline Mem m16() const\n  { return _BaseVarMem(*this, 2); }\n\n  //! @overload.\n  inline Mem m16(sysint_t disp) const\n  { return _BaseVarMem(*this, 2, disp); }\n\n  //! @overload.\n  inline Mem m16(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const\n  { return _BaseVarMem(*this, 2, index, shift, disp); }\n\n  //! @brief Cast this variable to 32-bit memory operand.\n  inline Mem m32() const\n  { return _BaseVarMem(*this, 4); }\n\n  //! @overload.\n  inline Mem m32(sysint_t disp) const\n  { return _BaseVarMem(*this, 4, disp); }\n\n  //! @overload.\n  inline Mem m32(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const\n  { return _BaseVarMem(*this, 4, index, shift, disp); }\n\n  //! @brief Cast this variable to 64-bit memory operand.\n  inline Mem m64() const\n  { return _BaseVarMem(*this, 8); }\n\n  //! @overload.\n  inline Mem m64(sysint_t disp) const\n  { return _BaseVarMem(*this, 8, disp); }\n\n  //! @overload.\n  inline Mem m64(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const\n  { return _BaseVarMem(*this, 8, index, shift, disp); }\n\n  //! @brief Cast this variable to 80-bit memory operand (long double).\n  inline Mem m80() const\n  { return _BaseVarMem(*this, 10); }\n\n  //! @overload.\n  inline Mem m80(sysint_t disp) const\n  { return _BaseVarMem(*this, 10, disp); }\n\n  //! @overload.\n  inline Mem m80(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const\n  { return _BaseVarMem(*this, 10, index, shift, disp); }\n\n  //! @brief Cast this variable to 128-bit memory operand.\n  inline Mem m128() const\n  { return _BaseVarMem(*this, 16); }\n\n  //! @overload.\n  inline Mem m128(sysint_t disp) const\n  { return _BaseVarMem(*this, 16, disp); }\n\n  //! @overload.\n  inline Mem m128(const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) const\n  { return _BaseVarMem(*this, 16, index, shift, disp); }\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline Var& operator=(const Var& other)\n  { _copy(other); return *this; }\n\n  inline bool operator==(const Var& other) const { return _base.id == other._base.id && _var.regCode == other._var.regCode; }\n  inline bool operator!=(const Var& other) const { return _base.id != other._base.id || _var.regCode != other._var.regCode; }\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Private]\n  // --------------------------------------------------------------------------\n\nprotected:\n  inline Var(const Var& other, uint32_t regCode, uint32_t size) :\n    Operand(_DontInitialize())\n  {\n    _var.op = kOperandVar;\n    _var.size = (uint8_t)size;\n    _var.id = other._base.id;\n    _var.regCode = regCode;\n    _var.varType = other._var.varType;\n  }\n};\n\n// ============================================================================\n// [AsmJit::X87Var]\n// ============================================================================\n\n//! @brief X87 Variable operand.\nstruct X87Var : public Var\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline X87Var(const _DontInitialize& dontInitialize) :\n    Var(dontInitialize)\n  {\n  }\n\n  inline X87Var() :\n    Var(_DontInitialize())\n  {\n    _var.op = kOperandVar;\n    _var.size = 12;\n    _var.id = kInvalidValue;\n\n    _var.regCode = kX86RegTypeX87;\n    _var.varType = kX86VarTypeX87;\n  }\n\n  inline X87Var(const X87Var& other) :\n    Var(other) {}\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline X87Var& operator=(const X87Var& other)\n  { _copy(other); return *this; }\n\n  inline bool operator==(const X87Var& other) const { return _base.id == other._base.id; }\n  inline bool operator!=(const X87Var& other) const { return _base.id != other._base.id; }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::GpVar]\n// ============================================================================\n\n//! @brief GP variable operand.\nstruct GpVar : public Var\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create new uninitialized @c GpVar instance (internal constructor).\n  inline GpVar(const _DontInitialize& dontInitialize) :\n    Var(dontInitialize)\n  {\n  }\n\n  //! @brief Create new uninitialized @c GpVar instance.\n  inline GpVar() :\n    Var(_DontInitialize())\n  {\n    _var.op = kOperandVar;\n    _var.size = sizeof(sysint_t);\n    _var.id = kInvalidValue;\n\n    _var.regCode = kX86RegTypeGpz;\n    _var.varType = kX86VarTypeGpz;\n  }\n\n  //! @brief Create new @c GpVar instance using @a other.\n  //!\n  //! Note this will not create a different variable, use @c Compiler::newGpVar()\n  //! if you want to do so. This is only copy-constructor that allows to store\n  //! the same variable in different places.\n  inline GpVar(const GpVar& other) :\n    Var(other) {}\n\n  // --------------------------------------------------------------------------\n  // [GpVar Specific]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get whether this variable is general purpose BYTE register.\n  inline bool isGpb() const { return (_var.regCode & kRegTypeMask) <= kX86RegTypeGpbHi; }\n  //! @brief Get whether this variable is general purpose BYTE.LO register.\n  inline bool isGpbLo() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpbLo; }\n  //! @brief Get whether this variable is general purpose BYTE.HI register.\n  inline bool isGpbHi() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpbHi; }\n\n  //! @brief Get whether this variable is general purpose WORD register.\n  inline bool isGpw() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpw; }\n  //! @brief Get whether this variable is general purpose DWORD register.\n  inline bool isGpd() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpd; }\n  //! @brief Get whether this variable is general purpose QWORD (only 64-bit) register.\n  inline bool isGpq() const { return (_var.regCode & kRegTypeMask) == kX86RegTypeGpq; }\n\n  // --------------------------------------------------------------------------\n  // [GpVar Cast]\n  // --------------------------------------------------------------------------\n\n  //! @brief Cast this variable to 8-bit (LO) part of variable\n  inline GpVar r8() const { return GpVar(*this, kX86RegTypeGpbLo, 1); }\n  //! @brief Cast this variable to 8-bit (LO) part of variable\n  inline GpVar r8Lo() const { return GpVar(*this, kX86RegTypeGpbLo, 1); }\n  //! @brief Cast this variable to 8-bit (HI) part of variable\n  inline GpVar r8Hi() const { return GpVar(*this, kX86RegTypeGpbHi, 1); }\n\n  //! @brief Cast this variable to 16-bit part of variable\n  inline GpVar r16() const { return GpVar(*this, kX86RegTypeGpw, 2); }\n  //! @brief Cast this variable to 32-bit part of variable\n  inline GpVar r32() const { return GpVar(*this, kX86RegTypeGpd, 4); }\n#if defined(ASMJIT_X64)\n  //! @brief Cast this variable to 64-bit part of variable\n  inline GpVar r64() const { return GpVar(*this, kX86RegTypeGpq, 8); }\n#endif // ASMJIT_X64\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline GpVar& operator=(const GpVar& other)\n  { _copy(other); return *this; }\n\n  inline bool operator==(const GpVar& other) const { return _base.id == other._base.id && _var.regCode == other._var.regCode; }\n  inline bool operator!=(const GpVar& other) const { return _base.id != other._base.id || _var.regCode != other._var.regCode; }\n#endif // ASMJIT_NODOC\n\n  // --------------------------------------------------------------------------\n  // [Private]\n  // --------------------------------------------------------------------------\n\nprotected:\n  inline GpVar(const GpVar& other, uint32_t regCode, uint32_t size) :\n    Var(other, regCode, size)\n  {\n  }\n};\n\n// ============================================================================\n// [AsmJit::MmVar]\n// ============================================================================\n\n//! @brief MM variable operand.\nstruct MmVar : public Var\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  //! @brief Create new uninitialized @c MmVar instance (internal constructor).\n  inline MmVar(const _DontInitialize& dontInitialize) :\n    Var(dontInitialize)\n  {\n  }\n\n  //! @brief Create new uninitialized @c MmVar instance.\n  inline MmVar() :\n    Var(_DontInitialize())\n  {\n    _var.op = kOperandVar;\n    _var.size = 8;\n    _var.id = kInvalidValue;\n\n    _var.regCode = kX86RegTypeMm;\n    _var.varType = kX86VarTypeMm;\n  }\n\n  //! @brief Create new @c MmVar instance using @a other.\n  //!\n  //! Note this will not create a different variable, use @c Compiler::newMmVar()\n  //! if you want to do so. This is only copy-constructor that allows to store\n  //! the same variable in different places.\n  inline MmVar(const MmVar& other) :\n    Var(other) {}\n\n  // --------------------------------------------------------------------------\n  // [MmVar Cast]\n  // --------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline MmVar& operator=(const MmVar& other)\n  { _copy(other); return *this; }\n\n  inline bool operator==(const MmVar& other) const { return _base.id == other._base.id; }\n  inline bool operator!=(const MmVar& other) const { return _base.id != other._base.id; }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::XmmVar]\n// ============================================================================\n\n//! @brief XMM Variable operand.\nstruct XmmVar : public Var\n{\n  // --------------------------------------------------------------------------\n  // [Construction / Destruction]\n  // --------------------------------------------------------------------------\n\n  inline XmmVar(const _DontInitialize& dontInitialize) :\n    Var(dontInitialize)\n  {\n  }\n\n  inline XmmVar() :\n    Var(_DontInitialize())\n  {\n    _var.op = kOperandVar;\n    _var.size = 16;\n    _var.id = kInvalidValue;\n\n    _var.regCode = kX86RegTypeXmm;\n    _var.varType = kX86VarTypeXmm;\n  }\n\n  inline XmmVar(const XmmVar& other) :\n    Var(other) {}\n\n  // --------------------------------------------------------------------------\n  // [XmmVar Access]\n  // --------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------\n  // [Operator Overload]\n  // --------------------------------------------------------------------------\n\n#if !defined(ASMJIT_NODOC)\n  inline XmmVar& operator=(const XmmVar& other)\n  { _copy(other); return *this; }\n\n  inline bool operator==(const XmmVar& other) const { return _base.id == other._base.id; }\n  inline bool operator!=(const XmmVar& other) const { return _base.id != other._base.id; }\n#endif // ASMJIT_NODOC\n};\n\n// ============================================================================\n// [AsmJit::Mem - [label + displacement]]\n// ============================================================================\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr(const Label& label, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr(const Label& label, sysint_t disp = 0) { return ptr(label, disp, sizeof(sysint_t)); }\n\n// ============================================================================\n// [AsmJit::Mem - [label + index << shift + displacement]]\n// ============================================================================\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, sizeof(sysint_t)); }\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr(label, index, shift, disp, sizeof(sysint_t)); }\n\n// ============================================================================\n// [AsmJit::Mem - segment[target + displacement]\n// ============================================================================\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr_abs(void* target, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand (used for 80-bit floating points).\nstatic inline Mem tword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr_abs(void* target, sysint_t disp = 0) { return ptr_abs(target, disp, sizeof(sysint_t)); }\n\n// ============================================================================\n// [AsmJit::Mem - segment[target + index << shift + displacement]\n// ============================================================================\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, sizeof(sysint_t)); }\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp = 0) { return ptr_abs(target, index, shift, disp, sizeof(sysint_t)); }\n\n// ============================================================================\n// [AsmJit::Mem - ptr[base + displacement]]\n// ============================================================================\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr(const GpReg& base, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr(const GpReg& base, sysint_t disp = 0) { return ptr(base, disp, sizeof(sysint_t)); }\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr(const GpVar& base, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr(const GpVar& base, sysint_t disp = 0) { return ptr(base, disp, sizeof(sysint_t)); }\n\n// ============================================================================\n// [AsmJit::Mem - ptr[base + (index << shift) + displacement]]\n// ============================================================================\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr(const GpReg& base, const GpReg& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, sizeof(sysint_t)); }\n\n//! @brief Create a custom pointer operand.\nASMJIT_API Mem ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0, uint32_t size = 0);\n//! @brief Create a byte pointer operand.\nstatic inline Mem byte_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeByte); }\n//! @brief Create a word pointer operand.\nstatic inline Mem word_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeWord); }\n//! @brief Create a dword pointer operand.\nstatic inline Mem dword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDWord); }\n//! @brief Create a qword pointer operand.\nstatic inline Mem qword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); }\n//! @brief Create a tword pointer operand.\nstatic inline Mem tword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeTWord); }\n//! @brief Create a dqword pointer operand.\nstatic inline Mem dqword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); }\n//! @brief Create a mmword pointer operand.\nstatic inline Mem mmword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeQWord); }\n//! @brief Create a xmmword pointer operand.\nstatic inline Mem xmmword_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, kSizeDQWord); }\n//! @brief Create an intptr_t pointer operand.\nstatic inline Mem sysint_ptr(const GpVar& base, const GpVar& index, uint32_t shift = 0, sysint_t disp = 0) { return ptr(base, index, shift, disp, sizeof(sysint_t)); }\n\n// ============================================================================\n// [AsmJit::Macros]\n// ============================================================================\n\n//! @brief Create Shuffle Constant for MMX/SSE shuffle instrutions.\n//! @param z First component position, number at interval [0, 3] inclusive.\n//! @param x Second component position, number at interval [0, 3] inclusive.\n//! @param y Third component position, number at interval [0, 3] inclusive.\n//! @param w Fourth component position, number at interval [0, 3] inclusive.\n//!\n//! Shuffle constants can be used to make immediate value for these intrinsics:\n//! - @ref X86Assembler::pshufw()\n//! - @ref X86Assembler::pshufd()\n//! - @ref X86Assembler::pshufhw()\n//! - @ref X86Assembler::pshuflw()\n//! - @ref X86Assembler::shufps()\nstatic inline uint8_t mm_shuffle(uint8_t z, uint8_t y, uint8_t x, uint8_t w)\n{ return (z << 6) | (y << 4) | (x << 2) | w; }\n\n//! @}\n\n} // AsmJit namespace\n\n// [Guard]\n#endif // _ASMJIT_X86_X86OPERAND_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86util.cpp",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n#define ASMJIT_EXPORTS\n\n// [Dependencies - AsmJit]\n#include \"../x86/x86defs.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n// ============================================================================\n// [AsmJit::_x86UtilJccFromCond]\n// ============================================================================\n\nconst uint32_t _x86UtilJccFromCond[20] =\n{\n  kX86InstJO,\n  kX86InstJNO,\n  kX86InstJB,\n  kX86InstJAE,\n  kX86InstJE,\n  kX86InstJNE,\n  kX86InstJBE,\n  kX86InstJA,\n  kX86InstJS,\n  kX86InstJNS,\n  kX86InstJPE,\n  kX86InstJPO,\n  kX86InstJL,\n  kX86InstJGE,\n  kX86InstJLE,\n  kX86InstJG,\n\n  kInstNone,\n  kInstNone,\n  kInstNone,\n  kInstNone\n};\n\n// ============================================================================\n// [AsmJit::_x86UtilMovccFromCond]\n// ============================================================================\n\nconst uint32_t _x86UtilMovccFromCond[20] =\n{\n  kX86InstCMovO,\n  kX86InstCMovNO,\n  kX86InstCMovB,\n  kX86InstCMovAE,\n  kX86InstCMovE,\n  kX86InstCMovNE,\n  kX86InstCMovBE,\n  kX86InstCMovA,\n  kX86InstCMovS,\n  kX86InstCMovNS,\n  kX86InstCMovPE,\n  kX86InstCMovPO,\n  kX86InstCMovL,\n  kX86InstCMovGE,\n  kX86InstCMovLE,\n  kX86InstCMovG,\n\n  kInstNone,\n  kInstNone,\n  kInstNone,\n  kInstNone\n};\n\n// ============================================================================\n// [AsmJit::_x86UtilSetccFromCond]\n// ============================================================================\n\nconst uint32_t _x86UtilSetccFromCond[20] =\n{\n  kX86InstSetO,\n  kX86InstSetNO,\n  kX86InstSetB,\n  kX86InstSetAE,\n  kX86InstSetE,\n  kX86InstSetNE,\n  kX86InstSetBE,\n  kX86InstSetA,\n  kX86InstSetS,\n  kX86InstSetNS,\n  kX86InstSetPE,\n  kX86InstSetPO,\n  kX86InstSetL,\n  kX86InstSetGE,\n  kX86InstSetLE,\n  kX86InstSetG,\n\n  kInstNone,\n  kInstNone,\n  kInstNone,\n  kInstNone\n};\n\n// ============================================================================\n// [AsmJit::_x86UtilReversedCond]\n// ============================================================================\n\nconst uint32_t _x86UtilReversedCond[20] =\n{\n  /* x86CondO  -> */ kX86CondO,\n  /* x86CondNO -> */ kX86CondNO,\n  /* x86CondB  -> */ kX86CondA,\n  /* x86CondAE -> */ kX86CondBE,\n  /* x86CondE  -> */ kX86CondE,\n  /* x86CondNE -> */ kX86CondNE,\n  /* x86CondBE -> */ kX86CondAE,\n  /* x86CondA  -> */ kX86CondB,\n  /* x86CondS  -> */ kX86CondS,\n  /* x86CondNS -> */ kX86CondNS,\n  /* x86CondPE -> */ kX86CondPE,\n  /* x86CondPO -> */ kX86CondPO,\n\n  /* x86CondL  -> */ kX86CondG,\n  /* x86CondGE -> */ kX86CondLE,\n\n  /* x86CondLE -> */ kX86CondGE,\n  /* x86CondG  -> */ kX86CondL,\n\n  /* kX86CondFpuUnordered    -> */ kX86CondFpuUnordered,\n  /* kX86CondFpuNotUnordered -> */ kX86CondFpuNotUnordered,\n\n  0x12,\n  0x13\n};\n\n} // AsmJit namespace\n\n#include \"../core/apiend.h\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86/x86util.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_X86UTIL_H\n#define _ASMJIT_X86_X86UTIL_H\n\n// [Dependencies - AsmJit]\n#include \"../x86/x86defs.h\"\n#include \"../x86/x86operand.h\"\n\n// [Api-Begin]\n#include \"../core/apibegin.h\"\n\nnamespace AsmJit {\n\n//! @addtogroup AsmJit_X86\n//! @{\n\n// ============================================================================\n// [AsmJit::X86Util]\n// ============================================================================\n\n//! @brief Map condition code to \"jcc\" group of instructions.\nASMJIT_VAR const uint32_t _x86UtilJccFromCond[20];\n//! @brief Map condition code to \"cmovcc\" group of instructions.\nASMJIT_VAR const uint32_t _x86UtilMovccFromCond[20];\n//! @brief Map condition code to \"setcc\" group of instructions.\nASMJIT_VAR const uint32_t _x86UtilSetccFromCond[20];\n//! @brief Map condition code to reversed condition code.\nASMJIT_VAR const uint32_t _x86UtilReversedCond[20];\n\nstruct X86Util\n{\n  // --------------------------------------------------------------------------\n  // [Condition Codes]\n  // --------------------------------------------------------------------------\n\n  //! @brief Get the equivalent of negated condition code.\n  static inline uint32_t getNegatedCond(uint32_t cond)\n  {\n    return static_cast<kX86Cond>(cond ^ static_cast<uint32_t>(cond < kX86CondNone));\n  }\n\n  //! @brief Corresponds to transposing the operands of a comparison.\n  static inline uint32_t getReversedCond(uint32_t cond)\n  {\n    ASMJIT_ASSERT(static_cast<uint32_t>(cond) < ASMJIT_ARRAY_SIZE(_x86UtilReversedCond));\n    return _x86UtilReversedCond[cond];\n  }\n\n  //! @brief Translate condition code @a cc to jcc instruction code.\n  //! @sa @c kX86InstCode, @c kX86InstJ.\n  static inline uint32_t getJccInstFromCond(uint32_t cond)\n  {\n    ASMJIT_ASSERT(static_cast<uint32_t>(cond) < ASMJIT_ARRAY_SIZE(_x86UtilJccFromCond));\n    return _x86UtilJccFromCond[cond];\n  }\n\n  //! @brief Translate condition code @a cc to cmovcc instruction code.\n  //! @sa @c kX86InstCode, @c kX86InstCMov.\n  static inline uint32_t getCMovccInstFromCond(uint32_t cond)\n  {\n    ASMJIT_ASSERT(static_cast<uint32_t>(cond) < ASMJIT_ARRAY_SIZE(_x86UtilMovccFromCond));\n    return _x86UtilMovccFromCond[cond];\n  }\n\n  //! @brief Translate condition code @a cc to setcc instruction code.\n  //! @sa @c kX86InstCode, @c kX86InstSet.\n  static inline uint32_t getSetccInstFromCond(uint32_t cond)\n  {\n    ASMJIT_ASSERT(static_cast<uint32_t>(cond) < ASMJIT_ARRAY_SIZE(_x86UtilSetccFromCond));\n    return _x86UtilSetccFromCond[cond];\n  }\n\n  // --------------------------------------------------------------------------\n  // [Variables]\n  // --------------------------------------------------------------------------\n\n  static inline uint32_t getVarClassFromVarType(uint32_t varType)\n  {\n    ASMJIT_ASSERT(varType < kX86VarTypeCount);\n    return x86VarInfo[varType].getClass();\n  }\n\n  static inline uint32_t getVarSizeFromVarType(uint32_t varType)\n  {\n    ASMJIT_ASSERT(varType < kX86VarTypeCount);\n    return x86VarInfo[varType].getSize();\n  }\n\n  static inline uint32_t getRegCodeFromVarType(uint32_t varType, uint32_t regIndex)\n  {\n    ASMJIT_ASSERT(varType < kX86VarTypeCount);\n    return x86VarInfo[varType].getCode() | regIndex;\n  }\n\n  static inline bool isVarTypeInt(uint32_t varType)\n  {\n    ASMJIT_ASSERT(varType < kX86VarTypeCount);\n    return (x86VarInfo[varType].getClass() & kX86VarClassGp) != 0;\n  }\n\n  static inline bool isVarTypeFloat(uint32_t varType)\n  {\n    ASMJIT_ASSERT(varType < kX86VarTypeCount);\n    return (x86VarInfo[varType].getFlags() & (kX86VarFlagSP | kX86VarFlagDP)) != 0;\n  }\n};\n\n//! @}\n\n} // AsmJit namespace\n\n// [Api-End]\n#include \"../core/apiend.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_X86UTIL_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/AsmJit/x86.h",
    "content": "// [AsmJit]\n// Complete JIT Assembler for C++ Language.\n//\n// [License]\n// Zlib - See COPYING file in this package.\n\n// [Guard]\n#ifndef _ASMJIT_X86_H\n#define _ASMJIT_X86_H\n\n// [Dependencies - AsmJit]\n#include \"core.h\"\n\n#include \"x86/x86assembler.h\"\n#include \"x86/x86compiler.h\"\n#include \"x86/x86compilercontext.h\"\n#include \"x86/x86compilerfunc.h\"\n#include \"x86/x86compileritem.h\"\n#include \"x86/x86cpuinfo.h\"\n#include \"x86/x86defs.h\"\n#include \"x86/x86func.h\"\n#include \"x86/x86operand.h\"\n#include \"x86/x86util.h\"\n\n// [Guard]\n#endif // _ASMJIT_X86_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/ConvertUTF.c",
    "content": "/*\n * Copyright 2001-2004 Unicode, Inc.\n * \n * Disclaimer\n * \n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n * \n * Limitations on Rights to Redistribute This Code\n * \n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n */\n\n/* ---------------------------------------------------------------------\n\n    Conversions between UTF32, UTF-16, and UTF-8. Source code file.\n    Author: Mark E. Davis, 1994.\n    Rev History: Rick McGowan, fixes & updates May 2001.\n    Sept 2001: fixed const & error conditions per\n\tmods suggested by S. Parent & A. Lillich.\n    June 2002: Tim Dodd added detection and handling of incomplete\n\tsource sequences, enhanced error detection, added casts\n\tto eliminate compiler warnings.\n    July 2003: slight mods to back out aggressive FFFE detection.\n    Jan 2004: updated switches in from-UTF8 conversions.\n    Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.\n\n    See the header file \"ConvertUTF.h\" for complete documentation.\n\n------------------------------------------------------------------------ */\n\n\n#include \"ConvertUTF.h\"\n#ifdef CVTUTF_DEBUG\n#include <stdio.h>\n#endif\n\nstatic const int halfShift  = 10; /* used for shifting by 10 bits */\n\nstatic const UTF32 halfBase = 0x0010000UL;\nstatic const UTF32 halfMask = 0x3FFUL;\n\n#define UNI_SUR_HIGH_START  (UTF32)0xD800\n#define UNI_SUR_HIGH_END    (UTF32)0xDBFF\n#define UNI_SUR_LOW_START   (UTF32)0xDC00\n#define UNI_SUR_LOW_END     (UTF32)0xDFFF\n#define false\t   0\n#define true\t    1\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF32toUTF16 (\n\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF32* source = *sourceStart;\n    UTF16* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch;\n\tif (target >= targetEnd) {\n\t    result = targetExhausted; break;\n\t}\n\tch = *source++;\n\tif (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */\n\t    /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\tif (flags == strictConversion) {\n\t\t    --source; /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t} else {\n\t\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t\t}\n\t    } else {\n\t\t*target++ = (UTF16)ch; /* normal case */\n\t    }\n\t} else if (ch > UNI_MAX_LEGAL_UTF32) {\n\t    if (flags == strictConversion) {\n\t\tresult = sourceIllegal;\n\t    } else {\n\t\t*target++ = UNI_REPLACEMENT_CHAR;\n\t    }\n\t} else {\n\t    /* target is a character in range 0xFFFF - 0x10FFFF. */\n\t    if (target + 1 >= targetEnd) {\n\t\t--source; /* Back up source pointer! */\n\t\tresult = targetExhausted; break;\n\t    }\n\t    ch -= halfBase;\n\t    *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);\n\t    *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);\n\t}\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF16toUTF32 (\n\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF16* source = *sourceStart;\n    UTF32* target = *targetStart;\n    UTF32 ch, ch2;\n    while (source < sourceEnd) {\n\tconst UTF16* oldSource = source; /*  In case we have to back up because of target overflow. */\n\tch = *source++;\n\t/* If we have a surrogate pair, convert to UTF32 first. */\n\tif (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {\n\t    /* If the 16 bits following the high surrogate are in the source buffer... */\n\t    if (source < sourceEnd) {\n\t\tch2 = *source;\n\t\t/* If it's a low surrogate, convert to UTF32. */\n\t\tif (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {\n\t\t    ch = ((ch - UNI_SUR_HIGH_START) << halfShift)\n\t\t\t+ (ch2 - UNI_SUR_LOW_START) + halfBase;\n\t\t    ++source;\n\t\t} else if (flags == strictConversion) { /* it's an unpaired high surrogate */\n\t\t    --source; /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t}\n\t    } else { /* We don't have the 16 bits following the high surrogate. */\n\t\t--source; /* return to the high surrogate */\n\t\tresult = sourceExhausted;\n\t\tbreak;\n\t    }\n\t} else if (flags == strictConversion) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {\n\t\t--source; /* return to the illegal value itself */\n\t\tresult = sourceIllegal;\n\t\tbreak;\n\t    }\n\t}\n\tif (target >= targetEnd) {\n\t    source = oldSource; /* Back up source pointer! */\n\t    result = targetExhausted; break;\n\t}\n\t*target++ = ch;\n    }\n    *sourceStart = source;\n    *targetStart = target;\n#ifdef CVTUTF_DEBUG\nif (result == sourceIllegal) {\n    fprintf(stderr, \"ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\\n\", ch, ch2);\n    fflush(stderr);\n}\n#endif\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Index into the table below with the first byte of a UTF-8 sequence to\n * get the number of trailing bytes that are supposed to follow it.\n * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is\n * left as-is for anyone who may want to do such conversion, which was\n * allowed in earlier algorithms.\n */\nstatic const char trailingBytesForUTF8[256] = {\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5\n};\n\n/*\n * Magic values subtracted from a buffer value during UTF8 conversion.\n * This table contains as many values as there might be trailing bytes\n * in a UTF-8 sequence.\n */\nstatic const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, \n\t\t     0x03C82080UL, 0xFA082080UL, 0x82082080UL };\n\n/*\n * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed\n * into the first byte, depending on how many bytes follow.  There are\n * as many entries in this table as there are UTF-8 sequence types.\n * (I.e., one byte sequence, two byte... etc.). Remember that sequencs\n * for *legal* UTF-8 will be 4 or fewer bytes total.\n */\nstatic const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\n/* --------------------------------------------------------------------- */\n\n/* The interface converts a whole buffer to avoid function-call overhead.\n * Constants have been gathered. Loops & conditionals have been removed as\n * much as possible for efficiency, in favor of drop-through switches.\n * (See \"Note A\" at the bottom of the file for equivalent code.)\n * If your compiler supports it, the \"isLegalUTF8\" call can be turned\n * into an inline function.\n */\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF16toUTF8 (\n\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF16* source = *sourceStart;\n    UTF8* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch;\n\tunsigned short bytesToWrite = 0;\n\tconst UTF32 byteMask = 0xBF;\n\tconst UTF32 byteMark = 0x80; \n\tconst UTF16* oldSource = source; /* In case we have to back up because of target overflow. */\n\tch = *source++;\n\t/* If we have a surrogate pair, convert to UTF32 first. */\n\tif (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {\n\t    /* If the 16 bits following the high surrogate are in the source buffer... */\n\t    if (source < sourceEnd) {\n\t\tUTF32 ch2 = *source;\n\t\t/* If it's a low surrogate, convert to UTF32. */\n\t\tif (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {\n\t\t    ch = ((ch - UNI_SUR_HIGH_START) << halfShift)\n\t\t\t+ (ch2 - UNI_SUR_LOW_START) + halfBase;\n\t\t    ++source;\n\t\t} else if (flags == strictConversion) { /* it's an unpaired high surrogate */\n\t\t    --source; /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t}\n\t    } else { /* We don't have the 16 bits following the high surrogate. */\n\t\t--source; /* return to the high surrogate */\n\t\tresult = sourceExhausted;\n\t\tbreak;\n\t    }\n\t} else if (flags == strictConversion) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {\n\t\t--source; /* return to the illegal value itself */\n\t\tresult = sourceIllegal;\n\t\tbreak;\n\t    }\n\t}\n\t/* Figure out how many bytes the result will require */\n\tif (ch < (UTF32)0x80) {\t     bytesToWrite = 1;\n\t} else if (ch < (UTF32)0x800) {     bytesToWrite = 2;\n\t} else if (ch < (UTF32)0x10000) {   bytesToWrite = 3;\n\t} else if (ch < (UTF32)0x110000) {  bytesToWrite = 4;\n\t} else {\t\t\t    bytesToWrite = 3;\n\t\t\t\t\t    ch = UNI_REPLACEMENT_CHAR;\n\t}\n\n\ttarget += bytesToWrite;\n\tif (target > targetEnd) {\n\t    source = oldSource; /* Back up source pointer! */\n\t    target -= bytesToWrite; result = targetExhausted; break;\n\t}\n\tswitch (bytesToWrite) { /* note: everything falls through. */\n\t    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 1: *--target =  (UTF8)(ch | firstByteMark[bytesToWrite]);\n\t}\n\ttarget += bytesToWrite;\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Utility routine to tell whether a sequence of bytes is legal UTF-8.\n * This must be called with the length pre-determined by the first byte.\n * If not calling this from ConvertUTF8to*, then the length can be set by:\n *  length = trailingBytesForUTF8[*source]+1;\n * and the sequence is illegal right away if there aren't that many bytes\n * available.\n * If presented with a length > 4, this returns false.  The Unicode\n * definition of UTF-8 goes up to 4-byte sequences.\n */\n\nstatic Boolean isLegalUTF8(const UTF8 *source, int length) {\n    UTF8 a;\n    const UTF8 *srcptr = source+length;\n    switch (length) {\n    default: return false;\n\t/* Everything else falls through when \"true\"... */\n    case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;\n    case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;\n    case 2: if ((a = (*--srcptr)) > 0xBF) return false;\n\n\tswitch (*source) {\n\t    /* no fall-through in this inner switch */\n\t    case 0xE0: if (a < 0xA0) return false; break;\n\t    case 0xED: if (a > 0x9F) return false; break;\n\t    case 0xF0: if (a < 0x90) return false; break;\n\t    case 0xF4: if (a > 0x8F) return false; break;\n\t    default:   if (a < 0x80) return false;\n\t}\n\n    case 1: if (*source >= 0x80 && *source < 0xC2) return false;\n    }\n    if (*source > 0xF4) return false;\n    return true;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Exported function to return whether a UTF-8 sequence is legal or not.\n * This is not used here; it's just exported.\n */\nBoolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {\n    int length = trailingBytesForUTF8[*source]+1;\n    if (source+length > sourceEnd) {\n\treturn false;\n    }\n    return isLegalUTF8(source, length);\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF8toUTF16 (\n\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF8* source = *sourceStart;\n    UTF16* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch = 0;\n\tunsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n\tif (source + extraBytesToRead >= sourceEnd) {\n\t    result = sourceExhausted; break;\n\t}\n\t/* Do this check whether lenient or strict */\n\tif (! isLegalUTF8(source, extraBytesToRead+1)) {\n\t    result = sourceIllegal;\n\t    break;\n\t}\n\t/*\n\t * The cases all fall through. See \"Note A\" below.\n\t */\n\tswitch (extraBytesToRead) {\n\t    case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t    case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t    case 3: ch += *source++; ch <<= 6;\n\t    case 2: ch += *source++; ch <<= 6;\n\t    case 1: ch += *source++; ch <<= 6;\n\t    case 0: ch += *source++;\n\t}\n\tch -= offsetsFromUTF8[extraBytesToRead];\n\n\tif (target >= targetEnd) {\n\t    source -= (extraBytesToRead+1); /* Back up source pointer! */\n\t    result = targetExhausted; break;\n\t}\n\tif (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\tif (flags == strictConversion) {\n\t\t    source -= (extraBytesToRead+1); /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t} else {\n\t\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t\t}\n\t    } else {\n\t\t*target++ = (UTF16)ch; /* normal case */\n\t    }\n\t} else if (ch > UNI_MAX_UTF16) {\n\t    if (flags == strictConversion) {\n\t\tresult = sourceIllegal;\n\t\tsource -= (extraBytesToRead+1); /* return to the start */\n\t\tbreak; /* Bail out; shouldn't continue */\n\t    } else {\n\t\t*target++ = UNI_REPLACEMENT_CHAR;\n\t    }\n\t} else {\n\t    /* target is a character in range 0xFFFF - 0x10FFFF. */\n\t    if (target + 1 >= targetEnd) {\n\t\tsource -= (extraBytesToRead+1); /* Back up source pointer! */\n\t\tresult = targetExhausted; break;\n\t    }\n\t    ch -= halfBase;\n\t    *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);\n\t    *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);\n\t}\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF32toUTF8 (\n\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF32* source = *sourceStart;\n    UTF8* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch;\n\tunsigned short bytesToWrite = 0;\n\tconst UTF32 byteMask = 0xBF;\n\tconst UTF32 byteMark = 0x80; \n\tch = *source++;\n\tif (flags == strictConversion ) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\t--source; /* return to the illegal value itself */\n\t\tresult = sourceIllegal;\n\t\tbreak;\n\t    }\n\t}\n\t/*\n\t * Figure out how many bytes the result will require. Turn any\n\t * illegally large UTF32 things (> Plane 17) into replacement chars.\n\t */\n\tif (ch < (UTF32)0x80) {\t     bytesToWrite = 1;\n\t} else if (ch < (UTF32)0x800) {     bytesToWrite = 2;\n\t} else if (ch < (UTF32)0x10000) {   bytesToWrite = 3;\n\t} else if (ch <= UNI_MAX_LEGAL_UTF32) {  bytesToWrite = 4;\n\t} else {\t\t\t    bytesToWrite = 3;\n\t\t\t\t\t    ch = UNI_REPLACEMENT_CHAR;\n\t\t\t\t\t    result = sourceIllegal;\n\t}\n\t\n\ttarget += bytesToWrite;\n\tif (target > targetEnd) {\n\t    --source; /* Back up source pointer! */\n\t    target -= bytesToWrite; result = targetExhausted; break;\n\t}\n\tswitch (bytesToWrite) { /* note: everything falls through. */\n\t    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);\n\t}\n\ttarget += bytesToWrite;\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF8toUTF32 (\n\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF8* source = *sourceStart;\n    UTF32* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch = 0;\n\tunsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n\tif (source + extraBytesToRead >= sourceEnd) {\n\t    result = sourceExhausted; break;\n\t}\n\t/* Do this check whether lenient or strict */\n\tif (! isLegalUTF8(source, extraBytesToRead+1)) {\n\t    result = sourceIllegal;\n\t    break;\n\t}\n\t/*\n\t * The cases all fall through. See \"Note A\" below.\n\t */\n\tswitch (extraBytesToRead) {\n\t    case 5: ch += *source++; ch <<= 6;\n\t    case 4: ch += *source++; ch <<= 6;\n\t    case 3: ch += *source++; ch <<= 6;\n\t    case 2: ch += *source++; ch <<= 6;\n\t    case 1: ch += *source++; ch <<= 6;\n\t    case 0: ch += *source++;\n\t}\n\tch -= offsetsFromUTF8[extraBytesToRead];\n\n\tif (target >= targetEnd) {\n\t    source -= (extraBytesToRead+1); /* Back up the source pointer! */\n\t    result = targetExhausted; break;\n\t}\n\tif (ch <= UNI_MAX_LEGAL_UTF32) {\n\t    /*\n\t     * UTF-16 surrogate values are illegal in UTF-32, and anything\n\t     * over Plane 17 (> 0x10FFFF) is illegal.\n\t     */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\tif (flags == strictConversion) {\n\t\t    source -= (extraBytesToRead+1); /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t} else {\n\t\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t\t}\n\t    } else {\n\t\t*target++ = ch;\n\t    }\n\t} else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */\n\t    result = sourceIllegal;\n\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t}\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* ---------------------------------------------------------------------\n\n    Note A.\n    The fall-through switches in UTF-8 reading code save a\n    temp variable, some decrements & conditionals.  The switches\n    are equivalent to the following loop:\n\t{\n\t    int tmpBytesToRead = extraBytesToRead+1;\n\t    do {\n\t\tch += *source++;\n\t\t--tmpBytesToRead;\n\t\tif (tmpBytesToRead) ch <<= 6;\n\t    } while (tmpBytesToRead > 0);\n\t}\n    In UTF-8 writing code, the switches on \"bytesToWrite\" are\n    similarly unrolled loops.\n\n   --------------------------------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/ConvertUTF.h",
    "content": "/*\n * Copyright 2001-2004 Unicode, Inc.\n * \n * Disclaimer\n * \n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n * \n * Limitations on Rights to Redistribute This Code\n * \n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n */\n\n/* ---------------------------------------------------------------------\n\n    Conversions between UTF32, UTF-16, and UTF-8.  Header file.\n\n    Several funtions are included here, forming a complete set of\n    conversions between the three formats.  UTF-7 is not included\n    here, but is handled in a separate source file.\n\n    Each of these routines takes pointers to input buffers and output\n    buffers.  The input buffers are const.\n\n    Each routine converts the text between *sourceStart and sourceEnd,\n    putting the result into the buffer between *targetStart and\n    targetEnd. Note: the end pointers are *after* the last item: e.g. \n    *(sourceEnd - 1) is the last item.\n\n    The return result indicates whether the conversion was successful,\n    and if not, whether the problem was in the source or target buffers.\n    (Only the first encountered problem is indicated.)\n\n    After the conversion, *sourceStart and *targetStart are both\n    updated to point to the end of last text successfully converted in\n    the respective buffers.\n\n    Input parameters:\n\tsourceStart - pointer to a pointer to the source buffer.\n\t\tThe contents of this are modified on return so that\n\t\tit points at the next thing to be converted.\n\ttargetStart - similarly, pointer to pointer to the target buffer.\n\tsourceEnd, targetEnd - respectively pointers to the ends of the\n\t\ttwo buffers, for overflow checking only.\n\n    These conversion functions take a ConversionFlags argument. When this\n    flag is set to strict, both irregular sequences and isolated surrogates\n    will cause an error.  When the flag is set to lenient, both irregular\n    sequences and isolated surrogates are converted.\n\n    Whether the flag is strict or lenient, all illegal sequences will cause\n    an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,\n    or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code\n    must check for illegal sequences.\n\n    When the flag is set to lenient, characters over 0x10FFFF are converted\n    to the replacement character; otherwise (when the flag is set to strict)\n    they constitute an error.\n\n    Output parameters:\n\tThe value \"sourceIllegal\" is returned from some routines if the input\n\tsequence is malformed.  When \"sourceIllegal\" is returned, the source\n\tvalue will point to the illegal value that caused the problem. E.g.,\n\tin UTF-8 when a sequence is malformed, it points to the start of the\n\tmalformed sequence.  \n\n    Author: Mark E. Davis, 1994.\n    Rev History: Rick McGowan, fixes & updates May 2001.\n\t\t Fixes & updates, Sept 2001.\n\n------------------------------------------------------------------------ */\n\n/* ---------------------------------------------------------------------\n    The following 4 definitions are compiler-specific.\n    The C standard does not guarantee that wchar_t has at least\n    16 bits, so wchar_t is no less portable than unsigned short!\n    All should be unsigned values to avoid sign extension during\n    bit mask & shift operations.\n------------------------------------------------------------------------ */\n\ntypedef unsigned long\tUTF32;\t/* at least 32 bits */\ntypedef unsigned short\tUTF16;\t/* at least 16 bits */\ntypedef unsigned char\tUTF8;\t/* typically 8 bits */\ntypedef unsigned char\tBoolean; /* 0 or 1 */\n\n/* Some fundamental constants */\n#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD\n#define UNI_MAX_BMP (UTF32)0x0000FFFF\n#define UNI_MAX_UTF16 (UTF32)0x0010FFFF\n#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF\n#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF\n\ntypedef enum {\n\tconversionOK, \t\t/* conversion successful */\n\tsourceExhausted,\t/* partial character in source, but hit end */\n\ttargetExhausted,\t/* insuff. room in target for conversion */\n\tsourceIllegal\t\t/* source sequence is illegal/malformed */\n} ConversionResult;\n\ntypedef enum {\n\tstrictConversion = 0,\n\tlenientConversion\n} ConversionFlags;\n\n/* This is for C++ and does no harm in C */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nConversionResult ConvertUTF8toUTF16 (\n\t\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\t\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF16toUTF8 (\n\t\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\t\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);\n\t\t\nConversionResult ConvertUTF8toUTF32 (\n\t\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\t\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF32toUTF8 (\n\t\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\t\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);\n\t\t\nConversionResult ConvertUTF16toUTF32 (\n\t\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\t\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF32toUTF16 (\n\t\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\t\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);\n\nBoolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);\n\n#ifdef __cplusplus\n}\n#endif\n\n/* --------------------------------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/FileMap.cpp",
    "content": "/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"types.h\"\n#include \"FileMap.h\"\n#include <stdio.h>\n\n#ifdef _WINDOWS\n#include <windows.h>\n#else\n#include <sys/mman.h> \n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <unistd.h> \n#endif\n\n#ifdef _MSC_VER\nclass FileMap::Impl\n{\npublic:\n\tImpl(const char *file);\n\t~Impl();\n\n\tbool Open(int size, bool del_on_close);\n\tvoid Close();\n\n\tvoid* GetPtr();\n\tint GetSize();\n\nprivate:\n\tHANDLE m_hFile;\n\tHANDLE m_hFileMap;\n\tvoid *m_Ptr;\n\tint m_Size;\n\n\tchar m_szFile[MAX_PATH];\n};\n\nFileMap::Impl::Impl(const char *file)\n\t: m_hFile(INVALID_HANDLE_VALUE)\n\t, m_hFileMap(NULL)\n\t, m_Ptr(NULL)\n\t, m_Size(0)\n{\n\tstrncpy(m_szFile, file, MAX_PATH);\n}\n\nFileMap::Impl::~Impl()\n{\n\tClose();\n}\n\nbool FileMap::Impl::Open(int size, bool del_on_close)\n{\n\tClose();\n\n\tDWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY;\n\tif (del_on_close)\n\t\tdwFlagsAndAttributes |= FILE_FLAG_DELETE_ON_CLOSE;\n\n\tm_hFile = CreateFileA(m_szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, \n\t\t\t\t\t\tOPEN_ALWAYS, dwFlagsAndAttributes, NULL);\n\tif (m_hFile == INVALID_HANDLE_VALUE)\n\t\treturn false;\n\n\tLARGE_INTEGER file_szie;\n\n\tGetFileSizeEx(m_hFile, &file_szie);\n\tif (file_szie.QuadPart < size)\n\t{\n\t\tfile_szie.QuadPart = size;\n\t\tSetFilePointerEx(m_hFile, file_szie, NULL, FILE_BEGIN);\n\t\tSetEndOfFile(m_hFile);\n\t}\n\n\tm_hFileMap = CreateFileMapping(m_hFile, NULL, PAGE_READWRITE, 0, 0, NULL);\n\tif (m_hFileMap == NULL)\n\t{\n\t\tCloseHandle(m_hFile);\n\t\tm_hFile = INVALID_HANDLE_VALUE;\n\n\t\treturn false;\n\t}\n\n\tm_Size = size;\n\tm_Ptr = MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, size);\n\tif (!m_Ptr)\n\t{\n\t\tCloseHandle(m_hFileMap);\n\t\tCloseHandle(m_hFile);\n\n\t\tm_hFileMap = NULL;\n\t\tm_hFile = INVALID_HANDLE_VALUE;\n\t\tm_Size = 0;\n\t}\n\n\treturn true;\n}\n\nvoid FileMap::Impl::Close()\n{\n\tif (m_Ptr)\n\t{\n\t\tUnmapViewOfFile(m_Ptr);\n\t\tCloseHandle(m_hFileMap);\n\t\tCloseHandle(m_hFile);\n\n\t\tm_Ptr = NULL;\n\t\tm_hFileMap = NULL;\n\t\tm_hFile = INVALID_HANDLE_VALUE;\n\t\tm_Size = 0;\n\t}\n}\n\nvoid* FileMap::Impl::GetPtr()\n{\n\treturn m_Ptr;\n}\n\nint FileMap::Impl::GetSize()\n{\n\treturn m_Size;\n}\n#else\nclass FileMap::Impl\n{\npublic:\n\tImpl(const char *file);\n\t~Impl();\n\n\tbool Open(int size, bool del_on_close);\n\tvoid Close();\n\n\tvoid* GetPtr();\n\tint GetSize();\n\nprivate:\n\tint m_hFile;\n\tvoid *m_Ptr;\n\tint m_Size;\n\tbool m_DelOnClose;\n\n\tchar m_szFile[MAX_PATH];\n};\n\nFileMap::Impl::Impl(const char *file)\n\t: m_hFile(-1)\n\t, m_Ptr(NULL)\n\t, m_Size(0)\n\t, m_DelOnClose(false)\n{\n\tstrncpy(m_szFile, file, MAX_PATH);\n}\n\nFileMap::Impl::~Impl()\n{\n\tClose();\n}\n\nbool FileMap::Impl::Open(int size, bool del_on_close)\n{\n\tClose();\n\n\tm_hFile = open(m_szFile, O_RDWR | O_CREAT, S_IRWXU);\n\tif (m_hFile == -1)\n\t\treturn false;\n\n\t//int file_szie = lseek(m_hFile, 0, SEEK_END);\n\t//if (file_szie < size)\n\t{\n\t\tchar tmp = 0;\n\n\t\tlseek(m_hFile, size-1, SEEK_SET);\n\t\twrite(m_hFile, &tmp, 1);\n\t}\n\n\tm_Size = size;\n\tm_DelOnClose = del_on_close;\n\tm_Ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, m_hFile, 0);\n\tif (m_Ptr == MAP_FAILED)\n\t{\n\t\tclose(m_hFile);\n\n\t\tm_Ptr = NULL;\n\t\tm_hFile = -1;\n\t\tm_Size = 0;\n\t\tm_DelOnClose = false;\n\t}\n\n\treturn true;\n}\n\nvoid FileMap::Impl::Close()\n{\n\tif (m_Ptr)\n\t{\n\t\tmunmap(m_Ptr, m_Size);\n\t\tclose(m_hFile);\n\n\t\tif (m_DelOnClose)\n\t\t\tremove(m_szFile);\n\n\t\tm_Ptr = NULL;\n\t\tm_hFile = -1;\n\t\tm_Size = 0;\n\t\tm_DelOnClose = false;\n\t}\n}\n\nvoid* FileMap::Impl::GetPtr()\n{\n\treturn m_Ptr;\n}\n\nint FileMap::Impl::GetSize()\n{\n\treturn m_Size;\n}\n#endif\n\nFileMap::FileMap(const char *file)\n\t: impl(new FileMap::Impl(file))\n{\n}\n\nFileMap::~FileMap()\n{\n\tdelete impl;\n}\n\nbool FileMap::Open(int size, bool del_on_close)\n{\n\treturn impl->Open(size, del_on_close);\n}\n\nvoid FileMap::Close()\n{\n\timpl->Close();\n}\n\nvoid* FileMap::GetPtr()\n{\n\treturn impl->GetPtr();\n}\n\nint FileMap::GetSize()\n{\n\treturn impl->GetSize();\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/FileMap.h",
    "content": "/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _FILEMAP_H_\n#define _FILEMAP_H_\n\nclass FileMap\n{\npublic:\n\tFileMap(const char *file);\n\t~FileMap();\n\n\tbool Open(int size, bool del_on_close);\n\tvoid Close();\n\n\tvoid* GetPtr();\n\tint GetSize();\n\n\tclass Impl;\n\tImpl *impl;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/MemBuffer.cpp",
    "content": "/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"MemBuffer.h\"\n#include \"../debug.h\"\n#include <stdio.h>\n\n#ifdef _WINDOWS\n#include <windows.h>\n#else\n#include <sys/mman.h>\n#include <signal.h>\n#include <errno.h>\n#include <unistd.h>\n#endif\n\nu32 MemBuffer::s_PageSize = 0;\n\nstatic u32 CalcPages(u32 size, u32 pagesize)\n{\n\treturn (size + pagesize-4) / pagesize;\n}\n\n#ifdef _WINDOWS\nstatic u32 GetPageSize()\n{\n\tSYSTEM_INFO system_info;\n\n\tGetSystemInfo(&system_info);\n\n\treturn system_info.dwPageSize;\n}\n\nstatic DWORD ConvertToWinApi(int mode)\n{\n\tDWORD winmode = PAGE_NOACCESS;\n\n\tif (mode & MemBuffer::kExec)\n\t{\n\t\twinmode = (mode & MemBuffer::kWrite) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;\n\t}\n\telse if (mode & MemBuffer::kRead)\n\t{\n\t\twinmode = (mode & MemBuffer::kWrite) ? PAGE_READWRITE : PAGE_READONLY;\n\t}\n\n\treturn winmode;\n}\n\nu8* MemBuffer::Reserve(u32 size)\n{\n\tif (m_Baseptr) return m_Baseptr;\n\n\tif (size < m_DefSize) size = m_DefSize;\n\tif (!size) return NULL;\n\n\tm_ReservedPages = CalcPages(size, s_PageSize);\n\tm_ReservedSize = m_ReservedPages * s_PageSize;\n\tm_CommittedSize = 0;\n\n\tm_Baseptr = (u8*)VirtualAlloc(NULL, m_ReservedSize, MEM_RESERVE, PAGE_NOACCESS);\n\tif (!m_Baseptr || !Commit(m_DefSize))\n\t\tRelease();\n\n\treturn m_Baseptr;\n}\n\nvoid MemBuffer::Release()\n{\n\tif (m_Baseptr)\n\t{\n\t\tVirtualFree(m_Baseptr, 0, MEM_RELEASE);\n\t\tm_Baseptr = NULL;\n\t}\n\n\tm_ReservedSize = 0;\n\tm_ReservedPages = 0;\n\tm_CommittedSize = 0;\n\tm_UsedSize = 0;\n}\n\nbool MemBuffer::Commit(u32 size)\n{\n\tif (!m_Baseptr) return false;\n\n\tif (size <= m_CommittedSize) return true;\n\tif (size > m_ReservedSize) return false;\n\n\tu32 pages = CalcPages(size, s_PageSize);\n\tsize = pages * s_PageSize;\n\n\tu8* ptr = (u8*)VirtualAlloc(m_Baseptr, size, MEM_COMMIT, ConvertToWinApi(m_Mode));\n\tif (ptr)\n\t{\n\t\tm_CommittedSize = size;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n#else\nstatic u32 GetPageSize()\n{\n\t//return getpagesize();\n\treturn (u32)sysconf(_SC_PAGESIZE);\n}\n\nstatic int ConvertToLnxApi(int mode)\n{\n\tint lnxmode = 0;\n\n\tif (mode & MemBuffer::kExec)\n\t\tlnxmode |= PROT_EXEC | PROT_READ;\n\tif (mode & MemBuffer::kRead)\n\t\tlnxmode |= PROT_READ;\n\tif (mode & MemBuffer::kWrite)\n\t\tlnxmode |= PROT_WRITE;\n\n\treturn lnxmode;\n}\n\nu8* MemBuffer::Reserve(u32 size)\n{\n\tif (m_Baseptr) return m_Baseptr;\n\n\tif (size < m_DefSize) size = m_DefSize;\n\tif (!size) return NULL;\n\n\tm_ReservedPages = CalcPages(size, s_PageSize);\n\tm_ReservedSize = m_ReservedPages * s_PageSize;\n\tm_CommittedSize = 0;\n\n\tm_Baseptr = (u8*)mmap(NULL, m_ReservedSize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n\tif (m_Baseptr == MAP_FAILED || !Commit(m_DefSize))\n\t\tRelease();\n\n\treturn m_Baseptr;\n}\n\nvoid MemBuffer::Release()\n{\n\tif (m_Baseptr)\n\t{\n\t\tmunmap(m_Baseptr, m_ReservedSize);\n\t\tm_Baseptr = NULL;\n\t}\n\n\tm_ReservedSize = 0;\n\tm_ReservedPages = 0;\n\tm_CommittedSize = 0;\n\tm_UsedSize = 0;\n}\n\nbool MemBuffer::Commit(u32 size)\n{\n\tif (!m_Baseptr) return false;\n\n\tif (size <= m_CommittedSize) return true;\n\tif (size > m_ReservedSize) return false;\n\n\tu32 pages = CalcPages(size, s_PageSize);\n\tsize = pages * s_PageSize;\n\n\tint err = mprotect(m_Baseptr, size, ConvertToLnxApi(m_Mode));\n\tif (err == 0)\n\t{\n\t\tm_CommittedSize = size;\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n#endif\n\nMemBuffer::MemBuffer(u32 mode, u32 def_size)\n\t: m_Baseptr(NULL)\n\n\t, m_Mode(mode)\n\n\t, m_DefSize(def_size)\n\n\t, m_ReservedSize(0)\n\t, m_ReservedPages(0)\n\n\t, m_CommittedSize(0)\n\t, m_UsedSize(0)\n{\n\tif (!s_PageSize)\n\t{\n\t\ts_PageSize = GetPageSize();\n\t\tINFO(\"PageSize : %u\\n\", s_PageSize);\n\t}\n}\n\nMemBuffer::~MemBuffer()\n{\n\tRelease();\n}\n\nu8* MemBuffer::Alloc(u32 size)\n{\n\tu8* ptr = NULL;\n\tu32 off = size + m_UsedSize;\n\n\tif (off <= m_CommittedSize || Commit(off))\n\t{\n\t\tptr = m_Baseptr + m_UsedSize;\n\t\tm_UsedSize = off;\n\t}\n\n\treturn ptr;\n}\n\nvoid MemBuffer::Free(u32 size)\n{\n\tif (m_UsedSize >= size)\n\t\tm_UsedSize -= size;\n\telse\n\t\tm_UsedSize = 0;\n}\n\nvoid MemBuffer::Reset()\n{\n\tm_UsedSize = 0;\n}\n\nu8* MemBuffer::GetBasePtr()\n{\n\treturn m_Baseptr;\n}\n\nu32 MemBuffer::GetReservedSize()\n{\n\treturn m_ReservedSize;\n}\n\nu32 MemBuffer::GetCommittedSize()\n{\n\treturn m_CommittedSize;\n}\n\nu32 MemBuffer::GetUsedSize()\n{\n\treturn m_UsedSize;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/MemBuffer.h",
    "content": "/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _MEMBUFFER_H_\n#define _MEMBUFFER_H_\n\n#include \"../types.h\"\n\nclass MemBuffer\n{\npublic:\n\tenum Mode\n\t{\n\t\tkRead =  1<<0,\n\t\tkWrite = 1<<1,\n\t\tkExec =  1<<2,\n\t};\n\npublic:\n\tMemBuffer(u32 mode, u32 def_size);\n\n\t~MemBuffer();\n\n\tu8* Reserve(u32 size = 0);\n\n\tvoid Release();\n\n\tu8* Alloc(u32 size);\n\n\tvoid Free(u32 size);\n\n\tvoid Reset();\n\n\tu8* GetBasePtr();\n\n\tu32 GetReservedSize();\n\n\tu32 GetCommittedSize();\n\n\tu32 GetUsedSize();\n\nprotected:\n\tbool Commit(u32 size);\n\nprivate:\n\tu8* m_Baseptr;\n\n\tu32 m_Mode;\n\n\tu32 m_DefSize;\n\n\tu32 m_ReservedSize;\n\tu32 m_ReservedPages;\n\n\tu32 m_CommittedSize;\n\tu32 m_UsedSize;\n\n\tstatic u32 s_PageSize;\n};\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/datetime.cpp",
    "content": "#include \"datetime.h\"\r\n\r\nconst char* DateTime::monthnames[] = { NULL, \"JAN\", \"FEB\", \"MAR\", \"APR\", \"MAY\", \"JUN\", \"JUL\", \"AUG\", \"SEP\", \"OCT\", \"NOV\", \"DEC\" };\r\nconst int DateTime::daysmonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\t\r\nconst int DateTime::daysmonthleap[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\t\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/datetime.h",
    "content": "/*\r\n\tCopyright (C) 2010 DeSmuME team\r\n\r\n\tThis file is based on System.DateTime.cs and System.TimeSpan.cs from mono-2.6.7\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\n\n//\n// System.DateTime.cs\n//\n// author:\n//   Marcel Narings (marcel@narings.nl)\n//   Martin Baulig (martin@gnome.org)\n//   Atsushi Enomoto (atsushi@ximian.com)\n//\n//   (C) 2001 Marcel Narings\n// Copyright (C) 2004-2006 Novell, Inc (http://www.novell.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// \n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n//\n// System.TimeSpan.cs\n//\n// Authors:\n//   Duco Fijma (duco@lorentz.xs4all.nl)\n//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)\n//   Sebastien Pouliot  <sebastien@ximian.com>\n//\n// (C) 2001 Duco Fijma\n// (C) 2004 Andreas Nahr\n// Copyright (C) 2004 Novell (http://www.novell.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// \n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\r\n#ifndef _DATETIME_H_\r\n#define _DATETIME_H_\r\n\r\n#include <math.h>\r\n#include <time.h>\r\n#include <string.h>\r\n#include <stdio.h>\r\n\r\n#include <string>\r\n\r\n#include \"../types.h\"\r\n\r\nenum DayOfWeek {\n\tDayOfWeek_Sunday=0,\n\tDayOfWeek_Monday=1,\n\tDayOfWeek_Tuesday=2,\n\tDayOfWeek_Wednesday=3,\n\tDayOfWeek_Thursday=4,\n\tDayOfWeek_Friday=5,\n\tDayOfWeek_Saturday=6\n};\r\n\r\nclass TimeSpan\r\n{\r\n\tfriend class DateTime;\r\n\r\npublic:\r\n\tstatic const TimeSpan& get_MaxValue()\r\n\t{\r\n\t\tstatic TimeSpan val(0x7FFFFFFFFFFFFFFFLL);\r\n\t\treturn val;\r\n\t}\r\n\r\n\tstatic const TimeSpan& get_MinValue()\r\n\t{\r\n\t\tstatic TimeSpan val(0x8000000000000000LL);\r\n\t\treturn val;\r\n\t}\r\n\r\n\tstatic const TimeSpan& get_Zero()\r\n\t{\r\n\t\tstatic TimeSpan val(0);\r\n\t\treturn val;\r\n\t}\r\n\n\tstatic const s64 TicksPerDay = 864000000000LL;\n\tstatic const s64 TicksPerHour = 36000000000LL;\n\tstatic const s64 TicksPerMillisecond = 10000LL;\n\tstatic const s64 TicksPerMinute = 600000000LL;\n\tstatic const s64 TicksPerSecond = 10000000LL;\r\n\r\n\tTimeSpan ()\r\n\t{\r\n\t}\r\n\r\n\tTimeSpan (s64 ticks)\n\t\t: _ticks(ticks)\n\t{\n\t}\n\n\tTimeSpan (int hours, int minutes, int seconds)\n\t{\n\t\t_ticks = CalculateTicks (0, hours, minutes, seconds, 0);\n\t}\n\n\tTimeSpan (int days, int hours, int minutes, int seconds)\n\t{\n\t\t_ticks = CalculateTicks (days, hours, minutes, seconds, 0);\n\t}\n\n\tTimeSpan (int days, int hours, int minutes, int seconds, int milliseconds)\n\t{\n\t\t_ticks = CalculateTicks (days, hours, minutes, seconds, milliseconds);\n\t}\n\n\tint get_Days() const { return (int) (_ticks / TicksPerDay); }\n\tint get_Hours() const { return (int) (_ticks % TicksPerDay / TicksPerHour); }\n\tint get_Milliseconds() const { return (int) (_ticks % TicksPerSecond / TicksPerMillisecond); }\n\tint get_Minutes() const { return (int) (_ticks % TicksPerHour / TicksPerMinute); }\n\tint get_Seconds() const { return (int) (_ticks % TicksPerMinute / TicksPerSecond); }\n\ts64 get_Ticks() const { return _ticks; }\n\tdouble get_TotalDays() const { return (double) _ticks / TicksPerDay; }\n\tdouble get_TotalHours() const { return (double) _ticks / TicksPerHour; }\n\tdouble get_TotalMilliseconds() const { return (double) _ticks  / TicksPerMillisecond; }\n\tdouble get_TotalMinutes() const { return (double) _ticks / TicksPerMinute; }\n\tdouble get_TotalSeconds() const { return (double) _ticks / TicksPerSecond; }\n\n\tTimeSpan Add (const TimeSpan &ts)\n\t{\n\t\treturn TimeSpan (_ticks + ts._ticks);\n\t\t//removed:\n\t\t//catch (OverflowException) throw new OverflowException (Locale.GetText (\"Resulting timespan is too big.\"));\n\t}\n\n\tstatic int Compare (const TimeSpan& t1, const TimeSpan& t2)\n\t{\n\t\tif (t1._ticks < t2._ticks)\n\t\t\treturn -1;\n\t\tif (t1._ticks > t2._ticks)\n\t\t\treturn 1;\n\t\treturn 0;\n\t}\n\n\tint CompareTo (const TimeSpan& value)\n\t{\n\t\treturn Compare (*this, value);\n\t}\n\n\tTimeSpan Duration ()\n\t{\n\t\treturn TimeSpan(_ticks<0?-_ticks:_ticks);\n\t\t//removed:\n\t\t//catch (OverflowException) throw new OverflowException (Locale.GetText (\"This TimeSpan value is MinValue so you cannot get the duration.\"));\n\t}\n\n\tstatic TimeSpan FromDays (double value)\n\t{\n\t\treturn From (value, TicksPerDay);\n\t}\n\n\tstatic TimeSpan FromHours (double value)\n\t{\n\t\treturn From (value, TicksPerHour);\n\t}\n\n\tstatic TimeSpan FromMinutes (double value)\n\t{\n\t\treturn From (value, TicksPerMinute);\n\t}\n\n\tstatic TimeSpan FromSeconds (double value)\n\t{\n\t\treturn From (value, TicksPerSecond);\n\t}\n\n\tstatic TimeSpan FromMilliseconds (double value)\n\t{\n\t\treturn From (value, TicksPerMillisecond);\n\t}\n\n\tstatic TimeSpan FromTicks (s64 value)\n\t{\n\t\treturn TimeSpan (value);\n\t}\n\n\tTimeSpan Negate ()\n\t{\n\t\t//removed error handling\n\t\t//if (_ticks == MinValue()._ticks) throw new OverflowException (Locale.GetText ( \"This TimeSpan value is MinValue and cannot be negated.\"));\n\t\treturn TimeSpan (-_ticks);\n\t}\n\n\tTimeSpan Subtract (const TimeSpan& ts)\n\t{\n\t\t//removed error handling\n\t\t//try { checked { \n\t\treturn TimeSpan (_ticks - ts._ticks);\n\t\t//\t}\n\t\t//}\n\t\t//catch (OverflowException) {\n\t\t//\tthrow new OverflowException (Locale.GetText (\"Resulting timespan is too big.\"));\n\t\t//}\n\t}\n\n\tTimeSpan operator + (const TimeSpan& t2) const\n\t{\n\t\tTimeSpan temp = *this;\n\t\ttemp.Add (t2);\n\t\treturn temp;\n\t}\n\n\tbool operator == (const TimeSpan& t2) const \n\t{\n\t\treturn _ticks == t2._ticks;\n\t}\n\n\tbool operator > (const TimeSpan& t2) const \n\t{\n\t\treturn _ticks > t2._ticks;\n\t}\n\n\tbool operator >= (const TimeSpan& t2) const \n\t{\n\t\treturn _ticks >= t2._ticks;\n\t}\n\n\tbool operator != (const TimeSpan& t2) const \n\t{\n\t\treturn _ticks != t2._ticks;\n\t}\n\n\tbool operator < (const TimeSpan& t2) const \n\t{\n\t\treturn _ticks < t2._ticks;\n\t}\n\n\tbool operator <= (const TimeSpan& t2) const \n\t{\n\t\treturn _ticks <= t2._ticks;\n\t}\n\n\tTimeSpan operator - (const TimeSpan& t2) const \n\t{\n\t\tTimeSpan temp = *this;\n\t\treturn temp.Subtract (t2);\n\t}\n\n\tTimeSpan operator - ()\n\t{\n\t\treturn Negate ();\n\t}\n\n\nprivate:\n\ts64 _ticks;\r\n\r\n\tstatic s64 CalculateTicks (int days, int hours, int minutes, int seconds, int milliseconds)\n\t{\n\t\t// there's no overflow checks for hours, minutes, ...\n\t\t// so big hours/minutes values can overflow at some point and change expected values\n\t\tint hrssec = (hours * 3600); // break point at (Int32.MaxValue - 596523)\n\t\tint minsec = (minutes * 60);\n\t\ts64 t = ((s64)(hrssec + minsec + seconds) * 1000L + (s64)milliseconds);\n\t\tt *= 10000;\n\n\t\tbool overflow = false;\n\t\t// days is problematic because it can overflow but that overflow can be \n\t\t// \"legal\" (i.e. temporary) (e.g. if other parameters are negative) or \n\t\t// illegal (e.g. sign change).\n\t\tif (days > 0) {\n\t\t\ts64 td = TicksPerDay * days;\n\t\t\tif (t < 0) {\n\t\t\t\ts64 ticks = t;\n\t\t\t\tt += td;\n\t\t\t\t// positive days -> total ticks should be lower\n\t\t\t\toverflow = (ticks > t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tt += td;\n\t\t\t\t// positive + positive != negative result\n\t\t\t\toverflow = (t < 0);\n\t\t\t}\n\t\t}\n\t\telse if (days < 0) {\n\t\t\ts64 td = TicksPerDay * days;\n\t\t\tif (t <= 0) {\n\t\t\t\tt += td;\n\t\t\t\t// negative + negative != positive result\n\t\t\t\toverflow = (t > 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ts64 ticks = t;\n\t\t\t\tt += td;\n\t\t\t\t// negative days -> total ticks should be lower\n\t\t\t\toverflow = (t > ticks);\n\t\t\t}\n\t\t}\n\n\t\t//removed:\n\t\t//if (overflow) throw ArgumentOutOfRangeException (\"The timespan is too big or too small.\");\n\n\t\treturn t;\n\t}\n\n\tstatic TimeSpan From (double value, s64 tickMultiplicator) \n\t{\n\t\t//a bunch of error handling removed\n\n\t\t//if (Double.IsNaN (value)) throw new ArgumentException (Locale.GetText (\"Value cannot be NaN.\"), \"value\");\n\t\t//if (Double.IsNegativeInfinity (value) || Double.IsPositiveInfinity (value) ||\n\t\t//\t(value < MinValue.Ticks) || (value > MaxValue.Ticks))\n\t\t//\tthrow new OverflowException (Locale.GetText (\"Outside range [MinValue,MaxValue]\"));\n\n\t\t//try {\n\t\tvalue = (value * (tickMultiplicator / TicksPerMillisecond));\n\n\t\t//\tchecked {\n\t\t//\t\tlong val = (long) Math.Round(value);\n\t\t//\t\treturn new TimeSpan (val * TicksPerMillisecond);\n\t\t//\t}\n\t\t//}\n\t\t//catch (OverflowException) {\n\t\t//\tthrow new OverflowException (Locale.GetText (\"Resulting timespan is too big.\"));\n\t\t//}\n\t\t//}\n\t}\n\n};\n\r\nclass DateTime\r\n{\r\nprivate:\r\n\tTimeSpan ticks;\r\n\n\tstatic inline double round(const double x) { return floor(x + 0.5); }\r\n\n\tstatic const int dp400 = 146097;\n\tstatic const int dp100 = 36524;\n\tstatic const int dp4 = 1461;\n\r\n\t// w32 file time starts counting from 1/1/1601 00:00 GMT\n\t// which is the constant ticks from the .NET epoch\n\tstatic const s64 w32file_epoch = 504911232000000000LL;\n\n\t//private const long MAX_VALUE_TICKS = 3155378975400000000L;\n\t// -- Microsoft .NET has this value.\n\tstatic const s64 MAX_VALUE_TICKS = 3155378975999999999LL;\n\n\t//\n\t// The UnixEpoch, it begins on Jan 1, 1970 at 0:0:0, expressed\n\t// in Ticks\n\t//\n\tstatic const s64 UnixEpoch = 621355968000000000LL;\n\r\n\n\tstatic const int daysmonth[13];\n\tstatic const int daysmonthleap[13];\n\tstatic const char* monthnames[13];\n\n\tvoid init (int year, int month, int day, int hour, int minute, int second, int millisecond)\n\t{\n\t\t//removed error handling\n\t\t/*\tif ( year < 1 || year > 9999 || \n\t\tmonth < 1 || month >12  ||\n\t\tday < 1 || day > DaysInMonth(year, month) ||\n\t\thour < 0 || hour > 23 ||\n\t\tminute < 0 || minute > 59 ||\n\t\tsecond < 0 || second > 59 ||\n\t\tmillisecond < 0 || millisecond > 999)\n\t\tthrow new ArgumentOutOfRangeException (\"Parameters describe an \" +\n\t\t\"unrepresentable DateTime.\");*/\n\n\t\tticks = TimeSpan (AbsoluteDays(year,month,day), hour, minute, second, millisecond);\n\t}\n\r\n\n\n\tstatic int AbsoluteDays (int year, int month, int day)\n\t{\n\t\tconst int* days;\n\t\tint temp = 0, m=1 ;\n\n\t\tdays = (IsLeapYear(year) ? daysmonthleap  : daysmonth);\n\n\t\twhile (m < month)\n\t\t\ttemp += days[m++];\n\t\treturn ((day-1) + temp + (365* (year-1)) + ((year-1)/4) - ((year-1)/100) + ((year-1)/400));\n\t}\n\n\n\tenum Which \n\t{\n\t\tWhich_Day,\n\t\tWhich_DayYear,\n\t\tWhich_Month,\n\t\tWhich_Year\n\t};\n\n\tint FromTicks(Which what) const\n\t{\n\t\tint num400, num100, num4, numyears; \n\t\tint M =1;\n\n\t\tconst int* days = daysmonth;\n\t\tint totaldays = ticks.get_Days();\n\n\t\tnum400 = (totaldays / dp400);\n\t\ttotaldays -=  num400 * dp400;\n\n\t\tnum100 = (totaldays / dp100);\n\t\tif (num100 == 4)   // leap\n\t\t\tnum100 = 3;\n\t\ttotaldays -= (num100 * dp100);\n\n\t\tnum4 = totaldays / dp4;\n\t\ttotaldays -= (num4 * dp4);\n\n\t\tnumyears = totaldays / 365 ;\n\n\t\tif (numyears == 4)  //leap\n\t\t\tnumyears =3 ;\n\t\tif (what == Which_Year )\n\t\t\treturn num400*400 + num100*100 + num4*4 + numyears + 1;\n\n\t\ttotaldays -= (numyears * 365) ;\n\t\tif (what == Which_DayYear )\n\t\t\treturn totaldays + 1;\n\n\t\tif  ((numyears==3) && ((num100 == 3) || !(num4 == 24)) ) //31 dec leapyear\n\t\t\tdays = daysmonthleap;\n\n\t\twhile (totaldays >= days[M])\n\t\t\ttotaldays -= days[M++];\n\n\t\tif (what == Which_Month )\n\t\t\treturn M;\n\n\t\treturn totaldays +1; \n\t}\n\npublic:\n\tDateTime()\n\t\t: ticks(0)\n\t{\n\t}\n\n\tstatic const char* GetNameOfMonth(int month) { return monthnames[month]; }\n\n\tDateTime (s64 ticks)\n\t{\n\t\tthis->ticks = TimeSpan (ticks);\n\t\t//removed error handling\n\t\t//if (ticks < get_MinValue().get_Ticks() || ticks > get_MaxValue().get_Ticks()) {\n\t\t//\tstring msg = Locale.GetText (\"Value {0} is outside the valid range [{1},{2}].\", \n\t\t//\t\tticks, MinValue.Ticks, MaxValue.Ticks);\n\t\t//\tthrow new ArgumentOutOfRangeException (\"ticks\", msg);\n\t\t//}\n\t}\n\n\tstatic const DateTime& get_MaxValue() {\n\t\tstatic DateTime val(false, TimeSpan (MAX_VALUE_TICKS));\n\t\treturn val;\n\t}\n\n\tstatic const DateTime& get_MinValue() {\n\t\tstatic DateTime val(false, TimeSpan (0));\n\t\treturn val;\n\t}\n\n\tDateTime (int year, int month, int day)\n\t{\n\t\tinit(year,month,day,0,0,0,0);\n\t}\n\n\tDateTime (int year, int month, int day, int hour, int minute, int second)\n\t{\n\t\tinit(year, month, day, hour, minute, second, 0);\n\t}\n\n\tDateTime (int year, int month, int day, int hour, int minute, int second, int millisecond)\n\t{\n\t\tinit(year,month,day,hour,minute,second,millisecond);\n\t}\n\n\n\tDateTime (bool check, const TimeSpan& value)\n\t{\n\t\t//removed error handling\n\t\t//if (check && (value.Ticks < MinValue.Ticks || value.Ticks > MaxValue.Ticks))\n\t\t//\tthrow new ArgumentOutOfRangeException ();\n\n\t\tticks = value;\n\t}\n\n\tDateTime get_Date () const\n\t{\n\t\treturn DateTime (get_Year(), get_Month(), get_Day());\n\t}\n\n\tint get_Month () const {\n\t\treturn FromTicks(Which_Month); \n\t}\n\n\tint get_Day() const\n\t{\n\t\treturn FromTicks(Which_Day); \n\t}\n\n\tDayOfWeek get_DayOfWeek () const\n\t{\n\t\treturn ( (DayOfWeek) ((ticks.get_Days()+1) % 7) ); \n\t}\n\n\tint get_DayOfYear () const\n\t{\n\t\treturn FromTicks(Which_DayYear); \n\t}\n\n\tTimeSpan get_TimeOfDay () const\n\t{\n\t\treturn TimeSpan(ticks.get_Ticks() % TimeSpan::TicksPerDay );\n\t}\n\n\tint get_Hour () const\n\t{\n\t\treturn ticks.get_Hours();\n\t}\n\n\tint get_Minute () const\n\t{\n\t\treturn ticks.get_Minutes();\n\t}\n\n\tint get_Second () const\n\t{\n\t\treturn ticks.get_Seconds();\n\t}\n\n\tint get_Millisecond () const\n\t{\n\t\treturn ticks.get_Milliseconds();\n\t}\n\n\t//internal static extern s64 GetTimeMonotonic ();\n\t//internal static extern s64 GetNow ();\n\n\tstatic DateTime get_Now ()\n\t{\n\t\ttime_t timer;\r\n\t\ttime(&timer);\r\n\t\tstruct tm *tm = localtime(&timer);\n\t\treturn DateTime(tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);\n\t}\n\n\ts64 get_Ticks()const\n\t{ \n\t\treturn ticks.get_Ticks();\n\t}\n\n\tstatic DateTime get_Today ()\n\t{\n\t\tDateTime now = get_Now();\n\t\tDateTime today = DateTime (now.get_Year(), now.get_Month(), now.get_Day());\n\t\treturn today;\n\t}\n\n\tint get_Year () const\n\t{\n\t\treturn FromTicks(Which_Year); \n\t}\n\n\tDateTime Add (const TimeSpan& value) const\n\t{\n\t\tDateTime ret = AddTicks (value.get_Ticks());\n\t\treturn ret;\n\t}\n\n\tDateTime AddDays (double value) const\n\t{\n\t\treturn AddMilliseconds (round(value * 86400000));\n\t}\n\n\tDateTime AddTicks (const s64 value) const\n\t{\n\t\t//removed error handling\n\t\t//if ((value + ticks.Ticks) > MAX_VALUE_TICKS || (value + ticks.Ticks) < 0) {\n\t\t//\tthrow new ArgumentOutOfRangeException();\n\t\t//}\n\t\treturn DateTime (value + ticks.get_Ticks());\n\t}\n\n\tDateTime AddHours (double value) const\n\t{\n\t\treturn AddMilliseconds (value * 3600000);\n\t}\n\n\tDateTime AddMilliseconds (double value) const\n\t{\n\t\t//removed error handling\n\t\t/*\t\tif ((value * TimeSpan.TicksPerMillisecond) > long.MaxValue ||\n\t\t(value * TimeSpan.TicksPerMillisecond) < long.MinValue) {\n\t\tthrow new ArgumentOutOfRangeException();\n\t\t}\n\t\t*/\t\t\n\t\ts64 msticks = (s64) round(value * TimeSpan::TicksPerMillisecond);\n\t\treturn AddTicks (msticks);\n\t}\n\n\tDateTime AddMinutes (double value) const\n\t{\n\t\treturn AddMilliseconds (value * 60000);\n\t}\n\n\tDateTime AddMonths (int months) const\n\t{\n\t\tint day, month, year,  maxday ;\n\t\tDateTime temp;\n\n\t\tday = get_Day();\n\t\tmonth = get_Month() + (months % 12);\n\t\tyear = get_Year() + months/12 ;\n\n\t\tif (month < 1)\n\t\t{\n\t\t\tmonth = 12 + month ;\n\t\t\tyear -- ;\n\t\t}\n\t\telse if (month>12) \n\t\t{\n\t\t\tmonth = month -12;\n\t\t\tyear ++;\n\t\t}\n\t\tmaxday = DaysInMonth(year, month);\n\t\tif (day > maxday)\n\t\t\tday = maxday;\n\n\t\ttemp = (year, month, day);\n\t\treturn  temp.Add (get_TimeOfDay());\n\t}\n\n\tDateTime AddSeconds (double value) const\n\t{\n\t\treturn AddMilliseconds (value * 1000);\n\t}\n\n\tDateTime AddYears (int value) const\n\t{\n\t\treturn AddMonths (value * 12);\n\t}\n\n\tstatic int Compare (const DateTime& t1,\tconst DateTime& t2)\n\t{\n\t\tif (t1.ticks < t2.ticks) \n\t\t\treturn -1;\n\t\telse if (t1.ticks > t2.ticks) \n\t\t\treturn 1;\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic int DaysInMonth (int year, int month)\n\t{\n\t\tconst int* days ;\n\n\t\t//removed error handling\n\t\t//if (month < 1 || month >12)throw new ArgumentOutOfRangeException ();\n\t\t//if (year < 1 || year > 9999)throw new ArgumentOutOfRangeException ();\n\n\t\tdays = (IsLeapYear(year) ? daysmonthleap  : daysmonth);\n\t\treturn days[month];\t\t\t\n\t}\n\tstatic bool IsLeapYear (int year)\n\t{\n\t\t//removed error handling\n\t\t/*\t\tif (year < 1 || year > 9999)\n\t\tthrow new ArgumentOutOfRangeException ();*/\n\t\treturn  ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ;\n\t}\n\n\tTimeSpan Subtract (const DateTime& value) const\n\t{\n\t\treturn TimeSpan (ticks.get_Ticks()) - value.ticks;\n\t}\n\n\tDateTime Subtract(const TimeSpan& value) const\n\t{\n\t\tTimeSpan newticks;\n\n\t\tnewticks = (TimeSpan (ticks.get_Ticks())) - value;\n\t\tDateTime ret = DateTime (true,newticks);\n\t\treturn ret;\n\t}\n\n\tDateTime operator +(const TimeSpan& t) const\n\t{\n\t\treturn DateTime (true, ticks + t);\n\t}\n\n\tbool operator ==(const DateTime& d2) const\n\t{\n\t\treturn (ticks == d2.ticks);\n\t}\n\n\tbool operator >(const DateTime& t2) const\n\t{\n\t\treturn (ticks > t2.ticks);\n\t}\n\n\tbool operator >=(const DateTime &t2) const\n\t{\n\t\treturn (ticks >= t2.ticks);\n\t}\n\n\tbool operator !=(const DateTime& d2) const\n\t{\n\t\treturn (ticks != d2.ticks);\n\t}\n\n\tbool operator <(const DateTime& t2) const\n\t{\n\t\treturn (ticks < t2.ticks );\n\t}\n\n\tbool operator <=(const DateTime& t2) const\n\t{\n\t\treturn (ticks <= t2.ticks);\n\t}\n\n\tTimeSpan operator -(const DateTime& d2) const\n\t{\n\t\treturn TimeSpan((ticks - d2.ticks).get_Ticks());\n\t}\n\n\tDateTime operator -(const TimeSpan& t) const\n\t{\n\t\treturn DateTime (true, ticks - t);\n\t}\n\n\t//try to have a canonical format here. this was comment was typed at 2010-oct-04 02:16:44:000\n\n\tstd::string ToString() const\n\t{\n\t\tchar tmp[32];\n\t\tsprintf(tmp,\"%04d-%s-%02d %02d:%02d:%02d:%03d\",get_Year(),monthnames[get_Month()],get_Day(),get_Hour(),get_Minute(),get_Second(),get_Millisecond());\n\t\treturn tmp;\n\t}\n\n\tstatic bool TryParse(const char* str, DateTime& out)\n\t{\n\t\tint year,mon=-1,day,hour,min,sec,ms;\n\t\tchar strmon[4];\n\t\tint done = sscanf(str,\"%04d-%3s-%02d %02d:%02d:%02d:%03d\",&year,strmon,&day,&hour,&min,&sec,&ms);\n\t\tif(done != 7) return false;\n\t\tfor(int i=1;i<12;i++)\n\t\t\tif(!strncasecmp(monthnames[i],strmon,3))\n\t\t\t{\n\t\t\t\tmon=i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\tif(mon==-1) return false;\n\t\tout = DateTime(year,mon,day,hour,min,sec);\n\t\treturn true;\n\t}\n\n\tstatic DateTime Parse(const char* str)\n\t{\n\t\tDateTime ret;\n\t\tTryParse(str,ret);\n\t\treturn ret;\n\t}\n\n};\r\n\r\n\r\n#endif //_DATETIME_H_\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/decrypt/crc.cpp",
    "content": "//taken from ndstool\n//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/crc.cpp?revision=1587\n\n/* crc.cpp - this file is part of DeSmuME\n *\n * Copyright (C) 2005-2006 Rafael Vuijk\n *\n * This file is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * This file is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n/*\n\tCyclic Redundancy Code (CRC) functions\n\tby Rafael Vuijk (aka DarkFader)\n*/\n\nunsigned short ccitt16tab[] =\n{\n\t0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,\n\t0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\n\t0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,\n\t0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\n\t0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,\n\t0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\n\t0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,\n\t0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\n\t0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,\n\t0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\n\t0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,\n\t0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,\n\t0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,\n\t0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,\n\t0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,\n\t0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,\n\t0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,\n\t0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,\n\t0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,\n\t0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n\t0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,\n\t0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n\t0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,\n\t0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\n\t0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,\n\t0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\n\t0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,\n\t0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\n\t0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,\n\t0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\n\t0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\n\t0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\n};\n\nunsigned short crc16tab[] =\n{\n\t0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,\n\t0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,\n\t0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,\n\t0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,\n\t0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,\n\t0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,\n\t0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,\n\t0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,\n\t0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,\n\t0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,\n\t0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,\n\t0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,\n\t0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,\n\t0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,\n\t0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,\n\t0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,\n\t0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,\n\t0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,\n\t0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,\n\t0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,\n\t0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,\n\t0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,\n\t0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,\n\t0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,\n\t0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,\n\t0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,\n\t0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,\n\t0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,\n\t0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,\n\t0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,\n\t0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,\n\t0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040\n};\n\nunsigned long crc32tab[] =\n{\n\t0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,\n\t0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,\n\t0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,\n\t0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,\n\t0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,\n\t0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,\n\t0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,\n\t0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,\n\t0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,\n\t0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,\n\t0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,\n\t0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,\n\t0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,\n\t0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,\n\t0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,\n\t0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,\n\t0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,\n\t0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,\n\t0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,\n\t0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,\n\t0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,\n\t0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,\n\t0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,\n\t0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,\n\t0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,\n\t0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,\n\t0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,\n\t0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,\n\t0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,\n\t0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,\n\t0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,\n\t0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,\n\t0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,\n\t0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,\n\t0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,\n\t0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,\n\t0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,\n\t0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,\n\t0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,\n\t0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,\n\t0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,\n\t0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,\n\t0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,\n\t0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,\n\t0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,\n\t0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,\n\t0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,\n\t0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,\n\t0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,\n\t0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,\n\t0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,\n\t0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,\n\t0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,\n\t0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,\n\t0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,\n\t0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,\n\t0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,\n\t0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,\n\t0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,\n\t0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,\n\t0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,\n\t0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,\n\t0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,\n\t0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL\n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/decrypt/crc.h",
    "content": "//taken from ndstool\n//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/crc.h?revision=2447\n\n/* crc.h - this file is part of DeSmuME\n *\n * Copyright (C) 2005-2006 Rafael Vuijk\n *\n * This file is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * This file is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n/*\n\tCyclic Redundancy Code (CRC) functions\n\tby Rafael Vuijk (aka DarkFader)\n*/\n\n#ifndef __CRC_H\n#define __CRC_H\n\n//#include \"little.h\"\t\t// FixCrc is not yet big endian compatible\n\n/*\n * Data\n */\nextern unsigned short ccitt16tab[];\nextern unsigned short crc16tab[];\nextern unsigned long crc32tab[];\n\n/*\n * Defines\n */\n#define CRC_TEMPLATE\ttemplate <typename CrcType, CrcType *crcTable>\n\n/*\n * CalcCcitt\n * Does not perform final inversion.\n */\n#define CalcCcitt_\tCalcCcitt<CrcType, crcTable>\n#define CalcCcitt16\tCalcCcitt<typeof(*ccitt16tab), ccitt16tab>\nCRC_TEMPLATE inline CrcType CalcCcitt(unsigned char *data, unsigned int length, CrcType crc = (CrcType)0)\n{\n\tfor (unsigned int i=0; i<length; i++)\n\t{\n\t\tcrc = (crc << 8) ^ crcTable[(crc >> 8) ^ data[i]];\n\t}\n\treturn crc;\n}\n\n/*\n * CalcCrc\n * Does not perform final inversion.\n */\n#define CalcCrc_\tCalcCrc<CrcType, crcTable>\n#define CalcCrc16\tCalcCrc<typeof(*crc16tab), crc16tab>\n#define CalcCrc32\tCalcCrc<typeof(*crc32tab), crc32tab>\nCRC_TEMPLATE inline CrcType CalcCrc(unsigned char *data, unsigned int length, CrcType crc = (CrcType)~0)\n{\n\tfor (unsigned int i=0; i<length; i++)\n\t{\n\t\tcrc = (crc >> 8) ^ crcTable[(crc ^ data[i]) & 0xFF];\n\t}\n\treturn crc;\n}\n\n/*\n * FCalcCrc\n * Does not perform final inversion.\n */\n#define FCalcCrc_\tFCalcCrc<CrcType, crcTable>\n#define FCalcCrc16\tFCalcCrc<typeof(*crc16tab), crc16tab>\n#define FCalcCrc32\tFCalcCrc<typeof(*crc32tab), crc32tab>\nCRC_TEMPLATE inline CrcType FCalcCrc(FILE *f, unsigned int offset, unsigned int length, CrcType crc = (CrcType)~0)\n{\n\tfseek(f, offset, SEEK_SET);\n\tfor (unsigned int i=0; i<length; i++)\n\t{\n\t\tcrc = (crc >> 8) ^ crcTable[(crc ^ fgetc(f)) & 0xFF];\n\t}\n\treturn crc;\n}\n\n/*\n * RevCrc\n * Reverse table lookup.\n */\n#define RevCrc_\t\tRevCrc<CrcType, crcTable>\nCRC_TEMPLATE inline unsigned char RevCrc(unsigned char x, CrcType *value = 0)\n{\n\tfor (int y=0; y<256; y++)\n\t{\n\t\tif ((crcTable[y] >> (8*sizeof(CrcType)-8)) == x)\n\t\t{\n\t\t\tif (value) *value = crcTable[y];\n\t\t\treturn y;\n\t\t}\n\t}\n\treturn 0;\n}\n\n/*\n * FixCrc\n */\n#define FixCrc_\t\tFixCrc<CrcType, crcTable>\n#define FixCrc16\tFixCrc<typeof(*crc16tab), crc16tab>\n#define FixCrc32\tFixCrc<typeof(*crc32tab), crc32tab>\nCRC_TEMPLATE void FixCrc\n(\n\tunsigned char *data,\t\t\t\t// data to be patched\n\tunsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length,\t// patch data\n\tunsigned int fix_offset = 0,\t\t// position to write the fix. by default, it is immediately after the patched data\n\tCrcType initial_crc = (CrcType)~0\t// useful when manually calculating leading data\n)\n{\n\tif (!fix_offset) fix_offset = patch_offset + patch_length;\n\n\t// calculate CRC after leading data\n\tinitial_crc = CalcCrc_(data, patch_offset, initial_crc);\n\n\t// calculate CRC before fix\n\tunsigned char buf[2*sizeof(CrcType)];\n\tCrcType crc_before_fix = CalcCrc_(data + patch_offset, fix_offset - patch_offset);\n\t*(CrcType *)(buf + 0) = crc_before_fix;\n\n\t// patch\n\tmemcpy(data + patch_offset, patch_data, patch_length);\n\n\t// calculate CRC after unfixed\n\tCrcType crc_after_unfix = CalcCrc_(data + patch_offset, fix_offset - patch_offset + sizeof(CrcType));\n\t*(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix;\n\n\t// fix it\n\tfor (int i=sizeof(CrcType); i>=1; i--)\n\t{\n\t\tCrcType value;\n\t\tunsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value);\n\t\t*(CrcType *)(buf + i) ^= value;\n\t\tbuf[i - 1] ^= index;\n\t}\n\tmemcpy(data + fix_offset, buf, sizeof(CrcType));\n}\n\n/*\n * FFixCrc\n */\n#define FFixCrc_\tFFixCrc<CrcType, crcTable>\n#define FFixCrc16\tFFixCrc<typeof(*crc16tab), crc16tab>\n#define FFixCrc32\tFFixCrc<typeof(*crc32tab), crc32tab>\nCRC_TEMPLATE void FFixCrc\n(\n\tFILE *f,\t\t\t\t\t\t\t// file to be patched\n\tunsigned int patch_offset, unsigned char *patch_data, unsigned int patch_length,\t// patch data\n\tunsigned int fix_offset = 0,\t\t// position to write the fix. by default, it is immediately after the patched data\n\tCrcType initial_crc = (CrcType)~0\t// useful when manually calculating leading data\n)\n{\n\tif (!fix_offset) fix_offset = patch_offset + patch_length;\n\n\t// calculate CRC after leading data\n\tinitial_crc = FCalcCrc_(f, 0, patch_offset, initial_crc);\n\n\t// calculate CRC before fix\n\tunsigned char buf[2*sizeof(CrcType)];\n\tCrcType crc_before_fix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset);\n\t*(CrcType *)(buf + 0) = crc_before_fix;\n\n\t// patch\n\tfseek(f, patch_offset, SEEK_SET);\n\tfwrite(patch_data, 1, patch_length, f);\n\n\t// calculate CRC after unfixed\n\tCrcType crc_after_unfix = FCalcCrc_(f, patch_offset, fix_offset - patch_offset + sizeof(CrcType));\n\t*(CrcType *)(buf + sizeof(CrcType)) = crc_after_unfix;\n\n\t// fix it\n\tfor (int i=sizeof(CrcType); i>=1; i--)\n\t{\n\t\tCrcType value=0;\n\t\tunsigned char index = RevCrc_(buf[i + sizeof(CrcType) - 1], &value);\n\t\t*(CrcType *)(buf + i) ^= value;\n\t\tbuf[i - 1] ^= index;\n\t}\n\tfseek(f, fix_offset, SEEK_SET);\n\tfwrite(buf, sizeof(CrcType), 1, f);\n}\n\n#endif\t// __CRC_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/decrypt/decrypt.cpp",
    "content": "//taken from ndstool\n//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/encryption.cpp?revision=1565\n\n/* decrypt.cpp - this file is part of DeSmuME\n *\n * Copyright (C) 2006 Rafael Vuijk\n *\n * This file is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * This file is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"../../types.h\"\n#include \"crc.h\"\n#include \"header.h\"\n#include \"decrypt.h\"\n\nconst unsigned char encr_data[] =\n{\n\t0x99,0xD5,0x20,0x5F,0x57,0x44,0xF5,0xB9,0x6E,0x19,0xA4,0xD9,0x9E,0x6A,0x5A,0x94,\n\t0xD8,0xAE,0xF1,0xEB,0x41,0x75,0xE2,0x3A,0x93,0x82,0xD0,0x32,0x33,0xEE,0x31,0xD5,\n\t0xCC,0x57,0x61,0x9A,0x37,0x06,0xA2,0x1B,0x79,0x39,0x72,0xF5,0x55,0xAE,0xF6,0xBE,\n\t0x5F,0x1B,0x69,0xFB,0xE5,0x9D,0xF1,0xE9,0xCE,0x2C,0xD9,0xA1,0x5E,0x32,0x05,0xE6,\n\t0xFE,0xD3,0xFE,0xCF,0xD4,0x62,0x04,0x0D,0x8B,0xF5,0xEC,0xB7,0x2B,0x60,0x79,0xBB,\n\t0x12,0x95,0x31,0x0D,0x6E,0x3F,0xDA,0x2B,0x88,0x84,0xF0,0xF1,0x3D,0x12,0x7E,0x25,\n\t0x45,0x22,0xF1,0xBB,0x24,0x06,0x1A,0x06,0x11,0xAD,0xDF,0x28,0x8B,0x64,0x81,0x34,\n\t0x2B,0xEB,0x33,0x29,0x99,0xAA,0xF2,0xBD,0x9C,0x14,0x95,0x9D,0x9F,0xF7,0xF5,0x8C,\n\t0x72,0x97,0xA1,0x29,0x9D,0xD1,0x5F,0xCF,0x66,0x4D,0x07,0x1A,0xDE,0xD3,0x4A,0x4B,\n\t0x85,0xC9,0xA7,0xA3,0x17,0x95,0x05,0x3A,0x3D,0x49,0x0A,0xBF,0x0A,0x89,0x8B,0xA2,\n\t0x4A,0x82,0x49,0xDD,0x27,0x90,0xF1,0x0B,0xE9,0xEB,0x1C,0x6A,0x83,0x76,0x45,0x05,\n\t0xBA,0x81,0x70,0x61,0x17,0x3F,0x4B,0xDE,0xAE,0xCF,0xAB,0x39,0x57,0xF2,0x3A,0x56,\n\t0x48,0x11,0xAD,0x8A,0x40,0xE1,0x45,0x3F,0xFA,0x9B,0x02,0x54,0xCA,0xA6,0x93,0xFB,\n\t0xEF,0x4D,0xFE,0x6F,0xA3,0xD8,0x87,0x9C,0x08,0xBA,0xD5,0x48,0x6A,0x8D,0x2D,0xFD,\n\t0x6E,0x15,0xF8,0x74,0xBD,0xBE,0x52,0x8B,0x18,0x22,0x8A,0x9E,0xFB,0x74,0x37,0x07,\n\t0x1B,0x36,0x6C,0x4A,0x19,0xBA,0x42,0x62,0xB9,0x79,0x91,0x10,0x7B,0x67,0x65,0x96,\n\t0xFE,0x02,0x23,0xE8,0xEE,0x99,0x8C,0x77,0x3E,0x5C,0x86,0x64,0x4D,0x6D,0x78,0x86,\n\t0xA5,0x4F,0x65,0xE2,0x1E,0xB2,0xDF,0x5A,0x0A,0xD0,0x7E,0x08,0x14,0xB0,0x71,0xAC,\n\t0xBD,0xDB,0x83,0x1C,0xB9,0xD7,0xA1,0x62,0xCD,0xC6,0x63,0x7C,0x52,0x69,0xC3,0xE6,\n\t0xBF,0x75,0xCE,0x12,0x44,0x5D,0x21,0x04,0xFA,0xFB,0xD3,0x3C,0x38,0x11,0x63,0xD4,\n\t0x95,0x85,0x41,0x49,0x46,0x09,0xF2,0x08,0x43,0x11,0xDC,0x1F,0x76,0xC0,0x15,0x6D,\n\t0x1F,0x3C,0x63,0x70,0xEA,0x87,0x80,0x6C,0xC3,0xBD,0x63,0x8B,0xC2,0x37,0x21,0x37,\n\t0xDC,0xEE,0x09,0x23,0x2E,0x37,0x6A,0x4D,0x73,0x90,0xF7,0x50,0x30,0xAC,0x1C,0x92,\n\t0x04,0x10,0x23,0x91,0x4F,0xD2,0x07,0xAA,0x68,0x3E,0x4F,0x9A,0xC9,0x64,0x60,0x6A,\n\t0xC8,0x14,0x21,0xF3,0xD6,0x22,0x41,0x12,0x44,0x24,0xCF,0xE6,0x8A,0x56,0xDD,0x0D,\n\t0x53,0x4D,0xE1,0x85,0x1E,0x8C,0x52,0x5A,0x9C,0x19,0x84,0xC2,0x03,0x57,0xF1,0x6F,\n\t0xE3,0x00,0xBE,0x58,0xF6,0x4C,0xED,0xD5,0x21,0x64,0x9C,0x1F,0xBE,0x55,0x03,0x3C,\n\t0x4A,0xDC,0xFF,0xAA,0xC9,0xDA,0xE0,0x5D,0x5E,0xBF,0xE6,0xDE,0xF5,0xD8,0xB1,0xF8,\n\t0xFF,0x36,0xB3,0xB9,0x62,0x67,0x95,0xDB,0x31,0x5F,0x37,0xED,0x4C,0x70,0x67,0x99,\n\t0x90,0xB5,0x18,0x31,0x6C,0x3D,0x99,0x99,0xE4,0x42,0xDA,0xD3,0x25,0x42,0x13,0xA0,\n\t0xAE,0xD7,0x70,0x6C,0xB1,0x55,0xCF,0xC7,0xD7,0x46,0xD5,0x43,0x61,0x17,0x3D,0x44,\n\t0x28,0xE9,0x33,0x85,0xD5,0xD0,0xA2,0x93,0xAA,0x25,0x12,0x1F,0xFB,0xC5,0x0B,0x46,\n\t0xF5,0x97,0x76,0x56,0x45,0xA6,0xBE,0x87,0xB1,0x94,0x6B,0xE8,0xB1,0xFE,0x33,0x99,\n\t0xAE,0x1F,0x3E,0x6C,0x39,0x71,0x1D,0x09,0x00,0x90,0x37,0xE4,0x10,0x3E,0x75,0x74,\n\t0xFF,0x8C,0x83,0x3B,0xB0,0xF1,0xB0,0xF9,0x01,0x05,0x47,0x42,0x95,0xF1,0xD6,0xAC,\n\t0x7E,0x38,0xE6,0x9E,0x95,0x74,0x26,0x3F,0xB4,0x68,0x50,0x18,0xD0,0x43,0x30,0xB4,\n\t0x4C,0x4B,0xE3,0x68,0xBF,0xE5,0x4D,0xB6,0x95,0x8B,0x0A,0xA0,0x74,0x25,0x32,0x77,\n\t0xCF,0xA1,0xF7,0x2C,0xD8,0x71,0x13,0x5A,0xAB,0xEA,0xC9,0x51,0xE8,0x0D,0xEE,0xEF,\n\t0xE9,0x93,0x7E,0x19,0xA7,0x1E,0x43,0x38,0x81,0x16,0x2C,0xA1,0x48,0xE3,0x73,0xCC,\n\t0x29,0x21,0x6C,0xD3,0x5D,0xCE,0xA0,0xD9,0x61,0x71,0x43,0xA0,0x15,0x13,0xB5,0x64,\n\t0x92,0xCF,0x2A,0x19,0xDC,0xAD,0xB7,0xA5,0x9F,0x86,0x65,0xF8,0x1A,0x9F,0xE7,0xFB,\n\t0xF7,0xFD,0xB8,0x13,0x6C,0x27,0xDB,0x6F,0xDF,0x35,0x1C,0xF7,0x8D,0x2C,0x5B,0x9B,\n\t0x12,0xAB,0x38,0x64,0x06,0xCC,0xDE,0x31,0xE8,0x4E,0x75,0x11,0x64,0xE3,0xFA,0xEA,\n\t0xEB,0x34,0x54,0xC2,0xAD,0x3F,0x34,0xEB,0x93,0x2C,0x7D,0x26,0x36,0x9D,0x56,0xF3,\n\t0x5A,0xE1,0xF6,0xB3,0x98,0x63,0x4A,0x9E,0x32,0x83,0xE4,0x9A,0x84,0x60,0x7D,0x90,\n\t0x2E,0x13,0x0E,0xEE,0x93,0x4B,0x36,0xA2,0x85,0xEC,0x16,0x38,0xE8,0x88,0x06,0x02,\n\t0xBF,0xF0,0xA0,0x3A,0xED,0xD7,0x6A,0x9A,0x73,0xE1,0x57,0xCF,0xF8,0x44,0xB8,0xDC,\n\t0x2E,0x23,0x59,0xD1,0xDF,0x95,0x52,0x71,0x99,0x61,0xA0,0x4B,0xD5,0x7F,0x6E,0x78,\n\t0xBA,0xA9,0xC5,0x30,0xD3,0x40,0x86,0x32,0x9D,0x32,0x0C,0x9C,0x37,0xB7,0x02,0x2F,\n\t0xBA,0x54,0x98,0xA9,0xC4,0x13,0x04,0xC9,0x8D,0xBE,0xC8,0xE7,0x5D,0x97,0x50,0x2E,\n\t0x93,0xD6,0x22,0x59,0x0C,0x27,0xBC,0x22,0x92,0xE0,0xA7,0x20,0x0F,0x93,0x6F,0x7F,\n\t0x4C,0x9F,0xD3,0xB5,0xA6,0x2A,0x0B,0x74,0x67,0x49,0x7D,0x10,0x26,0xCB,0xD1,0xC5,\n\t0x86,0x71,0xE7,0x8C,0xA0,0x9C,0xE9,0x5B,0xB2,0x1A,0xF6,0x01,0xEE,0x8C,0x9E,0x5E,\n\t0x83,0xF2,0x1A,0xDB,0xE6,0xE5,0xEA,0x84,0x59,0x76,0xD2,0x7C,0xF6,0x8D,0xA5,0x49,\n\t0x36,0x48,0xC2,0x16,0x52,0xBB,0x83,0xA3,0x74,0xB9,0x07,0x0C,0x3B,0xFF,0x61,0x28,\n\t0xE1,0x61,0xE9,0xE4,0xEF,0x6E,0x15,0xAA,0x4E,0xBA,0xE8,0x5D,0x05,0x96,0xBB,0x32,\n\t0x56,0xB0,0xFB,0x72,0x52,0x0F,0x0E,0xC8,0x42,0x25,0x65,0x76,0x89,0xAF,0xF2,0xDE,\n\t0x10,0x27,0xF0,0x01,0x4B,0x74,0xA7,0x97,0x07,0xD5,0x26,0x54,0x54,0x09,0x1F,0x82,\n\t0x0A,0x86,0x7D,0x30,0x39,0x0E,0xB3,0x26,0x9B,0x0B,0x57,0xBB,0x36,0x06,0x31,0xAF,\n\t0xFD,0x79,0xFC,0xD9,0x30,0x10,0x2B,0x0C,0xB3,0xE1,0x9B,0xD7,0x7B,0xDC,0x5F,0xEF,\n\t0xD2,0xF8,0x13,0x45,0x4D,0x47,0x75,0xBD,0x46,0x96,0x3C,0x7E,0x75,0xF3,0x3E,0xB5,\n\t0x67,0xC5,0x9A,0x3B,0xB0,0x5B,0x29,0x6B,0xDE,0x80,0x5B,0xC8,0x15,0x05,0xB1,0x31,\n\t0xB6,0xCE,0x49,0xDD,0xAD,0x84,0xB5,0xAE,0x60,0xDC,0x67,0x31,0x34,0x30,0xFE,0x4E,\n\t0xBD,0x80,0x2F,0xA6,0xBF,0x63,0x39,0x21,0x86,0xD9,0x35,0x7F,0x16,0x68,0x22,0x05,\n\t0x54,0xE9,0x90,0x26,0x8C,0x07,0x6C,0x51,0xA4,0x31,0x55,0xD7,0x09,0x07,0xA8,0x3E,\n\t0x2E,0x53,0x66,0xC1,0xF8,0xF2,0x7B,0xC4,0xF2,0x58,0xCF,0xF1,0x87,0xC5,0xA2,0xE7,\n\t0x27,0x8F,0x30,0x87,0x58,0xA0,0x64,0x62,0x23,0x18,0xB9,0x88,0x7C,0xFA,0xCE,0xC4,\n\t0x98,0xAE,0xAD,0x17,0xCC,0x4A,0x5B,0xF3,0xE9,0x48,0xD5,0x56,0xD3,0x0D,0xF2,0xC8,\n\t0x92,0x73,0x8C,0xDB,0xD7,0x2F,0x56,0xAC,0x81,0xF9,0x92,0x69,0x4D,0xC6,0x32,0xF6,\n\t0xE6,0xC0,0x8D,0x21,0xE2,0x76,0x80,0x61,0x11,0xBC,0xDC,0x6C,0x93,0xAF,0x19,0x69,\n\t0x9B,0xD0,0xBF,0xB9,0x31,0x9F,0x02,0x67,0xA3,0x51,0xEE,0x83,0x06,0x22,0x7B,0x0C,\n\t0xAB,0x49,0x42,0x40,0xB8,0xD5,0x01,0x7D,0xCE,0x5E,0xF7,0x55,0x53,0x39,0xC5,0x99,\n\t0x46,0xD8,0x87,0x9F,0xBA,0xF7,0x64,0xB4,0xE3,0x9A,0xFA,0xA1,0x6D,0x90,0x68,0x10,\n\t0x30,0xCA,0x8A,0x54,0xA7,0x9F,0x60,0xC3,0x19,0xF5,0x6B,0x0D,0x7A,0x51,0x98,0xE6,\n\t0x98,0x43,0x51,0xB4,0xD6,0x35,0xE9,0x4F,0xC3,0xDF,0x0F,0x7B,0xD6,0x2F,0x5C,0xBD,\n\t0x3A,0x15,0x61,0x19,0xF1,0x4B,0xCB,0xAA,0xDC,0x6D,0x64,0xC9,0xD3,0xC6,0x1E,0x56,\n\t0xEF,0x38,0x4C,0x50,0x71,0x86,0x75,0xCC,0x0D,0x0D,0x4E,0xE9,0x28,0xF6,0x06,0x5D,\n\t0x70,0x1B,0xAA,0xD3,0x45,0xCF,0xA8,0x39,0xAC,0x95,0xA6,0x2E,0xB4,0xE4,0x22,0xD4,\n\t0x74,0xA8,0x37,0x5F,0x48,0x7A,0x04,0xCC,0xA5,0x4C,0x40,0xD8,0x28,0xB4,0x28,0x08,\n\t0x0D,0x1C,0x72,0x52,0x41,0xF0,0x7D,0x47,0x19,0x3A,0x53,0x4E,0x58,0x84,0x62,0x6B,\n\t0x93,0xB5,0x8A,0x81,0x21,0x4E,0x0D,0xDC,0xB4,0x3F,0xA2,0xC6,0xFC,0xC9,0x2B,0x40,\n\t0xDA,0x38,0x04,0xE9,0x5E,0x5A,0x86,0x6B,0x0C,0x22,0x25,0x85,0x68,0x11,0x8D,0x7C,\n\t0x92,0x1D,0x95,0x55,0x4D,0xAB,0x8E,0xBB,0xDA,0xA6,0xE6,0xB7,0x51,0xB6,0x32,0x5A,\n\t0x05,0x41,0xDD,0x05,0x2A,0x0A,0x56,0x50,0x91,0x17,0x47,0xCC,0xC9,0xE6,0x7E,0xB5,\n\t0x61,0x4A,0xDB,0x73,0x67,0x51,0xC8,0x33,0xF5,0xDA,0x6E,0x74,0x2E,0x54,0xC3,0x37,\n\t0x0D,0x6D,0xAF,0x08,0xE8,0x15,0x8A,0x5F,0xE2,0x59,0x21,0xCD,0xA8,0xDE,0x0C,0x06,\n\t0x5A,0x77,0x6B,0x5F,0xDB,0x18,0x65,0x3E,0xC8,0x50,0xDE,0x78,0xE0,0xB8,0x82,0xB3,\n\t0x5D,0x4E,0x72,0x32,0x07,0x4F,0xC1,0x34,0x23,0xBA,0x96,0xB7,0x67,0x4E,0xA4,0x28,\n\t0x1E,0x34,0x62,0xEB,0x2D,0x6A,0x70,0xE9,0x2F,0x42,0xC4,0x70,0x4E,0x5A,0x31,0x9C,\n\t0xF9,0x5B,0x47,0x28,0xAA,0xDA,0x71,0x6F,0x38,0x1F,0xB3,0x78,0xC4,0x92,0x6B,0x1C,\n\t0x9E,0xF6,0x35,0x9A,0xB7,0x4D,0x0E,0xBF,0xCC,0x18,0x29,0x41,0x03,0x48,0x35,0x5D,\n\t0x55,0xD0,0x2B,0xC6,0x29,0xAF,0x5C,0x60,0x74,0x69,0x8E,0x5E,0x9B,0x7C,0xD4,0xBD,\n\t0x7B,0x44,0x64,0x7D,0x3F,0x92,0x5D,0x69,0xB6,0x1F,0x00,0x4B,0xD4,0x83,0x35,0xCF,\n\t0x7E,0x64,0x4E,0x17,0xAE,0x8D,0xD5,0x2E,0x9A,0x28,0x12,0x4E,0x2E,0x2B,0x49,0x08,\n\t0x5C,0xAE,0xC6,0x46,0x85,0xAE,0x41,0x61,0x1E,0x6F,0x82,0xD2,0x51,0x37,0x16,0x1F,\n\t0x0B,0xF6,0x59,0xA4,0x9A,0xCA,0x5A,0xAF,0x0D,0xD4,0x33,0x8B,0x20,0x63,0xF1,0x84,\n\t0x80,0x5C,0xCB,0xCF,0x08,0xB4,0xB9,0xD3,0x16,0x05,0xBD,0x62,0x83,0x31,0x9B,0x56,\n\t0x51,0x98,0x9F,0xBA,0xB2,0x5B,0xAA,0xB2,0x22,0x6B,0x2C,0xB5,0xD4,0x48,0xFA,0x63,\n\t0x2B,0x5F,0x58,0xFA,0x61,0xFA,0x64,0x09,0xBB,0x38,0xE0,0xB8,0x9D,0x92,0x60,0xA8,\n\t0x0D,0x67,0x6F,0x0E,0x37,0xF5,0x0D,0x01,0x9F,0xC2,0x77,0xD4,0xFE,0xEC,0xF1,0x73,\n\t0x30,0x39,0xE0,0x7D,0xF5,0x61,0x98,0xE4,0x2C,0x28,0x55,0x04,0x56,0x55,0xDB,0x2F,\n\t0x6B,0xEC,0xE5,0x58,0x06,0xB6,0x64,0x80,0x6A,0x2A,0x1A,0x4E,0x5B,0x0F,0xD8,0xC4,\n\t0x0A,0x2E,0x52,0x19,0xD9,0x62,0xF5,0x30,0x48,0xBE,0x8C,0x7B,0x4F,0x38,0x9B,0xA2,\n\t0xC3,0xAF,0xC9,0xD3,0xC7,0xC1,0x62,0x41,0x86,0xB9,0x61,0x21,0x57,0x6F,0x99,0x4F,\n\t0xC1,0xBA,0xCE,0x7B,0xB5,0x3B,0x4D,0x5E,0x8A,0x8B,0x44,0x57,0x5F,0x13,0x5F,0x70,\n\t0x6D,0x5B,0x29,0x47,0xDC,0x38,0xE2,0xEC,0x04,0x55,0x65,0x12,0x2A,0xE8,0x17,0x43,\n\t0xE1,0x8E,0xDD,0x2A,0xB3,0xE2,0x94,0xF7,0x09,0x6E,0x5C,0xE6,0xEB,0x8A,0xF8,0x6D,\n\t0x89,0x49,0x54,0x48,0xF5,0x2F,0xAD,0xBF,0xEA,0x94,0x4B,0xCA,0xFC,0x39,0x87,0x82,\n\t0x5F,0x8A,0x01,0xF2,0x75,0xF2,0xE6,0x71,0xD6,0xD8,0x42,0xDE,0xF1,0x2D,0x1D,0x28,\n\t0xA6,0x88,0x7E,0xA3,0xA0,0x47,0x1D,0x30,0xD9,0xA3,0x71,0xDF,0x49,0x1C,0xCB,0x01,\n\t0xF8,0x36,0xB1,0xF2,0xF0,0x22,0x58,0x5D,0x45,0x6B,0xBD,0xA0,0xBB,0xB2,0x88,0x42,\n\t0xC7,0x8C,0x28,0xCE,0x93,0xE8,0x90,0x63,0x08,0x90,0x7C,0x89,0x3C,0xF5,0x7D,0xB7,\n\t0x04,0x2D,0x4F,0x55,0x51,0x16,0xFD,0x7E,0x79,0xE8,0xBE,0xC1,0xF2,0x12,0xD4,0xF8,\n\t0xB4,0x84,0x05,0x23,0xA0,0xCC,0xD2,0x2B,0xFD,0xE1,0xAB,0xAD,0x0D,0xD1,0x55,0x6C,\n\t0x23,0x41,0x94,0x4D,0x77,0x37,0x4F,0x05,0x28,0x0C,0xBF,0x17,0xB3,0x12,0x67,0x6C,\n\t0x8C,0xC3,0x5A,0xF7,0x41,0x84,0x2A,0x6D,0xD0,0x94,0x12,0x27,0x2C,0xB4,0xED,0x9C,\n\t0x4D,0xEC,0x47,0x82,0x97,0xD5,0x67,0xB9,0x1B,0x9D,0xC0,0x55,0x07,0x7E,0xE5,0x8E,\n\t0xE2,0xA8,0xE7,0x3E,0x12,0xE4,0x0E,0x3A,0x2A,0x45,0x55,0x34,0xA2,0xF9,0x2D,0x5A,\n\t0x1B,0xAB,0x52,0x7C,0x83,0x10,0x5F,0x55,0xD2,0xF1,0x5A,0x43,0x2B,0xC6,0xA7,0xA4,\n\t0x89,0x15,0x95,0xE8,0xB4,0x4B,0x9D,0xF8,0x75,0xE3,0x9F,0x60,0x78,0x5B,0xD6,0xE6,\n\t0x0D,0x44,0xE6,0x21,0x06,0xBD,0x47,0x22,0x53,0xA4,0x00,0xAD,0x8D,0x43,0x13,0x85,\n\t0x39,0xF7,0xAA,0xFC,0x38,0xAF,0x7B,0xED,0xFC,0xE4,0x2B,0x54,0x50,0x98,0x4C,0xFC,\n\t0x85,0x80,0xF7,0xDF,0x3C,0x80,0x22,0xE1,0x94,0xDA,0xDE,0x24,0xC6,0xB0,0x7A,0x39,\n\t0x38,0xDC,0x0F,0xA1,0xA7,0xF4,0xF9,0x6F,0x63,0x18,0x57,0x8B,0x84,0x41,0x2A,0x2E,\n\t0xD4,0x53,0xF2,0xD9,0x00,0x0F,0xD0,0xDD,0x99,0x6E,0x19,0xA6,0x0A,0xD0,0xEC,0x5B,\n\t0x58,0x24,0xAB,0xC0,0xCB,0x06,0x65,0xEC,0x1A,0x13,0x38,0x94,0x0A,0x67,0x03,0x2F,\n\t0x3F,0xF7,0xE3,0x77,0x44,0x77,0x33,0xC6,0x14,0x39,0xD0,0xE3,0xC0,0xA2,0x08,0x79,\n\t0xBB,0x40,0x99,0x57,0x41,0x0B,0x01,0x90,0xCD,0xE1,0xCC,0x48,0x67,0xDB,0xB3,0xAF,\n\t0x88,0x74,0xF3,0x4C,0x82,0x8F,0x72,0xB1,0xB5,0x23,0x29,0xC4,0x12,0x6C,0x19,0xFC,\n\t0x8E,0x46,0xA4,0x9C,0xC4,0x25,0x65,0x87,0xD3,0x6D,0xBE,0x8A,0x93,0x11,0x03,0x38,\n\t0xED,0x83,0x2B,0xF3,0x46,0xA4,0x93,0xEA,0x3B,0x53,0x85,0x1D,0xCE,0xD4,0xF1,0x08,\n\t0x83,0x27,0xED,0xFC,0x9B,0x1A,0x18,0xBC,0xF9,0x8B,0xAE,0xDC,0x24,0xAB,0x50,0x38,\n\t0xE9,0x72,0x4B,0x10,0x22,0x17,0x7B,0x46,0x5D,0xAB,0x59,0x64,0xF3,0x40,0xAE,0xF8,\n\t0xBB,0xE5,0xC8,0xF9,0x26,0x03,0x4E,0x55,0x7D,0xEB,0xEB,0xFE,0xF7,0x39,0xE6,0xE0,\n\t0x0A,0x11,0xBE,0x2E,0x28,0xFF,0x98,0xED,0xC0,0xC9,0x42,0x56,0x42,0xC3,0xFD,0x00,\n\t0xF6,0xAF,0x87,0xA2,0x5B,0x01,0x3F,0x32,0x92,0x47,0x95,0x9A,0x72,0xA5,0x32,0x3D,\n\t0xAE,0x6B,0xD0,0x9B,0x07,0xD2,0x49,0x92,0xE3,0x78,0x4A,0xFA,0xA1,0x06,0x7D,0xF2,\n\t0x41,0xCF,0x77,0x74,0x04,0x14,0xB2,0x0C,0x86,0x84,0x64,0x16,0xD5,0xBB,0x51,0xA1,\n\t0xE5,0x6F,0xF1,0xD1,0xF2,0xE2,0xF7,0x5F,0x58,0x20,0x4D,0xB8,0x57,0xC7,0xCF,0xDD,\n\t0xC5,0xD8,0xBE,0x76,0x3D,0xF6,0x5F,0x7E,0xE7,0x2A,0x8B,0x88,0x24,0x1B,0x38,0x3F,\n\t0x0E,0x41,0x23,0x77,0xF5,0xF0,0x4B,0xD4,0x0C,0x1F,0xFA,0xA4,0x0B,0x80,0x5F,0xCF,\n\t0x45,0xF6,0xE0,0xDA,0x2F,0x34,0x59,0x53,0xFB,0x20,0x3C,0x52,0x62,0x5E,0x35,0xB5,\n\t0x62,0xFE,0x8B,0x60,0x63,0xE3,0x86,0x5A,0x15,0x1A,0x6E,0xD1,0x47,0x45,0xBC,0x32,\n\t0xB4,0xEB,0x67,0x38,0xAB,0xE4,0x6E,0x33,0x3A,0xB5,0xED,0xA3,0xAD,0x67,0xE0,0x4E,\n\t0x41,0x95,0xEE,0x62,0x62,0x71,0x26,0x1D,0x31,0xEF,0x62,0x30,0xAF,0xD7,0x82,0xAC,\n\t0xC2,0xDC,0x05,0x04,0xF5,0x97,0x07,0xBF,0x11,0x59,0x23,0x07,0xC0,0x64,0x02,0xE8,\n\t0x97,0xE5,0x3E,0xAF,0x18,0xAC,0x59,0xA6,0x8B,0x4A,0x33,0x90,0x1C,0x6E,0x7C,0x9C,\n\t0x20,0x7E,0x4C,0x3C,0x3E,0x61,0x64,0xBB,0xC5,0x6B,0x7C,0x7E,0x3E,0x9F,0xC5,0x4C,\n\t0x9F,0xEA,0x73,0xF5,0xD7,0x89,0xC0,0x4C,0xF4,0xFB,0xF4,0x2D,0xEC,0x14,0x1B,0x51,\n\t0xD5,0xC1,0x12,0xC8,0x10,0xDF,0x0B,0x4A,0x8B,0x9C,0xBC,0x93,0x45,0x6A,0x3E,0x3E,\n\t0x7D,0xC1,0xA9,0xBA,0xCD,0xC1,0xB4,0x07,0xE4,0xE1,0x68,0x86,0x43,0xB2,0x6D,0x38,\n\t0xF3,0xFB,0x0C,0x5C,0x66,0x37,0x71,0xDE,0x56,0xEF,0x6E,0xA0,0x10,0x40,0x65,0xA7,\n\t0x98,0xF7,0xD0,0xBE,0x0E,0xC8,0x37,0x36,0xEC,0x10,0xCA,0x7C,0x9C,0xAB,0x84,0x1E,\n\t0x05,0x17,0x76,0x02,0x1C,0x4F,0x52,0xAA,0x5F,0xC1,0xC6,0xA0,0x56,0xB9,0xD8,0x04,\n\t0x84,0x44,0x4D,0xA7,0x59,0xD8,0xDE,0x60,0xE6,0x38,0x0E,0x05,0x8F,0x03,0xE1,0x3B,\n\t0x6D,0x81,0x04,0x33,0x6F,0x30,0x0B,0xCE,0x69,0x05,0x21,0x33,0xFB,0x26,0xBB,0x89,\n\t0x7D,0xB6,0xAE,0x87,0x7E,0x51,0x07,0xE0,0xAC,0xF7,0x96,0x0A,0x6B,0xF9,0xC4,0x5C,\n\t0x1D,0xE4,0x44,0x47,0xB8,0x5E,0xFA,0xE3,0x78,0x84,0x55,0x42,0x4B,0x48,0x5E,0xF7,\n\t0x7D,0x47,0x35,0x86,0x1D,0x2B,0x43,0x05,0x03,0xEC,0x8A,0xB8,0x1E,0x06,0x3C,0x76,\n\t0x0C,0x48,0x1A,0x43,0xA7,0xB7,0x8A,0xED,0x1E,0x13,0xC6,0x43,0xEE,0x10,0xEF,0xDB,\n\t0xEC,0xFB,0x3C,0x83,0xB2,0x95,0x44,0xEF,0xD8,0x54,0x51,0x4E,0x2D,0x11,0x44,0x1D,\n\t0xFB,0x36,0x59,0x1E,0x7A,0x34,0xC1,0xC3,0xCA,0x57,0x00,0x61,0xEA,0x67,0xA5,0x16,\n\t0x9B,0x55,0xD0,0x55,0xE1,0x7F,0xD9,0x36,0xD2,0x40,0x76,0xAE,0xDC,0x01,0xCE,0xB0,\n\t0x7A,0x83,0xD5,0xCB,0x20,0x98,0xEC,0x6B,0xC1,0x72,0x92,0x34,0xF3,0x82,0x57,0x37,\n\t0x62,0x8A,0x32,0x36,0x0C,0x90,0x43,0xAE,0xAE,0x5C,0x9B,0x78,0x8E,0x13,0x65,0x02,\n\t0xFD,0x68,0x71,0xC1,0xFE,0xB0,0x31,0xA0,0x24,0x82,0xB0,0xC3,0xB1,0x79,0x69,0xA7,\n\t0xF5,0xD2,0xEB,0xD0,0x82,0xC0,0x32,0xDC,0x9E,0xC7,0x26,0x3C,0x6D,0x8D,0x98,0xC1,\n\t0xBB,0x22,0xD4,0xD0,0x0F,0x33,0xEC,0x3E,0xB9,0xCC,0xE1,0xDC,0x6A,0x4C,0x77,0x36,\n\t0x14,0x1C,0xF9,0xBF,0x81,0x9F,0x28,0x5F,0x71,0x85,0x32,0x29,0x90,0x75,0x48,0xC4,\n\t0xB3,0x4A,0xCE,0xD8,0x44,0x8F,0x14,0x2F,0xFD,0x40,0x57,0xEF,0xAA,0x08,0x75,0xD9,\n\t0x46,0xD1,0xD6,0x6E,0x32,0x55,0x1F,0xC3,0x18,0xFE,0x84,0x1F,0xFC,0x84,0xD5,0xFF,\n\t0x71,0x5E,0x1B,0x48,0xC3,0x86,0x95,0x0E,0x28,0x08,0x27,0xD3,0x38,0x83,0x71,0x7B,\n\t0x4C,0x80,0x63,0x54,0x9A,0x56,0xB0,0xAC,0xCF,0x80,0xCA,0x31,0x09,0xEF,0xFE,0xF3,\n\t0xBE,0xAF,0x24,0x7E,0xA6,0xFE,0x53,0x3F,0xC2,0x8D,0x4A,0x33,0x68,0xD1,0x22,0xA6,\n\t0x66,0xAD,0x7B,0xEA,0xDE,0xB6,0x43,0xB0,0xA1,0x25,0x95,0x00,0xA3,0x3F,0x75,0x46,\n\t0x14,0x11,0x44,0xEC,0xD7,0x95,0xBC,0x92,0xF0,0x4F,0xA9,0x16,0x53,0x62,0x97,0x60,\n\t0x2A,0x0F,0x41,0xF1,0x71,0x24,0xBE,0xEE,0x94,0x7F,0x08,0xCD,0x60,0x93,0xB3,0x85,\n\t0x5B,0x07,0x00,0x3F,0xD8,0x0F,0x28,0x83,0x9A,0xD1,0x69,0x9F,0xD1,0xDA,0x2E,0xC3,\n\t0x90,0x01,0xA2,0xB9,0x6B,0x4E,0x2A,0x66,0x9D,0xDA,0xAE,0xA6,0xEA,0x2A,0xD3,0x68,\n\t0x2F,0x0C,0x0C,0x9C,0xD2,0x8C,0x4A,0xED,0xE2,0x9E,0x57,0x65,0x9D,0x09,0x87,0xA3,\n\t0xB4,0xC4,0x32,0x5D,0xC9,0xD4,0x32,0x2B,0xB1,0xE0,0x71,0x1E,0x64,0x4D,0xE6,0x90,\n\t0x71,0xE3,0x1E,0x40,0xED,0x7D,0xF3,0x84,0x0E,0xED,0xC8,0x78,0x76,0xAE,0xC0,0x71,\n\t0x27,0x72,0xBB,0x05,0xEA,0x02,0x64,0xFB,0xF3,0x48,0x6B,0xB5,0x42,0x93,0x3F,0xED,\n\t0x9F,0x13,0x53,0xD2,0xF7,0xFE,0x2A,0xEC,0x1D,0x47,0x25,0xDB,0x3C,0x91,0x86,0xC6,\n\t0x8E,0xF0,0x11,0xFD,0x23,0x74,0x36,0xF7,0xA4,0xF5,0x9E,0x7A,0x7E,0x53,0x50,0x44,\n\t0xD4,0x47,0xCA,0xD3,0xEB,0x38,0x6D,0xE6,0xD9,0x71,0x94,0x7F,0x4A,0xC6,0x69,0x4B,\n\t0x11,0xF4,0x52,0xEA,0x22,0xFE,0x8A,0xB0,0x36,0x67,0x8B,0x59,0xE8,0xE6,0x80,0x2A,\n\t0xEB,0x65,0x04,0x13,0xEE,0xEC,0xDC,0x9E,0x5F,0xB1,0xEC,0x05,0x6A,0x59,0xE6,0x9F,\n\t0x5E,0x59,0x6B,0x89,0xBF,0xF7,0x1A,0xCA,0x44,0xF9,0x5B,0x6A,0x71,0x85,0x03,0xE4,\n\t0x29,0x62,0xE0,0x70,0x6F,0x41,0xC4,0xCF,0xB2,0xB1,0xCC,0xE3,0x7E,0xA6,0x07,0xA8,\n\t0x87,0xE7,0x7F,0x84,0x93,0xDB,0x52,0x4B,0x6C,0xEC,0x7E,0xDD,0xD4,0x24,0x48,0x10,\n\t0x69,0x9F,0x04,0x60,0x74,0xE6,0x48,0x18,0xF3,0xE4,0x2C,0xB9,0x4F,0x2E,0x50,0x7A,\n\t0xDF,0xD4,0x54,0x69,0x2B,0x8B,0xA7,0xF3,0xCE,0xFF,0x1F,0xF3,0x3E,0x26,0x01,0x39,\n\t0x17,0x95,0x84,0x89,0xB0,0xF0,0x4C,0x4B,0x82,0x91,0x9F,0xC4,0x4B,0xAC,0x9D,0xA5,\n\t0x74,0xAF,0x17,0x25,0xC9,0xCA,0x32,0xD3,0xBC,0x89,0x8A,0x84,0x89,0xCC,0x0D,0xAE,\n\t0x7C,0xA2,0xDB,0x9C,0x6A,0x78,0x91,0xEE,0xEA,0x76,0x5D,0x4E,0x87,0x60,0xF5,0x69,\n\t0x15,0x67,0xD4,0x02,0xCF,0xAF,0x48,0x36,0x07,0xEA,0xBF,0x6F,0x66,0x2D,0x06,0x8F,\n\t0xC4,0x9A,0xFE,0xF9,0xF6,0x90,0x87,0x75,0xB8,0xF7,0xAD,0x0F,0x76,0x10,0x5A,0x3D,\n\t0x59,0xB0,0x2E,0xB3,0xC7,0x35,0x2C,0xCC,0x70,0x56,0x2B,0xCB,0xE3,0x37,0x96,0xC5,\n\t0x2F,0x46,0x1B,0x8A,0x22,0x46,0xC7,0x88,0xA7,0x26,0x32,0x98,0x61,0xDF,0x86,0x22,\n\t0x8A,0xF4,0x1C,0x2F,0x87,0xA1,0x09,0xAA,0xCC,0xA9,0xAE,0xD3,0xBD,0x00,0x45,0x1C,\n\t0x9A,0x54,0x87,0x86,0x52,0x87,0xEF,0xFF,0x1E,0x8F,0xA1,0x8F,0xC1,0x89,0x5C,0x35,\n\t0x1B,0xDA,0x2D,0x3A,0x2C,0x16,0xB2,0xC2,0xF1,0x56,0xE2,0x78,0xC1,0x6B,0x63,0x97,\n\t0xC5,0x56,0x8F,0xC9,0x32,0x7F,0x2C,0xAA,0xAF,0xA6,0xA8,0xAC,0x20,0x91,0x22,0x88,\n\t0xDE,0xE4,0x60,0x8B,0xF9,0x4B,0x42,0x25,0x1A,0xE3,0x7F,0x9C,0x2C,0x19,0x89,0x3A,\n\t0x7E,0x05,0xD4,0x36,0xCC,0x69,0x58,0xC2,0xC1,0x32,0x8B,0x2F,0x90,0x85,0xEB,0x7A,\n\t0x39,0x50,0xA5,0xA1,0x27,0x92,0xC5,0x66,0xB0,0x20,0x4F,0x58,0x7E,0x55,0x83,0x43,\n\t0x2B,0x45,0xE2,0x9C,0xE4,0xD8,0x12,0x90,0x2C,0x16,0x83,0x56,0x16,0x79,0x03,0xB3,\n\t0xAD,0x2D,0x61,0x18,0x1A,0x13,0x1F,0x37,0xE2,0xE1,0x9C,0x73,0x7B,0x80,0xD5,0xFD,\n\t0x2D,0x51,0x87,0xFC,0x7B,0xAA,0xD7,0x1F,0x2C,0x7A,0x8E,0xAF,0xF4,0x8D,0xBB,0xCD,\n\t0x95,0x11,0x7C,0x72,0x0B,0xEE,0x6F,0xE2,0xB9,0xAF,0xDE,0x37,0x83,0xDE,0x8C,0x8D,\n\t0x62,0x05,0x67,0xB7,0x96,0xC6,0x8D,0x56,0xB6,0x0D,0xD7,0x62,0xBA,0xD6,0x46,0x36,\n\t0xBD,0x8E,0xC8,0xE6,0xEA,0x2A,0x6C,0x10,0x14,0xFF,0x6B,0x5B,0xFA,0x82,0x3C,0x46,\n\t0xB1,0x30,0x43,0x46,0x51,0x8A,0x7D,0x9B,0x92,0x3E,0x83,0x79,0x5B,0x55,0x5D,0xB2,\n\t0x6C,0x5E,0xCE,0x90,0x62,0x8E,0x53,0x98,0xC9,0x0D,0x6D,0xE5,0x2D,0x57,0xCD,0xC5,\n\t0x81,0x57,0xBA,0xE1,0xE8,0xB8,0x8F,0x72,0xE5,0x4F,0x13,0xDC,0xEA,0x9D,0x71,0x15,\n\t0x10,0xB2,0x11,0x88,0xD5,0x09,0xD4,0x7F,0x5B,0x65,0x7F,0x2C,0x3B,0x38,0x4C,0x11,\n\t0x68,0x50,0x8D,0xFB,0x9E,0xB0,0x59,0xBF,0x94,0x80,0x89,0x4A,0xC5,0x1A,0x18,0x12,\n\t0x89,0x53,0xD1,0x4A,0x10,0x29,0xE8,0x8C,0x1C,0xEC,0xB6,0xEA,0x46,0xC7,0x17,0x8B,\n\t0x25,0x15,0x31,0xA8,0xA2,0x6B,0x43,0xB1,0x9D,0xE2,0xDB,0x0B,0x87,0x9B,0xB0,0x11,\n\t0x04,0x0E,0x71,0xD2,0x29,0x77,0x89,0x82,0x0A,0x66,0x41,0x7F,0x1D,0x0B,0x48,0xFF,\n\t0x72,0xBB,0x24,0xFD,0xC2,0x48,0xA1,0x9B,0xFE,0x7B,0x7F,0xCE,0x88,0xDB,0x86,0xD9,\n\t0x85,0x3B,0x1C,0xB0,0xDC,0xA8,0x33,0x07,0xBF,0x51,0x2E,0xE3,0x0E,0x9A,0x00,0x97,\n\t0x1E,0x06,0xC0,0x97,0x43,0x9D,0xD8,0xB6,0x45,0xC4,0x86,0x67,0x5F,0x00,0xF8,0x88,\n\t0x9A,0xA4,0x52,0x9E,0xC7,0xAA,0x8A,0x83,0x75,0xEC,0xC5,0x18,0xAE,0xCE,0xC3,0x2F,\n\t0x1A,0x2B,0xF9,0x18,0xFF,0xAE,0x1A,0xF5,0x53,0x0B,0xB5,0x33,0x51,0xA7,0xFD,0xE8,\n\t0xA8,0xE1,0xA2,0x64,0xB6,0x22,0x17,0x43,0x80,0xCC,0x0A,0xD8,0xAE,0x3B,0xBA,0x40,\n\t0xD7,0xD9,0x92,0x4A,0x89,0xDF,0x04,0x10,0xEE,0x9B,0x18,0x2B,0x6A,0x77,0x69,0x8A,\n\t0x68,0xF4,0xF9,0xB9,0xA2,0x21,0x15,0x6E,0xE6,0x1E,0x3B,0x03,0x62,0x30,0x9B,0x60,\n\t0x41,0x7E,0x25,0x9B,0x9E,0x8F,0xC5,0x52,0x10,0x08,0xF8,0xC2,0x69,0xA1,0x21,0x11,\n\t0x88,0x37,0x5E,0x79,0x35,0x66,0xFF,0x10,0x42,0x18,0x6E,0xED,0x97,0xB6,0x6B,0x1C,\n\t0x4E,0x36,0xE5,0x6D,0x7D,0xB4,0xE4,0xBF,0x20,0xB9,0xE0,0x05,0x3A,0x69,0xD5,0xB8,\n\t0xE3,0xD5,0xDC,0xE0,0xB9,0xAC,0x53,0x3E,0x07,0xA4,0x57,0xAD,0x77,0xFF,0x48,0x18,\n\t0x76,0x2A,0xAC,0x49,0x2A,0x8E,0x47,0x75,0x6D,0x9F,0x67,0x63,0x30,0x35,0x8C,0x39,\n\t0x05,0x39,0xD5,0x6F,0x64,0x3A,0x5B,0xAD,0xCA,0x0B,0xBB,0x82,0x52,0x99,0x45,0xB1,\n\t0x93,0x36,0x36,0x99,0xAF,0x13,0x20,0x44,0x36,0xD8,0x02,0x44,0x09,0x39,0x92,0x85,\n\t0xFF,0x4A,0x4A,0x97,0x87,0xA6,0x63,0xD7,0xC7,0xB5,0xB5,0x24,0xED,0x0F,0xB4,0x6F,\n\t0x0C,0x58,0x52,0x14,0xD9,0xA6,0x7B,0xD3,0x79,0xBC,0x38,0x58,0xA1,0xBD,0x3B,0x84,\n\t0x06,0xD8,0x1A,0x06,0xFD,0x6B,0xA8,0xEA,0x4B,0x69,0x28,0x04,0x37,0xAD,0x82,0x99,\n\t0xFB,0x0E,0x1B,0x85,0xBD,0xA8,0x5D,0x73,0xCD,0xDC,0x58,0x75,0x0A,0xBE,0x63,0x6C,\n\t0x48,0xE7,0x4C,0xE4,0x30,0x2B,0x04,0x60,0xB9,0x15,0xD8,0xDA,0x86,0x81,0x75,0x8F,\n\t0x96,0xD4,0x8D,0x1C,0x5D,0x70,0x85,0x7C,0x1C,0x67,0x7B,0xD5,0x08,0x67,0xA6,0xCE,\n\t0x4B,0x0A,0x66,0x70,0xB7,0xE5,0x63,0xD4,0x5B,0x8A,0x82,0xEA,0x10,0x67,0xCA,0xE2,\n\t0xF4,0xEF,0x17,0x85,0x2F,0x2A,0x5F,0x8A,0x97,0x82,0xF8,0x6A,0xD6,0x34,0x10,0xEA,\n\t0xEB,0xC9,0x5C,0x3C,0xE1,0x49,0xF8,0x46,0xEB,0xDE,0xBD,0xF6,0xA9,0x92,0xF1,0xAA,\n\t0xA6,0xA0,0x18,0xB0,0x3A,0xD3,0x0F,0x1F,0xF3,0x6F,0xFF,0x31,0x45,0x43,0x44,0xD3,\n\t0x50,0x9A,0xF7,0x88,0x09,0x96,0xC1,0xCE,0x76,0xCC,0xF2,0x2C,0x2C,0xBA,0xAD,0x82,\n\t0x77,0x8F,0x18,0x84,0xC0,0xD2,0x07,0x9C,0x36,0x90,0x83,0x4E,0x0B,0xA5,0x4F,0x43,\n\t0x3E,0x04,0xAB,0x78,0x4F,0xD6,0xFB,0x09,0x01,0x24,0x90,0xDA,0x6F,0x3C,0x3A,0x61,\n\t0x0D,0x7F,0x69,0x4A,0xEB,0x2B,0x30,0x02,0xB4,0xDB,0xE0,0x84,0xA9,0xEC,0xD7,0x35,\n\t0xBF,0x37,0x7D,0x85,0x58,0xCE,0xA9,0x4E,0xE4,0x80,0xC7,0xA8,0xD3,0x30,0x67,0x48,\n\t0xEB,0x29,0xAF,0x2F,0x74,0x6A,0xB4,0xA7,0x3F,0x0F,0x3F,0x92,0xAF,0xF3,0xCA,0xAC,\n\t0xAF,0x4B,0xD9,0x94,0xC0,0x43,0xCA,0x81,0x0D,0x2F,0x48,0xA1,0xB0,0x27,0xD5,0xD2,\n\t0xEF,0x4B,0x05,0x85,0xA3,0xDE,0x4D,0x93,0x30,0x3C,0xF0,0xBB,0x4A,0x8F,0x30,0x27,\n\t0x4C,0xEB,0xE3,0x3E,0x64,0xED,0x9A,0x2F,0x3B,0xF1,0x82,0xF0,0xBA,0xF4,0xCF,0x7F,\n\t0x40,0xCB,0xB0,0xE1,0x7F,0xBC,0xAA,0x57,0xD3,0xC9,0x74,0xF2,0xFA,0x43,0x0D,0x22,\n\t0xD0,0xF4,0x77,0x4E,0x93,0xD7,0x85,0x70,0x1F,0x99,0xBF,0xB6,0xDE,0x35,0xF1,0x30,\n\t0xA7,0x5E,0x71,0xF0,0x6B,0x01,0x2D,0x7B,0x64,0xF0,0x33,0x53,0x0A,0x39,0x88,0xF3,\n\t0x6B,0x3A,0xA6,0x6B,0x35,0xD2,0x2F,0x43,0xCD,0x02,0xFD,0xB5,0xE9,0xBC,0x5B,0xAA,\n\t0xD8,0xA4,0x19,0x7E,0x0E,0x5D,0x94,0x81,0x9E,0x6F,0x77,0xAD,0xD6,0x0E,0x74,0x93,\n\t0x96,0xE7,0xC4,0x18,0x5F,0xAD,0xF5,0x19,\n};\n\nu32 card_hash[0x412];\nint cardheader_devicetype = 0;\nu32 global3_x00, global3_x04;\t// RTC value\nu32 global3_rand1;\nu32 global3_rand3;\n\nstatic u32 lookup(u32 *magic, u32 v)\n{\n\tu32 a = (v >> 24) & 0xFF;\n\tu32 b = (v >> 16) & 0xFF;\n\tu32 c = (v >> 8) & 0xFF;\n\tu32 d = (v >> 0) & 0xFF;\n\n\ta = magic[a+18+0];\n\tb = magic[b+18+256];\n\tc = magic[c+18+512];\n\td = magic[d+18+768];\n\n\treturn d + (c ^ (b + a));\n}\n\nstatic void encrypt(u32 *magic, u32 *arg1, u32 *arg2)\n{\n\tu32 a,b,c;\n\ta = *arg1;\n\tb = *arg2;\n\tfor (int i=0; i<16; i++)\n\t{\n\t\tc = magic[i] ^ a;\n\t\ta = b ^ lookup(magic, c);\n\t\tb = c;\n\t}\n\t*arg2 = a ^ magic[16];\n\t*arg1 = b ^ magic[17];\n}\n\nstatic void decrypt(u32 *magic, u32 *arg1, u32 *arg2)\n{\n\tu32 a,b,c;\n\ta = *arg1;\n\tb = *arg2;\n\tfor (int i=17; i>1; i--)\n\t{\n\t\tc = magic[i] ^ a;\n\t\ta = b ^ lookup(magic, c);\n\t\tb = c;\n\t}\n\t*arg1 = b ^ magic[0];\n\t*arg2 = a ^ magic[1];\n}\n\nstatic void encrypt(u32 *magic, u64 &cmd)\n{\n\tencrypt(magic, (u32 *)&cmd + 1, (u32 *)&cmd + 0);\n}\n\nstatic void decrypt(u32 *magic, u64 &cmd)\n{\n\tdecrypt(magic, (u32 *)&cmd + 1, (u32 *)&cmd + 0);\n}\n\nstatic void update_hashtable(u32* magic, u8 arg1[8])\n{\n\tfor (int j=0;j<18;j++)\n\t{\n\t\tu32 r3=0;\n\t\tfor (int i=0;i<4;i++)\n\t\t{\n\t\t\tr3 <<= 8;\n\t\t\tr3 |= arg1[(j*4 + i) & 7];\n\t\t}\n\t\tmagic[j] ^= r3;\n\t}\n\n\tu32 tmp1 = 0;\n\tu32 tmp2 = 0;\n\tfor (int i=0; i<18; i+=2)\n\t{\n\t\tencrypt(magic,&tmp1,&tmp2);\n\t\tmagic[i+0] = tmp1;\n\t\tmagic[i+1] = tmp2;\n\t}\n\tfor (int i=0; i<0x400; i+=2)\n\t{\n\t\tencrypt(magic,&tmp1,&tmp2);\n\t\tmagic[i+18+0] = tmp1;\n\t\tmagic[i+18+1] = tmp2;\n\t}\n}\n\nu32 arg2[3];\n\nstatic void init2(u32 *magic, u32 a[3])\n{\n\tencrypt(magic, a+2, a+1);\n\tencrypt(magic, a+1, a+0);\n\tupdate_hashtable(magic, (u8*)a);\n}\n\nstatic void init1(u32 cardheader_gamecode)\n{\n\tmemcpy(card_hash, &encr_data, 4*(1024 + 18));\n\targ2[0] = *(u32 *)&cardheader_gamecode;\n\targ2[1] = (*(u32 *)&cardheader_gamecode) >> 1;\n\targ2[2] = (*(u32 *)&cardheader_gamecode) << 1;\n\tinit2(card_hash, arg2);\n\tinit2(card_hash, arg2);\n}\n\nstatic void init0(u32 cardheader_gamecode)\n{\n\tinit1(cardheader_gamecode);\n\tencrypt(card_hash, (u32*)&global3_x04, (u32*)&global3_x00);\n\tglobal3_rand1 = global3_x00 ^ global3_x04;\t\t// more RTC\n\tglobal3_rand3 = global3_x04 ^ 0x0380FEB2;\n\tencrypt(card_hash, (u32*)&global3_rand3, (u32*)&global3_rand1);\n}\n\n// ARM9 decryption check values\n#define MAGIC30\t\t0x72636E65\n#define MAGIC34\t\t0x6A624F79\n\n/*\n * decrypt_arm9\n */\nstatic void decrypt_arm9(u32 cardheader_gamecode, unsigned char *data)\n{\n\tu32 *p = (u32*)data;\n\n\tinit1(cardheader_gamecode);\n\tdecrypt(card_hash, p+1, p);\n\targ2[1] <<= 1;\n\targ2[2] >>= 1;\n\tinit2(card_hash, arg2);\n\tdecrypt(card_hash, p+1, p);\n\n\tif (p[0] != MAGIC30 || p[1] != MAGIC34)\n\t{\n\t\tfprintf(stderr, \"Decryption failed!\\n\");\n\t\texit(1);\n\t}\n\n\t*p++ = 0xE7FFDEFF;\n\t*p++ = 0xE7FFDEFF;\n\tu32 size = 0x800 - 8;\n\twhile (size > 0)\n\t{\n\t\tdecrypt(card_hash, p+1, p);\n\t\tp += 2;\n\t\tsize -= 8;\n\t}\n}\n\n\nbool DecryptSecureArea(u8 *romdata, long romlen)\n{\n\t//this looks like it will only work on little endian hosts\n\tHeader* header = (Header*)romdata;\n\n\tint romType = DetectRomType(*header,(char*)romdata);\n\n\t/*bool do_decrypt = (endecrypt_option == 'd');\n\tbool do_encrypt = (endecrypt_option == 'e') || (endecrypt_option == 'E');\n\tunsigned int rounds_offsets = (endecrypt_option == 'E') ? 0x2000 : 0x1600;\n\tunsigned int sbox_offsets = (endecrypt_option == 'E') ? 0x2400 : 0x2800;*/\n#if 0\n\tunsigned int rounds_offsets = 0x1600;\n\tunsigned int sbox_offsets = 0x2800;\n#endif\n\n\tif(romType == ROMTYPE_INVALID)\n\t\treturn false;\n\n\t// check if ROM is already encrypted\n\tif (romType == ROMTYPE_NDSDUMPED)\n\t{\n\t\tprintf(\"Already decrypted.\\n\");\n\t}\n\telse if (romType >= ROMTYPE_ENCRSECURE)\t\t// includes ROMTYPE_MASKROM\n\t{\n\t\tunsigned char data[0x4000];\n\t\tmemcpy(data,romdata+0x4000,0x4000);\n\n\t\tdecrypt_arm9(*(u32 *)header->gamecode, data);\n\n\t\t// clear data after header\n\t\t//fseek(fNDS, 0x200, SEEK_SET);\n\t\t//for (unsigned int i=0x200; i<0x4000; i++) fputc(0, fNDS);\n\t\tmemset(romdata+0x200,0,(0x4000-0x200));\n\n\t\t// write secure 0x800\n\t\t//fseek(fNDS, 0x4000, SEEK_SET);\n\t\t//fwrite(data, 1, 0x800, fNDS);\n\t\tmemcpy(romdata+0x4000,data,0x800);\n\n\t\t// write header\n\t\t//(already poked directly)\n\t\t//fseek(fNDS, 0, SEEK_SET);\n\t\t//fwrite(&header, 512, 1, fNDS);\n\n\t\tprintf(\"Decrypted.\\n\");\n\t}\n\telse\n\t{\n\t\tprintf(\"File doesn't appear to have a secure area.\\n\");\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/decrypt/decrypt.h",
    "content": "/* decrypt.h - this file is part of DeSmuME\n *\n * Copyright (C) 2006 Rafael Vuijk\n *\n * This file is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * This file is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n#ifndef _DECRYPT_H_\n#define _DECRYPT_H_\n\nbool DecryptSecureArea(u8 *romdata, long romlen);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/decrypt/header.cpp",
    "content": "//taken from ndstool\n//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/source/header.cpp?revision=3063\n\n/* header.cpp - this file is part of DeSmuME\n *\n * Copyright (C) 2005-2006 Rafael Vuijk\n *\n * This file is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * This file is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n#include \"header.h\"\n\n//#include \"ndstool.h\"\n//#include \"banner.h\"\n//#include \"sha1.h\"\n//#include \"crc.h\"\n//#include \"bigint.h\"\n//#include \"arm7_sha1_homebrew.h\"\n//#include \"arm7_sha1_nintendo.h\"\n//#include \"encryption.h\"\n//\n///*\n// * Data\n// */\n//unsigned char publicKeyNintendo[] =\n//{\n//\t0x9E, 0xC1, 0xCC, 0xC0, 0x4A, 0x6B, 0xD0, 0xA0, 0x6D, 0x62, 0xED, 0x5F, 0x15, 0x67, 0x87, 0x12,\n//\t0xE6, 0xF4, 0x77, 0x1F, 0xD8, 0x5C, 0x81, 0xCE, 0x0C, 0xD0, 0x22, 0x31, 0xF5, 0x89, 0x08, 0xF5,\n//\t0xBE, 0x04, 0xCB, 0xC1, 0x4F, 0x63, 0xD9, 0x5A, 0x98, 0xFF, 0xEB, 0x36, 0x0F, 0x9C, 0x5D, 0xAD,\n//\t0x15, 0xB9, 0x99, 0xFB, 0xC6, 0x86, 0x2C, 0x0A, 0x0C, 0xFC, 0xE6, 0x86, 0x03, 0x60, 0xD4, 0x87,\n//\t0x28, 0xD5, 0x66, 0x42, 0x9C, 0xF7, 0x04, 0x14, 0x4E, 0x6F, 0x73, 0x20, 0xC3, 0x3E, 0x3F, 0xF5,\n//\t0x82, 0x2E, 0x78, 0x18, 0xD6, 0xCD, 0xD5, 0xC2, 0xDC, 0xAA, 0x1D, 0x34, 0x91, 0xEC, 0x99, 0xC9,\n//\t0xF7, 0xBF, 0xBF, 0xA0, 0x0E, 0x1E, 0xF0, 0x25, 0xF8, 0x66, 0x17, 0x54, 0x34, 0x28, 0x2D, 0x28,\n//\t0xA3, 0xAE, 0xF0, 0xA9, 0xFA, 0x3A, 0x70, 0x56, 0xD2, 0x34, 0xA9, 0xC5, 0x9E, 0x5D, 0xF5, 0xE1,\n//};\n//\n///*\n// * CalcHeaderCRC\n// */\n//unsigned short CalcHeaderCRC(Header &header)\n//{\n//\treturn CalcCrc16((unsigned char *)&header, 0x15E);\n//}\n//\n///*\n// * CalcLogoCRC\n// */\n//unsigned short CalcLogoCRC(Header &header)\n//{\n//\treturn CalcCrc16((unsigned char *)&header + 0xC0, 156);\n//}\n//\n/*\n * DetectRomType\n */\nint DetectRomType(const Header& header, char* romdata)\n{\n\tunsigned int * data = (unsigned int*)(romdata + 0x4000);\n\n\t//this is attempting to check for an utterly invalid nds header\n\tif(header.unitcode < 0 && header.unitcode > 3) return ROMTYPE_INVALID;\n\n\tif (header.arm9_rom_offset < 0x4000) return ROMTYPE_HOMEBREW;\n\tif (data[0] == 0x00000000 && data[1] == 0x00000000) return ROMTYPE_MULTIBOOT;\n\tif (data[0] == 0xE7FFDEFF && data[1] == 0xE7FFDEFF) return ROMTYPE_NDSDUMPED;\n\tfor (int i=0x200; i<0x4000; i++)\n\t\tif (romdata[i]) return ROMTYPE_MASKROM;\t// found something odd ;)\n\treturn ROMTYPE_ENCRSECURE;\n}\n\n///*\n// * CalcSecureAreaCRC\n// */\n//unsigned short CalcSecureAreaCRC(bool encrypt)\n//{\n//\tfseek(fNDS, 0x4000, SEEK_SET);\n//\tunsigned char data[0x4000];\n//\tfread(data, 1, 0x4000, fNDS);\n//\tif (encrypt) encrypt_arm9(*(u32 *)header.gamecode, data);\n//\treturn CalcCrc16(data, 0x4000);\n//}\n//\n///*\n// * CalcSecurityDataCRC\n// */\n//unsigned short CalcSecurityDataCRC()\n//{\n//\tfseek(fNDS, 0x1000, SEEK_SET);\n//\tunsigned char data[0x2000];\n//\tfread(data, 1, 0x2000, fNDS);\n//\treturn CalcCrc16(data, 0x2000);\n//}\n//\n///*\n// * CalcSegment3CRC\n// */\n//unsigned short CalcSegment3CRC()\n//{\n//\tfseek(fNDS, 0x3000, SEEK_SET);\n//\tunsigned char data[0x1000];\n//\tfread(data, 1, 0x1000, fNDS);\n//\tfor (int i=0; i<0x1000; i+=2)\t// swap bytes\n//\t{\n//\t\tunsigned char t = data[i+1]; data[i+1] = data[i]; data[i] = t;\n//\t}\n//\treturn CalcCcitt16(data, 0x1000);\t// why would they use CRC16-CCITT ?\n//}\n//\n///*\n// * FixHeaderCRC\n// */\n//void FixHeaderCRC(char *ndsfilename)\n//{\n//\tfNDS = fopen(ndsfilename, \"r+b\");\n//\tif (!fNDS) { fprintf(stderr, \"Cannot open file '%s'.\\n\", ndsfilename); exit(1); }\n//\tfread(&header, 512, 1, fNDS);\n//\theader.header_crc = CalcHeaderCRC(header);\n//\tfseek(fNDS, 0, SEEK_SET);\n//\tfwrite(&header, 512, 1, fNDS);\n//\tfclose(fNDS);\n//}\n//\n///*\n// * ShowHeaderInfo\n// */\n//void ShowHeaderInfo(Header &header, int romType, unsigned int length = 0x200)\n//{\n//\tprintf(\"0x00\\t%-25s\\t\", \"Game title\");\n//\n//\tfor (unsigned int i=0; i<sizeof(header.title); i++)\n//\t\tif (header.title[i]) putchar(header.title[i]); printf(\"\\n\");\n//\n//\tprintf(\"0x0C\\t%-25s\\t\", \"Game code\");\n//\tfor (unsigned int i=0; i<sizeof(header.gamecode); i++)\n//\t\tif (header.gamecode[i]) putchar(header.gamecode[i]);\n//\tfor (int i=0; i<NumCountries; i++)\n//\t{\n//\t\tif (countries[i].countrycode == header.gamecode[3])\n//\t\t{\n//\t\t\tprintf(\" (NTR-\");\n//\t\t\tfor (unsigned int j=0; j<sizeof(header.gamecode); j++)\n//\t\t\t\tif (header.gamecode[j]) putchar(header.gamecode[j]);\n//\t\t\tprintf(\"-%s)\", countries[i].name);\n//\t\t\tbreak;\n//\t\t}\n//\t}\n//\tprintf(\"\\n\");\n//\t\n//\tprintf(\"0x10\\t%-25s\\t\", \"Maker code\"); for (unsigned int i=0; i<sizeof(header.makercode); i++)\n//\t\tif (header.makercode[i]) putchar(header.makercode[i]);\n//\tfor (int j=0; j<NumMakers; j++)\n//\t{\n//\t\tif ((makers[j].makercode[0] == header.makercode[0]) && (makers[j].makercode[1] == header.makercode[1]))\n//\t\t{\n//\t\t\tprintf(\" (%s)\", makers[j].name);\n//\t\t\tbreak;\n//\t\t}\n//\t}\n//\tprintf(\"\\n\");\n//\n//\tprintf(\"0x12\\t%-25s\\t0x%02X\\n\", \"Unit code\", header.unitcode);\n//\tprintf(\"0x13\\t%-25s\\t0x%02X\\n\", \"Device type\", header.devicetype);\n//\tprintf(\"0x14\\t%-25s\\t0x%02X (%d Mbit)\\n\", \"Device capacity\", header.devicecap, 1<<header.devicecap);\n//\tprintf(\"0x15\\t%-25s\\t\", \"reserved 1\"); for (unsigned int i=0; i<sizeof(header.reserved1); i++) printf(\"%02X\", header.reserved1[i]); printf(\"\\n\");\n//\tprintf(\"0x1E\\t%-25s\\t0x%02X\\n\", \"ROM version\", header.romversion);\n//\tprintf(\"0x1F\\t%-25s\\t0x%02X\\n\", \"reserved 2\", header.reserved2);\n//\tprintf(\"0x20\\t%-25s\\t0x%X\\n\", \"ARM9 ROM offset\", (int)header.arm9_rom_offset);\n//\tprintf(\"0x24\\t%-25s\\t0x%X\\n\", \"ARM9 entry address\", (int)header.arm9_entry_address);\n//\tprintf(\"0x28\\t%-25s\\t0x%X\\n\", \"ARM9 RAM address\", (int)header.arm9_ram_address);\n//\tprintf(\"0x2C\\t%-25s\\t0x%X\\n\", \"ARM9 code size\", (int)header.arm9_size);\n//\tprintf(\"0x30\\t%-25s\\t0x%X\\n\", \"ARM7 ROM offset\", (int)header.arm7_rom_offset);\n//\tprintf(\"0x34\\t%-25s\\t0x%X\\n\", \"ARM7 entry address\", (int)header.arm7_entry_address);\n//\tprintf(\"0x38\\t%-25s\\t0x%X\\n\", \"ARM7 RAM address\", (int)header.arm7_ram_address);\n//\tprintf(\"0x3C\\t%-25s\\t0x%X\\n\", \"ARM7 code size\", (int)header.arm7_size);\n//\tprintf(\"0x40\\t%-25s\\t0x%X\\n\", \"File name table offset\", (int)header.fnt_offset);\n//\tprintf(\"0x44\\t%-25s\\t0x%X\\n\", \"File name table size\", (int)header.fnt_size);\n//\tprintf(\"0x48\\t%-25s\\t0x%X\\n\", \"FAT offset\", (int)header.fat_offset);\n//\tprintf(\"0x4C\\t%-25s\\t0x%X\\n\", \"FAT size\", (int)header.fat_size);\n//\tprintf(\"0x50\\t%-25s\\t0x%X\\n\", \"ARM9 overlay offset\", (int)header.arm9_overlay_offset);\n//\tprintf(\"0x54\\t%-25s\\t0x%X\\n\", \"ARM9 overlay size\", (int)header.arm9_overlay_size);\n//\tprintf(\"0x58\\t%-25s\\t0x%X\\n\", \"ARM7 overlay offset\", (int)header.arm7_overlay_offset);\n//\tprintf(\"0x5C\\t%-25s\\t0x%X\\n\", \"ARM7 overlay size\", (int)header.arm7_overlay_size);\n//\tprintf(\"0x60\\t%-25s\\t0x%08X\\n\", \"ROM control info 1\", (int)header.rom_control_info1);\n//\tprintf(\"0x64\\t%-25s\\t0x%08X\\n\", \"ROM control info 2\", (int)header.rom_control_info2);\n//\tprintf(\"0x68\\t%-25s\\t0x%X\\n\", \"Icon/title offset\", (int)header.banner_offset);\n//\tunsigned short secure_area_crc = CalcSecureAreaCRC((romType == ROMTYPE_NDSDUMPED));\n//\tconst char *s1, *s2 = \"\";\n//\tif (romType == ROMTYPE_HOMEBREW) s1 = \"-\";\n//\telse if (secure_area_crc == header.secure_area_crc) s1 = \"OK\";\n//\telse\n//\t{\n//\t\ts1 = \"INVALID\";\n//\t}\n//\tswitch (romType)\n//\t{\n//\t\tcase ROMTYPE_HOMEBREW: s2 = \"homebrew\"; break;\n//\t\tcase ROMTYPE_MULTIBOOT: s2 = \"multiboot\"; break;\n//\t\tcase ROMTYPE_NDSDUMPED: s2 = \"decrypted\"; break;\n//\t\tcase ROMTYPE_ENCRSECURE: s2 = \"encrypted\"; break;\n//\t\tcase ROMTYPE_MASKROM: s2 = \"mask ROM\"; break;\n//\t}\n//\tprintf(\"0x6C\\t%-25s\\t0x%04X (%s, %s)\\n\", \"Secure area CRC\", (int)header.secure_area_crc, s1, s2);\n//\tprintf(\"0x6E\\t%-25s\\t0x%04X\\n\", \"ROM control info 3\", (int)header.rom_control_info3);\n//\tprintf(\"0x70\\t%-25s\\t0x%X\\n\", \"ARM9 ?\", (int)header.offset_0x70);\n//\tprintf(\"0x74\\t%-25s\\t0x%X\\n\", \"ARM7 ?\", (int)header.offset_0x74);\n//\tprintf(\"0x78\\t%-25s\\t0x%08X\\n\", \"Magic 1\", (int)header.offset_0x78);\n//\tprintf(\"0x7C\\t%-25s\\t0x%08X\\n\", \"Magic 2\", (int)header.offset_0x7C);\n//\tprintf(\"0x80\\t%-25s\\t0x%08X\\n\", \"Application end offset\", (int)header.application_end_offset);\n//\tprintf(\"0x84\\t%-25s\\t0x%08X\\n\", \"ROM header size\", (int)header.rom_header_size);\n//\tfor (unsigned int i=0x88; i<0xC0; i+=4)\n//\t{\n//\t\tunsigned_int &x = ((unsigned_int *)&header)[i/4];\n//\t\tif (x != 0) printf(\"0x%02X\\t%-25s\\t0x%08X\\n\", i, \"?\", (int)x);\n//\t}\n//\tunsigned short logo_crc = CalcLogoCRC(header);\n//\tprintf(\"0x15C\\t%-25s\\t0x%04X (%s)\\n\", \"Logo CRC\", (int)header.logo_crc, (logo_crc == header.logo_crc) ? \"OK\" : \"INVALID\");\n//\tunsigned short header_crc = CalcHeaderCRC(header);\n//\tprintf(\"0x15E\\t%-25s\\t0x%04X (%s)\\n\", \"Header CRC\", (int)header.header_crc, (header_crc == header.header_crc) ? \"OK\" : \"INVALID\");\n//\tfor (unsigned int i=0x160; i<length; i+=4)\n//\t{\n//\t\tunsigned_int &x = ((unsigned_int *)&header)[i/4];\n//\t\tif (x != 0) printf(\"0x%02X\\t%-25s\\t0x%08X\\n\", i, \"?\", (int)x);\n//\t}\n//}\n//\n///*\n// * HeaderSha1\n// */\n//void HeaderSha1(FILE *fNDS, unsigned char *header_sha1, int romType)\n//{\n//\tsha1_ctx m_sha1;\n//\tsha1_begin(&m_sha1);\n//\tunsigned char buf[32 + 0x200];\n//\tfseek(fNDS, 0x200, SEEK_SET);\t\t// check for 32 bytes text + alternate header\n//\tfread(buf, 1, sizeof(buf), fNDS);\n//\tif (!memcmp(buf, \"DS DOWNLOAD PLAY\", 16))\t// found?\n//\t{\n//\t\tsha1_hash(buf + 0x20, 0x160, &m_sha1);\t// alternate header\n//\t\tif (verbose >= 2)\n//\t\t{\n//\t\t\tprintf(\"{ DS Download Play(TM) / Wireless MultiBoot header information:\\n\");\n//\t\t\tShowHeaderInfo(*(Header *)(buf + 0x20), romType, 0x160);\n//\t\t\tprintf(\"}\\n\");\n//\t\t}\n//\t}\n//\telse\n//\t{\n//\t\tfseek(fNDS, 0, SEEK_SET);\n//\t\tfread(buf, 1, sizeof(buf), fNDS);\n//\t\tsha1_hash(buf, 0x160, &m_sha1);\n//\t}\n//\tsha1_end(header_sha1, &m_sha1);\n//}\n//\n///*\n// * Arm9Sha1Multiboot\n// */\n//void Arm9Sha1Multiboot(FILE *fNDS, unsigned char *arm9_sha1)\n//{\n//\tsha1_ctx m_sha1;\n//\tsha1_begin(&m_sha1);\n//\tfseek(fNDS, header.arm9_rom_offset, SEEK_SET);\n//\tunsigned int len = header.arm9_size;\n//\tunsigned char *buf = new unsigned char [len];\n//\tfread(buf, 1, len, fNDS);\n//\t//printf(\"%u\\n\", len);\n//\tsha1_hash(buf, len, &m_sha1);\n//\tdelete [] buf;\n//\tsha1_end(arm9_sha1, &m_sha1);\n//}\n//\n///*\n// * Arm9Sha1ClearedOutArea\n// */\n//void Arm9Sha1ClearedOutArea(FILE *fNDS, unsigned char *arm9_sha1)\n//{\n//\tsha1_ctx m_sha1;\n//\tsha1_begin(&m_sha1);\n//\tfseek(fNDS, header.arm9_rom_offset, SEEK_SET);\n//\tunsigned int len = header.arm9_size;\n//\tunsigned char *buf = new unsigned char [len];\n//\n//\tint len1 = (0x5000 - header.arm9_rom_offset);\t\t// e.g. 0x5000 - 0x4000 = 0x1000\n//\tint len3 = header.arm9_size - (0x7000 - header.arm9_rom_offset);\t// e.g. 0x10000 - (0x7000 - 0x4000) = 0xD000\n//\tint len2 = header.arm9_size - len1 - len3;\t\t\t// e.g. 0x10000 - 0x1000 - 0xD000 = 0x2000\n//\tif (len1 > 0) fread(buf, 1, len1, fNDS);\n//\tif (len2 > 0) { memset(buf + len1, 0, len2); fseek(fNDS, len2, SEEK_CUR); }\t\t// gets cleared for security?\n//\tif (len3 > 0) fread(buf + len1 + len2, 1, len3, fNDS);\n////\tprintf(\"%X %X %X\\n\", len1, len2, len3);\n//\n////\t\tmemset(buf, 0, 0x800);\t\t// clear \"secure area\" too\n//\n//\tsha1_hash(buf, len, &m_sha1);\n//\tdelete [] buf;\n//\tsha1_end(arm9_sha1, &m_sha1);\n//}\n//\n///*\n// * Arm7Sha1\n// */\n//void Arm7Sha1(FILE *fNDS, unsigned char *arm7_sha1)\n//{\n//\tsha1_ctx m_sha1;\n//\tsha1_begin(&m_sha1);\n//\tfseek(fNDS, header.arm7_rom_offset, SEEK_SET);\n//\tunsigned int len = header.arm7_size;\n//\tunsigned char *buf = new unsigned char [len];\n//\tfread(buf, 1, len, fNDS);\n//\t//printf(\"%u\\n\", len);\n//\tsha1_hash(buf, len, &m_sha1);\n//\tdelete [] buf;\n//\tsha1_end(arm7_sha1, &m_sha1);\n//}\n//\n///*\n// * CompareSha1WithList\n// */\n//int CompareSha1WithList(unsigned char *arm7_sha1, const unsigned char *text, unsigned int textSize)\n//{\n//\twhile (1)\n//\t{\n//\t\t//printf(\"\\n\");\n//\t\tfor (int i=0; i<SHA1_DIGEST_SIZE; i++)\n//\t\t{\n//\t\t\tunsigned char b = 0;\n//\t\t\tfor (int n=0; n<2; n++)\n//\t\t\t{\n//\t\t\t\t//printf(\"%c\", *text);\n//\t\t\t\tif (!*text) return -1;\n//\t\t\t\tb = b << 4 | ((*text > '9') ? ((*text - 'A') & 7) + 10 : *text - '0');\n//\t\t\t\ttext++;\n//\t\t\t}\n//\t\t\t//printf(\"%02X\", b);\n//\t\t\tif (b != arm7_sha1[i]) break; else if (i == 19) return 0;\n//\t\t}\n//\t\twhile (*text && (*text >= ' ')) text++;\t\t// line end\n//\t\twhile (*text && (*text < ' ')) text++;\t\t// new line\n//\t}\n//}\n//\n///*\n// * HashAndCompareWithList\n// * -1=error, 0=match, 1=no match\n// */\n//int HashAndCompareWithList(char *filename, unsigned char sha1[])\n//{\n//\tFILE *f = fopen(filename, \"rb\");\n//\tif (!f) return -1;\n//\tsha1_ctx m_sha1;\n//\tsha1_begin(&m_sha1);\n//\tunsigned char buf[1024];\n//\tunsigned int r;\n//\tdo\n//\t{\n//\t\tr = fread(buf, 1, 1024, f);\n//\t\tsha1_hash(buf, r, &m_sha1);\n//\t} while (r > 0);\n//\tfclose(f);\n//\tsha1_end(sha1, &m_sha1);\n//\tif (CompareSha1WithList(sha1, arm7_sha1_homebrew, arm7_sha1_homebrew_size)) return 1;\t// not yet in list\n//\treturn 0;\n//}\n//\n///*\n// * strsepc\n// */\n//char *strsepc(char **s, char d)\n//{\n//\tchar *r = *s;\n//\tfor (char *p = *s; ; p++)\n//\t{\n//\t\tif (*p == 0) { *s = p; break; }\n//\t\tif (*p == d) { *s = p+1; *p = 0; break; }\n//\t}\n//\treturn r;\n//}\n//\n///*\n// * RomListInfo\n// */\n//void RomListInfo(unsigned int crc32_match)\n//{\n//\tif (!romlistfilename) return;\n//\tFILE *fRomList = fopen(romlistfilename, \"rt\");\n//\tif (!fRomList) { fprintf(stderr, \"Cannot open file '%s'.\\n\", romlistfilename); exit(1); }\n//\tchar s[1024];\n//\twhile (fgets(s, 1024, fRomList))\t// empty, title, title, title, title, filename, CRC32\n//\t{\n//\t\tchar *p = s;\n//\t\tif (strlen(strsepc(&p, '\\xAC')) == 0)\n//\t\t{\n//\t\t\tchar *title = strsepc(&p, '\\xAC');\n//\t\t\tunsigned int index = strtoul(title, 0, 10);\n//\t\t\ttitle += 7;\n//\t\t\tchar *b1 = strchr(title, '(');\n//\t\t\tchar *b2 = b1 ? strchr(b1+1, ')') : 0;\n//\t\t\tchar *b3 = b2 ? strchr(b2+1, '(') : 0;\n//\t\t\tchar *b4 = b3 ? strchr(b3+1, ')') : 0;\n//\t\t\tchar *group = 0;\n//\t\t\tif (b1 + 2 == b2) if (b3 && b4) { *b3 = 0; *b4 = 0; group = b3+1; }\t\t// remove release group name\n//\t\t\tstrsepc(&p, '\\xAC'); strsepc(&p, '\\xAC');\n//\t\t\tstrsepc(&p, '\\xAC'); strsepc(&p, '\\xAC');\n//\t\t\tunsigned long crc32 = strtoul(strsepc(&p, '\\xAC'), 0, 16);\n//\t\t\tif (crc32 == crc32_match)\n//\t\t\t{\n//\t\t\t\tprintf(\"Release index: \\t%u\\n\", index);\n//\t\t\t\tprintf(\"Release title: \\t%s\\n\", title);\n//\t\t\t\tprintf(\"Release group: \\t%s\\n\", group ? group : \"\");\n//\t\t\t}\n//\t\t\t//for (int i=0; i<10; i++) printf(\"%d %s\\n\", i, strsepc(&p, '\\xAC'));\n//\t\t}\n//\t}\n//}\n//\n///*\n// * ShowVerboseInfo\n// */\n//void ShowVerboseInfo(FILE *fNDS, Header &header, int romType)\n//{\n//\t// calculate SHA1 of ARM7 binary\n//\tunsigned char arm7_sha1[SHA1_DIGEST_SIZE];\n//\tArm7Sha1(fNDS, arm7_sha1);\n//\n//\t// find signature data\n//\tunsigned_int signature_id = 0;\n//\tfseek(fNDS, header.application_end_offset, SEEK_SET);\n//\tfread(&signature_id, sizeof(signature_id), 1, fNDS);\n//\tif (signature_id != 0x00016361)\n//\t{\n//\t\tfseek(fNDS, header.application_end_offset - 136, SEEK_SET);\t\t// try again\n//\t\tfread(&signature_id, sizeof(signature_id), 1, fNDS);\n//\t}\n//\tif (signature_id == 0x00016361)\n//\t{\n//\t\tprintf(\"\\n\");\n//\n//\t\tunsigned char signature[128];\n//\t\tfread(signature, 1, sizeof(signature), fNDS);\n//\n//\t\tunsigned char sha_parts[3*SHA1_DIGEST_SIZE + 4];\n//\t\tfread(sha_parts + 3*SHA1_DIGEST_SIZE, 4, 1, fNDS);\t\t// some number\n//\t\t\n//\t\t//printf(\"%08X\\n\", *(unsigned int *)(sha_parts + 3*SHA1_DIGEST_SIZE));\n//\n//\t\tunsigned char header_sha1[SHA1_DIGEST_SIZE];\n//\t\tHeaderSha1(fNDS, header_sha1, romType);\n//\t\tmemcpy(sha_parts + 0*SHA1_DIGEST_SIZE, header_sha1, SHA1_DIGEST_SIZE);\n//\n//\t\tunsigned char arm9_sha1[SHA1_DIGEST_SIZE];\n//\t\tif (romType == ROMTYPE_MULTIBOOT)\n//\t\t{\n//\t\t\tArm9Sha1Multiboot(fNDS, arm9_sha1);\n//\t\t}\n//\t\telse\n//\t\t{\n//\t\t\tArm9Sha1ClearedOutArea(fNDS, arm9_sha1);\n//\t\t}\n//\t\tmemcpy(sha_parts + 1*SHA1_DIGEST_SIZE, arm9_sha1, SHA1_DIGEST_SIZE);\n//\n//\t\tmemcpy(sha_parts + 2*SHA1_DIGEST_SIZE, arm7_sha1, SHA1_DIGEST_SIZE);\n//\n//\t\tunsigned char sha_final[SHA1_DIGEST_SIZE];\n//\t\t{\n//\t\t\tsha1_ctx m_sha1;\n//\t\t\tsha1_begin(&m_sha1);\n//\t\t\tunsigned int len = sizeof(sha_parts);\n//\t\t\tunsigned char *buf = sha_parts;\n//\t\t\tsha1_hash(buf, len, &m_sha1);\n//\t\t\tsha1_end(sha_final, &m_sha1);\n//\t\t}\n//\n//\t\t// calculate SHA1 from signature\n//\t\tunsigned char sha1_from_sig[SHA1_DIGEST_SIZE];\n//\t\t{\n//\t\t\tBigInt _signature;\n//\t\t\t_signature.Set(signature, sizeof(signature));\n//\t\t\t//printf(\"signature: \"); _signature.print();\n//\n//\t\t\tBigInt _publicKey;\n//\t\t\t_publicKey.Set(publicKeyNintendo, sizeof(publicKeyNintendo));\n//\t\t\t//printf(\"public key: \"); _publicKey.print();\n//\n//\t\t\tBigInt big_sha1;\n//\t\t\tbig_sha1.PowMod(_signature, _publicKey);\n//\t\t\t//printf(\"big_sha1: \"); big_sha1.print();\n//\t\t\tbig_sha1.Get(sha1_from_sig, sizeof(sha1_from_sig));\n//\t\t}\n//\t\t\n//\t\tbool ok = (memcmp(sha_final, sha1_from_sig, SHA1_DIGEST_SIZE) == 0);\n//\t\tprintf(\"DS Download Play(TM) / Wireless MultiBoot signature: %s\\n\", ok ? \"OK\" : \"INVALID\");\n//\t\tif (!ok)\n//\t\t{\n//\t\t\tprintf(\"header hash:    \\t\"); for (int i=0; i<SHA1_DIGEST_SIZE; i++) printf(\"%02X\", (sha_parts + 0*SHA1_DIGEST_SIZE)[i]); printf(\"\\n\");\n//\t\t\tprintf(\"ARM9 hash:      \\t\"); for (int i=0; i<SHA1_DIGEST_SIZE; i++) printf(\"%02X\", (sha_parts + 1*SHA1_DIGEST_SIZE)[i]); printf(\"\\n\");\n//\t\t\tprintf(\"ARM7 hash:      \\t\"); for (int i=0; i<SHA1_DIGEST_SIZE; i++) printf(\"%02X\", (sha_parts + 2*SHA1_DIGEST_SIZE)[i]); printf(\"\\n\");\n//\t\t\tprintf(\"combined hash:  \\t\"); for (int i=0; i<SHA1_DIGEST_SIZE; i++) printf(\"%02X\", sha_final[i]); printf(\"\\n\");\n//\t\t\tprintf(\"signature hash: \\t\"); for (int i=0; i<SHA1_DIGEST_SIZE; i++) printf(\"%02X\", sha1_from_sig[i]); printf(\"\\n\");\n//\t\t}\n//\t}\n//\t\n//\t// CRC32\n//\t{\n//\t\tunsigned char *buf = new unsigned char [0x10000];\n//\t\tfseek(fNDS, 0, SEEK_SET);\n//\t\tunsigned long crc32 = ~0;\n//\t\tint r;\n//\t\twhile ((r = fread(buf, 1, 0x10000, fNDS)) > 0)\n//\t\t{\n//\t\t\tcrc32 = CalcCrc32(buf, r, crc32);\n//\t\t}\n//\t\tcrc32 = ~crc32;\n//\t\tdelete [] buf;\n//\n//\t\tprintf(\"\\nFile CRC32:    \\t%08X\\n\", (unsigned int)crc32);\n//\t\tRomListInfo(crc32);\n//\t}\n//\t\n//\t// ROM dumper 1.0 bad data\n//\t{\n//\t\tunsigned char buf[0x200];\n//\t\tfseek(fNDS, 0x7E00, SEEK_SET);\n//\t\tfread(buf, 1, 0x200, fNDS);\n//\t\tunsigned long crc32 = ~CalcCrc32(buf, 0x200);\n//\t\tprintf(\"\\nSMT dumper v1.0 corruption check: \\t%s\\n\", (crc32 == 0x7E8B456F) ? \"CORRUPTED\" : \"OK\");\n//\t}\n//\n//\t// Verify ARM7 SHA1 hash against known default binaries\n//\tint bKnownArm7 = 0;\n//\t{\n//\t\tprintf(\"\\nARM7 binary hash : \\t\"); for (int i=0; i<SHA1_DIGEST_SIZE; i++) printf(\"%02X\", arm7_sha1[i]); printf(\"\\n\");\n//\n//\t\tif (CompareSha1WithList(arm7_sha1, arm7_sha1_homebrew, arm7_sha1_homebrew_size) == 0)\n//\t\t{\n//\t\t\tbKnownArm7 = 1; printf(\"ARM7 binary is homebrew verified.\\n\");\n//\t\t}\n//\t\tif (CompareSha1WithList(arm7_sha1, arm7_sha1_nintendo, arm7_sha1_nintendo_size) == 0)\n//\t\t{\n//\t\t\tbKnownArm7 = 2; printf(\"ARM7 binary is Nintendo verified.\\n\");\n//\t\t}\n//\t\tif (!bKnownArm7) printf(\"WARNING! ARM7 binary is NOT verified!\\n\");\n//\t}\n//\n//\t// check ARM7 RAM address\n//\tif (bKnownArm7 != 2)\n//\tif ((header.arm7_ram_address < 0x03000000) || (header.arm7_ram_address >= 0x04000000))\n//\t{\n//\t\tprintf(\"\\nWARNING! ARM7 RAM address does not point to shared memory!\\n\");\n//\t}\n//\n//\t// check ARM7 entry address\n//\tif ((header.arm7_entry_address < header.arm7_ram_address) ||\n//\t\t(header.arm7_entry_address > header.arm7_ram_address + header.arm7_size))\n//\t{\n//\t\tprintf(\"\\nWARNING! ARM7 entry address points outside of ARM7 binary!\\n\");\n//\t}\n//}\n//\n///*\n// * ShowInfo\n// */\n//void ShowInfo(char *ndsfilename)\n//{\n//\tfNDS = fopen(ndsfilename, \"rb\");\n//\tif (!fNDS) { fprintf(stderr, \"Cannot open file '%s'.\\n\", ndsfilename); exit(1); }\n//\tfread(&header, 512, 1, fNDS);\n//\n//\tint romType = DetectRomType();\n//\n//\tprintf(\"Header information:\\n\");\n//\tShowHeaderInfo(header, romType);\n//\n//\t// banner info\n//\tif (header.banner_offset)\n//\t{\n//\t\tBanner banner;\n//\t\tfseek(fNDS, header.banner_offset, SEEK_SET);\n//\t\tif (fread(&banner, 1, sizeof(banner), fNDS))\n//\t\t{\n//\t\t\tunsigned short banner_crc = CalcBannerCRC(banner);\n//\t\t\tprintf(\"\\n\");\n//\t\t\tprintf(\"Banner CRC:                     \\t0x%04X (%s)\\n\", (int)banner.crc, (banner_crc == banner.crc) ? \"OK\" : \"INVALID\");\n//\t\n//\t\t\tfor (int language=1; language<=1; language++)\n//\t\t\t{\n//\t\t\t\tint line = 1;\n//\t\t\t\tbool nextline = true;\n//\t\t\t\tfor (int i=0; i<128; i++)\n//\t\t\t\t{\n//\t\t\t\t\tunsigned short c = banner.title[language][i];\n//\t\t\t\t\tif (c >= 128) c = '_';\n//\t\t\t\t\tif (c == 0x00) { printf(\"\\n\"); break; }\n//\t\t\t\t\tif (c == 0x0A)\n//\t\t\t\t\t{\n//\t\t\t\t\t\tnextline = true;\n//\t\t\t\t\t}\n//\t\t\t\t\telse\n//\t\t\t\t\t{\n//\t\t\t\t\t\tif (nextline)\n//\t\t\t\t\t\t{\n//\t\t\t\t\t\t\tif (line != 1) printf(\"\\n\");\n//\t\t\t\t\t\t\tprintf(\"%s banner text, line %d:\", bannerLanguages[language], line);\n//\t\t\t\t\t\t\tfor (unsigned int i=0; i<11 - strlen(bannerLanguages[language]); i++) putchar(' ');\n//\t\t\t\t\t\t\tprintf(\"\\t\");\n//\t\t\t\t\t\t\tnextline = false;\n//\t\t\t\t\t\t\tline++;\n//\t\t\t\t\t\t}\n//\t\t\t\t\t\tputchar(c);\n//\t\t\t\t\t}\n//\t\t\t\t}\n//\t\t\t}\n//\t\t}\n//\t}\n//\n//\t// ARM9 footer\n//\tfseek(fNDS, header.arm9_rom_offset + header.arm9_size, SEEK_SET);\n//\tunsigned_int nitrocode;\n//\tif (fread(&nitrocode, sizeof(nitrocode), 1, fNDS) && (nitrocode == 0xDEC00621))\n//\t{\n//\t\tprintf(\"\\n\");\n//\t\tprintf(\"ARM9 footer found.\\n\");\n//\t\tunsigned_int x;\n//\t\tfread(&x, sizeof(x), 1, fNDS);\n//\t\tfread(&x, sizeof(x), 1, fNDS);\n//\t}\n//\n//\t// show security CRCs\n//\tif (romType >= ROMTYPE_NDSDUMPED)\n//\t{\n//\t\tprintf(\"\\n\");\n//\t\tunsigned short securitydata_crc = CalcSecurityDataCRC();\n//\t\tprintf(\"Security data CRC (0x1000-0x2FFF)  0x%04X\\n\", (int)securitydata_crc);\n//\t\tunsigned short segment3_crc = CalcSegment3CRC();\n//\t\tprintf(\"Segment3 CRC (0x3000-0x3FFF)       0x%04X (%s)\\n\", (int)segment3_crc, (segment3_crc == 0x0254) ? \"OK\" : \"INVALID\");\n//\t}\n//\n//\t// more information\n//\tif (verbose >= 1)\n//\t{\n//\t\tShowVerboseInfo(fNDS, header, romType);\n//\t}\n//\n//\tfclose(fNDS);\n//}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/decrypt/header.h",
    "content": "//taken from ndstool\n//http://devkitpro.svn.sourceforge.net/viewvc/devkitpro/trunk/tools/nds/ndstool/include/header.h?revision=2447\n\n/* header.h - this file is part of DeSmuME\n *\n * Copyright (C) 2005-2006 Rafael Vuijk\n *\n * This file is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2, or (at your option)\n * any later version.\n *\n * This file is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n#ifndef _HEADER_H_\n#define _HEADER_H_\n\n\n#include \"../../types.h\"\n\n#include \"../../PACKED.h\"\nstruct __PACKED Header\n{\n\tchar title[0xC];\n\tchar gamecode[0x4];\n\tchar makercode[2];\n\tunsigned char unitcode;\t\t\t\t\t\t\t// product code. 0 = Nintendo DS\n\tunsigned char devicetype;\t\t\t\t\t\t// device code. 0 = normal\n\tunsigned char devicecap;\t\t\t\t\t\t// device size. (1<<n Mbit)\n\tunsigned char reserved1[0x9];\t\t\t\t\t// 0x015..0x01D\n\tunsigned char romversion;\n\tunsigned char reserved2;\t\t\t\t\t\t// 0x01F\n\tu32 arm9_rom_offset;\t\t\t\t\t// points to libsyscall and rest of ARM9 binary\n\tu32 arm9_entry_address;\n\tu32 arm9_ram_address;\n\tu32 arm9_size;\n\tu32 arm7_rom_offset;\n\tu32 arm7_entry_address;\n\tu32 arm7_ram_address;\n\tu32 arm7_size;\n\tu32 fnt_offset;\n\tu32 fnt_size;\n\tu32 fat_offset;\n\tu32 fat_size;\n\tu32 arm9_overlay_offset;\n\tu32 arm9_overlay_size;\n\tu32 arm7_overlay_offset;\n\tu32 arm7_overlay_size;\n\tu32 rom_control_info1;\t\t\t\t\t// 0x00416657 for OneTimePROM\n\tu32 rom_control_info2;\t\t\t\t\t// 0x081808F8 for OneTimePROM\n\tu32 banner_offset;\n\tu16 secure_area_crc;\n\tu16 rom_control_info3;\t\t\t\t// 0x0D7E for OneTimePROM\n\tu32 offset_0x70;\t\t\t\t\t\t// magic1 (64 bit encrypted magic code to disable LFSR)\n\tu32 offset_0x74;\t\t\t\t\t\t// magic2\n\tu32 offset_0x78;\t\t\t\t\t\t// unique ID for homebrew\n\tu32 offset_0x7C;\t\t\t\t\t\t// unique ID for homebrew\n\tu32 application_end_offset;\t\t\t// rom size\n\tu32 rom_header_size;\n\tu32 offset_0x88;\t\t\t\t\t\t// reserved... ?\n\tu32 offset_0x8C;\n\n\t// reserved\n\tu32 offset_0x90;\n\tu32 offset_0x94;\n\tu32 offset_0x98;\n\tu32 offset_0x9C;\n\tu32 offset_0xA0;\n\tu32 offset_0xA4;\n\tu32 offset_0xA8;\n\tu32 offset_0xAC;\n\tu32 offset_0xB0;\n\tu32 offset_0xB4;\n\tu32 offset_0xB8;\n\tu32 offset_0xBC;\n\n\tunsigned char logo[156];\t\t\t\t\t\t// character data\n\tu16 logo_crc;\n\tu16 header_crc;\n\n\t// 0x160..0x17F reserved\n\tu32 offset_0x160;\n\tu32 offset_0x164;\n\tu32 offset_0x168;\n\tu32 offset_0x16C;\n\tunsigned char zero[0x90];\n};\n#include \"../../PACKED_END.h\"\n\n\n\nstruct Country\n{\n\tconst char countrycode;\n\tconst char *name;\n};\n\nstruct Maker\n{\n\tconst char *makercode;\n\tconst char *name;\n};\n\nextern Country countries[];\nextern int NumCountries;\n\nextern Maker makers[];\nextern int NumMakers;\n\nunsigned short CalcHeaderCRC(Header &header);\nunsigned short CalcLogoCRC(Header &header);\nvoid FixHeaderCRC(char *ndsfilename);\nvoid ShowInfo(char *ndsfilename);\nint HashAndCompareWithList(char *filename, unsigned char sha1[]);\nint DetectRomType(const Header& header, char* romdata);\nunsigned short CalcSecureAreaCRC(bool encrypt);\n\n#define ROMTYPE_HOMEBREW\t0\n#define ROMTYPE_MULTIBOOT\t1\n#define ROMTYPE_NDSDUMPED\t2\t// decrypted secure area\n#define ROMTYPE_ENCRSECURE\t3\n#define ROMTYPE_MASKROM\t\t4\t// unknown layout\n#define ROMTYPE_INVALID\t\t5\t// rejected; can't be a supported rom\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/dlditool.cpp",
    "content": "/*\n    dlditool - Dynamically Linked Disk Interface patch tool\n    Copyright (C) 2006  Michael Chisholm (Chishm)\n\n\tSend all queries to chishm@hotmail.com\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\n\t* v1.24d - 2010-06-14 - zeromus\n\t\t* Modified for inclusion in desmume\n\n\t* v1.24 - 2007-08-02 - SmileyDude\n\t\t* Now using EXIT_SUCCESS and EXIT_FAILURE at the suggestion of MachinShin.\n\t\t* Defined EXIT_NO_DLDI_SECTION for when there is no DLDI section in a file.\n\t\t* Added cast to strcmp() call to appease the compiler.\n\t\t\n\t* v1.23 - 2007-01-23 - Chishm\n\t\t* Fixed bug when DLDI section doesn't exist\n\t\t* addr_t is now a signed int\n\n\t* v1.22 - 2007-01-12 - WinterMute\n\t\t* add search paths for dldi files\n\n\t* v1.21 - 2007-01-12 - Chishm\n\t\t* Improved error messages\n\n\t* v1.20 - 2007-01-11 - Chishm\n\t\t* Changed offset calculation method\n\n\t* v1.10 - 2007-01-07 - Chishm\n\t\t* Removed assumptions about endianess of computer\n\t\t\t* Word size shouldn't matter now either, except that an int type must be at least 32 bits long\n\t\t* Added *.sc.nds and *.gba.nds file extensions\n\t\t* Improved command line argument parsing\n\n\t* v1.01 - 2006-12-30 - Chishm\n\t\t* Minor bugfix parsing 3 arguments\n\n\t* v1.00 - 2006-12-25 - Chishm\n\t\t* Original release\n*/\n#define VERSION \"v1.24\"\n\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <stdlib.h>\n#include <stdarg.h>\n\n#ifndef _MSC_VER\n#include <stdint.h>\n#include <unistd.h>\n#include <sys/param.h>\n#else\ntypedef int int32_t;\n#define MAXPATHLEN      1024\n#endif\n\n#include <sys/stat.h>\n\nnamespace DLDI\n{\n\n//#ifndef bool\n// typedef enum {false = 0, true = !0} bool;\n//#endif\n\ntypedef int32_t addr_t;\ntypedef unsigned char data_t;\n\n#define FEATURE_MEDIUM_CANREAD\t0x00000001\n#define FEATURE_MEDIUM_CANWRITE\t0x00000002\n#define FEATURE_SLOT_GBA\t0x00000010\n#define FEATURE_SLOT_NDS\t0x00000020\n\n#define MAGIC_TOKEN 0xBF8DA5ED\n\n#define FIX_ALL\t0x01\n#define FIX_GLUE\t0x02\n#define FIX_GOT\t0x04\n#define FIX_BSS\t0x08\n\n#define DLDI_VERSION 1\n\n#define EXIT_NO_DLDI_SECTION\t2\n\nenum DldiOffsets {\n\tDO_magicString = 0x00,\t\t\t// \"\\xED\\xA5\\x8D\\xBF Chishm\"\n\tDO_magicToken = 0x00,\t\t\t// 0xBF8DA5ED\n\tDO_magicShortString = 0x04,\t\t// \" Chishm\"\n\tDO_version = 0x0C,\n\tDO_driverSize = 0x0D,\n\tDO_fixSections = 0x0E,\n\tDO_allocatedSpace = 0x0F,\n\n\tDO_friendlyName = 0x10,\n\n\tDO_text_start = 0x40,\t\t\t// Data start\n\tDO_data_end = 0x44,\t\t\t\t// Data end\n\tDO_glue_start = 0x48,\t\t\t// Interworking glue start\t-- Needs address fixing\n\tDO_glue_end = 0x4C,\t\t\t\t// Interworking glue end\n\tDO_got_start = 0x50,\t\t\t// GOT start\t\t\t\t\t-- Needs address fixing\n\tDO_got_end = 0x54,\t\t\t\t// GOT end\n\tDO_bss_start = 0x58,\t\t\t// bss start\t\t\t\t\t-- Needs setting to zero\n\tDO_bss_end = 0x5C,\t\t\t\t// bss end\n\n\t// IO_INTERFACE data\n\tDO_ioType = 0x60,\n\tDO_features = 0x64,\n\tDO_startup = 0x68,\t\n\tDO_isInserted = 0x6C,\t\n\tDO_readSectors = 0x70,\t\n\tDO_writeSectors = 0x74,\n\tDO_clearStatus = 0x78,\n\tDO_shutdown = 0x7C,\n\tDO_code = 0x80\n};\n\nconst data_t dldiMagicString[] = \"\\xED\\xA5\\x8D\\xBF Chishm\";\nconst char dldiFileExtension[] = \".dldi\";\n\n\nvoid printUsage (char* programName) {\n\tprintf (\"Usage:\\n\");\n\tprintf (\"%s <dldi> <app>\\n\", programName);\n\tprintf (\"   <dldi>        the dldi patch file to apply\\n\");\n\tprintf (\"   <app>         the application binary to apply the patch to\\n\");\n\treturn;\n}\n\naddr_t readAddr (data_t *mem, addr_t offset) {\n\treturn (addr_t)( \n\t\t\t(mem[offset + 0] << 0) |\n\t\t\t(mem[offset + 1] << 8) |\n\t\t\t(mem[offset + 2] << 16) |\n\t\t\t(mem[offset + 3] << 24)\n\t\t);\n}\n\nvoid writeAddr (data_t *mem, addr_t offset, addr_t value) {\n\tmem[offset + 0] = (data_t)(value >> 0);\n\tmem[offset + 1] = (data_t)(value >> 8);\n\tmem[offset + 2] = (data_t)(value >> 16);\n\tmem[offset + 3] = (data_t)(value >> 24);\n}\n\nint stringCaseInsensitiveCompare (const char *str1, const char *str2) {\n\twhile (tolower(*str1) == tolower(*str2)) {\n\t\tif (*str1 == '\\0') {\n\t\t\treturn 0;\n\t\t}\n\t\tstr1++;\n\t\tstr2++;\n\t}\n\treturn (tolower(*str1) - tolower(*str2));\n}\n\nbool stringEndsWith (const char *str, const char *end) {\n\tconst char* strEnd;\n\tif (strlen (str) < strlen(end)) {\n\t\treturn false;\n\t}\n\tstrEnd = &str[strlen (str) - strlen(end)];\n\treturn (stringCaseInsensitiveCompare (strEnd, end) == 0);\t\t\t\n}\n\nbool stringStartsWith (const char *str, const char *start) {\n\treturn (strstr (str, start) == str);\n}\n\naddr_t quickFind (const data_t* data, const data_t* search, size_t dataLen, size_t searchLen) {\n\tconst int32_t* dataChunk = (const int32_t*) data;\n\tint searchChunk = ((const int32_t*)search)[0];\n\taddr_t i;\n\taddr_t dataChunkEnd = (addr_t)(dataLen / sizeof(int32_t));\n\n\tfor ( i = 0; i < dataChunkEnd; i++) {\n\t\tif (dataChunk[i] == searchChunk) {\n\t\t\tif ((i*sizeof(int32_t) + searchLen) > dataLen) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (memcmp (&data[i*sizeof(int32_t)], search, searchLen) == 0) {\n\t\t\t\treturn i*sizeof(int32_t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nFILE *openDLDIFile(const char *argv0, char *dldiFileName ) {\n\n\n\tFILE *dldiFile;\n\tchar *dldiPATH;\n\tchar appPath[MAXPATHLEN];\n\tchar appName[MAXPATHLEN];\n\tchar appPathName[MAXPATHLEN];\n\n\tchar *ptr, *lastSlash;\n\tstruct stat buf;\n\n\t// add .dldi extension to filename\n\tif (!stringEndsWith (dldiFileName, dldiFileExtension)) {\n\t\tstrcat (dldiFileName, dldiFileExtension);\n\t}\n\n\tprintf (\"Trying \\\"%s\\\"\\n\", dldiFileName);\n\t// try opening from current directory\n\tdldiFile = fopen(dldiFileName,\"rb\");\n\n\tif ( NULL != dldiFile ) return dldiFile;\n\n\t// check if the filename has a path component\n\t// check both slash varieties, win32 understands both\n\t// if we have a directory separator don't bother with search paths\n\tif ( NULL != strstr(dldiFileName,\"\\\\\") ) return NULL;\n\tif ( NULL != strstr(dldiFileName,\"/\") ) return NULL;\n\t\n\t// check for DLDIPATH in environment\n\tdldiPATH = getenv(\"DLDIPATH\");\n\t\n\n\tif ( NULL != dldiPATH ) {\n\t\tstrcpy(appPath,dldiPATH);\n\t\tif ( appPath[strlen(appPath)] != '\\\\' &&  appPath[strlen(appPath)] != '/' )\n\t\t\tstrcat(appPath,\"/\");\n\t\tstrcat ( appPath, dldiFileName );\n\t\t\n\t\tprintf (\"Trying \\\"%s\\\"\\n\", appPath);\n\t\tdldiFile = fopen(appPath,\"rb\");\n\n\t\tif ( NULL != dldiFile ) return dldiFile;\n\t\t \n\t}\n\t\n\t\n\tlastSlash = NULL;\n\tptr = (char *)argv0;\n\t\t\n\twhile ( *(ptr++) != 0 ) {\n\t\tif ( *ptr == '\\\\' || * ptr == '/' )\n\t\t\tlastSlash = ptr;\n\t}\n\n\tif ( NULL != lastSlash ) {\n\t\t*(lastSlash++) = '\\0';\n\t\tstrcpy(appPath, argv0);\n\t\tstrcpy(appName, lastSlash);\n\t\tstrcat(appPath, \"/\");\n\t} else {\n\t\tstrcpy(appPath, \"\");\n\t\tstrcpy(appName, argv0);\n\t}\n\t\t\t \n\n\t// finally try in the application path\n\t// if argv0 contains a directory separator we have a path component\n\n\tif ( NULL == strstr(appPath,\"\\\\\") &&  NULL == strstr(appPath,\"/\") ) {\n\n\t\t// no path in argv0 so search system path\n\t\tchar *sysPATH = getenv(\"PATH\");\n\t\tchar *nextPATH;\n\t\tchar *thisPATH = sysPATH;\n\t\tprintf(\"Searching system path\\n%s\\n\",sysPATH);\n\t\t\n\t\twhile(1) {\n\t\t\tnextPATH = strstr(thisPATH, \":\" ); // find next PATH separator\n\n\t\t\tif ( NULL != nextPATH )\n\t\t\t\t*(nextPATH++) = '\\0'; // terminate string, point to next component\n\n\t\t\tstrcpy(appPath,thisPATH);\n\t\t\tstrcat(appPath,\"/\");\n\t\t\tstrcpy(appPathName,appPath);\n\t\t\tstrcat(appPathName,appName);\t\t// add application name\n\n\t\t\tif ( stat(appPathName,&buf) == 0 )\t// if it exists we found the path\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tthisPATH = nextPATH;\n\t\t\tstrcpy(appPath,\"\");\t\t// empty path\n\t\t\tif ( thisPATH == NULL) break;\n\t\t}\n\t}\n\n\tstrcat(appPath,\"dldi/\");\t\t// add dldi folder\n\tstrcat(appPath,dldiFileName);\t// add dldi filename to path\n\tprintf (\"Trying \\\"%s\\\"\\n\", appPath);\n\n\treturn fopen(appPath,\"rb\");\t\t// no more places to check, just return this handle\n}\n\n//int main(int argc, char* argv[])\n//{\n//\t\n//\tchar *dldiFileName = NULL;\n//\tchar *appFileName = NULL;\n//\n//\taddr_t memOffset;\t\t\t// Offset of DLDI after the file is loaded into memory\n//\taddr_t patchOffset;\t\t\t// Position of patch destination in the file\n//\taddr_t relocationOffset;\t// Value added to all offsets within the patch to fix it properly\n//\taddr_t ddmemOffset;\t\t\t// Original offset used in the DLDI file\n//\taddr_t ddmemStart;\t\t\t// Start of range that offsets can be in the DLDI file\n//\taddr_t ddmemEnd;\t\t\t// End of range that offsets can be in the DLDI file\n//\taddr_t ddmemSize;\t\t\t// Size of range that offsets can be in the DLDI file\n//\n//\taddr_t addrIter;\n//\n//\tFILE* dldiFile;\n//\tFILE* appFile;\n//\n//\tdata_t *pDH;\n//\tdata_t *pAH;\n//\n//\tdata_t *appFileData = NULL;\n//\tsize_t appFileSize = 0;\n//\tdata_t *dldiFileData = NULL;\n//\tsize_t dldiFileSize = 0;\n//\t\n//\tint i;\n//\n//\tprintf (\"Dynamically Linked Disk Interface patch tool \" VERSION \" by Michael Chisholm (Chishm)\\n\\n\");\n//\n//\tfor (i = 1; i < argc; i++) {\n//\t\tif (dldiFileName == NULL) {\n//\t\t\tdldiFileName = (char*) malloc (strlen (argv[i]) + 1 + sizeof(dldiFileExtension));\n//\t\t\tif (!dldiFileName) {\n//\t\t\t\treturn EXIT_FAILURE;\n//\t\t\t}\n//\t\t\tstrcpy (dldiFileName, argv[i]);\n//\t\t} else if (appFileName == NULL) {\n//\t\t\tappFileName = (char*) malloc (strlen (argv[i]) + 1);\n//\t\t\tif (!appFileName) {\n//\t\t\t\treturn EXIT_FAILURE;\n//\t\t\t}\n//\t\t\tstrcpy (appFileName, argv[i]);\n//\t\t} else {\n//\t\t\tprintUsage (argv[0]);\n//\t\t\treturn EXIT_FAILURE;\n//\t\t}\n//\t}\n//\n//\tif ((dldiFileName == NULL) || (appFileName == NULL)) {\n//\t\tprintUsage (argv[0]);\n//\t\treturn EXIT_FAILURE;\n//\t}\n//\n//\tif (!(dldiFile = openDLDIFile(argv[0],dldiFileName))) {\n//\t\tprintf (\"Cannot open \\\"%s\\\" - %s\\n\", dldiFileName, strerror(errno));\n//\t\t\treturn EXIT_FAILURE;\n//\t}\n//\n//\tif (!(appFile = fopen (appFileName, \"rb+\"))) {\n//\t\tprintf (\"Cannot open \\\"%s\\\" - %s\\n\", appFileName, strerror(errno));\n//\t\treturn EXIT_FAILURE;\n//\t}\n//\n//\t// Load the app file and the DLDI patch file\n//\tfseek (appFile, 0, SEEK_END);\n//\tappFileSize = ftell(appFile);\n//\tappFileData = (data_t*) malloc (appFileSize);\n//\tfseek (appFile, 0, SEEK_SET);\n//\n//\tfseek (dldiFile, 0, SEEK_END);\n//\tdldiFileSize = ftell(dldiFile);\n//\tdldiFileData = (data_t*) malloc (dldiFileSize);\n//\tfseek (dldiFile, 0, SEEK_SET);\n//\n//\tif (!appFileData || !dldiFileData) {\n//\t\tfclose (appFile);\n//\t\tfclose (dldiFile);\n//\t\tif (appFileData) free (appFileData);\n//\t\tif (dldiFileData) free (dldiFileData);\n//\t\tprintf (\"Out of memory\\n\");\n//\t\treturn EXIT_FAILURE;\n//\t}\n//\n//\tfread (appFileData, 1, appFileSize, appFile);\n//\tfread (dldiFileData, 1, dldiFileSize, dldiFile);\n//\tfclose (dldiFile);\n//\n//\t// Find the DSDI reserved space in the file\n//\tpatchOffset = quickFind (appFileData, dldiMagicString, appFileSize, sizeof(dldiMagicString)/sizeof(char));\n//\n//\tif (patchOffset < 0) {\n//\t\tprintf (\"%s does not have a DLDI section\\n\", appFileName);\n//\t\treturn EXIT_NO_DLDI_SECTION;\n//\t}\n//\n//\tpDH = dldiFileData;\n//\tpAH = &appFileData[patchOffset];\n//\n//\t// Make sure the DLDI file is valid and usable\n//\tif (strcmp ((char*)dldiMagicString, (char*)&pDH[DO_magicString]) != 0) {\n//\t\tprintf (\"Invalid DLDI file\\n\");\n//\t\treturn EXIT_FAILURE;\n//\t}\n//\tif (pDH[DO_version] != DLDI_VERSION) {\n//\t\tprintf (\"Incorrect DLDI file version. Expected %d, found %d.\\n\", DLDI_VERSION, pDH[DO_version]);\n//\t\treturn EXIT_FAILURE;\n//\t}\n//\tif (pDH[DO_driverSize] > pAH[DO_allocatedSpace]) {\n//\t\tprintf (\"Not enough space for patch. Available %d bytes, need %d bytes\\n\", ( 1 << pAH[DO_allocatedSpace]), ( 1 << pDH[DO_driverSize]) );\n//\t\treturn EXIT_FAILURE;\n//\t}\n//\n//\tmemOffset = readAddr (pAH, DO_text_start);\n//\tif (memOffset == 0) {\n//\t\t\tmemOffset = readAddr (pAH, DO_startup) - DO_code;\n//\t}\n//\tddmemOffset = readAddr (pDH, DO_text_start);\n//\trelocationOffset = memOffset - ddmemOffset;\n//\n//\tprintf (\"Old driver:          %s\\n\", &pAH[DO_friendlyName]);\n//\tprintf (\"New driver:          %s\\n\", &pDH[DO_friendlyName]);\n//\tprintf (\"\\n\");\n//\tprintf (\"Position in file:    0x%08X\\n\", patchOffset);\n//\tprintf (\"Position in memory:  0x%08X\\n\", memOffset);\n//\tprintf (\"Patch base address:  0x%08X\\n\", ddmemOffset);\n//\tprintf (\"Relocation offset:   0x%08X\\n\", relocationOffset);\n//\tprintf (\"\\n\");\n//\n//\tddmemStart = readAddr (pDH, DO_text_start);\n//\tddmemSize = (1 << pDH[DO_driverSize]);\n//\tddmemEnd = ddmemStart + ddmemSize;\n//\n//\t// Remember how much space is actually reserved\n//\tpDH[DO_allocatedSpace] = pAH[DO_allocatedSpace];\n//\t// Copy the DLDI patch into the application\n//\tmemcpy (pAH, pDH, dldiFileSize);\n//\n//\t// Fix the section pointers in the header\n//\twriteAddr (pAH, DO_text_start, readAddr (pAH, DO_text_start) + relocationOffset);\n//\twriteAddr (pAH, DO_data_end, readAddr (pAH, DO_data_end) + relocationOffset);\n//\twriteAddr (pAH, DO_glue_start, readAddr (pAH, DO_glue_start) + relocationOffset);\n//\twriteAddr (pAH, DO_glue_end, readAddr (pAH, DO_glue_end) + relocationOffset);\n//\twriteAddr (pAH, DO_got_start, readAddr (pAH, DO_got_start) + relocationOffset);\n//\twriteAddr (pAH, DO_got_end, readAddr (pAH, DO_got_end) + relocationOffset);\n//\twriteAddr (pAH, DO_bss_start, readAddr (pAH, DO_bss_start) + relocationOffset);\n//\twriteAddr (pAH, DO_bss_end, readAddr (pAH, DO_bss_end) + relocationOffset);\n//\t// Fix the function pointers in the header\n//\twriteAddr (pAH, DO_startup, readAddr (pAH, DO_startup) + relocationOffset);\n//\twriteAddr (pAH, DO_isInserted, readAddr (pAH, DO_isInserted) + relocationOffset);\n//\twriteAddr (pAH, DO_readSectors, readAddr (pAH, DO_readSectors) + relocationOffset);\n//\twriteAddr (pAH, DO_writeSectors, readAddr (pAH, DO_writeSectors) + relocationOffset);\n//\twriteAddr (pAH, DO_clearStatus, readAddr (pAH, DO_clearStatus) + relocationOffset);\n//\twriteAddr (pAH, DO_shutdown, readAddr (pAH, DO_shutdown) + relocationOffset);\n//\n//\tif (pDH[DO_fixSections] & FIX_ALL) { \n//\t\t// Search through and fix pointers within the data section of the file\n//\t\tfor (addrIter = (readAddr(pDH, DO_text_start) - ddmemStart); addrIter < (readAddr(pDH, DO_data_end) - ddmemStart); addrIter++) {\n//\t\t\tif ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) {\n//\t\t\t\twriteAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset);\n//\t\t\t}\n//\t\t}\n//\t}\n//\n//\tif (pDH[DO_fixSections] & FIX_GLUE) { \n//\t\t// Search through and fix pointers within the glue section of the file\n//\t\tfor (addrIter = (readAddr(pDH, DO_glue_start) - ddmemStart); addrIter < (readAddr(pDH, DO_glue_end) - ddmemStart); addrIter++) {\n//\t\t\tif ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) {\n//\t\t\t\twriteAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset);\n//\t\t\t}\n//\t\t}\n//\t}\n//\n//\tif (pDH[DO_fixSections] & FIX_GOT) { \n//\t\t// Search through and fix pointers within the Global Offset Table section of the file\n//\t\tfor (addrIter = (readAddr(pDH, DO_got_start) - ddmemStart); addrIter < (readAddr(pDH, DO_got_end) - ddmemStart); addrIter++) {\n//\t\t\tif ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) {\n//\t\t\t\twriteAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset);\n//\t\t\t}\n//\t\t}\n//\t}\n//\n//\tif (pDH[DO_fixSections] & FIX_BSS) { \n//\t\t// Initialise the BSS to 0\n//\t\tmemset (&pAH[readAddr(pDH, DO_bss_start) - ddmemStart] , 0, readAddr(pDH, DO_bss_end) - readAddr(pDH, DO_bss_start));\n//\t}\n//\n//\t// Write the patch back to the file\n//\tfseek (appFile, patchOffset, SEEK_SET);\n//\tfwrite (pAH, 1, ddmemSize, appFile);\n//\tfclose (appFile);\n//\n//\tfree (appFileData);\n//\tfree (dldiFileData);\n//\n//\tprintf (\"Patched successfully\\n\");\n//\n//\treturn EXIT_SUCCESS;\n//}\n\n//  Source File: mpcf.dldi\r\n//         Time: 6/14/2010 9:38 PM\r\n// Orig. Offset: 0 / 0x00000000\r\n//       Length: 1876 / 0x00000754 (bytes)\r\ndata_t mpcf_dldi[1876] =\r\n{\r\n    0xED, 0xA5, 0x8D, 0xBF, 0x20, 0x43, 0x68, 0x69, 0x73, 0x68, 0x6D, 0x00, 0x01, 0x0B, 0x0C, 0x00, \r\n    0x47, 0x42, 0x41, 0x20, 0x4D, 0x6F, 0x76, 0x69, 0x65, 0x20, 0x50, 0x6C, 0x61, 0x79, 0x65, 0x72, \r\n    0x20, 0x28, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x46, 0x6C, 0x61, 0x73, 0x68, 0x29, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x80, 0xBF, 0x54, 0x07, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, \r\n    0x50, 0x07, 0x80, 0xBF, 0x50, 0x07, 0x80, 0xBF, 0x54, 0x07, 0x80, 0xBF, 0x70, 0x07, 0x80, 0xBF, \r\n    0x4D, 0x50, 0x43, 0x46, 0x13, 0x00, 0x00, 0x00, 0x3C, 0x01, 0x80, 0xBF, 0x98, 0x01, 0x80, 0xBF, \r\n    0x78, 0x02, 0x80, 0xBF, 0xC8, 0x04, 0x80, 0xBF, 0xC8, 0x01, 0x80, 0xBF, 0x10, 0x07, 0x80, 0xBF, \r\n    0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, \r\n    0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x10, 0x40, 0x2D, 0xE9, 0x2C, 0x40, 0x9F, 0xE5, \r\n    0x00, 0x30, 0xD4, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x24, 0x20, 0x9F, 0xE5, 0x05, 0x00, 0x00, 0x1A, \r\n    0x00, 0x00, 0x52, 0xE3, 0x1C, 0x00, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x12, 0xFF, 0x2F, 0x11, \r\n    0x01, 0x30, 0xA0, 0xE3, 0x00, 0x30, 0xC4, 0xE5, 0x10, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, \r\n    0x54, 0x07, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x48, 0x07, 0x80, 0xBF, 0x04, 0xE0, 0x2D, 0xE5, \r\n    0x40, 0x30, 0x9F, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x04, 0xD0, 0x4D, 0xE2, 0x38, 0x00, 0x9F, 0xE5, \r\n    0x38, 0x10, 0x9F, 0xE5, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x30, 0x00, 0x9F, 0xE5, \r\n    0x00, 0x30, 0x90, 0xE5, 0x00, 0x00, 0x53, 0xE3, 0x28, 0x30, 0x9F, 0xE5, 0x02, 0x00, 0x00, 0x0A, \r\n    0x00, 0x00, 0x53, 0xE3, 0x0F, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x04, 0xD0, 0x8D, 0xE2, \r\n    0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x48, 0x07, 0x80, 0xBF, \r\n    0x58, 0x07, 0x80, 0xBF, 0x4C, 0x07, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x09, 0x14, 0xA0, 0xE3, \r\n    0x06, 0x18, 0x81, 0xE2, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x30, 0xE0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, \r\n    0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0xB0, 0x30, 0xC1, 0xE1, 0xB0, 0x20, 0xD1, 0xE1, \r\n    0x04, 0xE0, 0x2D, 0xE5, 0xAA, 0xCC, 0xA0, 0xE3, 0x55, 0xEC, 0xE0, 0xE3, 0x03, 0x00, 0x52, 0xE1, \r\n    0xAA, 0xE0, 0x4E, 0xE2, 0x55, 0xC0, 0x8C, 0xE2, 0x00, 0x00, 0xA0, 0xE3, 0x03, 0x00, 0x00, 0x1A, \r\n    0xB0, 0xE0, 0xC1, 0xE1, 0xB0, 0x30, 0xD1, 0xE1, 0x0C, 0x00, 0x53, 0xE0, 0x01, 0x00, 0xA0, 0x13, \r\n    0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x26, 0x35, 0xA0, 0xE3, 0x03, 0x37, 0x83, 0xE2, \r\n    0x50, 0x20, 0xA0, 0xE3, 0xB0, 0x20, 0xC3, 0xE1, 0xB0, 0x00, 0xD3, 0xE1, 0x00, 0x08, 0xA0, 0xE1, \r\n    0x20, 0x08, 0xA0, 0xE1, 0xFF, 0x00, 0x00, 0xE2, 0x50, 0x00, 0x50, 0xE3, 0x00, 0x00, 0xA0, 0x13, \r\n    0x01, 0x00, 0xA0, 0x03, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x34, 0xA0, 0xE3, 0x0E, 0x38, 0x83, 0xE2, \r\n    0xB0, 0x20, 0xD3, 0xE1, 0x80, 0x00, 0x12, 0xE3, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0x00, 0xA0, 0xE3, \r\n    0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x50, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, \r\n    0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, \r\n    0x80, 0x00, 0x12, 0xE3, 0x01, 0x00, 0x80, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, \r\n    0x26, 0x15, 0xA0, 0xE3, 0x03, 0x17, 0x81, 0xE2, 0xB0, 0x30, 0xD1, 0xE1, 0x50, 0x30, 0x13, 0xE2, \r\n    0x01, 0x00, 0xA0, 0x13, 0x1E, 0xFF, 0x2F, 0x11, 0x26, 0x27, 0xA0, 0xE3, 0x96, 0x2C, 0x82, 0xE2, \r\n    0x03, 0x00, 0xA0, 0xE1, 0x80, 0x20, 0x82, 0xE2, 0x01, 0x00, 0x00, 0xEA, 0x02, 0x00, 0x50, 0xE1, \r\n    0x0A, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD1, 0xE1, 0x50, 0x30, 0x13, 0xE2, 0x01, 0x00, 0x80, 0xE2, \r\n    0xF9, 0xFF, 0xFF, 0x0A, 0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, \r\n    0x03, 0x00, 0x50, 0xE1, 0x00, 0x00, 0xA0, 0xC3, 0x01, 0x00, 0xA0, 0xD3, 0x1E, 0xFF, 0x2F, 0xE1, \r\n    0x03, 0x00, 0xA0, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x4B, 0x2D, 0xE9, 0x09, 0x34, 0xA0, 0xE3, \r\n    0x0E, 0x38, 0x83, 0xE2, 0xB0, 0xC0, 0xD3, 0xE1, 0x80, 0x00, 0x1C, 0xE3, 0x10, 0xD0, 0x4D, 0xE2, \r\n    0x01, 0x90, 0xA0, 0xE1, 0x02, 0xE0, 0xA0, 0xE1, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0xC0, 0xA0, 0xE3, \r\n    0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x5C, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, \r\n    0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, \r\n    0x80, 0x00, 0x12, 0xE3, 0x01, 0xC0, 0x8C, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, \r\n    0x26, 0xC5, 0xA0, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x30, 0x13, 0xE2, \r\n    0x26, 0x17, 0xA0, 0x03, 0x96, 0x1C, 0x81, 0x02, 0x03, 0x20, 0xA0, 0x01, 0x80, 0x10, 0x81, 0x02, \r\n    0x02, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x67, 0x00, 0x00, 0x0A, \r\n    0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x00, 0x13, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, \r\n    0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, \r\n    0x5E, 0x00, 0x00, 0xCA, 0xFF, 0x00, 0x59, 0xE3, 0x00, 0x30, 0xA0, 0x83, 0x0C, 0x30, 0x8D, 0x85, \r\n    0x5E, 0x00, 0x00, 0x9A, 0x00, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, \r\n    0x09, 0x54, 0xA0, 0xE3, 0x04, 0x30, 0x8D, 0xE5, 0x0C, 0x30, 0x9D, 0xE5, 0x20, 0x4C, 0xA0, 0xE1, \r\n    0x0E, 0xB0, 0xA0, 0xE1, 0x05, 0x60, 0xA0, 0xE1, 0x20, 0x74, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, \r\n    0x20, 0x18, 0xA0, 0xE1, 0x05, 0xC0, 0xA0, 0xE1, 0x05, 0x00, 0xA0, 0xE1, 0x05, 0xE0, 0xA0, 0xE1, \r\n    0x01, 0x57, 0x85, 0xE2, 0xB0, 0x30, 0xC5, 0xE1, 0x04, 0x30, 0x9D, 0xE5, 0x0F, 0x40, 0x04, 0xE2, \r\n    0x06, 0x68, 0x86, 0xE2, 0xB0, 0x30, 0xC6, 0xE1, 0xFF, 0x70, 0x07, 0xE2, 0x02, 0x27, 0x82, 0xE2, \r\n    0xFF, 0x10, 0x01, 0xE2, 0x0A, 0x08, 0x80, 0xE2, 0xE0, 0x40, 0x84, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, \r\n    0x0E, 0xE8, 0x8E, 0xE2, 0x20, 0x30, 0xA0, 0xE3, 0xB0, 0x70, 0xC2, 0xE1, 0xB0, 0x10, 0xC0, 0xE1, \r\n    0xB0, 0x40, 0xCC, 0xE1, 0xB0, 0x30, 0xCE, 0xE1, 0x0B, 0x80, 0xA0, 0xE1, 0x01, 0x90, 0x59, 0xE2, \r\n    0x3E, 0x00, 0x00, 0x3A, 0x26, 0x25, 0xA0, 0xE3, 0x03, 0x27, 0x82, 0xE2, 0xB0, 0x30, 0xD2, 0xE1, \r\n    0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, \r\n    0x26, 0x17, 0xA0, 0x13, 0x96, 0x1C, 0x81, 0x12, 0x02, 0x00, 0xA0, 0x11, 0x80, 0x10, 0x81, 0x12, \r\n    0x00, 0x20, 0xA0, 0x13, 0x02, 0x00, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, \r\n    0x26, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, \r\n    0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, \r\n    0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, \r\n    0x1A, 0x00, 0x00, 0xCA, 0x01, 0x00, 0x18, 0xE3, 0x0B, 0x10, 0xA0, 0x01, 0xFF, 0x20, 0xA0, 0x03, \r\n    0x09, 0x04, 0xA0, 0x03, 0x0E, 0x00, 0x00, 0x0A, 0x08, 0x10, 0xA0, 0xE1, 0xFF, 0x00, 0xA0, 0xE3, \r\n    0x09, 0xC4, 0xA0, 0xE3, 0xB0, 0x30, 0xDC, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, \r\n    0x01, 0x00, 0x40, 0xE2, 0x43, 0x24, 0xA0, 0xE1, 0x01, 0x00, 0x70, 0xE3, 0x01, 0x20, 0xC1, 0xE5, \r\n    0x00, 0x30, 0xC1, 0xE5, 0x02, 0x10, 0x81, 0xE2, 0xF5, 0xFF, 0xFF, 0x1A, 0x02, 0x8C, 0x88, 0xE2, \r\n    0xCD, 0xFF, 0xFF, 0xEA, 0x01, 0x20, 0x42, 0xE2, 0xB0, 0x30, 0xD0, 0xE1, 0x01, 0x00, 0x72, 0xE3, \r\n    0xB2, 0x30, 0xC1, 0xE0, 0xFA, 0xFF, 0xFF, 0x1A, 0x02, 0xBC, 0x8B, 0xE2, 0xC6, 0xFF, 0xFF, 0xEA, \r\n    0x00, 0x00, 0xA0, 0xE3, 0x10, 0xD0, 0x8D, 0xE2, 0xF0, 0x4B, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, \r\n    0x09, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0x0C, 0x30, 0x8D, 0xE5, 0x9C, 0xFF, 0xFF, 0xEA, \r\n    0x01, 0x00, 0xA0, 0xE3, 0xF6, 0xFF, 0xFF, 0xEA, 0xF0, 0x4B, 0x2D, 0xE9, 0x09, 0x34, 0xA0, 0xE3, \r\n    0x0E, 0x38, 0x83, 0xE2, 0xB0, 0xC0, 0xD3, 0xE1, 0x80, 0x00, 0x1C, 0xE3, 0x10, 0xD0, 0x4D, 0xE2, \r\n    0x01, 0x90, 0xA0, 0xE1, 0x02, 0xE0, 0xA0, 0xE1, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0xC0, 0xA0, 0xE3, \r\n    0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x5C, 0xE1, 0x08, 0x00, 0x00, 0x0A, 0x09, 0x34, 0xA0, 0xE3, \r\n    0x0E, 0x38, 0x83, 0xE2, 0xB0, 0x20, 0xD3, 0xE1, 0x26, 0x17, 0xA0, 0xE3, 0x96, 0x1C, 0x81, 0xE2, \r\n    0x80, 0x00, 0x12, 0xE3, 0x01, 0xC0, 0x8C, 0xE2, 0x80, 0x10, 0x81, 0xE2, 0xF4, 0xFF, 0xFF, 0x1A, \r\n    0x26, 0xC5, 0xA0, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, 0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x30, 0x13, 0xE2, \r\n    0x26, 0x17, 0xA0, 0x03, 0x96, 0x1C, 0x81, 0x02, 0x03, 0x20, 0xA0, 0x01, 0x80, 0x10, 0x81, 0x02, \r\n    0x02, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, 0x65, 0x00, 0x00, 0x0A, \r\n    0xB0, 0x30, 0xDC, 0xE1, 0x50, 0x00, 0x13, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF9, 0xFF, 0xFF, 0x0A, \r\n    0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, \r\n    0x5C, 0x00, 0x00, 0xCA, 0xFF, 0x00, 0x59, 0xE3, 0x00, 0x30, 0xA0, 0x83, 0x0C, 0x30, 0x8D, 0x85, \r\n    0x5C, 0x00, 0x00, 0x9A, 0x00, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, \r\n    0x09, 0x54, 0xA0, 0xE3, 0x04, 0x30, 0x8D, 0xE5, 0x0C, 0x30, 0x9D, 0xE5, 0x20, 0x4C, 0xA0, 0xE1, \r\n    0x0E, 0xB0, 0xA0, 0xE1, 0x05, 0x60, 0xA0, 0xE1, 0x20, 0x74, 0xA0, 0xE1, 0x05, 0x20, 0xA0, 0xE1, \r\n    0x20, 0x18, 0xA0, 0xE1, 0x05, 0xC0, 0xA0, 0xE1, 0x05, 0x00, 0xA0, 0xE1, 0x05, 0xE0, 0xA0, 0xE1, \r\n    0x01, 0x57, 0x85, 0xE2, 0xB0, 0x30, 0xC5, 0xE1, 0x04, 0x30, 0x9D, 0xE5, 0x0F, 0x40, 0x04, 0xE2, \r\n    0x06, 0x68, 0x86, 0xE2, 0xB0, 0x30, 0xC6, 0xE1, 0xFF, 0x70, 0x07, 0xE2, 0x02, 0x27, 0x82, 0xE2, \r\n    0xFF, 0x10, 0x01, 0xE2, 0x0A, 0x08, 0x80, 0xE2, 0xE0, 0x40, 0x84, 0xE3, 0x03, 0xC7, 0x8C, 0xE2, \r\n    0x0E, 0xE8, 0x8E, 0xE2, 0x30, 0x30, 0xA0, 0xE3, 0xB0, 0x70, 0xC2, 0xE1, 0xB0, 0x10, 0xC0, 0xE1, \r\n    0xB0, 0x40, 0xCC, 0xE1, 0xB0, 0x30, 0xCE, 0xE1, 0x0B, 0x80, 0xA0, 0xE1, 0x01, 0x90, 0x59, 0xE2, \r\n    0x3C, 0x00, 0x00, 0x3A, 0x26, 0x25, 0xA0, 0xE3, 0x03, 0x27, 0x82, 0xE2, 0xB0, 0x30, 0xD2, 0xE1, \r\n    0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, 0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, \r\n    0x26, 0x17, 0xA0, 0x13, 0x96, 0x1C, 0x81, 0x12, 0x02, 0x00, 0xA0, 0x11, 0x80, 0x10, 0x81, 0x12, \r\n    0x00, 0x20, 0xA0, 0x13, 0x02, 0x00, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x52, 0xE1, \r\n    0x24, 0x00, 0x00, 0x0A, 0xB0, 0x30, 0xD0, 0xE1, 0x03, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, \r\n    0xFF, 0x30, 0x03, 0xE2, 0x58, 0x00, 0x53, 0xE3, 0x01, 0x20, 0x82, 0xE2, 0xF6, 0xFF, 0xFF, 0x1A, \r\n    0x26, 0x37, 0xA0, 0xE3, 0x96, 0x3C, 0x83, 0xE2, 0x7F, 0x30, 0x83, 0xE2, 0x03, 0x00, 0x52, 0xE1, \r\n    0x18, 0x00, 0x00, 0xCA, 0x01, 0x00, 0x18, 0xE3, 0x0B, 0x10, 0xA0, 0x01, 0xFF, 0x20, 0xA0, 0x03, \r\n    0x09, 0x04, 0xA0, 0x03, 0x0C, 0x00, 0x00, 0x0A, 0x08, 0x10, 0xA0, 0xE1, 0xFF, 0x00, 0xA0, 0xE3, \r\n    0x09, 0xC4, 0xA0, 0xE3, 0x00, 0x30, 0xD1, 0xE5, 0x01, 0x20, 0xD1, 0xE5, 0x01, 0x00, 0x40, 0xE2, \r\n    0x02, 0x34, 0x83, 0xE1, 0x01, 0x00, 0x70, 0xE3, 0xB0, 0x30, 0xCC, 0xE1, 0x02, 0x10, 0x81, 0xE2, \r\n    0xF7, 0xFF, 0xFF, 0x1A, 0x02, 0x8C, 0x88, 0xE2, 0xCF, 0xFF, 0xFF, 0xEA, 0x01, 0x20, 0x42, 0xE2, \r\n    0xB2, 0x30, 0xD1, 0xE0, 0x01, 0x00, 0x72, 0xE3, 0xB0, 0x30, 0xC0, 0xE1, 0xFA, 0xFF, 0xFF, 0x1A, \r\n    0x02, 0xBC, 0x8B, 0xE2, 0xC8, 0xFF, 0xFF, 0xEA, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0xD0, 0x8D, 0xE2, \r\n    0xF0, 0x4B, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x09, 0x38, 0xA0, 0xE1, 0x23, 0x38, 0xA0, 0xE1, \r\n    0x0C, 0x30, 0x8D, 0xE5, 0x9E, 0xFF, 0xFF, 0xEA, 0x01, 0x00, 0xA0, 0xE3, 0xF6, 0xFF, 0xFF, 0xEA, \r\n    0x04, 0xE0, 0x2D, 0xE5, 0x04, 0xD0, 0x4D, 0xE2, 0xAA, 0xFE, 0xFF, 0xEB, 0x04, 0xD0, 0x8D, 0xE2, \r\n    0x04, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x0D, 0xC0, 0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, \r\n    0x04, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, \r\n    0xDC, 0x00, 0x80, 0xBF, 0x98, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, \r\n}; //unsigned char mpcf_dldi[1876]\r\n\nbool tryPatch(void* data, size_t size)\n{\n\t// Find the DSDI reserved space in the file\n\taddr_t patchOffset = quickFind ((data_t*)data, dldiMagicString, size, sizeof(dldiMagicString)/sizeof(char));\n\n\t//no DLDI section\n\tif (patchOffset < 0)\n\t\treturn false;\n\n\tdata_t *pDH = mpcf_dldi;\n\tdata_t *pAH = (data_t*)data + patchOffset;\n\n\tif (pDH[DO_driverSize] > pAH[DO_allocatedSpace]) {\n\t\tprintf (\"Not enough space for patch. Available %d bytes, need %d bytes\\n\", ( 1 << pAH[DO_allocatedSpace]), ( 1 << pDH[DO_driverSize]) );\n\t\treturn false;\n\t}\n\n\tif(memcmp(&pAH[DO_friendlyName],\"Default (No interface)\",22))\n\t{\n\t\tprintf(\"Would have been a candidate for auto-patch DLDI, but there was already a patch installed.\");\n\t\treturn false;\n\t}\n\n\t//----should be able to patch OK-----\n\n\taddr_t memOffset;\t\t\t// Offset of DLDI after the file is loaded into memory\n\taddr_t relocationOffset;\t// Value added to all offsets within the patch to fix it properly\n\taddr_t ddmemOffset;\t\t\t// Original offset used in the DLDI file\n\taddr_t ddmemStart;\t\t\t// Start of range that offsets can be in the DLDI file\n\taddr_t ddmemEnd;\t\t\t// End of range that offsets can be in the DLDI file\n\taddr_t ddmemSize;\t\t\t// Size of range that offsets can be in the DLDI file\n\n\taddr_t addrIter;\n\n\n\tmemOffset = readAddr (pAH, DO_text_start);\n\tif (memOffset == 0) {\n\t\t\tmemOffset = readAddr (pAH, DO_startup) - DO_code;\n\t}\n\tddmemOffset = readAddr (pDH, DO_text_start);\n\trelocationOffset = memOffset - ddmemOffset;\n\n\tprintf (\"AUTO-PATCHING DLDI to MPCF! Lucky you!\\n\\n\");\n\tprintf (\"Old driver:          %s\\n\", &pAH[DO_friendlyName]);\n\tprintf (\"New driver:          %s\\n\", &pDH[DO_friendlyName]);\n\tprintf (\"\\n\");\n\tprintf (\"Position in file:    0x%08X\\n\", patchOffset);\n\tprintf (\"Position in memory:  0x%08X\\n\", memOffset);\n\tprintf (\"Patch base address:  0x%08X\\n\", ddmemOffset);\n\tprintf (\"Relocation offset:   0x%08X\\n\", relocationOffset);\n\tprintf (\"\\n\");\n\n\tddmemStart = readAddr (pDH, DO_text_start);\n\tddmemSize = (1 << pDH[DO_driverSize]);\n\tddmemEnd = ddmemStart + ddmemSize;\n\n\t// Remember how much space is actually reserved\n\tpDH[DO_allocatedSpace] = pAH[DO_allocatedSpace];\n\t// Copy the DLDI patch into the application\n\tmemcpy (pAH, pDH, sizeof(mpcf_dldi));\n\n\t// Fix the section pointers in the header\n\twriteAddr (pAH, DO_text_start, readAddr (pAH, DO_text_start) + relocationOffset);\n\twriteAddr (pAH, DO_data_end, readAddr (pAH, DO_data_end) + relocationOffset);\n\twriteAddr (pAH, DO_glue_start, readAddr (pAH, DO_glue_start) + relocationOffset);\n\twriteAddr (pAH, DO_glue_end, readAddr (pAH, DO_glue_end) + relocationOffset);\n\twriteAddr (pAH, DO_got_start, readAddr (pAH, DO_got_start) + relocationOffset);\n\twriteAddr (pAH, DO_got_end, readAddr (pAH, DO_got_end) + relocationOffset);\n\twriteAddr (pAH, DO_bss_start, readAddr (pAH, DO_bss_start) + relocationOffset);\n\twriteAddr (pAH, DO_bss_end, readAddr (pAH, DO_bss_end) + relocationOffset);\n\t// Fix the function pointers in the header\n\twriteAddr (pAH, DO_startup, readAddr (pAH, DO_startup) + relocationOffset);\n\twriteAddr (pAH, DO_isInserted, readAddr (pAH, DO_isInserted) + relocationOffset);\n\twriteAddr (pAH, DO_readSectors, readAddr (pAH, DO_readSectors) + relocationOffset);\n\twriteAddr (pAH, DO_writeSectors, readAddr (pAH, DO_writeSectors) + relocationOffset);\n\twriteAddr (pAH, DO_clearStatus, readAddr (pAH, DO_clearStatus) + relocationOffset);\n\twriteAddr (pAH, DO_shutdown, readAddr (pAH, DO_shutdown) + relocationOffset);\n\n\tif (pDH[DO_fixSections] & FIX_ALL) { \n\t\t// Search through and fix pointers within the data section of the file\n\t\tfor (addrIter = (readAddr(pDH, DO_text_start) - ddmemStart); addrIter < (readAddr(pDH, DO_data_end) - ddmemStart); addrIter++) {\n\t\t\tif ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) {\n\t\t\t\twriteAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pDH[DO_fixSections] & FIX_GLUE) { \n\t\t// Search through and fix pointers within the glue section of the file\n\t\tfor (addrIter = (readAddr(pDH, DO_glue_start) - ddmemStart); addrIter < (readAddr(pDH, DO_glue_end) - ddmemStart); addrIter++) {\n\t\t\tif ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) {\n\t\t\t\twriteAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pDH[DO_fixSections] & FIX_GOT) { \n\t\t// Search through and fix pointers within the Global Offset Table section of the file\n\t\tfor (addrIter = (readAddr(pDH, DO_got_start) - ddmemStart); addrIter < (readAddr(pDH, DO_got_end) - ddmemStart); addrIter++) {\n\t\t\tif ((ddmemStart <= readAddr(pAH, addrIter)) && (readAddr(pAH, addrIter) < ddmemEnd)) {\n\t\t\t\twriteAddr (pAH, addrIter, readAddr(pAH, addrIter) + relocationOffset);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pDH[DO_fixSections] & FIX_BSS) { \n\t\t// Initialise the BSS to 0\n\t\tmemset (&pAH[readAddr(pDH, DO_bss_start) - ddmemStart] , 0, readAddr(pDH, DO_bss_end) - readAddr(pDH, DO_bss_start));\n\t}\n\n\treturn true;\n}\n\n} //namespace DLDI\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/emufat.cpp",
    "content": "/*\r\n\tCopyright 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n//based on Arduino SdFat Library ( http://code.google.com/p/sdfatlib/ )\r\n//Copyright (C) 2009 by William Greiman\r\n\r\n//based on mkdosfs - utility to create FAT/MS-DOS filesystems\n//Copyright (C) 1991 Linus Torvalds <torvalds@klaava.helsinki.fi>\n//Copyright (C) 1992-1993 Remy Card <card@masi.ibp.fr>\n//Copyright (C) 1993-1994 David Hudson <dave@humbug.demon.co.uk>\n//Copyright (C) 1998 H. Peter Anvin <hpa@zytor.com>\n//Copyright (C) 1998-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>\r\n\r\n#include \"emufat.h\"\r\n#include <ctype.h>\r\n#include <wchar.h>\r\n#include <wctype.h>\r\n#include <string.h>\r\n\r\n\r\n#define LE16(x) (x)\r\n#define LE32(x) (x)\r\n\r\n\r\n#define MAX_CLUST_12\t((1 << 12) - 16)\r\n#define MAX_CLUST_16\t((1 << 16) - 16)\r\n#define MIN_CLUST_32    65529\r\n/* M$ says the high 4 bits of a FAT32 FAT entry are reserved and don't belong\r\n* to the cluster number. So the max. cluster# is based on 2^28 */\r\n#define MAX_CLUST_32\t((1 << 28) - 16)\r\n#define FAT12_THRESHOLD\t4085\r\n#define MSDOS_EXT_SIGN 0x29\t/* extended boot sector signature */\r\n#define MSDOS_FAT12_SIGN \"FAT12   \"\t/* FAT12 filesystem signature */\r\n#define MSDOS_FAT16_SIGN \"FAT16   \"\t/* FAT16 filesystem signature */\r\n#define MSDOS_FAT32_SIGN \"FAT32   \"\t/* FAT32 filesystem signature */\r\nstatic const int sector_size = 512;\r\n#define BLOCK_SIZE   512\r\n#define HARD_SECTOR_SIZE   512\r\n#define SECTORS_PER_BLOCK ( BLOCK_SIZE / HARD_SECTOR_SIZE )\r\n#define FAT_EOF      (0x0ffffff8)\r\n#define BOOT_SIGN 0xAA55\t/* Boot sector magic number */\r\n\r\nstruct __PACKED  fat32_fsinfo {\r\n\tu32\t\treserved1;\t/* Nothing as far as I can tell */\r\n\tu32\t\tsignature;\t/* 0x61417272L */\r\n\tu32\t\tfree_clusters;\t/* Free cluster count.  -1 if unknown */\r\n\tu32\t\tnext_cluster;\t/* Most recently allocated cluster.\r\n\t\t\t\t\t\t\t\t* Unused under Linux. */\r\n\tu32\t\treserved2[4];\r\n};\r\n\r\n//see mkdosfs for the disassembly\r\nstatic const u8 mkdosfs_bootcode_fat32[420] =\r\n{\r\n    0x0E, 0x1F, 0xBE, 0x77, 0x7C, 0xAC, 0x22, 0xC0, 0x74, 0x0B, 0x56, 0xB4, 0x0E, 0xBB, 0x07, 0x00, \r\n    0xCD, 0x10, 0x5E, 0xEB, 0xF0, 0x32, 0xE4, 0xCD, 0x16, 0xCD, 0x19, 0xEB, 0xFE, 0x54, 0x68, 0x69, \r\n    0x73, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, \r\n    0x62, 0x6C, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6B, 0x2E, 0x20, 0x20, 0x50, 0x6C, 0x65, 0x61, 0x73, \r\n    0x65, 0x20, 0x69, 0x6E, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6F, 0x6F, 0x74, 0x61, \r\n    0x62, 0x6C, 0x65, 0x20, 0x66, 0x6C, 0x6F, 0x70, 0x70, 0x79, 0x20, 0x61, 0x6E, 0x64, 0x0D, 0x0A, \r\n    0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x74, 0x6F, \r\n    0x20, 0x74, 0x72, 0x79, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6E, 0x20, 0x2E, 0x2E, 0x2E, 0x20, 0x0D, \r\n    0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n    0x00, 0x00, 0x00, 0x00\r\n};\r\n\r\n\r\n\r\nEmuFat::EmuFat(const char* fname, bool readonly)\r\n\t: m_readonly(readonly)\r\n\t, m_owns(true)\r\n{\r\n\tm_pFile = new EMUFILE_FILE(fname,readonly?\"rb\":\"rb+\");\r\n}\r\n\r\nEmuFat::EmuFat()\r\n\t: m_readonly(false)\r\n\t, m_owns(true)\r\n{\r\n\tm_pFile = new EMUFILE_MEMORY();\r\n}\r\n\r\nEmuFat::EmuFat(EMUFILE* fileNotToDelete)\r\n\t: m_pFile(fileNotToDelete)\r\n\t, m_owns(false)\r\n\t, m_readonly(false)\r\n{\r\n}\r\n\r\nEmuFat::~EmuFat()\r\n{\r\n\tcacheFlush();\r\n\tif(m_owns)\r\n\t\tdelete m_pFile;\r\n}\r\n\r\nu8 EmuFat::cacheRawBlock(u32 blockNumber, u8 action)\r\n{\r\n  if (cache_.cacheBlockNumber_ != blockNumber) {\r\n    if (!cacheFlush()) return false;\r\n    if (!readBlock(blockNumber, cache_.cacheBuffer_.data)) return false;\r\n    cache_.cacheBlockNumber_ = blockNumber;\r\n  }\r\n  cache_.cacheDirty_ |= action;\r\n  return true;\r\n}\r\n\r\nu8 EmuFat::cacheZeroBlock(u32 blockNumber)\r\n{\r\n  if (!cacheFlush()) return false;\r\n\r\n  // loop take less flash than memset(cacheBuffer_.data, 0, 512);\r\n  for (u16 i = 0; i < 512; i++) {\r\n    cache_.cacheBuffer_.data[i] = 0;\r\n  }\r\n  cache_.cacheBlockNumber_ = blockNumber;\r\n  cacheSetDirty();\r\n  return true;\r\n}\r\n\r\nvoid EmuFat::cacheReset()\r\n{\r\n\treconstruct(&cache_);\r\n}\r\n\r\nu8 EmuFat::cacheFlush() {\r\n  if (cache_.cacheDirty_) {\r\n    if (!writeBlock(cache_.cacheBlockNumber_, cache_.cacheBuffer_.data)) {\r\n      return false;\r\n    }\r\n    // mirror FAT tables\r\n    if (cache_.cacheMirrorBlock_) {\r\n      if (!writeBlock(cache_.cacheMirrorBlock_, cache_.cacheBuffer_.data)) {\r\n        return false;\r\n      }\r\n      cache_.cacheMirrorBlock_ = 0;\r\n    }\r\n    cache_.cacheDirty_ = 0;\r\n  }\r\n  return true;\r\n}\r\n\r\nu8 EmuFat::readBlock(u32 block, u8* dst)\r\n{\r\n  m_pFile->fseek(block*512,SEEK_SET);\r\n  m_pFile->fread(dst,512);\r\n  if(m_pFile->fail())\r\n  {\r\n\t  m_pFile->unfail();\r\n\t  return 0;\r\n  }\r\n  return 1;\r\n}\r\n\r\nu8 EmuFat::writeBlock(u32 blockNumber, const u8* src)\r\n{\r\n  m_pFile->fseek(blockNumber*512,SEEK_SET);\r\n  m_pFile->fwrite(src,512);\r\n  if(m_pFile->fail())\r\n  {\r\n\t  m_pFile->unfail();\r\n\t  return 0;\r\n  }\r\n  return 1;\r\n}\r\n\r\nu8 EmuFat::readData(u32 block, u16 offset, u16 count, u8* dst)\r\n{\r\n\tm_pFile->fseek(block*512+offset,SEEK_SET);\r\n\tm_pFile->fread(dst,count);\r\n\tif(m_pFile->fail())\r\n\t{\r\n\t  m_pFile->unfail();\r\n\t  return 0;\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\nvoid EmuFat::truncate(u32 size)\r\n{\r\n\tm_pFile->truncate(size);\r\n}\r\n\r\n//-------------------------------------------------------------------------------------\r\n\r\ninline int cdiv (int a, int b)\r\n{\r\n  return (a + b - 1) / b;\r\n}\r\n\r\nbool calculateClusterSize(TFat32BootSector* bsp, u32 avail_sectors, u32& cluster_count, u32& fat_length, \tint size_fat_by_user, int &size_fat)\r\n{\r\n\tTFat32BootSector &bs = *bsp;\r\n\tconst u32 fatdata = avail_sectors;\r\n\tint maxclustsize = bsp->sectorsPerCluster;\r\n\r\n\t\tu32 fatlength12, fatlength16, fatlength32;\r\n\t\tu32 maxclust12, maxclust16, maxclust32;\r\n\t\tu32 clust12, clust16, clust32;\r\ndo {\r\n\t\t\t\tprintf( \"Trying with %d sectors/cluster:\\n\", bs.sectorsPerCluster );\r\n\r\n\t\t\t/* The factor 2 below avoids cut-off errors for nr_fats == 1.\r\n\t\t\t* The \"nr_fats*3\" is for the reserved first two FAT entries */\r\n\t\t\tclust12 = 2*((u64) fatdata *sector_size + bs.fatCount*3) /\r\n\t\t\t\t(2*(int) bs.sectorsPerCluster * sector_size + bs.fatCount*3);\r\n\t\t\tfatlength12 = cdiv (((clust12+2) * 3 + 1) >> 1, sector_size);\r\n\t\t\t/* Need to recalculate number of clusters, since the unused parts of the\r\n\t\t\t* FATS and data area together could make up space for an additional,\r\n\t\t\t* not really present cluster. */\r\n\t\t\tclust12 = (fatdata - bs.fatCount*fatlength12)/bs.sectorsPerCluster;\r\n\t\t\tmaxclust12 = (fatlength12 * 2 * sector_size) / 3;\r\n\t\t\tif (maxclust12 > MAX_CLUST_12)\r\n\t\t\t\tmaxclust12 = MAX_CLUST_12;\r\n\t\t\t\tprintf( \"FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\\n\",\r\n\t\t\t\tclust12, fatlength12, maxclust12, MAX_CLUST_12 );\r\n\t\t\tif (clust12 > maxclust12-2) {\r\n\t\t\t\tclust12 = 0;\r\n\t\t\t\t\tprintf( \"FAT12: too much clusters\\n\" );\r\n\t\t\t}\r\n\r\n\t\t\tclust16 = ((u64) fatdata *sector_size + bs.fatCount*4) /\r\n\t\t\t\t((int) bs.sectorsPerCluster * sector_size + bs.fatCount*2);\r\n\t\t\tfatlength16 = cdiv ((clust16+2) * 2, sector_size);\r\n\t\t\t/* Need to recalculate number of clusters, since the unused parts of the\r\n\t\t\t* FATS and data area together could make up space for an additional,\r\n\t\t\t* not really present cluster. */\r\n\t\t\tclust16 = (fatdata - bs.fatCount*fatlength16)/bs.sectorsPerCluster;\r\n\t\t\tmaxclust16 = (fatlength16 * sector_size) / 2;\r\n\t\t\tif (maxclust16 > MAX_CLUST_16)\r\n\t\t\t\tmaxclust16 = MAX_CLUST_16;\r\n\t\t\tprintf( \"FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\\n\",\r\n\t\t\t\tclust16, fatlength16, maxclust16, MAX_CLUST_16 );\r\n\t\t\tif (clust16 > maxclust16-2) {\r\n\t\t\t\tprintf( \"FAT16: too much clusters\\n\" );\r\n\t\t\t\tclust16 = 0;\r\n\t\t\t}\r\n\t\t\t/* The < 4078 avoids that the filesystem will be misdetected as having a\r\n\t\t\t* 12 bit FAT. */\r\n\t\t\tif (clust16 < FAT12_THRESHOLD && !(size_fat_by_user && size_fat == 16)) {\r\n\t\t\t\tprintf( clust16 < FAT12_THRESHOLD ?\r\n\t\t\t\t\t\"FAT16: would be misdetected as FAT12\\n\" :\r\n\t\t\t\t\"FAT16: too much clusters\\n\" );\r\n\t\t\t\tclust16 = 0;\r\n\t\t\t}\r\n\r\n\t\t\tclust32 = ((u64) fatdata *sector_size + bs.fatCount*8) /\r\n\t\t\t\t((int) bs.sectorsPerCluster * sector_size + bs.fatCount*4);\r\n\t\t\tfatlength32 = cdiv ((clust32+2) * 4, sector_size);\r\n\t\t\t/* Need to recalculate number of clusters, since the unused parts of the\r\n\t\t\t* FATS and data area together could make up space for an additional,\r\n\t\t\t* not really present cluster. */\r\n\t\t\tclust32 = (fatdata - bs.fatCount*fatlength32)/bs.sectorsPerCluster;\r\n\t\t\tmaxclust32 = (fatlength32 * sector_size) / 4;\r\n\t\t\tif (maxclust32 > MAX_CLUST_32)\r\n\t\t\t\tmaxclust32 = MAX_CLUST_32;\r\n\t\t\tif (clust32 && clust32 < MIN_CLUST_32 && !(size_fat_by_user && size_fat == 32)) {\r\n\t\t\t\tclust32 = 0;\r\n\t\t\t\t\tprintf( \"FAT32: not enough clusters (%d)\\n\", MIN_CLUST_32);\r\n\t\t\t}\r\n\t\t\t\tprintf( \"FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\\n\",\r\n\t\t\t\tclust32, fatlength32, maxclust32, MAX_CLUST_32 );\r\n\t\t\tif (clust32 > maxclust32) {\r\n\t\t\t\tclust32 = 0;\r\n\t\t\t\t\tprintf( \"FAT32: too much clusters\\n\" );\r\n\t\t\t}\r\n\r\n\t\t\tif ((clust12 && (size_fat == 0 || size_fat == 12)) ||\r\n\t\t\t\t(clust16 && (size_fat == 0 || size_fat == 16)) ||\r\n\t\t\t\t(clust32 && size_fat == 32))\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tbs.sectorsPerCluster <<= 1;\r\n\t\t} while (bs.sectorsPerCluster && bs.sectorsPerCluster <= maxclustsize);\r\n\r\n\r\n\t/* Use the optimal FAT size if not specified;\r\n\t* FAT32 is (not yet) choosen automatically */\r\n\tif (!size_fat) {\r\n\t\tsize_fat = (clust16 > clust12) ? 16 : 12;\r\n\t\tprintf( \"Choosing %d bits for FAT\\n\", size_fat );\r\n\t}\r\n\r\n\tswitch (size_fat) {\r\n\t\tcase 12:\r\n\t\t\tcluster_count = clust12;\r\n\t\t\tfat_length = fatlength12;\r\n\t\t\tbs.sectorsPerFat16 = LE16(fatlength12);\r\n\t\t\tbreak;\r\n\t\tcase 16:\r\n\tif (clust16 < FAT12_THRESHOLD) {\r\n\t\tif (size_fat_by_user) {\r\n\t\t\tprintf(\"WARNING: Not enough clusters for a \"\r\n\t\t\t\t\"16 bit FAT! The filesystem will be\\n\"\r\n\t\t\t\t\"misinterpreted as having a 12 bit FAT without \"\r\n\t\t\t\t\"mount option \\\"fat=16\\\".\\n\" );\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tprintf(\"This filesystem has an unfortunate size. \"\r\n\t\t\t\t\"A 12 bit FAT cannot provide\\n\"\r\n\t\t\t\t\"enough clusters, but a 16 bit FAT takes up a little \"\r\n\t\t\t\t\"bit more space so that\\n\"\r\n\t\t\t\t\"the total number of clusters becomes less than the \"\r\n\t\t\t\t\"threshold value for\\n\"\r\n\t\t\t\t\"distinction between 12 and 16 bit FATs.\\n\" );\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\tcluster_count = clust16;\r\n\tfat_length = fatlength16;\r\n\tbs.sectorsPerFat16 = LE16(fatlength16);\r\n\tbreak;\r\n\r\ncase 32:\r\n\tif (clust32 < MIN_CLUST_32)\r\n\t\tprintf(\"WARNING: Not enough clusters for a 32 bit FAT!\\n\");\r\n\tcluster_count = clust32;\r\n\tfat_length = fatlength32;\r\n\tbs.sectorsPerFat16 = LE16(0);\r\n\tbs.fat32.sectorsPerFat32 = LE32(fatlength32);\r\n\tbreak;\r\n\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\nstatic void mark_FAT_cluster (int size_fat, u8* fat, int cluster, unsigned int value)\r\n{\r\n\tswitch( size_fat ) {\r\ncase 12:\r\n\tvalue &= 0x0fff;\r\n\tif (((cluster * 3) & 0x1) == 0)\r\n\t{\r\n\t\tfat[3 * cluster / 2] = (unsigned char) (value & 0x00ff);\r\n\t\tfat[(3 * cluster / 2) + 1] = (unsigned char) ((fat[(3 * cluster / 2) + 1] & 0x00f0)\r\n\t\t\t| ((value & 0x0f00) >> 8));\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfat[3 * cluster / 2] = (unsigned char) ((fat[3 * cluster / 2] & 0x000f) | ((value & 0x000f) << 4));\r\n\t\tfat[(3 * cluster / 2) + 1] = (unsigned char) ((value & 0x0ff0) >> 4);\r\n\t}\r\n\tbreak;\r\n\r\ncase 16:\r\n\tvalue &= 0xffff;\r\n\tfat[2 * cluster] = (unsigned char) (value & 0x00ff);\r\n\tfat[(2 * cluster) + 1] = (unsigned char) (value >> 8);\r\n\tbreak;\r\n\r\ncase 32:\r\n\tvalue &= 0xfffffff;\r\n\tfat[4 * cluster] =       (unsigned char)  (value & 0x000000ff);\r\n\tfat[(4 * cluster) + 1] = (unsigned char) ((value & 0x0000ff00) >> 8);\r\n\tfat[(4 * cluster) + 2] = (unsigned char) ((value & 0x00ff0000) >> 16);\r\n\tfat[(4 * cluster) + 3] = (unsigned char) ((value & 0xff000000) >> 24);\r\n\tbreak;\r\n\t}\r\n}\r\n\r\n//use 36M as minimum fat32 size (or else mkdosfs complains)\r\n//this function assumes fat32. it could be redone to be intelligent by making another pass through mkdosfs and analyzing it again\r\n//but we onnly targeted fat32 our first time through\r\nbool EmuFatVolume::formatNew(u32 sectors)\r\n{\r\n\tu32 volumeStartBlock = 0;\r\n\tTFat32BootSector bsrec;\r\n\tmemset(&bsrec,0,sizeof(TFat32BootSector));\r\n\tTFat32BootSector *bs = &bsrec;\r\n\r\n\t//perform same analysis (we guess) as mkdosfs\r\n\r\n\t//\"fake values\"\r\n\tbs->sectorsPerTrack = 32;\r\n\tbs->headCount = 64;\r\n\t//def_hd_params:\r\n\tbs->mediaType = 0xF8;\r\n\tbs->rootDirEntryCount = LE16(512); //Default to 512 entries - N.B. this is overwritten later\r\n\tstatic const u32 BLOCK_SIZE_BITS = 9;\r\n\tconst u32 sz_mb = (sectors+(1<<(20-BLOCK_SIZE_BITS))-1) >> (20-BLOCK_SIZE_BITS);\r\n\tbs->sectorsPerCluster = \r\n\t\tsz_mb > 16*1024 ? 32 :\r\n\t\tsz_mb >  8*1024 ? 16 :\r\n\t\tsz_mb >     260 ?  8 :\r\n\t\t1;\r\n\t//(fat16 and fat12 would start at 4 sectors per cluster)\r\n\r\n\t memcpy (bs->oemName, \"mkdosfs\", 8);\r\n\t bs->rootDirEntryCount = 0; //Under FAT32, the root dir is in a cluster chain, and this is signalled by bs.dir_entries being 0\r\n\t bs->fat32.vi.volume_id = 0; //not generating a volume id.. just use 0 for determinism's sake\r\n\tmemcpy(bs->fat32.vi.volume_label,\"           \",11);\r\n\tbs->jmpToBootCode[0] = 0xEB;\r\n\tbs->jmpToBootCode[1] = 0x58; //this value is only for fat32 //Patch in the correct offset to the boot code\r\n\tbs->jmpToBootCode[2] = 0x90;\r\n\t\r\n\tmemcpy(bs->fat32.boot_code,mkdosfs_bootcode_fat32,420);\r\n\tbs->boot_sign[0] = 0x55;\r\n\tbs->boot_sign[1] = 0xAA;\r\n\r\n\tbs->reservedSectorCount = LE16(32);\r\n\tbs->fatCount = 2;\r\n\tbs->hiddenSectors = LE32(0);\r\n\r\n    u32 fatdata = sectors - cdiv (bs->rootDirEntryCount * 32, 512) - bs->reservedSectorCount;\r\n\r\n\tu32 cluster_count;\r\n\tu32 fat_length;\r\n\tint size_fat = 32;\r\n\tif(!calculateClusterSize(bs, fatdata, cluster_count, fat_length, 1, size_fat))\r\n\t\treturn false;\r\n\t//TODO - this function whacks values we set earlier. gross. either mkdosfs is sloppy or i dont understand it.\r\n\t//anyway, whack that dup code\r\n\tswitch(size_fat)\r\n\t{\r\n\tcase 12: memcpy(bs->oldfat.vi.fs_type, MSDOS_FAT12_SIGN, 8); break;\r\n\tcase 16: memcpy(bs->oldfat.vi.fs_type, MSDOS_FAT16_SIGN, 8); break;\r\n\tcase 32: memcpy(bs->fat32.vi.fs_type, MSDOS_FAT32_SIGN, 8); break;\r\n\t}\r\n\r\n\tbs->bytesPerSector = 512;\r\n\r\n\t//set up additional FAT32 fields\r\n\tbs->fat32.fat32Flags = LE16(0);\r\n\tbs->fat32.fat32Version = LE16(0);\r\n\tbs->fat32.fat32RootCluster = LE32(2);\r\n\tbs->fat32.fat32FSInfo = LE16(1);\r\n\tu32 backup_boot = (bs->reservedSectorCount>= 7) ? 6 : (bs->reservedSectorCount >= 2) ? bs->reservedSectorCount-1 : 0;\r\n\tprintf( \"Using sector %d as backup boot sector (0 = none)\\n\",backup_boot );\r\n\tbs->fat32.fat32BackBootBlock = LE16(backup_boot);\r\n\tmemset(bs->fat32.fat32Reserved,0,sizeof(bs->fat32.fat32Reserved));\r\n\r\n\tif(sectors>= 65536) {\r\n\t\tbs->totalSectors16 = LE16(0);\r\n\t\tbs->totalSectors32 = LE32(sectors);\r\n\t} else {\r\n\t\tbs->totalSectors16 = LE16(sectors);\r\n\t\tbs->totalSectors32 = LE32(0);\r\n\t}\r\n\r\n\tif (!cluster_count)\r\n\t{\r\n\t\t//if (sectors_per_cluster)\t/* If yes, die if we'd spec'd sectors per cluster */\r\n\t\t//\tdie (\"Too many clusters for file system - try more sectors per cluster\");\r\n\t\t//else\r\n\t\t\tprintf(\"Attempting to create a too large file system\");\r\n\t\t\treturn false;\r\n\t}\r\n\r\n\tu32 start_data_sector = (bs->reservedSectorCount + bs->fatCount * fat_length) * (sector_size/512);\r\n\tu32 start_data_block = (start_data_sector + SECTORS_PER_BLOCK - 1) / SECTORS_PER_BLOCK;\r\n\r\n\tif (sectors < start_data_block + 32)\t/* Arbitrary undersize file system! */\r\n\t{\r\n\t\tprintf(\"Too few blocks for viable file system\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\tbs->fat32.vi.ext_boot_sign = MSDOS_EXT_SIGN;\r\n\r\n\t//Make the file allocation tables!\r\n\tu8* fat = new u8[fat_length * sector_size];\r\n\tmemset( fat, 0, fat_length * sector_size );\r\n\tmark_FAT_cluster (size_fat, fat, 0, 0xffffffff);\t/* Initial fat entries */\r\n\tmark_FAT_cluster (size_fat, fat, 1, 0xffffffff);\r\n\tfat[0] = bs->mediaType;\t/* Put media type in first byte! */\r\n\tif (size_fat == 32) {\r\n\t\t/* Mark cluster 2 as EOF (used for root dir) */\r\n\t\tmark_FAT_cluster (size_fat, fat, 2, FAT_EOF);\r\n\t}\r\n\r\n\tu32 size_root_dir = (size_fat == 32) ? bs->sectorsPerCluster*sector_size :\r\n\t\tbs->rootDirEntryCount * sizeof (TDirectoryEntry);\r\n\t//u8* root_dir = new u8[size_root_dir];\r\n\t//memset(root_dir, 0, size_root_dir);\r\n\tu32 size_root_dir_in_sectors = size_root_dir/512;\r\n\r\n\r\n\tu8* info_sector = NULL;\r\n\tif (size_fat == 32) {\r\n\t\t/* For FAT32, create an info sector */\r\n\t\tfat32_fsinfo *info;\r\n\r\n\t\tinfo_sector = new u8[sector_size];\r\n\t\tmemset(info_sector, 0, sector_size);\r\n\t\t/* fsinfo structure is at offset 0x1e0 in info sector by observation */\r\n\t\tinfo = (fat32_fsinfo *)(info_sector + 0x1e0);\r\n\r\n\t\t/* Info sector magic */\r\n\t\tinfo_sector[0] = 'R';\r\n\t\tinfo_sector[1] = 'R';\r\n\t\tinfo_sector[2] = 'a';\r\n\t\tinfo_sector[3] = 'A';\r\n\r\n\t\t/* Magic for fsinfo structure */\r\n\t\tinfo->signature = LE32(0x61417272);\r\n\t\t/* We've allocated cluster 2 for the root dir. */\r\n\t\tinfo->free_clusters = LE32(cluster_count - 1);\r\n\t\tinfo->next_cluster = LE32(2);\r\n\r\n\t\t/* Info sector also must have boot sign */\r\n\t\t*(u16 *)(info_sector + 0x1fe) = LE16(BOOT_SIGN);\r\n\t}\r\n\r\n\t//-------------\r\n\r\n\t//write_tables()\r\n\tu8* blank_sector = new u8[512];\r\n\tmemset(blank_sector,0,512);\r\n\t\r\n\tdev_->cacheReset();\r\n\tdev_->truncate(0);\r\n\tdev_->truncate(sectors*512);\r\n\t/* clear all reserved sectors */\r\n\tfor(int i=0;i<bs->reservedSectorCount;i++)\r\n\t\tdev_->writeBlock(0,blank_sector);\r\n\t/* seek back to sector 0 and write the boot sector */\r\n\tdev_->writeBlock(0,(const u8*)bs);\r\n\t/* on FAT32, write the info sector and backup boot sector */\r\n\tif (size_fat == 32)\r\n\t{\r\n\t\tdev_->writeBlock(bs->fat32.fat32FSInfo,info_sector);\r\n\t\tif(bs->fat32.fat32BackBootBlock)\r\n\t\t\tdev_->writeBlock(bs->fat32.fat32BackBootBlock,(const u8*)bs);\r\n\t}\r\n\t/* seek to start of FATS and write them all */\r\n\tint ctr=bs->reservedSectorCount;\r\n\tfor (int i=0;i<bs->fatCount;i++)\r\n\t\tfor(int j=0;j<fat_length;j++,ctr++)\r\n\t\t\tdev_->writeBlock(ctr,fat+j*sector_size);\r\n\r\n\t/* Write the root directory directly after the last FAT. This is the root\r\n\t* dir area on FAT12/16, and the first cluster on FAT32. */\r\n\tfor(int i=0;i<size_root_dir_in_sectors;i++)\r\n\t\tdev_->writeBlock(ctr,blank_sector);\r\n\r\n\tdelete[] blank_sector;\r\n\tdelete[] info_sector;\r\n\tdelete[] fat;\r\n\r\n\treturn init(dev_,0);\r\n\r\n\t//return true;\r\n}\r\n\r\n//well, there are a lot of ways to format a disk. this is just a simple one.\r\n//it would be nice if someone who understood fat better could modify the root\r\n//directory setup to use reasonable code instead of magic arrays\r\nbool EmuFatVolume::format(u32 sectors)\r\n{\r\n\t//u32 volumeStartBlock = 0;\r\n\t//dev_->truncate(0);\r\n\t//dev_->truncate(sectors*512);\r\n\t//if (!dev_->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_WRITE)) return false;\r\n\t//memset(&dev_->cache_.cacheBuffer_,0,sizeof(dev_->cache_.cacheBuffer_));\r\n\t//TFat32BootSector* bs = &dev_->cache_.cacheBuffer_.fbs;\r\n\t//TBiosParmBlock* bpb = &bs->bpb;\r\n\r\n\t//bs->jmpToBootCode[0] = 0xEB;\r\n\t//bs->jmpToBootCode[1] = 0x3C;\r\n\t//bs->jmpToBootCode[2] = 0x90;\r\n\t//memcpy(bs->oemName,\"mkdosfs\",8);\r\n\t//bs->driveNumber = 0;\r\n\t//bs->reserved1 = 0;\r\n\t//bs->bootSignature = 0x29;\r\n\t//bs->volumeSerialNumber = 0;\r\n\t//memcpy(bs->volumeLabel,\"           \",11);\r\n\t//memcpy(bs->fileSystemType,\"FAT16   \",8);\r\n\t//memcpy(bs->bootCode,mkdosfs_bootcode,420);\r\n\t//bs->bootSectorSig0 = 0x55;\r\n\t//bs->bootSectorSig1 = 0xAA;\r\n\r\n\t//bpb->bytesPerSector = 512;\r\n\t//bpb->sectorsPerCluster = 4;\r\n\t//bpb->reservedSectorCount = 1;\r\n\t//bpb->fatCount = 2;\r\n\t//bpb->rootDirEntryCount = 512;\r\n\t//bpb->totalSectors16 = 0;\r\n\t//bpb->mediaType = 0xF8;\r\n\t//bpb->sectorsPerFat16 = 32;\r\n\t//bpb->sectorsPerTrack = 32;\r\n\t//bpb->headCount = 64;\r\n\t//bpb->hiddenSectors = 0;\r\n\t//bpb->totalSectors32 = sectors;\r\n\t//bpb->fat32Flags = 0xbe0d;\r\n\t//bpb->fat32Version = 0x20Fd;\r\n\t//bpb->fat32RootCluster = 0x20202020;\r\n\t//bpb->fat32FSInfo = 0x2020;\r\n\t//bpb->fat32BackBootBlock = 0x2020;\r\n\r\n\t//if(!dev_->cacheFlush())\r\n\t//\treturn false;\r\n\r\n\t//if (!dev_->cacheRawBlock(1, EmuFat::CACHE_FOR_WRITE)) return false;\r\n\r\n\t//static const u8 rootEntry[8] =\r\n\t//{\r\n\t//\t0xF8, 0xFF, 0xFF, 0xFF, \r\n\t//} ;\r\n\r\n\t//memcpy(dev_->cache_.cacheBuffer_.data,rootEntry,4);\r\n\r\n\t//if(!dev_->cacheFlush())\r\n\t//\treturn false;\r\n\r\n\t//if (!dev_->cacheRawBlock(33, EmuFat::CACHE_FOR_WRITE)) return false;\r\n\r\n\t//memcpy(dev_->cache_.cacheBuffer_.data,rootEntry,4);\r\n\r\n\t//if(!dev_->cacheFlush())\r\n\t//\treturn false;\r\n\r\n\t//return init(dev_,0);\r\n\r\n\treturn false;\r\n}\r\n\r\nbool EmuFatVolume::init(EmuFat* dev, u8 part) {\r\n  u32 volumeStartBlock = 0;\r\n  dev_ = dev;\r\n  // if part == 0 assume super floppy with FAT boot sector in block zero\r\n  // if part > 0 assume mbr volume with partition table\r\n  if (part) {\r\n    if (part > 4) return false;\r\n\tif (!dev->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_READ)) return false;\r\n    TPartitionRecord* p = &dev->cache_.cacheBuffer_.mbr.part[part-1];\r\n    if ((p->boot & 0X7F) !=0  ||\r\n      p->totalSectors < 100 ||\r\n      p->firstSector == 0) {\r\n      // not a valid partition\r\n      return false;\r\n    }\r\n    volumeStartBlock = p->firstSector;\r\n  }\r\n  if (!dev->cacheRawBlock(volumeStartBlock, EmuFat::CACHE_FOR_READ)) return false;\r\n  TFat32BootSector* bs = &dev->cache_.cacheBuffer_.fbs;\r\n  if (bs->bytesPerSector != 512 ||\r\n    bs->fatCount == 0 ||\r\n    bs->reservedSectorCount == 0 ||\r\n    bs->sectorsPerCluster == 0) {\r\n       // not valid FAT volume\r\n      return false;\r\n  }\r\n  fatCount_ = bs->fatCount;\r\n  blocksPerCluster_ = bs->sectorsPerCluster;\r\n\r\n  // determine shift that is same as multiply by blocksPerCluster_\r\n  clusterSizeShift_ = 0;\r\n  while (blocksPerCluster_ != (1 << clusterSizeShift_)) {\r\n    // error if not power of 2\r\n    if (clusterSizeShift_++ > 7) return false;\r\n  }\r\n  blocksPerFat_ = bs->sectorsPerFat16 ?\r\n                    bs->sectorsPerFat16 : bs->fat32.sectorsPerFat32;\r\n\r\n  fatStartBlock_ = volumeStartBlock + bs->reservedSectorCount;\r\n\r\n  // count for FAT16 zero for FAT32\r\n  rootDirEntryCount_ = bs->rootDirEntryCount;\r\n\r\n  // directory start for FAT16 dataStart for FAT32\r\n  rootDirStart_ = fatStartBlock_ + bs->fatCount * blocksPerFat_;\r\n\r\n  // data start for FAT16 and FAT32\r\n  dataStartBlock_ = rootDirStart_ + ((32 * bs->rootDirEntryCount + 511)/512);\r\n\r\n  // total blocks for FAT16 or FAT32\r\n  u32 totalBlocks = bs->totalSectors16 ?\r\n                           bs->totalSectors16 : bs->totalSectors32;\r\n  // total data blocks\r\n  clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock);\r\n\r\n  // divide by cluster size to get cluster count\r\n  clusterCount_ >>= clusterSizeShift_;\r\n\r\n  // FAT type is determined by cluster count\r\n  if (clusterCount_ < 4085) {\r\n    fatType_ = 12;\r\n  } else if (clusterCount_ < 65525) {\r\n    fatType_ = 16;\r\n  } else {\r\n    rootDirStart_ = bs->fat32.fat32RootCluster;\r\n    fatType_ = 32;\r\n  }\r\n  return true;\r\n}\r\n\r\nu8 EmuFatVolume::allocContiguous(u32 count, u32* curCluster) {\r\n  // start of group\r\n  u32 bgnCluster;\r\n\r\n  // flag to save place to start next search\r\n  u8 setStart;\r\n\r\n  // set search start cluster\r\n  if (*curCluster) {\r\n    // try to make file contiguous\r\n    bgnCluster = *curCluster + 1;\r\n\r\n    // don't save new start location\r\n    setStart = false;\r\n  } else {\r\n    // start at likely place for free cluster\r\n    bgnCluster = allocSearchStart_;\r\n\r\n    // save next search start if one cluster\r\n    setStart = 1 == count;\r\n  }\r\n  // end of group\r\n  u32 endCluster = bgnCluster;\r\n\r\n  // last cluster of FAT\r\n  u32 fatEnd = clusterCount_ + 1;\r\n\r\n  // search the FAT for free clusters\r\n  for (u32 n = 0;; n++, endCluster++) {\r\n    // can't find space checked all clusters\r\n    if (n >= clusterCount_) return false;\r\n\r\n    // past end - start from beginning of FAT\r\n    if (endCluster > fatEnd) {\r\n      bgnCluster = endCluster = 2;\r\n    }\r\n    u32 f;\r\n    if (!fatGet(endCluster, &f)) return false;\r\n\r\n    if (f != 0) {\r\n      // cluster in use try next cluster as bgnCluster\r\n      bgnCluster = endCluster + 1;\r\n    } else if ((endCluster - bgnCluster + 1) == count) {\r\n      // done - found space\r\n      break;\r\n    }\r\n  }\r\n  // mark end of chain\r\n  if (!fatPutEOC(endCluster)) return false;\r\n\r\n  // link clusters\r\n  while (endCluster > bgnCluster) {\r\n    if (!fatPut(endCluster - 1, endCluster)) return false;\r\n    endCluster--;\r\n  }\r\n  if (*curCluster != 0) {\r\n    // connect chains\r\n    if (!fatPut(*curCluster, bgnCluster)) return false;\r\n  }\r\n  // return first cluster number to caller\r\n  *curCluster = bgnCluster;\r\n\r\n  // remember possible next free cluster\r\n  if (setStart) allocSearchStart_ = bgnCluster + 1;\r\n\r\n  return true;\r\n}\r\n\r\nu8 EmuFatVolume::fatGet(u32 cluster, u32* value) const {\r\n  if (cluster > (clusterCount_ + 1)) return false;\r\n  u32 lba = fatStartBlock_;\r\n  lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7;\r\n  if (lba != dev_->cache_.cacheBlockNumber_) {\r\n\t  if (!dev_->cacheRawBlock(lba, EmuFat::CACHE_FOR_READ)) return false;\r\n  }\r\n  if (fatType_ == 16) {\r\n    *value = dev_->cache_.cacheBuffer_.fat16[cluster & 0XFF];\r\n  } else {\r\n    *value = dev_->cache_.cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK;\r\n  }\r\n  return true;\r\n}\r\n// Store a FAT entry\r\nu8 EmuFatVolume::fatPut(u32 cluster, u32 value) {\r\n  // error if reserved cluster\r\n  if (cluster < 2) return false;\r\n\r\n  // error if not in FAT\r\n  if (cluster > (clusterCount_ + 1)) return false;\r\n\r\n  // calculate block address for entry\r\n  u32 lba = fatStartBlock_;\r\n  lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7;\r\n\r\n  if (lba != dev_->cache_.cacheBlockNumber_) {\r\n\t  if (!dev_->cacheRawBlock(lba, EmuFat::CACHE_FOR_READ)) return false;\r\n  }\r\n  // store entry\r\n  if (fatType_ == 16) {\r\n    dev_->cache_.cacheBuffer_.fat16[cluster & 0xFF] = value;\r\n  } else {\r\n    dev_->cache_.cacheBuffer_.fat32[cluster & 0x7F] = value;\r\n  }\r\n  dev_->cacheSetDirty();\r\n\r\n  // mirror second FAT\r\n  if (fatCount_ > 1) dev_->cache_.cacheMirrorBlock_ = lba + blocksPerFat_;\r\n  return true;\r\n}\r\n\r\n// return the size in bytes of a cluster chain\r\nu8 EmuFatVolume::chainSize(u32 cluster, u32* size) const {\r\n  u32 s = 0;\r\n  do {\r\n    if (!fatGet(cluster, &cluster)) return false;\r\n    s += 512UL << clusterSizeShift_;\r\n  } while (!isEOC(cluster));\r\n  *size = s;\r\n  return true;\r\n}\r\n\r\n// free a cluster chain\r\nu8 EmuFatVolume::freeChain(u32 cluster) {\r\n  // clear free cluster location\r\n  allocSearchStart_ = 2;\r\n\r\n  do {\r\n    u32 next;\r\n    if (!fatGet(cluster, &next)) return false;\r\n\r\n    // free cluster\r\n    if (!fatPut(cluster, 0)) return false;\r\n\r\n    cluster = next;\r\n  } while (!isEOC(cluster));\r\n\r\n  return true;\r\n}\r\nu8 EmuFatVolume::readData(u32 block, u16 offset, u16 count, u8* dst) {\r\n     return dev_->readData(block, offset, count, dst);\r\n }\r\n\r\nu8 EmuFatVolume::writeBlock(u32 block, const u8* dst) {\r\n    return dev_->writeBlock(block, dst);\r\n  }\r\n\r\n//-----------------------------------------------------------------------------------\r\n//EmuFatFile:\r\n\r\n// add a cluster to a file\r\nu8 EmuFatFile::addCluster() {\r\n  if (!vol_->allocContiguous(1, &curCluster_)) return false;\r\n\r\n  // if first cluster of file link to directory entry\r\n  if (firstCluster_ == 0) {\r\n    firstCluster_ = curCluster_;\r\n    flags_ |= F_FILE_DIR_DIRTY;\r\n  }\r\n  return true;\r\n}\r\n\r\n\r\n// Add a cluster to a directory file and zero the cluster.\r\n// return with first block of cluster in the cache\r\nu8 EmuFatFile::addDirCluster(void) {\r\n  if (!addCluster()) return false;\r\n\r\n  // zero data in cluster insure first cluster is in cache\r\n  u32 block = vol_->clusterStartBlock(curCluster_);\r\n  for (u8 i = vol_->blocksPerCluster_; i != 0; i--) {\r\n    if (!vol_->dev_->cacheZeroBlock(block + i - 1)) return false;\r\n  }\r\n  // Increase directory file size by cluster size\r\n  fileSize_ += 512UL << vol_->clusterSizeShift_;\r\n  return true;\r\n}\r\n\r\n\r\n// cache a file's directory entry\r\n// return pointer to cached entry or null for failure\r\nTDirectoryEntry* EmuFatFile::cacheDirEntry(u8 action) {\r\n  if (!vol_->dev_->cacheRawBlock(dirBlock_, action)) return NULL;\r\n  return vol_->dev_->cache_.cacheBuffer_.dir + dirIndex_;\r\n}\r\n\r\n\r\n/**\r\n *  Close a file and force cached data and directory information\r\n *  to be written to the storage device.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include no file is open or an I/O error.\r\n */\r\nu8 EmuFatFile::close(void) {\r\n  if (!sync())return false;\r\n  type_ = FAT_FILE_TYPE_CLOSED;\r\n  return true;\r\n}\r\n\r\n\r\n/**\r\n * Check for contiguous file and return its raw block range.\r\n *\r\n * \\param[out] bgnBlock the first block address for the file.\r\n * \\param[out] endBlock the last  block address for the file.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include file is not contiguous, file has zero length\r\n * or an I/O error occurred.\r\n */\r\nu8 EmuFatFile::contiguousRange(u32* bgnBlock, u32* endBlock) {\r\n  // error if no blocks\r\n  if (firstCluster_ == 0) return false;\r\n\r\n  for (u32 c = firstCluster_; ; c++) {\r\n    u32 next;\r\n    if (!vol_->fatGet(c, &next)) return false;\r\n\r\n    // check for contiguous\r\n    if (next != (c + 1)) {\r\n      // error if not end of chain\r\n      if (!vol_->isEOC(next)) return false;\r\n      *bgnBlock = vol_->clusterStartBlock(firstCluster_);\r\n      *endBlock = vol_->clusterStartBlock(c)\r\n                  + vol_->blocksPerCluster_ - 1;\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Create and open a new contiguous file of a specified size.\r\n *\r\n * \\note This function only supports short DOS 8.3 names.\r\n * See open() for more information.\r\n *\r\n * \\param[in] dirFile The directory where the file will be created.\r\n * \\param[in] fileName A valid DOS 8.3 file name.\r\n * \\param[in] size The desired file size.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include \\a fileName contains\r\n * an invalid DOS 8.3 file name, the FAT volume has not been initialized,\r\n * a file is already open, the file already exists, the root\r\n * directory is full or an I/O error.\r\n *\r\n */\r\nu8 EmuFatFile::createContiguous(EmuFatFile* dirFile, const char* fileName, u32 size) {\r\n  // don't allow zero length file\r\n  if (size == 0) return false;\r\n  if (!open(dirFile, fileName, EO_CREAT | EO_EXCL | EO_RDWR)) return false;\r\n\r\n  // calculate number of clusters needed\r\n  u32 count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1;\r\n\r\n  // allocate clusters\r\n  if (!vol_->allocContiguous(count, &firstCluster_)) {\r\n    remove();\r\n    return false;\r\n  }\r\n  fileSize_ = size;\r\n\r\n  // insure sync() will update dir entry\r\n  flags_ |= F_FILE_DIR_DIRTY;\r\n  return sync();\r\n}\r\n\r\n/**\r\n * Return a files directory entry\r\n *\r\n * \\param[out] dir Location for return of the files directory entry.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n */\r\nu8 EmuFatFile::dirEntry(TDirectoryEntry* dir) {\r\n  // make sure fields on SD are correct\r\n  if (!sync()) return false;\r\n\r\n  // read entry\r\n  TDirectoryEntry* p = cacheDirEntry(EmuFat::CACHE_FOR_READ);\r\n  if (!p) return false;\r\n\r\n  // copy to caller's struct\r\n  memcpy(dir, p, sizeof(TDirectoryEntry));\r\n  return true;\r\n}\r\n\r\n/**\r\n * Format the name field of \\a dir into the 13 byte array\r\n * \\a name in standard 8.3 short name format.\r\n *\r\n * \\param[in] dir The directory structure containing the name.\r\n * \\param[out] name A 13 byte char array for the formatted name.\r\n */\r\nvoid EmuFatFile::dirName(const TDirectoryEntry& dir, char* name) {\r\n  u8 j = 0;\r\n  for (u8 i = 0; i < 11; i++) {\r\n    if (dir.name[i] == ' ')continue;\r\n    if (i == 8) name[j++] = '.';\r\n    name[j++] = dir.name[i];\r\n  }\r\n  name[j] = 0;\r\n}\r\n\r\n// format directory name field from a 8.3 name string\r\nu8 EmuFatFile::make83Name(const char* str, u8* name) {\r\n  u8 c;\r\n  u8 n = 7;  // max index for part before dot\r\n  u8 i = 0;\r\n  // blank fill name and extension\r\n  while (i < 11) name[i++] = ' ';\r\n  i = 0;\r\n  while ((c = *str++) != '\\0') {\r\n    if (c == '.') {\r\n      if (n == 10) return false;  // only one dot allowed\r\n      n = 10;  // max index for full 8.3 name\r\n      i = 8;   // place for extension\r\n    } else {\r\n      // illegal FAT characters\r\n\t\tstatic const char* px = \"\\\\/:*?\\\"<>\";\r\n\t  const char* p = px;\r\n      u8 b;\r\n      while ((b = *p++)) if (b == c) return false;\r\n      // check size and only allow ASCII printable characters\r\n      if (i > n || c < 0X21 || c > 0X7E)return false;\r\n      // only upper case allowed in 8.3 names - convert lower to upper\r\n      name[i++] = c < 'a' || c > 'z' ?  c : c + ('A' - 'a');\r\n    }\r\n  }\r\n  // must have a file name, extension is optional\r\n  return name[0] != ' ';\r\n}\r\n\r\n/** Make a new directory.\r\n *\r\n * \\param[in] dir An open SdFat instance for the directory that will containing\r\n * the new directory.\r\n *\r\n * \\param[in] dirName A valid 8.3 DOS name for the new directory.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include this SdFile is already open, \\a dir is not a\r\n * directory, \\a dirName is invalid or already exists in \\a dir.\r\n */\r\nu8 EmuFatFile::makeDir(EmuFatFile* dir, const char* dirName) {\r\n  TDirectoryEntry d;\r\n\r\n  // create a normal file\r\n  if (!open(dir, dirName, EO_CREAT | EO_EXCL | EO_RDWR)) return false;\r\n\r\n  // convert SdFile to directory\r\n  flags_ = EO_READ;\r\n  type_ = FAT_FILE_TYPE_SUBDIR;\r\n\r\n  // allocate and zero first cluster\r\n  if (!addDirCluster())return false;\r\n\r\n  // force entry to SD\r\n  if (!sync()) return false;\r\n\r\n  // cache entry - should already be in cache due to sync() call\r\n  TDirectoryEntry* p = cacheDirEntry(EmuFat::CACHE_FOR_WRITE);\r\n  if (!p) return false;\r\n\r\n  // change directory entry  attribute\r\n  p->attributes = DIR_ATT_DIRECTORY;\r\n\r\n  // make entry for '.'\r\n  memcpy(&d, p, sizeof(d));\r\n  for (u8 i = 1; i < 11; i++) d.name[i] = ' ';\r\n  d.name[0] = '.';\r\n\r\n  // cache block for '.'  and '..'\r\n  u32 block = vol_->clusterStartBlock(firstCluster_);\r\n  if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_WRITE)) return false;\r\n\r\n  // copy '.' to block\r\n  memcpy(&vol_->dev_->cache_.cacheBuffer_.dir[0], &d, sizeof(d));\r\n\r\n  // make entry for '..'\r\n  d.name[1] = '.';\r\n  if (dir->isRoot()) {\r\n    d.firstClusterLow = 0;\r\n    d.firstClusterHigh = 0;\r\n  } else {\r\n    d.firstClusterLow = dir->firstCluster_ & 0XFFFF;\r\n    d.firstClusterHigh = dir->firstCluster_ >> 16;\r\n  }\r\n  // copy '..' to block\r\n  memcpy(&vol_->dev_->cache_.cacheBuffer_.dir[1], &d, sizeof(d));\r\n\r\n  // set position after '..'\r\n  curPosition_ = 2 * sizeof(d);\r\n\r\n  // write first block\r\n  return vol_->dev_->cacheFlush();\r\n}\r\n\r\n/**\r\n * Open a file or directory by name.\r\n *\r\n * \\param[in] dirFile An open SdFat instance for the directory containing the\r\n * file to be opened.\r\n *\r\n * \\param[in] fileName A valid 8.3 DOS name for a file to be opened.\r\n *\r\n * \\param[in] oflag Values for \\a oflag are constructed by a bitwise-inclusive\r\n * OR of flags from the following list\r\n *\r\n * O_READ - Open for reading.\r\n *\r\n * O_RDONLY - Same as O_READ.\r\n *\r\n * O_WRITE - Open for writing.\r\n *\r\n * O_WRONLY - Same as O_WRITE.\r\n *\r\n * O_RDWR - Open for reading and writing.\r\n *\r\n * O_APPEND - If set, the file offset shall be set to the end of the\r\n * file prior to each write.\r\n *\r\n * O_CREAT - If the file exists, this flag has no effect except as noted\r\n * under O_EXCL below. Otherwise, the file shall be created\r\n *\r\n * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.\r\n *\r\n * O_SYNC - Call sync() after each write.  This flag should not be used with\r\n * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class.\r\n * These functions do character at a time writes so sync() will be called\r\n * after each byte.\r\n *\r\n * O_TRUNC - If the file exists and is a regular file, and the file is\r\n * successfully opened and is not read only, its length shall be truncated to 0.\r\n *\r\n * \\note Directory files must be opened read only.  Write and truncation is\r\n * not allowed for directory files.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include this SdFile is already open, \\a difFile is not\r\n * a directory, \\a fileName is invalid, the file does not exist\r\n * or can't be opened in the access mode specified by oflag.\r\n */\r\nu8 EmuFatFile::open(EmuFatFile* dirFile, const char* fileName, u8 oflag) {\r\n  u8 dname[11];\r\n  TDirectoryEntry* p;\r\n\r\n  // error if already open\r\n  if (isOpen())return false;\r\n\r\n  if (!make83Name(fileName, dname)) return false;\r\n  vol_ = dirFile->vol_;\r\n  dirFile->rewind();\r\n\r\n  // bool for empty entry found\r\n  u8 emptyFound = false;\r\n\r\n  // search for file\r\n  while (dirFile->curPosition_ < dirFile->fileSize_) {\r\n    u8 index = 0XF & (dirFile->curPosition_ >> 5);\r\n    p = dirFile->readDirCache();\r\n    if (p == NULL) return false;\r\n\r\n    if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) {\r\n      // remember first empty slot\r\n      if (!emptyFound) {\r\n        emptyFound = true;\r\n        dirIndex_ = index;\r\n        dirBlock_ = vol_->dev_->cache_.cacheBlockNumber_;\r\n      }\r\n      // done if no entries follow\r\n      if (p->name[0] == DIR_NAME_FREE) break;\r\n    } else if (!memcmp(dname, p->name, 11)) {\r\n      // don't open existing file if O_CREAT and O_EXCL\r\n      if ((oflag & (EO_CREAT | EO_EXCL)) == (EO_CREAT | EO_EXCL)) return false;\r\n\r\n      // open found file\r\n      return openCachedEntry(0XF & index, oflag);\r\n    }\r\n  }\r\n  // only create file if O_CREAT and O_WRITE\r\n  if ((oflag & (EO_CREAT | EO_WRITE)) != (EO_CREAT | EO_WRITE)) return false;\r\n\r\n  // cache found slot or add cluster if end of file\r\n  if (emptyFound) {\r\n    p = cacheDirEntry(EmuFat::CACHE_FOR_WRITE);\r\n    if (!p) return false;\r\n  } else {\r\n    if (dirFile->type_ == FAT_FILE_TYPE_ROOT16) return false;\r\n\r\n    // add and zero cluster for dirFile - first cluster is in cache for write\r\n    if (!dirFile->addDirCluster()) return false;\r\n\r\n    // use first entry in cluster\r\n    dirIndex_ = 0;\r\n    p = vol_->dev_->cache_.cacheBuffer_.dir;\r\n  }\r\n  // initialize as empty file\r\n  memset(p, 0, sizeof(TDirectoryEntry));\r\n  memcpy(p->name, dname, 11);\r\n\r\n  // set timestamps\r\n  if (dateTime_) {\r\n    // call user function\r\n    dateTime_(&p->creationDate, &p->creationTime);\r\n  } else {\r\n    // use default date/time\r\n    p->creationDate = FAT_DEFAULT_DATE;\r\n    p->creationTime = FAT_DEFAULT_TIME;\r\n  }\r\n  p->lastAccessDate = p->creationDate;\r\n  p->lastWriteDate = p->creationDate;\r\n  p->lastWriteTime = p->creationTime;\r\n\r\n  // force write of entry to SD\r\n  if (!vol_->dev_->cacheFlush()) return false;\r\n\r\n  // open entry in cache\r\n  return openCachedEntry(dirIndex_, oflag);\r\n}\r\n\r\n/**\r\n * Open a file by index.\r\n *\r\n * \\param[in] dirFile An open SdFat instance for the directory.\r\n *\r\n * \\param[in] index The \\a index of the directory entry for the file to be\r\n * opened.  The value for \\a index is (directory file position)/32.\r\n *\r\n * \\param[in] oflag Values for \\a oflag are constructed by a bitwise-inclusive\r\n * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.\r\n *\r\n * See open() by fileName for definition of flags and return values.\r\n *\r\n */\r\nu8 EmuFatFile::open(EmuFatFile* dirFile, u16 index, u8 oflag) {\r\n  // error if already open\r\n  if (isOpen())return false;\r\n\r\n  // don't open existing file if O_CREAT and O_EXCL - user call error\r\n  if ((oflag & (EO_CREAT | EO_EXCL)) == (EO_CREAT | EO_EXCL)) return false;\r\n\r\n  vol_ = dirFile->vol_;\r\n\r\n  // seek to location of entry\r\n  if (!dirFile->seekSet(32 * index)) return false;\r\n\r\n  // read entry into cache\r\n  TDirectoryEntry* p = dirFile->readDirCache();\r\n  if (p == NULL) return false;\r\n\r\n  // error if empty slot or '.' or '..'\r\n  if (p->name[0] == DIR_NAME_FREE ||\r\n      p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') {\r\n    return false;\r\n  }\r\n  // open cached entry\r\n  return openCachedEntry(index & 0XF, oflag);\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n// open a cached directory entry. Assumes vol_ is initializes\r\nu8 EmuFatFile::openCachedEntry(u8 dirIndex, u8 oflag) {\r\n  // location of entry in cache\r\n  TDirectoryEntry* p = vol_->dev_->cache_.cacheBuffer_.dir + dirIndex;\r\n\r\n  // write or truncate is an error for a directory or read-only file\r\n  if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) {\r\n    if (oflag & (EO_WRITE | EO_TRUNC)) return false;\r\n  }\r\n  // remember location of directory entry on SD\r\n  dirIndex_ = dirIndex;\r\n  dirBlock_ = vol_->dev_->cache_.cacheBlockNumber_;\r\n\r\n  // copy first cluster number for directory fields\r\n  firstCluster_ = (u32)p->firstClusterHigh << 16;\r\n  firstCluster_ |= p->firstClusterLow;\r\n\r\n  // make sure it is a normal file or subdirectory\r\n  if (DIR_IS_FILE(p)) {\r\n    fileSize_ = p->fileSize;\r\n    type_ = FAT_FILE_TYPE_NORMAL;\r\n  } else if (DIR_IS_SUBDIR(p)) {\r\n    if (!vol_->chainSize(firstCluster_, &fileSize_)) return false;\r\n    type_ = FAT_FILE_TYPE_SUBDIR;\r\n  } else {\r\n    return false;\r\n  }\r\n  // save open flags for read/write\r\n  flags_ = oflag & (EO_ACCMODE | EO_SYNC | EO_APPEND);\r\n\r\n  // set to start of file\r\n  curCluster_ = 0;\r\n  curPosition_ = 0;\r\n\r\n  // truncate file to zero length if requested\r\n  if (oflag & EO_TRUNC) return truncate(0);\r\n  return true;\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Open a volume's root directory.\r\n *\r\n * \\param[in] vol The FAT volume containing the root directory to be opened.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include the FAT volume has not been initialized\r\n * or it a FAT12 volume.\r\n */\r\nu8 EmuFatFile::openRoot(EmuFatVolume* vol) {\r\n  // error if file is already open\r\n  if (isOpen()) return false;\r\n\r\n  if (vol->fatType() == 16) {\r\n    type_ = FAT_FILE_TYPE_ROOT16;\r\n    firstCluster_ = 0;\r\n    fileSize_ = 32 * vol->rootDirEntryCount();\r\n  } else if (vol->fatType() == 32) {\r\n    type_ = FAT_FILE_TYPE_ROOT32;\r\n    firstCluster_ = vol->rootDirStart();\r\n    if (!vol->chainSize(firstCluster_, &fileSize_)) return false;\r\n  } else {\r\n    // volume is not initialized or FAT12\r\n    return false;\r\n  }\r\n  vol_ = vol;\r\n  // read only\r\n  flags_ = EO_READ;\r\n\r\n  // set to start of file\r\n  curCluster_ = 0;\r\n  curPosition_ = 0;\r\n\r\n  // root has no directory entry\r\n  dirBlock_ = 0;\r\n  dirIndex_ = 0;\r\n  return true;\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Read data from a file starting at the current position.\r\n *\r\n * \\param[out] buf Pointer to the location that will receive the data.\r\n *\r\n * \\param[in] nbyte Maximum number of bytes to read.\r\n *\r\n * \\return For success read() returns the number of bytes read.\r\n * A value less than \\a nbyte, including zero, will be returned\r\n * if end of file is reached.\r\n * If an error occurs, read() returns -1.  Possible errors include\r\n * read() called before a file has been opened, corrupt file system\r\n * or an I/O error occurred.\r\n */\r\ns32 EmuFatFile::read(void* buf, u32 nbyte) {\r\n  u8* dst = reinterpret_cast<u8*>(buf);\r\n\r\n  // error if not open or write only\r\n  if (!isOpen() || !(flags_ & EO_READ)) return -1;\r\n\r\n  // max bytes left in file\r\n  if (nbyte > (fileSize_ - curPosition_)) nbyte = fileSize_ - curPosition_;\r\n\r\n  // amount left to read\r\n  u32 toRead = nbyte;\r\n  while (toRead > 0) {\r\n    u32 block;  // raw device block number\r\n    u16 offset = curPosition_ & 0x1FF;  // offset in block\r\n    if (type_ == FAT_FILE_TYPE_ROOT16) {\r\n      block = vol_->rootDirStart() + (curPosition_ >> 9);\r\n    } else {\r\n      u8 blockOfCluster = vol_->blockOfCluster(curPosition_);\r\n      if (offset == 0 && blockOfCluster == 0) {\r\n        // start of new cluster\r\n        if (curPosition_ == 0) {\r\n          // use first cluster in file\r\n          curCluster_ = firstCluster_;\r\n        } else {\r\n          // get next cluster from FAT\r\n          if (!vol_->fatGet(curCluster_, &curCluster_)) return -1;\r\n        }\r\n      }\r\n      block = vol_->clusterStartBlock(curCluster_) + blockOfCluster;\r\n    }\r\n    u32 n = toRead;\r\n\r\n    // amount to be read from current block\r\n    if (n > (512UL - offset)) n = 512 - offset;\r\n\r\n    // no buffering needed if n == 512 or user requests no buffering\r\n    if ((unbufferedRead() || n == 512) &&\r\n      block != vol_->dev_->cache_.cacheBlockNumber_) {\r\n      if (!vol_->readData(block, offset, n, dst)) return -1;\r\n      dst += n;\r\n    } else {\r\n      // read block to cache and copy data to caller\r\n      if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_READ)) return -1;\r\n      u8* src = vol_->dev_->cache_.cacheBuffer_.data + offset;\r\n      u8* end = src + n;\r\n      while (src != end) *dst++ = *src++;\r\n    }\r\n    curPosition_ += n;\r\n    toRead -= n;\r\n  }\r\n  return nbyte;\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Read the next directory entry from a directory file.\r\n *\r\n * \\param[out] dir The dir_t struct that will receive the data.\r\n *\r\n * \\return For success readDir() returns the number of bytes read.\r\n * A value of zero will be returned if end of file is reached.\r\n * If an error occurs, readDir() returns -1.  Possible errors include\r\n * readDir() called before a directory has been opened, this is not\r\n * a directory file or an I/O error occurred.\r\n */\r\ns8 EmuFatFile::readDir(TDirectoryEntry* dir) {\r\n  s16 n;\r\n  // if not a directory file or miss-positioned return an error\r\n  if (!isDir() || (0x1F & curPosition_)) return -1;\r\n\r\n  while ((n = read(dir, sizeof(TDirectoryEntry))) == sizeof(TDirectoryEntry)) {\r\n    // last entry if DIR_NAME_FREE\r\n    if (dir->name[0] == DIR_NAME_FREE) break;\r\n    // skip empty entries and entry for .  and ..\r\n    if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue;\r\n    // return if normal file or subdirectory\r\n    if (DIR_IS_FILE_OR_SUBDIR(dir)) return (s8)n;\r\n  }\r\n  // error, end of file, or past last entry\r\n  return n < 0 ? -1 : 0;\r\n}\r\n\r\n// Read next directory entry into the cache\r\n// Assumes file is correctly positioned\r\nTDirectoryEntry* EmuFatFile::readDirCache(void) {\r\n  // error if not directory\r\n  if (!isDir()) return NULL;\r\n\r\n  // index of entry in cache\r\n  u8 i = (curPosition_ >> 5) & 0XF;\r\n\r\n  // use read to locate and cache block\r\n  if (read() < 0) return NULL;\r\n\r\n  // advance to next entry\r\n  curPosition_ += 31;\r\n\r\n  // return pointer to entry\r\n  return (vol_->dev_->cache_.cacheBuffer_.dir + i);\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Remove a file.\r\n *\r\n * The directory entry and all data for the file are deleted.\r\n *\r\n * \\note This function should not be used to delete the 8.3 version of a\r\n * file that has a long name. For example if a file has the long name\r\n * \"New Text Document.txt\" you should not delete the 8.3 name \"NEWTEX~1.TXT\".\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include the file read-only, is a directory,\r\n * or an I/O error occurred.\r\n */\r\nu8 EmuFatFile::remove(void) {\r\n  // free any clusters - will fail if read-only or directory\r\n  if (!truncate(0)) return false;\r\n\r\n  // cache directory entry\r\n  TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE);\r\n  if (!d) return false;\r\n\r\n  // mark entry deleted\r\n  d->name[0] = DIR_NAME_DELETED;\r\n\r\n  // set this SdFile closed\r\n  type_ = FAT_FILE_TYPE_CLOSED;\r\n\r\n  // write entry to SD\r\n  return vol_->dev_->cacheFlush();\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Remove a file.\r\n *\r\n * The directory entry and all data for the file are deleted.\r\n *\r\n * \\param[in] dirFile The directory that contains the file.\r\n * \\param[in] fileName The name of the file to be removed.\r\n *\r\n * \\note This function should not be used to delete the 8.3 version of a\r\n * file that has a long name. For example if a file has the long name\r\n * \"New Text Document.txt\" you should not delete the 8.3 name \"NEWTEX~1.TXT\".\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include the file is a directory, is read only,\r\n * \\a dirFile is not a directory, \\a fileName is not found\r\n * or an I/O error occurred.\r\n */\r\nu8 EmuFatFile::remove(EmuFatFile* dirFile, const char* fileName) {\r\n  EmuFatFile file;\r\n  if (!file.open(dirFile, fileName, EO_WRITE)) return false;\r\n  return file.remove();\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/** Remove a directory file.\r\n *\r\n * The directory file will be removed only if it is empty and is not the\r\n * root directory.  rmDir() follows DOS and Windows and ignores the\r\n * read-only attribute for the directory.\r\n *\r\n * \\note This function should not be used to delete the 8.3 version of a\r\n * directory that has a long name. For example if a directory has the\r\n * long name \"New folder\" you should not delete the 8.3 name \"NEWFOL~1\".\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include the file is not a directory, is the root\r\n * directory, is not empty, or an I/O error occurred.\r\n */\r\nu8 EmuFatFile::rmDir(void) {\r\n  // must be open subdirectory\r\n  if (!isSubDir()) return false;\r\n\r\n  rewind();\r\n\r\n  // make sure directory is empty\r\n  while (curPosition_ < fileSize_) {\r\n    TDirectoryEntry* p = readDirCache();\r\n    if (p == NULL) return false;\r\n    // done if past last used entry\r\n    if (p->name[0] == DIR_NAME_FREE) break;\r\n    // skip empty slot or '.' or '..'\r\n    if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue;\r\n    // error not empty\r\n    if (DIR_IS_FILE_OR_SUBDIR(p)) return false;\r\n  }\r\n  // convert empty directory to normal file for remove\r\n  type_ = FAT_FILE_TYPE_NORMAL;\r\n  flags_ |= EO_WRITE;\r\n  return remove();\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/** Recursively delete a directory and all contained files.\r\n *\r\n * This is like the Unix/Linux 'rm -rf *' if called with the root directory\r\n * hence the name.\r\n *\r\n * Warning - This will remove all contents of the directory including\r\n * subdirectories.  The directory will then be removed if it is not root.\r\n * The read-only attribute for files will be ignored.\r\n *\r\n * \\note This function should not be used to delete the 8.3 version of\r\n * a directory that has a long name.  See remove() and rmDir().\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n */\r\nu8 EmuFatFile::rmRfStar(void) {\r\n  rewind();\r\n  while (curPosition_ < fileSize_) {\r\n    EmuFatFile f;\r\n\r\n    // remember position\r\n    u16 index = curPosition_/32;\r\n\r\n    TDirectoryEntry* p = readDirCache();\r\n    if (!p) return false;\r\n\r\n    // done if past last entry\r\n    if (p->name[0] == DIR_NAME_FREE) break;\r\n\r\n    // skip empty slot or '.' or '..'\r\n    if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue;\r\n\r\n    // skip if part of long file name or volume label in root\r\n    if (!DIR_IS_FILE_OR_SUBDIR(p)) continue;\r\n\r\n    if (!f.open(this, index, EO_READ)) return false;\r\n    if (f.isSubDir()) {\r\n      // recursively delete\r\n      return rmRfStar();\r\n    } else {\r\n      // ignore read-only\r\n      f.flags_ |= EO_WRITE;\r\n      if (!f.remove()) return false;\r\n    }\r\n    // position to next entry if required\r\n    if (curPosition_ != (32*(index + 1))) {\r\n      if (!seekSet(32*(index + 1))) return false;\r\n    }\r\n  }\r\n  // don't try to delete root\r\n  if (isRoot()) return true;\r\n  return rmDir();\r\n}\r\n\r\nu8 EmuFatFile::seekSet(u32 pos) {\r\n  // error if file not open or seek past end of file\r\n  if (!isOpen() || pos > fileSize_) return false;\r\n\r\n  if (type_ == FAT_FILE_TYPE_ROOT16) {\r\n    curPosition_ = pos;\r\n    return true;\r\n  }\r\n  if (pos == 0) {\r\n    // set position to start of file\r\n    curCluster_ = 0;\r\n    curPosition_ = 0;\r\n    return true;\r\n  }\r\n  // calculate cluster index for cur and new position\r\n  u32 nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9);\r\n  u32 nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9);\r\n\r\n  if (nNew < nCur || curPosition_ == 0) {\r\n    // must follow chain from first cluster\r\n    curCluster_ = firstCluster_;\r\n  } else {\r\n    // advance from curPosition\r\n    nNew -= nCur;\r\n  }\r\n  while (nNew--) {\r\n    if (!vol_->fatGet(curCluster_, &curCluster_)) return false;\r\n  }\r\n  curPosition_ = pos;\r\n  return true;\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * The sync() call causes all modified data and directory fields\r\n * to be written to the storage device.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include a call to sync() before a file has been\r\n * opened or an I/O error.\r\n */\r\nu8 EmuFatFile::sync(void) {\r\n  // only allow open files and directories\r\n  if (!isOpen()) return false;\r\n\r\n  if (flags_ & F_FILE_DIR_DIRTY) {\r\n    TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE);\r\n    if (!d) return false;\r\n\r\n    // do not set filesize for dir files\r\n    if (!isDir()) d->fileSize = fileSize_;\r\n\r\n    // update first cluster fields\r\n    d->firstClusterLow = firstCluster_ & 0XFFFF;\r\n    d->firstClusterHigh = firstCluster_ >> 16;\r\n\r\n    // set modify time if user supplied a callback date/time function\r\n    if (dateTime_) {\r\n      dateTime_(&d->lastWriteDate, &d->lastWriteTime);\r\n      d->lastAccessDate = d->lastWriteDate;\r\n    }\r\n    // clear directory dirty\r\n    flags_ &= ~F_FILE_DIR_DIRTY;\r\n  }\r\n  return vol_->dev_->cacheFlush();\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Set a file's timestamps in its directory entry.\r\n *\r\n * \\param[in] flags Values for \\a flags are constructed by a bitwise-inclusive\r\n * OR of flags from the following list\r\n *\r\n * T_ACCESS - Set the file's last access date.\r\n *\r\n * T_CREATE - Set the file's creation date and time.\r\n *\r\n * T_WRITE - Set the file's last write/modification date and time.\r\n *\r\n * \\param[in] year Valid range 1980 - 2107 inclusive.\r\n *\r\n * \\param[in] month Valid range 1 - 12 inclusive.\r\n *\r\n * \\param[in] day Valid range 1 - 31 inclusive.\r\n *\r\n * \\param[in] hour Valid range 0 - 23 inclusive.\r\n *\r\n * \\param[in] minute Valid range 0 - 59 inclusive.\r\n *\r\n * \\param[in] second Valid range 0 - 59 inclusive\r\n *\r\n * \\note It is possible to set an invalid date since there is no check for\r\n * the number of days in a month.\r\n *\r\n * \\note\r\n * Modify and access timestamps may be overwritten if a date time callback\r\n * function has been set by dateTimeCallback().\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n */\r\nu8 EmuFatFile::timestamp(u8 flags, u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second) {\r\n  if (!isOpen()\r\n    || year < 1980\r\n    || year > 2107\r\n    || month < 1\r\n    || month > 12\r\n    || day < 1\r\n    || day > 31\r\n    || hour > 23\r\n    || minute > 59\r\n    || second > 59) {\r\n      return false;\r\n  }\r\n  TDirectoryEntry* d = cacheDirEntry(EmuFat::CACHE_FOR_WRITE);\r\n  if (!d) return false;\r\n\r\n  u16 dirDate = FAT_DATE(year, month, day);\r\n  u16 dirTime = FAT_TIME(hour, minute, second);\r\n  if (flags & T_ACCESS) {\r\n    d->lastAccessDate = dirDate;\r\n  }\r\n  if (flags & T_CREATE) {\r\n    d->creationDate = dirDate;\r\n    d->creationTime = dirTime;\r\n    // seems to be units of 1/100 second not 1/10 as Microsoft states\r\n    d->creationTimeTenths = second & 1 ? 100 : 0;\r\n  }\r\n  if (flags & T_WRITE) {\r\n    d->lastWriteDate = dirDate;\r\n    d->lastWriteTime = dirTime;\r\n  }\r\n  vol_->dev_->cacheSetDirty();\r\n  return sync();\r\n}\r\n\r\n//------------------------------------------------------------------------------\r\n/**\r\n * Truncate a file to a specified length.  The current file position\r\n * will be maintained if it is less than or equal to \\a length otherwise\r\n * it will be set to end of file.\r\n *\r\n * \\param[in] length The desired length for the file.\r\n *\r\n * \\return The value one, true, is returned for success and\r\n * the value zero, false, is returned for failure.\r\n * Reasons for failure include file is read only, file is a directory,\r\n * \\a length is greater than the current file size or an I/O error occurs.\r\n */\r\nu8 EmuFatFile::truncate(u32 length) {\r\n// error if not a normal file or read-only\r\n  if (!isFile() || !(flags_ & EO_WRITE)) return false;\r\n\r\n  // error if length is greater than current size\r\n  if (length > fileSize_) return false;\r\n\r\n  // fileSize and length are zero - nothing to do\r\n  if (fileSize_ == 0) return true;\r\n\r\n  // remember position for seek after truncation\r\n  u32 newPos = curPosition_ > length ? length : curPosition_;\r\n\r\n  // position to last cluster in truncated file\r\n  if (!seekSet(length)) return false;\r\n\r\n  if (length == 0) {\r\n    // free all clusters\r\n    if (!vol_->freeChain(firstCluster_)) return false;\r\n    firstCluster_ = 0;\r\n  } else {\r\n    u32 toFree;\r\n    if (!vol_->fatGet(curCluster_, &toFree)) return false;\r\n\r\n    if (!vol_->isEOC(toFree)) {\r\n      // free extra clusters\r\n      if (!vol_->freeChain(toFree)) return false;\r\n\r\n      // current cluster is end of chain\r\n      if (!vol_->fatPutEOC(curCluster_)) return false;\r\n    }\r\n  }\r\n  fileSize_ = length;\r\n\r\n  // need to update directory entry\r\n  flags_ |= F_FILE_DIR_DIRTY;\r\n\r\n  if (!sync()) return false;\r\n\r\n  // set file to correct position\r\n  return seekSet(newPos);\r\n}\r\n\r\n/**\r\n * Write data to an open file.\r\n *\r\n * \\note Data is moved to the cache but may not be written to the\r\n * storage device until sync() is called.\r\n *\r\n * \\param[in] buf Pointer to the location of the data to be written.\r\n *\r\n * \\param[in] nbyte Number of bytes to write.\r\n *\r\n * \\return For success write() returns the number of bytes written, always\r\n * \\a nbyte.  If an error occurs, write() returns -1.  Possible errors\r\n * include write() is called before a file has been opened, write is called\r\n * for a read-only file, device is full, a corrupt file system or an I/O error.\r\n *\r\n */\r\ns32 EmuFatFile::write(const void* buf, u32 nbyte) {\r\n  // convert void* to uint8_t*  -  must be before goto statements\r\n  const u8* src = reinterpret_cast<const u8*>(buf);\r\n\r\n  // number of bytes left to write  -  must be before goto statements\r\n  u32 nToWrite = nbyte;\r\n\r\n  // error if not a normal file or is read-only\r\n  if (!isFile() || !(flags_ & EO_WRITE)) goto writeErrorReturn;\r\n\r\n  // seek to end of file if append flag\r\n  if ((flags_ & EO_APPEND) && curPosition_ != fileSize_) {\r\n    if (!seekEnd()) goto writeErrorReturn;\r\n  }\r\n\r\n  while (nToWrite > 0) {\r\n    u8 blockOfCluster = vol_->blockOfCluster(curPosition_);\r\n    u16 blockOffset = curPosition_ & 0X1FF;\r\n    if (blockOfCluster == 0 && blockOffset == 0) {\r\n      // start of new cluster\r\n      if (curCluster_ == 0) {\r\n        if (firstCluster_ == 0) {\r\n          // allocate first cluster of file\r\n          if (!addCluster()) goto writeErrorReturn;\r\n        } else {\r\n          curCluster_ = firstCluster_;\r\n        }\r\n      } else {\r\n        u32 next;\r\n        if (!vol_->fatGet(curCluster_, &next)) return false;\r\n        if (vol_->isEOC(next)) {\r\n          // add cluster if at end of chain\r\n          if (!addCluster()) goto writeErrorReturn;\r\n        } else {\r\n          curCluster_ = next;\r\n        }\r\n      }\r\n    }\r\n    // max space in block\r\n    u32 n = 512 - blockOffset;\r\n\r\n    // lesser of space and amount to write\r\n    if (n > nToWrite) n = nToWrite;\r\n\r\n    // block for data write\r\n    u32 block = vol_->clusterStartBlock(curCluster_) + blockOfCluster;\r\n    if (n == 512) {\r\n      // full block - don't need to use cache\r\n      // invalidate cache if block is in cache\r\n      if (vol_->dev_->cache_.cacheBlockNumber_ == block) {\r\n        vol_->dev_->cache_.cacheBlockNumber_ = 0XFFFFFFFF;\r\n      }\r\n      if (!vol_->writeBlock(block, src)) goto writeErrorReturn;\r\n      src += 512;\r\n    } else {\r\n      if (blockOffset == 0 && curPosition_ >= fileSize_) {\r\n        // start of new block don't need to read into cache\r\n        if (!vol_->dev_->cacheFlush()) goto writeErrorReturn;\r\n        vol_->dev_->cache_.cacheBlockNumber_ = block;\r\n        vol_->dev_->cacheSetDirty();\r\n      } else {\r\n        // rewrite part of block\r\n        if (!vol_->dev_->cacheRawBlock(block, EmuFat::CACHE_FOR_WRITE)) {\r\n          goto writeErrorReturn;\r\n        }\r\n      }\r\n      u8* dst = vol_->dev_->cache_.cacheBuffer_.data + blockOffset;\r\n      u8* end = dst + n;\r\n      while (dst != end) *dst++ = *src++;\r\n    }\r\n    nToWrite -= n;\r\n    curPosition_ += n;\r\n  }\r\n  if (curPosition_ > fileSize_) {\r\n    // update fileSize and insure sync will update dir entry\r\n    fileSize_ = curPosition_;\r\n    flags_ |= F_FILE_DIR_DIRTY;\r\n  } else if (dateTime_ && nbyte) {\r\n    // insure sync will update modified date and time\r\n    flags_ |= F_FILE_DIR_DIRTY;\r\n  }\r\n\r\n  if (flags_ & EO_SYNC) {\r\n    if (!sync()) goto writeErrorReturn;\r\n  }\r\n  return nbyte;\r\n\r\n writeErrorReturn:\r\n  // return for write error\r\n  writeError = true;\r\n  return -1;\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/emufat.h",
    "content": "/*\r\n\tCopyright 2009-2010 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n//based on Arduino SdFat Library ( http://code.google.com/p/sdfatlib/ )\r\n//Copyright (C) 2009 by William Greiman\r\n\r\n//based on mkdosfs - utility to create FAT/MS-DOS filesystems\r\n//Copyright (C) 1991 Linus Torvalds <torvalds@klaava.helsinki.fi>\r\n//Copyright (C) 1992-1993 Remy Card <card@masi.ibp.fr>\r\n//Copyright (C) 1993-1994 David Hudson <dave@humbug.demon.co.uk>\r\n//Copyright (C) 1998 H. Peter Anvin <hpa@zytor.com>\r\n//Copyright (C) 1998-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>\r\n\r\n//based on libfat\n//Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\r\n#ifndef EMUFAT_H\r\n#define EMUFAT_H\r\n\r\n#include \"emufat_types.h\"\r\n#include \"emufile.h\"\r\n#include <stdio.h>\r\n\r\n#define BOOTCODE_SIZE\t\t448\r\n#define BOOTCODE_FAT32_SIZE\t420\r\n\r\n\r\n// use the gnu style oflag in open()\r\n/** open() oflag for reading */\r\nstatic const u8 EO_READ = 0X01;\r\n/** open() oflag - same as O_READ */\r\nstatic const u8 EO_RDONLY = EO_READ;\r\n/** open() oflag for write */\r\nstatic const u8 EO_WRITE = 0X02;\r\n/** open() oflag - same as O_WRITE */\r\nstatic const u8 EO_WRONLY = EO_WRITE;\r\n/** open() oflag for reading and writing */\r\nstatic const u8 EO_RDWR = (EO_READ | EO_WRITE);\r\n/** open() oflag mask for access modes */\r\nstatic const u8 EO_ACCMODE = (EO_READ | EO_WRITE);\r\n/** The file offset shall be set to the end of the file prior to each write. */\r\nstatic const u8 EO_APPEND = 0X04;\r\n/** synchronous writes - call sync() after each write */\r\nstatic const u8 EO_SYNC = 0X08;\r\n/** create the file if nonexistent */\r\nstatic const u8 EO_CREAT = 0X10;\r\n/** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */\r\nstatic const u8 EO_EXCL = 0X20;\r\n/** truncate the file to zero length */\r\nstatic const u8 EO_TRUNC = 0X40;\r\n\r\n\r\n//Value for byte 510 of boot block or MBR\r\nstatic const u8 BOOTSIG0 = 0X55;\r\n//Value for byte 511 of boot block or MBR\r\nstatic const u8 BOOTSIG1 = 0XAA;\r\n\r\nstatic void (*dateTime_)(u16* date, u16* time) = NULL;\r\n\r\n\r\n#include \"PACKED.h\"\r\n\r\n//A partition table entry for a MBR formatted storage device.\r\n//The MBR partition table has four entries.\r\nstruct __PACKED TPartitionRecord {\r\n\t//Boot Indicator . Indicates whether the volume is the active\r\n\t//partition.  Legal values include: 0X00. Do not use for booting.\r\n\t//0X80 Active partition.\r\n\tu8 boot;\r\n\r\n\t//Head part of Cylinder-head-sector address of the first block in\r\n\t//the partition. Legal values are 0-255. Only used in old PC BIOS.\r\n\tu8 beginHead;\r\n\r\n\tstruct\r\n\t{\r\n\t\t//Sector part of Cylinder-head-sector address of the first block in\r\n\t\t//the partition. Legal values are 1-63. Only used in old PC BIOS.\r\n\t\tu32 beginSector : 6;\r\n\t\t//High bits cylinder for first block in partition.\r\n\t\tu32 beginCylinderHigh : 2;\r\n\t};\r\n\r\n\t//Combine beginCylinderLow with beginCylinderHigh. Legal values\r\n\t//are 0-1023.  Only used in old PC BIOS.\r\n\tu8 beginCylinderLow;\r\n\t//Partition type. See defines that begin with PART_TYPE_ for\r\n\t//some Microsoft partition types.\r\n\tu8 type;\r\n\r\n\t//head part of cylinder-head-sector address of the last sector in the\r\n\t//partition.  Legal values are 0-255. Only used in old PC BIOS.\r\n\tu8 endHead;\r\n\r\n\tstruct \r\n\t{\r\n\t\t//Sector part of cylinder-head-sector address of the last sector in\r\n\t\t//the partition.  Legal values are 1-63. Only used in old PC BIOS.\r\n\t\tu32 endSector : 6;\r\n\t\t// High bits of end cylinder\r\n\t\tu32 endCylinderHigh : 2;\r\n\t};\r\n\r\n\t//Combine endCylinderLow with endCylinderHigh. Legal values\r\n\t//are 0-1023.  Only used in old PC BIOS.\r\n\tu8 endCylinderLow;\r\n\r\n\t//Logical block address of the first block in the partition.\r\n\tu32 firstSector;\r\n\r\n\t//Length of the partition, in blocks.\r\n\tu32 totalSectors;\r\n};\r\n\r\n//Master Boot Record:\r\n//The first block of a storage device that is formatted with a MBR.\r\nstruct __PACKED TMasterBootRecord {\r\n\t//Code Area for master boot program.\r\n\tu8 codeArea[440];\r\n\t//Optional WindowsNT disk signature. May contain more boot code.\r\n\tu32 diskSignature;\r\n\t//Usually zero but may be more boot code. \r\n\tu16 usuallyZero;\r\n\t//Partition tables.\r\n\tTPartitionRecord part[4];\r\n\t//First MBR signature byte. Must be 0X55\r\n\tu8 mbrSig0;\r\n\t//Second MBR signature byte. Must be 0XAA\r\n\tu8 mbrSig1;\r\n};\r\n\r\nstruct __PACKED msdos_volume_info {\r\n  u8 drive_number;\t/* BIOS drive number */\r\n  u8 RESERVED;\t/* Unused */\r\n  u8 ext_boot_sign;\t/* 0x29 if fields below exist (DOS 3.3+) */\r\n  u32 volume_id;\t/* Volume ID number */\r\n  u8 volume_label[11];/* Volume label */\r\n  u8 fs_type[8];\t/* Typically FAT12 or FAT16 */\r\n};\r\n\r\n//Boot sector for a FAT16 or FAT32 volume.\r\nstruct __PACKED TFat32BootSector {\r\n\t//X86 jmp to boot program\r\n\tu8  jmpToBootCode[3];\r\n\t//informational only - don't depend on it\r\n\tu8     oemName[8];\r\n\r\n\t//Count of bytes per sector. This value may take on only the\r\n\t//following values: 512, 1024, 2048 or 4096\r\n\tu16 bytesPerSector;\r\n\t//Number of sectors per allocation unit. This value must be a\r\n\t//power of 2 that is greater than 0. The legal values are\r\n\t//1, 2, 4, 8, 16, 32, 64, and 128.\r\n\tu8  sectorsPerCluster; //cluster_size\r\n\t//Number of sectors before the first FAT.\r\n\t//This value must not be zero.\r\n\tu16 reservedSectorCount;\r\n\t//The count of FAT data structures on the volume. This field should\r\n\t//always contain the value 2 for any FAT volume of any type.\r\n\tu8  fatCount;\r\n\t//For FAT12 and FAT16 volumes, this field contains the count of\r\n\t//32-byte directory entries in the root directory. For FAT32 volumes,\r\n\t//this field must be set to 0. For FAT12 and FAT16 volumes, this\r\n\t//value should always specify a count that when multiplied by 32\r\n\t//results in a multiple of bytesPerSector.  FAT16 volumes should\r\n\t//use the value 512.\r\n\tu16 rootDirEntryCount; //dir_entries\r\n\t//This field is the old 16-bit total count of sectors on the volume.\r\n\t//This count includes the count of all sectors in all four regions\r\n\t//of the volume. This field can be 0; if it is 0, then totalSectors32\r\n\t//must be non-zero.  For FAT32 volumes, this field must be 0. For\r\n\t//FAT12 and FAT16 volumes, this field contains the sector count, and\r\n\t//totalSectors32 is 0 if the total sector count fits\r\n\t//(is less than 0x10000).\r\n\tu16 totalSectors16;\r\n\t//This dates back to the old MS-DOS 1.x media determination and is\r\n\t//no longer usually used for anything.  0xF8 is the standard value\r\n\t//for fixed (non-removable) media. For removable media, 0xF0 is\r\n\t//frequently used. Legal values are 0xF0 or 0xF8-0xFF.\r\n\tu8  mediaType;\r\n\t//Count of sectors occupied by one FAT on FAT12/FAT16 volumes.\r\n\t//On FAT32 volumes this field must be 0, and sectorsPerFat32\r\n\t//contains the FAT size count.\r\n\tu16 sectorsPerFat16;\r\n\t//Sectors per track for interrupt 0x13. Not used otherwise. \r\n\tu16 sectorsPerTrack;\r\n\t//Number of heads for interrupt 0x13.  Not used otherwise. \r\n\tu16 headCount;\r\n\t//Count of hidden sectors preceding the partition that contains this\r\n\t//FAT volume. This field is generally only relevant for media\r\n\t//visible on interrupt 0x13.\r\n\tu32 hiddenSectors;\r\n\t//This field is the new 32-bit total count of sectors on the volume.\r\n\t//This count includes the count of all sectors in all four regions\r\n\t//of the volume.  This field can be 0; if it is 0, then\r\n\t//totalSectors16 must be non-zero.\r\n\tu32 totalSectors32;\r\n\r\n\tunion {\r\n\t\tstruct __PACKED {\r\n\t\t\tmsdos_volume_info vi;\r\n\t\t\tu8 boot_code[BOOTCODE_SIZE];\r\n\t\t} oldfat;\r\n\r\n\t\tstruct __PACKED\r\n\t\t{\r\n\t\t\t//Count of sectors occupied by one FAT on FAT32 volumes.\r\n\t\t\tu32 sectorsPerFat32; //fat32_length;\t/* sectors/FAT */\r\n\r\n\t\t\t//This field is only defined for FAT32 media and does not exist on\r\n\t\t\t//FAT12 and FAT16 media.\r\n\t\t\t//Bits 0-3 -- Zero-based number of active FAT.\r\n\t\t\t//            Only valid if mirroring is disabled.\r\n\t\t\t//Bits 4-6 -- Reserved.\r\n\t\t\t//Bit 7\t-- 0 means the FAT is mirrored at runtime into all FATs.\r\n\t\t\t//       -- 1 means only one FAT is active; it is the one referenced in bits 0-3.\r\n\t\t\t//Bits 8-15 \t-- Reserved.\r\n\t\t\tu16 fat32Flags;//\tflags;\t\t/* bit 8: fat mirroring, low 4: active fat */\r\n\r\n\t\t\t//FAT32 version. High byte is major revision number.\r\n\t\t\t//Low byte is minor revision number. Only 0.0 define.\r\n\t\t\tu16 fat32Version;//version[2];\t/* major, minor filesystem version */\r\n\r\n\t\t\t//Cluster number of the first cluster of the root directory for FAT32.\r\n\t\t\t//This usually 2 but not required to be 2.\r\n\t\t\tu32 fat32RootCluster; //root_cluster;\t/* first cluster in root directory */\r\n\r\n\t\t\t//Sector number of FSINFO structure in the reserved area of the\r\n\t\t\t//FAT32 volume. Usually 1.\r\n\t\t\tu16 fat32FSInfo;//\tinfo_sector;\t/* filesystem info sector */\r\n\r\n\t\t\t//If non-zero, indicates the sector number in the reserved area\r\n\t\t\t//of the volume of a copy of the boot record. Usually 6.\r\n\t\t\t//No value other than 6 is recommended.\r\n\t\t\tu16 fat32BackBootBlock; //backup_boot;\t/* backup boot sector */\r\n\r\n\t\t\t//Reserved for future expansion. Code that formats FAT32 volumes\r\n\t\t\t//should always set all of the bytes of this field to 0.\r\n\t\t\tu8 fat32Reserved[12]; //reserved2[6];\t/* Unused */\r\n\t\t\t\r\n\t\t\tmsdos_volume_info vi;\r\n\r\n\t\t\tu8 boot_code[BOOTCODE_FAT32_SIZE];\r\n\t\t} fat32;\r\n\t};\r\n\r\n\tu8 boot_sign[2];\r\n};\r\n\r\n#include \"PACKED_END.h\"\r\n\r\n// End Of Chain values for FAT entries\r\n//FAT16 end of chain value used by Microsoft. \r\nstatic const u16 FAT16EOC = 0XFFFF;\r\n//Minimum value for FAT16 EOC.  Use to test for EOC. \r\nstatic const u16 FAT16EOC_MIN = 0XFFF8;\r\n//FAT32 end of chain value used by Microsoft. \r\nstatic const u32 FAT32EOC = 0X0FFFFFFF;\r\n//Minimum value for FAT32 EOC.  Use to test for EOC. \r\nstatic const u32 FAT32EOC_MIN = 0X0FFFFFF8;\r\n//Mask a for FAT32 entry. Entries are 28 bits. \r\nstatic const u32 FAT32MASK = 0X0FFFFFFF;\r\n\r\n//------------------------------------------------------------------------------\r\n\r\n\r\n//\\struct directoryEntry\r\n//\\brief FAT short directory entry\r\n//Short means short 8.3 name, not the entry size.\r\n// \r\n//Date Format. A FAT directory entry date stamp is a 16-bit field that is \r\n//basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the\r\n//format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the \r\n//16-bit word):\r\n//  \r\n//Bits 9-15: Count of years from 1980, valid value range 0-127 \r\n//inclusive (1980-2107).\r\n//  \r\n//Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive.\r\n//Bits 0-4: Day of month, valid value range 1-31 inclusive.\r\n//Time Format. A FAT directory entry time stamp is a 16-bit field that has\r\n//a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the \r\n//16-bit word, bit 15 is the MSB of the 16-bit word).\r\n//  \r\n//Bits 11-15: Hours, valid value range 0-23 inclusive.\r\n//\r\n//Bits 5-10: Minutes, valid value range 0-59 inclusive.\r\n//     \r\n//Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds).\r\n//  \r\n//The valid time range is from Midnight 00:00:00 to 23:59:58.\r\nstruct TDirectoryEntry {\r\n\t//Short 8.3 name.\r\n\t//The first eight bytes contain the file name with blank fill.\r\n\t//The last three bytes contain the file extension with blank fill.\r\n\r\n\tu8 name[11];\r\n\t//Entry attributes.\r\n\t//The upper two bits of the attribute byte are reserved and should\r\n\t//always be set to 0 when a file is created and never modified or\r\n\t//looked at after that.  See defines that begin with DIR_ATT_.\r\n\r\n\tu8  attributes;\r\n\r\n\t//Reserved for use by Windows NT. Set value to 0 when a file is\r\n\t//created and never modify or look at it after that.\r\n\r\n\tu8  reservedNT;\r\n\r\n\t//The granularity of the seconds part of creationTime is 2 seconds\r\n\t//so this field is a count of tenths of a second and its valid\r\n\t//value range is 0-199 inclusive. (WHG note - seems to be hundredths)\r\n\r\n\tu8  creationTimeTenths;\r\n\t//Time file was created. \r\n\tu16 creationTime;\r\n\t//Date file was created. \r\n\tu16 creationDate;\r\n\r\n\t//Last access date. Note that there is no last access time, only\r\n\t//a date.  This is the date of last read or write. In the case of\r\n\t//a write, this should be set to the same date as lastWriteDate.\r\n\r\n\tu16 lastAccessDate;\r\n\r\n\t//High word of this entry's first cluster number (always 0 for a\r\n\t//FAT12 or FAT16 volume).\r\n\r\n\tu16 firstClusterHigh;\r\n\t//Time of last write. File creation is considered a write. \r\n\tu16 lastWriteTime;\r\n\t// Date of last write. File creation is considered a write. \r\n\tu16 lastWriteDate;\r\n\t// Low word of this entry's first cluster number. \r\n\tu16 firstClusterLow;\r\n\t//32-bit unsigned holding this file's size in bytes. \r\n\tu32 fileSize;\r\n};\r\n\r\n//escape for name[0] = 0xE5 \r\nstatic const u8 DIR_NAME_0XE5 = 0x05;\r\n//name[0] value for entry that is free after being \"deleted\" \r\nstatic const u8 DIR_NAME_DELETED = 0xE5;\r\n//name[0] value for entry that is free and no allocated entries follow \r\nstatic const u8 DIR_NAME_FREE = 0x00;\r\n//file is read-only \r\nstatic const u8 DIR_ATT_READ_ONLY = 0x01;\r\n//File should hidden in directory listings \r\nstatic const u8 DIR_ATT_HIDDEN = 0x02;\r\n//Entry is for a system file \r\nstatic const u8 DIR_ATT_SYSTEM = 0x04;\r\n//Directory entry contains the volume label \r\nstatic const u8 DIR_ATT_VOLUME_ID = 0x08;\r\n//Entry is for a directory \r\nstatic const u8 DIR_ATT_DIRECTORY = 0x10;\r\n//Old DOS archive bit for backup support \r\nstatic const u8 DIR_ATT_ARCHIVE = 0x20;\r\n//Test value for long name entry.  Test is\r\n  //(d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. \r\nstatic const u8 DIR_ATT_LONG_NAME = 0x0F;\r\n//Test mask for long name entry \r\nstatic const u8 DIR_ATT_LONG_NAME_MASK = 0x3F;\r\n//defined attribute bits \r\nstatic const u8 DIR_ATT_DEFINED_BITS = 0x3F;\r\n//Directory entry is part of a long name \r\nstatic inline u8 DIR_IS_LONG_NAME(const TDirectoryEntry* dir) {\r\n  return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME;\r\n}\r\n//Mask for file/subdirectory tests \r\nstatic const u8 DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY);\r\n//Directory entry is for a file \r\nstatic inline u8 DIR_IS_FILE(const TDirectoryEntry* dir) {\r\n  return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0;\r\n}\r\n//Directory entry is for a subdirectory \r\nstatic inline u8 DIR_IS_SUBDIR(const TDirectoryEntry* dir) {\r\n  return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY;\r\n}\r\n//Directory entry is for a file or subdirectory \r\nstatic inline u8 DIR_IS_FILE_OR_SUBDIR(const TDirectoryEntry* dir) {\r\n  return (dir->attributes & DIR_ATT_VOLUME_ID) == 0;\r\n}\r\n\r\n// flags for timestamp\r\n/** set the file's last access date */\r\nstatic const u8 T_ACCESS = 1;\r\n/** set the file's creation date and time */\r\nstatic const u8 T_CREATE = 2;\r\n/** Set the file's write date and time */\r\nstatic const u8 T_WRITE = 4;\r\n// values for type_\r\n/** This SdFile has not been opened. */\r\nstatic const u8 FAT_FILE_TYPE_CLOSED = 0;\r\n/** SdFile for a file */\r\nstatic const u8 FAT_FILE_TYPE_NORMAL = 1;\r\n/** SdFile for a FAT16 root directory */\r\nstatic const u8 FAT_FILE_TYPE_ROOT16 = 2;\r\n/** SdFile for a FAT32 root directory */\r\nstatic const u8 FAT_FILE_TYPE_ROOT32 = 3;\r\n/** SdFile for a subdirectory */\r\nstatic const u8 FAT_FILE_TYPE_SUBDIR = 4;\r\n/** Test value for directory type */\r\nstatic const u8 FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16;\r\n\r\n/** date field for FAT directory entry */\r\nstatic inline u16 FAT_DATE(u16 year, u8 month, u8 day) {\r\n  return (year - 1980) << 9 | month << 5 | day;\r\n}\r\n/** year part of FAT directory date field */\r\nstatic inline u16 FAT_YEAR(u16 fatDate) {\r\n  return 1980 + (fatDate >> 9);\r\n}\r\n/** month part of FAT directory date field */\r\nstatic inline u8 FAT_MONTH(u16 fatDate) {\r\n  return (fatDate >> 5) & 0XF;\r\n}\r\n/** day part of FAT directory date field */\r\nstatic inline u8 FAT_DAY(u16 fatDate) {\r\n  return fatDate & 0X1F;\r\n}\r\n/** time field for FAT directory entry */\r\nstatic inline u16 FAT_TIME(u8 hour, u8 minute, u8 second) {\r\n  return hour << 11 | minute << 5 | second >> 1;\r\n}\r\n/** hour part of FAT directory time field */\r\nstatic inline u8 FAT_HOUR(u16 fatTime) {\r\n  return fatTime >> 11;\r\n}\r\n/** minute part of FAT directory time field */\r\nstatic inline u8 FAT_MINUTE(u16 fatTime) {\r\n  return(fatTime >> 5) & 0X3F;\r\n}\r\n/** second part of FAT directory time field */\r\nstatic inline u8 FAT_SECOND(u16 fatTime) {\r\n  return 2*(fatTime & 0X1F);\r\n}\r\n/** Default date for file timestamps is 1 Jan 2000 */\r\nstatic const u16 FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1;\r\n/** Default time for file timestamp is 1 am */\r\nstatic const u16 FAT_DEFAULT_TIME = (1 << 11);\r\n\r\n//------------------------------------------------------\r\n\r\nclass EmuFat;\r\nclass EmuFatVolume;\r\nclass EmuFatFile;\r\n\r\nunion cache_t {\r\n           /** Used to access cached file data blocks. */\r\n  u8  data[512];\r\n           /** Used to access cached FAT16 entries. */\r\n  u16 fat16[256];\r\n           /** Used to access cached FAT32 entries. */\r\n  u32 fat32[128];\r\n           /** Used to access cached directory entries. */\r\n  TDirectoryEntry    dir[16];\r\n           /** Used to access a cached MasterBoot Record. */\r\n  TMasterBootRecord    mbr;\r\n           /** Used to access to a cached FAT boot sector. */\r\n  TFat32BootSector    fbs;\r\n};\r\n\r\nclass EmuFatFile\r\n{\r\n public:\r\n  /** Create an instance of EmuFatFile. */\r\n  EmuFatFile() : type_(FAT_FILE_TYPE_CLOSED) {}\r\n\r\n  bool writeError;\r\n  void clearUnbufferedRead(void) {\r\n    flags_ &= ~F_FILE_UNBUFFERED_READ;\r\n  }\r\n  void setUnbufferedRead(void) {\r\n    if (isFile()) flags_ |= F_FILE_UNBUFFERED_READ;\r\n  }\r\n  u8 unbufferedRead(void) const {\r\n    return flags_ & F_FILE_UNBUFFERED_READ;\r\n  }\r\n\r\n  u8 close(void);\r\n  u8 contiguousRange(u32* bgnBlock, u32* endBlock);\r\n  u8 createContiguous(EmuFatFile* dirFile, const char* fileName, u32 size);\r\n  /** \\return The current cluster number for a file or directory. */\r\n  u32 curCluster(void) const {return curCluster_;}\r\n  /** \\return The current position for a file or directory. */\r\n  u32 curPosition(void) const {return curPosition_;}\r\n\r\n    u8 rmDir(void);\r\n\tu8 rmRfStar(void);\r\n  s16 read(void) {\r\n    u8 b;\r\n    return read(&b, 1) == 1 ? b : -1;\r\n  }\r\n  s32 read(void* buf, u32 nbyte);\r\n  s8 readDir(TDirectoryEntry* dir);\r\n  s32 write(const void* buf, u32 nbyte);\r\n\r\n  u8 openRoot(EmuFatVolume* vol);\r\n  u8 timestamp(u8 flag, u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second);\r\n  u8 sync(void);\r\n  u8 makeDir(EmuFatFile* dir, const char* dirName);\r\n  u8 open(EmuFatFile* dirFile, u16 index, u8 oflag);\r\n  u8 open(EmuFatFile* dirFile, const char* fileName, u8 oflag);\r\n  u8 remove(EmuFatFile* dirFile, const char* fileName);\r\n  u8 remove(void);\r\n  u8 dirEntry(TDirectoryEntry* dir);\r\n  u8 seekCur(u32 pos) {\r\n    return seekSet(curPosition_ + pos);\r\n  }\r\n  /**\r\n   *  Set the files current position to end of file.  Useful to position\r\n   *  a file for append. See seekSet().\r\n   */\r\n  u8 seekEnd(void) {return seekSet(fileSize_);}\r\n  u8 seekSet(u32 pos);\r\n\r\n  u8 type(void) const {return type_;}\r\n  u8 truncate(u32 size);\r\n\r\n  u32 dirBlock(void) const {return dirBlock_;}\r\n  /** \\return Index of this file's directory in the block dirBlock. */\r\n  u8 dirIndex(void) const {return dirIndex_;}\r\n  static void dirName(const TDirectoryEntry& dir, char* name);\r\n  /** \\return The total number of bytes in a file or directory. */\r\n  u32 fileSize(void) const {return fileSize_;}\r\n  /** \\return The first cluster number for a file or directory. */\r\n  u32 firstCluster(void) const {return firstCluster_;}\r\n  /** \\return True if this is a SdFile for a directory else false. */\r\n  u8 isDir(void) const {return type_ >= FAT_FILE_TYPE_MIN_DIR;}\r\n  /** \\return True if this is a SdFile for a file else false. */\r\n  u8 isFile(void) const {return type_ == FAT_FILE_TYPE_NORMAL;}\r\n  /** \\return True if this is a SdFile for an open file/directory else false. */\r\n  u8 isOpen(void) const {return type_ != FAT_FILE_TYPE_CLOSED;}\r\n  /** \\return True if this is a SdFile for a subdirectory else false. */\r\n  u8 isSubDir(void) const {return type_ == FAT_FILE_TYPE_SUBDIR;}\r\n  /** \\return True if this is a SdFile for the root directory. */\r\n  u8 isRoot(void) const {\r\n    return type_ == FAT_FILE_TYPE_ROOT16 || type_ == FAT_FILE_TYPE_ROOT32;\r\n  }\r\n\r\n  /** Set the file's current position to zero. */\r\n  void rewind(void) {\r\n    curPosition_ = curCluster_ = 0;\r\n  }\r\n\r\n\r\nprivate:\r\n  // bits defined in flags_\r\n  // should be 0XF\r\n  static const u8 F_OFLAG = (EO_ACCMODE | EO_APPEND | EO_SYNC);\r\n  // available bits\r\n  static const u8 F_UNUSED = 0x30;\r\n  // use unbuffered SD read\r\n  static const u8 F_FILE_UNBUFFERED_READ = 0X40;\r\n  // sync of directory entry required\r\n  static const u8 F_FILE_DIR_DIRTY = 0x80;\r\n// make sure F_OFLAG is ok\r\n\r\n  void ctassert()\r\n  {\r\n\t  CTASSERT(!((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG));\r\n  }\r\n\r\n  // private data\r\n  u8   flags_;         // See above for definition of flags_ bits\r\n  u8   type_;          // type of file see above for values\r\n  u32  curCluster_;    // cluster for current file position\r\n  u32  curPosition_;   // current file position in bytes from beginning\r\n  u32  dirBlock_;      // SD block that contains directory entry for file\r\n  u8   dirIndex_;      // index of entry in dirBlock 0 <= dirIndex_ <= 0XF\r\n  u32  fileSize_;      // file size in bytes\r\n  u32  firstCluster_;  // first cluster of file\r\n  EmuFatVolume* vol_;           // volume where file is located\r\n\r\n  // private functions\r\n  u8 addCluster(void);\r\n  u8 addDirCluster(void);\r\n  TDirectoryEntry* cacheDirEntry(u8 action);\r\n  static u8 make83Name(const char* str, u8* name);\r\n  u8 openCachedEntry(u8 cacheIndex, u8 oflags);\r\n  TDirectoryEntry* readDirCache(void);\r\n};\r\n\r\nclass EmuFatVolume\r\n{\r\npublic:\r\n\tEmuFatVolume() :allocSearchStart_(2), fatType_(0) {}\r\n\r\n   //Initialize a FAT volume.  Try partition one first then try super floppy format.\r\n   //dev The Sd2Card where the volume is located.\r\n   //return The value one, true, is returned for success and\r\n   //the value zero, false, is returned for failure.  Reasons for\r\n   //failure include not finding a valid partition, not finding a valid\r\n   //FAT file system or an I/O error.\r\n  bool init(EmuFat* dev) { return init(dev, 1) ? true : init(dev, 0);}\r\n  bool init(EmuFat* dev, u8 part);\r\n\r\n  bool format(u32 sectors);\r\n  bool formatNew(u32 sectors);\r\n\r\n  // inline functions that return volume info\r\n  //The volume's cluster size in blocks.\r\n  u8 blocksPerCluster(void) const {return blocksPerCluster_;}\r\n\t//The number of blocks in one FAT.\r\n  u32 blocksPerFat(void)  const {return blocksPerFat_;}\r\n //The total number of clusters in the volume. //\r\n  u32 clusterCount(void) const {return clusterCount_;}\r\n  //The shift count required to multiply by blocksPerCluster. //\r\n  u8 clusterSizeShift(void) const {return clusterSizeShift_;}\r\n  //The logical block number for the start of file data. //\r\n  u32 dataStartBlock(void) const {return dataStartBlock_;}\r\n  //The number of FAT structures on the volume. //\r\n  u8 fatCount(void) const {return fatCount_;}\r\n  //The logical block number for the start of the first FAT. //\r\n  u32 fatStartBlock(void) const {return fatStartBlock_;}\r\n  //The FAT type of the volume. Values are 12, 16 or 32. //\r\n  u8 fatType(void) const {return fatType_;}\r\n  //The number of entries in the root directory for FAT16 volumes. //\r\n  u32 rootDirEntryCount(void) const {return rootDirEntryCount_;}\r\n  //The logical block number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes. //\r\n  u32 rootDirStart(void) const {return rootDirStart_;}\r\n\r\n  EmuFat* dev_;\r\n\r\n\r\nprivate:\r\n  friend class EmuFatFile;\r\n\r\n  u32 allocSearchStart_;   // start cluster for alloc search\r\n  u8 blocksPerCluster_;    // cluster size in blocks\r\n  u32 blocksPerFat_;       // FAT size in blocks\r\n  u32 clusterCount_;       // clusters in one FAT\r\n  u8 clusterSizeShift_;    // shift to convert cluster count to block count\r\n  u32 dataStartBlock_;     // first data block number\r\n  u8 fatCount_;            // number of FATs on volume\r\n  u32 fatStartBlock_;      // start block for first FAT\r\n  u8 fatType_;             // volume type (12, 16, OR 32)\r\n  u16 rootDirEntryCount_;  // number of entries in FAT16 root dir\r\n  u32 rootDirStart_;       // root start block for FAT16, cluster for FAT32\r\n\r\n\tu8 allocContiguous(u32 count, u32* curCluster);\r\n  u8 blockOfCluster(u32 position) const {\r\n          return (position >> 9) & (blocksPerCluster_ - 1);}\r\n  u32 clusterStartBlock(u32 cluster) const {\r\n           return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);}\r\n  u32 blockNumber(u32 cluster, u32 position) const {\r\n           return clusterStartBlock(cluster) + blockOfCluster(position);}\r\n  u8 fatGet(u32 cluster, u32* value) const;\r\n  u8 fatPut(u32 cluster, u32 value);\r\n  u8 fatPutEOC(u32 cluster) {\r\n    return fatPut(cluster, 0x0FFFFFFF);\r\n  }\r\n  u8 chainSize(u32 beginCluster, u32* size) const;\r\n  u8 freeChain(u32 cluster);\r\n  u8 isEOC(u32 cluster) const {\r\n    return  cluster >= (fatType_ == 16 ? FAT16EOC_MIN : FAT32EOC_MIN);\r\n  }\r\n  u8 readData(u32 block, u16 offset, u16 count, u8* dst);\r\n   u8 writeBlock(u32 block, const u8* dst);\r\n\r\n};\r\n\r\nclass EmuFat\r\n{\r\npublic:\r\n\tEmuFat(const char* fname, bool readonly=false);\r\n\tEmuFat();\r\n\tEmuFat(EMUFILE* fileNotToDelete);\r\n\tvirtual ~EmuFat();\r\n\r\nprivate:\r\n\tEMUFILE* m_pFile;\r\n\tbool m_readonly, m_owns;\r\n\r\n\tfriend class EmuFatVolume;\r\n\tfriend class EmuFatFile;\r\n\r\n  // value for action argument in cacheRawBlock to indicate read from cache\r\n  static const u8 CACHE_FOR_READ = 0;\r\n  // value for action argument in cacheRawBlock to indicate cache dirty\r\n  static const u8 CACHE_FOR_WRITE = 1;\r\n\r\n  struct Cache\r\n  {\r\n\t  Cache()\r\n\t\t  : cacheBlockNumber_(0xFFFFFFFF)\r\n\t\t  , cacheDirty_(0)  // cacheFlush() will write block if true\r\n\t\t  , cacheMirrorBlock_(0)  // mirror  block for second FAT\r\n\t  {}\r\n\r\n\t  cache_t cacheBuffer_;        // 512 byte cache for device blocks\r\n\t  u32 cacheBlockNumber_;  // Logical number of block in the cache\r\n\t  u8 cacheDirty_;         // cacheFlush() will write block if true\r\n\t  u32 cacheMirrorBlock_;  // block number for mirror FAT\r\n  } cache_;\r\n\r\n  u8 cacheRawBlock(u32 blockNumber, u8 action);\r\n  void cacheSetDirty() {cache_.cacheDirty_ |= CACHE_FOR_WRITE;}\r\n  u8 cacheZeroBlock(u32 blockNumber);\r\n  u8 cacheFlush();\r\n  void cacheReset();\r\n\r\n  //IO functions:\r\n  u8 readBlock(u32 block, u8* dst);\r\n  u8 writeBlock(u32 blockNumber, const u8* src);\r\n  u8 readData(u32 block, u16 offset, u16 count, u8* dst);\r\n\r\n  void truncate(u32 size);\r\n};\r\n\r\n#endif //EMUFAT_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/emufat_types.h",
    "content": "#ifndef EMUFAT_TYPES_H\r\n#define EMUFAT_TYPES_H\r\n\r\n#include \"types.h\"\r\n\r\n#endif //EMUFAT_TYPES_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/guid.cpp",
    "content": "/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <stdlib.h>\n#include \"guid.h\"\n#include \"../types.h\"\n\nvoid Desmume_Guid::newGuid()\n{\n\tfor(int i=0;i<size;i++)\n\t\tdata[i] = rand();\n}\n\nstd::string Desmume_Guid::toString()\n{\n\tchar buf[37];\n\tsprintf(buf,\"%08X-%04X-%04X-%04X-%02X%02X%02X%02X%02X%02X\",\n\t\tde32lsb(data),de16lsb(data+4),de16lsb(data+6),de16lsb(data+8),data[10],data[11],data[12],data[13],data[14],data[15]);\n\treturn std::string(buf);\n}\n\nDesmume_Guid Desmume_Guid::fromString(std::string str)\n{\n\tDesmume_Guid ret;\n\tret.scan(str);\n\treturn ret;\n}\n\nuint8 Desmume_Guid::hexToByte(char** ptrptr)\n{\n\tchar a = toupper(**ptrptr);\n\t(*ptrptr)++;\n\tchar b = toupper(**ptrptr);\n\t(*ptrptr)++;\n\tif(a>='A') a=a-'A'+10;\n\telse a-='0';\n\tif(b>='A') b=b-'A'+10;\n\telse b-='0';\n\treturn ((unsigned char)a<<4)|(unsigned char)b;\n}\n\nvoid Desmume_Guid::scan(std::string& str)\n{\n\tchar* endptr = (char*)str.c_str();\n\ten32lsb(data,strtoul(endptr,&endptr,16));\n\ten16lsb(data+4,(u16)strtoul(endptr+1,&endptr,16));\n\ten16lsb(data+6,(u16)strtoul(endptr+1,&endptr,16));\n\ten16lsb(data+8,(u16)strtoul(endptr+1,&endptr,16));\n\tendptr++;\n\tfor(int i=0;i<6;i++)\n\t\tdata[10+i] = hexToByte(&endptr);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/guid.h",
    "content": "/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _guid_h_\n#define _guid_h_\n\n#include <string>\n#include <cstdio>\n#include \"../types.h\"\n#include \"valuearray.h\"\n\nstruct Desmume_Guid : public ValueArray<u8,16>\n{\n\tvoid newGuid();\n\tstd::string toString();\n\tstatic Desmume_Guid fromString(std::string str);\n\tstatic uint8 hexToByte(char** ptrptr);\n\tvoid scan(std::string& str);\n};\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/bit_ops.h",
    "content": "/*\n bit_ops.h\n Functions for dealing with conversion of data between types\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _BIT_OPS_H\n#define _BIT_OPS_H\n\n#ifndef _MSC_VER\n#include <stdint.h>\n#endif\n\n/*-----------------------------------------------------------------\nFunctions to deal with little endian values stored in uint8_t arrays\n-----------------------------------------------------------------*/\nstatic inline uint16_t u8array_to_u16 (const uint8_t* item, int offset) {\n\treturn ( item[offset] | (item[offset + 1] << 8));\n}\n\nstatic inline uint32_t u8array_to_u32 (const uint8_t* item, int offset) {\n\treturn ( item[offset] | (item[offset + 1] << 8) | (item[offset + 2] << 16) | (item[offset + 3] << 24));\n}\n\nstatic inline void u16_to_u8array (uint8_t* item, int offset, uint16_t value) {\n\titem[offset]     = (uint8_t) value;\n\titem[offset + 1] = (uint8_t)(value >> 8);\n}\n\nstatic inline void u32_to_u8array (uint8_t* item, int offset, uint32_t value) {\n\titem[offset]     = (uint8_t) value;\n\titem[offset + 1] = (uint8_t)(value >> 8);\n\titem[offset + 2] = (uint8_t)(value >> 16);\n\titem[offset + 3] = (uint8_t)(value >> 24);\n}\n\n#endif // _BIT_OPS_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/cache.cpp",
    "content": "/*\n cache.c\n The cache is not visible to the user. It should be flushed\n when any file is closed or changes are made to the filesystem.\n\n This cache implements a least-used-page replacement policy. This will\n distribute sectors evenly over the pages, so if less than the maximum\n pages are used at once, they should all eventually remain in the cache.\n This also has the benefit of throwing out old sectors, so as not to keep\n too many stale pages around.\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <string.h>\n#include <limits.h>\n\n#include \"common.h\"\n#include \"cache.h\"\n#include \"disc.h\"\n\n#include \"mem_allocate.h\"\n#include \"bit_ops.h\"\n#include \"file_allocation_table.h\"\n\n#define CACHE_FREE UINT_MAX\n\nCACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition) {\n\tCACHE* cache;\n\tunsigned int i;\n\tCACHE_ENTRY* cacheEntries;\n\n\tif (numberOfPages < 2) {\n\t\tnumberOfPages = 2;\n\t}\n\n\tif (sectorsPerPage < 8) {\n\t\tsectorsPerPage = 8;\n\t}\n\n\tcache = (CACHE*) _FAT_mem_allocate (sizeof(CACHE));\n\tif (cache == NULL) {\n\t\treturn NULL;\n\t}\n\n\tcache->disc = discInterface;\n\tcache->endOfPartition = endOfPartition;\n\tcache->numberOfPages = numberOfPages;\n\tcache->sectorsPerPage = sectorsPerPage;\n\n\n\tcacheEntries = (CACHE_ENTRY*) _FAT_mem_allocate ( sizeof(CACHE_ENTRY) * numberOfPages);\n\tif (cacheEntries == NULL) {\n\t\t_FAT_mem_free (cache);\n\t\treturn NULL;\n\t}\n\n\tfor (i = 0; i < numberOfPages; i++) {\n\t\tcacheEntries[i].sector = CACHE_FREE;\n\t\tcacheEntries[i].count = 0;\n\t\tcacheEntries[i].last_access = 0;\n\t\tcacheEntries[i].dirty = false;\n\t\tcacheEntries[i].cache = (uint8_t*) _FAT_mem_align ( sectorsPerPage * BYTES_PER_READ );\n\t}\n\n\tcache->cacheEntries = cacheEntries;\n\n\treturn cache;\n}\n\nvoid _FAT_cache_destructor (CACHE* cache) {\n\tunsigned int i;\n\t// Clear out cache before destroying it\n\t_FAT_cache_flush(cache);\n\n\t// Free memory in reverse allocation order\n\tfor (i = 0; i < cache->numberOfPages; i++) {\n\t\t_FAT_mem_free (cache->cacheEntries[i].cache);\n\t}\n\t_FAT_mem_free (cache->cacheEntries);\n\t_FAT_mem_free (cache);\n}\n\n\nstatic u32 accessCounter = 0;\n\nstatic u32 accessTime(){\n\taccessCounter++;\n\treturn accessCounter;\n}\n\n\nstatic CACHE_ENTRY* _FAT_cache_getPage(CACHE *cache,sec_t sector)\n{\n\tunsigned int i;\n\tCACHE_ENTRY* cacheEntries = cache->cacheEntries;\n\tunsigned int numberOfPages = cache->numberOfPages;\n\tunsigned int sectorsPerPage = cache->sectorsPerPage;\n\n\tbool foundFree = false;\n\tunsigned int oldUsed = 0;\n\tunsigned int oldAccess = UINT_MAX;\n\n\tfor(i=0;i<numberOfPages;i++) {\n\t\tif(sector>=cacheEntries[i].sector && sector<(cacheEntries[i].sector + cacheEntries[i].count)) {\n\t\t\tcacheEntries[i].last_access = accessTime();\n\t\t\treturn &(cacheEntries[i]);\n\t\t}\n\t\t\n\t\tif(foundFree==false && (cacheEntries[i].sector==CACHE_FREE || cacheEntries[i].last_access<oldAccess)) {\n\t\t\tif(cacheEntries[i].sector==CACHE_FREE) foundFree = true;\n\t\t\toldUsed = i;\n\t\t\toldAccess = cacheEntries[i].last_access;\n\t\t}\n\t}\n\n\tif(foundFree==false && cacheEntries[oldUsed].dirty==true) {\n\t\tif(!_FAT_disc_writeSectors(cache->disc,cacheEntries[oldUsed].sector,cacheEntries[oldUsed].count,cacheEntries[oldUsed].cache)) return NULL;\n\t\tcacheEntries[oldUsed].dirty = false;\n\t}\n\n\tsector = (sector/sectorsPerPage)*sectorsPerPage; // align base sector to page size\n\tsec_t next_page = sector + sectorsPerPage;\n\tif(next_page > cache->endOfPartition)\tnext_page = cache->endOfPartition;\n\n\tif(!_FAT_disc_readSectors(cache->disc,sector,next_page-sector,cacheEntries[oldUsed].cache)) return NULL;\n\n\tcacheEntries[oldUsed].sector = sector;\n\tcacheEntries[oldUsed].count = next_page-sector;\n\tcacheEntries[oldUsed].last_access = accessTime();\n\n\treturn &(cacheEntries[oldUsed]);\n}\n\nbool _FAT_cache_readSectors(CACHE *cache,sec_t sector,sec_t numSectors,void *buffer)\n{\n\tsec_t sec;\n\tsec_t secs_to_read;\n\tCACHE_ENTRY *entry;\n\tuint8_t *dest = (uint8_t *)buffer;\n\n\twhile(numSectors>0) {\n\t\tentry = _FAT_cache_getPage(cache,sector);\n\t\tif(entry==NULL) return false;\n\n\t\tsec = sector - entry->sector;\n\t\tsecs_to_read = entry->count - sec;\n\t\tif(secs_to_read>numSectors) secs_to_read = numSectors;\n\n\t\tmemcpy(dest,entry->cache + (sec*BYTES_PER_READ),(secs_to_read*BYTES_PER_READ));\n\n\t\tdest += (secs_to_read*BYTES_PER_READ);\n\t\tsector += secs_to_read;\n\t\tnumSectors -= secs_to_read;\n\t}\n\n\treturn true;\n}\n\n/*\nReads some data from a cache page, determined by the sector number\n*/\nbool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size) \n{\n\tsec_t sec;\n\tCACHE_ENTRY *entry;\n\n\tif (offset + size > BYTES_PER_READ) return false;\n\n\tentry = _FAT_cache_getPage(cache,sector);\n\tif(entry==NULL) return false;\n\n\tsec = sector - entry->sector;\n\tmemcpy(buffer,entry->cache + ((sec*BYTES_PER_READ) + offset),size);\n\n\treturn true;\n}\n\nbool _FAT_cache_readLittleEndianValue (CACHE* cache, uint32_t *value, sec_t sector, unsigned int offset, int num_bytes) {\n  uint8_t buf[4];\n  if (!_FAT_cache_readPartialSector(cache, buf, sector, offset, num_bytes)) return false;\n\n  switch(num_bytes) {\n  case 1: *value = buf[0]; break;\n  case 2: *value = u8array_to_u16(buf,0); break;\n  case 4: *value = u8array_to_u32(buf,0); break;\n  default: return false;\n  }\n  return true;\n}\n\n/*\nWrites some data to a cache page, making sure it is loaded into memory first.\n*/\nbool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size) \n{\n\tsec_t sec;\n\tCACHE_ENTRY *entry;\n\n\tif (offset + size > BYTES_PER_READ) return false;\n\n\tentry = _FAT_cache_getPage(cache,sector);\n\tif(entry==NULL) return false;\n\n\tsec = sector - entry->sector;\n\tmemcpy(entry->cache + ((sec*BYTES_PER_READ) + offset),buffer,size);\n\n\tentry->dirty = true;\n\treturn true;\n}\n\nbool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_t sector, unsigned int offset, int size) {\n  uint8_t buf[4] = {0, 0, 0, 0};\n\n  switch(size) {\n  case 1: buf[0] = value; break;\n  case 2: u16_to_u8array(buf, 0, value); break;\n  case 4: u32_to_u8array(buf, 0, value); break;\n  default: return false;\n  }\n\n  return _FAT_cache_writePartialSector(cache, buf, sector, offset, size);\n}\n\n/*\nWrites some data to a cache page, zeroing out the page first\n*/\nbool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size) \n{\n\tsec_t sec;\n\tCACHE_ENTRY *entry;\n\n\tif (offset + size > BYTES_PER_READ) return false;\n\n\tentry = _FAT_cache_getPage(cache,sector);\n\tif(entry==NULL) return false;\n\n\tsec = sector - entry->sector;\n\tmemset(entry->cache + (sec*BYTES_PER_READ),0,BYTES_PER_READ);\n\tmemcpy(entry->cache + ((sec*BYTES_PER_READ) + offset),buffer,size);\n\n\tentry->dirty = true;\n\treturn true;\n}\n\n\nstatic CACHE_ENTRY* _FAT_cache_findPage(CACHE *cache, sec_t sector, sec_t count) {\n\n\tunsigned int i;\n\tCACHE_ENTRY* cacheEntries = cache->cacheEntries;\n\tunsigned int numberOfPages = cache->numberOfPages;\n\tCACHE_ENTRY *entry = NULL;\n\tsec_t\tlowest = UINT_MAX;\n\n\tfor(i=0;i<numberOfPages;i++) {\n\t\tif (cacheEntries[i].sector != CACHE_FREE) {\n\t\t\tbool intersect;\n\t\t\tif (sector > cacheEntries[i].sector) {\n\t\t\t\tintersect = sector - cacheEntries[i].sector < cacheEntries[i].count;\n\t\t\t} else {\n\t\t\t\tintersect = cacheEntries[i].sector - sector < count;\n\t\t\t}\n\n\t\t\tif ( intersect && (cacheEntries[i].sector < lowest)) {\n\t\t\t\tlowest = cacheEntries[i].sector;\n\t\t\t\tentry = &cacheEntries[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn entry;\n}\n\nbool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer) \n{\n\tsec_t sec;\n\tsec_t secs_to_write;\n\tCACHE_ENTRY* entry;\n\tconst uint8_t *src = (const uint8_t *)buffer;\n\n\twhile(numSectors>0)\n\t{\n\t\tentry = _FAT_cache_findPage(cache,sector,numSectors);\n\n\t\tif(entry!=NULL) {\n\n\t\t\tif ( entry->sector > sector) {\n\t\t\t\t\n\t\t\t\tsecs_to_write = entry->sector - sector;\n\t\t\t\t\n\t\t\t\t_FAT_disc_writeSectors(cache->disc,sector,secs_to_write,src);\n\t\t\t\tsrc += (secs_to_write*BYTES_PER_READ);\n\t\t\t\tsector += secs_to_write;\n\t\t\t\tnumSectors -= secs_to_write;\n\t\t\t}\n\t\t\t\t\n\t\t\tsec = sector - entry->sector;\n\t\t\tsecs_to_write = entry->count - sec;\n\n\t\t\tif(secs_to_write>numSectors) secs_to_write = numSectors;\n\n\t\t\tmemcpy(entry->cache + (sec*BYTES_PER_READ),src,(secs_to_write*BYTES_PER_READ));\n\n\t\t\tsrc += (secs_to_write*BYTES_PER_READ);\n\t\t\tsector += secs_to_write;\n\t\t\tnumSectors -= secs_to_write;\n\n\t\t\tentry->dirty = true;\n\t\t\t\t\n\t\t} else {\n\t\t\t_FAT_disc_writeSectors(cache->disc,sector,numSectors,src);\n\t\t\tnumSectors=0;\n\t\t}\n\t}\n\treturn true;\n}\n\n/*\nFlushes all dirty pages to disc, clearing the dirty flag.\n*/\nbool _FAT_cache_flush (CACHE* cache) {\n\tunsigned int i;\n\n\tfor (i = 0; i < cache->numberOfPages; i++) {\n\t\tif (cache->cacheEntries[i].dirty) {\n\t\t\tif (!_FAT_disc_writeSectors (cache->disc, cache->cacheEntries[i].sector, cache->cacheEntries[i].count, cache->cacheEntries[i].cache)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tcache->cacheEntries[i].dirty = false;\n\t}\n\n\treturn true;\n}\n\nvoid _FAT_cache_invalidate (CACHE* cache) {\n\tunsigned int i;\n\t_FAT_cache_flush(cache);\n\tfor (i = 0; i < cache->numberOfPages; i++) {\n\t\tcache->cacheEntries[i].sector = CACHE_FREE;\n\t\tcache->cacheEntries[i].last_access = 0;\n\t\tcache->cacheEntries[i].count = 0;\n\t\tcache->cacheEntries[i].dirty = false;\n\t}\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/cache.h",
    "content": "/*\n cache.h\n The cache is not visible to the user. It should be flushed\n when any file is closed or changes are made to the filesystem.\n\n This cache implements a least-used-page replacement policy. This will\n distribute sectors evenly over the pages, so if less than the maximum\n pages are used at once, they should all eventually remain in the cache.\n This also has the benefit of throwing out old sectors, so as not to keep\n too many stale pages around.\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _CACHE_H\n#define _CACHE_H\n\n#include \"common.h\"\n#include \"disc.h\"\n\n#define PAGE_SECTORS 64\n#define CACHE_PAGE_SIZE (BYTES_PER_READ * PAGE_SECTORS)\n\ntypedef struct {\n\tsec_t        sector;\n\tunsigned int count;\n\tunsigned int last_access;\n\tbool         dirty;\n\tuint8_t*     cache;\n} CACHE_ENTRY;\n\ntypedef struct {\n\tconst DISC_INTERFACE* disc;\n\tsec_t\t\t          endOfPartition;\n\tunsigned int          numberOfPages;\n\tunsigned int          sectorsPerPage;\n\tCACHE_ENTRY*          cacheEntries;\n} CACHE;\n\n/*\nRead data from a sector in the cache\nIf the sector is not in the cache, it will be swapped in\noffset is the position to start reading from\nsize is the amount of data to read\nPrecondition: offset + size <= BYTES_PER_READ\n*/\nbool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size);\n\nbool _FAT_cache_readLittleEndianValue (CACHE* cache, uint32_t *value, sec_t sector, unsigned int offset, int num_bytes);\n\n/*\nWrite data to a sector in the cache\nIf the sector is not in the cache, it will be swapped in.\nWhen the sector is swapped out, the data will be written to the disc\noffset is the position to start writing to\nsize is the amount of data to write\nPrecondition: offset + size <= BYTES_PER_READ\n*/\nbool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size);\n\nbool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_t sector, unsigned int offset, int num_bytes);\n\n/*\nWrite data to a sector in the cache, zeroing the sector first\nIf the sector is not in the cache, it will be swapped in.\nWhen the sector is swapped out, the data will be written to the disc\noffset is the position to start writing to\nsize is the amount of data to write\nPrecondition: offset + size <= BYTES_PER_READ\n*/\nbool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size);\n\n/*\nRead several sectors from the cache\n*/\nbool _FAT_cache_readSectors (CACHE* cache, sec_t sector, sec_t numSectors, void* buffer);\n\n/*\nRead a full sector from the cache\n*/\nstatic inline bool _FAT_cache_readSector (CACHE* cache, void* buffer, sec_t sector) {\n\treturn _FAT_cache_readPartialSector (cache, buffer, sector, 0, BYTES_PER_READ);\n}\n\n/*\nWrite a full sector to the cache\n*/\nstatic inline bool _FAT_cache_writeSector (CACHE* cache, const void* buffer, sec_t sector) {\n\treturn _FAT_cache_writePartialSector (cache, buffer, sector, 0, BYTES_PER_READ);\n}\n\nbool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer);\n\n/*\nWrite any dirty sectors back to disc and clear out the contents of the cache\n*/\nbool _FAT_cache_flush (CACHE* cache);\n\n/*\nClear out the contents of the cache without writing any dirty sectors first\n*/\nvoid _FAT_cache_invalidate (CACHE* cache);\n\nCACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition);\n\nvoid _FAT_cache_destructor (CACHE* cache);\n\n#endif // _CACHE_H\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/common.h",
    "content": "/*\n common.h\n Common definitions and included files for the FATlib\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _COMMON_H\n#define _COMMON_H\n\n#define BYTES_PER_READ 512\n#include <stddef.h>\n#ifndef _MSC_VER\n#include <stdint.h>\n#endif\n\n// When compiling for NDS, make sure NDS is defined\n#ifndef NDS\n #if defined ARM9 || defined ARM7\n  #define NDS\n #endif\n#endif\n\n// Platform specific includes\n#if defined(__gamecube__) || defined (__wii__)\n   #include <gctypes.h>\n   #include <ogc/disc_io.h>\n   #include <gccore.h>\n#elif defined(NDS)\n   #include <nds/ndstypes.h>\n   #include <nds/system.h>\n   #include <nds/disc_io.h>\n#elif defined(GBA)\n   #include <gba_types.h>\n   #include <disc_io.h>\n#endif\n\n// Platform specific options\n#if   defined (__wii__)\n   #define DEFAULT_CACHE_PAGES 4\n   #define DEFAULT_SECTORS_PAGE 64\n   #define USE_LWP_LOCK\n   #define USE_RTC_TIME\n#elif defined (__gamecube__)\n   #define DEFAULT_CACHE_PAGES 4\n   #define DEFAULT_SECTORS_PAGE 64\n   #define USE_LWP_LOCK\n   #define USE_RTC_TIME\n#elif defined (NDS)\n   #define DEFAULT_CACHE_PAGES 4\n   #define DEFAULT_SECTORS_PAGE 8\n   #define USE_RTC_TIME\n#elif defined (GBA)\n   #define DEFAULT_CACHE_PAGES 2\n   #define DEFAULT_SECTORS_PAGE 8\n   #define LIMIT_SECTORS 128\n#else\n   #define LIBFAT_PC 1\n\n\t//any particular reason for this?\n   #define DEFAULT_CACHE_PAGES 4\n   #define DEFAULT_SECTORS_PAGE 8\n#endif\n\n#include \"libfat_pc.h\"\n\n#include \"fat.h\"\n\n#endif // _COMMON_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/directory.cpp",
    "content": "/*\n directory.c\n Reading, writing and manipulation of the directory structure on\n a FAT partition\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <string.h>\n#include <ctype.h>\n#include <wchar.h>\n#include <wctype.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n#include \"directory.h\"\n#include \"common.h\"\n#include \"partition.h\"\n#include \"file_allocation_table.h\"\n#include \"bit_ops.h\"\n#include \"filetime.h\"\n\n#ifdef __APPLE__\n#include <AvailabilityMacros.h>\n\n#ifndef MAC_OS_X_VERSION_10_7\n// In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here.\nstatic size_t strnlen(const char *s, size_t n)\n{\n\tconst char *p = (const char *)memchr(s, 0, n);\n\treturn(p ? p-s : n);\n}\n#endif\n\n#endif // __APPLE__\n\n// Directory entry codes\n#define DIR_ENTRY_LAST 0x00\n#define DIR_ENTRY_FREE 0xE5\n\n#define LAST_LFN_POS (19*13)\n#define LAST_LFN_POS_CORRECTION (MAX_LFN_LENGTH-15)\n\ntypedef unsigned short ucs2_t;\n\n// Long file name directory entry\nenum LFN_offset {\n\tLFN_offset_ordinal = 0x00,\t// Position within LFN\n\tLFN_offset_char0 = 0x01,\t\n\tLFN_offset_char1 = 0x03,\n\tLFN_offset_char2 = 0x05,\n\tLFN_offset_char3 = 0x07,\n\tLFN_offset_char4 = 0x09,\n\tLFN_offset_flag = 0x0B,\t// Should be equal to ATTRIB_LFN\n\tLFN_offset_reserved1 = 0x0C,\t// Always 0x00\n\tLFN_offset_checkSum = 0x0D,\t// Checksum of short file name (alias)\n\tLFN_offset_char5 = 0x0E,\n\tLFN_offset_char6 = 0x10,\n\tLFN_offset_char7 = 0x12,\n\tLFN_offset_char8 = 0x14,\n\tLFN_offset_char9 = 0x16,\n\tLFN_offset_char10 = 0x18,\n\tLFN_offset_reserved2 = 0x1A,\t// Always 0x0000\n\tLFN_offset_char11 = 0x1C,\n\tLFN_offset_char12 = 0x1E\n};\nstatic const int LFN_offset_table[13]={0x01,0x03,0x05,0x07,0x09,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E}; \n\n#define LFN_END 0x40\n#define LFN_DEL 0x80\n\nstatic const char ILLEGAL_ALIAS_CHARACTERS[] = \"\\\\/:;*?\\\"<>|&+,=[] \";\nstatic const char ILLEGAL_LFN_CHARACTERS[] = \"\\\\/:*?\\\"<>|\";\n\n/* \nReturns number of UCS-2 characters needed to encode an LFN\nReturns -1 if it is an invalid LFN\n*/\n#define ABOVE_UCS_RANGE 0xF0\nstatic int _FAT_directory_lfnLength (const char* name) {\n\tunsigned int i;\n\tsize_t nameLength;\n\tint ucsLength;\n\tconst char* tempName = name;\n\t\n\tnameLength = strnlen(name, MAX_FILENAME_LENGTH);\n\t// Make sure the name is short enough to be valid\n\tif ( nameLength >= MAX_FILENAME_LENGTH) {\n\t\treturn -1;\n\t}\n\t// Make sure it doesn't contain any invalid characters\n\tif (strpbrk (name, ILLEGAL_LFN_CHARACTERS) != NULL) {\n\t\treturn -1;\n\t}\n\t// Make sure the name doesn't contain any control codes or codes not representable in UCS-2\n\tfor (i = 0; i < nameLength; i++) {\n\t\tif (name[i] < 0x20 || name[i] >= ABOVE_UCS_RANGE) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\t// Convert to UCS-2 and get the resulting length\n\tucsLength = mbsrtowcs(NULL, &tempName, MAX_LFN_LENGTH, NULL);\n\tif (ucsLength < 0 || ucsLength >= MAX_LFN_LENGTH) {\n\t\treturn -1;\n\t}\n\t\n\t// Otherwise it is valid\n\treturn ucsLength;\n}\n\n/*\nConvert a multibyte encoded string into a NUL-terminated UCS-2 string, storing at most len characters\nreturn number of characters stored\n*/\nstatic size_t _FAT_directory_mbstoucs2 (ucs2_t* dst, const char* src, size_t len) {\n\tmbstate_t ps = {0};\n\twchar_t tempChar;\n\tint bytes;\n\tsize_t count = 0;\n\n\twhile (count < len-1 && src != '\\0') {\n\t\tbytes = mbrtowc (&tempChar, src, MB_CUR_MAX, &ps);\n\t\tif (bytes > 0) {\n\t\t\t*dst = (ucs2_t)tempChar;\n\t\t\tsrc += bytes;\n\t\t\tdst++;\n\t\t\tcount++;\n\t\t} else if (bytes == 0) {\n\t\t\tbreak;\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\t*dst = '\\0';\n\n\treturn count;\n}\n\n/*\nConvert a UCS-2 string into a NUL-terminated multibyte string, storing at most len chars\nreturn number of chars stored, or (size_t)-1 on error\n*/\nstatic size_t _FAT_directory_ucs2tombs (char* dst, const ucs2_t* src, size_t len) {\n\tmbstate_t ps = {0};\n\tsize_t count = 0;\n\tint bytes;\n\tchar* buff = (char*)alloca(MB_CUR_MAX);\n\tint i;\n\t\n\twhile (count < len - 1 && *src != '\\0') {\n\t\tbytes = wcrtomb (buff, *src, &ps);\n\t\tif (bytes < 0) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (count + bytes < len && bytes > 0) {\n\t\t\tfor (i = 0; i < bytes; i++) {\n\t\t\t\t*dst++ = buff[i];\n\t\t\t}\n\t\t\tsrc++;\n\t\t\tcount += bytes;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\t*dst = L'\\0';\n\t\n\treturn count;\n}\n\n/*\nCase-independent comparison of two multibyte encoded strings\n*/\nstatic int _FAT_directory_mbsncasecmp (const char* s1, const char* s2, size_t len1) {\n\twchar_t wc1, wc2;\n\tmbstate_t ps1 = {0};\n\tmbstate_t ps2 = {0};\n\tsize_t b1 = 0;\n\tsize_t b2 = 0;\n\t\n\tif (len1 == 0) {\n\t\treturn 0;\n\t}\n\t\n\tdo {\n\t\ts1 += b1;\n\t\ts2 += b2;\n\t\tb1 = mbrtowc(&wc1, s1, MB_CUR_MAX, &ps1);\n\t\tb2 = mbrtowc(&wc2, s2, MB_CUR_MAX, &ps2);\n\t\tif ((int)b1 < 0 || (int)b2 < 0) {\n\t\t\tbreak;\n\t\t}\n\t\tlen1 -= b1;\n\t} while (len1 > 0 && towlower(wc1) == towlower(wc2) && wc1 != 0);\n\t\n\treturn towlower(wc1) - towlower(wc2);\n}\n\n\nstatic bool _FAT_directory_entryGetAlias (const u8* entryData, char* destName) {\n\tint i=0;\n\tint j=0;\n\n\tdestName[0] = '\\0';\n\tif (entryData[0] != DIR_ENTRY_FREE) {\n\t\tif (entryData[0] == '.') {\n\t\t\tdestName[0] = '.';\n\t\t\tif (entryData[1] == '.') {\n\t\t\t\tdestName[1] = '.';\n\t\t\t\tdestName[2] = '\\0';\n\t\t\t} else {\n\t\t\t\tdestName[1] = '\\0';\n\t\t\t}\n\t\t} else {\t\t\n\t\t\t// Copy the filename from the dirEntry to the string\n\t\t\tfor (i = 0; (i < 8) && (entryData[DIR_ENTRY_name + i] != ' '); i++) {\n\t\t\t\tdestName[i] = entryData[DIR_ENTRY_name + i];\n\t\t\t}\n\t\t\t// Copy the extension from the dirEntry to the string\n\t\t\tif (entryData[DIR_ENTRY_extension] != ' ') {\n\t\t\t\tdestName[i++] = '.';\n\t\t\t\tfor ( j = 0; (j < 3) && (entryData[DIR_ENTRY_extension + j] != ' '); j++) {\n\t\t\t\t\tdestName[i++] = entryData[DIR_ENTRY_extension + j];\n\t\t\t\t}\n\t\t\t}\n\t\t\tdestName[i] = '\\0';\n\t\t}\n\t}\n\n\treturn (destName[0] != '\\0');\n}\n\nuint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData) {\n\tif (partition->filesysType == FS_FAT32) {\n\t\t// Only use high 16 bits of start cluster when we are certain they are correctly defined\n\t\treturn u8array_to_u16(entryData,DIR_ENTRY_cluster) | (u8array_to_u16(entryData, DIR_ENTRY_clusterHigh) << 16);\n\t} else {\n\t\treturn u8array_to_u16(entryData,DIR_ENTRY_cluster);\n\t}\n}\n\nstatic bool _FAT_directory_incrementDirEntryPosition (PARTITION* partition, DIR_ENTRY_POSITION* entryPosition, bool extendDirectory) {\n\tDIR_ENTRY_POSITION position = *entryPosition;\n\tuint32_t tempCluster;\n\n\t// Increment offset, wrapping at the end of a sector\n\t++ position.offset;\n\tif (position.offset == BYTES_PER_READ / DIR_ENTRY_DATA_SIZE) {\n\t\tposition.offset = 0;\n\t\t// Increment sector when wrapping\n\t\t++ position.sector;\n\t\t// But wrap at the end of a cluster\n\t\tif ((position.sector == partition->sectorsPerCluster) && (position.cluster != FAT16_ROOT_DIR_CLUSTER)) {\n\t\t\tposition.sector = 0;\n\t\t\t// Move onto the next cluster, making sure there is another cluster to go to\n\t\t\ttempCluster = _FAT_fat_nextCluster(partition, position.cluster);\n\t\t\tif (tempCluster == CLUSTER_EOF) {\n\t\t\t\tif (extendDirectory) {\n\t\t\t\t\ttempCluster = _FAT_fat_linkFreeClusterCleared (partition, position.cluster);\n\t\t\t\t\tif (!_FAT_fat_isValidCluster(partition, tempCluster)) {\n\t\t\t\t\t\treturn false;\t// This will only happen if the disc is full\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\t\t// Got to the end of the directory, not extending it\n\t\t\t\t}\n\t\t\t} \n\t\t\tposition.cluster = tempCluster;\n\t\t} else if ((position.cluster == FAT16_ROOT_DIR_CLUSTER) && (position.sector == (partition->dataStart - partition->rootDirStart))) {\n\t\t\treturn false;\t// Got to end of root directory, can't extend it\n\t\t}\n\t}\n\t*entryPosition = position;\n\treturn true;\n}\n\nbool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry) {\n\tDIR_ENTRY_POSITION entryStart;\n\tDIR_ENTRY_POSITION entryEnd;\n\tuint8_t entryData[0x20];\n\tucs2_t lfn[MAX_LFN_LENGTH];\n\tbool notFound, found;\n\tint lfnPos;\n\tuint8_t lfnChkSum, chkSum;\n\tbool lfnExists;\n\tint i;\n\n\tlfnChkSum = 0;\n\n\tentryStart = entry->dataEnd;\n\n\t// Make sure we are using the correct root directory, in case of FAT32\n\tif (entryStart.cluster == FAT16_ROOT_DIR_CLUSTER) {\n\t\tentryStart.cluster = partition->rootDirCluster;\n\t}\n\n\tentryEnd = entryStart;\n\n\tlfnExists = false;\n\n\tfound = false;\n\tnotFound = false;\n\n\twhile (!found && !notFound) {\n\t\tif (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) {\n\t\t\tnotFound = true;\n\t\t}\n\n\t\t_FAT_cache_readPartialSector (partition->cache, entryData,\n\t\t\t_FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector,\n\t\t\tentryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\n\t\tif (entryData[DIR_ENTRY_attributes] == ATTRIB_LFN) {\n\t\t\t// It's an LFN\n\t\t\tif (entryData[LFN_offset_ordinal] & LFN_DEL) {\n\t\t\t\tlfnExists = false;\n\t\t\t} else if (entryData[LFN_offset_ordinal] & LFN_END) {\n\t\t\t\t// Last part of LFN, make sure it isn't deleted using previous if(Thanks MoonLight)\n\t\t\t\tentryStart = entryEnd;\t// This is the start of a directory entry\n\t\t\t\tlfnExists = true;\n\t\t\t\tlfnPos = (entryData[LFN_offset_ordinal] & ~LFN_END) * 13;\n\t\t\t\tif (lfnPos > MAX_LFN_LENGTH - 1) {\n\t\t\t\t\tlfnPos = MAX_LFN_LENGTH - 1;\n\t\t\t\t}\n\t\t\t\tlfn[lfnPos] = '\\0';\t// Set end of lfn to null character\n\t\t\t\tlfnChkSum = entryData[LFN_offset_checkSum];\n\t\t\t} \n\t\t\tif (lfnChkSum != entryData[LFN_offset_checkSum]) {\n\t\t\t\tlfnExists = false;\n\t\t\t}\n\t\t\tif (lfnExists) {\n\t\t\t\tlfnPos = ((entryData[LFN_offset_ordinal] & ~LFN_END) - 1) * 13;\n\t\t\t\tif (lfnPos > LAST_LFN_POS) {\n\t\t\t\t\t// Force it within the buffer. Will corrupt the filename but prevent buffer overflows\n\t\t\t\t\tlfnPos = LAST_LFN_POS;\n\t\t\t\t}\n\t\t\t\tfor (i = 0; i < 13; i++) {\n\t\t\t\t\tlfn[lfnPos + i] = entryData[LFN_offset_table[i]] | (entryData[LFN_offset_table[i]+1] << 8);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (entryData[DIR_ENTRY_attributes] & ATTRIB_VOL) {\n\t\t\t// This is a volume name, don't bother with it\n\t\t} else if (entryData[0] == DIR_ENTRY_LAST) {\n\t\t\tnotFound = true;\n\t\t} else if ((entryData[0] != DIR_ENTRY_FREE) && (entryData[0] > 0x20) && !(entryData[DIR_ENTRY_attributes] & ATTRIB_VOL)) {\n\t\t\tif (lfnExists) {\n\t\t\t\t// Calculate file checksum\n\t\t\t\tchkSum = 0;\n\t\t\t\tfor (i=0; i < 11; i++) {\n\t\t\t\t\t// NOTE: The operation is an unsigned char rotate right\n\t\t\t\t\tchkSum = ((chkSum & 1) ? 0x80 : 0) + (chkSum >> 1) + entryData[i]; \n\t\t\t\t}\n\t\t\t\tif (chkSum != lfnChkSum) {\n\t\t\t\t\tlfnExists = false;\n\t\t\t\t\tentry->filename[0] = '\\0';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (lfnExists) {\n\t\t\t\tif (_FAT_directory_ucs2tombs (entry->filename, lfn, MAX_FILENAME_LENGTH) == (size_t)-1) {\n\t\t\t\t\t// Failed to convert the file name to UTF-8. Maybe the wrong locale is set?\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tentryStart = entryEnd;\n\t\t\t\t_FAT_directory_entryGetAlias (entryData, entry->filename);\n\t\t\t}\n\t\t\tfound = true;\n\t\t}\n\t}\n\n\t// If no file is found, return false\n\tif (notFound) {\n\t\treturn false;\n\t} else {\n\t\t// Fill in the directory entry struct\n\t\tentry->dataStart = entryStart;\n\t\tentry->dataEnd = entryEnd;\n\t\tmemcpy (entry->entryData, entryData, DIR_ENTRY_DATA_SIZE);\n\t\treturn true;\n\t}\n}\n\nbool _FAT_directory_getFirstEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster) {\n\tentry->dataStart.cluster = dirCluster;\n\tentry->dataStart.sector = 0;\n\tentry->dataStart.offset = -1; // Start before the beginning of the directory\n\n\tentry->dataEnd = entry->dataStart;\n\n\treturn _FAT_directory_getNextEntry (partition, entry);\n}\n\nbool _FAT_directory_getRootEntry (PARTITION* partition, DIR_ENTRY* entry) {\n\tentry->dataStart.cluster = 0;\n\tentry->dataStart.sector = 0;\n\tentry->dataStart.offset = 0;\n\t\n\tentry->dataEnd = entry->dataStart;\t\n\t\n\tmemset (entry->filename, '\\0', MAX_FILENAME_LENGTH);\n\tentry->filename[0] = '.';\n\t\n\tmemset (entry->entryData, 0, DIR_ENTRY_DATA_SIZE);\n\tmemset (entry->entryData, ' ', 11);\n\tentry->entryData[0] = '.';\n\t\n\tentry->entryData[DIR_ENTRY_attributes] = ATTRIB_DIR;\n\t\n\tu16_to_u8array (entry->entryData, DIR_ENTRY_cluster, partition->rootDirCluster);\n\tu16_to_u8array (entry->entryData, DIR_ENTRY_clusterHigh, partition->rootDirCluster >> 16);\n\t\n\treturn true;\n}\n\nbool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label) {\n\tDIR_ENTRY entry;\n\tDIR_ENTRY_POSITION entryEnd;\n\tuint8_t entryData[DIR_ENTRY_DATA_SIZE];\n\tint i;\n\tbool end;\n\n\t_FAT_directory_getRootEntry(partition, &entry);\n\n\tentryEnd = entry.dataEnd;\n\n\t// Make sure we are using the correct root directory, in case of FAT32\n\tif (entryEnd.cluster == FAT16_ROOT_DIR_CLUSTER) {\n\t\tentryEnd.cluster = partition->rootDirCluster;\n\t}\n\n\tlabel[0]='\\0';\n\tlabel[11]='\\0';\n\tend = false;\n\t//this entry should be among the first 3 entries in the root directory table, if not, then system can have trouble displaying the right volume label\n\twhile(!end) {   \n\t\tif (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) {\n\t\t\tend = true;\n\t\t}\n\n\t\tif(!_FAT_cache_readPartialSector (partition->cache, entryData,\n\t\t\t_FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector,\n\t\t\tentryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE))\n\t\t{ //error reading\n\t\t\treturn false;\n\t\t}\n\t\tif (entryData[DIR_ENTRY_attributes] == ATTRIB_VOL && entryData[0] != DIR_ENTRY_FREE) {\t\t\n\t\t\tfor (i = 0; i < 11; i++) {\n\t\t\t\tlabel[i] = entryData[DIR_ENTRY_name + i];\n\t\t\t}\n\t\t\treturn true;\n\t\t} else if (entryData[0] == DIR_ENTRY_LAST) {\n\t\t\tend = true;\n\t\t}\n\t}\n\treturn false;\n}\n\nbool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry) {\n\tDIR_ENTRY_POSITION entryStart = entry->dataStart;\n\tDIR_ENTRY_POSITION entryEnd = entry->dataEnd;\n\tbool entryStillValid;\n\tbool finished;\n\tucs2_t lfn[MAX_LFN_LENGTH];\n\tint i;\n\tint lfnPos;\n\tuint8_t entryData[DIR_ENTRY_DATA_SIZE];\n\t\n\tmemset (entry->filename, '\\0', MAX_FILENAME_LENGTH);\n\n\t// Create an empty directory entry to overwrite the old ones with\n\tfor ( entryStillValid = true, finished = false; \n\t\tentryStillValid && !finished; \n\t\tentryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &entryStart, false))\n\t{\n\t\t_FAT_cache_readPartialSector (partition->cache, entryData, \n\t\t\t_FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector,\n\t\t\tentryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\t\t\t\n\t\tif ((entryStart.cluster == entryEnd.cluster)\n\t\t\t&& (entryStart.sector == entryEnd.sector)\n\t\t\t&& (entryStart.offset == entryEnd.offset)) {\n\t\t\t// Copy the entry data and stop, since this is the last section of the directory entry\n\t\t\tmemcpy (entry->entryData, entryData, DIR_ENTRY_DATA_SIZE);\n\t\t\tfinished = true;\n\t\t} else {\n\t\t\t// Copy the long file name data\n\t\t\tlfnPos = ((entryData[LFN_offset_ordinal] & ~LFN_END) - 1) * 13;\n\t\t\tif (lfnPos > LAST_LFN_POS) {\n\t\t\t\tlfnPos = LAST_LFN_POS_CORRECTION;\n\t\t\t}\n\t\t\tfor (i = 0; i < 13; i++) {\n\t\t\t\tlfn[lfnPos + i] = entryData[LFN_offset_table[i]] | (entryData[LFN_offset_table[i]+1] << 8);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!entryStillValid) {\n\t\treturn false;\n\t}\n\t\n\tif ((entryStart.cluster == entryEnd.cluster)\n\t\t&& (entryStart.sector == entryEnd.sector)\n\t\t&& (entryStart.offset == entryEnd.offset)) {\n\t\t// Since the entry doesn't have a long file name, extract the short filename\n\t\tif (!_FAT_directory_entryGetAlias (entry->entryData, entry->filename)) {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\t// Encode the long file name into a multibyte string\n\t\tif (_FAT_directory_ucs2tombs (entry->filename, lfn, MAX_FILENAME_LENGTH) == (size_t)-1) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\treturn true;\n}\n\n\n\nbool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd) {\n\tsize_t dirnameLength;\n\tconst char* pathPosition;\n\tconst char* nextPathPosition;\n\tuint32_t dirCluster;\n\tbool foundFile;\n\tchar alias[MAX_ALIAS_LENGTH];\n\tbool found, notFound;\n\n\tpathPosition = path;\n\t\n\tfound = false;\n\tnotFound = false;\n\n\tif (pathEnd == NULL) {\n\t\t// Set pathEnd to the end of the path string\n\t\tpathEnd = strchr (path, '\\0');\n\t}\n\n\tif (pathPosition[0] == DIR_SEPARATOR) {\n\t\t// Start at root directory\n\t\tdirCluster = partition->rootDirCluster;\n\t\t// Consume separator(s)\n\t\twhile (pathPosition[0] == DIR_SEPARATOR) {\n\t\t\tpathPosition++;\n\t\t}\n\t\t// If the path is only specifying a directory in the form of \"/\" return it\n\t\tif (pathPosition >= pathEnd) {\n\t\t\t_FAT_directory_getRootEntry (partition, entry);\n\t\t\tfound = true;\n\t\t}\n\t} else {\n\t\t// Start in current working directory\n\t\tdirCluster = partition->cwdCluster;\n\t}\n\n\t// If the path is only specifying a directory in the form \".\" \n\t// and this is the root directory, return it\n\tif ((dirCluster == partition->rootDirCluster) && (strcmp(\".\", pathPosition) == 0)) {\n\t\t_FAT_directory_getRootEntry (partition, entry);\n\t\tfound = true;\n\t}\n\t\t\n\twhile (!found && !notFound) {\n\t\t// Get the name of the next required subdirectory within the path\n\t\tnextPathPosition = strchr (pathPosition, DIR_SEPARATOR);\n\t\tif (nextPathPosition != NULL) {\n\t\t\tdirnameLength = nextPathPosition - pathPosition;\n\t\t} else {\n\t\t\tdirnameLength = strlen(pathPosition);\n\t\t}\n\n\t\tif (dirnameLength > MAX_FILENAME_LENGTH) {\n\t\t\t// The path is too long to bother with\n\t\t\treturn false;\n\t\t}\n\n\t\t// Look for the directory within the path\n\t\tfoundFile = _FAT_directory_getFirstEntry (partition, entry, dirCluster);\n\n\t\twhile (foundFile && !found && !notFound) {\t\t\t// It hasn't already found the file\n\t\t\t// Check if the filename matches\n\t\t\tif ((dirnameLength == strnlen(entry->filename, MAX_FILENAME_LENGTH))\n\t\t\t\t&& (_FAT_directory_mbsncasecmp(pathPosition, entry->filename, dirnameLength) == 0)) {\n\t\t\t\t\tfound = true;\n\t\t\t}\n\n\t\t\t// Check if the alias matches\n\t\t\t_FAT_directory_entryGetAlias (entry->entryData, alias);\n\t\t\tif ((dirnameLength == strnlen(alias, MAX_ALIAS_LENGTH))\n\t\t\t\t&& (strncasecmp(pathPosition, alias, dirnameLength) == 0)) {\n\t\t\t\t\tfound = true;\n\t\t\t}\n\n\t\t\tif (found && !(entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) && (nextPathPosition != NULL)) {\n\t\t\t\t// Make sure that we aren't trying to follow a file instead of a directory in the path\n\t\t\t\tfound = false;\n\t\t\t}\n\n\t\t\tif (!found) {\n\t\t\t\tfoundFile = _FAT_directory_getNextEntry (partition, entry);\n\t\t\t}\n\t\t}\n\n\t\tif (!foundFile) {\n\t\t\t// Check that the search didn't get to the end of the directory\n\t\t\tnotFound = true;\n\t\t\tfound = false;\n\t\t} else if ((nextPathPosition == NULL) || (nextPathPosition >= pathEnd)) {\n\t\t\t// Check that we reached the end of the path\n\t\t\tfound = true;\n\t\t} else if (entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) {\n\t\t\tdirCluster = _FAT_directory_entryGetCluster (partition, entry->entryData);\n\t\t\tpathPosition = nextPathPosition;\n\t\t\t// Consume separator(s)\n\t\t\twhile (pathPosition[0] == DIR_SEPARATOR) {\n\t\t\t\tpathPosition++;\n\t\t\t}\n\t\t\t// The requested directory was found\n\t\t\tif (pathPosition >= pathEnd)  {\n\t\t\t\tfound = true;\n\t\t\t} else {\n\t\t\t\tfound = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (found && !notFound) {\n\t\tif (partition->filesysType == FS_FAT32 && (entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) &&\n\t\t\t_FAT_directory_entryGetCluster (partition, entry->entryData) == CLUSTER_ROOT) \n\t\t{\n\t\t\t// On FAT32 it should specify an actual cluster for the root entry,\n\t\t\t// not cluster 0 as on FAT16\n\t\t\t_FAT_directory_getRootEntry (partition, entry);\n\t\t}\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\nbool _FAT_directory_removeEntry (PARTITION* partition, DIR_ENTRY* entry) {\n\tDIR_ENTRY_POSITION entryStart = entry->dataStart;\n\tDIR_ENTRY_POSITION entryEnd = entry->dataEnd;\n\tbool entryStillValid;\n\tbool finished;\n\tuint8_t entryData[DIR_ENTRY_DATA_SIZE];\n\n\t// Create an empty directory entry to overwrite the old ones with\n\tfor ( entryStillValid = true, finished = false; \n\t\tentryStillValid && !finished; \n\t\tentryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &entryStart, false))\n\t{\n\t\t_FAT_cache_readPartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\t\tentryData[0] = DIR_ENTRY_FREE;\n\t\t_FAT_cache_writePartialSector (partition->cache, entryData, _FAT_fat_clusterToSector(partition, entryStart.cluster) + entryStart.sector, entryStart.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\t\tif ((entryStart.cluster == entryEnd.cluster) && (entryStart.sector == entryEnd.sector) && (entryStart.offset == entryEnd.offset)) {\n\t\t\tfinished = true;\n\t\t}\n\t}\n\n\tif (!entryStillValid) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nstatic bool _FAT_directory_findEntryGap (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster, size_t size) {\n\tDIR_ENTRY_POSITION gapStart;\n\tDIR_ENTRY_POSITION gapEnd;\n\tuint8_t entryData[DIR_ENTRY_DATA_SIZE];\n\tsize_t dirEntryRemain;\n\tbool endOfDirectory, entryStillValid;\n\n\t// Scan Dir for free entry\n\tgapEnd.offset = 0;\n\tgapEnd.sector = 0;\n\tgapEnd.cluster = dirCluster;\n\n\tgapStart = gapEnd;\n\n\tentryStillValid = true;\n\tdirEntryRemain = size;\n\tendOfDirectory = false;\n\t\n\twhile (entryStillValid && !endOfDirectory && (dirEntryRemain > 0)) {\n\t\t_FAT_cache_readPartialSector (partition->cache, entryData, \n\t\t\t_FAT_fat_clusterToSector(partition, gapEnd.cluster) + gapEnd.sector, \n\t\t\tgapEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\t\tif (entryData[0] == DIR_ENTRY_LAST) {\n\t\t\tgapStart = gapEnd;\n\t\t\t-- dirEntryRemain;\n\t\t\tendOfDirectory = true;\n\t\t} else if (entryData[0] == DIR_ENTRY_FREE) {\n\t\t\tif (dirEntryRemain == size) {\n\t\t\t\tgapStart = gapEnd;\n\t\t\t}\n\t\t\t-- dirEntryRemain;\n\t\t} else {\n\t\t\tdirEntryRemain = size;\n\t\t}\n\t\t\n\t\tif (!endOfDirectory && (dirEntryRemain > 0)) {\n\t\t\tentryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &gapEnd, true);\n\t\t}\n\t}\n\n\t// Make sure the scanning didn't fail\n\tif (!entryStillValid) {\n\t\treturn false;\n\t}\n\n\t// Save the start entry, since we know it is valid\n\tentry->dataStart = gapStart;\n\n\tif (endOfDirectory) {\n\t\tmemset (entryData, DIR_ENTRY_LAST, DIR_ENTRY_DATA_SIZE);\n\t\tdirEntryRemain += 1;\t// Increase by one to take account of End Of Directory Marker\n\t\twhile ((dirEntryRemain > 0) && entryStillValid) {\n\t\t\t// Get the gapEnd before incrementing it, so the second to last one is saved\n\t\t\tentry->dataEnd = gapEnd;\n\t\t\t// Increment gapEnd, moving onto the next entry\n\t\t\tentryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &gapEnd, true);\n\t\t\t-- dirEntryRemain;\n\t\t\t// Fill the entry with blanks\n\t\t\t_FAT_cache_writePartialSector (partition->cache, entryData,\n\t\t\t\t_FAT_fat_clusterToSector(partition, gapEnd.cluster) + gapEnd.sector, \n\t\t\t\tgapEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\t\t}\n\t\tif (!entryStillValid) {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tentry->dataEnd = gapEnd;\n\t}\n\n\treturn true;\n}\n\nstatic bool _FAT_directory_entryExists (PARTITION* partition, const char* name, uint32_t dirCluster) {\n\tDIR_ENTRY tempEntry;\n\tbool foundFile;\n\tchar alias[MAX_ALIAS_LENGTH];\n\tsize_t dirnameLength;\n\n\tdirnameLength = strnlen(name, MAX_FILENAME_LENGTH);\n\n\tif (dirnameLength >= MAX_FILENAME_LENGTH) {\n\t\treturn false;\n\t}\n\t\n\t// Make sure the entry doesn't already exist\n\tfoundFile = _FAT_directory_getFirstEntry (partition, &tempEntry, dirCluster);\n\n\twhile (foundFile) {\t\t\t// It hasn't already found the file\n\t\t// Check if the filename matches\n\t\tif ((dirnameLength == strnlen(tempEntry.filename, MAX_FILENAME_LENGTH))\n\t\t\t&& (_FAT_directory_mbsncasecmp(name, tempEntry.filename, dirnameLength) == 0)) {\n\t\t\t\treturn true;\n\t\t}\n\n\t\t// Check if the alias matches\n\t\t_FAT_directory_entryGetAlias (tempEntry.entryData, alias);\n\t\tif ((strncasecmp(name, alias, MAX_ALIAS_LENGTH) == 0)) {\n\t\t\t\treturn true;\n\t\t}\n\t\tfoundFile = _FAT_directory_getNextEntry (partition, &tempEntry);\n\t}\n\treturn false;\n}\n\n/* \nCreates an alias for a long file name. If the alias is not an exact match for the \nfilename, it returns the number of characters in the alias. If the two names match, \nit returns 0. If there was an error, it returns -1.\n*/\nstatic int _FAT_directory_createAlias (char* alias, const char* lfn) {\n\tbool lossyConversion = false;\t// Set when the alias had to be modified to be valid\n\tint lfnPos = 0;\n\tint aliasPos = 0;\n\twchar_t lfnChar;\n\tint oemChar;\n\tmbstate_t ps = {0};\n\tint bytesUsed = 0;\n\tconst char* lfnExt;\n\tint aliasExtLen;\n\t\n\t// Strip leading periods\n\twhile (lfn[lfnPos] == '.') {\n\t\tlfnPos ++;\n\t\tlossyConversion = true;\n\t}\n\t\n\t// Primary portion of alias\n\twhile (aliasPos < 8 && lfn[lfnPos] != '.' && lfn[lfnPos] != '\\0') {\n\t\tbytesUsed = mbrtowc(&lfnChar, lfn + lfnPos, MAX_FILENAME_LENGTH - lfnPos, &ps);\n\t\tif (bytesUsed < 0) {\n\t\t\treturn -1;\n\t\t}\n\t\toemChar = wctob(towupper((wint_t)lfnChar));\n\t\tif (wctob((wint_t)lfnChar) != oemChar) {\n\t\t\t// Case of letter was changed\n\t\t\tlossyConversion = true;\n\t\t}\n\t\tif (oemChar == ' ') {\n\t\t\t// Skip spaces in filename\n\t\t\tlossyConversion = true;\n\t\t\tlfnPos += bytesUsed;\n\t\t\tcontinue;\n\t\t}\n\t\tif (oemChar == EOF) {\n\t\t\toemChar = '_';\t\t// Replace unconvertable characters with underscores\n\t\t\tlossyConversion = true;\n\t\t}\n\t\tif (strchr (ILLEGAL_ALIAS_CHARACTERS, oemChar) != NULL) {\n\t\t\t// Invalid Alias character\n\t\t\toemChar = '_';\t\t// Replace illegal characters with underscores\n\t\t\tlossyConversion = true;\n\t\t}\n\t\t\n\t\talias[aliasPos] = (char)oemChar;\n\t\taliasPos++;\n\t\tlfnPos += bytesUsed;\n\t}\n\t\n\tif (lfn[lfnPos] != '.' && lfn[lfnPos] != '\\0') {\n\t\t// Name was more than 8 characters long\n\t\tlossyConversion = true;\n\t}\n\t\n\t// Alias extension\n\tlfnExt = strrchr (lfn, '.');\n\tif (lfnExt != NULL && lfnExt != strchr (lfn, '.')) {\n\t\t// More than one period in name\n\t\tlossyConversion = true;\n\t}\n\tif (lfnExt != NULL && lfnExt[1] != '\\0') {\n\t\tlfnExt++;\n\t\talias[aliasPos] = '.';\n\t\taliasPos++;\n\t\tmemset (&ps, 0, sizeof(ps));\n\t\tfor (aliasExtLen = 0; aliasExtLen < MAX_ALIAS_EXT_LENGTH && *lfnExt != '\\0'; aliasExtLen++) {\n\t\t\tbytesUsed = mbrtowc(&lfnChar, lfnExt, MAX_FILENAME_LENGTH - lfnPos, &ps);\n\t\t\tif (bytesUsed < 0) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\toemChar = wctob(towupper((wint_t)lfnChar));\n\t\t\tif (wctob((wint_t)lfnChar) != oemChar) {\n\t\t\t\t// Case of letter was changed\n\t\t\t\tlossyConversion = true;\n\t\t\t}\n\t\t\tif (oemChar == ' ') {\n\t\t\t\t// Skip spaces in alias\n\t\t\t\tlossyConversion = true;\n\t\t\t\tlfnExt += bytesUsed;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (oemChar == EOF) {\n\t\t\t\toemChar = '_';\t\t// Replace unconvertable characters with underscores\n\t\t\t\tlossyConversion = true;\n\t\t\t}\n\t\t\tif (strchr (ILLEGAL_ALIAS_CHARACTERS, oemChar) != NULL) {\n\t\t\t\t// Invalid Alias character\n\t\t\t\toemChar = '_';\t\t// Replace illegal characters with underscores\n\t\t\t\tlossyConversion = true;\n\t\t\t}\n\t\t\t\n\t\t\talias[aliasPos] = (char)oemChar;\n\t\t\taliasPos++;\n\t\t\tlfnExt += bytesUsed;\n\t\t}\n\t\tif (*lfnExt != '\\0') {\n\t\t\t// Extension was more than 3 characters long\n\t\t\tlossyConversion = true;\n\t\t}\n\t}\n\t\n\talias[aliasPos] = '\\0';\n\tif (lossyConversion) {\n\t\treturn aliasPos;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nbool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster) {\n\tsize_t entrySize;\n\tuint8_t lfnEntry[DIR_ENTRY_DATA_SIZE];\n\tint i,j; // Must be signed for use when decrementing in for loop\n\tchar *tmpCharPtr;\n\tDIR_ENTRY_POSITION curEntryPos;\n\tbool entryStillValid;\n\tuint8_t aliasCheckSum = 0;\n\tchar alias [MAX_ALIAS_LENGTH];\n\tint aliasLen;\n\tint lfnLen;\n\n\t// Make sure the filename is not 0 length\n\tif (strnlen (entry->filename, MAX_FILENAME_LENGTH) < 1) {\n\t\treturn false;\n\t}\n\n\t// Make sure the filename is at least a valid LFN\n\tlfnLen = _FAT_directory_lfnLength (entry->filename);\n\tif (lfnLen < 0) {\n\t\treturn false;\n\t}\n\n\t// Remove trailing spaces\n\tfor (i = strlen (entry->filename) - 1; (i > 0) && (entry->filename[i] == ' '); --i) {\n\t\tentry->filename[i] = '\\0';\n\t}\n\t// Remove leading spaces\n\tfor (i = 0; (i < (int)strlen (entry->filename)) && (entry->filename[i] == ' '); ++i) ;\n\tif (i > 0) {\n\t\tmemmove (entry->filename, entry->filename + i, strlen (entry->filename + i));\n\t}\n\n\t// Remove junk in filename\n\ti = strlen (entry->filename);\n\tmemset (entry->filename + i, '\\0', MAX_FILENAME_LENGTH - i);\n\n\t// Make sure the entry doesn't already exist\n\tif (_FAT_directory_entryExists (partition, entry->filename, dirCluster)) {\n\t\treturn false;\n\t}\n\n\t// Clear out alias, so we can generate a new one\n\tmemset (entry->entryData, ' ', 11);\n\n\tif ( strncmp(entry->filename, \".\", MAX_FILENAME_LENGTH) == 0) {\n\t\t// \".\" entry\n\t\tentry->entryData[0] = '.';\n\t\tentrySize = 1;\n\t} else if ( strncmp(entry->filename, \"..\", MAX_FILENAME_LENGTH) == 0) {\n\t\t// \"..\" entry\n\t\tentry->entryData[0] = '.';\n\t\tentry->entryData[1] = '.';\n\t\tentrySize = 1;\n\t} else {\n\t\t// Normal file name\n\t\taliasLen = _FAT_directory_createAlias (alias, entry->filename);\n\t\tif (aliasLen < 0) {\n\t\t\treturn false;\n\t\t} else if (aliasLen == 0) {\n\t\t\t// It's a normal short filename\n\t\t\tentrySize = 1;\n\t\t} else {\n\t\t\t// It's a long filename with an alias\n\t\t\tentrySize = ((lfnLen + LFN_ENTRY_LENGTH - 1) / LFN_ENTRY_LENGTH) + 1;\n\t\t\t\n\t\t\t// Generate full alias for all cases except when the alias is simply an upper case version of the LFN\n\t\t\t// and there isn't already a file with that name\n\t\t\tif (strncasecmp (alias, entry->filename, MAX_ALIAS_LENGTH) != 0 ||\n\t\t\t\t_FAT_directory_entryExists (partition, alias, dirCluster)) \n\t\t\t{\n\t\t\t\t// expand primary part to 8 characters long by padding the end with underscores\n\t\t\t\ti = MAX_ALIAS_PRI_LENGTH - 1; \n\t\t\t\t// Move extension to last 3 characters\n\t\t\t\twhile (alias[i] != '.' && i > 0) i--;\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tj = MAX_ALIAS_LENGTH - MAX_ALIAS_EXT_LENGTH - 2; // 1 char for '.', one for NUL, 3 for extension\n\t\t\t\t\tmemmove (alias + j, alias + i, strlen(alias) - i);\n\t\t\t\t\t// Pad primary component\n\t\t\t\t\tmemset (alias + i, '_', j - i);\n\t\t\t\t\talias[MAX_ALIAS_LENGTH-1]=0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Generate numeric tail\n\t\t\t\tfor (i = 1; i <= MAX_NUMERIC_TAIL; i++) {\n\t\t\t\t\tj = i;\n\t\t\t\t\ttmpCharPtr = alias + MAX_ALIAS_PRI_LENGTH - 1;\n\t\t\t\t\twhile (j > 0) {\n\t\t\t\t\t\t*tmpCharPtr = '0' + (j % 10); // ASCII numeric value\n\t\t\t\t\t\ttmpCharPtr--;\n\t\t\t\t\t\tj /= 10;\n\t\t\t\t\t}\n\t\t\t\t\t*tmpCharPtr = '~';\n\t\t\t\t\tif (!_FAT_directory_entryExists (partition, alias, dirCluster)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (i > MAX_NUMERIC_TAIL) {\n\t\t\t\t\t// Couldn't get a valid alias\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy alias or short file name into directory entry data\n\t\tfor (i = 0, j = 0; (j < 8) && (alias[i] != '.') && (alias[i] != '\\0'); i++, j++) {\n\t\t\tentry->entryData[j] = alias[i];\n\t\t}\n\t\twhile (j < 8) {\n\t\t\tentry->entryData[j] = ' ';\n\t\t\t++ j;\n\t\t}\n\t\tif (alias[i] == '.') {\n\t\t\t// Copy extension\n\t\t\t++ i;\n\t\t\twhile ((alias[i] != '\\0') && (j < 11)) {\n\t\t\t\tentry->entryData[j] = alias[i];\n\t\t\t\t++ i;\n\t\t\t\t++ j;\n\t\t\t}\n\t\t}\n\t\twhile (j < 11) {\n\t\t\tentry->entryData[j] = ' ';\n\t\t\t++ j;\n\t\t}\n\t\t\n\t\t// Generate alias checksum\n\t\tfor (i=0; i < ALIAS_ENTRY_LENGTH; i++) {\n\t\t\t// NOTE: The operation is an unsigned char rotate right\n\t\t\taliasCheckSum = ((aliasCheckSum & 1) ? 0x80 : 0) + (aliasCheckSum >> 1) + entry->entryData[i];\n\t\t}\n\t}\n\n\t// Find or create space for the entry\n\tif (_FAT_directory_findEntryGap (partition, entry, dirCluster, entrySize) == false) {\n\t\treturn false;\n\t}\n\n\t// Write out directory entry\n\tcurEntryPos = entry->dataStart;\n\n\t{\n\t\t// lfn is only pushed onto the stack here, reducing overall stack usage\n\t\tucs2_t lfn[MAX_LFN_LENGTH] = {0};\n\t\t_FAT_directory_mbstoucs2 (lfn, entry->filename, MAX_LFN_LENGTH);\n\n\t\tfor (entryStillValid = true, i = entrySize; entryStillValid && i > 0; \n\t\t\tentryStillValid = _FAT_directory_incrementDirEntryPosition (partition, &curEntryPos, false), -- i )\n\t\t{\n\t\t\tif (i > 1) {\n\t\t\t\t// Long filename entry\n\t\t\t\tlfnEntry[LFN_offset_ordinal] = (i - 1) | ((size_t)i == entrySize ? LFN_END : 0);\n\t\t\t\tfor (j = 0; j < 13; j++) {\n\t\t\t\t\tif (lfn [(i - 2) * 13 + j] == '\\0') {\n\t\t\t\t\t\tif ((j > 1) && (lfn [(i - 2) * 13 + (j-1)] == '\\0')) {\n\t\t\t\t\t\t\tu16_to_u8array (lfnEntry, LFN_offset_table[j], 0xffff);\t\t// Padding\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tu16_to_u8array (lfnEntry, LFN_offset_table[j], 0x0000);\t\t// Terminating null character\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tu16_to_u8array (lfnEntry, LFN_offset_table[j], lfn [(i - 2) * 13 + j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlfnEntry[LFN_offset_checkSum] = aliasCheckSum;\n\t\t\t\tlfnEntry[LFN_offset_flag] = ATTRIB_LFN;\n\t\t\t\tlfnEntry[LFN_offset_reserved1] = 0;\n\t\t\t\tu16_to_u8array (lfnEntry, LFN_offset_reserved2, 0);\n\t\t\t\t_FAT_cache_writePartialSector (partition->cache, lfnEntry, _FAT_fat_clusterToSector(partition, curEntryPos.cluster) + curEntryPos.sector, curEntryPos.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\t\t\t} else {\n\t\t\t\t// Alias & file data\n\t\t\t\t_FAT_cache_writePartialSector (partition->cache, entry->entryData, _FAT_fat_clusterToSector(partition, curEntryPos.cluster) + curEntryPos.sector, curEntryPos.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\t\n}\n\nbool _FAT_directory_chdir (PARTITION* partition, const char* path) {\n\tDIR_ENTRY entry;\n\n\tif (!_FAT_directory_entryFromPath (partition, &entry, path, NULL)) {\n\t\treturn false;\n\t}\n\n\tif (!(entry.entryData[DIR_ENTRY_attributes] & ATTRIB_DIR)) {\n\t\treturn false;\n\t}\n\n\tpartition->cwdCluster = _FAT_directory_entryGetCluster (partition, entry.entryData);\n\n\treturn true;\n}\n\nvoid _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st) {\n\t// Fill in the stat struct\n\t// Some of the values are faked for the sake of compatibility\n\tst->st_dev = _FAT_disc_hostType(partition->disc);\t\t\t\t\t// The device is the 32bit ioType value\n  \tst->st_ino = (ino_t)(_FAT_directory_entryGetCluster(partition, entry->entryData));\t\t// The file serial number is the start cluster\n\tst->st_mode = (_FAT_directory_isDirectory(entry) ? S_IFDIR : S_IFREG) |\n\t\t(S_IRUSR | S_IRGRP | S_IROTH) |\n\t\t(_FAT_directory_isWritable (entry) ? (S_IWUSR | S_IWGRP | S_IWOTH) : 0);\t\t// Mode bits based on dirEntry ATTRIB byte\n\tst->st_nlink = 1;\t\t\t\t\t\t\t\t// Always one hard link on a FAT file\n\tst->st_uid = 1;\t\t\t\t\t\t\t\t\t// Faked for FAT\n\tst->st_gid = 2;\t\t\t\t\t\t\t\t\t// Faked for FAT\n\tst->st_rdev = st->st_dev;\n\tst->st_size = u8array_to_u32 (entry->entryData, DIR_ENTRY_fileSize);\t\t// File size \n\tst->st_atime = _FAT_filetime_to_time_t (\n\t\t0,\n\t\tu8array_to_u16 (entry->entryData, DIR_ENTRY_aDate)\n\t);\n#ifndef LIBFAT_PC\n\tst->st_spare1 = 0;\n#endif\n\tst->st_mtime = _FAT_filetime_to_time_t (\n\t\tu8array_to_u16 (entry->entryData, DIR_ENTRY_mTime),\n\t\tu8array_to_u16 (entry->entryData, DIR_ENTRY_mDate)\n\t);\n#ifndef LIBFAT_PC\n\tst->st_spare2 = 0;\n#endif\n\tst->st_ctime = _FAT_filetime_to_time_t (\n\t\tu8array_to_u16 (entry->entryData, DIR_ENTRY_cTime),\n\t\tu8array_to_u16 (entry->entryData, DIR_ENTRY_cDate)\n\t);\n#ifndef LIBFAT_PC\n\tst->st_spare3 = 0;\n\tst->st_blksize = BYTES_PER_READ;\t\t\t\t// Prefered file I/O block size \n\tst->st_blocks = (st->st_size + BYTES_PER_READ - 1) / BYTES_PER_READ;\t// File size in blocks\n\tst->st_spare4[0] = 0;\n\tst->st_spare4[1] = 0;\n#endif\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/directory.h",
    "content": "/*\n directory.h\n Reading, writing and manipulation of the directory structure on\n a FAT partition\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _DIRECTORY_H\n#define _DIRECTORY_H\n\n#include <sys/stat.h>\n\n#include \"common.h\"\n#include \"partition.h\"\n\n#define DIR_ENTRY_DATA_SIZE 0x20\n#define MAX_LFN_LENGTH\t256\n#define MAX_FILENAME_LENGTH 768\t\t// 256 UCS-2 characters encoded into UTF-8 can use up to 768 UTF-8 chars\n#define MAX_ALIAS_LENGTH 13\n#define LFN_ENTRY_LENGTH 13\n#define ALIAS_ENTRY_LENGTH 11\n#define MAX_ALIAS_EXT_LENGTH 3\n#define MAX_ALIAS_PRI_LENGTH 8\n#define MAX_NUMERIC_TAIL 999999\n#define FAT16_ROOT_DIR_CLUSTER 0\n\n#define DIR_SEPARATOR '/'\n\n// File attributes\n#define ATTRIB_ARCH\t0x20\t\t\t// Archive\n#define ATTRIB_DIR\t0x10\t\t\t// Directory\n#define ATTRIB_LFN\t0x0F\t\t\t// Long file name\n#define ATTRIB_VOL\t0x08\t\t\t// Volume\n#define ATTRIB_SYS\t0x04\t\t\t// System\n#define ATTRIB_HID\t0x02\t\t\t// Hidden\n#define ATTRIB_RO\t0x01\t\t\t// Read only\n\ntypedef enum {FT_DIRECTORY, FT_FILE} FILE_TYPE;\n\ntypedef struct {\n\tuint32_t cluster;\n\tsec_t    sector;\n\tint32_t  offset;\n} DIR_ENTRY_POSITION;\n\ntypedef struct {\n\tuint8_t            entryData[DIR_ENTRY_DATA_SIZE];\n\tDIR_ENTRY_POSITION dataStart;\t\t// Points to the start of the LFN entries of a file, or the alias for no LFN\n\tDIR_ENTRY_POSITION dataEnd;\t\t\t// Always points to the file/directory's alias entry\n\tchar               filename[MAX_FILENAME_LENGTH];\n} DIR_ENTRY;\n\n// Directory entry offsets\nenum DIR_ENTRY_offset {\n\tDIR_ENTRY_name = 0x00,\n\tDIR_ENTRY_extension = 0x08,\n\tDIR_ENTRY_attributes = 0x0B,\n\tDIR_ENTRY_reserved = 0x0C,\n\tDIR_ENTRY_cTime_ms = 0x0D,\n\tDIR_ENTRY_cTime = 0x0E,\n\tDIR_ENTRY_cDate = 0x10,\n\tDIR_ENTRY_aDate = 0x12,\n\tDIR_ENTRY_clusterHigh = 0x14,\n\tDIR_ENTRY_mTime = 0x16,\n\tDIR_ENTRY_mDate = 0x18,\n\tDIR_ENTRY_cluster = 0x1A,\n\tDIR_ENTRY_fileSize = 0x1C\n};\n\n/*\nReturns true if the file specified by entry is a directory\n*/\nstatic inline bool _FAT_directory_isDirectory (DIR_ENTRY* entry) {\n\treturn ((entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) != 0);\n}\n\nstatic inline bool _FAT_directory_isWritable (DIR_ENTRY* entry) {\n\treturn ((entry->entryData[DIR_ENTRY_attributes] & ATTRIB_RO) == 0);\n}\n\nstatic inline bool _FAT_directory_isDot (DIR_ENTRY* entry) {\n\treturn ((entry->filename[0] == '.') && ((entry->filename[1] == '\\0') ||\n\t\t((entry->filename[1] == '.') && entry->filename[2] == '\\0')));\n}\n\n/*\nReads the first directory entry from the directory starting at dirCluster\nPlaces result in entry\nentry will be destroyed even if no directory entry is found\nReturns true on success, false on failure\n*/\nbool _FAT_directory_getFirstEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster);\n\n/*\nReads the next directory entry after the one already pointed to by entry\nPlaces result in entry\nentry will be destroyed even if no directory entry is found\nReturns true on success, false on failure\n*/\nbool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry);\n\n/*\nGets the directory entry corrsponding to the supplied path\nentry will be destroyed even if no directory entry is found\npathEnd specifies the end of the path string, for cutting strings short if needed\n specify NULL to use the full length of path\n pathEnd is only a suggestion, and the path string will be searched up until the next PATH_SEPARATOR\n after pathEND.\nReturns true on success, false on failure\n*/\nbool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd);\n\n/* \nChanges the current directory to the one specified by path\nReturns true on success, false on failure\n*/\nbool _FAT_directory_chdir (PARTITION* partition, const char* path);\n\n/*\nRemoves the directory entry specified by entry\nAssumes that entry is valid\nReturns true on success, false on failure\n*/\nbool _FAT_directory_removeEntry (PARTITION* partition, DIR_ENTRY* entry);\n\n/*\nAdd a directory entry to the directory specified by dirCluster\nThe fileData, dataStart and dataEnd elements of the DIR_ENTRY struct are\nupdated with the new directory entry position and alias.\nReturns true on success, false on failure\n*/\nbool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t dirCluster);\n\n/*\nGet the start cluster of a file from it's entry data\n*/\nuint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData); \n\n/* \nFill in the file name and entry data of DIR_ENTRY* entry. \nAssumes that the entry's dataStart and dataEnd are correct\nReturns true on success, false on failure\n*/\nbool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry);\n\n/*\nFill in a stat struct based on a file entry\n*/\nvoid _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st);\n\n/*\nGet volume label\n*/\nbool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label);\n\n#endif // _DIRECTORY_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/disc.cpp",
    "content": "/*\n disc.c\n Interface to the low level disc functions. Used by the higher level\n file system code.\n \n Copyright (c) 2008 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include \"disc.h\"\n\n/*\nThe list of interfaces consists of a series of name/interface pairs.\nThe interface is returned via a simple function. This allows for\nplatforms where the interface has to be \"assembled\" before it can\nbe used, like DLDI on the NDS. For cases where a simple struct\nis available, wrapper functions are used.\nThe list is terminated by a NULL/NULL entry.\n*/\n\n/* ====================== Wii ====================== */\n#if   defined (__wii__)\n#include <sdcard/wiisd_io.h>\n#include <ogc/usbstorage.h>\n#include <sdcard/gcsd.h>\n\nstatic const DISC_INTERFACE* get_io_wiisd (void) {\n\treturn &__io_wiisd;\n}\nstatic const DISC_INTERFACE* get_io_usbstorage (void) {\n\treturn &__io_usbstorage;\n}\n\nstatic const DISC_INTERFACE* get_io_gcsda (void) {\n\treturn &__io_gcsda;\n}\nstatic const DISC_INTERFACE* get_io_gcsdb (void) {\n\treturn &__io_gcsdb;\n}\n\nconst INTERFACE_ID _FAT_disc_interfaces[] = {\n\t{\"sd\", get_io_wiisd},\n\t{\"usb\", get_io_usbstorage},\n\t{\"carda\", get_io_gcsda},\n\t{\"cardb\", get_io_gcsdb},\n\t{NULL, NULL}\n};\t\n\t\n/* ==================== Gamecube ==================== */\n#elif defined (__gamecube__)\n#include <sdcard/gcsd.h>\n\nstatic const DISC_INTERFACE* get_io_gcsda (void) {\n\treturn &__io_gcsda;\n}\nstatic const DISC_INTERFACE* get_io_gcsdb (void) {\n\treturn &__io_gcsdb;\n}\n\nconst INTERFACE_ID _FAT_disc_interfaces[] = {\n\t{\"carda\", get_io_gcsda},\n\t{\"cardb\", get_io_gcsdb},\n\t{NULL, NULL}\n};\t\n\n/* ====================== NDS ====================== */\n#elif defined (NDS)\n#include <nds/arm9/dldi.h>\n\nconst INTERFACE_ID _FAT_disc_interfaces[] = {\n\t{\"fat\", dldiGetInternal},\n\t{NULL, NULL}\n};\t\n\n/* ====================== GBA ====================== */\n#elif defined (GBA)\n#include <disc.h>\n\nconst INTERFACE_ID _FAT_disc_interfaces[] = {\n\t{\"fat\", discGetInterface},\n\t{NULL, NULL}\n};\t\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/disc.h",
    "content": "/*\n disc.h\n Interface to the low level disc functions. Used by the higher level\n file system code.\n \n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#ifndef _DISC_H\n#define _DISC_H\n\n#include \"common.h\"\n\n/*\nA list of all default devices to try at startup, \nterminated by a {NULL,NULL} entry.\n*/\ntypedef struct {\n\tconst char* name; \n\tconst DISC_INTERFACE* (*getInterface)(void);\n} INTERFACE_ID;\nextern const INTERFACE_ID _FAT_disc_interfaces[];\n\n/*\nCheck if a disc is inserted\nReturn true if a disc is inserted and ready, false otherwise\n*/\nstatic inline bool _FAT_disc_isInserted (const DISC_INTERFACE* disc) {\n\treturn disc->isInserted();\n}\n\n/*\nRead numSectors sectors from a disc, starting at sector. \nnumSectors is between 1 and LIMIT_SECTORS if LIMIT_SECTORS is defined,\nelse it is at least 1\nsector is 0 or greater\nbuffer is a pointer to the memory to fill\n*/\nstatic inline bool _FAT_disc_readSectors (const DISC_INTERFACE* disc, sec_t sector, sec_t numSectors, void* buffer) {\n\treturn disc->readSectors (sector, numSectors, buffer);\n}\n\n/*\nWrite numSectors sectors to a disc, starting at sector. \nnumSectors is between 1 and LIMIT_SECTORS if LIMIT_SECTORS is defined,\nelse it is at least 1\nsector is 0 or greater\nbuffer is a pointer to the memory to read from\n*/\nstatic inline bool _FAT_disc_writeSectors (const DISC_INTERFACE* disc, sec_t sector, sec_t numSectors, const void* buffer) {\n\treturn disc->writeSectors (sector, numSectors, buffer);\n}\n\n/*\nReset the card back to a ready state\n*/\nstatic inline bool _FAT_disc_clearStatus (const DISC_INTERFACE* disc) {\n\treturn disc->clearStatus();\n}\n\n/*\nInitialise the disc to a state ready for data reading or writing\n*/\nstatic inline bool _FAT_disc_startup (const DISC_INTERFACE* disc) {\n\treturn disc->startup();\n}\n\n/*\nPut the disc in a state ready for power down.\nComplete any pending writes and disable the disc if necessary\n*/\nstatic inline bool _FAT_disc_shutdown (const DISC_INTERFACE* disc) {\n\treturn disc->shutdown();\n}\n\n/*\nReturn a 32 bit value unique to each type of interface\n*/\nstatic inline uint32_t _FAT_disc_hostType (const DISC_INTERFACE* disc) {\n\treturn disc->ioType;\n}\n\n/*\nReturn a 32 bit value that specifies the capabilities of the disc\n*/\nstatic inline uint32_t _FAT_disc_features (const DISC_INTERFACE* disc) {\n\treturn disc->features;\n}\n\n#endif // _DISC_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/disc_io.h",
    "content": "/*\n disc_io.h\n Interface template for low level disc functions.\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n Based on code originally written by MightyMax\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef NDS_DISC_IO_INCLUDE\n#define NDS_DISC_IO_INCLUDE\n\n#define FEATURE_MEDIUM_CANREAD\t\t0x00000001\n#define FEATURE_MEDIUM_CANWRITE\t\t0x00000002\n#define FEATURE_SLOT_GBA\t\t\t0x00000010\n#define FEATURE_SLOT_NDS\t\t\t0x00000020\n\ntypedef uint32_t sec_t;\n\ntypedef bool (* FN_MEDIUM_STARTUP)(void) ;\ntypedef bool (* FN_MEDIUM_ISINSERTED)(void) ;\ntypedef bool (* FN_MEDIUM_READSECTORS)(sec_t sector, sec_t numSectors, void* buffer) ;\ntypedef bool (* FN_MEDIUM_WRITESECTORS)(sec_t sector, sec_t numSectors, const void* buffer) ;\ntypedef bool (* FN_MEDIUM_CLEARSTATUS)(void) ;\ntypedef bool (* FN_MEDIUM_SHUTDOWN)(void) ;\n\nstruct DISC_INTERFACE_STRUCT {\n\tunsigned long\t\t\tioType ;\n\tunsigned long\t\t\tfeatures ;\n\tFN_MEDIUM_STARTUP\t\tstartup ;\n\tFN_MEDIUM_ISINSERTED\tisInserted ;\n\tFN_MEDIUM_READSECTORS\treadSectors ;\n\tFN_MEDIUM_WRITESECTORS\twriteSectors ;\n\tFN_MEDIUM_CLEARSTATUS\tclearStatus ;\n\tFN_MEDIUM_SHUTDOWN\t\tshutdown ;\n} ;\n\ntypedef struct DISC_INTERFACE_STRUCT DISC_INTERFACE ;\n\n#endif\t// define NDS_DISC_IO_INCLUDE\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/fat.h",
    "content": "/*\n\tfat.h\n\tSimple functionality for startup, mounting and unmounting of FAT-based devices.\n\t\n Copyright (c) 2006 - 2009\n\tMichael \"Chishm\" Chisholm\n\tDave \"WinterMute\" Murphy\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n\n#ifndef _LIBFAT_H\n#define _LIBFAT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// When compiling for NDS, make sure NDS is defined\n#ifndef NDS\n #if defined ARM9 || defined ARM7\n  #define NDS\n #endif\n#endif\n\n#ifndef _MSC_VER\n#include <stdint.h>\n#endif\n\n#if defined(__gamecube__) || defined (__wii__)\n#  include <ogc/disc_io.h>\n#else\n#  ifdef NDS\n#    include \"nds/disc_io.h\"\n#  else\n#    include \"disc_io.h\"\n#  endif\n#endif\n\n/*\nInitialise any inserted block-devices.\nAdd the fat device driver to the devoptab, making it available for standard file functions.\ncacheSize: The number of pages to allocate for each inserted block-device\nsetAsDefaultDevice: if true, make this the default device driver for file operations\n*/\nextern bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice);\n\n/*\nCalls fatInit with setAsDefaultDevice = true and cacheSize optimised for the host system.\n*/\nextern bool fatInitDefault (void);\n\n/*\nMount the device pointed to by interface, and set up a devoptab entry for it as \"name:\".\nYou can then access the filesystem using \"name:/\".\nThis will mount the active partition or the first valid partition on the disc, \nand will use a cache size optimized for the host system.\n*/\nextern bool fatMountSimple (const char* name, const DISC_INTERFACE* interface);\n\n/*\nMount the device pointed to by interface, and set up a devoptab entry for it as \"name:\".\nYou can then access the filesystem using \"name:/\".\nIf startSector = 0, it will mount the active partition of the first valid partition on\nthe disc. Otherwise it will try to mount the partition starting at startSector.\ncacheSize specifies the number of pages to allocate for the cache.\nThis will not startup the disc, so you need to call interface->startup(); first.\n*/\nextern bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage);\n\n/*\nUnmount the partition specified by name.\nIf there are open files, it will attempt to synchronise them to disc.\n*/\nextern void fatUnmount (const char* name);\n\n/*\nGet Volume Label\n*/\nextern void fatGetVolumeLabel (const char* name, char *label);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // _LIBFAT_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/fatdir.cpp",
    "content": "/*\n fatdir.c\n \n Functions used by the newlib disc stubs to interface with \n this library\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <string.h>\n#include <errno.h>\n#include <ctype.h>\n\n#ifndef _MSC_VER\n#include <unistd.h>\n#ifndef ANDROID\n#include <sys/dir.h>\n#endif\n#endif\n\n#include \"fatdir.h\"\n\n#include \"cache.h\"\n#include \"file_allocation_table.h\"\n#include \"partition.h\"\n#include \"directory.h\"\n#include \"bit_ops.h\"\n#include \"filetime.h\"\n#include \"lock.h\"\n\n\nint _FAT_stat_r (struct _reent *r, const char *path, struct stat *st) {\n\tPARTITION* partition = NULL;\n\tDIR_ENTRY dirEntry;\n\t\n\t// Get the partition this file is on\n\tpartition = _FAT_partition_getPartitionFromPath (path);\n\tif (partition == NULL) {\n\t\tr->_errno = ENODEV;\n\t\treturn -1;\n\t}\n\n\t// Move the path pointer to the start of the actual path\n\tif (strchr (path, ':') != NULL) {\n\t\tpath = strchr (path, ':') + 1;\n\t}\n\tif (strchr (path, ':') != NULL) {\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\n\t_FAT_lock(&partition->lock);\n\n\t// Search for the file on the disc\n\tif (!_FAT_directory_entryFromPath (partition, &dirEntry, path, NULL)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = ENOENT;\n\t\treturn -1;\n\t}\n\t\n\t// Fill in the stat struct\n\t_FAT_directory_entryStat (partition, &dirEntry, st);\n\t\n\t_FAT_unlock(&partition->lock);\n\treturn 0;\n}\n\nint _FAT_link_r (struct _reent *r, const char *existing, const char *newLink) {\n\tr->_errno = ENOTSUP;\n\treturn -1;\n}\n\nint _FAT_unlink_r (struct _reent *r, const char *path) {\n\tPARTITION* partition = NULL;\n\tDIR_ENTRY dirEntry;\n\tDIR_ENTRY dirContents;\n\tuint32_t cluster;\n\tbool nextEntry;\n\tbool errorOccured = false;\n\t\n\t// Get the partition this directory is on\n\tpartition = _FAT_partition_getPartitionFromPath (path);\n\tif (partition == NULL) {\n\t\tr->_errno = ENODEV;\n\t\treturn -1;\n\t}\n\n\t// Make sure we aren't trying to write to a read-only disc\n\tif (partition->readOnly) {\n\t\tr->_errno = EROFS;\n\t\treturn -1;\n\t}\t\n\n\t// Move the path pointer to the start of the actual path\n\tif (strchr (path, ':') != NULL) {\n\t\tpath = strchr (path, ':') + 1;\n\t}\n\tif (strchr (path, ':') != NULL) {\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\t\n\t_FAT_lock(&partition->lock);\n\t\n\t// Search for the file on the disc\n\tif (!_FAT_directory_entryFromPath (partition, &dirEntry, path, NULL)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = ENOENT;\n\t\treturn -1;\n\t}\n\t\n\tcluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData);\n\n\t\n\t// If this is a directory, make sure it is empty\n\tif (_FAT_directory_isDirectory (&dirEntry)) {\n\t\tnextEntry = _FAT_directory_getFirstEntry (partition, &dirContents, cluster);\n\t\n\t\twhile (nextEntry) {\n\t\t\tif (!_FAT_directory_isDot (&dirContents)) {\n\t\t\t\t// The directory had something in it that isn't a reference to itself or it's parent\n\t\t\t\t_FAT_unlock(&partition->lock);\n\t\t\t\tr->_errno = EPERM;\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tnextEntry = _FAT_directory_getNextEntry (partition, &dirContents);\n\t\t}\n\t}\n\n\tif (_FAT_fat_isValidCluster(partition, cluster)) {\n\t\t// Remove the cluster chain for this file\n\t\tif (!_FAT_fat_clearLinks (partition, cluster)) {\n\t\t\tr->_errno = EIO;\n\t\t\terrorOccured = true;\n\t\t}\n\t}\n\n\t// Remove the directory entry for this file\n\tif (!_FAT_directory_removeEntry (partition, &dirEntry)) {\n\t\tr->_errno = EIO;\n\t\terrorOccured = true;\n\t}\n\t\n\t// Flush any sectors in the disc cache\n\tif (!_FAT_cache_flush(partition->cache)) {\n\t\tr->_errno = EIO;\n\t\terrorOccured = true;\n\t}\n\t\n\t_FAT_unlock(&partition->lock);\n\tif (errorOccured) {\n\t\treturn -1;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nint _FAT_chdir_r (struct _reent *r, const char *path) {\n\tPARTITION* partition = NULL;\n\t\n\t// Get the partition this directory is on\n\tpartition = _FAT_partition_getPartitionFromPath (path);\n\tif (partition == NULL) {\n\t\tr->_errno = ENODEV;\n\t\treturn -1;\n\t}\n\n\t// Move the path pointer to the start of the actual path\n\tif (strchr (path, ':') != NULL) {\n\t\tpath = strchr (path, ':') + 1;\n\t}\n\tif (strchr (path, ':') != NULL) {\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\t\n\t_FAT_lock(&partition->lock);\n\n\t// Try changing directory\n\tif (_FAT_directory_chdir (partition, path)) {\n\t\t// Successful\n\t\t_FAT_unlock(&partition->lock);\n\t\treturn 0;\n\t} else {\n\t\t// Failed\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = ENOTDIR;\n\t\treturn -1;\n\t}\n}\n\nint _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName) {\n\tPARTITION* partition = NULL;\n\tDIR_ENTRY oldDirEntry;\n\tDIR_ENTRY newDirEntry;\n\tconst char *pathEnd;\n\tuint32_t dirCluster;\n\t\n\t// Get the partition this directory is on\n\tpartition = _FAT_partition_getPartitionFromPath (oldName);\n\tif (partition == NULL) {\n\t\tr->_errno = ENODEV;\n\t\treturn -1;\n\t}\n\t\n\t_FAT_lock(&partition->lock);\n\t\n\t// Make sure the same partition is used for the old and new names\n\tif (partition != _FAT_partition_getPartitionFromPath (newName)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EXDEV;\n\t\treturn -1;\n\t}\n\n\t// Make sure we aren't trying to write to a read-only disc\n\tif (partition->readOnly) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EROFS;\n\t\treturn -1;\n\t}\t\n\n\t// Move the path pointer to the start of the actual path\n\tif (strchr (oldName, ':') != NULL) {\n\t\toldName = strchr (oldName, ':') + 1;\n\t}\n\tif (strchr (oldName, ':') != NULL) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\tif (strchr (newName, ':') != NULL) {\n\t\tnewName = strchr (newName, ':') + 1;\n\t}\n\tif (strchr (newName, ':') != NULL) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\n\t// Search for the file on the disc\n\tif (!_FAT_directory_entryFromPath (partition, &oldDirEntry, oldName, NULL)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = ENOENT;\n\t\treturn -1;\n\t}\n\t\n\t// Make sure there is no existing file / directory with the new name\n\tif (_FAT_directory_entryFromPath (partition, &newDirEntry, newName, NULL)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EEXIST;\n\t\treturn -1;\n\t}\n\n\t// Create the new file entry\n\t// Get the directory it has to go in \n\tpathEnd = strrchr (newName, DIR_SEPARATOR);\n\tif (pathEnd == NULL) {\n\t\t// No path was specified\n\t\tdirCluster = partition->cwdCluster;\n\t\tpathEnd = newName;\n\t} else {\n\t\t// Path was specified -- get the right dirCluster\n\t\t// Recycling newDirEntry, since it needs to be recreated anyway\n\t\tif (!_FAT_directory_entryFromPath (partition, &newDirEntry, newName, pathEnd) ||\n\t\t\t!_FAT_directory_isDirectory(&newDirEntry)) {\n\t\t\t_FAT_unlock(&partition->lock);\n\t\t\tr->_errno = ENOTDIR;\n\t\t\treturn -1;\n\t\t}\n\t\tdirCluster = _FAT_directory_entryGetCluster (partition, newDirEntry.entryData);\n\t\t// Move the pathEnd past the last DIR_SEPARATOR\n\t\tpathEnd += 1;\n\t}\n\n\t// Copy the entry data\n\tmemcpy (&newDirEntry, &oldDirEntry, sizeof(DIR_ENTRY));\n\t\n\t// Set the new name\n\tstrncpy (newDirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1);\n\t\n\t// Write the new entry\n\tif (!_FAT_directory_addEntry (partition, &newDirEntry, dirCluster)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = ENOSPC;\n\t\treturn -1;\n\t}\n\t\n\t// Remove the old entry\n\tif (!_FAT_directory_removeEntry (partition, &oldDirEntry)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EIO;\n\t\treturn -1;\n\t}\n\t\n\t// Flush any sectors in the disc cache\n\tif (!_FAT_cache_flush (partition->cache)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EIO;\n\t\treturn -1;\n\t}\n\n\t_FAT_unlock(&partition->lock);\n\treturn 0;\n}\n\nint _FAT_mkdir_r (struct _reent *r, const char *path, int mode) {\n\tPARTITION* partition = NULL;\n\tbool fileExists;\n\tDIR_ENTRY dirEntry;\n\tconst char* pathEnd;\n\tuint32_t parentCluster, dirCluster;\n\tuint8_t newEntryData[DIR_ENTRY_DATA_SIZE];\n\n\tpartition = _FAT_partition_getPartitionFromPath (path);\n\tif (partition == NULL) {\n\t\tr->_errno = ENODEV;\n\t\treturn -1;\n\t}\n\n\t// Move the path pointer to the start of the actual path\n\tif (strchr (path, ':') != NULL) {\n\t\tpath = strchr (path, ':') + 1;\n\t}\n\tif (strchr (path, ':') != NULL) {\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\t\n\t_FAT_lock(&partition->lock);\n\n\t// Search for the file/directory on the disc\n\tfileExists = _FAT_directory_entryFromPath (partition, &dirEntry, path, NULL);\n\t\n\t// Make sure it doesn't exist\n\tif (fileExists) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EEXIST;\n\t\treturn -1;\n\t}\n\t\n\tif (partition->readOnly) {\n\t\t// We can't write to a read-only partition\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EROFS;\n\t\treturn -1;\n\t}\t\n\t\n\t// Get the directory it has to go in \n\tpathEnd = strrchr (path, DIR_SEPARATOR);\n\tif (pathEnd == NULL) {\n\t\t// No path was specified\n\t\tparentCluster = partition->cwdCluster;\n\t\tpathEnd = path;\n\t} else {\n\t\t// Path was specified -- get the right parentCluster\n\t\t// Recycling dirEntry, since it needs to be recreated anyway\n\t\tif (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) ||\n\t\t\t!_FAT_directory_isDirectory(&dirEntry)) {\n\t\t\t_FAT_unlock(&partition->lock);\n\t\t\tr->_errno = ENOTDIR;\n\t\t\treturn -1;\n\t\t}\n\t\tparentCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData);\n\t\t// Move the pathEnd past the last DIR_SEPARATOR\n\t\tpathEnd += 1;\n\t}\n\t// Create the entry data\n\tstrncpy (dirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1);\n\tmemset (dirEntry.entryData, 0, DIR_ENTRY_DATA_SIZE);\n\t\n\t// Set the creation time and date\n\tdirEntry.entryData[DIR_ENTRY_cTime_ms] = 0;\n\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_cTime, _FAT_filetime_getTimeFromRTC());\n\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_cDate, _FAT_filetime_getDateFromRTC());\n\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_mTime, _FAT_filetime_getTimeFromRTC());\n\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_mDate, _FAT_filetime_getDateFromRTC());\n\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_aDate, _FAT_filetime_getDateFromRTC());\n\t\n\t// Set the directory attribute\n\tdirEntry.entryData[DIR_ENTRY_attributes] = ATTRIB_DIR;\n\t\n\t// Get a cluster for the new directory\n\tdirCluster = _FAT_fat_linkFreeClusterCleared (partition, CLUSTER_FREE);\n\tif (!_FAT_fat_isValidCluster(partition, dirCluster)) {\n\t\t// No space left on disc for the cluster\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = ENOSPC;\n\t\treturn -1;\n\t}\n\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_cluster, dirCluster);\n\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_clusterHigh, dirCluster >> 16);\n\n\t// Write the new directory's entry to it's parent\n\tif (!_FAT_directory_addEntry (partition, &dirEntry, parentCluster)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = ENOSPC;\n\t\treturn -1;\n\t}\n\t\n\t// Create the dot entry within the directory\n\tmemset (newEntryData, 0, DIR_ENTRY_DATA_SIZE);\n\tmemset (newEntryData, ' ', 11);\n\tnewEntryData[DIR_ENTRY_name] = '.';\n\tnewEntryData[DIR_ENTRY_attributes] = ATTRIB_DIR;\n\tu16_to_u8array (newEntryData, DIR_ENTRY_cluster, dirCluster);\n\tu16_to_u8array (newEntryData, DIR_ENTRY_clusterHigh, dirCluster >> 16);\n\t\n\t// Write it to the directory, erasing that sector in the process\n\t_FAT_cache_eraseWritePartialSector ( partition->cache, newEntryData, \n\t\t_FAT_fat_clusterToSector (partition, dirCluster), 0, DIR_ENTRY_DATA_SIZE);\n\t\n\t\n\t// Create the double dot entry within the directory\n\n\t// if ParentDir == Rootdir then \"..\"\" always link to Cluster 0\n\tif(parentCluster == partition->rootDirCluster)\n\t\tparentCluster = FAT16_ROOT_DIR_CLUSTER;\n\n\tnewEntryData[DIR_ENTRY_name + 1] = '.';\n\tu16_to_u8array (newEntryData, DIR_ENTRY_cluster, parentCluster);\n\tu16_to_u8array (newEntryData, DIR_ENTRY_clusterHigh, parentCluster >> 16);\n\n\t// Write it to the directory\n\t_FAT_cache_writePartialSector ( partition->cache, newEntryData, \n\t\t_FAT_fat_clusterToSector (partition, dirCluster), DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\n\t// Flush any sectors in the disc cache\n\tif (!_FAT_cache_flush(partition->cache)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EIO;\n\t\treturn -1;\n\t}\n\n\t_FAT_unlock(&partition->lock);\n\treturn 0;\n}\n//\n//int _FAT_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf) \n//{\n//\tPARTITION* partition = NULL;\n//\tunsigned int freeClusterCount;\n//\n//\t// Get the partition of the requested path\n//\tpartition = _FAT_partition_getPartitionFromPath (path);\n//\tif (partition == NULL) {\n//\t\tr->_errno = ENODEV;\n//\t\treturn -1;\n//\t}\n//\n//\t_FAT_lock(&partition->lock);\n//\n//\tfreeClusterCount = _FAT_fat_freeClusterCount (partition);\n//\t\n//\t// FAT clusters = POSIX blocks\n//\tbuf->f_bsize = partition->bytesPerCluster;\t\t// File system block size. \n//\tbuf->f_frsize = partition->bytesPerCluster;\t// Fundamental file system block size. \n//\t\n//\tbuf->f_blocks\t= partition->fat.lastCluster - CLUSTER_FIRST + 1; // Total number of blocks on file system in units of f_frsize. \n//\tbuf->f_bfree = freeClusterCount;\t// Total number of free blocks. \n//\tbuf->f_bavail\t= freeClusterCount;\t// Number of free blocks available to non-privileged process. \n//\n//\t// Treat requests for info on inodes as clusters\n//\tbuf->f_files = partition->fat.lastCluster - CLUSTER_FIRST + 1;\t// Total number of file serial numbers. \n//\tbuf->f_ffree = freeClusterCount;\t// Total number of free file serial numbers. \n//\tbuf->f_favail = freeClusterCount;\t// Number of file serial numbers available to non-privileged process. \n//\t\n//\t// File system ID. 32bit ioType value\n//\tbuf->f_fsid = _FAT_disc_hostType(partition->disc); \n//\t\n//\t// Bit mask of f_flag values.\n//\tbuf->f_flag = ST_NOSUID /* No support for ST_ISUID and ST_ISGID file mode bits */\n//\t\t| (partition->readOnly ? ST_RDONLY /* Read only file system */ : 0 ) ;\n//\t// Maximum filename length.\n//\tbuf->f_namemax = MAX_FILENAME_LENGTH;\t \n//\n//\t_FAT_unlock(&partition->lock);\n//\treturn 0;\n//}\n\nDIR_ITER* _FAT_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path) {\n\tDIR_ENTRY dirEntry;\n\tDIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct);\n\tbool fileExists;\n\t\n\tstate->partition = _FAT_partition_getPartitionFromPath (path);\n\tif (state->partition == NULL) {\n\t\tr->_errno = ENODEV;\n\t\treturn NULL;\n\t}\n\n\t// Move the path pointer to the start of the actual path\n\tif (strchr (path, ':') != NULL) {\n\t\tpath = strchr (path, ':') + 1;\n\t}\n\tif (strchr (path, ':') != NULL) {\n\t\tr->_errno = EINVAL;\n\t\treturn NULL;\n\t}\n\t\n\t_FAT_lock(&state->partition->lock);\n\t\n\t// Get the start cluster of the directory\n\tfileExists = _FAT_directory_entryFromPath (state->partition, &dirEntry, path, NULL);\n\t\n\tif (!fileExists) {\n\t\t_FAT_unlock(&state->partition->lock);\n\t\tr->_errno = ENOENT;\n\t\treturn NULL;\n\t}\n\t\n\t// Make sure it is a directory\n\tif (! _FAT_directory_isDirectory (&dirEntry)) {\n\t\t_FAT_unlock(&state->partition->lock);\n\t\tr->_errno = ENOTDIR;\n\t\treturn NULL;\n\t}\n\n\t// Save the start cluster for use when resetting the directory data\n\tstate->startCluster = _FAT_directory_entryGetCluster (state->partition, dirEntry.entryData);\n\t\n\t// Get the first entry for use with a call to dirnext\n\tstate->validEntry = \n\t\t_FAT_directory_getFirstEntry (state->partition, &(state->currentEntry), state->startCluster);\n\t\n\t// We are now using this entry\n\tstate->inUse = true;\n\t_FAT_unlock(&state->partition->lock);\n\treturn (DIR_ITER*) state;\n}\n\nint _FAT_dirreset_r (struct _reent *r, DIR_ITER *dirState) {\n\tDIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct);\n\n\t_FAT_lock(&state->partition->lock);\n\t\n\t// Make sure we are still using this entry\n\tif (!state->inUse) {\n\t\t_FAT_unlock(&state->partition->lock);\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\t// Get the first entry for use with a call to dirnext\n\tstate->validEntry = \n\t\t_FAT_directory_getFirstEntry (state->partition, &(state->currentEntry), state->startCluster);\n\n\t_FAT_unlock(&state->partition->lock);\n\treturn 0;\n}\n\nint _FAT_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat) {\n\tDIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct);\n\n\t_FAT_lock(&state->partition->lock);\n\t\n\t// Make sure we are still using this entry\n\tif (!state->inUse) {\n\t\t_FAT_unlock(&state->partition->lock);\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\t\n\t// Make sure there is another file to report on\n\tif (! state->validEntry) {\n\t\t_FAT_unlock(&state->partition->lock);\n\t\tr->_errno = ENOENT;\n\t\treturn -1;\n\t}\n\n\t// Get the filename\n\tstrncpy (filename, state->currentEntry.filename, MAX_FILENAME_LENGTH);\n\t// Get the stats, if requested\n\tif (filestat != NULL) {\n\t\t_FAT_directory_entryStat (state->partition, &(state->currentEntry), filestat);\n\t}\n\t\n\t// Look for the next entry for use next time\n\tstate->validEntry = \n\t\t_FAT_directory_getNextEntry (state->partition, &(state->currentEntry));\n\n\t_FAT_unlock(&state->partition->lock);\n\treturn 0;\n}\n\nint _FAT_dirclose_r (struct _reent *r, DIR_ITER *dirState) {\n\tDIR_STATE_STRUCT* state = (DIR_STATE_STRUCT*) (dirState->dirStruct);\n\t\n\t// We are no longer using this entry\n\t_FAT_lock(&state->partition->lock);\n\tstate->inUse = false;\n\t_FAT_unlock(&state->partition->lock);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/fatdir.h",
    "content": "/*\n fatdir.h\n \n Functions used by the newlib disc stubs to interface with \n this library\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n\n#ifndef _FATDIR_H\n#define _FATDIR_H\n\n#include <sys/stat.h>\n\n#include \"common.h\"\n#include \"directory.h\"\n\n#ifndef LIBFAT_PC\n#include <sys/statvfs.h>\n#include <sys/iosupport.h>\n#include <sys/reent.h>\n#endif\n\n\ntypedef struct {\n\tPARTITION* partition;\n\tDIR_ENTRY  currentEntry;\n\tuint32_t   startCluster;\n\tbool       inUse;\n\tbool       validEntry;\n} DIR_STATE_STRUCT;\n\nextern int _FAT_stat_r (struct _reent *r, const char *path, struct stat *st);\n\nextern int _FAT_link_r (struct _reent *r, const char *existing, const char *newLink);\n\nextern int _FAT_unlink_r (struct _reent *r, const char *name);\n\nextern int _FAT_chdir_r (struct _reent *r, const char *name);\n\nextern int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName);\n\nextern int _FAT_mkdir_r (struct _reent *r, const char *path, int mode);\n\nextern int _FAT_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf);\n\n/*\nDirectory iterator functions\n*/\nextern DIR_ITER* _FAT_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path);\nextern int _FAT_dirreset_r (struct _reent *r, DIR_ITER *dirState);\nextern int _FAT_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat);\nextern int _FAT_dirclose_r (struct _reent *r, DIR_ITER *dirState);\n\n\n#endif // _FATDIR_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/fatfile.cpp",
    "content": "/*\n fatfile.c\n\n Functions used by the newlib disc stubs to interface with\n this library\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n 2009-10-23 oggzee: fixes for cluster aligned file size (write, truncate, seek)\n*/\n\n\n#include \"fatfile.h\"\n\n#include <fcntl.h>\n#include <string.h>\n#include <errno.h>\n#include <ctype.h>\n#ifndef _MSC_VER\n#include <unistd.h>\n#endif\n\n#include \"cache.h\"\n#include \"file_allocation_table.h\"\n#include \"bit_ops.h\"\n#include \"filetime.h\"\n#include \"lock.h\"\n\nintptr_t _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode) {\n\tPARTITION* partition = NULL;\n\tbool fileExists;\n\tDIR_ENTRY dirEntry;\n\tconst char* pathEnd;\n\tuint32_t dirCluster;\n\tFILE_STRUCT* file = (FILE_STRUCT*) fileStruct;\n\tpartition = _FAT_partition_getPartitionFromPath (path);\n\n\tif (partition == NULL) {\n\t\tr->_errno = ENODEV;\n\t\treturn -1;\n\t}\n\n\t// Move the path pointer to the start of the actual path\n\tif (strchr (path, ':') != NULL) {\n\t\tpath = strchr (path, ':') + 1;\n\t}\n\tif (strchr (path, ':') != NULL) {\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\n\t// Determine which mode the file is openned for\n\tif ((flags & 0x03) == O_RDONLY) {\n\t\t// Open the file for read-only access\n\t\tfile->read = true;\n\t\tfile->write = false;\n\t\tfile->append = false;\n\t} else if ((flags & 0x03) == O_WRONLY) {\n\t\t// Open file for write only access\n\t\tfile->read = false;\n\t\tfile->write = true;\n\t\tfile->append = false;\n\t} else if ((flags & 0x03) == O_RDWR) {\n\t\t// Open file for read/write access\n\t\tfile->read = true;\n\t\tfile->write = true;\n\t\tfile->append = false;\n\t} else {\n\t\tr->_errno = EACCES;\n\t\treturn -1;\n\t}\n\n\t// Make sure we aren't trying to write to a read-only disc\n\tif (file->write && partition->readOnly) {\n\t\tr->_errno = EROFS;\n\t\treturn -1;\n\t}\n\n\t// Search for the file on the disc\n\t_FAT_lock(&partition->lock);\n\tfileExists = _FAT_directory_entryFromPath (partition, &dirEntry, path, NULL);\n\n\t// The file shouldn't exist if we are trying to create it\n\tif ((flags & O_CREAT) && (flags & O_EXCL) && fileExists) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EEXIST;\n\t\treturn -1;\n\t}\n\n\t// It should not be a directory if we're openning a file,\n\tif (fileExists && _FAT_directory_isDirectory(&dirEntry)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EISDIR;\n\t\treturn -1;\n\t}\n\n\t// We haven't modified the file yet\n\tfile->modified = false;\n\n\t// If the file doesn't exist, create it if we're allowed to\n\tif (!fileExists) {\n\t\tif (flags & O_CREAT) {\n\t\t\tif (partition->readOnly) {\n\t\t\t\t// We can't write to a read-only partition\n\t\t\t\t_FAT_unlock(&partition->lock);\n\t\t\t\tr->_errno = EROFS;\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\t// Create the file\n\t\t\t// Get the directory it has to go in\n\t\t\tpathEnd = strrchr (path, DIR_SEPARATOR);\n\t\t\tif (pathEnd == NULL) {\n\t\t\t\t// No path was specified\n\t\t\t\tdirCluster = partition->cwdCluster;\n\t\t\t\tpathEnd = path;\n\t\t\t} else {\n\t\t\t\t// Path was specified -- get the right dirCluster\n\t\t\t\t// Recycling dirEntry, since it needs to be recreated anyway\n\t\t\t\tif (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) ||\n\t\t\t\t\t!_FAT_directory_isDirectory(&dirEntry)) {\n\t\t\t\t\t_FAT_unlock(&partition->lock);\n\t\t\t\t\tr->_errno = ENOTDIR;\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tdirCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData);\n\t\t\t\t// Move the pathEnd past the last DIR_SEPARATOR\n\t\t\t\tpathEnd += 1;\n\t\t\t}\n\t\t\t// Create the entry data\n\t\t\tstrncpy (dirEntry.filename, pathEnd, MAX_FILENAME_LENGTH - 1);\n\t\t\tmemset (dirEntry.entryData, 0, DIR_ENTRY_DATA_SIZE);\n\n\t\t\t// Set the creation time and date\n\t\t\tdirEntry.entryData[DIR_ENTRY_cTime_ms] = 0;\n\t\t\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_cTime, _FAT_filetime_getTimeFromRTC());\n\t\t\tu16_to_u8array (dirEntry.entryData, DIR_ENTRY_cDate, _FAT_filetime_getDateFromRTC());\n\n\t\t\tif (!_FAT_directory_addEntry (partition, &dirEntry, dirCluster)) {\n\t\t\t\t_FAT_unlock(&partition->lock);\n\t\t\t\tr->_errno = ENOSPC;\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// File entry is modified\n\t\t\tfile->modified = true;\n\t\t} else {\n\t\t\t// file doesn't exist, and we aren't creating it\n\t\t\t_FAT_unlock(&partition->lock);\n\t\t\tr->_errno = ENOENT;\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\tfile->filesize = u8array_to_u32 (dirEntry.entryData, DIR_ENTRY_fileSize);\n\n\t/* Allow LARGEFILEs with undefined results\n\t// Make sure that the file size can fit in the available space\n\tif (!(flags & O_LARGEFILE) && (file->filesize >= (1<<31))) {\n\t\tr->_errno = EFBIG;\n\t\treturn -1;\n\t}\n\t*/\n\n\t// Make sure we aren't trying to write to a read-only file\n\tif (file->write && !_FAT_directory_isWritable(&dirEntry)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EROFS;\n\t\treturn -1;\n\t}\n\n\t// Associate this file with a particular partition\n\tfile->partition = partition;\n\n\tfile->startCluster = _FAT_directory_entryGetCluster (partition, dirEntry.entryData);\n\n\t// Truncate the file if requested\n\tif ((flags & O_TRUNC) && file->write && (file->startCluster != 0)) {\n\t\t_FAT_fat_clearLinks (partition, file->startCluster);\n\t\tfile->startCluster = CLUSTER_FREE;\n\t\tfile->filesize = 0;\n\t\t// File is modified since we just cut it all off\n\t\tfile->modified = true;\n\t}\n\n\t// Remember the position of this file's directory entry\n\tfile->dirEntryStart = dirEntry.dataStart;\t\t// Points to the start of the LFN entries of a file, or the alias for no LFN\n\tfile->dirEntryEnd = dirEntry.dataEnd;\n\n\t// Reset read/write pointer\n\tfile->currentPosition = 0;\n\tfile->rwPosition.cluster = file->startCluster;\n\tfile->rwPosition.sector =  0;\n\tfile->rwPosition.byte = 0;\n\n\tif (flags & O_APPEND) {\n\t\tfile->append = true;\n\n\t\t// Set append pointer to the end of the file\n\t\tfile->appendPosition.cluster = _FAT_fat_lastCluster (partition, file->startCluster);\n\t\tfile->appendPosition.sector = (file->filesize % partition->bytesPerCluster) / BYTES_PER_READ;\n\t\tfile->appendPosition.byte = file->filesize % BYTES_PER_READ;\n\n\t\t// Check if the end of the file is on the end of a cluster\n\t\tif ( (file->filesize > 0) && ((file->filesize % partition->bytesPerCluster)==0) ){\n\t\t\t// Set flag to allocate a new cluster\n\t\t\tfile->appendPosition.sector = partition->sectorsPerCluster;\n\t\t\tfile->appendPosition.byte = 0;\n\t\t}\n\t} else {\n\t\tfile->append = false;\n\t\t// Use something sane for the append pointer, so the whole file struct contains known values\n\t\tfile->appendPosition = file->rwPosition;\n\t}\n\n\tfile->inUse = true;\n\n\t// Insert this file into the double-linked list of open files\n\tpartition->openFileCount += 1;\n\tif (partition->firstOpenFile) {\n\t\tfile->nextOpenFile = partition->firstOpenFile;\n\t\tpartition->firstOpenFile->prevOpenFile = file;\n\t} else {\n\t\tfile->nextOpenFile = NULL;\n\t}\n\tfile->prevOpenFile = NULL;\n\tpartition->firstOpenFile = file;\n\n\t_FAT_unlock(&partition->lock);\n\n\treturn (intptr_t) file;\n}\n\n/*\nSynchronizes the file data to disc.\nDoes no locking of its own -- lock the partition before calling.\nReturns 0 on success, an error code on failure.\n*/\nint _FAT_syncToDisc (FILE_STRUCT* file) {\n\tuint8_t dirEntryData[DIR_ENTRY_DATA_SIZE];\n\n\tif (!file || !file->inUse) {\n\t\treturn EBADF;\n\t}\n\n\tif (file->write && file->modified) {\n\t\t// Load the old entry\n\t\t_FAT_cache_readPartialSector (file->partition->cache, dirEntryData,\n\t\t\t_FAT_fat_clusterToSector(file->partition, file->dirEntryEnd.cluster) + file->dirEntryEnd.sector,\n\t\t\tfile->dirEntryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\n\t\t// Write new data to the directory entry\n\t\t// File size\n\t\tu32_to_u8array (dirEntryData, DIR_ENTRY_fileSize, file->filesize);\n\n\t\t// Start cluster\n\t\tu16_to_u8array (dirEntryData, DIR_ENTRY_cluster, file->startCluster);\n\t\tu16_to_u8array (dirEntryData, DIR_ENTRY_clusterHigh, file->startCluster >> 16);\n\n\t\t// Modification time and date\n\t\tu16_to_u8array (dirEntryData, DIR_ENTRY_mTime, _FAT_filetime_getTimeFromRTC());\n\t\tu16_to_u8array (dirEntryData, DIR_ENTRY_mDate, _FAT_filetime_getDateFromRTC());\n\n\t\t// Access date\n\t\tu16_to_u8array (dirEntryData, DIR_ENTRY_aDate, _FAT_filetime_getDateFromRTC());\n\n\t\t// Set archive attribute\n\t\tdirEntryData[DIR_ENTRY_attributes] |= ATTRIB_ARCH;\n\n\t\t// Write the new entry\n\t\t_FAT_cache_writePartialSector (file->partition->cache, dirEntryData,\n\t\t\t_FAT_fat_clusterToSector(file->partition, file->dirEntryEnd.cluster) + file->dirEntryEnd.sector,\n\t\t\tfile->dirEntryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE);\n\n\t\t// Flush any sectors in the disc cache\n\t\tif (!_FAT_cache_flush(file->partition->cache)) {\n\t\t\treturn EIO;\n\t\t}\n\t}\n\n\tfile->modified = false;\n\n\treturn 0;\n}\n\n\nintptr_t _FAT_close_r (struct _reent *r, intptr_t fd) {\n\tFILE_STRUCT* file = (FILE_STRUCT*)  fd;\n\tintptr_t ret = 0;\n\n\tif (!file->inUse) {\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\t_FAT_lock(&file->partition->lock);\n\n\tif (file->write) {\n\t\tret = _FAT_syncToDisc (file);\n\t\tif (ret != 0) {\n\t\t\tr->_errno = ret;\n\t\t\tret = -1;\n\t\t}\n\t}\n\n\tfile->inUse = false;\n\n\t// Remove this file from the double-linked list of open files\n\tfile->partition->openFileCount -= 1;\n\tif (file->nextOpenFile) {\n\t\tfile->nextOpenFile->prevOpenFile = file->prevOpenFile;\n\t}\n\tif (file->prevOpenFile) {\n\t\tfile->prevOpenFile->nextOpenFile = file->nextOpenFile;\n\t} else {\n\t\tfile->partition->firstOpenFile = file->nextOpenFile;\n\t}\n\n\t_FAT_unlock(&file->partition->lock);\n\n\treturn ret;\n}\n\nssize_t _FAT_read_r (struct _reent *r, intptr_t fd, char *ptr, size_t len) {\n\tFILE_STRUCT* file = (FILE_STRUCT*)  fd;\n\tPARTITION* partition;\n\tCACHE* cache;\n\tFILE_POSITION position;\n\tuint32_t tempNextCluster;\n\tunsigned int tempVar;\n\tsize_t remain;\n\tbool flagNoError = true;\n\n\t// Short circuit cases where len is 0 (or less)\n\tif (len <= 0) {\n\t\treturn 0;\n\t}\n\n\t// Make sure we can actually read from the file\n\tif ((file == NULL) || !file->inUse || !file->read) {\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\tpartition = file->partition;\n\t_FAT_lock(&partition->lock);\n\n\t// Don't try to read if the read pointer is past the end of file\n\tif (file->currentPosition >= file->filesize || file->startCluster == CLUSTER_FREE) {\n\t\tr->_errno = EOVERFLOW;\n\t\t_FAT_unlock(&partition->lock);\n\t\treturn 0;\n\t}\n\n\t// Don't read past end of file\n\tif (len + file->currentPosition > file->filesize) {\n\t\tr->_errno = EOVERFLOW;\n\t\tlen = file->filesize - file->currentPosition;\n\t}\n\n\tremain = len;\n\tposition = file->rwPosition;\n\tcache = file->partition->cache;\n\n\t// Align to sector\n\ttempVar = BYTES_PER_READ - position.byte;\n\tif (tempVar > remain) {\n\t\ttempVar = remain;\n\t}\n\n\tif ((tempVar < BYTES_PER_READ) && flagNoError)\n\t{\n\t\t_FAT_cache_readPartialSector ( cache, ptr, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector,\n\t\t\tposition.byte, tempVar);\n\n\t\tremain -= tempVar;\n\t\tptr += tempVar;\n\n\t\tposition.byte += tempVar;\n\t\tif (position.byte >= BYTES_PER_READ) {\n\t\t\tposition.byte = 0;\n\t\t\tposition.sector++;\n\t\t}\n\t}\n\n\t// align to cluster\n\t// tempVar is number of sectors to read\n\tif (remain > (partition->sectorsPerCluster - position.sector) * BYTES_PER_READ) {\n\t\ttempVar = partition->sectorsPerCluster - position.sector;\n\t} else {\n\t\ttempVar = remain / BYTES_PER_READ;\n\t}\n\n\tif ((tempVar > 0) && flagNoError) {\n\t\tif (! _FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster) + position.sector,\n\t\t\ttempVar, ptr))\n\t\t{\n\t\t\tflagNoError = false;\n\t\t\tr->_errno = EIO;\n\t\t} else {\n\t\t\tptr += tempVar * BYTES_PER_READ;\n\t\t\tremain -= tempVar * BYTES_PER_READ;\n\t\t\tposition.sector += tempVar;\n\t\t}\n\t}\n\n\t// Move onto next cluster\n\t// It should get to here without reading anything if a cluster is due to be allocated\n\tif ((position.sector >= partition->sectorsPerCluster) && flagNoError) {\n\t\ttempNextCluster = _FAT_fat_nextCluster(partition, position.cluster);\n\t\tif ((remain == 0) && (tempNextCluster == CLUSTER_EOF)) {\n\t\t\tposition.sector = partition->sectorsPerCluster;\n\t\t} else if (!_FAT_fat_isValidCluster(partition, tempNextCluster)) {\n\t\t\tr->_errno = EIO;\n\t\t\tflagNoError = false;\n\t\t} else {\n\t\t\tposition.sector = 0;\n\t\t\tposition.cluster = tempNextCluster;\n\t\t}\n\t}\n\n\t// Read in whole clusters, contiguous blocks at a time\n\twhile ((remain >= partition->bytesPerCluster) && flagNoError) {\n\t\tuint32_t chunkEnd;\n\t\tuint32_t nextChunkStart = position.cluster;\n\t\tsize_t chunkSize = 0;\n\n\t\tdo {\n\t\t\tchunkEnd = nextChunkStart;\n\t\t\tnextChunkStart = _FAT_fat_nextCluster (partition, chunkEnd);\n\t\t\tchunkSize += partition->bytesPerCluster;\n\t\t} while ((nextChunkStart == chunkEnd + 1) &&\n#ifdef LIMIT_SECTORS\n\t\t \t(chunkSize + partition->bytesPerCluster <= LIMIT_SECTORS * BYTES_PER_READ) &&\n#endif\n\t\t\t(chunkSize + partition->bytesPerCluster <= remain));\n\n\t\tif (!_FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster),\n\t\t\t\tchunkSize / BYTES_PER_READ, ptr))\n\t\t{\n\t\t\tflagNoError = false;\n\t\t\tr->_errno = EIO;\n\t\t\tbreak;\n\t\t}\n\t\tptr += chunkSize;\n\t\tremain -= chunkSize;\n\n\t\t// Advance to next cluster\n\t\tif ((remain == 0) && (nextChunkStart == CLUSTER_EOF)) {\n\t\t\tposition.sector = partition->sectorsPerCluster;\n\t\t\tposition.cluster = chunkEnd;\n\t\t} else if (!_FAT_fat_isValidCluster(partition, nextChunkStart)) {\n\t\t\tr->_errno = EIO;\n\t\t\tflagNoError = false;\n\t\t} else {\n\t\t\tposition.sector = 0;\n\t\t\tposition.cluster = nextChunkStart;\n\t\t}\n\t}\n\n\t// Read remaining sectors\n\ttempVar = remain / BYTES_PER_READ; // Number of sectors left\n\tif ((tempVar > 0) && flagNoError) {\n\t\tif (!_FAT_cache_readSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster),\n\t\t\ttempVar, ptr))\n\t\t{\n\t\t\tflagNoError = false;\n\t\t\tr->_errno = EIO;\n\t\t} else {\n\t\t\tptr += tempVar * BYTES_PER_READ;\n\t\t\tremain -= tempVar * BYTES_PER_READ;\n\t\t\tposition.sector += tempVar;\n\t\t}\n\t}\n\n\t// Last remaining sector\n\t// Check if anything is left\n\tif ((remain > 0) && flagNoError) {\n\t\t_FAT_cache_readPartialSector ( cache, ptr,\n\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain);\n\t\tposition.byte += remain;\n\t\tremain = 0;\n\t}\n\n\t// Length read is the wanted length minus the stuff not read\n\tlen = len - remain;\n\n\t// Update file information\n\tfile->rwPosition = position;\n\tfile->currentPosition += len;\n\n\t_FAT_unlock(&partition->lock);\n\treturn len;\n}\n\n// if current position is on the cluster border and more data has to be written\n// then get next cluster or allocate next cluster\n// this solves the over-allocation problems when file size is aligned to cluster size\n// return true on succes, false on error\nstatic bool _FAT_check_position_for_next_cluster(struct _reent *r,\n\t\tFILE_POSITION *position, PARTITION* partition, size_t remain, bool *flagNoError)\n{\n\tuint32_t tempNextCluster;\n\t// do nothing if no more data to write\n\tif (remain == 0) return true;\n\tif (flagNoError && *flagNoError == false) return false;\n\tif ((remain < 0) || (position->sector > partition->sectorsPerCluster)) {\n\t\t// invalid arguments - internal error\n\t\tr->_errno = EINVAL;\n\t\tgoto err;\n\t}\n\tif (position->sector == partition->sectorsPerCluster) {\n\t\t// need to advance to next cluster\n\t\ttempNextCluster = _FAT_fat_nextCluster(partition, position->cluster);\n\t\tif ((tempNextCluster == CLUSTER_EOF) || (tempNextCluster == CLUSTER_FREE)) {\n\t\t\t// Ran out of clusters so get a new one\n\t\t\ttempNextCluster = _FAT_fat_linkFreeCluster(partition, position->cluster);\n\t\t}\n\t\tif (!_FAT_fat_isValidCluster(partition, tempNextCluster)) {\n\t\t\t// Couldn't get a cluster, so abort\n\t\t\tr->_errno = ENOSPC;\n\t\t\tgoto err;\n\t\t}\n\t\tposition->sector = 0;\n\t\tposition->cluster = tempNextCluster;\n\t}\n\treturn true;\nerr:\n\tif (flagNoError) *flagNoError = false;\n\treturn false;\n}\n\n/*\nExtend a file so that the size is the same as the rwPosition\n*/\nstatic bool _FAT_file_extend_r (struct _reent *r, FILE_STRUCT* file) {\n\tPARTITION* partition = file->partition;\n\tCACHE* cache = file->partition->cache;\n\tFILE_POSITION position;\n\tuint8_t zeroBuffer [BYTES_PER_READ] = {0};\n\tuint32_t remain;\n\tuint32_t tempNextCluster;\n\tunsigned int sector;\n\n\tposition.byte = file->filesize % BYTES_PER_READ;\n\tposition.sector = (file->filesize % partition->bytesPerCluster) / BYTES_PER_READ;\n\t// It is assumed that there is always a startCluster\n\t// This will be true when _FAT_file_extend_r is called from _FAT_write_r\n\tposition.cluster = _FAT_fat_lastCluster (partition, file->startCluster);\n\n\tremain = file->currentPosition - file->filesize;\n\n\tif ((remain > 0) && (file->filesize > 0) && (position.sector == 0) && (position.byte  == 0)) {\n\t\t// Get a new cluster on the edge of a cluster boundary\n\t\ttempNextCluster = _FAT_fat_linkFreeCluster(partition, position.cluster);\n\t\tif (!_FAT_fat_isValidCluster(partition, tempNextCluster)) {\n\t\t\t// Couldn't get a cluster, so abort\n\t\t\tr->_errno = ENOSPC;\n\t\t\treturn false;\n\t\t}\n\t\tposition.cluster = tempNextCluster;\n\t\tposition.sector = 0;\n\t}\n\n\tif (remain + position.byte < BYTES_PER_READ) {\n\t\t// Only need to clear to the end of the sector\n\t\t_FAT_cache_writePartialSector (cache, zeroBuffer,\n\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, remain);\n\t\tposition.byte += remain;\n\t} else {\n\t\tif (position.byte > 0) {\n\t\t\t_FAT_cache_writePartialSector (cache, zeroBuffer,\n\t\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte,\n\t\t\t\tBYTES_PER_READ - position.byte);\n\t\t\tremain -= (BYTES_PER_READ - position.byte);\n\t\t\tposition.byte = 0;\n\t\t\tposition.sector ++;\n\t\t}\n\n\t\twhile (remain >= BYTES_PER_READ) {\n\t\t\tif (position.sector >= partition->sectorsPerCluster) {\n\t\t\t\tposition.sector = 0;\n\t\t\t\t// Ran out of clusters so get a new one\n\t\t\t\ttempNextCluster = _FAT_fat_linkFreeCluster(partition, position.cluster);\n\t\t\t\tif (!_FAT_fat_isValidCluster(partition, tempNextCluster)) {\n\t\t\t\t\t// Couldn't get a cluster, so abort\n\t\t\t\t\tr->_errno = ENOSPC;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tposition.cluster = tempNextCluster;\n\t\t\t}\n\n\t\t\tsector = _FAT_fat_clusterToSector (partition, position.cluster) + position.sector;\n\t\t\t_FAT_cache_writeSectors (cache, sector, 1, zeroBuffer);\n\n\t\t\tremain -= BYTES_PER_READ;\n\t\t\tposition.sector ++;\n\t\t}\n\n\t\tif (!_FAT_check_position_for_next_cluster(r, &position, partition, remain, NULL)) {\n\t\t\t// error already marked\n\t\t\treturn false;\n\t\t}\n\n\t\tif (remain > 0) {\n\t\t\t_FAT_cache_writePartialSector (cache, zeroBuffer,\n\t\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain);\n\t\t\tposition.byte = remain;\n\t\t}\n\t}\n\n\tfile->rwPosition = position;\n\tfile->filesize = file->currentPosition;\n\treturn true;\n}\n\nssize_t _FAT_write_r (struct _reent *r, intptr_t fd, const char *ptr, size_t len) {\n\tFILE_STRUCT* file = (FILE_STRUCT*)  fd;\n\tPARTITION* partition;\n\tCACHE* cache;\n\tFILE_POSITION position;\n\tuint32_t tempNextCluster;\n\tunsigned int tempVar;\n\tsize_t remain;\n\tbool flagNoError = true;\n\tbool flagAppending = false;\n\n\t// Make sure we can actually write to the file\n\tif ((file == NULL) || !file->inUse || !file->write) {\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\tpartition = file->partition;\n\tcache = file->partition->cache;\n\t_FAT_lock(&partition->lock);\n\n\t// Only write up to the maximum file size, taking into account wrap-around of ints\n\tif (len + file->filesize > FILE_MAX_SIZE || len + file->filesize < file->filesize) {\n\t\tlen = FILE_MAX_SIZE - file->filesize;\n\t}\n\n\t// Short circuit cases where len is 0 (or less)\n\tif (len <= 0) {\n\t\t_FAT_unlock(&partition->lock);\n\t\treturn 0;\n\t}\n\n\tremain = len;\n\n\t// Get a new cluster for the start of the file if required\n\tif (file->startCluster == CLUSTER_FREE) {\n\t\ttempNextCluster = _FAT_fat_linkFreeCluster (partition, CLUSTER_FREE);\n\t\tif (!_FAT_fat_isValidCluster(partition, tempNextCluster)) {\n\t\t\t// Couldn't get a cluster, so abort immediately\n\t\t\t_FAT_unlock(&partition->lock);\n\t\t\tr->_errno = ENOSPC;\n\t\t\treturn -1;\n\t\t}\n\t\tfile->startCluster = tempNextCluster;\n\n\t\t// Appending starts at the begining for a 0 byte file\n\t\tfile->appendPosition.cluster = file->startCluster;\n\t\tfile->appendPosition.sector = 0;\n\t\tfile->appendPosition.byte = 0;\n\n\t\tfile->rwPosition.cluster = file->startCluster;\n\t\tfile->rwPosition.sector =  0;\n\t\tfile->rwPosition.byte = 0;\n\t}\n\n\tif (file->append) {\n\t\tposition = file->appendPosition;\n\t\tflagAppending = true;\n\t} else {\n\t\t// If the write pointer is past the end of the file, extend the file to that size\n\t\tif (file->currentPosition > file->filesize) {\n\t\t\tif (!_FAT_file_extend_r (r, file)) {\n\t\t\t\t_FAT_unlock(&partition->lock);\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\n\t\t// Write at current read pointer\n\t\tposition = file->rwPosition;\n\n\t\t// If it is writing past the current end of file, set appending flag\n\t\tif (len + file->currentPosition > file->filesize) {\n\t\t\tflagAppending = true;\n\t\t}\n\t}\n\n\t// Move onto next cluster if needed\n\t_FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError);\n\n\t// Align to sector\n\ttempVar = BYTES_PER_READ - position.byte;\n\tif (tempVar > remain) {\n\t\ttempVar = remain;\n\t}\n\n\tif ((tempVar < BYTES_PER_READ) && flagNoError) {\n\t\t// Write partial sector to disk\n\t\t_FAT_cache_writePartialSector (cache, ptr,\n\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, position.byte, tempVar);\n\n\t\tremain -= tempVar;\n\t\tptr += tempVar;\n\t\tposition.byte += tempVar;\n\n\n\t\t// Move onto next sector\n\t\tif (position.byte >= BYTES_PER_READ) {\n\t\t\tposition.byte = 0;\n\t\t\tposition.sector ++;\n\t\t}\n\t}\n\n\t// Align to cluster\n\t// tempVar is number of sectors to write\n\tif (remain > (partition->sectorsPerCluster - position.sector) * BYTES_PER_READ) {\n\t\ttempVar = partition->sectorsPerCluster - position.sector;\n\t} else {\n\t\ttempVar = remain / BYTES_PER_READ;\n\t}\n\n\tif ((tempVar > 0 && tempVar < partition->sectorsPerCluster) && flagNoError) {\n\t\tif (!_FAT_cache_writeSectors (cache,\n\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, tempVar, ptr))\n\t\t{\n\t\t\tflagNoError = false;\n\t\t\tr->_errno = EIO;\n\t\t} else {\n\t\t\tptr += tempVar * BYTES_PER_READ;\n\t\t\tremain -= tempVar * BYTES_PER_READ;\n\t\t\tposition.sector += tempVar;\n\t\t}\n\t}\n\n\t// Write whole clusters\n\twhile ((remain >= partition->bytesPerCluster) && flagNoError) {\n\t\t// allocate next cluster\n\t\t_FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError);\n\t\tif (!flagNoError) break;\n\t\t// set indexes to the current position\n\t\tuint32_t chunkEnd = position.cluster;\n\t\tuint32_t nextChunkStart = position.cluster;\n\t\tsize_t chunkSize = partition->bytesPerCluster;\n\t\tFILE_POSITION next_position = position;\n\n\t\t// group consecutive clusters\n\t\twhile (flagNoError &&\n#ifdef LIMIT_SECTORS\n\t\t\t\t(chunkSize + partition->bytesPerCluster <= LIMIT_SECTORS * BYTES_PER_READ) &&\n#endif\n\t\t\t\t(chunkSize + partition->bytesPerCluster < remain))\n\t\t{\n\t\t\t// pretend to use up all sectors in next_position \n\t\t\tnext_position.sector = partition->sectorsPerCluster;\n\t\t\t// get or allocate next cluster\n\t\t\t_FAT_check_position_for_next_cluster(r, &next_position, partition,\n\t\t\t\t\tremain - chunkSize, &flagNoError);\n\t\t\tif (!flagNoError) break; // exit loop on error\n\t\t\tnextChunkStart = next_position.cluster;\n\t\t\tif (nextChunkStart != chunkEnd + 1) break; // exit loop if not consecutive\n\t\t\tchunkEnd = nextChunkStart;\n\t\t\tchunkSize += partition->bytesPerCluster;\n\t\t}\n\n\t\tif ( !_FAT_cache_writeSectors (cache,\n\t\t\t\t_FAT_fat_clusterToSector(partition, position.cluster), chunkSize / BYTES_PER_READ, ptr))\n\t\t{\n\t\t\tflagNoError = false;\n\t\t\tr->_errno = EIO;\n\t\t\tbreak;\n\t\t}\n\t\tptr += chunkSize;\n\t\tremain -= chunkSize;\n\n\t\tif ((chunkEnd != nextChunkStart) && _FAT_fat_isValidCluster(partition, nextChunkStart)) {\n\t\t\t// new cluster is already allocated (because it was not consecutive)\n\t\t\tposition.cluster = nextChunkStart;\n\t\t\tposition.sector = 0;\n\t\t} else {\n\t\t\t// Allocate a new cluster when next writing the file\n\t\t\tposition.cluster = chunkEnd;\n\t\t\tposition.sector = partition->sectorsPerCluster;\n\t\t}\n\t}\n\n\t// allocate next cluster if needed\n\t_FAT_check_position_for_next_cluster(r, &position, partition, remain, &flagNoError);\n\n\t// Write remaining sectors\n\ttempVar = remain / BYTES_PER_READ; // Number of sectors left\n\tif ((tempVar > 0) && flagNoError) {\n\t\tif (!_FAT_cache_writeSectors (cache, _FAT_fat_clusterToSector (partition, position.cluster), tempVar, ptr))\n\t\t{\n\t\t\tflagNoError = false;\n\t\t\tr->_errno = EIO;\n\t\t} else {\n\t\t\tptr += tempVar * BYTES_PER_READ;\n\t\t\tremain -= tempVar * BYTES_PER_READ;\n\t\t\tposition.sector += tempVar;\n\t\t}\n\t}\n\n\t// Last remaining sector\n\tif ((remain > 0) && flagNoError) {\n\t\tif (flagAppending) {\n\t\t\t_FAT_cache_eraseWritePartialSector ( cache, ptr,\n\t\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain);\n\t\t} else {\n\t\t\t_FAT_cache_writePartialSector ( cache, ptr,\n\t\t\t\t_FAT_fat_clusterToSector (partition, position.cluster) + position.sector, 0, remain);\n\t\t}\n\t\tposition.byte += remain;\n\t\tremain = 0;\n\t}\n\n\n\t// Amount written is the originally requested amount minus stuff remaining\n\tlen = len - remain;\n\n\t// Update file information\n\tfile->modified = true;\n\tif (file->append) {\n\t\t// Appending doesn't affect the read pointer\n\t\tfile->appendPosition = position;\n\t\tfile->filesize += len;\n\t} else {\n\t\t// Writing also shifts the read pointer\n\t\tfile->rwPosition = position;\n\t\tfile->currentPosition += len;\n\t\tif (file->filesize < file->currentPosition) {\n\t\t\tfile->filesize = file->currentPosition;\n\t\t}\n\t}\n\t_FAT_unlock(&partition->lock);\n\n\treturn len;\n}\n\n\noff_t _FAT_seek_r (struct _reent *r, intptr_t fd, off_t pos, int dir) {\n\tFILE_STRUCT* file = (FILE_STRUCT*)  fd;\n\tPARTITION* partition;\n\tuint32_t cluster, nextCluster;\n\tint clusCount;\n\toff_t newPosition;\n\tuint32_t position;\n\n\tif ((file == NULL) || (file->inUse == false))\t {\n\t\t// invalid file\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\tpartition = file->partition;\n\t_FAT_lock(&partition->lock);\n\n\tswitch (dir) {\n\t\tcase SEEK_SET:\n\t\t\tnewPosition = pos;\n\t\t\tbreak;\n\t\tcase SEEK_CUR:\n\t\t\tnewPosition = (off_t)file->currentPosition + pos;\n\t\t\tbreak;\n\t\tcase SEEK_END:\n\t\t\tnewPosition = (off_t)file->filesize + pos;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t_FAT_unlock(&partition->lock);\n\t\t\tr->_errno = EINVAL;\n\t\t\treturn -1;\n\t}\n\n\tif ((pos > 0) && (newPosition < 0)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EOVERFLOW;\n\t\treturn -1;\n\t}\n\n\t// newPosition can only be larger than the FILE_MAX_SIZE on platforms where\n\t// off_t is larger than 32 bits.\n\tif (newPosition < 0 || ((sizeof(newPosition) > 4) && newPosition > (off_t)FILE_MAX_SIZE)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\n\tposition = (uint32_t)newPosition;\n\n\t// Only change the read/write position if it is within the bounds of the current filesize,\n\t// or at the very edge of the file\n\tif (position <= file->filesize && file->startCluster != CLUSTER_FREE) {\n\t\t// Calculate where the correct cluster is\n\t\t// how many clusters from start of file\n\t\tclusCount = position / partition->bytesPerCluster;\n\t\tcluster = file->startCluster;\n\t\tif (position >= file->currentPosition) {\n\t\t\t// start from current cluster\n\t\t\tint currentCount = file->currentPosition / partition->bytesPerCluster;\n\t\t\tif (file->rwPosition.sector == partition->sectorsPerCluster) {\n\t\t\t\tcurrentCount--;\n\t\t\t}\n\t\t\tclusCount -= currentCount;\n\t\t\tcluster = file->rwPosition.cluster;\n\t\t}\n\t\t// Calculate the sector and byte of the current position,\n\t\t// and store them\n\t\tfile->rwPosition.sector = (position % partition->bytesPerCluster) / BYTES_PER_READ;\n\t\tfile->rwPosition.byte = position % BYTES_PER_READ;\n\n\t\tnextCluster = _FAT_fat_nextCluster (partition, cluster);\n\t\twhile ((clusCount > 0) && (nextCluster != CLUSTER_FREE) && (nextCluster != CLUSTER_EOF)) {\n\t\t\tclusCount--;\n\t\t\tcluster = nextCluster;\n\t\t\tnextCluster = _FAT_fat_nextCluster (partition, cluster);\n\t\t}\n\n\t\t// Check if ran out of clusters and it needs to allocate a new one\n\t\tif (clusCount > 0) {\n\t\t\tif ((clusCount == 1) && (file->filesize == position) && (file->rwPosition.sector == 0)) {\n\t\t\t\t// Set flag to allocate a new cluster\n\t\t\t\tfile->rwPosition.sector = partition->sectorsPerCluster;\n\t\t\t\tfile->rwPosition.byte = 0;\n\t\t\t} else {\n\t\t\t\t_FAT_unlock(&partition->lock);\n\t\t\t\tr->_errno = EINVAL;\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\n\t\tfile->rwPosition.cluster = cluster;\n\t}\n\n\t// Save position\n\tfile->currentPosition = position;\n\n\t_FAT_unlock(&partition->lock);\n\treturn position;\n}\n\n\n\nint _FAT_fstat_r (struct _reent *r, intptr_t fd, struct stat *st) {\n\tFILE_STRUCT* file = (FILE_STRUCT*)  fd;\n\tPARTITION* partition;\n\tDIR_ENTRY fileEntry;\n\n\tif ((file == NULL) || (file->inUse == false))\t {\n\t\t// invalid file\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\tpartition = file->partition;\n\t_FAT_lock(&partition->lock);\n\n\t// Get the file's entry data\n\tfileEntry.dataStart = file->dirEntryStart;\n\tfileEntry.dataEnd = file->dirEntryEnd;\n\n\tif (!_FAT_directory_entryFromPosition (partition, &fileEntry)) {\n\t\t_FAT_unlock(&partition->lock);\n\t\tr->_errno = EIO;\n\t\treturn -1;\n\t}\n\n\t// Fill in the stat struct\n\t_FAT_directory_entryStat (partition, &fileEntry, st);\n\n\t// Fix stats that have changed since the file was openned\n  \tst->st_ino = (ino_t)(file->startCluster);\t\t// The file serial number is the start cluster\n\tst->st_size = file->filesize;\t\t\t\t\t// File size\n\n\t_FAT_unlock(&partition->lock);\n\treturn 0;\n}\n\nint _FAT_ftruncate_r (struct _reent *r, intptr_t fd, off_t len) {\n\tFILE_STRUCT* file = (FILE_STRUCT*)  fd;\n\tPARTITION* partition;\n\tint ret=0;\n\tuint32_t newSize = (uint32_t)len;\n\n\tif (len < 0) {\n\t\t// Trying to truncate to a negative size\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\n\tif ((sizeof(len) > 4) && len > (off_t)FILE_MAX_SIZE) {\n\t\t// Trying to extend the file beyond what FAT supports\n\t\tr->_errno = EFBIG;\n\t\treturn -1;\n\t}\n\n\tif (!file || !file->inUse) {\n\t\t// invalid file\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\tif (!file->write) {\n\t\t// Read-only file\n\t\tr->_errno = EINVAL;\n\t\treturn -1;\n\t}\n\n\tpartition = file->partition;\n\t_FAT_lock(&partition->lock);\n\n\tif (newSize > file->filesize) {\n\t\t// Expanding the file\n\t\tFILE_POSITION savedPosition;\n\t\tuint32_t savedOffset;\n\t\t// Get a new cluster for the start of the file if required\n\t\tif (file->startCluster == CLUSTER_FREE) {\n\t\t\tuint32_t tempNextCluster = _FAT_fat_linkFreeCluster (partition, CLUSTER_FREE);\n\t\t\tif (!_FAT_fat_isValidCluster(partition, tempNextCluster)) {\n\t\t\t\t// Couldn't get a cluster, so abort immediately\n\t\t\t\t_FAT_unlock(&partition->lock);\n\t\t\t\tr->_errno = ENOSPC;\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tfile->startCluster = tempNextCluster;\n\n\t\t\tfile->rwPosition.cluster = file->startCluster;\n\t\t\tfile->rwPosition.sector =  0;\n\t\t\tfile->rwPosition.byte = 0;\n\t\t}\n\t\t// Save the read/write pointer\n\t\tsavedPosition = file->rwPosition;\n\t\tsavedOffset = file->currentPosition;\n\t\t// Set the position to the new size\n\t\tfile->currentPosition = newSize;\n\t\t// Extend the file to the new position\n\t\tif (!_FAT_file_extend_r (r, file)) {\n\t\t\tret = -1;\n\t\t}\n\t\t// Set the append position to the new rwPointer\n\t\tif (file->append) {\n\t\t\tfile->appendPosition = file->rwPosition;\n\t\t}\n\t\t// Restore the old rwPointer;\n\t\tfile->rwPosition = savedPosition;\n\t\tfile->currentPosition = savedOffset;\n\t} else if (newSize < file->filesize){\n\t\t// Shrinking the file\n\t\tif (len == 0) {\n\t\t\t// Cutting the file down to nothing, clear all clusters used\n\t\t\t_FAT_fat_clearLinks (partition, file->startCluster);\n\t\t\tfile->startCluster = CLUSTER_FREE;\n\n\t\t\tfile->appendPosition.cluster = CLUSTER_FREE;\n\t\t\tfile->appendPosition.sector = 0;\n\t\t\tfile->appendPosition.byte = 0;\n\t\t} else {\n\t\t\t// Trimming the file down to the required size\n\t\t\tunsigned int chainLength;\n\t\t\tuint32_t lastCluster;\n\n\t\t\t// Drop the unneeded end of the cluster chain.\n\t\t\t// If the end falls on a cluster boundary, drop that cluster too,\n\t\t\t// then set a flag to allocate a cluster as needed\n\t\t\tchainLength = ((newSize-1) / partition->bytesPerCluster) + 1;\n\t\t\tlastCluster = _FAT_fat_trimChain (partition, file->startCluster, chainLength);\n\n\t\t\tif (file->append) {\n\t\t\t\tfile->appendPosition.byte = newSize % BYTES_PER_READ;\n\t\t\t\t// Does the end of the file fall on the edge of a cluster?\n\t\t\t\tif (newSize % partition->bytesPerCluster == 0) {\n\t\t\t\t\t// Set a flag to allocate a new cluster\n\t\t\t\t\tfile->appendPosition.sector = partition->sectorsPerCluster;\n\t\t\t\t} else {\n\t\t\t\t\tfile->appendPosition.sector = (newSize % partition->bytesPerCluster) / BYTES_PER_READ;\n\t\t\t\t}\n\t\t\t\tfile->appendPosition.cluster = lastCluster;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Truncating to same length, so don't do anything\n\t}\n\n\tfile->filesize = newSize;\n\tfile->modified = true;\n\n\t_FAT_unlock(&partition->lock);\n\treturn ret;\n}\n\nint _FAT_fsync_r (struct _reent *r, intptr_t fd) {\n\tFILE_STRUCT* file = (FILE_STRUCT*)  fd;\n\tint ret = 0;\n\n\tif (!file->inUse) {\n\t\tr->_errno = EBADF;\n\t\treturn -1;\n\t}\n\n\t_FAT_lock(&file->partition->lock);\n\n\tret = _FAT_syncToDisc (file);\n\tif (ret != 0) {\n\t\tr->_errno = ret;\n\t\tret = -1;\n\t}\n\n\t_FAT_unlock(&file->partition->lock);\n\n\treturn ret;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/fatfile.h",
    "content": "/*\n fatfile.h\n \n Functions used by the newlib disc stubs to interface with \n this library\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n\n#ifndef _FATFILE_H\n#define _FATFILE_H\n\n#include \"common.h\"\n#include \"partition.h\"\n#include \"directory.h\"\n\n#ifndef LIBFAT_PC\n#include <sys/reent.h>\n#include <sys/stat.h>\n#endif\n\n\n#define FILE_MAX_SIZE ((uint32_t)0xFFFFFFFF)\t// 4GiB - 1B\n\ntypedef struct {\n\tu32   cluster;\n\tsec_t sector;\n\ts32   byte;\n} FILE_POSITION;\n\nstruct _FILE_STRUCT;\n\nstruct _FILE_STRUCT {\n\tuint32_t             filesize;\n\tuint32_t             startCluster;\n\tuint32_t             currentPosition;\n\tFILE_POSITION        rwPosition;\n\tFILE_POSITION        appendPosition;\n\tDIR_ENTRY_POSITION   dirEntryStart;\t\t// Points to the start of the LFN entries of a file, or the alias for no LFN\n\tDIR_ENTRY_POSITION   dirEntryEnd;\t\t// Always points to the file's alias entry\n\tPARTITION*           partition;\n\tstruct _FILE_STRUCT* prevOpenFile;\t\t// The previous entry in a double-linked list of open files\n\tstruct _FILE_STRUCT* nextOpenFile;\t\t// The next entry in a double-linked list of open files\n\tbool                 read;\n\tbool                 write;\n\tbool                 append;\n\tbool                 inUse;\n\tbool                 modified;\n};\n\ntypedef struct _FILE_STRUCT FILE_STRUCT;\n\nintptr_t _FAT_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode);\n\nintptr_t _FAT_close_r (struct _reent *r, intptr_t fd);\n\nssize_t _FAT_write_r (struct _reent *r,intptr_t fd, const char *ptr, size_t len);\n\nssize_t _FAT_read_r (struct _reent *r, intptr_t fd, char *ptr, size_t len);\n\noff_t _FAT_seek_r (struct _reent *r, intptr_t fd, off_t pos, int dir);\n\nint _FAT_fstat_r (struct _reent *r, intptr_t fd, struct stat *st);\n\nint _FAT_stat_r (struct _reent *r, const char *path, struct stat *st);\n\nint _FAT_link_r (struct _reent *r, const char *existing, const char *newLink);\n\nint _FAT_unlink_r (struct _reent *r, const char *name);\n\nint _FAT_chdir_r (struct _reent *r, const char *name);\n\nint _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName);\n\nint _FAT_ftruncate_r (struct _reent *r, intptr_t fd, off_t len);\n\nint _FAT_fsync_r (struct _reent *r, intptr_t fd);\n\n/*\nSynchronizes the file data to disc.\nDoes no locking of its own -- lock the partition before calling.\nReturns 0 on success, an error code on failure.\n*/\nextern int _FAT_syncToDisc (FILE_STRUCT* file);\n\n#endif // _FATFILE_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/file_allocation_table.cpp",
    "content": "/*\n file_allocation_table.c\n Reading, writing and manipulation of the FAT structure on\n a FAT partition\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n\n#include \"file_allocation_table.h\"\n#include \"partition.h\"\n#include <string.h>\n\n/*\nGets the cluster linked from input cluster\n*/\nuint32_t _FAT_fat_nextCluster(PARTITION* partition, uint32_t cluster)\n{\n\tuint32_t nextCluster = CLUSTER_FREE;\n\tsec_t sector;\n\tint offset;\n\n\tif (cluster == CLUSTER_FREE) {\n\t\treturn CLUSTER_FREE;\n\t}\n\n\tswitch (partition->filesysType)\n\t{\n\t\tcase FS_UNKNOWN:\n\t\t\treturn CLUSTER_ERROR;\n\t\t\tbreak;\n\n\t\tcase FS_FAT12:\n\t\t{\n\t\t\tu32 nextCluster_h;\n\t\t\tsector = partition->fat.fatStart + (((cluster * 3) / 2) / BYTES_PER_READ);\n\t\t\toffset = ((cluster * 3) / 2) % BYTES_PER_READ;\n\n\n\t\t\t_FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u8));\n\n\t\t\toffset++;\n\n\t\t\tif (offset >= BYTES_PER_READ) {\n\t\t\t\toffset = 0;\n\t\t\t\tsector++;\n\t\t\t}\n\t\t\tnextCluster_h = 0;\n\n\t\t\t_FAT_cache_readLittleEndianValue (partition->cache, &nextCluster_h, sector, offset, sizeof(u8));\n\t\t\tnextCluster |= (nextCluster_h << 8);\n\n\t\t\tif (cluster & 0x01) {\n\t\t\t\tnextCluster = nextCluster >> 4;\n\t\t\t} else \t{\n\t\t\t\tnextCluster &= 0x0FFF;\n\t\t\t}\n\n\t\t\tif (nextCluster >= 0x0FF7)\n\t\t\t{\n\t\t\t\tnextCluster = CLUSTER_EOF;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase FS_FAT16:\n\t\t\tsector = partition->fat.fatStart + ((cluster << 1) / BYTES_PER_READ);\n\t\t\toffset = (cluster % (BYTES_PER_READ >> 1)) << 1;\n\n\t\t\t_FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u16));\n\n\t\t\tif (nextCluster >= 0xFFF7) {\n\t\t\t\tnextCluster = CLUSTER_EOF;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase FS_FAT32:\n\t\t\tsector = partition->fat.fatStart + ((cluster << 2) / BYTES_PER_READ);\n\t\t\toffset = (cluster % (BYTES_PER_READ >> 2)) << 2;\n\n\t\t\t_FAT_cache_readLittleEndianValue (partition->cache, &nextCluster, sector, offset, sizeof(u32));\n\n\t\t\tif (nextCluster >= 0x0FFFFFF7) {\n\t\t\t\tnextCluster = CLUSTER_EOF;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\treturn CLUSTER_ERROR;\n\t\t\tbreak;\n\t}\n\n\treturn nextCluster;\n}\n\n/*\nwrites value into the correct offset within a partition's FAT, based\non the cluster number.\n*/\nstatic bool _FAT_fat_writeFatEntry (PARTITION* partition, uint32_t cluster, uint32_t value) {\n\tsec_t sector;\n\tint offset;\n\tuint32_t oldValue;\n\n\tif ((cluster < CLUSTER_FIRST) || (cluster > partition->fat.lastCluster /* This will catch CLUSTER_ERROR */))\n\t{\n\t\treturn false;\n\t}\n\n\tswitch (partition->filesysType)\n\t{\n\t\tcase FS_UNKNOWN:\n\t\t\treturn false;\n\t\t\tbreak;\n\n\t\tcase FS_FAT12:\n\t\t\tsector = partition->fat.fatStart + (((cluster * 3) / 2) / BYTES_PER_READ);\n\t\t\toffset = ((cluster * 3) / 2) % BYTES_PER_READ;\n\n\t\t\tif (cluster & 0x01) {\n\n\t\t\t\t_FAT_cache_readLittleEndianValue (partition->cache, &oldValue, sector, offset, sizeof(u8));\n\n\t\t\t\tvalue = (value << 4) | (oldValue & 0x0F);\n\n\t\t\t\t_FAT_cache_writeLittleEndianValue (partition->cache, value & 0xFF, sector, offset, sizeof(u8));\n\n\t\t\t\toffset++;\n\t\t\t\tif (offset >= BYTES_PER_READ) {\n\t\t\t\t\toffset = 0;\n\t\t\t\t\tsector++;\n\t\t\t\t}\n\n\t\t\t\t_FAT_cache_writeLittleEndianValue (partition->cache, (value >> 8) & 0xFF, sector, offset, sizeof(u8));\n\n\t\t\t} else {\n\n\t\t\t\t_FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u8));\n\n\t\t\t\toffset++;\n\t\t\t\tif (offset >= BYTES_PER_READ) {\n\t\t\t\t\toffset = 0;\n\t\t\t\t\tsector++;\n\t\t\t\t}\n\n\t\t\t\t_FAT_cache_readLittleEndianValue (partition->cache, &oldValue, sector, offset, sizeof(u8));\n\n\t\t\t\tvalue = ((value >> 8) & 0x0F) | (oldValue & 0xF0);\n\n\t\t\t\t_FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u8));\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase FS_FAT16:\n\t\t\tsector = partition->fat.fatStart + ((cluster << 1) / BYTES_PER_READ);\n\t\t\toffset = (cluster % (BYTES_PER_READ >> 1)) << 1;\n\n\t\t\t_FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u16));\n\n\t\t\tbreak;\n\n\t\tcase FS_FAT32:\n\t\t\tsector = partition->fat.fatStart + ((cluster << 2) / BYTES_PER_READ);\n\t\t\toffset = (cluster % (BYTES_PER_READ >> 2)) << 2;\n\n\t\t\t_FAT_cache_writeLittleEndianValue (partition->cache, value, sector, offset, sizeof(u32));\n\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\treturn false;\n\t\t\tbreak;\n\t}\n\n\treturn true;\n}\n\n/*-----------------------------------------------------------------\ngets the first available free cluster, sets it\nto end of file, links the input cluster to it then returns the\ncluster number\nIf an error occurs, return CLUSTER_ERROR\n-----------------------------------------------------------------*/\nuint32_t _FAT_fat_linkFreeCluster(PARTITION* partition, uint32_t cluster) {\n\tuint32_t firstFree;\n\tuint32_t curLink;\n\tuint32_t lastCluster;\n\tbool loopedAroundFAT = false;\n\n\tlastCluster =  partition->fat.lastCluster;\n\n\tif (cluster > lastCluster) {\n\t\treturn CLUSTER_ERROR;\n\t}\n\n\t// Check if the cluster already has a link, and return it if so\n\tcurLink = _FAT_fat_nextCluster(partition, cluster);\n\tif ((curLink >= CLUSTER_FIRST) && (curLink <= lastCluster)) {\n\t\treturn curLink;\t// Return the current link - don't allocate a new one\n\t}\n\n\t// Get a free cluster\n\tfirstFree = partition->fat.firstFree;\n\t// Start at first valid cluster\n\tif (firstFree < CLUSTER_FIRST) {\n\t\tfirstFree = CLUSTER_FIRST;\n\t}\n\n\t// Search until a free cluster is found\n\twhile (_FAT_fat_nextCluster(partition, firstFree) != CLUSTER_FREE) {\n\t\tfirstFree++;\n\t\tif (firstFree > lastCluster) {\n\t\t\tif (loopedAroundFAT) {\n\t\t\t\t// If couldn't get a free cluster then return an error\n\t\t\t\tpartition->fat.firstFree = firstFree;\n\t\t\t\treturn CLUSTER_ERROR;\n\t\t\t} else {\n\t\t\t\t// Try looping back to the beginning of the FAT\n\t\t\t\t// This was suggested by loopy\n\t\t\t\tfirstFree = CLUSTER_FIRST;\n\t\t\t\tloopedAroundFAT = true;\n\t\t\t}\n\t\t}\n\t}\n\tpartition->fat.firstFree = firstFree;\n\n\tif ((cluster >= CLUSTER_FIRST) && (cluster < lastCluster))\n\t{\n\t\t// Update the linked from FAT entry\n\t\t_FAT_fat_writeFatEntry (partition, cluster, firstFree);\n\t}\n\t// Create the linked to FAT entry\n\t_FAT_fat_writeFatEntry (partition, firstFree, CLUSTER_EOF);\n\n\treturn firstFree;\n}\n\n/*-----------------------------------------------------------------\ngets the first available free cluster, sets it\nto end of file, links the input cluster to it, clears the new\ncluster to 0 valued bytes, then returns the cluster number\nIf an error occurs, return CLUSTER_ERROR\n-----------------------------------------------------------------*/\nuint32_t _FAT_fat_linkFreeClusterCleared (PARTITION* partition, uint32_t cluster) {\n\tuint32_t newCluster;\n\tuint32_t i;\n\tuint8_t emptySector[BYTES_PER_READ];\n\n\t// Link the cluster\n\tnewCluster = _FAT_fat_linkFreeCluster(partition, cluster);\n\n\tif (newCluster == CLUSTER_FREE || newCluster == CLUSTER_ERROR) {\n\t\treturn CLUSTER_ERROR;\n\t}\n\n\t// Clear all the sectors within the cluster\n\tmemset (emptySector, 0, BYTES_PER_READ);\n\tfor (i = 0; i < partition->sectorsPerCluster; i++) {\n\t\t_FAT_cache_writeSectors (partition->cache,\n\t\t\t_FAT_fat_clusterToSector (partition, newCluster) + i,\n\t\t\t1, emptySector);\n\t}\n\n\treturn newCluster;\n}\n\n\n/*-----------------------------------------------------------------\n_FAT_fat_clearLinks\nfrees any cluster used by a file\n-----------------------------------------------------------------*/\nbool _FAT_fat_clearLinks (PARTITION* partition, uint32_t cluster) {\n\tuint32_t nextCluster;\n\n\tif ((cluster < CLUSTER_FIRST) || (cluster > partition->fat.lastCluster /* This will catch CLUSTER_ERROR */))\n\t\treturn false;\n\n\t// If this clears up more space in the FAT before the current free pointer, move it backwards\n\tif (cluster < partition->fat.firstFree) {\n\t\tpartition->fat.firstFree = cluster;\n\t}\n\n\twhile ((cluster != CLUSTER_EOF) && (cluster != CLUSTER_FREE) && (cluster != CLUSTER_ERROR)) {\n\t\t// Store next cluster before erasing the link\n\t\tnextCluster = _FAT_fat_nextCluster (partition, cluster);\n\n\t\t// Erase the link\n\t\t_FAT_fat_writeFatEntry (partition, cluster, CLUSTER_FREE);\n\n\t\t// Move onto next cluster\n\t\tcluster = nextCluster;\n\t}\n\n\treturn true;\n}\n\n/*-----------------------------------------------------------------\n_FAT_fat_trimChain\nDrop all clusters past the chainLength.\nIf chainLength is 0, all clusters are dropped.\nIf chainLength is 1, the first cluster is kept and the rest are\ndropped, and so on.\nReturn the last cluster left in the chain.\n-----------------------------------------------------------------*/\nuint32_t _FAT_fat_trimChain (PARTITION* partition, uint32_t startCluster, unsigned int chainLength) {\n\tuint32_t nextCluster;\n\n\tif (chainLength == 0) {\n\t\t// Drop the entire chain\n\t\t_FAT_fat_clearLinks (partition, startCluster);\n\t\treturn CLUSTER_FREE;\n\t} else {\n\t\t// Find the last cluster in the chain, and the one after it\n\t\tchainLength--;\n\t\tnextCluster = _FAT_fat_nextCluster (partition, startCluster);\n\t\twhile ((chainLength > 0) && (nextCluster != CLUSTER_FREE) && (nextCluster != CLUSTER_EOF)) {\n\t\t\tchainLength--;\n\t\t\tstartCluster = nextCluster;\n\t\t\tnextCluster = _FAT_fat_nextCluster (partition, startCluster);\n\t\t}\n\n\t\t// Drop all clusters after the last in the chain\n\t\tif (nextCluster != CLUSTER_FREE && nextCluster != CLUSTER_EOF) {\n\t\t\t_FAT_fat_clearLinks (partition, nextCluster);\n\t\t}\n\n\t\t// Mark the last cluster in the chain as the end of the file\n\t\t_FAT_fat_writeFatEntry (partition, startCluster, CLUSTER_EOF);\n\n\t\treturn startCluster;\n\t}\n}\n\n/*-----------------------------------------------------------------\n_FAT_fat_lastCluster\nTrace the cluster links until the last one is found\n-----------------------------------------------------------------*/\nuint32_t _FAT_fat_lastCluster (PARTITION* partition, uint32_t cluster) {\n\twhile ((_FAT_fat_nextCluster(partition, cluster) != CLUSTER_FREE) && (_FAT_fat_nextCluster(partition, cluster) != CLUSTER_EOF)) {\n\t\tcluster = _FAT_fat_nextCluster(partition, cluster);\n\t}\n\treturn cluster;\n}\n\n/*-----------------------------------------------------------------\n_FAT_fat_freeClusterCount\nReturn the number of free clusters available\n-----------------------------------------------------------------*/\nunsigned int _FAT_fat_freeClusterCount (PARTITION* partition) {\n\tunsigned int count = 0;\n\tuint32_t curCluster;\n\n\tfor (curCluster = CLUSTER_FIRST; curCluster <= partition->fat.lastCluster; curCluster++) {\n\t\tif (_FAT_fat_nextCluster(partition, curCluster) == CLUSTER_FREE) {\n\t\t\tcount++;\n\t\t}\n\t}\n\n\treturn count;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/file_allocation_table.h",
    "content": "/*\n file_allocation_table.h\n Reading, writing and manipulation of the FAT structure on\n a FAT partition\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _FAT_H\n#define _FAT_H\n\n#include \"common.h\"\n#include \"partition.h\"\n\n#define CLUSTER_EOF_16\t0xFFFF\n#define\tCLUSTER_EOF\t\t0x0FFFFFFF\n#define CLUSTER_FREE\t0x00000000\n#define CLUSTER_ROOT\t0x00000000\r\n#define CLUSTER_FIRST\t0x00000002\n#define CLUSTER_ERROR\t0xFFFFFFFF\n\n#define CLUSTERS_PER_FAT12 4085\n#define CLUSTERS_PER_FAT16 65525\n\n\nuint32_t _FAT_fat_nextCluster(PARTITION* partition, uint32_t cluster);\n\nuint32_t _FAT_fat_linkFreeCluster(PARTITION* partition, uint32_t cluster);\nuint32_t _FAT_fat_linkFreeClusterCleared (PARTITION* partition, uint32_t cluster);\n\nbool _FAT_fat_clearLinks (PARTITION* partition, uint32_t cluster);\n\nuint32_t _FAT_fat_trimChain (PARTITION* partition, uint32_t startCluster, unsigned int chainLength);\n\nuint32_t _FAT_fat_lastCluster (PARTITION* partition, uint32_t cluster);\n\nunsigned int _FAT_fat_freeClusterCount (PARTITION* partition);\n\nstatic inline sec_t _FAT_fat_clusterToSector (PARTITION* partition, uint32_t cluster) {\n\treturn (cluster >= CLUSTER_FIRST) ? \n\t\t((cluster - CLUSTER_FIRST) * (sec_t)partition->sectorsPerCluster) + partition->dataStart : \n\t\tpartition->rootDirStart;\n}\n\nstatic inline bool _FAT_fat_isValidCluster (PARTITION* partition, uint32_t cluster) {\n\treturn (cluster >= CLUSTER_FIRST) && (cluster <= partition->fat.lastCluster /* This will catch CLUSTER_ERROR */);\n}\n\n#endif // _FAT_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/filetime.cpp",
    "content": "/*\n filetime.c\n Conversion of file time and date values to various other types\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n\n#include <time.h>\n#include \"filetime.h\"\n#include \"common.h\"\n\n#define MAX_HOUR 23\n#define MAX_MINUTE 59\n#define MAX_SECOND 59\n\n#define MAX_MONTH 11\n#define MIN_MONTH 0\n#define MAX_DAY 31\n#define MIN_DAY 1\n\nuint16_t _FAT_filetime_getTimeFromRTC (void) {\n#ifdef USE_RTC_TIME\n\tstruct tm timeParts;\n\ttime_t epochTime;\n\t\n\tif (time(&epochTime) == (time_t)-1) {\n\t\treturn 0;\n\t}\n\tlocaltime_r(&epochTime, &timeParts);\n\n\t// Check that the values are all in range.\n\t// If they are not, return 0 (no timestamp)\n\tif ((timeParts.tm_hour < 0) || (timeParts.tm_hour > MAX_HOUR))\treturn 0;\n\tif ((timeParts.tm_min < 0) || (timeParts.tm_min > MAX_MINUTE)) return 0;\n\tif ((timeParts.tm_sec < 0) || (timeParts.tm_sec > MAX_SECOND)) return 0;\n\t\n\treturn (\n\t\t((timeParts.tm_hour & 0x1F) << 11) |\n\t\t((timeParts.tm_min & 0x3F) << 5) |\n\t\t((timeParts.tm_sec >> 1) & 0x1F) \n\t);\n#else\n\treturn 0;\n#endif\n}\n\n\nuint16_t _FAT_filetime_getDateFromRTC (void) {\n#ifdef USE_RTC_TIME\n\tstruct tm timeParts;\n\ttime_t epochTime;\n\t\n\tif (time(&epochTime) == (time_t)-1) {\n\t\treturn 0;\n\t}\n\tlocaltime_r(&epochTime, &timeParts);\n\n\tif ((timeParts.tm_mon < MIN_MONTH) || (timeParts.tm_mon > MAX_MONTH)) return 0;\n\tif ((timeParts.tm_mday < MIN_DAY) || (timeParts.tm_mday > MAX_DAY)) return 0;\n\t\n\treturn ( \n\t\t(((timeParts.tm_year - 80) & 0x7F) <<9) |\t// Adjust for MS-FAT base year (1980 vs 1900 for tm_year)\n\t\t(((timeParts.tm_mon + 1) & 0xF) << 5) |\n\t\t(timeParts.tm_mday & 0x1F)\n\t);\n#else\n\treturn 0;\n#endif\n}\n\ntime_t _FAT_filetime_to_time_t (uint16_t t, uint16_t d) {\n\tstruct tm timeParts;\n\n\ttimeParts.tm_hour = t >> 11;\n\ttimeParts.tm_min = (t >> 5) & 0x3F;\n\ttimeParts.tm_sec = (t & 0x1F) << 1;\n\t\n\ttimeParts.tm_mday = d & 0x1F;\n\ttimeParts.tm_mon = ((d >> 5) & 0x0F) - 1;\n\ttimeParts.tm_year = (d >> 9) + 80;\n\t\n\ttimeParts.tm_isdst = 0;\n\t\n\treturn mktime(&timeParts);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/filetime.h",
    "content": "/*\n filetime.h\n Conversion of file time and date values to various other types\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _FILETIME_H\n#define _FILETIME_H\n\n#include \"common.h\"\n#include <sys/types.h>\n\nuint16_t _FAT_filetime_getTimeFromRTC (void);\nuint16_t _FAT_filetime_getDateFromRTC (void);\n\ntime_t _FAT_filetime_to_time_t (uint16_t t, uint16_t d);\n\n\n#endif // _FILETIME_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/libfat.cpp",
    "content": "/*\n\tlibfat.c\n\tSimple functionality for startup, mounting and unmounting of FAT-based devices.\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include <string.h>\n#include <stdio.h>\n\n#include \"common.h\"\n#include \"partition.h\"\n#include \"fatfile.h\"\n#include \"fatdir.h\"\n#include \"lock.h\"\n#include \"mem_allocate.h\"\n#include \"disc.h\"\n\n#ifndef LIBFAT_PC\n#include <sys/iosupport.h>\n#include <unistd.h>\n#endif\n\n\nstatic const devoptab_t dotab_fat = {\n\t\"fat\",\n\tsizeof (FILE_STRUCT),\n\t_FAT_open_r,\n\t_FAT_close_r,\n\t_FAT_write_r,\n\t_FAT_read_r,\n\t_FAT_seek_r,\n\t_FAT_fstat_r,\n\t_FAT_stat_r,\n\t_FAT_link_r,\n\t_FAT_unlink_r,\n\t_FAT_chdir_r,\n\t_FAT_rename_r,\n\t_FAT_mkdir_r,\n\tsizeof (DIR_STATE_STRUCT),\n\t_FAT_diropen_r,\n\t_FAT_dirreset_r,\n\t_FAT_dirnext_r,\n\t_FAT_dirclose_r,\n#ifndef LIBFAT_PC\n\t_FAT_statvfs_r,\n#endif\n\t_FAT_ftruncate_r,\n\t_FAT_fsync_r,\n\tNULL,\t/* Device data */\n\tNULL,\n\tNULL\n};\n\n#ifdef LIBFAT_PC\nstatic devoptab_t* _sole_device = NULL;\ndevoptab_t* GetDeviceOpTab(const char* name)\n{\n\treturn _sole_device;\n}\n#endif\n\n\nbool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage) {\n\tPARTITION* partition;\n\tdevoptab_t* devops;\n\t//char* nameCopy;\n\n\tif(!name || strlen(name) > 8 || !interface)\n\t\treturn false;\n\n\tif(!interface->startup())\n\t\treturn false;\n\n\tif(!interface->isInserted())\n\t\treturn false;\n\n\t//char devname[10];\n\t//sprintf(devname, \"%s:\", name);\n\t//if(FindDevice(devname) >= 0)\n\t//\treturn true;\n\n\tdevops = (devoptab_t*)_FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1);\n\tif (!devops) {\n\t\treturn false;\n\t}\n\n#ifdef LIBFAT_PC\n\t_sole_device = devops;\n#endif\n\n\t// Use the space allocated at the end of the devoptab struct for storing the name\n\t//nameCopy = (char*)(devops+1);\n\n\t// Initialize the file system\n\tpartition = _FAT_partition_constructor (interface, cacheSize, SectorsPerPage, startSector);\n\tif (!partition) {\n\t\t_FAT_mem_free (devops);\n\t\treturn false;\n\t}\n\n\t// Add an entry for this device to the devoptab table\n\tmemcpy (devops, &dotab_fat, sizeof(dotab_fat));\n\t//strcpy (nameCopy, name);\n\t//devops->name = nameCopy;\n\tdevops->deviceData = partition;\n\n\t//AddDevice (devops);\n\n\treturn true;\n}\n\nbool fatMountSimple (const char* name, const DISC_INTERFACE* interface) {\n\treturn fatMount (name, interface, 0, DEFAULT_CACHE_PAGES, DEFAULT_SECTORS_PAGE);\n}\n\nvoid fatUnmountDirect (devoptab_t *devops) {\n\tPARTITION* partition = (PARTITION*)devops->deviceData;\n\t_FAT_partition_destructor (partition);\n\t_FAT_mem_free (devops);\n\t_sole_device = NULL;\n}\n\n//void fatUnmount (const char* name) {\n//\tdevoptab_t *devops;\n//\tPARTITION* partition;\n//\n//\tif(!name)\n//\t\treturn;\n//\n//\tdevops = (devoptab_t*)GetDeviceOpTab (name);\n//\tif (!devops) {\n//\t\treturn;\n//\t}\n//\n//\t// Perform a quick check to make sure we're dealing with a libfat controlled device\n//\t//if (devops->open_r != dotab_fat.open_r) {\n//\t//\treturn;\n//\t//}\n//\n//\tif (RemoveDevice (name) == -1) {\n//\t\treturn;\n//\t}\n//\n//\tpartition = (PARTITION*)devops->deviceData;\n//\t_FAT_partition_destructor (partition);\n//\t_FAT_mem_free (devops);\n//}\n\n//bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice) {\n//\tint i;\n//\tint defaultDevice = -1;\n//\tconst DISC_INTERFACE *disc;\n//\n//\tfor (i = 0;\n//\t\t_FAT_disc_interfaces[i].name != NULL && _FAT_disc_interfaces[i].getInterface != NULL;\n//\t\ti++)\n//\t{\n//\t\tdisc = _FAT_disc_interfaces[i].getInterface();\n//\t\tif (fatMount (_FAT_disc_interfaces[i].name, disc, 0, cacheSize, DEFAULT_SECTORS_PAGE)) {\n//\t\t\t// The first device to successfully mount is set as the default\n//\t\t\tif (defaultDevice < 0) {\n//\t\t\t\tdefaultDevice = i;\n//\t\t\t}\n//\t\t}\n//\t}\n//\n//\tif (defaultDevice < 0) {\n//\t\t// None of our devices mounted\n//\t\treturn false;\n//\t}\n//\n//\tif (setAsDefaultDevice) {\n//\t\tchar filePath[MAXPATHLEN * 2];\n//\t\tstrcpy (filePath, _FAT_disc_interfaces[defaultDevice].name);\n//\t\tstrcat (filePath, \":/\");\n//#ifdef ARGV_MAGIC\n//\t\tif ( __system_argv->argvMagic == ARGV_MAGIC && __system_argv->argc >= 1 && strrchr( __system_argv->argv[0], '/' )!=NULL ) {\n//\t\t\t// Check the app's path against each of our mounted devices, to see\n//\t\t\t// if we can support it. If so, change to that path.\n//\t\t\tfor (i = 0;\n//\t\t\t\t_FAT_disc_interfaces[i].name != NULL && _FAT_disc_interfaces[i].getInterface != NULL;\n//\t\t\t\ti++)\n//\t\t\t{\n//\t\t\t\tif ( !strncasecmp( __system_argv->argv[0], _FAT_disc_interfaces[i].name,\n//\t\t\t\t\tstrlen(_FAT_disc_interfaces[i].name)))\n//\t\t\t\t{\n//\t\t\t\t\tchar *lastSlash;\n//\t\t\t\t\tstrcpy(filePath, __system_argv->argv[0]);\n//\t\t\t\t\tlastSlash = strrchr( filePath, '/' );\n//\n//\t\t\t\t\tif ( NULL != lastSlash) {\n//\t\t\t\t\t\tif ( *(lastSlash - 1) == ':') lastSlash++;\n//\t\t\t\t\t\t*lastSlash = 0;\n//\t\t\t\t\t}\n//\t\t\t\t}\n//\t\t\t}\n//\t\t}\n//#endif\n//\t\tchdir (filePath);\n//\t}\n//\n//\treturn true;\n//}\n\n//bool fatInitDefault (void) {\n//\treturn fatInit (DEFAULT_CACHE_PAGES, true);\n//}\n\n//void fatGetVolumeLabel (const char* name, char *label) {\n//\tdevoptab_t *devops;\n//\tPARTITION* partition;\n//\tchar *buf;\n//\tint namelen,i;\n//\n//\tif(!name || !label)\n//\t\treturn;\n//\n//\tnamelen = strlen(name);\n//\tbuf=(char*)_FAT_mem_allocate(sizeof(char)*namelen+2);\t\n//\tstrcpy(buf,name);\n//\n//\tif (name[namelen-1] == '/') {\n//\t\tbuf[namelen-1]='\\0';\n//\t\tnamelen--;\n//\t}\n//\n//\tif (name[namelen-1] != ':') {\n//\t\tbuf[namelen]=':';\n//\t\tbuf[namelen+1]='\\0';\n//\t}\n//\n//\tdevops = (devoptab_t*)GetDeviceOpTab(buf);\n//\n//\tfor(i=0;buf[i]!='\\0' && buf[i]!=':';i++);  \n//\tif (!devops || strncasecmp(buf,devops->name,i)) {\n//\t\t_FAT_mem_free(buf);\n//\t\treturn;\n//\t}\n//\n//\t_FAT_mem_free(buf);\n//\n//\t// Perform a quick check to make sure we're dealing with a libfat controlled device\n//\tif (devops->open_r != dotab_fat.open_r) {\n//\t\treturn;\n//\t}\t\n//\n//\tpartition = (PARTITION*)devops->deviceData;\n//\n//\tif(!_FAT_directory_getVolumeLabel(partition, label)) { \n//\t\tstrncpy(label,partition->label,11);\n//\t\tlabel[11]='\\0';\n//\t}\n//\tif(!strncmp(label, \"NO NAME\", 7)) label[0]='\\0';\n//}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/libfat_pc.h",
    "content": "#ifndef _LIBFAT_PC_H\r\n#define _LIBFAT_PC_H\r\n\r\n#ifdef LIBFAT_PC\r\n\r\n#include \"../../types.h\"\r\n\r\n#ifdef _MSC_VER\r\n\r\n#define ENOTSUP 0\r\n#define EOVERFLOW 0\r\n\r\n#include <time.h>\r\n#include <stdio.h>\r\n\r\n#define strcasecmp(x,y) _stricmp(x,y)\r\n#define strncasecmp(x, y, l) strnicmp(x, y, l)\r\n\r\ntypedef unsigned __int64 uint64_t;\r\ntypedef __int64 int64_t;\r\ntypedef unsigned int uint32_t;\r\ntypedef int int32_t;\r\ntypedef unsigned short uint16_t;\r\ntypedef short int16_t;\r\ntypedef unsigned char uint8_t;\r\ntypedef char int8_t;\r\n\r\ntypedef int32_t ssize_t;\r\n\r\n#include <sys/stat.h>\r\n\r\n#define S_IRUSR S_IREAD\r\n#define S_IRGRP S_IREAD\r\n#define S_IROTH S_IREAD\r\n#define S_IWUSR S_IWRITE\r\n#define S_IWGRP S_IWRITE\r\n#define S_IWOTH S_IWRITE\r\n\r\n//struct stat {\r\n//\tu32 st_dev;\r\n//\tu32 st_ino;\r\n//\tu32 st_mode;\r\n//\tu32 st_nlink;\r\n//\tu32 st_uid;\r\n//\tu32 st_gid;\r\n//\tu32 st_rdev;\r\n//\ts64 st_size;\r\n//\ttime_t st_atime;\r\n//\ttime_t st_mtime;\r\n//\ttime_t st_ctime;\r\n//\ts32 st_blksize;\r\n//\ts32 st_blocks;\r\n//\tu32 st_attr;\r\n//}; \r\n\r\n#else // (!_MSC_VER)\r\n\r\n#include <unistd.h>\r\n\r\n#endif //_MSC_VER\r\n\r\nstruct _reent {\r\n\tintptr_t _errno;\r\n};\r\n\r\n#ifdef __APPLE__\r\ntypedef __darwin_mode_t mode_t;\r\n#elif defined(_MSC_VER)\r\ntypedef uint32_t mode_t;\r\n#else\r\n#include <sys/types.h>\r\n#endif\r\n\r\nstruct DIR_ITER {\r\n\tvoid* dirStruct;\r\n};\r\n\r\nstruct devoptab_t {\r\n\tconst char *name;\r\n\tint\tstructSize;\r\n\tintptr_t (*open_r)(struct _reent *r, void *fileStruct, const char *path, int flags, int mode);\r\n\tintptr_t (*close_r)(struct _reent *r, intptr_t fd);\r\n\tssize_t (*write_r)(struct _reent *r, intptr_t fd, const char *ptr, size_t len);\r\n\tssize_t (*read_r)(struct _reent *r, intptr_t fd, char *ptr, size_t len);\r\n\toff_t (*seek_r)(struct _reent *r, intptr_t fd, off_t pos, int dir);\r\n\tint (*fstat_r)(struct _reent *r, intptr_t fd, struct stat *st);\r\n\tint (*stat_r)(struct _reent *r, const char *file, struct stat *st);\r\n\tint (*link_r)(struct _reent *r, const char *existing, const char  *newLink);\r\n\tint (*unlink_r)(struct _reent *r, const char *name);\r\n\tint (*chdir_r)(struct _reent *r, const char *name);\r\n\tint (*rename_r) (struct _reent *r, const char *oldName, const char *newName);\r\n\tint (*mkdir_r) (struct _reent *r, const char *path, int mode);\r\n\t\t\r\n\tint dirStateSize;\r\n\t\r\n\tDIR_ITER* (*diropen_r)(struct _reent *r, DIR_ITER *dirState, const char *path);\r\n\tint (*dirreset_r)(struct _reent *r, DIR_ITER *dirState);\r\n\tint (*dirnext_r)(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat);\r\n\tint (*dirclose_r)(struct _reent *r, DIR_ITER *dirState);\r\n\t#ifndef LIBFAT_PC\r\n\tint (*statvfs_r)(struct _reent *r, const char *path, struct statvfs *buf);\r\n\t#endif\r\n\tint (*ftruncate_r)(struct _reent *r, intptr_t fd, off_t len);\r\n\tint (*fsync_r)(struct _reent *r, intptr_t fd);\r\n\r\n\tvoid *deviceData;\r\n\r\n\tint (*chmod_r)(struct _reent *r, const char *path, mode_t mode);\r\n\tint (*fchmod_r)(struct _reent *r, int fd, mode_t mode);\r\n\r\n};\r\n\r\n\r\ndevoptab_t* GetDeviceOpTab(const char* name);\r\n\r\n#define _ATTR_WEAK_ \r\n\r\n#endif //LIBFAT_PC\r\n\r\n#endif //_LIBFAT_PC_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/libfat_public_api.cpp",
    "content": "#include <string.h>\r\n#include <fcntl.h>\r\n\r\n\r\n#include \"libfat_public_api.h\"\r\n#include \"common.h\"\r\n#include \"disc_io.h\"\r\n#include \"fatfile.h\"\r\n\r\n\r\nstruct Instance\r\n{\r\n\tvoid* buffer;\r\n\tint size_bytes;\r\n\tdevoptab_t* devops;\r\n};\r\n\r\nInstance sInstance;\r\nInstance* gInstance = NULL;\r\n\r\nbool MEDIUM_STARTUP(void)\n{\n\treturn true;\n}\nbool MEDIUM_ISINSERTED(void)\n{\n\treturn true;\n}\nbool MEDIUM_io(bool write, sec_t sector, sec_t numSectors, void* buffer)\n{\n\tint todo = (int)numSectors*512;\n\tint loc = (int)sector*512;\n\tint have = gInstance->size_bytes - loc;\n\tif(todo>have) \n\t\treturn false;\n\tif(write)\n\t\tmemcpy((u8*)gInstance->buffer + loc,buffer,todo);\n\telse\n\t\tmemcpy(buffer,(u8*)gInstance->buffer + loc,todo);\n\treturn true;\n}\n\nbool MEDIUM_READSECTORS(sec_t sector, sec_t numSectors, void* buffer)\n{\n\treturn MEDIUM_io(false,sector,numSectors,buffer);\n}\nbool MEDIUM_WRITESECTORS(sec_t sector, sec_t numSectors, const void* buffer)\n{\n\treturn MEDIUM_io(true,sector,numSectors,(void*)buffer);\n}\nbool MEDIUM_CLEARSTATUS(void)\n{\n\treturn true;\n}\nbool MEDIUM_SHUTDOWN(void)\r\n{\r\n\treturn true;\r\n}\r\n\r\nDISC_INTERFACE_STRUCT discio = {\n\t0, //unsigned long\t\t\tioType ;\n\tFEATURE_MEDIUM_CANWRITE | FEATURE_MEDIUM_CANREAD, //unsigned long\t\t\tfeatures ;\n\tMEDIUM_STARTUP, //\tFN_MEDIUM_STARTUP\t\tstartup ;\n\tMEDIUM_ISINSERTED, //FN_MEDIUM_ISINSERTED\tisInserted ;\n\tMEDIUM_READSECTORS, //FN_MEDIUM_READSECTORS\treadSectors ;\n\tMEDIUM_WRITESECTORS, //FN_MEDIUM_WRITESECTORS\twriteSectors ;\n\tMEDIUM_CLEARSTATUS, //FN_MEDIUM_CLEARSTATUS\tclearStatus ;\n\tMEDIUM_SHUTDOWN, //FN_MEDIUM_SHUTDOWN\t\tshutdown ;\n} ;\n\r\n\r\n//not declared in any libfat headers...?\r\nbool fatMountSimple (const char* name, const DISC_INTERFACE* interface);\r\nvoid fatUnmountDirect (devoptab_t *devops);\r\n\r\nnamespace LIBFAT\r\n{\r\n\tvoid Init(void* buffer, int size_bytes)\r\n\t{\r\n\t\tgInstance = &sInstance;\r\n\t\tgInstance->buffer = buffer;\r\n\t\tgInstance->size_bytes = size_bytes;\r\n\t\tfatMountSimple(\"fat\",&discio);\r\n\t\tgInstance->devops = GetDeviceOpTab(NULL);\r\n\t\t\r\n\r\n\t\tint zzz=9;\r\n\t}\r\n\r\n\tbool MkDir(const char *path)\r\n\t{\r\n\t\t_reent r;\r\n\t\treturn gInstance->devops->mkdir_r(&r,path,0) == 0;\r\n\t}\r\n\r\n\tbool WriteFile(const char *path, const void* data, int len)\r\n\t{\r\n\t\t_reent r;\r\n\t\tFILE_STRUCT file;\r\n\t\tintptr_t fd = gInstance->devops->open_r(&r,&file,path,O_CREAT | O_RDWR,0);\r\n\t\tif(fd != -1)\r\n\t\t{\r\n\t\t\tssize_t ret = gInstance->devops->write_r(&r, fd, (char*)data, len);\r\n\t\t\tgInstance->devops->close_r(&r, fd);\r\n\t\t\tif(ret == len)\r\n\t\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tvoid Shutdown()\r\n\t{\r\n\t\tfatUnmountDirect(gInstance->devops);\r\n\t\tgInstance = NULL;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/libfat_public_api.h",
    "content": "#ifndef _LIBFAT_PUBLIC_API_H_\r\n#define _LIBFAT_PUBLIC_API_H_\r\n\r\nnamespace LIBFAT\r\n{\r\n\tvoid Init(void* buffer, int size_bytes);\r\n\tvoid Shutdown();\r\n\tbool MkDir(const char *path);\r\n\tbool WriteFile(const char *path, const void* data, int len);\r\n};\r\n\r\n#endif //_LIBFAT_PUBLIC_API_H_\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/lock.cpp",
    "content": "#include \"common.h\"\n\n#ifndef USE_LWP_LOCK\n\n#ifndef mutex_t\ntypedef int mutex_t;\n#endif\n\nvoid _ATTR_WEAK_ _FAT_lock_init(mutex_t *mutex)\n{\n\treturn;\n}\n\nvoid _ATTR_WEAK_ _FAT_lock_deinit(mutex_t *mutex)\n{\n\treturn;\n}\n\nvoid _ATTR_WEAK_ _FAT_lock(mutex_t *mutex)\n{\n\treturn;\n}\n\nvoid _ATTR_WEAK_ _FAT_unlock(mutex_t *mutex)\n{\n\treturn;\n}\n\n#endif // USE_LWP_LOCK\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/lock.h",
    "content": "/*\n lock.h\n\n Copyright (c) 2008 Sven Peter <svpe@gmx.net>\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n*/\n\n#ifndef _LOCK_H\n#define _LOCK_H\n\n#include \"common.h\"\n\n#ifdef USE_LWP_LOCK\n\nstatic inline void _FAT_lock_init(mutex_t *mutex)\n{\n\tLWP_MutexInit(mutex, false);\n}\n\nstatic inline void _FAT_lock_deinit(mutex_t *mutex)\n{\n\tLWP_MutexDestroy(*mutex);\n}\n\nstatic inline void _FAT_lock(mutex_t *mutex)\n{\n\tLWP_MutexLock(*mutex);\n}\n\nstatic inline void _FAT_unlock(mutex_t *mutex)\n{\n\tLWP_MutexUnlock(*mutex);\n}\n\n#else\n\n// We still need a blank lock type\n#ifndef mutex_t\ntypedef int mutex_t;\n#endif\n\nvoid _FAT_lock_init(mutex_t *mutex);\nvoid _FAT_lock_deinit(mutex_t *mutex);\nvoid _FAT_lock(mutex_t *mutex);\nvoid _FAT_unlock(mutex_t *mutex);\n\n#endif // USE_LWP_LOCK\n\n\n#endif // _LOCK_H\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/mem_allocate.h",
    "content": "/*\n mem_allocate.h\n Memory allocation and destruction calls\n Replace these calls with custom allocators if\n malloc is unavailable\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _MEM_ALLOCATE_H\n#define _MEM_ALLOCATE_H\n\n#include <stdlib.h>\n\nstatic inline void* _FAT_mem_allocate (size_t size) {\n\treturn malloc (size);\n}\n\nstatic inline void* _FAT_mem_align (size_t size) {\n#ifdef __wii__\n\treturn memalign (32, size);\n#else\n\treturn malloc (size);\n#endif\n}\n\nstatic inline void _FAT_mem_free (void* mem) {\n\tfree (mem);\n}\n\n#endif // _MEM_ALLOCATE_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/partition.cpp",
    "content": "/*\n partition.c\n Functions for mounting and dismounting partitions\n on various block devices.\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include \"partition.h\"\n#include \"bit_ops.h\"\n#include \"file_allocation_table.h\"\n#include \"directory.h\"\n#include \"mem_allocate.h\"\n#include \"fatfile.h\"\n\n#include <string.h>\n#include <ctype.h>\n\n#ifndef LIBFAT_PC\n#include <sys/iosupport.h>\n#endif\n\n/*\nThis device name, as known by devkitPro toolchains\n*/\nconst char* DEVICE_NAME = \"fat\";\n\n/*\nData offsets\n*/\n\n// BIOS Parameter Block offsets\nenum BPB {\n\tBPB_jmpBoot = 0x00,\n\tBPB_OEMName = 0x03,\n\t// BIOS Parameter Block\n\tBPB_bytesPerSector = 0x0B,\n\tBPB_sectorsPerCluster = 0x0D,\n\tBPB_reservedSectors = 0x0E,\n\tBPB_numFATs = 0x10,\n\tBPB_rootEntries = 0x11,\n\tBPB_numSectorsSmall = 0x13,\n\tBPB_mediaDesc = 0x15,\n\tBPB_sectorsPerFAT = 0x16,\n\tBPB_sectorsPerTrk = 0x18,\n\tBPB_numHeads = 0x1A,\n\tBPB_numHiddenSectors = 0x1C,\n\tBPB_numSectors = 0x20,\n\t// Ext BIOS Parameter Block for FAT16\n\tBPB_FAT16_driveNumber = 0x24,\n\tBPB_FAT16_reserved1 = 0x25,\n\tBPB_FAT16_extBootSig = 0x26,\n\tBPB_FAT16_volumeID = 0x27,\n\tBPB_FAT16_volumeLabel = 0x2B,\n\tBPB_FAT16_fileSysType = 0x36,\n\t// Bootcode\n\tBPB_FAT16_bootCode = 0x3E,\n\t// FAT32 extended block\n\tBPB_FAT32_sectorsPerFAT32 = 0x24,\n\tBPB_FAT32_extFlags = 0x28,\n\tBPB_FAT32_fsVer = 0x2A,\n\tBPB_FAT32_rootClus = 0x2C,\n\tBPB_FAT32_fsInfo = 0x30,\n\tBPB_FAT32_bkBootSec = 0x32,\n\t// Ext BIOS Parameter Block for FAT32\n\tBPB_FAT32_driveNumber = 0x40,\n\tBPB_FAT32_reserved1 = 0x41,\n\tBPB_FAT32_extBootSig = 0x42,\n\tBPB_FAT32_volumeID = 0x43,\n\tBPB_FAT32_volumeLabel = 0x47,\n\tBPB_FAT32_fileSysType = 0x52,\n\t// Bootcode\n\tBPB_FAT32_bootCode = 0x5A,\n\tBPB_bootSig_55 = 0x1FE,\n\tBPB_bootSig_AA = 0x1FF\n};\n\nstatic const char FAT_SIG[3] = {'F', 'A', 'T'};\n\n\nsec_t FindFirstValidPartition(const DISC_INTERFACE* disc)\n{\n\tuint8_t part_table[16*4];\n\tuint8_t *ptr;\n\tint i;\n\n\tuint8_t sectorBuffer[BYTES_PER_READ] = {0};\n\n\t// Read first sector of disc\n\tif (!_FAT_disc_readSectors (disc, 0, 1, sectorBuffer)) {\n\t\treturn 0;\n\t}\n\n\tmemcpy(part_table,sectorBuffer+0x1BE,16*4);\n\tptr = part_table;\n\n\tfor(i=0;i<4;i++,ptr+=16) {\n\t\tsec_t part_lba = u8array_to_u32(ptr, 0x8);\n\n\t\tif (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) ||\n\t\t\t!memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) {\n\t\t\treturn part_lba;\n\t\t}\n\n\t\tif(ptr[4]==0) continue;\n\n\t\tif(ptr[4]==0x0F) {\n\t\t\tsec_t part_lba2=part_lba;\n\t\t\tsec_t next_lba2=0;\n\t\t\tint n;\n\n\t\t\tfor(n=0;n<8;n++) // max 8 logic partitions\n\t\t\t{\n\t\t\t\tif(!_FAT_disc_readSectors (disc, part_lba+next_lba2, 1, sectorBuffer)) return 0;\n\n\t\t\t\tpart_lba2 = part_lba + next_lba2 + u8array_to_u32(sectorBuffer, 0x1C6) ;\n\t\t\t\tnext_lba2 = u8array_to_u32(sectorBuffer, 0x1D6);\n\n\t\t\t\tif(!_FAT_disc_readSectors (disc, part_lba2, 1, sectorBuffer)) return 0;\n\n\t\t\t\tif (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) ||\n\t\t\t\t\t!memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG)))\n\t\t\t\t{\n\t\t\t\t\treturn part_lba2;\n\t\t\t\t}\n\n\t\t\t\tif(next_lba2==0) break;\n\t\t\t}\n\t\t} else {\n\t\t\tif(!_FAT_disc_readSectors (disc, part_lba, 1, sectorBuffer)) return 0;\n\t\t\tif (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) ||\n\t\t\t\t!memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) {\n\t\t\t\treturn part_lba;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n}\n\nPARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t sectorsPerPage, sec_t startSector) {\n\tPARTITION* partition;\n\tuint8_t sectorBuffer[BYTES_PER_READ] = {0};\n\n\t// Read first sector of disc\n\tif (!_FAT_disc_readSectors (disc, startSector, 1, sectorBuffer)) {\n\t\treturn NULL;\n\t}\n\t\n\t// Make sure it is a valid MBR or boot sector\n\tif ( (sectorBuffer[BPB_bootSig_55] != 0x55) || (sectorBuffer[BPB_bootSig_AA] != 0xAA)) {\n\t\treturn NULL;\n\t}\n\n\tif (startSector != 0) {\n\t\t// We're told where to start the partition, so just accept it\n\t} else if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG))) {\n\t\t// Check if there is a FAT string, which indicates this is a boot sector\n\t\tstartSector = 0;\n\t} else if (!memcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG))) {\n\t\t// Check for FAT32\n\t\tstartSector = 0;\n\t} else {\n\t\tstartSector = FindFirstValidPartition(disc);\n\t\tif (!_FAT_disc_readSectors (disc, startSector, 1, sectorBuffer)) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\t// Now verify that this is indeed a FAT partition\n\tif (memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)) &&\n\t\tmemcmp(sectorBuffer + BPB_FAT32_fileSysType, FAT_SIG, sizeof(FAT_SIG)))\n\t{\n\t\treturn NULL;\n\t}\n\n\tpartition = (PARTITION*) _FAT_mem_allocate (sizeof(PARTITION));\n\tif (partition == NULL) {\n\t\treturn NULL;\n\t}\n\n\t// Init the partition lock\n\t_FAT_lock_init(&partition->lock);\n\n\tif (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)))\n\t\tstrncpy(partition->label, (char*)(sectorBuffer + BPB_FAT16_volumeLabel), 11);\n\telse\n\t\tstrncpy(partition->label, (char*)(sectorBuffer + BPB_FAT32_volumeLabel), 11);\n\tpartition->label[11] = '\\0';\n\n\t// Set partition's disc interface\n\tpartition->disc = disc;\n\n\t// Store required information about the file system\n\tpartition->fat.sectorsPerFat = u8array_to_u16(sectorBuffer, BPB_sectorsPerFAT);\n\tif (partition->fat.sectorsPerFat == 0) {\n\t\tpartition->fat.sectorsPerFat = u8array_to_u32( sectorBuffer, BPB_FAT32_sectorsPerFAT32);\n\t}\n\n\tpartition->numberOfSectors = u8array_to_u16( sectorBuffer, BPB_numSectorsSmall);\n\tif (partition->numberOfSectors == 0) {\n\t\tpartition->numberOfSectors = u8array_to_u32( sectorBuffer, BPB_numSectors);\n\t}\n\n\tpartition->bytesPerSector = BYTES_PER_READ;\t// Sector size is redefined to be 512 bytes\n\tpartition->sectorsPerCluster = sectorBuffer[BPB_sectorsPerCluster] * u8array_to_u16(sectorBuffer, BPB_bytesPerSector) / BYTES_PER_READ;\n\tpartition->bytesPerCluster = partition->bytesPerSector * partition->sectorsPerCluster;\n\tpartition->fat.fatStart = startSector + u8array_to_u16(sectorBuffer, BPB_reservedSectors);\n\n\tpartition->rootDirStart = partition->fat.fatStart + (sectorBuffer[BPB_numFATs] * partition->fat.sectorsPerFat);\n\tpartition->dataStart = partition->rootDirStart +\n\t\t(( u8array_to_u16(sectorBuffer, BPB_rootEntries) * DIR_ENTRY_DATA_SIZE) / partition->bytesPerSector);\n\n\tpartition->totalSize = ((uint64_t)partition->numberOfSectors - (partition->dataStart - startSector)) * (uint64_t)partition->bytesPerSector;\n\n\t// Store info about FAT\n\tuint32_t clusterCount = (partition->numberOfSectors - (uint32_t)(partition->dataStart - startSector)) / partition->sectorsPerCluster;\n\tpartition->fat.lastCluster = clusterCount + CLUSTER_FIRST - 1;\n\tpartition->fat.firstFree = CLUSTER_FIRST;\n\n\tif (clusterCount < CLUSTERS_PER_FAT12) {\n\t\tpartition->filesysType = FS_FAT12;\t// FAT12 volume\n\t} else if (clusterCount < CLUSTERS_PER_FAT16) {\n\t\tpartition->filesysType = FS_FAT16;\t// FAT16 volume\n\t} else {\n\t\tpartition->filesysType = FS_FAT32;\t// FAT32 volume\n\t}\n\n\tif (partition->filesysType != FS_FAT32) {\n\t\tpartition->rootDirCluster = FAT16_ROOT_DIR_CLUSTER;\n\t} else {\n\t\t// Set up for the FAT32 way\n\t\tpartition->rootDirCluster = u8array_to_u32(sectorBuffer, BPB_FAT32_rootClus);\n\t\t// Check if FAT mirroring is enabled\n\t\tif (!(sectorBuffer[BPB_FAT32_extFlags] & 0x80)) {\n\t\t\t// Use the active FAT\n\t\t\tpartition->fat.fatStart = partition->fat.fatStart + ( partition->fat.sectorsPerFat * (sectorBuffer[BPB_FAT32_extFlags] & 0x0F));\n\t\t}\n\t}\n\n\t// Create a cache to use\n\tpartition->cache = _FAT_cache_constructor (cacheSize, sectorsPerPage, partition->disc, startSector+partition->numberOfSectors);\n\n\t// Set current directory to the root\n\tpartition->cwdCluster = partition->rootDirCluster;\n\n\t// Check if this disc is writable, and set the readOnly property appropriately\n\tpartition->readOnly = !(_FAT_disc_features(disc) & FEATURE_MEDIUM_CANWRITE);\n\n\t// There are currently no open files on this partition\n\tpartition->openFileCount = 0;\n\tpartition->firstOpenFile = NULL;\n\n\treturn partition;\n}\n\nvoid _FAT_partition_destructor (PARTITION* partition) {\n\tFILE_STRUCT* nextFile;\n\n\t_FAT_lock(&partition->lock);\n\n\t// Synchronize open files\n\tnextFile = partition->firstOpenFile;\n\twhile (nextFile) {\n\t\t_FAT_syncToDisc (nextFile);\n\t\tnextFile = nextFile->nextOpenFile;\n\t}\n\n\t// Free memory used by the cache, writing it to disc at the same time\n\t_FAT_cache_destructor (partition->cache);\n\n\t// Unlock the partition and destroy the lock\n\t_FAT_unlock(&partition->lock);\n\t_FAT_lock_deinit(&partition->lock);\n\n\t// Free memory used by the partition\n\t_FAT_mem_free (partition);\n}\n\nPARTITION* _FAT_partition_getPartitionFromPath (const char* path) {\n\tconst devoptab_t *devops;\n\n\tdevops = GetDeviceOpTab (path);\n\n\tif (!devops) {\n\t\treturn NULL;\n\t}\n\n\treturn (PARTITION*)devops->deviceData;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/libfat/partition.h",
    "content": "/*\n partition.h\n Functions for mounting and dismounting partitions\n on various block devices.\n\n Copyright (c) 2006 Michael \"Chishm\" Chisholm\n\t\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n  1. Redistributions of source code must retain the above copyright notice,\n     this list of conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice,\n     this list of conditions and the following disclaimer in the documentation and/or\n     other materials provided with the distribution.\n  3. The name of the author may not be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _PARTITION_H\n#define _PARTITION_H\n\n#include \"common.h\"\n#include \"cache.h\"\n#include \"lock.h\"\n\n// Device name\nextern const char* DEVICE_NAME;\n\n// Filesystem type\ntypedef enum {FS_UNKNOWN, FS_FAT12, FS_FAT16, FS_FAT32} FS_TYPE;\n\ntypedef struct {\n\tsec_t    fatStart;\n\tuint32_t sectorsPerFat;\n\tuint32_t lastCluster;\n\tuint32_t firstFree;\n} FAT;\n\ntypedef struct {\n\tconst DISC_INTERFACE* disc;\n\tCACHE*                cache;\n\t// Info about the partition\n\tFS_TYPE               filesysType;\n\tuint64_t              totalSize;\n\tsec_t                 rootDirStart;\n\tuint32_t              rootDirCluster;\n\tuint32_t              numberOfSectors;\n\tsec_t                 dataStart;\n\tuint32_t              bytesPerSector;\n\tuint32_t              sectorsPerCluster;\n\tuint32_t              bytesPerCluster;\n\tFAT                   fat;\n\t// Values that may change after construction\n\tuint32_t              cwdCluster;\t\t\t// Current working directory cluster\n\tint                   openFileCount;\n\tstruct _FILE_STRUCT*  firstOpenFile;\t\t// The start of a linked list of files\n\tmutex_t               lock;\t\t\t\t\t// A lock for partition operations\n\tbool                  readOnly;\t\t\t\t// If this is set, then do not try writing to the disc\n\tchar                  label[12];\t\t\t// Volume label\n} PARTITION;\n\n/*\nMount the supplied device and return a pointer to the struct necessary to use it\n*/\nPARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t SectorsPerPage, sec_t startSector);\n\n/*\nDismount the device and free all structures used. \nWill also attempt to synchronise all open files to disc.\n*/\nvoid _FAT_partition_destructor (PARTITION* partition);\n\n/*\nReturn the partition specified in a path, as taken from the devoptab.\n*/\nPARTITION* _FAT_partition_getPartitionFromPath (const char* path);\n\n#endif // _PARTITION_H\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/Makefile.am",
    "content": "DISTCLEANFILES = asm.h core.h funcs.h fp.h\n\nEXTRA_DIST = i386/Makefile.frag \\\n        i386/asm-32.h i386/asm-64.h i386/asm.h \\\n        i386/core-32.h i386/core-64.h i386/core.h \\\n        i386/fp-32.h i386/fp-64.h i386/fp.h \\\n        i386/fp-x87.h i386/fp-sse.h \\\n        i386/funcs.h \\\n        sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \\\n        ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h \\\n        mips/Makefile.frag \\\n        mips/asm.h mips/core.h mips/core-32.h mips/core-64.h \\\n        mips/fp.h mips/fp-32.h mips/fp-64.h mips/funcs.h \\\n        arm/Makefile.frag \\\n        arm/asm.h arm/core.h arm/fp.h arm/fp-swf.h arm/fp-vfp.h \\\n        arm/funcs.h\n\n@lightning_frag@\n\nLIGHTNING_COMMON_FILES = funcs-common.h core-common.h fp-common.h asm-common.h\n\nif LIGHTNING_MAIN\n\nlightningdir = $(includedir)/lightning\ndist_pkgdata_DATA = Makefile.am\ndist_lightning_HEADERS = $(LIGHTNING_COMMON_FILES)\nnodist_lightning_HEADERS = asm.h core.h funcs.h fp.h $(LIGHTNING_TARGET_FILES)\n\nelse\nall-am:\n\t@set frob $(LIGHTNING_TARGET_FILES); shift; \\\n\tfor i; \\\n\tdo \\\n\t  echo $(LN_S) -f $(srcdir)/$$i `basename $$i`; \\\n\t  $(LN_S) -f $(srcdir)/$$i `basename $$i`; \\\n\tdone\n\nclean-local:\n\t@set frob $(LIGHTNING_TARGET_FILES); shift; \\\n\tfor i; \\\n\tdo \\\n\t  echo rm -f `basename $$i`; \\\n\t  rm -f `basename $$i`; \\\n\tdone\n\ndist-hook:\n\tcp -p $(srcdir)/lightning.h $(distdir)\nendif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,\n# Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\n\nVPATH = @srcdir@\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\ntarget_triplet = @target@\nsubdir = lightning\nDIST_COMMON = $(am__dist_lightning_HEADERS_DIST) \\\n\t$(am__dist_pkgdata_DATA_DIST) $(srcdir)/Makefile.am \\\n\t$(srcdir)/Makefile.in\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/build-aux/lightning.m4 \\\n\t$(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES = asm.h fp.h core.h funcs.h\nCONFIG_CLEAN_VPATH_FILES =\nSOURCES =\nDIST_SOURCES =\nam__dist_pkgdata_DATA_DIST = Makefile.am\nam__vpath_adj_setup = srcdirstrip=`echo \"$(srcdir)\" | sed 's|.|.|g'`;\nam__vpath_adj = case $$p in \\\n    $(srcdir)/*) f=`echo \"$$p\" | sed \"s|^$$srcdirstrip/||\"`;; \\\n    *) f=$$p;; \\\n  esac;\nam__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;\nam__install_max = 40\nam__nobase_strip_setup = \\\n  srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*|]/\\\\\\\\&/g'`\nam__nobase_strip = \\\n  for p in $$list; do echo \"$$p\"; done | sed -e \"s|$$srcdirstrip/||\"\nam__nobase_list = $(am__nobase_strip_setup); \\\n  for p in $$list; do echo \"$$p $$p\"; done | \\\n  sed \"s| $$srcdirstrip/| |;\"' / .*\\//!s/ .*/ ./; s,\\( .*\\)/[^/]*$$,\\1,' | \\\n  $(AWK) 'BEGIN { files[\".\"] = \"\" } { files[$$2] = files[$$2] \" \" $$1; \\\n    if (++n[$$2] == $(am__install_max)) \\\n      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = \"\" } } \\\n    END { for (dir in files) print dir, files[dir] }'\nam__base_list = \\\n  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\\n/ /g' | \\\n  sed '$$!N;$$!N;$$!N;$$!N;s/\\n/ /g'\nam__installdirs = \"$(DESTDIR)$(pkgdatadir)\" \\\n\t\"$(DESTDIR)$(lightningdir)\" \"$(DESTDIR)$(lightningdir)\"\nDATA = $(dist_pkgdata_DATA)\nam__dist_lightning_HEADERS_DIST = funcs-common.h core-common.h \\\n\tfp-common.h asm-common.h\nHEADERS = $(dist_lightning_HEADERS) $(nodist_lightning_HEADERS)\nETAGS = etags\nCTAGS = ctags\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nBACKENDS = @BACKENDS@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEXEEXT = @EXEEXT@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_INFO = @INSTALL_INFO@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLDFLAGS = @LDFLAGS@\nLIBDISASS = @LIBDISASS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nOBJEXT = @OBJEXT@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ncpu = @cpu@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget = @target@\ntarget_alias = @target_alias@\ntarget_cpu = @target_cpu@\ntarget_os = @target_os@\ntarget_vendor = @target_vendor@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nDISTCLEANFILES = asm.h core.h funcs.h fp.h\nEXTRA_DIST = i386/Makefile.frag \\\n        i386/asm-32.h i386/asm-64.h i386/asm.h \\\n        i386/core-32.h i386/core-64.h i386/core.h \\\n        i386/fp-32.h i386/fp-64.h i386/fp.h \\\n        i386/fp-x87.h i386/fp-sse.h \\\n        i386/funcs.h \\\n        sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \\\n        ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h \\\n        mips/Makefile.frag \\\n        mips/asm.h mips/core.h mips/core-32.h mips/core-64.h \\\n        mips/fp.h mips/fp-32.h mips/fp-64.h mips/funcs.h \\\n        arm/Makefile.frag \\\n        arm/asm.h arm/core.h arm/fp.h arm/fp-swf.h arm/fp-vfp.h \\\n        arm/funcs.h\n\nLIGHTNING_COMMON_FILES = funcs-common.h core-common.h fp-common.h asm-common.h\n@LIGHTNING_MAIN_TRUE@lightningdir = $(includedir)/lightning\n@LIGHTNING_MAIN_TRUE@dist_pkgdata_DATA = Makefile.am\n@LIGHTNING_MAIN_TRUE@dist_lightning_HEADERS = $(LIGHTNING_COMMON_FILES)\n@LIGHTNING_MAIN_TRUE@nodist_lightning_HEADERS = asm.h core.h funcs.h fp.h $(LIGHTNING_TARGET_FILES)\nall: all-am\n\n.SUFFIXES:\n$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lightning/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --gnu lightning/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure:  $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4):  $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\ninstall-dist_pkgdataDATA: $(dist_pkgdata_DATA)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(pkgdatadir)\" || $(MKDIR_P) \"$(DESTDIR)$(pkgdatadir)\"\n\t@list='$(dist_pkgdata_DATA)'; test -n \"$(pkgdatadir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(pkgdatadir)\" || exit $$?; \\\n\tdone\n\nuninstall-dist_pkgdataDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(dist_pkgdata_DATA)'; test -n \"$(pkgdatadir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\ttest -n \"$$files\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(pkgdatadir)\" && rm -f $$files\ninstall-dist_lightningHEADERS: $(dist_lightning_HEADERS)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(lightningdir)\" || $(MKDIR_P) \"$(DESTDIR)$(lightningdir)\"\n\t@list='$(dist_lightning_HEADERS)'; test -n \"$(lightningdir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_HEADER) $$files '$(DESTDIR)$(lightningdir)'\"; \\\n\t  $(INSTALL_HEADER) $$files \"$(DESTDIR)$(lightningdir)\" || exit $$?; \\\n\tdone\n\nuninstall-dist_lightningHEADERS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(dist_lightning_HEADERS)'; test -n \"$(lightningdir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\ttest -n \"$$files\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(lightningdir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(lightningdir)\" && rm -f $$files\ninstall-nodist_lightningHEADERS: $(nodist_lightning_HEADERS)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(lightningdir)\" || $(MKDIR_P) \"$(DESTDIR)$(lightningdir)\"\n\t@list='$(nodist_lightning_HEADERS)'; test -n \"$(lightningdir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_HEADER) $$files '$(DESTDIR)$(lightningdir)'\"; \\\n\t  $(INSTALL_HEADER) $$files \"$(DESTDIR)$(lightningdir)\" || exit $$?; \\\n\tdone\n\nuninstall-nodist_lightningHEADERS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(nodist_lightning_HEADERS)'; test -n \"$(lightningdir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\ttest -n \"$$files\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(lightningdir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(lightningdir)\" && rm -f $$files\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n@LIGHTNING_MAIN_TRUE@dist-hook:\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t$(MAKE) $(AM_MAKEFLAGS) \\\n\t  top_distdir=\"$(top_distdir)\" distdir=\"$(distdir)\" \\\n\t  dist-hook\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(DATA) $(HEADERS)\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(pkgdatadir)\" \"$(DESTDIR)$(lightningdir)\" \"$(DESTDIR)$(lightningdir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\t$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t  install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t  `test -z '$(STRIP)' || \\\n\t    echo \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\"` install\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\t-test -z \"$(DISTCLEANFILES)\" || rm -f $(DISTCLEANFILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\n@LIGHTNING_MAIN_TRUE@clean-local:\nclean: clean-am\n\nclean-am: clean-generic clean-local mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am: install-dist_lightningHEADERS \\\n\tinstall-dist_pkgdataDATA install-nodist_lightningHEADERS\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-generic\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-dist_lightningHEADERS \\\n\tuninstall-dist_pkgdataDATA uninstall-nodist_lightningHEADERS\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \\\n\tclean-local ctags dist-hook distclean distclean-generic \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am \\\n\tinstall-dist_lightningHEADERS install-dist_pkgdataDATA \\\n\tinstall-dvi install-dvi-am install-exec install-exec-am \\\n\tinstall-html install-html-am install-info install-info-am \\\n\tinstall-man install-nodist_lightningHEADERS install-pdf \\\n\tinstall-pdf-am install-ps install-ps-am install-strip \\\n\tinstallcheck installcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-generic pdf \\\n\tpdf-am ps ps-am tags uninstall uninstall-am \\\n\tuninstall-dist_lightningHEADERS uninstall-dist_pkgdataDATA \\\n\tuninstall-nodist_lightningHEADERS\n\n\n@lightning_frag@\n\n@LIGHTNING_MAIN_FALSE@all-am:\n@LIGHTNING_MAIN_FALSE@\t@set frob $(LIGHTNING_TARGET_FILES); shift; \\\n@LIGHTNING_MAIN_FALSE@\tfor i; \\\n@LIGHTNING_MAIN_FALSE@\tdo \\\n@LIGHTNING_MAIN_FALSE@\t  echo $(LN_S) -f $(srcdir)/$$i `basename $$i`; \\\n@LIGHTNING_MAIN_FALSE@\t  $(LN_S) -f $(srcdir)/$$i `basename $$i`; \\\n@LIGHTNING_MAIN_FALSE@\tdone\n\n@LIGHTNING_MAIN_FALSE@clean-local:\n@LIGHTNING_MAIN_FALSE@\t@set frob $(LIGHTNING_TARGET_FILES); shift; \\\n@LIGHTNING_MAIN_FALSE@\tfor i; \\\n@LIGHTNING_MAIN_FALSE@\tdo \\\n@LIGHTNING_MAIN_FALSE@\t  echo rm -f `basename $$i`; \\\n@LIGHTNING_MAIN_FALSE@\t  rm -f `basename $$i`; \\\n@LIGHTNING_MAIN_FALSE@\tdone\n\n@LIGHTNING_MAIN_FALSE@dist-hook:\n@LIGHTNING_MAIN_FALSE@\tcp -p $(srcdir)/lightning.h $(distdir)\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/Makefile.frag",
    "content": "LIGHTNING_TARGET_FILES += arm/fp-swf.h arm/fp-vfp.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/README",
    "content": "  The code pass all test cases on contrib/check and lightning tests\nrunning under qemu versatilepb (armv5te).\n\n  It is not optimal but should be compatible with most lightning\nusages. Some redesign could be done, like not using r0-r3 for\nJIT_R(n), but start at r4 (and change JIT_R_NUM and JIT_V_NUM from\n4 to 3), what would mean JIT_R(n) would actually be callee save, and\nuse \"ip\" as temporary (not used currently), but that would miss one\ntemporary, making it harder to implement some double operations.\n\n  One thing that could be done to reduce overhead is to map JIT_TMP\nto ip, and keep JIT_FPR(0) in r8-r9.\n\n  Another change could be to have prolog map fp to the address of the\nlr register in the stack, like is done by \"normally\" compiled code,\nbut should only be useful, but still probably not fully correct, to\nunwind C++ exceptions, but unwind of exceptions from functions called\nfrom lightning jit is not tested, and most likely broken on all ports.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/asm.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the arm\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2011 Free Software Foundation\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_asm_h\n#define __lightning_asm_h\n\ntypedef enum {\n    _R0,\t/* argument / result */\n    _R1,\t/* argument */\n    _R2,\t/* argument */\n    _R3,\t/* argument */\n    _R4,\t/* variable */\n    _R5,\t/* variable */\n    _R6,\t/* variable */\n    _R7,\t/* variable */\n    _R8,\t/* variable */\n    _R9,\t/* variable */\n    _R10,\t/* sl - stack limit */\n    _R11,\t/* fp - frame pointer */\n    _R12,\t/* ip - temporary */\n    _R13,\t/* sp - stack pointer */\n    _R14,\t/* lr - link register */\n    _R15,\t/* pc - program counter */\n} jit_gpr_t;\n\n#define JIT_RET\t\t_R0\n#define JIT_PC\t\t_R15\n#define JIT_LR\t\t_R14\n#define JIT_SP\t\t_R13\n#define JIT_FP\t\t_R11\n#define JIT_TMP\t\t_R8\n#define JIT_FTMP\t_R9\n\n/* must use blx to call functions or jit instruction set matches runtime? */\n#define jit_exchange_p()\t\t1\n\n/* _VxxxQ macros mean _Q0=_D0, _Q1=_D2, ... */\ntypedef enum {\n    _S0, _D0 = _S0, _Q0 = _D0,\n    _S1,\n    _S2, _D1 = _S2,\n    _S3,\n    _S4, _D2 = _S4, _Q1 = _D2,\n    _S5,\n    _S6, _D3 = _S6,\n    _S7,\n    _S8, _D4 = _S8, _Q2 = _D4,\n    _S9,\n    _S10, _D5 = _S10,\n    _S11,\n    _S12, _D6 = _S12, _Q3 = _D6,\n    _S13,\n    _S14, _D7 = _S14,\n    _S15,\n    _S16, _D8 = _S16, _Q4 = _D8,\n    _S17,\n    _S18, _D9 = _S18,\n    _S19,\n    _S20, _D10 = _S20, _Q5 = _D10,\n    _S21,\n    _S22, _D11 = _S22,\n    _S23,\n    _S24, _D12 = _S24, _Q6 = _D12,\n    _S25,\n    _S26, _D13 = _S26,\n    _S27,\n    _S28, _D14 = _S28, _Q7 = _D14,\n    _S29,\n    _S30, _D15 = _S30,\n    _S31,\n    JIT_FPRET,\t/* for abstraction of returning a float/double result */\n} jit_fpr_t;\n\n/* match vfpv3 result */\n#define NAN_TO_INT_IS_ZERO\t\t1\n\n#define jit_thumb_p()\t\t\tjit_cpu.thumb\n#define jit_armv6_p()\t\t\t(jit_cpu.version >= 6)\ntypedef union _jit_thumb_t {\n    int\t\ti;\n    short\ts[2];\n} jit_thumb_t;\n\n#if __BYTE_ORDER == __LITTLE_ENDIAN\n#  define _jit_WW(i, j)\t\t\tdo { _jit_W(j); _jit_W(i); } while (0)\n#  define code2thumb(t0, t1, c0, c1)\tdo { t1 = c0; t0 = c1; } while (0)\n#  define thumb2code(t0, t1, c0, c1)\tdo { c0 = t1; c1 = t0; } while (0)\n#else\n#  define _jit_WW(i, j)\t\t\tdo { _jit_W(i); _jit_W(j); } while (0)\n#  define code2thumb(t0, t1, c0, c1)\tdo { t0 = c0; t1 = c1; } while (0)\n#  define thumb2code(t0, t1, c0, c1)\tdo { c0 = t0; c1 = t1; } while (0)\n#endif\n\n#define ARM_CC_EQ\t0x00000000\t/* Z=1 */\n#define ARM_CC_NE\t0x10000000\t/* Z=0 */\n#define ARM_CC_HS\t0x20000000\t/* C=1 */\n#  define ARM_CC_CS\tARM_CC_HS\n#define ARM_CC_LO\t0x30000000\t/* C=0 */\n#  define ARM_CC_CC\tARM_CC_LO\n#define ARM_CC_MI\t0x40000000\t/* N=1 */\n#define ARM_CC_PL\t0x50000000\t/* N=0 */\n#define ARM_CC_VS\t0x60000000\t/* V=1 */\n#define ARM_CC_VC\t0x70000000\t/* V=0 */\n#define ARM_CC_HI\t0x80000000\t/* C=1 && Z=0 */\n#define ARM_CC_LS\t0x90000000\t/* C=0 || Z=1 */\n#define ARM_CC_GE\t0xa0000000\t/* N=V */\n#define ARM_CC_LT\t0xb0000000\t/* N!=V */\n#define ARM_CC_GT\t0xc0000000\t/* Z=0 && N=V */\n#define ARM_CC_LE\t0xd0000000\t/* Z=1 || N!=V */\n#define ARM_CC_AL\t0xe0000000\t/* always */\n#define ARM_CC_NV\t0xf0000000\t/* reserved */\n\n#define ARM_MOV\t\t0x01a00000\n#define THUMB_MOV\t    0x4600\n#define ARM_MOVWI\t0x03000000\n#define THUMB_MOVI\t    0x2000\n#define THUMB2_MOVI\t0xf0400000\n#define THUMB2_MOVWI\t0xf2400000\n#define ARM_MOVTI\t0x03400000\n#define THUMB2_MOVTI\t0xf2c00000\n#define ARM_MVN\t\t0x01e00000\n#define THUMB_MVN\t    0x43c0\n#define THUMB2_MVN\t0xea600000\n#define THUMB2_MVNI\t0xf0600000\n#define ARM_MRC\t\t0x0e100010\n#define ARM_MRRC\t0x0c500000\n#define ARM_MRS\t\t0x010f0000\n#define ARM_MSRI\t0x03200000\n#define ARM_MSR\t\t0x0120f000\n\n#define ARM_I\t\t0x02000000\t/* immediate */\n#define ARM_S\t\t0x00100000\t/* set flags */\n#define ARM_ADD\t\t0x00800000\n#define THUMB_ADD\t    0x1800\n#define THUMB_ADDX\t    0x4400\n#define THUMB2_ADD\t0xeb000000\n#define THUMB_ADDI3\t    0x1c00\n#define THUMB_ADDI8\t    0x3000\n#define THUMB2_ADDI\t0xf1000000\n#define THUMB2_ADDWI\t0xf2000000\n#define ARM_ADC\t\t0x00a00000\n#define THUMB_ADC\t    0x4140\n#define THUMB2_ADC\t0xeb400000\n#define THUMB2_ADCI\t0xf1400000\n#define ARM_SUB\t\t0x00400000\n#define THUMB_SUB\t    0x1a00\n#define THUMB2_SUB\t0xeba00000\n#define THUMB_SUBI3\t    0x1e00\n#define THUMB_SUBI8\t    0x3800\n#define THUMB2_SUBI\t0xf1a00000\n#define THUMB2_SUBWI\t0xf2a00000\n#define ARM_SBC\t\t0x00c00000\n#define THUMB_SBC\t    0x4180\n#define THUMB2_SBC\t0xeb600000\n#define THUMB2_SBCI\t0xf1600000\n#define ARM_RSB\t\t0x00600000\n#define THUMB2_RSB\t0xebc00000\n#define THUMB_RSBI\t    0x4240\n#define THUMB2_RSBI\t0xf1c00000\n#define ARM_MUL\t\t0x00000090\n#define THUMB_MUL\t    0x4340\n#define THUMB2_MUL\t0xfb00f000\n#define ARM_SMULL\t0x00c00090\n#define THUMB2_SMULL\t0xfb800000\n#define ARM_UMULL\t0x00800090\n#define THUMB2_UMULL\t0xfba00000\n#define THUMB2_SDIV\t0xfb90f0f0\n#define THUMB2_UDIV\t0xfbb0f0f0\n\n#define ARM_AND\t\t0x00000000\n#define THUMB_AND\t    0x4000\n#define THUMB2_AND\t0xea000000\n#define THUMB2_ANDI\t0xf0000000\n#define ARM_BIC\t\t0x01c00000\n#define THUMB2_BIC\t0xea200000\n#define THUMB2_BICI\t0xf0200000\n#define ARM_ORR\t\t0x01800000\n#define THUMB_ORR\t    0x4300\n#define THUMB2_ORR\t0xea400000\n#define THUMB2_ORRI\t0xf0400000\n#define ARM_EOR\t\t0x00200000\n#define THUMB_EOR\t    0x4040\n#define THUMB2_EOR\t0xea800000\n#define THUMB2_EORI\t0xf0800000\n#define ARM_REV\t\t0x06bf0f30\n#define THUMB_REV\t    0xba00\n#define THUMB2_REV\t0xfa90f080\n#define ARM_REV16\t0x06bf0fb0\n#define THUMB_REV16\t    0xba40\n#define THUMB2_REV16\t0xfa90f090\n#define ARM_SXTB\t0x06af0070\n#define THUMB_SXTB\t    0xb240\n#define THUMB2_SXTB\t0xfa4f0080\n#define ARM_UXTB\t0x06ef0070\n#define THUMB_UXTB\t    0xb2c0\n#define THUMB2_UXTB\t0xfa5f0080\n#define ARM_SXTH\t0x06bf0070\n#define THUMB_SXTH\t    0xb200\n#define THUMB2_SXTH\t0xfa0f0080\n#define ARM_UXTH\t0x06ff0070\n#define THUMB_UXTH\t    0xb280\n#define THUMB2_UXTH\t0xfa1f0080\n#define ARM_XTR8\t0x00000400\t/* ?xt? rotate 8 bits */\n#define ARM_XTR16\t0x00000800\t/* ?xt? rotate 16 bits */\n#define ARM_XTR24\t0x00000c00\t/* ?xt? rotate 24 bits */\n\n#define ARM_SHIFT\t0x01a00000\n#define ARM_R\t\t0x00000010\t/* register shift */\n#define ARM_LSL\t\t0x00000000\n#define THUMB_LSL\t    0x4080\n#define THUMB2_LSL\t0xfa00f000\n#define THUMB_LSLI\t    0x0000\n#define THUMB2_LSLI\t0xea4f0000\n#define ARM_LSR\t\t0x00000020\n#define THUMB_LSR\t    0x40c0\n#define THUMB2_LSR\t0xfa20f000\n#define THUMB_LSRI\t    0x0800\n#define THUMB2_LSRI\t0xea4f0010\n#define ARM_ASR\t\t0x00000040\n#define THUMB_ASR\t    0x4100\n#define THUMB2_ASR\t0xfa40f000\n#define THUMB_ASRI\t    0x1000\n#define THUMB2_ASRI\t0xea4f0020\n#define ARM_ROR\t\t0x00000060\n#define ARM_PKH\t\t0x06800010\t/* v6T2,v7 */\n\n#define ARM_CMP\t\t0x01500000\n#define THUMB_CMP\t    0x4280\n#define THUMB_CMPX\t    0x4500\n#define THUMB2_CMP\t0xebb00000\n#define THUMB_CMPI\t    0x2800\n#define THUMB2_CMPI\t0xf1b00000\n#define ARM_CMN\t\t0x01700000\n#define THUMB_CMN\t    0x42c0\n#define THUMB2_CMN\t0xeb100000\n#define THUMB2_CMNI\t0xf1100000\n#define ARM_TST\t\t0x01100000\n#define THUMB_TST\t    0x4200\n#define THUMB2_TST\t0xea100000\n#define THUMB2_TSTI\t0xf0100000\n#define ARM_TEQ\t\t0x01300000\n\n/* branch */\n#define ARM_BX\t\t0x012fff10\n#define ARM_BLX\t\t0x012fff30\n#define THUMB_BLX\t    0x4780\n#define ARM_BLXI\t0xfa000000\n#define THUMB2_BLXI\t0xf000c000\n#define ARM_B\t\t0x0a000000\n#define THUMB_CC_B\t    0xd000\n#define THUMB_B\t\t    0xe000\n#define THUMB2_CC_B\t0xf0008000\n#define THUMB2_B\t0xf0009000\n#define ARM_BLI\t\t0x0b000000\n#define THUMB2_BLI\t0xf000d000\n\n/* ldr/str */\n#define ARM_P\t\t0x00800000\t/* positive offset\n\t\t\t\t\t * actually, the errata manual\n\t\t\t\t\t * calls this to U field and\n\t\t\t\t\t * 1<<24 the P field */\n#define THUMB2_P\t0x00000400\n#define THUMB2_U\t0x00000200\n#define THUMB2_W\t0x00000100\n#define ARM_LDRSB\t0x011000d0\n#define THUMB_LDRSB\t    0x5600\n#define THUMB2_LDRSB\t0xf9100000\n#define ARM_LDRSBI\t0x015000d0\n#define THUMB2_LDRSBI\t0xf9100c00\n#define THUMB2_LDRSBWI\t0xf9900000\n#define ARM_LDRB\t0x07500000\n#define THUMB_LDRB\t    0x5c00\n#define THUMB2_LDRB\t0xf8100000\n#define ARM_LDRBI\t0x05500000\n#define THUMB_LDRBI\t    0x7800\n#define THUMB2_LDRBI\t0xf8100c00\n#define THUMB2_LDRBWI\t0xf8900000\n#define ARM_LDRSH\t0x011000f0\n#define THUMB_LDRSH\t    0x5e00\n#define THUMB2_LDRSH\t0xf9300000\n#define ARM_LDRSHI\t0x015000f0\n#define THUMB2_LDRSHI\t0xf9300c00\n#define THUMB2_LDRSHWI\t0xf9b00000\n#define ARM_LDRH\t0x011000b0\n#define THUMB_LDRH\t    0x5a00\n#define THUMB2_LDRH\t0xf8300000\n#define ARM_LDRHI\t0x015000b0\n#define THUMB_LDRHI\t    0x8800\n#define THUMB2_LDRHI\t0xf8300c00\n#define THUMB2_LDRHWI\t0xf8b00000\n#define ARM_LDR\t\t0x07100000\n#define THUMB_LDR\t    0x5800\n#define THUMB2_LDR\t0xf8500000\n#define ARM_LDRI\t0x05100000\n#define THUMB_LDRI\t    0x6800\n#define THUMB_LDRISP\t    0x9800\n#define THUMB2_LDRI\t0xf8500c00\t/* manual says v6t2/v7; does not work */\n#define THUMB2_LDRWI\t0xf8d00000\n#define ARM_LDRD\t0x010000d0\n#define ARM_LDRDI\t0x014000d0\n#define THUMB2_LDRDI\t0xe8500000\n#define ARM_STRB\t0x07400000\n#define THUMB_STRB\t    0x5400\n#define THUMB2_STRB\t0xf8000000\n#define ARM_STRBI\t0x05400000\n#define THUMB_STRBI\t    0x7000\n#define THUMB2_STRBI\t0xf8000c00\n#define THUMB2_STRBWI\t0xf8800000\n#define ARM_STRH\t0x010000b0\n#define THUMB_STRH\t    0x5200\n#define THUMB2_STRH\t0xf8200000\n#define ARM_STRHI\t0x014000b0\n#define THUMB_STRHI\t    0x8000\n#define THUMB2_STRHI\t0xf8200c00\n#define THUMB2_STRHWI\t0xf8a00000\n#define ARM_STR\t\t0x07000000\n#define THUMB_STR\t    0x5000\n#define THUMB2_STR\t0xf8400000\n#define ARM_STRI\t0x05000000\n#define THUMB_STRI\t    0x6000\n#define THUMB_STRISP\t    0x9000\n#define THUMB2_STRI\t0xf8400c00\n#define THUMB2_STRWI\t0xf8c00000\n#define ARM_STRD\t0x010000f0\n#define ARM_STRDI\t0x014000f0\n#define THUMB2_STRDI\t0xe8400000\t/* manual says v6t2/v7; does not work */\n\n/* ldm/stm */\n#define ARM_M\t\t0x08000000\n#define ARM_M_L\t\t0x00100000\t/* load; store if not set */\n#define ARM_M_I\t\t0x00800000\t/* inc; dec if not set */\n#define ARM_M_B\t\t0x01000000\t/* before; after if not set */\n#define ARM_M_U\t\t0x00200000\t/* update Rn */\n#define THUMB2_LDM_W\t0x00200000\n#define THUMB2_LDM_P\t0x00008000\n#define THUMB2_LDM_M\t0x00004000\n#define THUMB_LDMIA\t    0xc800\n#define THUMB2_LDMIA\t0xe8900000\n#define THUMB2_LDMDB\t0xe9100000\n#define THUMB_PUSH\t    0xb400\n#define THUMB2_PUSH\t0xe92d0000\n#define THUMB_POP\t    0xbc00\n#define THUMB2_POP\t0xe8bd0000\n\n/* misc */\n#define ARM_CLZ\t\t0x016f0f10\n#define ARM_PLD\t\t0xf750f000\n#define ARM_PLDW\t0xf710f000\n#define ARM_PLDI\t0xf510f000\n#define ARM_PLDWI\t0xf510f000\n#define ARM_PLDLI\t0xf55ff000\n#define ARM_PLD_U\t0x00800000\n#define ARM_PLII\t0xf4d0f000\n#define ARM_PLINI\t0xf450f000\n#define ARM_PLI\t\t0xf6d0f000\n#define ARM_PLIN\t0xf650f000\n\n#define FPSCR_N\t\t0x80000000/* Negative condition code flag */\n#define FPSCR_Z\t\t0x40000000/* Zero condition code flag */\n#define FPSCR_C\t\t0x20000000/* Carry condition code flag */\n#define FPSCR_V\t\t0x10000000/* Overflow condition code flag */\n#define FPSCR_QC\t0x08000000/* Cumulative saturation flag */\n#define FPSCR_AHP\t0x04000000/* Alternative half-precision (unset is IEEE format) */\n#define FPSCR_DN\t0x02000000/* Default NaN mode */\n#define FPSCR_FZ\t0x01000000/* Flush to zero (unset is fully IEEE-754 compliant) */\n#define FPSCR_RMASK\t0x00c00000\n#  define FPSCR_RN\t0x00000000\t/* Round to Nearest */\n#  define FPSCR_RP\t0x00400000\t/* Round towards Plus Infinity */\n#  define FPSCR_RM\t0x00800000\t/* Round towards Minus Infinity */\n#  define FPSCR_RZ\t0x00c00000\t/* Round towards Zero */\n#define FPSCR_STRIDE\t0x00300000\n#define FPSCR_RES1\t0x00080000/* Reserved, UNK/SBZP */\n#define FPSCR_LEN\t0x00070000\n#define FPSCR_IDE\t0x00008000/* Input Denormal exception trap enable */\n#define FPSCR_IXE\t0x00001000/* Inexact exception trap enable */\n#define FPSCR_UFE\t0x00000800/* Underflow exception trap enable */\n#define FPSCR_OFE\t0x00000400/* Overflow exception trap enable */\n#define FPSCR_DZE\t0x00000200/* Division by zero exception trap enable */\n#define FPSCR_IOE\t0x00000100/* Invalid Operation exception trap enable */\n#define FPSCR_IDC\t0x00000080/* Input Denormal cumulative exception flag */\n#define FPSCR_RES0\t0x00000060/* Reserved, UNK/SBZP */\n#define FPSCR_IXC\t0x00000010/* Inexact cumulative exception flag */\n#define FPSCR_UFC\t0x00000008/* Underflow cumulative exception flag */\n#define FPSCR_OFC\t0x00000004/* Overflow cumulative exception flag */\n#define FPSCR_DZC\t0x00000002/* Division by zero cumulative exception flag */\n#define FPSCR_IOC\t0x00000001/* Invalid Operation cumulative exception flag */\n\n/***********************************************************************\n * VFPv2 and VFPv3 (encoding T2/A2) instructions\n ***********************************************************************/\n#define ARM_V_E\t\t0x00000080\t/* ARM_VCMP exception if NaN arg(s) */\n#define ARM_V_Z\t\t0x00010000\t/* ARM_VCMP with zero */\n#define ARM_V_F64\t0x00000100\t/* Undefined in single precision only variant */\n#define ARM_VADD_F\t0x0e300a00\n#define ARM_VSUB_F\t0x0e300a40\n#define ARM_VMUL_F\t0x0e200a00\n#define ARM_VDIV_F\t0x0e800a00\n#define ARM_VABS_F\t0x0eb00ac0\n#define ARM_VNEG_F\t0x0eb10a40\n#define ARM_VSQRT_F\t0x0eb10ac0\n#define ARM_VMOV_F\t0x0eb00a40\n#define ARM_VMOV_A_S\t0x0e100a10\t/* vmov rn, sn */\n#define ARM_VMOV_S_A\t0x0e000a10\t/* vmov sn, rn */\n#define ARM_VMOV_AA_D\t0x0c500b10\t/* vmov rn,rn, dn */\n#define ARM_VMOV_D_AA\t0x0c400b10\t/* vmov dn, rn,rn */\n#define ARM_VCMP\t0x0eb40a40\n#define ARM_VMRS\t0x0ef10a10\n#define ARM_VMSR\t0x0ee10a10\n#define ARM_VCVT_2I\t\t0x00040000\t/* to integer */\n#define ARM_VCVT_2S\t\t0x00010000\t/* to signed */\n#define ARM_VCVT_RS\t\t0x00000080\t/* round to zero or signed */\n#define ARM_VCVT\t\t0x0eb80a40\n#define ARM_VCVT_S32_F32\tARM_VCVT|ARM_VCVT_2I|ARM_VCVT_2S|ARM_VCVT_RS\n#define ARM_VCVT_U32_F32\tARM_VCVT|ARM_VCVT_2I|ARM_VCVT_RS\n#define ARM_VCVT_S32_F64\tARM_VCVT|ARM_VCVT_2I|ARM_VCVT_2S|ARM_VCVT_RS|ARM_V_F64\n#define ARM_VCVT_U32_F64\tARM_VCVT|ARM_VCVT_2I|ARM_VCVT_RS|ARM_V_F64\n#define ARM_VCVT_F32_S32\tARM_VCVT|ARM_VCVT_RS\n#define ARM_VCVT_F32_U32\tARM_VCVT\n#define ARM_VCVT_F64_S32\tARM_VCVT|ARM_VCVT_RS|ARM_V_F64\n#define ARM_VCVT_F64_U32\tARM_VCVT|ARM_V_F64\n#define ARM_VCVT_F\t\t0x0eb70ac0\n#define ARM_VCVT_F32_F64\tARM_VCVT_F\n#define ARM_VCVT_F64_F32\tARM_VCVT_F|ARM_V_F64\n\n/* does not set bit 7, meaning to use rounding mode of FPSCR */\n#define ARM_VCVTR_S32_F32\tARM_VCVT|ARM_VCVT_2I|ARM_VCVT_2S\n#define ARM_VCVTR_U32_F32\tARM_VCVT|ARM_VCVT_2I\n#define ARM_VCVTR_S32_F64\tARM_VCVT|ARM_VCVT_2I|ARM_VCVT_2S|ARM_V_F64\n#define ARM_VCVTR_U32_F64\tARM_VCVT|ARM_VCVT_2I|ARM_V_F64\n\n/***********************************************************************\n * NEON instructions (encoding T1/A1) (condition must always be ARM_CC_NV)\n ***********************************************************************/\n#define ARM_V_D\t\t0x00400000\n#define ARM_V_N\t\t0x00000080\n#define ARM_V_Q\t\t0x00000040\n#define ARM_V_M\t\t0x00000020\n#define ARM_V_U\t\t0x01000000\n#define ARM_V_I16\t0x00100000\n#define ARM_V_I32\t0x00200000\n#define ARM_V_I64\t0x00300000\n#define ARM_V_S16\t0x00040000\n#define ARM_V_S32\t0x00080000\n\n#define ARM_VADD_I\t0x02000800\n#define ARM_VQADD_I\t0x02000010\t/* sets flag on overflow/carry */\n#define ARM_VADDL_I\t0x02800000\t/* q=d+d */\n#define ARM_VADDW_I\t0x02800100\t/* q=q+d */\n#define ARM_VSUB_I\t0x03000800\n#define ARM_VQSUB_I\t0x02000210\t/* sets flag on overflow/carry */\n#define ARM_VSUBL_I\t0x02800200\n#define ARM_VSUBW_I\t0x02800300\n#define ARM_VMUL_I\t0x02000910\n#define ARM_VMULL_I\t0x02800c00\n\n#define ARM_VABS_I\t0x03b10300\n#define ARM_VQABS_I\t0x03b00700\t/* sets flag on overflow */\n#define ARM_VNEG_I\t0x03b10380\n#define ARM_VQNEG_I\t0x03b00780\t/* sets flag on overflow */\n\n#define ARM_VAND\t0x02000110\n#define ARM_VBIC\t0x02100110\n#define ARM_VORR\t0x02200110\n#define ARM_VORN\t0x02300110\n#define ARM_VEOR\t0x03000110\n#define ARM_VMOVL_S8\t0x00080000\n#define ARM_VMOVL_S16\t0x00100000\n#define ARM_VMOVL_S32\t0x00200000\n#define ARM_VMOVL_I\t0x02800a10\n\n#define ARM_VMVSI\t0x0eb00a00\n#define ARM_VMOVI\t0x02800010\n#define ARM_VMVNI\t0x02800030\n\n#define ARM_VLDR\t0x0d100a00\n#define ARM_VSTR\t0x0d000a00\n#define ARM_VM\t\t0x0c000a00\n\n/***********************************************************************\n * Advanced SIMD (encoding T2/A2) instructions\n ***********************************************************************/\n#define ARM_VMOV_ADV_U\t0x00800000 \t/* zero extend, sign extend if unset */\n#define ARM_VMOV_ADV_8\t0x00400000\n#define ARM_VMOV_ADV_16\t0x00000020\n#define ARM_VMOV_A_D\t0x0e100b10\n#define ARM_VMOV_D_A\t0x0e000b10\n\nstatic int\nencode_vfp_double(int mov, int inv, unsigned lo, unsigned hi)\n{\n    int\t\tcode, mode, imm, mask;\n\n    if (hi != lo) {\n\tif (mov && !inv) {\n\t    /* (I64)\n\t     *\taaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffgggggggghhhhhhhh\n\t     */\n\t    for (mode = 0, mask = 0xff; mode < 4; mask <<= 8, mode++) {\n\t\timm = lo & mask;\n\t\tif (imm != mask && imm != 0)\n\t\t    goto fail;\n\t\timm = hi & mask;\n\t\tif (imm != mask && imm != 0)\n\t\t    goto fail;\n\t    }\n\t    mode = 0xe20;\n\t    imm = (((hi & 0x80000000) >> 24) | ((hi & 0x00800000) >> 17) |\n\t\t   ((hi & 0x00008000) >> 10) | ((hi & 0x00000080) >>  3) |\n\t\t   ((lo & 0x80000000) >> 28) | ((lo & 0x00800000) >> 21) |\n\t\t   ((lo & 0x00008000) >> 14) | ((lo & 0x00000080) >>  7));\n\t    goto success;\n\t}\n\tgoto fail;\n    }\n    /*  (I32)\n     *  00000000 00000000 00000000 abcdefgh\n     *  00000000 00000000 abcdefgh 00000000\n     *  00000000 abcdefgh 00000000 00000000\n     *  abcdefgh 00000000 00000000 00000000 */\n    for (mode = 0, mask = 0xff; mode < 4; mask <<= 8, mode++) {\n\tif ((lo & mask) == lo) {\n\t    imm = lo >> (mode << 3);\n\t    mode <<= 9;\n\t    goto success;\n\t}\n    }\n    /*  (I16)\n     *  00000000 abcdefgh 00000000 abcdefgh\n     *  abcdefgh 00000000 abcdefgh 00000000 */\n    for (mode = 0, mask = 0xff; mode < 2; mask <<= 8, mode++) {\n\tif ((lo & mask) && ((lo & (mask << 16)) >> 16) == (lo & mask)) {\n\t    imm = lo >> (mode << 3);\n\t    mode = 0x800 | (mode << 9);\n\t    goto success;\n\t}\n    }\n    if (mov) {\n\t/*  (I32)\n\t *  00000000 00000000 abcdefgh 11111111\n\t *  00000000 abcdefgh 11111111 11111111 */\n\tfor (mode = 0, mask = 0xff; mode < 2;\n\t     mask = (mask << 8) | 0xff, mode++) {\n\t    if ((lo & mask) == mask &&\n\t\t!((lo & ~mask) >> 8) &&\n\t\t(imm = lo >> (8 + (mode << 8)))) {\n\t\tmode = 0xc00 | (mode << 8);\n\t\tgoto success;\n\t    }\n\t}\n\tif (!inv) {\n\t    /* (F32)\n\t     *  aBbbbbbc defgh000 00000000 00000000\n\t     *  from the ARM Architecture Reference Manual:\n\t     *  In this entry, B = NOT(b). The bit pattern represents the\n\t     *  floating-point number (-1)^s* 2^exp * mantissa, where\n\t     *  S = UInt(a),\n\t     *  exp = UInt(NOT(b):c:d)-3 and\n\t     *  mantissa = (16+UInt(e:f:g:h))/16. */\n\t    if ((lo & 0x7ffff) == 0 &&\n\t\t(((lo & 0x7e000000) == 0x3e000000) ||\n\t\t ((lo & 0x7e000000) == 0x40000000))) {\n\t\tmode = 0xf00;\n\t\timm = ((lo >> 24) & 0x80) | ((lo >> 19) & 0x7f);\n\t\tgoto success;\n\t    }\n\t}\n    }\n\nfail:\n    /* need another approach (load from memory, move from arm register, etc) */\n    return (-1);\n\nsuccess:\n    code = inv ? ARM_VMVNI : ARM_VMOVI;\n    switch ((mode & 0xf00) >> 8) {\n\tcase 0x0:\tcase 0x2:\tcase 0x4:\tcase 0x6:\n\tcase 0x8:\tcase 0xa:\n\t    if (inv)\tmode |= 0x20;\n\t    if (!mov)\tmode |= 0x100;\n\t    break;\n\tcase 0x1:\tcase 0x3:\tcase 0x5:\tcase 0x7:\n\t    /* should actually not reach here */\n\t    assert(!inv);\n\tcase 0x9:\tcase 0xb:\n\t    assert(!mov);\n\t    break;\n\tcase 0xc:\tcase 0xd:\n\t    /* should actually not reach here */\n\t    assert(inv);\n\tcase 0xe:\n\t    assert(mode & 0x20);\n\t    assert(mov && !inv);\n\t    break;\n\tdefault:\n\t    assert(!(mode & 0x20));\n\t    break;\n    }\n    imm = ((imm & 0x80) << 17) | ((imm & 0x70) << 12) | (imm & 0x0f);\n    code |= mode | imm;\n    if (jit_thumb_p()) {\n\tif (code & 0x1000000)\n\t    code |= 0xff000000;\n\telse\n\t    code |= 0xef000000;\n    }\n    else\n\tcode |= ARM_CC_NV;\n    return (code);\n}\n\n#define arm_vodi(oi,r0)\t\t_arm_vodi(_jit,oi,r0)\n__jit_inline void\n_arm_vodi(jit_state_t _jit, int oi, int r0)\n{\n    jit_thumb_t\tthumb;\n    assert(!(oi  & 0x0000f000));\n    assert(!(r0 & 1));\tr0 >>= 1;\n    thumb.i = oi|(_u4(r0)<<12);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_voqi(oi,r0)\t\t_arm_voqi(_jit,oi,r0)\n__jit_inline void\n_arm_voqi(jit_state_t _jit, int oi, int r0)\n{\n    jit_thumb_t\tthumb;\n    assert(!(oi  & 0x0000f000));\n    assert(!(r0 & 3));\tr0 >>= 1;\n    thumb.i = oi|(_u4(r0)<<12);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vo_ss(o,r0,r1)\t _arm_cc_vo_ss(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vo_ss(cc,o,r0,r1) _arm_cc_vo_ss(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vo_ss(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    if (r0 & 1)\to |= ARM_V_D;\tr0 >>= 1;\n    if (r1 & 1)\to |= ARM_V_M;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r0)<<12)|_u4(r1);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vo_dd(o,r0,r1)\t _arm_cc_vo_dd(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vo_dd(cc,o,r0,r1) _arm_cc_vo_dd(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vo_dd(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    assert(!(r0 & 1) && !(r1 & 1));\n    r0 >>= 1;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r0)<<12)|_u4(r1);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vo_qd(o,r0,r1)\t _arm_cc_vo_qd(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vo_qd(cc,o,r0,r1) _arm_cc_vo_qd(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vo_qd(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    assert(!(r0 & 3) && !(r1 & 1));\n    r0 >>= 1;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r0)<<12)|_u4(r1);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vo_qq(o,r0,r1)\t _arm_cc_vo_qq(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vo_qq(cc,o,r0,r1) _arm_cc_vo_qq(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vo_qq(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    assert(!(r0 & 3) && !(r1 & 3));\n    r0 >>= 1;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r0)<<12)|_u4(r1);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vorr_(o,r0,r1)\t _arm_cc_vorr_(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vorr_(cc,o,r0,r1) _arm_cc_vorr_(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vorr_(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vors_(o,r0,r1)\t _arm_cc_vors_(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vors_(cc,o,r0,r1) _arm_cc_vors_(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vors_(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    if (r1 & 1)\to |= ARM_V_N;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vorv_(o,r0,r1)\t _arm_cc_vorv_(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vorv_(cc,o,r0,r1) _arm_cc_vorv_(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vorv_(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    if (r1 & 1)\tcc |= ARM_V_M;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vori_(o,r0,r1)\t _arm_cc_vori_(_jit,ARM_CC_NV,o,r0,r1)\n#define arm_cc_vori_(cc,o,r0,r1) _arm_cc_vori_(_jit,cc,o,r0,r1)\n__jit_inline void\n_arm_cc_vori_(jit_state_t _jit, int cc, int o, int r0, int r1)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    /* use same bit pattern, to set opc1... */\n    if (r1 & 1)\to |= ARM_V_I32;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vorrd(o,r0,r1,r2)\t    _arm_cc_vorrd(_jit,ARM_CC_NV,o,r0,r1,r2)\n#define arm_cc_vorrd(cc,o,r0,r1,r2) _arm_cc_vorrd(_jit,cc,o,r0,r1,r2)\n__jit_inline void\n_arm_cc_vorrd(jit_state_t _jit, int cc, int o, int r0, int r1, int r2)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff00f));\n    assert(!(r2 & 1));\n    r2 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12)|_u4(r2);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_vosss(o,r0,r1,r2)\t    _arm_cc_vosss(_jit,ARM_CC_NV,o,r0,r1,r2)\n#define arm_cc_vosss(cc,o,r0,r1,r2) _arm_cc_vosss(_jit,cc,o,r0,r1,r2)\n__jit_inline void\n_arm_cc_vosss(jit_state_t _jit, int cc, int o, int r0, int r1, int r2)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff00f));\n    if (r0 & 1)\to |= ARM_V_D;\tr0 >>= 1;\n    if (r1 & 1)\to |= ARM_V_N;\tr1 >>= 1;\n    if (r2 & 1)\to |= ARM_V_M;\tr2 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12)|_u4(r2);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_voddd(o,r0,r1,r2)\t    _arm_cc_voddd(_jit,ARM_CC_NV,o,r0,r1,r2)\n#define arm_cc_voddd(cc,o,r0,r1,r2) _arm_cc_voddd(_jit,cc,o,r0,r1,r2)\n__jit_inline void\n_arm_cc_voddd(jit_state_t _jit, int cc, int o, int r0, int r1, int r2)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff00f));\n    assert(!(r0 & 1) && !(r1 & 1) && !(r2 & 1));\n    r0 >>= 1;\tr1 >>= 1;\tr2 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12)|_u4(r2);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_voqdd(o,r0,r1,r2)\t    _arm_cc_voqdd(_jit,ARM_CC_NV,o,r0,r1,r2)\n#define arm_cc_voqdd(cc,o,r0,r1,r2) _arm_cc_voqdd(_jit,cc,o,r0,r1,r2)\n__jit_inline void\n_arm_cc_voqdd(jit_state_t _jit, int cc, int o, int r0, int r1, int r2)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff00f));\n    assert(!(r0 & 3) && !(r1 & 1) && !(r2 & 1));\n    r0 >>= 1;\tr1 >>= 1;\tr2 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12)|_u4(r2);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_voqqd(o,r0,r1,r2)\t    _arm_cc_voqqd(_jit,ARM_CC_NV,o,r0,r1,r2)\n#define arm_cc_voqqd(cc,o,r0,r1,r2) _arm_cc_voqqd(_jit,cc,o,r0,r1,r2)\n__jit_inline void\n_arm_cc_voqqd(jit_state_t _jit, int cc, int o, int r0, int r1, int r2)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff00f));\n    assert(!(r0 & 3) && !(r1 & 3) && !(r2 & 1));\n    r0 >>= 1;\tr1 >>= 1;\tr2 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12)|_u4(r2);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_voqqq(o,r0,r1,r2)\t    _arm_cc_voqqq(_jit,ARM_CC_NV,o,r0,r1,r2)\n#define arm_cc_voqqq(cc,o,r0,r1,r2) _arm_cc_voqqq(_jit,cc,o,r0,r1,r2)\n__jit_inline void\n_arm_cc_voqqq(jit_state_t _jit, int cc, int o, int r0, int r1, int r2)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff00f));\n    assert(!(r0 & 3) && !(r1 & 3) && !(r2 & 3));\n    r0 >>= 1;\tr1 >>= 1;\tr2 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12)|_u4(r2);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_cc_vldst(cc,o,r0,r1,i0) _arm_cc_vldst(_jit,cc,o,r0,r1,i0)\n__jit_inline void\n_arm_cc_vldst(jit_state_t _jit, int cc, int o, int r0, int r1, int i0)\n{\n    jit_thumb_t\tthumb;\n    /* i0 << 2 is byte offset */\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff0ff));\n    if (r0 & 1) {\n\tassert(!(o & ARM_V_F64));\n\to |= ARM_V_D;\n    }\n    r0 >>= 1;\n    thumb.i = cc|o|(_u4(r1)<<16)|(_u4(r0)<<12)|_u8(i0);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n#define arm_cc_vorsl(cc,o,r0,r1,i0) _arm_cc_vorsl(_jit,cc,o,r0,r1,i0)\n__jit_inline void\n_arm_cc_vorsl(jit_state_t _jit, int cc, int o, int r0, int r1, int i0)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff0ff));\n    /* save i0 double precision registers */\n    if (o & ARM_V_F64)\t\ti0 <<= 1;\n    assert(i0 && !(i0 & 1) && r1 + i0 <= 32);\n    /* if (r1 & 1) cc & ARM_V_F64 must be false */\n    if (r1 & 1)\to |= ARM_V_D;\tr1 >>= 1;\n    thumb.i = cc|o|(_u4(r0)<<16)|(_u4(r1)<<12)|_u8(i0);\n    if (jit_thumb_p())\n\t_jit_WW(thumb.s[0], thumb.s[1]);\n    else\n\t_jit_I(thumb.i);\n}\n\n/***********************************************************************\n * VFPv2 and VFPv3 (encoding T2/A2) instructions\n ***********************************************************************/\n#define _CC_VADD_F32(cc,r0,r1,r2)\tarm_cc_vosss(cc,ARM_VADD_F,r0,r1,r2)\n#define _VADD_F32(r0,r1,r2)\t\t_CC_VADD_F32(ARM_CC_AL,r0,r1,r2)\n#define _CC_VADD_F64(cc,r0,r1,r2)\tarm_cc_voddd(cc,ARM_VADD_F|ARM_V_F64,r0,r1,r2)\n#define _VADD_F64(r0,r1,r2)\t\t_CC_VADD_F64(ARM_CC_AL,r0,r1,r2)\n#define _CC_VSUB_F32(cc,r0,r1,r2)\tarm_cc_vosss(cc,ARM_VSUB_F,r0,r1,r2)\n#define _VSUB_F32(r0,r1,r2)\t\t_CC_VSUB_F32(ARM_CC_AL,r0,r1,r2)\n#define _CC_VSUB_F64(cc,r0,r1,r2)\tarm_cc_voddd(cc,ARM_VSUB_F|ARM_V_F64,r0,r1,r2)\n#define _VSUB_F64(r0,r1,r2)\t\t_CC_VSUB_F64(ARM_CC_AL,r0,r1,r2)\n#define _CC_VMUL_F32(cc,r0,r1,r2)\tarm_cc_vosss(cc,ARM_VMUL_F,r0,r1,r2)\n#define _VMUL_F32(r0,r1,r2)\t\t_CC_VMUL_F32(ARM_CC_AL,r0,r1,r2)\n#define _CC_VMUL_F64(cc,r0,r1,r2)\tarm_cc_voddd(cc,ARM_VMUL_F|ARM_V_F64,r0,r1,r2)\n#define _VMUL_F64(r0,r1,r2)\t\t_CC_VMUL_F64(ARM_CC_AL,r0,r1,r2)\n#define _CC_VDIV_F32(cc,r0,r1,r2)\tarm_cc_vosss(cc,ARM_VDIV_F,r0,r1,r2)\n#define _VDIV_F32(r0,r1,r2)\t\t_CC_VDIV_F32(ARM_CC_AL,r0,r1,r2)\n#define _CC_VDIV_F64(cc,r0,r1,r2)\tarm_cc_voddd(cc,ARM_VDIV_F|ARM_V_F64,r0,r1,r2)\n#define _VDIV_F64(r0,r1,r2)\t\t_CC_VDIV_F64(ARM_CC_AL,r0,r1,r2)\n#define _CC_VABS_F32(cc,r0,r1)\t\tarm_cc_vo_ss(cc,ARM_VABS_F,r0,r1)\n#define _VABS_F32(r0,r1)\t\t_CC_VABS_F32(ARM_CC_AL,r0,r1)\n#define _CC_VABS_F64(cc,r0,r1)\t\tarm_cc_vo_dd(cc,ARM_VABS_F|ARM_V_F64,r0,r1)\n#define _VABS_F64(r0,r1)\t\t_CC_VABS_F64(ARM_CC_AL,r0,r1)\n#define _CC_VNEG_F32(cc,r0,r1)\t\tarm_cc_vo_ss(cc,ARM_VNEG_F,r0,r1)\n#define _VNEG_F32(r0,r1)\t\t_CC_VNEG_F32(ARM_CC_AL,r0,r1)\n#define _CC_VNEG_F64(cc,r0,r1)\t\tarm_cc_vo_dd(cc,ARM_VNEG_F|ARM_V_F64,r0,r1)\n#define _VNEG_F64(r0,r1)\t\t_CC_VNEG_F64(ARM_CC_AL,r0,r1)\n#define _CC_VSQRT_F32(cc,r0,r1)\t\tarm_cc_vo_ss(cc,ARM_VSQRT_F,r0,r1)\n#define _VSQRT_F32(r0,r1)\t\t_CC_VSQRT_F32(ARM_CC_AL,r0,r1)\n#define _CC_VSQRT_F64(cc,r0,r1)\t\tarm_cc_vo_dd(cc,ARM_VSQRT_F|ARM_V_F64,r0,r1)\n#define _VSQRT_F64(r0,r1)\t\t_CC_VSQRT_F64(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_F32(cc,r0,r1)\t\tarm_cc_vo_ss(cc,ARM_VMOV_F,r0,r1)\n#define _VMOV_F32(r0,r1)\t\t_CC_VMOV_F32(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_F64(cc,r0,r1)\t\tarm_cc_vo_dd(cc,ARM_VMOV_F|ARM_V_F64,r0,r1)\n#define _VMOV_F64(r0,r1)\t\t_CC_VMOV_F64(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_AA_D(cc,r0,r1,r2)\tarm_cc_vorrd(cc,ARM_VMOV_AA_D,r0,r1,r2)\n#define _VMOV_AA_D(r0,r1,r2)\t\t_CC_VMOV_AA_D(ARM_CC_AL,r0,r1,r2)\n#define _CC_VMOV_D_AA(cc,r0,r1,r2)\tarm_cc_vorrd(cc,ARM_VMOV_D_AA,r1,r2,r0)\n#define _VMOV_D_AA(r0,r1,r2)\t\t_CC_VMOV_D_AA(ARM_CC_AL,r0,r1,r2)\n#define _CC_VMOV_A_S(cc,r0,r1)\t\tarm_cc_vors_(cc,ARM_VMOV_A_S,r0,r1)\n#define _VMOV_A_S(r0,r1)\t\t_CC_VMOV_A_S(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_S_A(cc,r0,r1)\t\tarm_cc_vors_(cc,ARM_VMOV_S_A,r1,r0)\n#define _VMOV_S_A(r0,r1)\t\t_CC_VMOV_S_A(ARM_CC_AL,r0,r1)\n#define _CC_VCMP_F32(cc,r0,r1)\t\tarm_cc_vo_ss(cc,ARM_VCMP,r0,r1)\n#define _VCMP_F32(r0,r1)\t\t_CC_VCMP_F32(ARM_CC_AL,r0,r1)\n#define _CC_VCMP_F64(cc,r0,r1)\t\tarm_cc_vo_dd(cc,ARM_VCMP|ARM_V_F64,r0,r1)\n#define _VCMP_F64(r0,r1)\t\t_CC_VCMP_F64(ARM_CC_AL,r0,r1)\n#define _CC_VCMPE_F32(cc,r0,r1)\t\tarm_cc_vo_ss(cc,ARM_VCMP|ARM_V_E,r0,r1)\n#define _VCMPE_F32(r0,r1)\t\t_CC_VCMPE_F32(ARM_CC_AL,r0,r1)\n#define _CC_VCMPE_F64(cc,r0,r1)\t\tarm_cc_vo_dd(cc,ARM_VCMP|ARM_V_E|ARM_V_F64,r0,r1)\n#define _VCMPE_F64(r0,r1)\t\t_CC_VCMPE_F64(ARM_CC_AL,r0,r1)\n#define _CC_VCMPZ_F32(cc,r0)\t\tarm_cc_vo_ss(cc,ARM_VCMP|ARM_V_Z,r0,0)\n#define _VCMPZ_F32(r0)\t\t\t_CC_VCMPZ_F32(ARM_CC_AL,r0)\n#define _CC_VCMPZ_F64(cc,r0)\t\tarm_cc_vo_dd(cc,ARM_VCMP|ARM_V_Z|ARM_V_F64,r0,0)\n#define _VCMPZ_F64(r0)\t\t\t_CC_VCMPZ_F64(ARM_CC_AL,r0)\n#define _CC_VCMPEZ_F32(cc,r0)\t\tarm_cc_vo_ss(cc,ARM_VCMP|ARM_V_Z|ARM_V_E,r0,0)\n#define _VCMPEZ_F32(r0)\t\t\t_CC_VCMPEZ_F32(ARM_CC_AL,r0)\n#define _CC_VCMPEZ_F64(cc,r0)\t\tarm_cc_vo_dd(cc,ARM_VCMP|ARM_V_Z|ARM_V_E|ARM_V_F64,r0,0)\n#define _VCMPEZ_F64(r0)\t\t\t_CC_VCMPEZ_F64(ARM_CC_AL,r0)\n#define _CC_VMRS(cc,r0)\t\t\tarm_cc_vorr_(cc,ARM_VMRS,r0,0)\n#define _VMRS(r0)\t\t\t_CC_VMRS(ARM_CC_AL,r0)\n#define _CC_VMSR(cc,r0)\t\t\tarm_cc_vorr_(cc,ARM_VMSR,r0,0)\n#define _VMSR(r0)\t\t\t_CC_VMSR(ARM_CC_AL,r0)\n#define _CC_VCVT_S32_F32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_S32_F32,r0,r1)\n#define _VCVT_S32_F32(r0,r1)\t\t_CC_VCVT_S32_F32(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_U32_F32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_U32_F32,r0,r1)\n#define _VCVT_U32_F32(r0,r1)\t\t_CC_VCVT_U32_F32(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_S32_F64(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_S32_F64,r0,r1)\n#define _VCVT_S32_F64(r0,r1)\t\t_CC_VCVT_S32_F64(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_U32_F64(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_U32_F64,r0,r1)\n#define _VCVT_U32_F64(r0,r1)\t\t_CC_VCVT_U32_F64(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_F32_S32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_F32_S32,r0,r1)\n#define _VCVT_F32_S32(r0,r1)\t\t_CC_VCVT_F32_S32(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_F32_U32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_F32_U32,r0,r1)\n#define _VCVT_F32_U32(r0,r1)\t\t_CC_VCVT_F32_U32(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_F64_S32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_F64_S32,r0,r1)\n#define _VCVT_F64_S32(r0,r1)\t\t_CC_VCVT_F64_S32(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_F64_U32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_F64_U32,r0,r1)\n#define _VCVT_F64_U32(r0,r1)\t\t_CC_VCVT_F64_U32(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_F32_F64(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_F32_F64,r0,r1)\n#define _VCVT_F32_F64(r0,r1)\t\t_CC_VCVT_F32_F64(ARM_CC_AL,r0,r1)\n#define _CC_VCVT_F64_F32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVT_F64_F32,r0,r1)\n#define _VCVT_F64_F32(r0,r1)\t\t_CC_VCVT_F64_F32(ARM_CC_AL,r0,r1)\n/* use rounding mode in fpscr (intended for floor, ceil, etc) */\n#define _CC_VCVTR_S32_F32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVTR_S32_F32,r0,r1)\n#define _VCVTR_S32_F32(r0,r1)\t\t_CC_VCVTR_S32_F32(ARM_CC_AL,r0,r1)\n#define _CC_VCVTR_U32_F32(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVTR_U32_F32,r0,r1)\n#define _VCVTR_U32_F32(r0,r1)\t\t_CC_VCVTR_U32_F32(ARM_CC_AL,r0,r1)\n#define _CC_VCVTR_S32_F64(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVTR_S32_F64,r0,r1)\n#define _VCVTR_S32_F64(r0,r1)\t\t_CC_VCVTR_S32_F64(ARM_CC_AL,r0,r1)\n#define _CC_VCVTR_U32_F64(cc,r0,r1)\tarm_cc_vo_ss(cc,ARM_VCVTR_U32_F64,r0,r1)\n#define _VCVTR_U32_F64(r0,r1)\t\t_CC_VCVTR_U32_F64(ARM_CC_AL,r0,r1)\n/***********************************************************************\n * NEON instructions (encoding T1/A1) (condition must always be ARM_CC_NV)\n ***********************************************************************/\n#define _CC_VLDMIA_F32(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_L|ARM_M_I,r0,r1,i0)\n#define _VLDMIA_F32(r0,r1,i0)\t\t_CC_VLDMIA_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDMIA_F64(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_L|ARM_M_I|ARM_V_F64,r0,r1,i0)\n#define _VLDMIA_F64(r0,r1,i0)\t\t_CC_VLDMIA_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTMIA_F32(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_I,r0,r1,i0)\n#define _VSTMIA_F32(r0,r1,i0)\t\t_CC_VSTMIA_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTMIA_F64(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_I|ARM_V_F64,r0,r1,i0)\n#define _VSTMIA_F64(r0,r1,i0)\t\t_CC_VSTMIA_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDMIA_U_F32(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_L|ARM_M_I|ARM_M_U,r0,r1,i0)\n#define _VLDMIA_U_F32(r0,r1,i0)\t\t_CC_VLDMIA_U_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDMIA_U_F64(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_L|ARM_M_I|ARM_M_U|ARM_V_F64,r0,r1,i0)\n#define _VLDMIA_U_F64(r0,r1,i0)\t\t_CC_VLDMIA_U_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTMIA_U_F32(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_I|ARM_M_U,r0,r1,i0)\n#define _VSTMIA_U_F32(r0,r1,i0)\t\t_CC_VSTMIA_U_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTMIA_U_F64(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_I|ARM_M_U|ARM_V_F64,r0,r1,i0)\n#define _VSTMIA_U_F64(r0,r1,i0)\t\t_CC_VSTMIA_U_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDMDB_U_F32(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_L|ARM_M_B|ARM_M_U,r0,r1,i0)\n#define _VLDMDB_U_F32(r0,r1,i0)\t\t_CC_VLDMDB_U_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDMDB_U_F64(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_L|ARM_M_B|ARM_M_U|ARM_V_F64,r0,r1,i0)\n#define _VLDMDB_U_F64(r0,r1,i0)\t\t_CC_VLDMDB_U_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTMDB_U_F32(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_B|ARM_M_U,r0,r1,i0)\n#define _VSTMDB_U_F32(r0,r1,i0)\t\t_CC_VSTMDB_U_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTMDB_U_F64(cc,r0,r1,i0)\tarm_cc_vorsl(cc,ARM_VM|ARM_M_B|ARM_M_U|ARM_V_F64,r0,r1,i0)\n#define _VSTMDB_U_F64(r0,r1,i0)\t\t_CC_VSTMDB_U_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VPUSH_F32(cc,r0,i0)\t\t_CC_VSTMDB_U_F32(cc,JIT_SP,r0,i0)\n#define _VPUSH_F32(r0,i0)\t\t_CC_VPUSH_F32(ARM_CC_AL,r0,i0)\n#define _CC_VPUSH_F64(cc,r0,i0)\t\t_CC_VSTMDB_U_F64(cc,JIT_SP,r0,i0)\n#define _VPUSH_F64(r0,i0)\t\t_CC_VPUSH_F64(ARM_CC_AL,r0,i0)\n#define _CC_VPOP_F32(cc,r0,i0)\t\t_CC_VLDMIA_U_F32(cc,JIT_SP,r0,i0)\n#define _VPOP_F32(r0,i0)\t\t_CC_VPOP_F32(ARM_CC_AL,r0,i0)\n#define _CC_VPOP_F64(cc,r0,i0)\t\t_CC_VLDMIA_U_F64(cc,JIT_SP,r0,i0)\n#define _VPOP_F64(r0,i0)\t\t_CC_VPOP_F64(ARM_CC_AL,r0,i0)\n/***********************************************************************\n * Advanced SIMD (encoding T2/A2) instructions\n ***********************************************************************/\n#define _CC_VMOV_A_S8(cc,r0,r1)\t\tarm_cc_vorv_(cc,ARM_VMOV_A_D|ARM_VMOV_ADV_8,r0,r1)\n#define _VMOV_A_S8(r0,r1)\t\t_CC_VMOV_A_S8(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_A_U8(cc,r0,r1)\t\tarm_cc_vorv_(cc,ARM_VMOV_A_D|ARM_VMOV_ADV_8|ARM_VMOV_ADV_U,r0,r1)\n#define _VMOV_A_U8(r0,r1)\t\t_CC_VMOV_A_U8(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_A_S16(cc,r0,r1)\tarm_cc_vorv_(cc,ARM_VMOV_A_D|ARM_VMOV_ADV_16,r0,r1)\n#define _VMOV_A_S16(r0,r1)\t\t_CC_VMOV_A_S16(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_A_U16(cc,r0,r1)\tarm_cc_vorv_(cc,ARM_VMOV_A_D|ARM_VMOV_ADV_16|ARM_VMOV_ADV_U,r0,r1)\n#define _VMOV_A_U16(r0,r1)\t\t_CC_VMOV_A_U16(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_A_S32(cc,r0,r1)\tarm_cc_vori_(cc,ARM_VMOV_A_D,r0,r1)\n#define _VMOV_A_S32(r0,r1)\t\t_CC_VMOV_A_S32(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_A_U32(cc,r0,r1)\tarm_cc_vori_(cc,ARM_VMOV_A_D|ARM_VMOV_ADV_U,r0,r1)\n#define _VMOV_A_U32(r0,r1)\t\t_CC_VMOV_A_U32(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_V_I8(cc,r0,r1)\t\tarm_cc_vorv_(cc,ARM_VMOV_D_A|ARM_VMOV_ADV_8,r1,r0)\n#define _VMOV_V_I8(r0,r1)\t\t_CC_VMOV_V_I8(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_V_I16(cc,r0,r1)\tarm_cc_vorv_(cc,ARM_VMOV_D_A|ARM_VMOV_ADV_16,r1,r0)\n#define _VMOV_V_I16(r0,r1)\t\t_CC_VMOV_V_I16(ARM_CC_AL,r0,r1)\n#define _CC_VMOV_V_I32(cc,r0,r1)\tarm_cc_vori_(cc,ARM_VMOV_D_A,r1,r0)\n#define _VMOV_V_I32(r0,r1)\t\t_CC_VMOV_V_I32(ARM_CC_AL,r0,r1)\n#define _VADD_I8(r0,r1,r2)\t\tarm_voddd(ARM_VADD_I,r0,r1,r2)\n#define _VADDQ_I8(r0,r1,r2)\t\tarm_voqqq(ARM_VADD_I|ARM_V_Q,r0,r1,r2)\n#define _VADD_I16(r0,r1,r2)\t\tarm_voddd(ARM_VADD_I|ARM_V_I16,r0,r1,r2)\n#define _VADDQ_I16(r0,r1,r2)\t\tarm_voqqq(ARM_VADD_I|ARM_V_I16|ARM_V_Q,r0,r1,r2)\n#define _VADD_I32(r0,r1,r2)\t\tarm_voddd(ARM_VADD_I|ARM_V_I32,r0,r1,r2)\n#define _VADDQ_I32(r0,r1,r2)\t\tarm_voqqq(ARM_VADD_I|ARM_V_I32|ARM_V_Q,r0,r1,r2)\n#define _VADD_I64(r0,r1,r2)\t\tarm_voddd(ARM_VADD_I|ARM_V_I64,r0,r1,r2)\n#define _VADDQ_I64(r0,r1,r2)\t\tarm_voqqq(ARM_VADD_I|ARM_V_I64|ARM_V_Q,r0,r1,r2)\n#define _VQADD_S8(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I,r0,r1,r2)\n#define _VQADDQ_S8(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_Q,r0,r1,r2)\n#define _VQADD_U8(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I|ARM_V_U,r0,r1,r2)\n#define _VQADDQ_U8(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VQADD_S16(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I|ARM_V_I16,r0,r1,r2)\n#define _VQADDQ_S16(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_I16|ARM_V_Q,r0,r1,r2)\n#define _VQADD_U16(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I|ARM_V_I16|ARM_V_U,r0,r1,r2)\n#define _VQADDQ_U16(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_I16|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VQADD_S32(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I|ARM_V_I32,r0,r1,r2)\n#define _VQADDQ_S32(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_I32|ARM_V_Q,r0,r1,r2)\n#define _VQADD_U32(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I|ARM_V_I32|ARM_V_U,r0,r1,r2)\n#define _VQADDQ_U32(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_I32|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VQADD_S64(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I|ARM_V_I64,r0,r1,r2)\n#define _VQADDQ_S64(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_I64|ARM_V_Q,r0,r1,r2)\n#define _VQADD_U64(r0,r1,r2)\t\tarm_voddd(ARM_VQADD_I|ARM_V_I64|ARM_V_U,r0,r1,r2)\n#define _VQADDQ_U64(r0,r1,r2)\t\tarm_voqqq(ARM_VQADD_I|ARM_V_I64|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VADDL_S8(r0,r1,r2)\t\tarm_voqdd(ARM_VADDL_I,r0,r1,r2)\n#define _VADDL_U8(r0,r1,r2)\t\tarm_voqdd(ARM_VADDL_I|ARM_V_U,r0,r1,r2)\n#define _VADDL_S16(r0,r1,r2)\t\tarm_voqdd(ARM_VADDL_I|ARM_V_I16,r0,r1,r2)\n#define _VADDL_U16(r0,r1,r2)\t\tarm_voqdd(ARM_VADDL_I|ARM_V_I16|ARM_V_U,r0,r1,r2)\n#define _VADDL_S32(r0,r1,r2)\t\tarm_voqdd(ARM_VADDL_I|ARM_V_I32,r0,r1,r2)\n#define _VADDL_U32(r0,r1,r2)\t\tarm_voqdd(ARM_VADDL_I|ARM_V_I32|ARM_V_U,r0,r1,r2)\n#define _VADDW_S8(r0,r1,r2)\t\tarm_voqqd(ARM_VADDW_I,r0,r1,r2)\n#define _VADDW_U8(r0,r1,r2)\t\tarm_voqqd(ARM_VADDW_I|ARM_V_U,r0,r1,r2)\n#define _VADDW_S16(r0,r1,r2)\t\tarm_voqqd(ARM_VADDW_I|ARM_V_I16,r0,r1,r2)\n#define _VADDW_U16(r0,r1,r2)\t\tarm_voqqd(ARM_VADDW_I|ARM_V_I16|ARM_V_U,r0,r1,r2)\n#define _VADDW_S32(r0,r1,r2)\t\tarm_voqqd(ARM_VADDW_I|ARM_V_I32,r0,r1,r2)\n#define _VADDW_U32(r0,r1,r2)\t\tarm_voqqd(ARM_VADDW_I|ARM_V_I32|ARM_V_U,r0,r1,r2)\n#define _VSUB_I8(r0,r1,r2)\t\tarm_voddd(ARM_VSUB_I,r0,r1,r2)\n#define _VSUBQ_I8(r0,r1,r2)\t\tarm_voqqq(ARM_VSUB_I|ARM_V_Q,r0,r1,r2)\n#define _VSUB_I16(r0,r1,r2)\t\tarm_voddd(ARM_VSUB_I|ARM_V_I16,r0,r1,r2)\n#define _VSUBQ_I16(r0,r1,r2)\t\tarm_voqqq(ARM_VSUB_I|ARM_V_I16|ARM_V_Q,r0,r1,r2)\n#define _VSUB_I32(r0,r1,r2)\t\tarm_voddd(ARM_VSUB_I|ARM_V_I32,r0,r1,r2)\n#define _VSUBQ_I32(r0,r1,r2)\t\tarm_voqqq(ARM_VSUB_I|ARM_V_I32|ARM_V_Q,r0,r1,r2)\n#define _VSUB_I64(r0,r1,r2)\t\tarm_voddd(ARM_VSUB_I|ARM_V_I64,r0,r1,r2)\n#define _VSUBQ_I64(r0,r1,r2)\t\tarm_voqqq(ARM_VSUB_I|ARM_V_I64|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_S8(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I,r0,r1,r2)\n#define _VQSUBQ_S8(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_U8(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I|ARM_V_U,r0,r1,r2)\n#define _VQSUBQ_U8(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_S16(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I|ARM_V_I16,r0,r1,r2)\n#define _VQSUBQ_S16(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_I16|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_U16(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I|ARM_V_I16|ARM_V_U,r0,r1,r2)\n#define _VQSUBQ_U16(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_I16|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_S32(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I|ARM_V_I32,r0,r1,r2)\n#define _VQSUBQ_S32(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_I32|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_U32(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I|ARM_V_I32|ARM_V_U,r0,r1,r2)\n#define _VQSUBQ_U32(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_I32|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_S64(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I|ARM_V_I64,r0,r1,r2)\n#define _VQSUBQ_S64(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_I64|ARM_V_Q,r0,r1,r2)\n#define _VQSUB_U64(r0,r1,r2)\t\tarm_voddd(ARM_VQSUB_I|ARM_V_I64|ARM_V_U,r0,r1,r2)\n#define _VQSUBQ_U64(r0,r1,r2)\t\tarm_voqqq(ARM_VQSUB_I|ARM_V_I64|ARM_V_U|ARM_V_Q,r0,r1,r2)\n#define _VSUBL_S8(r0,r1,r2)\t\tarm_voqdd(ARM_VSUBL_I,r0,r1,r2)\n#define _VSUBL_U8(r0,r1,r2)\t\tarm_voqdd(ARM_VSUBL_I|ARM_V_U,r0,r1,r2)\n#define _VSUBL_S16(r0,r1,r2)\t\tarm_voqdd(ARM_VSUBL_I|ARM_V_I16,r0,r1,r2)\n#define _VSUBL_U16(r0,r1,r2)\t\tarm_voqdd(ARM_VSUBL_I|ARM_V_I16|ARM_V_U,r0,r1,r2)\n#define _VSUBL_S32(r0,r1,r2)\t\tarm_voqdd(ARM_VSUBL_I|ARM_V_I32,r0,r1,r2)\n#define _VSUBL_U32(r0,r1,r2)\t\tarm_voqdd(ARM_VSUBL_I|ARM_V_I32|ARM_V_U,r0,r1,r2)\n#define _VSUBW_S8(r0,r1,r2)\t\tarm_voqqd(ARM_VSUBW_I,r0,r1,r2)\n#define _VSUBW_U8(r0,r1,r2)\t\tarm_voqqd(ARM_VSUBW_I|ARM_V_U,r0,r1,r2)\n#define _VSUBW_S16(r0,r1,r2)\t\tarm_voqqd(ARM_VSUBW_I|ARM_V_I16,r0,r1,r2)\n#define _VSUBW_U16(r0,r1,r2)\t\tarm_voqqd(ARM_VSUBW_I|ARM_V_I16|ARM_V_U,r0,r1,r2)\n#define _VSUBW_S32(r0,r1,r2)\t\tarm_voqqd(ARM_VSUBW_I|ARM_V_I32,r0,r1,r2)\n#define _VSUBW_U32(r0,r1,r2)\t\tarm_voqqd(ARM_VSUBW_I|ARM_V_I32|ARM_V_U,r0,r1,r2)\n#define _VMUL_I8(r0,r1,r2)\t\tarm_voddd(ARM_VMUL_I,r0,r1,r2)\n#define _VMULQ_I8(r0,r1,r2)\t\tarm_voqqq(ARM_VMUL_I|ARM_V_Q,r0,r1,r2)\n#define _VMUL_I16(r0,r1,r2)\t\tarm_voddd(ARM_VMUL_I|ARM_V_I16,r0,r1,r2)\n#define _VMULQ_I16(r0,r1,r2)\t\tarm_voqqq(ARM_VMUL_I|ARM_V_Q|ARM_V_I16,r0,r1,r2)\n#define _VMUL_I32(r0,r1,r2)\t\tarm_voddd(ARM_VMUL_I|ARM_V_I32,r0,r1,r2)\n#define _VMULQ_I32(r0,r1,r2)\t\tarm_voqqq(ARM_VMUL_I|ARM_V_Q|ARM_V_I32,r0,r1,r2)\n#define _VMULL_S8(r0,r1,r2)\t\tarm_voqdd(ARM_VMULL_I,r0,r1,r2)\n#define _VMULL_U8(r0,r1,r2)\t\tarm_voqdd(ARM_VMULL_I|ARM_V_U,r0,r1,r2)\n#define _VMULL_S16(r0,r1,r2)\t\tarm_voqdd(ARM_VMULL_I|ARM_V_I16,r0,r1,r2)\n#define _VMULL_U16(r0,r1,r2)\t\tarm_voqdd(ARM_VMULL_I|ARM_V_U|ARM_V_I16,r0,r1,r2)\n#define _VMULL_S32(r0,r1,r2)\t\tarm_voqdd(ARM_VMULL_I|ARM_V_I32,r0,r1,r2)\n#define _VMULL_U32(r0,r1,r2)\t\tarm_voqdd(ARM_VMULL_I|ARM_V_U|ARM_V_I32,r0,r1,r2)\n#define _VABS_S8(r0,r1)\t\t\tarm_vo_dd(ARM_VABS_I,r0,r1)\n#define _VABSQ_S8(r0,r1)\t\tarm_vo_qq(ARM_VABS_I|ARM_V_Q,r0,r1)\n#define _VABS_S16(r0,r1)\t\tarm_vo_dd(ARM_VABS_I|ARM_V_S16,r0,r1)\n#define _VABSQ_S16(r0,r1)\t\tarm_vo_qq(ARM_VABS_I|ARM_V_S16|ARM_V_Q,r0,r1)\n#define _VABS_S32(r0,r1)\t\tarm_vo_dd(ARM_VABS_I|ARM_V_S32,r0,r1)\n#define _VABSQ_S32(r0,r1)\t\tarm_vo_qq(ARM_VABS_I|ARM_V_S32|ARM_V_Q,r0,r1)\n#define _VQABS_S8(r0,r1)\t\tarm_vo_dd(ARM_VQABS_I,r0,r1)\n#define _VQABSQ_S8(r0,r1)\t\tarm_vo_qq(ARM_VQABS_I|ARM_V_Q,r0,r1)\n#define _VQABS_S16(r0,r1)\t\tarm_vo_dd(ARM_VQABS_I|ARM_V_S16,r0,r1)\n#define _VQABSQ_S16(r0,r1)\t\tarm_vo_qq(ARM_VQABS_I|ARM_V_S16|ARM_V_Q,r0,r1)\n#define _VQABS_S32(r0,r1)\t\tarm_vo_dd(ARM_VQABS_I|ARM_V_S32,r0,r1)\n#define _VQABSQ_S32(r0,r1)\t\tarm_vo_qq(ARM_VQABS_I|ARM_V_S32|ARM_V_Q,r0,r1)\n#define _VNEG_S8(r0,r1)\t\t\tarm_vo_dd(ARM_VNEG_I,r0,r1)\n#define _VNEGQ_S8(r0,r1)\t\tarm_vo_qq(ARM_VNEG_I|ARM_V_Q,r0,r1)\n#define _VNEG_S16(r0,r1)\t\tarm_vo_dd(ARM_VNEG_I|ARM_V_S16,r0,r1)\n#define _VNEGQ_S16(r0,r1)\t\tarm_vo_qq(ARM_VNEG_I|ARM_V_S16|ARM_V_Q,r0,r1)\n#define _VNEG_S32(r0,r1)\t\tarm_vo_dd(ARM_VNEG_I|ARM_V_S32,r0,r1)\n#define _VNEGQ_S32(r0,r1)\t\tarm_vo_qq(ARM_VNEG_I|ARM_V_S32|ARM_V_Q,r0,r1)\n#define _VQNEG_S8(r0,r1)\t\tarm_vo_dd(ARM_VQNEG_I,r0,r1)\n#define _VQNEGQ_S8(r0,r1)\t\tarm_vo_qq(ARM_VQNEG_I|ARM_V_Q,r0,r1)\n#define _VQNEG_S16(r0,r1)\t\tarm_vo_dd(ARM_VQNEG_I|ARM_V_S16,r0,r1)\n#define _VQNEGQ_S16(r0,r1)\t\tarm_vo_qq(ARM_VQNEG_I|ARM_V_S16|ARM_V_Q,r0,r1)\n#define _VQNEG_S32(r0,r1)\t\tarm_vo_dd(ARM_VQNEG_I|ARM_V_S32,r0,r1)\n#define _VQNEGQ_S32(r0,r1)\t\tarm_vo_qq(ARM_VQNEG_I|ARM_V_S32|ARM_V_Q,r0,r1)\n#define _VAND(r0,r1,r2)\t\t\tarm_voddd(ARM_VAND,r0,r1,r2)\n#define _VANDQ(r0,r1,r2)\t\tarm_voqqq(ARM_VAND|ARM_V_Q,r0,r1,r2)\n#define _VBIC(r0,r1,r2)\t\t\tarm_voddd(ARM_VBIC,r0,r1,r2)\n#define _VBICQ(r0,r1,r2)\t\tarm_voqqq(ARM_VBIC|ARM_V_Q,r0,r1,r2)\n#define _VORR(r0,r1,r2)\t\t\tarm_voddd(ARM_VORR,r0,r1,r2)\n#define _VORRQ(r0,r1,r2)\t\tarm_voqqq(ARM_VORR|ARM_V_Q,r0,r1,r2)\n#define _VORN(r0,r1,r2)\t\t\tarm_voddd(ARM_VORN,r0,r1,r2)\n#define _VORNQ(r0,r1,r2)\t\tarm_voqqq(ARM_VORN|ARM_V_Q,r0,r1,r2)\n#define _VEOR(r0,r1,r2)\t\t\tarm_voddd(ARM_VEOR,r0,r1,r2)\n#define _VEORQ(r0,r1,r2)\t\tarm_voqqq(ARM_VEOR|ARM_V_Q,r0,r1,r2)\n#define _VMOV(r0,r1)\t\t\t_VORR(r0,r1,r1)\n#define _VMOVQ(r0,r1)\t\t\t_VORRQ(r0,r1,r1)\n#define _VMOVL_S8(r0,r1)\t\tarm_vo_qd(ARM_VMOVL_I|ARM_VMOVL_S8,r0,r1)\n#define _VMOVL_U8(r0,r1)\t\tarm_vo_qd(ARM_VMOVL_I|ARM_V_U|ARM_VMOVL_S8,r0,r1)\n#define _VMOVL_S16(r0,r1)\t\tarm_vo_qd(ARM_VMOVL_I|ARM_VMOVL_S16,r0,r1)\n#define _VMOVL_U16(r0,r1)\t\tarm_vo_qd(ARM_VMOVL_I|ARM_V_U|ARM_VMOVL_S16,r0,r1)\n#define _VMOVL_S32(r0,r1)\t\tarm_vo_qd(ARM_VMOVL_I|ARM_VMOVL_S32,r0,r1)\n#define _VMOVL_U32(r0,r1)\t\tarm_vo_qd(ARM_VMOVL_I|ARM_V_U|ARM_VMOVL_S32,r0,r1)\n/* \"oi\" should be the result of encode_vfp_double */\n#define _VIMM(oi,r0)\t\t\tarm_vodi(oi,r0)\n#define _VIMMQ(oi,r0)\t\t\tarm_voqi(oi|ARM_V_Q,r0)\n/* index is multipled by four */\n#define _CC_VLDRN_F32(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VLDR,r0,r1,i0)\n#define _VLDRN_F32(r0,r1,i0)\t\t_CC_VLDRN_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDR_F32(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VLDR|ARM_P,r0,r1,i0)\n#define _VLDR_F32(r0,r1,i0)\t\t_CC_VLDR_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDRN_F64(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VLDR|ARM_V_F64,r0,r1,i0)\n#define _VLDRN_F64(r0,r1,i0)\t\t_CC_VLDRN_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VLDR_F64(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VLDR|ARM_V_F64|ARM_P,r0,r1,i0)\n#define _VLDR_F64(r0,r1,i0)\t\t_CC_VLDR_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTRN_F32(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VSTR,r0,r1,i0)\n#define _VSTRN_F32(r0,r1,i0)\t\t_CC_VSTRN_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTR_F32(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VSTR|ARM_P,r0,r1,i0)\n#define _VSTR_F32(r0,r1,i0)\t\t_CC_VSTR_F32(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTRN_F64(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VSTR|ARM_V_F64,r0,r1,i0)\n#define _VSTRN_F64(r0,r1,i0)\t\t_CC_VSTRN_F64(ARM_CC_AL,r0,r1,i0)\n#define _CC_VSTR_F64(cc,r0,r1,i0)\tarm_cc_vldst(cc,ARM_VSTR|ARM_V_F64|ARM_P,r0,r1,i0)\n#define _VSTR_F64(r0,r1,i0)\t\t_CC_VSTR_F64(ARM_CC_AL,r0,r1,i0)\n\n/* from binutils */\n#define rotate_left(v, n)\t(v << n | v >> (32 - n))\nstatic int\nencode_arm_immediate(unsigned int v)\n{\n    unsigned int\ta, i;\n\n    for (i = 0; i < 32; i += 2)\n\tif ((a = rotate_left(v, i)) <= 0xff)\n\t    return (a | (i << 7));\n\n    return (-1);\n}\n\n#define corrr(cc,o,rn,rd,rm)\t\t_corrr(_jit,cc,o,rn,rd,rm)\n__jit_inline void\n_corrr(jit_state_t _jit, int cc, int o, int rn, int rd, int rm)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o & 0xf00fff0f));\n    _jit_I(cc|o|(_u4(rn)<<16)|(_u4(rd)<<12)|_u4(rm));\n}\n\n#define corri(cc,o,rn,rd,im)\t\t_corri(_jit,cc,o,rn,rd,im)\n__jit_inline void\n_corri(jit_state_t _jit, int cc, int o, int rn, int rd, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00fffff));\n    assert(!(im & 0xfffff000));\n    _jit_I(cc|o|(_u4(rn)<<16)|(_u4(rd)<<12)|_u12(im));\n}\n\n#define coriw(cc,o,rd,im)\t\t\t_coriw(_jit,cc,o,rd,im)\n__jit_inline void\n_coriw(jit_state_t _jit, int cc, int o, int rd, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00fffff));\n    assert(!(im & 0xffff0000));\n    _jit_I(cc|o|((im&0xf000)<<4)|(_u4(rd)<<12)|(im&0xfff));\n}\n\n#define corri8(cc,o,rn,rt,im)\t_corri8(_jit,cc,o,rn,rt,im)\n__jit_inline void\n_corri8(jit_state_t _jit, int cc, int o, int rn, int rt, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00fff0f));\n    assert(!(im & 0xffffff00));\n    _jit_I(cc|o|(_u4(rn)<<16)|(_u4(rt)<<12)|((im&0xf0)<<4)|(im&0x0f));\n}\n\n#define corrrr(cc,o,rh,rl,rm,rn) _corrrr(_jit,cc,o,rh,rl,rm,rn)\n__jit_inline void\n_corrrr(jit_state_t _jit, int cc, int o, int rh, int rl, int rm, int rn)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00fff0f));\n    _jit_I(cc|o|(_u4(rh)<<16)|(_u4(rl)<<12)|(_u4(rm)<<8)|_u4(rn));\n}\n\n#define corrrs(cc,o,rn,rd,rm,im)\t_corrrs(_jit,cc,o,rn,rd,rm,im)\n__jit_inline void\n_corrrs(jit_state_t _jit, int cc, int o, int rn, int rd, int rm, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000ff8f));\n    _jit_I(cc|o|(_u4(rd)<<12)|(_u4(rn)<<16)|(im<<7)|_u4(rm));\n}\n\n#define cshift(cc,o,rd,rm,rn,im)\t_cshift(_jit,cc,o,rd,rm,rn,im)\n__jit_inline void\n_cshift(jit_state_t _jit, int cc, int o, int rd, int rm, int rn, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xffe0ff8f));\n    assert(((_u4(rm)<<8)&(im<<7)) == 0);\n    _jit_I(cc|ARM_SHIFT|o|(_u4(rd)<<12)|(_u4(rm)<<8)|(im<<7)|_u4(rn));\n}\n\n#define cb(cc,o,im)\t\t\t_cb(_jit,cc,o,im)\n__jit_inline void\n_cb(jit_state_t _jit, int cc, int o, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf0ffffff));\n    _jit_I(cc|o|_u24(im));\n}\n\n#define cbx(cc,o,rm)\t\t\t_cbx(_jit,cc,o,rm)\n__jit_inline void\n_cbx(jit_state_t _jit, int cc, int o, int rm)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000000f));\n    _jit_I(cc|o|_u4(rm));\n}\n\n#define corl(cc,o,r0,i0)\t\t_corl(_jit,cc,o,r0,i0)\n__jit_inline void\n_corl(jit_state_t _jit, int cc, int o, int r0, int i0)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00fffff));\n    _jit_I(cc|o|(_u4(r0)<<16)|_u16(i0));\n}\n\n#define c6orr(cc,o,rd,rm)\t\t_c6orr(_jit,cc,o,rd,rm)\n__jit_inline void\n_c6orr(jit_state_t _jit, int cc, int o, int rd, int rm)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf000f00f));\n    _jit_I(cc|o|(_u4(rd)<<12)|_u4(rm));\n}\n\n#define arm_cc_pkh(cc,o,rn,rd,rm,im)\t_arm_cc_pkh(_jit,cc,o,rn,rd,rm,im)\n__jit_inline void\n_arm_cc_pkh(jit_state_t _jit, int cc, int o, int rn, int rd, int rm, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(!(o  & 0xf00ff00f));\n    _jit_I(cc|o|(_u4(rn)<<16)|(_u4(rd)<<12)|(_u5(im)<<7)|_u4(rm));\n}\n\n\n#define _CC_MOV(cc,rd,rm)\tcorrr(cc,ARM_MOV,0,rd,rm)\n#define _MOV(rd,rm)\t\t_CC_MOV(ARM_CC_AL,rd,rm)\n#define T1_MOV(rd,rm)\t\t_jit_W(THUMB_MOV|((_u4(rd)&8)<<4)|(_u4(rm)<<3)|(rd&7))\n#define T2_MOV(rd,rm)\t\tT2_ORR(rd,_R15,rm)\n#define _CC_MOVI(cc,rd,im)\tcorri(cc,ARM_MOV|ARM_I,0,rd,im)\n#define _MOVI(rd,im)\t\t_CC_MOVI(ARM_CC_AL,rd,im)\n#define _CC_MOVWI(cc,rd,im)\tcoriw(cc,ARM_MOVWI,rd,im)\n#define _MOVWI(rd,im)\t\t_CC_MOVWI(ARM_CC_AL,rd,im)\n#define T1_MOVI(rd,im)\t\t_jit_W(THUMB_MOVI|(_u3(rd)<<8)|_u8(im))\n#define T2_MOVI(rd,im)\t\ttorri(THUMB2_MOVI,_R15,rd,im)\n#define T2_MOVWI(rd,im)\t\ttoriw(THUMB2_MOVWI,rd,im)\n#define _CC_MOVTI(cc,rd,im)\tcoriw(cc,ARM_MOVTI,rd,im)\n#define _MOVTI(rd,im)\t\t_CC_MOVTI(ARM_CC_AL,rd,im)\n#define T2_MOVTI(rd,im)\t\ttoriw(THUMB2_MOVTI,rd,im)\n#define _CC_MVN(cc,rd,rm)\tcorrr(cc,ARM_MVN,0,rd,rm)\n#define _MVN(rd,rm)\t\t_CC_MVN(ARM_CC_AL,rd,rm)\n#define T1_MVN(rd,rm)\t\t_jit_W(THUMB_MVN|(_u3(rm)<<3)|_u3(rd))\n#define T2_MVN(rd,rm)\t\ttorrr(THUMB2_MVN,rd,_R15,rm)\n#define _CC_MVNI(cc,rd,im)\tcorri(cc,ARM_MVN|ARM_I,0,rd,im)\n#define _MVNI(rd,im)\t\t_CC_MVNI(ARM_CC_AL,rd,im)\n#define T2_MVNI(rd,im)\t\ttorri(THUMB2_MVNI,_R15,rd,im)\n#define _CC_NOT(cc,rd,rm)\t_CC_MVN(cc,rd,rm)\n#define _NOT(rd,rm)\t\t_CC_NOT(ARM_CC_AL,rd,rm)\n#define T1_NOT(rd,rm)\t\tT1_MVN(rd,rm)\n#define T2_NOT(rd,rm)\t\tT2_MVN(rd,rm)\n#define _NOP()\t\t\t_MOV(_R0, _R0)\n#define T1_NOP()\t\t_jit_W(0xbf00)\n\n#define _CC_ADD(cc,rd,rn,rm)\tcorrr(cc,ARM_ADD,rn,rd,rm)\n#define _ADD(rd,rn,rm)\t\t_CC_ADD(ARM_CC_AL,rd,rn,rm)\n#define T1_ADD(rd,rn,rm)\t_jit_W(THUMB_ADD|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rd))\n#define T1_ADDX(rdn,rm)\t\t_jit_W(THUMB_ADDX|((_u4(rdn)&8)<<4)|(_u4(rm)<<3)|(rdn&7))\n#define T2_ADD(rd,rn,rm)\ttorrr(THUMB2_ADD,rn,rd,rm)\n#define _CC_ADDI(cc,rd,rn,im)\tcorri(cc,ARM_ADD|ARM_I,rn,rd,im)\n#define _ADDI(rd,rn,im)\t\t_CC_ADDI(ARM_CC_AL,rd,rn,im)\n#define T1_ADDI3(rd,rn,im)\t_jit_W(THUMB_ADDI3|(_u3(im)<<6)|(_u3(rn)<<3)|_u3(rd))\n#define T1_ADDI8(rdn,im)\t_jit_W(THUMB_ADDI8|(_u3(rdn)<<8)|_u8(im))\n#define T2_ADDI(rd,rn,im)\ttorri(THUMB2_ADDI,rn,rd,im)\n#define T2_ADDWI(rd,rn,im)\ttorri(THUMB2_ADDWI,rn,rd,im)\n#define _CC_ADDS(cc,rd,rn,rm)\tcorrr(cc,ARM_ADD|ARM_S,rn,rd,rm)\n#define _ADDS(rd,rn,rm)\t\t_CC_ADDS(ARM_CC_AL,rd,rn,rm)\n#define T2_ADDS(rd,rn,rm)\ttorrr(THUMB2_ADD|ARM_S,rn,rd,rm)\n#define _ADDSI(rd,rn,im)\tcorri(ARM_CC_AL,ARM_ADD|ARM_S|ARM_I,rn,rd,im)\n#define T2_ADDSI(rd,rn,im)\ttorri(THUMB2_ADDI|ARM_S,rn,rd,im)\n#define _CC_ADC(cc,rd,rn,rm)\tcorrr(cc,ARM_ADC,rn,rd,rm)\n#define _ADC(rd,rn,rm)\t\t_CC_ADC(ARM_CC_AL,rd,rn,rm)\n#define T1_ADC(rdn,rm)\t\t_jit_W(THUMB_ADC|(_u3(rm)<<3)|_u3(rdn))\n#define T2_ADC(rd,rn,rm)\ttorrr(THUMB2_ADC,rn,rd,rm)\n#define _CC_ADCI(cc,rd,rn,im)\tcorri(cc,ARM_ADC|ARM_I,rn,rd,im)\n#define _ADCI(rd,rn,im)\t\t_CC_ADCI(ARM_CC_AL,rd,rn,im)\n#define T2_ADCI(rd,rn,im)\ttorri(THUMB2_ADCI,rn,rd,im)\n#define _CC_ADCS(cc,rd,rn,rm)\tcorrr(cc,ARM_ADC|ARM_S,rn,rd,rm)\n#define _ADCS(rd,rn,rm)\t\t_CC_ADCS(ARM_CC_AL,rd,rn,rm)\n#define T2_ADCS(rd,rn,rm)\ttorrr(THUMB2_ADC|ARM_S,rn,rd,rm)\n#define _CC_ADCSI(cc,rd,rn,im)\tcorri(cc,ARM_ADC|ARM_S|ARM_I,rn,rd,im)\n#define _ADCSI(rd,rn,im)\t_CC_ADCSI(ARM_CC_AL,rd,rn,im)\n#define T2_ADCSI(rd,rn,im)\ttorri(THUMB2_ADCI|ARM_S,rn,rd,im)\n#define _CC_SUB(cc,rd,rn,rm)\tcorrr(cc,ARM_SUB,rn,rd,rm)\n#define _SUB(rd,rn,rm)\t\t_CC_SUB(ARM_CC_AL,rd,rn,rm)\n#define T1_SUB(rd,rn,rm)\t_jit_W(THUMB_SUB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rd))\n#define T2_SUB(rd,rn,rm)\ttorrr(THUMB2_SUB,rn,rd,rm)\n#define _CC_SUBI(cc,rd,rn,im)\tcorri(cc,ARM_SUB|ARM_I,rn,rd,im)\n#define _SUBI(rd,rn,im)\t\t_CC_SUBI(ARM_CC_AL,rd,rn,im)\n#define T1_SUBI3(rd,rn,im)\t_jit_W(THUMB_SUBI3|(_u3(im)<<6)|(_u3(rn)<<3)|_u3(rd))\n#define T1_SUBI8(rdn,im)\t_jit_W(THUMB_SUBI8|(_u3(rdn)<<8)|_u8(im))\n#define T2_SUBI(rd,rn,im)\ttorri(THUMB2_SUBI,rn,rd,im)\n#define T2_SUBWI(rd,rn,im)\ttorri(THUMB2_SUBWI,rn,rd,im)\n#define _CC_SUBS(cc,rd,rn,rm)\tcorrr(cc,ARM_SUB|ARM_S,rn,rd,rm)\n#define _SUBS(rd,rn,rm)\t\t_CC_SUBS(ARM_CC_AL,rd,rn,rm)\n#define T2_SUBS(rd,rn,rm)\ttorrr(THUMB2_SUB|ARM_S,rn,rd,rm)\n#define _CC_SUBSI(cc,rd,rn,im)\tcorri(cc,ARM_SUB|ARM_S|ARM_I,rn,rd,im)\n#define _SUBSI(rd,rn,im)\t_CC_SUBSI(ARM_CC_AL,rd,rn,im)\n#define T2_SUBSI(rd,rn,im)\ttorri(THUMB2_SUBI|ARM_S,rn,rd,im)\n#define _CC_SBC(cc,rd,rn,rm)\tcorrr(cc,ARM_SBC,rn,rd,rm)\n#define _SBC(rd,rn,rm)\t\t_CC_SBC(ARM_CC_AL,rd,rn,rm)\n#define T1_SBC(rdn,rm)\t\t_jit_W(THUMB_SBC|(_u3(rm)<<3)|_u3(rdn))\n#define T2_SBC(rd,rn,rm)\ttorrr(THUMB2_SBC,rn,rd,rm)\n#define _CC_SBCI(cc,rd,rn,im)\tcorri(cc,ARM_SBC|ARM_I,rn,rd,im)\n#define _SBCI(rd,rn,im)\t\t_CC_SBCI(ARM_CC_AL,rd,rn,im)\n#define T2_SBCI(rd,rn,im)\ttorri(THUMB2_SBCI,rn,rd,im)\n#define _CC_SBCS(cc,rd,rn,rm)\tcorrr(cc,ARM_SBC|ARM_S,rn,rd,rm)\n#define _SBCS(rd,rn,rm)\t\t_CC_SBCS(ARM_CC_AL,rd,rn,rm)\n#define T2_SBCS(rd,rn,rm)\ttorrr(THUMB2_SBC|ARM_S,rn,rd,rm)\n#define _CC_SBCSI(cc,rd,rn,im)\tcorri(cc,ARM_SBC|ARM_S|ARM_I,rn,rd,im)\n#define _SBCSI(rd,rn,im)\t_CC_SBCSI(ARM_CC_AL,rd,rn,im)\n#define T2_SBCSI(rd,rn,im)\ttorri(THUMB2_SBCI|ARM_S,rn,rd,im)\n#define _CC_RSB(cc,rd,rn,rm)\tcorrr(cc,ARM_RSB,rn,rd,rm)\n#define _RSB(rd,rn,rm)\t\t_CC_RSB(ARM_CC_AL,rd,rn,rm)\n#define T2_RSB(rd,rn,rm)\ttorrr(THUMB2_RSB,rn,rd,rm)\n#define _CC_RSBI(cc,rd,rn,im)\tcorri(cc,ARM_RSB|ARM_I,rn,rd,im)\n#define _RSBI(rd,rn,im)\t\t_CC_RSBI(ARM_CC_AL,rd,rn,im)\n#define T1_RSBI(rd,rn)\t\t_jit_W(THUMB_RSBI|(_u3(rn)<<3)|_u3(rd))\n#define T2_RSBI(rd,rn,im)\ttorri(THUMB2_RSBI,rn,rd,im)\n\n#define _CC_MUL(cc,rl,rn,rm)\tcorrrr(cc,ARM_MUL,rl,0,rm,rn)\n#define _MUL(rl,rn,rm)\t\t_CC_MUL(ARM_CC_AL,rl,rn,rm)\n#define T1_MUL(rdm,rn)\t\t_jit_W(THUMB_MUL|(_u3(rn)<<3)|_u3(rdm))\n#define T2_MUL(rd,rn,rm)\ttorrr(THUMB2_MUL,rn,rd,rm)\n#define _CC_SMULL(cc,rl,rh,rn,rm)\tcorrrr(cc,ARM_SMULL,rh,rl,rm,rn)\n#define _SMULL(rl,rh,rn,rm)\t_CC_SMULL(ARM_CC_AL,rl,rh,rn,rm)\n#define T2_SMULL(rl,rh,rn,rm)\ttorrrr(THUMB2_SMULL,rn,rl,rh,rm)\n#define _CC_UMULL(cc,rl,rh,rn,rm)\tcorrrr(cc,ARM_UMULL,rh,rl,rm,rn)\n#define _UMULL(rl,rh,rn,rm)\t_CC_UMULL(ARM_CC_AL,rl,rh,rn,rm)\n#define T2_UMULL(rl,rh,rn,rm)\ttorrrr(THUMB2_UMULL,rn,rl,rh,rm)\n#define T2_SDIV(rd,rn,rm)\ttorrr(THUMB2_SDIV,rn,rd,rm)\n#define T2_UDIV(rd,rn,rm)\ttorrr(THUMB2_UDIV,rn,rd,rm)\n\n#define _CC_AND(cc,rd,rn,rm)\tcorrr(cc,ARM_AND,rn,rd,rm)\n#define _AND(rd,rn,rm)\t\t_CC_AND(ARM_CC_AL,rd,rn,rm)\n#define T1_AND(rdn,rm)\t\t_jit_W(THUMB_AND|(_u3(rm)<<3)|_u3(rdn))\n#define T2_AND(rd,rn,rm)\ttorrr(THUMB2_AND,rn,rd,rm)\n#define _CC_ANDI(cc,rd,rn,im)\tcorri(cc,ARM_AND|ARM_I,rn,rd,im)\n#define _ANDI(rd,rn,im)\t\t_CC_ANDI(ARM_CC_AL,rd,rn,im)\n#define T2_ANDI(rd,rn,im)\ttorri(THUMB2_ANDI,rn,rd,im)\n#define _CC_ANDS(cc,rd,rn,rm)\tcorrr(cc,ARM_AND|ARM_S,rn,rd,rm)\n#define _ANDS(rd,rn,rm)\t\t_CC_ANDS(ARM_CC_AL,rd,rn,rm)\n#define T2_ANDS(rd,rn,rm)\ttorrr(THUMB2_AND|ARM_S,rn,rd,rm)\n#define _CC_ANDSI(cc,rd,rn,im)\tcorri(cc,ARM_AND|ARM_S|ARM_I,rn,rd,im)\n#define _ANDSI(rd,rn,im)\t_CC_ANDSI(ARM_CC_AL,rd,rn,im)\n#define T2_ANDSI(rd,rn,im)\ttorri(ARM_CC_AL,THUMB2_ANDI|ARM_S,rn,rd,im)\n#define _CC_BIC(cc,rd,rn,rm)\tcorrr(cc,ARM_BIC,rn,rd,rm)\n#define _BIC(rd,rn,rm)\t\t_CC_BIC(ARM_CC_AL,rd,rn,rm)\n#define T2_BIC(rd,rn,rm)\ttorrr(THUMB2_BIC,rn,rd,rm)\n#define _CC_BICI(cc,rd,rn,im)\tcorri(cc,ARM_BIC|ARM_I,rn,rd,im)\n#define _BICI(rd,rn,im)\t\t_CC_BICI(ARM_CC_AL,rd,rn,im)\n#define T2_BICI(rd,rn,im)\ttorri(THUMB2_BICI,rn,rd,im)\n#define _CC_BICS(cc,rd,rn,rm)\tcorrr(cc,ARM_BIC|ARM_S,rn,rd,rm)\n#define _BICS(rd,rn,rm)\t\t_CC_BICS(ARM_CC_AL,rd,rn,rm)\n#define T2_BICS(rd,rn,rm)\ttorrr(THUMB2_BIC|ARM_S,rn,rd,rm)\n#define _CC_BICSI(cc,rd,rn,im)\tcorri(cc,ARM_BIC|ARM_S|ARM_I,rn,rd,im)\n#define _BICSI(rd,rn,im)\t_CC_BICSI(ARM_CC_AL,rd,rn,im)\n#define T2_BICSI(rd,rn,im)\ttorri(ARM_CC_AL,THUMB2_BICI|ARM_S,rn,rd,im)\n#define _CC_ORR(cc,rd,rn,rm)\tcorrr(cc,ARM_ORR,rn,rd,rm)\n#define _ORR(rd,rn,rm)\t\t_CC_ORR(ARM_CC_AL,rd,rn,rm)\n#define T1_ORR(rdn,rm)\t\t_jit_W(THUMB_ORR|(_u3(rm)<<3)|_u3(rdn))\n#define T2_ORR(rd,rn,rm)\ttorrr(THUMB2_ORR,rn,rd,rm)\n#define _CC_ORR_SI(cc,rd,rn,rm,sh,im)\t\t\t\t\t\\\n    corrrs(cc,ARM_ORR|sh,rn,rd,rm,im)\n#define _ORR_SI(rd,rn,rm,sh,im)\t_CC_ORR_SI(ARM_CC_AL,rd,rn,rm,sh,im)\n#define _CC_ORRI(cc,rd,rn,im)\tcorri(cc,ARM_ORR|ARM_I,rn,rd,im)\n#define _ORRI(rd,rn,im)\t\t_CC_ORRI(ARM_CC_AL,rd,rn,im)\n#define T2_ORRI(rd,rn,im)\ttorri(THUMB2_ORRI,rn,rd,im)\n#define _CC_EOR(cc,rd,rn,rm)\tcorrr(cc,ARM_EOR,rn,rd,rm)\n#define _EOR(rd,rn,rm)\t\t_CC_EOR(ARM_CC_AL,rd,rn,rm)\n#define T1_EOR(rdn,rm)\t\t_jit_W(THUMB_EOR|(_u3(rm)<<3)|_u3(rdn))\n#define T2_EOR(rd,rn,rm)\ttorrr(THUMB2_EOR,rn,rd,rm)\n#define _CC_EOR_SI(cc,rd,rn,rm,sh,im)\t\t\t\t\t\\\n    corrrs(cc,ARM_EOR|sh,rn,rd,rm,im)\n#define _EOR_SI(rd,rn,rm,sh,im)\t_CC_EOR_SI(ARM_CC_AL,rd,rn,rm,sh,im)\n#define _CC_EORI(cc,rd,rn,im)\tcorri(cc,ARM_EOR|ARM_I,rn,rd,im)\n#define _EORI(rd,rn,im)\t\t_CC_EORI(ARM_CC_AL,rd,rn,im)\n#define T2_EORI(rd,rn,im)\ttorri(THUMB2_EORI,rn,rd,im)\n\n#define _CC_REV(cc,rd,rm)\tc6orr(cc,ARM_REV,rd,rm)\n#define _REV(rd,rm)\t\t_CC_REV(ARM_CC_AL,rd,rm)\n#define T1_REV(rd,rm)\t\t_jit_W(THUMB_REV|(_u3(rm)<<3)|_u3(rd))\n#define T2_REV(rd,rm)\t\ttorrr(THUMB2_REV,rm,rd,rm)\n#define _CC_REV16(cc,rd,rm)\tc6orr(cc,ARM_REV16,rd,rm)\n#define _REV16(rd,rm)\t\t_CC_REV16(ARM_CC_AL,rd,rm)\n#define T1_REV16(rd,rm)\t\t_jit_W(THUMB_REV16|(_u3(rm)<<3)|_u3(rd))\n#define T2_REV16(rd,rm)\t\ttorrr(THUMB2_REV16,rm,rd,rm)\n#define _CC_SXTB(cc,rd,rm)\tc6orr(cc,ARM_SXTB,rd,rm)\n#define _SXTB(rd,rm)\t\t_CC_SXTB(ARM_CC_AL,rd,rm)\n#define T1_SXTB(rd,rm)\t\t_jit_W(THUMB_SXTB|(_u3(rm)<<3)|_u3(rd))\n#define T2_SXTB(rd,rm)\t\ttorrr(THUMB2_SXTB,_R15,rd,rm)\n#define _CC_UXTB(cc,rd,rm)\tc6orr(cc,ARM_UXTB,rd,rm)\n#define _UXTB(rd,rm)\t\t_CC_UXTB(ARM_CC_AL,rd,rm)\n#define T1_UXTB(rd,rm)\t\t_jit_W(THUMB_UXTB|(_u3(rm)<<3)|_u3(rd))\n#define T2_UXTB(rd,rm)\t\ttorrr(THUMB2_UXTB,_R15,rd,rm)\n#define _CC_SXTH(cc,rd,rm)\tc6orr(cc,ARM_SXTH,rd,rm)\n#define _SXTH(rd,rm)\t\t_CC_SXTH(ARM_CC_AL,rd,rm)\n#define T1_SXTH(rd,rm)\t\t_jit_W(THUMB_SXTH|(_u3(rm)<<3)|_u3(rd))\n#define T2_SXTH(rd,rm)\t\ttorrr(THUMB2_SXTH,_R15,rd,rm)\n#define _CC_UXTH(cc,rd,rm)\tc6orr(cc,ARM_UXTH,rd,rm)\n#define _UXTH(rd,rm)\t\t_CC_UXTH(ARM_CC_AL,rd,rm)\n#define T1_UXTH(rd,rm)\t\t_jit_W(THUMB_UXTH|(_u3(rm)<<3)|_u3(rd))\n#define T2_UXTH(rd,rm)\t\ttorrr(THUMB2_UXTH,_R15,rd,rm)\n\n#define _CC_SHIFT(cc,o,rd,rm,rn,im) cshift(cc,o,rd,rm,rn,im)\n#define _CC_LSL(cc,rd,rn,rm)\t_CC_SHIFT(cc,ARM_LSL|ARM_R,rd,rm,rn,0)\n#define _LSL(rd,rn,rm)\t\t_CC_LSL(ARM_CC_AL,rd,rn,rm)\n#define T1_LSL(rdn,rm)\t\t_jit_W(THUMB_LSL|(_u3(rm)<<3)|_u3(rdn))\n#define T2_LSL(rd,rn,rm)\ttorrr(THUMB2_LSL,rn,rd,rm)\n#define _CC_LSLI(cc,rd,rn,im)\t_CC_SHIFT(cc,ARM_LSL,rd,0,rn,im)\n#define _LSLI(rd,rn,im)\t\t_CC_LSLI(ARM_CC_AL,rd,rn,im)\n#define T1_LSLI(rd,rm,im)\t_jit_W(THUMB_LSLI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd))\n#define T2_LSLI(rd,rm,im)\ttshift(THUMB2_LSLI,rd,rm,im)\n#define _CC_LSR(cc,rd,rn,rm)\t_CC_SHIFT(cc,ARM_LSR|ARM_R,rd,rm,rn,0)\n#define _LSR(rd,rn,rm)\t\t_CC_LSR(ARM_CC_AL,rd,rn,rm)\n#define T1_LSR(rdn,rm)\t\t_jit_W(THUMB_LSR|(_u3(rm)<<3)|_u3(rdn))\n#define T2_LSR(rd,rn,rm)\ttorrr(THUMB2_LSR,rn,rd,rm)\n#define _CC_LSRI(cc,rd,rn,im)\t_CC_SHIFT(cc,ARM_LSR,rd,0,rn,im)\n#define _LSRI(rd,rn,im)\t\t_CC_LSRI(ARM_CC_AL,rd,rn,im)\n#define T1_LSRI(rd,rm,im)\t_jit_W(THUMB_LSRI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd))\n#define T2_LSRI(rd,rm,im)\ttshift(THUMB2_LSRI,rd,rm,im)\n#define _CC_ASR(cc,rd,rn,rm)\t_CC_SHIFT(cc,ARM_ASR|ARM_R,rd,rm,rn,0)\n#define _ASR(rd,rn,rm)\t\t_CC_ASR(ARM_CC_AL,rd,rn,rm)\n#define T1_ASR(rdn,rm)\t\t_jit_W(THUMB_ASR|(_u3(rm)<<3)|_u3(rdn))\n#define T2_ASR(rd,rn,rm)\ttorrr(THUMB2_ASR,rn,rd,rm)\n#define _CC_ASRI(cc,rd,rn,im)\t_CC_SHIFT(cc,ARM_ASR,rd,0,rn,im)\n#define _ASRI(rd,rn,im)\t\t_CC_ASRI(ARM_CC_AL,rd,rn,im)\n#define T1_ASRI(rd,rm,im)\t_jit_W(THUMB_ASRI|(_u5(im)<<6)|(_u3(rm)<<3)|_u3(rd))\n#define T2_ASRI(rd,rm,im)\ttshift(THUMB2_ASRI,rd,rm,im)\n\n#define _CC_CMP(cc,rn,rm)\tcorrr(cc,ARM_CMP,rn,0,rm)\n#define _CMP(rn,rm)\t\t_CC_CMP(ARM_CC_AL,rn,rm)\n#define T1_CMP(rn,rm)\t\t_jit_W(THUMB_CMP|(_u3(rm)<<3)|_u3(rn))\n#define T1_CMPX(rn,rm)\t\t_jit_W(THUMB_CMPX|((_u4(rn)&8)<<4)|(_u4(rm)<<3)|(rn&7))\n#define T2_CMP(rn,rm)\t\ttorrr(THUMB2_CMP,rn,_R15,rm)\n#define _CC_CMPI(cc,rn,im)\tcorri(cc,ARM_CMP|ARM_I,rn,0,im)\n#define _CMPI(rn,im)\t\t_CC_CMPI(ARM_CC_AL,rn,im)\n#define T1_CMPI(rn,im)\t\t_jit_W(THUMB_CMPI|(_u3(rn)<<8)|_u8(im))\n#define T2_CMPI(rn,im)\t\ttorri(THUMB2_CMPI,rn,_R15,im)\n#define _CC_CMN(cc,rn,rm)\tcorrr(cc,ARM_CMN,rn,0,rm)\n#define _CMN(rn,rm)\t\t_CC_CMN(ARM_CC_AL,rn,rm)\n#define T1_CMN(rn,rm)\t\t_jit_W(THUMB_CMN|(_u3(rm)<<3)|_u3(rm))\n#define T2_CMN(rn,rm)\t\ttorrr(THUMB2_CMN,rn,_R15,rm)\n#define _CC_CMNI(cc,rn,im)\tcorri(cc,ARM_CMN|ARM_I,rn,_R15,im)\n#define _CMNI(rn,im)\t\t_CC_CMNI(ARM_CC_AL,rn,im)\n#define T2_CMNI(rn,im)\t\ttorri(THUMB2_CMNI,rn,_R15,im)\n#define _CC_TST(cc,rn,rm)\tcorrr(cc,ARM_TST,rn,r0,rm)\n#define _TST(rn,rm)\t\t_CC_TST(ARM_CC_AL,rn,rm)\n#define T1_TST(rn,rm)\t\t_jit_W(THUMB_TST|(_u3(rm)<<3)|_u3(rn))\n#define T2_TST(rn,rm)\t\ttorrr(THUMB2_TST,rn,_R15,rm)\n#define _CC_TSTI(cc,rn,im)\tcorri(cc,ARM_TST|ARM_I,rn,0,im)\n#define _TSTI(rn,im)\t\t_CC_TSTI(ARM_CC_AL,rn,im)\n#define T2_TSTI(rn,im)\t\ttorri(THUMB2_TSTI,rn,_R15,im)\n#define _CC_TEQ(cc,rn,rm)\tcorrr(cc,ARM_TEQ,rn,0,rm)\n#define _TEQ(rn,rm)\t\t_CC_TEQ(ARM_CC_AL,rn,rm)\n#define _CC_TEQI(cc,rm,im)\tcorri(cc,ARM_TEQ|ARM_I,rn,0,im)\n#define _TEQI(rn,im)\t\t_CC_TEQI(ARM_CC_AL,rn,im)\n\n#undef _B\n\n#define _CC_BX(cc,rm)\t\tcbx(cc,ARM_BX,rm)\n#define _BX(rm)\t\t\t_CC_BX(ARM_CC_AL,rm)\n#define T1_BX(rm)\t\t_jit_W(0x4700|(_u4(rm)<<3))\n#define _CC_BLX(cc,rm)\t\tcbx(cc,ARM_BLX,rm)\n#define _BLX(rm)\t\t_CC_BLX(ARM_CC_AL,rm)\n#define T1_BLX(rm)\t\t_jit_W(THUMB_BLX|(_u4(rm)<<3))\n#define _BLXI(im)\t\tblxi(im)\n#define T2_BLXI(im)\t\ttb(THUMB2_BLXI,im)\n#define _CC_B(cc,im)\t\tcb(cc,ARM_B,im)\n#define _B(im)\t\t\t_CC_B(ARM_CC_AL,im)\n#define T1_CC_B(cc,im)\t\ttc8(cc,im)\n#define T1_B(im)\t\tt11(im)\n#define T2_CC_B(cc,im)\t\ttcb(cc,im)\n#define T2_B(im)\t\ttb(THUMB2_B,im)\n#define _CC_BLI(cc,im)\t\tcb(cc,ARM_BLI,im)\n#define _BLI(im)\t\t_CC_BLI(ARM_CC_AL,im)\n#define T2_BLI(im)\t\ttb(THUMB2_BLI,im)\n\n#define _CC_LDRSB(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRSB|ARM_P,rn,rt,rm)\n#define _LDRSB(rt,rn,rm)\t_CC_LDRSB(ARM_CC_AL,rt,rn,rm)\n#define T1_LDRSB(rt,rn,rm)\t_jit_W(THUMB_LDRSB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_LDRSB(rt,rn,rm)\ttorxr(THUMB2_LDRSB,rn,rt,rm)\n#define _CC_LDRSBN(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRSB,rn,rt,rm)\n#define _LDRSBN(rt,rn,rm)\t_CC_LDRSBN(ARM_CC_AL,rt,rn,rm)\n#define _CC_LDRSBI(cc,rt,rn,im)\tcorri8(cc,ARM_LDRSBI|ARM_P,rn,rt,im)\n#define _LDRSBI(rt,rn,im)\t_CC_LDRSBI(ARM_CC_AL,rt,rn,im)\n#define T2_LDRSBI(rt,rn,im)\ttorri8(THUMB2_LDRSBI|THUMB2_U,rn,rt,im)\n#define T2_LDRSBWI(rt,rn,im)\ttorri12(THUMB2_LDRSBWI,rn,rt,im)\n#define _CC_LDRSBIN(cc,rt,rn,im)\tcorri8(cc,ARM_LDRSBI,rn,rt,im)\n#define _LDRSBIN(rt,rn,im)\t_CC_LDRSBIN(ARM_CC_AL,rt,rn,im)\n#define T2_LDRSBIN(rt,rn,im)\ttorri8(THUMB2_LDRSBI,rn,rt,im)\n#define _CC_LDRB(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRB|ARM_P,rn,rt,rm)\n#define _LDRB(rt,rn,rm)\t\t_CC_LDRB(ARM_CC_AL,rt,rn,rm)\n#define T1_LDRB(rt,rn,rm)\t_jit_W(THUMB_LDRB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_LDRB(rt,rn,rm)\ttorxr(THUMB2_LDRB,rn,rt,rm)\n#define _CC_LDRBN(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRB,rn,rt,rm)\n#define _LDRBN(rt,rn,rm)\t_CC_LDRBN(ARM_CC_AL,rt,rn,rm)\n#define _CC_LDRBI(cc,rt,rn,im)\tcorri(cc,ARM_LDRBI|ARM_P,rn,rt,im)\n#define _LDRBI(rt,rn,im)\t_CC_LDRBI(ARM_CC_AL,rt,rn,im)\n#define T1_LDRBI(rt,rn,im)\t_jit_W(THUMB_LDRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_LDRBI(rt,rn,im)\ttorri8(THUMB2_LDRBI|THUMB2_U,rn,rt,im)\n#define T2_LDRBWI(rt,rn,im)\ttorri12(THUMB2_LDRBWI,rn,rt,im)\n#define _CC_LDRBIN(cc,rt,rn,im)\tcorri(cc,ARM_LDRBI,rn,rt,im)\n#define _LDRBIN(rt,rn,im)\t_CC_LDRBIN(ARM_CC_AL,rt,rn,im)\n#define T2_LDRBIN(rt,rn,im)\ttorri8(THUMB2_LDRBI,rn,rt,im)\n#define _CC_LDRSH(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRSH|ARM_P,rn,rt,rm)\n#define _LDRSH(rt,rn,rm)\t_CC_LDRSH(ARM_CC_AL,rt,rn,rm)\n#define T1_LDRSH(rt,rn,rm)\t_jit_W(THUMB_LDRSH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_LDRSH(rt,rn,rm)\ttorxr(THUMB2_LDRSH,rn,rt,rm)\n#define _CC_LDRSHN(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRSH,rn,rt,rm)\n#define _LDRSHN(rt,rn,rm)\t_CC_LDRSHN(ARM_CC_AL,rt,rn,rm)\n#define _CC_LDRSHI(cc,rt,rn,im)\tcorri8(cc,ARM_LDRSHI|ARM_P,rn,rt,im)\n#define _LDRSHI(rt,rn,im)\t_CC_LDRSHI(ARM_CC_AL,rt,rn,im)\n#define T2_LDRSHI(rt,rn,im)\ttorri8(THUMB2_LDRSHI|THUMB2_U,rn,rt,im)\n#define T2_LDRSHWI(rt,rn,im)\ttorri12(THUMB2_LDRSHWI,rn,rt,im)\n#define _CC_LDRSHIN(cc,rt,rn,im)\tcorri8(cc,ARM_LDRSHI,rn,rt,im)\n#define _LDRSHIN(rt,rn,im)\t_CC_LDRSHIN(ARM_CC_AL,rt,rn,im)\n#define T2_LDRSHIN(rt,rn,im)\ttorri8(THUMB2_LDRSHI,rn,rt,im)\n#define _CC_LDRH(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRH|ARM_P,rn,rt,rm)\n#define _LDRH(rt,rn,rm)\t\t_CC_LDRH(ARM_CC_AL,rt,rn,rm)\n#define T1_LDRH(rt,rn,rm)\t_jit_W(THUMB_LDRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_LDRH(rt,rn,rm)\ttorxr(THUMB2_LDRH,rn,rt,rm)\n#define _CC_LDRHN(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRH,rn,rt,rm)\n#define _LDRHN(rt,rn,rm)\tCC_LDRHN(ARM_CC_AL,rt,rn,rm)\n#define _CC_LDRHI(cc,rt,rn,im)\tcorri8(cc,ARM_LDRHI|ARM_P,rn,rt,im)\n#define _LDRHI(rt,rn,im)\t_CC_LDRHI(ARM_CC_AL,rt,rn,im)\n#define T1_LDRHI(rt,rn,im)\t_jit_W(THUMB_LDRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_LDRHI(rt,rn,im)\ttorri8(THUMB2_LDRHI|THUMB2_U,rn,rt,im)\n#define T2_LDRHWI(rt,rn,im)\ttorri12(THUMB2_LDRHWI,rn,rt,im)\n#define _CC_LDRHIN(cc,rt,rn,im)\tcorri8(cc,ARM_LDRHI,rn,rt,im)\n#define _LDRHIN(rt,rn,im)\t_CC_LDRHIN(ARM_CC_AL,rt,rn,im)\n#define T2_LDRHIN(rt,rn,im)\ttorri8(THUMB2_LDRHI,rn,rt,im)\n#define _CC_LDR(cc,rt,rn,rm)\tcorrr(cc,ARM_LDR|ARM_P,rn,rt,rm)\n#define _LDR(rt,rn,rm)\t\t_CC_LDR(ARM_CC_AL,rt,rn,rm)\n#define T1_LDR(rt,rn,rm)\t_jit_W(THUMB_LDR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_LDR(rt,rn,rm)\ttorxr(THUMB2_LDR,rn,rt,rm)\n#define _CC_LDRN(cc,rt,rn,rm)\tcorrr(cc,ARM_LDR,rn,rt,rm)\n#define _LDRN(rt,rn,rm)\t\t_CC_LDRN(ARM_CC_AL,rt,rn,rm)\n#define _CC_LDRI(cc,rt,rn,im)\tcorri(cc,ARM_LDRI|ARM_P,rn,rt,im)\n#define _LDRI(rt,rn,im)\t\t_CC_LDRI(ARM_CC_AL,rt,rn,im)\n#define T1_LDRI(rt,rn,im)\t_jit_W(THUMB_LDRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T1_LDRISP(rt,im)\t_jit_W(THUMB_LDRISP|(_u3(rt)<<8)|_u8(im))\n#define T2_LDRI(rt,rn,im)\ttorri8(THUMB2_LDRI|THUMB2_U,rn,rt,im)\n#define T2_LDRWI(rt,rn,im)\ttorri12(THUMB2_LDRWI,rn,rt,im)\n#define _CC_LDRIN(cc,rt,rn,im)\tcorri(cc,ARM_LDRI,rn,rt,im)\n#define _LDRIN(rt,rn,im)\t_CC_LDRIN(ARM_CC_AL,rt,rn,im)\n#define T2_LDRIN(rt,rn,im)\ttorri8(THUMB2_LDRI,rn,rt,im)\n#define _CC_LDRD(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRD|ARM_P,rn,rt,rm)\n#define _LDRD(rt,rn,rm)\t\t_CC_LDRD(ARM_CC_AL,rt,rn,rm)\n#define _CC_LDRDN(cc,rt,rn,rm)\tcorrr(cc,ARM_LDRD,rn,rt,rm)\n#define _LDRDN(rd,rn,rm)\t_CC_LDRDN(ARM_CC_AL,rn,rt,rm)\n#define _CC_LDRDI(cc,rt,rn,im)\tcorri8(cc,ARM_LDRDI|ARM_P,rn,rt,im)\n#define _LDRDI(rt,rn,im)\t_CC_LDRDI(ARM_CC_AL,rn,rt,im)\n#define T2_LDRDI(rt,rt2,rn,im)\ttorrri8(THUMB2_LDRDI|ARM_P,rn,rt,rt2,im)\n#define _CC_LDRDIN(cc,rt,rn,im)\tcorri8(cc,ARM_LDRDI,rn,rt,im)\n#define _LDRDIN(rt,rn,im)\t_CC_LDRDIN(ARM_CC_AL,rt,rn,im)\n#define T2_LDRDIN(rt,rt2,rn,im)\ttorrri8(THUMB2_LDRDI,rn,rt,rt2,im)\n#define _CC_STRB(cc,rt,rn,rm)\tcorrr(cc,ARM_STRB|ARM_P,rn,rt,rm)\n#define _STRB(rt,rn,rm)\t\t_CC_STRB(ARM_CC_AL,rt,rn,rm)\n#define T1_STRB(rt,rn,rm)\t_jit_W(THUMB_STRB|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_STRB(rt,rn,rm)\ttorxr(THUMB2_STRB,rn,rt,rm)\n#define _CC_STRBN(cc,rt,rn,rm)\tcorrr(cc,ARM_STRB,rn,rt,rm)\n#define _STRBN(rt,rn,rm)\t_CC_STRBN(ARM_CC_AL,rt,rn,rm)\n#define _CC_STRBI(cc,rt,rn,im)\tcorri(cc,ARM_STRBI|ARM_P,rn,rt,im)\n#define _STRBI(rt,rn,im)\t_CC_STRBI(ARM_CC_AL,rt,rn,im)\n#define T1_STRBI(rt,rn,im)\t_jit_W(THUMB_STRBI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_STRBI(rt,rn,im)\ttorri8(THUMB2_STRBI|THUMB2_U,rn,rt,im)\n#define T2_STRBWI(rt,rn,im)\ttorri12(THUMB2_STRBWI,rn,rt,im)\n#define _CC_STRBIN(cc,rt,rn,im)\tcorri(cc,ARM_STRBI,rn,rt,im)\n#define _STRBIN(rt,rn,im)\t_CC_STRBIN(ARM_CC_AL,rt,rn,im)\n#define T2_STRBIN(rt,rn,im)\ttorri8(THUMB2_STRBI,rn,rt,im)\n#define _CC_STRH(cc,rt,rn,rm)\tcorrr(cc,ARM_STRH|ARM_P,rn,rt,rm)\n#define _STRH(rt,rn,rm)\t\t_CC_STRH(ARM_CC_AL,rt,rn,rm)\n#define T1_STRH(rt,rn,rm)\t_jit_W(THUMB_STRH|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_STRH(rt,rn,rm)\ttorxr(THUMB2_STRH,rn,rt,rm)\n#define _CC_STRHN(cc,rt,rn,rm)\tcorrr(cc,ARM_STRH,rn,rt,rm)\n#define _STRHN(rt,rn,rm)\t_CC_STRHN(ARM_CC_AL,rt,rn,rm)\n#define _CC_STRHI(cc,rt,rn,im)\tcorri8(cc,ARM_STRHI|ARM_P,rn,rt,im)\n#define _STRHI(rt,rn,im)\t_CC_STRHI(ARM_CC_AL,rt,rn,im)\n#define T1_STRHI(rt,rn,im)\t_jit_W(THUMB_STRHI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_STRHI(rt,rn,im)\ttorri8(THUMB2_STRHI|THUMB2_U,rn,rt,im)\n#define T2_STRHWI(rt,rn,im)\ttorri12(THUMB2_STRHWI,rn,rt,im)\n#define _CC_STRHIN(cc,rt,rn,im)\tcorri8(cc,ARM_STRHI,rn,rt,im)\n#define _STRHIN(rt,rn,im)\t_CC_STRHIN(ARM_CC_AL,rt,rn,im)\n#define T2_STRHIN(rt,rn,im)\ttorri8(THUMB2_STRHI,rn,rt,im)\n#define _CC_STR(cc,rt,rn,rm)\tcorrr(cc,ARM_STR|ARM_P,rn,rt,rm)\n#define _STR(rt,rn,rm)\t\t_CC_STR(ARM_CC_AL,rt,rn,rm)\n#define T1_STR(rt,rn,rm)\t_jit_W(THUMB_STR|(_u3(rm)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T2_STR(rt,rn,rm)\ttorxr(THUMB2_STR,rn,rt,rm)\n#define _CC_STRN(cc,rt,rn,rm)\tcorrr(cc,ARM_STR,rn,rt,rm)\n#define _STRN(rt,rn,rm)\t\t_CC_STRN(ARM_CC_AL,rt,rn,rm)\n#define _CC_STRI(cc,rt,rn,im)\tcorri(cc,ARM_STRI|ARM_P,rn,rt,im)\n#define _STRI(rt,rn,im)\t\t_CC_STRI(ARM_CC_AL,rt,rn,im)\n#define T1_STRI(rt,rn,im)\t_jit_W(THUMB_STRI|(_u5(im)<<6)|(_u3(rn)<<3)|_u3(rt))\n#define T1_STRISP(rt,im)\t_jit_W(THUMB_STRISP|(_u3(rt)<<8)|(_u8(im)))\n#define T2_STRI(rt,rn,im)\ttorri8(THUMB2_STRI|THUMB2_U,rn,rt,im)\n#define T2_STRWI(rt,rn,im)\ttorri12(THUMB2_STRWI,rn,rt,im)\n#define _CC_STRIN(cc,rt,rn,im)\tcorri(cc,ARM_STRI,rn,rt,im)\n#define _STRIN(rt,rn,im)\t_CC_STRIN(ARM_CC_AL,rt,rn,im)\n#define T2_STRIN(rt,rn,im)\ttorri8(THUMB2_STRI,rn,rt,im)\n#define _CC_STRD(cc,rt,rn,rm)\tcorrr(cc,ARM_STRD|ARM_P,rt,rn,rm)\n#define _STRD(rt,rn,rm)\t\t_CC_STRD(ARM_CC_AL,rt,rn,rm)\n#define _CC_STRDN(cc,rt,rn,rm)\tcorrr(cc,ARM_STRD,rn,rt,rm)\n#define _STRDN(rt,rn,rm)\t_CC_STRDN(ARM_CC_AL,rt,rn,rm)\n#define _CC_STRDI(cc,rt,rn,im)\tcorri8(cc,ARM_STRDI|ARM_P,rn,rt,im)\n#define _STRDI(rt,rn,im)\t_CC_STRDI(ARM_CC_AL,rt,rn,im)\n#define T2_STRDI(rt,rt2,rn,im)\ttorrri8(THUMB2_STRDI|ARM_P,rn,rt,rt2,im)\n#define _CC_STRDIN(cc,rt,rn,im)\tcorri8(cc,ARM_STRDI,rn,rt,im)\n#define _STRDIN(rt,rn,im)\t_CC_STRDIN(ARM_CC_AL,rt,rn,im)\n#define T2_STRDIN(rt,rt2,rn,im)\ttorrri8(THUMB2_STRDI,rn,rt,rt2,im)\n\n#define _CC_LDMIA(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L|ARM_M_I,rn,im)\n#define _LDMIA(rn,im)\t\t_CC_LDMIA(ARM_CC_AL,rn,im)\n#define _CC_LDM(cc,rn,im)\t_CC_LDMIA(cc,rn,im)\n#define _LDM(rn,im)\t\t_LDMIA(rn,im)\n#define T1_LDMIA(rn,im)\t\t_jit_W(THUMB_LDMIA|(_u3(rn)<<8)|im)\n#define T2_LDMIA(rn,im)\t\ttorl(THUMB2_LDMIA,rn,im)\n#define _CC_LDMIA_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_U,rn,im)\n#define _LDMIA_U(rn,im)\t\t_CC_LDMIA_U(ARM_CC_AL,rn,im)\n#define _LDM_U(r0,i0)\t\t_LDMIA_U(r0,i0)\n#define _CC_LDMIB(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B,rn,im)\n#define _LDMIB(rn,im)\t\t_CC_LDMIB(ARM_CC_AL,rn,im)\n#define _CC_LDMIB_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L|ARM_M_I|ARM_M_B|ARM_M_U,rn,im)\n#define _LDMIB_U(rn,im)\t\t_CC_LDMIB_U(ARM_CC_AL,rn,im)\n#define _CC_LDMDA(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L,rn,im)\n#define _LDMDA(rn,im)\t\t_CC_LDMDA(ARM_CC_AL,rn,im)\n#define _CC_LDMDA_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L|ARM_M_U,rn,im)\n#define _LDMDA_U(rn,im)\t\t_CC_LDMDA_U(ARM_CC_AL,rn,im)\n#define _CC_LDMDB(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L|ARM_M_B,rn,im)\n#define _LDMDB(rn,im)\t\t_CC_LDMDB(ARM_CC_AL,rn,im)\n#  define T2_LDMDB(rn,im)\t\ttorl(THUMB2_LDMDB,rn,im)\n\n#define _CC_LDMDB_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_L|ARM_M_B|ARM_M_U,rn,im)\n#define _LDMDB_U(rn,im)\t\t_CC_LDMDB_U(ARM_CC_AL,rn,im)\n#define _CC_STMIA(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_I,rn,im)\n#define _STMIA(rn,im)\t\t_CC_STMIA(ARM_CC_AL,rn,im)\n#define _CC_STM(cc,rn,im)\t_CC_STMIA(cc,rn,im)\n#define _STM(rn,im)\t\t_STMIA(rn,im)\n#define _CC_STMIA_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_I|ARM_M_U,rn,im)\n#define _STMIA_U(rn,im)\t\t_CC_STMIA_U(ARM_CC_AL,rn,im)\n#define _CC_STM_U(cc,rn,im)\t_CC_STMIA_U(cc,rn,im)\n#define _STM_U(rn,im)\t\t_STMIA_U(rn,im)\n#define _CC_STMIB(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_I|ARM_M_B,rn,im)\n#define _STMIB(rn,im)\t\t_CC_STMIB(ARM_CC_AL,rn,im)\n#define _CC_STMIB_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_I|ARM_M_B|ARM_M_U,rn,im)\n#define _STMIB_U(rn,im)\t\t_CC_STMIB_U(ARM_CC_AL,rn,im)\n#define _CC_STMDA(cc,rn,im)\tcorl(cc,ARM_M,rn,im)\n#define _STMDA(rn,im)\t\t_CC_STMDA(ARM_CC_AL,rn,im)\n#define _CC_STMDA_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_U,rn,im)\n#define _STMDA_U(rn,im)\t\t_CC_STMDA_U(ARM_CC_AL,rn,im)\n#define _CC_STMDB(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_B,rn,im)\n#define _STMDB(rn,im)\t\t_CC_STMDB(ARM_CC_AL,rn,im)\n#define _CC_STMDB_U(cc,rn,im)\tcorl(cc,ARM_M|ARM_M_B|ARM_M_U,rn,im)\n#define _STMDB_U(rn,im)\t\t_CC_STMDB_U(ARM_CC_AL,rn,im)\n#define _CC_PUSH(cc,im)\t\t_CC_STMDB_U(cc,JIT_SP,im)\n#define _PUSH(im)\t\t_STMDB_U(JIT_SP,im)\n#define T1_PUSH(im)\t\t_jit_W(THUMB_PUSH|((im&0x4000)>>6)|(im&0xff))\n#define T2_PUSH(im)\t\ttpp(THUMB2_PUSH,im)\n#define _CC_POP(cc,im)\t\t_LDMIA_U(cc,JIT_SP,im)\n#define _POP(im)\t\t_LDMIA_U(JIT_SP,im)\n#define T1_POP(im)\t\t_jit_W(THUMB_POP|((im&0x8000)>>7)|(im&0xff))\n#define T2_POP(im)\t\ttpp(THUMB2_POP,im)\n\n#define _CC_PKHBTI(cc,rd,rn,rm,im) arm_cc_pkh(cc,ARM_PKH,rn,rd,rm,im)\n#define _CC_PKHTBI(cc,rd,rn,rm,im) arm_cc_pkh(cc,ARM_PKH|ARM_ASR,rn,rd,rm,im)\n#define _PKHBTI(rd,rn,rm,im)\t_CC_PKHBTI(ARM_CC_AL,rd,rn,rm,im)\n#define _PKHTBI(rd,rn,rm,im)\t_CC_PKHTBI(ARM_CC_AL,rd,rn,rm,im)\n#define _PKHBT(rd,rn,rm)\t_CC_PKHBTI(ARM_CC_AL,rd,rn,rm,0)\n#define _PKHTB(rd,rn,rm)\t_CC_PKHTBI(ARM_CC_AL,rd,rn,rm,0)\n\nstatic int\nencode_thumb_immediate(unsigned int v)\n{\n    int\t\t\ti;\n    unsigned int\tm;\n    unsigned int\tn;\n    /* 00000000 00000000 00000000 abcdefgh */\n    if ((v & 0xff) == v)\n\treturn (v);\n    /* 00000000 abcdefgh 00000000 abcdefgh */\n    if ((v & 0xff00ff) == v && ((v & 0xff0000) >> 16) == (v & 0xff))\n\treturn ((v & 0xff) | (1 << 12));\n    /* abcdefgh 00000000 abcdefgh 00000000 */\n    if (((v & 0xffff0000) >> 16) == (v & 0xffff) && (v & 0xff) == 0)\n\treturn ((v & 0x000000ff) | (2 << 12));\n    /* abcdefgh abcdefgh abcdefgh abcdefgh */\n    if ( (v &    0xff)        == ((v &     0xff00) >>  8) &&\n\t((v &   0xff00) >> 8) == ((v &   0xff0000) >> 16) &&\n\t((v & 0xff0000) << 8) ==  (v & 0xff000000))\n\treturn ((v & 0xff) | (3 << 12));\n    /* 1bcdefgh << 24 ... 1bcdefgh << 1 */\n    for (i = 8, m = 0xff000000, n = 0x80000000;\n\t i < 23; i++, m >>= 1,  n >>= 1) {\n\tif ((v & m) == v && (v & n)) {\n\t    v >>= 32 - i;\n\t    if (!(i & 1))\n\t\tv &= 0x7f;\n\t    i >>= 1;\n\t    return (((i & 7) << 12) | ((i & 8) << 23) | v);\n\t}\n    }\n    return (-1);\n}\n\nstatic int\nencode_thumb_word_immediate(unsigned int v)\n{\n    if ((v & 0xfffff000) == 0)\n\treturn (((v & 0x800) << 15) | ((v & 0x700) << 4) | (v & 0xff));\n    return (-1);\n}\n\nstatic int\nencode_thumb_jump(int v)\n{\n    int\t\ts, i1, i2, j1, j2;\n    if (v >= (int)-0x800000 && v <= 0x7fffff) {\n\ts  = !!(v & 0x800000);\n\ti1 = !!(v & 0x400000);\n\ti2 = !!(v & 0x200000);\n\tj1 = s ? i1 : !i1;\n\tj2 = s ? i2 : !i2;\n\treturn ((s<<26)|((v&0x1ff800)<<5)|(j1<<13)|(j2<<11)|(v&0x7ff));\n    }\n    return (-1);\n}\n\nstatic int\nencode_thumb_cc_jump(int v)\n{\n    int\t\ts, j1, j2;\n    if (v >= (int)-0x80000 && v <= 0x7ffff) {\n\ts  = !!(v & 0x80000);\n\tj1 = !!(v & 0x20000);\n\tj2 = !!(v & 0x40000);\n\treturn ((s<<26)|((v&0x1f800)<<5)|(j1<<13)|(j2<<11)|(v&0x7ff));\n    }\n    return (-1);\n}\n\n#if !NAN_TO_INT_IS_ZERO\nstatic int\nencode_thumb_shift(int v, int type)\n{\n    switch (type) {\n\tcase ARM_ASR:\n\tcase ARM_LSL:\n\tcase ARM_LSR:\t\ttype >>= 1;\tbreak;\n\tdefault:\t\tassert(!\"handled shift\");\n    }\n    assert(v >= 0 && v <= 31);\n    return (((v & 0x1c) << 10) | ((v & 3) << 6) | type);\n}\n#endif\n\n#define thumb2_orri(o,rn,rd,im)\t\t_torri(_jit,o,rn,rd,im)\n#define torri(o,rn,rt,im)\t\t_torri(_jit,o,rn,rt,im)\n__jit_inline void\n_torri(jit_state_t _jit, int o, int rn, int rd, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o  & 0x0c0f7fff));\n    assert(!(im & 0xfbff8f00));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rd)<<8)|im;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define torri8(o,rn,rt,im)\t\t_torri8(_jit,o,rn,rt,im)\n__jit_inline void\n_torri8(jit_state_t _jit, int o, int rn, int rt, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o  & 0x000ff0ff));\n    assert(!(im & 0xffffff00));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|im;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define torri12(o,rn,rt,im)\t\t_torri12(_jit,o,rn,rt,im)\n__jit_inline void\n_torri12(jit_state_t _jit, int o, int rn, int rt, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o  & 0x000fffff));\n    assert(!(im & 0xfffff000));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|im;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define toriw(o,rd,im)\t\t\t_toriw(_jit,o,rd,im)\n__jit_inline void\n_toriw(jit_state_t _jit, int o, int rd, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o  & 0x40f7fff));\n    assert(!(im & 0xffff0000));\n    thumb.i = o|((im&0xf000)<<4)|((im&0x800)<<15)|((im&0x700)<<4)|(_u4(rd)<<8)|(im&0xff);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define torrr(o,rn,rd,rm)\t\t_torrr(_jit,o,rn,rd,rm)\n__jit_inline void\n_torrr(jit_state_t _jit, int o, int rn, int rd, int rm)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0xf0f0f));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rd)<<8)|_u4(rm);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define torrrs(o,rn,rd,rm,im)\t\t_torrrs(_jit,o,rn,rd,rm,im)\n__jit_inline void\n_torrrs(jit_state_t _jit, int o, int rn, int rd, int rm, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o  & 0x000f0f0f));\n    assert(!(im & 0xffff8f0f));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rd)<<8)|im|_u4(rm);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define torxr(o,rn,rt,rm)\t\t_torxr(_jit,o,rn,rt,rm)\n__jit_inline void\n_torxr(jit_state_t _jit, int o, int rn, int rt, int rm)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0xf0f0f));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|_u4(rm);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define torrrr(o,rn,rl,rh,rm)\t\t_torrrr(_jit,o,rn,rl,rh,rm)\n__jit_inline void\n_torrrr(jit_state_t _jit, int o, int rn, int rl, int rh, int rm)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0x000fff0f));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rl)<<12)|(_u4(rh)<<8)|_u4(rm);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define torrri8(o,rn,rt,rt2,im)\t\t_torrri8(_jit,o,rn,rt,rt2,im)\n__jit_inline void\n_torrri8(jit_state_t _jit, int o, int rn, int rt, int rt2, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o  & 0x000fffff));\n    assert(!(im & 0xffffff00));\n    thumb.i = o|(_u4(rn)<<16)|(_u4(rt)<<12)|(_u4(rt2)<<8)|im;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define tc8(cc,im)\t\t\t_tc8(_jit,cc,im)\n__jit_inline void\n_tc8(jit_state_t _jit, int cc, int im)\n{\n    assert(!(cc & 0x0fffffff));\n    assert(cc != ARM_CC_AL && cc != ARM_CC_NV);\n    assert(_s8P(im));\n    _jit_W(THUMB_CC_B|(cc>>20)|(im&0xff));\n}\n\n#define t11(im)\t\t\t\t_t11(_jit,im)\n__jit_inline void\n_t11(jit_state_t _jit, int im)\n{\n    assert(!(im & 0xfffff800));\n    _jit_W(THUMB_B|im);\n}\n\n#define tcb(cc,im)\t\t\t_tcb(_jit,cc,im)\n__jit_inline void\n_tcb(jit_state_t _jit, int cc, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(cc & 0xfffffff));\n    assert(cc != ARM_CC_AL && cc != ARM_CC_NV);\n    cc = ((unsigned)cc) >> 6;\n    assert(!(im & (THUMB2_CC_B|cc)));\n    thumb.i = THUMB2_CC_B|cc|im;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define blxi(im)\t\t\t\t_blxi(_jit,im)\n__jit_inline void\n_blxi(jit_state_t _jit, int im)\n{\n    assert(!(im & 0xfe000000));\n    _jit_I(ARM_BLXI|im);\n}\n\n#define tb(o,im)\t\t\t\t_tb(_jit,o,im)\n__jit_inline void\n_tb(jit_state_t _jit, int o, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0x07ff2fff));\n    assert(!(o & im));\n    thumb.i = o|im;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define tshift(o,rd,rm,im)\t\t_tshift(_jit,o,rd,rm,im)\n__jit_inline void\n_tshift(jit_state_t _jit, int o, int rd, int rm, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0x7fcf));\n    assert(im >= 0 && im < 32);\n    thumb.i = o|((im&0x1c)<<10)|(_u4(rd)<<8)|((im&3)<<6)|_u4(rm);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define thumb2_orrr(o,rn,rd,rm)\t\t_thumb2_orrr(_jit,o,rn,rd,rm)\n__jit_inline void\n_thumb2_orrr(jit_state_t _jit, int o, int rn, int rd, int rm)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0x000f0f0f));\n    thumb.i = o | (_u4(rn)<<16) | (_u4(rd)<<8) | _u4(rm);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define thumb2_bfx(o,rn,rd,lsb,width)\t_thumb2_bfx(_jit,o,rn,rd,lsb,width)\n__jit_inline void\n_thumb2_bfx(jit_state_t _jit, int o, int rn, int rd, int lsb, int width)\n{\n    int\t\tmsb;\n    jit_thumb_t\tthumb;\n    assert(!(o & 0x7fdf));\n    assert(lsb >= 0 && lsb < 32 && width >= 0 && width <= 32);\n    msb = lsb + width;\n    if (msb > 31)\n\tmsb = 31;\n    thumb.i = o | (_u4(rn) << 16) | (_u4(rd) << 8) |\n\t      ((msb & 7) << 10) | ((msb & 3) << 5) | msb;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define thumb2_cbxz(o,rn,im)\t\t_thumb2_cbxz(_jit,o,rn,im)\n__jit_inline void\n_thumb2_cbxz(jit_state_t _jit, int o, int rn, int im)\n{\n    assert(!(o & 0x2ff));\n    /* branch forward only */\n    assert(im >= 0 && im < 128 && !(im & 1));\n    im >>= 1;\n    _jit_W(o|((im&0x80)<<5)|((im&0x1f)<<3)|_u3(rn));\n}\n\n#define thumb2_dbg(h,l,im)\t\t_thumb2_dbg(_jit,h,l,im)\n__jit_inline void\n_thumb2_dbg(jit_state_t _jit, int h, int l, int im)\n{\n    assert(!(h & ~0xffff));\n    assert(!(l & 0xffff000f));\n    _jit_WW(h, l | _u4(im));\n}\n\n#define tpp(o,im)\t\t\t_tpp(_jit,o,im)\n__jit_inline void\n_tpp(jit_state_t _jit, int o, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o  & 0x0000ffff));\n    assert(!(im & 0xffff2000));\n    if (o == THUMB2_PUSH)\n\tassert(!(im & 0x8000));\n    assert(__builtin_popcount(im & 0x1fff) > 1);\n    thumb.i = o|im;\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define THUMB2_IT\t\t\t0\n#define THUMB2_ITT\t\t\t1\n#define THUMB2_ITE\t\t\t2\n#define THUMB2_ITTT\t\t\t3\n#define THUMB2_ITET\t\t\t4\n#define THUMB2_ITTE\t\t\t5\n#define THUMB2_ITEE\t\t\t6\n#define THUMB2_ITTTT\t\t\t7\n#define THUMB2_ITETT\t\t\t8\n#define THUMB2_ITTET\t\t\t9\n#define THUMB2_ITEET\t\t\t10\n#define THUMB2_ITTTE\t\t\t11\n#define THUMB2_ITETE\t\t\t12\n#define THUMB2_ITTEE\t\t\t13\n#define THUMB2_ITEEE\t\t\t14\n#define tcit(tc,it)\t\t\t_tcit(_jit,tc,it)\n__jit_inline void\n_tcit(jit_state_t _jit, unsigned int tc, int it)\n{\n    int\t\tc;\n    int\t\tm;\n    c = (tc >> 28) & 1;\n    assert(!(tc & 0xfffffff) && tc != ARM_CC_NV);\n    switch (it) {\n\tcase THUMB2_IT:\t\tm =   1<<3; \t\t\tbreak;\n\tcase THUMB2_ITT:\tm =  (c<<3)| (1<<2);\t\tbreak;\n\tcase THUMB2_ITE:\tm = (!c<<3)| (1<<2);\t\tbreak;\n\tcase THUMB2_ITTT:\tm =  (c<<3)| (c<<2)| (1<<1);\tbreak;\n\tcase THUMB2_ITET:\tm = (!c<<3)| (c<<2)| (1<<1);\tbreak;\n\tcase THUMB2_ITTE:\tm =  (c<<3)|(!c<<2)| (1<<1);\tbreak;\n\tcase THUMB2_ITEE:\tm = (!c<<3)|(!c<<2)| (1<<1);\tbreak;\n\tcase THUMB2_ITTTT:\tm =  (c<<3)| (c<<2)| (c<<1)|1;\tbreak;\n\tcase THUMB2_ITETT:\tm = (!c<<3)| (c<<2)| (c<<1)|1;\tbreak;\n\tcase THUMB2_ITTET:\tm =  (c<<3)|(!c<<2)| (c<<1)|1;\tbreak;\n\tcase THUMB2_ITEET:\tm = (!c<<3)|(!c<<2)| (c<<1)|1;\tbreak;\n\tcase THUMB2_ITTTE:\tm =  (c<<3)| (c<<2)|(!c<<1)|1;\tbreak;\n\tcase THUMB2_ITETE:\tm = (!c<<3)| (c<<2)|(!c<<1)|1;\tbreak;\n\tcase THUMB2_ITTEE:\tm =  (c<<3)|(!c<<2)|(!c<<1)|1;\tbreak;\n\tcase THUMB2_ITEEE:\tm = (!c<<3)|(!c<<2)|(!c<<1)|1;\tbreak;\n\tdefault:\t\tassert(!\"valid it code!\");\n    }\n    assert(m && (tc != ARM_CC_AL || !(m & (m - 1))));\n    _jit_W(0xbf00 | (tc >> 24) | m);\n}\n#define _IT(cc)\t\t\t\ttcit(cc,THUMB2_IT)\n#define _ITT(cc)\t\t\ttcit(cc,THUMB2_ITT)\n#define _ITE(cc)\t\t\ttcit(cc,THUMB2_ITE)\n#define _ITTT(cc)\t\t\ttcit(cc,THUMB2_ITTT)\n#define _ITTE(cc)\t\t\ttcit(cc,THUMB2_ITTE)\n#define _ITET(cc)\t\t\ttcit(cc,THUMB2_ITET)\n#define _ITEE(cc)\t\t\ttcit(cc,THUMB2_ITEE)\n#define _ITTTT(cc)\t\t\ttcit(cc,THUMB2_ITTTT)\n#define _ITETT(cc)\t\t\ttcit(cc,THUMB2_ITETT)\n#define _ITTET(cc)\t\t\ttcit(cc,THUMB2_ITTET)\n#define _ITEET(cc)\t\t\ttcit(cc,THUMB2_ITEET)\n#define _ITTTE(cc)\t\t\ttcit(cc,THUMB2_ITTTE)\n#define _ITETE(cc)\t\t\ttcit(cc,THUMB2_ITETE)\n#define _ITTEE(cc)\t\t\ttcit(cc,THUMB2_ITTEE)\n#define _ITEEE(cc)\t\t\ttcit(cc,THUMB2_ITEEE)\n\n#define torl(o,rn,im)\t\t\t_torl(_jit,o,rn,im)\n__jit_inline void\n_torl(jit_state_t _jit, int o, int rn, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0xf1fff));\n    assert(rn != _R15 || !im || ((o & 0xc000) == 0xc000));\n    assert(!(o & THUMB2_LDM_W) || !(im & (1 << rn)));\n    thumb.i = o | (_u4(rn)<<16) | _u13(im);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define thumb2_mrrc(o,t2,t,cc,o1,m)\t_thumb2_mrrc(_jit,o,t2,t,cc,o1,m)\n__jit_inline void\n_thumb2_mrrc(jit_state_t _jit, int o, int t2, int t, int cc, int o1, int m)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0x03afffff));\n    thumb.i = o|(_u4(t2)<<16)|(_u4(t)<<12)|(_u4(cc)<<8)|(_u4(o1)<<4)|_u4(m);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n#define thumb2_pkh(o,rn,rd,rm,im)\t_thumb2_pkh(_jit,o,rn,rd,rm,im)\n__jit_inline void\n_thumb2_pkh(jit_state_t _jit, int o, int rn, int rd, int rm, int im)\n{\n    jit_thumb_t\tthumb;\n    assert(!(o & 0x7ffcf));\n    thumb.i = o|(_u4(rn)<<16)|((_u5(im)&0x1c)<<10)|\n\t      (_u4(rd)<<12)|((im&3)<<6)|_u4(rm);\n    _jit_WW(thumb.s[0], thumb.s[1]);\n}\n\n/* v6T2, v7 */\n#define THUMB2_BFX\t\t\t0xf3600000\n#define T2_BFC(rd,lsb,width)\t\tthumb2_bfx(THUMB2_BFX,_R15,rd,lsb,width)\n#define T2_BFI(rd,rn,lsb,width)\t\tthumb2_bfx(THUMB2_BFX,rn,rd,lsb,width)\n/* not permitted in IT block */\n#define THUMB2_CBZ\t\t\t0xb100\n#define T2_CBZ(rn,im)\t\t\tthumb2_cbxz(THUMB2_CBZ,rn,im)\n#define THUMB2_CBNZ\t\t\t0xb900\n#define T2_CBNZ(rn,im)\t\t\tthumb2_cbxz(THUMB2_CBNZ,rn,im)\n/* CDP/CDP2 here - same encoding as arm, but can start at \"&3 == 2 offset\" */\n#define THUMB2_CLZ\t\t\t0xfab0f080\n#define T2_CLZ(rd,rm)\t\t\tthumb2_orrr(THUMB2_CLZ,rd,rm,rm)\n\n#endif /* __lightning_asm_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/core.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (arm version)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2011 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_core_arm_h\n#define __lightning_core_arm_h\n\n#define JIT_R_NUM\t\t\t4\nstatic const jit_gpr_t\njit_r_order[JIT_R_NUM] = {\n    _R0, _R1, _R2, _R3\n};\n#define JIT_R(i)\t\t\tjit_r_order[i]\n\n#define JIT_V_NUM\t\t\t4\nstatic const jit_gpr_t\njit_v_order[JIT_V_NUM] = {\n    _R4, _R5, _R6, _R7\n};\n#define JIT_V(i)\t\t\tjit_v_order[i]\n\n#define JIT_FRAMESIZE\t\t\t48\n\n#define jit_no_set_flags()\t\tjit_flags.no_set_flags\n#define jit_armv5_p()\t\t\t(jit_cpu.version >= 5)\n#define jit_armv5e_p()\t\t\t(jit_cpu.version >= 5 && jit_cpu.extend)\n#define jit_armv7r_p()\t\t\t0\n#define jit_swf_p()\t\t\t(jit_cpu.vfp == 0)\n#define jit_hardfp_p()\t\t\tjit_cpu.abi\n\nextern int\t__aeabi_idivmod(int, int);\nextern unsigned\t__aeabi_uidivmod(unsigned, unsigned);\n\n#define jit_nop(n)\t\t\tarm_nop(_jit, n)\n__jit_inline void\narm_nop(jit_state_t _jit, int n)\n{\n    assert(n >= 0);\n    if (jit_thumb_p()) {\n\tfor (; n > 0; n -= 2)\n\t    T1_NOP();\n    }\n    else {\n\tfor (; n > 0; n -= 4)\n\t    _NOP();\n    }\n}\n\n#define jit_movr_i(r0, r1)\t\tarm_movr_i(_jit, r0, r1)\n__jit_inline void\narm_movr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 != r1) {\n\tif (jit_thumb_p())\n\t    T1_MOV(r0, r1);\n\telse\n\t    _MOV(r0, r1);\n    }\n}\n\n#define jit_movi_i(r0, i0)\t\tarm_movi_i(_jit, r0, i0)\n__jit_inline void\narm_movi_i(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    int\t\ti;\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && r0 < 8 && !(i0 & 0xffffff80))\n\t    T1_MOVI(r0, i0);\n\telse if ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_MOVI(r0, i);\n\telse if ((i = encode_thumb_immediate(~i0)) != -1)\n\t    T2_MVNI(r0, i);\n\telse {\n\t    T2_MOVWI(r0, _jit_US(i0));\n\t    if (i0 & 0xffff0000)\n\t\tT2_MOVTI(r0, _jit_US((unsigned)i0 >> 16));\n\t}\n    }\n    else {\n\tif (jit_armv6_p() && !(i0 & 0xffff0000))\n\t    _MOVWI(r0, i0);\n\telse if ((i = encode_arm_immediate(i0)) != -1)\n\t    _MOVI(r0, i);\n\telse if ((i = encode_arm_immediate(~i0)) != -1)\n\t    _MVNI(r0, i);\n\telse if (jit_armv6_p()) {\n\t    _MOVWI(r0, _jit_US(i0));\n\t    if ((i0 & 0xffff0000))\n\t\t_MOVTI(r0, _jit_US((unsigned)i0 >> 16));\n\t}\n\telse {\n\t    int     p0, p1, p2, p3, q0, q1, q2, q3;\n\t    p0 = i0 & 0x000000ff;   p1 = i0 & 0x0000ff00;\n\t    p2 = i0 & 0x00ff0000;   p3 = i0 & 0xff000000;\n\t    i0 = ~i0;\n\t    q0 = i0 & 0x000000ff;   q1 = i0 & 0x0000ff00;\n\t    q2 = i0 & 0x00ff0000;   q3 = i0 & 0xff000000;\n\t    if (!!p0 + !!p1 + !!p2 + !!p3 <= !!q0 + !!q1 + !!q2 + !!q3) {\n\t\t/* prefer no inversion on tie */\n\t\tif (p3) {\n\t\t    _MOVI(r0, encode_arm_immediate(p3));\n\t\t    if (p2) _ORRI(r0, r0, encode_arm_immediate(p2));\n\t\t    if (p1) _ORRI(r0, r0, encode_arm_immediate(p1));\n\t\t    if (p0) _ORRI(r0, r0, p0);\n\t\t}\n\t\telse if (p2) {\n\t\t    _MOVI(r0, encode_arm_immediate(p2));\n\t\t    if (p1) _ORRI(r0, r0, encode_arm_immediate(p1));\n\t\t    if (p0) _ORRI(r0, r0, p0);\n\t\t}\n\t\telse {\n\t\t    _MOVI(r0, encode_arm_immediate(p1));\n\t\t    _ORRI(r0, r0, p0);\n\t\t}\n\t    }\n\t    else {\n\t\tif (q3) {\n\t\t    _MVNI(r0, encode_arm_immediate(q3));\n\t\t    if (q2) _EORI(r0, r0, encode_arm_immediate(q2));\n\t\t    if (q1) _EORI(r0, r0, encode_arm_immediate(q1));\n\t\t    if (q0) _EORI(r0, r0, q0);\n\t\t}\n\t\telse if (q2) {\n\t\t    _MVNI(r0, encode_arm_immediate(q2));\n\t\t    if (q1) _EORI(r0, r0, encode_arm_immediate(q1));\n\t\t    if (q0) _EORI(r0, r0, q0);\n\t\t}\n\t\telse {\n\t\t    _MVNI(r0, encode_arm_immediate(q1));\n\t\t    _EORI(r0, r0, q0);\n\t\t}\n\t    }\n\t}\n    }\n}\n\n#define jit_movi_p(r0, i0)\t\tarm_movi_p(_jit, r0, i0)\n__jit_inline jit_insn *\narm_movi_p(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    jit_insn\t*l;\n    int\t\t im, q0, q1, q2, q3;\n    im = (int)i0; \t\tl = _jit->x.pc;\n    if (jit_thumb_p()) {\n\tT2_MOVWI(r0, _jit_US((int)i0));\n\tT2_MOVTI(r0, _jit_US((int)i0 >> 16));\n    }\n    else {\n\tif (jit_armv6_p()) {\n\t    _MOVWI(r0, _jit_US((unsigned)i0));\n\t    _MOVTI(r0, _jit_US((unsigned)i0 >> 16));\n\t}\n\telse {\n\t    q0 = im & 0x000000ff;\tq1 = im & 0x0000ff00;\n\t    q2 = im & 0x00ff0000;\tq3 = im & 0xff000000;\n\t    _MOVI(r0, encode_arm_immediate(q3));\n\t    _ORRI(r0, r0, encode_arm_immediate(q2));\n\t    _ORRI(r0, r0, encode_arm_immediate(q1));\n\t    _ORRI(r0, r0, q0);\n\t}\n    }\n    return (l);\n}\n\n#define jit_patch_movi(i0, i1)\t\tarm_patch_movi(_jit, i0, i1)\n__jit_inline void\narm_patch_movi(jit_state_t _jit, jit_insn *i0, void *i1)\n{\n    union {\n\tshort\t\t*s;\n\tint\t\t*i;\n\tvoid\t\t*v;\n    } u;\n    jit_thumb_t\t\t thumb;\n    unsigned int\t im;\n    int\t\t\t q0, q1, q2, q3;\n    im = (unsigned int)i1;\t\tu.v = i0;\n    if (jit_thumb_p()) {\n\tq0 = (im & 0xf000) << 4;\n\tq1 = (im & 0x0800) << 15;\n\tq2 = (im & 0x0700) << 4;\n\tq3 =  im & 0x00ff;\n\tcode2thumb(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\tassert(   (thumb.i & 0xfbf00000) == THUMB2_MOVWI);\n\tthumb.i = (thumb.i & 0xfbf00f00) | q0 | q1 | q2 | q3;\n\tthumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\tim >>= 16;\n\tq0 = (im & 0xf000) << 4;\n\tq1 = (im & 0x0800) << 15;\n\tq2 = (im & 0x0700) << 4;\n\tq3 =  im & 0x00ff;\n\tcode2thumb(thumb.s[0], thumb.s[1], u.s[2], u.s[3]);\n\tassert(   (thumb.i & 0xfbf00000) == THUMB2_MOVTI);\n\tthumb.i = (thumb.i & 0xfbf00f00) | q0 | q1 | q2 | q3;\n\tthumb2code(thumb.s[0], thumb.s[1], u.s[2], u.s[3]);\n    }\n    else {\n\tif (jit_armv6_p()) {\n\t    q0 =  im &      0xfff;\n\t    q1 = (im &     0xf000) <<  4;\n\t    q2 = (im &  0xfff0000) >> 16;\n\t    q3 = (im & 0xf0000000) >> 12;\n\t    assert(  (u.i[0] & 0x0ff00000) == (ARM_MOVWI));\n\t    assert(  (u.i[1] & 0x0ff00000) == (ARM_MOVTI));\n\t    u.i[0] = (u.i[0] & 0xfff0f000) | q1 | q0;\n\t    u.i[1] = (u.i[1] & 0xfff0f000) | q3 | q2;\n\t}\n\telse {\n\t    q0 = im & 0x000000ff;\tq1 = im & 0x0000ff00;\n\t    q2 = im & 0x00ff0000;\tq3 = im & 0xff000000;\n\t    assert(  (u.i[0] & 0x0ff00000) == (ARM_MOV|ARM_I));\n\t    u.i[0] = (u.i[0] & 0xfffff000) | encode_arm_immediate(q3);\n\t    assert(  (u.i[1] & 0x0ff00000) == (ARM_ORR|ARM_I));\n\t    u.i[1] = (u.i[1] & 0xfffff000) | encode_arm_immediate(q2);\n\t    assert(  (u.i[2] & 0x0ff00000) == (ARM_ORR|ARM_I));\n\t    u.i[2] = (u.i[2] & 0xfffff000) | encode_arm_immediate(q1);\n\t    assert(  (u.i[3] & 0x0ff00000) == (ARM_ORR|ARM_I));\n\t    u.i[3] = (u.i[3] & 0xfffff000) | encode_arm_immediate(q0);\n\t}\n    }\n}\n\n#define jit_patch_calli(i0, i1)\t\tarm_patch_at(_jit, i0, i1)\n#define jit_patch_at(jump, label)\tarm_patch_at(_jit, jump, label)\n__jit_inline void\narm_patch_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    long\t\t d;\n    union {\n\tshort\t\t*s;\n\tint\t\t*i;\n\tvoid\t\t*v;\n    } u;\n    jit_thumb_t\t\t thumb;\n    u.v = jump;\n    if (jit_thumb_p() && jump >= _jitl.thumb) {\n#if 0\n\t/* this actually matches other patterns, so cannot patch\n\t * automatically short jumps */\n\tif ((u.s[0] & THUMB_CC_B) == THUMB_CC_B) {\n\t    assert(_s8P(d));\n\t    u.s[0] = (u.s[0] & 0xff00) | (d & 0xff);\n\t}\n\telse if ((u.s[0] & THUMB_B) == THUMB_B) {\n\t    assert(_s11P(d));\n\t    u.s[0] = (u.s[0] & 0xf800) | (d & 0x7ff);\n\t}\n\telse\n#endif\n\t{\n\t    code2thumb(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t    if ((thumb.i & THUMB2_B) == THUMB2_B) {\n\t\td = (((long)label - (long)jump) >> 1) - 2;\n\t\tassert(_s24P(d));\n\t\tthumb.i = THUMB2_B | encode_thumb_jump(d);\n\t\tthumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t    }\n\t    else if ((thumb.i & THUMB2_B) == THUMB2_CC_B) {\n\t\td = (((long)label - (long)jump) >> 1) - 2;\n\t\tassert(_s20P(d));\n\t\tthumb.i = THUMB2_CC_B | (thumb.i & 0x3c00000) |\n\t\t\t  encode_thumb_cc_jump(d);\n\t\tthumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t    }\n\t    else if ((thumb.i & 0xfbf08000) == THUMB2_MOVWI)\n\t\tjit_patch_movi(jump, label);\n\t    else\n\t\tassert(!\"handled branch opcode\");\n\t}\n    }\n    else {\n\t/* 0x0e000000 because 0x01000000 is (branch&) link modifier */\n\tif ((u.i[0] & 0x0e000000) == ARM_B) {\n\t    d = (((long)label - (long)jump) >> 2) - 2;\n\t    assert(_s24P(d));\n\t    u.i[0] = (u.i[0] & 0xff000000) | (d & 0x00ffffff);\n\t}\n\telse if (( jit_armv6_p() && (u.i[0] & 0x0ff00000) == ARM_MOVWI) ||\n\t\t (!jit_armv6_p() && (u.i[0] & 0x0ff00000) == (ARM_MOV|ARM_I)))\n\t    jit_patch_movi(jump, label);\n\telse\n\t    assert(!\"handled branch opcode\");\n    }\n}\n\n#define jit_notr_i(r0, r1)\t\tarm_notr_i(_jit, r0, r1)\n__jit_inline void\narm_notr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1) < 8)\n\t    T1_NOT(r0, r1);\n\telse\n\t    T2_NOT(r0, r1);\n    }\n    else\n\t_NOT(r0, r1);\n}\n\n#define jit_negr_i(r0, r1)\t\tarm_negr_i(_jit, r0, r1)\n__jit_inline void\narm_negr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1) < 8)\n\t    T1_RSBI(r0, r1);\n\telse\n\t    T2_RSBI(r0, r1, 0);\n    }\n    else\n\t_RSBI(r0, r1, 0);\n}\n\n#define jit_addr_i(r0, r1, r2)\t\tarm_addr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_addr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8)\n\t    T1_ADD(r0, r1, r2);\n\telse if (r0 == r1 || r0 == r2)\n\t    T1_ADDX(r0, r0 == r1 ? r2 : r1);\n\telse\n\t    T2_ADD(r0, r1, r2);\n    }\n    else\n\t_ADD(r0, r1, r2);\n}\n\n#define jit_addi_i(r0, r1, i0)\t\tarm_addi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_addi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1) < 8 && !(i0 & ~7))\n\t    T1_ADDI3(r0, r1, i0);\n\telse if (!jit_no_set_flags() && (r0|r1) < 8 && !(-i0 & ~7))\n\t    T1_SUBI3(r0, r1, -i0);\n\telse if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(i0 & ~0xff))\n\t    T1_ADDI8(r0, i0);\n\telse if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(-i0 & ~0xff))\n\t    T1_SUBI8(r0, -i0);\n\telse if ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_ADDI(r0, r1, i);\n\telse if ((i = encode_thumb_immediate(-i0)) != -1)\n\t    T2_SUBI(r0, r1, i);\n\telse if ((i = encode_thumb_word_immediate(i0)) != -1)\n\t    T2_ADDWI(r0, r1, i);\n\telse if ((i = encode_thumb_word_immediate(-i0)) != -1)\n\t    T2_SUBWI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_ADD(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _ADDI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _SUBI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _ADD(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_addcr_ui(r0, r1, r2)\tarm_addcr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_addcr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\t/* thumb auto set carry if not inside IT block */\n\tif ((r0|r1|r2) < 8)\n\t    T1_ADD(r0, r1, r2);\n\telse\n\t    T2_ADDS(r0, r1, r2);\n    }\n    else\n\t_ADDS(r0, r1, r2);\n}\n\n#define jit_addci_ui(r0, r1, i0)\tarm_addci_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_addci_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && !(i0 & ~7))\n\t    T1_ADDI3(r0, r1, i0);\n\telse if ((r0|r1) < 8 && !(-i0 & ~7))\n\t    T1_SUBI3(r0, r1, -i0);\n\telse if (r0 < 8 && r0 == r1 && !(i0 & ~0xff))\n\t    T1_ADDI8(r0, i0);\n\telse if (r0 < 8 && r0 == r1 && !(-i0 & ~0xff))\n\t    T1_SUBI8(r0, -i0);\n\telse if ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_ADDSI(r0, r1, i);\n\telse if ((i = encode_thumb_immediate(-i0)) != -1)\n\t    T2_SUBSI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_ADDS(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _ADDSI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _SUBSI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _ADDS(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_addxr_ui(r0, r1, r2)\tarm_addxr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_addxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    /* keep setting carry because don't know last ADC */\n    if (jit_thumb_p()) {\n\t/* thumb auto set carry if not inside IT block */\n\tif ((r0|r1|r2) < 8 && (r0 == r1 || r0 == r2))\n\t    T1_ADC(r0, r0 == r1 ? r2 : r1);\n\telse\n\t    T2_ADCS(r0, r1, r2);\n    }\n    else\n\t_ADCS(r0, r1, r2);\n}\n\n#define jit_addxi_ui(r0, r1, i0)\tarm_addxi_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_addxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_ADCSI(r0, r1, i);\n\telse if ((i = encode_thumb_immediate(-i0)) != -1)\n\t    T2_SBCSI(r0, r1, i);\n\telse {\n\t    int\t\tno_set_flags = jit_no_set_flags();\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_no_set_flags() = 1;\n\t    jit_movi_i(reg, i0);\n\t    jit_no_set_flags() = no_set_flags;\n\t    T2_ADCS(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _ADCSI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _SBCSI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _ADCS(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_subr_i(r0, r1, r2)\t\tarm_subr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_subr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8)\n\t    T1_SUB(r0, r1, r2);\n\telse\n\t    T2_SUB(r0, r1, r2);\n    }\n    else\n\t_SUB(r0, r1, r2);\n}\n\n#define jit_subi_i(r0, r1, i0)\t\tarm_subi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_subi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1) < 8 && !(i0 & ~7))\n\t    T1_SUBI3(r0, r1, i0);\n\telse if (!jit_no_set_flags() && (r0|r1) < 8 && !(-i0 & ~7))\n\t    T1_ADDI3(r0, r1, -i0);\n\telse if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(i0 & ~0xff))\n\t    T1_SUBI8(r0, i0);\n\telse if (!jit_no_set_flags() && r0 < 8 && r0 == r1 && !(-i0 & ~0xff))\n\t    T1_ADDI8(r0, -i0);\n\telse if ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_SUBI(r0, r1, i);\n\telse if ((i = encode_thumb_immediate(-i0)) != -1)\n\t    T2_ADDI(r0, r1, i);\n\telse if ((i = encode_thumb_word_immediate(i0)) != -1)\n\t    T2_SUBWI(r0, r1, i);\n\telse if ((i = encode_thumb_word_immediate(-i0)) != -1)\n\t    T2_ADDWI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_SUB(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _SUBI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _ADDI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _SUB(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_subcr_ui(r0, r1, r2)\tarm_subcr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_subcr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\t/* thumb auto set carry if not inside IT block */\n\tif ((r0|r1|r2) < 8)\n\t    T1_SUB(r0, r1, r2);\n\telse\n\t    T2_SUBS(r0, r1, r2);\n    }\n    else\n\t_SUBS(r0, r1, r2);\n}\n\n#define jit_subci_ui(r0, r1, i0)\tarm_subci_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_subci_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && !(i0 & ~7))\n\t    T1_SUBI3(r0, r1, i0);\n\telse if ((r0|r1) < 8 && !(-i0 & ~7))\n\t    T1_ADDI3(r0, r1, -i0);\n\telse if (r0 < 8 && r0 == r1 && !(i0 & ~0xff))\n\t    T1_SUBI8(r0, i0);\n\telse if (r0 < 8 && r0 == r1 && !(-i0 & ~0xff))\n\t    T1_ADDI8(r0, -i0);\n\telse if ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_SUBSI(r0, r1, i);\n\telse if ((i = encode_thumb_immediate(-i0)) != -1)\n\t    T2_ADDSI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_SUBS(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _SUBSI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _ADDSI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _SUBS(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_subxr_ui(r0, r1, r2)\tarm_subxr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_subxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    /* keep setting carry because don't know last ADC */\n    if (jit_thumb_p()) {\n\t/* thumb auto set carry if not inside IT block */\n\tif ((r0|r1|r2) < 8 && r0 == r1)\n\t    T1_SBC(r0, r2);\n\telse\n\t    T2_SBCS(r0, r1, r2);\n    }\n    else\n\t_SBCS(r0, r1, r2);\n}\n\n#define jit_subxi_ui(r0, r1, i0)\tarm_subxi_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_subxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_SBCSI(r0, r1, i);\n\telse if ((i = encode_thumb_immediate(-i0)) != -1)\n\t    T2_ADCSI(r0, r1, i);\n\telse {\n\t    int\t\tno_set_flags = jit_no_set_flags();\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_no_set_flags() = 1;\n\t    jit_movi_i(reg, i0);\n\t    jit_no_set_flags() = no_set_flags;\n\t    T2_SBCS(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _SBCSI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _ADCSI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _SBCS(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_rsbr_i(r0, r1, r2)\t\tarm_rsbr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_rsbr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p())\n\tT2_RSB(r0, r1, r2);\n    else\n\t_RSB(r0, r1, r2);\n}\n\n#define jit_rsbi_i(r0, r1, i0)\t\tarm_rsbi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_rsbi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif (i0 == 0)\n\t    arm_negr_i(_jit, r0, r1);\n\telse if ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_RSBI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_RSB(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _RSBI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _RSB(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_mulr_i(r0, r1, r2)\t\tarm_mulr_i(_jit, r0, r1, r2)\n#define jit_mulr_ui(r0, r1, r2)\t\tarm_mulr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_mulr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && r0 == r2 && (r0|r1) < 8)\n\t    T1_MUL(r0, r1);\n\telse if (!jit_no_set_flags() && r0 == r1 && (r0|r2) < 8)\n\t    T1_MUL(r0, r2);\n\telse\n\t    T2_MUL(r0, r1, r2);\n    }\n    else {\n\tif (r0 == r1 && !jit_armv6_p()) {\n\t    if (r0 != r2)\n\t\t_MUL(r0, r2, r1);\n\t    else {\n\t\t_MOV(JIT_TMP, r1);\n\t\t_MUL(r0, JIT_TMP, r2);\n\t    }\n\t}\n\telse\n\t    _MUL(r0, r1, r2);\n    }\n}\n\n#define jit_muli_i(r0, r1, i0)\t\tarm_muli_i(_jit, r0, r1, i0)\n#define jit_muli_ui(r0, r1, i0)\t\tarm_muli_i(_jit, r0, r1, i0)\n__jit_inline void\narm_muli_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\treg;\n    reg = r0 != r1 ? r0 : JIT_TMP;\n    jit_movi_i(reg, i0);\n    arm_mulr_i(_jit, r0, r1, reg);\n}\n\n#define jit_hmulr_i(r0, r1, r2)\t\tarm_hmulr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_hmulr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p())\n\tT2_SMULL(JIT_TMP, r0, r1, r2);\n    else {\n\tif (r0 == r1 && !jit_armv6_p()) {\n\t    assert(r2 != JIT_TMP);\n\t    _SMULL(JIT_TMP, r0, r2, r1);\n\t}\n\telse\n\t    _SMULL(JIT_TMP, r0, r1, r2);\n    }\n}\n\n#define jit_hmuli_i(r0, r1, i0)\t\tarm_hmuli_i(_jit, r0, r1, i0)\n__jit_inline void\narm_hmuli_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tassert(r0 != JIT_TMP);\n\tjit_movi_i(JIT_TMP, i0);\n\tT2_SMULL(JIT_TMP, r0, r1, JIT_TMP);\n    }\n    else {\n\tif (r0 != r1 || jit_armv6_p()) {\n\t    jit_movi_i(JIT_TMP, i0);\n\t    _SMULL(JIT_TMP, r0, r1, JIT_TMP);\n\t}\n\telse {\n\t    if (r0 != _R0)\t    reg = _R0;\n\t    else if (r0 != _R1)     reg = _R1;\n\t    else if (r0 != _R2)     reg = _R2;\n\t    else\t\t    reg = _R3;\n\t    _PUSH(1<<reg);\n\t    jit_movi_i(reg, i0);\n\t    _SMULL(JIT_TMP, r0, r1, reg);\n\t    _POP(1<<reg);\n\t}\n    }\n}\n\n#define jit_hmulr_ui(r0, r1, r2)\tarm_hmulr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_hmulr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p())\n\tT2_UMULL(JIT_TMP, r0, r1, r2);\n    else {\n\tif (r0 == r1 && !jit_armv6_p()) {\n\t    assert(r2 != JIT_TMP);\n\t    _UMULL(JIT_TMP, r0, r2, r1);\n\t}\n\telse\n\t    _UMULL(JIT_TMP, r0, r1, r2);\n    }\n}\n\n#define jit_hmuli_ui(r0, r1, i0)\tarm_hmuli_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_hmuli_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tassert(r0 != JIT_TMP);\n\tjit_movi_i(JIT_TMP, i0);\n\tT2_UMULL(JIT_TMP, r0, r1, JIT_TMP);\n    }\n    else {\n\tif (r0 != r1 || jit_armv6_p()) {\n\t    jit_movi_i(JIT_TMP, i0);\n\t    _UMULL(JIT_TMP, r0, r1, JIT_TMP);\n\t}\n\telse {\n\t    if (r0 != _R0)\t    reg = _R0;\n\t    else if (r0 != _R1)     reg = _R1;\n\t    else if (r0 != _R2)     reg = _R2;\n\t    else\t\t    reg = _R3;\n\t    _PUSH(1<<reg);\n\t    jit_movi_i(reg, i0);\n\t    _UMULL(JIT_TMP, r0, r1, reg);\n\t    _POP(1<<reg);\n\t}\n    }\n}\n\nstatic void\narm_divmod(jit_state_t _jit, int div, int sign,\n\t   jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    int\t\t\t d;\n    int\t\t\t l;\n    void\t\t*p;\n    l = 0xf;\n    if ((int)r0 < 4)\n\t/* bogus extra push to align at 8 bytes */\n\tl = (l & ~(1 << r0)) | 0x10;\n    if (jit_thumb_p())\n\tT1_PUSH(l);\n    else\n\t_PUSH(l);\n    if (r1 == _R1 && r2 == _R0) {\n\tjit_movr_i(JIT_FTMP, _R0);\n\tjit_movr_i(_R0, _R1);\n\tjit_movr_i(_R1, JIT_FTMP);\n    }\n    else if (r2 == _R0) {\n\tjit_movr_i(_R1, r2);\n\tjit_movr_i(_R0, r1);\n    }\n    else {\n\tjit_movr_i(_R0, r1);\n\tjit_movr_i(_R1, r2);\n    }\n    if (sign)\t\tp = (void*)__aeabi_idivmod;\n    else\t\tp = (void*)__aeabi_uidivmod;\n    if (!jit_exchange_p()) {\n\tif (jit_thumb_p())\n\t    d = (((int)p - (int)_jit->x.pc) >> 1) - 2;\n\telse\n\t    d = (((int)p - (int)_jit->x.pc) >> 2) - 2;\n\tif (_s24P(d)) {\n\t    if (jit_thumb_p())\n\t\tT2_BLI(encode_thumb_jump(d));\n\t    else\n\t\t_BLI(d & 0x00ffffff);\n\t}\n\telse\n\t    goto fallback;\n    }\n    else {\n    fallback:\n\tjit_movi_i(JIT_FTMP, (int)p);\n\tif (jit_thumb_p())\n\t    T1_BLX(JIT_FTMP);\n\telse\n\t    _BLX(JIT_FTMP);\n    }\n    if (div)\n\tjit_movr_i(r0, _R0);\n    else\n\tjit_movr_i(r0, _R1);\n    if (jit_thumb_p())\n\tT1_POP(l);\n    else\n\t_POP(l);\n}\n\n#define jit_divr_i(r0, r1, r2)\t\tarm_divr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_divr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_armv7r_p() && jit_thumb_p())\n\tT2_SDIV(r0, r1, r2);\n    else\n\tarm_divmod(_jit, 1, 1, r0, r1, r2);\n}\n\n#define jit_divi_i(r0, r1, i0)\t\tarm_divi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_divi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_TMP, i0);\n    arm_divr_i(_jit, r0, r1, JIT_TMP);\n}\n\n#define jit_divr_ui(r0, r1, r2)\t\tarm_divr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_divr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_armv7r_p() && jit_thumb_p())\n\tT2_UDIV(r0, r1, r2);\n    else\n\tarm_divmod(_jit, 1, 0, r0, r1, r2);\n}\n\n#define jit_divi_ui(r0, r1, i0)\t\tarm_divi_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_divi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_movi_i(JIT_TMP, i0);\n    arm_divr_ui(_jit, r0, r1, JIT_TMP);\n}\n\n#define jit_modr_i(r0, r1, r2)\t\tarm_modr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_modr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    arm_divmod(_jit, 0, 1, r0, r1, r2);\n}\n\n#define jit_modi_i(r0, r1, i0)\t\tarm_modi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_modi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_TMP, i0);\n    arm_modr_i(_jit, r0, r1, JIT_TMP);\n}\n\n#define jit_modr_ui(r0, r1, r2)\t\tarm_modr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_modr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    arm_divmod(_jit, 0, 0, r0, r1, r2);\n}\n\n#define jit_modi_ui(r0, r1, i0)\t\tarm_modi_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_modi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_TMP, i0);\n    arm_modr_ui(_jit, r0, r1, JIT_TMP);\n}\n\n#define jit_andr_i(r0, r1, r2)\t\tarm_andr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_andr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2))\n\t    T1_AND(r0, r0 == r1 ? r2 : r1);\n\telse\n\t    T2_AND(r0, r1, r2);\n    }\n    else\n\t_AND(r0, r1, r2);\n}\n\n#define jit_andi_i(r0, r1, i0)\t\tarm_andi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_andi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_ANDI(r0, r1, i);\n\telse if ((i = encode_thumb_immediate(~i0)) != -1)\n\t    T2_BICI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_AND(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _ANDI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(~i0)) != -1)\n\t    _BICI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _AND(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_orr_i(r0, r1, r2)\t\tarm_orr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_orr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2))\n\t    T1_ORR(r0, r0 == r1 ? r2 : r1);\n\telse\n\t    T2_ORR(r0, r1, r2);\n    }\n    else\n\t_ORR(r0, r1, r2);\n}\n\n#define jit_ori_i(r0, r1, i0)\t\tarm_ori_i(_jit, r0, r1, i0)\n__jit_inline void\narm_ori_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_ORRI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_ORR(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _ORRI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _ORR(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_xorr_i(r0, r1, r2)\t\tarm_xorr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_xorr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8 && (r0 == r1 || r0 == r2))\n\t    T1_EOR(r0, r0 == r1 ? r2 : r1);\n\telse\n\t    T2_EOR(r0, r1, r2);\n    }\n    else\n\t_EOR(r0, r1, r2);\n}\n\n#define jit_xori_i(r0, r1, i0)\t\tarm_xori_i(_jit, r0, r1, i0)\n__jit_inline void\narm_xori_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_EORI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    T2_EOR(r0, r1, reg);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _EORI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _EOR(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_lshr_i(r0, r1, r2)\t\tarm_lshr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_lshr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1)\n\t    T1_LSL(r0, r2);\n\telse\n\t    T2_LSL(r0, r1, r2);\n    }\n    else\n\t_LSL(r0, r1, r2);\n}\n\n#define jit_lshi_i(r0, r1, i0)\t\tarm_lshi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_lshi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    assert(i0 >= 0 && i0 <= 31);\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1) < 8)\n\t    T1_LSLI(r0, r1, i0);\n\telse\n\t    T2_LSLI(r0, r1, i0);\n    }\n    else\n\t_LSLI(r0, r1, i0);\n}\n\n#define jit_rshr_i(r0, r1, r2)\t\tarm_rshr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_rshr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1)\n\t    T1_ASR(r0, r2);\n\telse\n\t    T2_ASR(r0, r1, r2);\n    }\n    else\n\t_ASR(r0, r1, r2);\n}\n\n#define jit_rshi_i(r0, r1, i0)\t\tarm_rshi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_rshi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    assert(i0 >= 0 && i0 <= 31);\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1) < 8)\n\t    T1_ASRI(r0, r1, i0);\n\telse\n\t    T2_ASRI(r0, r1, i0);\n    }\n    else\n\t_ASRI(r0, r1, i0);\n}\n\n#define jit_rshr_ui(r0, r1, r2)\t\tarm_rshr_ui(_jit, r0, r1, r2)\n__jit_inline void\narm_rshr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1|r2) < 8 && r0 == r1)\n\t    T1_LSR(r0, r2);\n\telse\n\t    T2_LSR(r0, r1, r2);\n    }\n    else\n\t_LSR(r0, r1, r2);\n}\n\n#define jit_rshi_ui(r0, r1, i0)\t\tarm_rshi_ui(_jit, r0, r1, i0)\n__jit_inline void\narm_rshi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    assert(i0 >= 0 && i0 <= 31);\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (jit_thumb_p()) {\n\tif (!jit_no_set_flags() && (r0|r1) < 8)\n\t    T1_LSRI(r0, r1, i0);\n\telse\n\t    T2_LSRI(r0, r1, i0);\n    }\n    else\n\t_LSRI(r0, r1, i0);\n}\n\n__jit_inline void\narm_ccr(jit_state_t _jit, int ct, int cf,\n\tjit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tassert((ct ^ cf) >> 28 == 1);\n\tif ((r1|r2) < 8)\n\t    T1_CMP(r1, r2);\n\telse if ((r1&r2) & 8)\n\t    T1_CMPX(r1, r2);\n\telse\n\t    T2_CMP(r1, r2);\n\t_ITE(ct);\n\tif (r0 < 8) {\n\t    T1_MOVI(r0, 1);\n\t    T1_MOVI(r0, 0);\n\t}\n\telse {\n\t    T2_MOVI(r0, 1);\n\t    T2_MOVI(r0, 0);\n\t}\n    }\n    else {\n\t_CMP(r1, r2);\n\t_CC_MOVI(ct, r0, 1);\n\t_CC_MOVI(cf, r0, 0);\n    }\n}\n__jit_inline void\narm_cci(jit_state_t _jit, int ct, int cf,\n\tjit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p()) {\n\tif (r1 < 7 && !(i0 & 0xffffff00))\n\t    T1_CMPI(r1, i0);\n\telse if ((i = encode_thumb_immediate(i0)) != -1)\n\t    T2_CMPI(r1, i);\n\telse if ((i = encode_thumb_immediate(-i0)) != -1)\n\t    T2_CMNI(r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    arm_ccr(_jit, ct, cf, r0, r1, reg);\n\t    return;\n\t}\n\t_ITE(ct);\n\tif (r0 < 8) {\n\t    T1_MOVI(r0, 1);\n\t    T1_MOVI(r0, 0);\n\t}\n\telse {\n\t    T2_MOVI(r0, 1);\n\t    T2_MOVI(r0, 0);\n\t}\n    }\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _CMPI(r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _CMNI(r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _CMP(r1, reg);\n\t}\n\t_CC_MOVI(ct, r0, 1);\n\t_CC_MOVI(cf, r0, 0);\n    }\n}\n#define jit_ltr_i(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_LT,ARM_CC_GE,r0,r1,r2)\n#define jit_lti_i(r0, r1, i0)\tarm_cci(_jit,ARM_CC_LT,ARM_CC_GE,r0,r1,i0)\n#define jit_ltr_ui(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_LO,ARM_CC_HS,r0,r1,r2)\n#define jit_lti_ui(r0, r1, i0)\tarm_cci(_jit,ARM_CC_LO,ARM_CC_HS,r0,r1,i0)\n#define jit_ler_i(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_LE,ARM_CC_GT,r0,r1,r2)\n#define jit_lei_i(r0, r1, i0)\tarm_cci(_jit,ARM_CC_LE,ARM_CC_GT,r0,r1,i0)\n#define jit_ler_ui(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_LS,ARM_CC_HI,r0,r1,r2)\n#define jit_lei_ui(r0, r1, i0)\tarm_cci(_jit,ARM_CC_LS,ARM_CC_HI,r0,r1,i0)\n#define jit_eqr_i(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_EQ,ARM_CC_NE,r0,r1,r2)\n#define jit_eqi_i(r0, r1, i0)\tarm_cci(_jit,ARM_CC_EQ,ARM_CC_NE,r0,r1,i0)\n#define jit_ger_i(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_GE,ARM_CC_LT,r0,r1,r2)\n#define jit_gei_i(r0, r1, i0)\tarm_cci(_jit,ARM_CC_GE,ARM_CC_LT,r0,r1,i0)\n#define jit_ger_ui(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_HS,ARM_CC_LO,r0,r1,r2)\n#define jit_gei_ui(r0, r1, i0)\tarm_cci(_jit,ARM_CC_HS,ARM_CC_LO,r0,r1,i0)\n#define jit_gtr_i(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_GT,ARM_CC_LE,r0,r1,r2)\n#define jit_gti_i(r0, r1, i0)\tarm_cci(_jit,ARM_CC_GT,ARM_CC_LE,r0,r1,i0)\n#define jit_gtr_ui(r0, r1, r2)\tarm_ccr(_jit,ARM_CC_HI,ARM_CC_LS,r0,r1,r2)\n#define jit_gti_ui(r0, r1, i0)\tarm_cci(_jit,ARM_CC_HI,ARM_CC_LS,r0,r1,i0)\n\n#define jit_ner_i(r0, r1, r2)\t\tarm_ner_i(_jit, r0, r1, r2)\n__jit_inline void\narm_ner_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p())\n\tarm_ccr(_jit, ARM_CC_NE, ARM_CC_EQ, r0, r1, r2);\n    else {\n\t_SUBS(r0, r1, r2);\n\t_CC_MOVI(ARM_CC_NE, r0, 1);\n    }\n}\n\n#define jit_nei_i(r0, r1, i0)\t\tarm_nei_i(_jit, r0, r1, i0)\n__jit_inline void\narm_nei_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    int\t\ti;\n    jit_gpr_t\treg;\n    if (jit_thumb_p())\n\tarm_cci(_jit, ARM_CC_NE, ARM_CC_EQ, r0, r1, i0);\n    else {\n\tif ((i = encode_arm_immediate(i0)) != -1)\n\t    _SUBSI(r0, r1, i);\n\telse if ((i = encode_arm_immediate(-i0)) != -1)\n\t    _ADDSI(r0, r1, i);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _SUBS(r0, r1, reg);\n\t}\n\t_CC_MOVI(ARM_CC_NE, r0, 1);\n    }\n}\n\n#define jit_jmpr(r0)\t\t\tarm_jmpr(_jit, r0)\n__jit_inline void\narm_jmpr(jit_state_t _jit, jit_gpr_t r0)\n{\n    if (jit_thumb_p())\n\tT1_MOV(_R15, r0);\n    else\n\t_MOV(_R15, r0);\n}\n\n#define jit_jmpi(i0)\t\t\tarm_jmpi(_jit, i0)\n__jit_inline jit_insn *\narm_jmpi(jit_state_t _jit, void *i0)\n{\n    jit_insn\t*l;\n    long\t d;\n    l = _jit->x.pc;\n    if (jit_thumb_p() && _jitl.after_prolog) {\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tif (_s20P(d))\n\t    T2_B(encode_thumb_jump(d));\n\telse {\n\t    jit_movi_p(JIT_TMP, i0);\n\t    jit_jmpr(JIT_TMP);\n\t}\n    }\n    else {\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(ARM_CC_AL, d & 0x00ffffff);\n    }\n    return (l);\n}\n\n__jit_inline jit_insn *\narm_bccr(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_CMP(r0, r1);\n\telse if ((r0&r1) & 8)\n\t    T1_CMPX(r0, r1);\n\telse\n\t    T2_CMP(r0, r1);\n\t/* use only thumb2 conditional as does not know if will be patched */\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\t_CMP(r0, r1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n__jit_inline jit_insn *\narm_bcci(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    int\t\t i;\n    if (jit_thumb_p()) {\n\tif (r0 < 7 && !(i1 & 0xffffff00))\n\t    T1_CMPI(r0, i1);\n\telse if ((i = encode_thumb_immediate(i1)) != -1)\n\t    T2_CMPI(r0, i);\n\telse if ((i = encode_thumb_immediate(-i1)) != -1)\n\t    T2_CMNI(r0, i);\n\telse {\n\t    jit_movi_i(JIT_TMP, i1);\n\t    T2_CMP(r0, JIT_TMP);\n\t}\n\t/* use only thumb2 conditional as does not know if will be patched */\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\tif ((i = encode_arm_immediate(i1)) != -1)\n\t    _CMPI(r0, i);\n\telse if ((i = encode_arm_immediate(-i1)) != -1)\n\t    _CMNI(r0, i);\n\telse {\n\t    jit_movi_i(JIT_TMP, i1);\n\t    _CMP(r0, JIT_TMP);\n\t}\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n#define jit_bltr_i(i0, r0, r1)\t\tarm_bccr(_jit, ARM_CC_LT, i0, r0, r1)\n#define jit_blti_i(i0, r0, i1)\t\tarm_bcci(_jit, ARM_CC_LT, i0, r0, i1)\n#define jit_bltr_ui(i0, r0, r1) \tarm_bccr(_jit, ARM_CC_LO, i0, r0, r1)\n#define jit_blti_ui(i0, r0, i1) \tarm_bcci(_jit, ARM_CC_LO, i0, r0, i1)\n#define jit_bler_i(i0, r0, r1)\t\tarm_bccr(_jit, ARM_CC_LE, i0, r0, r1)\n#define jit_blei_i(i0, r0, i1)\t\tarm_bcci(_jit, ARM_CC_LE, i0, r0, i1)\n#define jit_bler_ui(i0, r0, r1) \tarm_bccr(_jit, ARM_CC_LS, i0, r0, r1)\n#define jit_blei_ui(i0, r0, i1) \tarm_bcci(_jit, ARM_CC_LS, i0, r0, i1)\n#define jit_beqr_i(i0, r0, r1)\t\tarm_bccr(_jit, ARM_CC_EQ, i0, r0, r1)\n#define jit_beqi_i(i0, r0, i1)\t\tarm_bcci(_jit, ARM_CC_EQ, i0, r0, i1)\n#define jit_bger_i(i0, r0, r1)\t\tarm_bccr(_jit, ARM_CC_GE, i0, r0, r1)\n#define jit_bgei_i(i0, r0, i1)\t\tarm_bcci(_jit, ARM_CC_GE, i0, r0, i1)\n#define jit_bger_ui(i0, r0, r1) \tarm_bccr(_jit, ARM_CC_HS, i0, r0, r1)\n#define jit_bgei_ui(i0, r0, i1) \tarm_bcci(_jit, ARM_CC_HS, i0, r0, i1)\n#define jit_bgtr_i(i0, r0, r1)\t\tarm_bccr(_jit, ARM_CC_GT, i0, r0, r1)\n#define jit_bgti_i(i0, r0, i1)\t\tarm_bcci(_jit, ARM_CC_GT, i0, r0, i1)\n#define jit_bgtr_ui(i0, r0, r1) \tarm_bccr(_jit, ARM_CC_HI, i0, r0, r1)\n#define jit_bgti_ui(i0, r0, i1) \tarm_bcci(_jit, ARM_CC_HI, i0, r0, i1)\n#define jit_bner_i(i0, r0, r1)\t\tarm_bccr(_jit, ARM_CC_NE, i0, r0, r1)\n#define jit_bnei_i(i0, r0, i1)\t\tarm_bcci(_jit, ARM_CC_NE, i0, r0, i1)\n\n__jit_inline jit_insn *\narm_baddr(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_ADD(r0, r0, r1);\n\telse\n\t    T2_ADDS(r0, r0, r1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\t_ADDS(r0, r0, r1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n__jit_inline jit_insn *\narm_baddi(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    int\t\t i;\n    if (jit_thumb_p()) {\n\tif (r0 < 8 && !(i1 & ~7))\n\t    T1_ADDI3(r0, r0, i1);\n\telse if (r0 < 8 && !(-i1 & ~7))\n\t    T1_SUBI3(r0, r0, -i1);\n\telse if (r0 < 8 && !(i1 & ~0xff))\n\t    T1_ADDI8(r0, i1);\n\telse if (r0 < 8 && !(-i1 & ~0xff))\n\t    T1_SUBI8(r0, -i1);\n\telse if ((i = encode_thumb_immediate(i1)) != -1)\n\t    T2_ADDSI(r0, r0, i);\n\telse if ((i = encode_thumb_immediate(-i1)) != -1)\n\t    T2_SUBSI(r0, r0, i);\n\telse {\n\t    jit_movi_i(JIT_TMP, i1);\n\t    T2_ADDS(r0, r0, JIT_TMP);\n\t}\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\tif ((i = encode_arm_immediate(i1)) != -1)\n\t    _ADDSI(r0, r0, i);\n\telse if ((i = encode_arm_immediate(-i1)) != -1)\n\t    _SUBSI(r0, r0, i);\n\telse {\n\t    jit_movi_i(JIT_TMP, i1);\n\t    _ADDS(r0, r0, JIT_TMP);\n\t}\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n#define jit_boaddr_i(i0, r0, r1)\tarm_baddr(_jit, ARM_CC_VS, i0, r0, r1)\n#define jit_boaddi_i(i0, r0, i1)\tarm_baddi(_jit, ARM_CC_VS, i0, r0, i1)\n#define jit_boaddr_ui(i0, r0, r1)\tarm_baddr(_jit, ARM_CC_HS, i0, r0, r1)\n#define jit_boaddi_ui(i0, r0, i1)\tarm_baddi(_jit, ARM_CC_HS, i0, r0, i1)\n\n__jit_inline jit_insn *\narm_bsubr(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_SUB(r0, r0, r1);\n\telse\n\t    T2_SUBS(r0, r0, r1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\t_SUBS(r0, r0, r1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n\n__jit_inline jit_insn *\narm_bsubi(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    int\t\t i;\n    if (jit_thumb_p()) {\n\tif (r0 < 8 && !(i1 & ~7))\n\t    T1_SUBI3(r0, r0, i1);\n\telse if (r0 < 8 && !(-i1 & ~7))\n\t    T1_ADDI3(r0, r0, -i1);\n\telse if (r0 < 8 && !(i1 & ~0xff))\n\t    T1_SUBI8(r0, i1);\n\telse if (r0 < 8 && !(-i1 & ~0xff))\n\t    T1_ADDI8(r0, -i1);\n\telse if ((i = encode_thumb_immediate(i1)) != -1)\n\t    T2_SUBSI(r0, r0, i);\n\telse if ((i = encode_thumb_immediate(-i1)) != -1)\n\t    T2_ADDSI(r0, r0, i);\n\telse {\n\t    jit_movi_i(JIT_TMP, i1);\n\t    T2_SUBS(r0, r0, JIT_TMP);\n\t}\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\tif ((i = encode_arm_immediate(i1)) != -1)\n\t    _SUBSI(r0, r0, i);\n\telse if ((i = encode_arm_immediate(-i1)) != -1)\n\t    _ADDSI(r0, r0, i);\n\telse {\n\t    jit_movi_i(JIT_TMP, i1);\n\t    _SUBS(r0, r0, JIT_TMP);\n\t}\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n#define jit_bosubr_i(i0, r0, r1)\tarm_bsubr(_jit, ARM_CC_VS, i0, r0, r1)\n#define jit_bosubi_i(i0, r0, i1)\tarm_bsubi(_jit, ARM_CC_VS, i0, r0, i1)\n#define jit_bosubr_ui(i0, r0, r1)\tarm_bsubr(_jit, ARM_CC_LO, i0, r0, r1)\n#define jit_bosubi_ui(i0, r0, i1)\tarm_bsubi(_jit, ARM_CC_LO, i0, r0, i1)\n\n__jit_inline jit_insn *\narm_bmxr(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_TST(r0, r1);\n\telse\n\t    T2_TST(r0, r1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\tif (jit_armv5_p())\n\t    _TST(r0, r1);\n\telse\n\t    _ANDS(JIT_TMP, r0, r1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n__jit_inline jit_insn *\narm_bmxi(jit_state_t _jit, int cc, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    int\t\t i;\n    if (jit_thumb_p()) {\n\tif ((i = encode_thumb_immediate(i1)) != -1)\n\t    T2_TSTI(r0, i);\n\telse {\n\t    jit_movi_i(JIT_TMP, i1);\n\t    T2_TST(r0, JIT_TMP);\n\t}\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\tif (jit_armv5_p()) {\n\t    if ((i = encode_arm_immediate(i1)) != -1)\n\t\t_TSTI(r0, i);\n\t    else {\n\t\tjit_movi_i(JIT_TMP, i1);\n\t\t_TST(r0, JIT_TMP);\n\t    }\n\t}\n\telse {\n\t    if ((i = encode_arm_immediate(i1)) != -1)\n\t\t_ANDSI(JIT_TMP, r0, i);\n\t    else if ((i = encode_arm_immediate(~i1)) != -1)\n\t\t_BICSI(JIT_TMP, r0, i);\n\t    else {\n\t\tjit_movi_i(JIT_TMP, i1);\n\t\t_ANDS(JIT_TMP, r0, JIT_TMP);\n\t    }\n\t}\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n#define jit_bmsr_i(i0, r0, r1)\t\tarm_bmxr(_jit, ARM_CC_NE, i0, r0, r1)\n#define jit_bmsi_i(i0, r0, i1)\t\tarm_bmxi(_jit, ARM_CC_NE, i0, r0, i1)\n#define jit_bmcr_i(i0, r0, r1)\t\tarm_bmxr(_jit, ARM_CC_EQ, i0, r0, r1)\n#define jit_bmci_i(i0, r0, i1)\t\tarm_bmxi(_jit, ARM_CC_EQ, i0, r0, i1)\n\n#define jit_ldr_c(r0, r1)\t\tarm_ldr_c(_jit, r0, r1)\n__jit_inline void\narm_ldr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_LDRSBI(r0, r1, 0);\n    else\n\t_LDRSBI(r0, r1, 0);\n}\n\n#define jit_ldi_c(r0, i0)\t\tarm_ldi_c(_jit, r0, i0)\n__jit_inline void\narm_ldi_c(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_LDRSBI(r0, JIT_TMP, 0);\n    else\n\t_LDRSBI(r0, JIT_TMP, 0);\n}\n\n#define jit_ldxr_c(r0, r1, r2)\t\tarm_ldxr_c(_jit, r0, r1, r2)\n__jit_inline void\narm_ldxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_LDRSB(r0, r1, r2);\n\telse\n\t    T2_LDRSB(r0, r1, r2);\n    }\n    else\n\t_LDRSB(r0, r1, r2);\n}\n\n#define jit_ldxi_c(r0, r1, i0)\t\tarm_ldxi_c(_jit, r0, r1, i0)\n__jit_inline void\narm_ldxi_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\t\treg;\n    if (jit_thumb_p()) {\n\tif (i0 >= 0 && i0 <= 255)\n\t    T2_LDRSBI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_LDRSBIN(r0, r1, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_LDRSBWI(r0, r1, i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    if ((r0|r1|reg) < 8)\n\t\tT1_LDRSB(r0, r1, reg);\n\t    else\n\t\tT2_LDRSB(r0, r1, reg);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 255)\n\t    _LDRSBI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    _LDRSBIN(r0, r1, -i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _LDRSB(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_ldr_uc(r0, r1)\t\tarm_ldr_uc(_jit, r0, r1)\n__jit_inline void\narm_ldr_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_LDRBI(r0, r1, 0);\n    else\n\t_LDRBI(r0, r1, 0);\n}\n\n#define jit_ldi_uc(r0, i0)\t\tarm_ldi_uc(_jit, r0, i0)\n__jit_inline void\narm_ldi_uc(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_LDRBI(r0, JIT_TMP, 0);\n    else\n\t_LDRBI(r0, JIT_TMP, 0);\n}\n\n#define jit_ldxr_uc(r0, r1, r2)\t\tarm_ldxr_uc(_jit, r0, r1, r2)\n__jit_inline void\narm_ldxr_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_LDRB(r0, r1, r2);\n\telse\n\t    T2_LDRB(r0, r1, r2);\n    }\n    else\n\t_LDRB(r0, r1, r2);\n}\n\n#define jit_ldxi_uc(r0, r1, i0)\t\tarm_ldxi_uc(_jit, r0, r1, i0)\n__jit_inline void\narm_ldxi_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\t\treg;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20)\n\t    T1_LDRBI(r0, r1, i0);\n\telse if (i0 >= 0 && i0 <= 255)\n\t    T2_LDRBI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_LDRBIN(r0, r1, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_LDRBWI(r0, r1, i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    if ((r0|r1|reg) < 8)\n\t\tT1_LDRB(r0, r1, reg);\n\t    else\n\t\tT2_LDRB(r0, r1, reg);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 4095)\n\t    _LDRBI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -4095)\n\t    _LDRBIN(r0, r1, -i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _LDRB(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_ldr_s(r0, r1)\t\tarm_ldr_s(_jit, r0, r1)\n__jit_inline void\narm_ldr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_LDRSHI(r0, r1, 0);\n    else\n\t_LDRSHI(r0, r1, 0);\n}\n\n#define jit_ldi_s(r0, i0)\t\tarm_ldi_s(_jit, r0, i0)\n__jit_inline void\narm_ldi_s(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_LDRSHI(r0, JIT_TMP, 0);\n    else\n\t_LDRSHI(r0, JIT_TMP, 0);\n}\n\n#define jit_ldxr_s(r0, r1, r2)\t\tarm_ldxr_s(_jit, r0, r1, r2)\n__jit_inline void\narm_ldxr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_LDRSH(r0, r1, r2);\n\telse\n\t    T2_LDRSH(r0, r1, r2);\n    }\n    else\n\t_LDRSH(r0, r1, r2);\n}\n\n#define jit_ldxi_s(r0, r1, i0)\t\tarm_ldxi_s(_jit, r0, r1, i0)\n__jit_inline void\narm_ldxi_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\t\treg;\n    if (jit_thumb_p()) {\n\tif (i0 >= 0 && i0 <= 255)\n\t    T2_LDRSHI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_LDRSHIN(r0, r1, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_LDRSHWI(r0, r1, i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    if ((r0|r1|reg) < 8)\n\t\tT1_LDRSH(r0, r1, reg);\n\t    else\n\t\tT2_LDRSH(r0, r1, reg);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 255)\n\t    _LDRSHI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    _LDRSHIN(r0, r1, -i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _LDRSH(r0, r1, reg);\n\t}\n    }\n\n}\n#define jit_ldr_us(r0, r1)\t\tarm_ldr_us(_jit, r0, r1)\n__jit_inline void\narm_ldr_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_LDRHI(r0, r1, 0);\n    else\n\t_LDRHI(r0, r1, 0);\n}\n\n#define jit_ldi_us(r0, i0)\t\tarm_ldi_us(_jit, r0, i0)\n__jit_inline void\narm_ldi_us(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_LDRHI(r0, JIT_TMP, 0);\n    else\n\t_LDRHI(r0, JIT_TMP, 0);\n}\n\n#define jit_ldxr_us(r0, r1, r2)\t\tarm_ldxr_us(_jit, r0, r1, r2)\n__jit_inline void\narm_ldxr_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_LDRH(r0, r1, r2);\n\telse\n\t    T2_LDRH(r0, r1, r2);\n    }\n    else\n\t_LDRH(r0, r1, r2);\n}\n\n#define jit_ldxi_us(r0, r1, i0)\t\tarm_ldxi_us(_jit, r0, r1, i0)\n__jit_inline void\narm_ldxi_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\t\treg;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20)\n\t    T1_LDRHI(r0, r1, i0 >> 1);\n\telse if (i0 >= 0 && i0 <= 255)\n\t    T2_LDRHI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_LDRHIN(r0, r1, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_LDRHWI(r0, r1, i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    if ((r0|r1|reg) < 8)\n\t\tT1_LDRH(r0, r1, reg);\n\t    else\n\t\tT2_LDRH(r0, r1, reg);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 255)\n\t    _LDRHI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    _LDRHIN(r0, r1, -i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _LDRH(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_ldr_i(r0, r1)\t\tarm_ldr_i(_jit, r0, r1)\n__jit_inline void\narm_ldr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_LDRI(r0, r1, 0);\n    else\n\t_LDRI(r0, r1, 0);\n}\n\n#define jit_ldi_i(r0, i0)\t\tarm_ldi_i(_jit, r0, i0)\n__jit_inline void\narm_ldi_i(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_LDRI(r0, JIT_TMP, 0);\n    else\n\t_LDRI(r0, JIT_TMP, 0);\n}\n\n#define jit_ldxr_i(r0, r1, r2)\t\tarm_ldxr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_ldxr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_LDR(r0, r1, r2);\n\telse\n\t    T2_LDR(r0, r1, r2);\n    }\n    else\n\t_LDR(r0, r1, r2);\n}\n\n#define jit_ldxi_i(r0, r1, i0)\t\tarm_ldxi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_ldxi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_gpr_t\t\treg;\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && i0 >= 0 && !(i0 & 3) && (i0 >> 2) < 0x20)\n\t    T1_LDRI(r0, r1, i0 >> 2);\n\telse if (r1 == _R13 && r0 < 8 &&\n\t\t i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255)\n\t    T1_LDRISP(r0, i0 >> 2);\n\telse if (i0 >= 0 && i0 <= 255)\n\t    T2_LDRI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_LDRIN(r0, r1, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_LDRWI(r0, r1, i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    if ((r0|r1|reg) < 8)\n\t\tT1_LDR(r0, r1, reg);\n\t    else\n\t\tT2_LDR(r0, r1, reg);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 4095)\n\t    _LDRI(r0, r1, i0);\n\telse if (i0 < 0 && i0 >= -4095)\n\t    _LDRIN(r0, r1, -i0);\n\telse {\n\t    reg = r0 != r1 ? r0 : JIT_TMP;\n\t    jit_movi_i(reg, i0);\n\t    _LDR(r0, r1, reg);\n\t}\n    }\n}\n\n#define jit_str_c(r0, r1)\t\tarm_str_c(_jit, r0, r1)\n__jit_inline void\narm_str_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_STRBI(r1, r0, 0);\n    else\n\t_STRBI(r1, r0, 0);\n}\n\n#define jit_sti_c(r0, i0)\t\tarm_sti_c(_jit, r0, i0)\n__jit_inline void\narm_sti_c(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_STRBI(r0, JIT_TMP, 0);\n    else\n\t_STRBI(r0, JIT_TMP, 0);\n}\n\n#define jit_stxr_c(r0, r1, r2)\t\tarm_stxr_c(_jit, r0, r1, r2)\n__jit_inline void\narm_stxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_STRB(r2, r1, r0);\n\telse\n\t    T2_STRB(r2, r1, r0);\n    }\n    else\n\t_STRB(r2, r1, r0);\n}\n\n#define jit_stxi_c(r0, r1, i0)\t\tarm_stxi_c(_jit, r0, r1, i0)\n__jit_inline void\narm_stxi_c(jit_state_t _jit, int i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && i0 >= 0 && i0 < 0x20)\n\t    T1_STRBI(r1, r0, i0);\n\telse if (i0 >= 0 && i0 <= 255)\n\t    T2_STRBI(r1, r0, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_STRBIN(r1, r0, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_STRBWI(r1, r0, i0);\n\telse {\n\t    jit_movi_i(JIT_TMP, (int)i0);\n\t    if ((r0|r1|JIT_TMP) < 8)\n\t\tT1_STRB(r1, r0, JIT_TMP);\n\t    else\n\t\tT2_STRB(r1, r0, JIT_TMP);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 4095)\n\t    _STRBI(r1, r0, i0);\n\telse if (i0 < 0 && i0 >= -4095)\n\t    _STRBIN(r1, r0, -i0);\n\telse {\n\t    jit_movi_i(JIT_TMP, i0);\n\t    _STRB(r1, r0, JIT_TMP);\n\t}\n    }\n}\n\n#define jit_str_s(r0, r1)\t\tarm_str_s(_jit, r0, r1)\n__jit_inline void\narm_str_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_STRHI(r1, r0, 0);\n    else\n\t_STRHI(r1, r0, 0);\n}\n\n#define jit_sti_s(r0, i0)\t\tarm_sti_s(_jit, r0, i0)\n__jit_inline void\narm_sti_s(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_STRHI(r0, JIT_TMP, 0);\n    else\n\t_STRHI(r0, JIT_TMP, 0);\n}\n\n#define jit_stxr_s(r0, r1, r2)\t\tarm_stxr_s(_jit, r0, r1, r2)\n__jit_inline void\narm_stxr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_STRH(r2, r1, r0);\n\telse\n\t    T2_STRH(r2, r1, r0);\n    }\n    else\n\t_STRH(r2, r1, r0);\n}\n\n#define jit_stxi_s(r0, r1, i0)\t\tarm_stxi_s(_jit, r0, r1, i0)\n__jit_inline void\narm_stxi_s(jit_state_t _jit, int i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && i0 >= 0 && !(i0 & 1) && (i0 >> 1) < 0x20)\n\t    T1_STRHI(r1, r0, i0 >> 1);\n\telse if (i0 >= 0 && i0 <= 255)\n\t    T2_STRHI(r1, r0, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_STRHIN(r1, r0, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_STRHWI(r1, r0, i0);\n\telse {\n\t    jit_movi_i(JIT_TMP, (int)i0);\n\t    if ((r0|r1|JIT_TMP) < 8)\n\t\tT1_STRH(r1, r0, JIT_TMP);\n\t    else\n\t\tT2_STRH(r1, r0, JIT_TMP);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 255)\n\t    _STRHI(r1, r0, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    _STRHIN(r1, r0, -i0);\n\telse {\n\t    jit_movi_i(JIT_TMP, i0);\n\t    _STRH(r1, r0, JIT_TMP);\n\t}\n    }\n}\n\n#define jit_str_i(r0, r1)\t\tarm_str_i(_jit, r0, r1)\n__jit_inline void\narm_str_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p())\n\tT2_STRI(r1, r0, 0);\n    else\n\t_STRI(r1, r0, 0);\n}\n\n#define jit_sti_i(r0, i0)\t\tarm_sti_i(_jit, r0, i0)\n__jit_inline void\narm_sti_i(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (jit_thumb_p())\n\tT2_STRI(r0, JIT_TMP, 0);\n    else\n\t_STRI(r0, JIT_TMP, 0);\n}\n\n#define jit_stxr_i(r0, r1, r2)\t\tarm_stxr_i(_jit, r0, r1, r2)\n__jit_inline void\narm_stxr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1|r2) < 8)\n\t    T1_STR(r2, r1, r0);\n\telse\n\t    T2_STR(r2, r1, r0);\n    }\n    else\n\t_STR(r2, r1, r0);\n}\n\n#define jit_stxi_i(r0, r1, i0)\t\tarm_stxi_i(_jit, r0, r1, i0)\n__jit_inline void\narm_stxi_i(jit_state_t _jit, int i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8 && i0 >= 0 && !(i0 & 3) && (i0 >> 2) < 0x20)\n\t    T1_STRI(r1, r0, i0 >> 2);\n\telse if (r0 == _R13 && r1 < 8 &&\n\t\t i0 >= 0 && !(i0 & 3) && (i0 >> 2) <= 255)\n\t    T1_STRISP(r1, i0 >> 2);\n\telse if (i0 >= 0 && i0 <= 255)\n\t    T2_STRI(r1, r0, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    T2_STRIN(r1, r0, -i0);\n\telse if (i0 >= 0 && i0 <= 4095)\n\t    T2_STRWI(r1, r0, i0);\n\telse {\n\t    jit_movi_i(JIT_TMP, (int)i0);\n\t    if ((r0|r1|JIT_TMP) < 8)\n\t\tT1_STR(r1, r0, JIT_TMP);\n\t    else\n\t\tT2_STR(r1, r0, JIT_TMP);\n\t}\n    }\n    else {\n\tif (i0 >= 0 && i0 <= 4095)\n\t    _STRI(r1, r0, i0);\n\telse if (i0 < 0 && i0 >= -4095)\n\t    _STRIN(r1, r0, -i0);\n\telse {\n\t    jit_movi_i(JIT_TMP, i0);\n\t    _STR(r1, r0, JIT_TMP);\n\t}\n    }\n}\n\n#if __BYTE_ORDER == __LITTLE_ENDIAN\n/* inline glibc htons (without register clobber) */\n#define jit_ntoh_us(r0, r1)\t\tarm_ntoh_us(_jit, r0, r1)\n__jit_inline void\narm_ntoh_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_REV16(r0, r1);\n\telse\n\t    T2_REV16(r0, r1);\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _REV16(r0, r1);\n\telse {\n\t    _LSLI(JIT_TMP, r1, 24);\n\t    _LSRI(r0, r1, 8);\n\t    _ORR_SI(r0, r0, JIT_TMP, ARM_LSR, 16);\n\t}\n    }\n}\n\n/* inline glibc htonl (without register clobber) */\n#define jit_ntoh_ui(r0, r1)\t\tarm_ntoh_ui(_jit, r0, r1)\n__jit_inline void\narm_ntoh_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_REV(r0, r1);\n\telse\n\t    T2_REV(r0, r1);\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _REV(r0, r1);\n\telse {\n\t    _EOR_SI(JIT_TMP, r1, r1, ARM_ROR, 16);\n\t    _LSRI(JIT_TMP, JIT_TMP, 8);\n\t    _BICI(JIT_TMP, JIT_TMP, encode_arm_immediate(0xff00));\n\t    _EOR_SI(r0, JIT_TMP, r1, ARM_ROR, 8);\n\t}\n    }\n}\n#endif\n\n#define jit_extr_c_i(r0, r1)\t\tarm_extr_c_i(_jit, r0, r1)\n__jit_inline void\narm_extr_c_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_SXTB(r0, r1);\n\telse\n\t    T2_SXTB(r0, r1);\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _SXTB(r0, r1);\n\telse {\n\t    _LSLI(r0, r1, 24);\n\t    _ASRI(r0, r0, 24);\n\t}\n    }\n}\n\n#define jit_extr_c_ui(r0, r1)\t\tarm_extr_c_ui(_jit, r0, r1)\n__jit_inline void\narm_extr_c_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_UXTB(r0, r1);\n\telse\n\t    T2_UXTB(r0, r1);\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _UXTB(r0, r1);\n\telse\n\t    _ANDI(r0, r1, 0xff);\n    }\n}\n\n#define jit_extr_s_i(r0, r1)\t\tarm_extr_s_i(_jit, r0, r1)\n__jit_inline void\narm_extr_s_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_SXTH(r0, r1);\n\telse\n\t    T2_SXTH(r0, r1);\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _SXTH(r0, r1);\n\telse {\n\t    _LSLI(r0, r1, 16);\n\t    _ASRI(r0, r0, 16);\n\t}\n    }\n}\n\n#define jit_extr_s_ui(r0, r1)\t\tarm_extr_s_ui(_jit, r0, r1)\n__jit_inline void\narm_extr_s_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_thumb_p()) {\n\tif ((r0|r1) < 8)\n\t    T1_UXTH(r0, r1);\n\telse\n\t    T2_UXTH(r0, r1);\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _UXTH(r0, r1);\n\telse {\n\t    /* _ANDI(r0, r1, 0xffff) needs more instructions */\n\t    _LSLI(r0, r1, 16);\n\t    _LSRI(r0, r0, 16);\n\t}\n    }\n}\n\n#define jit_allocai(i0)\t\t\tarm_allocai(_jit, i0)\n__jit_inline int\narm_allocai(jit_state_t _jit, int i0)\n{\n    assert(i0 >= 0);\n    _jitl.alloca_offset += i0;\n    jit_patch_movi((jit_insn *)_jitl.stack, (void *)\n\t\t   ((_jitl.alloca_offset + _jitl.stack_length + 7) & -8));\n    return (-_jitl.alloca_offset);\n}\n\n#define jit_prolog(n)\t\t\tarm_prolog(_jit, n)\n__jit_inline void\narm_prolog(jit_state_t _jit, int i0)\n{\n    if (jit_thumb_p()) {\n\t/*  switch to thumb mode (better approach would be to\n\t * or 1 address being called, but no clear distinction\n\t * of what is a pointer to a jit function, or if patching\n\t * a pointer to a jit function) */\n\t_ADDI(_R12, _R15, 1);\n\t_BX(_R12);\n\tif (!_jitl.after_prolog) {\n\t    _jitl.after_prolog = 1;\n\t    _jitl.thumb = _jit->x.pc;\n\t}  \n\tif (jit_hardfp_p()) {\n\t    T2_PUSH((1<<_R4)|(1<<_R5)|(1<<_R6)|(1<<_R7)|(1<<_R8)|(1<<_R9)|\n\t\t    /* previous fp and return address */\n\t\t    (1<<JIT_FP)|(1<<JIT_LR));\n\t    _VPUSH_F64(_D8, 8);\n\t    T2_PUSH(/* arguments (should keep state and only save \"i0\" registers) */\n\t\t    (1<<_R0)|(1<<_R1)|(1<<_R2)|(1<<_R3));\n\t}\n\telse\n\t    T2_PUSH(/* arguments (should keep state and only save \"i0\" registers) */\n\t\t    (1<<_R0)|(1<<_R1)|(1<<_R2)|(1<<_R3)|\n\t\t    (1<<_R4)|(1<<_R5)|(1<<_R6)|(1<<_R7)|(1<<_R8)|(1<<_R9)|\n\t\t    /* previous fp and return address */\n\t\t    (1<<JIT_FP)|(1<<JIT_LR));\n\tT2_MOV(JIT_FP, JIT_SP);\n    }\n    else {\n\tif (jit_hardfp_p()) {\n\t    _PUSH((1<<_R4)|(1<<_R5)|(1<<_R6)|(1<<_R7)|(1<<_R8)|(1<<_R9)|\n\t\t  /* previous fp and return address */\n\t\t  (1<<JIT_FP)|(1<<JIT_LR));\n\t    _VPUSH_F64(_D8, 8);\n\t    _PUSH(/* arguments (should keep state and only save \"i0\" registers) */\n\t\t  (1<<_R0)|(1<<_R1)|(1<<_R2)|(1<<_R3));\n\t}\n\telse\n\t    _PUSH(/* arguments (should keep state and only save \"i0\" registers) */\n\t\t  (1<<_R0)|(1<<_R1)|(1<<_R2)|(1<<_R3)|\n\t\t  (1<<_R4)|(1<<_R5)|(1<<_R6)|(1<<_R7)|(1<<_R8)|(1<<_R9)|\n\t\t  /* previous fp and return address */\n\t\t  (1<<JIT_FP)|(1<<JIT_LR));\n\t_MOV(JIT_FP, JIT_SP);\n    }\n\n    _jitl.nextarg_get = _jitl.nextarg_getf = 0;\n    _jitl.framesize = JIT_FRAMESIZE;\n    if (jit_hardfp_p())\n\t_jitl.framesize += 64;\n\n    /* patch alloca and stack adjustment */\n    _jitl.stack = (int *)_jit->x.pc;\n\n    if (jit_swf_p())\n\t/* 6 soft double precision float registers */\n\t_jitl.alloca_offset = 48;\n    else\n\t_jitl.alloca_offset = 0;\n\n    jit_movi_p(JIT_TMP, (void *)_jitl.alloca_offset);\n    jit_subr_i(JIT_SP, JIT_SP, JIT_TMP);\n    _jitl.stack_length = _jitl.stack_offset = 0;\n}\n\n#define jit_callr(r0)\t\t\tarm_callr(_jit, r0)\nstatic void\narm_callr(jit_state_t _jit, jit_gpr_t r0)\n{\n    if (jit_thumb_p())\n\tT1_BLX(r0);\n    else\n\t_BLX(r0);\n}\n\n#define jit_calli(i0)\t\t\tarm_calli(_jit, i0)\n__jit_inline jit_insn *\narm_calli(jit_state_t _jit, void *i0)\n{\n    jit_insn\t*l;\n    l = _jit->x.pc;\n    jit_movi_p(JIT_TMP, i0);\n    if (jit_thumb_p())\n\tT1_BLX(JIT_TMP);\n    else\n\t_BLX(JIT_TMP);\n    return (l);\n}\n\n#define jit_prepare_i(i0)\t\tarm_prepare_i(_jit, i0)\n__jit_inline void\narm_prepare_i(jit_state_t _jit, int i0)\n{\n    assert(i0 >= 0 && !_jitl.stack_offset && !_jitl.nextarg_put);\n    _jitl.stack_offset = i0 << 2;\n}\n\n#define jit_arg_c()\t\t\tarm_arg_i(_jit)\n#define jit_arg_uc()\t\t\tarm_arg_i(_jit)\n#define jit_arg_s()\t\t\tarm_arg_i(_jit)\n#define jit_arg_us()\t\t\tarm_arg_i(_jit)\n#define jit_arg_i()\t\t\tarm_arg_i(_jit)\n#define jit_arg_ui()\t\t\tarm_arg_i(_jit)\n#define jit_arg_l()\t\t\tarm_arg_i(_jit)\n#define jit_arg_ul()\t\t\tarm_arg_i(_jit)\n#define jit_arg_p()\t\t\tarm_arg_i(_jit)\n__jit_inline int\narm_arg_i(jit_state_t _jit)\n{\n    int\t\tofs = _jitl.nextarg_get++;\n    if (ofs > 3) {\n\tofs = _jitl.framesize;\n\t_jitl.framesize += sizeof(int);\n    }\n    return (ofs);\n}\n\n#define jit_getarg_c(r0, i0)\t\tarm_getarg_c(_jit, r0, i0)\n__jit_inline void\narm_getarg_c(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    if (i0 < 4)\n\ti0 <<= 2;\n#if __BYTE_ORDER == __BIG_ENDIAN\n    i0 += sizeof(int) - sizeof(char);\n#endif\n    jit_ldxi_c(r0, JIT_FP, i0);\n}\n\n#define jit_getarg_uc(r0, i0)\t\tarm_getarg_uc(_jit, r0, i0)\n__jit_inline void\narm_getarg_uc(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    if (i0 < 4)\n\ti0 <<= 2;\n#if __BYTE_ORDER == __BIG_ENDIAN\n    i0 += sizeof(int) - sizeof(char);\n#endif\n    jit_ldxi_uc(r0, JIT_FP, i0);\n}\n\n#define jit_getarg_s(r0, i0)\t\tarm_getarg_s(_jit, r0, i0)\n__jit_inline void\narm_getarg_s(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    if (i0 < 4)\n\ti0 <<= 2;\n#if __BYTE_ORDER == __BIG_ENDIAN\n    i0 += sizeof(int) - sizeof(short);\n#endif\n    jit_ldxi_s(r0, JIT_FP, i0);\n}\n\n#define jit_getarg_us(r0, i0)\t\tarm_getarg_us(_jit, r0, i0)\n__jit_inline void\narm_getarg_us(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    if (i0 < 4)\n\ti0 <<= 2;\n#if __BYTE_ORDER == __BIG_ENDIAN\n    i0 += sizeof(int) - sizeof(short);\n#endif\n    jit_ldxi_us(r0, JIT_FP, i0);\n}\n\n#define jit_getarg_i(r0, i0)\t\tarm_getarg_i(_jit, r0, i0)\n#define jit_getarg_ui(r0, i0)\t\tarm_getarg_i(_jit, r0, i0)\n#define jit_getarg_l(r0, i0)\t\tarm_getarg_i(_jit, r0, i0)\n#define jit_getarg_ul(r0, i0)\t\tarm_getarg_i(_jit, r0, i0)\n#define jit_getarg_p(r0, i0)\t\tarm_getarg_i(_jit, r0, i0)\n__jit_inline void\narm_getarg_i(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    /* arguments are saved in prolog */\n    if (i0 < 4)\n\ti0 <<= 2;\n    jit_ldxi_i(r0, JIT_FP, i0);\n}\n\n#define jit_pusharg_i(r0)\t\tarm_pusharg_i(_jit, r0)\n__jit_inline void\narm_pusharg_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n    assert(ofs < 256);\n    _jitl.stack_offset -= sizeof(int);\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] &= ~(1 << (ofs & 31));\n    /* force 32 bit instruction due to possibly needing to trasform it */\n    if (jit_thumb_p())\n\tT2_STRWI(r0, JIT_SP, 0);\n    else\n\t_STRI(r0, JIT_SP, 0);\n}\n\nstatic void\narm_patch_arguments(jit_state_t _jit)\n{\n    int\t\t reg;\n    int\t\t ioff;\n    int\t\t foff;\n    int\t\t size;\n    int\t\t index;\n    jit_thumb_t\t thumb;\n    int\t\t offset;\n    union {\n\t_ui\t*i;\n\t_us\t*s;\n    } u;\n\n    ioff = foff = 0;\n    for (index = _jitl.nextarg_put - 1, offset = 0; index >= 0; index--) {\n\tif (_jitl.types[index >> 5] & (1 << (index & 31)))\n\t    size = sizeof(double);\n\telse\n\t    size = sizeof(int);\n\tu.i = (_ui*)_jitl.arguments[index];\n\tif (jit_thumb_p()) {\n\t    code2thumb(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t    switch (thumb.i & 0xfff00f00) {\n\t\tcase ARM_CC_AL|ARM_VSTR|ARM_P:\n\t\t    if (jit_hardfp_p()) {\n\t\t\tif (foff < 16) {\n\t\t\t    reg = (thumb.i >> 12) & 0xf;\n\t\t\t    thumb.i = (ARM_CC_AL|ARM_VMOV_F |\n\t\t\t\t       ((foff >> 1) << 12) | reg);\n\t\t\t    if (foff & 1)\n\t\t\t\tthumb.i |= ARM_V_D;\n\t\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t\t    ++foff;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    else {\n\t\t\tif (ioff < 4) {\n\t\t\t    thumb.i = ((thumb.i & 0xfff0ff00) |\n\t\t\t\t       (JIT_FP << 16) | ioff);\n\t\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t\t    ++ioff;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    thumb.i = (thumb.i & 0xffffff00) | (offset >> 2);\n\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t    break;\n\t\tcase ARM_CC_AL|ARM_VSTR|ARM_V_F64|ARM_P:\n\t\t    if (jit_hardfp_p()) {\n\t\t\tif (foff & 1)\n\t\t\t    ++foff;\n\t\t\tif (foff < 16) {\n\t\t\t    reg = (thumb.i >> 12) & 0xf;\n\t\t\t    thumb.i = (ARM_CC_AL|ARM_VMOV_F|ARM_V_F64 |\n\t\t\t\t       ((foff >> 1) << 12) | reg);\n\t\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t\t    foff += 2;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    else {\n\t\t\tif (ioff & 1)\n\t\t\t    ++ioff;\n\t\t\tif (ioff < 4) {\n\t\t\t    thumb.i = ((thumb.i & 0xfff0ff00) |\n\t\t\t\t       (JIT_FP << 16) | ioff);\n\t\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t\t    ioff += 2;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    if (offset & 7)\n\t\t\toffset += sizeof(int);\n\t\t    thumb.i = (thumb.i & 0xffffff00) | (offset >> 2);\n\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t    break;\n\t\tcase THUMB2_STRWI:\n\t\tthumb_stri:\n\t\t    if (size == 8 && (ioff & 1))\n\t\t\t++ioff;\n\t\t    if (ioff < 4) {\n\t\t\tthumb.i = ((thumb.i & 0xfff0f000) |\n\t\t\t\t   (JIT_FP << 16) | (ioff << 2));\n\t\t\tthumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t\t++ioff;\n\t\t\tif (size == 8) {\n\t\t\t    code2thumb(thumb.s[0], thumb.s[1], u.s[2], u.s[3]);\n\t\t\t    thumb.i = ((thumb.i & 0xfff0f000) |\n\t\t\t\t       (JIT_FP << 16) | (ioff << 2));\n\t\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[2], u.s[3]);\n\t\t\t    ++ioff;\n\t\t\t}\n\t\t\tcontinue;\n\t\t    }\n\t\t    if (size == 8 && (offset & 7))\n\t\t\toffset += sizeof(int);\n\t\t    thumb.i = (thumb.i & 0xfffff000) | offset;\n\t\t    thumb2code(thumb.s[0], thumb.s[1], u.s[0], u.s[1]);\n\t\t    if (size == 8) {\n\t\t\tcode2thumb(thumb.s[0], thumb.s[1], u.s[2], u.s[3]);\n\t\t\tthumb.i = (thumb.i & 0xfffff000) | (offset + 4);\n\t\t\tthumb2code(thumb.s[0], thumb.s[1], u.s[2], u.s[3]);\n\t\t    }\n\t\t    break;\n\t\tdefault:\n\t\t    /* offset too large */\n\t\t    if ((thumb.i & 0xfff00000) == THUMB2_STRWI)\n\t\t\tgoto thumb_stri;\n\t\t    abort();\n\t    }\n\t}\n\telse {\n\t    switch (u.i[0] & 0xfff00f00) {\n\t\tcase ARM_CC_AL|ARM_VSTR|ARM_P:\n\t\t    if (jit_hardfp_p()) {\n\t\t\tif (foff < 16) {\n\t\t\t    reg = (u.i[0] >> 12) & 0xf;\n\t\t\t    u.i[0] = (ARM_CC_AL|ARM_VMOV_F |\n\t\t\t\t      ((foff >> 1) << 12) | reg);\n\t\t\t    if (foff & 1)\n\t\t\t\tu.i[0] |= ARM_V_D;\n\t\t\t    ++foff;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    else {\n\t\t\tif (ioff < 4) {\n\t\t\t    u.i[0] = ((u.i[0] & 0xfff0ff00) |\n\t\t\t\t      (JIT_FP << 16) | ioff);\n\t\t\t    ++ioff;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    u.i[0] = (u.i[0] & 0xffffff00) | (offset >> 2);\n\t\t    break;\n\t\tcase ARM_CC_AL|ARM_VSTR|ARM_V_F64|ARM_P:\n\t\t    if (jit_hardfp_p()) {\n\t\t\tif (foff & 1)\n\t\t\t    ++foff;\n\t\t\tif (foff < 16) {\n\t\t\t    reg = (u.i[0] >> 12) & 0xf;\n\t\t\t    u.i[0] = (ARM_CC_AL|ARM_VMOV_F|ARM_V_F64 |\n\t\t\t\t      ((foff >> 1) << 12) | reg);\n\t\t\t    foff += 2;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    else {\n\t\t\tif (ioff & 1)\n\t\t\t    ++ioff;\n\t\t\tif (ioff < 4) {\n\t\t\t    u.i[0] = ((u.i[0] & 0xfff0ff00) |\n\t\t\t\t      (JIT_FP << 16) | ioff);\n\t\t\t    ioff += 2;\n\t\t\t    continue;\n\t\t\t}\n\t\t    }\n\t\t    if (offset & 7)\n\t\t\toffset += sizeof(int);\n\t\t    u.i[0] = (u.i[0] & 0xffffff00) | (offset >> 2);\n\t\t    break;\n\t\tcase ARM_CC_AL|ARM_STRI|ARM_P:\n\t\tarm_stri:\n\t\t    if (size == 8 && (ioff & 1))\n\t\t\t++ioff;\n\t\t    if (ioff < 4) {\n\t\t\tu.i[0] = ((u.i[0] & 0xfff0f000) |\n\t\t\t\t  (JIT_FP << 16) | (ioff << 2));\n\t\t\t++ioff;\n\t\t\tif (size == 8) {\n\t\t\t    u.i[1] = ((u.i[1] & 0xfff0f000) |\n\t\t\t\t      (JIT_FP << 16) | (ioff << 2));\n\t\t\t    ++ioff;\n\t\t\t}\n\t\t\tcontinue;\n\t\t    }\n\t\t    if (size == 8 && (offset & 7))\n\t\t\toffset += sizeof(int);\n\t\t    u.i[0] = (u.i[0] & 0xfffff000) | offset;\n\t\t    if (size == 8)\n\t\t\tu.i[1] = (u.i[1] & 0xfffff000) | (offset + 4);\n\t\t    break;\n\t\tdefault:\n\t\t    /* offset too large */\n\t\t    if ((u.i[0] & 0xfff00000) == (ARM_CC_AL|ARM_STRI|ARM_P))\n\t\t\tgoto arm_stri;\n\t\t    abort();\n\t    }\n\t}\n\toffset += size;\n    }\n    _jitl.reglist = ((1 << ioff) - 1) & 0xf;\n    if (_jitl.stack_length < offset) {\n\t_jitl.stack_length = offset;\n\tjit_patch_movi((jit_insn *)_jitl.stack, (void *)\n\t\t       ((_jitl.alloca_offset +\n\t\t\t _jitl.stack_length + 7) & -8));\n    }\n}\n\n#define jit_finishr(rs)\t\t\tarm_finishr(_jit, rs)\n__jit_inline void\narm_finishr(jit_state_t _jit, jit_gpr_t r0)\n{\n    assert(!_jitl.stack_offset);\n    if (r0 < 4) {\n\tjit_movr_i(JIT_TMP, r0);\n\tr0 = JIT_TMP;\n    }\n    arm_patch_arguments(_jit);\n    _jitl.nextarg_put = 0;\n    if (_jitl.reglist) {\n\tif (jit_thumb_p())\n\t    T2_LDMIA(JIT_FP, _jitl.reglist);\n\telse\n\t    _LDMIA(JIT_FP, _jitl.reglist);\n\t_jitl.reglist = 0;\n    }\n    jit_callr(r0);\n}\n\n#define jit_finish(i0)\t\t\tarm_finishi(_jit, i0)\n__jit_inline jit_insn *\narm_finishi(jit_state_t _jit, void *i0)\n{\n    assert(!_jitl.stack_offset);\n    arm_patch_arguments(_jit);\n    _jitl.nextarg_put = 0;\n    if (_jitl.reglist) {\n\tif (jit_thumb_p())\n\t    T2_LDMIA(JIT_FP, _jitl.reglist);\n\telse\n\t    _LDMIA(JIT_FP, _jitl.reglist);\n\t_jitl.reglist = 0;\n    }\n    return (jit_calli(i0));\n}\n\n#define jit_retval_i(r0)\t\tjit_movr_i(r0, JIT_RET)\n#define jit_ret()\t\t\tarm_ret(_jit)\n__jit_inline void\narm_ret(jit_state_t _jit)\n{\n    /* do not restore arguments */\n    jit_addi_i(JIT_SP, JIT_FP, 16);\n    if (jit_hardfp_p())\n\t_VPOP_F64(_D8, 8);\n    if (jit_thumb_p())\n\tT2_POP(/* callee save */\n\t       (1<<_R4)|(1<<_R5)|(1<<_R6)|(1<<_R7)|(1<<_R8)|(1<<_R9)|\n\t       /* previous fp and return address */\n\t       (1<<JIT_FP)|(1<<JIT_PC));\n    else\n\t_POP(/* callee save */\n\t     (1<<_R4)|(1<<_R5)|(1<<_R6)|(1<<_R7)|(1<<_R8)|(1<<_R9)|\n\t     /* previous fp and return address */\n\t     (1<<JIT_FP)|(1<<JIT_PC));\n    if (jit_thumb_p() && ((int)_jit->x.pc & 2))\n\tT1_NOP();\n}\n\n/* just to pass make check... */\n#ifdef JIT_NEED_PUSH_POP\n# define jit_pushr_i(r0)\t\tarm_pushr_i(_jit, r0)\n__jit_inline int\narm_pushr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    int\t\toffset;\n    assert(_jitl.pop < sizeof(_jitl.push) / sizeof(_jitl.push[0]));\n    offset = jit_allocai(4);\n    _jitl.push[_jitl.pop++] = offset;\n    jit_stxi_i(offset, JIT_FP, r0);\n}\n\n# define jit_popr_i(r0)\t\t\tarm_popr_i(_jit, r0)\n__jit_inline int\narm_popr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    int\t\toffset;\n    assert(_jitl.pop > 0);\n    offset = _jitl.push[--_jitl.pop];\n    jit_ldxi_i(r0, JIT_FP, offset);\n}\n#endif\n\n#endif /* __lightning_core_arm_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/fp-swf.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tSupport macros for arm software floating-point math\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2011 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n#ifndef __lightning_fp_swf_h\n#define __lightning_fp_swf_h\n\n#include <math.h>\n\n#define swf_off(rn)\t\t\t\t((rn) << 2)\n\nextern float\t__addsf3(float, float);\nextern double\t__adddf3(double, double);\nextern float\t__aeabi_fsub(float, float);\nextern double\t__aeabi_dsub(double, double);\nextern float\t__aeabi_fmul(float, float);\nextern double\t__aeabi_dmul(double, double);\nextern float\t__aeabi_fdiv(float, float);\nextern double\t__aeabi_ddiv(double, double);\nextern float\t__aeabi_i2f(int);\nextern double\t__aeabi_i2d(int);\nextern float\t__aeabi_d2f(double);\nextern double\t__aeabi_f2d(float);\nextern int\t__aeabi_f2iz(double);\nextern int\t__aeabi_d2iz(float);\nextern int\t__aeabi_fcmplt(float, float);\nextern int\t__aeabi_dcmplt(double, double);\nextern int\t__aeabi_fcmple(float, float);\nextern int\t__aeabi_dcmple(double, double);\nextern int\t__aeabi_fcmpeq(float, float);\nextern int\t__aeabi_dcmpeq(double, double);\nextern int\t__aeabi_fcmpge(float, float);\nextern int\t__aeabi_dcmpge(double, double);\nextern int\t__aeabi_fcmpgt(float, float);\nextern int\t__aeabi_dcmpgt(double, double);\nextern int\t__aeabi_fcmpun(float, float);\nextern int\t__aeabi_dcmpun(double, double);\n\n#define swf_call(function, label)\t\t\t\t\t\\\n    do {\t\t\t\t\t\t\t\t\\\n\tint\td;\t\t\t\t\t\t\t\\\n\tif (!jit_exchange_p()) {\t\t\t\t\t\\\n\t    if (jit_thumb_p())\t\t\t\t\t\t\\\n\t\td = (((int)function - (int)_jit->x.pc) >> 1) - 2;\t\\\n\t    else\t\t\t\t\t\t\t\\\n\t\td = (((int)function - (int)_jit->x.pc) >> 2) - 2;\t\\\n\t    if (_s24P(d)) {\t\t\t\t\t\t\\\n\t\tif (jit_thumb_p())\t\t\t\t\t\\\n\t\t    T2_BLI(encode_thumb_jump(d));\t\t\t\\\n\t\telse\t\t\t\t\t\t\t\\\n\t\t    _BLI(d & 0x00ffffff);\t\t\t\t\\\n\t    }\t\t\t\t\t\t\t\t\\\n\t    else\t\t\t\t\t\t\t\\\n\t\tgoto label;\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n\telse {\t\t\t\t\t\t\t\t\\\n\tlabel:\t\t\t\t\t\t\t\t\\\n\t    jit_movi_i(JIT_FTMP, (int)function);\t\t\t\\\n\t    if (jit_thumb_p())\t\t\t\t\t\t\\\n\t\tT1_BLX(JIT_FTMP);\t\t\t\t\t\\\n\t    else\t\t\t\t\t\t\t\\\n\t\t_BLX(JIT_FTMP);\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n    } while (0)\n#define swf_ldrin(rt, rn, im)\t\t\t\t\t\t\\\n    do {\t\t\t\t\t\t\t\t\\\n\tif (jit_thumb_p())\tT2_LDRIN(rt, rn, im);\t\t\t\\\n\telse\t\t\t_LDRIN(rt, rn, im);\t\t\t\\\n    } while (0)\n#define swf_strin(rt, rn, im)\t\t\t\t\t\t\\\n    do {\t\t\t\t\t\t\t\t\\\n\tif (jit_thumb_p())\tT2_STRIN(rt, rn, im);\t\t\t\\\n\telse\t\t\t_STRIN(rt, rn, im);\t\t\t\\\n    } while (0)\n#define swf_push(mask)\t\t\t\t\t\t\t\\\n    do {\t\t\t\t\t\t\t\t\\\n\tif (jit_thumb_p())\tT1_PUSH(mask);\t\t\t\t\\\n\telse\t\t\t_PUSH(mask);\t\t\t\t\\\n    } while (0)\n#define swf_pop(mask)\t\t\t\t\t\t\t\\\n    do {\t\t\t\t\t\t\t\t\\\n\tif (jit_thumb_p())\tT1_POP(mask);\t\t\t\t\\\n\telse\t\t\t_POP(mask);\t\t\t\t\\\n    } while (0)\n#define swf_bici(rt, rn, im)\t\t\t\t\t\t\\\n    do {\t\t\t\t\t\t\t\t\\\n\tif (jit_thumb_p())\t\t\t\t\t\t\\\n\t    T2_BICI(rt, rn, encode_thumb_immediate(im));\t\t\\\n\telse\t\t\t\t\t\t\t\t\\\n\t    _BICI(rt, rn, encode_arm_immediate(im));\t\t\t\\\n    } while (0)\n\n__jit_inline void\nswf_movr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    if (r0 != r1) {\n\tif (r0 == JIT_FPRET)\n\t    /* jit_ret() must follow! */\n\t    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\telse {\n\t    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 8);\n\t    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n\t}\n    }\n}\n\n__jit_inline void\nswf_movr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    if (r0 != r1) {\n\tif (!jit_thumb_p() && jit_armv5e_p()) {\n\t    if (r0 == JIT_FPRET)\n\t\t/* jit_ret() must follow! */\n\t\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t    else {\n\t\t_LDRDIN(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\t\t_STRDIN(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\t    }\n\t}\n\telse {\n\t    if (r0 == JIT_FPRET) {\n\t\t/* jit_ret() must follow! */\n\t\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\t\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\t    }\n\t    else {\n\t\tswf_ldrin(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\t\tswf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 4);\n\t\tswf_strin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\t\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n\t    }\n\t}\n    }\n}\n\n__jit_inline void\nswf_movi_f(jit_state_t _jit, jit_fpr_t r0, float i0)\n{\n    union {\n\tint\ti;\n\tfloat\tf;\n    } u;\n    u.f = i0;\n    if (r0 == JIT_FPRET)\n\t/* jit_ret() must follow! */\n\tjit_movi_i(_R0, u.i);\n    else {\n\tjit_movi_i(JIT_FTMP, u.i);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n    }\n}\n\n__jit_inline void\nswf_movi_d(jit_state_t _jit, jit_fpr_t r0, double i0)\n{\n    union {\n\tint\ti[2];\n\tdouble\td;\n    } u;\n    u.d = i0;\n    if (r0 == JIT_FPRET) {\n\t/* jit_ret() must follow! */\n\tjit_movi_i(_R0, u.i[0]);\n\tjit_movi_i(_R1, u.i[1]);\n    }\n    else {\n\tjit_movi_i(JIT_FTMP, u.i[0]);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n\tjit_movi_i(JIT_FTMP, u.i[1]);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    }\n}\n\n__jit_inline void\nswf_extr_i_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    swf_push(0xf);\n    if (r1 != _R0)\n\tjit_movr_i(_R0, r1);\n    swf_call(__aeabi_i2f, i2f);\n    swf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n    swf_pop(0xf);\n}\n\n__jit_inline void\nswf_extr_i_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    swf_push(0xf);\n    if (r1 != _R0)\n\tjit_movr_i(_R0, r1);\n    swf_call(__aeabi_i2d, i2d);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_STRDIN(_R0, JIT_FP, swf_off(r0) + 8);\n    else {\n\tswf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(_R1, JIT_FP, swf_off(r0) + 4);\n    }\n    swf_pop(0xf);\n}\n\nstatic void\nswf_extr_d_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_push(0xf);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n    }\n    swf_call(__aeabi_d2f, d2f);\n    swf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n    swf_pop(0xf);\n}\n\nstatic void\nswf_extr_f_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_push(0xf);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_call(__aeabi_f2d, f2d);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_STRDIN(_R0, JIT_FP, swf_off(r0) + 8);\n    else {\n\tswf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(_R1, JIT_FP, swf_off(r0) + 4);\n    }\n    swf_pop(0xf);\n}\n\nstatic void\nswf_if(jit_state_t _jit, float (*i0)(float), jit_gpr_t r0, jit_fpr_t r1)\n{\n    int\t\t\t l;\n#if !NAN_TO_INT_IS_ZERO\n    jit_insn\t\t*is_nan;\n    jit_insn\t\t*fast_not_nan;\n    jit_insn\t\t*slow_not_nan;\n#endif\n    l = 0xf;\n    if ((int)r0 < 4)\n\t/* bogus extra push to align at 8 bytes */\n\tl = (l & ~(1 << r0)) | 0x10;\n    swf_push(l);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n#if !NAN_TO_INT_IS_ZERO\n    /* >> based on fragment of __aeabi_fcmpun */\n    jit_lshi_i(JIT_FTMP, _R0, 1);\n    if (jit_thumb_p())\n\ttorrrs(THUMB2_MVN|ARM_S, _R0, JIT_TMP, JIT_FTMP,\n\t       encode_thumb_shift(24, ARM_ASR));\n    else\n\tcorrrs(ARM_CC_AL,ARM_MVN|ARM_S|ARM_ASR, _R0, JIT_TMP, JIT_FTMP, 24);\n    fast_not_nan = _jit->x.pc;\n    if (jit_thumb_p()) {\n\tT2_CC_B(ARM_CC_NE, 0);\n\ttshift(THUMB2_LSLI|ARM_S, _R0, JIT_TMP, 9);\n    }\n    else {\n\t_CC_B(ARM_CC_NE, 0);\n\tcshift(ARM_CC_AL, ARM_S|ARM_LSL, _R0, JIT_TMP, _R0, 9);\n    }\n    slow_not_nan = _jit->x.pc;\n    if (jit_thumb_p())\n\tT2_CC_B(ARM_CC_EQ, 0);\n    else\n\t_CC_B(ARM_CC_EQ, 0);\n    jit_movi_i(r0, 0x80000000);\n    is_nan = _jit->x.pc;\n    if (jit_thumb_p())\n\tT2_B(0);\n    else\n\t_B(ARM_CC_AL, 0);\n    jit_patch(fast_not_nan);\n    jit_patch(slow_not_nan);\n    /* << based on fragment of __aeabi_fcmpun */\n#endif\n    if (i0)\n\tswf_call(i0, fallback);\n    swf_call(__aeabi_f2iz, f2iz);\n    jit_movr_i(r0, _R0);\n#if !NAN_TO_INT_IS_ZERO\n    jit_patch(is_nan);\n#endif\n    swf_pop(l);\n}\n\nstatic void\nswf_id(jit_state_t _jit, double (*i0)(double), jit_gpr_t r0, jit_fpr_t r1)\n{\n    int\t\t\t l;\n#if !NAN_TO_INT_IS_ZERO\n    jit_insn\t\t*is_nan;\n    jit_insn\t\t*fast_not_nan;\n    jit_insn\t\t*slow_not_nan;\n#endif\n    l = 0xf;\n    if ((int)r0 < 4)\n\t/* bogus extra push to align at 8 bytes */\n\tl = (l & ~(1 << r0)) | 0x10;\n    swf_push(l);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n    }\n#if !NAN_TO_INT_IS_ZERO\n    /* >> based on fragment of __aeabi_dcmpun */\n    jit_lshi_i(JIT_TMP, _R1, 1);\n    if (jit_thumb_p())\n\ttorrrs(THUMB2_MVN|ARM_S, _R0, JIT_TMP, JIT_TMP,\n\t       encode_thumb_shift(21, ARM_ASR));\n    else\n\tcorrrs(ARM_CC_AL,ARM_MVN|ARM_S|ARM_ASR, _R0, JIT_TMP, JIT_TMP, 21);\n    fast_not_nan = _jit->x.pc;\n    if (jit_thumb_p()) {\n\tT2_CC_B(ARM_CC_NE, 0);\n\ttorrrs(THUMB2_ORR|ARM_S, _R0, JIT_TMP, _R1,\n\t       encode_thumb_shift(12, ARM_LSL));\n    }\n    else {\n\t_CC_B(ARM_CC_NE, 0);\n\tcorrrs(ARM_CC_AL,ARM_ORR|ARM_S|ARM_LSL, _R0, JIT_TMP, _R1, 12);\n    }\n    slow_not_nan = _jit->x.pc;\n    if (jit_thumb_p())\n\tT2_CC_B(ARM_CC_EQ, 0);\n    else\n\t_CC_B(ARM_CC_EQ, 0);\n    jit_movi_i(r0, 0x80000000);\n    is_nan = _jit->x.pc;\n    if (jit_thumb_p())\n\tT2_B(0);\n    else\n\t_B(0);\n    jit_patch(fast_not_nan);\n    jit_patch(slow_not_nan);\n    /* << based on fragment of __aeabi_dcmpun */\n#endif\n    if (i0)\n\tswf_call(i0, fallback);\n    swf_call(__aeabi_d2iz, d2iz);\n    jit_movr_i(r0, _R0);\n#if !NAN_TO_INT_IS_ZERO\n    jit_patch(is_nan);\n#endif\n    swf_pop(l);\n}\n\n#define swf_rintr_f_i(_jit, r0, r1)\tswf_if(_jit, rintf, r0, r1)\n#define swf_rintr_d_i(_jit, r0, r1)\tswf_id(_jit, rint, r0, r1)\n#define swf_roundr_f_i(_jit, r0, r1)\tswf_if(_jit, roundf, r0, r1)\n#define swf_roundr_d_i(_jit, r0, r1)\tswf_id(_jit, round, r0, r1)\n#define swf_truncr_f_i(_jit, r0, r1)\tswf_if(_jit, (float (*)(float))0, r0, r1)\n#define swf_truncr_d_i(_jit, r0, r1)\tswf_id(_jit, (double (*)(double))0, r0, r1)\n#define swf_ceilr_f_i(_jit, r0, r1)\tswf_if(_jit, ceilf, r0, r1)\n#define swf_ceilr_d_i(_jit, r0, r1)\tswf_id(_jit, ceil, r0, r1)\n#define swf_floorr_f_i(_jit, r0, r1)\tswf_if(_jit, floorf, r0, r1)\n#define swf_floorr_d_i(_jit, r0, r1)\tswf_id(_jit, floor, r0, r1)\n\n__jit_inline void\nswf_absr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 8);\n    swf_bici(JIT_FTMP, JIT_FTMP, 0x80000000);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n}\n\n__jit_inline void\nswf_absr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 4);\n    swf_bici(JIT_FTMP, JIT_FTMP,  0x80000000);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    if (r0 != r1) {\n\tswf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 8);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n    }\n}\n\n__jit_inline void\nswf_negr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 8);\n    jit_xori_i(JIT_FTMP, JIT_FTMP,  0x80000000);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n}\n\n__jit_inline void\nswf_negr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 4);\n    jit_xori_i(JIT_FTMP, JIT_FTMP,  0x80000000);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    if (r0 != r1) {\n\tswf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 8);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n    }\n}\n\nstatic void\nswf_ff(jit_state_t _jit, float (*i0)(float), jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_push(0xf);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_call(i0, fallback);\n    swf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n    swf_pop(0xf);\n}\n\nstatic void\nswf_dd(jit_state_t _jit, double (*i0)(double), jit_fpr_t r0, jit_fpr_t r1)\n{\n    swf_push(0xf);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n    }\n    swf_call(i0, fallback);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_STRDIN(_R0, JIT_FP, swf_off(r0) + 8);\n    else {\n\tswf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(_R1, JIT_FP, swf_off(r0) + 4);\n    }\n    swf_pop(0xf);\n}\n\n#define swf_sqrtr_f(_jit, r0, r1)\tswf_ff(_jit, sqrtf, r0, r1)\n#define swf_sqrtr_d(_jit, r0, r1)\tswf_dd(_jit, sqrt, r0, r1)\n\nstatic void\nswf_fff(jit_state_t _jit, float (*i0)(float, float),\n\t jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_push(0xf);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_ldrin(_R1, JIT_FP, swf_off(r2) + 8);\n    swf_call(i0, fallback);\n    swf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n    swf_pop(0xf);\n}\n\nstatic void\nswf_ddd(jit_state_t _jit, double (*i0)(double, double),\n\t jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_push(0xf);\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t_LDRDIN(_R2, JIT_FP, swf_off(r2) + 8);\n    }\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\tswf_ldrin(_R2, JIT_FP, swf_off(r2) + 8);\n\tswf_ldrin(_R3, JIT_FP, swf_off(r2) + 4);\n    }\n    swf_call(i0, fallback);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_STRDIN(_R0, JIT_FP, swf_off(r0) + 8);\n    else {\n\tswf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(_R1, JIT_FP, swf_off(r0) + 4);\n    }\n    swf_pop(0xf);\n}\n\n#define swf_addr_f(_jit, r0, r1, r2)\tswf_fff(_jit, __addsf3, r0, r1, r2)\n#define swf_addr_d(_jit, r0, r1, r2)\tswf_ddd(_jit, __adddf3, r0, r1, r2)\n#define swf_subr_f(_jit, r0, r1, r2)\tswf_fff(_jit, __aeabi_fsub, r0, r1, r2)\n#define swf_subr_d(_jit, r0, r1, r2)\tswf_ddd(_jit, __aeabi_dsub, r0, r1, r2)\n#define swf_mulr_f(_jit, r0, r1, r2)\tswf_fff(_jit, __aeabi_fmul, r0, r1, r2)\n#define swf_mulr_d(_jit, r0, r1, r2)\tswf_ddd(_jit, __aeabi_dmul, r0, r1, r2)\n#define swf_divr_f(_jit, r0, r1, r2)\tswf_fff(_jit, __aeabi_fdiv, r0, r1, r2)\n#define swf_divr_d(_jit, r0, r1, r2)\tswf_ddd(_jit, __aeabi_ddiv, r0, r1, r2)\n\nstatic void\nswf_iff(jit_state_t _jit, int (*i0)(float, float),\n\tjit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    int\t\t\tl;\n    l = 0xf;\n    if ((int)r0 < 4)\n\t/* bogus extra push to align at 8 bytes */\n\tl = (l & ~(1 << r0)) | 0x10;\n    swf_push(l);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_ldrin(_R1, JIT_FP, swf_off(r2) + 8);\n    swf_call(i0, fallback);\n    jit_movr_i(r0, _R0);\n    swf_pop(l);\n}\n\nstatic void\nswf_idd(jit_state_t _jit, int (*i0)(double, double),\n\tjit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    int\t\t\tl;\n    l = 0xf;\n    if ((int)r0 < 4)\n\t/* bogus extra push to align at 8 bytes */\n\tl = (l & ~(1 << r0)) | 0x10;\n    swf_push(l);\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t_LDRDIN(_R2, JIT_FP, swf_off(r2) + 8);\n    }\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\tswf_ldrin(_R2, JIT_FP, swf_off(r2) + 8);\n\tswf_ldrin(_R3, JIT_FP, swf_off(r2) + 4);\n    }\n    swf_call(i0, fallback);\n    jit_movr_i(r0, _R0);\n    swf_pop(l);\n}\n\n#define swf_ltr_f(_jit, r0, r1, r2)\tswf_iff(_jit, __aeabi_fcmplt,r0,r1,r2)\n#define swf_ltr_d(_jit, r0, r1, r2)\tswf_idd(_jit, __aeabi_dcmplt,r0,r1,r2)\n#define swf_ler_f(_jit, r0, r1, r2)\tswf_iff(_jit, __aeabi_fcmple,r0,r1,r2)\n#define swf_ler_d(_jit, r0, r1, r2)\tswf_idd(_jit, __aeabi_dcmple,r0,r1,r2)\n#define swf_eqr_f(_jit, r0, r1, r2)\tswf_iff(_jit, __aeabi_fcmpeq,r0,r1,r2)\n#define swf_eqr_d(_jit, r0, r1, r2)\tswf_idd(_jit, __aeabi_dcmpeq,r0,r1,r2)\n#define swf_ger_f(_jit, r0, r1, r2)\tswf_iff(_jit, __aeabi_fcmpge,r0,r1,r2)\n#define swf_ger_d(_jit, r0, r1, r2)\tswf_idd(_jit, __aeabi_dcmpge,r0,r1,r2)\n#define swf_gtr_f(_jit, r0, r1, r2)\tswf_iff(_jit, __aeabi_fcmpgt,r0,r1,r2)\n#define swf_gtr_d(_jit, r0, r1, r2)\tswf_idd(_jit, __aeabi_dcmpgt,r0,r1,r2)\n\n__jit_inline void\nswf_ner_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_iff(_jit, __aeabi_fcmpeq, r0, r1, r2);\n    jit_xori_i(r0, r0, 1);\n}\n\n__jit_inline void\nswf_ner_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_idd(_jit, __aeabi_dcmpeq, r0, r1, r2);\n    jit_xori_i(r0, r0, 1);\n}\n\nstatic void\nswf_iunff(jit_state_t _jit, int (*i0)(float, float),\n\t  jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    int\t\t\t l;\n    jit_insn\t\t*i;\n    l = 0xf;\n    if ((int)r0 < 4)\n\t/* bogus extra push to align at 8 bytes */\n\tl = (l & ~(1 << r0)) | 0x10;\n    swf_push(l);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_ldrin(_R1, JIT_FP, swf_off(r2) + 8);\n    swf_call(__aeabi_fcmpun, fcmpun);\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\t_IT(ARM_CC_NE);\n\tif (r0 < 8)\n\t    T1_MOVI(r0, 1);\n\telse\n\t    T2_MOVI(r0, 1);\n\ti = _jit->x.pc;\n\tT2_CC_B(ARM_CC_NE, 0);\n    }\n    else {\n\t_CMPI(_R0, 0);\n\t_CC_MOVI(ARM_CC_NE, r0, 1);\n\ti = _jit->x.pc;\n\t_CC_B(ARM_CC_NE, 0);\n    }\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_ldrin(_R1, JIT_FP, swf_off(r2) + 8);\n    swf_call(i0, fallback);\n    jit_movr_i(r0, _R0);\n    jit_patch(i);\n    swf_pop(l);\n}\n\nstatic void\nswf_iundd(jit_state_t _jit, int (*i0)(double, double),\n\t  jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    int\t\t\t l;\n    jit_insn\t\t*i;\n    l = 0xf;\n    if ((int)r0 < 4)\n\t/* bogus extra push to align at 8 bytes */\n\tl = (l & ~(1 << r0)) | 0x10;\n    swf_push(l);\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t_LDRDIN(_R2, JIT_FP, swf_off(r2) + 8);\n    }\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\tswf_ldrin(_R2, JIT_FP, swf_off(r2) + 8);\n\tswf_ldrin(_R3, JIT_FP, swf_off(r2) + 4);\n    }\n    swf_call(__aeabi_dcmpun, dcmpun);\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\t_IT(ARM_CC_NE);\n\tif (r0 < 8)\n\t    T1_MOVI(r0, 1);\n\telse\n\t    T2_MOVI(r0, 1);\n\ti = _jit->x.pc;\n\tT2_CC_B(ARM_CC_NE, 0);\n    }\n    else {\n\t_CMPI(_R0, 0);\n\t_CC_MOVI(ARM_CC_NE, r0, 1);\n\ti = _jit->x.pc;\n\t_CC_B(ARM_CC_NE, 0);\n    }\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t_LDRDIN(_R2, JIT_FP, swf_off(r2) + 8);\n    }\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\tswf_ldrin(_R2, JIT_FP, swf_off(r2) + 8);\n\tswf_ldrin(_R3, JIT_FP, swf_off(r2) + 4);\n    }\n    swf_call(i0, fallback);\n    jit_movr_i(r0, _R0);\n    jit_patch(i);\n    swf_pop(l);\n}\n\n#define swf_unltr_f(_jit, r0, r1, r2)\tswf_iunff(_jit,__aeabi_fcmplt,r0,r1,r2)\n#define swf_unltr_d(_jit, r0, r1, r2)\tswf_iundd(_jit,__aeabi_dcmplt,r0,r1,r2)\n#define swf_unler_f(_jit, r0, r1, r2)\tswf_iunff(_jit,__aeabi_fcmple,r0,r1,r2)\n#define swf_unler_d(_jit, r0, r1, r2)\tswf_iundd(_jit,__aeabi_dcmple,r0,r1,r2)\n#define swf_uneqr_f(_jit, r0, r1, r2)\tswf_iunff(_jit,__aeabi_fcmpeq,r0,r1,r2)\n#define swf_uneqr_d(_jit, r0, r1, r2)\tswf_iundd(_jit,__aeabi_dcmpeq,r0,r1,r2)\n#define swf_unger_f(_jit, r0, r1, r2)\tswf_iunff(_jit,__aeabi_fcmpge,r0,r1,r2)\n#define swf_unger_d(_jit, r0, r1, r2)\tswf_iundd(_jit,__aeabi_dcmpge,r0,r1,r2)\n#define swf_ungtr_f(_jit, r0, r1, r2)\tswf_iunff(_jit,__aeabi_fcmpgt,r0,r1,r2)\n#define swf_ungtr_d(_jit, r0, r1, r2)\tswf_iundd(_jit,__aeabi_dcmpgt,r0,r1,r2)\n\n__jit_inline void\nswf_ltgtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_iunff(_jit, __aeabi_fcmpeq, r0, r1, r2);\n    jit_xori_i(r0, r0, 1);\n}\n\n__jit_inline void\nswf_ltgtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_iundd(_jit, __aeabi_dcmpeq, r0, r1, r2);\n    jit_xori_i(r0, r0, 1);\n}\n\n__jit_inline void\nswf_ordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_iff(_jit, __aeabi_fcmpun, r0, r1, r2);\n    jit_xori_i(r0, r0, 1);\n}\n\n__jit_inline void\nswf_ordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    swf_idd(_jit, __aeabi_dcmpun, r0, r1, r2);\n    jit_xori_i(r0, r0, 1);\n}\n\n#define swf_unordr_f(_jit, r0, r1, r2)\tswf_iunff(_jit,__aeabi_fcmpun,r0,r1,r2)\n#define swf_unordr_d(_jit, r0, r1, r2)\tswf_iundd(_jit,__aeabi_dcmpun,r0,r1,r2)\n\nstatic jit_insn *\nswf_bff(jit_state_t _jit, int (*i0)(float, float), int cc,\n\tvoid *i1, jit_fpr_t r1, jit_fpr_t r2)\n{\n    jit_insn\t\t*l;\n    int\t\t\t d;\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    swf_push(0xf);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_ldrin(_R1, JIT_FP, swf_off(r2) + 8);\n    swf_call(i0, fallback);\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\t_CMPI(_R0, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n\nstatic jit_insn *\nswf_bdd(jit_state_t _jit, int (*i0)(double, double), int cc,\n\tvoid *i1, jit_fpr_t r1, jit_fpr_t r2)\n{\n    jit_insn\t\t*l;\n    int\t\t\t d;\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    swf_push(0xf);\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t_LDRDIN(_R2, JIT_FP, swf_off(r2) + 8);\n    }\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\tswf_ldrin(_R2, JIT_FP, swf_off(r2) + 8);\n\tswf_ldrin(_R3, JIT_FP, swf_off(r2) + 4);\n    }\n    swf_call(i0, fallback);\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\t_CMPI(_R0, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n\n#define swf_bltr_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmplt,ARM_CC_NE,i0,r0,r1)\n#define swf_bltr_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmplt,ARM_CC_NE,i0,r0,r1)\n#define swf_bler_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmple,ARM_CC_NE,i0,r0,r1)\n#define swf_bler_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmple,ARM_CC_NE,i0,r0,r1)\n#define swf_beqr_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpeq,ARM_CC_NE,i0,r0,r1)\n#define swf_beqr_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpeq,ARM_CC_NE,i0,r0,r1)\n#define swf_bger_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpge,ARM_CC_NE,i0,r0,r1)\n#define swf_bger_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpge,ARM_CC_NE,i0,r0,r1)\n#define swf_bgtr_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpgt,ARM_CC_NE,i0,r0,r1)\n#define swf_bgtr_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpgt,ARM_CC_NE,i0,r0,r1)\n#define swf_bner_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpeq,ARM_CC_EQ,i0,r0,r1)\n#define swf_bner_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpeq,ARM_CC_EQ,i0,r0,r1)\n#define swf_bunltr_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpge,ARM_CC_EQ,i0,r0,r1)\n#define swf_bunltr_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpge,ARM_CC_EQ,i0,r0,r1)\n#define swf_bunler_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpgt,ARM_CC_EQ,i0,r0,r1)\n#define swf_bunler_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpgt,ARM_CC_EQ,i0,r0,r1)\n\nstatic jit_insn *\nswf_bunff(jit_state_t _jit, int eq, void *i1, jit_fpr_t r1, jit_fpr_t r2)\n{\n    int\t\t\t d;\n    jit_insn\t\t*l;\n    jit_insn\t\t*j0;\n    jit_insn\t\t*j1;\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    swf_push(0xf);\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_ldrin(_R1, JIT_FP, swf_off(r2) + 8);\n    swf_call(__aeabi_fcmpun, fcmpun);\n    /* if unordered */\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\tj0 = _jit->x.pc;\n\tT2_CC_B(ARM_CC_NE, 0);\n    }\n    else {\n\t_CMPI(_R0, 0);\n\tj0 = _jit->x.pc;\n\t_CC_B(ARM_CC_NE, 0);\n    }\n    swf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n    swf_ldrin(_R1, JIT_FP, swf_off(r2) + 8);\n    swf_call(__aeabi_fcmpeq, fcmpeq);\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\tj1 = _jit->x.pc;\n\tif (eq) {\n\t    T2_CC_B(ARM_CC_EQ, 0);\n\t    jit_patch(j0);\n\t}\n\telse\n\t    T2_CC_B(ARM_CC_NE, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 1) - 2;\n\tassert(_s24P(d));\n\tT2_B(encode_thumb_jump(d));\n    }\n    else {\n\t_CMPI(_R0, 0);\n\tj1 = _jit->x.pc;\n\tif (eq) {\n\t    _CC_B(ARM_CC_EQ, 0);\n\t    jit_patch(j0);\n\t}\n\telse\n\t    _CC_B(ARM_CC_NE, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_B(d & 0x00ffffff);\n    }\n    if (!eq)\n\tjit_patch(j0);\n    jit_patch(j1);\n    swf_pop(0xf);\n    return (l);\n}\n\nstatic jit_insn *\nswf_bundd(jit_state_t _jit, int eq, void *i1, jit_fpr_t r1, jit_fpr_t r2)\n{\n    int\t\t\t d;\n    jit_insn\t\t*l;\n    jit_insn\t\t*j0;\n    jit_insn\t\t*j1;\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    swf_push(0xf);\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t_LDRDIN(_R2, JIT_FP, swf_off(r2) + 8);\n    }\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\tswf_ldrin(_R2, JIT_FP, swf_off(r2) + 8);\n\tswf_ldrin(_R3, JIT_FP, swf_off(r2) + 4);\n    }\n    swf_call(__aeabi_dcmpun, dcmpun);\n    /* if unordered */\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\tj0 = _jit->x.pc;\n\tT2_CC_B(ARM_CC_NE, 0);\n    }\n    else {\n\t_CMPI(_R0, 0);\n\tj0 = _jit->x.pc;\n\t_CC_B(ARM_CC_NE, 0);\n    }\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(_R0, JIT_FP, swf_off(r1) + 8);\n\t_LDRDIN(_R2, JIT_FP, swf_off(r2) + 8);\n    }\n    else {\n\tswf_ldrin(_R0, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(_R1, JIT_FP, swf_off(r1) + 4);\n\tswf_ldrin(_R2, JIT_FP, swf_off(r2) + 8);\n\tswf_ldrin(_R3, JIT_FP, swf_off(r2) + 4);\n    }\n    swf_call(__aeabi_dcmpeq, dcmpeq);\n    if (jit_thumb_p()) {\n\tT1_CMPI(_R0, 0);\n\tj1 = _jit->x.pc;\n\tif (eq) {\n\t    T2_CC_B(ARM_CC_EQ, 0);\n\t    jit_patch(j0);\n\t}\n\telse\n\t    T2_CC_B(ARM_CC_NE, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 1) - 2;\n\tassert(_s24P(d));\n\tT2_B(encode_thumb_jump(d));\n    }\n    else {\n\t_CMPI(_R0, 0);\n\tj1 = _jit->x.pc;\n\tif (eq) {\n\t    _CC_B(ARM_CC_EQ, 0);\n\t    jit_patch(j0);\n\t}\n\telse\n\t    _CC_B(ARM_CC_NE, 0);\n\tswf_pop(0xf);\n\tl = _jit->x.pc;\n\td = (((int)i1 - (int)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_B(d & 0x00ffffff);\n    }\n    if (!eq)\n\tjit_patch(j0);\n    jit_patch(j1);\n    swf_pop(0xf);\n    return (l);\n}\n\n#define swf_buneqr_f(_jit,i0,r0,r1)\tswf_bunff(_jit,1,i0,r0,r1)\n#define swf_buneqr_d(_jit,i0,r0,r1)\tswf_bundd(_jit,1,i0,r0,r1)\n#define swf_bunger_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmplt,ARM_CC_EQ,i0,r0,r1)\n#define swf_bunger_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmplt,ARM_CC_EQ,i0,r0,r1)\n#define swf_bungtr_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmple,ARM_CC_EQ,i0,r0,r1)\n#define swf_bungtr_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmple,ARM_CC_EQ,i0,r0,r1)\n#define swf_bltgtr_f(_jit,i0,r0,r1)\tswf_bunff(_jit,0,i0,r0,r1)\n#define swf_bltgtr_d(_jit,i0,r0,r1)\tswf_bundd(_jit,0,i0,r0,r1)\n#define swf_bordr_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpun,ARM_CC_EQ,i0,r0,r1)\n#define swf_bordr_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpun,ARM_CC_EQ,i0,r0,r1)\n#define swf_bunordr_f(_jit,i0,r0,r1)\tswf_bff(_jit,__aeabi_fcmpun,ARM_CC_NE,i0,r0,r1)\n#define swf_bunordr_d(_jit,i0,r0,r1)\tswf_bdd(_jit,__aeabi_dcmpun,ARM_CC_NE,i0,r0,r1)\n\n__jit_inline void\nswf_ldr_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    jit_ldr_i(JIT_FTMP, r1);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n}\n\n__jit_inline void\nswf_ldr_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDI(JIT_TMP, r1, 0);\n\t_STRDIN(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n    }\n    else {\n\tjit_ldxi_i(JIT_TMP, r1, 0);\n\tjit_ldxi_i(JIT_FTMP, r1, 4);\n\tswf_strin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    }\n}\n\n__jit_inline void\nswf_ldi_f(jit_state_t _jit, jit_fpr_t r0, void *i0)\n{\n    jit_ldi_i(JIT_FTMP, i0);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n}\n\n__jit_inline void\nswf_ldi_d(jit_state_t _jit, jit_fpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDI(JIT_TMP, JIT_TMP, 0);\n\t_STRDIN(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n    }\n    else {\n\tjit_ldxi_i(JIT_FTMP, JIT_TMP, 4);\n\tjit_ldxi_i(JIT_TMP, JIT_TMP, 0);\n\tswf_strin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    }\n}\n\n__jit_inline void\nswf_ldxr_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_ldxr_i(JIT_TMP, r1, r2);\n    swf_strin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n}\n\n__jit_inline void\nswf_ldxr_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRD(JIT_TMP, r1, r2);\n\t_STRDIN(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n    }\n    else {\n\tjit_addr_i(JIT_TMP, r1, r2);\n\tjit_ldxi_i(JIT_FTMP, JIT_TMP, 4);\n\tjit_ldxi_i(JIT_TMP, JIT_TMP, 0);\n\tswf_strin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    }\n}\n\n__jit_inline void\nswf_ldxi_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_ldxi_i(JIT_FTMP, r1, i0);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n}\n\n__jit_inline void\nswf_ldxi_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\tif (i0 >= 0 && i0 <= 255)\n\t    _LDRDI(JIT_TMP, r1, i0);\n\telse if (i0 < 0 && i0 >= -255)\n\t    _LDRDIN(JIT_TMP, r1, -i0);\n\telse {\n\t    jit_addi_i(JIT_FTMP, r1, i0);\n\t    _LDRDI(JIT_TMP, JIT_FTMP, 0);\n\t}\n\t_STRDIN(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n    }\n    else {\n\tif (((jit_thumb_p() && i0 >= -255) ||\n\t     (!jit_thumb_p() && i0 >= -4095)) && i0 + 4 <= 4095) {\n\t    if (i0 >= 0)\n\t\tjit_ldxi_i(JIT_TMP, r1, i0);\n\t    else if (i0 < 0)\n\t\tswf_ldrin(JIT_TMP, r1, -i0);\n\t    i0 += 4;\n\t    if (i0 >= 0)\n\t\tjit_ldxi_i(JIT_FTMP, r1, i0);\n\t    else if (i0 < 0)\n\t\tswf_ldrin(JIT_FTMP, r1, -i0);\n\t}\n\telse {\n\t    jit_addi_i(JIT_FTMP, r1, i0);\n\t    jit_ldxi_i(JIT_TMP, JIT_FTMP, 0);\n\t    jit_ldxi_i(JIT_FTMP, JIT_FTMP, 4);\n\t}\n\tswf_strin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    }\n}\n\n__jit_inline void\nswf_str_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 8);\n    jit_stxi_i(0, r0, JIT_FTMP);\n}\n\n__jit_inline void\nswf_str_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\t_STRDI(JIT_TMP, r0, 0);\n    }\n    else {\n\tswf_ldrin(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\tswf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 4);\n\tjit_stxi_i(0, r0, JIT_TMP);\n\tjit_stxi_i(4, r0, JIT_FTMP);\n    }\n}\n\n__jit_inline void\nswf_sti_f(jit_state_t _jit, void *i0, jit_fpr_t r0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n    jit_stxi_i(0, JIT_TMP, JIT_FTMP);\n}\n\n__jit_inline void\nswf_sti_d(jit_state_t _jit, void *i0, jit_fpr_t r0)\n{\n    jit_movi_i(JIT_TMP, (int)i0);\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n   jit_stxi_i(0, JIT_TMP, JIT_FTMP);\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n   jit_stxi_i(4, JIT_TMP, JIT_FTMP);\n}\n\n__jit_inline void\nswf_stxr_f(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t r2)\n{\n    swf_ldrin(JIT_TMP, JIT_FP, swf_off(r2) + 8);\n    jit_stxr_i(r1, r0, JIT_TMP);\n}\n\n__jit_inline void\nswf_stxr_d(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t r2)\n{\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\t_LDRDIN(JIT_TMP, JIT_FP, swf_off(r2) + 8);\n\t_STRD(JIT_TMP, r0, r1);\n    }\n    else {\n\tjit_addr_i(JIT_TMP, r0, r1);\n\tswf_ldrin(JIT_FTMP, JIT_FP, swf_off(r2) + 8);\n\tjit_stxi_i(0, JIT_TMP, JIT_FTMP);\n\tswf_ldrin(JIT_FTMP, JIT_FP, swf_off(r2) + 4);\n\tjit_stxi_i(4, JIT_TMP, JIT_FTMP);\n    }\n}\n\n__jit_inline void\nswf_stxi_f(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t r1)\n{\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r1) + 8);\n    jit_stxi_i(i0, r0, JIT_FTMP);\n}\n\n__jit_inline void\nswf_stxi_d(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t r1)\n{\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\tif (i0 >= 0 && i0 <= 255) {\n\t    _LDRDIN(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\t    _STRDI(JIT_TMP, r0, i0);\n\t}\n\telse if (i0 < 0 && i0 >= -255) {\n\t    _LDRDIN(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\t    _STRDIN(JIT_TMP, r0, -i0);\n\t}\n\telse {\n\t    jit_addi_i(JIT_FTMP, r0, i0);\n\t    swf_ldrin(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\t    jit_stxi_i(0, JIT_TMP, JIT_FTMP);\n\t    swf_ldrin(JIT_TMP, JIT_FP, swf_off(r1) + 4);\n\t    jit_stxi_i(4, JIT_TMP, JIT_FTMP);\n\t}\n    }\n    else {\n\tjit_addi_i(JIT_FTMP, r0, i0);\n\tswf_ldrin(JIT_TMP, JIT_FP, swf_off(r1) + 8);\n\tjit_stxi_i(0, JIT_FTMP, JIT_TMP);\n\tswf_ldrin(JIT_TMP, JIT_FP, swf_off(r1) + 4);\n\tjit_stxi_i(4, JIT_FTMP, JIT_TMP);\n    }\n}\n\n__jit_inline void\nswf_getarg_f(jit_state_t _jit, jit_fpr_t r0, int i0)\n{\n    if (i0 < 4)\n\ti0 <<= 2;\n    jit_ldxi_i(JIT_FTMP, JIT_FP, i0);\n    swf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n}\n\n__jit_inline void\nswf_getarg_d(jit_state_t _jit, jit_fpr_t r0, int i0)\n{\n    if (i0 < 4)\n\ti0 <<= 2;\n    if (!jit_thumb_p() && jit_armv5e_p()) {\n\tif (i0 < 255)\n\t    _LDRDI(JIT_TMP, JIT_FP, i0);\n\telse {\n\t    jit_addi_i(JIT_FTMP, JIT_FP, i0);\n\t    jit_ldxi_i(JIT_TMP, JIT_FTMP, 0);\n\t    jit_ldxi_i(JIT_FTMP, JIT_FTMP, 4);\n\t}\n\t_STRDIN(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n    }\n    else {\n\tif (i0 + 4 < 4095) {\n\t    jit_ldxi_i(JIT_TMP, JIT_FP, i0);\n\t    jit_ldxi_i(JIT_FTMP, JIT_FP, i0 + 4);\n\t}\n\telse {\n\t    jit_addi_i(JIT_FTMP, JIT_FP, i0);\n\t    jit_ldxi_i(JIT_TMP, JIT_FTMP, 0);\n\t    jit_ldxi_i(JIT_FTMP, JIT_FTMP, 4);\n\t}\n\tswf_strin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    }\n}\n\n__jit_inline void\nswf_pusharg_f(jit_state_t _jit, jit_fpr_t r0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n    assert(ofs < 256);\n    _jitl.stack_offset -= sizeof(float);\n    swf_ldrin(JIT_FTMP, JIT_FP, swf_off(r0) + 8);\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] &= ~(1 << (ofs & 31));\n    if (jit_thumb_p())\n\tT2_STRWI(JIT_FTMP, JIT_SP, 0);\n    else\n\t_STRI(JIT_FTMP, JIT_SP, 0);\n}\n\n__jit_inline void\nswf_pusharg_d(jit_state_t _jit, jit_fpr_t r0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n    assert(ofs < 256);\n    _jitl.stack_offset -= sizeof(double);\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_LDRDIN(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n    else {\n\tswf_ldrin(JIT_TMP, JIT_FP, swf_off(r0) + 8);\n\tswf_ldrin(JIT_FTMP, JIT_FP, swf_off(r0) + 4);\n    }\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] |= 1 << (ofs & 31);\n    /* large offsets (handled by patch_arguments) cannot be encoded in STRDI */\n    if (jit_thumb_p()) {\n\tT2_STRWI(JIT_TMP, JIT_SP, 0);\n\tT2_STRWI(JIT_FTMP, JIT_SP, 0);\n    }\n    else {\n\t_STRI(JIT_TMP, JIT_SP, 0);\n\t_STRI(JIT_FTMP, JIT_SP, 0);\n    }\n}\n\n#define swf_retval_f(_jit, r0)\t\tswf_strin(_R0, JIT_FP, swf_off(r0) + 8)\n__jit_inline void\nswf_retval_d(jit_state_t _jit, jit_fpr_t r0)\n{\n    if (!jit_thumb_p() && jit_armv5e_p())\n\t_STRDIN(_R0, JIT_FP, swf_off(r0) + 8);\n    else {\n\tswf_strin(_R0, JIT_FP, swf_off(r0) + 8);\n\tswf_strin(_R1, JIT_FP, swf_off(r0) + 4);\n    }\n}\n\n#endif /* __lightning_fp_swf_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/fp-vfp.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tSupport macros for arm VFP floating-point math\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2011 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n#ifndef __lightning_fp_vfp_h\n#define __lightning_fp_vfp_h\n\n__jit_inline void\nvfp_movr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    if (r0 != r1) {\n\tif (r0 == JIT_FPRET) {\n\t    /* jit_ret() must follow! */\n\t    if (!jit_hardfp_p())\n\t\t_VMOV_A_S(_R0, r1);\n\t    else\n\t\t_VMOV_F32(_D0, r1);\n\t}\n\telse\n\t    _VMOV_F32(r0, r1);\n    }\n}\n\n__jit_inline void\nvfp_movr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    if (r0 != r1) {\n\tif (r0 == JIT_FPRET) {\n\t    /* jit_ret() must follow! */\n\t    if (!jit_hardfp_p())\n\t\t_VMOV_AA_D(_R0, _R1, r1);\n\t    else\n\t\t_VMOV_F64(_D0, r1);\n\t}\n\telse\n\t    _VMOV_F64(r0, r1);\n    }\n}\n\n__jit_inline void\nvfp_movi_f(jit_state_t _jit, jit_fpr_t r0, float i0)\n{\n    union {\n\tint\ti;\n\tfloat\tf;\n    } u;\n    int\t\tcode;\n    u.f = i0;\n    if (!jit_hardfp_p() && r0 == JIT_FPRET)\n\t/* jit_ret() must follow! */\n\tjit_movi_i(_R0, u.i);\n    else {\n\tif (r0 == JIT_FPRET)\n\t    r0 = _D0;\n\tif ((code = encode_vfp_double(1, 0, u.i, u.i)) != -1 ||\n\t    (code = encode_vfp_double(1, 1, ~u.i, ~u.i)) != -1)\n\t    _VIMM(code, r0);\n\telse {\n\t    jit_movi_i(JIT_FTMP, u.i);\n\t    _VMOV_S_A(r0, JIT_FTMP);\n\t}\n    }\n}\n\n__jit_inline void\nvfp_movi_d(jit_state_t _jit, jit_fpr_t r0, double i0)\n{\n    union {\n\tint\ti[2];\n\tdouble\td;\n    } u;\n    int\t\tcode;\n    u.d = i0;\n    if (!jit_hardfp_p() && r0 == JIT_FPRET) {\n\t/* jit_ret() must follow! */\n\tjit_movi_i(_R0, u.i[0]);\n\tjit_movi_i(_R1, u.i[1]);\n    }\n    else {\n\tif (r0 == JIT_FPRET)\n\t    r0 = _D0;\n\tif ((code = encode_vfp_double(1, 0, u.i[0], u.i[1])) != -1 ||\n\t    (code = encode_vfp_double(1, 1, ~u.i[0], ~u.i[1])) != -1)\n\t    _VIMM(code, r0);\n\telse {\n\t    jit_movi_i(JIT_TMP, u.i[0]);\n\t    jit_movi_i(JIT_FTMP, u.i[1]);\n\t    _VMOV_D_AA(r0, JIT_TMP, JIT_FTMP);\n\t}\n    }\n}\n\n__jit_inline void\nvfp_extr_i_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    _VMOV_V_I32(r0, r1);\n    _VCVT_F32_S32(r0, r0);\n}\n\n__jit_inline void\nvfp_extr_i_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    _VMOV_V_I32(r0, r1);\n    _VCVT_F64_S32(r0, r0);\n}\n\n#define vfp_extr_d_f(_jit, r0, r1)\t_VCVT_F64_F32(r0, r1)\n#define vfp_extr_f_d(_jit, r0, r1)\t_VCVT_F32_F64(r0, r1)\n\n/* FIXME keeping for now, in case there exists, and/or to support\n * only 4 double precision registers */\n#define vfp_get_tmp(r, n)\t\t\t\t\t\t\\\n    jit_fpr_t\t\t tmp;\t\t\t\t\t\t\\\n    if (0) {\t\t\t\t\t\t\t\t\\\n\ttmp = r == _D0 ? _D1 : _D0;\t\t\t\t\t\\\n\t_VPUSH_F##n(tmp, 2);\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\t\t\t\\\n    else\t\t\t\t\t\t\t\t\\\n\ttmp = _D15\n#define vfp_unget_tmp(n)\t\t\t\t\t\t\\\n    if (0)\t\t\t\t\t\t\t\t\\\n\t_VPOP_F##n(tmp, 2)\n\n__jit_inline void\nvfp_rintr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 32);\n    _VCVT_S32_F32(tmp, r1);\n    _VMOV_A_S32(r0, tmp);\n    vfp_unget_tmp(32);\n}\n\n__jit_inline void\nvfp_rintr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 64);\n    _VCVT_S32_F64(tmp, r1);\n    _VMOV_A_S32(r0, tmp);\n    vfp_unget_tmp(64);\n}\n\n__jit_inline void\nvfp_roundr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 32);\n    _VMOV_A_S(JIT_FTMP, r1);\n    if (jit_thumb_p()) {\n\tT2_TSTI(JIT_FTMP, encode_thumb_immediate(0x80000000));\n\t_ITE(ARM_CC_NE);\n\t/* add -0.5 if negative */\n\tT2_MOVI(JIT_FTMP, encode_thumb_immediate(0xbf000000));\n\t/* add 0.5 if positive */\n\tT2_MOVI(JIT_FTMP, encode_thumb_immediate(0x3f000000));\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _TSTI(JIT_FTMP, encode_arm_immediate(0x80000000));\n\telse\n\t    _ANDSI(JIT_FTMP, JIT_FTMP, encode_arm_immediate(0x80000000));\n\t/* add -0.5 if negative */\n\t_CC_MOVI(ARM_CC_NE, JIT_FTMP, encode_arm_immediate(0xbf000000));\n\t/* add 0.5 if positive */\n\t_CC_MOVI(ARM_CC_EQ, JIT_FTMP, encode_arm_immediate(0x3f000000));\n    }\n    _VMOV_S_A(tmp, JIT_FTMP);\n    _VADD_F32(tmp, r1, tmp);\n    /* truncate to zero */\n    _VCVT_S32_F32(tmp, tmp);\n    _VMOV_A_S32(r0, tmp);\n    vfp_unget_tmp(32);\n}\n\n__jit_inline void\nvfp_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 64);\n    _VMOV_AA_D(JIT_TMP, JIT_FTMP, r1);\n    if (jit_thumb_p()) {\n\tT2_TSTI(JIT_FTMP, encode_thumb_immediate(0x80000000));\n\tT2_MOVI(JIT_FTMP, encode_thumb_immediate(0x0fe00000));\n\t_ITE(ARM_CC_NE);\n\t/* add -0.5 if negative */\n\tT2_ORRI(JIT_FTMP, JIT_FTMP, encode_thumb_immediate(0xb0000000));\n\t/* add 0.5 if positive */\n\tT2_ORRI(JIT_FTMP, JIT_FTMP, encode_thumb_immediate(0x30000000));\n    }\n    else {\n\tif (jit_armv6_p())\n\t    _TSTI(JIT_FTMP, encode_arm_immediate(0x80000000));\n\telse\n\t    _ANDSI(JIT_FTMP, JIT_FTMP, encode_arm_immediate(0x80000000));\n\t_MOVI(JIT_FTMP, encode_arm_immediate(0x0fe00000));\n\t/* add -0.5 if negative */\n\t_CC_ORRI(ARM_CC_NE, JIT_FTMP, JIT_FTMP,\n\t\t encode_arm_immediate(0xb0000000));\n\t/* add 0.5 if positive */\n\t_CC_ORRI(ARM_CC_EQ, JIT_FTMP, JIT_FTMP,\n\t\t encode_arm_immediate(0x30000000));\n    }\n    jit_movi_i(JIT_TMP, 0);\n    _VMOV_D_AA(tmp, JIT_TMP, JIT_FTMP);\n    _VADD_F64(tmp, r1, tmp);\n    /* truncate to zero */\n    _VCVT_S32_F64(tmp, tmp);\n    _VMOV_A_S32(r0, tmp);\n    vfp_unget_tmp(64);\n}\n\n#define vfp_truncr_f_i(_jit, r0, r1)\tvfp_rintr_f_i(_jit, r0, r1)\n#define vfp_truncr_d_i(_jit, r0, r1)\tvfp_rintr_d_i(_jit, r0, r1)\n\n__jit_inline void\nvfp_ceilr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 32);\n    _VMRS(JIT_TMP);\n    if (jit_thumb_p()) {\n\tT2_BICI(JIT_FTMP, JIT_TMP, encode_thumb_immediate(FPSCR_RMASK));\n\tT2_ORRI(JIT_FTMP, JIT_FTMP, encode_thumb_immediate(FPSCR_RP));\n    }\n    else {\n\t_BICI(JIT_FTMP, JIT_TMP, encode_arm_immediate(FPSCR_RMASK));\n\t_ORRI(JIT_FTMP, JIT_FTMP, encode_arm_immediate(FPSCR_RP));\n    }\n    _VMSR(JIT_FTMP);\n    _VCVTR_S32_F32(tmp, r1);\n    _VMOV_A_S32(r0, tmp);\n    _VMSR(JIT_TMP);\n    vfp_unget_tmp(32);\n}\n\n__jit_inline void\nvfp_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 64);\n    _VMRS(JIT_TMP);\n    if (jit_thumb_p()) {\n\tT2_BICI(JIT_FTMP, JIT_TMP, encode_thumb_immediate(FPSCR_RMASK));\n\tT2_ORRI(JIT_FTMP, JIT_FTMP, encode_thumb_immediate(FPSCR_RP));\n    }\n    else {\n\t_BICI(JIT_FTMP, JIT_TMP, encode_arm_immediate(FPSCR_RMASK));\n\t_ORRI(JIT_FTMP, JIT_FTMP, encode_arm_immediate(FPSCR_RP));\n    }\n    _VMSR(JIT_FTMP);\n    _VCVTR_S32_F64(tmp, r1);\n    _VMOV_A_S32(r0, tmp);\n    _VMSR(JIT_TMP);\n    vfp_unget_tmp(64);\n}\n\n__jit_inline void\nvfp_floorr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 32);\n    _VMRS(JIT_TMP);\n    if (jit_thumb_p()) {\n\tT2_BICI(JIT_FTMP, JIT_TMP, encode_thumb_immediate(FPSCR_RMASK));\n\tT2_ORRI(JIT_FTMP, JIT_FTMP, encode_thumb_immediate(FPSCR_RM));\n    }\n    else {\n\t_BICI(JIT_FTMP, JIT_TMP, encode_arm_immediate(FPSCR_RMASK));\n\t_ORRI(JIT_FTMP, JIT_FTMP, encode_arm_immediate(FPSCR_RM));\n    }\n    _VMSR(JIT_FTMP);\n    _VCVTR_S32_F32(tmp, r1);\n    _VMOV_A_S32(r0, tmp);\n    _VMSR(JIT_TMP);\n    vfp_unget_tmp(32);\n}\n\n__jit_inline void\nvfp_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    vfp_get_tmp(r1, 64);\n    _VMRS(JIT_TMP);\n    if (jit_thumb_p()) {\n\tT2_BICI(JIT_FTMP, JIT_TMP, encode_thumb_immediate(FPSCR_RMASK));\n\tT2_ORRI(JIT_FTMP, JIT_FTMP, encode_thumb_immediate(FPSCR_RM));\n    }\n    else {\n\t_BICI(JIT_FTMP, JIT_TMP, encode_arm_immediate(FPSCR_RMASK));\n\t_ORRI(JIT_FTMP, JIT_FTMP, encode_arm_immediate(FPSCR_RM));\n    }\n    _VMSR(JIT_FTMP);\n    _VCVTR_S32_F64(tmp, r1);\n    _VMOV_A_S32(r0, tmp);\n    _VMSR(JIT_TMP);\n    vfp_unget_tmp(64);\n}\n\n#define vfp_absr_f(_jit, r0, r1)\t_VABS_F32(r0, r1)\n#define vfp_absr_d(_jit, r0, r1)\t_VABS_F64(r0, r1)\n#define vfp_negr_f(_jit, r0, r1)\t_VNEG_F32(r0, r1)\n#define vfp_negr_d(_jit, r0, r1)\t_VNEG_F64(r0, r1)\n#define vfp_sqrtr_f(_jit, r0, r1)\t_VSQRT_F32(r0, r1)\n#define vfp_sqrtr_d(_jit, r0, r1)\t_VSQRT_F64(r0, r1)\n#define vfp_addr_f(_jit, r0, r1, r2)\t_VADD_F32(r0, r1, r2)\n#define vfp_addr_d(_jit, r0, r1, r2)\t_VADD_F64(r0, r1, r2)\n#define vfp_subr_f(_jit, r0, r1, r2)\t_VSUB_F32(r0, r1, r2)\n#define vfp_subr_d(_jit, r0, r1, r2)\t_VSUB_F64(r0, r1, r2)\n#define vfp_mulr_f(_jit, r0, r1, r2)\t_VMUL_F32(r0, r1, r2)\n#define vfp_mulr_d(_jit, r0, r1, r2)\t_VMUL_F64(r0, r1, r2)\n#define vfp_divr_f(_jit, r0, r1, r2)\t_VDIV_F32(r0, r1, r2)\n#define vfp_divr_d(_jit, r0, r1, r2)\t_VDIV_F64(r0, r1, r2)\n\nstatic void\n_vcmp01_x(jit_state_t _jit, int c0, int c1, jit_gpr_t r0)\n{\n    _VMRS(_R15);\n    if (jit_thumb_p()) {\n\tif ((c0 ^ c1) >> 28 == 1) {\n\t    _ITE(c0);\n\t    if (r0 < 8) {\n\t\tT1_MOVI(r0, 0);\n\t\tT1_MOVI(r0, 1);\n\t    }\n\t    else {\n\t\tT2_MOVI(r0, 0);\n\t\tT2_MOVI(r0, 1);\n\t    }\n\t}\n\telse {\n\t    if (r0 < 8) {\n\t\t_IT(c0);\n\t\tT1_MOVI(r0, 0);\n\t\t_IT(c1);\n\t\tT1_MOVI(r0, 1);\n\t    }\n\t    else {\n\t\t_IT(c0);\n\t\tT2_MOVI(r0, 0);\n\t\t_IT(c1);\n\t\tT2_MOVI(r0, 1);\n\t    }\n\t}\n    }\n    else {\n\t_CC_MOVI(c0, r0, 0);\n\t_CC_MOVI(c1, r0, 1);\n    }\n}\n\nstatic void\n_vcmp01_f(jit_state_t _jit, int c0, int c1,\n\t  jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F32(r1, r2);\n    _vcmp01_x(_jit, c0, c1, r0);\n}\n\nstatic void\n_vcmp01_d(jit_state_t _jit, int c0, int c1,\n\t  jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F64(r1, r2);\n    _vcmp01_x(_jit, c0, c1, r0);\n}\n\n#define vfp_ltr_f(_jit,r0,r1,r2)\t_vcmp01_f(_jit,ARM_CC_PL,ARM_CC_MI,r0,r1,r2)\n#define vfp_ltr_d(_jit,r0,r1,r2)\t_vcmp01_d(_jit,ARM_CC_PL,ARM_CC_MI,r0,r1,r2)\n#define vfp_ler_f(_jit,r0,r1,r2)\t_vcmp01_f(_jit,ARM_CC_HS,ARM_CC_LS,r0,r1,r2)\n#define vfp_ler_d(_jit,r0,r1,r2)\t_vcmp01_d(_jit,ARM_CC_HS,ARM_CC_LS,r0,r1,r2)\n#define vfp_eqr_f(_jit,r0,r1,r2)\t_vcmp01_f(_jit,ARM_CC_NE,ARM_CC_EQ,r0,r1,r2)\n#define vfp_eqr_d(_jit,r0,r1,r2)\t_vcmp01_d(_jit,ARM_CC_NE,ARM_CC_EQ,r0,r1,r2)\n#define vfp_ger_f(_jit,r0,r1,r2)\t_vcmp01_f(_jit,ARM_CC_LT,ARM_CC_GE,r0,r1,r2)\n#define vfp_ger_d(_jit,r0,r1,r2)\t_vcmp01_d(_jit,ARM_CC_LT,ARM_CC_GE,r0,r1,r2)\n#define vfp_gtr_f(_jit,r0,r1,r2)\t_vcmp01_f(_jit,ARM_CC_LE,ARM_CC_GT,r0,r1,r2)\n#define vfp_gtr_d(_jit,r0,r1,r2)\t_vcmp01_d(_jit,ARM_CC_LE,ARM_CC_GT,r0,r1,r2)\n#define vfp_ner_f(_jit,r0,r1,r2)\t_vcmp01_f(_jit,ARM_CC_EQ,ARM_CC_NE,r0,r1,r2)\n#define vfp_ner_d(_jit,r0,r1,r2)\t_vcmp01_d(_jit,ARM_CC_EQ,ARM_CC_NE,r0,r1,r2)\n\nstatic void\n_vcmp10_x(jit_state_t _jit, int cc, jit_gpr_t r0)\n{\n    if (jit_thumb_p()) {\n\tif (r0 < 8) {\n\t    T1_MOVI(r0, 1);\n\t    _VMRS(_R15);\n\t    _IT(cc);\n\t    T1_MOVI(r0, 0);\n\t}\n\telse {\n\t    T2_MOVI(r0, 1);\n\t    _VMRS(_R15);\n\t    _IT(cc);\n\t    T2_MOVI(r0, 0);\n\t}\n    }\n    else {\n\t_VMRS(_R15);\n\t_MOVI(r0, 1);\n\t_CC_MOVI(cc, r0, 0);\n    }\n}\n\nstatic void\n_vcmp_10_f(jit_state_t _jit, int cc, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F32(r1, r2);\n    _vcmp10_x(_jit, cc, r0);\n}\n\nstatic void\n_vcmp_10_d(jit_state_t _jit, int cc, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F64(r1, r2);\n    _vcmp10_x(_jit, cc, r0);\n}\n\n#define vfp_unltr_f(_jit,r0,r1,r2)\t_vcmp_10_f(_jit,ARM_CC_GE,r0,r1,r2)\n#define vfp_unltr_d(_jit,r0,r1,r2)\t_vcmp_10_d(_jit,ARM_CC_GE,r0,r1,r2)\n#define vfp_unler_f(_jit,r0,r1,r2)\t_vcmp_10_f(_jit,ARM_CC_GT,r0,r1,r2)\n#define vfp_unler_d(_jit,r0,r1,r2)\t_vcmp_10_d(_jit,ARM_CC_GT,r0,r1,r2)\n\nstatic void\nvfp_uneqr_x(jit_state_t _jit, jit_gpr_t r0)\n{\n    _VMRS(_R15);\n    if (jit_thumb_p()) {\n\t_ITE(ARM_CC_NE);\n\tif (r0 < 8) {\n\t    T1_MOVI(r0, 0);\n\t    T1_MOVI(r0, 1);\n\t    _IT(ARM_CC_VS);\n\t    T1_MOVI(r0, 1);\n\t}\n\telse {\n\t    T2_MOVI(r0, 0);\n\t    T2_MOVI(r0, 1);\n\t    _IT(ARM_CC_VS);\n\t    T2_MOVI(r0, 1);\n\t}\n    }\n    else {\n\t_CC_MOVI(ARM_CC_NE, r0, 0);\n\t_CC_MOVI(ARM_CC_EQ, r0, 1);\n\t_CC_MOVI(ARM_CC_VS, r0, 1);\n    }\n}\n\n__jit_inline void\nvfp_uneqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F32(r1, r2);\n    vfp_uneqr_x(_jit, r0);\n}\n\n__jit_inline void\nvfp_uneqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F64(r1, r2);\n    vfp_uneqr_x(_jit, r0);\n}\n\nstatic void\n_vcmp_01_x(jit_state_t _jit, int cc, jit_gpr_t r0)\n{\n    if (jit_thumb_p()) {\n\tif (r0 < 8) {\n\t    T1_MOVI(r0, 0);\n\t    _VMRS(_R15);\n\t    _IT(cc);\n\t    T1_MOVI(r0, 1);\n\t}\n\telse {\n\t    T2_MOVI(r0, 0);\n\t    _VMRS(_R15);\n\t    _IT(cc);\n\t    T2_MOVI(r0, 1);\n\t}\n    }\n    else {\n\t_VMRS(_R15);\n\t_MOVI(r0, 0);\n\t_CC_MOVI(cc, r0, 1);\n    }\n}\n\nstatic void\n_vcmp_01_f(jit_state_t _jit, int cc, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F32(r1, r2);\n    _vcmp_01_x(_jit, cc, r0);\n}\n\nstatic void\n_vcmp_01_d(jit_state_t _jit, int cc, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F64(r1, r2);\n    _vcmp_01_x(_jit, cc, r0);\n}\n\n#define vfp_unger_f(_jit,r0,r1,r2)\t_vcmp_01_f(_jit,ARM_CC_CS,r0,r1,r2)\n#define vfp_unger_d(_jit,r0,r1,r2)\t_vcmp_01_d(_jit,ARM_CC_CS,r0,r1,r2)\n#define vfp_ungtr_f(_jit,r0,r1,r2)\t_vcmp_01_f(_jit,ARM_CC_HI,r0,r1,r2)\n#define vfp_ungtr_d(_jit,r0,r1,r2)\t_vcmp_01_d(_jit,ARM_CC_HI,r0,r1,r2)\n\nstatic void\n_vfp_ltgtr_x(jit_state_t _jit, jit_gpr_t r0)\n{\n    _VMRS(_R15);\n    if (jit_thumb_p()) {\n\t_ITE(ARM_CC_NE);\n\tif (r0 < 8) {\n\t    T1_MOVI(r0, 1);\n\t    T1_MOVI(r0, 0);\n\t    _IT(ARM_CC_VS);\n\t    T1_MOVI(r0, 0);\n\t}\n\telse {\n\t    T2_MOVI(r0, 1);\n\t    T2_MOVI(r0, 0);\n\t    _IT(ARM_CC_VS);\n\t    T2_MOVI(r0, 0);\n\t}\n    }\n    else {\n\t_CC_MOVI(ARM_CC_NE, r0, 1);\n\t_CC_MOVI(ARM_CC_EQ, r0, 0);\n\t_CC_MOVI(ARM_CC_VS, r0, 0);\n    }\n}\n\n__jit_inline void\nvfp_ltgtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F32(r1, r2);\n    _vfp_ltgtr_x(_jit, r0);\n}\n\n__jit_inline void\nvfp_ltgtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F64(r1, r2);\n    _vfp_ltgtr_x(_jit, r0);\n}\n\n__jit_inline void\nvfp_ordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F32(r1, r2);\n    _vcmp10_x(_jit, ARM_CC_VS, r0);\n}\n\n__jit_inline void\nvfp_ordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F64(r1, r2);\n    _vcmp10_x(_jit, ARM_CC_VS, r0);\n}\n\n__jit_inline void\nvfp_unordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F32(r1, r2);\n    _vcmp_01_x(_jit, ARM_CC_VS, r0);\n}\n\n__jit_inline void\nvfp_unordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    _VCMP_F64(r1, r2);\n    _vcmp_01_x(_jit, ARM_CC_VS, r0);\n}\n\nstatic jit_insn *\n_vbcmp_x(jit_state_t _jit, int cc, jit_insn *i0)\n{\n    jit_insn\t*l;\n    long\t d;\n    _VMRS(_R15);\n    l = _jit->x.pc;\n    if (jit_thumb_p()) {\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(cc, encode_thumb_cc_jump(d));\n    }\n    else {\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(cc, d & 0x00ffffff);\n    }\n    return (l);\n}\n\n__jit_inline jit_insn *\n_vbcmp_f(jit_state_t _jit, int cc, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F32(r0, r1);\n    return (_vbcmp_x(_jit, cc, i0));\n}\n\n__jit_inline jit_insn *\n_vbcmp_d(jit_state_t _jit, int cc, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F64(r0, r1);\n    return (_vbcmp_x(_jit, cc, i0));\n}\n\n#define vfp_bltr_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_MI,i0,r0,r1)\n#define vfp_bltr_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_MI,i0,r0,r1)\n#define vfp_bler_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_LS,i0,r0,r1)\n#define vfp_bler_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_LS,i0,r0,r1)\n#define vfp_beqr_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_EQ,i0,r0,r1)\n#define vfp_beqr_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_EQ,i0,r0,r1)\n#define vfp_bger_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_GE,i0,r0,r1)\n#define vfp_bger_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_GE,i0,r0,r1)\n#define vfp_bgtr_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_GT,i0,r0,r1)\n#define vfp_bgtr_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_GT,i0,r0,r1)\n#define vfp_bner_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_NE,i0,r0,r1)\n#define vfp_bner_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_NE,i0,r0,r1)\n\nstatic jit_insn *\n_vbncmp_x(jit_state_t _jit, int cc, jit_insn *i0)\n{\n    jit_insn\t*i;\n    jit_insn\t*l;\n    long\t d;\n    _VMRS(_R15);\n    i = _jit->x.pc;\n    if (jit_thumb_p()) {\n\tT2_CC_B(cc, 0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s24P(d));\n\tT2_B(encode_thumb_jump(d));\n    }\n    else {\n\t_CC_B(cc, 0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_B(d & 0x00ffffff);\n    }\n    jit_patch(i);\n    return (l);\n}\n\n__jit_inline jit_insn *\n_vbncmp_f(jit_state_t _jit, int cc, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F32(r0, r1);\n    return (_vbncmp_x(_jit, cc, i0));\n}\n\n__jit_inline jit_insn *\n_vbncmp_d(jit_state_t _jit, int cc, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F64(r0, r1);\n    return (_vbncmp_x(_jit, cc, i0));\n}\n\n#define vfp_bunltr_f(_jit,i0,r0,r1)\t_vbncmp_f(_jit,ARM_CC_GE,i0,r0,r1)\n#define vfp_bunltr_d(_jit,i0,r0,r1)\t_vbncmp_d(_jit,ARM_CC_GE,i0,r0,r1)\n#define vfp_bunler_f(_jit,i0,r0,r1)\t_vbncmp_f(_jit,ARM_CC_GT,i0,r0,r1)\n#define vfp_bunler_d(_jit,i0,r0,r1)\t_vbncmp_d(_jit,ARM_CC_GT,i0,r0,r1)\n\nstatic jit_insn *\nvfp_buneqr_x(jit_state_t _jit, jit_insn *i0)\n{\n    jit_insn\t*i;\n    jit_insn\t*j;\n    jit_insn\t*l;\n    long\t d;\n    _VMRS(_R15);\n    i = _jit->x.pc;\n    if (jit_thumb_p()) {\n\tT2_CC_B(ARM_CC_VS, 0);\n\tj = _jit->x.pc;\n\tT2_CC_B(ARM_CC_NE, 0);\n\tjit_patch(i);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_B(encode_thumb_jump(d));\n    }\n    else {\n\t_CC_B(ARM_CC_VS, 0);\n\tj = _jit->x.pc;\n\t_CC_B(ARM_CC_NE, 0);\n\tjit_patch(i);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_B(d & 0x00ffffff);\n    }\n    jit_patch(j);\n    return (l);\n}\n\n__jit_inline jit_insn *\nvfp_buneqr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F32(r0, r1);\n    return (vfp_buneqr_x(_jit, i0));\n}\n\n__jit_inline jit_insn *\nvfp_buneqr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F64(r0, r1);\n    return (vfp_buneqr_x(_jit, i0));\n}\n\nstatic jit_insn *\nvfp_bunger_x(jit_state_t _jit, jit_insn *i0)\n{\n    jit_insn\t*i;\n    jit_insn\t*l;\n    long\t d;\n    _VMRS(_R15);\n    i = _jit->x.pc;\n    if (jit_thumb_p()) {\n\tT2_CC_B(ARM_CC_MI, 0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s20P(d));\n\tT2_CC_B(ARM_CC_HS, encode_thumb_cc_jump(d));\n\n    }\n    else {\n\t_CC_B(ARM_CC_MI, 0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_CC_B(ARM_CC_HS, d & 0x00ffffff);\n    }\n    jit_patch(i);\n    return (l);\n}\n\n__jit_inline jit_insn *\nvfp_bunger_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F32(r0, r1);\n    return (vfp_bunger_x(_jit, i0));\n}\n\n__jit_inline jit_insn *\nvfp_bunger_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F64(r0, r1);\n    return (vfp_bunger_x(_jit, i0));\n}\n\n#define vfp_bungtr_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_HI,i0,r0,r1)\n#define vfp_bungtr_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_HI,i0,r0,r1)\n\nstatic jit_insn *\nvfp_bltgtr_x(jit_state_t _jit, jit_insn *i0)\n{\n    jit_insn\t*i;\n    jit_insn\t*j;\n    jit_insn\t*l;\n    long\t d;\n    _VMRS(_R15);\n    i = _jit->x.pc;\n    if (jit_thumb_p()) {\n\tT2_CC_B(ARM_CC_VS, 0);\n\tj = _jit->x.pc;\n\tT2_CC_B(ARM_CC_EQ, 0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 1) - 2;\n\tassert(_s24P(d));\n\tT2_B(encode_thumb_jump(d));\n    }\n    else {\n\t_CC_B(ARM_CC_VS, 0);\n\tj = _jit->x.pc;\n\t_CC_B(ARM_CC_EQ, 0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 2;\n\tassert(_s24P(d));\n\t_B(d & 0x00ffffff);\n    }\n    jit_patch(i);\n    jit_patch(j);\n    return (l);\n}\n\n__jit_inline jit_insn *\nvfp_bltgtr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F32(r0, r1);\n    return (vfp_bltgtr_x(_jit, i0));\n}\n\n__jit_inline jit_insn *\nvfp_bltgtr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    _VCMP_F64(r0, r1);\n    return (vfp_bltgtr_x(_jit, i0));\n}\n\n#define vfp_bordr_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_VC,i0,r0,r1)\n#define vfp_bordr_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_VC,i0,r0,r1)\n#define vfp_bunordr_f(_jit,i0,r0,r1)\t_vbcmp_f(_jit,ARM_CC_VS,i0,r0,r1)\n#define vfp_bunordr_d(_jit,i0,r0,r1)\t_vbcmp_d(_jit,ARM_CC_VS,i0,r0,r1)\n#define vfp_ldr_f(_jit, r0, r1)\t\t_VLDR_F32(r0, r1, 0)\n#define vfp_ldr_d(_jit, r0, r1)\t\t_VLDR_F64(r0, r1, 0)\n\n__jit_inline void\nvfp_ldi_f(jit_state_t _jit, jit_fpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_FTMP, (int)i0);\n    _VLDR_F32(r0, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_ldi_d(jit_state_t _jit, jit_fpr_t r0, void *i0)\n{\n    jit_movi_i(JIT_FTMP, (int)i0);\n    _VLDR_F64(r0, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_ldxr_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_FTMP, r1, r2);\n    _VLDR_F32(r0, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_ldxr_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_FTMP, r1, r2);\n    _VLDR_F64(r0, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_ldxi_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 >= 0) {\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VLDR_F32(r0, r1, i0);\n\telse {\n\t    jit_addi_i(JIT_FTMP, r1, i0);\n\t    _VLDR_F32(r0, JIT_FTMP, 0);\n\t}\n    }\n    else {\n\ti0 = -i0;\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VLDRN_F32(r0, r1, i0);\n\telse {\n\t    jit_subi_i(JIT_FTMP, r1, i0);\n\t    _VLDR_F32(r0, JIT_FTMP, 0);\n\t}\n    }\n}\n\n__jit_inline void\nvfp_ldxi_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 >= 0) {\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VLDR_F64(r0, r1, i0);\n\telse {\n\t    jit_addi_i(JIT_FTMP, r1, i0);\n\t    _VLDR_F64(r0, JIT_FTMP, 0);\n\t}\n    }\n    else {\n\ti0 = -i0;\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VLDRN_F64(r0, r1, i0);\n\telse {\n\t    jit_subi_i(JIT_FTMP, r1, i0);\n\t    _VLDR_F64(r0, JIT_FTMP, 0);\n\t}\n    }\n}\n\n#define vfp_str_f(_jit, r0, r1)\t\t_VSTR_F32(r1, r0, 0)\n#define vfp_str_d(_jit, r0, r1)\t\t_VSTR_F64(r1, r0, 0)\n\n__jit_inline void\nvfp_sti_f(jit_state_t _jit, void *i0, jit_fpr_t r0)\n{\n    jit_movi_i(JIT_FTMP, (int)i0);\n    _VSTR_F32(r0, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_sti_d(jit_state_t _jit, void *i0, jit_fpr_t r0)\n{\n    jit_movi_i(JIT_FTMP, (int)i0);\n    _VSTR_F64(r0, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_stxr_f(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t r2)\n{\n    jit_addr_i(JIT_FTMP, r0, r1);\n    _VSTR_F32(r2, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_stxr_d(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t r2)\n{\n    jit_addr_i(JIT_FTMP, r0, r1);\n    _VSTR_F64(r2, JIT_FTMP, 0);\n}\n\n__jit_inline void\nvfp_stxi_f(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t r1)\n{\n    if (i0 >= 0) {\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VSTR_F32(r1, r0, i0);\n\telse {\n\t    jit_addi_i(JIT_FTMP, r0, i0);\n\t    _VSTR_F32(r1, JIT_FTMP, 0);\n\t}\n    }\n    else {\n\ti0 = -i0;\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VSTRN_F32(r1, r0, i0);\n\telse {\n\t    jit_subi_i(JIT_FTMP, r0, i0);\n\t    _VSTR_F32(r1, JIT_FTMP, 0);\n\t}\n    }\n}\n\n__jit_inline void\nvfp_stxi_d(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t r1)\n{\n    if (i0 >= 0) {\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VSTR_F64(r1, r0, i0);\n\telse {\n\t    jit_addi_i(JIT_FTMP, r0, i0);\n\t    _VSTR_F64(r1, JIT_FTMP, 0);\n\t}\n    }\n    else {\n\ti0 = -i0;\n\tassert(!(i0 & 3));\n\ti0 >>= 2;\n\tif (i0 < 256)\n\t    _VSTRN_F64(r1, r0, i0);\n\telse {\n\t    jit_subi_i(JIT_FTMP, r0, i0);\n\t    _VSTR_F64(r1, JIT_FTMP, 0);\n\t}\n    }\n}\n\n__jit_inline void\nvfp_getarg_f(jit_state_t _jit, jit_fpr_t r0, int i0)\n{\n    if (jit_hardfp_p()) {\n\tif (i0 < 16) {\n\t    if (r0 != (jit_fpr_t)i0)\n\t\t_VMOV_F32(r0, (jit_fpr_t)i0);\n\t    return;\n\t}\n    }\n    else if (i0 < 4) {\n\t/* registers are already saved on stack and argument registers\n\t * may have been clobbered */\n#if 0\n\t_VMOV_S_A(r0, i0);\n#else\n\tvfp_ldxi_f(_jit, r0, JIT_FP, i0 << 2);\n#endif\n\treturn;\n    }\n    vfp_ldxi_f(_jit, r0, JIT_FP, i0);\n}\n\n__jit_inline void\nvfp_getarg_d(jit_state_t _jit, jit_fpr_t r0, int i0)\n{\n    if (jit_hardfp_p()) {\n\tif (i0 < 16) {\n\t    if (r0 != (jit_fpr_t)i0)\n\t\t_VMOV_F64(r0, (jit_fpr_t)i0);\n\t    return;\n\t}\n    }\n    else if (i0 < 4) {\n\t/* registers are already saved on stack and argument registers\n\t * may have been clobbered */\n#if 0\n\t_VMOV_D_AA(r0, i0, i0 + 1);\n#else\n\tvfp_ldxi_d(_jit, r0, JIT_FP, i0 << 2);\n#endif\n\treturn;\n    }\n    vfp_ldxi_d(_jit, r0, JIT_FP, i0);\n}\n\n__jit_inline void\nvfp_pusharg_f(jit_state_t _jit, jit_fpr_t r0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n    assert(ofs < 256);\n    _jitl.stack_offset -= sizeof(float);\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] &= ~(1 << (ofs & 31));\n    _VSTR_F32(r0, JIT_SP, 0);\n}\n\n__jit_inline void\nvfp_pusharg_d(jit_state_t _jit, jit_fpr_t r0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n    assert(ofs < 256);\n    _jitl.stack_offset -= sizeof(double);\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] |= 1 << (ofs & 31);\n    _VSTR_F64(r0, JIT_SP, 0);\n}\n\n__jit_inline void\nvfp_retval_f(jit_state_t _jit, jit_fpr_t r0)\n{\n    if (jit_hardfp_p()) {\n\tif (r0 != _D0)\n\t    _VMOV_F32(r0, _D0);\n    }\n    else\n\t_VMOV_S_A(r0, _R0);\n}\n\n__jit_inline void\nvfp_retval_d(jit_state_t _jit, jit_fpr_t r0)\n{\n    if (jit_hardfp_p()) {\n\tif (r0 != _D0)\n\t    _VMOV_F64(r0, _D0);\n    }\n    else\n\t_VMOV_D_AA(r0, _R0, _R1);\n}\n\n#undef vfp_unget_tmp\n#undef vfp_get_tmp\n\n#endif /* __lightning_fp_vfp_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/fp.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tFloating-point support (arm)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2011 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_fp_arm_h\n#define __lightning_fp_arm_h\n\n#define JIT_FPR_NUM\t\t\t6\n\nstatic const jit_fpr_t\njit_soft_order[6] = {\n    _D0, _D1, _D2, _D3, _D4, _D5\n};\nstatic const jit_fpr_t\njit_hard_order[6] = {\n    _D8, _D9, _D10, _D11, _D12, _D13\n};\n#define JIT_FPR(n)\t\t\t\t\t\t\t\\\n    (jit_hardfp_p() ? jit_hard_order[n] : jit_soft_order[n])\n\n#include \"fp-swf.h\"\n#include \"fp-vfp.h\"\n\n#define jit_movr_f(r0, r1)\t\tarm_movr_f(_jit, r0, r1)\n__jit_inline void\narm_movr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    if (jit_swf_p())\tswf_movr_f(_jit, r0, r1);\n    else\t\tvfp_movr_f(_jit, r0, r1);\n}\n\n#define jit_movr_d(r0, r1)\t\tarm_movr_d(_jit, r0, r1)\n__jit_inline void\narm_movr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    if (jit_swf_p())\tswf_movr_d(_jit, r0, r1);\n    else\t\tvfp_movr_d(_jit, r0, r1);\n}\n\n#define jit_movi_f(r0, i0)\t\tarm_movi_f(_jit, r0, i0)\n__jit_inline void\narm_movi_f(jit_state_t _jit, jit_fpr_t r0, float i0)\n{\n    if (jit_swf_p())\tswf_movi_f(_jit, r0, i0);\n    else\t\tvfp_movi_f(_jit, r0, i0);\n}\n\n#define jit_movi_d(r0, i0)\t\tarm_movi_d(_jit, r0, i0)\n__jit_inline void\narm_movi_d(jit_state_t _jit, jit_fpr_t r0, double i0)\n{\n    if (jit_swf_p())\tswf_movi_d(_jit, r0, i0);\n    else\t\tvfp_movi_d(_jit, r0, i0);\n}\n\n#define jit_extr_i_f(r0, r1)\t\tarm_extr_i_f(_jit, r0, r1)\n__jit_inline void\narm_extr_i_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_extr_i_f(_jit, r0, r1);\n    else\t\tvfp_extr_i_f(_jit, r0, r1);\n}\n\n#define jit_extr_i_d(r0, r1)\t\tarm_extr_i_d(_jit, r0, r1)\n__jit_inline void\narm_extr_i_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_extr_i_d(_jit, r0, r1);\n    else\t\tvfp_extr_i_d(_jit, r0, r1);\n}\n\n#define jit_extr_d_f(r0, r1)\t\tarm_extr_d_f(_jit, r0, r1)\nstatic void\narm_extr_d_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_extr_d_f(_jit, r0, r1);\n    else\t\tvfp_extr_d_f(_jit, r0, r1);\n}\n\n#define jit_extr_f_d(r0, r1)\t\tarm_extr_f_d(_jit, r0, r1)\nstatic void\narm_extr_f_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    if (jit_swf_p())\tswf_extr_f_d(_jit, r0, r1);\n    else\t\tvfp_extr_f_d(_jit, r0, r1);\n}\n\n#define jit_rintr_f_i(r0, r1)\t\tarm_rintr_f_i(_jit, r0, r1)\nstatic void\narm_rintr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_rintr_f_i(_jit, r0, r1);\n    else\t\tvfp_rintr_f_i(_jit, r0, r1);\n}\n\n#define jit_rintr_d_i(r0, r1)\t\tarm_rintr_d_i(_jit, r0, r1)\nstatic void\narm_rintr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_rintr_d_i(_jit, r0, r1);\n    else\t\tvfp_rintr_d_i(_jit, r0, r1);\n}\n\n#define jit_roundr_f_i(r0, r1)\t\tarm_roundr_f_i(_jit, r0, r1)\nstatic void\narm_roundr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_roundr_f_i(_jit, r0, r1);\n    else\t\tvfp_roundr_f_i(_jit, r0, r1);\n}\n\n#define jit_roundr_d_i(r0, r1)\t\tarm_roundr_d_i(_jit, r0, r1)\nstatic void\narm_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_roundr_d_i(_jit, r0, r1);\n    else\t\tvfp_roundr_d_i(_jit, r0, r1);\n}\n\n#define jit_truncr_f_i(r0, r1)\t\tarm_truncr_f_i(_jit, r0, r1)\nstatic void\narm_truncr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_truncr_f_i(_jit, r0, r1);\n    else\t\tvfp_truncr_f_i(_jit, r0, r1);\n}\n\n#define jit_truncr_d_i(r0, r1)\t\tarm_truncr_d_i(_jit, r0, r1)\nstatic void\narm_truncr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_truncr_d_i(_jit, r0, r1);\n    else\t\tvfp_truncr_d_i(_jit, r0, r1);\n}\n\n#define jit_ceilr_f_i(r0, r1)\t\tarm_ceilr_f_i(_jit, r0, r1)\nstatic void\narm_ceilr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ceilr_f_i(_jit, r0, r1);\n    else\t\tvfp_ceilr_f_i(_jit, r0, r1);\n}\n\n#define jit_ceilr_d_i(r0, r1)\t\tarm_ceilr_d_i(_jit, r0, r1)\nstatic void\narm_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ceilr_d_i(_jit, r0, r1);\n    else\t\tvfp_ceilr_d_i(_jit, r0, r1);\n}\n\n#define jit_floorr_f_i(r0, r1)\t\tarm_floorr_f_i(_jit, r0, r1)\nstatic void\narm_floorr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_floorr_f_i(_jit, r0, r1);\n    else\t\tvfp_floorr_f_i(_jit, r0, r1);\n}\n\n#define jit_floorr_d_i(r0, r1)\t\tarm_floorr_d_i(_jit, r0, r1)\nstatic void\narm_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_floorr_d_i(_jit, r0, r1);\n    else\t\tvfp_floorr_d_i(_jit, r0, r1);\n}\n\n#define jit_absr_f(r0, r1)\t\tarm_absr_f(_jit, r0, r1)\nstatic void\narm_absr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_absr_f(_jit, r0, r1);\n    else\t\tvfp_absr_f(_jit, r0, r1);\n}\n\n#define jit_absr_d(r0, r1)\t\tarm_absr_d(_jit, r0, r1)\nstatic void\narm_absr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_absr_d(_jit, r0, r1);\n    else\t\tvfp_absr_d(_jit, r0, r1);\n}\n\n#define jit_negr_f(r0, r1)\t\tarm_negr_f(_jit, r0, r1)\nstatic void\narm_negr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_negr_f(_jit, r0, r1);\n    else\t\tvfp_negr_f(_jit, r0, r1);\n}\n\n#define jit_negr_d(r0, r1)\t\tarm_negr_d(_jit, r0, r1)\nstatic void\narm_negr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_negr_d(_jit, r0, r1);\n    else\t\tvfp_negr_d(_jit, r0, r1);\n}\n\n#define jit_sqrtr_f(r0, r1)\t\tarm_sqrtr_f(_jit, r0, r1)\nstatic void\narm_sqrtr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_sqrtr_f(_jit, r0, r1);\n    else\t\tvfp_sqrtr_f(_jit, r0, r1);\n}\n\n#define jit_sqrtr_d(r0, r1)\t\tarm_sqrtr_d(_jit, r0, r1)\nstatic void\narm_sqrtr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_sqrtr_d(_jit, r0, r1);\n    else\t\tvfp_sqrtr_d(_jit, r0, r1);\n}\n\n#define jit_addr_f(r0, r1, r2)\t\tarm_addr_f(_jit, r0, r1, r2)\nstatic void\narm_addr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_addr_f(_jit, r0, r1, r2);\n    else\t\tvfp_addr_f(_jit, r0, r1, r2);\n}\n\n#define jit_addr_d(r0, r1, r2)\t\tarm_addr_d(_jit, r0, r1, r2)\nstatic void\narm_addr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_addr_d(_jit, r0, r1, r2);\n    else\t\tvfp_addr_d(_jit, r0, r1, r2);\n}\n\n#define jit_subr_f(r0, r1, r2)\t\tarm_subr_f(_jit, r0, r1, r2)\nstatic void\narm_subr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_subr_f(_jit, r0, r1, r2);\n    else\t\tvfp_subr_f(_jit, r0, r1, r2);\n}\n\n#define jit_subr_d(r0, r1, r2)\t\tarm_subr_d(_jit, r0, r1, r2)\nstatic void\narm_subr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_subr_d(_jit, r0, r1, r2);\n    else\t\tvfp_subr_d(_jit, r0, r1, r2);\n}\n\n#define jit_mulr_f(r0, r1, r2)\t\tarm_mulr_f(_jit, r0, r1, r2)\nstatic void\narm_mulr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_mulr_f(_jit, r0, r1, r2);\n    else\t\tvfp_mulr_f(_jit, r0, r1, r2);\n}\n\n#define jit_mulr_d(r0, r1, r2)\t\tarm_mulr_d(_jit, r0, r1, r2)\nstatic void\narm_mulr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_mulr_d(_jit, r0, r1, r2);\n    else\t\tvfp_mulr_d(_jit, r0, r1, r2);\n}\n\n#define jit_divr_f(r0, r1, r2)\t\tarm_divr_f(_jit, r0, r1, r2)\nstatic void\narm_divr_f(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_divr_f(_jit, r0, r1, r2);\n    else\t\tvfp_divr_f(_jit, r0, r1, r2);\n}\n\n#define jit_divr_d(r0, r1, r2)\t\tarm_divr_d(_jit, r0, r1, r2)\nstatic void\narm_divr_d(jit_state_t _jit, jit_fpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_divr_d(_jit, r0, r1, r2);\n    else\t\tvfp_divr_d(_jit, r0, r1, r2);\n}\n\n#define jit_ltr_f(r0, r1, r2)\t\tarm_ltr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ltr_f(_jit, r0, r1, r2);\n    else\t\tvfp_ltr_f(_jit, r0, r1, r2);\n}\n\n#define jit_ltr_d(r0, r1, r2)\t\tarm_ltr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ltr_d(_jit, r0, r1, r2);\n    else\t\tvfp_ltr_d(_jit, r0, r1, r2);\n}\n\n#define jit_ler_f(r0, r1, r2)\t\tarm_ler_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ler_f(_jit, r0, r1, r2);\n    else\t\tvfp_ler_f(_jit, r0, r1, r2);\n}\n\n#define jit_ler_d(r0, r1, r2)\t\tarm_ler_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ler_d(_jit, r0, r1, r2);\n    else\t\tvfp_ler_d(_jit, r0, r1, r2);\n}\n\n#define jit_eqr_f(r0, r1, r2)\t\tarm_eqr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_eqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_eqr_f(_jit, r0, r1, r2);\n    else\t\tvfp_eqr_f(_jit, r0, r1, r2);\n}\n\n#define jit_eqr_d(r0, r1, r2)\t\tarm_eqr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_eqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_eqr_d(_jit, r0, r1, r2);\n    else\t\tvfp_eqr_d(_jit, r0, r1, r2);\n}\n\n#define jit_ger_f(r0, r1, r2)\t\tarm_ger_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ger_f(_jit, r0, r1, r2);\n    else\t\tvfp_ger_f(_jit, r0, r1, r2);\n}\n\n#define jit_ger_d(r0, r1, r2)\t\tarm_ger_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ger_d(_jit, r0, r1, r2);\n    else\t\tvfp_ger_d(_jit, r0, r1, r2);\n}\n\n#define jit_gtr_f(r0, r1, r2)\t\tarm_gtr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_gtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_gtr_f(_jit, r0, r1, r2);\n    else\t\tvfp_gtr_f(_jit, r0, r1, r2);\n}\n\n#define jit_gtr_d(r0, r1, r2)\t\tarm_gtr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_gtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_gtr_d(_jit, r0, r1, r2);\n    else\t\tvfp_gtr_d(_jit, r0, r1, r2);\n}\n\n#define jit_ner_f(r0, r1, r2)\t\tarm_ner_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ner_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ner_f(_jit, r0, r1, r2);\n    else\t\tvfp_ner_f(_jit, r0, r1, r2);\n}\n\n#define jit_ner_d(r0, r1, r2)\t\tarm_ner_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ner_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ner_d(_jit, r0, r1, r2);\n    else\t\tvfp_ner_d(_jit, r0, r1, r2);\n}\n\n#define jit_unltr_f(r0, r1, r2)\t\tarm_unltr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_unltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unltr_f(_jit, r0, r1, r2);\n    else\t\tvfp_unltr_f(_jit, r0, r1, r2);\n}\n\n#define jit_unltr_d(r0, r1, r2)\t\tarm_unltr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_unltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unltr_d(_jit, r0, r1, r2);\n    else\t\tvfp_unltr_d(_jit, r0, r1, r2);\n}\n\n#define jit_unler_f(r0, r1, r2)\t\tarm_unler_f(_jit, r0, r1, r2)\n__jit_inline void\narm_unler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unler_f(_jit, r0, r1, r2);\n    else\t\tvfp_unler_f(_jit, r0, r1, r2);\n}\n\n#define jit_unler_d(r0, r1, r2)\t\tarm_unler_d(_jit, r0, r1, r2)\n__jit_inline void\narm_unler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unler_d(_jit, r0, r1, r2);\n    else\t\tvfp_unler_d(_jit, r0, r1, r2);\n}\n\n#define jit_uneqr_f(r0, r1, r2)\t\tarm_uneqr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_uneqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_uneqr_f(_jit, r0, r1, r2);\n    else\t\tvfp_uneqr_f(_jit, r0, r1, r2);\n}\n\n#define jit_uneqr_d(r0, r1, r2)\t\tarm_uneqr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_uneqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_uneqr_d(_jit, r0, r1, r2);\n    else\t\tvfp_uneqr_d(_jit, r0, r1, r2);\n}\n\n#define jit_unger_f(r0, r1, r2)\t\tarm_unger_f(_jit, r0, r1, r2)\n__jit_inline void\narm_unger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unger_f(_jit, r0, r1, r2);\n    else\t\tvfp_unger_f(_jit, r0, r1, r2);\n}\n\n#define jit_unger_d(r0, r1, r2)\t\tarm_unger_d(_jit, r0, r1, r2)\n__jit_inline void\narm_unger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unger_d(_jit, r0, r1, r2);\n    else\t\tvfp_unger_d(_jit, r0, r1, r2);\n}\n\n#define jit_ungtr_f(r0, r1, r2)\t\tarm_ungtr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ungtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ungtr_f(_jit, r0, r1, r2);\n    else\t\tvfp_ungtr_f(_jit, r0, r1, r2);\n}\n\n#define jit_ungtr_d(r0, r1, r2)\t\tarm_ungtr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ungtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ungtr_d(_jit, r0, r1, r2);\n    else\t\tvfp_ungtr_d(_jit, r0, r1, r2);\n}\n\n#define jit_ltgtr_f(r0, r1, r2)\t\tarm_ltgtr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ltgtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ltgtr_f(_jit, r0, r1, r2);\n    else\t\tvfp_ltgtr_f(_jit, r0, r1, r2);\n}\n\n#define jit_ltgtr_d(r0, r1, r2)\t\tarm_ltgtr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ltgtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ltgtr_d(_jit, r0, r1, r2);\n    else\t\tvfp_ltgtr_d(_jit, r0, r1, r2);\n}\n\n#define jit_ordr_f(r0, r1, r2)\t\tarm_ordr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ordr_f(_jit, r0, r1, r2);\n    else\t\tvfp_ordr_f(_jit, r0, r1, r2);\n}\n\n#define jit_ordr_d(r0, r1, r2)\t\tarm_ordr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ordr_d(_jit, r0, r1, r2);\n    else\t\tvfp_ordr_d(_jit, r0, r1, r2);\n}\n\n#define jit_unordr_f(r0, r1, r2)\tarm_unordr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_unordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unordr_f(_jit, r0, r1, r2);\n    else\t\tvfp_unordr_f(_jit, r0, r1, r2);\n}\n\n#define jit_unordr_d(r0, r1, r2)\tarm_unordr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_unordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1, jit_fpr_t r2)\n{\n    assert(r1 != JIT_FPRET && r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_unordr_d(_jit, r0, r1, r2);\n    else\t\tvfp_unordr_d(_jit, r0, r1, r2);\n}\n\n#define jit_bltr_f(i0, r0, r1)\t\tarm_bltr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bltr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bltr_f(_jit, i0, r0, r1));\n    return (vfp_bltr_f(_jit, i0, r0, r1));\n}\n\n#define jit_bltr_d(i0, r0, r1)\t\tarm_bltr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bltr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bltr_d(_jit, i0, r0, r1));\n    return (vfp_bltr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bler_f(i0, r0, r1)\t\tarm_bler_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bler_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bler_f(_jit, i0, r0, r1));\n    return (vfp_bler_f(_jit, i0, r0, r1));\n}\n\n#define jit_bler_d(i0, r0, r1)\t\tarm_bler_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bler_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bler_d(_jit, i0, r0, r1));\n    return (vfp_bler_d(_jit, i0, r0, r1));\n}\n\n#define jit_beqr_f(i0, r0, r1)\t\tarm_beqr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_beqr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_beqr_f(_jit, i0, r0, r1));\n    return (vfp_beqr_f(_jit, i0, r0, r1));\n}\n\n#define jit_beqr_d(i0, r0, r1)\t\tarm_beqr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_beqr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_beqr_d(_jit, i0, r0, r1));\n    return (vfp_beqr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bger_f(i0, r0, r1)\t\tarm_bger_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bger_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bger_f(_jit, i0, r0, r1));\n    return (vfp_bger_f(_jit, i0, r0, r1));\n}\n\n#define jit_bger_d(i0, r0, r1)\t\tarm_bger_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bger_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bger_d(_jit, i0, r0, r1));\n    return (vfp_bger_d(_jit, i0, r0, r1));\n}\n\n#define jit_bgtr_f(i0, r0, r1)\t\tarm_bgtr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bgtr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bgtr_f(_jit, i0, r0, r1));\n    return (vfp_bgtr_f(_jit, i0, r0, r1));\n}\n\n#define jit_bgtr_d(i0, r0, r1)\t\tarm_bgtr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bgtr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bgtr_d(_jit, i0, r0, r1));\n    return (vfp_bgtr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bner_f(i0, r0, r1)\t\tarm_bner_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bner_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bner_f(_jit, i0, r0, r1));\n    return (vfp_bner_f(_jit, i0, r0, r1));\n}\n\n#define jit_bner_d(i0, r0, r1)\t\tarm_bner_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bner_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bner_d(_jit, i0, r0, r1));\n    return (vfp_bner_d(_jit, i0, r0, r1));\n}\n\n#define jit_bunltr_f(i0, r0, r1)\tarm_bunltr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunltr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunltr_f(_jit, i0, r0, r1));\n    return (vfp_bunltr_f(_jit, i0, r0, r1));\n}\n\n#define jit_bunltr_d(i0, r0, r1)\tarm_bunltr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunltr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunltr_d(_jit, i0, r0, r1));\n    return (vfp_bunltr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bunler_f(i0, r0, r1)\tarm_bunler_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunler_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunler_f(_jit, i0, r0, r1));\n    return (vfp_bunler_f(_jit, i0, r0, r1));\n}\n\n#define jit_bunler_d(i0, r0, r1)\tarm_bunler_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunler_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunler_d(_jit, i0, r0, r1));\n    return (vfp_bunler_d(_jit, i0, r0, r1));\n}\n\n#define jit_buneqr_f(i0, r0, r1)\tarm_buneqr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_buneqr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_buneqr_f(_jit, i0, r0, r1));\n    return (vfp_buneqr_f(_jit, i0, r0, r1));\n}\n\n#define jit_buneqr_d(i0, r0, r1)\tarm_buneqr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_buneqr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_buneqr_d(_jit, i0, r0, r1));\n    return (vfp_buneqr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bunger_f(i0, r0, r1)\tarm_bunger_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunger_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunger_f(_jit, i0, r0, r1));\n    return (vfp_bunger_f(_jit, i0, r0, r1));\n}\n\n#define jit_bunger_d(i0, r0, r1)\tarm_bunger_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunger_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunger_d(_jit, i0, r0, r1));\n    return (vfp_bunger_d(_jit, i0, r0, r1));\n}\n\n#define jit_bungtr_f(i0, r0, r1)\tarm_bungtr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bungtr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bungtr_f(_jit, i0, r0, r1));\n    return (vfp_bungtr_f(_jit, i0, r0, r1));\n}\n\n#define jit_bungtr_d(i0, r0, r1)\tarm_bungtr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bungtr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bungtr_d(_jit, i0, r0, r1));\n    return (vfp_bungtr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bltgtr_f(i0, r0, r1)\tarm_bltgtr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bltgtr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bltgtr_f(_jit, i0, r0, r1));\n    return (vfp_bltgtr_f(_jit, i0, r0, r1));\n}\n\n#define jit_bltgtr_d(i0, r0, r1)\tarm_bltgtr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bltgtr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bltgtr_d(_jit, i0, r0, r1));\n    return (vfp_bltgtr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bordr_f(i0, r0, r1)\t\tarm_bordr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bordr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bordr_f(_jit, i0, r0, r1));\n    return (vfp_bordr_f(_jit, i0, r0, r1));\n}\n\n#define jit_bordr_d(i0, r0, r1)\t\tarm_bordr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bordr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bordr_d(_jit, i0, r0, r1));\n    return (vfp_bordr_d(_jit, i0, r0, r1));\n}\n\n#define jit_bunordr_f(i0, r0, r1)\tarm_bunordr_f(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunordr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunordr_f(_jit, i0, r0, r1));\n    return (vfp_bunordr_f(_jit, i0, r0, r1));\n}\n\n#define jit_bunordr_d(i0, r0, r1)\tarm_bunordr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\narm_bunordr_d(jit_state_t _jit, jit_insn *i0, jit_fpr_t r0, jit_fpr_t r1)\n{\n    assert(r0 != JIT_FPRET && r1 != JIT_FPRET);\n    if (jit_swf_p())\treturn (swf_bunordr_d(_jit, i0, r0, r1));\n    return (vfp_bunordr_d(_jit, i0, r0, r1));\n}\n\n#define jit_ldr_f(r0, r1)\t\tarm_ldr_f(_jit, r0, r1)\n__jit_inline void\narm_ldr_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldr_f(_jit, r0, r1);\n    else\t\tvfp_ldr_f(_jit, r0, r1);\n}\n\n#define jit_ldr_d(r0, r1)\t\tarm_ldr_d(_jit, r0, r1)\n__jit_inline void\narm_ldr_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldr_d(_jit, r0, r1);\n    else\t\tvfp_ldr_d(_jit, r0, r1);\n}\n\n#define jit_ldi_f(r0, i0)\t\tarm_ldi_f(_jit, r0, i0)\n__jit_inline void\narm_ldi_f(jit_state_t _jit, jit_fpr_t r0, void *i0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldi_f(_jit, r0, i0);\n    else\t\tvfp_ldi_f(_jit, r0, i0);\n}\n\n#define jit_ldi_d(r0, i0)\t\tarm_ldi_d(_jit, r0, i0)\n__jit_inline void\narm_ldi_d(jit_state_t _jit, jit_fpr_t r0, void *i0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldi_d(_jit, r0, i0);\n    else\t\tvfp_ldi_d(_jit, r0, i0);\n}\n\n#define jit_ldxr_f(r0, r1, r2)\t\tarm_ldxr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_ldxr_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldxr_f(_jit, r0, r1, r2);\n    else\t\tvfp_ldxr_f(_jit, r0, r1, r2);\n}\n\n#define jit_ldxr_d(r0, r1, r2)\t\tarm_ldxr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_ldxr_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldxr_d(_jit, r0, r1, r2);\n    else\t\tvfp_ldxr_d(_jit, r0, r1, r2);\n}\n\n#define jit_ldxi_f(r0, r1, i0)\t\tarm_ldxi_f(_jit, r0, r1, i0)\n__jit_inline void\narm_ldxi_f(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, int i0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldxi_f(_jit, r0, r1, i0);\n    else\t\tvfp_ldxi_f(_jit, r0, r1, i0);\n}\n\n#define jit_ldxi_d(r0, r1, i0)\t\tarm_ldxi_d(_jit, r0, r1, i0)\n__jit_inline void\narm_ldxi_d(jit_state_t _jit, jit_fpr_t r0, jit_gpr_t r1, int i0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_ldxi_d(_jit, r0, r1, i0);\n    else\t\tvfp_ldxi_d(_jit, r0, r1, i0);\n}\n\n#define jit_str_f(r0, r1)\t\tarm_str_f(_jit, r0, r1)\n__jit_inline void\narm_str_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_str_f(_jit, r0, r1);\n    else\t\tvfp_str_f(_jit, r0, r1);\n}\n\n#define jit_str_d(r0, r1)\t\tarm_str_d(_jit, r0, r1)\n__jit_inline void\narm_str_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_str_d(_jit, r0, r1);\n    else\t\tvfp_str_d(_jit, r0, r1);\n}\n\n#define jit_sti_f(i0, r0)\t\tarm_sti_f(_jit, i0, r0)\n__jit_inline void\narm_sti_f(jit_state_t _jit, void *i0, jit_fpr_t r0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_sti_f(_jit, i0, r0);\n    else\t\tvfp_sti_f(_jit, i0, r0);\n}\n\n#define jit_sti_d(i0, r0)\t\tarm_sti_d(_jit, i0, r0)\n__jit_inline void\narm_sti_d(jit_state_t _jit, void *i0, jit_fpr_t r0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_sti_d(_jit, i0, r0);\n    else\t\tvfp_sti_d(_jit, i0, r0);\n}\n\n#define jit_stxr_f(r0, r1, r2)\t\tarm_stxr_f(_jit, r0, r1, r2)\n__jit_inline void\narm_stxr_f(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t r2)\n{\n    assert(r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_stxr_f(_jit, r0, r1, r2);\n    else\t\tvfp_stxr_f(_jit, r0, r1, r2);\n}\n\n#define jit_stxr_d(r0, r1, r2)\t\tarm_stxr_d(_jit, r0, r1, r2)\n__jit_inline void\narm_stxr_d(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t r2)\n{\n    assert(r2 != JIT_FPRET);\n    if (jit_swf_p())\tswf_stxr_d(_jit, r0, r1, r2);\n    else\t\tvfp_stxr_d(_jit, r0, r1, r2);\n}\n\n#define jit_stxi_f(i0, r0, r1)\t\tarm_stxi_f(_jit, i0, r0, r1)\n__jit_inline void\narm_stxi_f(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_stxi_f(_jit, i0, r0, r1);\n    else\t\tvfp_stxi_f(_jit, i0, r0, r1);\n}\n\n#define jit_stxi_d(i0, r0, r1)\t\tarm_stxi_d(_jit, i0, r0, r1)\n__jit_inline void\narm_stxi_d(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t r1)\n{\n    assert(r1 != JIT_FPRET);\n    if (jit_swf_p())\tswf_stxi_d(_jit, i0, r0, r1);\n    else\t\tvfp_stxi_d(_jit, i0, r0, r1);\n}\n\n#define jit_prolog_f(i0)\t\tdo {} while (0)\n#define jit_prolog_d(i0)\t\tdo {} while (0)\n\n#define jit_prepare_f(i0)\t\tarm_prepare_f(_jit, i0)\n__jit_inline void\narm_prepare_f(jit_state_t _jit, int i0)\n{\n    assert(i0 >= 0);\n    _jitl.stack_offset += i0 << 2;\n}\n\n#define jit_prepare_d(i0)\t\tarm_prepare_d(_jit, i0)\n__jit_inline void\narm_prepare_d(jit_state_t _jit, int i0)\n{\n    assert(i0 >= 0);\n    _jitl.stack_offset += i0 << 3;\n}\n\n#define jit_arg_f()\t\t\tarm_arg_f(_jit)\n__jit_inline int\narm_arg_f(jit_state_t _jit)\n{\n    int\t\tofs;\n    if (jit_hardfp_p()) {\n\tofs = _jitl.nextarg_getf++;\n\tif (ofs < 16)\n\t    return (ofs);\n    }\n    else {\n\tofs = _jitl.nextarg_get++;\n\tif (ofs < 4)\n\t    return (ofs);\n    }\n    ofs = _jitl.framesize;\n    _jitl.framesize += sizeof(int);\n    return (ofs);\n}\n\n#define jit_arg_d()\t\t\tarm_arg_d(_jit)\n__jit_inline int\narm_arg_d(jit_state_t _jit)\n{\n    int\t\tofs;\n    if (jit_hardfp_p()) {\n\tif (_jitl.nextarg_getf & 1)\n\t    ++_jitl.nextarg_getf;\n\tofs = _jitl.nextarg_getf;\n\t_jitl.nextarg_getf += 2;\n\tif (ofs < 16)\n\t    return (ofs);\n    }\n    else {\n\tif (_jitl.nextarg_get & 1)\n\t    ++_jitl.nextarg_get;\n\tofs = _jitl.nextarg_get;\n\t_jitl.nextarg_get += 2;\n\tif (ofs < 4)\n\t    return (ofs);\n    }\n    if (_jitl.framesize & 7)\n\t_jitl.framesize += 4;\n    ofs = _jitl.framesize;\n    _jitl.framesize += sizeof(double);\n    return (ofs);\n}\n\n#define jit_getarg_f(r0, i0)\t\tarm_getarg_f(_jit, r0, i0)\n__jit_inline void\narm_getarg_f(jit_state_t _jit, jit_fpr_t r0, int i0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_getarg_f(_jit, r0, i0);\n    else\t\tvfp_getarg_f(_jit, r0, i0);\n}\n\n#define jit_getarg_d(r0, i0)\t\tarm_getarg_d(_jit, r0, i0)\n__jit_inline void\narm_getarg_d(jit_state_t _jit, jit_fpr_t r0, int i0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_getarg_d(_jit, r0, i0);\n    else\t\tvfp_getarg_d(_jit, r0, i0);\n}\n\n#define jit_pusharg_f(r0)\t\tarm_pusharg_f(_jit, r0)\n__jit_inline void\narm_pusharg_f(jit_state_t _jit, jit_fpr_t r0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_pusharg_f(_jit, r0);\n    else\t\tvfp_pusharg_f(_jit, r0);\n}\n\n#define jit_pusharg_d(r0)\t\tarm_pusharg_d(_jit, r0)\n__jit_inline void\narm_pusharg_d(jit_state_t _jit, jit_fpr_t r0)\n{\n    assert(r0 != JIT_FPRET);\n    if (jit_swf_p())\tswf_pusharg_d(_jit, r0);\n    else\t\tvfp_pusharg_d(_jit, r0);\n}\n\n#define jit_retval_f(r0)\t\tarm_retval_f(_jit, r0)\n__jit_inline void\narm_retval_f(jit_state_t _jit, jit_fpr_t r0)\n{\n    if (r0 != JIT_FPRET) {\n\tif (jit_swf_p())\tswf_retval_f(_jit, r0);\n\telse\t\t\tvfp_retval_f(_jit, r0);\n    }\n    /* else assume chaining call to jit_retval_f as done in tests/funcfp.c */\n}\n\n#define jit_retval_d(r0)\t\tarm_retval_d(_jit, r0)\n__jit_inline void\narm_retval_d(jit_state_t _jit, jit_fpr_t r0)\n{\n    if (r0 != JIT_FPRET) {\n\tif (jit_swf_p())\tswf_retval_d(_jit, r0);\n\telse\t\t\tvfp_retval_d(_jit, r0);\n    }\n    /* else assume chaining call to jit_retval_d as done in tests/funcfp.c */\n}\n\n#endif /* __lightning_fp_arm_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/arm/funcs.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the arm\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2011 Free Software Foundation\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_funcs_h\n#define __lightning_funcs_h\n\n#if defined(__linux__)\n#  include <stdio.h>\n#  include <string.h>\n#endif\n\n#include <stdlib.h>\n#include <unistd.h>\n#include <sys/mman.h>\n\n// extern void __clear_cache(void*, void*);\n\n// static void\n// jit_flush_code(void *start, void *end)\n// {\n    // mprotect(start, (char *)end - (char *)start,\n\t     // PROT_READ | PROT_WRITE | PROT_EXEC);\n    // __clear_cache(start, end);\n// }\n\n#define jit_get_cpu\t\t\tjit_get_cpu\n__jit_constructor static void\njit_get_cpu(void)\n{\n#if defined(__linux__) || defined(ANDROID)\n    FILE\t*fp;\n    char\t*ptr;\n    char\t buf[128];\n    static int\t initialized;\n\n    if (initialized)\n\t\treturn;\n    initialized = 1;\n    if ((fp = fopen(\"/proc/cpuinfo\", \"r\")) == NULL)\n\t\treturn;\n\n    while (fgets(buf, sizeof(buf), fp)) {\n\tif (strncmp(buf, \"CPU architecture:\", 17) == 0) {\n\t    jit_cpu.version = strtol(buf + 17, &ptr, 10);\n\t    while (*ptr) {\n\t\tif (*ptr == 'T' || *ptr == 't') {\n\t\t    ++ptr;\n\t\t    jit_cpu.thumb = 1;\n\t\t}\n\t\telse if (*ptr == 'E' || *ptr == 'e') {\n\t\t    jit_cpu.extend = 1;\n\t\t    ++ptr;\n\t\t}\n\t\telse\n\t\t    ++ptr;\n\t    }\n\t}\n\telse if (strncmp(buf, \"Features\\t:\", 10) == 0) {\n\t    if ((ptr = strstr(buf + 10, \"vfpv\")))\n\t\tjit_cpu.vfp = strtol(ptr + 4, NULL, 0);\n\t    if ((ptr = strstr(buf + 10, \"neon\")))\n\t\tjit_cpu.neon = 1;\n\t    if ((ptr = strstr(buf + 10, \"thumb\")))\n\t\tjit_cpu.thumb = 1;\n\t}\n    }\n    fclose(fp);\n#endif\n#if defined(__ARM_PCS_VFP)\n    if (!jit_cpu.vfp)\n\t\tjit_cpu.vfp = 3;\n    if (!jit_cpu.version)\n\t\tjit_cpu.version = 7;\n    jit_cpu.abi = 1;\n#endif\n    /* armv6t2 todo (software float and thumb2) */\n    if (!jit_cpu.vfp && jit_cpu.thumb)\n\t\tjit_cpu.thumb = 0;\n}\n\n#endif /* __lightning_funcs_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/asm-common.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tDynamic assembler support\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n#ifndef __lightning_asm_common_h\n#define __lightning_asm_common_h_\n\n\n#ifndef _ASM_SAFETY\n#define JITFAIL(MSG) 0\n#else\n#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || (defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3))\n#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __func__)\n#elif defined __GNUC__\n#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __FUNCTION__)\n#else\n#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, \"(unknown)\")\n#endif\n#endif\n\n#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || (defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3))\n#define JITSORRY(MSG) jit_fail(\"sorry, unimplemented: \" MSG, __FILE__, __LINE__, __func__)\n#elif defined __GNUC__\n#define JITSORRY(MSG) jit_fail(\"sorry, unimplemented: \" MSG, __FILE__, __LINE__, __FUNCTION__)\n#else\n#define JITSORRY(MSG) jit_fail(\"sorry, unimplemented: \" MSG, __FILE__, __LINE__, \"(unknown)\")\n#endif\n\n#ifdef __GNUC__\n#define JIT_UNUSED\t\t__attribute__((__unused__))\n#else\n#define JIT_UNUSED\n#endif\n\nstatic int jit_fail(const char *, const char*, int, const char *) JIT_UNUSED;\n\n\n/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and\n   does not implement __extension__.  But that compiler doesn't define\n   __GNUC_MINOR__.  */\n#ifdef __GNUC__\n#if __GNUC__ < 2 || (defined(__NeXT__) && !__GNUC_MINOR__)\n#define __extension__\n#endif\n\n#define _TEMPD(type, var) \t\n\n#define _TEMP(type, var, val, body) __extension__ ({\t\\\n  register struct { type var } _jitl; _jitl.var = val;\t\\\n  body;\t\t\t\t\t\t\t\\\n})\n\n#else\n\n/* Between loading a global and calling a subroutine, we choose the lesser\n * evil. */\n#define _TEMPD(type, var) \tstatic type var;\n#define _TEMP(type, var, val, body) ((var = val), body)\n\n#endif\n\n#define _jit_UC(X)\t((_uc  )(X))\n#define _jit_US(X)\t((_us  )(X))\n#define _jit_UI(X)\t((_ui  )(X))\n#define _jit_SI(X)\t((int  )(X))\n#define _jit_SL(X)\t((_sl  )(X))\n#define _jit_UL(X)\t((_ul  )(X))\n# define _PUC(X)\t((_uc *)(X))\n# define _PUS(X)\t((_us *)(X))\n# define _PUI(X)\t((_ui *)(X))\n# define _PSI(X)\t((int *)(X))\n# define _PSL(X)\t((_sl *)(X))\n# define _PUL(X)\t((_ul *)(X))\n\n#define _jit_B(B)         _jit_UL(((*_jit->x.uc_pc++)= _jit_UC((B)&  0xff)))\n#define _jit_W(W)         _jit_UL(((*_jit->x.us_pc++)= _jit_US((W)&0xffff)))\n#define _jit_I(I)         _jit_UL(((*_jit->x.ui_pc++)= _jit_UI((I)       )))\n#define _jit_L(L)         _jit_UL(((*_jit->x.ul_pc++)= _jit_UL((L)       )))\n#define _jit_I_noinc(I)   _jit_UL(((*_jit->x.ui_pc)=   _jit_UI((I)       )))\n\n#define _MASK(N)\t((unsigned long)((1L<<(N)))-1L)\n#define _siP(N,I)\t(!((((unsigned long)(I))^(((unsigned long)(I))<<1))&~_MASK(N)))\n#define _uiP(N,I)\t(!(((unsigned long)(I))&~_MASK(N)))\n#define _suiP(N,I)\t(_siP(N,I) | _uiP(N,I))\n\n#ifndef _ASM_SAFETY\n#define _ck_s(W,I)\t(_jit_UL(I) & _MASK(W))\n#define _ck_u(W,I)    \t(_jit_UL(I) & _MASK(W))\n#define _ck_su(W,I)    \t(_jit_UL(I) & _MASK(W))\n#define _ck_d(W,I)    \t(_jit_UL(I) & _MASK(W))\n#else\n#define _ck_s(W,I)\t(_siP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL(  \"signed integer `\"#I\"' too large for \"#W\"-bit field\"))\n#define _ck_u(W,I)    \t(_uiP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL(\"unsigned integer `\"#I\"' too large for \"#W\"-bit field\"))\n#define _ck_su(W,I)    \t(_suiP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL(        \"integer `\"#I\"' too large for \"#W\"-bit field\"))\n#define _ck_d(W,I)    \t(_siP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL(    \"displacement `\"#I\"' too large for \"#W\"-bit field\"))\n#endif\n\n#define _s0P(I)\t\t((I)==0)\n#define _s8P(I)\t\t_siP(8,I)\n#define _s16P(I)\t_siP(16,I)\n#define _s20P(I)\t_siP(20,I)\n#define _s24P(I)\t_siP(24,I)\n#define _s32P(I)\t_siP(32,I)\n#define _u8P(I)\t\t_uiP(8,I)\n#define _u16P(I)\t_uiP(16,I)\n#define _u32P(I)\t_uiP(32,I)\n\n#define _su8(I)\t\t_ck_su(8,I)\n#define _su16(I)\t_ck_su(16,I)\n\n#define _s1(I)          _ck_s( 1,I)\n#define _s2(I)          _ck_s( 2,I)\n#define _s3(I)          _ck_s( 3,I)\n#define _s4(I)          _ck_s( 4,I)\n#define _s5(I)          _ck_s( 5,I)\n#define _s6(I)          _ck_s( 6,I)\n#define _s7(I)          _ck_s( 7,I)\n#define _s8(I)          _ck_s( 8,I)\n#define _s9(I)          _ck_s( 9,I)\n#define _s10(I)         _ck_s(10,I)\n#define _s11(I)         _ck_s(11,I)\n#define _s12(I)         _ck_s(12,I)\n#define _s13(I)         _ck_s(13,I)\n#define _s14(I)         _ck_s(14,I)\n#define _s15(I)         _ck_s(15,I)\n#define _s16(I)         _ck_s(16,I)\n#define _s17(I)         _ck_s(17,I)\n#define _s18(I)         _ck_s(18,I)\n#define _s19(I)         _ck_s(19,I)\n#define _s20(I)         _ck_s(20,I)\n#define _s21(I)         _ck_s(21,I)\n#define _s22(I)         _ck_s(22,I)\n#define _s23(I)         _ck_s(23,I)\n#define _s24(I)         _ck_s(24,I)\n#define _s25(I)         _ck_s(25,I)\n#define _s26(I)         _ck_s(26,I)\n#define _s27(I)         _ck_s(27,I)\n#define _s28(I)         _ck_s(28,I)\n#define _s29(I)         _ck_s(29,I)\n#define _s30(I)         _ck_s(30,I)\n#define _s31(I)         _ck_s(31,I)\n#if __WORDSIZE == 32\n#  define _s32(I)\t(I)\n#else\n#  define _s32(I)\t_ck_s(32,I)\n#endif\n#define _u1(I)          _ck_u( 1,I)\n#define _u2(I)          _ck_u( 2,I)\n#define _u3(I)          _ck_u( 3,I)\n#define _u4(I)          _ck_u( 4,I)\n#define _u5(I)          _ck_u( 5,I)\n#define _u6(I)          _ck_u( 6,I)\n#define _u7(I)          _ck_u( 7,I)\n#define _u8(I)          _ck_u( 8,I)\n#define _u9(I)          _ck_u( 9,I)\n#define _u10(I)         _ck_u(10,I)\n#define _u11(I)         _ck_u(11,I)\n#define _u12(I)         _ck_u(12,I)\n#define _u13(I)         _ck_u(13,I)\n#define _u14(I)         _ck_u(14,I)\n#define _u15(I)         _ck_u(15,I)\n#define _u16(I)         _ck_u(16,I)\n#define _u17(I)         _ck_u(17,I)\n#define _u18(I)         _ck_u(18,I)\n#define _u19(I)         _ck_u(19,I)\n#define _u20(I)         _ck_u(20,I)\n#define _u21(I)         _ck_u(21,I)\n#define _u22(I)         _ck_u(22,I)\n#define _u23(I)         _ck_u(23,I)\n#define _u24(I)         _ck_u(24,I)\n#define _u25(I)         _ck_u(25,I)\n#define _u26(I)         _ck_u(26,I)\n#define _u27(I)         _ck_u(27,I)\n#define _u28(I)         _ck_u(28,I)\n#define _u29(I)         _ck_u(29,I)\n#define _u30(I)         _ck_u(30,I)\n#define _u31(I)         _ck_u(31,I)\n#if __WORDSIZE == 32\n#  define _u32(I)\t(I)\n#else\n#  define _u32(I)\t_ck_u(32,I)\n#endif\n\n#endif /* __lightning_asm_common_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/config_lightning.h",
    "content": "/* config.h.  Generated from config.h.in by configure.  */\n/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Define if test programs should not run the compiled code */\n#define LIGHTNING_CROSS 1\n\n/* Define if the test programs should disassemble the code they produce */\n#define LIGHTNING_DISASSEMBLE 1\n\n/* Used to pick the appropriate disassembler, for debugging */\n#define LIGHTNING_TARGET LIGHTNING_ARM\n\n/* Name of package */\n#define PACKAGE \"lightning\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"bonzini@gnu.org\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"GNU lightning\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"GNU lightning 1.2c\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"lightning\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"http://www.gnu.org/software/lightning/\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"1.2c\"\n\n/* Version number of package */\n#define VERSION \"1.2c\"\n\n#define __WORDSIZE 32\n\n/* Define to enable assertions */\n/* #undef _ASM_SAFETY */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/core-common.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer support\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n#ifndef __lightning_core_common_h\n#define __lightning_core_common_h_\n\n#define JIT_NOREG\t\t\t(-1)\n#define JIT_R0\t\t\t\tJIT_R(0)\n#define JIT_R1\t\t\t\tJIT_R(1)\n#define JIT_R2\t\t\t\tJIT_R(2)\n#define JIT_V0\t\t\t\tJIT_V(0)\n#define JIT_V1\t\t\t\tJIT_V(1)\n#define JIT_V2\t\t\t\tJIT_V(2)\n\n#define\tjit_get_ip()\t\t\t(*(jit_code *) &_jit->x.pc)\n#define\tjit_set_ip(ptr)\t\t\t(_jit->x.pc = (ptr), jit_get_ip ())\n#define\tjit_get_label()\t\t\t(_jit->x.pc)\n#define\tjit_forward()\t\t\t(_jit->x.pc)\n\n#define\tjit_field(struc, f)\t\t( ((long) (&((struc *) 8)->f) ) - 8)\n#define\tjit_ptr_field(struc_p, f)\t( ((long) (&((struc_p) 8)->f) ) - 8)\n\n/* realignment via N-byte no-ops */\n\n#ifndef jit_align\n#define jit_align(n)\n#endif\n\n/* jit_code: union of many possible function pointer types.  Returned\n * by jit_get_ip().\n */\ntypedef union jit_code {\t\n  char\t\t *ptr;\n  void\t\t (*vptr)(void);\n  char\t\t (*cptr)(void);\n  unsigned char\t (*ucptr)(void);\n  short\t\t (*sptr)(void);\n  unsigned short (*usptr)(void);\n  int\t\t (*iptr)(void);\n  unsigned int\t (*uiptr)(void);\n  long\t\t (*lptr)(void);\n  unsigned long\t (*ulptr)(void);\n  void *\t (*pptr)(void);\n  float\t\t (*fptr)(void);\n  double\t (*dptr)(void);\n} jit_code;\n\n#ifndef jit_fill_delay_after\n#define jit_fill_delay_after(branch)\t(branch)\n#endif\n\n#define jit_delay(insn, branch)\t\t((insn), jit_fill_delay_after(branch))\n\n\n/* ALU synonyms */\n#if !defined(jit_addci_ui)\n#  if !defined(jit_addci_i)\n     /* need add/sub that sets carry for all operands */\n#    if _ASM_SAFETY\n#      warning Assuming jit_{add,sub}{r,i}_{i,ui} always sets carry\n#    endif\n#    define jit_addci_ui(d, rs, is)\tjit_addi_ui((d), (rs), (is))\n#    define jit_addcr_ui(d, s1, s2)\tjit_addr_ui((d), (s1), (s2))\n#    define jit_subci_ui(d, rs, is)\tjit_subi_ui((d), (rs), (is))\n#    define jit_subcr_ui(d, s1, s2)\tjit_subr_ui((d), (s1), (s2))\n#  elif defined(jit_addci_i)\n     /* allow logically reversed definitions */\n#    define jit_addci_ui(d, rs, is)\tjit_addci_i((d), (rs), (is))\n#    define jit_addcr_ui(d, s1, s2)\tjit_addcr_i((d), (s1), (s2))\n#    define jit_subci_ui(d, rs, is)\tjit_subci_i((d), (rs), (is))\n#    define jit_subcr_ui(d, s1, s2)\tjit_subcr_i((d), (s1), (s2))\n#  endif\n#endif\n#if !defined(jit_addci_i) && defined(jit_addci_ui)\n   /* provide compatibility logically wrong definitions */\n#  define jit_addci_i(d, rs, is)\tjit_addci_ui((d), (rs), (is))\n#  define jit_addcr_i(d, s1, s2)\tjit_addcr_ui((d), (s1), (s2))\n#  define jit_subci_i(d, rs, is)\tjit_subci_ui((d), (rs), (is))\n#  define jit_subcr_i(d, s1, s2)\tjit_subcr_ui((d), (s1), (s2))\n#endif\n#if !defined(jit_addxi_ui) && defined(jit_addxi_i)\n   /* allow logically reversed definitions */\n#  define jit_addxi_ui(d, rs, is)\tjit_addxi_i((d), (rs), (is))\n#  define jit_addxr_ui(d, s1, s2)\tjit_addxr_i((d), (s1), (s2))\n#  define jit_subxi_ui(d, rs, is)\tjit_subxi_i((d), (rs), (is))\n#  define jit_subxr_ui(d, s1, s2)\tjit_subxr_i((d), (s1), (s2))\n#endif\n#if !defined(jit_addxi_i) && defined(jit_addxi_ui)\n   /* provide compatibility logically wrong definitions */\n#  define jit_addxi_i(d, rs, is)\tjit_addxi_ui((d), (rs), (is))\n#  define jit_addxr_i(d, s1, s2)\tjit_addxr_ui((d), (s1), (s2))\n#  define jit_subxi_i(d, rs, is)\tjit_subxi_ui((d), (rs), (is))\n#  define jit_subxr_i(d, s1, s2)\tjit_subxr_ui((d), (s1), (s2))\n#endif\n\n#define jit_addi_ui(d, rs, is)\t\tjit_addi_i((d), (rs), (is))\t\n#define jit_addr_ui(d, s1, s2)\t\tjit_addr_i((d), (s1), (s2))\n#define jit_andi_ui(d, rs, is)\t\tjit_andi_i((d), (rs), (is))\t\n#define jit_andr_ui(d, s1, s2)\t\tjit_andr_i((d), (s1), (s2))\n#define jit_lshi_ui(d, rs, is)\t\tjit_lshi_i((d), (rs), (is))\t\n#define jit_lshr_ui(d, s1, s2)\t\tjit_lshr_i((d), (s1), (s2))\n#ifndef jit_movi_ui\n#  define jit_movi_ui(d, rs)\t\tjit_movi_i((d), (rs))\n#endif\n#define jit_movr_ui(d, rs)\t\tjit_movr_i((d), (rs))\n#define jit_ori_ui(d, rs, is)\t\tjit_ori_i((d), (rs), (is))\t\n#define jit_orr_ui(d, s1, s2)\t\tjit_orr_i((d), (s1), (s2))\n#define jit_rsbi_ui(d, rs, is)\t\tjit_rsbi_i((d), (rs), (is))\t\n#define jit_rsbr_ui(d, s1, s2)\t\tjit_rsbr_i((d), (s1), (s2))\n#define jit_subi_ui(d, rs, is)\t\tjit_subi_i((d), (rs), (is))\t\n#define jit_subr_ui(d, s1, s2)\t\tjit_subr_i((d), (s1), (s2))\n#define jit_xori_ui(d, rs, is)\t\tjit_xori_i((d), (rs), (is))\t\n#define jit_xorr_ui(d, s1, s2)\t\tjit_xorr_i((d), (s1), (s2))\n\n#if __WORDSIZE == 32\n   /* common definitions when sizeof(long) == sizeof(int) */\n#  if !defined(jit_addci_ul) && defined(jit_addci_ui)\n#    define jit_addci_ul(d, rs, is)\tjit_addci_ui((d), (rs), (is))\n#    define jit_addcr_ul(d, s1, s2)\tjit_addcr_ui((d), (s1), (s2))\n#    define jit_subci_ul(d, rs, is)\tjit_subci_ui((d), (rs), (is))\n#    define jit_subcr_ul(d, s1, s2)\tjit_subcr_ui((d), (s1), (s2))\n#  endif\n#  if !defined(jit_addxi_ul) && defined(jit_addxi_ui)\n#    define jit_addxi_ul(d, rs, is)\tjit_addxi_ui((d), (rs), (is))\n#    define jit_addxr_ul(d, s1, s2)\tjit_addxr_ui((d), (s1), (s2))\n#    define jit_subxi_ul(d, rs, is)\tjit_subxi_ui((d), (rs), (is))\n#    define jit_subxr_ul(d, s1, s2)\tjit_subxr_ui((d), (s1), (s2))\n#  endif\n#endif\n#if !defined(jit_addci_ul)\n#  if !defined(jit_addci_l)\n     /* need add/sub that sets carry for all operands */\n#    if _ASM_SAFETY\n#      warning Assuming jit_{add,sub}{r,i}_{l,ul} always sets carry\n#    endif\n#    define jit_addci_ul(d, rs, is)\tjit_addi_ul((d), (rs), (is))\n#    define jit_addcr_ul(d, s1, s2)\tjit_addr_ul((d), (s1), (s2))\n#    define jit_subci_ul(d, rs, is)\tjit_subi_ul((d), (rs), (is))\n#    define jit_subcr_ul(d, s1, s2)\tjit_subr_ul((d), (s1), (s2))\n#  elif defined(jit_addci_l)\n     /* allow logically reversed definitions */\n#    define jit_addci_ul(d, rs, is)\tjit_addci_l((d), (rs), (is))\n#    define jit_addcr_ul(d, s1, s2)\tjit_addcr_l((d), (s1), (s2))\n#    define jit_subci_ul(d, rs, is)\tjit_subci_l((d), (rs), (is))\n#    define jit_subcr_ul(d, s1, s2)\tjit_subcr_l((d), (s1), (s2))\n#  endif\n#endif\n#if !defined(jit_addci_l) && defined(jit_addci_ul)\n  /* provide compatibility logically wrong definitions */\n#  define jit_addci_l(d, rs, is)\tjit_addci_ul((d), (rs), (is))\n#  define jit_addcr_l(d, s1, s2)\tjit_addcr_ul((d), (s1), (s2))\n#  define jit_subci_l(d, rs, is)\tjit_subci_ul((d), (rs), (is))\n#  define jit_subcr_l(d, s1, s2)\tjit_subcr_ul((d), (s1), (s2))\n#endif\n#if !defined(jit_addxi_ul) && defined(jit_addxi_l)\n   /* allow logically reversed definitions */\n#  define jit_addxi_ul(d, rs, is)\tjit_addxi_l((d), (rs), (is))\n#  define jit_addxr_ul(d, s1, s2)\tjit_addxr_l((d), (s1), (s2))\n#  define jit_subxi_ul(d, rs, is)\tjit_subxi_l((d), (rs), (is))\n#  define jit_subxr_ul(d, s1, s2)\tjit_subxr_l((d), (s1), (s2))\n#endif\n#if !defined(jit_addxi_l) && defined(jit_addxi_ul)\n   /* provide compatibility logically wrong definitions */\n#  define jit_addxi_l(d, rs, is)\tjit_addxi_ul((d), (rs), (is))\n#  define jit_addxr_l(d, s1, s2)\tjit_addxr_ul((d), (s1), (s2))\n#  define jit_subxi_l(d, rs, is)\tjit_subxi_ul((d), (rs), (is))\n#  define jit_subxr_l(d, s1, s2)\tjit_subxr_ul((d), (s1), (s2))\n#endif\n#define jit_addi_ul(d, rs, is)\t\tjit_addi_l((d), (rs), (is))\t\n#define jit_addr_ul(d, s1, s2)\t\tjit_addr_l((d), (s1), (s2))\n#define jit_andi_ul(d, rs, is)\t\tjit_andi_l((d), (rs), (is))\t\n#define jit_andr_ul(d, s1, s2)\t\tjit_andr_l((d), (s1), (s2))\n#define jit_lshi_ul(d, rs, is)\t\tjit_lshi_l((d), (rs), (is))\t\n#define jit_lshr_ul(d, s1, s2)\t\tjit_lshr_l((d), (s1), (s2))\n#ifndef jit_movi_ul\n#  define jit_movi_ul(d, rs)\t\tjit_movi_l((d), (rs))\n#endif\n#ifndef jit_movr_ul\n#  define jit_movr_ul(d, rs)\t\tjit_movr_l((d), (rs))\n#endif\n#define jit_ori_ul(d, rs, is)\t\tjit_ori_l((d), (rs), (is))\t\n#define jit_orr_ul(d, s1, s2)\t\tjit_orr_l((d), (s1), (s2))\n#define jit_rsbi_ul(d, rs, is)\t\tjit_rsbi_l((d), (rs), (is))\t\n#define jit_rsbr_ul(d, s1, s2)\t\tjit_rsbr_l((d), (s1), (s2))\n#define jit_subi_ul(d, rs, is)\t\tjit_subi_l((d), (rs), (is))\t\n#define jit_subr_ul(d, s1, s2)\t\tjit_subr_l((d), (s1), (s2))\n#define jit_xori_ul(d, rs, is)\t\tjit_xori_l((d), (rs), (is))\t\n#define jit_xorr_ul(d, s1, s2)\t\tjit_xorr_l((d), (s1), (s2))\n#define jit_addr_p(d, s1, s2)\t\tjit_addr_ul((d), (s1), \t      (s2))\n#define jit_addi_p(d, rs, is)\t\tjit_addi_ul((d), (rs), (long) (is))\n#ifndef jit_movr_p\n#  define jit_movr_p(d, rs)\t\tjit_movr_ul((d),              (rs))\n#endif\n#define jit_subr_p(d, s1, s2)\t\tjit_subr_ul((d), (s1),        (s2))\n#define jit_subi_p(d, rs, is)\t\tjit_subi_ul((d), (rs), (long) (is))\n#define jit_rsbi_p(d, rs, is)\t\tjit_rsbi_ul((d), (rs), (long) (is))\n\n#ifndef jit_movi_p\n#define jit_movi_p(d, is)\t\t(jit_movi_ul((d),       (long) (is)), _jit->x.pc)\n#endif\n\n#define jit_patch(pv)        \t\tjit_patch_at ((pv), (_jit->x.pc))\n\n/* NEG is not mandatory -- pick an appropriate implementation */\n#ifndef jit_negr_i\n#  ifdef JIT_RZERO\n#    define jit_negr_i(d, rs)\t\tjit_subr_i((d), JIT_RZERO, (rs))\n#      if __WORDSIZE == 64\n#        define jit_negr_l(d, rs)\tjit_subr_l((d), JIT_RZERO, (rs))\n#      endif\n#  else /* !JIT_RZERO */\n#    ifndef jit_rsbi_i\n#      define jit_negr_i(d, rs)\t\t(jit_xori_i((d), (rs), -1), jit_addi_l((d), (d), 1))\n#      define jit_negr_l(d, rs)\t\t(jit_xori_l((d), (rs), -1), jit_addi_l((d), (d), 1))\n#    else /* jit_rsbi_i */\n#      define jit_negr_i(d, rs)\t\tjit_rsbi_i((d), (rs), 0)\n#      define jit_negr_l(d, rs)\t\tjit_rsbi_l((d), (rs), 0)\n#    endif /* jit_rsbi_i */\n#  endif /* !JIT_RZERO */\n#endif /* !jit_negr_i */\n\n/* Common 'shortcut' implementations */\n#ifndef jit_subi_i\n#  define jit_subi_i(d, rs, is)\t\tjit_addi_i((d), (rs), -(is))\n#endif\n#ifndef jit_subi_l\n#  define jit_subi_l(d, rs, is)\t\tjit_subi_i((d), (rs), (is))\n#endif\n#define jit_rsbr_f(d, s1, s2)\t\tjit_subr_f((d), (s2), (s1))\n#define jit_rsbr_d(d, s1, s2)\t\tjit_subr_d((d), (s2), (s1))\n#ifndef jit_rsbr_i\n#  define jit_rsbr_i(d, s1, s2)\t\tjit_subr_i((d), (s2), (s1))\n#endif\n#define jit_rsbr_l(d, s1, s2)\t\tjit_subr_l((d), (s2), (s1))\n#define jit_rsbr_p(d, s1, s2)\t\tjit_subr_p((d), (s2), (s1))\n\n/* Unary */\n#ifndef jit_notr_i\n#  define jit_notr_i(d, rs)\t\tjit_xori_i((d), (rs), ~0)\n#endif\n#ifndef jit_notr_l\n#  define jit_notr_l(d, rs)\t\tjit_xori_l((d), (rs), ~0L)\n#endif\n#ifndef jit_notr_c\n#  define jit_notr_c(d, rs)\t\tjit_notr_i((d), (rs))\n#  define jit_notr_uc(d, rs)\t\tjit_notr_i((d), (rs))\n#  define jit_notr_s(d, rs)\t\tjit_notr_i((d), (rs))\n#  define jit_notr_us(d, rs)\t\tjit_notr_i((d), (rs))\n#endif\n#ifndef jit_notr_ui\n#  define jit_notr_ui(d, rs)\t\tjit_notr_i((d), (rs))\n#endif\n#ifndef jit_notr_ul\n#  define jit_notr_ul(d, rs)\t\tjit_notr_l((d), (rs))\n#endif\n\n#ifndef jit_extr_c_ui\n#  define jit_extr_c_ui(d, rs)\t\tjit_andi_ui((d), (rs), 0xFF)\n#endif\n#ifndef jit_extr_s_ui\n#  define jit_extr_s_ui(d, rs)\t\tjit_andi_ui((d), (rs), 0xFFFF)\n#endif\n#ifndef jit_extr_c_i\n#  define jit_extr_c_i(d, rs)\t\t(jit_lshi_i((d), (rs), 24), jit_rshi_i((d), (d), 24))\n#endif\n#ifndef jit_extr_s_i\n#  define jit_extr_s_i(d, rs)\t\t(jit_lshi_i((d), (rs), 16), jit_rshi_i((d), (d), 16))\n#endif\n\n#if __WORDSIZE == 64\n#  ifndef jit_extr_c_l\n#    define jit_extr_c_l(d, rs)\t\t(jit_lshi_l((d), (rs), 56), jit_rshi_l((d), (d), 56))\n#  endif\n#  ifndef jit_extr_s_l\n#    define jit_extr_s_l(d, rs)\t\t(jit_lshi_l((d), (rs), 48), jit_rshi_l((d), (d), 48))\n#  endif\n#  ifndef jit_extr_i_l\n#    define jit_extr_i_l(d, rs)\t\t(jit_lshi_l((d), (rs), 32), jit_rshi_l((d), (d), 32))\n#  endif\n#  ifndef jit_extr_c_ul\n#    define jit_extr_c_ul(d, rs)\tjit_andi_l((d), (rs), 0xFF)\n#  endif\n#  ifndef jit_extr_s_ul\n#    define jit_extr_s_ul(d, rs)\tjit_andi_l((d), (rs), 0xFFFF)\n#  endif\n#  ifndef jit_extr_i_ul\n#    define jit_extr_i_ul(d, rs)\tjit_andi_l((d), (rs), 0xFFFFFFFFUL)\n#  endif\n#endif\t/* __WORDSIZE == 64 */\n\n#define jit_extr_c_s(d, rs)\t\tjit_extr_c_i((d), (rs))\n#define jit_extr_c_us(d, rs)\t\tjit_extr_c_ui((d), (rs))\n#define jit_extr_uc_s(d, rs)\t\tjit_extr_uc_i((d), (rs))\n#define jit_extr_uc_us(d, rs)\t\tjit_extr_uc_ui((d), (rs))\n#define jit_extr_uc_i(d, rs)\t\tjit_extr_c_ui((d), (rs))\n#define jit_extr_uc_ui(d, rs)\t\tjit_extr_c_ui((d), (rs))\n#define jit_extr_us_i(d, rs)\t\tjit_extr_s_ui((d), (rs))\n#define jit_extr_us_ui(d, rs)\t\tjit_extr_s_ui((d), (rs))\n#define jit_extr_uc_l(d, rs)\t\tjit_extr_c_ul((d), (rs))\n#define jit_extr_uc_ul(d, rs)\t\tjit_extr_c_ul((d), (rs))\n#define jit_extr_us_l(d, rs)\t\tjit_extr_s_ul((d), (rs))\n#define jit_extr_us_ul(d, rs)\t\tjit_extr_s_ul((d), (rs))\n#define jit_extr_ui_l(d, rs)\t\tjit_extr_i_ul((d), (rs))\n#define jit_extr_ui_ul(d, rs)\t\tjit_extr_i_ul((d), (rs))\n\n\n/* NTOH/HTON is not mandatory for big endian architectures */\n#ifndef jit_ntoh_ui /* big endian */\n#define jit_ntoh_ui(d, rs)\t\t((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))\n#define jit_ntoh_us(d, rs)\t\t((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))\n#endif /* big endian */\n\n/* hton is a synonym for ntoh */\n#define jit_hton_ui(d, rs)\t\tjit_ntoh_ui((d), (rs))\n#define jit_hton_us(d, rs)\t\tjit_ntoh_us((d), (rs))\n\n/* Stack synonyms */\n#define jit_pushr_ui(rs)\t\tjit_pushr_i(rs)\n#define jit_popr_ui(rs)\t\t\tjit_popr_i(rs)\t\t\n#define jit_pushr_ul(rs)\t\tjit_pushr_l(rs)\n#define jit_popr_ul(rs)\t\t\tjit_popr_l(rs)\t\t\n#define jit_pushr_p(rs)\t\t\tjit_pushr_ul(rs)\n#define jit_popr_p(rs)\t\t\tjit_popr_ul(rs)\t\t\n\n#define jit_prepare(nint)\t\tjit_prepare_i((nint))\n#define jit_pusharg_c(rs)\t\tjit_pusharg_i(rs)\n#define jit_pusharg_s(rs)\t\tjit_pusharg_i(rs)\n#define jit_pusharg_uc(rs)\t\tjit_pusharg_i(rs)\n#define jit_pusharg_us(rs)\t\tjit_pusharg_i(rs)\n#define jit_pusharg_ui(rs)\t\tjit_pusharg_i(rs)\n#define jit_pusharg_ul(rs)\t\tjit_pusharg_l(rs)\n#define jit_pusharg_p(rs)\t\tjit_pusharg_ul(rs)\n\n/* Memory synonyms */\n\n#ifdef JIT_RZERO\n#ifndef jit_ldi_c\n#define jit_ldi_c(rd, is)\t\tjit_ldxi_c((rd), JIT_RZERO, (is))\t\t\n#define jit_sti_c(id, rs)\t\tjit_stxi_c((id), JIT_RZERO, (rs))\t\t\n#define jit_ldi_s(rd, is)\t\tjit_ldxi_s((rd), JIT_RZERO, (is))\t\t\n#define jit_sti_s(id, rs)\t\tjit_stxi_s((id), JIT_RZERO, (rs))\t\t\n#define jit_ldi_i(rd, is)\t\tjit_ldxi_i((rd), JIT_RZERO, (is))\t\t\n#define jit_sti_i(id, rs)\t\tjit_stxi_i((id), JIT_RZERO, (rs))\t\t\n#define jit_ldi_l(rd, is)\t\tjit_ldxi_l((rd), JIT_RZERO, (is))\t\t\n#define jit_sti_l(id, rs)\t\tjit_stxi_l((id), JIT_RZERO, (rs))\t\t\n#define jit_ldi_uc(rd, is)\t\tjit_ldxi_uc((rd), JIT_RZERO, (is))\t\t\n#define jit_ldi_us(rd, is)\t\tjit_ldxi_us((rd), JIT_RZERO, (is))\t\t\n#define jit_ldi_ui(rd, is)\t\tjit_ldxi_ui((rd), JIT_RZERO, (is))\t\t\n#  if __WORDSIZE == 64\n#    define jit_ldi_ul(rd, is)\t\tjit_ldxi_ul((rd), JIT_RZERO, (is))\n#  endif\n#endif\n\n#ifndef jit_ldr_c\n#define jit_ldr_c(rd, rs)\t\tjit_ldxr_c((rd), JIT_RZERO, (rs))\t\t\n#define jit_str_c(rd, rs)\t\tjit_stxr_c(JIT_RZERO, (rd), (rs))\t\t\n#define jit_ldr_s(rd, rs)\t\tjit_ldxr_s((rd), JIT_RZERO, (rs))\t\t\n#define jit_str_s(rd, rs)\t\tjit_stxr_s(JIT_RZERO, (rd), (rs))\t\t\n#define jit_ldr_i(rd, rs)\t\tjit_ldxr_i((rd), JIT_RZERO, (rs))\t\t\n#define jit_str_i(rd, rs)\t\tjit_stxr_i(JIT_RZERO, (rd), (rs))\t\t\n#define jit_ldr_l(rd, rs)\t\tjit_ldxr_l((rd), JIT_RZERO, (rs))\t\t\n#define jit_str_l(rd, rs)\t\tjit_stxr_l(JIT_RZERO, (rd), (rs))\t\t\n#define jit_ldr_uc(rd, rs)\t\tjit_ldxr_uc((rd), JIT_RZERO, (rs))\t\t\n#define jit_ldr_us(rd, rs)\t\tjit_ldxr_us((rd), JIT_RZERO, (rs))\n#define jit_ldr_ui(rd, rs)\t\tjit_ldxr_ui((rd), JIT_RZERO, (rs))\t\t\n#  if __WORDSIZE == 64\n#    define jit_ldr_ul(rd, rs)\t\tjit_ldxr_ul((rd), JIT_RZERO, (rs))\n#  endif\n#endif\n#endif\n\n#define jit_str_uc(rd, rs)\t\tjit_str_c((rd), (rs))\n#define jit_sti_uc(id, rs)\t\tjit_sti_c((id), (rs))\n#define jit_stxr_uc(d1, d2, rs)\t\tjit_stxr_c((d1), (d2), (rs))\n#define jit_stxi_uc(id, rd, is)\t\tjit_stxi_c((id), (rd), (is))\n\n#define jit_str_us(rd, rs)\t\tjit_str_s((rd), (rs))\n#define jit_sti_us(id, rs)\t\tjit_sti_s((id), (rs))\n#define jit_stxr_us(d1, d2, rs)\t\tjit_stxr_s((d1), (d2), (rs))\n#define jit_stxi_us(id, rd, is)\t\tjit_stxi_s((id), (rd), (is))\n\n#define jit_str_ui(rd, rs)\t\tjit_str_i((rd), (rs))\n#define jit_sti_ui(id, rs)\t\tjit_sti_i((id), (rs))\n#define jit_stxr_ui(d1, d2, rs)\t\tjit_stxr_i((d1), (d2), (rs))\n#define jit_stxi_ui(id, rd, is)\t\tjit_stxi_i((id), (rd), (is))\n\n#define jit_str_ul(rd, rs)\t\tjit_str_l((rd), (rs))\n#define jit_sti_ul(id, rs)\t\tjit_sti_l((id), (rs))\n#define jit_stxr_ul(d1, d2, rs)\t\tjit_stxr_l((d1), (d2), (rs))\n#define jit_stxi_ul(id, rd, is)\t\tjit_stxi_l((id), (rd), (is))\n\n#define jit_str_p(rd, rs)\t\tjit_str_l((rd), (rs))\n#define jit_sti_p(id, rs)\t\tjit_sti_l((id), (rs))\n#define jit_stxr_p(d1, d2, rs)\t\tjit_stxr_l((d1), (d2), (rs))\n#define jit_stxi_p(id, rd, is)\t\tjit_stxi_l((id), (rd), (is))\n\n#define jit_ldr_p(rd, rs)\t\tjit_ldr_l((rd), (rs))\n#define jit_ldi_p(rd, is)\t\tjit_ldi_l((rd), (is))\n#define jit_ldxr_p(rd, s1, s2)\t\tjit_ldxr_l((rd), (s1), (s2))\n#ifndef jit_ldxi_p\n#  define jit_ldxi_p(rd, rs, is)\tjit_ldxi_l((rd), (rs), (is))\n#endif\n\n#define jit_ldr_ul(d, rs)\t\tjit_ldr_l((d), (rs))\n#define jit_ldi_ul(d, is)\t\tjit_ldi_l((d), (is))\n#define jit_ldxr_ul(d, s1, s2)\t\tjit_ldxr_l((d), (s1), (s2))\n#ifndef jit_ldxi_ul\n#  define jit_ldxi_ul(d, rs, is)\tjit_ldxi_l((d), (rs), (is))\n#endif\n\n\n/* Boolean & branch synonyms */\n#define jit_eqr_ui(d, s1, s2)\t\tjit_eqr_i((d), (s1), (s2))\n#define jit_eqi_ui(d, rs, is)\t\tjit_eqi_i((d), (rs), (is))\n#define jit_ner_ui(d, s1, s2)\t\tjit_ner_i((d), (s1), (s2))\n#define jit_nei_ui(d, rs, is)\t\tjit_nei_i((d), (rs), (is))\n\n#define jit_eqr_ul(d, s1, s2)\t\tjit_eqr_l((d), (s1), (s2))\n#define jit_eqi_ul(d, rs, is)\t\tjit_eqi_l((d), (rs), (is))\n#define jit_ner_ul(d, s1, s2)\t\tjit_ner_l((d), (s1), (s2))\n#define jit_nei_ul(d, rs, is)\t\tjit_nei_l((d), (rs), (is))\n\n#define jit_beqr_ui(label, s1, s2)\tjit_beqr_i((label), (s1), (s2))\n#define jit_beqi_ui(label, rs, is)\tjit_beqi_i((label), (rs), (is))\n#define jit_bner_ui(label, s1, s2)\tjit_bner_i((label), (s1), (s2))\n#define jit_bnei_ui(label, rs, is)\tjit_bnei_i((label), (rs), (is))\n#define jit_bmcr_ui(label, s1, s2)\tjit_bmcr_i((label), (s1), (s2))\n#define jit_bmci_ui(label, rs, is)\tjit_bmci_i((label), (rs), (is))\n#define jit_bmsr_ui(label, s1, s2)\tjit_bmsr_i((label), (s1), (s2))\n#define jit_bmsi_ui(label, rs, is)\tjit_bmsi_i((label), (rs), (is))\n\n#define jit_beqr_ul(label, s1, s2)\tjit_beqr_l((label), (s1), (s2))\n#define jit_beqi_ul(label, rs, is)\tjit_beqi_l((label), (rs), (is))\n#define jit_bner_ul(label, s1, s2)\tjit_bner_l((label), (s1), (s2))\n#define jit_bnei_ul(label, rs, is)\tjit_bnei_l((label), (rs), (is))\n#define jit_bmcr_ul(label, s1, s2)\tjit_bmcr_l((label), (s1), (s2))\n#define jit_bmci_ul(label, rs, is)\tjit_bmci_l((label), (rs), (is))\n#define jit_bmsr_ul(label, s1, s2)\tjit_bmsr_l((label), (s1), (s2))\n#define jit_bmsi_ul(label, rs, is)\tjit_bmsi_l((label), (rs), (is))\n\n#define jit_ltr_p(d, s1, s2)\t\tjit_ltr_ul((d), (s1), (s2))\n#define jit_lti_p(d, rs, is)\t\tjit_lti_ul((d), (rs), (long)(is))\n#define jit_ler_p(d, s1, s2)\t\tjit_ler_ul((d), (s1), (s2))\n#define jit_lei_p(d, rs, is)\t\tjit_lei_ul((d), (rs), (long)(is))\n#define jit_gtr_p(d, s1, s2)\t\tjit_gtr_ul((d), (s1), (s2))\n#define jit_gti_p(d, rs, is)\t\tjit_gti_ul((d), (rs), (long)(is))\n#define jit_ger_p(d, s1, s2)\t\tjit_ger_ul((d), (s1), (s2))\n#define jit_gei_p(d, rs, is)\t\tjit_gei_ul((d), (rs), (long)(is))\n#define jit_eqr_p(d, s1, s2)\t\tjit_eqr_ul((d), (s1), (s2))\n#define jit_eqi_p(d, rs, is)\t\tjit_eqi_ul((d), (rs), (long)(is))\n#define jit_ner_p(d, s1, s2)\t\tjit_ner_ul((d), (s1), (s2))\n#define jit_nei_p(d, rs, is)\t\tjit_nei_ul((d), (rs), (long)(is))\n\n#define jit_bltr_p(label, s1, s2)\tjit_bltr_ul((label), (s1), (s2))\n#define jit_blti_p(label, rs, is)\tjit_blti_ul((label), (rs), (long)(is))\n#define jit_bler_p(label, s1, s2)\tjit_bler_ul((label), (s1), (s2))\n#define jit_blei_p(label, rs, is)\tjit_blei_ul((label), (rs), (long)(is))\n#define jit_bgtr_p(label, s1, s2)\tjit_bgtr_ul((label), (s1), (s2))\n#define jit_bgti_p(label, rs, is)\tjit_bgti_ul((label), (rs), (long)(is))\n#define jit_bger_p(label, s1, s2)\tjit_bger_ul((label), (s1), (s2))\n#define jit_bgei_p(label, rs, is)\tjit_bgei_ul((label), (rs), (long)(is))\n#define jit_beqr_p(label, s1, s2)\tjit_beqr_ul((label), (s1), (s2))\n#define jit_beqi_p(label, rs, is)\tjit_beqi_ul((label), (rs), (long)(is))\n#define jit_bner_p(label, s1, s2)\tjit_bner_ul((label), (s1), (s2))\n#define jit_bnei_p(label, rs, is)\tjit_bnei_ul((label), (rs), (long)(is))\n\n#define jit_retval_ui(rd)\t\tjit_retval_i((rd))\n#define jit_retval_uc(rd)\t\tjit_retval_i((rd))\n#define jit_retval_us(rd)\t\tjit_retval_i((rd))\n#define jit_retval_ul(rd)\t\tjit_retval_l((rd))\n#define jit_retval_p(rd)\t\tjit_retval_ul((rd))\n#define jit_retval_c(rd)\t\tjit_retval_i((rd))\n#define jit_retval_s(rd)\t\tjit_retval_i((rd))\n\n/* This was a bug, but we keep it.  */\n#define jit_retval(rd)\t\t\tjit_retval_i ((rd))\n\n#ifndef jit_finish\n#define jit_finish(sub)\t\t\tjit_calli(sub)\n#endif\n\n#ifndef jit_finishr\n#define jit_finishr(reg)\t\tjit_callr(reg)\n#endif\n\n#ifndef jit_prolog\n#define jit_prolog(numargs)\n#endif\n\n#ifndef jit_leaf\n#define jit_leaf(numargs)\t\tjit_prolog(numargs)\n#endif\n\n#ifndef jit_getarg_c\n#ifndef JIT_AP\n#define jit_getarg_c(reg, ofs)\t\tjit_extr_c_l  ((reg), (ofs))\n#define jit_getarg_i(reg, ofs)\t\tjit_extr_i_l  ((reg), (ofs))\n#define jit_getarg_l(reg, ofs)\t\tjit_movr_l    ((reg), (ofs))\n#define jit_getarg_p(reg, ofs)\t\tjit_movr_p    ((reg), (ofs))\n#define jit_getarg_s(reg, ofs)\t\tjit_extr_s_l  ((reg), (ofs))\n#define jit_getarg_uc(reg, ofs)\t\tjit_extr_uc_ul((reg), (ofs))\n#define jit_getarg_ui(reg, ofs)\t\tjit_extr_ui_ul((reg), (ofs))\n#define jit_getarg_ul(reg, ofs)\t\tjit_movr_ul   ((reg), (ofs))\n#define jit_getarg_us(reg, ofs)\t\tjit_extr_us_ul((reg), (ofs))\n#else\n#define jit_getarg_c(reg, ofs)\t\tjit_ldxi_c((reg), JIT_AP, (ofs));\n#define jit_getarg_uc(reg, ofs)\t\tjit_ldxi_uc((reg), JIT_AP, (ofs));\n#define jit_getarg_s(reg, ofs)\t\tjit_ldxi_s((reg), JIT_AP, (ofs));\n#define jit_getarg_us(reg, ofs)\t\tjit_ldxi_us((reg), JIT_AP, (ofs));\n#define jit_getarg_i(reg, ofs)\t\tjit_ldxi_i((reg), JIT_AP, (ofs));\n#define jit_getarg_ui(reg, ofs)\t\tjit_ldxi_ui((reg), JIT_AP, (ofs));\n#define jit_getarg_l(reg, ofs)\t\tjit_ldxi_l((reg), JIT_AP, (ofs));\n#define jit_getarg_ul(reg, ofs)\t\tjit_ldxi_ul((reg), JIT_AP, (ofs));\n#define jit_getarg_p(reg, ofs)\t\tjit_ldxi_p((reg), JIT_AP, (ofs));\n#endif\n#endif\n\n\n/* Common definitions when sizeof(long) = sizeof(int) */\n#if __WORDSIZE == 32\n/* ALU */\n#  define jit_addi_l(d, rs, is)\t\tjit_addi_i((d), (rs), (is))\t\n#  define jit_addr_l(d, s1, s2)\t\tjit_addr_i((d), (s1), (s2))\n#  define jit_andi_l(d, rs, is)\t\tjit_andi_i((d), (rs), (is))\t\n#  define jit_andr_l(d, s1, s2)\t\tjit_andr_i((d), (s1), (s2))\n#  define jit_divi_l(d, rs, is)\t\tjit_divi_i((d), (rs), (is))\t\n#  define jit_divr_l(d, s1, s2)\t\tjit_divr_i((d), (s1), (s2))\n#  define jit_hmuli_l(d, rs, is)\tjit_hmuli_i((d), (rs), (is))\t\n#  define jit_hmulr_l(d, s1, s2)\tjit_hmulr_i((d), (s1), (s2))\n#  define jit_lshi_l(d, rs, is)\t\tjit_lshi_i((d), (rs), (is))\t\n#  define jit_lshr_l(d, s1, s2)\t\tjit_lshr_i((d), (s1), (s2))\n#  define jit_modi_l(d, rs, is)\t\tjit_modi_i((d), (rs), (is))\t\n#  define jit_modr_l(d, s1, s2)\t\tjit_modr_i((d), (s1), (s2))\n#  define jit_muli_l(d, rs, is)\t\tjit_muli_i((d), (rs), (is))\t\n#  define jit_mulr_l(d, s1, s2)\t\tjit_mulr_i((d), (s1), (s2))\n#  ifndef jit_negr_l\n#    define jit_negr_l(d, s1)\t\tjit_negr_i((d), (s1))\n#  endif\n#  define jit_ori_l(d, rs, is)\t\tjit_ori_i((d), (rs), (is))\t\n#  define jit_orr_l(d, s1, s2)\t\tjit_orr_i((d), (s1), (s2))\n#  define jit_rshi_l(d, rs, is)\t\tjit_rshi_i((d), (rs), (is))\t\n#  define jit_rshr_l(d, s1, s2)\t\tjit_rshr_i((d), (s1), (s2))\n#  define jit_subr_l(d, s1, s2)\t\tjit_subr_i((d), (s1), (s2))\n#  define jit_xori_l(d, rs, is)\t\tjit_xori_i((d), (rs), (is))\t\n#  define jit_xorr_l(d, s1, s2)\t\tjit_xorr_i((d), (s1), (s2))\n#  define jit_rsbi_l(d, rs, is)\t\tjit_rsbi_i((d), (rs), (is))\t\n#  define jit_divi_ul(d, rs, is)\tjit_divi_ui((d), (rs), (is))\t\n#  define jit_divr_ul(d, s1, s2)\tjit_divr_ui((d), (s1), (s2))\n#  define jit_hmuli_ul(d, rs, is)\tjit_hmuli_ui((d), (rs), (is))\t\n#  define jit_hmulr_ul(d, s1, s2)\tjit_hmulr_ui((d), (s1), (s2))\n#  define jit_modi_ul(d, rs, is)\tjit_modi_ui((d), (rs), (is))\t\n#  define jit_modr_ul(d, s1, s2)\tjit_modr_ui((d), (s1), (s2))\n#  define jit_muli_ul(d, rs, is)\tjit_muli_ui((d), (rs), (is))\t\n#  define jit_mulr_ul(d, s1, s2)\tjit_mulr_ui((d), (s1), (s2))\n#  define jit_rshi_ul(d, rs, is)\tjit_rshi_ui((d), (rs), (is))\t\n#  define jit_rshr_ul(d, s1, s2)\tjit_rshr_ui((d), (s1), (s2))\n\n/* Sign/Zero extension */\n#  define jit_extr_c_l(d, rs)\t\tjit_extr_c_i(d, rs)\n#  define jit_extr_c_ul(d, rs)\t\tjit_extr_c_ui(d, rs)\n#  define jit_extr_s_l(d, rs)\t\tjit_extr_s_i(d, rs)\n#  define jit_extr_s_ul(d, rs)\t\tjit_extr_s_ui(d, rs)\n#  define jit_extr_i_l(d, rs)\t\tjit_movr_i(d, rs)\n#  define jit_extr_i_ul(d, rs)\t\tjit_movr_i(d, rs)\n\n/* Unary */\n#  define jit_movi_l(d, rs)\t\tjit_movi_i((d), (rs))\n#  define jit_movr_l(d, rs)\t\tjit_movr_i((d), (rs))\n\n/* Stack */\n#  define jit_pushr_l(rs)\t\tjit_pushr_i(rs)\n#  define jit_popr_l(rs)\t\tjit_popr_i(rs)\t\t\n#  define jit_pusharg_l(rs)\t\tjit_pusharg_i(rs)\n\n/* Memory */\n#  ifndef JIT_RZERO\n#    define jit_ldr_l(d, rs)\t\tjit_ldr_i((d), (rs))\n#    define jit_ldi_l(d, is)\t\tjit_ldi_i((d), (is))\n#    define jit_str_l(d, rs)\t\tjit_str_i((d), (rs))\n#    define jit_sti_l(d, is)\t\tjit_sti_i((d), (is))\n#    define jit_ldr_ui(d, rs)\t\tjit_ldr_i((d), (rs))\n#    define jit_ldi_ui(d, is)\t\tjit_ldi_i((d), (is))\n#  endif\n\n#  define jit_ldxr_l(d, s1, s2)\t\tjit_ldxr_i((d), (s1), (s2))\n#  define jit_ldxi_l(d, rs, is)\t\tjit_ldxi_i((d), (rs), (is))\n#  define jit_stxr_l(d, s1, s2)\t\tjit_stxr_i((d), (s1), (s2))\n#  define jit_stxi_l(d, rs, is)\t\tjit_stxi_i((d), (rs), (is))\n#  if !defined (jit_ldxr_ui)\n#    define jit_ldxr_ui(d, s1, s2)\tjit_ldxr_i((d), (s1), (s2))\n#  endif\n#  if !defined (jit_ldxi_ui)\n#    define jit_ldxi_ui(d, rs, is)\tjit_ldxi_i((d), (rs), (is))\n#  endif\n\n\n/* Boolean */\n#  define jit_ltr_l(d, s1, s2)\t\tjit_ltr_i((d), (s1), (s2))\n#  define jit_lti_l(d, rs, is)\t\tjit_lti_i((d), (rs), (is))\n#  define jit_ler_l(d, s1, s2)\t\tjit_ler_i((d), (s1), (s2))\n#  define jit_lei_l(d, rs, is)\t\tjit_lei_i((d), (rs), (is))\n#  define jit_gtr_l(d, s1, s2)\t\tjit_gtr_i((d), (s1), (s2))\n#  define jit_gti_l(d, rs, is)\t\tjit_gti_i((d), (rs), (is))\n#  define jit_ger_l(d, s1, s2)\t\tjit_ger_i((d), (s1), (s2))\n#  define jit_gei_l(d, rs, is)\t\tjit_gei_i((d), (rs), (is))\n#  define jit_eqr_l(d, s1, s2)\t\tjit_eqr_i((d), (s1), (s2))\n#  define jit_eqi_l(d, rs, is)\t\tjit_eqi_i((d), (rs), (is))\n#  define jit_ner_l(d, s1, s2)\t\tjit_ner_i((d), (s1), (s2))\n#  define jit_nei_l(d, rs, is)\t\tjit_nei_i((d), (rs), (is))\n#  define jit_ltr_ul(d, s1, s2)\t\tjit_ltr_ui((d), (s1), (s2))\n#  define jit_lti_ul(d, rs, is)\t\tjit_lti_ui((d), (rs), (is))\n#  define jit_ler_ul(d, s1, s2)\t\tjit_ler_ui((d), (s1), (s2))\n#  define jit_lei_ul(d, rs, is)\t\tjit_lei_ui((d), (rs), (is))\n#  define jit_gtr_ul(d, s1, s2)\t\tjit_gtr_ui((d), (s1), (s2))\n#  define jit_gti_ul(d, rs, is)\t\tjit_gti_ui((d), (rs), (is))\n#  define jit_ger_ul(d, s1, s2)\t\tjit_ger_ui((d), (s1), (s2))\n#  define jit_gei_ul(d, rs, is)\t\tjit_gei_ui((d), (rs), (is))\n\n/* Branches */\n#  define jit_bltr_l(label, s1, s2)\tjit_bltr_i((label), (s1), (s2))\n#  define jit_blti_l(label, rs, is)\tjit_blti_i((label), (rs), (is))\n#  define jit_bler_l(label, s1, s2)\tjit_bler_i((label), (s1), (s2))\n#  define jit_blei_l(label, rs, is)\tjit_blei_i((label), (rs), (is))\n#  define jit_bgtr_l(label, s1, s2)\tjit_bgtr_i((label), (s1), (s2))\n#  define jit_bgti_l(label, rs, is)\tjit_bgti_i((label), (rs), (is))\n#  define jit_bger_l(label, s1, s2)\tjit_bger_i((label), (s1), (s2))\n#  define jit_bgei_l(label, rs, is)\tjit_bgei_i((label), (rs), (is))\n#  define jit_beqr_l(label, s1, s2)\tjit_beqr_i((label), (s1), (s2))\n#  define jit_beqi_l(label, rs, is)\tjit_beqi_i((label), (rs), (is))\n#  define jit_bner_l(label, s1, s2)\tjit_bner_i((label), (s1), (s2))\n#  define jit_bnei_l(label, rs, is)\tjit_bnei_i((label), (rs), (is))\n#  define jit_bmcr_l(label, s1, s2)\tjit_bmcr_i((label), (s1), (s2))\n#  define jit_bmci_l(label, rs, is)\tjit_bmci_i((label), (rs), (is))\n#  define jit_bmsr_l(label, s1, s2)\tjit_bmsr_i((label), (s1), (s2))\n#  define jit_bmsi_l(label, rs, is)\tjit_bmsi_i((label), (rs), (is))\n#  define jit_boaddr_l(label, s1, s2)\tjit_boaddr_i((label), (s1), (s2))\n#  define jit_boaddi_l(label, rs, is)\tjit_boaddi_i((label), (rs), (is))\n#  define jit_bosubr_l(label, s1, s2)\tjit_bosubr_i((label), (s1), (s2))\n#  define jit_bosubi_l(label, rs, is)\tjit_bosubi_i((label), (rs), (is))\n#  define jit_bltr_ul(label, s1, s2)\tjit_bltr_ui((label), (s1), (s2))\n#  define jit_blti_ul(label, rs, is)\tjit_blti_ui((label), (rs), (is))\n#  define jit_bler_ul(label, s1, s2)\tjit_bler_ui((label), (s1), (s2))\n#  define jit_blei_ul(label, rs, is)\tjit_blei_ui((label), (rs), (is))\n#  define jit_bgtr_ul(label, s1, s2)\tjit_bgtr_ui((label), (s1), (s2))\n#  define jit_bgti_ul(label, rs, is)\tjit_bgti_ui((label), (rs), (is))\n#  define jit_bger_ul(label, s1, s2)\tjit_bger_ui((label), (s1), (s2))\n#  define jit_bgei_ul(label, rs, is)\tjit_bgei_ui((label), (rs), (is))\n#  define jit_boaddr_ul(label, s1, s2)\tjit_boaddr_ui((label), (s1), (s2))\n#  define jit_boaddi_ul(label, rs, is)\tjit_boaddi_ui((label), (rs), (is))\n#  define jit_bosubr_ul(label, s1, s2)\tjit_bosubr_ui((label), (s1), (s2))\n#  define jit_bosubi_ul(label, rs, is)\tjit_bosubi_ui((label), (rs), (is))\n\n#  define jit_retval_l(rd)\t\tjit_retval_i((rd))\n#endif\t/* __WORDSIZE == 32 */\n\n/* RSB is not mandatory */\n#ifndef jit_rsbi_i\n# define jit_rsbi_i(d, rs, is)\t\t(jit_subi_i((d), (rs), (is)), jit_negr_i((d), (d)))\n\n# ifndef jit_rsbi_l\n#  define jit_rsbi_l(d, rs, is)\t\t(jit_subi_l((d), (rs), (is)), jit_negr_l((d), (d)))\n# endif\n#endif\n\n#endif /* __lightning_core_common_h_ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/fp-common.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer floating-point interface\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n#define JIT_FPR0\t\t\tJIT_FPR(0)\n#define JIT_FPR1\t\t\tJIT_FPR(1)\n#define JIT_FPR2\t\t\tJIT_FPR(2)\n#define JIT_FPR3\t\t\tJIT_FPR(3)\n#define JIT_FPR4\t\t\tJIT_FPR(4)\n#define JIT_FPR5\t\t\tJIT_FPR(5)\n\n#ifdef JIT_RZERO\n#ifndef jit_ldi_f\n#define jit_ldi_f(rd, is)               jit_ldxi_f((rd), JIT_RZERO, (is))\n#define jit_sti_f(id, rs)               jit_stxi_f((id), JIT_RZERO, (rs))\n#define jit_ldi_d(rd, is)               jit_ldxi_d((rd), JIT_RZERO, (is))\n#define jit_sti_d(id, rs)               jit_stxi_d((id), JIT_RZERO, (rs))\n#endif\n\n#ifndef jit_ldr_f\n#define jit_ldr_f(rd, rs)               jit_ldxr_f((rd), JIT_RZERO, (rs))\n#define jit_str_f(rd, rs)               jit_stxr_f((rd), JIT_RZERO, (rs))\n#define jit_ldr_d(rd, rs)               jit_ldxr_d((rd), JIT_RZERO, (rs))\n#define jit_str_d(rd, rs)               jit_stxr_d((rd), JIT_RZERO, (rs))\n#endif\n#endif\n\n#ifndef jit_addr_f\n#define jit_addr_f(rd,s1,s2)\t\tjit_addr_d(rd,s1,s2)\n#define jit_subr_f(rd,s1,s2)\t\tjit_subr_d(rd,s1,s2)\n#define jit_mulr_f(rd,s1,s2)\t\tjit_mulr_d(rd,s1,s2)\n#define jit_divr_f(rd,s1,s2)\t\tjit_divr_d(rd,s1,s2)\n#define jit_movr_f(rd,rs)\t\tjit_movr_d(rd,rs)\n#endif\n\n#if !defined(jit_absr_f)\n#define jit_absr_f(rd,rs)\t\tjit_absr_d(rd,rs)\n#define jit_negr_f(rd,rs)\t\tjit_negr_d(rd,rs)\n#define jit_sqrtr_f(rd,rs)\t\tjit_sqrtr_d(rd,rs)\n#endif\n\n#if !defined(jit_extr_i_f)\n#  define jit_extr_i_f(rd, rs)\t\tjit_extr_i_d(rd, rs)\n#endif\n\n#if !defined(jit_rintr_d_i)\n#  define jit_rintr_d_i(rd, rs)\t\tjit_truncr_d_i(rd, rs)\n#endif\n\n#if !defined(jit_rintr_f_i)\n#  define jit_rintr_f_i(rd, rs)\t\tjit_rintr_d_i(rd, rs)\n#endif\n\n#if !defined(jit_roundr_f_i)\n#  define jit_roundr_f_i(rd, rs)\tjit_roundr_d_i(rd, rs)\n#  define jit_floorr_f_i(rd, rs)\tjit_floorr_d_i(rd, rs)\n#  define jit_ceilr_f_i(rd, rs)\t\tjit_ceilr_d_i(rd, rs)\n#  define jit_truncr_f_i(rd, rs)\tjit_truncr_d_i(rd, rs)\n#endif\n\n#if !defined(jit_eqr_f)\n#define jit_eqr_f(rd, s0, s1)\t\tjit_eqr_d(rd, s0, s1)\n#define jit_ner_f(rd, s0, s1)\t\tjit_ner_d(rd, s0, s1)\n#define jit_gtr_f(rd, s0, s1)\t\tjit_gtr_d(rd, s0, s1)\n#define jit_ger_f(rd, s0, s1)\t\tjit_ger_d(rd, s0, s1)\n#define jit_ltr_f(rd, s0, s1)\t\tjit_ltr_d(rd, s0, s1)\n#define jit_ler_f(rd, s0, s1)\t\tjit_ler_d(rd, s0, s1)\n#define jit_uneqr_f(rd, s0, s1)\t\tjit_uneqr_d(rd, s0, s1)\n#define jit_ltgtr_f(rd, s0, s1)\t\tjit_ltgtr_d(rd, s0, s1)\n#define jit_ungtr_f(rd, s0, s1)\t\tjit_ungtr_d(rd, s0, s1)\n#define jit_unger_f(rd, s0, s1)\t\tjit_unger_d(rd, s0, s1)\n#define jit_unltr_f(rd, s0, s1)\t\tjit_unltr_d(rd, s0, s1)\n#define jit_unler_f(rd, s0, s1)\t\tjit_unler_d(rd, s0, s1)\n#define jit_ordr_f(rd, s0, s1)\t\tjit_ordr_d(rd, s0, s1)\n#define jit_unordr_f(rd, s0, s1)\tjit_unordr_d(rd, s0, s1)\n#endif\n\n#if !defined(jit_retval_f)\n#define jit_retval_f(rs)\t\tjit_retval_d(rs)\n#endif\n\n#ifndef jit_extr_f_d\n#  define jit_extr_f_d(rd, rs)\t\tjit_movr_d(rd, rs)\n#endif\n\n#ifndef jit_extr_d_f\n#  define jit_extr_d_f(rd, rs)\t\tjit_movr_d(rd, rs)\n#endif\n\n#if !defined(__WORDSIZE) || __WORDSIZE == 32\n#  if !defined(jit_extr_l_f)\n#    define jit_extr_l_f(rd, rs)\tjit_extr_i_f(rd, rs)\n#  endif\n#  if !defined(jit_extr_l_d)\n#    define jit_extr_l_d(rd, rs)\tjit_extr_i_d(rd, rs)\n#  endif\n#  if !defined(jit_roundr_f_l)\n#    if defined(jit_rintr_f_i)\n#      define jit_rintr_f_l(rd, rs)\tjit_rintr_f_i(rd, rs)\n#    endif\n#    define jit_roundr_f_l(rd, rs)\tjit_roundr_f_i(rd, rs)\n#    define jit_truncr_f_l(rd, rs)\tjit_truncr_f_i(rd, rs)\n#    define jit_floorr_f_l(rd, rs)\tjit_floorr_f_i(rd, rs)\n#    define jit_ceilr_f_l(rd, rs)\tjit_ceilr_f_i(rd, rs)\n#  endif\n#  if !defined(jit_roundr_d_l)\n#    if defined(jit_rintr_d_i)\n#      define jit_rintr_d_l(rd, rs)\tjit_rintr_d_i(rd, rs)\n#    endif\n#    define jit_roundr_d_l(rd, rs)\tjit_roundr_d_i(rd, rs)\n#    define jit_truncr_d_l(rd, rs)\tjit_truncr_d_i(rd, rs)\n#    define jit_floorr_d_l(rd, rs)\tjit_floorr_d_i(rd, rs)\n#    define jit_ceilr_d_l(rd, rs)\tjit_ceilr_d_i(rd, rs)\n#  endif\n#endif\n\n#ifndef jit_beqr_f\n#define jit_beqr_f(lab, a, b)\t\tjit_beqr_d(lab, a, b)\n#define jit_bner_f(lab, a, b)\t\tjit_bner_d(lab, a, b)\n#define jit_bgtr_f(lab, a, b)\t\tjit_bgtr_d(lab, a, b)\n#define jit_bger_f(lab, a, b)\t\tjit_bger_d(lab, a, b)\n#define jit_bltr_f(lab, a, b)\t\tjit_bltr_d(lab, a, b)\n#define jit_bler_f(lab, a, b)\t\tjit_bler_d(lab, a, b)\n#define jit_buneqr_f(lab, a, b)\t\tjit_buneqr_d(lab, a, b)\n#define jit_bltgtr_f(lab, a, b)\t\tjit_bltgtr_d(lab, a, b)\n#define jit_bungtr_f(lab, a, b)\t\tjit_bungtr_d(lab, a, b)\n#define jit_bunger_f(lab, a, b)\t\tjit_bunger_d(lab, a, b)\n#define jit_bunltr_f(lab, a, b)\t\tjit_bunltr_d(lab, a, b)\n#define jit_bunler_f(lab, a, b)\t\tjit_bunler_d(lab, a, b)\n#define jit_bordr_f(lab, a, b)\t\tjit_bordr_d(lab, a, b)\n#define jit_bunordr_f(lab, a, b)\tjit_bunordr_d(lab, a, b)\n#endif\n\n#ifndef jit_retval_f\n#define jit_retval_f(op1)            jit_movr_f((op1), JIT_FPRET)\n#endif\n\n#ifndef jit_retval_d\n#define jit_retval_d(op1)            jit_movr_d((op1), JIT_FPRET)\n#endif\n\n#ifndef jit_prolog_d\n#define jit_prolog_f(numargs)\n#define jit_prolog_d(numargs)\n#endif\n\n#ifndef jit_leaf_d\n#define jit_leaf_f(numargs)\t\tjit_prolog_f(numargs)\n#define jit_leaf_d(numargs)\t\tjit_prolog_d(numargs)\n#endif\n\n#ifndef jit_getarg_f\n#ifndef JIT_AP\n#define jit_getarg_f(reg, ofs)         jit_movr_f    ((reg), (ofs))\n#define jit_getarg_d(reg, ofs)         jit_movr_d    ((reg), (ofs))\n#else  \n#define jit_getarg_f(reg, ofs)         jit_ldxi_f((reg), JIT_AP, (ofs));\n#define jit_getarg_d(reg, ofs)         jit_ldxi_d((reg), JIT_AP, (ofs));\n#endif\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/funcs-common.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer inline functions (common part)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n#ifndef __lightning_funcs_common_h\n#define __lightning_funcs_common_h\n\n#include <stdio.h>\n#include <stdlib.h>\n\nint\njit_fail(const char *msg, const char *file, int line, const char *function)\n{\n  fprintf(stderr, \"%s: In function `%s':\\n\", file, function);\n  fprintf(stderr, \"%s:%d: %s\\n\", file, line, msg);\n  abort();\n}\n\n\n#endif /* __lightning_funcs_common_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/Makefile.frag",
    "content": "LIGHTNING_TARGET_FILES += i386/asm-32.h i386/core-32.h \\\n\t i386/asm-64.h i386/core-64.h i386/fp-32.h i386/fp-64.h \\\n\t i386/fp-x87.h i386/fp-sse.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/asm-32.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the i386\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2003 Gwenole Beauchesne\n * Copyright 2006,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n\n\n#ifndef __lightning_asm_h\n#define __lightning_asm_h\n#ifndef LIGHTNING_DEBUG\n\n/*\tOPCODE\t+ i\t\t= immediate operand\n *\t\t+ r\t\t= register operand\n *\t\t+ m\t\t= memory operand (disp,base,index,scale)\n *\t\t+ sr/sm\t\t= a star preceding a register or memory\n */\n\n#define CALLsr(R)\t\t\tCALLLsr(R)\n#define JMPsr(R)\t\t\tJMPLsr(R)\n\n/* --- Increment/Decrement instructions ------------------------------------ */\n__jit_inline void\nx86_dec_sil_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _Or(0x48, _rA(rd));\n}\n\n__jit_inline void\nx86_inc_sil_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _Or(0x40, _rA(rd));\n}\n\n/* --- REX prefixes -------------------------------------------------------- */\n#define _REXBrr(rr, mr)\t\t\tx86_REXBrr(_jit, rr, mr)\n__jit_inline void\nx86_REXBrr(jit_state_t _jit, jit_gpr_t rr, jit_gpr_t mr)\n{\n}\n\n#define _REXBmr(rb, ri, rd)\t\tx86_REXBmr(_jit, rb, ri, rd)\n__jit_inline void\nx86_REXBmr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_gpr_t rd)\n{\n}\n\n#define _REXBrm(rs, rb, ri)\t\tx86_REXBrm(_jit, rs, rb, ri)\n__jit_inline void\nx86_REXBrm(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n}\n\n#define _REXLr(rr)\t\t\tx86_REXLr(_jit, rr)\n__jit_inline void\nx86_REXLr(jit_state_t _jit, jit_gpr_t rr)\n{\n}\n\n#define _REXLm(rb, ri)\t\t\tx86_REXLr(_jit, rb, ri)\n__jit_inline void\nx86_REXLm(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri)\n{\n}\n\n#define _REXBLrr(rr, mr)\t\tx86_REXBLrr(_jit, rr, mr)\n__jit_inline void\nx86_REXBLrr(jit_state_t _jit, jit_gpr_t rr, jit_gpr_t mr)\n{\n}\n\n#define _REXLrr(rr, mr)\t\t\tx86_REXLrr(_jit, rr, mr)\n__jit_inline void\nx86_REXLrr(jit_state_t _jit, jit_gpr_t rr, jit_gpr_t mr)\n{\n}\n\n#define _REXLmr(rb, ri, rd)\t\tx86_REXLmr(_jit, rb, ri, rd)\n__jit_inline void\nx86_REXLmr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_gpr_t rd)\n{\n}\n\n#define _REXLrm(rs, rb, ri)\t\tx86_REXLrm(_jit, rs, rb, ri)\n__jit_inline void\nx86_REXLrm(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n}\n\n#define _rex_if_rr(rr, mr)\t\tx86_rex_if_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_if_rr(jit_state_t _jit, jit_gpr_t rr, jit_fpr_t mr)\n{\n}\n\n#define _rex_ff_rr(rr, mr)\t\tx86_rex_ff_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_ff_rr(jit_state_t _jit, jit_fpr_t rr, jit_fpr_t mr)\n{\n}\n\n#define _rex_fi_rr(rr, mr)\t\tx86_rex_fi_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_fi_rr(jit_state_t _jit, jit_fpr_t rr, jit_gpr_t mr)\n{\n}\n\n#define _rex_if_mr(rb, ri, rd)\t\tx86_rex_if_mr(_jit, rb, ri, rd)\n__jit_inline void\nx86_rex_if_mr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_fpr_t rd)\n{\n}\n\n#define _rex_fi_rm(rs, rb, ri)\t\tx86_rex_fi_rm(_jit, rs, rb, ri)\n__jit_inline void\nx86_rex_fi_rm(jit_state_t _jit, jit_fpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n}\n\n/* --- Push/Pop instructions ----------------------------------------------- */\n#define POPWr(rd)\t\t\tx86_POPWr(_jit, rd)\n__jit_inline void\nx86_POPWr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _d16();\n    x86_pop_sil_r(_jit, rd);\n}\n\n#define POPWm(md, rb, ri, ms)\t\tx86_POPWm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_POPWm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    x86_pop_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define POPLr(rd)\t\t\tx86_POPLr(_jit, rd)\n__jit_inline void\nx86_POPLr(jit_state_t _jit, jit_gpr_t rd)\n{\n    x86_pop_sil_r(_jit, rd);\n}\n\n#define POPLm(md, rb, ri, ms)\t\tx86_POPLm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_POPLm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    x86_pop_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define PUSHWr(rd)\t\t\tx86_PUSHWr(_jit, rd)\n__jit_inline void\nx86_PUSHWr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _d16();\n    x86_push_sil_r(_jit, rs);\n}\n\n#define PUSHWm(md, rb, ri, ms)\t\tx86_PUSHWm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_PUSHWm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    x86_push_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define PUSHWi(im)\t\t\tx86_PUSHWi(_jit, im)\n__jit_inline void\nx86_PUSHWi(jit_state_t _jit, long im)\n{\n    if (_s8P(im))\n\tx86_push_c_i(_jit, im);\n    else {\n\t_d16();\n\t_O(0x68);\n\t_jit_W(_s16(im));\n    }\n}\n\n#define PUSHLr(rd)\t\t\tx86_PUSHLr(_jit, rd)\n__jit_inline void\nx86_PUSHLr(jit_state_t _jit, jit_gpr_t rs)\n{\n    x86_push_sil_r(_jit, rs);\n}\n\n#define PUSHLm(md, rb, ri, ms)\t\tx86_PUSHLm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_PUSHLm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    x86_push_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define PUSHLi(im)\t\t\tx86_PUSHLi(_jit, im)\n__jit_inline void\nx86_PUSHLi(jit_state_t _jit, long im)\n{\n    x86_push_il_i(_jit, im);\n}\n\n#endif\t/* LIGHTNING_DEBUG */\n#endif\t/* __lightning_asm_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/asm-64.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the x86-64\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2003 Gwenole Beauchesne\n * Copyright 2006,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_asm_h\n#define __lightning_asm_h\n#ifndef LIGHTNING_DEBUG\n\n/*\tOPCODE\t+ i\t\t= immediate operand\n *\t\t+ r\t\t= register operand\n *\t\t+ m\t\t= memory operand (disp,base,index,scale)\n *\t\t+ sr/sm\t\t= a star preceding a register or memory\n */\n\n#define CALLsr(R)\t\t\tCALLQsr(R)\n#define JMPsr(R)\t\t\tJMPQsr(R)\n\n#if 0\n#  define _r0P(R)\t\t((int)(R) == (int)_NOREG)\n#  define _rIP(R)\t\t((int)(R) == (int)_RIP)\n#  define _rspP(R)\t\t(_rR(R) == _rR(_RSP))\n#  define _rsp12P(R)\t\t(_rN(R) == _rN(_RSP))\n\n#  define _x86_RIP_addressing_possible(D,O)\t(X86_RIP_RELATIVE_ADDR && \\\n\t\t\t\t\t\t((unsigned long)x86_get_target() + 4 + (O) - (D) <= 0xffffffff))\n\n#  define _r_X(   R, D,B,I,S,O)\t(_r0P(I) ? (_r0P(B)    ? (!X86_TARGET_64BIT ? _r_D(R,D) : \\\n\t\t\t\t\t                 (_x86_RIP_addressing_possible(D, O) ? \\\n\t\t\t\t                          _r_D(R, (D) - ((unsigned long)x86_get_target() + 4 + (O))) : \\\n\t\t\t\t                          _r_DSIB(R,D))) : \\\n\t\t\t\t\t                 _r_DSIB(R,D                ))  : \\\n\t\t\t\t           (_rIP(B)    ? _r_D   (R,D                )   : \\\n\t\t\t\t           (_rsp12P(B) ? _r_DBIS(R,D,_RSP,_RSP,1)   : \\\n\t\t\t\t\t\t         _r_DB  (R,D,     B       ))))  : \\\n\t\t\t\t (_r0P(B)\t       ? _r_4IS (R,D,\t         I,S)   : \\\n\t\t\t\t (!_rspP(I)            ? _r_DBIS(R,D,     B,     I,S)   : \\\n\t\t\t\t\t\t         JITFAIL(\"illegal index register: %esp\"))))\n#endif\n\n/* --- Increment/Decrement instructions ------------------------------------ */\n__jit_inline void\nx86_dec_sil_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _O(0xff);\n    _Mrm(_b11, _b001, _rA(rd));\n}\n\n__jit_inline void\nx86_inc_sil_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _O(0xff);\n    _Mrm(_b11, _b000, _rA(rd));\n}\n\n/* --- REX prefixes -------------------------------------------------------- */\n#define _BIT(X)\t\t\t(!!(X))\n__jit_inline void\nx86_REXwrxb(jit_state_t _jit, int l, int w, int r, int x, int b)\n{\n    int\t\trex = (w << 3) | (r << 2) | (x << 1) | b;\n\n    if (rex || l)\n\t_jit_B(0x40 | rex);\n}\n\n__jit_inline void\nx86_REXwrx_(jit_state_t _jit, int l, int w, int r, int x, int mr)\n{\n    int\t\tb = mr == _RIP ? 0 : _rXP(mr);\n\n    x86_REXwrxb(_jit, l, w, r, x, _BIT(b));\n}\n\n__jit_inline void\nx86_REXw_x_(jit_state_t _jit, int l, int w, int r, int x, int mr)\n{\n    x86_REXwrx_(_jit, l, w, _BIT(_rXP(r)), x, mr);\n}\n\n__jit_inline void\nx86_REX_reg(jit_state_t _jit, int rr)\n{\n    x86_REXwrxb(_jit, 0, 0, 0, 0, _BIT(_rXP(rr)));\n}\n\n__jit_inline void\nx86_REX_mem(jit_state_t _jit, int mb, int mi)\n{\n    x86_REXwrxb(_jit, 0, 0, 0, _BIT(_rXP(mi)), _BIT(_rXP(mb)));\n}\n\n__jit_inline void\nx86_rex_b_rr(jit_state_t _jit, int rr, int mr)\n{\n    x86_REXw_x_(_jit, 0, 0, rr, 0, mr);\n}\n\n__jit_inline void\nx86_rex_b_mr(jit_state_t _jit, int rb, int ri, int rd)\n{\n    x86_REXw_x_(_jit, 0, 0, rd, _BIT(_rXP(ri)), rb);\n}\n\n__jit_inline void\nx86_rex_b_rm(jit_state_t _jit, int rs, int rb, int ri)\n{\n    x86_rex_b_mr(_jit, rb, ri, rs);\n}\n\n__jit_inline void\nx86_rex_bl_rr(jit_state_t _jit, int rr, int mr)\n{\n    x86_REXw_x_(_jit, 0, 0, rr, 0, mr);\n}\n\n__jit_inline void\nx86_rex_l_r(jit_state_t _jit, int rr)\n{\n    x86_REX_reg(_jit, rr);\n}\n\n__jit_inline void\nx86_rex_l_m(jit_state_t _jit, int rb, int ri)\n{\n    x86_REX_mem(_jit, rb, ri);\n}\n\n__jit_inline void\nx86_rex_l_rr(jit_state_t _jit, int rr, int mr)\n{\n    x86_REXw_x_(_jit, 0, 0, rr, 0, mr);\n}\n\n__jit_inline void\nx86_rex_l_mr(jit_state_t _jit, int rb, int ri, int rd)\n{\n    x86_REXw_x_(_jit, 0, 0, rd, _BIT(_rXP(ri)), rb);\n}\n\n__jit_inline void\nx86_rex_l_rm(jit_state_t _jit, int rs, int rb, int ri)\n{\n    x86_rex_l_mr(_jit, rb, ri, rs);\n}\n\n__jit_inline void\nx86_rex_q_rr(jit_state_t _jit, int rr, int mr)\n{\n    x86_REXw_x_(_jit, 0, 1, rr, 0, mr);\n}\n\n__jit_inline void\nx86_rex_q_mr(jit_state_t _jit, int rb, int ri, int rd)\n{\n    x86_REXw_x_(_jit, 0, 1, rd, _BIT(_rXP(ri)), rb);\n}\n\n__jit_inline void\nx86_rex_q_rm(jit_state_t _jit, int rs, int rb, int ri)\n{\n    x86_rex_q_mr(_jit, rb, ri, rs);\n}\n\n__jit_inline void\nx86_rex_q_r(jit_state_t _jit, int rr)\n{\n    x86_REX_reg(_jit, rr);\n}\n\n__jit_inline void\nx86_rex_q_m(jit_state_t _jit, int rb, int ri)\n{\n    x86_REX_mem(_jit, rb, ri);\n}\n\n#define _REXBrr(rr, mr)\t\t\tx86_REXBrr(_jit, rr, mr)\n__jit_inline void\nx86_REXBrr(jit_state_t _jit, jit_gpr_t rr, jit_gpr_t mr)\n{\n    x86_rex_b_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _REXBmr(rb, ri, rd)\t\tx86_REXBmr(_jit, rb, ri, rd)\n__jit_inline void\nx86_REXBmr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_gpr_t rd)\n{\n    x86_rex_b_mr(_jit, (int)rb, (int)ri, (int)rd);\n}\n\n#define _REXBrm(rs, rb, ri)\t\tx86_REXBrm(_jit, rs, rb, ri)\n__jit_inline void\nx86_REXBrm(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n    x86_rex_b_rm(_jit, (int)rs, (int)rb, (int)ri);\n}\n\n#define _REXBLrr(rr, mr)\t\tx86_REXBLrr(_jit, rr, mr)\n__jit_inline void\nx86_REXBLrr(jit_state_t _jit, jit_gpr_t rr, jit_gpr_t mr)\n{\n    x86_rex_bl_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _REXLr(rr)\t\t\tx86_REXLr(_jit, rr)\n__jit_inline void\nx86_REXLr(jit_state_t _jit, jit_gpr_t rr)\n{\n    x86_rex_l_r(_jit, (int)rr);\n}\n\n#define _REXLm(rb, ri)\t\t\tx86_REXLr(_jit, rb, ri)\n__jit_inline void\nx86_REXLm(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri)\n{\n    x86_rex_l_m(_jit, (int)rb, (int)ri);\n}\n\n#define _REXLrr(rr, mr)\t\t\tx86_REXLrr(_jit, rr, mr)\n__jit_inline void\nx86_REXLrr(jit_state_t _jit, jit_gpr_t rr, jit_gpr_t mr)\n{\n    x86_rex_l_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _REXLmr(rb, ri, rd)\t\tx86_REXLmr(_jit, rb, ri, rd)\n__jit_inline void\nx86_REXLmr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_gpr_t rd)\n{\n    x86_rex_l_mr(_jit, (int)rb, (int)ri, (int)rd);\n}\n\n#define _REXLrm(rs, rb, ri)\t\tx86_REXLrm(_jit, rs, rb, ri)\n__jit_inline void\nx86_REXLrm(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n    x86_rex_l_rm(_jit, (int)rs, (int)rb, (int)ri);\n}\n\n#define _REXQrr(rr, mr)\t\t\tx86_REXQrr(_jit, rr, mr)\n__jit_inline void\nx86_REXQrr(jit_state_t _jit, jit_gpr_t rr, jit_gpr_t mr)\n{\n    x86_rex_q_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _REXQmr(rb, ri, rd)\t\tx86_REXQmr(_jit, rb, ri, rd)\n__jit_inline void\nx86_REXQmr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_gpr_t rd)\n{\n    x86_rex_q_mr(_jit, (int)rb, (int)ri, (int)rd);\n}\n\n#define _REXQrm(rs, rb, ri)\t\tx86_REXQrm(_jit, rs, rb, ri)\n__jit_inline void\nx86_REXQrm(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n    x86_rex_q_rm(_jit, (int)rs, (int)rb, (int)ri);\n}\n\n#define _REXQr(rr)\t\t\tx86_REXQr(_jit, rr)\n__jit_inline void\nx86_REXQr(jit_state_t _jit, jit_gpr_t rr)\n{\n    x86_rex_q_r(_jit, (int)rr);\n}\n\n#define _REXQm(rb, ri)\t\t\tx86_REXQm(_jit, rb, ri)\n__jit_inline void\nx86_REXQm(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri)\n{\n    x86_rex_q_m(_jit, (int)rb, (int)ri);\n}\n\n#define _rex_if_rr(rr, mr)\t\tx86_rex_if_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_if_rr(jit_state_t _jit, jit_gpr_t rr, jit_fpr_t mr)\n{\n    x86_rex_l_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _rex_ld_rr(rr, mr)\t\tx86_rex_ld_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_ld_rr(jit_state_t _jit, jit_gpr_t rr, jit_fpr_t mr)\n{\n    x86_rex_q_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _rex_ff_rr(rr, mr)\t\tx86_rex_ff_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_ff_rr(jit_state_t _jit, jit_fpr_t rr, jit_fpr_t mr)\n{\n    x86_rex_l_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _rex_fi_rr(rr, mr)\t\tx86_rex_fi_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_fi_rr(jit_state_t _jit, jit_fpr_t rr, jit_gpr_t mr)\n{\n    x86_rex_l_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _rex_if_mr(rb, ri, rd)\t\tx86_rex_if_mr(_jit, rb, ri, rd)\n__jit_inline void\nx86_rex_if_mr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_fpr_t rd)\n{\n    x86_rex_l_mr(_jit, (int)rb, (int)ri, (int)rd);\n}\n\n#define _rex_fi_rm(rs, rb, ri)\t\tx86_rex_fi_rm(_jit, rs, rb, ri)\n__jit_inline void\nx86_rex_fi_rm(jit_state_t _jit, jit_fpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n    x86_rex_l_rm(_jit, (int)rs, (int)rb, (int)ri);\n}\n\n#define _rex_dl_rr(rr, mr)\t\tx86_rex_dl_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_dl_rr(jit_state_t _jit, jit_fpr_t rr, jit_gpr_t mr)\n{\n    x86_rex_q_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _rex_dd_rr(rr, mr)\t\tx86_rex_dd_rr(_jit, rr, mr)\n__jit_inline void\nx86_rex_dd_rr(jit_state_t _jit, jit_fpr_t rr, jit_fpr_t mr)\n{\n    x86_rex_q_rr(_jit, (int)rr, (int)mr);\n}\n\n#define _rex_ld_mr(rb, ri, rd)\t\tx86_rex_ld_mr(_jit, rb, ri, rd)\n__jit_inline void\nx86_rex_ld_mr(jit_state_t _jit, jit_gpr_t rb, jit_gpr_t ri, jit_fpr_t rd)\n{\n    x86_rex_q_mr(_jit, (int)rb, (int)ri, (int)rd);\n}\n\n#define rex_dl_rm(rs, rb, ri)\t\tx86rex_dl_rm(_jit, rs, rb, ri)\n__jit_inline void\nx86rex_dl_rm(jit_state_t _jit, jit_fpr_t rs, jit_gpr_t rb, jit_gpr_t ri)\n{\n    x86_rex_q_rm(_jit, (int)rs, (int)rb, (int)ri);\n}\n\n/* --- ALU instructions ---------------------------------------------------- */\n#define _ALUQrr(op, rs, rd)\t\tx86_ALUQrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ALUQrr(jit_state_t _jit, x86_alu_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_alu_sil_rr(_jit, op, rs, rd);\n}\n\n#define _ALUQmr(op, md, rb, ri, ms, rd)\tx86_ALUQmr(_jit, op, md, rb, ri, ms, rd)\n__jit_inline void\nx86_ALUQmr(jit_state_t _jit, x86_alu_t op,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_alu_sil_mr(_jit, op, md, rb, ri, ms, rd);\n}\n\n#define _ALUQrm(op, rs, md, rb, ri, ms)\tx86_ALUQrm(_jit, op, rs, md, rb, ri, ms)\n__jit_inline void\nx86_ALUQrm(jit_state_t _jit, x86_alu_t op,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_alu_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _ALUQir(op, im, rd)\t\tx86_ALUQir(_jit, op, im, rd)\n__jit_inline void\nx86_ALUQir(jit_state_t _jit, x86_alu_t op, long im, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    x86_alu_il_ir(_jit, op, im, rd);\n}\n\n#define _ALUQim(op, im, md, rb, ri, ms)\tx86_ALUQim(_jit, op, im, md, rb, ri, ms)\n__jit_inline void\nx86_ALUQim(jit_state_t _jit, x86_alu_t op,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(_NOREG, rb, ri);\n    x86_alu_il_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define ADCQrr(RS, RD)\t\t\t_ALUQrr(X86_ADC, RS, RD)\n#define ADCQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_ADC, MD, MB, MI, MS, RD)\n#define ADCQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_ADC, RS, MD, MB, MI, MS)\n#define ADCQir(IM, RD)\t\t\t_ALUQir(X86_ADC, IM, RD)\n#define ADCQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_ADC, IM, MD, MB, MI, MS)\n\n#define ADDQrr(RS, RD)\t\t\t_ALUQrr(X86_ADD, RS, RD)\n#define ADDQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_ADD, MD, MB, MI, MS, RD)\n#define ADDQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_ADD, RS, MD, MB, MI, MS)\n#define ADDQir(IM, RD)\t\t\t_ALUQir(X86_ADD, IM, RD)\n#define ADDQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_ADD, IM, MD, MB, MI, MS)\n\n#define ANDQrr(RS, RD)\t\t\t_ALUQrr(X86_AND, RS, RD)\n#define ANDQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_AND, MD, MB, MI, MS, RD)\n#define ANDQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_AND, RS, MD, MB, MI, MS)\n#define ANDQir(IM, RD)\t\t\t_ALUQir(X86_AND, IM, RD)\n#define ANDQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_AND, IM, MD, MB, MI, MS)\n\n#define CMPQrr(RS, RD)\t\t\t_ALUQrr(X86_CMP, RS, RD)\n#define CMPQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_CMP, MD, MB, MI, MS, RD)\n#define CMPQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_CMP, RS, MD, MB, MI, MS)\n#define CMPQir(IM, RD)\t\t\t_ALUQir(X86_CMP, IM, RD)\n#define CMPQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_CMP, IM, MD, MB, MI, MS)\n\n#define ORQrr(RS, RD)\t\t\t_ALUQrr(X86_OR, RS, RD)\n#define ORQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_OR, MD, MB, MI, MS, RD)\n#define ORQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_OR, RS, MD, MB, MI, MS)\n#define ORQir(IM, RD)\t\t\t_ALUQir(X86_OR, IM, RD)\n#define ORQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_OR, IM, MD, MB, MI, MS)\n\n#define SBBQrr(RS, RD)\t\t\t_ALUQrr(X86_SBB, RS, RD)\n#define SBBQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_SBB, MD, MB, MI, MS, RD)\n#define SBBQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_SBB, RS, MD, MB, MI, MS)\n#define SBBQir(IM, RD)\t\t\t_ALUQir(X86_SBB, IM, RD)\n#define SBBQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_SBB, IM, MD, MB, MI, MS)\n\n#define SUBQrr(RS, RD)\t\t\t_ALUQrr(X86_SUB, RS, RD)\n#define SUBQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_SUB, MD, MB, MI, MS, RD)\n#define SUBQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_SUB, RS, MD, MB, MI, MS)\n#define SUBQir(IM, RD)\t\t\t_ALUQir(X86_SUB, IM, RD)\n#define SUBQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_SUB, IM, MD, MB, MI, MS)\n\n#define XORQrr(RS, RD)\t\t\t_ALUQrr(X86_XOR, RS, RD)\n#define XORQmr(MD, MB, MI, MS, RD)\t_ALUQmr(X86_XOR, MD, MB, MI, MS, RD)\n#define XORQrm(RS, MD, MB, MI, MS)\t_ALUQrm(X86_XOR, RS, MD, MB, MI, MS)\n#define XORQir(IM, RD)\t\t\t_ALUQir(X86_XOR, IM, RD)\n#define XORQim(IM, MD, MB, MI, MS)\t_ALUQim(X86_XOR, IM, MD, MB, MI, MS)\n\n/* --- Shift/Rotate instructions ------------------------------------------- */\n#define _ROTSHIQir(op, im, rd)\t\tx86_ROTSHIQir(_jit, op, im, rd)\n__jit_inline void\nx86_ROTSHIQir(jit_state_t _jit, x86_rotsh_t op, long im, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    x86_rotsh_sil_ir(_jit, op, im, rd);\n}\n\n#define _ROTSHIQim(op,im,md,rb,ri,ms)\tx86_ROTSHIQim(_jit,op,im,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHIQim(jit_state_t _jit, x86_rotsh_t op,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(_NOREG, rb, ri);\n    x86_rotsh_sil_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _ROTSHIQrr(op, rs, rd)\t\tx86_ROTSHIQrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ROTSHIQrr(jit_state_t _jit, x86_rotsh_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_rotsh_sil_rr(_jit, op, rs, rd);\n}\n\n#define _ROTSHIQrm(op,rs,md,rb,ri,ms)\tx86_ROTSHIQrm(_jit,op,rs,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHIQrm(jit_state_t _jit, x86_rotsh_t op,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_rotsh_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define ROLQir(IM, RD)\t\t\t_ROTSHIQir(X86_ROL, IM, RD)\n#define ROLQim(IM, MD, MB, MI, MS)\t_ROTSHIQim(X86_ROL, IM, MD, MB, MI, MS)\n#define ROLQrr(RS, RD)\t\t\t_ROTSHIQrr(X86_ROL, RS, RD)\n#define ROLQrm(RS, MD, MB, MI, MS)\t_ROTSHIQrm(X86_ROL, RS, MD, MB, MI, MS)\n\n#define RORQir(IM, RD)\t\t\t_ROTSHIQir(X86_ROR, IM, RD)\n#define RORQim(IM, MD, MB, MI, MS)\t_ROTSHIQim(X86_ROR, IM, MD, MB, MI, MS)\n#define RORQrr(RS, RD)\t\t\t_ROTSHIQrr(X86_ROR, RS, RD)\n#define RORQrm(RS, MD, MB, MI, MS)\t_ROTSHIQrm(X86_ROR, RS, MD, MB, MI, MS)\n\n#define RCLQir(IM, RD)\t\t\t_ROTSHIQir(X86_RCL, IM, RD)\n#define RCLQim(IM, MD, MB, MI, MS)\t_ROTSHIQim(X86_RCL, IM, MD, MB, MI, MS)\n#define RCLQrr(RS, RD)\t\t\t_ROTSHIQrr(X86_RCL, RS, RD)\n#define RCLQrm(RS, MD, MB, MI, MS)\t_ROTSHIQrm(X86_RCL, RS, MD, MB, MI, MS)\n\n#define RCRQir(IM, RD)\t\t\t_ROTSHIQir(X86_RCR, IM, RD)\n#define RCRQim(IM, MD, MB, MI, MS)\t_ROTSHIQim(X86_RCR, IM, MD, MB, MI, MS)\n#define RCRQrr(RS, RD)\t\t\t_ROTSHIQrr(X86_RCR, RS, RD)\n#define RCRQrm(RS, MD, MB, MI, MS)\t_ROTSHIQrm(X86_RCR, RS, MD, MB, MI, MS)\n\n#define SHLQir(IM, RD)\t\t\t_ROTSHIQir(X86_SHL, IM, RD)\n#define SHLQim(IM, MD, MB, MI, MS)\t_ROTSHIQim(X86_SHL, IM, MD, MB, MI, MS)\n#define SHLQrr(RS, RD)\t\t\t_ROTSHIQrr(X86_SHL, RS, RD)\n#define SHLQrm(RS, MD, MB, MI, MS)\t_ROTSHIQrm(X86_SHL, RS, MD, MB, MI, MS)\n\n#define SHRQir(IM, RD)\t\t\t_ROTSHIQir(X86_SHR, IM, RD)\n#define SHRQim(IM, MD, MB, MI, MS)\t_ROTSHIQim(X86_SHR, IM, MD, MB, MI, MS)\n#define SHRQrr(RS, RD)\t\t\t_ROTSHIQrr(X86_SHR, RS, RD)\n#define SHRQrm(RS, MD, MB, MI, MS)\t_ROTSHIQrm(X86_SHR, RS, MD, MB, MI, MS)\n\n#define SALQir\t\t\t\tSHLQir\n#define SALQim\t\t\t\tSHLQim\n#define SALQrr\t\t\t\tSHLQrr\n#define SALQrm\t\t\t\tSHLQrm\n\n#define SARQir(IM, RD)\t\t\t_ROTSHIQir(X86_SAR, IM, RD)\n#define SARQim(IM, MD, MB, MI, MS)\t_ROTSHIQim(X86_SAR, IM, MD, MB, MI, MS)\n#define SARQrr(RS, RD)\t\t\t_ROTSHIQrr(X86_SAR, RS, RD)\n#define SARQrm(RS, MD, MB, MI, MS)\t_ROTSHIQrm(X86_SAR, RS, MD, MB, MI, MS)\n\n/* --- Bit test instructions ----------------------------------------------- */\n#define _BTQir(op, im, rd)\t\tx86_BTQir(_jit, op, im, rd)\n__jit_inline void\nx86_BTQir(jit_state_t _jit, x86_bt_t op, long im, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    x86_bt_sil_ir(_jit, op, im, rd);\n}\n\n#define _BTQim(op, im, md, rb, ri, ms)\tx86_BTQim(_jit, op, im, md, rb, ri, ms)\n__jit_inline void\nx86_BTQim(jit_state_t _jit, x86_bt_t op,\n\t  long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(_NOREG, rb, ri);\n    x86_bt_sil_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _BTQrr(op, rs, rd)\t\tx86_BTQrr(_jit, op, rs, rd)\n__jit_inline void\nx86_BTQrr(jit_state_t _jit, x86_bt_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_bt_sil_rr(_jit, op, rs, rd);\n}\n\n#define _BTQrm(op, rs, md, rb, ri, ms)\tx86_BTQrm(_jit, op, rs, md, rb, ri, ms)\n__jit_inline void\nx86_BTQrm(jit_state_t _jit, x86_bt_t op,\n\t  jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_bt_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define BTQir(IM, RD)\t\t\t_BTQir(X86_BT, IM, RD)\n#define BTQim(IM, MD, MB, MI, MS)\t_BTQim(X86_BT, IM, MD, MB, MI, MS)\n#define BTQrr(RS, RD)\t\t\t_BTQrr(X86_BT, RS, RD)\n#define BTQrm(RS, MD, MB, MI, MS)\t_BTQrm(X86_BT, RS, MD, MB, MI, MS)\n\n#define BTCQir(IM, RD)\t\t\t_BTQir(X86_BTC, IM, RD)\n#define BTCQim(IM, MD, MB, MI, MS)\t_BTQim(X86_BTC, IM, MD, MB, MI, MS)\n#define BTCQrr(RS, RD)\t\t\t_BTQrr(X86_BTC, RS, RD)\n#define BTCQrm(RS, MD, MB, MI, MS)\t_BTQrm(X86_BTC, RS, MD, MB, MI, MS)\n\n#define BTRQir(IM, RD)\t\t\t_BTQir(X86_BTR, IM, RD)\n#define BTRQim(IM, MD, MB, MI, MS)\t_BTQim(X86_BTR, IM, MD, MB, MI, MS)\n#define BTRQrr(RS, RD)\t\t\t_BTQrr(X86_BTR, RS, RD)\n#define BTRQrm(RS, MD, MB, MI, MS)\t_BTQrm(X86_BTR, RS, MD, MB, MI, MS)\n\n#define BTSQir(IM, RD)\t\t\t_BTQir(X86_BTS, IM, RD)\n#define BTSQim(IM, MD, MB, MI, MS)\t_BTQim(X86_BTS, IM, MD, MB, MI, MS)\n#define BTSQrr(RS, RD)\t\t\t_BTQrr(X86_BTS, RS, RD)\n#define BTSQrm(RS, MD, MB, MI, MS)\t_BTQrm(X86_BTS, RS, MD, MB, MI, MS)\n\n/* --- Move instructions --------------------------------------------------- */\n#define MOVQrr(rs, rd)\t\t\tx86_MOVQrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_mov_sil_rr(_jit, rs, rd);\n}\n\n#define MOVQmr(md, rb, ri, ms, rd)\tx86_MOVQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVQmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_mov_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVQrm(rs, md, rb, ri, ms)\tx86_MOVQrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_MOVQrm(jit_state_t _jit,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_mov_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define MOVQir(im, rd)\t\t\tx86_MOVQir(_jit, im, rd)\n__jit_inline void\nx86_MOVQir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    _Or(0xb8, _r8(rd));\n    _jit_L(im);\n}\n\n#define MOVQim(im, md, rb, ri, ms)\tx86_MOVQim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_MOVQim(jit_state_t _jit,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(_NOREG, rb, ri);\n    _O(0xc7);\n    _i_X(_b000, md, rb, ri, ms);\n    _jit_I(_s32(im));\n}\n\n/* --- Unary and Multiply/Divide instructions ------------------------------ */\n#define _UNARYQr(op, rs)\t\tx86_UNARYQr(_jit, op, rs)\n__jit_inline void\nx86_UNARYQr(jit_state_t _jit, x86_unary_t op, jit_gpr_t rs)\n{\n    _REXQrr(_NOREG, rs);\n    x86_unary_sil_r(_jit, op, rs);\n}\n\n#define _UNARYQm(op, md, rb, ri, ms)\tx86_UNARYQm(_jit, op, md, rb, ri, ms)\n__jit_inline void\nx86_UNARYQm(jit_state_t _jit, x86_unary_t op,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQmr(rb, ri, _NOREG);\n    x86_unary_sil_m(_jit, op, md, rb, ri, ms);\n}\n\n#define NOTQr(RS)\t\t\t_UNARYQr(X86_NOT, RS)\n#define NOTQm(MD, MB, MI, MS)\t\t_UNARYQm(X86_NOT, MD, MB, MI, MS)\n\n#define NEGQr(RS)\t\t\t_UNARYQr(X86_NEG, RS)\n#define NEGQm(MD, MB, MI, MS)\t\t_UNARYQm(X86_NEG, MD, MB, MI, MS)\n\n#define MULQr(RS)\t\t\t_UNARYQr(X86_MUL, RS)\n#define MULQm(MD, MB, MI, MS)\t\t_UNARYQm(X86_MUL, MD, MB, MI, MS)\n\n#define IMULQr(RS)\t\t\t_UNARYQr(X86_IMUL, RS)\n#define IMULQm(MD, MB, MI, MS)\t\t_UNARYQm(X86_IMUL, MD, MB, MI, MS)\n\n#define DIVQr(RS)\t\t\t_UNARYQr(X86_DIV, RS)\n#define DIVQm(MD, MB, MI, MS)\t\t_UNARYQm(X86_DIV, MD, MB, MI, MS)\n\n#define IDIVQr(RS)\t\t\t_UNARYQr(X86_IDIV, RS)\n#define IDIVQm(MD, MB, MI, MS)\t\t_UNARYQm(X86_IDIV, MD, MB, MI, MS)\n\n#define IMULQrr(rs, rd)\t\t\tx86_IMULQrr(_jit, rs, rd)\n__jit_inline void\nx86_IMULQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_imul_sil_rr(_jit, rs, rd);\n}\n\n#define IMULQmr(md, rb, ri, ms, rd)\tx86_IMULQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_IMULQmr(jit_state_t _jit,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_imul_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define IMULQir(im, rd)\t\t\tx86_IMULQirr(_jit, im, rd)\n#define IMULQirr(im, rs, rd)\t\tx86_IMULQirr(_jit, im, rs, rd)\n__jit_inline void\nx86_IMULQirr(jit_state_t _jit, long im, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_imul_il_irr(_jit, im, rs, rd);\n}\n\n/* --- Control Flow related instructions ----------------------------------- */\n#define CALLQsr(rs)\t\t\tx86_CALLQsr(_jit, rs)\n__jit_inline void\nx86_CALLQsr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _REXQrr(_NOREG, rs);\n    x86_call_il_sr(_jit, rs);\n}\n\n#define JMPQsr(rs)\t\t\tx86_JMPQsr(_jit, rs)\n__jit_inline void\nx86_JMPQsr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _REXQrr(_NOREG, rs);\n    x86_jmp_il_sr(_jit, rs);\n}\n\n#define CMOVQrr(cc, rs, rd)\t\tx86_CMOVQrr(_jit, cc, rs, rd)\n__jit_inline void\nx86_CMOVQrr(jit_state_t _jit, x86_cc_t cc, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_cmov_sil_rr(_jit, cc, rs, rd);\n}\n\n#define CMOVQmr(cc, md, rb, ri, ms, rd)\tx86_CMOVQmr(_jit, cc, md, rb, ri, ms, rd)\n__jit_inline void\nx86_CMOVQmr(jit_state_t _jit, x86_cc_t cc,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_cmov_sil_mr(_jit, cc, md, rb, ri, ms, rd);\n}\n\n/* --- Push/Pop instructions ----------------------------------------------- */\n#define POPQr(rd)\t\t\tx86_POPQr(_jit, rd)\n__jit_inline void\nx86_POPQr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXQr(rd);\n    x86_pop_sil_r(_jit, rd);\n}\n\n#define POPQm(md, rb, ri, ms)\t\tx86_POPQm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_POPQm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQm(rb, ri);\n    x86_pop_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define PUSHQr(rd)\t\t\tx86_PUSHQr(_jit, rd)\n__jit_inline void\nx86_PUSHQr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _REXQr(rs);\n    x86_push_sil_r(_jit, rs);\n}\n\n#define PUSHQm(md, rb, ri, ms)\t\tx86_PUSHQm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_PUSHQm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQm(rb, ri);\n    x86_push_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define PUSHQi(im)\t\t\tx86_PUSHQi(_jit, im)\n__jit_inline void\nx86_PUSHQi(jit_state_t _jit, long im)\n{\n    x86_push_il_i(_jit, im);\n}\n\n/* --- Test instructions --------------------------------------------------- */\n#define TESTQrr(rs, rd)\t\t\tx86_TESTQrr(_jit, rs, rd)\n__jit_inline void\nx86_TESTQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_test_sil_rr(_jit, rs, rd);\n}\n\n#define TESTQrm(rs, md, rb, ri, ms)\tx86_TESTQrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_TESTQrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_test_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define TESTQir(im, rd)\t\t\tx86_TESTQir(_jit, im, rd)\n__jit_inline void\nx86_TESTQir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    x86_test_il_ir(_jit, im, rd);\n}\n\n#define TESTQim(im, md, rb, ri, ms)\tx86_TESTQim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_TESTQim(jit_state_t _jit,\n\t    long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(_NOREG, rb, ri);\n    x86_test_il_im(_jit, im, md, rb, ri, ms);\n}\n\n/* --- Exchange instructions ----------------------------------------------- */\n#define CMPXCHGQrr(rs, rd)\t\tx86_CMPXCHGQrr(_jit, rs, rd)\n__jit_inline void\nx86_CMPXCHGQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_cmpxchg_sil_rr(_jit, rs, rd);\n}\n\n#define CMPXCHGQrm(rs, md, rb, ri, ms)\tx86_CMPXCHGQrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_CMPXCHGQrm(jit_state_t _jit,\n\t       jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_cmpxchg_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XADDQrr(rs, rd)\t\t\tx86_XADDQrr(_jit, rs, rd)\n__jit_inline void\nx86_XADDQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_xadd_sil_rr(_jit, rs, rd);\n}\n\n#define XADDQrm(rs, md, rb, ri, ms)\tx86_XADDQrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XADDQrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_xadd_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XCHGQrr(rs, rd)\t\t\tx86_XCHGQrr(_jit, rs, rd)\n__jit_inline void\nx86_XCHGQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rs, rd);\n    x86_xchg_sil_rr(_jit, rs, rd);\n}\n\n#define XCHGQrm(rs, md, rb, ri, ms)\tx86_XCHGQrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XCHGQrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(rs, rb, ri);\n    x86_xchg_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n/* --- Increment/Decrement instructions ------------------------------------ */\n#define DECQr(rd)\t\t\tx86_DECQr(_jit, rd)\n__jit_inline void\nx86_DECQr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    x86_dec_sil_r(_jit, rd);\n}\n\n#define DECQm(md, rb, ri, ms)\t\tx86_DECQm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_DECQm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(_NOREG, rb, ri);\n    x86_dec_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define INCQr(rd)\t\t\tx86_INCQr(_jit, rd)\n__jit_inline void\nx86_INCQr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    x86_inc_sil_r(_jit, rd);\n}\n\n#define INCQm(md, rb, ri, ms)\t\tx86_INCQm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_INCQm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXQrm(_NOREG, rb, ri);\n    x86_inc_sil_m(_jit, md, rb, ri, ms);\n}\n\n/* --- Misc instructions --------------------------------------------------- */\n#define BSFQrr(rs, rd)\t\t\tx86_BSFQrr(_jit, rs, rd)\n__jit_inline void\nx86_BSFQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_bsf_sil_rr(_jit, rs, rd);\n}\n\n#define BSFQmr(md, rb, ri, ms, rd)\tx86_BSFQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_BSFQmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_bsf_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define BSRQrr(rs, rd)\t\t\tx86_BSRQrr(_jit, rs, rd)\n__jit_inline void\nx86_BSRQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_bsr_sil_rr(_jit, rs, rd);\n}\n\n#define BSRQmr(md, rb, ri, ms, rd)\tx86_BSRQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_BSRQmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_bsr_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n/* long rd = (int)rs */\n__jit_inline void\nx86_movsd_l_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x63);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n/* long rd = (int)*rs */\n__jit_inline void\nx86_movsd_l_mr(jit_state_t _jit,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x63);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n#define MOVSBQrr(rs, rd)\t\tx86_MOVSBQrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVSBQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\t\t\n{\n    _REXQrr(rd, rs);\n    x86_movsb_sil_rr(_jit, rs, rd);\n}\n\n#define MOVSBQmr(md, rb, ri, ms, rd)\tx86_MOVSBQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVSBQmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_movsb_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVSWQrr(rs, rd)\t\tx86_MOVSWQrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVSWQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_movsw_il_rr(_jit, rs, rd);\n}\n\n#define MOVSWQmr(md, rb, ri, ms, rd)\tx86_MOVSWQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVSWQmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_movsw_il_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVSLQrr(rs, rd)\t\tx86_MOVSLQrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVSLQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_movsd_l_rr(_jit, rs, rd);\n}\n\n#define MOVSLQmr(md, rb, ri, ms, rd)\tx86_MOVSLQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVSLQmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_movsd_l_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVZBQrr(rs, rd)\t\tx86_MOVZBQrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVZBQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\t\t\n{\n    _REXQrr(rd, rs);\n    x86_movzb_sil_rr(_jit, rs, rd);\n}\n\n#define MOVZBQmr(md, rb, ri, ms, rd)\tx86_MOVZBQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVZBQmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_movzb_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVZWQrr(rs, rd)\t\tx86_MOVZWQrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVZWQrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXQrr(rd, rs);\n    x86_movzw_il_rr(_jit, rs, rd);\n}\n\n#define MOVZWQmr(md, rb, ri, ms, rd)\tx86_MOVZWQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVZWQmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_movzw_il_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define LEAQmr(md, rb, ri, ms, rd)\tx86_LEAQmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_LEAQmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXQmr(rb, ri, rd);\n    x86_lea_il_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define BSWAPQr(rd)\t\t\tx86_BSWAPQr(_jit, rd)\n__jit_inline void\nx86_BSWAPQr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXQrr(_NOREG, rd);\n    x86_bswap_il_r(_jit, rd);\n}\n\n/* long rax = (int)eax */\n#define CLTQ_()\t\t\t\tx86_CDQE_(_jit)\n#define CDQE_()\t\t\t\tx86_CDQE_(_jit)\n__jit_inline void\nx86_CDQE_(jit_state_t _jit)\n{\n    _REXQrr(_NOREG, _NOREG);\n    _sign_extend_rax();\n}\n\n#define CQTO_()\t\t\t\tx86_CQO_(_jit)\n#define CQO_()\t\t\t\tx86_CQO_(_jit)\n/* long rdx:rax = rax */\n__jit_inline void\nx86_CQO_(jit_state_t _jit)\n{\n    _REXQrr(_NOREG, _NOREG);\n    _sign_extend_rdx_rax();\n}\n\n#define __sse_dd_rr(op, rs, rd)\t\tx86__sse_dd_rr(_jit, op, rs, rd)\n__jit_inline void\nx86__sse_dd_rr(jit_state_t _jit, x86_sse_t op, jit_fpr_t rs, jit_fpr_t rd)\n{\n    _rex_dd_rr(rd, rs);\n    _O(0x0f);\n    _O(op);\n    _Mrm(_b11, _rX(rd), _rX(rs));\n}\n\n#define __sse_lf_rr(op, rs, rd)\t\tx86__sse_ld_rr(_jit, op, rs, rd)\n#define __sse_ld_rr(op, rs, rd)\t\tx86__sse_ld_rr(_jit, op, rs, rd)\n__jit_inline void\nx86__sse_ld_rr(jit_state_t _jit, x86_sse_t op, jit_fpr_t rs, jit_gpr_t rd)\n{\n    _rex_ld_rr(rd, rs);\n    _O(0x0f);\n    _O(op);\n    _Mrm(_b11, _rA(rd), _rX(rs));\n}\n\n#define __sse_fl_rr(op, rs, rd)\t\tx86__sse_dl_rr(_jit, op, rs, rd)\n#define __sse_dl_rr(op, rs, rd)\t\tx86__sse_dl_rr(_jit, op, rs, rd)\n__jit_inline void\nx86__sse_dl_rr(jit_state_t _jit, x86_sse_t op, jit_gpr_t rs, jit_fpr_t rd)\n{\n    _rex_dl_rr(rd, rs);\n    _O(0x0f);\n    _O(op);\n    _Mrm(_b11, _rX(rd), _rA(rs));\n}\n\n#define __sse_lf_mr(op, md, rb, mi, ms, rd)\t\t\t\t\\\n    x86__sse_ld_mr(_jit, op, md, rb, mi, ms, rd)\n#define __sse_ld_mr(op, md, rb, mi, ms, rd)\t\t\t\t\\\n    x86__sse_ld_mr(_jit, op, md, rb, mi, ms, rd)\n__jit_inline void\nx86__sse_ld_mr(jit_state_t _jit, x86_sse_t op,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_fpr_t rd)\n{\n    _rex_ld_mr(rb, ri, rd);\n    _O(0x0f);\n    _O(op);\n    _f_X(rd, md, rb, ri, ms);\n}\n\n#define __sse_dl_rm(op, rs, md, rb, mi, ms)\t\t\t\t\\\n    x86__sse_dl_rm(_jit, op, rs, md, rb, mi, ms)\n__jit_inline void\nx86__sse_dl_rm(jit_state_t _jit, x86_sse_t op,\n\t       jit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    rex_dl_rm(rs, rb, ri);\n    _O(0x0f);\n    _O(op);\n    _f_X(rs, md, rb, ri, ms);\n}\n\n#define __sse1_dl_rm(op, rs, md, mb, mi, ms)\t\t\t\t\\\n    x86__sse1_dl_rm(_jit, op, rs, md, mb, mi, ms)\n__jit_inline void\nx86__sse1_dl_rm(jit_state_t _jit, x86_sse_t op,\n\t\tjit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    rex_dl_rm(rs, rb, ri);\n    _O(0x0f);\n    _O(0x01 | op);\n    _f_X(rs, md, rb, ri, ms);\n}\n\n#define _sse_dd_rr(px, op, rs, rd)\tx86_sse_dd_rr(_jit, px, op, rs, rd)\n__jit_inline void\nx86_sse_dd_rr(jit_state_t _jit, _uc px,\n\t      x86_sse_t op, jit_fpr_t rs, jit_fpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_dd_rr(_jit, op, rs, rd);\n}\n\n#define _sse_lf_rr(px, op, rs, rd)\tx86_sse_ld_rr(_jit, px, op, rs, rd)\n#define _sse_ld_rr(px, op, rs, rd)\tx86_sse_ld_rr(_jit, px, op, rs, rd)\n__jit_inline void\nx86_sse_ld_rr(jit_state_t _jit,\n\t      _uc px, x86_sse_t op, jit_fpr_t rs, jit_gpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_ld_rr(_jit, op, rs, rd);\n}\n\n#define _sse_fl_rr(px, op, rs, rd)\tx86_sse_dl_rr(_jit, px, op, rs, rd)\n#define _sse_dl_rr(px, op, rs, rd)\tx86_sse_dl_rr(_jit, px, op, rs, rd)\n__jit_inline void\nx86_sse_dl_rr(jit_state_t _jit,\n\t      _uc px, x86_sse_t op, jit_gpr_t rs, jit_fpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_dl_rr(_jit, op, rs, rd);\n}\n\n#define _sse_ld_mr(px, op, md, rb, mi, ms, rd)\t\t\t\t\\\n    x86_sse_ld_mr(_jit, px, op, md, rb, mi, ms, rd)\n__jit_inline void\nx86_sse_ld_mr(jit_state_t _jit, _uc px, x86_sse_t op,\n\t      long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_fpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_ld_mr(_jit, op, md, rb, ri, ms, rd);\n}\n\n#define _sse_dl_rm(px, op, rs, md, rb, mi, ms)\t\t\t\t\\\n    x86_sse_dl_rm(_jit, px, op, rs, md, rb, mi, ms)\n__jit_inline void\nx86_sse_dl_rm(jit_state_t _jit, _uc px, x86_sse_t op,\n\t      jit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _jit_B(px);\n    x86__sse_dl_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _sse1_dl_rm(px, op, rs, md, mb, mi, ms)\t\t\t\t\\\n    x86_sse1_dl_rm(_jit, px, op, rs, md, mb, mi, ms)\n__jit_inline void\nx86_sse1_dl_rm(jit_state_t _jit, _uc px, x86_sse_t op,\n\t       jit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _jit_B(px);\n    x86__sse1_dl_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define CVTTSS2SIQrr(RS, RD)\t\t _sse_lf_rr(0xf3, X86_SSE_CVTTSI, RS, RD)\n#define CVTTSS2SIQmr(MD, MB, MI, MS, RD) _sse_lf_mr(0xf3, X86_SSE_CVTTSI, MD, MB, MI, MS, RD)\n#define CVTTSD2SIQrr(RS, RD)\t\t _sse_lf_rr(0xf2, X86_SSE_CVTTSI, RS, RD)\n#define CVTTSD2SIQmr(MD, MB, MI, MS, RD) _sse_lf_mr(0xf2, X86_SSE_CVTTSI, MD, MB, MI, MS, RD)\n\n#define CVTSS2SIQrr(RS, RD)\t\t _sse_lf_rr(0xf3, X86_SSE_CVTSI, RS, RD)\n#define CVTSS2SIQmr(MD, MB, MI, MS, RD)\t _sse_lf_mr(0xf3, X86_SSE_CVTSI, MD, MB, MI, MS, RD)\n#define CVTSD2SIQrr(RS, RD)\t\t _sse_lf_rr(0xf2, X86_SSE_CVTSI, RS, RD)\n#define CVTSD2SIQmr(MD, MB, MI, MS, RD)\t _sse_lf_mr(0xf2, X86_SSE_CVTSI, MD, MB, MI, MS, RD)\n\n#define CVTSI2SSQrr(RS, RD)\t\t _sse_fl_rr(0xf3, X86_SSE_CVTIS, RS, RD)\n#define CVTSI2SSQmr(MD, MB, MI, MS, RD)\t _sse_lf_mr(0xf3, X86_SSE_CVTIS, MD, MB, MI, MS, RD)\n#define CVTSI2SDQrr(RS, RD)\t\t _sse_dl_rr(0xf2, X86_SSE_CVTIS, RS, RD)\n#define CVTSI2SDQmr(MD, MB, MI, MS, RD)\t _sse_ld_mr(0xf2, X86_SSE_CVTIS, MD, MB, MI, MS, RD)\n\n#define MOVDQXrr(RS, RD)\t\t _sse_dl_rr(0x66, X86_SSE_X2G, RS, RD)\n#define MOVDQXmr(MD, MB, MI, MS, RD)\t _sse_ld_mr(0x66, X86_SSE_X2G, MD, MB, MI, MS, RD)\n\n#define MOVDXQrr(RS, RD)\t\t _sse_ld_rr(0x66, X86_SSE_G2X, RS, RD)\n#define MOVDXQrm(RS, MD, MB, MI, MS)\t _sse_dl_rm(0x66, X86_SSE_G2X, RS, MD, MB, MI, MS)\n#define MOVDQMrr(RS, RD)\t\t__sse_dl_rr(      X86_SSE_X2G, RS, RD)\n#define MOVDQMmr(MD, MB, MI, MS, RD)\t__sse_ld_mr(      X86_SSE_X2G, MD, MB, MI, MS, RD)\n#define MOVDMQrr(RS, RD)\t\t__sse_dd_rr(      X86_SSE_G2X, RS, RD)\n#define MOVDMQrm(RS, MD, MB, MI, MS)\t__sse_dl_rm(      X86_SSE_G2X, RS, MD, MB, MI, MS)\n\n#endif\t/* LIGHTNING_DEBUG */\n#endif\t/* __lightning_asm_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/asm.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the i386\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 1999, 2000, 2001, 2002 Ian Piumarta\n * Copyright 2003 Gwenole Beauchesne\n * Copyright 2006,2010 Free Software Foundation\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_asm_i386_h\n#define __lightning_asm_i386_h\n#ifndef LIGHTNING_DEBUG\n\n/*\tOPCODE\t+ i\t\t= immediate operand\n *\t\t+ r\t\t= register operand\n *\t\t+ m\t\t= memory operand (disp,base,index,scale)\n *\t\t+ sr/sm\t\t= a star preceding a register or memory\n */\n\n#define _b00\t\t0\n#define _b01\t\t1\n#define _b10\t\t2\n#define _b11\t\t3\n\n#define _b000\t\t0\n#define _b001\t\t1\n#define _b010\t\t2\n#define _b011\t\t3\n#define _b100\t\t4\n#define _b101\t\t5\n#define _b110\t\t6\n#define _b111\t\t7\n\ntypedef enum {\n    _RIP\t= -2,\n    _NOREG\t= 0,\n    _RAX\t= 0x50,\n    _RCX\t= 0x51,\n    _RDX\t= 0x52,\n    _RBX\t= 0x53,\n    _RSP\t= 0x54,\n    _RBP\t= 0x55,\n    _RSI\t= 0x56,\n    _RDI\t= 0x57,\n    _R8\t\t= 0x58,\n    _R9\t\t= 0x59,\n    _R10\t= 0x5a,\n    _R11\t= 0x5b,\n    _R12\t= 0x5c,\n    _R13\t= 0x5d,\n    _R14\t= 0x5e,\n    _R15\t= 0x5f,\n} jit_gpr_t;\n\ntypedef enum {\n    _ST0\t= 0,\n    _ST1\t= 1,\n    _ST2\t= 2,\n    _ST3\t= 3,\n    _ST4\t= 4,\n    _ST5\t= 5,\n    _ST6\t= 6,\n    _ST7\t= 7,\n    _XMM0\t= 0x60,\n    _XMM1\t= 0x61,\n    _XMM2\t= 0x62,\n    _XMM3\t= 0x63,\n    _XMM4\t= 0x64,\n    _XMM5\t= 0x65,\n    _XMM6\t= 0x66,\n    _XMM7\t= 0x67,\n    _XMM8\t= 0x68,\n    _XMM9\t= 0x69,\n    _XMM10\t= 0x6a,\n    _XMM11\t= 0x6b,\n    _XMM12\t= 0x6c,\n    _XMM13\t= 0x6d,\n    _XMM14\t= 0x6e,\n    _XMM15\t= 0x6f,\n} jit_fpr_t;\n\ntypedef enum {\n    _SCL1\t= _b00,\n    _SCL2\t= _b01,\n    _SCL4\t= _b10,\n    _SCL8\t= _b11,\n} jit_scl_t;\n\ntypedef enum {\n    X86_ADD\t= 0,\n    X86_OR\t= 1,\n    X86_ADC\t= 2,\n    X86_SBB\t= 3,\n    X86_AND\t= 4,\n    X86_SUB\t= 5,\n    X86_XOR\t= 6,\n    X86_CMP\t= 7,\n} x86_alu_t;\n\ntypedef enum {\n    X86_ROL\t= 0,\n    X86_ROR\t= 1,\n    X86_RCL\t= 2,\n    X86_RCR\t= 3,\n    X86_SHL\t= 4,\n    X86_SHR\t= 5,\n    X86_SAR\t= 7,\n} x86_rotsh_t;\n\ntypedef enum {\n  X86_BT\t= 4,\n  X86_BTS\t= 5,\n  X86_BTR\t= 6,\n  X86_BTC\t= 7,\n} x86_bt_t;\n\ntypedef enum {\n    X86_NOT\t= 2,\n    X86_NEG\t= 3,\n    X86_MUL\t= 4,\n    X86_IMUL\t= 5,\n    X86_DIV\t= 6,\n    X86_IDIV\t= 7,\n} x86_unary_t;\n\ntypedef enum {\n    X86_CC_O\t= 0x0,\n    X86_CC_NO\t= 0x1,\n    X86_CC_NAE\t= 0x2,\n    X86_CC_B\t= 0x2,\n    X86_CC_C\t= 0x2,\n    X86_CC_AE\t= 0x3,\n    X86_CC_NB\t= 0x3,\n    X86_CC_NC\t= 0x3,\n    X86_CC_E\t= 0x4,\n    X86_CC_Z\t= 0x4,\n    X86_CC_NE\t= 0x5,\n    X86_CC_NZ\t= 0x5,\n    X86_CC_BE\t= 0x6,\n    X86_CC_NA\t= 0x6,\n    X86_CC_A\t= 0x7,\n    X86_CC_NBE\t= 0x7,\n    X86_CC_S\t= 0x8,\n    X86_CC_NS\t= 0x9,\n    X86_CC_P\t= 0xa,\n    X86_CC_PE\t= 0xa,\n    X86_CC_NP\t= 0xb,\n    X86_CC_PO\t= 0xb,\n    X86_CC_L\t= 0xc,\n    X86_CC_NGE\t= 0xc,\n    X86_CC_GE\t= 0xd,\n    X86_CC_NL\t= 0xd,\n    X86_CC_LE\t= 0xe,\n    X86_CC_NG\t= 0xe,\n    X86_CC_G\t= 0xf,\n    X86_CC_NLE\t= 0xf,\n} x86_cc_t;\n\nenum {\n    FPCW_MCW_PC\t\t= 0x300,\t/* Precision control mask */\n    FPCW_64\t\t= 0x300,\t/* 64-bit precision */\n    FPCW_53\t\t= 0x200,\t/* 53-bit precision */\n    FPCW_24\t\t= 0x000,\t/* 24-bit precision */\n    FPCW_MCW_RC\t\t= 0xc00,\t/* Rounding control mask */\n    FPCW_CHOP\t\t= 0xc00,\t/* Truncate */\n    FPCW_UP\t\t= 0x800,\t/* Round up */\n    FPCW_DOWN\t\t= 0x400,\t/* Round down */\n    FPCW_NEAR\t\t= 0x000,\t/* Round to nearest */\n    FPCW_MCW_EM\t\t= 0x03f,\t/* Exception mask */\n    FPCW_INVALID\t= 0x001,\t/* Allow invalid numbers */\n    FPCW_DENORMAL\t= 0x002,\t/* Allow denormals */\n    FPCW_ZERODIVIDE\t= 0x004,\t/* Allow divide by zero */\n    FPCW_OVERFLOW\t= 0x008,\t/* Allow overflow */\n    FPCW_UNDERFLOW\t= 0x010,\t/* Allow underflow */\n    FPCW_INEXACT\t= 0x020,\t/* Allow inexact precision */\n};\n\nenum {\n    FPSW_INVALID\t= 0x0001,\n    FPSW_DENORMAL\t= 0x0002,\n    FPSW_ZERODIVIDE\t= 0x0004,\n    FPSW_OVERFLOW\t= 0x0008,\n    FPSW_UNDERFLOW\t= 0x0010,\n    FPSW_INEXACT\t= 0x0020,\n    FPSW_STACKFAULT\t= 0x0040,\n    FPSW_EXCEPT\t\t= 0x0080,\n    FPSW_STACK\t\t= 0x3800,\t/* Top of stack pointer */\n    FPSW_BUSY\t\t= 0x8000,\n\n    /* Condition mask (bits 14,10,9,8) */\n    FPSW_COND\t\t= 0x4700,\n    FPSW_GT\t\t= 0x0000,\n    FPSW_LT\t\t= 0x0100,\n    FPSW_EQ\t\t= 0x4000,\n    FPSW_UN\t\t= 0x4500,\n\n    /* Classify mask (bits 14,10,9,8) bit 9 (C1) is sign */\n    /* FIXME verify correctness */\n    FPSW_CLASS\t\t= 0x4700,\t/* C3 C2 C1 C0 */\n    FPSW_UNSUPPORTED\t= 0x0000,\t/*  0  0  0  0 */\n    FPSW_NAN\t\t= 0x0100,\t/*  0  0  0  1 */\n    FPSW_FINITE\t\t= 0x0400,\t/*  0  1  0  0 */\n    FPSW_ZERO\t\t= 0x4000,\t/*  1  0  0  0 */\n    FPSW_EMPTY\t\t= 0x4100,\t/*  1  0  0  1 */\n    FPSW_DENORM\t\t= 0x4400,\t/*  1  1  0  0 */\n};\n\ntypedef enum {\n    X86_SSE_MOV\t\t= 0x10,\n    X86_SSE_MOVLP\t= 0x12,\n    X86_SSE_MOVHP\t= 0x16,\n    X86_SSE_MOVA\t= 0x28,\n    X86_SSE_CVTIS\t= 0x2a,\n    X86_SSE_CVTTSI\t= 0x2c,\n    X86_SSE_CVTSI\t= 0x2d,\n    X86_SSE_UCOMI\t= 0x2e,\n    X86_SSE_COMI\t= 0x2f,\n    X86_SSE_ROUND\t= 0x3a,\n    X86_SSE_SQRT\t= 0x51,\n    X86_SSE_RSQRT\t= 0x52,\n    X86_SSE_RCP\t\t= 0x53,\n    X86_SSE_AND\t\t= 0x54,\n    X86_SSE_ANDN\t= 0x55,\n    X86_SSE_OR\t\t= 0x56,\n    X86_SSE_XOR\t\t= 0x57,\n    X86_SSE_ADD\t\t= 0x58,\n    X86_SSE_MUL\t\t= 0x59,\n    X86_SSE_CVTSD\t= 0x5a,\n    X86_SSE_CVTDT\t= 0x5b,\n    X86_SSE_SUB\t\t= 0x5c,\n    X86_SSE_MIN\t\t= 0x5d,\n    X86_SSE_DIV\t\t= 0x5e,\n    X86_SSE_MAX\t\t= 0x5f,\n    X86_SSE_X2G\t\t= 0x6e,\n    X86_SSE_EQB\t\t= 0x74,\n    X86_SSE_EQW\t\t= 0x75,\n    X86_SSE_EQD\t\t= 0x76,\n    X86_SSE_G2X\t\t= 0x7e,\n    X86_SSE_MOV2\t= 0xd6\n} x86_sse_t;\n\nenum {\n    MXCSR_INV_EXCPT\t= 0x0001,\n    MXCSR_DENORM_EXCPT\t= 0x0002,\n    MXCSR_ZERODIV_EXCPT\t= 0x0004,\n    MXCSR_OVER_EXCPT\t= 0x0008,\n    MXCSR_UNDER_EXCPT\t= 0x0010,\n    MXCSR_PREC_EXCPT\t= 0x0020,\n    MXCSR_DENORMISZERO\t= 0x0040,\n    MXCSR_INV_MASK\t= 0x0080,\n    MXCSR_DENORM_MASK\t= 0x0100,\n    MXCSR_ZERODIV_MASK\t= 0x0200,\n    MXCSR_OVER_MASK\t= 0x0400,\n    MXCSR_UNDER_MASK\t= 0x0800,\n    MXCSR_PREC_MASK\t= 0x1000,\n\n    MXCSR_RND_MASK\t= 0x6000,\t/* Round mode mask */\n    MXCSR_RND_NEAR\t= 0x0000,\t/* Round to nearest */\n    MXCSR_RND_DOWN\t= 0x2000,\t/* Round toward -oo */\n    MXCSR_RND_UP\t= 0x4000,\t/* Round toward +oo */\n    MXCSR_RND_CHOP\t= 0x6000,\t/* Truncate to zero */\n\n    MXCSR_FLUSHTOZERO\t= 0x8000\n};\n\n#if __WORDSIZE == 32\n#  define _RMAX\t\t\t_RDI\n#  define _XMAX\t\t\t_XMM7\n#  define _rA(R)\t\t_r4(R)\n#  define jit_reg8_p(rs)\t((rs) >= _RAX && (rs) <= _RBX)\n#else\n#  define _RMAX\t\t\t_R15\n#  define _XMAX\t\t\t_XMM15\n#  define _rA(R)\t\t_r8(R)\n#  define jit_reg8_p(rs)\t1\n#endif\n\n#if !_ASM_SAFETY\n#  define _r1(R)\t\t_rN(R)\n#  define _r2(R)\t\t_rN(R)\n#  define _r4(R)\t\t_rN(R)\n#  define _r8(R)\t\t_rN(R)\n#  define _rM(R)\t\t_rN(R)\n#  define _rX(R)\t\t_rN(R)\n#else\n#  define _r1(R)\t\t\t\t\t\t\t\\\n    (((R) >= _RAX && (R) <= _RMAX)\t\t\t\t\t\\\n\t? _rN(R)\t\t\t\t\t\t\t\\\n\t: JITFAIL(\"bad 8-bit register \" #R))\n#  define _r2(R)\t\t\t\t\t\t\t\\\n    (((R) >= _RAX && (R) <= _RMAX)\t\t\t\t\t\\\n\t? _rN(R)\t\t\t\t\t\t\t\\\n\t: JITFAIL(\"bad 16-bit register \" #R))\n#  define _r4(R)\t\t\t\t\t\t\t\\\n    (((R) >= _RAX && (R) <= _RMAX)\t\t\t\t\t\\\n\t? _rN(R)\t\t\t\t\t\t\t\\\n\t: JITFAIL(\"bad 32-bit register \" #R))\n#  if __WORDSIZE == 32\n#    define _r8(R)\t\t\t\t\t\t\t\\\n\tJITFAIL(\"bad 64-bit register \" #R)\n#  else\n#    define _r8(R)\t\t\t\t\t\t\t\\\n    (((R) >= _RAX && (R) <= _R15)\t\t\t\t\t\\\n\t? _rN(R)\t\t\t\t\t\t\t\\\n\t: JITFAIL(\"bad 64-bit register \" #R))\n#  endif\n#  define _rM(R)\t\t\t\t\t\t\t\\\n    (((R) >= _XMM0 && (R) <= _XMM7)\t\t\t\t\t\\\n\t? _rN(R)\t\t\t\t\t\t\t\\\n\t: JITFAIL(\"bad MMX register \" #R))\n#  define _rX(R)\t\t\t\t\t\t\t\\\n    (((R) >= _XMM0 && (R) <= _XMAX)\t\t\t\t\t\\\n\t? _rN(R)\t\t\t\t\t\t\t\\\n\t: JITFAIL(\"bad SSE register \" #R))\n#endif\n\n#define _sign_extend_rax()\t_O(0x98)\n#define _sign_extend_rdx_rax()\t_O(0x99)\n\n#define _rC(R)\t\t\t((R) & 0xf0)\n#define _rR(R)\t\t\t((R) & 0x0f)\n#define _rN(R)\t\t\t((R) & 0x07)\n#define _rXP(R)\t\t\t((R) > 0 && _rR(R) > 7)\n\n#define _OFF4(D)\t\t(_jit_SL(D) - _jit_SL(_jit->x.pc))\n#define _CKD8(D)\t\t_s8(_OFF4(D))\n#define _CKD32(D)\t\t_s32(_OFF4(D))\n\n#define _D8(D)\t\t\t\t\t\t\t\t\\\n    (_jit_B(0), ((*(_PUC(_jit->x.pc)-1))= _CKD8(D)))\n#define _D32(D)\t\t\t\t\t\t\t\t\\\n    (_jit_I(0), ((*(_PUI(_jit->x.pc)-1))= _CKD32(D)))\n\n#ifndef _ASM_SAFETY\n# define _M(M)\t\t\t(M)\n# define _r(R)\t\t\t(R)\n# define _m(M)\t\t\t(M)\n# define _s(S)\t\t\t(S)\n# define _i(I)\t\t\t(I)\n# define _b(B)\t\t\t(B)\n#else\n# define _M(M)\t\t\t\t\t\t\t\t\\\n    (((M) & ~3) ? JITFAIL(\"internal error: mod = \" #M) : (M))\n# define _r(R)\t\t\t\t\t\t\t\t\\\n    (((R) & ~7) ? JITFAIL(\"internal error: reg = \" #R) : (R))\n# define _m(M)\t\t\t\t\t\t\t\t\\\n    (((M) & ~7) ? JITFAIL(\"internal error: r/m = \" #M) : (M))\n# define _s(S)\t\t\t\t\t\t\t\t\\\n    (((S) & ~3) ? JITFAIL(\"internal error: memory scale = \" #S) : (S))\n# define _i(I)\t\t\t\t\t\t\t\t\\\n    (((I) & ~7) ? JITFAIL(\"internal error: memory index = \" #I) : (I))\n# define _b(B)\t\t\t\t\t\t\t\t\\\n    (((B) & ~7) ? JITFAIL(\"internal error: memory base = \"  #B) : (B))\n#endif\n\n#define _Mrm(Md, R, M)\t\t\t\t\t\t\t\\\n    _jit_B((_M(Md) << 6) | (_r(R) << 3) | _m(M))\n\n#define _SIB(Sc, I, B)\t\t\t\t\t\t\t\\\n    _jit_B((_s(Sc) << 6) | (_i(I) << 3) | _b(B))\n\n/* _r_D() is RIP addressing mode if X86_TARGET_64BIT, use _r_DSIB() instead */\n#define _r_D(rd, md)\t\t\tx86_r_D(_jit, rd, md)\n__jit_inline void\nx86_r_D(jit_state_t _jit, int rd, long md)\n{\n    _Mrm(_b00, rd, _b101);\n    _jit_I(_s32(md));\n}\n\n#define _r_DSIB(rd, md)\t\t\tx86_r_DSIB(_jit, rd, md)\n__jit_inline void\nx86_r_DSIB(jit_state_t _jit, int rd, long md)\n{\n    _Mrm(_b00, rd, _b100);\n    _SIB(_SCL1, _b100, _b101);\n    _jit_I(_s32(md));\n}\n\n#define _r_0B(rd, rb)\t\t\tx86_r_0B(_jit, rd, rb)\n__jit_inline void\nx86_r_0B(jit_state_t _jit, int rd, jit_gpr_t rb)\n{\n    _Mrm(_b00, rd, _rA(rb));\n}\n\n#define _r_0BIS(rd, rb, ri, ms)\t\tx86_r_0BIS(_jit, rd, rb, ri, ms)\n__jit_inline void\nx86_r_0BIS(jit_state_t _jit, int rd, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _Mrm(_b00, rd, _b100);\n    _SIB(ms, _rA(ri), _rA(rb));\n}\n\n#define _r_1B(rd, md, rb)\t\tx86_r_1B(_jit, rd, md, rb)\n__jit_inline void\nx86_r_1B(jit_state_t _jit, int rd, long md, jit_gpr_t rb)\n{\n    _Mrm(_b01, rd, _rA(rb));\n    _jit_B(md);\n}\n\n#define _r_1BIS(rd, md, rb, ri, ms)\tx86_r_1BIS(_jit, rd, md, rb, ri, ms)\n__jit_inline void\nx86_r_1BIS(jit_state_t _jit,\n\t   int rd, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _Mrm(_b01, rd, _b100);\n    _SIB(ms, _rA(ri), _rA(rb));\n    _jit_B(md);\n}\n\n#define _r_4B(rd, md, rb)\t\tx86_r_4B(_jit, rd, md, rb)\n__jit_inline void\nx86_r_4B(jit_state_t _jit, int rd, long md, jit_gpr_t rb)\n{\n    _Mrm(_b10, rd, _rA(rb));\n    _jit_I(_s32(md));\n}\n\n#define _r_4IS(rd, md, ri, ms)\t\tx86_r_4IS(_jit, rd, md, ri, ms)\n__jit_inline void\nx86_r_4IS(jit_state_t _jit, int rd, long md, jit_gpr_t ri, jit_scl_t ms)\n{\n    _Mrm(_b00, rd, _b100);\n    _SIB(ms, _rA(ri), _b101);\n    _jit_I(_s32(md));\n}\n\n#define _r_4BIS(rd, md, rb, ri, ms)\tx86_r_4BIS(_jit, rd, md, rb, ri, ms)\n__jit_inline void\nx86_r_4BIS(jit_state_t _jit,\n\t   int rd, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _Mrm(_b10, rd, _b100);\n    _SIB(ms, _rA(ri), _rA(rb));\n    _jit_I(_s32(md));\n}\n\n#define _r_DB(rd, md, rb)\t\tx86_r_DB(_jit, rd, md, rb)\n__jit_inline void\nx86_r_DB(jit_state_t _jit, int rd, long md, jit_gpr_t rb)\n{\n    if (md == 0 && _rN(rb) != _rN(_RBP))\n\t_r_0B(rd, rb);\n    else if (_s8P(md))\n\t_r_1B(rd, md, rb);\n    else\n\t_r_4B(rd, md, rb);\n}\n\n#define _r_DBIS(rd, md, rb, ri, ms)\tx86_r_DBIS(_jit, rd, md, rb, ri, ms)\n__jit_inline void\nx86_r_DBIS(jit_state_t _jit,\n\t   int rd, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (md == 0 && _rN(rb) != _rN(_RBP))\n\t_r_0BIS(rd, rb, ri, ms);\n    else if (_s8P(md))\n\t_r_1BIS(rd, md, rb, ri, ms);\n    else\n\t_r_4BIS(rd, md, rb, ri, ms);\n}\n\n/* Use RIP-addressing in 64-bit mode, if possible */\n#define _i_X(op, md, rb, ri, ms)\tx86_i_X(_jit, op, md, rb, ri, ms)\n__jit_inline void\nx86_i_X(jit_state_t _jit,\n\tint op, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (ri == _NOREG) {\n\tif (rb == _NOREG) {\n#if __WORDSIZE == 32\n\t    _r_D(op, md);\n#else\n\t    _r_DSIB(op, md);\n#endif\n\t}\n#if __WORDSIZE == 64\n\telse if (rb == _RIP)\n\t    _r_D(op, md);\n#endif\n\telse if (_rN(rb) == _rN(_RSP))\n\t    _r_DBIS(op, md, _RSP, _RSP, ms);\n\telse\n\t    _r_DB(op, md, rb);\n    }\n    else if (rb == _NOREG)\n\t_r_4IS(op, md, ri, ms);\n    else if (_rR(ri) != _rR(_RSP))\n\t_r_DBIS(op, md, rb, ri, ms);\n    else\n\tJITFAIL(\"illegal index register: %esp\");\n}\n\n#define _r_X(rd, md, rb, ri, ms)\tx86_r_X(_jit, rd, md, rb, ri, ms)\n__jit_inline void\nx86_r_X(jit_state_t _jit,\n\tjit_gpr_t rd, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _i_X((int)_rA(rd), md, rb, ri, ms);\n}\n\n#define _f_X(rd, md, rb, ri, ms)\tx86_f_X(_jit, rd, md, rb, ri, ms)\n__jit_inline void\nx86_f_X(jit_state_t _jit,\n\tjit_fpr_t rd, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _i_X((int)_rX(rd), md, rb, ri, ms);\n}\n\n/* --- Instruction formats ------------------------------------------------- */\n\n#define _d16()\t\t\t(_jit_B(0x66))\n#define _O(OP) \t\t\t(_jit_B(OP))\n#define _Or(OP, R)\t\t(_jit_B((OP) | _r(R)))\n#define _OO(OP)\t\t\t(_jit_B((OP) >> 8), _jit_B((OP)))\n\n/* --- ALU instructions ---------------------------------------------------- */\n__jit_inline void\nx86_alu_c_rr(jit_state_t _jit, x86_alu_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O((int)op << 3);\n    _Mrm(_b11, _r1(rs), _r1(rd));\n}\n\n__jit_inline void\nx86_alu_c_mr(jit_state_t _jit, x86_alu_t op,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(((int)op << 3) + 2);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_alu_c_rm(jit_state_t _jit, x86_alu_t op,\n\t     jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O((int)op << 3);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_alu_c_ir(jit_state_t _jit, x86_alu_t op, long im, jit_gpr_t rd)\n{\n    if (rd == _RAX)\n\t_O(((int)op << 3) + 4);\n    else {\n\t_O(0x80);\n\t_Mrm(_b11, (int)op, _r1(rd));\n    }\n    _jit_B(_s8(im));\n}\n\n__jit_inline void\nx86_alu_c_im(jit_state_t _jit, x86_alu_t op,\n\t     long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x80);\n    _i_X((int)op, md, rb, ri, ms);\n    _jit_B(_s8(im));\n}\n\n__jit_inline void\nx86_alu_s_ir(jit_state_t _jit, x86_alu_t op, long im, jit_gpr_t rd)\n{\n    if (rd == _RAX) {\n\t_O(((int)op << 3) + 5);\n\t_jit_W(_s16(im));\n    }\n    else if (_s8P(im)) {\n\t_O(0x83);\n\t_Mrm(_b11, (int)op, _r2(rd));\n\t_jit_B(im);\n    }\n    else {\n\t_O(0x81);\n\t_Mrm(_b11, (int)op, _r2(rd));\n\t_jit_W(_s16(im));\n    }\n}\n\n__jit_inline void\nx86_alu_s_im(jit_state_t _jit, x86_alu_t op,\n\t     long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (_s8P(im)) {\n\t_O(0x83);\n\t_i_X((int)op, md, rb, ri, ms);\n\t_jit_B(im);\n    }\n    else {\n\t_O(0x81);\n\t_i_X((int)op, md, rb, ri, ms);\n\t_jit_W(_s16(im));\n    }\n}\n\n__jit_inline void\nx86_alu_sil_rr(jit_state_t _jit, x86_alu_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(((int)op << 3) + 1);\n    _Mrm(_b11, _rA(rs), _rA(rd));\n}\n\n__jit_inline void\nx86_alu_sil_mr(jit_state_t _jit, x86_alu_t op,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(((int)op << 3) + 3);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_alu_sil_rm(jit_state_t _jit, x86_alu_t op,\n\t       jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(((int)op << 3) + 1);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_alu_il_ir(jit_state_t _jit, x86_alu_t op, long im, jit_gpr_t rd)\n{\n    if (_s8P(im)) {\n\t_O(0x83);\n\t_Mrm(_b11, (int)op, _rA(rd));\n\t_jit_B(im);\n    }\n    else {\n\tif (rd == _RAX)\n\t    _O(((int)op << 3) + 5);\n\telse {\n\t    _O(0x81);\n\t    _Mrm(_b11, (int)op, _rA(rd));\n\t}\n\t_jit_I(_s32(im));\n    }\n}\n\n__jit_inline void\nx86_alu_il_im(jit_state_t _jit, x86_alu_t op,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (_s8P(im)) {\n\t_O(0x83);\n\t_i_X((int)op, md, rb, ri, ms);\n\t_jit_B(im);\n    }\n    else {\n\t_O(0x81);\n\t_i_X((int)op, md, rb, ri, ms);\n\t_jit_I(_s32(im));\n    }\n}\n\n/* --- Shift/Rotate instructions ------------------------------------------- */\n__jit_inline void\nx86_rotsh_c_rr(jit_state_t _jit, x86_rotsh_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    if (rs != _RCX)\n\tJITFAIL(\"source register must be RCX\");\n    _O(0xd2);\n    _Mrm(_b11, (int)op, _rA(rd));\n}\n\n__jit_inline void\nx86_rotsh_sil_rr(jit_state_t _jit, x86_rotsh_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    if (rs != _RCX)\n\tJITFAIL(\"source register must be RCX\");\n    _O(0xd3);\n    _Mrm(_b11, (int)op, _rA(rd));\n}\n\n__jit_inline void\nx86_rotsh_c_ir(jit_state_t _jit, x86_rotsh_t op, long im, jit_gpr_t rd)\n{\n    if (im == 1) {\n\t_O(0xd0);\n\t_Mrm(_b11, (int)op, _rA(rd));\n    }\n    else {\n\t_O(0xc0);\n\t_Mrm(_b11, (int)op, _rA(rd));\n\t_jit_B(_u8(im));\n    }\n}\n\n__jit_inline void\nx86_rotsh_sil_ir(jit_state_t _jit, x86_rotsh_t op, long im, jit_gpr_t rd)\n{\n    if (im == 1) {\n\t_O(0xd1);\n\t_Mrm(_b11, (int)op, _rA(rd));\n    }\n    else {\n\t_O(0xc1);\n\t_Mrm(_b11, (int)op, _rA(rd));\n\t_jit_B(_u8(im));\n    }\n}\n\n__jit_inline void\nx86_rotsh_c_im(jit_state_t _jit, x86_rotsh_t op,\n\t       long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (im == 1) {\n\t_O(0xd0);\n\t_i_X((int)op, md, rb, ri, ms);\n    }\n    else {\n\t_O(0xc0);\n\t_i_X((int)op, md, rb, ri, ms);\n\t_jit_B(_u8(im));\n    }\n}\n\n__jit_inline void\nx86_rotsh_sil_im(jit_state_t _jit, x86_rotsh_t op,\n\t\t long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (im == 1) {\n\t_O(0xd1);\n\t_i_X((int)op, md, rb, ri, ms);\n    }\n    else {\n\t_O(0xc1);\n\t_i_X((int)op, md, rb, ri, ms);\n\t_jit_B(_u8(im));\n    }\n}\n\n__jit_inline void\nx86_rotsh_c_rm(jit_state_t _jit, x86_rotsh_t op,\n\t       jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (rs != _RCX)\n\tJITFAIL(\"source register must be RCX\");\n    _O(0xd2);\n    _i_X((int)op, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_rotsh_sil_rm(jit_state_t _jit, x86_rotsh_t op,\n\t\t jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    if (rs != _RCX)\n\tJITFAIL(\"source register must be RCX\");\n    _O(0xd3);\n    _i_X((int)op, md, rb, ri, ms);\n}\n\n/* --- Bit test instructions ----------------------------------------------- */\n__jit_inline void\nx86_bt_sil_ir(jit_state_t _jit, x86_bt_t op, long im, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xba);\n    _Mrm(_b11, (int)op, _rA(rd));\n    _jit_B(_u8(im));\n}\n\n__jit_inline void\nx86_bt_sil_im(jit_state_t _jit, x86_bt_t op,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x0f);\n    _O(0xba);\n    _i_X((int)op, md, rb, ri, ms);\n    _jit_B(_u8(im));\n}\n\n__jit_inline void\nx86_bt_sil_rr(jit_state_t _jit, x86_bt_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0x83 | ((int)op << 3));\n    _Mrm(_b11, _rA(rs), _rA(rd));\n}\n\n__jit_inline void\nx86_bt_sil_rm(jit_state_t _jit, x86_bt_t op,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x0f);\n    _O(0x83 | ((int)op << 3));\n    _r_X(rs, md, rb, ri, ms);\n}\n\n/* --- Move instructions --------------------------------------------------- */\n__jit_inline void\nx86_mov_c_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x88);\n    _Mrm(_b11, _r1(rs), _r1(rd));\n}\n\n__jit_inline void\nx86_mov_c_mr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x8a);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_mov_c_rm(jit_state_t _jit,\n\t     jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x88);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_mov_c_ir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _Or(0xb0, _r1(rd));\n    _jit_B(_s8(im));\n}\n\n__jit_inline void\nx86_mov_c_im(jit_state_t _jit,\n\t     long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _i_X(0, md, rb, ri, ms);\n    _jit_B(_s8(im));\n}\n\n__jit_inline void\nx86_mov_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x89);\n    _Mrm(_b11, _rA(rs), _rA(rd));\n}\n\n__jit_inline void\nx86_mov_sil_mr(jit_state_t _jit,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x8b);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_mov_sil_rm(jit_state_t _jit,\n\t       jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x89);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n/* --- Unary and Multiply/Divide instructions ------------------------------ */\n__jit_inline void\nx86_unary_c_r(jit_state_t _jit, x86_unary_t op, jit_gpr_t rs)\n{\n    _O(0xf6);\n    _Mrm(_b11, (int)op, _r1(rs));\n}\n\n__jit_inline void\nx86_unary_c_m(jit_state_t _jit, x86_unary_t op,\n\t      long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xf6);\n    _i_X((int)op, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_unary_sil_r(jit_state_t _jit, x86_unary_t op, jit_gpr_t rs)\n{\n    _O(0xf7);\n    _Mrm(_b11, (int)op, _rA(rs));\n}\n\n__jit_inline void\nx86_unary_sil_m(jit_state_t _jit, x86_unary_t op,\n\t\tlong md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xf7);\n    _i_X((int)op, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_imul_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xaf);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n__jit_inline void\nx86_imul_sil_mr(jit_state_t _jit, \n\t\tlong md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xaf);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_imul_s_irr(jit_state_t _jit, long im, jit_gpr_t rs, jit_gpr_t rd)\n{\n    if (_s8P(im)) {\n\t_O(0x6b);\n\t_Mrm(_b11, _rA(rd), _r4(rs));\n\t_jit_B(im);\n    }\n    else {\n\t_O(0x69);\n\t_Mrm(_b11, _rA(rd), _r4(rs));\n\t_jit_W(_s16(im));\n    }\n}\n\n__jit_inline void\nx86_imul_il_irr(jit_state_t _jit, long im, jit_gpr_t rs, jit_gpr_t rd)\n{\n    if (_s8P(im)) {\n\t_O(0x6b);\n\t_Mrm(_b11, _rA(rd), _r4(rs));\n\t_jit_B(im);\n    }\n    else {\n\t_O(0x69);\n\t_Mrm(_b11, _rA(rd), _r4(rs));\n\t_jit_I(_s32(im));\n    }\n}\n\n/* --- Control Flow related instructions ----------------------------------- */\n__jit_inline void\nx86_call_il_sr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _O(0xff);\n    _Mrm(_b11, _b010, _rA(rs));\n}\n\n__jit_inline void\nx86_jmp_il_sr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _O(0xff);\n    _Mrm(_b11, _b100, _rA(rs));\n}\n\n__jit_inline void\nx86_cmov_sil_rr(jit_state_t _jit, x86_cc_t cc, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0x40 | (int)cc);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n__jit_inline void\nx86_cmov_sil_mr(jit_state_t _jit, x86_cc_t cc,\n\t\tlong md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _O(0x0f);\n    _O(0x40 | (int)cc);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n/* --- Push/Pop instructions ----------------------------------------------- */\n__jit_inline void\nx86_pop_sil_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _Or(0x58, _rA(rd));\n}\n\n__jit_inline void\nx86_pop_sil_m(jit_state_t _jit,\n\t      long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x8f);\n    _i_X(_b000, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_push_sil_r(jit_state_t _jit, jit_gpr_t rs)\n{\n    _Or(0x50, _rA(rs));\n}\n\n__jit_inline void\nx86_push_sil_m(jit_state_t _jit,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xff);\n    _i_X(_b110, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_push_c_i(jit_state_t _jit, long im)\n{\n    _O(0x6a);\n    _jit_B(im);\n}\n\n__jit_inline void\nx86_push_il_i(jit_state_t _jit, long im)\n{\n    if (_s8P(im))\n\tx86_push_c_i(_jit, im);\n    else {\n\t_O(0x68);\n\t_jit_I(_s32(im));\n    }\n}\n\n/* --- Test instructions --------------------------------------------------- */\n__jit_inline void\nx86_test_c_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x84);\n    _Mrm(_b11, _r1(rs), _r1(rd));\n}\n\n__jit_inline void\nx86_test_c_rm(jit_state_t _jit,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x84);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_test_c_ir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    if (rd == _RAX)\n\t_O(0xa8);\n    else {\n\t_O(0xf6);\n\t_Mrm(_b11, _b000, _r1(rd));\n    }\n    _jit_B(_s8(im));\n}\n\n__jit_inline void\nx86_test_c_im(jit_state_t _jit,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xf6);\n    _i_X(_b000, md, rb, ri, ms);\n    _jit_B(_s8(im));\n}\n\n__jit_inline void\nx86_test_s_ir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    if (rd == _RAX)\n\t_O(0xa9);\n    else {\n\t_O(0xf7);\n\t_Mrm(_b11, _b000, _r2(rd));\n    }\n    _jit_W(_s16(im));\n}\n\n__jit_inline void\nx86_test_s_im(jit_state_t _jit,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xf7);\n    _i_X(_b000, md, rb, ri, ms);\n    _jit_W(_s16(im));\n}\n\n__jit_inline void\nx86_test_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x85);\n    _Mrm(_b11, _rA(rs), _rA(rd));\n}\n\n__jit_inline void\nx86_test_sil_rm(jit_state_t _jit,\n\t\tjit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x85);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_test_il_ir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    if (rd == _RAX)\n\t_O(0xa9);\n    else {\n\t_O(0xf7);\n\t_Mrm(_b11, _b000, _rA(rd));\n    }\n    _jit_I(_s32(im));\n}\n\n__jit_inline void\nx86_test_il_im(jit_state_t _jit,\n\t       long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xf7);\n    _i_X(_b000, md, rb, ri, ms);\n    _jit_I(_s32(im));\n}\n\n/* --- Exchange instructions ----------------------------------------------- */\n__jit_inline void\nx86_cmpxchg_c_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xb0);\n    _Mrm(_b11, _r1(rs), _r1(rd));\n}\n\n__jit_inline void\nx86_cmpxchg_c_rm(jit_state_t _jit,\n\t\t jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t\t jit_scl_t ms)\n{\n    _O(0x0f);\n    _O(0xb0);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_cmpxchg_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xb1);\n    _Mrm(_b11, _rA(rs), _rA(rd));\n}\n\n__jit_inline void\nx86_cmpxchg_sil_rm(jit_state_t _jit,\n\t\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t\t   jit_scl_t ms)\n{\n    _O(0x0f);\n    _O(0xb1);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_xadd_c_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xc0);\n    _Mrm(_b11, _r1(rs), _r1(rd));\n}\n\n__jit_inline void\nx86_xadd_c_rm(jit_state_t _jit,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x0f);\n    _O(0xc0);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_xadd_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xc1);\n    _Mrm(_b11, _rA(rs), _rA(rd));\n}\n\n__jit_inline void\nx86_xadd_sil_rm(jit_state_t _jit,\n\t\tjit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x0f);\n    _O(0xc1);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_xchg_c_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x86);\n    _Mrm(_b11, _r1(rs), _r1(rd));\n}\n\n__jit_inline void\nx86_xchg_c_rm(jit_state_t _jit,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x86);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_xchg_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x87);\n    _Mrm(_b11, _rA(rs), _rA(rd));\n}\n\n__jit_inline void\nx86_xchg_sil_rm(jit_state_t _jit,\n\t\tjit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0x87);\n    _r_X(rs, md, rb, ri, ms);\n}\n\n/* --- Increment/Decrement instructions ------------------------------------ */\n__jit_inline void\nx86_dec_c_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _O(0xfe);\n    _Mrm(_b11, _b001, _r1(rd));\n}\n\n__jit_inline void\nx86_inc_c_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _O(0xfe);\n    _Mrm(_b11, _b000, _r1(rd));\n}\n\n__jit_inline void\nx86_dec_c_m(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xfe);\n    _i_X(_b001, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_inc_c_m(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _O(0xfe);\n    _i_X(_b000, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_dec_sil_m(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t      jit_scl_t ms)\n{\n    _O(0xff);\n    _i_X(_b001, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_inc_sil_m(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t      jit_scl_t ms)\n{\n    _O(0xff);\n    _i_X(_b000, md, rb, ri, ms);\n}\n\n/* --- Misc instructions --------------------------------------------------- */\n__jit_inline void\nx86_bsf_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbc);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n__jit_inline void\nx86_bsf_sil_mr(jit_state_t _jit,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbc);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_bsr_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbd);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n__jit_inline void\nx86_bsr_sil_mr(jit_state_t _jit,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbd);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n/* short|int|long rd = (char)rs */\n__jit_inline void\nx86_movsb_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbe);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n/* short|int|long rd = (char)*rs */\n__jit_inline void\nx86_movsb_sil_mr(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t\t jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbe);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n/* int|long rd = (short)rs */\n__jit_inline void\nx86_movsw_il_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbf);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n/* int|long rd = (short)*rs */\n__jit_inline void\nx86_movsw_il_mr(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t\tjit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xbf);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n/* unsigned short|int|long rd = (unsigned char)rs */\n__jit_inline void\nx86_movzb_sil_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xb6);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n/* unsigned short|int|long rd = (unsigned char)*rs */\n__jit_inline void\nx86_movzb_sil_mr(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t\t jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xb6);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n/* unsigned int|long rd = (unsigned short)rs */\n__jit_inline void\nx86_movzw_il_rr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xb7);\n    _Mrm(_b11, _rA(rd), _rA(rs));\n}\n\n/* unsigned int|long rd = (unsigned short)*rs */\n__jit_inline void\nx86_movzw_il_mr(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t\tjit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _O(0xb7);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_lea_il_mr(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri,\n\t      jit_scl_t ms, jit_gpr_t rd)\n{\n    _O(0x8d);\n    _r_X(rd, md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_bswap_il_r(jit_state_t _jit, jit_gpr_t rd)\n{\n    _O(0x0f);\n    _Or(0xc8, _rA(rd));\n}\n\n#if __WORDSIZE == 64\n#  include \"asm-64.h\"\n#else\n#  include \"asm-32.h\"\n#endif\n\n/* ========================================================================= */\n/* --- Fully-qualified intrinsic instructions ------------------------------ */\n/* ========================================================================= */\n\n/*\tOPCODE\t+ i\t= immediate operand\n *\t\t+ r\t= register operand\n *\t\t+ m\t= memory operand (disp,base,index,scale)\n *\t\t+ sr/sm\t= a star preceding a register or memory\n *\t\t+ 0\t= top of stack register (for FPU instructions)\n *\n *\tNOTE in x86-64 mode: a memory operand with only a valid\n *\tdisplacement value will lead to the expect absolute mode. If\n *\tRIP addressing is necessary, X86_RIP shall be used as the base\n *\tregister argument.\n */\n\n/* --- ALU instructions ---------------------------------------------------- */\n#define _ALUBrr(op, rs, rd)\t\tx86_ALUBrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ALUBrr(jit_state_t _jit, x86_alu_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBrr(rs, rd);\n    x86_alu_c_rr(_jit, op, rs, rd);\n}\n\n#define _ALUBmr(op, md, rb, ri, ms, rd)\tx86_ALUBmr(_jit, op, md, rb, ri, ms, rd)\n__jit_inline void\nx86_ALUBmr(jit_state_t _jit, x86_alu_t op,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXBmr(rb, ri, rd);\n    x86_alu_c_mr(_jit, op, md, rb, ri, ms, rd);\n}\n\n#define _ALUBrm(op, rs, md, rb, ri, ms)\tx86_ALUBrm(_jit, op, rs, md, rb, ri, ms)\n__jit_inline void\nx86_ALUBrm(jit_state_t _jit, x86_alu_t op,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(rs, rb, ri);\n    x86_alu_c_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _ALUBir(op, im, rd)\t\tx86_ALUBir(_jit, op, im, rd)\n__jit_inline void\nx86_ALUBir(jit_state_t _jit, x86_alu_t op, long im, jit_gpr_t rd)\n{\n    _REXBrr(_NOREG, rd);\n    x86_alu_c_ir(_jit, op, im, rd);\n}\n\n#define _ALUBim(op, im, md, rb, ri, ms)\tx86_ALUBim(_jit, op, im, md, rb, ri, ms)\n__jit_inline void\nx86_ALUBim(jit_state_t _jit, x86_alu_t op,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    x86_alu_c_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _ALUWrr(op, rs, rd)\t\tx86_ALUWrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ALUWrr(jit_state_t _jit, x86_alu_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_alu_sil_rr(_jit, op, rs, rd);\n}\n\n#define _ALUWmr(op, md, rb, ri, ms, rd)\tx86_ALUWmr(_jit, op, md, rb, ri, ms, rd)\n__jit_inline void\nx86_ALUWmr(jit_state_t _jit, x86_alu_t op,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_alu_sil_mr(_jit, op, md, rb, ri, ms, rd);\n}\n\n#define _ALUWrm(op, rs, md, rb, ri, ms)\tx86_ALUWrm(_jit, op, rs, md, rb, ri, ms)\n__jit_inline void\nx86_ALUWrm(jit_state_t _jit, x86_alu_t op,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_alu_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _ALUWir(op, im, rd)\t\tx86_ALUWir(_jit, op, im, rd)\n__jit_inline void\nx86_ALUWir(jit_state_t _jit, x86_alu_t op, long im, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(_NOREG, rd);\n    x86_alu_s_ir(_jit, op, im, rd);\n}\n\n#define _ALUWim(op, im, md, rb, ri, ms)\tx86_ALUWim(_jit, op, im, md, rb, ri, ms)\n__jit_inline void\nx86_ALUWim(jit_state_t _jit, x86_alu_t op,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(_NOREG, rb, ri);\n    x86_alu_s_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _ALULrr(op, rs, rd)\t\tx86_ALULrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ALULrr(jit_state_t _jit, x86_alu_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_alu_sil_rr(_jit, op, rs, rd);\n}\n\n#define _ALULmr(op, md, rb, ri, ms, rd)\tx86_ALULmr(_jit, op, md, rb, ri, ms, rd)\n__jit_inline void\nx86_ALULmr(jit_state_t _jit, x86_alu_t op,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_alu_sil_mr(_jit, op, md, rb, ri, ms, rd);\n}\n\n#define _ALULrm(op, rs, md, rb, ri, ms)\tx86_ALULrm(_jit, op, rs, md, rb, ri, ms)\n__jit_inline void\nx86_ALULrm(jit_state_t _jit, x86_alu_t op,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_alu_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _ALULir(op, im, rd)\t\tx86_ALULir(_jit, op, im, rd)\n__jit_inline void\nx86_ALULir(jit_state_t _jit, x86_alu_t op, long im, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    x86_alu_il_ir(_jit, op, im, rd);\n}\n\n#define _ALULim(op, im, md, rb, ri, ms)\tx86_ALULim(_jit, op, im, md, rb, ri, ms)\n__jit_inline void\nx86_ALULim(jit_state_t _jit, x86_alu_t op,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    x86_alu_il_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define ADCBrr(RS, RD)\t\t\t_ALUBrr(X86_ADC, RS, RD)\n#define ADCBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_ADC, MD, MB, MI, MS, RD)\n#define ADCBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_ADC, RS, MD, MB, MI, MS)\n#define ADCBir(IM, RD)\t\t\t_ALUBir(X86_ADC, IM, RD)\n#define ADCBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_ADC, IM, MD, MB, MI, MS)\n\n#define ADCWrr(RS, RD)\t\t\t_ALUWrr(X86_ADC, RS, RD)\n#define ADCWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_ADC, MD, MB, MI, MS, RD)\n#define ADCWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_ADC, RS, MD, MB, MI, MS)\n#define ADCWir(IM, RD)\t\t\t_ALUWir(X86_ADC, IM, RD)\n#define ADCWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_ADC, IM, MD, MB, MI, MS)\n\n#define ADCLrr(RS, RD)\t\t\t_ALULrr(X86_ADC, RS, RD)\n#define ADCLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_ADC, MD, MB, MI, MS, RD)\n#define ADCLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_ADC, RS, MD, MB, MI, MS)\n#define ADCLir(IM, RD)\t\t\t_ALULir(X86_ADC, IM, RD)\n#define ADCLim(IM, MD, MB, MI, MS)\t_ALULim(X86_ADC, IM, MD, MB, MI, MS)\n\n#define ADDBrr(RS, RD)\t\t\t_ALUBrr(X86_ADD, RS, RD)\n#define ADDBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_ADD, MD, MB, MI, MS, RD)\n#define ADDBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_ADD, RS, MD, MB, MI, MS)\n#define ADDBir(IM, RD)\t\t\t_ALUBir(X86_ADD, IM, RD)\n#define ADDBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_ADD, IM, MD, MB, MI, MS)\n\n#define ADDWrr(RS, RD)\t\t\t_ALUWrr(X86_ADD, RS, RD)\n#define ADDWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_ADD, MD, MB, MI, MS, RD)\n#define ADDWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_ADD, RS, MD, MB, MI, MS)\n#define ADDWir(IM, RD)\t\t\t_ALUWir(X86_ADD, IM, RD)\n#define ADDWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_ADD, IM, MD, MB, MI, MS)\n\n#define ADDLrr(RS, RD)\t\t\t_ALULrr(X86_ADD, RS, RD)\n#define ADDLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_ADD, MD, MB, MI, MS, RD)\n#define ADDLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_ADD, RS, MD, MB, MI, MS)\n#define ADDLir(IM, RD)\t\t\t_ALULir(X86_ADD, IM, RD)\n#define ADDLim(IM, MD, MB, MI, MS)\t_ALULim(X86_ADD, IM, MD, MB, MI, MS)\n\n#define ANDBrr(RS, RD)\t\t\t_ALUBrr(X86_AND, RS, RD)\n#define ANDBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_AND, MD, MB, MI, MS, RD)\n#define ANDBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_AND, RS, MD, MB, MI, MS)\n#define ANDBir(IM, RD)\t\t\t_ALUBir(X86_AND, IM, RD)\n#define ANDBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_AND, IM, MD, MB, MI, MS)\n\n#define ANDWrr(RS, RD)\t\t\t_ALUWrr(X86_AND, RS, RD)\n#define ANDWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_AND, MD, MB, MI, MS, RD)\n#define ANDWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_AND, RS, MD, MB, MI, MS)\n#define ANDWir(IM, RD)\t\t\t_ALUWir(X86_AND, IM, RD)\n#define ANDWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_AND, IM, MD, MB, MI, MS)\n\n#define ANDLrr(RS, RD)\t\t\t_ALULrr(X86_AND, RS, RD)\n#define ANDLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_AND, MD, MB, MI, MS, RD)\n#define ANDLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_AND, RS, MD, MB, MI, MS)\n#define ANDLir(IM, RD)\t\t\t_ALULir(X86_AND, IM, RD)\n#define ANDLim(IM, MD, MB, MI, MS)\t_ALULim(X86_AND, IM, MD, MB, MI, MS)\n\n#define CMPBrr(RS, RD)\t\t\t_ALUBrr(X86_CMP, RS, RD)\n#define CMPBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_CMP, MD, MB, MI, MS, RD)\n#define CMPBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_CMP, RS, MD, MB, MI, MS)\n#define CMPBir(IM, RD)\t\t\t_ALUBir(X86_CMP, IM, RD)\n#define CMPBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_CMP, IM, MD, MB, MI, MS)\n\n#define CMPWrr(RS, RD)\t\t\t_ALUWrr(X86_CMP, RS, RD)\n#define CMPWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_CMP, MD, MB, MI, MS, RD)\n#define CMPWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_CMP, RS, MD, MB, MI, MS)\n#define CMPWir(IM, RD)\t\t\t_ALUWir(X86_CMP, IM, RD)\n#define CMPWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_CMP, IM, MD, MB, MI, MS)\n\n#define CMPLrr(RS, RD)\t\t\t_ALULrr(X86_CMP, RS, RD)\n#define CMPLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_CMP, MD, MB, MI, MS, RD)\n#define CMPLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_CMP, RS, MD, MB, MI, MS)\n#define CMPLir(IM, RD)\t\t\t_ALULir(X86_CMP, IM, RD)\n#define CMPLim(IM, MD, MB, MI, MS)\t_ALULim(X86_CMP, IM, MD, MB, MI, MS)\n\n#define ORBrr(RS, RD)\t\t\t_ALUBrr(X86_OR, RS, RD)\n#define ORBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_OR, MD, MB, MI, MS, RD)\n#define ORBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_OR, RS, MD, MB, MI, MS)\n#define ORBir(IM, RD)\t\t\t_ALUBir(X86_OR, IM, RD)\n#define ORBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_OR, IM, MD, MB, MI, MS)\n\n#define ORWrr(RS, RD)\t\t\t_ALUWrr(X86_OR, RS, RD)\n#define ORWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_OR, MD, MB, MI, MS, RD)\n#define ORWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_OR, RS, MD, MB, MI, MS)\n#define ORWir(IM, RD)\t\t\t_ALUWir(X86_OR, IM, RD)\n#define ORWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_OR, IM, MD, MB, MI, MS)\n\n#define ORLrr(RS, RD)\t\t\t_ALULrr(X86_OR, RS, RD)\n#define ORLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_OR, MD, MB, MI, MS, RD)\n#define ORLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_OR, RS, MD, MB, MI, MS)\n#define ORLir(IM, RD)\t\t\t_ALULir(X86_OR, IM, RD)\n#define ORLim(IM, MD, MB, MI, MS)\t_ALULim(X86_OR, IM, MD, MB, MI, MS)\n\n#define SBBBrr(RS, RD)\t\t\t_ALUBrr(X86_SBB, RS, RD)\n#define SBBBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_SBB, MD, MB, MI, MS, RD)\n#define SBBBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_SBB, RS, MD, MB, MI, MS)\n#define SBBBir(IM, RD)\t\t\t_ALUBir(X86_SBB, IM, RD)\n#define SBBBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_SBB, IM, MD, MB, MI, MS)\n\n#define SBBWrr(RS, RD)\t\t\t_ALUWrr(X86_SBB, RS, RD)\n#define SBBWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_SBB, MD, MB, MI, MS, RD)\n#define SBBWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_SBB, RS, MD, MB, MI, MS)\n#define SBBWir(IM, RD)\t\t\t_ALUWir(X86_SBB, IM, RD)\n#define SBBWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_SBB, IM, MD, MB, MI, MS)\n\n#define SBBLrr(RS, RD)\t\t\t_ALULrr(X86_SBB, RS, RD)\n#define SBBLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_SBB, MD, MB, MI, MS, RD)\n#define SBBLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_SBB, RS, MD, MB, MI, MS)\n#define SBBLir(IM, RD)\t\t\t_ALULir(X86_SBB, IM, RD)\n#define SBBLim(IM, MD, MB, MI, MS)\t_ALULim(X86_SBB, IM, MD, MB, MI, MS)\n\n#define SUBBrr(RS, RD)\t\t\t_ALUBrr(X86_SUB, RS, RD)\n#define SUBBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_SUB, MD, MB, MI, MS, RD)\n#define SUBBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_SUB, RS, MD, MB, MI, MS)\n#define SUBBir(IM, RD)\t\t\t_ALUBir(X86_SUB, IM, RD)\n#define SUBBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_SUB, IM, MD, MB, MI, MS)\n\n#define SUBWrr(RS, RD)\t\t\t_ALUWrr(X86_SUB, RS, RD)\n#define SUBWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_SUB, MD, MB, MI, MS, RD)\n#define SUBWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_SUB, RS, MD, MB, MI, MS)\n#define SUBWir(IM, RD)\t\t\t_ALUWir(X86_SUB, IM, RD)\n#define SUBWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_SUB, IM, MD, MB, MI, MS)\n\n#define SUBLrr(RS, RD)\t\t\t_ALULrr(X86_SUB, RS, RD)\n#define SUBLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_SUB, MD, MB, MI, MS, RD)\n#define SUBLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_SUB, RS, MD, MB, MI, MS)\n#define SUBLir(IM, RD)\t\t\t_ALULir(X86_SUB, IM, RD)\n#define SUBLim(IM, MD, MB, MI, MS)\t_ALULim(X86_SUB, IM, MD, MB, MI, MS)\n\n#define XORBrr(RS, RD)\t\t\t_ALUBrr(X86_XOR, RS, RD)\n#define XORBmr(MD, MB, MI, MS, RD)\t_ALUBmr(X86_XOR, MD, MB, MI, MS, RD)\n#define XORBrm(RS, MD, MB, MI, MS)\t_ALUBrm(X86_XOR, RS, MD, MB, MI, MS)\n#define XORBir(IM, RD)\t\t\t_ALUBir(X86_XOR, IM, RD)\n#define XORBim(IM, MD, MB, MI, MS)\t_ALUBim(X86_XOR, IM, MD, MB, MI, MS)\n\n#define XORWrr(RS, RD)\t\t\t_ALUWrr(X86_XOR, RS, RD)\n#define XORWmr(MD, MB, MI, MS, RD)\t_ALUWmr(X86_XOR, MD, MB, MI, MS, RD)\n#define XORWrm(RS, MD, MB, MI, MS)\t_ALUWrm(X86_XOR, RS, MD, MB, MI, MS)\n#define XORWir(IM, RD)\t\t\t_ALUWir(X86_XOR, IM, RD)\n#define XORWim(IM, MD, MB, MI, MS)\t_ALUWim(X86_XOR, IM, MD, MB, MI, MS)\n\n#define XORLrr(RS, RD)\t\t\t_ALULrr(X86_XOR, RS, RD)\n#define XORLmr(MD, MB, MI, MS, RD)\t_ALULmr(X86_XOR, MD, MB, MI, MS, RD)\n#define XORLrm(RS, MD, MB, MI, MS)\t_ALULrm(X86_XOR, RS, MD, MB, MI, MS)\n#define XORLir(IM, RD)\t\t\t_ALULir(X86_XOR, IM, RD)\n#define XORLim(IM, MD, MB, MI, MS)\t_ALULim(X86_XOR, IM, MD, MB, MI, MS)\n\n/* --- Shift/Rotate instructions ------------------------------------------- */\n#define _ROTSHIBir(op, im, rd)\t\tx86_ROTSHIBir(_jit, op, im, rd)\n__jit_inline void\nx86_ROTSHIBir(jit_state_t _jit, x86_rotsh_t op, long im, jit_gpr_t rd)\n{\n    _REXBrr(_NOREG, rd);\n    x86_rotsh_c_ir(_jit, op, im, rd);\n}\n\n#define _ROTSHIBim(op,im,md,rb,ri,ms)\tx86_ROTSHIBim(_jit,op,im,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHIBim(jit_state_t _jit, x86_rotsh_t op,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    x86_rotsh_c_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _ROTSHIBrr(op, rs, rd)\t\tx86_ROTSHIBrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ROTSHIBrr(jit_state_t _jit, x86_rotsh_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBrr(rs, rd);\n    x86_rotsh_c_rr(_jit, op, rs, rd);\n}\n\n#define _ROTSHIBrm(op,rs,md,rb,ri,ms)\tx86_ROTSHIBrm(_jit,op,rs,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHIBrm(jit_state_t _jit, x86_rotsh_t op,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(rs, rb, ri);\n    x86_rotsh_c_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _ROTSHIWir(op, im, rd)\t\tx86_ROTSHIWir(_jit, op, im, rd)\n__jit_inline void\nx86_ROTSHIWir(jit_state_t _jit, x86_rotsh_t op, long im, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(_NOREG, rd);\n    x86_rotsh_sil_ir(_jit, op, im, rd);\n}\n\n#define _ROTSHIWim(op,im,md,rb,ri,ms)\tx86_ROTSHIWim(_jit,op,im,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHIWim(jit_state_t _jit, x86_rotsh_t op,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(_NOREG, rb, ri);\n    x86_rotsh_sil_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _ROTSHIWrr(op, rs, rd)\t\tx86_ROTSHIWrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ROTSHIWrr(jit_state_t _jit, x86_rotsh_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_rotsh_sil_rr(_jit, op, rs, rd);\n}\n\n#define _ROTSHIWrm(op,rs,md,rb,ri,ms)\tx86_ROTSHIWrm(_jit,op,rs,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHIWrm(jit_state_t _jit, x86_rotsh_t op,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_rotsh_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _ROTSHILir(op, im, rd)\t\tx86_ROTSHILir(_jit, op, im, rd)\n__jit_inline void\nx86_ROTSHILir(jit_state_t _jit, x86_rotsh_t op, long im, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    x86_rotsh_sil_ir(_jit, op, im, rd);\n}\n\n#define _ROTSHILim(op,im,md,rb,ri,ms)\tx86_ROTSHILim(_jit,op,im,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHILim(jit_state_t _jit, x86_rotsh_t op,\n\t      long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    x86_rotsh_sil_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _ROTSHILrr(op, rs, rd)\t\tx86_ROTSHILrr(_jit, op, rs, rd)\n__jit_inline void\nx86_ROTSHILrr(jit_state_t _jit, x86_rotsh_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_rotsh_sil_rr(_jit, op, rs, rd);\n}\n\n#define _ROTSHILrm(op,rs,md,rb,ri,ms)\tx86_ROTSHILrm(_jit,op,rs,md,rb,ri,ms)\n__jit_inline void\nx86_ROTSHILrm(jit_state_t _jit, x86_rotsh_t op,\n\t      jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_rotsh_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define ROLBir(IM, RD)\t\t\t_ROTSHIBir(X86_ROL, IM, RD)\n#define ROLBim(IM, MD, MB, MI, MS)\t_ROTSHIBim(X86_ROL, IM, MD, MB, MI, MS)\n#define ROLBrr(RS, RD)\t\t\t_ROTSHIBrr(X86_ROL, RS, RD)\n#define ROLBrm(RS, MD, MB, MI, MS)\t_ROTSHIBrm(X86_ROL, RS, MD, MB, MI, MS)\n\n#define ROLWir(IM, RD)\t\t\t_ROTSHIWir(X86_ROL, IM, RD)\n#define ROLWim(IM, MD, MB, MI, MS)\t_ROTSHIWim(X86_ROL, IM, MD, MB, MI, MS)\n#define ROLWrr(RS, RD)\t\t\t_ROTSHIWrr(X86_ROL, RS, RD)\n#define ROLWrm(RS, MD, MB, MI, MS)\t_ROTSHIWrm(X86_ROL, RS, MD, MB, MI, MS)\n\n#define ROLLir(IM, RD)\t\t\t_ROTSHILir(X86_ROL, IM, RD)\n#define ROLLim(IM, MD, MB, MI, MS)\t_ROTSHILim(X86_ROL, IM, MD, MB, MI, MS)\n#define ROLLrr(RS, RD)\t\t\t_ROTSHILrr(X86_ROL, RS, RD)\n#define ROLLrm(RS, MD, MB, MI, MS)\t_ROTSHILrm(X86_ROL, RS, MD, MB, MI, MS)\n\n#define RORBir(IM, RD)\t\t\t_ROTSHIBir(X86_ROR, IM, RD)\n#define RORBim(IM, MD, MB, MI, MS)\t_ROTSHIBim(X86_ROR, IM, MD, MB, MI, MS)\n#define RORBrr(RS, RD)\t\t\t_ROTSHIBrr(X86_ROR, RS, RD)\n#define RORBrm(RS, MD, MB, MI, MS)\t_ROTSHIBrm(X86_ROR, RS, MD, MB, MI, MS)\n\n#define RORWir(IM, RD)\t\t\t_ROTSHIWir(X86_ROR, IM, RD)\n#define RORWim(IM, MD, MB, MI, MS)\t_ROTSHIWim(X86_ROR, IM, MD, MB, MI, MS)\n#define RORWrr(RS, RD)\t\t\t_ROTSHIWrr(X86_ROR, RS, RD)\n#define RORWrm(RS, MD, MB, MI, MS)\t_ROTSHIWrm(X86_ROR, RS, MD, MB, MI, MS)\n\n#define RORLir(IM, RD)\t\t\t_ROTSHILir(X86_ROR, IM, RD)\n#define RORLim(IM, MD, MB, MI, MS)\t_ROTSHILim(X86_ROR, IM, MD, MB, MI, MS)\n#define RORLrr(RS, RD)\t\t\t_ROTSHILrr(X86_ROR, RS, RD)\n#define RORLrm(RS, MD, MB, MI, MS)\t_ROTSHILrm(X86_ROR, RS, MD, MB, MI, MS)\n\n#define RCLBir(IM, RD)\t\t\t_ROTSHIBir(X86_RCL, IM, RD)\n#define RCLBim(IM, MD, MB, MI, MS)\t_ROTSHIBim(X86_RCL, IM, MD, MB, MI, MS)\n#define RCLBrr(RS, RD)\t\t\t_ROTSHIBrr(X86_RCL, RS, RD)\n#define RCLBrm(RS, MD, MB, MI, MS)\t_ROTSHIBrm(X86_RCL, RS, MD, MB, MI, MS)\n\n#define RCLWir(IM, RD)\t\t\t_ROTSHIWir(X86_RCL, IM, RD)\n#define RCLWim(IM, MD, MB, MI, MS)\t_ROTSHIWim(X86_RCL, IM, MD, MB, MI, MS)\n#define RCLWrr(RS, RD)\t\t\t_ROTSHIWrr(X86_RCL, RS, RD)\n#define RCLWrm(RS, MD, MB, MI, MS)\t_ROTSHIWrm(X86_RCL, RS, MD, MB, MI, MS)\n\n#define RCLLir(IM, RD)\t\t\t_ROTSHILir(X86_RCL, IM, RD)\n#define RCLLim(IM, MD, MB, MI, MS)\t_ROTSHILim(X86_RCL, IM, MD, MB, MI, MS)\n#define RCLLrr(RS, RD)\t\t\t_ROTSHILrr(X86_RCL, RS, RD)\n#define RCLLrm(RS, MD, MB, MI, MS)\t_ROTSHILrm(X86_RCL, RS, MD, MB, MI, MS)\n\n#define RCRBir(IM, RD)\t\t\t_ROTSHIBir(X86_RCR, IM, RD)\n#define RCRBim(IM, MD, MB, MI, MS)\t_ROTSHIBim(X86_RCR, IM, MD, MB, MI, MS)\n#define RCRBrr(RS, RD)\t\t\t_ROTSHIBrr(X86_RCR, RS, RD)\n#define RCRBrm(RS, MD, MB, MI, MS)\t_ROTSHIBrm(X86_RCR, RS, MD, MB, MI, MS)\n\n#define RCRWir(IM, RD)\t\t\t_ROTSHIWir(X86_RCR, IM, RD)\n#define RCRWim(IM, MD, MB, MI, MS)\t_ROTSHIWim(X86_RCR, IM, MD, MB, MI, MS)\n#define RCRWrr(RS, RD)\t\t\t_ROTSHIWrr(X86_RCR, RS, RD)\n#define RCRWrm(RS, MD, MB, MI, MS)\t_ROTSHIWrm(X86_RCR, RS, MD, MB, MI, MS)\n\n#define RCRLir(IM, RD)\t\t\t_ROTSHILir(X86_RCR, IM, RD)\n#define RCRLim(IM, MD, MB, MI, MS)\t_ROTSHILim(X86_RCR, IM, MD, MB, MI, MS)\n#define RCRLrr(RS, RD)\t\t\t_ROTSHILrr(X86_RCR, RS, RD)\n#define RCRLrm(RS, MD, MB, MI, MS)\t_ROTSHILrm(X86_RCR, RS, MD, MB, MI, MS)\n\n#define SHLBir(IM, RD)\t\t\t_ROTSHIBir(X86_SHL, IM, RD)\n#define SHLBim(IM, MD, MB, MI, MS)\t_ROTSHIBim(X86_SHL, IM, MD, MB, MI, MS)\n#define SHLBrr(RS, RD)\t\t\t_ROTSHIBrr(X86_SHL, RS, RD)\n#define SHLBrm(RS, MD, MB, MI, MS)\t_ROTSHIBrm(X86_SHL, RS, MD, MB, MI, MS)\n\n#define SHLWir(IM, RD)\t\t\t_ROTSHIWir(X86_SHL, IM, RD)\n#define SHLWim(IM, MD, MB, MI, MS)\t_ROTSHIWim(X86_SHL, IM, MD, MB, MI, MS)\n#define SHLWrr(RS, RD)\t\t\t_ROTSHIWrr(X86_SHL, RS, RD)\n#define SHLWrm(RS, MD, MB, MI, MS)\t_ROTSHIWrm(X86_SHL, RS, MD, MB, MI, MS)\n\n#define SHLLir(IM, RD)\t\t\t_ROTSHILir(X86_SHL, IM, RD)\n#define SHLLim(IM, MD, MB, MI, MS)\t_ROTSHILim(X86_SHL, IM, MD, MB, MI, MS)\n#define SHLLrr(RS, RD)\t\t\t_ROTSHILrr(X86_SHL, RS, RD)\n#define SHLLrm(RS, MD, MB, MI, MS)\t_ROTSHILrm(X86_SHL, RS, MD, MB, MI, MS)\n\n#define SHRBir(IM, RD)\t\t\t_ROTSHIBir(X86_SHR, IM, RD)\n#define SHRBim(IM, MD, MB, MI, MS)\t_ROTSHIBim(X86_SHR, IM, MD, MB, MI, MS)\n#define SHRBrr(RS, RD)\t\t\t_ROTSHIBrr(X86_SHR, RS, RD)\n#define SHRBrm(RS, MD, MB, MI, MS)\t_ROTSHIBrm(X86_SHR, RS, MD, MB, MI, MS)\n\n#define SHRWir(IM, RD)\t\t\t_ROTSHIWir(X86_SHR, IM, RD)\n#define SHRWim(IM, MD, MB, MI, MS)\t_ROTSHIWim(X86_SHR, IM, MD, MB, MI, MS)\n#define SHRWrr(RS, RD)\t\t\t_ROTSHIWrr(X86_SHR, RS, RD)\n#define SHRWrm(RS, MD, MB, MI, MS)\t_ROTSHIWrm(X86_SHR, RS, MD, MB, MI, MS)\n\n#define SHRLir(IM, RD)\t\t\t_ROTSHILir(X86_SHR, IM, RD)\n#define SHRLim(IM, MD, MB, MI, MS)\t_ROTSHILim(X86_SHR, IM, MD, MB, MI, MS)\n#define SHRLrr(RS, RD)\t\t\t_ROTSHILrr(X86_SHR, RS, RD)\n#define SHRLrm(RS, MD, MB, MI, MS)\t_ROTSHILrm(X86_SHR, RS, MD, MB, MI, MS)\n\n#define SALBir\t\t\t\tSHLBir\n#define SALBim\t\t\t\tSHLBim\n#define SALBrr\t\t\t\tSHLBrr\n#define SALBrm\t\t\t\tSHLBrm\n\n#define SALWir\t\t\t\tSHLWir\n#define SALWim\t\t\t\tSHLWim\n#define SALWrr\t\t\t\tSHLWrr\n#define SALWrm\t\t\t\tSHLWrm\n\n#define SALLir\t\t\t\tSHLLir\n#define SALLim\t\t\t\tSHLLim\n#define SALLrr\t\t\t\tSHLLrr\n#define SALLrm\t\t\t\tSHLLrm\n\n#define SARBir(IM, RD)\t\t\t_ROTSHIBir(X86_SAR, IM, RD)\n#define SARBim(IM, MD, MB, MI, MS)\t_ROTSHIBim(X86_SAR, IM, MD, MB, MI, MS)\n#define SARBrr(RS, RD)\t\t\t_ROTSHIBrr(X86_SAR, RS, RD)\n#define SARBrm(RS, MD, MB, MI, MS)\t_ROTSHIBrm(X86_SAR, RS, MD, MB, MI, MS)\n\n#define SARWir(IM, RD)\t\t\t_ROTSHIWir(X86_SAR, IM, RD)\n#define SARWim(IM, MD, MB, MI, MS)\t_ROTSHIWim(X86_SAR, IM, MD, MB, MI, MS)\n#define SARWrr(RS, RD)\t\t\t_ROTSHIWrr(X86_SAR, RS, RD)\n#define SARWrm(RS, MD, MB, MI, MS)\t_ROTSHIWrm(X86_SAR, RS, MD, MB, MI, MS)\n\n#define SARLir(IM, RD)\t\t\t_ROTSHILir(X86_SAR, IM, RD)\n#define SARLim(IM, MD, MB, MI, MS)\t_ROTSHILim(X86_SAR, IM, MD, MB, MI, MS)\n#define SARLrr(RS, RD)\t\t\t_ROTSHILrr(X86_SAR, RS, RD)\n#define SARLrm(RS, MD, MB, MI, MS)\t_ROTSHILrm(X86_SAR, RS, MD, MB, MI, MS)\n\n/* --- Bit test instructions ----------------------------------------------- */\n#define _BTWir(op, im, rd)\t\tx86_BTWir(_jit, op, im, rd)\n__jit_inline void\nx86_BTWir(jit_state_t _jit, x86_bt_t op, long im, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(_NOREG, rd);\n    x86_bt_sil_ir(_jit, op, im, rd);\n}\n\n#define _BTWim(op, im, md, rb, ri, ms)\tx86_BTWim(_jit, op, im, md, rb, ri, ms)\n__jit_inline void\nx86_BTWim(jit_state_t _jit, x86_bt_t op,\n\t  long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(_NOREG, rb, ri);\n    x86_bt_sil_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _BTWrr(op, rs, rd)\t\tx86_BTWrr(_jit, op, rs, rd)\n__jit_inline void\nx86_BTWrr(jit_state_t _jit, x86_bt_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_bt_sil_rr(_jit, op, rs, rd);\n}\n\n#define _BTWrm(op, rs, md, rb, ri, ms)\tx86_BTWrm(_jit, op, rs, md, rb, ri, ms)\n__jit_inline void\nx86_BTWrm(jit_state_t _jit, x86_bt_t op,\n\t  jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_bt_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _BTLir(op, im, rd)\t\tx86_BTLir(_jit, op, im, rd)\n__jit_inline void\nx86_BTLir(jit_state_t _jit, x86_bt_t op, long im, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    x86_bt_sil_ir(_jit, op, im, rd);\n}\n\n#define _BTLim(op, im, md, rb, ri, ms)\tx86_BTLim(_jit, op, im, md, rb, ri, ms)\n__jit_inline void\nx86_BTLim(jit_state_t _jit, x86_bt_t op,\n\t  long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    x86_bt_sil_im(_jit, op, im, md, rb, ri, ms);\n}\n\n#define _BTLrr(op, rs, rd)\t\tx86_BTLrr(_jit, op, rs, rd)\n__jit_inline void\nx86_BTLrr(jit_state_t _jit, x86_bt_t op, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_bt_sil_rr(_jit, op, rs, rd);\n}\n\n#define _BTLrm(op, rs, md, rb, ri, ms)\tx86_BTLrm(_jit, op, rs, md, rb, ri, ms)\n__jit_inline void\nx86_BTLrm(jit_state_t _jit, x86_bt_t op,\n\t  jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_bt_sil_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define BTWir(IM, RD)\t\t\t_BTWir(X86_BT, IM, RD)\n#define BTWim(IM, MD, MB, MI, MS)\t_BTWim(X86_BT, IM, MD, MI, MS)\n#define BTWrr(RS, RD)\t\t\t_BTWrr(X86_BT, RS, RD)\n#define BTWrm(RS, MD, MB, MI, MS)\t_BTWrm(X86_BT, RS, MD, MB, MI, MS)\n\n#define BTLir(IM, RD)\t\t\t_BTLir(X86_BT, IM, RD)\n#define BTLim(IM, MD, MB, MI, MS)\t_BTLim(X86_BT, IM, MD, MB, MI, MS)\n#define BTLrr(RS, RD)\t\t\t_BTLrr(X86_BT, RS, RD)\n#define BTLrm(RS, MD, MB, MI, MS)\t_BTLrm(X86_BT, RS, MD, MB, MI, MS)\n\n#define BTCWir(IM, RD)\t\t\t_BTWir(X86_BTC, IM, RD)\n#define BTCWim(IM, MD, MB, MI, MS)\t_BTWim(X86_BTC, IM, MD, MI, MS)\n#define BTCWrr(RS, RD)\t\t\t_BTWrr(X86_BTC, RS, RD)\n#define BTCWrm(RS, MD, MB, MI, MS)\t_BTWrm(X86_BTC, RS, MD, MB, MI, MS)\n\n#define BTCLir(IM, RD)\t\t\t_BTLir(X86_BTC, IM, RD)\n#define BTCLim(IM, MD, MB, MI, MS)\t_BTLim(X86_BTC, IM, MD, MB, MI, MS)\n#define BTCLrr(RS, RD)\t\t\t_BTLrr(X86_BTC, RS, RD)\n#define BTCLrm(RS, MD, MB, MI, MS)\t_BTLrm(X86_BTC, RS, MD, MB, MI, MS)\n\n#define BTRWir(IM, RD)\t\t\t_BTWir(X86_BTR, IM, RD)\n#define BTRWim(IM, MD, MB, MI, MS)\t_BTWim(X86_BTR, IM, MD, MI, MS)\n#define BTRWrr(RS, RD)\t\t\t_BTWrr(X86_BTR, RS, RD)\n#define BTRWrm(RS, MD, MB, MI, MS)\t_BTWrm(X86_BTR, RS, MD, MB, MI, MS)\n\n#define BTRLir(IM, RD)\t\t\t_BTLir(X86_BTR, IM, RD)\n#define BTRLim(IM, MD, MB, MI, MS)\t_BTLim(X86_BTR, IM, MD, MB, MI, MS)\n#define BTRLrr(RS, RD)\t\t\t_BTLrr(X86_BTR, RS, RD)\n#define BTRLrm(RS, MD, MB, MI, MS)\t_BTLrm(X86_BTR, RS, MD, MB, MI, MS)\n\n#define BTSWir(IM, RD)\t\t\t_BTWir(X86_BTS, IM, RD)\n#define BTSWim(IM, MD, MB, MI, MS)\t_BTWim(X86_BTS, IM, MD, MI, MS)\n#define BTSWrr(RS, RD)\t\t\t_BTWrr(X86_BTS, RS, RD)\n#define BTSWrm(RS, MD, MB, MI, MS)\t_BTWrm(X86_BTS, RS, MD, MB, MI, MS)\n\n#define BTSLir(IM, RD)\t\t\t_BTLir(X86_BTS, IM, RD)\n#define BTSLim(IM, MD, MB, MI, MS)\t_BTLim(X86_BTS, IM, MD, MB, MI, MS)\n#define BTSLrr(RS, RD)\t\t\t_BTLrr(X86_BTS, RS, RD)\n#define BTSLrm(RS, MD, MB, MI, MS)\t_BTLrm(X86_BTS, RS, MD, MB, MI, MS)\n\n/* --- Move instructions --------------------------------------------------- */\n#define MOVBrr(rs, rd)\t\t\tx86_MOVBrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVBrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBrr(rs, rd);\n    x86_mov_c_rr(_jit, rs, rd);\n}\n\n#define MOVBmr(md, rb, ri, ms, rd)\tx86_MOVBmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVBmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXBmr(rb, ri, rd);\n    x86_mov_c_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVBrm(rs, md, rb, ri, ms)\tx86_MOVBrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_MOVBrm(jit_state_t _jit,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(rs, rb, ri);\n    x86_mov_c_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define MOVBir(im, rd)\t\t\tx86_MOVBir(_jit, im, rd)\n__jit_inline void\nx86_MOVBir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _REXBrr(_NOREG, rd);\n    x86_mov_c_ir(_jit, im, rd);\n}\n\n#define MOVBim(im, md, rb, ri, ms)\tx86_MOVBim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_MOVBim(jit_state_t _jit,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    x86_mov_c_im(_jit, im, md, rb, ri, ms);\n}\n\n#define MOVWrr(rs, rd)\t\t\tx86_MOVWrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_mov_sil_rr(_jit, rs, rd);\n}\n\n#define MOVWmr(md, rb, ri, ms, rd)\tx86_MOVWmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVWmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_mov_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVWrm(rs, md, rb, ri, ms)\tx86_MOVWrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_MOVWrm(jit_state_t _jit,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_mov_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define MOVWir(im, rd)\t\t\tx86_MOVWir(_jit, im, rd)\n__jit_inline void\nx86_MOVWir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(_NOREG, rd);\n    _Or(0xb8, _r2(rd));\n    _jit_W(_s16(im));\n}\n\n#define MOVWim(im, md, rb, ri, ms)\tx86_MOVWim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_MOVWim(jit_state_t _jit,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(_NOREG, rb, ri);\n    _O(0xc7);\n    _i_X(_b000, md, rb, ri, ms);\n    _jit_W(_s16(im));\n}\n\n#define MOVLrr(rs, rd)\t\t\tx86_MOVLrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_mov_sil_rr(_jit, rs, rd);\n}\n\n#define MOVLmr(md, rb, ri, ms, rd)\tx86_MOVLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVLmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_mov_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVLrm(rs, md, rb, ri, ms)\tx86_MOVLrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_MOVLrm(jit_state_t _jit,\n\t   jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_mov_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define MOVLir(im, rd)\t\t\tx86_MOVLir(_jit, im, rd)\n__jit_inline void\nx86_MOVLir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    _Or(0xb8, _r4(rd));\n    _jit_I(_u32(im));\n}\n\n#define MOVLim(im, md, rb, ri, ms)\tx86_MOVLim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_MOVLim(jit_state_t _jit,\n\t   long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    _O(0xc7);\n    _i_X(0, md, rb, ri, ms);\n    _jit_I(_s32(im));\n}\n\n/* --- Unary and Multiply/Divide instructions ------------------------------ */\n#define _UNARYBr(op, rs)\t\tx86_UNARYBr(_jit, op, rs)\n__jit_inline void\nx86_UNARYBr(jit_state_t _jit, x86_unary_t op, jit_gpr_t rs)\n{\n    _REXBrr(_NOREG, rs);\n    x86_unary_c_r(_jit, op, rs);\n}\n\n#define _UNARYBm(op, md, rb, ri, ms)\tx86_UNARYBm(_jit, op, md, rb, ri, ms)\n__jit_inline void\nx86_UNARYBm(jit_state_t _jit, x86_unary_t op,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    x86_unary_c_m(_jit, op, md, rb, ri, ms);\n}\n\n#define _UNARYWr(op, rs)\t\tx86_UNARYWr(_jit, op, rs)\n__jit_inline void\nx86_UNARYWr(jit_state_t _jit, x86_unary_t op, jit_gpr_t rs)\n{\n    _d16();\n    _REXLrr(_NOREG, rs);\n    x86_unary_sil_r(_jit, op, rs);\n}\n\n#define _UNARYWm(op, md, rb, ri, ms)\tx86_UNARYQm(_jit, op, md, rb, ri, ms)\n__jit_inline void\nx86_UNARYWm(jit_state_t _jit, x86_unary_t op,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLmr(rb, ri, _NOREG);\n    x86_unary_sil_m(_jit, op, md, rb, ri, ms);\n}\n\n#define _UNARYLr(op, rs)\t\tx86_UNARYLr(_jit, op, rs)\n__jit_inline void\nx86_UNARYLr(jit_state_t _jit, x86_unary_t op, jit_gpr_t rs)\n{\n    _REXLrr(_NOREG, rs);\n    x86_unary_sil_r(_jit, op, rs);\n}\n\n#define _UNARYLm(op, md, rb, ri, ms)\tx86_UNARYLm(_jit, op, md, rb, ri, ms)\n__jit_inline void\nx86_UNARYLm(jit_state_t _jit, x86_unary_t op,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLmr(rb, ri, _NOREG);\n    x86_unary_sil_m(_jit, op, md, rb, ri, ms);\n}\n\n#define NOTBr(RS)\t\t\t_UNARYBr(X86_NOT, RS)\n#define NOTBm(MD, MB, MI, MS)\t\t_UNARYBm(X86_NOT, MD, MB, MI, MS)\n#define NOTWr(RS)\t\t\t_UNARYWr(X86_NOT, RS)\n#define NOTWm(MD, MB, MI, MS)\t\t_UNARYWm(X86_NOT, MD, MB, MI, MS)\n#define NOTLr(RS)\t\t\t_UNARYLr(X86_NOT, RS)\n#define NOTLm(MD, MB, MI, MS)\t\t_UNARYLm(X86_NOT, MD, MB, MI, MS)\n\n#define NEGBr(RS)\t\t\t_UNARYBr(X86_NEG, RS)\n#define NEGBm(MD, MB, MI, MS)\t\t_UNARYBm(X86_NEG, MD, MB, MI, MS)\n#define NEGWr(RS)\t\t\t_UNARYWr(X86_NEG, RS)\n#define NEGWm(MD, MB, MI, MS)\t\t_UNARYWm(X86_NEG, MD, MB, MI, MS)\n#define NEGLr(RS)\t\t\t_UNARYLr(X86_NEG, RS)\n#define NEGLm(MD, MB, MI, MS)\t\t_UNARYLm(X86_NEG, MD, MB, MI, MS)\n\n#define MULBr(RS)\t\t\t_UNARYBr(X86_MUL, RS)\n#define MULBm(MD, MB, MI, MS)\t\t_UNARYBm(X86_MUL, MD, MB, MI, MS)\n#define MULWr(RS)\t\t\t_UNARYWr(X86_MUL, RS)\n#define MULWm(MD, MB, MI, MS)\t\t_UNARYWm(X86_MUL, MD, MB, MI, MS)\n#define MULLr(RS)\t\t\t_UNARYLr(X86_MUL, RS)\n#define MULLm(MD, MB, MI, MS)\t\t_UNARYLm(X86_MUL, MD, MB, MI, MS)\n\n#define IMULBr(RS)\t\t\t_UNARYBr(X86_IMUL, RS)\n#define IMULBm(MD, MB, MI, MS)\t\t_UNARYBm(X86_IMUL, MD, MB, MI, MS)\n#define IMULWr(RS)\t\t\t_UNARYWr(X86_IMUL, RS)\n#define IMULWm(MD, MB, MI, MS)\t\t_UNARYWm(X86_IMUL, MD, MB, MI, MS)\n#define IMULLr(RS)\t\t\t_UNARYLr(X86_IMUL, RS)\n#define IMULLm(MD, MB, MI, MS)\t\t_UNARYLm(X86_IMUL, MD, MB, MI, MS)\n\n#define DIVBr(RS)\t\t\t_UNARYBr(X86_DIV, RS)\n#define DIVBm(MD, MB, MI, MS)\t\t_UNARYBm(X86_DIV, MD, MB, MI, MS)\n#define DIVWr(RS)\t\t\t_UNARYWr(X86_DIV, RS)\n#define DIVWm(MD, MB, MI, MS)\t\t_UNARYWm(X86_DIV, MD, MB, MI, MS)\n#define DIVLr(RS)\t\t\t_UNARYLr(X86_DIV, RS)\n#define DIVLm(MD, MB, MI, MS)\t\t_UNARYLm(X86_DIV, MD, MB, MI, MS)\n\n#define IDIVBr(RS)\t\t\t_UNARYBr(X86_IDIV, RS)\n#define IDIVBm(MD, MB, MI, MS)\t\t_UNARYBm(X86_IDIV, MD, MB, MI, MS)\n#define IDIVWr(RS)\t\t\t_UNARYWr(X86_IDIV, RS)\n#define IDIVWm(MD, MB, MI, MS)\t\t_UNARYWm(X86_IDIV, MD, MB, MI, MS)\n#define IDIVLr(RS)\t\t\t_UNARYLr(X86_IDIV, RS)\n#define IDIVLm(MD, MB, MI, MS)\t\t_UNARYLm(X86_IDIV, MD, MB, MI, MS)\n\n#define IMULWrr(rs, rd)\t\t\tx86_IMULWrr(_jit, rs, rd)\n__jit_inline void\nx86_IMULWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rd, rs);\n    x86_imul_sil_rr(_jit, rs, rd);\n}\n\n#define IMULWmr(md, rb, ri, ms, rd)\tx86_IMULWmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_IMULWmr(jit_state_t _jit,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_imul_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define IMULwir(im, rd)\t\t\tx86_IMULWirr(_jit, im, rd)\n#define IMULWirr(im, rs, rd)\t\tx86_IMULWirr(_jit, im, rs, rd)\n__jit_inline void\nx86_IMULWirr(jit_state_t _jit, long im, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rd, rs);\n    x86_imul_il_irr(_jit, im, rs, rd);\n}\n\n#define IMULLrr(rs, rd)\t\t\tx86_IMULLrr(_jit, rs, rd)\n__jit_inline void\nx86_IMULLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rd, rs);\n    x86_imul_sil_rr(_jit, rs, rd);\n}\n\n#define IMULLmr(md, rb, ri, ms, rd)\tx86_IMULLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_IMULLmr(jit_state_t _jit,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_imul_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define IMULLir(im, rd)\t\t\tx86_IMULLirr(_jit, im, rd)\n#define IMULLirr(im, rs, rd)\t\tx86_IMULLirr(_jit, im, rs, rd)\n__jit_inline void\nx86_IMULLirr(jit_state_t _jit, long im, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rd, rs);\n    x86_imul_il_irr(_jit, im, rs, rd);\n}\n\n/* --- Control Flow related instructions ----------------------------------- */\n/* 32 bit displacement from %rip */\n#define CALLm(im)\t\t\tx86_CALLm(_jit, im)\n__jit_inline void\nx86_CALLm(jit_state_t _jit, void *im)\n{\n    _O(0xe8);\n    _D32(im);\n}\n\n/* call absolute value */\n#define CALLLsr(rs)\t\t\tx86_CALLLsr(_jit, rs)\n__jit_inline void\nx86_CALLLsr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _REXLrr(_NOREG, rs);\n    x86_call_il_sr(_jit, rs);\n}\n\n#define CALLsm(rs, rb, ri, ms)\t\tx86_CALLsm(_jit, rs, rb, ri, ms)\n__jit_inline void\nx86_CALLsm(jit_state_t _jit,\n\t   jit_gpr_t rs, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    _O(0xff);\n    _i_X(_b010, rs, rb, ri, ms);\n}\n\n#define JMPSm(im)\t\t\tx86_JMPSm(_jit, im)\n__jit_inline void\nx86_JMPSm(jit_state_t _jit, void *im)\n{\n    _O(0xeb);\n    _D8(im);\n}\n\n#define JMPm(im)\t\t\tx86_JMPm(_jit, im)\n__jit_inline void\nx86_JMPm(jit_state_t _jit, void *im)\n{\n    _O(0xe9);\n    _D32(im);\n}\n\n#define JMPLsr(rs)\t\t\tx86_JMPLsr(_jit, rs)\n__jit_inline void\nx86_JMPLsr(jit_state_t _jit, jit_gpr_t rs)\n{\n    _REXLrr(_NOREG, rs);\n    x86_jmp_il_sr(_jit, rs);\n}\n\n#define JMPsm(rs, rb, ri, ms)\t\tx86_JMPsm(_jit, rs, rb, ri, ms)\n__jit_inline void\nx86_JMPsm(jit_state_t _jit,\n\t  jit_gpr_t rs, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    _O(0xff);\n    _i_X(_b100, rs, rb, ri, ms);\n}\n\n#define JCCSim(cc, im)\t\t\tx86_JCCSim(_jit, cc, im)\n__jit_inline void\nx86_JCCSim(jit_state_t _jit, x86_cc_t cc, void *im)\n{\n    _O(0x70 | (int)cc);\n    _D8(im);\n}\n\n#define JOSm(D)\t\t\t\tJCCSim(X86_CC_O,   D)\n#define JNOSm(D)\t\t\tJCCSim(X86_CC_NO,  D)\n#define JNAESm(D)\t\t\tJCCSim(X86_CC_NAE, D)\n#define JBSm(D)\t\t\t\tJCCSim(X86_CC_B,   D)\n#define JCSm(D)\t\t\t\tJCCSim(X86_CC_C,   D)\n#define JAESm(D)\t\t\tJCCSim(X86_CC_AE,  D)\n#define JNBSm(D)\t\t\tJCCSim(X86_CC_NB,  D)\n#define JNCSm(D)\t\t\tJCCSim(X86_CC_NC,  D)\n#define JESm(D)\t\t\t\tJCCSim(X86_CC_E,   D)\n#define JZSm(D)\t\t\t\tJCCSim(X86_CC_Z,   D)\n#define JNESm(D)\t\t\tJCCSim(X86_CC_NE,  D)\n#define JNZSm(D)\t\t\tJCCSim(X86_CC_NZ,  D)\n#define JBESm(D)\t\t\tJCCSim(X86_CC_BE,  D)\n#define JNASm(D)\t\t\tJCCSim(X86_CC_NA,  D)\n#define JASm(D)\t\t\t\tJCCSim(X86_CC_A,   D)\n#define JNBESm(D)\t\t\tJCCSim(X86_CC_NBE, D)\n#define JSSm(D)\t\t\t\tJCCSim(X86_CC_S,   D)\n#define JNSSm(D)\t\t\tJCCSim(X86_CC_NS,  D)\n#define JPSm(D)\t\t\t\tJCCSim(X86_CC_P,   D)\n#define JPESm(D)\t\t\tJCCSim(X86_CC_PE,  D)\n#define JNPSm(D)\t\t\tJCCSim(X86_CC_NP,  D)\n#define JPOSm(D)\t\t\tJCCSim(X86_CC_PO,  D)\n#define JLSm(D)\t\t\t\tJCCSim(X86_CC_L,   D)\n#define JNGESm(D)\t\t\tJCCSim(X86_CC_NGE, D)\n#define JNLSm(D)\t\t\tJCCSim(X86_CC_GE,  D)\n#define JGESm(D)\t\t\tJCCSim(X86_CC_NL,  D)\n#define JLESm(D)\t\t\tJCCSim(X86_CC_LE,  D)\n#define JNGSm(D)\t\t\tJCCSim(X86_CC_NG,  D)\n#define JGSm(D)\t\t\t\tJCCSim(X86_CC_G,   D)\n#define JNLESm(D)\t\t\tJCCSim(X86_CC_NLE, D)\n\n#define JCCim(cc, im)\t\t\tx86_JCCim(_jit, cc, im)\n__jit_inline void\nx86_JCCim(jit_state_t _jit, x86_cc_t cc, void *im)\n{\n    _O(0x0f);\n    _O(0x80 | (int)cc);\n    _D32(im);\n}\n\n#define JOm(D)\t\t\t\tJCCim(X86_CC_O,   D)\n#define JNOm(D)\t\t\t\tJCCim(X86_CC_NO,  D)\n#define JNAEm(D)\t\t\tJCCim(X86_CC_NAE, D)\n#define JBm(D)\t\t\t\tJCCim(X86_CC_B,   D)\n#define JCm(D)\t\t\t\tJCCim(X86_CC_C,   D)\n#define JAEm(D)\t\t\t\tJCCim(X86_CC_AE,  D)\n#define JNBm(D)\t\t\t\tJCCim(X86_CC_NB,  D)\n#define JNCm(D)\t\t\t\tJCCim(X86_CC_NC,  D)\n#define JEm(D)\t\t\t\tJCCim(X86_CC_E,   D)\n#define JZm(D)\t\t\t\tJCCim(X86_CC_Z,   D)\n#define JNEm(D)\t\t\t\tJCCim(X86_CC_NE,  D)\n#define JNZm(D)\t\t\t\tJCCim(X86_CC_NZ,  D)\n#define JBEm(D)\t\t\t\tJCCim(X86_CC_BE,  D)\n#define JNAm(D)\t\t\t\tJCCim(X86_CC_NA,  D)\n#define JAm(D)\t\t\t\tJCCim(X86_CC_A,   D)\n#define JNBEm(D)\t\t\tJCCim(X86_CC_NBE, D)\n#define JSm(D)\t\t\t\tJCCim(X86_CC_S,   D)\n#define JNSm(D)\t\t\t\tJCCim(X86_CC_NS,  D)\n#define JPm(D)\t\t\t\tJCCim(X86_CC_P,   D)\n#define JPEm(D)\t\t\t\tJCCim(X86_CC_PE,  D)\n#define JNPm(D)\t\t\t\tJCCim(X86_CC_NP,  D)\n#define JPOm(D)\t\t\t\tJCCim(X86_CC_PO,  D)\n#define JLm(D)\t\t\t\tJCCim(X86_CC_L,   D)\n#define JNGEm(D)\t\t\tJCCim(X86_CC_NGE, D)\n#define JGEm(D)\t\t\t\tJCCim(X86_CC_GE,  D)\n#define JNLm(D)\t\t\t\tJCCim(X86_CC_NL,  D)\n#define JLEm(D)\t\t\t\tJCCim(X86_CC_LE,  D)\n#define JNGm(D)\t\t\t\tJCCim(X86_CC_NG,  D)\n#define JGm(D)\t\t\t\tJCCim(X86_CC_G,   D)\n#define JNLEm(D)\t\t\tJCCim(X86_CC_NLE, D)\n\n#define SETCCir(cc, rd)\t\t\tx86_SETCCir(_jit, cc, rd)\n__jit_inline void\nx86_SETCCir(jit_state_t _jit, x86_cc_t cc, jit_gpr_t rd)\n{\n    _REXBrr(_NOREG, rd);\n    _O(0x0f);\n    _O(0x90 | (int)cc);\n    _Mrm(_b11, _b000, _r1(rd));\n}\n\n#define SETOr(RD)\t\t\tSETCCir(X86_CC_O,   RD)\n#define SETNOr(RD)\t\t\tSETCCir(X86_CC_NO,  RD)\n#define SETBr(RD)\t\t\tSETCCir(X86_CC_B,   RD)\n#define SETCr(RD)\t\t\tSETCCir(X86_CC_C,   RD)\n#define SETNAEr(RD)\t\t\tSETCCir(X86_CC_NAE, RD)\n#define SETNBr(RD)\t\t\tSETCCir(X86_CC_NB,  RD)\n#define SETAEr(RD)\t\t\tSETCCir(X86_CC_AE,  RD)\n#define SETEr(RD)\t\t\tSETCCir(X86_CC_E,   RD)\n#define SETZr(RD)\t\t\tSETCCir(X86_CC_Z,   RD)\n#define SETNEr(RD)\t\t\tSETCCir(X86_CC_NE,  RD)\n#define SETNZr(RD)\t\t\tSETCCir(X86_CC_NZ,  RD)\n#define SETBEr(RD)\t\t\tSETCCir(X86_CC_BE,  RD)\n#define SETNAr(RD)\t\t\tSETCCir(X86_CC_NA,  RD)\n#define SETNBEr(RD)\t\t\tSETCCir(X86_CC_NBE, RD)\n#define SETAr(RD)\t\t\tSETCCir(X86_CC_A,   RD)\n#define SETSr(RD)\t\t\tSETCCir(X86_CC_S,   RD)\n#define SETNSr(RD)\t\t\tSETCCir(X86_CC_NS,  RD)\n#define SETPr(RD)\t\t\tSETCCir(X86_CC_P,   RD)\n#define SETPEr(RD)\t\t\tSETCCir(X86_CC_PE,  RD)\n#define SETNPr(RD)\t\t\tSETCCir(X86_CC_NP,  RD)\n#define SETPOr(RD)\t\t\tSETCCir(X86_CC_NO,  RD)\n#define SETLr(RD)\t\t\tSETCCir(X86_CC_L,   RD)\n#define SETNGEr(RD)\t\t\tSETCCir(X86_CC_NGE, RD)\n#define SETGEr(RD)\t\t\tSETCCir(X86_CC_GE,  RD)\n#define SETNLr(RD)\t\t\tSETCCir(X86_CC_NL,  RD)\n#define SETLEr(RD)\t\t\tSETCCir(X86_CC_LE,  RD)\n#define SETNGr(RD)\t\t\tSETCCir(X86_CC_NG,  RD)\n#define SETGr(RD)\t\t\tSETCCir(X86_CC_G,   RD)\n#define SETNLEr(RD)\t\t\tSETCCir(X86_CC_NLE, RD)\n\n#define SETCCim(rs, cc, md, rb, ri, ms)\tx86_SETCCim(_jit, cc, md, rb, ri, ms)\n__jit_inline void\nx86_SETCCim(jit_state_t _jit, x86_cc_t cc,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    _O(0x0f);\n    _O(0x90 | (int)cc);\n    _i_X(_b000, md, rb, ri, ms);\n}\n\n#define SETOm(D, B, I, S)\t\tSETCCim(X86_CC_O,   D, B, I, S)\n#define SETNOm(D, B, I, S)\t\tSETCCim(X86_CC_NO,  D, B, I, S)\n#define SETNAEm(D, B, I, S)\t\tSETCCim(X86_CC_NAE, D, B, I, S)\n#define SETBm(D, B, I, S)\t\tSETCCim(X86_CC_B,   D, B, I, S)\n#define SETCm(D, B, I, S)\t\tSETCCim(X86_CC_C,   D, B, I, S)\n#define SETAEm(D, B, I, S)\t\tSETCCim(X86_CC_AE,  D, B, I, S)\n#define SETNBm(D, B, I, S)\t\tSETCCim(X86_CC_NB,  D, B, I, S)\n#define SETEm(D, B, I, S)\t\tSETCCim(X86_CC_E,   D, B, I, S)\n#define SETZm(D, B, I, S)\t\tSETCCim(X86_CC_Z,   D, B, I, S)\n#define SETNEm(D, B, I, S)\t\tSETCCim(X86_CC_NE,  D, B, I, S)\n#define SETNZm(D, B, I, S)\t\tSETCCim(X86_CC_NZ,  D, B, I, S)\n#define SETBEm(D, B, I, S)\t\tSETCCim(X86_CC_BE,  D, B, I, S)\n#define SETNAm(D, B, I, S)\t\tSETCCim(X86_CC_NA,  D, B, I, S)\n#define SETAm(D, B, I, S)\t\tSETCCim(X86_CC_A,   D, B, I, S)\n#define SETNBEm(D, B, I, S)\t\tSETCCim(X86_CC_NBE, D, B, I, S)\n#define SETSm(D, B, I, S)\t\tSETCCim(X86_CC_S,   D, B, I, S)\n#define SETNSm(D, B, I, S)\t\tSETCCim(X86_CC_NS,  D, B, I, S)\n#define SETPm(D, B, I, S)\t\tSETCCim(X86_CC_P,   D, B, I, S)\n#define SETPEm(D, B, I, S)\t\tSETCCim(X86_CC_PE,  D, B, I, S)\n#define SETNPm(D, B, I, S)\t\tSETCCim(X86_CC_NP,  D, B, I, S)\n#define SETPOm(D, B, I, S)\t\tSETCCim(X86_CC_PO,  D, B, I, S)\n#define SETLm(D, B, I, S)\t\tSETCCim(X86_CC_L,   D, B, I, S)\n#define SETNGEm(D, B, I, S)\t\tSETCCim(X86_CC_NGE, D, B, I, S)\n#define SETGEm(D, B, I, S)\t\tSETCCim(X86_CC_GE,  D, B, I, S)\n#define SETNLm(D, B, I, S)\t\tSETCCim(X86_CC_NL,  D, B, I, S)\n#define SETLEm(D, B, I, S)\t\tSETCCim(X86_CC_LE,  D, B, I, S)\n#define SETNGm(D, B, I, S)\t\tSETCCim(X86_CC_NG,  D, B, I, S)\n#define SETGm(D, B, I, S)\t\tSETCCim(X86_CC_G,   D, B, I, S)\n#define SETNLEm(D, B, I, S)\t\tSETCCim(X86_CC_NLE, D, B, I, S)\n\n#define CMOVWrr(cc, rs, rd)\t\tx86_CMOVWrr(_jit, cc, rs, rd)\n__jit_inline void\nx86_CMOVWrr(jit_state_t _jit, x86_cc_t cc, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rd, rs);\n    x86_cmov_sil_rr(_jit, cc, rs, rd);\n}\n\n#define CMOVWmr(cc, md, rb, ri, ms, rd)\tx86_CMOVWmr(_jit, cc, md, rb, ri, ms, rd)\n__jit_inline void\nx86_CMOVWmr(jit_state_t _jit, x86_cc_t cc,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_cmov_sil_mr(_jit, cc, md, rb, ri, ms, rd);\n}\n\n#define CMOVLrr(cc, rs, rd)\t\tx86_CMOVLrr(_jit, cc, rs, rd)\n__jit_inline void\nx86_CMOVLrr(jit_state_t _jit, x86_cc_t cc, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rd, rs);\n    x86_cmov_sil_rr(_jit, cc, rs, rd);\n}\n\n#define CMOVLmr(cc, md, rb, ri, ms, rd)\tx86_CMOVLmr(_jit, cc, md, rb, ri, ms, rd)\n__jit_inline void\nx86_CMOVLmr(jit_state_t _jit, x86_cc_t cc,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_cmov_sil_mr(_jit, cc, md, rb, ri, ms, rd);\n}\n\n/* --- Push/Pop instructions ----------------------------------------------- */\n#define POPAD_()\t\t\tx86_POPA_(_jit)\n#define POPA_()\t\t\t\tx86_POPA_(_jit)\n__jit_inline void\nx86_POPA_(jit_state_t _jit)\n{\n    _d16();\n    _O(0x61);\n}\n\n#define PUSHAD_()\t\t\tx86_PUSHA_(_jit)\n#define PUSHA_()\t\t\tx86_PUSHA_(_jit)\n__jit_inline void\nx86_PUSHA_(jit_state_t _jit)\n{\n    _d16();\n    _O(0x60);\n}\n    \n#define POPF_()\t\t\t\tx86_POPF_(_jit)\n__jit_inline void\nx86_POPF_(jit_state_t _jit)\n{\n    _O(0x9d);\n}\n\n#define PUSHF_()\t\t\tx86_PUSHF_(_jit)\n__jit_inline void\nx86_PUSHF_(jit_state_t _jit)\n{\n    _O(0x9c);\n}\n\n/* --- Test instructions --------------------------------------------------- */\n#define TESTBrr(rs, rd)\t\t\tx86_TESTBrr(_jit, rs, rd)\n__jit_inline void\nx86_TESTBrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBrr(rs, rd);\n    x86_test_c_rr(_jit, rs, rd);\n}\n\n#define TESTBrm(rs, md, rb, ri, ms)\tx86_TESTBrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_TESTBrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(rs, rb, ri);\n    x86_test_c_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define TESTBir(im, rd)\t\t\tx86_TESTBir(_jit, im, rd)\n__jit_inline void\nx86_TESTBir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _REXBrr(_NOREG, rd);\n    x86_test_c_ir(_jit, im, rd);\n}\n\n#define TESTBim(im, md, rb, ri, ms)\tx86_TESTBim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_TESTBim(jit_state_t _jit,\n\t    long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    x86_test_c_im(_jit, im, md, rb, ri, ms);\n}\n\n#define TESTWrr(rs, rd)\t\t\tx86_TESTWrr(_jit, rs, rd)\n__jit_inline void\nx86_TESTWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_test_sil_rr(_jit, rs, rd);\n}\n\n#define TESTWrm(rs, md, rb, ri, ms)\tx86_TESTWrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_TESTWrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_test_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define TESTWir(im, rd)\t\t\tx86_TESTWir(_jit, im, rd)\n__jit_inline void\nx86_TESTWir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(_NOREG, rd);\n    x86_test_s_ir(_jit, im, rd);\n}\n\n#define TESTWim(im, md, rb, ri, ms)\tx86_TESTWim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_TESTWim(jit_state_t _jit,\n\t    long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(_NOREG, rb, ri);\n    x86_test_s_im(_jit, im, md, rb, ri, ms);\n}\n\n#define TESTLrr(rs, rd)\t\t\tx86_TESTLrr(_jit, rs, rd)\n__jit_inline void\nx86_TESTLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_test_sil_rr(_jit, rs, rd);\n}\n\n#define TESTLrm(rs, md, rb, ri, ms)\tx86_TESTLrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_TESTLrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_test_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define TESTLir(im, rd)\t\t\tx86_TESTLir(_jit, im, rd)\n__jit_inline void\nx86_TESTLir(jit_state_t _jit, long im, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    x86_test_il_ir(_jit, im, rd);\n}\n\n#define TESTLim(im, md, rb, ri, ms)\tx86_TESTLim(_jit, im, md, rb, ri, ms)\n__jit_inline void\nx86_TESTLim(jit_state_t _jit,\n\t    long im, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    x86_test_il_im(_jit, im, md, rb, ri, ms);\n}\n\n/* --- Exchange instructions ----------------------------------------------- */\n#define CMPXCHGBrr(rs, rd)\t\tx86_CMPXCHGBrr(_jit, rs, rd)\n__jit_inline void\nx86_CMPXCHGBrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBrr(rs, rd);\n    x86_cmpxchg_c_rr(_jit, rs, rd);\n}\n\n#define CMPXCHGBrm(rs, md, rb, ri, ms)\tx86_CMPXCHGBrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_CMPXCHGBrm(jit_state_t _jit,\n\t       jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(rs, rb, ri);\n    x86_cmpxchg_c_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define CMPXCHGWrr(rs, rd)\t\tx86_CMPXCHGWrr(_jit, rs, rd)\n__jit_inline void\nx86_CMPXCHGWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_cmpxchg_sil_rr(_jit, rs, rd);\n}\n\n#define CMPXCHGWrm(rs, md, rb, ri, ms)\tx86_CMPXCHGWrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_CMPXCHGWrm(jit_state_t _jit,\n\t       jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_cmpxchg_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define CMPXCHGLrr(rs, rd)\t\tx86_CMPXCHGLrr(_jit, rs, rd)\n__jit_inline void\nx86_CMPXCHGLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_cmpxchg_sil_rr(_jit, rs, rd);\n}\n\n#define CMPXCHGLrm(rs, md, rb, ri, ms)\tx86_CMPXCHGLrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_CMPXCHGLrm(jit_state_t _jit,\n\t       jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_cmpxchg_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XADDBrr(rs, rd)\t\t\tx86_XADDBrr(_jit, rs, rd)\n__jit_inline void\nx86_XADDBrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBrr(rs, rd);\n    x86_xadd_c_rr(_jit, rs, rd);\n}\n\n#define XADDBrm(rs, md, rb, ri, ms)\tx86_XADDBrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XADDBrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(rs, rb, ri);\n    x86_xadd_c_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XADDWrr(rs, rd)\t\t\tx86_XADDWrr(_jit, rs, rd)\n__jit_inline void\nx86_XADDWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_xadd_sil_rr(_jit, rs, rd);\n}\n\n#define XADDWrm(rs, md, rb, ri, ms)\tx86_XADDWrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XADDWrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_xadd_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XADDLrr(rs, rd)\t\t\tx86_XADDLrr(_jit, rs, rd)\n__jit_inline void\nx86_XADDLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_xadd_sil_rr(_jit, rs, rd);\n}\n\n#define XADDLrm(rs, md, rb, ri, ms)\tx86_XADDLrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XADDLrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_xadd_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XCHGBrr(rs, rd)\t\t\tx86_XCHGBrr(_jit, rs, rd)\n__jit_inline void\nx86_XCHGBrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBrr(rs, rd);\n    x86_xchg_c_rr(_jit, rs, rd);\n}\n\n#define XCHGBrm(rs, md, rb, ri, ms)\tx86_XCHGBrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XCHGBrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(rs, rb, ri);\n    x86_xchg_c_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XCHGWrr(rs, rd)\t\t\tx86_XCHGWrr(_jit, rs, rd)\n__jit_inline void\nx86_XCHGWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rs, rd);\n    x86_xchg_sil_rr(_jit, rs, rd);\n}\n\n#define XCHGWrm(rs, md, rb, ri, ms)\tx86_XCHGWrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XCHGWrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(rs, rb, ri);\n    x86_xchg_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n#define XCHGLrr(rs, rd)\t\t\tx86_XCHGLrr(_jit, rs, rd)\n__jit_inline void\nx86_XCHGLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rs, rd);\n    x86_xchg_sil_rr(_jit, rs, rd);\n}\n\n#define XCHGLrm(rs, md, rb, ri, ms)\tx86_XCHGLrm(_jit, rs, md, rb, ri, ms)\n__jit_inline void\nx86_XCHGLrm(jit_state_t _jit,\n\t    jit_gpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(rs, rb, ri);\n    x86_xchg_sil_rm(_jit, rs, md, rb, ri, ms);\n}\n\n/* --- Increment/Decrement instructions ------------------------------------ */\n#define DECBr(rd)\t\t\tx86_DECBr(_jit, rd)\n__jit_inline void\nx86_DECBr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXBrr(_NOREG, rd);\n    x86_dec_c_r(_jit, rd);\n}\n\n#define DECBm(md, rb, ri, ms)\t\tx86_DECBm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_DECBm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    x86_dec_c_m(_jit, md, rb, ri, ms);\n}\n\n#define DECWr(rd)\t\t\tx86_DECWr(_jit, rd)\n__jit_inline void\nx86_DECWr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(_NOREG, rd);\n    x86_dec_sil_r(_jit, rd);\n}\n\n#define DECWm(md, rb, ri, ms)\t\tx86_DECWm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_DECWm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(_NOREG, rb, ri);\n    x86_dec_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define DECLr(rd)\t\t\tx86_DECLr(_jit, rd)\n__jit_inline void\nx86_DECLr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    x86_dec_sil_r(_jit, rd);\n}\n\n#define DECLm(md, rb, ri, ms)\t\tx86_DECLm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_DECLm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    x86_dec_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define INCBr(rd)\t\t\tx86_INCBr(_jit, rd)\n__jit_inline void\nx86_INCBr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXBrr(_NOREG, rd);\n    x86_inc_c_r(_jit, rd);\n}\n\n#define INCBm(md, rb, ri, ms)\t\tx86_INCBm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_INCBm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXBrm(_NOREG, rb, ri);\n    x86_inc_c_m(_jit, md, rb, ri, ms);\n}\n\n#define INCWr(rd)\t\t\tx86_INCWr(_jit, rd)\n__jit_inline void\nx86_INCWr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(_NOREG, rd);\n    x86_inc_sil_r(_jit, rd);\n}\n\n#define INCWm(md, rb, ri, ms)\t\tx86_INCWm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_INCWm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _d16();\n    _REXLrm(_NOREG, rb, ri);\n    x86_inc_sil_m(_jit, md, rb, ri, ms);\n}\n\n#define INCLr(rd)\t\t\tx86_INCLr(_jit, rd)\n__jit_inline void\nx86_INCLr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    x86_inc_sil_r(_jit, rd);\n}\n\n#define INCLm(md, rb, ri, ms)\t\tx86_INCLm(_jit, md, rb, ri, ms)\n__jit_inline void\nx86_INCLm(jit_state_t _jit, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _REXLrm(_NOREG, rb, ri);\n    x86_inc_sil_m(_jit, md, rb, ri, ms);\n}\n\n/* --- Misc instructions --------------------------------------------------- */\n#define BSFWrr(rs, rd)\t\t\tx86_BSFWrr(_jit, rs, rd)\n__jit_inline void\nx86_BSFWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rd, rs);\n    x86_bsf_sil_rr(_jit, rs, rd);\n}\n\n#define BSFWmr(md, rb, ri, ms, rd)\tx86_BSFWmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_BSFWmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_bsf_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define BSRWrr(rs, rd)\t\t\tx86_BSRWrr(_jit, rs, rd)\n__jit_inline void\nx86_BSRWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXLrr(rd, rs);\n    x86_bsr_sil_rr(_jit, rs, rd);\n}\n\n#define BSRWmr(md, rb, ri, ms, rd)\tx86_BSRWmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_BSRWmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_bsr_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define BSFLrr(rs, rd)\t\t\tx86_BSFLrr(_jit, rs, rd)\n__jit_inline void\nx86_BSFLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rd, rs);\n    x86_bsf_sil_rr(_jit, rs, rd);\n}\n\n#define BSFLmr(md, rb, ri, ms, rd)\tx86_BSFLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_BSFLmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_bsf_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define BSRLrr(rs, rd)\t\t\tx86_BSRLrr(_jit, rs, rd)\n__jit_inline void\nx86_BSRLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXLrr(rd, rs);\n    x86_bsr_sil_rr(_jit, rs, rd);\n}\n\n#define BSRLmr(md, rb, ri, ms, rd)\tx86_BSRLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_BSRLmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_bsr_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVSBWrr(rs, rd)\t\tx86_MOVSBWrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVSBWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXBLrr(rd, rs);\n    x86_movsb_sil_rr(_jit, rs, rd);\n}\n\n#define MOVSBWmr(md, rb, ri, ms, rd)\tx86_MOVSBWmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVSBWmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_movsb_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVSBLrr(rs, rd)\t\tx86_MOVSBLrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVSBLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\t\t\n{\n    _REXBLrr(rd, rs);\n    x86_movsb_sil_rr(_jit, rs, rd);\n}\n\n#define MOVSBLmr(md, rb, ri, ms, rd)\tx86_MOVSBLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVSBLmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_movsb_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVSWLrr(rs, rd)\t\tx86_MOVSWLrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVSWLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBLrr(rd, rs);\n    x86_movsw_il_rr(_jit, rs, rd);\n}\n\n#define MOVSWLmr(md, rb, ri, ms, rd)\tx86_MOVSWLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVSWLmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_movsw_il_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVZBWrr(rs, rd)\t\tx86_MOVZBWrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVZBWrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _d16();\n    _REXBLrr(rd, rs);\n    x86_movzb_sil_rr(_jit, rs, rd);\n}\n\n#define MOVZBWmr(md, rb, ri, ms, rd)\tx86_MOVZBWmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVZBWmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _d16();\n    _REXLmr(rb, ri, rd);\n    x86_movzb_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVZBLrr(rs, rd)\t\tx86_MOVZBLrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVZBLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\t\t\n{\n    _REXBLrr(rd, rs);\n    x86_movzb_sil_rr(_jit, rs, rd);\n}\n\n#define MOVZBLmr(md, rb, ri, ms, rd)\tx86_MOVZBLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVZBLmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_movzb_sil_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define MOVZWLrr(rs, rd)\t\tx86_MOVZWLrr(_jit, rs, rd)\n__jit_inline void\nx86_MOVZWLrr(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd)\n{\n    _REXBLrr(rd, rs);\n    x86_movzw_il_rr(_jit, rs, rd);\n}\n\n#define MOVZWLmr(md, rb, ri, ms, rd)\tx86_MOVZWLmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_MOVZWLmr(jit_state_t _jit,\n\t     long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_movzw_il_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define LEALmr(md, rb, ri, ms, rd)\tx86_LEALmr(_jit, md, rb, ri, ms, rd)\n__jit_inline void\nx86_LEALmr(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_gpr_t rd)\n{\n    _REXLmr(rb, ri, rd);\n    x86_lea_il_mr(_jit, md, rb, ri, ms, rd);\n}\n\n#define BSWAPLr(rd)\t\t\tx86_BSWAPLr(_jit, rd)\n__jit_inline void\nx86_BSWAPLr(jit_state_t _jit, jit_gpr_t rd)\n{\n    _REXLrr(_NOREG, rd);\n    x86_bswap_il_r(_jit, rd);\n}\n\n#define CLC_()\t\t\t\t_O(0xf8)\n#define STC_()\t\t\t\t_O(0xf9)\n\n#define CMC_()\t\t\t\t_O(0xf5)\n#define CLD_()\t\t\t\t_O(0xfc)\n#define STD_()\t\t\t\t_O(0xfd)\n\n#define CBTW_()\t\t\t\tx86_CBW_(_jit)\n#define CBW_()\t\t\t\tx86_CBW_(_jit)\n/* short ax = (char)al */\n__jit_inline void\nx86_CBW_(jit_state_t _jit)\n{\n    _d16();\n    _sign_extend_rax();\n}\n\n#define CWTL_()\t\t\t\tx86_CWDE_(_jit)\n#define CWDE_()\t\t\t\tx86_CWDE_(_jit)\n/* int eax = (short)ax */\n__jit_inline void\nx86_CWDE_(jit_state_t _jit)\n{\n    _sign_extend_rax();\n}\n\n#define CWTD_()\t\t\t\tx86_CWD_(_jit)\n#define CWD_()\t\t\t\tx86_CWD_(_jit)\n/* short dx:ax = ax */\n__jit_inline void\nx86_CWD_(jit_state_t _jit)\n{\n    _d16();\n    _sign_extend_rdx_rax();\n}\n\n#define CLTD_()\t\t\t\tx86_CDQ_(_jit)\n#define CDQ_()\t\t\t\tx86_CDQ_(_jit)\n/* int edx:eax = eax */\n__jit_inline void\nx86_CDQ_(jit_state_t _jit)\n{\n    _sign_extend_rdx_rax();\n}\n\n#define LAHF_()\t\t\t\tx86_LAHF_(_jit)\n__jit_inline void\nx86_LAHF_(jit_state_t _jit)\n{\n    _O(0x9f);\n}\n\n#define SAHF_()\t\t\t\tx86_SAHF_(_jit)\n__jit_inline void\nx86_SAHF_(jit_state_t _jit)\n{\n    _O(0x9e);\n}\n\n#define CPUID_()\t\t\tx86_CPUID_(_jit)\n__jit_inline void\nx86_CPUID_(jit_state_t _jit)\n{\n    _O(0x0f);\n    _O(0xa2);\n}\n\n#define RDTSC_()\t\t\tx86_RDTSC_(_jit)\n__jit_inline void\nx86_RDTSC_(jit_state_t _jit)\n{\n    _O(0xff);\n    _O(0x31);\n}\n\n#define ENTERii(size, nest)\t\tx86_ENTERii(_jit, size, nest)\n__jit_inline void\nx86_ENTERii(jit_state_t _jit, long size, int nest)\n{\n    _O(0xc8);\n    _jit_W(_su16(size));\n    _jit_B(_su8(nest));\n}\n\n#define LEAVE_()\t\t\tx86_LEAVE_(_jit)\n__jit_inline void\nx86_LEAVE_(jit_state_t _jit)\n{\n    _O(0xc9);\n}\n\n#define RET_()\t\t\t\tx86_RET_(_jit)\n__jit_inline void\nx86_RET_(jit_state_t _jit)\n{\n    _O(0xc3);\n}\n\n#define RETi(im)\t\t\tx86_RETi(_jit, im)\n__jit_inline void\nx86_RETi(jit_state_t _jit, long im)\n{\n    _O(0xc2);\n    _jit_W(_su16(im));\n}\n\n#define NOP_()\t\t\t\tx86_NOP_(_jit)\n__jit_inline void\nx86_NOP_(jit_state_t _jit)\n{\n    _O(0x90);\n}\n\n/* N byte NOPs */\n#define NOPi(nop)\t\t\tx86_NOPi(_jit, nop)\n__jit_inline void\nx86_NOPi(jit_state_t _jit, unsigned long nop)\n{\n    if (nop > 9)\n\tJITFAIL(\".align argument too large\");\n    /* Recommended Multi-Byte Sequence of NOP Instruction */\n    switch (nop) {\n\tcase 0:\n\t    break;\n\tcase 1:\n\t    /* NOP */\n\t    _O(0x90);\n\t    break;\n\tcase 2:\n\t    /* 66 NOP */\n\t    _O(0x66);\n\t    _O(0x90);\n\t    break;\n\tcase 3:\n\t    /* NOP DWORD ptr [EAX] */\n\t    _O(0x0f);\n\t    _O(0x1f);\n\t    _O(0x00);\n\t    break;\n\tcase 4:\n\t    /* NOP DWORD ptr [EAX + 00H] */\n\t    _O(0x0f);\n\t    _O(0x1f);\n\t    _O(0x40);\n\t    _O(0x00);\n\t    break;\n\tcase 5:\n\t    /* NOP DWORD ptr [EAX + EAX*1 + 00H] */\n\t    _O(0x0f);\n\t    _O(0x1f);\n\t    _O(0x44);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    break;\n\tcase 6:\n\t    /* 66 NOP DWORD ptr [EAX + EAX*1 + 00H] */\n\t    _O(0x66);\n\t    _O(0x0f);\n\t    _O(0x1f);\n\t    _O(0x44);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    break;\n\tcase 7:\n\t    /* NOP DWORD ptr [EAX + 00000000H] */\n\t    _O(0x0f);\n\t    _O(0x1f);\n\t    _O(0x80);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    break;\n\tcase 8:\n\t    /* NOP DWORD ptr [EAX + EAX*1 + 00000000H] */\n\t    _O(0x0f);\n\t    _O(0x1f);\n\t    _O(0x84);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    break;\n\tdefault:\n\t    /* 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] */\n\t    _O(0x66);\n\t    _O(0x0f);\n\t    _O(0x1f);\n\t    _O(0x84);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    _O(0x00);\n\t    break;\n    }\n}\n\n\n/* x87 instructions -- yay, we found a use for octal constants :-) */\n__jit_inline void\nx86_esc_mi(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, int op)\n{\n    _O(0xd8 | (op >> 3));\n    _i_X((op & 7), md, rb, ri, ms);\n}\n\n__jit_inline void\nx86_fstcw_m(jit_state_t _jit,\n\t    long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n     _O(0x9b);\n    x86_esc_mi(_jit, md, rb, ri, ms, 017);\n}\n\n#define ESCmi(md, rb, ri, rs, op)\tx86_ESCmi(_jit, md, rb, ri, rs, op)\n__jit_inline void\nx86_ESCmi(jit_state_t _jit,\n\t  long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, int op)\n{\n    _REXLrm(_NOREG, rb, ri);\n    x86_esc_mi(_jit, md, rb, ri, ms, op);\n}\n\n#define ESCri(rd, op)\t\t\tx86_ESCri(_jit, rd, op)\n__jit_inline void\nx86_ESCri(jit_state_t _jit, jit_fpr_t rd, int op)\n{\n    _O(0xd8 | (op >> 3));\n    _Mrm(_b11, (op & 7), rd);\n}\n\n#define ESCrri(rs, rd, op)\t\tx86_ESCrri(_jit, rs, rd, op)\n__jit_inline void\nx86_ESCrri(jit_state_t _jit, jit_fpr_t rs, jit_fpr_t rd, int op)\n{\n    if (rs == _ST0)\n\tESCri(rd, (op | 040));\n    else if (rd == _ST0)\n\tESCri(rs, op);\n    else\n\tJITFAIL(\"coprocessor instruction without st0\");\n}\n\n__jit_inline void\t\t\t\t\t/*  fstcw m16int  */\nx86_FSTCWm(jit_state_t _jit,\n\t   long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    /* 0x9b prefix to fnstcw */\n    _REXLrm(_NOREG, rb, ri);\n    x86_fstcw_m(_jit, md, rb, ri, ms);\n}\n\n#define    FLDSm(D, B, I, S)\tESCmi(D, B, I, S, 010)\t/*    fld m32real */\n#define    FSTSm(D, B, I, S)\tESCmi(D, B, I, S, 012)\t/*    fst m32real */\n#define   FSTPSm(D, B, I, S)\tESCmi(D, B, I, S, 013)\t/*   fstp m32real */\n#define   FLDCWm(D, B, I, S)\tESCmi(D, B, I, S, 015)\t/*  fldcw m16int  */\n#define   FSTCWm(D, B, I, S)\tx86_FSTCWm(_jit,D,B,I,S)/*  fstcw m16int  */\n#define  FNSTCWm(D, B, I, S)\tESCmi(D, B, I, S, 017)\t/* fnstcw m16int  */\n#define   FILDLm(D, B, I, S)\tESCmi(D, B, I, S, 030)\t/*   fild m32int  */\n/* (p6 or newer) */\n#define FISTTPLm(D, B, I, S)\tESCmi(D, B, I, S, 031)\t/* fisttp m32int  */\n#define   FISTLm(D, B, I, S)\tESCmi(D, B, I, S, 032)\t/*   fist m32int  */\n#define  FISTPLm(D, B, I, S)\tESCmi(D, B, I, S, 033)\t/*  fistp m32int  */\n#define    FLDTm(D, B, I, S)\tESCmi(D, B, I, S, 035)\t/*    fld m80real */\n#define   FSTPTm(D, B, I, S)\tESCmi(D, B, I, S, 037)\t/*   fstp m80real */\n#define    FLDLm(D, B, I, S)\tESCmi(D, B, I, S, 050)\t/*    fld m64real */\n#define    FSTLm(D, B, I, S)\tESCmi(D, B, I, S, 052)\t/*    fst m64real */\n#define   FSTPLm(D, B, I, S)\tESCmi(D, B, I, S, 053)\t/*   fstp m64real */\n#define   FILDWm(D, B, I, S)\tESCmi(D, B, I, S, 070)\t/*   fild m16int  */\n/* (p6 or newer) */\n#define FISTTPQm(D, B, I, S)\tESCmi(D, B, I, S, 071)\t/* fisttp m64int  */\n#define   FISTWm(D, B, I, S)\tESCmi(D, B, I, S, 072)\t/*   fist m16int  */\n#define  FISTPWm(D, B, I, S)\tESCmi(D, B, I, S, 073)\t/*  fistp m16int  */\n#define   FILDQm(D, B, I, S)\tESCmi(D, B, I, S, 075)\t/*   fild m64int  */\n#define  FISTPQm(D, B, I, S)\tESCmi(D, B, I, S, 077)\t/*  fistp m64int  */\n\n#define  FADDrr(RS, RD)\t\tESCrri(RS, RD, 000)\n#define  FMULrr(RS, RD)\t\tESCrri(RS, RD, 001)\n#define  FSUBrr(RS, RD)\t\tESCrri(RS, RD, 004)\n#define FSUBRrr(RS, RD)\t\tESCrri(RS, RD, 005)\n#define  FDIVrr(RS, RD)\t\tESCrri(RS, RD, 006)\n#define FDIVRrr(RS, RD)\t\tESCrri(RS, RD, 007)\n\n/* st(0) = st(rs) if below (cf=1) (p6 or newer) */\n#define   FCMOVB(RS)\t\tESCri(RS, 020)\n\n/* st(0) = st(rs) if equal (zf=1) (p6 or newer) */\n#define   FCMOVE(RS)\t\tESCri(RS, 021)\n\n/* st(0) = st(rs) if below or equal (cf=1 or zf=1) (p6 or newer) */\n#define  FCMOVBE(RS)\t\tESCri(RS, 022)\n\n/* st(0) = st(rs) if unordered (pf=1) (p6 or newer) */\n#define   FCMOVU(RS)\t\tESCri(RS, 023)\n\n/* st(0) = st(rs) if not below (cf=0) (p6 or newer) */\n#define  FCMOVNB(RS)\t\tESCri(RS, 030)\n\n/* st(0) = st(rs) if not equal (zf=0) (p6 or newer) */\n#define  FCMOVNE(RS)\t\tESCri(RS, 031)\n\n/* st(0) = st(rs) if not below or equal (cf=0 and zf=0) (p6 or newer) */\n#define FCMOVNBE(RS)\t\tESCri(RS, 032)\n\n/* st(0) = st(rs) if not unordered (pf=0) (p6 or newer) */\n#define  FCMOVNU(RS)\t\tESCri(RS, 033)\n\n/* *push*, st(0) = st(rd+1) */\n#define     FLDr(RD)\t\tESCri(RD, 010)\n\n#define    FXCHr(RD)\t\tESCri(RD, 011)\n#define   FFREEr(RD)\t\tESCri(RD, 050)\n#define     FSTr(RD)\t\tESCri(RD, 052)\n#define    FSTPr(RD)\t\tESCri(RD, 053)\n\n/* Compare st(0) with st(rs) */\n#define    FCOMr(RS)\t\tESCri(RS, 002)\n#define   FCOMPr(RS)\t\tESCri(RS, 003)\n\n/* Compare st(0) with st(rd) and set eflags (p6 or newer)\n   (raise invalid operation if unordered argument) */\n#define  FUCOMIr(RS)\t\tESCri(RS, 035)\n#define FUCOMIPr(RS)\t\tESCri(RS, 075)\n\n/* Compare st(0) with st(rs) and set eflags (p6 or newer)\n   (does not raise invalid operation if unordered argument) */\n#define   FCOMIr(RS)\t\tESCri(RS, 036)\n#define  FCOMIPr(RS)\t\tESCri(RS, 076)\n\n/* Compare st(0) with st(rs) */\n#define   FUCOMr(RS)\t\tESCri(RS, 054)\n#define  FUCOMPr(RS)\t\tESCri(RS, 055)\n\n#define   FADDPr(RD)\t\tESCri(RD, 060)\n#define   FMULPr(RD)\t\tESCri(RD, 061)\n#define   FSUBPr(RD)\t\tESCri(RD, 064)\n#define  FSUBRPr(RD)\t\tESCri(RD, 065)\n#define   FDIVPr(RD)\t\tESCri(RD, 066)\n#define  FDIVRPr(RD)\t\tESCri(RD, 067)\n\n/* Clear exceptions */\n#define FNCLEX_()\t\t_OO(0xdbe2)\n\n#define FCLEX_()\t\t(_O(0x9b), FNCLEX_())\n\n/* st(0) = -st(0) */\n#define FCHS_()\t\t\t_OO(0xd9e0)\t/* ESCri(0, 014) */\n\n/* st(0) = fabs(st(0)) */\n#define FABS_()\t\t\t_OO(0xd9e1)\t/* ESCri(1, 014) */\n\n/* Compare st(0) with 0.0 */\n#define FTST_()\t\t\t_OO(0xd9e4)\t/* ESCri(4, 014) */\n\n/* Classify ST(0) */\n#define FXAM_()\t\t\t_OO(0xd9e5)\t/* ESCri(5, 014) */\n\n/* Push +1.0 to the x87 stack */\n#define FLD1_()\t\t\t_OO(0xd9e8)\t/* ESCri(0, 015) */\n\n/* Push log2(10) */\n#define FLDL2T_()\t\t_OO(0xd9e9)\t/* ESCri(1, 015) */\n\n/* Push log2(e) */\n#define FLDL2E_()\t\t_OO(0xd9ea)\t/* ESCri(2, 015) */\n\n/* Push PI */\n#define FLDPI_()\t\t_OO(0xd9eb)\t/* ESCri(3, 015) */\n\n/* Push log10(2) */\n#define FLDLG2_()\t\t_OO(0xd9ec)\t/* ESCri(4, 015) */\n\n/* Push log(2) */\n#define FLDLN2_()\t\t_OO(0xd9ed)\t/* ESCri(5, 015) */\n\n/* Push +0.0 */\n#define FLDZ_()\t\t\t_OO(0xd9ee)\t/* ESCri(6, 015) */\n\n/* st(0) = pow(2, st(0)) - 1 */\n#define F2XM1_()\t\t_OO(0xd9f0)\t/* ESCri(0, 016) */\n\n/* temp = st(1) * log2(st(0)) => *pop*,  st(0) = temp */\n#define FYL2X_()\t\t_OO(0xd9f1)\t/* ESCri(1, 016) */\n\n/* temp = tangent(st(0)) => *push*, st(0) = 1.0, st(1) = temp */\n#define FPTAN_()\t\t_OO(0xd9f2)\t/* ESCri(2, 016) */\n\n/* temp = arctan(st(1)/st(0)) => *pop*, st(0) = temp */\n#define FPATAN_()\t\t_OO(0xd9f3)\t/* ESCri(3, 016) */\n\n/* temp = st(0)\t => st(0) = significand(temp), st(1) = exponent(temp) */\n#define FXTRACT_()\t\t_OO(0xd9f4)\t/* ESCri(4, 016) */\n\n/* ST(0) = rem(ST(0)/ST(1)) - IEEE spec */\n#define FPREM1_()\t\t_OO(0xd9f5)\t/* ESCri(5, 016) */\n\n/* pop/rotate x87 stack */\n#define FDECSTP_()\t\t_OO(0xd9f6)\t/* ESCri(6, 016) */\n\n/* pop/rotate x87 stack */\n#define FINCSTP_()\t\t_OO(0xd9f7)\t/* ESCri(7, 016) */\n\n/* st(0) = rem(st(0)/st(1)) - compat with 8087/80287 */\n#define FPREM_()\t\t_OO(0xd9f8)\t/* ESCri(0, 017) */\n\n/* temp = st(1) * log2(st(0) + 1) => *pop*,  st(0) = temp */\n#define FYL2XP1_()\t\t_OO(0xd9f9)\t/* ESCri(1, 017) */\n\n/* st(0) = sqrt(st(0)) */\n#define FSQRT_()\t\t_OO(0xd9fa)\t/* ESCri(2, 017) */\n\n/* (sin,cos) = sincos(st(0)) => *push*, st(0) = cos, st(1) = sin */\n#define FSINCOS_()\t\t_OO(0xd9fb)\t/* ESCri(3, 017) */\n\n/* Round st(0) to an integer accordingly to rounding mode */\n#define FRNDINT_()\t\t_OO(0xd9fc)\t/* ESCri(4, 017) */\n\n/* st(0) *= * pow(2, st(1)) */\n#define FSCALE_()\t\t_OO(0xd9fd)\t/* ESCri(5, 017) */\n\n/* st(0) = sin(st(0)) */\n#define FSIN_()\t\t\t_OO(0xd9fe)\t/* ESCri(6, 017) */\n\n/* st(0) = cos(st(0)) */\n#define FCOS_()\t\t\t_OO(0xd9ff)\t/* ESCri(7, 017) */\n\n#define FNSTSWr(RD)\t\t\t\t\t\t\t\\\n    ((RD == _RAX) ? _OO(0xdfe0) : JITFAIL (\"RAX expected\"))\n\n\n/* --- Media 128-bit instructions ------------------------------------------ */\n#define __sse_ff_rr(op, rs, rd)\t\tx86__sse_ff_rr(_jit, op, rs, rd)\n__jit_inline void\nx86__sse_ff_rr(jit_state_t _jit, x86_sse_t op, jit_fpr_t rs, jit_fpr_t rd)\n{\n    _rex_ff_rr(rd, rs);\n    _O(0x0f);\n    _O(op);\n    _Mrm(_b11, _rX(rd), _rX(rs));\n}\n\n#define __sse_id_rr(op, rs, rd)\t\tx86__sse_if_rr(_jit, op, rs, rd)\n#define __sse_if_rr(op, rs, rd)\t\tx86__sse_if_rr(_jit, op, rs, rd)\n__jit_inline void\nx86__sse_if_rr(jit_state_t _jit, x86_sse_t op, jit_fpr_t rs, jit_gpr_t rd)\n{\n    _rex_if_rr(rd, rs);\n    _O(0x0f);\n    _O(op);\n    _Mrm(_b11, _rA(rd), _rX(rs));\n}\n\n#define __sse_di_rr(op, rs, rd)\t\tx86__sse_fi_rr(_jit, op, rs, rd)\n#define __sse_fi_rr(op, rs, rd)\t\tx86__sse_fi_rr(_jit, op, rs, rd)\n__jit_inline void\nx86__sse_fi_rr(jit_state_t _jit, x86_sse_t op, jit_gpr_t rs, jit_fpr_t rd)\n{\n    _rex_fi_rr(rd, rs);\n    _O(0x0f);\n    _O(op);\n    _Mrm(_b11, _rX(rd), _rA(rs));\n}\n\n#define __sse_id_mr(op, md, rb, mi, ms, rd)\t\t\t\t\\\n    x86__sse_if_mr(_jit, op, md, rb, mi, ms, rd)\n#define __sse_if_mr(op, md, rb, mi, ms, rd)\t\t\t\t\\\n    x86__sse_if_mr(_jit, op, md, rb, mi, ms, rd)\n__jit_inline void\nx86__sse_if_mr(jit_state_t _jit, x86_sse_t op,\n\t       long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_fpr_t rd)\n{\n    _rex_if_mr(rb, ri, rd);\n    _O(0x0f);\n    _O(op);\n    _f_X(rd, md, rb, ri, ms);\n}\n\n#define __sse_di_rm(op, rs, md, rb, mi, ms)\t\t\t\t\\\n    x86__sse_fi_rm(_jit, op, rs, md, rb, mi, ms)\n#define __sse_fi_rm(op, rs, md, rb, mi, ms)\t\t\t\t\\\n    x86__sse_fi_rm(_jit, op, rs, md, rb, mi, ms)\n__jit_inline void\nx86__sse_fi_rm(jit_state_t _jit, x86_sse_t op,\n\t       jit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _rex_fi_rm(rs, rb, ri);\n    _O(0x0f);\n    _O(op);\n    _f_X(rs, md, rb, ri, ms);\n}\n\n#define __sse1_di_rm(op, rs, md, mb, mi, ms)\t\t\t\t\\\n    x86__sse1_fi_rm(_jit, op, rs, md, mb, mi, ms)\n#define __sse1_fi_rm(op, rs, md, mb, mi, ms)\t\t\t\t\\\n    x86__sse1_fi_rm(_jit, op, rs, md, mb, mi, ms)\n__jit_inline void\nx86__sse1_fi_rm(jit_state_t _jit, x86_sse_t op,\n\t\tjit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _rex_fi_rm(rs, rb, ri);\n    _O(0x0f);\n    _O(0x01 | op);\n    _f_X(rs, md, rb, ri, ms);\n}\n\n#define _sse_ff_rr(px, op, rs, rd)\tx86_sse_ff_rr(_jit, px, op, rs, rd)\n__jit_inline void\nx86_sse_ff_rr(jit_state_t _jit, _uc px,\n\t      x86_sse_t op, jit_fpr_t rs, jit_fpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_ff_rr(_jit, op, rs, rd);\n}\n\n#define _sse_id_rr(px, op, rs, rd)\tx86_sse_if_rr(_jit, px, op, rs, rd)\n#define _sse_if_rr(px, op, rs, rd)\tx86_sse_if_rr(_jit, px, op, rs, rd)\n__jit_inline void\nx86_sse_if_rr(jit_state_t _jit, _uc px,\n\t      x86_sse_t op, jit_fpr_t rs, jit_gpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_if_rr(_jit, op, rs, rd);\n}\n\n#define _sse_di_rr(px, op, rs, rd)\tx86_sse_fi_rr(_jit, px, op, rs, rd)\n#define _sse_fi_rr(px, op, rs, rd)\tx86_sse_fi_rr(_jit, px, op, rs, rd)\n__jit_inline void\nx86_sse_fi_rr(jit_state_t _jit,\n\t      _uc px, x86_sse_t op, jit_gpr_t rs, jit_fpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_fi_rr(_jit, op, rs, rd);\n}\n\n#define _sse_id_mr(px, op, md, rb, mi, ms, rd)\t\t\t\t\\\n    x86_sse_if_mr(_jit, px, op, md, rb, mi, ms, rd)\n#define _sse_if_mr(px, op, md, rb, mi, ms, rd)\t\t\t\t\\\n    x86_sse_if_mr(_jit, px, op, md, rb, mi, ms, rd)\n__jit_inline void\nx86_sse_if_mr(jit_state_t _jit, _uc px, x86_sse_t op,\n\t      long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms, jit_fpr_t rd)\n{\n    _jit_B(px);\n    x86__sse_if_mr(_jit, op, md, rb, ri, ms, rd);\n}\n\n#define _sse_di_rm(px, op, rs, md, rb, mi, ms)\t\t\t\t\\\n    x86_sse_fi_rm(_jit, px, op, rs, md, rb, mi, ms)\n#define _sse_fi_rm(px, op, rs, md, rb, mi, ms)\t\t\t\t\\\n    x86_sse_fi_rm(_jit, px, op, rs, md, rb, mi, ms)\n__jit_inline void\nx86_sse_fi_rm(jit_state_t _jit, _uc px, x86_sse_t op,\n\t      jit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _jit_B(px);\n    x86__sse_fi_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _sse1_di_rm(px, op, rs, md, mb, mi, ms)\t\t\t\t\\\n    x86_sse1_fi_rm(_jit, px, op, rs, md, mb, mi, ms)\n#define _sse1_fi_rm(px, op, rs, md, mb, mi, ms)\t\t\t\t\\\n    x86_sse1_fi_rm(_jit, px, op, rs, md, mb, mi, ms)\n__jit_inline void\nx86_sse1_fi_rm(jit_state_t _jit, _uc px, x86_sse_t op,\n\t       jit_fpr_t rs, long md, jit_gpr_t rb, jit_gpr_t ri, jit_scl_t ms)\n{\n    _jit_B(px);\n    x86__sse1_fi_rm(_jit, op, rs, md, rb, ri, ms);\n}\n\n#define _SSEPSrr(OP,RS,RD)\t\t__sse_ff_rr (      OP, RS, RD)\n#define _SSEPSmr(OP,MD,MB,MI,MS,RD)\t__sse_if_mr (      OP, MD, MB, MI, MS, RD)\n#define _SSEPSrm(OP,RS,MD,MB,MI,MS)\t__sse_fi_rm (      OP, RS, MD, MB, MI, MS)\n#define _SSEPS1rm(OP,RS,MD,MB,MI,MS)\t__sse1_fi_rm(      OP, RS, MD, MB, MI, MS)\n\n#define _SSEPDrr(OP,RS,RD)\t\t _sse_ff_rr (0x66, OP, RS, RD)\n#define _SSEPDmr(OP,MD,MB,MI,MS,RD)\t _sse_if_mr (0x66, OP, MD, MB, MI, MS, RD)\n#define _SSEPDrm(OP,RS,MD,MB,MI,MS)\t _sse_fi_rm (0x66, OP, RS, MD, MB, MI, MS)\n#define _SSEPD1rm(OP,RS,MD,MB,MI,MS)\t _sse1_fi_rm(0x66, OP, RS, MD, MB, MI, MS)\n\n#define _SSESSrr(OP,RS,RD)\t\t _sse_ff_rr (0xf3, OP, RS, RD)\n#define _SSESSmr(OP,MD,MB,MI,MS,RD)\t _sse_if_mr (0xf3, OP, MD, MB, MI, MS, RD)\n#define _SSESSrm(OP,RS,MD,MB,MI,MS)\t _sse_fi_rm (0xf3, OP, RS, MD, MB, MI, MS)\n#define _SSESS1rm(OP,RS,MD,MB,MI,MS)\t _sse1_fi_rm(0xf3, OP, RS, MD, MB, MI, MS)\n\n#define _SSESDrr(OP,RS,RD)\t\t _sse_ff_rr (0xf2, OP, RS, RD)\n#define _SSESDmr(OP,MD,MB,MI,MS,RD)\t _sse_if_mr (0xf2, OP, MD, MB, MI, MS, RD)\n#define _SSESDrm(OP,RS,MD,MB,MI,MS)\t _sse_fi_rm (0xf2, OP, RS, MD, MB, MI, MS)\n#define _SSESD1rm(OP,RS,MD,MB,MI,MS)\t _sse1_fi_rm(0xf2, OP, RS, MD, MB, MI, MS)\n\n/* SSE */\n#define LDMXCSRmr(MD, MB, MI, MS)\t\t\t\t\t\\\n    (_REXLmr(MB, MI, _NOREG),\t\t\t\t\t\t\\\n     _O(0x0f),\t\t\t\t\t\t\t\t\\\n     _O(0xae),\t\t\t\t\t\t\t\t\\\n     _i_X(_b10, MD, MB, MI, MS))\n#define STMXCSRrm(MD, MB, MI, MS)\t\t\t\t\t\\\n    (_REXLrm(_NOREG, MI, MB),\t\t\t\t\t\t\\\n     _O(0x0f),\t\t\t\t\t\t\t\t\\\n     _O(0xae),\t\t\t\t\t\t\t\t\\\n     _i_X(_b11, MD, MB, MI, MS))\n\n/* SSE2 */\n#define ADDPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_ADD, RS, RD)\n#define ADDPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_ADD, MD, MB, MI, MS, RD)\n#define ADDPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_ADD, RS, RD)\n#define ADDPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_ADD, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define ADDSSrr(RS, RD)\t\t\t_SSESSrr(X86_SSE_ADD, RS, RD)\n#define ADDSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_ADD, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define ADDSDrr(RS, RD)\t\t\t_SSESDrr(X86_SSE_ADD, RS, RD)\n#define ADDSDmr(MD, MB, MI, MS, RD)\t_SSESDmr(X86_SSE_ADD, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define ANDNPSrr(RS, RD)\t\t_SSEPSrr(X86_SSE_ANDN, RS, RD)\n#define ANDNPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_ANDN, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define ANDNPDrr(RS, RD)\t\t_SSEPDrr(X86_SSE_ANDN, RS, RD)\n#define ANDNPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_ANDN, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define ANDNSSrr\t\t\tANDNPSrr\n#define ANDNSSmr\t\t\tANDNPSrr\n\n/* SSE2 */\n#define ANDNSDrr\t\t\tANDNPDrr\n#define ANDNSDmr\t\t\tANDNPDrr\n\n/* SSE */\n#define ANDPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_AND, RS, RD)\n#define ANDPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_AND, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define ANDPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_AND, RS, RD)\n#define ANDPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_AND, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define ANDSSrr\t\t\t\tANDPSrr\n#define ANDSSmr\t\t\t\tANDPSrr\n\n/* SSE2 */\n#define ANDSDrr\t\t\t\tANDPDrr\n#define ANDSDmr\t\t\t\tANDPDrr\n\n/* SSE */\n#define DIVPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_DIV, RS, RD)\n#define DIVPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_DIV, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define DIVPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_DIV, RS, RD)\n#define DIVPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_DIV, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define DIVSSrr(RS, RD)\t\t\t_SSESSrr(X86_SSE_DIV, RS, RD)\n#define DIVSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_DIV, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define DIVSDrr(RS, RD)\t\t\t_SSESDrr(X86_SSE_DIV, RS, RD)\n#define DIVSDmr(MD, MB, MI, MS, RD)\t_SSESDmr(X86_SSE_DIV, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MAXPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_MAX, RS, RD)\n#define MAXPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_MAX, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MAXPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_MAX, RS, RD)\n#define MAXPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_MAX, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MAXSSrr(RS, RD)\t\t\t_SSESSrr(X86_SSE_MAX, RS, RD)\n#define MAXSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_MAX, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MAXSDrr(RS, RD)\t\t\t_SSESDrr(X86_SSE_MAX, RS, RD)\n#define MAXSDmr(MD, MB, MI, MS, RD)\t_SSESDmr(X86_SSE_MAX, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MINPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_MIN, RS, RD)\n#define MINPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_MIN, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MINPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_MIN, RS, RD)\n#define MINPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_MIN, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MINSSrr(RS, RD)\t\t\t_SSESSrr(X86_SSE_MIN, RS, RD)\n#define MINSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_MIN, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MINSDrr(RS, RD)\t\t\t_SSESDrr(X86_SSE_MIN, RS, RD)\n#define MINSDmr(MD, MB, MI, MS, RD)\t_SSESDmr(X86_SSE_MIN, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MULPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_MUL, RS, RD)\n#define MULPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_MUL, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MULPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_MUL, RS, RD)\n#define MULPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_MUL, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MULSSrr(RS, RD)\t\t\t_SSESSrr(X86_SSE_MUL, RS, RD)\n#define MULSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_MUL, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MULSDrr(RS, RD)\t\t\t_SSESDrr(X86_SSE_MUL, RS, RD)\n#define MULSDmr(MD, MB, MI, MS, RD)\t_SSESDmr(X86_SSE_MUL, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define ORPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_OR, RS, RD)\n#define ORPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_OR, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define ORPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_OR, RS, RD)\n#define ORPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_OR, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define ORSSrr\t\t\t\tORPSrr\n#define ORSSmr\t\t\t\tORPSrr\n\n/* SSE2 */\n#define ORSDrr\t\t\t\tORPDrr\n#define ORSDmr\t\t\t\tORPDrr\n\n/* SSE */\n#define RCPPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_RCP, RS, RD)\n#define RCPPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_RCP, MD, MB, MI, MS, RD)\n#define RCPSSrr(RS, RD)\t\t\t_SSESSrr(X86_SSE_RCP, RS, RD)\n#define RCPSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_RCP, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define RSQRTPSrr(RS, RD)\t\t_SSEPSrr(X86_SSE_RSQRT, RS, RD)\n#define RSQRTPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_RSQRT, MD, MB, MI, MS, RD)\n#define RSQRTSSrr(RS, RD)\t\t_SSESSrr(X86_SSE_RSQRT, RS, RD)\n#define RSQRTSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_RSQRT, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define SQRTPSrr(RS, RD)\t\t_SSEPSrr(X86_SSE_SQRT, RS, RD)\n#define SQRTPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define SQRTPDrr(RS, RD)\t\t_SSEPDrr(X86_SSE_SQRT, RS, RD)\n#define SQRTPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define SQRTSSrr(RS, RD)\t\t_SSESSrr(X86_SSE_SQRT, RS, RD)\n#define SQRTSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define SQRTSDrr(RS, RD)\t\t_SSESDrr(X86_SSE_SQRT, RS, RD)\n#define SQRTSDmr(MD, MB, MI, MS, RD)\t_SSESDmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define SUBPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_SUB, RS, RD)\n#define SUBPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_SUB, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define SUBPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_SUB, RS, RD)\n#define SUBPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_SUB, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define SUBSSrr(RS, RD)\t\t\t_SSESSrr(X86_SSE_SUB, RS, RD)\n#define SUBSSmr(MD, MB, MI, MS, RD)\t_SSESSmr(X86_SSE_SUB, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define SUBSDrr(RS, RD)\t\t\t_SSESDrr(X86_SSE_SUB, RS, RD)\n#define SUBSDmr(MD, MB, MI, MS, RD)\t_SSESDmr(X86_SSE_SUB, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define XORPSrr(RS, RD)\t\t\t_SSEPSrr(X86_SSE_XOR, RS, RD)\n#define XORPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_XOR, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define XORPDrr(RS, RD)\t\t\t_SSEPDrr(X86_SSE_XOR, RS, RD)\n#define XORPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_XOR, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define XORSSrr\t\t\t\tXORPSrr\n#define XORSSmr\t\t\t\tXORPSrr\n\n/* SSE2 */\n#define XORSDrr\t\t\t\tXORPDrr\n#define XORSDmr\t\t\t\tXORPDrr\n\n/* No prefixes here.  */\n/* SSE */\n#define COMISSrr(RS, RD)\t\t_SSEPSrr(X86_SSE_COMI, RS, RD)\n#define COMISSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_COMI, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define COMISDrr(RS, RD)\t\t_SSEPDrr(X86_SSE_COMI, RS, RD)\n#define COMISDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_COMI, MD, MB, MI, MS, RD)\n\n/* No prefixes here.  */\n/* SSE */\n#define UCOMISSrr(RS, RD)\t\t_SSEPSrr(X86_SSE_UCOMI, RS, RD)\n#define UCOMISSmr(MD, MB, MI, MS, RD)\t_SSEPSmr(X86_SSE_UCOMI, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define UCOMISDrr(RS, RD)\t\t_SSEPDrr(X86_SSE_UCOMI, RS, RD)\n#define UCOMISDmr(MD, MB, MI, MS, RD)\t_SSEPDmr(X86_SSE_UCOMI, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MOVSSrr(RS, RD)\t\t\t_SSESSrr (X86_SSE_MOV, RS, RD)\n#define MOVSSmr(MD, MB, MI, MS, RD)\t_SSESSmr (X86_SSE_MOV, MD, MB, MI, MS, RD)\n#define MOVSSrm(RS, MD, MB, MI, MS)\t_SSESS1rm(X86_SSE_MOV, RS, MD, MB, MI, MS)\n\n/* SSE2 */\n#define MOVSDrr(RS, RD)\t\t\t_SSESDrr (X86_SSE_MOV, RS, RD)\n#define MOVSDmr(MD, MB, MI, MS, RD)\t_SSESDmr (X86_SSE_MOV, MD, MB, MI, MS, RD)\n#define MOVSDrm(RS, MD, MB, MI, MS)\t_SSESD1rm(X86_SSE_MOV, RS, MD, MB, MI, MS)\n\n/* SSE */\n#define MOVAPSrr(RS, RD)\t\t_SSEPSrr (X86_SSE_MOVA, RS, RD)\n#define MOVAPSmr(MD, MB, MI, MS, RD)\t_SSEPSmr (X86_SSE_MOVA, MD, MB, MI, MS, RD)\n#define MOVAPSrm(RS, MD, MB, MI, MS)\t_SSEPS1rm(X86_SSE_MOVA, RS, MD, MB, MI, MS)\n\n/* SSE2 */\n#define MOVAPDrr(RS, RD)\t\t_SSEPDrr (X86_SSE_MOVA, RS, RD)\n#define MOVAPDmr(MD, MB, MI, MS, RD)\t_SSEPDmr (X86_SSE_MOVA, MD, MB, MI, MS, RD)\n#define MOVAPDrm(RS, MD, MB, MI, MS)\t_SSEPD1rm(X86_SSE_MOVA, RS, MD, MB, MI, MS)\n\n/* SSE */\n#define CVTPS2PIrr(RS, RD)\t\t__sse_ff_rr(      X86_SSE_CVTSI, RS, RD)\n#define CVTPS2PImr(MD, MB, MI, MS, RD)\t__sse_if_mr(      X86_SSE_CVTSI, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define CVTPD2PIrr(RS, RD)\t\t _sse_ff_rr(0x66, X86_SSE_CVTSI, RS, RD)\n#define CVTPD2PImr(MD, MB, MI, MS, RD)\t _sse_id_mr(0x66, X86_SSE_CVTSI, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define CVTPI2PSrr(RS, RD)\t\t__sse_ff_rr(      X86_SSE_CVTIS, RS, RD)\n#define CVTPI2PSmr(MD, MB, MI, MS, RD)\t__sse_if_mr(      X86_SSE_CVTIS, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define CVTPI2PDrr(RS, RD)\t\t _sse_ff_rr(0x66, X86_SSE_CVTIS, RS, RD)\n#define CVTPI2PDmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0x66, X86_SSE_CVTIS, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define CVTPS2PDrr(RS, RD)\t\t__sse_ff_rr(      X86_SSE_CVTSD, RS, RD)\n#define CVTPS2PDmr(MD, MB, MI, MS, RD)\t__sse_if_mr(      X86_SSE_CVTSD, MD, MB, MI, MS, RD)\n#define CVTPD2PSrr(RS, RD)\t\t _sse_ff_rr(0x66, X86_SSE_CVTSD, RS, RD)\n#define CVTPD2PSmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0x66, X86_SSE_CVTSD, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define CVTSS2SDrr(RS, RD)\t\t _sse_ff_rr(0xf3, X86_SSE_CVTSD, RS, RD)\n#define CVTSS2SDmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0xf3, X86_SSE_CVTSD, MD, MB, MI, MS, RD)\n#define CVTSD2SSrr(RS, RD)\t\t _sse_ff_rr(0xf2, X86_SSE_CVTSD, RS, RD)\n#define CVTSD2SSmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0xf2, X86_SSE_CVTSD, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define CVTTSS2SILrr(RS, RD)\t\t _sse_id_rr(0xf3, X86_SSE_CVTTSI, RS, RD)\n#define CVTTSS2SILmr(MD, MB, MI, MS, RD) _sse_id_mr(0xf3, X86_SSE_CVTTSI, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define CVTTSD2SILrr(RS, RD)\t\t _sse_id_rr(0xf2, X86_SSE_CVTTSI, RS, RD)\n#define CVTTSD2SILmr(MD, MB, MI, MS, RD) _sse_id_mr(0xf2, X86_SSE_CVTTSI, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define CVTSS2SILrr(RS, RD)\t\t _sse_if_rr(0xf3, X86_SSE_CVTSI, RS, RD)\n#define CVTSS2SILmr(MD, MB, MI, MS, RD)\t _sse_if_mr(0xf3, X86_SSE_CVTSI, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define CVTSD2SILrr(RS, RD)\t\t _sse_id_rr(0xf2, X86_SSE_CVTSI, RS, RD)\n#define CVTSD2SILmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0xf2, X86_SSE_CVTSI, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define CVTSI2SSLrr(RS, RD)\t\t _sse_fi_rr(0xf3, X86_SSE_CVTIS, RS, RD)\n#define CVTSI2SSLmr(MD, MB, MI, MS, RD)\t _sse_if_mr(0xf3, X86_SSE_CVTIS, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define CVTSI2SDLrr(RS, RD)\t\t _sse_di_rr(0xf2, X86_SSE_CVTIS, RS, RD)\n#define CVTSI2SDLmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0xf2, X86_SSE_CVTIS, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MOVDLXrr(RS, RD)\t\t _sse_di_rr(0x66, X86_SSE_X2G, RS, RD)\n#define MOVDLXmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0x66, X86_SSE_X2G, MD, MB, MI, MS, RD)\n\n/* SSE2 */\n#define MOVDXLrr(RS, RD)\t\t _sse_ff_rr(0x66, X86_SSE_G2X, RS, RD)\n#define MOVDXLrm(RS, MD, MB, MI, MS)\t _sse_di_rm(0x66, X86_SSE_G2X, RS, MD, MB, MI, MS)\n\n/* SSE */\n#define MOVDLMrr(RS, RD)\t\t__sse_ff_rr(      X86_SSE_X2G, RS, RD)\n#define MOVDLMmr(MD, MB, MI, MS, RD)\t__sse_id_mr(      X86_SSE_X2G, MD, MB, MI, MS, RD)\n\n/* SSE */\n#define MOVDMLrr(RS, RD)\t\t__sse_ff_rr(      X86_SSE_G2X, RS, RD)\n#define MOVDMLrm(RS, MD, MB, MI, MS)\t__sse_fi_rm(      X86_SSE_G2X, RS, MD, MB, MI, MS)\n\n/* SSE3 */\n#define MOVDQ2Qrr(RS, RD)\t\t _sse_ff_rr(0xf2, X86_SSE_MOV2, RS, RD)\n#define MOVQ2DQrr(RS, RD)\t\t _sse_ff_rr(0xf3, X86_SSE_MOV2, RS, RD)\n\n/* SSE */\n#define MOVHLPSrr(RS, RD)\t\t__sse_ff_rr(      X86_SSE_MOVLP, RS, RD)\n#define MOVLHPSrr(RS, RD)\t\t__sse_ff_rr(      X86_SSE_MOVHP, RS, RD)\n\n/* SSE2 */\n#define MOVDQArr(RS, RD)\t\t _sse_ff_rr(0x66, 0x6f, RS, RD)\n#define MOVDQAmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0x66, 0x6f, MD, MB, MI, MS, RD)\n#define MOVDQArm(RS, MD, MB, MI, MS)\t _sse_di_rm(0x66, 0x7f, RS, MD, MB, MI, MS)\n\n/* SSE2 */\n#define MOVDQUrr(RS, RD)\t\t _sse_ff_rr(0xf3, 0x6f, RS, RD)\n#define MOVDQUmr(MD, MB, MI, MS, RD)\t _sse_id_mr(0xf3, 0x6f, MD, MB, MI, MS, RD)\n#define MOVDQUrm(RS, MD, MB, MI, MS)\t _sse_di_rm(0xf3, 0x7f, RS, MD, MB, MI, MS)\n\n/* SSE2 */\n#define MOVHPDmr(MD, MB, MI, MS, RD)\t _sse_id_mr (0x66, X86_SSE_MOVHP, MD, MB, MI, MS, RD)\n#define MOVHPDrm(RS, MD, MB, MI, MS)\t _sse1_di_rm(0x66, X86_SSE_MOVHP, RS, MD, MB, MI, MS)\n\n/* SSE */\n#define MOVHPSmr(MD, MB, MI, MS, RD)\t__sse_if_mr (      X86_SSE_MOVHP, MD, MB, MI, MS, RD)\n#define MOVHPSrm(RS, MD, MB, MI, MS)\t__sse1_fi_rm(      X86_SSE_MOVHP, RS, MD, MB, MI, MS)\n\n/* SSE2 */\n#define MOVLPDmr(MD, MB, MI, MS, RD)\t _sse_id_mr (0x66, X86_SSE_MOVLP, MD, MB, MI, MS, RD)\n#define MOVLPDrm(RS, MD, MB, MI, MS)\t _sse1_di_rm(0x66, X86_SSE_MOVLP, RS, MD, MB, MI, MS)\n\n/* SSE */\n#define MOVLPSmr(MD, MB, MI, MS, RD)\t__sse_if_mr (      X86_SSE_MOVLP, MD, MB, MI, MS, RD)\n#define MOVLPSrm(RS, MD, MB, MI, MS)\t__sse1_fi_rm(      X86_SSE_MOVLP, RS, MD, MB, MI, MS)\n\n/* FIXME 0x66 prefix actually required to modify 128 bits register */\n/* SSE or SSE2 with 0x66 prefix */\n#define PCMPEQBrr(RS, RD)\t\t\t\t\t\t\\\n    _sse_ff_rr(0x66, X86_SSE_EQB, RS, RD)\n#define PCMPEQBrm(RS, MD, MB, MI, MS)\t\t\t\t\t\\\n    _sse_if_mr(0x66, X86_SSE_EQB, MD, MB, MI, MS, RD)\n#define PCMPEQWrr(RS, RD)\t\t\t\t\t\t\\\n    _sse_ff_rr(0x66, X86_SSE_EQW, RS, RD)\n#define PCMPEQWrm(RS, MD, MB, MI, MS)\t\t\t\t\t\\\n    _sse_if_mr(0x66, X86_SSE_EQW, MD, MB, MI, MS, RD)\n#define PCMPEQLrr(RS, RD)\t\t\t\t\t\t\\\n    _sse_ff_rr(0x66, X86_SSE_EQD, RS, RD)\n#define PCMPEQLrm(RS, MD, MB, MI, MS)\t\t\t\t\t\\\n    _sse_if_mr(0x66, X86_SSE_EQD, MD, MB, MI, MS, RD)\n\n/* SSE2 with 0x66 prefix, SSE otherwise */\n#define PSRLWrr(RS, RD)\t\t\t\t\t\t\t\\\n    _sse_ff_rr(0x66, 0xd1, RS, RD)\n#define PSRLWrm(RS, MD, MB, MI, MS)\t\t\t\t\t\\\n    _sse_if_mr(0x66, 0xd1, MD, MB, MI, MS, RD)\n#define PSRLWir(IM, RD)\t\t\t\t\t\t\t\\\n    (_O(0x66),\t\t\t\t\t\t\t\t\\\n     _REXLrr(_NOREG, RD),\t\t\t\t\t\t\\\n     _O(0x0f),\t\t\t\t\t\t\t\t\\\n     _O(0x71),\t\t\t\t\t\t\t\t\\\n     _Mrm(_b11, _b10, _rX(RD)),\t\t\t\t\t\t\\\n     _O(IM))\n\n/* SSE2 with 0x66 prefix, SSE otherwise */\n#define PSRLLrr(RS, RD)\t\t\t\t\t\t\t\\\n    _sse_ff_rr(0x66, 0xd2, RS, RD)\n#define PSRLLrm(RS, MD, MB, MI, MS)\t\t\t\t\t\\\n    _sse_id_mr(0x66, 0xd2, MD, MB, MI, MS, RD)\n#define PSRLLir(IM, RD)\t\t\t\t\t\t\t\\\n    (_O(0x66),\t\t\t\t\t\t\t\t\\\n     _rex_if_rr(_NOREG, RD),\t\t\t\t\t\t\\\n     _O(0x0f),\t\t\t\t\t\t\t\t\\\n     _O(0x72),\t\t\t\t\t\t\t\t\\\n     _Mrm(_b11, _b10, _rX(RD)),\t\t\t\t\t\t\\\n     _O(IM))\n\n/* SSE2 */\n#define PSRLQrr(RS, RD)\t\t\t\t\t\t\t\\\n    _sse_ff_rr(0x66, 0xd3, RS, RD)\n#define PSRLQrm(RS, MD, MB, MI, MS)\t\t\t\t\t\\\n    _sse_id_mr(0x66, 0xd3, MD, MB, MI, MS, RD)\n#define PSRLQir(IM, RD)\t\t\t\t\t\t\t\\\n    (_O(0x66),\t\t\t\t\t\t\t\t\\\n     _rex_if_rr(_NOREG, RD),\t\t\t\t\t\t\\\n     _O(0x0f),\t\t\t\t\t\t\t\t\\\n     _O(0x73),\t\t\t\t\t\t\t\t\\\n     _Mrm(_b11, _b10, _rX(RD)),\t\t\t\t\t\t\\\n     _O(IM))\n\n/* SSE4.1 */\n#define ROUNDSSrri(RS, RD, IM)\t\t\t\t\t\t\\\n    (_O(0x66), _rex_ff_rr(RD, RS), _OO(0xf00|X86_SSE_ROUND), _O(0x0a),\t\\\n     _Mrm(_b11, _rX(RD), _rX(RS)), _O(IM))\n#define ROUNDSDrri(RS, RD, IM)\t\t\t\t\t\t\\\n    (_O(0x66), _rex_ff_rr(RD, RS), _OO(0xf00|X86_SSE_ROUND), _O(0x0b),\t\\\n     _Mrm(_b11, _rX(RD), _rX(RS)), _O(IM))\n#define PCMPEQQrr(RS, RD)\t\t\t\t\t\t\\\n    (_O(0x66), _rex_ff_rr(RD, RS), _OO(0x0f38), _O(0x29),\t\t\\\n     _Mrm(_b11, _rX(RD), _rX(RS)))\n\n/*** References:\t\t\t\t\t\t\t\t\t\t*/\n/*\t\t\t\t\t\t\t\t\t\t\t\t*/\n/* [1] \"Intel Architecture Software Developer's Manual Volume 1: Basic Architecture\",\t\t*/\n/*     Intel Corporation 1997.\t\t\t\t\t\t\t\t\t*/\n/*\t\t\t\t\t\t\t\t\t\t\t\t*/\n/* [2] \"Intel Architecture Software Developer's Manual Volume 2: Instruction Set Reference\",\t*/\n/*     Intel Corporation 1997.\t\t\t\t\t\t\t\t\t*/\n\n#endif\t/* LIGHTNING_DEBUG */\n#endif\t/* __lightning_asm_i386_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/core-32.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (i386 version)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000,2001,2002,2003,2006 Free Software Foundation, Inc.\n * Written by Paolo Bonzini and Matthew Flatt.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tMatthew Flatt\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n\n#ifndef __lightning_core_h\n#define __lightning_core_h\n\n#define JIT_AP\t\t\t\t_RBP\n#define JIT_R_NUM\t\t\t3\nstatic const jit_gpr_t\njit_r_order[JIT_R_NUM] = {\n    _RAX, _RCX, _RDX\n};\n#define JIT_R(i)\t\t\tjit_r_order[i]\n\n#define JIT_V_NUM\t\t\t3\nstatic const jit_gpr_t\njit_v_order[JIT_V_NUM] = {\n    _RBX, _RSI, _RDI\n};\n#define JIT_V(i)\t\t\tjit_v_order[i]\n\n#define jit_movi_i(r0, i0)\t\tx86_movi_i(_jit, r0, i0)\n__jit_inline void\nx86_movi_i(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    if (i0)\n\tMOVLir(i0, r0);\n    else\n\tXORLrr(r0, r0);\n}\n\n#define jit_movi_p(r0, i0)\t\tx86_movi_p(_jit, r0, i0)\n__jit_inline jit_insn *\nx86_movi_p(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    MOVLir((long)i0, r0);\n    return (_jit->x.pc);\n}\n\n#define jit_patch_at(jump, label)\tx86_patch_at(_jit, jump, label)\n__jit_inline void\nx86_patch_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    jit_patch_rel_int_at(jump, label);\n}\n\n#define jit_prolog(n)\t\t\tx86_prolog(_jit, n)\n__jit_inline void\nx86_prolog(jit_state_t _jit, int n)\n{\n    _jitl.framesize = 20;\n    PUSHLr(_RBX);\n    PUSHLr(_RSI);\n    PUSHLr(_RDI);\n    PUSHLr(JIT_FP);\n    MOVLrr(JIT_SP, JIT_FP);\n\n    /*   Inline emit of stack align/adjust so that arguments can be passed\n     * relative to %esp and can be patched on the fly when jit_allocai\n     * or jit_prepare* are called.\n     *   Note that it is inlined here so that if jit_allocai or\n     * jit_prepare* are never called, it is already correct, and also,\n     * this avoids a possibly not reliable check on jit_ret, as the\n     * jit code may end in a call to abort or a longjump, etc, what\n     * are valid cases to not need to call jit_ret.\n     *   Also, it cannot call SUBLir(12, JIT_SP) because that would emit\n     * a shorter opcode, with a byte immediate. */\n    _O(0x81);\n    _Mrm(_b11, X86_SUB, _rA(JIT_SP));\n    _jit_I(12);\n\n    /*   Relies on knowledge of opcode format, that has the int32 argument\n     * last. Note that patching does not care about alignment, and this\n     * int32 may not be 4 bytes aligned. */\n    _jitl.stack = ((int *)_jit->x.pc) - 1;\n    _jitl.alloca_offset = _jitl.stack_offset = _jitl.stack_length = 0;\n    _jitl.float_offset = 0;\n}\n\n#define jit_ret()\t\t\tx86_ret(_jit)\n__jit_inline void\nx86_ret(jit_state_t _jit)\n{\n    LEAVE_();\n    POPLr(_RDI);\n    POPLr(_RSI);\n    POPLr(_RBX);\n    RET_();\n}\n\n#define jit_allocai(n)\t\t\tx86_allocai(_jit, n)\n__jit_inline int\nx86_allocai(jit_state_t _jit, int length)\n{\n    assert(length >= 0);\n    _jitl.alloca_offset += length;\n    if (_jitl.alloca_offset + _jitl.stack_length > *_jitl.stack)\n\t*_jitl.stack += (length + 15) & ~15;\n    return (-_jitl.alloca_offset);\n}\n\n#define jit_prepare_i(ni)\t\tx86_prepare_i(_jit, ni)\n__jit_inline void\nx86_prepare_i(jit_state_t _jit, int count)\n{\n    assert(count >= 0 && _jitl.stack_offset == 0);\n    _jitl.stack_offset = count << 2;\n    if (jit_push_pop_p())\n\t_jitl.stack_length = _jitl.stack_offset;\n    else if (_jitl.stack_length < _jitl.stack_offset) {\n\t_jitl.stack_length = _jitl.stack_offset;\n\t*_jitl.stack = 12 + ((_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 15) & ~15);\n    }\n}\n\n#define jit_calli(p0)\t\t\tx86_calli(_jit, p0)\n__jit_inline jit_insn *\nx86_calli(jit_state_t _jit, void *p0)\n{\n    CALLm(p0);\n    return (_jitl.label = _jit->x.pc);\n}\n\n#define jit_callr(r0)\t\t\tx86_callr(_jit, r0)\n__jit_inline void\nx86_callr(jit_state_t _jit, jit_gpr_t r0)\n{\n    CALLsr(r0);\n}\n\n#define jit_patch_calli(call, label)\tx86_patch_calli(_jit, call, label)\n__jit_inline void\nx86_patch_calli(jit_state_t _jit, jit_insn *call, jit_insn *label)\n{\n    jit_patch_at(call, label);\n}\n\n#define jit_finish(p0)\t\t\tx86_finish(_jit, p0)\n__jit_inline jit_insn *\nx86_finish(jit_state_t _jit, void *p0)\n{\n    assert(_jitl.stack_offset == 0);\n    jit_calli(p0);\n    if (jit_push_pop_p() && _jitl.stack_length) {\n\tjit_addi_i(JIT_SP, JIT_SP, _jitl.stack_length);\n\t_jitl.stack_length = 0;\n    }\n\n    return (_jitl.label);\n}\n\n#define jit_finishr(r0)\t\t\tx86_finishr(_jit, r0)\n__jit_inline void\nx86_finishr(jit_state_t _jit, jit_gpr_t r0)\n{\n    assert(_jitl.stack_offset == 0);\n    jit_callr(r0);\n    if (jit_push_pop_p() && _jitl.stack_length) {\n\tjit_addi_i(JIT_SP, JIT_SP, _jitl.stack_length);\n\t_jitl.stack_length = 0;\n    }\n}\n\n#define jit_arg_i()\t\t\tx86_arg_i(_jit)\n#define jit_arg_c()\t\t\tx86_arg_i(_jit)\n#define jit_arg_uc()\t\t\tx86_arg_i(_jit)\n#define jit_arg_s()\t\t\tx86_arg_i(_jit)\n#define jit_arg_us()\t\t\tx86_arg_i(_jit)\n#define jit_arg_ui()\t\t\tx86_arg_i(_jit)\n#define jit_arg_l()\t\t\tx86_arg_i(_jit)\n#define jit_arg_ul()\t\t\tx86_arg_i(_jit)\n#define jit_arg_p()\t\t\tx86_arg_i(_jit)\n__jit_inline int\nx86_arg_i(jit_state_t _jit)\n{\n    int\t\tofs;\n\n    ofs = _jitl.framesize;\n    _jitl.framesize += sizeof(int);\n    return (ofs);\n}\n\n/* Memory */\n#define jit_ldr_c(r0, r1)\t\tx86_ldr_c(_jit, r0, r1)\n__jit_inline void\nx86_ldr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSBLmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxr_c(r0, r1, r2)\t\tx86_ldxr_c(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVSBLmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldr_s(r0, r1)\t\tx86_ldr_s(_jit, r0, r1)\n__jit_inline void\nx86_ldr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSWLmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxr_s(r0, r1, r2)\t\tx86_ldxr_s(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVSWLmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldi_c(r0, i0)\t\tx86_ldi_c(_jit, r0, i0)\n__jit_inline void\nx86_ldi_c(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    MOVSBLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxi_c(r0, r1, i0)\t\tx86_ldxi_c(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    MOVSBLmr(i0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldi_uc(r0, i0)\t\tx86_ldi_uc(_jit, r0, i0)\n__jit_inline void\nx86_ldi_uc(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    MOVZBLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxi_uc(r0, r1, i0)\t\tx86_ldxi_uc(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    MOVZBLmr(i0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_sti_c(i0, r0)\t\tx86_sti_c(_jit, i0, r0)\n__jit_inline void\nx86_sti_c(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    if (jit_reg8_p(r0))\n\tMOVBrm(r0, (long)i0, _NOREG, _NOREG, _SCL1);\n    else {\n\tjit_xchgr_i(_RAX, r0);\n\tMOVBrm(_RAX, (long)i0, _NOREG, _NOREG, _SCL1);\n\tjit_xchgr_i(_RAX, r0);\n    }\n}\n\n#define jit_stxi_c(i0, r0, r1)\t\tx86_stxi_c(_jit, i0, r0, r1)\n__jit_inline void\nx86_stxi_c(jit_state_t _jit, long i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_gpr_t\trep;\n\n    if (jit_reg8_p(r1))\n\tMOVBrm(r1, i0, r0, _NOREG, _SCL1);\n    else {\n\tif (r0 == _RAX)\n\t    rep = _RDX;\n\telse\n\t    rep = _RAX;\n\tif (r0 != r1) \n\t    jit_xchgr_i(rep, r1);\n\telse {\n\t    jit_pushr_i(rep);\n\t    MOVLrr(r1, rep);\n\t}\n\tMOVBrm(rep, i0, r0, _NOREG, _SCL1);\n\tif (r0 != r1)\n\t    jit_xchgr_i(rep, r1);\n\telse\n\t    jit_popr_i(rep);\n    }\n}\n\n#define jit_str_c(r0, r1)\t\tx86_str_c(_jit, r0, r1)\n__jit_inline void\nx86_str_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_gpr_t\trep;\n\n    if (jit_reg8_p(r1))\n\tMOVBrm(r1, 0, r0, _NOREG, _SCL1);\n    else {\n\tif (r0 == _RAX)\n\t    rep = _RDX;\n\telse\n\t    rep = _RAX;\n\tif (r0 != r1)\n\t    jit_xchgr_i(rep, r1);\n\telse {\n\t    jit_pushr_i(rep);\n\t    MOVLrr(r1, rep);\n\t}\n\tMOVBrm(rep, 0, r0, _NOREG, _SCL1);\n\tif (r0 != r1)\n\t    jit_xchgr_i(rep, r1);\n\telse\n\t    jit_popr_i(rep);\n    }\n}\n\n#define jit_stxr_c(r0, r1, r2)\t\tx86_stxr_c(_jit, r0, r1, r2)\n__jit_inline void\nx86_stxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_gpr_t\trep;\n\n    if (jit_reg8_p(r2))\n\tMOVBrm(r2, 0, r0, r1, _SCL1);\n    else {\n\tif (r0 == _RAX || r1 == _RAX) {\n\t    if (r0 == _RDX || r1 == _RDX)\n\t\trep = _RCX;\n\t    else\n\t\trep = _RDX;\n\t}\n\telse\n\t    rep = _RAX;\n\tif (r0 != r2 && r1 != r2)\n\t    jit_xchgr_i(rep, r2);\n\telse {\n\t    jit_pushr_i(rep);\n\t    MOVLrr(r2, rep);\n\t}\n\tMOVBrm(rep, 0, r0, r1, _SCL1);\n\tif (r0 != r2 && r1 != r2)\n\t    jit_xchgr_i(rep, r2);\n\telse\n\t    jit_popr_i(rep);\n    }\n}\n\n#define jit_ldi_s(r0, i0)\t\tx86_ldi_s(_jit, r0, i0)\n__jit_inline void\nx86_ldi_s(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    MOVSWLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxi_s(r0, r1, i0)\t\tx86_ldxi_s(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    MOVSWLmr(i0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldi_us(r0, i0)\t\tx86_ldi_us(_jit, r0, i0)\n__jit_inline void\nx86_ldi_us(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    MOVZWLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxi_us(r0, r1, i0)\t\tx86_ldxi_us(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    MOVZWLmr(i0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_sti_s(i0, r0)\t\tx86_sti_s(_jit, i0, r0)\n__jit_inline void\nx86_sti_s(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    MOVWrm(r0, (long)i0, _NOREG, _NOREG, _SCL1);\n}\n\n#define jit_stxi_s(i0, r0, r1)\t\tx86_stxi_s(_jit, i0, r0, r1)\n__jit_inline void\nx86_stxi_s(jit_state_t _jit, long i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVWrm(r1, i0, r0, _NOREG, _SCL1);\n}\n\n#define jit_ldi_i(r0, i0)\t\tx86_ldi_i(_jit, r0, i0)\n__jit_inline void\nx86_ldi_i(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    MOVLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxi_i(r0, r1, i0)\t\tx86_ldxi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    MOVLmr(i0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldr_i(r0, r1)\t\tx86_ldr_i(_jit, r0, r1)\n__jit_inline void\nx86_ldr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVLmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxr_i(r0, r1, r2)\t\tx86_ldxr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVLmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_sti_i(i0, r0)\t\tx86_sti_i(_jit, i0, r0)\n__jit_inline void\nx86_sti_i(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    MOVLrm(r0, (long)i0, _NOREG, _NOREG, _SCL1);\n}\n\n#define jit_stxi_i(i0, r0, r1)\t\tx86_stxi_i(_jit, i0, r0, r1)\n__jit_inline void\nx86_stxi_i(jit_state_t _jit, long i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVLrm(r1, i0, r0, _NOREG, _SCL1);\n}\n\n#define jit_pusharg_i(r0)\t\tx86_pusharg_i(_jit, r0)\n__jit_inline void\nx86_pusharg_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    _jitl.stack_offset -= sizeof(int);\n    assert(_jitl.stack_offset >= 0);\n    if (jit_push_pop_p()) {\n\tint\tpad = -_jitl.stack_length & 15;\n\tif (pad) {\n\t    jit_subi_i(JIT_SP, JIT_SP, pad + sizeof(int));\n\t    _jitl.stack_length += pad;\n\t    jit_str_i(JIT_SP, r0);\n\t}\n\telse\n\t    jit_pushr_i(r0);\n    }\n    else\n\tjit_stxi_i(_jitl.stack_offset, JIT_SP, r0);\n}\n\n#endif /* __lightning_core_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/core-64.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (i386 version)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000,2001,2002,2003,2006,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tMatthew Flatt\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n\n#ifndef __lightning_core_h\n#define __lightning_core_h\n\nstatic const jit_gpr_t\njit_arg_reg_order[] = {\n    _RDI, _RSI, _RDX, _RCX, _R8, _R9\n};\n\n#define JIT_REXTMP\t\t\t_R12\n\n/* Number or integer argument registers */\n#define JIT_ARG_MAX\t\t\t6\n\n/* Number of float argument registers */\n#define JIT_FP_ARG_MAX\t\t\t8\n\n#define JIT_R_NUM\t\t\t3\nstatic const jit_gpr_t\njit_r_order[JIT_R_NUM] = {\n    _RAX, _R10, _R11\n};\n#define JIT_R(i)\t\t\tjit_r_order[i]\n\n#define JIT_V_NUM\t\t\t3\nstatic const jit_gpr_t\njit_v_order[JIT_R_NUM] = {\n    _RBX, _R13, _R14\n};\n#define JIT_V(i)\t\t\tjit_v_order[i]\n\n#define jit_allocai(n)\t\t\tx86_allocai(_jit, n)\n__jit_inline int\nx86_allocai(jit_state_t _jit, int length)\n{\n    assert(length >= 0);\n    _jitl.alloca_offset += length;\n    if (_jitl.alloca_offset + _jitl.stack_length > *_jitl.stack)\n\t*_jitl.stack += (length + 15) & ~15;\n    return (-_jitl.alloca_offset);\n}\n\n#define jit_movi_p(r0, i0)\t\tx86_movi_p(_jit, r0, i0)\n__jit_inline jit_insn *\nx86_movi_p(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    MOVQir((long)i0, r0);\n    return (_jit->x.pc);\n}\n\n#define jit_movi_l(r0, i0)\t\tx86_movi_l(_jit, r0, i0)\n#define jit_movi_ul(r0, i0)\t\tx86_movi_l(_jit, r0, i0)\n/* ensure proper zero/sign extension */\n#define jit_movi_i(r0, i0)\t\tx86_movi_l(_jit, r0, (long)(int)i0)\n#define jit_movi_ui(r0, i0)\t\tx86_movi_l(_jit, r0, (_ul)(_ui)i0)\n__jit_inline void\nx86_movi_l(jit_state_t _jit, jit_gpr_t r0, long i0)\n{\n    if (i0) {\n\tif (jit_can_zero_extend_int_p(i0))\n\t    MOVLir(i0, r0);\n\telse\n\t    MOVQir(i0, r0);\n    }\n    else\n\tXORQrr(r0, r0);\n}\n\n/* Return address is 8 bytes, plus 5 registers = 40 bytes, total = 48 bytes. */\n#define jit_prolog(n)\t\t\tx86_prolog(_jit, n)\n__jit_inline void\nx86_prolog(jit_state_t _jit, int n)\n{\n    /* offset of stack arguments */\n    _jitl.framesize = 48;\n    /* offsets of arguments */\n    _jitl.nextarg_getfp = _jitl.nextarg_geti = 0;\n    /* stack frame */\n    PUSHQr(_RBX);\n    PUSHQr(_R12);\n    PUSHQr(_R13);\n    PUSHQr(_R14);\n    PUSHQr(JIT_FP);\n    MOVQrr(JIT_SP, JIT_FP);\n\n    /*  Adjust stack only once for alloca and stack arguments */\n    _REXQrr(_NOREG, JIT_SP);\n    _O(0x81);\n    _Mrm(_b11, X86_SUB, _rA(JIT_SP));\n    _jit_I(0);\n\n    _jitl.stack = ((int *)_jit->x.pc) - 1;\n    _jitl.alloca_offset = _jitl.stack_offset = _jitl.stack_length = 0;\n    _jitl.float_offset = 0;\n}\n\n#define jit_ret()\t\t\tx86_ret(_jit)\n__jit_inline void\nx86_ret(jit_state_t _jit)\n{\n    LEAVE_();\n    POPQr(_R14);\n    POPQr(_R13);\n    POPQr(_R12);\n    POPQr(_RBX);\n    RET_();\n}\n\n#define jit_calli(i0)\t\t\tx86_calli(_jit, i0)\n__jit_inline jit_insn *\nx86_calli(jit_state_t _jit, void *i0)\n{\n    MOVQir((long)i0, JIT_REXTMP);\n    _jitl.label = _jit->x.pc;\n    CALLsr(JIT_REXTMP);\n    return (_jitl.label);\n}\n\n#define jit_callr(r0)\t\t\tx86_callr(_jit, r0)\n__jit_inline void\nx86_callr(jit_state_t _jit, jit_gpr_t r0)\n{\n    CALLsr(r0);\n}\n\n#define jit_patch_calli(call, label)\tx86_patch_calli(_jit, call, label)\n__jit_inline void\nx86_patch_calli(jit_state_t _jit, jit_insn *call, jit_insn *label)\n{\n    jit_patch_movi(call, label);\n}\n\n#define jit_prepare_i(ni)\t\tx86_prepare_i(_jit, ni)\n__jit_inline void\nx86_prepare_i(jit_state_t _jit, int count)\n{\n    assert(count\t\t>= 0 &&\n\t   _jitl.stack_offset\t== 0 &&\n\t   _jitl.nextarg_puti\t== 0 &&\n\t   _jitl.nextarg_putfp\t== 0 &&\n\t   _jitl.fprssize\t== 0);\n\n    /* offset of right to left integer argument */\n    _jitl.nextarg_puti = count;\n\n    /* update stack offset and check if need to patch stack adjustment */\n    if (_jitl.nextarg_puti > JIT_ARG_MAX) {\n\t_jitl.stack_offset = (_jitl.nextarg_puti - JIT_ARG_MAX) << 3;\n\tif (jit_push_pop_p())\n\t    _jitl.stack_length = _jitl.stack_offset;\n\telse if (_jitl.stack_length < _jitl.stack_offset) {\n\t    _jitl.stack_length = _jitl.stack_offset;\n\t    *_jitl.stack = (_jitl.alloca_offset +\n\t\t\t    _jitl.stack_length + 15) & ~15;\n\t}\n    }\n}\n\n#define jit_patch_at(jump, label)\tx86_patch_at(_jit, jump, label)\n__jit_inline void\nx86_patch_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    if (_jitl.long_jumps)\n\tjit_patch_abs_long_at(jump - 3, label);\n    else\n\tjit_patch_rel_int_at(jump, label);\n}\n\n/* ALU */\n#define jit_negr_l(r0, r1)\t\tx86_negr_l(_jit, r0, r1)\n__jit_inline void\nx86_negr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tNEGQr(r0);\n    else {\n\tXORLrr(r0, r0);\n\tSUBQrr(r1, r0);\n    }\n}\n\n#define jit_notr_l(r0, r1)\t\tx86_notr_l(_jit, r0, r1)\n__jit_inline void\nx86_notr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_movr_l(r0, r1);\n    NOTQr(r0);\n}\n\n#define jit_addi_l(r0, r1, i0)\t\tx86_addi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_addi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0 == 0)\n\tjit_movr_l(r0, r1);\n    else if (i0 == 1) {\n\tjit_movr_l(r0, r1);\n\tINCQr(r0);\n    }\n    else if (i0 == -1) {\n\tjit_movr_l(r0, r1);\n\tDECQr(r0);\n    }\n    else if (jit_can_sign_extend_int_p(i0)) {\n\tif (r0 == r1)\n\t    ADDQir(i0, r0);\n\telse\n\t    LEAQmr(i0, r1, _NOREG, _SCL1, r0);\n    }\n    else if (r0 != r1) {\n\tMOVQir(i0, r0);\n\tADDQrr(r1, r0);\n    }\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tADDQrr(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_addr_l(r0, r1, r2)\t\tx86_addr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_addr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1)\n\tADDQrr(r2, r0);\n    else if (r0 == r2)\n\tADDQrr(r1, r0);\n    else\n\tLEAQmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_subi_l(r0, r1, i0)\t\tx86_subi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_subi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0 == 0)\n\tjit_movr_l(r0, r1);\n    else if (i0 == 1) {\n\tjit_movr_l(r0, r1);\n\tDECQr(r0);\n    }\n    else if (i0 == -1) {\n\tjit_movr_l(r0, r1);\n\tINCQr(r0);\n    }\n    else if (jit_can_sign_extend_int_p(i0)) {\n\tif (r0 == r1)\n\t    SUBQir(i0, r0);\n\telse\n\t    LEAQmr(-i0, r1, _NOREG, _SCL1, r0);\n    }\n    else if (r0 != r1) {\n\tMOVQir(-i0, r0);\n\tADDQrr(r1, r0);\n    }\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tSUBQrr(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_subr_l(r0, r1, r2)\t\tx86_subr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_subr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tXORQrr(r0, r0);\n    else if (r0 == r2) {\n\tSUBQrr(r1, r0);\n\tNEGQr(r0);\n    }\n    else {\n\tjit_movr_l(r0, r1);\n\tSUBQrr(r2, r0);\n    }\n}\n\n/* o Immediates are sign extended\n * o CF (C)arry (F)lag is set when interpreting it as unsigned addition\n * o OF (O)verflow (F)lag is set when interpreting it as signed addition\n */\n/* Commutative */\n#define jit_addci_ul(r0, r1, i0)\tx86_addci_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_addci_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (jit_can_sign_extend_int_p(i0)) {\n\tjit_movr_l(r0, r1);\n\tADDQir(i0, r0);\n    }\n    else if (r0 == r1) {\n\tMOVQir(i0, JIT_REXTMP);\n\tADDQrr(JIT_REXTMP, r0);\n    }\n    else {\n\tMOVQir(i0, r0);\n\tADDQrr(r1, r0);\n    }\n}\n\n#define jit_addcr_ul(r0, r1, r2)\tx86_addcr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_addcr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r2)\n\tADDQrr(r1, r0);\n    else if (r0 == r1)\n\tADDQrr(r2, r0);\n    else {\n\tMOVQrr(r1, r0);\n\tADDQrr(r2, r0);\n    }\n}\n\n#define jit_addxi_ul(r0, r1, i0)\tx86_addxi_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_addxi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (jit_can_sign_extend_int_p(i0)) {\n\tjit_movr_l(r0, r1);\n\tADCQir(i0, r0);\n    }\n    else if (r0 == r1) {\n\tMOVQir(i0, JIT_REXTMP);\n\tADCQrr(JIT_REXTMP, r0);\n    }\n    else {\n\tMOVQir(i0, r0);\n\tADCQrr(r1, r0);\n    }\n}\n\n#define jit_addxr_ul(r0, r1, r2)\tx86_addxr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_addxr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r2)\n\tADCQrr(r1, r0);\n    else if (r0 == r1)\n\tADCQrr(r2, r0);\n    else {\n\tMOVQrr(r1, r0);\n\tADCQrr(r2, r0);\n    }\n}\n\n/* Non commutative */\n#define jit_subci_ul(r0, r1, i0)\tx86_subci_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_subci_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movr_l(r0, r1);\n    if (jit_can_sign_extend_int_p(i0))\n\tSUBQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tSUBQrr(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_subcr_ul(r0, r1, r2)\tx86_subcr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_subcr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r2 && r0 != r1) {\n\tMOVQrr(r0, JIT_REXTMP);\n\tMOVQrr(r1, r0);\n\tSUBQrr(JIT_REXTMP, r0);\n    }\n    else {\n\tjit_movr_l(r0, r1);\n\tSUBQrr(r2, r0);\n    }\n}\n\n#define jit_subxi_ul(r0, r1, i0)\tx86_subxi_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_subxi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movr_l(r0, r1);\n    if (jit_can_sign_extend_int_p(i0))\n\tSBBQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tSBBQrr(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_subxr_ul(r0, r1, r2)\tx86_subxr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_subxr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r2 && r0 != r1) {\n\tMOVQrr(r0, JIT_REXTMP);\n\tMOVQrr(r1, r0);\n\tSBBQrr(JIT_REXTMP, r0);\n    }\n    else {\n\tjit_movr_l(r0, r1);\n\tSBBQrr(r2, r0);\n    }\n}\n\n#define jit_andi_l(r0, r1, i0)\t\tx86_andi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_andi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0 == 0)\n\tXORQrr(r0, r0);\n    else if (i0 == -1)\n\tjit_movr_l(r0, r1);\n    else if (r0 == r1) {\n\tif (jit_can_sign_extend_int_p(i0))\n\t    ANDQir(i0, r0);\n\telse {\n\t    MOVQir(i0, JIT_REXTMP);\n\t    ANDQrr(JIT_REXTMP, r0);\n\t}\n    }\n    else {\n\tMOVQir(i0, r0);\n\tANDQrr(r1, r0);\n    }\n}\n\n#define jit_andr_l(r0, r1, r2)\t\tx86_andr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_andr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tjit_movr_l(r0, r1);\n    else if (r0 == r1)\n\tANDQrr(r2, r0);\n    else if (r0 == r2)\n\tANDQrr(r1, r0);\n    else {\n\tMOVQrr(r1, r0);\n\tANDQrr(r2, r0);\n    }\n}\n\n#define jit_ori_l(r0, r1, i0)\t\tx86_ori_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_ori_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0 == 0)\n\tjit_movr_l(r0, r1);\n    else if (i0 == -1)\n\tMOVQir(-1, r0);\n    else if (r0 == r1) {\n\tif (jit_can_sign_extend_char_p(i0))\n\t    ORBir(i0, r0);\n\telse if (jit_can_sign_extend_int_p(i0))\n\t    ORQir(i0, r0);\n\telse {\n\t    MOVQir(i0, JIT_REXTMP);\n\t    ORQrr(JIT_REXTMP, r0);\n\t}\n    }\n    else {\n\tMOVQir(i0, r0);\n\tORQrr(r1, r0);\n    }\n}\n\n#define jit_orr_l(r0, r1, r2)\t\tx86_orr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_orr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tjit_movr_l(r0, r1);\n    else if (r0 == r1)\n\tORQrr(r2, r0);\n    else if (r0 == r2)\n\tORQrr(r1, r0);\n    else {\n\tMOVQrr(r1, r0);\n\tORQrr(r2, r0);\n    }\n}\n\n#define jit_xori_l(r0, r1, i0)\t\tx86_xori_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_xori_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0 == 0)\n\tjit_movr_l(r0, r1);\n    else if (i0 == -1) {\n\tjit_movr_l(r0, r1);\n\tNOTQr(r0);\n    }\n    else {\n\tif (jit_can_sign_extend_char_p(i0)) {\n\t    jit_movr_l(r0, r1);\n\t    XORBir(i0, r0);\n\t}\n\telse if (jit_can_sign_extend_int_p(i0)) {\n\t    jit_movr_l(r0, r1);\n\t    XORQir(i0, r0);\n\t}\n\telse {\n\t    if (r0 == r1) {\n\t\tMOVQir(i0, JIT_REXTMP);\n\t\tXORQrr(JIT_REXTMP, r0);\n\t    }\n\t    else {\n\t\tMOVQir(i0, r0);\n\t\tXORQrr(r1, r0);\n\t    }\n\t}\n    }\n}\n\n#define jit_xorr_l(r0, r1, r2)\t\tx86_xorr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_xorr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tXORLrr(r0, r0);\n    else if (r0 == r1)\n\tXORQrr(r2, r0);\n    else if (r0 == r2)\n\tXORQrr(r1, r0);\n    else {\n\tMOVQrr(r1, r0);\n\tXORQrr(r2, r0);\n    }\n}\n\n#define jit_muli_l(r0, r1, i0)\t\tx86_muli_l(_jit, r0, r1, i0)\n#define jit_muli_ul(r0, r1, i0)\t\tx86_muli_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_muli_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    switch (i0) {\n\tcase 0:\n\t    XORLrr(r0, r0);\n\t    break;\n\tcase 1:\n\t    jit_movr_l(r0, r1);\n\t    break;\n\tcase -1:\n\t    jit_negr_l(r0, r1);\n\t    break;\n\tcase 2:\n\t    LEAQmr(0, _NOREG, r1, _SCL2, r0);\n\t    break;\n\tcase 4:\n\t    LEAQmr(0, _NOREG, r1, _SCL4, r0);\n\t    break;\n\tcase 8:\n\t    LEAQmr(0, _NOREG, r1, _SCL8, r0);\n\t    break;\n\tdefault:\n\t    if (i0 > 0 && !(i0 & (i0 - 1))) {\n\t\tjit_movr_l(r0, r1);\n\t\tSHLQir(ffsl(i0) - 1, r0);\n\t    }\n\t    else if (jit_can_sign_extend_int_p(i0))\n\t\tIMULQirr(i0, r1, r0);\n\t    else if (r0 == r1) {\n\t\tMOVQir(i0, JIT_REXTMP);\n\t\tIMULQrr(JIT_REXTMP, r0);\n\t    }\n\t    else {\n\t\tMOVQir(i0, r0);\n\t\tIMULQrr(r1, r0);\n\t    }\n\t    break;\n    }\n}\n\n#define jit_mulr_l(r0, r1, r2)\t\tx86_mulr_l(_jit, r0, r1, r2)\n#define jit_mulr_ul(r0, r1, r2)\t\tx86_mulr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_mulr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1)\n\tIMULQrr(r2, r0);\n    else if (r0 == r2)\n\tIMULQrr(r1, r0);\n    else {\n\tMOVQrr(r1, r0);\n\tIMULQrr(r2, r0);\n    }\n}\n\n/*  Instruction format is:\n *\timul reg64/mem64\n *  and the result is stored in %rdx:%rax\n *  %rax = low 64 bits\n *  %rdx = high 64 bits\n */\n#define jit_muli_l_(r0, i0)\t\tx86_muli_l_(_jit, r0, i0)\n__jit_inline void\nx86_muli_l_(jit_state_t _jit, jit_gpr_t r0, long i0)\n{\n    if (r0 == _RAX) {\n\tjit_movi_l(_RDX, i0);\n\tIMULQr(_RDX);\n    }\n    else {\n\tjit_movi_l(_RAX, i0);\n\tIMULQr(r0);\n    }\n}\n\n#define jit_hmuli_l(r0, r1, i0)\t\tx86_hmuli_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_hmuli_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (r0 == _RDX) {\n\tMOVQrr(_RAX, JIT_REXTMP);\n\tjit_muli_l_(r1, i0);\n\tMOVQrr(JIT_REXTMP, _RAX);\n    }\n    else if (r0 == _RAX) {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_muli_l_(r1, i0);\n\tMOVQrr(_RDX, _RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n    else {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_pushr_l(_RAX);\n\tjit_muli_l_(r1, i0);\n\tMOVQrr(_RDX, r0);\n\tjit_popr_l(_RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n}\n\n#define jit_mulr_l_(r0, r1)\t\tx86_mulr_l_(_jit, r0, r1)\n__jit_inline void\nx86_mulr_l_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r1 == _RAX)\n\tIMULQr(r0);\n    else if (r0 == _RAX)\n\tIMULQr(r1);\n    else {\n\tMOVQrr(r1, _RAX);\n\tIMULQr(r0);\n    }\n}\n\n#define jit_hmulr_l(r0, r1, r2)\t\tx86_hmulr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_hmulr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == _RDX) {\n\tMOVQrr(_RAX, JIT_REXTMP);\n\tjit_mulr_l_(r1, r2);\n\tMOVQrr(JIT_REXTMP, _RAX);\n    }\n    else if (r0 == _RAX) {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_mulr_l_(r1, r2);\n\tMOVQrr(_RDX, _RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n    else {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_pushr_l(_RAX);\n\tjit_mulr_l_(r1, r2);\n\tMOVQrr(_RDX, r0);\n\tjit_popr_l(_RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n}\n\n/*  Instruction format is:\n *\tmul reg64/mem64\n *  and the result is stored in %rdx:%rax\n *  %rax = low 64 bits\n *  %rdx = high 64 bits\n */\n#define jit_muli_ul_(r0, i0)\t\tx86_muli_ul_(_jit, r0, i0)\n__jit_inline void\nx86_muli_ul_(jit_state_t _jit, jit_gpr_t r0, unsigned long i0)\n{\n    if (r0 == _RAX) {\n\tjit_movi_ul(_RDX, i0);\n\tMULQr(_RDX);\n    }\n    else {\n\tjit_movi_ul(_RAX, i0);\n\tMULQr(r0);\n    }\n}\n\n#define jit_hmuli_ul(r0, r1, i0)\tx86_hmuli_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_hmuli_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (r0 == _RDX) {\n\tMOVQrr(_RAX, JIT_REXTMP);\n\tjit_muli_ul_(r1, i0);\n\tMOVQrr(JIT_REXTMP, _RAX);\n    }\n    else if (r0 == _RAX) {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_muli_ul_(r1, i0);\n\tMOVQrr(_RDX, _RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n    else {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_pushr_l(_RAX);\n\tjit_muli_ul_(r1, i0);\n\tMOVQrr(_RDX, r0);\n\tjit_popr_l(_RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n}\n\n#define jit_mulr_ul_(r0, r1)\t\tx86_mulr_ul_(_jit, r0, r1)\n__jit_inline void\nx86_mulr_ul_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r1 == _RAX)\n\tMULQr(r0);\n    else if (r0 == _RAX)\n\tMULQr(r1);\n    else {\n\tMOVQrr(r1, _RAX);\n\tMULQr(r0);\n    }\n}\n\n#define jit_hmulr_ul(r0, r1, r2)\tx86_hmulr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_hmulr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == _RDX) {\n\tMOVQrr(_RAX, JIT_REXTMP);\n\tjit_mulr_ul_(r1, r2);\n\tMOVQrr(JIT_REXTMP, _RAX);\n    }\n    else if (r0 == _RAX) {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_mulr_ul_(r1, r2);\n\tMOVQrr(_RDX, _RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n    else {\n\tMOVQrr(_RDX, JIT_REXTMP);\n\tjit_pushr_l(_RAX);\n\tjit_mulr_ul_(r1, r2);\n\tMOVQrr(_RDX, r0);\n\tjit_popr_l(_RAX);\n\tMOVQrr(JIT_REXTMP, _RDX);\n    }\n}\n\n#define jit_divi_l_(r0, r1, i0, i1, i2)\tx86_divi_l_(_jit, r0, r1, i0, i1, i2)\n__jit_inline void\nx86_divi_l_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0,\n\t    int sign, int divide)\n{\n    jit_gpr_t\tdiv;\n\n    if (divide) {\n\tswitch (i0) {\n\t    case 1:\n\t\tjit_movr_l(r0, r1);\n\t\treturn;\n\t    case -1:\n\t\tif (sign) {\n\t\t    jit_negr_l(r0, r1);\n\t\t    return;\n\t\t}\n\t\tbreak;\n\t    default:\n\t\tif (i0 > 0 && !(i0 & (i0 - 1))) {\n\t\t    jit_movr_l(r0, r1);\n\t\t    _ROTSHIQir(sign ? X86_SAR : X86_SHR, ffsl(i0) - 1, r0);\n\t\t    return;\n\t\t}\n\t\tbreak;\n\t}\n    }\n    else if (i0 == 1 || (sign && i0 == -1)) {\n\tXORLrr(r0, r0);\n\treturn;\n    }\n    else if (!sign && i0 > 0 && !(i0 & (i0 - 1))) {\n\tif (jit_can_sign_extend_int_p(i0)) {\n\t    jit_movr_l(r0, r1);\n\t    ANDQir(i0 - 1, r0);\n\t}\n\telse if (r0 != r1) {\n\t    MOVQir(i0 - 1, r0);\n\t    ANDQrr(r1, r0);\n\t}\n\telse {\n\t    MOVQir(i0 - 1, JIT_REXTMP);\n\t    ANDQrr(JIT_REXTMP, r0);\n\t}\n\treturn;\n    }\n\n    if (r0 == _RAX) {\n\tjit_pushr_l(_RDX);\n\tdiv = JIT_REXTMP;\n    }\n    else if (r0 == _RDX) {\n\tjit_pushr_l(_RAX);\n\tdiv = JIT_REXTMP;\n    }\n    else if (r0 == r1) {\n\tjit_pushr_l(_RDX);\n\tjit_pushr_l(_RAX);\n\tdiv = JIT_REXTMP;\n    }\n    else {\n\tjit_pushr_l(_RDX);\n\tMOVQrr(_RAX, JIT_REXTMP);\n\tdiv = r0;\n    }\n\n    MOVQir(i0, div);\n    jit_movr_l(_RAX, r1);\n\n    if (sign) {\n\tCQO_();\n\tIDIVQr(div);\n    }\n    else {\n\tXORQrr(_RDX, _RDX);\n\tDIVQr(div);\n    }\n\n    if (r0 != _RAX) {\n\tif (divide)\n\t    MOVQrr(_RAX, r0);\n\tif (div == JIT_REXTMP)\n\t    jit_popr_l(_RAX);\n\telse\n\t    MOVQrr(JIT_REXTMP, _RAX);\n    }\n    if (r0 != _RDX) {\n\tif (!divide)\n\t    MOVQrr(_RDX, r0);\n\tjit_popr_l(_RDX);\n    }\n}\n\n#define jit_divr_l_(r0, r1, r2, i0, i1)\tx86_divr_l_(_jit, r0, r1, r2, i0, i1)\n__jit_inline void\nx86_divr_l_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2,\n\t     int sign, int divide)\n{\n    jit_gpr_t\tdiv;\n\n    if (r0 != _RDX)\n\tjit_pushr_l(_RDX);\n    if (r0 != _RAX)\n\tjit_pushr_l(_RAX);\n\n    if (r2 == _RAX) {\n\tif (r0 == _RAX || r0 == _RDX) {\n\t    div = JIT_REXTMP;\n\t    MOVQrr(_RAX, div);\n\t    if (r1 != _RAX)\n\t\tMOVQrr(r1, _RAX);\n\t}\n\telse {\n\t    if (r0 == r1)\n\t\tjit_xchgr_l(_RAX, r0);\n\t    else {\n\t\tif (r0 != _RAX)\n\t\t    MOVQrr(_RAX, r0);\n\t\tif (r1 != _RAX)\n\t\t    MOVQrr(r1, _RAX);\n\t    }\n\t    div = r0;\n\t}\n    }\n    else if (r2 == _RDX) {\n\tif (r0 == _RAX || r0 == _RDX) {\n\t    div = JIT_REXTMP;\n\t    MOVQrr(_RDX, div);\n\t    if (r1 != _RAX)\n\t\tMOVQrr(r1, _RAX);\n\t}\n\telse {\n\t    if (r1 != _RAX)\n\t\tMOVQrr(r1, _RAX);\n\t    MOVQrr(_RDX, r0);\n\t    div = r0;\n\t}\n    }\n    else {\n\tif (r1 != _RAX)\n\t    MOVQrr(r1, _RAX);\n\tdiv = r2;\n    }\n\n    if (sign) {\n\tCQO_();\n\tIDIVQr(div);\n    }\n    else {\n\tXORLrr(_RDX, _RDX);\n\tDIVQr(div);\n    }\n\n    if (r0 != _RAX) {\n\tif (divide)\n\t    MOVQrr(_RAX, r0);\n\tjit_popr_l(_RAX);\n    }\n    if (r0 != _RDX) {\n\tif (!divide)\n\t    MOVQrr(_RDX, r0);\n\tjit_popr_l(_RDX);\n    }\n}\n\n#define jit_divi_l(r0, r1, i0)\t\tx86_divi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_divi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_divi_l_(r0, r1, i0, 1, 1);\n}\n\n#define jit_divr_l(r0, r1, r2)\t\tx86_divr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_divr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_l_(r0, r1, r2, 1, 1);\n}\n\n#define jit_divi_ul(r0, r1, i0)\t\tx86_divi_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_divi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_divi_l_(r0, r1, i0, 0, 1);\n}\n\n#define jit_divr_ul(r0, r1, r2)\t\tx86_divr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_divr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_l_(r0, r1, r2, 0, 1);\n}\n\n#define jit_modi_l(r0, r1, i0)\t\tx86_modi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_modi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_divi_l_(r0, r1, i0, 1, 0);\n}\n\n#define jit_modr_l(r0, r1, r2)\t\tx86_modr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_modr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_l_(r0, r1, r2, 1, 0);\n}\n\n#define jit_modi_ul(r0, r1, i0)\t\tx86_modi_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_modi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_divi_l_(r0, r1, i0, 0, 0);\n}\n\n#define jit_modr_ul(r0, r1, r2)\t\tx86_modr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_modr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_l_(r0, r1, r2, 0, 0);\n}\n\n/*  Instruction format is:\n *  <shift> %r0 %r1\n *\t%r0 <shift>= %r1\n *  only %cl can be used as %r1\n */\n#define jit_shift64(r0, r1, r2, i0)\tx86_shift64(_jit, r0, r1, r2, i0)\n__jit_inline void\nx86_shift64(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2,\n\t    x86_rotsh_t cc)\n{\n    if (r0 == _RCX) {\n\tMOVQrr(r1, JIT_REXTMP);\n\tif (r2 != _RCX)\n\t    MOVBrr(r2, _RCX);\n\t_ROTSHIQrr(cc, _RCX, JIT_REXTMP);\n\tMOVQrr(JIT_REXTMP, _RCX);\n    }\n    else if (r2 != _RCX) {\n\tMOVQrr(_RCX, JIT_REXTMP);\n\tMOVBrr(r2, _RCX);\n\tjit_movr_l(r0, r1);\n\t_ROTSHIQrr(cc, _RCX, r0);\n\tMOVQrr(JIT_REXTMP, _RCX);\n    }\n    else {\n\tjit_movr_l(r0, r1);\n\t_ROTSHIQrr(cc, _RCX, r0);\n    }\n}\n\n#define jit_lshi_l(r0, r1, i0)\t\tx86_lshi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_lshi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    if (i0 == 0)\n\tjit_movr_l(r0, r1);\n    else if (i0 <= 3)\n\tLEAQmr(0, _NOREG, r1, i0 == 1 ? _SCL2 : i0 == 2 ? _SCL4 : _SCL8, r0);\n    else {\n\tjit_movr_l(r0, r1);\n\tSHLQir(i0, r0);\n    }\n}\n\n#define jit_lshr_l(r0, r1, r2)\t\tx86_lshr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_lshr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_shift64(r0, r1, r2, X86_SHL);\n}\n\n#define jit_rshi_l(r0, r1, i0)\t\tx86_rshi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_rshi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    jit_movr_l(r0, r1);\n    if (i0)\n\tSARQir(i0, r0);\n}\n\n#define jit_rshr_l(r0, r1, r2)\t\tx86_rshr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_rshr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_shift64(r0, r1, r2, X86_SAR);\n}\n\n#define jit_rshi_ul(r0, r1, i0)\t\tx86_rshi_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_rshi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    jit_movr_l(r0, r1);\n    if (i0)\n\tSHRQir(i0, r0);\n}\n\n#define jit_rshr_ul(r0, r1, r2)\t\tx86_rshr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_rshr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_shift64(r0, r1, r2, X86_SHR);\n}\n\n/* Boolean */\n#define jit_cmp_ri64(r0, r1, i0, i1)\tx86_cmp_ri64(_jit, r0, r1, i0, i1)\n__jit_inline void\nx86_cmp_ri64(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0, x86_cc_t cc)\n{\n    int\t\tsame = r0 == r1;\n\n    if (!same)\n\t/* XORLrr is cheaper */\n\tXORLrr(r0, r0);\n    if (jit_can_sign_extend_int_p(i0))\n\tCMPQir(i0, r1);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tCMPQrr(JIT_REXTMP, r1);\n    }\n    if (same)\n\t/* MOVLir is cheaper */\n\tMOVLir(0, r0);\n    SETCCir(cc, r0);\n}\n\n#define jit_test_r64(r0, r1, i0)\tx86_test_r64(_jit, r0, r1, i0)\n__jit_inline void\nx86_test_r64(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, x86_cc_t cc)\n{\n    int\t\tsame = r0 == r1;\n\n    if (!same)\n\tXORLrr(r0, r0);\n    TESTQrr(r1, r1);\n    if (same)\n\tMOVLir(0, r0);\n    SETCCir(cc, r0);\n}\n\n#define jit_cmp_rr64(r0, r1, r2, i0)\tx86_cmp_rr64(_jit, r0, r1, r2, i0)\n__jit_inline void\nx86_cmp_rr64(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2,\n\t     x86_cc_t cc)\n{\n    int\t\tsame = r0 == r1 || r0 == r2;\n\n    if (!same)\n\tXORLrr(r0, r0);\n    CMPQrr(r2, r1);\n    if (same)\n\tMOVLir(0, r0);\n    SETCCir(cc, r0);\n}\n\n#define jit_lti_l(r0, r1, i0)\t\tx86_lti_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_lti_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0)\n\tjit_cmp_ri64(r0, r1, i0,\tX86_CC_L);\n    else\n\tjit_test_r64(r0, r1,\t\tX86_CC_S);\n}\n\n#define jit_ltr_l(r0, r1, r2)\t\tx86_ltr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_ltr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr64(r0, r1, r2,\t\tX86_CC_L);\n}\n\n#define jit_lei_l(r0, r1, i0)\t\tx86_lei_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_lei_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_cmp_ri64(r0, r1, i0,\t\tX86_CC_LE);\n}\n\n#define jit_ler_l(r0, r1, r2)\t\tx86_ler_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_ler_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr64(r0, r1, r2,\tX86_CC_LE);\n}\n\n#define jit_eqi_l(r0, r1, i0)\t\tx86_eqi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_eqi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0)\n\tjit_cmp_ri64(r0, r1, i0,\tX86_CC_E);\n    else\n\tjit_test_r64(r0, r1,\t\tX86_CC_E);\n}\n\n#define jit_eqr_l(r0, r1, r2)\t\tx86_eqr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_eqr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr64(r0, r1, r2,\tX86_CC_E);\n}\n\n#define jit_gei_l(r0, r1, i0)\t\tx86_gei_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_gei_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0)\n\tjit_cmp_ri64(r0, r1, i0,\tX86_CC_GE);\n    else\n\tjit_test_r64(r0, r1,\t\tX86_CC_NS);\n}\n\n#define jit_ger_l(r0, r1, r2)\t\tx86_ger_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_ger_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr64(r0, r1, r2,\tX86_CC_GE);\n}\n\n#define jit_gti_l(r0, r1, i0)\t\tx86_gti_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_gti_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_cmp_ri64(r0, r1, i0,\t\tX86_CC_G);\n}\n\n#define jit_gtr_l(r0, r1, r2)\t\tx86_gtr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_gtr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr64(r0, r1, r2,\t\tX86_CC_G);\n}\n\n#define jit_nei_l(r0, r1, i0)\t\tx86_nei_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_nei_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0)\n\tjit_cmp_ri64(r0, r1, i0,\tX86_CC_NE);\n    else\n\tjit_test_r64(r0, r1,\t\tX86_CC_NE);\n}\n\n#define jit_ner_l(r0, r1, r2)\t\tx86_ner_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_ner_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tXORLrr(r0, r0);\n    else\n\tjit_cmp_rr64(r0, r1, r2,\tX86_CC_NE);\n}\n\n#define jit_lti_ul(r0, r1, i0)\t\tx86_lti_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_lti_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_cmp_ri64(r0, r1, i0,\t\tX86_CC_B);\n}\n\n#define jit_ltr_ul(r0, r1, r2)\t\tx86_ltr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_ltr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr64(r0, r1, r2,\t\tX86_CC_B);\n}\n\n#define jit_lei_ul(r0, r1, i0)\t\tx86_lei_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_lei_ul(jit_state_t _jit,\n\t   jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (i0)\n\tjit_cmp_ri64(r0, r1, i0,\tX86_CC_BE);\n    else\n\tjit_test_r64(r0, r1,\t\tX86_CC_E);\n}\n\n#define jit_ler_ul(r0, r1, r2)\t\tx86_ler_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_ler_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr64(r0, r1, r2,\tX86_CC_BE);\n}\n\n#define jit_gei_ul(r0, r1, i0)\t\tx86_gei_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_gei_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (i0)\n\tjit_cmp_ri64(r0, r1, i0,\tX86_CC_AE);\n    else\n\tjit_test_r64(r0, r1,\t\tX86_CC_NB);\n}\n\n#define jit_ger_ul(r0, r1, r2)\t\tx86_ger_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_ger_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr64(r0, r1, r2,\tX86_CC_AE);\n}\n\n#define jit_gti_ul(r0, r1, i0)\t\tx86_gti_ul(_jit, r0, r1, i0)\n__jit_inline void\nx86_gti_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (i0)\n\tjit_cmp_ri64(r0, r1, i0,\tX86_CC_A);\n    else\n\tjit_test_r64(r0, r1,\t\tX86_CC_NE);\n}\n\n#define jit_gtr_ul(r0, r1, r2)\t\tx86_gtr_ul(_jit, r0, r1, r2)\n__jit_inline void\nx86_gtr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr64(r0, r1, r2,\t\tX86_CC_A);\n}\n\n/* Jump */\n#define jit_bcmp_ri64(i0, r0, i1, i2)\tx86_bcmp_ri64(_jit, i0, r0, i1, i2)\n__jit_inline void\nx86_bcmp_ri64(jit_state_t _jit,\n\t      jit_insn *label, jit_gpr_t r0, long i0, x86_cc_t cc)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tCMPQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tCMPQrr(JIT_REXTMP, r0);\n    }\n    JCCim(cc, label);\n}\n\n#define jit_btest_r64(i0, r0, i1)\tx86_btest_r64(_jit, i0, r0, i1)\n__jit_inline void\nx86_btest_r64(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, x86_cc_t cc)\n{\n    TESTQrr(r0, r0);\n    JCCim(cc, label);\n}\n\n#define jit_bcmp_rr64(i0, r0, r1, i1)\tx86_bcmp_rr64(_jit, i0, r0, r1, i1)\n__jit_inline void\nx86_bcmp_rr64(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1,\n\t      x86_cc_t cc)\n{\n    CMPQrr(r1, r0);\n    JCCim(cc, label);\n}\n\n#define jit_blti_l(label, r0, i0)\tx86_blti_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blti_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (i0)\n\tjit_bcmp_ri64(label, r0, i0,\tX86_CC_L);\n    else\n\tjit_btest_r64(label, r0,\tX86_CC_S);\n    return (_jit->x.pc);\n}\n\n#define jit_bltr_l(label, r0, r1)\tx86_bltr_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bltr_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr64(label, r0, r1,\tX86_CC_L);\n    return (_jit->x.pc);\n}\n\n#define jit_blei_l(label, r0, i0)\tx86_blei_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blei_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    jit_bcmp_ri64(label, r0, i0,\tX86_CC_LE);\n    return (_jit->x.pc);\n}\n\n#define jit_bler_l(label, r0, r1)\tx86_bler_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bler_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr64(label, r0, r1,\tX86_CC_LE);\n    return (_jit->x.pc);\n}\n\n#define jit_beqi_l(label, r0, i0)\tx86_beqi_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_beqi_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (i0)\n\tjit_bcmp_ri64(label, r0, i0,\tX86_CC_E);\n    else\n\tjit_btest_r64(label, r0,\tX86_CC_E);\n    return (_jit->x.pc);\n}\n\n#define jit_beqr_l(label, r0, r1)\tx86_beqr_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_beqr_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr64(label, r0, r1,\tX86_CC_E);\n    return (_jit->x.pc);\n}\n\n#define jit_bgei_l(label, r0, i0)\tx86_bgei_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgei_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (i0)\n\tjit_bcmp_ri64(label, r0, i0,\tX86_CC_GE);\n    else\n\tjit_btest_r64(label, r0,\tX86_CC_NS);\n    return (_jit->x.pc);\n}\n\n#define jit_bger_l(label, r0, r1)\tx86_bger_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bger_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr64(label, r0, r1,\tX86_CC_GE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgti_l(label, r0, i0)\tx86_bgti_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgti_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    jit_bcmp_ri64(label, r0, i0,\tX86_CC_G);\n    return (_jit->x.pc);\n}\n\n#define jit_bgtr_l(label, r0, r1)\tx86_bgtr_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bgtr_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr64(label, r0, r1,\tX86_CC_G);\n    return (_jit->x.pc);\n}\n\n#define jit_bnei_l(label, r0, i0)\tx86_bnei_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bnei_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (i0)\n\tjit_bcmp_ri64(label, r0, i0,\tX86_CC_NE);\n    else\n\tjit_btest_r64(label, r0,\tX86_CC_NE);\n    return (_jit->x.pc);\n}\n\n#define jit_bner_l(label, r0, r1)\tx86_bner_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bner_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    /* need to return a patchable address even if r0 == r1 */\n    jit_bcmp_rr64(label, r0, r1,\tX86_CC_NE);\n    return (_jit->x.pc);\n}\n\n#define jit_blti_ul(label, r0, i0)\tx86_blti_ul(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blti_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned long i0)\n{\n    /* need to return a patchable address even if i0 == 0 */\n    jit_bcmp_ri64(label, r0, i0,\tX86_CC_B);\n    return (_jit->x.pc);\n}\n\n#define jit_bltr_ul(label, r0, r1)\tx86_bltr_ul(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bltr_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr64(label, r0, r1,\tX86_CC_B);\n    return (_jit->x.pc);\n}\n\n#define jit_blei_ul(label, r0, i0)\tx86_blei_ul(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blei_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned long i0)\n{\n    /* need to return a patchable address even if i0 == 0 */\n    jit_bcmp_ri64(label, r0, i0,\tX86_CC_BE);\n    return (_jit->x.pc);\n}\n\n#define jit_bler_ul(label, r0, r1)\tx86_bler_ul(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bler_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr64(label, r0, r1,\tX86_CC_BE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgei_ul(label, r0, i0)\tx86_bgei_ul(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgei_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned long i0)\n{\n    if (i0 == 0)\n\tJMPm(label);\n    else\n\tjit_bcmp_ri64(label, r0, i0,\tX86_CC_AE);\n    return (_jit->x.pc);\n}\n\n#define jit_bger_ul(label, r0, r1)\tx86_bger_ul(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bger_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr64(label, r0, r1,\tX86_CC_AE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgti_ul(label, r0, i0)\tx86_bgti_ul(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgti_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned long i0)\n{\n    if (i0)\n\tjit_bcmp_ri64(label, r0, i0,\tX86_CC_A);\n    else\n\tjit_btest_r64(label, r0,\tX86_CC_NE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgtr_ul(label, r0, r1)\tx86_bgtr_ul(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bgtr_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr64(label, r0, r1,\tX86_CC_A);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddi_l(label, r0, i0)\tx86_boaddi_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_boaddi_l(jit_state_t _jit,\n\t     jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tADDQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tADDQrr(JIT_REXTMP, r0);\n    }\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddr_l(label, r0, r1)\tx86_boaddr_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_boaddr_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    ADDQrr(r1, r0);\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubi_l(label, r0, i0)\tx86_bosubi_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bosubi_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tSUBQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tSUBQrr(JIT_REXTMP, r0);\n    }\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubr_l(label, r0, r1)\tx86_bosubr_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bosubr_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    SUBQrr(r1, r0);\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddi_ul(label, r0, i0)\tx86_boaddi_ul(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_boaddi_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tADDQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tADDQrr(JIT_REXTMP, r0);\n    }\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddr_ul(label, r0, r1)\tx86_boaddr_ul(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_boaddr_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    ADDQrr(r1, r0);\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubi_ul(label, r0, i0)\tx86_bosubi_ul(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bosubi_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tSUBQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tSUBQrr(JIT_REXTMP, r0);\n    }\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubr_ul(label, r0, r1)\tx86_bosubr_ul(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bosubr_ul(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    SUBQrr(r1, r0);\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmsi_l(label, r0, i0)\tx86_bmsi_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bmsi_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (jit_can_zero_extend_char_p(i0))\n\tTESTBir(i0, r0);\n    else if (jit_can_zero_extend_short_p(i0))\n\tTESTWir(i0, r0);\n    else if (jit_can_sign_extend_int_p(i0))\n\tTESTLir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tTESTQrr(JIT_REXTMP, r0);\n    }\n    JNZm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmsr_l(label, r0, r1)\tx86_bmsr_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bmsr_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    TESTQrr(r1, r0);\n    JNZm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmci_l(label, r0, i0)\tx86_bmci_l(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bmci_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, long i0)\n{\n    if (jit_can_zero_extend_char_p(i0))\n\tTESTBir(i0, r0);\n    else if (jit_can_zero_extend_short_p(i0))\n\tTESTWir(i0, r0);\n    else if (jit_can_zero_extend_int_p(i0))\n\tTESTLir(i0, r0);\n    else if (jit_can_sign_extend_int_p(i0))\n\tTESTQir(i0, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tTESTQrr(JIT_REXTMP, r0);\n    }\n    JZm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmcr_l(label, r0, r1)\tx86_bmcr_l(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bmcr_l(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    TESTQrr(r1, r0);\n    JZm(label);\n    return (_jit->x.pc);\n}\n\n/* Memory */\n#define jit_ntoh_ul(r0, r1)\t\tx86_ntoh_ul(_jit, r0, r1)\n__jit_inline void\nx86_ntoh_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_movr_l(r0, r1);\n    BSWAPQr(r0);\n}\n\n#define jit_ldr_c(r0, r1)\t\tx86_ldr_c(_jit, r0, r1)\n__jit_inline void\nx86_ldr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSBQmr(0, r1, _NOREG,  _SCL1, r0);\n}\n\n#define jit_ldxr_c(r0, r1, r2)\t\tx86_ldxr_c(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVSBQmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldr_s(r0, r1)\t\tx86_ldr_s(_jit, r0, r1)\n__jit_inline void\nx86_ldr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSWQmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxr_s(r0, r1, r2)\t\tx86_ldxr_s(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVSWQmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldi_c(r0, i0)\t\tx86_ldi_c(_jit, r0, i0)\n__jit_inline void\nx86_ldi_c(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVSBQmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_ldr_c(r0, JIT_REXTMP);\n    }\n}\n\n#define jit_ldxi_c(r0, r1, i0)\t\tx86_ldxi_c(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVSBQmr(i0, r1, _NOREG,  _SCL1, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_ldxr_c(r0, r1, JIT_REXTMP);\n    }\n}\n\n#define jit_ldi_uc(r0, i0)\t\tx86_ldi_uc(_jit, r0, i0)\n__jit_inline void\nx86_ldi_uc(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVZBLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_ldr_uc(r0, JIT_REXTMP);\n    }\n}\n\n#define jit_ldxi_uc(r0, r1, i0)\t\tx86_ldxi_uc(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVZBLmr(i0, r1, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_ldxr_uc(r0, r1, JIT_REXTMP);\n    }\n}\n\n#define jit_str_c(r0, r1)\t\tx86_str_c(_jit, r0, r1)\n__jit_inline void\nx86_str_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVBrm(r1, 0, r0, _NOREG, _SCL1);\n}\n\n#define jit_sti_c(i0, r0)\t\tx86_sti_c(_jit, i0, r0)\n__jit_inline void\nx86_sti_c(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVBrm(r0, (long)i0, _NOREG, _NOREG, _SCL1);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_str_c(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_stxr_c(r0, r1, r2)\t\tx86_stxr_c(_jit, r0, r1, r2)\n__jit_inline void\nx86_stxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVBrm(r2, 0, r0, r1, _SCL1);\n}\n\n#define jit_stxi_c(i0, r0, r1)\t\tx86_stxi_c(_jit, i0, r0, r1)\n__jit_inline void\nx86_stxi_c(jit_state_t _jit, long i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVBrm(r1, i0, r0, _NOREG, _SCL1);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_stxr_c(JIT_REXTMP, r0, r1);\n    }\n}\n\n#define jit_ldi_s(r0, i0)\t\tx86_ldi_s(_jit, r0, i0)\n__jit_inline void\nx86_ldi_s(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVSWQmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_ldr_s(r0, JIT_REXTMP);\n    }\n}\n\n#define jit_ldxi_s(r0, r1, i0)\t\tx86_ldxi_s(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVSWQmr(i0, r1, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_ldxr_s(r0, r1, JIT_REXTMP);\n    }\n}\n\n#define jit_ldi_us(r0, i0)\t\tx86_ldi_us(_jit, r0, i0)\n__jit_inline void\nx86_ldi_us(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVZWLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_ldr_us(r0, JIT_REXTMP);\n    }\n}\n\n#define jit_ldxi_us(r0, r1, i0)\t\tx86_ldxi_us(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVZWLmr(i0, r1, _NOREG, _SCL1, r0);\n    else  {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_ldxr_us(r0, r1, JIT_REXTMP);\n    }\n}\n\n#define jit_sti_s(i0, r0)\t\tx86_sti_s(_jit, i0, r0)\n__jit_inline void\nx86_sti_s(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVWrm(r0, (long)i0, _NOREG, _NOREG, _SCL1);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_str_s(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_stxi_s(i0, r0, r1)\t\tx86_stxi_s(_jit, i0, r0, r1)\n__jit_inline void\nx86_stxi_s(jit_state_t _jit, long i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVWrm(r1, i0, r0, _NOREG, _SCL1);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_stxr_s(JIT_REXTMP, r0, r1);\n    }\n}\n\n#define jit_ldr_i(r0, r1)\t\tx86_ldr_i(_jit, r0, r1)\n__jit_inline void\nx86_ldr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSLQmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldi_i(r0, i0)\t\tx86_ldi_i(_jit, r0, i0)\n__jit_inline void\nx86_ldi_i(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVSLQmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_ldr_i(r0, JIT_REXTMP);\n    }\n}\n\n#define jit_ldxr_i(r0, r1, r2)\t\tx86_ldxr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVSLQmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldxi_i(r0, r1, i0)\t\tx86_ldxi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVSLQmr(i0, r1, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_ldxr_i(r0, r1, JIT_REXTMP);\n    }\n}\n\n#define jit_ldr_ui(r0, r1)\t\tx86_ldr_ui(_jit, r0, r1)\n__jit_inline void\nx86_ldr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVLmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldi_ui(r0, i0)\t\tx86_ldi_ui(_jit, r0, i0)\n__jit_inline void\nx86_ldi_ui(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVLmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_ldr_ui(r0, JIT_REXTMP);\n    }\n}\n\n#define jit_ldxr_ui(r0, r1, r2)\t\tx86_ldxr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVLmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldxi_ui(r0, r1, i0)\t\tx86_ldxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVLmr(i0, r1, _NOREG, _SCL1, r0);\n    else  {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_ldxr_ui(r0, r1, JIT_REXTMP);\n    }\n}\n\n#define jit_sti_i(i0, r0)\t\tx86_sti_i(_jit, i0, r0)\n__jit_inline void\nx86_sti_i(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVLrm(r0, (long)i0, _NOREG, _NOREG, _SCL1);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_str_i(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_stxi_i(i0, r0, r1)\t\tx86_stxi_i(_jit, i0, r0, r1)\n__jit_inline void\nx86_stxi_i(jit_state_t _jit, long i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVLrm(r1, i0, r0, _NOREG, _SCL1);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_stxr_i(JIT_REXTMP, r0, r1);\n    }\n}\n\n#define jit_ldr_l(r0, r1)\t\tx86_ldr_l(_jit, r0, r1)\n__jit_inline void\nx86_ldr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVQmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldi_l(r0, i0)\t\tx86_ldi_l(_jit, r0, i0)\n__jit_inline void\nx86_ldi_l(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVQmr((long)i0, _NOREG, _NOREG, _SCL1, r0);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_ldr_l(r0, JIT_REXTMP);\n    }\n}\n\n#define jit_ldxr_l(r0, r1, r2)\t\tx86_ldxr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVQmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldxi_l(r0, r1, i0)\t\tx86_ldxi_l(_jit, r0, r1, i0)\n#define jit_ldxi_ul(r0, r1, i0)\t\tx86_ldxi_l(_jit, r0, r1, i0)\n#define jit_ldxi_p(r0, r1, i0)\t\tx86_ldxi_l(_jit, r0, r1, i0)\n__jit_inline void\nx86_ldxi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVQmr(i0, r1, _NOREG, _SCL1, r0);\n    else  {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_ldxr_l(r0, r1, JIT_REXTMP);\n    }\n}\n\n#define jit_str_l(r0, r1)\t\tx86_str_l(_jit, r0, r1)\n__jit_inline void\nx86_str_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVQrm(r1, 0, r0, _NOREG, _SCL1);\n}\n\n#define jit_sti_l(i0, r0)\t\tx86_sti_l(_jit, i0, r0)\n__jit_inline void\nx86_sti_l(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    if (jit_can_sign_extend_int_p((long)i0))\n\tMOVQrm(r0, (long)i0, _NOREG, _NOREG, _SCL1);\n    else {\n\tMOVQir((long)i0, JIT_REXTMP);\n\tjit_str_l(JIT_REXTMP, r0);\n    }\n}\n\n#define jit_stxr_l(r0, r1, r2)\t\tx86_stxr_l(_jit, r0, r1, r2)\n__jit_inline void\nx86_stxr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVQrm(r2, 0, r0, r1, _SCL1);\n}\n\n#define jit_stxi_l(i0, r0, r1)\t\tx86_stxi_l(_jit, i0, r0, r1)\n__jit_inline void\nx86_stxi_l(jit_state_t _jit, long i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_can_sign_extend_int_p(i0))\n\tMOVQrm(r1, i0, r0, _NOREG, _SCL1);\n    else {\n\tMOVQir(i0, JIT_REXTMP);\n\tjit_stxr_l(JIT_REXTMP, r0, r1);\n    }\n}\n\n#define jit_extr_c_l(r0, r1)\t\tx86_extr_c_l(_jit, r0, r1)\n__jit_inline void\nx86_extr_c_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSBQrr(r1, r0);\n}\n\n#define jit_extr_c_ul(r0, r1)\t\tx86_extr_c_ul(_jit, r0, r1)\n__jit_inline void\nx86_extr_c_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVZBQrr(r1, r0);\n}\n\n#define jit_extr_s_l(r0, r1)\t\tx86_extr_s_l(_jit, r0, r1)\n__jit_inline void\nx86_extr_s_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSWQrr(r1, r0);\n}\n\n#define jit_extr_s_ul(r0, r1)\t\tx86_extr_s_ul(_jit, r0, r1)\n__jit_inline void\nx86_extr_s_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVZWQrr(r1, r0);\n}\n\n#define jit_extr_s_l(r0, r1)\t\tx86_extr_s_l(_jit, r0, r1)\n__jit_inline void\nx86_extr_i_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSLQrr(r1, r0);\n}\n\n#define jit_extr_s_ul(r0, r1)\t\tx86_extr_s_ul(_jit, r0, r1)\n__jit_inline void\nx86_extr_i_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVLrr(r1, r0);\n}\n\n#define jit_finish(i0)\t\t\tx86_finish(_jit, i0)\n__jit_inline jit_insn *\nx86_finish(jit_state_t _jit, void *i0)\n{\n    assert(_jitl.stack_offset\t== 0 &&\n\t   _jitl.nextarg_puti\t== 0 &&\n\t   _jitl.nextarg_putfp\t== 0);\n    if (_jitl.fprssize) {\n\tMOVBir(_jitl.fprssize, _RAX);\n\t_jitl.fprssize = 0;\n    }\n    else\n\tMOVBir(0, _RAX);\n    jit_calli(i0);\n    if (jit_push_pop_p() && _jitl.stack_length) {\n\tjit_addi_l(JIT_SP, JIT_SP, _jitl.stack_length);\n\t_jitl.stack_length = 0;\n    }\n\n    return (_jitl.label);\n}\n\n#define jit_finishr(rs)\t\t\tx86_finishr(_jit, rs)\n__jit_inline void\nx86_finishr(jit_state_t _jit, jit_gpr_t r0)\n{\n    assert(_jitl.stack_offset\t== 0 &&\n\t   _jitl.nextarg_puti\t== 0 &&\n\t   _jitl.nextarg_putfp\t== 0);\n    if (r0 == _RAX) {\n\t/* clobbered with # of fp registers (for varargs) */\n\tMOVQrr(_RAX, JIT_REXTMP);\n\tr0 = JIT_REXTMP;\n    }\n    if (_jitl.fprssize) {\n\tMOVBir(_jitl.fprssize, _RAX);\n\t_jitl.fprssize = 0;\n    }\n    else\n\tMOVBir(0, _RAX);\n    jit_callr(r0);\n    if (jit_push_pop_p() && _jitl.stack_length) {\n\tjit_addi_l(JIT_SP, JIT_SP, _jitl.stack_length);\n\t_jitl.stack_length = 0;\n    }\n}\n\n#define jit_pusharg_i(r0)\t\tx86_pusharg_i(_jit, r0)\n#define jit_pusharg_l(r0)\t\tx86_pusharg_i(_jit, r0)\n__jit_inline void\nx86_pusharg_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    assert(_jitl.nextarg_puti > 0);\n    if (--_jitl.nextarg_puti >= JIT_ARG_MAX) {\n\t_jitl.stack_offset -= sizeof(long);\n\tassert(_jitl.stack_offset >= 0);\n\tif (jit_push_pop_p()) {\n\t    int\tpad = -_jitl.stack_length & 15;\n\t    if (pad) {\n\t\tjit_subi_l(JIT_SP, JIT_SP, pad + sizeof(long));\n\t\t_jitl.stack_length += pad;\n\t\tjit_str_l(JIT_SP, r0);\n\t    }\n\t    else\n\t\tjit_pushr_l(r0);\n\t}\n\telse\n\t    jit_stxi_l(_jitl.stack_offset, JIT_SP, r0);\n    }\n    else\n\tjit_movr_l(jit_arg_reg_order[_jitl.nextarg_puti], r0);\n}\n\n#define jit_retval_l(r0)\t\tx86_retval_l(_jit, r0)\n__jit_inline void\nx86_retval_l(jit_state_t _jit, jit_gpr_t r0)\n{\n    jit_movr_l(r0, _RAX);\n}\n\n#define jit_arg_i()\t\t\tx86_arg_i(_jit)\n#define jit_arg_c()\t\t\tx86_arg_i(_jit)\n#define jit_arg_uc()\t\t\tx86_arg_i(_jit)\n#define jit_arg_s()\t\t\tx86_arg_i(_jit)\n#define jit_arg_us()\t\t\tx86_arg_i(_jit)\n#define jit_arg_ui()\t\t\tx86_arg_i(_jit)\n#define jit_arg_l()\t\t\tx86_arg_i(_jit)\n#define jit_arg_ul()\t\t\tx86_arg_i(_jit)\n#define jit_arg_p()\t\t\tx86_arg_i(_jit)\n__jit_inline int\nx86_arg_i(jit_state_t _jit)\n{\n    int\t\tofs;\n\n    if (_jitl.nextarg_geti < JIT_ARG_MAX) {\n\tofs = _jitl.nextarg_geti;\n\t++_jitl.nextarg_geti;\n    }\n    else {\n\tofs = _jitl.framesize;\n\t_jitl.framesize += sizeof(long);\n    }\n\n    return (ofs);\n}\n\n#define jit_getarg_c(r0, ofs)\t\tx86_getarg_c(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_c(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_extr_c_l(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_c(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_uc(r0, ofs)\t\tx86_getarg_uc(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_uc(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_extr_c_ul(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_uc(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_s(r0, ofs)\t\tx86_getarg_s(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_s(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_extr_s_l(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_s(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_us(r0, ofs)\t\tx86_getarg_us(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_us(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_extr_s_ul(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_us(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_i(r0, ofs)\t\tx86_getarg_i(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_i(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_movr_l(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_i(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_ui(r0, ofs)\t\tx86_getarg_ui(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_ui(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_movr_ul(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_ui(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_l(r0, ofs)\t\tx86_getarg_l(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_l(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_movr_l(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_l(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_ul(r0, ofs)\t\tx86_getarg_ul(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_ul(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_movr_ul(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_ul(r0, JIT_FP, ofs);\n}\n\n#define jit_getarg_p(r0, ofs)\t\tx86_getarg_p(_jit, r0, ofs)\n__jit_inline void\nx86_getarg_p(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_ARG_MAX)\n\tjit_movr_p(r0, jit_arg_reg_order[ofs]);\n    else\n\tjit_ldxi_p(r0, JIT_FP, ofs);\n}\n\n#endif /* __lightning_core_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/core.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (i386 version)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000,2001,2002,2003,2006,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tMatthew Flatt\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n\n#ifndef __lightning_core_i386_h\n#define __lightning_core_i386_h\n\n/* ffs* prototype */\n#if !defined(__GNU_SOURCE)\n#  define __GNU_SOURCE\t\t\t1\n#  define __GNU_SOURCE_NOT_DEFINED\t1\n#endif\n#include <string.h>\n#if __GNU_SOURCE_NOT_DEFINED\n#  undef __GNU_SOURCE\n#endif\n#ifdef _MSC_VER\n#include <intrin.h>\n#pragma intrinsic(_BitScanForward)\n__jit_inline int ffsl(long x)\n{\n\tunsigned long i;\n\tif (_BitScanForward(&i, x))\n\t\treturn i + 1;\n\n\treturn 0;\n}\n\n__jit_inline int ffs(int x)\n{\n\treturn ffsl(x);\n}\n#endif\n\n#define JIT_FP\t\t\t_RBP\n#define JIT_SP\t\t\t_RSP\n#define JIT_RET\t\t\t_RAX\n\n#define jit_push_pop_p()\t\tjit_flags.push_pop\n\n#if __WORDSIZE == 64\n#define jit_can_zero_extend_char_p(im)\t\t\t\t\t\\\n    ((im) >= 0 && (im) <= 0x80)\n\n#define jit_can_sign_extend_char_p(im)\t\t\t\t\t\\\n    (((im) >= 0 && (im) <=  0x7f) ||\t\t\t\t\t\\\n     ((im) <  0 && (im) >= -0x80))\n\n#define jit_can_zero_extend_short_p(im)\t\t\t\t\t\\\n    ((im) >= 0 && (im) <= 0x8000)\n\n#define jit_can_sign_extend_short_p(im)\t\t\t\t\t\\\n    (((im) >= 0 && (im) <=  0x7fff) ||\t\t\t\t\t\\\n     ((im) <  0 && (im) >= -0x8000))\n\n#define jit_can_zero_extend_int_p(im)\t\t\t\t\t\\\n    ((im) >= 0 && (im) <= 0x80000000L)\n\n#define jit_can_sign_extend_int_p(im)\t\t\t\t\t\\\n    (((im) >= 0 && (im) <=  0x7fffffffL) ||\t\t\t\t\\\n     ((im) <  0 && (im) >= -0x80000000L))\n#endif\n\n#define jit_movr_i(r0, r1)\t\tx86_movr_i(_jit, r0, r1)\n#define jit_pushr_i(r0)\t\t\tx86_pushr_i(_jit, r0)\n#define jit_pushi_i(i0)\t\t\tx86_pushi_i(_jit, i0)\n#define jit_popr_i(r0)\t\t\tx86_popr_i(_jit, r0)\n#define jit_xchgr_i(r0, r1)\t\tx86_xchgr_i(_jit, r0, r1)\n#if __WORDSIZE == 32\n__jit_inline void\nx86_movr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 != r1)\n\tMOVLrr(r1, r0);\n}\n\n__jit_inline void\nx86_pushr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    PUSHLr(r0);\n}\n\n__jit_inline void\nx86_pushi_i(jit_state_t _jit, int i0)\n{\n    PUSHLi(i0);\n}\n\n__jit_inline void\nx86_popr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    POPLr(r0);\n}\n\n__jit_inline void\nx86_xchgr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    XCHGLrr(r0, r1);\n}\n#else\n#  define jit_movr_l(r0, r1)\t\tx86_movr_i(_jit, r0, r1)\n#  define jit_movr_ul(r0, r1)\t\tx86_movr_i(_jit, r0, r1)\n#  define jit_movr_p(r0, r1)\t\tx86_movr_i(_jit, r0, r1)\n__jit_inline void\nx86_movr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 != r1)\n\tMOVQrr(r1, r0);\n}\n\n#define jit_pushr_l(r0)\t\t\tx86_pushr_i(_jit, r0)\n__jit_inline void\nx86_pushr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    PUSHQr(r0);\n}\n\n__jit_inline void\nx86_pushi_i(jit_state_t _jit, long i0)\n{\n    PUSHQi(i0);\n}\n\n#define jit_popr_l(r0)\t\t\tx86_popr_i(_jit, r0)\n__jit_inline void\nx86_popr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    POPQr(r0);\n}\n\n#define jit_xchgr_l(r0, r1)\t\tx86_xchgr_i(_jit, r0, r1)\n__jit_inline void\nx86_xchgr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    XCHGQrr(r0, r1);\n}\n#endif\t/* __WORDSIZE == 32 */\n\n#define jit_patch_abs_long_at(jump, label)\t\t\t\t\\\n\tx86_patch_abs_long_at(_jit, jump, label)\n__jit_inline void\nx86_patch_abs_long_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    *(long *)(jump - sizeof(long)) = (long)label;\n}\n\n#define jit_patch_rel_int_at(jump, label)\t\t\t\t\\\n\tx86_patch_rel_int_at(_jit, jump, label)\n__jit_inline void\nx86_patch_rel_int_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    *(int *)(jump - sizeof(int)) = (int)(long)(label - jump);\n}\n\n#define jit_patch_rel_char_at(jump, label)\t\t\t\t\\\n\tx86_patch_rel_char_at(_jit, jump, label)\n__jit_inline void\nx86_patch_rel_char_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    *(char *)(jump - 1) = (char)(long)(label - jump);\n}\n\n#define jit_patch_movi(address, label)\tx86_patch_movi(_jit, address, label)\n__jit_inline void\nx86_patch_movi(jit_state_t _jit, jit_insn *address, jit_insn *label)\n{\n    jit_patch_abs_long_at(address, label);\n}\n\n#define jit_jmpi(label)\t\t\tx86_jmpi(_jit, label)\n__jit_inline jit_insn *\nx86_jmpi(jit_state_t _jit, jit_insn *label)\n{\n    JMPm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_jmpr(r0)\t\t\tx86_jmpr(_jit, r0)\n__jit_inline void\nx86_jmpr(jit_state_t _jit, jit_gpr_t r0)\n{\n    JMPsr(r0);\n}\n\n/* Stack */\n#define jit_retval_i(r0)\t\tx86_retval_i(_jit, r0)\n__jit_inline void\nx86_retval_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    jit_movr_i(r0, _RAX);\n}\n\n/* ALU */\n#define jit_negr_i(r0, r1)\t\tx86_negr_i(_jit, r0, r1)\n__jit_inline void\nx86_negr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tNEGLr(r0);\n    else {\n\tXORLrr(r0, r0);\n\tSUBLrr(r1, r0);\n    }\n}\n\n#define jit_notr_i(r0, r1)\t\tx86_notr_i(_jit, r0, r1)\n__jit_inline void\nx86_notr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_movr_i(r0, r1);\n    NOTLr(r0);\n}\n\n#define jit_addi_i(r0, r1, i0)\t\tx86_addi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_addi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (i0 == 1) {\n\tjit_movr_i(r0, r1);\n\tINCLr(r0);\n    }\n    else if (i0 == -1) {\n\tjit_movr_i(r0, r1);\n\tDECLr(r0);\n    }\n    else if (r0 == r1)\n\tADDLir(i0, r0);\n    else\n\tLEALmr(i0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_addr_i(r0, r1, r2)\t\tx86_addr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_addr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1)\n\tADDLrr(r2, r0);\n    else if (r0 == r2)\n\tADDLrr(r1, r0);\n    else\n\tLEALmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_subi_i(r0, r1, i0)\t\tx86_subi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_subi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (i0 == 1) {\n\tjit_movr_i(r0, r1);\n\tDECLr(r0);\n    }\n    else if (i0 == -1) {\n\tjit_movr_i(r0, r1);\n\tINCLr(r0);\n    }\n    else if (r0 == r1)\n\tSUBLir(i0, r0);\n    else\n\tLEALmr(-i0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_subr_i(r0, r1, r2)\t\tx86_subr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_subr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tXORLrr(r0, r0);\n    else if (r0 == r2) {\n\tSUBLrr(r1, r0);\n\tNEGLr(r0);\n    }\n    else {\n\tjit_movr_i(r0, r1);\n\tSUBLrr(r2, r0);\n    }\n}\n\n#define jit_addci_ui(r0, r1, i0)\tx86_addci_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_addci_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (r0 == r1)\n\tADDLir((int)i0, r0);\n    else {\n\tMOVLir(i0, r0);\n\tADDLrr(r1, r0);\n    }\n}\n\n#define jit_addcr_ui(r0, r1, r2)\tx86_addcr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_addcr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r2)\n\tADDLrr(r1, r0);\n    else if (r0 == r1)\n\tADDLrr(r2, r0);\n    else {\n\tMOVLrr(r1, r0);\n\tADDLrr(r2, r0);\n    }\n}\n\n#define jit_addxi_ui(r0, r1, i0)\tx86_addxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_addxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (r0 == r1)\n\tADCLir((int)i0, r0);\n    else {\n\tMOVLir(i0, r0);\n\tADCLrr(r1, r0);\n    }\n}\n\n#define jit_addxr_ui(r0, r1, r2)\tx86_addxr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_addxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r2)\n\tADCLrr(r1, r0);\n    else if (r0 == r1)\n\tADCLrr(r2, r0);\n    else {\n\tMOVLrr(r1, r0);\n\tADCLrr(r2, r0);\n    }\n}\n\n#define jit_subci_ui(r0, r1, i0)\tx86_subci_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_subci_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (r0 == r1)\n\tSUBLir((int)i0, r0);\n    else {\n\tMOVLir(i0, r0);\n\tSUBLrr(r1, r0);\n    }\n}\n\n#define jit_subcr_ui(r0, r1, r2)\tx86_subcr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_subcr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1)\n\tSUBLrr(r2, r0);\n    else if (r0 != r2) {\n\tMOVLrr(r1, r0);\n\tSUBLrr(r2, r0);\n    }\n    else {\n\tjit_pushr_i(r1);\n\tjit_xchgr_i(r0, r1);\n\tSUBLrr(r1, r0);\n\tjit_popr_i(r1);\n    }\n}\n\n#define jit_subxi_ui(r0, r1, i0)\tx86_subxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_subxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (r0 == r1)\n\tSBBLir((int)i0, r0);\n    else {\n\tMOVLir(i0, r0);\n\tSBBLrr(r1, r0);\n    }\n}\n\n#define jit_subxr_ui(r0, r1, r2)\tx86_subxr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_subxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1)\n\tSBBLrr(r2, r0);\n    else if (r0 != r2) {\n\tMOVLrr(r1, r0);\n\tSBBLrr(r2, r0);\n    }\n    else {\n\tjit_pushr_i(r1);\n\tjit_xchgr_i(r0, r1);\n\tSBBLrr(r1, r0);\n\tjit_popr_i(r1);\n    }\n}\n\n#define jit_andi_i(r0, r1, i0)\t\tx86_andi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_andi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 == 0)\n\tXORLrr(r0, r0);\n    else {\n\tjit_movr_i(r0, r1);\n\tif (i0 != -1)\n\t    ANDLir(i0, r0);\n    }\n}\n\n#define jit_andr_i(r0, r1, r2)\t\tx86_andr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_andr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tjit_movr_i(r0, r1);\n    else if (r0 == r1)\n\tANDLrr(r2, r0);\n    else if (r0 == r2)\n\tANDLrr(r1, r0);\n    else {\n\tMOVLrr(r1, r0);\n\tANDLrr(r2, r0);\n    }\n}\n\n#define jit_ori_i(r0, r1, i0)\t\tx86_ori_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_ori_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (i0 == -1)\n\tMOVLir(0xffffffff, r0);\n    else {\n\tjit_movr_i(r0, r1);\n\tif (jit_reg8_p(r0) && _u8P(i0))\n\t    ORBir(i0, r0);\n#if __WORDSIZE == 32\n\telse if (_u16P(i0))\n\t    ORWir(i0, r0);\n#endif\n\telse\n\t    ORLir(i0, r0);\n    }\n}\n\n#define jit_orr_i(r0, r1, r2)\t\tx86_orr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_orr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tjit_movr_i(r0, r1);\n    else if (r0 == r1)\n\tORLrr(r2, r0);\n    else if (r0 == r2)\n\tORLrr(r1, r0);\n    else {\n\tMOVLrr(r1, r0);\n\tORLrr(r2, r0);\n    }\n}\n\n#define jit_xori_i(r0, r1, i0)\t\tx86_xori_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_xori_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (i0 == -1) {\n\tjit_movr_i(r0, r1);\n\tNOTLr(r0);\n    }\n    else {\n\tjit_movr_i(r0, r1);\n\tif (jit_reg8_p(r0) && _u8P(i0))\n\t    XORBir(i0, r0);\n#if __WORDSIZE == 32\n\telse if (_u16P(i0))\n\t    XORWir(i0, r0);\n#endif\n\telse\n\t    XORLir(i0, r0);\n    }\n}\n\n#define jit_xorr_i(r0, r1, r2)\t\tx86_xorr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_xorr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tXORLrr(r0, r0);\n    else if (r0 == r1)\n\tXORLrr(r2, r0);\n    else if (r0 == r2)\n\tXORLrr(r1, r0);\n    else {\n\tMOVLrr(r1, r0);\n\tXORLrr(r2, r0);\n    }\n}\n\n/*  Instruction format is:\n *\timul reg32/mem32\n *  and the result is stored in %edx:%eax\n *  %eax = low 32 bits\n *  %edx = high 32 bits\n */\n#define jit_muli_i_(r0, i0)\t\tx86_muli_i_(_jit, r0, i0)\n__jit_inline void\nx86_muli_i_(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    if (r0 == _RAX) {\n\tMOVLir((unsigned)i0, _RDX);\n\tIMULLr(_RDX);\n    }\n    else {\n\tMOVLir((unsigned)i0, _RAX);\n\tIMULLr(r0);\n    }\n}\n\n#define jit_hmuli_i(r0, r1, i0)\t\tx86_hmuli_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_hmuli_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (r0 == _RDX) {\n\tjit_pushr_i(_RAX);\n\tjit_muli_i_(r1, i0);\n\tjit_popr_i(_RAX);\n    }\n    else if (r0 == _RAX) {\n\tjit_pushr_i(_RDX);\n\tjit_muli_i_(r1, i0);\n\tMOVLrr(_RDX, _RAX);\n\tjit_popr_i(_RDX);\n    }\n    else {\n\tjit_pushr_i(_RDX);\n\tjit_pushr_i(_RAX);\n\tjit_muli_i_(r1, i0);\n\tMOVLrr(_RDX, r0);\n\tjit_popr_i(_RAX);\n\tjit_popr_i(_RDX);\n    }\n}\n\n#define jit_mulr_i_(r0, r1)\t\tx86_mulr_i_(_jit, r0, r1)\n__jit_inline void\nx86_mulr_i_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r1 == _RAX)\n\tIMULLr(r0);\n    else if (r0 == _RAX)\n\tIMULLr(r1);\n    else {\n\tMOVLrr(r1, _RAX);\n\tIMULLr(r0);\n    }\n}\n\n#define jit_hmulr_i(r0, r1, r2)\t\tx86_hmulr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_hmulr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == _RDX) {\n\tjit_pushr_i(_RAX);\n\tjit_mulr_i_(r1, r2);\n\tjit_popr_i(_RAX);\n    }\n    else if (r0 == _RAX) {\n\tjit_pushr_i(_RDX);\n\tjit_mulr_i_(r1, r2);\n\tMOVLrr(_RDX, _RAX);\n\tjit_popr_i(_RDX);\n    }\n    else {\n\tjit_pushr_i(_RDX);\n\tjit_pushr_i(_RAX);\n\tjit_mulr_i_(r1, r2);\n\tMOVLrr(_RDX, r0);\n\tjit_popr_i(_RAX);\n\tjit_popr_i(_RDX);\n    }\n}\n\n/*  Instruction format is:\n *\tmul reg32/mem32\n *  and the result is stored in %edx:%eax\n *  %eax = low 32 bits\n *  %edx = high 32 bits\n */\n#define jit_muli_ui_(r0, i0)\t\tx86_muli_ui_(_jit, r0, i0)\n__jit_inline void\nx86_muli_ui_(jit_state_t _jit, jit_gpr_t r0, unsigned int i0)\n{\n    if (r0 == _RAX) {\n\tMOVLir(i0, _RDX);\n\tMULLr(_RDX);\n    }\n    else {\n\tMOVLir(i0, _RAX);\n\tMULLr(r0);\n    }\n}\n\n#define jit_hmuli_ui(r0, r1, i0)\tx86_hmuli_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_hmuli_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (r0 == _RDX) {\n\tjit_pushr_i(_RAX);\n\tjit_muli_ui_(r1, i0);\n\tjit_popr_i(_RAX);\n    }\n    else if (r0 == _RAX) {\n\tjit_pushr_i(_RDX);\n\tjit_muli_ui_(r1, i0);\n\tMOVLrr(_RDX, _RAX);\n\tjit_popr_i(_RDX);\n    }\n    else {\n\tjit_pushr_i(_RDX);\n\tjit_pushr_i(_RAX);\n\tjit_muli_ui_(r1, i0);\n\tMOVLrr(_RDX, r0);\n\tjit_popr_i(_RAX);\n\tjit_popr_i(_RDX);\n    }\n}\n\n#define jit_mulr_ui_(r0, r1)\t\tx86_mulr_ui_(_jit, r0, r1)\n__jit_inline void\nx86_mulr_ui_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r1 == _RAX)\n\tMULLr(r0);\n    else if (r0 == _RAX)\n\tMULLr(r1);\n    else {\n\tMOVLrr(r1, _RAX);\n\tMULLr(r0);\n    }\n}\n\n#define jit_hmulr_ui(r0, r1, r2)\tx86_hmulr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_hmulr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == _RDX) {\n\tjit_pushr_i(_RAX);\n\tjit_mulr_ui_(r1, r2);\n\tjit_popr_i(_RAX);\n    }\n    else if (r0 == _RAX) {\n\tjit_pushr_i(_RDX);\n\tjit_mulr_ui_(r1, r2);\n\tMOVLrr(_RDX, _RAX);\n\tjit_popr_i(_RDX);\n    }\n    else {\n\tjit_pushr_i(_RDX);\n\tjit_pushr_i(_RAX);\n\tjit_mulr_ui_(r1, r2);\n\tMOVLrr(_RDX, r0);\n\tjit_popr_i(_RAX);\n\tjit_popr_i(_RDX);\n    }\n}\n\n#define jit_muli_i(r0, r1, i0)\t\tx86_muli_i(_jit, r0, r1, i0)\n#define jit_muli_ui(r0, r1, i0)\t\tx86_muli_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_muli_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    switch (i0) {\n\tcase 0:\n\t    XORLrr(r0, r0);\n\t    break;\n\tcase 1:\n\t    jit_movr_i(r0, r1);\n\t    break;\n\tcase -1:\n\t    jit_negr_i(r0, r1);\n\t    break;\n\tcase 2:\n\t    LEALmr(0, _NOREG, r1, _SCL2, r0);\n\t    break;\n\tcase 4:\n\t    LEALmr(0, _NOREG, r1, _SCL4, r0);\n\t    break;\n\tcase 8:\n\t    LEALmr(0, _NOREG, r1, _SCL8, r0);\n\t    break;\n\tdefault:\n\t    if (i0 > 0 && !(i0 & (i0 - 1))) {\n\t\tjit_movr_i(r0, r1);\n\t\tSHLLir(ffs(i0) - 1, r0);\n\t    }\n\t    else\n\t\tIMULLirr(i0, r1, r0);\n\t    break;\n    }\n}\n\n#define jit_mulr_i(r0, r1, r2)\t\tx86_mulr_i(_jit, r0, r1, r2)\n#define jit_mulr_ui(r0, r1, r2)\t\tx86_mulr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_mulr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1)\n\tIMULLrr(r2, r0);\n    else if (r0 == r2)\n\tIMULLrr(r1, r0);\n    else {\n\tMOVLrr(r1, r0);\n\tIMULLrr(r2, r0);\n    }\n}\n\n#define jit_divi_i_(r0, r1, i0, i1, i2)\tx86_divi_i_(_jit, r0, r1, i0, i1, i2)\n__jit_inline void\nx86_divi_i_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0,\n\t    int sign, int divide)\n{\n    jit_gpr_t\tdiv;\n    int\t\tpop;\n\n    if (divide) {\n\tswitch (i0) {\n\t    case 1:\n\t\tjit_movr_i(r0, r1);\n\t\treturn;\n\t    case -1:\n\t\tif (sign) {\n\t\t    jit_negr_i(r0, r1);\n\t\t    return;\n\t\t}\n\t\tbreak;\n\t    default:\n\t\tif (i0 > 0 && !(i0 & (i0 - 1))) {\n\t\t    jit_movr_i(r0, r1);\n\t\t    _ROTSHILir(sign ? X86_SAR : X86_SHR, ffs(i0) - 1, r0);\n\t\t    return;\n\t\t}\n\t\tbreak;\n\t}\n    }\n    else if (i0 == 1 || (sign && i0 == -1)) {\n\tXORLrr(r0, r0);\n\treturn;\n    }\n    else if (!sign && i0 > 0 && !(i0 & (i0 - 1))) {\n\tjit_movr_i(r0, r1);\n\tANDLir(i0 - 1, r0);\n\treturn;\n    }\n\n    if (r0 != _RDX)\n\tjit_pushr_i(_RDX);\n    if (r0 != _RAX)\n\tjit_pushr_i(_RAX);\n\n    if (r0 == _RAX || r0 == _RDX) {\n\tdiv = _RCX;\n\tpop = 1;\n    }\n    else {\n\tdiv = r0;\n\tpop = 0;\n    }\n\n    if (pop)\n\tjit_pushr_i(div);\n    if (r1 != _RAX)\n\tMOVLrr(r1, _RAX);\n    MOVLir((unsigned)i0, div);\n\n    if (sign) {\n\tCDQ_();\n\tIDIVLr(div);\n    }\n    else {\n\tXORLrr(_RDX, _RDX);\n\tDIVLr(div);\n    }\n\n    if (pop)\n\tjit_popr_i(div);\n\n    if (r0 != _RAX) {\n\tif (divide)\n\t    MOVLrr(_RAX, r0);\n\tjit_popr_i(_RAX);\n    }\n    if (r0 != _RDX) {\n\tif (!divide)\n\t    MOVLrr(_RDX, r0);\n\tjit_popr_i(_RDX);\n    }\n}\n\n#define jit_divr_i_(r0, r1, r2, i0, i1)\tx86_divr_i_(_jit, r0, r1, r2, i0, i1)\n__jit_inline void\nx86_divr_i_(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2,\n\t    int sign, int divide)\n{\n    jit_gpr_t\tdiv;\n    int\t\tpop;\n\n    if (r0 != _RDX)\n\tjit_pushr_i(_RDX);\n    if (r0 != _RAX)\n\tjit_pushr_i(_RAX);\n\n    if (r2 == _RAX) {\n\tif (r0 == _RAX || r0 == _RDX) {\n\t    div = r1 == _RCX ? _RBX : _RCX;\n\t    jit_pushr_i(div);\n\t    MOVLrr(_RAX, div);\n\t    if (r1 != _RAX)\n\t\tMOVLrr(r1, _RAX);\n\t    pop = 1;\n\t}\n\telse {\n\t    if (r0 == r1)\n\t\tjit_xchgr_i(_RAX, r0);\n\t    else {\n\t\tif (r0 != _RAX)\n\t\t    MOVLrr(_RAX, r0);\n\t\tif (r1 != _RAX)\n\t\t    MOVLrr(r1, _RAX);\n\t    }\n\t    div = r0;\n\t    pop = 0;\n\t}\n    }\n    else if (r2 == _RDX) {\n\tif (r0 == _RAX || r0 == _RDX) {\n\t    div = r1 == _RCX ? _RBX : _RCX;\n\t    jit_pushr_i(div);\n\t    MOVLrr(_RDX, div);\n\t    if (r1 != _RAX)\n\t\tMOVLrr(r1, _RAX);\n\t    pop = 1;\n\t}\n\telse {\n\t    if (r1 != _RAX)\n\t\tMOVLrr(r1, _RAX);\n\t    MOVLrr(_RDX, r0);\n\t    div = r0;\n\t    pop = 0;\n\t}\n    }\n    else {\n\tif (r1 != _RAX)\n\t    MOVLrr(r1, _RAX);\n\tdiv = r2;\n\tpop = 0;\n    }\n\n    if (sign) {\n\tCDQ_();\n\tIDIVLr(div);\n    }\n    else {\n\tXORLrr(_RDX, _RDX);\n\tDIVLr(div);\n    }\n\n    if (pop)\n\tjit_popr_i(div);\n    if (r0 != _RAX) {\n\tif (divide)\n\t    MOVLrr(_RAX, r0);\n\tjit_popr_i(_RAX);\n    }\n    if (r0 != _RDX) {\n\tif (!divide)\n\t    MOVLrr(_RDX, r0);\n\tjit_popr_i(_RDX);\n    }\n}\n\n#define jit_divi_i(r0, r1, i0)\t\tx86_divi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_divi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_divi_i_(r0, r1, i0, 1, 1);\n}\n\n#define jit_divr_i(r0, r1, r2)\t\tx86_divr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_divr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_i_(r0, r1, r2, 1, 1);\n}\n\n#define jit_divi_ui(r0, r1, i0)\t\tx86_divi_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_divi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_divi_i_(r0, r1, i0, 0, 1);\n}\n\n#define jit_divr_ui(r0, r1, r2)\t\tx86_divr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_divr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_i_(r0, r1, r2, 0, 1);\n}\n\n#define jit_modi_i(r0, r1, i0)\t\tx86_modi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_modi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_divi_i_(r0, r1, i0, 1, 0);\n}\n\n#define jit_modr_i(r0, r1, r2)\t\tx86_modr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_modr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_i_(r0, r1, r2, 1, 0);\n}\n\n#define jit_modi_ui(r0, r1, i0)\t\tx86_modi_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_modi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_divi_i_(r0, r1, i0, 0, 0);\n}\n\n#define jit_modr_ui(r0, r1, r2)\t\tx86_modr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_modr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_divr_i_(r0, r1, r2, 0, 0);\n}\n\n/* Shifts */\n#define jit_shift32(r0, r1, r2, i0)\tx86_shift32(_jit, r0, r1, r2, i0)\n__jit_inline void\nx86_shift32(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2,\n\t    x86_rotsh_t code)\n{\n    jit_gpr_t\tlsh;\n\n    if (r0 != _RCX && r2 != _RCX)\n\tjit_pushr_i(_RCX);\n\n    if (r1 == _RCX) {\n\tif (r0 != _RCX) {\n\t    if (r0 == r2)\n\t\tjit_xchgr_i(_RCX, r0);\n\t    else {\n\t\tMOVLrr(_RCX, r0);\n\t\tMOVLrr(r2, _RCX);\n\t    }\n\t    lsh = r0;\n\t}\n\t/* r0 == _RCX */\n\telse if (r2 == _RCX) {\n\t    jit_pushr_i(_RAX);\n\t    MOVLrr(_RCX, _RAX);\n\t    lsh = _RAX;\n\t}\n\telse {\n\t    jit_pushr_i(r2);\n\t    jit_xchgr_i(_RCX, r2);\n\t    lsh = r2;\n\t}\n    }\n    /* r1 != _RCX */\n    else if (r0 == _RCX) {\n\tjit_pushr_i(r1);\n\tif (r2 != _RCX)\n\t    MOVLrr(r2, _RCX);\n\tlsh = r1;\n    }\n    else {\n\tif (r2 != _RCX)\n\t    MOVLrr(r2, _RCX);\n\tif (r0 != r1)\n\t    MOVLrr(r1, r0);\n\tlsh = r0;\n    }\n\n    _ROTSHILrr(code, _RCX, lsh);\n\n    if (lsh != r0) {\n\tMOVLrr(lsh, r0);\n\tjit_popr_i(lsh);\n    }\n\n    if (r0 != _RCX && r2 != _RCX)\n\tjit_popr_i(_RCX);\n}\n\n#define jit_lshi_i(r0, r1, i0)\t\tx86_lshi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_lshi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    if (i0 == 0)\n\tjit_movr_i(r0, r1);\n    else if (i0 <= 3)\n\tLEALmr(0, _NOREG, r1, i0 == 1 ? _SCL2 : i0 == 2 ? _SCL4 : _SCL8, r0);\n    else {\n\tjit_movr_i(r0, r1);\n\tSHLLir(i0, r0);\n    }\n}\n\n#define jit_lshr_i(r0, r1, r2)\t\tx86_lshr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_lshr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_shift32(r0, r1, r2, X86_SHL);\n}\n\n#define jit_rshi_i(r0, r1, i0)\t\tx86_rshi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_rshi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    jit_movr_i(r0, r1);\n    if (i0)\n\tSARLir(i0, r0);\n}\n\n#define jit_rshr_i(r0, r1, r2)\t\tx86_rshr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_rshr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_shift32(r0, r1, r2, X86_SAR);\n}\n\n#define jit_rshi_ui(r0, r1, i0)\t\tx86_rshi_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_rshi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    jit_movr_i(r0, r1);\n    if (i0)\n\tSHRLir(i0, r0);\n}\n\n#define jit_rshr_ui(r0, r1, r2)\t\tx86_rshr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_rshr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_shift32(r0, r1, r2, X86_SHR);\n}\n\n/* Boolean */\n#define jit_cmp_ri32(r0, r1, i0, i1)\tx86_cmp_ri32(_jit, r0, r1, i0, i1)\n__jit_inline void\nx86_cmp_ri32(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0, x86_cc_t cc)\n{\n    int\t\top;\n    jit_gpr_t\treg;\n\n    op = r0 == r1;\n    if (jit_reg8_p(r0)) {\n\tif (!op)\n\t    XORLrr(r0, r0);\n\tCMPLir(i0, r1);\n\tif (op)\n\t    MOVLir(0, r0);\n\tSETCCir(cc, r0);\n    }\n    else {\n\treg = r1 == _RAX ? _RDX : _RAX;\n\tif (op)\n\t    jit_pushr_i(reg);\n\telse\n\t    MOVLrr(reg, r0);\n\tXORLrr(reg, reg);\n\tCMPLir(i0, r1);\n\tSETCCir(cc, reg);\n\tif (op) {\n\t    MOVLrr(reg, r0);\n\t    jit_popr_i(reg);\n\t}\n\telse\n\t    jit_xchgr_i(reg, r0);\n    }\n}\n\n#define jit_test_r32(r0, r1, i0)\tx86_test_r32(_jit, r0, r1, i0)\n__jit_inline void\nx86_test_r32(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, x86_cc_t cc)\n{\n    int\t\top;\n    jit_gpr_t\treg;\n\n    op = r0 == r1;\n    if (jit_reg8_p(r0)) {\n\tif (!op)\n\t    XORLrr(r0, r0);\n\tTESTLrr(r1, r1);\n\tif (op)\n\t    MOVLir(0, r0);\n\tSETCCir(cc, r0);\n    }\n    else {\n\treg = r1 == _RAX ? _RDX : _RAX;\n\tif (op)\n\t    jit_pushr_i(reg);\n\telse\n\t    MOVLrr(reg, r0);\n\tXORLrr(reg, reg);\n\tTESTLrr(r1, r1);\n\tSETCCir(cc, reg);\n\tif (op) {\n\t    MOVLrr(reg, r0);\n\t    jit_popr_i(reg);\n\t}\n\telse\n\t    jit_xchgr_i(reg, r0);\n    }\n}\n\n#define jit_cmp_rr32(r0, r1, r2, i0)\tx86_cmp_rr32(_jit, r0, r1, r2, i0)\n__jit_inline void\nx86_cmp_rr32(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2,\n\t     x86_cc_t cc)\n{\n    int\t\top;\n    jit_gpr_t\treg;\n\n    op = r0 == r1 || r0 == r2;\n    if (jit_reg8_p(r0)) {\n\tif (!op)\n\t    XORLrr(r0, r0);\n\tCMPLrr(r2, r1);\n\tif (op)\n\t    MOVLir(0, r0);\n\tSETCCir(cc, r0);\n    }\n    else {\n\tif (r1 == _RAX || r2 == _RAX) {\n\t    if (r1 == _RDX || r2 == _RDX)\n\t\treg = _RCX;\n\t    else\n\t\treg = _RDX;\n\t}\n\telse\n\t    reg = _RAX;\n\tif (op)\n\t    jit_pushr_i(reg);\n\telse\n\t    MOVLrr(reg, r0);\n\tXORLrr(reg, reg);\n\tCMPLrr(r2, r1);\n\tSETCCir(cc, reg);\n\tif (op) {\n\t    MOVLrr(reg, r0);\n\t    jit_popr_i(reg);\n\t}\n\telse\n\t    jit_xchgr_i(reg, r0);\n    }\n}\n\n#define jit_lti_i(r0, r1, i0)\t\tx86_lti_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_lti_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0)\n\tjit_cmp_ri32(r0, r1, i0,\tX86_CC_L);\n    else\n\tjit_test_r32(r0, r1,\t\tX86_CC_S);\n}\n\n#define jit_ltr_i(r0, r1, r2)\t\tx86_ltr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_ltr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr32(r0, r1, r2,\t\tX86_CC_L);\n}\n\n#define jit_lei_i(r0, r1, i0)\t\tx86_lei_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_lei_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_cmp_ri32(r0, r1, i0,\t\tX86_CC_LE);\n}\n\n#define jit_ler_i(r0, r1, r2)\t\tx86_ler_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_ler_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr32(r0, r1, r2,\tX86_CC_LE);\n}\n\n#define jit_eqi_i(r0, r1, i0)\t\tx86_eqi_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_eqi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0)\n\tjit_cmp_ri32(r0, r1, i0,\tX86_CC_E);\n    else\n\tjit_test_r32(r0, r1,\t\tX86_CC_E);\n}\n\n#define jit_eqr_i(r0, r1, r2)\t\tx86_eqr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_eqr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr32(r0, r1, r2,\tX86_CC_E);\n}\n\n#define jit_gei_i(r0, r1, i0)\t\tx86_gei_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_gei_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0)\n\tjit_cmp_ri32(r0, r1, i0,\tX86_CC_GE);\n    else\n\tjit_test_r32(r0, r1,\t\tX86_CC_NS);\n}\n\n#define jit_ger_i(r0, r1, r2)\t\tx86_ger_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_ger_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr32(r0, r1, r2,\tX86_CC_GE);\n}\n\n#define jit_gti_i(r0, r1, i0)\t\tx86_gti_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_gti_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_cmp_ri32(r0, r1, i0,\t\tX86_CC_G);\n}\n\n#define jit_gtr_i(r0, r1, r2)\t\tx86_gtr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_gtr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr32(r0, r1, r2,\t\tX86_CC_G);\n}\n\n#define jit_nei_i(r0, r1, i0)\t\tx86_nei_i(_jit, r0, r1, i0)\n__jit_inline void\nx86_nei_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0)\n\tjit_cmp_ri32(r0, r1, i0,\tX86_CC_NE);\n    else\n\tjit_test_r32(r0, r1,\t\tX86_CC_NE);\n}\n\n#define jit_ner_i(r0, r1, r2)\t\tx86_ner_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_ner_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tXORLrr(r0, r0);\n    else\n\tjit_cmp_rr32(r0, r1, r2,\tX86_CC_NE);\n}\n\n#define jit_lti_ui(r0, r1, i0)\t\tx86_lti_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_lti_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_cmp_ri32(r0, r1, i0,\t\tX86_CC_B);\n}\n\n#define jit_ltr_ui(r0, r1, r2)\t\tx86_ltr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_ltr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr32(r0, r1, r2,\t\tX86_CC_B);\n}\n\n#define jit_lei_ui(r0, r1, i0)\t\tx86_lei_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_lei_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (i0)\n\tjit_cmp_ri32(r0, r1, i0,\tX86_CC_BE);\n    else\n\tjit_test_r32(r0, r1,\t\tX86_CC_E);\n}\n\n#define jit_ler_ui(r0, r1, r2)\t\tx86_ler_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_ler_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr32(r0, r1, r2,\tX86_CC_BE);\n}\n\n#define jit_gei_ui(r0, r1, i0)\t\tx86_gei_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_gei_ui(jit_state_t _jit,\n\t   jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (i0)\n\tjit_cmp_ri32(r0, r1, i0,\tX86_CC_AE);\n    else\n\tjit_test_r32(r0, r1,\t\tX86_CC_NB);\n}\n\n#define jit_ger_ui(r0, r1, r2)\t\tx86_ger_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_ger_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r1 == r2)\n\tMOVLir(1, r0);\n    else\n\tjit_cmp_rr32(r0, r1, r2,\tX86_CC_AE);\n}\n\n#define jit_gti_ui(r0, r1, i0)\t\tx86_gti_ui(_jit, r0, r1, i0)\n__jit_inline void\nx86_gti_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (i0)\n\tjit_cmp_ri32(r0, r1, i0,\tX86_CC_A);\n    else\n\tjit_test_r32(r0, r1,\t\tX86_CC_NE);\n}\n\n#define jit_gtr_ui(r0, r1, r2)\t\tx86_gtr_ui(_jit, r0, r1, r2)\n__jit_inline void\nx86_gtr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_cmp_rr32(r0, r1, r2,\t\tX86_CC_A);\n}\n\n/* Jump */\n#define jit_bcmp_ri32(i0, r0, i1, i2)\tx86_bcmp_ri32(_jit, i0, r0, i1, i2)\n__jit_inline void\nx86_bcmp_ri32(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0,\n\t      x86_cc_t cc)\n{\n    CMPLir(i0, r0);\n    JCCim(cc, label);\n}\n\n#define jit_btest_r32(i0, r0, i1)\tx86_btest_r32(_jit, i0, r0, i1)\n__jit_inline void\nx86_btest_r32(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, x86_cc_t cc)\n{\n    TESTLrr(r0, r0);\n    JCCim(cc, label);\n}\n\n#define jit_bcmp_rr32(i0, r0, r1, i1)\tx86_bcmp_rr32(_jit, i0, r0, r1, i1)\n__jit_inline void\nx86_bcmp_rr32(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1,\n\t      x86_cc_t cc)\n{\n    CMPLrr(r1, r0);\n    JCCim(cc, label);\n}\n\n#define jit_blti_i(label, r0, i0)\tx86_blti_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blti_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    if (i0)\n\tjit_bcmp_ri32(label, r0, i0,\tX86_CC_L);\n    else\n\tjit_btest_r32(label, r0,\tX86_CC_S);\n    return (_jit->x.pc);\n}\n\n#define jit_bltr_i(label, r0, r1)\tx86_bltr_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bltr_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr32(label, r0, r1,\tX86_CC_L);\n    return (_jit->x.pc);\n}\n\n#define jit_blei_i(label, r0, i0)\tx86_blei_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blei_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    jit_bcmp_ri32(label, r0, i0,\tX86_CC_LE);\n    return (_jit->x.pc);\n}\n\n#define jit_bler_i(label, r0, r1)\tx86_bler_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bler_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr32(label, r0, r1,\tX86_CC_LE);\n    return (_jit->x.pc);\n}\n\n#define jit_beqi_i(label, r0, i0)\tx86_beqi_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_beqi_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    if (i0)\n\tjit_bcmp_ri32(label, r0, i0,\tX86_CC_E);\n    else\n\tjit_btest_r32(label, r0,\tX86_CC_E);\n    return (_jit->x.pc);\n}\n\n#define jit_beqr_i(label, r0, r1)\tx86_beqr_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_beqr_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr32(label, r0, r1,\tX86_CC_E);\n    return (_jit->x.pc);\n}\n\n#define jit_bgei_i(label, r0, i0)\tx86_bgei_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgei_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    if (i0)\n\tjit_bcmp_ri32(label, r0, i0,\tX86_CC_GE);\n    else\n\tjit_btest_r32(label, r0,\tX86_CC_NS);\n    return (_jit->x.pc);\n}\n\n#define jit_bger_i(label, r0, r1)\tx86_bger_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bger_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr32(label, r0, r1,\tX86_CC_GE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgti_i(label, r0, i0)\tx86_bgti_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgti_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    jit_bcmp_ri32(label, r0, i0,\tX86_CC_G);\n    return (_jit->x.pc);\n}\n\n#define jit_bgtr_i(label, r0, r1)\tx86_bgtr_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bgtr_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr32(label, r0, r1,\tX86_CC_G);\n    return (_jit->x.pc);\n}\n\n#define jit_bnei_i(label, r0, i0)\tx86_bnei_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bnei_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    if (i0)\n\tjit_bcmp_ri32(label, r0, i0,\tX86_CC_NE);\n    else\n\tjit_btest_r32(label, r0,\tX86_CC_NE);\n    return (_jit->x.pc);\n}\n\n#define jit_bner_i(label, r0, r1)\tx86_bner_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bner_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    /* need to return a patchable address even if r0 == r1 */\n    jit_bcmp_rr32(label, r0, r1,\tX86_CC_NE);\n    return (_jit->x.pc);\n}\n\n#define jit_blti_ui(label, r0, i0)\tx86_blti_ui(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blti_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned int i0)\n{\n    /* need to return a patchable address even if i0 == 0 */\n    jit_bcmp_ri32(label, r0, i0,\tX86_CC_B);\n    return (_jit->x.pc);\n}\n\n#define jit_bltr_ui(label, r0, r1)\tx86_bltr_ui(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bltr_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr32(label, r0, r1,\tX86_CC_B);\n    return (_jit->x.pc);\n}\n\n#define jit_blei_ui(label, r0, i0)\tx86_blei_ui(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_blei_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned int i0)\n{\n    /* need to return a patchable address even if i0 == 0 */\n    jit_bcmp_ri32(label, r0, i0,\tX86_CC_BE);\n    return (_jit->x.pc);\n}\n\n#define jit_bler_ui(label, r0, r1)\tx86_bler_ui(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bler_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr32(label, r0, r1,\tX86_CC_BE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgei_ui(label, r0, i0)\tx86_bgei_ui(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgei_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned int i0)\n{\n    if (i0 == 0)\n\tJMPm(label);\n    else\n\tjit_bcmp_ri32(label, r0, i0,\tX86_CC_AE);\n    return (_jit->x.pc);\n}\n\n#define jit_bger_ui(label, r0, r1)\tx86_bger_ui(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bger_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 == r1)\n\tJMPm(label);\n    else\n\tjit_bcmp_rr32(label, r0, r1,\tX86_CC_AE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgti_ui(label, r0, i0)\tx86_bgti_ui(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bgti_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned int i0)\n{\n    if (i0)\n\tjit_bcmp_ri32(label, r0, i0,\tX86_CC_A);\n    else\n\tjit_btest_r32(label, r0,\tX86_CC_NE);\n    return (_jit->x.pc);\n}\n\n#define jit_bgtr_ui(label, r0, r1)\tx86_bgtr_ui(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bgtr_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_bcmp_rr32(label, r0, r1,\tX86_CC_A);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddi_i(label, r0, i0)\tx86_boaddi_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_boaddi_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    ADDLir(i0, r0);\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddr_i(label, r0, r1)\tx86_boaddr_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_boaddr_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    ADDLrr(r1, r0);\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubi_i(label, r0, i0)\tx86_bosubi_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bosubi_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    SUBLir(i0, r0);\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubr_i(label, r0, r1)\tx86_bosubr_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bosubr_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    SUBLrr(r1, r0);\n    JOm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddi_ui(label, r0, i0)\tx86_boaddi_ui(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_boaddi_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned int i0)\n{\n    ADDLir((int)i0, r0);\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_boaddr_ui(label, r0, r1)\tx86_boaddr_ui(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_boaddr_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    ADDLrr(r1, r0);\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubi_ui(label, r0, i0)\tx86_bosubi_ui(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bosubi_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, unsigned int i0)\n{\n    SUBLir((int)i0, r0);\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubr_ui(label, r0, r1)\tx86_bosubr_ui(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bosubr_ui(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    SUBLrr(r1, r0);\n    JCm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmsi_i(label, r0, i0)\tx86_bmsi_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bmsi_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    if (jit_reg8_p(r0) && _u8P(i0))\n\tTESTBir(i0, r0);\n    /* valid in 64 bits mode */\n    else if (_u16P(i0))\n\tTESTWir(i0, r0);\n    else\n\tTESTLir(i0, r0);\n    JNZm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmsr_i(label, r0, r1)\tx86_bmsr_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bmsr_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    TESTLrr(r1, r0);\n    JNZm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmci_i(label, r0, i0)\tx86_bmci_i(_jit, label, r0, i0)\n__jit_inline jit_insn *\nx86_bmci_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, int i0)\n{\n    if (jit_reg8_p(r0) && _u8P(i0))\n\tTESTBir(i0, r0);\n    /* valid in 64 bits mode */\n    else if (_u16P(i0))\n\tTESTWir(i0, r0);\n    else\n\tTESTLir(i0, r0);\n    JZm(label);\n    return (_jit->x.pc);\n}\n\n#define jit_bmcr_i(label, r0, r1)\tx86_bmcr_i(_jit, label, r0, r1)\n__jit_inline jit_insn *\nx86_bmcr_i(jit_state_t _jit, jit_insn *label, jit_gpr_t r0, jit_gpr_t r1)\n{\n    TESTLrr(r1, r0);\n    JZm(label);\n    return (_jit->x.pc);\n}\n\n/* Memory */\n#define jit_ntoh_us(r0, r1)\t\tx86_ntoh_us(_jit, r0, r1)\n__jit_inline void\nx86_ntoh_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_movr_i(r0, r1);\n    RORWir(8, r0);\n}\n\n#define jit_ntoh_ui(r0, r1)\t\tx86_ntoh_ui(_jit, r0, r1)\n__jit_inline void\nx86_ntoh_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_movr_i(r0, r1);\n    BSWAPLr(r0);\n}\n\n#define jit_extr_c_i(r0, r1)\t\tx86_extr_c_i(_jit, r0, r1)\n__jit_inline void\nx86_extr_c_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_gpr_t\trep;\n\n    if (jit_reg8_p(r1))\n\tMOVSBLrr(r1, r0);\n    else {\n\tif (r0 == _RAX)\n\t    rep = _RDX;\n\telse\n\t    rep = _RAX;\n\tif (r0 != r1)\n\t    jit_xchgr_i(rep, r1);\n\telse {\n\t    jit_pushr_i(rep);\n\t    MOVLrr(r1, rep);\n\t}\n\tMOVSBLrr(rep, r0);\n\tif (r0 != r1)\n\t    jit_xchgr_i(rep, r1);\n\telse\n\t    jit_popr_i(rep);\n    }\n}\n\n#define jit_extr_c_ui(r0, r1)\t\tx86_extr_c_ui(_jit, r0, r1)\n__jit_inline void\nx86_extr_c_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_gpr_t\trep;\n\n    if (jit_reg8_p(r1))\n\tMOVZBLrr(r1, r0);\n    else {\n\tif (r0 == _RAX)\n\t    rep = _RDX;\n\telse\n\t    rep = _RAX;\n\tif (r0 != r1)\n\t    jit_xchgr_i(rep, r1);\n\telse {\n\t    jit_pushr_i(rep);\n\t    MOVLrr(r1, rep);\n\t}\n\tMOVZBLrr(rep, r0);\n\tif (r0 != r1)\n\t    jit_xchgr_i(rep, r1);\n\telse\n\t    jit_popr_i(rep);\n    }\n}\n\n#define jit_extr_s_i(r0, r1)\t\tx86_extr_s_i(_jit, r0, r1)\n__jit_inline void\nx86_extr_s_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSWLrr(r1, r0);\n}\n\n#define jit_extr_s_ui(r0, r1)\t\tx86_extr_s_ui(_jit, r0, r1)\n__jit_inline void\nx86_extr_s_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVZWLrr(r1, r0);\n}\n\n#define jit_ldr_uc(r0, r1)\t\tx86_ldr_uc(_jit, r0, r1)\n__jit_inline void\nx86_ldr_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVZBLmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxr_uc(r0, r1, r2)\t\tx86_ldxr_uc(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVZBLmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_ldr_us(r0, r1)\t\tx86_ldr_us(_jit, r0, r1)\n__jit_inline void\nx86_ldr_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVZWLmr(0, r1, _NOREG, _SCL1, r0);\n}\n\n#define jit_ldxr_us(r0, r1, r2)\t\tx86_ldxr_us(_jit, r0, r1, r2)\n__jit_inline void\nx86_ldxr_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVZWLmr(0, r1, r2, _SCL1, r0);\n}\n\n#define jit_str_s(r0, r1)\t\tx86_str_s(_jit, r0, r1)\n__jit_inline void\nx86_str_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVWrm(r1, 0, r0, _NOREG, _SCL1);\n}\n\n#define jit_stxr_s(r0, r1, r2)\t\tx86_stxr_s(_jit, r0, r1, r2)\n__jit_inline void\nx86_stxr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVWrm(r2, 0, r0, r1, _SCL1);\n}\n\n#define jit_str_i(r0, r1)\t\tx86_str_i(_jit, r0, r1)\n__jit_inline void\nx86_str_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVLrm(r1, 0, r0, _NOREG, _SCL1);\n}\n\n#define jit_stxr_i(r0, r1, r2)\t\tx86_stxr_i(_jit, r0, r1, r2)\n__jit_inline void\nx86_stxr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    MOVLrm(r2, 0, r0, r1, _SCL1);\n}\n\n/* Extra */\n#define jit_nop(n)\t\t\tx86_nop(_jit, n)\n__jit_inline void\nx86_nop(jit_state_t _jit)\n{\n    NOP_();\n}\n\n#define jit_align(n) \t\t\tx86_align(_jit, n)\n__jit_inline void\nx86_align(jit_state_t _jit, int n)\n{\n    int\t\talign = ((((_ul)_jit->x.pc) ^ _MASK(4)) + 1) & _MASK(n);\n\n    NOPi(align);\n}\n\n#if __WORDSIZE == 64\n#include \"core-64.h\"\n#else\n#include \"core-32.h\"\n#endif\n\n#endif /* __lightning_core_i386_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/fp-32.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tSupport macros for the i386 math coprocessor\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000,2001,2002,2004,2008,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n#ifndef __lightning_fp_h\n#define __lightning_fp_h\n\n#define JIT_FPRET\t\t\t_ST0\n\n#define JIT_FPR_NUM\t\t\t6\nstatic const jit_fpr_t\njit_x87_order[JIT_FPR_NUM] = {\n    _ST0, _ST1, _ST2, _ST3, _ST4, _ST5\n};\nstatic const jit_fpr_t\njit_sse_order[JIT_FPR_NUM] = {\n    _XMM0, _XMM1, _XMM2, _XMM3, _XMM4, _XMM5\n};\n#define JIT_FPR(i)\t\t\t\t\t\t\t\\\n    (jit_sse2_p() ? jit_sse_order[i] : jit_x87_order[i])\n\n#define jit_retval_f(f0)\t\tx86_retval_f(_jit, f0)\n__jit_inline void\nx86_retval_f(jit_state_t _jit, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0)) {\n\tFSTPr(_ST1);\n\tsse_from_x87_f(_jit, f0, JIT_FPRET);\n    }\n    else\n\tFSTPr((jit_fpr_t)(f0 + 1));\n}\n\n#define jit_retval_d(f0)\t\tx86_retval_d(_jit, f0)\n__jit_inline void\nx86_retval_d(jit_state_t _jit, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0)) {\n\tFSTPr(_ST1);\n\tsse_from_x87_d(_jit, f0, JIT_FPRET);\n    }\n    else\n\tFSTPr((jit_fpr_t)(f0 + 1));\n}\n\n#define jit_pusharg_f(f0)\t\tx86_pusharg_f(_jit, f0)\n__jit_inline void\nx86_pusharg_f(jit_state_t _jit, jit_fpr_t f0)\n{\n    _jitl.stack_offset -= sizeof(float);\n    assert(_jitl.stack_offset >= 0);\n    if (jit_push_pop_p()) {\n\tint\tpad = -_jitl.stack_length & 15;\n\t_jitl.stack_length += pad;\n\tjit_subi_l(JIT_SP, JIT_SP, pad + sizeof(float));\n\tjit_str_f(JIT_SP, f0);\n    }\n    else\n\tjit_stxi_f(_jitl.stack_offset, JIT_SP, f0);\n}\n\n#define jit_pusharg_d(f0)\t\tx86_pusharg_d(_jit, f0)\n__jit_inline void\nx86_pusharg_d(jit_state_t _jit, jit_fpr_t f0)\n{\n    _jitl.stack_offset -= sizeof(double);\n    assert(_jitl.stack_offset >= 0);\n    if (jit_push_pop_p()) {\n\tint\tpad = -_jitl.stack_length & 15;\n\t_jitl.stack_length += pad;\n\tjit_subi_l(JIT_SP, JIT_SP, pad + sizeof(double));\n\tjit_str_d(JIT_SP, f0);\n    }\n    else\n\tjit_stxi_d(_jitl.stack_offset, JIT_SP, f0);\n}\n\n#define jit_prepare_f(nf)\t\tx86_prepare_f(_jit, nf)\n__jit_inline void\nx86_prepare_f(jit_state_t _jit, int count)\n{\n    assert(count >= 0);\n    _jitl.stack_offset += count << 2;\n    if (jit_push_pop_p())\n\t_jitl.stack_length = _jitl.stack_offset;\n    else  if (_jitl.stack_length < _jitl.stack_offset) {\n\t_jitl.stack_length = _jitl.stack_offset;\n\t*_jitl.stack = 12 + ((_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 15) & ~15);\n    }\n}\n\n#define jit_prepare_d(nd)\t\tx86_prepare_d(_jit, nd)\n__jit_inline void\nx86_prepare_d(jit_state_t _jit, int count)\n{\n    assert(count >= 0);\n    _jitl.stack_offset += count << 3;\n    if (jit_push_pop_p())\n\t_jitl.stack_length = _jitl.stack_offset;\n    else  if (_jitl.stack_length < _jitl.stack_offset) {\n\t_jitl.stack_length = _jitl.stack_offset;\n\t*_jitl.stack = 12 + ((_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 15) & ~15);\n    }\n}\n\n#define jit_arg_f()\t\t\tx86_arg_f(_jit)\n__jit_inline int\nx86_arg_f(jit_state_t _jit)\n{\n    int\t\tofs = _jitl.framesize;\n    _jitl.framesize += sizeof(float);\n    return (ofs);\n}\n\n#define jit_arg_d()\t\t\tx86_arg_d(_jit)\n__jit_inline int\nx86_arg_d(jit_state_t _jit)\n{\n    int\t\tofs = _jitl.framesize;\n    _jitl.framesize += sizeof(double);\n    return (ofs);\n}\n\n#define jit_getarg_f(f0, ofs)\t\tx86_getarg_f(_jit, f0, ofs)\n__jit_inline void\nx86_getarg_f(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    jit_ldxi_f(f0, JIT_FP, ofs);\n}\n\n#define jit_getarg_d(f0, ofs)\t\tx86_getarg_d(_jit, f0, ofs)\n__jit_inline void\nx86_getarg_d(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    jit_ldxi_d(f0, JIT_FP, ofs);\n}\n\n#endif /* __lightning_fp_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/fp-64.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tSupport macros for SSE floating-point math\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2006,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n#ifndef __lightning_fp_h\n#define __lightning_fp_h\n\n#define JIT_FPRET\t\t\t_XMM0\n\n#define JIT_FPR_NUM\t\t\t6\nstatic const jit_fpr_t\njit_sse_order[JIT_FPR_NUM] = {\n    _XMM8, _XMM9, _XMM10, _XMM11, _XMM12, _XMM13\n};\n#define JIT_FPR(i)\t\t\tjit_sse_order[i]\n\n#define jit_extr_l_f(f0, r0)\t\tx86_extr_l_f(_jit, f0, r0)\n__jit_inline void\nx86_extr_l_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    sse_extr_l_f(_jit, f0, r0);\n}\n\n#define jit_extr_l_d(f0, r0)\t\tx86_extr_l_d(_jit, f0, r0)\n__jit_inline void\nx86_extr_l_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    sse_extr_l_d(_jit, f0, r0);\n}\n\n#define jit_rintr_f_l(r0, f0)\t\tx86_rintr_f_l(_jit, r0, f0)\n__jit_inline void\nx86_rintr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_rintr_f_l(_jit, r0, f0);\n}\n\n#define jit_rintr_d_l(r0, f0)\t\tx86_rintr_d_l(_jit, r0, f0)\n__jit_inline void\nx86_rintr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_rintr_d_l(_jit, r0, f0);\n}\n\n#define jit_roundr_f_l(r0, f0)\t\tx86_roundr_f_l(_jit, r0, f0)\n__jit_inline void\nx86_roundr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_roundr_f_l(_jit, r0, f0);\n}\n\n#define jit_roundr_d_l(r0, f0)\t\tx86_roundr_d_l(_jit, r0, f0)\n__jit_inline void\nx86_roundr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_roundr_d_l(_jit, r0, f0);\n}\n\n#define jit_truncr_f_l(r0, f0)\t\tx86_truncr_f_l(_jit, r0, f0)\n__jit_inline void\nx86_truncr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_truncr_f_l(_jit, r0, f0);\n}\n\n#define jit_truncr_d_l(r0, f0)\t\tx86_truncr_d_l(_jit, r0, f0)\n__jit_inline void\nx86_truncr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_truncr_d_l(_jit, r0, f0);\n}\n\n#define jit_floorr_f_l(r0, f0)\t\tx86_floorr_f_l(_jit, r0, f0)\n__jit_inline void\nx86_floorr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_floorr_f_l(_jit, r0, f0);\n}\n\n#define jit_floorr_d_l(r0, f0)\t\tx86_floorr_d_l(_jit, r0, f0)\n__jit_inline void\nx86_floorr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_floorr_d_l(_jit, r0, f0);\n}\n\n#define jit_ceilr_f_l(r0, f0)\t\tx86_ceilr_f_l(_jit, r0, f0)\n__jit_inline void\nx86_ceilr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_ceilr_f_l(_jit, r0, f0);\n}\n\n#define jit_ceilr_d_l(r0, f0)\t\tx86_ceilr_d_l(_jit, r0, f0)\n__jit_inline void\nx86_ceilr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    sse_ceilr_d_l(_jit, r0, f0);\n}\n\n#define jit_prolog_d(nf)\t\tx86_prolog_f(_jit, nf)\n#define jit_prolog_f(nf)\t\tx86_prolog_f(_jit, nf)\n__jit_inline void\nx86_prolog_f(jit_state_t _jit, int count)\n{\n    /* Space reserved to add assertions about prolog*\n     * matching arg* and getarg* calls */\n}\n\n#define jit_prepare_d(nf)\t\tx86_prepare_f(_jit, nf)\n#define jit_prepare_f(nf)\t\tx86_prepare_f(_jit, nf)\n__jit_inline void\nx86_prepare_f(jit_state_t _jit, int count)\n{\n    assert(count >= 0);\n    _jitl.nextarg_putfp += count;\n    if (_jitl.nextarg_putfp > JIT_FP_ARG_MAX) {\n\tif ((count = (_jitl.nextarg_puti - JIT_ARG_MAX)) < 0)\n\t    count = 0;\n\tcount += _jitl.nextarg_putfp - JIT_FP_ARG_MAX;\n\t_jitl.stack_offset = count << 3;\n\tif (jit_push_pop_p())\n\t    _jitl.stack_length = _jitl.stack_offset;\n\telse if (_jitl.stack_length < _jitl.stack_offset) {\n\t    _jitl.stack_length = _jitl.stack_offset;\n\t    *_jitl.stack = (_jitl.alloca_offset +\n\t\t\t    _jitl.stack_length + 15) & ~15;\n\t}\n\t_jitl.fprssize = JIT_FP_ARG_MAX;\n    }\n    else\n\t_jitl.fprssize += count;\n}\n\n#define jit_arg_d()\t\t\tx86_arg_f(_jit)\n#define jit_arg_f()\t\t\tx86_arg_f(_jit)\n__jit_inline int\nx86_arg_f(jit_state_t _jit)\n{\n    int\t\tofs;\n\n    if (_jitl.nextarg_getfp < JIT_FP_ARG_MAX)\n\tofs = _jitl.nextarg_getfp++;\n    else {\n\tofs = _jitl.framesize;\n\t_jitl.framesize += sizeof(double);\n    }\n\n    return (ofs);\n}\n\n#define jit_getarg_f(f0, ofs)\t\tx86_getarg_f(_jit, f0, ofs)\n__jit_inline void\nx86_getarg_f(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    if (ofs < JIT_FP_ARG_MAX)\n\tjit_movr_f(f0, (jit_fpr_t)(_XMM0 + ofs));\n    else\n\tjit_ldxi_f(f0, JIT_FP, ofs);\n}\n\n#define jit_getarg_d(f0, ofs)\t\tx86_getarg_d(_jit, f0, ofs)\n__jit_inline void\nx86_getarg_d(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    if (ofs < JIT_FP_ARG_MAX)\n\tjit_movr_d(f0, (jit_fpr_t)(_XMM0 + ofs));\n    else\n\tjit_ldxi_d(f0, JIT_FP, ofs);\n}\n\n#define jit_pusharg_f(f0)\t\tx86_pusharg_f(_jit, f0)\n__jit_inline void\nx86_pusharg_f(jit_state_t _jit, jit_fpr_t f0)\n{\n    assert(_jitl.nextarg_putfp > 0);\n    if (--_jitl.nextarg_putfp >= JIT_FP_ARG_MAX) {\n\t_jitl.stack_offset -= sizeof(double);\n\tassert(_jitl.stack_offset >= 0);\n\tif (jit_push_pop_p()) {\n\t    int\tpad = -_jitl.stack_length & 15;\n\t    _jitl.stack_length += pad;\n\t    jit_subi_l(JIT_SP, JIT_SP, pad + sizeof(double));\n\t    jit_str_f(JIT_SP, f0);\n\t}\n\telse\n\t    jit_stxi_f(_jitl.stack_offset, JIT_SP, f0);\n    }\n    else\n\tjit_movr_f((jit_fpr_t)(_XMM0 + _jitl.nextarg_putfp), f0);\n}\n\n#define jit_pusharg_d(f0)\t\tx86_pusharg_d(_jit, f0)\n__jit_inline void\nx86_pusharg_d(jit_state_t _jit, jit_fpr_t f0)\n{\n    assert(_jitl.nextarg_putfp > 0);\n    if (--_jitl.nextarg_putfp >= JIT_FP_ARG_MAX) {\n\t_jitl.stack_offset -= sizeof(double);\n\tassert(_jitl.stack_offset >= 0);\n\tif (jit_push_pop_p()) {\n\t    int\tpad = -_jitl.stack_length & 15;\n\t    _jitl.stack_length += pad;\n\t    jit_subi_l(JIT_SP, JIT_SP, pad + sizeof(double));\n\t    jit_str_d(JIT_SP, f0);\n\t}\n\telse\n\t    jit_stxi_d(_jitl.stack_offset, JIT_SP, f0);\n    }\n    else\n\tjit_movr_d((jit_fpr_t)(_XMM0 + _jitl.nextarg_putfp), f0);\n}\n\n#endif /* __lightning_fp_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/fp-sse.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tSupport macros for SSE floating-point math\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2006,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n#ifndef __lightning_fp_sse_h\n#define __lightning_fp_sse_h\n\n__jit_inline void\nsse_addr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tADDSSrr(f2, f0);\n    else if (f0 == f2)\n\tADDSSrr(f1, f0);\n    else {\n\tMOVSSrr(f1, f0);\n\tADDSSrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_addr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tADDSDrr(f2, f0);\n    else if (f0 == f2)\n\tADDSDrr(f1, f0);\n    else {\n\tMOVSDrr(f1, f0);\n\tADDSDrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_subr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tSUBSSrr(f2, f0);\n    else if (f0 == f2) {\n\tMOVSSrr(f0, JIT_FPTMP0);\n\tMOVSSrr(f1, f0);\n\tSUBSSrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tMOVSSrr(f1, f0);\n\tSUBSSrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_subr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tSUBSDrr(f2, f0);\n    else if (f0 == f2) {\n\tMOVSDrr(f0, JIT_FPTMP0);\n\tMOVSDrr(f1, f0);\n\tSUBSDrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tMOVSDrr(f1, f0);\n\tSUBSDrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_mulr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tMULSSrr(f2, f0);\n    else if (f0 == f2)\n\tMULSSrr(f1, f0);\n    else {\n\tMOVSSrr(f1, f0);\n\tMULSSrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_mulr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tMULSDrr(f2, f0);\n    else if (f0 == f2)\n\tMULSDrr(f1, f0);\n    else {\n\tMOVSDrr(f1, f0);\n\tMULSDrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_divr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tDIVSSrr(f2, f0);\n    else if (f0 == f2) {\n\tMOVSSrr(f0, JIT_FPTMP0);\n\tMOVSSrr(f1, f0);\n\tDIVSSrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tMOVSSrr(f1, f0);\n\tDIVSSrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_divr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1)\n\tDIVSDrr(f2, f0);\n    else if (f0 == f2) {\n\tMOVSDrr(f0, JIT_FPTMP0);\n\tMOVSDrr(f1, f0);\n\tDIVSDrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tMOVSDrr(f1, f0);\n\tDIVSDrr(f2, f0);\n    }\n}\n\n__jit_inline void\nsse_ldr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    MOVSSmr(0, r0, _NOREG, _SCL1, f0);\n}\n\n__jit_inline void\nsse_ldr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    MOVSDmr(0, r0, _NOREG, _SCL1, f0);\n}\n\n__jit_inline void\nsse_ldi_f(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tsse_ldr_f(_jit, f0, JIT_REXTMP);\n    }\n    else\n#endif\n\tMOVSSmr((long)i0, _NOREG, _NOREG, _SCL1, f0);\n}\n\n__jit_inline void\nsse_ldi_d(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tsse_ldr_d(_jit, f0, JIT_REXTMP);\n    }\n    else\n#endif\n\tMOVSDmr((long)i0, _NOREG, _NOREG, _SCL1, f0);\n}\n\n__jit_inline void\nsse_ldxr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSSmr(0, r0, r1, _SCL1, f0);\n}\n\n__jit_inline void\nsse_ldxr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    MOVSDmr(0, r0, r1, _SCL1, f0);\n}\n\n__jit_inline void\nsse_ldxi_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, long i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, i0);\n\tsse_ldxr_f(_jit, f0, r0, JIT_REXTMP);\n    }\n    else\n#endif\n\tMOVSSmr(i0, r0, _NOREG, _SCL1, f0);\n}\n\n__jit_inline void\nsse_ldxi_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, long i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, i0);\n\tsse_ldxr_d(_jit, f0, r0, JIT_REXTMP);\n    }\n    else\n#endif\n\tMOVSDmr(i0, r0, _NOREG, _SCL1, f0);\n}\n\n__jit_inline void\nsse_str_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    MOVSSrm(f0, 0, r0, _NOREG, _SCL1);\n}\n\n__jit_inline void\nsse_str_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    MOVSDrm(f0, 0, r0, _NOREG, _SCL1);\n}\n\n__jit_inline void\nsse_sti_f(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tsse_str_f(_jit, JIT_REXTMP, f0);\n    }\n    else\n#endif\n\tMOVSSrm(f0, (long)i0, _NOREG, _NOREG, _SCL1);\n}\n\n__jit_inline void\nsse_sti_d(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tsse_str_d(_jit, JIT_REXTMP, f0);\n    }\n    else\n#endif\n\tMOVSDrm(f0, (long)i0, _NOREG, _NOREG, _SCL1);\n}\n\n__jit_inline void\nsse_stxr_f(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    MOVSSrm(f0, 0, r0, r1, _SCL1);\n}\n\n__jit_inline void\nsse_stxr_d(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    MOVSDrm(f0, 0, r0, r1, _SCL1);\n}\n\n__jit_inline void\nsse_stxi_f(jit_state_t _jit, long i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, i0);\n\tsse_stxr_f(_jit, JIT_REXTMP, r0, f0);\n    }\n    else\n#endif\n\tMOVSSrm(f0, i0, r0, _NOREG, _SCL1);\n}\n\n__jit_inline void\nsse_stxi_d(jit_state_t _jit, long i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, i0);\n\tsse_stxr_d(_jit, JIT_REXTMP, r0, f0);\n    }\n    else\n#endif\n\tMOVSDrm(f0, i0, r0, _NOREG, _SCL1);\n}\n\n__jit_inline void\nsse_movi_f(jit_state_t _jit, jit_fpr_t f0, float i0)\n{\n    union {\n\tint\ti;\n\tfloat\tf;\n    } data;\n    data.f = i0;\n    if (data.f == 0.0 && !(data.i & 0x80000000))\n\tXORPSrr(f0, f0);\n    else {\n#if __WORDSIZE == 32\n\tif (jit_push_pop_p()) {\n\t    jit_pushi_i(data.i);\n\t    sse_ldr_f(_jit, f0, JIT_SP);\n\t    jit_addi_l(JIT_SP, JIT_SP, sizeof(int));\n\t}\n\telse {\n\t    if (_jitl.float_offset == 0)\n\t\t_jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\t    MOVLim(data.i, _jitl.float_offset, JIT_FP, _NOREG, _SCL1);\n\t    sse_ldxi_f(_jit, f0, JIT_FP, _jitl.float_offset);\n\t}\n#else\n\tjit_movi_i(JIT_REXTMP, data.i);\n\tMOVDLXrr(JIT_REXTMP, f0);\n#endif\n    }\n}\n\n__jit_inline void\nsse_movi_d(jit_state_t _jit, jit_fpr_t f0, double i0)\n{\n    union {\n\tint\ti[2];\n\tlong\tl;\n\tdouble\td;\n    } data;\n    data.d = i0;\n    if (data.d == 0.0 && !(data.i[1] & 0x80000000))\n\tXORPDrr(f0, f0);\n    else {\n#if __WORDSIZE == 32\n\tif (jit_push_pop_p()) {\n\t    jit_pushi_i(data.i[1]);\n\t    jit_pushi_i(data.i[0]);\n\t    sse_ldr_d(_jit, f0, JIT_SP);\n\t    jit_addi_l(JIT_SP, JIT_SP, sizeof(double));\n\t}\n\telse {\n\t    if (_jitl.float_offset == 0)\n\t\t_jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\t    MOVLim(data.i[0], _jitl.float_offset, JIT_FP, _NOREG, _SCL1);\n\t    MOVLim(data.i[1], _jitl.float_offset + 4, JIT_FP, _NOREG, _SCL1);\n\t    sse_ldxi_d(_jit, f0, JIT_FP, _jitl.float_offset);\n\t}\n#else\n\tjit_movi_l(JIT_REXTMP, data.l);\n\tMOVDQXrr(JIT_REXTMP, f0);\n#endif\n    }\n}\n\n__jit_inline void\nsse_movr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 != f1)\n\tMOVSSrr(f1, f0);\n}\n\n__jit_inline void\nsse_movr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 != f1)\n\tMOVSDrr(f1, f0);\n}\n\n__jit_inline void\nsse_extr_i_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    CVTSI2SSLrr(r0, f0);\n}\n\n__jit_inline void\nsse_extr_i_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    CVTSI2SDLrr(r0, f0);\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_extr_l_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    CVTSI2SSQrr(r0, f0);\n}\n\n__jit_inline void\nsse_extr_l_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    CVTSI2SDQrr(r0, f0);\n}\n#endif\n\n__jit_inline void\nsse_extr_f_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    CVTSS2SDrr(f1, f0);\n}\n\n__jit_inline void\nsse_extr_d_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    CVTSD2SSrr(f1, f0);\n}\n\n__jit_inline void\nsse_absr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tPCMPEQLrr(JIT_FPTMP0, JIT_FPTMP0);\n\tPSRLLir(1, JIT_FPTMP0);\n\tANDPSrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tPCMPEQLrr(f0, f0);\n\tPSRLLir(1, f0);\n\tANDPSrr(f1, f0);\n    }\n}\n\n__jit_inline void\nsse_absr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tPCMPEQLrr(JIT_FPTMP0, JIT_FPTMP0);\n\tPSRLQir(1, JIT_FPTMP0);\n\tANDPDrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tPCMPEQLrr(f0, f0);\n\tPSRLQir(1, f0);\n\tANDPDrr(f1, f0);\n    }\n}\n\n__jit_inline void\nsse_sqrtr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    SQRTSSrr(f1, f0);\n}\n\n__jit_inline void\nsse_sqrtr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    SQRTSDrr(f1, f0);\n}\n\n__jit_inline void\nsse_negr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n#if __WORDSIZE == 32\n    if (jit_push_pop_p()) {\n\tjit_pushi_i(0x80000000);\n\tif (f0 == f1) {\n\t    sse_ldr_f(_jit, JIT_FPTMP0, JIT_SP);\n\t    XORPSrr(JIT_FPTMP0, f0);\n\t}\n\telse {\n\t    sse_ldr_f(_jit, f0, JIT_SP);\n\t    XORPSrr(f1, f0);\n\t}\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(int));\n    }\n    else {\n\tif (_jitl.float_offset == 0)\n\t    _jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\tMOVLim(0x80000000, _jitl.float_offset, JIT_FP, _NOREG, _SCL1);\n\tif (f0 == f1) {\n\t    sse_ldxi_f(_jit, JIT_FPTMP0, JIT_FP, _jitl.float_offset);\n\t    XORPSrr(JIT_FPTMP0, f0);\n\t}\n\telse {\n\t    sse_ldxi_f(_jit, f0, JIT_FP, _jitl.float_offset);\n\t    XORPSrr(f1, f0);\n\t}\n    }\n#else\n    jit_movi_i(JIT_REXTMP, 0x80000000);\n    if (f0 == f1) {\n\tMOVDLXrr(JIT_REXTMP, JIT_FPTMP0);\n\tXORPSrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tMOVDLXrr(JIT_REXTMP, f0);\n\tXORPSrr(f1, f0);\n    }\n#endif\n}\n\n__jit_inline void\nsse_negr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n#if __WORDSIZE == 32\n    if (jit_push_pop_p()) {\n\tjit_pushi_i(0x80000000);\n\tjit_pushi_i(0);\n\tif (f0 == f1) {\n\t    sse_ldr_d(_jit, JIT_FPTMP0, JIT_SP);\n\t    XORPSrr(JIT_FPTMP0, f0);\n\t}\n\telse {\n\t    sse_ldr_d(_jit, f0, JIT_SP);\n\t    XORPSrr(f1, f0);\n\t}\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(int) << 1);\n    }\n    else {\n\tif (_jitl.float_offset == 0)\n\t    _jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\tMOVLim(0, _jitl.float_offset, JIT_FP, _NOREG, _SCL1);\n\tMOVLim(0x80000000, _jitl.float_offset + 4, JIT_FP, _NOREG, _SCL1);\n\tif (f0 == f1) {\n\t    sse_ldxi_d(_jit, JIT_FPTMP0, JIT_FP, _jitl.float_offset);\n\t    XORPSrr(JIT_FPTMP0, f0);\n\t}\n\telse {\n\t    sse_ldxi_d(_jit, f0, JIT_FP, _jitl.float_offset);\n\t    XORPSrr(f1, f0);\n\t}\n    }\n#else\n    jit_movi_l(JIT_REXTMP, 0x8000000000000000);\n    if (f0 == f1) {\n\tMOVDQXrr(JIT_REXTMP, JIT_FPTMP0);\n\tXORPDrr(JIT_FPTMP0, f0);\n    }\n    else {\n\tMOVDQXrr(JIT_REXTMP, f0);\n\tXORPDrr(f1, f0);\n    }\n#endif\n}\n\n__jit_inline void\nsse_rnd_enter(jit_state_t _jit, jit_gpr_t r0, int mode)\n{\n    jit_subi_l(JIT_SP, JIT_SP, 8);\n    STMXCSRrm(0, JIT_SP, _NOREG, _SCL1);\n    jit_ldr_i(r0, JIT_SP);\n    jit_stxi_i(4, JIT_SP, r0);\n    jit_andi_i(r0, r0, ~MXCSR_RND_MASK);\n    if (mode)\n\tjit_ori_i(r0, r0, mode);\n    jit_str_i(JIT_SP, r0);\n    LDMXCSRmr(0, JIT_SP, _NOREG, _SCL1);\n}\n\n__jit_inline void\nsse_rnd_leave(jit_state_t _jit, int extra)\n{\n    LDMXCSRmr(4, JIT_SP, _NOREG, _SCL1);\n    jit_addi_l(JIT_SP, JIT_SP, 8 + extra);\n}\n\n__jit_inline void\nsse_rintr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTSS2SILrr(f0, r0);\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_rintr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTSS2SIQrr(f0, r0);\n}\n#endif\n\n__jit_inline void\nsse_rintr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTSD2SILrr(f0, r0);\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_rintr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTSD2SIQrr(f0, r0);\n}\n#endif\n\n__jit_inline void\nsse_roundr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n    /* load stack with -0.5 if f0 >= 0, else load stack with 0.5 */\n    MOVLir(0xbf000000, r0);\n    XORPSrr(JIT_FPTMP0, JIT_FPTMP0);\n    /* invert -0.5 sign if argument is negative */\n    UCOMISSrr(JIT_FPTMP0, f0);\n    JAESm(_jit->x.pc);\n    label = _jit->x.pc;\n    XORLir((int)0x80000000, r0);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n    jit_pushr_i(r0);\n    /* round */\n    if (jit_round_to_nearest_p()) {\n\tsse_rintr_f_i(_jit, r0, f0);\n\tsse_extr_i_f(_jit, JIT_FPTMP0, r0);\n\t/* check difference of fractional part with value in stack */\n\tSUBSSrr(f0, JIT_FPTMP0);\n\tUCOMISSmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\t/* if not zero round is already correct */\n\tJNESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\t/* adjust and round again */\n\tsse_movr_f(_jit, JIT_FPTMP0, f0);\n\tSUBSSmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rintr_f_i(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(long));\n    }\n    else {\n\tsse_movr_f(_jit, JIT_FPTMP0, f0);\n\tSUBSSmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_CHOP);\n\tsse_rintr_f_i(_jit, r0, JIT_FPTMP0);\n\tsse_rnd_leave(_jit, sizeof(long));\n    }\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_roundr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n    /* load stack with -0.5 if f0 >= 0, else load stack with 0.5 */\n    MOVLir(0xbf000000, r0);\n    XORPSrr(JIT_FPTMP0, JIT_FPTMP0);\n    /* invert -0.5 sign if argument is negative */\n    UCOMISSrr(JIT_FPTMP0, f0);\n    JAESm(_jit->x.pc);\n    label = _jit->x.pc;\n    XORLir((int)0x80000000, r0);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n    jit_pushr_i(r0);\n    /* round */\n    if (jit_round_to_nearest_p()) {\n\tsse_rintr_f_l(_jit, r0, f0);\n\tsse_extr_l_f(_jit, JIT_FPTMP0, r0);\n\t/* check difference of fractional part with value in stack */\n\tSUBSSrr(f0, JIT_FPTMP0);\n\tUCOMISSmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\t/* if not zero round is already correct */\n\tJNESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\t/* adjust and round again */\n\tsse_movr_f(_jit, JIT_FPTMP0, f0);\n\tSUBSSmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rintr_f_l(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(long));\n    }\n    else {\n\tsse_movr_f(_jit, JIT_FPTMP0, f0);\n\tSUBSSmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_CHOP);\n\tsse_rintr_f_l(_jit, r0, JIT_FPTMP0);\n\tsse_rnd_leave(_jit, sizeof(long));\n    }\n}\n#endif\n\n__jit_inline void\nsse_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n    /* load stack with -0.5 if f0 >= 0, else load stack with 0.5 */\n    MOVLir(0xbfe00000, r0);\n    XORPDrr(JIT_FPTMP0, JIT_FPTMP0);\n    /* invert -0.5 sign if argument is negative */\n    UCOMISDrr(JIT_FPTMP0, f0);\n    JAESm(_jit->x.pc);\n    label = _jit->x.pc;\n    XORLir((int)0x80000000, r0);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n#if __WORDSIZE == 32\n    jit_pushr_i(r0);\n    jit_pushi_i(0);\n#else\n    SHLQir(32, r0);\n    jit_pushr_l(r0);\n#endif\n    /* round */\n    if (jit_round_to_nearest_p()) {\n\tsse_rintr_d_i(_jit, r0, f0);\n\tsse_extr_i_d(_jit, JIT_FPTMP0, r0);\n\t/* check difference of fractional part with value in stack */\n\tSUBSDrr(f0, JIT_FPTMP0);\n\tUCOMISDmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\t/* if not zero round is already correct */\n\tJNESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\t/* adjust and round again */\n\tsse_movr_d(_jit, JIT_FPTMP0, f0);\n\tSUBSDmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rintr_d_i(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(double));\n    }\n    else {\n\tsse_movr_d(_jit, JIT_FPTMP0, f0);\n\tSUBSDmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_CHOP);\n\tsse_rintr_d_i(_jit, r0, JIT_FPTMP0);\n\tsse_rnd_leave(_jit, sizeof(double));\n    }\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_roundr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n    /* load stack with -0.5 if f0 >= 0, else load stack with 0.5 */\n    MOVLir(0xbfe00000, r0);\n    XORPDrr(JIT_FPTMP0, JIT_FPTMP0);\n    /* invert -0.5 sign if argument is negative */\n    UCOMISDrr(JIT_FPTMP0, f0);\n    JAESm(_jit->x.pc);\n    label = _jit->x.pc;\n    XORLir((int)0x80000000, r0);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n    SHLQir(32, r0);\n    jit_pushr_l(r0);\n    /* round */\n    if (jit_round_to_nearest_p()) {\n\tsse_rintr_d_l(_jit, r0, f0);\n\tsse_extr_l_d(_jit, JIT_FPTMP0, r0);\n\t/* check difference of fractional part with value in stack */\n\tSUBSDrr(f0, JIT_FPTMP0);\n\tUCOMISDmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\t/* if not zero round is already correct */\n\tJNESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\t/* adjust and round again */\n\tsse_movr_d(_jit, JIT_FPTMP0, f0);\n\tSUBSDmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rintr_d_l(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(double));\n    }\n    else {\n\tsse_movr_d(_jit, JIT_FPTMP0, f0);\n\tSUBSDmr(0, JIT_SP, _NOREG, _SCL1, JIT_FPTMP0);\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_CHOP);\n\tsse_rintr_d_l(_jit, r0, JIT_FPTMP0);\n\tsse_rnd_leave(_jit, sizeof(double));\n    }\n}\n#endif\n\n__jit_inline void\nsse_truncr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTTSS2SILrr(f0, r0);\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_truncr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTTSS2SIQrr(f0, r0);\n}\n#endif\n\n__jit_inline void\nsse_truncr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTTSD2SILrr(f0, r0);\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_truncr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    CVTTSD2SIQrr(f0, r0);\n}\n#endif\n\n__jit_inline void\nsse_floorr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSSrri(f0, JIT_FPTMP0, MXCSR_RND_DOWN >> 13);\n\tCVTSS2SILrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_f_i(_jit, r0, f0);\n\tsse_extr_i_f(_jit, JIT_FPTMP0, r0);\n\tUCOMISSrr(f0, JIT_FPTMP0);\n\tJBESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_f(_jit, JIT_FPTMP0, -0.5);\n\tADDSSrr(f0, JIT_FPTMP0);\n\tsse_rintr_f_i(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_DOWN);\n\tsse_rintr_f_i(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_floorr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSSrri(f0, JIT_FPTMP0, MXCSR_RND_DOWN >> 13);\n\tCVTSS2SIQrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_f_l(_jit, r0, f0);\n\tsse_extr_l_f(_jit, JIT_FPTMP0, r0);\n\tUCOMISSrr(f0, JIT_FPTMP0);\n\tJBESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_f(_jit, JIT_FPTMP0, -0.5);\n\tADDSSrr(f0, JIT_FPTMP0);\n\tsse_rintr_f_l(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_DOWN);\n\tsse_rintr_f_l(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n#endif\n\n__jit_inline void\nsse_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSDrri(f0, JIT_FPTMP0, MXCSR_RND_DOWN >> 13);\n\tCVTSD2SILrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_d_i(_jit, r0, f0);\n\tsse_extr_i_d(_jit, JIT_FPTMP0, r0);\n\tUCOMISDrr(f0, JIT_FPTMP0);\n\tJBESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_d(_jit, JIT_FPTMP0, -0.5);\n\tADDSDrr(f0, JIT_FPTMP0);\n\tsse_rintr_d_i(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_DOWN);\n\tsse_rintr_d_i(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_floorr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSDrri(f0, JIT_FPTMP0, MXCSR_RND_DOWN >> 13);\n\tCVTSD2SIQrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_d_l(_jit, r0, f0);\n\tsse_extr_l_d(_jit, JIT_FPTMP0, r0);\n\tUCOMISDrr(f0, JIT_FPTMP0);\n\tJBESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_d(_jit, JIT_FPTMP0, -0.5);\n\tADDSDrr(f0, JIT_FPTMP0);\n\tsse_rintr_d_l(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_DOWN);\n\tsse_rintr_d_l(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n#endif\n\n__jit_inline void\nsse_ceilr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSSrri(f0, JIT_FPTMP0, MXCSR_RND_UP >> 13);\n\tCVTSS2SILrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_f_i(_jit, r0, f0);\n\tsse_extr_i_f(_jit, JIT_FPTMP0, r0);\n\tUCOMISSrr(f0, JIT_FPTMP0);\n\tJAESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_f(_jit, JIT_FPTMP0, 0.5);\n\tADDSSrr(f0, JIT_FPTMP0);\n\tsse_rintr_f_i(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_UP);\n\tsse_rintr_f_i(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_ceilr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSSrri(f0, JIT_FPTMP0, MXCSR_RND_UP >> 13);\n\tCVTSS2SIQrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_f_l(_jit, r0, f0);\n\tsse_extr_l_f(_jit, JIT_FPTMP0, r0);\n\tUCOMISSrr(f0, JIT_FPTMP0);\n\tJAESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_f(_jit, JIT_FPTMP0, 0.5);\n\tADDSSrr(f0, JIT_FPTMP0);\n\tsse_rintr_f_l(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_UP);\n\tsse_rintr_f_l(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n#endif\n\n__jit_inline void\nsse_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSDrri(f0, JIT_FPTMP0, MXCSR_RND_UP >> 13);\n\tCVTSD2SILrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_d_i(_jit, r0, f0);\n\tsse_extr_i_d(_jit, JIT_FPTMP0, r0);\n\tUCOMISDrr(f0, JIT_FPTMP0);\n\tJAESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_d(_jit, JIT_FPTMP0, 0.5);\n\tADDSDrr(f0, JIT_FPTMP0);\n\tsse_rintr_d_i(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_UP);\n\tsse_rintr_d_i(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n\n#if __WORDSIZE == 64\n__jit_inline void\nsse_ceilr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse4_1_p()) {\n\tROUNDSDrri(f0, JIT_FPTMP0, MXCSR_RND_UP >> 13);\n\tCVTSD2SIQrr(JIT_FPTMP0, r0);\n    }\n    else if (jit_round_to_nearest_p()) {\n\tjit_insn\t*label;\n\tsse_rintr_d_l(_jit, r0, f0);\n\tsse_extr_l_d(_jit, JIT_FPTMP0, r0);\n\tUCOMISDrr(f0, JIT_FPTMP0);\n\tJAESm(_jit->x.pc);\n\tlabel = _jit->x.pc;\n\tsse_movi_d(_jit, JIT_FPTMP0, 0.5);\n\tADDSDrr(f0, JIT_FPTMP0);\n\tsse_rintr_d_l(_jit, r0, JIT_FPTMP0);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n    }\n    else {\n\tsse_rnd_enter(_jit, r0, MXCSR_RND_UP);\n\tsse_rintr_d_l(_jit, r0, f0);\n\tsse_rnd_leave(_jit, 0);\n    }\n}\n#endif\n\n__jit_inline void\nsse_fp_cmp_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1,\n\t     x86_cc_t cc)\n{\n    int\t\t rc;\n    jit_gpr_t\t reg;\n    if ((rc = jit_reg8_p(r0)))\n\treg = r0;\n    else {\n\tMOVLrr(_RAX, r0);\n\treg = _RAX;\n    }\n    XORLrr(reg, reg);\n    UCOMISSrr(f0, f1);\n    SETCCir(cc, reg);\n    if (!rc)\n\tjit_xchgr_i(_RAX, r0);\n}\n\n__jit_inline void\nsse_fp_cmp_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1,\n\t     x86_cc_t cc)\n{\n    int\t\t rc;\n    jit_gpr_t\t reg;\n    if ((rc = jit_reg8_p(r0)))\n\treg = r0;\n    else {\n\tMOVLrr(_RAX, r0);\n\treg = _RAX;\n    }\n    XORLrr(reg, reg);\n    UCOMISDrr(f0, f1);\n    SETCCir(cc, reg);\n    if (!rc)\n\tjit_xchgr_i(_RAX, r0);\n}\n\n__jit_inline void\nsse_ltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_A);\n}\n\n__jit_inline void\nsse_ltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_A);\n}\n\n__jit_inline void\nsse_ler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_AE);\n}\n\n__jit_inline void\nsse_ler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_AE);\n}\n\n__jit_inline void\nsse_eqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    int\t\t rc;\n    jit_gpr_t\t reg;\n    if ((rc = jit_reg8_p(r0)))\n\treg = r0;\n    else {\n\tMOVLrr(_RAX, r0);\n\treg = _RAX;\n    }\n    XORLrr(reg, reg);\n    UCOMISSrr(f0, f1);\n    JPESm(_jit->x.pc + 3);\n    _jitl.label = _jit->x.pc;\n    SETEr(reg);\n    jit_patch_rel_char_at(_jitl.label, _jit->x.pc);\n    if (!rc)\n\tjit_xchgr_i(_RAX, r0);\n}\n\n__jit_inline void\nsse_eqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    int\t\t rc;\n    jit_gpr_t\t reg;\n    if ((rc = jit_reg8_p(r0)))\n\treg = r0;\n    else {\n\tMOVLrr(_RAX, r0);\n\treg = _RAX;\n    }\n    XORLrr(reg, reg);\n    UCOMISDrr(f0, f1);\n    JPESm(_jit->x.pc + 3);\n    _jitl.label = _jit->x.pc;\n    SETEr(reg);\n    jit_patch_rel_char_at(_jitl.label, _jit->x.pc);\n    if (!rc)\n\tjit_xchgr_i(_RAX, r0);\n}\n\n__jit_inline void\nsse_ger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f1, f0, X86_CC_AE);\n}\n\n__jit_inline void\nsse_ger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f1, f0, X86_CC_AE);\n}\n\n__jit_inline void\nsse_gtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f1, f0, X86_CC_A);\n}\n\n__jit_inline void\nsse_gtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f1, f0, X86_CC_A);\n}\n\n__jit_inline void\nsse_ner_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    int\t\t rc;\n    jit_gpr_t\t reg;\n    if ((rc = jit_reg8_p(r0)))\n\treg = r0;\n    else {\n\tMOVLrr(_RAX, r0);\n\treg = _RAX;\n    }\n    MOVLir(1, reg);\n    UCOMISSrr(f0, f1);\n    JPESm(_jit->x.pc + 3);\n    _jitl.label = _jit->x.pc;\n    SETNEr(reg);\n    jit_patch_rel_char_at(_jitl.label, _jit->x.pc);\n    if (!rc)\n\tjit_xchgr_i(_RAX, r0);\n}\n\n__jit_inline void\nsse_ner_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    int\t\t rc;\n    jit_gpr_t\t reg;\n    if ((rc = jit_reg8_p(r0)))\n\treg = r0;\n    else {\n\tMOVLrr(_RAX, r0);\n\treg = _RAX;\n    }\n    MOVLir(1, reg);\n    UCOMISDrr(f0, f1);\n    JPESm(_jit->x.pc + 3);\n    _jitl.label = _jit->x.pc;\n    SETNEr(reg);\n    jit_patch_rel_char_at(_jitl.label, _jit->x.pc);\n    if (!rc)\n\tjit_xchgr_i(_RAX, r0);\n}\n\n__jit_inline void\nsse_unltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f1, f0, X86_CC_NAE);\n}\n\n__jit_inline void\nsse_unltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f1, f0, X86_CC_NAE);\n}\n\n__jit_inline void\nsse_unler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else\n\tsse_fp_cmp_f(_jit, r0, f1, f0, X86_CC_NA);\n}\n\n__jit_inline void\nsse_unler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else\n\tsse_fp_cmp_d(_jit, r0, f1, f0, X86_CC_NA);\n}\n\n__jit_inline void\nsse_uneqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else\n\tsse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_E);\n}\n\n__jit_inline void\nsse_uneqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else\n\tsse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_E);\n}\n\n__jit_inline void\nsse_unger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else\n\tsse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_NA);\n}\n\n__jit_inline void\nsse_unger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else\n\tsse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_NA);\n}\n\n__jit_inline void\nsse_ungtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_NAE);\n}\n\n__jit_inline void\nsse_ungtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_NAE);\n}\n\n__jit_inline void\nsse_ltgtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tXORLrr(r0, r0);\n    else\n\tsse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_NE);\n}\n\n__jit_inline void\nsse_ltgtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tXORLrr(r0, r0);\n    else\n\tsse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_NE);\n}\n\n__jit_inline void\nsse_ordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_NP);\n}\n\n__jit_inline void\nsse_ordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_NP);\n}\n\n__jit_inline void\nsse_unordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_f(_jit, r0, f0, f1, X86_CC_P);\n}\n\n__jit_inline void\nsse_unordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    sse_fp_cmp_d(_jit, r0, f0, f1, X86_CC_P);\n}\n\n__jit_inline jit_insn *\nsse_bltr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f0, f1);\n    JAm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bltr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f0, f1);\n    JAm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bler_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f0, f1);\n    JAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bler_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f0, f1);\n    JAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_beqr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*jp_label;\n    UCOMISSrr(f0, f1);\n    /* jump after user jump if (unordered) */\n    JPSm(_jit->x.pc + 5);\n    jp_label = _jit->x.pc;\n    JEm(label);\n    jit_patch_rel_char_at(jp_label, _jit->x.pc);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_beqr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*jp_label;\n    UCOMISDrr(f0, f1);\n    /* jump after user jump if (unordered) */\n    JPSm(_jit->x.pc + 5);\n    jp_label = _jit->x.pc;\n    JEm(label);\n    jit_patch_rel_char_at(jp_label, _jit->x.pc);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bger_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f1, f0);\n    JAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bger_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f1, f0);\n    JAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bgtr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f1, f0);\n    JAm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bgtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f1, f0);\n    JAm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bner_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*jp_label;\n    jit_insn\t*jz_label;\n    UCOMISSrr(f0, f1);\n    /* jump to user jump if parity (unordered) */\n    JPSm(_jit->x.pc + 2);\n    jp_label = _jit->x.pc;\n    /* jump past user jump if zero (equal)  */\n    JZSm(_jit->x.pc + 5);\n    jz_label = _jit->x.pc;\n    jit_patch_rel_char_at(jp_label, _jit->x.pc);\n    JMPm(label);\n    jit_patch_rel_char_at(jz_label, _jit->x.pc);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bner_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*jp_label;\n    jit_insn\t*jz_label;\n    UCOMISDrr(f0, f1);\n    /* jump to user jump if parity (unordered) */\n    JPSm(_jit->x.pc + 2);\n    jp_label = _jit->x.pc;\n    /* jump past user jump if zero (equal)  */\n    JZSm(_jit->x.pc + 5);\n    jz_label = _jit->x.pc;\n    jit_patch_rel_char_at(jp_label, _jit->x.pc);\n    JMPm(label);\n    jit_patch_rel_char_at(jz_label, _jit->x.pc);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunltr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f1, f0);\n    JNAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunltr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f1, f0);\n    JNAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunler_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else {\n\tUCOMISSrr(f1, f0);\n\tJNAm(label);\n    }\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunler_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else {\n\tUCOMISDrr(f1, f0);\n\tJNAm(label);\n    }\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_buneqr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else {\n\tUCOMISSrr(f0, f1);\n\tJEm(label);\n    }\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_buneqr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else {\n\tUCOMISDrr(f0, f1);\n\tJEm(label);\n    }\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunger_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else {\n\tUCOMISSrr(f0, f1);\n\tJNAm(label);\n    }\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunger_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else {\n\tUCOMISDrr(f0, f1);\n\tJNAm(label);\n    }\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bungtr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f0, f1);\n    JNAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bungtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f0, f1);\n    JNAEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bltgtr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f0, f1);\n    JNEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bltgtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f0, f1);\n    JNEm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bordr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f0, f1);\n    JNPm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bordr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f0, f1);\n    JNPm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunordr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISSrr(f0, f1);\n    JPm(label);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nsse_bunordr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    UCOMISDrr(f0, f1);\n    JPm(label);\n    return (_jit->x.pc);\n}\n\n#endif /* __lightning_fp_sse_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/fp-x87.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tSupport macros for the i386 math coprocessor\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000,2001,2002,2004,2008,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_fp_x87_h\n#define __lightning_fp_x87_h\n\n/* We really must map the x87 stack onto a flat register file.  In practice,\n   we can provide something sensible and make it work on the x86 using the\n   stack like a file of eight registers.\n\n   We use six or seven registers so as to have some freedom\n   for floor, ceil, round, (and log, tan, atn and exp).\n\n   Not hard at all, basically play with FXCH.  FXCH is mostly free,\n   so the generated code is not bad.  Of course we special case when one\n   of the operands turns out to be ST0.  */\n\n/* - moves:\n\n\tmove FPR0 to FPR3\n\t\tFST  ST3\n\n\tmove FPR3 to FPR0\n\t\tFXCH ST3\n\t\tFST  ST3\n\n\tmove FPR3 to FPR1\n                FLD  ST3\n                FSTP ST2   Stack is rotated, so FPRn becomes STn+1 */\n\n/* - loads:\n\n\tload into FPR0\n\t\tFSTP ST0\n\t\tFLD  [FUBAR]\n\n\tload into FPR3\n\t\tFSTP ST3     Save old st0 into destination register\n\t\tFLD  [FUBAR]\n\t\tFXCH ST3     Get back old st0\n\n   (and similarly for immediates, using the stack) */\n\n__jit_inline void\nx87_absr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    FABS_();\n\telse {\n\t    FXCHr(f0);\n\t    FABS_();\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tFABS_();\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_negr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    FCHS_();\n\telse {\n\t    FXCHr(f0);\n\t    FCHS_();\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tFCHS_();\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_sqrtr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    FSQRT_();\n\telse {\n\t    FXCHr(f0);\n\t    FSQRT_();\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tFSQRT_();\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_sin(jit_state_t _jit)\n{\n    jit_insn\t*n_label;\n    jit_insn\t*f_label;\n    jit_insn\t*r_label;\n\n    /* save %rax */\n#if __WORDSIZE == 32\n    jit_pushr_i(_RAX);\n#else\n    jit_movr_l(JIT_REXTMP, _RAX);\n#endif\n    /* classify argument */\n    FXAM_();\n    /* do nothing if zero or unordered */\n    FNSTSWr(_RAX);\n    TESTWir(FPSW_NAN | FPSW_ZERO, _RAX);\n    JNZSm(_jit->x.pc);\n    n_label = _jit->x.pc;\n    /* calculate once */\n    FSIN_();\n    FNSTSWr(_RAX);\n    /* if C2 is set, it means the value is out of range */\n    TESTWir(FPSW_FINITE, _RAX);\n    JZSm(_jit->x.pc);\n    f_label = _jit->x.pc;\n    /* load pi*2 */\n    FLDPI_();\n    FADDrr(_ST0, _ST0);\n    /* swap top of stack */\n    FXCHr(_ST1);\n    /* calculate remainder */\n    r_label = _jit->x.pc;\n    FPREM1_();\n    FNSTSWr(_RAX);\n    /* if C2 is set, it means the value is partial */\n    TESTWir(FPSW_FINITE, _RAX);\n    JNZSm(r_label);\n    /* value in range now */\n    FSTPr(_ST1);\n    FSIN_();\n    jit_patch_rel_char_at(n_label, _jit->x.pc);\n    jit_patch_rel_char_at(f_label, _jit->x.pc);\n    /* restore %rax */\n#if __WORDSIZE == 32\n    jit_popr_i(_RAX);\n#else\n    jit_movr_l(_RAX, JIT_REXTMP);\n#endif\n}\n\n__jit_inline void\nx87_sinr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    x87_sin(_jit);\n\telse {\n\t    FXCHr(f0);\n\t    x87_sin(_jit);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tx87_sin(_jit);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_cos(jit_state_t _jit)\n{\n    jit_insn\t*n_label;\n    jit_insn\t*f_label;\n    jit_insn\t*r_label;\n\n    /* save %rax */\n#if __WORDSIZE == 32\n    jit_pushr_i(_RAX);\n#else\n    jit_movr_l(JIT_REXTMP, _RAX);\n#endif\n    /* classify argument */\n    FXAM_();\n    /* do nothing if unordered */\n    FNSTSWr(_RAX);\n    TESTWir(FPSW_NAN, _RAX);\n    JNZSm(_jit->x.pc);\n    n_label = _jit->x.pc;\n    /* calculate once */\n    FCOS_();\n    FNSTSWr(_RAX);\n    /* if C2 is set, it means the value is out of range */\n    TESTWir(FPSW_FINITE, _RAX);\n    JZSm(_jit->x.pc);\n    f_label = _jit->x.pc;\n    /* load pi*2 */\n    FLDPI_();\n    FADDrr(_ST0, _ST0);\n    /* swap top of stack */\n    FXCHr(_ST1);\n    /* calculate remainder */\n    r_label = _jit->x.pc;\n    FPREM1_();\n    FNSTSWr(_RAX);\n    /* if C2 is set, it means the value is partial */\n    TESTWir(FPSW_FINITE, _RAX);\n    JNZSm(r_label);\n    /* value in range now */\n    FSTPr(_ST1);\n    FCOS_();\n    jit_patch_rel_char_at(n_label, _jit->x.pc);\n    jit_patch_rel_char_at(f_label, _jit->x.pc);\n    /* restore %rax */\n#if __WORDSIZE == 32\n    jit_popr_i(_RAX);\n#else\n    jit_movr_l(_RAX, JIT_REXTMP);\n#endif\n}\n\n__jit_inline void\nx87_cosr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    x87_cos(_jit);\n\telse {\n\t    FXCHr(f0);\n\t    x87_cos(_jit);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tx87_cos(_jit);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_tan(jit_state_t _jit)\n{\n    jit_insn\t*n_label;\n    jit_insn\t*f_label;\n    jit_insn\t*r_label;\n\n    /* save %rax */\n#if __WORDSIZE == 32\n    jit_pushr_i(_RAX);\n#else\n    jit_movr_l(JIT_REXTMP, _RAX);\n#endif\n    /* classify argument */\n    FXAM_();\n    /* do nothing if zero or unordered */\n    FNSTSWr(_RAX);\n    TESTWir(FPSW_NAN | FPSW_ZERO, _RAX);\n    JNZSm(_jit->x.pc);\n    n_label = _jit->x.pc;\n    /* calculate once */\n    FPTAN_();\n    FNSTSWr(_RAX);\n    /* if C2 is set, it means the value is out of range */\n    TESTWir(FPSW_FINITE, _RAX);\n    JZSm(_jit->x.pc);\n    f_label = _jit->x.pc;\n    /* load pi*2 */\n    FLDPI_();\n    FADDrr(_ST0, _ST0);\n    /* swap top of stack */\n    FXCHr(_ST1);\n    /* calculate remainder */\n    r_label = _jit->x.pc;\n    FPREM1_();\n    FNSTSWr(_RAX);\n    /* if C2 is set, it means the value is partial */\n    TESTWir(FPSW_FINITE, _RAX);\n    JNZSm(r_label);\n    /* value in range now */\n    FSTPr(_ST1);\n    FPTAN_();\n    jit_patch_rel_char_at(f_label, _jit->x.pc);\n    /* remove 1.0 from top of stack */\n    FSTPr(_ST0);\n    /* 1.0 not in stack if argument is NaN or zero */\n    jit_patch_rel_char_at(n_label, _jit->x.pc);\n    /* restore %rax */\n#if __WORDSIZE == 32\n    jit_popr_i(_RAX);\n#else\n    jit_movr_l(_RAX, JIT_REXTMP);\n#endif\n}\n\n__jit_inline void\nx87_tanr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    x87_tan(_jit);\n\telse {\n\t    FXCHr(f0);\n\t    x87_tan(_jit);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tx87_tan(_jit);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_atan(jit_state_t _jit)\n{\n    FLD1_();\n    FPATAN_();\n}\n\n__jit_inline void\nx87_atanr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    x87_atan(_jit);\n\telse {\n\t    FXCHr(f0);\n\t    x87_atan(_jit);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tx87_atan(_jit);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_log(jit_state_t _jit)\n{\n    FLDLN2_();\n    FXCHr(_ST1);\n    FYL2X_();\n}\n\n__jit_inline void\nx87_logr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    x87_log(_jit);\n\telse {\n\t    FXCHr(f0);\n\t    x87_log(_jit);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tx87_log(_jit);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_log2(jit_state_t _jit)\n{\n    FLD1_();\n    FXCHr(_ST1);\n    FYL2X_();\n}\n\n__jit_inline void\nx87_log2r_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    x87_log2(_jit);\n\telse {\n\t    FXCHr(f0);\n\t    x87_log2(_jit);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tx87_log2(_jit);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_log10(jit_state_t _jit)\n{\n    FLDLG2_();\n    FXCHr(_ST1);\n    FYL2X_();\n}\n\n__jit_inline void\nx87_log10r_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1) {\n\tif (f0 == _ST0)\n\t    x87_log10(_jit);\n\telse {\n\t    FXCHr(f0);\n\t    x87_log10(_jit);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tx87_log10(_jit);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_addr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1) {\n\tif (f2 == _ST0)\n\t    FADDrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FADDrr(f2, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FADDrr(f2, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else if (f0 == f2) {\n\tif (f1 == _ST0)\n\t    FADDrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FADDrr(f1, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FADDrr(f1, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tFADDrr((jit_fpr_t)(f2 + 1), _ST0);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_subr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1) {\n\tif (f2 == _ST0)\n\t    FSUBRrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FSUBrr(f2, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FSUBrr(f2, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else if (f0 == f2) {\n\tif (f1 == _ST0)\n\t    FSUBrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FSUBRrr(f1, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FSUBRrr(f1, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tFSUBrr((jit_fpr_t)(f2 + 1), _ST0);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_mulr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1) {\n\tif (f2 == _ST0)\n\t    FMULrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FMULrr(f2, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FMULrr(f2, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else if (f0 == f2) {\n\tif (f1 == _ST0)\n\t    FMULrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FMULrr(f1, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FMULrr(f1, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tFMULrr((jit_fpr_t)(f2 + 1), _ST0);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_divr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (f0 == f1) {\n\tif (f2 == _ST0)\n\t    FDIVRrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FDIVrr(f2, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FDIVrr(f2, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else if (f0 == f2) {\n\tif (f1 == _ST0)\n\t    FDIVrr(_ST0, f0);\n\telse if (f0 == _ST0)\n\t    FDIVRrr(f1, _ST0);\n\telse {\n\t    FXCHr(f0);\n\t    FDIVRrr(f1, _ST0);\n\t    FXCHr(f0);\n\t}\n    }\n    else {\n\tFLDr(f1);\n\tFDIVrr((jit_fpr_t)(f2 + 1), _ST0);\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    }\n}\n\n__jit_inline void\nx87_ldr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    FLDSm(0, r0, _NOREG, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_ldi_f(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tFLDSm(0, JIT_REXTMP, _NOREG, _SCL1);\n    }\n    else\n#endif\n\tFLDSm((long)i0, _NOREG, _NOREG, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_ldxr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    FLDSm(0, r0, r1, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_ldxi_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, long i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, i0);\n\tFLDSm(0, r0, JIT_REXTMP, _SCL1);\n    }\n    else\n#endif\n\tFLDSm(i0, r0, _NOREG, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_ldi_d(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tFLDLm(0, JIT_REXTMP, _NOREG, _SCL1);\n    }\n    else\n#endif\n\tFLDLm((long)i0, _NOREG, _NOREG, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_ldr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    FLDLm(0, r0, _NOREG, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_ldxr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    FLDLm(0, r0, r1, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_ldxi_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, long i0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, i0);\n\tFLDLm(0, r0, JIT_REXTMP, _SCL1);\n    }\n    else\n#endif\n\tFLDLm(i0, r0, _NOREG, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n}\n\n__jit_inline void\nx87_str_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (f0 == _ST0)\n\tFSTSm(0, r0, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTSm(0, r0, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_sti_f(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tx87_str_f(_jit, JIT_REXTMP, f0);\n\treturn;\n    }\n#endif\n    if (f0 == _ST0)\n\tFSTSm((long)i0, _NOREG, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTSm((long)i0, _NOREG, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_stxr_f(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    if (f0 == _ST0)\n\tFSTSm(0, r0, r1, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTSm(0, r0, r1, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_stxi_f(jit_state_t _jit, long i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tx87_stxr_f(_jit, JIT_REXTMP, r0, f0);\n\treturn;\n    }\n#endif\n    if (f0 == _ST0)\n\tFSTSm(i0, r0, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTSm(i0, r0, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_str_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (f0 == _ST0)\n\tFSTLm(0, r0, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTLm(0, r0, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_sti_d(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p((long)i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tx87_str_d(_jit, JIT_REXTMP, f0);\n\treturn;\n    }\n#endif\n    if (f0 == _ST0)\n\tFSTLm((long)i0, _NOREG, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTLm((long)i0, _NOREG, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_stxr_d(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    if (f0 == _ST0)\n\tFSTLm(0, r0, r1, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTLm(0, r0, r1, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_stxi_d(jit_state_t _jit, long i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if __WORDSIZE == 64\n    if (!jit_can_sign_extend_int_p(i0)) {\n\tjit_movi_l(JIT_REXTMP, (long)i0);\n\tx87_stxr_d(_jit, JIT_REXTMP, r0, f0);\n\treturn;\n    }\n#endif\n    if (f0 == _ST0)\n\tFSTLm(i0, r0, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFSTLm(i0, r0, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n}\n\n__jit_inline void\nx87_movi_f(jit_state_t _jit, jit_fpr_t f0, float i0)\n{\n    union {\n\tint\ti;\n\tfloat\tf;\n    } data;\n    int\t\tc;\n\n    c = 1;\n    data.f = i0;\n    if (data.f == 0.0) {\n\tif (data.i & 0x80000000)\n\t    c = 0;\n\telse\n\t    FLDZ_();\n    }\n    else if (data.f == 1.0)\n\tFLD1_();\n    /* these should be optional for reproducibly tests\n     * that rely on load of truncated values */\n    else if (data.f == 3.3219280948873623478703195458468f)\n\tFLDL2T_();\n    else if (data.f == 1.4426950408889634073599246886656f)\n\tFLDL2E_();\n    else if (data.f == 3.1415926535897932384626421096161f)\n\tFLDPI_();\n    else if (data.f == 0.3010299956639811952137387498515f)\n\tFLDLG2_();\n    else if (data.f == 0.6931471805599453094172323683399f)\n\tFLDLN2_();\n    else\n\tc = 0;\n\n    if (c)\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    else {\n\tjit_pushi_i(data.i);\n\tx87_ldr_f(_jit, f0, JIT_SP);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(long));\n    }\n}\n\n__jit_inline void\nx87_movi_d(jit_state_t _jit, jit_fpr_t f0, double i0)\n{\n    union {\n\tint\ti[2];\n\tlong\tl;\n\tdouble\td;\n    } data;\n    int\t\tc;\n\n    c = 1;\n    data.d = i0;\n    if (data.d == 0.0) {\n\tif (data.i[1] & 0x80000000)\n\t    c = 0;\n\telse\n\t    FLDZ_();\n    }\n    else if (data.d == 1.0)\n\tFLD1_();\n    /* these should be optional for reproducibly tests\n     * that rely on load of truncated values */\n    else if (data.d == 3.3219280948873623478703195458468)\n\tFLDL2T_();\n    else if (data.d == 1.4426950408889634073599246886656)\n\tFLDL2E_();\n    else if (data.d == 3.1415926535897932384626421096161)\n\tFLDPI_();\n    else if (data.d == 0.3010299956639811952137387498515)\n\tFLDLG2_();\n    else if (data.d == 0.6931471805599453094172323683399)\n\tFLDLN2_();\n    else\n\tc = 0;\n\n    if (c)\n\tFSTPr((jit_fpr_t)(f0 + 1));\n    else {\n#if __WORDSIZE == 64\n\tPUSHQi(data.l);\n#else\n\tPUSHLi(data.i[1]);\n\tPUSHLi(data.i[0]);\n#endif\n\tx87_ldr_d(_jit, f0, JIT_SP);\n\tjit_addi_l(JIT_SP, JIT_SP, 8);\n    }\n}\n\n__jit_inline void\nx87_movr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 != f1) {\n\tif (f1 == _ST0)\n\t    FSTr(f0);\n\telse if (f0 == _ST0) {\n\t    FXCHr(f1);\n\t    FSTr(f1);\n\t}\n\telse {\n\t    FLDr(f1);\n\t    FSTPr((jit_fpr_t)(f0 + 1));\n\t}\n    }\n}\n\n__jit_inline void\nx87_extr_i_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    jit_pushr_i(r0);\n    FILDLm(0, JIT_SP, _NOREG, _SCL1);\n    FSTPr((jit_fpr_t)(f0 + 1));\n    jit_popr_i(r0);\n}\n\n__jit_inline void\nx87_rintr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_pushr_i(_RAX);\n    /* store integer using current rounding mode */\n    if (f0 == _ST0)\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n    jit_popr_i(r0);\n}\n\n/* This looks complex/slow, but actually is quite faster than\n * adjusting the rounding mode as done in _safe_roundr_d_i\n */\n__jit_inline void\nx87_386_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n\n    /* make room on stack */\n    jit_pushr_i(_RAX);\n    if (r0 != _RAX)\n\tMOVLrr(_RAX, r0);\n\n    FLDr(f0);\n\n    /* status test(st(0), 0.0) in %ax to know if positive */\n    FTST_();\n    FNSTSWr(_RAX);\n\n    /*\tAssuming default, round to nearest:\n     *\tf(n) = n - rint(n)\n     *\tf(0.3) =  0.3\tf(-0.3) = -0.3\n     *\tf(0.5) =  0.5\tf(-0.5) = -0.5\t(wrong round down to even)\n     *\tf(0.7) = -0.3\tf(-0.7) =  0.3\n     *\tf(1.3) =  0.3\tf(-1.3) = -0.3\n     *\tf(1.5) = -0.5\tf(-1.5) =  0.5\t(correct round up to even)\n     *\tf(1.7) = -0.3\tf(-1.7) =  0.3\n     *\n     *\tLogic used is:\n     *\t-0.5 * sgn(n) + (n - rint(n))\n     *\n     *\tIf result of above is not zero, round to nearest (even on ties)\n     *\twill round away from zero as expected, otherwise:\n     *\trint(n - -0.5 * sgn(n))\n     *\n     *\tExample:\n     *\tround_to_nearest(0.5) = 0, what is wrong, following above:\n     *\t\t0.5 - rint(0.5) = 0.5\n     *\t\t-0.5 * 1 + 0.5 = 0\n     *\t\trint(0.5 - -0.5 * 1) = 1\n     *\twith negative value:\n     *\tround_to_nearest(-2.5) = -2, what is wrong, following above:\n     *\t\t-2.5 - rint(-2.5) = -0.5\n     *\t\t-0.5 * -1 + -0.5 = 0.0\n     *\t\trint(-2.5 - -0.5 * -1) = -3\n     */\n\n    /* st(0) = rint(st(0)) */\n    FRNDINT_();\n\n    /* st(0) = st(f0+1)-st(0) */\n    FSUBRrr((jit_fpr_t)(f0 + 1), _ST0);\n\n    /* st(0) = -0.5, st(1) = fract */\n    FLD1_();\n    FCHS_();\n    F2XM1_();\n\n    /* if (st(f0+2) is positive, do not change sign of -0.5 */\n    ANDWir(FPSW_COND, _RAX);\n    TESTWrr(_RAX, _RAX);\n    JZSm(_jit->x.pc + 2);\n    label = _jit->x.pc;\n    FCHS_();\n    jit_patch_rel_char_at(label, _jit->x.pc);\n\n    /* st(0) = *0.5 + fract, st(1) = *0.5 */\n    FXCHr(_ST1);\n    FADDrr(_ST1, _ST0);\n\n    /* status of test(st(0), 0.0) in %ax to know if zero\n     * (tie round to nearest, that was even, and was round towards zero) */\n    FTST_();\n    FNSTSWr(_RAX);\n\n    /* replace top of x87 stack with jit register argument */\n    FFREEr(_ST0);\n    FINCSTP_();\n    FLDr((jit_fpr_t)(f0 + 1));\n\n    /* if operation did not result in zero, can round to near */\n    ANDWir(FPSW_COND, _RAX);\n    CMPWir(FPSW_EQ, _RAX);\n    JNESm(_jit->x.pc + 2);\n    label = _jit->x.pc;\n\n    /* adjust for round, st(0) = st(0) - *0.5 */\n    FSUBrr(_ST1, _ST0);\n\n    jit_patch_rel_char_at(label, _jit->x.pc);\n\n    /* overwrite *0.5 with (possibly adjusted) value */\n    FSTPr(_ST1);\n\n    /* store value and pop x87 stack */\n    FISTPLm(0, JIT_SP, _NOREG, _SCL1);\n\n    if (r0 != _RAX)\n\tjit_xchgr_i(_RAX, r0);\n    jit_popr_i(r0);\n}\n\n__jit_inline void\nx87_safe_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n\n    /* make room on stack and save %rax */\n    jit_subi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n    if (r0 != _RAX)\n\tMOVLrr(_RAX, r0);\n\n    /* load copy of value */\n    FLDr(f0);\n\n    /* store control word */\n    FSTCWm(0, JIT_SP, _NOREG, _SCL1);\n    /* load control word */\n    jit_ldr_s(_RAX, JIT_SP);\n    /* make copy */\n    jit_stxi_s(sizeof(long), JIT_SP, _RAX);\n\n    /* clear top bits and select chop (truncate mode) */\n    MOVZBLrr(_RAX, _RAX);\n#if __WORDSIZE == 32\n    ORWir(FPCW_CHOP, _RAX);\n#else\n    ORLir(FPCW_CHOP, _RAX);\n#endif\n\n    /* load new control word */\n    jit_str_s(JIT_SP, _RAX);\n    FLDCWm(0, JIT_SP, _NOREG, _SCL1);\n\n    /* compare with 0 */\n    FTST_();\n    FNSTSWr(_RAX);\n\n    /* load -0.5 */\n    FLD1_();\n    FCHS_();\n    F2XM1_();\n\n    /* if negative keep sign of -0.5 */\n    ANDWir(FPSW_COND, _RAX);\n    CMPWir(FPSW_LT, _RAX);\n    JESm(_jit->x.pc + 2);\n    label = _jit->x.pc;\n    FCHS_();\n    jit_patch_rel_char_at(label, _jit->x.pc);\n\n    /* add/sub 0.5 */\n    FADDPr(_ST1);\n\n    /* round adjusted value using truncation */\n    FISTPLm(0, JIT_SP, _NOREG, _SCL1);\n\n    /* load result and restore state */\n    FLDCWm(sizeof(long), JIT_SP, _NOREG, _SCL1);\n    if (r0 != _RAX)\n\tjit_xchgr_i(_RAX, r0);\n    jit_ldr_i(r0, JIT_SP);\n    jit_addi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n}\n\n__jit_inline void\nx87_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_round_to_nearest_p())\n\tx87_386_roundr_d_i(_jit, r0, f0);\n    else\n\tx87_safe_roundr_d_i(_jit, r0, f0);\n}\n\n__jit_inline void\nx87_i386_truncr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    /* make room, store control word and copy */\n    jit_subi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n    FSTCWm(0, JIT_SP, _NOREG, _SCL1);\n    jit_ldr_s(r0, JIT_SP);\n    jit_stxi_s(sizeof(long), JIT_SP, r0);\n\n    /* clear top bits and select chop (round towards zero) */\n    if (jit_reg8_p(r0))\n\t/* always the path in 64-bit mode */\n\tMOVZBLrr(r0, r0);\n    else\n\t/* 32-bit mode only */\n\tANDWir(0xff, r0);\n#if __WORDSIZE == 32\n    ORWir(FPCW_CHOP, r0);\n#else\n    ORLir(FPCW_CHOP, r0);\n#endif\n\n    /* load new control word and convert integer */\n    jit_str_s(JIT_SP, r0);\n    FLDCWm(0, JIT_SP, _NOREG, _SCL1);\n    if (f0 == _ST0)\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n\n    /* load result and restore state */\n    FLDCWm(sizeof(long), JIT_SP, _NOREG, _SCL1);\n    jit_ldr_i(r0, JIT_SP);\n    jit_addi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n}\n\n__jit_inline void\nx87_i686_truncr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_pushr_i(_RAX);\n    FLDr(f0);\n    FISTTPLm(0, JIT_SP, _NOREG, _SCL1);\n    jit_popr_i(r0);\n}\n\n__jit_inline void\nx87_truncr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_i686_p())\n\tx87_i686_truncr_d_i(_jit, r0, f0);\n    else\n\t/* also \"safe\" version */\n\tx87_i386_truncr_d_i(_jit, r0, f0);\n}\n\n__jit_inline void\nx87_safe_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    /* make room, store control word and copy */\n    jit_subi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n    FSTCWm(0, JIT_SP, _NOREG, _SCL1);\n    jit_ldr_s(r0, JIT_SP);\n    jit_stxi_s(sizeof(long), JIT_SP, r0);\n\n    /* clear top bits and select down (round towards minus infinity) */\n    if (jit_reg8_p(r0))\n\tMOVZBLrr(r0, r0);\n    else\n\tANDWir(0xff, r0);\n#if __WORDSIZE == 32\n    ORWir(FPCW_DOWN, r0);\n#else\n    ORLir(FPCW_DOWN, r0);\n#endif\n\n    /* load new control word and convert integer */\n    jit_str_s(JIT_SP, r0);\n    FLDCWm(0, JIT_SP, _NOREG, _SCL1);\n\n    if (f0 == _ST0)\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n\n    /* load integer and restore state */\n    FLDCWm(sizeof(long), JIT_SP, _NOREG, _SCL1);\n    jit_ldr_i(r0, JIT_SP);\n    jit_addi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n}\n\n__jit_inline void\nx87_i386_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n\n    jit_pushr_i(_RAX);\n    if (r0 != _RAX)\n\tMOVLrr(_RAX, r0);\n    FLDr(f0);\n    FRNDINT_();\n    FUCOMr((jit_fpr_t)(f0 + 1));\n    FNSTSWr(_RAX);\n    ANDWir(FPSW_COND, _RAX);\n    TESTWrr(_RAX, _RAX);\n    JNESm(_jit->x.pc + 4);\n    label = _jit->x.pc;\n    FLD1_();\n    FSUBRPr(_ST1);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n    FISTPLm(0, JIT_SP, _NOREG, _SCL1);\n    if (r0 != _RAX)\n\tjit_xchgr_i(_RAX, r0);\n    jit_popr_i(r0);\n}\n\n__jit_inline void\nx87_i686_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n\n    /* make room */\n    jit_pushr_i(_RAX);\n    /* push value */\n    FLDr(f0);\n    /* round to nearest */\n    FRNDINT_();\n    /* compare and set flags */\n    FXCHr((jit_fpr_t)(f0 + 1));\n    FCOMIr((jit_fpr_t)(f0 + 1));\n    FXCHr((jit_fpr_t)(f0 + 1));\n    /* store integer */\n    FISTPLm(0, JIT_SP, _NOREG, _SCL1);\n    jit_popr_i(r0);\n    JPESm(_jit->x.pc + 3);\n    label = _jit->x.pc;\n    /* subtract 1 if carry */\n    SBBLir(0, r0);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n}\n\n__jit_inline void\nx87_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_round_to_nearest_p()) {\n\tif (jit_i686_p())\n\t    x87_i686_floorr_d_i(_jit, r0, f0);\n\telse\n\t    x87_i386_floorr_d_i(_jit, r0, f0);\n    }\n    else\n\tx87_safe_floorr_d_i(_jit, r0, f0);\n}\n\n__jit_inline void\nx87_safe_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    /* make room, store control word and copy */\n    jit_subi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n    FSTCWm(0, JIT_SP, _NOREG, _SCL1);\n    jit_ldr_s(r0, JIT_SP);\n    jit_stxi_s(sizeof(long), JIT_SP, r0);\n\n    /* clear top bits and select up (round towards positive infinity) */\n    if (jit_reg8_p(r0))\n\tMOVZBLrr(r0, r0);\n    else\n\tANDWir(0xff, r0);\n#if __WORDSIZE == 32\n    ORWir(FPCW_UP, r0);\n#else\n    ORLir(FPCW_UP, r0);\n#endif\n\n    /* load new control word and convert integer */\n    jit_str_s(JIT_SP, r0);\n    FLDCWm(0, JIT_SP, _NOREG, _SCL1);\n    if (f0 == _ST0)\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n    else {\n\tFXCHr(f0);\n\tFISTLm(0, JIT_SP, _NOREG, _SCL1);\n\tFXCHr(f0);\n    }\n\n    /* load integer and restore state */\n    FLDCWm(sizeof(long), JIT_SP, _NOREG, _SCL1);\n    jit_ldr_i(r0, JIT_SP);\n    jit_addi_l(JIT_SP, JIT_SP, sizeof(long) << 1);\n}\n\n__jit_inline void\nx87_i386_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n\n    jit_pushr_i(_RAX);\n    if (r0 != _RAX)\n\tMOVLrr(_RAX, r0);\n    FLDr(f0);\n    FRNDINT_();\n    FUCOMr((jit_fpr_t)(f0 + 1));\n    FNSTSWr(_RAX);\n    ANDWir(FPSW_COND, _RAX);\n    CMPWir(FPSW_LT, _RAX);\n    JNESm(_jit->x.pc + 4);\n    label = _jit->x.pc;\n    FLD1_();\n    FADDPr(_ST1);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n    FISTPLm(0, JIT_SP, _NOREG, _SCL1);\n    if (r0 != _RAX)\n\tjit_xchgr_i(_RAX, r0);\n    jit_popr_i(r0);\n}\n\n__jit_inline void\nx87_i686_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    jit_insn\t*label;\n\n    /* make room */\n    jit_pushr_i(_RAX);\n    /* push value */\n    FLDr(f0);\n    /* round to nearest */\n    FRNDINT_();\n    /* compare and set flags */\n    FCOMIr((jit_fpr_t)(f0 + 1));\n    /* store integer */\n    FISTPLm(0, JIT_SP, _NOREG, _SCL1);\n    jit_popr_i(r0);\n    JPESm(_jit->x.pc + 4);\n    label = _jit->x.pc;\n    /* add 1 if carry */\n    ADCLir(0, r0);\n    jit_patch_rel_char_at(label, _jit->x.pc);\n}\n\n__jit_inline void\nx87_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_round_to_nearest_p()) {\n\tif (jit_i686_p())\n\t    x87_i686_ceilr_d_i(_jit, r0, f0);\n\telse\n\t    x87_i386_ceilr_d_i(_jit, r0, f0);\n    }\n    else\n\tx87_safe_ceilr_d_i(_jit, r0, f0);\n}\n\n/* After FNSTSW we have 1 if <, 40 if =, 0 if >, 45 if unordered.  Here\n   is how to map the values of the status word's high byte to the\n   conditions.\n\n         <     =     >     unord    valid values    condition\n  gt     no    no    yes   no       0               STSW & 45 == 0\n  lt     yes   no    no    no       1               STSW & 45 == 1\n  eq     no    yes   no    no       40              STSW & 45 == 40\n  unord  no    no    no    yes      45              bit 2 == 1\n\n  ge     no    yes   no    no       0, 40           bit 0 == 0\n  unlt   yes   no    no    yes      1, 45           bit 0 == 1\n  ltgt   yes   no    yes   no       0, 1            bit 6 == 0\n  uneq   no    yes   no    yes      40, 45          bit 6 == 1\n  le     yes   yes   no    no       1, 40           odd parity for STSW & 41\n  ungt   no    no    yes   yes      0, 45           even parity for STSW & 41\n\n  unle   yes   yes   no    yes      1, 40, 45       STSW & 45 != 0\n  unge   no    yes   yes   yes      0, 40, 45       STSW & 45 != 1\n  ne     yes   no    yes   yes      0, 1, 45        STSW & 45 != 40\n  ord    yes   yes   yes   no       0, 1, 40        bit 2 == 0\n\n  lt, le, ungt, unge are actually computed as gt, ge, unlt, unle with\n  the operands swapped; it is more efficient this way.  */\n\n__jit_inline void\nx87_i386_fp_cmp(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1,\n\t\tint shift, int _and, x86_cc_t cc)\n{\n    if (f0 == _ST0)\n\tFUCOMr(f1);\n    else {\n\tFLDr(f0);\n\tFUCOMPr((jit_fpr_t)(f1 + 1));\n    }\n    if (r0 != _RAX)\n\tMOVLrr(_RAX, r0);\n    FNSTSWr(_RAX);\n    SHRLir(shift, _RAX);\n    if (_and)\n\tANDLir(_and, _RAX);\n    else\n\tMOVLir(0, _RAX);\n    if (shift == 8) {\n\tif (cc < 0) {\n\t    CMPBir(0x40, _RAX);\n\t    cc = (x86_cc_t)-cc;\n\t}\n\tSETCCir(cc, _RAX);\n    }\n    else if (cc == 0)\n\tADCBir(0, _RAX);\n    else\n\tSBBBir(-1, _RAX);\n    if (r0 != _RAX)\n\tjit_xchgr_i(r0, _RAX);\n}\n\n__jit_inline void\nx87_i686_fp_cmp(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1,\n\t\tx86_cc_t cc)\n{\n    int\t\t rc;\n    jit_gpr_t\t reg;\n\n    if ((rc = jit_reg8_p(r0)))\n\treg = r0;\n    else {\n\tMOVLrr(_RAX, r0);\n\treg = _RAX;\n    }\n\n    XORLrr(reg, reg);\n    if (f0 == _ST0)\n\tFUCOMIr(f1);\n    else {\n\tFLDr(f0);\n\tFUCOMIPr((jit_fpr_t)(f1 + 1));\n    }\n    SETCCir(cc, reg);\n    if (!rc)\n\tjit_xchgr_i(_RAX, r0);\n}\n\n__jit_inline void\nx87_ltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f1, f0,\tX86_CC_A);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f1, f0,\t8, 0x45, X86_CC_Z);\n}\n\n__jit_inline void\nx87_ler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f1, f0,\tX86_CC_AE);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f1, f0,\t9, 0, (x86_cc_t)-1);\n}\n\n__jit_inline void\nx87_eqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p()) {\n\tint\t\t rc;\n\tjit_gpr_t\t reg;\n\tjit_insn\t*label;\n\tif ((rc = jit_reg8_p(r0)))\n\t    reg = r0;\n\telse {\n\t    MOVLrr(_RAX, r0);\n\t    reg = _RAX;\n\t}\n\tXORLrr(reg, reg);\n\tif (f0 == _ST0)\n\t    FUCOMIr(f1);\n\telse {\n\t    FLDr(f0);\n\t    FUCOMIPr((jit_fpr_t)(f1 + 1));\n\t}\n\tJPESm(_jit->x.pc + 3);\n\tlabel = _jit->x.pc;\n\tSETCCir(X86_CC_E, reg);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n\tif (!rc)\n\t    jit_xchgr_i(_RAX, r0);\n    }\n    else\n\tx87_i386_fp_cmp(_jit, r0, fr0, fr1,\t8, 0x45, (x86_cc_t)-X86_CC_E);\n}\n\n__jit_inline void\nx87_ger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f0, f1,\tX86_CC_AE);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f0, f1,\t9, 0, (x86_cc_t)-1);\n}\n\n__jit_inline void\nx87_gtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f0, f1,\tX86_CC_A);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f0, f1,\t8, 0x45, X86_CC_Z);\n}\n\n__jit_inline void\nx87_ner_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p()) {\n\tint\t\t rc;\n\tjit_gpr_t\t reg;\n\tjit_insn\t*label;\n\tif ((rc = jit_reg8_p(r0)))\n\t    reg = r0;\n\telse {\n\t    MOVLrr(_RAX, r0);\n\t    reg = _RAX;\n\t}\n\tMOVLir(1, reg);\n\tif (f0 == _ST0)\n\t    FUCOMIr(f1);\n\telse {\n\t    FLDr(f0);\n\t    FUCOMIPr((jit_fpr_t)(f1 + 1));\n\t}\n\tJPESm(_jit->x.pc + 3);\n\tlabel = _jit->x.pc;\n\tSETCCir(X86_CC_NE, reg);\n\tjit_patch_rel_char_at(label, _jit->x.pc);\n\tif (!rc)\n\t    jit_xchgr_i(_RAX, r0);\n    }\n    else\n\tx87_i386_fp_cmp(_jit, r0, fr0, fr1,\t8, 0x45, (x86_cc_t)-X86_CC_NE);\n}\n\n__jit_inline void\nx87_unltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f0, f1,\tX86_CC_NAE);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f0, f1,\t9, 0, (x86_cc_t)0);\n}\n\n__jit_inline void\nx87_unler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f0, f1,\tX86_CC_NA);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f0, f1,\t8, 0x45, X86_CC_NZ);\n}\n\n__jit_inline void\nx87_ltgtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (f0 == f1)\n\tXORLrr(r0, r0);\n    else if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, fr0, fr1,\tX86_CC_NE);\n    else\n\tx87_i386_fp_cmp(_jit, r0, fr0, fr1,\t15, 0, (x86_cc_t)-1);\n}\n\n__jit_inline void\nx87_uneqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, fr0, fr1,\tX86_CC_E);\n    else\n\tx87_i386_fp_cmp(_jit, r0, fr0, fr1,\t15, 0, (x86_cc_t)0);\n}\n\n__jit_inline void\nx87_unger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tMOVLir(1, r0);\n    else if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f1, f0,\tX86_CC_NA);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f1, f0,\t8, 0x45, X86_CC_NZ);\n}\n\n__jit_inline void\nx87_ungtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, f1, f0,\tX86_CC_NAE);\n    else\n\tx87_i386_fp_cmp(_jit, r0, f1, f0,\t9, 0, (x86_cc_t)0);\n}\n\n__jit_inline void\nx87_ordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, fr0, fr1,\tX86_CC_NP);\n    else\n\tx87_i386_fp_cmp(_jit, r0, fr0, fr1,\t11, 0, (x86_cc_t)-1);\n}\n\n__jit_inline void\nx87_unordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p())\n\tx87_i686_fp_cmp(_jit, r0, fr0, fr1,\tX86_CC_P);\n    else\n\tx87_i386_fp_cmp(_jit, r0, fr0, fr1,\t11, 0, (x86_cc_t)0);\n}\n\n__jit_inline void\nx87_i386_fp_bcmp(jit_state_t _jit,\n\t\t jit_insn *label, jit_fpr_t f0, jit_fpr_t f1,\n\t\t int shift, int _and, int cmp, x86_cc_t cc)\n{\n    if (f0 == _ST0)\n\tFUCOMr(f1);\n    else {\n\tFLDr(f0);\n\tFUCOMPr((jit_fpr_t)(f1 + 1));\n    }\n    jit_pushr_i(_RAX);\n    FNSTSWr(_RAX);\n    SHRLir(shift, _RAX);\n    if (_and)\n\tANDLir(_and, _RAX);\n    if (cmp)\n\tCMPLir(cmp, _RAX);\n    jit_popr_i(_RAX);\n    JCCim(cc, label);\n}\n\n__jit_inline void\nx87_i686_fp_bcmp(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1,\n\t\t x86_cc_t cc)\n{\n    if (f0 == _ST0)\n\tFUCOMIr(f1);\n    else {\n\tFLDr(f0);\n\tFUCOMIPr((jit_fpr_t)(f1 + 1));\n    }\n    JCCim(cc, label);\n}\n\n__jit_inline jit_insn *\nx87_bltr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f1, f0,\tX86_CC_A);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f1, f0,\t8, 0x45, 0, X86_CC_Z);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bler_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f1, f0,\tX86_CC_AE);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f1, f0,\t9, 0, 0, X86_CC_NC);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_beqr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p()) {\n\tjit_insn\t*jp_label;\n\tif (fr0 == _ST0)\n\t    FUCOMIr(fr1);\n\telse {\n\t    FLDr(fr0);\n\t    FUCOMIPr((jit_fpr_t)(fr1 + 1));\n\t}\n\t/* jump past user jump if unordered */\n\tJPESm(_jit->x.pc + 6);\n\tjp_label = _jit->x.pc;\n\tJCCim(X86_CC_E, label);\n\tjit_patch_rel_char_at(jp_label, _jit->x.pc);\n    }\n    else\n\tx87_i386_fp_bcmp(_jit, label, fr0, fr1,\t8, 0x45, 0x40, X86_CC_Z);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bger_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f0, f1,\tX86_CC_AE);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f0, f1,\t9, 0, 0, X86_CC_NC);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bgtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f0, f1,\tX86_CC_A);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f0, f1,\t8, 0x45, 0, X86_CC_Z);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bner_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p()) {\n\tjit_insn\t*jp_label;\n\tjit_insn\t*jz_label;\n\tif (fr0 == _ST0)\n\t    FUCOMIr(fr1);\n\telse {\n\t    FLDr(fr0);\n\t    FUCOMIPr((jit_fpr_t)(fr1 + 1));\n\t}\n\t/* jump to user jump if unordered */\n\tJPESm(_jit->x.pc + 2);\n\tjp_label = _jit->x.pc;\n\t/* jump past user jump if equal */\n\tJZSm(_jit->x.pc + 5);\n\tjz_label = _jit->x.pc;\n\tjit_patch_rel_char_at(jp_label, _jit->x.pc);\n\tJMPm(label);\n\tjit_patch_rel_char_at(jz_label, _jit->x.pc);\n    }\n    else\n\tx87_i386_fp_bcmp(_jit, label, fr0, fr1,\t8, 0x45, 0x40, X86_CC_NZ);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bunltr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f0, f1,\tX86_CC_NAE);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f0, f1,\t9, 0, 0, X86_CC_C);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bunler_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f0, f1,\tX86_CC_NA);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f0, f1,\t8, 0x45, 0, X86_CC_NZ);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bltgtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, fr0, fr1,\tX86_CC_NE);\n    else\n\tx87_i386_fp_bcmp(_jit, label, fr0, fr1,\t15, 0, 0, X86_CC_NC);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_buneqr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (f0 == f1)\n\tJMPm(label);\n    else if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, fr0, fr1,\tX86_CC_E);\n    else\n\tx87_i386_fp_bcmp(_jit, label, fr0, fr1,\t15, 0, 0, X86_CC_C);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bunger_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 == f1)\n\tJMPm(label);\n    else if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f1, f0,\tX86_CC_NA);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f1, f0,\t8, 0x45, 0, X86_CC_NZ);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bungtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, f1, f0,\tX86_CC_NAE);\n    else\n\tx87_i386_fp_bcmp(_jit, label, f1, f0,\t9, 0, 0, X86_CC_C);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bordr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, fr0, fr1,\tX86_CC_NP);\n    else\n\tx87_i386_fp_bcmp(_jit, label, fr0, fr1,\t11, 0, 0, X86_CC_NC);\n    return (_jit->x.pc);\n}\n\n__jit_inline jit_insn *\nx87_bunordr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_fpr_t\t\tfr0, fr1;\n    if (f1 == _ST0)\tfr0 = f1, fr1 = f0;\n    else\t\tfr0 = f0, fr1 = f1;\n    if (jit_i686_p())\n\tx87_i686_fp_bcmp(_jit, label, fr0, fr1,\tX86_CC_P);\n    else\n\tx87_i386_fp_bcmp(_jit, label, fr0, fr1,\t11, 0, 0, X86_CC_C);\n    return (_jit->x.pc);\n}\n\n#if 0\n#define jit_exp()\t(FLDL2E_(), \t\t\t/* fldl2e */ \\\n\t\t\t FMULPr(_ST1), \t\t\t/* fmulp */ \\\n\t\t\t FLDr(_ST0),\t\t\t/* fld st */ \\\n\t\t\t FRNDINT(),\t\t \t/* frndint */ \\\n\t\t\t FSUBRrr(_ST0, _ST1),\t\t/* fsubr */ \\\n\t\t\t FXCHr(_ST1), \t\t\t/* fxch st(1) */ \\\n\t\t\t F2XM1_(), \t\t\t/* f2xm1 */ \\\n\t\t\t FLD1_(), \t\t\t/* fld1 */ \\\n\t\t\t FADDPr(_ST1), \t\t\t/* faddp */ \\\n\t\t\t FSCALE_(), \t\t\t/* fscale */ \\\n\t\t\t FSTPr(_ST1))\t\t\t/* fstp st(1) */\n#endif\n\n#endif /* __lightning_fp_x87_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/fp.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tFloating-point support (i386)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2008,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n\n#ifndef __lightning_fp_i386_h\n#define __lightning_fp_i386_h\n\n#define jit_sse_p()\t\t\tjit_cpu.sse\n#define jit_sse2_p()\t\t\tjit_cpu.sse2\n#define jit_sse4_1_p()\t\t\tjit_cpu.sse4_1\n#define jit_i686_p()\t\t\tjit_cpu.cmov\n#define jit_round_to_nearest_p()\tjit_flags.rnd_near\n#define jit_x87_reg_p(reg)\t\t((reg) >= _ST0 && (reg) <= _ST7)\n\n#if __WORDSIZE == 32\n#  define jit_sse_reg_p(reg)\t\t((reg) >= _XMM0 && (reg) <= _XMM7)\n#  define JIT_FPTMP0\t\t\t_XMM6\n#  define JIT_FPTMP1\t\t\t_XMM7\n#else\n#  define jit_sse_reg_p(reg)\t\t((reg) >= _XMM0 && (reg) <= _XMM15)\n#  define JIT_FPTMP0\t\t\t_XMM14\n#  define JIT_FPTMP1\t\t\t_XMM15\n#endif\n\n#include \"fp-sse.h\"\n#include \"fp-x87.h\"\n\n/*   Rely on _ASM_SAFETY to trigger mixing of x87 and sse.\n *   If sse is enabled, usage of JIT_FPRET is only expected to\n * work when using it on operations that do not include an sse\n * register.\n */\n__jit_inline void\nsse_from_x87_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_push_pop_p()) {\n\tjit_subi_l(JIT_SP, JIT_SP, sizeof(double));\n\tx87_str_f(_jit, JIT_SP, f1);\n\tsse_ldr_f(_jit, f0, JIT_SP);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(double));\n    }\n    else {\n\tif (_jitl.float_offset == 0)\n\t    _jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\tx87_stxi_f(_jit, _jitl.float_offset, JIT_FP, f1);\n\tsse_ldxi_f(_jit, f0, JIT_FP, _jitl.float_offset);\n    }\n}\n\n__jit_inline void\nsse_from_x87_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_push_pop_p()) {\n\tjit_subi_l(JIT_SP, JIT_SP, sizeof(double));\n\tx87_str_d(_jit, JIT_SP, f1);\n\tsse_ldr_d(_jit, f0, JIT_SP);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(double));\n    }\n    else {\n\tif (_jitl.float_offset == 0)\n\t    _jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\tx87_stxi_d(_jit, _jitl.float_offset, JIT_FP, f1);\n\tsse_ldxi_d(_jit, f0, JIT_FP, _jitl.float_offset);\n    }\n}\n\n__jit_inline void\nx87_from_sse_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_push_pop_p()) {\n\tjit_subi_l(JIT_SP, JIT_SP, sizeof(double));\n\tsse_str_f(_jit, JIT_SP, f1);\n\tx87_ldr_f(_jit, f0, JIT_SP);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(double));\n    }\n    else {\n\tif (_jitl.float_offset == 0)\n\t    _jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\tsse_stxi_f(_jit, _jitl.float_offset, JIT_FP, f1);\n\tx87_ldxi_f(_jit, f0, JIT_FP, _jitl.float_offset);\n    }\n}\n\n__jit_inline void\nx87_from_sse_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_push_pop_p()) {\n\tjit_subi_l(JIT_SP, JIT_SP, sizeof(double));\n\tsse_str_d(_jit, JIT_SP, f1);\n\tx87_ldr_d(_jit, f0, JIT_SP);\n\tjit_addi_l(JIT_SP, JIT_SP, sizeof(double));\n    }\n    else {\n\tif (_jitl.float_offset == 0)\n\t    _jitl.float_offset = jit_allocai(8 + (-_jitl.alloca_offset & 7));\n\tsse_stxi_d(_jit, _jitl.float_offset, JIT_FP, f1);\n\tx87_ldxi_d(_jit, f0, JIT_FP, _jitl.float_offset);\n    }\n}\n\n#define jit_absr_f(f0, f1)\t\tx86_absr_f(_jit, f0, f1)\n__jit_inline void\nx86_absr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_absr_f(_jit, f0, f1);\n    else\n\tx87_absr_d(_jit, f0, f1);\n}\n\n#define jit_absr_d(f0, f1)\t\tx86_absr_d(_jit, f0, f1)\n__jit_inline void\nx86_absr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_absr_d(_jit, f0, f1);\n    else\n\tx87_absr_d(_jit, f0, f1);\n}\n\n#define jit_negr_f(f0, f1)\t\tx86_negr_f(_jit, f0, f1)\n__jit_inline void\nx86_negr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_negr_f(_jit, f0, f1);\n    else\n\tx87_negr_d(_jit, f0, f1);\n}\n\n#define jit_negr_d(f0, f1)\t\tx86_negr_d(_jit, f0, f1)\n__jit_inline void\nx86_negr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_negr_d(_jit, f0, f1);\n    else\n\tx87_negr_d(_jit, f0, f1);\n}\n\n#define jit_sqrtr_f(f0, f1)\t\tx86_sqrtr_f(_jit, f0, f1)\n__jit_inline void\nx86_sqrtr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_sqrtr_f(_jit, f0, f1);\n    else\n\tx87_sqrtr_d(_jit, f0, f1);\n}\n\n#define jit_sqrtr_d(f0, f1)\t\tx86_sqrtr_d(_jit, f0, f1)\n__jit_inline void\nx86_sqrtr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_sqrtr_d(_jit, f0, f1);\n    else\n\tx87_sqrtr_d(_jit, f0, f1);\n}\n\n#define jit_sinr_f(f0, f1)\t\tx86_sinr_f(_jit, f0, f1)\n__jit_inline void\nx86_sinr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_f(_jit, _ST0, f1);\n\tx87_sinr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_f(_jit, f0, _ST0);\n    }\n    else\n\tx87_sinr_d(_jit, f0, f1);\n}\n\n#define jit_sinr_d(f0, f1)\t\tx86_sinr_d(_jit, f0, f1)\n__jit_inline void\nx86_sinr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_d(_jit, _ST0, f1);\n\tx87_sinr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_d(_jit, f0, _ST0);\n    }\n    else\n\tx87_sinr_d(_jit, f0, f1);\n}\n\n#define jit_cosr_f(f0, f1)\t\tx86_cosr_f(_jit, f0, f1)\n__jit_inline void\nx86_cosr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_f(_jit, _ST0, f1);\n\tx87_cosr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_f(_jit, f0, _ST0);\n    }\n    else\n\tx87_cosr_d(_jit, f0, f1);\n}\n\n#define jit_cosr_d(f0, f1)\t\tx86_cosr_d(_jit, f0, f1)\n__jit_inline void\nx86_cosr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_d(_jit, _ST0, f1);\n\tx87_cosr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_d(_jit, f0, _ST0);\n    }\n    else\n\tx87_cosr_d(_jit, f0, f1);\n}\n\n#define jit_tanr_f(f0, f1)\t\tx86_tanr_f(_jit, f0, f1)\n__jit_inline void\nx86_tanr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_f(_jit, _ST0, f1);\n\tx87_tanr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_f(_jit, f0, _ST0);\n    }\n    else\n\tx87_tanr_d(_jit, f0, f1);\n}\n\n#define jit_tanr_d(f0, f1)\t\tx86_tanr_d(_jit, f0, f1)\n__jit_inline void\nx86_tanr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_d(_jit, _ST0, f1);\n\tx87_tanr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_d(_jit, f0, _ST0);\n    }\n    else\n\tx87_tanr_d(_jit, f0, f1);\n}\n\n#define jit_atanr_f(f0, f1)\t\tx86_atanr_f(_jit, f0, f1)\n__jit_inline void\nx86_atanr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_f(_jit, _ST0, f1);\n\tx87_atanr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_f(_jit, f0, _ST0);\n    }\n    else\n\tx87_atanr_d(_jit, f0, f1);\n}\n\n#define jit_atanr_d(f0, f1)\t\tx86_atanr_d(_jit, f0, f1)\n__jit_inline void\nx86_atanr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_d(_jit, _ST0, f1);\n\tx87_atanr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_d(_jit, f0, _ST0);\n    }\n    else\n\tx87_atanr_d(_jit, f0, f1);\n}\n\n#define jit_logr_f(f0, f1)\t\tx86_logr_f(_jit, f0, f1)\n__jit_inline void\nx86_logr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_f(_jit, _ST0, f1);\n\tx87_logr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_f(_jit, f0, _ST0);\n    }\n    else\n\tx87_logr_d(_jit, f0, f1);\n}\n\n#define jit_logr_d(f0, f1)\t\tx86_logr_d(_jit, f0, f1)\n__jit_inline void\nx86_logr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_d(_jit, _ST0, f1);\n\tx87_logr_d(_jit, _ST0, _ST0);\n\tsse_from_x87_d(_jit, f0, _ST0);\n    }\n    else\n\tx87_logr_d(_jit, f0, f1);\n}\n\n#define jit_log2r_f(f0, f1)\t\tx86_log2r_f(_jit, f0, f1)\n__jit_inline void\nx86_log2r_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_f(_jit, _ST0, f1);\n\tx87_log2r_d(_jit, _ST0, _ST0);\n\tsse_from_x87_f(_jit, f0, _ST0);\n    }\n    else\n\tx87_log2r_d(_jit, f0, f1);\n}\n\n#define jit_log2r_d(f0, f1)\t\tx86_log2r_d(_jit, f0, f1)\n__jit_inline void\nx86_log2r_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_d(_jit, _ST0, f1);\n\tx87_log2r_d(_jit, _ST0, _ST0);\n\tsse_from_x87_d(_jit, f0, _ST0);\n    }\n    else\n\tx87_log2r_d(_jit, f0, f1);\n}\n\n#define jit_log10r_f(f0, f1)\t\tx86_log10r_f(_jit, f0, f1)\n__jit_inline void\nx86_log10r_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_f(_jit, _ST0, f1);\n\tx87_log10r_d(_jit, _ST0, _ST0);\n\tsse_from_x87_f(_jit, f0, _ST0);\n    }\n    else\n\tx87_log10r_d(_jit, f0, f1);\n}\n\n#define jit_log10r_d(f0, f1)\t\tx86_log10r_d(_jit, f0, f1)\n__jit_inline void\nx86_log10r_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tx87_from_sse_d(_jit, _ST0, f1);\n\tx87_log10r_d(_jit, _ST0, _ST0);\n\tsse_from_x87_d(_jit, f0, _ST0);\n    }\n    else\n\tx87_log10r_d(_jit, f0, f1);\n}\n\n#define jit_addr_f(f0, f1, f2)\t\tx86_addr_f(_jit, f0, f1, f2)\n__jit_inline void\nx86_addr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_addr_f(_jit, f0, f1, f2);\n    else\n\tx87_addr_d(_jit, f0, f1, f2);\n}\n\n#define jit_addr_d(f0, f1, f2)\t\tx86_addr_d(_jit, f0, f1, f2)\n__jit_inline void\nx86_addr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_addr_d(_jit, f0, f1, f2);\n    else\n\tx87_addr_d(_jit, f0, f1, f2);\n}\n\n#define jit_subr_f(f0, f1, f2)\t\tx86_subr_f(_jit, f0, f1, f2)\n__jit_inline void\nx86_subr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_subr_f(_jit, f0, f1, f2);\n    else\n\tx87_subr_d(_jit, f0, f1, f2);\n}\n\n#define jit_subr_d(f0, f1, f2)\t\tx86_subr_d(_jit, f0, f1, f2)\n__jit_inline void\nx86_subr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_subr_d(_jit, f0, f1, f2);\n    else\n\tx87_subr_d(_jit, f0, f1, f2);\n}\n\n#define jit_mulr_f(f0, f1, f2)\t\tx86_mulr_f(_jit, f0, f1, f2)\n__jit_inline void\nx86_mulr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_mulr_f(_jit, f0, f1, f2);\n    else\n\tx87_mulr_d(_jit, f0, f1, f2);\n}\n\n#define jit_mulr_d(f0, f1, f2)\t\tx86_mulr_d(_jit, f0, f1, f2)\n__jit_inline void\nx86_mulr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_mulr_d(_jit, f0, f1, f2);\n    else\n\tx87_mulr_d(_jit, f0, f1, f2);\n}\n\n#define jit_divr_f(f0, f1, f2)\t\tx86_divr_f(_jit, f0, f1, f2)\n__jit_inline void\nx86_divr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_divr_f(_jit, f0, f1, f2);\n    else\n\tx87_divr_d(_jit, f0, f1, f2);\n}\n\n#define jit_divr_d(f0, f1, f2)\t\tx86_divr_d(_jit, f0, f1, f2)\n__jit_inline void\nx86_divr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1, jit_fpr_t f2)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_divr_d(_jit, f0, f1, f2);\n    else\n\tx87_divr_d(_jit, f0, f1, f2);\n}\n\n#define jit_ldi_f(f0, i0)\t\tx86_ldi_f(_jit, f0, i0)\n__jit_inline void\nx86_ldi_f(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldi_f(_jit, f0, i0);\n    else\n\tx87_ldi_f(_jit, f0, i0);\n}\n\n#define jit_ldr_f(f0, r0)\t\tx86_ldr_f(_jit, f0, r0)\n__jit_inline void\nx86_ldr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldr_f(_jit, f0, r0);\n    else\n\tx87_ldr_f(_jit, f0, r0);\n}\n\n#define jit_ldxi_f(f0, r0, i0)\t\tx86_ldxi_f(_jit, f0, r0, i0)\n__jit_inline void\nx86_ldxi_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, int i0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldxi_f(_jit, f0, r0, i0);\n    else\n\tx87_ldxi_f(_jit, f0, r0, i0);\n}\n\n#define jit_ldxr_f(f0, r0, r1)\t\tx86_ldxr_f(_jit, f0, r0, r1)\n__jit_inline void\nx86_ldxr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldxr_f(_jit, f0, r0, r1);\n    else\n\tx87_ldxr_f(_jit, f0, r0, r1);\n}\n\n#define jit_ldi_d(f0, i0)\t\tx86_ldi_d(_jit, f0, i0)\n__jit_inline void\nx86_ldi_d(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldi_d(_jit, f0, i0);\n    else\n\tx87_ldi_d(_jit, f0, i0);\n}\n\n#define jit_ldr_d(f0, r0)\t\tx86_ldr_d(_jit, f0, r0)\n__jit_inline void\nx86_ldr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldr_d(_jit, f0, r0);\n    else\n\tx87_ldr_d(_jit, f0, r0);\n}\n\n#define jit_ldxi_d(f0, r0, i0)\t\tx86_ldxi_d(_jit, f0, r0, i0)\n__jit_inline void\nx86_ldxi_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, long i0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldxi_d(_jit, f0, r0, i0);\n    else\n\tx87_ldxi_d(_jit, f0, r0, i0);\n}\n\n#define jit_ldxr_d(f0, r0, r1)\t\tx86_ldxr_d(_jit, f0, r0, r1)\n__jit_inline void\nx86_ldxr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ldxr_d(_jit, f0, r0, r1);\n    else\n\tx87_ldxr_d(_jit, f0, r0, r1);\n}\n\n#define jit_sti_f(i0, f0)\t\tx86_sti_f(_jit, i0, f0)\n__jit_inline void\nx86_sti_f(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_sti_f(_jit, i0, f0);\n    else\n\tx87_sti_f(_jit, i0, f0);\n}\n\n#define jit_str_f(r0, f0)\t\tx86_str_f(_jit, r0, f0)\n__jit_inline void\nx86_str_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_str_f(_jit, r0, f0);\n    else\n\tx87_str_f(_jit, r0, f0);\n}\n\n#define jit_stxi_f(i0, r0, f0)\t\tx86_stxi_f(_jit, i0, r0, f0)\n__jit_inline void\nx86_stxi_f(jit_state_t _jit, long i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_stxi_f(_jit, i0, r0, f0);\n    else\n\tx87_stxi_f(_jit, i0, r0, f0);\n}\n\n#define jit_stxr_f(r0, r1, f0)\t\tx86_stxr_f(_jit, r0, r1, f0)\n__jit_inline void\nx86_stxr_f(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_stxr_f(_jit, r0, r1, f0);\n    else\n\tx87_stxr_f(_jit, r0, r1, f0);\n}\n\n#define jit_sti_d(i0, f0)\t\tx86_sti_d(_jit, i0, f0)\n__jit_inline void\nx86_sti_d(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_sti_d(_jit, i0, f0);\n    else\n\tx87_sti_d(_jit, i0, f0);\n}\n\n#define jit_str_d(r0, f0)\t\tx86_str_d(_jit, r0, f0)\n__jit_inline void\nx86_str_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_str_d(_jit, r0, f0);\n    else\n\tx87_str_d(_jit, r0, f0);\n}\n\n#define jit_stxi_d(i0, r0, f0)\t\tx86_stxi_d(_jit, i0, r0, f0)\n__jit_inline void\nx86_stxi_d(jit_state_t _jit, long i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_stxi_d(_jit, i0, r0, f0);\n    else\n\tx87_stxi_d(_jit, i0, r0, f0);\n}\n\n#define jit_stxr_d(r0, r1, f0)\t\tx86_stxr_d(_jit, r0, r1, f0)\n__jit_inline void\nx86_stxr_d(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_stxr_d(_jit, r0, r1, f0);\n    else\n\tx87_stxr_d(_jit, r0, r1, f0);\n}\n\n#define jit_movi_f(f0, i0)\t\tx86_movi_f(_jit, f0, i0)\n__jit_inline void\nx86_movi_f(jit_state_t _jit, jit_fpr_t f0, float i0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_movi_f(_jit, f0, i0);\n    else\n\tx87_movi_f(_jit, f0, i0);\n}\n\n#define jit_movi_d(f0, i0)\t\tx86_movi_d(_jit, f0, i0)\n__jit_inline void\nx86_movi_d(jit_state_t _jit, jit_fpr_t f0, double i0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_movi_d(_jit, f0, i0);\n    else\n\tx87_movi_d(_jit, f0, i0);\n}\n\n#define jit_movr_f(f0, f1)\t\tx86_movr_f(_jit, f0, f1)\n__jit_inline void\nx86_movr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tif (jit_sse_reg_p(f1))\n\t    sse_movr_f(_jit, f0, f1);\n\telse\n\t    sse_from_x87_f(_jit, f0, f1);\n    }\n    else {\n\tif (jit_x87_reg_p(f1))\n\t    x87_movr_d(_jit, f0, f1);\n\telse\n\t    x87_from_sse_f(_jit, f0, f1);\n    }\n}\n\n#define jit_movr_d(f0, f1)\t\tx86_movr_d(_jit, f0, f1)\n__jit_inline void\nx86_movr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0)) {\n\tif (jit_sse_reg_p(f1))\n\t    sse_movr_d(_jit, f0, f1);\n\telse\n\t    sse_from_x87_d(_jit, f0, f1);\n    }\n    else {\n\tif (jit_x87_reg_p(f1))\n\t    x87_movr_d(_jit, f0, f1);\n\telse\n\t    x87_from_sse_d(_jit, f0, f1);\n    }\n}\n\n#define jit_extr_i_f(f0, r0)\t\tx86_extr_i_f(_jit, f0, r0)\n__jit_inline void\nx86_extr_i_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_extr_i_f(_jit, f0, r0);\n    else\n\tx87_extr_i_d(_jit, f0, r0);\n}\n\n#define jit_extr_i_d(f0, r0)\t\tx86_extr_i_d(_jit, f0, r0)\n__jit_inline void\nx86_extr_i_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_extr_i_d(_jit, f0, r0);\n    else\n\tx87_extr_i_d(_jit, f0, r0);\n}\n\n#define jit_extr_f_d(f0, f1)\t\tx86_extr_f_d(_jit, f0, f1)\n__jit_inline void\nx86_extr_f_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_extr_f_d(_jit, f0, f1);\n    else\n\tx87_movr_d(_jit, f0, f1);\n}\n\n#define jit_extr_d_f(f0, f1)\t\tx86_extr_d_f(_jit, f0, f1)\n__jit_inline void\nx86_extr_d_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_extr_d_f(_jit, f0, f1);\n    else\n\tx87_movr_d(_jit, f0, f1);\n}\n\n#define jit_rintr_f_i(r0, f0)\t\tx86_rintr_f_i(_jit, r0, f0)\n__jit_inline void\nx86_rintr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_rintr_f_i(_jit, r0, f0);\n    else\n\tx87_rintr_d_i(_jit, r0, f0);\n}\n\n#define jit_rintr_d_i(r0, f0)\t\tx86_rintr_d_i(_jit, r0, f0)\n__jit_inline void\nx86_rintr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_rintr_d_i(_jit, r0, f0);\n    else\n\tx87_rintr_d_i(_jit, r0, f0);\n}\n\n#define jit_roundr_f_i(r0, f0)\t\tx86_roundr_f_i(_jit, r0, f0)\n__jit_inline void\nx86_roundr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_roundr_f_i(_jit, r0, f0);\n    else\n\tx87_roundr_d_i(_jit, r0, f0);\n}\n\n#define jit_roundr_d_i(r0, f0)\t\tx86_roundr_d_i(_jit, r0, f0)\n__jit_inline void\nx86_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_roundr_d_i(_jit, r0, f0);\n    else\n\tx87_roundr_d_i(_jit, r0, f0);\n}\n\n#define jit_truncr_f_i(r0, f0)\t\tx86_truncr_f_i(_jit, r0, f0)\n__jit_inline void\nx86_truncr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_truncr_f_i(_jit, r0, f0);\n    else\n\tx87_truncr_d_i(_jit, r0, f0);\n}\n\n#define jit_truncr_d_i(r0, f0)\t\tx86_truncr_d_i(_jit, r0, f0)\n__jit_inline void\nx86_truncr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_truncr_d_i(_jit, r0, f0);\n    else\n\tx87_truncr_d_i(_jit, r0, f0);\n}\n\n#define jit_floorr_f_i(r0, f0)\t\tx86_floorr_f_i(_jit, r0, f0)\n__jit_inline void\nx86_floorr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_floorr_f_i(_jit, r0, f0);\n    else\n\tx87_floorr_d_i(_jit, r0, f0);\n}\n\n#define jit_floorr_d_i(r0, f0)\t\tx86_floorr_d_i(_jit, r0, f0)\n__jit_inline void\nx86_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_floorr_d_i(_jit, r0, f0);\n    else\n\tx87_floorr_d_i(_jit, r0, f0);\n}\n\n#define jit_ceilr_f_i(r0, f0)\t\tx86_ceilr_f_i(_jit, r0, f0)\n__jit_inline void\nx86_ceilr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ceilr_f_i(_jit, r0, f0);\n    else\n\tx87_ceilr_d_i(_jit, r0, f0);\n}\n\n#define jit_ceilr_d_i(r0, f0)\t\tx86_ceilr_d_i(_jit, r0, f0)\n__jit_inline void\nx86_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ceilr_d_i(_jit, r0, f0);\n    else\n\tx87_ceilr_d_i(_jit, r0, f0);\n}\n\n#define jit_ltr_f(r0, f0, f1)\t\tx86_ltr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_ltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ltr_f(_jit, r0, f0, f1);\n    else\n\tx87_ltr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ltr_d(r0, f0, f1)\t\tx86_ltr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_ltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ltr_d(_jit, r0, f0, f1);\n    else\n\tx87_ltr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ler_f(r0, f0, f1)\t\tx86_ler_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_ler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ler_f(_jit, r0, f0, f1);\n    else\n\tx87_ler_d(_jit, r0, f0, f1);\n}\n\n#define jit_ler_d(r0, f0, f1)\t\tx86_ler_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_ler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ler_d(_jit, r0, f0, f1);\n    else\n\tx87_ler_d(_jit, r0, f0, f1);\n}\n\n#define jit_eqr_f(r0, f0, f1)\t\tx86_eqr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_eqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_eqr_f(_jit, r0, f0, f1);\n    else\n\tx87_eqr_d(_jit, r0, f0, f1);\n}\n\n#define jit_eqr_d(r0, f0, f1)\t\tx86_eqr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_eqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_eqr_d(_jit, r0, f0, f1);\n    else\n\tx87_eqr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ger_f(r0, f0, f1)\t\tx86_ger_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_ger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ger_f(_jit, r0, f0, f1);\n    else\n\tx87_ger_d(_jit, r0, f0, f1);\n}\n\n#define jit_ger_d(r0, f0, f1)\t\tx86_ger_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_ger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ger_d(_jit, r0, f0, f1);\n    else\n\tx87_ger_d(_jit, r0, f0, f1);\n}\n\n#define jit_gtr_f(r0, f0, f1)\t\tx86_gtr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_gtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_gtr_f(_jit, r0, f0, f1);\n    else\n\tx87_gtr_d(_jit, r0, f0, f1);\n}\n\n#define jit_gtr_d(r0, f0, f1)\t\tx86_gtr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_gtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_gtr_d(_jit, r0, f0, f1);\n    else\n\tx87_gtr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ner_f(r0, f0, f1)\t\tx86_ner_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_ner_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ner_f(_jit, r0, f0, f1);\n    else\n\tx87_ner_d(_jit, r0, f0, f1);\n}\n\n#define jit_ner_d(r0, f0, f1)\t\tx86_ner_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_ner_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ner_d(_jit, r0, f0, f1);\n    else\n\tx87_ner_d(_jit, r0, f0, f1);\n}\n\n#define jit_unltr_f(r0, f0, f1)\t\tx86_unltr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_unltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unltr_f(_jit, r0, f0, f1);\n    else\n\tx87_unltr_d(_jit, r0, f0, f1);\n}\n\n#define jit_unltr_d(r0, f0, f1)\t\tx86_unltr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_unltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unltr_d(_jit, r0, f0, f1);\n    else\n\tx87_unltr_d(_jit, r0, f0, f1);\n}\n\n#define jit_unler_f(r0, f0, f1)\t\tx86_unler_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_unler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unler_f(_jit, r0, f0, f1);\n    else\n\tx87_unler_d(_jit, r0, f0, f1);\n}\n\n#define jit_unler_d(r0, f0, f1)\t\tx86_unler_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_unler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unler_d(_jit, r0, f0, f1);\n    else\n\tx87_unler_d(_jit, r0, f0, f1);\n}\n\n#define jit_ltgtr_f(r0, f0, f1)\t\tx86_ltgtr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_ltgtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ltgtr_f(_jit, r0, f0, f1);\n    else\n\tx87_ltgtr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ltgtr_d(r0, f0, f1)\t\tx86_ltgtr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_ltgtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ltgtr_d(_jit, r0, f0, f1);\n    else\n\tx87_ltgtr_d(_jit, r0, f0, f1);\n}\n\n#define jit_uneqr_f(r0, f0, f1)\t\tx86_uneqr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_uneqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_uneqr_f(_jit, r0, f0, f1);\n    else\n\tx87_uneqr_d(_jit, r0, f0, f1);\n}\n\n#define jit_uneqr_d(r0, f0, f1)\t\tx86_uneqr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_uneqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_uneqr_d(_jit, r0, f0, f1);\n    else\n\tx87_uneqr_d(_jit, r0, f0, f1);\n}\n\n#define jit_unger_f(r0, f0, f1)\t\tx86_unger_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_unger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unger_f(_jit, r0, f0, f1);\n    else\n\tx87_unger_d(_jit, r0, f0, f1);\n}\n\n#define jit_unger_d(r0, f0, f1)\t\tx86_unger_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_unger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unger_d(_jit, r0, f0, f1);\n    else\n\tx87_unger_d(_jit, r0, f0, f1);\n}\n\n#define jit_ungtr_f(r0, f0, f1)\t\tx86_ungtr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_ungtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ungtr_f(_jit, r0, f0, f1);\n    else\n\tx87_ungtr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ungtr_d(r0, f0, f1)\t\tx86_ungtr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_ungtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ungtr_d(_jit, r0, f0, f1);\n    else\n\tx87_ungtr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ordr_f(r0, f0, f1)\t\tx86_ordr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_ordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ordr_f(_jit, r0, f0, f1);\n    else\n\tx87_ordr_d(_jit, r0, f0, f1);\n}\n\n#define jit_ordr_d(r0, f0, f1)\t\tx86_ordr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_ordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_ordr_d(_jit, r0, f0, f1);\n    else\n\tx87_ordr_d(_jit, r0, f0, f1);\n}\n\n#define jit_unordr_f(r0, f0, f1)\tx86_unordr_f(_jit, r0, f0, f1)\n__jit_inline void\nx86_unordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unordr_f(_jit, r0, f0, f1);\n    else\n\tx87_unordr_d(_jit, r0, f0, f1);\n}\n\n#define jit_unordr_d(r0, f0, f1)\tx86_unordr_d(_jit, r0, f0, f1)\n__jit_inline void\nx86_unordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\tsse_unordr_d(_jit, r0, f0, f1);\n    else\n\tx87_unordr_d(_jit, r0, f0, f1);\n}\n\n#define jit_bltr_f(label, f0, f1)\tx86_bltr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bltr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bltr_f(_jit, label, f0, f1));\n    return (x87_bltr_d(_jit, label, f0, f1));\n}\n\n#define jit_bltr_d(label, f0, f1)\tx86_bltr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bltr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bltr_d(_jit, label, f0, f1));\n    return (x87_bltr_d(_jit, label, f0, f1));\n}\n\n#define jit_bler_f(label, f0, f1)\tx86_bler_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bler_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bler_f(_jit, label, f0, f1));\n    return (x87_bler_d(_jit, label, f0, f1));\n}\n\n#define jit_bler_d(label, f0, f1)\tx86_bler_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bler_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bler_d(_jit, label, f0, f1));\n    return (x87_bler_d(_jit, label, f0, f1));\n}\n\n#define jit_beqr_f(label, f0, f1)\tx86_beqr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_beqr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_beqr_f(_jit, label, f0, f1));\n    return (x87_beqr_d(_jit, label, f0, f1));\n}\n\n#define jit_beqr_d(label, f0, f1)\tx86_beqr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_beqr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_beqr_d(_jit, label, f0, f1));\n    return (x87_beqr_d(_jit, label, f0, f1));\n}\n\n#define jit_bger_f(label, f0, f1)\tx86_bger_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bger_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bger_f(_jit, label, f0, f1));\n    return (x87_bger_d(_jit, label, f0, f1));\n}\n\n#define jit_bger_d(label, f0, f1)\tx86_bger_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bger_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bger_d(_jit, label, f0, f1));\n    return (x87_bger_d(_jit, label, f0, f1));\n}\n\n#define jit_bgtr_f(label, f0, f1)\tx86_bgtr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bgtr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bgtr_f(_jit, label, f0, f1));\n    return (x87_bgtr_d(_jit, label, f0, f1));\n}\n\n#define jit_bgtr_d(label, f0, f1)\tx86_bgtr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bgtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bgtr_d(_jit, label, f0, f1));\n    return (x87_bgtr_d(_jit, label, f0, f1));\n}\n\n#define jit_bner_f(label, f0, f1)\tx86_bner_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bner_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bner_f(_jit, label, f0, f1));\n    return (x87_bner_d(_jit, label, f0, f1));\n}\n\n#define jit_bner_d(label, f0, f1)\tx86_bner_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bner_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bner_d(_jit, label, f0, f1));\n    return (x87_bner_d(_jit, label, f0, f1));\n}\n\n#define jit_bunltr_f(label, f0, f1)\tx86_bunltr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunltr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunltr_f(_jit, label, f0, f1));\n    return (x87_bunltr_d(_jit, label, f0, f1));\n}\n\n#define jit_bunltr_d(label, f0, f1)\tx86_bunltr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunltr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunltr_d(_jit, label, f0, f1));\n    return (x87_bunltr_d(_jit, label, f0, f1));\n}\n\n#define jit_bunler_f(label, f0, f1)\tx86_bunler_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunler_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunler_f(_jit, label, f0, f1));\n    return (x87_bunler_d(_jit, label, f0, f1));\n}\n\n#define jit_bunler_d(label, f0, f1)\tx86_bunler_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunler_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunler_d(_jit, label, f0, f1));\n    return (x87_bunler_d(_jit, label, f0, f1));\n}\n\n#define jit_bltgtr_f(label, f0, f1)\tx86_bltgtr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bltgtr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bltgtr_f(_jit, label, f0, f1));\n    return (x87_bltgtr_d(_jit, label, f0, f1));\n}\n\n#define jit_bltgtr_d(label, f0, f1)\tx86_bltgtr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bltgtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bltgtr_d(_jit, label, f0, f1));\n    return (x87_bltgtr_d(_jit, label, f0, f1));\n}\n\n#define jit_buneqr_f(label, f0, f1)\tx86_buneqr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_buneqr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_buneqr_f(_jit, label, f0, f1));\n    return (x87_buneqr_d(_jit, label, f0, f1));\n}\n\n#define jit_buneqr_d(label, f0, f1)\tx86_buneqr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_buneqr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_buneqr_d(_jit, label, f0, f1));\n    return (x87_buneqr_d(_jit, label, f0, f1));\n}\n\n#define jit_bunger_f(label, f0, f1)\tx86_bunger_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunger_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunger_f(_jit, label, f0, f1));\n    return (x87_bunger_d(_jit, label, f0, f1));\n}\n\n#define jit_bunger_d(label, f0, f1)\tx86_bunger_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunger_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunger_d(_jit, label, f0, f1));\n    return (x87_bunger_d(_jit, label, f0, f1));\n}\n\n#define jit_bungtr_f(label, f0, f1)\tx86_bungtr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bungtr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bungtr_f(_jit, label, f0, f1));\n    return (x87_bungtr_d(_jit, label, f0, f1));\n}\n\n#define jit_bungtr_d(label, f0, f1)\tx86_bungtr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bungtr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bungtr_d(_jit, label, f0, f1));\n    return (x87_bungtr_d(_jit, label, f0, f1));\n}\n\n#define jit_bordr_f(label, f0, f1)\tx86_bordr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bordr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bordr_f(_jit, label, f0, f1));\n    return (x87_bordr_d(_jit, label, f0, f1));\n}\n\n#define jit_bordr_d(label, f0, f1)\tx86_bordr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bordr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bordr_d(_jit, label, f0, f1));\n    return (x87_bordr_d(_jit, label, f0, f1));\n}\n\n#define jit_bunordr_f(label, f0, f1)\tx86_bunordr_f(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunordr_f(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunordr_f(_jit, label, f0, f1));\n    return (x87_bunordr_d(_jit, label, f0, f1));\n}\n\n#define jit_bunordr_d(label, f0, f1)\tx86_bunordr_d(_jit, label, f0, f1)\n__jit_inline jit_insn *\nx86_bunordr_d(jit_state_t _jit, jit_insn *label, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (jit_sse_reg_p(f0))\n\treturn (sse_bunordr_d(_jit, label, f0, f1));\n    return (x87_bunordr_d(_jit, label, f0, f1));\n}\n\n#if __WORDSIZE == 64\n#  include \"fp-64.h\"\n#else\n#  include \"fp-32.h\"\n#endif\n\n#endif /* __lightning_fp_i386_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/i386/funcs.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer inline functions (i386)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000,2001,2002,2006,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n\n#ifndef __lightning_funcs_h\n#define __lightning_funcs_h\n\n#ifdef __linux__\n#include <unistd.h>\n#include <sys/mman.h>\n#endif\n\n#ifdef _MSC_VER\n#include <intrin.h>\n#endif\n\n// static void\n// jit_flush_code(void *dest, void *end)\n// {\n  // /* On the x86, the PROT_EXEC bits are not handled by the MMU.\n     // However, the kernel can emulate this by setting the code\n     // segment's limit to the end address of the highest page\n     // whose PROT_EXEC bit is set.\n\n     // Linux kernels that do so and that disable by default the\n     // execution of the data and stack segment are becoming more\n     // and more common (Fedora, for example), so we implement our\n     // jit_flush_code as an mprotect.  */\n// #ifdef __linux__\n  // static long prev_page = 0, prev_length = 0;\n  // long page, length;\n// #ifdef PAGESIZE\n  // const int page_size = PAGESIZE;\n// #else\n  // static int page_size = -1;\n  // if (page_size == -1)\n    // page_size = sysconf (_SC_PAGESIZE);\n// #endif\n\n  // page = (long) dest & ~(page_size - 1);\n  // length = ((char *) end - (char *) page + page_size - 1) & ~(page_size - 1);\n\n  // /* Simple-minded attempt at optimizing the common case where a single\n     // chunk of memory is used to compile multiple functions.  */\n  // if (page >= prev_page && page + length <= prev_page + prev_length)\n    // return;\n\n  // mprotect ((void *) page, length, PROT_READ | PROT_WRITE | PROT_EXEC);\n\n  // /* See if we can extend the previously mprotect'ed memory area towards\n     // higher addresses: the starting address remains the same as before.  */\n  // if (page >= prev_page && page <= prev_page + prev_length)\n    // prev_length = page + length - prev_page;\n\n  // /* See if we can extend the previously mprotect'ed memory area towards\n     // lower addresses: the highest address remains the same as before.  */\n  // else if (page < prev_page && page + length >= prev_page\n          // && page + length <= prev_page + prev_length)\n    // prev_length += prev_page - page, prev_page = page;\n\n  // /* Nothing to do, replace the area.  */\n  // else\n    // prev_page = page, prev_length = length;\n// #endif\n// }\n\n#define jit_get_cpu\t\t\tjit_get_cpu\n__jit_constructor static void\njit_get_cpu(void)\n{\n    union {\n\tstruct {\n\t    _ui sse3:\t\t1;\n\t    _ui pclmulqdq:\t1;\n\t    _ui dtes64:\t\t1;\t/* amd reserved */\n\t    _ui monitor:\t1;\n\t    _ui ds_cpl:\t\t1;\t/* amd reserved */\n\t    _ui vmx:\t\t1;\t/* amd reserved */\n\t    _ui smx:\t\t1;\t/* amd reserved */\n\t    _ui est:\t\t1;\t/* amd reserved */\n\t    _ui tm2:\t\t1;\t/* amd reserved */\n\t    _ui ssse3:\t\t1;\n\t    _ui cntx_id:\t1;\t/* amd reserved */\n\t    _ui __reserved0:\t1;\n\t    _ui fma:\t\t1;\n\t    _ui cmpxchg16b:\t1;\n\t    _ui xtpr:\t\t1;\t/* amd reserved */\n\t    _ui pdcm:\t\t1;\t/* amd reserved */\n\t    _ui __reserved1:\t1;\n\t    _ui pcid:\t\t1;\t/* amd reserved */\n\t    _ui dca:\t\t1;\t/* amd reserved */\n\t    _ui sse4_1:\t\t1;\n\t    _ui sse4_2:\t\t1;\n\t    _ui x2apic:\t\t1;\t/* amd reserved */\n\t    _ui movbe:\t\t1;\t/* amd reserved */\n\t    _ui popcnt:\t\t1;\n\t    _ui tsc:\t\t1;\t/* amd reserved */\n\t    _ui aes:\t\t1;\n\t    _ui xsave:\t\t1;\n\t    _ui osxsave:\t1;\n\t    _ui avx:\t\t1;\n\t    _ui __reserved2:\t1;\t/* amd F16C */\n\t    _ui __reserved3:\t1;\n\t    _ui __alwayszero:\t1;\t/* amd RAZ */\n\t} bits;\n\t_ui\tcpuid;\n    } ecx;\n    union {\n\tstruct {\n\t    _ui fpu:\t\t1;\n\t    _ui vme:\t\t1;\n\t    _ui de:\t\t1;\n\t    _ui pse:\t\t1;\n\t    _ui tsc:\t\t1;\n\t    _ui msr:\t\t1;\n\t    _ui pae:\t\t1;\n\t    _ui mce:\t\t1;\n\t    _ui cmpxchg8b:\t1;\n\t    _ui apic:\t\t1;\n\t    _ui __reserved0:\t1;\n\t    _ui sep:\t\t1;\n\t    _ui mtrr:\t\t1;\n\t    _ui pge:\t\t1;\n\t    _ui mca:\t\t1;\n\t    _ui cmov:\t\t1;\n\t    _ui pat:\t\t1;\n\t    _ui pse36:\t\t1;\n\t    _ui psn:\t\t1;\t/* amd reserved */\n\t    _ui clfsh:\t\t1;\n\t    _ui __reserved1:\t1;\n\t    _ui ds:\t\t1;\t/* amd reserved */\n\t    _ui acpi:\t\t1;\t/* amd reserved */\n\t    _ui mmx:\t\t1;\n\t    _ui fxsr:\t\t1;\n\t    _ui sse:\t\t1;\n\t    _ui sse2:\t\t1;\n\t    _ui ss:\t\t1;\t/* amd reserved */\n\t    _ui htt:\t\t1;\n\t    _ui tm:\t\t1;\t/* amd reserved */\n\t    _ui __reserved2:\t1;\n\t    _ui pbe:\t\t1;\t/* amd reserved */\n\t} bits;\n\t_ui\tcpuid;\n    } edx;\n#if __WORDSIZE == 32\n    int\t\tac, flags;\n#endif\n    _ui\t\teax, ebx;\n    static int\tinitialized;\n\n    /* may need to be called explicitly if not using gcc */\n    if (initialized)\n\t\treturn;\n    initialized = 1;\n\n#if __WORDSIZE == 32\n#ifdef _MSC_VER\n    _asm \n    {\n        ; check if 'cpuid' instructions is available by toggling eflags bit 21\n        ;\n        pushfd                      ; save eflags to stack\n        pop     eax                 ; load eax from stack (with eflags)\n        mov     ecx, eax            ; save the original eflags values to ecx\n        xor     eax, 0x00200000     ; toggle bit 21\n        push    eax                 ; store toggled eflags to stack\n        popfd                       ; load eflags from stack\n        pushfd                      ; save updated eflags to stack\n        pop     eax                 ; load from stack\n\t\txor     eax, ecx            ; \n\t\tpush    ecx                 ;\n\t\tpopfd                       ;\n\t\tmov     ac, eax\n\t}\n#else\n    /* adapted from glibc __sysconf */\n    __asm__ volatile (\"pushfl;\\n\\t\"\n\t\t      \"popl %0;\\n\\t\"\n\t\t      \"movl $0x240000, %1;\\n\\t\"\n\t\t      \"xorl %0, %1;\\n\\t\"\n\t\t      \"pushl %1;\\n\\t\"\n\t\t      \"popfl;\\n\\t\"\n\t\t      \"pushfl;\\n\\t\"\n\t\t      \"popl %1;\\n\\t\"\n\t\t      \"xorl %0, %1;\\n\\t\"\n\t\t      \"pushl %0;\\n\\t\"\n\t\t      \"popfl\"\n\t\t      : \"=r\" (flags), \"=r\" (ac));\n#endif\n    /* i386 or i486 without cpuid */\n    if ((ac & (1 << 21)) == 0)\n\t/* probably without x87 as well */\n\t\treturn;\n#endif\n\n    /* query %eax = 1 function */\n#ifdef _MSC_VER\n\t//int ecx_cpuid;\n\t//int edx_cpuid;\n\t//_asm \n\t//{\n\t//\tmov     eax, 1\n\t//\tcpuid\n\t//\tmov     ecx_cpuid, ecx\n\t//\tmov     edx_cpuid, edx\n\t//}\n\t//ecx.cpuid = (_ui)ecx_cpuid;\n\t//edx.cpuid = (_ui)edx_cpuid;\n\n\tint id_data[4];\n\n\t__cpuid(id_data, 1);\n\n\tecx.cpuid = (_ui)id_data[2];\n\tedx.cpuid = (_ui)id_data[3];\n\n#else\n    __asm__ volatile (\"xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1\"\n\t\t      : \"=a\" (eax), \"=r\" (ebx),\n\t\t      \"=c\" (ecx.cpuid), \"=d\" (edx.cpuid)\n\t\t      : \"0\" (1));\n#endif\n\n    /* check only what is useful for lightning and/or\n     * what is the same for AMD and Intel processors */\n    jit_cpu.fpu\t\t= edx.bits.fpu;\n    jit_cpu.cmpxchg8b\t= edx.bits.cmpxchg8b;\n    jit_cpu.cmov\t= edx.bits.cmov;\n    jit_cpu.mmx\t\t= edx.bits.mmx;\n    jit_cpu.sse\t\t= edx.bits.sse;\n    jit_cpu.sse2\t= edx.bits.sse2;\n    jit_cpu.sse3\t= ecx.bits.sse3;\n    jit_cpu.pclmulqdq\t= ecx.bits.pclmulqdq;\n    jit_cpu.ssse3\t= ecx.bits.ssse3;\n    jit_cpu.fma\t\t= ecx.bits.fma;\n    jit_cpu.cmpxchg16b\t= ecx.bits.cmpxchg16b;\n    jit_cpu.sse4_1\t= ecx.bits.sse4_1;\n    jit_cpu.sse4_2\t= ecx.bits.sse4_2;\n    jit_cpu.movbe\t= ecx.bits.movbe;\n    jit_cpu.popcnt\t= ecx.bits.popcnt;\n    jit_cpu.aes\t\t= ecx.bits.aes;\n    jit_cpu.avx\t\t= ecx.bits.avx;\n\n#if __WORDSIZE == 64\n#ifdef _MSC_VER\n\t//_asm \n\t//{\n\t//\tmov     eax, 0x80000001\n\t//\tcpuid\n\t//\tmov     ecx_cpuid, ecx\n\t//\tmov     edx_cpuid, edx\n\t//}\n\t//ecx.cpuid = (_ui)ecx_cpuid;\n\t//edx.cpuid = (_ui)edx_cpuid;\n\n\t__cpuid(id_data, 0x80000001);\n\n\tecx.cpuid = (_ui)id_data[2];\n\tedx.cpuid = (_ui)id_data[3];\n#else\n    /* query %eax = 0x80000001 function */\n    __asm__ volatile (\"xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1\"\n\t\t      : \"=a\" (eax), \"=r\" (ebx),\n\t\t      \"=c\" (ecx.cpuid), \"=d\" (edx.cpuid)\n\t\t      : \"0\" (0x80000001));\n    jit_cpu.lahf\t= ecx.cpuid & 1;\n#endif\n#endif\n\n    /* default to round to nearest */\n    jit_flags.rnd_near\t= 1;\n\n    /* default to use push/pop for arguments and float conversion;\n     * this generates several redundant stack adjustments, but is\n     * not dependent on patching stack adjustment in jit_prolog,\n     * and this way, works with any possible code that jumps from/to\n     * code after different jit_prolog */\n    jit_flags.push_pop\t= 1;\n}\n\n#endif /* __lightning_funcs_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/lightning.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tlightning main include file\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000,2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaolo Bonzini\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n\n\n#ifndef __lightning_h\n#define __lightning_h\n\n#include <assert.h>\n#include <stdint.h>\n\n#include \"config_lightning.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n#if __GNUC__\n#  define __jit_constructor\t__attribute__((constructor))\n# define __jit_inline\t\tinline static\n#else\n#  define __jit_constructor\t/**/\n# define __jit_inline\t\tstatic\n#endif\n\ntypedef signed char\t\t_sc;\ntypedef unsigned char\t\t_uc, jit_insn;\ntypedef unsigned short\t\t_us;\ntypedef unsigned int\t\t_ui;\ntypedef long\t\t\t_sl;\ntypedef unsigned long\t\t_ul;\ntypedef struct jit_local_state\tjit_local_state;\n\n#if defined(__i386__) || defined(__x86_64__)\nstruct {\n    /* x87 present */\n    _ui\t\tfpu\t\t: 1;\n    /* cmpxchg8b instruction */\n    _ui\t\tcmpxchg8b\t: 1;\n    /* cmov and fcmov branchless conditional mov */\n    _ui\t\tcmov\t\t: 1;\n    /* mmx registers/instructions available */\n    _ui\t\tmmx\t\t: 1;\n    /* sse registers/instructions available */\n    _ui\t\tsse\t\t: 1;\n    /* sse2 registers/instructions available */\n    _ui\t\tsse2\t\t: 1;\n    /* sse3 instructions available */\n    _ui\t\tsse3\t\t: 1;\n    /* pcmulqdq instruction */\n    _ui\t\tpclmulqdq\t: 1;\n    /* ssse3 suplemental sse3 instructions available */\n    _ui\t\tssse3\t\t: 1;\n    /* fused multiply/add using ymm state */\n    _ui\t\tfma\t\t: 1;\n    /* cmpxchg16b instruction */\n    _ui\t\tcmpxchg16b\t: 1;\n    /* sse4.1 instructions available */\n    _ui\t\tsse4_1\t\t: 1;\n    /* sse4.2 instructions available */\n    _ui\t\tsse4_2\t\t: 1;\n    /* movbe instruction available */\n    _ui\t\tmovbe\t\t: 1;\n    /* popcnt instruction available */\n    _ui\t\tpopcnt\t\t: 1;\n    /* aes instructions available */\n    _ui\t\taes\t\t: 1;\n    /* avx instructions available */\n    _ui\t\tavx\t\t: 1;\n    /* lahf/sahf available in 64 bits mode */\n    _ui\t\tlahf\t\t: 1;\n} jit_cpu;\n\nstruct {\n    /* round to nearest? */\n    _ui\t\trnd_near\t: 1;\n    /* force push/pop for arguments and stack space float conversion?\n     * this is useful in some very rare special cases, if generating\n     * code that jumps from function to function, to make the stack\n     * logic not dependent on patched value in jit_prolog */\n    _ui\t\tpush_pop\t: 1;\n} jit_flags;\n#elif !defined(__mips__) && !defined(__arm__)\n#  define\tjit_gpr_t\tint\n#  define\tjit_fpr_t\tint\n#endif\n\n#if defined(__i386__) && !defined(__x86_64__)\nstruct jit_local_state {\n    int\t\t framesize;\n    int\t\t float_offset;\t/* %ebp offset for float conversion */\n    int\t\t alloca_offset;\t/* alloca offset from %ebp */\n    int\t\t stack_length;\t/* maximum number of arguments */\n    int\t\t stack_offset;\t/* argument offset */\n    int\t\t*stack;\t\t/* patch address for immediate %esp adjust */\n    jit_insn\t*label;\n};\n#elif defined(__x86_64__)\nstruct jit_local_state {\n    int\t\t long_jumps;\n    int\t\t nextarg_getfp;\n    int\t\t nextarg_putfp;\n    int\t\t nextarg_geti;\n    int\t\t nextarg_puti;\n    int\t\t framesize;\n    int\t\t fprssize;\n    int\t\t float_offset;\n    int\t\t alloca_offset;\n    int\t\t stack_length;\n    int\t\t stack_offset;\n    int\t\t*stack;\n    jit_insn\t*label;\n};\n#elif defined(__ppc__)\nstruct jit_local_state {\n   int\t\t nextarg_puti;\t/* number of integer args */\n   int\t\t nextarg_putf;\t/* number of float args   */\n   int\t\t nextarg_putd;\t/* number of double args  */\n   int\t\t nextarg_geti;\t/* Next r20-r25 reg. to be read */\n   int\t\t nextarg_getd;\t/* The FP args are picked up from FPR1 -> FPR10 */\n   int\t\t nbArgs;\t/* Number of arguments for the prolog */\n   int\t\t frame_size, slack;\n   _ui\t\t*stwu;\n};\n#elif defined(__sparc__)\nstruct jit_local_state {\n    int\t\t nextarg_put;\t/* Next %o reg. to be written */\n    int\t\t nextarg_get;\t/* Next %i reg. to be read */\n    jit_insn\t*save;\t\t/* Pointer to the `save' instruction */\n    unsigned\t frame_size;\t/* Current frame size as allocated by `save' */\n    int\t\t alloca_offset; /* Current offset to the alloca'd memory\n\t\t\t\t * (negative offset relative to %fp) */\n    jit_insn\t delay;\n};\n#elif defined(__mips__)\nstruct jit_local_state {\n    int\t\t framesize;\n    int\t\t nextarg_int;\n    int\t\t nextarg_put;\n    int\t\t alloca_offset;\n    int\t\t stack_length;\n    int\t\t stack_offset;\n    int\t\t*stack;\n#if !defined(__mips64__)\n    int\t\t*arguments[256];\n    int\t\t types[8];\n#endif\n#ifdef JIT_NEED_PUSH_POP\n    /* minor support for unsupported code but that exists in test cases... */\n    int\t\t push[32];\n    int\t\t pop;\n#endif\n};\n\nstruct {\n    /* mips32 r2 instructions available? */\n    _ui\t\tmips2\t\t: 1;\n\n    /* assume memory doubles are 8 bytes aligned? */\n    _ui\t\talgndbl\t\t: 1;\n\n    _ui\t\tmovf\t\t: 1;\n    _ui\t\tmul\t\t: 1;\n    _ui\t\tmips64\t\t: 1;\n} jit_cpu;\n#elif defined(__arm__)\nstruct jit_local_state {\n    int\t\t reglist;\n    int\t\t framesize;\n    int\t\t nextarg_get;\n    int\t\t nextarg_put;\n    int\t\t nextarg_getf;\n    int\t\t alloca_offset;\n    int\t\t stack_length;\n    int\t\t stack_offset;\n    void\t*stack;\n    jit_insn\t*thumb;\n    /* hackish mostly to make test cases work; use arm instruction\n     * set in jmpi if did not yet see a prolog */\n    int\t\t after_prolog;\n    void\t*arguments[256];\n    int\t\t types[8];\n#ifdef JIT_NEED_PUSH_POP\n    /* minor support for unsupported code but that exists in test cases... */\n    int\t\t push[32];\n    int\t\t pop;\n#endif\n};\nstruct {\n    _ui\t\tversion\t\t: 4;\n    _ui\t\textend\t\t: 1;\n    /* only generate thumb instructions for thumb2 */\n    _ui\t\tthumb\t\t: 1;\n    _ui\t\tvfp\t\t: 3;\n    _ui\t\tneon\t\t: 1;\n    _ui\t\tabi\t\t: 2;\n} jit_cpu;\nstruct {\n    /* prevent using thumb instructions that set flags? */\n    _ui\t\tno_set_flags\t: 1;\n} jit_flags;\n#else\n#  error GNU lightning does not support the current target\n#endif\n\ntypedef struct jit_state {\n    union {\n\tjit_insn\t*pc;\n\t_uc\t\t*uc_pc;\n\t_us\t\t*us_pc;\n\t_ui\t\t*ui_pc;\n\t_ul\t\t*ul_pc;\n    } x;\n    struct jit_fp\t*fp;\n    jit_local_state\t jitl;\n} jit_state_t[1];\n\n#ifdef jit_init\njit_state_t\t\t_jit = jit_init();\n#else\njit_state_t\t\t_jit;\n#endif\n\n#define _jitl\t\t_jit->jitl\n\n#include \"asm-common.h\"\n\n#ifndef LIGHTNING_DEBUG\n#if defined(LIGHTNING_I386) || defined(LIGHTNING_X86_64)\n#include \"i386/asm.h\"\n#elif defined(LIGHTNING_ARM)\n#include \"arm/asm.h\"\n#elif defined(LIGHTNING_MIPS) || defined(LIGHTNING_MIPS64)\n#include \"mips/asm.h\"\n#elif defined(LIGHTNING_PPC)\n#include \"ppc/asm.h\"\n#elif defined(LIGHTNING_SPARC)\n#include \"sparc/asm.h\"\n#endif\n#endif\n\n#if defined(LIGHTNING_I386) || defined(LIGHTNING_X86_64)\n#include \"i386/funcs.h\"\n#elif defined(LIGHTNING_ARM)\n#include \"arm/funcs.h\"\n#elif defined(LIGHTNING_MIPS) || defined(LIGHTNING_MIPS64)\n#include \"mips/funcs.h\"\n#elif defined(LIGHTNING_PPC)\n#include \"ppc/funcs.h\"\n#elif defined(LIGHTNING_SPARC)\n#include \"sparc/funcs.h\"\n#endif\n#include \"funcs-common.h\"\n\n#if defined(LIGHTNING_I386) || defined(LIGHTNING_X86_64)\n#include \"i386/core.h\"\n#elif defined(LIGHTNING_ARM)\n#include \"arm/core.h\"\n#elif defined(LIGHTNING_MIPS) || defined(LIGHTNING_MIPS64)\n#include \"mips/core.h\"\n#elif defined(LIGHTNING_PPC)\n#include \"ppc/core.h\"\n#elif defined(LIGHTNING_SPARC)\n#include \"sparc/core.h\"\n#endif\n#include \"core-common.h\"\n\n#if defined(LIGHTNING_I386) || defined(LIGHTNING_X86_64)\n#include \"i386/fp.h\"\n#elif defined(LIGHTNING_ARM)\n#include \"arm/fp.h\"\n#elif defined(LIGHTNING_MIPS) || defined(LIGHTNING_MIPS64)\n#include \"mips/fp.h\"\n#elif defined(LIGHTNING_PPC)\n#include \"ppc/fp.h\"\n#elif defined(LIGHTNING_SPARC)\n#include \"sparc/fp.h\"\n#endif\n#include \"fp-common.h\"\n\n#if defined(__cplusplus)\n};\n#endif\n\n#endif /* __lightning_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/Makefile.frag",
    "content": "LIGHTNING_TARGET_FILES += mips/core-32.h mips/core-64.h \\\n\tmips/fp-32.h mips/fp-64.h\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/README",
    "content": "  The code pass all test cases on contrib/check and lightning tests\non mips32, running on a \"Godson2 V0.2\" gdium computer. (the push-pop\ntest is very basic and there is only minimal \"dumb\" support to pass\nthe test, use jit_allocai and access it as a vector for \"portable\"\nstack storage access using lightning).\n\n  The logic in core-64.h is not even compiled, and for sure is broken,\nas it should be using the n64 abi.\n\n  It should work on all argument combinations for the o32 abi, but\nsupports only float/double and int/long/pointer arguments, what should\nbe enough for most usages of lightning.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/asm.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the mips\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_asm_h\n#define __lightning_asm_h\n\ntypedef enum {\n    _ZERO\t= 0x00,\t\t/* constant 0 */\n    _AT\t\t= 0x01,\t\t/* assembly temporary */\n    _V0\t\t= 0x02,\t\t/* function return and expression evaluation */\n    _V1\t\t= 0x03,\n    _A0\t\t= 0x04,\t\t/* function arguments */\n    _A1\t\t= 0x05,\n    _A2\t\t= 0x06,\n    _A3\t\t= 0x07,\n    _T0\t\t= 0x08,\t\t/* temporaries */\n    _T1\t\t= 0x09,\n    _T2\t\t= 0x0a,\n    _T3\t\t= 0x0b,\n    _T4\t\t= 0x0c,\n    _T5\t\t= 0x0d,\n    _T6\t\t= 0x0e,\n    _T7\t\t= 0x0f,\n    _S0\t\t= 0x10,\t\t/* (callee saved) temporaries */\n    _S1\t\t= 0x11,\n    _S2\t\t= 0x12,\n    _S3\t\t= 0x13,\n    _S4\t\t= 0x14,\n    _S5\t\t= 0x15,\n    _S6\t\t= 0x16,\n    _S7\t\t= 0x17,\n    _T8\t\t= 0x18,\t\t/* temporaries */\n    _T9\t\t= 0x19,\n    _K0\t\t= 0x1a,\t\t/* reserved for OS kernel */\n    _K1\t\t= 0x1b,\n    _GP\t\t= 0x1c,\t\t/* (callee saved) global pointer */\n    _SP\t\t= 0x1d,\t\t/* (callee saved) stack pointer */\n    _FP\t\t= 0x1e,\t\t/* (callee saved) frame pointer */\n    _RA\t\t= 0x1f,\t\t/* return address */\n} jit_gpr_t;\n\ntypedef enum {\n    _F0\t\t= 0x00,\n    _F1\t\t= 0x01,\n    _F2\t\t= 0x02,\n    _F3\t\t= 0x03,\n    _F4\t\t= 0x04,\n    _F5\t\t= 0x05,\n    _F6\t\t= 0x06,\n    _F7\t\t= 0x07,\n    _F8\t\t= 0x08,\n    _F9\t\t= 0x09,\n    _F10\t= 0x0a,\n    _F11\t= 0x0b,\n    _F12\t= 0x0c,\n    _F13\t= 0x0d,\n    _F14\t= 0x0e,\n    _F15\t= 0x0f,\n    _F16\t= 0x10,\n    _F17\t= 0x11,\n    _F18\t= 0x12,\n    _F19\t= 0x13,\n    _F20\t= 0x14,\n    _F21\t= 0x15,\n    _F22\t= 0x16,\n    _F23\t= 0x17,\n    _F24\t= 0x18,\n    _F25\t= 0x19,\n    _F26\t= 0x1a,\n    _F27\t= 0x1b,\n    _F28\t= 0x1c,\n    _F29\t= 0x1d,\n    _F30\t= 0x1e,\n    _F31\t= 0x1f,\n} jit_fpr_t;\n\ntypedef union {\n    struct {\t_ui _:26;\t_ui\tb :  6; } hc;\n    struct {\t_ui _:21;\t_ui\tb :  5; } rs;\n    struct {\t_ui _:21;\t_ui\tb :  5; } fm;\n    struct {\t_ui _:16;\t_ui\tb :  5; } rt;\n    struct {\t_ui _:16;\t_ui\tb :  5; } ft;\n    struct {\t_ui _:11;\t_ui\tb :  5; } rd;\n    struct {\t_ui _:11;\t_ui\tb :  5; } fs;\n    struct {\t_ui _: 6;\t_ui\tb :  5; } ic;\n    struct {\t_ui _: 6;\t_ui\tb :  5; } fd;\n    struct {\t_ui _: 6;\t_ui\tb : 10; } tr;\n    struct {\t_ui _: 6;\t_ui\tb : 20; } br;\n    struct {\t\t\t_ui\tb :  6; } tc;\n    struct {\t\t\t_ui\tb : 11; } cc;\n    struct {\t\t\t_ui\tb : 16; } is;\n    struct {\t\t\t_ui\tb : 26; } ii;\n    int\t\t\t\t\t\t  op;\n} mips_code_t;\n\ntypedef enum {\n    MIPS_SPECIAL\t= 0x00,\n    MIPS_REGIMM\t\t= 0x01,\n    MIPS_J\t\t= 0x02,\n    MIPS_SRL\t\t= 0x02,\n    MIPS_JAL\t\t= 0x03,\n    MIPS_SRA\t\t= 0x03,\n    MIPS_BEQ\t\t= 0x04,\n    MIPS_BNE\t\t= 0x05,\n    MIPS_BLEZ\t\t= 0x06,\n    MIPS_BGTZ\t\t= 0x07,\n    MIPS_ADDI\t\t= 0x08,\n    MIPS_ADDIU\t\t= 0x09,\n    MIPS_SLTI\t\t= 0x0a,\n    MIPS_SLTIU\t\t= 0x0b,\n    MIPS_ANDI\t\t= 0x0c,\n    MIPS_ORI\t\t= 0x0d,\n    MIPS_XORI\t\t= 0x0e,\n    MIPS_LUI\t\t= 0x0f,\n    MIPS_COP0\t\t= 0x10,\n    MIPS_COP1\t\t= 0x11,\n    MIPS_COP2\t\t= 0x12,\n    MIPS_COP1X\t\t= 0x13,\n    MIPS_BEQL\t\t= 0x14,\n    MIPS_BNEL\t\t= 0x15,\n    MIPS_BLEZL\t\t= 0x16,\n    MIPS_BGTZL\t\t= 0x17,\n    MIPS_DADDI\t\t= 0x18,\n    MIPS_DADDIU\t\t= 0x19,\n    MIPS_LDL\t\t= 0x1a,\n    MIPS_LDR\t\t= 0x1b,\n    MIPS_SPECIAL2\t= 0x1c,\n    MIPS_JALX\t\t= 0x1d,\n    MIPS_SPECIAL3\t= 0x1f,\n    MIPS_LB\t\t= 0x20,\n    MIPS_LH\t\t= 0x21,\n    MIPS_LWL\t\t= 0x22,\n    MIPS_LW\t\t= 0x23,\n    MIPS_LBU\t\t= 0x24,\n    MIPS_LHU\t\t= 0x25,\n    MIPS_LWR\t\t= 0x26,\n    MIPS_LWU\t\t= 0x27,\n    MIPS_SB\t\t= 0x28,\n    MIPS_SH\t\t= 0x29,\n    MIPS_SWL\t\t= 0x2a,\n    MIPS_SW\t\t= 0x2b,\n    MIPS_SWR\t\t= 0x2e,\n    MIPS_CACHE\t\t= 0x2f,\n    MIPS_LL\t\t= 0x30,\n    MIPS_LWC1\t\t= 0x31,\n    MIPS_LWC2\t\t= 0x32,\n    MIPS_PREF\t\t= 0x33,\n    MIPS_LLD\t\t= 0x34,\n    MIPS_LDC1\t\t= 0x35,\n    MIPS_LDC2\t\t= 0x36,\n    MIPS_LD\t\t= 0x37,\n    MIPS_SC\t\t= 0x38,\n    MIPS_SCD\t\t= 0x3c,\n    MIPS_SDC1\t\t= 0x3d,\n    MIPS_SDC2\t\t= 0x3e,\n    MIPS_SWC1\t\t= 0x39,\n    MIPS_SWC2\t\t= 0x3a,\n    MIPS_SD\t\t= 0x3f,\n} mips_hc_t;\n\ntypedef enum {\n    MIPS_MF\t\t= 0x00,\n    MIPS_DMF\t\t= 0x01,\n    MIPS_CF\t\t= 0x02,\n    MIPS_MFH\t\t= 0x03,\n    MIPS_MT\t\t= 0x04,\n    MIPS_DMT\t\t= 0x05,\n    MIPS_CT\t\t= 0x06,\n    MIPS_MTH\t\t= 0x07,\n    MIPS_BC\t\t= 0x08,\n    MIPS_WRPGPR\t\t= 0x0e,\n    MIPS_BGZAL\t\t= 0x11,\n    MIPS_MFMC0\t\t= 0x11,\n} mips_r1_t;\n\ntypedef enum {\n    MIPS_BCF\t\t= 0x00,\n    MIPS_BLTZ\t\t= 0x00,\n    MIPS_BCT\t\t= 0x01,\n    MIPS_BGEZ\t\t= 0x01,\n    MIPS_BCFL\t\t= 0x02,\n    MIPS_BLTZL\t\t= 0x02,\n    MIPS_BCTL\t\t= 0x03,\n    MIPS_BGEZL\t\t= 0x03,\n    MIPS_TGEI\t\t= 0x08,\n    MIPS_TGEIU\t\t= 0x09,\n    MIPS_TLTI\t\t= 0x0a,\n    MIPS_TLTIU\t\t= 0x0b,\n    MIPS_TEQI\t\t= 0x0c,\n    MIPS_TNEI\t\t= 0x0e,\n    MIPS_BLTZAL\t\t= 0x10,\n    MIPS_BGEZAL\t\t= 0x11,\n    MIPS_BLTZALL\t= 0x12,\n    MIPS_BGEZALL\t= 0x13,\n    MIPS_SYNCI\t\t= 0x1f,\n} mips_r2_t;\n\n#define MIPS_WSBH\t\t0x02\n#define MIPS_DBSH\t\t0x02\n#define MIPS_DSHD\t\t0x05\n#define MIPS_SEB\t\t0x10\n#define MIPS_SEH\t\t0x18\n\ntypedef enum {\n    MIPS_MADD\t\t= 0x00,\n    MIPS_SLL\t\t= 0x00,\n    MIPS_EXT\t\t= 0x00,\n    MIPS_DEXTM\t\t= 0x01,\n    MIPS_MADDU\t\t= 0x01,\n    MIPS_MOVFT\t\t= 0x01,\n    MIPS_TLBR\t\t= 0x01,\n    MIPS_MUL\t\t= 0x02,\n    MIPS_DEXTU\t\t= 0x02,\n    MIPS_TLBWI\t\t= 0x02,\n    MIPS_DEXT\t\t= 0x03,\n    MIPS_SLLV\t\t= 0x04,\n    MIPS_INS\t\t= 0x04,\n    MIPS_MSUB\t\t= 0x04,\n    MIPS_DINSM\t\t= 0x05,\n    MIPS_MSUBU\t\t= 0x05,\n    MIPS_SRLV\t\t= 0x06,\n    MIPS_DINSU\t\t= 0x06,\n    MIPS_TLBWR\t\t= 0x06,\n    MIPS_SRAV\t\t= 0x07,\n    MIPS_DINS\t\t= 0x07,\n    MIPS_JR\t\t= 0x08,\n    MIPS_TLBP\t\t= 0x08,\n    MIPS_JALR\t\t= 0x09,\n    MIPS_MOVZ\t\t= 0x0a,\n    MIPS_MOVN\t\t= 0x0b,\n    MIPS_SYSCALL\t= 0x0c,\n    MIPS_BREAK\t\t= 0x0d,\n    MIPS_PREFX\t\t= 0x0f,\n    MIPS_SYNC\t\t= 0x0f,\n    MIPS_MFHI\t\t= 0x10,\n    MIPS_MTHI\t\t= 0x11,\n    MIPS_MFLO\t\t= 0x12,\n    MIPS_MTLO\t\t= 0x13,\n    MIPS_DSLLV\t\t= 0x14,\n    MIPS_DSRLV\t\t= 0x16,\n    MIPS_DSRAV\t\t= 0x17,\n    MIPS_MULT\t\t= 0x18,\n    MIPS_ERET\t\t= 0x18,\n    MIPS_MULTU\t\t= 0x19,\n    MIPS_DIV\t\t= 0x1a,\n    MIPS_DIVU\t\t= 0x1b,\n    MIPS_DMULT\t\t= 0x1c,\n    MIPS_DMULTU\t\t= 0x1d,\n    MIPS_DDIV\t\t= 0x1e,\n    MIPS_DDIVU\t\t= 0x1f,\n    MIPS_DERET\t\t= 0x1f,\n    MIPS_ADD\t\t= 0x20,\n    MIPS_CLZ\t\t= 0x20,\n    MIPS_BSHFL\t\t= 0x20,\n    MIPS_ADDU\t\t= 0x21,\n    MIPS_CLO\t\t= 0x21,\n    MIPS_SUB\t\t= 0x22,\n    MIPS_SUBU\t\t= 0x23,\n    MIPS_AND\t\t= 0x24,\n    MIPS_DCLZ\t\t= 0x24,\n    MIPS_DBSHFL\t\t= 0x24,\n    MIPS_OR\t\t= 0x25,\n    MIPS_DCLO\t\t= 0x25,\n    MIPS_XOR\t\t= 0x26,\n    MIPS_NOR\t\t= 0x27,\n    MIPS_SLT\t\t= 0x2a,\n    MIPS_SLTU\t\t= 0x2b,\n    MIPS_DADD\t\t= 0x2c,\n    MIPS_DADDU\t\t= 0x2d,\n    MIPS_DSUB\t\t= 0x2e,\n    MIPS_DSUBU\t\t= 0x2f,\n    MIPS_TGE\t\t= 0x30,\n    MIPS_TGEU\t\t= 0x31,\n    MIPS_TLT\t\t= 0x32,\n    MIPS_TLTU\t\t= 0x33,\n    MIPS_TEQ\t\t= 0x34,\n    MIPS_TNE\t\t= 0x36,\n    MIPS_DSLL\t\t= 0x38,\n    MIPS_DSRL\t\t= 0x3a,\n    MIPS_DSRA\t\t= 0x3b,\n    MIPS_DSLL32\t\t= 0x3c,\n    MIPS_DSRL32\t\t= 0x3e,\n    MIPS_DSRA32\t\t= 0x3f,\n    MIPS_SDBPP\t\t= 0x3f,\n} mips_tc_t;\n\ntypedef enum {\n    MIPS_fmt_S\t\t= 0x10,\t\t/* float32 */\n    MIPS_fmt_D\t\t= 0x11,\t\t/* float64 */\n    MIPS_fmt_W\t\t= 0x14,\t\t/* int32 */\n    MIPS_fmt_L\t\t= 0x15,\t\t/* int64 */\n    MIPS_fmt_PS\t\t= 0x16,\t\t/* 2 x float32 */\n    MIPS_fmt_S_PU\t= 0x20,\n    MIPS_fmt_S_PL\t= 0x26,\n} mips_fmt_t;\n\ntypedef enum {\n    MIPS_ADD_fmt\t= 0x00,\n    MIPS_LWXC1\t\t= 0x00,\n    MIPS_SUB_fmt\t= 0x01,\n    MIPS_LDXC1\t\t= 0x01,\n    MIPS_MUL_fmt\t= 0x02,\n    MIPS_DIV_fmt\t= 0x03,\n    MIPS_SQRT_fmt\t= 0x04,\n    MIPS_ABS_fmt\t= 0x05,\n    MIPS_LUXC1\t\t= 0x05,\n    MIPS_MOV_fmt\t= 0x06,\n    MIPS_NEG_fmt\t= 0x07,\n    MIPS_SWXC1\t\t= 0x08,\n    MIPS_ROUND_fmt_L\t= 0x08,\n    MIPS_TRUNC_fmt_L\t= 0x09,\n    MIPS_SDXC1\t\t= 0x09,\n    MIPS_CEIL_fmt_L\t= 0x0a,\n    MIPS_FLOOR_fmt_L\t= 0x0b,\n    MIPS_ROUND_fmt_W\t= 0x0c,\n    MIPS_TRUNC_fmt_W\t= 0x0d,\n    MIPS_SUXC1\t\t= 0x0d,\n    MIPS_CEIL_fmt_W\t= 0x0e,\n    MIPS_FLOOR_fmt_W\t= 0x0f,\n    MIPS_RECIP\t\t= 0x15,\n    MIPS_RSQRT\t\t= 0x16,\n    MIPS_ALNV_PS\t= 0x1e,\n    MIPS_CVT_fmt_S\t= 0x20,\n    MIPS_CVT_fmt_D\t= 0x21,\n    MIPS_CVT_fmt_W\t= 0x24,\n    MIPS_CVT_fmt_L\t= 0x25,\n    MIPS_PLL\t\t= 0x2c,\n    MIPS_PLU\t\t= 0x2d,\n    MIPS_PUL\t\t= 0x2e,\n    MIPS_PUU\t\t= 0x2f,\n    MIPS_MADD_fmt_S\t= 0x20 | MIPS_fmt_S,\n    MIPS_MADD_fmt_D\t= 0x20 | MIPS_fmt_D,\n    MIPS_MADD_fmt_PS\t= 0x20 | MIPS_fmt_PS,\n    MIPS_MSUB_fmt_S\t= 0x28 | MIPS_fmt_S,\n    MIPS_MSUB_fmt_D\t= 0x28 | MIPS_fmt_D,\n    MIPS_MSUB_fmt_PS\t= 0x28 | MIPS_fmt_PS,\n    MIPS_NMADD_fmt_S\t= 0x30 | MIPS_fmt_S,\n    MIPS_NMADD_fmt_D\t= 0x30 | MIPS_fmt_D,\n    MIPS_NMADD_fmt_PS\t= 0x30 | MIPS_fmt_PS,\n    MIPS_NMSUB_fmt_S\t= 0x38 | MIPS_fmt_S,\n    MIPS_NMSUB_fmt_D\t= 0x38 | MIPS_fmt_D,\n    MIPS_NMSUB_fmt_PS\t= 0x38 | MIPS_fmt_PS,\n} mips_fc_t;\n\ntypedef enum {\n    MIPS_cond_F\t\t= 0x30,\n    MIPS_cond_UN\t= 0x31,\n    MIPS_cond_EQ\t= 0x32,\n    MIPS_cond_UEQ\t= 0x33,\n    MIPS_cond_OLT\t= 0x34,\n    MIPS_cond_ULT\t= 0x35,\n    MIPS_cond_OLE\t= 0x36,\n    MIPS_cond_ULE\t= 0x37,\n    MIPS_cond_SF\t= 0x38,\n    MIPS_cond_NGLE\t= 0x39,\n    MIPS_cond_SEQ\t= 0x3a,\n    MIPS_cond_NGL\t= 0x3b,\n    MIPS_cond_LT\t= 0x3c,\n    MIPS_cond_NGE\t= 0x3d,\n    MIPS_cond_LE\t= 0x3e,\n    MIPS_cond_UGT\t= 0x3f,\n} mips_cond_t;\n\n__jit_inline void\nmips___r_t(jit_state_t _jit, jit_gpr_t rd, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.rd.b = rd;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_r___t(jit_state_t _jit, jit_gpr_t rs, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.rs.b = rs;\n    c.tc.b = tc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmipsh_ri(jit_state_t _jit, mips_hc_t hc, jit_gpr_t rt, int im)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(im);\n    c.rt.b = rt;\n    c.rs.b = 0;\t\t/* ignored */\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmipshrri(jit_state_t _jit, mips_hc_t hc, jit_gpr_t rs, jit_gpr_t rt, int im)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(im);\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmipshrrr_t(jit_state_t _jit, mips_hc_t hc,\n\t   jit_gpr_t rs, jit_gpr_t rt, jit_gpr_t rd, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.ic.b = 0;\n    c.rd.b = rd;\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmipshrr__t(jit_state_t _jit, mips_hc_t hc,\n\t   jit_gpr_t rs, jit_gpr_t rt, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hrrrit(jit_state_t _jit, mips_hc_t hc,\n\t    jit_gpr_t rs, jit_gpr_t rt, jit_gpr_t rd, int ic, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.ic.b = _u5(ic);\n    c.rd.b = rd;\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_rrr_t(jit_state_t _jit, jit_gpr_t rs,\n\t   jit_gpr_t rt, jit_gpr_t rd, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.rd.b = rd;\n    c.rt.b = rt;\n    c.rs.b = rs;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips__rrit(jit_state_t _jit, jit_gpr_t rt, jit_gpr_t rd, int im, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.ic.b = _u5(im);\n    c.rd.b = rd;\n    c.rt.b = rt;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_r_it(jit_state_t _jit, jit_gpr_t rs, int im, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.ic.b = _u5(im);\t/* hint */\n    c.rs.b = rs;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_r_rit(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rd, int im, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.ic.b = _u5(im);\n    c.rd.b = rd;\n    c.rs.b = rs;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmipshi(jit_state_t _jit, mips_hc_t hc, int im)\n{\n    mips_code_t\t\tc;\n    c.ii.b = _u26(im);\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmipshrriit(jit_state_t _jit, mips_hc_t hc, jit_gpr_t rs,\n\t   jit_gpr_t rt, int rd, int im, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.ic.b = _u5(im);\n    c.rd.b = _u5(rd);\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hirrit(jit_state_t _jit, mips_hc_t hc, int rs,\n\t    jit_gpr_t rt, jit_gpr_t rd, int im, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.ic.b = _u5(im);\n    c.rd.b = rd;\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_fp1(jit_state_t _jit, mips_fmt_t fm,\n\t jit_fpr_t fs, jit_fpr_t fd, mips_fc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.fd.b = fd;\n    c.fs.b = fs;\n    c.ft.b = 0;\n    c.fm.b = fm;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_fp2(jit_state_t _jit, mips_fmt_t fm,\n\t jit_fpr_t ft, jit_fpr_t fs, jit_fpr_t fd, mips_fc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.fd.b = fd;\n    c.fs.b = fs;\n    c.ft.b = ft;\n    c.fm.b = fm;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_fp2x(jit_state_t _jit, jit_fpr_t fr,\n\t  jit_fpr_t ft, jit_fpr_t fs, jit_fpr_t fd, mips_fc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.fd.b = fd;\n    c.fs.b = fs;\n    c.ft.b = ft;\n    c.fm.b = fr;\n    c.hc.b = MIPS_COP1X;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_xrf(jit_state_t _jit, mips_fmt_t fm, jit_gpr_t rt, jit_gpr_t fs)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.fs.b = fs;\n    c.ft.b = rt;\n    c.fm.b = fm;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmipshrfi(jit_state_t _jit, mips_hc_t hc, jit_gpr_t rs, jit_gpr_t ft, int im)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(im);\n    c.rs.b = rs;\n    c.rt.b = ft;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_rr_f(jit_state_t _jit, jit_gpr_t rs,\n\t  jit_gpr_t rt, jit_fpr_t fd, mips_fc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.is.b = fd;\n    c.rd.b = 0;\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = MIPS_COP1X;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_rffft(jit_state_t _jit, jit_gpr_t rs,\n\t   jit_fpr_t ft, jit_fpr_t fs, jit_fpr_t fd, mips_fc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.fd.b = fd;\n    c.fs.b = fs;\n    c.ft.b = ft;\n    c.fm.b = rs;\n    c.hc.b = MIPS_COP1X;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hxxs(jit_state_t _jit, mips_hc_t hc, mips_r1_t r1, mips_r2_t r2, int im)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(im);\n    c.rt.b = r2;\n    c.rs.b = r1;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hrxs(jit_state_t _jit, mips_hc_t hc, jit_gpr_t rs, mips_r2_t r2, int im)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(im);\n    c.rt.b = r2;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hxrr_(jit_state_t _jit, mips_hc_t hc, mips_r1_t r1,\n\t   jit_gpr_t rt, jit_gpr_t rd)\n{\n    mips_code_t\t\tc;\n    c.cc.b = 0;\n    c.rd.b = rd;\n    c.rt.b = rt;\n    c.rs.b = r1;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hxrf_(jit_state_t _jit, mips_hc_t hc, mips_r1_t r1,\n\t   jit_gpr_t rt, jit_fpr_t fs)\n{\n    mips_code_t\t\tc;\n    c.cc.b = 0;\n    c.fs.b = fs;\n    c.rt.b = rt;\n    c.rs.b = r1;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hxrs(jit_state_t _jit, mips_hc_t hc, mips_r1_t r1, jit_gpr_t rt, int impl)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(impl);\n    c.rt.b = rt;\n    c.rs.b = r1;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_c_cond_fmt(jit_state_t _jit, mips_fmt_t fm,\n\t\tjit_fpr_t ft, jit_fpr_t fs, mips_cond_t cc)\n{\n    mips_code_t\t\tc;\n    c.cc.b = cc;\n    c.fs.b = fs;\n    c.ft.b = ft;\n    c.fm.b = fm;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_mov_fmt(jit_state_t _jit, mips_fmt_t fm,\n\t     jit_gpr_t rt, jit_fpr_t fs, jit_fpr_t fd, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.fd.b = fd;\n    c.fs.b = fs;\n    c.rt.b = rt;\n    c.fm.b = fm;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_rirt(jit_state_t _jit, jit_gpr_t rs, int im, jit_gpr_t rd, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.rd.b = rd;\n    c.rt.b = im;\n    c.rs.b = rs;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_fp1x(jit_state_t _jit, mips_fmt_t fm,\n\t  jit_fpr_t fs, int im, jit_fpr_t fd, mips_fc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.fd.b = fd;\n    c.fs.b = fs;\n    c.ft.b = im;\n    c.fm.b = fm;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_ext(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rt,\n\t int size, int pos, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.ic.b = _u5(pos);\n    c.rd.b = _u5(size);\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = MIPS_SPECIAL3;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hrii(jit_state_t _jit, mips_hc_t hc, jit_gpr_t rs, int ic, int is)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(is);\n    c.rt.b = _u5(ic);\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_hrri_t(jit_state_t _jit, mips_hc_t hc, jit_gpr_t rs, jit_gpr_t rt,\n\t    int ic, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.ic.b = 0;\n    c.rd.b = _u5(ic);\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = hc;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_trap_cond(jit_state_t _jit, jit_gpr_t rs, jit_gpr_t rt, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = tc;\n    c.rt.b = rt;\n    c.rs.b = rs;\n    c.hc.b = MIPS_SPECIAL;\n    _jit_I(c.op);\n}\n\n__jit_inline void\nmips_tlb(jit_state_t _jit, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.br.b = 1 << 19;\n    c.hc.b = MIPS_COP0;\n    _jit_I(c.op);\n}\n\n#define _ABS_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_ABS_fmt)\n#define _ABS_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_ABS_fmt)\n#define _ABS_PS(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_PS,fs,fd,MIPS_ABS_fmt)\n#define _ADD(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_ADD)\n#define _ADD_S(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_S,ft,fs,fd,MIPS_ADD_fmt)\n#define _ADD_D(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_D,ft,fs,fd,MIPS_ADD_fmt)\n#define _ADD_PS(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_PS,ft,fs,fd,MIPS_ADD_fmt)\n#define _ADDI(rt,rs,im)\t\tmipshrri(_jit,MIPS_ADDI,rs,rt,im)\n#define _ADDIU(rt,rs,im)\tmipshrri(_jit,MIPS_ADDIU,rs,rt,im)\n#define _ADDU(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_ADDU)\n#define _ALNV_PS(fd,fs,ft,rs)\tmips_rffft(_jit,rs,ft,fs,fd,MIPS_ALNV_PS)\n#define _AND(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_AND)\n#define _ANDI(rt,rs,im)\t\tmipshrri(_jit,MIPS_ANDI,rs,rt,im)\n#define _B(im)\t\t\tmipshrri(_jit, MIPS_BEQ,_ZERO,_ZERO,im)\n#define _BAL(im)\t\tmipshrri(_jit,REGIMM,_ZERO,(jit_gpr_t)MIPS_BGZALL,im>>2)\n#define _BC1F(im)\t\tmips_hxxs(_jit,MIPS_COP1,MIPS_BC,MIPS_BCF,im)\n#define _BC1FL(im)\t\tmips_hxxs(_jit,MIPS_COP1,MIPS_BC,MIPS_BCFL,im)\n#define _BC1T(im)\t\tmips_hxxs(_jit,MIPS_COP1,MIPS_BC,MIPS_BCT,im)\n#define _BC1TL(im)\t\tmips_hxxs(_jit,MIPS_COP1,MIPS_BC,MIPS_BCTL,im)\n#define _BC2F(im)\t\tmips_hxxs(_jit,MIPS_COP2,MIPS_BC,MIPS_BCF,im)\n#define _BC2FL(im)\t\tmips_hxxs(_jit,MIPS_COP2,MIPS_BC,MIPS_BCFL,im)\n#define _BC2T(im)\t\tmips_hxxs(_jit,MIPS_COP2,MIPS_BC,MIPS_BCT,im)\n#define _BC2TL(im)\t\tmips_hxxs(_jit,MIPS_COP2,MIPS_BC,MIPS_BCTL,im)\n#define _BEQ(rs,rt,im)\t\tmipshrri(_jit,MIPS_BEQ,rs,rt,im)\n#define _BEQL(rs,rt,im)\t\tmipshrri(_jit,MIPS_BEQL,rs,rt,im)\n#define _BGEZ(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BGEZ,im)\n#define _BGEZAL(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BGEZAL,im)\n#define _BGEZALL(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BGEZALL,im)\n#define _BGEZL(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BGEZL,im)\n#define _BGTZ(rs,im)\t\tmipshrri(_jit,MIPS_BGTZ,rs,_ZERO,im)\n#define _BGTZL(rs,im)\t\tmipshrri(_jit,MIPS_BGTZL,rs,_ZERO,im)\n#define _BLEZ(rs,im)\t\tmipshrri(_jit,MIPS_BLEZ,rs,_ZERO,im)\n#define _BLEZL(rs,im)\t\tmipshrri(_jit,MIPS_BLEZL,rs,_ZERO,im)\n#define _BLTZ(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BLTZ,im)\n#define _BLTZAL(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BLTZAL,im)\n#define _BLTZALL(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BLTZALL,im)\n#define _BLTZL(rs,im)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_BLTZL,im)\n#define _BNE(rs,rt,im)\t\tmipshrri(_jit,MIPS_BNE,rs,rt,im)\n#define _BNEL(rs,rt,im)\t\tmipshrri(_jit,MIPS_BNEL,rs,rt,im)\n__jit_inline void\nmips_break(jit_state_t _jit, int code)\n{\n    mips_code_t\t\tc;\n    c.tc.b = MIPS_BREAK;\n    c.br.b = _u20(code);\n    c.hc.b = 0;\n    _jit_I(c.op);\n}\n#define _BREAK(code)\t\tmips_break(_jit, code)\n#define _C_F_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_F)\n#define _C_F_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_F)\n#define _C_F_PS(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_F)\n#define _C_UN_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_UN)\n#define _C_UN_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_UN)\n#define _C_UN_PS(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_UN)\n#define _C_EQ_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_EQ)\n#define _C_EQ_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_EQ)\n#define _C_EQ_PS(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_EQ)\n#define _C_UEQ_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_UEQ)\n#define _C_UEQ_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_UEQ)\n#define _C_UEQ_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_UEQ)\n#define _C_OLT_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_OLT)\n#define _C_OLT_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_OLT)\n#define _C_OLT_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_OLT)\n#define _C_ULT_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_ULT)\n#define _C_ULT_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_ULT)\n#define _C_ULT_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_ULT)\n#define _C_OLE_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_OLE)\n#define _C_OLE_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_OLE)\n#define _C_OLE_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_OLE)\n#define _C_ULE_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_ULE)\n#define _C_ULE_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_ULE)\n#define _C_ULE_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_ULE)\n#define _C_SF_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_SF)\n#define _C_SF_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_SF)\n#define _C_SF_PS(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_SF)\n#define _C_NGLE_S(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_NGLE)\n#define _C_NGLE_D(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_NGLE)\n#define _C_NGLE_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_NGLE)\n#define _C_SEQ_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_SEQ)\n#define _C_SEQ_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_SEQ)\n#define _C_SEQ_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_SEQ)\n#define _C_NGL_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_NGL)\n#define _C_NGL_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_NGL)\n#define _C_NGL_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_NGL)\n#define _C_NLT_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_NLT)\n#define _C_NLT_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_NLT)\n#define _C_NLT_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_NLT)\n#define _C_NGE_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_NGE)\n#define _C_NGE_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_NGE)\n#define _C_NGE_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_NGE)\n#define _C_NLE_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_NLE)\n#define _C_NLE_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_NLE)\n#define _C_NLE_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_NLE)\n#define _C_UGT_S(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_S,ft,fs,MIPS_cond_UGT)\n#define _C_UGT_D(fs,ft)\t\tmips_c_cond_fmt(_jit,MIPS_fmt_D,ft,fs,MIPS_cond_UGT)\n#define _C_UGT_PS(fs,ft)\tmips_c_cond_fmt(_jit,MIPS_fmt_PS,ft,fs,MIPS_cond_UGT)\n#define _CACHE(op,offset,base)\tmips_cache(_jit,op,base,offset)\n__jit_inline void\nmips_cache(jit_state_t _jit, jit_gpr_t base, int op, int offset)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(offset);\n    c.rt.b = _u5(op);\n    c.rs.b = _u16(base);\n    c.hc.b = MIPS_CACHE;\n    _jit_I(c.op);\n}\n#define _CEIL_L_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_CEIL_fmt_L)\n#define _CEIL_L_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_CEIL_fmt_L)\n#define _CEIL_W_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_CEIL_fmt_W)\n#define _CEIL_W_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_CEIL_fmt_W)\n#define _CFC1(rt,fs)\t\tmips_cfc1(_jit,rt,fs)\n__jit_inline void\nmips_cfc1(jit_state_t _jit, jit_gpr_t rt, jit_fpr_t fs)\n{\n    mips_code_t\t\tc;\n    c.cc.b = 0;\n    c.fs.b = fs;\n    c.rt.b = rt;\n    c.rs.b = MIPS_CF;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n#define _CFC2(rt,impl)\t\tmips_cfc2(_jit,rt,impl)\n__jit_inline void\nmips_cfc2(jit_state_t _jit, jit_gpr_t rt, int impl)\n{\n    mips_code_t\t\tc;\n    c.is.b = _u16(impl);\n    c.rs.b = MIPS_CF;\n    c.hc.b = MIPS_COP2;\n    _jit_I(c.op);\n}\n#define _CLO(rd,rs)\t\tmipshrrr_t(_jit,MIPS_SPECIAL2,rs,rd,rd,MIPS_CLO)\n#define _COP2(func)\t\tmips_cop2(_jit,func)\n__jit_inline void\nmips_cop2(jit_state_t _jit, int func)\n{\n    mips_code_t\t\tc;\n    c.ii.b = (1 << 25) | _u25(func);\n    c.hc.b = MIPS_COP2;\n    _jit_I(c.op);\n}\n#define _CLZ(rd,rs)\t\tmipshrrr_t(_jit,MIPS_SPECIAL2,rs,rd,rd,MIPS_CLZ)\n#define _CTC1(rt,fs)\t\tmips_ctc1(_jit,rt,fs)\n__jit_inline void\nmips_ctc1(jit_state_t _jit, jit_gpr_t rt, jit_fpr_t fs)\n{\n    mips_code_t\t\tc;\n    c.cc.b = 0;\n    c.fs.b = fs;\n    c.rt.b = rt;\n    c.rs.b = MIPS_CT;\n    c.hc.b = MIPS_COP1;\n    _jit_I(c.op);\n}\n#define _CTC2(rt,imp)\t\tmips_ctc2(rt,imp)\n__jit_inline void\nmips_ctc2(jit_state_t _jit, jit_gpr_t rt, int imp)\n{\n    mips_code_t\t\tc;\n    c.is.b = imp;\n    c.rt.b = rt;\n    c.hc.b = MIPS_COP2;\n    _jit_I(c.op);\n}\n#define _CVT_D_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_CVT_fmt_D)\n#define _CVT_D_W(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_W,fs,fd,MIPS_CVT_fmt_D)\n#define _CVT_D_L(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_L,fs,fd,MIPS_CVT_fmt_D)\n#define _CVT_L_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_CVT_fmt_L)\n#define _CVT_L_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_CVT_fmt_L)\n#define _CVT_PS_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_CVT_fmt_PS)\n#define _CVT_S_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_CVT_fmt_S)\n#define _CVT_S_W(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_W,fs,fd,MIPS_CVT_fmt_S)\n#define _CVT_S_L(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_L,fs,fd,MIPS_CVT_fmt_S)\n#define _CVT_S_PL(fd,fs)\tmips_fp1(_jit,MIPS_fmt_PS,fs,fd,MIPS_CVT_fmt_S_PL)\n#define _CVT_S_PU(fd,fs)\tmips_fp1(_jit,MIPS_fmt_PS,fs,fd,MIPS_CVT_fmt_S_PU)\n#define _CVT_W_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_CVT_fmt_W)\n#define _CVT_W_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_CVT_fmt_W)\n#define _DADD(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_DADD)\n#define _DADDI(rt,rs,im)\tmipshrri(_jit,MIPS_DADDI,rs,rt,im)\n#define _DADDU(rd,rs,rt)\tmips_rrr_t(_jit,rs,rt,rd,MIPS_DADDU)\n#define _DADDIU(rt,rs,im)\tmipshrri(_jit,MIPS_DADDIU,rs,rt,im)\n#define _DCLO(rd,rs)\t\tmipshrrr_t(_jit,MIPS_SPECIAL2,rs,rd,rd,MIPS_DCLO)\n#define _DCLZ(rd,rs)\t\tmipshrrr_t(_jit,MIPS_SPECIAL2,rs,rd,rd,MIPS_DCLZ)\n#define _DDIV(rs,rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_DDIV)\n#define _DDIVU(rs,rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_DDIVU)\n#define _DERET()\t\tmips_return(_jit,MIPS_DERET)\n__jit_inline void\nmips_return(jit_state_t _jit, mips_tc_t tc)\n{\n    mips_code_t\t\tc;\n    c.tc.b = tc;\n    c.br.b = 1 << 19;\n    c.hc.b = MIPS_COP0;\n    _jit_I(c.op);\n}\n#define _DEXT(rt,rs,pos,size)\tmips_ext(rs,rt,pos,size-1,MIPS_DEXT)\n#define _DEXTM(rt,rs,pos,size)\tmips_ext(rs,rt,pos,size-1-32,MIPS_DEXTM)\n#define _DEXTU(rt,rs,pos,size)\tmips_ext(rs,rt,pos-32,size-1,MIPS_DEXTU)\n#define _DI(rt)\t\t\tmips_interrupt(_jit,rt,0)\n__jit_inline void\nmips_interrupt(jit_state_t _jit, jit_gpr_t rt, int enable)\n{\n    mips_code_t\t\tc;\n    c.cc.b = (!!enable) << 5;\n    c.rd.b = 12;\n    c.rt.b = rt;\n    c.rs.b = MIPS_MFMC0;\n    c.hc.b = MIPS_COP0;\n    _jit_I(c.op);\n}\n#define _DINS(rt,rs,pos,size)\tmipshrriit(_jit,MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_DINS)\n#define _DINSM(rt,rs,pos,size)\tmipshrriit(_jit,MIPS_SPECIAL3,rs,rt,pos,pos+size-33,MIPS_DINSM)\n#define _DINSU(rt,rs,pos,size)\tmipshrriit(_jit,MIPS_SPECIAL3,rs,rt,pos-32,pos+size-33,MIPS_DINSU)\n#define _DIV(rs,rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_DIV)\n#define _DIV_S(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_S,ft,fs,fd,MIPS_DIV_fmt)\n#define _DIV_D(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_D,ft,fs,fd,MIPS_DIV_fmt)\n#define _DIVU(rs,rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_DIVU)\n#define _DMFC0(rt,rd)\t\tmips_hxrr_(_jit,MIPS_COP0,MIPS_DMF,rt,rd)\n#define _DMFC1(rt,fs)\t\tmips_hxrf_(_jit,MIPS_COP1,MIPS_DMF,rt,fs)\n#define _DMFC2(rt,impl)\t\tmips_hxrs(_jit,MIPS_COP2,MIPS_DMF,rt,impl)\n#define _DMTC0(rt,rd)\t\tmips_hxrr_(_jit,MIPS_COP0,MIPS_DMT,rt,rd)\n#define _DMTC1(rt,fs)\t\tmips_hxrf_(_jit,MIPS_COP1,MIPS_DMT,rt,fs)\n#define _DMTC2(rt,impl)\t\tmips_hxrs(_jit,MIPS_COP2,MIPS_DMT,rt,impl)\n#define _DMULT(rs, rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_DMULT)\n#define _DMULTU(rs, rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_DMULTU)\n#define _DROTR(rd,rt,sa)\tmips_hirrit(_jit,MIPS_SPECIAL,1,rt,rd,sa,MIPS_DSRL)\n#define _DROTR32(rd,rt,sa)\tmips_hirrit(_jit,MIPS_SPECIAL,1,rt,rd,sa-32,MIPS_DSRL32)\n#define _DROTRV(rd,rt,rs)\tmips_hrrrit(_jit,MIPS_SPECIAL,rs,rt,rd,1,MIPS_DSRLV)\n#define _DSBH(rd,rt)\t\tmips_hirrit(_jit,MIPS_SPECIAL3,0,rt,rd,MIPS_DBSH,MIPS_DBSHFL)\n#define _DSHD(rd,rt)\t\tmips_hirrit(_jit,MIPS_SPECIAL3,0,rt,rd,MIPS_DBHD,MIPS_DBSHFL)\n#define _DSLL(rd,rt,sa)\t\tmips__rrit(_jit,rt,rd,sa,MIPS_DSLL)\n#define _DSLL32(rd,rt,sa)\tmips__rrit(_jit,rt,rd,sa-32,MIPS_DSLL32)\n#define _DSLLV(rd,rt,rs)\tmips_rrr_t(_jit,rs,rt,rd,MIPS_DSLLV)\n#define _DSRA(rd,rt,sa)\t\tmips__rrit(_jit,rt,rd,sa,MIPS_DSRA)\n#define _DSRA32(rd,rt,sa)\tmips__rrit(_jit,rt,rd,sa-32,MIPS_DSRA32)\n#define _DSRAV(rd,rt,rs)\tmips_rrr_t(_jit,rs,rt,rd,MIPS_DSRAV)\n#define _DSRL(rd,rt,sa)\t\tmips__rrit(_jit,rt,rd,sa,MIPS_DSRL)\n#define _DSRL32(rd,rt,sa)\tmips__rrit(_jit,rt,rd,sa-32,MIPS_DSRL32)\n#define _DSRLV(rd,rt,rs)\tmips_rrr_t(_jit,rs,rt,rd,MIPS_DSRLV)\n#define _DSUB(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_DSUB)\n#define _DSUBU(rd,rs,rt)\tmips_rrr_t(_jit,rs,rt,rd,MIPS_DSUBU)\n#define _EHB()\t\t\t_SLL(JIT_RZERO,JIT_RZERO,3)\n#define _EI()\t\t\tmips_interrupt(_jit,rt,1)\n#define _ERET()\t\t\tmips_return(_jit,MIPS_ERET)\n#define _EXT(rt,rs,pos,size)\tmips_ext(rs,rt,pos,size-1,MIPS_EXT)\n#define _FLOOR_L_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_FLOOR_fmt_L)\n#define _FLOOR_L_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_FLOOR_fmt_L)\n#define _FLOOR_W_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_FLOOR_fmt_W)\n#define _FLOOR_W_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_FLOOR_fmt_W)\n#define _INS(rt,rs,pos,size)\tmipshrriit(_jit,MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_INS)\n#define _J(target)\t\tmipshi(_jit,MIPS_J,target)\n#define _JAL(target)\t\tmipshi(_jit,MIPS_JAL,target)\n#define _JALR(rs)\t\tmips_r_rit(_jit,rs,_RA,0,MIPS_JALR)\n#define _JALR_HB(rs)\t\tmips_r_rit(_jit,rs,_RA,1<<4,MIPS_JALR)\n#define _JALX(target)\t\tmipshi(_jit,MIPS_JALX,target)\n#define _JR(rs)\t\t\tmips_r_it(_jit,rs,0,MIPS_JR)\n#define _JR_HB(rs)\t\tmips_r_it(_jit,rs,1<<4,MIPS_JR)\n#define _LB(rt,offset,base)\tmipshrri(_jit,MIPS_LB,base,rt,offset)\n#define _LBU(rt,offset,base)\tmipshrri(_jit,MIPS_LBU,base,rt,offset)\n#define _LD(rt,offset,base)\tmipshrri(_jit,MIPS_LD,base,rt,offset)\n#define _LDC1(ft,offset,base)\tmipshrfi(_jit,MIPS_LDC1,base,ft,offset)\n#define _LDC2(ft,offset,base)\tmipshrfi(_jit,MIPS_LDC2,base,ft,offset)\n#define _LDL(rt,offset,base)\tmipshrri(_jit,MIPS_LDL,base,rt,offset)\n#define _LDR(rt,offset,base)\tmipshrri(_jit,MIPS_LDR,base,rt,offset)\n#define _LDXC1(fd,index,base)\tmips_rr_f(_jit,base,index,fd,MIPS_LDXC1)\n#define _LH(rt,offset,base)\tmipshrri(_jit,MIPS_LH,base,rt,offset)\n#define _LHU(rt,offset,base)\tmipshrri(_jit,MIPS_LHU,base,rt,offset)\n#define _LL(rt,offset,base)\tmipshrri(_jit,MIPS_LL,base,rt,offset)\n#define _LLD(rt,offset,base)\tmipshrri(_jit,MIPS_LLD,base,rt,offset)\n#define _LUI(rt,im)\t\tmipsh_ri(_jit,MIPS_LUI,rt,im)\n#define _LUXC1(fd,index,base)\tmips_rr_f(_jit,base,index,fd,MIPS_LUXC1)\n#define _LW(rt,offset,base)\tmipshrri(_jit,MIPS_LW,base,rt,offset)\n#define _LWC1(ft,offset,base)\tmipshrfi(_jit,MIPS_LWC1,base,ft,offset)\n#define _LWC2(ft,offset,base)\tmipshrfi(_jit,MIPS_LWC2,base,ft,offset)\n#define _LWL(rt,offset,base)\tmipshrri(_jit,MIPS_LWL,base,rt,offset)\n#define _LWR(rt,offset,base)\tmipshrri(_jit,MIPS_LWR,base,rt,offset)\n#define _LWU(rt,offset,base)\tmipshrri(_jit,MIPS_LWU,base,rt,offset)\n#define _LWXC1(fd,index,base)\tmips_rr_f(_jit,base,index,fd,MIPS_LWXC1)\n#define _MADD(rs,rt)\t\tmipshrr__t(_jit,MIPS_SPECIAL2,rs,rt,MIPS_MADD)\n#define _MADD_S(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_MADD_fmt_S)\n#define _MADD_D(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_MADD_fmt_D)\n#define _MADD_PS(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_MADD_fmt_PS)\n#define _MADDU(rs,rt)\t\tmipshrr__t(_jit,MIPS_SPECIAL2,rs,rt,MIPS_MADDU)\n#define _MFC0(rt,rd)\t\tmips_hxrr_(_jit,MIPS_COP0,MIPS_MF,rt,rd)\n#define _MFC1(rt,fs)\t\tmips_hxrf_(_jit,MIPS_COP1,MIPS_MF,rt,fs)\n#define _MFC2(rt,impl)\t\tmips_hxrs(_jit,MIPS_COP2,MIPS_MF,rt,impl)\n#define _MFHC1(rt,fs)\t\tmips_hxrf_(_jit,MIPS_COP1,MIPS_MFH,rt,fs)\n#define _MFHC2(rt,impl)\t\tmips_hxrs(_jit,MIPS_COP2,MIPS_MFH,rt,impl)\n#define _MFHI(rd)\t\tmips___r_t(_jit, rd, MIPS_MFHI)\n#define _MFLO(rd)\t\tmips___r_t(_jit, rd, MIPS_MFLO)\n#define _MOV_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_MOV_fmt)\n#define _MOV_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_MOV_fmt)\n#define _MOV_PS(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_PS,fs,fd,MIPS_MOV_fmt)\n#define _MOVF(rd,rs)\t\tmips_rirt(_jit,rs,0,rd,MIPS_MOVFT)\n#define _MOVF_S(fd,fs)\t\tmips_fp1x(_jit,MIPS_fmt_S,0,fs,fd,MIPS_MOVFT)\n#define _MOVF_D(fd,fs)\t\tmips_fp1x(_jit,MIPS_fmt_D,0,fs,fd,MIPS_MOVFT)\n#define _MOVF_PS(fd,fs)\t\tmips_fp1x(_jit,MIPS_fmt_PS,0,fs,fd,MIPS_MOVFT)\n#define _MOVN(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_MOVN)\n#define _MOVN_S(fd,fs,rt)\tmips_mov_fnt(_jit,MIPS_fmt_S,rt,fs,fd,MIPS_MOVN)\n#define _MOVN_D(fd,fs,rt)\tmips_mov_fnt(_jit,MIPS_fmt_D,rt,fs,fd,MIPS_MOVN)\n#define _MOVN_PS(fd,fs,rt)\tmips_mov_fnt(_jit,MIPS_fmt_PS,rt,fs,fd,MIPS_MOVN)\n#define _MOVT(rd,rs)\t\tmips_rirt(_jit,rs,1,rd,MIPS_MOVFT)\n#define _MOVT_S(fd,fs)\t\tmips_fp1x(_jit,MIPS_fmt_S,1,fs,fd,MIPS_MOVFT)\n#define _MOVT_D(fd,fs)\t\tmips_fp1x(_jit,MIPS_fmt_D,1,fs,fd,MIPS_MOVFT)\n#define _MOVT_PS(fd,fs)\t\tmips_fp1x(_jit,MIPS_fmt_PS,1,fs,fd,MIPS_MOVFT)\n#define _MOVZ(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_MOVZ)\n#define _MOVZ_S(fd,fs,rt)\tmips_mov_fnt(_jit,MIPS_fmt_S,rt,fs,fd,MIPS_MOVZ)\n#define _MOVZ_D(fd,fs,rt)\tmips_mov_fnt(_jit,MIPS_fmt_D,rt,fs,fd,MIPS_MOVZ)\n#define _MOVZ_PS(fd,fs,rt)\tmips_mov_fnt(_jit,MIPS_fmt_PS,rt,fs,fd,MIPS_MOVZ)\n#define _MSUB(rs,rt)\t\tmipshrr__t(_jit,MIPS_SPECIAL2,rs,rt,MIPS_MSUB)\n#define _MSUB_S(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_MSUB_fmt_S)\n#define _MSUB_D(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_MSUB_fmt_D)\n#define _MSUB_PS(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_MSUB_fmt_PS)\n#define _MSUBU(rs,rt)\t\tmipshrr__t(_jit,MIPS_SPECIAL2,rs,rt,MIPS_MSUBU)\n#define _MTC0(rt,rd)\t\tmips_hxrr_(_jit,MIPS_COP0,MIPS_MT,rt,rd)\n#define _MTC1(rt,fs)\t\tmips_hxrf_(_jit,MIPS_COP1,MIPS_MT,rt,fs)\n#define _MTC2(rt,impl)\t\tmips_hxrs(_jit,MIPS_COP2,MIPS_MT,rt,impl)\n#define _MTHC1(rt,fs)\t\tmips_hxrf_(_jit,MIPS_COP1,MIPS_MTH,rt,fs)\n#define _MTCH2(rt,impl)\t\tmips_hxrs(_jit,MIPS_COP2,MIPS_MTH,rt,impl)\n#define _MTHI(rs)\t\tmips_r___t(_jit, rd, MIPS_MTHI)\n#define _MTLO(rs)\t\tmips_r___t(_jit, rd, MIPS_MTLO)\n#define _MUL(rd,rs,rt)\t\tmipshrrr_t(_jit,MIPS_SPECIAL2,rs,rt,rd,MIPS_MUL)\n#define _MUL_S(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_S,ft,fs,fd,MIPS_MUL_fmt)\n#define _MUL_D(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_D,ft,fs,fd,MIPS_MUL_fmt)\n#define _MUL_PS(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_PS,ft,fs,fd,MIPS_MUL_fmt)\n#define _MULT(rs,rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_MULT)\n#define _MULTU(rs,rt)\t\tmips_rrr_t(_jit,rs,rt,JIT_RZERO,MIPS_MULTU)\n#define _NEG_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_NEG_fmt)\n#define _NEG_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_NEG_fmt)\n#define _NEG_PS(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_PS,fs,fd,MIPS_NEG_fmt)\n#define _NMADD_S(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_NMADD_fmt_S)\n#define _NMADD_D(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_NMADD_fmt_D)\n#define _NMADD_PS(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_NMADD_fmt_PS)\n#define _NMSUB_S(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_NMSUB_fmt_S)\n#define _NMSUB_D(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_NMSUB_fmt_D)\n#define _NMSUB_PS(fd,fr,fs,ft)\tmips_fp2x(_jit,fr,ft,fs,fd,MIPS_NMSUB_fmt_PS)\n#define _NOP()\t\t\t_jit_I(0)\n#define _NOR(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_NOR)\n#define _OR(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_OR)\n#define _ORI(rt,rs,im)\t\tmipshrri(_jit,MIPS_ORI,rs,rt,im)\n#define _PAUSE()\t\t_jit_I(0x140)\n#define _PLL_PS(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_PS,ft,fs,fd,MIPS_PLL)\n#define _PLU_PS(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_PS,ft,fs,fd,MIPS_PLU)\n#define _PREF(hint,offset,base)\tmips_hrii(_jit,MIPS_PREF,base,offset)\n#define _PREFX(hint,index,base)\tmips_hrri_t(_jit,MIPS_COP1X,base,index,hint,MIPS_PREFX)\n#define _PUL_PS(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_PS,ft,fs,fd,MIPS_PUL)\n#define _PUU_PS(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_PS,ft,fs,fd,MIPS_PUU)\n/* _RDHWR(...) privileged mode */\n/* _RDPGPR(...) privileged mode */\n#define _RECIP_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_RECIP)\n#define _RECIP_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_RECIP)\n#define _RECIP_PS(fd,fs)\tmips_fp1(_jit,MIPS_fmt_PS,fs,fd,MIPS_RECIP)\n#define _ROTR(rd,rt,sa)\t\tmips_hirrit(_jit,MIPS_SPECIAL,1,rt,rd,sa,MIPS_SRL)\n#define _ROTRV(rd,rt,rs)\tmips_hrrrit(_jit,MIPS_SPECIAL,rs,rt,rd,1,MIPS_SRLV)\n#define _ROUND_L_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_ROUND_fmt_L)\n#define _ROUND_L_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_ROUND_fmt_L)\n#define _ROUND_W_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_ROUND_fmt_W)\n#define _ROUND_W_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_ROUND_fmt_W)\n#define _RSQRT_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_RSQRT_fmt)\n#define _RSQRT_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_RSQRT_fmt)\n#define _SB(rt,offset,base)\tmipshrri(_jit,MIPS_SB,base,rt,offset)\n#define _SC(rt,offset,base)\tmipshrri(_jit,MIPS_SC,base,rt,offset)\n#define _SCD(rt,offset,base)\tmipshrri(_jit,MIPS_SCD,base,rt,offset)\n#define _SD(rt,offset,base)\tmipshrri(_jit,MIPS_SD,base,rt,offset)\n#define _SDBPP(code)\t\tmips_sbbpp(_jit,code)\n__jit_inline void\nmips_sdbpp(jit_state_t _jit, int ii)\n{\n    mips_code_t\t\tc;\n    c.tc.b = MIPS_SDBPP;\n    c.br.b = _u20(ii);\n    c.hc.b = MIPS_SPECIAL2;\n    _jit_I(c.op);\n}\n#define _SDC1(ft,offset,base)\tmipshrfi(_jit,MIPS_SDC1,base,ft,offset)\n#define _SDC2(ft,offset,base)\tmipshrfi(_jit,MIPS_SDC2,base,ft,offset)\n#define _SDL(rt,offset,base)\tmipshrri(_jit,MIPS_SDL,base,rt,offset)\n#define _SDR(rt,offset,base)\tmipshrri(_jit,MIPS_SDR,base,rt,offset)\n#define _SDXC1(fd,index,base)\tmips_rr_f(_jit,base,index,fd,MIPS_SDXC1)\n#define _SEB(rd,rt)\t\tmips_hrrrit(_jit,MIPS_SPECIAL3,_ZERO,rt,rd,MIPS_SEB,MIPS_BSHFL)\n#define _SEH(rd,rt)\t\tmips_hrrrit(_jit,MIPS_SPECIAL3,_ZERO,rt,rd,MIPS_SEH,MIPS_BSHFL)\n#define _SH(rt,offset,base)\tmipshrri(_jit,MIPS_SH,base,rt,offset)\n#define _SLL(rd,rt,sa)\t\tmips__rrit(_jit,rt,rd,sa,MIPS_SLL)\n#define _SLLV(rd,rt,rs)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_SLLV)\n#define _SLT(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_SLT)\n#define _SLTI(rt,rs,im)\t\tmipshrri(_jit,MIPS_SLTI,rs,rt,im)\n#define _SLTU(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_SLTU)\n#define _SLTIU(rt,rs,im)\tmipshrri(_jit,MIPS_SLTIU,rs,rt,im)\n#define _SQRT_S(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_SQRT_fmt)\n#define _SQRT_D(fd,fs)\t\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_SQRT_fmt)\n#define _SRA(rd,rt,sa)\t\tmips__rrit(_jit,rt,rd,sa,MIPS_SRA)\n#define _SRAV(rd,rt,rs)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_SRAV)\n#define _SRL(rd,rt,sa)\t\tmips__rrit(_jit,rt,rd,sa,MIPS_SRL)\n#define _SRLV(rd,rt,rs)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_SRLV)\n#define _SSNOP()\t\t_jit_I(1 << 6)\n#define _SUB(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_SUB)\n#define _SUB_S(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_S,ft,fs,fd,MIPS_SUB_fmt)\n#define _SUB_D(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_D,ft,fs,fd,MIPS_SUB_fmt)\n#define _SUB_PS(fd,fs,ft)\tmips_fp2(_jit,MIPS_fmt_PS,ft,fs,fd,MIPS_SUB_fmt)\n#define _SUBU(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_SUBU)\n#define _SUXC1(fd,index,base)\tmips_rr_f(_jit,base,index,fd,MIPS_SUXC1)\n#define _SW(rt,offset,base)\tmipshrri(_jit,MIPS_SW,base,rt,offset)\n#define _SWC1(ft,offset,base)\tmipshrfi(_jit,MIPS_SWC1,base,ft,offset)\n#define _SWC2(ft,offset,base)\tmipshrfi(_jit,MIPS_SWC2,base,ft,offset)\n#define _SWL(rt,offset,base)\tmipshrri(_jit,MIPS_SWL,base,rt,offset)\n#define _SWR(rt,offset,base)\tmipshrri(_jit,MIPS_SWR,base,rt,offset)\n#define _SWXC1(fd,index,base)\tmips_rr_f(_jit,base,index,fd,MIPS_SWXC1)\n#define _SYNC(stype)\t\tmips_sync(stype)\n__jit_inline void\nmips_sync(jit_state_t _jit, int stype)\n{\n    mips_code_t\t\tc;\n    c.op = 0;\n    c.tc.b = MIPS_SYNC;\n    c.ic.b = _u5(stype);\n    _jit_I(c.op);    \n}\n#define _SYNCI(offset,base)\tmipshrxs(_jit,MIPS_REGIMM,base,offset,MIPS_SYNCI)\n#define _SYSCALL(code)\t\tmips_syscall(_jit,code)\n__jit_inline void\nmips_syscall(jit_state_t _jit, int ii)\n{\n    mips_code_t\t\tc;\n    c.tc.b = MIPS_SYSCALL;\n    c.br.b = _u20(ii);\n    c.hc.b = MIPS_SPECIAL;\n    _jit_I(c.op);\n}\n#define _TEQ(rs,rt)\t\tmips_trap_cond(_jit,rs,rt,MIPS_TEQ)\n#define _TEQI(rs,imm)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_TEQI,im)\n#define _TGE(rs,rt)\t\tmips_trap_cond(_jit,rs,rt,MIPS_TGE)\n#define _TGEI(rs,imm)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_TGEI,im)\n#define _TGEIU(rs,imm)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_TGEIU,im)\n#define _TGEU(rs,rt)\t\tmips_trap_cond(_jit,rs,rt,MIPS_TGEU)\n#define _TLBP()\t\t\tmips_tlb(_jit,MIPS_TLBP)\n#define _TLBR()\t\t\tmips_tlb(_jit,MIPS_TLBR)\n#define _TLBWI()\t\tmips_tlb(_jit,MIPS_TLBWI)\n#define _TLBWR()\t\tmips_tlb(_jit,MIPS_TLBWR)\n#define _TLT(rs,rt)\t\tmips_trap_cond(_jit,rs,rt,MIPS_TLT)\n#define _TLTI(rs,imm)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_TLTI,im)\n#define _TLTIU(rs,imm)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_TLTIU,im)\n#define _TLTU(rs,rt)\t\tmips_trap_cond(_jit,rs,rt,MIPS_TLTU)\n#define _TNE(rs,rt)\t\tmips_trap_cond(_jit,rs,rt,MIPS_TNE)\n#define _TNEI(rs,imm)\t\tmips_hrxs(_jit,MIPS_REGIMM,rs,MIPS_TNEI,im)\n#define _TRUNC_L_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_TRUNC_fmt_L)\n#define _TRUNC_L_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_TRUNC_fmt_L)\n#define _TRUNC_W_S(fd,fs)\tmips_fp1(_jit,MIPS_fmt_S,fs,fd,MIPS_TRUNC_fmt_W)\n#define _TRUNC_W_D(fd,fs)\tmips_fp1(_jit,MIPS_fmt_D,fs,fd,MIPS_TRUNC_fmt_W)\n#define _WAIT()\t\t\t_jit_I(1<<25)\n#define _WRPGPR(rd,rt)\t\tmips_hxrr_(_jit, MIPS_COP0,MIPS_WRPGPR,rt,rd)\n#define _WSBH(rd,rt)\t\tmips_hirrit(_jit,MIPS_SPECIAL3,0,rt,rd,MIPS_WSBH,MIPS_BSHFL)\n#define _XOR(rd,rs,rt)\t\tmips_rrr_t(_jit,rs,rt,rd,MIPS_XOR)\n#define _XORI(rt,rs,im)\t\tmipshrri(_jit,MIPS_XORI,rs,rt,im)\n\n/* Reference:\n *\thttp://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html\n *\tMIPS32(r) Architecture Volume II: The MIPS32(r) Instrunction Set\n *\tMIPS64(r) Architecture Volume II: The MIPS64(r) Instrunction Set\n */\n\n#endif /* __lightning_asm_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/core-32.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (mips version)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_core_h\n#define __lightning_core_h\n\n#define JIT_FRAMESIZE\t\t\t56\n\n#define jit_ldi_ui(r0, i0)\t\tjit_ldi_i(r0, i0)\n#define jit_ldi_l(r0, i0)\t\tjit_ldi_i(r0, i0)\n#define jit_ldr_ui(r0, r1)\t\tjit_ldr_i(r0, r1)\n#define jit_ldr_l(r0, r1)\t\tjit_ldr_i(r0, r1)\n#define jit_sti_l(r0, i0)\t\tjit_sti_i(r0, i0)\n#define jit_str_l(r0, r1)\t\tjit_str_i(r0, r1)\n#define jit_arg_ui()\t\t\tmips_arg_i(_jit)\n#define jit_arg_l()\t\t\tmips_arg_i(_jit)\n#define jit_arg_ul()\t\t\tmips_arg_i(_jit)\n#define jit_arg_p()\t\t\tmips_arg_i(_jit)\n#define jit_getarg_ui(r0, ofs)\t\tjit_getarg_i(r0, ofs)\n#define jit_getarg_l(r0, ofs)\t\tjit_getarg_i(r0, ofs)\n#define jit_getarg_ul(r0, ofs)\t\tjit_getarg_i(r0, ofs)\n#define jit_getarg_p(r0, ofs)\t\tjit_getarg_i(r0, ofs)\n\n#define jit_movi_p(r0, i0)\t\tmips_movi_p(_jit, r0, i0)\n__jit_inline jit_insn *\nmips_movi_p(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    jit_insn\t*l;\n    unsigned\tim = (unsigned)i0;\n\n    l = _jit->x.pc;\n    _LUI(r0, im >> 16);\n    _ORI(r0, r0, _jit_US(im));\n    return (l);\n}\n\n#define jit_patch_movi(i0, i1)\t\tmips_patch_movi(_jit, i0, i1)\n__jit_inline void\nmips_patch_movi(jit_state_t _jit, jit_insn *i0, void *i1)\n{\n    mips_code_t\t\tc;\n    union {\n\tchar\t\t*c;\n\tint\t\t*i;\n\tshort\t\t*s;\n\tvoid\t\t*v;\n    } u;\n    unsigned\t im = (unsigned)i1;\n\n    u.v = i0;\n\n    c.op = u.i[0];\n    assert(c.hc.b == MIPS_LUI);\n    c.is.b = im >> 16;\n    u.i[0] = c.op;\n\n    c.op = u.i[1];\n    assert(c.hc.b == MIPS_ORI);\n    c.is.b = _jit_US(im);\n    u.i[1] = c.op;\n}\n\n#define jit_patch_at(jump, label)\tmips_patch_at(_jit, jump, label)\n__jit_inline void\nmips_patch_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    mips_code_t\t\tc;\n    long\t\td;\n    union {\n\tchar\t\t*c;\n\tint\t\t*i;\n\tshort\t\t*s;\n\tvoid\t\t*v;\n    } u;\n\n    u.v = jump;\n    c.op = u.i[0];\n    switch (c.hc.b) {\n\t/* 16 bit immediate opcodes */\n\tcase MIPS_REGIMM:\n\t    switch (c.rt.b) {\n\t\tcase MIPS_BLTZ:\t\tcase MIPS_BLTZL:\n\t\tcase MIPS_BLTZAL:\tcase MIPS_BLTZALL:\n\t\tcase MIPS_BGEZ:\t\tcase MIPS_BGEZAL:\n\t\tcase MIPS_BGEZALL:\tcase MIPS_BGEZL:\n\t\tcase MIPS_TEQI:\t\tcase MIPS_TGEI:\n\t\tcase MIPS_TGEIU:\tcase MIPS_TLTI:\n\t\tcase MIPS_TLTIU:\tcase MIPS_TNEI:\n\t\t    d = (((long)label - (long)jump) >> 2) - 1;\n\t\t    c.is.b = _s16(d);\n\t\t    u.i[0] = c.op;\n\t\t    break;\n\t\tdefault:\n\t\t    assert(!\"unhandled branch opcode\");\n\t\t    break;\n\t    }\n\t    break;\n\n\tcase MIPS_COP1:\t\t\tcase MIPS_COP2:\n\t    assert(c.rs.b == MIPS_BC);\n\t    switch (c.rt.b) {\n\t\tcase MIPS_BCF:\t\tcase MIPS_BCFL:\n\t\tcase MIPS_BCT:\t\tcase MIPS_BCTL:\n\t\t    d = (((long)label - (long)jump) >> 2) - 1;\n\t\t    c.is.b = _s16(d);\n\t\t    u.i[0] = c.op;\n\t\t    break;\n\t\tdefault:\n\t\t    assert(!\"unhandled branch opcode\");\n\t\t    break;\n\t    }\n\t    break;\n\n\tcase MIPS_BLEZ:\t\t\tcase MIPS_BLEZL:\n\tcase MIPS_BEQ:\t\t\tcase MIPS_BEQL:\n\tcase MIPS_BGTZ:\t\t\tcase MIPS_BGTZL:\n\tcase MIPS_BNE:\t\t\tcase MIPS_BNEL:\n\t    d = (((long)label - (long)jump) >> 2) - 1;\n\t    c.is.b = _s16(d);\n\t    u.i[0] = c.op;\n\t    break;\n\n\tcase MIPS_LUI:\n\t    /* move and jump to register or wrong, but works,\n\t     * call to jit_patch instead of jit_patch_movi */\n\t    mips_patch_movi(_jit, jump, label);\n\t    break;\n\n\tcase MIPS_J:\t\t\tcase MIPS_JAL:\n\tcase MIPS_JALX:\n\t    d = (long)label;\n\t    assert((((long)jump + sizeof(int)) & 0xf0000000) ==\n\t\t   (d & 0xf0000000));\n\t    c.ii.b = (d & ~0xf0000000) >> 2;\n\t    u.i[0] = c.op;\n\t    break;\n\n\tdefault:\n\t    assert(!\"unhandled branch opcode\");\n\t    break;\n    }\n}\n\n#define jit_jmpi(i0)\t\t\tmips_jmpi(_jit, i0)\n__jit_inline jit_insn *\nmips_jmpi(jit_state_t _jit, void *i0)\n{\n    jit_insn\t*l;\n    long\t pc = (long)_jit->x.pc + sizeof(int);\n    long\t lb = (long)i0;\n    l = _jit->x.pc;\n    if ((pc & 0xf0000000) == (lb & 0xf0000000)) {\n\t_J((lb & ~0xf0000000) >> 2);\n\tjit_nop(1);\n    }\n    else {\n\tjit_movi_p(JIT_RTEMP, i0);\n\tjit_jmpr(JIT_RTEMP);\n    }\n    return (l);\n}\n\n#define jit_prolog(n)\t\t\tmips_prolog(_jit, n)\n__jit_inline void\nmips_prolog(jit_state_t _jit, int n)\n{\n    _jitl.framesize = JIT_FRAMESIZE;\n    _jitl.nextarg_int = 0;\n#ifdef JIT_NEED_PUSH_POP\n    _jitl.pop = 0;\n#endif\n\n    jit_subi_i(JIT_SP, JIT_SP, JIT_FRAMESIZE);\n    jit_stxi_i(52, JIT_SP, _RA);\n    jit_stxi_i(48, JIT_SP, _FP);\n    jit_stxi_i(44, JIT_SP, _S7);\n    jit_stxi_i(40, JIT_SP, _S6);\n    jit_stxi_i(36, JIT_SP, _S5);\n    jit_stxi_i(32, JIT_SP, _S4);\n    jit_stxi_i(28, JIT_SP, _S3);\n    jit_stxi_i(24, JIT_SP, _S2);\n    jit_stxi_i(20, JIT_SP, _S1);\n    jit_stxi_i(16, JIT_SP, _S0);\n    _SDC1(_F30, 8, JIT_SP);\n    _SDC1(_F28, 0, JIT_SP);\n    jit_movr_i(JIT_FP, JIT_SP);\n\n    /* patch alloca and stack adjustment */\n    _jitl.stack = (int *)_jit->x.pc;\n    jit_movi_p(JIT_RTEMP, 0);\n    jit_subr_i(JIT_SP, JIT_SP, JIT_RTEMP);\n    _jitl.alloca_offset = _jitl.stack_offset = _jitl.stack_length = 0;\n}\n\n#define jit_prepare_i(count)\t\tmips_prepare_i(_jit, count)\n__jit_inline void\nmips_prepare_i(jit_state_t _jit, int count)\n{\n    assert(count\t\t>= 0 &&\n\t   _jitl.stack_offset\t== 0 &&\n\t   _jitl.nextarg_put\t== 0);\n    _jitl.stack_offset = count << 2;\n    if (_jitl.stack_length < _jitl.stack_offset) {\n\t_jitl.stack_length = _jitl.stack_offset;\n\tmips_set_stack(_jit, (_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 7) & ~7);\n    }\n}\n\n#define jit_pusharg_i(r0)\t\tmips_pusharg_i(_jit, r0)\n__jit_inline void\nmips_pusharg_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n\n    assert(ofs < 256);\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] &= ~(1 << (ofs & 31));\n    _jitl.stack_offset -= sizeof(int);\n    jit_stxi_i(_jitl.stack_offset, JIT_SP, r0);\n}\n\n#define jit_arg_i()\t\t\tmips_arg_i(_jit)\n#define jit_arg_c()\t\t\tmips_arg_i(_jit)\n#define jit_arg_uc()\t\t\tmips_arg_i(_jit)\n#define jit_arg_s()\t\t\tmips_arg_i(_jit)\n#define jit_arg_us()\t\t\tmips_arg_i(_jit)\n#define jit_arg_ui()\t\t\tmips_arg_i(_jit)\n__jit_inline int\nmips_arg_i(jit_state_t _jit)\n{\n    int\t\tofs;\n    int\t\treg;\n\n    reg = (_jitl.framesize - JIT_FRAMESIZE) >> 2;\n    if (reg < JIT_A_NUM) {\n\tofs = reg;\n\t_jitl.nextarg_int = 1;\n    }\n    else\n\tofs = _jitl.framesize;\n    _jitl.framesize += sizeof(int);\n\n    return (ofs);\n}\n\n#define jit_calli(i0)\t\t\tmips_calli(_jit, i0)\n__jit_inline jit_insn *\nmips_calli(jit_state_t _jit, void *i0)\n{\n    jit_insn\t*l;\n#if 0\n    /* FIXME still usable to call jit functions that are not really\n     * position independent code */\n    long\tpc = (long)_jit->x.pc;\n    long\tlb = (long)i0;\n\n    l = _jit->x.pc;\n    /* FIXME return an address that can be patched so, should always\n     * call register to not be limited to same 256Mb segment */\n    if ((pc & 0xf0000000) == (lb & 0xf0000000))\n\t_JAL(((long)i0 & ~0xf0000000) >> 2);\n    else {\n\tjit_movi_p(JIT_RTEMP, lb);\n\t_JALR(JIT_RTEMP);\n    }\n    jit_nop(1);\n#else\n    /* if calling a pic function, _T9 *must* hold the function pointer */\n\n    l = _jit->x.pc;\n    jit_movi_p(_T9, i0);\n    _JALR(_T9);\n    jit_nop(1);\n#endif\n\n    return (l);\n}\n\n#define jit_patch_calli(call, label)\tmips_patch_calli(_jit, call, label)\n__jit_inline void\nmips_patch_calli(jit_state_t _jit, jit_insn *call, jit_insn *label)\n{\n    jit_patch_at(call, label);\n}\n\n__jit_inline void\nmips_patch_arguments(jit_state_t _jit)\n{\n    mips_code_t\t c;\n    jit_fpr_t\t fs;\n    jit_insn\t*pc;\n    int\t\t reg;\n    int\t\t size;\n    int\t\t index;\n    int\t\t offset;\n    int\t\t nextarg_int;\n\n    /* save pc because will rewrite intructions */\n    pc = _jit->x.pc;\n\n    nextarg_int = 0;\n    for (index = _jitl.nextarg_put - 1, offset = 0; index >= 0; index--) {\n\tif (_jitl.types[index >> 5] & (1 << (index & 31))) {\n\t    if (offset & 7) {\n\t\tnextarg_int = 1;\n\t\toffset += sizeof(int);\n\t    }\n\t    size = sizeof(double);\n\t}\n\telse\n\t    size = sizeof(int);\n\n\tc.op = _jitl.arguments[index][0];\n\tif (offset < 16) {\n\t    reg = offset >> 2;\n\t    _jit->x.pc = (jit_insn *)_jitl.arguments[index];\n\t    switch (c.hc.b) {\n\t\tcase MIPS_SW:\n\t\t    nextarg_int = 1;\n\t\t    assert(size == 4);\n\t\t    _OR(jit_a_order[reg].g, (jit_gpr_t)c.rt.b, JIT_RZERO);\n\t\t    break;\n\t\tcase MIPS_SWC1:\n\t\t    fs = (jit_fpr_t)c.ft.b;\n\t\t    if (!nextarg_int) {\n\t\t\tif (reg == 0)\n\t\t\t    reg = JIT_A_NUM;\n\t\t\telse {\n\t\t\t    reg = JIT_A_NUM + 2;\n\t\t\t    nextarg_int = 1;\n\t\t\t}\n\t\t    }\n\t\t    if (reg < JIT_A_NUM)\n\t\t\t_MFC1(jit_a_order[reg].g, fs);\n\t\t    else\n\t\t\t_MOV_S(jit_a_order[reg].f, fs);\n\t\t    if (size == 8) {\n\t\t\t++reg;\n\t\t\tfs = (jit_fpr_t)(fs + 1);\n\t\t\tif (reg < JIT_A_NUM)\n\t\t\t    _MFC1(jit_a_order[reg].g, fs);\n\t\t\telse\n\t\t\t    _MOV_S(jit_a_order[reg].f, fs);\n\t\t    }\n\t\t    break;\n\t\tdefault:\n\t\t    assert(!\"unhandled argument opcode\");\n\t    }\n\t}\n\telse {\n\t    switch (c.hc.b) {\n\t\tcase MIPS_SW:\n\t\t    assert(size == 4);\n\t\t    c.is.b = offset;\n\t\t    _jitl.arguments[index][0] = c.op;\n\t\t    break;\n\t\tcase MIPS_SWC1:\n\t\t    c.is.b = offset;\n\t\t    _jitl.arguments[index][0] = c.op;\n\t\t    if (size == 8) {\n\t\t\tc.op = _jitl.arguments[index][1];\n\t\t\tc.is.b = offset + 4;\n\t\t\t_jitl.arguments[index][1] = c.op;\n\t\t    }\n\t\t    break;\n\t\tdefault:\n\t\t    assert(!\"unhandled argument opcode\");\n\t    }\n\t}\n\toffset += size;\n    }\n    if (offset < 16)\n\toffset = 16;\n    if (_jitl.stack_length < offset) {\n\t_jitl.stack_length = offset;\n\tmips_set_stack(_jit, (_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 7) & ~7);\n    }\n\n    _jit->x.pc = pc;\n}\n\n#define jit_finishr(rs)\t\t\tmips_finishr(_jit, rs)\n__jit_inline void\nmips_finishr(jit_state_t _jit, jit_gpr_t r0)\n{\n    assert(_jitl.stack_offset == 0);\n    mips_patch_arguments(_jit);\n    _jitl.nextarg_put = 0;\n    jit_callr(r0);\n}\n\n#define jit_finish(i0)\t\t\tmips_finish(_jit, i0)\n__jit_inline jit_insn *\nmips_finish(jit_state_t _jit, void *i0)\n{\n    assert(_jitl.stack_offset == 0);\n    mips_patch_arguments(_jit);\n    _jitl.nextarg_put = 0;\n    return (jit_calli(i0));\n}\n\n#define jit_retval_i(r0)\t\tmips_retval_i(_jit, r0)\n__jit_inline void\nmips_retval_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    jit_movr_i(r0, JIT_RET);\n}\n\n#define jit_ret()\t\t\tmips_ret(_jit)\n__jit_inline void\nmips_ret(jit_state_t jit)\n{\n    jit_movr_i(JIT_SP, JIT_FP);\n    _LDC1(_F28, 0, JIT_SP);\n    _LDC1(_F30, 8, JIT_SP);\n    jit_ldxi_i(_S0, JIT_SP, 16);\n    jit_ldxi_i(_S1, JIT_SP, 20);\n    jit_ldxi_i(_S2, JIT_SP, 24);\n    jit_ldxi_i(_S3, JIT_SP, 28);\n    jit_ldxi_i(_S4, JIT_SP, 32);\n    jit_ldxi_i(_S5, JIT_SP, 36);\n    jit_ldxi_i(_S6, JIT_SP, 40);\n    jit_ldxi_i(_S7, JIT_SP, 44);\n    jit_ldxi_i(_FP, JIT_SP, 48);\n    jit_ldxi_i(_RA, JIT_SP, 52);\n    _JR(_RA);\n    /* restore sp in delay slot */\n    jit_addi_i(JIT_SP, JIT_SP, JIT_FRAMESIZE);\n}\n\n#endif /* __lightning_core_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/core-64.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (mips64 version)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_core_h\n#define __lightning_core_h\n\n#define JIT_FRAMESIZE\t\t\t96\n\n#define jit_movr_l(r0, r1)\t\tmips_movr_i(_jit, r0, r1)\n\n#define jit_movi_l(r0, i0)\t\tmips_movi_l(_jit, r0, i0)\n__jit_inline void\nmips_movi_l(jit_state_t _jit, jit_gpr_t r0, long i0)\n{\n    unsigned long\tms;\n\n    ms = i0 & 0xffffffff00000000L;\n    /* LUI sign extends */\n    if ((ms == 0\t  && !(i0 & 0x80000000))  ||\n\t(ms == 0xffffffff &&  (i0 & 0x80000000)))\n\tjit_movi_i(r0, i0);\n    else {\n\tjit_movi_i(r0, ms >> 32);\n\tif ((ms = i0 & 0xffff0000)) {\n\t    _SLL(r0, r0, 16);\n\t    _ORI(r0, r0, ms >> 16);\n\t    _SLL(r0, r0, 16);\n\t}\n\telse\n\t    _SLL(r0, r0, 16);\n\tif ((ms = _jit_US(i0)))\n\t    _ORI(r0, r0, ms);\n    }\n}\n\n#define jit_movi_p(r0, i0)\t\tmips_movi_p(_jit, r0, i0)\n__jit_inline jit_insn *\nmips_movi_p(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    unsigned long\tms;\n\n    ms = i0 & 0xffff000000000000L;\n    _ORI(r0, r0, ms >> 48);\n    _SLL(r0, r0, 16);\n    ms = i0 & 0x0000ffff00000000L;\n    _ORI(r0, r0, ms >> 32);\n    _SLL(r0, r0, 16);\n    ms = i0 & 0x00000000ffff0000L;\n    _ORI(r0, r0, ms >> 16);\n    _SLL(r0, r0, 16);\n    ms = i0 & 0x000000000000ffffL;\n    _ORI(r0, r0, ms);\n    return (_jit->x.pc);\n}\n\n#define jit_negr_l(r0, r1)\t\tmips_negr_l(_jit, r0, r1)\n__jit_inline void\nmips_negr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _DSUBU(r0, JIT_RZERO, r1);\n}\n\n#define jit_addr_l(r0, r1, r2)\t\tmips_addr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_addr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DADDU(r0, r1, r2);\n}\n\n#define jit_addi_l(r0, r1, i0)\t\tmips_addi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_addi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_DADDIU(r0, r1, _jit_US(i0));\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_addr_l(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_subr_l(r0, r1, r2)\t\tmips_subr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_subr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DSUBU(r0, r1, r2);\n}\n\n#define jit_subi_l(r0, r1, i0)\t\tmips_subi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_subi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0) && _jit_US(i0) != 0x8000)\n\t_DADDIU(r0, r1, _jit_US(-i0));\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_subr_l(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_addci_ul(r0, r1, i0)\tmips_addci_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_addci_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (r0 == r1) {\n\tif (_s16P(i0))\n\t    _DADDIU(JIT_RTEMP, r1, _jit_US(i0));\n\telse {\n\t    jit_movi_l(JIT_RTEMP, i0);\n\t    jit_addr_l(JIT_RTEMP, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, JIT_RTEMP, r1);\n\tjit_movr_l(r0, JIT_RTEMP);\n    }\n    else {\n\tif (_s16P(i0))\n\t    _DADDIU(r0, r1, _jit_US(i0));\n\telse {\n\t    jit_movi_l(JIT_RTEMP, i0);\n\t    jit_addr_l(r0, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, r0, r1);\n    }\n}\n\n#define jit_addcr_ul(r0, r1, r2)\tmips_addcr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_addcr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1) {\n\t_DADDU(JIT_RTEMP, r1, r2);\n\t_SLTU(_T8, JIT_RTEMP, r1);\n\tjit_movr_l(r0, JIT_RTEMP);\n    }\n    else {\n\t_DADDU(r0, r1, r2);\n\t_SLTU(_T8, r0, r1);\n    }\n}\n\n#define jit_addxi_ul(r0, r1, i0)\tmips_addxi_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_addxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movr_l(_T9, _T8);\n    jit_addci_ul(r0, r1, i0);\n    jit_addcr_ul(r0, r0, _T9);\n}\n\n#define jit_addxr_ul(r0, r1, r2)\tmips_addxr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_addxr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_movr_l(_T9, _T8);\n    jit_addcr_ul(r0, r1, r2);\n    jit_addcr_ul(r0, r0, _T9);\n}\n\n#define jit_subci_ul(r0, r1, i0)\tmips_subci_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_subci_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (r0 == r1) {\n\tif (_s16P(i0) && _jit_US(i0) != 0x8000)\n\t    _DADDIU(JIT_RTEMP, r1, _jit_US(-i0));\n\telse {\n\t    jit_movi_l(JIT_RTEMP, i0);\n\t    jit_subr_l(JIT_RTEMP, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, r1, JIT_RTEMP);\n\tjit_movr_l(r0, JIT_RTEMP);\n    }\n    else {\n\tif (_s16P(i0) && _jit_US(i0) != 0x8000)\n\t    _DADDIU(r0, r1, _jit_US(-i0));\n\telse {\n\t    jit_movi_l(JIT_RTEMP, i0);\n\t    jit_subr_l(r0, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, r1, r0);\n    }\n}\n\n#define jit_subcr_ul(r0, r1, r2)\tmips_subcr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_subcr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1) {\n\t_DSUBU(JIT_RTEMP, r1, r2);\n\t_SLTU(_T8, r1, JIT_RTEMP);\n\tjit_movr_l(r0, JIT_RTEMP);\n    }\n    else {\n\t_DSUBU(r0, r1, r2);\n\t_SLTU(_T8, r1, r0);\n    }\n}\n\n#define jit_subxi_ul(r0, r1, i0)\tmips_subxi_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_subxi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movr_l(_T9, _T8);\n    jit_subci_ul(r0, r1, i0);\n    jit_subcr_ul(r0, r0, _T9);\n}\n\n#define jit_subxr_ul(r0, r1, r2)\tmips_subxr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_subxr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_movr_l(_T9, _T8);\n    jit_subcr_ul(r0, r1, r2);\n    jit_subcr_ul(r0, r0, _T9);\n}\n\n#define jit_mulr_l(r0, r1, r2)\t\tmips_mulr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_mulr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DMULTU(r1, r2);\n    _MFLO(r0);\n}\n\n#define jit_muli_l(r0, r1, i0)\t\tmips_muli_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_muli_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_mulr_l(r0, r1, JIT_RTEMP);\n}\n\n#define jit_hmulr_l(r0, r1, r2)\t\tmips_hmulr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_hmulr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DMULT(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_hmuli_l(r0, r1, i0)\t\tmips_hmuli_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_hmuli_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_hmulr_l(r0, r1, JIT_RTEMP);\n}\n\n#define jit_hmulr_ul(r0, r1, r2)\tmips_hmulr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_hmulr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DMULTU(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_hmuli_ul(r0, r1, i0)\tmips_hmuli_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_hmuli_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_hmulr_ul(r0, r1, JIT_RTEMP);\n}\n\n#define jit_divr_l(r0, r1, r2)\t\tmips_divr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_divr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DDDIV(r1, r2);\n    _MFLO(r0);\n}\n\n#define jit_divi_l(r0, r1, i0)\t\tmips_divi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_divi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_divr_l(r0, r1, JIT_RTEMP);\n}\n\n#define jit_divr_ul(r0, r1, r2)\t\tmips_divr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_divr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DDDIVU(r1, r2);\n    _MFLO(r0);\n}\n\n#define jit_divi_ul(r0, r1, i0)\t\tmips_divi_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_divi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_divr_ul(r0, r1, JIT_RTEMP);\n}\n\n#define jit_modr_l(r0, r1, r2)\t\tmips_modr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_modr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DDDIV(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_modi_l(r0, r1, i0)\t\tmips_modi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_modi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_modr_l(r0, r1, JIT_RTEMP);\n}\n\n#define jit_modr_ul(r0, r1, r2)\t\tmips_modr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_modr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DDDIVU(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_modi_ul(r0, r1, i0)\t\tmips_modi_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_modi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_modr_ul(r0, r1, JIT_RTEMP);\n}\n\n#define jit_andr_l(r0, r1, r2)\t\tjit_andr_i(r0, r1, r2)\n#define jit_andi_l(r0, r1, i0)\t\tmips_andi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_andi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_u16P(i0))\n\t_ANDI(r0, r1, i0);\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_andr_l(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_orr_l(r0, r1, r2)\t\tjit_orr_i(r0, r1, r2)\n#define jit_ori_l(r0, r1, i0)\t\tmips_ori_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_ori_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_u16P(i0))\n\t_ORI(r0, r1, i0);\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_orr_l(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_xorr_l(r0, r1, r2)\t\tjit_xorr_i(r0, r1, r2)\n#define jit_xori_l(r0, r1, i0)\t\tmips_xori_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_xori_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_u16P(i0))\n\t_XORI(r0, r1, i0);\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_xorr_l(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_lshr_l(r0, r1, r2)\t\tmips_lshr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_lshr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DSLLV(r0, r1, r2);\n}\n\n#define jit_lshi_l(r0, r1, i0)\t\tmips_lshi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_lshi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    assert(i0 <= 63);\n    if (i0 < 32)\n\t_DSLL(r0, r1, i0);\n    else\n\t_DSLL32(r0, r1, i0);\n}\n\n#define jit_rshr_l(r0, r1, r2)\t\tmips_rshr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_rshr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DSRAV(r0, r1, r2);\n}\n\n#define jit_rshi_l(r0, r1, i0)\t\tmips_rshi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_rshi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    assert(i0 <= 63);\n    if (i0 < 32)\n\t_DSRA(r0, r1, i0);\n    else\n\t_DSRA32(r0, r1, i0);\n}\n\n#define jit_rshr_ul(r0, r1, r2)\t\tmips_rshr_ul(_jit, r0, r1, r2)\n__jit_inline void\nmips_rshr_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DSRLV(r0, r1, r2);\n}\n\n#define jit_rshi_ul(r0, r1, i0)\t\tmips_rshi_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_rshi_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    assert(i0 <= 63);\n    if (i0 < 32)\n\t_DSRL(r0, r1, i0);\n    else\n\t_DSRL32(r0, r1, i0);\n}\n\n#define jit_ltr_l(r0, r1, r2)\t\tmips_ltr_i(_jit, r0, r1, r2)\n#define jit_lti_l(r0, r1, i0)\t\tmips_lti_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_lti_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_SLTI(r0, r1, _jit_US(i0));\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_ltr_l(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_ltr_ul(r0, r1, r2)\t\tmips_ltr_ui(_jit, r0, r1, r2)\n#define jit_lti_ul(r0, r1, i0)\t\tmips_lti_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_lti_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (_s16P(i0))\n\t_SLTIU(r0, r1, _jit_US(i0));\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_ltr_ul(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_ler_l(r0, r1, r2)\t\tmips_ler_i(_jit, r0, r1, r2)\n#define jit_lei_l(r0, r1, i0)\t\tmips_lei_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_lei_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0 == 0) {\n\t_SLT(r0, JIT_RZERO, r1);\n\t_XORI(r0, r0, 1);\n    }\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_ler_l(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_ler_ul(r0, r1, r2)\t\tmips_ler_ui(_jit, r0, r1, r2)\n#define jit_lei_ul(r0, r1, i0)\t\tmips_lei_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_lei_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (i0 == 0) {\n\t_SLTU(r0, JIT_RZERO, r1);\n\t_XORI(r0, r0, 1);\n    }\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\tjit_ler_ul(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_eqr_l(r0, r1, r2)\t\tmips_eqr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_eqr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_subr_l(r0, r1, r2);\n    _SLTU(r0, JIT_RZERO, r0);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_eqi_l(r0, r1, i0)\t\tmips_eqi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_eqi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0) {\n\tjit_subi_l(r0, r1, i0);\n\t_SLTU(r0, JIT_RZERO, r0);\n    }\n    else\n\t_SLTU(r0, JIT_RZERO, r1);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_ger_l(r0, r1, r2)\t\tmips_ger_i(_jit, r0, r1, r2)\n#define jit_gei_l(r0, r1, i0)\t\tmips_gei_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_gei_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_ger_l(r0, r1, JIT_RTEMP);\n}\n\n#define jit_ger_ul(r0, r1, i0)\t\tmips_ger_ui(_jit, r0, r1, i0)\n#define jit_gei_ul(r0, r1, i0)\t\tmips_gei_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_gei_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    jit_movi_l(JIT_RTEMP, i0);\n    jit_ger_ul(r0, r1, JIT_RTEMP);\n}\n\n#define jit_gtr_l(r0, r1, r2)\t\tmips_gtr_i(_jit, r0, r1, r2)\n#define jit_gti_l(r0, r1, i0)\t\tmips_gti_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_gti_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0 == 0)\n\t_SLT(r0, JIT_RZERO, r1);\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\t_SLT(r0, JIT_RTEMP, r1);\n    }\n}\n\n#define jit_gtr_ul(r0, r1, r2)\t\tmips_gtr_ui(_jit, r0, r1, r2)\n#define jit_gti_ul(r0, r1, i0)\t\tmips_gti_ul(_jit, r0, r1, i0)\n__jit_inline void\nmips_gti_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned long i0)\n{\n    if (i0 == 0)\n\t_SLTU(r0, JIT_RZERO, r1);\n    else {\n\tjit_movi_l(JIT_RTEMP, i0);\n\t_SLTU(r0, JIT_RTEMP, r1);\n    }\n}\n\n#define jit_ner_l(r0, r1, r2)\t\tmips_ner_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_ner_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_subr_l(r0, r1, r2);\n    _SLTU(r0, JIT_RZERO, r0);\n}\n\n#define jit_nei_l(r0, r1, i0)\t\tmips_nei_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_nei_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (i0)\n\tjit_subi_l(r0, r1, i0);\n    _SLTU(r0, JIT_RZERO, r0);\n}\n\n#define jit_bltr_l(i0, r0, r1)\t\tmips_bltr_i(_jit, i0, r0, r1)\n#define jit_blti_l(i0, r0, i1)\t\tmips_blti_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blti_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (_s16P(i1))\n\treturn (jit_blti_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bltr_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bltr_ul(i0, r0, r1)\t\tmips_bltr_ui(_jit, i0, r0, r1)\n+#define jit_blti_ul(i0, r0, i1)\t\tmips_blti_ul(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blti_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned long i1)\n{\n    if (_s16P(i1))\n\treturn (jit_blti_ui(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bltr_ul(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bler_l(i0, r0, r1)\t\tmips_bler_i(_jit, i0, r0, r1)\n#define jit_blei_l(i0, r0, i1)\t\tmips_blei_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blei_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (_s16P(i1))\n\treturn (jit_blei_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bler_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bler_ul(i0, r0, r1)\t\tmips_bler_ui(_jit, i0, r0, r1)\n#define jit_blei_ul(i0, r0, i1)\t\tmips_blei_ul(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blei_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned long i1)\n{\n    if (i1 == 0)\n\treturn (jit_blei_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bler_ul(i0, r0, JIT_RTEMP));\n}\n\n#define jit_beqr_l(i0, r0, r1)\t\tmips_beqr_i(_jit, i0, r0, r1)\n#define jit_beqi_l(i0, r0, i1)\t\tmips_beqi_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_beqi_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (i1 == 0)\n\treturn (jit_beqi_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_beqr_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bger_l(i0, r0, r1)\t\tmips_bger_i(_jit, i0, r0, r1)\n#define jit_bgei_l(i0, r0, i1)\t\tmips_bgei_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgei_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (_s16P(i1))\n\treturn (jit_bgei_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bger_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bger_ul(i0, r0, r1)\t\tmips_bger_ui(_jit, i0, r0, r1)\n#define jit_bgei_ul(i0, r0, i1)\t\tmips_bgei_ul(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgei_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned long i1)\n{\n    if (_s16P(i1))\n\treturn (jit_bgei_ui(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bger_ul(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bgtr_l(i0, r0, r1)\t\tmips_bgtr_i(_jit, i0, r0, r1)\n#define jit_bgti_l(i0, r0, i1)\t\tmips_bgti_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgti_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (i1 == 0)\n\treturn (jit_bgti_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bgtr_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bgtr_ul(i0, r0, r1)\t\tmips_bgtr_ui(_jit, i0, r0, r1)\n#define jit_bgti_ul(i0, r0, i1)\t\tmips_bgti_ul(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgti_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned long i1)\n{\n    if (i1 == 0)\n\treturn (jit_bgti_ui(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bgtr_ul(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bner_l(i0, r0, r1)\t\tmips_bner_i(_jit, i0, r0, r1)\n#define jit_bnei_l(i0, r0, i1)\t\tmips_bnei_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bnei_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (i1 == 0)\n\treturn (jit_bnei_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bner_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_boaddr_l(i0, r0, r1)\tmips_boaddr_l(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_boaddr_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLT(_T8, r1, _ZERO);\n    _DADDU(_AT, r0, r1);\n    _SLT(_T9, _AT, r0);\n    _SLT(_AT, r0, _AT);\n    _MOVZ(_AT, _T9, _T8);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(_AT, _ZERO, _jit_US(d));\n    _DADDU(r0, r0, r1);\n    return (l);\n}\n\n#define jit_boaddr_ul(i0, r0, r1)\tmips_boaddr_ul(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_boaddr_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _DADDU(JIT_RTEMP, r0, r1);\n    _SLTU(_T8, JIT_RTEMP, r0);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(JIT_RZERO, _T8, _jit_US(d));\n    jit_movr_l(r0, JIT_RTEMP);\n    return (l);\n}\n\n#define jit_boaddi_l(i0, r0, i1)\tmips_boaddi_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_boaddi_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\t_SLTI(_T8, _ZERO, _jit_US(i1));\n\t_DADDIU(_AT, r0, _jit_US(i1));\n\t_SLT(_T9, r0, _AT);\n\t_SLT(_AT, _AT, r0);\n\t_MOVZ(_AT, _T9, _T8);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BNE(_AT, _ZERO, _jit_US(d));\n\t_DADDIU(r0, r0, _jit_US(i1));\n\treturn (l);\n    }\n    jit_movi_l(_T7, i1);\n    return (jit_boaddr_l(i0, r0, _T7));\n}\n\n#define jit_boaddi_ul(i0, r0, i1)\tmips_boaddi_ul(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_boaddi_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned long i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\t_DADDIU(JIT_RTEMP, r0, _jit_US(i1));\n\t_SLTU(_T8, JIT_RTEMP, r0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BNE(JIT_RZERO, _T8, _jit_US(d));\n\tjit_movr_l(r0, JIT_RTEMP);\n\treturn (l);\n    }\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_boaddr_ul(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bosubr_l(i0, r0, r1)\tmips_bosubr_l(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bosubr_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLT(_T8, _ZERO, r1);\n    _DSUBU(_AT, r0, r1);\n    _SLT(_T9, _AT, r0);\n    _SLT(_AT, r0, _AT);\n    _MOVZ(_AT, _T9, _T8);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(_AT, _ZERO, _jit_US(d));\n    _DSUBU(r0, r0, r1);\n    return (l);\n}\n\n#define jit_bosubr_ul(i0, r0, r1)\tmips_bosubr_ul(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bosubr_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _DSUBU(JIT_RTEMP, r0, r1);\n    _SLTU(_T8, r0, JIT_RTEMP);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(JIT_RZERO, _T8, _jit_US(d));\n    jit_movr_l(r0, JIT_RTEMP);\n    return (l);\n}\n\n#define jit_bosubi_l(i0, r0, i1)\tmips_bosubi_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bosubi_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1) && _jit_US(i1) != 0x8000) {\n\t_SLTI(_T8, _ZERO, _jit_US(i1));\n\t_DADDIU(_AT, r0, _jit_US(-i1));\n\t_SLT(_T9, _AT, r0);\n\t_SLT(_AT, r0, _AT);\n\t_MOVZ(_AT, _T9, _T8);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BNE(_AT, _ZERO, _jit_US(d));\n\t_DADDIU(r0, r0, _jit_US(-i1));\n\treturn (l);\n    }\n    jit_movi_l(_T7, i1);\n    return (jit_bosubr_l(i0, r0, _T7));\n}\n\n#define jit_bosubi_ul(i0, r0, i1)\tmips_bosubi_ul(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bosubi_ul(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned long i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1) && _jit_US(i1) != 0x8000) {\n\t_DADDIU(JIT_RTEMP, r0, _jit_US(-i1));\n\t_SLTU(_T8, r0, JIT_RTEMP);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BNE(JIT_RZERO, _T8, _jit_US(d));\n\tjit_movr_l(r0, JIT_RTEMP);\n\treturn (l);\n    }\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bosubr_ul(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bmsr_l(i0, r0, r1)\t\tmips_bmsr_i(_jit, i0, r0, r1)\n#define jit_bmsi_l(i0, r0, i1)\t\tmips_bmsi_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bmsi_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (_u16P(i1))\n\treturn (jit_bmsi_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bmsr_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bmcr_l(i0, r0, r1)\t\tmips_bmcr_i(_jit, i0, r0, r1)\n#define jit_bmci_l(i0, r0, i1)\t\tmips_bmci_l(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bmci_l(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, long i1)\n{\n    if (_u16P(i1))\n\treturn (jit_bmci_i(i0, r0, i1));\n    jit_movi_l(JIT_RTEMP, i1);\n    return (jit_bmcr_l(i0, r0, JIT_RTEMP));\n}\n\n#define jit_ldr_ui(r0, r1)\t\tmips_ldr_ui(_jit, r0, r1)\n__jit_inline void\nmips_ldr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _LWU(r0, 0, r1);\n}\n\n#define jit_ldr_l(r0, r1)\t\tmips_ldr_l(_jit, r0, r1)\n__jit_inline void\nmips_ldr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _LD(r0, 0, r1);\n}\n\n#define jit_ldi_ui(r0, i0)\t\tmips_ldi_ui(_jit, r0, i0)\n__jit_inline void\nmips_ldi_ui(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LWU(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LWU(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldi_l(r0, i0)\t\tmips_ldi_l(_jit, r0, i0)\n__jit_inline void\nmips_ldi_l(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LD(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LD(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxr_ui(r0, r1, r2)\t\tmips_ldxr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_ldxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r1, r2);\n    _LWU(r0, 0, JIT_RTEMP);\n}\n\n#define jit_ldxr_l(r0, r1, r2)\t\tmips_ldxr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_ldxr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r1, r2);\n    _LD(r0, 0, JIT_RTEMP);\n}\n\n#define jit_ldxi_ui(r0, r1, i0)\t\tmips_ldxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_ldxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_LWU(r0, _jit_US(i0), r1);\n    else {\n\tjit_addi_i(JIT_RTEMP, r1, i0);\n\t_LWU(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxi_l(r0, r1, i0)\t\tmips_ldxi_l(_jit, r0, r1, i0)\n__jit_inline void\nmips_ldxi_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_LD(r0, _jit_US(i0), r1);\n    else {\n\tjit_addi_i(JIT_RTEMP, r1, i0);\n\t_LD(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_str_l(r0, r1)\t\tmips_str_l(_jit, r0, r1)\n__jit_inline void\nmips_str_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _SD(r1, 0, r0);\n}\n\n#define jit_sti_l(i0, r0)\t\tmips_sti_l(_jit, i0, r0)\n__jit_inline void\nmips_sti_l(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_SD(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_SD(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_stxr_l(r0, r1, r2)\t\tmips_stxr_l(_jit, r0, r1, r2)\n__jit_inline void\nmips_stxr_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r0, r1);\n    _SD(r2, 0, JIT_RTEMP);\n}\n\n#define jit_stxi_l(i0, r0, r1)\t\tmips_stxi_l(_jit, i0, r0, r1)\n__jit_inline void\nmips_stxi_l(jit_state_t _jit, int i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (_s16P(i0))\n\t_SD(r1, _jit_US(i0), r0);\n    else {\n\tjit_addi_i(JIT_RTEMP, r0, i0);\n\t_SD(r1, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_extr_c_l(r0, r1)\t\tmips_extr_c_l(_jit, r0, r1)\n__jit_inline void\nmips_extr_c_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_extr_c_i(r0, r1);\n    _SLL(r0, r0, 0);\n}\n\n#define jit_extr_c_ul(r0, r1)\t\tmips_extr_c_ul(_jit, r0, r1)\n__jit_inline void\nmips_extr_c_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_extr_c_ui(r0, r1);\n    _SLL(r0, r0, 0);\n}\n\n#define jit_extr_s_l(r0, r1)\t\tmips_extr_s_l(_jit, r0, r1)\n__jit_inline void\nmips_extr_s_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_extr_s_i(r0, r1);\n    _SLL(r0, r0, 0);\n}\n\n#define jit_extr_s_ul(r0, r1)\t\tmips_extr_s_ul(_jit, r0, r1)\n#define jit_extr_us_ul(r0, r1)\t\tmips_extr_us_ul(_jit, r0, r1)\n__jit_inline void\nmips_extr_s_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_extr_s_ui(r0, r1);\n    _SLL(r0, r0, 0);\n}\n\n#define jit_extr_i_l(r0, r1)\t\tmips_extr_i_l(_jit, r0, r1)\n__jit_inline void\nmips_extr_i_l(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _SLL(r0, r0, 0);\n}\n\n#define jit_extr_i_ul(r0, r1)\t\tmips_extr_i_ul(_jit, r0, r1)\n#define jit_extr_ui_ul(r0, r1)\t\tmips_extr_ui_ul(_jit, r0, r1)\n__jit_inline void\nmips_extr_i_ul(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_movr_l(r0, r1);\n    _DINS(r0, JIT_RZERO, 32, 32);\n}\n\n#define jit_prolog(n)\t\t\tmips_prolog(_jit, n)\n__jit_inline void\nmips_prolog(jit_state_t _jit, int n)\n{\n    _jitl.framesize = JIT_FRAMESIZE;\n#ifdef JIT_NEED_PUSH_POP\n    _jitl.pop = 0;\n#endif\n\n    jit_subi_l(JIT_SP, JIT_SP, JIT_FRAMESIZE);\n    jit_stxi_l(88, JIT_SP, _RA);\n    jit_stxi_l(80, JIT_SP, _FP);\n    jit_stxi_l(72, JIT_SP, _S7);\n    jit_stxi_l(64, JIT_SP, _S6);\n    jit_stxi_l(56, JIT_SP, _S5);\n    jit_stxi_l(48, JIT_SP, _S4);\n    jit_stxi_l(40, JIT_SP, _S3);\n    jit_stxi_l(32, JIT_SP, _S2);\n    jit_stxi_l(24, JIT_SP, _S1);\n    jit_stxi_l(16, JIT_SP, _S0);\n    _SDC1(_F30, 8, JIT_SP);\n    _SDC1(_F28, 0, JIT_SP);\n    jit_movr_l(JIT_FP, JIT_SP);\n\n    /* patch alloca and stack adjustment */\n    _jitl.stack = (int *)_jit->x.pc;\n    jit_movi_p(JIT_RTEMP, 0);\n    jit_subr_l(JIT_SP, JIT_SP, JIT_RTEMP);\n    _jitl.alloca_offset = _jitl.stack_offset = _jitl.stack_length = 0;\n}\n\n#define jit_prepare_i(count)\t\tmips_prepare_i(_jit, count)\n__jit_inline void\nmips_prepare_i(jit_state_t _jit, int count)\n{\n    assert(count\t\t>= 0 &&\n\t   _jitl.stack_offset\t== 0 &&\n\t   _jitl.nextarg_put\t== 0);\n\n    _jitl.nextarg_put = count;\n    if (_jitl.nextarg_put > JIT_A_NUM) {\n\t_jitl.stack_offset = (_jitl.nextarg_put - JIT_A_NUM) << 3;\n\tif (_jitl.stack_length < _jitl.stack_offset) {\n\t    _jitl.stack_length = _jitl.stack_offset;\n\t    mips_set_stack(_jit, (_jitl.alloca_offset +\n\t\t\t\t  _jitl.stack_length + 7) & ~7);\n\t}\n    }\n}\n\n#define jit_pusharg_i(r0)\t\tmips_pusharg_l(_jit, r0)\n#define jit_pusharg_l(r0)\t\tmips_pusharg_l(_jit, r0)\n__jit_inline void\nmips_pusharg_l(jit_state_t _jit, jit_gpr_t r0)\n{\n    assert(_jitl.nextarg_put > 0);\n    if (--_jitl.nextarg_put >= JIT_A_NUM) {\n\t_jitl.stack_offset -= sizeof(long);\n\tassert(_jitl.stack_offset >= 0);\n\tjit_stxi_l(_jitl.stack_offset, JIT_SP, r0);\n    }\n    else\n\tjit_movr_l(jit_a_order[_jitl.nextarg_put], r0);\n}\n\n#define jit_arg_l()\t\t\tmips_arg_l(_jit)\n#define jit_arg_i()\t\t\tmips_arg_l(_jit)\n#define jit_arg_c()\t\t\tmips_arg_l(_jit)\n#define jit_arg_uc()\t\t\tmips_arg_l(_jit)\n#define jit_arg_s()\t\t\tmips_arg_l(_jit)\n#define jit_arg_us()\t\t\tmips_arg_l(_jit)\n#define jit_arg_ui()\t\t\tmips_arg_l(_jit)\n#define jit_arg_ul()\t\t\tmips_arg_l(_jit)\n__jit_inline int\nmips_arg_l(jit_state_t _jit)\n{\n    int\t\tofs;\n    int\t\treg;\n\n    reg = (_jitl.framesize - JIT_FRAMESIZE) >> 3;\n    if (reg < JIT_A_NUM)\n\tofs = reg;\n    else\n\tofs = _jitl.framesize;\n    _jitl.framesize += sizeof(long);\n\n    return (ofs);\n}\n\n#define jit_getarg_ul(r0, ofs)\t\tmips_getarg_l(_jit, r0, ofs)\n#define jit_getarg_l(r0, ofs)\t\tmips_getarg_l(_jit, r0, ofs)\n__jit_inline void\nmips_getarg_l(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_movr_l(r0, jit_a_order[ofs]);\n    else\n\tjit_ldxi_l(r0, JIT_FP, ofs);\n}\n\n#define jit_finishr(rs)\t\t\tmips_finishr(_jit, rs)\n__jit_inline void\nmips_finishr(jit_state_t _jit, jit_gpr_t r0)\n{\n    assert(_jitl.stack_offset == 0 && _jitl.nextarg_put == 0);\n    jit_callr(r0);\n}\n\n#define jit_finish(i0)\t\t\tmips_finish(_jit, i0)\n__jit_inline jit_insn *\nmips_finish(jit_state_t _jit, void *i0)\n{\n    assert(_jitl.stack_offset == 0 && _jitl.nextarg_put == 0);\n    return (jit_calli(i0));\n}\n\n#define jit_retval_i(r0)\t\tmips_retval_l(_jit, r0)\n__jit_inline void\nmips_retval_l(jit_state_t _jit, jit_gpr_t r0)\n{\n    jit_movr_l(r0, JIT_RET);\n}\n\n#define jit_ret()\t\t\tmips_ret(_jit)\n__jit_inline void\nmips_ret(jit_state_t jit)\n{\n    jit_movr_l(JIT_SP, JIT_FP);\n    _LDC1(_F28, 0, JIT_SP);\n    _LDC1(_F30, 8, JIT_SP);\n    jit_ldxi_l(_S0, JIT_SP, 16);\n    jit_ldxi_l(_S1, JIT_SP, 24);\n    jit_ldxi_l(_S2, JIT_SP, 32);\n    jit_ldxi_l(_S3, JIT_SP, 40);\n    jit_ldxi_l(_S4, JIT_SP, 48);\n    jit_ldxi_l(_S5, JIT_SP, 56);\n    jit_ldxi_l(_S6, JIT_SP, 64);\n    jit_ldxi_l(_S7, JIT_SP, 72);\n    jit_ldxi_l(_FP, JIT_SP, 80);\n    jit_ldxi_l(_RA, JIT_SP, 88);\n    _JR(_RA);\n    /* restore sp in delay slot */\n    jit_addi_l(JIT_SP, JIT_SP, JIT_FRAMESIZE);\n}\n\n#endif /* __lightning_core_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/core.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (mips version)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n *\n * GNU lightning is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_core_mips_h\n#define __lightning_core_mips_h\n\n#define JIT_FP\t\t\t\t_FP\n#define JIT_SP\t\t\t\t_SP\n#define JIT_RET\t\t\t\t_V0\n#define JIT_RZERO\t\t\t_ZERO\n#define JIT_RTEMP\t\t\t_AT\n\n#define jit_mips2_p()\t\t\tjit_cpu.mips2\n#define jit_mul_p()\t\t\tjit_cpu.mul\n\n#define JIT_R_NUM\t\t\t9\nstatic const jit_gpr_t\njit_r_order[JIT_R_NUM] = {\n    _V0, _V1, _T0, _T1, _T2, _T3, _T4, _T5, _T6\n};\n#define JIT_R(i)\t\t\tjit_r_order[i]\n\n#define JIT_V_NUM\t\t\t8\nstatic const jit_gpr_t\njit_v_order[JIT_V_NUM] = {\n    _S0, _S1, _S2, _S3, _S4, _S5, _S6, _S7\n};\n#define JIT_V(i)\t\t\tjit_v_order[i]\n\n#define JIT_A_NUM\t\t\t4\n#define JIT_FA_NUM\t\t\t8\nstatic const union {\n    jit_gpr_t\tg;\n    jit_fpr_t\tf;\n} jit_a_order[JIT_FA_NUM] = {\n    { .g = _A0, },\n    { .g = _A1, },\n    { .g = _A2, },\n    { .g = _A3, },\n    { .f = _F12 },\n    { .f = _F13 },\n    { .f = _F14 },\n    { .f = _F15 },\n};\n\n#define jit_nop(n)\t\t\tmips_nop(_jit, n)\n__jit_inline void\nmips_nop(jit_state_t _jit, int n)\n{\n    while (n--)\n\t_NOP();\n}\n\n#define jit_movr_i(r0, r1)\t\tmips_movr_i(_jit, r0, r1)\n__jit_inline void\nmips_movr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (r0 != r1)\n\t_OR(r0, r1, JIT_RZERO);\n}\n\n#define jit_movi_i(r0, i0)\t\tmips_movi_i(_jit, r0, i0)\n__jit_inline void\nmips_movi_i(jit_state_t _jit, jit_gpr_t r0, int i0)\n{\n    if (i0 == 0)\n\t_OR(r0, JIT_RZERO, JIT_RZERO);\n    else if (_s16P(i0))\n\t_ADDIU(r0, JIT_RZERO, _jit_US(i0));\n    else if (_u16P(i0))\n\t_ORI(r0, JIT_RZERO, _jit_US(i0));\n    else {\n\t_LUI(r0, (unsigned)i0 >> 16);\n\tif (_jit_US(i0))\n\t    _ORI(r0, r0, _jit_US(i0));\n    }\n}\n\n#define jit_negr_i(r0, r1)\t\tmips_negr_i(_jit, r0, r1)\n__jit_inline void\nmips_negr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _SUBU(r0, JIT_RZERO, r1);\n}\n\n#define jit_addr_i(r0, r1, r2)\t\tmips_addr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_addr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _ADDU(r0, r1, r2);\n}\n\n#define jit_addi_i(r0, r1, i0)\t\tmips_addi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_addi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (_s16P(i0))\n\t_ADDIU(r0, r1, _jit_US(i0));\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_addr_i(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_subr_i(r0, r1, r2)\t\tmips_subr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_subr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SUBU(r0, r1, r2);\n}\n\n#define jit_subi_i(r0, r1, i0)\t\tmips_subi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_subi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (_s16P(i0) && _jit_US(i0) != 0x8000)\n\t_ADDIU(r0, r1, _jit_US(-i0));\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_subr_i(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_addci_ui(r0, r1, i0)\tmips_addci_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_addci_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (r0 == r1) {\n\tif (_s16P(i0))\n\t    _ADDIU(JIT_RTEMP, r1, _jit_US(i0));\n\telse {\n\t    jit_movi_i(JIT_RTEMP, i0);\n\t    jit_addr_i(JIT_RTEMP, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, JIT_RTEMP, r1);\n\tjit_movr_i(r0, JIT_RTEMP);\n    }\n    else {\n\tif (_s16P(i0))\n\t    _ADDIU(r0, r1, _jit_US(i0));\n\telse {\n\t    jit_movi_i(JIT_RTEMP, i0);\n\t    jit_addr_i(r0, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, r0, r1);\n    }\n}\n\n#define jit_addcr_ui(r0, r1, r2)\tmips_addcr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_addcr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1) {\n\t_ADDU(JIT_RTEMP, r1, r2);\n\t_SLTU(_T8, JIT_RTEMP, r1);\n\tjit_movr_i(r0, JIT_RTEMP);\n    }\n    else {\n\t_ADDU(r0, r1, r2);\n\t_SLTU(_T8, r0, r1);\n    }\n}\n\n#define jit_addxi_ui(r0, r1, i0)\tmips_addxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_addxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_movr_i(_T9, _T8);\n    jit_addci_ui(r0, r1, i0);\n    jit_addcr_ui(r0, r0, _T9);\n}\n\n#define jit_addxr_ui(r0, r1, r2)\tmips_addxr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_addxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_movr_i(_T9, _T8);\n    jit_addcr_ui(r0, r1, r2);\n    jit_addcr_ui(r0, r0, _T9);\n}\n\n#define jit_subci_ui(r0, r1, i0)\tmips_subci_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_subci_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (r0 == r1) {\n\tif (_s16P(i0) && _jit_US(i0) != 0x8000)\n\t    _ADDIU(JIT_RTEMP, r1, _jit_US(-i0));\n\telse {\n\t    jit_movi_i(JIT_RTEMP, i0);\n\t    jit_subr_i(JIT_RTEMP, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, r1, JIT_RTEMP);\n\tjit_movr_i(r0, JIT_RTEMP);\n    }\n    else {\n\tif (_s16P(i0) && _jit_US(i0) != 0x8000)\n\t    _ADDIU(r0, r1, _jit_US(-i0));\n\telse {\n\t    jit_movi_i(JIT_RTEMP, i0);\n\t    jit_subr_i(r0, r1, JIT_RTEMP);\n\t}\n\t_SLTU(_T8, r1, r0);\n    }\n}\n\n#define jit_subcr_ui(r0, r1, r2)\tmips_subcr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_subcr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (r0 == r1) {\n\t_SUBU(JIT_RTEMP, r1, r2);\n\t_SLTU(_T8, r1, JIT_RTEMP);\n\tjit_movr_i(r0, JIT_RTEMP);\n    }\n    else {\n\t_SUBU(r0, r1, r2);\n\t_SLTU(_T8, r1, r0);\n    }\n}\n\n#define jit_subxi_ui(r0, r1, i0)\tmips_subxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_subxi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_movr_i(_T9, _T8);\n    jit_subci_ui(r0, r1, i0);\n    jit_subcr_ui(r0, r0, _T9);\n}\n\n#define jit_subxr_ui(r0, r1, r2)\tmips_subxr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_subxr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_movr_i(_T9, _T8);\n    jit_subcr_ui(r0, r1, r2);\n    jit_subcr_ui(r0, r0, _T9);\n}\n\n#define jit_mulr_i(r0, r1, r2)\t\tmips_mulr_i(_jit, r0, r1, r2)\n#define jit_mulr_ui(r0, r1, r2)\t\tmips_mulr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_mulr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    if (jit_mul_p())\n\t_MUL(r0, r1, r2);\n    else {\n\t_MULTU(r1, r2);\n\t_MFLO(r0);\n    }\n}\n\n#define jit_muli_i(r0, r1, i0)\t\tmips_muli_i(_jit, r0, r1, i0)\n#define jit_muli_ui(r0, r1, i0)\t\tmips_muli_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_muli_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_mulr_i(r0, r1, JIT_RTEMP);\n}\n\n#define jit_hmulr_i(r0, r1, r2)\t\tmips_hmulr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_hmulr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _MULT(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_hmuli_i(r0, r1, i0)\t\tmips_hmuli_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_hmuli_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_hmulr_i(r0, r1, JIT_RTEMP);\n}\n\n#define jit_hmulr_ui(r0, r1, r2)\tmips_hmulr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_hmulr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _MULTU(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_hmuli_ui(r0, r1, i0)\tmips_hmuli_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_hmuli_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_hmulr_ui(r0, r1, JIT_RTEMP);\n}\n\n#define jit_divr_i(r0, r1, r2)\t\tmips_divr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_divr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DIV(r1, r2);\n    _MFLO(r0);\n}\n\n#define jit_divi_i(r0, r1, i0)\t\tmips_divi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_divi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_divr_i(r0, r1, JIT_RTEMP);\n}\n\n#define jit_divr_ui(r0, r1, r2)\t\tmips_divr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_divr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DIVU(r1, r2);\n    _MFLO(r0);\n}\n\n#define jit_divi_ui(r0, r1, i0)\t\tmips_divi_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_divi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_divr_ui(r0, r1, JIT_RTEMP);\n}\n\n#define jit_modr_i(r0, r1, r2)\t\tmips_modr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_modr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DIV(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_modi_i(r0, r1, i0)\t\tmips_modi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_modi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_modr_i(r0, r1, JIT_RTEMP);\n}\n\n#define jit_modr_ui(r0, r1, r2)\t\tmips_modr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_modr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _DIVU(r1, r2);\n    _MFHI(r0);\n}\n\n#define jit_modi_ui(r0, r1, i0)\t\tmips_modi_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_modi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_modr_ui(r0, r1, JIT_RTEMP);\n}\n\n#define jit_andr_i(r0, r1, r2)\t\tmips_andr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_andr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _AND(r0, r1, r2);\n}\n\n#define jit_andi_i(r0, r1, i0)\t\tmips_andi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_andi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (_u16P(i0))\n\t_ANDI(r0, r1, i0);\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_andr_i(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_orr_i(r0, r1, r2)\t\tmips_orr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_orr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _OR(r0, r1, r2);\n}\n\n#define jit_ori_i(r0, r1, i0)\t\tmips_ori_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_ori_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (_u16P(i0))\n\t_ORI(r0, r1, i0);\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_orr_i(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_xorr_i(r0, r1, r2)\t\tmips_xorr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_xorr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _XOR(r0, r1, r2);\n}\n\n#define jit_xori_i(r0, r1, i0)\t\tmips_xori_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_xori_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (_u16P(i0))\n\t_XORI(r0, r1, i0);\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_xorr_i(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_lshr_i(r0, r1, r2)\t\tmips_lshr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_lshr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLLV(r0, r1, r2);\n}\n\n#define jit_lshi_i(r0, r1, i0)\t\tmips_lshi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_lshi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    assert(i0 <= 31);\n    _SLL(r0, r1, i0);\n}\n\n#define jit_rshr_i(r0, r1, r2)\t\tmips_rshr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_rshr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SRAV(r0, r1, r2);\n}\n\n#define jit_rshi_i(r0, r1, i0)\t\tmips_rshi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_rshi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    assert(i0 <= 31);\n    _SRA(r0, r1, i0);\n}\n\n#define jit_rshr_ui(r0, r1, r2)\t\tmips_rshr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_rshr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SRLV(r0, r1, r2);\n}\n\n#define jit_rshi_ui(r0, r1, i0)\t\tmips_rshi_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_rshi_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned char i0)\n{\n    assert(i0 <= 31);\n    _SRL(r0, r1, i0);\n}\n\n#define jit_ltr_i(r0, r1, r2)\t\tmips_ltr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_ltr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLT(r0, r1, r2);\n}\n\n#define jit_lti_i(r0, r1, i0)\t\tmips_lti_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_lti_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (_s16P(i0))\n\t_SLTI(r0, r1, _jit_US(i0));\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_ltr_i(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_ltr_ui(r0, r1, i0)\t\tmips_ltr_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_ltr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLTU(r0, r1, r2);\n}\n\n#define jit_lti_ui(r0, r1, i0)\t\tmips_lti_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_lti_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    /* value is sign extended */\n    if (_s16P(i0))\n\t_SLTIU(r0, r1, _jit_US(i0));\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_ltr_ui(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_ler_i(r0, r1, r2)\t\tmips_ler_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_ler_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLT(r0, r2, r1);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_lei_i(r0, r1, i0)\t\tmips_lei_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_lei_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 == 0) {\n\t_SLT(r0, JIT_RZERO, r1);\n\t_XORI(r0, r0, 1);\n    }\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_ler_i(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_ler_ui(r0, r1, r2)\t\tmips_ler_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_ler_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLTU(r0, r2, r1);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_lei_ui(r0, r1, i0)\t\tmips_lei_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_lei_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (i0 == 0) {\n\t_SLTU(r0, JIT_RZERO, r1);\n\t_XORI(r0, r0, 1);\n    }\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\tjit_ler_ui(r0, r1, JIT_RTEMP);\n    }\n}\n\n#define jit_eqr_i(r0, r1, r2)\t\tmips_eqr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_eqr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_subr_i(r0, r1, r2);\n    _SLTU(r0, JIT_RZERO, r0);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_eqi_i(r0, r1, i0)\t\tmips_eqi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_eqi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0) {\n\tjit_subi_i(r0, r1, i0);\n\t_SLTU(r0, JIT_RZERO, r0);\n    }\n    else\n\t_SLTU(r0, JIT_RZERO, r1);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_ger_i(r0, r1, r2)\t\tmips_ger_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_ger_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLT(r0, r1, r2);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_gei_i(r0, r1, i0)\t\tmips_gei_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_gei_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_ger_i(r0, r1, JIT_RTEMP);\n}\n\n#define jit_ger_ui(r0, r1, i0)\t\tmips_ger_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_ger_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLTU(r0, r1, r2);\n    _XORI(r0, r0, 1);\n}\n\n#define jit_gei_ui(r0, r1, i0)\t\tmips_gei_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_gei_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    jit_movi_i(JIT_RTEMP, i0);\n    jit_ger_ui(r0, r1, JIT_RTEMP);\n}\n\n#define jit_gtr_i(r0, r1, r2)\t\tmips_gtr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_gtr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLT(r0, r2, r1);\n}\n\n#define jit_gti_i(r0, r1, i0)\t\tmips_gti_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_gti_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0 == 0)\n\t_SLT(r0, JIT_RZERO, r1);\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\t_SLT(r0, JIT_RTEMP, r1);\n    }\n}\n\n#define jit_gtr_ui(r0, r1, r2)\t\tmips_gtr_ui(_jit, r0, r1, r2)\n__jit_inline void\nmips_gtr_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    _SLTU(r0, r2, r1);\n}\n\n#define jit_gti_ui(r0, r1, i0)\t\tmips_gti_ui(_jit, r0, r1, i0)\n__jit_inline void\nmips_gti_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, unsigned int i0)\n{\n    if (i0 == 0)\n\t_SLTU(r0, JIT_RZERO, r1);\n    else {\n\tjit_movi_i(JIT_RTEMP, i0);\n\t_SLTU(r0, JIT_RTEMP, r1);\n    }\n}\n\n#define jit_ner_i(r0, r1, r2)\t\tmips_ner_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_ner_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_subr_i(r0, r1, r2);\n    _SLTU(r0, JIT_RZERO, r0);\n}\n\n#define jit_nei_i(r0, r1, i0)\t\tmips_nei_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_nei_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, int i0)\n{\n    if (i0) {\n\tjit_subi_i(r0, r1, i0);\n\t_SLTU(r0, JIT_RZERO, r0);\n    }\n    else\n\t_SLTU(r0, JIT_RZERO, r1);\n}\n\n#define jit_jmpr(i0)\t\t\tmips_jmpr(_jit, i0)\n__jit_inline void\nmips_jmpr(jit_state_t _jit, jit_gpr_t r0)\n{\n    _JR(r0);\n    jit_nop(1);\n}\n\n#define jit_bltr_i(i0, r0, r1)\t\tmips_bltr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bltr_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLT(JIT_RTEMP, r0, r1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_blti_i(i0, r0, i1)\t\tmips_blti_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blti_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\tif (i1)\n\t    _SLTI(JIT_RTEMP, r0, _jit_US(i1));\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\tif (i1)\n\t    _BNE(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n\telse\n\t    _BLTZ(r0, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bltr_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bltr_ui(i0, r0, r1)\t\tmips_bltr_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bltr_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLTU(JIT_RTEMP, r0, r1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_blti_ui(i0, r0, i1)\t\tmips_blti_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blti_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\t_SLTIU(JIT_RTEMP, r0, _jit_US(i1));\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BNE(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bltr_ui(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bler_i(i0, r0, r1)\t\tmips_bler_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bler_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLT(JIT_RTEMP, r1, r0);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BEQ(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_blei_i(i0, r0, i1)\t\tmips_blei_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blei_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (i1 == 0) {\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BLEZ(r0, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bler_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bler_ui(i0, r0, r1)\t\tmips_bler_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bler_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLTU(JIT_RTEMP, r1, r0);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BEQ(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_blei_ui(i0, r0, i1)\t\tmips_blei_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_blei_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (i1 == 0) {\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BEQ(r0, JIT_RZERO, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bler_ui(i0, r0, JIT_RTEMP));\n}\n\n#define jit_beqr_i(i0, r0, r1)\t\tmips_beqr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_beqr_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BEQ(r0, r1, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_beqi_i(i0, r0, i1)\t\tmips_beqi_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_beqi_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (i1 == 0) {\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\t_BEQ(r0, JIT_RZERO, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_beqr_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bger_i(i0, r0, r1)\t\tmips_bger_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bger_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLT(JIT_RTEMP, r0, r1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BEQ(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bgei_i(i0, r0, i1)\t\tmips_bgei_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgei_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\tif (i1)\n\t    _SLTI(JIT_RTEMP, r0, _jit_US(i1));\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\tif (i1)\n\t    _BEQ(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n\telse\n\t    _BGEZ(r0, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bger_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bger_ui(i0, r0, r1)\t\tmips_bger_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bger_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLTU(JIT_RTEMP, r0, r1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BEQ(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bgei_ui(i0, r0, i1)\t\tmips_bgei_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgei_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\t_SLTIU(JIT_RTEMP, r0, _jit_US(i1));\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BEQ(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bger_ui(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bgtr_i(i0, r0, r1)\t\tmips_bgtr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bgtr_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLT(JIT_RTEMP, r1, r0);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bgti_i(i0, r0, i1)\t\tmips_bgti_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgti_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (i1 == 0) {\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BGTZ(r0, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bgtr_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bgtr_ui(i0, r0, r1)\t\tmips_bgtr_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bgtr_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SLTU(JIT_RTEMP, r1, r0);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(JIT_RTEMP, JIT_RZERO, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bgti_ui(i0, r0, i1)\t\tmips_bgti_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bgti_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (i1 == 0) {\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BNE(r0, JIT_RZERO, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bgtr_ui(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bner_i(i0, r0, r1)\t\tmips_bner_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bner_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(r0, r1, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bnei_i(i0, r0, i1)\t\tmips_bnei_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bnei_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (i1 == 0) {\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\t_BNE(r0, JIT_RZERO, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bner_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_boaddr_i(i0, r0, r1)\tmips_boaddr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_boaddr_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    /* r0 and r1 cannot be_AT, _T8, or _T9 */\n    jit_insn\t*l;\n    long\t d;\n    /* at = r0 + r1;\toverflow = r1 < 0 ? r0 < at : at < r0; */\n    _SLT(_T8, r1, _ZERO);\t\t/* t8 = r1 < 0 */\n    _ADDU(_AT, r0, r1);\t\t\t/* at = r0 + r1 */\n    _SLT(_T9, _AT, r0);\t\t\t/* t9 = at < r0 */\n    _SLT(_AT, r0, _AT);\t\t\t/* at = r0 < at */\n    _MOVZ(_AT, _T9, _T8);\t\t/* if (t8 == 0) at = t9 */\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n\n    _BNE(_AT, _ZERO, _jit_US(d));\n    /* delay slot */\n    _ADDU(r0, r0, r1);\n\n    return (l);\n}\n\n#define jit_boaddi_i(i0, r0, i1)\tmips_boaddi_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_boaddi_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\t/* reversed logic of boaddr_i to have immediate as last argument */\n\t_SLTI(_T8, _ZERO, _jit_US(i1));\n\t_ADDIU(_AT, r0, _jit_US(i1));\n\t_SLT(_T9, r0, _AT);\n\t_SLT(_AT, _AT, r0);\n\t_MOVZ(_AT, _T9, _T8);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\n\t_BNE(_AT, _ZERO, _jit_US(d));\n\t/* delay slot */\n\t_ADDIU(r0, r0, _jit_US(i1));\n\n\treturn (l);\n    }\n    jit_movi_i(_T7, i1);\n    return (jit_boaddr_i(i0, r0, _T7));\n}\n\n#define jit_bosubr_i(i0, r0, r1)\tmips_bosubr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bosubr_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    /* r0 and r1 cannot be_AT, _T8, or _T9 */\n    jit_insn\t*l;\n    long\t d;\n    /* at = r0 - r1;\toverflow = 0 < r1 ? r0 < at : at < r0; */\n    _SLT(_T8, _ZERO, r1);\t\t/* t8 = r1 < 0 */\n    _SUBU(_AT, r0, r1);\t\t\t/* at = r0 - r1 */\n    _SLT(_T9, _AT, r0);\t\t\t/* t9 = at < r0 */\n    _SLT(_AT, r0, _AT);\t\t\t/* at = r0 < at */\n    _MOVZ(_AT, _T9, _T8);\t\t/* if (t8 == 0) at = t9 */\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n\n    _BNE(_AT, _ZERO, _jit_US(d));\n    /* delay slot */\n    _SUBU(r0, r0, r1);\n\n    return (l);\n}\n\n#define jit_bosubi_i(i0, r0, i1)\tmips_bosubi_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bosubi_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1) && _jit_US(i1) != 0x8000) {\n\t_SLTI(_T8, _ZERO, _jit_US(i1));\n\t_ADDIU(_AT, r0, _jit_US(-i1));\n\t_SLT(_T9, _AT, r0);\n\t_SLT(_AT, r0, _AT);\n\t_MOVZ(_AT, _T9, _T8);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\n\t_BNE(_AT, _ZERO, _jit_US(d));\n\t/* delay slot */\n\t_ADDIU(r0, r0, _jit_US(-i1));\n\n\treturn (l);\n    }\n    jit_movi_i(_T7, i1);\n    return (jit_bosubr_i(i0, r0, _T7));\n}\n\n#define jit_boaddr_ui(i0, r0, r1)\tmips_boaddr_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_boaddr_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _ADDU(JIT_RTEMP, r0, r1);\n    _SLTU(_T8, JIT_RTEMP, r0);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n\n    _BNE(JIT_RZERO, _T8, _jit_US(d));\n    /*delay slot */\n    jit_movr_i(r0, JIT_RTEMP);\n\n    return (l);\n}\n\n#define jit_boaddi_ui(i0, r0, i1)\tmips_boaddi_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_boaddi_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1)) {\n\t_ADDIU(JIT_RTEMP, r0, _jit_US(i1));\n\t_SLTU(_T8, JIT_RTEMP, r0);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\n\t_BNE(JIT_RZERO, _T8, _jit_US(d));\n\t/* delay slot */\n\tjit_movr_i(r0, JIT_RTEMP);\n\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_boaddr_ui(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bosubr_ui(i0, r0, r1)\tmips_bosubr_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bosubr_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _SUBU(JIT_RTEMP, r0, r1);\n    _SLTU(_T8, r0, JIT_RTEMP);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n\n    _BNE(JIT_RZERO, _T8, _jit_US(d));\n    /* delay slot */\n    jit_movr_i(r0, JIT_RTEMP);\n\n    return (l);\n}\n\n#define jit_bosubi_ui(i0, r0, i1)\tmips_bosubi_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bosubi_ui(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, unsigned int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_s16P(i1) && _jit_US(i1) != 0x8000) {\n\t_ADDIU(JIT_RTEMP, r0, _jit_US(-i1));\n\t_SLTU(_T8, r0, JIT_RTEMP);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\n\t_BNE(JIT_RZERO, _T8, _jit_US(d));\n\t/* delay slot */\n\tjit_movr_i(r0, JIT_RTEMP);\n\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bosubr_ui(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bmsr_i(i0, r0, r1)\t\tmips_bmsr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bmsr_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _AND(JIT_RTEMP, r0, r1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BNE(JIT_RZERO, JIT_RTEMP, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bmsi_i(i0, r0, i1)\t\tmips_bmsi_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bmsi_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_u16P(i1)) {\n\t_ANDI(JIT_RTEMP, r0, i1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BNE(JIT_RZERO, JIT_RTEMP, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bmsr_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_bmcr_i(i0, r0, r1)\t\tmips_bmcr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nmips_bmcr_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _AND(JIT_RTEMP, r0, r1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BEQ(JIT_RZERO, JIT_RTEMP, _jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bmci_i(i0, r0, i1)\t\tmips_bmci_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nmips_bmci_i(jit_state_t _jit, jit_insn *i0, jit_gpr_t r0, int i1)\n{\n    jit_insn\t*l;\n    long\t d;\n    if (_u16P(i1)) {\n\t_ANDI(JIT_RTEMP, r0, i1);\n\tl = _jit->x.pc;\n\td = (((long)i0 - (long)l) >> 2) - 1;\n\tassert(_s16P(d));\n\t_BEQ(JIT_RZERO, JIT_RTEMP, _jit_US(d));\n\tjit_nop(1);\n\treturn (l);\n    }\n    jit_movi_i(JIT_RTEMP, i1);\n    return (jit_bmcr_i(i0, r0, JIT_RTEMP));\n}\n\n#define jit_ldr_c(r0, r1)\t\tmips_ldr_c(_jit, r0, r1)\n__jit_inline void\nmips_ldr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _LB(r0, 0, r1);\n}\n\n#define jit_ldr_uc(r0, r1)\t\tmips_ldr_uc(_jit, r0, r1)\n__jit_inline void\nmips_ldr_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _LBU(r0, 0, r1);\n}\n\n#define jit_ldr_s(r0, r1)\t\tmips_ldr_s(_jit, r0, r1)\n__jit_inline void\nmips_ldr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _LH(r0, 0, r1);\n}\n\n#define jit_ldr_us(r0, r1)\t\tmips_ldr_us(_jit, r0, r1)\n__jit_inline void\nmips_ldr_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _LHU(r0, 0, r1);\n}\n\n#define jit_ldr_i(r0, r1)\t\tmips_ldr_i(_jit, r0, r1)\n__jit_inline void\nmips_ldr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _LW(r0, 0, r1);\n}\n\n#define jit_ldi_c(r0, i0)\t\tmips_ldi_c(_jit, r0, i0)\n__jit_inline void\nmips_ldi_c(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LB(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LB(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldi_uc(r0, i0)\t\tmips_ldi_uc(_jit, r0, i0)\n__jit_inline void\nmips_ldi_uc(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LBU(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LBU(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldi_s(r0, i0)\t\tmips_ldi_s(_jit, r0, i0)\n__jit_inline void\nmips_ldi_s(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LH(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LH(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldi_us(r0, i0)\t\tmips_ldi_us(_jit, r0, i0)\n__jit_inline void\nmips_ldi_us(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LHU(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LHU(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldi_i(r0, i0)\t\tmips_ldi_i(_jit, r0, i0)\n__jit_inline void\nmips_ldi_i(jit_state_t _jit, jit_gpr_t r0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LW(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LW(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxr_c(r0, r1, r2)\t\tmips_ldxr_c(_jit, r0, r1, r2)\n__jit_inline void\nmips_ldxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r1, r2);\n    _LB(r0, 0, JIT_RTEMP);\n}\n\n#define jit_ldxr_uc(r0, r1, r2)\t\tmips_ldxr_uc(_jit, r0, r1, r2)\n__jit_inline void\nmips_ldxr_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r1, r2);\n    _LBU(r0, 0, JIT_RTEMP);\n}\n\n#define jit_ldxr_s(r0, r1, r2)\t\tmips_ldxr_s(_jit, r0, r1, r2)\n__jit_inline void\nmips_ldxr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r1, r2);\n    _LH(r0, 0, JIT_RTEMP);\n}\n\n#define jit_ldxr_us(r0, r1, r2)\t\tmips_ldxr_us(_jit, r0, r1, r2)\n__jit_inline void\nmips_ldxr_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r1, r2);\n    _LHU(r0, 0, JIT_RTEMP);\n}\n\n#define jit_ldxr_i(r0, r1, r2)\t\tmips_ldxr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_ldxr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r1, r2);\n    _LW(r0, 0, JIT_RTEMP);\n}\n\n#define jit_ldxi_c(r0, r1, i0)\t\tmips_ldxi_c(_jit, r0, r1, i0)\n__jit_inline void\nmips_ldxi_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_LB(r0, _jit_US(i0), r1);\n    else {\n\tjit_addi_i(JIT_RTEMP, r1, i0);\n\t_LB(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxi_uc(r0, r1, i0)\t\tmips_ldxi_uc(_jit, r0, r1, i0)\n__jit_inline void\nmips_ldxi_uc(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_LBU(r0, _jit_US(i0), r1);\n    else {\n\tjit_addi_i(JIT_RTEMP, r1, i0);\n\t_LBU(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxi_s(r0, r1, i0)\t\tmips_ldxi_s(_jit, r0, r1, i0)\n__jit_inline void\nmips_ldxi_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_LH(r0, _jit_US(i0), r1);\n    else {\n\tjit_addi_i(JIT_RTEMP, r1, i0);\n\t_LH(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxi_us(r0, r1, i0)\t\tmips_ldxi_us(_jit, r0, r1, i0)\n__jit_inline void\nmips_ldxi_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_LHU(r0, _jit_US(i0), r1);\n    else {\n\tjit_addi_i(JIT_RTEMP, r1, i0);\n\t_LHU(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxi_i(r0, r1, i0)\t\tmips_ldxi_i(_jit, r0, r1, i0)\n__jit_inline void\nmips_ldxi_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, long i0)\n{\n    if (_s16P(i0))\n\t_LW(r0, _jit_US(i0), r1);\n    else {\n\tjit_addi_i(JIT_RTEMP, r1, i0);\n\t_LW(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_str_c(r0, r1)\t\tmips_str_c(_jit, r0, r1)\n__jit_inline void\nmips_str_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _SB(r1, 0, r0);\n}\n\n#define jit_str_s(r0, r1)\t\tmips_str_s(_jit, r0, r1)\n__jit_inline void\nmips_str_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _SH(r1, 0, r0);\n}\n\n#define jit_str_i(r0, r1)\t\tmips_str_i(_jit, r0, r1)\n__jit_inline void\nmips_str_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _SW(r1, 0, r0);\n}\n\n#define jit_sti_c(i0, r0)\t\tmips_sti_c(_jit, i0, r0)\n__jit_inline void\nmips_sti_c(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_SB(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_SB(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_sti_s(i0, r0)\t\tmips_sti_s(_jit, i0, r0)\n__jit_inline void\nmips_sti_s(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_SH(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_SH(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_sti_i(i0, r0)\t\tmips_sti_i(_jit, i0, r0)\n__jit_inline void\nmips_sti_i(jit_state_t _jit, void *i0, jit_gpr_t r0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_SW(r0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_SW(r0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_stxr_c(r0, r1, r2)\t\tmips_stxr_c(_jit, r0, r1, r2)\n__jit_inline void\nmips_stxr_c(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r0, r1);\n    _SB(r2, 0, JIT_RTEMP);\n}\n\n#define jit_stxr_s(r0, r1, r2)\t\tmips_stxr_s(_jit, r0, r1, r2)\n__jit_inline void\nmips_stxr_s(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r0, r1);\n    _SH(r2, 0, JIT_RTEMP);\n}\n\n#define jit_stxr_i(r0, r1, r2)\t\tmips_stxr_i(_jit, r0, r1, r2)\n__jit_inline void\nmips_stxr_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_gpr_t r2)\n{\n    jit_addr_i(JIT_RTEMP, r0, r1);\n    _SW(r2, 0, JIT_RTEMP);\n}\n\n#define jit_stxi_c(i0, r0, r1)\t\tmips_stxi_c(_jit, i0, r0, r1)\n__jit_inline void\nmips_stxi_c(jit_state_t _jit, int i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (_s16P(i0))\n\t_SB(r1, _jit_US(i0), r0);\n    else {\n\tjit_addi_i(JIT_RTEMP, r0, i0);\n\t_SB(r1, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_stxi_s(i0, r0, r1)\t\tmips_stxi_s(_jit, i0, r0, r1)\n__jit_inline void\nmips_stxi_s(jit_state_t _jit, int i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (_s16P(i0))\n\t_SH(r1, _jit_US(i0), r0);\n    else {\n\tjit_addi_i(JIT_RTEMP, r0, i0);\n\t_SH(r1, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_stxi_i(i0, r0, r1)\t\tmips_stxi_i(_jit, i0, r0, r1)\n__jit_inline void\nmips_stxi_i(jit_state_t _jit, int i0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (_s16P(i0))\n\t_SW(r1, _jit_US(i0), r0);\n    else {\n\tjit_addi_i(JIT_RTEMP, r0, i0);\n\t_SW(r1, 0, JIT_RTEMP);\n    }\n}\n\n#if __BYTE_ORDER == __LITTLE_ENDIAN\n#define jit_ntoh_us(r0, r1)\t\tmips_ntoh_us(_jit, r0, r1)\n__jit_inline void\nmips_ntoh_us(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_mips2_p())\n\t_WSBH(r0, r1);\n    else {\n\t_LUI(_AT, 0xff00);\n\t_ORI(_AT, _AT, 0xff00);\n\t_AND(_T8, r1, _AT);\n\t_SRL(_AT, _AT, 8);\n\t_AND(_AT, r1, _AT);\n\t_SRL(_T8, _T8, 8);\n\t_SLL(_AT, _AT, 8);\n\t_OR(r0, _AT, _T8);\n    }\n}\n\n#define jit_ntoh_ui(r0, r1)\t\tmips_ntoh_ui(_jit, r0, r1)\n__jit_inline void\nmips_ntoh_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_mips2_p()) {\n\t_WSBH(r0, r1);\n\t_ROTR(r0, r0, 16);\n    }\n    else {\n\tmips_ntoh_us(_jit, r0, r1);\n\t_ANDI(_T8, r0, 0xffff);\n\t_LUI(_AT, 0xffff);\n\t_AND(_AT, r0, _AT);\n\t_SLL(_T8, _T8, 16);\n\t_SRL(_AT, _AT, 16);\n\t_OR(r0, _AT, _T8);\n    }\n}\n#endif\n\n#define jit_extr_c_i(r0, r1)\t\tmips_extr_c_i(_jit, r0, r1)\n__jit_inline void\nmips_extr_c_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_mips2_p())\n\t_SEB(r0, r1);\n    else {\n\t_SLL(r0, r1, 24);\n\t_SRA(r0, r0, 24);\n    }\n}\n\n#define jit_extr_c_ui(r0, r1)\t\tmips_extr_c_ui(_jit, r0, r1)\n__jit_inline void\nmips_extr_c_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _ANDI(r0, r1, 0xff);\n}\n\n#define jit_extr_s_i(r0, r1)\t\tmips_extr_s_i(_jit, r0, r1)\n__jit_inline void\nmips_extr_s_i(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_mips2_p())\n\t_SEH(r0, r1);\n    else {\n\t_SLL(r0, r1, 16);\n\t_SRA(r0, r0, 16);\n    }\n}\n\n#define jit_extr_s_ui(r0, r1)\t\tmips_extr_s_ui(_jit, r0, r1)\n__jit_inline void\nmips_extr_s_ui(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1)\n{\n    _ANDI(r0, r1, 0xffff);\n}\n\n#define jit_getarg_c(r0, ofs)\t\tmips_getarg_c(_jit, r0, ofs)\n__jit_inline void\nmips_getarg_c(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_extr_c_i(r0, jit_a_order[ofs].g);\n    else {\n#if __BYTE_ORDER == __BIG_ENDIAN\n\tofs += sizeof(int) - sizeof(char);\n#endif\n\tjit_ldxi_c(r0, JIT_FP, ofs);\n    }\n}\n\n#define jit_getarg_uc(r0, ofs)\t\tmips_getarg_uc(_jit, r0, ofs)\n__jit_inline void\nmips_getarg_uc(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_extr_c_ui(r0, jit_a_order[ofs].g);\n    else {\n#if __BYTE_ORDER == __BIG_ENDIAN\n\tofs += sizeof(int) - sizeof(char);\n#endif\n\tjit_ldxi_uc(r0, JIT_FP, ofs);\n    }\n}\n\n#define jit_getarg_s(r0, ofs)\t\tmips_getarg_s(_jit, r0, ofs)\n__jit_inline void\nmips_getarg_s(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_extr_s_i(r0, jit_a_order[ofs].g);\n    else {\n#if __BYTE_ORDER == __BIG_ENDIAN\n\tofs += sizeof(int) - sizeof(short);\n#endif\n\tjit_ldxi_s(r0, JIT_FP, ofs);\n    }\n}\n\n#define jit_getarg_us(r0, ofs)\t\tmips_getarg_us(_jit, r0, ofs)\n__jit_inline void\nmips_getarg_us(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_extr_s_ui(r0, jit_a_order[ofs].g);\n    else {\n#if __BYTE_ORDER == __BIG_ENDIAN\n\tofs += sizeof(int) - sizeof(short);\n#endif\n\tjit_ldxi_us(r0, JIT_FP, ofs);\n    }\n}\n\n#define jit_getarg_i(r0, ofs)\t\tmips_getarg_i(_jit, r0, ofs)\n__jit_inline void\nmips_getarg_i(jit_state_t _jit, jit_gpr_t r0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_movr_i(r0, jit_a_order[ofs].g);\n    else\n\tjit_ldxi_i(r0, JIT_FP, ofs);\n}\n\n#define jit_callr(r0)\t\t\tmips_callr(_jit, r0)\n__jit_inline void\nmips_callr(jit_state_t _jit, jit_gpr_t r0)\n{\n    _JALR(r0);\n    jit_nop(1);\n}\n\n__jit_inline int\nmips_get_stack(jit_state_t _jit)\n{\n    mips_code_t\t\t*cc;\n    cc = (mips_code_t *)_jitl.stack;\n    assert(cc != NULL && cc[0].hc.b == MIPS_LUI && cc[1].hc.b == MIPS_ORI);\n    return ((cc[0].is.b << 16) | _jit_US(cc[1].is.b));\n}\n\n__jit_inline void\nmips_set_stack(jit_state_t _jit, int length)\n{\n    mips_code_t\t\t*cc;\n    assert(length >= 0);\n    cc = (mips_code_t *)_jitl.stack;\n    assert(cc != NULL && cc[0].hc.b == MIPS_LUI && cc[1].hc.b == MIPS_ORI);\n    cc[0].is.b = length >> 16;\n    cc[1].is.b = _jit_US(length);\n}\n\n#define jit_allocai(n)\t\t\tmips_allocai(_jit, n)\n__jit_inline int\nmips_allocai(jit_state_t _jit, int length)\n{\n    int\t\tstack = mips_get_stack(_jit);\n    assert(length >= 0);\n    _jitl.alloca_offset += length;\n    if (_jitl.alloca_offset + _jitl.stack_length > stack)\n\tmips_set_stack(_jit, (stack + (length + 7)) & ~7);\n    return (-_jitl.alloca_offset);\n}\n\n#if LIGHTNING_CROSS \\\n\t? LIGHTNING_TARGET == LIGHTNING_MIPS64 \\\n\t: defined (__mips64)\n#  include \"core-64.h\"\n#else\n#  include \"core-32.h\"\n#endif\n\n#ifdef JIT_NEED_PUSH_POP\n# define jit_pushr_i(r0)\t\tmips_pushr_i(_jit, r0)\n__jit_inline int\nmips_pushr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    int\t\toffset;\n    assert(_jitl.pop < sizeof(_jitl.push) / sizeof(_jitl.push[0]));\n    offset = jit_allocai(4);\n    _jitl.push[_jitl.pop++] = offset;\n    jit_stxi_i(offset, JIT_FP, r0);\n}\n\n# define jit_popr_i(r0)\t\t\tmips_popr_i(_jit, r0)\n__jit_inline int\nmips_popr_i(jit_state_t _jit, jit_gpr_t r0)\n{\n    int\t\toffset;\n    assert(_jitl.pop > 0);\n    offset = _jitl.push[--_jitl.pop];\n    jit_ldxi_i(r0, JIT_FP, offset);\n}\n#endif\n\n#endif /* __lightning_core_mips_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/fp-32.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tFloating-point support (mips)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_fp_h\n#define __lightning_fp_h\n\n#define jit_movi_d(f0, i0)\t\tmips_movi_d(_jit, f0, i0)\n__jit_inline void\nmips_movi_d(jit_state_t _jit, jit_fpr_t f0, double i0)\n{\n    union {\n\tint\ti[2];\n\tlong\tl;\n\tdouble\td;\n    } data;\n\n    data.d = i0;\n    if (data.i[0]) {\n\tjit_movi_i(JIT_RTEMP, data.i[0]);\n\t_MTC1(JIT_RTEMP, f0);\n    }\n    else\n\t_MTC1(JIT_RZERO, f0);\n    if (data.i[1]) {\n\tjit_movi_i(JIT_RTEMP, data.i[1]);\n\tif (jit_mips2_p())\n\t    _MTHC1(JIT_RTEMP, f0);\n\telse\n\t    _MTC1(JIT_RTEMP, (jit_fpr_t)(f0 + 1));\n    }\n    else {\n\tif (jit_mips2_p())\n\t    _MTHC1(JIT_RZERO, f0);\n\telse\n\t    _MTC1(JIT_RZERO, (jit_fpr_t)(f0 + 1));\n    }\n}\n\n#define jit_prepare_d(count)\t\tmips_prepare_d(_jit, count)\n__jit_inline void\nmips_prepare_d(jit_state_t _jit, int count)\n{\n    assert(count >= 0);\n    _jitl.stack_offset += count << 3;\n    if (_jitl.stack_length < _jitl.stack_offset) {\n\t_jitl.stack_length = _jitl.stack_offset;\n\tmips_set_stack(_jit, (_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 7) & ~7);\n    }\n}\n\n#define jit_prepare_f(count)\t\tmips_prepare_f(_jit, count)\n__jit_inline void\nmips_prepare_f(jit_state_t _jit, int count)\n{\n    assert(count >= 0);\n    _jitl.stack_offset += count << 2;\n    if (_jitl.stack_length < _jitl.stack_offset) {\n\t_jitl.stack_length = _jitl.stack_offset;\n\tmips_set_stack(_jit, (_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 7) & ~7);\n    }\n}\n\n#define jit_arg_d()\t\t\tmips_arg_d(_jit)\n__jit_inline int\nmips_arg_d(jit_state_t _jit)\n{\n    int\t\tofs;\n    int\t\treg;\n\n    if (_jitl.framesize & 7) {\n\t_jitl.nextarg_int = 1;\n\t_jitl.framesize += 4;\n    }\n    reg = (_jitl.framesize - JIT_FRAMESIZE) >> 2;\n    if (reg < JIT_A_NUM) {\n\tofs = reg;\n\tif (!_jitl.nextarg_int)\n\t    ofs += JIT_A_NUM;\n    }\n    else\n\tofs = _jitl.framesize;\n    _jitl.framesize += sizeof(double);\n\n    return (ofs);\n}\n\n#define jit_arg_f()\t\t\tmips_arg_f(_jit)\n__jit_inline int\nmips_arg_f(jit_state_t _jit)\n{\n    int\t\tofs;\n    int\t\treg;\n\n    reg = (_jitl.framesize - JIT_FRAMESIZE) >> 2;\n    if (reg < JIT_A_NUM) {\n\tif (!_jitl.nextarg_int) {\n\t    if (reg == 0)\n\t\treg = JIT_A_NUM;\n\t    else {\n\t\treg = JIT_A_NUM + 2;\n\t\t_jitl.nextarg_int = 1;\n\t    }\n\t}\n\tofs = reg;\n    }\n    else\n\tofs = _jitl.framesize;\n    _jitl.framesize += sizeof(float);\n\n    return (ofs);\n}\n\n#define jit_getarg_d(f0, ofs)\t\tmips_getarg_d(_jit, f0, ofs)\n__jit_inline void\nmips_getarg_d(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    if (ofs < JIT_A_NUM) {\n\t_MTC1(jit_a_order[ofs].g, f0);\n\t_MTC1(jit_a_order[ofs + 1].g, (jit_fpr_t)(f0 + 1));\n    }\n    else if (ofs < JIT_FA_NUM) {\n\t_MOV_S(f0, jit_a_order[ofs].f);\n\t_MOV_S((jit_fpr_t)(f0 + 1), jit_a_order[ofs + 1].f);\n    }\n    else {\n\tjit_ldxi_f(f0, JIT_FP, ofs);\n\tjit_ldxi_f((jit_fpr_t)(f0 + 1), JIT_FP, ofs + 4);\n    }\n}\n\n#define jit_getarg_f(f0, ofs)\t\tmips_getarg_f(_jit, f0, ofs)\n__jit_inline void\nmips_getarg_f(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\t_MTC1(jit_a_order[ofs].g, f0);\n    else if (ofs < JIT_FA_NUM)\n\t_MOV_S(f0, jit_a_order[ofs].f);\n    else\n\tjit_ldxi_f(f0, JIT_FP, ofs);\n}\n\n#define jit_pusharg_d(f0)\t\tmips_pusharg_d(_jit, f0)\n__jit_inline void\nmips_pusharg_d(jit_state_t _jit, jit_fpr_t f0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n\n    assert(ofs < 256);\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] |= 1 << (ofs & 31);\n    _jitl.stack_offset -= sizeof(double);\n    jit_stxi_f(_jitl.stack_offset, JIT_SP, f0);\n    jit_stxi_f(_jitl.stack_offset + 4, JIT_SP, (jit_fpr_t)(f0 + 1));\n}\n\n#define jit_pusharg_f(f0)\t\tmips_pusharg_f(_jit, f0)\n__jit_inline void\nmips_pusharg_f(jit_state_t _jit, jit_fpr_t f0)\n{\n    int\t\tofs = _jitl.nextarg_put++;\n\n    assert(ofs < 256);\n    _jitl.arguments[ofs] = (int *)_jit->x.pc;\n    _jitl.types[ofs >> 5] &= ~(1 << (ofs & 31));\n    _jitl.stack_offset -= sizeof(float);\n    jit_stxi_f(_jitl.stack_offset, JIT_SP, f0);\n}\n\n#endif /* __lightning_fp_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/fp-64.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tFloating-point support (mips64)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_fp_h\n#define __lightning_fp_h\n\n#define jit_movi_d(f0, i0)\t\tmips_movi_d(_jit, f0, i0)\n__jit_inline void\nmips_movi_d(jit_state_t _jit, jit_fpr_t f0, double i0)\n{\n    union {\n\tint\ti[2];\n\tlong\tl;\n\tdouble\td;\n    } data;\n\n    data.d = i0;\n    jit_movi_l(JIT_RTEMP, data.l);\n    _DMTC1(JIT_RTEMP, f0);\n}\n\n#define jit_extr_l_f(f0, r0)\t\tmips_extr_l_f(_jit, f0, r0)\n__jit_inline void\nmips_extr_l_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    _DMTC1(r0, JIT_FTMP0);\n    _CVT_S_L(f0, JIT_FTMP0);\n}\n\n#define jit_extr_l_d(f0, r0)\t\tmips_extr_l_d(_jit, f0, r0)\n__jit_inline void\nmips_extr_l_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    _DMTC1(r0, JIT_FTMP0);\n    _CVT_D_L(f0, JIT_FTMP0);\n}\n\n#define jit_rintr_f_l(r0, f0)\t\tmips_rintr_f_l(_jit, r0, f0)\n__jit_inline void\nmips_rintr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CVT_L_S(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_rintr_d_l(r0, f0)\t\tmips_rintr_d_l(_jit, r0, f0)\n__jit_inline void\nmips_rintr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CVT_L_D(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_roundr_f_l(r0, f0)\t\tmips_roundr_f_l(_jit, r0, f0)\n__jit_inline void\nmips_roundr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if 0\t/* if round to nearest */\n    _ROUND_L_S(JIT_FTMP0, f0);\n#else\n    jit_insn\t*l;\n    _MTC1(JIT_RZERO, (jit_fpr_t)JIT_FTMP0);\n    jit_movi_i(JIT_RTEMP, 0xbf000000);\n    _MTC1(JIT_RTEMP, JIT_FTMP1);\n    _C_OLT_S(JIT_FTMP1, f0);\n    l = _jit->x.pc;\n    _BC1T(0);\n    jit_nop(1);\n    _NEG_S(JIT_FTMP1, JIT_FTMP1);\n    jit_patch(l);\n    _ADD_S(JIT_FTMP0, f0, JIT_FTMP1);\n    _TRUNC_L_S(JIT_FTMP0, JIT_FTMP0);\n#endif\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_roundr_d_l(r0, f0)\t\tmips_roundr_d_l(_jit, r0, f0)\n__jit_inline void\nmips_roundr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if 0\t/* if round to nearest */\n    _ROUND_L_D(JIT_FTMP0, f0);\n#else\n    jit_insn\t*l;\n    _MTC1(JIT_RZERO, (jit_fpr_t)JIT_FTMP0);\n    _MTC1(JIT_RZERO, (jit_fpr_t)(JIT_FTMP0 + 1));\n    jit_movi_i(JIT_RTEMP, 0xbfe00000);\n#if __BYTEORDER == __LITTLE_ENDIAN\n    _MTC1(JIT_RTEMP, JIT_FTMP1);\n    _MTC1(JIT_RZERO, (jit_fpr_t)(JIT_FTMP1 + 1));\n#else\n    _MTC1(JIT_RZERO, JIT_FTMP1);\n    _MTC1(JIT_RTEMP, (jit_fpr_t)(JIT_FTMP1 + 1));\n#endif\n    _C_OLT_D(JIT_FTMP1, f0);\n    l = _jit->x.pc;\n    _BC1T(0);\n    jit_nop(1);\n    _NEG_D(JIT_FTMP1, JIT_FTMP1);\n    jit_patch(l);\n    _ADD_D(JIT_FTMP0, f0, JIT_FTMP1);\n    _TRUNC_L_D(JIT_FTMP0, JIT_FTMP0);\n#endif\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_truncr_f_l(r0, f0)\t\tmips_truncr_f_l(_jit, r0, f0)\n__jit_inline void\nmips_truncr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _TRUNC_L_S(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_truncr_d_l(r0, f0)\t\tmips_truncr_d_l(_jit, r0, f0)\n__jit_inline void\nmips_truncr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _TRUNC_L_D(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_ceilr_f_l(r0, f0)\t\tmips_ceilr_f_l(_jit, r0, f0)\n__jit_inline void\nmips_ceilr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CEIL_L_S(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_ceilr_d_l(r0, f0)\t\tmips_ceilr_d_l(_jit, r0, f0)\n__jit_inline void\nmips_ceilr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CEIL_L_D(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_floorr_f_l(r0, f0)\t\tmips_floorr_f_l(_jit, r0, f0)\n__jit_inline void\nmips_floorr_f_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _FLOOR_L_S(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_floorr_d_l(r0, f0)\t\tmips_floorr_d_l(_jit, r0, f0)\n__jit_inline void\nmips_floorr_d_l(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _FLOOR_D_S(JIT_FTMP0, f0);\n    _DMFC1(r0, JIT_FTMP0);\n}\n\n#define jit_prepare_d(count)\t\tmips_prepare_d(_jit, count)\n#define jit_prepare_f(count)\t\tmips_prepare_d(_jit, count)\n__jit_inline void\nmips_prepare_d(jit_state_t _jit, int count)\n{\n    assert(count >= 0);\n    _jitl.nextarg_put += count;\n    _jitl.stack_offset = _jitl.nextarg_put << 3;\n    if (_jitl.stack_length < _jitl.stack_offset) {\n\t_jitl.stack_length = _jitl.stack_offset;\n\tmips_set_stack(_jit, (_jitl.alloca_offset +\n\t\t\t      _jitl.stack_length + 7) & ~7);\n    }\n}\n\n#define jit_arg_d()\t\t\tmips_arg_d(_jit)\n#define jit_arg_f()\t\t\tmips_arg_d(_jit)\n__jit_inline int\nmips_arg_d(jit_state_t _jit)\n{\n    int\t\tofs;\n    int\t\treg;\n\n    reg = (_jitl.framesize - JIT_FRAMESIZE) >> 3;\n    if (reg < JIT_A_NUM)\n\tofs = reg;\n    else\n\tofs = _jitl.framesize;\n    _jitl.framesize += sizeof(float);\n\n    return (ofs);\n}\n\n#define jit_getarg_d(f0, ofs)\t\tmips_getarg_d(_jit, f0, ofs)\n__jit_inline void\nmips_getarg_d(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_movr_d(f0, jit_fa_order[ofs]);\n    else\n\tjit_ldxi_d(f0, JIT_FP, ofs);\n}\n\n#define jit_getarg_f(f0, ofs)\t\tmips_getarg_f(_jit, f0, ofs)\n__jit_inline void\nmips_getarg_f(jit_state_t _jit, jit_fpr_t f0, int ofs)\n{\n    if (ofs < JIT_A_NUM)\n\tjit_movr_f(f0, jit_fa_order[ofs]);\n    else\n\tjit_ldxi_f(f0, JIT_FP, ofs);\n}\n\n#define jit_pusharg_d(f0)\t\tmips_pusharg_d(_jit, f0)\n__jit_inline void\nmips_pusharg_d(jit_state_t _jit, jit_fpr_t f0)\n{\n    _jitl.nextarg_put -= 1;\n    _jitl.stack_offset -= sizeof(double);\n    assert(_jitl.nextarg_put\t>= 0 &&\n\t   _jitl.stack_offset\t>= 0);\n    if (_jitl.nextarg_put >= JIT_A_NUM)\n\tjit_stxi_d(_jitl.stack_offset, JIT_SP, f0);\n    else {\n\tjit_movr_d(jit_fa_order[_jitl.nextarg_put], f0);\n\t_MFC1(jit_a_order[_jitl.nextarg_put], f0);\n\t_MFC1(jit_a_order[_jitl.nextarg_put + 1], (jit_fpr_t)(f0 + 1));\n    }\n}\n\n#define jit_pusharg_f(f0)\t\tmips_pusharg_f(_jit, f0)\n__jit_inline void\nmips_pusharg_f(jit_state_t _jit, jit_fpr_t f0)\n{\n    _jitl.nextarg_put -= 1;\n    _jitl.stack_offset -= sizeof(double);\n    assert(_jitl.nextarg_put\t>= 0 &&\n\t   _jitl.stack_offset\t>= 0);\n    if (_jitl.nextarg_put >= JIT_A_NUM)\n\tjit_stxi_f(_jitl.stack_offset, JIT_SP, f0);\n    else {\n\tjit_movr_f(jit_fa_order[_jitl.nextarg_put], f0);\n\t_MFC1(jit_a_order[_jitl.nextarg_put], f0);\n    }\n}\n\n#endif /* __lightning_fp_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/fp.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tFloating-point support (mips)\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation, Inc.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_fp_mips_h\n#define __lightning_fp_mips_h\n\n#define jit_movf_p()\t\t\tjit_cpu.movf\n#define jit_aligned_double_p()\t\tjit_cpu.algndbl\n#define next_fpr(fn)\t\t\t((jit_fpr_t)((fn) + 1))\n\n\n#define JIT_FPR_NUM\t\t\t6\nstatic const jit_fpr_t\njit_f_order[JIT_FPR_NUM] = {\n    _F0, _F2,  _F4,  _F6, _F8, _F10\n};\n\n#define JIT_FPR(n)\t\t\tjit_f_order[n]\n\n#define JIT_FPRET\t\t\t_F0\n\n#define JIT_FTMP0\t\t\t_F28\n#define JIT_FTMP1\t\t\t_F30\n\n#define jit_addr_f(f0, f1, f2)\t\t_ADD_S(f0, f1, f2)\n#define jit_addr_d(f0, f1, f2)\t\t_ADD_D(f0, f1, f2)\n#define jit_subr_f(f0, f1, f2)\t\t_SUB_S(f0, f1, f2)\n#define jit_subr_d(f0, f1, f2)\t\t_SUB_D(f0, f1, f2)\n#define jit_mulr_f(f0, f1, f2)\t\t_MUL_S(f0, f1, f2)\n#define jit_mulr_d(f0, f1, f2)\t\t_MUL_D(f0, f1, f2)\n#define jit_divr_f(f0, f1, f2)\t\t_DIV_S(f0, f1, f2)\n#define jit_divr_d(f0, f1, f2)\t\t_DIV_D(f0, f1, f2)\n#define jit_sqrtr_f(f0, f1)\t\t_SQRT_S(f0, f1)\n#define jit_sqrtr_d(f0, f1)\t\t_SQRT_D(f0, f1)\n#define jit_absr_f(f0, f1)\t\t_ABS_S(f0, f1)\n#define jit_absr_d(f0, f1)\t\t_ABS_D(f0, f1)\n\n#define jit_movr_f(f0, f1)\t\tmips_movr_f(_jit, f0, f1)\n__jit_inline void\nmips_movr_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 != f1)\n\t_MOV_S(f0, f1);\n}\n\n#define jit_movi_f(f0, i0)\t\tmips_movi_f(_jit, f0, i0)\n__jit_inline void\nmips_movi_f(jit_state_t _jit, jit_fpr_t f0, float i0)\n{\n    union {\n\tint\ti;\n\tfloat\tf;\n    } data;\n    data.f = i0;\n    if (data.i) {\n\tjit_movi_i(JIT_RTEMP, data.i);\n\t_MTC1(JIT_RTEMP, f0);\n    }\n    else\n\t_MTC1(JIT_RZERO, f0);\n}\n\n#define jit_movr_d(f0, f1)\t\tmips_movr_d(_jit, f0, f1)\n__jit_inline void\nmips_movr_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    if (f0 != f1)\n\t_MOV_D(f0, f1);\n}\n\n#define jit_negr_f(f0, f1)\t_NEG_S(f0, f1)\n#define jit_negr_d(f0, f1)\t_NEG_D(f0, f1)\n\n#define jit_ldr_f(f0, r0)\tmips_ldr_f(_jit, f0, r0)\n__jit_inline void\nmips_ldr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    _LWC1(f0, 0, r0);\n}\n\n#define jit_ldr_d(f0, r0)\tmips_ldr_d(_jit, f0, r0)\n__jit_inline void\nmips_ldr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    if (jit_aligned_double_p())\n\t_LDC1(f0, 0, r0);\n    else {\n\t_LWC1(f0, 0, r0);\n\t_LWC1(next_fpr(f0), 4, r0);\n    }\n}\n\n#define jit_ldi_f(f0, i0)\tmips_ldi_f(_jit, f0, i0)\n__jit_inline void\nmips_ldi_f(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_LWC1(f0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_LWC1(f0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldi_d(f0, i0)\t\tmips_ldi_d(_jit, f0, i0)\n__jit_inline void\nmips_ldi_d(jit_state_t _jit, jit_fpr_t f0, void *i0)\n{\n    long\tds = (long)i0;\n\n    if (jit_aligned_double_p()) {\n\tif (_s16P(ds))\n\t    _LDC1(f0, _jit_US(ds), JIT_RZERO);\n\telse {\n\t    jit_movi_i(JIT_RTEMP, ds);\n\t    _LDC1(f0, 0, JIT_RTEMP);\n\t}\n    }\n    else {\n\tif (_s16P(ds) && _s16P(ds + 4)) {\n\t    _LWC1(f0, _jit_US(ds), JIT_RZERO);\n\t    _LWC1(next_fpr(f0), _jit_US(ds + 4), JIT_RZERO);\n\t}\n\telse {\n\t    jit_movi_i(JIT_RTEMP, ds);\n\t    _LWC1(f0, 0, JIT_RTEMP);\n\t    _LWC1(next_fpr(f0), 4, JIT_RTEMP);\n\t}\n    }\n}\n\n#define jit_ldxr_f(f0, r0, r1)\t\tmips_ldxr_f(_jit, f0, r0, r1)\n__jit_inline void\nmips_ldxr_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_mips2_p())\n\t_LWXC1(f0, r1, r0);\n    else {\n\tjit_addr_i(JIT_RTEMP, r0, r1);\n\t_LWC1(f0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxr_d(f0, r0, r1)\t\tmips_ldxr_d(_jit, f0, r0, r1)\n__jit_inline void\nmips_ldxr_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, jit_gpr_t r1)\n{\n    if (jit_aligned_double_p()) {\n\tif (jit_mips2_p())\n\t    _LDXC1(f0, r1, r0);\n\telse {\n\t    jit_addr_i(JIT_RTEMP, r0, r1);\n\t    _LDC1(f0, 0, JIT_RTEMP);\n\t}\n    }\n    else {\n\tjit_addr_i(JIT_RTEMP, r0, r1);\n\t_LWC1(f0, 0, JIT_RTEMP);\n\t_LWC1(next_fpr(f0), 4, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxi_f(f0, r0, i0)\t\tmips_ldxi_f(_jit, f0, r0, i0)\n__jit_inline void\nmips_ldxi_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, long i0)\n{\n    if (_s16P(i0))\n\t_LWC1(f0, _jit_US(i0), r0);\n    else if (jit_mips2_p()) {\n\tjit_movi_i(JIT_RTEMP, i0);\n\t_LWXC1(f0, JIT_RTEMP, r0);\n    }\n    else {\n\tjit_addi_i(JIT_RTEMP, r0, i0);\n\t_LWC1(f0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_ldxi_d(f0, r0, i0)\t\tmips_ldxi_d(_jit, f0, r0, i0)\n__jit_inline void\nmips_ldxi_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0, long i0)\n{\n    if (jit_aligned_double_p()) {\n\tif (_s16P(i0))\n\t    _LDC1(f0, _jit_US(i0), r0);\n\telse if (jit_mips2_p()) {\n\t    jit_movi_i(JIT_RTEMP, i0);\n\t    _LDXC1(f0, JIT_RTEMP, r0);\n\t}\n\telse {\n\t    jit_addi_i(JIT_RTEMP, r0, i0);\n\t    _LDC1(f0, 0, JIT_RTEMP);\n\t}\n    }\n    else {\n\tif (_s16P(i0) && _s16P(i0 + 4)) {\n\t    _LWC1(f0, _jit_US(i0), r0);\n\t    _LWC1(next_fpr(f0), _jit_US(i0 + 4), r0);\n\t}\n\telse {\n\t    jit_addi_i(JIT_RTEMP, r0, i0);\n\t    _LWC1(f0, 0, JIT_RTEMP);\n\t    _LWC1(next_fpr(f0), 4, JIT_RTEMP);\n\t}\n    }\n\n}\n\n#define jit_str_f(r0, f0)\t\tmips_str_f(_jit, r0, f0)\n__jit_inline void\nmips_str_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _SWC1(f0, 0, r0);\n}\n\n#define jit_str_d(r0, f0)\t\tmips_str_d(_jit, r0, f0)\n__jit_inline void\nmips_str_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_aligned_double_p())\n\t_SDC1(f0, 0, r0);\n    else {\n\t_SWC1(f0, 0, r0);\n\t_SWC1(next_fpr(f0), 4, r0);\n    }\n}\n\n#define jit_sti_f(i0, f0)\t\tmips_sti_f(_jit, i0, f0)\n__jit_inline void\nmips_sti_f(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n    long\tds = (long)i0;\n\n    if (_s16P(ds))\n\t_SWC1(f0, _jit_US(ds), JIT_RZERO);\n    else {\n\tjit_movi_i(JIT_RTEMP, ds);\n\t_SWC1(f0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_sti_d(i0, f0)\t\tmips_sti_d(_jit, i0, f0)\n__jit_inline void\nmips_sti_d(jit_state_t _jit, void *i0, jit_fpr_t f0)\n{\n    long\tds = (long)i0;\n\n    if (jit_aligned_double_p()) {\n\tif (_s16P(ds))\n\t    _SDC1(f0, _jit_US(ds), JIT_RZERO);\n\telse {\n\t    jit_movi_i(JIT_RTEMP, ds);\n\t    _SDC1(f0, 0, JIT_RTEMP);\n\t}\n    }\n    else {\n\tif (_s16P(ds) && _s16P(ds + 4)) {\n\t    _SWC1(f0, _jit_US(ds), JIT_RZERO);\n\t    _SWC1(next_fpr(f0), _jit_US(ds + 4), JIT_RZERO);\n\t}\n\telse {\n\t    jit_movi_i(JIT_RTEMP, ds);\n\t    _SWC1(f0, 0, JIT_RTEMP);\n\t    _SWC1(next_fpr(f0), 4, JIT_RTEMP);\n\t}\n    }\n}\n\n#define jit_stxr_f(r0, r1, f0)\t\tmips_stxr_f(_jit, r0, r1, f0)\n__jit_inline void\nmips_stxr_f(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    if (jit_mips2_p())\n\t_SWXC1(f0, r1, r0);\n    else {\n\tjit_addr_i(JIT_RTEMP, r0, r1);\n\t_SWC1(f0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_stxr_d(r0, r1, f0)\t\tmips_stxr_d(_jit, r0, r1, f0)\n__jit_inline void\nmips_stxr_d(jit_state_t _jit, jit_gpr_t r0, jit_gpr_t r1, jit_fpr_t f0)\n{\n    if (jit_aligned_double_p()) {\n\tif (jit_mips2_p())\n\t    _SDXC1(f0, r1, r0);\n\telse {\n\t    jit_addr_i(JIT_RTEMP, r0, r1);\n\t    _SDC1(f0, 0, JIT_RTEMP);\n\t}\n    }\n    else {\n\tjit_addr_i(JIT_RTEMP, r0, r1);\n\t_SWC1(f0, 0, JIT_RTEMP);\n\t_SWC1(next_fpr(f0), 4, JIT_RTEMP);\n    }\n}\n\n#define jit_stxi_f(i0, r0, f0)\t\tmips_stxi_f(_jit, i0, r0, f0)\n__jit_inline void\nmips_stxi_f(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (_s16P(i0))\n\t_SWC1(f0, _jit_US(i0), r0);\n    else if (jit_mips2_p()) {\n\tjit_movi_i(JIT_RTEMP, i0);\n\t_SWXC1(f0, JIT_RTEMP, r0);\n    }\n    else {\n\tjit_addi_i(JIT_RTEMP, r0, i0);\n\t_SWC1(f0, 0, JIT_RTEMP);\n    }\n}\n\n#define jit_stxi_d(i0, r0, f0)\t\tmips_stxi_d(_jit, i0, r0, f0)\n__jit_inline void\nmips_stxi_d(jit_state_t _jit, int i0, jit_gpr_t r0, jit_fpr_t f0)\n{\n    if (jit_aligned_double_p()) {\n\tif (_s16P(i0))\n\t    _SDC1(f0, _jit_US(i0), r0);\n\telse if (jit_mips2_p()) {\n\t    jit_movi_i(JIT_RTEMP, i0);\n\t    _SDXC1(f0, JIT_RTEMP, r0);\n\t}\n\telse {\n\t    jit_addi_i(JIT_RTEMP, r0, i0);\n\t    _SDC1(f0, 0, JIT_RTEMP);\n\t}\n    }\n    else {\n\tif (_s16P(i0) && _s16P(i0 + 4)) {\n\t    _SWC1(f0, _jit_US(i0), r0);\n\t    _SWC1(next_fpr(f0), _jit_US(i0 + 4), r0);\n\t}\n\telse {\n\t    jit_addi_i(JIT_RTEMP, r0, i0);\n\t    _SWC1(f0, 0, JIT_RTEMP);\n\t    _SWC1(next_fpr(f0), 4, JIT_RTEMP);\n\t}\n\n    }\n}\n\n#define jit_extr_i_f(f0, r0)\t\tmips_extr_i_f(_jit, f0, r0)\n__jit_inline void\nmips_extr_i_f(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    _MTC1(r0, JIT_FTMP0);\n    _CVT_S_W(f0, JIT_FTMP0);\n}\n\n#define jit_extr_i_d(f0, r0)\t\tmips_extr_i_d(_jit, f0, r0)\n__jit_inline void\nmips_extr_i_d(jit_state_t _jit, jit_fpr_t f0, jit_gpr_t r0)\n{\n    _MTC1(r0, JIT_FTMP0);\n    _CVT_D_W(f0, JIT_FTMP0);\n}\n\n#define jit_extr_f_d(f0, r0)\t\tmips_extr_f_d(_jit, f0, r0)\n__jit_inline void\nmips_extr_f_d(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    _CVT_D_S(f0, f1);\n}\n\n#define jit_extr_d_f(f0, r0)\t\tmips_extr_d_f(_jit, f0, r0)\n__jit_inline void\nmips_extr_d_f(jit_state_t _jit, jit_fpr_t f0, jit_fpr_t f1)\n{\n    _CVT_S_D(f0, f1);\n}\n\n#define jit_roundr_f_i(r0, f0)\t\tmips_roundr_f_i(_jit, r0, f0)\n__jit_inline void\nmips_roundr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if 0\t/* if round to nearest */\n    _ROUND_W_S(JIT_FTMP0, f0);\n#else\n    jit_insn\t*l;\n    _MTC1(JIT_RZERO, (jit_fpr_t)JIT_FTMP0);\n    jit_movi_i(JIT_RTEMP, 0xbf000000);\n    _MTC1(JIT_RTEMP, JIT_FTMP1);\n    _C_OLT_S(f0, JIT_FTMP0);\n    l = _jit->x.pc;\n    _BC1T(0);\n    jit_nop(1);\n    _NEG_S(JIT_FTMP1, JIT_FTMP1);\n    jit_patch(l);\n    _ADD_S(JIT_FTMP0, f0, JIT_FTMP1);\n    _TRUNC_W_S(JIT_FTMP0, JIT_FTMP0);\n#endif\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_roundr_d_i(r0, f0)\t\tmips_roundr_d_i(_jit, r0, f0)\n__jit_inline void\nmips_roundr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n#if 0\t/* if round to nearest */\n    _ROUND_W_D(JIT_FTMP0, f0);\n#else\n    jit_insn\t*l;\n    _MTC1(JIT_RZERO, (jit_fpr_t)JIT_FTMP0);\n    _MTC1(JIT_RZERO, (jit_fpr_t)(JIT_FTMP0 + 1));\n    jit_movi_i(JIT_RTEMP, 0xbfe00000);\n#if __BYTEORDER == __LITTLE_ENDIAN\n    _MTC1(JIT_RTEMP, JIT_FTMP1);\n    _MTC1(JIT_RZERO, (jit_fpr_t)(JIT_FTMP1 + 1));\n#else\n    _MTC1(JIT_RZERO, JIT_FTMP1);\n    _MTC1(JIT_RTEMP, (jit_fpr_t)(JIT_FTMP1 + 1));\n#endif\n    _C_OLT_D(f0, JIT_FTMP0);\n    l = _jit->x.pc;\n    _BC1T(0);\n    jit_nop(1);\n    _NEG_D(JIT_FTMP1, JIT_FTMP1);\n    jit_patch(l);\n    _ADD_D(JIT_FTMP0, f0, JIT_FTMP1);\n    _TRUNC_W_D(JIT_FTMP0, JIT_FTMP0);\n#endif\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_rintr_f_i(r0, f0)\t\tmips_rintr_f_i(_jit, r0, f0)\n__jit_inline void\nmips_rintr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CVT_W_S(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_rintr_d_i(r0, f0)\t\tmips_rintr_d_i(_jit, r0, f0)\n__jit_inline void\nmips_rintr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CVT_W_D(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_truncr_f_i(r0, f0)\t\tmips_truncr_f_i(_jit, r0, f0)\n__jit_inline void\nmips_truncr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _TRUNC_W_S(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_truncr_d_i(r0, f0)\t\tmips_truncr_d_i(_jit, r0, f0)\n__jit_inline void\nmips_truncr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _TRUNC_W_D(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_ceilr_f_i(r0, f0)\t\tmips_ceilr_f_i(_jit, r0, f0)\n__jit_inline void\nmips_ceilr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CEIL_W_S(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_ceilr_d_i(r0, f0)\t\tmips_ceilr_d_i(_jit, r0, f0)\n__jit_inline void\nmips_ceilr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _CEIL_W_D(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_floorr_f_i(r0, f0)\t\tmips_floorr_f_i(_jit, r0, f0)\n__jit_inline void\nmips_floorr_f_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _FLOOR_W_S(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_floorr_d_i(r0, f0)\t\tmips_floorr_d_i(_jit, r0, f0)\n__jit_inline void\nmips_floorr_d_i(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0)\n{\n    _FLOOR_W_D(JIT_FTMP0, f0);\n    _MFC1(r0, JIT_FTMP0);\n}\n\n#define jit_ltr_f(r0, f0, f1)\t\tmips_ltr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_ltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLT_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ltr_d(r0, f0, f1)\t\tmips_ltr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_ltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLT_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ler_f(r0, f0, f1)\t\tmips_ler_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_ler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLE_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ler_d(r0, f0, f1)\t\tmips_ler_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_ler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLE_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_eqr_f(r0, f0, f1)\t\tmips_eqr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_eqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_EQ_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_eqr_d(r0, f0, f1)\t\tmips_eqr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_eqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_EQ_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ger_f(r0, f0, f1)\t\tmips_ger_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_ger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULT_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ger_d(r0, f0, f1)\t\tmips_ger_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_ger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULT_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_gtr_f(r0, f0, f1)\t\tmips_gtr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_gtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULE_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_gtr_d(r0, f0, f1)\t\tmips_gtr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_gtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULE_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ner_f(r0, f0, f1)\t\tmips_ner_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_ner_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_EQ_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ner_d(r0, f0, f1)\t\tmips_ner_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_ner_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_EQ_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unltr_f(r0, f0, f1)\t\tmips_unltr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_unltr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULT_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unltr_d(r0, f0, f1)\t\tmips_unltr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_unltr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULT_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unler_f(r0, f0, f1)\t\tmips_unler_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_unler_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULE_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unler_d(r0, f0, f1)\t\tmips_unler_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_unler_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_ULE_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_uneqr_f(r0, f0, f1)\t\tmips_uneqr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_uneqr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UEQ_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_uneqr_d(r0, f0, f1)\t\tmips_uneqr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_uneqr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UEQ_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unger_f(r0, f0, f1)\t\tmips_unger_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_unger_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLT_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unger_d(r0, f0, f1)\t\tmips_unger_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_unger_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLT_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ungtr_f(r0, f0, f1)\t\tmips_ungtr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_ungtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLE_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ungtr_d(r0, f0, f1)\t\tmips_ungtr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_ungtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_OLE_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ltgtr_f(r0, f0, f1)\t\tmips_ltgtr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_ltgtr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UEQ_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ltgtr_d(r0, f0, f1)\t\tmips_ltgtr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_ltgtr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UEQ_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ordr_f(r0, f0, f1)\t\tmips_ordr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_ordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UN_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_ordr_d(r0, f0, f1)\t\tmips_ordr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_ordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UN_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVT(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1F(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unordr_f(r0, f0, f1)\tmips_unordr_f(_jit, r0, f0, f1)\n__jit_inline void\nmips_unordr_f(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UN_S(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_unordr_d(r0, f0, f1)\tmips_unordr_d(_jit, r0, f0, f1)\n__jit_inline void\nmips_unordr_d(jit_state_t _jit, jit_gpr_t r0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    if (jit_movf_p())\n\tjit_movi_i(r0, 1);\n    _C_UN_D(f0, f1);\n    if (jit_movf_p())\n\t_MOVF(r0, JIT_RZERO);\n    else {\n\tl = _jit->x.pc;\n\t_BC1T(0);\n\n\t/*delay*/\n\tjit_movi_i(r0, 1);\n\n\tjit_movi_i(r0, 0);\n\tjit_patch(l);\n    }\n}\n\n#define jit_bltr_f(i0, f0, f1)\t\tmips_bltr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bltr_f(jit_state_t _jit, jit_insn *i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLT_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bltr_d(i0, f0, f1)\t\tmips_bltr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bltr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLT_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bler_f(i0, f0, f1)\t\tmips_bler_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bler_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLE_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bler_d(i0, f0, f1)\t\tmips_bler_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bler_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLE_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_beqr_f(i0, f0, f1)\t\tmips_beqr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_beqr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_EQ_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_beqr_d(i0, f0, f1)\t\tmips_beqr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_beqr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_EQ_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bger_f(i0, f0, f1)\t\tmips_bger_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bger_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULT_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bger_d(i0, f0, f1)\t\tmips_bger_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bger_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULT_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bgtr_f(i0, f0, f1)\t\tmips_bgtr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bgtr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULE_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bgtr_d(i0, f0, f1)\t\tmips_bgtr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bgtr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULE_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bner_f(i0, f0, f1)\t\tmips_bner_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bner_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_EQ_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bner_d(i0, f0, f1)\t\tmips_bner_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bner_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_EQ_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunltr_f(i0, f0, f1)\tmips_bunltr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunltr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULT_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunltr_d(i0, f0, f1)\tmips_bunltr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunltr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULT_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunler_f(i0, f0, f1)\tmips_bunler_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunler_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULE_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunler_d(i0, f0, f1)\tmips_bunler_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunler_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_ULE_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_buneqr_f(i0, f0, f1)\tmips_buneqr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_buneqr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UEQ_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_buneqr_d(i0, f0, f1)\tmips_buneqr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_buneqr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UEQ_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunger_f(i0, f0, f1)\tmips_bunger_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunger_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLT_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunger_d(i0, f0, f1)\tmips_bunger_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunger_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLT_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bungtr_f(i0, f0, f1)\tmips_bungtr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bungtr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLE_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bungtr_d(i0, f0, f1)\tmips_bungtr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bungtr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_OLE_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bltgtr_f(i0, f0, f1)\tmips_bltgtr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bltgtr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UEQ_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bltgtr_d(i0, f0, f1)\tmips_bltgtr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bltgtr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UEQ_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bordr_f(i0, f0, f1)\t\tmips_bordr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bordr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UN_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bordr_d(i0, f0, f1)\t\tmips_bordr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bordr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UN_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1F(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunordr_f(i0, f0, f1)\tmips_bunordr_f(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunordr_f(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UN_S(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#define jit_bunordr_d(i0, f0, f1)\tmips_bunordr_d(_jit, i0, f0, f1)\n__jit_inline jit_insn *\nmips_bunordr_d(jit_state_t _jit, jit_insn * i0, jit_fpr_t f0, jit_fpr_t f1)\n{\n    jit_insn\t*l;\n    long\t d;\n    _C_UN_D(f0, f1);\n    l = _jit->x.pc;\n    d = (((long)i0 - (long)l) >> 2) - 1;\n    assert(_s16P(d));\n    _BC1T(_jit_US(d));\n    jit_nop(1);\n    return (l);\n}\n\n#if LIGHTNING_CROSS \\\n\t? LIGHTNING_TARGET == LIGHTNING_MIPS64 \\\n\t: defined (__mips64)\n#  include \"fp-64.h\"\n#else\n#  include \"fp-32.h\"\n#endif\n\n#endif /* __lightning_fp_mips_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/mips/funcs.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the mips\n *\n ***********************************************************************/\n\n/***********************************************************************\n *\n * Copyright 2010 Free Software Foundation\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n * Authors:\n *\tPaulo Cesar Pereira de Andrade\n ***********************************************************************/\n\n#ifndef __lightning_funcs_h\n#define __lightning_funcs_h\n\n#if defined(__linux__)\n#  include <stdio.h>\n#  include <string.h>\n#endif\n\n#include <unistd.h>\n#include <sys/mman.h>\n\n#if defined(__linux__)\n#  include <sys/cachectl.h>\n#endif\n\n// static void\n// jit_flush_code(void *start, void *end)\n// {\n    // mprotect(start, (char*)end - (char*)start,\n\t     // PROT_READ | PROT_WRITE | PROT_EXEC);\n// #if defined(__linux__)\n    // _flush_cache(start, (long)end - (long)start, ICACHE);\n// #endif\n// }\n\n#define jit_get_cpu\t\t\tjit_get_cpu\n__jit_constructor static void\njit_get_cpu(void)\n{\n#if defined(__linux__)\n    /* adapted from <gcc-base>/gcc/config/mips/driver-native.c */\n    char\t buf[128];\n    FILE\t*fp;\n    static int\t initialized;\n\n    if (initialized)\n\treturn;\n    initialized = 1;\n    if ((fp = fopen (\"/proc/cpuinfo\", \"r\")) == NULL)\n\treturn;\n\n    while (fgets(buf, sizeof (buf), fp)) {\n\tif (strncmp(buf, \"cpu model\", sizeof(\"cpu model\") - 1) == 0) {\n\t    if (strstr(buf, \"Godson2 V0.2\") ||\n\t\tstrstr(buf, \"Loongson-2 V0.2\")) {\n\t\t/* loongson2e */\n\t\tjit_cpu.mips64 = 1;\n\t    }\n\t    else if (strstr(buf, \"Godson2 V0.3\") ||\n\t\t     strstr(buf, \"Loongson-2 V0.3\")) {\n\t\t/* loongson2f */\n\t\tjit_cpu.mips64\t= 1;\n\t    }\n\t    else if (strstr(buf, \"SiByte SB1\"))\n\t\t/* sb1 */;\n\t    else if(strstr (buf, \"R5000\"))\n\t\t/* r5000 */;\n\t    else if(strstr(buf, \"Octeon\"))\n\t\t/* octeon */;\n\t    break;\n\t}\n    }\n    fclose(fp);\n#endif\n\n#if __WORDSIZE == 64\n    jit_cpu.algndbl = 1;\n#endif\n}\n\n#endif /* __lightning_funcs_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/ppc/asm.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the PowerPC\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 1999, 2000, 2001, 2002 Ian Piumarta\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n#ifndef __lightning_asm_h\n#define __lightning_asm_h\n\n/* <imm> = [0-9]+ | (.+)\t-> add i, one parameter (imm)\n * <reg> = r<imm>\t\t-> add r, one parameter (imm)\n * <mem> = <imm>(<reg>)\t\t-> add m, two parameters (imm,reg)\n * <idx> = <reg>(<reg>)\t\t-> add x, two parameters (reg,reg)\n *\n * `x' operands have two forms. For example `stwu source, rega(regb)'\n * could be written as either\n *\tSTWUrx(source, rega, regb)\n * or\n *\tSTWUXrrr(source, rega, regb)\n */\n\n\n\n/*** a brief NOTE about halfwords and \"shifted\" operands\n *\n * LOGICAL insns require UNSIGNED args in 0..65535, whether or not shifted\n *\n * ARITHMETIC insns require SIGNED args in -32768..32767, even when shifted\n * \n * as a special case: \"lis/addis\" also accepts UNSIGNED arguments in\n * 0..65535 since it is often used immediately before \"ori\" to load a 32-bit\n * constant (this is consistent with the GNU rs/6000 and PowerPC assemblers)\n * \n * thus:\tlis\trD, expression@hi\n *\t\tori\trD, rD, expression@lo\t; load 32-bit constant\n */\n\n#ifndef LIGHTNING_DEBUG\n#define _cr0\t0\n#define _cr1\t1\n#define _cr2\t2\n#define _cr3\t3\n#define _cr4\t4\n#define _cr5\t5\n#define _cr6\t6\n#define _cr7\t7\n\n#define _lt\t0\n#define _gt\t1\n#define _eq\t2\n#define _so\t3\n#define _un\t3\n\n#define _d16(D)\t\t(_ck_d(16,(_jit_UL(D)-_jit_UL(_jit->x.pc))) & ~3)\n#define _d26(D)\t\t(_ck_d(26,(_jit_UL(D)-_jit_UL(_jit->x.pc))) & ~3)\n\n/* primitive instruction forms [1, Section A.4] */\n\n#define _FB(  OP,         BD,AA,LK )    (_jit_I_noinc((_u6(OP)<<26)|                                            _d26(BD)|     (_u1(AA)<<1)|_u1(LK)), _jit->x.ui_pc++, 0)\n#define _FBA( OP,         BD,AA,LK )\t_jit_I((_u6(OP)<<26)|                                           (_u26(BD)&~3)| (_u1(AA)<<1)|_u1(LK))\n#define _BB(   OP,BO,BI,   BD,AA,LK )   (_jit_I_noinc((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|                _d16(BD)|     (_u1(AA)<<1)|_u1(LK)), _jit->x.ui_pc++, 0)\n#define _D(   OP,RD,RA,         DD )  \t_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                _s16(DD)                          )\n#define _Du(  OP,RD,RA,         DD )  \t_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                _u16(DD)                          )\n#define _Ds(  OP,RD,RA,         DD )  \t_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                _su16(DD)                         )\n#define _X(   OP,RD,RA,RB,   XO,RC )  \t_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|              (_u10(XO)<<1)|_u1(RC))\n#define _XL(  OP,BO,BI,      XO,LK )  \t_jit_I((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|( _u5(00)<<11)|              (_u10(XO)<<1)|_u1(LK))\n#define _XFX( OP,RD,         SR,XO )  \t_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|              (_u10(SR)<<11)|              (_u10(XO)<<1)|_u1(00))\n#define _XO(  OP,RD,RA,RB,OE,XO,RC )  \t_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|(_u1(OE)<<10)|( _u9(XO)<<1)|_u1(RC))\n#define _M(   OP,RS,RA,SH,MB,ME,RC )  \t_jit_I((_u6(OP)<<26)|(_u5(RS)<<21)|(_u5(RA)<<16)|( _u5(SH)<<11)|(_u5(MB)<< 6)|( _u5(ME)<<1)|_u1(RC))\n\n\n/* special purpose registers (form XFX) [1, Section 8.2, page 8-138] */\n\n#define SPR_LR\t\t((8<<5)|(0))\n\n/* +++ intrinsic instructions */\n\n#define ADDrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 266, 0)\n#define ADD_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 266, 1)\n#define ADDCrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 10, 0)\n#define ADDC_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 10, 1)\n#define ADDErrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 138, 0)\n#define ADDE_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 138, 1)\n#define ADDOrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 266, 0)\n#define ADDO_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 266, 1)\n#define ADDIrri(RD, RA, IMM)\t\t_D\t(14, RD, RA, IMM)\n#define ADDICrri(RD, RA, IMM)\t\t_D\t(12, RD, RA, IMM)\n#define ADDIC_rri(RD, RA, IMM)\t\t_D\t(13, RD, RA, IMM)\n#define ADDISrri(RD, RA, IMM)\t\t_Ds\t(15, RD, RA, IMM)\n\n#define ANDrrr(RA, RS, RB)\t\t_X\t(31, RS, RA, RB,  28, 0)\n#define AND_rrr(RA, RS, RB)\t\t_X\t(31, RS, RA, RB,  28, 1)\n#define ANDCrrr(RA, RS, RB)\t\t_X\t(31, RS, RA, RB,  60, 0)\n#define ANDC_rrr(RA, RS, RB)\t\t_X\t(31, RS, RA, RB,  60, 1)\n#define ANDI_rri(RA, RS, IMM)\t\t_Du\t(28, RS, RA, IMM)\n#define ANDIS_rri(RA, RS, IMM)\t\t_Du\t(29, RS, RA, IMM)\n\n#define Bi(BD)\t\t\t\t_FB\t(18, BD, 0, 0)\n#define BAi(BD)\t\t\t\t_FBA\t(18, BD, 1, 0)\n#define BLi(BD)\t\t\t\t_FB     (18, BD, 0, 1)\n#define BLAi(BD)\t\t\t_FBA\t(18, BD, 1, 1)\n\n#define BCiii(BO,BI,BD)\t\t\t_BB\t(16, BO, BI, BD, 0, 0)\n#define BCAiii(BO,BI,BD)\t\t_BB\t(16, BO, BI, BD, 1, 0)\n#define BCLiii(BO,BI,BD)\t\t_BB\t(16, BO, BI, BD, 0, 1)\n#define BCLAiii(BO,BI,BD)\t\t_BB\t(16, BO, BI, BD, 1, 1)\n\n#define BCCTRii(BO,BI)\t\t\t_XL\t(19, BO, BI, 528, 0)\n#define BCCTRLii(BO,BI)\t\t\t_XL\t(19, BO, BI, 528, 1)\n\n#define BCLRii(BO,BI)\t\t\t_XL\t(19, BO, BI,  16, 0)\n#define BCLRLii(BO,BI)\t\t\t_XL\t(19, BO, BI,  16, 1)\n\n#define CMPiirr(CR, LL, RA, RB)\t\t_X\t(31, ((CR)<<2)|(LL), RA, RB, 0, 0)\n#define CMPIiiri(CR, LL, RA, IMM)\t_D\t(11, ((CR)<<2)|(LL), RA, IMM)\n\n#define CMPLiirr(CR, LL, RA, RB)\t_X\t(31, ((CR)<<2)|(LL), RA, RB, 32, 0)\n#define CMPLIiiri(CR, LL, RA, IMM)\t_D\t(10, ((CR)<<2)|(LL), RA, IMM)\n\n#define CRANDiii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB, 257, 0)\n#define CRANDCiii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB, 129, 0)\n#define CREQViii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB, 289, 0)\n#define CRNANDiii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB, 225, 0)\n#define CRNORiii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB,  33, 0)\n#define CRORiii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB, 449, 0)\n#define CRORCiii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB, 417, 0)\n#define CRXORiii(CRD,CRA,CRB)\t\t_X\t(19, CRD, CRA, CRB, 193, 0)\n\n#define DCBSTrr(RA,RB)\t\t\t_X\t(31, 00, RA, RB,  54, 0)\n\n#define DIVWrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 491, 0)\n#define DIVW_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 491, 1)\n#define DIVWOrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 491, 0)\n#define DIVWO_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 491, 1)\n\n#define DIVWUrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 459, 0)\n#define DIVWU_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 459, 1)\n#define DIVWUOrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 459, 0)\n#define DIVWUO_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 459, 1)\n\n#define EQVrrr(Ra,RS,RB)\t\t_X\t(31, RS, RA, RB, 284, 0)\n#define EQV_rrr(Ra,RS,RB)\t\t_X\t(31, RS, RA, RB, 284, 1)\n\n#define EXTSBrr(RA,RS)\t\t\t_X\t(31, RS, RA,  0, 954, 0)\n#define EXTSB_rr(RA,RS)\t\t\t_X\t(31, RS, RA,  0, 954, 1)\n\n#define EXTSHrr(RA,RS)\t\t\t_X\t(31, RS, RA,  0, 922, 0)\n#define EXTSH_rr(RA,RS)\t\t\t_X\t(31, RS, RA,  0, 922, 1)\n\n#define ICBIrr(RA,RB)\t\t\t_X\t(31, 00, RA, RB, 982, 0)\n\n#define ISYNC()\t\t\t\t_X\t(19, 00, 00, 00, 150, 0)\n\n#define LBZrm(RD,ID,RA)\t\t\t_Ds\t(34, RD, RA, ID)\n#define LBZUrm(RD,ID,RA)\t\t_Ds\t(35, RD, RA, ID)\n#define LBZUXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB, 119, 0)\n#define LBZXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB,  87, 0)\n\n#define LHArm(RD,ID,RA)\t\t\t_Ds\t(42, RD, RA, ID)\n#define LHAUrm(RD,ID,RA)\t\t_Ds\t(43, RD, RA, ID)\n#define LHAUXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB, 375, 0)\n#define LHAXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB, 343, 0)\n#define LHBRXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB, 790, 0)\n\n#define LHZrm(RD,ID,RA)\t\t\t_Ds\t(40, RD, RA, ID)\n#define LHZUrm(RD,ID,RA)\t\t_Ds\t(41, RD, RA, ID)\n#define LHZUXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB, 311, 0)\n#define LHZXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB, 279, 0)\n\n#define LMWrm(RD,ID,RA)\t\t\t_D\t(46, RD, RA, ID)\n\n#define LWBRXrrr(RD,RA,RB)\t\t_X\t(31, RD, RA, RB, 534, 0)\n\n#define LWZrm(RD, DISP, RA)\t\t_Ds\t(32, RD, RA, DISP)\n#define LWZUrm(RD, DISP, RA)\t\t_Ds\t(33, RD, RA, DISP)\n#define LWZUXrrr(RD, RA, RB)\t\t_X\t(31, RD, RA, RB,  56, 0)\n#define LWZXrrr(RD, RA, RB)\t\t_X\t(31, RD, RA, RB,  23, 0)\n\n#define MCRFii(CD,CS)\t\t\t_X\t(19, ((CD)<<2), ((CS)<<2), 0, 0, 0)\n\n#define MFCRr(RD)\t\t\t_X\t(31, RD, 0, 0, 19, 0)\n#define MCRXRi(RD) \t\t\t_XFX\t(31, (RD)<<2,   0, 512)\n\n#define MFSPRri(RD, SPR)\t\t_XFX\t(31, RD, (SPR)<<5, 339)\n#define MTSPRir(SPR, RS)\t\t_XFX\t(31, RS, (SPR)<<5, 467)\n\n#define MULHWrrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 0,  75, 0)\n#define MULHW_rrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 0,  75, 1)\n#define MULHWUrrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 0,  11, 0)\n#define MULHWU_rrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 0,  11, 1)\n\n#define MULLIrri(RD,RA,IM)\t\t_D\t(07, RD, RA, IM)\n\n#define MULLWrrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 0, 235, 0)\n#define MULLW_rrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 0, 235, 1)\n#define MULLWOrrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 1, 235, 0)\n#define MULLWO_rrr(RD,RA,RB)\t\t_XO\t(31, RD, RA, RB, 1, 235, 1)\n\n#define NANDrrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 476, 0)\n#define NAND_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 476, 1)\n\n#define NEGrr(RD,RA)\t\t\t_XO\t(31, RD, RA, 0, 0, 104, 0)\n#define NEG_rr(RD,RA)\t\t\t_XO\t(31, RD, RA, 0, 0, 104, 1)\n#define NEGOrr(RD,RA)\t\t\t_XO\t(31, RD, RA, 0, 1, 104, 0)\n#define NEGO_rr(RD,RA)\t\t\t_XO\t(31, RD, RA, 0, 1, 104, 1)\n\n#define NORrrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 124, 0)\n#define NOR_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 124, 1)\n\n#define ORrrr(RA,RS,RB)\t\t\t_X\t(31, RS, RA, RB, 444, 0)\n#define OR_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 444, 1)\n#define ORCrrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 412, 0)\n#define ORC_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 412, 1)\n#define ORIrri(RA,RS,IM)\t\t_Du\t(24, RS, RA, IM)\n#define ORISrri(RA,RS,IM)\t\t_Du\t(25, RS, RA, IM)\n\n#define RLWIMIrriii(RA,RS,SH,MB,ME)\t_M\t(20, RS, RA, SH, MB, ME, 0)\n#define RLWIMI_rriii(RA,RS,SH,MB,ME)\t_M\t(20, RS, RA, SH, MB, ME, 1)\n\n#define RLWINMrriii(RA,RS,SH,MB,ME)\t_M\t(21, RS, RA, SH, MB, ME, 0)\n#define RLWINM_rriii(RA,RS,SH,MB,ME)\t_M\t(21, RS, RA, SH, MB, ME, 1)\n\n#define RLWNMrrrii(RA,RS,RB,MB,ME)\t_M\t(23, RS, RA, RB, MB, ME, 0)\n#define RLWNM_rrrii(RA,RS,RB,MB,ME)\t_M\t(23, RS, RA, RB, MB, ME, 1)\n\n#define SLWrrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB,  24, 0)\n#define SLW_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB,  24, 1)\n\n#define SRAWrrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 792, 0)\n#define SRAW_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 792, 1)\n\n#define SRAWIrri(RD, RS, SH)\t\t_X\t(31, RS, RD, SH, 824, 0)\n#define SRAWI_rri(RD, RS, SH)\t\t_X\t(31, RS, RD, SH, 824, 1)\n\n#define SRWrrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 536, 0)\n#define SRW_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 536, 1)\n\n#define STBrm(RS,ID,RA)\t\t\t_Ds\t(38, RS, RA, ID)\n#define STBUrm(RS,ID,RA)\t\t_Ds\t(39, RS, RA, ID)\n#define STBUXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 247, 0)\n#define STBXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 215, 0)\n\n#define STHrm(RS,ID,RA)\t\t\t_Ds\t(44, RS, RA, ID)\n#define STHUrm(RS,ID,RA)\t\t_Ds\t(45, RS, RA, ID)\n#define STHBRXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 918, 0)\n#define STHUXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 439, 0)\n#define STHXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 407, 0)\n\n#define STMWrm(RS,ID,RA)\t\t_D\t(47, RS, RA, ID)\n\n#define STWrm(RS,ID,RA)\t\t\t_Ds\t(36, RS, RA, ID)\n#define STWBRXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 662, 0)\n#define STWCXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 150, 0)\n#define STWCX_rrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 150, 1)\n#define STWUrm(RS,ID,RA)\t\t_Ds\t(37, RS, RA, ID)\n#define STWUXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 183, 0)\n#define STWXrrr(RS,RA,RB)\t\t_X\t(31, RS, RA, RB, 151, 0)\n\n#define SUBFrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 40, 0)\n#define SUBF_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 40, 1)\n#define SUBFOrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 40, 0)\n#define SUBFO_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 40, 1)\n#define SUBFErrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 136, 0)\n#define SUBFE_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 136, 1)\n#define SUBFEOrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 136, 0)\n#define SUBFEO_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 136, 1)\n#define SUBFCrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0,  8, 0)\n#define SUBFC_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0,  8, 1)\n#define SUBFCOrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1,  8, 0)\n#define SUBFCO_rrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1,  8, 1)\n#define SUBFICrri(RD, RA, IMM)\t\t_D\t(8, RD, RA, IMM)\n\n#define ADDrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 0, 266, 0)\n#define ADDOrrr(RD, RA, RB)\t\t_XO\t(31, RD, RA, RB, 1, 266, 0)\n#define ADDIrri(RD, RA, IMM)\t\t_D\t(14, RD, RA, IMM)\n#define ADDISrri(RD, RA, IMM)\t\t_Ds\t(15, RD, RA, IMM)\n\n#define SYNC()\t\t\t\t_X\t(31, 00, 00, 00, 598, 0)\n\n#define TWirr(TO,RA,RB)\t\t\t_X\t(31, TO, RA, RB,   4, 0)\n#define TWIiri(TO,RA,IM)\t\t_D\t(03, TO, RA, IM)\n\n#define XORrrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 316, 0)\n#define XOR_rrr(RA,RS,RB)\t\t_X\t(31, RS, RA, RB, 316, 1)\n#define XORIrri(RA,RS,IM)\t\t_Du\t(26, RS, RA, IM)\n#define XORISrri(RA,RS,IM)\t\t_Du\t(27, RS, RA, IM)\n\n/* simplified mnemonics [1, Appendix F] */\n\n#define MOVEIri2(R,H,L)\t\t\t(LISri(R,H), (L ? ORIrri(R,R,L) : 0))\n#define MOVEIri(R,I)\t\t\t(_siP(16,I) ? LIri(R,I) :\t\\\n\t\t\t\t\tMOVEIri2(R, _HI(I), _LO(I)) )\n\n#define SUBIrri(RD,RA,IM)\t\tADDIrri(RD,RA,_LO(-(IM)))\t/* [1, Section F.2.1] */\n#define SUBISrri(RD,RA,IM)\t\tADDISrri(RD,RA,_LO(-(IM)))\n#define SUBICrri(RD,RA,IM)\t\tADDICrri(RD,RA,_LO(-(IM)))\n#define SUBIC_rri(RD,RA,IM)\t\tADDIC_rri(RD,RA,_LO(-(IM)))\n\n#define SUBrrr(RD,RA,RB)\t\tSUBFrrr(RD,RB,RA)\t/* [1, Section F.2.2] */\n#define SUBOrrr(RD,RA,RB)\t\tSUBFOrrr(RD,RB,RA)\n#define SUB_rrr(RD,RA,RB)\t\tSUBF_rrr(RD,RB,RA)\n#define SUBO_rrr(RD,RA,RB)\t\tSUBFO_rrr(RD,RB,RA)\n#define SUBCrrr(RD,RA,RB)\t\tSUBFCrrr(RD,RB,RA)\n#define SUBCOrrr(RD,RA,RB)\t\tSUBFCOrrr(RD,RB,RA)\n#define SUBC_rrr(RD,RA,RB)\t\tSUBFC_rrr(RD,RB,RA)\n#define SUBErrr(RD,RA,RB)\t\tSUBFErrr(RD,RB,RA)\n#define SUBE_rrr(RD,RA,RB)\t\tSUBFE_rrr(RD,RB,RA)\n\n#define CMPWIiri(C,RA,IM)\t\tCMPIiiri(C,0,RA,IM)\t/* [1, Table F-2] */\n#define CMPWirr(C,RA,RB)\t\tCMPiirr(C,0,RA,RB)\n#define CMPLWIiri(C,RA,IM)\t\tCMPLIiiri(C,0,RA,IM)\n#define CMPLWirr(C,RA,RB)\t\tCMPLiirr(C,0,RA,RB)\n\n#define CMPWIri(RA,IM)\t\t\tCMPWIiri(0,RA,IM)\t/* with implicit _cr0 */\n#define CMPWrr(RA,RB)\t\t\tCMPWirr(0,RA,RB)\n#define CMPLWIri(RA,IM)\t\t\tCMPLWIiri(0,RA,IM)\n#define CMPLWrr(RA,RB)\t\t\tCMPLWirr(0,RA,RB)\n\n#define EXTLWIrrii(RA,RS,N,B)\t\tRLWINMrriii(RA, RS,            B,\t0,     (N)-1)\t/* [1, Table F-3] */\n#define EXTRWIrrii(RA,RS,N,B)\t\tRLWINMrriii(RA, RS,      (B)+(N),  32-(N),        31)\n#define INSLWIrrii(RA,RS,N,B)\t\tRLWIMIrriii(RA, RS,       32-(B),\tB, (B)+(N)-1)\n#define INSRWIrrii(RA,RS,N,B)\t\tRLWIMIrriii(RA, RS, 32-((B)+(N)),\tB, (B)+(N)-1)\n#define ROTLWIrri(RA,RS,N)\t\tRLWINMrriii(RA, RS,            N,\t0,        31)\n#define ROTRWIrri(RA,RS,N)\t\tRLWINMrriii(RA, RS,       32-(N),\t0,        31)\n#define ROTLWrrr(RA,RS,RB)\t\tRLWNMrrrii( RA, RS,           RB,\t0,        31)\n#define SLWIrri(RA,RS,N)\t\tRLWINMrriii(RA, RS,            N,\t0,    31-(N))\n#define SRWIrri(RA,RS,N)\t\tRLWINMrriii(RA, RS,       32-(N),\tN,        31)\n#define CLRLWIrri(RA,RS,N)\t\tRLWINMrriii(RA, RS,            0,\tN,        31)\n#define CLRRWIrri(RA,RS,N)\t\tRLWINMrriii(RA, RS,            0,\t0,    31-(N))\n#define CLRLSLWIrrii(RA,RS,B,N)\t\tRLWINMrriii(RA, RS,            N, (B)-(N),    31-(N))\n\n\n/* 9 below inverts the branch condition and the branch prediction.\n * This has an incestuous knowledge of JIT_AUX */\n#define BC_EXT(A, C, D)  (_siP(16, _jit_UL(D)-_jit_UL(_jit->x.pc)) \\\n  ? BCiii((A), (C), (D)) \\\n  : (BCiii((A)^9, (C), _jit->x.ui_pc+5), \\\n     LISri(JIT_AUX,_HI(D)), \\\n     ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \\\n     MTLRr(JIT_AUX), BLR() ))\n\n#define B_EXT(D)         (_siP(16, _jit_UL(D)-_jit_UL(_jit->x.pc)) \\\n  ? Bi((D)) \\\n  : (LISri(JIT_AUX,_HI(D)), \\\n     ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \\\n     MTLRr(JIT_AUX), BLR()) )\n\n#define BTii(C,D)\t\t\tBC_EXT(12, C, D)\t\t/* [1, Table F-5] */\n#define BFii(C,D)\t\t\tBC_EXT( 4, C, D)\n#define BDNZi(D)\t\t\tBCiii(16, 0, D)\n#define BDNZTii(C,D)\t\t\tBC_EXT( 8, C, D)\n#define BDNZFii(C,D)\t\t\tBC_EXT( 0, C, D)\n#define BDZi(D)\t\t\t\tBCiii(18, 0, D)\n#define BDZTii(C,D)\t\t\tBC_EXT(10, C, D)\n#define BDZFii(C,D)\t\t\tBC_EXT( 2, C, D)\n\t\t\n#define BCTR()\t\t\t\tBCCTRii(20, 0)\t\t/* [1, Table F-6] */\n#define BCTRL()\t\t\t\tBCCTRLii(20, 0)\n\t\t\n#define BLR()\t\t\t\tBCLRii(20, 0)\t\t/* [1, Table F-6] */\n#define BLRL()\t\t\t\tBCLRLii(20, 0)\n\t\t\n\n#define BLTLRi(CR)\t\t\tBCLRii(12, ((CR)<<2)+0)\t/* [1, Table F-10] */\n#define BLELRi(CR)\t\t\tBCLRii( 4, ((CR)<<2)+1)\n#define BEQLRi(CR)\t\t\tBCLRii(12, ((CR)<<2)+2)\n#define BGELRi(CR)\t\t\tBCLRii( 4, ((CR)<<2)+0)\n#define BGTLRi(CR)\t\t\tBCLRii(12, ((CR)<<2)+1)\n#define BNLLRi(CR)\t\t\tBCLRii( 4, ((CR)<<2)+0)\n#define BNELRi(CR)\t\t\tBCLRii( 4, ((CR)<<2)+2)\n#define BNGLRi(CR)\t\t\tBCLRii( 4, ((CR)<<2)+1)\n#define BSOLRi(CR)\t\t\tBCLRii(12, ((CR)<<2)+3)\n#define BNSLRi(CR)\t\t\tBCLRii( 4, ((CR)<<2)+3)\n#define BUNLRi(CR)\t\t\tBCLRii(12, ((CR)<<2)+3)\n#define BNULRi(CR)\t\t\tBCLRii( 4, ((CR)<<2)+3)\n\t\t\n#define BLTLRLi(CR)\t\t\tBCLRLii(12, ((CR)<<2)+0)\t/* [1, Table F-10] */\n#define BLELRLi(CR)\t\t\tBCLRLii( 4, ((CR)<<2)+1)\n#define BEQLRLi(CR)\t\t\tBCLRLii(12, ((CR)<<2)+2)\n#define BGELRLi(CR)\t\t\tBCLRLii( 4, ((CR)<<2)+0)\n#define BGTLRLi(CR)\t\t\tBCLRLii(12, ((CR)<<2)+1)\n#define BNLLRLi(CR)\t\t\tBCLRLii( 4, ((CR)<<2)+0)\n#define BNELRLi(CR)\t\t\tBCLRLii( 4, ((CR)<<2)+2)\n#define BNGLRLi(CR)\t\t\tBCLRLii( 4, ((CR)<<2)+1)\n#define BSOLRLi(CR)\t\t\tBCLRLii(12, ((CR)<<2)+3)\n#define BNSLRLi(CR)\t\t\tBCLRLii( 4, ((CR)<<2)+3)\n#define BUNLRLi(CR)\t\t\tBCLRLii(12, ((CR)<<2)+3)\n#define BNULRLi(CR)\t\t\tBCLRLii( 4, ((CR)<<2)+3)\n\t\t\n#define BLTCTRi(CR)\t\t\tBCCTRii(12, ((CR)<<2)+0)\t/* [1, Table F-10] */\n#define BLECTRi(CR)\t\t\tBCCTRii( 4, ((CR)<<2)+1)\n#define BEQCTRi(CR)\t\t\tBCCTRii(12, ((CR)<<2)+2)\n#define BGECTRi(CR)\t\t\tBCCTRii( 4, ((CR)<<2)+0)\n#define BGTCTRi(CR)\t\t\tBCCTRii(12, ((CR)<<2)+1)\n#define BNLCTRi(CR)\t\t\tBCCTRii( 4, ((CR)<<2)+0)\n#define BNECTRi(CR)\t\t\tBCCTRii( 4, ((CR)<<2)+2)\n#define BNGCTRi(CR)\t\t\tBCCTRii( 4, ((CR)<<2)+1)\n#define BSOCTRi(CR)\t\t\tBCCTRii(12, ((CR)<<2)+3)\n#define BNSCTRi(CR)\t\t\tBCCTRii( 4, ((CR)<<2)+3)\n#define BUNCTRi(CR)\t\t\tBCCTRii(12, ((CR)<<2)+3)\n#define BNUCTRi(CR)\t\t\tBCCTRii( 4, ((CR)<<2)+3)\n\t\t\n#define BLTCTRLi(CR)\t\t\tBCCTRLii(12, ((CR)<<2)+0)\t/* [1, Table F-10] */\n#define BLECTRLi(CR)\t\t\tBCCTRLii( 4, ((CR)<<2)+1)\n#define BEQCTRLi(CR)\t\t\tBCCTRLii(12, ((CR)<<2)+2)\n#define BGECTRLi(CR)\t\t\tBCCTRLii( 4, ((CR)<<2)+0)\n#define BGTCTRLi(CR)\t\t\tBCCTRLii(12, ((CR)<<2)+1)\n#define BNLCTRLi(CR)\t\t\tBCCTRLii( 4, ((CR)<<2)+0)\n#define BNECTRLi(CR)\t\t\tBCCTRLii( 4, ((CR)<<2)+2)\n#define BNGCTRLi(CR)\t\t\tBCCTRLii( 4, ((CR)<<2)+1)\n#define BSOCTRLi(CR)\t\t\tBCCTRLii(12, ((CR)<<2)+3)\n#define BNSCTRLi(CR)\t\t\tBCCTRLii( 4, ((CR)<<2)+3)\n#define BUNCTRLi(CR)\t\t\tBCCTRLii(12, ((CR)<<2)+3)\n#define BNUCTRLi(CR)\t\t\tBCCTRLii( 4, ((CR)<<2)+3)\n\t\t\n\n#define BLTLR()\t\t\t\tBLTLRi(0)  \t/* with implicit _cr0 */\n#define BLELR()\t\t\t\tBLELRi(0)  \n#define BEQLR()\t\t\t\tBEQLRi(0)  \n#define BGELR()\t\t\t\tBGELRi(0)  \n#define BGTLR()\t\t\t\tBGTLRi(0)  \n#define BNLLR()\t\t\t\tBNLLRi(0)  \n#define BNELR()\t\t\t\tBNELRi(0)  \n#define BNGLR()\t\t\t\tBNGLRi(0)  \n#define BSOLR()\t\t\t\tBSOLRi(0)  \n#define BNSLR()\t\t\t\tBNSLRi(0)  \n#define BUNLR()\t\t\t\tBUNLRi(0)  \n#define BNULR()\t\t\t\tBNULRi(0)  \n\t\t\t\t\t            \n#define BLTLRL()\t\t\tBLTLRLi(0) \n#define BLELRL()\t\t\tBLELRLi(0) \n#define BEQLRL()\t\t\tBEQLRLi(0) \n#define BGELRL()\t\t\tBGELRLi(0) \n#define BGTLRL()\t\t\tBGTLRLi(0) \n#define BNLLRL()\t\t\tBNLLRLi(0) \n#define BNELRL()\t\t\tBNELRLi(0) \n#define BNGLRL()\t\t\tBNGLRLi(0) \n#define BSOLRL()\t\t\tBSOLRLi(0) \n#define BNSLRL()\t\t\tBNSLRLi(0) \n#define BUNLRL()\t\t\tBUNLRLi(0) \n#define BNULRL()\t\t\tBNULRLi(0) \n\t\t\t\t\t            \n#define BLTCTR()\t\t\tBLTCTRi(0) \n#define BLECTR()\t\t\tBLECTRi(0) \n#define BEQCTR()\t\t\tBEQCTRi(0) \n#define BGECTR()\t\t\tBGECTRi(0) \n#define BGTCTR()\t\t\tBGTCTRi(0) \n#define BNLCTR()\t\t\tBNLCTRi(0) \n#define BNECTR()\t\t\tBNECTRi(0) \n#define BNGCTR()\t\t\tBNGCTRi(0) \n#define BSOCTR()\t\t\tBSOCTRi(0) \n#define BNSCTR()\t\t\tBNSCTRi(0) \n#define BUNCTR()\t\t\tBUNCTRi(0) \n#define BNUCTR()\t\t\tBNUCTRi(0) \n\t\t\t\t\t            \n#define BLTCTRL()\t\t\tBLTCTRLi(0)\n#define BLECTRL()\t\t\tBLECTRLi(0)\n#define BEQCTRL()\t\t\tBEQCTRLi(0)\n#define BGECTRL()\t\t\tBGECTRLi(0)\n#define BGTCTRL()\t\t\tBGTCTRLi(0)\n#define BNLCTRL()\t\t\tBNLCTRLi(0)\n#define BNECTRL()\t\t\tBNECTRLi(0)\n#define BNGCTRL()\t\t\tBNGCTRLi(0)\n#define BSOCTRL()\t\t\tBSOCTRLi(0)\n#define BNSCTRL()\t\t\tBNSCTRLi(0)\n#define BUNCTRL()\t\t\tBUNCTRLi(0)\n#define BNUCTRL()\t\t\tBNUCTRLi(0)\n\n\n#define BLTii(C,D)\t\t\tBC_EXT(12, ((C)<<2)+0, D)\t/* [1, Table F-11] */\n#define BNLii(C,D)\t\t\tBC_EXT( 4, ((C)<<2)+0, D)\n#define BGEii(C,D)\t\t\tBC_EXT( 4, ((C)<<2)+0, D)\n#define BGTii(C,D)\t\t\tBC_EXT(12, ((C)<<2)+1, D)\n#define BNGii(C,D)\t\t\tBC_EXT( 4, ((C)<<2)+1, D)\n#define BLEii(C,D)\t\t\tBC_EXT( 4, ((C)<<2)+1, D)\n#define BEQii(C,D)\t\t\tBC_EXT(12, ((C)<<2)+2, D)\n#define BNEii(C,D)\t\t\tBC_EXT( 4, ((C)<<2)+2, D)\n#define BSOii(C,D)\t\t\tBC_EXT(12, ((C)<<2)+3, D)\n#define BNSii(C,D)\t\t\tBC_EXT( 4, ((C)<<2)+3, D)\n#define BUNii(C,D)\t\t\tBC_EXT(12, ((C)<<2)+3, D)\n#define BNUii(C,D)\t\t\tBC_EXT( 4, ((C)<<2)+3, D)\n\n#define BLTi(D)\t\t\t\tBLTii(0,D)\t/* with implicit _cr0 */\n#define BLEi(D)\t\t\t\tBLEii(0,D)\n#define BEQi(D)\t\t\t\tBEQii(0,D)\n#define BGEi(D)\t\t\t\tBGEii(0,D)\n#define BGTi(D)\t\t\t\tBGTii(0,D)\n#define BNLi(D)\t\t\t\tBNLii(0,D)\n#define BNEi(D)\t\t\t\tBNEii(0,D)\n#define BNGi(D)\t\t\t\tBNGii(0,D)\n#define BSOi(D)\t\t\t\tBSOii(0,D)\n#define BNSi(D)\t\t\t\tBNSii(0,D)\n#define BUNi(D)\t\t\t\tBUNii(0,D)\n#define BNUi(D)\t\t\t\tBNUii(0,D)\n\n#define BLTLii(C,D)\t\t\tBCLiii(12, ((C)<<2)+0, D)\t/* [1, Table F-??] */\n#define BLELii(C,D)\t\t\tBCLiii( 4, ((C)<<2)+1, D)\n#define BEQLii(C,D)\t\t\tBCLiii(12, ((C)<<2)+2, D)\n#define BGELii(C,D)\t\t\tBCLiii( 4, ((C)<<2)+0, D)\n#define BGTLii(C,D)\t\t\tBCLiii(12, ((C)<<2)+1, D)\n#define BNLLii(C,D)\t\t\tBCLiii( 4, ((C)<<2)+0, D)\n#define BNELii(C,D)\t\t\tBCLiii( 4, ((C)<<2)+2, D)\n#define BNGLii(C,D)\t\t\tBCLiii( 4, ((C)<<2)+1, D)\n#define BSOLii(C,D)\t\t\tBCLiii(12, ((C)<<2)+3, D)\n#define BNSLii(C,D)\t\t\tBCLiii( 4, ((C)<<2)+3, D)\n#define BUNLii(C,D)\t\t\tBCLiii(12, ((C)<<2)+3, D)\n#define BNULii(C,D)\t\t\tBCLiii( 4, ((C)<<2)+3, D)\n\n#define BLTLi(D)\t\t\tBLTLii(0,D)\t/* with implicit _cr0 */\n#define BLELi(D)\t\t\tBLELii(0,D)\n#define BEQLi(D)\t\t\tBEQLii(0,D)\n#define BGELi(D)\t\t\tBGELii(0,D)\n#define BGTLi(D)\t\t\tBGTLii(0,D)\n#define BNLLi(D)\t\t\tBNLLii(0,D)\n#define BNELi(D)\t\t\tBNELii(0,D)\n#define BNGLi(D)\t\t\tBNGLii(0,D)\n#define BSOLi(D)\t\t\tBSOLii(0,D)\n#define BNSLi(D)\t\t\tBNSLii(0,D)\n#define BUNLi(D)\t\t\tBUNLii(0,D)\n#define BNULi(D)\t\t\tBNULii(0,D)\n\n/* Note: there are many tens of other simplified branches that are not (yet?) defined here */\n\n#define CRSETi(BX)\t\t\tCREQViii(BX, BX, BX)\t/* [1, Table F-15] */\n#define CRCLRi(BX)\t\t\tCRXORiii(BX, BX, BX)\n#define CRMOVEii(BX,BY)\t\t\tCRORiii(BX, BY, BY)\n#define CRNOTii(BX,BY)\t\t\tCRNORiii(BX, BY, BY)\n\t\t\n#define MTLRr(RS)\t\t\tMTSPRir(8, RS)\t\t/* [1, Table F-20] */\n#define MFLRr(RD)\t\t\tMFSPRri(RD, 8)\n#define MTCTRr(RS)\t\t\tMTSPRir(9, RS)\n#define MFCTRr(RD)\t\t\tMFSPRri(RD, 9)\n#define MTXERr(RS)\t\t\tMTSPRir(1, RS)\n#define MFXERr(RD)\t\t\tMFSPRri(RD, 1)\n\t\t\n#define NOP()\t\t\t\tORIrri(0, 0, 0)\t\t/* [1, Section F.9] */\n#define LIri(RD,IM)\t\t\tADDIrri(RD, 0, IM)\n#define LISri(RD,IM)\t\t\tADDISrri(RD, 0, IM)\n#define LArm(RD,D,RA)\t\t\tADDIrri(RD, RA, D)\n#define LArrr(RD,RB,RA)\t\t\tADDIrrr(RD, RA, RB)\n#define MRrr(RA,RS)\t\t\tORrrr(RA, RS, RS)\n#define NOTrr(RA,RS)\t\t\tNORrrr(RA, RS, RS)\n\n/* alternative parenthesised forms of extended indexed load/store insns */\n\n#define LBZUrx(RD,RA,RB)\t\tLBZUXrrr(RD,RA,RB)\n#define LBZrx(RD,RA,RB)\t\t\tLBZXrrr(RD,RA,RB)\n#define LHAUrx(RD,RA,RB)\t\tLHAUXrrr(RD,RA,RB)\n#define LHArx(RD,RA,RB)\t\t\tLHAXrrr(RD,RA,RB)\n#define LHBRrx(RD,RA,RB)\t\tLHBRXrrr(RD,RA,RB)\n#define LHZUrx(RD,RA,RB)\t\tLHZUXrrr(RD,RA,RB)\n#define LHZrx(RD,RA,RB)\t\t\tLHZXrrr(RD,RA,RB)\n#define LWBRrx(RD,RA,RB)\t\tLWBRXrrr(RD,RA,RB)\n#define LWZUrx(RD, RA, RB)\t\tLWZUXrrr(RD, RA, RB)\n#define LWZrx(RD, RA, RB)\t\tLWZXrrr(RD, RA, RB)\n#define STBUrx(RD,RA,RB)\t\tSTBUXrrr(RD,RA,RB)\n#define STBrx(RD,RA,RB)\t\t\tSTBXrrr(RD,RA,RB)\n#define STHBRrx(RS,RA,RB)\t\tSTHBRXrrr(RS,RA,RB)\n#define STHUrx(RS,RA,RB)\t\tSTHUXrrr(RS,RA,RB)\n#define STHrx(RS,RA,RB)\t\t\tSTHXrrr(RS,RA,RB)\n#define STWBRrx(RS,RA,RB)\t\tSTWBRXrrr(RS,RA,RB)\n#define STWCrx(RS,RA,RB)\t\tSTWCXrrr(RS,RA,RB)\n#define STWCX_rx(RS,RA,RB)\t\tSTWCX_rrr(RS,RA,RB)\n#define STWUrx(RS,RA,RB)\t\tSTWUXrrr(RS,RA,RB)\n#define STWrx(RS,RA,RB)\t\t\tSTWXrrr(RS,RA,RB)\n#define LArx(RD,RB,RA)\t\t\tLArrr(RD,RB,RA)\t\n\n\n#define _LO(I)          (_jit_UL(I) & _MASK(16))\n#define _HI(I)          (_jit_UL(I) >>     (16))\n\n#define _A(OP,RD,RA,RB,RC,XO,RCx)    _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|_u5(RC)<<6|(_u5(XO)<<1)|_u1(RCx))\n\n#define LFDrri(RD,RA,imm)       _Ds(50,RD,RA,imm)\n#define LFDUrri(RD,RA,imm)      _Ds(51,RD,RA,imm)\n#define LFDUxrrr(RD,RA,RB)      _X(31,RD,RA,RB,631,0)\n#define LFDxrrr(RD,RA,RB)       _X(31,RD,RA,RB,599,0)\n\n#define LFSrri(RD,RA,imm)       _Ds(48,RD,RA,imm)\n#define LFSUrri(RD,RA,imm)      _Ds(49,RD,RA,imm)\n#define LFSUxrrr(RD,RA,RB)      _X(31,RD,RA,RB,567,0)\n#define LFSxrrr(RD,RA,RB)       _X(31,RD,RA,RB,535,0)\n\n#define STFDrri(RS,RA,imm)      _Ds(54,RS,RA,imm)\n#define STFDUrri(RS,RA,imm)     _Ds(55,RS,RA,imm)\n#define STFDUxrrr(RS,RA,RB)     _X(31,RS,RA,RB,759,0)\n#define STFDxrrr(RS,RA,RB)      _X(31,RS,RA,RB,727,0)\n\n#define STFSrri(RS,RA,imm)      _Ds(52,RS,RA,imm)\n#define STFSUrri(RS,RA,imm)     _Ds(53,RS,RA,imm)\n#define STFSUxrrr(RS,RA,RB)     _X(31,RS,RA,RB,695,0)\n#define STFSxrrr(RS,RA,RB)      _X(31,RS,RA,RB,663,0)\n#define STFIWXrrr(RS,RA,RB)     _X(31,RS,RA,RB,983,0)\n\n#define FADDDrrr(RD,RA,RB)       _A(63,RD,RA,RB,0,21,0)\n#define FADDSrrr(RD,RA,RB)       _A(59,RD,RA,RB,0,21,0)\n#define FSUBDrrr(RD,RA,RB)       _A(63,RD,RA,RB,0,20,0)\n#define FSUBSrrr(RD,RA,RB)       _A(59,RD,RA,RB,0,20,0)\n#define FMULDrrr(RD,RA,RC)       _A(63,RD,RA,0,RC,25,0)\n#define FMULSrrr(RD,RA,RC)       _A(59,RD,RA,0,RC,25,0)\n#define FDIVDrrr(RD,RA,RB)       _A(63,RD,RA,RB,0,18,0)\n#define FDIVSrrr(RD,RA,RB)       _A(59,RD,RA,RB,0,18,0)\n#define FSQRTDrr(RD,RB)          _A(63,RD,0,RB,0,22,0)\n#define FSQRTSrr(RD,RB)          _A(59,RD,0,RB,0,22,0)\n#define FSELrrrr(RD,RA,RB,RC)    _A(63,RD,RA,RB,RC,23,0)\n#define FCTIWrr(RD,RB)           _X(63,RD,0,RB,14,0)\n#define FCTIWZrr(RD,RB)          _X(63,RD,0,RB,15,0)\n#define FRSPrr(RD,RB)            _X(63,RD,0,RB,12,0)\n#define FABSrr(RD,RB)            _X(63,RD,0,RB,264,0)\n#define FNABSrr(RD,RB)           _X(63,RD,0,RB,136,0)\n#define FNEGrr(RD,RB)            _X(63,RD,0,RB,40,0)\n#define FMOVErr(RD,RB)           _X(63,RD,0,RB,72,0)\n#define FCMPOrrr(CR,RA,RB)       _X(63,_u3((CR)<<2),RA,RB,32,0)\n#define FCMPUrrr(CR,RA,RB)       _X(63,_u3((CR)<<2),RA,RB,0,0)\n#define MTFSFIri(CR,IMM)          _X(63,_u5((CR)<<2),0,_u5((IMM)<<1),134,0)\n\n/* ppc64 */\n#define FCFIDrr(RD,RS)\t\t_X(63,RD,0,RS,846,0)\n\n/*** References:\n *\n * [1] \"PowerPC Microprocessor Family: The Programming Environments For 32-Bit Microprocessors\", Motorola, 1997.\n */\n\n\n#endif\n#endif /* __ccg_asm_ppc_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/ppc/core.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (PowerPC version)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002, 2006 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n\n\n#ifndef __lightning_core_h\n#define __lightning_core_h\n\n#define jit_can_sign_extend_short_p(im)\t((im) >= -32678 && (im) <= 32767)\n#define jit_can_zero_extend_short_p(im)\t((im) >= 0 && (im) <= 65535)\n\n/* Patch a `stwu' instruction (with immediate operand) so that it decreases\n   r1 by AMOUNT.  AMOUNT should already be rounded so that %sp remains quadword\n   aligned.  */\n#define jit_patch_stwu(amount)                               \\\n  (*(_jitl.stwu) &= ~_MASK (16),                               \\\n   *(_jitl.stwu) |= _s16 ((amount)))\n\n#define jit_allocai(n)\t\t\t\t\t\t\t  \\\n   (_jitl.frame_size += (n),\t\t\t\t\t\t  \\\n    ((n) <= _jitl.slack\t\t\t\t\t\t\t  \\\n     ? 0 : jit_patch_stwu (-((_jitl.frame_size + 15) & ~15))),\t\t  \\\n    _jitl.slack = ((_jitl.frame_size + 15) & ~15) - _jitl.frame_size,\t  \\\n    _jitl.frame_size - (n))\n\n#define JIT_SP\t\t\t1\n#define JIT_FP\t\t\t1\n#define JIT_RET\t\t\t3\n#define JIT_R_NUM\t\t3\n#define JIT_V_NUM\t\t7\n#define JIT_R(i)\t\t(9+(i))\n#define JIT_V(i)\t\t(31-(i))\n#define JIT_AUX\t\t\tJIT_V(JIT_V_NUM)  /* for 32-bit operands & shift counts */\n\n#define jit_movr_i(r0, r1)\t\tMRrr(r0, r1)\n#define jit_movi_i(r0, i0)\t\tppc_movi_i(_jit, r0, i0)\n__jit_inline void\nppc_movi_i(jit_state_t _jit, int r0, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tLIri(r0, i0);\n    else {\n\tLISri(r0, _jit_US(i0 >> 16));\n\tif (_jit_US(i0))\n\t    ORIrri(r0, r0, _jit_US(i0));\n    }\n}\n\n#define jit_movi_p(r0, i0)\t\tppc_movi_p(_jit, r0, i0)\n__jit_inline jit_insn *\nppc_movi_p(jit_state_t _jit, int r0, void *i0)\n{\n    int\t\tim = (int)i0;\n    LISri(r0, _jit_US(im >> 16));\n    ORIrri(r0, r0, _jit_US(im));\n    return (_jit->x.pc);\n}\n\n#define jit_notr_i(r0, r1)\t\tNOTrr(r0, r1)\n#define jit_negr_i(r0, r1)\t\tNEGrr(r0, r1)\n#define jit_extr_c_i(r0, r1)\t\tEXTSBrr(r0, r1)\n#define jit_extr_s_i(d, rs)\t\tEXTSHrr((d), (rs))\n\n/* If possible, use the `small' instruction (rd, rs, imm)\n * else load imm into r26 and use the `big' instruction (rd, rs, r26)\n */\n#define jit_chk_ims(imm, small, big)\t\t(_siP(16,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm),  (big)) )\n#define jit_chk_imu(imm, small, big)\t\t(_uiP(16,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm),  (big)) )\n#define jit_chk_imu15(imm, small, big)\t\t(_uiP(15,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm),  (big)) )\n\n#define jit_big_ims(imm, big)\t               (MOVEIri(JIT_AUX, imm),  (big))\n#define jit_big_imu(imm, big)\t               (MOVEIri(JIT_AUX, imm),  (big))\n\n/* Helper macros for branches */\n#define jit_s_brai(rs, is, jmp)\t\t\t(jit_chk_ims (is, CMPWIri(rs, is), CMPWrr(rs, JIT_AUX)),   jmp, _jit->x.pc)\n#define jit_s_brar(s1, s2, jmp)\t\t\t(\t\t  CMPWrr(s1, s2), \t\t           jmp, _jit->x.pc)\n#define jit_u_brai(rs, is, jmp)\t\t\t(jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), jmp, _jit->x.pc)\n#define jit_u_brar(s1, s2, jmp)\t\t\t(\t\t  CMPLWrr(s1, s2), \t\t           jmp, _jit->x.pc)\n\n/* modulus with big immediate                    with small immediate\n * movei r24, imm                                movei r24, imm\n * mtlr  r31\n * divw  r31, rs, r24\t\t(or divwu)       divw r24, rs, r24\n * mullw r31, r31, r24                           mulli r24, r24, imm\n * sub   d, rs, r31                              sub   d, rs, r24\n * mflr  r31\n *\n *\n * jit_mod_big expects immediate in JIT_AUX.  */\n\n#define _jit_mod_big(div, d, rs)\t\t(MTLRr(31), div(31, (rs), JIT_AUX), \\\n\t\t\t\t\t\tMULLWrrr(31, 31, JIT_AUX), SUBrrr((d), (rs), 31), \\\n\t\t\t\t\t\tMFLRr(31))\n\n#define _jit_mod_small(div, d, rs, imm)\t\t(MOVEIri(JIT_AUX, (imm)), div(JIT_AUX, (rs), JIT_AUX), \\\n\t\t\t\t\t\t MULLIrri(JIT_AUX, JIT_AUX, (imm)), SUBrrr((d), (rs), JIT_AUX))\n\n/* Patch a movei instruction made of a LIS at lis_pc and an ORI at ori_pc. */\n#define jit_patch_movei(lis_pc, ori_pc, dest)\t\t\t\\\n\t(*(lis_pc) &= ~_MASK(16), *(lis_pc) |= _HI(dest),\t\t\\\n\t *(ori_pc) &= ~_MASK(16), *(ori_pc) |= _LO(dest))\t\t\\\n\n/* Patch a branch instruction */\n#define jit_patch_branch(jump_pc,pv)\t\t\t\t\\\n\t(*(jump_pc) &= ~_MASK(16) | 3,\t\t\t\t\\\n\t *(jump_pc) |= (_jit_UL(pv) - _jit_UL(jump_pc)) & _MASK(16))\n\n#define jit_patch_ucbranch(jump_pc,pv)                          \\\n         (*(jump_pc) &= ~_MASK(26) | 3,                         \\\n         (*(jump_pc) |= (_jit_UL((pv)) - _jit_UL(jump_pc)) & _MASK(26)))\n\n#define _jit_b_encoding\t\t(18 << 26)\n#define _jit_blr_encoding\t((19 << 26) | (20 << 21) | (00 << 16) | (00 << 11) | (16 << 1))\n#define _jit_is_ucbranch(a)     (((*(a) & (63<<26)) == _jit_b_encoding))\n\n#define jit_patch_at(i0, i1)\t\tppc_patch_at(_jit, i0, i1)\n__jit_inline void\nppc_patch_at(jit_state_t _jit, jit_insn *jump, jit_insn *label)\n{\n    _ui\t\t*i0 = (_ui *)jump, *i1 = (_ui *)label;\n    if ((*(i0 - 1) & ~1) == _jit_blr_encoding)\n\tjit_patch_movei(i0 - 4, i0 - 3, i1);\n    else if (_jit_is_ucbranch(i0 - 1))\n\tjit_patch_ucbranch(i0 - 1, i1);\n    else\n\tjit_patch_branch(i0 - 1, i1);\n}\n\n#define jit_patch_calli(i0, i1)\t\tppc_patch_movi(_jit, i0, i1)\n#define jit_patch_movi(i0, i1)\t\tppc_patch_movi(_jit, i0, i1)\n__jit_inline void\nppc_patch_movi(jit_state_t _jit, jit_insn *addr, void *value)\n{\n    _ui\t*i0 = (_ui *)addr, *i1 = (_ui *)value;\n    jit_patch_movei(i0 - 2, i0 - 1, i1);\n}\n\n#define\tjit_arg_c()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_i()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_l()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_p()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_s()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_uc()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_ui()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_ul()\t\t\t(_jitl.nextarg_geti--)\n#define\tjit_arg_us()\t\t\t(_jitl.nextarg_geti--)\n\n/* Check Mach-O-Runtime documentation: Must skip GPR(s) whenever \"corresponding\" FPR is used */\n#define jit_arg_f()                    (_jitl.nextarg_geti-- ,_jitl.nextarg_getd++)\n#define jit_arg_d()                    (_jitl.nextarg_geti-=2,_jitl.nextarg_getd++)\n\n#define jit_addr_i(r0, r1, r2)\t\tADDrrr(r0, r1, r2)\n#define jit_addi_i(r0, r1, i0)\t\tppc_addi_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_addi_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tADDIrri(r0, r1, i0);\n    else if (!(i0 & 0x0000ffff))\n\tADDISrri(r0, r1, _jit_US(i0 >> 16));\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tADDrrr(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_addcr_ui(r0, r1, r2)\tADDCrrr(r0, r1, r2)\n#define jit_addci_ui(r0, r1, i0)\tppc_addci_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_addci_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tADDICrri(r0, r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tADDCrrr(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_addxr_ui(r0, r1, r2)\tADDErrr(r0, r1, r2)\n#define jit_addxi_ui(r0, r1, i0)\tppc_addxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_addxi_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_movi_i(JIT_AUX, i0);\n    ADDErrr(r0, r1, JIT_AUX);\n}\n\n#define jit_subr_i(r0, r1, r2)\t\tSUBrrr(r0, r1, r2)\n#define jit_subi_i(r0, r1, i0)\t\tppc_subi_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_subi_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    int\t\tni0 = -i0;\n    if (jit_can_sign_extend_short_p(ni0))\n\tADDIrri(r0, r1, ni0);\n    else if (!(ni0 & 0x0000ffff))\n\tADDISrri(r0, r1, _jit_US(ni0 >> 16));\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tSUBrrr(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_subcr_ui(r0, r1, r2)\tSUBCrrr(r0, r1, r2)\n#define jit_subci_ui(r0, r1, i0)\tppc_subci_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_subci_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_movi_i(JIT_AUX, i0);\n    SUBCrrr(r0, r1, JIT_AUX);\n}\n\n#define jit_subxr_ui(r0, r1, r2)\tSUBErrr(r0, r1, r2)\n#define jit_subxi_ui(r0, r1, i0)\tppc_subxi_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_subxi_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_movi_i(JIT_AUX, i0);\n    SUBErrr(r0, r1, JIT_AUX);\n}\n\n#define jit_hmulr_i(r0, r1, r2)\t\tMULHWrrr(r0, r1, r2)\n#define jit_hmuli_i(r0, r1, i0)\t\tppc_hmuli_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_hmuli_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_movi_i(JIT_AUX, i0);\n    MULHWrrr(r0, r1, JIT_AUX);\n}\n\n#define jit_hmulr_ui(r0, r1, r2)\tMULHWUrrr(r0, r1, r2)\n#define jit_hmuli_ui(r0, r1, i0)\tppc_hmuli_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_hmuli_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_movi_i(JIT_AUX, i0);\n    MULHWUrrr(r0, r1, JIT_AUX);\n}\n\n#define jit_mulr_i(r0, r1, r2)\t\tMULLWrrr(r0, r1, r2)\n#define jit_mulr_ui(r0, r1, r2)\t\tjit_mulr_i(r0, r1, r2)\n#define jit_muli_i(r0, r1, i0)\t\tppc_muli_i(_jit, r0, r1, i0)\n#define jit_muli_ui(r0, r1, i0)\t\tjit_muli_i(r0, r1, i0)\n__jit_inline void\nppc_muli_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tMULLIrri(r0, r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tMULLWrrr(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_divr_i(r0, r1, r2)\t\tDIVWrrr(r0, r1, r2)\n#define jit_divi_i(r0, r1, i0)\t\tppc_divi_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_divi_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_movi_i(JIT_AUX, i0);\n    DIVWrrr(r0, r1, JIT_AUX);\n}\n\n#define jit_divr_ui(r0, r1, r2)\t\tDIVWUrrr(r0, r1, r2)\n#define jit_divi_ui(r0, r1, i0)\t\tppc_divi_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_divi_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_movi_i(JIT_AUX, i0);\n    DIVWUrrr(r0, r1, JIT_AUX);\n}\n\n#define jit_modi_i(d, rs, is)\t\tjit_chk_ims  ((is), _jit_mod_small(jit_divr_i , (d), (rs), (is)), _jit_mod_big(jit_divr_i , (d), (rs)))\n#define jit_modi_ui(d, rs, is)\t\tjit_chk_imu15((is), _jit_mod_small(jit_divr_ui, (d), (rs), (is)), _jit_mod_big(jit_divr_ui, (d), (rs)))\n#define jit_modr_i(d, s1, s2)\t\t(DIVWrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX))\n#define jit_modr_ui(d, s1, s2)\t\t(DIVWUrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX))\n\n#define jit_andr_i(r0, r1, r2)\t\tANDrrr(r0, r1, r2)\n#define jit_andi_i(r0, r1, i0)\t\tppc_andi_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_andi_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_zero_extend_short_p(i0))\n\tANDI_rri(r0, r1, i0);\n    else if (!(i0 & 0x0000ffff))\n\tANDIS_rri(r0, r1, _jit_US(i0 >> 16));\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tANDrrr(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_orr_i(r0, r1, r2)\t\tORrrr(r0, r1, r2)\n#define jit_ori_i(r0, r1, i0)\t\tppc_ori_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_ori_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_zero_extend_short_p(i0))\n\tORIrri(r0, r1, i0);\n    else if (!(i0 & 0x0000ffff))\n\tORISrri(r0, r1, _jit_US(i0 >> 16));\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tORrrr(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_xorr_i(r0, r1, r2)\t\tXORrrr(r0, r1, r2)\n#define jit_xori_i(r0, r1, i0)\t\tppc_xori_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_xori_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_zero_extend_short_p(i0))\n\tXORIrri(r0, r1, i0);\n    else if (!(i0 & 0x0000ffff))\n\tXORISrri(r0, r1, _jit_US(i0 >> 16));\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tXORrrr(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_lshr_i(r0, r1, r2)\t\tSLWrrr(r0, r1, r2)\n#define jit_lshi_i(r0, r1, i0)\t\tSLWIrri(r0, r1, i0)\n#define jit_rshr_i(r0, r1, r2)\t\tSRAWrrr(r0, r1, r2)\n#define jit_rshi_i(r0, r1, i0)\t\tSRAWIrri(r0, r1, i0)\n#define jit_rshr_ui(r0, r1, r2)\t\tSRWrrr(r0, r1, r2)\n#define jit_rshi_ui(r0, r1, i0)\t\tppc_rshi_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_rshi_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (i0)\n\tSRWIrri(r0, r1, i0);\n    else\n\tjit_movr_i(r0, r1);\n}\n\n#define jit_ltr_i(r0, r1, r2)\t\tppc_ltr_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_ltr_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPWrr(r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_lti_i(r0, r1, i0)\t\tppc_lti_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_lti_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tCMPWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPWrr(r1, JIT_AUX);\n    }\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_ltr_ui(r0, r1, r2)\t\tppc_ltr_ui(_jit, r0, r1, r2)\n__jit_inline void\nppc_ltr_ui(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPLWrr(r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_lti_ui(r0, r1, i0)\t\tppc_lti_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_lti_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_zero_extend_short_p(i0))\n\tCMPLWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPLWrr(r1, JIT_AUX);\n    }\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_ler_i(r0, r1, r2)\t\tppc_ler_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_ler_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPWrr(r1, r2);\n    CRNOTii(_gt, _gt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_lei_i(r0, r1, i0)\t\tppc_lei_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_lei_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tCMPWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPWrr(r1, JIT_AUX);\n    }\n    CRNOTii(_gt, _gt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_ler_ui(r0, r1, r2)\t\tppc_ler_ui(_jit, r0, r1, r2)\n__jit_inline void\nppc_ler_ui(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPLWrr(r1, r2);\n    CRNOTii(_gt, _gt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_lei_ui(r0, r1, i0)\t\tppc_lei_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_lei_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_zero_extend_short_p(i0))\n\tCMPLWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPLWrr(r1, JIT_AUX);\n    }\n    CRNOTii(_gt, _gt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_eqr_i(r0, r1, r2)\t\tppc_eqr_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_eqr_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPWrr(r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _eq);\n}\n\n#define jit_eqi_i(r0, r1, i0)\t\tppc_eqi_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_eqi_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tCMPWIri(r1, i0);\n    else if (jit_can_zero_extend_short_p(i0))\n\tCMPLWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPWrr(r1, JIT_AUX);\n    }\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _eq);\n}\n\n#define jit_ger_i(r0, r1, r2)\t\tppc_ger_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_ger_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPWrr(r1, r2);\n    CRNOTii(_lt, _lt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_gei_i(r0, r1, i0)\t\tppc_gei_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_gei_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tCMPWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPWrr(r1, JIT_AUX);\n    }\n    CRNOTii(_lt, _lt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_ger_ui(r0, r1, r2)\t\tppc_ger_ui(_jit, r0, r1, r2)\n__jit_inline void\nppc_ger_ui(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPLWrr(r1, r2);\n    CRNOTii(_lt, _lt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_gei_ui(r0, r1, i0)\t\tppc_gei_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_gei_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_zero_extend_short_p(i0))\n\tCMPLWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPLWrr(r1, JIT_AUX);\n    }\n    CRNOTii(_lt, _lt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_gtr_i(r0, r1, r2)\t\tppc_gtr_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_gtr_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPWrr(r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_gti_i(r0, r1, i0)\t\tppc_gti_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_gti_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tCMPWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPWrr(r1, JIT_AUX);\n    }\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_gtr_ui(r0, r1, r2)\t\tppc_gtr_ui(_jit, r0, r1, r2)\n__jit_inline void\nppc_gtr_ui(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPLWrr(r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_gti_ui(r0, r1, i0)\t\tppc_gti_ui(_jit, r0, r1, i0)\n__jit_inline void\nppc_gti_ui(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_zero_extend_short_p(i0))\n\tCMPLWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPLWrr(r1, JIT_AUX);\n    }\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_ner_i(r0, r1, r2)\t\tppc_ner_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_ner_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    CMPWrr(r1, r2);\n    CRNOTii(_eq, _eq);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _eq);\n}\n\n#define jit_nei_i(r0, r1, i0)\t\tppc_nei_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_nei_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (jit_can_sign_extend_short_p(i0))\n\tCMPWIri(r1, i0);\n    else if (jit_can_zero_extend_short_p(i0))\n\tCMPLWIri(r1, i0);\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tCMPWrr(r1, JIT_AUX);\n    }\n    CRNOTii(_eq, _eq);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _eq);\n}\n\n#define jit_bmsi_i(label, rs, is)\t(jit_chk_imu((is), ANDI_rri(JIT_AUX, (rs), (is)), AND_rrr(JIT_AUX, (rs), JIT_AUX)), BNEi((label)), _jit->x.pc)\n#define jit_bmci_i(label, rs, is)\t(jit_chk_imu((is), ANDI_rri(JIT_AUX, (rs), (is)), AND_rrr(JIT_AUX, (rs), JIT_AUX)), BEQi((label)), _jit->x.pc)\n#define jit_bmsr_i(label, s1, s2)\t(\t\t   AND_rrr(JIT_AUX, (s1), (s2)),\t\t\t\t    BNEi((label)), _jit->x.pc)\n#define jit_bmcr_i(label, s1, s2)\t(\t\t   AND_rrr(JIT_AUX, (s1), (s2)),\t\t\t\t    BEQi((label)), _jit->x.pc)\n#define jit_beqi_i(label, rs, is)\tjit_s_brai((rs), (is), BEQi((label)) )\n#define jit_beqr_i(label, s1, s2)\tjit_s_brar((s1), (s2), BEQi((label)) )\n#define jit_bgei_i(label, rs, is)\tjit_s_brai((rs), (is), BGEi((label)) )\n#define jit_bgei_ui(label, rs, is)\tjit_u_brai((rs), (is), BGEi((label)) )\n#define jit_bger_i(label, s1, s2)\tjit_s_brar((s1), (s2), BGEi((label)) )\n#define jit_bger_ui(label, s1, s2)\tjit_u_brar((s1), (s2), BGEi((label)) )\n#define jit_bgti_i(label, rs, is)\tjit_s_brai((rs), (is), BGTi((label)) )\n#define jit_bgti_ui(label, rs, is)\tjit_u_brai((rs), (is), BGTi((label)) )\n#define jit_bgtr_i(label, s1, s2)\tjit_s_brar((s1), (s2), BGTi((label)) )\n#define jit_bgtr_ui(label, s1, s2)\tjit_u_brar((s1), (s2), BGTi((label)) )\n#define jit_blei_i(label, rs, is)\tjit_s_brai((rs), (is), BLEi((label)) )\n#define jit_blei_ui(label, rs, is)\tjit_u_brai((rs), (is), BLEi((label)) )\n#define jit_bler_i(label, s1, s2)\tjit_s_brar((s1), (s2), BLEi((label)) )\n#define jit_bler_ui(label, s1, s2)\tjit_u_brar((s1), (s2), BLEi((label)) )\n#define jit_blti_i(label, rs, is)\tjit_s_brai((rs), (is), BLTi((label)) )\n#define jit_blti_ui(label, rs, is)\tjit_u_brai((rs), (is), BLTi((label)) )\n#define jit_bltr_i(label, s1, s2)\tjit_s_brar((s1), (s2), BLTi((label)) )\n#define jit_bltr_ui(label, s1, s2)\tjit_u_brar((s1), (s2), BLTi((label)) )\n#define jit_bnei_i(label, rs, is)\tjit_s_brai((rs), (is), BNEi((label)) )\n#define jit_bner_i(label, s1, s2)\tjit_s_brar((s1), (s2), BNEi((label)) )\n\n#define jit_boaddr_i(i0, r0, r1)\tppc_boaddr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_boaddr_i(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    ADDOrrr(r0, r0, r1);\n    MCRXRi(0);\n    BGTi(i0);\t\t\t\t/* GT = bit 1 of XER = OV */\n    return (_jit->x.pc);\n}\n\n#define jit_boaddi_i(i0, r0, i1)\tppc_boaddi_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nppc_boaddi_i(jit_state_t _jit, jit_insn *i0, int r0, int i1)\n{\n    jit_movi_i(JIT_AUX, i1);\n    return (jit_boaddr_i(i0, r0, JIT_AUX));\n}\n\n#define jit_bosubr_i(i0, r0, r1)\tppc_bosubr_i(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bosubr_i(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    SUBOrrr(r0, r0, r1);\n    MCRXRi(0);\n    BGTi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bosubi_i(i0, r0, i1)\tppc_bosubi_i(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nppc_bosubi_i(jit_state_t _jit, jit_insn *i0, int r0, int i1)\n{\n    jit_movi_i(JIT_AUX, i1);\n    return (jit_bosubr_i(i0, r0, JIT_AUX));\n}\n\n#define jit_boaddr_ui(i0, r0, r1)\tppc_boaddr_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_boaddr_ui(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    ADDCrrr(r0, r0, r1);\n    MCRXRi(0);\n    BEQi(i0);\t\t\t\t/* EQ = bit 2 of XER = CA */\n    return (_jit->x.pc);\n}\n\n#define jit_boaddi_ui(i0, r0, i1)\tppc_boaddi_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nppc_boaddi_ui(jit_state_t _jit, jit_insn *i0, int r0, int i1)\n{\n    if (jit_can_sign_extend_short_p(i1)) {\n\tADDICrri(r0, r0, i1);\n\tMCRXRi(0);\n\tBEQi(i0);\n\treturn (_jit->x.pc);\n    }\n    jit_movi_i(JIT_AUX, i1);\n    return (jit_boaddr_ui(i0, r0, JIT_AUX));\n}\n\n#define jit_bosubr_ui(i0, r0, r1)\tppc_bosubr_ui(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bosubr_ui(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    SUBCrrr(r0, r0, r1);\n    MCRXRi(0);\n    BNEi(i0);\t\t\t\t/* PPC uses \"carry\" not \"borrow\" */\n    return (_jit->x.pc);\n}\n\n#define jit_bosubi_ui(i0, r0, i1)\tppc_bosubi_ui(_jit, i0, r0, i1)\n__jit_inline jit_insn *\nppc_bosubi_ui(jit_state_t _jit, jit_insn *i0, int r0, int i1)\n{\n    jit_movi_i(JIT_AUX, i1);\n    return (jit_bosubr_ui(i0, r0, JIT_AUX));\n}\n\n#define jit_calli(label)\t        ((void)jit_movi_p(JIT_AUX, (label)), MTCTRr(JIT_AUX), BCTRL(), _jitl.nextarg_puti = _jitl.nextarg_putf = _jitl.nextarg_putd = 0, _jit->x.pc)\n#define jit_callr(reg)\t\t\t(MTCTRr(reg), BCTRL())\n#define jit_jmpi(label)\t\t\t(B_EXT((label)), _jit->x.pc)\n#define jit_jmpr(reg)\t\t\t(MTLRr(reg), BLR())\n\n#define jit_ldr_uc(r0, r1)\t\tLBZrx(r0, 0, r1)\n#define jit_ldi_uc(r0, i0)\t\tppc_ldi_uc(_jit, r0, i0)\n__jit_inline void\nppc_ldi_uc(jit_state_t _jit, int r0, void *i0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tLBZrm(r0, i0, 0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tLBZrm(r0, lo, JIT_AUX);\n    }\n}\n\n#define jit_ldxr_uc(r0, r1, r2)\t\tppc_ldxr_uc(_jit, r0, r1, r2)\n__jit_inline void\nppc_ldxr_uc(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r1 == 0) {\n\tif (r2 != 0)\n\t    LBZrx(r0, r2, r1);\n\telse {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LBZrx(r0, JIT_AUX, r2);\n\t}\n    }\n    else\n\tLBZrx(r0, r1, r2);\n}\n\n#define jit_ldxi_uc(r0, r1, i0)\t\tppc_ldxi_uc(_jit, r0, r1, i0)\n__jit_inline void\nppc_ldxi_uc(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (i0 == 0)\n\tjit_ldr_uc(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r1 == 0) {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LBZrm(r0, i0, JIT_AUX);\n\t}\n\telse\n\t    LBZrm(r0, i0, r1);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_ldxr_uc(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_ldr_c(r0, r1)\t\tppc_ldr_c(_jit, r0, r1)\n__jit_inline void\nppc_ldr_c(jit_state_t _jit, int r0, int r1)\n{\n    jit_ldr_uc(r0, r1);\n    jit_extr_c_i(r0, r0);\n}\n\n#define jit_ldi_c(r0, i0)\t\tppc_ldi_c(_jit, r0, i0)\n__jit_inline void\nppc_ldi_c(jit_state_t _jit, int r0, void *i0)\n{\n    jit_ldi_uc(r0, i0);\n    jit_extr_c_i(r0, r0);\n}\n\n#define jit_ldxr_c(r0, r1, r2)\t\tppc_ldxr_c(_jit, r0, r1, r2)\n__jit_inline void\nppc_ldxr_c(jit_state_t _jit, int r0, int r1, int r2)\n{\n    jit_ldxr_uc(r0, r1, r2);\n    jit_extr_c_i(r0, r0);\n}\n\n#define jit_ldxi_c(r0, r1, i0)\t\tppc_ldxi_c(_jit, r0, r1, i0)\n__jit_inline void\nppc_ldxi_c(jit_state_t _jit, int r0, int r1, int i0)\n{\n    jit_ldxi_uc(r0, r1, i0);\n    jit_extr_c_i(r0, r0);\n}\n\n#define jit_ldr_s(r0, r1)\t\tLHArx(r0, 0, r1)\n#define jit_ldi_s(r0, i0)\t\tppc_ldi_s(_jit, r0, i0)\n__jit_inline void\nppc_ldi_s(jit_state_t _jit, int r0, void *i0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tLHArm(r0, i0, 0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tLHArm(r0, lo, JIT_AUX);\n    }\n}\n\n#define jit_ldxr_s(r0, r1, r2)\t\tppc_ldxr_s(_jit, r0, r1, r2)\n__jit_inline void\nppc_ldxr_s(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r1 == 0) {\n\tif (r2 != 0)\n\t    LHArx(r0, r2, r1);\n\telse {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LHArx(r0, JIT_AUX, r2);\n\t}\n    }\n    else\n\tLHArx(r0, r1, r2);\n}\n\n#define jit_ldxi_s(r0, r1, i0)\t\tppc_ldxi_s(_jit, r0, r1, i0)\n__jit_inline void\nppc_ldxi_s(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (i0 == 0)\n\tjit_ldr_s(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r1 == 0) {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LHArm(r0, i0, JIT_AUX);\n\t}\n\telse\n\t    LHArm(r0, i0, r1);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_ldxr_s(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_ldr_us(r0, r1)\t\tLHZrx(r0, 0, r1)\n#define jit_ldi_us(r0, i0)\t\tppc_ldi_us(_jit, r0, i0)\n__jit_inline void\nppc_ldi_us(jit_state_t _jit, int r0, void *i0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tLHZrm(r0, i0, 0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tLHZrm(r0, lo, JIT_AUX);\n    }\n}\n\n#define jit_ldxr_us(r0, r1, r2)\t\tppc_ldxr_us(_jit, r0, r1, r2)\n__jit_inline void\nppc_ldxr_us(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r1 == 0) {\n\tif (r2 != 0)\n\t    LHZrx(r0, r2, r1);\n\telse {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LHZrx(r0, JIT_AUX, r2);\n\t}\n    }\n    else\n\tLHZrx(r0, r1, r2);\n}\n\n#define jit_ldxi_us(r0, r1, i0)\t\tppc_ldxi_us(_jit, r0, r1, i0)\n__jit_inline void\nppc_ldxi_us(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (i0 == 0)\n\tjit_ldr_us(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r1 == 0) {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LHZrm(r0, i0, JIT_AUX);\n\t}\n\telse\n\t    LHZrm(r0, i0, r1);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_ldxr_us(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_ldr_i(r0, r1)\t\tLWZrx(r0, 0, r1)\n#define jit_ldi_i(r0, i0)\t\tppc_ldi_i(_jit, r0, i0)\n__jit_inline void\nppc_ldi_i(jit_state_t _jit, int r0, void *i0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tLWZrm(r0, i0, 0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tLWZrm(r0, lo, JIT_AUX);\n    }\n}\n\n#define jit_ldxr_i(r0, r1, r2)\t\tppc_ldxr_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_ldxr_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r1 == 0) {\n\tif (r2 != r1)\n\t    LWZrx(r0, r2, r1);\n\telse {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LWZrx(r0, JIT_AUX, r2);\n\t}\n    }\n    else\n\tLWZrx(r0, r1, r2);\n}\n\n#define jit_ldxi_i(r0, r1, i0)\t\tppc_ldxi_i(_jit, r0, r1, i0)\n__jit_inline void\nppc_ldxi_i(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (i0 == 0)\n\tjit_ldr_i(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r1 == 0) {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LWZrm(r0, i0, JIT_AUX);\n\t}\n\telse\n\t    LWZrm(r0, i0, r1);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_ldxr_i(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_str_c(r0, r1)\t\tSTBrx(r1, 0, r0)\n#define jit_sti_c(i0, r0)\t\tppc_sti_c(_jit, i0, r0)\n__jit_inline void\nppc_sti_c(jit_state_t _jit, void *i0, int r0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tSTBrm(r0, i0, 0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tSTBrm(r0, lo, JIT_AUX);\n    }\n}\n\n#define jit_stxr_c(r0, r1, r2)\t\tppc_stxr_c(_jit, r0, r1, r2)\n__jit_inline void\nppc_stxr_c(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r0 == 0) {\n\tif (r1 != 0)\n\t    STBrx(r2, r1, r0);\n\telse {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STBrx(r2, 0, JIT_AUX);\n\t}\n    }\n    else\n\tSTBrx(r2, r0, r1);\n}\n\n#define jit_stxi_c(i0, r0, r1)\t\tppc_stxi_c(_jit, i0, r0, r1)\n__jit_inline void\nppc_stxi_c(jit_state_t _jit, int i0, int r0, int r1)\n{\n    if (i0 == 0)\n\tjit_str_c(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r0 == 0) {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STBrm(r1, i0, JIT_AUX);\n\t}\n\telse\n\t    STBrm(r1, i0, r0);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_stxr_c(JIT_AUX, r0, r1);\n    }\n}\n\n#define jit_str_s(r0, r1)\t\tSTHrx(r1, 0, r0)\n#define jit_sti_s(i0, r0)\t\tppc_sti_s(_jit, i0, r0)\n__jit_inline void\nppc_sti_s(jit_state_t _jit, void *i0, int r0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tSTHrm(r0, i0, 0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tSTHrm(r0, lo, JIT_AUX);\n    }\n}\n\n#define jit_stxr_s(r0, r1, r2)\t\tppc_stxr_s(_jit, r0, r1, r2)\n__jit_inline void\nppc_stxr_s(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r0 == 0) {\n\tif (r1 != 0)\n\t    STHrx(r2, r1, r0);\n\telse {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STHrx(r2, 0, JIT_AUX);\n\t}\n    }\n    else\n\tSTHrx(r2, r0, r1);\n}\n\n#define jit_stxi_s(i0, r0, r1)\t\tppc_stxi_s(_jit, i0, r0, r1)\n__jit_inline void\nppc_stxi_s(jit_state_t _jit, int i0, int r0, int r1)\n{\n    if (i0 == 0)\n\tjit_str_s(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r0 == 0) {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STHrm(r1, i0, JIT_AUX);\n\t}\n\telse\n\t    STHrm(r1, i0, r0);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_stxr_s(JIT_AUX, r0, r1);\n    }\n}\n\n#define jit_str_i(r0, r1)\t\tSTWrx(r1, 0, r0)\n#define jit_sti_i(i0, r0)\t\tppc_sti_i(_jit, i0, r0)\n__jit_inline void\nppc_sti_i(jit_state_t _jit, void *i0, int r0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tSTWrm(r0, i0, 0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tSTWrm(r0, lo, JIT_AUX);\n    }\n}\n\n#define jit_stxr_i(r0, r1, r2)\t\tppc_stxr_i(_jit, r0, r1, r2)\n__jit_inline void\nppc_stxr_i(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r0 == 0) {\n\tif (r1 != 0)\n\t    STWrx(r2, r1, r0);\n\telse {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STWrx(r2, 0, JIT_AUX);\n\t}\n    }\n    else\n\tSTWrx(r2, r0, r1);\n}\n\n#define jit_stxi_i(i0, r0, r1)\t\tppc_stxi_i(_jit, i0, r0, r1)\n__jit_inline void\nppc_stxi_i(jit_state_t _jit, int i0, int r0, int r1)\n{\n    if (i0 == 0)\n\tjit_str_i(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r0 == 0) {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STWrm(r1, i0, JIT_AUX);\n\t}\n\telse\n\t    STWrm(r1, i0, r0);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_stxr_i(JIT_AUX, r0, r1);\n    }\n}\n\n#define jit_nop()\t\t\tNOP()\n\n#ifdef JIT_NEED_PUSH_POP\n#define jit_popr_i(rs)\t\t\t(LWZrm((rs),  0, 1), ADDIrri(1, 1, 4))\n#define jit_pushr_i(rs)\t\t\t(STWrm((rs), -4, 1), ADDIrri (1, 1, -4))\n#endif\n\n#define jit_prepare_i(numi)\t\t(_jitl.nextarg_puti = numi)\n#define jit_prepare_f(numf)\t\t(_jitl.nextarg_putf = numf)\n#define jit_prepare_d(numd)\t\t(_jitl.nextarg_putd = numd)\n\n#define jit_prolog(n)\t\t\tppc_prolog(_jit, (n))\n/* Emit a prolog for a function.\n  \n   The +32 in frame_size computation is to accound for the parameter area of\n   a function frame. \n\n   On PPC the frame must have space to host the arguments of any callee.\n   However, as it currently stands, the argument to jit_trampoline (n) is\n   the number of arguments of the caller we generate. Therefore, the\n   callee can overwrite a part of the stack (saved register area) when it\n   flushes its own parameter on the stack. The addition of a constant \n   offset = 32 is enough to hold eight 4 bytes arguments.  This is less\n   than perfect but is a reasonable work around for now. \n   Better solution must be investigated.  */\n__jit_inline void\nppc_prolog(jit_state_t _jit, int n)\n{\n  int frame_size;\n  int i;\n  int first_saved_reg = JIT_AUX - n;\n  int num_saved_regs = 32 - first_saved_reg;\n\n  _jitl.nextarg_geti = JIT_AUX - 1;\n  _jitl.nextarg_getd = 1;\n  _jitl.nbArgs = n;\n\n  MFLRr(0);\n\n#ifdef __APPLE__\n  STWrm(0, 8, 1);\t\t\t/* stw   r0, 8(r1)\t   */\n#else\n  STWrm(0, 4, 1);\t\t\t/* stw   r0, 4(r1)\t   */\n#endif\n\n  /* 0..55 -> frame data\n     56..frame_size -> saved registers\n\n     The STMW instruction is patched by jit_allocai, thus leaving\n     the space for the allocai above the 56 bytes.  jit_allocai is\n     also able to reuse the slack space needed to keep the stack\n     quadword-aligned.  */\n\n  _jitl.frame_size = 24 + 32 + num_saved_regs * 4;\t/* r27..r31 + args */\n\n  /* The stack must be quad-word aligned.  */\n  frame_size = (_jitl.frame_size + 15) & ~15;\n  _jitl.slack = frame_size - _jitl.frame_size;\n  _jitl.stwu = _jit->x.ui_pc;\n  STWUrm(1, -frame_size, 1);\t\t/* stwu  r1, -x(r1)\t   */\n\n  STMWrm(first_saved_reg, 24 + 32, 1);\t\t/* stmw  rI, ofs(r1)\t   */\n  for (i = 0; i < n; i++)\n    MRrr(JIT_AUX-1-i, 3+i);\t\t/* save parameters below r24\t   */\n}\n\n#define jit_pusharg_i(rs)\t\t(--_jitl.nextarg_puti, MRrr((3 + _jitl.nextarg_putd * 2 + _jitl.nextarg_putf + _jitl.nextarg_puti), (rs)))\n\n#define jit_ret()\t\t\tppc_ret(_jit)\n__jit_inline void\nppc_ret(jit_state_t _jit)\n{\n  int n = _jitl.nbArgs;\n  int first_saved_reg = JIT_AUX - n;\n  int frame_size = (_jitl.frame_size + 15) & ~15;\n\n#ifdef __APPLE__\n  LWZrm(0, frame_size + 8, 1);\t\t/* lwz   r0, x+8(r1)  (ret.addr.)  */\n#else\n  LWZrm(0, frame_size + 4, 1);\t\t/* lwz   r0, x+4(r1)  (ret.addr.)  */\n#endif\n  MTLRr(0);\t\t\t\t/* mtspr LR, r0\t\t\t   */\n\n  LMWrm(first_saved_reg, 24 + 32, 1);\t/* lmw   rI, ofs(r1)\t\t   */\n  ADDIrri(1, 1, frame_size);\t\t/* addi  r1, r1, x\t\t   */\n  BLR();\t\t\t\t/* blr\t\t\t\t   */\n}\n\n#define jit_retval_i(rd)\t\tMRrr((rd), 3)\n#define jit_rsbi_i(d, rs, is)\t\tjit_chk_ims((is), SUBFICrri((d), (rs), (is)), SUBFCrrr((d), (rs), JIT_AUX))\n\n#endif /* __lightning_core_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/ppc/fp.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler & support macros for the PowerPC math unit\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n\n\n#ifndef __lightning_asm_fp_h\n#define __lightning_asm_fp_h\n\n\n#define JIT_FPR_NUM\t       6\n#define JIT_FPRET\t       1\n#define JIT_FPR(i)\t       (8+(i))\n\n\n/* Make space for 1 or 2 words, store address in REG */\n#define jit_data(REG, D1)\t        (_FBA\t(18, 8, 0, 1),  _jit_L(D1), MFLRr(REG))\n\n#define jit_addr_d(rd,s1,s2)  FADDDrrr((rd),(s1),(s2))\n#define jit_subr_d(rd,s1,s2)  FSUBDrrr((rd),(s1),(s2))\n#define jit_mulr_d(rd,s1,s2)  FMULDrrr((rd),(s1),(s2))\n#define jit_divr_d(rd,s1,s2)  FDIVDrrr((rd),(s1),(s2))\n\n#define jit_addr_f(rd,s1,s2)  FADDSrrr((rd),(s1),(s2))\n#define jit_subr_f(rd,s1,s2)  FSUBSrrr((rd),(s1),(s2))\n#define jit_mulr_f(rd,s1,s2)  FMULSrrr((rd),(s1),(s2))\n#define jit_divr_f(rd,s1,s2)  FDIVSrrr((rd),(s1),(s2))\n\n#define jit_movr_d(rd,rs)     ( (rd) == (rs) ? 0 : FMOVErr((rd),(rs)))\n#define jit_movi_d(reg0,d) do {                   \\\n      double _v = (d);                            \\\n      _FBA (18, 12, 0, 1); \t\t\t  \\\n      memcpy(_jit->x.uc_pc, &_v, sizeof (double)); \\\n      _jit->x.uc_pc += sizeof (double);            \\\n      MFLRr (JIT_AUX);\t\t\t\t  \\\n      jit_ldxi_d((reg0), JIT_AUX, 0);\t\t  \\\n   } while(0) \n\n\n#define jit_movr_f(rd,rs)     ( (rd) == (rs) ? 0 : FMOVErr((rd),(rs)))\n#define jit_movi_f(reg0,f) do {                   \\\n      float _v = (f);                             \\\n      _FBA (18, 8, 0, 1); \t\t\t  \\\n      memcpy(_jit->x.uc_pc, &_v, sizeof (float));  \\\n      _jit->x.uc_pc += sizeof (float);             \\\n      MFLRr (JIT_AUX);\t\t\t\t  \\\n      jit_ldxi_f((reg0), JIT_AUX, 0);\t\t  \\\n   } while(0) \n\n\n#define jit_absr_d(rd,rs)\t\tFABSrr((rd),(rs))\n#define jit_negr_d(rd,rs)\t\tFNEGrr((rd),(rs))\n#define jit_sqrtr_d(rd,rs)\t\tFSQRTDrr((rd),(rs))\n\n#define jit_ltr_d(r0, r1, r2)\t\tppc_ltr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ltr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPOrrr(_cr0, r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_ler_d(r0, r1, r2)\t\tppc_ler_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ler_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPOrrr(_cr0, r1, r2);\n    CREQViii(_gt, _gt, _un);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_eqr_d(r0, r1, r2)\t\tppc_eqr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_eqr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPOrrr(_cr0, r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _eq);\n}\n\n#define jit_ger_d(r0, r1, r2)\t\tppc_ger_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ger_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPOrrr(_cr0, r1, r2);\n    CREQViii(_lt, _lt, _un);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_gtr_d(r0, r1, r2)\t\tppc_gtr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_gtr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPOrrr(_cr0, r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_ner_d(r0, r1, r2)\t\tppc_ner_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ner_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPOrrr(_cr0, r1, r2);\n    CRNOTii(_eq, _eq);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _eq);\n}\n\n#define jit_unltr_d(r0, r1, r2)\t\tppc_unltr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_unltr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    CRORiii(_lt, _lt, _un);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_unler_d(r0, r1, r2)\t\tppc_unler_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_unler_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    CRNOTii(_gt, _gt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_uneqr_d(r0, r1, r2)\t\tppc_uneqr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_uneqr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    CRORiii(_eq, _eq, _un);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _eq);\n}\n\n#define jit_unger_d(r0, r1, r2)\t\tppc_unger_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_unger_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    CRNOTii(_lt, _lt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _lt);\n}\n\n#define jit_ungtr_d(r0, r1, r2)\t\tppc_ungtr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ungtr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    CRORiii(_gt, _gt, _un);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_ltgtr_d(r0, r1, r2)\t\tppc_ltgtr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ltgtr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    CRORiii(_gt, _gt, _lt);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _gt);\n}\n\n#define jit_ordr_d(r0, r1, r2)\t\tppc_ordr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ordr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    CRNOTii(_un, _un);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _un);\n}\n\n#define jit_unordr_d(r0, r1, r2)\tppc_unordr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_unordr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    FCMPUrrr(_cr0, r1, r2);\n    MFCRr(r0);\n    EXTRWIrrii(r0, r0, 1, _un);\n}\n\n#define jit_bltr_d(i0, r0, r1)\t\tppc_bltr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bltr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPOrrr(_cr0, r0, r1);\n    BLTi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bler_d(i0, r0, r1)\t\tppc_bler_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bler_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPOrrr(_cr0, r0, r1);\n    CREQViii(_gt, _gt, _un);\n    BGTi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_beqr_d(i0, r0, r1)\t\tppc_beqr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_beqr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPOrrr(_cr0, r0, r1);\n    BEQi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bger_d(i0, r0, r1)\t\tppc_bger_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bger_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPOrrr(_cr0, r0, r1);\n    CREQViii(_lt, _lt, _un);\n    BLTi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bgtr_d(i0, r0, r1)\t\tppc_bgtr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bgtr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPOrrr(_cr0, r0, r1);\n    BGTi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bner_d(i0, r0, r1)\t\tppc_bner_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bner_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPOrrr(_cr0, r0, r1);\n    BNEi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bunltr_d(i0, r0, r1)\tppc_bunltr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bunltr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    CRORiii(_lt, _lt, _un);\n    BLTi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bunler_d(i0, r0, r1)\tppc_bunler_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bunler_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    BLEi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_buneqr_d(i0, r0, r1)\tppc_buneqr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_buneqr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    CRORiii(_eq, _eq, _un);\n    BEQi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bunger_d(i0, r0, r1)\tppc_bunger_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bunger_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    BGEi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bungtr_d(i0, r0, r1)\tppc_bungtr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bungtr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    CRORiii(_gt, _gt, _un);\n    BGTi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bltgtr_d(i0, r0, r1)\tppc_bltgtr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bltgtr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    CRORiii(_eq, _lt, _gt);\n    BEQi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bordr_d(i0, r0, r1)\t\tppc_bordr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bordr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    BNUi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_bunordr_d(i0, r0, r1)\tppc_bunordr_d(_jit, i0, r0, r1)\n__jit_inline jit_insn *\nppc_bunordr_d(jit_state_t _jit, jit_insn *i0, int r0, int r1)\n{\n    FCMPUrrr(_cr0, r0, r1);\n    BUNi(i0);\n    return (_jit->x.pc);\n}\n\n#define jit_ldr_f(r0, r1)\t\tLFSxrrr(r0, 0, r1)\n#define jit_ldi_f(r0, i0)\t\tppc_ldi_f(_jit, r0, i0)\n__jit_inline void\nppc_ldi_f(jit_state_t _jit, int r0, void *i0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tLFSrri(r0, 0, i0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tLFSrri(r0, JIT_AUX, lo);\n    }\n}\n\n#define jit_ldxr_f(r0, r1, r2)\t\tppc_ldxr_f(_jit, r0, r1, r2)\n__jit_inline void\nppc_ldxr_f(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r1 == 0) {\n\tif (r2 != 0)\n\t    LFSxrrr(r0, r2, r1);\n\telse {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LFSxrrr(r0, JIT_AUX, r2);\n\t}\n    }\n    else\n\tLFSxrrr(r0, r1, r2);\n}\n\n#define jit_ldxi_f(r0, r1, i0)\t\tppc_ldxi_f(_jit, r0, r1, i0)\n__jit_inline void\nppc_ldxi_f(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (i0 == 0)\n\tjit_ldr_f(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r1 == 0) {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LFSrri(r0, JIT_AUX, i0);\n\t}\n\telse\n\t    LFSrri(r0, r1, i0);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_ldxr_f(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_str_f(r0, r1)\t\tSTFSxrrr(r1, 0, r0)\n#define jit_sti_f(i0, r0)\t\tppc_sti_f(_jit, i0, r0)\n__jit_inline void\nppc_sti_f(jit_state_t _jit, void *i0, int r0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tSTFSrri(r0, 0, i0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tSTFSrri(r0, JIT_AUX, lo);\n    }\n}\n\n#define jit_stxr_f(r0, r1, r2)\t\tppc_stxr_f(_jit, r0, r1, r2)\n__jit_inline void\nppc_stxr_f(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r0 == 0) {\n\tif (r1 != 0)\n\t    STFSxrrr(r2, r1, r0);\n\telse {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    STFSxrrr(r2, JIT_AUX, r0);\n\t}\n    }\n    else\n\tSTFSxrrr(r2, r0, r1);\n}\n\n#define jit_stxi_f(i0, r0, r1)\t\tppc_stxi_f(_jit, i0, r0, r1)\n__jit_inline void\nppc_stxi_f(jit_state_t _jit, int i0, int r0, int r1)\n{\n    if (i0 == 0)\n\tjit_str_f(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r0 == 0) {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STFSrri(r1, JIT_AUX, i0);\n\t}\n\telse\n\t    STFSrri(r1, r0, i0);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_stxr_f(JIT_AUX, r0, r1);\n    }\n}\n\n#define jit_ldr_d(r0, r1)\t\tLFDxrrr(r0, 0, r1)\n#define jit_ldi_d(r0, i0)\t\tppc_ldi_d(_jit, r0, i0)\n__jit_inline void\nppc_ldi_d(jit_state_t _jit, int r0, void *i0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tLFDrri(r0, 0, i0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tLFDrri(r0, JIT_AUX, lo);\n    }\n}\n\n#define jit_ldxr_d(r0, r1, r2)\t\tppc_ldxr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_ldxr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r1 == 0) {\n\tif (r2 != 0)\n\t    LFDxrrr(r0, r2, r1);\n\telse {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LFDxrrr(r0, JIT_AUX, r2);\n\t}\n    }\n    else\n\tLFDxrrr(r0, r1, r2);\n}\n\n#define jit_ldxi_d(r0, r1, i0)\t\tppc_ldxi_d(_jit, r0, r1, i0)\n__jit_inline void\nppc_ldxi_d(jit_state_t _jit, int r0, int r1, int i0)\n{\n    if (i0 == 0)\n\tjit_ldr_d(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r1 == 0) {\n\t    jit_movr_i(JIT_AUX, r1);\n\t    LFDrri(r0, JIT_AUX, i0);\n\t}\n\telse\n\t    LFDrri(r0, r1, i0);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_ldxr_d(r0, r1, JIT_AUX);\n    }\n}\n\n#define jit_str_d(r0, r1)\t\tSTFDxrrr(r1, 0, r0)\n#define jit_sti_d(i0, r0)\t\tppc_sti_d(_jit, i0, r0)\n__jit_inline void\nppc_sti_d(jit_state_t _jit, void *i0, int r0)\n{\n    int\t\tlo, hi;\n    if (jit_can_sign_extend_short_p((long)i0))\n\tSTFDrri(r0, 0, i0);\n    else {\n\thi = ((_ui)i0 >> 16) + ((_us)((_ui)i0) >> 15);\n\tlo = (_us)((_ui)i0 - (hi << 16));\n\tLISri(JIT_AUX, hi);\n\tSTFDrri(r0, JIT_AUX, lo);\n    }\n}\n\n#define jit_stxr_d(r0, r1, r2)\t\tppc_stxr_d(_jit, r0, r1, r2)\n__jit_inline void\nppc_stxr_d(jit_state_t _jit, int r0, int r1, int r2)\n{\n    if (r0 == 0) {\n\tif (r1 != 0)\n\t    STFDxrrr(r2, r1, r0);\n\telse {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STFDxrrr(r2, 0, JIT_AUX);\n\t}\n    }\n    else\n\tSTFDxrrr(r2, r0, r1);\n}\n\n#define jit_stxi_d(i0, r0, r1)\t\tppc_stxi_d(_jit, i0, r0, r1)\n__jit_inline void\nppc_stxi_d(jit_state_t _jit, int i0, int r0, int r1)\n{\n    if (i0 == 0)\n\tjit_str_d(r0, r1);\n    else if (jit_can_sign_extend_short_p(i0)) {\n\tif (r0 == 0) {\n\t    jit_movr_i(JIT_AUX, r0);\n\t    STFDrri(r1, JIT_AUX, i0);\n\t}\n\telse\n\t    STFDrri(r1, r0, i0);\n    }\n    else {\n\tjit_movi_i(JIT_AUX, i0);\n\tjit_stxr_d(JIT_AUX, r0, r1);\n    }\n}\n\n#define jit_pusharg_d(rs)\t     (_jitl.nextarg_putd--,jit_movr_d((_jitl.nextarg_putf+_jitl.nextarg_putd+1), (rs)))\n#define jit_pusharg_f(rs)\t     (_jitl.nextarg_putf--,jit_movr_f((_jitl.nextarg_putf+_jitl.nextarg_putd+1), (rs)))\n\n\n#define jit_floorr_d_i(rd,rs)  (MTFSFIri(7,3), \\\n                                  FCTIWrr(7,(rs)),    \\\n                                  MOVEIri(JIT_AUX,-4), \\\n                                  STFIWXrrr(7,JIT_SP,JIT_AUX),   \\\n                                  LWZrm((rd),-4,JIT_SP))\n\n#define jit_ceilr_d_i(rd,rs)   (MTFSFIri(7,2), \\\n                                  FCTIWrr(7,(rs)),    \\\n                                  MOVEIri(JIT_AUX,-4), \\\n                                  STFIWXrrr(7,JIT_SP,JIT_AUX),   \\\n                                  LWZrm((rd),-4,JIT_SP))\n\n#define jit_roundr_d_i(rd,rs)  (MTFSFIri(7,0), \\\n                                  FCTIWrr(7,(rs)),    \\\n                                  MOVEIri(JIT_AUX,-4), \\\n                                  STFIWXrrr(7,JIT_SP,JIT_AUX),   \\\n                                  LWZrm((rd),-4,JIT_SP))\n\n#define jit_truncr_d_i(rd,rs)  (FCTIWZrr(7,(rs)), \\\n                                  MOVEIri(JIT_AUX,-4), \\\n                                  STFIWXrrr(7,JIT_SP,JIT_AUX),   \\\n                                  LWZrm((rd),-4,JIT_SP))\n\n/* FIXME 64 bit instruction, should work on recent processors,\n * explicitly documented as not working in 32 bit mode, but\n * works on test Darwin PPC host..., otherwise, need to inline\n * or call some integer to float function */\n#define jit_extr_i_d(rd,rs)\t(jit_stxi_i(-4, JIT_SP, (rs)),\t\t\\\n\t\t\t\t jit_rshi_i(JIT_AUX, (rs), 31),\t\t\\\n\t\t\t\t jit_stxi_i(-8, JIT_SP, JIT_AUX),\t\\\n\t\t\t\t jit_ldxi_d((rd), JIT_SP, -8),\t\t\\\n\t\t\t\t FCFIDrr((rd), (rd)))\n\n#endif /* __lightning_asm_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/ppc/funcs.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer inline functions (PowerPC)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n\n#ifndef __lightning_funcs_h\n#define __lightning_funcs_h\n\n#include <string.h>\n\n// #if !defined(__GNUC__) && !defined(__GNUG__)\n// #error Go get GNU C, I do not know how to flush the cache\n// #error with this compiler.\n// #else\n// static void\n// jit_flush_code(void *start, void *end)\n// {\n// #ifndef LIGHTNING_CROSS\n  // register char *ddest, *idest;\n\n  // static int cache_line_size;\n  // if (cache_line_size == 0) {\n    // char buffer[8192];\n    // int i, probe;\n\n    // /* Find out the size of a cache line by zeroing one */\n    // memset(buffer, 0xFF, 8192);\n    // __asm__ __volatile__ (\"dcbz 0,%0\" : : \"r\"(buffer + 4096));\n\n    // /* Probe for the beginning of the cache line. */\n    // for(i = 0, probe = 4096; probe; probe >>= 1)\n      // if (buffer[i | probe] != 0x00)\n        // i |= probe;\n\n    // /* i is now just before the start of the cache line */\n    // i++;\n    // for(cache_line_size = 1; i + cache_line_size < 8192; cache_line_size <<= 1)\n      // if (buffer[i + cache_line_size] != 0x00)\n        // break;\n  // }\n\n  // /* Point end to the last byte being flushed.  */\n  // end   =(void*)( (long)end - 1);\n\n  // start =(void*)( (long)start - (((long) start) & (cache_line_size - 1)));\n  // end   =(void*)( (long)end   - (((long) end) & (cache_line_size - 1)));\n\n  // /* Force data cache write-backs */\n  // for (ddest = (char *) start; ddest <= (char *) end; ddest += cache_line_size) {\n    // __asm__ __volatile__ (\"dcbst 0,%0\" : : \"r\"(ddest));\n  // }\n  // __asm__ __volatile__ (\"sync\" : : );\n\n  // /* Now invalidate the instruction cache */\n  // for (idest = (char *) start; idest <= (char *) end; idest += cache_line_size) {\n    // __asm__ __volatile__ (\"icbi 0,%0\" : : \"r\"(idest));\n  // }\n  // __asm__ __volatile__ (\"isync\" : : );\n// #endif /* !LIGHTNING_CROSS */\n// }\n\n#define jit_get_cpu\t\t\tjit_get_cpu\n__jit_constructor static void\njit_get_cpu(void)\n{\n}\n#endif /* __GNUC__ || __GNUG__ */\n\n#endif /* __lightning_funcs_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/sparc/asm.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler for the SPARC\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 1999, 2000, 2001, 2002 Ian Piumarta\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n\n\n\n#ifndef __lightning_asm_h\n#define __lightning_asm_h\n\n\n/* <imm> = [0-9]+\t\t-> add i, one parameter (imm)\n * <reg> = %<imm>\t\t-> add r, one parameter (imm\tor _Rr(imm) )\n *\t   %g<imm>\t\t-> add r, one parameter (imm\tor _Rg(imm) )\n *\t   %o<imm>\t\t-> add r, one parameter (imm+8\tor _Ro(imm) )\n *\t   %l<imm>\t\t-> add r, one parameter (imm+16 or _Rl(imm) )\n *\t   %i<imm>\t\t-> add r, one parameter (imm+24 or _Ri(imm) )\n * <mem> = <imm>(<reg>)\t\t-> add m, two parameters (reg,imm)\n * <idx> = <reg>(<reg>)\t\t-> add x, two parameters (reg,reg)\n */\n\n\ntypedef unsigned int jit_insn;\n\n#ifndef LIGHTNING_DEBUG\n#define _d30(BD)\t(_ck_d (30, ((_jit_SL (_jit_UL (BD) - _jit_UL (_jit->x.pc))) >> 2)))\n#define _d22(BD)\t(_ck_d (22, ((_jit_SL (_jit_UL (BD) - _jit_UL (_jit->x.pc)) >> 2))))\n\n#define _HI(I)\t\t(_jit_UL(I) >>     (10))\n#define _LO(I)\t\t(_jit_UL(I) & _MASK(10))\n\n/* register names */\n\n#define _y\t\t0\n#define _psr\t\t1\n\n#define _Rr(N)\t\t( 0+(N))\n#define _Rg(N)\t\t( 0+(N))\n#define _Ro(N)\t\t( 8+(N))\n#define _Rl(N)\t\t(16+(N))\n#define _Ri(N)\t\t(24+(N))\n\n/* instruction formats -- Figure 5-1, page 44 in */\n/* SPARC International, \"The SPARC Architecture Manual, Version 8\", Prentice-Hall, 1992.  */\n\n#define _0i(RD,     OP2,\t  IMM)\t_jit_I((0<<30)|\t\t(_u5(RD)<<25)|(_u3(OP2)<<22)|\t\t\t\t\t       _u22(IMM))\n#define _0(  A, CC, OP2,\t  DSP)\t_jit_I((0<<30)|(_u1(A)<<29)|(_u4(CC)<<25)|(_u3(OP2)<<22)|\t\t\t\t\t       _d22(DSP))\n#define _0d( A, CC, OP2,\t  DSP)\t_jit_I((0<<30)|(_u1(A)<<29)|(_u4(CC)<<25)|(_u3(OP2)<<22)|\t\t\t\t\t       _u22(DSP))\n\n#define _1(\t\t\t  DSP)\t_jit_I((1<<30)|\t\t\t\t\t\t\t\t\t\t       _d30(DSP))\n\n#define _2( RD, OP3, RS1, I, ASI, RS2)\t_jit_I((2<<30)|\t\t(_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)|(_u8(ASI)<<5)|_u5 (RS2))\n#define _2i(RD, OP3, RS1, I,\t  IMM)\t_jit_I((2<<30)|\t\t(_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)|\t       _s13(IMM))\n#define _2f(RD, OP3, RS1,    OPF, RS2)\t_jit_I((2<<30)|\t\t(_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|\t\t (_u9(OPF)<<5)|_u5 (RS2))\n\n#define _3( RD, OP3, RS1, I, ASI, RS2)\t_jit_I((3<<30)|\t\t(_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)|(_u8(ASI)<<5)|_u5 (RS2))\n#define _3i(RD, OP3, RS1, I,\t  IMM)\t_jit_I((3<<30)|\t\t(_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)|\t       _s13(IMM))\n\n#define _FP1(RD, RS1, OPF, RS2)\t_2f((RD), 52, (RS1), (OPF), (RS2))\n#define _FP2(RD, RS1, OPF, RS2)\t_2f((RD), 53, (RS1), (OPF), (RS2))\n\n/* basic instructions  [Section B, page 87] */\n\n#define ADDrrr(RS1, RS2, RD)\t_2   ((RD),  0, (RS1), 0, 0, (RS2))\n#define ADDrir(RS1, IMM, RD)\t_2i  ((RD),  0, (RS1), 1,    (IMM))\n#define ADDCCrrr(RS1, RS2, RD)\t_2   ((RD), 16, (RS1), 0, 0, (RS2))\n#define ADDCCrir(RS1, IMM, RD)\t_2i  ((RD), 16, (RS1), 1,    (IMM))\n#define ADDXrrr(RS1, RS2, RD)\t_2   ((RD),  8, (RS1), 0, 0, (RS2))\n#define ADDXrir(RS1, IMM, RD)\t_2i  ((RD),  8, (RS1), 1,    (IMM))\n#define ADDXCCrrr(RS1, RS2, RD)\t_2   ((RD), 24, (RS1), 0, 0, (RS2))\n#define ADDXCCrir(RS1, IMM, RD)\t_2i  ((RD), 24, (RS1), 1,    (IMM))\n#define ANDrrr(RS1, RS2, RD)\t_2   ((RD),  1, (RS1), 0, 0, (RS2))\n#define ANDrir(RS1, IMM, RD)\t_2i  ((RD),  1, (RS1), 1,    (IMM))\n#define ANDCCrrr(RS1, RS2, RD)\t_2   ((RD), 17, (RS1), 0, 0, (RS2))\n#define ANDCCrir(RS1, IMM, RD)\t_2i  ((RD), 17, (RS1), 1,    (IMM))\n\n#define BNi(DISP)\t\t_0   (0,  0, 2, (DISP))\n#define BN_Ai(DISP)\t\t_0   (1,  0, 2, (DISP))\n#define BEi(DISP)\t\t_0   (0,  1, 2, (DISP))\n#define BE_Ai(DISP)\t\t_0   (1,  1, 2, (DISP))\n#define BLEi(DISP)\t\t_0   (0,  2, 2, (DISP))\n#define BLE_Ai(DISP)\t\t_0   (1,  2, 2, (DISP))\n#define BLi(DISP)\t\t_0   (0,  3, 2, (DISP))\n#define BL_Ai(DISP)\t\t_0   (1,  3, 2, (DISP))\n#define BLEUi(DISP)\t\t_0   (0,  4, 2, (DISP))\n#define BLEU_Ai(DISP)\t\t_0   (1,  4, 2, (DISP))\n#define BCSi(DISP)\t\t_0   (0,  5, 2, (DISP))\n#define BCS_Ai(DISP)\t\t_0   (1,  5, 2, (DISP))\n#define BNEGi(DISP)\t\t_0   (0,  6, 2, (DISP))\n#define BNEG_Ai(DISP)\t\t_0   (1,  6, 2, (DISP))\n#define BVSi(DISP)\t\t_0   (0,  7, 2, (DISP))\n#define BVS_Ai(DISP)\t\t_0   (1,  7, 2, (DISP))\n#define BAi(DISP)\t\t_0   (0,  8, 2, (DISP))\n#define BA_Ai(DISP)\t\t_0   (1,  8, 2, (DISP))\n#define BNEi(DISP)\t\t_0   (0,  9, 2, (DISP))\n#define BNE_Ai(DISP)\t\t_0   (1,  9, 2, (DISP))\n#define BGi(DISP)\t\t_0   (0, 10, 2, (DISP))\n#define BG_Ai(DISP)\t\t_0   (1, 10, 2, (DISP))\n#define BGEi(DISP)\t\t_0   (0, 11, 2, (DISP))\n#define BGE_Ai(DISP)\t\t_0   (1, 11, 2, (DISP))\n#define BGUi(DISP)\t\t_0   (0, 12, 2, (DISP))\n#define BGU_Ai(DISP)\t\t_0   (1, 12, 2, (DISP))\n#define BCCi(DISP)\t\t_0   (0, 13, 2, (DISP))\n#define BCC_Ai(DISP)\t\t_0   (1, 13, 2, (DISP))\n#define BPOSi(DISP)\t\t_0   (0, 14, 2, (DISP))\n#define BPOS_Ai(DISP)\t\t_0   (1, 14, 2, (DISP))\n#define BVCi(DISP)\t\t_0   (0, 15, 2, (DISP))\n#define BVC_Ai(DISP)\t\t_0   (1, 15, 2, (DISP))\n\n#define CALLi(DISP)\t\t_1   ((DISP))\n\n#define FLUSHrr(RS1, RS2)\t_2   (0, 0x3b, (RS1), 0, 0, (RS2))\n#define FLUSHir(IMM, RS1)\t_2i  (0, 0x3b, (RS1), 1,    (IMM))\n\n#define JMPLxr(RS1, RS2, RD)\t_2   ((RD), 56, (RS1), 0, 0, (RS2))\n#define JMPLmr(RS1, IMM, RD)\t_2i  ((RD), 56, (RS1), 1,    (IMM))\n\n#define LDxr(RS1, RS2, RD)\t_3   ((RD),  0, (RS1), 0, 0, (RS2))\n#define LDmr(RS1, IMM, RD)\t_3i  ((RD),  0, (RS1), 1,    (IMM))\n#define LDUBxr(RS1, RS2, RD)\t_3   ((RD),  1, (RS1), 0, 0, (RS2))\n#define LDUBmr(RS1, IMM, RD)\t_3i  ((RD),  1, (RS1), 1,    (IMM))\n#define LDUHxr(RS1, RS2, RD)\t_3   ((RD),  2, (RS1), 0, 0, (RS2))\n#define LDUHmr(RS1, IMM, RD)\t_3i  ((RD),  2, (RS1), 1,    (IMM))\n#define LDDxr(RS1, RS2, RD)\t_3   ((RD),  3, (RS1), 0, 0, (RS2))\n#define LDDmr(RS1, IMM, RD)\t_3i  ((RD),  3, (RS1), 1,    (IMM))\n#define LDSBxr(RS1, RS2, RD)\t_3   ((RD),  9, (RS1), 0, 0, (RS2))\n#define LDSBmr(RS1, IMM, RD)\t_3i  ((RD),  9, (RS1), 1,    (IMM))\n#define LDSHxr(RS1, RS2, RD)\t_3   ((RD), 10, (RS1), 0, 0, (RS2))\n#define LDSHmr(RS1, IMM, RD)\t_3i  ((RD), 10, (RS1), 1,    (IMM))\n\n#define ORrrr(RS1, RS2, RD)\t_2   ((RD),  2, (RS1), 0, 0, (RS2))\n#define ORrir(RS1, IMM, RD)\t_2i  ((RD),  2, (RS1), 1,    (IMM))\n#define ORCCrrr(RS1, RS2, RD)\t_2   ((RD), 18, (RS1), 0, 0, (RS2))\n#define ORCCrir(RS1, IMM, RD)\t_2i  ((RD), 18, (RS1), 1,    (IMM))\n\n#define RDir(RS, RD)\t\t _2   ((RD), (RS)|0x28, 0, 0, 0,0)\n#define RESTORErrr(RS1, RS2, RD) _2   ((RD), 61, (RS1), 0, 0, (RS2))\n#define RESTORErir(RS1, IMM, RD) _2i  ((RD), 61, (RS1), 1,    (IMM))\n\n#define SAVErrr(RS1, RS2, RD)\t_2   ((RD), 60, (RS1), 0, 0, (RS2))\n#define SAVErir(RS1, IMM, RD)\t_2i  ((RD), 60, (RS1), 1,    (IMM))\n#define SDIVrrr(RS1, RS2, RD)\t_2   ((RD), 15, (RS1), 0, 0, (RS2))\n#define SDIVrir(RS1, IMM, RD)\t_2i  ((RD), 15, (RS1), 1,    (IMM))\n#define SDIVCCrrr(RS1, RS2, RD) _2   ((RD), 31, (RS1), 0, 0, (RS2))\n#define SDIVCCrir(RS1, IMM, RD) _2i  ((RD), 31, (RS1), 1,    (IMM))\n#define SETHIir(IMM, RD)\t_0i  ((RD), 4, (IMM))\n#define SLLrrr(RS1, RS2, RD)\t_2   ((RD), 37, (RS1), 0, 0, (RS2))\n#define SLLrir(RS1, IMM, RD)\t_2i  ((RD), 37, (RS1), 1,    (IMM))\n#define SMULrrr(RS1, RS2, RD)\t_2   ((RD), 11, (RS1), 0, 0, (RS2))\n#define SMULrir(RS1, IMM, RD)\t_2i  ((RD), 11, (RS1), 1,    (IMM))\n#define SMULCCrrr(RS1, RS2, RD) _2   ((RD), 27, (RS1), 0, 0, (RS2))\n#define SMULCCrir(RS1, IMM, RD) _2i  ((RD), 27, (RS1), 1,    (IMM))\n#define SRArrr(RS1, RS2, RD)\t_2   ((RD), 39, (RS1), 0, 0, (RS2))\n#define SRArir(RS1, IMM, RD)\t_2i  ((RD), 39, (RS1), 1,    (IMM))\n#define SRLrrr(RS1, RS2, RD)\t_2   ((RD), 38, (RS1), 0, 0, (RS2))\n#define SRLrir(RS1, IMM, RD)\t_2i  ((RD), 38, (RS1), 1,    (IMM))\n#define STrx(RS, RD1, RD2)\t_3   ((RS),  4, (RD1), 0, 0, (RD2))\n#define STrm(RS, RD, IMM)\t_3i  ((RS),  4, (RD),  1,    (IMM))\n#define STBrx(RS, RD1, RD2)\t_3   ((RS),  5, (RD1), 0, 0, (RD2))\n#define STBrm(RS, RD, IMM)\t_3i  ((RS),  5, (RD),  1,    (IMM))\n#define STBAR()\t\t\t_0i  (0, 0x28, 15, 0, 0)\n#define STHrx(RS, RD1, RD2)\t_3   ((RS),  6, (RD1), 0, 0, (RD2))\n#define STHrm(RS, RD, IMM)\t_3i  ((RS),  6, (RD),  1,    (IMM))\n#define STDrx(RS, RD1, RD2)\t_3   ((RS),  7, (RD1), 0, 0, (RD2))\n#define STDrm(RS, RD, IMM)\t_3i  ((RS),  7, (RD),  1,    (IMM))\n#define SUBrrr(RS1, RS2, RD)\t_2   ((RD),  4, (RS1), 0, 0, (RS2))\n#define SUBrir(RS1, IMM, RD)\t_2i  ((RD),  4, (RS1), 1,    (IMM))\n#define SUBCCrrr(RS1, RS2, RD)\t_2   ((RD), 20, (RS1), 0, 0, (RS2))\n#define SUBCCrir(RS1, IMM, RD)\t_2i  ((RD), 20, (RS1), 1,    (IMM))\n#define SUBXrrr(RS1, RS2, RD)\t_2   ((RD), 12, (RS1), 0, 0, (RS2))\n#define SUBXrir(RS1, IMM, RD)\t_2i  ((RD), 12, (RS1), 1,    (IMM))\n#define SUBXCCrrr(RS1, RS2, RD)\t_2   ((RD), 28, (RS1), 0, 0, (RS2))\n#define SUBXCCrir(RS1, IMM, RD)\t_2i  ((RD), 28, (RS1), 1,    (IMM))\n\n#define UDIVrrr(RS1, RS2, RD)\t_2   ((RD), 14, (RS1), 0, 0, (RS2))\n#define UDIVrir(RS1, IMM, RD)\t_2i  ((RD), 14, (RS1), 1,    (IMM))\n#define UDIVCCrrr(RS1, RS2, RD) _2   ((RD), 30, (RS1), 0, 0, (RS2))\n#define UDIVCCrir(RS1, IMM, RD) _2i  ((RD), 30, (RS1), 1,    (IMM))\n#define UMULrrr(RS1, RS2, RD)\t_2   ((RD), 10, (RS1), 0, 0, (RS2))\n#define UMULrir(RS1, IMM, RD)\t_2i  ((RD), 10, (RS1), 1,    (IMM))\n#define UMULCCrrr(RS1, RS2, RD) _2   ((RD), 26, (RS1), 0, 0, (RS2))\n#define UMULCCrir(RS1, IMM, RD) _2i  ((RD), 26, (RS1), 1,    (IMM))\n\n#define WRrri(RS1, RS2, RD)\t_2   (0, (RD)|0x30,   RS1, 0, 0, (RS2))\n#define WRrii(RS1, IMM, RD)\t_2i  (0, (RD)|0x30,   RS1, 1,\t (IMM))\n\n#define XORrrr(RS1, RS2, RD)\t_2   ((RD),  3, (RS1), 0, 0, (RS2))\n#define XORrir(RS1, IMM, RD)\t_2i  ((RD),  3, (RS1), 1,    (IMM))\n#define XORCCrrr(RS1, RS2, RD)\t_2   ((RD), 19, (RS1), 0, 0, (RS2))\n#define XORCCrir(RS1, IMM, RD)\t_2i  ((RD), 19, (RS1), 1,    (IMM))\n\n/* synonyms */\n\n#define Bi(DISP)\t\tBAi((DISP))\n#define B_Ai(DISP)\t\tBA_Ai((DISP))\n#define BNZi(DISP)\t\tBNEi((DISP))\n#define BNZ_Ai(DISP)\t\tBNE_Ai((DISP))\n#define BZi(DISP)\t\tBEi((DISP))\n#define BZ_Ai(DISP)\t\tBE_Ai((DISP))\n#define BGEUi(DISP)\t\tBCCi((DISP))\n#define BGEU_Ai(DISP)\t\tBCC_Ai((DISP))\n#define BLUi(DISP)\t\tBCSi((DISP))\n#define BLU_Ai(DISP)\t\tBCS_Ai((DISP))\n\n#define LDUWxr(RS1, RS2, RD)\tLDxr((RS1), (RS2), (RD))\n#define LDUWmr(RS1, IMM, RD)\tLDmr((RS1), (IMM), (RD))\n#define LDSWxr(RS1, RS2, RD)\tLDxr((RS1), (RS2), (RD))\n#define LDSWmr(RS1, IMM, RD)\tLDmr((RS1), (IMM), (RD))\n\n#define STWrx(RS, RD1, RD2)\tSTrx((RS), (RD1),   (RD2))\n#define STWrm(RS, RD, IMM)\tSTrm((RS), (RD), (IMM))\n\n/* synthetic instructions [Table A-1, page 85] */\n\n#define BCLRrr(R,S)\t\tANDNrrr((R), (S), (S))\n#define BCLRir(I,R)\t\tANDNrir((R), (I), (R))\n#define BSETrr(R,S)\t\tORrrr((R), (S), (S))\n#define BSETir(I,R)\t\tORrir((R), (I), (R))\n#define BTOGrr(R,S)\t\tXORrrr((R), (S), (S))\n#define BTOGir(I,R)\t\tXORrir((R), (I), (R))\n#define BTSTrr(R,S)\t\tANDCCrrr((R), (S), 0)\n#define BTSTir(I,R)\t\tANDCCrir((R), (I), 0)\n\n#define CALLm(R,I)\t\tJMPLmr((R), (I), _Ro(7))\n#define CALLx(R,S)\t\tJMPLxr((R), (S), _Ro(7))\n\n#define CLRr(R)\t\t\tORrrr(0, 0, (R))\n#define CLRBm(R,I)\t\tSTBrm(0, (R), (I))\n#define CLRBx(R,S)\t\tSTBrm(0, (R), (S))\n#define CLRHm(R,I)\t\tSTHrm(0, (R), (I))\n#define CLRHx(R,S)\t\tSTHrm(0, (R), (S))\n#define CLRm(R,I)\t\tSTrm(0, (R), (I))\n#define CLRx(R,S)\t\tSTrm(0, (R), (S))\n\n#define CMPrr(RS1, RS2)\t\tSUBCCrrr((RS1), (RS2), 0)\n#define CMPri(RS1, IMM)\t\tSUBCCrir((RS1), (IMM), 0)\n\n#define DECr(R)\t\t\tSUBrir((R), 1, (R))\n#define DECir(I,R)\t\tSUBrir((R), (I), (R))\n#define DECCCr(R)\t\tSUBCCrir((R), 1, (R))\n#define DECCCir(I,R)\t\tSUBCCrir((R), (I), (R))\n\n#define INCr(R)\t\t\tADDrir((R), 1, (R))\n#define INCir(I,R)\t\tADDrir((R), (I), (R))\n#define INCCCr(R)\t\tADDCCrir((R), 1, (R))\n#define INCCCir(I,R)\t\tADDCCrir((R), (I), (R))\n\n#define JMPm(R,I)\t\tJMPLmr((R), (I), 0)\n#define JMPx(R,S)\t\tJMPLxr((R), (S), 0)\n\n#define MOVrr(R,S)\t\tORrrr(0, (R), (S))\n#define MOVir(I, R)\t\tORrir(0, (I), (R))\n\n#define NEGrr(R,S)\t\tSUBrrr(0, (R), (S))\n#define NEGr(R)\t\t\tSUBrrr(0, (R), (R))\n#define NOP()\t\t\tSETHIir(0, 0)\n\n#define NOTrr(R,S)\t\tXNORrrr((R), 0, (S))\n#define NOTr(R)\t\t\tXNORrrr((R), 0, (R))\n\n#define RESTORE()\t\tRESTORErrr(0, 0, 0)\n#define RET()\t\t\tJMPLmr(_Ri(7),8 ,0)\n#define RETL()\t\t\tJMPLmr(_Ro(7),8 ,0)\n\n#define SAVE()\t\t\tSAVErrr(0, 0, 0)\n#define SETir(I,R)\t\t(_siP(13,(I)) ? MOVir((I),(R)) : SETir2(_HI(I), _LO(I), (R)))\n#define SETir2(H,L,R)\t\t(SETHIir(H,R), (L ? ORrir(R,L,R) : 0))\n\n/* BNZ,a executes the delay instruction if NZ (so skips if Z)\n * BZ,a  executes the delay instruction if Z  (so skips if NZ). */\n#define SKIPZ()\t\t\t_0d  (1,  9, 2, 2) /* BNZ,a .+8 */\n#define SKIPNZ()\t\t_0d  (1,  1, 2, 2) /* BZ,a  .+8 */\n#define SKIP()\t\t\t_0d  (1,  0, 2, 0) /* BN,a  .   */\n\n#define TSTr(R)\t\t\tORCCrrr(0, (R), 0)\n\n#define WRii(IMM, RD)\t\tWRrii(0, (IMM), (RD))\n#define WRri(RS2, RD)\t\tWRrri(0, (RS2), (RD))\n\n#define LDFSRx(RS1, RS2)\t_3   (0, 33, (RS1), 0, 0, (RS2))\n#define LDFSRm(RS1, IMM)\t_3i  (0, 33, (RS1), 1,    (IMM))\n#define STFSRx(RD1, RD2)\t_3   (0, 37, (RD1), 0, 0, (RD2))\n#define STFSRm(RD, IMM)\t\t_3i  (0, 37, (RD),  1,    (IMM))\n\n#define FITODrr(FRS, FRD)\t\t_FP1((FRD),  0, 200, (FRS))\n#define FITOSrr(FRS, FRD)\t\t_FP1((FRD),  0, 196, (FRS))\n#define FDTOIrr(FRS, FRD)\t\t_FP1((FRD),  0, 210, (FRS))\n#define FSTOIrr(FRS, FRD)\t\t_FP1((FRD),  0, 209, (FRS))\n#define FSTODrr(FRS, FRD)\t\t_FP1((FRD),  0, 201, (FRS))\n#define FDTOSrr(FRS, FRD)\t\t_FP1((FRD),  0, 198, (FRS))\n#define FMOVSrr(FRS, FRD)\t\t_FP1((FRD),  0,   1, (FRS))\n#define FNEGSrr(FRS, FRD)\t\t_FP1((FRD),  0,   5, (FRS))\n#define FABSSrr(FRS, FRD)\t\t_FP1((FRD),  0,   9, (FRS))\n#define FMOVDrr(FRS, FRD)\t\t_FP1((FRD),  0,   2, (FRS))\n#define FNEGDrr(FRS, FRD)\t\t_FP1((FRD),  0,   6, (FRS))\n#define FABSDrr(FRS, FRD)\t\t_FP1((FRD),  0,  10, (FRS))\n#define FSQRTDrr(FRS, FRD)\t\t_FP1((FRD),  0,  42, (FRS))\n#define FSQRTSrr(FRS, FRD)\t\t_FP1((FRD),  0,  41, (FRS))\n\n#define FADDSrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  65, (FRS2))\n#define FSUBSrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  69, (FRS2))\n#define FMULSrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  73, (FRS2))\n#define FDIVSrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  77, (FRS2))\n\n#define FADDDrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  66, (FRS2))\n#define FSUBDrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  70, (FRS2))\n#define FMULDrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  74, (FRS2))\n#define FDIVDrrr(FRS1, FRS2, FRD)\t_FP1((FRD),  (FRS1),  78, (FRS2))\n\n#define FCMPSrr(FRS1, FRS2)\t\t_FP2(0,      (FRS1),  81, (FRS2))\n#define FCMPDrr(FRS1, FRS2)\t\t_FP2(0,      (FRS1),  82, (FRS2))\n\n#define LDFxr(RS1, RS2, RD)\t_3   ((RD), 32, (RS1), 0, 0, (RS2))\n#define LDFmr(RS1, IMM, RD)\t_3i  ((RD), 32, (RS1), 1,    (IMM))\n#define LDDFxr(RS1, RS2, RD)\t_3   ((RD), 35, (RS1), 0, 0, (RS2))\n#define LDDFmr(RS1, IMM, RD)\t_3i  ((RD), 35, (RS1), 1,    (IMM))\n#define STFrx(RS, RD1, RD2)\t_3   ((RS), 36, (RD1), 0, 0, (RD2))\n#define STFrm(RS, RD1, IMM)\t_3i  ((RS), 36, (RD1), 1,    (IMM))\n#define STDFrx(RS, RD1, RD2)\t_3   ((RS), 39, (RD1), 0, 0, (RD2))\n#define STDFrm(RS, RD1, IMM)\t_3i  ((RS), 39, (RD1), 1,    (IMM))\n\n#define FBNi(DISP)\t\t_0   (0,  0, 6, (DISP))\n#define FBN_Ai(DISP)\t\t_0   (1,  0, 6, (DISP))\n#define FBNEi(DISP)\t\t_0   (0,  1, 6, (DISP))\n#define FBNE_Ai(DISP)\t\t_0   (1,  1, 6, (DISP))\n#define FBLGi(DISP)\t\t_0   (0,  2, 6, (DISP))\n#define FBLG_Ai(DISP)\t\t_0   (1,  2, 6, (DISP))\n#define FBULi(DISP)\t\t_0   (0,  3, 6, (DISP))\n#define FBUL_Ai(DISP)\t\t_0   (1,  3, 6, (DISP))\n#define FBLi(DISP)\t\t_0   (0,  4, 6, (DISP))\n#define FBL_Ai(DISP)\t\t_0   (1,  4, 6, (DISP))\n#define FBUGi(DISP)\t\t_0   (0,  5, 6, (DISP))\n#define FBUG_Ai(DISP)\t\t_0   (1,  5, 6, (DISP))\n#define FBGi(DISP)\t\t_0   (0,  6, 6, (DISP))\n#define FBG_Ai(DISP)\t\t_0   (1,  6, 6, (DISP))\n#define FBUi(DISP)\t\t_0   (0,  7, 6, (DISP))\n#define FBU_Ai(DISP)\t\t_0   (1,  7, 6, (DISP))\n#define FBAi(DISP)\t\t_0   (0,  8, 6, (DISP))\n#define FBA_Ai(DISP)\t\t_0   (1,  8, 6, (DISP))\n#define FBEi(DISP)\t\t_0   (0,  9, 6, (DISP))\n#define FBE_Ai(DISP)\t\t_0   (1,  9, 6, (DISP))\n#define FBUEi(DISP)\t\t_0   (0, 10, 6, (DISP))\n#define FBUE_Ai(DISP)\t\t_0   (1, 10, 6, (DISP))\n#define FBGEi(DISP)\t\t_0   (0, 11, 6, (DISP))\n#define FBGE_Ai(DISP)\t\t_0   (1, 11, 6, (DISP))\n#define FBUGEi(DISP)\t\t_0   (0, 12, 6, (DISP))\n#define FBUGE_Ai(DISP)\t\t_0   (1, 12, 6, (DISP))\n#define FBLEi(DISP)\t\t_0   (0, 13, 6, (DISP))\n#define FBLE_Ai(DISP)\t\t_0   (1, 13, 6, (DISP))\n#define FBULEi(DISP)\t\t_0   (0, 14, 6, (DISP))\n#define FBULE_Ai(DISP)\t\t_0   (1, 14, 6, (DISP))\n#define FBOi(DISP)\t\t_0   (0, 15, 6, (DISP))\n#define FBO_Ai(DISP)\t\t_0   (1, 15, 6, (DISP))\n\n#endif\n#endif /* __ccg_asm_sparc_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/sparc/core.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer (SPARC version)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002, 2006 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n#ifndef __lightning_core_h\n#define __lightning_core_h\n\n#define JIT_R_NUM\t\t3\n#ifdef JIT_NEED_PUSH_POP\n# define JIT_V_NUM\t\t7\n#else\n# define JIT_V_NUM\t\t8\n#endif\n\n#define JIT_R(i)\t\t_Rg(2 + (i))\n#define JIT_V(i)\t\t_Rl(i)\n\n#define JIT_BIG\t\t\t_Rg(1)\t/* %g1 used to make 32-bit operands */\n#define JIT_BIG2\t\t_Ro(7)\t/* %o7 used to make 32-bit compare operands */\n#define JIT_SP\t\t\t_Ro(6)\n#define JIT_FP\t\t\t_Ri(6)\n\n#define JIT_RZERO\t\t_Rg(0)\n#define JIT_RET\t\t\t_Ri(0)\n\n/* Delay slot scheduling: jmp generates branches with annulled delay\n * slots; we toggle the annul bit if we can fill the slot.  CALLs and\n * cond. branches have a different meaning for the annul bit, so we\n * automatically generate a NOP and eventually copy the delay insn onto\n * it.  Delay slots in RET are already used for RESTORE, so we don't\n * schedule them.\n *\n *\t,--- _jit->x.pc\n * insn X       X\t\t\t\tbefore\n * cmp  branch  insn  X\t   X\t\t\tafter (branch)\n *\t\t      `--- _jit->x.pc\t\t\t\n * call insn    insn X\t\t\t\tafter (call)\n *\t\t`--- _jit->x.pc\t\t\t\n */\n\n\n/* Implementation of `allocai', `pushr' and `popr'.\n *\n * The SysV ABI for SPARC is specified in \"System V Application Binary\n * Interface, SPARC Processor Supplement, Third Edition\", available from\n * http://www.sparc.org/resource.htm .\n *\n * According to the SysV ABI specs: \"At all times the stack pointer must\n * point to a doubleword aligned, 16- word window save area.\" (p 3-12).  The\n * stack layout is shown in Figure 3-16 and the layout of a C stack frame is\n * given in Figure 3-47: the area between %sp and %sp+104 is reserved for\n * specific purposes, and automatic variables go between %sp+104 and %fp and\n * are typically addressed using negative offsets relative to %fp.\n *\n * Stack space may be allocated dynamically as decribed in Section\n * \"Allocating Stack Space Dynamically\", p. 3-36, and shown in Figure 3-49.\n * `allocai' is implemented by patching a function prolog's `save'\n * instruction in order to increase the initial frame size.  `pushr' is\n * implemented by storing register into a fixed-size region right below %fp\n * (thereby limiting the number of registers that may be pushed).\n *\n * Thus, %fp to %fp - JIT_SPARC_MAX_STACK_REGISTER_AREA is reserved for\n * pushed registers, and %fp - JIT_SPARC_MAX_STACK_REGISTER_AREA and below is\n * used for the memory allocated via `allocai'.  */\n\n#ifdef JIT_NEED_PUSH_POP\n/* Maximum size for the \"automatic variables\" area on the stack (the area\n   that starts from %fp-1 and ends at %sp+104, see the ABI doc).  This must\n   be a multiple of 8 so that %sp remains double-word aligned as required by\n   SysV ABI (see page 3-10).  In lightning, this effectively limits the\n   number of registers that can be pushed with `pushr'.\n\n   Initialize %l7 to contain the (negative) offset relative to %fp of the last\n   register pushed.  */\n# define JIT_SPARC_MAX_STACK_REGISTER_AREA  (8 * sizeof (void *))\n# define JIT_SPARC_INIT_PUSH_POP()          (MOVrr (_Rg(0), _Rl(7)))\n#else\n# define JIT_SPARC_MAX_STACK_REGISTER_AREA  0\n# define JIT_SPARC_INIT_PUSH_POP()          ((void)0)\n#endif\n\n/* Minimum size of a stack frame.  */\n#define JIT_SPARC_MIN_FRAME_SIZE  (104 + JIT_SPARC_MAX_STACK_REGISTER_AREA)\n\n\n/* Round AMOUNT to the closest higher multiple of 2^ALIGNMENT.  */\n#define _jit_round(alignment, amount)\t\t\t\t\\\n  (((amount) & (_MASK (alignment)))\t\t\t\t\\\n   ? (((amount) & (~_MASK (alignment))) + (1 << (alignment)))\t\\\n   : (amount))\n\n/* Patch a `save' instruction (with immediate operand) so that it increases\n   %sp by AMOUNT.  AMOUNT is rounded so that %sp remains 8-octet aligned.  */\n#define jit_patch_save(amount)\t\t\t\t\t\\\n  (* (_jitl).save &= ~_MASK (13),\t\t\t\t\\\n   * (_jitl).save |= _ck_d (13, -_jit_round (3, amount)))\n\n/* Allocate AMOUNT octets on the frame by patching the `save' instruction.  */\n#define jit_allocai(amount)\t\t\t\t\\\n  (jit_patch_save ((_jitl).frame_size + (amount)),\t\\\n   (_jitl).frame_size += (amount),\t\t\t\\\n   (_jitl).alloca_offset -= (amount),\t\t\t\\\n   (_jitl).alloca_offset)\n\n#define jit_fill_delay_after(branch) (_jitl.delay = *--_jit->x.pc, \t\t\t\t\t \\\n\t((branch) == _jit->x.pc\t\t\t\t\t  /* check if NOP was inserted */\t\t \\\n\t\t? (_jit->x.pc[-1] ^= 1<<29)\t\t\t  /* no if branch, toggle annul bit  */\t \\\n\t\t: (_jit->x.pc[-1] = _jitl.delay)),\t\t\t  /* yes if call, replace NOP with delay insn */ \\\n\t*_jit->x.pc = _jitl.delay, _jit->x.pc - 1)\t\t\t  /* return addr of delay insn */\n\n/* If possible, use the `small' instruction (rs, imm, rd)\n * else load imm into %l6 and use the `big' instruction (rs, %l6, rd)\n * jit_chk_imm2 uses %l7 instead of %l6 to avoid conflicts when using delay slots\n */\n#define jit_chk_imm(imm, small, big)\t\t(_siP(13,(imm)) ? (small) : (SETir((imm), JIT_BIG),  (big)) )\n#define jit_chk_imm2(imm, small, big)\t\t(_siP(13,(imm)) ? (small) : (SETir((imm), JIT_BIG2), (big)) )\n\n/* Helper macros for branches */\n#define jit_branchi(rs, is, jmp, nop)\t\t(jit_chk_imm2(is, CMPri(rs, is), CMPrr(rs, JIT_BIG2)), jmp, nop, _jit->x.pc - 1)\n#define jit_branchr(s1, s2, jmp, nop)\t\t(\t\t  CMPrr(s1, s2), \t\t       jmp, nop, _jit->x.pc - 1)\n\n/* Helper macros for boolean tests -- delay slot sets d to 1;\n * taken branch leaves it to 1, not-taken branch resets it to 0 */\n#define jit_booli(d, rs, is, jmp)\t\t(jit_chk_imm (is, CMPri(rs, is), CMPrr(rs, JIT_BIG)), jmp, MOVir(1, (d)), MOVir(0, (d)))\n#define jit_boolr(d, s1, s2, jmp)\t\t(\t\t  CMPrr(s1, s2), \t\t      jmp, MOVir(1, (d)), MOVir(0, (d)))\n\n/* Helper macros for division\n * The architecture specifies that there must be 3 instructions between *\n * a y register write and a use of it for correct results. */\n#define jit_prepare_y(rs, is)\t\t(SRArir(rs, 31, JIT_BIG), WRri(JIT_BIG, _y), NOP(), NOP(), NOP(), _jit->x.pc -= jit_immsize(is))\n#define jit_clr_y(rs, is)\t\t(\t\t\t  WRri(0,\t_y), NOP(), NOP(), NOP(), _jit->x.pc -= jit_immsize(is))\n\n#define jit_modr(jit_div, jit_mul, d, s1, s2)   \\\n        (jit_div (JIT_BIG, s1, s2),             \\\n         jit_mul (JIT_BIG, JIT_BIG, s2),        \\\n         jit_subr_i (d, s1, JIT_BIG))\n\n#define jit_modi(jit_divi, jit_muli, jit_divr, jit_mulr, d, rs, is)\t\\\n        (_siP(13,(is))\t\t\t\t\t\t\t\\\n         ? (jit_divi (JIT_BIG, rs, is),\t\t\t\t\t\\\n            jit_muli (JIT_BIG, JIT_BIG, is),\t\t\t\t\\\n            jit_subr_i (d, rs, JIT_BIG))\t\t\t\t\\\n         : (SETir ((is), JIT_BIG2),\t\t\t\t\t\\\n            jit_modr (jit_divr, jit_mulr, d, rs, JIT_BIG2)))\n\n/* How many instruction are needed to put imm in a register.  */\n#define jit_immsize(imm)\t(!(imm) ? 0 :\t\t\t\\\n\t\t\t\t(!_siP(13,(imm)) && ((imm) & 0x3ff)  ? 2 : 1))\n\n\n/* branch instructions return the address of the *delay* instruction -- this\n * is just a helper macro that makes jit_patch more readable.\n */\n#define jit_patch_(jump_pc,pv)\t\t\t\t\t\t\\\n\t(*jump_pc &= ~_MASK(22),\t\t\t\t\t\\\n\t *jump_pc |= ((_jit_UL((pv)) - _jit_UL(jump_pc)) >> 2) & _MASK(22))\n\n#define jit_patch_set(sethi_pc, or_pc, dest)\t\t\t\\\n\t(*(sethi_pc) &= ~_MASK(22), *(sethi_pc) |= _HI(dest),\t\\\n\t *(or_pc) &= ~_MASK(13), *(or_pc) |= _LO(dest))\t\t\\\n\n#define jit_patch_movi(movi_pc, val)\t\t\t\t\\\n\tjit_patch_set((movi_pc) - 2, (movi_pc) - 1, (val))\n\n#define\tjit_arg_c()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_i()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_l()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_p()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_s()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_uc()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_ui()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_ul()\t\t\t(_jitl.nextarg_get++)\n#define\tjit_arg_us()\t\t\t(_jitl.nextarg_get++)\n#define jit_addi_i(d, rs, is)\t\tjit_chk_imm((is), ADDrir((rs), (is), (d)), ADDrrr((rs), JIT_BIG, (d)))\n#define jit_addr_i(d, s1, s2)\t\t\t\t  ADDrrr((s1), (s2), (d))\n#define jit_addci_i(d, rs, is)\t\tjit_chk_imm((is), ADDCCrir((rs), (is), (d)), ADDCCrrr((rs), JIT_BIG, (d)))\n#define jit_addcr_i(d, s1, s2)\t\t\t\t  ADDCCrrr((s1), (s2), (d))\n#define jit_addxi_i(d, rs, is)\t\tjit_chk_imm((is), ADDXCCrir((rs), (is), (d)), ADDXCCrrr((rs), JIT_BIG, (d)))\n#define jit_addxr_i(d, s1, s2)\t\t\t\t  ADDXCCrrr((s1), (s2), (d))\n#define jit_andi_i(d, rs, is)\t\tjit_chk_imm((is), ANDrir((rs), (is), (d)), ANDrrr((rs), JIT_BIG, (d)))\n#define jit_andr_i(d, s1, s2)\t\t\t\t  ANDrrr((s1), (s2), (d))\n#define jit_beqi_i(label, rs, is)\tjit_branchi((rs), (is), BEi((label)), NOP() )\n#define jit_beqr_i(label, s1, s2)\tjit_branchr((s1), (s2), BEi((label)), NOP() )\n#define jit_bgei_i(label, rs, is)\tjit_branchi((rs), (is), BGEi((label)), NOP() )\n#define jit_bgei_ui(label, rs, is)\tjit_branchi((rs), (is), BGEUi((label)), NOP() )\n#define jit_bger_i(label, s1, s2)\tjit_branchr((s1), (s2), BGEi((label)), NOP() )\n#define jit_bger_ui(label, s1, s2)\tjit_branchr((s1), (s2), BGEUi((label)), NOP() )\n#define jit_bgti_i(label, rs, is)\tjit_branchi((rs), (is), BGi((label)), NOP() )\n#define jit_bgti_ui(label, rs, is)\tjit_branchi((rs), (is), BGUi((label)), NOP() )\n#define jit_bgtr_i(label, s1, s2)\tjit_branchr((s1), (s2), BGi((label)), NOP() )\n#define jit_bgtr_ui(label, s1, s2)\tjit_branchr((s1), (s2), BGUi((label)), NOP() )\n#define jit_blei_i(label, rs, is)\tjit_branchi((rs), (is), BLEi((label)), NOP() )\n#define jit_blei_ui(label, rs, is)\tjit_branchi((rs), (is), BLEUi((label)), NOP() )\n#define jit_bler_i(label, s1, s2)\tjit_branchr((s1), (s2), BLEi((label)), NOP() )\n#define jit_bler_ui(label, s1, s2)\tjit_branchr((s1), (s2), BLEUi((label)), NOP() )\n#define jit_blti_i(label, rs, is)\tjit_branchi((rs), (is), BLi((label)), NOP() )\n#define jit_blti_ui(label, rs, is)\tjit_branchi((rs), (is), BLUi((label)), NOP() )\n#define jit_bltr_i(label, s1, s2)\tjit_branchr((s1), (s2), BLi((label)), NOP() )\n#define jit_bltr_ui(label, s1, s2)\tjit_branchr((s1), (s2), BLUi((label)), NOP() )\n#define jit_bnei_i(label, rs, is)\tjit_branchi((rs), (is), BNEi((label)), NOP() )\n#define jit_bner_i(label, s1, s2)\tjit_branchr((s1), (s2), BNEi((label)), NOP() )\n#define jit_bmsi_i(label, rs, is)\t(jit_chk_imm((is), BTSTir((is), (rs)), BTSTrr((rs), JIT_BIG)), BNEi((label)), NOP(), _jit->x.pc - 1)\n#define jit_bmci_i(label, rs, is)\t(jit_chk_imm((is), BTSTir((is), (rs)), BTSTrr((rs), JIT_BIG)), BEi((label)), NOP(),  _jit->x.pc - 1)\n#define jit_bmsr_i(label, s1, s2)\t(\t\t   BTSTrr((s1), (s2)),\t\t\t       BNEi((label)), NOP(), _jit->x.pc - 1)\n#define jit_bmcr_i(label, s1, s2)\t(\t\t   BTSTrr((s1), (s2)),\t\t\t       BEi((label)), NOP(),  _jit->x.pc - 1)\n#define jit_boaddi_i(label, rs, is)\t(jit_chk_imm((is), ADDCCrir((rs), (is), (rs)), ADDCCrrr((rs), JIT_BIG, (rs))), BVSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_bosubi_i(label, rs, is)\t(jit_chk_imm((is), SUBCCrir((rs), (is), (rs)), SUBCCrrr((rs), JIT_BIG, (rs))), BVSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_boaddr_i(label, s1, s2)\t(\t\t   ADDCCrrr((s1), (s2), (s1)),\t\t\t         BVSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_bosubr_i(label, s1, s2)\t(\t\t   SUBCCrrr((s1), (s2), (s1)),\t\t\t         BVSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_boaddi_ui(label, rs, is)\t(jit_chk_imm((is), ADDCCrir((rs), (is), (rs)), ADDCCrrr((rs), JIT_BIG, (rs))), BCSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_bosubi_ui(label, rs, is)\t(jit_chk_imm((is), SUBCCrir((rs), (is), (rs)), SUBCCrrr((rs), JIT_BIG, (rs))), BCSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_boaddr_ui(label, s1, s2)\t(\t\t   ADDCCrrr((s1), (s2), (s1)),\t\t\t         BCSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_bosubr_ui(label, s1, s2)\t(\t\t   SUBCCrrr((s1), (s2), (s1)),\t\t\t         BCSi((label)), NOP(), _jit->x.pc - 1)\n#define jit_calli(label)\t\t(CALLi(label), NOP(), _jit->x.pc - 1)\n#define jit_callr(reg)\t\t\t(CALLx((reg), 0), NOP())\n\n#define jit_divi_i(d, rs, is)\t\t(jit_prepare_y((rs), 0x12345678), SETir((is), JIT_BIG), SDIVrrr((rs), JIT_BIG, (d)) )\n#define jit_divi_ui(d, rs, is)\t\t(jit_clr_y((rs),     0x12345678), SETir((is), JIT_BIG), UDIVrrr((rs), JIT_BIG, (d)) )\n#define jit_divr_i(d, s1, s2)\t\t(jit_prepare_y((s1), 0), \t\t\t\tSDIVrrr((s1), (s2), (d)))\n#define jit_divr_ui(d, s1, s2)\t\t(jit_clr_y((s1),     0), \t\t\t\tUDIVrrr((s1), (s2), (d)))\n#define jit_eqi_i(d, rs, is)\t\tjit_chk_imm((is), \\\n  (SUBCCrir((rs), (is), (d)), ADDXCCrir((d), -1, JIT_BIG), SUBXrir(0,-1,(d))),\\\n  jit_eqr_i(d, rs, JIT_BIG))\n#define jit_eqr_i(d, s1, s2)\t\t  (SUBCCrrr((s1), (s2), (d)), ADDXCCrir((d), -1, JIT_BIG), SUBXrir(0,-1,(d)))\n#define jit_nei_i(d, rs, is)\t\tjit_chk_imm((is), \\\n  (SUBCCrir((rs), (is), (d)), ADDXCCrir((d), -1, JIT_BIG), ADDXrrr(0,0,(d))),\\\n  jit_ner_i(d, rs, JIT_BIG))\n#define jit_ner_i(d, s1, s2)\t\t  (SUBCCrrr((s1), (s2), (d)), ADDXCCrir((d), -1, JIT_BIG), ADDXrrr(0,0,(d)))\n#define jit_gei_i(d, rs, is)\t\tjit_booli ((d), (rs), (is), BGEi(_jit->x.pc + 3) )\n#define jit_gei_ui(d, rs, is)\t\tjit_booli ((d), (rs), (is), BGEUi(_jit->x.pc + 3))\n#define jit_ger_i(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BGEi(_jit->x.pc + 3) )\n#define jit_ger_ui(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BGEUi(_jit->x.pc + 3))\n#define jit_gti_i(d, rs, is)\t\tjit_booli ((d), (rs), (is), BGi(_jit->x.pc + 3) )\n#define jit_gti_ui(d, rs, is)\t\tjit_booli ((d), (rs), (is), BGUi(_jit->x.pc + 3) )\n#define jit_gtr_i(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BGi(_jit->x.pc + 3)  )\n#define jit_gtr_ui(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BGUi(_jit->x.pc + 3) )\n#define jit_hmuli_i(d, rs, is)\t\t(jit_muli_i (JIT_BIG, (rs), (is)), RDir (_y, (d)))\n#define jit_hmuli_ui(d, rs, is)\t\t(jit_muli_ui(JIT_BIG, (rs), (is)), RDir (_y, (d)))\n#define jit_hmulr_i(d, s1, s2)\t\t(jit_mulr_i (JIT_BIG, (s1), (s2)), RDir (_y, (d)))\n#define jit_hmulr_ui(d, s1, s2)\t\t(jit_mulr_ui(JIT_BIG, (s1), (s2)), RDir (_y, (d)))\n#define jit_jmpi(label)\t\t\t(BA_Ai((label)), _jit->x.pc)\n#define jit_jmpr(reg)\t\t\t(JMPx(JIT_RZERO, (reg)), NOP(), _jit->x.pc - 1)\n#define jit_ldxi_c(d, rs, is)\t\tjit_chk_imm((is), LDSBmr((rs), (is), (d)), LDSBxr((rs), JIT_BIG, (d)))\n#define jit_ldxi_i(d, rs, is)\t\tjit_chk_imm((is), LDSWmr((rs), (is), (d)), LDSWxr((rs), JIT_BIG, (d)))\n#define jit_ldxi_s(d, rs, is)\t\tjit_chk_imm((is), LDSHmr((rs), (is), (d)), LDSHxr((rs), JIT_BIG, (d)))\n#define jit_ldxi_uc(d, rs, is)\t\tjit_chk_imm((is), LDUBmr((rs), (is), (d)), LDUBxr((rs), JIT_BIG, (d)))\n#define jit_ldxi_us(d, rs, is)\t\tjit_chk_imm((is), LDUHmr((rs), (is), (d)), LDUHxr((rs), JIT_BIG, (d)))\n#define jit_ldxr_c(d, s1, s2)\t\t\t\t  LDSBxr((s1), (s2), (d))\n#define jit_ldxr_i(d, s1, s2)\t\t\t\t  LDSWxr((s1), (s2), (d))\n#define jit_ldxr_s(d, s1, s2)\t\t\t\t  LDSHxr((s1), (s2), (d))\n#define jit_ldxr_uc(d, s1, s2)\t\t\t\t  LDUBxr((s1), (s2), (d))\n#define jit_ldxr_us(d, s1, s2)\t\t\t\t  LDUHxr((s1), (s2), (d))\n#define jit_lei_i(d, rs, is)\t\tjit_booli ((d), (rs), (is), BLEi(_jit->x.pc + 3) )\n#define jit_lei_ui(d, rs, is)\t\tjit_booli ((d), (rs), (is), BLEUi(_jit->x.pc + 3))\n#define jit_ler_i(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BLEi(_jit->x.pc + 3) )\n#define jit_ler_ui(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BLEUi(_jit->x.pc + 3))\n#define jit_lshi_i(d, rs, is)\t\tSLLrir((rs), (is), (d))\n#define jit_lshr_i(d, r1, r2)\t\tSLLrrr((r1), (r2), (d))\n#define jit_lti_i(d, rs, is)\t\tjit_booli ((d), (rs), (is), BLi(_jit->x.pc + 3)  )\n#define jit_lti_ui(d, rs, is)\t\tjit_booli ((d), (rs), (is), BLUi(_jit->x.pc + 3) )\n#define jit_ltr_i(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BLi(_jit->x.pc + 3)  )\n#define jit_ltr_ui(d, s1, s2)\t\tjit_boolr ((d), (s1), (s2), BLUi(_jit->x.pc + 3) )\n#define jit_modi_i(d, rs, is)           jit_modi(jit_divi_i, jit_muli_i, jit_divr_i, jit_mulr_i, (d), (rs), (is))\n#define jit_modi_ui(d, rs, is)          jit_modi(jit_divi_ui, jit_muli_ui, jit_divr_ui, jit_mulr_ui, (d), (rs), (is))\n#define jit_modr_i(d, s1, s2)           jit_modr(jit_divr_i, jit_mulr_i, (d), (s1), (s2))\n#define jit_modr_ui(d, s1, s2)          jit_modr(jit_divr_ui, jit_mulr_ui, (d), (s1), (s2))\n#define jit_movi_i(d, is)\t\tSETir((is), (d))\n#define jit_movi_p(d, is)\t\t(SETir2(_HI((is)), _LO((is)), (d)), _jit->x.pc)\n#define jit_movr_i(d, rs)\t\tMOVrr((rs), (d))\n#define jit_muli_i(d, rs, is)\t\tjit_chk_imm((is), SMULrir((rs), (is), (d)), SMULrrr((rs), JIT_BIG, (d)))\n#define jit_muli_ui(d, rs, is)\t\tjit_chk_imm((is), UMULrir((rs), (is), (d)), UMULrrr((rs), JIT_BIG, (d)))\n#define jit_mulr_i(d, s1, s2)\t\t\t\t  SMULrrr((s1), (s2), (d))\n#define jit_mulr_ui(d, s1, s2)\t\t\t\t  UMULrrr((s1), (s2), (d))\n#define jit_nop()\t\t\tNOP()\n#define jit_ori_i(d, rs, is)\t\tjit_chk_imm((is), ORrir((rs), (is), (d)), ORrrr((rs), JIT_BIG, (d)))\n#define jit_orr_i(d, s1, s2)\t\t\t\t  ORrrr((s1), (s2), (d))\n#define jit_patch_at(delay_pc, pv)\tjit_patch_ (((delay_pc) - 1) , (pv))\n#define jit_prepare_i(num)\t\t(_jitl.nextarg_put += (num))\n#define jit_prolog(numargs)\t\t(_jitl.save = (jit_insn *) _jit->x.pc, SAVErir (JIT_SP, -JIT_SPARC_MIN_FRAME_SIZE, JIT_SP), _jitl.frame_size = JIT_SPARC_MIN_FRAME_SIZE, _jitl.alloca_offset = -JIT_SPARC_MAX_STACK_REGISTER_AREA, _jitl.nextarg_get = _Ri(0), JIT_SPARC_INIT_PUSH_POP ())\n\n#define jit_pusharg_i(rs)\t\t(--_jitl.nextarg_put, MOVrr((rs), _Ro(_jitl.nextarg_put)))\n#define jit_ret()\t\t\t(RET(), RESTORE())\n#define jit_retval_i(rd)\t\tMOVrr(_Ro(0), (rd))\n#define jit_rshi_i(d, rs, is)\t\tSRArir((rs), (is), (d))\n#define jit_rshi_ui(d, rs, is)\t\tSRLrir((rs), (is), (d))\n#define jit_rshr_i(d, r1, r2)\t\tSRArrr((r1), (r2), (d))\n#define jit_rshr_ui(d, r1, r2)\t\tSRLrrr((r1), (r2), (d))\n#define jit_stxi_c(id, rd, rs)\t\tjit_chk_imm((id), STBrm((rs), (rd), (id)), STBrx((rs), (rd), JIT_BIG))\n#define jit_stxi_i(id, rd, rs)\t\tjit_chk_imm((id), STWrm((rs), (rd), (id)), STWrx((rs), (rd), JIT_BIG))\n#define jit_stxi_s(id, rd, rs)\t\tjit_chk_imm((id), STHrm((rs), (rd), (id)), STHrx((rs), (rd), JIT_BIG))\n#define jit_stxr_c(d1, d2, rs)\t\t\t\t  STBrx((rs), (d1), (d2))\n#define jit_stxr_i(d1, d2, rs)\t\t\t\t  STWrx((rs), (d1), (d2))\n#define jit_stxr_s(d1, d2, rs)\t\t\t\t  STHrx((rs), (d1), (d2))\n#define jit_subr_i(d, s1, s2)\t\t\t\t  SUBrrr((s1), (s2), (d))\n#define jit_subcr_i(d, s1, s2)\t\t\t\t  SUBCCrrr((s1), (s2), (d))\n#define jit_subxi_i(d, rs, is)\t\tjit_chk_imm((is), SUBXCCrir((rs), (is), (d)), SUBXCCrrr((rs), JIT_BIG, (d)))\n#define jit_subxr_i(d, s1, s2)\t\t\t\t  SUBXCCrrr((s1), (s2), (d))\n#define jit_xori_i(d, rs, is)\t\tjit_chk_imm((is), XORrir((rs), (is), (d)), XORrrr((rs), JIT_BIG, (d)))\n#define jit_xorr_i(d, s1, s2)\t\t\t\t  XORrrr((s1), (s2), (d))\n\n#ifdef JIT_NEED_PUSH_POP\n# define jit_pushr_i(rs)\t\t(SUBrir(_Rl(7), sizeof (void *), _Rl(7)), STWrx((rs), JIT_FP, _Rl(7)))\n# define jit_popr_i(rd)\t\t\t(LDSWxr(_Rl(7), JIT_FP, (rd)), ADDrir(_Rl(7), sizeof (void *), _Rl(7)))\n#endif\n\n#endif /* __lightning_core_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/sparc/fp.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tRun-time assembler & support macros for the SPARC math unit\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002, 2004 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n\n\n#ifndef __lightning_asm_fp_h\n#define __lightning_asm_fp_h\n\n#include <float.h>\n\n#define JIT_FPR_NUM\t6\n#define JIT_FPRET\t0\n#define JIT_FPR(i)\t(30-(i)*2)\n#define JIT_FPTMP\t18\n\n#define jit_addr_f(rd,s1,s2)\tFADDSrrr((s1), (s2), (rd))\n#define jit_subr_f(rd,s1,s2)\tFSUBSrrr((s1), (s2), (rd))\n#define jit_mulr_f(rd,s1,s2)\tFMULSrrr((s1), (s2), (rd))\n#define jit_divr_f(rd,s1,s2)\tFDIVSrrr((s1), (s2), (rd))\n\n#define jit_addr_d(rd,s1,s2)\tFADDDrrr((s1), (s2), (rd))\n#define jit_subr_d(rd,s1,s2)\tFSUBDrrr((s1), (s2), (rd))\n#define jit_mulr_d(rd,s1,s2)\tFMULDrrr((s1), (s2), (rd))\n#define jit_divr_d(rd,s1,s2)\tFDIVDrrr((s1), (s2), (rd))\n\n#define jit_movr_f(rd,rs)\tFMOVSrr((rs), (rd))\n#define jit_abs_d(rd,rs)\tFABSSrr((rs), (rd))\n#define jit_negr_d(rd,rs)\tFNEGSrr((rs), (rd))\n#define jit_sqrt_d(rd,rs)\tFSQRTSrr((rs), (rd))\n#define jit_movr_d(rd,rs)\tFMOVDrr((rs), (rd))\n#define jit_abs_f(rd,rs)\tFABSDrr((rs), (rd))\n#define jit_negr_f(rd,rs)\tFNEGDrr((rs), (rd))\n#define jit_sqrt_f(rd,rs)\tFSQRTDrr((rs), (rd))\n#define jit_extr_f_d(rd, rs)\tFSTODrr((rs), (rd))\n#define jit_extr_d_f(rd, rs)\tFDTOSrr((rs), (rd))\n\n#define jit_movi_f(rd,immf)\t\t\t  \\\n    do {\t\t\t\t\t  \\\n      float _v = (immf);                          \\\n      _1(_jit->x.pc + 3), LDFmr(_Ro(7), 8, (rd));  \\\n      memcpy(_jit->x.uc_pc, &_v, sizeof (float));  \\\n      _jit->x.uc_pc += sizeof (float);             \\\n    } while(0)\n\n#define jit_movi_d(rd,immd)\t\t\t \t\\\n    do {\t\t\t\t\t \t\\\n      double _v = (immd);                        \t\\\n      if ((long)_jit->x.pc & 4) NOP();\t\t\t\\\n      _1(_jit->x.pc + 4);\t\t\t\t\\\n      LDDFmr(_Ro(7), 8, (rd));\t\t\t\t\\\n      memcpy(_jit->x.uc_pc, &_v, sizeof (double));\t\\\n      _jit->x.uc_pc += sizeof (double);           \t\\\n    } while(0)\n\n\n#define jit_ldxi_f(rd, rs, is)\t\tjit_chk_imm((is), LDFmr((rs), (is), (rd)), LDFxr((rs), JIT_BIG, (rd)))\n#define jit_ldxi_d(rd, rs, is)\t\tjit_chk_imm((is), LDDFmr((rs), (is), (rd)), LDDFxr((rs), JIT_BIG, (rd)))\n#define jit_ldxr_f(rd, s1, s2)\t\tLDFxr((s1), (s2), (rd))\n#define jit_ldxr_d(rd, s1, s2)\t\tLDDFxr((s1), (s2), (rd))\n#define jit_stxi_f(id, rd, rs)\t\tjit_chk_imm((id), STFrm((rs), (rd), (id)), STFrx((rs), (rd),  JIT_BIG))\n#define jit_stxi_d(id, rd, rs)\t\tjit_chk_imm((id), STDFrm((rs), (rd), (id)), STDFrx((rs), (rd),  JIT_BIG))\n#define jit_stxr_f(d1, d2, rs)\t\tSTFrx((rs), (d1), (d2))\n#define jit_stxr_d(d1, d2, rs)\t\tSTDFrx((rs), (d1), (d2))\n\n#define jit_truncr_f_i(rd, rs) (\t\t\\\n\t_1(_jit->x.pc + 3),\t\t\t\\\n\tFSTOIrr((rs), JIT_FPTMP),\t\t\\\n\tNOP(),\t\t\t\t\t\\\n\tSTFrm(JIT_FPTMP, _Ro(7), 8),\t\t\\\n\tLDmr(_Ro(7), 8, (rd)))\n\n#define jit_truncr_d_i(rd, rs) (\t\t\\\n\t_1(_jit->x.pc + 3),\t\t\t\\\n\tFDTOIrr((rs), JIT_FPTMP),\t\t\\\n\tNOP(),\t\t\t\t\t\\\n\tSTFrm(JIT_FPTMP, _Ro(7), 8),\t\t\\\n\tLDmr(_Ro(7), 8, (rd)))\n\n#define jit_extr_i_d(rd, rs)\t\t(_1 (_jit->x.pc + 3), NOP(), NOP(), STrm((rs), _Ro(7), 8), LDFmr(_Ro(7), 8, (rd)), FITODrr((rd), (rd)))\n#define jit_extr_i_f(rd, rs)\t\t(_1 (_jit->x.pc + 3), NOP(), NOP(), STrm((rs), _Ro(7), 8), LDFmr(_Ro(7), 8, (rd)), FITOSrr((rd), (rd)))\n\n#define jit_do_round_f(rd, rs, fixup, mode) do {\t\t\\\n\tjit_movi_f (JIT_FPTMP, fixup);\t\t\t\t\\\n        _1(_jit->x.pc + 4);                                      \\\n        SETHIir(_HI(mode << 29), JIT_BIG);                      \\\n        NOP();                                                  \\\n        NOP();                                                  \\\n        STFSRm(_Ro(7), 8);              /* store fsr */         \\\n        LDmr(_Ro(7), 8, rd);                                    \\\n        XORrrr(rd, JIT_BIG, JIT_BIG);   /* adjust mode */       \\\n        STrm(JIT_BIG, _Ro(7), 12);                              \\\n        LDFSRm(_Ro(7), 12);              /* load fsr */         \\\n\tFADDSrrr ((rs), JIT_FPTMP, JIT_FPTMP);\t\t\t\\\n        LDFSRm(_Ro(7), 8);                                      \\\n        FSTOIrr(JIT_FPTMP, JIT_FPTMP);   \t\t        \\\n        STFrm(JIT_FPTMP, _Ro(7), 8);\t\t\t        \\\n        LDmr(_Ro(7), 8, (rd));\t\t\t\t\t\\\n\tADDCCrrr ((rd), (rd), 0);\t\t\t\t\\\n\tSUBXrrr ((rd), 0, (rd));\t\t\t\t\\\n  } while (0);\n\n#define jit_do_round_d(rd, rs, fixup, mode) do {\t\t\\\n\tjit_movi_d (JIT_FPTMP, fixup);\t\t\t\t\\\n        _1(_jit->x.pc + 4);                                      \\\n        SETHIir(_HI(mode << 29), JIT_BIG);                      \\\n        NOP();                                                  \\\n        NOP();                                                  \\\n        STFSRm(_Ro(7), 8);              /* store fsr */         \\\n        LDmr(_Ro(7), 8, rd);                                    \\\n        XORrrr(rd, JIT_BIG, JIT_BIG);   /* adjust mode */       \\\n        STrm(JIT_BIG, _Ro(7), 12);                              \\\n        LDFSRm(_Ro(7), 12);              /* load fsr */         \\\n\tFADDDrrr ((rs), JIT_FPTMP, JIT_FPTMP);\t\t\t\\\n        LDFSRm(_Ro(7), 8);                                      \\\n        FDTOIrr(JIT_FPTMP, JIT_FPTMP);   \t\t        \\\n        STFrm(JIT_FPTMP, _Ro(7), 8);\t\t\t        \\\n        LDmr(_Ro(7), 8, (rd));\t\t\t\t\t\\\n\tADDCCrrr ((rd), (rd), 0);\t\t\t\t\\\n\tSUBXrrr ((rd), 0, (rd));\t\t\t\t\\\n  } while (0);\n\n#define jit_roundr_f_i(rd, rs) do {\t\t\t\\\n\tjit_movi_f (JIT_FPTMP, 0.5);\t\t\t\\\n\tFADDSrrr ((rs), JIT_FPTMP, JIT_FPTMP);\t\t\\\n\tjit_truncr_f_i ((rd), JIT_FPTMP);\t\t\\\n\tADDCCrrr ((rd), (rd), 0);\t\t\t\\\n\tSUBXrrr ((rd), 0, (rd));\t\t\t\\\n  } while (0)\n\n#define jit_roundr_d_i(rd, rs) do {\t\t\t\\\n\tjit_movi_d (JIT_FPTMP, 0.5);\t\t\t\\\n\tFADDDrrr ((rs), JIT_FPTMP, JIT_FPTMP);\t\t\\\n\tjit_truncr_d_i ((rd), JIT_FPTMP);\t\t\\\n\tADDCCrrr ((rd), (rd), 0);\t\t\t\\\n\tSUBXrrr ((rd), 0, (rd));\t\t\t\\\n  } while (0)\n\n#define jit_ceilr_f_i(rd, rs) \t\t\t\t\\\n\tjit_do_round_f ((rd), (rs), 1.0f - FLT_EPSILON, 3)\n\n#define jit_ceilr_d_i(rd, rs) \t\t\t\t\\\n\tjit_do_round_d ((rd), (rs), 1.0 - DBL_EPSILON, 3)\n\n#define jit_floorr_f_i(rd, rs) \t\t\t\t\\\n\tjit_do_round_f ((rd), (rs), FLT_EPSILON, 2)\n\n#define jit_floorr_d_i(rd, rs) \t\t\t\t\\\n\tjit_do_round_d ((rd), (rs), DBL_EPSILON, 2)\n\n#define jit_ltr_d(d, s1, s2)            (FCMPDrr ((s1), (s2)), FBLi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ltr_f(d, s1, s2)            (FCMPSrr ((s1), (s2)), FBLi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ler_d(d, s1, s2)            (FCMPDrr ((s1), (s2)), FBLEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ler_f(d, s1, s2)            (FCMPSrr ((s1), (s2)), FBLEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_eqr_d(d, s1, s2)            (FCMPDrr ((s1), (s2)), FBEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_eqr_f(d, s1, s2)            (FCMPSrr ((s1), (s2)), FBEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ner_d(d, s1, s2)            (FCMPDrr ((s1), (s2)), FBNEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ner_f(d, s1, s2)            (FCMPSrr ((s1), (s2)), FBNEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ger_d(d, s1, s2)            (FCMPDrr ((s1), (s2)), FBGEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ger_f(d, s1, s2)            (FCMPSrr ((s1), (s2)), FBGEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_gtr_d(d, s1, s2)            (FCMPDrr ((s1), (s2)), FBGi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_gtr_f(d, s1, s2)            (FCMPSrr ((s1), (s2)), FBGi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unltr_d(d, s1, s2)          (FCMPDrr ((s1), (s2)), FBULi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unltr_f(d, s1, s2)          (FCMPSrr ((s1), (s2)), FBULi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unler_d(d, s1, s2)          (FCMPDrr ((s1), (s2)), FBULEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unler_f(d, s1, s2)          (FCMPSrr ((s1), (s2)), FBULEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_uneqr_d(d, s1, s2)          (FCMPDrr ((s1), (s2)), FBUEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_uneqr_f(d, s1, s2)          (FCMPSrr ((s1), (s2)), FBUEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ltgtr_d(d, s1, s2)          (FCMPDrr ((s1), (s2)), FBLGi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ltgtr_f(d, s1, s2)          (FCMPSrr ((s1), (s2)), FBLGi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unger_d(d, s1, s2)          (FCMPDrr ((s1), (s2)), FBUGEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unger_f(d, s1, s2)          (FCMPSrr ((s1), (s2)), FBUGEi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ungtr_d(d, s1, s2)          (FCMPDrr ((s1), (s2)), FBUGi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ungtr_f(d, s1, s2)          (FCMPSrr ((s1), (s2)), FBUGi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ordr_d(d, s1, s2)           (FCMPDrr ((s1), (s2)), FBOi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_ordr_f(d, s1, s2)           (FCMPSrr ((s1), (s2)), FBOi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unordr_d(d, s1, s2)         (FCMPDrr ((s1), (s2)), FBUi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n#define jit_unordr_f(d, s1, s2)         (FCMPSrr ((s1), (s2)), FBUi(_jit->x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))\n\n#define jit_branchr_f(s1, s2, jmp)      (FCMPSrr(s1, s2), jmp, NOP(), _jit->x.pc - 1)\n#define jit_branchr_d(s1, s2, jmp)      (FCMPDrr(s1, s2), jmp, NOP(), _jit->x.pc - 1)\n\n#define jit_bltr_d(label, s1, s2)        jit_branchr_d((s1), (s2), FBLi((label)))\n#define jit_bltr_f(label, s1, s2)        jit_branchr_f((s1), (s2), FBLi((label)))\n#define jit_bler_d(label, s1, s2)        jit_branchr_d((s1), (s2), FBLEi((label)))\n#define jit_bler_f(label, s1, s2)        jit_branchr_f((s1), (s2), FBLEi((label)))\n#define jit_beqr_d(label, s1, s2)        jit_branchr_d((s1), (s2), FBEi((label)))\n#define jit_beqr_f(label, s1, s2)        jit_branchr_f((s1), (s2), FBEi((label)))\n#define jit_bner_d(label, s1, s2)        jit_branchr_d((s1), (s2), FBNEi((label)))\n#define jit_bner_f(label, s1, s2)        jit_branchr_f((s1), (s2), FBNEi((label)))\n#define jit_bger_d(label, s1, s2)        jit_branchr_d((s1), (s2), FBGEi((label)))\n#define jit_bger_f(label, s1, s2)        jit_branchr_f((s1), (s2), FBGEi((label)))\n#define jit_bgtr_d(label, s1, s2)        jit_branchr_d((s1), (s2), FBGi((label)))\n#define jit_bgtr_f(label, s1, s2)        jit_branchr_f((s1), (s2), FBGi((label)))\n#define jit_bunltr_d(label, s1, s2)      jit_branchr_d((s1), (s2), FBULi((label)))\n#define jit_bunltr_f(label, s1, s2)      jit_branchr_f((s1), (s2), FBULi((label)))\n#define jit_bunler_d(label, s1, s2)      jit_branchr_d((s1), (s2), FBULEi((label)))\n#define jit_bunler_f(label, s1, s2)      jit_branchr_f((s1), (s2), FBULEi((label)))\n#define jit_buneqr_d(label, s1, s2)      jit_branchr_d((s1), (s2), FBUEi((label)))\n#define jit_buneqr_f(label, s1, s2)      jit_branchr_f((s1), (s2), FBUEi((label)))\n#define jit_bltgtr_d(label, s1, s2)      jit_branchr_d((s1), (s2), FBLGi((label)))\n#define jit_bltgtr_f(label, s1, s2)      jit_branchr_f((s1), (s2), FBLGi((label)))\n#define jit_bunger_d(label, s1, s2)      jit_branchr_d((s1), (s2), FBUGEi((label)))\n#define jit_bunger_f(label, s1, s2)      jit_branchr_f((s1), (s2), FBUGEi((label)))\n#define jit_bungtr_d(label, s1, s2)      jit_branchr_d((s1), (s2), FBUGi((label)))\n#define jit_bungtr_f(label, s1, s2)      jit_branchr_f((s1), (s2), FBUGi((label)))\n#define jit_bordr_d(label, s1, s2)       jit_branchr_d((s1), (s2), FBOi((label)))\n#define jit_bordr_f(label, s1, s2)       jit_branchr_f((s1), (s2), FBOi((label)))\n#define jit_bunordr_d(label, s1, s2)     jit_branchr_d((s1), (s2), FBUi((label)))\n#define jit_bunordr_f(label, s1, s2)     jit_branchr_f((s1), (s2), FBUi((label)))\n\n#define jit_prepare_f(num)              (_jitl.nextarg_put += (num))\n#define jit_prepare_d(num)              (_jitl.nextarg_put += 2 * (num))\n\n#define jit_arg_f()                     (_jitl.nextarg_get++)\n#define jit_arg_d()                     (_jitl.nextarg_get += _jitl.nextarg_get & 1, _jitl.nextarg_get += 2, _jitl.nextarg_get - 2)\n\n#define jit_getarg_f(rd, ofs)           (STrm(ofs, _Ri(6), -24), LDFmr (_Ri(6), -24, (rd)))\n#define jit_getarg_d(rd, ofs)           (STDrm(ofs, _Ri(6), -24), LDDFmr (_Ri(6), -24, (rd)))\n\n#define jit_pusharg_f(rs)               (STFrm((rs), _Ri(6), -24), --_jitl.nextarg_put, LDmr (_Ri(6), -24, _Ro(_jitl.nextarg_put)))\n#define jit_pusharg_d(rs)               (STDFrm((rs), _Ri(6), -24), _jitl.nextarg_put -= 2, LDmr (_Ri(6), -24, _Ro(_jitl.nextarg_put)))\n\n#endif /* __lightning_asm_fp_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/lightning/sparc/funcs.h",
    "content": "/******************************** -*- C -*- ****************************\n *\n *\tPlatform-independent layer inline functions (Sparc)\n *\n ***********************************************************************/\n\n\n/***********************************************************************\n *\n * Copyright 2000, 2001, 2002 Free Software Foundation, Inc.\n * Written by Paolo Bonzini.\n *\n * This file is part of GNU lightning.\n *\n * GNU lightning is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as published\n * by the Free Software Foundation; either version 3, or (at your option)\n * any later version.\n * \n * GNU lightning is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n * \n * You should have received a copy of the GNU Lesser General Public License\n * along with GNU lightning; see the file COPYING.LESSER; if not, write to the\n * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,\n * MA 02110-1301, USA.\n *\n ***********************************************************************/\n\n\n\n#ifndef __lightning_funcs_h\n#define __lightning_funcs_h\n\n// #if !defined(__GNUC__) && !defined(__GNUG__)\n// #error Go get GNU C, I do not know how to flush the cache\n// #error with this compiler.\n// #else\n// /* Why doesn't this compile?!?\n // * static void\n // * jit_flush_code(start, end)\n // *      void \t*start;\n // *      void\t*end;\n // */\n\n// static void\n// jit_flush_code(void* start, void* end)\n// {\n// #ifndef LIGHTNING_CROSS\n  // register char *dest;\n\n  // __asm__ __volatile__ (\"stbar\");\n  // for (dest = (char *)start; dest <= (char *)end; dest += 4) {\n    // __asm__ __volatile__ (\"flush %0\"::\"r\"(dest));\n  // }\n\n  // /* [SPARC Architecture Manual v8, page 139, implementation note #5] */\n  // __asm__ __volatile__ (\"nop; nop; nop; nop; nop\");\n// #endif\n// }\n// #endif\n\n#define jit_get_cpu\t\t\tjit_get_cpu\n__jit_constructor static void\njit_get_cpu(void)\n{\n}\n\n#endif /* __lightning_core_h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/md5.cpp",
    "content": "/// \\file\n/// \\brief RFC 1321 compliant MD5 implementation,\n/// RFC 1321 compliant MD5 implementation,\n/// by Christophe Devine <devine@cr0.net>;\n/// this program is licensed under the GPL.\n\n//Modified October 3, 2003, to remove testing code, and add include of \"types.h\".\n//Added simple MD5 to ASCII string conversion function.\n// -Xodnizel   \n\n#include <string.h>\n#include \"../types.h\"\n#include \"md5.h\"\n\ntypedef u8 uint8;\ntypedef u16 uint16;\ntypedef u32 uint32;\n\n#define GET_UINT32(n,b,i)           \\\n{                 \\\n    (n) = ( (uint32) (b)[(i) + 3] << 24 )       \\\n        | ( (uint32) (b)[(i) + 2] << 16 )       \\\n        | ( (uint32) (b)[(i) + 1] <<  8 )       \\\n        | ( (uint32) (b)[(i)    ]       );      \\\n}\n\n#define PUT_UINT32(n,b,i)           \\\n{                 \\\n    (b)[(i)    ] = (uint8) ( (n)       );       \\\n    (b)[(i) + 1] = (uint8) ( (n) >>  8 );       \\\n    (b)[(i) + 2] = (uint8) ( (n) >> 16 );       \\\n    (b)[(i) + 3] = (uint8) ( (n) >> 24 );       \\\n}\n\nvoid md5_starts( struct md5_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n}\n\nstatic void md5_process( struct md5_context *ctx, uint8 data[64] )\n{\n    uint32 A, B, C, D, X[16];\n\n    GET_UINT32( X[0],  data,  0 );\n    GET_UINT32( X[1],  data,  4 );\n    GET_UINT32( X[2],  data,  8 );\n    GET_UINT32( X[3],  data, 12 );\n    GET_UINT32( X[4],  data, 16 );\n    GET_UINT32( X[5],  data, 20 );\n    GET_UINT32( X[6],  data, 24 );\n    GET_UINT32( X[7],  data, 28 );\n    GET_UINT32( X[8],  data, 32 );\n    GET_UINT32( X[9],  data, 36 );\n    GET_UINT32( X[10], data, 40 );\n    GET_UINT32( X[11], data, 44 );\n    GET_UINT32( X[12], data, 48 );\n    GET_UINT32( X[13], data, 52 );\n    GET_UINT32( X[14], data, 56 );\n    GET_UINT32( X[15], data, 60 );\n\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n\n#define P(a,b,c,d,k,s,t)        \\\n{                   \\\n    a += F(b,c,d) + X[k] + t; a = S(a,s) + b;     \\\n}\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n\n#define F(x,y,z) (z ^ (x & (y ^ z)))\n\n    P( A, B, C, D,  0,  7, 0xD76AA478 );\n    P( D, A, B, C,  1, 12, 0xE8C7B756 );\n    P( C, D, A, B,  2, 17, 0x242070DB );\n    P( B, C, D, A,  3, 22, 0xC1BDCEEE );\n    P( A, B, C, D,  4,  7, 0xF57C0FAF );\n    P( D, A, B, C,  5, 12, 0x4787C62A );\n    P( C, D, A, B,  6, 17, 0xA8304613 );\n    P( B, C, D, A,  7, 22, 0xFD469501 );\n    P( A, B, C, D,  8,  7, 0x698098D8 );\n    P( D, A, B, C,  9, 12, 0x8B44F7AF );\n    P( C, D, A, B, 10, 17, 0xFFFF5BB1 );\n    P( B, C, D, A, 11, 22, 0x895CD7BE );\n    P( A, B, C, D, 12,  7, 0x6B901122 );\n    P( D, A, B, C, 13, 12, 0xFD987193 );\n    P( C, D, A, B, 14, 17, 0xA679438E );\n    P( B, C, D, A, 15, 22, 0x49B40821 );\n\n#undef F\n\n#define F(x,y,z) (y ^ (z & (x ^ y)))\n\n    P( A, B, C, D,  1,  5, 0xF61E2562 );\n    P( D, A, B, C,  6,  9, 0xC040B340 );\n    P( C, D, A, B, 11, 14, 0x265E5A51 );\n    P( B, C, D, A,  0, 20, 0xE9B6C7AA );\n    P( A, B, C, D,  5,  5, 0xD62F105D );\n    P( D, A, B, C, 10,  9, 0x02441453 );\n    P( C, D, A, B, 15, 14, 0xD8A1E681 );\n    P( B, C, D, A,  4, 20, 0xE7D3FBC8 );\n    P( A, B, C, D,  9,  5, 0x21E1CDE6 );\n    P( D, A, B, C, 14,  9, 0xC33707D6 );\n    P( C, D, A, B,  3, 14, 0xF4D50D87 );\n    P( B, C, D, A,  8, 20, 0x455A14ED );\n    P( A, B, C, D, 13,  5, 0xA9E3E905 );\n    P( D, A, B, C,  2,  9, 0xFCEFA3F8 );\n    P( C, D, A, B,  7, 14, 0x676F02D9 );\n    P( B, C, D, A, 12, 20, 0x8D2A4C8A );\n\n#undef F\n    \n#define F(x,y,z) (x ^ y ^ z)\n\n    P( A, B, C, D,  5,  4, 0xFFFA3942 );\n    P( D, A, B, C,  8, 11, 0x8771F681 );\n    P( C, D, A, B, 11, 16, 0x6D9D6122 );\n    P( B, C, D, A, 14, 23, 0xFDE5380C );\n    P( A, B, C, D,  1,  4, 0xA4BEEA44 );\n    P( D, A, B, C,  4, 11, 0x4BDECFA9 );\n    P( C, D, A, B,  7, 16, 0xF6BB4B60 );\n    P( B, C, D, A, 10, 23, 0xBEBFBC70 );\n    P( A, B, C, D, 13,  4, 0x289B7EC6 );\n    P( D, A, B, C,  0, 11, 0xEAA127FA );\n    P( C, D, A, B,  3, 16, 0xD4EF3085 );\n    P( B, C, D, A,  6, 23, 0x04881D05 );\n    P( A, B, C, D,  9,  4, 0xD9D4D039 );\n    P( D, A, B, C, 12, 11, 0xE6DB99E5 );\n    P( C, D, A, B, 15, 16, 0x1FA27CF8 );\n    P( B, C, D, A,  2, 23, 0xC4AC5665 );\n\n#undef F\n\n#define F(x,y,z) (y ^ (x | ~z))\n\n    P( A, B, C, D,  0,  6, 0xF4292244 );\n    P( D, A, B, C,  7, 10, 0x432AFF97 );\n    P( C, D, A, B, 14, 15, 0xAB9423A7 );\n    P( B, C, D, A,  5, 21, 0xFC93A039 );\n    P( A, B, C, D, 12,  6, 0x655B59C3 );\n    P( D, A, B, C,  3, 10, 0x8F0CCC92 );\n    P( C, D, A, B, 10, 15, 0xFFEFF47D );\n    P( B, C, D, A,  1, 21, 0x85845DD1 );\n    P( A, B, C, D,  8,  6, 0x6FA87E4F );\n    P( D, A, B, C, 15, 10, 0xFE2CE6E0 );\n    P( C, D, A, B,  6, 15, 0xA3014314 );\n    P( B, C, D, A, 13, 21, 0x4E0811A1 );\n    P( A, B, C, D,  4,  6, 0xF7537E82 );\n    P( D, A, B, C, 11, 10, 0xBD3AF235 );\n    P( C, D, A, B,  2, 15, 0x2AD7D2BB );\n    P( B, C, D, A,  9, 21, 0xEB86D391 );\n\n#undef F\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n}\n\nvoid md5_update( struct md5_context *ctx, uint8 *input, uint32 length )\n{\n    uint32 left, fill;\n\n    if( ! length ) return;\n\n    left = ( ctx->total[0] >> 3 ) & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += length <<  3;\n    ctx->total[1] += length >> 29;\n\n    ctx->total[0] &= 0xFFFFFFFF;\n    ctx->total[1] += ctx->total[0] < ( length << 3 );\n\n    if( left && length >= fill )\n    {\n        memcpy( (void *) (ctx->buffer + left), (void *) input, fill );\n        md5_process( ctx, ctx->buffer );\n        length -= fill;\n        input  += fill;\n        left = 0;\n    }\n\n    while( length >= 64 )\n    {\n        md5_process( ctx, input );\n        length -= 64;\n        input  += 64;\n    }\n\n    if( length )\n    {\n        memcpy( (void *) (ctx->buffer + left), (void *) input, length );\n    }\n}\n\nstatic uint8 md5_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\nvoid md5_finish( struct md5_context *ctx, uint8 digest[16] )\n{\n    uint32 last, padn;\n    uint8 msglen[8];\n\n    PUT_UINT32( ctx->total[0], msglen, 0 );\n    PUT_UINT32( ctx->total[1], msglen, 4 );\n\n    last = ( ctx->total[0] >> 3 ) & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    md5_update( ctx, md5_padding, padn );\n    md5_update( ctx, msglen, 8 );\n\n    PUT_UINT32( ctx->state[0], digest,  0 );\n    PUT_UINT32( ctx->state[1], digest,  4 );\n    PUT_UINT32( ctx->state[2], digest,  8 );\n    PUT_UINT32( ctx->state[3], digest, 12 );\n}\n\n\n/* Uses a static buffer, so beware of how it's used. */\nchar *md5_asciistr(MD5DATA& md5)\n{\n uint8* digest = md5.data;\n static char str[33];\n static char trans[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};\n int x;\n\n for(x=0;x<16;x++)\n {\n  str[x*2]=trans[digest[x]>>4];\n  str[x*2+1]=trans[digest[x]&0x0F];\n }\n return(str);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/md5.h",
    "content": "#ifndef _MD5_H\n#define _MD5_H\n\n#include \"../types.h\"\n#include \"valuearray.h\"\n\nstruct md5_context\n{\n    u32 total[2];\n    u32 state[4];\n    u8 buffer[64];\n};\n\ntypedef ValueArray<uint8,16> MD5DATA;\n\nvoid md5_starts( struct md5_context *ctx );\nvoid md5_update( struct md5_context *ctx, u8 *input, u32 length );\nvoid md5_finish( struct md5_context *ctx, u8 digest[16] );\n\n/* Uses a static buffer, so beware of how it's used. */\nchar *md5_asciistr(MD5DATA& md5);\n\n#endif /* md5.h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/task.cpp",
    "content": "/*\r\n\tCopyright (C) 2009-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"types.h\"\r\n#include \"task.h\"\r\n#include <stdio.h>\r\n\r\n#ifdef _WINDOWS\r\n#include <windows.h>\r\n#else\r\n#include <pthread.h>\r\n#include <sched.h>\r\n#include <android/log.h>\r\n#include <unistd.h>\r\n#endif\r\n\r\n#ifdef _MSC_VER\r\nclass Task::Impl {\r\npublic:\r\n\tImpl();\r\n\t~Impl();\r\n\r\n\tbool spinlock;\r\n\r\n\tvoid start(bool spinlock);\r\n\tvoid shutdown();\r\n\r\n\t//execute some work\r\n\tvoid execute(const TWork &work, void* param);\r\n\r\n\t//wait for the work to complete\r\n\tvoid* finish();\r\n\r\n\tstatic DWORD __stdcall s_taskProc(void *ptr);\r\n\tvoid taskProc();\r\n\tvoid init();\r\n\r\n\t//the work function that shall be executed\r\n\tTWork work;\r\n\tvoid* param;\r\n\r\n\tHANDLE incomingWork, workDone, hThread;\r\n\tvolatile bool bIncomingWork, bWorkDone, bKill;\r\n\tbool bStarted;\r\n};\r\n\r\nstatic void* killTask(void* task)\r\n{\r\n\t((Task::Impl*)task)->bKill = true;\r\n\treturn 0;\r\n}\r\n\r\nTask::Impl::~Impl()\r\n{\r\n\tshutdown();\r\n}\r\n\r\nTask::Impl::Impl()\r\n\t: work(NULL)\r\n\t, bIncomingWork(false)\r\n\t, bWorkDone(true)\r\n\t, bKill(false)\r\n\t, bStarted(false)\r\n\t, incomingWork(INVALID_HANDLE_VALUE)\r\n\t, workDone(INVALID_HANDLE_VALUE)\r\n\t, hThread(INVALID_HANDLE_VALUE)\r\n{\r\n}\r\n\r\nDWORD __stdcall Task::Impl::s_taskProc(void *ptr)\r\n{\r\n\t//just past the buck to the instance method\r\n\t((Task::Impl*)ptr)->taskProc();\r\n\treturn 0;\r\n}\r\n\r\nvoid Task::Impl::taskProc()\r\n{\r\n\tfor(;;) {\r\n\t\tif(bKill) break;\r\n\t\t\r\n\t\t//wait for a chunk of work\r\n\t\tif(spinlock) \r\n\t\t{\r\n\t\t\twhile(!bIncomingWork) Sleep(0); \r\n\t\t}\r\n\t\telse \r\n\t\t\tWaitForSingleObject(incomingWork,INFINITE); \r\n\t\t\r\n\t\tbIncomingWork = false; \r\n\t\t//execute the work\r\n\t\tResetEvent(workDone);\r\n\t\tparam = work(param);\r\n\t\tResetEvent(incomingWork);\r\n\t\t//signal completion\r\n\t\tif(!spinlock) SetEvent(workDone); \r\n\t\tbWorkDone = true;\r\n\t}\r\n}\r\n\r\nvoid Task::Impl::start(bool spinlock)\r\n{\r\n\tbIncomingWork = false;\r\n\tbWorkDone = true;\r\n\tbKill = false;\r\n\tbStarted = true;\r\n\tthis->spinlock = spinlock;\r\n\tincomingWork = CreateEvent(NULL,FALSE,FALSE,NULL);\r\n\tworkDone = CreateEvent(NULL,FALSE,FALSE,NULL);\r\n\thThread = CreateThread(NULL,0,Task::Impl::s_taskProc,(void*)this, 0, NULL);\r\n}\r\nvoid Task::Impl::shutdown()\r\n{\r\n\tif(!bStarted) return;\r\n\tbStarted = false;\r\n\r\n\texecute(killTask,this);\r\n\tfinish();\r\n\r\n\tCloseHandle(incomingWork);\r\n\tCloseHandle(workDone);\r\n\tCloseHandle(hThread);\r\n\r\n\tincomingWork = INVALID_HANDLE_VALUE;\r\n\tworkDone = INVALID_HANDLE_VALUE;\r\n\thThread = INVALID_HANDLE_VALUE;\r\n}\r\n\r\nvoid Task::Impl::execute(const TWork &work, void* param) \r\n{\r\n\t//setup the work\r\n\tthis->work = work;\r\n\tthis->param = param;\r\n\tbWorkDone = false;\r\n\t//signal it to start\r\n\tif(!spinlock) SetEvent(incomingWork); \r\n\tbIncomingWork = true;\r\n}\r\n\r\nvoid* Task::Impl::finish()\r\n{\r\n\t//just wait for the work to be done\r\n\tif(spinlock) \r\n\t\twhile(!bWorkDone) \r\n\t\t\tSleep(0);\r\n\telse WaitForSingleObject(workDone,INFINITE); \r\n\treturn param;\r\n}\r\n\r\n#else\r\n\r\nclass Task::Impl {\r\nprivate:\r\n\tpthread_t _thread;\r\n\tbool _isThreadRunning;\r\n\r\npublic:\r\n\tImpl();\r\n\t~Impl();\r\n\r\n\tvoid start(bool spinlock);\r\n\tvoid execute(const TWork &work, void *param);\r\n\tvoid* finish();\r\n\tvoid shutdown();\r\n\r\n\tpthread_mutex_t mutex;\r\n\tpthread_cond_t condWork;\r\n\tTWork work;\r\n\tvoid *param;\r\n\tvoid *ret;\r\n\tbool exitThread;\r\n\t\r\n\tvolatile bool spinlock, bIncomingWork, bWorkDone;\r\n};\r\n\r\nstatic void* taskProc(void *arg)\r\n{\r\n\tTask::Impl *ctx = (Task::Impl *)arg;\r\n\t//if(ctx->spinlock)\r\n\t//\t__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"Started spinlock task\");\r\n\tdo {\r\n\t\t\r\n\t\t//wait for a chunk of work\r\n\t\tif(ctx->spinlock) \r\n\t\t{\r\n\t\t\twhile(!ctx->bIncomingWork) usleep(0);\r\n\t\t\tctx->bIncomingWork = false;\r\n\t\t\tif (ctx->work != NULL) {\r\n\t\t\t\t//__android_log_print(ANDROID_LOG_INFO,\"nds4droid\",\"Got spinlock work\");\r\n\t\t\t\tctx->ret = ctx->work(ctx->param);\r\n\t\t\t\tctx->bWorkDone = true;\r\n\t\t\t} else {\r\n\t\t\t\tctx->ret = NULL;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tctx->work = NULL;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tpthread_mutex_lock(&ctx->mutex);\r\n\r\n\t\t\twhile (ctx->work == NULL && !ctx->exitThread) {\r\n\t\t\t\tpthread_cond_wait(&ctx->condWork, &ctx->mutex);\r\n\t\t\t}\r\n\r\n\t\t\tif (ctx->work != NULL) {\r\n\t\t\t\tctx->ret = ctx->work(ctx->param);\r\n\t\t\t} else {\r\n\t\t\t\tctx->ret = NULL;\r\n\t\t\t}\r\n\r\n\t\t\tctx->work = NULL;\r\n\t\t\tpthread_cond_signal(&ctx->condWork);\r\n\r\n\t\t\tpthread_mutex_unlock(&ctx->mutex);\r\n\t\t}\r\n\r\n\t} while(!ctx->exitThread);\r\n\r\n\treturn NULL;\r\n}\r\n\r\nTask::Impl::Impl()\r\n{\r\n\t_isThreadRunning = false;\r\n\twork = NULL;\r\n\tparam = NULL;\r\n\tret = NULL;\r\n\texitThread = false;\r\n\r\n\tpthread_mutex_init(&mutex, NULL);\r\n\tpthread_cond_init(&condWork, NULL);\r\n}\r\n\r\nTask::Impl::~Impl()\r\n{\r\n\tshutdown();\r\n\tpthread_mutex_destroy(&mutex);\r\n\tpthread_cond_destroy(&condWork);\r\n}\r\n\r\nvoid Task::Impl::start(bool spinlock)\r\n{\r\n\tpthread_mutex_lock(&this->mutex);\r\n\t\r\n\tif (this->_isThreadRunning) {\r\n\t\tpthread_mutex_unlock(&this->mutex);\r\n\t\treturn;\r\n\t}\r\n\r\n\tthis->work = NULL;\r\n\tthis->param = NULL;\r\n\tthis->ret = NULL;\r\n\tthis->exitThread = false;\r\n\tthis->spinlock = spinlock;\r\n\tpthread_create(&this->_thread, NULL, &taskProc, this);\r\n\tthis->_isThreadRunning = true;\r\n\r\n\tpthread_mutex_unlock(&this->mutex);\r\n}\r\n\r\nvoid Task::Impl::execute(const TWork &work, void *param)\r\n{\r\n\tif(!spinlock) {\r\n\t\tpthread_mutex_lock(&this->mutex);\r\n\r\n\t\tif (work == NULL || !this->_isThreadRunning) {\r\n\t\t\tpthread_mutex_unlock(&this->mutex);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis->work = work;\r\n\t\tthis->param = param;\r\n\t\tthis->bIncomingWork = true;\r\n\t\tpthread_cond_signal(&this->condWork);\r\n\r\n\t\tpthread_mutex_unlock(&this->mutex);\r\n\t}\r\n\telse {\r\n\t\tthis->work = work;\r\n\t\tthis->param = param;\r\n\t\tthis->bWorkDone = false;\r\n\t\tthis->bIncomingWork = true;\r\n\t}\r\n}\r\n\r\nvoid* Task::Impl::finish()\r\n{\r\n\tvoid *returnValue = NULL;\r\n\r\n\tif(!spinlock) {\r\n\t\tpthread_mutex_lock(&this->mutex);\r\n\r\n\t\tif (!this->_isThreadRunning) {\r\n\t\t\tpthread_mutex_unlock(&this->mutex);\r\n\t\t\treturn returnValue;\r\n\t\t}\r\n\r\n\t\twhile (this->work != NULL) {\r\n\t\t\tpthread_cond_wait(&this->condWork, &this->mutex);\r\n\t\t}\r\n\r\n\t\treturnValue = this->ret;\r\n\r\n\t\tpthread_mutex_unlock(&this->mutex);\r\n\t}\r\n\telse {\r\n\t\twhile(!bWorkDone)\r\n\t\t\tsched_yield();\r\n\t\treturnValue = this->ret;\r\n\t}\r\n\r\n\treturn returnValue;\r\n}\r\n\r\nvoid Task::Impl::shutdown()\r\n{\r\n\tpthread_mutex_lock(&this->mutex);\r\n\r\n\tif (!this->_isThreadRunning) {\r\n\t\tpthread_mutex_unlock(&this->mutex);\r\n\t\treturn;\r\n\t}\r\n\r\n\tthis->work = NULL;\r\n\tthis->exitThread = true;\r\n\tpthread_cond_signal(&this->condWork);\r\n\r\n\tpthread_mutex_unlock(&this->mutex);\r\n\r\n\tpthread_join(this->_thread, NULL);\r\n\r\n\tpthread_mutex_lock(&this->mutex);\r\n\tthis->_isThreadRunning = false;\r\n\tpthread_mutex_unlock(&this->mutex);\r\n}\r\n#endif\r\n\r\nvoid Task::start(bool spinlock) { impl->start(spinlock); }\r\nvoid Task::shutdown() { impl->shutdown(); }\r\nTask::Task() : impl(new Task::Impl()) {}\r\nTask::~Task() { delete impl; }\r\nvoid Task::execute(const TWork &work, void* param) { impl->execute(work,param); }\r\nvoid* Task::finish() { return impl->finish(); }\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/task.h",
    "content": "/*\r\n\tCopyright (C) 2009 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _TASK_H_\r\n\r\n//Sort of like a single-thread thread pool.\r\n//You hand it a worker function and then call finish() to synch with its completion\r\nclass Task\r\n{\r\npublic:\r\n\tTask();\r\n\t~Task();\r\n\t\r\n\ttypedef void * (*TWork)(void *);\r\n\r\n\t// initialize task runner\r\n\tvoid start(bool spinlock);\r\n\r\n\t//execute some work\r\n\tvoid execute(const TWork &work, void* param);\r\n\r\n\t//wait for the work to complete\r\n\tvoid* finish();\r\n\r\n\t// does the opposite of start\r\n\tvoid shutdown();\r\n\r\n\tclass Impl;\r\n\tImpl *impl;\r\n\r\n};\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/.gitignore",
    "content": "*.o\n*.a\ntcc_g\ntcc\n/*-tcc\ntc2.c\ndoc\ntc3s.c\np3.c\ntc1.c\nerror.c\ni386-gen1.c\ntest.out1\ntest.out1b\ntest.out2\ntest.out2b\ntest.out3\ntest.out3b\nweb.sh\nmemdebug.c\nbench\nMakefile.uClibc\nboundtest\nprog.ref\ntest.ref\ntest.out\ntcc-doc.html\nideas\ntcctest.ref\nlinux.tcc\nldtest\nlibtcc_test\ninstr.S\np.c\np2.c\ntcctest[1234]\ntest[1234].out\ntests/tcclib.h\ntests/tcctest.gcc\ntests/weaktest.*.o.txt\ntests2/fred.txt\n.gdb_history\ntcc.1\ntcc.pod\nconfig.mak\nconfig.texi\ntags\n.DS_Store\n*.swp\nlib/x86_64\nlib/i386\nlib/x86_64-win32\nlib/i386-win32\ntcc-doc.info\nconftest*\ntiny_libmaker\n*.dSYM\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/Android_arm.mk",
    "content": "# Android makefile for tinycc\r\n\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\n\r\nLOCAL_MODULE \t\t:= libtinyccarm\r\nLOCAL_ARM_MODE \t\t:= arm\r\nLOCAL_CFLAGS\t\t:= -DANDROID -DONE_SOURCE -DTCC_TARGET_ARM\r\n\r\nLOCAL_SRC_FILES\t\t:= libtcc.c\r\n\r\ninclude $(BUILD_STATIC_LIBRARY)"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/Android_x86.mk",
    "content": "# Android makefile for tinycc\r\n\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\n\r\nLOCAL_MODULE \t\t:= libtinyccx86\r\nLOCAL_ARM_MODE \t\t:= arm\r\nLOCAL_CFLAGS\t\t:= -DANDROID -DONE_SOURCE -DTCC_TARGET_I386\r\n\r\nLOCAL_SRC_FILES\t\t:= libtcc.c\r\n\r\ninclude $(BUILD_STATIC_LIBRARY)"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/COPYING",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/Changelog",
    "content": "version 0.9.26:\n\nUser interface:\n- -MD/-MF (automatically generate dependencies for make)\n- -pthread option (same as -D_REENTRANT -lpthread) (Henry Kroll III)\n- -m32/-m64 to re-exec cross compiler (Henry Kroll III)\n- -Wl, Mimic all GNU -option forms supported by ld (Kirill Smelkov)\n- new LIBTCCAPI tcc_set_options() (grischka)\n\nPlatforms:\n- Many improvements for x86-64 target (Shinichiro Hamaji, Michael Matz, grischka)\n- x86-64 assembler (Frederic Feret)\n- Many improvements for ARM target (Daniel Glckner, Thomas Preud'homme)\n- Support WinCE PE ARM (Timo VJ Lahde)\n- Support ARM hardfloat calling convention (Thomas Preud'homme)\n- Support SELinux (Security-Enhanced Linux) (Henry Kroll III)\n- Support Debian GNU/kFreeBSD kernels (Pierre Chifflier)\n- Support GNU/Hurd kernels (Thomas Preud'homme)\n- Support OSX (tcc -run only) (Milutin Jovanovic)\n- Support multiarch configuration (Thomas Preud'homme)\n- Support out-of-tree build (Akim Demaille)\n\nFeatures:\n- C99 variable length arrays (Thomas Preud'homme & Joe Soroka)\n- Asm labels for variables and functions (Thomas Preud'homme)\n- STT_GNU_IFUNC (Indirect functions as externals) (Thomas Preud'homme)\n- More tests (tests2) (Milutin Jovanovic)\n\nversion 0.9.25:\n\n- first support for x86-64 target (Shinichiro Hamaji)\n- support Clibc\n- split tcc.c into tcc.h libtcc.c tccpp.c tccgen.c tcc.c\n- improved preprocess output with linenumbers and spaces preserved\n- tcc_relocate now copies code into user buffer\n- fix bitfields with non-int types and in unions\n- improve ARM cross-compiling (Daniel Glöckner)\n- link stabstr sections from multiple objects\n- better (still limited) support for multiple TCCStates\n\nversion 0.9.24:\n\n- added verbosity levels -v, -vv, -vvv\n- Accept standard input as an inputstream (Hanzac Chen)\n- Support c89 compilers other than gcc (Hanzac Chen)\n- -soname linker option (Marc Andre Tanner)\n- Just warn about unknown directives, ignore quotes in #error/#warning\n- Define __STDC_VERSION__=199901L (477)\n- Switch to newer tccpe.c (includes support for resources)\n- Handle backslashes within #include/#error/#warning\n- Import changesets (part 4) 428,457,460,467: defines for openbsd etc.\n- Use _WIN32 for a windows hosted tcc and define it for the PE target,\n  otherwise define __unix / __linux (Detlef Riekenberg)\n- Import changesets (part 3) 409,410: ARM EABI by Daniel Glöckner\n- Some in-between fixes:\n  TCC -E no longer hangs with macro calls involving newlines.\n  (next_nomacro1 now advances the read-pointer with TOK_LINEFEED)\n  Global cast (int g_i = 1LL;) no longer crashes tcc.\n  (nocode_wanted is initially 1, and only 0 for gen_function)\n  On win32 now tcc.exe finds 'include' & 'lib' even if itself is in 'bin'.\n  (new function w32_tcc_lib_path removes 'bin' if detected)\n  Added quick build batch file for mingw (win32/build-tcc.bat)\n  Last added case label optimization (455) produced wrong code. Reverted.\n\n- Import more changesets from Rob Landley's fork (part 2):\n  487: Handle long long constants in gen_opic() (Rob Landley)\n  484: Handle parentheses within __attribute__((...)) (Rob Landley)\n  480: Remove a goto in decl_initializer_alloc (Rob Landley)\n  475: Fix dereferences in inline assembly output (Joshua Phillips)\n  474: Cast ptrs to ints of different sizes correctly (Joshua Phillips)\n  473: Fix size of structs with empty array member (Joshua Phillips)\n  470: No warning for && and || with mixed pointers/integers (Rob Landley)\n  469: Fix symbol visibility problems in the linker (Vincent Pit)\n  468: Allow && and || involving pointer arguments (Rob Landley)\n  455: Optimize case labels with no code in between (Zdenek Pavlas)\n  450: Implement alloca for x86 (grischka)\n  415: Parse unicode escape sequences (Axel Liljencrantz)\n  407: Add a simple va_copy() in stdarg.h (Hasso Tepper)\n  400: Allow typedef names as symbols (Dave Dodge)\n\n- Import some changesets from Rob Landley's fork (part 1):\n  462: Use LGPL with bcheck.c and il-gen.c\n  458: Fix global compound literals (in unary: case '&':) (Andrew Johnson)\n  456: Use return code from tcc_output_file in main() (Michael Somos)\n  442: Fix indirections with function pointers (***fn)() (grischka)\n  441: Fix LL left shift in libtcc1.c:__shldi3 (grischka)\n  440: Pass structures and function ptrs through ?: (grischka)\n  439: Keep rvalue in bit assignment (bit2 = bit1 = x) (grischka)\n  438: Degrade nonportable pointer assignment to warning (grischka)\n  437: Call 'saveregs()' before jumping with logical and/or/not (grischka)\n  435: Put local static variables into global memory (grischka)\n  432/434: Cast double and ptr to bool (grischka)\n  420: Zero pad x87 tenbyte long doubles (Felix Nawothnig)\n  417: Make 'sizeof' unsigned (Rob Landley)\n  397: Fix save_reg for longlongs (Daniel Glöckner)\n  396: Fix \"invalid relocation entry\" problem on ubuntu - (Bernhard Fischer)\n\n- ignore AS_NEEDED ld command\n- mark executable sections as executable when running in memory\n- added support for win32 wchar_t (Filip Navara)\n- segment override prefix support (Filip Navara)\n- normalized slashes in paths (Filip Navara)\n- windows style fastcall (Filip Navara)\n- support for empty input register section in asm (Filip Navara)\n- anonymous union/struct support (Filip Navara)\n- fixed parsing of function parameters\n- workaround for function pointers in conditional expressions (Dave Dodge)\n- initial '-E' option support to use the C preprocessor alone\n- discard type qualifiers when comparing function parameters (Dave Dodge)\n- Bug fix: A long long value used as a test expression ignores the\n  upper 32 bits at runtime (Dave Dodge)\n- fixed multiple concatenation of PPNUM tokens (initial patch by Dave Dodge)\n- fixed multiple typedef specifiers handling\n- fixed sign extension in some type conversions (Dave Dodge)\n\nversion 0.9.23:\n\n- initial PE executable format for windows version (grischka)\n- '#pragma pack' support (grischka)\n- '#include_next' support (Bernhard Fischer)\n- ignore '-pipe' option\n- added -f[no-]leading-underscore\n- preprocessor function macro parsing fix (grischka)\n\nversion 0.9.22:\n\n- simple memory optimisations: kernel compilation is 30% faster\n- linker symbol definitions fixes\n- gcc 3.4 fixes\n- fixed value stack full error\n- 'packed' attribute support for variables and structure fields\n- ignore 'const' and 'volatile' in function prototypes\n- allow '_Bool' in bit fields\n\nversion 0.9.21:\n\n- ARM target support (Daniel Glöckner)\n- added '-funsigned-char, '-fsigned-char' and\n  '-Wimplicit-function-declaration'\n- fixed assignment of const struct in struct\n- line comment fix (reported by Bertram Felgenhauer)\n- initial TMS320C67xx target support (TK)\n- win32 configure\n- regparm() attribute\n- many built-in assembler fixes\n- added '.org', '.fill' and '.previous' assembler directives\n- '-fno-common' option\n- '-Ttext' linker option\n- section alignment fixes\n- bit fields fixes\n- do not generate code for unused inline functions\n- '-oformat' linker option. \n- added 'binary' output format.\n\nversion 0.9.20:\n\n- added '-w' option\n- added '.gnu.linkonce' ELF sections support\n- fixed libc linking when running in memory (avoid 'stat' function\n  errors).\n- extended '-run' option to be able to give several arguments to a C\n  script.\n\nversion 0.9.19:\n\n- \"alacarte\" linking (Dave Long)\n- simpler function call\n- more strict type checks\n- added 'const' and 'volatile' support and associated warnings\n- added -Werror, -Wunsupported, -Wwrite-strings, -Wall.\n- added __builtin_types_compatible_p() and __builtin_constant_p()\n- chars support in assembler (Dave Long)\n- .string, .globl, .section, .text, .data and .bss asm directive\n  support (Dave Long)\n- man page generated from tcc-doc.texi\n- fixed macro argument substitution\n- fixed zero argument macro parsing\n- changed license to LGPL\n- added -rdynamic option support\n\nversion 0.9.18:\n\n- header fix (time.h)\n- fixed inline asm without operand case\n- fixed 'default:' or 'case x:' with '}' after (incorrect C construct accepted\n  by gcc)\n- added 'A' inline asm constraint.\n\nversion 0.9.17:\n\n- PLT generation fix\n- tcc doc fixes (Peter Lund)\n- struct parse fix (signaled by Pedro A. Aranda Gutierrez)\n- better _Bool lvalue support (signaled by Alex Measday)\n- function parameters must be converted to pointers (signaled by Neil Brown)\n- sanitized string and character constant parsing\n- fixed comment parse (signaled by Damian M Gryski)\n- fixed macro function bug (signaled by Philippe Ribet)\n- added configure (initial patch by Mitchell N Charity)\n- added '-run' and '-v' options (initial patch by vlindos)\n- added real date report in __DATE__ and __TIME__ macros\n\nversion 0.9.16:\n\n- added assembler language support\n- added GCC inline asm() support\n- fixed multiple variable definitions : uninitialized variables are\n  created as COMMON symbols.\n- optimized macro processing\n- added GCC statement expressions support\n- added GCC local labels support\n- fixed array declaration in old style function parameters\n- support casts in static structure initializations\n- added various __xxx[__] keywords for GCC compatibility\n- ignore __extension__ GCC in an expression or in a type (still not perfect)\n- added '? :' GCC extension support\n\nversion 0.9.15:\n\n- compilation fixes for glibc 2.2, gcc 2.95.3 and gcc 3.2.\n- FreeBSD compile fixes. Makefile patches still missing (Carl Drougge).\n- fixed file type guessing if '.' is in the path.\n- fixed tcc_compile_string()\n- add a dummy page in ELF files to fix RX/RW accesses (pageexec at\n  freemail dot hu).\n\nversion 0.9.14:\n\n- added #warning. error message if invalid preprocessing directive.\n- added CType structure to ease typing (faster parse).\n- suppressed secondary hash tables (faster parse).\n- rewrote parser by optimizing common cases (faster parse).\n- fixed signed long long comparisons.\n- fixed 'int a(), b();' declaration case.\n- fixed structure init without '{}'.\n- correct alignment support in structures.\n- empty structures support.\n- gcc testsuite now supported.\n- output only warning if implicit integer/pointer conversions.\n- added static bitfield init.\n\nversion 0.9.13:\n\n- correct preprocessing token pasting (## operator) in all cases (added\n  preprocessing number token).\n- fixed long long register spill.\n- fixed signed long long '>>'.\n- removed memory leaks.\n- better error handling : processing can continue on link errors. A\n  custom callback can be added to display error messages. Most\n  errors do not call exit() now.\n- ignore -O, -W, -m and -f options\n- added old style function declarations\n- added GCC __alignof__ support.\n- added GCC typeof support.\n- added GCC computed gotos support.\n- added stack backtrace in runtime error message. Improved runtime\n  error position display.\n\nversion 0.9.12:\n\n- more fixes for || and && handling.\n- improved '? :' type handling.\n- fixed bound checking generation with structures\n- force '#endif' to be in same file as matching '#if'\n- #include file optimization with '#ifndef #endif' construct detection\n- macro handling optimization\n- added tcc_relocate() and tcc_get_symbol() in libtcc.\n\nversion 0.9.11:\n\n- stdarg.h fix for double type (thanks to Philippe Ribet).\n- correct white space characters and added MSDOS newline support.\n- fixed invalid implicit function call type declaration.\n- special macros such as __LINE__ are defined if tested with defined().\n- fixed '!' operator with relocated address.\n- added symbol + offset relocation (fixes some static variable initializers)\n- '-l' option can be specified anywhere. '-c' option yields default\n  output name. added '-r' option for relocatable output.\n- fixed '\\nnn' octal parsing.\n- fixed local extern variables declarations.\n\nversion 0.9.10:\n\n- fixed lvalue type when saved in local stack.\n- fixed '#include' syntax when using macros.\n- fixed '#line' bug.\n- removed size limit on strings. Unified string constants handling\n  with variable declarations.\n- added correct support for '\\xX' in wchar_t strings.\n- added support for bound checking in generated executables\n- fixed -I include order.\n- fixed incorrect function displayed in runtime error.\n\nversion 0.9.9:\n\n- fixed preprocessor expression parsing for #if/#elif.\n- relocated debug info (.stab section).\n- relocated bounds info (.bounds section).\n- fixed cast to char of char constants ('\\377' is -1 instead of 255)\n- fixed implicit cast for unary plus.\n- strings and '__func__' have now 'char[]' type instead of 'char *'\n  (fixes sizeof() return value).\n- added __start_xxx and __stop_xxx symbols in linker.\n- better DLL creation support (option -shared begins to work).\n- ELF sections and hash tables are resized dynamically.\n- executables and DLLs are stripped by default.\n\nversion 0.9.8:\n\n- First version of full ELF linking support (generate objects, static\n  executable, dynamic executable, dynamic libraries). Dynamic library\n  support is not finished (need PIC support in compiler and some\n  patches in symbol exporting).\n- First version of ELF loader for object (.o) and archive (.a) files.\n- Support of simple GNU ld scripts (GROUP and FILE commands)\n- Separated runtime library and bound check code from TCC (smaller\n  compiler core).\n- fixed register reload in float compare.\n- fixed implicit char/short to int casting.\n- allow array type for address of ('&') operator.\n- fixed unused || or && result.\n- added GCC style variadic macro support.\n- optimized bound checking code for array access.\n- tcc includes are now in $(prefix)/lib/tcc/include.\n- more command line options - more consistent handling of multiple\n  input files.\n- added tcc man page (thanks to Cyril Bouthors).\n- uClibc Makefile update\n- converted documentation to texinfo format.\n- added developper's guide in documentation.\n\nversion 0.9.7:\n\n- added library API for easy dynamic compilation (see libtcc.h - first\n  draft).\n- fixed long long register spill bug.\n- fixed '? :' register spill bug.\n\nversion 0.9.6:\n\n- added floating point constant propagation (fixes negative floating\n  point constants bug).\n\nversion 0.9.5:\n\n - uClibc patches (submitted by Alfonso Martone).\n - error reporting fix\n - added CONFIG_TCC_BCHECK to get smaller code if needed.\n\nversion 0.9.4:\n\n - windows port (currently cannot use -g, -b and dll functions).\n - faster and simpler I/O handling.\n - '-D' option works in all cases.\n - preprocessor fixes (#elif and empty macro args)\n - floating point fixes\n - first code for CIL generation (does not work yet)\n\nversion 0.9.3:\n\n - better and smaller code generator.\n - full ISOC99 64 bit 'long long' support.\n - full 32 bit 'float', 64 bit 'double' and 96 bit 'long double' support.\n - added '-U' option.\n - added assembly sections support. \n - even faster startup time by mmaping sections instead of mallocing them.\n - added GNUC __attribute__ keyword support (currently supports\n    'section' and 'aligned' attributes).\n - added ELF file output (only usable for debugging now)\n - added debug symbol generation (STAB format).\n - added integrated runtime error analysis ('-g' option: print clear\n   run time error messages instead of \"Segmentation fault\").\n - added first version of tiny memory and bound checker ('-b' option).\n\nversion 0.9.2:\n\n - even faster parsing.\n - various syntax parsing fixes.\n - fixed external relocation handling for variables or functions pointers.\n - better function pointers type handling.\n - can compile multiple files (-i option).\n - ANSI C bit fields are supported.\n - beginning of float/double/long double support.\n - beginning of long long support.\n\nversion 0.9.1:\n\n - full ISOC99 initializers handling.\n - compound literals.\n - structures handle in assignments and as function param or return value.\n - wide chars and strings.\n - macro bug fix\n\nversion 0.9:\n - initial version.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/Makefile",
    "content": "#\n# Tiny C Compiler Makefile\n#\n\nTOP ?= .\ninclude $(TOP)/config.mak\nVPATH = $(top_srcdir)\n\nCPPFLAGS = -I$(TOP) # for config.h\n\nifeq (-$(findstring gcc,$(CC))-,-gcc-)\nifeq (-$(findstring $(GCC_MAJOR),01)-,--)\nCFLAGS+=-fno-strict-aliasing\nifeq (-$(findstring $(GCC_MAJOR),23)-,--)\nCFLAGS+=-Wno-pointer-sign -Wno-sign-compare\nifeq (-$(GCC_MAJOR)-$(findstring $(GCC_MINOR),56789)-,-4--)\nCFLAGS+=-D_FORTIFY_SOURCE=0\nelse\nCFLAGS+=-Wno-unused-result\nendif\nendif\nendif\nelse # not GCC\nifeq (-$(findstring clang,$(CC))-,-clang-)\n# make clang accept gnuisms in libtcc1.c\nCFLAGS+=-fheinous-gnu-extensions\nendif\nendif\n\nCPPFLAGS_P=$(CPPFLAGS) -DCONFIG_TCC_STATIC\nCFLAGS_P=$(CFLAGS) -pg -static\nLIBS_P=\nLDFLAGS_P=$(LDFLAGS)\n\nifdef CONFIG_WIN64\nCONFIG_WIN32=yes\nendif\n\nifndef CONFIG_WIN32\nLIBS=-lm\nifndef CONFIG_NOLDL\nLIBS+=-ldl\nendif\nendif\n\n# make libtcc as static or dynamic library?\nifdef DISABLE_STATIC\nLIBTCC=libtcc.so.1.0\nLINK_LIBTCC=-Wl,-rpath,\"$(libdir)\"\nifdef DISABLE_RPATH\nLINK_LIBTCC=\nendif\nelse\nLIBTCC=libtcc.a\nLINK_LIBTCC=\nendif\n\nCONFIG_$(ARCH) = yes\nNATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386\nNATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64\nNATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE\nNATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC\nNATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM -DWITHOUT_LIBTCC\nNATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT\nNATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI\nNATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP\nNATIVE_DEFINES += $(NATIVE_DEFINES_yes)\n\nifeq ($(TOP),.)\n\nPROGS=tcc$(EXESUF)\nI386_CROSS = i386-tcc$(EXESUF)\nWIN32_CROSS = i386-win32-tcc$(EXESUF)\nWIN64_CROSS = x86_64-win32-tcc$(EXESUF)\nWINCE_CROSS = arm-win32-tcc$(EXESUF)\nX64_CROSS = x86_64-tcc$(EXESUF)\nARM_FPA_CROSS = arm-fpa-tcc$(EXESUF)\nARM_FPA_LD_CROSS = arm-fpa-ld-tcc$(EXESUF)\nARM_VFP_CROSS = arm-vfp-tcc$(EXESUF)\nARM_EABI_CROSS = arm-eabi-tcc$(EXESUF)\nARM_CROSS = $(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS)\nC67_CROSS = c67-tcc$(EXESUF)\n\nCORE_FILES = tcc.c libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c\nCORE_FILES += tcc.h config.h libtcc.h tcctok.h\nI386_FILES = $(CORE_FILES) i386-gen.c i386-asm.c i386-asm.h i386-tok.h\nWIN32_FILES = $(CORE_FILES) i386-gen.c i386-asm.c i386-asm.h i386-tok.h tccpe.c\nWIN64_FILES = $(CORE_FILES) x86_64-gen.c i386-asm.c x86_64-asm.h tccpe.c\nWINCE_FILES = $(CORE_FILES) arm-gen.c tccpe.c\nX86_64_FILES = $(CORE_FILES) x86_64-gen.c i386-asm.c x86_64-asm.h\nARM_FILES = $(CORE_FILES) arm-gen.c\nC67_FILES = $(CORE_FILES) c67-gen.c tcccoff.c\n\nifdef CONFIG_WIN64\nPROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)\nNATIVE_FILES=$(WIN64_FILES)\nPROGS_CROSS=$(WIN32_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS)\nLIBTCC1_CROSS=lib/i386-win32/libtcc1.a\nLIBTCC1=libtcc1.a\nelse ifdef CONFIG_WIN32\nPROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)\nNATIVE_FILES=$(WIN32_FILES)\nPROGS_CROSS=$(WIN64_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS)\nLIBTCC1_CROSS=lib/x86_64-win32/libtcc1.a\nLIBTCC1=libtcc1.a\nelse ifeq ($(ARCH),i386)\nNATIVE_FILES=$(I386_FILES)\nPROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS)\nLIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a\nLIBTCC1=libtcc1.a\nelse ifeq ($(ARCH),x86-64)\nNATIVE_FILES=$(X86_64_FILES)\nPROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS)\nLIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a lib/i386/libtcc1.a\nLIBTCC1=libtcc1.a\nelse ifeq ($(ARCH),arm)\nNATIVE_FILES=$(ARM_FILES)\nPROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS)\nendif\n\nifeq ($(TARGETOS),Darwin)\nPROGS+=tiny_libmaker$(EXESUF)\nendif\n\nifdef CONFIG_USE_LIBGCC\nLIBTCC1=\nendif\n\nTCCLIBS = $(LIBTCC1) $(LIBTCC)\nTCCDOCS = tcc.1 tcc-doc.html tcc-doc.info\n\nifdef CONFIG_CROSS\nPROGS+=$(PROGS_CROSS)\nTCCLIBS+=$(LIBTCC1_CROSS)\nendif\n\nall: $(PROGS) $(TCCLIBS) $(TCCDOCS)\n\n# Host Tiny C Compiler\ntcc$(EXESUF): tcc.o $(LIBTCC)\n\t$(CC) -o $@ $^ $(LIBS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LINK_LIBTCC)\n\n# Cross Tiny C Compilers\n%-tcc$(EXESUF): tcc.c\n\t$(CC) -o $@ $< -DONE_SOURCE $(DEFINES) $(CPPFLAGS) $(CFLAGS) $(LIBS) $(LDFLAGS)\n\n# profiling version\ntcc_p$(EXESUF): $(NATIVE_FILES)\n\t$(CC) -o $@ $< -DONE_SOURCE $(NATIVE_DEFINES) $(CPPFLAGS_P) $(CFLAGS_P) $(LIBS_P) $(LDFLAGS_P)\n\n$(I386_CROSS): DEFINES = -DTCC_TARGET_I386 \\\n    -DCONFIG_TCCDIR=\"\\\"$(tccdir)/i386\\\"\"\n$(X64_CROSS): DEFINES = -DTCC_TARGET_X86_64\n$(WIN32_CROSS): DEFINES = -DTCC_TARGET_I386 -DTCC_TARGET_PE \\\n    -DCONFIG_TCCDIR=\"\\\"$(tccdir)/win32\\\"\" \\\n    -DCONFIG_TCC_LIBPATHS=\"\\\"{B}/lib/32;{B}/lib\\\"\"\n$(WIN64_CROSS): DEFINES = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE \\\n    -DCONFIG_TCCDIR=\"\\\"$(tccdir)/win32\\\"\" \\\n    -DCONFIG_TCC_LIBPATHS=\"\\\"{B}/lib/64;{B}/lib\\\"\"\n$(WINCE_CROSS): DEFINES = -DTCC_TARGET_PE\n$(C67_CROSS): DEFINES = -DTCC_TARGET_C67\n$(ARM_FPA_CROSS): DEFINES = -DTCC_TARGET_ARM\n$(ARM_FPA_LD_CROSS)$(EXESUF): DEFINES = -DTCC_TARGET_ARM -DLDOUBLE_SIZE=12\n$(ARM_VFP_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_VFP\n$(ARM_EABI_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_EABI\n\n$(I386_CROSS): $(I386_FILES)\n$(X64_CROSS): $(X86_64_FILES)\n$(WIN32_CROSS): $(WIN32_FILES)\n$(WIN64_CROSS): $(WIN64_FILES)\n$(WINCE_CROSS): $(WINCE_FILES)\n$(C67_CROSS): $(C67_FILES)\n$(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS): $(ARM_FILES)\n\n# libtcc generation and test\nifndef ONE_SOURCE\nLIBTCC_OBJ = $(filter-out tcc.o,$(patsubst %.c,%.o,$(filter %.c,$(NATIVE_FILES))))\nLIBTCC_INC = $(filter %.h,$(CORE_FILES)) $(filter-out $(CORE_FILES),$(NATIVE_FILES))\nelse\nLIBTCC_OBJ = libtcc.o\nLIBTCC_INC = $(NATIVE_FILES)\nlibtcc.o : NATIVE_DEFINES += -DONE_SOURCE\nendif\n\n$(LIBTCC_OBJ) tcc.o : %.o : %.c $(LIBTCC_INC)\n\t$(CC) -o $@ -c $< $(NATIVE_DEFINES) $(CPPFLAGS) $(CFLAGS)\n\nlibtcc.a: $(LIBTCC_OBJ)\n\t$(AR) rcs $@ $^\n\nlibtcc.so.1.0: $(LIBTCC_OBJ)\n\t$(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDFLAGS)\n\nlibtcc.so.1.0: CFLAGS+=-fPIC\n\n# windows utilities\ntiny_impdef$(EXESUF): win32/tools/tiny_impdef.c\n\t$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)\ntiny_libmaker$(EXESUF): win32/tools/tiny_libmaker.c\n\t$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)\n\n# TinyCC runtime libraries\nlibtcc1.a : FORCE\n\t$(MAKE) -C lib native\nlib/%/libtcc1.a : FORCE $(PROGS_CROSS)\n\t$(MAKE) -C lib cross TARGET=$*\n\nFORCE:\n\n# install\nTCC_INCLUDES = stdarg.h stddef.h stdbool.h float.h varargs.h tcclib.h\nINSTALL=install\nifdef STRIP_BINARIES\nINSTALLBIN=$(INSTALL) -s\nelse\nINSTALLBIN=$(INSTALL)\nendif\n\nifndef CONFIG_WIN32\ninstall: $(PROGS) $(TCCLIBS) $(TCCDOCS)\n\tmkdir -p \"$(bindir)\"\nifeq ($(CC),tcc)\n\t$(INSTALL) -m755 $(PROGS) \"$(bindir)\"\nelse\n\t$(INSTALLBIN) -m755 $(PROGS) \"$(bindir)\"\nendif\n\tmkdir -p \"$(mandir)/man1\"\n\t-$(INSTALL) tcc.1 \"$(mandir)/man1\"\n\tmkdir -p \"$(infodir)\"\n\t-$(INSTALL) tcc-doc.info \"$(infodir)\"\n\tmkdir -p \"$(tccdir)\"\n\tmkdir -p \"$(tccdir)/include\"\nifneq ($(LIBTCC1),)\n\t$(INSTALL) -m644 $(LIBTCC1) \"$(tccdir)\"\nendif\n\t$(INSTALL) -m644 $(addprefix $(top_srcdir)/include/,$(TCC_INCLUDES)) \"$(tccdir)/include\"\n\tmkdir -p \"$(libdir)\"\n\t$(INSTALL) -m755 $(LIBTCC) \"$(libdir)\"\nifdef DISABLE_STATIC\n\tln -sf \"$(ln_libdir)/libtcc.so.1.0\" \"$(libdir)/libtcc.so.1\"\n\tln -sf \"$(ln_libdir)/libtcc.so.1.0\" \"$(libdir)/libtcc.so\"\nendif\n\tmkdir -p \"$(includedir)\"\n\t$(INSTALL) -m644 $(top_srcdir)/libtcc.h \"$(includedir)\"\n\tmkdir -p \"$(docdir)\"\n\t-$(INSTALL) -m644 tcc-doc.html \"$(docdir)\"\nifdef CONFIG_CROSS\n\tmkdir -p \"$(tccdir)/win32/lib/32\"\n\tmkdir -p \"$(tccdir)/win32/lib/64\"\nifeq ($(ARCH),x86-64)\n\tmkdir -p \"$(tccdir)/i386\"\n\t$(INSTALL) -m644 lib/i386/libtcc1.a \"$(tccdir)/i386\"\n\tcp -r \"$(tccdir)/include\" \"$(tccdir)/i386\"\nendif\n\t$(INSTALL) -m644 win32/lib/*.def \"$(tccdir)/win32/lib\"\n\t$(INSTALL) -m644 lib/i386-win32/libtcc1.a \"$(tccdir)/win32/lib/32\"\n\t$(INSTALL) -m644 lib/x86_64-win32/libtcc1.a \"$(tccdir)/win32/lib/64\"\n\tcp -r win32/include/. \"$(tccdir)/win32/include\"\n\tcp -r include/. \"$(tccdir)/win32/include\"\nendif\n\nuninstall:\n\trm -fv $(foreach P,$(PROGS),\"$(bindir)/$P\")\n\trm -fv $(foreach P,$(LIBTCC1),\"$(tccdir)/$P\")\n\trm -fv $(foreach P,$(TCC_INCLUDES),\"$(tccdir)/include/$P\")\n\trm -fv \"$(docdir)/tcc-doc.html\" \"$(mandir)/man1/tcc.1\" \"$(infodir)/tcc-doc.info\"\n\trm -fv \"$(libdir)/$(LIBTCC)\" \"$(includedir)/libtcc.h\"\n\trm -fv \"$(libdir)/libtcc.so*\"\n\trm -rf \"$(tccdir)/win32\"\n\t-rmdir $(tccdir)/include\nifeq ($(ARCH),x86-64)\n\trm -rf \"$(tccdir)/i386\"\nendif\nelse\n# on windows\ninstall: $(PROGS) $(TCCLIBS) $(TCCDOCS)\n\tmkdir -p \"$(tccdir)\"\n\tmkdir -p \"$(tccdir)/lib\"\n\tmkdir -p \"$(tccdir)/include\"\n\tmkdir -p \"$(tccdir)/examples\"\n\tmkdir -p \"$(tccdir)/doc\"\n\tmkdir -p \"$(tccdir)/libtcc\"\n\t$(INSTALLBIN) -m755 $(PROGS) \"$(tccdir)\"\n\t$(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def \"$(tccdir)/lib\"\n\tcp -r win32/include/. \"$(tccdir)/include\"\n\tcp -r win32/examples/. \"$(tccdir)/examples\"\n\t$(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) \"$(tccdir)/include\"\n\t$(INSTALL) -m644 tcc-doc.html win32/tcc-win32.txt \"$(tccdir)/doc\"\n\t$(INSTALL) -m644 $(LIBTCC) libtcc.h \"$(tccdir)/libtcc\"\nifdef CONFIG_CROSS\n\tmkdir -p \"$(tccdir)/lib/32\"\n\tmkdir -p \"$(tccdir)/lib/64\"\n\t-$(INSTALL) -m644 lib/i386-win32/libtcc1.a \"$(tccdir)/lib/32\"\n\t-$(INSTALL) -m644 lib/x86_64-win32/libtcc1.a \"$(tccdir)/lib/64\"\nendif\n\nuninstall:\n\trm -rfv \"$(tccdir)/*\"\nendif\n\n# documentation and man page\ntcc-doc.html: tcc-doc.texi\n\t-texi2html -monolithic -number $<\n\ntcc.1: tcc-doc.texi\n\t-$(top_srcdir)/texi2pod.pl $< tcc.pod\n\t-pod2man --section=1 --center=\" \" --release=\" \" tcc.pod > $@\n\ntcc-doc.info: tcc-doc.texi\n\t-makeinfo $<\n\n# in tests subdir\nexport LIBTCC1\n\n%est:\n\t$(MAKE) -C tests $@\n\nclean:\n\trm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.so* *.out *.exe libtcc_test$(EXESUF)\n\t$(MAKE) -C tests $@\nifneq ($(LIBTCC1),)\n\t$(MAKE) -C lib $@\nendif\n\ndistclean: clean\n\trm -vf config.h config.mak config.texi tcc.1 tcc-doc.info tcc-doc.html\n\nconfig.mak:\n\t@echo \"Please run ./configure.\"\n\t@exit 1\n\n# create release tarball from *current* git branch (including tcc-doc.html\n# and converting two files to CRLF)\nTCC-VERSION := tcc-$(shell cat $(top_srcdir)/VERSION)\ntar:    tcc-doc.html\n\tmkdir $(TCC-VERSION)\n\t( cd $(TCC-VERSION) && git --git-dir ../.git checkout -f )\n\tcp tcc-doc.html $(TCC-VERSION)\n\tfor f in tcc-win32.txt build-tcc.bat ; do \\\n\t    cat win32/$$f | sed 's,\\(.*\\),\\1\\r,g' > $(TCC-VERSION)/win32/$$f ; \\\n\tdone\n\ttar cjf $(TCC-VERSION).tar.bz2 $(TCC-VERSION)\n\trm -rf $(TCC-VERSION)\n\tgit reset\n\n\n.PHONY: all clean tar distclean install uninstall FORCE\n\nendif # ifeq ($(TOP),.)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/README",
    "content": "Tiny C Compiler - C Scripting Everywhere - The Smallest ANSI C compiler\n-----------------------------------------------------------------------\n\nFeatures:\n--------\n\n- SMALL! You can compile and execute C code everywhere, for example on\n  rescue disks.\n\n- FAST! tcc generates optimized x86 code. No byte code\n  overhead. Compile, assemble and link about 7 times faster than 'gcc\n  -O0'.\n\n- UNLIMITED! Any C dynamic library can be used directly. TCC is\n  heading torward full ISOC99 compliance. TCC can of course compile\n  itself.\n\n- SAFE! tcc includes an optional memory and bound checker. Bound\n  checked code can be mixed freely with standard code.\n\n- Compile and execute C source directly. No linking or assembly\n  necessary. Full C preprocessor included. \n\n- C script supported : just add '#!/usr/local/bin/tcc -run' at the first\n  line of your C source, and execute it directly from the command\n  line.\n\nDocumentation:\n-------------\n\n1) Installation on a i386 Linux host (for Windows read tcc-win32.txt)\n\n   ./configure\n   make\n   make test\n   make install\n\nAlternatively, out-of-tree builds are supported: you may use different\ndirectories to hold build objects, kept separate from your source tree:\n\n   mkdir _build\n   cd _build\n   ../configure\n   make\n   make test\n   make install\n\nBy default, tcc is installed in /usr/local/bin.\n./configure --help  shows configuration options.\n\n\n2) Introduction\n\nWe assume here that you know ANSI C. Look at the example ex1.c to know\nwhat the programs look like.\n\nThe include file <tcclib.h> can be used if you want a small basic libc\ninclude support (especially useful for floppy disks). Of course, you\ncan also use standard headers, although they are slower to compile.\n\nYou can begin your C script with '#!/usr/local/bin/tcc -run' on the first\nline and set its execute bits (chmod a+x your_script). Then, you can\nlaunch the C code as a shell or perl script :-) The command line\narguments are put in 'argc' and 'argv' of the main functions, as in\nANSI C.\n\n3) Examples\n\nex1.c: simplest example (hello world). Can also be launched directly\nas a script: './ex1.c'.\n\nex2.c: more complicated example: find a number with the four\noperations given a list of numbers (benchmark).\n\nex3.c: compute fibonacci numbers (benchmark).\n\nex4.c: more complicated: X11 program. Very complicated test in fact\nbecause standard headers are being used ! As for ex1.c, can also be launched\ndirectly as a script: './ex4.c'.\n\nex5.c: 'hello world' with standard glibc headers.\n\ntcc.c: TCC can of course compile itself. Used to check the code\ngenerator.\n\ntcctest.c: auto test for TCC which tests many subtle possible bugs. Used\nwhen doing 'make test'.\n\n4) Full Documentation\n\nPlease read tcc-doc.html to have all the features of TCC.\n\nAdditional information is available for the Windows port in tcc-win32.txt.\n\nLicense:\n-------\n\nTCC is distributed under the GNU Lesser General Public License (see\nCOPYING file).\n\nFabrice Bellard.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/TODO",
    "content": "TODO list:\n\nBugs:\n\n- fix macro substitution with nested definitions (ShangHongzhang)\n- FPU st(0) is left unclean (kwisatz haderach). Incompatible with\n  optimized gcc/msc code\n\n- constructors\n- cast bug (Peter Wang)\n- define incomplete type if defined several times (Peter Wang).\n- configure --cc=tcc (still one bug in libtcc1.c)\n- test binutils/gcc compile\n- tci patch + argument.\n- see -lxxx bug (Michael Charity).\n- see transparent union pb in /urs/include/sys/socket.h\n- precise behaviour of typeof with arrays ? (__put_user macro)\n  but should suffice for most cases)\n- handle '? x, y : z' in unsized variable initialization (',' is\n  considered incorrectly as separator in preparser)\n- transform functions to function pointers in function parameters\n  (net/ipv4/ip_output.c)\n- fix function pointer type display\n- check lcc test suite -> fix bitfield binary operations\n- check section alignment in C\n- fix invalid cast in comparison 'if (v == (int8_t)v)'\n- finish varargs.h support (gcc 3.2 testsuite issue)\n- fix static functions declared inside block\n- fix multiple unions init\n- sizeof, alignof, typeof can still generate code in some cases.\n- Fix the remaining libtcc memory leaks.\n- make libtcc fully reentrant (except for the compilation stage itself).\n\nBound checking:\n\n- '-b' bug.\n- fix bound exit on RedHat 7.3\n- setjmp is not supported properly in bound checking.\n- fix bound check code with '&' on local variables (currently done\n  only for local arrays).\n- bound checking and float/long long/struct copy code. bound\n  checking and symbol + offset optimization\n\nMissing features:\n\n- disable-asm and disable-bcheck options\n- __builtin_expect()\n- improve '-E' option.\n- atexit (Nigel Horne)\n- packed attribute\n- C99: add complex types (gcc 3.2 testsuite issue)\n- postfix compound literals (see 20010124-1.c)\n\nOptimizations:\n\n- suppress specific anonymous symbol handling\n- more parse optimizations (=even faster compilation)\n- memory alloc optimizations (=even faster compilation)\n- optimize VT_LOCAL + const\n- better local variables handling (needed for other targets)\n\nNot critical:\n\n- C99: fix multiple compound literals inits in blocks (ISOC99\n  normative example - only relevant when using gotos! -> must add\n  boolean variable to tell if compound literal was already\n  initialized).\n- add PowerPC or ARM code generator and improve codegen for RISC (need\n  to suppress VT_LOCAL and use a base register instead).\n- interactive mode / integrated debugger\n- fix preprocessor symbol redefinition\n- better constant opt (&&, ||, ?:)\n- add portable byte code generator and interpreter for other\n  unsupported architectures.\n- C++: variable declaration in for, minimal 'class' support.\n- win32: __intxx. use resolve for bchecked malloc et al.\n  check exception code (exception filter func).\n- handle void (__attribute__() *ptr)()\n\nFixed (probably):\n\n- bug with defines:\n    #define spin_lock(lock) do { } while (0)\n    #define wq_spin_lock spin_lock\n    #define TEST() wq_spin_lock(a)\n- typedefs can be structure fields\n- see bugfixes.diff + improvement.diff from Daniel Glockner\n- long long constant evaluation\n- add alloca()\n- gcc '-E' option.\n- #include_next support for /usr/include/limits ?\n- function pointers/lvalues in ? : (linux kernel net/core/dev.c)\n- win32: add __stdcall, check GetModuleHandle for dlls.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/VERSION",
    "content": "0.9.26\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/arm-gen.c",
    "content": "/*\n *  ARMv4 code generator for TCC\n * \n *  Copyright (c) 2003 Daniel Glckner\n *  Copyright (c) 2012 Thomas Preud'homme\n *\n *  Based on i386-gen.c by Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#ifdef TARGET_DEFS_ONLY\n\n#ifdef TCC_ARM_EABI\n#ifndef TCC_ARM_VFP // Avoid useless warning\n#define TCC_ARM_VFP\n#endif\n#endif\n\n/* number of available registers */\n#ifdef TCC_ARM_VFP\n#define NB_REGS            13\n#else\n#define NB_REGS             9\n#endif\n\n#ifndef TCC_ARM_VERSION\n# define TCC_ARM_VERSION 5\n#endif\n\n/* a register can belong to several classes. The classes must be\n   sorted from more general to more precise (see gv2() code which does\n   assumptions on it). */\n#define RC_INT     0x0001 /* generic integer register */\n#define RC_FLOAT   0x0002 /* generic float register */\n#define RC_R0      0x0004\n#define RC_R1      0x0008 \n#define RC_R2      0x0010\n#define RC_R3      0x0020\n#define RC_R12     0x0040\n#define RC_F0      0x0080\n#define RC_F1      0x0100\n#define RC_F2      0x0200\n#define RC_F3      0x0400\n#ifdef TCC_ARM_VFP\n#define RC_F4      0x0800\n#define RC_F5      0x1000\n#define RC_F6      0x2000\n#define RC_F7      0x4000\n#endif\n#define RC_IRET    RC_R0  /* function return: integer register */\n#define RC_LRET    RC_R1  /* function return: second integer register */\n#define RC_FRET    RC_F0  /* function return: float register */\n\n/* pretty names for the registers */\nenum {\n    TREG_R0 = 0,\n    TREG_R1,\n    TREG_R2,\n    TREG_R3,\n    TREG_R12,\n    TREG_F0,\n    TREG_F1,\n    TREG_F2,\n    TREG_F3,\n#ifdef TCC_ARM_VFP\n    TREG_F4,\n    TREG_F5,\n    TREG_F6,\n    TREG_F7,\n#endif\n};\n\n#ifdef TCC_ARM_VFP\n#define T2CPR(t) (((t) & VT_BTYPE) != VT_FLOAT ? 0x100 : 0)\n#endif\n\n/* return registers for function */\n#define REG_IRET TREG_R0 /* single word int return register */\n#define REG_LRET TREG_R1 /* second word return register (for long long) */\n#define REG_FRET TREG_F0 /* float return register */\n\n#ifdef TCC_ARM_EABI\n#define TOK___divdi3 TOK___aeabi_ldivmod\n#define TOK___moddi3 TOK___aeabi_ldivmod\n#define TOK___udivdi3 TOK___aeabi_uldivmod\n#define TOK___umoddi3 TOK___aeabi_uldivmod\n#endif\n\n/* defined if function parameters must be evaluated in reverse order */\n#define INVERT_FUNC_PARAMS\n\n/* defined if structures are passed as pointers. Otherwise structures\n   are directly pushed on stack. */\n//#define FUNC_STRUCT_PARAM_AS_PTR\n\n/* pointer size, in bytes */\n#define PTR_SIZE 4\n\n/* long double size and alignment, in bytes */\n#ifdef TCC_ARM_VFP\n#define LDOUBLE_SIZE  8\n#endif\n\n#ifndef LDOUBLE_SIZE\n#define LDOUBLE_SIZE  8\n#endif\n\n#ifdef TCC_ARM_EABI\n#define LDOUBLE_ALIGN 8\n#else\n#define LDOUBLE_ALIGN 4\n#endif\n\n/* maximum alignment (for aligned attribute support) */\n#define MAX_ALIGN     8\n\n#define CHAR_IS_UNSIGNED\n\n/******************************************************/\n/* ELF defines */\n\n#define EM_TCC_TARGET EM_ARM\n\n/* relocation type for 32 bit data relocation */\n#define R_DATA_32   R_ARM_ABS32\n#define R_DATA_PTR  R_ARM_ABS32\n#define R_JMP_SLOT  R_ARM_JUMP_SLOT\n#define R_COPY      R_ARM_COPY\n\n#define ELF_START_ADDR 0x00008000\n#define ELF_PAGE_SIZE  0x1000\n\n/******************************************************/\n#else /* ! TARGET_DEFS_ONLY */\n/******************************************************/\n#include \"tcc.h\"\n\nST_DATA const int reg_classes[NB_REGS] = {\n    /* r0 */ RC_INT | RC_R0,\n    /* r1 */ RC_INT | RC_R1,\n    /* r2 */ RC_INT | RC_R2,\n    /* r3 */ RC_INT | RC_R3,\n    /* r12 */ RC_INT | RC_R12,\n    /* f0 */ RC_FLOAT | RC_F0,\n    /* f1 */ RC_FLOAT | RC_F1,\n    /* f2 */ RC_FLOAT | RC_F2,\n    /* f3 */ RC_FLOAT | RC_F3,\n#ifdef TCC_ARM_VFP\n /* d4/s8 */ RC_FLOAT | RC_F4,\n/* d5/s10 */ RC_FLOAT | RC_F5,\n/* d6/s12 */ RC_FLOAT | RC_F6,\n/* d7/s14 */ RC_FLOAT | RC_F7,\n#endif\n};\n\nstatic int func_sub_sp_offset, last_itod_magic;\nstatic int leaffunc;\n\n#if defined(TCC_ARM_EABI) && defined(TCC_ARM_VFP)\nstatic CType float_type, double_type, func_float_type, func_double_type;\nST_FUNC void arm_init_types(void)\n{\n    float_type.t = VT_FLOAT;\n    double_type.t = VT_DOUBLE;\n    func_float_type.t = VT_FUNC;\n    func_float_type.ref = sym_push(SYM_FIELD, &float_type, FUNC_CDECL, FUNC_OLD);\n    func_double_type.t = VT_FUNC;\n    func_double_type.ref = sym_push(SYM_FIELD, &double_type, FUNC_CDECL, FUNC_OLD);\n}\n#else\n#define func_float_type func_old_type\n#define func_double_type func_old_type\n#define func_ldouble_type func_old_type\nST_FUNC void arm_init_types(void) {}\n#endif\n\nstatic int two2mask(int a,int b) {\n  return (reg_classes[a]|reg_classes[b])&~(RC_INT|RC_FLOAT);\n}\n\nstatic int regmask(int r) {\n  return reg_classes[r]&~(RC_INT|RC_FLOAT);\n}\n\n/******************************************************/\n\nvoid o(uint32_t i)\n{\n  /* this is a good place to start adding big-endian support*/\n  int ind1;\n\n  ind1 = ind + 4;\n  if (!cur_text_section)\n    tcc_error(\"compiler error! This happens f.ex. if the compiler\\n\"\n         \"can't evaluate constant expressions outside of a function.\");\n  if (ind1 > cur_text_section->data_allocated)\n    section_realloc(cur_text_section, ind1);\n  cur_text_section->data[ind++] = i&255;\n  i>>=8;\n  cur_text_section->data[ind++] = i&255;\n  i>>=8; \n  cur_text_section->data[ind++] = i&255;\n  i>>=8;\n  cur_text_section->data[ind++] = i;\n}\n\nstatic uint32_t stuff_const(uint32_t op, uint32_t c)\n{\n  int try_neg=0;\n  uint32_t nc = 0, negop = 0;\n\n  switch(op&0x1F00000)\n  {\n    case 0x800000: //add\n    case 0x400000: //sub\n      try_neg=1;\n      negop=op^0xC00000;\n      nc=-c;\n      break;\n    case 0x1A00000: //mov\n    case 0x1E00000: //mvn\n      try_neg=1;\n      negop=op^0x400000;\n      nc=~c;\n      break;\n    case 0x200000: //xor\n      if(c==~0)\n\treturn (op&0xF010F000)|((op>>16)&0xF)|0x1E00000;\n      break;\n    case 0x0: //and\n      if(c==~0)\n\treturn (op&0xF010F000)|((op>>16)&0xF)|0x1A00000;\n    case 0x1C00000: //bic\n      try_neg=1;\n      negop=op^0x1C00000;\n      nc=~c;\n      break;\n    case 0x1800000: //orr\n      if(c==~0)\n\treturn (op&0xFFF0FFFF)|0x1E00000;\n      break;\n  }\n  do {\n    uint32_t m;\n    int i;\n    if(c<256) /* catch undefined <<32 */\n      return op|c;\n    for(i=2;i<32;i+=2) {\n      m=(0xff>>i)|(0xff<<(32-i));\n      if(!(c&~m))\n\treturn op|(i<<7)|(c<<i)|(c>>(32-i));\n    }\n    op=negop;\n    c=nc;\n  } while(try_neg--);\n  return 0;\n}\n\n\n//only add,sub\nvoid stuff_const_harder(uint32_t op, uint32_t v) {\n  uint32_t x;\n  x=stuff_const(op,v);\n  if(x)\n    o(x);\n  else {\n    uint32_t a[16], nv, no, o2, n2;\n    int i,j,k;\n    a[0]=0xff;\n    o2=(op&0xfff0ffff)|((op&0xf000)<<4);;\n    for(i=1;i<16;i++)\n      a[i]=(a[i-1]>>2)|(a[i-1]<<30);\n    for(i=0;i<12;i++)\n      for(j=i<4?i+12:15;j>=i+4;j--)\n\tif((v&(a[i]|a[j]))==v) {\n\t  o(stuff_const(op,v&a[i]));\n\t  o(stuff_const(o2,v&a[j]));\n\t  return;\n\t}\n    no=op^0xC00000;\n    n2=o2^0xC00000;\n    nv=-v;\n    for(i=0;i<12;i++)\n      for(j=i<4?i+12:15;j>=i+4;j--)\n\tif((nv&(a[i]|a[j]))==nv) {\n\t  o(stuff_const(no,nv&a[i]));\n\t  o(stuff_const(n2,nv&a[j]));\n\t  return;\n\t}\n    for(i=0;i<8;i++)\n      for(j=i+4;j<12;j++)\n\tfor(k=i<4?i+12:15;k>=j+4;k--)\n\t  if((v&(a[i]|a[j]|a[k]))==v) {\n\t    o(stuff_const(op,v&a[i]));\n\t    o(stuff_const(o2,v&a[j]));\n\t    o(stuff_const(o2,v&a[k]));\n\t    return;\n\t  }\n    no=op^0xC00000;\n    nv=-v;\n    for(i=0;i<8;i++)\n      for(j=i+4;j<12;j++)\n\tfor(k=i<4?i+12:15;k>=j+4;k--)\n\t  if((nv&(a[i]|a[j]|a[k]))==nv) {\n\t    o(stuff_const(no,nv&a[i]));\n\t    o(stuff_const(n2,nv&a[j]));\n\t    o(stuff_const(n2,nv&a[k]));\n\t    return;\n\t  }\n    o(stuff_const(op,v&a[0]));\n    o(stuff_const(o2,v&a[4]));\n    o(stuff_const(o2,v&a[8]));\n    o(stuff_const(o2,v&a[12]));\n  }\n}\n\nST_FUNC uint32_t encbranch(int pos, int addr, int fail)\n{\n  addr-=pos+8;\n  addr/=4;\n  if(addr>=0x1000000 || addr<-0x1000000) {\n    if(fail)\n      tcc_error(\"FIXME: function bigger than 32MB\");\n    return 0;\n  }\n  return 0x0A000000|(addr&0xffffff);\n}\n\nint decbranch(int pos)\n{\n  int x;\n  x=*(uint32_t *)(cur_text_section->data + pos);\n  x&=0x00ffffff;\n  if(x&0x800000)\n    x-=0x1000000;\n  return x*4+pos+8;\n}\n\n/* output a symbol and patch all calls to it */\nvoid gsym_addr(int t, int a)\n{\n  uint32_t *x;\n  int lt;\n  while(t) {\n    x=(uint32_t *)(cur_text_section->data + t);\n    t=decbranch(lt=t);\n    if(a==lt+4)\n      *x=0xE1A00000; // nop\n    else {\n      *x &= 0xff000000;\n      *x |= encbranch(lt,a,1);\n    }\n  }\n}\n\nvoid gsym(int t)\n{\n  gsym_addr(t, ind);\n}\n\n#ifdef TCC_ARM_VFP\nstatic uint32_t vfpr(int r)\n{\n  if(r<TREG_F0 || r>TREG_F7)\n    tcc_error(\"compiler error! register %i is no vfp register\",r);\n  return r-5;\n}\n#else\nstatic uint32_t fpr(int r)\n{\n  if(r<TREG_F0 || r>TREG_F3)\n    tcc_error(\"compiler error! register %i is no fpa register\",r);\n  return r-5;\n}\n#endif\n\nstatic uint32_t intr(int r)\n{\n  if(r==4)\n    return 12;\n  if((r<0 || r>4) && r!=14)\n    tcc_error(\"compiler error! register %i is no int register\",r);\n  return r;\n}\n\nstatic void calcaddr(uint32_t *base, int *off, int *sgn, int maxoff, unsigned shift)\n{\n  if(*off>maxoff || *off&((1<<shift)-1)) {\n    uint32_t x, y;\n    x=0xE280E000;\n    if(*sgn)\n      x=0xE240E000;\n    x|=(*base)<<16;\n    *base=14; // lr\n    y=stuff_const(x,*off&~maxoff);\n    if(y) {\n      o(y);\n      *off&=maxoff;\n      return;\n    }\n    y=stuff_const(x,(*off+maxoff)&~maxoff);\n    if(y) {\n      o(y);\n      *sgn=!*sgn;\n      *off=((*off+maxoff)&~maxoff)-*off;\n      return;\n    }\n    stuff_const_harder(x,*off&~maxoff);\n    *off&=maxoff;\n  }\n}\n\nstatic uint32_t mapcc(int cc)\n{\n  switch(cc)\n  {\n    case TOK_ULT:\n      return 0x30000000; /* CC/LO */\n    case TOK_UGE:\n      return 0x20000000; /* CS/HS */\n    case TOK_EQ:\n      return 0x00000000; /* EQ */\n    case TOK_NE:\n      return 0x10000000; /* NE */\n    case TOK_ULE:\n      return 0x90000000; /* LS */\n    case TOK_UGT:\n      return 0x80000000; /* HI */\n    case TOK_Nset:\n      return 0x40000000; /* MI */\n    case TOK_Nclear:\n      return 0x50000000; /* PL */\n    case TOK_LT:\n      return 0xB0000000; /* LT */\n    case TOK_GE:\n      return 0xA0000000; /* GE */\n    case TOK_LE:\n      return 0xD0000000; /* LE */\n    case TOK_GT:\n      return 0xC0000000; /* GT */\n  }\n  tcc_error(\"unexpected condition code\");\n  return 0xE0000000; /* AL */\n}\n\nstatic int negcc(int cc)\n{\n  switch(cc)\n  {\n    case TOK_ULT:\n      return TOK_UGE;\n    case TOK_UGE:\n      return TOK_ULT;\n    case TOK_EQ:\n      return TOK_NE;\n    case TOK_NE:\n      return TOK_EQ;\n    case TOK_ULE:\n      return TOK_UGT;\n    case TOK_UGT:\n      return TOK_ULE;\n    case TOK_Nset:\n      return TOK_Nclear;\n    case TOK_Nclear:\n      return TOK_Nset;\n    case TOK_LT:\n      return TOK_GE;\n    case TOK_GE:\n      return TOK_LT;\n    case TOK_LE:\n      return TOK_GT;\n    case TOK_GT:\n      return TOK_LE;\n  }\n  tcc_error(\"unexpected condition code\");\n  return TOK_NE;\n}\n\n/* load 'r' from value 'sv' */\nvoid load(int r, SValue *sv)\n{\n  int v, ft, fc, fr, sign;\n  uint32_t op;\n  SValue v1;\n\n  fr = sv->r;\n  ft = sv->type.t;\n  fc = sv->c.ul;\n\n  if(fc>=0)\n    sign=0;\n  else {\n    sign=1;\n    fc=-fc;\n  }\n  \n  v = fr & VT_VALMASK;\n  if (fr & VT_LVAL) {\n    uint32_t base = 0xB; // fp\n    if(v == VT_LLOCAL) {\n      v1.type.t = VT_PTR;\n      v1.r = VT_LOCAL | VT_LVAL;\n      v1.c.ul = sv->c.ul;\n      load(base=14 /* lr */, &v1);\n      fc=sign=0;\n      v=VT_LOCAL;\n    } else if(v == VT_CONST) {\n      v1.type.t = VT_PTR;\n      v1.r = fr&~VT_LVAL;\n      v1.c.ul = sv->c.ul;\n      v1.sym=sv->sym;\n      load(base=14, &v1);\n      fc=sign=0;\n      v=VT_LOCAL;\n    } else if(v < VT_CONST) {\n      base=intr(v);\n      fc=sign=0;\n      v=VT_LOCAL;\n    }\n    if(v == VT_LOCAL) {\n      if(is_float(ft)) {\n\tcalcaddr(&base,&fc,&sign,1020,2);\n#ifdef TCC_ARM_VFP\n        op=0xED100A00; /* flds */\n        if(!sign)\n          op|=0x800000;\n        if ((ft & VT_BTYPE) != VT_FLOAT)\n          op|=0x100;   /* flds -> fldd */\n        o(op|(vfpr(r)<<12)|(fc>>2)|(base<<16));\n#else\n\top=0xED100100;\n\tif(!sign)\n\t  op|=0x800000;\n#if LDOUBLE_SIZE == 8\n\tif ((ft & VT_BTYPE) != VT_FLOAT)\n\t  op|=0x8000;\n#else\n\tif ((ft & VT_BTYPE) == VT_DOUBLE)\n\t  op|=0x8000;\n\telse if ((ft & VT_BTYPE) == VT_LDOUBLE)\n\t  op|=0x400000;\n#endif\n\to(op|(fpr(r)<<12)|(fc>>2)|(base<<16));\n#endif\n      } else if((ft & (VT_BTYPE|VT_UNSIGNED)) == VT_BYTE\n                || (ft & VT_BTYPE) == VT_SHORT) {\n\tcalcaddr(&base,&fc,&sign,255,0);\n\top=0xE1500090;\n\tif ((ft & VT_BTYPE) == VT_SHORT)\n\t  op|=0x20;\n\tif ((ft & VT_UNSIGNED) == 0)\n\t  op|=0x40;\n\tif(!sign)\n\t  op|=0x800000;\n\to(op|(intr(r)<<12)|(base<<16)|((fc&0xf0)<<4)|(fc&0xf));\n      } else {\n\tcalcaddr(&base,&fc,&sign,4095,0);\n\top=0xE5100000;\n\tif(!sign)\n\t  op|=0x800000;\n        if ((ft & VT_BTYPE) == VT_BYTE)\n          op|=0x400000;\n        o(op|(intr(r)<<12)|fc|(base<<16));\n      }\n      return;\n    }\n  } else {\n    if (v == VT_CONST) {\n      op=stuff_const(0xE3A00000|(intr(r)<<12),sv->c.ul);\n      if (fr & VT_SYM || !op) {\n        o(0xE59F0000|(intr(r)<<12));\n        o(0xEA000000);\n        if(fr & VT_SYM)\n\t  greloc(cur_text_section, sv->sym, ind, R_ARM_ABS32);\n        o(sv->c.ul);\n      } else\n        o(op);\n      return;\n    } else if (v == VT_LOCAL) {\n      op=stuff_const(0xE28B0000|(intr(r)<<12),sv->c.ul);\n      if (fr & VT_SYM || !op) {\n\to(0xE59F0000|(intr(r)<<12));\n\to(0xEA000000);\n\tif(fr & VT_SYM) // needed ?\n\t  greloc(cur_text_section, sv->sym, ind, R_ARM_ABS32);\n\to(sv->c.ul);\n\to(0xE08B0000|(intr(r)<<12)|intr(r));\n      } else\n\to(op);\n      return;\n    } else if(v == VT_CMP) {\n      o(mapcc(sv->c.ul)|0x3A00001|(intr(r)<<12));\n      o(mapcc(negcc(sv->c.ul))|0x3A00000|(intr(r)<<12));\n      return;\n    } else if (v == VT_JMP || v == VT_JMPI) {\n      int t;\n      t = v & 1;\n      o(0xE3A00000|(intr(r)<<12)|t);\n      o(0xEA000000);\n      gsym(sv->c.ul);\n      o(0xE3A00000|(intr(r)<<12)|(t^1));\n      return;\n    } else if (v < VT_CONST) {\n      if(is_float(ft))\n#ifdef TCC_ARM_VFP\n        o(0xEEB00A40|(vfpr(r)<<12)|vfpr(v)|T2CPR(ft)); /* fcpyX */\n#else\n\to(0xEE008180|(fpr(r)<<12)|fpr(v));\n#endif\n      else\n\to(0xE1A00000|(intr(r)<<12)|intr(v));\n      return;\n    }\n  }\n  tcc_error(\"load unimplemented!\");\n}\n\n/* store register 'r' in lvalue 'v' */\nvoid store(int r, SValue *sv)\n{\n  SValue v1;\n  int v, ft, fc, fr, sign;\n  uint32_t op;\n\n  fr = sv->r;\n  ft = sv->type.t;\n  fc = sv->c.ul;\n\n  if(fc>=0)\n    sign=0;\n  else {\n    sign=1;\n    fc=-fc;\n  }\n  \n  v = fr & VT_VALMASK; \n  if (fr & VT_LVAL || fr == VT_LOCAL) {\n    uint32_t base = 0xb;\n    if(v < VT_CONST) {\n      base=intr(v);\n      v=VT_LOCAL;\n      fc=sign=0;\n    } else if(v == VT_CONST) {\n      v1.type.t = ft;\n      v1.r = fr&~VT_LVAL;\n      v1.c.ul = sv->c.ul;\n      v1.sym=sv->sym;\n      load(base=14, &v1);\n      fc=sign=0;\n      v=VT_LOCAL;   \n    }\n    if(v == VT_LOCAL) {\n       if(is_float(ft)) {\n\tcalcaddr(&base,&fc,&sign,1020,2);\n#ifdef TCC_ARM_VFP\n        op=0xED000A00; /* fsts */\n        if(!sign) \n          op|=0x800000; \n        if ((ft & VT_BTYPE) != VT_FLOAT) \n          op|=0x100;   /* fsts -> fstd */\n        o(op|(vfpr(r)<<12)|(fc>>2)|(base<<16));\n#else\n\top=0xED000100;\n\tif(!sign)\n\t  op|=0x800000;\n#if LDOUBLE_SIZE == 8\n\tif ((ft & VT_BTYPE) != VT_FLOAT)\n\t  op|=0x8000;\n#else\n\tif ((ft & VT_BTYPE) == VT_DOUBLE)\n\t  op|=0x8000;\n\tif ((ft & VT_BTYPE) == VT_LDOUBLE)\n\t  op|=0x400000;\n#endif\n\to(op|(fpr(r)<<12)|(fc>>2)|(base<<16));\n#endif\n\treturn;\n      } else if((ft & VT_BTYPE) == VT_SHORT) {\n\tcalcaddr(&base,&fc,&sign,255,0);\n\top=0xE14000B0;\n\tif(!sign)\n\t  op|=0x800000;\n\to(op|(intr(r)<<12)|(base<<16)|((fc&0xf0)<<4)|(fc&0xf));\n      } else {\n\tcalcaddr(&base,&fc,&sign,4095,0);\n\top=0xE5000000;\n\tif(!sign)\n\t  op|=0x800000;\n        if ((ft & VT_BTYPE) == VT_BYTE)\n          op|=0x400000;\n        o(op|(intr(r)<<12)|fc|(base<<16));\n      }\n      return;\n    }\n  }\n  tcc_error(\"store unimplemented\");\n}\n\nstatic void gadd_sp(int val)\n{\n  stuff_const_harder(0xE28DD000,val);\n}\n\n/* 'is_jmp' is '1' if it is a jump */\nstatic void gcall_or_jmp(int is_jmp)\n{\n  int r;\n  if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n    uint32_t x;\n    /* constant case */\n    x=encbranch(ind,ind+vtop->c.ul,0);\n    if(x) {\n      if (vtop->r & VT_SYM) {\n\t/* relocation case */\n\tgreloc(cur_text_section, vtop->sym, ind, R_ARM_PC24);\n      } else\n\tput_elf_reloc(symtab_section, cur_text_section, ind, R_ARM_PC24, 0);\n      o(x|(is_jmp?0xE0000000:0xE1000000));\n    } else {\n      if(!is_jmp)\n\to(0xE28FE004); // add lr,pc,#4\n      o(0xE51FF004);   // ldr pc,[pc,#-4]\n      if (vtop->r & VT_SYM)\n\tgreloc(cur_text_section, vtop->sym, ind, R_ARM_ABS32);\n      o(vtop->c.ul);\n    }\n  } else {\n    /* otherwise, indirect call */\n    r = gv(RC_INT);\n    if(!is_jmp)\n      o(0xE1A0E00F);       // mov lr,pc\n    o(0xE1A0F000|intr(r)); // mov pc,r\n  }\n}\n\n#ifdef TCC_ARM_HARDFLOAT\nstatic int is_float_hgen_aggr(CType *type)\n{\n  if ((type->t & VT_BTYPE) == VT_STRUCT) {\n    struct Sym *ref;\n    int btype, nb_fields = 0;\n\n    ref = type->ref;\n    btype = ref->type.t & VT_BTYPE;\n    if (btype == VT_FLOAT || btype == VT_DOUBLE) {\n      for(; ref && btype == (ref->type.t & VT_BTYPE); ref = ref->next, nb_fields++);\n      return !ref && nb_fields <= 4;\n    }\n  }\n  return 0;\n}\n\nstruct avail_regs {\n  /* worst case: f(float, double, 3 float struct, double, 3 float struct, double) */\n  signed char avail[3];\n  int first_hole;\n  int last_hole;\n  int first_free_reg;\n};\n\n#define AVAIL_REGS_INITIALIZER (struct avail_regs) { { 0, 0, 0}, 0, 0, 0 }\n\n/* Assign a register for a CPRC param with correct size and alignment\n * size and align are in bytes, as returned by type_size */\nint assign_fpreg(struct avail_regs *avregs, int align, int size)\n{\n  int first_reg = 0;\n\n  if (avregs->first_free_reg == -1)\n    return -1;\n  if (align >> 3) { // alignment needed (base type: double)\n    first_reg = avregs->first_free_reg;\n    if (first_reg & 1)\n      avregs->avail[avregs->last_hole++] = first_reg++;\n  } else {\n    if (size == 4 && avregs->first_hole != avregs->last_hole)\n      return avregs->avail[avregs->first_hole++];\n    else\n      first_reg = avregs->first_free_reg;\n  }\n  if (first_reg + size / 4 <= 16) {\n    avregs->first_free_reg = first_reg + size / 4;\n    return first_reg;\n  }\n  avregs->first_free_reg = -1;\n  return -1;\n}\n#endif\n\n/* Generate function call. The function address is pushed first, then\n   all the parameters in call order. This functions pops all the\n   parameters and the function address. */\nvoid gfunc_call(int nb_args)\n{\n  int size, align, r, args_size, i, ncrn, ncprn, argno, vfp_argno;\n  signed char plan[4][2]={{-1,-1},{-1,-1},{-1,-1},{-1,-1}};\n  SValue *before_stack = NULL; /* SValue before first on stack argument */\n  SValue *before_vfpreg_hfa = NULL; /* SValue before first in VFP reg hfa argument */\n#ifdef TCC_ARM_HARDFLOAT\n  struct avail_regs avregs = AVAIL_REGS_INITIALIZER;\n  signed char vfp_plan[16];\n  int plan2[4+16];\n  int variadic;\n#else\n  int plan2[4]={0,0,0,0};\n#endif\n  int vfp_todo=0;\n  int todo=0, keep;\n\n#ifdef TCC_ARM_HARDFLOAT\n  memset(vfp_plan, -1, sizeof(vfp_plan));\n  memset(plan2, 0, sizeof(plan2));\n  variadic = (vtop[-nb_args].type.ref->c == FUNC_ELLIPSIS);\n#endif\n  r = vtop->r & VT_VALMASK;\n  if (r == VT_CMP || (r & ~1) == VT_JMP)\n    gv(RC_INT);\n#ifdef TCC_ARM_EABI\n  if((vtop[-nb_args].type.ref->type.t & VT_BTYPE) == VT_STRUCT\n     && type_size(&vtop[-nb_args].type.ref->type, &align) <= 4) {\n    SValue tmp;\n    tmp=vtop[-nb_args];\n    vtop[-nb_args]=vtop[-nb_args+1];\n    vtop[-nb_args+1]=tmp;\n    --nb_args;\n  }\n  \n  vpushi(0), nb_args++;\n  vtop->type.t = VT_LLONG;\n#endif\n  ncrn = ncprn = argno = vfp_argno = args_size = 0;\n  /* Assign argument to registers and stack with alignment.\n     If, considering alignment constraints, enough registers of the correct type\n     (core or VFP) are free for the current argument, assign them to it, else\n     allocate on stack with correct alignment. Whenever a structure is allocated\n     in registers or on stack, it is always put on the stack at this stage. The\n     stack is divided in 3 zones. The zone are, from low addresses to high\n     addresses: structures to be loaded in core registers, structures to be\n     loaded in VFP registers, argument allocated to stack. SValue's representing\n     structures in the first zone are moved just after the SValue pointed by\n     before_vfpreg_hfa. SValue's representing structures in the second zone are\n     moved just after the SValue pointer by before_stack. */\n  for(i = nb_args; i-- ;) {\n    int j, assigned_vfpreg = 0;\n    size = type_size(&vtop[-i].type, &align);\n    switch(vtop[-i].type.t & VT_BTYPE) {\n      case VT_STRUCT:\n      case VT_FLOAT:\n      case VT_DOUBLE:\n      case VT_LDOUBLE:\n#ifdef TCC_ARM_HARDFLOAT\n      if (!variadic) {\n        int hfa = 0; /* Homogeneous float aggregate */\n\n        if (is_float(vtop[-i].type.t)\n            || (hfa = is_float_hgen_aggr(&vtop[-i].type))) {\n          int end_reg;\n\n          assigned_vfpreg = assign_fpreg(&avregs, align, size);\n          end_reg = assigned_vfpreg + (size - 1) / 4;\n          if (assigned_vfpreg >= 0) {\n            vfp_plan[vfp_argno++]=TREG_F0 + assigned_vfpreg/2;\n            if (hfa) {\n              /* before_stack can only have been set because all core registers\n                 are assigned, so no need to care about before_vfpreg_hfa if\n                 before_stack is set */\n              if (before_stack) {\n\t        vrote(&vtop[-i], &vtop[-i] - before_stack);\n                before_stack++;\n              } else if (!before_vfpreg_hfa)\n                before_vfpreg_hfa = &vtop[-i-1];\n              for (j = assigned_vfpreg; j <= end_reg; j++)\n                vfp_todo|=(1<<j);\n            }\n            continue;\n          } else {\n            if (!hfa)\n              vfp_argno++;\n            /* No need to update before_stack as no more hfa can be allocated in\n               VFP regs */\n            if (!before_vfpreg_hfa)\n              before_vfpreg_hfa = &vtop[-i-1];\n            break;\n          }\n        }\n      }\n#endif\n      ncrn = (ncrn + (align-1)/4) & -(align/4);\n      size = (size + 3) & -4;\n      if (ncrn + size/4 <= 4 || (ncrn < 4 && assigned_vfpreg != -1)) {\n        /* Either there is HFA in VFP registers, or there is arguments on stack,\n           it cannot be both. Hence either before_stack already points after\n           the slot where the vtop[-i] SValue is moved, or before_stack will not\n           be used */\n        if (before_vfpreg_hfa) {\n\t  vrote(&vtop[-i], &vtop[-i] - before_vfpreg_hfa);\n          before_vfpreg_hfa++;\n        }\n        for (j = ncrn; j < 4 && j < ncrn + size / 4; j++)\n          todo|=(1<<j);\n        ncrn+=size/4;\n        if (ncrn > 4) {\n          args_size = (ncrn - 4) * 4;\n          if (!before_stack)\n            before_stack = &vtop[-i-1];\n        }\n      }\n      else {\n        ncrn = 4;\n        /* No need to set before_vfpreg_hfa if not set since there will no\n           longer be any structure assigned to core registers */\n        if (!before_stack)\n          before_stack = &vtop[-i-1];\n        break;\n      }\n      continue;\n      default:\n#ifdef TCC_ARM_EABI\n      if (!i) {\n        break;\n      }\n#endif\n      if (ncrn < 4) {\n        int is_long = (vtop[-i].type.t & VT_BTYPE) == VT_LLONG;\n\n        if (is_long) {\n          ncrn = (ncrn + 1) & -2;\n          if (ncrn == 4) {\n            argno++;\n            break;\n          }\n        }\n        plan[argno++][0]=ncrn++;\n        if (is_long) {\n          plan[argno-1][1]=ncrn++;\n        }\n        continue;\n      }\n      argno++;\n    }\n#ifdef TCC_ARM_EABI\n    if(args_size & (align-1)) {\n      vpushi(0);\n      vtop->type.t = VT_VOID; /* padding */\n      vrott(i+2);\n      args_size += 4;\n      nb_args++;\n      argno++;\n    }\n#endif\n    args_size += (size + 3) & -4;\n  }\n#ifdef TCC_ARM_EABI\n  vtop--, nb_args--;\n#endif\n  args_size = keep = 0;\n  for(i = 0;i < nb_args; i++) {\n    vrotb(keep+1);\n    if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {\n      size = type_size(&vtop->type, &align);\n      /* align to stack align size */\n      size = (size + 3) & -4;\n      /* allocate the necessary size on stack */\n      gadd_sp(-size);\n      /* generate structure store */\n      r = get_reg(RC_INT);\n      o(0xE1A0000D|(intr(r)<<12));\n      vset(&vtop->type, r | VT_LVAL, 0);\n      vswap();\n      vstore();\n      vtop--;\n      args_size += size;\n    } else if (is_float(vtop->type.t)) {\n#ifdef TCC_ARM_HARDFLOAT\n      if (!variadic && --vfp_argno<16 && vfp_plan[vfp_argno]!=-1) {\n        plan2[keep++]=vfp_plan[vfp_argno];\n        continue;\n      }\n#endif\n#ifdef TCC_ARM_VFP\n      r=vfpr(gv(RC_FLOAT))<<12;\n      size=4;\n      if ((vtop->type.t & VT_BTYPE) != VT_FLOAT)\n      {\n        size=8;\n        r|=0x101; /* fstms -> fstmd */\n      }\n      o(0xED2D0A01+r);\n#else\n      r=fpr(gv(RC_FLOAT))<<12;\n      if ((vtop->type.t & VT_BTYPE) == VT_FLOAT)\n        size = 4;\n      else if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE)\n        size = 8;\n      else\n        size = LDOUBLE_SIZE;\n      \n      if (size == 12)\n\tr|=0x400000;\n      else if(size == 8)\n\tr|=0x8000;\n\n      o(0xED2D0100|r|(size>>2));\n#endif\n      vtop--;\n      args_size += size;\n    } else {\n      int s;\n      /* simple type (currently always same size) */\n      /* XXX: implicit cast ? */\n      size=4;\n      if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {\n\tlexpand_nr();\n\ts=-1;\n\tif(--argno<4 && plan[argno][1]!=-1)\n\t  s=plan[argno][1];\n\targno++;\n\tsize = 8;\n\tif(s==-1) {\n\t  r = gv(RC_INT);\n\t  o(0xE52D0004|(intr(r)<<12)); /* str r,[sp,#-4]! */\n\t  vtop--;\n\t} else {\n\t  size=0;\n\t  plan2[keep]=s;\n\t  keep++;\n          vswap();\n\t}\n      }\n      s=-1;\n      if(--argno<4 && plan[argno][0]!=-1)\n        s=plan[argno][0];\n#ifdef TCC_ARM_EABI\n      if(vtop->type.t == VT_VOID) {\n        if(s == -1)\n          o(0xE24DD004); /* sub sp,sp,#4 */\n        vtop--;\n      } else\n#endif\n      if(s == -1) {\n\tr = gv(RC_INT);\n\to(0xE52D0004|(intr(r)<<12)); /* str r,[sp,#-4]! */\n\tvtop--;\n      } else {\n        size=0;\n\tplan2[keep]=s;\n\tkeep++;\n      }\n      args_size += size;\n    }\n  }\n  for(i = 0; i < keep; i++) {\n    vrotb(keep);\n    gv(regmask(plan2[i]));\n#ifdef TCC_ARM_HARDFLOAT\n    /* arg is in s(2d+1): plan2[i]<plan2[i+1] => alignment occured (ex f,d,f) */\n    if (i < keep - 1 && is_float(vtop->type.t) && (plan2[i] <= plan2[i + 1])) {\n      o(0xEEF00A40|(vfpr(plan2[i])<<12)|vfpr(plan2[i]));\n    }\n#endif\n  }\nsave_regs(keep); /* save used temporary registers */\n  keep++;\n  if(ncrn) {\n    int nb_regs=0;\n    if (ncrn>4)\n      ncrn=4;\n    todo&=((1<<ncrn)-1);\n    if(todo) {\n      int i;\n      o(0xE8BD0000|todo);\n      for(i=0;i<4;i++)\n\tif(todo&(1<<i)) {\n\t  vpushi(0);\n\t  vtop->r=i;\n\t  keep++;\n\t  nb_regs++;\n\t}\n    }\n    args_size-=nb_regs*4;\n  }\n  if(vfp_todo) {\n    int nb_fregs=0;\n\n    for(i=0;i<16;i++)\n      if(vfp_todo&(1<<i)) {\n        o(0xED9D0A00|(i&1)<<22|(i>>1)<<12|nb_fregs);\n        vpushi(0);\n        /* There might be 2 floats in a double VFP reg but that doesn't seem\n           to matter */\n        if (!(i%2))\n          vtop->r=TREG_F0+i/2;\n        keep++;\n        nb_fregs++;\n      }\n    if (nb_fregs) {\n      gadd_sp(nb_fregs*4);\n      args_size-=nb_fregs*4;\n    }\n  }\n  vrotb(keep);\n  gcall_or_jmp(0);\n  if (args_size)\n      gadd_sp(args_size);\n#ifdef TCC_ARM_EABI\n  if((vtop->type.ref->type.t & VT_BTYPE) == VT_STRUCT\n     && type_size(&vtop->type.ref->type, &align) <= 4)\n  {\n    store(REG_IRET,vtop-keep);\n    ++keep;\n  }\n#ifdef TCC_ARM_VFP\n#ifdef TCC_ARM_HARDFLOAT\n  else if(variadic && is_float(vtop->type.ref->type.t)) {\n#else\n  else if(is_float(vtop->type.ref->type.t)) {\n#endif\n    if((vtop->type.ref->type.t & VT_BTYPE) == VT_FLOAT) {\n      o(0xEE000A10); /* fmsr s0,r0 */\n    } else {\n      o(0xEE000B10); /* fmdlr d0,r0 */\n      o(0xEE201B10); /* fmdhr d0,r1 */\n    }\n  }\n#endif\n#endif\n  vtop-=keep;\n  leaffunc = 0;\n}\n\n/* generate function prolog of type 't' */\nvoid gfunc_prolog(CType *func_type)\n{\n  Sym *sym,*sym2;\n  int n,nf,size,align, variadic, struct_ret = 0;\n#ifdef TCC_ARM_HARDFLOAT\n  struct avail_regs avregs = AVAIL_REGS_INITIALIZER;\n#endif\n\n  sym = func_type->ref;\n  func_vt = sym->type;\n\n  n = nf = 0;\n  variadic = (func_type->ref->c == FUNC_ELLIPSIS);\n  if((func_vt.t & VT_BTYPE) == VT_STRUCT\n     && type_size(&func_vt,&align) > 4)\n  {\n    n++;\n    struct_ret = 1;\n    func_vc = 12; /* Offset from fp of the place to store the result */\n  }\n  for(sym2=sym->next;sym2 && (n<4 || nf<16);sym2=sym2->next) {\n    size = type_size(&sym2->type, &align);\n#ifdef TCC_ARM_HARDFLOAT\n    if (!variadic && (is_float(sym2->type.t)\n        || is_float_hgen_aggr(&sym2->type))) {\n      int tmpnf = assign_fpreg(&avregs, align, size) + 1;\n      nf = (tmpnf > nf) ? tmpnf : nf;\n    } else\n#endif\n    if (n < 4)\n      n += (size + 3) / 4;\n  }\n  o(0xE1A0C00D); /* mov ip,sp */\n  if(variadic)\n    n=4;\n  if(n) {\n    if(n>4)\n      n=4;\n#ifdef TCC_ARM_EABI\n    n=(n+1)&-2;\n#endif\n    o(0xE92D0000|((1<<n)-1)); /* save r0-r4 on stack if needed */\n  }\n  if (nf) {\n    if (nf>16)\n      nf=16;\n    nf=(nf+1)&-2; /* nf => HARDFLOAT => EABI */\n    o(0xED2D0A00|nf); /* save s0-s15 on stack if needed */\n  }\n  o(0xE92D5800); /* save fp, ip, lr */\n  o(0xE1A0B00D); /* mov fp, sp */\n  func_sub_sp_offset = ind;\n  o(0xE1A00000); /* nop, leave space for stack adjustment in epilogue */\n  {\n    int addr, pn = struct_ret, sn = 0; /* pn=core, sn=stack */\n\n#ifdef TCC_ARM_HARDFLOAT\n    avregs = AVAIL_REGS_INITIALIZER;\n#endif\n    while ((sym = sym->next)) {\n      CType *type;\n      type = &sym->type;\n      size = type_size(type, &align);\n      size = (size + 3) >> 2;\n      align = (align + 3) & ~3;\n#ifdef TCC_ARM_HARDFLOAT\n      if (!variadic && (is_float(sym->type.t)\n          || is_float_hgen_aggr(&sym->type))) {\n        int fpn = assign_fpreg(&avregs, align, size << 2);\n        if (fpn >= 0) {\n          addr = fpn * 4;\n        } else\n          goto from_stack;\n      } else\n#endif\n      if (pn < 4) {\n#ifdef TCC_ARM_EABI\n        pn = (pn + (align-1)/4) & -(align/4);\n#endif\n        addr = (nf + pn) * 4;\n        pn += size;\n        if (!sn && pn > 4)\n          sn = (pn - 4);\n      } else {\n#ifdef TCC_ARM_HARDFLOAT\nfrom_stack:\n#endif\n#ifdef TCC_ARM_EABI\n        sn = (sn + (align-1)/4) & -(align/4);\n#endif\n        addr = (n + nf + sn) * 4;\n        sn += size;\n      }\n      sym_push(sym->v & ~SYM_FIELD, type, VT_LOCAL | lvalue_type(type->t), addr+12);\n    }\n  }\n  last_itod_magic=0;\n  leaffunc = 1;\n  loc = 0;\n}\n\n/* generate function epilog */\nvoid gfunc_epilog(void)\n{\n  uint32_t x;\n  int diff;\n#ifdef TCC_ARM_EABI\n  /* Useless but harmless copy of the float result into main register(s) in case\n     of variadic function in the hardfloat variant */\n  if(is_float(func_vt.t)) {\n    if((func_vt.t & VT_BTYPE) == VT_FLOAT)\n      o(0xEE100A10); /* fmrs r0, s0 */\n    else {\n      o(0xEE100B10); /* fmrdl r0, d0 */\n      o(0xEE301B10); /* fmrdh r1, d0 */\n    }\n  }\n#endif\n  o(0xE89BA800); /* restore fp, sp, pc */\n  diff = (-loc + 3) & -4;\n#ifdef TCC_ARM_EABI\n  if(!leaffunc)\n    diff = ((diff + 11) & -8) - 4;\n#endif\n  if(diff > 0) {\n    x=stuff_const(0xE24BD000, diff); /* sub sp,fp,# */\n    if(x)\n      *(uint32_t *)(cur_text_section->data + func_sub_sp_offset) = x;\n    else {\n      int addr;\n      addr=ind;\n      o(0xE59FC004); /* ldr ip,[pc+4] */\n      o(0xE04BD00C); /* sub sp,fp,ip  */\n      o(0xE1A0F00E); /* mov pc,lr */\n      o(diff);\n      *(uint32_t *)(cur_text_section->data + func_sub_sp_offset) = 0xE1000000|encbranch(func_sub_sp_offset,addr,1);\n    }\n  }\n}\n\n/* generate a jump to a label */\nint gjmp(int t)\n{\n  int r;\n  r=ind;\n  o(0xE0000000|encbranch(r,t,1));\n  return r;\n}\n\n/* generate a jump to a fixed address */\nvoid gjmp_addr(int a)\n{\n  gjmp(a);\n}\n\n/* generate a test. set 'inv' to invert test. Stack entry is popped */\nint gtst(int inv, int t)\n{\n  int v, r;\n  uint32_t op;\n  v = vtop->r & VT_VALMASK;\n  r=ind;\n  if (v == VT_CMP) {\n    op=mapcc(inv?negcc(vtop->c.i):vtop->c.i);\n    op|=encbranch(r,t,1);\n    o(op);\n    t=r;\n  } else if (v == VT_JMP || v == VT_JMPI) {\n    if ((v & 1) == inv) {\n      if(!vtop->c.i)\n\tvtop->c.i=t;\n      else {\n\tuint32_t *x;\n\tint p,lp;\n\tif(t) {\n          p = vtop->c.i;\n          do {\n\t    p = decbranch(lp=p);\n          } while(p);\n\t  x = (uint32_t *)(cur_text_section->data + lp);\n\t  *x &= 0xff000000;\n\t  *x |= encbranch(lp,t,1);\n\t}\n\tt = vtop->c.i;\n      }\n    } else {\n      t = gjmp(t);\n      gsym(vtop->c.i);\n    }\n  } else {\n    if (is_float(vtop->type.t)) {\n      r=gv(RC_FLOAT);\n#ifdef TCC_ARM_VFP\n      o(0xEEB50A40|(vfpr(r)<<12)|T2CPR(vtop->type.t)); /* fcmpzX */\n      o(0xEEF1FA10); /* fmstat */\n#else\n      o(0xEE90F118|(fpr(r)<<16));\n#endif\n      vtop->r = VT_CMP;\n      vtop->c.i = TOK_NE;\n      return gtst(inv, t);\n    } else if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n      /* constant jmp optimization */\n      if ((vtop->c.i != 0) != inv) \n\tt = gjmp(t);\n    } else {\n      v = gv(RC_INT);\n      o(0xE3300000|(intr(v)<<16));\n      vtop->r = VT_CMP;\n      vtop->c.i = TOK_NE;\n      return gtst(inv, t);\n    }   \n  }\n  vtop--;\n  return t;\n}\n\n/* generate an integer binary operation */\nvoid gen_opi(int op)\n{\n  int c, func = 0;\n  uint32_t opc = 0, r, fr;\n  unsigned short retreg = REG_IRET;\n\n  c=0;\n  switch(op) {\n    case '+':\n      opc = 0x8;\n      c=1;\n      break;\n    case TOK_ADDC1: /* add with carry generation */\n      opc = 0x9;\n      c=1;\n      break;\n    case '-':\n      opc = 0x4;\n      c=1;\n      break;\n    case TOK_SUBC1: /* sub with carry generation */\n      opc = 0x5;\n      c=1;\n      break;\n    case TOK_ADDC2: /* add with carry use */\n      opc = 0xA;\n      c=1;\n      break;\n    case TOK_SUBC2: /* sub with carry use */\n      opc = 0xC;\n      c=1;\n      break;\n    case '&':\n      opc = 0x0;\n      c=1;\n      break;\n    case '^':\n      opc = 0x2;\n      c=1;\n      break;\n    case '|':\n      opc = 0x18;\n      c=1;\n      break;\n    case '*':\n      gv2(RC_INT, RC_INT);\n      r = vtop[-1].r;\n      fr = vtop[0].r;\n      vtop--;\n      o(0xE0000090|(intr(r)<<16)|(intr(r)<<8)|intr(fr));\n      return;\n    case TOK_SHL:\n      opc = 0;\n      c=2;\n      break;\n    case TOK_SHR:\n      opc = 1;\n      c=2;\n      break;\n    case TOK_SAR:\n      opc = 2;\n      c=2;\n      break;\n    case '/':\n    case TOK_PDIV:\n      func=TOK___divsi3;\n      c=3;\n      break;\n    case TOK_UDIV:\n      func=TOK___udivsi3;\n      c=3;\n      break;\n    case '%':\n#ifdef TCC_ARM_EABI\n      func=TOK___aeabi_idivmod;\n      retreg=REG_LRET;\n#else\n      func=TOK___modsi3;\n#endif\n      c=3;\n      break;\n    case TOK_UMOD:\n#ifdef TCC_ARM_EABI\n      func=TOK___aeabi_uidivmod;\n      retreg=REG_LRET;\n#else\n      func=TOK___umodsi3;\n#endif\n      c=3;\n      break;\n    case TOK_UMULL:\n      gv2(RC_INT, RC_INT);\n      r=intr(vtop[-1].r2=get_reg(RC_INT));\n      c=vtop[-1].r;\n      vtop[-1].r=get_reg_ex(RC_INT,regmask(c));\n      vtop--;\n      o(0xE0800090|(r<<16)|(intr(vtop->r)<<12)|(intr(c)<<8)|intr(vtop[1].r));\n      return;\n    default:\n      opc = 0x15;\n      c=1;\n      break;\n  }\n  switch(c) {\n    case 1:\n      if((vtop[-1].r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n\tif(opc == 4 || opc == 5 || opc == 0xc) {\n\t  vswap();\n\t  opc|=2; // sub -> rsb\n\t}\n      }\n      if ((vtop->r & VT_VALMASK) == VT_CMP ||\n          (vtop->r & (VT_VALMASK & ~1)) == VT_JMP)\n        gv(RC_INT);\n      vswap();\n      c=intr(gv(RC_INT));\n      vswap();\n      opc=0xE0000000|(opc<<20)|(c<<16);\n      if((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n\tuint32_t x;\n\tx=stuff_const(opc|0x2000000,vtop->c.i);\n\tif(x) {\n\t  r=intr(vtop[-1].r=get_reg_ex(RC_INT,regmask(vtop[-1].r)));\n\t  o(x|(r<<12));\n\t  goto done;\n\t}\n      }\n      fr=intr(gv(RC_INT));\n      r=intr(vtop[-1].r=get_reg_ex(RC_INT,two2mask(vtop->r,vtop[-1].r)));\n      o(opc|(r<<12)|fr);\ndone:\n      vtop--;\n      if (op >= TOK_ULT && op <= TOK_GT) {\n        vtop->r = VT_CMP;\n        vtop->c.i = op;\n      }\n      break;\n    case 2:\n      opc=0xE1A00000|(opc<<5);\n      if ((vtop->r & VT_VALMASK) == VT_CMP ||\n          (vtop->r & (VT_VALMASK & ~1)) == VT_JMP)\n        gv(RC_INT);\n      vswap();\n      r=intr(gv(RC_INT));\n      vswap();\n      opc|=r;\n      if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n\tfr=intr(vtop[-1].r=get_reg_ex(RC_INT,regmask(vtop[-1].r)));\n\tc = vtop->c.i & 0x1f;\n\to(opc|(c<<7)|(fr<<12));\n      } else {\n        fr=intr(gv(RC_INT));\n\tc=intr(vtop[-1].r=get_reg_ex(RC_INT,two2mask(vtop->r,vtop[-1].r)));\n\to(opc|(c<<12)|(fr<<8)|0x10);\n      }\n      vtop--;\n      break;\n    case 3:\n      vpush_global_sym(&func_old_type, func);\n      vrott(3);\n      gfunc_call(2);\n      vpushi(0);\n      vtop->r = retreg;\n      break;\n    default:\n      tcc_error(\"gen_opi %i unimplemented!\",op);\n  }\n}\n\n#ifdef TCC_ARM_VFP\nstatic int is_zero(int i)\n{\n  if((vtop[i].r & (VT_VALMASK | VT_LVAL | VT_SYM)) != VT_CONST)\n    return 0;\n  if (vtop[i].type.t == VT_FLOAT)\n    return (vtop[i].c.f == 0.f);\n  else if (vtop[i].type.t == VT_DOUBLE)\n    return (vtop[i].c.d == 0.0);\n  return (vtop[i].c.ld == 0.l);\n}\n\n/* generate a floating point operation 'v = t1 op t2' instruction. The\n *    two operands are guaranted to have the same floating point type */\nvoid gen_opf(int op)\n{\n  uint32_t x;\n  int fneg=0,r;\n  x=0xEE000A00|T2CPR(vtop->type.t);\n  switch(op) {\n    case '+':\n      if(is_zero(-1))\n        vswap();\n      if(is_zero(0)) {\n        vtop--;\n        return;\n      }\n      x|=0x300000;\n      break;\n    case '-':\n      x|=0x300040;\n      if(is_zero(0)) {\n        vtop--;\n        return;\n      }\n      if(is_zero(-1)) {\n        x|=0x810000; /* fsubX -> fnegX */\n        vswap();\n        vtop--;\n        fneg=1;\n      }\n      break;\n    case '*':\n      x|=0x200000;\n      break;\n    case '/':\n      x|=0x800000;\n      break;\n    default:\n      if(op < TOK_ULT || op > TOK_GT) {\n        tcc_error(\"unknown fp op %x!\",op);\n        return;\n      }\n      if(is_zero(-1)) {\n        vswap();\n        switch(op) {\n          case TOK_LT: op=TOK_GT; break;\n          case TOK_GE: op=TOK_ULE; break;\n          case TOK_LE: op=TOK_GE; break;\n          case TOK_GT: op=TOK_ULT; break;\n        }\n      }\n      x|=0xB40040; /* fcmpX */\n      if(op!=TOK_EQ && op!=TOK_NE)\n        x|=0x80; /* fcmpX -> fcmpeX */\n      if(is_zero(0)) {\n        vtop--;\n        o(x|0x10000|(vfpr(gv(RC_FLOAT))<<12)); /* fcmp(e)X -> fcmp(e)zX */\n      } else {\n        x|=vfpr(gv(RC_FLOAT));\n        vswap();\n        o(x|(vfpr(gv(RC_FLOAT))<<12));\n        vtop--;\n      }\n      o(0xEEF1FA10); /* fmstat */\n\n      switch(op) {\n        case TOK_LE: op=TOK_ULE; break;\n        case TOK_LT: op=TOK_ULT; break;\n        case TOK_UGE: op=TOK_GE; break;\n        case TOK_UGT: op=TOK_GT; break;\n      }\n      \n      vtop->r = VT_CMP;\n      vtop->c.i = op;\n      return;\n  }\n  r=gv(RC_FLOAT);\n  x|=vfpr(r);\n  r=regmask(r);\n  if(!fneg) {\n    int r2;\n    vswap();\n    r2=gv(RC_FLOAT);\n    x|=vfpr(r2)<<16;\n    r|=regmask(r2);\n  }\n  vtop->r=get_reg_ex(RC_FLOAT,r);\n  if(!fneg)\n    vtop--;\n  o(x|(vfpr(vtop->r)<<12));\n}\n\n#else\nstatic uint32_t is_fconst()\n{\n  long double f;\n  uint32_t r;\n  if((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) != VT_CONST)\n    return 0;\n  if (vtop->type.t == VT_FLOAT)\n    f = vtop->c.f;\n  else if (vtop->type.t == VT_DOUBLE)\n    f = vtop->c.d;\n  else\n    f = vtop->c.ld;\n  if(!ieee_finite(f))\n    return 0;\n  r=0x8;\n  if(f<0.0) {\n    r=0x18;\n    f=-f;\n  }\n  if(f==0.0)\n    return r;\n  if(f==1.0)\n    return r|1;\n  if(f==2.0)\n    return r|2;\n  if(f==3.0)\n    return r|3;\n  if(f==4.0)\n    return r|4;\n  if(f==5.0)\n    return r|5;\n  if(f==0.5)\n    return r|6;\n  if(f==10.0)\n    return r|7;\n  return 0;\n}\n\n/* generate a floating point operation 'v = t1 op t2' instruction. The\n   two operands are guaranted to have the same floating point type */\nvoid gen_opf(int op)\n{\n  uint32_t x, r, r2, c1, c2;\n  //fputs(\"gen_opf\\n\",stderr);\n  vswap();\n  c1 = is_fconst();\n  vswap();\n  c2 = is_fconst();\n  x=0xEE000100;\n#if LDOUBLE_SIZE == 8\n  if ((vtop->type.t & VT_BTYPE) != VT_FLOAT)\n    x|=0x80;\n#else\n  if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE)\n    x|=0x80;\n  else if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE)\n    x|=0x80000;\n#endif\n  switch(op)\n  {\n    case '+':\n      if(!c2) {\n\tvswap();\n\tc2=c1;\n      }\n      vswap();\n      r=fpr(gv(RC_FLOAT));\n      vswap();\n      if(c2) {\n\tif(c2>0xf)\n\t  x|=0x200000; // suf\n\tr2=c2&0xf;\n      } else {\n\tr2=fpr(gv(RC_FLOAT));\n      }\n      break;\n    case '-':\n      if(c2) {\n\tif(c2<=0xf)\n\t  x|=0x200000; // suf\n\tr2=c2&0xf;\n\tvswap();\n\tr=fpr(gv(RC_FLOAT));\n\tvswap();\n      } else if(c1 && c1<=0xf) {\n\tx|=0x300000; // rsf\n\tr2=c1;\n\tr=fpr(gv(RC_FLOAT));\n\tvswap();\n      } else {\n\tx|=0x200000; // suf\n\tvswap();\n\tr=fpr(gv(RC_FLOAT));\n\tvswap();\n\tr2=fpr(gv(RC_FLOAT));\n      }\n      break;\n    case '*':\n      if(!c2 || c2>0xf) {\n\tvswap();\n\tc2=c1;\n      }\n      vswap();\n      r=fpr(gv(RC_FLOAT));\n      vswap();\n      if(c2 && c2<=0xf)\n\tr2=c2;\n      else\n\tr2=fpr(gv(RC_FLOAT));\n      x|=0x100000; // muf\n      break;\n    case '/':\n      if(c2 && c2<=0xf) {\n\tx|=0x400000; // dvf\n\tr2=c2;\n\tvswap();\n\tr=fpr(gv(RC_FLOAT));\n\tvswap();\n      } else if(c1 && c1<=0xf) {\n\tx|=0x500000; // rdf\n\tr2=c1;\n\tr=fpr(gv(RC_FLOAT));\n\tvswap();\n      } else {\n\tx|=0x400000; // dvf\n\tvswap();\n\tr=fpr(gv(RC_FLOAT));\n\tvswap();\n\tr2=fpr(gv(RC_FLOAT));\n      }     \n      break;\n    default:\n      if(op >= TOK_ULT && op <= TOK_GT) {\n\tx|=0xd0f110; // cmfe\n/* bug (intention?) in Linux FPU emulator\n   doesn't set carry if equal */\n\tswitch(op) {\n\t  case TOK_ULT:\n\t  case TOK_UGE:\n\t  case TOK_ULE:\n\t  case TOK_UGT:\n            tcc_error(\"unsigned comparision on floats?\");\n\t    break;\n\t  case TOK_LT:\n            op=TOK_Nset;\n\t    break;\n\t  case TOK_LE:\n            op=TOK_ULE; /* correct in unordered case only if AC bit in FPSR set */\n\t    break;\n\t  case TOK_EQ:\n\t  case TOK_NE:\n\t    x&=~0x400000; // cmfe -> cmf\n\t    break;\n\t}\n\tif(c1 && !c2) {\n\t  c2=c1;\n\t  vswap();\n\t  switch(op) {\n            case TOK_Nset:\n              op=TOK_GT;\n\t      break;\n            case TOK_GE:\n\t      op=TOK_ULE;\n\t      break;\n\t    case TOK_ULE:\n              op=TOK_GE;\n\t      break;\n            case TOK_GT:\n              op=TOK_Nset;\n\t      break;\n\t  }\n\t}\n\tvswap();\n\tr=fpr(gv(RC_FLOAT));\n\tvswap();\n\tif(c2) {\n\t  if(c2>0xf)\n\t    x|=0x200000;\n\t  r2=c2&0xf;\n\t} else {\n\t  r2=fpr(gv(RC_FLOAT));\n\t}\n\tvtop[-1].r = VT_CMP;\n\tvtop[-1].c.i = op;\n      } else {\n        tcc_error(\"unknown fp op %x!\",op);\n\treturn;\n      }\n  }\n  if(vtop[-1].r == VT_CMP)\n    c1=15;\n  else {\n    c1=vtop->r;\n    if(r2&0x8)\n      c1=vtop[-1].r;\n    vtop[-1].r=get_reg_ex(RC_FLOAT,two2mask(vtop[-1].r,c1));\n    c1=fpr(vtop[-1].r);\n  }\n  vtop--;\n  o(x|(r<<16)|(c1<<12)|r2);\n}\n#endif\n\n/* convert integers to fp 't' type. Must handle 'int', 'unsigned int'\n   and 'long long' cases. */\nST_FUNC void gen_cvt_itof1(int t)\n{\n  uint32_t r, r2;\n  int bt;\n  bt=vtop->type.t & VT_BTYPE;\n  if(bt == VT_INT || bt == VT_SHORT || bt == VT_BYTE) {\n#ifndef TCC_ARM_VFP\n    uint32_t dsize = 0;\n#endif\n    r=intr(gv(RC_INT));\n#ifdef TCC_ARM_VFP\n    r2=vfpr(vtop->r=get_reg(RC_FLOAT));\n    o(0xEE000A10|(r<<12)|(r2<<16)); /* fmsr */\n    r2|=r2<<12;\n    if(!(vtop->type.t & VT_UNSIGNED))\n      r2|=0x80;                /* fuitoX -> fsituX */\n    o(0xEEB80A40|r2|T2CPR(t)); /* fYitoX*/\n#else\n    r2=fpr(vtop->r=get_reg(RC_FLOAT));\n    if((t & VT_BTYPE) != VT_FLOAT)\n      dsize=0x80;    /* flts -> fltd */\n    o(0xEE000110|dsize|(r2<<16)|(r<<12)); /* flts */\n    if((vtop->type.t & (VT_UNSIGNED|VT_BTYPE)) == (VT_UNSIGNED|VT_INT)) {\n      uint32_t off = 0;\n      o(0xE3500000|(r<<12));        /* cmp */\n      r=fpr(get_reg(RC_FLOAT));\n      if(last_itod_magic) {\n\toff=ind+8-last_itod_magic;\n\toff/=4;\n\tif(off>255)\n\t  off=0;\n      }\n      o(0xBD1F0100|(r<<12)|off);    /* ldflts */\n      if(!off) {\n        o(0xEA000000);              /* b */\n        last_itod_magic=ind;\n        o(0x4F800000);              /* 4294967296.0f */\n      }\n      o(0xBE000100|dsize|(r2<<16)|(r2<<12)|r); /* adflt */\n    }\n#endif\n    return;\n  } else if(bt == VT_LLONG) {\n    int func;\n    CType *func_type = 0;\n    if((t & VT_BTYPE) == VT_FLOAT) {\n      func_type = &func_float_type;\n      if(vtop->type.t & VT_UNSIGNED)\n        func=TOK___floatundisf;\n      else\n        func=TOK___floatdisf;\n#if LDOUBLE_SIZE != 8\n    } else if((t & VT_BTYPE) == VT_LDOUBLE) {\n      func_type = &func_ldouble_type;\n      if(vtop->type.t & VT_UNSIGNED)\n        func=TOK___floatundixf;\n      else\n        func=TOK___floatdixf;\n    } else if((t & VT_BTYPE) == VT_DOUBLE) {\n#else\n    } else if((t & VT_BTYPE) == VT_DOUBLE || (t & VT_BTYPE) == VT_LDOUBLE) {\n#endif\n      func_type = &func_double_type;\n      if(vtop->type.t & VT_UNSIGNED)\n        func=TOK___floatundidf;\n      else\n        func=TOK___floatdidf;\n    }\n    if(func_type) {\n      vpush_global_sym(func_type, func);\n      vswap();\n      gfunc_call(1);\n      vpushi(0);\n      vtop->r=TREG_F0;\n      return;\n    }\n  }\n  tcc_error(\"unimplemented gen_cvt_itof %x!\",vtop->type.t);\n}\n\n/* convert fp to int 't' type */\nvoid gen_cvt_ftoi(int t)\n{\n  uint32_t r, r2;\n  int u, func = 0;\n  u=t&VT_UNSIGNED;\n  t&=VT_BTYPE;\n  r2=vtop->type.t & VT_BTYPE;\n  if(t==VT_INT) {\n#ifdef TCC_ARM_VFP\n    r=vfpr(gv(RC_FLOAT));\n    u=u?0:0x10000;\n    o(0xEEBC0AC0|(r<<12)|r|T2CPR(r2)|u); /* ftoXizY */\n    r2=intr(vtop->r=get_reg(RC_INT));\n    o(0xEE100A10|(r<<16)|(r2<<12));\n    return;\n#else\n    if(u) {\n      if(r2 == VT_FLOAT)\n        func=TOK___fixunssfsi;\n#if LDOUBLE_SIZE != 8\n      else if(r2 == VT_LDOUBLE)\n\tfunc=TOK___fixunsxfsi;\n      else if(r2 == VT_DOUBLE)\n#else\n      else if(r2 == VT_LDOUBLE || r2 == VT_DOUBLE)\n#endif\n\tfunc=TOK___fixunsdfsi;\n    } else {\n      r=fpr(gv(RC_FLOAT));\n      r2=intr(vtop->r=get_reg(RC_INT));\n      o(0xEE100170|(r2<<12)|r);\n      return;\n    }\n#endif\n  } else if(t == VT_LLONG) { // unsigned handled in gen_cvt_ftoi1\n    if(r2 == VT_FLOAT)\n      func=TOK___fixsfdi;\n#if LDOUBLE_SIZE != 8\n    else if(r2 == VT_LDOUBLE)\n      func=TOK___fixxfdi;\n    else if(r2 == VT_DOUBLE)\n#else\n    else if(r2 == VT_LDOUBLE || r2 == VT_DOUBLE)\n#endif\n      func=TOK___fixdfdi;\n  }\n  if(func) {\n    vpush_global_sym(&func_old_type, func);\n    vswap();\n    gfunc_call(1);\n    vpushi(0);\n    if(t == VT_LLONG)\n      vtop->r2 = REG_LRET;\n    vtop->r = REG_IRET;\n    return;\n  }\n  tcc_error(\"unimplemented gen_cvt_ftoi!\");\n}\n\n/* convert from one floating point type to another */\nvoid gen_cvt_ftof(int t)\n{\n#ifdef TCC_ARM_VFP\n  if(((vtop->type.t & VT_BTYPE) == VT_FLOAT) != ((t & VT_BTYPE) == VT_FLOAT)) {\n    uint32_t r = vfpr(gv(RC_FLOAT));\n    o(0xEEB70AC0|(r<<12)|r|T2CPR(vtop->type.t));\n  }\n#else\n  /* all we have to do on i386 and FPA ARM is to put the float in a register */\n  gv(RC_FLOAT);\n#endif\n}\n\n/* computed goto support */\nvoid ggoto(void)\n{\n  gcall_or_jmp(1);\n  vtop--;\n}\n\n/* end of ARM code generator */\n/*************************************************************/\n#endif\n/*************************************************************/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/c67-gen.c",
    "content": "/*\n *  TMS320C67xx code generator for TCC\n * \n *  Copyright (c) 2001, 2002 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#ifdef TARGET_DEFS_ONLY\n\n//#define ASSEMBLY_LISTING_C67\n\n/* number of available registers */\n#define NB_REGS            24\n\n/* a register can belong to several classes. The classes must be\n   sorted from more general to more precise (see gv2() code which does\n   assumptions on it). */\n#define RC_INT     0x0001\t/* generic integer register */\n#define RC_FLOAT   0x0002\t/* generic float register */\n#define RC_EAX     0x0004\n#define RC_ST0     0x0008\n#define RC_ECX     0x0010\n#define RC_EDX     0x0020\n#define RC_INT_BSIDE  0x00000040\t/* generic integer register  on b side */\n#define RC_C67_A4     0x00000100\n#define RC_C67_A5     0x00000200\n#define RC_C67_B4     0x00000400\n#define RC_C67_B5     0x00000800\n#define RC_C67_A6     0x00001000\n#define RC_C67_A7     0x00002000\n#define RC_C67_B6     0x00004000\n#define RC_C67_B7     0x00008000\n#define RC_C67_A8     0x00010000\n#define RC_C67_A9     0x00020000\n#define RC_C67_B8     0x00040000\n#define RC_C67_B9     0x00080000\n#define RC_C67_A10    0x00100000\n#define RC_C67_A11    0x00200000\n#define RC_C67_B10    0x00400000\n#define RC_C67_B11    0x00800000\n#define RC_C67_A12    0x01000000\n#define RC_C67_A13    0x02000000\n#define RC_C67_B12    0x04000000\n#define RC_C67_B13    0x08000000\n#define RC_IRET    RC_C67_A4\t/* function return: integer register */\n#define RC_LRET    RC_C67_A5\t/* function return: second integer register */\n#define RC_FRET    RC_C67_A4\t/* function return: float register */\n\n/* pretty names for the registers */\nenum {\n    TREG_EAX = 0,\t\t// really A2\n    TREG_ECX,\t\t\t// really A3\n    TREG_EDX,\t\t\t// really B0\n    TREG_ST0,\t\t\t// really B1\n    TREG_C67_A4,\n    TREG_C67_A5,\n    TREG_C67_B4,\n    TREG_C67_B5,\n    TREG_C67_A6,\n    TREG_C67_A7,\n    TREG_C67_B6,\n    TREG_C67_B7,\n    TREG_C67_A8,\n    TREG_C67_A9,\n    TREG_C67_B8,\n    TREG_C67_B9,\n    TREG_C67_A10,\n    TREG_C67_A11,\n    TREG_C67_B10,\n    TREG_C67_B11,\n    TREG_C67_A12,\n    TREG_C67_A13,\n    TREG_C67_B12,\n    TREG_C67_B13,\n};\n\n/* return registers for function */\n#define REG_IRET TREG_C67_A4\t/* single word int return register */\n#define REG_LRET TREG_C67_A5\t/* second word return register (for long long) */\n#define REG_FRET TREG_C67_A4\t/* float return register */\n\n/* defined if function parameters must be evaluated in reverse order */\n//#define INVERT_FUNC_PARAMS\n\n/* defined if structures are passed as pointers. Otherwise structures\n   are directly pushed on stack. */\n//#define FUNC_STRUCT_PARAM_AS_PTR\n\n/* pointer size, in bytes */\n#define PTR_SIZE 4\n\n/* long double size and alignment, in bytes */\n#define LDOUBLE_SIZE  12\n#define LDOUBLE_ALIGN 4\n/* maximum alignment (for aligned attribute support) */\n#define MAX_ALIGN     8\n\n/******************************************************/\n/* ELF defines */\n\n#define EM_TCC_TARGET EM_C60\n\n/* relocation type for 32 bit data relocation */\n#define R_DATA_32   R_C60_32\n#define R_DATA_PTR  R_C60_32\n#define R_JMP_SLOT  R_C60_JMP_SLOT\n#define R_COPY      R_C60_COPY\n\n#define ELF_START_ADDR 0x00000400\n#define ELF_PAGE_SIZE  0x1000\n\n/******************************************************/\n#else /* ! TARGET_DEFS_ONLY */\n/******************************************************/\n#include \"tcc.h\"\n\nST_DATA const int reg_classes[NB_REGS] = {\n    /* eax */ RC_INT | RC_FLOAT | RC_EAX, \n    // only allow even regs for floats (allow for doubles)\n    /* ecx */ RC_INT | RC_ECX,\n    /* edx */ RC_INT | RC_INT_BSIDE | RC_FLOAT | RC_EDX,\n    // only allow even regs for floats (allow for doubles)\n    /* st0 */ RC_INT | RC_INT_BSIDE | RC_ST0,\n    /* A4  */ RC_C67_A4,\n    /* A5  */ RC_C67_A5,\n    /* B4  */ RC_C67_B4,\n    /* B5  */ RC_C67_B5,\n    /* A6  */ RC_C67_A6,\n    /* A7  */ RC_C67_A7,\n    /* B6  */ RC_C67_B6,\n    /* B7  */ RC_C67_B7,\n    /* A8  */ RC_C67_A8,\n    /* A9  */ RC_C67_A9,\n    /* B8  */ RC_C67_B8,\n    /* B9  */ RC_C67_B9,\n    /* A10  */ RC_C67_A10,\n    /* A11  */ RC_C67_A11,\n    /* B10  */ RC_C67_B10,\n    /* B11  */ RC_C67_B11,\n    /* A12  */ RC_C67_A10,\n    /* A13  */ RC_C67_A11,\n    /* B12  */ RC_C67_B10,\n    /* B13  */ RC_C67_B11\n};\n\n// although tcc thinks it is passing parameters on the stack,\n// the C67 really passes up to the first 10 params in special\n// regs or regs pairs (for 64 bit params).  So keep track of\n// the stack offsets so we can translate to the appropriate \n// reg (pair)\n\n#define NoCallArgsPassedOnStack 10\nint NoOfCurFuncArgs;\nint TranslateStackToReg[NoCallArgsPassedOnStack];\nint ParamLocOnStack[NoCallArgsPassedOnStack];\nint TotalBytesPushedOnStack;\n\n#ifndef FALSE\n# define FALSE 0\n# define TRUE 1\n#endif\n\n#undef BOOL\n#define BOOL int\n\n#define ALWAYS_ASSERT(x) \\\ndo {\\\n   if (!(x))\\\n       tcc_error(\"internal compiler error file at %s:%d\", __FILE__, __LINE__);\\\n} while (0)\n\n/******************************************************/\nstatic unsigned long func_sub_sp_offset;\nstatic int func_ret_sub;\n\nstatic BOOL C67_invert_test;\nstatic int C67_compare_reg;\n\n#ifdef ASSEMBLY_LISTING_C67\nFILE *f = NULL;\n#endif\n\nvoid C67_g(int c)\n{\n    int ind1;\n\n#ifdef ASSEMBLY_LISTING_C67\n    fprintf(f, \" %08X\", c);\n#endif\n    ind1 = ind + 4;\n    if (ind1 > (int) cur_text_section->data_allocated)\n\tsection_realloc(cur_text_section, ind1);\n    cur_text_section->data[ind] = c & 0xff;\n    cur_text_section->data[ind + 1] = (c >> 8) & 0xff;\n    cur_text_section->data[ind + 2] = (c >> 16) & 0xff;\n    cur_text_section->data[ind + 3] = (c >> 24) & 0xff;\n    ind = ind1;\n}\n\n\n/* output a symbol and patch all calls to it */\nvoid gsym_addr(int t, int a)\n{\n    int n, *ptr;\n    while (t) {\n\tptr = (int *) (cur_text_section->data + t);\n\t{\n\t    Sym *sym;\n\n\t    // extract 32 bit address from MVKH/MVKL\n\t    n = ((*ptr >> 7) & 0xffff);\n\t    n |= ((*(ptr + 1) >> 7) & 0xffff) << 16;\n\n\t    // define a label that will be relocated\n\n\t    sym = get_sym_ref(&char_pointer_type, cur_text_section, a, 0);\n\t    greloc(cur_text_section, sym, t, R_C60LO16);\n\t    greloc(cur_text_section, sym, t + 4, R_C60HI16);\n\n\t    // clear out where the pointer was\n\n\t    *ptr &= ~(0xffff << 7);\n\t    *(ptr + 1) &= ~(0xffff << 7);\n\t}\n\tt = n;\n    }\n}\n\nvoid gsym(int t)\n{\n    gsym_addr(t, ind);\n}\n\n// these are regs that tcc doesn't really know about, \n// but asign them unique values so the mapping routines\n// can distinquish them\n\n#define C67_A0 105\n#define C67_SP 106\n#define C67_B3 107\n#define C67_FP 108\n#define C67_B2 109\n#define C67_CREG_ZERO -1\t// Special code for no condition reg test\n\n\nint ConvertRegToRegClass(int r)\n{\n    // only works for A4-B13\n\n    return RC_C67_A4 << (r - TREG_C67_A4);\n}\n\n\n// map TCC reg to C67 reg number\n\nint C67_map_regn(int r)\n{\n    if (r == 0)\t\t\t// normal tcc regs\n\treturn 0x2;\t\t// A2\n    else if (r == 1)\t\t// normal tcc regs\n\treturn 3;\t\t// A3\n    else if (r == 2)\t\t// normal tcc regs\n\treturn 0;\t\t// B0\n    else if (r == 3)\t\t// normal tcc regs\n\treturn 1;\t\t// B1\n    else if (r >= TREG_C67_A4 && r <= TREG_C67_B13)\t// these form a pattern of alt pairs\n\treturn (((r & 0xfffffffc) >> 1) | (r & 1)) + 2;\n    else if (r == C67_A0)\n\treturn 0;\t\t// set to A0 (offset reg)\n    else if (r == C67_B2)\n\treturn 2;\t\t// set to B2 (offset reg)\n    else if (r == C67_B3)\n\treturn 3;\t\t// set to B3 (return address reg)\n    else if (r == C67_SP)\n\treturn 15;\t\t// set to SP (B15) (offset reg)\n    else if (r == C67_FP)\n\treturn 15;\t\t// set to FP (A15) (offset reg)\n    else if (r == C67_CREG_ZERO)\n\treturn 0;\t\t// Special code for no condition reg test\n    else\n\tALWAYS_ASSERT(FALSE);\n\n    return 0;\n}\n\n// mapping from tcc reg number to \n// C67 register to condition code field\n//\n// valid condition code regs are:\n//\n// tcc reg 2 ->B0 -> 1\n// tcc reg 3 ->B1 -> 2\n// tcc reg 0 -> A2 -> 5\n// tcc reg 1 -> A3 -> X\n// tcc reg      B2 -> 3\n\nint C67_map_regc(int r)\n{\n    if (r == 0)\t\t\t// normal tcc regs\n\treturn 0x5;\n    else if (r == 2)\t\t// normal tcc regs\n\treturn 0x1;\n    else if (r == 3)\t\t// normal tcc regs\n\treturn 0x2;\n    else if (r == C67_B2)\t// normal tcc regs\n\treturn 0x3;\n    else if (r == C67_CREG_ZERO)\n\treturn 0;\t\t// Special code for no condition reg test\n    else\n\tALWAYS_ASSERT(FALSE);\n\n    return 0;\n}\n\n\n// map TCC reg to C67 reg side A or B\n\nint C67_map_regs(int r)\n{\n    if (r == 0)\t\t\t// normal tcc regs\n\treturn 0x0;\n    else if (r == 1)\t\t// normal tcc regs\n\treturn 0x0;\n    else if (r == 2)\t\t// normal tcc regs\n\treturn 0x1;\n    else if (r == 3)\t\t// normal tcc regs\n\treturn 0x1;\n    else if (r >= TREG_C67_A4 && r <= TREG_C67_B13)\t// these form a pattern of alt pairs\n\treturn (r & 2) >> 1;\n    else if (r == C67_A0)\n\treturn 0;\t\t// set to A side \n    else if (r == C67_B2)\n\treturn 1;\t\t// set to B side \n    else if (r == C67_B3)\n\treturn 1;\t\t// set to B side\n    else if (r == C67_SP)\n\treturn 0x1;\t\t// set to SP (B15) B side \n    else if (r == C67_FP)\n\treturn 0x0;\t\t// set to FP (A15) A side \n    else\n\tALWAYS_ASSERT(FALSE);\n\n    return 0;\n}\n\nint C67_map_S12(char *s)\n{\n    if (strstr(s, \".S1\") != NULL)\n\treturn 0;\n    else if (strcmp(s, \".S2\"))\n\treturn 1;\n    else\n\tALWAYS_ASSERT(FALSE);\n\n    return 0;\n}\n\nint C67_map_D12(char *s)\n{\n    if (strstr(s, \".D1\") != NULL)\n\treturn 0;\n    else if (strcmp(s, \".D2\"))\n\treturn 1;\n    else\n\tALWAYS_ASSERT(FALSE);\n\n    return 0;\n}\n\n\n\nvoid C67_asm(char *s, int a, int b, int c)\n{\n    BOOL xpath;\n\n#ifdef ASSEMBLY_LISTING_C67\n    if (!f) {\n\tf = fopen(\"TCC67_out.txt\", \"wt\");\n    }\n    fprintf(f, \"%04X \", ind);\n#endif\n\n    if (strstr(s, \"MVKL\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\n\t      ((a & 0xffff) << 7) | (0x0a << 2) | (C67_map_regs(b) << 1));\n    } else if (strstr(s, \"MVKH\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\n\t      (((a >> 16) & 0xffff) << 7) |\n\t      (0x1a << 2) | (C67_map_regs(b) << 1));\n    } else if (strstr(s, \"STW.D SP POST DEC\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (15 << 18) |\t//SP B15\n\t      (2 << 13) |\t//ucst5 (must keep 8 byte boundary !!)\n\t      (0xa << 9) |\t//mode a = post dec ucst\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (1 << 7) |\t//y D1/D2 use B side\n\t      (7 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STB.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2 A side\n\t      (3 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STH.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2 A side\n\t      (5 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STB.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2 A side\n\t      (3 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STH.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2 A side\n\t      (5 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STW.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2 A side\n\t      (7 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STW.D *\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (C67_map_regn(b) << 18) |\t//base reg A0\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(b) << 7) |\t//y D1/D2 base reg side\n\t      (7 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STH.D *\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (C67_map_regn(b) << 18) |\t//base reg A0\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(b) << 7) |\t//y D1/D2 base reg side\n\t      (5 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STB.D *\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (C67_map_regn(b) << 18) |\t//base reg A0\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(b) << 7) |\t//y D1/D2 base reg side\n\t      (3 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"STW.D +*\") == s) {\n\tALWAYS_ASSERT(c < 32);\n\tC67_g((C67_map_regn(a) << 23) |\t//src\n\t      (C67_map_regn(b) << 18) |\t//base reg A0\n\t      (c << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(b) << 7) |\t//y D1/D2 base reg side\n\t      (7 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of src\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDW.D SP PRE INC\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg B15\n\t      (2 << 13) |\t//ucst5 (must keep 8 byte boundary)\n\t      (9 << 9) |\t//mode 9 = pre inc ucst5\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (1 << 7) |\t//y D1/D2  B side\n\t      (6 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDDW.D SP PRE INC\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg B15\n\t      (1 << 13) |\t//ucst5 (must keep 8 byte boundary)\n\t      (9 << 9) |\t//mode 9 = pre inc ucst5\n\t      (1 << 8) |\t//r (LDDW bit 1)\n\t      (1 << 7) |\t//y D1/D2  B side\n\t      (6 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDW.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2  A side\n\t      (6 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDDW.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (1 << 8) |\t//r (LDDW bit 1)\n\t      (0 << 7) |\t//y D1/D2  A side\n\t      (6 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDH.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2  A side\n\t      (4 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDB.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2  A side\n\t      (2 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDHU.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2  A side\n\t      (0 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDBU.D *+SP[A0]\") == s) {\n\tC67_g((C67_map_regn(a) << 23) |\t//dst\n\t      (15 << 18) |\t//base reg A15\n\t      (0 << 13) |\t//offset reg A0\n\t      (5 << 9) |\t//mode 5 = pos offset, base reg + off reg\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (0 << 7) |\t//y D1/D2  A side\n\t      (1 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(a) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDW.D *\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\t//dst\n\t      (C67_map_regn(a) << 18) |\t//base reg A15\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(a) << 7) |\t//y D1/D2  src side\n\t      (6 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDDW.D *\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\t//dst\n\t      (C67_map_regn(a) << 18) |\t//base reg A15\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (1 << 8) |\t//r (LDDW bit 1)\n\t      (C67_map_regs(a) << 7) |\t//y D1/D2  src side\n\t      (6 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDH.D *\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\t//dst\n\t      (C67_map_regn(a) << 18) |\t//base reg A15\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(a) << 7) |\t//y D1/D2  src side\n\t      (4 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDB.D *\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\t//dst\n\t      (C67_map_regn(a) << 18) |\t//base reg A15\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(a) << 7) |\t//y D1/D2  src side\n\t      (2 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDHU.D *\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\t//dst\n\t      (C67_map_regn(a) << 18) |\t//base reg A15\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(a) << 7) |\t//y D1/D2  src side\n\t      (0 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDBU.D *\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\t//dst\n\t      (C67_map_regn(a) << 18) |\t//base reg A15\n\t      (0 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(a) << 7) |\t//y D1/D2  src side\n\t      (1 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU\n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"LDW.D +*\") == s) {\n\tC67_g((C67_map_regn(b) << 23) |\t//dst\n\t      (C67_map_regn(a) << 18) |\t//base reg A15\n\t      (1 << 13) |\t//cst5\n\t      (1 << 9) |\t//mode 1 = pos cst offset\n\t      (0 << 8) |\t//r (LDDW bit 0)\n\t      (C67_map_regs(a) << 7) |\t//y D1/D2  src side\n\t      (6 << 4) |\t//ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU \n\t      (1 << 2) |\t//opcode\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPLTSP\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x3a << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPGTSP\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x39 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPEQSP\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x38 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    }\n\n    else if (strstr(s, \"CMPLTDP\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x2a << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPGTDP\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x29 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPEQDP\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x28 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPLT\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x57 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPGT\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x47 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPEQ\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x53 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPLTU\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x5f << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"CMPGTU\") == s) {\n\txpath = C67_map_regs(a) ^ C67_map_regs(b);\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1\n\t      (xpath << 12) |\t//x use cross path for src2\n\t      (0x4f << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side for reg c\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"B DISP\") == s) {\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//z\n\t      (a << 7) |\t//cnst\n\t      (0x4 << 2) |\t//opcode fixed\n\t      (0 << 1) |\t//S0/S1\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"B.\") == s) {\n\txpath = C67_map_regs(c) ^ 1;\n\n\tC67_g((C67_map_regc(b) << 29) |\t//creg\n\t      (a << 28) |\t//inv\n\t      (0 << 23) |\t//dst\n\t      (C67_map_regn(c) << 18) |\t//src2\n\t      (0 << 13) |\t//\n\t      (xpath << 12) |\t//x cross path if !B side\n\t      (0xd << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (1 << 1) |\t//must be S2\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"MV.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (0 << 13) |\t//src1 (cst5)\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x2 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SPTRUNC.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (0 << 13) |\t//src1 NA\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0xb << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"DPTRUNC.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      ((C67_map_regn(b) + 1) << 18) |\t//src2   WEIRD CPU must specify odd reg for some reason\n\t      (0 << 13) |\t//src1 NA\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x1 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"INTSP.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2   \n\t      (0 << 13) |\t//src1 NA\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x4a << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"INTSPU.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2  \n\t      (0 << 13) |\t//src1 NA\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x49 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"INTDP.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2  \n\t      (0 << 13) |\t//src1 NA\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x39 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"INTDPU.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      ((C67_map_regn(b) + 1) << 18) |\t//src2   WEIRD CPU must specify odd reg for some reason\n\t      (0 << 13) |\t//src1 NA\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x3b << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SPDP.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (0 << 13) |\t//src1 NA\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x2 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"DPSP.L\") == s) {\n\tALWAYS_ASSERT(C67_map_regs(b) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      ((C67_map_regn(b) + 1) << 18) |\t//src2 WEIRD CPU must specify odd reg for some reason\n\t      (0 << 13) |\t//src1 NA\n\t      (0 << 12) |\t//x cross path if opposite sides\n\t      (0x9 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"ADD.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x3 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SUB.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x7 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"OR.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x7f << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"AND.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x7b << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"XOR.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x6f << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"ADDSP.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x10 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"ADDDP.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x18 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SUBSP.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x11 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SUBDP.L\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x19 << 5) |\t//opcode\n\t      (0x6 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"MPYSP.M\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x1c << 7) |\t//opcode\n\t      (0x0 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"MPYDP.M\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2 (possible x path)\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x0e << 7) |\t//opcode\n\t      (0x0 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"MPYI.M\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1 (cst5)\n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x4 << 7) |\t//opcode\n\t      (0x0 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SHR.S\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x37 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SHRU.S\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x27 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"SHL.S\") == s) {\n\txpath = C67_map_regs(b) ^ C67_map_regs(c);\n\n\tALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(c) << 23) |\t//dst\n\t      (C67_map_regn(b) << 18) |\t//src2\n\t      (C67_map_regn(a) << 13) |\t//src1 \n\t      (xpath << 12) |\t//x cross path if opposite sides\n\t      (0x33 << 6) |\t//opcode\n\t      (0x8 << 2) |\t//opcode fixed\n\t      (C67_map_regs(c) << 1) |\t//side of dest\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"||ADDK\") == s) {\n\txpath = 0;\t\t// no xpath required just use the side of the src/dst\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(b) << 23) |\t//dst\n\t      (a << 07) |\t//scst16\n\t      (0x14 << 2) |\t//opcode fixed\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (1 << 0));\t//parallel\n    } else if (strstr(s, \"ADDK\") == s) {\n\txpath = 0;\t\t// no xpath required just use the side of the src/dst\n\n\tC67_g((0 << 29) |\t//creg\n\t      (0 << 28) |\t//inv\n\t      (C67_map_regn(b) << 23) |\t//dst\n\t      (a << 07) |\t//scst16\n\t      (0x14 << 2) |\t//opcode fixed\n\t      (C67_map_regs(b) << 1) |\t//side of dst\n\t      (0 << 0));\t//parallel\n    } else if (strstr(s, \"NOP\") == s) {\n\tC67_g(((a - 1) << 13) |\t//no of cycles\n\t      (0 << 0));\t//parallel\n    } else\n\tALWAYS_ASSERT(FALSE);\n\n#ifdef ASSEMBLY_LISTING_C67\n    fprintf(f, \" %s %d %d %d\\n\", s, a, b, c);\n#endif\n\n}\n\n//r=reg to load, fr=from reg, symbol for relocation, constant\n\nvoid C67_MVKL(int r, int fc)\n{\n    C67_asm(\"MVKL.\", fc, r, 0);\n}\n\nvoid C67_MVKH(int r, int fc)\n{\n    C67_asm(\"MVKH.\", fc, r, 0);\n}\n\nvoid C67_STB_SP_A0(int r)\n{\n    C67_asm(\"STB.D *+SP[A0]\", r, 0, 0);\t// STB  r,*+SP[A0]\n}\n\nvoid C67_STH_SP_A0(int r)\n{\n    C67_asm(\"STH.D *+SP[A0]\", r, 0, 0);\t// STH  r,*+SP[A0]\n}\n\nvoid C67_STW_SP_A0(int r)\n{\n    C67_asm(\"STW.D *+SP[A0]\", r, 0, 0);\t// STW  r,*+SP[A0]\n}\n\nvoid C67_STB_PTR(int r, int r2)\n{\n    C67_asm(\"STB.D *\", r, r2, 0);\t// STB  r, *r2\n}\n\nvoid C67_STH_PTR(int r, int r2)\n{\n    C67_asm(\"STH.D *\", r, r2, 0);\t// STH  r, *r2\n}\n\nvoid C67_STW_PTR(int r, int r2)\n{\n    C67_asm(\"STW.D *\", r, r2, 0);\t// STW  r, *r2\n}\n\nvoid C67_STW_PTR_PRE_INC(int r, int r2, int n)\n{\n    C67_asm(\"STW.D +*\", r, r2, n);\t// STW  r, *+r2\n}\n\nvoid C67_PUSH(int r)\n{\n    C67_asm(\"STW.D SP POST DEC\", r, 0, 0);\t// STW  r,*SP--\n}\n\nvoid C67_LDW_SP_A0(int r)\n{\n    C67_asm(\"LDW.D *+SP[A0]\", r, 0, 0);\t// LDW  *+SP[A0],r\n}\n\nvoid C67_LDDW_SP_A0(int r)\n{\n    C67_asm(\"LDDW.D *+SP[A0]\", r, 0, 0);\t// LDDW  *+SP[A0],r\n}\n\nvoid C67_LDH_SP_A0(int r)\n{\n    C67_asm(\"LDH.D *+SP[A0]\", r, 0, 0);\t// LDH  *+SP[A0],r\n}\n\nvoid C67_LDB_SP_A0(int r)\n{\n    C67_asm(\"LDB.D *+SP[A0]\", r, 0, 0);\t// LDB  *+SP[A0],r\n}\n\nvoid C67_LDHU_SP_A0(int r)\n{\n    C67_asm(\"LDHU.D *+SP[A0]\", r, 0, 0);\t// LDHU  *+SP[A0],r\n}\n\nvoid C67_LDBU_SP_A0(int r)\n{\n    C67_asm(\"LDBU.D *+SP[A0]\", r, 0, 0);\t// LDBU  *+SP[A0],r\n}\n\nvoid C67_LDW_PTR(int r, int r2)\n{\n    C67_asm(\"LDW.D *\", r, r2, 0);\t// LDW  *r,r2\n}\n\nvoid C67_LDDW_PTR(int r, int r2)\n{\n    C67_asm(\"LDDW.D *\", r, r2, 0);\t// LDDW  *r,r2\n}\n\nvoid C67_LDH_PTR(int r, int r2)\n{\n    C67_asm(\"LDH.D *\", r, r2, 0);\t// LDH  *r,r2\n}\n\nvoid C67_LDB_PTR(int r, int r2)\n{\n    C67_asm(\"LDB.D *\", r, r2, 0);\t// LDB  *r,r2\n}\n\nvoid C67_LDHU_PTR(int r, int r2)\n{\n    C67_asm(\"LDHU.D *\", r, r2, 0);\t// LDHU  *r,r2\n}\n\nvoid C67_LDBU_PTR(int r, int r2)\n{\n    C67_asm(\"LDBU.D *\", r, r2, 0);\t// LDBU  *r,r2\n}\n\nvoid C67_LDW_PTR_PRE_INC(int r, int r2)\n{\n    C67_asm(\"LDW.D +*\", r, r2, 0);\t// LDW  *+r,r2\n}\n\nvoid C67_POP(int r)\n{\n    C67_asm(\"LDW.D SP PRE INC\", r, 0, 0);\t// LDW  *++SP,r\n}\n\nvoid C67_POP_DW(int r)\n{\n    C67_asm(\"LDDW.D SP PRE INC\", r, 0, 0);\t// LDDW  *++SP,r\n}\n\nvoid C67_CMPLT(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPLT.L1\", s1, s2, dst);\n}\n\nvoid C67_CMPGT(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPGT.L1\", s1, s2, dst);\n}\n\nvoid C67_CMPEQ(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPEQ.L1\", s1, s2, dst);\n}\n\nvoid C67_CMPLTU(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPLTU.L1\", s1, s2, dst);\n}\n\nvoid C67_CMPGTU(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPGTU.L1\", s1, s2, dst);\n}\n\n\nvoid C67_CMPLTSP(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPLTSP.S1\", s1, s2, dst);\n}\n\nvoid C67_CMPGTSP(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPGTSP.S1\", s1, s2, dst);\n}\n\nvoid C67_CMPEQSP(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPEQSP.S1\", s1, s2, dst);\n}\n\nvoid C67_CMPLTDP(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPLTDP.S1\", s1, s2, dst);\n}\n\nvoid C67_CMPGTDP(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPGTDP.S1\", s1, s2, dst);\n}\n\nvoid C67_CMPEQDP(int s1, int s2, int dst)\n{\n    C67_asm(\"CMPEQDP.S1\", s1, s2, dst);\n}\n\n\nvoid C67_IREG_B_REG(int inv, int r1, int r2)\t// [!R] B  r2\n{\n    C67_asm(\"B.S2\", inv, r1, r2);\n}\n\n\n// call with how many 32 bit words to skip\n// (0 would branch to the branch instruction)\n\nvoid C67_B_DISP(int disp)\t//  B  +2  Branch with constant displacement\n{\n    // Branch point is relative to the 8 word fetch packet\n    //\n    // we will assume the text section always starts on an 8 word (32 byte boundary)\n    //\n    // so add in how many words into the fetch packet the branch is\n\n\n    C67_asm(\"B DISP\", disp + ((ind & 31) >> 2), 0, 0);\n}\n\nvoid C67_NOP(int n)\n{\n    C67_asm(\"NOP\", n, 0, 0);\n}\n\nvoid C67_ADDK(int n, int r)\n{\n    ALWAYS_ASSERT(abs(n) < 32767);\n\n    C67_asm(\"ADDK\", n, r, 0);\n}\n\nvoid C67_ADDK_PARALLEL(int n, int r)\n{\n    ALWAYS_ASSERT(abs(n) < 32767);\n\n    C67_asm(\"||ADDK\", n, r, 0);\n}\n\nvoid C67_Adjust_ADDK(int *inst, int n)\n{\n    ALWAYS_ASSERT(abs(n) < 32767);\n\n    *inst = (*inst & (~(0xffff << 7))) | ((n & 0xffff) << 7);\n}\n\nvoid C67_MV(int r, int v)\n{\n    C67_asm(\"MV.L\", 0, r, v);\n}\n\n\nvoid C67_DPTRUNC(int r, int v)\n{\n    C67_asm(\"DPTRUNC.L\", 0, r, v);\n}\n\nvoid C67_SPTRUNC(int r, int v)\n{\n    C67_asm(\"SPTRUNC.L\", 0, r, v);\n}\n\nvoid C67_INTSP(int r, int v)\n{\n    C67_asm(\"INTSP.L\", 0, r, v);\n}\n\nvoid C67_INTDP(int r, int v)\n{\n    C67_asm(\"INTDP.L\", 0, r, v);\n}\n\nvoid C67_INTSPU(int r, int v)\n{\n    C67_asm(\"INTSPU.L\", 0, r, v);\n}\n\nvoid C67_INTDPU(int r, int v)\n{\n    C67_asm(\"INTDPU.L\", 0, r, v);\n}\n\nvoid C67_SPDP(int r, int v)\n{\n    C67_asm(\"SPDP.L\", 0, r, v);\n}\n\nvoid C67_DPSP(int r, int v)\t// note regs must be on the same side\n{\n    C67_asm(\"DPSP.L\", 0, r, v);\n}\n\nvoid C67_ADD(int r, int v)\n{\n    C67_asm(\"ADD.L\", v, r, v);\n}\n\nvoid C67_SUB(int r, int v)\n{\n    C67_asm(\"SUB.L\", v, r, v);\n}\n\nvoid C67_AND(int r, int v)\n{\n    C67_asm(\"AND.L\", v, r, v);\n}\n\nvoid C67_OR(int r, int v)\n{\n    C67_asm(\"OR.L\", v, r, v);\n}\n\nvoid C67_XOR(int r, int v)\n{\n    C67_asm(\"XOR.L\", v, r, v);\n}\n\nvoid C67_ADDSP(int r, int v)\n{\n    C67_asm(\"ADDSP.L\", v, r, v);\n}\n\nvoid C67_SUBSP(int r, int v)\n{\n    C67_asm(\"SUBSP.L\", v, r, v);\n}\n\nvoid C67_MPYSP(int r, int v)\n{\n    C67_asm(\"MPYSP.M\", v, r, v);\n}\n\nvoid C67_ADDDP(int r, int v)\n{\n    C67_asm(\"ADDDP.L\", v, r, v);\n}\n\nvoid C67_SUBDP(int r, int v)\n{\n    C67_asm(\"SUBDP.L\", v, r, v);\n}\n\nvoid C67_MPYDP(int r, int v)\n{\n    C67_asm(\"MPYDP.M\", v, r, v);\n}\n\nvoid C67_MPYI(int r, int v)\n{\n    C67_asm(\"MPYI.M\", v, r, v);\n}\n\nvoid C67_SHL(int r, int v)\n{\n    C67_asm(\"SHL.S\", r, v, v);\n}\n\nvoid C67_SHRU(int r, int v)\n{\n    C67_asm(\"SHRU.S\", r, v, v);\n}\n\nvoid C67_SHR(int r, int v)\n{\n    C67_asm(\"SHR.S\", r, v, v);\n}\n\n\n\n/* load 'r' from value 'sv' */\nvoid load(int r, SValue * sv)\n{\n    int v, t, ft, fc, fr, size = 0, element;\n    BOOL Unsigned = FALSE;\n    SValue v1;\n\n    fr = sv->r;\n    ft = sv->type.t;\n    fc = sv->c.ul;\n\n    v = fr & VT_VALMASK;\n    if (fr & VT_LVAL) {\n\tif (v == VT_LLOCAL) {\n\t    v1.type.t = VT_INT;\n\t    v1.r = VT_LOCAL | VT_LVAL;\n\t    v1.c.ul = fc;\n\t    load(r, &v1);\n\t    fr = r;\n\t} else if ((ft & VT_BTYPE) == VT_LDOUBLE) {\n\t    tcc_error(\"long double not supported\");\n\t} else if ((ft & VT_TYPE) == VT_BYTE) {\n\t    size = 1;\n\t} else if ((ft & VT_TYPE) == (VT_BYTE | VT_UNSIGNED)) {\n\t    size = 1;\n\t    Unsigned = TRUE;\n\t} else if ((ft & VT_TYPE) == VT_SHORT) {\n\t    size = 2;\n\t} else if ((ft & VT_TYPE) == (VT_SHORT | VT_UNSIGNED)) {\n\t    size = 2;\n\t    Unsigned = TRUE;\n\t} else if ((ft & VT_BTYPE) == VT_DOUBLE) {\n\t    size = 8;\n\t} else {\n\t    size = 4;\n\t}\n\n\t// check if fc is a positive reference on the stack, \n\t// if it is tcc is referencing what it thinks is a parameter\n\t// on the stack, so check if it is really in a register.\n\n\n\tif (v == VT_LOCAL && fc > 0) {\n\t    int stack_pos = 8;\n\n\t    for (t = 0; t < NoCallArgsPassedOnStack; t++) {\n\t\tif (fc == stack_pos)\n\t\t    break;\n\n\t\tstack_pos += TranslateStackToReg[t];\n\t    }\n\n\t    // param has been pushed on stack, get it like a local var\n\n\t    fc = ParamLocOnStack[t] - 8;\n\t}\n\n\tif ((fr & VT_VALMASK) < VT_CONST)\t// check for pure indirect\n\t{\n\t    if (size == 1) {\n\t\tif (Unsigned)\n\t\t    C67_LDBU_PTR(v, r);\t// LDBU  *v,r\n\t\telse\n\t\t    C67_LDB_PTR(v, r);\t// LDB  *v,r\n\t    } else if (size == 2) {\n\t\tif (Unsigned)\n\t\t    C67_LDHU_PTR(v, r);\t// LDHU  *v,r\n\t\telse\n\t\t    C67_LDH_PTR(v, r);\t// LDH  *v,r\n\t    } else if (size == 4) {\n\t\tC67_LDW_PTR(v, r);\t// LDW  *v,r\n\t    } else if (size == 8) {\n\t\tC67_LDDW_PTR(v, r);\t// LDDW  *v,r\n\t    }\n\n\t    C67_NOP(4);\t\t// NOP 4\n\t    return;\n\t} else if (fr & VT_SYM) {\n\t    greloc(cur_text_section, sv->sym, ind, R_C60LO16);\t// rem the inst need to be patched\n\t    greloc(cur_text_section, sv->sym, ind + 4, R_C60HI16);\n\n\n\t    C67_MVKL(C67_A0, fc);\t//r=reg to load,  constant\n\t    C67_MVKH(C67_A0, fc);\t//r=reg to load,  constant\n\n\n\t    if (size == 1) {\n\t\tif (Unsigned)\n\t\t    C67_LDBU_PTR(C67_A0, r);\t// LDBU  *A0,r\n\t\telse\n\t\t    C67_LDB_PTR(C67_A0, r);\t// LDB  *A0,r\n\t    } else if (size == 2) {\n\t\tif (Unsigned)\n\t\t    C67_LDHU_PTR(C67_A0, r);\t// LDHU  *A0,r\n\t\telse\n\t\t    C67_LDH_PTR(C67_A0, r);\t// LDH  *A0,r\n\t    } else if (size == 4) {\n\t\tC67_LDW_PTR(C67_A0, r);\t// LDW  *A0,r\n\t    } else if (size == 8) {\n\t\tC67_LDDW_PTR(C67_A0, r);\t// LDDW  *A0,r\n\t    }\n\n\t    C67_NOP(4);\t\t// NOP 4\n\t    return;\n\t} else {\n\t    element = size;\n\n\t    // divide offset in bytes to create element index\n\t    C67_MVKL(C67_A0, (fc / element) + 8 / element);\t//r=reg to load,  constant\n\t    C67_MVKH(C67_A0, (fc / element) + 8 / element);\t//r=reg to load,  constant\n\n\t    if (size == 1) {\n\t\tif (Unsigned)\n\t\t    C67_LDBU_SP_A0(r);\t// LDBU  r, SP[A0]\n\t\telse\n\t\t    C67_LDB_SP_A0(r);\t// LDB  r, SP[A0]\n\t    } else if (size == 2) {\n\t\tif (Unsigned)\n\t\t    C67_LDHU_SP_A0(r);\t// LDHU  r, SP[A0]\n\t\telse\n\t\t    C67_LDH_SP_A0(r);\t// LDH  r, SP[A0]\n\t    } else if (size == 4) {\n\t\tC67_LDW_SP_A0(r);\t// LDW  r, SP[A0]\n\t    } else if (size == 8) {\n\t\tC67_LDDW_SP_A0(r);\t// LDDW  r, SP[A0]\n\t    }\n\n\n\t    C67_NOP(4);\t\t// NOP 4\n\t    return;\n\t}\n    } else {\n\tif (v == VT_CONST) {\n\t    if (fr & VT_SYM) {\n\t\tgreloc(cur_text_section, sv->sym, ind, R_C60LO16);\t// rem the inst need to be patched\n\t\tgreloc(cur_text_section, sv->sym, ind + 4, R_C60HI16);\n\t    }\n\t    C67_MVKL(r, fc);\t//r=reg to load, constant\n\t    C67_MVKH(r, fc);\t//r=reg to load, constant\n\t} else if (v == VT_LOCAL) {\n\t    C67_MVKL(r, fc + 8);\t//r=reg to load, constant C67 stack points to next free\n\t    C67_MVKH(r, fc + 8);\t//r=reg to load, constant\n\t    C67_ADD(C67_FP, r);\t// MV v,r   v -> r\n\t} else if (v == VT_CMP) {\n\t    C67_MV(C67_compare_reg, r);\t// MV v,r   v -> r\n\t} else if (v == VT_JMP || v == VT_JMPI) {\n\t    t = v & 1;\n\t    C67_B_DISP(4);\t//  Branch with constant displacement, skip over this branch, load, nop, load\n\t    C67_MVKL(r, t);\t//  r=reg to load, 0 or 1 (do this while branching)\n\t    C67_NOP(4);\t\t//  NOP 4\n\t    gsym(fc);\t\t//  modifies other branches to branch here\n\t    C67_MVKL(r, t ^ 1);\t//  r=reg to load, 0 or 1\n\t} else if (v != r) {\n\t    C67_MV(v, r);\t// MV v,r   v -> r\n\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE)\n\t\tC67_MV(v + 1, r + 1);\t// MV v,r   v -> r\n\t}\n    }\n}\n\n\n/* store register 'r' in lvalue 'v' */\nvoid store(int r, SValue * v)\n{\n    int fr, bt, ft, fc, size, t, element;\n\n    ft = v->type.t;\n    fc = v->c.ul;\n    fr = v->r & VT_VALMASK;\n    bt = ft & VT_BTYPE;\n    /* XXX: incorrect if float reg to reg */\n\n    if (bt == VT_LDOUBLE) {\n\ttcc_error(\"long double not supported\");\n    } else {\n\tif (bt == VT_SHORT)\n\t    size = 2;\n\telse if (bt == VT_BYTE)\n\t    size = 1;\n\telse if (bt == VT_DOUBLE)\n\t    size = 8;\n\telse\n\t    size = 4;\n\n\tif ((v->r & VT_VALMASK) == VT_CONST) {\n\t    /* constant memory reference */\n\n\t    if (v->r & VT_SYM) {\n\t\tgreloc(cur_text_section, v->sym, ind, R_C60LO16);\t// rem the inst need to be patched\n\t\tgreloc(cur_text_section, v->sym, ind + 4, R_C60HI16);\n\t    }\n\t    C67_MVKL(C67_A0, fc);\t//r=reg to load,  constant\n\t    C67_MVKH(C67_A0, fc);\t//r=reg to load,  constant\n\n\t    if (size == 1)\n\t\tC67_STB_PTR(r, C67_A0);\t// STB  r, *A0\n\t    else if (size == 2)\n\t\tC67_STH_PTR(r, C67_A0);\t// STH  r, *A0\n\t    else if (size == 4 || size == 8)\n\t\tC67_STW_PTR(r, C67_A0);\t// STW  r, *A0\n\n\t    if (size == 8)\n\t\tC67_STW_PTR_PRE_INC(r + 1, C67_A0, 1);\t// STW  r, *+A0[1]\n\t} else if ((v->r & VT_VALMASK) == VT_LOCAL) {\n\t    // check case of storing to passed argument that\n\t    // tcc thinks is on the stack but for C67 is\n\t    // passed as a reg.  However it may have been\n\t    // saved to the stack, if that reg was required\n\t    // for a call to a child function\n\n\t    if (fc > 0)\t\t// argument ??\n\t    {\n\t\t// walk through sizes and figure which param\n\n\t\tint stack_pos = 8;\n\n\t\tfor (t = 0; t < NoCallArgsPassedOnStack; t++) {\n\t\t    if (fc == stack_pos)\n\t\t\tbreak;\n\n\t\t    stack_pos += TranslateStackToReg[t];\n\t\t}\n\n\t\t// param has been pushed on stack, get it like a local var\n\t\tfc = ParamLocOnStack[t] - 8;\n\t    }\n\n\t    if (size == 8)\n\t\telement = 4;\n\t    else\n\t\telement = size;\n\n\t    // divide offset in bytes to create word index\n\t    C67_MVKL(C67_A0, (fc / element) + 8 / element);\t//r=reg to load,  constant\n\t    C67_MVKH(C67_A0, (fc / element) + 8 / element);\t//r=reg to load,  constant\n\n\n\n\t    if (size == 1)\n\t\tC67_STB_SP_A0(r);\t// STB  r, SP[A0]\n\t    else if (size == 2)\n\t\tC67_STH_SP_A0(r);\t// STH  r, SP[A0]\n\t    else if (size == 4 || size == 8)\n\t\tC67_STW_SP_A0(r);\t// STW  r, SP[A0]\n\n\t    if (size == 8) {\n\t\tC67_ADDK(1, C67_A0);\t//  ADDK 1,A0\n\t\tC67_STW_SP_A0(r + 1);\t//  STW  r, SP[A0]\n\t    }\n\t} else {\n\t    if (size == 1)\n\t\tC67_STB_PTR(r, fr);\t// STB  r, *fr\n\t    else if (size == 2)\n\t\tC67_STH_PTR(r, fr);\t// STH  r, *fr\n\t    else if (size == 4 || size == 8)\n\t\tC67_STW_PTR(r, fr);\t// STW  r, *fr\n\n\t    if (size == 8) {\n\t\tC67_STW_PTR_PRE_INC(r + 1, fr, 1);\t// STW  r, *+fr[1]\n\t    }\n\t}\n    }\n}\n\n/* 'is_jmp' is '1' if it is a jump */\nstatic void gcall_or_jmp(int is_jmp)\n{\n    int r;\n    Sym *sym;\n\n    if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n\t/* constant case */\n\tif (vtop->r & VT_SYM) {\n\t    /* relocation case */\n\n\t    // get add into A0, then start the jump B3\n\n\t    greloc(cur_text_section, vtop->sym, ind, R_C60LO16);\t// rem the inst need to be patched\n\t    greloc(cur_text_section, vtop->sym, ind + 4, R_C60HI16);\n\n\t    C67_MVKL(C67_A0, 0);\t//r=reg to load, constant\n\t    C67_MVKH(C67_A0, 0);\t//r=reg to load, constant\n\t    C67_IREG_B_REG(0, C67_CREG_ZERO, C67_A0);\t//  B.S2x  A0\n\n\t    if (is_jmp) {\n\t\tC67_NOP(5);\t// simple jump, just put NOP\n\t    } else {\n\t\t// Call, must load return address into B3 during delay slots\n\n\t\tsym = get_sym_ref(&char_pointer_type, cur_text_section, ind + 12, 0);\t// symbol for return address\n\t\tgreloc(cur_text_section, sym, ind, R_C60LO16);\t// rem the inst need to be patched\n\t\tgreloc(cur_text_section, sym, ind + 4, R_C60HI16);\n\t\tC67_MVKL(C67_B3, 0);\t//r=reg to load, constant\n\t\tC67_MVKH(C67_B3, 0);\t//r=reg to load, constant\n\t\tC67_NOP(3);\t// put remaining NOPs\n\t    }\n\t} else {\n\t    /* put an empty PC32 relocation */\n\t    ALWAYS_ASSERT(FALSE);\n\t}\n    } else {\n\t/* otherwise, indirect call */\n\tr = gv(RC_INT);\n\tC67_IREG_B_REG(0, C67_CREG_ZERO, r);\t//  B.S2x  r\n\n\tif (is_jmp) {\n\t    C67_NOP(5);\t\t// simple jump, just put NOP\n\t} else {\n\t    // Call, must load return address into B3 during delay slots\n\n\t    sym = get_sym_ref(&char_pointer_type, cur_text_section, ind + 12, 0);\t// symbol for return address\n\t    greloc(cur_text_section, sym, ind, R_C60LO16);\t// rem the inst need to be patched\n\t    greloc(cur_text_section, sym, ind + 4, R_C60HI16);\n\t    C67_MVKL(C67_B3, 0);\t//r=reg to load, constant\n\t    C67_MVKH(C67_B3, 0);\t//r=reg to load, constant\n\t    C67_NOP(3);\t\t// put remaining NOPs\n\t}\n    }\n}\n\n/* generate function call with address in (vtop->t, vtop->c) and free function\n   context. Stack entry is popped */\nvoid gfunc_call(int nb_args)\n{\n    int i, r, size = 0;\n    int args_sizes[NoCallArgsPassedOnStack];\n\n    if (nb_args > NoCallArgsPassedOnStack) {\n\ttcc_error(\"more than 10 function params not currently supported\");\n\t// handle more than 10, put some on the stack\n    }\n\n    for (i = 0; i < nb_args; i++) {\n\tif ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {\n\t    ALWAYS_ASSERT(FALSE);\n\t} else if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {\n\t    ALWAYS_ASSERT(FALSE);\n\t} else {\n\t    /* simple type (currently always same size) */\n\t    /* XXX: implicit cast ? */\n\n\n\t    if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {\n\t\ttcc_error(\"long long not supported\");\n\t    } else if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {\n\t\ttcc_error(\"long double not supported\");\n\t    } else if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE) {\n\t\tsize = 8;\n\t    } else {\n\t\tsize = 4;\n\t    }\n\n\t    // put the parameter into the corresponding reg (pair)\n\n\t    r = gv(RC_C67_A4 << (2 * i));\n\n\t    // must put on stack because with 1 pass compiler , no way to tell\n\t    // if an up coming nested call might overwrite these regs\n\n\t    C67_PUSH(r);\n\n\t    if (size == 8) {\n\t\tC67_STW_PTR_PRE_INC(r + 1, C67_SP, 3);\t// STW  r, *+SP[3] (go back and put the other)\n\t    }\n\t    args_sizes[i] = size;\n\t}\n\tvtop--;\n    }\n    // POP all the params on the stack into registers for the\n    // immediate call (in reverse order)\n\n    for (i = nb_args - 1; i >= 0; i--) {\n\n\tif (args_sizes[i] == 8)\n\t    C67_POP_DW(TREG_C67_A4 + i * 2);\n\telse\n\t    C67_POP(TREG_C67_A4 + i * 2);\n    }\n    gcall_or_jmp(0);\n    vtop--;\n}\n\n\n// to be compatible with Code Composer for the C67\n// the first 10 parameters must be passed in registers\n// (pairs for 64 bits) starting wit; A4:A5, then B4:B5 and\n// ending with B12:B13.\n//\n// When a call is made, if the caller has its parameters\n// in regs A4-B13 these must be saved before/as the call \n// parameters are loaded and restored upon return (or if/when needed).\n\n/* generate function prolog of type 't' */\nvoid gfunc_prolog(CType * func_type)\n{\n    int addr, align, size, func_call, i;\n    Sym *sym;\n    CType *type;\n\n    sym = func_type->ref;\n    func_call = sym->r;\n    addr = 8;\n    /* if the function returns a structure, then add an\n       implicit pointer parameter */\n    func_vt = sym->type;\n    if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {\n\tfunc_vc = addr;\n\taddr += 4;\n    }\n\n    NoOfCurFuncArgs = 0;\n\n    /* define parameters */\n    while ((sym = sym->next) != NULL) {\n\ttype = &sym->type;\n\tsym_push(sym->v & ~SYM_FIELD, type, VT_LOCAL | lvalue_type(type->t), addr);\n\tsize = type_size(type, &align);\n\tsize = (size + 3) & ~3;\n\n\t// keep track of size of arguments so\n\t// we can translate where tcc thinks they\n\t// are on the stack into the appropriate reg\n\n\tTranslateStackToReg[NoOfCurFuncArgs] = size;\n\tNoOfCurFuncArgs++;\n\n#ifdef FUNC_STRUCT_PARAM_AS_PTR\n\t/* structs are passed as pointer */\n\tif ((type->t & VT_BTYPE) == VT_STRUCT) {\n\t    size = 4;\n\t}\n#endif\n\taddr += size;\n    }\n    func_ret_sub = 0;\n    /* pascal type call ? */\n    if (func_call == FUNC_STDCALL)\n\tfunc_ret_sub = addr - 8;\n\n    C67_MV(C67_FP, C67_A0);\t//  move FP -> A0\n    C67_MV(C67_SP, C67_FP);\t//  move SP -> FP\n\n    // place all the args passed in regs onto the stack\n\n    loc = 0;\n    for (i = 0; i < NoOfCurFuncArgs; i++) {\n\n\tParamLocOnStack[i] = loc;\t// remember where the param is\n\tloc += -8;\n\n\tC67_PUSH(TREG_C67_A4 + i * 2);\n\n\tif (TranslateStackToReg[i] == 8) {\n\t    C67_STW_PTR_PRE_INC(TREG_C67_A4 + i * 2 + 1, C67_SP, 3);\t// STW  r, *+SP[1] (go back and put the other)\n\t}\n    }\n\n    TotalBytesPushedOnStack = -loc;\n\n    func_sub_sp_offset = ind;\t// remember where we put the stack instruction \n    C67_ADDK(0, C67_SP);\t//  ADDK.L2 loc,SP  (just put zero temporarily)\n\n    C67_PUSH(C67_A0);\n    C67_PUSH(C67_B3);\n}\n\n/* generate function epilog */\nvoid gfunc_epilog(void)\n{\n    {\n\tint local = (-loc + 7) & -8;\t// stack must stay aligned to 8 bytes for LDDW instr\n\tC67_POP(C67_B3);\n\tC67_NOP(4);\t\t// NOP wait for load\n\tC67_IREG_B_REG(0, C67_CREG_ZERO, C67_B3);\t//  B.S2  B3\n\tC67_POP(C67_FP);\n\tC67_ADDK(local, C67_SP);\t//  ADDK.L2 loc,SP  \n\tC67_Adjust_ADDK((int *) (cur_text_section->data +\n\t\t\t\t func_sub_sp_offset),\n\t\t\t-local + TotalBytesPushedOnStack);\n\tC67_NOP(3);\t\t// NOP \n    }\n}\n\n/* generate a jump to a label */\nint gjmp(int t)\n{\n    int ind1 = ind;\n\n    C67_MVKL(C67_A0, t);\t//r=reg to load,  constant\n    C67_MVKH(C67_A0, t);\t//r=reg to load,  constant\n    C67_IREG_B_REG(0, C67_CREG_ZERO, C67_A0);\t// [!R] B.S2x  A0\n    C67_NOP(5);\n    return ind1;\n}\n\n/* generate a jump to a fixed address */\nvoid gjmp_addr(int a)\n{\n    Sym *sym;\n    // I guess this routine is used for relative short\n    // local jumps, for now just handle it as the general\n    // case\n\n    // define a label that will be relocated\n\n    sym = get_sym_ref(&char_pointer_type, cur_text_section, a, 0);\n    greloc(cur_text_section, sym, ind, R_C60LO16);\n    greloc(cur_text_section, sym, ind + 4, R_C60HI16);\n\n    gjmp(0);\t\t\t// place a zero there later the symbol will be added to it\n}\n\n/* generate a test. set 'inv' to invert test. Stack entry is popped */\nint gtst(int inv, int t)\n{\n    int ind1, n;\n    int v, *p;\n\n    v = vtop->r & VT_VALMASK;\n    if (v == VT_CMP) {\n\t/* fast case : can jump directly since flags are set */\n\t// C67 uses B2 sort of as flags register\n\tind1 = ind;\n\tC67_MVKL(C67_A0, t);\t//r=reg to load, constant\n\tC67_MVKH(C67_A0, t);\t//r=reg to load, constant\n\n\tif (C67_compare_reg != TREG_EAX &&\t// check if not already in a conditional test reg\n\t    C67_compare_reg != TREG_EDX &&\n\t    C67_compare_reg != TREG_ST0 && C67_compare_reg != C67_B2) {\n\t    C67_MV(C67_compare_reg, C67_B2);\n\t    C67_compare_reg = C67_B2;\n\t}\n\n\tC67_IREG_B_REG(C67_invert_test ^ inv, C67_compare_reg, C67_A0);\t// [!R] B.S2x  A0\n\tC67_NOP(5);\n\tt = ind1;\t\t//return where we need to patch\n\n    } else if (v == VT_JMP || v == VT_JMPI) {\n\t/* && or || optimization */\n\tif ((v & 1) == inv) {\n\t    /* insert vtop->c jump list in t */\n\t    p = &vtop->c.i;\n\n\t    // I guess the idea is to traverse to the\n\t    // null at the end of the list and store t\n\t    // there\n\n\t    n = *p;\n\t    while (n != 0) {\n\t\tp = (int *) (cur_text_section->data + n);\n\n\t\t// extract 32 bit address from MVKH/MVKL\n\t\tn = ((*p >> 7) & 0xffff);\n\t\tn |= ((*(p + 1) >> 7) & 0xffff) << 16;\n\t    }\n\t    *p |= (t & 0xffff) << 7;\n\t    *(p + 1) |= ((t >> 16) & 0xffff) << 7;\n\t    t = vtop->c.i;\n\n\t} else {\n\t    t = gjmp(t);\n\t    gsym(vtop->c.i);\n\t}\n    } else {\n\tif (is_float(vtop->type.t)) {\n\t    vpushi(0);\n\t    gen_op(TOK_NE);\n\t}\n\tif ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n\t    /* constant jmp optimization */\n\t    if ((vtop->c.i != 0) != inv)\n\t\tt = gjmp(t);\n\t} else {\n\t    // I think we need to get the value on the stack\n\t    // into a register, test it, and generate a branch\n\t    // return the address of the branch, so it can be\n\t    // later patched\n\n\t    v = gv(RC_INT);\t// get value into a reg \n\t    ind1 = ind;\n\t    C67_MVKL(C67_A0, t);\t//r=reg to load, constant\n\t    C67_MVKH(C67_A0, t);\t//r=reg to load, constant\n\n\t    if (v != TREG_EAX &&\t// check if not already in a conditional test reg\n\t\tv != TREG_EDX && v != TREG_ST0 && v != C67_B2) {\n\t\tC67_MV(v, C67_B2);\n\t\tv = C67_B2;\n\t    }\n\n\t    C67_IREG_B_REG(inv, v, C67_A0);\t// [!R] B.S2x  A0\n\t    C67_NOP(5);\n\t    t = ind1;\t\t//return where we need to patch\n\t    ind1 = ind;\n\t}\n    }\n    vtop--;\n    return t;\n}\n\n/* generate an integer binary operation */\nvoid gen_opi(int op)\n{\n    int r, fr, opc, t;\n\n    switch (op) {\n    case '+':\n    case TOK_ADDC1:\t\t/* add with carry generation */\n\topc = 0;\n      gen_op8:\n\n\n// C67 can't do const compares, must load into a reg\n// so just go to gv2 directly - tktk\n\n\n\n\tif (op >= TOK_ULT && op <= TOK_GT)\n\t    gv2(RC_INT_BSIDE, RC_INT);\t// make sure r (src1) is on the B Side of CPU\n\telse\n\t    gv2(RC_INT, RC_INT);\n\n\tr = vtop[-1].r;\n\tfr = vtop[0].r;\n\n\tC67_compare_reg = C67_B2;\n\n\n\tif (op == TOK_LT) {\n\t    C67_CMPLT(r, fr, C67_B2);\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_GE) {\n\t    C67_CMPLT(r, fr, C67_B2);\n\t    C67_invert_test = TRUE;\n\t} else if (op == TOK_GT) {\n\t    C67_CMPGT(r, fr, C67_B2);\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_LE) {\n\t    C67_CMPGT(r, fr, C67_B2);\n\t    C67_invert_test = TRUE;\n\t} else if (op == TOK_EQ) {\n\t    C67_CMPEQ(r, fr, C67_B2);\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_NE) {\n\t    C67_CMPEQ(r, fr, C67_B2);\n\t    C67_invert_test = TRUE;\n\t} else if (op == TOK_ULT) {\n\t    C67_CMPLTU(r, fr, C67_B2);\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_UGE) {\n\t    C67_CMPLTU(r, fr, C67_B2);\n\t    C67_invert_test = TRUE;\n\t} else if (op == TOK_UGT) {\n\t    C67_CMPGTU(r, fr, C67_B2);\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_ULE) {\n\t    C67_CMPGTU(r, fr, C67_B2);\n\t    C67_invert_test = TRUE;\n\t} else if (op == '+')\n\t    C67_ADD(fr, r);\t// ADD  r,fr,r\n\telse if (op == '-')\n\t    C67_SUB(fr, r);\t// SUB  r,fr,r\n\telse if (op == '&')\n\t    C67_AND(fr, r);\t// AND  r,fr,r\n\telse if (op == '|')\n\t    C67_OR(fr, r);\t// OR  r,fr,r\n\telse if (op == '^')\n\t    C67_XOR(fr, r);\t// XOR  r,fr,r\n\telse\n\t    ALWAYS_ASSERT(FALSE);\n\n\tvtop--;\n\tif (op >= TOK_ULT && op <= TOK_GT) {\n\t    vtop->r = VT_CMP;\n\t    vtop->c.i = op;\n\t}\n\tbreak;\n    case '-':\n    case TOK_SUBC1:\t\t/* sub with carry generation */\n\topc = 5;\n\tgoto gen_op8;\n    case TOK_ADDC2:\t\t/* add with carry use */\n\topc = 2;\n\tgoto gen_op8;\n    case TOK_SUBC2:\t\t/* sub with carry use */\n\topc = 3;\n\tgoto gen_op8;\n    case '&':\n\topc = 4;\n\tgoto gen_op8;\n    case '^':\n\topc = 6;\n\tgoto gen_op8;\n    case '|':\n\topc = 1;\n\tgoto gen_op8;\n    case '*':\n    case TOK_UMULL:\n\tgv2(RC_INT, RC_INT);\n\tr = vtop[-1].r;\n\tfr = vtop[0].r;\n\tvtop--;\n\tC67_MPYI(fr, r);\t// 32 bit bultiply  fr,r,fr\n\tC67_NOP(8);\t\t// NOP 8 for worst case\n\tbreak;\n    case TOK_SHL:\n\tgv2(RC_INT_BSIDE, RC_INT_BSIDE);\t// shift amount must be on same side as dst\n\tr = vtop[-1].r;\n\tfr = vtop[0].r;\n\tvtop--;\n\tC67_SHL(fr, r);\t\t// arithmetic/logical shift\n\tbreak;\n\n    case TOK_SHR:\n\tgv2(RC_INT_BSIDE, RC_INT_BSIDE);\t// shift amount must be on same side as dst\n\tr = vtop[-1].r;\n\tfr = vtop[0].r;\n\tvtop--;\n\tC67_SHRU(fr, r);\t// logical shift\n\tbreak;\n\n    case TOK_SAR:\n\tgv2(RC_INT_BSIDE, RC_INT_BSIDE);\t// shift amount must be on same side as dst\n\tr = vtop[-1].r;\n\tfr = vtop[0].r;\n\tvtop--;\n\tC67_SHR(fr, r);\t\t// arithmetic shift\n\tbreak;\n\n    case '/':\n\tt = TOK__divi;\n      call_func:\n\tvswap();\n\t/* call generic idiv function */\n\tvpush_global_sym(&func_old_type, t);\n\tvrott(3);\n\tgfunc_call(2);\n\tvpushi(0);\n\tvtop->r = REG_IRET;\n\tvtop->r2 = VT_CONST;\n\tbreak;\n    case TOK_UDIV:\n    case TOK_PDIV:\n\tt = TOK__divu;\n\tgoto call_func;\n    case '%':\n\tt = TOK__remi;\n\tgoto call_func;\n    case TOK_UMOD:\n\tt = TOK__remu;\n\tgoto call_func;\n\n    default:\n\topc = 7;\n\tgoto gen_op8;\n    }\n}\n\n/* generate a floating point operation 'v = t1 op t2' instruction. The\n   two operands are guaranted to have the same floating point type */\n/* XXX: need to use ST1 too */\nvoid gen_opf(int op)\n{\n    int ft, fc, fr, r;\n\n    if (op >= TOK_ULT && op <= TOK_GT)\n\tgv2(RC_EDX, RC_EAX);\t// make sure src2 is on b side\n    else\n\tgv2(RC_FLOAT, RC_FLOAT);\t// make sure src2 is on b side\n\n    ft = vtop->type.t;\n    fc = vtop->c.ul;\n    r = vtop->r;\n    fr = vtop[-1].r;\n\n\n    if ((ft & VT_BTYPE) == VT_LDOUBLE)\n\ttcc_error(\"long doubles not supported\");\n\n    if (op >= TOK_ULT && op <= TOK_GT) {\n\n\tr = vtop[-1].r;\n\tfr = vtop[0].r;\n\n\tC67_compare_reg = C67_B2;\n\n\tif (op == TOK_LT) {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE)\n\t\tC67_CMPLTDP(r, fr, C67_B2);\n\t    else\n\t\tC67_CMPLTSP(r, fr, C67_B2);\n\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_GE) {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE)\n\t\tC67_CMPLTDP(r, fr, C67_B2);\n\t    else\n\t\tC67_CMPLTSP(r, fr, C67_B2);\n\n\t    C67_invert_test = TRUE;\n\t} else if (op == TOK_GT) {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE)\n\t\tC67_CMPGTDP(r, fr, C67_B2);\n\t    else\n\t\tC67_CMPGTSP(r, fr, C67_B2);\n\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_LE) {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE)\n\t\tC67_CMPGTDP(r, fr, C67_B2);\n\t    else\n\t\tC67_CMPGTSP(r, fr, C67_B2);\n\n\t    C67_invert_test = TRUE;\n\t} else if (op == TOK_EQ) {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE)\n\t\tC67_CMPEQDP(r, fr, C67_B2);\n\t    else\n\t\tC67_CMPEQSP(r, fr, C67_B2);\n\n\t    C67_invert_test = FALSE;\n\t} else if (op == TOK_NE) {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE)\n\t\tC67_CMPEQDP(r, fr, C67_B2);\n\t    else\n\t\tC67_CMPEQSP(r, fr, C67_B2);\n\n\t    C67_invert_test = TRUE;\n\t} else {\n\t    ALWAYS_ASSERT(FALSE);\n\t}\n\tvtop->r = VT_CMP;\t// tell TCC that result is in \"flags\" actually B2\n    } else {\n\tif (op == '+') {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE) {\n\t\tC67_ADDDP(r, fr);\t// ADD  fr,r,fr\n\t\tC67_NOP(6);\n\t    } else {\n\t\tC67_ADDSP(r, fr);\t// ADD  fr,r,fr\n\t\tC67_NOP(3);\n\t    }\n\t    vtop--;\n\t} else if (op == '-') {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE) {\n\t\tC67_SUBDP(r, fr);\t// SUB  fr,r,fr\n\t\tC67_NOP(6);\n\t    } else {\n\t\tC67_SUBSP(r, fr);\t// SUB  fr,r,fr\n\t\tC67_NOP(3);\n\t    }\n\t    vtop--;\n\t} else if (op == '*') {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE) {\n\t\tC67_MPYDP(r, fr);\t// MPY  fr,r,fr\n\t\tC67_NOP(9);\n\t    } else {\n\t\tC67_MPYSP(r, fr);\t// MPY  fr,r,fr\n\t\tC67_NOP(3);\n\t    }\n\t    vtop--;\n\t} else if (op == '/') {\n\t    if ((ft & VT_BTYPE) == VT_DOUBLE) {\n\t\t// must call intrinsic DP floating point divide\n\t\tvswap();\n\t\t/* call generic idiv function */\n\t\tvpush_global_sym(&func_old_type, TOK__divd);\n\t\tvrott(3);\n\t\tgfunc_call(2);\n\t\tvpushi(0);\n\t\tvtop->r = REG_FRET;\n\t\tvtop->r2 = REG_LRET;\n\n\t    } else {\n\t\t// must call intrinsic SP floating point divide\n\t\tvswap();\n\t\t/* call generic idiv function */\n\t\tvpush_global_sym(&func_old_type, TOK__divf);\n\t\tvrott(3);\n\t\tgfunc_call(2);\n\t\tvpushi(0);\n\t\tvtop->r = REG_FRET;\n\t\tvtop->r2 = VT_CONST;\n\t    }\n\t} else\n\t    ALWAYS_ASSERT(FALSE);\n\n\n    }\n}\n\n\n/* convert integers to fp 't' type. Must handle 'int', 'unsigned int'\n   and 'long long' cases. */\nvoid gen_cvt_itof(int t)\n{\n    int r;\n\n    gv(RC_INT);\n    r = vtop->r;\n\n    if ((t & VT_BTYPE) == VT_DOUBLE) {\n\tif (t & VT_UNSIGNED)\n\t    C67_INTDPU(r, r);\n\telse\n\t    C67_INTDP(r, r);\n\n\tC67_NOP(4);\n\tvtop->type.t = VT_DOUBLE;\n    } else {\n\tif (t & VT_UNSIGNED)\n\t    C67_INTSPU(r, r);\n\telse\n\t    C67_INTSP(r, r);\n\tC67_NOP(3);\n\tvtop->type.t = VT_FLOAT;\n    }\n\n}\n\n/* convert fp to int 't' type */\n/* XXX: handle long long case */\nvoid gen_cvt_ftoi(int t)\n{\n    int r;\n\n    gv(RC_FLOAT);\n    r = vtop->r;\n\n    if (t != VT_INT)\n\ttcc_error(\"long long not supported\");\n    else {\n\tif ((vtop->type.t & VT_BTYPE) == VT_DOUBLE) {\n\t    C67_DPTRUNC(r, r);\n\t    C67_NOP(3);\n\t} else {\n\t    C67_SPTRUNC(r, r);\n\t    C67_NOP(3);\n\t}\n\n\tvtop->type.t = VT_INT;\n\n    }\n}\n\n/* convert from one floating point type to another */\nvoid gen_cvt_ftof(int t)\n{\n    int r, r2;\n\n    if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE &&\n\t(t & VT_BTYPE) == VT_FLOAT) {\n\t// convert double to float\n\n\tgv(RC_FLOAT);\t\t// get it in a register pair\n\n\tr = vtop->r;\n\n\tC67_DPSP(r, r);\t\t// convert it to SP same register\n\tC67_NOP(3);\n\n\tvtop->type.t = VT_FLOAT;\n\tvtop->r2 = VT_CONST;\t// set this as unused\n    } else if ((vtop->type.t & VT_BTYPE) == VT_FLOAT &&\n\t       (t & VT_BTYPE) == VT_DOUBLE) {\n\t// convert float to double\n\n\tgv(RC_FLOAT);\t\t// get it in a register\n\n\tr = vtop->r;\n\n\tif (r == TREG_EAX) {\t// make sure the paired reg is avail\n\t    r2 = get_reg(RC_ECX);\n\t} else if (r == TREG_EDX) {\n\t    r2 = get_reg(RC_ST0);\n\t} else {\n\t    ALWAYS_ASSERT(FALSE);\n            r2 = 0; /* avoid warning */\n        }\n\n\tC67_SPDP(r, r);\t\t// convert it to DP same register\n\tC67_NOP(1);\n\n\tvtop->type.t = VT_DOUBLE;\n\tvtop->r2 = r2;\t\t// set this as unused\n    } else {\n\tALWAYS_ASSERT(FALSE);\n    }\n}\n\n/* computed goto support */\nvoid ggoto(void)\n{\n    gcall_or_jmp(1);\n    vtop--;\n}\n\n/* end of C67 code generator */\n/*************************************************************/\n#endif\n/*************************************************************/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/coff.h",
    "content": "/**************************************************************************/\n/*  COFF.H                                                                */\n/*     COFF data structures and related definitions used by the linker    */\n/**************************************************************************/\n\n/*------------------------------------------------------------------------*/\n/*  COFF FILE HEADER                                                      */\n/*------------------------------------------------------------------------*/\nstruct filehdr {\n        unsigned short  f_magic;        /* magic number */\n        unsigned short  f_nscns;        /* number of sections */\n        long            f_timdat;       /* time & date stamp */\n        long            f_symptr;       /* file pointer to symtab */\n        long            f_nsyms;        /* number of symtab entries */\n        unsigned short  f_opthdr;       /* sizeof(optional hdr) */\n        unsigned short  f_flags;        /* flags */\n        unsigned short  f_TargetID;     /* for C6x = 0x0099 */\n        };\n\n/*------------------------------------------------------------------------*/\n/*  File header flags                                                     */\n/*------------------------------------------------------------------------*/\n#define  F_RELFLG   0x01       /* relocation info stripped from file       */\n#define  F_EXEC     0x02       /* file is executable (no unresolved refs)  */\n#define  F_LNNO     0x04       /* line nunbers stripped from file          */\n#define  F_LSYMS    0x08       /* local symbols stripped from file         */\n#define  F_GSP10    0x10       /* 34010 version                            */\n#define  F_GSP20    0x20       /* 34020 version                            */\n#define  F_SWABD    0x40       /* bytes swabbed (in names)                 */\n#define  F_AR16WR   0x80       /* byte ordering of an AR16WR (PDP-11)      */\n#define  F_LITTLE   0x100      /* byte ordering of an AR32WR (vax)         */\n#define  F_BIG      0x200      /* byte ordering of an AR32W (3B, maxi)     */\n#define  F_PATCH    0x400      /* contains \"patch\" list in optional header */\n#define  F_NODF     0x400   \n\n#define F_VERSION    (F_GSP10  | F_GSP20)   \n#define F_BYTE_ORDER (F_LITTLE | F_BIG)\n#define FILHDR  struct filehdr\n\n//#define FILHSZ  sizeof(FILHDR) \n#define FILHSZ  22                // above rounds to align on 4 bytes which causes problems \n\n#define COFF_C67_MAGIC 0x00c2\n\n/*------------------------------------------------------------------------*/\n/*  Macros to recognize magic numbers                                     */\n/*------------------------------------------------------------------------*/\n#define ISMAGIC(x)      (((unsigned short)(x))==(unsigned short)magic)\n#define ISARCHIVE(x)    ((((unsigned short)(x))==(unsigned short)ARTYPE))\n#define BADMAGIC(x)     (((unsigned short)(x) & 0x8080) && !ISMAGIC(x))\n\n\f\n/*------------------------------------------------------------------------*/\n/*  OPTIONAL FILE HEADER                                                  */\n/*------------------------------------------------------------------------*/\ntypedef struct aouthdr {\n        short   magic;          /* see magic.h                          */\n        short   vstamp;         /* version stamp                        */\n        long    tsize;          /* text size in bytes, padded to FW bdry*/\n        long    dsize;          /* initialized data \"  \"                */\n        long    bsize;          /* uninitialized data \"   \"             */\n        long    entrypt;        /* entry pt.                            */\n        long    text_start;     /* base of text used for this file      */\n        long    data_start;     /* base of data used for this file      */\n} AOUTHDR;\n\n#define AOUTSZ  sizeof(AOUTHDR)\n\n/*----------------------------------------------------------------------*/\n/*      When a UNIX aout header is to be built in the optional header,  */\n/*      the following magic numbers can appear in that header:          */ \n/*                                                                      */\n/*              AOUT1MAGIC : default : readonly sharable text segment   */\n/*              AOUT2MAGIC:          : writable text segment            */\n/*              PAGEMAGIC  :         : configured for paging            */\n/*----------------------------------------------------------------------*/\n#define AOUT1MAGIC 0410\n#define AOUT2MAGIC 0407\n#define PAGEMAGIC  0413\n\n\f\n/*------------------------------------------------------------------------*/\n/*  COMMON ARCHIVE FILE STRUCTURES                                        */\n/*                                                                        */\n/*       ARCHIVE File Organization:                                       */\n/*       _______________________________________________                  */\n/*       |__________ARCHIVE_MAGIC_STRING_______________|                  */\n/*       |__________ARCHIVE_FILE_MEMBER_1______________|                  */\n/*       |                                             |                  */\n/*       |       Archive File Header \"ar_hdr\"          |                  */\n/*       |.............................................|                  */\n/*       |       Member Contents                       |                  */\n/*       |               1. External symbol directory  |                  */\n/*       |               2. Text file                  |                  */\n/*       |_____________________________________________|                  */\n/*       |________ARCHIVE_FILE_MEMBER_2________________|                  */\n/*       |               \"ar_hdr\"                      |                  */\n/*       |.............................................|                  */\n/*       |       Member Contents (.o or text file)     |                  */\n/*       |_____________________________________________|                  */\n/*       |       .               .               .     |                  */\n/*       |       .               .               .     |                  */\n/*       |       .               .               .     |                  */\n/*       |_____________________________________________|                  */\n/*       |________ARCHIVE_FILE_MEMBER_n________________|                  */\n/*       |               \"ar_hdr\"                      |                  */\n/*       |.............................................|                  */\n/*       |               Member Contents               |                  */\n/*       |_____________________________________________|                  */\n/*                                                                        */\n/*------------------------------------------------------------------------*/\n\n#define COFF_ARMAG   \"!<arch>\\n\"\n#define SARMAG  8\n#define ARFMAG  \"`\\n\"\n\nstruct ar_hdr           /* archive file member header - printable ascii */\n{\n        char    ar_name[16];    /* file member name - `/' terminated */\n        char    ar_date[12];    /* file member date - decimal */\n        char    ar_uid[6];      /* file member user id - decimal */\n        char    ar_gid[6];      /* file member group id - decimal */\n        char    ar_mode[8];     /* file member mode - octal */\n        char    ar_size[10];    /* file member size - decimal */\n        char    ar_fmag[2];     /* ARFMAG - string to end header */\n};\n\n\f\n/*------------------------------------------------------------------------*/\n/*  SECTION HEADER                                                        */\n/*------------------------------------------------------------------------*/\nstruct scnhdr {\n        char            s_name[8];      /* section name */\n        long            s_paddr;        /* physical address */\n        long            s_vaddr;        /* virtual address */\n        long            s_size;         /* section size */\n        long            s_scnptr;       /* file ptr to raw data for section */\n        long            s_relptr;       /* file ptr to relocation */\n        long            s_lnnoptr;      /* file ptr to line numbers */\n        unsigned int\ts_nreloc;       /* number of relocation entries */\n        unsigned int\ts_nlnno;        /* number of line number entries */\n        unsigned int\ts_flags;        /* flags */\n\t\tunsigned short\ts_reserved;     /* reserved byte */\n\t\tunsigned short  s_page;         /* memory page id */\n        };\n\n#define SCNHDR  struct scnhdr\n#define SCNHSZ  sizeof(SCNHDR)\n\n/*------------------------------------------------------------------------*/\n/* Define constants for names of \"special\" sections                       */\n/*------------------------------------------------------------------------*/\n//#define _TEXT    \".text\"\n#define _DATA    \".data\"\n#define _BSS     \".bss\"\n#define _CINIT   \".cinit\"\n#define _TV      \".tv\"\n\n/*------------------------------------------------------------------------*/\n/* The low 4 bits of s_flags is used as a section \"type\"                  */\n/*------------------------------------------------------------------------*/\n#define STYP_REG    0x00  /* \"regular\" : allocated, relocated, loaded */\n#define STYP_DSECT  0x01  /* \"dummy\"   : not allocated, relocated, not loaded */\n#define STYP_NOLOAD 0x02  /* \"noload\"  : allocated, relocated, not loaded */\n#define STYP_GROUP  0x04  /* \"grouped\" : formed of input sections */\n#define STYP_PAD    0x08  /* \"padding\" : not allocated, not relocated, loaded */\n#define STYP_COPY   0x10  /* \"copy\"    : used for C init tables - \n                                                not allocated, relocated,\n                                                loaded;  reloc & lineno\n                                                entries processed normally */\n#define STYP_TEXT   0x20   /* section contains text only */\n#define STYP_DATA   0x40   /* section contains data only */\n#define STYP_BSS    0x80   /* section contains bss only */\n\n#define STYP_ALIGN  0x100  /* align flag passed by old version assemblers */\n#define ALIGN_MASK  0x0F00 /* part of s_flags that is used for align vals */\n#define ALIGNSIZE(x) (1 << ((x & ALIGN_MASK) >> 8))\n\n\f\n/*------------------------------------------------------------------------*/\n/*  RELOCATION ENTRIES                                                    */\n/*------------------------------------------------------------------------*/\nstruct reloc\n{\n   long            r_vaddr;        /* (virtual) address of reference */\n   short           r_symndx;       /* index into symbol table */\n   unsigned short  r_disp;         /* additional bits for address calculation */\n   unsigned short  r_type;         /* relocation type */\n};\n\n#define RELOC   struct reloc\n#define RELSZ   10                 /* sizeof(RELOC) */\n\n/*--------------------------------------------------------------------------*/\n/*   define all relocation types                                            */\n/*--------------------------------------------------------------------------*/\n\n#define R_ABS           0         /* absolute address - no relocation       */\n#define R_DIR16         01        /* UNUSED                                 */\n#define R_REL16         02        /* UNUSED                                 */\n#define R_DIR24         04        /* UNUSED                                 */\n#define R_REL24         05        /* 24 bits, direct                        */\n#define R_DIR32         06        /* UNUSED                                 */\n#define R_RELBYTE      017        /* 8 bits, direct                         */\n#define R_RELWORD      020        /* 16 bits, direct                        */\n#define R_RELLONG      021        /* 32 bits, direct                        */\n#define R_PCRBYTE      022        /* 8 bits, PC-relative                    */\n#define R_PCRWORD      023        /* 16 bits, PC-relative                   */\n#define R_PCRLONG      024        /* 32 bits, PC-relative                   */\n#define R_OCRLONG      030        /* GSP: 32 bits, one's complement direct  */\n#define R_GSPPCR16     031        /* GSP: 16 bits, PC relative (in words)   */\n#define R_GSPOPR32     032        /* GSP: 32 bits, direct big-endian        */\n#define R_PARTLS16     040        /* Brahma: 16 bit offset of 24 bit address*/\n#define R_PARTMS8      041        /* Brahma: 8 bit page of 24 bit address   */\n#define R_PARTLS7      050        /* DSP: 7 bit offset of 16 bit address    */\n#define R_PARTMS9      051        /* DSP: 9 bit page of 16 bit address      */\n#define R_REL13        052        /* DSP: 13 bits, direct                   */\n\n\f\n/*------------------------------------------------------------------------*/\n/*  LINE NUMBER ENTRIES                                                   */\n/*------------------------------------------------------------------------*/\nstruct lineno\n{\n        union\n        {\n                long    l_symndx ;      /* sym. table index of function name\n                                                iff l_lnno == 0      */\n                long    l_paddr ;       /* (physical) address of line number */\n        }               l_addr ;\n        unsigned short  l_lnno ;        /* line number */\n};\n\n#define LINENO  struct lineno\n#define LINESZ  6       /* sizeof(LINENO) */\n\n\f\n/*------------------------------------------------------------------------*/\n/*   STORAGE CLASSES                                                      */\n/*------------------------------------------------------------------------*/\n#define  C_EFCN          -1    /* physical end of function */\n#define  C_NULL          0\n#define  C_AUTO          1     /* automatic variable */\n#define  C_EXT           2     /* external symbol */\n#define  C_STAT          3     /* static */\n#define  C_REG           4     /* register variable */\n#define  C_EXTDEF        5     /* external definition */\n#define  C_LABEL         6     /* label */\n#define  C_ULABEL        7     /* undefined label */\n#define  C_MOS           8     /* member of structure */\n#define  C_ARG           9     /* function argument */\n#define  C_STRTAG        10    /* structure tag */\n#define  C_MOU           11    /* member of union */\n#define  C_UNTAG         12    /* union tag */\n#define  C_TPDEF         13    /* type definition */\n#define C_USTATIC        14    /* undefined static */\n#define  C_ENTAG         15    /* enumeration tag */\n#define  C_MOE           16    /* member of enumeration */\n#define  C_REGPARM       17    /* register parameter */\n#define  C_FIELD         18    /* bit field */\n\n#define  C_BLOCK         100   /* \".bb\" or \".eb\" */\n#define  C_FCN           101   /* \".bf\" or \".ef\" */\n#define  C_EOS           102   /* end of structure */\n#define  C_FILE          103   /* file name */\n#define  C_LINE          104   /* dummy sclass for line number entry */\n#define  C_ALIAS         105   /* duplicate tag */\n#define  C_HIDDEN        106   /* special storage class for external */\n                               /* symbols in dmert public libraries  */\n\f\n/*------------------------------------------------------------------------*/\n/*  SYMBOL TABLE ENTRIES                                                  */\n/*------------------------------------------------------------------------*/\n\n#define  SYMNMLEN   8      /*  Number of characters in a symbol name */\n#define  FILNMLEN   14     /*  Number of characters in a file name */\n#define  DIMNUM     4      /*  Number of array dimensions in auxiliary entry */\n\n\nstruct syment\n{\n        union\n        {\n                char            _n_name[SYMNMLEN];      /* old COFF version */\n                struct\n                {\n                        long    _n_zeroes;      /* new == 0 */\n                        long    _n_offset;      /* offset into string table */\n                } _n_n;\n                char            *_n_nptr[2];    /* allows for overlaying */\n        } _n;\n        long                    n_value;        /* value of symbol */\n        short                   n_scnum;        /* section number */\n        unsigned short          n_type;         /* type and derived type */\n        char                    n_sclass;       /* storage class */\n        char                    n_numaux;       /* number of aux. entries */\n};\n\n#define n_name          _n._n_name\n#define n_nptr          _n._n_nptr[1]\n#define n_zeroes        _n._n_n._n_zeroes\n#define n_offset        _n._n_n._n_offset\n\n/*------------------------------------------------------------------------*/\n/* Relocatable symbols have a section number of the                       */\n/* section in which they are defined.  Otherwise, section                 */\n/* numbers have the following meanings:                                   */\n/*------------------------------------------------------------------------*/\n#define  N_UNDEF  0                     /* undefined symbol */\n#define  N_ABS    -1                    /* value of symbol is absolute */\n#define  N_DEBUG  -2                    /* special debugging symbol  */\n#define  N_TV     (unsigned short)-3    /* needs transfer vector (preload) */\n#define  P_TV     (unsigned short)-4    /* needs transfer vector (postload) */\n\n\f\n/*------------------------------------------------------------------------*/\n/* The fundamental type of a symbol packed into the low                   */\n/* 4 bits of the word.                                                    */\n/*------------------------------------------------------------------------*/\n#define  _EF    \".ef\"\n\n#define  T_NULL     0          /* no type info */\n#define  T_ARG      1          /* function argument (only used by compiler) */\n#define  T_CHAR     2          /* character */\n#define  T_SHORT    3          /* short integer */\n#define  T_INT      4          /* integer */\n#define  T_LONG     5          /* long integer */\n#define  T_FLOAT    6          /* floating point */\n#define  T_DOUBLE   7          /* double word */\n#define  T_STRUCT   8          /* structure  */\n#define  T_UNION    9          /* union  */\n#define  T_ENUM     10         /* enumeration  */\n#define  T_MOE      11         /* member of enumeration */\n#define  T_UCHAR    12         /* unsigned character */\n#define  T_USHORT   13         /* unsigned short */\n#define  T_UINT     14         /* unsigned integer */\n#define  T_ULONG    15         /* unsigned long */\n\n/*------------------------------------------------------------------------*/\n/* derived types are:                                                     */\n/*------------------------------------------------------------------------*/\n#define  DT_NON      0          /* no derived type */\n#define  DT_PTR      1          /* pointer */\n#define  DT_FCN      2          /* function */\n#define  DT_ARY      3          /* array */\n\n#define MKTYPE(basic, d1,d2,d3,d4,d5,d6) \\\n       ((basic) | ((d1) <<  4) | ((d2) <<  6) | ((d3) <<  8) |\\\n                  ((d4) << 10) | ((d5) << 12) | ((d6) << 14))\n\n/*------------------------------------------------------------------------*/\n/* type packing constants and macros                                      */\n/*------------------------------------------------------------------------*/\n#define  N_BTMASK_COFF     017\n#define  N_TMASK_COFF      060\n#define  N_TMASK1_COFF     0300\n#define  N_TMASK2_COFF     0360\n#define  N_BTSHFT_COFF     4\n#define  N_TSHIFT_COFF     2\n\n#define  BTYPE_COFF(x)  ((x) & N_BTMASK_COFF)  \n#define  ISINT(x)  (((x) >= T_CHAR && (x) <= T_LONG) ||   \\\n\t\t    ((x) >= T_UCHAR && (x) <= T_ULONG) || (x) == T_ENUM)\n#define  ISFLT_COFF(x)  ((x) == T_DOUBLE || (x) == T_FLOAT)\n#define  ISPTR_COFF(x)  (((x) & N_TMASK_COFF) == (DT_PTR << N_BTSHFT_COFF)) \n#define  ISFCN_COFF(x)  (((x) & N_TMASK_COFF) == (DT_FCN << N_BTSHFT_COFF))\n#define  ISARY_COFF(x)  (((x) & N_TMASK_COFF) == (DT_ARY << N_BTSHFT_COFF))\n#define  ISTAG_COFF(x)  ((x)==C_STRTAG || (x)==C_UNTAG || (x)==C_ENTAG)\n\n#define  INCREF_COFF(x) ((((x)&~N_BTMASK_COFF)<<N_TSHIFT_COFF)|(DT_PTR<<N_BTSHFT_COFF)|(x&N_BTMASK_COFF))\n#define  DECREF_COFF(x) ((((x)>>N_TSHIFT_COFF)&~N_BTMASK_COFF)|((x)&N_BTMASK_COFF))\n\n\f\n/*------------------------------------------------------------------------*/\n/*  AUXILIARY SYMBOL ENTRY                                                */\n/*------------------------------------------------------------------------*/\nunion auxent\n{\n\tstruct\n\t{\n\t\tlong            x_tagndx;       /* str, un, or enum tag indx */\n\t\tunion\n\t\t{\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tunsigned short  x_lnno; /* declaration line number */\n\t\t\t\tunsigned short  x_size; /* str, union, array size */\n\t\t\t} x_lnsz;\n\t\t\tlong    x_fsize;        /* size of function */\n\t\t} x_misc;\n\t\tunion\n\t\t{\n\t\t\tstruct                  /* if ISFCN, tag, or .bb */\n\t\t\t{\n\t\t\t\tlong    x_lnnoptr;      /* ptr to fcn line # */\n\t\t\t\tlong    x_endndx;       /* entry ndx past block end */\n\t\t\t}       x_fcn;\n\t\t\tstruct                  /* if ISARY, up to 4 dimen. */\n\t\t\t{\n\t\t\t\tunsigned short  x_dimen[DIMNUM];\n\t\t\t}       x_ary;\n\t\t}               x_fcnary;\n\t\tunsigned short  x_regcount;   /* number of registers used by func */\n\t}       x_sym;\n\tstruct\n\t{\n\t\tchar    x_fname[FILNMLEN];\n\t}       x_file;\n\tstruct\n\t{\n\t\tlong    x_scnlen;          /* section length */\n\t\tunsigned short  x_nreloc;  /* number of relocation entries */\n\t\tunsigned short  x_nlinno;  /* number of line numbers */\n\t}       x_scn;\n};\n\n#define SYMENT  struct syment\n#define SYMESZ  18      /* sizeof(SYMENT) */\n\n#define AUXENT  union auxent\n#define AUXESZ  18      /* sizeof(AUXENT) */\n\n/*------------------------------------------------------------------------*/\n/*  NAMES OF \"SPECIAL\" SYMBOLS                                            */\n/*------------------------------------------------------------------------*/\n#define _STEXT          \".text\"\n#define _ETEXT          \"etext\"\n#define _SDATA          \".data\"\n#define _EDATA          \"edata\"\n#define _SBSS           \".bss\"\n#define _END            \"end\"\n#define _CINITPTR       \"cinit\"\n\n/*--------------------------------------------------------------------------*/\n/*  ENTRY POINT SYMBOLS                                                     */\n/*--------------------------------------------------------------------------*/\n#define _START          \"_start\"\n#define _MAIN           \"_main\"\n    /*  _CSTART         \"_c_int00\"          (defined in params.h)  */\n\n\n#define _TVORIG         \"_tvorig\"\n#define _TORIGIN        \"_torigin\"\n#define _DORIGIN        \"_dorigin\"\n\n#define _SORIGIN        \"_sorigin\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/config.h",
    "content": "/* Automatically generated by configure - do not modify */\n#ifndef CONFIG_TCCDIR\n# define CONFIG_TCCDIR \"/usr/local/lib/tcc\"\n#endif\n#define GCC_MAJOR \n#define GCC_MINOR \n#define HOST_ARM 1\n#define TCC_ARM_VERSION 5\n#define TCC_VERSION \"0.9.26\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/configure",
    "content": "#!/bin/sh\n#\n# tcc configure script (c) 2003 Fabrice Bellard\n\n# set temporary file name\n# if test ! -z \"$TMPDIR\" ; then\n#     TMPDIR1=\"${TMPDIR}\"\n# elif test ! -z \"$TEMPDIR\" ; then\n#     TMPDIR1=\"${TEMPDIR}\"\n# else\n#     TMPDIR1=\"/tmp\"\n# fi\n#\n# bashism: TMPN=\"${TMPDIR1}/tcc-conf-${RANDOM}-$$-${RANDOM}.c\"\n\nTMPN=\"./conftest-$$\"\nTMPH=$TMPN.h\n\n# default parameters\nbuild_cross=\"no\"\nuse_libgcc=\"no\"\nprefix=\"\"\nexecprefix=\"\"\nbindir=\"\"\nlibdir=\"\"\ntccdir=\"\"\nincludedir=\"\"\nmandir=\"\"\ninfodir=\"\"\nsysroot=\"\"\ncross_prefix=\"\"\ncc=\"gcc\"\nhost_cc=\"gcc\"\nar=\"ar\"\nstrip=\"strip\"\ncygwin=\"no\"\ngprof=\"no\"\nbigendian=\"no\"\nmingw32=\"no\"\nLIBSUF=\".a\"\nEXESUF=\"\"\ntcc_sysincludepaths=\"\"\ntcc_libpaths=\"\"\ntcc_crtprefix=\"\"\ntcc_elfinterp=\"\"\ntcc_lddir=\nconfvars=\n\n#cpu=`uname -m`\ncpu=\"armv5tel\"\n\n# OS specific\ntargetos=`uname -s`\ncase $targetos in\n  MINGW32*)  mingw32=yes;;\n  DragonFly) noldl=yes;;\n  OpenBSD)   noldl=yes;;\n  *) ;;\nesac\n\n# find source path\n# XXX: we assume an absolute path is given when launching configure, \n# except in './configure' case.\nsource_path=${0%configure}\nsource_path=${source_path%/}\nsource_path_used=\"yes\"\nif test -z \"$source_path\" -o \"$source_path\" = \".\" ; then\n    source_path=`pwd`\n    source_path_used=\"no\"\nfi\n\ncase \"$cpu\" in\n  i386|i486|i586|i686|i86pc|BePC|i686-AT386)\n    cpu=\"x86\"\n  ;;\n  x86_64)\n    cpu=\"x86-64\"\n  ;;\n  arm*)\n    case \"$cpu\" in\n      arm|armv4l)\n        cpuver=4\n      ;;\n      armv5tel|armv5tejl)\n        cpuver=5\n      ;;\n      armv6j|armv6l)\n        cpuver=6\n      ;;\n      armv7a|armv7l)\n        cpuver=7\n      ;;\n    esac\n    cpu=\"armv4l\"\n  ;;\n  alpha)\n    cpu=\"alpha\"\n  ;;\n  \"Power Macintosh\"|ppc|ppc64)\n    cpu=\"powerpc\"\n  ;;\n  mips)\n    cpu=\"mips\"\n  ;;\n  s390)\n    cpu=\"s390\"\n  ;;\n  *)\n    cpu=\"unknown\"\n  ;;\nesac\n\nfor opt do\n  eval opt=\\\"$opt\\\"\n  case \"$opt\" in\n  --prefix=*) prefix=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --exec-prefix=*) execprefix=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --tccdir=*) tccdir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --bindir=*) bindir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --libdir=*) libdir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --includedir=*) includedir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --sharedir=*) sharedir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --mandir=*) mandir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --infodir=*) infodir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --docdir=*) docdir=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --sysroot=*) sysroot=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --source-path=*) source_path=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --cross-prefix=*) cross_prefix=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --cc=*) cc=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --extra-cflags=*) CFLAGS=\"${opt#--extra-cflags=}\"\n  ;;\n  --extra-ldflags=*) LDFLAGS=\"${opt#--extra-ldflags=}\"\n  ;;\n  --extra-libs=*) extralibs=${opt#--extra-libs=}\n  ;;\n  --sysincludepaths=*) tcc_sysincludepaths=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --libpaths=*) tcc_libpaths=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --crtprefix=*) tcc_crtprefix=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --elfinterp=*) tcc_elfinterp=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --cpu=*) cpu=`echo $opt | cut -d '=' -f 2`\n  ;;\n  --enable-gprof) gprof=\"yes\"\n  ;;\n  --enable-mingw32) mingw32=\"yes\" ; cross_prefix=\"i686-pc-mingw32-\" ; cpu=x86\n  ;;\n  --enable-cygwin) mingw32=\"yes\" ; cygwin=\"yes\" ; cross_prefix=\"mingw32-\" ; cpu=x86\n  ;;\n  --enable-cross) build_cross=\"yes\"\n  ;;\n  --disable-static) disable_static=\"yes\"\n  ;;\n  --disable-rpath) disable_rpath=\"yes\"\n  ;;\n  --strip-binaries) strip_binaries=\"yes\"\n  ;;\n  --with-libgcc) use_libgcc=\"yes\"\n  ;;\n  --with-selinux) have_selinux=\"yes\"\n  ;;\n  --help|-h) show_help=\"yes\"\n  ;;\n  *) echo \"configure: WARNING: unrecognized option $opt\"\n  ;;\n  esac\ndone\n\n# Checking for CFLAGS\nif test -z \"$CFLAGS\"; then\n    CFLAGS=\"-Wall -g -O2\"\nfi\n\nif test \"$mingw32\" = \"yes\" ; then\n    if test x\"$tccdir\" = x\"\"; then\n    tccdir=\"tcc\"\n    fi\n    if test -z \"$prefix\" ; then\n    prefix=\"C:/Program Files/${tccdir}\"\n    fi\n    if test -z \"$sharedir\" ; then\n    sharedir=\"${prefix}\"\n    fi\n    execprefix=\"$prefix\"\n    bindir=\"${prefix}\"\n    tccdir=\"${prefix}\"\n    libdir=\"${prefix}/lib\"\n    docdir=\"${sharedir}/doc\"\n    mandir=\"${sharedir}/man\"\n    infodir=\"${sharedir}/info\"\n    LIBSUF=\".lib\"\n    EXESUF=\".exe\"\nelse\n    if test -z \"$prefix\" ; then\n    prefix=\"/usr/local\"\n    fi\n    if test -z \"$sharedir\" ; then\n    sharedir=\"${prefix}/share\"\n    fi\n    if test x\"$execprefix\" = x\"\"; then\n    execprefix=\"${prefix}\"\n    fi\n    if test x\"$libdir\" = x\"\"; then\n    libdir=\"${execprefix}/lib\"\n    fi\n    if test x\"$bindir\" = x\"\"; then\n    bindir=\"${execprefix}/bin\"\n    fi\n    if test x\"$tccdir\" = x\"\"; then\n    tccdir=\"tcc\"\n    fi\n    if test x\"$docdir\" = x\"\"; then\n    docdir=\"${sharedir}/doc/${tccdir}\"\n    fi\n    if test x\"$mandir\" = x\"\"; then\n    mandir=\"${sharedir}/man\"\n    fi\n    if test x\"$infodir\" = x\"\"; then\n    infodir=\"${sharedir}/info\"\n    fi\n    tccdir=\"${libdir}/${tccdir}\"\nfi # mingw32\n\nif test x\"$includedir\" = x\"\"; then\nincludedir=\"${prefix}/include\"\nfi\n\nif test x\"$show_help\" = \"xyes\" ; then\ncat << EOF\nUsage: configure [options]\nOptions: [defaults in brackets after descriptions]\n\nStandard options:\n  --help                   print this message\n  --prefix=PREFIX          install in PREFIX [$prefix]\n  --exec-prefix=EPREFIX    install architecture-dependent files in EPREFIX\n                           [same as prefix]\n  --bindir=DIR             user executables in DIR [EPREFIX/bin]\n  --libdir=DIR             object code libraries in DIR [EPREFIX/lib]\n  --tccdir=DIR             installation directory [EPREFIX/lib/tcc]\n  --includedir=DIR         C header files in DIR [PREFIX/include]\n  --sharedir=DIR           documentation root DIR [PREFIX/share]\n  --docdir=DIR             documentation in DIR [SHAREDIR/doc/tcc]\n  --mandir=DIR             man documentation in DIR [SHAREDIR/man]\n  --infodir=DIR            info documentation in DIR [SHAREDIR/info]\n\nAdvanced options (experts only):\n  --source-path=PATH       path of source code [$source_path]\n  --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]\n  --sysroot=PREFIX         prepend PREFIX to library/include paths []\n  --cc=CC                  use C compiler CC [$cc]\n  --extra-cflags=          specify compiler flags [$CFLAGS]\n  --extra-ldflags=         specify linker options []\n  --strip-binaries         strip symbol tables from resulting binaries\n  --disable-static         make libtcc.so instead of libtcc.a\n  --disable-rpath          disable use of -rpath with the above\n  --with-libgcc            use /lib/libgcc_s.so.1 instead of libtcc.a\n  --enable-mingw32         build windows version on linux with mingw32\n  --enable-cygwin          build windows version on windows with cygwin\n  --enable-cross           build cross compilers\n  --with-selinux           use mmap for exec mem [needs writable /tmp]\n  --sysincludepaths=...    specify system include paths, colon separated\n  --libpaths=...           specify system library paths, colon separated\n  --crtprefix=...          specify locations of crt?.o, colon separated\n  --elfinterp=...          specify elf interpreter\nEOF\n#echo \"NOTE: The object files are build at the place where configure is launched\"\nexit 1\nfi\n\ncc=\"${cross_prefix}${cc}\"\nar=\"${cross_prefix}${ar}\"\nstrip=\"${cross_prefix}${strip}\"\n\nCONFTEST=./conftest$EXESUF\n\nif test -z \"$cross_prefix\" ; then\n  if ! $cc -o $CONFTEST $source_path/conftest.c 2>/dev/null ; then\n    echo \"configure: error: '$cc' failed to compile conftest.c.\"\n  else\n    bigendian=\"$($CONFTEST bigendian)\"\n    gcc_major=\"$($CONFTEST version)\"\n    gcc_minor=\"$($CONFTEST minor)\"\n    if test \"$mingw32\" = \"no\" ; then\n      triplet=\"$($CONFTEST triplet)\"\n      if test -f \"/usr/lib/$triplet/crti.o\" ; then\n        tcc_lddir=\"lib/$triplet\"\n        multiarch_triplet=\"$triplet\"\n      elif test -f \"/usr/lib64/crti.o\" ; then\n        tcc_lddir=\"lib64\"\n      fi\n\n      if test \"$cpu\" = \"armv4l\" ; then\n        if test \"${triplet%eabihf}\" != \"$triplet\" ; then\n           confvars=\"$confvars arm_eabihf\"\n        elif test \"${triplet%eabi}\" != \"$triplet\" ; then\n           confvars=\"$confvars arm_eabi\"\n        fi\n        if grep -s -q \"^Features.* \\(vfp\\|iwmmxt\\) \" /proc/cpuinfo ; then\n           confvars=\"$confvars arm_vfp\"\n        fi\n      fi\n\n#      multiarch_triplet=${libc_dir#*/}\n#      multiarch_triplet=${multiarch_triplet%/}\n#      tcc_lddir=\"${libc_dir%%/*}\"\n#      if test -n \"$multiarch_triplet\" ; then\n#        tcc_lddir=\"$tcc_lddir/$multiarch_triplet\"\n#      fi\n\n      if test -f \"/lib/ld-uClibc.so.0\" ; then\n        confvars=\"$confvars uClibc\"\n      fi\n# gr: maybe for after the release:\n#       tcc_elfinterp=\"$(ldd $CONFTEST | grep 'ld.*.so' | sed 's,\\s*\\(\\S\\+\\).*,\\1,')\"\n       # echo \"elfinterp           $tcc_elfinterp\"\n\n    fi\n  fi\nelse\n  # if cross compiling, cannot launch a program, so make a static guess\n  case $cpu in\n    powerpc|mips|s390)  bigendian=yes;;\n  esac\nfi\n\ncat <<EOF\nBinary  directory   $bindir\nTinyCC directory    $tccdir\nLibrary directory   $libdir\nInclude directory   $includedir\nManual directory    $mandir\nInfo directory      $infodir\nDoc directory       $docdir\nTarget root prefix  $sysroot\nSource path      $source_path\nC compiler       $cc\nTarget OS        $targetos\nCPU              $cpu\nBig Endian       $bigendian\ngprof enabled    $gprof\ncross compilers  $build_cross\nuse libgcc       $use_libgcc\nEOF\n\necho \"Creating config.mak and config.h\"\n\ncat >config.mak <<EOF\n# Automatically generated by configure - do not modify\nprefix=$prefix\nbindir=\\$(DESTDIR)$bindir\ntccdir=\\$(DESTDIR)$tccdir\nlibdir=\\$(DESTDIR)$libdir\nln_libdir=$libdir\nincludedir=\\$(DESTDIR)$includedir\nmandir=\\$(DESTDIR)$mandir\ninfodir=\\$(DESTDIR)$infodir\ndocdir=\\$(DESTDIR)$docdir\nCC=$cc\nGCC_MAJOR=$gcc_major\nGCC_MINOR=$gcc_minor\nHOST_CC=$host_cc\nAR=$ar\nSTRIP=$strip -s -R .comment -R .note\nCFLAGS=$CFLAGS\nLDFLAGS=$LDFLAGS\nLIBSUF=$LIBSUF\nEXESUF=$EXESUF\nEOF\n\nprint_inc() {\n  if test -n \"$2\"; then\n    echo \"#ifndef $1\" >> $TMPH\n    echo \"# define $1 \\\"$2\\\"\" >> $TMPH\n    echo \"#endif\" >> $TMPH\n  fi\n}\nprint_mak() {\n  if test -n \"$2\"; then\n    echo \"NATIVE_DEFINES+=-D$1=\\\"\\\\\\\"$2\\\\\\\"\\\"\" >> config.mak\n  fi\n}\n\necho \"/* Automatically generated by configure - do not modify */\" > $TMPH\n\nprint_inc CONFIG_SYSROOT \"$sysroot\"\nprint_inc CONFIG_TCCDIR \"$tccdir\"\nprint_mak CONFIG_TCC_SYSINCLUDEPATHS \"$tcc_sysincludepaths\"\nprint_mak CONFIG_TCC_LIBPATHS \"$tcc_libpaths\"\nprint_mak CONFIG_TCC_CRTPREFIX \"$tcc_crtprefix\"\nprint_mak CONFIG_TCC_ELFINTERP \"$tcc_elfinterp\"\nprint_mak CONFIG_LDDIR \"$tcc_lddir\"\nprint_mak CONFIG_MULTIARCHDIR \"$multiarch_triplet\"\n\necho \"#define GCC_MAJOR $gcc_major\" >> $TMPH\necho \"#define GCC_MINOR $gcc_minor\" >> $TMPH\n\nif test \"$cpu\" = \"x86\" ; then\n  echo \"ARCH=i386\" >> config.mak\n  echo \"#define HOST_I386 1\" >> $TMPH\nelif test \"$cpu\" = \"x86-64\" ; then\n  echo \"ARCH=x86-64\" >> config.mak\n  echo \"#define HOST_X86_64 1\" >> $TMPH\nelif test \"$cpu\" = \"armv4l\" ; then\n  echo \"ARCH=arm\" >> config.mak\n  echo \"#define HOST_ARM 1\" >> $TMPH\n  echo \"#define TCC_ARM_VERSION $cpuver\" >> $TMPH\nelif test \"$cpu\" = \"powerpc\" ; then\n  echo \"ARCH=ppc\" >> config.mak\n  echo \"#define HOST_PPC 1\" >> $TMPH\nelif test \"$cpu\" = \"mips\" ; then\n  echo \"ARCH=mips\" >> config.mak\n  echo \"#define HOST_MIPS 1\" >> $TMPH\nelif test \"$cpu\" = \"s390\" ; then\n  echo \"ARCH=s390\" >> config.mak\n  echo \"#define HOST_S390 1\" >> $TMPH\nelif test \"$cpu\" = \"alpha\" ; then\n  echo \"ARCH=alpha\" >> config.mak\n  echo \"#define HOST_ALPHA 1\" >> $TMPH\nelse\n  echo \"Unsupported CPU\"\n  exit 1\nfi\n\necho \"TARGETOS=$targetos\" >> config.mak\n\nfor v in $confvars ; do\n  echo \"CONFIG_$v=yes\" >> config.mak\ndone\nif test \"$noldl\" = \"yes\" ; then\n  echo \"CONFIG_NOLDL=yes\" >> config.mak\nfi\nif test \"$mingw32\" = \"yes\" ; then\n  echo \"CONFIG_WIN32=yes\" >> config.mak\n  echo \"#define CONFIG_WIN32 1\" >> $TMPH\nfi\nif test \"$cygwin\" = \"yes\" ; then\n  echo \"#ifndef _WIN32\" >> $TMPH\n  echo \"# define _WIN32\" >> $TMPH\n  echo \"#endif\" >> $TMPH\n  echo \"AR=ar\" >> config.mak\nfi\nif test \"$bigendian\" = \"yes\" ; then\n  echo \"WORDS_BIGENDIAN=yes\" >> config.mak\n  echo \"#define WORDS_BIGENDIAN 1\" >> $TMPH\nfi\nif test \"$gprof\" = \"yes\" ; then\n  echo \"TARGET_GPROF=yes\" >> config.mak\n  echo \"#define HAVE_GPROF 1\" >> $TMPH\nfi\nif test \"$build_cross\" = \"yes\" ; then\n  echo \"CONFIG_CROSS=yes\" >> config.mak\nfi\nif test \"$disable_static\" = \"yes\" ; then\n  echo \"DISABLE_STATIC=yes\" >> config.mak\nfi\nif test \"$disable_rpath\" = \"yes\" ; then\n  echo \"DISABLE_RPATH=yes\" >> config.mak\nfi\nif test \"$strip_binaries\" = \"yes\" ; then\n  echo \"STRIP_BINARIES=yes\" >> config.mak\nfi\nif test \"$use_libgcc\" = \"yes\" ; then\n  echo \"#define CONFIG_USE_LIBGCC\" >> $TMPH\n  echo \"CONFIG_USE_LIBGCC=yes\" >> config.mak\nfi\nif test \"$have_selinux\" = \"yes\" ; then\n  echo \"#define HAVE_SELINUX\" >> $TMPH\n  echo \"HAVE_SELINUX=yes\" >> config.mak\nfi\n\nversion=`head $source_path/VERSION`\necho \"VERSION=$version\" >>config.mak\necho \"#define TCC_VERSION \\\"$version\\\"\" >> $TMPH\necho \"@set VERSION $version\" > config.texi\necho \"SRC_PATH=$source_path\" >>config.mak\n\nif test \"$source_path_used\" = \"yes\" ; then\n    case $source_path in\n       /*) echo \"top_srcdir=$source_path\";;\n        *) echo \"top_srcdir=\\$(TOP)/$source_path\";;\n     esac >>config.mak\nelse\n     echo 'top_srcdir=$(TOP)' >>config.mak\nfi\necho 'top_builddir=$(TOP)' >>config.mak\n\ndiff $TMPH config.h >/dev/null 2>&1\nif test $? -ne 0 ; then\n    mv -f $TMPH config.h\nelse\n    echo \"config.h is unchanged\"\nfi\n\nrm -f $TMPN* $CONFTEST\n\n# ---------------------------------------------------------------------------\n# build tree in object directory if source path is different from current one\n\nfn_makelink()\n{\n    tgt=$1/$2\n    case $2 in\n    */*) dn=${2%/*}\n         test -d $dn || mkdir -p $dn\n         case $1 in\n         /*) ;;\n          *) while test $dn ; do\n                tgt=../$tgt; dn=${dn#${dn%%/*}}; dn=${dn#/}\n             done\n             ;;\n         esac\n         ;;\n    esac\n    ln -sfn $tgt $2\n}\n\nif test \"$source_path_used\" = \"yes\" ; then\n  FILES=\"Makefile lib/Makefile tests/Makefile tests/tests2/Makefile\"\n  for f in $FILES ; do\n    fn_makelink $source_path $f\n  done\nfi\n\n# ---------------------------------------------------------------------------\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/elf.h",
    "content": "/* This file defines standard ELF types, structures, and macros.\n   Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.\n   This file is part of the GNU C Library.\n   Contributed by Ian Lance Taylor <ian@cygnus.com>.\n\n   The GNU C Library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Library General Public License as\n   published by the Free Software Foundation; either version 2 of the\n   License, or (at your option) any later version.\n\n   The GNU C Library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Library General Public License for more details.\n\n   You should have received a copy of the GNU Library General Public\n   License along with the GNU C Library; see the file COPYING.LIB.  If not,\n   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n   Boston, MA 02111-1307, USA.  */\n\n#ifndef _ELF_H\n#define _ELF_H 1\n\n#ifndef _WIN32\n#include <inttypes.h>\n#else\n#ifndef __int8_t_defined\n#define __int8_t_defined\ntypedef signed char int8_t;\ntypedef short int int16_t;\ntypedef int int32_t;\ntypedef long long int int64_t;\n#endif\n\ntypedef unsigned char           uint8_t;\ntypedef unsigned short int      uint16_t;\ntypedef unsigned int            uint32_t;\ntypedef unsigned long long int  uint64_t;\n#endif\n\n/* Standard ELF types.  */\n\n/* Type for a 16-bit quantity.  */\ntypedef uint16_t Elf32_Half;\ntypedef uint16_t Elf64_Half;\n\n/* Types for signed and unsigned 32-bit quantities.  */\ntypedef uint32_t Elf32_Word;\ntypedef int32_t  Elf32_Sword;\ntypedef uint32_t Elf64_Word;\ntypedef int32_t  Elf64_Sword;\n\n/* Types for signed and unsigned 64-bit quantities.  */\ntypedef uint64_t Elf32_Xword;\ntypedef int64_t  Elf32_Sxword;\ntypedef uint64_t Elf64_Xword;\ntypedef int64_t  Elf64_Sxword;\n\n/* Type of addresses.  */\ntypedef uint32_t Elf32_Addr;\ntypedef uint64_t Elf64_Addr;\n\n/* Type of file offsets.  */\ntypedef uint32_t Elf32_Off;\ntypedef uint64_t Elf64_Off;\n\n/* Type for section indices, which are 16-bit quantities.  */\ntypedef uint16_t Elf32_Section;\ntypedef uint16_t Elf64_Section;\n\n/* Type of symbol indices.  */\ntypedef uint32_t Elf32_Symndx;\ntypedef uint64_t Elf64_Symndx;\n\n\n/* The ELF file header.  This appears at the start of every ELF file.  */\n\n#define EI_NIDENT (16)\n\ntypedef struct\n{\n  unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */\n  Elf32_Half    e_type;                 /* Object file type */\n  Elf32_Half    e_machine;              /* Architecture */\n  Elf32_Word    e_version;              /* Object file version */\n  Elf32_Addr    e_entry;                /* Entry point virtual address */\n  Elf32_Off     e_phoff;                /* Program header table file offset */\n  Elf32_Off     e_shoff;                /* Section header table file offset */\n  Elf32_Word    e_flags;                /* Processor-specific flags */\n  Elf32_Half    e_ehsize;               /* ELF header size in bytes */\n  Elf32_Half    e_phentsize;            /* Program header table entry size */\n  Elf32_Half    e_phnum;                /* Program header table entry count */\n  Elf32_Half    e_shentsize;            /* Section header table entry size */\n  Elf32_Half    e_shnum;                /* Section header table entry count */\n  Elf32_Half    e_shstrndx;             /* Section header string table index */\n} Elf32_Ehdr;\n\ntypedef struct\n{\n  unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */\n  Elf64_Half    e_type;                 /* Object file type */\n  Elf64_Half    e_machine;              /* Architecture */\n  Elf64_Word    e_version;              /* Object file version */\n  Elf64_Addr    e_entry;                /* Entry point virtual address */\n  Elf64_Off     e_phoff;                /* Program header table file offset */\n  Elf64_Off     e_shoff;                /* Section header table file offset */\n  Elf64_Word    e_flags;                /* Processor-specific flags */\n  Elf64_Half    e_ehsize;               /* ELF header size in bytes */\n  Elf64_Half    e_phentsize;            /* Program header table entry size */\n  Elf64_Half    e_phnum;                /* Program header table entry count */\n  Elf64_Half    e_shentsize;            /* Section header table entry size */\n  Elf64_Half    e_shnum;                /* Section header table entry count */\n  Elf64_Half    e_shstrndx;             /* Section header string table index */\n} Elf64_Ehdr;\n\n/* Fields in the e_ident array.  The EI_* macros are indices into the\n   array.  The macros under each EI_* macro are the values the byte\n   may have.  */\n\n#define EI_MAG0         0               /* File identification byte 0 index */\n#define ELFMAG0         0x7f            /* Magic number byte 0 */\n\n#define EI_MAG1         1               /* File identification byte 1 index */\n#define ELFMAG1         'E'             /* Magic number byte 1 */\n\n#define EI_MAG2         2               /* File identification byte 2 index */\n#define ELFMAG2         'L'             /* Magic number byte 2 */\n\n#define EI_MAG3         3               /* File identification byte 3 index */\n#define ELFMAG3         'F'             /* Magic number byte 3 */\n\n/* Conglomeration of the identification bytes, for easy testing as a word.  */\n#define ELFMAG          \"\\177ELF\"\n#define SELFMAG         4\n\n#define EI_CLASS        4               /* File class byte index */\n#define ELFCLASSNONE    0               /* Invalid class */\n#define ELFCLASS32      1               /* 32-bit objects */\n#define ELFCLASS64      2               /* 64-bit objects */\n#define ELFCLASSNUM     3\n\n#define EI_DATA         5               /* Data encoding byte index */\n#define ELFDATANONE     0               /* Invalid data encoding */\n#define ELFDATA2LSB     1               /* 2's complement, little endian */\n#define ELFDATA2MSB     2               /* 2's complement, big endian */\n#define ELFDATANUM      3\n\n#define EI_VERSION      6               /* File version byte index */\n                                        /* Value must be EV_CURRENT */\n\n#define EI_OSABI        7               /* OS ABI identification */\n#define ELFOSABI_SYSV           0       /* UNIX System V ABI */\n#define ELFOSABI_HPUX           1       /* HP-UX */\n#define ELFOSABI_FREEBSD        9       /* Free BSD */\n#define ELFOSABI_ARM            97      /* ARM */\n#define ELFOSABI_STANDALONE     255     /* Standalone (embedded) application */\n\n#define EI_ABIVERSION   8               /* ABI version */\n\n#define EI_PAD          9               /* Byte index of padding bytes */\n\n/* Legal values for e_type (object file type).  */\n\n#define ET_NONE         0               /* No file type */\n#define ET_REL          1               /* Relocatable file */\n#define ET_EXEC         2               /* Executable file */\n#define ET_DYN          3               /* Shared object file */\n#define ET_CORE         4               /* Core file */\n#define ET_NUM          5               /* Number of defined types */\n#define ET_LOPROC       0xff00          /* Processor-specific */\n#define ET_HIPROC       0xffff          /* Processor-specific */\n\n/* Legal values for e_machine (architecture).  */\n\n#define EM_NONE          0              /* No machine */\n#define EM_M32           1              /* AT&T WE 32100 */\n#define EM_SPARC         2              /* SUN SPARC */\n#define EM_386           3              /* Intel 80386 */\n#define EM_68K           4              /* Motorola m68k family */\n#define EM_88K           5              /* Motorola m88k family */\n#define EM_486           6              /* Intel 80486 */\n#define EM_860           7              /* Intel 80860 */\n#define EM_MIPS          8              /* MIPS R3000 big-endian */\n#define EM_S370          9              /* Amdahl */\n#define EM_MIPS_RS4_BE  10              /* MIPS R4000 big-endian */\n#define EM_RS6000       11              /* RS6000 */\n\n#define EM_PARISC       15              /* HPPA */\n#define EM_nCUBE        16              /* nCUBE */\n#define EM_VPP500       17              /* Fujitsu VPP500 */\n#define EM_SPARC32PLUS  18              /* Sun's \"v8plus\" */\n#define EM_960          19              /* Intel 80960 */\n#define EM_PPC          20              /* PowerPC */\n\n#define EM_V800         36              /* NEC V800 series */\n#define EM_FR20         37              /* Fujitsu FR20 */\n#define EM_RH32         38              /* TRW RH32 */\n#define EM_RCE          39              /* Motorola RCE */\n#define EM_ARM          40              /* ARM */\n#define EM_FAKE_ALPHA   41              /* Digital Alpha */\n#define EM_SH           42              /* Hitachi SH */\n#define EM_SPARCV9      43              /* SPARC v9 64-bit */\n#define EM_TRICORE      44              /* Siemens Tricore */\n#define EM_ARC          45              /* Argonaut RISC Core */\n#define EM_H8_300       46              /* Hitachi H8/300 */\n#define EM_H8_300H      47              /* Hitachi H8/300H */\n#define EM_H8S          48              /* Hitachi H8S */\n#define EM_H8_500       49              /* Hitachi H8/500 */\n#define EM_IA_64        50              /* Intel Merced */\n#define EM_MIPS_X       51              /* Stanford MIPS-X */\n#define EM_COLDFIRE     52              /* Motorola Coldfire */\n#define EM_68HC12       53              /* Motorola M68HC12 */\n#define EM_MMA          54              /* Fujitsu MMA Multimedia Accelerator*/\n#define EM_PCP          55              /* Siemens PCP */\n#define EM_NCPU         56              /* Sony nCPU embeeded RISC */\n#define EM_NDR1         57              /* Denso NDR1 microprocessor */\n#define EM_STARCORE     58              /* Motorola Start*Core processor */\n#define EM_ME16         59              /* Toyota ME16 processor */\n#define EM_ST100        60              /* STMicroelectronic ST100 processor */\n#define EM_TINYJ        61              /* Advanced Logic Corp. Tinyj emb.fam*/\n#define EM_X86_64       62              /* AMD x86-64 architecture */\n#define EM_PDSP         63              /* Sony DSP Processor */\n#define EM_FX66         66              /* Siemens FX66 microcontroller */\n#define EM_ST9PLUS      67              /* STMicroelectronics ST9+ 8/16 mc */\n#define EM_ST7          68              /* STmicroelectronics ST7 8 bit mc */\n#define EM_68HC16       69              /* Motorola MC68HC16 microcontroller */\n#define EM_68HC11       70              /* Motorola MC68HC11 microcontroller */\n#define EM_68HC08       71              /* Motorola MC68HC08 microcontroller */\n#define EM_68HC05       72              /* Motorola MC68HC05 microcontroller */\n#define EM_SVX          73              /* Silicon Graphics SVx */\n#define EM_ST19         74              /* STMicroelectronics ST19 8 bit mc */\n#define EM_VAX          75              /* Digital VAX */\n#define EM_CRIS         76              /* Axis Communications 32-bit embedded processor */\n#define EM_JAVELIN      77              /* Infineon Technologies 32-bit embedded processor */\n#define EM_FIREPATH     78              /* Element 14 64-bit DSP Processor */\n#define EM_ZSP          79              /* LSI Logic 16-bit DSP Processor */\n#define EM_MMIX         80              /* Donald Knuth's educational 64-bit processor */\n#define EM_HUANY        81              /* Harvard University machine-independent object files */\n#define EM_PRISM        82              /* SiTera Prism */\n#define EM_AVR          83              /* Atmel AVR 8-bit microcontroller */\n#define EM_FR30         84              /* Fujitsu FR30 */\n#define EM_D10V         85              /* Mitsubishi D10V */\n#define EM_D30V         86              /* Mitsubishi D30V */\n#define EM_V850         87              /* NEC v850 */\n#define EM_M32R         88              /* Mitsubishi M32R */\n#define EM_MN10300      89              /* Matsushita MN10300 */\n#define EM_MN10200      90              /* Matsushita MN10200 */\n#define EM_PJ           91              /* picoJava */\n#define EM_OPENRISC     92              /* OpenRISC 32-bit embedded processor */\n#define EM_ARC_A5       93              /* ARC Cores Tangent-A5 */\n#define EM_XTENSA       94              /* Tensilica Xtensa Architecture */\n#define EM_NUM          95\n\n/* If it is necessary to assign new unofficial EM_* values, please\n   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the\n   chances of collision with official or non-GNU unofficial values.  */\n\n#define EM_ALPHA        0x9026\n#define EM_C60          0x9c60\n\n/* Legal values for e_version (version).  */\n\n#define EV_NONE         0               /* Invalid ELF version */\n#define EV_CURRENT      1               /* Current version */\n#define EV_NUM          2\n\n/* Section header.  */\n\ntypedef struct\n{\n  Elf32_Word    sh_name;                /* Section name (string tbl index) */\n  Elf32_Word    sh_type;                /* Section type */\n  Elf32_Word    sh_flags;               /* Section flags */\n  Elf32_Addr    sh_addr;                /* Section virtual addr at execution */\n  Elf32_Off     sh_offset;              /* Section file offset */\n  Elf32_Word    sh_size;                /* Section size in bytes */\n  Elf32_Word    sh_link;                /* Link to another section */\n  Elf32_Word    sh_info;                /* Additional section information */\n  Elf32_Word    sh_addralign;           /* Section alignment */\n  Elf32_Word    sh_entsize;             /* Entry size if section holds table */\n} Elf32_Shdr;\n\ntypedef struct\n{\n  Elf64_Word    sh_name;                /* Section name (string tbl index) */\n  Elf64_Word    sh_type;                /* Section type */\n  Elf64_Xword   sh_flags;               /* Section flags */\n  Elf64_Addr    sh_addr;                /* Section virtual addr at execution */\n  Elf64_Off     sh_offset;              /* Section file offset */\n  Elf64_Xword   sh_size;                /* Section size in bytes */\n  Elf64_Word    sh_link;                /* Link to another section */\n  Elf64_Word    sh_info;                /* Additional section information */\n  Elf64_Xword   sh_addralign;           /* Section alignment */\n  Elf64_Xword   sh_entsize;             /* Entry size if section holds table */\n} Elf64_Shdr;\n\n/* Special section indices.  */\n\n#define SHN_UNDEF       0               /* Undefined section */\n#define SHN_LORESERVE   0xff00          /* Start of reserved indices */\n#define SHN_LOPROC      0xff00          /* Start of processor-specific */\n#define SHN_HIPROC      0xff1f          /* End of processor-specific */\n#define SHN_ABS         0xfff1          /* Associated symbol is absolute */\n#define SHN_COMMON      0xfff2          /* Associated symbol is common */\n#define SHN_HIRESERVE   0xffff          /* End of reserved indices */\n\n/* Legal values for sh_type (section type).  */\n\n#define SHT_NULL         0              /* Section header table entry unused */\n#define SHT_PROGBITS     1              /* Program data */\n#define SHT_SYMTAB       2              /* Symbol table */\n#define SHT_STRTAB       3              /* String table */\n#define SHT_RELA         4              /* Relocation entries with addends */\n#define SHT_HASH         5              /* Symbol hash table */\n#define SHT_DYNAMIC      6              /* Dynamic linking information */\n#define SHT_NOTE         7              /* Notes */\n#define SHT_NOBITS       8              /* Program space with no data (bss) */\n#define SHT_REL          9              /* Relocation entries, no addends */\n#define SHT_SHLIB        10             /* Reserved */\n#define SHT_DYNSYM       11             /* Dynamic linker symbol table */\n#define SHT_INIT_ARRAY   14             /* Array of constructors */\n#define SHT_FINI_ARRAY   15             /* Array of destructors */\n#define SHT_PREINIT_ARRAY 16            /* Array of pre-constructors */\n#define SHT_GROUP        17             /* Section group */\n#define SHT_SYMTAB_SHNDX 18             /* Extended section indices */\n#define SHT_NUM          19             /* Number of defined types.  */\n#define SHT_LOOS         0x60000000     /* Start OS-specific */\n#define SHT_LOSUNW       0x6ffffffb     /* Sun-specific low bound.  */\n#define SHT_SUNW_COMDAT  0x6ffffffb\n#define SHT_SUNW_syminfo 0x6ffffffc\n#define SHT_GNU_verdef   0x6ffffffd     /* Version definition section.  */\n#define SHT_GNU_verneed  0x6ffffffe     /* Version needs section.  */\n#define SHT_GNU_versym   0x6fffffff     /* Version symbol table.  */\n#define SHT_HISUNW       0x6fffffff     /* Sun-specific high bound.  */\n#define SHT_HIOS         0x6fffffff     /* End OS-specific type */\n#define SHT_LOPROC       0x70000000     /* Start of processor-specific */\n#define SHT_ARM_EXIDX    0x70000001     /* Exception Index table */\n#define SHT_ARM_PREEMPTMAP 0x70000002   /* dynamic linking pre-emption map */\n#define SHT_ARM_ATTRIBUTES 0x70000003   /* Object file compatibility attrs */\n#define SHT_HIPROC       0x7fffffff     /* End of processor-specific */\n#define SHT_LOUSER       0x80000000     /* Start of application-specific */\n#define SHT_HIUSER       0x8fffffff     /* End of application-specific */\n\n/* Legal values for sh_flags (section flags).  */\n\n#define SHF_WRITE       (1 << 0)        /* Writable */\n#define SHF_ALLOC       (1 << 1)        /* Occupies memory during execution */\n#define SHF_EXECINSTR   (1 << 2)        /* Executable */\n#define SHF_MASKPROC    0xf0000000      /* Processor-specific */\n\n#define SHF_MERGE       0x10\n#define SHF_STRINGS     0x20\n#define SHF_INFO_LINK   0x40\n#define SHF_LINK_ORDER  0x80\n#define SHF_OS_NONCONFORMING 0x100\n#define SHF_GROUP       0x200\n#define SHF_TLS         0x400\n#define SHF_MASKOS      0x0ff00000\n#define SHF_ORDERED     0x40000000\n#define SHF_EXCLUDE     0x80000000\n\n/* Symbol table entry.  */\n\ntypedef struct\n{\n  Elf32_Word    st_name;                /* Symbol name (string tbl index) */\n  Elf32_Addr    st_value;               /* Symbol value */\n  Elf32_Word    st_size;                /* Symbol size */\n  unsigned char st_info;                /* Symbol type and binding */\n  unsigned char st_other;               /* No defined meaning, 0 */\n  Elf32_Section st_shndx;               /* Section index */\n} Elf32_Sym;\n\ntypedef struct\n{\n  Elf64_Word    st_name;                /* Symbol name (string tbl index) */\n  unsigned char st_info;                /* Symbol type and binding */\n  unsigned char st_other;               /* No defined meaning, 0 */\n  Elf64_Section st_shndx;               /* Section index */\n  Elf64_Addr    st_value;               /* Symbol value */\n  Elf64_Xword   st_size;                /* Symbol size */\n} Elf64_Sym;\n\n/* The syminfo section if available contains additional information about\n   every dynamic symbol.  */\n\ntypedef struct\n{\n  Elf32_Half si_boundto;                /* Direct bindings, symbol bound to */\n  Elf32_Half si_flags;                  /* Per symbol flags */\n} Elf32_Syminfo;\n\ntypedef struct\n{\n  Elf64_Half si_boundto;                /* Direct bindings, symbol bound to */\n  Elf64_Half si_flags;                  /* Per symbol flags */\n} Elf64_Syminfo;\n\n/* Possible values for si_boundto.  */\n#define SYMINFO_BT_SELF         0xffff  /* Symbol bound to self */\n#define SYMINFO_BT_PARENT       0xfffe  /* Symbol bound to parent */\n#define SYMINFO_BT_LOWRESERVE   0xff00  /* Beginning of reserved entries */\n\n/* Possible bitmasks for si_flags.  */\n#define SYMINFO_FLG_DIRECT      0x0001  /* Direct bound symbol */\n#define SYMINFO_FLG_PASSTHRU    0x0002  /* Pass-thru symbol for translator */\n#define SYMINFO_FLG_COPY        0x0004  /* Symbol is a copy-reloc */\n#define SYMINFO_FLG_LAZYLOAD    0x0008  /* Symbol bound to object to be lazy\n                                           loaded */\n/* Syminfo version values.  */\n#define SYMINFO_NONE            0\n#define SYMINFO_CURRENT         1\n#define SYMINFO_NUM             2\n\n\n/* Special section index.  */\n\n#define SHN_UNDEF       0               /* No section, undefined symbol.  */\n\n/* How to extract and insert information held in the st_info field.  */\n\n#define ELF32_ST_BIND(val)              (((unsigned char) (val)) >> 4)\n#define ELF32_ST_TYPE(val)              ((val) & 0xf)\n#define ELF32_ST_INFO(bind, type)       (((bind) << 4) + ((type) & 0xf))\n\n/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */\n#define ELF64_ST_BIND(val)              ELF32_ST_BIND (val)\n#define ELF64_ST_TYPE(val)              ELF32_ST_TYPE (val)\n#define ELF64_ST_INFO(bind, type)       ELF32_ST_INFO ((bind), (type))\n\n/* Legal values for ST_BIND subfield of st_info (symbol binding).  */\n\n#define STB_LOCAL       0               /* Local symbol */\n#define STB_GLOBAL      1               /* Global symbol */\n#define STB_WEAK        2               /* Weak symbol */\n#define STB_NUM         3               /* Number of defined types.  */\n#define STB_LOOS        10              /* Start of OS-specific */\n#define STB_HIOS        12              /* End of OS-specific */\n#define STB_LOPROC      13              /* Start of processor-specific */\n#define STB_HIPROC      15              /* End of processor-specific */\n\n/* Legal values for ST_TYPE subfield of st_info (symbol type).  */\n\n#define STT_NOTYPE      0               /* Symbol type is unspecified */\n#define STT_OBJECT      1               /* Symbol is a data object */\n#define STT_FUNC        2               /* Symbol is a code object */\n#define STT_SECTION     3               /* Symbol associated with a section */\n#define STT_FILE        4               /* Symbol's name is file name */\n#define STT_NUM         5               /* Number of defined types.  */\n#define STT_GNU_IFUNC   10              /* Symbol is a indirect code object */\n#define STT_LOOS        11              /* Start of OS-specific */\n#define STT_HIOS        12              /* End of OS-specific */\n#define STT_LOPROC      13              /* Start of processor-specific */\n#define STT_HIPROC      15              /* End of processor-specific */\n\n\n/* Symbol table indices are found in the hash buckets and chain table\n   of a symbol hash table section.  This special index value indicates\n   the end of a chain, meaning no further symbols are found in that bucket.  */\n\n#define STN_UNDEF       0               /* End of a chain.  */\n\n\n/* How to extract and insert information held in the st_other field.  */\n\n#define ELF32_ST_VISIBILITY(o)  ((o) & 0x03)\n\n/* For ELF64 the definitions are the same.  */\n#define ELF64_ST_VISIBILITY(o)  ELF32_ST_VISIBILITY (o)\n\n/* Symbol visibility specification encoded in the st_other field.  */\n#define STV_DEFAULT     0               /* Default symbol visibility rules */\n#define STV_INTERNAL    1               /* Processor specific hidden class */\n#define STV_HIDDEN      2               /* Sym unavailable in other modules */\n#define STV_PROTECTED   3               /* Not preemptible, not exported */\n\n\n/* Relocation table entry without addend (in section of type SHT_REL).  */\n\ntypedef struct\n{\n  Elf32_Addr    r_offset;               /* Address */\n  Elf32_Word    r_info;                 /* Relocation type and symbol index */\n} Elf32_Rel;\n\n/* I have seen two different definitions of the Elf64_Rel and\n   Elf64_Rela structures, so we'll leave them out until Novell (or\n   whoever) gets their act together.  */\n/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */\n\ntypedef struct\n{\n  Elf64_Addr    r_offset;               /* Address */\n  Elf64_Xword   r_info;                 /* Relocation type and symbol index */\n} Elf64_Rel;\n\n/* Relocation table entry with addend (in section of type SHT_RELA).  */\n\ntypedef struct\n{\n  Elf32_Addr    r_offset;               /* Address */\n  Elf32_Word    r_info;                 /* Relocation type and symbol index */\n  Elf32_Sword   r_addend;               /* Addend */\n} Elf32_Rela;\n\ntypedef struct\n{\n  Elf64_Addr    r_offset;               /* Address */\n  Elf64_Xword   r_info;                 /* Relocation type and symbol index */\n  Elf64_Sxword  r_addend;               /* Addend */\n} Elf64_Rela;\n\n/* How to extract and insert information held in the r_info field.  */\n\n#define ELF32_R_SYM(val)                ((val) >> 8)\n#define ELF32_R_TYPE(val)               ((val) & 0xff)\n#define ELF32_R_INFO(sym, type)         (((sym) << 8) + ((type) & 0xff))\n\n#define ELF64_R_SYM(i)                  ((i) >> 32)\n#define ELF64_R_TYPE(i)                 ((i) & 0xffffffff)\n#define ELF64_R_INFO(sym,type)          ((((Elf64_Xword)(sym)) << 32) + (type))\n\n/* Program segment header.  */\n\ntypedef struct\n{\n  Elf32_Word    p_type;                 /* Segment type */\n  Elf32_Off     p_offset;               /* Segment file offset */\n  Elf32_Addr    p_vaddr;                /* Segment virtual address */\n  Elf32_Addr    p_paddr;                /* Segment physical address */\n  Elf32_Word    p_filesz;               /* Segment size in file */\n  Elf32_Word    p_memsz;                /* Segment size in memory */\n  Elf32_Word    p_flags;                /* Segment flags */\n  Elf32_Word    p_align;                /* Segment alignment */\n} Elf32_Phdr;\n\ntypedef struct\n{\n  Elf64_Word    p_type;                 /* Segment type */\n  Elf64_Word    p_flags;                /* Segment flags */\n  Elf64_Off     p_offset;               /* Segment file offset */\n  Elf64_Addr    p_vaddr;                /* Segment virtual address */\n  Elf64_Addr    p_paddr;                /* Segment physical address */\n  Elf64_Xword   p_filesz;               /* Segment size in file */\n  Elf64_Xword   p_memsz;                /* Segment size in memory */\n  Elf64_Xword   p_align;                /* Segment alignment */\n} Elf64_Phdr;\n\n/* Legal values for p_type (segment type).  */\n\n#define PT_NULL         0               /* Program header table entry unused */\n#define PT_LOAD         1               /* Loadable program segment */\n#define PT_DYNAMIC      2               /* Dynamic linking information */\n#define PT_INTERP       3               /* Program interpreter */\n#define PT_NOTE         4               /* Auxiliary information */\n#define PT_SHLIB        5               /* Reserved */\n#define PT_PHDR         6               /* Entry for header table itself */\n#define PT_NUM          7               /* Number of defined types.  */\n#define PT_LOOS         0x60000000      /* Start of OS-specific */\n#define PT_HIOS         0x6fffffff      /* End of OS-specific */\n#define PT_LOPROC       0x70000000      /* Start of processor-specific */\n#define PT_HIPROC       0x7fffffff      /* End of processor-specific */\n\n/* Legal values for p_flags (segment flags).  */\n\n#define PF_X            (1 << 0)        /* Segment is executable */\n#define PF_W            (1 << 1)        /* Segment is writable */\n#define PF_R            (1 << 2)        /* Segment is readable */\n#define PF_MASKPROC     0xf0000000      /* Processor-specific */\n\n/* Legal values for note segment descriptor types for core files. */\n\n#define NT_PRSTATUS     1               /* Contains copy of prstatus struct */\n#define NT_FPREGSET     2               /* Contains copy of fpregset struct */\n#define NT_PRPSINFO     3               /* Contains copy of prpsinfo struct */\n#define NT_PRXREG       4               /* Contains copy of prxregset struct */\n#define NT_PLATFORM     5               /* String from sysinfo(SI_PLATFORM) */\n#define NT_AUXV         6               /* Contains copy of auxv array */\n#define NT_GWINDOWS     7               /* Contains copy of gwindows struct */\n#define NT_PSTATUS      10              /* Contains copy of pstatus struct */\n#define NT_PSINFO       13              /* Contains copy of psinfo struct */\n#define NT_PRCRED       14              /* Contains copy of prcred struct */\n#define NT_UTSNAME      15              /* Contains copy of utsname struct */\n#define NT_LWPSTATUS    16              /* Contains copy of lwpstatus struct */\n#define NT_LWPSINFO     17              /* Contains copy of lwpinfo struct */\n\n/* Legal values for the  note segment descriptor types for object files.  */\n\n#define NT_VERSION      1               /* Contains a version string.  */\n\n\n/* Dynamic section entry.  */\n\ntypedef struct\n{\n  Elf32_Sword   d_tag;                  /* Dynamic entry type */\n  union\n    {\n      Elf32_Word d_val;                 /* Integer value */\n      Elf32_Addr d_ptr;                 /* Address value */\n    } d_un;\n} Elf32_Dyn;\n\ntypedef struct\n{\n  Elf64_Sxword  d_tag;                  /* Dynamic entry type */\n  union\n    {\n      Elf64_Xword d_val;                /* Integer value */\n      Elf64_Addr d_ptr;                 /* Address value */\n    } d_un;\n} Elf64_Dyn;\n\n/* Legal values for d_tag (dynamic entry type).  */\n\n#define DT_NULL         0               /* Marks end of dynamic section */\n#define DT_NEEDED       1               /* Name of needed library */\n#define DT_PLTRELSZ     2               /* Size in bytes of PLT relocs */\n#define DT_PLTGOT       3               /* Processor defined value */\n#define DT_HASH         4               /* Address of symbol hash table */\n#define DT_STRTAB       5               /* Address of string table */\n#define DT_SYMTAB       6               /* Address of symbol table */\n#define DT_RELA         7               /* Address of Rela relocs */\n#define DT_RELASZ       8               /* Total size of Rela relocs */\n#define DT_RELAENT      9               /* Size of one Rela reloc */\n#define DT_STRSZ        10              /* Size of string table */\n#define DT_SYMENT       11              /* Size of one symbol table entry */\n#define DT_INIT         12              /* Address of init function */\n#define DT_FINI         13              /* Address of termination function */\n#define DT_SONAME       14              /* Name of shared object */\n#define DT_RPATH        15              /* Library search path */\n#define DT_SYMBOLIC     16              /* Start symbol search here */\n#define DT_REL          17              /* Address of Rel relocs */\n#define DT_RELSZ        18              /* Total size of Rel relocs */\n#define DT_RELENT       19              /* Size of one Rel reloc */\n#define DT_PLTREL       20              /* Type of reloc in PLT */\n#define DT_DEBUG        21              /* For debugging; unspecified */\n#define DT_TEXTREL      22              /* Reloc might modify .text */\n#define DT_JMPREL       23              /* Address of PLT relocs */\n#define DT_BIND_NOW     24              /* Process relocations of object */\n#define DT_INIT_ARRAY   25              /* Array with addresses of init fct */\n#define DT_FINI_ARRAY   26              /* Array with addresses of fini fct */\n#define DT_INIT_ARRAYSZ 27              /* Size in bytes of DT_INIT_ARRAY */\n#define DT_FINI_ARRAYSZ 28              /* Size in bytes of DT_FINI_ARRAY */\n#define DT_NUM          29              /* Number used */\n#define DT_LOOS         0x60000000      /* Start of OS-specific */\n#define DT_HIOS         0x6fffffff      /* End of OS-specific */\n#define DT_LOPROC       0x70000000      /* Start of processor-specific */\n#define DT_HIPROC       0x7fffffff      /* End of processor-specific */\n#define DT_PROCNUM      DT_MIPS_NUM     /* Most used by any processor */\n\n/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the\n   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's\n   approach.  */\n#define DT_VALRNGLO     0x6ffffd00\n#define DT_POSFLAG_1    0x6ffffdfd      /* Flags for DT_* entries, effecting\n                                           the following DT_* entry.  */\n#define DT_SYMINSZ      0x6ffffdfe      /* Size of syminfo table (in bytes) */\n#define DT_SYMINENT     0x6ffffdff      /* Entry size of syminfo */\n#define DT_VALRNGHI     0x6ffffdff\n\n/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the\n   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.\n\n   If any adjustment is made to the ELF object after it has been\n   built these entries will need to be adjusted.  */\n#define DT_ADDRRNGLO    0x6ffffe00\n#define DT_SYMINFO      0x6ffffeff      /* syminfo table */\n#define DT_ADDRRNGHI    0x6ffffeff\n\n/* The versioning entry types.  The next are defined as part of the\n   GNU extension.  */\n#define DT_VERSYM       0x6ffffff0\n\n/* These were chosen by Sun.  */\n#define DT_FLAGS_1      0x6ffffffb      /* State flags, see DF_1_* below.  */\n#define DT_VERDEF       0x6ffffffc      /* Address of version definition\n                                           table */\n#define DT_VERDEFNUM    0x6ffffffd      /* Number of version definitions */\n#define DT_VERNEED      0x6ffffffe      /* Address of table with needed\n                                           versions */\n#define DT_VERNEEDNUM   0x6fffffff      /* Number of needed versions */\n#define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order! */\n#define DT_VERSIONTAGNUM 16\n\n/* Sun added these machine-independent extensions in the \"processor-specific\"\n   range.  Be compatible.  */\n#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */\n#define DT_FILTER       0x7fffffff      /* Shared object to get values from */\n#define DT_EXTRATAGIDX(tag)     ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)\n#define DT_EXTRANUM     3\n\n/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1\n   entry in the dynamic section.  */\n#define DF_1_NOW        0x00000001      /* Set RTLD_NOW for this object.  */\n#define DF_1_GLOBAL     0x00000002      /* Set RTLD_GLOBAL for this object.  */\n#define DF_1_GROUP      0x00000004      /* Set RTLD_GROUP for this object.  */\n#define DF_1_NODELETE   0x00000008      /* Set RTLD_NODELETE for this object.*/\n#define DF_1_LOADFLTR   0x00000010      /* Trigger filtee loading at runtime.*/\n#define DF_1_INITFIRST  0x00000020      /* Set RTLD_INITFIRST for this object*/\n#define DF_1_NOOPEN     0x00000040      /* Set RTLD_NOOPEN for this object.  */\n\n/* Version definition sections.  */\n\ntypedef struct\n{\n  Elf32_Half    vd_version;             /* Version revision */\n  Elf32_Half    vd_flags;               /* Version information */\n  Elf32_Half    vd_ndx;                 /* Version Index */\n  Elf32_Half    vd_cnt;                 /* Number of associated aux entries */\n  Elf32_Word    vd_hash;                /* Version name hash value */\n  Elf32_Word    vd_aux;                 /* Offset in bytes to verdaux array */\n  Elf32_Word    vd_next;                /* Offset in bytes to next verdef\n                                           entry */\n} Elf32_Verdef;\n\ntypedef struct\n{\n  Elf64_Half    vd_version;             /* Version revision */\n  Elf64_Half    vd_flags;               /* Version information */\n  Elf64_Half    vd_ndx;                 /* Version Index */\n  Elf64_Half    vd_cnt;                 /* Number of associated aux entries */\n  Elf64_Word    vd_hash;                /* Version name hash value */\n  Elf64_Word    vd_aux;                 /* Offset in bytes to verdaux array */\n  Elf64_Word    vd_next;                /* Offset in bytes to next verdef\n                                           entry */\n} Elf64_Verdef;\n\n\n/* Legal values for vd_version (version revision).  */\n#define VER_DEF_NONE    0               /* No version */\n#define VER_DEF_CURRENT 1               /* Current version */\n#define VER_DEF_NUM     2               /* Given version number */\n\n/* Legal values for vd_flags (version information flags).  */\n#define VER_FLG_BASE    0x1             /* Version definition of file itself */\n#define VER_FLG_WEAK    0x2             /* Weak version identifier */\n\n/* Auxialiary version information.  */\n\ntypedef struct\n{\n  Elf32_Word    vda_name;               /* Version or dependency names */\n  Elf32_Word    vda_next;               /* Offset in bytes to next verdaux\n                                           entry */\n} Elf32_Verdaux;\n\ntypedef struct\n{\n  Elf64_Word    vda_name;               /* Version or dependency names */\n  Elf64_Word    vda_next;               /* Offset in bytes to next verdaux\n                                           entry */\n} Elf64_Verdaux;\n\n\n/* Version dependency section.  */\n\ntypedef struct\n{\n  Elf32_Half    vn_version;             /* Version of structure */\n  Elf32_Half    vn_cnt;                 /* Number of associated aux entries */\n  Elf32_Word    vn_file;                /* Offset of filename for this\n                                           dependency */\n  Elf32_Word    vn_aux;                 /* Offset in bytes to vernaux array */\n  Elf32_Word    vn_next;                /* Offset in bytes to next verneed\n                                           entry */\n} Elf32_Verneed;\n\ntypedef struct\n{\n  Elf64_Half    vn_version;             /* Version of structure */\n  Elf64_Half    vn_cnt;                 /* Number of associated aux entries */\n  Elf64_Word    vn_file;                /* Offset of filename for this\n                                           dependency */\n  Elf64_Word    vn_aux;                 /* Offset in bytes to vernaux array */\n  Elf64_Word    vn_next;                /* Offset in bytes to next verneed\n                                           entry */\n} Elf64_Verneed;\n\n\n/* Legal values for vn_version (version revision).  */\n#define VER_NEED_NONE    0              /* No version */\n#define VER_NEED_CURRENT 1              /* Current version */\n#define VER_NEED_NUM     2              /* Given version number */\n\n/* Auxiliary needed version information.  */\n\ntypedef struct\n{\n  Elf32_Word    vna_hash;               /* Hash value of dependency name */\n  Elf32_Half    vna_flags;              /* Dependency specific information */\n  Elf32_Half    vna_other;              /* Unused */\n  Elf32_Word    vna_name;               /* Dependency name string offset */\n  Elf32_Word    vna_next;               /* Offset in bytes to next vernaux\n                                           entry */\n} Elf32_Vernaux;\n\ntypedef struct\n{\n  Elf64_Word    vna_hash;               /* Hash value of dependency name */\n  Elf64_Half    vna_flags;              /* Dependency specific information */\n  Elf64_Half    vna_other;              /* Unused */\n  Elf64_Word    vna_name;               /* Dependency name string offset */\n  Elf64_Word    vna_next;               /* Offset in bytes to next vernaux\n                                           entry */\n} Elf64_Vernaux;\n\n\n/* Legal values for vna_flags.  */\n#define VER_FLG_WEAK    0x2             /* Weak version identifier */\n\n\n/* Auxiliary vector.  */\n\n/* This vector is normally only used by the program interpreter.  The\n   usual definition in an ABI supplement uses the name auxv_t.  The\n   vector is not usually defined in a standard <elf.h> file, but it\n   can't hurt.  We rename it to avoid conflicts.  The sizes of these\n   types are an arrangement between the exec server and the program\n   interpreter, so we don't fully specify them here.  */\n\ntypedef struct\n{\n  int a_type;                   /* Entry type */\n  union\n    {\n      long int a_val;           /* Integer value */\n      void *a_ptr;              /* Pointer value */\n      void (*a_fcn) (void);     /* Function pointer value */\n    } a_un;\n} Elf32_auxv_t;\n\ntypedef struct\n{\n  long int a_type;              /* Entry type */\n  union\n    {\n      long int a_val;           /* Integer value */\n      void *a_ptr;              /* Pointer value */\n      void (*a_fcn) (void);     /* Function pointer value */\n    } a_un;\n} Elf64_auxv_t;\n\n/* Legal values for a_type (entry type).  */\n\n#define AT_NULL         0               /* End of vector */\n#define AT_IGNORE       1               /* Entry should be ignored */\n#define AT_EXECFD       2               /* File descriptor of program */\n#define AT_PHDR         3               /* Program headers for program */\n#define AT_PHENT        4               /* Size of program header entry */\n#define AT_PHNUM        5               /* Number of program headers */\n#define AT_PAGESZ       6               /* System page size */\n#define AT_BASE         7               /* Base address of interpreter */\n#define AT_FLAGS        8               /* Flags */\n#define AT_ENTRY        9               /* Entry point of program */\n#define AT_NOTELF       10              /* Program is not ELF */\n#define AT_UID          11              /* Real uid */\n#define AT_EUID         12              /* Effective uid */\n#define AT_GID          13              /* Real gid */\n#define AT_EGID         14              /* Effective gid */\n\n/* Some more special a_type values describing the hardware.  */\n#define AT_PLATFORM     15              /* String identifying platform.  */\n#define AT_HWCAP        16              /* Machine dependent hints about\n                                           processor capabilities.  */\n\n/* This entry gives some information about the FPU initialization\n   performed by the kernel.  */\n#define AT_FPUCW        17              /* Used FPU control word.  */\n\n\n/* Note section contents.  Each entry in the note section begins with\n   a header of a fixed form.  */\n\ntypedef struct\n{\n  Elf32_Word n_namesz;                  /* Length of the note's name.  */\n  Elf32_Word n_descsz;                  /* Length of the note's descriptor.  */\n  Elf32_Word n_type;                    /* Type of the note.  */\n} Elf32_Nhdr;\n\ntypedef struct\n{\n  Elf64_Word n_namesz;                  /* Length of the note's name.  */\n  Elf64_Word n_descsz;                  /* Length of the note's descriptor.  */\n  Elf64_Word n_type;                    /* Type of the note.  */\n} Elf64_Nhdr;\n\n/* Known names of notes.  */\n\n/* Solaris entries in the note section have this name.  */\n#define ELF_NOTE_SOLARIS        \"SUNW Solaris\"\n\n/* Note entries for GNU systems have this name.  */\n#define ELF_NOTE_GNU            \"GNU\"\n\n\n/* Defined types of notes for Solaris.  */\n\n/* Value of descriptor (one word) is desired pagesize for the binary.  */\n#define ELF_NOTE_PAGESIZE_HINT  1\n\n\n/* Defined note types for GNU systems.  */\n\n/* ABI information.  The descriptor consists of words:\n   word 0: OS descriptor\n   word 1: major version of the ABI\n   word 2: minor version of the ABI\n   word 3: subminor version of the ABI\n*/\n#define ELF_NOTE_ABI            1\n\n/* Known OSes.  These value can appear in word 0 of an ELF_NOTE_ABI\n   note section entry.  */\n#define ELF_NOTE_OS_LINUX       0\n#define ELF_NOTE_OS_GNU         1\n#define ELF_NOTE_OS_SOLARIS2    2\n\n\n/* Motorola 68k specific definitions.  */\n\n/* m68k relocs.  */\n\n#define R_68K_NONE      0               /* No reloc */\n#define R_68K_32        1               /* Direct 32 bit  */\n#define R_68K_16        2               /* Direct 16 bit  */\n#define R_68K_8         3               /* Direct 8 bit  */\n#define R_68K_PC32      4               /* PC relative 32 bit */\n#define R_68K_PC16      5               /* PC relative 16 bit */\n#define R_68K_PC8       6               /* PC relative 8 bit */\n#define R_68K_GOT32     7               /* 32 bit PC relative GOT entry */\n#define R_68K_GOT16     8               /* 16 bit PC relative GOT entry */\n#define R_68K_GOT8      9               /* 8 bit PC relative GOT entry */\n#define R_68K_GOT32O    10              /* 32 bit GOT offset */\n#define R_68K_GOT16O    11              /* 16 bit GOT offset */\n#define R_68K_GOT8O     12              /* 8 bit GOT offset */\n#define R_68K_PLT32     13              /* 32 bit PC relative PLT address */\n#define R_68K_PLT16     14              /* 16 bit PC relative PLT address */\n#define R_68K_PLT8      15              /* 8 bit PC relative PLT address */\n#define R_68K_PLT32O    16              /* 32 bit PLT offset */\n#define R_68K_PLT16O    17              /* 16 bit PLT offset */\n#define R_68K_PLT8O     18              /* 8 bit PLT offset */\n#define R_68K_COPY      19              /* Copy symbol at runtime */\n#define R_68K_GLOB_DAT  20              /* Create GOT entry */\n#define R_68K_JMP_SLOT  21              /* Create PLT entry */\n#define R_68K_RELATIVE  22              /* Adjust by program base */\n/* Keep this the last entry.  */\n#define R_68K_NUM       23\n\n/* Intel 80386 specific definitions.  */\n\n/* i386 relocs.  */\n\n#define R_386_NONE      0               /* No reloc */\n#define R_386_32        1               /* Direct 32 bit  */\n#define R_386_PC32      2               /* PC relative 32 bit */\n#define R_386_GOT32     3               /* 32 bit GOT entry */\n#define R_386_PLT32     4               /* 32 bit PLT address */\n#define R_386_COPY      5               /* Copy symbol at runtime */\n#define R_386_GLOB_DAT  6               /* Create GOT entry */\n#define R_386_JMP_SLOT  7               /* Create PLT entry */\n#define R_386_RELATIVE  8               /* Adjust by program base */\n#define R_386_GOTOFF    9               /* 32 bit offset to GOT */\n#define R_386_GOTPC     10              /* 32 bit PC relative offset to GOT */\n/* Keep this the last entry.  */\n#define R_386_NUM       11\n\n/* TCC-specific 16-bit relocs. */\n#define R_386_16        12              /* Direct 16 bit  */\n#define R_386_PC16      13              /* PC relative 16 bit */\n\n/* SUN SPARC specific definitions.  */\n\n/* Values for Elf64_Ehdr.e_flags.  */\n\n#define EF_SPARCV9_MM           3\n#define EF_SPARCV9_TSO          0\n#define EF_SPARCV9_PSO          1\n#define EF_SPARCV9_RMO          2\n#define EF_SPARC_EXT_MASK       0xFFFF00\n#define EF_SPARC_SUN_US1        0x000200\n#define EF_SPARC_HAL_R1         0x000400\n\n/* SPARC relocs.  */\n\n#define R_SPARC_NONE    0               /* No reloc */\n#define R_SPARC_8       1               /* Direct 8 bit */\n#define R_SPARC_16      2               /* Direct 16 bit */\n#define R_SPARC_32      3               /* Direct 32 bit */\n#define R_SPARC_DISP8   4               /* PC relative 8 bit */\n#define R_SPARC_DISP16  5               /* PC relative 16 bit */\n#define R_SPARC_DISP32  6               /* PC relative 32 bit */\n#define R_SPARC_WDISP30 7               /* PC relative 30 bit shifted */\n#define R_SPARC_WDISP22 8               /* PC relative 22 bit shifted */\n#define R_SPARC_HI22    9               /* High 22 bit */\n#define R_SPARC_22      10              /* Direct 22 bit */\n#define R_SPARC_13      11              /* Direct 13 bit */\n#define R_SPARC_LO10    12              /* Truncated 10 bit */\n#define R_SPARC_GOT10   13              /* Truncated 10 bit GOT entry */\n#define R_SPARC_GOT13   14              /* 13 bit GOT entry */\n#define R_SPARC_GOT22   15              /* 22 bit GOT entry shifted */\n#define R_SPARC_PC10    16              /* PC relative 10 bit truncated */\n#define R_SPARC_PC22    17              /* PC relative 22 bit shifted */\n#define R_SPARC_WPLT30  18              /* 30 bit PC relative PLT address */\n#define R_SPARC_COPY    19              /* Copy symbol at runtime */\n#define R_SPARC_GLOB_DAT 20             /* Create GOT entry */\n#define R_SPARC_JMP_SLOT 21             /* Create PLT entry */\n#define R_SPARC_RELATIVE 22             /* Adjust by program base */\n#define R_SPARC_UA32    23              /* Direct 32 bit unaligned */\n\n/* Additional Sparc64 relocs.  */\n\n#define R_SPARC_PLT32   24              /* Direct 32 bit ref to PLT entry */\n#define R_SPARC_HIPLT22 25              /* High 22 bit PLT entry */\n#define R_SPARC_LOPLT10 26              /* Truncated 10 bit PLT entry */\n#define R_SPARC_PCPLT32 27              /* PC rel 32 bit ref to PLT entry */\n#define R_SPARC_PCPLT22 28              /* PC rel high 22 bit PLT entry */\n#define R_SPARC_PCPLT10 29              /* PC rel trunc 10 bit PLT entry */\n#define R_SPARC_10      30              /* Direct 10 bit */\n#define R_SPARC_11      31              /* Direct 11 bit */\n#define R_SPARC_64      32              /* Direct 64 bit */\n#define R_SPARC_OLO10   33              /* ?? */\n#define R_SPARC_HH22    34              /* Top 22 bits of direct 64 bit */\n#define R_SPARC_HM10    35              /* High middle 10 bits of ... */\n#define R_SPARC_LM22    36              /* Low middle 22 bits of ... */\n#define R_SPARC_PC_HH22 37              /* Top 22 bits of pc rel 64 bit */\n#define R_SPARC_PC_HM10 38              /* High middle 10 bit of ... */\n#define R_SPARC_PC_LM22 39              /* Low miggle 22 bits of ... */\n#define R_SPARC_WDISP16 40              /* PC relative 16 bit shifted */\n#define R_SPARC_WDISP19 41              /* PC relative 19 bit shifted */\n#define R_SPARC_7       43              /* Direct 7 bit */\n#define R_SPARC_5       44              /* Direct 5 bit */\n#define R_SPARC_6       45              /* Direct 6 bit */\n#define R_SPARC_DISP64  46              /* PC relative 64 bit */\n#define R_SPARC_PLT64   47              /* Direct 64 bit ref to PLT entry */\n#define R_SPARC_HIX22   48              /* High 22 bit complemented */\n#define R_SPARC_LOX10   49              /* Truncated 11 bit complemented */\n#define R_SPARC_H44     50              /* Direct high 12 of 44 bit */\n#define R_SPARC_M44     51              /* Direct mid 22 of 44 bit */\n#define R_SPARC_L44     52              /* Direct low 10 of 44 bit */\n#define R_SPARC_REGISTER 53             /* Global register usage */\n#define R_SPARC_UA64    54              /* Direct 64 bit unaligned */\n#define R_SPARC_UA16    55              /* Direct 16 bit unaligned */\n/* Keep this the last entry.  */\n#define R_SPARC_NUM     56\n\n/* AMD x86-64 relocations.  */\n#define R_X86_64_NONE\t\t0\t/* No reloc */\n#define R_X86_64_64\t\t1\t/* Direct 64 bit  */\n#define R_X86_64_PC32\t\t2\t/* PC relative 32 bit signed */\n#define R_X86_64_GOT32\t\t3\t/* 32 bit GOT entry */\n#define R_X86_64_PLT32\t\t4\t/* 32 bit PLT address */\n#define R_X86_64_COPY\t\t5\t/* Copy symbol at runtime */\n#define R_X86_64_GLOB_DAT\t6\t/* Create GOT entry */\n#define R_X86_64_JUMP_SLOT\t7\t/* Create PLT entry */\n#define R_X86_64_RELATIVE\t8\t/* Adjust by program base */\n#define R_X86_64_GOTPCREL\t9\t/* 32 bit signed PC relative\n\t\t\t\t\t   offset to GOT */\n#define R_X86_64_32\t\t10\t/* Direct 32 bit zero extended */\n#define R_X86_64_32S\t\t11\t/* Direct 32 bit sign extended */\n#define R_X86_64_16\t\t12\t/* Direct 16 bit zero extended */\n#define R_X86_64_PC16\t\t13\t/* 16 bit sign extended pc relative */\n#define R_X86_64_8\t\t14\t/* Direct 8 bit sign extended  */\n#define R_X86_64_PC8\t\t15\t/* 8 bit sign extended pc relative */\n#define R_X86_64_DTPMOD64\t16\t/* ID of module containing symbol */\n#define R_X86_64_DTPOFF64\t17\t/* Offset in module's TLS block */\n#define R_X86_64_TPOFF64\t18\t/* Offset in initial TLS block */\n#define R_X86_64_TLSGD\t\t19\t/* 32 bit signed PC relative offset\n\t\t\t\t\t   to two GOT entries for GD symbol */\n#define R_X86_64_TLSLD\t\t20\t/* 32 bit signed PC relative offset\n\t\t\t\t\t   to two GOT entries for LD symbol */\n#define R_X86_64_DTPOFF32\t21\t/* Offset in TLS block */\n#define R_X86_64_GOTTPOFF\t22\t/* 32 bit signed PC relative offset\n\t\t\t\t\t   to GOT entry for IE symbol */\n#define R_X86_64_TPOFF32\t23\t/* Offset in initial TLS block */\n\n#define R_X86_64_NUM\t\t24\n\n/* For Sparc64, legal values for d_tag of Elf64_Dyn.  */\n\n#define DT_SPARC_REGISTER 0x70000001\n#define DT_SPARC_NUM    2\n\n/* Bits present in AT_HWCAP, primarily for Sparc32.  */\n\n#define HWCAP_SPARC_FLUSH       1       /* The cpu supports flush insn.  */\n#define HWCAP_SPARC_STBAR       2\n#define HWCAP_SPARC_SWAP        4\n#define HWCAP_SPARC_MULDIV      8\n#define HWCAP_SPARC_V9          16      /* The cpu is v9, so v8plus is ok.  */\n\n/* MIPS R3000 specific definitions.  */\n\n/* Legal values for e_flags field of Elf32_Ehdr.  */\n\n#define EF_MIPS_NOREORDER   1           /* A .noreorder directive was used */\n#define EF_MIPS_PIC         2           /* Contains PIC code */\n#define EF_MIPS_CPIC        4           /* Uses PIC calling sequence */\n#define EF_MIPS_XGOT        8\n#define EF_MIPS_64BIT_WHIRL 16\n#define EF_MIPS_ABI2        32\n#define EF_MIPS_ABI_ON32    64\n#define EF_MIPS_ARCH        0xf0000000  /* MIPS architecture level */\n\n/* Legal values for MIPS architecture level.  */\n\n#define EF_MIPS_ARCH_1      0x00000000  /* -mips1 code.  */\n#define EF_MIPS_ARCH_2      0x10000000  /* -mips2 code.  */\n#define EF_MIPS_ARCH_3      0x20000000  /* -mips3 code.  */\n#define EF_MIPS_ARCH_4      0x30000000  /* -mips4 code.  */\n#define EF_MIPS_ARCH_5      0x40000000  /* -mips5 code.  */\n\n/* The following are non-official names and should not be used.  */\n\n#define E_MIPS_ARCH_1     0x00000000    /* -mips1 code.  */\n#define E_MIPS_ARCH_2     0x10000000    /* -mips2 code.  */\n#define E_MIPS_ARCH_3     0x20000000    /* -mips3 code.  */\n#define E_MIPS_ARCH_4     0x30000000    /* -mips4 code.  */\n#define E_MIPS_ARCH_5     0x40000000    /* -mips5 code.  */\n\n/* Special section indices.  */\n\n#define SHN_MIPS_ACOMMON 0xff00         /* Allocated common symbols */\n#define SHN_MIPS_TEXT    0xff01         /* Allocated test symbols.  */\n#define SHN_MIPS_DATA    0xff02         /* Allocated data symbols.  */\n#define SHN_MIPS_SCOMMON 0xff03         /* Small common symbols */\n#define SHN_MIPS_SUNDEFINED 0xff04      /* Small undefined symbols */\n\n/* Legal values for sh_type field of Elf32_Shdr.  */\n\n#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link */\n#define SHT_MIPS_MSYM          0x70000001\n#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols */\n#define SHT_MIPS_GPTAB         0x70000003 /* Global data area sizes */\n#define SHT_MIPS_UCODE         0x70000004 /* Reserved for SGI/MIPS compilers */\n#define SHT_MIPS_DEBUG         0x70000005 /* MIPS ECOFF debugging information*/\n#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information */\n#define SHT_MIPS_PACKAGE       0x70000007\n#define SHT_MIPS_PACKSYM       0x70000008\n#define SHT_MIPS_RELD          0x70000009\n#define SHT_MIPS_IFACE         0x7000000b\n#define SHT_MIPS_CONTENT       0x7000000c\n#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */\n#define SHT_MIPS_SHDR          0x70000010\n#define SHT_MIPS_FDESC         0x70000011\n#define SHT_MIPS_EXTSYM        0x70000012\n#define SHT_MIPS_DENSE         0x70000013\n#define SHT_MIPS_PDESC         0x70000014\n#define SHT_MIPS_LOCSYM        0x70000015\n#define SHT_MIPS_AUXSYM        0x70000016\n#define SHT_MIPS_OPTSYM        0x70000017\n#define SHT_MIPS_LOCSTR        0x70000018\n#define SHT_MIPS_LINE          0x70000019\n#define SHT_MIPS_RFDESC        0x7000001a\n#define SHT_MIPS_DELTASYM      0x7000001b\n#define SHT_MIPS_DELTAINST     0x7000001c\n#define SHT_MIPS_DELTACLASS    0x7000001d\n#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */\n#define SHT_MIPS_DELTADECL     0x7000001f\n#define SHT_MIPS_SYMBOL_LIB    0x70000020\n#define SHT_MIPS_EVENTS        0x70000021 /* Event section.  */\n#define SHT_MIPS_TRANSLATE     0x70000022\n#define SHT_MIPS_PIXIE         0x70000023\n#define SHT_MIPS_XLATE         0x70000024\n#define SHT_MIPS_XLATE_DEBUG   0x70000025\n#define SHT_MIPS_WHIRL         0x70000026\n#define SHT_MIPS_EH_REGION     0x70000027\n#define SHT_MIPS_XLATE_OLD     0x70000028\n#define SHT_MIPS_PDR_EXCEPTION 0x70000029\n\n/* Legal values for sh_flags field of Elf32_Shdr.  */\n\n#define SHF_MIPS_GPREL   0x10000000     /* Must be part of global data area */\n#define SHF_MIPS_MERGE   0x20000000\n#define SHF_MIPS_ADDR    0x40000000\n#define SHF_MIPS_STRINGS 0x80000000\n#define SHF_MIPS_NOSTRIP 0x08000000\n#define SHF_MIPS_LOCAL   0x04000000\n#define SHF_MIPS_NAMES   0x02000000\n#define SHF_MIPS_NODUPE  0x01000000\n\n\n/* Symbol tables.  */\n\n/* MIPS specific values for `st_other'.  */\n#define STO_MIPS_DEFAULT                0x0\n#define STO_MIPS_INTERNAL               0x1\n#define STO_MIPS_HIDDEN                 0x2\n#define STO_MIPS_PROTECTED              0x3\n#define STO_MIPS_SC_ALIGN_UNUSED        0xff\n\n/* MIPS specific values for `st_info'.  */\n#define STB_MIPS_SPLIT_COMMON           13\n\n/* Entries found in sections of type SHT_MIPS_GPTAB.  */\n\ntypedef union\n{\n  struct\n    {\n      Elf32_Word gt_current_g_value;    /* -G value used for compilation */\n      Elf32_Word gt_unused;             /* Not used */\n    } gt_header;                        /* First entry in section */\n  struct\n    {\n      Elf32_Word gt_g_value;            /* If this value were used for -G */\n      Elf32_Word gt_bytes;              /* This many bytes would be used */\n    } gt_entry;                         /* Subsequent entries in section */\n} Elf32_gptab;\n\n/* Entry found in sections of type SHT_MIPS_REGINFO.  */\n\ntypedef struct\n{\n  Elf32_Word    ri_gprmask;             /* General registers used */\n  Elf32_Word    ri_cprmask[4];          /* Coprocessor registers used */\n  Elf32_Sword   ri_gp_value;            /* $gp register value */\n} Elf32_RegInfo;\n\n/* Entries found in sections of type SHT_MIPS_OPTIONS.  */\n\ntypedef struct\n{\n  unsigned char kind;           /* Determines interpretation of the\n                                   variable part of descriptor.  */\n  unsigned char size;           /* Size of descriptor, including header.  */\n  Elf32_Section section;        /* Section header index of section affected,\n                                   0 for global options.  */\n  Elf32_Word info;              /* Kind-specific information.  */\n} Elf_Options;\n\n/* Values for `kind' field in Elf_Options.  */\n\n#define ODK_NULL        0       /* Undefined.  */\n#define ODK_REGINFO     1       /* Register usage information.  */\n#define ODK_EXCEPTIONS  2       /* Exception processing options.  */\n#define ODK_PAD         3       /* Section padding options.  */\n#define ODK_HWPATCH     4       /* Hardware workarounds performed */\n#define ODK_FILL        5       /* record the fill value used by the linker. */\n#define ODK_TAGS        6       /* reserve space for desktop tools to write. */\n#define ODK_HWAND       7       /* HW workarounds.  'AND' bits when merging. */\n#define ODK_HWOR        8       /* HW workarounds.  'OR' bits when merging.  */\n\n/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */\n\n#define OEX_FPU_MIN     0x1f    /* FPE's which MUST be enabled.  */\n#define OEX_FPU_MAX     0x1f00  /* FPE's which MAY be enabled.  */\n#define OEX_PAGE0       0x10000 /* page zero must be mapped.  */\n#define OEX_SMM         0x20000 /* Force sequential memory mode?  */\n#define OEX_FPDBUG      0x40000 /* Force floating point debug mode?  */\n#define OEX_PRECISEFP   OEX_FPDBUG\n#define OEX_DISMISS     0x80000 /* Dismiss invalid address faults?  */\n\n#define OEX_FPU_INVAL   0x10\n#define OEX_FPU_DIV0    0x08\n#define OEX_FPU_OFLO    0x04\n#define OEX_FPU_UFLO    0x02\n#define OEX_FPU_INEX    0x01\n\n/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */\n\n#define OHW_R4KEOP      0x1     /* R4000 end-of-page patch.  */\n#define OHW_R8KPFETCH   0x2     /* may need R8000 prefetch patch.  */\n#define OHW_R5KEOP      0x4     /* R5000 end-of-page patch.  */\n#define OHW_R5KCVTL     0x8     /* R5000 cvt.[ds].l bug.  clean=1.  */\n\n#define OPAD_PREFIX     0x1\n#define OPAD_POSTFIX    0x2\n#define OPAD_SYMBOL     0x4\n\n/* Entry found in `.options' section.  */\n\ntypedef struct\n{\n  Elf32_Word hwp_flags1;        /* Extra flags.  */\n  Elf32_Word hwp_flags2;        /* Extra flags.  */\n} Elf_Options_Hw;\n\n/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */\n\n#define OHWA0_R4KEOP_CHECKED    0x00000001\n#define OHWA1_R4KEOP_CLEAN      0x00000002\n\n/* MIPS relocs.  */\n\n#define R_MIPS_NONE             0       /* No reloc */\n#define R_MIPS_16               1       /* Direct 16 bit */\n#define R_MIPS_32               2       /* Direct 32 bit */\n#define R_MIPS_REL32            3       /* PC relative 32 bit */\n#define R_MIPS_26               4       /* Direct 26 bit shifted */\n#define R_MIPS_HI16             5       /* High 16 bit */\n#define R_MIPS_LO16             6       /* Low 16 bit */\n#define R_MIPS_GPREL16          7       /* GP relative 16 bit */\n#define R_MIPS_LITERAL          8       /* 16 bit literal entry */\n#define R_MIPS_GOT16            9       /* 16 bit GOT entry */\n#define R_MIPS_PC16             10      /* PC relative 16 bit */\n#define R_MIPS_CALL16           11      /* 16 bit GOT entry for function */\n#define R_MIPS_GPREL32          12      /* GP relative 32 bit */\n\n#define R_MIPS_SHIFT5           16\n#define R_MIPS_SHIFT6           17\n#define R_MIPS_64               18\n#define R_MIPS_GOT_DISP         19\n#define R_MIPS_GOT_PAGE         20\n#define R_MIPS_GOT_OFST         21\n#define R_MIPS_GOT_HI16         22\n#define R_MIPS_GOT_LO16         23\n#define R_MIPS_SUB              24\n#define R_MIPS_INSERT_A         25\n#define R_MIPS_INSERT_B         26\n#define R_MIPS_DELETE           27\n#define R_MIPS_HIGHER           28\n#define R_MIPS_HIGHEST          29\n#define R_MIPS_CALL_HI16        30\n#define R_MIPS_CALL_LO16        31\n#define R_MIPS_SCN_DISP         32\n#define R_MIPS_REL16            33\n#define R_MIPS_ADD_IMMEDIATE    34\n#define R_MIPS_PJUMP            35\n#define R_MIPS_RELGOT           36\n#define R_MIPS_JALR             37\n/* Keep this the last entry.  */\n#define R_MIPS_NUM              38\n\n/* Legal values for p_type field of Elf32_Phdr.  */\n\n#define PT_MIPS_REGINFO 0x70000000      /* Register usage information */\n#define PT_MIPS_RTPROC  0x70000001      /* Runtime procedure table. */\n#define PT_MIPS_OPTIONS 0x70000002\n\n/* Special program header types.  */\n\n#define PF_MIPS_LOCAL   0x10000000\n\n/* Legal values for d_tag field of Elf32_Dyn.  */\n\n#define DT_MIPS_RLD_VERSION  0x70000001 /* Runtime linker interface version */\n#define DT_MIPS_TIME_STAMP   0x70000002 /* Timestamp */\n#define DT_MIPS_ICHECKSUM    0x70000003 /* Checksum */\n#define DT_MIPS_IVERSION     0x70000004 /* Version string (string tbl index) */\n#define DT_MIPS_FLAGS        0x70000005 /* Flags */\n#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */\n#define DT_MIPS_MSYM         0x70000007\n#define DT_MIPS_CONFLICT     0x70000008 /* Address of CONFLICT section */\n#define DT_MIPS_LIBLIST      0x70000009 /* Address of LIBLIST section */\n#define DT_MIPS_LOCAL_GOTNO  0x7000000a /* Number of local GOT entries */\n#define DT_MIPS_CONFLICTNO   0x7000000b /* Number of CONFLICT entries */\n#define DT_MIPS_LIBLISTNO    0x70000010 /* Number of LIBLIST entries */\n#define DT_MIPS_SYMTABNO     0x70000011 /* Number of DYNSYM entries */\n#define DT_MIPS_UNREFEXTNO   0x70000012 /* First external DYNSYM */\n#define DT_MIPS_GOTSYM       0x70000013 /* First GOT entry in DYNSYM */\n#define DT_MIPS_HIPAGENO     0x70000014 /* Number of GOT page table entries */\n#define DT_MIPS_RLD_MAP      0x70000016 /* Address of run time loader map.  */\n#define DT_MIPS_DELTA_CLASS  0x70000017 /* Delta C++ class definition.  */\n#define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in\n                                                DT_MIPS_DELTA_CLASS.  */\n#define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */\n#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in\n                                                DT_MIPS_DELTA_INSTANCE.  */\n#define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */\n#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in\n                                             DT_MIPS_DELTA_RELOC.  */\n#define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta\n                                           relocations refer to.  */\n#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in\n                                           DT_MIPS_DELTA_SYM.  */\n#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the\n                                             class declaration.  */\n#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in\n                                                DT_MIPS_DELTA_CLASSSYM.  */\n#define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */\n#define DT_MIPS_PIXIE_INIT   0x70000023\n#define DT_MIPS_SYMBOL_LIB   0x70000024\n#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025\n#define DT_MIPS_LOCAL_GOTIDX 0x70000026\n#define DT_MIPS_HIDDEN_GOTIDX 0x70000027\n#define DT_MIPS_PROTECTED_GOTIDX 0x70000028\n#define DT_MIPS_OPTIONS      0x70000029 /* Address of .options.  */\n#define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */\n#define DT_MIPS_DYNSTR_ALIGN 0x7000002b\n#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */\n#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve\n                                                    function stored in GOT.  */\n#define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added\n                                           by rld on dlopen() calls.  */\n#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */\n#define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */\n#define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */\n#define DT_MIPS_NUM          0x32\n\n/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */\n\n#define RHF_NONE                   0            /* No flags */\n#define RHF_QUICKSTART             (1 << 0)     /* Use quickstart */\n#define RHF_NOTPOT                 (1 << 1)     /* Hash size not power of 2 */\n#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)     /* Ignore LD_LIBRARY_PATH */\n#define RHF_NO_MOVE                (1 << 3)\n#define RHF_SGI_ONLY               (1 << 4)\n#define RHF_GUARANTEE_INIT         (1 << 5)\n#define RHF_DELTA_C_PLUS_PLUS      (1 << 6)\n#define RHF_GUARANTEE_START_INIT   (1 << 7)\n#define RHF_PIXIE                  (1 << 8)\n#define RHF_DEFAULT_DELAY_LOAD     (1 << 9)\n#define RHF_REQUICKSTART           (1 << 10)\n#define RHF_REQUICKSTARTED         (1 << 11)\n#define RHF_CORD                   (1 << 12)\n#define RHF_NO_UNRES_UNDEF         (1 << 13)\n#define RHF_RLD_ORDER_SAFE         (1 << 14)\n\n/* Entries found in sections of type SHT_MIPS_LIBLIST.  */\n\ntypedef struct\n{\n  Elf32_Word l_name;            /* Name (string table index) */\n  Elf32_Word l_time_stamp;      /* Timestamp */\n  Elf32_Word l_checksum;        /* Checksum */\n  Elf32_Word l_version;         /* Interface version */\n  Elf32_Word l_flags;           /* Flags */\n} Elf32_Lib;\n\ntypedef struct\n{\n  Elf64_Word l_name;            /* Name (string table index) */\n  Elf64_Word l_time_stamp;      /* Timestamp */\n  Elf64_Word l_checksum;        /* Checksum */\n  Elf64_Word l_version;         /* Interface version */\n  Elf64_Word l_flags;           /* Flags */\n} Elf64_Lib;\n\n\n/* Legal values for l_flags.  */\n\n#define LL_NONE           0\n#define LL_EXACT_MATCH    (1 << 0)      /* Require exact match */\n#define LL_IGNORE_INT_VER (1 << 1)      /* Ignore interface version */\n#define LL_REQUIRE_MINOR  (1 << 2)\n#define LL_EXPORTS        (1 << 3)\n#define LL_DELAY_LOAD     (1 << 4)\n#define LL_DELTA          (1 << 5)\n\n/* Entries found in sections of type SHT_MIPS_CONFLICT.  */\n\ntypedef Elf32_Addr Elf32_Conflict;\n\n\n/* HPPA specific definitions.  */\n\n/* Legal values for e_flags field of Elf32_Ehdr.  */\n\n#define EF_PARISC_TRAPNL        1       /* Trap nil pointer dereference.  */\n#define EF_PARISC_EXT           2       /* Program uses arch. extensions.  */\n#define EF_PARISC_ARCH          0xffff0000 /* Architecture version.  */\n/* Defined values are:\n                                0x020b  PA-RISC 1.0 big-endian\n                                0x0210  PA-RISC 1.1 big-endian\n                                0x028b  PA-RISC 1.0 little-endian\n                                0x0290  PA-RISC 1.1 little-endian\n*/\n\n/* Legal values for sh_type field of Elf32_Shdr.  */\n\n#define SHT_PARISC_GOT          0x70000000 /* GOT for external data.  */\n#define SHT_PARISC_ARCH         0x70000001 /* Architecture extensions.  */\n#define SHT_PARISC_GLOBAL       0x70000002 /* Definition of $global$.  */\n#define SHT_PARISC_MILLI        0x70000003 /* Millicode routines.  */\n#define SHT_PARISC_UNWIND       0x70000004 /* Unwind information.  */\n#define SHT_PARISC_PLT          0x70000005 /* Procedure linkage table.  */\n#define SHT_PARISC_SDATA        0x70000006 /* Short initialized data.  */\n#define SHT_PARISC_SBSS         0x70000007 /* Short uninitialized data.  */\n#define SHT_PARISC_SYMEXTN      0x70000008 /* Argument/relocation info.  */\n#define SHT_PARISC_STUBS        0x70000009 /* Linker stubs.  */\n\n/* Legal values for sh_flags field of Elf32_Shdr.  */\n\n#define SHF_PARISC_GLOBAL       0x10000000 /* Section defines dp.  */\n#define SHF_PARISC_SHORT        0x20000000 /* Section with short addressing. */\n\n/* Legal values for ST_TYPE subfield of st_info (symbol type).  */\n\n#define STT_PARISC_MILLICODE    13      /* Millicode function entry point.  */\n\n/* HPPA relocs.  */\n\n#define R_PARISC_NONE           0       /* No reloc.  */\n#define R_PARISC_DIR32          1       /* Direct 32-bit reference.  */\n#define R_PARISC_DIR21L         2       /* Left 21 bits of eff. address.  */\n#define R_PARISC_DIR17R         3       /* Right 17 bits of eff. address.  */\n#define R_PARISC_DIR14R         4       /* Right 14 bits of eff. address.  */\n#define R_PARISC_PCREL21L       5       /* PC-relative, left 21 bits.  */\n#define R_PARISC_PCREL14R       6       /* PC-relative, right 14 bits.  */\n#define R_PARISC_PCREL17C       7       /* Conditional PC-relative, ignore\n                                           if displacement > 17bits.  */\n#define R_PARISC_PCREL17F       8       /* Conditional PC-relative, must\n                                           fit in 17bits.  */\n#define R_PARISC_DPREL21L       9       /* DP-relative, left 21 bits.  */\n#define R_PARISC_DPREL14R       10      /* DP-relative, right 14 bits.  */\n#define R_PARISC_DPREL14F       11      /* DP-relative, must bit in 14 bits. */\n#define R_PARISC_DLTREL21L      12      /* DLT-relative, left 21 bits.  */\n#define R_PARISC_DLTREL14R      13      /* DLT-relative, right 14 bits.  */\n#define R_PARISC_DLTREL14F      14      /* DLT-relative, must fit in 14 bits.*/\n#define R_PARISC_DLTIND21L      15      /* DLT-relative indirect, left\n                                           21 bits.  */\n#define R_PARISC_DLTIND14R      16      /* DLT-relative indirect, right\n                                           14 bits.  */\n#define R_PARISC_DLTIND14F      17      /* DLT-relative indirect, must fit\n                                           int 14 bits.  */\n#define R_PARISC_PLABEL32       18      /* Direct 32-bit reference to proc.  */\n\n/* Alpha specific definitions.  */\n\n/* Legal values for e_flags field of Elf64_Ehdr.  */\n\n#define EF_ALPHA_32BIT          1       /* All addresses must be < 2GB.  */\n#define EF_ALPHA_CANRELAX       2       /* Relocations for relaxing exist.  */\n\n/* Legal values for sh_type field of Elf64_Shdr.  */\n\n/* These two are primerily concerned with ECOFF debugging info.  */\n#define SHT_ALPHA_DEBUG         0x70000001\n#define SHT_ALPHA_REGINFO       0x70000002\n\n/* Legal values for sh_flags field of Elf64_Shdr.  */\n\n#define SHF_ALPHA_GPREL         0x10000000\n\n/* Legal values for st_other field of Elf64_Sym.  */\n#define STO_ALPHA_NOPV          0x80    /* No PV required.  */\n#define STO_ALPHA_STD_GPLOAD    0x88    /* PV only used for initial ldgp.  */\n\n/* Alpha relocs.  */\n\n#define R_ALPHA_NONE            0       /* No reloc */\n#define R_ALPHA_REFLONG         1       /* Direct 32 bit */\n#define R_ALPHA_REFQUAD         2       /* Direct 64 bit */\n#define R_ALPHA_GPREL32         3       /* GP relative 32 bit */\n#define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */\n#define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */\n#define R_ALPHA_GPDISP          6       /* Add displacement to GP */\n#define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */\n#define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */\n#define R_ALPHA_SREL16          9       /* PC relative 16 bit */\n#define R_ALPHA_SREL32          10      /* PC relative 32 bit */\n#define R_ALPHA_SREL64          11      /* PC relative 64 bit */\n#define R_ALPHA_OP_PUSH         12      /* OP stack push */\n#define R_ALPHA_OP_STORE        13      /* OP stack pop and store */\n#define R_ALPHA_OP_PSUB         14      /* OP stack subtract */\n#define R_ALPHA_OP_PRSHIFT      15      /* OP stack right shift */\n#define R_ALPHA_GPVALUE         16\n#define R_ALPHA_GPRELHIGH       17\n#define R_ALPHA_GPRELLOW        18\n#define R_ALPHA_IMMED_GP_16     19\n#define R_ALPHA_IMMED_GP_HI32   20\n#define R_ALPHA_IMMED_SCN_HI32  21\n#define R_ALPHA_IMMED_BR_HI32   22\n#define R_ALPHA_IMMED_LO32      23\n#define R_ALPHA_COPY            24      /* Copy symbol at runtime */\n#define R_ALPHA_GLOB_DAT        25      /* Create GOT entry */\n#define R_ALPHA_JMP_SLOT        26      /* Create PLT entry */\n#define R_ALPHA_RELATIVE        27      /* Adjust by program base */\n/* Keep this the last entry.  */\n#define R_ALPHA_NUM             28\n\n\n/* PowerPC specific declarations */\n\n/* PowerPC relocations defined by the ABIs */\n#define R_PPC_NONE              0\n#define R_PPC_ADDR32            1       /* 32bit absolute address */\n#define R_PPC_ADDR24            2       /* 26bit address, 2 bits ignored.  */\n#define R_PPC_ADDR16            3       /* 16bit absolute address */\n#define R_PPC_ADDR16_LO         4       /* lower 16bit of absolute address */\n#define R_PPC_ADDR16_HI         5       /* high 16bit of absolute address */\n#define R_PPC_ADDR16_HA         6       /* adjusted high 16bit */\n#define R_PPC_ADDR14            7       /* 16bit address, 2 bits ignored */\n#define R_PPC_ADDR14_BRTAKEN    8\n#define R_PPC_ADDR14_BRNTAKEN   9\n#define R_PPC_REL24             10      /* PC relative 26 bit */\n#define R_PPC_REL14             11      /* PC relative 16 bit */\n#define R_PPC_REL14_BRTAKEN     12\n#define R_PPC_REL14_BRNTAKEN    13\n#define R_PPC_GOT16             14\n#define R_PPC_GOT16_LO          15\n#define R_PPC_GOT16_HI          16\n#define R_PPC_GOT16_HA          17\n#define R_PPC_PLTREL24          18\n#define R_PPC_COPY              19\n#define R_PPC_GLOB_DAT          20\n#define R_PPC_JMP_SLOT          21\n#define R_PPC_RELATIVE          22\n#define R_PPC_LOCAL24PC         23\n#define R_PPC_UADDR32           24\n#define R_PPC_UADDR16           25\n#define R_PPC_REL32             26\n#define R_PPC_PLT32             27\n#define R_PPC_PLTREL32          28\n#define R_PPC_PLT16_LO          29\n#define R_PPC_PLT16_HI          30\n#define R_PPC_PLT16_HA          31\n#define R_PPC_SDAREL16          32\n#define R_PPC_SECTOFF           33\n#define R_PPC_SECTOFF_LO        34\n#define R_PPC_SECTOFF_HI        35\n#define R_PPC_SECTOFF_HA        36\n/* Keep this the last entry.  */\n#define R_PPC_NUM               37\n\n/* The remaining relocs are from the Embedded ELF ABI, and are not\n   in the SVR4 ELF ABI.  */\n#define R_PPC_EMB_NADDR32       101\n#define R_PPC_EMB_NADDR16       102\n#define R_PPC_EMB_NADDR16_LO    103\n#define R_PPC_EMB_NADDR16_HI    104\n#define R_PPC_EMB_NADDR16_HA    105\n#define R_PPC_EMB_SDAI16        106\n#define R_PPC_EMB_SDA2I16       107\n#define R_PPC_EMB_SDA2REL       108\n#define R_PPC_EMB_SDA21         109     /* 16 bit offset in SDA */\n#define R_PPC_EMB_MRKREF        110\n#define R_PPC_EMB_RELSEC16      111\n#define R_PPC_EMB_RELST_LO      112\n#define R_PPC_EMB_RELST_HI      113\n#define R_PPC_EMB_RELST_HA      114\n#define R_PPC_EMB_BIT_FLD       115\n#define R_PPC_EMB_RELSDA        116     /* 16 bit relative offset in SDA */\n\n/* Diab tool relocations.  */\n#define R_PPC_DIAB_SDA21_LO     180     /* like EMB_SDA21, but lower 16 bit */\n#define R_PPC_DIAB_SDA21_HI     181     /* like EMB_SDA21, but high 16 bit */\n#define R_PPC_DIAB_SDA21_HA     182     /* like EMB_SDA21, adjusted high 16 */\n#define R_PPC_DIAB_RELSDA_LO    183     /* like EMB_RELSDA, but lower 16 bit */\n#define R_PPC_DIAB_RELSDA_HI    184     /* like EMB_RELSDA, but high 16 bit */\n#define R_PPC_DIAB_RELSDA_HA    185     /* like EMB_RELSDA, adjusted high 16 */\n\n/* This is a phony reloc to handle any old fashioned TOC16 references\n   that may still be in object files.  */\n#define R_PPC_TOC16             255\n\n\n/* ARM specific declarations */\n\n/* Processor specific flags for the ELF header e_flags field.  */\n#define EF_ARM_RELEXEC     0x01\n#define EF_ARM_HASENTRY    0x02\n#define EF_ARM_INTERWORK   0x04\n#define EF_ARM_APCS_26     0x08\n#define EF_ARM_APCS_FLOAT  0x10\n#define EF_ARM_PIC         0x20\n#define EF_ALIGN8          0x40         /* 8-bit structure alignment is in use */\n#define EF_NEW_ABI         0x80\n#define EF_OLD_ABI         0x100\n\n/* Additional symbol types for Thumb */\n#define STT_ARM_TFUNC      0xd\n\n/* ARM-specific values for sh_flags */\n#define SHF_ARM_ENTRYSECT  0x10000000   /* Section contains an entry point */\n#define SHF_ARM_COMDEF     0x80000000   /* Section may be multiply defined\n                                           in the input to a link step */\n\n/* ARM-specific program header flags */\n#define PF_ARM_SB          0x10000000   /* Segment contains the location\n                                           addressed by the static base */\n\n/* ARM relocs.  */\n#define R_ARM_NONE              0       /* No reloc */\n#define R_ARM_PC24              1       /* PC relative 26 bit branch */\n#define R_ARM_ABS32             2       /* Direct 32 bit  */\n#define R_ARM_REL32             3       /* PC relative 32 bit */\n#define R_ARM_PC13              4\n#define R_ARM_ABS16             5       /* Direct 16 bit */\n#define R_ARM_ABS12             6       /* Direct 12 bit */\n#define R_ARM_THM_ABS5          7\n#define R_ARM_ABS8              8       /* Direct 8 bit */\n#define R_ARM_SBREL32           9\n#define R_ARM_THM_CALL          10\n#define R_ARM_THM_PC8           11\n#define R_ARM_AMP_VCALL9        12\n#define R_ARM_SWI24             13\n#define R_ARM_THM_SWI8          14\n#define R_ARM_XPC25             15\n#define R_ARM_THM_XPC22         16\n#define R_ARM_COPY              20      /* Copy symbol at runtime */\n#define R_ARM_GLOB_DAT          21      /* Create GOT entry */\n#define R_ARM_JUMP_SLOT         22      /* Create PLT entry */\n#define R_ARM_RELATIVE          23      /* Adjust by program base */\n#define R_ARM_GOTOFF32          24      /* 32 bit offset to GOT */\n#define R_ARM_BASE_PREL         25      /* 32 bit PC relative offset to GOT */\n#define R_ARM_GOT_BREL          26      /* 32 bit GOT entry */\n#define R_ARM_PLT32             27      /* 32 bit PLT address */\n#define R_ARM_CALL              28\n#define R_ARM_JUMP24            29\n#define R_ARM_THM_JUMP24        30\n#define R_ARM_V4BX              40\n#define R_ARM_PREL31            42\n#define R_ARM_MOVW_ABS_NC       43\n#define R_ARM_MOVT_ABS          44\n#define R_ARM_THM_MOVW_ABS_NC   47\n#define R_ARM_THM_MOVT_ABS      48\n#define R_ARM_GNU_VTENTRY       100\n#define R_ARM_GNU_VTINHERIT     101\n#define R_ARM_THM_PC11          102     /* thumb unconditional branch */\n#define R_ARM_THM_PC9           103     /* thumb conditional branch */\n#define R_ARM_RXPC25            249\n#define R_ARM_RSBREL32          250\n#define R_ARM_THM_RPC22         251\n#define R_ARM_RREL32            252\n#define R_ARM_RABS22            253\n#define R_ARM_RPC24             254\n#define R_ARM_RBASE             255\n/* Keep this the last entry.  */\n#define R_ARM_NUM               256\n\n/* TMS320C67xx specific declarations */\n/* XXX: no ELF standard yet */\n\n/* TMS320C67xx relocs. */\n#define R_C60_32       1\n#define R_C60_GOT32     3               /* 32 bit GOT entry */\n#define R_C60_PLT32     4               /* 32 bit PLT address */\n#define R_C60_COPY      5               /* Copy symbol at runtime */\n#define R_C60_GLOB_DAT  6               /* Create GOT entry */\n#define R_C60_JMP_SLOT  7               /* Create PLT entry */\n#define R_C60_RELATIVE  8               /* Adjust by program base */\n#define R_C60_GOTOFF    9               /* 32 bit offset to GOT */\n#define R_C60_GOTPC     10              /* 32 bit PC relative offset to GOT */\n\n#define R_C60HI16      0x55       // high 16 bit MVKH embedded\n#define R_C60LO16      0x54       // low 16 bit MVKL embedded\n\n#endif  /* elf.h */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/examples/ex1.c",
    "content": "#!/usr/local/bin/tcc -run\n#include <tcclib.h>\n\nint main()\n{\n    printf(\"Hello World\\n\");\n    return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/examples/ex2.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n\n#define N 20\n\nint nb_num;\nint tab[N];\nint stack_ptr;\nint stack_op[N];\nint stack_res[60];\nint result;\n\nint find(int n, int i1, int a, int b, int op)\n{\n    int i, j;\n    int c;\n\n    if (stack_ptr >= 0) {\n        stack_res[3*stack_ptr] = a;\n        stack_op[stack_ptr] = op;\n        stack_res[3*stack_ptr+1] = b;\n        stack_res[3*stack_ptr+2] = n;\n        if (n == result)\n            return 1;\n        tab[i1] = n;\n    }\n\n    for(i=0;i<nb_num;i++) {\n        for(j=i+1;j<nb_num;j++) {\n            a = tab[i];\n            b = tab[j];\n            if (a != 0 && b != 0) {\n\n                tab[j] = 0;\n                stack_ptr++;\n\n                if (find(a + b, i, a, b, '+'))\n                    return 1;\n                if (find(a - b, i, a, b, '-'))\n                    return 1;\n                if (find(b - a, i, b, a, '-'))\n                    return 1;\n                if (find(a * b, i, a, b, '*'))\n                    return 1;\n                if (b != 0) {\n                    c = a / b;\n                    if (find(c, i, a, b, '/'))\n                        return 1;\n                }\n\n                if (a != 0) {\n                    c = b / a;\n                    if (find(c, i, b, a, '/'))\n                        return 1;\n                }\n\n                stack_ptr--;\n                tab[i] = a;\n                tab[j] = b;\n            }\n        }\n    }\n\n    return 0;\n}\n\nint main(int argc, char **argv)\n{\n    int i, res, p;\n\n    if (argc < 3) {\n        printf(\"usage: %s: result numbers...\\n\"\n               \"Try to find result from numbers with the 4 basic operations.\\n\", argv[0]);\n        exit(1);\n    }\n\n    p = 1;\n    result = atoi(argv[p]);\n    printf(\"result=%d\\n\", result);\n    nb_num = 0;\n    for(i=p+1;i<argc;i++) {\n        tab[nb_num++] = atoi(argv[i]);\n    }\n\n    stack_ptr = -1;\n    res = find(0, 0, 0, 0, ' ');\n    if (res) {\n        for(i=0;i<=stack_ptr;i++) {\n            printf(\"%d %c %d = %d\\n\",\n                   stack_res[3*i], stack_op[i],\n                   stack_res[3*i+1], stack_res[3*i+2]);\n        }\n        return 0;\n    } else {\n        printf(\"Impossible\\n\");\n        return 1;\n    }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/examples/ex3.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n\nint fib(n)\n{\n    if (n <= 2)\n        return 1;\n    else\n        return fib(n-1) + fib(n-2);\n}\n\nint main(int argc, char **argv)\n{\n    int n;\n    if (argc < 2) {\n        printf(\"usage: fib n\\n\"\n               \"Compute nth Fibonacci number\\n\");\n        return 1;\n    }\n\n    n = atoi(argv[1]);\n    printf(\"fib(%d) = %d\\n\", n, fib(n, 2));\n    return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/examples/ex4.c",
    "content": "#!/usr/local/bin/tcc -run -L/usr/X11R6/lib -lX11\n#include <stdlib.h>\n#include <stdio.h>\n#include <X11/Xlib.h>\n\n/* Yes, TCC can use X11 too ! */\n\nint main(int argc, char **argv)\n{\n    Display *display;\n    Screen *screen;\n\n    display = XOpenDisplay(\"\");\n    if (!display) {\n        fprintf(stderr, \"Could not open X11 display\\n\");\n        exit(1);\n    }\n    printf(\"X11 display opened.\\n\");\n    screen = XScreenOfDisplay(display, 0);\n    printf(\"width = %d\\nheight = %d\\ndepth = %d\\n\",\n           screen->width,\n           screen->height,\n           screen->root_depth);\n    XCloseDisplay(display);\n    return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/examples/ex5.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n\nint main()\n{\n    printf(\"Hello World\\n\");\n    return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/i386-asm.c",
    "content": "/*\n *  i386 specific functions for TCC assembler\n *\n *  Copyright (c) 2001, 2002 Fabrice Bellard\n *  Copyright (c) 2009 Frdric Feret (x86_64 support)\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\n// #define NB_ASM_REGS 8\n#define MAX_OPERANDS 3\n#define NB_SAVED_REGS 3\n\n#define TOK_ASM_first TOK_ASM_clc\n#define TOK_ASM_last TOK_ASM_emms\n\n#define OPC_JMP        0x01  /* jmp operand */\n#define OPC_B          0x02  /* only used with OPC_WL */\n#define OPC_WL         0x04  /* accepts w, l or no suffix */\n#define OPC_BWL        (OPC_B | OPC_WL) /* accepts b, w, l or no suffix */\n#define OPC_REG        0x08 /* register is added to opcode */\n#define OPC_MODRM      0x10 /* modrm encoding */\n#define OPC_FWAIT      0x20 /* add fwait opcode */\n#define OPC_TEST       0x40 /* test opcodes */\n#define OPC_SHIFT      0x80 /* shift opcodes */\n#define OPC_D16      0x0100 /* generate data16 prefix */\n#define OPC_ARITH    0x0200 /* arithmetic opcodes */\n#define OPC_SHORTJMP 0x0400 /* short jmp operand */\n#define OPC_FARITH   0x0800 /* FPU arithmetic opcodes */\n#ifdef TCC_TARGET_X86_64\n# define OPC_WLQ     0x1000  /* accepts w, l, q or no suffix */\n# define OPC_BWLQ    (OPC_B | OPC_WLQ) /* accepts b, w, l, q or no suffix */\n# define OPC_WLX     OPC_WLQ\n#else\n# define OPC_WLX     OPC_WL\n#endif\n\n#define OPC_GROUP_SHIFT 13\n\n/* in order to compress the operand type, we use specific operands and\n   we or only with EA  */\nenum {\n    OPT_REG8=0, /* warning: value is hardcoded from TOK_ASM_xxx */\n    OPT_REG16,  /* warning: value is hardcoded from TOK_ASM_xxx */\n    OPT_REG32,  /* warning: value is hardcoded from TOK_ASM_xxx */\n#ifdef TCC_TARGET_X86_64\n    OPT_REG64,  /* warning: value is hardcoded from TOK_ASM_xxx */\n#endif\n    OPT_MMX,    /* warning: value is hardcoded from TOK_ASM_xxx */\n    OPT_SSE,    /* warning: value is hardcoded from TOK_ASM_xxx */\n    OPT_CR,     /* warning: value is hardcoded from TOK_ASM_xxx */\n    OPT_TR,     /* warning: value is hardcoded from TOK_ASM_xxx */\n    OPT_DB,     /* warning: value is hardcoded from TOK_ASM_xxx */\n    OPT_SEG,\n    OPT_ST,\n    OPT_IM8,\n    OPT_IM8S,\n    OPT_IM16,\n    OPT_IM32,\n#ifdef TCC_TARGET_X86_64\n    OPT_IM64,\n#endif\n    OPT_EAX,    /* %al, %ax, %eax or %rax register */\n    OPT_ST0,    /* %st(0) register */\n    OPT_CL,     /* %cl register */\n    OPT_DX,     /* %dx register */\n    OPT_ADDR,   /* OP_EA with only offset */\n    OPT_INDIR,  /* *(expr) */\n    /* composite types */\n    OPT_COMPOSITE_FIRST,\n    OPT_IM,     /* IM8 | IM16 | IM32 | IM64 */\n    OPT_REG,    /* REG8 | REG16 | REG32 | REG64 */\n    OPT_REGW,   /* REG16 | REG32 | REG64 */\n    OPT_IMW,    /* IM16 | IM32 | IM64 */\n#ifdef TCC_TARGET_X86_64\n    OPT_IMNO64, /* IM16 | IM32 */\n#endif\n    /* can be ored with any OPT_xxx */\n    OPT_EA = 0x80\n};\n\n#define OP_REG8   (1 << OPT_REG8)\n#define OP_REG16  (1 << OPT_REG16)\n#define OP_REG32  (1 << OPT_REG32)\n#define OP_MMX    (1 << OPT_MMX)\n#define OP_SSE    (1 << OPT_SSE)\n#define OP_CR     (1 << OPT_CR)\n#define OP_TR     (1 << OPT_TR)\n#define OP_DB     (1 << OPT_DB)\n#define OP_SEG    (1 << OPT_SEG)\n#define OP_ST     (1 << OPT_ST)\n#define OP_IM8    (1 << OPT_IM8)\n#define OP_IM8S   (1 << OPT_IM8S)\n#define OP_IM16   (1 << OPT_IM16)\n#define OP_IM32   (1 << OPT_IM32)\n#define OP_EAX    (1 << OPT_EAX)\n#define OP_ST0    (1 << OPT_ST0)\n#define OP_CL     (1 << OPT_CL)\n#define OP_DX     (1 << OPT_DX)\n#define OP_ADDR   (1 << OPT_ADDR)\n#define OP_INDIR  (1 << OPT_INDIR)\n#ifdef TCC_TARGET_X86_64\n# define OP_REG64  (1 << OPT_REG64)\n# define OP_IM64   (1 << OPT_IM64)\n#else\n# define OP_REG64 0\n# define OP_IM64  0\n#endif\n\n#define OP_EA     0x40000000\n#define OP_REG    (OP_REG8 | OP_REG16 | OP_REG32 | OP_REG64)\n\n#ifdef TCC_TARGET_X86_64\n# define OP_IM      OP_IM64\n# define TREG_XAX   TREG_RAX\n# define TREG_XCX   TREG_RCX\n# define TREG_XDX   TREG_RDX\n#else\n# define OP_IM      OP_IM32\n# define TREG_XAX   TREG_EAX\n# define TREG_XCX   TREG_ECX\n# define TREG_XDX   TREG_EDX\n#endif\n\ntypedef struct ASMInstr {\n    uint16_t sym;\n    uint16_t opcode;\n    uint16_t instr_type;\n    uint8_t nb_ops;\n    uint8_t op_type[MAX_OPERANDS]; /* see OP_xxx */\n} ASMInstr;\n\ntypedef struct Operand {\n    uint32_t type;\n    int8_t  reg; /* register, -1 if none */\n    int8_t  reg2; /* second register, -1 if none */\n    uint8_t shift;\n    ExprValue e;\n} Operand;\n\nstatic const uint8_t reg_to_size[9] = {\n/*\n    [OP_REG8] = 0,\n    [OP_REG16] = 1,\n    [OP_REG32] = 2,\n#ifdef TCC_TARGET_X86_64\n    [OP_REG64] = 3,\n#endif\n*/\n    0, 0, 1, 0, 2, 0, 0, 0, 3\n};\n\n#define NB_TEST_OPCODES 30\n\nstatic const uint8_t test_bits[NB_TEST_OPCODES] = {\n 0x00, /* o */\n 0x01, /* no */\n 0x02, /* b */\n 0x02, /* c */\n 0x02, /* nae */\n 0x03, /* nb */\n 0x03, /* nc */\n 0x03, /* ae */\n 0x04, /* e */\n 0x04, /* z */\n 0x05, /* ne */\n 0x05, /* nz */\n 0x06, /* be */\n 0x06, /* na */\n 0x07, /* nbe */\n 0x07, /* a */\n 0x08, /* s */\n 0x09, /* ns */\n 0x0a, /* p */\n 0x0a, /* pe */\n 0x0b, /* np */\n 0x0b, /* po */\n 0x0c, /* l */\n 0x0c, /* nge */\n 0x0d, /* nl */\n 0x0d, /* ge */\n 0x0e, /* le */\n 0x0e, /* ng */\n 0x0f, /* nle */\n 0x0f, /* g */\n};\n\nstatic const uint8_t segment_prefixes[] = {\n 0x26, /* es */\n 0x2e, /* cs */\n 0x36, /* ss */\n 0x3e, /* ds */\n 0x64, /* fs */\n 0x65  /* gs */\n};\n\nstatic const ASMInstr asm_instrs[] = {\n#define ALT(x) x\n#define DEF_ASM_OP0(name, opcode)\n#define DEF_ASM_OP0L(name, opcode, group, instr_type) { TOK_ASM_ ## name, opcode, (instr_type | group << OPC_GROUP_SHIFT), 0 },\n#define DEF_ASM_OP1(name, opcode, group, instr_type, op0) { TOK_ASM_ ## name, opcode, (instr_type | group << OPC_GROUP_SHIFT), 1, { op0 }},\n#define DEF_ASM_OP2(name, opcode, group, instr_type, op0, op1) { TOK_ASM_ ## name, opcode, (instr_type | group << OPC_GROUP_SHIFT), 2, { op0, op1 }},\n#define DEF_ASM_OP3(name, opcode, group, instr_type, op0, op1, op2) { TOK_ASM_ ## name, opcode, (instr_type | group << OPC_GROUP_SHIFT), 3, { op0, op1, op2 }},\n#ifdef TCC_TARGET_X86_64\n# include \"x86_64-asm.h\"\n#else\n# include \"i386-asm.h\"\n#endif\n    /* last operation */\n    { 0, },\n};\n\nstatic const uint16_t op0_codes[] = {\n#define ALT(x)\n#define DEF_ASM_OP0(x, opcode) opcode,\n#define DEF_ASM_OP0L(name, opcode, group, instr_type)\n#define DEF_ASM_OP1(name, opcode, group, instr_type, op0)\n#define DEF_ASM_OP2(name, opcode, group, instr_type, op0, op1)\n#define DEF_ASM_OP3(name, opcode, group, instr_type, op0, op1, op2)\n#ifdef TCC_TARGET_X86_64\n# include \"x86_64-asm.h\"\n#else\n# include \"i386-asm.h\"\n#endif\n};\n\nstatic inline int get_reg_shift(TCCState *s1)\n{\n    int shift, v;\n#ifdef I386_ASM_16\n    if (s1->seg_size == 16)\n        tcc_error(\"invalid effective address\");\n#endif\n    v = asm_int_expr(s1);\n    switch(v) {\n    case 1:\n        shift = 0;\n        break;\n    case 2:\n        shift = 1;\n        break;\n    case 4:\n        shift = 2;\n        break;\n    case 8:\n        shift = 3;\n        break;\n    default:\n        expect(\"1, 2, 4 or 8 constant\");\n        shift = 0;\n        break;\n    }\n    return shift;\n}\n\nstatic int asm_parse_reg(void)\n{\n    int reg = 0;\n    if (tok != '%')\n        goto error_32;\n    next();\n    if (tok >= TOK_ASM_eax && tok <= TOK_ASM_edi) {\n        reg = tok - TOK_ASM_eax;\n#ifdef TCC_TARGET_X86_64\n    } else if (tok >= TOK_ASM_rax && tok <= TOK_ASM_rdi) {\n        reg = tok - TOK_ASM_rax;\n#endif\n#ifdef I386_ASM_16\n    } else if (tok >= TOK_ASM_ax && tok <= TOK_ASM_di) {\n        reg = tok - TOK_ASM_ax;\n#endif\n    } else {\n    error_32:\n        expect(\"register\");\n    }\n    next();\n    return reg;\n}\n\nstatic void parse_operand(TCCState *s1, Operand *op)\n{\n    ExprValue e;\n    int reg, indir;\n    const char *p;\n\n    indir = 0;\n    if (tok == '*') {\n        next();\n        indir = OP_INDIR;\n    }\n\n    if (tok == '%') {\n        next();\n        if (tok >= TOK_ASM_al && tok <= TOK_ASM_db7) {\n            reg = tok - TOK_ASM_al;\n            op->type = 1 << (reg >> 3); /* WARNING: do not change constant order */\n            op->reg = reg & 7;\n            if ((op->type & OP_REG) && op->reg == TREG_XAX)\n                op->type |= OP_EAX;\n            else if (op->type == OP_REG8 && op->reg == TREG_XCX)\n                op->type |= OP_CL;\n            else if (op->type == OP_REG16 && op->reg == TREG_XDX)\n                op->type |= OP_DX;\n        } else if (tok >= TOK_ASM_dr0 && tok <= TOK_ASM_dr7) {\n            op->type = OP_DB;\n            op->reg = tok - TOK_ASM_dr0;\n        } else if (tok >= TOK_ASM_es && tok <= TOK_ASM_gs) {\n            op->type = OP_SEG;\n            op->reg = tok - TOK_ASM_es;\n        } else if (tok == TOK_ASM_st) {\n            op->type = OP_ST;\n            op->reg = 0;\n            next();\n            if (tok == '(') {\n                next();\n                if (tok != TOK_PPNUM)\n                    goto reg_error;\n                p = tokc.cstr->data;\n                reg = p[0] - '0';\n                if ((unsigned)reg >= 8 || p[1] != '\\0')\n                    goto reg_error;\n                op->reg = reg;\n                next();\n                skip(')');\n            }\n            if (op->reg == 0)\n                op->type |= OP_ST0;\n            goto no_skip;\n        } else {\n        reg_error:\n            tcc_error(\"unknown register\");\n        }\n        next();\n    no_skip: ;\n    } else if (tok == '$') {\n        /* constant value */\n        next();\n        asm_expr(s1, &e);\n        op->type = OP_IM;\n        op->e.v = e.v;\n        op->e.sym = e.sym;\n        if (!op->e.sym) {\n            if (op->e.v == (uint8_t)op->e.v)\n                op->type |= OP_IM8;\n            if (op->e.v == (int8_t)op->e.v)\n                op->type |= OP_IM8S;\n            if (op->e.v == (uint16_t)op->e.v)\n                op->type |= OP_IM16;\n#ifdef TCC_TARGET_X86_64\n            if (op->e.v == (uint32_t)op->e.v)\n                op->type |= OP_IM32;\n#endif\n        }\n    } else {\n        /* address(reg,reg2,shift) with all variants */\n        op->type = OP_EA;\n        op->reg = -1;\n        op->reg2 = -1;\n        op->shift = 0;\n        if (tok != '(') {\n            asm_expr(s1, &e);\n            op->e.v = e.v;\n            op->e.sym = e.sym;\n        } else {\n            next();\n            if (tok == '%') {\n                unget_tok('(');\n                op->e.v = 0;\n                op->e.sym = NULL;\n            } else {\n                /* bracketed offset expression */\n                asm_expr(s1, &e);\n                if (tok != ')')\n                    expect(\")\");\n                next();\n                op->e.v = e.v;\n                op->e.sym = e.sym;\n            }\n        }\n        if (tok == '(') {\n            next();\n            if (tok != ',') {\n                op->reg = asm_parse_reg();\n            }\n            if (tok == ',') {\n                next();\n                if (tok != ',') {\n                    op->reg2 = asm_parse_reg();\n                }\n                if (tok == ',') {\n                    next();\n                    op->shift = get_reg_shift(s1);\n                }\n            }\n            skip(')');\n        }\n        if (op->reg == -1 && op->reg2 == -1)\n            op->type |= OP_ADDR;\n    }\n    op->type |= indir;\n}\n\n/* XXX: unify with C code output ? */\nST_FUNC void gen_expr32(ExprValue *pe)\n{\n    gen_addr32(pe->sym ? VT_SYM : 0, pe->sym, pe->v);\n}\n\n#ifdef TCC_TARGET_X86_64\nstatic void gen_expr64(ExprValue *pe)\n{\n    gen_addr64(pe->sym ? VT_SYM : 0, pe->sym, pe->v);\n}\n#endif\n\n/* XXX: unify with C code output ? */\nstatic void gen_disp32(ExprValue *pe)\n{\n    Sym *sym = pe->sym;\n    if (sym && sym->r == cur_text_section->sh_num) {\n        /* same section: we can output an absolute value. Note\n           that the TCC compiler behaves differently here because\n           it always outputs a relocation to ease (future) code\n           elimination in the linker */\n        gen_le32(pe->v + sym->jnext - ind - 4);\n    } else {\n        if (sym && sym->type.t == VT_VOID) {\n            sym->type.t = VT_FUNC;\n            sym->type.ref = NULL;\n        }\n        gen_addrpc32(VT_SYM, sym, pe->v);\n    }\n}\n\n#ifdef I386_ASM_16\nstatic void gen_expr16(ExprValue *pe)\n{\n    if (pe->sym)\n        greloc(cur_text_section, pe->sym, ind, R_386_16);\n    gen_le16(pe->v);\n}\nstatic void gen_disp16(ExprValue *pe)\n{\n    Sym *sym;\n    sym = pe->sym;\n    if (sym) {\n        if (sym->r == cur_text_section->sh_num) {\n            /* same section: we can output an absolute value. Note\n               that the TCC compiler behaves differently here because\n               it always outputs a relocation to ease (future) code\n               elimination in the linker */\n            gen_le16(pe->v + sym->jnext - ind - 2);\n        } else {\n            greloc(cur_text_section, sym, ind, R_386_PC16);\n            gen_le16(pe->v - 2);\n        }\n    } else {\n        /* put an empty PC32 relocation */\n        put_elf_reloc(symtab_section, cur_text_section,\n                      ind, R_386_PC16, 0);\n        gen_le16(pe->v - 2);\n    }\n}\n#endif\n\n/* generate the modrm operand */\nstatic inline void asm_modrm(int reg, Operand *op)\n{\n    int mod, reg1, reg2, sib_reg1;\n\n    if (op->type & (OP_REG | OP_MMX | OP_SSE)) {\n        g(0xc0 + (reg << 3) + op->reg);\n    } else if (op->reg == -1 && op->reg2 == -1) {\n        /* displacement only */\n#ifdef I386_ASM_16\n        if (tcc_state->seg_size == 16) {\n            g(0x06 + (reg << 3));\n            gen_expr16(&op->e);\n        } else if (tcc_state->seg_size == 32)\n#endif\n        {\n            g(0x05 + (reg << 3));\n            gen_expr32(&op->e);\n        }\n    } else {\n        sib_reg1 = op->reg;\n        /* fist compute displacement encoding */\n        if (sib_reg1 == -1) {\n            sib_reg1 = 5;\n            mod = 0x00;\n        } else if (op->e.v == 0 && !op->e.sym && op->reg != 5) {\n            mod = 0x00;\n        } else if (op->e.v == (int8_t)op->e.v && !op->e.sym) {\n            mod = 0x40;\n        } else {\n            mod = 0x80;\n        }\n        /* compute if sib byte needed */\n        reg1 = op->reg;\n        if (op->reg2 != -1)\n            reg1 = 4;\n#ifdef I386_ASM_16\n        if (tcc_state->seg_size == 32) {\n#endif\n        g(mod + (reg << 3) + reg1);\n        if (reg1 == 4) {\n            /* add sib byte */\n            reg2 = op->reg2;\n            if (reg2 == -1)\n                reg2 = 4; /* indicate no index */\n            g((op->shift << 6) + (reg2 << 3) + sib_reg1);\n        }\n#ifdef I386_ASM_16\n        } else if (tcc_state->seg_size == 16) {\n            /* edi = 7, esi = 6 --> di = 5, si = 4 */\n            if ((reg1 == 6) || (reg1 == 7)) {\n                reg1 -= 2;\n            /* ebx = 3 --> bx = 7 */\n            } else if (reg1 == 3) {\n                reg1 = 7;\n            /* o32 = 5 --> o16 = 6 */\n            } else if (reg1 == 5) {\n                reg1 = 6;\n            /* sib not valid in 16-bit mode */\n            } else if (reg1 == 4) {\n                reg2 = op->reg2;\n\t\t/* bp + si + offset */\n\t\tif ((sib_reg1 == 5) && (reg2 == 6)) {\n\t\t    reg1 = 2;\n\t\t/* bp + di + offset */\n\t\t} else if ((sib_reg1 == 5) && (reg2 == 7)) {\n\t\t    reg1 = 3;\n\t\t/* bx + si + offset */\n\t\t} else if ((sib_reg1 == 3) && (reg2 == 6)) {\n\t\t    reg1 = 0;\n\t\t/* bx + di + offset */\n\t\t} else if ((sib_reg1 == 3) && (reg2 == 7)) {\n\t\t    reg1 = 1;\n\t\t} else {\n\t\t    tcc_error(\"invalid effective address\");\n\t\t}\n\t\tif (op->e.v == 0)\n\t\t    mod = 0;\n            } else {\n                tcc_error(\"invalid register\");\n            }\n            g(mod + (reg << 3) + reg1);\n        }\n#endif\n        /* add offset */\n        if (mod == 0x40) {\n            g(op->e.v);\n        } else if (mod == 0x80 || op->reg == -1) {\n#ifdef I386_ASM_16\n            if (tcc_state->seg_size == 16)\n                gen_expr16(&op->e);\n            else if (tcc_state->seg_size == 32)\n#endif\n                gen_expr32(&op->e);\n        }\n    }\n}\n\nST_FUNC void asm_opcode(TCCState *s1, int opcode)\n{\n    const ASMInstr *pa;\n    int i, modrm_index, reg, v, op1, is_short_jmp, seg_prefix;\n    int nb_ops, s;\n    Operand ops[MAX_OPERANDS], *pop;\n    int op_type[3]; /* decoded op type */\n#ifdef I386_ASM_16\n    static int a32 = 0, o32 = 0, addr32 = 0, data32 = 0;\n#endif\n\n    /* force synthetic ';' after prefix instruction, so we can handle */\n    /* one-line things like \"rep stosb\" instead of only \"rep\\nstosb\" */\n    if (opcode >= TOK_ASM_wait && opcode <= TOK_ASM_repnz)\n        unget_tok(';');\n\n    /* get operands */\n    pop = ops;\n    nb_ops = 0;\n    seg_prefix = 0;\n    for(;;) {\n        if (tok == ';' || tok == TOK_LINEFEED)\n            break;\n        if (nb_ops >= MAX_OPERANDS) {\n            tcc_error(\"incorrect number of operands\");\n        }\n        parse_operand(s1, pop);\n        if (tok == ':') {\n           if (pop->type != OP_SEG || seg_prefix)\n               tcc_error(\"incorrect prefix\");\n           seg_prefix = segment_prefixes[pop->reg];\n           next();\n           parse_operand(s1, pop);\n#ifndef I386_ASM_16\n           if (!(pop->type & OP_EA)) {\n               tcc_error(\"segment prefix must be followed by memory reference\");\n           }\n#endif\n        }\n        pop++;\n        nb_ops++;\n        if (tok != ',')\n            break;\n        next();\n    }\n\n    is_short_jmp = 0;\n    s = 0; /* avoid warning */\n\n    /* optimize matching by using a lookup table (no hashing is needed\n       !) */\n    for(pa = asm_instrs; pa->sym != 0; pa++) {\n        s = 0;\n        if (pa->instr_type & OPC_FARITH) {\n            v = opcode - pa->sym;\n            if (!((unsigned)v < 8 * 6 && (v % 6) == 0))\n                continue;\n        } else if (pa->instr_type & OPC_ARITH) {\n            if (!(opcode >= pa->sym && opcode < pa->sym + 8*NBWLX))\n                continue;\n            s = (opcode - pa->sym) % NBWLX;\n        } else if (pa->instr_type & OPC_SHIFT) {\n            if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX))\n                continue;\n            s = (opcode - pa->sym) % NBWLX;\n        } else if (pa->instr_type & OPC_TEST) {\n            if (!(opcode >= pa->sym && opcode < pa->sym + NB_TEST_OPCODES))\n                continue;\n        } else if (pa->instr_type & OPC_B) {\n            if (!(opcode >= pa->sym && opcode < pa->sym + NBWLX))\n                continue;\n            s = opcode - pa->sym;\n        } else if (pa->instr_type & OPC_WLX) {\n            if (!(opcode >= pa->sym && opcode < pa->sym + NBWLX-1))\n                continue;\n            s = opcode - pa->sym + 1;\n        } else {\n            if (pa->sym != opcode)\n                continue;\n        }\n        if (pa->nb_ops != nb_ops)\n            continue;\n        /* now decode and check each operand */\n        for(i = 0; i < nb_ops; i++) {\n            int op1, op2;\n            op1 = pa->op_type[i];\n            op2 = op1 & 0x1f;\n            switch(op2) {\n            case OPT_IM:\n                v = OP_IM8 | OP_IM16 | OP_IM32 | OP_IM64;\n                break;\n            case OPT_REG:\n                v = OP_REG8 | OP_REG16 | OP_REG32 | OP_REG64;\n                break;\n            case OPT_REGW:\n                v = OP_REG16 | OP_REG32 | OP_REG64;\n                break;\n            case OPT_IMW:\n                v = OP_IM16 | OP_IM32 | OP_IM64;\n                break;\n#ifdef TCC_TARGET_X86_64\n            case OPT_IMNO64:\n                v = OP_IM16 | OP_IM32;\n                break;\n#endif\n            default:\n                v = 1 << op2;\n                break;\n            }\n            if (op1 & OPT_EA)\n                v |= OP_EA;\n            op_type[i] = v;\n            if ((ops[i].type & v) == 0)\n                goto next;\n        }\n        /* all is matching ! */\n        break;\n    next: ;\n    }\n    if (pa->sym == 0) {\n        if (opcode >= TOK_ASM_first && opcode <= TOK_ASM_last) {\n            int b;\n            b = op0_codes[opcode - TOK_ASM_first];\n#ifdef I386_ASM_16\n            if (opcode == TOK_ASM_o32) {\n                if (s1->seg_size == 32)\n                    tcc_error(\"incorrect prefix\");\n                else\n                    o32 = data32 = 1;\n            } else if (opcode == TOK_ASM_a32) {\n                if (s1->seg_size == 32)\n                    tcc_error(\"incorrect prefix\");\n                else\n                    a32 = addr32 = 1;\n            }\n#endif\n            if (b & 0xff00) \n                g(b >> 8);\n            g(b);\n            return;\n        } else {\n            tcc_error(\"unknown opcode '%s'\",\n                  get_tok_str(opcode, NULL));\n        }\n    }\n    /* if the size is unknown, then evaluate it (OPC_B or OPC_WL case) */\n    if (s == NBWLX-1) {\n        for(i = 0; s == NBWLX-1 && i < nb_ops; i++) {\n            if ((ops[i].type & OP_REG) && !(op_type[i] & (OP_CL | OP_DX)))\n                s = reg_to_size[ops[i].type & OP_REG];\n        }\n        if (s == NBWLX-1) {\n            if ((opcode == TOK_ASM_push || opcode == TOK_ASM_pop) &&\n                (ops[0].type & (OP_SEG | OP_IM8S | OP_IM32 | OP_IM64)))\n                s = 2;\n            else\n                tcc_error(\"cannot infer opcode suffix\");\n        }\n    }\n\n#ifdef I386_ASM_16\n    for(i = 0; i < nb_ops; i++) {\n        if (ops[i].type & OP_REG32) {\n            if (s1->seg_size == 16)\n                o32 = 1;\n        } else if (!(ops[i].type & OP_REG32)) {\n            if (s1->seg_size == 32)\n                o32 = 1;\n        }\n    }\n\n\n    if (s == 1 || (pa->instr_type & OPC_D16)) {\n        if (s1->seg_size == 32)\n            o32 = 1;\n    } else if (s == 2) {\n        if (s1->seg_size == 16) {\n            if (!(pa->instr_type & OPC_D16))\n            o32 = 1;\n        }\n    }\n\n    /* generate a16/a32 prefix if needed */\n    if ((a32 == 1) && (addr32 == 0))\n        g(0x67);\n    /* generate o16/o32 prefix if needed */\n    if ((o32 == 1) && (data32 == 0))\n        g(0x66);\n\n    addr32 = data32 = 0;\n#else\n    /* generate data16 prefix if needed */\n    if (s == 1 || (pa->instr_type & OPC_D16))\n        g(0x66);\n#ifdef TCC_TARGET_X86_64\n    else if (s == 3) {\n        /* generate REX prefix */\n        if ((opcode != TOK_ASM_push && opcode != TOK_ASM_pop)\n            || !(ops[0].type & OP_REG64))\n            g(0x48);\n    }\n#endif\n#endif\n\n    /* now generates the operation */\n    if (pa->instr_type & OPC_FWAIT)\n        g(0x9b);\n    if (seg_prefix)\n        g(seg_prefix);\n\n    v = pa->opcode;\n    if ((v == 0x69 || v == 0x6b) && nb_ops == 2) {\n        /* kludge for imul $im, %reg */\n        nb_ops = 3;\n        ops[2] = ops[1];\n        op_type[2] = op_type[1];\n    } else if (v == 0xcd && ops[0].e.v == 3 && !ops[0].e.sym) {\n        v--; /* int $3 case */\n        nb_ops = 0;\n    } else if ((v == 0x06 || v == 0x07)) {\n        if (ops[0].reg >= 4) {\n            /* push/pop %fs or %gs */\n            v = 0x0fa0 + (v - 0x06) + ((ops[0].reg - 4) << 3);\n        } else {\n            v += ops[0].reg << 3;\n        }\n        nb_ops = 0;\n    } else if (v <= 0x05) {\n        /* arith case */\n        v += ((opcode - TOK_ASM_addb) / NBWLX) << 3;\n    } else if ((pa->instr_type & (OPC_FARITH | OPC_MODRM)) == OPC_FARITH) {\n        /* fpu arith case */\n        v += ((opcode - pa->sym) / 6) << 3;\n    }\n    if (pa->instr_type & OPC_REG) {\n        for(i = 0; i < nb_ops; i++) {\n            if (op_type[i] & (OP_REG | OP_ST)) {\n                v += ops[i].reg;\n                break;\n            }\n        }\n        /* mov $im, %reg case */\n        if (pa->opcode == 0xb0 && s >= 1)\n            v += 7;\n    }\n    if (pa->instr_type & OPC_B)\n        v += s >= 1;\n    if (pa->instr_type & OPC_TEST)\n        v += test_bits[opcode - pa->sym];\n    if (pa->instr_type & OPC_SHORTJMP) {\n        Sym *sym;\n        int jmp_disp;\n\n        /* see if we can really generate the jump with a byte offset */\n        sym = ops[0].e.sym;\n        if (!sym)\n            goto no_short_jump;\n        if (sym->r != cur_text_section->sh_num)\n            goto no_short_jump;\n        jmp_disp = ops[0].e.v + sym->jnext - ind - 2;\n        if (jmp_disp == (int8_t)jmp_disp) {\n            /* OK to generate jump */\n            is_short_jmp = 1;\n            ops[0].e.v = jmp_disp;\n        } else {\n        no_short_jump:\n            if (pa->instr_type & OPC_JMP) {\n                /* long jump will be allowed. need to modify the\n                   opcode slightly */\n                if (v == 0xeb)\n                    v = 0xe9;\n                else\n                    v += 0x0f10;\n            } else {\n                tcc_error(\"invalid displacement\");\n            }\n        }\n    }\n    op1 = v >> 8;\n    if (op1)\n        g(op1);\n    g(v);\n\n    /* search which operand will used for modrm */\n    modrm_index = 0;\n    if (pa->instr_type & OPC_SHIFT) {\n        reg = (opcode - pa->sym) / NBWLX;\n        if (reg == 6)\n            reg = 7;\n    } else if (pa->instr_type & OPC_ARITH) {\n        reg = (opcode - pa->sym) / NBWLX;\n    } else if (pa->instr_type & OPC_FARITH) {\n        reg = (opcode - pa->sym) / 6;\n    } else {\n        reg = (pa->instr_type >> OPC_GROUP_SHIFT) & 7;\n    }\n    if (pa->instr_type & OPC_MODRM) {\n        /* first look for an ea operand */\n        for(i = 0;i < nb_ops; i++) {\n            if (op_type[i] & OP_EA)\n                goto modrm_found;\n        }\n        /* then if not found, a register or indirection (shift instructions) */\n        for(i = 0;i < nb_ops; i++) {\n            if (op_type[i] & (OP_REG | OP_MMX | OP_SSE | OP_INDIR))\n                goto modrm_found;\n        }\n#ifdef ASM_DEBUG\n        tcc_error(\"bad op table\");\n#endif\n    modrm_found:\n        modrm_index = i;\n        /* if a register is used in another operand then it is\n           used instead of group */\n        for(i = 0;i < nb_ops; i++) {\n            v = op_type[i];\n            if (i != modrm_index &&\n                (v & (OP_REG | OP_MMX | OP_SSE | OP_CR | OP_TR | OP_DB | OP_SEG))) {\n                reg = ops[i].reg;\n                break;\n            }\n        }\n\n        asm_modrm(reg, &ops[modrm_index]);\n    }\n\n    /* emit constants */\n#ifndef TCC_TARGET_X86_64\n    if (pa->opcode == 0x9a || pa->opcode == 0xea) {\n        /* ljmp or lcall kludge */\n#ifdef I386_ASM_16\n        if (s1->seg_size == 16 && o32 == 0)\n            gen_expr16(&ops[1].e);\n        else\n#endif\n            gen_expr32(&ops[1].e);\n        if (ops[0].e.sym)\n            tcc_error(\"cannot relocate\");\n        gen_le16(ops[0].e.v);\n        return;\n    }\n#endif\n    for(i = 0;i < nb_ops; i++) {\n        v = op_type[i];\n        if (v & (OP_IM8 | OP_IM16 | OP_IM32 | OP_IM64 | OP_IM8S | OP_ADDR)) {\n            /* if multiple sizes are given it means we must look\n               at the op size */\n            if ((v | OP_IM8 | OP_IM64) == (OP_IM8 | OP_IM16 | OP_IM32 | OP_IM64)) {\n                if (s == 0)\n                    v = OP_IM8;\n                else if (s == 1)\n                    v = OP_IM16;\n                else if (s == 2 || (v & OP_IM64) == 0)\n                    v = OP_IM32;\n                else\n                    v = OP_IM64;\n            }\n            if (v & (OP_IM8 | OP_IM8S)) {\n                if (ops[i].e.sym)\n                    goto error_relocate;\n                g(ops[i].e.v);\n            } else if (v & OP_IM16) {\n#ifdef I386_ASM_16\n                if (s1->seg_size == 16)\n                    gen_expr16(&ops[i].e);\n                else\n#endif\n                if (ops[i].e.sym)\n                error_relocate:\n                    tcc_error(\"cannot relocate\");\n                else\n                    gen_le16(ops[i].e.v);\n            } else {\n                if (pa->instr_type & (OPC_JMP | OPC_SHORTJMP)) {\n                    if (is_short_jmp)\n                        g(ops[i].e.v);\n#ifdef I386_ASM_16\n                    else if (s1->seg_size == 16)\n                        gen_disp16(&ops[i].e);\n#endif\n                    else\n                        gen_disp32(&ops[i].e);\n                } else {\n#ifdef I386_ASM_16\n                    if (s1->seg_size == 16 && !((o32 == 1) && (v & OP_IM32)))\n                        gen_expr16(&ops[i].e);\n                    else\n#endif\n#ifdef TCC_TARGET_X86_64\n                    if (v & OP_IM64)\n                        gen_expr64(&ops[i].e);\n                    else\n#endif\n                        gen_expr32(&ops[i].e);\n                }\n            }\n#ifdef I386_ASM_16\n        } else if (v & (OP_REG16 | OP_REG32)) {\n            if (pa->instr_type & (OPC_JMP | OPC_SHORTJMP)) {\n                /* jmp $r */\n                g(0xE0 + ops[i].reg);\n            }\n#endif\n#ifdef TCC_TARGET_X86_64\n        } else if (v & (OP_REG32 | OP_REG64)) {\n            if (pa->instr_type & (OPC_JMP | OPC_SHORTJMP)) {\n                /* jmp $r */\n                g(0xE0 + ops[i].reg);\n            }\n#endif\n        }\n    }\n#ifdef I386_ASM_16\n    a32 = o32 = 0;\n#endif\n}\n\n/* return the constraint priority (we allocate first the lowest\n   numbered constraints) */\nstatic inline int constraint_priority(const char *str)\n{\n    int priority, c, pr;\n\n    /* we take the lowest priority */\n    priority = 0;\n    for(;;) {\n        c = *str;\n        if (c == '\\0')\n            break;\n        str++;\n        switch(c) {\n        case 'A':\n            pr = 0;\n            break;\n        case 'a':\n        case 'b':\n        case 'c':\n        case 'd':\n        case 'S':\n        case 'D':\n            pr = 1;\n            break;\n        case 'q':\n            pr = 2;\n            break;\n        case 'r':\n            pr = 3;\n            break;\n        case 'N':\n        case 'M':\n        case 'I':\n        case 'i':\n        case 'm':\n        case 'g':\n            pr = 4;\n            break;\n        default:\n            tcc_error(\"unknown constraint '%c'\", c);\n            pr = 0;\n        }\n        if (pr > priority)\n            priority = pr;\n    }\n    return priority;\n}\n\nstatic const char *skip_constraint_modifiers(const char *p)\n{\n    while (*p == '=' || *p == '&' || *p == '+' || *p == '%')\n        p++;\n    return p;\n}\n\n#define REG_OUT_MASK 0x01\n#define REG_IN_MASK  0x02\n\n#define is_reg_allocated(reg) (regs_allocated[reg] & reg_mask)\n\nST_FUNC void asm_compute_constraints(ASMOperand *operands,\n                                    int nb_operands, int nb_outputs,\n                                    const uint8_t *clobber_regs,\n                                    int *pout_reg)\n{\n    ASMOperand *op;\n    int sorted_op[MAX_ASM_OPERANDS];\n    int i, j, k, p1, p2, tmp, reg, c, reg_mask;\n    const char *str;\n    uint8_t regs_allocated[NB_ASM_REGS];\n\n    /* init fields */\n    for(i=0;i<nb_operands;i++) {\n        op = &operands[i];\n        op->input_index = -1;\n        op->ref_index = -1;\n        op->reg = -1;\n        op->is_memory = 0;\n        op->is_rw = 0;\n    }\n    /* compute constraint priority and evaluate references to output\n       constraints if input constraints */\n    for(i=0;i<nb_operands;i++) {\n        op = &operands[i];\n        str = op->constraint;\n        str = skip_constraint_modifiers(str);\n        if (isnum(*str) || *str == '[') {\n            /* this is a reference to another constraint */\n            k = find_constraint(operands, nb_operands, str, NULL);\n            if ((unsigned)k >= i || i < nb_outputs)\n                tcc_error(\"invalid reference in constraint %d ('%s')\",\n                      i, str);\n            op->ref_index = k;\n            if (operands[k].input_index >= 0)\n                tcc_error(\"cannot reference twice the same operand\");\n            operands[k].input_index = i;\n            op->priority = 5;\n        } else {\n            op->priority = constraint_priority(str);\n        }\n    }\n\n    /* sort operands according to their priority */\n    for(i=0;i<nb_operands;i++)\n        sorted_op[i] = i;\n    for(i=0;i<nb_operands - 1;i++) {\n        for(j=i+1;j<nb_operands;j++) {\n            p1 = operands[sorted_op[i]].priority;\n            p2 = operands[sorted_op[j]].priority;\n            if (p2 < p1) {\n                tmp = sorted_op[i];\n                sorted_op[i] = sorted_op[j];\n                sorted_op[j] = tmp;\n            }\n        }\n    }\n\n    for(i = 0;i < NB_ASM_REGS; i++) {\n        if (clobber_regs[i])\n            regs_allocated[i] = REG_IN_MASK | REG_OUT_MASK;\n        else\n            regs_allocated[i] = 0;\n    }\n    /* esp cannot be used */\n    regs_allocated[4] = REG_IN_MASK | REG_OUT_MASK;\n    /* ebp cannot be used yet */\n    regs_allocated[5] = REG_IN_MASK | REG_OUT_MASK;\n\n    /* allocate registers and generate corresponding asm moves */\n    for(i=0;i<nb_operands;i++) {\n        j = sorted_op[i];\n        op = &operands[j];\n        str = op->constraint;\n        /* no need to allocate references */\n        if (op->ref_index >= 0)\n            continue;\n        /* select if register is used for output, input or both */\n        if (op->input_index >= 0) {\n            reg_mask = REG_IN_MASK | REG_OUT_MASK;\n        } else if (j < nb_outputs) {\n            reg_mask = REG_OUT_MASK;\n        } else {\n            reg_mask = REG_IN_MASK;\n        }\n    try_next:\n        c = *str++;\n        switch(c) {\n        case '=':\n            goto try_next;\n        case '+':\n            op->is_rw = 1;\n            /* FALL THRU */\n        case '&':\n            if (j >= nb_outputs)\n                tcc_error(\"'%c' modifier can only be applied to outputs\", c);\n            reg_mask = REG_IN_MASK | REG_OUT_MASK;\n            goto try_next;\n        case 'A':\n            /* allocate both eax and edx */\n            if (is_reg_allocated(TREG_XAX) ||\n                is_reg_allocated(TREG_XDX))\n                goto try_next;\n            op->is_llong = 1;\n            op->reg = TREG_XAX;\n            regs_allocated[TREG_XAX] |= reg_mask;\n            regs_allocated[TREG_XDX] |= reg_mask;\n            break;\n        case 'a':\n            reg = TREG_XAX;\n            goto alloc_reg;\n        case 'b':\n            reg = 3;\n            goto alloc_reg;\n        case 'c':\n            reg = TREG_XCX;\n            goto alloc_reg;\n        case 'd':\n            reg = TREG_XDX;\n            goto alloc_reg;\n        case 'S':\n            reg = 6;\n            goto alloc_reg;\n        case 'D':\n            reg = 7;\n        alloc_reg:\n            if (is_reg_allocated(reg))\n                goto try_next;\n            goto reg_found;\n        case 'q':\n            /* eax, ebx, ecx or edx */\n            for(reg = 0; reg < 4; reg++) {\n                if (!is_reg_allocated(reg))\n                    goto reg_found;\n            }\n            goto try_next;\n        case 'r':\n            /* any general register */\n            for(reg = 0; reg < 8; reg++) {\n                if (!is_reg_allocated(reg))\n                    goto reg_found;\n            }\n            goto try_next;\n        reg_found:\n            /* now we can reload in the register */\n            op->is_llong = 0;\n            op->reg = reg;\n            regs_allocated[reg] |= reg_mask;\n            break;\n        case 'i':\n            if (!((op->vt->r & (VT_VALMASK | VT_LVAL)) == VT_CONST))\n                goto try_next;\n            break;\n        case 'I':\n        case 'N':\n        case 'M':\n            if (!((op->vt->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST))\n                goto try_next;\n            break;\n        case 'm':\n        case 'g':\n            /* nothing special to do because the operand is already in\n               memory, except if the pointer itself is stored in a\n               memory variable (VT_LLOCAL case) */\n            /* XXX: fix constant case */\n            /* if it is a reference to a memory zone, it must lie\n               in a register, so we reserve the register in the\n               input registers and a load will be generated\n               later */\n            if (j < nb_outputs || c == 'm') {\n                if ((op->vt->r & VT_VALMASK) == VT_LLOCAL) {\n                    /* any general register */\n                    for(reg = 0; reg < 8; reg++) {\n                        if (!(regs_allocated[reg] & REG_IN_MASK))\n                            goto reg_found1;\n                    }\n                    goto try_next;\n                reg_found1:\n                    /* now we can reload in the register */\n                    regs_allocated[reg] |= REG_IN_MASK;\n                    op->reg = reg;\n                    op->is_memory = 1;\n                }\n            }\n            break;\n        default:\n            tcc_error(\"asm constraint %d ('%s') could not be satisfied\",\n                  j, op->constraint);\n            break;\n        }\n        /* if a reference is present for that operand, we assign it too */\n        if (op->input_index >= 0) {\n            operands[op->input_index].reg = op->reg;\n            operands[op->input_index].is_llong = op->is_llong;\n        }\n    }\n\n    /* compute out_reg. It is used to store outputs registers to memory\n       locations references by pointers (VT_LLOCAL case) */\n    *pout_reg = -1;\n    for(i=0;i<nb_operands;i++) {\n        op = &operands[i];\n        if (op->reg >= 0 &&\n            (op->vt->r & VT_VALMASK) == VT_LLOCAL  &&\n            !op->is_memory) {\n            for(reg = 0; reg < 8; reg++) {\n                if (!(regs_allocated[reg] & REG_OUT_MASK))\n                    goto reg_found2;\n            }\n            tcc_error(\"could not find free output register for reloading\");\n        reg_found2:\n            *pout_reg = reg;\n            break;\n        }\n    }\n\n    /* print sorted constraints */\n#ifdef ASM_DEBUG\n    for(i=0;i<nb_operands;i++) {\n        j = sorted_op[i];\n        op = &operands[j];\n        printf(\"%%%d [%s]: \\\"%s\\\" r=0x%04x reg=%d\\n\",\n               j,\n               op->id ? get_tok_str(op->id, NULL) : \"\",\n               op->constraint,\n               op->vt->r,\n               op->reg);\n    }\n    if (*pout_reg >= 0)\n        printf(\"out_reg=%d\\n\", *pout_reg);\n#endif\n}\n\nST_FUNC void subst_asm_operand(CString *add_str,\n                              SValue *sv, int modifier)\n{\n    int r, reg, size, val;\n    char buf[64];\n\n    r = sv->r;\n    if ((r & VT_VALMASK) == VT_CONST) {\n        if (!(r & VT_LVAL) && modifier != 'c' && modifier != 'n')\n            cstr_ccat(add_str, '$');\n        if (r & VT_SYM) {\n            cstr_cat(add_str, get_tok_str(sv->sym->v, NULL));\n            if (sv->c.i != 0) {\n                cstr_ccat(add_str, '+');\n            } else {\n                return;\n            }\n        }\n        val = sv->c.i;\n        if (modifier == 'n')\n            val = -val;\n        snprintf(buf, sizeof(buf), \"%d\", sv->c.i);\n        cstr_cat(add_str, buf);\n    } else if ((r & VT_VALMASK) == VT_LOCAL) {\n        snprintf(buf, sizeof(buf), \"%d(%%ebp)\", sv->c.i);\n        cstr_cat(add_str, buf);\n    } else if (r & VT_LVAL) {\n        reg = r & VT_VALMASK;\n        if (reg >= VT_CONST)\n            tcc_error(\"internal compiler error\");\n        snprintf(buf, sizeof(buf), \"(%%%s)\",\n                 get_tok_str(TOK_ASM_eax + reg, NULL));\n        cstr_cat(add_str, buf);\n    } else {\n        /* register case */\n        reg = r & VT_VALMASK;\n        if (reg >= VT_CONST)\n            tcc_error(\"internal compiler error\");\n\n        /* choose register operand size */\n        if ((sv->type.t & VT_BTYPE) == VT_BYTE)\n            size = 1;\n        else if ((sv->type.t & VT_BTYPE) == VT_SHORT)\n            size = 2;\n#ifdef TCC_TARGET_X86_64\n        else if ((sv->type.t & VT_BTYPE) == VT_LLONG)\n            size = 8;\n#endif\n        else\n            size = 4;\n        if (size == 1 && reg >= 4)\n            size = 4;\n\n        if (modifier == 'b') {\n            if (reg >= 4)\n                tcc_error(\"cannot use byte register\");\n            size = 1;\n        } else if (modifier == 'h') {\n            if (reg >= 4)\n                tcc_error(\"cannot use byte register\");\n            size = -1;\n        } else if (modifier == 'w') {\n            size = 2;\n#ifdef TCC_TARGET_X86_64\n        } else if (modifier == 'q') {\n            size = 8;\n#endif\n        }\n\n        switch(size) {\n        case -1:\n            reg = TOK_ASM_ah + reg;\n            break;\n        case 1:\n            reg = TOK_ASM_al + reg;\n            break;\n        case 2:\n            reg = TOK_ASM_ax + reg;\n            break;\n        default:\n            reg = TOK_ASM_eax + reg;\n            break;\n#ifdef TCC_TARGET_X86_64\n        case 8:\n            reg = TOK_ASM_rax + reg;\n            break;\n#endif\n        }\n        snprintf(buf, sizeof(buf), \"%%%s\", get_tok_str(reg, NULL));\n        cstr_cat(add_str, buf);\n    }\n}\n\n/* generate prolog and epilog code for asm statment */\nST_FUNC void asm_gen_code(ASMOperand *operands, int nb_operands,\n                         int nb_outputs, int is_output,\n                         uint8_t *clobber_regs,\n                         int out_reg)\n{\n    uint8_t regs_allocated[NB_ASM_REGS];\n    ASMOperand *op;\n    int i, reg;\n    static uint8_t reg_saved[NB_SAVED_REGS] = { 3, 6, 7 };\n\n    /* mark all used registers */\n    memcpy(regs_allocated, clobber_regs, sizeof(regs_allocated));\n    for(i = 0; i < nb_operands;i++) {\n        op = &operands[i];\n        if (op->reg >= 0)\n            regs_allocated[op->reg] = 1;\n    }\n    if (!is_output) {\n        /* generate reg save code */\n        for(i = 0; i < NB_SAVED_REGS; i++) {\n            reg = reg_saved[i];\n            if (regs_allocated[reg]) {\n#ifdef I386_ASM_16\n                if (tcc_state->seg_size == 16)\n                    g(0x66);\n#endif\n                g(0x50 + reg);\n            }\n        }\n\n        /* generate load code */\n        for(i = 0; i < nb_operands; i++) {\n            op = &operands[i];\n            if (op->reg >= 0) {\n                if ((op->vt->r & VT_VALMASK) == VT_LLOCAL &&\n                    op->is_memory) {\n                    /* memory reference case (for both input and\n                       output cases) */\n                    SValue sv;\n                    sv = *op->vt;\n                    sv.r = (sv.r & ~VT_VALMASK) | VT_LOCAL;\n                    load(op->reg, &sv);\n                } else if (i >= nb_outputs || op->is_rw) {\n                    /* load value in register */\n                    load(op->reg, op->vt);\n                    if (op->is_llong) {\n                        SValue sv;\n                        sv = *op->vt;\n                        sv.c.ul += 4;\n                        load(TREG_XDX, &sv);\n                    }\n                }\n            }\n        }\n    } else {\n        /* generate save code */\n        for(i = 0 ; i < nb_outputs; i++) {\n            op = &operands[i];\n            if (op->reg >= 0) {\n                if ((op->vt->r & VT_VALMASK) == VT_LLOCAL) {\n                    if (!op->is_memory) {\n                        SValue sv;\n                        sv = *op->vt;\n                        sv.r = (sv.r & ~VT_VALMASK) | VT_LOCAL;\n                        load(out_reg, &sv);\n\n                        sv.r = (sv.r & ~VT_VALMASK) | out_reg;\n                        store(op->reg, &sv);\n                    }\n                } else {\n                    store(op->reg, op->vt);\n                    if (op->is_llong) {\n                        SValue sv;\n                        sv = *op->vt;\n                        sv.c.ul += 4;\n                        store(TREG_XDX, &sv);\n                    }\n                }\n            }\n        }\n        /* generate reg restore code */\n        for(i = NB_SAVED_REGS - 1; i >= 0; i--) {\n            reg = reg_saved[i];\n            if (regs_allocated[reg]) {\n#ifdef I386_ASM_16\n                if (tcc_state->seg_size == 16)\n                    g(0x66);\n#endif\n                g(0x58 + reg);\n            }\n        }\n    }\n}\n\nST_FUNC void asm_clobber(uint8_t *clobber_regs, const char *str)\n{\n    int reg;\n    TokenSym *ts;\n\n    if (!strcmp(str, \"memory\") ||\n        !strcmp(str, \"cc\"))\n        return;\n    ts = tok_alloc(str, strlen(str));\n    reg = ts->tok;\n    if (reg >= TOK_ASM_eax && reg <= TOK_ASM_edi) {\n        reg -= TOK_ASM_eax;\n    } else if (reg >= TOK_ASM_ax && reg <= TOK_ASM_di) {\n        reg -= TOK_ASM_ax;\n#ifdef TCC_TARGET_X86_64\n    } else if (reg >= TOK_ASM_rax && reg <= TOK_ASM_rdi) {\n        reg -= TOK_ASM_rax;\n#endif\n    } else {\n        tcc_error(\"invalid clobber register '%s'\", str);\n    }\n    clobber_regs[reg] = 1;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/i386-asm.h",
    "content": "     DEF_ASM_OP0(clc, 0xf8) /* must be first OP0 */\n     DEF_ASM_OP0(cld, 0xfc)\n     DEF_ASM_OP0(cli, 0xfa)\n     DEF_ASM_OP0(clts, 0x0f06)\n     DEF_ASM_OP0(cmc, 0xf5)\n     DEF_ASM_OP0(lahf, 0x9f)\n     DEF_ASM_OP0(sahf, 0x9e)\n     DEF_ASM_OP0(pusha, 0x60)\n     DEF_ASM_OP0(popa, 0x61)\n     DEF_ASM_OP0(pushfl, 0x9c)\n     DEF_ASM_OP0(popfl, 0x9d)\n     DEF_ASM_OP0(pushf, 0x9c)\n     DEF_ASM_OP0(popf, 0x9d)\n     DEF_ASM_OP0(stc, 0xf9)\n     DEF_ASM_OP0(std, 0xfd)\n     DEF_ASM_OP0(sti, 0xfb)\n     DEF_ASM_OP0(aaa, 0x37)\n     DEF_ASM_OP0(aas, 0x3f)\n     DEF_ASM_OP0(daa, 0x27)\n     DEF_ASM_OP0(das, 0x2f)\n     DEF_ASM_OP0(aad, 0xd50a)\n     DEF_ASM_OP0(aam, 0xd40a)\n     DEF_ASM_OP0(cbw, 0x6698)\n     DEF_ASM_OP0(cwd, 0x6699)\n     DEF_ASM_OP0(cwde, 0x98)\n     DEF_ASM_OP0(cdq, 0x99)\n     DEF_ASM_OP0(cbtw, 0x6698)\n     DEF_ASM_OP0(cwtl, 0x98)\n     DEF_ASM_OP0(cwtd, 0x6699)\n     DEF_ASM_OP0(cltd, 0x99)\n     DEF_ASM_OP0(int3, 0xcc)\n     DEF_ASM_OP0(into, 0xce)\n     DEF_ASM_OP0(iret, 0xcf)\n     DEF_ASM_OP0(rsm, 0x0faa)\n     DEF_ASM_OP0(hlt, 0xf4)\n     DEF_ASM_OP0(nop, 0x90)\n     DEF_ASM_OP0(pause, 0xf390)\n     DEF_ASM_OP0(xlat, 0xd7)\n\n     /* strings */\nALT(DEF_ASM_OP0L(cmpsb, 0xa6, 0, OPC_BWL))\nALT(DEF_ASM_OP0L(scmpb, 0xa6, 0, OPC_BWL))\n\nALT(DEF_ASM_OP0L(insb, 0x6c, 0, OPC_BWL))\nALT(DEF_ASM_OP0L(outsb, 0x6e, 0, OPC_BWL))\n\nALT(DEF_ASM_OP0L(lodsb, 0xac, 0, OPC_BWL))\nALT(DEF_ASM_OP0L(slodb, 0xac, 0, OPC_BWL))\n\nALT(DEF_ASM_OP0L(movsb, 0xa4, 0, OPC_BWL))\nALT(DEF_ASM_OP0L(smovb, 0xa4, 0, OPC_BWL))\n\nALT(DEF_ASM_OP0L(scasb, 0xae, 0, OPC_BWL))\nALT(DEF_ASM_OP0L(sscab, 0xae, 0, OPC_BWL))\n\nALT(DEF_ASM_OP0L(stosb, 0xaa, 0, OPC_BWL))\nALT(DEF_ASM_OP0L(sstob, 0xaa, 0, OPC_BWL))\n\n     /* bits */\n     \nALT(DEF_ASM_OP2(bsfw, 0x0fbc, 0, OPC_MODRM | OPC_WL, OPT_REGW | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(bsrw, 0x0fbd, 0, OPC_MODRM | OPC_WL, OPT_REGW | OPT_EA, OPT_REGW))\n\nALT(DEF_ASM_OP2(btw, 0x0fa3, 0, OPC_MODRM | OPC_WL, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btw, 0x0fba, 4, OPC_MODRM | OPC_WL, OPT_IM8, OPT_REGW | OPT_EA))\n\nALT(DEF_ASM_OP2(btsw, 0x0fab, 0, OPC_MODRM | OPC_WL, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btsw, 0x0fba, 5, OPC_MODRM | OPC_WL, OPT_IM8, OPT_REGW | OPT_EA))\n\nALT(DEF_ASM_OP2(btrw, 0x0fb3, 0, OPC_MODRM | OPC_WL, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btrw, 0x0fba, 6, OPC_MODRM | OPC_WL, OPT_IM8, OPT_REGW | OPT_EA))\n\nALT(DEF_ASM_OP2(btcw, 0x0fbb, 0, OPC_MODRM | OPC_WL, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btcw, 0x0fba, 7, OPC_MODRM | OPC_WL, OPT_IM8, OPT_REGW | OPT_EA))\n\n     /* prefixes */\n     DEF_ASM_OP0(wait, 0x9b)\n     DEF_ASM_OP0(fwait, 0x9b)\n#ifdef I386_ASM_16\n     DEF_ASM_OP0(a32, 0x67)\n     DEF_ASM_OP0(o32, 0x66)\n#else\n     DEF_ASM_OP0(aword, 0x67)\n     DEF_ASM_OP0(addr16, 0x67)\n     ALT(DEF_ASM_OP0(word, 0x66))\n     DEF_ASM_OP0(data16, 0x66)\n#endif\n     DEF_ASM_OP0(lock, 0xf0)\n     DEF_ASM_OP0(rep, 0xf3)\n     DEF_ASM_OP0(repe, 0xf3)\n     DEF_ASM_OP0(repz, 0xf3)\n     DEF_ASM_OP0(repne, 0xf2)\n     DEF_ASM_OP0(repnz, 0xf2)\n             \n     DEF_ASM_OP0(invd, 0x0f08)\n     DEF_ASM_OP0(wbinvd, 0x0f09)\n     DEF_ASM_OP0(cpuid, 0x0fa2)\n     DEF_ASM_OP0(wrmsr, 0x0f30)\n     DEF_ASM_OP0(rdtsc, 0x0f31)\n     DEF_ASM_OP0(rdmsr, 0x0f32)\n     DEF_ASM_OP0(rdpmc, 0x0f33)\n     DEF_ASM_OP0(ud2, 0x0f0b)\n\n     /* NOTE: we took the same order as gas opcode definition order */\nALT(DEF_ASM_OP2(movb, 0xa0, 0, OPC_BWL, OPT_ADDR, OPT_EAX))\nALT(DEF_ASM_OP2(movb, 0xa2, 0, OPC_BWL, OPT_EAX, OPT_ADDR))\nALT(DEF_ASM_OP2(movb, 0x88, 0, OPC_MODRM | OPC_BWL, OPT_REG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(movb, 0x8a, 0, OPC_MODRM | OPC_BWL, OPT_EA | OPT_REG, OPT_REG))\nALT(DEF_ASM_OP2(movb, 0xb0, 0, OPC_REG | OPC_BWL, OPT_IM, OPT_REG))\nALT(DEF_ASM_OP2(movb, 0xc6, 0, OPC_MODRM | OPC_BWL, OPT_IM, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP2(movw, 0x8c, 0, OPC_MODRM | OPC_WL, OPT_SEG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(movw, 0x8e, 0, OPC_MODRM | OPC_WL, OPT_EA | OPT_REG, OPT_SEG))\n\nALT(DEF_ASM_OP2(movw, 0x0f20, 0, OPC_MODRM | OPC_WL, OPT_CR, OPT_REG32))\nALT(DEF_ASM_OP2(movw, 0x0f21, 0, OPC_MODRM | OPC_WL, OPT_DB, OPT_REG32))\nALT(DEF_ASM_OP2(movw, 0x0f24, 0, OPC_MODRM | OPC_WL, OPT_TR, OPT_REG32))\nALT(DEF_ASM_OP2(movw, 0x0f22, 0, OPC_MODRM | OPC_WL, OPT_REG32, OPT_CR))\nALT(DEF_ASM_OP2(movw, 0x0f23, 0, OPC_MODRM | OPC_WL, OPT_REG32, OPT_DB))\nALT(DEF_ASM_OP2(movw, 0x0f26, 0, OPC_MODRM | OPC_WL, OPT_REG32, OPT_TR))\n\nALT(DEF_ASM_OP2(movsbl, 0x0fbe, 0, OPC_MODRM, OPT_REG8 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(movsbw, 0x0fbe, 0, OPC_MODRM | OPC_D16, OPT_REG8 | OPT_EA, OPT_REG16))\nALT(DEF_ASM_OP2(movswl, 0x0fbf, 0, OPC_MODRM, OPT_REG16 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(movzbw, 0x0fb6, 0, OPC_MODRM | OPC_WL, OPT_REG8 | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(movzwl, 0x0fb7, 0, OPC_MODRM, OPT_REG16 | OPT_EA, OPT_REG32))\n\nALT(DEF_ASM_OP1(pushw, 0x50, 0, OPC_REG | OPC_WL, OPT_REGW))\nALT(DEF_ASM_OP1(pushw, 0xff, 6, OPC_MODRM | OPC_WL, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP1(pushw, 0x6a, 0, OPC_WL, OPT_IM8S))\nALT(DEF_ASM_OP1(pushw, 0x68, 0, OPC_WL, OPT_IM32))\nALT(DEF_ASM_OP1(pushw, 0x06, 0, OPC_WL, OPT_SEG))\n\nALT(DEF_ASM_OP1(popw, 0x58, 0, OPC_REG | OPC_WL, OPT_REGW))\nALT(DEF_ASM_OP1(popw, 0x8f, 0, OPC_MODRM | OPC_WL, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP1(popw, 0x07, 0, OPC_WL, OPT_SEG))\n\nALT(DEF_ASM_OP2(xchgw, 0x90, 0, OPC_REG | OPC_WL, OPT_REG, OPT_EAX))\nALT(DEF_ASM_OP2(xchgw, 0x90, 0, OPC_REG | OPC_WL, OPT_EAX, OPT_REG))\nALT(DEF_ASM_OP2(xchgb, 0x86, 0, OPC_MODRM | OPC_BWL, OPT_REG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(xchgb, 0x86, 0, OPC_MODRM | OPC_BWL, OPT_EA | OPT_REG, OPT_REG))\n\nALT(DEF_ASM_OP2(inb, 0xe4, 0, OPC_BWL, OPT_IM8, OPT_EAX))\nALT(DEF_ASM_OP1(inb, 0xe4, 0, OPC_BWL, OPT_IM8))\nALT(DEF_ASM_OP2(inb, 0xec, 0, OPC_BWL, OPT_DX, OPT_EAX))\nALT(DEF_ASM_OP1(inb, 0xec, 0, OPC_BWL, OPT_DX))\n\nALT(DEF_ASM_OP2(outb, 0xe6, 0, OPC_BWL, OPT_EAX, OPT_IM8))\nALT(DEF_ASM_OP1(outb, 0xe6, 0, OPC_BWL, OPT_IM8))\nALT(DEF_ASM_OP2(outb, 0xee, 0, OPC_BWL, OPT_EAX, OPT_DX))\nALT(DEF_ASM_OP1(outb, 0xee, 0, OPC_BWL, OPT_DX))\n\nALT(DEF_ASM_OP2(leaw, 0x8d, 0, OPC_MODRM | OPC_WL, OPT_EA, OPT_REG))\n\nALT(DEF_ASM_OP2(les, 0xc4, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lds, 0xc5, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lss, 0x0fb2, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lfs, 0x0fb4, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lgs, 0x0fb5, 0, OPC_MODRM, OPT_EA, OPT_REG32))\n\n     /* arith */\nALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWL, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */\nALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWL, OPT_EA | OPT_REG, OPT_REG))\nALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWL, OPT_IM, OPT_EAX))\nALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWL, OPT_IM, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WL, OPT_IM8S, OPT_EA | OPT_REG))\n\nALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWL, OPT_EA | OPT_REG, OPT_REG))\nALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWL, OPT_REG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(testb, 0xa8, 0, OPC_BWL, OPT_IM, OPT_EAX))\nALT(DEF_ASM_OP2(testb, 0xf6, 0, OPC_MODRM | OPC_BWL, OPT_IM, OPT_EA | OPT_REG))\n\nALT(DEF_ASM_OP1(incw, 0x40, 0, OPC_REG | OPC_WL, OPT_REGW))\nALT(DEF_ASM_OP1(incb, 0xfe, 0, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP1(decw, 0x48, 0, OPC_REG | OPC_WL, OPT_REGW))\nALT(DEF_ASM_OP1(decb, 0xfe, 1, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP1(notb, 0xf6, 2, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP1(negb, 0xf6, 3, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP1(mulb, 0xf6, 4, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP1(imulb, 0xf6, 5, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP2(imulw, 0x0faf, 0, OPC_MODRM | OPC_WL, OPT_REG | OPT_EA, OPT_REG))\nALT(DEF_ASM_OP3(imulw, 0x6b, 0, OPC_MODRM | OPC_WL, OPT_IM8S, OPT_REGW | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(imulw, 0x6b, 0, OPC_MODRM | OPC_WL, OPT_IM8S, OPT_REGW))\nALT(DEF_ASM_OP3(imulw, 0x69, 0, OPC_MODRM | OPC_WL, OPT_IMW, OPT_REGW | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(imulw, 0x69, 0, OPC_MODRM | OPC_WL, OPT_IMW, OPT_REGW))\n\nALT(DEF_ASM_OP1(divb, 0xf6, 6, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP2(divb, 0xf6, 6, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA, OPT_EAX))\nALT(DEF_ASM_OP1(idivb, 0xf6, 7, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP2(idivb, 0xf6, 7, OPC_MODRM | OPC_BWL, OPT_REG | OPT_EA, OPT_EAX))\n\n     /* shifts */\nALT(DEF_ASM_OP2(rolb, 0xc0, 0, OPC_MODRM | OPC_BWL | OPC_SHIFT, OPT_IM8, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(rolb, 0xd2, 0, OPC_MODRM | OPC_BWL | OPC_SHIFT, OPT_CL, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP1(rolb, 0xd0, 0, OPC_MODRM | OPC_BWL | OPC_SHIFT, OPT_EA | OPT_REG))\n\nALT(DEF_ASM_OP3(shldw, 0x0fa4, 0, OPC_MODRM | OPC_WL, OPT_IM8, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP3(shldw, 0x0fa5, 0, OPC_MODRM | OPC_WL, OPT_CL, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP2(shldw, 0x0fa5, 0, OPC_MODRM | OPC_WL, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP3(shrdw, 0x0fac, 0, OPC_MODRM | OPC_WL, OPT_IM8, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP3(shrdw, 0x0fad, 0, OPC_MODRM | OPC_WL, OPT_CL, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP2(shrdw, 0x0fad, 0, OPC_MODRM | OPC_WL, OPT_REGW, OPT_EA | OPT_REGW))\n\nALT(DEF_ASM_OP1(call, 0xff, 2, OPC_MODRM, OPT_INDIR))\nALT(DEF_ASM_OP1(call, 0xe8, 0, OPC_JMP, OPT_ADDR))\nALT(DEF_ASM_OP1(jmp, 0xff, 4, OPC_MODRM, OPT_INDIR))\nALT(DEF_ASM_OP1(jmp, 0xeb, 0, OPC_SHORTJMP | OPC_JMP, OPT_ADDR))\n#ifdef I386_ASM_16\nALT(DEF_ASM_OP1(jmp, 0xff, 0, OPC_JMP | OPC_WL, OPT_REGW))\n#endif\n\nALT(DEF_ASM_OP2(lcall, 0x9a, 0, 0, OPT_IM16, OPT_IM32))\nALT(DEF_ASM_OP1(lcall, 0xff, 3, 0, OPT_EA))\nALT(DEF_ASM_OP2(ljmp, 0xea, 0, 0, OPT_IM16, OPT_IM32))\nALT(DEF_ASM_OP1(ljmp, 0xff, 5, 0, OPT_EA))\n\nALT(DEF_ASM_OP1(int, 0xcd, 0, 0, OPT_IM8))\nALT(DEF_ASM_OP1(seto, 0x0f90, 0, OPC_MODRM | OPC_TEST, OPT_REG8 | OPT_EA))\n    DEF_ASM_OP2(enter, 0xc8, 0, 0, OPT_IM16, OPT_IM8)\n    DEF_ASM_OP0(leave, 0xc9)\n    DEF_ASM_OP0(ret, 0xc3)\n    DEF_ASM_OP0(retl,0xc3)\nALT(DEF_ASM_OP1(retl,0xc2, 0, 0, OPT_IM16))\nALT(DEF_ASM_OP1(ret, 0xc2, 0, 0, OPT_IM16))\n    DEF_ASM_OP0(lret, 0xcb)\nALT(DEF_ASM_OP1(lret, 0xca, 0, 0, OPT_IM16))\n\nALT(DEF_ASM_OP1(jo, 0x70, 0, OPC_SHORTJMP | OPC_JMP | OPC_TEST, OPT_ADDR))\n    DEF_ASM_OP1(loopne, 0xe0, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loopnz, 0xe0, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loope, 0xe1, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loopz, 0xe1, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loop, 0xe2, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(jecxz, 0xe3, 0, OPC_SHORTJMP, OPT_ADDR)\n     \n     /* float */\n     /* specific fcomp handling */\nALT(DEF_ASM_OP0L(fcomp, 0xd8d9, 0, 0))\n\nALT(DEF_ASM_OP1(fadd, 0xd8c0, 0, OPC_FARITH | OPC_REG, OPT_ST))\nALT(DEF_ASM_OP2(fadd, 0xd8c0, 0, OPC_FARITH | OPC_REG, OPT_ST, OPT_ST0))\nALT(DEF_ASM_OP2(fadd, 0xdcc0, 0, OPC_FARITH | OPC_REG, OPT_ST0, OPT_ST))\nALT(DEF_ASM_OP2(fmul, 0xdcc8, 0, OPC_FARITH | OPC_REG, OPT_ST0, OPT_ST))\nALT(DEF_ASM_OP0L(fadd, 0xdec1, 0, OPC_FARITH))\nALT(DEF_ASM_OP1(faddp, 0xdec0, 0, OPC_FARITH | OPC_REG, OPT_ST))\nALT(DEF_ASM_OP2(faddp, 0xdec0, 0, OPC_FARITH | OPC_REG, OPT_ST, OPT_ST0))\nALT(DEF_ASM_OP2(faddp, 0xdec0, 0, OPC_FARITH | OPC_REG, OPT_ST0, OPT_ST))\nALT(DEF_ASM_OP0L(faddp, 0xdec1, 0, OPC_FARITH))\nALT(DEF_ASM_OP1(fadds, 0xd8, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\nALT(DEF_ASM_OP1(fiaddl, 0xda, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\nALT(DEF_ASM_OP1(faddl, 0xdc, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\nALT(DEF_ASM_OP1(fiadds, 0xde, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\n\n     DEF_ASM_OP0(fucompp, 0xdae9)\n     DEF_ASM_OP0(ftst, 0xd9e4)\n     DEF_ASM_OP0(fxam, 0xd9e5)\n     DEF_ASM_OP0(fld1, 0xd9e8)\n     DEF_ASM_OP0(fldl2t, 0xd9e9)\n     DEF_ASM_OP0(fldl2e, 0xd9ea)\n     DEF_ASM_OP0(fldpi, 0xd9eb)\n     DEF_ASM_OP0(fldlg2, 0xd9ec)\n     DEF_ASM_OP0(fldln2, 0xd9ed)\n     DEF_ASM_OP0(fldz, 0xd9ee)\n\n     DEF_ASM_OP0(f2xm1, 0xd9f0)\n     DEF_ASM_OP0(fyl2x, 0xd9f1)\n     DEF_ASM_OP0(fptan, 0xd9f2)\n     DEF_ASM_OP0(fpatan, 0xd9f3)\n     DEF_ASM_OP0(fxtract, 0xd9f4)\n     DEF_ASM_OP0(fprem1, 0xd9f5)\n     DEF_ASM_OP0(fdecstp, 0xd9f6)\n     DEF_ASM_OP0(fincstp, 0xd9f7)\n     DEF_ASM_OP0(fprem, 0xd9f8)\n     DEF_ASM_OP0(fyl2xp1, 0xd9f9)\n     DEF_ASM_OP0(fsqrt, 0xd9fa)\n     DEF_ASM_OP0(fsincos, 0xd9fb)\n     DEF_ASM_OP0(frndint, 0xd9fc)\n     DEF_ASM_OP0(fscale, 0xd9fd)\n     DEF_ASM_OP0(fsin, 0xd9fe)\n     DEF_ASM_OP0(fcos, 0xd9ff)\n     DEF_ASM_OP0(fchs, 0xd9e0)\n     DEF_ASM_OP0(fabs, 0xd9e1)\n     DEF_ASM_OP0(fninit, 0xdbe3)\n     DEF_ASM_OP0(fnclex, 0xdbe2)\n     DEF_ASM_OP0(fnop, 0xd9d0)\n\n    /* fp load */\n    DEF_ASM_OP1(fld, 0xd9c0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fldl, 0xd9c0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(flds, 0xd9, 0, OPC_MODRM, OPT_EA)\nALT(DEF_ASM_OP1(fldl, 0xdd, 0, OPC_MODRM, OPT_EA))\n    DEF_ASM_OP1(fildl, 0xdb, 0, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fildq, 0xdf, 5, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fildll, 0xdf, 5, OPC_MODRM,OPT_EA)\n    DEF_ASM_OP1(fldt, 0xdb, 5, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fbld, 0xdf, 4, OPC_MODRM, OPT_EA)\n    \n    /* fp store */\n    DEF_ASM_OP1(fst, 0xddd0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fstl, 0xddd0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fsts, 0xd9, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fstps, 0xd9, 3, OPC_MODRM, OPT_EA)\nALT(DEF_ASM_OP1(fstl, 0xdd, 2, OPC_MODRM, OPT_EA))\n    DEF_ASM_OP1(fstpl, 0xdd, 3, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fist, 0xdf, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistp, 0xdf, 3, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistl, 0xdb, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistpl, 0xdb, 3, OPC_MODRM, OPT_EA)\n\n    DEF_ASM_OP1(fstp, 0xddd8, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fistpq, 0xdf, 7, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistpll, 0xdf, 7, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fstpt, 0xdb, 7, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fbstp, 0xdf, 6, OPC_MODRM, OPT_EA)\n\n    /* exchange */\n    DEF_ASM_OP0(fxch, 0xd9c9)\nALT(DEF_ASM_OP1(fxch, 0xd9c8, 0, OPC_REG, OPT_ST))\n\n    /* misc FPU */\n    DEF_ASM_OP1(fucom, 0xdde0, 0, OPC_REG, OPT_ST )\n    DEF_ASM_OP1(fucomp, 0xdde8, 0, OPC_REG, OPT_ST )\n\n    DEF_ASM_OP0L(finit, 0xdbe3, 0, OPC_FWAIT)\n    DEF_ASM_OP1(fldcw, 0xd9, 5, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fnstcw, 0xd9, 7, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fstcw, 0xd9, 7, OPC_MODRM | OPC_FWAIT, OPT_EA )\n    DEF_ASM_OP0(fnstsw, 0xdfe0)\nALT(DEF_ASM_OP1(fnstsw, 0xdfe0, 0, 0, OPT_EAX ))\nALT(DEF_ASM_OP1(fnstsw, 0xdd, 7, OPC_MODRM, OPT_EA ))\n    DEF_ASM_OP1(fstsw, 0xdfe0, 0, OPC_FWAIT, OPT_EAX )\nALT(DEF_ASM_OP0L(fstsw, 0xdfe0, 0, OPC_FWAIT))\nALT(DEF_ASM_OP1(fstsw, 0xdd, 7, OPC_MODRM | OPC_FWAIT, OPT_EA ))\n    DEF_ASM_OP0L(fclex, 0xdbe2, 0, OPC_FWAIT)\n    DEF_ASM_OP1(fnstenv, 0xd9, 6, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fstenv, 0xd9, 6, OPC_MODRM | OPC_FWAIT, OPT_EA )\n    DEF_ASM_OP1(fldenv, 0xd9, 4, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fnsave, 0xdd, 6, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fsave, 0xdd, 6, OPC_MODRM | OPC_FWAIT, OPT_EA )\n    DEF_ASM_OP1(frstor, 0xdd, 4, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(ffree, 0xddc0, 4, OPC_REG, OPT_ST )\n    DEF_ASM_OP1(ffreep, 0xdfc0, 4, OPC_REG, OPT_ST )\n    DEF_ASM_OP1(fxsave, 0x0fae, 0, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fxrstor, 0x0fae, 1, OPC_MODRM, OPT_EA )\n\n    /* segments */\n    DEF_ASM_OP2(arpl, 0x63, 0, OPC_MODRM, OPT_REG16, OPT_REG16 | OPT_EA)\n    DEF_ASM_OP2(lar, 0x0f02, 0, OPC_MODRM, OPT_REG32 | OPT_EA, OPT_REG32)\n    DEF_ASM_OP1(lgdt, 0x0f01, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(lidt, 0x0f01, 3, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(lldt, 0x0f00, 2, OPC_MODRM, OPT_EA | OPT_REG)\n    DEF_ASM_OP1(lmsw, 0x0f01, 6, OPC_MODRM, OPT_EA | OPT_REG)\nALT(DEF_ASM_OP2(lslw, 0x0f03, 0, OPC_MODRM | OPC_WL, OPT_EA | OPT_REG, OPT_REG))\n    DEF_ASM_OP1(ltr, 0x0f00, 3, OPC_MODRM, OPT_EA | OPT_REG)\n    DEF_ASM_OP1(sgdt, 0x0f01, 0, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(sidt, 0x0f01, 1, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(sldt, 0x0f00, 0, OPC_MODRM, OPT_REG | OPT_EA)\n    DEF_ASM_OP1(smsw, 0x0f01, 4, OPC_MODRM, OPT_REG | OPT_EA)\n    DEF_ASM_OP1(str, 0x0f00, 1, OPC_MODRM, OPT_REG16| OPT_EA)\n    DEF_ASM_OP1(verr, 0x0f00, 4, OPC_MODRM, OPT_REG | OPT_EA)\n    DEF_ASM_OP1(verw, 0x0f00, 5, OPC_MODRM, OPT_REG | OPT_EA)\n\n#ifdef I386_ASM_16\n    /* 386 */\n    DEF_ASM_OP0(loadall386, 0x0f07)\n#endif\n\n    /* 486 */\n    DEF_ASM_OP1(bswap, 0x0fc8, 0, OPC_REG, OPT_REG32 )\nALT(DEF_ASM_OP2(xaddb, 0x0fc0, 0, OPC_MODRM | OPC_BWL, OPT_REG, OPT_REG | OPT_EA ))\nALT(DEF_ASM_OP2(cmpxchgb, 0x0fb0, 0, OPC_MODRM | OPC_BWL, OPT_REG, OPT_REG | OPT_EA ))\n    DEF_ASM_OP1(invlpg, 0x0f01, 7, OPC_MODRM, OPT_EA )\n\n    DEF_ASM_OP2(boundl, 0x62, 0, OPC_MODRM, OPT_REG32, OPT_EA)\n    DEF_ASM_OP2(boundw, 0x62, 0, OPC_MODRM | OPC_D16, OPT_REG16, OPT_EA)\n\n    /* pentium */\n    DEF_ASM_OP1(cmpxchg8b, 0x0fc7, 1, OPC_MODRM, OPT_EA )\n    \n    /* pentium pro */\n    ALT(DEF_ASM_OP2(cmovo, 0x0f40, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\n#ifdef I386_ASM_16\nALT(DEF_ASM_OP2(cmovno, 0x0f41, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovc, 0x0f42, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovnc, 0x0f43, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovz, 0x0f44, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovnz, 0x0f45, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovna, 0x0f46, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmova, 0x0f47, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\n#endif\n    DEF_ASM_OP2(fcmovb, 0xdac0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmove, 0xdac8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovbe, 0xdad0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovu, 0xdad8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovnb, 0xdbc0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovne, 0xdbc8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovnbe, 0xdbd0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovnu, 0xdbd8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n\n    DEF_ASM_OP2(fucomi, 0xdbe8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcomi, 0xdbf0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fucomip, 0xdfe8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcomip, 0xdff0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n\n    /* mmx */\n    DEF_ASM_OP0(emms, 0x0f77) /* must be last OP0 */\n\n    DEF_ASM_OP2(movd, 0x0f6e, 0, OPC_MODRM, OPT_EA | OPT_REG32, OPT_MMX )\nALT(DEF_ASM_OP2(movd, 0x0f7e, 0, OPC_MODRM, OPT_MMX, OPT_EA | OPT_REG32 ))\n    DEF_ASM_OP2(movq, 0x0f6f, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(movq, 0x0f7f, 0, OPC_MODRM, OPT_MMX, OPT_EA | OPT_MMX ))\n    DEF_ASM_OP2(packssdw, 0x0f6b, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(packsswb, 0x0f63, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(packuswb, 0x0f67, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddb, 0x0ffc, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddw, 0x0ffd, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddd, 0x0ffe, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddsb, 0x0fec, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddsw, 0x0fed, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddusb, 0x0fdc, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddusw, 0x0fdd, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pand, 0x0fdb, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pandn, 0x0fdf, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpeqb, 0x0f74, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpeqw, 0x0f75, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpeqd, 0x0f76, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpgtb, 0x0f64, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpgtw, 0x0f65, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpgtd, 0x0f66, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pmaddwd, 0x0ff5, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pmulhw, 0x0fe5, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pmullw, 0x0fd5, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(por, 0x0feb, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psllw, 0x0ff1, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psllw, 0x0f71, 6, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(pslld, 0x0ff2, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(pslld, 0x0f72, 6, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psllq, 0x0ff3, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psllq, 0x0f73, 6, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psraw, 0x0fe1, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psraw, 0x0f71, 4, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrad, 0x0fe2, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrad, 0x0f72, 4, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrlw, 0x0fd1, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrlw, 0x0f71, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrld, 0x0fd2, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrld, 0x0f72, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrlq, 0x0fd3, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrlq, 0x0f73, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psubb, 0x0ff8, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubw, 0x0ff9, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubd, 0x0ffa, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubsb, 0x0fe8, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubsw, 0x0fe9, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubusb, 0x0fd8, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubusw, 0x0fd9, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckhbw, 0x0f68, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckhwd, 0x0f69, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckhdq, 0x0f6a, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpcklbw, 0x0f60, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpcklwd, 0x0f61, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckldq, 0x0f62, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pxor, 0x0fef, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n\n#undef ALT\n#undef DEF_ASM_OP0\n#undef DEF_ASM_OP0L\n#undef DEF_ASM_OP1\n#undef DEF_ASM_OP2\n#undef DEF_ASM_OP3\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/i386-gen.c",
    "content": "/*\n *  X86 code generator for TCC\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#ifdef TARGET_DEFS_ONLY\n\n/* number of available registers */\n#define NB_REGS         4\n#define NB_ASM_REGS     8\n\n/* a register can belong to several classes. The classes must be\n   sorted from more general to more precise (see gv2() code which does\n   assumptions on it). */\n#define RC_INT     0x0001 /* generic integer register */\n#define RC_FLOAT   0x0002 /* generic float register */\n#define RC_EAX     0x0004\n#define RC_ST0     0x0008 \n#define RC_ECX     0x0010\n#define RC_EDX     0x0020\n#define RC_IRET    RC_EAX /* function return: integer register */\n#define RC_LRET    RC_EDX /* function return: second integer register */\n#define RC_FRET    RC_ST0 /* function return: float register */\n\n/* pretty names for the registers */\nenum {\n    TREG_EAX = 0,\n    TREG_ECX,\n    TREG_EDX,\n    TREG_ST0,\n};\n\n/* return registers for function */\n#define REG_IRET TREG_EAX /* single word int return register */\n#define REG_LRET TREG_EDX /* second word return register (for long long) */\n#define REG_FRET TREG_ST0 /* float return register */\n\n/* defined if function parameters must be evaluated in reverse order */\n#define INVERT_FUNC_PARAMS\n\n/* defined if structures are passed as pointers. Otherwise structures\n   are directly pushed on stack. */\n//#define FUNC_STRUCT_PARAM_AS_PTR\n\n/* pointer size, in bytes */\n#define PTR_SIZE 4\n\n/* long double size and alignment, in bytes */\n#define LDOUBLE_SIZE  12\n#define LDOUBLE_ALIGN 4\n/* maximum alignment (for aligned attribute support) */\n#define MAX_ALIGN     8\n\n\n#define psym oad\n\n/******************************************************/\n/* ELF defines */\n\n#define EM_TCC_TARGET EM_386\n\n/* relocation type for 32 bit data relocation */\n#define R_DATA_32   R_386_32\n#define R_DATA_PTR  R_386_32\n#define R_JMP_SLOT  R_386_JMP_SLOT\n#define R_COPY      R_386_COPY\n\n#define ELF_START_ADDR 0x08048000\n#define ELF_PAGE_SIZE  0x1000\n\n/******************************************************/\n#else /* ! TARGET_DEFS_ONLY */\n/******************************************************/\n#include \"tcc.h\"\n\nST_DATA const int reg_classes[NB_REGS] = {\n    /* eax */ RC_INT | RC_EAX,\n    /* ecx */ RC_INT | RC_ECX,\n    /* edx */ RC_INT | RC_EDX,\n    /* st0 */ RC_FLOAT | RC_ST0,\n};\n\nstatic unsigned long func_sub_sp_offset;\nstatic int func_ret_sub;\n#ifdef CONFIG_TCC_BCHECK\nstatic unsigned long func_bound_offset;\n#endif\n\n/* XXX: make it faster ? */\nST_FUNC void g(int c)\n{\n    int ind1;\n    ind1 = ind + 1;\n    if (ind1 > cur_text_section->data_allocated)\n        section_realloc(cur_text_section, ind1);\n    cur_text_section->data[ind] = c;\n    ind = ind1;\n}\n\nST_FUNC void o(unsigned int c)\n{\n    while (c) {\n        g(c);\n        c = c >> 8;\n    }\n}\n\nST_FUNC void gen_le16(int v)\n{\n    g(v);\n    g(v >> 8);\n}\n\nST_FUNC void gen_le32(int c)\n{\n    g(c);\n    g(c >> 8);\n    g(c >> 16);\n    g(c >> 24);\n}\n\n/* output a symbol and patch all calls to it */\nST_FUNC void gsym_addr(int t, int a)\n{\n    int n, *ptr;\n    while (t) {\n        ptr = (int *)(cur_text_section->data + t);\n        n = *ptr; /* next value */\n        *ptr = a - t - 4;\n        t = n;\n    }\n}\n\nST_FUNC void gsym(int t)\n{\n    gsym_addr(t, ind);\n}\n\n/* psym is used to put an instruction with a data field which is a\n   reference to a symbol. It is in fact the same as oad ! */\n#define psym oad\n\n/* instruction + 4 bytes data. Return the address of the data */\nST_FUNC int oad(int c, int s)\n{\n    int ind1;\n\n    o(c);\n    ind1 = ind + 4;\n    if (ind1 > cur_text_section->data_allocated)\n        section_realloc(cur_text_section, ind1);\n    *(int *)(cur_text_section->data + ind) = s;\n    s = ind;\n    ind = ind1;\n    return s;\n}\n\n/* output constant with relocation if 'r & VT_SYM' is true */\nST_FUNC void gen_addr32(int r, Sym *sym, int c)\n{\n    if (r & VT_SYM)\n        greloc(cur_text_section, sym, ind, R_386_32);\n    gen_le32(c);\n}\n\nST_FUNC void gen_addrpc32(int r, Sym *sym, int c)\n{\n    if (r & VT_SYM)\n        greloc(cur_text_section, sym, ind, R_386_PC32);\n    gen_le32(c - 4);\n}\n\n/* generate a modrm reference. 'op_reg' contains the addtionnal 3\n   opcode bits */\nstatic void gen_modrm(int op_reg, int r, Sym *sym, int c)\n{\n    op_reg = op_reg << 3;\n    if ((r & VT_VALMASK) == VT_CONST) {\n        /* constant memory reference */\n        o(0x05 | op_reg);\n        gen_addr32(r, sym, c);\n    } else if ((r & VT_VALMASK) == VT_LOCAL) {\n        /* currently, we use only ebp as base */\n        if (c == (char)c) {\n            /* short reference */\n            o(0x45 | op_reg);\n            g(c);\n        } else {\n            oad(0x85 | op_reg, c);\n        }\n    } else {\n        g(0x00 | op_reg | (r & VT_VALMASK));\n    }\n}\n\n/* load 'r' from value 'sv' */\nST_FUNC void load(int r, SValue *sv)\n{\n    int v, t, ft, fc, fr;\n    SValue v1;\n\n#ifdef TCC_TARGET_PE\n    SValue v2;\n    sv = pe_getimport(sv, &v2);\n#endif\n\n    fr = sv->r;\n    ft = sv->type.t;\n    fc = sv->c.ul;\n\n    v = fr & VT_VALMASK;\n    if (fr & VT_LVAL) {\n        if (v == VT_LLOCAL) {\n            v1.type.t = VT_INT;\n            v1.r = VT_LOCAL | VT_LVAL;\n            v1.c.ul = fc;\n            fr = r;\n            if (!(reg_classes[fr] & RC_INT))\n                fr = get_reg(RC_INT);\n            load(fr, &v1);\n        }\n        if ((ft & VT_BTYPE) == VT_FLOAT) {\n            o(0xd9); /* flds */\n            r = 0;\n        } else if ((ft & VT_BTYPE) == VT_DOUBLE) {\n            o(0xdd); /* fldl */\n            r = 0;\n        } else if ((ft & VT_BTYPE) == VT_LDOUBLE) {\n            o(0xdb); /* fldt */\n            r = 5;\n        } else if ((ft & VT_TYPE) == VT_BYTE) {\n            o(0xbe0f);   /* movsbl */\n        } else if ((ft & VT_TYPE) == (VT_BYTE | VT_UNSIGNED)) {\n            o(0xb60f);   /* movzbl */\n        } else if ((ft & VT_TYPE) == VT_SHORT) {\n            o(0xbf0f);   /* movswl */\n        } else if ((ft & VT_TYPE) == (VT_SHORT | VT_UNSIGNED)) {\n            o(0xb70f);   /* movzwl */\n        } else {\n            o(0x8b);     /* movl */\n        }\n        gen_modrm(r, fr, sv->sym, fc);\n    } else {\n        if (v == VT_CONST) {\n            o(0xb8 + r); /* mov $xx, r */\n            gen_addr32(fr, sv->sym, fc);\n        } else if (v == VT_LOCAL) {\n            if (fc) {\n                o(0x8d); /* lea xxx(%ebp), r */\n                gen_modrm(r, VT_LOCAL, sv->sym, fc);\n            } else {\n                o(0x89);\n                o(0xe8 + r); /* mov %ebp, r */\n            }\n        } else if (v == VT_CMP) {\n            oad(0xb8 + r, 0); /* mov $0, r */\n            o(0x0f); /* setxx %br */\n            o(fc);\n            o(0xc0 + r);\n        } else if (v == VT_JMP || v == VT_JMPI) {\n            t = v & 1;\n            oad(0xb8 + r, t); /* mov $1, r */\n            o(0x05eb); /* jmp after */\n            gsym(fc);\n            oad(0xb8 + r, t ^ 1); /* mov $0, r */\n        } else if (v != r) {\n            o(0x89);\n            o(0xc0 + r + v * 8); /* mov v, r */\n        }\n    }\n}\n\n/* store register 'r' in lvalue 'v' */\nST_FUNC void store(int r, SValue *v)\n{\n    int fr, bt, ft, fc;\n\n#ifdef TCC_TARGET_PE\n    SValue v2;\n    v = pe_getimport(v, &v2);\n#endif\n\n    ft = v->type.t;\n    fc = v->c.ul;\n    fr = v->r & VT_VALMASK;\n    bt = ft & VT_BTYPE;\n    /* XXX: incorrect if float reg to reg */\n    if (bt == VT_FLOAT) {\n        o(0xd9); /* fsts */\n        r = 2;\n    } else if (bt == VT_DOUBLE) {\n        o(0xdd); /* fstpl */\n        r = 2;\n    } else if (bt == VT_LDOUBLE) {\n        o(0xc0d9); /* fld %st(0) */\n        o(0xdb); /* fstpt */\n        r = 7;\n    } else {\n        if (bt == VT_SHORT)\n            o(0x66);\n        if (bt == VT_BYTE || bt == VT_BOOL)\n            o(0x88);\n        else\n            o(0x89);\n    }\n    if (fr == VT_CONST ||\n        fr == VT_LOCAL ||\n        (v->r & VT_LVAL)) {\n        gen_modrm(r, v->r, v->sym, fc);\n    } else if (fr != r) {\n        o(0xc0 + fr + r * 8); /* mov r, fr */\n    }\n}\n\nstatic void gadd_sp(int val)\n{\n    if (val == (char)val) {\n        o(0xc483);\n        g(val);\n    } else {\n        oad(0xc481, val); /* add $xxx, %esp */\n    }\n}\n\n/* 'is_jmp' is '1' if it is a jump */\nstatic void gcall_or_jmp(int is_jmp)\n{\n    int r;\n    if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n        /* constant case */\n        if (vtop->r & VT_SYM) {\n            /* relocation case */\n            greloc(cur_text_section, vtop->sym, \n                   ind + 1, R_386_PC32);\n        } else {\n            /* put an empty PC32 relocation */\n            put_elf_reloc(symtab_section, cur_text_section, \n                          ind + 1, R_386_PC32, 0);\n        }\n        oad(0xe8 + is_jmp, vtop->c.ul - 4); /* call/jmp im */\n    } else {\n        /* otherwise, indirect call */\n        r = gv(RC_INT);\n        o(0xff); /* call/jmp *r */\n        o(0xd0 + r + (is_jmp << 4));\n    }\n}\n\nstatic uint8_t fastcall_regs[3] = { TREG_EAX, TREG_EDX, TREG_ECX };\nstatic uint8_t fastcallw_regs[2] = { TREG_ECX, TREG_EDX };\n\n/* Generate function call. The function address is pushed first, then\n   all the parameters in call order. This functions pops all the\n   parameters and the function address. */\nST_FUNC void gfunc_call(int nb_args)\n{\n    int size, align, r, args_size, i, func_call;\n    Sym *func_sym;\n    \n    args_size = 0;\n    for(i = 0;i < nb_args; i++) {\n        if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {\n            size = type_size(&vtop->type, &align);\n            /* align to stack align size */\n            size = (size + 3) & ~3;\n            /* allocate the necessary size on stack */\n            oad(0xec81, size); /* sub $xxx, %esp */\n            /* generate structure store */\n            r = get_reg(RC_INT);\n            o(0x89); /* mov %esp, r */\n            o(0xe0 + r);\n            vset(&vtop->type, r | VT_LVAL, 0);\n            vswap();\n            vstore();\n            args_size += size;\n        } else if (is_float(vtop->type.t)) {\n            gv(RC_FLOAT); /* only one float register */\n            if ((vtop->type.t & VT_BTYPE) == VT_FLOAT)\n                size = 4;\n            else if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE)\n                size = 8;\n            else\n                size = 12;\n            oad(0xec81, size); /* sub $xxx, %esp */\n            if (size == 12)\n                o(0x7cdb);\n            else\n                o(0x5cd9 + size - 4); /* fstp[s|l] 0(%esp) */\n            g(0x24);\n            g(0x00);\n            args_size += size;\n        } else {\n            /* simple type (currently always same size) */\n            /* XXX: implicit cast ? */\n            r = gv(RC_INT);\n            if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {\n                size = 8;\n                o(0x50 + vtop->r2); /* push r */\n            } else {\n                size = 4;\n            }\n            o(0x50 + r); /* push r */\n            args_size += size;\n        }\n        vtop--;\n    }\n    save_regs(0); /* save used temporary registers */\n    func_sym = vtop->type.ref;\n    func_call = FUNC_CALL(func_sym->r);\n    /* fast call case */\n    if ((func_call >= FUNC_FASTCALL1 && func_call <= FUNC_FASTCALL3) ||\n        func_call == FUNC_FASTCALLW) {\n        int fastcall_nb_regs;\n        uint8_t *fastcall_regs_ptr;\n        if (func_call == FUNC_FASTCALLW) {\n            fastcall_regs_ptr = fastcallw_regs;\n            fastcall_nb_regs = 2;\n        } else {\n            fastcall_regs_ptr = fastcall_regs;\n            fastcall_nb_regs = func_call - FUNC_FASTCALL1 + 1;\n        }\n        for(i = 0;i < fastcall_nb_regs; i++) {\n            if (args_size <= 0)\n                break;\n            o(0x58 + fastcall_regs_ptr[i]); /* pop r */\n            /* XXX: incorrect for struct/floats */\n            args_size -= 4;\n        }\n    }\n    gcall_or_jmp(0);\n\n#ifdef TCC_TARGET_PE\n    if ((func_sym->type.t & VT_BTYPE) == VT_STRUCT)\n        args_size -= 4;\n#endif\n    if (args_size && func_call != FUNC_STDCALL)\n        gadd_sp(args_size);\n    vtop--;\n}\n\n#ifdef TCC_TARGET_PE\n#define FUNC_PROLOG_SIZE 10\n#else\n#define FUNC_PROLOG_SIZE 9\n#endif\n\n/* generate function prolog of type 't' */\nST_FUNC void gfunc_prolog(CType *func_type)\n{\n    int addr, align, size, func_call, fastcall_nb_regs;\n    int param_index, param_addr;\n    uint8_t *fastcall_regs_ptr;\n    Sym *sym;\n    CType *type;\n\n    sym = func_type->ref;\n    func_call = FUNC_CALL(sym->r);\n    addr = 8;\n    loc = 0;\n    func_vc = 0;\n\n    if (func_call >= FUNC_FASTCALL1 && func_call <= FUNC_FASTCALL3) {\n        fastcall_nb_regs = func_call - FUNC_FASTCALL1 + 1;\n        fastcall_regs_ptr = fastcall_regs;\n    } else if (func_call == FUNC_FASTCALLW) {\n        fastcall_nb_regs = 2;\n        fastcall_regs_ptr = fastcallw_regs;\n    } else {\n        fastcall_nb_regs = 0;\n        fastcall_regs_ptr = NULL;\n    }\n    param_index = 0;\n\n    ind += FUNC_PROLOG_SIZE;\n    func_sub_sp_offset = ind;\n    /* if the function returns a structure, then add an\n       implicit pointer parameter */\n    func_vt = sym->type;\n    if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {\n        /* XXX: fastcall case ? */\n        func_vc = addr;\n        addr += 4;\n        param_index++;\n    }\n    /* define parameters */\n    while ((sym = sym->next) != NULL) {\n        type = &sym->type;\n        size = type_size(type, &align);\n        size = (size + 3) & ~3;\n#ifdef FUNC_STRUCT_PARAM_AS_PTR\n        /* structs are passed as pointer */\n        if ((type->t & VT_BTYPE) == VT_STRUCT) {\n            size = 4;\n        }\n#endif\n        if (param_index < fastcall_nb_regs) {\n            /* save FASTCALL register */\n            loc -= 4;\n            o(0x89);     /* movl */\n            gen_modrm(fastcall_regs_ptr[param_index], VT_LOCAL, NULL, loc);\n            param_addr = loc;\n        } else {\n            param_addr = addr;\n            addr += size;\n        }\n        sym_push(sym->v & ~SYM_FIELD, type,\n                 VT_LOCAL | lvalue_type(type->t), param_addr);\n        param_index++;\n    }\n    func_ret_sub = 0;\n    /* pascal type call ? */\n    if (func_call == FUNC_STDCALL)\n        func_ret_sub = addr - 8;\n#ifdef TCC_TARGET_PE\n    else if (func_vc)\n        func_ret_sub = 4;\n#endif\n\n#ifdef CONFIG_TCC_BCHECK\n    /* leave some room for bound checking code */\n    if (tcc_state->do_bounds_check) {\n        oad(0xb8, 0); /* lbound section pointer */\n        oad(0xb8, 0); /* call to function */\n        func_bound_offset = lbounds_section->data_offset;\n    }\n#endif\n}\n\n/* generate function epilog */\nST_FUNC void gfunc_epilog(void)\n{\n    int v, saved_ind;\n\n#ifdef CONFIG_TCC_BCHECK\n    if (tcc_state->do_bounds_check\n     && func_bound_offset != lbounds_section->data_offset) {\n        int saved_ind;\n        int *bounds_ptr;\n        Sym *sym, *sym_data;\n        /* add end of table info */\n        bounds_ptr = section_ptr_add(lbounds_section, sizeof(int));\n        *bounds_ptr = 0;\n        /* generate bound local allocation */\n        saved_ind = ind;\n        ind = func_sub_sp_offset;\n        sym_data = get_sym_ref(&char_pointer_type, lbounds_section, \n                               func_bound_offset, lbounds_section->data_offset);\n        greloc(cur_text_section, sym_data,\n               ind + 1, R_386_32);\n        oad(0xb8, 0); /* mov %eax, xxx */\n        sym = external_global_sym(TOK___bound_local_new, &func_old_type, 0);\n        greloc(cur_text_section, sym, \n               ind + 1, R_386_PC32);\n        oad(0xe8, -4);\n        ind = saved_ind;\n        /* generate bound check local freeing */\n        o(0x5250); /* save returned value, if any */\n        greloc(cur_text_section, sym_data,\n               ind + 1, R_386_32);\n        oad(0xb8, 0); /* mov %eax, xxx */\n        sym = external_global_sym(TOK___bound_local_delete, &func_old_type, 0);\n        greloc(cur_text_section, sym, \n               ind + 1, R_386_PC32);\n        oad(0xe8, -4);\n        o(0x585a); /* restore returned value, if any */\n    }\n#endif\n    o(0xc9); /* leave */\n    if (func_ret_sub == 0) {\n        o(0xc3); /* ret */\n    } else {\n        o(0xc2); /* ret n */\n        g(func_ret_sub);\n        g(func_ret_sub >> 8);\n    }\n    /* align local size to word & save local variables */\n    \n    v = (-loc + 3) & -4; \n    saved_ind = ind;\n    ind = func_sub_sp_offset - FUNC_PROLOG_SIZE;\n#ifdef TCC_TARGET_PE\n    if (v >= 4096) {\n        Sym *sym = external_global_sym(TOK___chkstk, &func_old_type, 0);\n        oad(0xb8, v); /* mov stacksize, %eax */\n        oad(0xe8, -4); /* call __chkstk, (does the stackframe too) */\n        greloc(cur_text_section, sym, ind-4, R_386_PC32);\n    } else\n#endif\n    {\n        o(0xe58955);  /* push %ebp, mov %esp, %ebp */\n        o(0xec81);  /* sub esp, stacksize */\n        gen_le32(v);\n#if FUNC_PROLOG_SIZE == 10\n        o(0x90);  /* adjust to FUNC_PROLOG_SIZE */\n#endif\n    }\n    ind = saved_ind;\n}\n\n/* generate a jump to a label */\nST_FUNC int gjmp(int t)\n{\n    return psym(0xe9, t);\n}\n\n/* generate a jump to a fixed address */\nST_FUNC void gjmp_addr(int a)\n{\n    int r;\n    r = a - ind - 2;\n    if (r == (char)r) {\n        g(0xeb);\n        g(r);\n    } else {\n        oad(0xe9, a - ind - 5);\n    }\n}\n\n/* generate a test. set 'inv' to invert test. Stack entry is popped */\nST_FUNC int gtst(int inv, int t)\n{\n    int v, *p;\n\n    v = vtop->r & VT_VALMASK;\n    if (v == VT_CMP) {\n        /* fast case : can jump directly since flags are set */\n        g(0x0f);\n        t = psym((vtop->c.i - 16) ^ inv, t);\n    } else if (v == VT_JMP || v == VT_JMPI) {\n        /* && or || optimization */\n        if ((v & 1) == inv) {\n            /* insert vtop->c jump list in t */\n            p = &vtop->c.i;\n            while (*p != 0)\n                p = (int *)(cur_text_section->data + *p);\n            *p = t;\n            t = vtop->c.i;\n        } else {\n            t = gjmp(t);\n            gsym(vtop->c.i);\n        }\n    } else {\n        if (is_float(vtop->type.t) || \n            (vtop->type.t & VT_BTYPE) == VT_LLONG) {\n            vpushi(0);\n            gen_op(TOK_NE);\n        }\n        if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n            /* constant jmp optimization */\n            if ((vtop->c.i != 0) != inv) \n                t = gjmp(t);\n        } else {\n            v = gv(RC_INT);\n            o(0x85);\n            o(0xc0 + v * 9);\n            g(0x0f);\n            t = psym(0x85 ^ inv, t);\n        }\n    }\n    vtop--;\n    return t;\n}\n\n/* generate an integer binary operation */\nST_FUNC void gen_opi(int op)\n{\n    int r, fr, opc, c;\n\n    switch(op) {\n    case '+':\n    case TOK_ADDC1: /* add with carry generation */\n        opc = 0;\n    gen_op8:\n        if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n            /* constant case */\n            vswap();\n            r = gv(RC_INT);\n            vswap();\n            c = vtop->c.i;\n            if (c == (char)c) {\n                /* generate inc and dec for smaller code */\n                if (c==1 && opc==0) {\n                    o (0x40 | r); // inc\n                } else if (c==1 && opc==5) {\n                    o (0x48 | r); // dec\n                } else {\n                    o(0x83);\n                    o(0xc0 | (opc << 3) | r);\n                    g(c);\n                }\n            } else {\n                o(0x81);\n                oad(0xc0 | (opc << 3) | r, c);\n            }\n        } else {\n            gv2(RC_INT, RC_INT);\n            r = vtop[-1].r;\n            fr = vtop[0].r;\n            o((opc << 3) | 0x01);\n            o(0xc0 + r + fr * 8); \n        }\n        vtop--;\n        if (op >= TOK_ULT && op <= TOK_GT) {\n            vtop->r = VT_CMP;\n            vtop->c.i = op;\n        }\n        break;\n    case '-':\n    case TOK_SUBC1: /* sub with carry generation */\n        opc = 5;\n        goto gen_op8;\n    case TOK_ADDC2: /* add with carry use */\n        opc = 2;\n        goto gen_op8;\n    case TOK_SUBC2: /* sub with carry use */\n        opc = 3;\n        goto gen_op8;\n    case '&':\n        opc = 4;\n        goto gen_op8;\n    case '^':\n        opc = 6;\n        goto gen_op8;\n    case '|':\n        opc = 1;\n        goto gen_op8;\n    case '*':\n        gv2(RC_INT, RC_INT);\n        r = vtop[-1].r;\n        fr = vtop[0].r;\n        vtop--;\n        o(0xaf0f); /* imul fr, r */\n        o(0xc0 + fr + r * 8);\n        break;\n    case TOK_SHL:\n        opc = 4;\n        goto gen_shift;\n    case TOK_SHR:\n        opc = 5;\n        goto gen_shift;\n    case TOK_SAR:\n        opc = 7;\n    gen_shift:\n        opc = 0xc0 | (opc << 3);\n        if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n            /* constant case */\n            vswap();\n            r = gv(RC_INT);\n            vswap();\n            c = vtop->c.i & 0x1f;\n            o(0xc1); /* shl/shr/sar $xxx, r */\n            o(opc | r);\n            g(c);\n        } else {\n            /* we generate the shift in ecx */\n            gv2(RC_INT, RC_ECX);\n            r = vtop[-1].r;\n            o(0xd3); /* shl/shr/sar %cl, r */\n            o(opc | r);\n        }\n        vtop--;\n        break;\n    case '/':\n    case TOK_UDIV:\n    case TOK_PDIV:\n    case '%':\n    case TOK_UMOD:\n    case TOK_UMULL:\n        /* first operand must be in eax */\n        /* XXX: need better constraint for second operand */\n        gv2(RC_EAX, RC_ECX);\n        r = vtop[-1].r;\n        fr = vtop[0].r;\n        vtop--;\n        save_reg(TREG_EDX);\n        if (op == TOK_UMULL) {\n            o(0xf7); /* mul fr */\n            o(0xe0 + fr);\n            vtop->r2 = TREG_EDX;\n            r = TREG_EAX;\n        } else {\n            if (op == TOK_UDIV || op == TOK_UMOD) {\n                o(0xf7d231); /* xor %edx, %edx, div fr, %eax */\n                o(0xf0 + fr);\n            } else {\n                o(0xf799); /* cltd, idiv fr, %eax */\n                o(0xf8 + fr);\n            }\n            if (op == '%' || op == TOK_UMOD)\n                r = TREG_EDX;\n            else\n                r = TREG_EAX;\n        }\n        vtop->r = r;\n        break;\n    default:\n        opc = 7;\n        goto gen_op8;\n    }\n}\n\n/* generate a floating point operation 'v = t1 op t2' instruction. The\n   two operands are guaranted to have the same floating point type */\n/* XXX: need to use ST1 too */\nST_FUNC void gen_opf(int op)\n{\n    int a, ft, fc, swapped, r;\n\n    /* convert constants to memory references */\n    if ((vtop[-1].r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n        vswap();\n        gv(RC_FLOAT);\n        vswap();\n    }\n    if ((vtop[0].r & (VT_VALMASK | VT_LVAL)) == VT_CONST)\n        gv(RC_FLOAT);\n\n    /* must put at least one value in the floating point register */\n    if ((vtop[-1].r & VT_LVAL) &&\n        (vtop[0].r & VT_LVAL)) {\n        vswap();\n        gv(RC_FLOAT);\n        vswap();\n    }\n    swapped = 0;\n    /* swap the stack if needed so that t1 is the register and t2 is\n       the memory reference */\n    if (vtop[-1].r & VT_LVAL) {\n        vswap();\n        swapped = 1;\n    }\n    if (op >= TOK_ULT && op <= TOK_GT) {\n        /* load on stack second operand */\n        load(TREG_ST0, vtop);\n        save_reg(TREG_EAX); /* eax is used by FP comparison code */\n        if (op == TOK_GE || op == TOK_GT)\n            swapped = !swapped;\n        else if (op == TOK_EQ || op == TOK_NE)\n            swapped = 0;\n        if (swapped)\n            o(0xc9d9); /* fxch %st(1) */\n        o(0xe9da); /* fucompp */\n        o(0xe0df); /* fnstsw %ax */\n        if (op == TOK_EQ) {\n            o(0x45e480); /* and $0x45, %ah */\n            o(0x40fC80); /* cmp $0x40, %ah */\n        } else if (op == TOK_NE) {\n            o(0x45e480); /* and $0x45, %ah */\n            o(0x40f480); /* xor $0x40, %ah */\n            op = TOK_NE;\n        } else if (op == TOK_GE || op == TOK_LE) {\n            o(0x05c4f6); /* test $0x05, %ah */\n            op = TOK_EQ;\n        } else {\n            o(0x45c4f6); /* test $0x45, %ah */\n            op = TOK_EQ;\n        }\n        vtop--;\n        vtop->r = VT_CMP;\n        vtop->c.i = op;\n    } else {\n        /* no memory reference possible for long double operations */\n        if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {\n            load(TREG_ST0, vtop);\n            swapped = !swapped;\n        }\n        \n        switch(op) {\n        default:\n        case '+':\n            a = 0;\n            break;\n        case '-':\n            a = 4;\n            if (swapped)\n                a++;\n            break;\n        case '*':\n            a = 1;\n            break;\n        case '/':\n            a = 6;\n            if (swapped)\n                a++;\n            break;\n        }\n        ft = vtop->type.t;\n        fc = vtop->c.ul;\n        if ((ft & VT_BTYPE) == VT_LDOUBLE) {\n            o(0xde); /* fxxxp %st, %st(1) */\n            o(0xc1 + (a << 3));\n        } else {\n            /* if saved lvalue, then we must reload it */\n            r = vtop->r;\n            if ((r & VT_VALMASK) == VT_LLOCAL) {\n                SValue v1;\n                r = get_reg(RC_INT);\n                v1.type.t = VT_INT;\n                v1.r = VT_LOCAL | VT_LVAL;\n                v1.c.ul = fc;\n                load(r, &v1);\n                fc = 0;\n            }\n\n            if ((ft & VT_BTYPE) == VT_DOUBLE)\n                o(0xdc);\n            else\n                o(0xd8);\n            gen_modrm(a, r, vtop->sym, fc);\n        }\n        vtop--;\n    }\n}\n\n/* convert integers to fp 't' type. Must handle 'int', 'unsigned int'\n   and 'long long' cases. */\nST_FUNC void gen_cvt_itof(int t)\n{\n    save_reg(TREG_ST0);\n    gv(RC_INT);\n    if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {\n        /* signed long long to float/double/long double (unsigned case\n           is handled generically) */\n        o(0x50 + vtop->r2); /* push r2 */\n        o(0x50 + (vtop->r & VT_VALMASK)); /* push r */\n        o(0x242cdf); /* fildll (%esp) */\n        o(0x08c483); /* add $8, %esp */\n    } else if ((vtop->type.t & (VT_BTYPE | VT_UNSIGNED)) == \n               (VT_INT | VT_UNSIGNED)) {\n        /* unsigned int to float/double/long double */\n        o(0x6a); /* push $0 */\n        g(0x00);\n        o(0x50 + (vtop->r & VT_VALMASK)); /* push r */\n        o(0x242cdf); /* fildll (%esp) */\n        o(0x08c483); /* add $8, %esp */\n    } else {\n        /* int to float/double/long double */\n        o(0x50 + (vtop->r & VT_VALMASK)); /* push r */\n        o(0x2404db); /* fildl (%esp) */\n        o(0x04c483); /* add $4, %esp */\n    }\n    vtop->r = TREG_ST0;\n}\n\n/* convert fp to int 't' type */\n/* XXX: handle long long case */\nST_FUNC void gen_cvt_ftoi(int t)\n{\n    int r, r2, size;\n    Sym *sym;\n    CType ushort_type;\n\n    ushort_type.t = VT_SHORT | VT_UNSIGNED;\n    ushort_type.ref = 0;\n\n    gv(RC_FLOAT);\n    if (t != VT_INT)\n        size = 8;\n    else \n        size = 4;\n    \n    o(0x2dd9); /* ldcw xxx */\n    sym = external_global_sym(TOK___tcc_int_fpu_control, \n                              &ushort_type, VT_LVAL);\n    greloc(cur_text_section, sym, \n           ind, R_386_32);\n    gen_le32(0);\n    \n    oad(0xec81, size); /* sub $xxx, %esp */\n    if (size == 4)\n        o(0x1cdb); /* fistpl */\n    else\n        o(0x3cdf); /* fistpll */\n    o(0x24);\n    o(0x2dd9); /* ldcw xxx */\n    sym = external_global_sym(TOK___tcc_fpu_control, \n                              &ushort_type, VT_LVAL);\n    greloc(cur_text_section, sym, \n           ind, R_386_32);\n    gen_le32(0);\n\n    r = get_reg(RC_INT);\n    o(0x58 + r); /* pop r */\n    if (size == 8) {\n        if (t == VT_LLONG) {\n            vtop->r = r; /* mark reg as used */\n            r2 = get_reg(RC_INT);\n            o(0x58 + r2); /* pop r2 */\n            vtop->r2 = r2;\n        } else {\n            o(0x04c483); /* add $4, %esp */\n        }\n    }\n    vtop->r = r;\n}\n\n/* convert from one floating point type to another */\nST_FUNC void gen_cvt_ftof(int t)\n{\n    /* all we have to do on i386 is to put the float in a register */\n    gv(RC_FLOAT);\n}\n\n/* computed goto support */\nST_FUNC void ggoto(void)\n{\n    gcall_or_jmp(1);\n    vtop--;\n}\n\n/* bound check support functions */\n#ifdef CONFIG_TCC_BCHECK\n\n/* generate a bounded pointer addition */\nST_FUNC void gen_bounded_ptr_add(void)\n{\n    Sym *sym;\n\n    /* prepare fast i386 function call (args in eax and edx) */\n    gv2(RC_EAX, RC_EDX);\n    /* save all temporary registers */\n    vtop -= 2;\n    save_regs(0);\n    /* do a fast function call */\n    sym = external_global_sym(TOK___bound_ptr_add, &func_old_type, 0);\n    greloc(cur_text_section, sym, \n           ind + 1, R_386_PC32);\n    oad(0xe8, -4);\n    /* returned pointer is in eax */\n    vtop++;\n    vtop->r = TREG_EAX | VT_BOUNDED;\n    /* address of bounding function call point */\n    vtop->c.ul = (cur_text_section->reloc->data_offset - sizeof(Elf32_Rel)); \n}\n\n/* patch pointer addition in vtop so that pointer dereferencing is\n   also tested */\nST_FUNC void gen_bounded_ptr_deref(void)\n{\n    int func;\n    int size, align;\n    Elf32_Rel *rel;\n    Sym *sym;\n\n    size = 0;\n    /* XXX: put that code in generic part of tcc */\n    if (!is_float(vtop->type.t)) {\n        if (vtop->r & VT_LVAL_BYTE)\n            size = 1;\n        else if (vtop->r & VT_LVAL_SHORT)\n            size = 2;\n    }\n    if (!size)\n        size = type_size(&vtop->type, &align);\n    switch(size) {\n    case  1: func = TOK___bound_ptr_indir1; break;\n    case  2: func = TOK___bound_ptr_indir2; break;\n    case  4: func = TOK___bound_ptr_indir4; break;\n    case  8: func = TOK___bound_ptr_indir8; break;\n    case 12: func = TOK___bound_ptr_indir12; break;\n    case 16: func = TOK___bound_ptr_indir16; break;\n    default:\n        tcc_error(\"unhandled size when dereferencing bounded pointer\");\n        func = 0;\n        break;\n    }\n\n    /* patch relocation */\n    /* XXX: find a better solution ? */\n    rel = (Elf32_Rel *)(cur_text_section->reloc->data + vtop->c.ul);\n    sym = external_global_sym(func, &func_old_type, 0);\n    if (!sym->c)\n        put_extern_sym(sym, NULL, 0, 0);\n    rel->r_info = ELF32_R_INFO(sym->c, ELF32_R_TYPE(rel->r_info));\n}\n#endif\n\n/* end of X86 code generator */\n/*************************************************************/\n#endif\n/*************************************************************/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/i386-tok.h",
    "content": "/* ------------------------------------------------------------------ */\n/* WARNING: relative order of tokens is important. */\n\n/* register */\n DEF_ASM(al)\n DEF_ASM(cl)\n DEF_ASM(dl)\n DEF_ASM(bl)\n DEF_ASM(ah)\n DEF_ASM(ch)\n DEF_ASM(dh)\n DEF_ASM(bh)\n DEF_ASM(ax)\n DEF_ASM(cx)\n DEF_ASM(dx)\n DEF_ASM(bx)\n DEF_ASM(sp)\n DEF_ASM(bp)\n DEF_ASM(si)\n DEF_ASM(di)\n DEF_ASM(eax)\n DEF_ASM(ecx)\n DEF_ASM(edx)\n DEF_ASM(ebx)\n DEF_ASM(esp)\n DEF_ASM(ebp)\n DEF_ASM(esi)\n DEF_ASM(edi)\n#ifdef TCC_TARGET_X86_64\n DEF_ASM(rax)\n DEF_ASM(rcx)\n DEF_ASM(rdx)\n DEF_ASM(rbx)\n DEF_ASM(rsp)\n DEF_ASM(rbp)\n DEF_ASM(rsi)\n DEF_ASM(rdi)\n#endif\n DEF_ASM(mm0)\n DEF_ASM(mm1)\n DEF_ASM(mm2)\n DEF_ASM(mm3)\n DEF_ASM(mm4)\n DEF_ASM(mm5)\n DEF_ASM(mm6)\n DEF_ASM(mm7)\n DEF_ASM(xmm0)\n DEF_ASM(xmm1)\n DEF_ASM(xmm2)\n DEF_ASM(xmm3)\n DEF_ASM(xmm4)\n DEF_ASM(xmm5)\n DEF_ASM(xmm6)\n DEF_ASM(xmm7)\n DEF_ASM(cr0)\n DEF_ASM(cr1)\n DEF_ASM(cr2)\n DEF_ASM(cr3)\n DEF_ASM(cr4)\n DEF_ASM(cr5)\n DEF_ASM(cr6)\n DEF_ASM(cr7)\n DEF_ASM(tr0)\n DEF_ASM(tr1)\n DEF_ASM(tr2)\n DEF_ASM(tr3)\n DEF_ASM(tr4)\n DEF_ASM(tr5)\n DEF_ASM(tr6)\n DEF_ASM(tr7)\n DEF_ASM(db0)\n DEF_ASM(db1)\n DEF_ASM(db2)\n DEF_ASM(db3)\n DEF_ASM(db4)\n DEF_ASM(db5)\n DEF_ASM(db6)\n DEF_ASM(db7)\n DEF_ASM(dr0)\n DEF_ASM(dr1)\n DEF_ASM(dr2)\n DEF_ASM(dr3)\n DEF_ASM(dr4)\n DEF_ASM(dr5)\n DEF_ASM(dr6)\n DEF_ASM(dr7)\n DEF_ASM(es)\n DEF_ASM(cs)\n DEF_ASM(ss)\n DEF_ASM(ds)\n DEF_ASM(fs)\n DEF_ASM(gs)\n DEF_ASM(st)\n\n /* generic two operands */\n DEF_BWLX(mov)\n\n DEF_BWLX(add)\n DEF_BWLX(or)\n DEF_BWLX(adc)\n DEF_BWLX(sbb)\n DEF_BWLX(and)\n DEF_BWLX(sub)\n DEF_BWLX(xor)\n DEF_BWLX(cmp)\n\n /* unary ops */\n DEF_BWLX(inc)\n DEF_BWLX(dec)\n DEF_BWLX(not)\n DEF_BWLX(neg)\n DEF_BWLX(mul)\n DEF_BWLX(imul)\n DEF_BWLX(div)\n DEF_BWLX(idiv)\n\n DEF_BWLX(xchg)\n DEF_BWLX(test)\n\n /* shifts */\n DEF_BWLX(rol)\n DEF_BWLX(ror)\n DEF_BWLX(rcl)\n DEF_BWLX(rcr)\n DEF_BWLX(shl)\n DEF_BWLX(shr)\n DEF_BWLX(sar)\n\n DEF_ASM(shldw)\n DEF_ASM(shldl)\n DEF_ASM(shld)\n DEF_ASM(shrdw)\n DEF_ASM(shrdl)\n DEF_ASM(shrd)\n\n DEF_ASM(pushw)\n DEF_ASM(pushl)\n#ifdef TCC_TARGET_X86_64\n DEF_ASM(pushq)\n#endif\n DEF_ASM(push)\n\n DEF_ASM(popw)\n DEF_ASM(popl)\n#ifdef TCC_TARGET_X86_64\n DEF_ASM(popq)\n#endif\n DEF_ASM(pop)\n\n DEF_BWL(in)\n DEF_BWL(out)\n\n DEF_WL(movzb)\n DEF_ASM(movzwl)\n DEF_ASM(movsbw)\n DEF_ASM(movsbl)\n DEF_ASM(movswl)\n#ifdef TCC_TARGET_X86_64\n DEF_ASM(movslq)\n#endif\n\n DEF_WLX(lea)\n\n DEF_ASM(les)\n DEF_ASM(lds)\n DEF_ASM(lss)\n DEF_ASM(lfs)\n DEF_ASM(lgs)\n\n DEF_ASM(call)\n DEF_ASM(jmp)\n DEF_ASM(lcall)\n DEF_ASM(ljmp)\n\n DEF_ASMTEST(j)\n\n DEF_ASMTEST(set)\n DEF_ASMTEST(cmov)\n\n DEF_WLX(bsf)\n DEF_WLX(bsr)\n DEF_WLX(bt)\n DEF_WLX(bts)\n DEF_WLX(btr)\n DEF_WLX(btc)\n\n DEF_WLX(lsl)\n\n /* generic FP ops */\n DEF_FP(add)\n DEF_FP(mul)\n\n DEF_ASM(fcom)\n DEF_ASM(fcom_1) /* non existant op, just to have a regular table */\n DEF_FP1(com)\n\n DEF_FP(comp)\n DEF_FP(sub)\n DEF_FP(subr)\n DEF_FP(div)\n DEF_FP(divr)\n\n DEF_BWLX(xadd)\n DEF_BWLX(cmpxchg)\n\n /* string ops */\n DEF_BWLX(cmps)\n DEF_BWLX(scmp)\n DEF_BWL(ins)\n DEF_BWL(outs)\n DEF_BWLX(lods)\n DEF_BWLX(slod)\n DEF_BWLX(movs)\n DEF_BWLX(smov)\n DEF_BWLX(scas)\n DEF_BWLX(ssca)\n DEF_BWLX(stos)\n DEF_BWLX(ssto)\n\n /* generic asm ops */\n#define ALT(x)\n#define DEF_ASM_OP0(name, opcode) DEF_ASM(name)\n#define DEF_ASM_OP0L(name, opcode, group, instr_type)\n#define DEF_ASM_OP1(name, opcode, group, instr_type, op0)\n#define DEF_ASM_OP2(name, opcode, group, instr_type, op0, op1)\n#define DEF_ASM_OP3(name, opcode, group, instr_type, op0, op1, op2)\n#ifdef TCC_TARGET_X86_64\n# include \"x86_64-asm.h\"\n#else\n# include \"i386-asm.h\"\n#endif\n\n#define ALT(x)\n#define DEF_ASM_OP0(name, opcode)\n#define DEF_ASM_OP0L(name, opcode, group, instr_type) DEF_ASM(name)\n#define DEF_ASM_OP1(name, opcode, group, instr_type, op0) DEF_ASM(name)\n#define DEF_ASM_OP2(name, opcode, group, instr_type, op0, op1) DEF_ASM(name)\n#define DEF_ASM_OP3(name, opcode, group, instr_type, op0, op1, op2) DEF_ASM(name)\n#ifdef TCC_TARGET_X86_64\n# include \"x86_64-asm.h\"\n#else\n# include \"i386-asm.h\"\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/il-gen.c",
    "content": "/*\n *  CIL code generator for TCC\n * \n *  Copyright (c) 2002 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n/* number of available registers */\n#define NB_REGS             3\n\n/* a register can belong to several classes. The classes must be\n   sorted from more general to more precise (see gv2() code which does\n   assumptions on it). */\n#define RC_ST      0x0001  /* any stack entry */\n#define RC_ST0     0x0002  /* top of stack */\n#define RC_ST1     0x0004  /* top - 1 */\n\n#define RC_INT     RC_ST\n#define RC_FLOAT   RC_ST\n#define RC_IRET    RC_ST0 /* function return: integer register */\n#define RC_LRET    RC_ST0 /* function return: second integer register */\n#define RC_FRET    RC_ST0 /* function return: float register */\n\n/* pretty names for the registers */\nenum {\n    REG_ST0 = 0,\n    REG_ST1,\n    REG_ST2,\n};\n\nconst int reg_classes[NB_REGS] = {\n    /* ST0 */ RC_ST | RC_ST0,\n    /* ST1 */ RC_ST | RC_ST1,\n    /* ST2 */ RC_ST,\n};\n\n/* return registers for function */\n#define REG_IRET REG_ST0 /* single word int return register */\n#define REG_LRET REG_ST0 /* second word return register (for long long) */\n#define REG_FRET REG_ST0 /* float return register */\n\n/* defined if function parameters must be evaluated in reverse order */\n//#define INVERT_FUNC_PARAMS\n\n/* defined if structures are passed as pointers. Otherwise structures\n   are directly pushed on stack. */\n//#define FUNC_STRUCT_PARAM_AS_PTR\n\n/* pointer size, in bytes */\n#define PTR_SIZE 4\n\n/* long double size and alignment, in bytes */\n#define LDOUBLE_SIZE  8\n#define LDOUBLE_ALIGN 8\n\n/* function call context */\ntypedef struct GFuncContext {\n    int func_call; /* func call type (FUNC_STDCALL or FUNC_CDECL) */\n} GFuncContext;\n\n/******************************************************/\n/* opcode definitions */\n\n#define IL_OP_PREFIX 0xFE\n\nenum ILOPCodes {\n#define OP(name, str, n) IL_OP_ ## name = n,\n#include \"il-opcodes.h\"\n#undef OP\n};\n\nchar *il_opcodes_str[] = {\n#define OP(name, str, n) [n] = str,\n#include \"il-opcodes.h\"\n#undef OP\n};\n\n/******************************************************/\n\n/* arguments variable numbers start from there */\n#define ARG_BASE 0x70000000\n\nstatic FILE *il_outfile;\n\nstatic void out_byte(int c)\n{\n    *(char *)ind++ = c;\n}\n\nstatic void out_le32(int c)\n{\n    out_byte(c);\n    out_byte(c >> 8);\n    out_byte(c >> 16);\n    out_byte(c >> 24);\n}\n\nstatic void init_outfile(void)\n{\n    if (!il_outfile) {\n        il_outfile = stdout;\n        fprintf(il_outfile, \n                \".assembly extern mscorlib\\n\"\n                \"{\\n\"\n                \".ver 1:0:2411:0\\n\"\n                \"}\\n\\n\");\n    }\n}\n\nstatic void out_op1(int op)\n{\n    if (op & 0x100)\n        out_byte(IL_OP_PREFIX);\n    out_byte(op & 0xff);\n}\n\n/* output an opcode with prefix */\nstatic void out_op(int op)\n{\n    out_op1(op);\n    fprintf(il_outfile, \" %s\\n\", il_opcodes_str[op]);\n}\n\nstatic void out_opb(int op, int c)\n{\n    out_op1(op);\n    out_byte(c);\n    fprintf(il_outfile, \" %s %d\\n\", il_opcodes_str[op], c);\n}\n\nstatic void out_opi(int op, int c)\n{\n    out_op1(op);\n    out_le32(c);\n    fprintf(il_outfile, \" %s 0x%x\\n\", il_opcodes_str[op], c);\n}\n\n/* XXX: not complete */\nstatic void il_type_to_str(char *buf, int buf_size, \n                           int t, const char *varstr)\n{\n    int bt;\n    Sym *s, *sa;\n    char buf1[256];\n    const char *tstr;\n\n    t = t & VT_TYPE;\n    bt = t & VT_BTYPE;\n    buf[0] = '\\0';\n    if (t & VT_UNSIGNED)\n        pstrcat(buf, buf_size, \"unsigned \");\n    switch(bt) {\n    case VT_VOID:\n        tstr = \"void\";\n        goto add_tstr;\n    case VT_BOOL:\n        tstr = \"bool\";\n        goto add_tstr;\n    case VT_BYTE:\n        tstr = \"int8\";\n        goto add_tstr;\n    case VT_SHORT:\n        tstr = \"int16\";\n        goto add_tstr;\n    case VT_ENUM:\n    case VT_INT:\n    case VT_LONG:\n        tstr = \"int32\";\n        goto add_tstr;\n    case VT_LLONG:\n        tstr = \"int64\";\n        goto add_tstr;\n    case VT_FLOAT:\n        tstr = \"float32\";\n        goto add_tstr;\n    case VT_DOUBLE:\n    case VT_LDOUBLE:\n        tstr = \"float64\";\n    add_tstr:\n        pstrcat(buf, buf_size, tstr);\n        break;\n    case VT_STRUCT:\n        tcc_error(\"structures not handled yet\");\n        break;\n    case VT_FUNC:\n        s = sym_find((unsigned)t >> VT_STRUCT_SHIFT);\n        il_type_to_str(buf, buf_size, s->t, varstr);\n        pstrcat(buf, buf_size, \"(\");\n        sa = s->next;\n        while (sa != NULL) {\n            il_type_to_str(buf1, sizeof(buf1), sa->t, NULL);\n            pstrcat(buf, buf_size, buf1);\n            sa = sa->next;\n            if (sa)\n                pstrcat(buf, buf_size, \", \");\n        }\n        pstrcat(buf, buf_size, \")\");\n        goto no_var;\n    case VT_PTR:\n        s = sym_find((unsigned)t >> VT_STRUCT_SHIFT);\n        pstrcpy(buf1, sizeof(buf1), \"*\");\n        if (varstr)\n            pstrcat(buf1, sizeof(buf1), varstr);\n        il_type_to_str(buf, buf_size, s->t, buf1);\n        goto no_var;\n    }\n    if (varstr) {\n        pstrcat(buf, buf_size, \" \");\n        pstrcat(buf, buf_size, varstr);\n    }\n no_var: ;\n}\n\n\n/* patch relocation entry with value 'val' */\nvoid greloc_patch1(Reloc *p, int val)\n{\n}\n\n/* output a symbol and patch all calls to it */\nvoid gsym_addr(t, a)\n{\n}\n\n/* output jump and return symbol */\nstatic int out_opj(int op, int c)\n{\n    out_op1(op);\n    out_le32(0);\n    if (c == 0) {\n        c = ind - (int)cur_text_section->data;\n    }\n    fprintf(il_outfile, \" %s L%d\\n\", il_opcodes_str[op], c);\n    return c;\n}\n\nvoid gsym(int t)\n{\n    fprintf(il_outfile, \"L%d:\\n\", t);\n}\n\n/* load 'r' from value 'sv' */\nvoid load(int r, SValue *sv)\n{\n    int v, fc, ft;\n\n    v = sv->r & VT_VALMASK;\n    fc = sv->c.i;\n    ft = sv->t;\n\n    if (sv->r & VT_LVAL) {\n        if (v == VT_LOCAL) {\n            if (fc >= ARG_BASE) {\n                fc -= ARG_BASE;\n                if (fc >= 0 && fc <= 4) {\n                    out_op(IL_OP_LDARG_0 + fc);\n                } else if (fc <= 0xff) {\n                    out_opb(IL_OP_LDARG_S, fc);\n                } else {\n                    out_opi(IL_OP_LDARG, fc);\n                }\n            } else {\n                if (fc >= 0 && fc <= 4) {\n                    out_op(IL_OP_LDLOC_0 + fc);\n                } else if (fc <= 0xff) {\n                    out_opb(IL_OP_LDLOC_S, fc);\n                } else {\n                    out_opi(IL_OP_LDLOC, fc);\n                }\n            }\n        } else if (v == VT_CONST) {\n                /* XXX: handle globals */\n                out_opi(IL_OP_LDSFLD, 0);\n        } else {\n            if ((ft & VT_BTYPE) == VT_FLOAT) {\n                out_op(IL_OP_LDIND_R4);\n            } else if ((ft & VT_BTYPE) == VT_DOUBLE) {\n                out_op(IL_OP_LDIND_R8);\n            } else if ((ft & VT_BTYPE) == VT_LDOUBLE) {\n                out_op(IL_OP_LDIND_R8);\n            } else if ((ft & VT_TYPE) == VT_BYTE)\n                out_op(IL_OP_LDIND_I1);\n            else if ((ft & VT_TYPE) == (VT_BYTE | VT_UNSIGNED))\n                out_op(IL_OP_LDIND_U1);\n            else if ((ft & VT_TYPE) == VT_SHORT)\n                out_op(IL_OP_LDIND_I2);\n            else if ((ft & VT_TYPE) == (VT_SHORT | VT_UNSIGNED))\n                out_op(IL_OP_LDIND_U2);\n            else\n                out_op(IL_OP_LDIND_I4);\n        } \n    } else {\n        if (v == VT_CONST) {\n            /* XXX: handle globals */\n            if (fc >= -1 && fc <= 8) {\n                out_op(IL_OP_LDC_I4_M1 + fc + 1); \n            } else {\n                out_opi(IL_OP_LDC_I4, fc);\n            }\n        } else if (v == VT_LOCAL) {\n            if (fc >= ARG_BASE) {\n                fc -= ARG_BASE;\n                if (fc <= 0xff) {\n                    out_opb(IL_OP_LDARGA_S, fc);\n                } else {\n                    out_opi(IL_OP_LDARGA, fc);\n                }\n            } else {\n                if (fc <= 0xff) {\n                    out_opb(IL_OP_LDLOCA_S, fc);\n                } else {\n                    out_opi(IL_OP_LDLOCA, fc);\n                }\n            }\n        } else {\n            /* XXX: do it */\n        }\n    }\n}\n\n/* store register 'r' in lvalue 'v' */\nvoid store(int r, SValue *sv)\n{\n    int v, fc, ft;\n\n    v = sv->r & VT_VALMASK;\n    fc = sv->c.i;\n    ft = sv->t;\n    if (v == VT_LOCAL) {\n        if (fc >= ARG_BASE) {\n            fc -= ARG_BASE;\n            /* XXX: check IL arg store semantics */\n            if (fc <= 0xff) {\n                out_opb(IL_OP_STARG_S, fc);\n            } else {\n                out_opi(IL_OP_STARG, fc);\n            }\n        } else {\n            if (fc >= 0 && fc <= 4) {\n                out_op(IL_OP_STLOC_0 + fc);\n            } else if (fc <= 0xff) {\n                out_opb(IL_OP_STLOC_S, fc);\n            } else {\n                out_opi(IL_OP_STLOC, fc);\n            }\n        }\n    } else if (v == VT_CONST) {\n        /* XXX: handle globals */\n        out_opi(IL_OP_STSFLD, 0);\n    } else {\n        if ((ft & VT_BTYPE) == VT_FLOAT)\n            out_op(IL_OP_STIND_R4);\n        else if ((ft & VT_BTYPE) == VT_DOUBLE)\n            out_op(IL_OP_STIND_R8);\n        else if ((ft & VT_BTYPE) == VT_LDOUBLE)\n            out_op(IL_OP_STIND_R8);\n        else if ((ft & VT_BTYPE) == VT_BYTE)\n            out_op(IL_OP_STIND_I1);\n        else if ((ft & VT_BTYPE) == VT_SHORT)\n            out_op(IL_OP_STIND_I2);\n        else\n            out_op(IL_OP_STIND_I4);\n    }\n}\n\n/* start function call and return function call context */\nvoid gfunc_start(GFuncContext *c, int func_call)\n{\n    c->func_call = func_call;\n}\n\n/* push function parameter which is in (vtop->t, vtop->c). Stack entry\n   is then popped. */\nvoid gfunc_param(GFuncContext *c)\n{\n    if ((vtop->t & VT_BTYPE) == VT_STRUCT) {\n        tcc_error(\"structures passed as value not handled yet\");\n    } else {\n        /* simply push on stack */\n        gv(RC_ST0);\n    }\n    vtop--;\n}\n\n/* generate function call with address in (vtop->t, vtop->c) and free function\n   context. Stack entry is popped */\nvoid gfunc_call(GFuncContext *c)\n{\n    char buf[1024];\n\n    if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n        /* XXX: more info needed from tcc */\n        il_type_to_str(buf, sizeof(buf), vtop->t, \"xxx\");\n        fprintf(il_outfile, \" call %s\\n\", buf);\n    } else {\n        /* indirect call */\n        gv(RC_INT);\n        il_type_to_str(buf, sizeof(buf), vtop->t, NULL);\n        fprintf(il_outfile, \" calli %s\\n\", buf);\n    }\n    vtop--;\n}\n\n/* generate function prolog of type 't' */\nvoid gfunc_prolog(int t)\n{\n    int addr, u, func_call;\n    Sym *sym;\n    char buf[1024];\n\n    init_outfile();\n\n    /* XXX: pass function name to gfunc_prolog */\n    il_type_to_str(buf, sizeof(buf), t, funcname);\n    fprintf(il_outfile, \".method static %s il managed\\n\", buf);\n    fprintf(il_outfile, \"{\\n\");\n    /* XXX: cannot do better now */\n    fprintf(il_outfile, \" .maxstack %d\\n\", NB_REGS);\n    fprintf(il_outfile, \" .locals (int32, int32, int32, int32, int32, int32, int32, int32)\\n\");\n    \n    if (!strcmp(funcname, \"main\"))\n        fprintf(il_outfile, \" .entrypoint\\n\");\n        \n    sym = sym_find((unsigned)t >> VT_STRUCT_SHIFT);\n    func_call = sym->r;\n\n    addr = ARG_BASE;\n    /* if the function returns a structure, then add an\n       implicit pointer parameter */\n    func_vt = sym->t;\n    if ((func_vt & VT_BTYPE) == VT_STRUCT) {\n        func_vc = addr;\n        addr++;\n    }\n    /* define parameters */\n    while ((sym = sym->next) != NULL) {\n        u = sym->t;\n        sym_push(sym->v & ~SYM_FIELD, u,\n                 VT_LOCAL | lvalue_type(sym->type.t), addr);\n        addr++;\n    }\n}\n\n/* generate function epilog */\nvoid gfunc_epilog(void)\n{\n    out_op(IL_OP_RET);\n    fprintf(il_outfile, \"}\\n\\n\");\n}\n\n/* generate a jump to a label */\nint gjmp(int t)\n{\n    return out_opj(IL_OP_BR, t);\n}\n\n/* generate a jump to a fixed address */\nvoid gjmp_addr(int a)\n{\n    /* XXX: handle syms */\n    out_opi(IL_OP_BR, a);\n}\n\n/* generate a test. set 'inv' to invert test. Stack entry is popped */\nint gtst(int inv, int t)\n{\n    int v, *p, c;\n\n    v = vtop->r & VT_VALMASK;\n    if (v == VT_CMP) {\n        c = vtop->c.i ^ inv;\n        switch(c) {\n        case TOK_EQ:\n            c = IL_OP_BEQ;\n            break;\n        case TOK_NE:\n            c = IL_OP_BNE_UN;\n            break;\n        case TOK_LT:\n            c = IL_OP_BLT;\n            break;\n        case TOK_LE:\n            c = IL_OP_BLE;\n            break;\n        case TOK_GT:\n            c = IL_OP_BGT;\n            break;\n        case TOK_GE:\n            c = IL_OP_BGE;\n            break;\n        case TOK_ULT:\n            c = IL_OP_BLT_UN;\n            break;\n        case TOK_ULE:\n            c = IL_OP_BLE_UN;\n            break;\n        case TOK_UGT:\n            c = IL_OP_BGT_UN;\n            break;\n        case TOK_UGE:\n            c = IL_OP_BGE_UN;\n            break;\n        }\n        t = out_opj(c, t);\n    } else if (v == VT_JMP || v == VT_JMPI) {\n        /* && or || optimization */\n        if ((v & 1) == inv) {\n            /* insert vtop->c jump list in t */\n            p = &vtop->c.i;\n            while (*p != 0)\n                p = (int *)*p;\n            *p = t;\n            t = vtop->c.i;\n        } else {\n            t = gjmp(t);\n            gsym(vtop->c.i);\n        }\n    } else {\n        if (is_float(vtop->t)) {\n            vpushi(0);\n            gen_op(TOK_NE);\n        }\n        if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_FORWARD)) == VT_CONST) {\n            /* constant jmp optimization */\n            if ((vtop->c.i != 0) != inv) \n                t = gjmp(t);\n        } else {\n            v = gv(RC_INT);\n            t = out_opj(IL_OP_BRTRUE - inv, t);\n        }\n    }\n    vtop--;\n    return t;\n}\n\n/* generate an integer binary operation */\nvoid gen_opi(int op)\n{\n    gv2(RC_ST1, RC_ST0);\n    switch(op) {\n    case '+':\n        out_op(IL_OP_ADD);\n        goto std_op;\n    case '-':\n        out_op(IL_OP_SUB);\n        goto std_op;\n    case '&':\n        out_op(IL_OP_AND);\n        goto std_op;\n    case '^':\n        out_op(IL_OP_XOR);\n        goto std_op;\n    case '|':\n        out_op(IL_OP_OR);\n        goto std_op;\n    case '*':\n        out_op(IL_OP_MUL);\n        goto std_op;\n    case TOK_SHL:\n        out_op(IL_OP_SHL);\n        goto std_op;\n    case TOK_SHR:\n        out_op(IL_OP_SHR_UN);\n        goto std_op;\n    case TOK_SAR:\n        out_op(IL_OP_SHR);\n        goto std_op;\n    case '/':\n    case TOK_PDIV:\n        out_op(IL_OP_DIV);\n        goto std_op;\n    case TOK_UDIV:\n        out_op(IL_OP_DIV_UN);\n        goto std_op;\n    case '%':\n        out_op(IL_OP_REM);\n        goto std_op;\n    case TOK_UMOD:\n        out_op(IL_OP_REM_UN);\n    std_op:\n        vtop--;\n        vtop[0].r = REG_ST0;\n        break;\n    case TOK_EQ:\n    case TOK_NE:\n    case TOK_LT:\n    case TOK_LE:\n    case TOK_GT:\n    case TOK_GE:\n    case TOK_ULT:\n    case TOK_ULE:\n    case TOK_UGT:\n    case TOK_UGE:\n        vtop--;\n        vtop[0].r = VT_CMP;\n        vtop[0].c.i = op;\n        break;\n    }\n}\n\n/* generate a floating point operation 'v = t1 op t2' instruction. The\n   two operands are guaranted to have the same floating point type */\nvoid gen_opf(int op)\n{\n    /* same as integer */\n    gen_opi(op);\n}\n\n/* convert integers to fp 't' type. Must handle 'int', 'unsigned int'\n   and 'long long' cases. */\nvoid gen_cvt_itof(int t)\n{\n    gv(RC_ST0);\n    if (t == VT_FLOAT)\n        out_op(IL_OP_CONV_R4);\n    else\n        out_op(IL_OP_CONV_R8);\n}\n\n/* convert fp to int 't' type */\n/* XXX: handle long long case */\nvoid gen_cvt_ftoi(int t)\n{\n    gv(RC_ST0);\n    switch(t) {\n    case VT_INT | VT_UNSIGNED:\n        out_op(IL_OP_CONV_U4);\n        break;\n    case VT_LLONG:\n        out_op(IL_OP_CONV_I8);\n        break;\n    case VT_LLONG | VT_UNSIGNED:\n        out_op(IL_OP_CONV_U8);\n        break;\n    default:\n        out_op(IL_OP_CONV_I4);\n        break;\n    }\n}\n\n/* convert from one floating point type to another */\nvoid gen_cvt_ftof(int t)\n{\n    gv(RC_ST0);\n    if (t == VT_FLOAT) {\n        out_op(IL_OP_CONV_R4);\n    } else {\n        out_op(IL_OP_CONV_R8);\n    }\n}\n\n/* end of CIL code generator */\n/*************************************************************/\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/il-opcodes.h",
    "content": "/*\n *  CIL opcode definition\n * \n *  Copyright (c) 2002 Fabrice Bellard\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n */\nOP(NOP, \"nop\", 0x00)\nOP(BREAK, \"break\", 0x01)\nOP(LDARG_0, \"ldarg.0\", 0x02)\nOP(LDARG_1, \"ldarg.1\", 0x03)\nOP(LDARG_2, \"ldarg.2\", 0x04)\nOP(LDARG_3, \"ldarg.3\", 0x05)\nOP(LDLOC_0, \"ldloc.0\", 0x06)\nOP(LDLOC_1, \"ldloc.1\", 0x07)\nOP(LDLOC_2, \"ldloc.2\", 0x08)\nOP(LDLOC_3, \"ldloc.3\", 0x09)\nOP(STLOC_0, \"stloc.0\", 0x0a)\nOP(STLOC_1, \"stloc.1\", 0x0b)\nOP(STLOC_2, \"stloc.2\", 0x0c)\nOP(STLOC_3, \"stloc.3\", 0x0d)\nOP(LDARG_S, \"ldarg.s\", 0x0e)\nOP(LDARGA_S, \"ldarga.s\", 0x0f)\nOP(STARG_S, \"starg.s\", 0x10)\nOP(LDLOC_S, \"ldloc.s\", 0x11)\nOP(LDLOCA_S, \"ldloca.s\", 0x12)\nOP(STLOC_S, \"stloc.s\", 0x13)\nOP(LDNULL, \"ldnull\", 0x14)\nOP(LDC_I4_M1, \"ldc.i4.m1\", 0x15)\nOP(LDC_I4_0, \"ldc.i4.0\", 0x16)\nOP(LDC_I4_1, \"ldc.i4.1\", 0x17)\nOP(LDC_I4_2, \"ldc.i4.2\", 0x18)\nOP(LDC_I4_3, \"ldc.i4.3\", 0x19)\nOP(LDC_I4_4, \"ldc.i4.4\", 0x1a)\nOP(LDC_I4_5, \"ldc.i4.5\", 0x1b)\nOP(LDC_I4_6, \"ldc.i4.6\", 0x1c)\nOP(LDC_I4_7, \"ldc.i4.7\", 0x1d)\nOP(LDC_I4_8, \"ldc.i4.8\", 0x1e)\nOP(LDC_I4_S, \"ldc.i4.s\", 0x1f)\nOP(LDC_I4, \"ldc.i4\", 0x20)\nOP(LDC_I8, \"ldc.i8\", 0x21)\nOP(LDC_R4, \"ldc.r4\", 0x22)\nOP(LDC_R8, \"ldc.r8\", 0x23)\nOP(LDPTR, \"ldptr\", 0x24)\nOP(DUP, \"dup\", 0x25)\nOP(POP, \"pop\", 0x26)\nOP(JMP, \"jmp\", 0x27)\nOP(CALL, \"call\", 0x28)\nOP(CALLI, \"calli\", 0x29)\nOP(RET, \"ret\", 0x2a)\nOP(BR_S, \"br.s\", 0x2b)\nOP(BRFALSE_S, \"brfalse.s\", 0x2c)\nOP(BRTRUE_S, \"brtrue.s\", 0x2d)\nOP(BEQ_S, \"beq.s\", 0x2e)\nOP(BGE_S, \"bge.s\", 0x2f)\nOP(BGT_S, \"bgt.s\", 0x30)\nOP(BLE_S, \"ble.s\", 0x31)\nOP(BLT_S, \"blt.s\", 0x32)\nOP(BNE_UN_S, \"bne.un.s\", 0x33)\nOP(BGE_UN_S, \"bge.un.s\", 0x34)\nOP(BGT_UN_S, \"bgt.un.s\", 0x35)\nOP(BLE_UN_S, \"ble.un.s\", 0x36)\nOP(BLT_UN_S, \"blt.un.s\", 0x37)\nOP(BR, \"br\", 0x38)\nOP(BRFALSE, \"brfalse\", 0x39)\nOP(BRTRUE, \"brtrue\", 0x3a)\nOP(BEQ, \"beq\", 0x3b)\nOP(BGE, \"bge\", 0x3c)\nOP(BGT, \"bgt\", 0x3d)\nOP(BLE, \"ble\", 0x3e)\nOP(BLT, \"blt\", 0x3f)\nOP(BNE_UN, \"bne.un\", 0x40)\nOP(BGE_UN, \"bge.un\", 0x41)\nOP(BGT_UN, \"bgt.un\", 0x42)\nOP(BLE_UN, \"ble.un\", 0x43)\nOP(BLT_UN, \"blt.un\", 0x44)\nOP(SWITCH, \"switch\", 0x45)\nOP(LDIND_I1, \"ldind.i1\", 0x46)\nOP(LDIND_U1, \"ldind.u1\", 0x47)\nOP(LDIND_I2, \"ldind.i2\", 0x48)\nOP(LDIND_U2, \"ldind.u2\", 0x49)\nOP(LDIND_I4, \"ldind.i4\", 0x4a)\nOP(LDIND_U4, \"ldind.u4\", 0x4b)\nOP(LDIND_I8, \"ldind.i8\", 0x4c)\nOP(LDIND_I, \"ldind.i\", 0x4d)\nOP(LDIND_R4, \"ldind.r4\", 0x4e)\nOP(LDIND_R8, \"ldind.r8\", 0x4f)\nOP(LDIND_REF, \"ldind.ref\", 0x50)\nOP(STIND_REF, \"stind.ref\", 0x51)\nOP(STIND_I1, \"stind.i1\", 0x52)\nOP(STIND_I2, \"stind.i2\", 0x53)\nOP(STIND_I4, \"stind.i4\", 0x54)\nOP(STIND_I8, \"stind.i8\", 0x55)\nOP(STIND_R4, \"stind.r4\", 0x56)\nOP(STIND_R8, \"stind.r8\", 0x57)\nOP(ADD, \"add\", 0x58)\nOP(SUB, \"sub\", 0x59)\nOP(MUL, \"mul\", 0x5a)\nOP(DIV, \"div\", 0x5b)\nOP(DIV_UN, \"div.un\", 0x5c)\nOP(REM, \"rem\", 0x5d)\nOP(REM_UN, \"rem.un\", 0x5e)\nOP(AND, \"and\", 0x5f)\nOP(OR, \"or\", 0x60)\nOP(XOR, \"xor\", 0x61)\nOP(SHL, \"shl\", 0x62)\nOP(SHR, \"shr\", 0x63)\nOP(SHR_UN, \"shr.un\", 0x64)\nOP(NEG, \"neg\", 0x65)\nOP(NOT, \"not\", 0x66)\nOP(CONV_I1, \"conv.i1\", 0x67)\nOP(CONV_I2, \"conv.i2\", 0x68)\nOP(CONV_I4, \"conv.i4\", 0x69)\nOP(CONV_I8, \"conv.i8\", 0x6a)\nOP(CONV_R4, \"conv.r4\", 0x6b)\nOP(CONV_R8, \"conv.r8\", 0x6c)\nOP(CONV_U4, \"conv.u4\", 0x6d)\nOP(CONV_U8, \"conv.u8\", 0x6e)\nOP(CALLVIRT, \"callvirt\", 0x6f)\nOP(CPOBJ, \"cpobj\", 0x70)\nOP(LDOBJ, \"ldobj\", 0x71)\nOP(LDSTR, \"ldstr\", 0x72)\nOP(NEWOBJ, \"newobj\", 0x73)\nOP(CASTCLASS, \"castclass\", 0x74)\nOP(ISINST, \"isinst\", 0x75)\nOP(CONV_R_UN, \"conv.r.un\", 0x76)\nOP(ANN_DATA_S, \"ann.data.s\", 0x77)\nOP(UNBOX, \"unbox\", 0x79)\nOP(THROW, \"throw\", 0x7a)\nOP(LDFLD, \"ldfld\", 0x7b)\nOP(LDFLDA, \"ldflda\", 0x7c)\nOP(STFLD, \"stfld\", 0x7d)\nOP(LDSFLD, \"ldsfld\", 0x7e)\nOP(LDSFLDA, \"ldsflda\", 0x7f)\nOP(STSFLD, \"stsfld\", 0x80)\nOP(STOBJ, \"stobj\", 0x81)\nOP(CONV_OVF_I1_UN, \"conv.ovf.i1.un\", 0x82)\nOP(CONV_OVF_I2_UN, \"conv.ovf.i2.un\", 0x83)\nOP(CONV_OVF_I4_UN, \"conv.ovf.i4.un\", 0x84)\nOP(CONV_OVF_I8_UN, \"conv.ovf.i8.un\", 0x85)\nOP(CONV_OVF_U1_UN, \"conv.ovf.u1.un\", 0x86)\nOP(CONV_OVF_U2_UN, \"conv.ovf.u2.un\", 0x87)\nOP(CONV_OVF_U4_UN, \"conv.ovf.u4.un\", 0x88)\nOP(CONV_OVF_U8_UN, \"conv.ovf.u8.un\", 0x89)\nOP(CONV_OVF_I_UN, \"conv.ovf.i.un\", 0x8a)\nOP(CONV_OVF_U_UN, \"conv.ovf.u.un\", 0x8b)\nOP(BOX, \"box\", 0x8c)\nOP(NEWARR, \"newarr\", 0x8d)\nOP(LDLEN, \"ldlen\", 0x8e)\nOP(LDELEMA, \"ldelema\", 0x8f)\nOP(LDELEM_I1, \"ldelem.i1\", 0x90)\nOP(LDELEM_U1, \"ldelem.u1\", 0x91)\nOP(LDELEM_I2, \"ldelem.i2\", 0x92)\nOP(LDELEM_U2, \"ldelem.u2\", 0x93)\nOP(LDELEM_I4, \"ldelem.i4\", 0x94)\nOP(LDELEM_U4, \"ldelem.u4\", 0x95)\nOP(LDELEM_I8, \"ldelem.i8\", 0x96)\nOP(LDELEM_I, \"ldelem.i\", 0x97)\nOP(LDELEM_R4, \"ldelem.r4\", 0x98)\nOP(LDELEM_R8, \"ldelem.r8\", 0x99)\nOP(LDELEM_REF, \"ldelem.ref\", 0x9a)\nOP(STELEM_I, \"stelem.i\", 0x9b)\nOP(STELEM_I1, \"stelem.i1\", 0x9c)\nOP(STELEM_I2, \"stelem.i2\", 0x9d)\nOP(STELEM_I4, \"stelem.i4\", 0x9e)\nOP(STELEM_I8, \"stelem.i8\", 0x9f)\nOP(STELEM_R4, \"stelem.r4\", 0xa0)\nOP(STELEM_R8, \"stelem.r8\", 0xa1)\nOP(STELEM_REF, \"stelem.ref\", 0xa2)\nOP(CONV_OVF_I1, \"conv.ovf.i1\", 0xb3)\nOP(CONV_OVF_U1, \"conv.ovf.u1\", 0xb4)\nOP(CONV_OVF_I2, \"conv.ovf.i2\", 0xb5)\nOP(CONV_OVF_U2, \"conv.ovf.u2\", 0xb6)\nOP(CONV_OVF_I4, \"conv.ovf.i4\", 0xb7)\nOP(CONV_OVF_U4, \"conv.ovf.u4\", 0xb8)\nOP(CONV_OVF_I8, \"conv.ovf.i8\", 0xb9)\nOP(CONV_OVF_U8, \"conv.ovf.u8\", 0xba)\nOP(REFANYVAL, \"refanyval\", 0xc2)\nOP(CKFINITE, \"ckfinite\", 0xc3)\nOP(MKREFANY, \"mkrefany\", 0xc6)\nOP(ANN_CALL, \"ann.call\", 0xc7)\nOP(ANN_CATCH, \"ann.catch\", 0xc8)\nOP(ANN_DEAD, \"ann.dead\", 0xc9)\nOP(ANN_HOISTED, \"ann.hoisted\", 0xca)\nOP(ANN_HOISTED_CALL, \"ann.hoisted.call\", 0xcb)\nOP(ANN_LAB, \"ann.lab\", 0xcc)\nOP(ANN_DEF, \"ann.def\", 0xcd)\nOP(ANN_REF_S, \"ann.ref.s\", 0xce)\nOP(ANN_PHI, \"ann.phi\", 0xcf)\nOP(LDTOKEN, \"ldtoken\", 0xd0)\nOP(CONV_U2, \"conv.u2\", 0xd1)\nOP(CONV_U1, \"conv.u1\", 0xd2)\nOP(CONV_I, \"conv.i\", 0xd3)\nOP(CONV_OVF_I, \"conv.ovf.i\", 0xd4)\nOP(CONV_OVF_U, \"conv.ovf.u\", 0xd5)\nOP(ADD_OVF, \"add.ovf\", 0xd6)\nOP(ADD_OVF_UN, \"add.ovf.un\", 0xd7)\nOP(MUL_OVF, \"mul.ovf\", 0xd8)\nOP(MUL_OVF_UN, \"mul.ovf.un\", 0xd9)\nOP(SUB_OVF, \"sub.ovf\", 0xda)\nOP(SUB_OVF_UN, \"sub.ovf.un\", 0xdb)\nOP(ENDFINALLY, \"endfinally\", 0xdc)\nOP(LEAVE, \"leave\", 0xdd)\nOP(LEAVE_S, \"leave.s\", 0xde)\nOP(STIND_I, \"stind.i\", 0xdf)\nOP(CONV_U, \"conv.u\", 0xe0)\n\n/* prefix instructions. we use an opcode >= 256 to ease coding */\n\nOP(ARGLIST, \"arglist\", 0x100)\nOP(CEQ, \"ceq\", 0x101)\nOP(CGT, \"cgt\", 0x102)\nOP(CGT_UN, \"cgt.un\", 0x103)\nOP(CLT, \"clt\", 0x104)\nOP(CLT_UN, \"clt.un\", 0x105)\nOP(LDFTN, \"ldftn\", 0x106)\nOP(LDVIRTFTN, \"ldvirtftn\", 0x107)\nOP(JMPI, \"jmpi\", 0x108)\nOP(LDARG, \"ldarg\", 0x109)\nOP(LDARGA, \"ldarga\", 0x10a)\nOP(STARG, \"starg\", 0x10b)\nOP(LDLOC, \"ldloc\", 0x10c)\nOP(LDLOCA, \"ldloca\", 0x10d)\nOP(STLOC, \"stloc\", 0x10e)\nOP(LOCALLOC, \"localloc\", 0x10f)\nOP(ENDFILTER, \"endfilter\", 0x111)\nOP(UNALIGNED, \"unaligned\", 0x112)\nOP(VOLATILE, \"volatile\", 0x113)\nOP(TAIL, \"tail\", 0x114)\nOP(INITOBJ, \"initobj\", 0x115)\nOP(ANN_LIVE, \"ann.live\", 0x116)\nOP(CPBLK, \"cpblk\", 0x117)\nOP(INITBLK, \"initblk\", 0x118)\nOP(ANN_REF, \"ann.ref\", 0x119)\nOP(RETHROW, \"rethrow\", 0x11a)\nOP(SIZEOF, \"sizeof\", 0x11c)\nOP(REFANYTYPE, \"refanytype\", 0x11d)\nOP(ANN_DATA, \"ann.data\", 0x122)\nOP(ANN_ARG, \"ann.arg\", 0x123)\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/include/float.h",
    "content": "#ifndef _FLOAT_H_\n#define _FLOAT_H_\n\n#define FLT_RADIX 2\n\n/* IEEE float */\n#define FLT_MANT_DIG 24\n#define FLT_DIG 6\n#define FLT_ROUNDS 1\n#define FLT_EPSILON 1.19209290e-07F\n#define FLT_MIN_EXP (-125)\n#define FLT_MIN 1.17549435e-38F\n#define FLT_MIN_10_EXP (-37)\n#define FLT_MAX_EXP 128\n#define FLT_MAX 3.40282347e+38F\n#define FLT_MAX_10_EXP 38\n\n/* IEEE double */\n#define DBL_MANT_DIG 53\n#define DBL_DIG 15\n#define DBL_EPSILON 2.2204460492503131e-16\n#define DBL_MIN_EXP (-1021)\n#define DBL_MIN 2.2250738585072014e-308\n#define DBL_MIN_10_EXP (-307)\n#define DBL_MAX_EXP 1024\n#define DBL_MAX 1.7976931348623157e+308\n#define DBL_MAX_10_EXP 308\n\n/* horrible intel long double */\n#ifdef __i386__\n\n#define LDBL_MANT_DIG 64\n#define LDBL_DIG 18\n#define LDBL_EPSILON 1.08420217248550443401e-19L\n#define LDBL_MIN_EXP (-16381)\n#define LDBL_MIN 3.36210314311209350626e-4932L\n#define LDBL_MIN_10_EXP (-4931)\n#define LDBL_MAX_EXP 16384\n#define LDBL_MAX 1.18973149535723176502e+4932L\n#define LDBL_MAX_10_EXP 4932\n\n#else\n\n/* same as IEEE double */\n#define LDBL_MANT_DIG 53\n#define LDBL_DIG 15\n#define LDBL_EPSILON 2.2204460492503131e-16\n#define LDBL_MIN_EXP (-1021)\n#define LDBL_MIN 2.2250738585072014e-308\n#define LDBL_MIN_10_EXP (-307)\n#define LDBL_MAX_EXP 1024\n#define LDBL_MAX 1.7976931348623157e+308\n#define LDBL_MAX_10_EXP 308\n\n#endif\n\n#endif /* _FLOAT_H_ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/include/stdarg.h",
    "content": "#ifndef _STDARG_H\n#define _STDARG_H\n\n#ifdef __x86_64__\n#ifndef _WIN64\n\ntypedef void *va_list;\n\nva_list __va_start(void *fp);\nvoid *__va_arg(va_list ap, int arg_type, int size);\nva_list __va_copy(va_list src);\nvoid __va_end(va_list ap);\n\n#define va_start(ap, last) ((ap) = __va_start(__builtin_frame_address(0)))\n#define va_arg(ap, type)                                                \\\n    (*(type *)(__va_arg(ap, __builtin_va_arg_types(type), sizeof(type))))\n#define va_copy(dest, src) ((dest) = __va_copy(src))\n#define va_end(ap) __va_end(ap)\n\n#else /* _WIN64 */\ntypedef char *va_list;\n#define va_start(ap,last) ap = ((char *)&(last)) + ((sizeof(last)+7)&~7)\n#define va_arg(ap,type) (ap += (sizeof(type)+7)&~7, *(type *)(ap - ((sizeof(type)+7)&~7)))\n#define va_copy(dest, src) (dest) = (src)\n#define va_end(ap)\n#endif\n\n#else /* __i386__ */\ntypedef char *va_list;\n/* only correct for i386 */\n#define va_start(ap,last) ap = ((char *)&(last)) + ((sizeof(last)+3)&~3)\n#define va_arg(ap,type) (ap += (sizeof(type)+3)&~3, *(type *)(ap - ((sizeof(type)+3)&~3)))\n#define va_copy(dest, src) (dest) = (src)\n#define va_end(ap)\n#endif\n\n/* fix a buggy dependency on GCC in libio.h */\ntypedef va_list __gnuc_va_list;\n#define _VA_LIST_DEFINED\n\n#endif /* _STDARG_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/include/stdbool.h",
    "content": "#ifndef _STDBOOL_H\n#define _STDBOOL_H\n\n/* ISOC99 boolean */\n\n#define bool\t_Bool\n#define true\t1\n#define false\t0\n\n#endif /* _STDBOOL_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/include/stddef.h",
    "content": "#ifndef _STDDEF_H\n#define _STDDEF_H\n\ntypedef __SIZE_TYPE__ size_t;\ntypedef __PTRDIFF_TYPE__ ssize_t;\ntypedef __WCHAR_TYPE__ wchar_t;\ntypedef __PTRDIFF_TYPE__ ptrdiff_t;\ntypedef __PTRDIFF_TYPE__ intptr_t;\ntypedef __SIZE_TYPE__ uintptr_t;\n\n#ifndef __int8_t_defined\n#define __int8_t_defined\ntypedef signed char int8_t;\ntypedef signed short int int16_t;\ntypedef signed int int32_t;\ntypedef signed long long int int64_t;\ntypedef unsigned char uint8_t;\ntypedef unsigned short int uint16_t;\ntypedef unsigned int uint32_t;\ntypedef unsigned long long int uint64_t;\n#endif\n\n#define NULL ((void*)0)\n#define offsetof(type, field) ((size_t)&((type *)0)->field)\n\nvoid *alloca(size_t size);\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/include/tcclib.h",
    "content": "/* Simple libc header for TCC \n * \n * Add any function you want from the libc there. This file is here\n * only for your convenience so that you do not need to put the whole\n * glibc include files on your floppy disk \n */\n#ifndef _TCCLIB_H\n#define _TCCLIB_H\n\n#include <stddef.h>\n#include <stdarg.h>\n\n/* stdlib.h */\nvoid *calloc(size_t nmemb, size_t size);\nvoid *malloc(size_t size);\nvoid free(void *ptr);\nvoid *realloc(void *ptr, size_t size);\nint atoi(const char *nptr);\nlong int strtol(const char *nptr, char **endptr, int base);\nunsigned long int strtoul(const char *nptr, char **endptr, int base);\nvoid exit(int);\n\n/* stdio.h */\ntypedef struct __FILE FILE;\n#define EOF (-1)\nextern FILE *stdin;\nextern FILE *stdout;\nextern FILE *stderr;\nFILE *fopen(const char *path, const char *mode);\nFILE *fdopen(int fildes, const char *mode);\nFILE *freopen(const  char *path, const char *mode, FILE *stream);\nint fclose(FILE *stream);\nsize_t  fread(void *ptr, size_t size, size_t nmemb, FILE *stream);\nsize_t  fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);\nint fgetc(FILE *stream);\nchar *fgets(char *s, int size, FILE *stream);\nint getc(FILE *stream);\nint getchar(void);\nchar *gets(char *s);\nint ungetc(int c, FILE *stream);\nint fflush(FILE *stream);\n\nint printf(const char *format, ...);\nint fprintf(FILE *stream, const char *format, ...);\nint sprintf(char *str, const char *format, ...);\nint snprintf(char *str, size_t size, const  char  *format, ...);\nint asprintf(char **strp, const char *format, ...);\nint dprintf(int fd, const char *format, ...);\nint vprintf(const char *format, va_list ap);\nint vfprintf(FILE  *stream,  const  char *format, va_list ap);\nint vsprintf(char *str, const char *format, va_list ap);\nint vsnprintf(char *str, size_t size, const char  *format, va_list ap);\nint vasprintf(char  **strp,  const  char *format, va_list ap);\nint vdprintf(int fd, const char *format, va_list ap);\n\nvoid perror(const char *s);\n\n/* string.h */\nchar *strcat(char *dest, const char *src);\nchar *strchr(const char *s, int c);\nchar *strrchr(const char *s, int c);\nchar *strcpy(char *dest, const char *src);\nvoid *memcpy(void *dest, const void *src, size_t n);\nvoid *memmove(void *dest, const void *src, size_t n);\nvoid *memset(void *s, int c, size_t n);\nchar *strdup(const char *s);\n\n/* dlfcn.h */\n#define RTLD_LAZY       0x001\n#define RTLD_NOW        0x002\n#define RTLD_GLOBAL     0x100\n\nvoid *dlopen(const char *filename, int flag);\nconst char *dlerror(void);\nvoid *dlsym(void *handle, char *symbol);\nint dlclose(void *handle);\n\n#endif /* _TCCLIB_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/include/varargs.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _VARARGS_H\n#define _VARARGS_H\n\n#error \"TinyCC no longer implements <varargs.h>.\"\n#error \"Revise your code to use <stdarg.h>.\"\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/lib/Makefile",
    "content": "#\n# Tiny C Compiler Makefile for libtcc1.a\n#\n\nTOP = ..\ninclude $(TOP)/Makefile\nVPATH = $(top_srcdir)/lib $(top_srcdir)/win32/lib\n\nifndef TARGET\n ifdef CONFIG_WIN64\n  TARGET = x86_64-win32\n else\n ifdef CONFIG_WIN32\n  TARGET = i386-win32\n else\n ifeq ($(ARCH),i386)\n  TARGET = i386\n  ifneq ($(TARGETOS),Darwin)\n   XCC = $(CC)\n  endif\n else\n ifeq ($(ARCH),x86-64)\n  TARGET = x86_64\n  ifneq ($(TARGETOS),Darwin)\n   XCC = $(CC)\n  endif\n endif\n endif\n endif\n endif\n BCHECK_O = bcheck.o\nendif\n\nDIR = $(TARGET)\n\nnative : ../libtcc1.a\ncross : $(DIR)/libtcc1.a\n\nnative : TCC = $(TOP)/tcc$(EXESUF)\ncross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF)\n\nI386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O)\nX86_64_O = libtcc1.o alloca86_64.o\nWIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o\nWIN64_O = $(X86_64_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o\n\nifeq \"$(TARGET)\" \"i386-win32\"\n OBJ = $(addprefix $(DIR)/,$(WIN32_O))\n TGT = -DTCC_TARGET_I386 -DTCC_TARGET_PE\n XCC = $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/include\n XAR = $(DIR)/tiny_libmaker$(EXESUF)\nelse\nifeq \"$(TARGET)\" \"x86_64-win32\"\n OBJ = $(addprefix $(DIR)/,$(WIN64_O))\n TGT = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE\n XCC = $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/include\n XAR = $(DIR)/tiny_libmaker$(EXESUF)\nelse\nifeq \"$(TARGET)\" \"i386\"\n OBJ = $(addprefix $(DIR)/,$(I386_O))\n TGT = -DTCC_TARGET_I386\n XCC ?= $(TCC) -B$(TOP)\nelse\nifeq \"$(TARGET)\" \"x86_64\"\n OBJ = $(addprefix $(DIR)/,$(X86_64_O))\n TGT = -DTCC_TARGET_X86_64\n XCC ?= $(TCC) -B$(TOP)\nelse\n $(error libtcc1.a not supported on target '$(TARGET)')\nendif\nendif\nendif\nendif\n\nXFLAGS = $(CPPFLAGS) $(CFLAGS) $(TGT)\n\nifeq ($(TARGETOS),Darwin)\n XAR = $(DIR)/tiny_libmaker$(EXESUF)\n XFLAGS += -D_ANSI_SOURCE\n BCHECK_O =\nendif\n\nifdef XAR\nAR = $(XAR)\nendif\n\n$(DIR)/libtcc1.a ../libtcc1.a : $(OBJ) $(XAR)\n\t$(AR) rcs $@ $(OBJ)\n$(DIR)/%.o : %.c\n\t$(XCC) -c $< -o $@ $(XFLAGS)\n$(DIR)/%.o : %.S\n\t$(XCC) -c $< -o $@ $(XFLAGS)\n$(DIR)/%$(EXESUF) : $(TOP)/win32/tools/%.c\n\t$(CC) -o $@ $< $(XFLAGS) $(LDFLAGS)\n\n$(OBJ) $(XAR) : $(DIR)/exists\n$(DIR)/exists :\n\tmkdir -p $(DIR)\n\t@echo $@ > $@\n\nclean :\n\trm -rfv i386-win32 x86_64-win32 i386 x86_64\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/lib/alloca86-bt.S",
    "content": "/* ---------------------------------------------- */\n/* alloca86-bt.S */\n\n.globl __bound_alloca\n\n__bound_alloca:\n    pop     %edx\n    pop     %eax\n    mov     %eax, %ecx\n    add     $3,%eax\n    and     $-4,%eax\n    jz      p6\n\n#ifdef TCC_TARGET_PE\np4:\n    cmp     $4096,%eax\n    jle     p5\n    sub     $4096,%esp\n    sub     $4096,%eax\n    test    %eax,(%esp)\n    jmp p4\n\np5:\n#endif\n\n    sub     %eax,%esp\n    mov     %esp,%eax\n\n    push    %edx\n    push    %eax\n    push    %ecx\n    push    %eax\n    call   __bound_new_region\n    add    $8, %esp\n    pop     %eax\n    pop     %edx\n\np6:\n    push    %edx\n    push    %edx\n    ret\n\n/* mark stack as nonexecutable */\n#if defined __ELF__ && defined __linux__\n    .section    .note.GNU-stack,\"\",@progbits\n#endif\n/* ---------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/lib/alloca86.S",
    "content": "/* ---------------------------------------------- */\n/* alloca86.S */\n\n.globl alloca\n\nalloca:\n    pop     %edx\n    pop     %eax\n    add     $3,%eax\n    and     $-4,%eax\n    jz      p3\n\n#ifdef TCC_TARGET_PE\np1:\n    cmp     $4096,%eax\n    jle     p2\n    sub     $4096,%esp\n    sub     $4096,%eax\n    test    %eax,(%esp)\n    jmp p1\np2:\n#endif\n\n    sub     %eax,%esp\n    mov     %esp,%eax\np3:\n    push    %edx\n    push    %edx\n    ret\n\n/* mark stack as nonexecutable */\n#if defined __ELF__ && defined __linux__\n    .section    .note.GNU-stack,\"\",@progbits\n#endif\n/* ---------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/lib/alloca86_64.S",
    "content": "/* ---------------------------------------------- */\n/* alloca86_64.S */\n\n.globl alloca\n\nalloca:\n    pop     %rdx\n#ifdef TCC_TARGET_PE\n    mov     %rcx,%rax\n#else\n    mov     %rdi,%rax\n#endif\n    add     $15,%rax\n    and     $-16,%rax\n    jz      p3\n\n#ifdef TCC_TARGET_PE\np1:\n    cmp     $4096,%rax\n    jle     p2\n    sub     $4096,%rsp\n    sub     $4096,%rax\n    test    %rax,(%rsp)\n    jmp p1\np2:\n#endif\n\n    sub     %rax,%rsp\n    mov     %rsp,%rax\n#ifdef TCC_TARGET_PE\n    add     $32,%rax\n#endif\n\np3:\n    push    %rdx\n    ret\n\n/* mark stack as nonexecutable */\n#if defined __ELF__ && defined __linux__\n    .section    .note.GNU-stack,\"\",@progbits\n#endif\n/* ---------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/lib/bcheck.c",
    "content": "/*\n *  Tiny C Memory and bounds checker\n * \n *  Copyright (c) 2002 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n#if !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) \\\n    && !defined(__DragonFly__) && !defined(__OpenBSD__)\n#include <malloc.h>\n#endif\n#if !defined(_WIN32)\n#include <unistd.h>\n#endif\n\n//#define BOUND_DEBUG\n\n/* define so that bound array is static (faster, but use memory if\n   bound checking not used) */\n//#define BOUND_STATIC\n\n/* use malloc hooks. Currently the code cannot be reliable if no hooks */\n#define CONFIG_TCC_MALLOC_HOOKS\n#define HAVE_MEMALIGN\n\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \\\n    || defined(__DragonFly__) || defined(__dietlibc__) \\\n    || defined(__UCLIBC__) || defined(__OpenBSD__) \\\n    || defined(_WIN32) || defined(TCC_UCLIBC)\n#warning Bound checking does not support malloc (etc.) in this environment.\n#undef CONFIG_TCC_MALLOC_HOOKS\n#undef HAVE_MEMALIGN\n#endif\n\n#define BOUND_T1_BITS 13\n#define BOUND_T2_BITS 11\n#define BOUND_T3_BITS (32 - BOUND_T1_BITS - BOUND_T2_BITS)\n\n#define BOUND_T1_SIZE (1 << BOUND_T1_BITS)\n#define BOUND_T2_SIZE (1 << BOUND_T2_BITS)\n#define BOUND_T3_SIZE (1 << BOUND_T3_BITS)\n#define BOUND_E_BITS  4\n\n#define BOUND_T23_BITS (BOUND_T2_BITS + BOUND_T3_BITS)\n#define BOUND_T23_SIZE (1 << BOUND_T23_BITS)\n\n\n/* this pointer is generated when bound check is incorrect */\n#define INVALID_POINTER ((void *)(-2))\n/* size of an empty region */\n#define EMPTY_SIZE        0xffffffff\n/* size of an invalid region */\n#define INVALID_SIZE      0\n\ntypedef struct BoundEntry {\n    unsigned long start;\n    unsigned long size;\n    struct BoundEntry *next;\n    unsigned long is_invalid; /* true if pointers outside region are invalid */\n} BoundEntry;\n\n/* external interface */\nvoid __bound_init(void);\nvoid __bound_new_region(void *p, unsigned long size);\nint __bound_delete_region(void *p);\n\n#define FASTCALL __attribute__((regparm(3)))\n\nvoid *__bound_malloc(size_t size, const void *caller);\nvoid *__bound_memalign(size_t size, size_t align, const void *caller);\nvoid __bound_free(void *ptr, const void *caller);\nvoid *__bound_realloc(void *ptr, size_t size, const void *caller);\nstatic void *libc_malloc(size_t size);\nstatic void libc_free(void *ptr);\nstatic void install_malloc_hooks(void);\nstatic void restore_malloc_hooks(void);\n\n#ifdef CONFIG_TCC_MALLOC_HOOKS\nstatic void *saved_malloc_hook;\nstatic void *saved_free_hook;\nstatic void *saved_realloc_hook;\nstatic void *saved_memalign_hook;\n#endif\n\n/* TCC definitions */\nextern char __bounds_start; /* start of static bounds table */\n/* error message, just for TCC */\nconst char *__bound_error_msg;\n\n/* runtime error output */\nextern void rt_error(unsigned long pc, const char *fmt, ...);\n\n#ifdef BOUND_STATIC\nstatic BoundEntry *__bound_t1[BOUND_T1_SIZE]; /* page table */\n#else\nstatic BoundEntry **__bound_t1; /* page table */\n#endif\nstatic BoundEntry *__bound_empty_t2;   /* empty page, for unused pages */\nstatic BoundEntry *__bound_invalid_t2; /* invalid page, for invalid pointers */\n\nstatic BoundEntry *__bound_find_region(BoundEntry *e1, void *p)\n{\n    unsigned long addr, tmp;\n    BoundEntry *e;\n\n    e = e1;\n    while (e != NULL) {\n        addr = (unsigned long)p;\n        addr -= e->start;\n        if (addr <= e->size) {\n            /* put region at the head */\n            tmp = e1->start;\n            e1->start = e->start;\n            e->start = tmp;\n            tmp = e1->size;\n            e1->size = e->size;\n            e->size = tmp;\n            return e1;\n        }\n        e = e->next;\n    }\n    /* no entry found: return empty entry or invalid entry */\n    if (e1->is_invalid)\n        return __bound_invalid_t2;\n    else\n        return __bound_empty_t2;\n}\n\n/* print a bound error message */\nstatic void bound_error(const char *fmt, ...)\n{\n    __bound_error_msg = fmt;\n    *(int *)0 = 0; /* force a runtime error */\n}\n\nstatic void bound_alloc_error(void)\n{\n    bound_error(\"not enough memory for bound checking code\");\n}\n\n/* return '(p + offset)' for pointer arithmetic (a pointer can reach\n   the end of a region in this case */\nvoid * FASTCALL __bound_ptr_add(void *p, int offset)\n{\n    unsigned long addr = (unsigned long)p;\n    BoundEntry *e;\n#if defined(BOUND_DEBUG)\n    printf(\"add: 0x%x %d\\n\", (int)p, offset);\n#endif\n\n    e = __bound_t1[addr >> (BOUND_T2_BITS + BOUND_T3_BITS)];\n    e = (BoundEntry *)((char *)e + \n                       ((addr >> (BOUND_T3_BITS - BOUND_E_BITS)) & \n                        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS)));\n    addr -= e->start;\n    if (addr > e->size) {\n        e = __bound_find_region(e, p);\n        addr = (unsigned long)p - e->start;\n    }\n    addr += offset;\n    if (addr > e->size)\n        return INVALID_POINTER; /* return an invalid pointer */\n    return p + offset;\n}\n\n/* return '(p + offset)' for pointer indirection (the resulting must\n   be strictly inside the region */\n#define BOUND_PTR_INDIR(dsize)                                          \\\nvoid * FASTCALL __bound_ptr_indir ## dsize (void *p, int offset)        \\\n{                                                                       \\\n    unsigned long addr = (unsigned long)p;                              \\\n    BoundEntry *e;                                                      \\\n                                                                        \\\n    e = __bound_t1[addr >> (BOUND_T2_BITS + BOUND_T3_BITS)];            \\\n    e = (BoundEntry *)((char *)e +                                      \\\n                       ((addr >> (BOUND_T3_BITS - BOUND_E_BITS)) &      \\\n                        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS)));        \\\n    addr -= e->start;                                                   \\\n    if (addr > e->size) {                                               \\\n        e = __bound_find_region(e, p);                                  \\\n        addr = (unsigned long)p - e->start;                             \\\n    }                                                                   \\\n    addr += offset + dsize;                                             \\\n    if (addr > e->size)                                                 \\\n        return INVALID_POINTER; /* return an invalid pointer */         \\\n    return p + offset;                                                  \\\n}\n\nBOUND_PTR_INDIR(1)\nBOUND_PTR_INDIR(2)\nBOUND_PTR_INDIR(4)\nBOUND_PTR_INDIR(8)\nBOUND_PTR_INDIR(12)\nBOUND_PTR_INDIR(16)\n\n/* return the frame pointer of the caller */\n#define GET_CALLER_FP(fp)\\\n{\\\n    fp = (unsigned long)__builtin_frame_address(1);\\\n}\n\n/* called when entering a function to add all the local regions */\nvoid FASTCALL __bound_local_new(void *p1) \n{\n    unsigned long addr, size, fp, *p = p1;\n    GET_CALLER_FP(fp);\n    for(;;) {\n        addr = p[0];\n        if (addr == 0)\n            break;\n        addr += fp;\n        size = p[1];\n        p += 2;\n        __bound_new_region((void *)addr, size);\n    }\n}\n\n/* called when leaving a function to delete all the local regions */\nvoid FASTCALL __bound_local_delete(void *p1) \n{\n    unsigned long addr, fp, *p = p1;\n    GET_CALLER_FP(fp);\n    for(;;) {\n        addr = p[0];\n        if (addr == 0)\n            break;\n        addr += fp;\n        p += 2;\n        __bound_delete_region((void *)addr);\n    }\n}\n\nstatic BoundEntry *__bound_new_page(void)\n{\n    BoundEntry *page;\n    int i;\n\n    page = libc_malloc(sizeof(BoundEntry) * BOUND_T2_SIZE);\n    if (!page)\n        bound_alloc_error();\n    for(i=0;i<BOUND_T2_SIZE;i++) {\n        /* put empty entries */\n        page[i].start = 0;\n        page[i].size = EMPTY_SIZE;\n        page[i].next = NULL;\n        page[i].is_invalid = 0;\n    }\n    return page;\n}\n\n/* currently we use malloc(). Should use bound_new_page() */\nstatic BoundEntry *bound_new_entry(void)\n{\n    BoundEntry *e;\n    e = libc_malloc(sizeof(BoundEntry));\n    return e;\n}\n\nstatic void bound_free_entry(BoundEntry *e)\n{\n    libc_free(e);\n}\n\nstatic inline BoundEntry *get_page(int index)\n{\n    BoundEntry *page;\n    page = __bound_t1[index];\n    if (page == __bound_empty_t2 || page == __bound_invalid_t2) {\n        /* create a new page if necessary */\n        page = __bound_new_page();\n        __bound_t1[index] = page;\n    }\n    return page;\n}\n\n/* mark a region as being invalid (can only be used during init) */\nstatic void mark_invalid(unsigned long addr, unsigned long size)\n{\n    unsigned long start, end;\n    BoundEntry *page;\n    int t1_start, t1_end, i, j, t2_start, t2_end;\n\n    start = addr;\n    end = addr + size;\n\n    t2_start = (start + BOUND_T3_SIZE - 1) >> BOUND_T3_BITS;\n    if (end != 0)\n        t2_end = end >> BOUND_T3_BITS;\n    else\n        t2_end = 1 << (BOUND_T1_BITS + BOUND_T2_BITS);\n\n#if 0\n    printf(\"mark_invalid: start = %x %x\\n\", t2_start, t2_end);\n#endif\n    \n    /* first we handle full pages */\n    t1_start = (t2_start + BOUND_T2_SIZE - 1) >> BOUND_T2_BITS;\n    t1_end = t2_end >> BOUND_T2_BITS;\n\n    i = t2_start & (BOUND_T2_SIZE - 1);\n    j = t2_end & (BOUND_T2_SIZE - 1);\n    \n    if (t1_start == t1_end) {\n        page = get_page(t2_start >> BOUND_T2_BITS);\n        for(; i < j; i++) {\n            page[i].size = INVALID_SIZE;\n            page[i].is_invalid = 1;\n        }\n    } else {\n        if (i > 0) {\n            page = get_page(t2_start >> BOUND_T2_BITS);\n            for(; i < BOUND_T2_SIZE; i++) {\n                page[i].size = INVALID_SIZE;\n                page[i].is_invalid = 1;\n            }\n        }\n        for(i = t1_start; i < t1_end; i++) {\n            __bound_t1[i] = __bound_invalid_t2;\n        }\n        if (j != 0) {\n            page = get_page(t1_end);\n            for(i = 0; i < j; i++) {\n                page[i].size = INVALID_SIZE;\n                page[i].is_invalid = 1;\n            }\n        }\n    }\n}\n\nvoid __bound_init(void)\n{\n    int i;\n    BoundEntry *page;\n    unsigned long start, size;\n    int *p;\n\n    /* save malloc hooks and install bound check hooks */\n    install_malloc_hooks();\n\n#ifndef BOUND_STATIC\n    __bound_t1 = libc_malloc(BOUND_T1_SIZE * sizeof(BoundEntry *));\n    if (!__bound_t1)\n        bound_alloc_error();\n#endif\n    __bound_empty_t2 = __bound_new_page();\n    for(i=0;i<BOUND_T1_SIZE;i++) {\n        __bound_t1[i] = __bound_empty_t2;\n    }\n\n    page = __bound_new_page();\n    for(i=0;i<BOUND_T2_SIZE;i++) {\n        /* put invalid entries */\n        page[i].start = 0;\n        page[i].size = INVALID_SIZE;\n        page[i].next = NULL;\n        page[i].is_invalid = 1;\n    }\n    __bound_invalid_t2 = page;\n\n    /* invalid pointer zone */\n    start = (unsigned long)INVALID_POINTER & ~(BOUND_T23_SIZE - 1);\n    size = BOUND_T23_SIZE;\n    mark_invalid(start, size);\n\n#if defined(CONFIG_TCC_MALLOC_HOOKS)\n    /* malloc zone is also marked invalid. can only use that with\n     * hooks because all libs should use the same malloc. The solution\n     * would be to build a new malloc for tcc.\n     *\n     * usually heap (= malloc zone) comes right after bss, i.e. after _end, but\n     * not always - either if we are running from under `tcc -b -run`, or if\n     * address space randomization is turned on(a), heap start will be separated\n     * from bss end.\n     *\n     * So sbrk(0) will be a good approximation for start_brk:\n     *\n     *   - if we are a separately compiled program, __bound_init() runs early,\n     *     and sbrk(0) should be equal or very near to start_brk(b) (in case other\n     *     constructors malloc something), or\n     *\n     *   - if we are running from under `tcc -b -run`, sbrk(0) will return\n     *     start of heap portion which is under this program control, and not\n     *     mark as invalid earlier allocated memory.\n     *\n     *\n     * (a) /proc/sys/kernel/randomize_va_space = 2, on Linux;\n     *     usually turned on by default.\n     *\n     * (b) on Linux >= v3.3, the alternative is to read\n     *     start_brk from /proc/self/stat\n     */\n    start = (unsigned long)sbrk(0);\n    size = 128 * 0x100000;\n    mark_invalid(start, size);\n#endif\n\n    /* add all static bound check values */\n    p = (int *)&__bounds_start;\n    while (p[0] != 0) {\n        __bound_new_region((void *)p[0], p[1]);\n        p += 2;\n    }\n}\n\nvoid __bound_exit(void)\n{\n    restore_malloc_hooks();\n}\n\nstatic inline void add_region(BoundEntry *e, \n                              unsigned long start, unsigned long size)\n{\n    BoundEntry *e1;\n    if (e->start == 0) {\n        /* no region : add it */\n        e->start = start;\n        e->size = size;\n    } else {\n        /* already regions in the list: add it at the head */\n        e1 = bound_new_entry();\n        e1->start = e->start;\n        e1->size = e->size;\n        e1->next = e->next;\n        e->start = start;\n        e->size = size;\n        e->next = e1;\n    }\n}\n\n/* create a new region. It should not already exist in the region list */\nvoid __bound_new_region(void *p, unsigned long size)\n{\n    unsigned long start, end;\n    BoundEntry *page, *e, *e2;\n    int t1_start, t1_end, i, t2_start, t2_end;\n\n    start = (unsigned long)p;\n    end = start + size;\n    t1_start = start >> (BOUND_T2_BITS + BOUND_T3_BITS);\n    t1_end = end >> (BOUND_T2_BITS + BOUND_T3_BITS);\n\n    /* start */\n    page = get_page(t1_start);\n    t2_start = (start >> (BOUND_T3_BITS - BOUND_E_BITS)) & \n        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS);\n    t2_end = (end >> (BOUND_T3_BITS - BOUND_E_BITS)) & \n        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS);\n#ifdef BOUND_DEBUG\n    printf(\"new %lx %lx %x %x %x %x\\n\", \n           start, end, t1_start, t1_end, t2_start, t2_end);\n#endif\n\n    e = (BoundEntry *)((char *)page + t2_start);\n    add_region(e, start, size);\n\n    if (t1_end == t1_start) {\n        /* same ending page */\n        e2 = (BoundEntry *)((char *)page + t2_end);\n        if (e2 > e) {\n            e++;\n            for(;e<e2;e++) {\n                e->start = start;\n                e->size = size;\n            }\n            add_region(e, start, size);\n        }\n    } else {\n        /* mark until end of page */\n        e2 = page + BOUND_T2_SIZE;\n        e++;\n        for(;e<e2;e++) {\n            e->start = start;\n            e->size = size;\n        }\n        /* mark intermediate pages, if any */\n        for(i=t1_start+1;i<t1_end;i++) {\n            page = get_page(i);\n            e2 = page + BOUND_T2_SIZE;\n            for(e=page;e<e2;e++) {\n                e->start = start;\n                e->size = size;\n            }\n        }\n        /* last page */\n        page = get_page(t1_end);\n        e2 = (BoundEntry *)((char *)page + t2_end);\n        for(e=page;e<e2;e++) {\n            e->start = start;\n            e->size = size;\n        }\n        add_region(e, start, size);\n    }\n}\n\n/* delete a region */\nstatic inline void delete_region(BoundEntry *e, \n                                 void *p, unsigned long empty_size)\n{\n    unsigned long addr;\n    BoundEntry *e1;\n\n    addr = (unsigned long)p;\n    addr -= e->start;\n    if (addr <= e->size) {\n        /* region found is first one */\n        e1 = e->next;\n        if (e1 == NULL) {\n            /* no more region: mark it empty */\n            e->start = 0;\n            e->size = empty_size;\n        } else {\n            /* copy next region in head */\n            e->start = e1->start;\n            e->size = e1->size;\n            e->next = e1->next;\n            bound_free_entry(e1);\n        }\n    } else {\n        /* find the matching region */\n        for(;;) {\n            e1 = e;\n            e = e->next;\n            /* region not found: do nothing */\n            if (e == NULL)\n                break;\n            addr = (unsigned long)p - e->start;\n            if (addr <= e->size) {\n                /* found: remove entry */\n                e1->next = e->next;\n                bound_free_entry(e);\n                break;\n            }\n        }\n    }\n}\n\n/* WARNING: 'p' must be the starting point of the region. */\n/* return non zero if error */\nint __bound_delete_region(void *p)\n{\n    unsigned long start, end, addr, size, empty_size;\n    BoundEntry *page, *e, *e2;\n    int t1_start, t1_end, t2_start, t2_end, i;\n\n    start = (unsigned long)p;\n    t1_start = start >> (BOUND_T2_BITS + BOUND_T3_BITS);\n    t2_start = (start >> (BOUND_T3_BITS - BOUND_E_BITS)) & \n        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS);\n    \n    /* find region size */\n    page = __bound_t1[t1_start];\n    e = (BoundEntry *)((char *)page + t2_start);\n    addr = start - e->start;\n    if (addr > e->size)\n        e = __bound_find_region(e, p);\n    /* test if invalid region */\n    if (e->size == EMPTY_SIZE || (unsigned long)p != e->start) \n        return -1;\n    /* compute the size we put in invalid regions */\n    if (e->is_invalid)\n        empty_size = INVALID_SIZE;\n    else\n        empty_size = EMPTY_SIZE;\n    size = e->size;\n    end = start + size;\n\n    /* now we can free each entry */\n    t1_end = end >> (BOUND_T2_BITS + BOUND_T3_BITS);\n    t2_end = (end >> (BOUND_T3_BITS - BOUND_E_BITS)) & \n        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS);\n\n    delete_region(e, p, empty_size);\n    if (t1_end == t1_start) {\n        /* same ending page */\n        e2 = (BoundEntry *)((char *)page + t2_end);\n        if (e2 > e) {\n            e++;\n            for(;e<e2;e++) {\n                e->start = 0;\n                e->size = empty_size;\n            }\n            delete_region(e, p, empty_size);\n        }\n    } else {\n        /* mark until end of page */\n        e2 = page + BOUND_T2_SIZE;\n        e++;\n        for(;e<e2;e++) {\n            e->start = 0;\n            e->size = empty_size;\n        }\n        /* mark intermediate pages, if any */\n        /* XXX: should free them */\n        for(i=t1_start+1;i<t1_end;i++) {\n            page = get_page(i);\n            e2 = page + BOUND_T2_SIZE;\n            for(e=page;e<e2;e++) {\n                e->start = 0;\n                e->size = empty_size;\n            }\n        }\n        /* last page */\n        page = get_page(t1_end);\n        e2 = (BoundEntry *)((char *)page + t2_end);\n        for(e=page;e<e2;e++) {\n            e->start = 0;\n            e->size = empty_size;\n        }\n        delete_region(e, p, empty_size);\n    }\n    return 0;\n}\n\n/* return the size of the region starting at p, or EMPTY_SIZE if non\n   existant region. */\nstatic unsigned long get_region_size(void *p)\n{\n    unsigned long addr = (unsigned long)p;\n    BoundEntry *e;\n\n    e = __bound_t1[addr >> (BOUND_T2_BITS + BOUND_T3_BITS)];\n    e = (BoundEntry *)((char *)e + \n                       ((addr >> (BOUND_T3_BITS - BOUND_E_BITS)) & \n                        ((BOUND_T2_SIZE - 1) << BOUND_E_BITS)));\n    addr -= e->start;\n    if (addr > e->size)\n        e = __bound_find_region(e, p);\n    if (e->start != (unsigned long)p)\n        return EMPTY_SIZE;\n    return e->size;\n}\n\n/* patched memory functions */\n\n/* force compiler to perform stores coded up to this point */\n#define barrier()   __asm__ __volatile__ (\"\": : : \"memory\")\n\nstatic void install_malloc_hooks(void)\n{\n#ifdef CONFIG_TCC_MALLOC_HOOKS\n    saved_malloc_hook = __malloc_hook;\n    saved_free_hook = __free_hook;\n    saved_realloc_hook = __realloc_hook;\n    saved_memalign_hook = __memalign_hook;\n    __malloc_hook = __bound_malloc;\n    __free_hook = __bound_free;\n    __realloc_hook = __bound_realloc;\n    __memalign_hook = __bound_memalign;\n\n    barrier();\n#endif\n}\n\nstatic void restore_malloc_hooks(void)\n{\n#ifdef CONFIG_TCC_MALLOC_HOOKS\n    __malloc_hook = saved_malloc_hook;\n    __free_hook = saved_free_hook;\n    __realloc_hook = saved_realloc_hook;\n    __memalign_hook = saved_memalign_hook;\n\n    barrier();\n#endif\n}\n\nstatic void *libc_malloc(size_t size)\n{\n    void *ptr;\n    restore_malloc_hooks();\n    ptr = malloc(size);\n    install_malloc_hooks();\n    return ptr;\n}\n\nstatic void libc_free(void *ptr)\n{\n    restore_malloc_hooks();\n    free(ptr);\n    install_malloc_hooks();\n}\n\n/* XXX: we should use a malloc which ensure that it is unlikely that\n   two malloc'ed data have the same address if 'free' are made in\n   between. */\nvoid *__bound_malloc(size_t size, const void *caller)\n{\n    void *ptr;\n    \n    /* we allocate one more byte to ensure the regions will be\n       separated by at least one byte. With the glibc malloc, it may\n       be in fact not necessary */\n    ptr = libc_malloc(size + 1);\n    \n    if (!ptr)\n        return NULL;\n    __bound_new_region(ptr, size);\n    return ptr;\n}\n\nvoid *__bound_memalign(size_t size, size_t align, const void *caller)\n{\n    void *ptr;\n\n    restore_malloc_hooks();\n\n#ifndef HAVE_MEMALIGN\n    if (align > 4) {\n        /* XXX: handle it ? */\n        ptr = NULL;\n    } else {\n        /* we suppose that malloc aligns to at least four bytes */\n        ptr = malloc(size + 1);\n    }\n#else\n    /* we allocate one more byte to ensure the regions will be\n       separated by at least one byte. With the glibc malloc, it may\n       be in fact not necessary */\n    ptr = memalign(size + 1, align);\n#endif\n    \n    install_malloc_hooks();\n    \n    if (!ptr)\n        return NULL;\n    __bound_new_region(ptr, size);\n    return ptr;\n}\n\nvoid __bound_free(void *ptr, const void *caller)\n{\n    if (ptr == NULL)\n        return;\n    if (__bound_delete_region(ptr) != 0)\n        bound_error(\"freeing invalid region\");\n\n    libc_free(ptr);\n}\n\nvoid *__bound_realloc(void *ptr, size_t size, const void *caller)\n{\n    void *ptr1;\n    int old_size;\n\n    if (size == 0) {\n        __bound_free(ptr, caller);\n        return NULL;\n    } else {\n        ptr1 = __bound_malloc(size, caller);\n        if (ptr == NULL || ptr1 == NULL)\n            return ptr1;\n        old_size = get_region_size(ptr);\n        if (old_size == EMPTY_SIZE)\n            bound_error(\"realloc'ing invalid pointer\");\n        memcpy(ptr1, ptr, old_size);\n        __bound_free(ptr, caller);\n        return ptr1;\n    }\n}\n\n#ifndef CONFIG_TCC_MALLOC_HOOKS\nvoid *__bound_calloc(size_t nmemb, size_t size)\n{\n    void *ptr;\n    size = size * nmemb;\n    ptr = __bound_malloc(size, NULL);\n    if (!ptr)\n        return NULL;\n    memset(ptr, 0, size);\n    return ptr;\n}\n#endif\n\n#if 0\nstatic void bound_dump(void)\n{\n    BoundEntry *page, *e;\n    int i, j;\n\n    printf(\"region dump:\\n\");\n    for(i=0;i<BOUND_T1_SIZE;i++) {\n        page = __bound_t1[i];\n        for(j=0;j<BOUND_T2_SIZE;j++) {\n            e = page + j;\n            /* do not print invalid or empty entries */\n            if (e->size != EMPTY_SIZE && e->start != 0) {\n                printf(\"%08x:\", \n                       (i << (BOUND_T2_BITS + BOUND_T3_BITS)) + \n                       (j << BOUND_T3_BITS));\n                do {\n                    printf(\" %08lx:%08lx\", e->start, e->start + e->size);\n                    e = e->next;\n                } while (e != NULL);\n                printf(\"\\n\");\n            }\n        }\n    }\n}\n#endif\n\n/* some useful checked functions */\n\n/* check that (p ... p + size - 1) lies inside 'p' region, if any */\nstatic void __bound_check(const void *p, size_t size)\n{\n    if (size == 0)\n        return;\n    p = __bound_ptr_add((void *)p, size);\n    if (p == INVALID_POINTER)\n        bound_error(\"invalid pointer\");\n}\n\nvoid *__bound_memcpy(void *dst, const void *src, size_t size)\n{\n    __bound_check(dst, size);\n    __bound_check(src, size);\n    /* check also region overlap */\n    if (src >= dst && src < dst + size)\n        bound_error(\"overlapping regions in memcpy()\");\n    return memcpy(dst, src, size);\n}\n\nvoid *__bound_memmove(void *dst, const void *src, size_t size)\n{\n    __bound_check(dst, size);\n    __bound_check(src, size);\n    return memmove(dst, src, size);\n}\n\nvoid *__bound_memset(void *dst, int c, size_t size)\n{\n    __bound_check(dst, size);\n    return memset(dst, c, size);\n}\n\n/* XXX: could be optimized */\nint __bound_strlen(const char *s)\n{\n    const char *p;\n    int len;\n\n    len = 0;\n    for(;;) {\n        p = __bound_ptr_indir1((char *)s, len);\n        if (p == INVALID_POINTER)\n            bound_error(\"bad pointer in strlen()\");\n        if (*p == '\\0')\n            break;\n        len++;\n    }\n    return len;\n}\n\nchar *__bound_strcpy(char *dst, const char *src)\n{\n    int len;\n    len = __bound_strlen(src);\n    return __bound_memcpy(dst, src, len + 1);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/lib/libtcc1.c",
    "content": "/* TCC runtime library. \n   Parts of this code are (c) 2002 Fabrice Bellard \n\n   Copyright (C) 1987, 1988, 1992, 1994, 1995 Free Software Foundation, Inc.\n\nThis file is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2, or (at your option) any\nlater version.\n\nIn addition to the permissions in the GNU General Public License, the\nFree Software Foundation gives you unlimited permission to link the\ncompiled version of this file into combinations with other programs,\nand to distribute those combinations without any restriction coming\nfrom the use of this file.  (The General Public License restrictions\ndo apply in other respects; for example, they cover modification of\nthe file, and distribution when not linked into a combine\nexecutable.)\n\nThis file is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; see the file COPYING.  If not, write to\nthe Free Software Foundation, 59 Temple Place - Suite 330,\nBoston, MA 02111-1307, USA.  \n*/\n\n#define W_TYPE_SIZE   32\n#define BITS_PER_UNIT 8\n\ntypedef int Wtype;\ntypedef unsigned int UWtype;\ntypedef unsigned int USItype;\ntypedef long long DWtype;\ntypedef unsigned long long UDWtype;\n\nstruct DWstruct {\n    Wtype low, high;\n};\n\ntypedef union\n{\n  struct DWstruct s;\n  DWtype ll;\n} DWunion;\n\ntypedef long double XFtype;\n#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT)\n#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE)\n\n/* the following deal with IEEE single-precision numbers */\n#define EXCESS\t\t126\n#define SIGNBIT\t\t0x80000000\n#define HIDDEN\t\t(1 << 23)\n#define SIGN(fp)\t((fp) & SIGNBIT)\n#define EXP(fp)\t\t(((fp) >> 23) & 0xFF)\n#define MANT(fp)\t(((fp) & 0x7FFFFF) | HIDDEN)\n#define PACK(s,e,m)\t((s) | ((e) << 23) | (m))\n\n/* the following deal with IEEE double-precision numbers */\n#define EXCESSD\t\t1022\n#define HIDDEND\t\t(1 << 20)\n#define EXPD(fp)\t(((fp.l.upper) >> 20) & 0x7FF)\n#define SIGND(fp)\t((fp.l.upper) & SIGNBIT)\n#define MANTD(fp)\t(((((fp.l.upper) & 0xFFFFF) | HIDDEND) << 10) | \\\n\t\t\t\t(fp.l.lower >> 22))\n#define HIDDEND_LL\t((long long)1 << 52)\n#define MANTD_LL(fp)\t((fp.ll & (HIDDEND_LL-1)) | HIDDEND_LL)\n#define PACKD_LL(s,e,m)\t(((long long)((s)+((e)<<20))<<32)|(m))\n\n/* the following deal with x86 long double-precision numbers */\n#define EXCESSLD\t16382\n#define EXPLD(fp)\t(fp.l.upper & 0x7fff)\n#define SIGNLD(fp)\t((fp.l.upper) & 0x8000)\n\n/* only for x86 */\nunion ldouble_long {\n    long double ld;\n    struct {\n        unsigned long long lower;\n        unsigned short upper;\n    } l;\n};\n\nunion double_long {\n    double d;\n#if 1\n    struct {\n        unsigned int lower;\n        int upper;\n    } l;\n#else\n    struct {\n        int upper;\n        unsigned int lower;\n    } l;\n#endif\n    long long ll;\n};\n\nunion float_long {\n    float f;\n    long l;\n};\n\n/* XXX: we don't support several builtin supports for now */\n#ifndef __x86_64__\n\n/* XXX: use gcc/tcc intrinsic ? */\n#if defined(__i386__)\n#define sub_ddmmss(sh, sl, ah, al, bh, bl) \\\n  __asm__ (\"subl %5,%1\\n\\tsbbl %3,%0\"\t\t\t\t\t\\\n\t   : \"=r\" ((USItype) (sh)),\t\t\t\t\t\\\n\t     \"=&r\" ((USItype) (sl))\t\t\t\t\t\\\n\t   : \"0\" ((USItype) (ah)),\t\t\t\t\t\\\n\t     \"g\" ((USItype) (bh)),\t\t\t\t\t\\\n\t     \"1\" ((USItype) (al)),\t\t\t\t\t\\\n\t     \"g\" ((USItype) (bl)))\n#define umul_ppmm(w1, w0, u, v) \\\n  __asm__ (\"mull %3\"\t\t\t\t\t\t\t\\\n\t   : \"=a\" ((USItype) (w0)),\t\t\t\t\t\\\n\t     \"=d\" ((USItype) (w1))\t\t\t\t\t\\\n\t   : \"%0\" ((USItype) (u)),\t\t\t\t\t\\\n\t     \"rm\" ((USItype) (v)))\n#define udiv_qrnnd(q, r, n1, n0, dv) \\\n  __asm__ (\"divl %4\"\t\t\t\t\t\t\t\\\n\t   : \"=a\" ((USItype) (q)),\t\t\t\t\t\\\n\t     \"=d\" ((USItype) (r))\t\t\t\t\t\\\n\t   : \"0\" ((USItype) (n0)),\t\t\t\t\t\\\n\t     \"1\" ((USItype) (n1)),\t\t\t\t\t\\\n\t     \"rm\" ((USItype) (dv)))\n#define count_leading_zeros(count, x) \\\n  do {\t\t\t\t\t\t\t\t\t\\\n    USItype __cbtmp;\t\t\t\t\t\t\t\\\n    __asm__ (\"bsrl %1,%0\"\t\t\t\t\t\t\\\n\t     : \"=r\" (__cbtmp) : \"rm\" ((USItype) (x)));\t\t\t\\\n    (count) = __cbtmp ^ 31;\t\t\t\t\t\t\\\n  } while (0)\n#else\n#error unsupported CPU type\n#endif\n\n/* most of this code is taken from libgcc2.c from gcc */\n\nstatic UDWtype __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)\n{\n  DWunion ww;\n  DWunion nn, dd;\n  DWunion rr;\n  UWtype d0, d1, n0, n1, n2;\n  UWtype q0, q1;\n  UWtype b, bm;\n\n  nn.ll = n;\n  dd.ll = d;\n\n  d0 = dd.s.low;\n  d1 = dd.s.high;\n  n0 = nn.s.low;\n  n1 = nn.s.high;\n\n#if !defined(UDIV_NEEDS_NORMALIZATION)\n  if (d1 == 0)\n    {\n      if (d0 > n1)\n\t{\n\t  /* 0q = nn / 0D */\n\n\t  udiv_qrnnd (q0, n0, n1, n0, d0);\n\t  q1 = 0;\n\n\t  /* Remainder in n0.  */\n\t}\n      else\n\t{\n\t  /* qq = NN / 0d */\n\n\t  if (d0 == 0)\n\t    d0 = 1 / d0;\t/* Divide intentionally by zero.  */\n\n\t  udiv_qrnnd (q1, n1, 0, n1, d0);\n\t  udiv_qrnnd (q0, n0, n1, n0, d0);\n\n\t  /* Remainder in n0.  */\n\t}\n\n      if (rp != 0)\n\t{\n\t  rr.s.low = n0;\n\t  rr.s.high = 0;\n\t  *rp = rr.ll;\n\t}\n    }\n\n#else /* UDIV_NEEDS_NORMALIZATION */\n\n  if (d1 == 0)\n    {\n      if (d0 > n1)\n\t{\n\t  /* 0q = nn / 0D */\n\n\t  count_leading_zeros (bm, d0);\n\n\t  if (bm != 0)\n\t    {\n\t      /* Normalize, i.e. make the most significant bit of the\n\t\t denominator set.  */\n\n\t      d0 = d0 << bm;\n\t      n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));\n\t      n0 = n0 << bm;\n\t    }\n\n\t  udiv_qrnnd (q0, n0, n1, n0, d0);\n\t  q1 = 0;\n\n\t  /* Remainder in n0 >> bm.  */\n\t}\n      else\n\t{\n\t  /* qq = NN / 0d */\n\n\t  if (d0 == 0)\n\t    d0 = 1 / d0;\t/* Divide intentionally by zero.  */\n\n\t  count_leading_zeros (bm, d0);\n\n\t  if (bm == 0)\n\t    {\n\t      /* From (n1 >= d0) /\\ (the most significant bit of d0 is set),\n\t\t conclude (the most significant bit of n1 is set) /\\ (the\n\t\t leading quotient digit q1 = 1).\n\n\t\t This special case is necessary, not an optimization.\n\t\t (Shifts counts of W_TYPE_SIZE are undefined.)  */\n\n\t      n1 -= d0;\n\t      q1 = 1;\n\t    }\n\t  else\n\t    {\n\t      /* Normalize.  */\n\n\t      b = W_TYPE_SIZE - bm;\n\n\t      d0 = d0 << bm;\n\t      n2 = n1 >> b;\n\t      n1 = (n1 << bm) | (n0 >> b);\n\t      n0 = n0 << bm;\n\n\t      udiv_qrnnd (q1, n1, n2, n1, d0);\n\t    }\n\n\t  /* n1 != d0...  */\n\n\t  udiv_qrnnd (q0, n0, n1, n0, d0);\n\n\t  /* Remainder in n0 >> bm.  */\n\t}\n\n      if (rp != 0)\n\t{\n\t  rr.s.low = n0 >> bm;\n\t  rr.s.high = 0;\n\t  *rp = rr.ll;\n\t}\n    }\n#endif /* UDIV_NEEDS_NORMALIZATION */\n\n  else\n    {\n      if (d1 > n1)\n\t{\n\t  /* 00 = nn / DD */\n\n\t  q0 = 0;\n\t  q1 = 0;\n\n\t  /* Remainder in n1n0.  */\n\t  if (rp != 0)\n\t    {\n\t      rr.s.low = n0;\n\t      rr.s.high = n1;\n\t      *rp = rr.ll;\n\t    }\n\t}\n      else\n\t{\n\t  /* 0q = NN / dd */\n\n\t  count_leading_zeros (bm, d1);\n\t  if (bm == 0)\n\t    {\n\t      /* From (n1 >= d1) /\\ (the most significant bit of d1 is set),\n\t\t conclude (the most significant bit of n1 is set) /\\ (the\n\t\t quotient digit q0 = 0 or 1).\n\n\t\t This special case is necessary, not an optimization.  */\n\n\t      /* The condition on the next line takes advantage of that\n\t\t n1 >= d1 (true due to program flow).  */\n\t      if (n1 > d1 || n0 >= d0)\n\t\t{\n\t\t  q0 = 1;\n\t\t  sub_ddmmss (n1, n0, n1, n0, d1, d0);\n\t\t}\n\t      else\n\t\tq0 = 0;\n\n\t      q1 = 0;\n\n\t      if (rp != 0)\n\t\t{\n\t\t  rr.s.low = n0;\n\t\t  rr.s.high = n1;\n\t\t  *rp = rr.ll;\n\t\t}\n\t    }\n\t  else\n\t    {\n\t      UWtype m1, m0;\n\t      /* Normalize.  */\n\n\t      b = W_TYPE_SIZE - bm;\n\n\t      d1 = (d1 << bm) | (d0 >> b);\n\t      d0 = d0 << bm;\n\t      n2 = n1 >> b;\n\t      n1 = (n1 << bm) | (n0 >> b);\n\t      n0 = n0 << bm;\n\n\t      udiv_qrnnd (q0, n1, n2, n1, d1);\n\t      umul_ppmm (m1, m0, q0, d0);\n\n\t      if (m1 > n1 || (m1 == n1 && m0 > n0))\n\t\t{\n\t\t  q0--;\n\t\t  sub_ddmmss (m1, m0, m1, m0, d1, d0);\n\t\t}\n\n\t      q1 = 0;\n\n\t      /* Remainder in (n1n0 - m1m0) >> bm.  */\n\t      if (rp != 0)\n\t\t{\n\t\t  sub_ddmmss (n1, n0, n1, n0, m1, m0);\n\t\t  rr.s.low = (n1 << b) | (n0 >> bm);\n\t\t  rr.s.high = n1 >> bm;\n\t\t  *rp = rr.ll;\n\t\t}\n\t    }\n\t}\n    }\n\n  ww.s.low = q0;\n  ww.s.high = q1;\n  return ww.ll;\n}\n\n#define __negdi2(a) (-(a))\n\nlong long __divdi3(long long u, long long v)\n{\n    int c = 0;\n    DWunion uu, vv;\n    DWtype w;\n    \n    uu.ll = u;\n    vv.ll = v;\n    \n    if (uu.s.high < 0) {\n        c = ~c;\n        uu.ll = __negdi2 (uu.ll);\n    }\n    if (vv.s.high < 0) {\n        c = ~c;\n        vv.ll = __negdi2 (vv.ll);\n    }\n    w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);\n    if (c)\n        w = __negdi2 (w);\n    return w;\n}\n\nlong long __moddi3(long long u, long long v)\n{\n    int c = 0;\n    DWunion uu, vv;\n    DWtype w;\n    \n    uu.ll = u;\n    vv.ll = v;\n    \n    if (uu.s.high < 0) {\n        c = ~c;\n        uu.ll = __negdi2 (uu.ll);\n    }\n    if (vv.s.high < 0)\n        vv.ll = __negdi2 (vv.ll);\n    \n    __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) &w);\n    if (c)\n        w = __negdi2 (w);\n    return w;\n}\n\nunsigned long long __udivdi3(unsigned long long u, unsigned long long v)\n{\n    return __udivmoddi4 (u, v, (UDWtype *) 0);\n}\n\nunsigned long long __umoddi3(unsigned long long u, unsigned long long v)\n{\n    UDWtype w;\n    \n    __udivmoddi4 (u, v, &w);\n    return w;\n}\n\n/* XXX: fix tcc's code generator to do this instead */\nlong long __ashrdi3(long long a, int b)\n{\n#ifdef __TINYC__\n    DWunion u;\n    u.ll = a;\n    if (b >= 32) {\n        u.s.low = u.s.high >> (b - 32);\n        u.s.high = u.s.high >> 31;\n    } else if (b != 0) {\n        u.s.low = ((unsigned)u.s.low >> b) | (u.s.high << (32 - b));\n        u.s.high = u.s.high >> b;\n    }\n    return u.ll;\n#else\n    return a >> b;\n#endif\n}\n\n/* XXX: fix tcc's code generator to do this instead */\nunsigned long long __lshrdi3(unsigned long long a, int b)\n{\n#ifdef __TINYC__\n    DWunion u;\n    u.ll = a;\n    if (b >= 32) {\n        u.s.low = (unsigned)u.s.high >> (b - 32);\n        u.s.high = 0;\n    } else if (b != 0) {\n        u.s.low = ((unsigned)u.s.low >> b) | (u.s.high << (32 - b));\n        u.s.high = (unsigned)u.s.high >> b;\n    }\n    return u.ll;\n#else\n    return a >> b;\n#endif\n}\n\n/* XXX: fix tcc's code generator to do this instead */\nlong long __ashldi3(long long a, int b)\n{\n#ifdef __TINYC__\n    DWunion u;\n    u.ll = a;\n    if (b >= 32) {\n        u.s.high = (unsigned)u.s.low << (b - 32);\n        u.s.low = 0;\n    } else if (b != 0) {\n        u.s.high = ((unsigned)u.s.high << b) | ((unsigned)u.s.low >> (32 - b));\n        u.s.low = (unsigned)u.s.low << b;\n    }\n    return u.ll;\n#else\n    return a << b;\n#endif\n}\n\n#if defined(__i386__)\n/* FPU control word for rounding to nearest mode */\nunsigned short __tcc_fpu_control = 0x137f;\n/* FPU control word for round to zero mode for int conversion */\nunsigned short __tcc_int_fpu_control = 0x137f | 0x0c00;\n#endif\n\n#endif /* !__x86_64__ */\n\n/* XXX: fix tcc's code generator to do this instead */\nfloat __floatundisf(unsigned long long a)\n{\n    DWunion uu; \n    XFtype r;\n\n    uu.ll = a;\n    if (uu.s.high >= 0) {\n        return (float)uu.ll;\n    } else {\n        r = (XFtype)uu.ll;\n        r += 18446744073709551616.0;\n        return (float)r;\n    }\n}\n\ndouble __floatundidf(unsigned long long a)\n{\n    DWunion uu; \n    XFtype r;\n\n    uu.ll = a;\n    if (uu.s.high >= 0) {\n        return (double)uu.ll;\n    } else {\n        r = (XFtype)uu.ll;\n        r += 18446744073709551616.0;\n        return (double)r;\n    }\n}\n\nlong double __floatundixf(unsigned long long a)\n{\n    DWunion uu; \n    XFtype r;\n\n    uu.ll = a;\n    if (uu.s.high >= 0) {\n        return (long double)uu.ll;\n    } else {\n        r = (XFtype)uu.ll;\n        r += 18446744073709551616.0;\n        return (long double)r;\n    }\n}\n\nunsigned long long __fixunssfdi (float a1)\n{\n    register union float_long fl1;\n    register int exp;\n    register unsigned long l;\n\n    fl1.f = a1;\n\n    if (fl1.l == 0)\n\treturn (0);\n\n    exp = EXP (fl1.l) - EXCESS - 24;\n\n    l = MANT(fl1.l);\n    if (exp >= 41)\n\treturn (unsigned long long)-1;\n    else if (exp >= 0)\n        return (unsigned long long)l << exp;\n    else if (exp >= -23)\n        return l >> -exp;\n    else\n        return 0;\n}\n\nunsigned long long __fixunsdfdi (double a1)\n{\n    register union double_long dl1;\n    register int exp;\n    register unsigned long long l;\n\n    dl1.d = a1;\n\n    if (dl1.ll == 0)\n\treturn (0);\n\n    exp = EXPD (dl1) - EXCESSD - 53;\n\n    l = MANTD_LL(dl1);\n\n    if (exp >= 12)\n\treturn (unsigned long long)-1;\n    else if (exp >= 0)\n        return l << exp;\n    else if (exp >= -52)\n        return l >> -exp;\n    else\n        return 0;\n}\n\nunsigned long long __fixunsxfdi (long double a1)\n{\n    register union ldouble_long dl1;\n    register int exp;\n    register unsigned long long l;\n\n    dl1.ld = a1;\n\n    if (dl1.l.lower == 0 && dl1.l.upper == 0)\n\treturn (0);\n\n    exp = EXPLD (dl1) - EXCESSLD - 64;\n\n    l = dl1.l.lower;\n\n    if (exp > 0)\n\treturn (unsigned long long)-1;\n    else if (exp >= -63) \n        return l >> -exp;\n    else\n        return 0;\n}\n\n#if defined(__x86_64__) && !defined(_WIN64)\n\n/* helper functions for stdarg.h */\n\n#include <stdlib.h>\n#ifndef __TINYC__\n/* gives \"incompatible types for redefinition of __va_arg\" below */\n#include <stdio.h>\n#endif\n\nenum __va_arg_type {\n    __va_gen_reg, __va_float_reg, __va_stack\n};\n\n/* GCC compatible definition of va_list. */\nstruct __va_list_struct {\n    unsigned int gp_offset;\n    unsigned int fp_offset;\n    union {\n        unsigned int overflow_offset;\n        char *overflow_arg_area;\n    };\n    char *reg_save_area;\n};\n\nvoid *__va_start(void *fp)\n{\n    struct __va_list_struct *ap =\n        (struct __va_list_struct *)malloc(sizeof(struct __va_list_struct));\n    *ap = *(struct __va_list_struct *)((char *)fp - 16);\n    ap->overflow_arg_area = (char *)fp + ap->overflow_offset;\n    ap->reg_save_area = (char *)fp - 176 - 16;\n    return ap;\n}\n\nvoid *__va_arg(struct __va_list_struct *ap,\n               enum __va_arg_type arg_type,\n               int size)\n{\n    size = (size + 7) & ~7;\n    switch (arg_type) {\n    case __va_gen_reg:\n        if (ap->gp_offset < 48) {\n            ap->gp_offset += 8;\n            return ap->reg_save_area + ap->gp_offset - 8;\n        }\n        size = 8;\n        goto use_overflow_area;\n\n    case __va_float_reg:\n        if (ap->fp_offset < 128 + 48) {\n            ap->fp_offset += 16;\n            return ap->reg_save_area + ap->fp_offset - 16;\n        }\n        size = 8;\n        goto use_overflow_area;\n\n    case __va_stack:\n    use_overflow_area:\n        ap->overflow_arg_area += size;\n        return ap->overflow_arg_area - size;\n\n    default:\n#ifndef __TINYC__\n        fprintf(stderr, \"unknown ABI type for __va_arg\\n\");\n#endif\n        abort();\n    }\n}\n\nvoid *__va_copy(struct __va_list_struct *src)\n{\n    struct __va_list_struct *dest =\n        (struct __va_list_struct *)malloc(sizeof(struct __va_list_struct));\n    *dest = *src;\n    return dest;\n}\n\nvoid __va_end(struct __va_list_struct *ap)\n{\n    free(ap);\n}\n\n#endif /* __x86_64__ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/libtcc.c",
    "content": "/*\n *  TCC - Tiny C Compiler\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\n/********************************************************/\n/* global variables */\n\n/* use GNU C extensions */\nST_DATA int gnu_ext = 1;\n\n/* use TinyCC extensions */\nST_DATA int tcc_ext = 1;\n\n/* XXX: get rid of this ASAP */\nST_DATA struct TCCState *tcc_state;\n\n/********************************************************/\n\n#ifdef ONE_SOURCE\n#include \"tccpp.c\"\n#include \"tccgen.c\"\n#include \"tccelf.c\"\n#include \"tccrun.c\"\n#ifdef TCC_TARGET_I386\n#include \"i386-gen.c\"\n#endif\n#ifdef TCC_TARGET_ARM\n#include \"arm-gen.c\"\n#endif\n#ifdef TCC_TARGET_C67\n#include \"c67-gen.c\"\n#endif\n#ifdef TCC_TARGET_X86_64\n#include \"x86_64-gen.c\"\n#endif\n#ifdef CONFIG_TCC_ASM\n#include \"tccasm.c\"\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n#include \"i386-asm.c\"\n#endif\n#endif\n#ifdef TCC_TARGET_COFF\n#include \"tcccoff.c\"\n#endif\n#ifdef TCC_TARGET_PE\n#include \"tccpe.c\"\n#endif\n#endif /* ONE_SOURCE */\n\n/********************************************************/\n#ifndef CONFIG_TCC_ASM\nST_FUNC void asm_instr(void)\n{\n    tcc_error(\"inline asm() not supported\");\n}\nST_FUNC void asm_global_instr(void)\n{\n    tcc_error(\"inline asm() not supported\");\n}\n#endif\n\n/********************************************************/\n\n#ifdef _WIN32\nstatic char *normalize_slashes(char *path)\n{\n    char *p;\n    for (p = path; *p; ++p)\n        if (*p == '\\\\')\n            *p = '/';\n    return path;\n}\n\nstatic HMODULE tcc_module;\n\n/* on win32, we suppose the lib and includes are at the location of 'tcc.exe' */\nstatic void tcc_set_lib_path_w32(TCCState *s)\n{\n    char path[1024], *p;\n    GetModuleFileNameA(tcc_module, path, sizeof path);\n    p = tcc_basename(normalize_slashes(strlwr(path)));\n    if (p - 5 > path && 0 == strncmp(p - 5, \"/bin/\", 5))\n        p -= 5;\n    else if (p > path)\n        p--;\n    *p = 0;\n    tcc_set_lib_path(s, path);\n}\n\n#ifdef TCC_TARGET_PE\nstatic void tcc_add_systemdir(TCCState *s)\n{\n    char buf[1000];\n    GetSystemDirectory(buf, sizeof buf);\n    tcc_add_library_path(s, normalize_slashes(buf));\n}\n#endif\n\n#ifndef CONFIG_TCC_STATIC\nvoid dlclose(void *p)\n{\n    FreeLibrary((HMODULE)p);\n}\n#endif\n\n#ifdef LIBTCC_AS_DLL\nBOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)\n{\n    if (DLL_PROCESS_ATTACH == dwReason)\n        tcc_module = hDll;\n    return TRUE;\n}\n#endif\n#endif\n\n/********************************************************/\n/* copy a string and truncate it. */\nPUB_FUNC char *pstrcpy(char *buf, int buf_size, const char *s)\n{\n    char *q, *q_end;\n    int c;\n\n    if (buf_size > 0) {\n        q = buf;\n        q_end = buf + buf_size - 1;\n        while (q < q_end) {\n            c = *s++;\n            if (c == '\\0')\n                break;\n            *q++ = c;\n        }\n        *q = '\\0';\n    }\n    return buf;\n}\n\n/* strcat and truncate. */\nPUB_FUNC char *pstrcat(char *buf, int buf_size, const char *s)\n{\n    int len;\n    len = strlen(buf);\n    if (len < buf_size) \n        pstrcpy(buf + len, buf_size - len, s);\n    return buf;\n}\n\nPUB_FUNC char *pstrncpy(char *out, const char *in, size_t num)\n{\n    memcpy(out, in, num);\n    out[num] = '\\0';\n    return out;\n}\n\n/* extract the basename of a file */\nPUB_FUNC char *tcc_basename(const char *name)\n{\n    char *p = strchr(name, 0);\n    while (p > name && !IS_DIRSEP(p[-1]))\n        --p;\n    return p;\n}\n\n/* extract extension part of a file\n *\n * (if no extension, return pointer to end-of-string)\n */\nPUB_FUNC char *tcc_fileextension (const char *name)\n{\n    char *b = tcc_basename(name);\n    char *e = strrchr(b, '.');\n    return e ? e : strchr(b, 0);\n}\n\n/********************************************************/\n/* memory management */\n\n#undef free\n#undef malloc\n#undef realloc\n\n#ifdef MEM_DEBUG\nST_DATA int mem_cur_size;\nST_DATA int mem_max_size;\nunsigned malloc_usable_size(void*);\n#endif\n\nPUB_FUNC void tcc_free(void *ptr)\n{\n#ifdef MEM_DEBUG\n    mem_cur_size -= malloc_usable_size(ptr);\n#endif\n    free(ptr);\n}\n\nPUB_FUNC void *tcc_malloc(unsigned long size)\n{\n    void *ptr;\n    ptr = malloc(size);\n    if (!ptr && size)\n        tcc_error(\"memory full\");\n#ifdef MEM_DEBUG\n    mem_cur_size += malloc_usable_size(ptr);\n    if (mem_cur_size > mem_max_size)\n        mem_max_size = mem_cur_size;\n#endif\n    return ptr;\n}\n\nPUB_FUNC void *tcc_mallocz(unsigned long size)\n{\n    void *ptr;\n    ptr = tcc_malloc(size);\n    memset(ptr, 0, size);\n    return ptr;\n}\n\nPUB_FUNC void *tcc_realloc(void *ptr, unsigned long size)\n{\n    void *ptr1;\n#ifdef MEM_DEBUG\n    mem_cur_size -= malloc_usable_size(ptr);\n#endif\n    ptr1 = realloc(ptr, size);\n    if (!ptr1 && size)\n        tcc_error(\"memory full\");\n#ifdef MEM_DEBUG\n    /* NOTE: count not correct if alloc error, but not critical */\n    mem_cur_size += malloc_usable_size(ptr1);\n    if (mem_cur_size > mem_max_size)\n        mem_max_size = mem_cur_size;\n#endif\n    return ptr1;\n}\n\nPUB_FUNC char *tcc_strdup(const char *str)\n{\n    char *ptr;\n    ptr = tcc_malloc(strlen(str) + 1);\n    strcpy(ptr, str);\n    return ptr;\n}\n\nPUB_FUNC void tcc_memstats(void)\n{\n#ifdef MEM_DEBUG\n    printf(\"memory: %d bytes, max = %d bytes\\n\", mem_cur_size, mem_max_size);\n#endif\n}\n\n#define free(p) use_tcc_free(p)\n#define malloc(s) use_tcc_malloc(s)\n#define realloc(p, s) use_tcc_realloc(p, s)\n\n/********************************************************/\n/* dynarrays */\n\nST_FUNC void dynarray_add(void ***ptab, int *nb_ptr, void *data)\n{\n    int nb, nb_alloc;\n    void **pp;\n    \n    nb = *nb_ptr;\n    pp = *ptab;\n    /* every power of two we double array size */\n    if ((nb & (nb - 1)) == 0) {\n        if (!nb)\n            nb_alloc = 1;\n        else\n            nb_alloc = nb * 2;\n        pp = tcc_realloc(pp, nb_alloc * sizeof(void *));\n        *ptab = pp;\n    }\n    pp[nb++] = data;\n    *nb_ptr = nb;\n}\n\nST_FUNC void dynarray_reset(void *pp, int *n)\n{\n    void **p;\n    for (p = *(void***)pp; *n; ++p, --*n)\n        if (*p)\n            tcc_free(*p);\n    tcc_free(*(void**)pp);\n    *(void**)pp = NULL;\n}\n\nstatic void tcc_split_path(TCCState *s, void ***p_ary, int *p_nb_ary, const char *in)\n{\n    const char *p;\n    do {\n        int c;\n        CString str;\n\n        cstr_new(&str);\n        for (p = in; c = *p, c != '\\0' && c != PATHSEP; ++p) {\n            if (c == '{' && p[1] && p[2] == '}') {\n                c = p[1], p += 2;\n                if (c == 'B')\n                    cstr_cat(&str, s->tcc_lib_path);\n            } else {\n                cstr_ccat(&str, c);\n            }\n        }\n        cstr_ccat(&str, '\\0');\n        dynarray_add(p_ary, p_nb_ary, str.data);\n        in = p+1;\n    } while (*p);\n}\n\n/********************************************************/\n\nST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags)\n{\n    Section *sec;\n\n    sec = tcc_mallocz(sizeof(Section) + strlen(name));\n    strcpy(sec->name, name);\n    sec->sh_type = sh_type;\n    sec->sh_flags = sh_flags;\n    switch(sh_type) {\n    case SHT_HASH:\n    case SHT_REL:\n    case SHT_RELA:\n    case SHT_DYNSYM:\n    case SHT_SYMTAB:\n    case SHT_DYNAMIC:\n        sec->sh_addralign = 4;\n        break;\n    case SHT_STRTAB:\n        sec->sh_addralign = 1;\n        break;\n    default:\n        sec->sh_addralign = 32; /* default conservative alignment */\n        break;\n    }\n\n    if (sh_flags & SHF_PRIVATE) {\n        dynarray_add((void ***)&s1->priv_sections, &s1->nb_priv_sections, sec);\n    } else {\n        sec->sh_num = s1->nb_sections;\n        dynarray_add((void ***)&s1->sections, &s1->nb_sections, sec);\n    }\n\n    return sec;\n}\n\nstatic void free_section(Section *s)\n{\n    tcc_free(s->data);\n}\n\n/* realloc section and set its content to zero */\nST_FUNC void section_realloc(Section *sec, unsigned long new_size)\n{\n    unsigned long size;\n    unsigned char *data;\n    \n    size = sec->data_allocated;\n    if (size == 0)\n        size = 1;\n    while (size < new_size)\n        size = size * 2;\n    data = tcc_realloc(sec->data, size);\n    memset(data + sec->data_allocated, 0, size - sec->data_allocated);\n    sec->data = data;\n    sec->data_allocated = size;\n}\n\n/* reserve at least 'size' bytes in section 'sec' from\n   sec->data_offset. */\nST_FUNC void *section_ptr_add(Section *sec, unsigned long size)\n{\n    unsigned long offset, offset1;\n\n    offset = sec->data_offset;\n    offset1 = offset + size;\n    if (offset1 > sec->data_allocated)\n        section_realloc(sec, offset1);\n    sec->data_offset = offset1;\n    return sec->data + offset;\n}\n\n/* reserve at least 'size' bytes from section start */\nST_FUNC void section_reserve(Section *sec, unsigned long size)\n{\n    if (size > sec->data_allocated)\n        section_realloc(sec, size);\n    if (size > sec->data_offset)\n        sec->data_offset = size;\n}\n\n/* return a reference to a section, and create it if it does not\n   exists */\nST_FUNC Section *find_section(TCCState *s1, const char *name)\n{\n    Section *sec;\n    int i;\n    for(i = 1; i < s1->nb_sections; i++) {\n        sec = s1->sections[i];\n        if (!strcmp(name, sec->name)) \n            return sec;\n    }\n    /* sections are created as PROGBITS */\n    return new_section(s1, name, SHT_PROGBITS, SHF_ALLOC);\n}\n\n/* update sym->c so that it points to an external symbol in section\n   'section' with value 'value' */\nST_FUNC void put_extern_sym2(Sym *sym, Section *section, \n                            addr_t value, unsigned long size,\n                            int can_add_underscore)\n{\n    int sym_type, sym_bind, sh_num, info, other;\n    ElfW(Sym) *esym;\n    const char *name;\n    char buf1[256];\n\n    if (section == NULL)\n        sh_num = SHN_UNDEF;\n    else if (section == SECTION_ABS) \n        sh_num = SHN_ABS;\n    else\n        sh_num = section->sh_num;\n\n    if ((sym->type.t & VT_BTYPE) == VT_FUNC) {\n        sym_type = STT_FUNC;\n    } else if ((sym->type.t & VT_BTYPE) == VT_VOID) {\n        sym_type = STT_NOTYPE;\n    } else {\n        sym_type = STT_OBJECT;\n    }\n\n    if (sym->type.t & VT_STATIC)\n        sym_bind = STB_LOCAL;\n    else {\n        if (sym->type.t & VT_WEAK)\n            sym_bind = STB_WEAK;\n        else\n            sym_bind = STB_GLOBAL;\n    }\n\n    if (!sym->c) {\n        name = get_tok_str(sym->v, NULL);\n#ifdef CONFIG_TCC_BCHECK\n        if (tcc_state->do_bounds_check) {\n            char buf[32];\n\n            /* XXX: avoid doing that for statics ? */\n            /* if bound checking is activated, we change some function\n               names by adding the \"__bound\" prefix */\n            switch(sym->v) {\n#ifdef TCC_TARGET_PE\n            /* XXX: we rely only on malloc hooks */\n            case TOK_malloc: \n            case TOK_free: \n            case TOK_realloc: \n            case TOK_memalign: \n            case TOK_calloc: \n#endif\n            case TOK_memcpy: \n            case TOK_memmove:\n            case TOK_memset:\n            case TOK_strlen:\n            case TOK_strcpy:\n            case TOK_alloca:\n                strcpy(buf, \"__bound_\");\n                strcat(buf, name);\n                name = buf;\n                break;\n            }\n        }\n#endif\n        other = 0;\n\n#ifdef TCC_TARGET_PE\n        if (sym->type.t & VT_EXPORT)\n            other |= 1;\n        if (sym_type == STT_FUNC && sym->type.ref) {\n            int attr = sym->type.ref->r;\n            if (FUNC_EXPORT(attr))\n                other |= 1;\n            if (FUNC_CALL(attr) == FUNC_STDCALL && can_add_underscore) {\n                sprintf(buf1, \"_%s@%d\", name, FUNC_ARGS(attr) * PTR_SIZE);\n                name = buf1;\n                other |= 2;\n                can_add_underscore = 0;\n            }\n        } else {\n            if (find_elf_sym(tcc_state->dynsymtab_section, name))\n                other |= 4;\n            if (sym->type.t & VT_IMPORT)\n                other |= 4;\n        }\n#endif\n        if (tcc_state->leading_underscore && can_add_underscore) {\n            buf1[0] = '_';\n            pstrcpy(buf1 + 1, sizeof(buf1) - 1, name);\n            name = buf1;\n        }\n        if (sym->asm_label) {\n            name = sym->asm_label;\n        }\n        info = ELFW(ST_INFO)(sym_bind, sym_type);\n        sym->c = add_elf_sym(symtab_section, value, size, info, other, sh_num, name);\n    } else {\n        esym = &((ElfW(Sym) *)symtab_section->data)[sym->c];\n        esym->st_value = value;\n        esym->st_size = size;\n        esym->st_shndx = sh_num;\n    }\n}\n\nST_FUNC void put_extern_sym(Sym *sym, Section *section, \n                           addr_t value, unsigned long size)\n{\n    put_extern_sym2(sym, section, value, size, 1);\n}\n\n/* add a new relocation entry to symbol 'sym' in section 's' */\nST_FUNC void greloc(Section *s, Sym *sym, unsigned long offset, int type)\n{\n    int c = 0;\n    if (sym) {\n        if (0 == sym->c)\n            put_extern_sym(sym, NULL, 0, 0);\n        c = sym->c;\n    }\n    /* now we can add ELF relocation info */\n    put_elf_reloc(symtab_section, s, offset, type, c);\n}\n\n/********************************************************/\n\nstatic void strcat_vprintf(char *buf, int buf_size, const char *fmt, va_list ap)\n{\n    int len;\n    len = strlen(buf);\n    vsnprintf(buf + len, buf_size - len, fmt, ap);\n}\n\nstatic void strcat_printf(char *buf, int buf_size, const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    strcat_vprintf(buf, buf_size, fmt, ap);\n    va_end(ap);\n}\n\nstatic void error1(TCCState *s1, int is_warning, const char *fmt, va_list ap)\n{\n    char buf[2048];\n    BufferedFile **pf, *f;\n    \n    buf[0] = '\\0';\n    /* use upper file if inline \":asm:\" or token \":paste:\" */\n    for (f = file; f && f->filename[0] == ':'; f = f->prev);\n    if (f) {\n        for(pf = s1->include_stack; pf < s1->include_stack_ptr; pf++)\n            strcat_printf(buf, sizeof(buf), \"In file included from %s:%d:\\n\",\n                (*pf)->filename, (*pf)->line_num);\n        if (f->line_num > 0) {\n            strcat_printf(buf, sizeof(buf), \"%s:%d: \",\n                f->filename, f->line_num);\n        } else {\n            strcat_printf(buf, sizeof(buf), \"%s: \",\n                f->filename);\n        }\n    } else {\n        strcat_printf(buf, sizeof(buf), \"tcc: \");\n    }\n    if (is_warning)\n        strcat_printf(buf, sizeof(buf), \"warning: \");\n    else\n        strcat_printf(buf, sizeof(buf), \"error: \");\n    strcat_vprintf(buf, sizeof(buf), fmt, ap);\n\n    if (!s1->error_func) {\n        /* default case: stderr */\n        fprintf(stderr, \"%s\\n\", buf);\n    } else {\n        s1->error_func(s1->error_opaque, buf);\n    }\n    if (!is_warning || s1->warn_error)\n        s1->nb_errors++;\n}\n\nLIBTCCAPI void tcc_set_error_func(TCCState *s, void *error_opaque,\n                        void (*error_func)(void *opaque, const char *msg))\n{\n    s->error_opaque = error_opaque;\n    s->error_func = error_func;\n}\n\n/* error without aborting current compilation */\nPUB_FUNC void tcc_error_noabort(const char *fmt, ...)\n{\n    TCCState *s1 = tcc_state;\n    va_list ap;\n\n    va_start(ap, fmt);\n    error1(s1, 0, fmt, ap);\n    va_end(ap);\n}\n\nPUB_FUNC void tcc_error(const char *fmt, ...)\n{\n    TCCState *s1 = tcc_state;\n    va_list ap;\n\n    va_start(ap, fmt);\n    error1(s1, 0, fmt, ap);\n    va_end(ap);\n    /* better than nothing: in some cases, we accept to handle errors */\n    if (s1->error_set_jmp_enabled) {\n        longjmp(s1->error_jmp_buf, 1);\n    } else {\n        /* XXX: eliminate this someday */\n        exit(1);\n    }\n}\n\nPUB_FUNC void tcc_warning(const char *fmt, ...)\n{\n    TCCState *s1 = tcc_state;\n    va_list ap;\n\n    if (s1->warn_none)\n        return;\n\n    va_start(ap, fmt);\n    error1(s1, 1, fmt, ap);\n    va_end(ap);\n}\n\n/********************************************************/\n/* I/O layer */\n\nST_FUNC void tcc_open_bf(TCCState *s1, const char *filename, int initlen)\n{\n    BufferedFile *bf;\n    int buflen = initlen ? initlen : IO_BUF_SIZE;\n\n    bf = tcc_malloc(sizeof(BufferedFile) + buflen);\n    bf->buf_ptr = bf->buffer;\n    bf->buf_end = bf->buffer + initlen;\n    bf->buf_end[0] = CH_EOB; /* put eob symbol */\n    pstrcpy(bf->filename, sizeof(bf->filename), filename);\n#ifdef _WIN32\n    normalize_slashes(bf->filename);\n#endif\n    bf->line_num = 1;\n    bf->ifndef_macro = 0;\n    bf->ifdef_stack_ptr = s1->ifdef_stack_ptr;\n    bf->fd = -1;\n    bf->prev = file;\n    file = bf;\n}\n\nST_FUNC void tcc_close(void)\n{\n    BufferedFile *bf = file;\n    if (bf->fd > 0) {\n        close(bf->fd);\n        total_lines += bf->line_num;\n    }\n    file = bf->prev;\n    tcc_free(bf);\n}\n\nST_FUNC int tcc_open(TCCState *s1, const char *filename)\n{\n    int fd;\n    if (strcmp(filename, \"-\") == 0)\n        fd = 0, filename = \"stdin\";\n    else\n        fd = open(filename, O_RDONLY | O_BINARY);\n    if ((s1->verbose == 2 && fd >= 0) || s1->verbose == 3)\n        printf(\"%s %*s%s\\n\", fd < 0 ? \"nf\":\"->\",\n               (int)(s1->include_stack_ptr - s1->include_stack), \"\", filename);\n    if (fd < 0)\n        return -1;\n\n    tcc_open_bf(s1, filename, 0);\n    file->fd = fd;\n    return fd;\n}\n\n/* compile the C file opened in 'file'. Return non zero if errors. */\nstatic int tcc_compile(TCCState *s1)\n{\n    Sym *define_start;\n    SValue *pvtop;\n    char buf[512];\n    volatile int section_sym;\n\n#ifdef INC_DEBUG\n    printf(\"%s: **** new file\\n\", file->filename);\n#endif\n    preprocess_init(s1);\n\n    cur_text_section = NULL;\n    funcname = \"\";\n    anon_sym = SYM_FIRST_ANOM; \n\n    /* file info: full path + filename */\n    section_sym = 0; /* avoid warning */\n    if (s1->do_debug) {\n        section_sym = put_elf_sym(symtab_section, 0, 0, \n                                  ELFW(ST_INFO)(STB_LOCAL, STT_SECTION), 0, \n                                  text_section->sh_num, NULL);\n        getcwd(buf, sizeof(buf));\n#ifdef _WIN32\n        normalize_slashes(buf);\n#endif\n        pstrcat(buf, sizeof(buf), \"/\");\n        put_stabs_r(buf, N_SO, 0, 0, \n                    text_section->data_offset, text_section, section_sym);\n        put_stabs_r(file->filename, N_SO, 0, 0, \n                    text_section->data_offset, text_section, section_sym);\n    }\n    /* an elf symbol of type STT_FILE must be put so that STB_LOCAL\n       symbols can be safely used */\n    put_elf_sym(symtab_section, 0, 0, \n                ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0, \n                SHN_ABS, file->filename);\n\n    /* define some often used types */\n    int_type.t = VT_INT;\n\n    char_pointer_type.t = VT_BYTE;\n    mk_pointer(&char_pointer_type);\n\n#if PTR_SIZE == 4\n    size_type.t = VT_INT;\n#else\n    size_type.t = VT_LLONG;\n#endif\n\n    func_old_type.t = VT_FUNC;\n    func_old_type.ref = sym_push(SYM_FIELD, &int_type, FUNC_CDECL, FUNC_OLD);\n#ifdef TCC_TARGET_ARM\n    arm_init_types();\n#endif\n\n#if 0\n    /* define 'void *alloca(unsigned int)' builtin function */\n    {\n        Sym *s1;\n\n        p = anon_sym++;\n        sym = sym_push(p, mk_pointer(VT_VOID), FUNC_CDECL, FUNC_NEW);\n        s1 = sym_push(SYM_FIELD, VT_UNSIGNED | VT_INT, 0, 0);\n        s1->next = NULL;\n        sym->next = s1;\n        sym_push(TOK_alloca, VT_FUNC | (p << VT_STRUCT_SHIFT), VT_CONST, 0);\n    }\n#endif\n\n    define_start = define_stack;\n    nocode_wanted = 1;\n\n    if (setjmp(s1->error_jmp_buf) == 0) {\n        s1->nb_errors = 0;\n        s1->error_set_jmp_enabled = 1;\n\n        ch = file->buf_ptr[0];\n        tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF;\n        parse_flags = PARSE_FLAG_PREPROCESS | PARSE_FLAG_TOK_NUM;\n        pvtop = vtop;\n        next();\n        decl(VT_CONST);\n        if (tok != TOK_EOF)\n            expect(\"declaration\");\n        if (pvtop != vtop)\n            tcc_warning(\"internal compiler error: vstack leak? (%d)\", vtop - pvtop);\n\n        /* end of translation unit info */\n        if (s1->do_debug) {\n            put_stabs_r(NULL, N_SO, 0, 0, \n                        text_section->data_offset, text_section, section_sym);\n        }\n    }\n\n    s1->error_set_jmp_enabled = 0;\n\n    /* reset define stack, but leave -Dsymbols (may be incorrect if\n       they are undefined) */\n    free_defines(define_start); \n\n    gen_inline_functions();\n\n    sym_pop(&global_stack, NULL);\n    sym_pop(&local_stack, NULL);\n\n    return s1->nb_errors != 0 ? -1 : 0;\n}\n\nLIBTCCAPI int tcc_compile_string(TCCState *s, const char *str)\n{\n    int len, ret;\n    len = strlen(str);\n\n    tcc_open_bf(s, \"<string>\", len);\n    memcpy(file->buffer, str, len);\n    ret = tcc_compile(s);\n    tcc_close();\n    return ret;\n}\n\n/* define a preprocessor symbol. A value can also be provided with the '=' operator */\nLIBTCCAPI void tcc_define_symbol(TCCState *s1, const char *sym, const char *value)\n{\n    int len1, len2;\n    /* default value */\n    if (!value)\n        value = \"1\";\n    len1 = strlen(sym);\n    len2 = strlen(value);\n\n    /* init file structure */\n    tcc_open_bf(s1, \"<define>\", len1 + len2 + 1);\n    memcpy(file->buffer, sym, len1);\n    file->buffer[len1] = ' ';\n    memcpy(file->buffer + len1 + 1, value, len2);\n\n    /* parse with define parser */\n    ch = file->buf_ptr[0];\n    next_nomacro();\n    parse_define();\n\n    tcc_close();\n}\n\n/* undefine a preprocessor symbol */\nLIBTCCAPI void tcc_undefine_symbol(TCCState *s1, const char *sym)\n{\n    TokenSym *ts;\n    Sym *s;\n    ts = tok_alloc(sym, strlen(sym));\n    s = define_find(ts->tok);\n    /* undefine symbol by putting an invalid name */\n    if (s)\n        define_undef(s);\n}\n\n/* cleanup all static data used during compilation */\nstatic void tcc_cleanup(void)\n{\n    int i, n;\n    if (NULL == tcc_state)\n        return;\n    tcc_state = NULL;\n\n    /* free -D defines */\n    free_defines(NULL);\n\n    /* free tokens */\n    n = tok_ident - TOK_IDENT;\n    for(i = 0; i < n; i++)\n        tcc_free(table_ident[i]);\n    tcc_free(table_ident);\n\n    /* free sym_pools */\n    dynarray_reset(&sym_pools, &nb_sym_pools);\n    /* string buffer */\n    cstr_free(&tokcstr);\n    /* reset symbol stack */\n    sym_free_first = NULL;\n    /* cleanup from error/setjmp */\n    macro_ptr = NULL;\n}\n\nLIBTCCAPI TCCState *tcc_new(void)\n{\n    TCCState *s;\n    char buffer[100];\n    int a,b,c;\n\n    tcc_cleanup();\n\n    s = tcc_mallocz(sizeof(TCCState));\n    if (!s)\n        return NULL;\n    tcc_state = s;\n#ifdef _WIN32\n    tcc_set_lib_path_w32(s);\n#else\n    tcc_set_lib_path(s, CONFIG_TCCDIR);\n#endif\n    s->output_type = TCC_OUTPUT_MEMORY;\n    preprocess_new();\n    s->include_stack_ptr = s->include_stack;\n\n    /* we add dummy defines for some special macros to speed up tests\n       and to have working defined() */\n    define_push(TOK___LINE__, MACRO_OBJ, NULL, NULL);\n    define_push(TOK___FILE__, MACRO_OBJ, NULL, NULL);\n    define_push(TOK___DATE__, MACRO_OBJ, NULL, NULL);\n    define_push(TOK___TIME__, MACRO_OBJ, NULL, NULL);\n\n    /* define __TINYC__ 92X  */\n    sscanf(TCC_VERSION, \"%d.%d.%d\", &a, &b, &c);\n    sprintf(buffer, \"%d\", a*10000 + b*100 + c);\n    tcc_define_symbol(s, \"__TINYC__\", buffer);\n\n    /* standard defines */\n    tcc_define_symbol(s, \"__STDC__\", NULL);\n    tcc_define_symbol(s, \"__STDC_VERSION__\", \"199901L\");\n\n    /* target defines */\n#if defined(TCC_TARGET_I386)\n    tcc_define_symbol(s, \"__i386__\", NULL);\n    tcc_define_symbol(s, \"__i386\", NULL);\n    tcc_define_symbol(s, \"i386\", NULL);\n#elif defined(TCC_TARGET_X86_64)\n    tcc_define_symbol(s, \"__x86_64__\", NULL);\n#elif defined(TCC_TARGET_ARM)\n    tcc_define_symbol(s, \"__ARM_ARCH_4__\", NULL);\n    tcc_define_symbol(s, \"__arm_elf__\", NULL);\n    tcc_define_symbol(s, \"__arm_elf\", NULL);\n    tcc_define_symbol(s, \"arm_elf\", NULL);\n    tcc_define_symbol(s, \"__arm__\", NULL);\n    tcc_define_symbol(s, \"__arm\", NULL);\n    tcc_define_symbol(s, \"arm\", NULL);\n    tcc_define_symbol(s, \"__APCS_32__\", NULL);\n#endif\n\n#ifdef TCC_TARGET_PE\n    tcc_define_symbol(s, \"_WIN32\", NULL);\n# ifdef TCC_TARGET_X86_64\n    tcc_define_symbol(s, \"_WIN64\", NULL);\n# endif\n#else\n    tcc_define_symbol(s, \"__unix__\", NULL);\n    tcc_define_symbol(s, \"__unix\", NULL);\n    tcc_define_symbol(s, \"unix\", NULL);\n# if defined(__linux)\n    tcc_define_symbol(s, \"__linux__\", NULL);\n    tcc_define_symbol(s, \"__linux\", NULL);\n# endif\n# if defined(__FreeBSD__)\n#  define str(s) #s\n    tcc_define_symbol(s, \"__FreeBSD__\", str( __FreeBSD__));\n#  undef str\n# endif\n# if defined(__FreeBSD_kernel__)\n    tcc_define_symbol(s, \"__FreeBSD_kernel__\", NULL);\n# endif\n#endif\n\n    /* TinyCC & gcc defines */\n#if defined TCC_TARGET_PE && defined TCC_TARGET_X86_64\n    tcc_define_symbol(s, \"__SIZE_TYPE__\", \"unsigned long long\");\n    tcc_define_symbol(s, \"__PTRDIFF_TYPE__\", \"long long\");\n#else\n    tcc_define_symbol(s, \"__SIZE_TYPE__\", \"unsigned long\");\n    tcc_define_symbol(s, \"__PTRDIFF_TYPE__\", \"long\");\n#endif\n\n#ifdef TCC_TARGET_PE\n    tcc_define_symbol(s, \"__WCHAR_TYPE__\", \"unsigned short\");\n#else\n    tcc_define_symbol(s, \"__WCHAR_TYPE__\", \"int\");\n#endif\n\n#ifndef TCC_TARGET_PE\n    /* glibc defines */\n    tcc_define_symbol(s, \"__REDIRECT(name, proto, alias)\", \"name proto __asm__ (#alias)\");\n    tcc_define_symbol(s, \"__REDIRECT_NTH(name, proto, alias)\", \"name proto __asm__ (#alias) __THROW\");\n    /* default library paths */\n    tcc_add_library_path(s, CONFIG_TCC_LIBPATHS);\n    /* paths for crt objects */\n    tcc_split_path(s, (void ***)&s->crt_paths, &s->nb_crt_paths, CONFIG_TCC_CRTPREFIX);\n#endif\n\n    /* no section zero */\n    dynarray_add((void ***)&s->sections, &s->nb_sections, NULL);\n\n    /* create standard sections */\n    text_section = new_section(s, \".text\", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR);\n    data_section = new_section(s, \".data\", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);\n    bss_section = new_section(s, \".bss\", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);\n\n    /* symbols are always generated for linking stage */\n    symtab_section = new_symtab(s, \".symtab\", SHT_SYMTAB, 0,\n                                \".strtab\",\n                                \".hashtab\", SHF_PRIVATE); \n    strtab_section = symtab_section->link;\n    s->symtab = symtab_section;\n    \n    /* private symbol table for dynamic symbols */\n    s->dynsymtab_section = new_symtab(s, \".dynsymtab\", SHT_SYMTAB, SHF_PRIVATE,\n                                      \".dynstrtab\", \n                                      \".dynhashtab\", SHF_PRIVATE);\n    s->alacarte_link = 1;\n    s->nocommon = 1;\n    s->section_align = ELF_PAGE_SIZE;\n\n#ifdef CHAR_IS_UNSIGNED\n    s->char_is_unsigned = 1;\n#endif\n    /* enable this if you want symbols with leading underscore on windows: */\n#if 0 //def TCC_TARGET_PE\n    s->leading_underscore = 1;\n#endif\n#ifdef TCC_TARGET_I386\n    s->seg_size = 32;\n#endif\n    return s;\n}\n\nLIBTCCAPI void tcc_delete(TCCState *s1)\n{\n    int i;\n\n    tcc_cleanup();\n\n    /* free all sections */\n    for(i = 1; i < s1->nb_sections; i++)\n        free_section(s1->sections[i]);\n    dynarray_reset(&s1->sections, &s1->nb_sections);\n\n    for(i = 0; i < s1->nb_priv_sections; i++)\n        free_section(s1->priv_sections[i]);\n    dynarray_reset(&s1->priv_sections, &s1->nb_priv_sections);\n        \n    /* free any loaded DLLs */\n    for ( i = 0; i < s1->nb_loaded_dlls; i++) {\n        DLLReference *ref = s1->loaded_dlls[i];\n        if ( ref->handle )\n            dlclose(ref->handle);\n    }\n    \n    /* free loaded dlls array */\n    dynarray_reset(&s1->loaded_dlls, &s1->nb_loaded_dlls);\n\n    /* free library paths */\n    dynarray_reset(&s1->library_paths, &s1->nb_library_paths);\n    dynarray_reset(&s1->crt_paths, &s1->nb_crt_paths);\n\n    /* free include paths */\n    dynarray_reset(&s1->cached_includes, &s1->nb_cached_includes);\n    dynarray_reset(&s1->include_paths, &s1->nb_include_paths);\n    dynarray_reset(&s1->sysinclude_paths, &s1->nb_sysinclude_paths);\n\n    tcc_free(s1->tcc_lib_path);\n    tcc_free(s1->soname);\n    tcc_free(s1->rpath);\n    tcc_free(s1->init_symbol);\n    tcc_free(s1->fini_symbol);\n    tcc_free(s1->outfile);\n    tcc_free(s1->deps_outfile);\n    dynarray_reset(&s1->files, &s1->nb_files);\n    dynarray_reset(&s1->target_deps, &s1->nb_target_deps);\n\n#ifdef TCC_IS_NATIVE\n# ifdef HAVE_SELINUX\n    munmap (s1->write_mem, s1->mem_size);\n    munmap (s1->runtime_mem, s1->mem_size);    \n# else\n    tcc_free(s1->runtime_mem);\n# endif\n#endif\n\n    tcc_free(s1);\n}\n\nLIBTCCAPI int tcc_add_include_path(TCCState *s, const char *pathname)\n{\n    tcc_split_path(s, (void ***)&s->include_paths, &s->nb_include_paths, pathname);\n    return 0;\n}\n\nLIBTCCAPI int tcc_add_sysinclude_path(TCCState *s, const char *pathname)\n{\n    tcc_split_path(s, (void ***)&s->sysinclude_paths, &s->nb_sysinclude_paths, pathname);\n    return 0;\n}\n\nST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags)\n{\n    const char *ext;\n    ElfW(Ehdr) ehdr;\n    int fd, ret, size;\n\n    /* find source file type with extension */\n    ext = tcc_fileextension(filename);\n    if (ext[0])\n        ext++;\n\n#ifdef CONFIG_TCC_ASM\n    /* if .S file, define __ASSEMBLER__ like gcc does */\n    if (!strcmp(ext, \"S\"))\n        tcc_define_symbol(s1, \"__ASSEMBLER__\", NULL);\n#endif\n\n    /* open the file */\n    ret = tcc_open(s1, filename);\n    if (ret < 0) {\n        if (flags & AFF_PRINT_ERROR)\n            tcc_error_noabort(\"file '%s' not found\", filename);\n        return ret;\n    }\n\n    /* update target deps */\n    dynarray_add((void ***)&s1->target_deps, &s1->nb_target_deps,\n            tcc_strdup(filename));\n\n    if (flags & AFF_PREPROCESS) {\n        ret = tcc_preprocess(s1);\n        goto the_end;\n    }\n\n    if (!ext[0] || !PATHCMP(ext, \"c\")) {\n        /* C file assumed */\n        ret = tcc_compile(s1);\n        goto the_end;\n    }\n\n#ifdef CONFIG_TCC_ASM\n    if (!strcmp(ext, \"S\")) {\n        /* preprocessed assembler */\n        ret = tcc_assemble(s1, 1);\n        goto the_end;\n    }\n\n    if (!strcmp(ext, \"s\")) {\n        /* non preprocessed assembler */\n        ret = tcc_assemble(s1, 0);\n        goto the_end;\n    }\n#endif\n\n    fd = file->fd;\n    /* assume executable format: auto guess file type */\n    size = read(fd, &ehdr, sizeof(ehdr));\n    lseek(fd, 0, SEEK_SET);\n    if (size <= 0) {\n        tcc_error_noabort(\"could not read header\");\n        goto the_end;\n    }\n\n    if (size == sizeof(ehdr) &&\n        ehdr.e_ident[0] == ELFMAG0 &&\n        ehdr.e_ident[1] == ELFMAG1 &&\n        ehdr.e_ident[2] == ELFMAG2 &&\n        ehdr.e_ident[3] == ELFMAG3) {\n\n        /* do not display line number if error */\n        file->line_num = 0;\n        if (ehdr.e_type == ET_REL) {\n            ret = tcc_load_object_file(s1, fd, 0);\n            goto the_end;\n\n        }\n#ifndef TCC_TARGET_PE\n        if (ehdr.e_type == ET_DYN) {\n            if (s1->output_type == TCC_OUTPUT_MEMORY) {\n#ifdef TCC_IS_NATIVE\n                void *h;\n                h = dlopen(filename, RTLD_GLOBAL | RTLD_LAZY);\n                if (h)\n#endif\n                    ret = 0;\n            } else {\n                ret = tcc_load_dll(s1, fd, filename, \n                                   (flags & AFF_REFERENCED_DLL) != 0);\n            }\n            goto the_end;\n        }\n#endif\n        tcc_error_noabort(\"unrecognized ELF file\");\n        goto the_end;\n    }\n\n    if (memcmp((char *)&ehdr, ARMAG, 8) == 0) {\n        file->line_num = 0; /* do not display line number if error */\n        ret = tcc_load_archive(s1, fd);\n        goto the_end;\n    }\n\n#ifdef TCC_TARGET_COFF\n    if (*(uint16_t *)(&ehdr) == COFF_C67_MAGIC) {\n        ret = tcc_load_coff(s1, fd);\n        goto the_end;\n    }\n#endif\n\n#ifdef TCC_TARGET_PE\n    ret = pe_load_file(s1, filename, fd);\n#else\n    /* as GNU ld, consider it is an ld script if not recognized */\n    ret = tcc_load_ldscript(s1);\n#endif\n    if (ret < 0)\n        tcc_error_noabort(\"unrecognized file type\");\n\nthe_end:\n    tcc_close();\n    return ret;\n}\n\nLIBTCCAPI int tcc_add_file(TCCState *s, const char *filename)\n{\n    if (s->output_type == TCC_OUTPUT_PREPROCESS)\n        return tcc_add_file_internal(s, filename, AFF_PRINT_ERROR | AFF_PREPROCESS);\n    else\n        return tcc_add_file_internal(s, filename, AFF_PRINT_ERROR);\n}\n\nLIBTCCAPI int tcc_add_library_path(TCCState *s, const char *pathname)\n{\n    tcc_split_path(s, (void ***)&s->library_paths, &s->nb_library_paths, pathname);\n    return 0;\n}\n\nstatic int tcc_add_library_internal(TCCState *s, const char *fmt,\n    const char *filename, int flags, char **paths, int nb_paths)\n{\n    char buf[1024];\n    int i;\n\n    for(i = 0; i < nb_paths; i++) {\n        snprintf(buf, sizeof(buf), fmt, paths[i], filename);\n        if (tcc_add_file_internal(s, buf, flags) == 0)\n            return 0;\n    }\n    return -1;\n}\n\n/* find and load a dll. Return non zero if not found */\n/* XXX: add '-rpath' option support ? */\nST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags)\n{\n    return tcc_add_library_internal(s, \"%s/%s\", filename, flags,\n        s->library_paths, s->nb_library_paths);\n}\n\nST_FUNC int tcc_add_crt(TCCState *s, const char *filename)\n{\n    if (-1 == tcc_add_library_internal(s, \"%s/%s\",\n        filename, 0, s->crt_paths, s->nb_crt_paths))\n        tcc_error_noabort(\"file '%s' not found\", filename);\n    return 0;\n}\n\n/* the library name is the same as the argument of the '-l' option */\nLIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname)\n{\n#ifdef TCC_TARGET_PE\n    const char *libs[] = { \"%s/%s.def\", \"%s/lib%s.def\", \"%s/%s.dll\", \"%s/lib%s.dll\", \"%s/lib%s.a\", NULL };\n    const char **pp = s->static_link ? libs + 4 : libs;\n#else\n    const char *libs[] = { \"%s/lib%s.so\", \"%s/lib%s.a\", NULL };\n    const char **pp = s->static_link ? libs + 1 : libs;\n#endif\n    while (*pp) {\n        if (0 == tcc_add_library_internal(s, *pp,\n            libraryname, 0, s->library_paths, s->nb_library_paths))\n            return 0;\n        ++pp;\n    }\n    return -1;\n}\n\nLIBTCCAPI int tcc_add_symbol(TCCState *s, const char *name, const void *val)\n{\n#ifdef TCC_TARGET_PE\n    /* On x86_64 'val' might not be reachable with a 32bit offset.\n       So it is handled here as if it were in a DLL. */\n    pe_putimport(s, 0, name, (uintptr_t)val);\n#else\n    /* XXX: Same problem on linux but currently \"solved\" elsewhere\n       via the rather dirty 'runtime_plt_and_got' hack. */\n    add_elf_sym(symtab_section, (uintptr_t)val, 0,\n        ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n        SHN_ABS, name);\n#endif\n    return 0;\n}\n\nLIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type)\n{\n    s->output_type = output_type;\n\n    if (!s->nostdinc) {\n        /* default include paths */\n        /* -isystem paths have already been handled */\n        tcc_add_sysinclude_path(s, CONFIG_TCC_SYSINCLUDEPATHS);\n    }\n\n    /* if bound checking, then add corresponding sections */\n#ifdef CONFIG_TCC_BCHECK\n    if (s->do_bounds_check) {\n        /* define symbol */\n        tcc_define_symbol(s, \"__BOUNDS_CHECKING_ON\", NULL);\n        /* create bounds sections */\n        bounds_section = new_section(s, \".bounds\", \n                                     SHT_PROGBITS, SHF_ALLOC);\n        lbounds_section = new_section(s, \".lbounds\", \n                                      SHT_PROGBITS, SHF_ALLOC);\n    }\n#endif\n\n    if (s->char_is_unsigned) {\n        tcc_define_symbol(s, \"__CHAR_UNSIGNED__\", NULL);\n    }\n\n    /* add debug sections */\n    if (s->do_debug) {\n        /* stab symbols */\n        stab_section = new_section(s, \".stab\", SHT_PROGBITS, 0);\n        stab_section->sh_entsize = sizeof(Stab_Sym);\n        stabstr_section = new_section(s, \".stabstr\", SHT_STRTAB, 0);\n        put_elf_str(stabstr_section, \"\");\n        stab_section->link = stabstr_section;\n        /* put first entry */\n        put_stabs(\"\", 0, 0, 0, 0);\n    }\n\n#ifdef TCC_TARGET_PE\n    tcc_add_library_path(s, CONFIG_TCC_LIBPATHS);\n# ifdef _WIN32\n    tcc_add_systemdir(s);\n# endif\n#else\n    /* add libc crt1/crti objects */\n    if ((output_type == TCC_OUTPUT_EXE || output_type == TCC_OUTPUT_DLL) &&\n        !s->nostdlib) {\n        if (output_type != TCC_OUTPUT_DLL)\n            tcc_add_crt(s, \"crt1.o\");\n        tcc_add_crt(s, \"crti.o\");\n    }\n#endif\n    return 0;\n}\n\nLIBTCCAPI void tcc_set_lib_path(TCCState *s, const char *path)\n{\n    tcc_free(s->tcc_lib_path);\n    s->tcc_lib_path = tcc_strdup(path);\n}\n\n#define WD_ALL    0x0001 /* warning is activated when using -Wall */\n#define FD_INVERT 0x0002 /* invert value before storing */\n\ntypedef struct FlagDef {\n    uint16_t offset;\n    uint16_t flags;\n    const char *name;\n} FlagDef;\n\nstatic const FlagDef warning_defs[] = {\n    { offsetof(TCCState, warn_unsupported), 0, \"unsupported\" },\n    { offsetof(TCCState, warn_write_strings), 0, \"write-strings\" },\n    { offsetof(TCCState, warn_error), 0, \"error\" },\n    { offsetof(TCCState, warn_implicit_function_declaration), WD_ALL,\n      \"implicit-function-declaration\" },\n};\n\nST_FUNC int set_flag(TCCState *s, const FlagDef *flags, int nb_flags,\n                    const char *name, int value)\n{\n    int i;\n    const FlagDef *p;\n    const char *r;\n\n    r = name;\n    if (r[0] == 'n' && r[1] == 'o' && r[2] == '-') {\n        r += 3;\n        value = !value;\n    }\n    for(i = 0, p = flags; i < nb_flags; i++, p++) {\n        if (!strcmp(r, p->name))\n            goto found;\n    }\n    return -1;\n found:\n    if (p->flags & FD_INVERT)\n        value = !value;\n    *(int *)((uint8_t *)s + p->offset) = value;\n    return 0;\n}\n\n/* set/reset a warning */\nstatic int tcc_set_warning(TCCState *s, const char *warning_name, int value)\n{\n    int i;\n    const FlagDef *p;\n\n    if (!strcmp(warning_name, \"all\")) {\n        for(i = 0, p = warning_defs; i < countof(warning_defs); i++, p++) {\n            if (p->flags & WD_ALL)\n                *(int *)((uint8_t *)s + p->offset) = 1;\n        }\n        return 0;\n    } else {\n        return set_flag(s, warning_defs, countof(warning_defs),\n                        warning_name, value);\n    }\n}\n\nstatic const FlagDef flag_defs[] = {\n    { offsetof(TCCState, char_is_unsigned), 0, \"unsigned-char\" },\n    { offsetof(TCCState, char_is_unsigned), FD_INVERT, \"signed-char\" },\n    { offsetof(TCCState, nocommon), FD_INVERT, \"common\" },\n    { offsetof(TCCState, leading_underscore), 0, \"leading-underscore\" },\n};\n\n/* set/reset a flag */\nstatic int tcc_set_flag(TCCState *s, const char *flag_name, int value)\n{\n    return set_flag(s, flag_defs, countof(flag_defs),\n                    flag_name, value);\n}\n\n\nstatic int strstart(const char *val, const char **str)\n{\n    const char *p, *q;\n    p = *str;\n    q = val;\n    while (*q) {\n        if (*p != *q)\n            return 0;\n        p++;\n        q++;\n    }\n    *str = p;\n    return 1;\n}\n\n/* Like strstart, but automatically takes into account that ld options can\n *\n * - start with double or single dash (e.g. '--soname' or '-soname')\n * - arguments can be given as separate or after '=' (e.g. '-Wl,-soname,x.so'\n *   or '-Wl,-soname=x.so')\n *\n * you provide `val` always in 'option[=]' form (no leading -)\n */\nstatic int link_option(const char *str, const char *val, const char **ptr)\n{\n    const char *p, *q;\n\n    /* there should be 1 or 2 dashes */\n    if (*str++ != '-')\n        return 0;\n    if (*str == '-')\n        str++;\n\n    /* then str & val should match (potentialy up to '=') */\n    p = str;\n    q = val;\n\n    while (*q != '\\0' && *q != '=') {\n        if (*p != *q)\n            return 0;\n        p++;\n        q++;\n    }\n\n    /* '=' near eos means ',' or '=' is ok */\n    if (*q == '=') {\n        if (*p != ',' && *p != '=')\n            return 0;\n        p++;\n        q++;\n    }\n\n    if (ptr)\n        *ptr = p;\n    return 1;\n}\n\nstatic const char *skip_linker_arg(const char **str)\n{\n    const char *s1 = *str;\n    const char *s2 = strchr(s1, ',');\n    *str = s2 ? s2++ : (s2 = s1 + strlen(s1));\n    return s2;\n}\n\nstatic char *copy_linker_arg(const char *p)\n{\n    const char *q = p;\n    skip_linker_arg(&q);\n    return pstrncpy(tcc_malloc(q - p + 1), p, q - p);\n}\n\n/* set linker options */\nstatic int tcc_set_linker(TCCState *s, const char *option)\n{\n    while (option && *option) {\n\n        const char *p = option;\n        char *end = NULL;\n        int ignoring = 0;\n\n        if (link_option(option, \"Bsymbolic\", &p)) {\n            s->symbolic = 1;\n        } else if (link_option(option, \"nostdlib\", &p)) {\n            s->nostdlib = 1;\n        } else if (link_option(option, \"fini=\", &p)) {\n            s->fini_symbol = copy_linker_arg(p);\n            ignoring = 1;\n        } else if (link_option(option, \"image-base=\", &p)\n                || link_option(option, \"Ttext=\", &p)) {\n            s->text_addr = strtoull(p, &end, 16);\n            s->has_text_addr = 1;\n        } else if (link_option(option, \"init=\", &p)) {\n            s->init_symbol = copy_linker_arg(p);\n            ignoring = 1;\n        } else if (link_option(option, \"oformat=\", &p)) {\n#if defined(TCC_TARGET_PE)\n            if (strstart(\"pe-\", &p)) {\n#elif defined(TCC_TARGET_X86_64)\n            if (strstart(\"elf64-\", &p)) {\n#else\n            if (strstart(\"elf32-\", &p)) {\n#endif\n                s->output_format = TCC_OUTPUT_FORMAT_ELF;\n            } else if (!strcmp(p, \"binary\")) {\n                s->output_format = TCC_OUTPUT_FORMAT_BINARY;\n#ifdef TCC_TARGET_COFF\n            } else if (!strcmp(p, \"coff\")) {\n                s->output_format = TCC_OUTPUT_FORMAT_COFF;\n#endif\n            } else\n                goto err;\n\n        } else if (link_option(option, \"rpath=\", &p)) {\n            s->rpath = copy_linker_arg(p);\n        } else if (link_option(option, \"section-alignment=\", &p)) {\n            s->section_align = strtoul(p, &end, 16);\n        } else if (link_option(option, \"soname=\", &p)) {\n            s->soname = copy_linker_arg(p);\n#ifdef TCC_TARGET_PE\n        } else if (link_option(option, \"file-alignment=\", &p)) {\n            s->pe_file_align = strtoul(p, &end, 16);\n        } else if (link_option(option, \"stack=\", &p)) {\n            s->pe_stack_size = strtoul(p, &end, 10);\n        } else if (link_option(option, \"subsystem=\", &p)) {\n#if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)\n            if (!strcmp(p, \"native\")) {\n                s->pe_subsystem = 1;\n            } else if (!strcmp(p, \"console\")) {\n                s->pe_subsystem = 3;\n            } else if (!strcmp(p, \"gui\")) {\n                s->pe_subsystem = 2;\n            } else if (!strcmp(p, \"posix\")) {\n                s->pe_subsystem = 7;\n            } else if (!strcmp(p, \"efiapp\")) {\n                s->pe_subsystem = 10;\n            } else if (!strcmp(p, \"efiboot\")) {\n                s->pe_subsystem = 11;\n            } else if (!strcmp(p, \"efiruntime\")) {\n                s->pe_subsystem = 12;\n            } else if (!strcmp(p, \"efirom\")) {\n                s->pe_subsystem = 13;\n#elif defined(TCC_TARGET_ARM)\n            if (!strcmp(p, \"wince\")) {\n                s->pe_subsystem = 9;\n#endif\n            } else\n                goto err;\n#endif\n        } else\n            goto err;\n\n        if (ignoring && s->warn_unsupported) err: {\n            char buf[100], *e;\n            pstrcpy(buf, sizeof buf, e = copy_linker_arg(option)), tcc_free(e);\n            if (ignoring)\n                tcc_warning(\"unsupported linker option '%s'\", buf);\n            else\n                tcc_error(\"unsupported linker option '%s'\", buf);\n        }\n        option = skip_linker_arg(&p);\n    }\n    return 0;\n}\n\ntypedef struct TCCOption {\n    const char *name;\n    uint16_t index;\n    uint16_t flags;\n} TCCOption;\n\nenum {\n    TCC_OPTION_HELP,\n    TCC_OPTION_I,\n    TCC_OPTION_D,\n    TCC_OPTION_U,\n    TCC_OPTION_L,\n    TCC_OPTION_B,\n    TCC_OPTION_l,\n    TCC_OPTION_bench,\n    TCC_OPTION_bt,\n    TCC_OPTION_b,\n    TCC_OPTION_g,\n    TCC_OPTION_c,\n    TCC_OPTION_static,\n    TCC_OPTION_shared,\n    TCC_OPTION_soname,\n    TCC_OPTION_o,\n    TCC_OPTION_r,\n    TCC_OPTION_s,\n    TCC_OPTION_Wl,\n    TCC_OPTION_W,\n    TCC_OPTION_O,\n    TCC_OPTION_m,\n    TCC_OPTION_f,\n    TCC_OPTION_isystem,\n    TCC_OPTION_nostdinc,\n    TCC_OPTION_nostdlib,\n    TCC_OPTION_print_search_dirs,\n    TCC_OPTION_rdynamic,\n    TCC_OPTION_pedantic,\n    TCC_OPTION_pthread,\n    TCC_OPTION_run,\n    TCC_OPTION_v,\n    TCC_OPTION_w,\n    TCC_OPTION_pipe,\n    TCC_OPTION_E,\n    TCC_OPTION_MD,\n    TCC_OPTION_MF,\n    TCC_OPTION_x,\n    TCC_OPTION_dumpversion,\n};\n\n#define TCC_OPTION_HAS_ARG 0x0001\n#define TCC_OPTION_NOSEP   0x0002 /* cannot have space before option and arg */\n\nstatic const TCCOption tcc_options[] = {\n    { \"h\", TCC_OPTION_HELP, 0 },\n    { \"-help\", TCC_OPTION_HELP, 0 },\n    { \"?\", TCC_OPTION_HELP, 0 },\n    { \"I\", TCC_OPTION_I, TCC_OPTION_HAS_ARG },\n    { \"D\", TCC_OPTION_D, TCC_OPTION_HAS_ARG },\n    { \"U\", TCC_OPTION_U, TCC_OPTION_HAS_ARG },\n    { \"L\", TCC_OPTION_L, TCC_OPTION_HAS_ARG },\n    { \"B\", TCC_OPTION_B, TCC_OPTION_HAS_ARG },\n    { \"l\", TCC_OPTION_l, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"bench\", TCC_OPTION_bench, 0 },\n#ifdef CONFIG_TCC_BACKTRACE\n    { \"bt\", TCC_OPTION_bt, TCC_OPTION_HAS_ARG },\n#endif\n#ifdef CONFIG_TCC_BCHECK\n    { \"b\", TCC_OPTION_b, 0 },\n#endif\n    { \"g\", TCC_OPTION_g, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"c\", TCC_OPTION_c, 0 },\n    { \"static\", TCC_OPTION_static, 0 },\n    { \"shared\", TCC_OPTION_shared, 0 },\n    { \"soname\", TCC_OPTION_soname, TCC_OPTION_HAS_ARG },\n    { \"o\", TCC_OPTION_o, TCC_OPTION_HAS_ARG },\n    { \"pedantic\", TCC_OPTION_pedantic, 0},\n    { \"pthread\", TCC_OPTION_pthread, 0},\n    { \"run\", TCC_OPTION_run, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"rdynamic\", TCC_OPTION_rdynamic, 0 },\n    { \"r\", TCC_OPTION_r, 0 },\n    { \"s\", TCC_OPTION_s, 0 },\n    { \"Wl,\", TCC_OPTION_Wl, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"W\", TCC_OPTION_W, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"O\", TCC_OPTION_O, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"m\", TCC_OPTION_m, TCC_OPTION_HAS_ARG },\n    { \"f\", TCC_OPTION_f, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"isystem\", TCC_OPTION_isystem, TCC_OPTION_HAS_ARG },\n    { \"nostdinc\", TCC_OPTION_nostdinc, 0 },\n    { \"nostdlib\", TCC_OPTION_nostdlib, 0 },\n    { \"print-search-dirs\", TCC_OPTION_print_search_dirs, 0 }, \n    { \"v\", TCC_OPTION_v, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },\n    { \"w\", TCC_OPTION_w, 0 },\n    { \"pipe\", TCC_OPTION_pipe, 0},\n    { \"E\", TCC_OPTION_E, 0},\n    { \"MD\", TCC_OPTION_MD, 0},\n    { \"MF\", TCC_OPTION_MF, TCC_OPTION_HAS_ARG },\n    { \"x\", TCC_OPTION_x, TCC_OPTION_HAS_ARG },\n    { \"dumpversion\", TCC_OPTION_dumpversion, 0},\n    { NULL, 0, 0 },\n};\n\nstatic void parse_option_D(TCCState *s1, const char *optarg)\n{\n    char *sym = tcc_strdup(optarg);\n    char *value = strchr(sym, '=');\n    if (value)\n        *value++ = '\\0';\n    tcc_define_symbol(s1, sym, value);\n    tcc_free(sym);\n}\n\nPUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv)\n{\n    const TCCOption *popt;\n    const char *optarg, *r;\n    int run = 0;\n    int pthread = 0;\n    int optind = 0;\n\n    /* collect -Wl options for input such as \"-Wl,-rpath -Wl,<path>\" */\n    CString linker_arg;\n    cstr_new(&linker_arg);\n\n    while (optind < argc) {\n\n        r = argv[optind++];\n        if (r[0] != '-' || r[1] == '\\0') {\n            /* add a new file */\n            dynarray_add((void ***)&s->files, &s->nb_files, tcc_strdup(r));\n            if (run) {\n                optind--;\n                /* argv[0] will be this file */\n                break;\n            }\n            continue;\n        }\n\n        /* find option in table */\n        for(popt = tcc_options; ; ++popt) {\n            const char *p1 = popt->name;\n            const char *r1 = r + 1;\n            if (p1 == NULL)\n                tcc_error(\"invalid option -- '%s'\", r);\n            if (!strstart(p1, &r1))\n                continue;\n            optarg = r1;\n            if (popt->flags & TCC_OPTION_HAS_ARG) {\n                if (*r1 == '\\0' && !(popt->flags & TCC_OPTION_NOSEP)) {\n                    if (optind >= argc)\n                        tcc_error(\"argument to '%s' is missing\", r);\n                    optarg = argv[optind++];\n                }\n            } else if (*r1 != '\\0')\n                continue;\n            break;\n        }\n\n        switch(popt->index) {\n        case TCC_OPTION_HELP:\n            return 0;\n        case TCC_OPTION_I:\n            if (tcc_add_include_path(s, optarg) < 0)\n                tcc_error(\"too many include paths\");\n            break;\n        case TCC_OPTION_D:\n            parse_option_D(s, optarg);\n            break;\n        case TCC_OPTION_U:\n            tcc_undefine_symbol(s, optarg);\n            break;\n        case TCC_OPTION_L:\n            tcc_add_library_path(s, optarg);\n            break;\n        case TCC_OPTION_B:\n            /* set tcc utilities path (mainly for tcc development) */\n            tcc_set_lib_path(s, optarg);\n            break;\n        case TCC_OPTION_l:\n            dynarray_add((void ***)&s->files, &s->nb_files, tcc_strdup(r));\n            s->nb_libraries++;\n            break;\n        case TCC_OPTION_pthread:\n            parse_option_D(s, \"_REENTRANT\");\n            pthread = 1;\n            break;\n        case TCC_OPTION_bench:\n            s->do_bench = 1;\n            break;\n#ifdef CONFIG_TCC_BACKTRACE\n        case TCC_OPTION_bt:\n            tcc_set_num_callers(atoi(optarg));\n            break;\n#endif\n#ifdef CONFIG_TCC_BCHECK\n        case TCC_OPTION_b:\n            s->do_bounds_check = 1;\n            s->do_debug = 1;\n            break;\n#endif\n        case TCC_OPTION_g:\n            s->do_debug = 1;\n            break;\n        case TCC_OPTION_c:\n            s->output_type = TCC_OUTPUT_OBJ;\n            break;\n        case TCC_OPTION_static:\n            s->static_link = 1;\n            break;\n        case TCC_OPTION_shared:\n            s->output_type = TCC_OUTPUT_DLL;\n            break;\n        case TCC_OPTION_soname:\n            s->soname = tcc_strdup(optarg);\n            break;\n        case TCC_OPTION_m:\n            s->option_m = tcc_strdup(optarg);\n            break;\n        case TCC_OPTION_o:\n            s->outfile = tcc_strdup(optarg);\n            break;\n        case TCC_OPTION_r:\n            /* generate a .o merging several output files */\n            s->option_r = 1;\n            s->output_type = TCC_OUTPUT_OBJ;\n            break;\n        case TCC_OPTION_isystem:\n            tcc_add_sysinclude_path(s, optarg);\n            break;\n        case TCC_OPTION_nostdinc:\n            s->nostdinc = 1;\n            break;\n        case TCC_OPTION_nostdlib:\n            s->nostdlib = 1;\n            break;\n        case TCC_OPTION_print_search_dirs:\n            s->print_search_dirs = 1;\n            break;\n        case TCC_OPTION_run:\n            s->output_type = TCC_OUTPUT_MEMORY;\n            tcc_set_options(s, optarg);\n            run = 1;\n            break;\n        case TCC_OPTION_v:\n            do ++s->verbose; while (*optarg++ == 'v');\n            break;\n        case TCC_OPTION_f:\n            if (tcc_set_flag(s, optarg, 1) < 0 && s->warn_unsupported)\n                goto unsupported_option;\n            break;\n        case TCC_OPTION_W:\n            if (tcc_set_warning(s, optarg, 1) < 0 && \n                s->warn_unsupported)\n                goto unsupported_option;\n            break;\n        case TCC_OPTION_w:\n            s->warn_none = 1;\n            break;\n        case TCC_OPTION_rdynamic:\n            s->rdynamic = 1;\n            break;\n        case TCC_OPTION_Wl:\n            if (linker_arg.size)\n                --linker_arg.size, cstr_ccat(&linker_arg, ',');\n            cstr_cat(&linker_arg, optarg);\n            cstr_ccat(&linker_arg, '\\0');\n            break;\n        case TCC_OPTION_E:\n            s->output_type = TCC_OUTPUT_PREPROCESS;\n            break;\n        case TCC_OPTION_MD:\n            s->gen_deps = 1;\n            break;\n        case TCC_OPTION_MF:\n            s->deps_outfile = tcc_strdup(optarg);\n            break;\n        case TCC_OPTION_dumpversion:\n            printf (\"%s\\n\", TCC_VERSION);\n            exit(0);\n        case TCC_OPTION_O:\n        case TCC_OPTION_pedantic:\n        case TCC_OPTION_pipe:\n        case TCC_OPTION_s:\n        case TCC_OPTION_x:\n            /* ignored */\n            break;\n        default:\n            if (s->warn_unsupported) {\n            unsupported_option:\n                tcc_warning(\"unsupported option '%s'\", r);\n            }\n            break;\n        }\n    }\n\n    if (pthread && s->output_type != TCC_OUTPUT_OBJ)\n        tcc_set_options(s, \"-lpthread\");\n\n    tcc_set_linker(s, (const char *)linker_arg.data);\n    cstr_free(&linker_arg);\n\n    return optind;\n}\n\nLIBTCCAPI int tcc_set_options(TCCState *s, const char *str)\n{\n    const char *s1;\n    char **argv, *arg;\n    int argc, len;\n    int ret;\n\n    argc = 0, argv = NULL;\n    for(;;) {\n        while (is_space(*str))\n            str++;\n        if (*str == '\\0')\n            break;\n        s1 = str;\n        while (*str != '\\0' && !is_space(*str))\n            str++;\n        len = str - s1;\n        arg = tcc_malloc(len + 1);\n        pstrncpy(arg, s1, len);\n        dynarray_add((void ***)&argv, &argc, arg);\n    }\n    ret = tcc_parse_args(s, argc, argv);\n    dynarray_reset(&argv, &argc);\n    return ret;\n}\n\nPUB_FUNC void tcc_print_stats(TCCState *s, int64_t total_time)\n{\n    double tt;\n    tt = (double)total_time / 1000000.0;\n    if (tt < 0.001)\n        tt = 0.001;\n    if (total_bytes < 1)\n        total_bytes = 1;\n    printf(\"%d idents, %d lines, %d bytes, %0.3f s, %d lines/s, %0.1f MB/s\\n\", \n           tok_ident - TOK_IDENT, total_lines, total_bytes,\n           tt, (int)(total_lines / tt),\n           total_bytes / tt / 1000000.0);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/libtcc.h",
    "content": "#ifndef LIBTCC_H\n#define LIBTCC_H\n\n#ifndef LIBTCCAPI\n# define LIBTCCAPI\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct TCCState;\n\ntypedef struct TCCState TCCState;\n\n/* create a new TCC compilation context */\nLIBTCCAPI TCCState *tcc_new(void);\n\n/* free a TCC compilation context */\nLIBTCCAPI void tcc_delete(TCCState *s);\n\n/* set CONFIG_TCCDIR at runtime */\nLIBTCCAPI void tcc_set_lib_path(TCCState *s, const char *path);\n\n/* set error/warning display callback */\nLIBTCCAPI void tcc_set_error_func(TCCState *s, void *error_opaque,\n    void (*error_func)(void *opaque, const char *msg));\n\n/* set options as from command line (multiple supported) */\nLIBTCCAPI int tcc_set_options(TCCState *s, const char *str);\n\n/*****************************/\n/* preprocessor */\n\n/* add include path */\nLIBTCCAPI int tcc_add_include_path(TCCState *s, const char *pathname);\n\n/* add in system include path */\nLIBTCCAPI int tcc_add_sysinclude_path(TCCState *s, const char *pathname);\n\n/* define preprocessor symbol 'sym'. Can put optional value */\nLIBTCCAPI void tcc_define_symbol(TCCState *s, const char *sym, const char *value);\n\n/* undefine preprocess symbol 'sym' */\nLIBTCCAPI void tcc_undefine_symbol(TCCState *s, const char *sym);\n\n/*****************************/\n/* compiling */\n\n/* add a file (C file, dll, object, library, ld script). Return -1 if error. */\nLIBTCCAPI int tcc_add_file(TCCState *s, const char *filename);\n\n/* compile a string containing a C source. Return -1 if error. */\nLIBTCCAPI int tcc_compile_string(TCCState *s, const char *buf);\n\n/*****************************/\n/* linking commands */\n\n/* set output type. MUST BE CALLED before any compilation */\nLIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type);\n#define TCC_OUTPUT_MEMORY   0 /* output will be run in memory (default) */\n#define TCC_OUTPUT_EXE      1 /* executable file */\n#define TCC_OUTPUT_DLL      2 /* dynamic library */\n#define TCC_OUTPUT_OBJ      3 /* object file */\n#define TCC_OUTPUT_PREPROCESS 4 /* only preprocess (used internally) */\n\n/* equivalent to -Lpath option */\nLIBTCCAPI int tcc_add_library_path(TCCState *s, const char *pathname);\n\n/* the library name is the same as the argument of the '-l' option */\nLIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname);\n\n/* add a symbol to the compiled program */\nLIBTCCAPI int tcc_add_symbol(TCCState *s, const char *name, const void *val);\n\n/* output an executable, library or object file. DO NOT call\n   tcc_relocate() before. */\nLIBTCCAPI int tcc_output_file(TCCState *s, const char *filename);\n\n/* link and run main() function and return its value. DO NOT call\n   tcc_relocate() before. */\nLIBTCCAPI int tcc_run(TCCState *s, int argc, char **argv);\n\n/* do all relocations (needed before using tcc_get_symbol()) */\nLIBTCCAPI int tcc_relocate(TCCState *s1, void *ptr);\n/* possible values for 'ptr':\n   - TCC_RELOCATE_AUTO : Allocate and manage memory internally\n   - NULL              : return required memory size for the step below\n   - memory address    : copy code to memory passed by the caller\n   returns -1 if error. */\n#define TCC_RELOCATE_AUTO (void*)1\n\n/* return symbol value or NULL if not found */\nLIBTCCAPI void *tcc_get_symbol(TCCState *s, const char *name);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/stab.def",
    "content": "/* Table of DBX symbol codes for the GNU system.\n   Copyright (C) 1988, 1997 Free Software Foundation, Inc.\n   This file is part of the GNU C Library.\n\n   The GNU C Library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Library General Public License as\n   published by the Free Software Foundation; either version 2 of the\n   License, or (at your option) any later version.\n\n   The GNU C Library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Library General Public License for more details.\n\n   You should have received a copy of the GNU Library General Public\n   License along with the GNU C Library; see the file COPYING.LIB.  If not,\n   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n   Boston, MA 02111-1307, USA.  */\n\n/* This contains contribution from Cygnus Support.  */\n\f\n/* Global variable.  Only the name is significant.\n   To find the address, look in the corresponding external symbol.  */\n__define_stab (N_GSYM, 0x20, \"GSYM\")\n\n/* Function name for BSD Fortran.  Only the name is significant.\n   To find the address, look in the corresponding external symbol.  */\n__define_stab (N_FNAME, 0x22, \"FNAME\")\n\n/* Function name or text-segment variable for C.  Value is its address.\n   Desc is supposedly starting line number, but GCC doesn't set it\n   and DBX seems not to miss it.  */\n__define_stab (N_FUN, 0x24, \"FUN\")\n\n/* Data-segment variable with internal linkage.  Value is its address.\n   \"Static Sym\".  */\n__define_stab (N_STSYM, 0x26, \"STSYM\")\n\n/* BSS-segment variable with internal linkage.  Value is its address.  */\n__define_stab (N_LCSYM, 0x28, \"LCSYM\")\n\n/* Name of main routine.  Only the name is significant.\n   This is not used in C.  */\n__define_stab (N_MAIN, 0x2a, \"MAIN\")\n\n/* Global symbol in Pascal.\n   Supposedly the value is its line number; I'm skeptical.  */\n__define_stab (N_PC, 0x30, \"PC\")\n\n/* Number of symbols:  0, files,,funcs,lines according to Ultrix V4.0. */\n__define_stab (N_NSYMS, 0x32, \"NSYMS\")\n\n/* \"No DST map for sym: name, ,0,type,ignored\"  according to Ultrix V4.0. */\n__define_stab (N_NOMAP, 0x34, \"NOMAP\")\n\n/* New stab from Solaris.  I don't know what it means, but it\n   don't seem to contain useful information.  */\n__define_stab (N_OBJ, 0x38, \"OBJ\")\n\n/* New stab from Solaris.  I don't know what it means, but it\n   don't seem to contain useful information.  Possibly related to the\n   optimization flags used in this module.  */\n__define_stab (N_OPT, 0x3c, \"OPT\")\n\n/* Register variable.  Value is number of register.  */\n__define_stab (N_RSYM, 0x40, \"RSYM\")\n\n/* Modula-2 compilation unit.  Can someone say what info it contains?  */\n__define_stab (N_M2C, 0x42, \"M2C\")\n\n/* Line number in text segment.  Desc is the line number;\n   value is corresponding address.  */\n__define_stab (N_SLINE, 0x44, \"SLINE\")\n\n/* Similar, for data segment.  */\n__define_stab (N_DSLINE, 0x46, \"DSLINE\")\n\n/* Similar, for bss segment.  */\n__define_stab (N_BSLINE, 0x48, \"BSLINE\")\n\n/* Sun's source-code browser stabs.  ?? Don't know what the fields are.\n   Supposedly the field is \"path to associated .cb file\".  THIS VALUE\n   OVERLAPS WITH N_BSLINE!  */\n__define_stab (N_BROWS, 0x48, \"BROWS\")\n\n/* GNU Modula-2 definition module dependency.  Value is the modification time\n   of the definition file.  Other is non-zero if it is imported with the\n   GNU M2 keyword %INITIALIZE.  Perhaps N_M2C can be used if there\n   are enough empty fields? */\n__define_stab(N_DEFD, 0x4a, \"DEFD\")\n\n/* THE FOLLOWING TWO STAB VALUES CONFLICT.  Happily, one is for Modula-2\n   and one is for C++.   Still,... */\n/* GNU C++ exception variable.  Name is variable name.  */\n__define_stab (N_EHDECL, 0x50, \"EHDECL\")\n/* Modula2 info \"for imc\":  name,,0,0,0  according to Ultrix V4.0.  */\n__define_stab (N_MOD2, 0x50, \"MOD2\")\n\n/* GNU C++ `catch' clause.  Value is its address.  Desc is nonzero if\n   this entry is immediately followed by a CAUGHT stab saying what exception\n   was caught.  Multiple CAUGHT stabs means that multiple exceptions\n   can be caught here.  If Desc is 0, it means all exceptions are caught\n   here.  */\n__define_stab (N_CATCH, 0x54, \"CATCH\")\n\n/* Structure or union element.  Value is offset in the structure.  */\n__define_stab (N_SSYM, 0x60, \"SSYM\")\n\n/* Name of main source file.\n   Value is starting text address of the compilation.  */\n__define_stab (N_SO, 0x64, \"SO\")\n\n/* Automatic variable in the stack.  Value is offset from frame pointer.\n   Also used for type descriptions.  */\n__define_stab (N_LSYM, 0x80, \"LSYM\")\n\n/* Beginning of an include file.  Only Sun uses this.\n   In an object file, only the name is significant.\n   The Sun linker puts data into some of the other fields.  */\n__define_stab (N_BINCL, 0x82, \"BINCL\")\n\n/* Name of sub-source file (#include file).\n   Value is starting text address of the compilation.  */\n__define_stab (N_SOL, 0x84, \"SOL\")\n\n/* Parameter variable.  Value is offset from argument pointer.\n   (On most machines the argument pointer is the same as the frame pointer.  */\n__define_stab (N_PSYM, 0xa0, \"PSYM\")\n\n/* End of an include file.  No name.\n   This and N_BINCL act as brackets around the file's output.\n   In an object file, there is no significant data in this entry.\n   The Sun linker puts data into some of the fields.  */\n__define_stab (N_EINCL, 0xa2, \"EINCL\")\n\n/* Alternate entry point.  Value is its address.  */\n__define_stab (N_ENTRY, 0xa4, \"ENTRY\")\n\n/* Beginning of lexical block.\n   The desc is the nesting level in lexical blocks.\n   The value is the address of the start of the text for the block.\n   The variables declared inside the block *precede* the N_LBRAC symbol.  */\n__define_stab (N_LBRAC, 0xc0, \"LBRAC\")\n\n/* Place holder for deleted include file.  Replaces a N_BINCL and everything\n   up to the corresponding N_EINCL.  The Sun linker generates these when\n   it finds multiple identical copies of the symbols from an include file.\n   This appears only in output from the Sun linker.  */\n__define_stab (N_EXCL, 0xc2, \"EXCL\")\n\n/* Modula-2 scope information.  Can someone say what info it contains?  */\n__define_stab (N_SCOPE, 0xc4, \"SCOPE\")\n\n/* End of a lexical block.  Desc matches the N_LBRAC's desc.\n   The value is the address of the end of the text for the block.  */\n__define_stab (N_RBRAC, 0xe0, \"RBRAC\")\n\n/* Begin named common block.  Only the name is significant.  */\n__define_stab (N_BCOMM, 0xe2, \"BCOMM\")\n\n/* End named common block.  Only the name is significant\n   (and it should match the N_BCOMM).  */\n__define_stab (N_ECOMM, 0xe4, \"ECOMM\")\n\n/* End common (local name): value is address.\n   I'm not sure how this is used.  */\n__define_stab (N_ECOML, 0xe8, \"ECOML\")\n\n/* These STAB's are used on Gould systems for Non-Base register symbols\n   or something like that.  FIXME.  I have assigned the values at random\n   since I don't have a Gould here.  Fixups from Gould folk welcome... */\n__define_stab (N_NBTEXT, 0xF0, \"NBTEXT\")\n__define_stab (N_NBDATA, 0xF2, \"NBDATA\")\n__define_stab (N_NBBSS,  0xF4, \"NBBSS\")\n__define_stab (N_NBSTS,  0xF6, \"NBSTS\")\n__define_stab (N_NBLCS,  0xF8, \"NBLCS\")\n\n/* Second symbol entry containing a length-value for the preceding entry.\n   The value is the length.  */\n__define_stab (N_LENG, 0xfe, \"LENG\")\n\f\n/* The above information, in matrix format.\n\n\t\t\tSTAB MATRIX\n\t_________________________________________________\n\t| 00 - 1F are not dbx stab symbols\t\t|\n\t| In most cases, the low bit is the EXTernal bit|\n\n\t| 00 UNDEF  | 02 ABS\t| 04 TEXT   | 06 DATA\t|\n\t| 01  |EXT  | 03  |EXT\t| 05  |EXT  | 07  |EXT\t|\n\n\t| 08 BSS    | 0A INDR\t| 0C FN_SEQ | 0E   \t|\n\t| 09  |EXT  | 0B \t| 0D\t    | 0F\t|\n\n\t| 10 \t    | 12 COMM\t| 14 SETA   | 16 SETT\t|\n\t| 11\t    | 13\t| 15 \t    | 17\t|\n\n\t| 18 SETD   | 1A SETB\t| 1C SETV   | 1E WARNING|\n\t| 19\t    | 1B\t| 1D \t    | 1F FN\t|\n\n\t|_______________________________________________|\n\t| Debug entries with bit 01 set are unused.\t|\n\t| 20 GSYM   | 22 FNAME\t| 24 FUN    | 26 STSYM\t|\n\t| 28 LCSYM  | 2A MAIN\t| 2C\t    | 2E\t|\n\t| 30 PC\t    | 32 NSYMS\t| 34 NOMAP  | 36\t|\n\t| 38 OBJ    | 3A\t| 3C OPT    | 3E\t|\n\t| 40 RSYM   | 42 M2C\t| 44 SLINE  | 46 DSLINE |\n\t| 48 BSLINE*| 4A DEFD\t| 4C        | 4E\t|\n\t| 50 EHDECL*| 52\t| 54 CATCH  | 56        |\n\t| 58        | 5A        | 5C        | 5E\t|\n\t| 60 SSYM   | 62\t| 64 SO\t    | 66 \t|\n\t| 68 \t    | 6A\t| 6C\t    | 6E\t|\n\t| 70\t    | 72\t| 74\t    | 76\t|\n\t| 78\t    | 7A\t| 7C\t    | 7E\t|\n\t| 80 LSYM   | 82 BINCL\t| 84 SOL    | 86\t|\n\t| 88\t    | 8A\t| 8C\t    | 8E\t|\n\t| 90\t    | 92\t| 94\t    | 96\t|\n\t| 98\t    | 9A\t| 9C\t    | 9E\t|\n\t| A0 PSYM   | A2 EINCL\t| A4 ENTRY  | A6\t|\n\t| A8\t    | AA\t| AC\t    | AE\t|\n\t| B0\t    | B2\t| B4\t    | B6\t|\n\t| B8\t    | BA\t| BC\t    | BE\t|\n\t| C0 LBRAC  | C2 EXCL\t| C4 SCOPE  | C6\t|\n\t| C8\t    | CA\t| CC\t    | CE\t|\n\t| D0\t    | D2\t| D4\t    | D6\t|\n\t| D8\t    | DA\t| DC\t    | DE\t|\n\t| E0 RBRAC  | E2 BCOMM\t| E4 ECOMM  | E6\t|\n\t| E8 ECOML  | EA\t| EC\t    | EE\t|\n\t| F0\t    | F2\t| F4\t    | F6\t|\n\t| F8\t    | FA\t| FC\t    | FE LENG\t|\n\t+-----------------------------------------------+\n * 50 EHDECL is also MOD2.\n * 48 BSLINE is also BROWS.\n */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/stab.h",
    "content": "#ifndef __GNU_STAB__\n\n/* Indicate the GNU stab.h is in use.  */\n\n#define __GNU_STAB__\n\n#define __define_stab(NAME, CODE, STRING) NAME=CODE,\n\nenum __stab_debug_code\n{\n#include \"stab.def\"\nLAST_UNUSED_STAB_CODE\n};\n\n#undef __define_stab\n\n#endif /* __GNU_STAB_ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tcc-doc.texi",
    "content": "\\input texinfo @c -*- texinfo -*-\n@c %**start of header\n@setfilename tcc-doc.info\n@settitle Tiny C Compiler Reference Documentation\n@dircategory Software development\n@direntry\n* TCC: (tcc-doc).               The Tiny C Compiler.\n@end direntry\n@c %**end of header\n\n@include config.texi\n\n@iftex\n@titlepage\n@afourpaper\n@sp 7\n@center @titlefont{Tiny C Compiler Reference Documentation}\n@sp 3\n@end titlepage\n@headings double\n@end iftex\n\n@contents\n\n@node Top, Introduction, (dir), (dir)\n@top Tiny C Compiler Reference Documentation\n\nThis manual documents version @value{VERSION} of the Tiny C Compiler.\n\n@menu\n* Introduction::                Introduction to tcc.\n* Invoke::                      Invocation of tcc (command line, options).\n* Clang::                       ANSI C and extensions.\n* asm::                         Assembler syntax.\n* linker::                      Output file generation and supported targets.\n* Bounds::                      Automatic bounds-checking of C code.\n* Libtcc::                      The libtcc library.\n* devel::                       Guide for Developers.\n@end menu\n\n\n@node Introduction\n@chapter Introduction\n\nTinyCC (aka TCC) is a small but hyper fast C compiler. Unlike other C\ncompilers, it is meant to be self-relying: you do not need an\nexternal assembler or linker because TCC does that for you.\n\nTCC compiles so @emph{fast} that even for big projects @code{Makefile}s may\nnot be necessary.\n\nTCC not only supports ANSI C, but also most of the new ISO C99\nstandard and many GNUC extensions including inline assembly.\n\nTCC can also be used to make @emph{C scripts}, i.e. pieces of C source\nthat you run as a Perl or Python script. Compilation is so fast that\nyour script will be as fast as if it was an executable.\n\nTCC can also automatically generate memory and bound checks\n(@pxref{Bounds}) while allowing all C pointers operations. TCC can do\nthese checks even if non patched libraries are used.\n\nWith @code{libtcc}, you can use TCC as a backend for dynamic code\ngeneration (@pxref{Libtcc}).\n\nTCC mainly supports the i386 target on Linux and Windows. There are alpha\nports for the ARM (@code{arm-tcc}) and the TMS320C67xx targets\n(@code{c67-tcc}). More information about the ARM port is available at\n@url{http://lists.gnu.org/archive/html/tinycc-devel/2003-10/msg00044.html}.\n\nFor usage on Windows, see also @url{tcc-win32.txt}.\n\n@node Invoke\n@chapter Command line invocation\n\n@section Quick start\n\n@example\n@c man begin SYNOPSIS\nusage: tcc [options] [@var{infile1} @var{infile2}@dots{}] [@option{-run} @var{infile} @var{args}@dots{}]\n@c man end\n@end example\n\n@noindent\n@c man begin DESCRIPTION\nTCC options are a very much like gcc options. The main difference is that TCC\ncan also execute directly the resulting program and give it runtime\narguments.\n\nHere are some examples to understand the logic:\n\n@table @code\n@item @samp{tcc -run a.c}\nCompile @file{a.c} and execute it directly\n\n@item @samp{tcc -run a.c arg1}\nCompile a.c and execute it directly. arg1 is given as first argument to\nthe @code{main()} of a.c.\n\n@item @samp{tcc a.c -run b.c arg1}\nCompile @file{a.c} and @file{b.c}, link them together and execute them. arg1 is given\nas first argument to the @code{main()} of the resulting program. \n@ignore \nBecause multiple C files are specified, @option{--} are necessary to clearly \nseparate the program arguments from the TCC options.\n@end ignore\n\n@item @samp{tcc -o myprog a.c b.c}\nCompile @file{a.c} and @file{b.c}, link them and generate the executable @file{myprog}.\n\n@item @samp{tcc -o myprog a.o b.o}\nlink @file{a.o} and @file{b.o} together and generate the executable @file{myprog}.\n\n@item @samp{tcc -c a.c}\nCompile @file{a.c} and generate object file @file{a.o}.\n\n@item @samp{tcc -c asmfile.S}\nPreprocess with C preprocess and assemble @file{asmfile.S} and generate\nobject file @file{asmfile.o}.\n\n@item @samp{tcc -c asmfile.s}\nAssemble (but not preprocess) @file{asmfile.s} and generate object file\n@file{asmfile.o}.\n\n@item @samp{tcc -r -o ab.o a.c b.c}\nCompile @file{a.c} and @file{b.c}, link them together and generate the object file @file{ab.o}.\n\n@end table\n\nScripting:\n\nTCC can be invoked from @emph{scripts}, just as shell scripts. You just\nneed to add @code{#!/usr/local/bin/tcc -run} at the start of your C source:\n\n@example\n#!/usr/local/bin/tcc -run\n#include <stdio.h>\n\nint main() \n@{\n    printf(\"Hello World\\n\");\n    return 0;\n@}\n@end example\n\nTCC can read C source code from @emph{standard input} when @option{-} is used in \nplace of @option{infile}. Example:\n\n@example\necho 'main()@{puts(\"hello\");@}' | tcc -run -\n@end example\n@c man end\n\n@section Option summary\n\nGeneral Options:\n\n@c man begin OPTIONS\n@table @option\n@item -c\nGenerate an object file.\n\n@item -o outfile\nPut object file, executable, or dll into output file @file{outfile}.\n\n@item -run source [args...]\nCompile file @var{source} and run it with the command line arguments\n@var{args}. In order to be able to give more than one argument to a\nscript, several TCC options can be given @emph{after} the\n@option{-run} option, separated by spaces:\n@example\ntcc \"-run -L/usr/X11R6/lib -lX11\" ex4.c\n@end example\nIn a script, it gives the following header:\n@example\n#!/usr/local/bin/tcc -run -L/usr/X11R6/lib -lX11\n@end example\n\n@item -dumpversion\nPrint only the compiler version and nothing else.\n\n@item -v\nDisplay TCC version.\n\n@item -vv\nShow included files.  As sole argument, print search dirs (as below).\n\n@item -bench\nDisplay compilation statistics.\n\n@item -print-search-dirs\nPrint the configured installation directory and a list of library\nand include directories tcc will search.\n\n@end table\n\nPreprocessor options:\n\n@table @option\n@item -Idir\nSpecify an additional include path. Include paths are searched in the\norder they are specified.\n\nSystem include paths are always searched after. The default system\ninclude paths are: @file{/usr/local/include}, @file{/usr/include}\nand @file{PREFIX/lib/tcc/include}. (@file{PREFIX} is usually\n@file{/usr} or @file{/usr/local}).\n\n@item -Dsym[=val]\nDefine preprocessor symbol @samp{sym} to\nval. If val is not present, its value is @samp{1}. Function-like macros can\nalso be defined: @option{-DF(a)=a+1}\n\n@item -Usym\nUndefine preprocessor symbol @samp{sym}.\n@end table\n\nCompilation flags:\n\nNote: each of the following warning options has a negative form beginning with\n@option{-fno-}.\n\n@table @option\n@item -funsigned-char\nLet the @code{char} type be unsigned.\n\n@item -fsigned-char\nLet the @code{char} type be signed.\n\n@item -fno-common\nDo not generate common symbols for uninitialized data.\n\n@item -fleading-underscore\nAdd a leading underscore at the beginning of each C symbol.\n\n@end table\n\nWarning options:\n\n@table @option\n@item -w\nDisable all warnings.\n\n@end table\n\nNote: each of the following warning options has a negative form beginning with\n@option{-Wno-}.\n\n@table @option\n@item -Wimplicit-function-declaration\nWarn about implicit function declaration.\n\n@item -Wunsupported\nWarn about unsupported GCC features that are ignored by TCC.\n\n@item -Wwrite-strings\nMake string constants be of type @code{const char *} instead of @code{char\n*}.\n\n@item -Werror\nAbort compilation if warnings are issued.\n\n@item -Wall \nActivate all warnings, except @option{-Werror}, @option{-Wunusupported} and\n@option{-Wwrite-strings}.\n\n@end table\n\nLinker options:\n\n@table @option\n@item -Ldir\nSpecify an additional static library path for the @option{-l} option. The\ndefault library paths are @file{/usr/local/lib}, @file{/usr/lib} and @file{/lib}.\n\n@item -lxxx\nLink your program with dynamic library libxxx.so or static library\nlibxxx.a. The library is searched in the paths specified by the\n@option{-L} option.\n\n@item -Bdir\nSet the path where the tcc internal libraries (and include files) can be\nfound (default is @file{PREFIX/lib/tcc}).\n\n@item -shared\nGenerate a shared library instead of an executable.\n\n@item -soname name\nset name for shared library to be used at runtime\n\n@item -static\nGenerate a statically linked executable (default is a shared linked\nexecutable).\n\n@item -rdynamic\nExport global symbols to the dynamic linker. It is useful when a library\nopened with @code{dlopen()} needs to access executable symbols.\n\n@item -r\nGenerate an object file combining all input files.\n\n@item -Wl,-rpath=path\nPut custom seatch path for dynamic libraries into executable.\n\n@item -Wl,--oformat=fmt\nUse @var{fmt} as output format. The supported output formats are:\n@table @code\n@item elf32-i386\nELF output format (default)\n@item binary\nBinary image (only for executable output)\n@item coff\nCOFF output format (only for executable output for TMS320C67xx target)\n@end table\n\n@item -Wl,-subsystem=console/gui/wince/...\nSet type for PE (Windows) executables.\n\n@item -Wl,-[Ttext=# | section-alignment=# | file-alignment=# | image-base=# | stack=#]\nModify executable layout.\n\n@item -Wl,-Bsymbolic\nSet DT_SYMBOLIC tag.\n\n@end table\n\nDebugger options:\n\n@table @option\n@item -g\nGenerate run time debug information so that you get clear run time\nerror messages: @code{ test.c:68: in function 'test5()': dereferencing\ninvalid pointer} instead of the laconic @code{Segmentation\nfault}.\n\n@item -b\nGenerate additional support code to check\nmemory allocations and array/pointer bounds. @option{-g} is implied. Note\nthat the generated code is slower and bigger in this case.\n\nNote: @option{-b} is only available on i386 for the moment.\n\n@item -bt N\nDisplay N callers in stack traces. This is useful with @option{-g} or\n@option{-b}.\n\n@end table\n\nMisc options:\n\n@table @option\n@item -MD\nGenerate makefile fragment with dependencies.\n\n@item -MF depfile\nUse @file{depfile} as output for -MD.\n\n@end table\n\nNote: GCC options @option{-Ox}, @option{-fx} and @option{-mx} are\nignored.\n@c man end\n\n@ignore\n\n@setfilename tcc\n@settitle Tiny C Compiler\n\n@c man begin SEEALSO\ngcc(1)\n@c man end\n\n@c man begin AUTHOR\nFabrice Bellard\n@c man end\n\n@end ignore\n\n@node Clang\n@chapter C language support\n\n@section ANSI C\n\nTCC implements all the ANSI C standard, including structure bit fields\nand floating point numbers (@code{long double}, @code{double}, and\n@code{float} fully supported).\n\n@section ISOC99 extensions\n\nTCC implements many features of the new C standard: ISO C99. Currently\nmissing items are: complex and imaginary numbers and variable length\narrays.\n\nCurrently implemented ISOC99 features:\n\n@itemize\n\n@item 64 bit @code{long long} types are fully supported.\n\n@item The boolean type @code{_Bool} is supported.\n\n@item @code{__func__} is a string variable containing the current\nfunction name.\n\n@item Variadic macros: @code{__VA_ARGS__} can be used for\n   function-like macros:\n@example\n    #define dprintf(level, __VA_ARGS__) printf(__VA_ARGS__)\n@end example\n\n@noindent\n@code{dprintf} can then be used with a variable number of parameters.\n\n@item Declarations can appear anywhere in a block (as in C++).\n\n@item Array and struct/union elements can be initialized in any order by\n  using designators:\n@example\n    struct @{ int x, y; @} st[10] = @{ [0].x = 1, [0].y = 2 @};\n\n    int tab[10] = @{ 1, 2, [5] = 5, [9] = 9@};\n@end example\n    \n@item Compound initializers are supported:\n@example\n    int *p = (int [])@{ 1, 2, 3 @};\n@end example\nto initialize a pointer pointing to an initialized array. The same\nworks for structures and strings.\n\n@item Hexadecimal floating point constants are supported:\n@example\n          double d = 0x1234p10;\n@end example\n\n@noindent\nis the same as writing \n@example\n          double d = 4771840.0;\n@end example\n\n@item @code{inline} keyword is ignored.\n\n@item @code{restrict} keyword is ignored.\n@end itemize\n\n@section GNU C extensions\n\nTCC implements some GNU C extensions:\n\n@itemize\n\n@item array designators can be used without '=': \n@example\n    int a[10] = @{ [0] 1, [5] 2, 3, 4 @};\n@end example\n\n@item Structure field designators can be a label: \n@example\n    struct @{ int x, y; @} st = @{ x: 1, y: 1@};\n@end example\ninstead of\n@example\n    struct @{ int x, y; @} st = @{ .x = 1, .y = 1@};\n@end example\n\n@item @code{\\e} is ASCII character 27.\n\n@item case ranges : ranges can be used in @code{case}s:\n@example\n    switch(a) @{\n    case 1 @dots{} 9:\n          printf(\"range 1 to 9\\n\");\n          break;\n    default:\n          printf(\"unexpected\\n\");\n          break;\n    @}\n@end example\n\n@cindex aligned attribute\n@cindex packed attribute\n@cindex section attribute\n@cindex unused attribute\n@cindex cdecl attribute\n@cindex stdcall attribute\n@cindex regparm attribute\n@cindex dllexport attribute\n\n@item The keyword @code{__attribute__} is handled to specify variable or\nfunction attributes. The following attributes are supported:\n  @itemize\n\n  @item @code{aligned(n)}: align a variable or a structure field to n bytes\n(must be a power of two).\n\n  @item @code{packed}: force alignment of a variable or a structure field to\n  1.\n\n  @item @code{section(name)}: generate function or data in assembly section\nname (name is a string containing the section name) instead of the default\nsection.\n\n  @item @code{unused}: specify that the variable or the function is unused.\n\n  @item @code{cdecl}: use standard C calling convention (default).\n\n  @item @code{stdcall}: use Pascal-like calling convention.\n\n  @item @code{regparm(n)}: use fast i386 calling convention. @var{n} must be\nbetween 1 and 3. The first @var{n} function parameters are respectively put in\nregisters @code{%eax}, @code{%edx} and @code{%ecx}.\n\n  @item @code{dllexport}: export function from dll/executable (win32 only)\n\n  @end itemize\n\nHere are some examples:\n@example\n    int a __attribute__ ((aligned(8), section(\".mysection\")));\n@end example\n\n@noindent\nalign variable @code{a} to 8 bytes and put it in section @code{.mysection}.\n\n@example\n    int my_add(int a, int b) __attribute__ ((section(\".mycodesection\"))) \n    @{\n        return a + b;\n    @}\n@end example\n\n@noindent\ngenerate function @code{my_add} in section @code{.mycodesection}.\n\n@item GNU style variadic macros:\n@example\n    #define dprintf(fmt, args@dots{}) printf(fmt, ## args)\n\n    dprintf(\"no arg\\n\");\n    dprintf(\"one arg %d\\n\", 1);\n@end example\n\n@item @code{__FUNCTION__} is interpreted as C99 @code{__func__} \n(so it has not exactly the same semantics as string literal GNUC\nwhere it is a string literal).\n\n@item The @code{__alignof__} keyword can be used as @code{sizeof} \nto get the alignment of a type or an expression.\n\n@item The @code{typeof(x)} returns the type of @code{x}. \n@code{x} is an expression or a type.\n\n@item Computed gotos: @code{&&label} returns a pointer of type \n@code{void *} on the goto label @code{label}. @code{goto *expr} can be\nused to jump on the pointer resulting from @code{expr}.\n\n@item Inline assembly with asm instruction:\n@cindex inline assembly\n@cindex assembly, inline\n@cindex __asm__\n@example\nstatic inline void * my_memcpy(void * to, const void * from, size_t n)\n@{\nint d0, d1, d2;\n__asm__ __volatile__(\n        \"rep ; movsl\\n\\t\"\n        \"testb $2,%b4\\n\\t\"\n        \"je 1f\\n\\t\"\n        \"movsw\\n\"\n        \"1:\\ttestb $1,%b4\\n\\t\"\n        \"je 2f\\n\\t\"\n        \"movsb\\n\"\n        \"2:\"\n        : \"=&c\" (d0), \"=&D\" (d1), \"=&S\" (d2)\n        :\"0\" (n/4), \"q\" (n),\"1\" ((long) to),\"2\" ((long) from)\n        : \"memory\");\nreturn (to);\n@}\n@end example\n\n@noindent\n@cindex gas\nTCC includes its own x86 inline assembler with a @code{gas}-like (GNU\nassembler) syntax. No intermediate files are generated. GCC 3.x named\noperands are supported.\n\n@item @code{__builtin_types_compatible_p()} and @code{__builtin_constant_p()} \nare supported.\n\n@item @code{#pragma pack} is supported for win32 compatibility.\n\n@end itemize\n\n@section TinyCC extensions\n\n@itemize\n\n@item @code{__TINYC__} is a predefined macro to @code{1} to\nindicate that you use TCC.\n\n@item @code{#!} at the start of a line is ignored to allow scripting.\n\n@item Binary digits can be entered (@code{0b101} instead of\n@code{5}).\n\n@item @code{__BOUNDS_CHECKING_ON} is defined if bound checking is activated.\n\n@end itemize\n\n@node asm\n@chapter TinyCC Assembler\n\nSince version 0.9.16, TinyCC integrates its own assembler. TinyCC\nassembler supports a gas-like syntax (GNU assembler). You can\ndesactivate assembler support if you want a smaller TinyCC executable\n(the C compiler does not rely on the assembler).\n\nTinyCC Assembler is used to handle files with @file{.S} (C\npreprocessed assembler) and @file{.s} extensions. It is also used to\nhandle the GNU inline assembler with the @code{asm} keyword.\n\n@section Syntax\n\nTinyCC Assembler supports most of the gas syntax. The tokens are the\nsame as C.\n\n@itemize\n\n@item C and C++ comments are supported.\n\n@item Identifiers are the same as C, so you cannot use '.' or '$'.\n\n@item Only 32 bit integer numbers are supported.\n\n@end itemize\n\n@section Expressions\n\n@itemize\n\n@item Integers in decimal, octal and hexa are supported.\n\n@item Unary operators: +, -, ~.\n\n@item Binary operators in decreasing priority order:\n\n@enumerate\n@item *, /, %\n@item &, |, ^\n@item +, -\n@end enumerate\n\n@item A value is either an absolute number or a label plus an offset. \nAll operators accept absolute values except '+' and '-'. '+' or '-' can be\nused to add an offset to a label. '-' supports two labels only if they\nare the same or if they are both defined and in the same section.\n\n@end itemize\n\n@section Labels\n\n@itemize\n\n@item All labels are considered as local, except undefined ones.\n\n@item Numeric labels can be used as local @code{gas}-like labels. \nThey can be defined several times in the same source. Use 'b'\n(backward) or 'f' (forward) as suffix to reference them:\n\n@example\n 1:\n      jmp 1b /* jump to '1' label before */\n      jmp 1f /* jump to '1' label after */\n 1:\n@end example\n\n@end itemize\n\n@section Directives\n@cindex assembler directives\n@cindex directives, assembler\n@cindex align directive\n@cindex skip directive\n@cindex space directive\n@cindex byte directive\n@cindex word directive\n@cindex short directive\n@cindex int directive\n@cindex long directive\n@cindex quad directive\n@cindex globl directive\n@cindex global directive\n@cindex section directive\n@cindex text directive\n@cindex data directive\n@cindex bss directive\n@cindex fill directive\n@cindex org directive\n@cindex previous directive\n@cindex string directive\n@cindex asciz directive\n@cindex ascii directive\n\nAll directives are preceeded by a '.'. The following directives are\nsupported:\n\n@itemize\n@item .align n[,value]\n@item .skip n[,value]\n@item .space n[,value]\n@item .byte value1[,...]\n@item .word value1[,...]\n@item .short value1[,...]\n@item .int value1[,...]\n@item .long value1[,...]\n@item .quad immediate_value1[,...]\n@item .globl symbol\n@item .global symbol\n@item .section section\n@item .text\n@item .data\n@item .bss\n@item .fill repeat[,size[,value]]\n@item .org n\n@item .previous\n@item .string string[,...]\n@item .asciz string[,...]\n@item .ascii string[,...]\n@end itemize\n\n@section X86 Assembler\n@cindex assembler\n\nAll X86 opcodes are supported. Only ATT syntax is supported (source\nthen destination operand order). If no size suffix is given, TinyCC\ntries to guess it from the operand sizes.\n\nCurrently, MMX opcodes are supported but not SSE ones.\n\n@node linker\n@chapter TinyCC Linker\n@cindex linker\n\n@section ELF file generation\n@cindex ELF\n\nTCC can directly output relocatable ELF files (object files),\nexecutable ELF files and dynamic ELF libraries without relying on an\nexternal linker.\n\nDynamic ELF libraries can be output but the C compiler does not generate\nposition independent code (PIC). It means that the dynamic library\ncode generated by TCC cannot be factorized among processes yet.\n\nTCC linker eliminates unreferenced object code in libraries. A single pass is\ndone on the object and library list, so the order in which object files and\nlibraries are specified is important (same constraint as GNU ld). No grouping\noptions (@option{--start-group} and @option{--end-group}) are supported.\n\n@section ELF file loader\n\nTCC can load ELF object files, archives (.a files) and dynamic\nlibraries (.so).\n\n@section PE-i386 file generation\n@cindex PE-i386\n\nTCC for Windows supports the native Win32 executable file format (PE-i386).  It\ngenerates EXE files (console and gui) and DLL files.\n\nFor usage on Windows, see also tcc-win32.txt.\n\n@section GNU Linker Scripts\n@cindex scripts, linker\n@cindex linker scripts\n@cindex GROUP, linker command\n@cindex FILE, linker command\n@cindex OUTPUT_FORMAT, linker command\n@cindex TARGET, linker command\n\nBecause on many Linux systems some dynamic libraries (such as\n@file{/usr/lib/libc.so}) are in fact GNU ld link scripts (horrible!),\nthe TCC linker also supports a subset of GNU ld scripts.\n\nThe @code{GROUP} and @code{FILE} commands are supported. @code{OUTPUT_FORMAT}\nand @code{TARGET} are ignored.\n\nExample from @file{/usr/lib/libc.so}:\n@example\n/* GNU ld script\n   Use the shared library, but some functions are only in\n   the static library, so try that secondarily.  */\nGROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )\n@end example\n\n@node Bounds\n@chapter TinyCC Memory and Bound checks\n@cindex bound checks\n@cindex memory checks\n\nThis feature is activated with the @option{-b} (@pxref{Invoke}).\n\nNote that pointer size is @emph{unchanged} and that code generated\nwith bound checks is @emph{fully compatible} with unchecked\ncode. When a pointer comes from unchecked code, it is assumed to be\nvalid. Even very obscure C code with casts should work correctly.\n\nFor more information about the ideas behind this method, see\n@url{http://www.doc.ic.ac.uk/~phjk/BoundsChecking.html}.\n\nHere are some examples of caught errors:\n\n@table @asis\n\n@item Invalid range with standard string function:\n@example\n@{\n    char tab[10];\n    memset(tab, 0, 11);\n@}\n@end example\n\n@item Out of bounds-error in global or local arrays:\n@example\n@{\n    int tab[10];\n    for(i=0;i<11;i++) @{\n        sum += tab[i];\n    @}\n@}\n@end example\n\n@item Out of bounds-error in malloc'ed data:\n@example\n@{\n    int *tab;\n    tab = malloc(20 * sizeof(int));\n    for(i=0;i<21;i++) @{\n        sum += tab4[i];\n    @}\n    free(tab);\n@}\n@end example\n\n@item Access of freed memory:\n@example\n@{\n    int *tab;\n    tab = malloc(20 * sizeof(int));\n    free(tab);\n    for(i=0;i<20;i++) @{\n        sum += tab4[i];\n    @}\n@}\n@end example\n\n@item Double free:\n@example\n@{\n    int *tab;\n    tab = malloc(20 * sizeof(int));\n    free(tab);\n    free(tab);\n@}\n@end example\n\n@end table\n\n@node Libtcc\n@chapter The @code{libtcc} library\n\nThe @code{libtcc} library enables you to use TCC as a backend for\ndynamic code generation. \n\nRead the @file{libtcc.h} to have an overview of the API. Read\n@file{libtcc_test.c} to have a very simple example.\n\nThe idea consists in giving a C string containing the program you want\nto compile directly to @code{libtcc}. Then you can access to any global\nsymbol (function or variable) defined.\n\n@node devel\n@chapter Developer's guide\n\nThis chapter gives some hints to understand how TCC works. You can skip\nit if you do not intend to modify the TCC code.\n\n@section File reading\n\nThe @code{BufferedFile} structure contains the context needed to read a\nfile, including the current line number. @code{tcc_open()} opens a new\nfile and @code{tcc_close()} closes it. @code{inp()} returns the next\ncharacter.\n\n@section Lexer\n\n@code{next()} reads the next token in the current\nfile. @code{next_nomacro()} reads the next token without macro\nexpansion.\n\n@code{tok} contains the current token (see @code{TOK_xxx})\nconstants. Identifiers and keywords are also keywords. @code{tokc}\ncontains additional infos about the token (for example a constant value\nif number or string token).\n\n@section Parser\n\nThe parser is hardcoded (yacc is not necessary). It does only one pass,\nexcept:\n\n@itemize\n\n@item For initialized arrays with unknown size, a first pass \nis done to count the number of elements.\n\n@item For architectures where arguments are evaluated in \nreverse order, a first pass is done to reverse the argument order.\n\n@end itemize\n\n@section Types\n\nThe types are stored in a single 'int' variable. It was choosen in the\nfirst stages of development when tcc was much simpler. Now, it may not\nbe the best solution.\n\n@example\n#define VT_INT        0  /* integer type */\n#define VT_BYTE       1  /* signed byte type */\n#define VT_SHORT      2  /* short type */\n#define VT_VOID       3  /* void type */\n#define VT_PTR        4  /* pointer */\n#define VT_ENUM       5  /* enum definition */\n#define VT_FUNC       6  /* function type */\n#define VT_STRUCT     7  /* struct/union definition */\n#define VT_FLOAT      8  /* IEEE float */\n#define VT_DOUBLE     9  /* IEEE double */\n#define VT_LDOUBLE   10  /* IEEE long double */\n#define VT_BOOL      11  /* ISOC99 boolean type */\n#define VT_LLONG     12  /* 64 bit integer */\n#define VT_LONG      13  /* long integer (NEVER USED as type, only\n                            during parsing) */\n#define VT_BTYPE      0x000f /* mask for basic type */\n#define VT_UNSIGNED   0x0010  /* unsigned type */\n#define VT_ARRAY      0x0020  /* array type (also has VT_PTR) */\n#define VT_VLA        0x20000 /* VLA type (also has VT_PTR and VT_ARRAY) */\n#define VT_BITFIELD   0x0040  /* bitfield modifier */\n#define VT_CONSTANT   0x0800  /* const modifier */\n#define VT_VOLATILE   0x1000  /* volatile modifier */\n#define VT_SIGNED     0x2000  /* signed type */\n\n#define VT_STRUCT_SHIFT 18   /* structure/enum name shift (14 bits left) */\n@end example\n\nWhen a reference to another type is needed (for pointers, functions and\nstructures), the @code{32 - VT_STRUCT_SHIFT} high order bits are used to\nstore an identifier reference.\n\nThe @code{VT_UNSIGNED} flag can be set for chars, shorts, ints and long\nlongs.\n\nArrays are considered as pointers @code{VT_PTR} with the flag\n@code{VT_ARRAY} set. Variable length arrays are considered as special\narrays and have flag @code{VT_VLA} set instead of @code{VT_ARRAY}.\n\nThe @code{VT_BITFIELD} flag can be set for chars, shorts, ints and long\nlongs. If it is set, then the bitfield position is stored from bits\nVT_STRUCT_SHIFT to VT_STRUCT_SHIFT + 5 and the bit field size is stored\nfrom bits VT_STRUCT_SHIFT + 6 to VT_STRUCT_SHIFT + 11.\n\n@code{VT_LONG} is never used except during parsing.\n\nDuring parsing, the storage of an object is also stored in the type\ninteger:\n\n@example\n#define VT_EXTERN  0x00000080  /* extern definition */\n#define VT_STATIC  0x00000100  /* static variable */\n#define VT_TYPEDEF 0x00000200  /* typedef definition */\n#define VT_INLINE  0x00000400  /* inline definition */\n#define VT_IMPORT  0x00004000  /* win32: extern data imported from dll */\n#define VT_EXPORT  0x00008000  /* win32: data exported from dll */\n#define VT_WEAK    0x00010000  /* win32: data exported from dll */\n@end example\n\n@section Symbols\n\nAll symbols are stored in hashed symbol stacks. Each symbol stack\ncontains @code{Sym} structures.\n\n@code{Sym.v} contains the symbol name (remember\nan idenfier is also a token, so a string is never necessary to store\nit). @code{Sym.t} gives the type of the symbol. @code{Sym.r} is usually\nthe register in which the corresponding variable is stored. @code{Sym.c} is\nusually a constant associated to the symbol like its address for normal\nsymbols, and the number of entries for symbols representing arrays.\nVariable length array types use @code{Sym.c} as a location on the stack\nwhich holds the runtime sizeof for the type.\n\nFour main symbol stacks are defined:\n\n@table @code\n\n@item define_stack\nfor the macros (@code{#define}s).\n\n@item global_stack\nfor the global variables, functions and types.\n\n@item local_stack\nfor the local variables, functions and types.\n\n@item global_label_stack\nfor the local labels (for @code{goto}).\n\n@item label_stack\nfor GCC block local labels (see the @code{__label__} keyword).\n\n@end table\n\n@code{sym_push()} is used to add a new symbol in the local symbol\nstack. If no local symbol stack is active, it is added in the global\nsymbol stack.\n\n@code{sym_pop(st,b)} pops symbols from the symbol stack @var{st} until\nthe symbol @var{b} is on the top of stack. If @var{b} is NULL, the stack\nis emptied.\n\n@code{sym_find(v)} return the symbol associated to the identifier\n@var{v}. The local stack is searched first from top to bottom, then the\nglobal stack.\n\n@section Sections\n\nThe generated code and datas are written in sections. The structure\n@code{Section} contains all the necessary information for a given\nsection. @code{new_section()} creates a new section. ELF file semantics\nis assumed for each section.\n\nThe following sections are predefined:\n\n@table @code\n\n@item text_section\nis the section containing the generated code. @var{ind} contains the\ncurrent position in the code section.\n\n@item data_section\ncontains initialized data\n\n@item bss_section\ncontains uninitialized data\n\n@item bounds_section\n@itemx lbounds_section\nare used when bound checking is activated\n\n@item stab_section\n@itemx stabstr_section\nare used when debugging is actived to store debug information\n\n@item symtab_section\n@itemx strtab_section\ncontain the exported symbols (currently only used for debugging).\n\n@end table\n\n@section Code generation\n@cindex code generation\n\n@subsection Introduction\n\nThe TCC code generator directly generates linked binary code in one\npass. It is rather unusual these days (see gcc for example which\ngenerates text assembly), but it can be very fast and surprisingly\nlittle complicated.\n\nThe TCC code generator is register based. Optimization is only done at\nthe expression level. No intermediate representation of expression is\nkept except the current values stored in the @emph{value stack}.\n\nOn x86, three temporary registers are used. When more registers are\nneeded, one register is spilled into a new temporary variable on the stack.\n\n@subsection The value stack\n@cindex value stack, introduction\n\nWhen an expression is parsed, its value is pushed on the value stack\n(@var{vstack}). The top of the value stack is @var{vtop}. Each value\nstack entry is the structure @code{SValue}.\n\n@code{SValue.t} is the type. @code{SValue.r} indicates how the value is\ncurrently stored in the generated code. It is usually a CPU register\nindex (@code{REG_xxx} constants), but additional values and flags are\ndefined:\n\n@example\n#define VT_CONST     0x00f0\n#define VT_LLOCAL    0x00f1\n#define VT_LOCAL     0x00f2\n#define VT_CMP       0x00f3\n#define VT_JMP       0x00f4\n#define VT_JMPI      0x00f5\n#define VT_LVAL      0x0100\n#define VT_SYM       0x0200\n#define VT_MUSTCAST  0x0400\n#define VT_MUSTBOUND 0x0800\n#define VT_BOUNDED   0x8000\n#define VT_LVAL_BYTE     0x1000\n#define VT_LVAL_SHORT    0x2000\n#define VT_LVAL_UNSIGNED 0x4000\n#define VT_LVAL_TYPE     (VT_LVAL_BYTE | VT_LVAL_SHORT | VT_LVAL_UNSIGNED)\n@end example\n\n@table @code\n\n@item VT_CONST\nindicates that the value is a constant. It is stored in the union\n@code{SValue.c}, depending on its type.\n\n@item VT_LOCAL\nindicates a local variable pointer at offset @code{SValue.c.i} in the\nstack.\n\n@item VT_CMP\nindicates that the value is actually stored in the CPU flags (i.e. the\nvalue is the consequence of a test). The value is either 0 or 1. The\nactual CPU flags used is indicated in @code{SValue.c.i}. \n\nIf any code is generated which destroys the CPU flags, this value MUST be\nput in a normal register.\n\n@item VT_JMP\n@itemx VT_JMPI\nindicates that the value is the consequence of a conditional jump. For VT_JMP,\nit is 1 if the jump is taken, 0 otherwise. For VT_JMPI it is inverted.\n\nThese values are used to compile the @code{||} and @code{&&} logical\noperators.\n\nIf any code is generated, this value MUST be put in a normal\nregister. Otherwise, the generated code won't be executed if the jump is\ntaken.\n\n@item VT_LVAL\nis a flag indicating that the value is actually an lvalue (left value of\nan assignment). It means that the value stored is actually a pointer to\nthe wanted value. \n\nUnderstanding the use @code{VT_LVAL} is very important if you want to\nunderstand how TCC works.\n\n@item VT_LVAL_BYTE\n@itemx VT_LVAL_SHORT\n@itemx VT_LVAL_UNSIGNED\nif the lvalue has an integer type, then these flags give its real\ntype. The type alone is not enough in case of cast optimisations.\n\n@item VT_LLOCAL\nis a saved lvalue on the stack. @code{VT_LLOCAL} should be eliminated\nASAP because its semantics are rather complicated.\n\n@item VT_MUSTCAST\nindicates that a cast to the value type must be performed if the value\nis used (lazy casting).\n\n@item VT_SYM\nindicates that the symbol @code{SValue.sym} must be added to the constant.\n\n@item VT_MUSTBOUND\n@itemx VT_BOUNDED\nare only used for optional bound checking.\n\n@end table\n\n@subsection Manipulating the value stack\n@cindex value stack\n\n@code{vsetc()} and @code{vset()} pushes a new value on the value\nstack. If the previous @var{vtop} was stored in a very unsafe place(for\nexample in the CPU flags), then some code is generated to put the\nprevious @var{vtop} in a safe storage.\n\n@code{vpop()} pops @var{vtop}. In some cases, it also generates cleanup\ncode (for example if stacked floating point registers are used as on\nx86).\n\nThe @code{gv(rc)} function generates code to evaluate @var{vtop} (the\ntop value of the stack) into registers. @var{rc} selects in which\nregister class the value should be put. @code{gv()} is the @emph{most\nimportant function} of the code generator.\n\n@code{gv2()} is the same as @code{gv()} but for the top two stack\nentries.\n\n@subsection CPU dependent code generation\n@cindex CPU dependent\nSee the @file{i386-gen.c} file to have an example.\n\n@table @code\n\n@item load()\nmust generate the code needed to load a stack value into a register.\n\n@item store()\nmust generate the code needed to store a register into a stack value\nlvalue.\n\n@item gfunc_start()\n@itemx gfunc_param()\n@itemx gfunc_call()\nshould generate a function call\n\n@item gfunc_prolog()\n@itemx gfunc_epilog()\nshould generate a function prolog/epilog.\n\n@item gen_opi(op)\nmust generate the binary integer operation @var{op} on the two top\nentries of the stack which are guaranted to contain integer types.\n\nThe result value should be put on the stack.\n\n@item gen_opf(op)\nsame as @code{gen_opi()} for floating point operations. The two top\nentries of the stack are guaranted to contain floating point values of\nsame types.\n\n@item gen_cvt_itof()\ninteger to floating point conversion.\n\n@item gen_cvt_ftoi()\nfloating point to integer conversion.\n\n@item gen_cvt_ftof()\nfloating point to floating point of different size conversion.\n\n@item gen_bounded_ptr_add()\n@item gen_bounded_ptr_deref()\nare only used for bounds checking.\n\n@end table\n\n@section Optimizations done\n@cindex optimizations\n@cindex constant propagation\n@cindex strength reduction\n@cindex comparison operators\n@cindex caching processor flags\n@cindex flags, caching\n@cindex jump optimization\nConstant propagation is done for all operations. Multiplications and\ndivisions are optimized to shifts when appropriate. Comparison\noperators are optimized by maintaining a special cache for the\nprocessor flags. &&, || and ! are optimized by maintaining a special\n'jump target' value. No other jump optimization is currently performed\nbecause it would require to store the code in a more abstract fashion.\n\n@unnumbered Concept Index\n@printindex cp\n\n@bye\n\n@c Local variables:\n@c fill-column: 78\n@c texinfo-column-for-description: 32\n@c End:\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tcc.c",
    "content": "/*\n *  TCC - Tiny C Compiler\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#ifdef ONE_SOURCE\n#include \"libtcc.c\"\n#else\n#include \"tcc.h\"\n#endif\n\nstatic void help(void)\n{\n    printf(\"tcc version \" TCC_VERSION \" - Tiny C Compiler - Copyright (C) 2001-2006 Fabrice Bellard\\n\"\n           \"Usage: tcc [options...] [-o outfile] [-c] infile(s)...\\n\"\n           \"       tcc [options...] -run infile [arguments...]\\n\"\n           \"General options:\\n\"\n           \"  -c          compile only - generate an object file\\n\"\n           \"  -o outfile  set output filename\\n\"\n           \"  -run        run compiled source\\n\"\n           \"  -fflag      set or reset (with 'no-' prefix) 'flag' (see man page)\\n\"\n           \"  -Wwarning   set or reset (with 'no-' prefix) 'warning' (see man page)\\n\"\n           \"  -w          disable all warnings\\n\"\n           \"  -v          show version\\n\"\n           \"  -vv         show included files (as sole argument: show search paths)\\n\"\n           \"  -dumpversion\\n\"\n           \"  -bench      show compilation statistics\\n\"\n           \"Preprocessor options:\\n\"\n           \"  -E          preprocess only\\n\"\n           \"  -Idir       add include path 'dir'\\n\"\n           \"  -Dsym[=val] define 'sym' with value 'val'\\n\"\n           \"  -Usym       undefine 'sym'\\n\"\n           \"Linker options:\\n\"\n           \"  -Ldir       add library path 'dir'\\n\"\n           \"  -llib       link with dynamic or static library 'lib'\\n\"\n           \"  -pthread    link with -lpthread and -D_REENTRANT (POSIX Linux)\\n\"\n           \"  -r          generate (relocatable) object file\\n\"\n           \"  -rdynamic   export all global symbols to dynamic linker\\n\"\n           \"  -shared     generate a shared library\\n\"\n           \"  -soname     set name for shared library to be used at runtime\\n\"\n           \"  -static     static linking\\n\"\n           \"  -Wl,-opt[=val]  set linker option (see manual)\\n\"\n           \"Debugger options:\\n\"\n           \"  -g          generate runtime debug info\\n\"\n#ifdef CONFIG_TCC_BCHECK\n           \"  -b          compile with built-in memory and bounds checker (implies -g)\\n\"\n#endif\n#ifdef CONFIG_TCC_BACKTRACE\n           \"  -bt N       show N callers in stack traces\\n\"\n#endif\n           \"Misc options:\\n\"\n           \"  -nostdinc   do not use standard system include paths\\n\"\n           \"  -nostdlib   do not link with standard crt and libraries\\n\"\n           \"  -Bdir       use 'dir' as tcc internal library and include path\\n\"\n           \"  -MD         generate target dependencies for make\\n\"\n           \"  -MF depfile put generated dependencies here\\n\"\n           );\n}\n\n/* re-execute the i386/x86_64 cross-compilers with tcc -m32/-m64: */\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n#ifdef _WIN32\n#include <process.h>\nstatic int execvp_win32(const char *prog, char **argv)\n{\n    int ret = spawnvp(P_NOWAIT, prog, (char const*const*)argv);\n    if (-1 == ret)\n        return ret;\n    cwait(&ret, ret, WAIT_CHILD);\n    exit(ret);\n}\n#define execvp execvp_win32\n#endif\nstatic void exec_other_tcc(TCCState *s, char **argv, const char *optarg)\n{\n    char child_path[4096], *child_name; const char *target;\n    switch (atoi(optarg)) {\n#ifdef TCC_TARGET_I386\n        case 32: break;\n        case 64: target = \"x86_64\";\n#else\n        case 64: break;\n        case 32: target = \"i386\";\n#endif\n            pstrcpy(child_path, sizeof child_path - 40, argv[0]);\n            child_name = tcc_basename(child_path);\n            strcpy(child_name, target);\n#ifdef TCC_TARGET_PE\n            strcat(child_name, \"-win32\");\n#endif\n            strcat(child_name, \"-tcc\");\n            if (strcmp(argv[0], child_path)) {\n                if (s->verbose > 0)\n                    printf(\"tcc: using '%s'\\n\", child_name), fflush(stdout);\n                execvp(argv[0] = child_path, argv);\n            }\n            tcc_error(\"'%s' not found\", child_name);\n        case 0: /* ignore -march etc. */\n            break;\n        default:\n            tcc_warning(\"unsupported option \\\"-m%s\\\"\", optarg);\n    }\n}\n#else\n#define exec_other_tcc(s, argv, optarg)\n#endif\n\nstatic void gen_makedeps(TCCState *s, const char *target, const char *filename)\n{\n    FILE *depout;\n    char buf[1024], *ext;\n    int i;\n\n    if (!filename) {\n        /* compute filename automatically\n         * dir/file.o -> dir/file.d             */\n        pstrcpy(buf, sizeof(buf), target);\n        ext = tcc_fileextension(buf);\n        pstrcpy(ext, sizeof(buf) - (ext-buf), \".d\");\n        filename = buf;\n    }\n\n    if (s->verbose)\n        printf(\"<- %s\\n\", filename);\n\n    /* XXX return err codes instead of error() ? */\n    depout = fopen(filename, \"w\");\n    if (!depout)\n        tcc_error(\"could not open '%s'\", filename);\n\n    fprintf(depout, \"%s : \\\\\\n\", target);\n    for (i=0; i<s->nb_target_deps; ++i)\n        fprintf(depout, \" %s \\\\\\n\", s->target_deps[i]);\n    fprintf(depout, \"\\n\");\n    fclose(depout);\n}\n\nstatic char *default_outputfile(TCCState *s, const char *first_file)\n{\n    char buf[1024];\n    char *ext;\n    const char *name = \"a\";\n\n    if (first_file && strcmp(first_file, \"-\"))\n        name = tcc_basename(first_file);\n    pstrcpy(buf, sizeof(buf), name);\n    ext = tcc_fileextension(buf);\n#ifdef TCC_TARGET_PE\n    if (s->output_type == TCC_OUTPUT_DLL)\n        strcpy(ext, \".dll\");\n    else\n    if (s->output_type == TCC_OUTPUT_EXE)\n        strcpy(ext, \".exe\");\n    else\n#endif\n    if (( (s->output_type == TCC_OUTPUT_OBJ && !s->option_r) ||\n          (s->output_type == TCC_OUTPUT_PREPROCESS) )\n        && *ext)\n        strcpy(ext, \".o\");\n    else\n        strcpy(buf, \"a.out\");\n\n    return tcc_strdup(buf);\n}\n\nstatic void print_paths(const char *msg, char **paths, int nb_paths)\n{\n    int i;\n    printf(\"%s:\\n%s\", msg, nb_paths ? \"\" : \"  -\\n\");\n    for(i = 0; i < nb_paths; i++)\n        printf(\"  %s\\n\", paths[i]);\n}\n\nstatic void display_info(TCCState *s, int what)\n{\n    switch (what) {\n    case 0:\n        printf(\"tcc version %s (\"\n#ifdef TCC_TARGET_I386\n        \"i386\"\n# ifdef TCC_TARGET_PE\n        \" Win32\"\n# endif\n#elif defined TCC_TARGET_X86_64\n        \"x86-64\"\n# ifdef TCC_TARGET_PE\n        \" Win64\"\n# endif\n#elif defined TCC_TARGET_ARM\n        \"ARM\"\n# ifdef TCC_ARM_HARDFLOAT\n        \" Hard Float\"\n# endif\n# ifdef TCC_TARGET_PE\n        \" WinCE\"\n# endif\n#endif\n#ifndef TCC_TARGET_PE\n# ifdef __linux\n        \" Linux\"\n# endif\n#endif\n        \")\\n\", TCC_VERSION);\n        break;\n    case 1:\n        printf(\"install: %s/\\n\", s->tcc_lib_path);\n        /* print_paths(\"programs\", NULL, 0); */\n        print_paths(\"crt\", s->crt_paths, s->nb_crt_paths);\n        print_paths(\"libraries\", s->library_paths, s->nb_library_paths);\n        print_paths(\"include\", s->sysinclude_paths, s->nb_sysinclude_paths);\n        printf(\"elfinterp:\\n  %s\\n\",  CONFIG_TCC_ELFINTERP);\n        break;\n    }\n}\n\nstatic int64_t getclock_us(void)\n{\n#ifdef _WIN32\n    struct _timeb tb;\n    _ftime(&tb);\n    return (tb.time * 1000LL + tb.millitm) * 1000LL;\n#else\n    struct timeval tv;\n    gettimeofday(&tv, NULL);\n    return tv.tv_sec * 1000000LL + tv.tv_usec;\n#endif\n}\n\nint main(int argc, char **argv)\n{\n    TCCState *s;\n    int ret, optind, i, bench;\n    int64_t start_time = 0;\n    const char *first_file = NULL;\n\n    s = tcc_new();\n    s->output_type = TCC_OUTPUT_EXE;\n\n    optind = tcc_parse_args(s, argc - 1, argv + 1);\n\n    if (optind == 0) {\n        help();\n        return 1;\n    }\n\n    if (s->option_m)\n        exec_other_tcc(s, argv, s->option_m);\n\n    if (s->verbose)\n        display_info(s, 0);\n\n    if (s->print_search_dirs || (s->verbose == 2 && optind == 1)) {\n        tcc_set_output_type(s, TCC_OUTPUT_MEMORY);\n        display_info(s, 1);\n        return 0;\n    }\n\n    if (s->verbose && optind == 1)\n        return 0;\n\n    if (s->nb_files == 0)\n        tcc_error(\"no input files\\n\");\n\n    /* check -c consistency : only single file handled. XXX: checks file type */\n    if (s->output_type == TCC_OUTPUT_OBJ && !s->option_r) {\n        if (s->nb_libraries != 0)\n            tcc_error(\"cannot specify libraries with -c\");\n        /* accepts only a single input file */\n        if (s->nb_files != 1)\n            tcc_error(\"cannot specify multiple files with -c\");\n    }\n    \n    if (s->output_type == TCC_OUTPUT_PREPROCESS) {\n        if (!s->outfile) {\n            s->ppfp = stdout;\n        } else {\n            s->ppfp = fopen(s->outfile, \"w\");\n            if (!s->ppfp)\n                tcc_error(\"could not write '%s'\", s->outfile);\n        }\n    }\n\n    bench = s->do_bench;\n    if (bench)\n        start_time = getclock_us();\n\n    tcc_set_output_type(s, s->output_type);\n\n    /* compile or add each files or library */\n    for(i = ret = 0; i < s->nb_files && ret == 0; i++) {\n        const char *filename;\n\n        filename = s->files[i];\n        if (filename[0] == '-' && filename[1] == 'l') {\n            if (tcc_add_library(s, filename + 2) < 0) {\n                tcc_error_noabort(\"cannot find '%s'\", filename);\n                ret = 1;\n            }\n        } else {\n            if (1 == s->verbose)\n                printf(\"-> %s\\n\", filename);\n            if (tcc_add_file(s, filename) < 0)\n                ret = 1;\n            if (!first_file)\n                first_file = filename;\n        }\n    }\n\n    if (0 == ret) {\n        if (bench)\n            tcc_print_stats(s, getclock_us() - start_time);\n\n        if (s->output_type == TCC_OUTPUT_MEMORY) {\n#ifdef TCC_IS_NATIVE\n            ret = tcc_run(s, argc - 1 - optind, argv + 1 + optind);\n#else\n            tcc_error_noabort(\"-run is not available in a cross compiler\");\n            ret = 1;\n#endif\n        } else if (s->output_type == TCC_OUTPUT_PREPROCESS) {\n             if (s->outfile)\n                fclose(s->ppfp);\n        } else {\n            if (!s->outfile)\n                s->outfile = default_outputfile(s, first_file);\n            ret = !!tcc_output_file(s, s->outfile);\n            /* dump collected dependencies */\n            if (s->gen_deps && !ret)\n                gen_makedeps(s, s->outfile, s->deps_outfile);\n        }\n    }\n\n    tcc_delete(s);\n    if (bench)\n        tcc_memstats();\n    return ret;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tcc.h",
    "content": "/*\n *  TCC - Tiny C Compiler\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#ifndef _TCC_H\n#define _TCC_H\n\n#define _GNU_SOURCE\n#include \"config.h\"\n\n#ifdef CONFIG_TCCBOOT\n#include \"tccboot.h\"\n#define CONFIG_TCC_STATIC\n#else\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n#include <errno.h>\n#include <math.h>\n#include <signal.h>\n#include <fcntl.h>\n#include <setjmp.h>\n#include <time.h>\n\n#ifndef _WIN32\n# include <unistd.h>\n# include <sys/time.h>\n#ifdef ANDROID\n# include \"ucontext.h\"\n#else\n# include <sys/ucontext.h>\n#endif\n# include <sys/mman.h>\n# ifndef CONFIG_TCC_STATIC\n#  include <dlfcn.h>\n# endif\n#else\n# include <windows.h>\n# include <sys/timeb.h>\n# include <io.h> /* open, close etc. */\n# include <direct.h> /* getcwd */\n# ifdef __GNUC__\n#  include <stdint.h>\n# else\n   typedef UINT_PTR uintptr_t;\n# endif\n# define inline __inline\n# define inp next_inp\n# ifdef LIBTCC_AS_DLL\n#  define LIBTCCAPI __declspec(dllexport)\n#  define PUB_FUNC LIBTCCAPI\n# endif\n#endif\n\n#endif /* !CONFIG_TCCBOOT */\n\n#ifndef O_BINARY\n# define O_BINARY 0\n#endif\n\n#include \"elf.h\"\n#ifdef TCC_TARGET_X86_64\n# define ELFCLASSW ELFCLASS64\n# define ElfW(type) Elf##64##_##type\n# define ELFW(type) ELF##64##_##type\n# define ElfW_Rel ElfW(Rela)\n# define SHT_RELX SHT_RELA\n# define REL_SECTION_FMT \".rela%s\"\n/* XXX: DLL with PLT would only work with x86-64 for now */\n# define TCC_OUTPUT_DLL_WITH_PLT\n#else\n# define ELFCLASSW ELFCLASS32\n# define ElfW(type) Elf##32##_##type\n# define ELFW(type) ELF##32##_##type\n# define ElfW_Rel ElfW(Rel)\n# define SHT_RELX SHT_REL\n# define REL_SECTION_FMT \".rel%s\"\n#endif\n\n/* target address type */\n#define addr_t ElfW(Addr)\n\n#include \"stab.h\"\n#include \"libtcc.h\"\n\n/* parser debug */\n//#define PARSE_DEBUG\n/* preprocessor debug */\n//#define PP_DEBUG\n/* include file debug */\n//#define INC_DEBUG\n/* memory leak debug */\n//#define MEM_DEBUG\n/* assembler debug */\n//#define ASM_DEBUG\n\n/* target selection */\n//#define TCC_TARGET_I386   /* i386 code generator */\n//#define TCC_TARGET_ARM    /* ARMv4 code generator */\n//#define TCC_TARGET_C67    /* TMS320C67xx code generator */\n//#define TCC_TARGET_X86_64 /* x86-64 code generator */\n\n/* default target is I386 */\n#if !defined(TCC_TARGET_I386) && !defined(TCC_TARGET_ARM) && \\\n    !defined(TCC_TARGET_C67) && !defined(TCC_TARGET_X86_64)\n#define TCC_TARGET_I386\n#endif\n\n#if !defined(TCC_UCLIBC) && !defined(TCC_TARGET_ARM) && \\\n    !defined(TCC_TARGET_C67) && !defined(TCC_TARGET_X86_64)\n#define CONFIG_TCC_BCHECK /* enable bound checking code */\n#endif\n\n/* define it to include assembler support */\n#if !defined(TCC_TARGET_ARM) && !defined(TCC_TARGET_C67)\n#define CONFIG_TCC_ASM\n#endif\n\n/* object format selection */\n#if defined(TCC_TARGET_C67)\n#define TCC_TARGET_COFF\n#endif\n\n/* only native compiler supports -run */\n#if defined _WIN32 == defined TCC_TARGET_PE\n# if (defined __i386__ || defined _X86_) && defined TCC_TARGET_I386\n#  define TCC_IS_NATIVE\n# elif (defined __x86_64__ || defined _AMD64_) && defined TCC_TARGET_X86_64\n#  define TCC_IS_NATIVE\n# elif defined __arm__ && defined TCC_TARGET_ARM\n#  define TCC_IS_NATIVE\n# endif\n#endif\n\n#if defined TCC_IS_NATIVE && !defined CONFIG_TCCBOOT\n# define CONFIG_TCC_BACKTRACE\n#endif\n\n/* ------------ path configuration ------------ */\n\n#ifndef CONFIG_SYSROOT\n# define CONFIG_SYSROOT \"\"\n#endif\n#ifndef CONFIG_TCCDIR\n# define CONFIG_TCCDIR \".\"\n#endif\n#ifndef CONFIG_LDDIR\n# define CONFIG_LDDIR \"lib\"\n#endif\n\n/* path to find crt1.o, crti.o and crtn.o */\n#ifndef CONFIG_TCC_CRTPREFIX\n# define CONFIG_TCC_CRTPREFIX CONFIG_SYSROOT \"/usr/\" CONFIG_LDDIR\n#endif\n\n/* Below: {B} is substituted by CONFIG_TCCDIR (rsp. -B option) */\n\n/* system include paths */\n#ifndef CONFIG_TCC_SYSINCLUDEPATHS\n# ifdef TCC_TARGET_PE\n#  define CONFIG_TCC_SYSINCLUDEPATHS \"{B}/include;{B}/include/winapi\"\n# elif defined CONFIG_MULTIARCHDIR\n#  define CONFIG_TCC_SYSINCLUDEPATHS \\\n        CONFIG_SYSROOT \"/usr/local/include\" \\\n    \":\" CONFIG_SYSROOT \"/usr/local/include/\" CONFIG_MULTIARCHDIR \\\n    \":\" CONFIG_SYSROOT \"/usr/include\" \\\n    \":\" CONFIG_SYSROOT \"/usr/include/\" CONFIG_MULTIARCHDIR \\\n    \":\" \"{B}/include\"\n# else\n#  define CONFIG_TCC_SYSINCLUDEPATHS \\\n        CONFIG_SYSROOT \"/usr/local/include\" \\\n    \":\" CONFIG_SYSROOT \"/usr/include\" \\\n    \":\" \"{B}/include\"\n# endif\n#endif\n\n/* library search paths */\n#ifndef CONFIG_TCC_LIBPATHS\n# ifdef TCC_TARGET_PE\n#  define CONFIG_TCC_LIBPATHS \"{B}/lib\"\n# else\n#  define CONFIG_TCC_LIBPATHS \\\n        CONFIG_SYSROOT \"/usr/\" CONFIG_LDDIR \\\n    \":\" CONFIG_SYSROOT \"/\" CONFIG_LDDIR \\\n    \":\" CONFIG_SYSROOT \"/usr/local/\" CONFIG_LDDIR\n# endif\n#endif\n\n/* name of ELF interpreter */\n#ifndef CONFIG_TCC_ELFINTERP\n# if defined __FreeBSD__\n#  define CONFIG_TCC_ELFINTERP \"/libexec/ld-elf.so.1\"\n# elif defined __FreeBSD_kernel__\n#  define CONFIG_TCC_ELFINTERP \"/lib/ld.so.1\"\n# elif defined TCC_ARM_HARDFLOAT\n#  define CONFIG_TCC_ELFINTERP \"/lib/ld-linux-armhf.so.3\"\n# elif defined TCC_ARM_EABI\n#  define CONFIG_TCC_ELFINTERP \"/lib/ld-linux.so.3\"\n# elif defined(TCC_TARGET_X86_64)\n#  define CONFIG_TCC_ELFINTERP \"/lib64/ld-linux-x86-64.so.2\"\n# elif defined(TCC_UCLIBC)\n#  define CONFIG_TCC_ELFINTERP \"/lib/ld-uClibc.so.0\"\n# elif defined(TCC_TARGET_PE)\n#  define CONFIG_TCC_ELFINTERP \"-\"\n# else\n#  define CONFIG_TCC_ELFINTERP \"/lib/ld-linux.so.2\"\n# endif\n#endif\n\n/* library to use with CONFIG_USE_LIBGCC instead of libtcc1.a */\n#define TCC_LIBGCC CONFIG_SYSROOT \"/\" CONFIG_LDDIR \"/libgcc_s.so.1\"\n\n/* -------------------------------------------- */\n/* include the target specific definitions */\n\n#define TARGET_DEFS_ONLY\n#ifdef TCC_TARGET_I386\n# include \"i386-gen.c\"\n#endif\n#ifdef TCC_TARGET_X86_64\n# include \"x86_64-gen.c\"\n#endif\n#ifdef TCC_TARGET_ARM\n# include \"arm-gen.c\"\n#endif\n#ifdef TCC_TARGET_C67\n# include \"coff.h\"\n# include \"c67-gen.c\"\n#endif\n#undef TARGET_DEFS_ONLY\n\n/* -------------------------------------------- */\n\n#define INCLUDE_STACK_SIZE  32\n#define IFDEF_STACK_SIZE    64\n#define VSTACK_SIZE         256\n#define STRING_MAX_SIZE     1024\n#define PACK_STACK_SIZE     8\n\n#define TOK_HASH_SIZE       8192 /* must be a power of two */\n#define TOK_ALLOC_INCR      512  /* must be a power of two */\n#define TOK_MAX_SIZE        4 /* token max size in int unit when stored in string */\n\n/* token symbol management */\ntypedef struct TokenSym {\n    struct TokenSym *hash_next;\n    struct Sym *sym_define; /* direct pointer to define */\n    struct Sym *sym_label; /* direct pointer to label */\n    struct Sym *sym_struct; /* direct pointer to structure */\n    struct Sym *sym_identifier; /* direct pointer to identifier */\n    int tok; /* token number */\n    int len;\n    char str[1];\n} TokenSym;\n\n#ifdef TCC_TARGET_PE\ntypedef unsigned short nwchar_t;\n#else\ntypedef int nwchar_t;\n#endif\n\ntypedef struct CString {\n    int size; /* size in bytes */\n    void *data; /* either 'char *' or 'nwchar_t *' */\n    int size_allocated;\n    void *data_allocated; /* if non NULL, data has been malloced */\n} CString;\n\n/* type definition */\ntypedef struct CType {\n    int t;\n    struct Sym *ref;\n} CType;\n\n/* constant value */\ntypedef union CValue {\n    long double ld;\n    double d;\n    float f;\n    int i;\n    unsigned int ui;\n    unsigned int ul; /* address (should be unsigned long on 64 bit cpu) */\n    long long ll;\n    unsigned long long ull;\n    struct CString *cstr;\n    void *ptr;\n    int tab[LDOUBLE_SIZE/4];\n} CValue;\n\n/* value on stack */\ntypedef struct SValue {\n    CType type;      /* type */\n    unsigned short r;      /* register + flags */\n    unsigned short r2;     /* second register, used for 'long long'\n                              type. If not used, set to VT_CONST */\n    CValue c;              /* constant, if VT_CONST */\n    struct Sym *sym;       /* symbol, if (VT_SYM | VT_CONST) */\n} SValue;\n\n/* symbol management */\ntypedef struct Sym {\n    int v;    /* symbol token */\n    char *asm_label;    /* associated asm label */\n    long r;    /* associated register */\n    union {\n        long c;    /* associated number */\n        int *d;   /* define token stream */\n    };\n    CType type;    /* associated type */\n    union {\n        struct Sym *next; /* next related symbol */\n        long jnext; /* next jump label */\n    };\n    struct Sym *prev; /* prev symbol in stack */\n    struct Sym *prev_tok; /* previous symbol for this token */\n} Sym;\n\n/* section definition */\n/* XXX: use directly ELF structure for parameters ? */\n/* special flag to indicate that the section should not be linked to\n   the other ones */\n#define SHF_PRIVATE 0x80000000\n\n/* special flag, too */\n#define SECTION_ABS ((void *)1)\n\ntypedef struct Section {\n    unsigned long data_offset; /* current data offset */\n    unsigned char *data;       /* section data */\n    unsigned long data_allocated; /* used for realloc() handling */\n    int sh_name;             /* elf section name (only used during output) */\n    int sh_num;              /* elf section number */\n    int sh_type;             /* elf section type */\n    int sh_flags;            /* elf section flags */\n    int sh_info;             /* elf section info */\n    int sh_addralign;        /* elf section alignment */\n    int sh_entsize;          /* elf entry size */\n    unsigned long sh_size;   /* section size (only used during output) */\n    addr_t sh_addr;          /* address at which the section is relocated */\n    unsigned long sh_offset; /* file offset */\n    int nb_hashed_syms;      /* used to resize the hash table */\n    struct Section *link;    /* link to another section */\n    struct Section *reloc;   /* corresponding section for relocation, if any */\n    struct Section *hash;     /* hash table for symbols */\n    struct Section *next;\n    char name[1];           /* section name */\n} Section;\n\ntypedef struct DLLReference {\n    int level;\n    void *handle;\n    char name[1];\n} DLLReference;\n\n/* GNUC attribute definition */\ntypedef struct AttributeDef {\n    unsigned\n      func_call     : 3, /* calling convention (0..5), see below */\n      aligned       : 5, /* alignement (0..16) */\n      packed        : 1,\n      func_export   : 1,\n      func_import   : 1,\n      func_args     : 5,\n      mode          : 4,\n      weak          : 1,\n      fill          : 11;\n    struct Section *section;\n    int alias_target;    /* token */\n} AttributeDef;\n\n/* gr: wrappers for casting sym->r for other purposes */\n#define FUNC_CALL(r) (((AttributeDef*)&(r))->func_call)\n#define FUNC_EXPORT(r) (((AttributeDef*)&(r))->func_export)\n#define FUNC_IMPORT(r) (((AttributeDef*)&(r))->func_import)\n#define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args)\n#define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned)\n#define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed)\n#define ATTR_MODE(r)  (((AttributeDef*)&(r))->mode)\n#define INT_ATTR(ad) (*(int*)(ad))\n\n/* -------------------------------------------------- */\n\n#define SYM_STRUCT     0x40000000 /* struct/union/enum symbol space */\n#define SYM_FIELD      0x20000000 /* struct/union field symbol space */\n#define SYM_FIRST_ANOM 0x10000000 /* first anonymous sym */\n\n/* stored in 'Sym.c' field */\n#define FUNC_NEW       1 /* ansi function prototype */\n#define FUNC_OLD       2 /* old function prototype */\n#define FUNC_ELLIPSIS  3 /* ansi function prototype with ... */\n\n/* stored in 'Sym.r' field */\n#define FUNC_CDECL     0 /* standard c call */\n#define FUNC_STDCALL   1 /* pascal c call */\n#define FUNC_FASTCALL1 2 /* first param in %eax */\n#define FUNC_FASTCALL2 3 /* first parameters in %eax, %edx */\n#define FUNC_FASTCALL3 4 /* first parameter in %eax, %edx, %ecx */\n#define FUNC_FASTCALLW 5 /* first parameter in %ecx, %edx */\n\n/* field 'Sym.t' for macros */\n#define MACRO_OBJ      0 /* object like macro */\n#define MACRO_FUNC     1 /* function like macro */\n\n/* field 'Sym.r' for C labels */\n#define LABEL_DEFINED  0 /* label is defined */\n#define LABEL_FORWARD  1 /* label is forward defined */\n#define LABEL_DECLARED 2 /* label is declared but never used */\n\n/* type_decl() types */\n#define TYPE_ABSTRACT  1 /* type without variable */\n#define TYPE_DIRECT    2 /* type with variable */\n\n#define IO_BUF_SIZE 8192\n\ntypedef struct BufferedFile {\n    uint8_t *buf_ptr;\n    uint8_t *buf_end;\n    int fd;\n    struct BufferedFile *prev;\n    int line_num;    /* current line number - here to simplify code */\n    int ifndef_macro;  /* #ifndef macro / #endif search */\n    int ifndef_macro_saved; /* saved ifndef_macro */\n    int *ifdef_stack_ptr; /* ifdef_stack value at the start of the file */\n    char filename[1024];    /* filename */\n    unsigned char buffer[IO_BUF_SIZE + 1]; /* extra size for CH_EOB char */\n} BufferedFile;\n\n#define CH_EOB   '\\\\'       /* end of buffer or '\\0' char in file */\n#define CH_EOF   (-1)   /* end of file */\n\n/* parsing state (used to save parser state to reparse part of the\n   source several times) */\ntypedef struct ParseState {\n    const int *macro_ptr;\n    int line_num;\n    int tok;\n    CValue tokc;\n} ParseState;\n\n/* used to record tokens */\ntypedef struct TokenString {\n    int *str;\n    int len;\n    int allocated_len;\n    int last_line_num;\n} TokenString;\n\n/* inline functions */\ntypedef struct InlineFunc {\n    int *token_str;\n    Sym *sym;\n    char filename[1];\n} InlineFunc;\n\n/* include file cache, used to find files faster and also to eliminate\n   inclusion if the include file is protected by #ifndef ... #endif */\ntypedef struct CachedInclude {\n    int ifndef_macro;\n    int hash_next; /* -1 if none */\n    char filename[1]; /* path specified in #include */\n} CachedInclude;\n\n#define CACHED_INCLUDES_HASH_SIZE 512\n\n#ifdef CONFIG_TCC_ASM\ntypedef struct ExprValue {\n    uint32_t v;\n    Sym *sym;\n} ExprValue;\n\n#define MAX_ASM_OPERANDS 30\ntypedef struct ASMOperand {\n    int id; /* GCC 3 optionnal identifier (0 if number only supported */\n    char *constraint;\n    char asm_str[16]; /* computed asm string for operand */\n    SValue *vt; /* C value of the expression */\n    int ref_index; /* if >= 0, gives reference to a output constraint */\n    int input_index; /* if >= 0, gives reference to an input constraint */\n    int priority; /* priority, used to assign registers */\n    int reg; /* if >= 0, register number used for this operand */\n    int is_llong; /* true if double register value */\n    int is_memory; /* true if memory operand */\n    int is_rw;     /* for '+' modifier */\n} ASMOperand;\n#endif\n\nstruct sym_attr {\n    unsigned long got_offset;\n#ifdef TCC_TARGET_ARM\n    unsigned char plt_thumb_stub:1;\n#endif\n};\n\nstruct TCCState {\n\n    int verbose; /* if true, display some information during compilation */\n    int nostdinc; /* if true, no standard headers are added */\n    int nostdlib; /* if true, no standard libraries are added */\n    int nocommon; /* if true, do not use common symbols for .bss data */\n    int static_link; /* if true, static linking is performed */\n    int rdynamic; /* if true, all symbols are exported */\n    int symbolic; /* if true, resolve symbols in the current module first */\n    int alacarte_link; /* if true, only link in referenced objects from archive */\n\n    char *tcc_lib_path; /* CONFIG_TCCDIR or -B option */\n    char *soname; /* as specified on the command line (-soname) */\n    char *rpath; /* as specified on the command line (-Wl,-rpath=) */\n\n    /* output type, see TCC_OUTPUT_XXX */\n    int output_type;\n    /* output format, see TCC_OUTPUT_FORMAT_xxx */\n    int output_format;\n\n    /* C language options */\n    int char_is_unsigned;\n    int leading_underscore;\n    \n    /* warning switches */\n    int warn_write_strings;\n    int warn_unsupported;\n    int warn_error;\n    int warn_none;\n    int warn_implicit_function_declaration;\n\n    /* compile with debug symbol (and use them if error during execution) */\n    int do_debug;\n#ifdef CONFIG_TCC_BCHECK\n    /* compile with built-in memory and bounds checker */\n    int do_bounds_check;\n#endif\n\n    addr_t text_addr; /* address of text section */\n    int has_text_addr;\n\n    unsigned long section_align; /* section alignment */\n\n    char *init_symbol; /* symbols to call at load-time (not used currently) */\n    char *fini_symbol; /* symbols to call at unload-time (not used currently) */\n    \n#ifdef TCC_TARGET_I386\n    int seg_size; /* 32. Can be 16 with i386 assembler (.code16) */\n#endif\n\n    /* array of all loaded dlls (including those referenced by loaded dlls) */\n    DLLReference **loaded_dlls;\n    int nb_loaded_dlls;\n\n    /* include paths */\n    char **include_paths;\n    int nb_include_paths;\n\n    char **sysinclude_paths;\n    int nb_sysinclude_paths;\n\n    /* library paths */\n    char **library_paths;\n    int nb_library_paths;\n\n    /* crt?.o object path */\n    char **crt_paths;\n    int nb_crt_paths;\n\n    /* error handling */\n    void *error_opaque;\n    void (*error_func)(void *opaque, const char *msg);\n    int error_set_jmp_enabled;\n    jmp_buf error_jmp_buf;\n    int nb_errors;\n\n    /* output file for preprocessing (-E) */\n    FILE *ppfp;\n\n    /* for -MD/-MF: collected dependencies for this compilation */\n    char **target_deps;\n    int nb_target_deps;\n\n    /* compilation */\n    BufferedFile *include_stack[INCLUDE_STACK_SIZE];\n    BufferedFile **include_stack_ptr;\n\n    int ifdef_stack[IFDEF_STACK_SIZE];\n    int *ifdef_stack_ptr;\n\n    /* included files enclosed with #ifndef MACRO */\n    int cached_includes_hash[CACHED_INCLUDES_HASH_SIZE];\n    CachedInclude **cached_includes;\n    int nb_cached_includes;\n\n    /* #pragma pack stack */\n    int pack_stack[PACK_STACK_SIZE];\n    int *pack_stack_ptr;\n\n    /* inline functions are stored as token lists and compiled last\n       only if referenced */\n    struct InlineFunc **inline_fns;\n    int nb_inline_fns;\n\n    /* sections */\n    Section **sections;\n    int nb_sections; /* number of sections, including first dummy section */\n\n    Section **priv_sections;\n    int nb_priv_sections; /* number of private sections */\n\n    /* got & plt handling */\n    Section *got;\n    Section *plt;\n    struct sym_attr *sym_attrs;\n    int nb_sym_attrs;\n    /* give the correspondance from symtab indexes to dynsym indexes */\n    int *symtab_to_dynsym;\n\n    /* temporary dynamic symbol sections (for dll loading) */\n    Section *dynsymtab_section;\n    /* exported dynamic symbol section */\n    Section *dynsym;\n    /* copy of the gobal symtab_section variable */\n    Section *symtab;\n    /* tiny assembler state */\n    Sym *asm_labels;\n\n#ifdef TCC_TARGET_PE\n    /* PE info */\n    int pe_subsystem;\n    unsigned pe_file_align;\n    unsigned pe_stack_size;\n# ifdef TCC_TARGET_X86_64\n    Section *uw_pdata;\n    int uw_sym;\n    unsigned uw_offs;\n# endif\n#endif\n\n#ifdef TCC_IS_NATIVE\n    /* for tcc_relocate */\n    void *runtime_mem;\n# ifdef HAVE_SELINUX\n    void *write_mem;\n    unsigned long mem_size;\n# endif\n# if !defined TCC_TARGET_PE && (defined TCC_TARGET_X86_64 || defined TCC_TARGET_ARM)\n    /* write PLT and GOT here */\n    char *runtime_plt_and_got;\n    unsigned runtime_plt_and_got_offset;\n#  define TCC_HAS_RUNTIME_PLTGOT\n# endif\n#endif\n\n    /* used by main and tcc_parse_args only */\n    char **files; /* files seen on command line */\n    int nb_files; /* number thereof */\n    int nb_libraries; /* number of libs thereof */\n    char *outfile; /* output filename */\n    char *option_m; /* only -m32/-m64 handled */\n    int print_search_dirs; /* option */\n    int option_r; /* option -r */\n    int do_bench; /* option -bench */\n    int gen_deps; /* option -MD  */\n    char *deps_outfile; /* option -MF */\n};\n\n/* The current value can be: */\n#define VT_VALMASK   0x003f  /* mask for value location, register or: */\n#define VT_CONST     0x0030  /* constant in vc (must be first non register value) */\n#define VT_LLOCAL    0x0031  /* lvalue, offset on stack */\n#define VT_LOCAL     0x0032  /* offset on stack */\n#define VT_CMP       0x0033  /* the value is stored in processor flags (in vc) */\n#define VT_JMP       0x0034  /* value is the consequence of jmp true (even) */\n#define VT_JMPI      0x0035  /* value is the consequence of jmp false (odd) */\n#define VT_REF       0x0040  /* value is pointer to structure rather than address */\n#define VT_LVAL      0x0100  /* var is an lvalue */\n#define VT_SYM       0x0200  /* a symbol value is added */\n#define VT_MUSTCAST  0x0400  /* value must be casted to be correct (used for\n                                char/short stored in integer registers) */\n#define VT_MUSTBOUND 0x0800  /* bound checking must be done before\n                                dereferencing value */\n#define VT_BOUNDED   0x8000  /* value is bounded. The address of the\n                                bounding function call point is in vc */\n#define VT_LVAL_BYTE     0x1000  /* lvalue is a byte */\n#define VT_LVAL_SHORT    0x2000  /* lvalue is a short */\n#define VT_LVAL_UNSIGNED 0x4000  /* lvalue is unsigned */\n#define VT_LVAL_TYPE     (VT_LVAL_BYTE | VT_LVAL_SHORT | VT_LVAL_UNSIGNED)\n\n/* types */\n#define VT_BTYPE       0x000f  /* mask for basic type */\n#define VT_INT              0  /* integer type */\n#define VT_BYTE             1  /* signed byte type */\n#define VT_SHORT            2  /* short type */\n#define VT_VOID             3  /* void type */\n#define VT_PTR              4  /* pointer */\n#define VT_ENUM             5  /* enum definition */\n#define VT_FUNC             6  /* function type */\n#define VT_STRUCT           7  /* struct/union definition */\n#define VT_FLOAT            8  /* IEEE float */\n#define VT_DOUBLE           9  /* IEEE double */\n#define VT_LDOUBLE         10  /* IEEE long double */\n#define VT_BOOL            11  /* ISOC99 boolean type */\n#define VT_LLONG           12  /* 64 bit integer */\n#define VT_LONG            13  /* long integer (NEVER USED as type, only\n                                  during parsing) */\n#define VT_UNSIGNED    0x0010  /* unsigned type */\n#define VT_ARRAY       0x0020  /* array type (also has VT_PTR) */\n#define VT_BITFIELD    0x0040  /* bitfield modifier */\n#define VT_CONSTANT    0x0800  /* const modifier */\n#define VT_VOLATILE    0x1000  /* volatile modifier */\n#define VT_SIGNED      0x2000  /* signed type */\n#define VT_VLA     0x00020000  /* VLA type (also has VT_PTR and VT_ARRAY) */\n\n/* storage */\n#define VT_EXTERN  0x00000080  /* extern definition */\n#define VT_STATIC  0x00000100  /* static variable */\n#define VT_TYPEDEF 0x00000200  /* typedef definition */\n#define VT_INLINE  0x00000400  /* inline definition */\n#define VT_IMPORT  0x00004000  /* win32: extern data imported from dll */\n#define VT_EXPORT  0x00008000  /* win32: data exported from dll */\n#define VT_WEAK    0x00010000  /* weak symbol */\n\n#define VT_STRUCT_SHIFT 18     /* shift for bitfield shift values (max: 32 - 2*6) */\n\n/* type mask (except storage) */\n#define VT_STORAGE (VT_EXTERN | VT_STATIC | VT_TYPEDEF | VT_INLINE | VT_IMPORT | VT_EXPORT | VT_WEAK)\n#define VT_TYPE (~(VT_STORAGE))\n\n/* token values */\n\n/* warning: the following compare tokens depend on i386 asm code */\n#define TOK_ULT 0x92\n#define TOK_UGE 0x93\n#define TOK_EQ  0x94\n#define TOK_NE  0x95\n#define TOK_ULE 0x96\n#define TOK_UGT 0x97\n#define TOK_Nset 0x98\n#define TOK_Nclear 0x99\n#define TOK_LT  0x9c\n#define TOK_GE  0x9d\n#define TOK_LE  0x9e\n#define TOK_GT  0x9f\n\n#define TOK_LAND  0xa0\n#define TOK_LOR   0xa1\n\n#define TOK_DEC   0xa2\n#define TOK_MID   0xa3 /* inc/dec, to void constant */\n#define TOK_INC   0xa4\n#define TOK_UDIV  0xb0 /* unsigned division */\n#define TOK_UMOD  0xb1 /* unsigned modulo */\n#define TOK_PDIV  0xb2 /* fast division with undefined rounding for pointers */\n#define TOK_CINT   0xb3 /* number in tokc */\n#define TOK_CCHAR 0xb4 /* char constant in tokc */\n#define TOK_STR   0xb5 /* pointer to string in tokc */\n#define TOK_TWOSHARPS 0xb6 /* ## preprocessing token */\n#define TOK_LCHAR    0xb7\n#define TOK_LSTR     0xb8\n#define TOK_CFLOAT   0xb9 /* float constant */\n#define TOK_LINENUM  0xba /* line number info */\n#define TOK_CDOUBLE  0xc0 /* double constant */\n#define TOK_CLDOUBLE 0xc1 /* long double constant */\n#define TOK_UMULL    0xc2 /* unsigned 32x32 -> 64 mul */\n#define TOK_ADDC1    0xc3 /* add with carry generation */\n#define TOK_ADDC2    0xc4 /* add with carry use */\n#define TOK_SUBC1    0xc5 /* add with carry generation */\n#define TOK_SUBC2    0xc6 /* add with carry use */\n#define TOK_CUINT    0xc8 /* unsigned int constant */\n#define TOK_CLLONG   0xc9 /* long long constant */\n#define TOK_CULLONG  0xca /* unsigned long long constant */\n#define TOK_ARROW    0xcb\n#define TOK_DOTS     0xcc /* three dots */\n#define TOK_SHR      0xcd /* unsigned shift right */\n#define TOK_PPNUM    0xce /* preprocessor number */\n#define TOK_NOSUBST  0xcf /* means following token has already been pp'd */\n\n#define TOK_SHL   0x01 /* shift left */\n#define TOK_SAR   0x02 /* signed shift right */\n  \n/* assignement operators : normal operator or 0x80 */\n#define TOK_A_MOD 0xa5\n#define TOK_A_AND 0xa6\n#define TOK_A_MUL 0xaa\n#define TOK_A_ADD 0xab\n#define TOK_A_SUB 0xad\n#define TOK_A_DIV 0xaf\n#define TOK_A_XOR 0xde\n#define TOK_A_OR  0xfc\n#define TOK_A_SHL 0x81\n#define TOK_A_SAR 0x82\n\n#ifndef offsetof\n#define offsetof(type, field) ((size_t) &((type *)0)->field)\n#endif\n\n#ifndef countof\n#define countof(tab) (sizeof(tab) / sizeof((tab)[0]))\n#endif\n\n#define TOK_EOF       (-1)  /* end of file */\n#define TOK_LINEFEED  10    /* line feed */\n\n/* all identificators and strings have token above that */\n#define TOK_IDENT 256\n\n#define DEF_ASM(x) DEF(TOK_ASM_ ## x, #x)\n#define TOK_ASM_int TOK_INT\n#define TOK_ASM_weak TOK_WEAK1\n\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n/* only used for i386 asm opcodes definitions */\n#define DEF_BWL(x) \\\n DEF(TOK_ASM_ ## x ## b, #x \"b\") \\\n DEF(TOK_ASM_ ## x ## w, #x \"w\") \\\n DEF(TOK_ASM_ ## x ## l, #x \"l\") \\\n DEF(TOK_ASM_ ## x, #x)\n#define DEF_WL(x) \\\n DEF(TOK_ASM_ ## x ## w, #x \"w\") \\\n DEF(TOK_ASM_ ## x ## l, #x \"l\") \\\n DEF(TOK_ASM_ ## x, #x)\n#ifdef TCC_TARGET_X86_64\n# define DEF_BWLQ(x) \\\n DEF(TOK_ASM_ ## x ## b, #x \"b\") \\\n DEF(TOK_ASM_ ## x ## w, #x \"w\") \\\n DEF(TOK_ASM_ ## x ## l, #x \"l\") \\\n DEF(TOK_ASM_ ## x ## q, #x \"q\") \\\n DEF(TOK_ASM_ ## x, #x)\n# define DEF_WLQ(x) \\\n DEF(TOK_ASM_ ## x ## w, #x \"w\") \\\n DEF(TOK_ASM_ ## x ## l, #x \"l\") \\\n DEF(TOK_ASM_ ## x ## q, #x \"q\") \\\n DEF(TOK_ASM_ ## x, #x)\n# define DEF_BWLX DEF_BWLQ\n# define DEF_WLX DEF_WLQ\n/* number of sizes + 1 */\n# define NBWLX 5\n#else\n# define DEF_BWLX DEF_BWL\n# define DEF_WLX DEF_WL\n/* number of sizes + 1 */\n# define NBWLX 4\n#endif\n\n#define DEF_FP1(x) \\\n DEF(TOK_ASM_ ## f ## x ## s, \"f\" #x \"s\") \\\n DEF(TOK_ASM_ ## fi ## x ## l, \"fi\" #x \"l\") \\\n DEF(TOK_ASM_ ## f ## x ## l, \"f\" #x \"l\") \\\n DEF(TOK_ASM_ ## fi ## x ## s, \"fi\" #x \"s\")\n\n#define DEF_FP(x) \\\n DEF(TOK_ASM_ ## f ## x, \"f\" #x ) \\\n DEF(TOK_ASM_ ## f ## x ## p, \"f\" #x \"p\") \\\n DEF_FP1(x)\n\n#define DEF_ASMTEST(x) \\\n DEF_ASM(x ## o) \\\n DEF_ASM(x ## no) \\\n DEF_ASM(x ## b) \\\n DEF_ASM(x ## c) \\\n DEF_ASM(x ## nae) \\\n DEF_ASM(x ## nb) \\\n DEF_ASM(x ## nc) \\\n DEF_ASM(x ## ae) \\\n DEF_ASM(x ## e) \\\n DEF_ASM(x ## z) \\\n DEF_ASM(x ## ne) \\\n DEF_ASM(x ## nz) \\\n DEF_ASM(x ## be) \\\n DEF_ASM(x ## na) \\\n DEF_ASM(x ## nbe) \\\n DEF_ASM(x ## a) \\\n DEF_ASM(x ## s) \\\n DEF_ASM(x ## ns) \\\n DEF_ASM(x ## p) \\\n DEF_ASM(x ## pe) \\\n DEF_ASM(x ## np) \\\n DEF_ASM(x ## po) \\\n DEF_ASM(x ## l) \\\n DEF_ASM(x ## nge) \\\n DEF_ASM(x ## nl) \\\n DEF_ASM(x ## ge) \\\n DEF_ASM(x ## le) \\\n DEF_ASM(x ## ng) \\\n DEF_ASM(x ## nle) \\\n DEF_ASM(x ## g)\n\n#endif // defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n\nenum tcc_token {\n    TOK_LAST = TOK_IDENT - 1,\n#define DEF(id, str) id,\n#include \"tcctok.h\"\n#undef DEF\n};\n\n#define TOK_UIDENT TOK_DEFINE\n\n#ifdef _WIN32\n#define snprintf _snprintf\n#define vsnprintf _vsnprintf\n#ifndef __GNUC__\n  #define strtold (long double)strtod\n  #define strtof (float)strtod\n  #define strtoll _strtoi64\n  #define strtoull _strtoui64\n#endif\n#else\n/* XXX: need to define this to use them in non ISOC99 context */\n#ifndef ANDROID\nextern float strtof (const char *__nptr, char **__endptr);\nextern long double strtold (const char *__nptr, char **__endptr);\n#else\n#define strtof (float)strtod\n#define strtold (long double)strtod\n#endif\n#endif\n\n#ifdef _WIN32\n#define IS_DIRSEP(c) (c == '/' || c == '\\\\')\n#define IS_ABSPATH(p) (IS_DIRSEP(p[0]) || (p[0] && p[1] == ':' && IS_DIRSEP(p[2])))\n#define PATHCMP stricmp\n#else\n#define IS_DIRSEP(c) (c == '/')\n#define IS_ABSPATH(p) IS_DIRSEP(p[0])\n#define PATHCMP strcmp\n#endif\n\n#ifdef TCC_TARGET_PE\n#define PATHSEP ';'\n#else\n#define PATHSEP ':'\n#endif\n\n/* space exlcuding newline */\nstatic inline int is_space(int ch)\n{\n    return ch == ' ' || ch == '\\t' || ch == '\\v' || ch == '\\f' || ch == '\\r';\n}\n\nstatic inline int isid(int c)\n{\n    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_';\n}\n\nstatic inline int isnum(int c)\n{\n    return c >= '0' && c <= '9';\n}\n\nstatic inline int isoct(int c)\n{\n    return c >= '0' && c <= '7';\n}\n\nstatic inline int toup(int c)\n{\n    return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c;\n}\n\n#ifndef PUB_FUNC\n# define PUB_FUNC\n#endif\n\n#ifdef ONE_SOURCE\n#define ST_INLN static inline\n#define ST_FUNC static\n#define ST_DATA static\n#else\n#define ST_INLN\n#define ST_FUNC\n#define ST_DATA extern\n#endif\n\n/* ------------ libtcc.c ------------ */\n\n/* use GNU C extensions */\nST_DATA int gnu_ext;\n/* use Tiny C extensions */\nST_DATA int tcc_ext;\n/* XXX: get rid of this ASAP */\nST_DATA struct TCCState *tcc_state;\n\n#ifdef MEM_DEBUG\nST_DATA int mem_cur_size;\nST_DATA int mem_max_size;\n#endif\n\n#define AFF_PRINT_ERROR     0x0001 /* print error if file not found */\n#define AFF_REFERENCED_DLL  0x0002 /* load a referenced dll from another dll */\n#define AFF_PREPROCESS      0x0004 /* preprocess file */\n\n/* public functions currently used by the tcc main function */\nPUB_FUNC char *pstrcpy(char *buf, int buf_size, const char *s);\nPUB_FUNC char *pstrcat(char *buf, int buf_size, const char *s);\nPUB_FUNC char *pstrncpy(char *out, const char *in, size_t num);\nPUB_FUNC char *tcc_basename(const char *name);\nPUB_FUNC char *tcc_fileextension (const char *name);\nPUB_FUNC void tcc_free(void *ptr);\nPUB_FUNC void *tcc_malloc(unsigned long size);\nPUB_FUNC void *tcc_mallocz(unsigned long size);\nPUB_FUNC void *tcc_realloc(void *ptr, unsigned long size);\nPUB_FUNC char *tcc_strdup(const char *str);\n#define free(p) use_tcc_free(p)\n#define malloc(s) use_tcc_malloc(s)\n#define realloc(p, s) use_tcc_realloc(p, s)\n#undef strdup\n#define strdup(s) use_tcc_strdup(s)\nPUB_FUNC void tcc_memstats(void);\nPUB_FUNC void tcc_error_noabort(const char *fmt, ...);\nPUB_FUNC void tcc_error(const char *fmt, ...);\nPUB_FUNC void tcc_warning(const char *fmt, ...);\n\n/* other utilities */\nST_FUNC void dynarray_add(void ***ptab, int *nb_ptr, void *data);\nST_FUNC void dynarray_reset(void *pp, int *n);\nST_FUNC void cstr_ccat(CString *cstr, int ch);\nST_FUNC void cstr_cat(CString *cstr, const char *str);\nST_FUNC void cstr_wccat(CString *cstr, int ch);\nST_FUNC void cstr_new(CString *cstr);\nST_FUNC void cstr_free(CString *cstr);\nST_FUNC void cstr_reset(CString *cstr);\n\nST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags);\nST_FUNC void section_realloc(Section *sec, unsigned long new_size);\nST_FUNC void *section_ptr_add(Section *sec, unsigned long size);\nST_FUNC void section_reserve(Section *sec, unsigned long size);\nST_FUNC Section *find_section(TCCState *s1, const char *name);\n\nST_FUNC void put_extern_sym2(Sym *sym, Section *section, addr_t value, unsigned long size, int can_add_underscore);\nST_FUNC void put_extern_sym(Sym *sym, Section *section, addr_t value, unsigned long size);\nST_FUNC void greloc(Section *s, Sym *sym, unsigned long offset, int type);\n\nST_INLN void sym_free(Sym *sym);\nST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c);\nST_FUNC Sym *sym_find2(Sym *s, int v);\nST_FUNC Sym *sym_push(int v, CType *type, int r, int c);\nST_FUNC void sym_pop(Sym **ptop, Sym *b);\nST_INLN Sym *struct_find(int v);\nST_INLN Sym *sym_find(int v);\nST_FUNC Sym *global_identifier_push(int v, int t, int c);\n\nST_FUNC void tcc_open_bf(TCCState *s1, const char *filename, int initlen);\nST_FUNC int tcc_open(TCCState *s1, const char *filename);\nST_FUNC void tcc_close(void);\n\nST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags);\nST_FUNC int tcc_add_crt(TCCState *s, const char *filename);\nST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags);\n\nPUB_FUNC void tcc_print_stats(TCCState *s, int64_t total_time);\nPUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv);\n\n/* ------------ tccpp.c ------------ */\n\nST_DATA struct BufferedFile *file;\nST_DATA int ch, tok;\nST_DATA CValue tokc;\nST_DATA const int *macro_ptr;\nST_DATA int parse_flags;\nST_DATA int tok_flags;\nST_DATA CString tokcstr; /* current parsed string, if any */\n\n/* display benchmark infos */\nST_DATA int total_lines;\nST_DATA int total_bytes;\nST_DATA int tok_ident;\nST_DATA TokenSym **table_ident;\n\n#define TOK_FLAG_BOL   0x0001 /* beginning of line before */\n#define TOK_FLAG_BOF   0x0002 /* beginning of file before */\n#define TOK_FLAG_ENDIF 0x0004 /* a endif was found matching starting #ifdef */\n#define TOK_FLAG_EOF   0x0008 /* end of file */\n\n#define PARSE_FLAG_PREPROCESS 0x0001 /* activate preprocessing */\n#define PARSE_FLAG_TOK_NUM    0x0002 /* return numbers instead of TOK_PPNUM */\n#define PARSE_FLAG_LINEFEED   0x0004 /* line feed is returned as a\n                                        token. line feed is also\n                                        returned at eof */\n#define PARSE_FLAG_ASM_COMMENTS 0x0008 /* '#' can be used for line comment */\n#define PARSE_FLAG_SPACES     0x0010 /* next() returns space tokens (for -E) */\n\nST_FUNC TokenSym *tok_alloc(const char *str, int len);\nST_FUNC char *get_tok_str(int v, CValue *cv);\nST_FUNC void save_parse_state(ParseState *s);\nST_FUNC void restore_parse_state(ParseState *s);\nST_INLN void tok_str_new(TokenString *s);\nST_FUNC void tok_str_free(int *str);\nST_FUNC void tok_str_add(TokenString *s, int t);\nST_FUNC void tok_str_add_tok(TokenString *s);\nST_INLN void define_push(int v, int macro_type, int *str, Sym *first_arg);\nST_FUNC void define_undef(Sym *s);\nST_INLN Sym *define_find(int v);\nST_FUNC void free_defines(Sym *b);\nST_FUNC Sym *label_find(int v);\nST_FUNC Sym *label_push(Sym **ptop, int v, int flags);\nST_FUNC void label_pop(Sym **ptop, Sym *slast);\nST_FUNC void parse_define(void);\nST_FUNC void preprocess(int is_bof);\nST_FUNC void next_nomacro(void);\nST_FUNC void next(void);\nST_INLN void unget_tok(int last_tok);\nST_FUNC void preprocess_init(TCCState *s1);\nST_FUNC void preprocess_new(void);\nST_FUNC int tcc_preprocess(TCCState *s1);\nST_FUNC void skip(int c);\nST_FUNC void expect(const char *msg);\n\n/* ------------ tccgen.c ------------ */\n\nST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */\nST_DATA Section *cur_text_section; /* current section where function code is generated */\n#ifdef CONFIG_TCC_ASM\nST_DATA Section *last_text_section; /* to handle .previous asm directive */\n#endif\n#ifdef CONFIG_TCC_BCHECK\n/* bound check related sections */\nST_DATA Section *bounds_section; /* contains global data bound description */\nST_DATA Section *lbounds_section; /* contains local data bound description */\n#endif\n/* symbol sections */\nST_DATA Section *symtab_section, *strtab_section;\n/* debug sections */\nST_DATA Section *stab_section, *stabstr_section;\n\n#define SYM_POOL_NB (8192 / sizeof(Sym))\nST_DATA Sym *sym_free_first;\nST_DATA void **sym_pools;\nST_DATA int nb_sym_pools;\n\nST_DATA Sym *global_stack;\nST_DATA Sym *local_stack;\nST_DATA Sym *local_label_stack;\nST_DATA Sym *global_label_stack;\nST_DATA Sym *define_stack;\nST_DATA CType char_pointer_type, func_old_type, int_type, size_type;\nST_DATA SValue __vstack[1+/*to make bcheck happy*/ VSTACK_SIZE], *vtop;\n#define vstack  (__vstack + 1)\nST_DATA int rsym, anon_sym, ind, loc;\n\nST_DATA int const_wanted; /* true if constant wanted */\nST_DATA int nocode_wanted; /* true if no code generation wanted for an expression */\nST_DATA int global_expr;  /* true if compound literals must be allocated globally (used during initializers parsing */\nST_DATA CType func_vt; /* current function return type (used by return instruction) */\nST_DATA int func_vc;\nST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */\nST_DATA char *funcname;\n\nST_INLN int is_float(int t);\nST_FUNC int ieee_finite(double d);\nST_FUNC void test_lvalue(void);\nST_FUNC void swap(int *p, int *q);\nST_FUNC void vpushi(int v);\nST_FUNC Sym *external_global_sym(int v, CType *type, int r);\nST_FUNC void vset(CType *type, int r, int v);\nST_FUNC void vswap(void);\nST_FUNC void vpush_global_sym(CType *type, int v);\nST_FUNC void vrote(SValue *e, int n);\nST_FUNC void vrott(int n);\nST_FUNC void vrotb(int n);\n#ifdef TCC_TARGET_ARM\nST_FUNC int get_reg_ex(int rc, int rc2);\nST_FUNC void lexpand_nr(void);\n#endif\nST_FUNC void vpushv(SValue *v);\nST_FUNC void save_reg(int r);\nST_FUNC int get_reg(int rc);\nST_FUNC void save_regs(int n);\nST_FUNC int gv(int rc);\nST_FUNC void gv2(int rc1, int rc2);\nST_FUNC void vpop(void);\nST_FUNC void gen_op(int op);\nST_FUNC int type_size(CType *type, int *a);\nST_FUNC void mk_pointer(CType *type);\nST_FUNC void vstore(void);\nST_FUNC void inc(int post, int c);\nST_FUNC void parse_asm_str(CString *astr);\nST_FUNC int lvalue_type(int t);\nST_FUNC void indir(void);\nST_FUNC void unary(void);\nST_FUNC void expr_prod(void);\nST_FUNC void expr_sum(void);\nST_FUNC void gexpr(void);\nST_FUNC int expr_const(void);\nST_FUNC void gen_inline_functions(void);\nST_FUNC void decl(int l);\n#if defined CONFIG_TCC_BCHECK || defined TCC_TARGET_C67\nST_FUNC Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size);\n#endif\n\n/* ------------ tccelf.c ------------ */\n\n#define TCC_OUTPUT_FORMAT_ELF    0 /* default output format: ELF */\n#define TCC_OUTPUT_FORMAT_BINARY 1 /* binary image output */\n#define TCC_OUTPUT_FORMAT_COFF   2 /* COFF */\n\n#define ARMAG  \"!<arch>\\012\"    /* For COFF and a.out archives */\n\ntypedef struct {\n    unsigned int n_strx;         /* index into string table of name */\n    unsigned char n_type;         /* type of symbol */\n    unsigned char n_other;        /* misc info (usually empty) */\n    unsigned short n_desc;        /* description field */\n    unsigned int n_value;        /* value of symbol */\n} Stab_Sym;\n\nST_FUNC Section *new_symtab(TCCState *s1, const char *symtab_name, int sh_type, int sh_flags, const char *strtab_name, const char *hash_name, int hash_sh_flags);\n\nST_FUNC int put_elf_str(Section *s, const char *sym);\nST_FUNC int put_elf_sym(Section *s, addr_t value, unsigned long size, int info, int other, int shndx, const char *name);\nST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, int info, int other, int sh_num, const char *name);\nST_FUNC int find_elf_sym(Section *s, const char *name);\nST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset, int type, int symbol);\n\nST_FUNC void put_stabs(const char *str, int type, int other, int desc, unsigned long value);\nST_FUNC void put_stabs_r(const char *str, int type, int other, int desc, unsigned long value, Section *sec, int sym_index);\nST_FUNC void put_stabn(int type, int other, int desc, int value);\nST_FUNC void put_stabd(int type, int other, int desc);\n\nST_FUNC void relocate_common_syms(void);\nST_FUNC void relocate_syms(TCCState *s1, int do_resolve);\nST_FUNC void relocate_section(TCCState *s1, Section *s);\n\nST_FUNC void tcc_add_linker_symbols(TCCState *s1);\nST_FUNC int tcc_load_object_file(TCCState *s1, int fd, unsigned long file_offset);\nST_FUNC int tcc_load_archive(TCCState *s1, int fd);\nST_FUNC void tcc_add_bcheck(TCCState *s1);\n\nST_FUNC void build_got_entries(TCCState *s1);\nST_FUNC void tcc_add_runtime(TCCState *s1);\n\nST_FUNC addr_t get_elf_sym_addr(TCCState *s, const char *name, int err);\n#ifdef TCC_IS_NATIVE\nST_FUNC void *tcc_get_symbol_err(TCCState *s, const char *name);\n#endif\n\n#ifndef TCC_TARGET_PE\nST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level);\nST_FUNC int tcc_load_ldscript(TCCState *s1);\nST_FUNC uint8_t *parse_comment(uint8_t *p);\nST_FUNC void minp(void);\nST_INLN void inp(void);\nST_FUNC int handle_eob(void);\n#endif\n\n/* ------------ xxx-gen.c ------------ */\n\n#ifdef TCC_TARGET_X86_64\nST_DATA const int reg_classes[NB_REGS+7];\n#else\nST_DATA const int reg_classes[NB_REGS];\n#endif\n\nST_FUNC void gsym_addr(int t, int a);\nST_FUNC void gsym(int t);\nST_FUNC void load(int r, SValue *sv);\nST_FUNC void store(int r, SValue *v);\nST_FUNC void gfunc_call(int nb_args);\nST_FUNC void gfunc_prolog(CType *func_type);\nST_FUNC void gfunc_epilog(void);\nST_FUNC int gjmp(int t);\nST_FUNC void gjmp_addr(int a);\nST_FUNC int gtst(int inv, int t);\nST_FUNC void gen_opi(int op);\nST_FUNC void gen_opf(int op);\nST_FUNC void gen_cvt_ftoi(int t);\nST_FUNC void gen_cvt_ftof(int t);\nST_FUNC void ggoto(void);\n#ifndef TCC_TARGET_C67\nST_FUNC void o(unsigned int c);\n#endif\n#ifndef TCC_TARGET_ARM\nST_FUNC void gen_cvt_itof(int t);\n#endif\n\n/* ------------ i386-gen.c ------------ */\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\nST_FUNC void g(int c);\nST_FUNC int oad(int c, int s);\nST_FUNC void gen_le16(int c);\nST_FUNC void gen_le32(int c);\nST_FUNC void gen_addr32(int r, Sym *sym, int c);\nST_FUNC void gen_addrpc32(int r, Sym *sym, int c);\n#endif\n\n#ifdef CONFIG_TCC_BCHECK\nST_FUNC void gen_bounded_ptr_add(void);\nST_FUNC void gen_bounded_ptr_deref(void);\n#endif\n\n/* ------------ x86_64-gen.c ------------ */\n#ifdef TCC_TARGET_X86_64\nST_FUNC void gen_addr64(int r, Sym *sym, int64_t c);\nST_FUNC void gen_opl(int op);\n#endif\n\n/* ------------ arm-gen.c ------------ */\n#ifdef TCC_TARGET_ARM\nST_FUNC void arm_init_types(void);\nST_FUNC uint32_t encbranch(int pos, int addr, int fail);\nST_FUNC void gen_cvt_itof1(int t);\n#endif\n\n/* ------------ c67-gen.c ------------ */\n#ifdef TCC_TARGET_C67\n#endif\n\n/* ------------ tcccoff.c ------------ */\n\n#ifdef TCC_TARGET_COFF\nST_FUNC int tcc_output_coff(TCCState *s1, FILE *f);\nST_FUNC int tcc_load_coff(TCCState * s1, int fd);\n#endif\n\n/* ------------ tccasm.c ------------ */\nST_FUNC void asm_instr(void);\nST_FUNC void asm_global_instr(void);\n#ifdef CONFIG_TCC_ASM\nST_FUNC int find_constraint(ASMOperand *operands, int nb_operands, const char *name, const char **pp);\nST_FUNC void asm_expr(TCCState *s1, ExprValue *pe);\nST_FUNC int asm_int_expr(TCCState *s1);\nST_FUNC int tcc_assemble(TCCState *s1, int do_preprocess);\n/* ------------ i386-asm.c ------------ */\nST_FUNC void gen_expr32(ExprValue *pe);\nST_FUNC void asm_opcode(TCCState *s1, int opcode);\nST_FUNC void asm_compute_constraints(ASMOperand *operands, int nb_operands, int nb_outputs, const uint8_t *clobber_regs, int *pout_reg);\nST_FUNC void subst_asm_operand(CString *add_str, SValue *sv, int modifier);\nST_FUNC void asm_gen_code(ASMOperand *operands, int nb_operands, int nb_outputs, int is_output, uint8_t *clobber_regs, int out_reg);\nST_FUNC void asm_clobber(uint8_t *clobber_regs, const char *str);\n#endif\n\n/* ------------ tccpe.c -------------- */\n#ifdef TCC_TARGET_PE\nST_FUNC int pe_load_file(struct TCCState *s1, const char *filename, int fd);\nST_FUNC int pe_output_file(TCCState * s1, const char *filename);\nST_FUNC int pe_putimport(TCCState *s1, int dllindex, const char *name, addr_t value);\nST_FUNC SValue *pe_getimport(SValue *sv, SValue *v2);\n#ifdef TCC_TARGET_X86_64\nST_FUNC void pe_add_unwind_data(unsigned start, unsigned end, unsigned stack);\n#endif\n#endif\n\n/* ------------ tccrun.c ----------------- */\n#ifdef TCC_IS_NATIVE\n#ifdef CONFIG_TCC_STATIC\n#define RTLD_LAZY       0x001\n#define RTLD_NOW        0x002\n#define RTLD_GLOBAL     0x100\n#define RTLD_DEFAULT    NULL\n/* dummy function for profiling */\nST_FUNC void *dlopen(const char *filename, int flag);\nST_FUNC void dlclose(void *p);\nST_FUNC const char *dlerror(void);\nST_FUNC void *resolve_sym(TCCState *s1, const char *symbol);\n#elif !defined _WIN32\nST_FUNC void *resolve_sym(TCCState *s1, const char *symbol);\n#endif\n\n#ifdef CONFIG_TCC_BACKTRACE\nST_DATA int rt_num_callers;\nST_DATA const char **rt_bound_error_msg;\nST_DATA void *rt_prog_main;\nST_FUNC void tcc_set_num_callers(int n);\n#endif\n#endif\n\n/********************************************************/\n#undef ST_DATA\n#ifdef ONE_SOURCE\n#define ST_DATA static\n#else\n#define ST_DATA\n#endif\n/********************************************************/\n#endif /* _TCC_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tccasm.c",
    "content": "/*\n *  GAS like assembler for TCC\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n#ifdef CONFIG_TCC_ASM\n\nST_FUNC int asm_get_local_label_name(TCCState *s1, unsigned int n)\n{\n    char buf[64];\n    TokenSym *ts;\n\n    snprintf(buf, sizeof(buf), \"L..%u\", n);\n    ts = tok_alloc(buf, strlen(buf));\n    return ts->tok;\n}\n\nST_FUNC void asm_expr(TCCState *s1, ExprValue *pe);\n\n/* We do not use the C expression parser to handle symbols. Maybe the\n   C expression parser could be tweaked to do so. */\n\nstatic void asm_expr_unary(TCCState *s1, ExprValue *pe)\n{\n    Sym *sym;\n    int op, n, label;\n    const char *p;\n\n    switch(tok) {\n    case TOK_PPNUM:\n        p = tokc.cstr->data;\n        n = strtoul(p, (char **)&p, 0);\n        if (*p == 'b' || *p == 'f') {\n            /* backward or forward label */\n            label = asm_get_local_label_name(s1, n);\n            sym = label_find(label);\n            if (*p == 'b') {\n                /* backward : find the last corresponding defined label */\n                if (sym && sym->r == 0)\n                    sym = sym->prev_tok;\n                if (!sym)\n                    tcc_error(\"local label '%d' not found backward\", n);\n            } else {\n                /* forward */\n                if (!sym || sym->r) {\n                    /* if the last label is defined, then define a new one */\n                    sym = label_push(&s1->asm_labels, label, 0);\n                    sym->type.t = VT_STATIC | VT_VOID;\n                }\n            }\n            pe->v = 0;\n            pe->sym = sym;\n        } else if (*p == '\\0') {\n            pe->v = n;\n            pe->sym = NULL;\n        } else {\n            tcc_error(\"invalid number syntax\");\n        }\n        next();\n        break;\n    case '+':\n        next();\n        asm_expr_unary(s1, pe);\n        break;\n    case '-':\n    case '~':\n        op = tok;\n        next();\n        asm_expr_unary(s1, pe);\n        if (pe->sym)\n            tcc_error(\"invalid operation with label\");\n        if (op == '-')\n            pe->v = -pe->v;\n        else\n            pe->v = ~pe->v;\n        break;\n    case TOK_CCHAR:\n    case TOK_LCHAR:\n\tpe->v = tokc.i;\n\tpe->sym = NULL;\n\tnext();\n\tbreak;\n    case '(':\n        next();\n        asm_expr(s1, pe);\n        skip(')');\n        break;\n    default:\n        if (tok >= TOK_IDENT) {\n            /* label case : if the label was not found, add one */\n            sym = label_find(tok);\n            if (!sym) {\n                sym = label_push(&s1->asm_labels, tok, 0);\n                /* NOTE: by default, the symbol is global */\n                sym->type.t = VT_VOID;\n            }\n            if (sym->r == SHN_ABS) {\n                /* if absolute symbol, no need to put a symbol value */\n                pe->v = sym->jnext;\n                pe->sym = NULL;\n            } else {\n                pe->v = 0;\n                pe->sym = sym;\n            }\n            next();\n        } else {\n            tcc_error(\"bad expression syntax [%s]\", get_tok_str(tok, &tokc));\n        }\n        break;\n    }\n}\n    \nstatic void asm_expr_prod(TCCState *s1, ExprValue *pe)\n{\n    int op;\n    ExprValue e2;\n\n    asm_expr_unary(s1, pe);\n    for(;;) {\n        op = tok;\n        if (op != '*' && op != '/' && op != '%' && \n            op != TOK_SHL && op != TOK_SAR)\n            break;\n        next();\n        asm_expr_unary(s1, &e2);\n        if (pe->sym || e2.sym)\n            tcc_error(\"invalid operation with label\");\n        switch(op) {\n        case '*':\n            pe->v *= e2.v;\n            break;\n        case '/':  \n            if (e2.v == 0) {\n            div_error:\n                tcc_error(\"division by zero\");\n            }\n            pe->v /= e2.v;\n            break;\n        case '%':  \n            if (e2.v == 0)\n                goto div_error;\n            pe->v %= e2.v;\n            break;\n        case TOK_SHL:\n            pe->v <<= e2.v;\n            break;\n        default:\n        case TOK_SAR:\n            pe->v >>= e2.v;\n            break;\n        }\n    }\n}\n\nstatic void asm_expr_logic(TCCState *s1, ExprValue *pe)\n{\n    int op;\n    ExprValue e2;\n\n    asm_expr_prod(s1, pe);\n    for(;;) {\n        op = tok;\n        if (op != '&' && op != '|' && op != '^')\n            break;\n        next();\n        asm_expr_prod(s1, &e2);\n        if (pe->sym || e2.sym)\n            tcc_error(\"invalid operation with label\");\n        switch(op) {\n        case '&':\n            pe->v &= e2.v;\n            break;\n        case '|':  \n            pe->v |= e2.v;\n            break;\n        default:\n        case '^':\n            pe->v ^= e2.v;\n            break;\n        }\n    }\n}\n\nstatic inline void asm_expr_sum(TCCState *s1, ExprValue *pe)\n{\n    int op;\n    ExprValue e2;\n\n    asm_expr_logic(s1, pe);\n    for(;;) {\n        op = tok;\n        if (op != '+' && op != '-')\n            break;\n        next();\n        asm_expr_logic(s1, &e2);\n        if (op == '+') {\n            if (pe->sym != NULL && e2.sym != NULL)\n                goto cannot_relocate;\n            pe->v += e2.v;\n            if (pe->sym == NULL && e2.sym != NULL)\n                pe->sym = e2.sym;\n        } else {\n            pe->v -= e2.v;\n            /* NOTE: we are less powerful than gas in that case\n               because we store only one symbol in the expression */\n            if (!pe->sym && !e2.sym) {\n                /* OK */\n            } else if (pe->sym && !e2.sym) {\n                /* OK */\n            } else if (pe->sym && e2.sym) {\n                if (pe->sym == e2.sym) { \n                    /* OK */\n                } else if (pe->sym->r == e2.sym->r && pe->sym->r != 0) {\n                    /* we also accept defined symbols in the same section */\n                    pe->v += pe->sym->jnext - e2.sym->jnext;\n                } else {\n                    goto cannot_relocate;\n                }\n                pe->sym = NULL; /* same symbols can be substracted to NULL */\n            } else {\n            cannot_relocate:\n                tcc_error(\"invalid operation with label\");\n            }\n        }\n    }\n}\n\nST_FUNC void asm_expr(TCCState *s1, ExprValue *pe)\n{\n    asm_expr_sum(s1, pe);\n}\n\nST_FUNC int asm_int_expr(TCCState *s1)\n{\n    ExprValue e;\n    asm_expr(s1, &e);\n    if (e.sym)\n        expect(\"constant\");\n    return e.v;\n}\n\n/* NOTE: the same name space as C labels is used to avoid using too\n   much memory when storing labels in TokenStrings */\nstatic void asm_new_label1(TCCState *s1, int label, int is_local,\n                           int sh_num, int value)\n{\n    Sym *sym;\n\n    sym = label_find(label);\n    if (sym) {\n        if (sym->r) {\n            /* the label is already defined */\n            if (!is_local) {\n                tcc_error(\"assembler label '%s' already defined\", \n                      get_tok_str(label, NULL));\n            } else {\n                /* redefinition of local labels is possible */\n                goto new_label;\n            }\n        }\n    } else {\n    new_label:\n        sym = label_push(&s1->asm_labels, label, 0);\n        sym->type.t = VT_STATIC | VT_VOID;\n    }\n    sym->r = sh_num;\n    sym->jnext = value;\n}\n\nstatic void asm_new_label(TCCState *s1, int label, int is_local)\n{\n    asm_new_label1(s1, label, is_local, cur_text_section->sh_num, ind);\n}\n\nstatic void asm_free_labels(TCCState *st)\n{\n    Sym *s, *s1;\n    Section *sec;\n    \n    for(s = st->asm_labels; s != NULL; s = s1) {\n        s1 = s->prev;\n        /* define symbol value in object file */\n        if (s->r) {\n            if (s->r == SHN_ABS)\n                sec = SECTION_ABS;\n            else\n                sec = st->sections[s->r];\n            put_extern_sym2(s, sec, s->jnext, 0, 0);\n        }\n        /* remove label */\n        table_ident[s->v - TOK_IDENT]->sym_label = NULL;\n        sym_free(s);\n    }\n    st->asm_labels = NULL;\n}\n\nstatic void use_section1(TCCState *s1, Section *sec)\n{\n    cur_text_section->data_offset = ind;\n    cur_text_section = sec;\n    ind = cur_text_section->data_offset;\n}\n\nstatic void use_section(TCCState *s1, const char *name)\n{\n    Section *sec;\n    sec = find_section(s1, name);\n    use_section1(s1, sec);\n}\n\nstatic void asm_parse_directive(TCCState *s1)\n{\n    int n, offset, v, size, tok1;\n    Section *sec;\n    uint8_t *ptr;\n\n    /* assembler directive */\n    next();\n    sec = cur_text_section;\n    switch(tok) {\n    case TOK_ASM_align:\n    case TOK_ASM_skip:\n    case TOK_ASM_space:\n        tok1 = tok;\n        next();\n        n = asm_int_expr(s1);\n        if (tok1 == TOK_ASM_align) {\n            if (n < 0 || (n & (n-1)) != 0)\n                tcc_error(\"alignment must be a positive power of two\");\n            offset = (ind + n - 1) & -n;\n            size = offset - ind;\n            /* the section must have a compatible alignment */\n            if (sec->sh_addralign < n)\n                sec->sh_addralign = n;\n        } else {\n            size = n;\n        }\n        v = 0;\n        if (tok == ',') {\n            next();\n            v = asm_int_expr(s1);\n        }\n    zero_pad:\n        if (sec->sh_type != SHT_NOBITS) {\n            sec->data_offset = ind;\n            ptr = section_ptr_add(sec, size);\n            memset(ptr, v, size);\n        }\n        ind += size;\n        break;\n    case TOK_ASM_quad:\n        next();\n        for(;;) {\n            uint64_t vl;\n            const char *p;\n\n            p = tokc.cstr->data;\n            if (tok != TOK_PPNUM) {\n            error_constant:\n                tcc_error(\"64 bit constant\");\n            }\n            vl = strtoll(p, (char **)&p, 0);\n            if (*p != '\\0')\n                goto error_constant;\n            next();\n            if (sec->sh_type != SHT_NOBITS) {\n                /* XXX: endianness */\n                gen_le32(vl);\n                gen_le32(vl >> 32);\n            } else {\n                ind += 8;\n            }\n            if (tok != ',')\n                break;\n            next();\n        }\n        break;\n    case TOK_ASM_byte:\n        size = 1;\n        goto asm_data;\n    case TOK_ASM_word:\n    case TOK_SHORT:\n        size = 2;\n        goto asm_data;\n    case TOK_LONG:\n    case TOK_INT:\n        size = 4;\n    asm_data:\n        next();\n        for(;;) {\n            ExprValue e;\n            asm_expr(s1, &e);\n            if (sec->sh_type != SHT_NOBITS) {\n                if (size == 4) {\n                    gen_expr32(&e);\n                } else {\n                    if (e.sym)\n                        expect(\"constant\");\n                    if (size == 1)\n                        g(e.v);\n                    else\n                        gen_le16(e.v);\n                }\n            } else {\n                ind += size;\n            }\n            if (tok != ',')\n                break;\n            next();\n        }\n        break;\n    case TOK_ASM_fill:\n        {\n            int repeat, size, val, i, j;\n            uint8_t repeat_buf[8];\n            next();\n            repeat = asm_int_expr(s1);\n            if (repeat < 0) {\n                tcc_error(\"repeat < 0; .fill ignored\");\n                break;\n            }\n            size = 1;\n            val = 0;\n            if (tok == ',') {\n                next();\n                size = asm_int_expr(s1);\n                if (size < 0) {\n                    tcc_error(\"size < 0; .fill ignored\");\n                    break;\n                }\n                if (size > 8)\n                    size = 8;\n                if (tok == ',') {\n                    next();\n                    val = asm_int_expr(s1);\n                }\n            }\n            /* XXX: endianness */\n            repeat_buf[0] = val;\n            repeat_buf[1] = val >> 8;\n            repeat_buf[2] = val >> 16;\n            repeat_buf[3] = val >> 24;\n            repeat_buf[4] = 0;\n            repeat_buf[5] = 0;\n            repeat_buf[6] = 0;\n            repeat_buf[7] = 0;\n            for(i = 0; i < repeat; i++) {\n                for(j = 0; j < size; j++) {\n                    g(repeat_buf[j]);\n                }\n            }\n        }\n        break;\n    case TOK_ASM_org:\n        {\n            unsigned long n;\n            next();\n            /* XXX: handle section symbols too */\n            n = asm_int_expr(s1);\n            if (n < ind)\n                tcc_error(\"attempt to .org backwards\");\n            v = 0;\n            size = n - ind;\n            goto zero_pad;\n        }\n        break;\n    case TOK_ASM_globl:\n    case TOK_ASM_global:\n    case TOK_ASM_weak:\n    tok1 = tok;\n\tdo { \n            Sym *sym;\n\n            next();\n            sym = label_find(tok);\n            if (!sym) {\n                sym = label_push(&s1->asm_labels, tok, 0);\n                sym->type.t = VT_VOID;\n            }\n            sym->type.t &= ~VT_STATIC;\n            if (tok1 == TOK_ASM_weak)\n                sym->type.t |= VT_WEAK;\n            next();\n\t} while (tok == ',');\n\tbreak;\n    case TOK_ASM_string:\n    case TOK_ASM_ascii:\n    case TOK_ASM_asciz:\n        {\n            const uint8_t *p;\n            int i, size, t;\n\n            t = tok;\n            next();\n            for(;;) {\n                if (tok != TOK_STR)\n                    expect(\"string constant\");\n                p = tokc.cstr->data;\n                size = tokc.cstr->size;\n                if (t == TOK_ASM_ascii && size > 0)\n                    size--;\n                for(i = 0; i < size; i++)\n                    g(p[i]);\n                next();\n                if (tok == ',') {\n                    next();\n                } else if (tok != TOK_STR) {\n                    break;\n                }\n            }\n\t}\n\tbreak;\n    case TOK_ASM_text:\n    case TOK_ASM_data:\n    case TOK_ASM_bss:\n\t{ \n            char sname[64];\n            tok1 = tok;\n            n = 0;\n            next();\n            if (tok != ';' && tok != TOK_LINEFEED) {\n\t\tn = asm_int_expr(s1);\n\t\tnext();\n            }\n            sprintf(sname, (n?\".%s%d\":\".%s\"), get_tok_str(tok1, NULL), n);\n            use_section(s1, sname);\n\t}\n\tbreak;\n    case TOK_ASM_file:\n        {\n            char filename[512];\n\n            filename[0] = '\\0';\n            next();\n\n            if (tok == TOK_STR)\n                pstrcat(filename, sizeof(filename), tokc.cstr->data);\n            else\n                pstrcat(filename, sizeof(filename), get_tok_str(tok, NULL));\n\n            if (s1->warn_unsupported)\n                tcc_warning(\"ignoring .file %s\", filename);\n\n            next();\n        }\n        break;\n    case TOK_ASM_ident:\n        {\n            char ident[256];\n\n            ident[0] = '\\0';\n            next();\n\n            if (tok == TOK_STR)\n                pstrcat(ident, sizeof(ident), tokc.cstr->data);\n            else\n                pstrcat(ident, sizeof(ident), get_tok_str(tok, NULL));\n\n            if (s1->warn_unsupported)\n                tcc_warning(\"ignoring .ident %s\", ident);\n\n            next();\n        }\n        break;\n    case TOK_ASM_size:\n        { \n            Sym *sym;\n\n            next();\n            sym = label_find(tok);\n            if (!sym) {\n                tcc_error(\"label not found: %s\", get_tok_str(tok, NULL));\n            }\n\n            next();\n            skip(',');\n            /* XXX .size name,label2-label1 */\n            if (s1->warn_unsupported)\n                tcc_warning(\"ignoring .size %s,*\", get_tok_str(tok, NULL));\n\n            while (tok != '\\n' && tok != CH_EOF) {\n                next();\n            }\n        }\n        break;\n    case TOK_ASM_type:\n        { \n            Sym *sym;\n            const char *newtype;\n\n            next();\n            sym = label_find(tok);\n            if (!sym) {\n                sym = label_push(&s1->asm_labels, tok, 0);\n                sym->type.t = VT_VOID;\n            }\n\n            next();\n            skip(',');\n            if (tok == TOK_STR) {\n                newtype = tokc.cstr->data;\n            } else {\n                if (tok == '@' || tok == '%')\n                    skip(tok);\n                newtype = get_tok_str(tok, NULL);\n            }\n\n            if (!strcmp(newtype, \"function\") || !strcmp(newtype, \"STT_FUNC\")) {\n                sym->type.t = VT_FUNC;\n            }\n            else if (s1->warn_unsupported)\n                tcc_warning(\"change type of '%s' from 0x%x to '%s' ignored\", \n                    get_tok_str(sym->v, NULL), sym->type.t, newtype);\n\n            next();\n        }\n        break;\n    case TOK_SECTION1:\n        {\n            char sname[256];\n\n            /* XXX: support more options */\n            next();\n            sname[0] = '\\0';\n            while (tok != ';' && tok != TOK_LINEFEED && tok != ',') {\n                if (tok == TOK_STR)\n                    pstrcat(sname, sizeof(sname), tokc.cstr->data);\n                else\n                    pstrcat(sname, sizeof(sname), get_tok_str(tok, NULL));\n                next();\n            }\n            if (tok == ',') {\n                /* skip section options */\n                next();\n                if (tok != TOK_STR)\n                    expect(\"string constant\");\n                next();\n            }\n            last_text_section = cur_text_section;\n            use_section(s1, sname);\n        }\n        break;\n    case TOK_ASM_previous:\n        { \n            Section *sec;\n            next();\n            if (!last_text_section)\n                tcc_error(\"no previous section referenced\");\n            sec = cur_text_section;\n            use_section1(s1, last_text_section);\n            last_text_section = sec;\n        }\n        break;\n#ifdef TCC_TARGET_I386\n    case TOK_ASM_code16:\n        {\n            next();\n            s1->seg_size = 16;\n        }\n        break;\n    case TOK_ASM_code32:\n        {\n            next();\n            s1->seg_size = 32;\n        }\n        break;\n#endif\n#ifdef TCC_TARGET_X86_64\n    /* added for compatibility with GAS */\n    case TOK_ASM_code64:\n        next();\n        break;\n#endif\n    default:\n        tcc_error(\"unknown assembler directive '.%s'\", get_tok_str(tok, NULL));\n        break;\n    }\n}\n\n\n/* assemble a file */\nstatic int tcc_assemble_internal(TCCState *s1, int do_preprocess)\n{\n    int opcode;\n\n#if 0\n    /* print stats about opcodes */\n    {\n        const ASMInstr *pa;\n        int freq[4];\n        int op_vals[500];\n        int nb_op_vals, i, j;\n\n        nb_op_vals = 0;\n        memset(freq, 0, sizeof(freq));\n        for(pa = asm_instrs; pa->sym != 0; pa++) {\n            freq[pa->nb_ops]++;\n            for(i=0;i<pa->nb_ops;i++) {\n                for(j=0;j<nb_op_vals;j++) {\n                    if (pa->op_type[i] == op_vals[j])\n                        goto found;\n                }\n                op_vals[nb_op_vals++] = pa->op_type[i];\n            found: ;\n            }\n        }\n        for(i=0;i<nb_op_vals;i++) {\n            int v = op_vals[i];\n            if ((v & (v - 1)) != 0)\n                printf(\"%3d: %08x\\n\", i, v);\n        }\n        printf(\"size=%d nb=%d f0=%d f1=%d f2=%d f3=%d\\n\",\n               sizeof(asm_instrs), sizeof(asm_instrs) / sizeof(ASMInstr),\n               freq[0], freq[1], freq[2], freq[3]);\n    }\n#endif\n\n    /* XXX: undefine C labels */\n\n    ch = file->buf_ptr[0];\n    tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF;\n    parse_flags = PARSE_FLAG_ASM_COMMENTS;\n    if (do_preprocess)\n        parse_flags |= PARSE_FLAG_PREPROCESS;\n    next();\n    for(;;) {\n        if (tok == TOK_EOF)\n            break;\n        parse_flags |= PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */\n    redo:\n        if (tok == '#') {\n            /* horrible gas comment */\n            while (tok != TOK_LINEFEED)\n                next();\n        } else if (tok == '.') {\n            asm_parse_directive(s1);\n        } else if (tok == TOK_PPNUM) {\n            const char *p;\n            int n;\n            p = tokc.cstr->data;\n            n = strtoul(p, (char **)&p, 10);\n            if (*p != '\\0')\n                expect(\"':'\");\n            /* new local label */\n            asm_new_label(s1, asm_get_local_label_name(s1, n), 1);\n            next();\n            skip(':');\n            goto redo;\n        } else if (tok >= TOK_IDENT) {\n            /* instruction or label */\n            opcode = tok;\n            next();\n            if (tok == ':') {\n                /* new label */\n                asm_new_label(s1, opcode, 0);\n                next();\n                goto redo;\n            } else if (tok == '=') {\n                int n;\n                next();\n                n = asm_int_expr(s1);\n                asm_new_label1(s1, opcode, 0, SHN_ABS, n);\n                goto redo;\n            } else {\n                asm_opcode(s1, opcode);\n            }\n        }\n        /* end of line */\n        if (tok != ';' && tok != TOK_LINEFEED){\n            expect(\"end of line\");\n        }\n        parse_flags &= ~PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */\n        next();\n    }\n\n    asm_free_labels(s1);\n\n    return 0;\n}\n\n/* Assemble the current file */\nST_FUNC int tcc_assemble(TCCState *s1, int do_preprocess)\n{\n    Sym *define_start;\n    int ret;\n\n    preprocess_init(s1);\n\n    /* default section is text */\n    cur_text_section = text_section;\n    ind = cur_text_section->data_offset;\n\n    define_start = define_stack;\n\n    /* an elf symbol of type STT_FILE must be put so that STB_LOCAL\n       symbols can be safely used */\n    put_elf_sym(symtab_section, 0, 0,\n                ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0,\n                SHN_ABS, file->filename);\n\n    ret = tcc_assemble_internal(s1, do_preprocess);\n\n    cur_text_section->data_offset = ind;\n\n    free_defines(define_start); \n\n    return ret;\n}\n\n/********************************************************************/\n/* GCC inline asm support */\n\n/* assemble the string 'str' in the current C compilation unit without\n   C preprocessing. NOTE: str is modified by modifying the '\\0' at the\n   end */\nstatic void tcc_assemble_inline(TCCState *s1, char *str, int len)\n{\n    int saved_parse_flags;\n    const int *saved_macro_ptr;\n\n    saved_parse_flags = parse_flags;\n    saved_macro_ptr = macro_ptr;\n\n    tcc_open_bf(s1, \":asm:\", len);\n    memcpy(file->buffer, str, len);\n\n    macro_ptr = NULL;\n    tcc_assemble_internal(s1, 0);\n    tcc_close();\n\n    parse_flags = saved_parse_flags;\n    macro_ptr = saved_macro_ptr;\n}\n\n/* find a constraint by its number or id (gcc 3 extended\n   syntax). return -1 if not found. Return in *pp in char after the\n   constraint */\nST_FUNC int find_constraint(ASMOperand *operands, int nb_operands, \n                           const char *name, const char **pp)\n{\n    int index;\n    TokenSym *ts;\n    const char *p;\n\n    if (isnum(*name)) {\n        index = 0;\n        while (isnum(*name)) {\n            index = (index * 10) + (*name) - '0';\n            name++;\n        }\n        if ((unsigned)index >= nb_operands)\n            index = -1;\n    } else if (*name == '[') {\n        name++;\n        p = strchr(name, ']');\n        if (p) {\n            ts = tok_alloc(name, p - name);\n            for(index = 0; index < nb_operands; index++) {\n                if (operands[index].id == ts->tok)\n                    goto found;\n            }\n            index = -1;\n        found:\n            name = p + 1;\n        } else {\n            index = -1;\n        }\n    } else {\n        index = -1;\n    }\n    if (pp)\n        *pp = name;\n    return index;\n}\n\nstatic void subst_asm_operands(ASMOperand *operands, int nb_operands, \n                               int nb_outputs,\n                               CString *out_str, CString *in_str)\n{\n    int c, index, modifier;\n    const char *str;\n    ASMOperand *op;\n    SValue sv;\n\n    cstr_new(out_str);\n    str = in_str->data;\n    for(;;) {\n        c = *str++;\n        if (c == '%') {\n            if (*str == '%') {\n                str++;\n                goto add_char;\n            }\n            modifier = 0;\n            if (*str == 'c' || *str == 'n' ||\n                *str == 'b' || *str == 'w' || *str == 'h')\n                modifier = *str++;\n            index = find_constraint(operands, nb_operands, str, &str);\n            if (index < 0)\n                tcc_error(\"invalid operand reference after %%\");\n            op = &operands[index];\n            sv = *op->vt;\n            if (op->reg >= 0) {\n                sv.r = op->reg;\n                if ((op->vt->r & VT_VALMASK) == VT_LLOCAL && op->is_memory)\n                    sv.r |= VT_LVAL;\n            }\n            subst_asm_operand(out_str, &sv, modifier);\n        } else {\n        add_char:\n            cstr_ccat(out_str, c);\n            if (c == '\\0')\n                break;\n        }\n    }\n}\n\n\nstatic void parse_asm_operands(ASMOperand *operands, int *nb_operands_ptr,\n                               int is_output)\n{\n    ASMOperand *op;\n    int nb_operands;\n\n    if (tok != ':') {\n        nb_operands = *nb_operands_ptr;\n        for(;;) {\n            if (nb_operands >= MAX_ASM_OPERANDS)\n                tcc_error(\"too many asm operands\");\n            op = &operands[nb_operands++];\n            op->id = 0;\n            if (tok == '[') {\n                next();\n                if (tok < TOK_IDENT)\n                    expect(\"identifier\");\n                op->id = tok;\n                next();\n                skip(']');\n            }\n            if (tok != TOK_STR)\n                expect(\"string constant\");\n            op->constraint = tcc_malloc(tokc.cstr->size);\n            strcpy(op->constraint, tokc.cstr->data);\n            next();\n            skip('(');\n            gexpr();\n            if (is_output) {\n                test_lvalue();\n            } else {\n                /* we want to avoid LLOCAL case, except when the 'm'\n                   constraint is used. Note that it may come from\n                   register storage, so we need to convert (reg)\n                   case */\n                if ((vtop->r & VT_LVAL) &&\n                    ((vtop->r & VT_VALMASK) == VT_LLOCAL ||\n                     (vtop->r & VT_VALMASK) < VT_CONST) &&\n                    !strchr(op->constraint, 'm')) {\n                    gv(RC_INT);\n                }\n            }\n            op->vt = vtop;\n            skip(')');\n            if (tok == ',') {\n                next();\n            } else {\n                break;\n            }\n        }\n        *nb_operands_ptr = nb_operands;\n    }\n}\n\n/* parse the GCC asm() instruction */\nST_FUNC void asm_instr(void)\n{\n    CString astr, astr1;\n    ASMOperand operands[MAX_ASM_OPERANDS];\n    int nb_outputs, nb_operands, i, must_subst, out_reg;\n    uint8_t clobber_regs[NB_ASM_REGS];\n\n    next();\n    /* since we always generate the asm() instruction, we can ignore\n       volatile */\n    if (tok == TOK_VOLATILE1 || tok == TOK_VOLATILE2 || tok == TOK_VOLATILE3) {\n        next();\n    }\n    parse_asm_str(&astr);\n    nb_operands = 0;\n    nb_outputs = 0;\n    must_subst = 0;\n    memset(clobber_regs, 0, sizeof(clobber_regs));\n    if (tok == ':') {\n        next();\n        must_subst = 1;\n        /* output args */\n        parse_asm_operands(operands, &nb_operands, 1);\n        nb_outputs = nb_operands;\n        if (tok == ':') {\n            next();\n            if (tok != ')') {\n                /* input args */\n                parse_asm_operands(operands, &nb_operands, 0);\n                if (tok == ':') {\n                    /* clobber list */\n                    /* XXX: handle registers */\n                    next();\n                    for(;;) {\n                        if (tok != TOK_STR)\n                            expect(\"string constant\");\n                        asm_clobber(clobber_regs, tokc.cstr->data);\n                        next();\n                        if (tok == ',') {\n                            next();\n                        } else {\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    skip(')');\n    /* NOTE: we do not eat the ';' so that we can restore the current\n       token after the assembler parsing */\n    if (tok != ';')\n        expect(\"';'\");\n    \n    /* save all values in the memory */\n    save_regs(0);\n\n    /* compute constraints */\n    asm_compute_constraints(operands, nb_operands, nb_outputs, \n                            clobber_regs, &out_reg);\n\n    /* substitute the operands in the asm string. No substitution is\n       done if no operands (GCC behaviour) */\n#ifdef ASM_DEBUG\n    printf(\"asm: \\\"%s\\\"\\n\", (char *)astr.data);\n#endif\n    if (must_subst) {\n        subst_asm_operands(operands, nb_operands, nb_outputs, &astr1, &astr);\n        cstr_free(&astr);\n    } else {\n        astr1 = astr;\n    }\n#ifdef ASM_DEBUG\n    printf(\"subst_asm: \\\"%s\\\"\\n\", (char *)astr1.data);\n#endif\n\n    /* generate loads */\n    asm_gen_code(operands, nb_operands, nb_outputs, 0, \n                 clobber_regs, out_reg);    \n\n    /* assemble the string with tcc internal assembler */\n    tcc_assemble_inline(tcc_state, astr1.data, astr1.size - 1);\n\n    /* restore the current C token */\n    next();\n\n    /* store the output values if needed */\n    asm_gen_code(operands, nb_operands, nb_outputs, 1, \n                 clobber_regs, out_reg);\n    \n    /* free everything */\n    for(i=0;i<nb_operands;i++) {\n        ASMOperand *op;\n        op = &operands[i];\n        tcc_free(op->constraint);\n        vpop();\n    }\n    cstr_free(&astr1);\n}\n\nST_FUNC void asm_global_instr(void)\n{\n    CString astr;\n\n    next();\n    parse_asm_str(&astr);\n    skip(')');\n    /* NOTE: we do not eat the ';' so that we can restore the current\n       token after the assembler parsing */\n    if (tok != ';')\n        expect(\"';'\");\n    \n#ifdef ASM_DEBUG\n    printf(\"asm_global: \\\"%s\\\"\\n\", (char *)astr.data);\n#endif\n    cur_text_section = text_section;\n    ind = cur_text_section->data_offset;\n\n    /* assemble the string with tcc internal assembler */\n    tcc_assemble_inline(tcc_state, astr.data, astr.size - 1);\n    \n    cur_text_section->data_offset = ind;\n\n    /* restore the current C token */\n    next();\n\n    cstr_free(&astr);\n}\n#endif /* CONFIG_TCC_ASM */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tcccoff.c",
    "content": "/*\n *  COFF file handling for TCC\n * \n *  Copyright (c) 2003, 2004 TK\n *  Copyright (c) 2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\n#define MAXNSCNS 255\t\t/* MAXIMUM NUMBER OF SECTIONS         */\n#define MAX_STR_TABLE 1000000\nAOUTHDR o_filehdr;\t\t/* OPTIONAL (A.OUT) FILE HEADER       */\n\nSCNHDR section_header[MAXNSCNS];\n\n#define MAX_FUNCS 1000\n#define MAX_FUNC_NAME_LENGTH 128\n\nint nFuncs;\nchar Func[MAX_FUNCS][MAX_FUNC_NAME_LENGTH];\nchar AssociatedFile[MAX_FUNCS][MAX_FUNC_NAME_LENGTH];\nint LineNoFilePtr[MAX_FUNCS];\nint EndAddress[MAX_FUNCS];\nint LastLineNo[MAX_FUNCS];\nint FuncEntries[MAX_FUNCS];\n\nint OutputTheSection(Section * sect);\nshort int GetCoffFlags(const char *s);\nvoid SortSymbolTable(void);\nSection *FindSection(TCCState * s1, const char *sname);\n\nint C67_main_entry_point;\n\nint FindCoffSymbolIndex(const char *func_name);\nint nb_syms;\n\ntypedef struct {\n    long tag;\n    long size;\n    long fileptr;\n    long nextsym;\n    short int dummy;\n} AUXFUNC;\n\ntypedef struct {\n    long regmask;\n    unsigned short lineno;\n    unsigned short nentries;\n    int localframe;\n    int nextentry;\n    short int dummy;\n} AUXBF;\n\ntypedef struct {\n    long dummy;\n    unsigned short lineno;\n    unsigned short dummy1;\n    int dummy2;\n    int dummy3;\n    unsigned short dummy4;\n} AUXEF;\n\nST_FUNC int tcc_output_coff(TCCState *s1, FILE *f)\n{\n    Section *tcc_sect;\n    SCNHDR *coff_sec;\n    int file_pointer;\n    char *Coff_str_table, *pCoff_str_table;\n    int CoffTextSectionNo, coff_nb_syms;\n    FILHDR file_hdr;\t\t/* FILE HEADER STRUCTURE              */\n    Section *stext, *sdata, *sbss;\n    int i, NSectionsToOutput = 0;\n\n    Coff_str_table = pCoff_str_table = NULL;\n\n    stext = FindSection(s1, \".text\");\n    sdata = FindSection(s1, \".data\");\n    sbss = FindSection(s1, \".bss\");\n\n    nb_syms = symtab_section->data_offset / sizeof(Elf32_Sym);\n    coff_nb_syms = FindCoffSymbolIndex(\"XXXXXXXXXX1\");\n\n    file_hdr.f_magic = COFF_C67_MAGIC;\t/* magic number */\n    file_hdr.f_timdat = 0;\t/* time & date stamp */\n    file_hdr.f_opthdr = sizeof(AOUTHDR);\t/* sizeof(optional hdr) */\n    file_hdr.f_flags = 0x1143;\t/* flags (copied from what code composer does) */\n    file_hdr.f_TargetID = 0x99;\t/* for C6x = 0x0099 */\n\n    o_filehdr.magic = 0x0108;\t/* see magic.h                          */\n    o_filehdr.vstamp = 0x0190;\t/* version stamp                        */\n    o_filehdr.tsize = stext->data_offset;\t/* text size in bytes, padded to FW bdry */\n    o_filehdr.dsize = sdata->data_offset;\t/* initialized data \"  \"                */\n    o_filehdr.bsize = sbss->data_offset;\t/* uninitialized data \"   \"             */\n    o_filehdr.entrypt = C67_main_entry_point;\t/* entry pt.                          */\n    o_filehdr.text_start = stext->sh_addr;\t/* base of text used for this file      */\n    o_filehdr.data_start = sdata->sh_addr;\t/* base of data used for this file      */\n\n\n    // create all the section headers\n\n    file_pointer = FILHSZ + sizeof(AOUTHDR);\n\n    CoffTextSectionNo = -1;\n\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tif (OutputTheSection(tcc_sect)) {\n\t    NSectionsToOutput++;\n\n\t    if (CoffTextSectionNo == -1 && tcc_sect == stext)\n\t\tCoffTextSectionNo = NSectionsToOutput;\t// rem which coff sect number the .text sect is\n\n\t    strcpy(coff_sec->s_name, tcc_sect->name);\t/* section name */\n\n\t    coff_sec->s_paddr = tcc_sect->sh_addr;\t/* physical address */\n\t    coff_sec->s_vaddr = tcc_sect->sh_addr;\t/* virtual address */\n\t    coff_sec->s_size = tcc_sect->data_offset;\t/* section size */\n\t    coff_sec->s_scnptr = 0;\t/* file ptr to raw data for section */\n\t    coff_sec->s_relptr = 0;\t/* file ptr to relocation */\n\t    coff_sec->s_lnnoptr = 0;\t/* file ptr to line numbers */\n\t    coff_sec->s_nreloc = 0;\t/* number of relocation entries */\n\t    coff_sec->s_flags = GetCoffFlags(coff_sec->s_name);\t/* flags */\n\t    coff_sec->s_reserved = 0;\t/* reserved byte */\n\t    coff_sec->s_page = 0;\t/* memory page id */\n\n\t    file_pointer += sizeof(SCNHDR);\n\t}\n    }\n\n    file_hdr.f_nscns = NSectionsToOutput;\t/* number of sections */\n\n    // now loop through and determine file pointer locations\n    // for the raw data\n\n\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tif (OutputTheSection(tcc_sect)) {\n\t    // put raw data\n\t    coff_sec->s_scnptr = file_pointer;\t/* file ptr to raw data for section */\n\t    file_pointer += coff_sec->s_size;\n\t}\n    }\n\n    // now loop through and determine file pointer locations\n    // for the relocation data\n\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tif (OutputTheSection(tcc_sect)) {\n\t    // put relocations data\n\t    if (coff_sec->s_nreloc > 0) {\n\t\tcoff_sec->s_relptr = file_pointer;\t/* file ptr to relocation */\n\t\tfile_pointer += coff_sec->s_nreloc * sizeof(struct reloc);\n\t    }\n\t}\n    }\n\n    // now loop through and determine file pointer locations\n    // for the line number data\n\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tcoff_sec->s_nlnno = 0;\n\tcoff_sec->s_lnnoptr = 0;\n\n\tif (s1->do_debug && tcc_sect == stext) {\n\t    // count how many line nos data\n\n\t    // also find association between source file name and function\n\t    // so we can sort the symbol table\n\n\n\t    Stab_Sym *sym, *sym_end;\n\t    char func_name[MAX_FUNC_NAME_LENGTH],\n\t\tlast_func_name[MAX_FUNC_NAME_LENGTH];\n\t    unsigned long func_addr, last_pc, pc;\n\t    const char *incl_files[INCLUDE_STACK_SIZE];\n\t    int incl_index, len, last_line_num;\n\t    const char *str, *p;\n\n\t    coff_sec->s_lnnoptr = file_pointer;\t/* file ptr to linno */\n\n\n\t    func_name[0] = '\\0';\n\t    func_addr = 0;\n\t    incl_index = 0;\n\t    last_func_name[0] = '\\0';\n\t    last_pc = 0xffffffff;\n\t    last_line_num = 1;\n\t    sym = (Stab_Sym *) stab_section->data + 1;\n\t    sym_end =\n\t\t(Stab_Sym *) (stab_section->data +\n\t\t\t      stab_section->data_offset);\n\n\t    nFuncs = 0;\n\t    while (sym < sym_end) {\n\t\tswitch (sym->n_type) {\n\t\t    /* function start or end */\n\t\tcase N_FUN:\n\t\t    if (sym->n_strx == 0) {\n\t\t\t// end of function\n\n\t\t\tcoff_sec->s_nlnno++;\n\t\t\tfile_pointer += LINESZ;\n\n\t\t\tpc = sym->n_value + func_addr;\n\t\t\tfunc_name[0] = '\\0';\n\t\t\tfunc_addr = 0;\n\t\t\tEndAddress[nFuncs] = pc;\n\t\t\tFuncEntries[nFuncs] =\n\t\t\t    (file_pointer -\n\t\t\t     LineNoFilePtr[nFuncs]) / LINESZ - 1;\n\t\t\tLastLineNo[nFuncs++] = last_line_num + 1;\n\t\t    } else {\n\t\t\t// beginning of function\n\n\t\t\tLineNoFilePtr[nFuncs] = file_pointer;\n\t\t\tcoff_sec->s_nlnno++;\n\t\t\tfile_pointer += LINESZ;\n\n\t\t\tstr =\n\t\t\t    (const char *) stabstr_section->data +\n\t\t\t    sym->n_strx;\n\n\t\t\tp = strchr(str, ':');\n\t\t\tif (!p) {\n\t\t\t    pstrcpy(func_name, sizeof(func_name), str);\n\t\t\t    pstrcpy(Func[nFuncs], sizeof(func_name), str);\n\t\t\t} else {\n\t\t\t    len = p - str;\n\t\t\t    if (len > sizeof(func_name) - 1)\n\t\t\t\tlen = sizeof(func_name) - 1;\n\t\t\t    memcpy(func_name, str, len);\n\t\t\t    memcpy(Func[nFuncs], str, len);\n\t\t\t    func_name[len] = '\\0';\n\t\t\t}\n\n\t\t\t// save the file that it came in so we can sort later\n\t\t\tpstrcpy(AssociatedFile[nFuncs], sizeof(func_name),\n\t\t\t\tincl_files[incl_index - 1]);\n\n\t\t\tfunc_addr = sym->n_value;\n\t\t    }\n\t\t    break;\n\n\t\t    /* line number info */\n\t\tcase N_SLINE:\n\t\t    pc = sym->n_value + func_addr;\n\n\t\t    last_pc = pc;\n\t\t    last_line_num = sym->n_desc;\n\n\t\t    /* XXX: slow! */\n\t\t    strcpy(last_func_name, func_name);\n\n\t\t    coff_sec->s_nlnno++;\n\t\t    file_pointer += LINESZ;\n\t\t    break;\n\t\t    /* include files */\n\t\tcase N_BINCL:\n\t\t    str =\n\t\t\t(const char *) stabstr_section->data + sym->n_strx;\n\t\t  add_incl:\n\t\t    if (incl_index < INCLUDE_STACK_SIZE) {\n\t\t\tincl_files[incl_index++] = str;\n\t\t    }\n\t\t    break;\n\t\tcase N_EINCL:\n\t\t    if (incl_index > 1)\n\t\t\tincl_index--;\n\t\t    break;\n\t\tcase N_SO:\n\t\t    if (sym->n_strx == 0) {\n\t\t\tincl_index = 0;\t/* end of translation unit */\n\t\t    } else {\n\t\t\tstr =\n\t\t\t    (const char *) stabstr_section->data +\n\t\t\t    sym->n_strx;\n\t\t\t/* do not add path */\n\t\t\tlen = strlen(str);\n\t\t\tif (len > 0 && str[len - 1] != '/')\n\t\t\t    goto add_incl;\n\t\t    }\n\t\t    break;\n\t\t}\n\t\tsym++;\n\t    }\n\t}\n\n    }\n\n    file_hdr.f_symptr = file_pointer;\t/* file pointer to symtab */\n\n    if (s1->do_debug)\n\tfile_hdr.f_nsyms = coff_nb_syms;\t/* number of symtab entries */\n    else\n\tfile_hdr.f_nsyms = 0;\n\n    file_pointer += file_hdr.f_nsyms * SYMNMLEN;\n\n    // OK now we are all set to write the file\n\n\n    fwrite(&file_hdr, FILHSZ, 1, f);\n    fwrite(&o_filehdr, sizeof(o_filehdr), 1, f);\n\n    // write section headers\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tif (OutputTheSection(tcc_sect)) {\n\t    fwrite(coff_sec, sizeof(SCNHDR), 1, f);\n\t}\n    }\n\n    // write raw data\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tif (OutputTheSection(tcc_sect)) {\n\t    fwrite(tcc_sect->data, tcc_sect->data_offset, 1, f);\n\t}\n    }\n\n    // write relocation data\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tif (OutputTheSection(tcc_sect)) {\n\t    // put relocations data\n\t    if (coff_sec->s_nreloc > 0) {\n\t\tfwrite(tcc_sect->reloc,\n\t\t       coff_sec->s_nreloc * sizeof(struct reloc), 1, f);\n\t    }\n\t}\n    }\n\n\n    // group the symbols in order of filename, func1, func2, etc\n    // finally global symbols\n\n    if (s1->do_debug)\n\tSortSymbolTable();\n\n    // write line no data\n\n    for (i = 1; i < s1->nb_sections; i++) {\n\tcoff_sec = &section_header[i];\n\ttcc_sect = s1->sections[i];\n\n\tif (s1->do_debug && tcc_sect == stext) {\n\t    // count how many line nos data\n\n\n\t    Stab_Sym *sym, *sym_end;\n\t    char func_name[128], last_func_name[128];\n\t    unsigned long func_addr, last_pc, pc;\n\t    const char *incl_files[INCLUDE_STACK_SIZE];\n\t    int incl_index, len, last_line_num;\n\t    const char *str, *p;\n\n\t    LINENO CoffLineNo;\n\n\t    func_name[0] = '\\0';\n\t    func_addr = 0;\n\t    incl_index = 0;\n\t    last_func_name[0] = '\\0';\n\t    last_pc = 0;\n\t    last_line_num = 1;\n\t    sym = (Stab_Sym *) stab_section->data + 1;\n\t    sym_end =\n\t\t(Stab_Sym *) (stab_section->data +\n\t\t\t      stab_section->data_offset);\n\n\t    while (sym < sym_end) {\n\t\tswitch (sym->n_type) {\n\t\t    /* function start or end */\n\t\tcase N_FUN:\n\t\t    if (sym->n_strx == 0) {\n\t\t\t// end of function\n\n\t\t\tCoffLineNo.l_addr.l_paddr = last_pc;\n\t\t\tCoffLineNo.l_lnno = last_line_num + 1;\n\t\t\tfwrite(&CoffLineNo, 6, 1, f);\n\n\t\t\tpc = sym->n_value + func_addr;\n\t\t\tfunc_name[0] = '\\0';\n\t\t\tfunc_addr = 0;\n\t\t    } else {\n\t\t\t// beginning of function\n\n\t\t\tstr =\n\t\t\t    (const char *) stabstr_section->data +\n\t\t\t    sym->n_strx;\n\n\n\t\t\tp = strchr(str, ':');\n\t\t\tif (!p) {\n\t\t\t    pstrcpy(func_name, sizeof(func_name), str);\n\t\t\t} else {\n\t\t\t    len = p - str;\n\t\t\t    if (len > sizeof(func_name) - 1)\n\t\t\t\tlen = sizeof(func_name) - 1;\n\t\t\t    memcpy(func_name, str, len);\n\t\t\t    func_name[len] = '\\0';\n\t\t\t}\n\t\t\tfunc_addr = sym->n_value;\n\t\t\tlast_pc = func_addr;\n\t\t\tlast_line_num = -1;\n\n\t\t\t// output a function begin\n\n\t\t\tCoffLineNo.l_addr.l_symndx =\n\t\t\t    FindCoffSymbolIndex(func_name);\n\t\t\tCoffLineNo.l_lnno = 0;\n\n\t\t\tfwrite(&CoffLineNo, 6, 1, f);\n\t\t    }\n\t\t    break;\n\n\t\t    /* line number info */\n\t\tcase N_SLINE:\n\t\t    pc = sym->n_value + func_addr;\n\n\n\t\t    /* XXX: slow! */\n\t\t    strcpy(last_func_name, func_name);\n\n\t\t    // output a line reference\n\n\t\t    CoffLineNo.l_addr.l_paddr = last_pc;\n\n\t\t    if (last_line_num == -1) {\n\t\t\tCoffLineNo.l_lnno = sym->n_desc;\n\t\t    } else {\n\t\t\tCoffLineNo.l_lnno = last_line_num + 1;\n\t\t    }\n\n\t\t    fwrite(&CoffLineNo, 6, 1, f);\n\n\t\t    last_pc = pc;\n\t\t    last_line_num = sym->n_desc;\n\n\t\t    break;\n\n\t\t    /* include files */\n\t\tcase N_BINCL:\n\t\t    str =\n\t\t\t(const char *) stabstr_section->data + sym->n_strx;\n\t\t  add_incl2:\n\t\t    if (incl_index < INCLUDE_STACK_SIZE) {\n\t\t\tincl_files[incl_index++] = str;\n\t\t    }\n\t\t    break;\n\t\tcase N_EINCL:\n\t\t    if (incl_index > 1)\n\t\t\tincl_index--;\n\t\t    break;\n\t\tcase N_SO:\n\t\t    if (sym->n_strx == 0) {\n\t\t\tincl_index = 0;\t/* end of translation unit */\n\t\t    } else {\n\t\t\tstr =\n\t\t\t    (const char *) stabstr_section->data +\n\t\t\t    sym->n_strx;\n\t\t\t/* do not add path */\n\t\t\tlen = strlen(str);\n\t\t\tif (len > 0 && str[len - 1] != '/')\n\t\t\t    goto add_incl2;\n\t\t    }\n\t\t    break;\n\t\t}\n\t\tsym++;\n\t    }\n\t}\n    }\n\n    // write symbol table\n    if (s1->do_debug) {\n\tint k;\n\tstruct syment csym;\n\tAUXFUNC auxfunc;\n\tAUXBF auxbf;\n\tAUXEF auxef;\n\tint i;\n\tElf32_Sym *p;\n\tconst char *name;\n\tint nstr;\n\tint n = 0;\n\n\tCoff_str_table = (char *) tcc_malloc(MAX_STR_TABLE);\n\tpCoff_str_table = Coff_str_table;\n\tnstr = 0;\n\n\tp = (Elf32_Sym *) symtab_section->data;\n\n\n\tfor (i = 0; i < nb_syms; i++) {\n\n\t    name = symtab_section->link->data + p->st_name;\n\n\t    for (k = 0; k < 8; k++)\n\t\tcsym._n._n_name[k] = 0;\n\n\t    if (strlen(name) <= 8) {\n\t\tstrcpy(csym._n._n_name, name);\n\t    } else {\n\t\tif (pCoff_str_table - Coff_str_table + strlen(name) >\n\t\t    MAX_STR_TABLE - 1)\n\t\t    tcc_error(\"String table too large\");\n\n\t\tcsym._n._n_n._n_zeroes = 0;\n\t\tcsym._n._n_n._n_offset =\n\t\t    pCoff_str_table - Coff_str_table + 4;\n\n\t\tstrcpy(pCoff_str_table, name);\n\t\tpCoff_str_table += strlen(name) + 1;\t// skip over null\n\t\tnstr++;\n\t    }\n\n\t    if (p->st_info == 4) {\n\t\t// put a filename symbol\n\t\tcsym.n_value = 33;\t// ?????\n\t\tcsym.n_scnum = N_DEBUG;\n\t\tcsym.n_type = 0;\n\t\tcsym.n_sclass = C_FILE;\n\t\tcsym.n_numaux = 0;\n\t\tfwrite(&csym, 18, 1, f);\n\t\tn++;\n\n\t    } else if (p->st_info == 0x12) {\n\t\t// find the function data\n\n\t\tfor (k = 0; k < nFuncs; k++) {\n\t\t    if (strcmp(name, Func[k]) == 0)\n\t\t\tbreak;\n\t\t}\n\n\t\tif (k >= nFuncs) {\n\t\t    tcc_error(\"debug info can't find function: %s\", name);\n\t\t}\n\t\t// put a Function Name\n\n\t\tcsym.n_value = p->st_value;\t// physical address\n\t\tcsym.n_scnum = CoffTextSectionNo;\n\t\tcsym.n_type = MKTYPE(T_INT, DT_FCN, 0, 0, 0, 0, 0);\n\t\tcsym.n_sclass = C_EXT;\n\t\tcsym.n_numaux = 1;\n\t\tfwrite(&csym, 18, 1, f);\n\n\t\t// now put aux info\n\n\t\tauxfunc.tag = 0;\n\t\tauxfunc.size = EndAddress[k] - p->st_value;\n\t\tauxfunc.fileptr = LineNoFilePtr[k];\n\t\tauxfunc.nextsym = n + 6;\t// tktk\n\t\tauxfunc.dummy = 0;\n\t\tfwrite(&auxfunc, 18, 1, f);\n\n\t\t// put a .bf\n\n\t\tstrcpy(csym._n._n_name, \".bf\");\n\t\tcsym.n_value = p->st_value;\t// physical address\n\t\tcsym.n_scnum = CoffTextSectionNo;\n\t\tcsym.n_type = 0;\n\t\tcsym.n_sclass = C_FCN;\n\t\tcsym.n_numaux = 1;\n\t\tfwrite(&csym, 18, 1, f);\n\n\t\t// now put aux info\n\n\t\tauxbf.regmask = 0;\n\t\tauxbf.lineno = 0;\n\t\tauxbf.nentries = FuncEntries[k];\n\t\tauxbf.localframe = 0;\n\t\tauxbf.nextentry = n + 6;\n\t\tauxbf.dummy = 0;\n\t\tfwrite(&auxbf, 18, 1, f);\n\n\t\t// put a .ef\n\n\t\tstrcpy(csym._n._n_name, \".ef\");\n\t\tcsym.n_value = EndAddress[k];\t// physical address  \n\t\tcsym.n_scnum = CoffTextSectionNo;\n\t\tcsym.n_type = 0;\n\t\tcsym.n_sclass = C_FCN;\n\t\tcsym.n_numaux = 1;\n\t\tfwrite(&csym, 18, 1, f);\n\n\t\t// now put aux info\n\n\t\tauxef.dummy = 0;\n\t\tauxef.lineno = LastLineNo[k];\n\t\tauxef.dummy1 = 0;\n\t\tauxef.dummy2 = 0;\n\t\tauxef.dummy3 = 0;\n\t\tauxef.dummy4 = 0;\n\t\tfwrite(&auxef, 18, 1, f);\n\n\t\tn += 6;\n\n\t    } else {\n\t\t// try an put some type info\n\n\t\tif ((p->st_other & VT_BTYPE) == VT_DOUBLE) {\n\t\t    csym.n_type = T_DOUBLE;\t// int\n\t\t    csym.n_sclass = C_EXT;\n\t\t} else if ((p->st_other & VT_BTYPE) == VT_FLOAT) {\n\t\t    csym.n_type = T_FLOAT;\n\t\t    csym.n_sclass = C_EXT;\n\t\t} else if ((p->st_other & VT_BTYPE) == VT_INT) {\n\t\t    csym.n_type = T_INT;\t// int\n\t\t    csym.n_sclass = C_EXT;\n\t\t} else if ((p->st_other & VT_BTYPE) == VT_SHORT) {\n\t\t    csym.n_type = T_SHORT;\n\t\t    csym.n_sclass = C_EXT;\n\t\t} else if ((p->st_other & VT_BTYPE) == VT_BYTE) {\n\t\t    csym.n_type = T_CHAR;\n\t\t    csym.n_sclass = C_EXT;\n\t\t} else {\n\t\t    csym.n_type = T_INT;\t// just mark as a label\n\t\t    csym.n_sclass = C_LABEL;\n\t\t}\n\n\n\t\tcsym.n_value = p->st_value;\n\t\tcsym.n_scnum = 2;\n\t\tcsym.n_numaux = 1;\n\t\tfwrite(&csym, 18, 1, f);\n\n\t\tauxfunc.tag = 0;\n\t\tauxfunc.size = 0x20;\n\t\tauxfunc.fileptr = 0;\n\t\tauxfunc.nextsym = 0;\n\t\tauxfunc.dummy = 0;\n\t\tfwrite(&auxfunc, 18, 1, f);\n\t\tn++;\n\t\tn++;\n\n\t    }\n\n\t    p++;\n\t}\n    }\n\n    if (s1->do_debug) {\n\t// write string table\n\n\t// first write the size\n\ti = pCoff_str_table - Coff_str_table;\n\tfwrite(&i, 4, 1, f);\n\n\t// then write the strings\n\tfwrite(Coff_str_table, i, 1, f);\n\n\ttcc_free(Coff_str_table);\n    }\n\n    return 0;\n}\n\n\n\n// group the symbols in order of filename, func1, func2, etc\n// finally global symbols\n\nvoid SortSymbolTable(void)\n{\n    int i, j, k, n = 0;\n    Elf32_Sym *p, *p2, *NewTable;\n    char *name, *name2;\n\n    NewTable = (Elf32_Sym *) tcc_malloc(nb_syms * sizeof(Elf32_Sym));\n\n    p = (Elf32_Sym *) symtab_section->data;\n\n\n    // find a file symbol, copy it over\n    // then scan the whole symbol list and copy any function\n    // symbols that match the file association\n\n    for (i = 0; i < nb_syms; i++) {\n\tif (p->st_info == 4) {\n\t    name = (char *) symtab_section->link->data + p->st_name;\n\n\t    // this is a file symbol, copy it over\n\n\t    NewTable[n++] = *p;\n\n\t    p2 = (Elf32_Sym *) symtab_section->data;\n\n\t    for (j = 0; j < nb_syms; j++) {\n\t\tif (p2->st_info == 0x12) {\n\t\t    // this is a func symbol\n\n\t\t    name2 =\n\t\t\t(char *) symtab_section->link->data + p2->st_name;\n\n\t\t    // find the function data index\n\n\t\t    for (k = 0; k < nFuncs; k++) {\n\t\t\tif (strcmp(name2, Func[k]) == 0)\n\t\t\t    break;\n\t\t    }\n\n\t\t    if (k >= nFuncs) {\n                        tcc_error(\"debug (sort) info can't find function: %s\", name2);\n\t\t    }\n\n\t\t    if (strcmp(AssociatedFile[k], name) == 0) {\n\t\t\t// yes they match copy it over\n\n\t\t\tNewTable[n++] = *p2;\n\t\t    }\n\t\t}\n\t\tp2++;\n\t    }\n\t}\n\tp++;\n    }\n\n    // now all the filename and func symbols should have been copied over\n    // copy all the rest over (all except file and funcs)\n\n    p = (Elf32_Sym *) symtab_section->data;\n    for (i = 0; i < nb_syms; i++) {\n\tif (p->st_info != 4 && p->st_info != 0x12) {\n\t    NewTable[n++] = *p;\n\t}\n\tp++;\n    }\n\n    if (n != nb_syms)\n\ttcc_error(\"Internal Compiler error, debug info\");\n\n    // copy it all back\n\n    p = (Elf32_Sym *) symtab_section->data;\n    for (i = 0; i < nb_syms; i++) {\n\t*p++ = NewTable[i];\n    }\n\n    tcc_free(NewTable);\n}\n\n\nint FindCoffSymbolIndex(const char *func_name)\n{\n    int i, n = 0;\n    Elf32_Sym *p;\n    char *name;\n\n    p = (Elf32_Sym *) symtab_section->data;\n\n    for (i = 0; i < nb_syms; i++) {\n\n\tname = (char *) symtab_section->link->data + p->st_name;\n\n\tif (p->st_info == 4) {\n\t    // put a filename symbol\n\t    n++;\n\t} else if (p->st_info == 0x12) {\n\n\t    if (strcmp(func_name, name) == 0)\n\t\treturn n;\n\n\t    n += 6;\n\n\t    // put a Function Name\n\n\t    // now put aux info\n\n\t    // put a .bf\n\n\t    // now put aux info\n\n\t    // put a .ef\n\n\t    // now put aux info\n\n\t} else {\n\t    n += 2;\n\t}\n\n\tp++;\n    }\n\n    return n;\t\t\t// total number of symbols\n}\n\nint OutputTheSection(Section * sect)\n{\n    const char *s = sect->name;\n\n    if (!strcmp(s, \".text\"))\n\treturn 1;\n    else if (!strcmp(s, \".data\"))\n\treturn 1;\n    else\n\treturn 0;\n}\n\nshort int GetCoffFlags(const char *s)\n{\n    if (!strcmp(s, \".text\"))\n\treturn STYP_TEXT | STYP_DATA | STYP_ALIGN | 0x400;\n    else if (!strcmp(s, \".data\"))\n\treturn STYP_DATA;\n    else if (!strcmp(s, \".bss\"))\n\treturn STYP_BSS;\n    else if (!strcmp(s, \".stack\"))\n\treturn STYP_BSS | STYP_ALIGN | 0x200;\n    else if (!strcmp(s, \".cinit\"))\n\treturn STYP_COPY | STYP_DATA | STYP_ALIGN | 0x200;\n    else\n\treturn 0;\n}\n\nSection *FindSection(TCCState * s1, const char *sname)\n{\n    Section *s;\n    int i;\n\n    for (i = 1; i < s1->nb_sections; i++) {\n\ts = s1->sections[i];\n\n\tif (!strcmp(sname, s->name))\n\t    return s;\n    }\n\n    tcc_error(\"could not find section %s\", sname);\n    return 0;\n}\n\nST_FUNC int tcc_load_coff(TCCState * s1, int fd)\n{\n// tktk TokenSym *ts;\n\n    FILE *f;\n    unsigned int str_size;\n    char *Coff_str_table, *name;\n    int i, k;\n    struct syment csym;\n    char name2[9];\n    FILHDR file_hdr;\t\t/* FILE HEADER STRUCTURE              */\n\n    f = fdopen(fd, \"rb\");\n    if (!f) {\n\ttcc_error(\"Unable to open .out file for input\");\n    }\n\n    if (fread(&file_hdr, FILHSZ, 1, f) != 1)\n\ttcc_error(\"error reading .out file for input\");\n\n    if (fread(&o_filehdr, sizeof(o_filehdr), 1, f) != 1)\n\ttcc_error(\"error reading .out file for input\");\n\n    // first read the string table\n\n    if (fseek(f, file_hdr.f_symptr + file_hdr.f_nsyms * SYMESZ, SEEK_SET))\n\ttcc_error(\"error reading .out file for input\");\n\n    if (fread(&str_size, sizeof(int), 1, f) != 1)\n\ttcc_error(\"error reading .out file for input\");\n\n\n    Coff_str_table = (char *) tcc_malloc(str_size);\n\n    if (fread(Coff_str_table, str_size - 4, 1, f) != 1)\n\ttcc_error(\"error reading .out file for input\");\n\n    // read/process all the symbols\n\n    // seek back to symbols\n\n    if (fseek(f, file_hdr.f_symptr, SEEK_SET))\n\ttcc_error(\"error reading .out file for input\");\n\n    for (i = 0; i < file_hdr.f_nsyms; i++) {\n\tif (fread(&csym, SYMESZ, 1, f) != 1)\n\t    tcc_error(\"error reading .out file for input\");\n\n\tif (csym._n._n_n._n_zeroes == 0) {\n\t    name = Coff_str_table + csym._n._n_n._n_offset - 4;\n\t} else {\n\t    name = csym._n._n_name;\n\n\t    if (name[7] != 0) {\n\t\tfor (k = 0; k < 8; k++)\n\t\t    name2[k] = name[k];\n\n\t\tname2[8] = 0;\n\n\t\tname = name2;\n\t    }\n\t}\n//              if (strcmp(\"_DAC_Buffer\",name)==0)  // tktk\n//                      name[0]=0;\n\n\tif (((csym.n_type & 0x30) == 0x20 && csym.n_sclass == 0x2) || ((csym.n_type & 0x30) == 0x30 && csym.n_sclass == 0x2) || (csym.n_type == 0x4 && csym.n_sclass == 0x2) || (csym.n_type == 0x8 && csym.n_sclass == 0x2) ||\t// structures\n\t    (csym.n_type == 0x18 && csym.n_sclass == 0x2) ||\t// pointer to structure\n\t    (csym.n_type == 0x7 && csym.n_sclass == 0x2) ||\t// doubles\n\t    (csym.n_type == 0x6 && csym.n_sclass == 0x2))\t// floats\n\t{\n\t    // strip off any leading underscore (except for other main routine)\n\n\t    if (name[0] == '_' && strcmp(name, \"_main\") != 0)\n\t\tname++;\n\n\t    tcc_add_symbol(s1, name, (void*)(uintptr_t)csym.n_value);\n\t}\n\t// skip any aux records\n\n\tif (csym.n_numaux == 1) {\n\t    if (fread(&csym, SYMESZ, 1, f) != 1)\n\t\ttcc_error(\"error reading .out file for input\");\n\t    i++;\n\t}\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tccelf.c",
    "content": "/*\n *  ELF file handling for TCC\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\nstatic int new_undef_sym = 0; /* Is there a new undefined sym since last new_undef_sym() */\n\nST_FUNC int put_elf_str(Section *s, const char *sym)\n{\n    int offset, len;\n    char *ptr;\n\n    len = strlen(sym) + 1;\n    offset = s->data_offset;\n    ptr = section_ptr_add(s, len);\n    memcpy(ptr, sym, len);\n    return offset;\n}\n\n/* elf symbol hashing function */\nstatic unsigned long elf_hash(const unsigned char *name)\n{\n    unsigned long h = 0, g;\n    \n    while (*name) {\n        h = (h << 4) + *name++;\n        g = h & 0xf0000000;\n        if (g)\n            h ^= g >> 24;\n        h &= ~g;\n    }\n    return h;\n}\n\n/* rebuild hash table of section s */\n/* NOTE: we do factorize the hash table code to go faster */\nstatic void rebuild_hash(Section *s, unsigned int nb_buckets)\n{\n    ElfW(Sym) *sym;\n    int *ptr, *hash, nb_syms, sym_index, h;\n    char *strtab;\n\n    strtab = s->link->data;\n    nb_syms = s->data_offset / sizeof(ElfW(Sym));\n\n    s->hash->data_offset = 0;\n    ptr = section_ptr_add(s->hash, (2 + nb_buckets + nb_syms) * sizeof(int));\n    ptr[0] = nb_buckets;\n    ptr[1] = nb_syms;\n    ptr += 2;\n    hash = ptr;\n    memset(hash, 0, (nb_buckets + 1) * sizeof(int));\n    ptr += nb_buckets + 1;\n\n    sym = (ElfW(Sym) *)s->data + 1;\n    for(sym_index = 1; sym_index < nb_syms; sym_index++) {\n        if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {\n            h = elf_hash(strtab + sym->st_name) % nb_buckets;\n            *ptr = hash[h];\n            hash[h] = sym_index;\n        } else {\n            *ptr = 0;\n        }\n        ptr++;\n        sym++;\n    }\n}\n\n/* return the symbol number */\nST_FUNC int put_elf_sym(Section *s, addr_t value, unsigned long size,\n    int info, int other, int shndx, const char *name)\n{\n    int name_offset, sym_index;\n    int nbuckets, h;\n    ElfW(Sym) *sym;\n    Section *hs;\n    \n    sym = section_ptr_add(s, sizeof(ElfW(Sym)));\n    if (name)\n        name_offset = put_elf_str(s->link, name);\n    else\n        name_offset = 0;\n    /* XXX: endianness */\n    sym->st_name = name_offset;\n    sym->st_value = value;\n    sym->st_size = size;\n    sym->st_info = info;\n    sym->st_other = other;\n    sym->st_shndx = shndx;\n    sym_index = sym - (ElfW(Sym) *)s->data;\n    hs = s->hash;\n    if (hs) {\n        int *ptr, *base;\n        ptr = section_ptr_add(hs, sizeof(int));\n        base = (int *)hs->data;\n        /* only add global or weak symbols */\n        if (ELFW(ST_BIND)(info) != STB_LOCAL) {\n            /* add another hashing entry */\n            nbuckets = base[0];\n            h = elf_hash(name) % nbuckets;\n            *ptr = base[2 + h];\n            base[2 + h] = sym_index;\n            base[1]++;\n            /* we resize the hash table */\n            hs->nb_hashed_syms++;\n            if (hs->nb_hashed_syms > 2 * nbuckets) {\n                rebuild_hash(s, 2 * nbuckets);\n            }\n        } else {\n            *ptr = 0;\n            base[1]++;\n        }\n    }\n    return sym_index;\n}\n\n/* find global ELF symbol 'name' and return its index. Return 0 if not\n   found. */\nST_FUNC int find_elf_sym(Section *s, const char *name)\n{\n    ElfW(Sym) *sym;\n    Section *hs;\n    int nbuckets, sym_index, h;\n    const char *name1;\n    \n    hs = s->hash;\n    if (!hs)\n        return 0;\n    nbuckets = ((int *)hs->data)[0];\n    h = elf_hash(name) % nbuckets;\n    sym_index = ((int *)hs->data)[2 + h];\n    while (sym_index != 0) {\n        sym = &((ElfW(Sym) *)s->data)[sym_index];\n        name1 = s->link->data + sym->st_name;\n        if (!strcmp(name, name1))\n            return sym_index;\n        sym_index = ((int *)hs->data)[2 + nbuckets + sym_index];\n    }\n    return 0;\n}\n\n/* return elf symbol value, signal error if 'err' is nonzero */\nST_FUNC addr_t get_elf_sym_addr(TCCState *s, const char *name, int err)\n{\n    int sym_index;\n    ElfW(Sym) *sym;\n\n    sym_index = find_elf_sym(s->symtab, name);\n    sym = &((ElfW(Sym) *)s->symtab->data)[sym_index];\n    if (!sym_index || sym->st_shndx == SHN_UNDEF) {\n        if (err)\n            tcc_error(\"%s not defined\", name);\n        return 0;\n    }\n    return sym->st_value;\n}\n\n/* return elf symbol value */\nLIBTCCAPI void *tcc_get_symbol(TCCState *s, const char *name)\n{\n    return (void*)(uintptr_t)get_elf_sym_addr(s, name, 0);\n}\n\n#ifdef TCC_IS_NATIVE\n/* return elf symbol value or error */\nST_FUNC void* tcc_get_symbol_err(TCCState *s, const char *name)\n{\n    return (void*)get_elf_sym_addr(s, name, 1);\n}\n#endif\n\n/* add an elf symbol : check if it is already defined and patch\n   it. Return symbol index. NOTE that sh_num can be SHN_UNDEF. */\nST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size,\n                       int info, int other, int sh_num, const char *name)\n{\n    ElfW(Sym) *esym;\n    int sym_bind, sym_index, sym_type, esym_bind;\n    unsigned char sym_vis, esym_vis, new_vis;\n\n    sym_bind = ELFW(ST_BIND)(info);\n    sym_type = ELFW(ST_TYPE)(info);\n    sym_vis = ELFW(ST_VISIBILITY)(other);\n        \n    if (sym_bind != STB_LOCAL) {\n        /* we search global or weak symbols */\n        sym_index = find_elf_sym(s, name);\n        if (!sym_index)\n            goto do_def;\n        esym = &((ElfW(Sym) *)s->data)[sym_index];\n        if (esym->st_shndx != SHN_UNDEF) {\n            esym_bind = ELFW(ST_BIND)(esym->st_info);\n            /* propagate the most constraining visibility */\n            /* STV_DEFAULT(0)<STV_PROTECTED(3)<STV_HIDDEN(2)<STV_INTERNAL(1) */\n            esym_vis = ELFW(ST_VISIBILITY)(esym->st_other);\n            if (esym_vis == STV_DEFAULT) {\n                new_vis = sym_vis;\n            } else if (sym_vis == STV_DEFAULT) {\n                new_vis = esym_vis;\n            } else {\n                new_vis = (esym_vis < sym_vis) ? esym_vis : sym_vis;\n            }\n            esym->st_other = (esym->st_other & ~ELFW(ST_VISIBILITY)(-1))\n                             | new_vis;\n            other = esym->st_other; /* in case we have to patch esym */\n            if (sh_num == SHN_UNDEF) {\n                /* ignore adding of undefined symbol if the\n                   corresponding symbol is already defined */\n            } else if (sym_bind == STB_GLOBAL && esym_bind == STB_WEAK) {\n                /* global overrides weak, so patch */\n                goto do_patch;\n            } else if (sym_bind == STB_WEAK && esym_bind == STB_GLOBAL) {\n                /* weak is ignored if already global */\n            } else if (sym_bind == STB_WEAK && esym_bind == STB_WEAK) {\n                /* keep first-found weak definition, ignore subsequents */\n            } else if (sym_vis == STV_HIDDEN || sym_vis == STV_INTERNAL) {\n                /* ignore hidden symbols after */\n            } else if (esym->st_shndx == SHN_COMMON\n                    && (sh_num < SHN_LORESERVE || sh_num == SHN_COMMON)) {\n                /* gr: Happens with 'tcc ... -static tcctest.c' on e.g. Ubuntu 6.01\n                   No idea if this is the correct solution ... */\n                goto do_patch;\n            } else if (s == tcc_state->dynsymtab_section) {\n                /* we accept that two DLL define the same symbol */\n            } else {\n#if 0\n                printf(\"new_bind=%x new_shndx=%x new_vis=%x old_bind=%x old_shndx=%x old_vis=%x\\n\",\n                       sym_bind, sh_num, new_vis, esym_bind, esym->st_shndx, esym_vis);\n#endif\n                tcc_error_noabort(\"'%s' defined twice\", name);\n            }\n        } else {\n        do_patch:\n            esym->st_info = ELFW(ST_INFO)(sym_bind, sym_type);\n            esym->st_shndx = sh_num;\n            new_undef_sym = 1;\n            esym->st_value = value;\n            esym->st_size = size;\n            esym->st_other = other;\n        }\n    } else {\n    do_def:\n        sym_index = put_elf_sym(s, value, size, \n                                ELFW(ST_INFO)(sym_bind, sym_type), other, \n                                sh_num, name);\n    }\n    return sym_index;\n}\n\n/* put relocation */\nST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset,\n                          int type, int symbol)\n{\n    char buf[256];\n    Section *sr;\n    ElfW_Rel *rel;\n\n    sr = s->reloc;\n    if (!sr) {\n        /* if no relocation section, create it */\n        snprintf(buf, sizeof(buf), REL_SECTION_FMT, s->name);\n        /* if the symtab is allocated, then we consider the relocation\n           are also */\n        sr = new_section(tcc_state, buf, SHT_RELX, symtab->sh_flags);\n        sr->sh_entsize = sizeof(ElfW_Rel);\n        sr->link = symtab;\n        sr->sh_info = s->sh_num;\n        s->reloc = sr;\n    }\n    rel = section_ptr_add(sr, sizeof(ElfW_Rel));\n    rel->r_offset = offset;\n    rel->r_info = ELFW(R_INFO)(symbol, type);\n#ifdef TCC_TARGET_X86_64\n    rel->r_addend = 0;\n#endif\n}\n\n/* put stab debug information */\n\nST_FUNC void put_stabs(const char *str, int type, int other, int desc,\n                      unsigned long value)\n{\n    Stab_Sym *sym;\n\n    sym = section_ptr_add(stab_section, sizeof(Stab_Sym));\n    if (str) {\n        sym->n_strx = put_elf_str(stabstr_section, str);\n    } else {\n        sym->n_strx = 0;\n    }\n    sym->n_type = type;\n    sym->n_other = other;\n    sym->n_desc = desc;\n    sym->n_value = value;\n}\n\nST_FUNC void put_stabs_r(const char *str, int type, int other, int desc, \n                        unsigned long value, Section *sec, int sym_index)\n{\n    put_stabs(str, type, other, desc, value);\n    put_elf_reloc(symtab_section, stab_section, \n                  stab_section->data_offset - sizeof(unsigned int),\n                  R_DATA_32, sym_index);\n}\n\nST_FUNC void put_stabn(int type, int other, int desc, int value)\n{\n    put_stabs(NULL, type, other, desc, value);\n}\n\nST_FUNC void put_stabd(int type, int other, int desc)\n{\n    put_stabs(NULL, type, other, desc, 0);\n}\n\n/* In an ELF file symbol table, the local symbols must appear below\n   the global and weak ones. Since TCC cannot sort it while generating\n   the code, we must do it after. All the relocation tables are also\n   modified to take into account the symbol table sorting */\nstatic void sort_syms(TCCState *s1, Section *s)\n{\n    int *old_to_new_syms;\n    ElfW(Sym) *new_syms;\n    int nb_syms, i;\n    ElfW(Sym) *p, *q;\n    ElfW_Rel *rel, *rel_end;\n    Section *sr;\n    int type, sym_index;\n\n    nb_syms = s->data_offset / sizeof(ElfW(Sym));\n    new_syms = tcc_malloc(nb_syms * sizeof(ElfW(Sym)));\n    old_to_new_syms = tcc_malloc(nb_syms * sizeof(int));\n\n    /* first pass for local symbols */\n    p = (ElfW(Sym) *)s->data;\n    q = new_syms;\n    for(i = 0; i < nb_syms; i++) {\n        if (ELFW(ST_BIND)(p->st_info) == STB_LOCAL) {\n            old_to_new_syms[i] = q - new_syms;\n            *q++ = *p;\n        }\n        p++;\n    }\n    /* save the number of local symbols in section header */\n    s->sh_info = q - new_syms;\n\n    /* then second pass for non local symbols */\n    p = (ElfW(Sym) *)s->data;\n    for(i = 0; i < nb_syms; i++) {\n        if (ELFW(ST_BIND)(p->st_info) != STB_LOCAL) {\n            old_to_new_syms[i] = q - new_syms;\n            *q++ = *p;\n        }\n        p++;\n    }\n    \n    /* we copy the new symbols to the old */\n    memcpy(s->data, new_syms, nb_syms * sizeof(ElfW(Sym)));\n    tcc_free(new_syms);\n\n    /* now we modify all the relocations */\n    for(i = 1; i < s1->nb_sections; i++) {\n        sr = s1->sections[i];\n        if (sr->sh_type == SHT_RELX && sr->link == s) {\n            rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);\n            for(rel = (ElfW_Rel *)sr->data;\n                rel < rel_end;\n                rel++) {\n                sym_index = ELFW(R_SYM)(rel->r_info);\n                type = ELFW(R_TYPE)(rel->r_info);\n                sym_index = old_to_new_syms[sym_index];\n                rel->r_info = ELFW(R_INFO)(sym_index, type);\n            }\n        }\n    }\n    \n    tcc_free(old_to_new_syms);\n}\n\n/* relocate common symbols in the .bss section */\nST_FUNC void relocate_common_syms(void)\n{\n    ElfW(Sym) *sym, *sym_end;\n    unsigned long offset, align;\n    \n    sym_end = (ElfW(Sym) *)(symtab_section->data + symtab_section->data_offset);\n    for(sym = (ElfW(Sym) *)symtab_section->data + 1; \n        sym < sym_end;\n        sym++) {\n        if (sym->st_shndx == SHN_COMMON) {\n            /* align symbol */\n            align = sym->st_value;\n            offset = bss_section->data_offset;\n            offset = (offset + align - 1) & -align;\n            sym->st_value = offset;\n            sym->st_shndx = bss_section->sh_num;\n            offset += sym->st_size;\n            bss_section->data_offset = offset;\n        }\n    }\n}\n\n/* relocate symbol table, resolve undefined symbols if do_resolve is\n   true and output error if undefined symbol. */\nST_FUNC void relocate_syms(TCCState *s1, int do_resolve)\n{\n    ElfW(Sym) *sym, *esym, *sym_end;\n    int sym_bind, sh_num, sym_index;\n    const char *name;\n\n    sym_end = (ElfW(Sym) *)(symtab_section->data + symtab_section->data_offset);\n    for(sym = (ElfW(Sym) *)symtab_section->data + 1; \n        sym < sym_end;\n        sym++) {\n        sh_num = sym->st_shndx;\n        if (sh_num == SHN_UNDEF) {\n            name = strtab_section->data + sym->st_name;\n            if (do_resolve) {\n#if defined TCC_IS_NATIVE && !defined _WIN32\n                void *addr;\n                name = symtab_section->link->data + sym->st_name;\n                addr = resolve_sym(s1, name);\n                if (addr) {\n                    sym->st_value = (addr_t)addr;\n                    goto found;\n                }\n#endif\n            } else if (s1->dynsym) {\n                /* if dynamic symbol exist, then use it */\n                sym_index = find_elf_sym(s1->dynsym, name);\n                if (sym_index) {\n                    esym = &((ElfW(Sym) *)s1->dynsym->data)[sym_index];\n                    sym->st_value = esym->st_value;\n                    goto found;\n                }\n            }\n            /* XXX: _fp_hw seems to be part of the ABI, so we ignore\n               it */\n            if (!strcmp(name, \"_fp_hw\"))\n                goto found;\n            /* only weak symbols are accepted to be undefined. Their\n               value is zero */\n            sym_bind = ELFW(ST_BIND)(sym->st_info);\n            if (sym_bind == STB_WEAK) {\n                sym->st_value = 0;\n            } else {\n                tcc_error_noabort(\"undefined symbol '%s'\", name);\n            }\n        } else if (sh_num < SHN_LORESERVE) {\n            /* add section base */\n            sym->st_value += s1->sections[sym->st_shndx]->sh_addr;\n        }\n    found: ;\n    }\n}\n\n#ifdef TCC_HAS_RUNTIME_PLTGOT\n#ifdef TCC_TARGET_X86_64\n#define JMP_TABLE_ENTRY_SIZE 14\nstatic addr_t add_jmp_table(TCCState *s1, addr_t val)\n{\n    char *p = s1->runtime_plt_and_got + s1->runtime_plt_and_got_offset;\n    s1->runtime_plt_and_got_offset += JMP_TABLE_ENTRY_SIZE;\n    /* jmp *0x0(%rip) */\n    p[0] = 0xff;\n    p[1] = 0x25;\n    *(int *)(p + 2) = 0;\n    *(addr_t *)(p + 6) = val;\n    return (addr_t)p;\n}\n\nstatic addr_t add_got_table(TCCState *s1, addr_t val)\n{\n    addr_t *p = (addr_t *)(s1->runtime_plt_and_got + s1->runtime_plt_and_got_offset);\n    s1->runtime_plt_and_got_offset += sizeof(addr_t);\n    *p = val;\n    return (addr_t)p;\n}\n#elif defined TCC_TARGET_ARM\n#define JMP_TABLE_ENTRY_SIZE 8\nstatic addr_t add_jmp_table(TCCState *s1, int val)\n{\n    uint32_t *p = (uint32_t *)(s1->runtime_plt_and_got + s1->runtime_plt_and_got_offset);\n    s1->runtime_plt_and_got_offset += JMP_TABLE_ENTRY_SIZE;\n    /* ldr pc, [pc, #-4] */\n    p[0] = 0xE51FF004;\n    p[1] = val;\n    return (addr_t)p;\n}\n#endif\n#endif /* def TCC_HAS_RUNTIME_PLTGOT */\n\n/* relocate a given section (CPU dependent) */\nST_FUNC void relocate_section(TCCState *s1, Section *s)\n{\n    Section *sr;\n    ElfW_Rel *rel, *rel_end, *qrel;\n    ElfW(Sym) *sym;\n    int type, sym_index;\n    unsigned char *ptr;\n    addr_t val, addr;\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n    int esym_index;\n#endif\n\n    sr = s->reloc;\n    rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);\n    qrel = (ElfW_Rel *)sr->data;\n    for(rel = qrel;\n        rel < rel_end;\n        rel++) {\n        ptr = s->data + rel->r_offset;\n\n        sym_index = ELFW(R_SYM)(rel->r_info);\n        sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n        val = sym->st_value;\n#ifdef TCC_TARGET_X86_64\n        val += rel->r_addend;\n#endif\n        type = ELFW(R_TYPE)(rel->r_info);\n        addr = s->sh_addr + rel->r_offset;\n\n        /* CPU specific */\n        switch(type) {\n#if defined(TCC_TARGET_I386)\n        case R_386_32:\n            if (s1->output_type == TCC_OUTPUT_DLL) {\n                esym_index = s1->symtab_to_dynsym[sym_index];\n                qrel->r_offset = rel->r_offset;\n                if (esym_index) {\n                    qrel->r_info = ELFW(R_INFO)(esym_index, R_386_32);\n                    qrel++;\n                    break;\n                } else {\n                    qrel->r_info = ELFW(R_INFO)(0, R_386_RELATIVE);\n                    qrel++;\n                }\n            }\n            *(int *)ptr += val;\n            break;\n        case R_386_PC32:\n            if (s1->output_type == TCC_OUTPUT_DLL) {\n                /* DLL relocation */\n                esym_index = s1->symtab_to_dynsym[sym_index];\n                if (esym_index) {\n                    qrel->r_offset = rel->r_offset;\n                    qrel->r_info = ELFW(R_INFO)(esym_index, R_386_PC32);\n                    qrel++;\n                    break;\n                }\n            }\n            *(int *)ptr += val - addr;\n            break;\n        case R_386_PLT32:\n            *(int *)ptr += val - addr;\n            break;\n        case R_386_GLOB_DAT:\n        case R_386_JMP_SLOT:\n            *(int *)ptr = val;\n            break;\n        case R_386_GOTPC:\n            *(int *)ptr += s1->got->sh_addr - addr;\n            break;\n        case R_386_GOTOFF:\n            *(int *)ptr += val - s1->got->sh_addr;\n            break;\n        case R_386_GOT32:\n            /* we load the got offset */\n            *(int *)ptr += s1->sym_attrs[sym_index].got_offset;\n            break;\n        case R_386_16:\n            if (s1->output_format != TCC_OUTPUT_FORMAT_BINARY) {\n            output_file:\n\t\ttcc_error(\"can only produce 16-bit binary files\");\n            }\n            *(short *)ptr += val;\n            break;\n        case R_386_PC16:\n            if (s1->output_format != TCC_OUTPUT_FORMAT_BINARY)\n\t\tgoto output_file;\n            *(short *)ptr += val - addr;\n            break;\n#elif defined(TCC_TARGET_ARM)\n        case R_ARM_PC24:\n        case R_ARM_CALL:\n        case R_ARM_JUMP24:\n        case R_ARM_PLT32:\n            {\n                int x, is_thumb, is_call, h, blx_avail;\n                x = (*(int *)ptr)&0xffffff;\n                (*(int *)ptr) &= 0xff000000;\n                if (x & 0x800000)\n                    x -= 0x1000000;\n                x <<= 2;\n                blx_avail = (TCC_ARM_VERSION >= 5);\n                is_thumb = val & 1;\n                is_call = (type == R_ARM_CALL);\n                x += val - addr;\n                h = x & 2;\n#ifdef TCC_HAS_RUNTIME_PLTGOT\n                if (s1->output_type == TCC_OUTPUT_MEMORY) {\n                    if ((x & 3) || x >= 0x2000000 || x < -0x2000000)\n                        if (!(x & 3) || !blx_avail || !is_call) {\n                            x += add_jmp_table(s1, val) - val; /* add veneer */\n                            is_thumb = 0; /* Veneer uses ARM instructions */\n                        }\n                }\n#endif\n                if ((x & 3) || x >= 0x2000000 || x < -0x2000000)\n                    if (!(x & 3) || !blx_avail || !is_call)\n                        tcc_error(\"can't relocate value at %x\",addr);\n                x >>= 2;\n                x &= 0xffffff;\n                /* Only reached if blx is avail and it is a call */\n                if (is_thumb) {\n                    x |= h << 24;\n                    (*(int *)ptr) = 0xfa << 24; /* bl -> blx */\n                }\n                (*(int *)ptr) |= x;\n            }\n            break;\n        /* Since these relocations only concern Thumb-2 and blx instruction was\n           introduced before Thumb-2, we can assume blx is available and not\n           guard its use */\n        case R_ARM_THM_CALL:\n        case R_ARM_THM_JUMP24:\n\t    {\n                int x, hi, lo, s, j1, j2, i1, i2, imm10, imm11;\n                int to_thumb, is_call, to_plt, blx_bit = 1 << 12;\n                Section *plt;\n\n                /* weak reference */\n                if (sym->st_shndx == SHN_UNDEF &&\n                    ELFW(ST_BIND)(sym->st_info) == STB_WEAK)\n                    break;\n\n                /* Get initial offset */\n                hi = (*(uint16_t *)ptr);\n                lo = (*(uint16_t *)(ptr+2));\n                s = (hi >> 10) & 1;\n                j1 = (lo >> 13) & 1;\n                j2 = (lo >> 11) & 1;\n                i1 = (j1 ^ s) ^ 1;\n                i2 = (j2 ^ s) ^ 1;\n                imm10 = hi & 0x3ff;\n                imm11 = lo & 0x7ff;\n                x = (s << 24) | (i1 << 23) | (i2 << 22) |\n                    (imm10 << 12) | (imm11 << 1);\n                if (x & 0x01000000)\n                    x -= 0x02000000;\n\n                /* Relocation infos */\n                to_thumb = val & 1;\n                plt = s1->plt;\n                to_plt = (val >= plt->sh_addr) &&\n                         (val < plt->sh_addr + plt->data_offset);\n                is_call = (type == R_ARM_THM_CALL);\n\n                /* Compute final offset */\n                if (to_plt && !is_call) /* Point to 1st instr of Thumb stub */\n                    x -= 4;\n                x += val - addr;\n                if (!to_thumb && is_call) {\n                    blx_bit = 0; /* bl -> blx */\n                    x = (x + 3) & -4; /* Compute offset from aligned PC */\n                }\n\n                /* Check that relocation is possible\n                   * offset must not be out of range\n                   * if target is to be entered in arm mode:\n                     - bit 1 must not set\n                     - instruction must be a call (bl) or a jump to PLT */\n                if (!to_thumb || x >= 0x1000000 || x < -0x1000000)\n                    if (to_thumb || (val & 2) || (!is_call && !to_plt))\n                        tcc_error(\"can't relocate value at %x\",addr);\n\n                /* Compute and store final offset */\n                s = (x >> 24) & 1;\n                i1 = (x >> 23) & 1;\n                i2 = (x >> 22) & 1;\n                j1 = s ^ (i1 ^ 1);\n                j2 = s ^ (i2 ^ 1);\n                imm10 = (x >> 12) & 0x3ff;\n                imm11 = (x >> 1) & 0x7ff;\n                (*(uint16_t *)ptr) = (uint16_t) ((hi & 0xf800) |\n                                     (s << 10) | imm10);\n                (*(uint16_t *)(ptr+2)) = (uint16_t) ((lo & 0xc000) |\n                                (j1 << 13) | blx_bit | (j2 << 11) |\n                                imm11);\n            }\n            break;\n        case R_ARM_MOVT_ABS:\n        case R_ARM_MOVW_ABS_NC:\n            {\n                int x, imm4, imm12;\n                if (type == R_ARM_MOVT_ABS)\n                    val >>= 16;\n                imm12 = val & 0xfff;\n                imm4 = (val >> 12) & 0xf;\n                x = (imm4 << 16) | imm12;\n                if (type == R_ARM_THM_MOVT_ABS)\n                    *(int *)ptr |= x;\n                else\n                    *(int *)ptr += x;\n\t    }\n            break;\n        case R_ARM_THM_MOVT_ABS:\n        case R_ARM_THM_MOVW_ABS_NC:\n            {\n                int x, i, imm4, imm3, imm8;\n                if (type == R_ARM_THM_MOVT_ABS)\n                    val >>= 16;\n                imm8 = val & 0xff;\n                imm3 = (val >> 8) & 0x7;\n                i = (val >> 11) & 1;\n                imm4 = (val >> 12) & 0xf;\n                x = (imm3 << 28) | (imm8 << 16) | (i << 10) | imm4;\n                if (type == R_ARM_THM_MOVT_ABS)\n                    *(int *)ptr |= x;\n                else\n                    *(int *)ptr += x;\n\t    }\n            break;\n        case R_ARM_PREL31:\n            {\n                int x;\n                x = (*(int *)ptr) & 0x7fffffff;\n                (*(int *)ptr) &= 0x80000000;\n                x = (x * 2) / 2;\n                x += val - addr;\n                if((x^(x>>1))&0x40000000)\n                    tcc_error(\"can't relocate value at %x\",addr);\n                (*(int *)ptr) |= x & 0x7fffffff;\n            }\n        case R_ARM_ABS32:\n            *(int *)ptr += val;\n            break;\n        case R_ARM_REL32:\n            *(int *)ptr += val - addr;\n            break;\n        case R_ARM_BASE_PREL:\n            *(int *)ptr += s1->got->sh_addr - addr;\n            break;\n        case R_ARM_GOTOFF32:\n            *(int *)ptr += val - s1->got->sh_addr;\n            break;\n        case R_ARM_GOT_BREL:\n            /* we load the got offset */\n            *(int *)ptr += s1->sym_attrs[sym_index].got_offset;\n            break;\n        case R_ARM_COPY:\n            break;\n        case R_ARM_V4BX:\n            /* trade Thumb support for ARMv4 support */\n            if ((0x0ffffff0 & *(int*)ptr) == 0x012FFF10)\n                *(int*)ptr ^= 0xE12FFF10 ^ 0xE1A0F000; /* BX Rm -> MOV PC, Rm */\n            break;\n        default:\n            fprintf(stderr,\"FIXME: handle reloc type %x at %x [%p] to %x\\n\",\n                type, (unsigned)addr, ptr, (unsigned)val);\n            break;\n#elif defined(TCC_TARGET_C67)\n        case R_C60_32:\n            *(int *)ptr += val;\n            break;\n        case R_C60LO16:\n            {\n                uint32_t orig;\n                \n                /* put the low 16 bits of the absolute address */\n                // add to what is already there\n                \n                orig  =   ((*(int *)(ptr  )) >> 7) & 0xffff;\n                orig |=  (((*(int *)(ptr+4)) >> 7) & 0xffff) << 16;\n                \n                //patch both at once - assumes always in pairs Low - High\n                \n                *(int *) ptr    = (*(int *) ptr    & (~(0xffff << 7)) ) |  (((val+orig)      & 0xffff) << 7);\n                *(int *)(ptr+4) = (*(int *)(ptr+4) & (~(0xffff << 7)) ) | ((((val+orig)>>16) & 0xffff) << 7);\n            }\n            break;\n        case R_C60HI16:\n            break;\n        default:\n            fprintf(stderr,\"FIXME: handle reloc type %x at %x [%p] to %x\\n\",\n                type, (unsigned)addr, ptr, (unsigned)val);\n            break;\n#elif defined(TCC_TARGET_X86_64)\n        case R_X86_64_64:\n            if (s1->output_type == TCC_OUTPUT_DLL) {\n                qrel->r_info = ELFW(R_INFO)(0, R_X86_64_RELATIVE);\n                qrel->r_addend = *(long long *)ptr + val;\n                qrel++;\n            }\n            *(long long *)ptr += val;\n            break;\n        case R_X86_64_32:\n        case R_X86_64_32S:\n            if (s1->output_type == TCC_OUTPUT_DLL) {\n                /* XXX: this logic may depend on TCC's codegen\n                   now TCC uses R_X86_64_32 even for a 64bit pointer */\n                qrel->r_info = ELFW(R_INFO)(0, R_X86_64_RELATIVE);\n                qrel->r_addend = *(int *)ptr + val;\n                qrel++;\n            }\n            *(int *)ptr += val;\n            break;\n\n        case R_X86_64_PC32:\n            if (s1->output_type == TCC_OUTPUT_DLL) {\n                /* DLL relocation */\n                esym_index = s1->symtab_to_dynsym[sym_index];\n                if (esym_index) {\n                    qrel->r_offset = rel->r_offset;\n                    qrel->r_info = ELFW(R_INFO)(esym_index, R_X86_64_PC32);\n                    qrel->r_addend = *(int *)ptr;\n                    qrel++;\n                    break;\n                }\n            }\n            /* fall through */\n        case R_X86_64_PLT32: {\n            long long diff;\n            diff = (long long)val - addr;\n            if (diff <= -2147483647 || diff > 2147483647) {\n#ifdef TCC_HAS_RUNTIME_PLTGOT\n                /* XXX: naive support for over 32bit jump */\n                if (s1->output_type == TCC_OUTPUT_MEMORY) {\n                    val = (add_jmp_table(s1, val - rel->r_addend) +\n                           rel->r_addend);\n                    diff = val - addr;\n                }\n#endif\n                if (diff <= -2147483647 || diff > 2147483647) {\n                    tcc_error(\"internal error: relocation failed\");\n                }\n            }\n            *(int *)ptr += diff;\n        }\n            break;\n        case R_X86_64_GLOB_DAT:\n        case R_X86_64_JUMP_SLOT:\n            /* They don't need addend */\n            *(int *)ptr = val - rel->r_addend;\n            break;\n        case R_X86_64_GOTPCREL:\n#ifdef TCC_HAS_RUNTIME_PLTGOT\n            if (s1->output_type == TCC_OUTPUT_MEMORY) {\n                val = add_got_table(s1, val - rel->r_addend) + rel->r_addend;\n                *(int *)ptr += val - addr;\n                break;\n            }\n#endif\n            *(int *)ptr += (s1->got->sh_addr - addr +\n                            s1->sym_attrs[sym_index].got_offset - 4);\n            break;\n        case R_X86_64_GOTTPOFF:\n            *(int *)ptr += val - s1->got->sh_addr;\n            break;\n        case R_X86_64_GOT32:\n            /* we load the got offset */\n            *(int *)ptr += s1->sym_attrs[sym_index].got_offset;\n            break;\n#else\n#error unsupported processor\n#endif\n        }\n    }\n    /* if the relocation is allocated, we change its symbol table */\n    if (sr->sh_flags & SHF_ALLOC)\n        sr->link = s1->dynsym;\n}\n\n/* relocate relocation table in 'sr' */\nstatic void relocate_rel(TCCState *s1, Section *sr)\n{\n    Section *s;\n    ElfW_Rel *rel, *rel_end;\n    \n    s = s1->sections[sr->sh_info];\n    rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);\n    for(rel = (ElfW_Rel *)sr->data;\n        rel < rel_end;\n        rel++) {\n        rel->r_offset += s->sh_addr;\n    }\n}\n\n/* count the number of dynamic relocations so that we can reserve\n   their space */\nstatic int prepare_dynamic_rel(TCCState *s1, Section *sr)\n{\n    ElfW_Rel *rel, *rel_end;\n    int sym_index, esym_index, type, count;\n\n    count = 0;\n    rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);\n    for(rel = (ElfW_Rel *)sr->data; rel < rel_end; rel++) {\n        sym_index = ELFW(R_SYM)(rel->r_info);\n        type = ELFW(R_TYPE)(rel->r_info);\n        switch(type) {\n#if defined(TCC_TARGET_I386)\n        case R_386_32:\n#elif defined(TCC_TARGET_X86_64)\n        case R_X86_64_32:\n        case R_X86_64_32S:\n        case R_X86_64_64:\n#endif\n            count++;\n            break;\n#if defined(TCC_TARGET_I386)\n        case R_386_PC32:\n#elif defined(TCC_TARGET_X86_64)\n        case R_X86_64_PC32:\n#endif\n            esym_index = s1->symtab_to_dynsym[sym_index];\n            if (esym_index)\n                count++;\n            break;\n        default:\n            break;\n        }\n    }\n    if (count) {\n        /* allocate the section */\n        sr->sh_flags |= SHF_ALLOC;\n        sr->sh_size = count * sizeof(ElfW_Rel);\n    }\n    return count;\n}\n\nstatic struct sym_attr *alloc_sym_attr(TCCState *s1, int index)\n{\n    int n;\n    struct sym_attr *tab;\n\n    if (index >= s1->nb_sym_attrs) {\n        /* find immediately bigger power of 2 and reallocate array */\n        n = 1;\n        while (index >= n)\n            n *= 2;\n        tab = tcc_realloc(s1->sym_attrs, n * sizeof(*s1->sym_attrs));\n        s1->sym_attrs = tab;\n        memset(s1->sym_attrs + s1->nb_sym_attrs, 0,\n               (n - s1->nb_sym_attrs) * sizeof(*s1->sym_attrs));\n        s1->nb_sym_attrs = n;\n    }\n    return &s1->sym_attrs[index];\n}\n\n/* XXX: suppress that */\nstatic void put32(unsigned char *p, uint32_t val)\n{\n    p[0] = val;\n    p[1] = val >> 8;\n    p[2] = val >> 16;\n    p[3] = val >> 24;\n}\n\n#if defined(TCC_TARGET_I386) || defined(TCC_TARGET_ARM) || \\\n    defined(TCC_TARGET_X86_64)\nstatic uint32_t get32(unsigned char *p)\n{\n    return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);\n}\n#endif\n\nstatic void build_got(TCCState *s1)\n{\n    unsigned char *ptr;\n\n    /* if no got, then create it */\n    s1->got = new_section(s1, \".got\", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);\n    s1->got->sh_entsize = 4;\n    add_elf_sym(symtab_section, 0, 4, ELFW(ST_INFO)(STB_GLOBAL, STT_OBJECT), \n                0, s1->got->sh_num, \"_GLOBAL_OFFSET_TABLE_\");\n    ptr = section_ptr_add(s1->got, 3 * PTR_SIZE);\n#if PTR_SIZE == 4\n    /* keep space for _DYNAMIC pointer, if present */\n    put32(ptr, 0);\n    /* two dummy got entries */\n    put32(ptr + 4, 0);\n    put32(ptr + 8, 0);\n#else\n    /* keep space for _DYNAMIC pointer, if present */\n    put32(ptr, 0);\n    put32(ptr + 4, 0);\n    /* two dummy got entries */\n    put32(ptr + 8, 0);\n    put32(ptr + 12, 0);\n    put32(ptr + 16, 0);\n    put32(ptr + 20, 0);\n#endif\n}\n\n/* put a got entry corresponding to a symbol in symtab_section. 'size'\n   and 'info' can be modifed if more precise info comes from the DLL */\nstatic void put_got_entry(TCCState *s1,\n                          int reloc_type, unsigned long size, int info, \n                          int sym_index)\n{\n    int index;\n    const char *name;\n    ElfW(Sym) *sym;\n    unsigned long offset;\n    int *ptr;\n\n    if (!s1->got)\n        build_got(s1);\n\n    /* if a got entry already exists for that symbol, no need to add one */\n    if (sym_index < s1->nb_sym_attrs &&\n        s1->sym_attrs[sym_index].got_offset)\n        return;\n\n    alloc_sym_attr(s1, sym_index)->got_offset = s1->got->data_offset;\n\n    if (s1->dynsym) {\n        sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n        name = symtab_section->link->data + sym->st_name;\n        offset = sym->st_value;\n#if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)\n        if (reloc_type ==\n#ifdef TCC_TARGET_X86_64\n            R_X86_64_JUMP_SLOT\n#else\n            R_386_JMP_SLOT\n#endif\n            ) {\n            Section *plt;\n            uint8_t *p;\n            int modrm;\n\n#if defined(TCC_OUTPUT_DLL_WITH_PLT)\n            modrm = 0x25;\n#else\n            /* if we build a DLL, we add a %ebx offset */\n            if (s1->output_type == TCC_OUTPUT_DLL)\n                modrm = 0xa3;\n            else\n                modrm = 0x25;\n#endif\n\n            /* add a PLT entry */\n            plt = s1->plt;\n            if (plt->data_offset == 0) {\n                /* first plt entry */\n                p = section_ptr_add(plt, 16);\n                p[0] = 0xff; /* pushl got + PTR_SIZE */\n                p[1] = modrm + 0x10;\n                put32(p + 2, PTR_SIZE);\n                p[6] = 0xff; /* jmp *(got + PTR_SIZE * 2) */\n                p[7] = modrm;\n                put32(p + 8, PTR_SIZE * 2);\n            }\n\n            p = section_ptr_add(plt, 16);\n            p[0] = 0xff; /* jmp *(got + x) */\n            p[1] = modrm;\n            put32(p + 2, s1->got->data_offset);\n            p[6] = 0x68; /* push $xxx */\n            put32(p + 7, (plt->data_offset - 32) >> 1);\n            p[11] = 0xe9; /* jmp plt_start */\n            put32(p + 12, -(plt->data_offset));\n\n            /* the symbol is modified so that it will be relocated to\n               the PLT */\n#if !defined(TCC_OUTPUT_DLL_WITH_PLT)\n            if (s1->output_type == TCC_OUTPUT_EXE)\n#endif\n                offset = plt->data_offset - 16;\n        }\n#elif defined(TCC_TARGET_ARM)\n        if (reloc_type == R_ARM_JUMP_SLOT) {\n            Section *plt;\n            uint8_t *p;\n            \n            /* if we build a DLL, we add a %ebx offset */\n            if (s1->output_type == TCC_OUTPUT_DLL)\n                tcc_error(\"DLLs unimplemented!\");\n\n            /* add a PLT entry */\n            plt = s1->plt;\n            if (plt->data_offset == 0) {\n                /* first plt entry */\n                p = section_ptr_add(plt, 16);\n                put32(p     , 0xe52de004);\n                put32(p +  4, 0xe59fe010);\n                put32(p +  8, 0xe08fe00e);\n                put32(p + 12, 0xe5bef008);\n            }\n\n            if (s1->sym_attrs[sym_index].plt_thumb_stub) {\n                p = section_ptr_add(plt, 20);\n                put32(p  , 0x4778); // bx pc\n                put32(p+2, 0x46c0); // nop\n                p += 4;\n            } else\n                p = section_ptr_add(plt, 16);\n            put32(p  , 0xe59fc004); // ldr ip, [pc, #4] // offset in GOT\n            put32(p+4, 0xe08fc00c); // add ip, pc, ip // absolute address or offset\n            put32(p+8, 0xe59cf000); // ldr pc, [ip] // load absolute address or load offset\n            put32(p+12, s1->got->data_offset);\n\n            /* the symbol is modified so that it will be relocated to\n               the PLT */\n            if (s1->output_type == TCC_OUTPUT_EXE)\n                offset = plt->data_offset - 16;\n        }\n#elif defined(TCC_TARGET_C67)\n        tcc_error(\"C67 got not implemented\");\n#else\n#error unsupported CPU\n#endif\n        index = put_elf_sym(s1->dynsym, offset, \n                            size, info, 0, sym->st_shndx, name);\n        /* put a got entry */\n        put_elf_reloc(s1->dynsym, s1->got, \n                      s1->got->data_offset, \n                      reloc_type, index);\n    }\n    ptr = section_ptr_add(s1->got, PTR_SIZE);\n    *ptr = 0;\n}\n\n/* build GOT and PLT entries */\nST_FUNC void build_got_entries(TCCState *s1)\n{\n    Section *s;\n    ElfW_Rel *rel, *rel_end;\n    ElfW(Sym) *sym;\n    int i, type, reloc_type, sym_index;\n\n    for(i = 1; i < s1->nb_sections; i++) {\n        s = s1->sections[i];\n        if (s->sh_type != SHT_RELX)\n            continue;\n        /* no need to handle got relocations */\n        if (s->link != symtab_section)\n            continue;\n        rel_end = (ElfW_Rel *)(s->data + s->data_offset);\n        for(rel = (ElfW_Rel *)s->data;\n            rel < rel_end;\n            rel++) {\n            type = ELFW(R_TYPE)(rel->r_info);\n            switch(type) {\n#if defined(TCC_TARGET_I386)\n            case R_386_GOT32:\n            case R_386_GOTOFF:\n            case R_386_GOTPC:\n            case R_386_PLT32:\n                if (!s1->got)\n                    build_got(s1);\n                if (type == R_386_GOT32 || type == R_386_PLT32) {\n                    sym_index = ELFW(R_SYM)(rel->r_info);\n                    sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n                    /* look at the symbol got offset. If none, then add one */\n                    if (type == R_386_GOT32)\n                        reloc_type = R_386_GLOB_DAT;\n                    else\n                        reloc_type = R_386_JMP_SLOT;\n                    put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, \n                                  sym_index);\n                }\n                break;\n#elif defined(TCC_TARGET_ARM)\n            case R_ARM_GOT_BREL:\n            case R_ARM_GOTOFF32:\n            case R_ARM_BASE_PREL:\n            case R_ARM_PLT32:\n                if (!s1->got)\n                    build_got(s1);\n                if (type == R_ARM_GOT_BREL || type == R_ARM_PLT32) {\n                    sym_index = ELFW(R_SYM)(rel->r_info);\n                    sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n                    /* look at the symbol got offset. If none, then add one */\n                    if (type == R_ARM_GOT_BREL)\n                        reloc_type = R_ARM_GLOB_DAT;\n                    else\n                        reloc_type = R_ARM_JUMP_SLOT;\n                    put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, \n                                  sym_index);\n                }\n                break;\n#elif defined(TCC_TARGET_C67)\n            case R_C60_GOT32:\n            case R_C60_GOTOFF:\n            case R_C60_GOTPC:\n            case R_C60_PLT32:\n                if (!s1->got)\n                    build_got(s1);\n                if (type == R_C60_GOT32 || type == R_C60_PLT32) {\n                    sym_index = ELFW(R_SYM)(rel->r_info);\n                    sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n                    /* look at the symbol got offset. If none, then add one */\n                    if (type == R_C60_GOT32)\n                        reloc_type = R_C60_GLOB_DAT;\n                    else\n                        reloc_type = R_C60_JMP_SLOT;\n                    put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, \n                                  sym_index);\n                }\n                break;\n#elif defined(TCC_TARGET_X86_64)\n            case R_X86_64_GOT32:\n            case R_X86_64_GOTTPOFF:\n            case R_X86_64_GOTPCREL:\n            case R_X86_64_PLT32:\n                if (!s1->got)\n                    build_got(s1);\n                if (type == R_X86_64_GOT32 || type == R_X86_64_GOTPCREL ||\n                    type == R_X86_64_PLT32) {\n                    sym_index = ELFW(R_SYM)(rel->r_info);\n                    sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n                    /* look at the symbol got offset. If none, then add one */\n                    if (type == R_X86_64_GOT32 || type == R_X86_64_GOTPCREL)\n                        reloc_type = R_X86_64_GLOB_DAT;\n                    else\n                        reloc_type = R_X86_64_JUMP_SLOT;\n                    put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, \n                                  sym_index);\n                }\n                break;\n#else\n#error unsupported CPU\n#endif\n            default:\n                break;\n            }\n        }\n    }\n}\n\nST_FUNC Section *new_symtab(TCCState *s1,\n                           const char *symtab_name, int sh_type, int sh_flags,\n                           const char *strtab_name, \n                           const char *hash_name, int hash_sh_flags)\n{\n    Section *symtab, *strtab, *hash;\n    int *ptr, nb_buckets;\n\n    symtab = new_section(s1, symtab_name, sh_type, sh_flags);\n    symtab->sh_entsize = sizeof(ElfW(Sym));\n    strtab = new_section(s1, strtab_name, SHT_STRTAB, sh_flags);\n    put_elf_str(strtab, \"\");\n    symtab->link = strtab;\n    put_elf_sym(symtab, 0, 0, 0, 0, 0, NULL);\n    \n    nb_buckets = 1;\n\n    hash = new_section(s1, hash_name, SHT_HASH, hash_sh_flags);\n    hash->sh_entsize = sizeof(int);\n    symtab->hash = hash;\n    hash->link = symtab;\n\n    ptr = section_ptr_add(hash, (2 + nb_buckets + 1) * sizeof(int));\n    ptr[0] = nb_buckets;\n    ptr[1] = 1;\n    memset(ptr + 2, 0, (nb_buckets + 1) * sizeof(int));\n    return symtab;\n}\n\n/* put dynamic tag */\nstatic void put_dt(Section *dynamic, int dt, addr_t val)\n{\n    ElfW(Dyn) *dyn;\n    dyn = section_ptr_add(dynamic, sizeof(ElfW(Dyn)));\n    dyn->d_tag = dt;\n    dyn->d_un.d_val = val;\n}\n\nstatic void add_init_array_defines(TCCState *s1, const char *section_name)\n{\n    Section *s;\n    long end_offset;\n    char sym_start[1024];\n    char sym_end[1024];\n    \n    snprintf(sym_start, sizeof(sym_start), \"__%s_start\", section_name + 1);\n    snprintf(sym_end, sizeof(sym_end), \"__%s_end\", section_name + 1);\n\n    s = find_section(s1, section_name);\n    if (!s) {\n        end_offset = 0;\n        s = data_section;\n    } else {\n        end_offset = s->data_offset;\n    }\n\n    add_elf_sym(symtab_section, \n                0, 0,\n                ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                s->sh_num, sym_start);\n    add_elf_sym(symtab_section, \n                end_offset, 0,\n                ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                s->sh_num, sym_end);\n}\n\nST_FUNC void tcc_add_bcheck(TCCState *s1)\n{\n#ifdef CONFIG_TCC_BCHECK\n    unsigned long *ptr;\n    Section *init_section;\n    unsigned char *pinit;\n    int sym_index;\n\n    if (0 == s1->do_bounds_check)\n        return;\n\n    /* XXX: add an object file to do that */\n    ptr = section_ptr_add(bounds_section, sizeof(unsigned long));\n    *ptr = 0;\n    add_elf_sym(symtab_section, 0, 0,\n                ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                bounds_section->sh_num, \"__bounds_start\");\n#ifdef TCC_TARGET_I386\n    if (s1->output_type != TCC_OUTPUT_MEMORY) {\n        /* add 'call __bound_init()' in .init section */\n        init_section = find_section(s1, \".init\");\n        pinit = section_ptr_add(init_section, 5);\n        pinit[0] = 0xe8;\n        put32(pinit + 1, -4);\n        sym_index = find_elf_sym(symtab_section, \"__bound_init\");\n        put_elf_reloc(symtab_section, init_section,\n                      init_section->data_offset - 4, R_386_PC32, sym_index);\n    }\n#endif\n#endif\n}\n\nstatic inline int tcc_add_support(TCCState *s1, const char *filename)\n{\n    char buf[1024];\n    snprintf(buf, sizeof(buf), \"%s/%s\", s1->tcc_lib_path, filename);\n    return tcc_add_file(s1, buf);\n}\n\n/* add tcc runtime libraries */\nST_FUNC void tcc_add_runtime(TCCState *s1)\n{\n    tcc_add_bcheck(s1);\n\n    /* add libc */\n    if (!s1->nostdlib) {\n        tcc_add_library(s1, \"c\");\n#ifdef CONFIG_USE_LIBGCC\n        tcc_add_file(s1, TCC_LIBGCC);\n#elif !defined WITHOUT_LIBTCC\n        tcc_add_support(s1, \"libtcc1.a\");\n#endif\n        /* add crt end if not memory output */\n        if (s1->output_type != TCC_OUTPUT_MEMORY)\n            tcc_add_crt(s1, \"crtn.o\");\n    }\n}\n\n/* add various standard linker symbols (must be done after the\n   sections are filled (for example after allocating common\n   symbols)) */\nST_FUNC void tcc_add_linker_symbols(TCCState *s1)\n{\n    char buf[1024];\n    int i;\n    Section *s;\n\n    add_elf_sym(symtab_section, \n                text_section->data_offset, 0,\n                ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                text_section->sh_num, \"_etext\");\n    add_elf_sym(symtab_section, \n                data_section->data_offset, 0,\n                ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                data_section->sh_num, \"_edata\");\n    add_elf_sym(symtab_section, \n                bss_section->data_offset, 0,\n                ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                bss_section->sh_num, \"_end\");\n    /* horrible new standard ldscript defines */\n    add_init_array_defines(s1, \".preinit_array\");\n    add_init_array_defines(s1, \".init_array\");\n    add_init_array_defines(s1, \".fini_array\");\n    \n    /* add start and stop symbols for sections whose name can be\n       expressed in C */\n    for(i = 1; i < s1->nb_sections; i++) {\n        s = s1->sections[i];\n        if (s->sh_type == SHT_PROGBITS &&\n            (s->sh_flags & SHF_ALLOC)) {\n            const char *p;\n            int ch;\n\n            /* check if section name can be expressed in C */\n            p = s->name;\n            for(;;) {\n                ch = *p;\n                if (!ch)\n                    break;\n                if (!isid(ch) && !isnum(ch))\n                    goto next_sec;\n                p++;\n            }\n            snprintf(buf, sizeof(buf), \"__start_%s\", s->name);\n            add_elf_sym(symtab_section, \n                        0, 0,\n                        ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                        s->sh_num, buf);\n            snprintf(buf, sizeof(buf), \"__stop_%s\", s->name);\n            add_elf_sym(symtab_section,\n                        s->data_offset, 0,\n                        ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                        s->sh_num, buf);\n        }\n    next_sec: ;\n    }\n}\n\nstatic void tcc_output_binary(TCCState *s1, FILE *f,\n                              const int *section_order)\n{\n    Section *s;\n    int i, offset, size;\n\n    offset = 0;\n    for(i=1;i<s1->nb_sections;i++) {\n        s = s1->sections[section_order[i]];\n        if (s->sh_type != SHT_NOBITS &&\n            (s->sh_flags & SHF_ALLOC)) {\n            while (offset < s->sh_offset) {\n                fputc(0, f);\n                offset++;\n            }\n            size = s->sh_size;\n            fwrite(s->data, 1, size, f);\n            offset += size;\n        }\n    }\n}\n\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n#define\tHAVE_PHDR\t1\n#define\tEXTRA_RELITEMS\t14\n\n/* move the relocation value from .dynsym to .got */\nvoid patch_dynsym_undef(TCCState *s1, Section *s)\n{\n    uint32_t *gotd = (void *)s1->got->data;\n    ElfW(Sym) *sym, *sym_end;\n\n    gotd += 3;\t// dummy entries in .got\n    /* relocate symbols in .dynsym */\n    sym_end = (ElfW(Sym) *)(s->data + s->data_offset);\n    for (sym = (ElfW(Sym) *)s->data + 1; sym < sym_end; sym++) {\n\tif (sym->st_shndx == SHN_UNDEF) {\n\t    *gotd++ = sym->st_value + 6; // XXX 6 is magic ?\n\t    sym->st_value = 0;\n\t}\n    }\n}\n#else\n#define\tHAVE_PHDR\t0\n#define\tEXTRA_RELITEMS\t9\n\n/* zero plt offsets of weak symbols in .dynsym */\nvoid patch_dynsym_undef(TCCState *s1, Section *s)\n{\n    ElfW(Sym) *sym, *sym_end;\n\n    sym_end = (ElfW(Sym) *)(s->data + s->data_offset);\n    for (sym = (ElfW(Sym) *)s->data + 1; sym < sym_end; sym++)\n        if (sym->st_shndx == SHN_UNDEF && ELFW(ST_BIND)(sym->st_info) == STB_WEAK)\n            sym->st_value = 0;\n}\n#endif\n\nST_FUNC void fill_got_entry(TCCState *s1, ElfW_Rel *rel)\n{\n\tint sym_index = ELFW(R_SYM) (rel->r_info);\n\tElfW(Sym) *sym = &((ElfW(Sym) *) symtab_section->data)[sym_index];\n\tunsigned long offset;\n\n\tif (sym_index >= s1->nb_sym_attrs)\n\t\treturn;\n\toffset = s1->sym_attrs[sym_index].got_offset;\n\tsection_reserve(s1->got, offset + PTR_SIZE);\n#ifdef TCC_TARGET_X86_64\n\t/* only works for x86-64 */\n\tput32(s1->got->data + offset + 4, sym->st_value >> 32);\n#endif\n\tput32(s1->got->data + offset, sym->st_value & 0xffffffff);\n}\n\nST_FUNC void fill_got(TCCState *s1)\n{\n\tSection *s;\n\tElfW_Rel *rel, *rel_end;\n\tint i;\n\n\tfor(i = 1; i < s1->nb_sections; i++) {\n\t\ts = s1->sections[i];\n\t\tif (s->sh_type != SHT_RELX)\n\t\t\tcontinue;\n\t\t/* no need to handle got relocations */\n\t\tif (s->link != symtab_section)\n\t\t\tcontinue;\n\t\trel_end = (ElfW_Rel *) (s->data + s->data_offset);\n\t\tfor(rel = (ElfW_Rel *) s->data; rel < rel_end; rel++) {\n\t\t\tswitch (ELFW(R_TYPE) (rel->r_info)) {\n\t\t\tcase R_X86_64_GOT32:\n\t\t\tcase R_X86_64_GOTPCREL:\n\t\t\tcase R_X86_64_PLT32:\n\t\t\t\tfill_got_entry(s1, rel);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/* output an ELF file */\n/* XXX: suppress unneeded sections */\nstatic int elf_output_file(TCCState *s1, const char *filename)\n{\n    ElfW(Ehdr) ehdr;\n    FILE *f;\n    int fd, mode, ret;\n    int *section_order;\n    int shnum, i, phnum, file_offset, offset, size, j, sh_order_index, k;\n    long long tmp;\n    addr_t addr;\n    Section *strsec, *s;\n    ElfW(Shdr) shdr, *sh;\n    ElfW(Phdr) *phdr, *ph;\n    Section *interp, *dynamic, *dynstr;\n    unsigned long saved_dynamic_data_offset;\n    ElfW(Sym) *sym;\n    int type, file_type;\n    addr_t rel_addr, rel_size;\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n    addr_t bss_addr, bss_size;\n#endif\n\n    file_type = s1->output_type;\n    s1->nb_errors = 0;\n\n    if (file_type != TCC_OUTPUT_OBJ) {\n        tcc_add_runtime(s1);\n    }\n\n    phdr = NULL;\n    section_order = NULL;\n    interp = NULL;\n    dynamic = NULL;\n    dynstr = NULL; /* avoid warning */\n    saved_dynamic_data_offset = 0; /* avoid warning */\n    \n    if (file_type != TCC_OUTPUT_OBJ) {\n        relocate_common_syms();\n\n        tcc_add_linker_symbols(s1);\n\n        if (!s1->static_link) {\n            const char *name;\n            int sym_index, index;\n            ElfW(Sym) *esym, *sym_end;\n\n            if (file_type == TCC_OUTPUT_EXE) {\n                char *ptr;\n\t\t/* allow override the dynamic loader */\n\t\tconst char *elfint = getenv(\"LD_SO\");\n\t\tif (elfint == NULL)\n\t\t    elfint = CONFIG_TCC_ELFINTERP;\n                /* add interpreter section only if executable */\n                interp = new_section(s1, \".interp\", SHT_PROGBITS, SHF_ALLOC);\n                interp->sh_addralign = 1;\n                ptr = section_ptr_add(interp, 1+strlen(elfint));\n                strcpy(ptr, elfint);\n            }\n\n            /* add dynamic symbol table */\n            s1->dynsym = new_symtab(s1, \".dynsym\", SHT_DYNSYM, SHF_ALLOC,\n                                    \".dynstr\", \n                                    \".hash\", SHF_ALLOC);\n            dynstr = s1->dynsym->link;\n            \n            /* add dynamic section */\n            dynamic = new_section(s1, \".dynamic\", SHT_DYNAMIC, \n                                  SHF_ALLOC | SHF_WRITE);\n            dynamic->link = dynstr;\n            dynamic->sh_entsize = sizeof(ElfW(Dyn));\n        \n            /* add PLT */\n            s1->plt = new_section(s1, \".plt\", SHT_PROGBITS, \n                                  SHF_ALLOC | SHF_EXECINSTR);\n            s1->plt->sh_entsize = 4;\n\n            build_got(s1);\n\n            /* scan for undefined symbols and see if they are in the\n               dynamic symbols. If a symbol STT_FUNC or STT_GNU_IFUNC\n               is found, then we add it in the PLT. If a symbol\n               STT_OBJECT is found, we add it in the .bss section with\n               a suitable relocation */\n            sym_end = (ElfW(Sym) *)(symtab_section->data + \n                                    symtab_section->data_offset);\n            if (file_type == TCC_OUTPUT_EXE) {\n                for(sym = (ElfW(Sym) *)symtab_section->data + 1; \n                    sym < sym_end;\n                    sym++) {\n                    if (sym->st_shndx == SHN_UNDEF) {\n                        name = symtab_section->link->data + sym->st_name;\n                        sym_index = find_elf_sym(s1->dynsymtab_section, name);\n                        if (sym_index) {\n                            esym = &((ElfW(Sym) *)s1->dynsymtab_section->data)[sym_index];\n                            type = ELFW(ST_TYPE)(esym->st_info);\n                            if ((type == STT_FUNC) || (type == STT_GNU_IFUNC)) {\n                                /* Indirect functions shall have STT_FUNC type\n                                 * in executable dynsym section. Indeed, a dlsym\n                                 * call following a lazy resolution would pick\n                                 * the symbol value from the executable dynsym\n                                 * entry which would contain the address of the\n                                 * function wanted by the caller of dlsym\n                                 * instead of the address of the function that\n                                 * would return that address */\n                                put_got_entry(s1, R_JMP_SLOT, esym->st_size, \n                                              ELFW(ST_INFO)(STB_GLOBAL,STT_FUNC),\n                                              sym - (ElfW(Sym) *)symtab_section->data);\n                            } else if (type == STT_OBJECT) {\n                                unsigned long offset;\n                                ElfW(Sym) *dynsym, *dynsym_end;\n                                offset = bss_section->data_offset;\n                                /* XXX: which alignment ? */\n                                offset = (offset + 16 - 1) & -16;\n                                index = put_elf_sym(s1->dynsym, offset, esym->st_size, \n                                                    esym->st_info, 0, \n                                                    bss_section->sh_num, name);\n                                // Ensure R_COPY works for weak symbol aliases\n                                if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) {\n                                    dynsym_end = (ElfW(Sym) *)\n                                                 (s1->dynsymtab_section->data +\n                                                  s1->dynsymtab_section->data_offset);\n                                    for(dynsym = (ElfW(Sym) *)s1->dynsymtab_section->data + 1;\n                                        dynsym < dynsym_end; dynsym++) {\n                                        if ((dynsym->st_value == esym->st_value)\n                                           && (ELFW(ST_BIND)(dynsym->st_info) == STB_GLOBAL)) {\n                                            char *dynname;\n                                            dynname = s1->dynsymtab_section->link->data\n                                                      + dynsym->st_name;\n                                            put_elf_sym(s1->dynsym, offset,\n                                                        dynsym->st_size,\n                                                        dynsym->st_info, 0,\n                                                        bss_section->sh_num,\n                                                        dynname);\n                                            break;\n                                        }\n                                    }\n                                }\n                                put_elf_reloc(s1->dynsym, bss_section, \n                                              offset, R_COPY, index);\n                                offset += esym->st_size;\n                                bss_section->data_offset = offset;\n                            }\n                        } else {\n                                /* STB_WEAK undefined symbols are accepted */\n                                /* XXX: _fp_hw seems to be part of the ABI, so we ignore\n                                   it */\n                            if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK ||\n                                !strcmp(name, \"_fp_hw\")) {\n                            } else {\n                                tcc_error_noabort(\"undefined symbol '%s'\", name);\n                            }\n                        }\n                    } else if (s1->rdynamic && \n                               ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {\n                        /* if -rdynamic option, then export all non\n                           local symbols */\n                        name = symtab_section->link->data + sym->st_name;\n                        put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, \n                                    sym->st_info, 0, \n                                    sym->st_shndx, name);\n                    }\n                }\n            \n                if (s1->nb_errors)\n                    goto fail;\n\n                /* now look at unresolved dynamic symbols and export\n                   corresponding symbol */\n                sym_end = (ElfW(Sym) *)(s1->dynsymtab_section->data + \n                                        s1->dynsymtab_section->data_offset);\n                for(esym = (ElfW(Sym) *)s1->dynsymtab_section->data + 1; \n                    esym < sym_end;\n                    esym++) {\n                    if (esym->st_shndx == SHN_UNDEF) {\n                        name = s1->dynsymtab_section->link->data + esym->st_name;\n                        sym_index = find_elf_sym(symtab_section, name);\n                        if (sym_index) {\n                            /* XXX: avoid adding a symbol if already\n                               present because of -rdynamic ? */\n                            sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n                            put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, \n                                        sym->st_info, 0, \n                                        sym->st_shndx, name);\n                        } else {\n                            if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) {\n                                /* weak symbols can stay undefined */\n                            } else {\n                                tcc_warning(\"undefined dynamic symbol '%s'\", name);\n                            }\n                        }\n                    }\n                }\n            } else {\n                int nb_syms;\n                /* shared library case : we simply export all the global symbols */\n                nb_syms = symtab_section->data_offset / sizeof(ElfW(Sym));\n                s1->symtab_to_dynsym = tcc_mallocz(sizeof(int) * nb_syms);\n                for(sym = (ElfW(Sym) *)symtab_section->data + 1; \n                    sym < sym_end;\n                    sym++) {\n                    if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {\n#if defined(TCC_OUTPUT_DLL_WITH_PLT)\n                        if ((ELFW(ST_TYPE)(sym->st_info) == STT_FUNC ||\n                            ELFW(ST_TYPE)(sym->st_info) == STT_GNU_IFUNC)\n                            && sym->st_shndx == SHN_UNDEF) {\n                            int visibility = ELFW(ST_BIND)(sym->st_info);\n                            put_got_entry(s1, R_JMP_SLOT, sym->st_size, \n                                          ELFW(ST_INFO)(visibility,STT_FUNC),\n                                          sym - (ElfW(Sym) *)symtab_section->data);\n                        }\n                        else if (ELFW(ST_TYPE)(sym->st_info) == STT_OBJECT) {\n                            put_got_entry(s1, R_X86_64_GLOB_DAT, sym->st_size, \n                                          sym->st_info, \n                                          sym - (ElfW(Sym) *)symtab_section->data);\n                        }\n                        else\n#endif\n                        {\n                            name = symtab_section->link->data + sym->st_name;\n                            index = put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, \n                                                sym->st_info, 0, \n                                                sym->st_shndx, name);\n                            s1->symtab_to_dynsym[sym - \n                                                 (ElfW(Sym) *)symtab_section->data] = \n                                index;\n                        }\n                    }\n                }\n            }\n\n            build_got_entries(s1);\n        \n            /* add a list of needed dlls */\n            for(i = 0; i < s1->nb_loaded_dlls; i++) {\n                DLLReference *dllref = s1->loaded_dlls[i];\n                if (dllref->level == 0)\n                    put_dt(dynamic, DT_NEEDED, put_elf_str(dynstr, dllref->name));\n            }\n\n            if (s1->rpath)\n                put_dt(dynamic, DT_RPATH, put_elf_str(dynstr, s1->rpath));\n\n            /* XXX: currently, since we do not handle PIC code, we\n               must relocate the readonly segments */\n            if (file_type == TCC_OUTPUT_DLL) {\n                if (s1->soname)\n                    put_dt(dynamic, DT_SONAME, put_elf_str(dynstr, s1->soname));\n                put_dt(dynamic, DT_TEXTREL, 0);\n            }\n\n            if (s1->symbolic)\n                put_dt(dynamic, DT_SYMBOLIC, 0);\n\n            /* add necessary space for other entries */\n            saved_dynamic_data_offset = dynamic->data_offset;\n            dynamic->data_offset += sizeof(ElfW(Dyn)) * EXTRA_RELITEMS;\n        } else {\n            /* still need to build got entries in case of static link */\n            build_got_entries(s1);\n        }\n    }\n\n    memset(&ehdr, 0, sizeof(ehdr));\n\n    /* we add a section for symbols */\n    strsec = new_section(s1, \".shstrtab\", SHT_STRTAB, 0);\n    put_elf_str(strsec, \"\");\n    \n    /* compute number of sections */\n    shnum = s1->nb_sections;\n\n    /* this array is used to reorder sections in the output file */\n    section_order = tcc_malloc(sizeof(int) * shnum);\n    section_order[0] = 0;\n    sh_order_index = 1;\n    \n    /* compute number of program headers */\n    switch(file_type) {\n    default:\n    case TCC_OUTPUT_OBJ:\n        phnum = 0;\n        break;\n    case TCC_OUTPUT_EXE:\n        if (!s1->static_link)\n            phnum = 4 + HAVE_PHDR;\n        else\n            phnum = 2;\n        break;\n    case TCC_OUTPUT_DLL:\n        phnum = 3;\n        break;\n    }\n\n    /* allocate strings for section names and decide if an unallocated\n       section should be output */\n    /* NOTE: the strsec section comes last, so its size is also\n       correct ! */\n    for(i = 1; i < s1->nb_sections; i++) {\n        s = s1->sections[i];\n        s->sh_name = put_elf_str(strsec, s->name);\n#if 0 //gr       \n        printf(\"section: f=%08x t=%08x i=%08x %s %s\\n\", \n               s->sh_flags, \n               s->sh_type, \n               s->sh_info, \n               s->name, \n               s->reloc ? s->reloc->name : \"n\"\n               ); \n#endif\n        /* when generating a DLL, we include relocations but we may\n           patch them */\n        if (file_type == TCC_OUTPUT_DLL && \n            s->sh_type == SHT_RELX && \n            !(s->sh_flags & SHF_ALLOC)) {\n            /* //gr: avoid bogus relocs for empty (debug) sections */\n            if (s1->sections[s->sh_info]->sh_flags & SHF_ALLOC)\n                prepare_dynamic_rel(s1, s);\n            else if (s1->do_debug)\n                s->sh_size = s->data_offset;\n        } else if (s1->do_debug ||\n            file_type == TCC_OUTPUT_OBJ || \n            (s->sh_flags & SHF_ALLOC) ||\n            i == (s1->nb_sections - 1)) {\n            /* we output all sections if debug or object file */\n            s->sh_size = s->data_offset;\n        }\n    }\n\n    /* allocate program segment headers */\n    phdr = tcc_mallocz(phnum * sizeof(ElfW(Phdr)));\n        \n    if (s1->output_format == TCC_OUTPUT_FORMAT_ELF) {\n        file_offset = sizeof(ElfW(Ehdr)) + phnum * sizeof(ElfW(Phdr));\n    } else {\n        file_offset = 0;\n    }\n    if (phnum > 0) {\n        /* compute section to program header mapping */\n        if (s1->has_text_addr) { \n            int a_offset, p_offset;\n            addr = s1->text_addr;\n            /* we ensure that (addr % ELF_PAGE_SIZE) == file_offset %\n               ELF_PAGE_SIZE */\n            a_offset = (int) (addr & (s1->section_align - 1));\n            p_offset = file_offset & (s1->section_align - 1);\n            if (a_offset < p_offset) \n                a_offset += s1->section_align;\n            file_offset += (a_offset - p_offset);\n        } else {\n            if (file_type == TCC_OUTPUT_DLL)\n                addr = 0;\n            else\n                addr = ELF_START_ADDR;\n            /* compute address after headers */\n            addr += (file_offset & (s1->section_align - 1));\n        }\n        \n        /* dynamic relocation table information, for .dynamic section */\n        rel_size = 0;\n        rel_addr = 0;\n\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n        bss_addr = bss_size = 0;\n#endif\n        /* leave one program header for the program interpreter */\n        ph = &phdr[0];\n        if (interp)\n            ph += 1 + HAVE_PHDR;\n\n        for(j = 0; j < 2; j++) {\n            ph->p_type = PT_LOAD;\n            if (j == 0)\n                ph->p_flags = PF_R | PF_X;\n            else\n                ph->p_flags = PF_R | PF_W;\n            ph->p_align = s1->section_align;\n            \n            /* we do the following ordering: interp, symbol tables,\n               relocations, progbits, nobits */\n            /* XXX: do faster and simpler sorting */\n            for(k = 0; k < 5; k++) {\n                for(i = 1; i < s1->nb_sections; i++) {\n                    s = s1->sections[i];\n                    /* compute if section should be included */\n                    if (j == 0) {\n                        if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) != \n                            SHF_ALLOC)\n                            continue;\n                    } else {\n                        if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) != \n                            (SHF_ALLOC | SHF_WRITE))\n                            continue;\n                    }\n                    if (s == interp) {\n                        if (k != 0)\n                            continue;\n                    } else if (s->sh_type == SHT_DYNSYM ||\n                               s->sh_type == SHT_STRTAB ||\n                               s->sh_type == SHT_HASH) {\n                        if (k != 1)\n                            continue;\n                    } else if (s->sh_type == SHT_RELX) {\n                        if (k != 2)\n                            continue;\n                    } else if (s->sh_type == SHT_NOBITS) {\n                        if (k != 4)\n                            continue;\n                    } else {\n                        if (k != 3)\n                            continue;\n                    }\n                    section_order[sh_order_index++] = i;\n\n                    /* section matches: we align it and add its size */\n                    tmp = addr;\n                    addr = (addr + s->sh_addralign - 1) & \n                        ~(s->sh_addralign - 1);\n                    file_offset += (int) ( addr - tmp );\n                    s->sh_offset = file_offset;\n                    s->sh_addr = addr;\n                    \n                    /* update program header infos */\n                    if (ph->p_offset == 0) {\n                        ph->p_offset = file_offset;\n                        ph->p_vaddr = addr;\n                        ph->p_paddr = ph->p_vaddr;\n                    }\n                    /* update dynamic relocation infos */\n                    if (s->sh_type == SHT_RELX) {\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n                        if (!strcmp(strsec->data + s->sh_name, \".rel.got\")) { // rel_size == 0) {\n                            rel_addr = addr;\n\t\t\t    rel_size += s->sh_size;\t// XXX only first rel.\n\t\t\t}\n                        if (!strcmp(strsec->data + s->sh_name, \".rel.bss\")) { // rel_size == 0) {\n                            bss_addr = addr;\n\t\t\t    bss_size = s->sh_size;\t// XXX only first rel.\n\t\t\t}\n#else\n                        if (rel_size == 0)\n                            rel_addr = addr;\n                        rel_size += s->sh_size;\n#endif\n                    }\n                    addr += s->sh_size;\n                    if (s->sh_type != SHT_NOBITS)\n                        file_offset += s->sh_size;\n                }\n            }\n            ph->p_filesz = file_offset - ph->p_offset;\n            ph->p_memsz = addr - ph->p_vaddr;\n            ph++;\n            if (j == 0) {\n                if (s1->output_format == TCC_OUTPUT_FORMAT_ELF) {\n                    /* if in the middle of a page, we duplicate the page in\n                       memory so that one copy is RX and the other is RW */\n                    if ((addr & (s1->section_align - 1)) != 0)\n                        addr += s1->section_align;\n                } else {\n                    addr = (addr + s1->section_align - 1) & ~(s1->section_align - 1);\n                    file_offset = (file_offset + s1->section_align - 1) &\n                        ~(s1->section_align - 1);\n                }\n            }\n        }\n\n        /* if interpreter, then add corresponing program header */\n        if (interp) {\n            ph = &phdr[0];\n\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n\t    {\n\t\tint len = phnum * sizeof(ElfW(Phdr));\n\n\t\tph->p_type = PT_PHDR;\n\t\tph->p_offset = sizeof(ElfW(Ehdr));\n\t\tph->p_vaddr = interp->sh_addr - len;\n\t\tph->p_paddr = ph->p_vaddr;\n\t\tph->p_filesz = ph->p_memsz = len;\n\t\tph->p_flags = PF_R | PF_X;\n\t\tph->p_align = 4; // interp->sh_addralign;\n\t\tph++;\n\t    }\n#endif\n\n            ph->p_type = PT_INTERP;\n            ph->p_offset = interp->sh_offset;\n            ph->p_vaddr = interp->sh_addr;\n            ph->p_paddr = ph->p_vaddr;\n            ph->p_filesz = interp->sh_size;\n            ph->p_memsz = interp->sh_size;\n            ph->p_flags = PF_R;\n            ph->p_align = interp->sh_addralign;\n        }\n        \n        /* if dynamic section, then add corresponing program header */\n        if (dynamic) {\n            ElfW(Sym) *sym_end;\n\n            ph = &phdr[phnum - 1];\n            \n            ph->p_type = PT_DYNAMIC;\n            ph->p_offset = dynamic->sh_offset;\n            ph->p_vaddr = dynamic->sh_addr;\n            ph->p_paddr = ph->p_vaddr;\n            ph->p_filesz = dynamic->sh_size;\n            ph->p_memsz = dynamic->sh_size;\n            ph->p_flags = PF_R | PF_W;\n            ph->p_align = dynamic->sh_addralign;\n\n            /* put GOT dynamic section address */\n            put32(s1->got->data, dynamic->sh_addr);\n\n            /* relocate the PLT */\n            if (file_type == TCC_OUTPUT_EXE\n#if defined(TCC_OUTPUT_DLL_WITH_PLT)\n                || file_type == TCC_OUTPUT_DLL\n#endif\n                ) {\n                uint8_t *p, *p_end;\n\n                p = s1->plt->data;\n                p_end = p + s1->plt->data_offset;\n                if (p < p_end) {\n#if defined(TCC_TARGET_I386)\n                    put32(p + 2, get32(p + 2) + s1->got->sh_addr);\n                    put32(p + 8, get32(p + 8) + s1->got->sh_addr);\n                    p += 16;\n                    while (p < p_end) {\n                        put32(p + 2, get32(p + 2) + s1->got->sh_addr);\n                        p += 16;\n                    }\n#elif defined(TCC_TARGET_X86_64)\n                    int x = s1->got->sh_addr - s1->plt->sh_addr - 6;\n                    put32(p + 2, get32(p + 2) + x);\n                    put32(p + 8, get32(p + 8) + x - 6);\n                    p += 16;\n                    while (p < p_end) {\n                        put32(p + 2, get32(p + 2) + x + s1->plt->data - p);\n                        p += 16;\n                    }\n#elif defined(TCC_TARGET_ARM)\n                    int x;\n                    x=s1->got->sh_addr - s1->plt->sh_addr - 12;\n                    p += 16;\n                    while (p < p_end) {\n                        if (get32(p) == 0x46c04778) /* PLT Thumb stub present */\n                            p += 4;\n                        put32(p + 12, x + get32(p + 12) + s1->plt->data - p);\n                        p += 16;\n                    }\n#elif defined(TCC_TARGET_C67)\n                    /* XXX: TODO */\n#else\n#error unsupported CPU\n#endif\n                }\n            }\n\n            /* relocate symbols in .dynsym */\n            sym_end = (ElfW(Sym) *)(s1->dynsym->data + s1->dynsym->data_offset);\n            for(sym = (ElfW(Sym) *)s1->dynsym->data + 1; \n                sym < sym_end;\n                sym++) {\n                if (sym->st_shndx == SHN_UNDEF) {\n                    /* relocate to the PLT if the symbol corresponds\n                       to a PLT entry */\n                    if (sym->st_value)\n                        sym->st_value += s1->plt->sh_addr;\n                } else if (sym->st_shndx < SHN_LORESERVE) {\n                    /* do symbol relocation */\n                    sym->st_value += s1->sections[sym->st_shndx]->sh_addr;\n                }\n            }\n\n            /* put dynamic section entries */\n            dynamic->data_offset = saved_dynamic_data_offset;\n            put_dt(dynamic, DT_HASH, s1->dynsym->hash->sh_addr);\n            put_dt(dynamic, DT_STRTAB, dynstr->sh_addr);\n            put_dt(dynamic, DT_SYMTAB, s1->dynsym->sh_addr);\n            put_dt(dynamic, DT_STRSZ, dynstr->data_offset);\n            put_dt(dynamic, DT_SYMENT, sizeof(ElfW(Sym)));\n#ifdef TCC_TARGET_X86_64\n            put_dt(dynamic, DT_RELA, rel_addr);\n            put_dt(dynamic, DT_RELASZ, rel_size);\n            put_dt(dynamic, DT_RELAENT, sizeof(ElfW_Rel));\n#else\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n            put_dt(dynamic, DT_PLTGOT, s1->got->sh_addr);\n            put_dt(dynamic, DT_PLTRELSZ, rel_size);\n            put_dt(dynamic, DT_JMPREL, rel_addr);\n            put_dt(dynamic, DT_PLTREL, DT_REL);\n            put_dt(dynamic, DT_REL, bss_addr);\n            put_dt(dynamic, DT_RELSZ, bss_size);\n#else\n            put_dt(dynamic, DT_REL, rel_addr);\n            put_dt(dynamic, DT_RELSZ, rel_size);\n            put_dt(dynamic, DT_RELENT, sizeof(ElfW_Rel));\n#endif\n#endif\n            if (s1->do_debug)\n                put_dt(dynamic, DT_DEBUG, 0);\n            put_dt(dynamic, DT_NULL, 0);\n        }\n\n        ehdr.e_phentsize = sizeof(ElfW(Phdr));\n        ehdr.e_phnum = phnum;\n        ehdr.e_phoff = sizeof(ElfW(Ehdr));\n    }\n\n    /* all other sections come after */\n    for(i = 1; i < s1->nb_sections; i++) {\n        s = s1->sections[i];\n        if (phnum > 0 && (s->sh_flags & SHF_ALLOC))\n            continue;\n        section_order[sh_order_index++] = i;\n        \n        file_offset = (file_offset + s->sh_addralign - 1) & \n            ~(s->sh_addralign - 1);\n        s->sh_offset = file_offset;\n        if (s->sh_type != SHT_NOBITS)\n            file_offset += s->sh_size;\n    }\n    \n    /* if building executable or DLL, then relocate each section\n       except the GOT which is already relocated */\n    if (file_type != TCC_OUTPUT_OBJ) {\n        relocate_syms(s1, 0);\n\n        if (s1->nb_errors != 0) {\n        fail:\n            ret = -1;\n            goto the_end;\n        }\n\n        /* relocate sections */\n        /* XXX: ignore sections with allocated relocations ? */\n        for(i = 1; i < s1->nb_sections; i++) {\n            s = s1->sections[i];\n            if (s->reloc && s != s1->got)\n                relocate_section(s1, s);\n        }\n\n        /* relocate relocation entries if the relocation tables are\n           allocated in the executable */\n        for(i = 1; i < s1->nb_sections; i++) {\n            s = s1->sections[i];\n            if ((s->sh_flags & SHF_ALLOC) &&\n                s->sh_type == SHT_RELX) {\n                relocate_rel(s1, s);\n            }\n        }\n\n        /* get entry point address */\n        if (file_type == TCC_OUTPUT_EXE)\n            ehdr.e_entry = get_elf_sym_addr(s1, \"_start\", 1);\n        else\n            ehdr.e_entry = text_section->sh_addr; /* XXX: is it correct ? */\n    }\n    if (file_type == TCC_OUTPUT_EXE && s1->static_link)\n        fill_got(s1);\n\n    /* write elf file */\n    if (file_type == TCC_OUTPUT_OBJ)\n        mode = 0666;\n    else\n        mode = 0777;\n    unlink(filename);\n    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode); \n    if (fd < 0) {\n        tcc_error_noabort(\"could not write '%s'\", filename);\n        goto fail;\n    }\n    f = fdopen(fd, \"wb\");\n    if (s1->verbose)\n        printf(\"<- %s\\n\", filename);\n\n#ifdef TCC_TARGET_COFF\n    if (s1->output_format == TCC_OUTPUT_FORMAT_COFF) {\n        tcc_output_coff(s1, f);\n    } else\n#endif\n    if (s1->output_format == TCC_OUTPUT_FORMAT_ELF) {\n        sort_syms(s1, symtab_section);\n        \n        /* align to 4 */\n        file_offset = (file_offset + 3) & -4;\n    \n        /* fill header */\n        ehdr.e_ident[0] = ELFMAG0;\n        ehdr.e_ident[1] = ELFMAG1;\n        ehdr.e_ident[2] = ELFMAG2;\n        ehdr.e_ident[3] = ELFMAG3;\n        ehdr.e_ident[4] = ELFCLASSW;\n        ehdr.e_ident[5] = ELFDATA2LSB;\n        ehdr.e_ident[6] = EV_CURRENT;\n#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n        ehdr.e_ident[EI_OSABI] = ELFOSABI_FREEBSD;\n#endif\n#ifdef TCC_TARGET_ARM\n#ifdef TCC_ARM_EABI\n        ehdr.e_ident[EI_OSABI] = 0;\n        ehdr.e_flags = 4 << 24;\n#else\n        ehdr.e_ident[EI_OSABI] = ELFOSABI_ARM;\n#endif\n#endif\n        switch(file_type) {\n        default:\n        case TCC_OUTPUT_EXE:\n            ehdr.e_type = ET_EXEC;\n            break;\n        case TCC_OUTPUT_DLL:\n            ehdr.e_type = ET_DYN;\n            break;\n        case TCC_OUTPUT_OBJ:\n            ehdr.e_type = ET_REL;\n            break;\n        }\n        ehdr.e_machine = EM_TCC_TARGET;\n        ehdr.e_version = EV_CURRENT;\n        ehdr.e_shoff = file_offset;\n        ehdr.e_ehsize = sizeof(ElfW(Ehdr));\n        ehdr.e_shentsize = sizeof(ElfW(Shdr));\n        ehdr.e_shnum = shnum;\n        ehdr.e_shstrndx = shnum - 1;\n        \n        fwrite(&ehdr, 1, sizeof(ElfW(Ehdr)), f);\n        fwrite(phdr, 1, phnum * sizeof(ElfW(Phdr)), f);\n        offset = sizeof(ElfW(Ehdr)) + phnum * sizeof(ElfW(Phdr));\n\n        for(i=1;i<s1->nb_sections;i++) {\n            s = s1->sections[section_order[i]];\n            if (s->sh_type != SHT_NOBITS) {\n\t\tif (s->sh_type == SHT_DYNSYM)\n\t\t    patch_dynsym_undef(s1, s);\n                while (offset < s->sh_offset) {\n                    fputc(0, f);\n                    offset++;\n                }\n                size = s->sh_size;\n                fwrite(s->data, 1, size, f);\n                offset += size;\n            }\n        }\n\n        /* output section headers */\n        while (offset < ehdr.e_shoff) {\n            fputc(0, f);\n            offset++;\n        }\n    \n        for(i=0;i<s1->nb_sections;i++) {\n            sh = &shdr;\n            memset(sh, 0, sizeof(ElfW(Shdr)));\n            s = s1->sections[i];\n            if (s) {\n                sh->sh_name = s->sh_name;\n                sh->sh_type = s->sh_type;\n                sh->sh_flags = s->sh_flags;\n                sh->sh_entsize = s->sh_entsize;\n                sh->sh_info = s->sh_info;\n                if (s->link)\n                    sh->sh_link = s->link->sh_num;\n                sh->sh_addralign = s->sh_addralign;\n                sh->sh_addr = s->sh_addr;\n                sh->sh_offset = s->sh_offset;\n                sh->sh_size = s->sh_size;\n            }\n            fwrite(sh, 1, sizeof(ElfW(Shdr)), f);\n        }\n    } else {\n        tcc_output_binary(s1, f, section_order);\n    }\n    fclose(f);\n\n    ret = 0;\n the_end:\n    tcc_free(s1->symtab_to_dynsym);\n    tcc_free(section_order);\n    tcc_free(phdr);\n    tcc_free(s1->sym_attrs);\n    return ret;\n}\n\nLIBTCCAPI int tcc_output_file(TCCState *s, const char *filename)\n{\n    int ret;\n#ifdef TCC_TARGET_PE\n    if (s->output_type != TCC_OUTPUT_OBJ) {\n        ret = pe_output_file(s, filename);\n    } else\n#endif\n    {\n        ret = elf_output_file(s, filename);\n    }\n    return ret;\n}\n\nstatic void *load_data(int fd, unsigned long file_offset, unsigned long size)\n{\n    void *data;\n\n    data = tcc_malloc(size);\n    lseek(fd, file_offset, SEEK_SET);\n    read(fd, data, size);\n    return data;\n}\n\ntypedef struct SectionMergeInfo {\n    Section *s;            /* corresponding existing section */\n    unsigned long offset;  /* offset of the new section in the existing section */\n    uint8_t new_section;       /* true if section 's' was added */\n    uint8_t link_once;         /* true if link once section */\n} SectionMergeInfo;\n\n/* load an object file and merge it with current files */\n/* XXX: handle correctly stab (debug) info */\nST_FUNC int tcc_load_object_file(TCCState *s1, \n                                int fd, unsigned long file_offset)\n{ \n    ElfW(Ehdr) ehdr;\n    ElfW(Shdr) *shdr, *sh;\n    int size, i, j, offset, offseti, nb_syms, sym_index, ret;\n    unsigned char *strsec, *strtab;\n    int *old_to_new_syms;\n    char *sh_name, *name;\n    SectionMergeInfo *sm_table, *sm;\n    ElfW(Sym) *sym, *symtab;\n    ElfW_Rel *rel, *rel_end;\n    Section *s;\n\n    int stab_index;\n    int stabstr_index;\n\n    stab_index = stabstr_index = 0;\n\n    if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))\n        goto fail1;\n    if (ehdr.e_ident[0] != ELFMAG0 ||\n        ehdr.e_ident[1] != ELFMAG1 ||\n        ehdr.e_ident[2] != ELFMAG2 ||\n        ehdr.e_ident[3] != ELFMAG3)\n        goto fail1;\n    /* test if object file */\n    if (ehdr.e_type != ET_REL)\n        goto fail1;\n    /* test CPU specific stuff */\n    if (ehdr.e_ident[5] != ELFDATA2LSB ||\n        ehdr.e_machine != EM_TCC_TARGET) {\n    fail1:\n        tcc_error_noabort(\"invalid object file\");\n        return -1;\n    }\n    /* read sections */\n    shdr = load_data(fd, file_offset + ehdr.e_shoff, \n                     sizeof(ElfW(Shdr)) * ehdr.e_shnum);\n    sm_table = tcc_mallocz(sizeof(SectionMergeInfo) * ehdr.e_shnum);\n    \n    /* load section names */\n    sh = &shdr[ehdr.e_shstrndx];\n    strsec = load_data(fd, file_offset + sh->sh_offset, sh->sh_size);\n\n    /* load symtab and strtab */\n    old_to_new_syms = NULL;\n    symtab = NULL;\n    strtab = NULL;\n    nb_syms = 0;\n    for(i = 1; i < ehdr.e_shnum; i++) {\n        sh = &shdr[i];\n        if (sh->sh_type == SHT_SYMTAB) {\n            if (symtab) {\n                tcc_error_noabort(\"object must contain only one symtab\");\n            fail:\n                ret = -1;\n                goto the_end;\n            }\n            nb_syms = sh->sh_size / sizeof(ElfW(Sym));\n            symtab = load_data(fd, file_offset + sh->sh_offset, sh->sh_size);\n            sm_table[i].s = symtab_section;\n\n            /* now load strtab */\n            sh = &shdr[sh->sh_link];\n            strtab = load_data(fd, file_offset + sh->sh_offset, sh->sh_size);\n        }\n    }\n        \n    /* now examine each section and try to merge its content with the\n       ones in memory */\n    for(i = 1; i < ehdr.e_shnum; i++) {\n        /* no need to examine section name strtab */\n        if (i == ehdr.e_shstrndx)\n            continue;\n        sh = &shdr[i];\n        sh_name = strsec + sh->sh_name;\n        /* ignore sections types we do not handle */\n        if (sh->sh_type != SHT_PROGBITS &&\n            sh->sh_type != SHT_RELX && \n#ifdef TCC_ARM_EABI\n            sh->sh_type != SHT_ARM_EXIDX &&\n#endif\n            sh->sh_type != SHT_NOBITS && \n            sh->sh_type != SHT_PREINIT_ARRAY &&\n            sh->sh_type != SHT_INIT_ARRAY &&\n            sh->sh_type != SHT_FINI_ARRAY &&\n            strcmp(sh_name, \".stabstr\")\n            )\n            continue;\n        if (sh->sh_addralign < 1)\n            sh->sh_addralign = 1;\n        /* find corresponding section, if any */\n        for(j = 1; j < s1->nb_sections;j++) {\n            s = s1->sections[j];\n            if (!strcmp(s->name, sh_name)) {\n                if (!strncmp(sh_name, \".gnu.linkonce\", \n                             sizeof(\".gnu.linkonce\") - 1)) {\n                    /* if a 'linkonce' section is already present, we\n                       do not add it again. It is a little tricky as\n                       symbols can still be defined in\n                       it. */\n                    sm_table[i].link_once = 1;\n                    goto next;\n                } else {\n                    goto found;\n                }\n            }\n        }\n        /* not found: create new section */\n        s = new_section(s1, sh_name, sh->sh_type, sh->sh_flags);\n        /* take as much info as possible from the section. sh_link and\n           sh_info will be updated later */\n        s->sh_addralign = sh->sh_addralign;\n        s->sh_entsize = sh->sh_entsize;\n        sm_table[i].new_section = 1;\n    found:\n        if (sh->sh_type != s->sh_type) {\n            tcc_error_noabort(\"invalid section type\");\n            goto fail;\n        }\n\n        /* align start of section */\n        offset = s->data_offset;\n\n        if (0 == strcmp(sh_name, \".stab\")) {\n            stab_index = i;\n            goto no_align;\n        }\n        if (0 == strcmp(sh_name, \".stabstr\")) {\n            stabstr_index = i;\n            goto no_align;\n        }\n\n        size = sh->sh_addralign - 1;\n        offset = (offset + size) & ~size;\n        if (sh->sh_addralign > s->sh_addralign)\n            s->sh_addralign = sh->sh_addralign;\n        s->data_offset = offset;\n    no_align:\n        sm_table[i].offset = offset;\n        sm_table[i].s = s;\n        /* concatenate sections */\n        size = sh->sh_size;\n        if (sh->sh_type != SHT_NOBITS) {\n            unsigned char *ptr;\n            lseek(fd, file_offset + sh->sh_offset, SEEK_SET);\n            ptr = section_ptr_add(s, size);\n            read(fd, ptr, size);\n        } else {\n            s->data_offset += size;\n        }\n    next: ;\n    }\n\n    /* //gr relocate stab strings */\n    if (stab_index && stabstr_index) {\n        Stab_Sym *a, *b;\n        unsigned o;\n        s = sm_table[stab_index].s;\n        a = (Stab_Sym *)(s->data + sm_table[stab_index].offset);\n        b = (Stab_Sym *)(s->data + s->data_offset);\n        o = sm_table[stabstr_index].offset;\n        while (a < b) \n            a->n_strx += o, a++;\n    }\n\n    /* second short pass to update sh_link and sh_info fields of new\n       sections */\n    for(i = 1; i < ehdr.e_shnum; i++) {\n        s = sm_table[i].s;\n        if (!s || !sm_table[i].new_section)\n            continue;\n        sh = &shdr[i];\n        if (sh->sh_link > 0)\n            s->link = sm_table[sh->sh_link].s;\n        if (sh->sh_type == SHT_RELX) {\n            s->sh_info = sm_table[sh->sh_info].s->sh_num;\n            /* update backward link */\n            s1->sections[s->sh_info]->reloc = s;\n        }\n    }\n    sm = sm_table;\n\n    /* resolve symbols */\n    old_to_new_syms = tcc_mallocz(nb_syms * sizeof(int));\n\n    sym = symtab + 1;\n    for(i = 1; i < nb_syms; i++, sym++) {\n        if (sym->st_shndx != SHN_UNDEF &&\n            sym->st_shndx < SHN_LORESERVE) {\n            sm = &sm_table[sym->st_shndx];\n            if (sm->link_once) {\n                /* if a symbol is in a link once section, we use the\n                   already defined symbol. It is very important to get\n                   correct relocations */\n                if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {\n                    name = strtab + sym->st_name;\n                    sym_index = find_elf_sym(symtab_section, name);\n                    if (sym_index)\n                        old_to_new_syms[i] = sym_index;\n                }\n                continue;\n            }\n            /* if no corresponding section added, no need to add symbol */\n            if (!sm->s)\n                continue;\n            /* convert section number */\n            sym->st_shndx = sm->s->sh_num;\n            /* offset value */\n            sym->st_value += sm->offset;\n        }\n        /* add symbol */\n        name = strtab + sym->st_name;\n        sym_index = add_elf_sym(symtab_section, sym->st_value, sym->st_size, \n                                sym->st_info, sym->st_other, \n                                sym->st_shndx, name);\n        old_to_new_syms[i] = sym_index;\n    }\n\n    /* third pass to patch relocation entries */\n    for(i = 1; i < ehdr.e_shnum; i++) {\n        s = sm_table[i].s;\n        if (!s)\n            continue;\n        sh = &shdr[i];\n        offset = sm_table[i].offset;\n        switch(s->sh_type) {\n        case SHT_RELX:\n            /* take relocation offset information */\n            offseti = sm_table[sh->sh_info].offset;\n            rel_end = (ElfW_Rel *)(s->data + s->data_offset);\n            for(rel = (ElfW_Rel *)(s->data + offset);\n                rel < rel_end;\n                rel++) {\n                int type;\n                unsigned sym_index;\n                /* convert symbol index */\n                type = ELFW(R_TYPE)(rel->r_info);\n                sym_index = ELFW(R_SYM)(rel->r_info);\n                /* NOTE: only one symtab assumed */\n                if (sym_index >= nb_syms)\n                    goto invalid_reloc;\n                sym_index = old_to_new_syms[sym_index];\n                /* ignore link_once in rel section. */\n                if (!sym_index && !sm->link_once\n#ifdef TCC_TARGET_ARM\n                    && type != R_ARM_V4BX\n#endif\n                   ) {\n                invalid_reloc:\n                    tcc_error_noabort(\"Invalid relocation entry [%2d] '%s' @ %.8x\",\n                        i, strsec + sh->sh_name, rel->r_offset);\n                    goto fail;\n                }\n                rel->r_info = ELFW(R_INFO)(sym_index, type);\n                /* offset the relocation offset */\n                rel->r_offset += offseti;\n#ifdef TCC_TARGET_ARM\n                /* Jumps and branches from a Thumb code to a PLT entry need\n                   special handling since PLT entries are ARM code.\n                   Unconditional bl instructions referencing PLT entries are\n                   handled by converting these instructions into blx\n                   instructions. Other case of instructions referencing a PLT\n                   entry require to add a Thumb stub before the PLT entry to\n                   switch to ARM mode. We set bit 0 of the got offset of a\n                   symbol to indicate such a case. */\n                if (type == R_ARM_THM_JUMP24)\n                    alloc_sym_attr(s1, sym_index)->plt_thumb_stub = 1;\n#endif\n            }\n            break;\n        default:\n            break;\n        }\n    }\n    \n    ret = 0;\n the_end:\n    tcc_free(symtab);\n    tcc_free(strtab);\n    tcc_free(old_to_new_syms);\n    tcc_free(sm_table);\n    tcc_free(strsec);\n    tcc_free(shdr);\n    return ret;\n}\n\ntypedef struct ArchiveHeader {\n    char ar_name[16];           /* name of this member */\n    char ar_date[12];           /* file mtime */\n    char ar_uid[6];             /* owner uid; printed as decimal */\n    char ar_gid[6];             /* owner gid; printed as decimal */\n    char ar_mode[8];            /* file mode, printed as octal   */\n    char ar_size[10];           /* file size, printed as decimal */\n    char ar_fmag[2];            /* should contain ARFMAG */\n} ArchiveHeader;\n\nstatic int get_be32(const uint8_t *b)\n{\n    return b[3] | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);\n}\n\n/* load only the objects which resolve undefined symbols */\nstatic int tcc_load_alacarte(TCCState *s1, int fd, int size)\n{\n    int i, bound, nsyms, sym_index, off, ret;\n    uint8_t *data;\n    const char *ar_names, *p;\n    const uint8_t *ar_index;\n    ElfW(Sym) *sym;\n\n    data = tcc_malloc(size);\n    if (read(fd, data, size) != size)\n        goto fail;\n    nsyms = get_be32(data);\n    ar_index = data + 4;\n    ar_names = ar_index + nsyms * 4;\n\n    do {\n        bound = 0;\n        for(p = ar_names, i = 0; i < nsyms; i++, p += strlen(p)+1) {\n            sym_index = find_elf_sym(symtab_section, p);\n            if(sym_index) {\n                sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];\n                if(sym->st_shndx == SHN_UNDEF) {\n                    off = get_be32(ar_index + i * 4) + sizeof(ArchiveHeader);\n#if 0\n                    printf(\"%5d\\t%s\\t%08x\\n\", i, p, sym->st_shndx);\n#endif\n                    ++bound;\n                    lseek(fd, off, SEEK_SET);\n                    if(tcc_load_object_file(s1, fd, off) < 0) {\n                    fail:\n                        ret = -1;\n                        goto the_end;\n                    }\n                }\n            }\n        }\n    } while(bound);\n    ret = 0;\n the_end:\n    tcc_free(data);\n    return ret;\n}\n\n/* load a '.a' file */\nST_FUNC int tcc_load_archive(TCCState *s1, int fd)\n{\n    ArchiveHeader hdr;\n    char ar_size[11];\n    char ar_name[17];\n    char magic[8];\n    int size, len, i;\n    unsigned long file_offset;\n\n    /* skip magic which was already checked */\n    read(fd, magic, sizeof(magic));\n    \n    for(;;) {\n        len = read(fd, &hdr, sizeof(hdr));\n        if (len == 0)\n            break;\n        if (len != sizeof(hdr)) {\n            tcc_error_noabort(\"invalid archive\");\n            return -1;\n        }\n        memcpy(ar_size, hdr.ar_size, sizeof(hdr.ar_size));\n        ar_size[sizeof(hdr.ar_size)] = '\\0';\n        size = strtol(ar_size, NULL, 0);\n        memcpy(ar_name, hdr.ar_name, sizeof(hdr.ar_name));\n        for(i = sizeof(hdr.ar_name) - 1; i >= 0; i--) {\n            if (ar_name[i] != ' ')\n                break;\n        }\n        ar_name[i + 1] = '\\0';\n        //        printf(\"name='%s' size=%d %s\\n\", ar_name, size, ar_size);\n        file_offset = lseek(fd, 0, SEEK_CUR);\n        /* align to even */\n        size = (size + 1) & ~1;\n        if (!strcmp(ar_name, \"/\")) {\n            /* coff symbol table : we handle it */\n            if(s1->alacarte_link)\n                return tcc_load_alacarte(s1, fd, size);\n        } else if (!strcmp(ar_name, \"//\") ||\n                   !strcmp(ar_name, \"__.SYMDEF\") ||\n                   !strcmp(ar_name, \"__.SYMDEF/\") ||\n                   !strcmp(ar_name, \"ARFILENAMES/\")) {\n            /* skip symbol table or archive names */\n        } else {\n            if (tcc_load_object_file(s1, fd, file_offset) < 0)\n                return -1;\n        }\n        lseek(fd, file_offset + size, SEEK_SET);\n    }\n    return 0;\n}\n\n#ifndef TCC_TARGET_PE\n/* load a DLL and all referenced DLLs. 'level = 0' means that the DLL\n   is referenced by the user (so it should be added as DT_NEEDED in\n   the generated ELF file) */\nST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level)\n{ \n    ElfW(Ehdr) ehdr;\n    ElfW(Shdr) *shdr, *sh, *sh1;\n    int i, j, nb_syms, nb_dts, sym_bind, ret;\n    ElfW(Sym) *sym, *dynsym;\n    ElfW(Dyn) *dt, *dynamic;\n    unsigned char *dynstr;\n    const char *name, *soname;\n    DLLReference *dllref;\n    \n    read(fd, &ehdr, sizeof(ehdr));\n\n    /* test CPU specific stuff */\n    if (ehdr.e_ident[5] != ELFDATA2LSB ||\n        ehdr.e_machine != EM_TCC_TARGET) {\n        tcc_error_noabort(\"bad architecture\");\n        return -1;\n    }\n\n    /* read sections */\n    shdr = load_data(fd, ehdr.e_shoff, sizeof(ElfW(Shdr)) * ehdr.e_shnum);\n\n    /* load dynamic section and dynamic symbols */\n    nb_syms = 0;\n    nb_dts = 0;\n    dynamic = NULL;\n    dynsym = NULL; /* avoid warning */\n    dynstr = NULL; /* avoid warning */\n    for(i = 0, sh = shdr; i < ehdr.e_shnum; i++, sh++) {\n        switch(sh->sh_type) {\n        case SHT_DYNAMIC:\n            nb_dts = sh->sh_size / sizeof(ElfW(Dyn));\n            dynamic = load_data(fd, sh->sh_offset, sh->sh_size);\n            break;\n        case SHT_DYNSYM:\n            nb_syms = sh->sh_size / sizeof(ElfW(Sym));\n            dynsym = load_data(fd, sh->sh_offset, sh->sh_size);\n            sh1 = &shdr[sh->sh_link];\n            dynstr = load_data(fd, sh1->sh_offset, sh1->sh_size);\n            break;\n        default:\n            break;\n        }\n    }\n    \n    /* compute the real library name */\n    soname = tcc_basename(filename);\n        \n    for(i = 0, dt = dynamic; i < nb_dts; i++, dt++) {\n        if (dt->d_tag == DT_SONAME) {\n            soname = dynstr + dt->d_un.d_val;\n        }\n    }\n\n    /* if the dll is already loaded, do not load it */\n    for(i = 0; i < s1->nb_loaded_dlls; i++) {\n        dllref = s1->loaded_dlls[i];\n        if (!strcmp(soname, dllref->name)) {\n            /* but update level if needed */\n            if (level < dllref->level)\n                dllref->level = level;\n            ret = 0;\n            goto the_end;\n        }\n    }\n    \n    //    printf(\"loading dll '%s'\\n\", soname);\n\n    /* add the dll and its level */\n    dllref = tcc_mallocz(sizeof(DLLReference) + strlen(soname));\n    dllref->level = level;\n    strcpy(dllref->name, soname);\n    dynarray_add((void ***)&s1->loaded_dlls, &s1->nb_loaded_dlls, dllref);\n\n    /* add dynamic symbols in dynsym_section */\n    for(i = 1, sym = dynsym + 1; i < nb_syms; i++, sym++) {\n        sym_bind = ELFW(ST_BIND)(sym->st_info);\n        if (sym_bind == STB_LOCAL)\n            continue;\n        name = dynstr + sym->st_name;\n        add_elf_sym(s1->dynsymtab_section, sym->st_value, sym->st_size,\n                    sym->st_info, sym->st_other, sym->st_shndx, name);\n    }\n\n    /* load all referenced DLLs */\n    for(i = 0, dt = dynamic; i < nb_dts; i++, dt++) {\n        switch(dt->d_tag) {\n        case DT_NEEDED:\n            name = dynstr + dt->d_un.d_val;\n            for(j = 0; j < s1->nb_loaded_dlls; j++) {\n                dllref = s1->loaded_dlls[j];\n                if (!strcmp(name, dllref->name))\n                    goto already_loaded;\n            }\n            if (tcc_add_dll(s1, name, AFF_REFERENCED_DLL) < 0) {\n                tcc_error_noabort(\"referenced dll '%s' not found\", name);\n                ret = -1;\n                goto the_end;\n            }\n        already_loaded:\n            break;\n        }\n    }\n    ret = 0;\n the_end:\n    tcc_free(dynstr);\n    tcc_free(dynsym);\n    tcc_free(dynamic);\n    tcc_free(shdr);\n    return ret;\n}\n\n#define LD_TOK_NAME 256\n#define LD_TOK_EOF  (-1)\n\n/* return next ld script token */\nstatic int ld_next(TCCState *s1, char *name, int name_size)\n{\n    int c;\n    char *q;\n\n redo:\n    switch(ch) {\n    case ' ':\n    case '\\t':\n    case '\\f':\n    case '\\v':\n    case '\\r':\n    case '\\n':\n        inp();\n        goto redo;\n    case '/':\n        minp();\n        if (ch == '*') {\n            file->buf_ptr = parse_comment(file->buf_ptr);\n            ch = file->buf_ptr[0];\n            goto redo;\n        } else {\n            q = name;\n            *q++ = '/';\n            goto parse_name;\n        }\n        break;\n    /* case 'a' ... 'z': */\n    case 'a':\n       case 'b':\n       case 'c':\n       case 'd':\n       case 'e':\n       case 'f':\n       case 'g':\n       case 'h':\n       case 'i':\n       case 'j':\n       case 'k':\n       case 'l':\n       case 'm':\n       case 'n':\n       case 'o':\n       case 'p':\n       case 'q':\n       case 'r':\n       case 's':\n       case 't':\n       case 'u':\n       case 'v':\n       case 'w':\n       case 'x':\n       case 'y':\n       case 'z':\n    /* case 'A' ... 'z': */\n    case 'A':\n       case 'B':\n       case 'C':\n       case 'D':\n       case 'E':\n       case 'F':\n       case 'G':\n       case 'H':\n       case 'I':\n       case 'J':\n       case 'K':\n       case 'L':\n       case 'M':\n       case 'N':\n       case 'O':\n       case 'P':\n       case 'Q':\n       case 'R':\n       case 'S':\n       case 'T':\n       case 'U':\n       case 'V':\n       case 'W':\n       case 'X':\n       case 'Y':\n       case 'Z':\n    case '_':\n    case '\\\\':\n    case '.':\n    case '$':\n    case '~':\n        q = name;\n    parse_name:\n        for(;;) {\n            if (!((ch >= 'a' && ch <= 'z') ||\n                  (ch >= 'A' && ch <= 'Z') ||\n                  (ch >= '0' && ch <= '9') ||\n                  strchr(\"/.-_+=$:\\\\,~\", ch)))\n                break;\n            if ((q - name) < name_size - 1) {\n                *q++ = ch;\n            }\n            minp();\n        }\n        *q = '\\0';\n        c = LD_TOK_NAME;\n        break;\n    case CH_EOF:\n        c = LD_TOK_EOF;\n        break;\n    default:\n        c = ch;\n        inp();\n        break;\n    }\n#if 0\n    printf(\"tok=%c %d\\n\", c, c);\n    if (c == LD_TOK_NAME)\n        printf(\"  name=%s\\n\", name);\n#endif\n    return c;\n}\n\nstatic int ld_add_file(TCCState *s1, const char filename[])\n{\n    int ret;\n\n    ret = tcc_add_file_internal(s1, filename, 0);\n    if (ret)\n        ret = tcc_add_dll(s1, filename, 0);\n    return ret;\n}\n\nstatic inline int new_undef_syms(void)\n{\n    int ret = 0;\n    ret = new_undef_sym;\n    new_undef_sym = 0;\n    return ret;\n}\n\nstatic int ld_add_file_list(TCCState *s1, const char *cmd, int as_needed)\n{\n    char filename[1024], libname[1024];\n    int t, group, nblibs = 0, ret = 0;\n    char **libs = NULL;\n\n    group = !strcmp(cmd, \"GROUP\");\n    if (!as_needed)\n        new_undef_syms();\n    t = ld_next(s1, filename, sizeof(filename));\n    if (t != '(')\n        expect(\"(\");\n    t = ld_next(s1, filename, sizeof(filename));\n    for(;;) {\n        libname[0] = '\\0';\n        if (t == LD_TOK_EOF) {\n            tcc_error_noabort(\"unexpected end of file\");\n            ret = -1;\n            goto lib_parse_error;\n        } else if (t == ')') {\n            break;\n        } else if (t == '-') {\n            t = ld_next(s1, filename, sizeof(filename));\n            if ((t != LD_TOK_NAME) || (filename[0] != 'l')) {\n                tcc_error_noabort(\"library name expected\");\n                ret = -1;\n                goto lib_parse_error;\n            }\n            pstrcpy(libname, sizeof libname, &filename[1]);\n            if (s1->static_link) {\n                snprintf(filename, sizeof filename, \"lib%s.a\", libname);\n            } else {\n                snprintf(filename, sizeof filename, \"lib%s.so\", libname);\n            }\n        } else if (t != LD_TOK_NAME) {\n            tcc_error_noabort(\"filename expected\");\n            ret = -1;\n            goto lib_parse_error;\n        }\n        if (!strcmp(filename, \"AS_NEEDED\")) {\n            ret = ld_add_file_list(s1, cmd, 1);\n            if (ret)\n                goto lib_parse_error;\n        } else {\n            /* TODO: Implement AS_NEEDED support. Ignore it for now */\n            if (!as_needed) {\n                ret = ld_add_file(s1, filename);\n                if (ret)\n                    goto lib_parse_error;\n                if (group) {\n                    /* Add the filename *and* the libname to avoid future conversions */\n                    dynarray_add((void ***) &libs, &nblibs, tcc_strdup(filename));\n                    if (libname[0] != '\\0')\n                        dynarray_add((void ***) &libs, &nblibs, tcc_strdup(libname));\n                }\n            }\n        }\n        t = ld_next(s1, filename, sizeof(filename));\n        if (t == ',') {\n            t = ld_next(s1, filename, sizeof(filename));\n        }\n    }\n    if (group && !as_needed) {\n        while (new_undef_syms()) {\n            int i;\n\n            for (i = 0; i < nblibs; i ++)\n                ld_add_file(s1, libs[i]);\n        }\n    }\nlib_parse_error:\n    dynarray_reset(&libs, &nblibs);\n    return ret;\n}\n\n/* interpret a subset of GNU ldscripts to handle the dummy libc.so\n   files */\nST_FUNC int tcc_load_ldscript(TCCState *s1)\n{\n    char cmd[64];\n    char filename[1024];\n    int t, ret;\n    \n    ch = file->buf_ptr[0];\n    ch = handle_eob();\n    for(;;) {\n        t = ld_next(s1, cmd, sizeof(cmd));\n        if (t == LD_TOK_EOF)\n            return 0;\n        else if (t != LD_TOK_NAME)\n            return -1;\n        if (!strcmp(cmd, \"INPUT\") ||\n            !strcmp(cmd, \"GROUP\")) {\n            ret = ld_add_file_list(s1, cmd, 0);\n            if (ret)\n                return ret;\n        } else if (!strcmp(cmd, \"OUTPUT_FORMAT\") ||\n                   !strcmp(cmd, \"TARGET\")) {\n            /* ignore some commands */\n            t = ld_next(s1, cmd, sizeof(cmd));\n            if (t != '(')\n                expect(\"(\");\n            for(;;) {\n                t = ld_next(s1, filename, sizeof(filename));\n                if (t == LD_TOK_EOF) {\n                    tcc_error_noabort(\"unexpected end of file\");\n                    return -1;\n                } else if (t == ')') {\n                    break;\n                }\n            }\n        } else {\n            return -1;\n        }\n    }\n    return 0;\n}\n#endif /* ndef TCC_TARGET_PE */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tccgen.c",
    "content": "/*\n *  TCC - Tiny C Compiler\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\n/********************************************************/\n/* global variables */\n\n/* loc : local variable index\n   ind : output code index\n   rsym: return symbol\n   anon_sym: anonymous symbol index\n*/\nST_DATA int rsym, anon_sym, ind, loc;\n\nST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */\nST_DATA Section *cur_text_section; /* current section where function code is generated */\n#ifdef CONFIG_TCC_ASM\nST_DATA Section *last_text_section; /* to handle .previous asm directive */\n#endif\n#ifdef CONFIG_TCC_BCHECK\n/* bound check related sections */\nST_DATA Section *bounds_section; /* contains global data bound description */\nST_DATA Section *lbounds_section; /* contains local data bound description */\n#endif\n/* symbol sections */\nST_DATA Section *symtab_section, *strtab_section;\n/* debug sections */\nST_DATA Section *stab_section, *stabstr_section;\nST_DATA Sym *sym_free_first;\nST_DATA void **sym_pools;\nST_DATA int nb_sym_pools;\n\nST_DATA Sym *global_stack;\nST_DATA Sym *local_stack;\nST_DATA Sym *scope_stack_bottom;\nST_DATA Sym *define_stack;\nST_DATA Sym *global_label_stack;\nST_DATA Sym *local_label_stack;\n\nST_DATA SValue __vstack[1+VSTACK_SIZE], *vtop;\n\nST_DATA int const_wanted; /* true if constant wanted */\nST_DATA int nocode_wanted; /* true if no code generation wanted for an expression */\nST_DATA int global_expr;  /* true if compound literals must be allocated globally (used during initializers parsing */\nST_DATA CType func_vt; /* current function return type (used by return instruction) */\nST_DATA int func_vc;\nST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */\nST_DATA char *funcname;\n\nST_DATA CType char_pointer_type, func_old_type, int_type, size_type;\n\n/* ------------------------------------------------------------------------- */\nstatic void gen_cast(CType *type);\nstatic inline CType *pointed_type(CType *type);\nstatic int is_compatible_types(CType *type1, CType *type2);\nstatic int parse_btype(CType *type, AttributeDef *ad);\nstatic void type_decl(CType *type, AttributeDef *ad, int *v, int td);\nstatic void parse_expr_type(CType *type);\nstatic void decl_initializer(CType *type, Section *sec, unsigned long c, int first, int size_only);\nstatic void block(int *bsym, int *csym, int *case_sym, int *def_sym, int case_reg, int is_expr);\nstatic void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, int has_init, int v, char *asm_label, int scope);\nstatic int decl0(int l, int is_for_loop_init);\nstatic void expr_eq(void);\nstatic void unary_type(CType *type);\nstatic void vla_runtime_type_size(CType *type, int *a);\nstatic int is_compatible_parameter_types(CType *type1, CType *type2);\nstatic void expr_type(CType *type);\n\nST_INLN int is_float(int t)\n{\n    int bt;\n    bt = t & VT_BTYPE;\n    return bt == VT_LDOUBLE || bt == VT_DOUBLE || bt == VT_FLOAT;\n}\n\n/* we use our own 'finite' function to avoid potential problems with\n   non standard math libs */\n/* XXX: endianness dependent */\nST_FUNC int ieee_finite(double d)\n{\n    int *p = (int *)&d;\n    return ((unsigned)((p[1] | 0x800fffff) + 1)) >> 31;\n}\n\nST_FUNC void test_lvalue(void)\n{\n    if (!(vtop->r & VT_LVAL))\n        expect(\"lvalue\");\n}\n\n/* ------------------------------------------------------------------------- */\n/* symbol allocator */\nstatic Sym *__sym_malloc(void)\n{\n    Sym *sym_pool, *sym, *last_sym;\n    int i;\n\n    sym_pool = tcc_malloc(SYM_POOL_NB * sizeof(Sym));\n    dynarray_add(&sym_pools, &nb_sym_pools, sym_pool);\n\n    last_sym = sym_free_first;\n    sym = sym_pool;\n    for(i = 0; i < SYM_POOL_NB; i++) {\n        sym->next = last_sym;\n        last_sym = sym;\n        sym++;\n    }\n    sym_free_first = last_sym;\n    return last_sym;\n}\n\nstatic inline Sym *sym_malloc(void)\n{\n    Sym *sym;\n    sym = sym_free_first;\n    if (!sym)\n        sym = __sym_malloc();\n    sym_free_first = sym->next;\n    return sym;\n}\n\nST_INLN void sym_free(Sym *sym)\n{\n    sym->next = sym_free_first;\n    tcc_free(sym->asm_label);\n    sym_free_first = sym;\n}\n\n/* push, without hashing */\nST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c)\n{\n    Sym *s;\n    if (ps == &local_stack) {\n        for (s = *ps; s && s != scope_stack_bottom; s = s->prev)\n            if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM && s->v == v)\n                tcc_error(\"incompatible types for redefinition of '%s'\",\n                          get_tok_str(v, NULL));\n    }\n    s = *ps;\n    s = sym_malloc();\n    s->asm_label = NULL;\n    s->v = v;\n    s->type.t = t;\n    s->type.ref = NULL;\n#ifdef _WIN64\n    s->d = NULL;\n#endif\n    s->c = c;\n    s->next = NULL;\n    /* add in stack */\n    s->prev = *ps;\n    *ps = s;\n    return s;\n}\n\n/* find a symbol and return its associated structure. 's' is the top\n   of the symbol stack */\nST_FUNC Sym *sym_find2(Sym *s, int v)\n{\n    while (s) {\n        if (s->v == v)\n            return s;\n        s = s->prev;\n    }\n    return NULL;\n}\n\n/* structure lookup */\nST_INLN Sym *struct_find(int v)\n{\n    v -= TOK_IDENT;\n    if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))\n        return NULL;\n    return table_ident[v]->sym_struct;\n}\n\n/* find an identifier */\nST_INLN Sym *sym_find(int v)\n{\n    v -= TOK_IDENT;\n    if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))\n        return NULL;\n    return table_ident[v]->sym_identifier;\n}\n\n/* push a given symbol on the symbol stack */\nST_FUNC Sym *sym_push(int v, CType *type, int r, int c)\n{\n    Sym *s, **ps;\n    TokenSym *ts;\n\n    if (local_stack)\n        ps = &local_stack;\n    else\n        ps = &global_stack;\n    s = sym_push2(ps, v, type->t, c);\n    s->type.ref = type->ref;\n    s->r = r;\n    /* don't record fields or anonymous symbols */\n    /* XXX: simplify */\n    if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM) {\n        /* record symbol in token array */\n        ts = table_ident[(v & ~SYM_STRUCT) - TOK_IDENT];\n        if (v & SYM_STRUCT)\n            ps = &ts->sym_struct;\n        else\n            ps = &ts->sym_identifier;\n        s->prev_tok = *ps;\n        *ps = s;\n    }\n    return s;\n}\n\n/* push a global identifier */\nST_FUNC Sym *global_identifier_push(int v, int t, int c)\n{\n    Sym *s, **ps;\n    s = sym_push2(&global_stack, v, t, c);\n    /* don't record anonymous symbol */\n    if (v < SYM_FIRST_ANOM) {\n        ps = &table_ident[v - TOK_IDENT]->sym_identifier;\n        /* modify the top most local identifier, so that\n           sym_identifier will point to 's' when popped */\n        while (*ps != NULL)\n            ps = &(*ps)->prev_tok;\n        s->prev_tok = NULL;\n        *ps = s;\n    }\n    return s;\n}\n\n/* pop symbols until top reaches 'b' */\nST_FUNC void sym_pop(Sym **ptop, Sym *b)\n{\n    Sym *s, *ss, **ps;\n    TokenSym *ts;\n    int v;\n\n    s = *ptop;\n    while(s != b) {\n        ss = s->prev;\n        v = s->v;\n        /* remove symbol in token array */\n        /* XXX: simplify */\n        if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM) {\n            ts = table_ident[(v & ~SYM_STRUCT) - TOK_IDENT];\n            if (v & SYM_STRUCT)\n                ps = &ts->sym_struct;\n            else\n                ps = &ts->sym_identifier;\n            *ps = s->prev_tok;\n        }\n        sym_free(s);\n        s = ss;\n    }\n    *ptop = b;\n}\n\nstatic void weaken_symbol(Sym *sym)\n{\n    sym->type.t |= VT_WEAK;\n    if (sym->c > 0) {\n        int esym_type;\n        ElfW(Sym) *esym;\n        \n        esym = &((ElfW(Sym) *)symtab_section->data)[sym->c];\n        esym_type = ELFW(ST_TYPE)(esym->st_info);\n        esym->st_info = ELFW(ST_INFO)(STB_WEAK, esym_type);\n    }\n}\n\n/* ------------------------------------------------------------------------- */\n\nST_FUNC void swap(int *p, int *q)\n{\n    int t;\n    t = *p;\n    *p = *q;\n    *q = t;\n}\n\nstatic void vsetc(CType *type, int r, CValue *vc)\n{\n    int v;\n\n    if (vtop >= vstack + (VSTACK_SIZE - 1))\n        tcc_error(\"memory full\");\n    /* cannot let cpu flags if other instruction are generated. Also\n       avoid leaving VT_JMP anywhere except on the top of the stack\n       because it would complicate the code generator. */\n    if (vtop >= vstack) {\n        v = vtop->r & VT_VALMASK;\n        if (v == VT_CMP || (v & ~1) == VT_JMP)\n            gv(RC_INT);\n    }\n    vtop++;\n    vtop->type = *type;\n    vtop->r = r;\n    vtop->r2 = VT_CONST;\n    vtop->c = *vc;\n}\n\n/* push constant of type \"type\" with useless value */\nvoid vpush(CType *type)\n{\n    CValue cval;\n    vsetc(type, VT_CONST, &cval);\n}\n\n/* push integer constant */\nST_FUNC void vpushi(int v)\n{\n    CValue cval;\n    cval.i = v;\n    vsetc(&int_type, VT_CONST, &cval);\n}\n\n/* push a pointer sized constant */\nstatic void vpushs(long long v)\n{\n  CValue cval;\n  if (PTR_SIZE == 4)\n    cval.i = (int)v;\n  else\n    cval.ull = v;\n  vsetc(&size_type, VT_CONST, &cval);\n}\n\n/* push arbitrary 64bit constant */\nvoid vpush64(int ty, unsigned long long v)\n{\n    CValue cval;\n    CType ctype;\n    ctype.t = ty;\n    ctype.ref = NULL;\n    cval.ull = v;\n    vsetc(&ctype, VT_CONST, &cval);\n}\n\n/* push long long constant */\nstatic inline void vpushll(long long v)\n{\n    vpush64(VT_LLONG, v);\n}\n\n/* Return a static symbol pointing to a section */\nST_FUNC Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size)\n{\n    int v;\n    Sym *sym;\n\n    v = anon_sym++;\n    sym = global_identifier_push(v, type->t | VT_STATIC, 0);\n    sym->type.ref = type->ref;\n    sym->r = VT_CONST | VT_SYM;\n    put_extern_sym(sym, sec, offset, size);\n    return sym;\n}\n\n/* push a reference to a section offset by adding a dummy symbol */\nstatic void vpush_ref(CType *type, Section *sec, unsigned long offset, unsigned long size)\n{\n    CValue cval;\n\n    cval.ul = 0;\n    vsetc(type, VT_CONST | VT_SYM, &cval);\n    vtop->sym = get_sym_ref(type, sec, offset, size);\n}\n\n/* define a new external reference to a symbol 'v' of type 'u' */\nST_FUNC Sym *external_global_sym(int v, CType *type, int r)\n{\n    Sym *s;\n\n    s = sym_find(v);\n    if (!s) {\n        /* push forward reference */\n        s = global_identifier_push(v, type->t | VT_EXTERN, 0);\n        s->type.ref = type->ref;\n        s->r = r | VT_CONST | VT_SYM;\n    }\n    return s;\n}\n\n/* define a new external reference to a symbol 'v' with alternate asm\n   name 'asm_label' of type 'u'. 'asm_label' is equal to NULL if there\n   is no alternate name (most cases) */\nstatic Sym *external_sym(int v, CType *type, int r, char *asm_label)\n{\n    Sym *s;\n\n    s = sym_find(v);\n    if (!s) {\n        /* push forward reference */\n        s = sym_push(v, type, r | VT_CONST | VT_SYM, 0);\n        s->asm_label = asm_label;\n        s->type.t |= VT_EXTERN;\n    } else if (s->type.ref == func_old_type.ref) {\n        s->type.ref = type->ref;\n        s->r = r | VT_CONST | VT_SYM;\n        s->type.t |= VT_EXTERN;\n    } else if (!is_compatible_types(&s->type, type)) {\n        tcc_error(\"incompatible types for redefinition of '%s'\", \n              get_tok_str(v, NULL));\n    }\n    return s;\n}\n\n/* push a reference to global symbol v */\nST_FUNC void vpush_global_sym(CType *type, int v)\n{\n    Sym *sym;\n    CValue cval;\n\n    sym = external_global_sym(v, type, 0);\n    cval.ul = 0;\n    vsetc(type, VT_CONST | VT_SYM, &cval);\n    vtop->sym = sym;\n}\n\nST_FUNC void vset(CType *type, int r, int v)\n{\n    CValue cval;\n\n    cval.i = v;\n    vsetc(type, r, &cval);\n}\n\nstatic void vseti(int r, int v)\n{\n    CType type;\n    type.t = VT_INT;\n    type.ref = 0;\n    vset(&type, r, v);\n}\n\nST_FUNC void vswap(void)\n{\n    SValue tmp;\n    /* cannot let cpu flags if other instruction are generated. Also\n       avoid leaving VT_JMP anywhere except on the top of the stack\n       because it would complicate the code generator. */\n    if (vtop >= vstack) {\n        int v = vtop->r & VT_VALMASK;\n        if (v == VT_CMP || (v & ~1) == VT_JMP)\n            gv(RC_INT);\n    }\n    tmp = vtop[0];\n    vtop[0] = vtop[-1];\n    vtop[-1] = tmp;\n\n/* XXX: +2% overall speed possible with optimized memswap\n *\n *  memswap(&vtop[0], &vtop[1], sizeof *vtop);\n */\n}\n\nST_FUNC void vpushv(SValue *v)\n{\n    if (vtop >= vstack + (VSTACK_SIZE - 1))\n        tcc_error(\"memory full\");\n    vtop++;\n    *vtop = *v;\n}\n\nstatic void vdup(void)\n{\n    vpushv(vtop);\n}\n\n/* save r to the memory stack, and mark it as being free */\nST_FUNC void save_reg(int r)\n{\n    int l, saved, size, align;\n    SValue *p, sv;\n    CType *type;\n\n    /* modify all stack values */\n    saved = 0;\n    l = 0;\n    for(p=vstack;p<=vtop;p++) {\n        if ((p->r & VT_VALMASK) == r ||\n            ((p->type.t & VT_BTYPE) == VT_LLONG && (p->r2 & VT_VALMASK) == r)) {\n            /* must save value on stack if not already done */\n            if (!saved) {\n                /* NOTE: must reload 'r' because r might be equal to r2 */\n                r = p->r & VT_VALMASK;\n                /* store register in the stack */\n                type = &p->type;\n                if ((p->r & VT_LVAL) ||\n                    (!is_float(type->t) && (type->t & VT_BTYPE) != VT_LLONG))\n#ifdef TCC_TARGET_X86_64\n                    type = &char_pointer_type;\n#else\n                    type = &int_type;\n#endif\n                size = type_size(type, &align);\n                loc = (loc - size) & -align;\n                sv.type.t = type->t;\n                sv.r = VT_LOCAL | VT_LVAL;\n                sv.c.ul = loc;\n                store(r, &sv);\n#if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)\n                /* x86 specific: need to pop fp register ST0 if saved */\n                if (r == TREG_ST0) {\n                    o(0xd8dd); /* fstp %st(0) */\n                }\n#endif\n#ifndef TCC_TARGET_X86_64\n                /* special long long case */\n                if ((type->t & VT_BTYPE) == VT_LLONG) {\n                    sv.c.ul += 4;\n                    store(p->r2, &sv);\n                }\n#endif\n                l = loc;\n                saved = 1;\n            }\n            /* mark that stack entry as being saved on the stack */\n            if (p->r & VT_LVAL) {\n                /* also clear the bounded flag because the\n                   relocation address of the function was stored in\n                   p->c.ul */\n                p->r = (p->r & ~(VT_VALMASK | VT_BOUNDED)) | VT_LLOCAL;\n            } else {\n                p->r = lvalue_type(p->type.t) | VT_LOCAL;\n            }\n            p->r2 = VT_CONST;\n            p->c.ul = l;\n        }\n    }\n}\n\n#ifdef TCC_TARGET_ARM\n/* find a register of class 'rc2' with at most one reference on stack.\n * If none, call get_reg(rc) */\nST_FUNC int get_reg_ex(int rc, int rc2)\n{\n    int r;\n    SValue *p;\n    \n    for(r=0;r<NB_REGS;r++) {\n        if (reg_classes[r] & rc2) {\n            int n;\n            n=0;\n            for(p = vstack; p <= vtop; p++) {\n                if ((p->r & VT_VALMASK) == r ||\n                    (p->r2 & VT_VALMASK) == r)\n                    n++;\n            }\n            if (n <= 1)\n                return r;\n        }\n    }\n    return get_reg(rc);\n}\n#endif\n\n/* find a free register of class 'rc'. If none, save one register */\nST_FUNC int get_reg(int rc)\n{\n    int r;\n    SValue *p;\n\n    /* find a free register */\n    for(r=0;r<NB_REGS;r++) {\n        if (reg_classes[r] & rc) {\n            for(p=vstack;p<=vtop;p++) {\n                if ((p->r & VT_VALMASK) == r ||\n                    (p->r2 & VT_VALMASK) == r)\n                    goto notfound;\n            }\n            return r;\n        }\n    notfound: ;\n    }\n    \n    /* no register left : free the first one on the stack (VERY\n       IMPORTANT to start from the bottom to ensure that we don't\n       spill registers used in gen_opi()) */\n    for(p=vstack;p<=vtop;p++) {\n        /* look at second register (if long long) */\n        r = p->r2 & VT_VALMASK;\n        if (r < VT_CONST && (reg_classes[r] & rc))\n            goto save_found;\n        r = p->r & VT_VALMASK;\n        if (r < VT_CONST && (reg_classes[r] & rc)) {\n        save_found:\n            save_reg(r);\n            return r;\n        }\n    }\n    /* Should never comes here */\n    return -1;\n}\n\n/* save registers up to (vtop - n) stack entry */\nST_FUNC void save_regs(int n)\n{\n    int r;\n    SValue *p, *p1;\n    p1 = vtop - n;\n    for(p = vstack;p <= p1; p++) {\n        r = p->r & VT_VALMASK;\n        if (r < VT_CONST) {\n            save_reg(r);\n        }\n    }\n}\n\n/* move register 's' to 'r', and flush previous value of r to memory\n   if needed */\nstatic void move_reg(int r, int s)\n{\n    SValue sv;\n\n    if (r != s) {\n        save_reg(r);\n        sv.type.t = VT_INT;\n        sv.r = s;\n        sv.c.ul = 0;\n        load(r, &sv);\n    }\n}\n\n/* get address of vtop (vtop MUST BE an lvalue) */\nstatic void gaddrof(void)\n{\n    if (vtop->r & VT_REF)\n        gv(RC_INT);\n    vtop->r &= ~VT_LVAL;\n    /* tricky: if saved lvalue, then we can go back to lvalue */\n    if ((vtop->r & VT_VALMASK) == VT_LLOCAL)\n        vtop->r = (vtop->r & ~(VT_VALMASK | VT_LVAL_TYPE)) | VT_LOCAL | VT_LVAL;\n\n\n}\n\n#ifdef CONFIG_TCC_BCHECK\n/* generate lvalue bound code */\nstatic void gbound(void)\n{\n    int lval_type;\n    CType type1;\n\n    vtop->r &= ~VT_MUSTBOUND;\n    /* if lvalue, then use checking code before dereferencing */\n    if (vtop->r & VT_LVAL) {\n        /* if not VT_BOUNDED value, then make one */\n        if (!(vtop->r & VT_BOUNDED)) {\n            lval_type = vtop->r & (VT_LVAL_TYPE | VT_LVAL);\n            /* must save type because we must set it to int to get pointer */\n            type1 = vtop->type;\n            vtop->type.t = VT_INT;\n            gaddrof();\n            vpushi(0);\n            gen_bounded_ptr_add();\n            vtop->r |= lval_type;\n            vtop->type = type1;\n        }\n        /* then check for dereferencing */\n        gen_bounded_ptr_deref();\n    }\n}\n#endif\n\n/* store vtop a register belonging to class 'rc'. lvalues are\n   converted to values. Cannot be used if cannot be converted to\n   register value (such as structures). */\nST_FUNC int gv(int rc)\n{\n    int r, bit_pos, bit_size, size, align, i;\n#ifndef TCC_TARGET_X86_64\n    int rc2;\n#endif\n\n    /* NOTE: get_reg can modify vstack[] */\n    if (vtop->type.t & VT_BITFIELD) {\n        CType type;\n        int bits = 32;\n        bit_pos = (vtop->type.t >> VT_STRUCT_SHIFT) & 0x3f;\n        bit_size = (vtop->type.t >> (VT_STRUCT_SHIFT + 6)) & 0x3f;\n        /* remove bit field info to avoid loops */\n        vtop->type.t &= ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));\n        /* cast to int to propagate signedness in following ops */\n        if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {\n            type.t = VT_LLONG;\n            bits = 64;\n        } else\n            type.t = VT_INT;\n        if((vtop->type.t & VT_UNSIGNED) ||\n           (vtop->type.t & VT_BTYPE) == VT_BOOL)\n            type.t |= VT_UNSIGNED;\n        gen_cast(&type);\n        /* generate shifts */\n        vpushi(bits - (bit_pos + bit_size));\n        gen_op(TOK_SHL);\n        vpushi(bits - bit_size);\n        /* NOTE: transformed to SHR if unsigned */\n        gen_op(TOK_SAR);\n        r = gv(rc);\n    } else {\n        if (is_float(vtop->type.t) && \n            (vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n            Sym *sym;\n            int *ptr;\n            unsigned long offset;\n#if defined(TCC_TARGET_ARM) && !defined(TCC_ARM_VFP)\n            CValue check;\n#endif\n            \n            /* XXX: unify with initializers handling ? */\n            /* CPUs usually cannot use float constants, so we store them\n               generically in data segment */\n            size = type_size(&vtop->type, &align);\n            offset = (data_section->data_offset + align - 1) & -align;\n            data_section->data_offset = offset;\n            /* XXX: not portable yet */\n#if defined(__i386__) || defined(__x86_64__)\n            /* Zero pad x87 tenbyte long doubles */\n            if (size == LDOUBLE_SIZE) {\n                vtop->c.tab[2] &= 0xffff;\n#if LDOUBLE_SIZE == 16\n                vtop->c.tab[3] = 0;\n#endif\n            }\n#endif\n            ptr = section_ptr_add(data_section, size);\n            size = size >> 2;\n#if defined(TCC_TARGET_ARM) && !defined(TCC_ARM_VFP)\n            check.d = 1;\n            if(check.tab[0])\n                for(i=0;i<size;i++)\n                    ptr[i] = vtop->c.tab[size-1-i];\n            else\n#endif\n            for(i=0;i<size;i++)\n                ptr[i] = vtop->c.tab[i];\n            sym = get_sym_ref(&vtop->type, data_section, offset, size << 2);\n            vtop->r |= VT_LVAL | VT_SYM;\n            vtop->sym = sym;\n            vtop->c.ul = 0;\n        }\n#ifdef CONFIG_TCC_BCHECK\n        if (vtop->r & VT_MUSTBOUND) \n            gbound();\n#endif\n\n        r = vtop->r & VT_VALMASK;\n#ifndef TCC_TARGET_X86_64\n        rc2 = RC_INT;\n        if (rc == RC_IRET)\n            rc2 = RC_LRET;\n#endif\n        /* need to reload if:\n           - constant\n           - lvalue (need to dereference pointer)\n           - already a register, but not in the right class */\n        if (r >= VT_CONST\n         || (vtop->r & VT_LVAL)\n         || !(reg_classes[r] & rc)\n#ifndef TCC_TARGET_X86_64\n         || ((vtop->type.t & VT_BTYPE) == VT_LLONG && !(reg_classes[vtop->r2] & rc2))\n#endif\n            )\n        {\n            r = get_reg(rc);\n#ifndef TCC_TARGET_X86_64\n            if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {\n                int r2;\n                unsigned long long ll;\n                /* two register type load : expand to two words\n                   temporarily */\n                if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n                    /* load constant */\n                    ll = vtop->c.ull;\n                    vtop->c.ui = ll; /* first word */\n                    load(r, vtop);\n                    vtop->r = r; /* save register value */\n                    vpushi(ll >> 32); /* second word */\n                } else if (r >= VT_CONST || /* XXX: test to VT_CONST incorrect ? */\n                           (vtop->r & VT_LVAL)) {\n                    /* We do not want to modifier the long long\n                       pointer here, so the safest (and less\n                       efficient) is to save all the other registers\n                       in the stack. XXX: totally inefficient. */\n                    save_regs(1);\n                    /* load from memory */\n                    load(r, vtop);\n                    vdup();\n                    vtop[-1].r = r; /* save register value */\n                    /* increment pointer to get second word */\n                    vtop->type.t = VT_INT;\n                    gaddrof();\n                    vpushi(4);\n                    gen_op('+');\n                    vtop->r |= VT_LVAL;\n                } else {\n                    /* move registers */\n                    load(r, vtop);\n                    vdup();\n                    vtop[-1].r = r; /* save register value */\n                    vtop->r = vtop[-1].r2;\n                }\n                /* Allocate second register. Here we rely on the fact that\n                   get_reg() tries first to free r2 of an SValue. */\n                r2 = get_reg(rc2);\n                load(r2, vtop);\n                vpop();\n                /* write second register */\n                vtop->r2 = r2;\n            } else\n#endif\n            if ((vtop->r & VT_LVAL) && !is_float(vtop->type.t)) {\n                int t1, t;\n                /* lvalue of scalar type : need to use lvalue type\n                   because of possible cast */\n                t = vtop->type.t;\n                t1 = t;\n                /* compute memory access type */\n                if (vtop->r & VT_LVAL_BYTE)\n                    t = VT_BYTE;\n                else if (vtop->r & VT_LVAL_SHORT)\n                    t = VT_SHORT;\n                if (vtop->r & VT_LVAL_UNSIGNED)\n                    t |= VT_UNSIGNED;\n                vtop->type.t = t;\n                load(r, vtop);\n                /* restore wanted type */\n                vtop->type.t = t1;\n            } else {\n                /* one register type load */\n                load(r, vtop);\n            }\n        }\n        vtop->r = r;\n#ifdef TCC_TARGET_C67\n        /* uses register pairs for doubles */\n        if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE) \n            vtop->r2 = r+1;\n#endif\n    }\n    return r;\n}\n\n/* generate vtop[-1] and vtop[0] in resp. classes rc1 and rc2 */\nST_FUNC void gv2(int rc1, int rc2)\n{\n    int v;\n\n    /* generate more generic register first. But VT_JMP or VT_CMP\n       values must be generated first in all cases to avoid possible\n       reload errors */\n    v = vtop[0].r & VT_VALMASK;\n    if (v != VT_CMP && (v & ~1) != VT_JMP && rc1 <= rc2) {\n        vswap();\n        gv(rc1);\n        vswap();\n        gv(rc2);\n        /* test if reload is needed for first register */\n        if ((vtop[-1].r & VT_VALMASK) >= VT_CONST) {\n            vswap();\n            gv(rc1);\n            vswap();\n        }\n    } else {\n        gv(rc2);\n        vswap();\n        gv(rc1);\n        vswap();\n        /* test if reload is needed for first register */\n        if ((vtop[0].r & VT_VALMASK) >= VT_CONST) {\n            gv(rc2);\n        }\n    }\n}\n\n/* wrapper around RC_FRET to return a register by type */\nstatic int rc_fret(int t)\n{\n#ifdef TCC_TARGET_X86_64\n    if (t == VT_LDOUBLE) {\n        return RC_ST0;\n    }\n#endif\n    return RC_FRET;\n}\n\n/* wrapper around REG_FRET to return a register by type */\nstatic int reg_fret(int t)\n{\n#ifdef TCC_TARGET_X86_64\n    if (t == VT_LDOUBLE) {\n        return TREG_ST0;\n    }\n#endif\n    return REG_FRET;\n}\n\n/* expand long long on stack in two int registers */\nstatic void lexpand(void)\n{\n    int u;\n\n    u = vtop->type.t & VT_UNSIGNED;\n    gv(RC_INT);\n    vdup();\n    vtop[0].r = vtop[-1].r2;\n    vtop[0].r2 = VT_CONST;\n    vtop[-1].r2 = VT_CONST;\n    vtop[0].type.t = VT_INT | u;\n    vtop[-1].type.t = VT_INT | u;\n}\n\n#ifdef TCC_TARGET_ARM\n/* expand long long on stack */\nST_FUNC void lexpand_nr(void)\n{\n    int u,v;\n\n    u = vtop->type.t & VT_UNSIGNED;\n    vdup();\n    vtop->r2 = VT_CONST;\n    vtop->type.t = VT_INT | u;\n    v=vtop[-1].r & (VT_VALMASK | VT_LVAL);\n    if (v == VT_CONST) {\n      vtop[-1].c.ui = vtop->c.ull;\n      vtop->c.ui = vtop->c.ull >> 32;\n      vtop->r = VT_CONST;\n    } else if (v == (VT_LVAL|VT_CONST) || v == (VT_LVAL|VT_LOCAL)) {\n      vtop->c.ui += 4;\n      vtop->r = vtop[-1].r;\n    } else if (v > VT_CONST) {\n      vtop--;\n      lexpand();\n    } else\n      vtop->r = vtop[-1].r2;\n    vtop[-1].r2 = VT_CONST;\n    vtop[-1].type.t = VT_INT | u;\n}\n#endif\n\n/* build a long long from two ints */\nstatic void lbuild(int t)\n{\n    gv2(RC_INT, RC_INT);\n    vtop[-1].r2 = vtop[0].r;\n    vtop[-1].type.t = t;\n    vpop();\n}\n\n/* rotate n first stack elements to the bottom \n   I1 ... In -> I2 ... In I1 [top is right]\n*/\nST_FUNC void vrotb(int n)\n{\n    int i;\n    SValue tmp;\n\n    tmp = vtop[-n + 1];\n    for(i=-n+1;i!=0;i++)\n        vtop[i] = vtop[i+1];\n    vtop[0] = tmp;\n}\n\n/* rotate the n elements before entry e towards the top\n   I1 ... In ... -> In I1 ... I(n-1) ... [top is right]\n */\nST_FUNC void vrote(SValue *e, int n)\n{\n    int i;\n    SValue tmp;\n\n    tmp = *e;\n    for(i = 0;i < n - 1; i++)\n        e[-i] = e[-i - 1];\n    e[-n + 1] = tmp;\n}\n\n/* rotate n first stack elements to the top\n   I1 ... In -> In I1 ... I(n-1)  [top is right]\n */\nST_FUNC void vrott(int n)\n{\n    vrote(vtop, n);\n}\n\n/* pop stack value */\nST_FUNC void vpop(void)\n{\n    int v;\n    v = vtop->r & VT_VALMASK;\n#if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)\n    /* for x86, we need to pop the FP stack */\n    if (v == TREG_ST0 && !nocode_wanted) {\n        o(0xd8dd); /* fstp %st(0) */\n    } else\n#endif\n    if (v == VT_JMP || v == VT_JMPI) {\n        /* need to put correct jump if && or || without test */\n        gsym(vtop->c.ul);\n    }\n    vtop--;\n}\n\n/* convert stack entry to register and duplicate its value in another\n   register */\nstatic void gv_dup(void)\n{\n    int rc, t, r, r1;\n    SValue sv;\n\n    t = vtop->type.t;\n    if ((t & VT_BTYPE) == VT_LLONG) {\n        lexpand();\n        gv_dup();\n        vswap();\n        vrotb(3);\n        gv_dup();\n        vrotb(4);\n        /* stack: H L L1 H1 */\n        lbuild(t);\n        vrotb(3);\n        vrotb(3);\n        vswap();\n        lbuild(t);\n        vswap();\n    } else {\n        /* duplicate value */\n        rc = RC_INT;\n        sv.type.t = VT_INT;\n        if (is_float(t)) {\n            rc = RC_FLOAT;\n#ifdef TCC_TARGET_X86_64\n            if ((t & VT_BTYPE) == VT_LDOUBLE) {\n                rc = RC_ST0;\n            }\n#endif\n            sv.type.t = t;\n        }\n        r = gv(rc);\n        r1 = get_reg(rc);\n        sv.r = r;\n        sv.c.ul = 0;\n        load(r1, &sv); /* move r to r1 */\n        vdup();\n        /* duplicates value */\n        if (r != r1)\n            vtop->r = r1;\n    }\n}\n\n#ifndef TCC_TARGET_X86_64\n/* generate CPU independent (unsigned) long long operations */\nstatic void gen_opl(int op)\n{\n    int t, a, b, op1, c, i;\n    int func;\n    unsigned short reg_iret = REG_IRET;\n    unsigned short reg_lret = REG_LRET;\n    SValue tmp;\n\n    switch(op) {\n    case '/':\n    case TOK_PDIV:\n        func = TOK___divdi3;\n        goto gen_func;\n    case TOK_UDIV:\n        func = TOK___udivdi3;\n        goto gen_func;\n    case '%':\n        func = TOK___moddi3;\n        goto gen_mod_func;\n    case TOK_UMOD:\n        func = TOK___umoddi3;\n    gen_mod_func:\n#ifdef TCC_ARM_EABI\n        reg_iret = TREG_R2;\n        reg_lret = TREG_R3;\n#endif\n    gen_func:\n        /* call generic long long function */\n        vpush_global_sym(&func_old_type, func);\n        vrott(3);\n        gfunc_call(2);\n        vpushi(0);\n        vtop->r = reg_iret;\n        vtop->r2 = reg_lret;\n        break;\n    case '^':\n    case '&':\n    case '|':\n    case '*':\n    case '+':\n    case '-':\n        t = vtop->type.t;\n        vswap();\n        lexpand();\n        vrotb(3);\n        lexpand();\n        /* stack: L1 H1 L2 H2 */\n        tmp = vtop[0];\n        vtop[0] = vtop[-3];\n        vtop[-3] = tmp;\n        tmp = vtop[-2];\n        vtop[-2] = vtop[-3];\n        vtop[-3] = tmp;\n        vswap();\n        /* stack: H1 H2 L1 L2 */\n        if (op == '*') {\n            vpushv(vtop - 1);\n            vpushv(vtop - 1);\n            gen_op(TOK_UMULL);\n            lexpand();\n            /* stack: H1 H2 L1 L2 ML MH */\n            for(i=0;i<4;i++)\n                vrotb(6);\n            /* stack: ML MH H1 H2 L1 L2 */\n            tmp = vtop[0];\n            vtop[0] = vtop[-2];\n            vtop[-2] = tmp;\n            /* stack: ML MH H1 L2 H2 L1 */\n            gen_op('*');\n            vrotb(3);\n            vrotb(3);\n            gen_op('*');\n            /* stack: ML MH M1 M2 */\n            gen_op('+');\n            gen_op('+');\n        } else if (op == '+' || op == '-') {\n            /* XXX: add non carry method too (for MIPS or alpha) */\n            if (op == '+')\n                op1 = TOK_ADDC1;\n            else\n                op1 = TOK_SUBC1;\n            gen_op(op1);\n            /* stack: H1 H2 (L1 op L2) */\n            vrotb(3);\n            vrotb(3);\n            gen_op(op1 + 1); /* TOK_xxxC2 */\n        } else {\n            gen_op(op);\n            /* stack: H1 H2 (L1 op L2) */\n            vrotb(3);\n            vrotb(3);\n            /* stack: (L1 op L2) H1 H2 */\n            gen_op(op);\n            /* stack: (L1 op L2) (H1 op H2) */\n        }\n        /* stack: L H */\n        lbuild(t);\n        break;\n    case TOK_SAR:\n    case TOK_SHR:\n    case TOK_SHL:\n        if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n            t = vtop[-1].type.t;\n            vswap();\n            lexpand();\n            vrotb(3);\n            /* stack: L H shift */\n            c = (int)vtop->c.i;\n            /* constant: simpler */\n            /* NOTE: all comments are for SHL. the other cases are\n               done by swaping words */\n            vpop();\n            if (op != TOK_SHL)\n                vswap();\n            if (c >= 32) {\n                /* stack: L H */\n                vpop();\n                if (c > 32) {\n                    vpushi(c - 32);\n                    gen_op(op);\n                }\n                if (op != TOK_SAR) {\n                    vpushi(0);\n                } else {\n                    gv_dup();\n                    vpushi(31);\n                    gen_op(TOK_SAR);\n                }\n                vswap();\n            } else {\n                vswap();\n                gv_dup();\n                /* stack: H L L */\n                vpushi(c);\n                gen_op(op);\n                vswap();\n                vpushi(32 - c);\n                if (op == TOK_SHL)\n                    gen_op(TOK_SHR);\n                else\n                    gen_op(TOK_SHL);\n                vrotb(3);\n                /* stack: L L H */\n                vpushi(c);\n                if (op == TOK_SHL)\n                    gen_op(TOK_SHL);\n                else\n                    gen_op(TOK_SHR);\n                gen_op('|');\n            }\n            if (op != TOK_SHL)\n                vswap();\n            lbuild(t);\n        } else {\n            /* XXX: should provide a faster fallback on x86 ? */\n            switch(op) {\n            case TOK_SAR:\n                func = TOK___ashrdi3;\n                goto gen_func;\n            case TOK_SHR:\n                func = TOK___lshrdi3;\n                goto gen_func;\n            case TOK_SHL:\n                func = TOK___ashldi3;\n                goto gen_func;\n            }\n        }\n        break;\n    default:\n        /* compare operations */\n        t = vtop->type.t;\n        vswap();\n        lexpand();\n        vrotb(3);\n        lexpand();\n        /* stack: L1 H1 L2 H2 */\n        tmp = vtop[-1];\n        vtop[-1] = vtop[-2];\n        vtop[-2] = tmp;\n        /* stack: L1 L2 H1 H2 */\n        /* compare high */\n        op1 = op;\n        /* when values are equal, we need to compare low words. since\n           the jump is inverted, we invert the test too. */\n        if (op1 == TOK_LT)\n            op1 = TOK_LE;\n        else if (op1 == TOK_GT)\n            op1 = TOK_GE;\n        else if (op1 == TOK_ULT)\n            op1 = TOK_ULE;\n        else if (op1 == TOK_UGT)\n            op1 = TOK_UGE;\n        a = 0;\n        b = 0;\n        gen_op(op1);\n        if (op1 != TOK_NE) {\n            a = gtst(1, 0);\n        }\n        if (op != TOK_EQ) {\n            /* generate non equal test */\n            /* XXX: NOT PORTABLE yet */\n            if (a == 0) {\n                b = gtst(0, 0);\n            } else {\n#if defined(TCC_TARGET_I386)\n                b = psym(0x850f, 0);\n#elif defined(TCC_TARGET_ARM)\n                b = ind;\n                o(0x1A000000 | encbranch(ind, 0, 1));\n#elif defined(TCC_TARGET_C67)\n                tcc_error(\"not implemented\");\n#else\n#error not supported\n#endif\n            }\n        }\n        /* compare low. Always unsigned */\n        op1 = op;\n        if (op1 == TOK_LT)\n            op1 = TOK_ULT;\n        else if (op1 == TOK_LE)\n            op1 = TOK_ULE;\n        else if (op1 == TOK_GT)\n            op1 = TOK_UGT;\n        else if (op1 == TOK_GE)\n            op1 = TOK_UGE;\n        gen_op(op1);\n        a = gtst(1, a);\n        gsym(b);\n        vseti(VT_JMPI, a);\n        break;\n    }\n}\n#endif\n\n/* handle integer constant optimizations and various machine\n   independent opt */\nstatic void gen_opic(int op)\n{\n    int c1, c2, t1, t2, n;\n    SValue *v1, *v2;\n    long long l1, l2;\n    typedef unsigned long long U;\n\n    v1 = vtop - 1;\n    v2 = vtop;\n    t1 = v1->type.t & VT_BTYPE;\n    t2 = v2->type.t & VT_BTYPE;\n\n    if (t1 == VT_LLONG)\n        l1 = v1->c.ll;\n    else if (v1->type.t & VT_UNSIGNED)\n        l1 = v1->c.ui;\n    else\n        l1 = v1->c.i;\n\n    if (t2 == VT_LLONG)\n        l2 = v2->c.ll;\n    else if (v2->type.t & VT_UNSIGNED)\n        l2 = v2->c.ui;\n    else\n        l2 = v2->c.i;\n\n    /* currently, we cannot do computations with forward symbols */\n    c1 = (v1->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;\n    c2 = (v2->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;\n    if (c1 && c2) {\n        switch(op) {\n        case '+': l1 += l2; break;\n        case '-': l1 -= l2; break;\n        case '&': l1 &= l2; break;\n        case '^': l1 ^= l2; break;\n        case '|': l1 |= l2; break;\n        case '*': l1 *= l2; break;\n\n        case TOK_PDIV:\n        case '/':\n        case '%':\n        case TOK_UDIV:\n        case TOK_UMOD:\n            /* if division by zero, generate explicit division */\n            if (l2 == 0) {\n                if (const_wanted)\n                    tcc_error(\"division by zero in constant\");\n                goto general_case;\n            }\n            switch(op) {\n            default: l1 /= l2; break;\n            case '%': l1 %= l2; break;\n            case TOK_UDIV: l1 = (U)l1 / l2; break;\n            case TOK_UMOD: l1 = (U)l1 % l2; break;\n            }\n            break;\n        case TOK_SHL: l1 <<= l2; break;\n        case TOK_SHR: l1 = (U)l1 >> l2; break;\n        case TOK_SAR: l1 >>= l2; break;\n            /* tests */\n        case TOK_ULT: l1 = (U)l1 < (U)l2; break;\n        case TOK_UGE: l1 = (U)l1 >= (U)l2; break;\n        case TOK_EQ: l1 = l1 == l2; break;\n        case TOK_NE: l1 = l1 != l2; break;\n        case TOK_ULE: l1 = (U)l1 <= (U)l2; break;\n        case TOK_UGT: l1 = (U)l1 > (U)l2; break;\n        case TOK_LT: l1 = l1 < l2; break;\n        case TOK_GE: l1 = l1 >= l2; break;\n        case TOK_LE: l1 = l1 <= l2; break;\n        case TOK_GT: l1 = l1 > l2; break;\n            /* logical */\n        case TOK_LAND: l1 = l1 && l2; break;\n        case TOK_LOR: l1 = l1 || l2; break;\n        default:\n            goto general_case;\n        }\n        v1->c.ll = l1;\n        vtop--;\n    } else {\n        /* if commutative ops, put c2 as constant */\n        if (c1 && (op == '+' || op == '&' || op == '^' || \n                   op == '|' || op == '*')) {\n            vswap();\n            c2 = c1; //c = c1, c1 = c2, c2 = c;\n            l2 = l1; //l = l1, l1 = l2, l2 = l;\n        }\n        /* Filter out NOP operations like x*1, x-0, x&-1... */\n        if (c2 && (((op == '*' || op == '/' || op == TOK_UDIV || \n                     op == TOK_PDIV) && \n                    l2 == 1) ||\n                   ((op == '+' || op == '-' || op == '|' || op == '^' || \n                     op == TOK_SHL || op == TOK_SHR || op == TOK_SAR) && \n                    l2 == 0) ||\n                   (op == '&' && \n                    l2 == -1))) {\n            /* nothing to do */\n            vtop--;\n        } else if (c2 && (op == '*' || op == TOK_PDIV || op == TOK_UDIV)) {\n            /* try to use shifts instead of muls or divs */\n            if (l2 > 0 && (l2 & (l2 - 1)) == 0) {\n                n = -1;\n                while (l2) {\n                    l2 >>= 1;\n                    n++;\n                }\n                vtop->c.ll = n;\n                if (op == '*')\n                    op = TOK_SHL;\n                else if (op == TOK_PDIV)\n                    op = TOK_SAR;\n                else\n                    op = TOK_SHR;\n            }\n            goto general_case;\n        } else if (c2 && (op == '+' || op == '-') &&\n                   (((vtop[-1].r & (VT_VALMASK | VT_LVAL | VT_SYM)) == (VT_CONST | VT_SYM))\n                    || (vtop[-1].r & (VT_VALMASK | VT_LVAL)) == VT_LOCAL)) {\n            /* symbol + constant case */\n            if (op == '-')\n                l2 = -l2;\n            vtop--;\n            vtop->c.ll += l2;\n        } else {\n        general_case:\n            if (!nocode_wanted) {\n                /* call low level op generator */\n                if (t1 == VT_LLONG || t2 == VT_LLONG) \n                    gen_opl(op);\n                else\n                    gen_opi(op);\n            } else {\n                vtop--;\n            }\n        }\n    }\n}\n\n/* generate a floating point operation with constant propagation */\nstatic void gen_opif(int op)\n{\n    int c1, c2;\n    SValue *v1, *v2;\n    long double f1, f2;\n\n    v1 = vtop - 1;\n    v2 = vtop;\n    /* currently, we cannot do computations with forward symbols */\n    c1 = (v1->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;\n    c2 = (v2->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;\n    if (c1 && c2) {\n        if (v1->type.t == VT_FLOAT) {\n            f1 = v1->c.f;\n            f2 = v2->c.f;\n        } else if (v1->type.t == VT_DOUBLE) {\n            f1 = v1->c.d;\n            f2 = v2->c.d;\n        } else {\n            f1 = v1->c.ld;\n            f2 = v2->c.ld;\n        }\n\n        /* NOTE: we only do constant propagation if finite number (not\n           NaN or infinity) (ANSI spec) */\n        if (!ieee_finite(f1) || !ieee_finite(f2))\n            goto general_case;\n\n        switch(op) {\n        case '+': f1 += f2; break;\n        case '-': f1 -= f2; break;\n        case '*': f1 *= f2; break;\n        case '/': \n            if (f2 == 0.0) {\n                if (const_wanted)\n                    tcc_error(\"division by zero in constant\");\n                goto general_case;\n            }\n            f1 /= f2; \n            break;\n            /* XXX: also handles tests ? */\n        default:\n            goto general_case;\n        }\n        /* XXX: overflow test ? */\n        if (v1->type.t == VT_FLOAT) {\n            v1->c.f = f1;\n        } else if (v1->type.t == VT_DOUBLE) {\n            v1->c.d = f1;\n        } else {\n            v1->c.ld = f1;\n        }\n        vtop--;\n    } else {\n    general_case:\n        if (!nocode_wanted) {\n            gen_opf(op);\n        } else {\n            vtop--;\n        }\n    }\n}\n\nstatic int pointed_size(CType *type)\n{\n    int align;\n    return type_size(pointed_type(type), &align);\n}\n\nstatic void vla_runtime_pointed_size(CType *type)\n{\n    int align;\n    vla_runtime_type_size(pointed_type(type), &align);\n}\n\nstatic inline int is_null_pointer(SValue *p)\n{\n    if ((p->r & (VT_VALMASK | VT_LVAL | VT_SYM)) != VT_CONST)\n        return 0;\n    return ((p->type.t & VT_BTYPE) == VT_INT && p->c.i == 0) ||\n        ((p->type.t & VT_BTYPE) == VT_LLONG && p->c.ll == 0) ||\n\t((p->type.t & VT_BTYPE) == VT_PTR && p->c.ptr == 0);\n}\n\nstatic inline int is_integer_btype(int bt)\n{\n    return (bt == VT_BYTE || bt == VT_SHORT || \n            bt == VT_INT || bt == VT_LLONG);\n}\n\n/* check types for comparison or substraction of pointers */\nstatic void check_comparison_pointer_types(SValue *p1, SValue *p2, int op)\n{\n    CType *type1, *type2, tmp_type1, tmp_type2;\n    int bt1, bt2;\n    \n    /* null pointers are accepted for all comparisons as gcc */\n    if (is_null_pointer(p1) || is_null_pointer(p2))\n        return;\n    type1 = &p1->type;\n    type2 = &p2->type;\n    bt1 = type1->t & VT_BTYPE;\n    bt2 = type2->t & VT_BTYPE;\n    /* accept comparison between pointer and integer with a warning */\n    if ((is_integer_btype(bt1) || is_integer_btype(bt2)) && op != '-') {\n        if (op != TOK_LOR && op != TOK_LAND )\n            tcc_warning(\"comparison between pointer and integer\");\n        return;\n    }\n\n    /* both must be pointers or implicit function pointers */\n    if (bt1 == VT_PTR) {\n        type1 = pointed_type(type1);\n    } else if (bt1 != VT_FUNC) \n        goto invalid_operands;\n\n    if (bt2 == VT_PTR) {\n        type2 = pointed_type(type2);\n    } else if (bt2 != VT_FUNC) { \n    invalid_operands:\n        tcc_error(\"invalid operands to binary %s\", get_tok_str(op, NULL));\n    }\n    if ((type1->t & VT_BTYPE) == VT_VOID || \n        (type2->t & VT_BTYPE) == VT_VOID)\n        return;\n    tmp_type1 = *type1;\n    tmp_type2 = *type2;\n    tmp_type1.t &= ~(VT_UNSIGNED | VT_CONSTANT | VT_VOLATILE);\n    tmp_type2.t &= ~(VT_UNSIGNED | VT_CONSTANT | VT_VOLATILE);\n    if (!is_compatible_types(&tmp_type1, &tmp_type2)) {\n        /* gcc-like error if '-' is used */\n        if (op == '-')\n            goto invalid_operands;\n        else\n            tcc_warning(\"comparison of distinct pointer types lacks a cast\");\n    }\n}\n\n/* generic gen_op: handles types problems */\nST_FUNC void gen_op(int op)\n{\n    int u, t1, t2, bt1, bt2, t;\n    CType type1;\n\n    t1 = vtop[-1].type.t;\n    t2 = vtop[0].type.t;\n    bt1 = t1 & VT_BTYPE;\n    bt2 = t2 & VT_BTYPE;\n        \n    if (bt1 == VT_PTR || bt2 == VT_PTR) {\n        /* at least one operand is a pointer */\n        /* relationnal op: must be both pointers */\n        if (op >= TOK_ULT && op <= TOK_LOR) {\n            check_comparison_pointer_types(vtop - 1, vtop, op);\n            /* pointers are handled are unsigned */\n#ifdef TCC_TARGET_X86_64\n            t = VT_LLONG | VT_UNSIGNED;\n#else\n            t = VT_INT | VT_UNSIGNED;\n#endif\n            goto std_op;\n        }\n        /* if both pointers, then it must be the '-' op */\n        if (bt1 == VT_PTR && bt2 == VT_PTR) {\n            if (op != '-')\n                tcc_error(\"cannot use pointers here\");\n            check_comparison_pointer_types(vtop - 1, vtop, op);\n            /* XXX: check that types are compatible */\n            if (vtop[-1].type.t & VT_VLA) {\n                vla_runtime_pointed_size(&vtop[-1].type);\n            } else {\n                vpushi(pointed_size(&vtop[-1].type));\n            }\n            vrott(3);\n            gen_opic(op);\n            /* set to integer type */\n#ifdef TCC_TARGET_X86_64\n            vtop->type.t = VT_LLONG;\n#else\n            vtop->type.t = VT_INT; \n#endif\n            vswap();\n            gen_op(TOK_PDIV);\n        } else {\n            /* exactly one pointer : must be '+' or '-'. */\n            if (op != '-' && op != '+')\n                tcc_error(\"cannot use pointers here\");\n            /* Put pointer as first operand */\n            if (bt2 == VT_PTR) {\n                vswap();\n                swap(&t1, &t2);\n            }\n            type1 = vtop[-1].type;\n            type1.t &= ~VT_ARRAY;\n            if (vtop[-1].type.t & VT_VLA)\n                vla_runtime_pointed_size(&vtop[-1].type);\n            else {\n                u = pointed_size(&vtop[-1].type);\n                if (u < 0)\n                    tcc_error(\"unknown array element size\");\n#ifdef TCC_TARGET_X86_64\n                vpushll(u);\n#else\n                /* XXX: cast to int ? (long long case) */\n                vpushi(u);\n#endif\n            }\n            gen_op('*');\n#ifdef CONFIG_TCC_BCHECK\n            /* if evaluating constant expression, no code should be\n               generated, so no bound check */\n            if (tcc_state->do_bounds_check && !const_wanted) {\n                /* if bounded pointers, we generate a special code to\n                   test bounds */\n                if (op == '-') {\n                    vpushi(0);\n                    vswap();\n                    gen_op('-');\n                }\n                gen_bounded_ptr_add();\n            } else\n#endif\n            {\n                gen_opic(op);\n            }\n            /* put again type if gen_opic() swaped operands */\n            vtop->type = type1;\n        }\n    } else if (is_float(bt1) || is_float(bt2)) {\n        /* compute bigger type and do implicit casts */\n        if (bt1 == VT_LDOUBLE || bt2 == VT_LDOUBLE) {\n            t = VT_LDOUBLE;\n        } else if (bt1 == VT_DOUBLE || bt2 == VT_DOUBLE) {\n            t = VT_DOUBLE;\n        } else {\n            t = VT_FLOAT;\n        }\n        /* floats can only be used for a few operations */\n        if (op != '+' && op != '-' && op != '*' && op != '/' &&\n            (op < TOK_ULT || op > TOK_GT))\n            tcc_error(\"invalid operands for binary operation\");\n        goto std_op;\n    } else if (op == TOK_SHR || op == TOK_SAR || op == TOK_SHL) {\n        t = bt1 == VT_LLONG ? VT_LLONG : VT_INT;\n        if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (t | VT_UNSIGNED))\n          t |= VT_UNSIGNED;\n        goto std_op;\n    } else if (bt1 == VT_LLONG || bt2 == VT_LLONG) {\n        /* cast to biggest op */\n        t = VT_LLONG;\n        /* convert to unsigned if it does not fit in a long long */\n        if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED) ||\n            (t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED))\n            t |= VT_UNSIGNED;\n        goto std_op;\n    } else if (bt1 == VT_STRUCT || bt2 == VT_STRUCT) {\n        tcc_error(\"comparison of struct\");\n    } else {\n        /* integer operations */\n        t = VT_INT;\n        /* convert to unsigned if it does not fit in an integer */\n        if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_INT | VT_UNSIGNED) ||\n            (t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_INT | VT_UNSIGNED))\n            t |= VT_UNSIGNED;\n    std_op:\n        /* XXX: currently, some unsigned operations are explicit, so\n           we modify them here */\n        if (t & VT_UNSIGNED) {\n            if (op == TOK_SAR)\n                op = TOK_SHR;\n            else if (op == '/')\n                op = TOK_UDIV;\n            else if (op == '%')\n                op = TOK_UMOD;\n            else if (op == TOK_LT)\n                op = TOK_ULT;\n            else if (op == TOK_GT)\n                op = TOK_UGT;\n            else if (op == TOK_LE)\n                op = TOK_ULE;\n            else if (op == TOK_GE)\n                op = TOK_UGE;\n        }\n        vswap();\n        type1.t = t;\n        gen_cast(&type1);\n        vswap();\n        /* special case for shifts and long long: we keep the shift as\n           an integer */\n        if (op == TOK_SHR || op == TOK_SAR || op == TOK_SHL)\n            type1.t = VT_INT;\n        gen_cast(&type1);\n        if (is_float(t))\n            gen_opif(op);\n        else\n            gen_opic(op);\n        if (op >= TOK_ULT && op <= TOK_GT) {\n            /* relationnal op: the result is an int */\n            vtop->type.t = VT_INT;\n        } else {\n            vtop->type.t = t;\n        }\n    }\n}\n\n#ifndef TCC_TARGET_ARM\n/* generic itof for unsigned long long case */\nstatic void gen_cvt_itof1(int t)\n{\n    if ((vtop->type.t & (VT_BTYPE | VT_UNSIGNED)) == \n        (VT_LLONG | VT_UNSIGNED)) {\n\n        if (t == VT_FLOAT)\n            vpush_global_sym(&func_old_type, TOK___floatundisf);\n#if LDOUBLE_SIZE != 8\n        else if (t == VT_LDOUBLE)\n            vpush_global_sym(&func_old_type, TOK___floatundixf);\n#endif\n        else\n            vpush_global_sym(&func_old_type, TOK___floatundidf);\n        vrott(2);\n        gfunc_call(1);\n        vpushi(0);\n        vtop->r = reg_fret(t);\n    } else {\n        gen_cvt_itof(t);\n    }\n}\n#endif\n\n/* generic ftoi for unsigned long long case */\nstatic void gen_cvt_ftoi1(int t)\n{\n    int st;\n\n    if (t == (VT_LLONG | VT_UNSIGNED)) {\n        /* not handled natively */\n        st = vtop->type.t & VT_BTYPE;\n        if (st == VT_FLOAT)\n            vpush_global_sym(&func_old_type, TOK___fixunssfdi);\n#if LDOUBLE_SIZE != 8\n        else if (st == VT_LDOUBLE)\n            vpush_global_sym(&func_old_type, TOK___fixunsxfdi);\n#endif\n        else\n            vpush_global_sym(&func_old_type, TOK___fixunsdfdi);\n        vrott(2);\n        gfunc_call(1);\n        vpushi(0);\n        vtop->r = REG_IRET;\n        vtop->r2 = REG_LRET;\n    } else {\n        gen_cvt_ftoi(t);\n    }\n}\n\n/* force char or short cast */\nstatic void force_charshort_cast(int t)\n{\n    int bits, dbt;\n    dbt = t & VT_BTYPE;\n    /* XXX: add optimization if lvalue : just change type and offset */\n    if (dbt == VT_BYTE)\n        bits = 8;\n    else\n        bits = 16;\n    if (t & VT_UNSIGNED) {\n        vpushi((1 << bits) - 1);\n        gen_op('&');\n    } else {\n        bits = 32 - bits;\n        vpushi(bits);\n        gen_op(TOK_SHL);\n        /* result must be signed or the SAR is converted to an SHL\n           This was not the case when \"t\" was a signed short\n           and the last value on the stack was an unsigned int */\n        vtop->type.t &= ~VT_UNSIGNED;\n        vpushi(bits);\n        gen_op(TOK_SAR);\n    }\n}\n\n/* cast 'vtop' to 'type'. Casting to bitfields is forbidden. */\nstatic void gen_cast(CType *type)\n{\n    int sbt, dbt, sf, df, c, p;\n\n    /* special delayed cast for char/short */\n    /* XXX: in some cases (multiple cascaded casts), it may still\n       be incorrect */\n    if (vtop->r & VT_MUSTCAST) {\n        vtop->r &= ~VT_MUSTCAST;\n        force_charshort_cast(vtop->type.t);\n    }\n\n    /* bitfields first get cast to ints */\n    if (vtop->type.t & VT_BITFIELD) {\n        gv(RC_INT);\n    }\n\n    dbt = type->t & (VT_BTYPE | VT_UNSIGNED);\n    sbt = vtop->type.t & (VT_BTYPE | VT_UNSIGNED);\n\n    if (sbt != dbt) {\n        sf = is_float(sbt);\n        df = is_float(dbt);\n        c = (vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;\n        p = (vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == (VT_CONST | VT_SYM);\n        if (c) {\n            /* constant case: we can do it now */\n            /* XXX: in ISOC, cannot do it if error in convert */\n            if (sbt == VT_FLOAT)\n                vtop->c.ld = vtop->c.f;\n            else if (sbt == VT_DOUBLE)\n                vtop->c.ld = vtop->c.d;\n\n            if (df) {\n                if ((sbt & VT_BTYPE) == VT_LLONG) {\n                    if (sbt & VT_UNSIGNED)\n                        vtop->c.ld = vtop->c.ull;\n                    else\n                        vtop->c.ld = vtop->c.ll;\n                } else if(!sf) {\n                    if (sbt & VT_UNSIGNED)\n                        vtop->c.ld = vtop->c.ui;\n                    else\n                        vtop->c.ld = vtop->c.i;\n                }\n\n                if (dbt == VT_FLOAT)\n                    vtop->c.f = (float)vtop->c.ld;\n                else if (dbt == VT_DOUBLE)\n                    vtop->c.d = (double)vtop->c.ld;\n            } else if (sf && dbt == (VT_LLONG|VT_UNSIGNED)) {\n                vtop->c.ull = (unsigned long long)vtop->c.ld;\n            } else if (sf && dbt == VT_BOOL) {\n                vtop->c.i = (vtop->c.ld != 0);\n            } else {\n                if(sf)\n                    vtop->c.ll = (long long)vtop->c.ld;\n                else if (sbt == (VT_LLONG|VT_UNSIGNED))\n                    vtop->c.ll = vtop->c.ull;\n                else if (sbt & VT_UNSIGNED)\n                    vtop->c.ll = vtop->c.ui;\n#ifdef TCC_TARGET_X86_64\n                else if (sbt == VT_PTR)\n                    ;\n#endif\n                else if (sbt != VT_LLONG)\n                    vtop->c.ll = vtop->c.i;\n\n                if (dbt == (VT_LLONG|VT_UNSIGNED))\n                    vtop->c.ull = vtop->c.ll;\n                else if (dbt == VT_BOOL)\n                    vtop->c.i = (vtop->c.ll != 0);\n                else if (dbt != VT_LLONG) {\n                    int s = 0;\n                    if ((dbt & VT_BTYPE) == VT_BYTE)\n                        s = 24;\n                    else if ((dbt & VT_BTYPE) == VT_SHORT)\n                        s = 16;\n\n                    if(dbt & VT_UNSIGNED)\n                        vtop->c.ui = ((unsigned int)vtop->c.ll << s) >> s;\n                    else\n                        vtop->c.i = ((int)vtop->c.ll << s) >> s;\n                }\n            }\n        } else if (p && dbt == VT_BOOL) {\n            vtop->r = VT_CONST;\n            vtop->c.i = 1;\n        } else if (!nocode_wanted) {\n            /* non constant case: generate code */\n            if (sf && df) {\n                /* convert from fp to fp */\n                gen_cvt_ftof(dbt);\n            } else if (df) {\n                /* convert int to fp */\n                gen_cvt_itof1(dbt);\n            } else if (sf) {\n                /* convert fp to int */\n                if (dbt == VT_BOOL) {\n                     vpushi(0);\n                     gen_op(TOK_NE);\n                } else {\n                    /* we handle char/short/etc... with generic code */\n                    if (dbt != (VT_INT | VT_UNSIGNED) &&\n                        dbt != (VT_LLONG | VT_UNSIGNED) &&\n                        dbt != VT_LLONG)\n                        dbt = VT_INT;\n                    gen_cvt_ftoi1(dbt);\n                    if (dbt == VT_INT && (type->t & (VT_BTYPE | VT_UNSIGNED)) != dbt) {\n                        /* additional cast for char/short... */\n                        vtop->type.t = dbt;\n                        gen_cast(type);\n                    }\n                }\n#ifndef TCC_TARGET_X86_64\n            } else if ((dbt & VT_BTYPE) == VT_LLONG) {\n                if ((sbt & VT_BTYPE) != VT_LLONG) {\n                    /* scalar to long long */\n                    /* machine independent conversion */\n                    gv(RC_INT);\n                    /* generate high word */\n                    if (sbt == (VT_INT | VT_UNSIGNED)) {\n                        vpushi(0);\n                        gv(RC_INT);\n                    } else {\n                        if (sbt == VT_PTR) {\n                            /* cast from pointer to int before we apply\n                               shift operation, which pointers don't support*/\n                            gen_cast(&int_type);\n                        }\n                        gv_dup();\n                        vpushi(31);\n                        gen_op(TOK_SAR);\n                    }\n                    /* patch second register */\n                    vtop[-1].r2 = vtop->r;\n                    vpop();\n                }\n#else\n            } else if ((dbt & VT_BTYPE) == VT_LLONG ||\n                       (dbt & VT_BTYPE) == VT_PTR ||\n                       (dbt & VT_BTYPE) == VT_FUNC) {\n                if ((sbt & VT_BTYPE) != VT_LLONG &&\n                    (sbt & VT_BTYPE) != VT_PTR &&\n                    (sbt & VT_BTYPE) != VT_FUNC) {\n                    /* need to convert from 32bit to 64bit */\n                    int r = gv(RC_INT);\n                    if (sbt != (VT_INT | VT_UNSIGNED)) {\n                        /* x86_64 specific: movslq */\n                        o(0x6348);\n                        o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));\n                    }\n                }\n#endif\n            } else if (dbt == VT_BOOL) {\n                /* scalar to bool */\n                vpushi(0);\n                gen_op(TOK_NE);\n            } else if ((dbt & VT_BTYPE) == VT_BYTE || \n                       (dbt & VT_BTYPE) == VT_SHORT) {\n                if (sbt == VT_PTR) {\n                    vtop->type.t = VT_INT;\n                    tcc_warning(\"nonportable conversion from pointer to char/short\");\n                }\n                force_charshort_cast(dbt);\n            } else if ((dbt & VT_BTYPE) == VT_INT) {\n                /* scalar to int */\n                if (sbt == VT_LLONG) {\n                    /* from long long: just take low order word */\n                    lexpand();\n                    vpop();\n                } \n                /* if lvalue and single word type, nothing to do because\n                   the lvalue already contains the real type size (see\n                   VT_LVAL_xxx constants) */\n            }\n        }\n    } else if ((dbt & VT_BTYPE) == VT_PTR && !(vtop->r & VT_LVAL)) {\n        /* if we are casting between pointer types,\n           we must update the VT_LVAL_xxx size */\n        vtop->r = (vtop->r & ~VT_LVAL_TYPE)\n                  | (lvalue_type(type->ref->type.t) & VT_LVAL_TYPE);\n    }\n    vtop->type = *type;\n}\n\n/* return type size as known at compile time. Put alignment at 'a' */\nST_FUNC int type_size(CType *type, int *a)\n{\n    Sym *s;\n    int bt;\n\n    bt = type->t & VT_BTYPE;\n    if (bt == VT_STRUCT) {\n        /* struct/union */\n        s = type->ref;\n        *a = s->r;\n        return s->c;\n    } else if (bt == VT_PTR) {\n        if (type->t & VT_ARRAY) {\n            int ts;\n\n            s = type->ref;\n            ts = type_size(&s->type, a);\n\n            if (ts < 0 && s->c < 0)\n                ts = -ts;\n\n            return ts * s->c;\n        } else {\n            *a = PTR_SIZE;\n            return PTR_SIZE;\n        }\n    } else if (bt == VT_LDOUBLE) {\n        *a = LDOUBLE_ALIGN;\n        return LDOUBLE_SIZE;\n    } else if (bt == VT_DOUBLE || bt == VT_LLONG) {\n#ifdef TCC_TARGET_I386\n#ifdef TCC_TARGET_PE\n        *a = 8;\n#else\n        *a = 4;\n#endif\n#elif defined(TCC_TARGET_ARM)\n#ifdef TCC_ARM_EABI\n        *a = 8; \n#else\n        *a = 4;\n#endif\n#else\n        *a = 8;\n#endif\n        return 8;\n    } else if (bt == VT_INT || bt == VT_ENUM || bt == VT_FLOAT) {\n        *a = 4;\n        return 4;\n    } else if (bt == VT_SHORT) {\n        *a = 2;\n        return 2;\n    } else {\n        /* char, void, function, _Bool */\n        *a = 1;\n        return 1;\n    }\n}\n\n/* push type size as known at runtime time on top of value stack. Put\n   alignment at 'a' */\nST_FUNC void vla_runtime_type_size(CType *type, int *a)\n{\n    if (type->t & VT_VLA) {\n        vset(&int_type, VT_LOCAL|VT_LVAL, type->ref->c);\n    } else {\n        vpushi(type_size(type, a));\n    }\n}\n\n/* return the pointed type of t */\nstatic inline CType *pointed_type(CType *type)\n{\n    return &type->ref->type;\n}\n\n/* modify type so that its it is a pointer to type. */\nST_FUNC void mk_pointer(CType *type)\n{\n    Sym *s;\n    s = sym_push(SYM_FIELD, type, 0, -1);\n    type->t = VT_PTR | (type->t & ~VT_TYPE);\n    type->ref = s;\n}\n\n/* compare function types. OLD functions match any new functions */\nstatic int is_compatible_func(CType *type1, CType *type2)\n{\n    Sym *s1, *s2;\n\n    s1 = type1->ref;\n    s2 = type2->ref;\n    if (!is_compatible_types(&s1->type, &s2->type))\n        return 0;\n    /* check func_call */\n    if (FUNC_CALL(s1->r) != FUNC_CALL(s2->r))\n        return 0;\n    /* XXX: not complete */\n    if (s1->c == FUNC_OLD || s2->c == FUNC_OLD)\n        return 1;\n    if (s1->c != s2->c)\n        return 0;\n    while (s1 != NULL) {\n        if (s2 == NULL)\n            return 0;\n        if (!is_compatible_parameter_types(&s1->type, &s2->type))\n            return 0;\n        s1 = s1->next;\n        s2 = s2->next;\n    }\n    if (s2)\n        return 0;\n    return 1;\n}\n\n/* return true if type1 and type2 are the same.  If unqualified is\n   true, qualifiers on the types are ignored.\n\n   - enums are not checked as gcc __builtin_types_compatible_p () \n */\nstatic int compare_types(CType *type1, CType *type2, int unqualified)\n{\n    int bt1, t1, t2;\n\n    t1 = type1->t & VT_TYPE;\n    t2 = type2->t & VT_TYPE;\n    if (unqualified) {\n        /* strip qualifiers before comparing */\n        t1 &= ~(VT_CONSTANT | VT_VOLATILE);\n        t2 &= ~(VT_CONSTANT | VT_VOLATILE);\n    }\n    /* XXX: bitfields ? */\n    if (t1 != t2)\n        return 0;\n    /* test more complicated cases */\n    bt1 = t1 & VT_BTYPE;\n    if (bt1 == VT_PTR) {\n        type1 = pointed_type(type1);\n        type2 = pointed_type(type2);\n        return is_compatible_types(type1, type2);\n    } else if (bt1 == VT_STRUCT) {\n        return (type1->ref == type2->ref);\n    } else if (bt1 == VT_FUNC) {\n        return is_compatible_func(type1, type2);\n    } else {\n        return 1;\n    }\n}\n\n/* return true if type1 and type2 are exactly the same (including\n   qualifiers). \n*/\nstatic int is_compatible_types(CType *type1, CType *type2)\n{\n    return compare_types(type1,type2,0);\n}\n\n/* return true if type1 and type2 are the same (ignoring qualifiers).\n*/\nstatic int is_compatible_parameter_types(CType *type1, CType *type2)\n{\n    return compare_types(type1,type2,1);\n}\n\n/* print a type. If 'varstr' is not NULL, then the variable is also\n   printed in the type */\n/* XXX: union */\n/* XXX: add array and function pointers */\nstatic void type_to_str(char *buf, int buf_size, \n                 CType *type, const char *varstr)\n{\n    int bt, v, t;\n    Sym *s, *sa;\n    char buf1[256];\n    const char *tstr;\n\n    t = type->t & VT_TYPE;\n    bt = t & VT_BTYPE;\n    buf[0] = '\\0';\n    if (t & VT_CONSTANT)\n        pstrcat(buf, buf_size, \"const \");\n    if (t & VT_VOLATILE)\n        pstrcat(buf, buf_size, \"volatile \");\n    if (t & VT_UNSIGNED)\n        pstrcat(buf, buf_size, \"unsigned \");\n    switch(bt) {\n    case VT_VOID:\n        tstr = \"void\";\n        goto add_tstr;\n    case VT_BOOL:\n        tstr = \"_Bool\";\n        goto add_tstr;\n    case VT_BYTE:\n        tstr = \"char\";\n        goto add_tstr;\n    case VT_SHORT:\n        tstr = \"short\";\n        goto add_tstr;\n    case VT_INT:\n        tstr = \"int\";\n        goto add_tstr;\n    case VT_LONG:\n        tstr = \"long\";\n        goto add_tstr;\n    case VT_LLONG:\n        tstr = \"long long\";\n        goto add_tstr;\n    case VT_FLOAT:\n        tstr = \"float\";\n        goto add_tstr;\n    case VT_DOUBLE:\n        tstr = \"double\";\n        goto add_tstr;\n    case VT_LDOUBLE:\n        tstr = \"long double\";\n    add_tstr:\n        pstrcat(buf, buf_size, tstr);\n        break;\n    case VT_ENUM:\n    case VT_STRUCT:\n        if (bt == VT_STRUCT)\n            tstr = \"struct \";\n        else\n            tstr = \"enum \";\n        pstrcat(buf, buf_size, tstr);\n        v = type->ref->v & ~SYM_STRUCT;\n        if (v >= SYM_FIRST_ANOM)\n            pstrcat(buf, buf_size, \"<anonymous>\");\n        else\n            pstrcat(buf, buf_size, get_tok_str(v, NULL));\n        break;\n    case VT_FUNC:\n        s = type->ref;\n        type_to_str(buf, buf_size, &s->type, varstr);\n        pstrcat(buf, buf_size, \"(\");\n        sa = s->next;\n        while (sa != NULL) {\n            type_to_str(buf1, sizeof(buf1), &sa->type, NULL);\n            pstrcat(buf, buf_size, buf1);\n            sa = sa->next;\n            if (sa)\n                pstrcat(buf, buf_size, \", \");\n        }\n        pstrcat(buf, buf_size, \")\");\n        goto no_var;\n    case VT_PTR:\n        s = type->ref;\n        pstrcpy(buf1, sizeof(buf1), \"*\");\n        if (varstr)\n            pstrcat(buf1, sizeof(buf1), varstr);\n        type_to_str(buf, buf_size, &s->type, buf1);\n        goto no_var;\n    }\n    if (varstr) {\n        pstrcat(buf, buf_size, \" \");\n        pstrcat(buf, buf_size, varstr);\n    }\n no_var: ;\n}\n\n/* verify type compatibility to store vtop in 'dt' type, and generate\n   casts if needed. */\nstatic void gen_assign_cast(CType *dt)\n{\n    CType *st, *type1, *type2, tmp_type1, tmp_type2;\n    char buf1[256], buf2[256];\n    int dbt, sbt;\n\n    st = &vtop->type; /* source type */\n    dbt = dt->t & VT_BTYPE;\n    sbt = st->t & VT_BTYPE;\n    if (sbt == VT_VOID)\n        tcc_error(\"Cannot assign void value\");\n    if (dt->t & VT_CONSTANT)\n        tcc_warning(\"assignment of read-only location\");\n    switch(dbt) {\n    case VT_PTR:\n        /* special cases for pointers */\n        /* '0' can also be a pointer */\n        if (is_null_pointer(vtop))\n            goto type_ok;\n        /* accept implicit pointer to integer cast with warning */\n        if (is_integer_btype(sbt)) {\n            tcc_warning(\"assignment makes pointer from integer without a cast\");\n            goto type_ok;\n        }\n        type1 = pointed_type(dt);\n        /* a function is implicitely a function pointer */\n        if (sbt == VT_FUNC) {\n            if ((type1->t & VT_BTYPE) != VT_VOID &&\n                !is_compatible_types(pointed_type(dt), st))\n                tcc_warning(\"assignment from incompatible pointer type\");\n            goto type_ok;\n        }\n        if (sbt != VT_PTR)\n            goto error;\n        type2 = pointed_type(st);\n        if ((type1->t & VT_BTYPE) == VT_VOID || \n            (type2->t & VT_BTYPE) == VT_VOID) {\n            /* void * can match anything */\n        } else {\n            /* exact type match, except for unsigned */\n            tmp_type1 = *type1;\n            tmp_type2 = *type2;\n            tmp_type1.t &= ~(VT_UNSIGNED | VT_CONSTANT | VT_VOLATILE);\n            tmp_type2.t &= ~(VT_UNSIGNED | VT_CONSTANT | VT_VOLATILE);\n            if (!is_compatible_types(&tmp_type1, &tmp_type2))\n                tcc_warning(\"assignment from incompatible pointer type\");\n        }\n        /* check const and volatile */\n        if ((!(type1->t & VT_CONSTANT) && (type2->t & VT_CONSTANT)) ||\n            (!(type1->t & VT_VOLATILE) && (type2->t & VT_VOLATILE)))\n            tcc_warning(\"assignment discards qualifiers from pointer target type\");\n        break;\n    case VT_BYTE:\n    case VT_SHORT:\n    case VT_INT:\n    case VT_LLONG:\n        if (sbt == VT_PTR || sbt == VT_FUNC) {\n            tcc_warning(\"assignment makes integer from pointer without a cast\");\n        }\n        /* XXX: more tests */\n        break;\n    case VT_STRUCT:\n        tmp_type1 = *dt;\n        tmp_type2 = *st;\n        tmp_type1.t &= ~(VT_CONSTANT | VT_VOLATILE);\n        tmp_type2.t &= ~(VT_CONSTANT | VT_VOLATILE);\n        if (!is_compatible_types(&tmp_type1, &tmp_type2)) {\n        error:\n            type_to_str(buf1, sizeof(buf1), st, NULL);\n            type_to_str(buf2, sizeof(buf2), dt, NULL);\n            tcc_error(\"cannot cast '%s' to '%s'\", buf1, buf2);\n        }\n        break;\n    }\n type_ok:\n    gen_cast(dt);\n}\n\n/* store vtop in lvalue pushed on stack */\nST_FUNC void vstore(void)\n{\n    int sbt, dbt, ft, r, t, size, align, bit_size, bit_pos, rc, delayed_cast;\n\n    ft = vtop[-1].type.t;\n    sbt = vtop->type.t & VT_BTYPE;\n    dbt = ft & VT_BTYPE;\n    if ((((sbt == VT_INT || sbt == VT_SHORT) && dbt == VT_BYTE) ||\n         (sbt == VT_INT && dbt == VT_SHORT))\n\t&& !(vtop->type.t & VT_BITFIELD)) {\n        /* optimize char/short casts */\n        delayed_cast = VT_MUSTCAST;\n        vtop->type.t = ft & (VT_TYPE & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT)));\n        /* XXX: factorize */\n        if (ft & VT_CONSTANT)\n            tcc_warning(\"assignment of read-only location\");\n    } else {\n        delayed_cast = 0;\n        if (!(ft & VT_BITFIELD))\n            gen_assign_cast(&vtop[-1].type);\n    }\n\n    if (sbt == VT_STRUCT) {\n        /* if structure, only generate pointer */\n        /* structure assignment : generate memcpy */\n        /* XXX: optimize if small size */\n        if (!nocode_wanted) {\n            size = type_size(&vtop->type, &align);\n\n            /* destination */\n            vswap();\n            vtop->type.t = VT_PTR;\n            gaddrof();\n\n            /* address of memcpy() */\n#ifdef TCC_ARM_EABI\n            if(!(align & 7))\n                vpush_global_sym(&func_old_type, TOK_memcpy8);\n            else if(!(align & 3))\n                vpush_global_sym(&func_old_type, TOK_memcpy4);\n            else\n#endif\n            vpush_global_sym(&func_old_type, TOK_memcpy);\n\n            vswap();\n            /* source */\n            vpushv(vtop - 2);\n            vtop->type.t = VT_PTR;\n            gaddrof();\n            /* type size */\n            vpushi(size);\n            gfunc_call(3);\n        } else {\n            vswap();\n            vpop();\n        }\n        /* leave source on stack */\n    } else if (ft & VT_BITFIELD) {\n        /* bitfield store handling */\n        bit_pos = (ft >> VT_STRUCT_SHIFT) & 0x3f;\n        bit_size = (ft >> (VT_STRUCT_SHIFT + 6)) & 0x3f;\n        /* remove bit field info to avoid loops */\n        vtop[-1].type.t = ft & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));\n\n        /* duplicate source into other register */\n        gv_dup();\n        vswap();\n        vrott(3);\n\n        if((ft & VT_BTYPE) == VT_BOOL) {\n            gen_cast(&vtop[-1].type);\n            vtop[-1].type.t = (vtop[-1].type.t & ~VT_BTYPE) | (VT_BYTE | VT_UNSIGNED);\n        }\n\n        /* duplicate destination */\n        vdup();\n        vtop[-1] = vtop[-2];\n\n        /* mask and shift source */\n        if((ft & VT_BTYPE) != VT_BOOL) {\n            if((ft & VT_BTYPE) == VT_LLONG) {\n                vpushll((1ULL << bit_size) - 1ULL);\n            } else {\n                vpushi((1 << bit_size) - 1);\n            }\n            gen_op('&');\n        }\n        vpushi(bit_pos);\n        gen_op(TOK_SHL);\n        /* load destination, mask and or with source */\n        vswap();\n        if((ft & VT_BTYPE) == VT_LLONG) {\n            vpushll(~(((1ULL << bit_size) - 1ULL) << bit_pos));\n        } else {\n            vpushi(~(((1 << bit_size) - 1) << bit_pos));\n        }\n        gen_op('&');\n        gen_op('|');\n        /* store result */\n        vstore();\n\n        /* pop off shifted source from \"duplicate source...\" above */\n        vpop();\n\n    } else {\n#ifdef CONFIG_TCC_BCHECK\n        /* bound check case */\n        if (vtop[-1].r & VT_MUSTBOUND) {\n            vswap();\n            gbound();\n            vswap();\n        }\n#endif\n        if (!nocode_wanted) {\n            rc = RC_INT;\n            if (is_float(ft)) {\n                rc = RC_FLOAT;\n#ifdef TCC_TARGET_X86_64\n                if ((ft & VT_BTYPE) == VT_LDOUBLE) {\n                    rc = RC_ST0;\n                }\n#endif\n            }\n            r = gv(rc);  /* generate value */\n            /* if lvalue was saved on stack, must read it */\n            if ((vtop[-1].r & VT_VALMASK) == VT_LLOCAL) {\n                SValue sv;\n                t = get_reg(RC_INT);\n#ifdef TCC_TARGET_X86_64\n                sv.type.t = VT_PTR;\n#else\n                sv.type.t = VT_INT;\n#endif\n                sv.r = VT_LOCAL | VT_LVAL;\n                sv.c.ul = vtop[-1].c.ul;\n                load(t, &sv);\n                vtop[-1].r = t | VT_LVAL;\n            }\n            store(r, vtop - 1);\n#ifndef TCC_TARGET_X86_64\n            /* two word case handling : store second register at word + 4 */\n            if ((ft & VT_BTYPE) == VT_LLONG) {\n                vswap();\n                /* convert to int to increment easily */\n                vtop->type.t = VT_INT;\n                gaddrof();\n                vpushi(4);\n                gen_op('+');\n                vtop->r |= VT_LVAL;\n                vswap();\n                /* XXX: it works because r2 is spilled last ! */\n                store(vtop->r2, vtop - 1);\n            }\n#endif\n        }\n        vswap();\n        vtop--; /* NOT vpop() because on x86 it would flush the fp stack */\n        vtop->r |= delayed_cast;\n    }\n}\n\n/* post defines POST/PRE add. c is the token ++ or -- */\nST_FUNC void inc(int post, int c)\n{\n    test_lvalue();\n    vdup(); /* save lvalue */\n    if (post) {\n        gv_dup(); /* duplicate value */\n        vrotb(3);\n        vrotb(3);\n    }\n    /* add constant */\n    vpushi(c - TOK_MID); \n    gen_op('+');\n    vstore(); /* store value */\n    if (post)\n        vpop(); /* if post op, return saved value */\n}\n\n/* Parse GNUC __attribute__ extension. Currently, the following\n   extensions are recognized:\n   - aligned(n) : set data/function alignment.\n   - packed : force data alignment to 1\n   - section(x) : generate data/code in this section.\n   - unused : currently ignored, but may be used someday.\n   - regparm(n) : pass function parameters in registers (i386 only)\n */\nstatic void parse_attribute(AttributeDef *ad)\n{\n    int t, n;\n    \n    while (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2) {\n    next();\n    skip('(');\n    skip('(');\n    while (tok != ')') {\n        if (tok < TOK_IDENT)\n            expect(\"attribute name\");\n        t = tok;\n        next();\n        switch(t) {\n        case TOK_SECTION1:\n        case TOK_SECTION2:\n            skip('(');\n            if (tok != TOK_STR)\n                expect(\"section name\");\n            ad->section = find_section(tcc_state, (char *)tokc.cstr->data);\n            next();\n            skip(')');\n            break;\n        case TOK_ALIAS1:\n        case TOK_ALIAS2:\n            skip('(');\n            if (tok != TOK_STR)\n                expect(\"alias(\\\"target\\\")\");\n            ad->alias_target = /* save string as token, for later */\n              tok_alloc((char*)tokc.cstr->data, tokc.cstr->size-1)->tok;\n            next();\n            skip(')');\n            break;\n        case TOK_ALIGNED1:\n        case TOK_ALIGNED2:\n            if (tok == '(') {\n                next();\n                n = expr_const();\n                if (n <= 0 || (n & (n - 1)) != 0) \n                    tcc_error(\"alignment must be a positive power of two\");\n                skip(')');\n            } else {\n                n = MAX_ALIGN;\n            }\n            ad->aligned = n;\n            break;\n        case TOK_PACKED1:\n        case TOK_PACKED2:\n            ad->packed = 1;\n            break;\n        case TOK_WEAK1:\n        case TOK_WEAK2:\n            ad->weak = 1;\n            break;\n        case TOK_UNUSED1:\n        case TOK_UNUSED2:\n            /* currently, no need to handle it because tcc does not\n               track unused objects */\n            break;\n        case TOK_NORETURN1:\n        case TOK_NORETURN2:\n            /* currently, no need to handle it because tcc does not\n               track unused objects */\n            break;\n        case TOK_CDECL1:\n        case TOK_CDECL2:\n        case TOK_CDECL3:\n            ad->func_call = FUNC_CDECL;\n            break;\n        case TOK_STDCALL1:\n        case TOK_STDCALL2:\n        case TOK_STDCALL3:\n            ad->func_call = FUNC_STDCALL;\n            break;\n#ifdef TCC_TARGET_I386\n        case TOK_REGPARM1:\n        case TOK_REGPARM2:\n            skip('(');\n            n = expr_const();\n            if (n > 3) \n                n = 3;\n            else if (n < 0)\n                n = 0;\n            if (n > 0)\n                ad->func_call = FUNC_FASTCALL1 + n - 1;\n            skip(')');\n            break;\n        case TOK_FASTCALL1:\n        case TOK_FASTCALL2:\n        case TOK_FASTCALL3:\n            ad->func_call = FUNC_FASTCALLW;\n            break;            \n#endif\n        case TOK_MODE:\n            skip('(');\n            switch(tok) {\n                case TOK_MODE_DI:\n                    ad->mode = VT_LLONG + 1;\n                    break;\n                case TOK_MODE_HI:\n                    ad->mode = VT_SHORT + 1;\n                    break;\n                case TOK_MODE_SI:\n                    ad->mode = VT_INT + 1;\n                    break;\n                default:\n                    tcc_warning(\"__mode__(%s) not supported\\n\", get_tok_str(tok, NULL));\n                    break;\n            }\n            next();\n            skip(')');\n            break;\n        case TOK_DLLEXPORT:\n            ad->func_export = 1;\n            break;\n        case TOK_DLLIMPORT:\n            ad->func_import = 1;\n            break;\n        default:\n            if (tcc_state->warn_unsupported)\n                tcc_warning(\"'%s' attribute ignored\", get_tok_str(t, NULL));\n            /* skip parameters */\n            if (tok == '(') {\n                int parenthesis = 0;\n                do {\n                    if (tok == '(') \n                        parenthesis++;\n                    else if (tok == ')') \n                        parenthesis--;\n                    next();\n                } while (parenthesis && tok != -1);\n            }\n            break;\n        }\n        if (tok != ',')\n            break;\n        next();\n    }\n    skip(')');\n    skip(')');\n    }\n}\n\n/* enum/struct/union declaration. u is either VT_ENUM or VT_STRUCT */\nstatic void struct_decl(CType *type, int u)\n{\n    int a, v, size, align, maxalign, c, offset;\n    int bit_size, bit_pos, bsize, bt, lbit_pos, prevbt;\n    Sym *s, *ss, *ass, **ps;\n    AttributeDef ad;\n    CType type1, btype;\n\n    a = tok; /* save decl type */\n    next();\n    if (tok != '{') {\n        v = tok;\n        next();\n        /* struct already defined ? return it */\n        if (v < TOK_IDENT)\n            expect(\"struct/union/enum name\");\n        s = struct_find(v);\n        if (s) {\n            if (s->type.t != a)\n                tcc_error(\"invalid type\");\n            goto do_decl;\n        }\n    } else {\n        v = anon_sym++;\n    }\n    type1.t = a;\n    /* we put an undefined size for struct/union */\n    s = sym_push(v | SYM_STRUCT, &type1, 0, -1);\n    s->r = 0; /* default alignment is zero as gcc */\n    /* put struct/union/enum name in type */\n do_decl:\n    type->t = u;\n    type->ref = s;\n    \n    if (tok == '{') {\n        next();\n        if (s->c != -1)\n            tcc_error(\"struct/union/enum already defined\");\n        /* cannot be empty */\n        c = 0;\n        /* non empty enums are not allowed */\n        if (a == TOK_ENUM) {\n            for(;;) {\n                v = tok;\n                if (v < TOK_UIDENT)\n                    expect(\"identifier\");\n                next();\n                if (tok == '=') {\n                    next();\n                    c = expr_const();\n                }\n                /* enum symbols have static storage */\n                ss = sym_push(v, &int_type, VT_CONST, c);\n                ss->type.t |= VT_STATIC;\n                if (tok != ',')\n                    break;\n                next();\n                c++;\n                /* NOTE: we accept a trailing comma */\n                if (tok == '}')\n                    break;\n            }\n            skip('}');\n        } else {\n            maxalign = 1;\n            ps = &s->next;\n            prevbt = VT_INT;\n            bit_pos = 0;\n            offset = 0;\n            while (tok != '}') {\n                parse_btype(&btype, &ad);\n                while (1) {\n                    bit_size = -1;\n                    v = 0;\n                    type1 = btype;\n                    if (tok != ':') {\n                        type_decl(&type1, &ad, &v, TYPE_DIRECT | TYPE_ABSTRACT);\n                        if (v == 0 && (type1.t & VT_BTYPE) != VT_STRUCT)\n                            expect(\"identifier\");\n                        if ((type1.t & VT_BTYPE) == VT_FUNC ||\n                            (type1.t & (VT_TYPEDEF | VT_STATIC | VT_EXTERN | VT_INLINE)))\n                            tcc_error(\"invalid type for '%s'\", \n                                  get_tok_str(v, NULL));\n                    }\n                    if (tok == ':') {\n                        next();\n                        bit_size = expr_const();\n                        /* XXX: handle v = 0 case for messages */\n                        if (bit_size < 0)\n                            tcc_error(\"negative width in bit-field '%s'\", \n                                  get_tok_str(v, NULL));\n                        if (v && bit_size == 0)\n                            tcc_error(\"zero width for bit-field '%s'\", \n                                  get_tok_str(v, NULL));\n                    }\n                    size = type_size(&type1, &align);\n                    if (ad.aligned) {\n                        if (align < ad.aligned)\n                            align = ad.aligned;\n                    } else if (ad.packed) {\n                        align = 1;\n                    } else if (*tcc_state->pack_stack_ptr) {\n                        if (align > *tcc_state->pack_stack_ptr)\n                            align = *tcc_state->pack_stack_ptr;\n                    }\n                    lbit_pos = 0;\n                    if (bit_size >= 0) {\n                        bt = type1.t & VT_BTYPE;\n                        if (bt != VT_INT && \n                            bt != VT_BYTE && \n                            bt != VT_SHORT &&\n                            bt != VT_BOOL &&\n                            bt != VT_ENUM &&\n                            bt != VT_LLONG)\n                            tcc_error(\"bitfields must have scalar type\");\n                        bsize = size * 8;\n                        if (bit_size > bsize) {\n                            tcc_error(\"width of '%s' exceeds its type\",\n                                  get_tok_str(v, NULL));\n                        } else if (bit_size == bsize) {\n                            /* no need for bit fields */\n                            bit_pos = 0;\n                        } else if (bit_size == 0) {\n                            /* XXX: what to do if only padding in a\n                               structure ? */\n                            /* zero size: means to pad */\n                            bit_pos = 0;\n                        } else {\n                            /* we do not have enough room ?\n                               did the type change?\n                               is it a union? */\n                            if ((bit_pos + bit_size) > bsize ||\n                                bt != prevbt || a == TOK_UNION)\n                                bit_pos = 0;\n                            lbit_pos = bit_pos;\n                            /* XXX: handle LSB first */\n                            type1.t |= VT_BITFIELD | \n                                (bit_pos << VT_STRUCT_SHIFT) |\n                                (bit_size << (VT_STRUCT_SHIFT + 6));\n                            bit_pos += bit_size;\n                        }\n                        prevbt = bt;\n                    } else {\n                        bit_pos = 0;\n                    }\n                    if (v != 0 || (type1.t & VT_BTYPE) == VT_STRUCT) {\n                        /* add new memory data only if starting\n                           bit field */\n                        if (lbit_pos == 0) {\n                            if (a == TOK_STRUCT) {\n                                c = (c + align - 1) & -align;\n                                offset = c;\n                                if (size > 0)\n                                    c += size;\n                            } else {\n                                offset = 0;\n                                if (size > c)\n                                    c = size;\n                            }\n                            if (align > maxalign)\n                                maxalign = align;\n                        }\n#if 0\n                        printf(\"add field %s offset=%d\", \n                               get_tok_str(v, NULL), offset);\n                        if (type1.t & VT_BITFIELD) {\n                            printf(\" pos=%d size=%d\", \n                                   (type1.t >> VT_STRUCT_SHIFT) & 0x3f,\n                                   (type1.t >> (VT_STRUCT_SHIFT + 6)) & 0x3f);\n                        }\n                        printf(\"\\n\");\n#endif\n                    }\n                    if (v == 0 && (type1.t & VT_BTYPE) == VT_STRUCT) {\n                        ass = type1.ref;\n                        while ((ass = ass->next) != NULL) {\n                           ss = sym_push(ass->v, &ass->type, 0, offset + ass->c);\n                           *ps = ss;\n                           ps = &ss->next;\n                        }\n                    } else if (v) {\n                        ss = sym_push(v | SYM_FIELD, &type1, 0, offset);\n                        *ps = ss;\n                        ps = &ss->next;\n                    }\n                    if (tok == ';' || tok == TOK_EOF)\n                        break;\n                    skip(',');\n                }\n                skip(';');\n            }\n            skip('}');\n            /* store size and alignment */\n            s->c = (c + maxalign - 1) & -maxalign; \n            s->r = maxalign;\n        }\n    }\n}\n\n/* return 0 if no type declaration. otherwise, return the basic type\n   and skip it. \n */\nstatic int parse_btype(CType *type, AttributeDef *ad)\n{\n    int t, u, type_found, typespec_found, typedef_found;\n    Sym *s;\n    CType type1;\n\n    memset(ad, 0, sizeof(AttributeDef));\n    type_found = 0;\n    typespec_found = 0;\n    typedef_found = 0;\n    t = 0;\n    while(1) {\n        switch(tok) {\n        case TOK_EXTENSION:\n            /* currently, we really ignore extension */\n            next();\n            continue;\n\n            /* basic types */\n        case TOK_CHAR:\n            u = VT_BYTE;\n        basic_type:\n            next();\n        basic_type1:\n            if ((t & VT_BTYPE) != 0)\n                tcc_error(\"too many basic types\");\n            t |= u;\n            typespec_found = 1;\n            break;\n        case TOK_VOID:\n            u = VT_VOID;\n            goto basic_type;\n        case TOK_SHORT:\n            u = VT_SHORT;\n            goto basic_type;\n        case TOK_INT:\n            next();\n            typespec_found = 1;\n            break;\n        case TOK_LONG:\n            next();\n            if ((t & VT_BTYPE) == VT_DOUBLE) {\n#ifndef TCC_TARGET_PE\n                t = (t & ~VT_BTYPE) | VT_LDOUBLE;\n#endif\n            } else if ((t & VT_BTYPE) == VT_LONG) {\n                t = (t & ~VT_BTYPE) | VT_LLONG;\n            } else {\n                u = VT_LONG;\n                goto basic_type1;\n            }\n            break;\n        case TOK_BOOL:\n            u = VT_BOOL;\n            goto basic_type;\n        case TOK_FLOAT:\n            u = VT_FLOAT;\n            goto basic_type;\n        case TOK_DOUBLE:\n            next();\n            if ((t & VT_BTYPE) == VT_LONG) {\n#ifdef TCC_TARGET_PE\n                t = (t & ~VT_BTYPE) | VT_DOUBLE;\n#else\n                t = (t & ~VT_BTYPE) | VT_LDOUBLE;\n#endif\n            } else {\n                u = VT_DOUBLE;\n                goto basic_type1;\n            }\n            break;\n        case TOK_ENUM:\n            struct_decl(&type1, VT_ENUM);\n        basic_type2:\n            u = type1.t;\n            type->ref = type1.ref;\n            goto basic_type1;\n        case TOK_STRUCT:\n        case TOK_UNION:\n            struct_decl(&type1, VT_STRUCT);\n            goto basic_type2;\n\n            /* type modifiers */\n        case TOK_CONST1:\n        case TOK_CONST2:\n        case TOK_CONST3:\n            t |= VT_CONSTANT;\n            next();\n            break;\n        case TOK_VOLATILE1:\n        case TOK_VOLATILE2:\n        case TOK_VOLATILE3:\n            t |= VT_VOLATILE;\n            next();\n            break;\n        case TOK_SIGNED1:\n        case TOK_SIGNED2:\n        case TOK_SIGNED3:\n            typespec_found = 1;\n            t |= VT_SIGNED;\n            next();\n            break;\n        case TOK_REGISTER:\n        case TOK_AUTO:\n        case TOK_RESTRICT1:\n        case TOK_RESTRICT2:\n        case TOK_RESTRICT3:\n            next();\n            break;\n        case TOK_UNSIGNED:\n            t |= VT_UNSIGNED;\n            next();\n            typespec_found = 1;\n            break;\n\n            /* storage */\n        case TOK_EXTERN:\n            t |= VT_EXTERN;\n            next();\n            break;\n        case TOK_STATIC:\n            t |= VT_STATIC;\n            next();\n            break;\n        case TOK_TYPEDEF:\n            t |= VT_TYPEDEF;\n            next();\n            break;\n        case TOK_INLINE1:\n        case TOK_INLINE2:\n        case TOK_INLINE3:\n            t |= VT_INLINE;\n            next();\n            break;\n\n            /* GNUC attribute */\n        case TOK_ATTRIBUTE1:\n        case TOK_ATTRIBUTE2:\n            parse_attribute(ad);\n            if (ad->mode) {\n                u = ad->mode -1;\n                t = (t & ~VT_BTYPE) | u;\n            }\n            break;\n            /* GNUC typeof */\n        case TOK_TYPEOF1:\n        case TOK_TYPEOF2:\n        case TOK_TYPEOF3:\n            next();\n            parse_expr_type(&type1);\n            /* remove all storage modifiers except typedef */\n            type1.t &= ~(VT_STORAGE&~VT_TYPEDEF);\n            goto basic_type2;\n        default:\n            if (typespec_found || typedef_found)\n                goto the_end;\n            s = sym_find(tok);\n            if (!s || !(s->type.t & VT_TYPEDEF))\n                goto the_end;\n            typedef_found = 1;\n            t |= (s->type.t & ~VT_TYPEDEF);\n            type->ref = s->type.ref;\n            if (s->r) {\n                /* get attributes from typedef */\n                if (0 == ad->aligned)\n                    ad->aligned = FUNC_ALIGN(s->r);\n                if (0 == ad->func_call)\n                    ad->func_call = FUNC_CALL(s->r);\n                ad->packed |= FUNC_PACKED(s->r);\n            }\n            next();\n            typespec_found = 1;\n            break;\n        }\n        type_found = 1;\n    }\nthe_end:\n    if ((t & (VT_SIGNED|VT_UNSIGNED)) == (VT_SIGNED|VT_UNSIGNED))\n        tcc_error(\"signed and unsigned modifier\");\n    if (tcc_state->char_is_unsigned) {\n        if ((t & (VT_SIGNED|VT_UNSIGNED|VT_BTYPE)) == VT_BYTE)\n            t |= VT_UNSIGNED;\n    }\n    t &= ~VT_SIGNED;\n\n    /* long is never used as type */\n    if ((t & VT_BTYPE) == VT_LONG)\n#if !defined TCC_TARGET_X86_64 || defined TCC_TARGET_PE\n        t = (t & ~VT_BTYPE) | VT_INT;\n#else\n        t = (t & ~VT_BTYPE) | VT_LLONG;\n#endif\n    type->t = t;\n    return type_found;\n}\n\n/* convert a function parameter type (array to pointer and function to\n   function pointer) */\nstatic inline void convert_parameter_type(CType *pt)\n{\n    /* remove const and volatile qualifiers (XXX: const could be used\n       to indicate a const function parameter */\n    pt->t &= ~(VT_CONSTANT | VT_VOLATILE);\n    /* array must be transformed to pointer according to ANSI C */\n    pt->t &= ~VT_ARRAY;\n    if ((pt->t & VT_BTYPE) == VT_FUNC) {\n        mk_pointer(pt);\n    }\n}\n\nST_FUNC void parse_asm_str(CString *astr)\n{\n    skip('(');\n    /* read the string */\n    if (tok != TOK_STR)\n        expect(\"string constant\");\n    cstr_new(astr);\n    while (tok == TOK_STR) {\n        /* XXX: add \\0 handling too ? */\n        cstr_cat(astr, tokc.cstr->data);\n        next();\n    }\n    cstr_ccat(astr, '\\0');\n}\n\n/* Parse an asm label and return the label\n * Don't forget to free the CString in the caller! */\nstatic void asm_label_instr(CString *astr)\n{\n    next();\n    parse_asm_str(astr);\n    skip(')');\n#ifdef ASM_DEBUG\n    printf(\"asm_alias: \\\"%s\\\"\\n\", (char *)astr->data);\n#endif\n}\n\nstatic void post_type(CType *type, AttributeDef *ad)\n{\n    int n, l, t1, arg_size, align;\n    Sym **plast, *s, *first;\n    AttributeDef ad1;\n    CType pt;\n\n    if (tok == '(') {\n        /* function declaration */\n        next();\n        l = 0;\n        first = NULL;\n        plast = &first;\n        arg_size = 0;\n        if (tok != ')') {\n            for(;;) {\n                /* read param name and compute offset */\n                if (l != FUNC_OLD) {\n                    if (!parse_btype(&pt, &ad1)) {\n                        if (l) {\n                            tcc_error(\"invalid type\");\n                        } else {\n                            l = FUNC_OLD;\n                            goto old_proto;\n                        }\n                    }\n                    l = FUNC_NEW;\n                    if ((pt.t & VT_BTYPE) == VT_VOID && tok == ')')\n                        break;\n                    type_decl(&pt, &ad1, &n, TYPE_DIRECT | TYPE_ABSTRACT);\n                    if ((pt.t & VT_BTYPE) == VT_VOID)\n                        tcc_error(\"parameter declared as void\");\n                    arg_size += (type_size(&pt, &align) + PTR_SIZE - 1) / PTR_SIZE;\n                } else {\n                old_proto:\n                    n = tok;\n                    if (n < TOK_UIDENT)\n                        expect(\"identifier\");\n                    pt.t = VT_INT;\n                    next();\n                }\n                convert_parameter_type(&pt);\n                s = sym_push(n | SYM_FIELD, &pt, 0, 0);\n                *plast = s;\n                plast = &s->next;\n                if (tok == ')')\n                    break;\n                skip(',');\n                if (l == FUNC_NEW && tok == TOK_DOTS) {\n                    l = FUNC_ELLIPSIS;\n                    next();\n                    break;\n                }\n            }\n        }\n        /* if no parameters, then old type prototype */\n        if (l == 0)\n            l = FUNC_OLD;\n        skip(')');\n        /* NOTE: const is ignored in returned type as it has a special\n           meaning in gcc / C++ */\n        type->t &= ~VT_CONSTANT; \n        /* some ancient pre-K&R C allows a function to return an array\n           and the array brackets to be put after the arguments, such \n           that \"int c()[]\" means something like \"int[] c()\" */\n        if (tok == '[') {\n            next();\n            skip(']'); /* only handle simple \"[]\" */\n            type->t |= VT_PTR;\n        }\n        /* we push a anonymous symbol which will contain the function prototype */\n        ad->func_args = arg_size;\n        s = sym_push(SYM_FIELD, type, INT_ATTR(ad), l);\n        s->next = first;\n        type->t = VT_FUNC;\n        type->ref = s;\n    } else if (tok == '[') {\n        /* array definition */\n        next();\n        if (tok == TOK_RESTRICT1)\n            next();\n        n = -1;\n        t1 = 0;\n        if (tok != ']') {\n            if (!local_stack || nocode_wanted)\n                 vpushi(expr_const());\n            else gexpr();\n            if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n                n = vtop->c.i;\n                if (n < 0)\n                    tcc_error(\"invalid array size\");\n            } else {\n                if (!is_integer_btype(vtop->type.t & VT_BTYPE))\n                    tcc_error(\"size of variable length array should be an integer\");\n                t1 = VT_VLA;\n            }\n        }\n        skip(']');\n        /* parse next post type */\n        post_type(type, ad);\n        t1 |= type->t & VT_VLA;\n        \n        if (t1 & VT_VLA) {\n            loc -= type_size(&int_type, &align);\n            loc &= -align;\n            n = loc;\n\n            vla_runtime_type_size(type, &align);\n            gen_op('*');\n            vset(&int_type, VT_LOCAL|VT_LVAL, loc);\n            vswap();\n            vstore();\n        }\n        if (n != -1)\n            vpop();\n                \n        /* we push an anonymous symbol which will contain the array\n           element type */\n        s = sym_push(SYM_FIELD, type, 0, n);\n        type->t = (t1 ? VT_VLA : VT_ARRAY) | VT_PTR;\n        type->ref = s;\n    }\n}\n\n/* Parse a type declaration (except basic type), and return the type\n   in 'type'. 'td' is a bitmask indicating which kind of type decl is\n   expected. 'type' should contain the basic type. 'ad' is the\n   attribute definition of the basic type. It can be modified by\n   type_decl(). \n */\nstatic void type_decl(CType *type, AttributeDef *ad, int *v, int td)\n{\n    Sym *s;\n    CType type1, *type2;\n    int qualifiers, storage;\n\n    while (tok == '*') {\n        qualifiers = 0;\n    redo:\n        next();\n        switch(tok) {\n        case TOK_CONST1:\n        case TOK_CONST2:\n        case TOK_CONST3:\n            qualifiers |= VT_CONSTANT;\n            goto redo;\n        case TOK_VOLATILE1:\n        case TOK_VOLATILE2:\n        case TOK_VOLATILE3:\n            qualifiers |= VT_VOLATILE;\n            goto redo;\n        case TOK_RESTRICT1:\n        case TOK_RESTRICT2:\n        case TOK_RESTRICT3:\n            goto redo;\n        }\n        mk_pointer(type);\n        type->t |= qualifiers;\n    }\n    \n    /* XXX: clarify attribute handling */\n    if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)\n        parse_attribute(ad);\n\n    /* recursive type */\n    /* XXX: incorrect if abstract type for functions (e.g. 'int ()') */\n    type1.t = 0; /* XXX: same as int */\n    if (tok == '(') {\n        next();\n        /* XXX: this is not correct to modify 'ad' at this point, but\n           the syntax is not clear */\n        if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)\n            parse_attribute(ad);\n        type_decl(&type1, ad, v, td);\n        skip(')');\n    } else {\n        /* type identifier */\n        if (tok >= TOK_IDENT && (td & TYPE_DIRECT)) {\n            *v = tok;\n            next();\n        } else {\n            if (!(td & TYPE_ABSTRACT))\n                expect(\"identifier\");\n            *v = 0;\n        }\n    }\n    storage = type->t & VT_STORAGE;\n    type->t &= ~VT_STORAGE;\n    if (storage & VT_STATIC) {\n        int saved_nocode_wanted = nocode_wanted;\n        nocode_wanted = 1;\n        post_type(type, ad);\n        nocode_wanted = saved_nocode_wanted;\n    } else\n        post_type(type, ad);\n    type->t |= storage;\n    if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)\n        parse_attribute(ad);\n    \n    if (!type1.t)\n        return;\n    /* append type at the end of type1 */\n    type2 = &type1;\n    for(;;) {\n        s = type2->ref;\n        type2 = &s->type;\n        if (!type2->t) {\n            *type2 = *type;\n            break;\n        }\n    }\n    *type = type1;\n}\n\n/* compute the lvalue VT_LVAL_xxx needed to match type t. */\nST_FUNC int lvalue_type(int t)\n{\n    int bt, r;\n    r = VT_LVAL;\n    bt = t & VT_BTYPE;\n    if (bt == VT_BYTE || bt == VT_BOOL)\n        r |= VT_LVAL_BYTE;\n    else if (bt == VT_SHORT)\n        r |= VT_LVAL_SHORT;\n    else\n        return r;\n    if (t & VT_UNSIGNED)\n        r |= VT_LVAL_UNSIGNED;\n    return r;\n}\n\n/* indirection with full error checking and bound check */\nST_FUNC void indir(void)\n{\n    if ((vtop->type.t & VT_BTYPE) != VT_PTR) {\n        if ((vtop->type.t & VT_BTYPE) == VT_FUNC)\n            return;\n        expect(\"pointer\");\n    }\n    if ((vtop->r & VT_LVAL) && !nocode_wanted)\n        gv(RC_INT);\n    vtop->type = *pointed_type(&vtop->type);\n    /* Arrays and functions are never lvalues */\n    if (!(vtop->type.t & VT_ARRAY) && !(vtop->type.t & VT_VLA)\n        && (vtop->type.t & VT_BTYPE) != VT_FUNC) {\n        vtop->r |= lvalue_type(vtop->type.t);\n        /* if bound checking, the referenced pointer must be checked */\n#ifdef CONFIG_TCC_BCHECK\n        if (tcc_state->do_bounds_check)\n            vtop->r |= VT_MUSTBOUND;\n#endif\n    }\n}\n\n/* pass a parameter to a function and do type checking and casting */\nstatic void gfunc_param_typed(Sym *func, Sym *arg)\n{\n    int func_type;\n    CType type;\n\n    func_type = func->c;\n    if (func_type == FUNC_OLD ||\n        (func_type == FUNC_ELLIPSIS && arg == NULL)) {\n        /* default casting : only need to convert float to double */\n        if ((vtop->type.t & VT_BTYPE) == VT_FLOAT) {\n            type.t = VT_DOUBLE;\n            gen_cast(&type);\n        }\n    } else if (arg == NULL) {\n        tcc_error(\"too many arguments to function\");\n    } else {\n        type = arg->type;\n        type.t &= ~VT_CONSTANT; /* need to do that to avoid false warning */\n        gen_assign_cast(&type);\n    }\n}\n\n/* parse an expression of the form '(type)' or '(expr)' and return its\n   type */\nstatic void parse_expr_type(CType *type)\n{\n    int n;\n    AttributeDef ad;\n\n    skip('(');\n    if (parse_btype(type, &ad)) {\n        type_decl(type, &ad, &n, TYPE_ABSTRACT);\n    } else {\n        expr_type(type);\n    }\n    skip(')');\n}\n\nstatic void parse_type(CType *type)\n{\n    AttributeDef ad;\n    int n;\n\n    if (!parse_btype(type, &ad)) {\n        expect(\"type\");\n    }\n    type_decl(type, &ad, &n, TYPE_ABSTRACT);\n}\n\nstatic void vpush_tokc(int t)\n{\n    CType type;\n    type.t = t;\n    type.ref = 0;\n    vsetc(&type, VT_CONST, &tokc);\n}\n\nST_FUNC void unary(void)\n{\n    int n, t, align, size, r, sizeof_caller;\n    CType type;\n    Sym *s;\n    AttributeDef ad;\n    static int in_sizeof = 0;\n\n    sizeof_caller = in_sizeof;\n    in_sizeof = 0;\n    /* XXX: GCC 2.95.3 does not generate a table although it should be\n       better here */\n tok_next:\n    switch(tok) {\n    case TOK_EXTENSION:\n        next();\n        goto tok_next;\n    case TOK_CINT:\n    case TOK_CCHAR: \n    case TOK_LCHAR:\n        vpushi(tokc.i);\n        next();\n        break;\n    case TOK_CUINT:\n        vpush_tokc(VT_INT | VT_UNSIGNED);\n        next();\n        break;\n    case TOK_CLLONG:\n        vpush_tokc(VT_LLONG);\n        next();\n        break;\n    case TOK_CULLONG:\n        vpush_tokc(VT_LLONG | VT_UNSIGNED);\n        next();\n        break;\n    case TOK_CFLOAT:\n        vpush_tokc(VT_FLOAT);\n        next();\n        break;\n    case TOK_CDOUBLE:\n        vpush_tokc(VT_DOUBLE);\n        next();\n        break;\n    case TOK_CLDOUBLE:\n        vpush_tokc(VT_LDOUBLE);\n        next();\n        break;\n    case TOK___FUNCTION__:\n        if (!gnu_ext)\n            goto tok_identifier;\n        /* fall thru */\n    case TOK___FUNC__:\n        {\n            void *ptr;\n            int len;\n            /* special function name identifier */\n            len = strlen(funcname) + 1;\n            /* generate char[len] type */\n            type.t = VT_BYTE;\n            mk_pointer(&type);\n            type.t |= VT_ARRAY;\n            type.ref->c = len;\n            vpush_ref(&type, data_section, data_section->data_offset, len);\n            ptr = section_ptr_add(data_section, len);\n            memcpy(ptr, funcname, len);\n            next();\n        }\n        break;\n    case TOK_LSTR:\n#ifdef TCC_TARGET_PE\n        t = VT_SHORT | VT_UNSIGNED;\n#else\n        t = VT_INT;\n#endif\n        goto str_init;\n    case TOK_STR:\n        /* string parsing */\n        t = VT_BYTE;\n    str_init:\n        if (tcc_state->warn_write_strings)\n            t |= VT_CONSTANT;\n        type.t = t;\n        mk_pointer(&type);\n        type.t |= VT_ARRAY;\n        memset(&ad, 0, sizeof(AttributeDef));\n        decl_initializer_alloc(&type, &ad, VT_CONST, 2, 0, NULL, 0);\n        break;\n    case '(':\n        next();\n        /* cast ? */\n        if (parse_btype(&type, &ad)) {\n            type_decl(&type, &ad, &n, TYPE_ABSTRACT);\n            skip(')');\n            /* check ISOC99 compound literal */\n            if (tok == '{') {\n                    /* data is allocated locally by default */\n                if (global_expr)\n                    r = VT_CONST;\n                else\n                    r = VT_LOCAL;\n                /* all except arrays are lvalues */\n                if (!(type.t & VT_ARRAY))\n                    r |= lvalue_type(type.t);\n                memset(&ad, 0, sizeof(AttributeDef));\n                decl_initializer_alloc(&type, &ad, r, 1, 0, NULL, 0);\n            } else {\n                if (sizeof_caller) {\n                    vpush(&type);\n                    return;\n                }\n                unary();\n                gen_cast(&type);\n            }\n        } else if (tok == '{') {\n            /* save all registers */\n            save_regs(0); \n            /* statement expression : we do not accept break/continue\n               inside as GCC does */\n            block(NULL, NULL, NULL, NULL, 0, 1);\n            skip(')');\n        } else {\n            gexpr();\n            skip(')');\n        }\n        break;\n    case '*':\n        next();\n        unary();\n        indir();\n        break;\n    case '&':\n        next();\n        unary();\n        /* functions names must be treated as function pointers,\n           except for unary '&' and sizeof. Since we consider that\n           functions are not lvalues, we only have to handle it\n           there and in function calls. */\n        /* arrays can also be used although they are not lvalues */\n        if ((vtop->type.t & VT_BTYPE) != VT_FUNC &&\n            !(vtop->type.t & VT_ARRAY) && !(vtop->type.t & VT_LLOCAL))\n            test_lvalue();\n        mk_pointer(&vtop->type);\n        gaddrof();\n        break;\n    case '!':\n        next();\n        unary();\n        if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n            CType boolean;\n            boolean.t = VT_BOOL;\n            gen_cast(&boolean);\n            vtop->c.i = !vtop->c.i;\n        } else if ((vtop->r & VT_VALMASK) == VT_CMP)\n            vtop->c.i = vtop->c.i ^ 1;\n        else {\n            save_regs(1);\n            vseti(VT_JMP, gtst(1, 0));\n        }\n        break;\n    case '~':\n        next();\n        unary();\n        vpushi(-1);\n        gen_op('^');\n        break;\n    case '+':\n        next();\n        /* in order to force cast, we add zero */\n        unary();\n        if ((vtop->type.t & VT_BTYPE) == VT_PTR)\n            tcc_error(\"pointer not accepted for unary plus\");\n        vpushi(0);\n        gen_op('+');\n        break;\n    case TOK_SIZEOF:\n    case TOK_ALIGNOF1:\n    case TOK_ALIGNOF2:\n        t = tok;\n        next();\n        in_sizeof++;\n        unary_type(&type); // Perform a in_sizeof = 0;\n        size = type_size(&type, &align);\n        if (t == TOK_SIZEOF) {\n            if (!(type.t & VT_VLA)) {\n                if (size < 0)\n                    tcc_error(\"sizeof applied to an incomplete type\");\n                vpushs(size);\n            } else {\n                vla_runtime_type_size(&type, &align);\n            }\n        } else {\n            vpushs(align);\n        }\n        vtop->type.t |= VT_UNSIGNED;\n        break;\n\n    case TOK_builtin_types_compatible_p:\n        {\n            CType type1, type2;\n            next();\n            skip('(');\n            parse_type(&type1);\n            skip(',');\n            parse_type(&type2);\n            skip(')');\n            type1.t &= ~(VT_CONSTANT | VT_VOLATILE);\n            type2.t &= ~(VT_CONSTANT | VT_VOLATILE);\n            vpushi(is_compatible_types(&type1, &type2));\n        }\n        break;\n    case TOK_builtin_constant_p:\n        {\n            int saved_nocode_wanted, res;\n            next();\n            skip('(');\n            saved_nocode_wanted = nocode_wanted;\n            nocode_wanted = 1;\n            gexpr();\n            res = (vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;\n            vpop();\n            nocode_wanted = saved_nocode_wanted;\n            skip(')');\n            vpushi(res);\n        }\n        break;\n    case TOK_builtin_frame_address:\n        {\n            int level;\n            CType type;\n            next();\n            skip('(');\n            if (tok != TOK_CINT || tokc.i < 0) {\n                tcc_error(\"__builtin_frame_address only takes positive integers\");\n            }\n            level = tokc.i;\n            next();\n            skip(')');\n            type.t = VT_VOID;\n            mk_pointer(&type);\n            vset(&type, VT_LOCAL, 0);       /* local frame */\n            while (level--) {\n                mk_pointer(&vtop->type);\n                indir();                    /* -> parent frame */\n            }\n        }\n        break;\n#ifdef TCC_TARGET_X86_64\n    case TOK_builtin_va_arg_types:\n        {\n            /* This definition must be synced with stdarg.h */\n            enum __va_arg_type {\n                __va_gen_reg, __va_float_reg, __va_stack\n            };\n            CType type;\n            int bt;\n            next();\n            skip('(');\n            parse_type(&type);\n            skip(')');\n            bt = type.t & VT_BTYPE;\n            if (bt == VT_STRUCT || bt == VT_LDOUBLE) {\n                vpushi(__va_stack);\n            } else if (bt == VT_FLOAT || bt == VT_DOUBLE) {\n                vpushi(__va_float_reg);\n            } else {\n                vpushi(__va_gen_reg);\n            }\n        }\n        break;\n#endif\n    case TOK_INC:\n    case TOK_DEC:\n        t = tok;\n        next();\n        unary();\n        inc(0, t);\n        break;\n    case '-':\n        next();\n        vpushi(0);\n        unary();\n        gen_op('-');\n        break;\n    case TOK_LAND:\n        if (!gnu_ext)\n            goto tok_identifier;\n        next();\n        /* allow to take the address of a label */\n        if (tok < TOK_UIDENT)\n            expect(\"label identifier\");\n        s = label_find(tok);\n        if (!s) {\n            s = label_push(&global_label_stack, tok, LABEL_FORWARD);\n        } else {\n            if (s->r == LABEL_DECLARED)\n                s->r = LABEL_FORWARD;\n        }\n        if (!s->type.t) {\n            s->type.t = VT_VOID;\n            mk_pointer(&s->type);\n            s->type.t |= VT_STATIC;\n        }\n        vset(&s->type, VT_CONST | VT_SYM, 0);\n        vtop->sym = s;\n        next();\n        break;\n    \n    // special qnan , snan and infinity values\n    case TOK___NAN__:\n        vpush64(VT_DOUBLE, 0x7ff8000000000000ULL);\n        next();\n        break;\n    case TOK___SNAN__:\n        vpush64(VT_DOUBLE, 0x7ff0000000000001ULL);\n        next();\n        break;\n    case TOK___INF__:\n        vpush64(VT_DOUBLE, 0x7ff0000000000000ULL);\n        next();\n        break;\n\n    default:\n    tok_identifier:\n        t = tok;\n        next();\n        if (t < TOK_UIDENT)\n            expect(\"identifier\");\n        s = sym_find(t);\n        if (!s) {\n            if (tok != '(')\n                tcc_error(\"'%s' undeclared\", get_tok_str(t, NULL));\n            /* for simple function calls, we tolerate undeclared\n               external reference to int() function */\n            if (tcc_state->warn_implicit_function_declaration)\n                tcc_warning(\"implicit declaration of function '%s'\",\n                        get_tok_str(t, NULL));\n            s = external_global_sym(t, &func_old_type, 0); \n        }\n        if ((s->type.t & (VT_STATIC | VT_INLINE | VT_BTYPE)) ==\n            (VT_STATIC | VT_INLINE | VT_FUNC)) {\n            /* if referencing an inline function, then we generate a\n               symbol to it if not already done. It will have the\n               effect to generate code for it at the end of the\n               compilation unit. Inline function as always\n               generated in the text section. */\n            if (!s->c)\n                put_extern_sym(s, text_section, 0, 0);\n            r = VT_SYM | VT_CONST;\n        } else {\n            r = s->r;\n        }\n        vset(&s->type, r, s->c);\n        /* if forward reference, we must point to s */\n        if (vtop->r & VT_SYM) {\n            vtop->sym = s;\n            vtop->c.ul = 0;\n        }\n        break;\n    }\n    \n    /* post operations */\n    while (1) {\n        if (tok == TOK_INC || tok == TOK_DEC) {\n            inc(1, tok);\n            next();\n        } else if (tok == '.' || tok == TOK_ARROW) {\n            int qualifiers;\n            /* field */ \n            if (tok == TOK_ARROW) \n                indir();\n            qualifiers = vtop->type.t & (VT_CONSTANT | VT_VOLATILE);\n            test_lvalue();\n            gaddrof();\n            next();\n            /* expect pointer on structure */\n            if ((vtop->type.t & VT_BTYPE) != VT_STRUCT)\n                expect(\"struct or union\");\n            s = vtop->type.ref;\n            /* find field */\n            tok |= SYM_FIELD;\n            while ((s = s->next) != NULL) {\n                if (s->v == tok)\n                    break;\n            }\n            if (!s)\n                tcc_error(\"field not found: %s\",  get_tok_str(tok & ~SYM_FIELD, NULL));\n            /* add field offset to pointer */\n            vtop->type = char_pointer_type; /* change type to 'char *' */\n            vpushi(s->c);\n            gen_op('+');\n            /* change type to field type, and set to lvalue */\n            vtop->type = s->type;\n            vtop->type.t |= qualifiers;\n            /* an array is never an lvalue */\n            if (!(vtop->type.t & VT_ARRAY)) {\n                vtop->r |= lvalue_type(vtop->type.t);\n#ifdef CONFIG_TCC_BCHECK\n                /* if bound checking, the referenced pointer must be checked */\n                if (tcc_state->do_bounds_check)\n                    vtop->r |= VT_MUSTBOUND;\n#endif\n            }\n            next();\n        } else if (tok == '[') {\n            next();\n            gexpr();\n            gen_op('+');\n            indir();\n            skip(']');\n        } else if (tok == '(') {\n            SValue ret;\n            Sym *sa;\n            int nb_args;\n\n            /* function call  */\n            if ((vtop->type.t & VT_BTYPE) != VT_FUNC) {\n                /* pointer test (no array accepted) */\n                if ((vtop->type.t & (VT_BTYPE | VT_ARRAY)) == VT_PTR) {\n                    vtop->type = *pointed_type(&vtop->type);\n                    if ((vtop->type.t & VT_BTYPE) != VT_FUNC)\n                        goto error_func;\n                } else {\n                error_func:\n                    expect(\"function pointer\");\n                }\n            } else {\n                vtop->r &= ~VT_LVAL; /* no lvalue */\n            }\n            /* get return type */\n            s = vtop->type.ref;\n            next();\n            sa = s->next; /* first parameter */\n            nb_args = 0;\n            ret.r2 = VT_CONST;\n            /* compute first implicit argument if a structure is returned */\n            if ((s->type.t & VT_BTYPE) == VT_STRUCT) {\n                /* get some space for the returned structure */\n                size = type_size(&s->type, &align);\n                loc = (loc - size) & -align;\n                ret.type = s->type;\n                ret.r = VT_LOCAL | VT_LVAL;\n                /* pass it as 'int' to avoid structure arg passing\n                   problems */\n                vseti(VT_LOCAL, loc);\n                ret.c = vtop->c;\n                nb_args++;\n            } else {\n                ret.type = s->type; \n                /* return in register */\n                if (is_float(ret.type.t)) {\n                    ret.r = reg_fret(ret.type.t);\n                } else {\n                    if ((ret.type.t & VT_BTYPE) == VT_LLONG)\n                        ret.r2 = REG_LRET;\n                    ret.r = REG_IRET;\n                }\n                ret.c.i = 0;\n            }\n            if (tok != ')') {\n                for(;;) {\n                    expr_eq();\n                    gfunc_param_typed(s, sa);\n                    nb_args++;\n                    if (sa)\n                        sa = sa->next;\n                    if (tok == ')')\n                        break;\n                    skip(',');\n                }\n            }\n            if (sa)\n                tcc_error(\"too few arguments to function\");\n            skip(')');\n            if (!nocode_wanted) {\n                gfunc_call(nb_args);\n            } else {\n                vtop -= (nb_args + 1);\n            }\n            /* return value */\n            vsetc(&ret.type, ret.r, &ret.c);\n            vtop->r2 = ret.r2;\n        } else {\n            break;\n        }\n    }\n}\n\nST_FUNC void expr_prod(void)\n{\n    int t;\n\n    unary();\n    while (tok == '*' || tok == '/' || tok == '%') {\n        t = tok;\n        next();\n        unary();\n        gen_op(t);\n    }\n}\n\nST_FUNC void expr_sum(void)\n{\n    int t;\n\n    expr_prod();\n    while (tok == '+' || tok == '-') {\n        t = tok;\n        next();\n        expr_prod();\n        gen_op(t);\n    }\n}\n\nstatic void expr_shift(void)\n{\n    int t;\n\n    expr_sum();\n    while (tok == TOK_SHL || tok == TOK_SAR) {\n        t = tok;\n        next();\n        expr_sum();\n        gen_op(t);\n    }\n}\n\nstatic void expr_cmp(void)\n{\n    int t;\n\n    expr_shift();\n    while ((tok >= TOK_ULE && tok <= TOK_GT) ||\n           tok == TOK_ULT || tok == TOK_UGE) {\n        t = tok;\n        next();\n        expr_shift();\n        gen_op(t);\n    }\n}\n\nstatic void expr_cmpeq(void)\n{\n    int t;\n\n    expr_cmp();\n    while (tok == TOK_EQ || tok == TOK_NE) {\n        t = tok;\n        next();\n        expr_cmp();\n        gen_op(t);\n    }\n}\n\nstatic void expr_and(void)\n{\n    expr_cmpeq();\n    while (tok == '&') {\n        next();\n        expr_cmpeq();\n        gen_op('&');\n    }\n}\n\nstatic void expr_xor(void)\n{\n    expr_and();\n    while (tok == '^') {\n        next();\n        expr_and();\n        gen_op('^');\n    }\n}\n\nstatic void expr_or(void)\n{\n    expr_xor();\n    while (tok == '|') {\n        next();\n        expr_xor();\n        gen_op('|');\n    }\n}\n\n/* XXX: fix this mess */\nstatic void expr_land_const(void)\n{\n    expr_or();\n    while (tok == TOK_LAND) {\n        next();\n        expr_or();\n        gen_op(TOK_LAND);\n    }\n}\n\n/* XXX: fix this mess */\nstatic void expr_lor_const(void)\n{\n    expr_land_const();\n    while (tok == TOK_LOR) {\n        next();\n        expr_land_const();\n        gen_op(TOK_LOR);\n    }\n}\n\n/* only used if non constant */\nstatic void expr_land(void)\n{\n    int t;\n\n    expr_or();\n    if (tok == TOK_LAND) {\n        t = 0;\n        save_regs(1);\n        for(;;) {\n            t = gtst(1, t);\n            if (tok != TOK_LAND) {\n                vseti(VT_JMPI, t);\n                break;\n            }\n            next();\n            expr_or();\n        }\n    }\n}\n\nstatic void expr_lor(void)\n{\n    int t;\n\n    expr_land();\n    if (tok == TOK_LOR) {\n        t = 0;\n        save_regs(1);\n        for(;;) {\n            t = gtst(0, t);\n            if (tok != TOK_LOR) {\n                vseti(VT_JMP, t);\n                break;\n            }\n            next();\n            expr_land();\n        }\n    }\n}\n\n/* XXX: better constant handling */\nstatic void expr_cond(void)\n{\n    int tt, u, r1, r2, rc, t1, t2, bt1, bt2;\n    SValue sv;\n    CType type, type1, type2;\n\n    if (const_wanted) {\n        expr_lor_const();\n        if (tok == '?') {\n            CType boolean;\n            int c;\n            boolean.t = VT_BOOL;\n            vdup();\n            gen_cast(&boolean);\n            c = vtop->c.i;\n            vpop();\n            next();\n            if (tok != ':' || !gnu_ext) {\n                vpop();\n                gexpr();\n            }\n            if (!c)\n                vpop();\n            skip(':');\n            expr_cond();\n            if (c)\n                vpop();\n        }\n    } else {\n        expr_lor();\n        if (tok == '?') {\n            next();\n            if (vtop != vstack) {\n                /* needed to avoid having different registers saved in\n                   each branch */\n                if (is_float(vtop->type.t)) {\n                    rc = RC_FLOAT;\n#ifdef TCC_TARGET_X86_64\n                    if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {\n                        rc = RC_ST0;\n                    }\n#endif\n                }\n                else\n                    rc = RC_INT;\n                    gv(rc);\n                    save_regs(1);\n            }\n            if (tok == ':' && gnu_ext) {\n                gv_dup();\n                tt = gtst(1, 0);\n            } else {\n                tt = gtst(1, 0);\n                gexpr();\n            }\n            type1 = vtop->type;\n            sv = *vtop; /* save value to handle it later */\n            vtop--; /* no vpop so that FP stack is not flushed */\n            skip(':');\n            u = gjmp(0);\n            gsym(tt);\n            expr_cond();\n            type2 = vtop->type;\n\n            t1 = type1.t;\n            bt1 = t1 & VT_BTYPE;\n            t2 = type2.t;\n            bt2 = t2 & VT_BTYPE;\n            /* cast operands to correct type according to ISOC rules */\n            if (is_float(bt1) || is_float(bt2)) {\n                if (bt1 == VT_LDOUBLE || bt2 == VT_LDOUBLE) {\n                    type.t = VT_LDOUBLE;\n                } else if (bt1 == VT_DOUBLE || bt2 == VT_DOUBLE) {\n                    type.t = VT_DOUBLE;\n                } else {\n                    type.t = VT_FLOAT;\n                }\n            } else if (bt1 == VT_LLONG || bt2 == VT_LLONG) {\n                /* cast to biggest op */\n                type.t = VT_LLONG;\n                /* convert to unsigned if it does not fit in a long long */\n                if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED) ||\n                    (t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED))\n                    type.t |= VT_UNSIGNED;\n            } else if (bt1 == VT_PTR || bt2 == VT_PTR) {\n\t\t/* If one is a null ptr constant the result type\n\t\t   is the other.  */\n\t\tif (is_null_pointer (vtop))\n\t\t  type = type1;\n\t\telse if (is_null_pointer (&sv))\n\t\t  type = type2;\n                /* XXX: test pointer compatibility, C99 has more elaborate\n\t\t   rules here.  */\n\t\telse\n\t\t  type = type1;\n            } else if (bt1 == VT_FUNC || bt2 == VT_FUNC) {\n                /* XXX: test function pointer compatibility */\n                type = bt1 == VT_FUNC ? type1 : type2;\n            } else if (bt1 == VT_STRUCT || bt2 == VT_STRUCT) {\n                /* XXX: test structure compatibility */\n                type = bt1 == VT_STRUCT ? type1 : type2;\n            } else if (bt1 == VT_VOID || bt2 == VT_VOID) {\n                /* NOTE: as an extension, we accept void on only one side */\n                type.t = VT_VOID;\n            } else {\n                /* integer operations */\n                type.t = VT_INT;\n                /* convert to unsigned if it does not fit in an integer */\n                if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_INT | VT_UNSIGNED) ||\n                    (t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_INT | VT_UNSIGNED))\n                    type.t |= VT_UNSIGNED;\n            }\n                \n            /* now we convert second operand */\n            gen_cast(&type);\n            if (VT_STRUCT == (vtop->type.t & VT_BTYPE))\n                gaddrof();\n            rc = RC_INT;\n            if (is_float(type.t)) {\n                rc = RC_FLOAT;\n#ifdef TCC_TARGET_X86_64\n                if ((type.t & VT_BTYPE) == VT_LDOUBLE) {\n                    rc = RC_ST0;\n                }\n#endif\n            } else if ((type.t & VT_BTYPE) == VT_LLONG) {\n                /* for long longs, we use fixed registers to avoid having\n                   to handle a complicated move */\n                rc = RC_IRET; \n            }\n            \n            r2 = gv(rc);\n            /* this is horrible, but we must also convert first\n               operand */\n            tt = gjmp(0);\n            gsym(u);\n            /* put again first value and cast it */\n            *vtop = sv;\n            gen_cast(&type);\n            if (VT_STRUCT == (vtop->type.t & VT_BTYPE))\n                gaddrof();\n            r1 = gv(rc);\n            move_reg(r2, r1);\n            vtop->r = r2;\n            gsym(tt);\n        }\n    }\n}\n\nstatic void expr_eq(void)\n{\n    int t;\n    \n    expr_cond();\n    if (tok == '=' ||\n        (tok >= TOK_A_MOD && tok <= TOK_A_DIV) ||\n        tok == TOK_A_XOR || tok == TOK_A_OR ||\n        tok == TOK_A_SHL || tok == TOK_A_SAR) {\n        test_lvalue();\n        t = tok;\n        next();\n        if (t == '=') {\n            expr_eq();\n        } else {\n            vdup();\n            expr_eq();\n            gen_op(t & 0x7f);\n        }\n        vstore();\n    }\n}\n\nST_FUNC void gexpr(void)\n{\n    while (1) {\n        expr_eq();\n        if (tok != ',')\n            break;\n        vpop();\n        next();\n    }\n}\n\n/* parse an expression and return its type without any side effect. */\nstatic void expr_type(CType *type)\n{\n    int saved_nocode_wanted;\n\n    saved_nocode_wanted = nocode_wanted;\n    nocode_wanted = 1;\n    gexpr();\n    *type = vtop->type;\n    vpop();\n    nocode_wanted = saved_nocode_wanted;\n}\n\n/* parse a unary expression and return its type without any side\n   effect. */\nstatic void unary_type(CType *type)\n{\n    int a;\n\n    a = nocode_wanted;\n    nocode_wanted = 1;\n    unary();\n    *type = vtop->type;\n    vpop();\n    nocode_wanted = a;\n}\n\n/* parse a constant expression and return value in vtop.  */\nstatic void expr_const1(void)\n{\n    int a;\n    a = const_wanted;\n    const_wanted = 1;\n    expr_cond();\n    const_wanted = a;\n}\n\n/* parse an integer constant and return its value. */\nST_FUNC int expr_const(void)\n{\n    int c;\n    expr_const1();\n    if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) != VT_CONST)\n        expect(\"constant expression\");\n    c = vtop->c.i;\n    vpop();\n    return c;\n}\n\n/* return the label token if current token is a label, otherwise\n   return zero */\nstatic int is_label(void)\n{\n    int last_tok;\n\n    /* fast test first */\n    if (tok < TOK_UIDENT)\n        return 0;\n    /* no need to save tokc because tok is an identifier */\n    last_tok = tok;\n    next();\n    if (tok == ':') {\n        next();\n        return last_tok;\n    } else {\n        unget_tok(last_tok);\n        return 0;\n    }\n}\n\nstatic void label_or_decl(int l)\n{\n    int last_tok;\n\n    /* fast test first */\n    if (tok >= TOK_UIDENT)\n      {\n\t/* no need to save tokc because tok is an identifier */\n\tlast_tok = tok;\n\tnext();\n\tif (tok == ':') {\n\t    unget_tok(last_tok);\n\t    return;\n\t}\n\tunget_tok(last_tok);\n      }\n    decl(l);\n}\n\nstatic void block(int *bsym, int *csym, int *case_sym, int *def_sym, \n                  int case_reg, int is_expr)\n{\n    int a, b, c, d;\n    Sym *s, *frame_bottom;\n\n    /* generate line number info */\n    if (tcc_state->do_debug &&\n        (last_line_num != file->line_num || last_ind != ind)) {\n        put_stabn(N_SLINE, 0, file->line_num, ind - func_ind);\n        last_ind = ind;\n        last_line_num = file->line_num;\n    }\n\n    if (is_expr) {\n        /* default return value is (void) */\n        vpushi(0);\n        vtop->type.t = VT_VOID;\n    }\n\n    if (tok == TOK_IF) {\n        /* if test */\n        next();\n        skip('(');\n        gexpr();\n        skip(')');\n        a = gtst(1, 0);\n        block(bsym, csym, case_sym, def_sym, case_reg, 0);\n        c = tok;\n        if (c == TOK_ELSE) {\n            next();\n            d = gjmp(0);\n            gsym(a);\n            block(bsym, csym, case_sym, def_sym, case_reg, 0);\n            gsym(d); /* patch else jmp */\n        } else\n            gsym(a);\n    } else if (tok == TOK_WHILE) {\n        next();\n        d = ind;\n        skip('(');\n        gexpr();\n        skip(')');\n        a = gtst(1, 0);\n        b = 0;\n        block(&a, &b, case_sym, def_sym, case_reg, 0);\n        gjmp_addr(d);\n        gsym(a);\n        gsym_addr(b, d);\n    } else if (tok == '{') {\n        Sym *llabel;\n        \n        next();\n        /* record local declaration stack position */\n        s = local_stack;\n        frame_bottom = sym_push2(&local_stack, SYM_FIELD, 0, 0);\n        frame_bottom->next = scope_stack_bottom;\n        scope_stack_bottom = frame_bottom;\n        llabel = local_label_stack;\n        /* handle local labels declarations */\n        if (tok == TOK_LABEL) {\n            next();\n            for(;;) {\n                if (tok < TOK_UIDENT)\n                    expect(\"label identifier\");\n                label_push(&local_label_stack, tok, LABEL_DECLARED);\n                next();\n                if (tok == ',') {\n                    next();\n                } else {\n                    skip(';');\n                    break;\n                }\n            }\n        }\n        while (tok != '}') {\n            label_or_decl(VT_LOCAL);\n            if (tok != '}') {\n                if (is_expr)\n                    vpop();\n                block(bsym, csym, case_sym, def_sym, case_reg, is_expr);\n            }\n        }\n        /* pop locally defined labels */\n        label_pop(&local_label_stack, llabel);\n        if(is_expr) {\n            /* XXX: this solution makes only valgrind happy...\n               triggered by gcc.c-torture/execute/20000917-1.c */\n            Sym *p;\n            switch(vtop->type.t & VT_BTYPE) {\n            case VT_PTR:\n            case VT_STRUCT:\n            case VT_ENUM:\n            case VT_FUNC:\n                for(p=vtop->type.ref;p;p=p->prev)\n                    if(p->prev==s)\n                        tcc_error(\"unsupported expression type\");\n            }\n        }\n        /* pop locally defined symbols */\n        scope_stack_bottom = scope_stack_bottom->next;\n        sym_pop(&local_stack, s);\n        next();\n    } else if (tok == TOK_RETURN) {\n        next();\n        if (tok != ';') {\n            gexpr();\n            gen_assign_cast(&func_vt);\n            if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {\n                CType type;\n                /* if returning structure, must copy it to implicit\n                   first pointer arg location */\n#ifdef TCC_ARM_EABI\n                int align, size;\n                size = type_size(&func_vt,&align);\n                if(size <= 4)\n                {\n                    if((vtop->r != (VT_LOCAL | VT_LVAL) || (vtop->c.i & 3))\n                       && (align & 3))\n                    {\n                        int addr;\n                        loc = (loc - size) & -4;\n                        addr = loc;\n                        type = func_vt;\n                        vset(&type, VT_LOCAL | VT_LVAL, addr);\n                        vswap();\n                        vstore();\n                        vset(&int_type, VT_LOCAL | VT_LVAL, addr);\n                    }\n                    vtop->type = int_type;\n                    gv(RC_IRET);\n                } else {\n#endif\n                type = func_vt;\n                mk_pointer(&type);\n                vset(&type, VT_LOCAL | VT_LVAL, func_vc);\n                indir();\n                vswap();\n                /* copy structure value to pointer */\n                vstore();\n#ifdef TCC_ARM_EABI\n                }\n#endif\n            } else if (is_float(func_vt.t)) {\n                gv(rc_fret(func_vt.t));\n            } else {\n                gv(RC_IRET);\n            }\n            vtop--; /* NOT vpop() because on x86 it would flush the fp stack */\n        }\n        skip(';');\n        rsym = gjmp(rsym); /* jmp */\n    } else if (tok == TOK_BREAK) {\n        /* compute jump */\n        if (!bsym)\n            tcc_error(\"cannot break\");\n        *bsym = gjmp(*bsym);\n        next();\n        skip(';');\n    } else if (tok == TOK_CONTINUE) {\n        /* compute jump */\n        if (!csym)\n            tcc_error(\"cannot continue\");\n        *csym = gjmp(*csym);\n        next();\n        skip(';');\n    } else if (tok == TOK_FOR) {\n        int e;\n        next();\n        skip('(');\n        s = local_stack;\n        frame_bottom = sym_push2(&local_stack, SYM_FIELD, 0, 0);\n        frame_bottom->next = scope_stack_bottom;\n        scope_stack_bottom = frame_bottom;\n        if (tok != ';') {\n            /* c99 for-loop init decl? */\n            if (!decl0(VT_LOCAL, 1)) {\n                /* no, regular for-loop init expr */\n                gexpr();\n                vpop();\n            }\n        }\n        skip(';');\n        d = ind;\n        c = ind;\n        a = 0;\n        b = 0;\n        if (tok != ';') {\n            gexpr();\n            a = gtst(1, 0);\n        }\n        skip(';');\n        if (tok != ')') {\n            e = gjmp(0);\n            c = ind;\n            gexpr();\n            vpop();\n            gjmp_addr(d);\n            gsym(e);\n        }\n        skip(')');\n        block(&a, &b, case_sym, def_sym, case_reg, 0);\n        gjmp_addr(c);\n        gsym(a);\n        gsym_addr(b, c);\n        scope_stack_bottom = scope_stack_bottom->next;\n        sym_pop(&local_stack, s);\n    } else \n    if (tok == TOK_DO) {\n        next();\n        a = 0;\n        b = 0;\n        d = ind;\n        block(&a, &b, case_sym, def_sym, case_reg, 0);\n        skip(TOK_WHILE);\n        skip('(');\n        gsym(b);\n        gexpr();\n        c = gtst(0, 0);\n        gsym_addr(c, d);\n        skip(')');\n        gsym(a);\n        skip(';');\n    } else\n    if (tok == TOK_SWITCH) {\n        next();\n        skip('(');\n        gexpr();\n        /* XXX: other types than integer */\n        case_reg = gv(RC_INT);\n        vpop();\n        skip(')');\n        a = 0;\n        b = gjmp(0); /* jump to first case */\n        c = 0;\n        block(&a, csym, &b, &c, case_reg, 0);\n        /* if no default, jmp after switch */\n        if (c == 0)\n            c = ind;\n        /* default label */\n        gsym_addr(b, c);\n        /* break label */\n        gsym(a);\n    } else\n    if (tok == TOK_CASE) {\n        int v1, v2;\n        if (!case_sym)\n            expect(\"switch\");\n        next();\n        v1 = expr_const();\n        v2 = v1;\n        if (gnu_ext && tok == TOK_DOTS) {\n            next();\n            v2 = expr_const();\n            if (v2 < v1)\n                tcc_warning(\"empty case range\");\n        }\n        /* since a case is like a label, we must skip it with a jmp */\n        b = gjmp(0);\n        gsym(*case_sym);\n        vseti(case_reg, 0);\n        vpushi(v1);\n        if (v1 == v2) {\n            gen_op(TOK_EQ);\n            *case_sym = gtst(1, 0);\n        } else {\n            gen_op(TOK_GE);\n            *case_sym = gtst(1, 0);\n            vseti(case_reg, 0);\n            vpushi(v2);\n            gen_op(TOK_LE);\n            *case_sym = gtst(1, *case_sym);\n        }\n        gsym(b);\n        skip(':');\n        is_expr = 0;\n        goto block_after_label;\n    } else \n    if (tok == TOK_DEFAULT) {\n        next();\n        skip(':');\n        if (!def_sym)\n            expect(\"switch\");\n        if (*def_sym)\n            tcc_error(\"too many 'default'\");\n        *def_sym = ind;\n        is_expr = 0;\n        goto block_after_label;\n    } else\n    if (tok == TOK_GOTO) {\n        next();\n        if (tok == '*' && gnu_ext) {\n            /* computed goto */\n            next();\n            gexpr();\n            if ((vtop->type.t & VT_BTYPE) != VT_PTR)\n                expect(\"pointer\");\n            ggoto();\n        } else if (tok >= TOK_UIDENT) {\n            s = label_find(tok);\n            /* put forward definition if needed */\n            if (!s) {\n                s = label_push(&global_label_stack, tok, LABEL_FORWARD);\n            } else {\n                if (s->r == LABEL_DECLARED)\n                    s->r = LABEL_FORWARD;\n            }\n            /* label already defined */\n            if (s->r & LABEL_FORWARD) \n                s->jnext = gjmp(s->jnext);\n            else\n                gjmp_addr(s->jnext);\n            next();\n        } else {\n            expect(\"label identifier\");\n        }\n        skip(';');\n    } else if (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3) {\n        asm_instr();\n    } else {\n        b = is_label();\n        if (b) {\n            /* label case */\n            s = label_find(b);\n            if (s) {\n                if (s->r == LABEL_DEFINED)\n                    tcc_error(\"duplicate label '%s'\", get_tok_str(s->v, NULL));\n                gsym(s->jnext);\n                s->r = LABEL_DEFINED;\n            } else {\n                s = label_push(&global_label_stack, b, LABEL_DEFINED);\n            }\n            s->jnext = ind;\n            /* we accept this, but it is a mistake */\n        block_after_label:\n            if (tok == '}') {\n                tcc_warning(\"deprecated use of label at end of compound statement\");\n            } else {\n                if (is_expr)\n                    vpop();\n                block(bsym, csym, case_sym, def_sym, case_reg, is_expr);\n            }\n        } else {\n            /* expression case */\n            if (tok != ';') {\n                if (is_expr) {\n                    vpop();\n                    gexpr();\n                } else {\n                    gexpr();\n                    vpop();\n                }\n            }\n            skip(';');\n        }\n    }\n}\n\n/* t is the array or struct type. c is the array or struct\n   address. cur_index/cur_field is the pointer to the current\n   value. 'size_only' is true if only size info is needed (only used\n   in arrays) */\nstatic void decl_designator(CType *type, Section *sec, unsigned long c, \n                            int *cur_index, Sym **cur_field, \n                            int size_only)\n{\n    Sym *s, *f;\n    int notfirst, index, index_last, align, l, nb_elems, elem_size;\n    CType type1;\n\n    notfirst = 0;\n    elem_size = 0;\n    nb_elems = 1;\n    if (gnu_ext && (l = is_label()) != 0)\n        goto struct_field;\n    while (tok == '[' || tok == '.') {\n        if (tok == '[') {\n            if (!(type->t & VT_ARRAY))\n                expect(\"array type\");\n            s = type->ref;\n            next();\n            index = expr_const();\n            if (index < 0 || (s->c >= 0 && index >= s->c))\n                expect(\"invalid index\");\n            if (tok == TOK_DOTS && gnu_ext) {\n                next();\n                index_last = expr_const();\n                if (index_last < 0 || \n                    (s->c >= 0 && index_last >= s->c) ||\n                    index_last < index)\n                    expect(\"invalid index\");\n            } else {\n                index_last = index;\n            }\n            skip(']');\n            if (!notfirst)\n                *cur_index = index_last;\n            type = pointed_type(type);\n            elem_size = type_size(type, &align);\n            c += index * elem_size;\n            /* NOTE: we only support ranges for last designator */\n            nb_elems = index_last - index + 1;\n            if (nb_elems != 1) {\n                notfirst = 1;\n                break;\n            }\n        } else {\n            next();\n            l = tok;\n            next();\n        struct_field:\n            if ((type->t & VT_BTYPE) != VT_STRUCT)\n                expect(\"struct/union type\");\n            s = type->ref;\n            l |= SYM_FIELD;\n            f = s->next;\n            while (f) {\n                if (f->v == l)\n                    break;\n                f = f->next;\n            }\n            if (!f)\n                expect(\"field\");\n            if (!notfirst)\n                *cur_field = f;\n            /* XXX: fix this mess by using explicit storage field */\n            type1 = f->type;\n            type1.t |= (type->t & ~VT_TYPE);\n            type = &type1;\n            c += f->c;\n        }\n        notfirst = 1;\n    }\n    if (notfirst) {\n        if (tok == '=') {\n            next();\n        } else {\n            if (!gnu_ext)\n                expect(\"=\");\n        }\n    } else {\n        if (type->t & VT_ARRAY) {\n            index = *cur_index;\n            type = pointed_type(type);\n            c += index * type_size(type, &align);\n        } else {\n            f = *cur_field;\n            if (!f)\n                tcc_error(\"too many field init\");\n            /* XXX: fix this mess by using explicit storage field */\n            type1 = f->type;\n            type1.t |= (type->t & ~VT_TYPE);\n            type = &type1;\n            c += f->c;\n        }\n    }\n    decl_initializer(type, sec, c, 0, size_only);\n\n    /* XXX: make it more general */\n    if (!size_only && nb_elems > 1) {\n        unsigned long c_end;\n        uint8_t *src, *dst;\n        int i;\n\n        if (!sec)\n            tcc_error(\"range init not supported yet for dynamic storage\");\n        c_end = c + nb_elems * elem_size;\n        if (c_end > sec->data_allocated)\n            section_realloc(sec, c_end);\n        src = sec->data + c;\n        dst = src;\n        for(i = 1; i < nb_elems; i++) {\n            dst += elem_size;\n            memcpy(dst, src, elem_size);\n        }\n    }\n}\n\n#define EXPR_VAL   0\n#define EXPR_CONST 1\n#define EXPR_ANY   2\n\n/* store a value or an expression directly in global data or in local array */\nstatic void init_putv(CType *type, Section *sec, unsigned long c, \n                      int v, int expr_type)\n{\n    int saved_global_expr, bt, bit_pos, bit_size;\n    void *ptr;\n    unsigned long long bit_mask;\n    CType dtype;\n\n    switch(expr_type) {\n    case EXPR_VAL:\n        vpushi(v);\n        break;\n    case EXPR_CONST:\n        /* compound literals must be allocated globally in this case */\n        saved_global_expr = global_expr;\n        global_expr = 1;\n        expr_const1();\n        global_expr = saved_global_expr;\n        /* NOTE: symbols are accepted */\n        if ((vtop->r & (VT_VALMASK | VT_LVAL)) != VT_CONST)\n            tcc_error(\"initializer element is not constant\");\n        break;\n    case EXPR_ANY:\n        expr_eq();\n        break;\n    }\n    \n    dtype = *type;\n    dtype.t &= ~VT_CONSTANT; /* need to do that to avoid false warning */\n\n    if (sec) {\n        /* XXX: not portable */\n        /* XXX: generate error if incorrect relocation */\n        gen_assign_cast(&dtype);\n        bt = type->t & VT_BTYPE;\n        /* we'll write at most 12 bytes */\n        if (c + 12 > sec->data_allocated) {\n            section_realloc(sec, c + 12);\n        }\n        ptr = sec->data + c;\n        /* XXX: make code faster ? */\n        if (!(type->t & VT_BITFIELD)) {\n            bit_pos = 0;\n            bit_size = 32;\n            bit_mask = -1LL;\n        } else {\n            bit_pos = (vtop->type.t >> VT_STRUCT_SHIFT) & 0x3f;\n            bit_size = (vtop->type.t >> (VT_STRUCT_SHIFT + 6)) & 0x3f;\n            bit_mask = (1LL << bit_size) - 1;\n        }\n        if ((vtop->r & VT_SYM) &&\n            (bt == VT_BYTE ||\n             bt == VT_SHORT ||\n             bt == VT_DOUBLE ||\n             bt == VT_LDOUBLE ||\n             bt == VT_LLONG ||\n             (bt == VT_INT && bit_size != 32)))\n            tcc_error(\"initializer element is not computable at load time\");\n        switch(bt) {\n        case VT_BOOL:\n            vtop->c.i = (vtop->c.i != 0);\n        case VT_BYTE:\n            *(char *)ptr |= (vtop->c.i & bit_mask) << bit_pos;\n            break;\n        case VT_SHORT:\n            *(short *)ptr |= (vtop->c.i & bit_mask) << bit_pos;\n            break;\n        case VT_DOUBLE:\n            *(double *)ptr = vtop->c.d;\n            break;\n        case VT_LDOUBLE:\n            *(long double *)ptr = vtop->c.ld;\n            break;\n        case VT_LLONG:\n            *(long long *)ptr |= (vtop->c.ll & bit_mask) << bit_pos;\n            break;\n        default:\n            if (vtop->r & VT_SYM) {\n                greloc(sec, vtop->sym, c, R_DATA_PTR);\n            }\n            *(int *)ptr |= (vtop->c.i & bit_mask) << bit_pos;\n            break;\n        }\n        vtop--;\n    } else {\n        vset(&dtype, VT_LOCAL|VT_LVAL, c);\n        vswap();\n        vstore();\n        vpop();\n    }\n}\n\n/* put zeros for variable based init */\nstatic void init_putz(CType *t, Section *sec, unsigned long c, int size)\n{\n    if (sec) {\n        /* nothing to do because globals are already set to zero */\n    } else {\n        vpush_global_sym(&func_old_type, TOK_memset);\n        vseti(VT_LOCAL, c);\n        vpushi(0);\n        vpushi(size);\n        gfunc_call(3);\n    }\n}\n\n/* 't' contains the type and storage info. 'c' is the offset of the\n   object in section 'sec'. If 'sec' is NULL, it means stack based\n   allocation. 'first' is true if array '{' must be read (multi\n   dimension implicit array init handling). 'size_only' is true if\n   size only evaluation is wanted (only for arrays). */\nstatic void decl_initializer(CType *type, Section *sec, unsigned long c, \n                             int first, int size_only)\n{\n    int index, array_length, n, no_oblock, nb, parlevel, parlevel1, i;\n    int size1, align1, expr_type;\n    Sym *s, *f;\n    CType *t1;\n\n    if (type->t & VT_VLA) {\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n        int a;\n        CValue retcval;\n\n        vpush_global_sym(&func_old_type, TOK_alloca);\n        vla_runtime_type_size(type, &a);\n        gfunc_call(1);\n\n        /* return value */\n        retcval.i = 0;\n        vsetc(type, REG_IRET, &retcval);\n        vset(type, VT_LOCAL|VT_LVAL, c);\n        vswap();\n        vstore();\n        vpop();\n#else\n        tcc_error(\"variable length arrays unsupported for this target\");\n#endif\n    } else if (type->t & VT_ARRAY) {\n        s = type->ref;\n        n = s->c;\n        array_length = 0;\n        t1 = pointed_type(type);\n        size1 = type_size(t1, &align1);\n\n        no_oblock = 1;\n        if ((first && tok != TOK_LSTR && tok != TOK_STR) || \n            tok == '{') {\n            if (tok != '{')\n                tcc_error(\"character array initializer must be a literal,\"\n                    \" optionally enclosed in braces\");\n            skip('{');\n            no_oblock = 0;\n        }\n\n        /* only parse strings here if correct type (otherwise: handle\n           them as ((w)char *) expressions */\n        if ((tok == TOK_LSTR && \n#ifdef TCC_TARGET_PE\n             (t1->t & VT_BTYPE) == VT_SHORT && (t1->t & VT_UNSIGNED)\n#else\n             (t1->t & VT_BTYPE) == VT_INT\n#endif\n            ) || (tok == TOK_STR && (t1->t & VT_BTYPE) == VT_BYTE)) {\n            while (tok == TOK_STR || tok == TOK_LSTR) {\n                int cstr_len, ch;\n                CString *cstr;\n\n                cstr = tokc.cstr;\n                /* compute maximum number of chars wanted */\n                if (tok == TOK_STR)\n                    cstr_len = cstr->size;\n                else\n                    cstr_len = cstr->size / sizeof(nwchar_t);\n                cstr_len--;\n                nb = cstr_len;\n                if (n >= 0 && nb > (n - array_length))\n                    nb = n - array_length;\n                if (!size_only) {\n                    if (cstr_len > nb)\n                        tcc_warning(\"initializer-string for array is too long\");\n                    /* in order to go faster for common case (char\n                       string in global variable, we handle it\n                       specifically */\n                    if (sec && tok == TOK_STR && size1 == 1) {\n                        memcpy(sec->data + c + array_length, cstr->data, nb);\n                    } else {\n                        for(i=0;i<nb;i++) {\n                            if (tok == TOK_STR)\n                                ch = ((unsigned char *)cstr->data)[i];\n                            else\n                                ch = ((nwchar_t *)cstr->data)[i];\n                            init_putv(t1, sec, c + (array_length + i) * size1,\n                                      ch, EXPR_VAL);\n                        }\n                    }\n                }\n                array_length += nb;\n                next();\n            }\n            /* only add trailing zero if enough storage (no\n               warning in this case since it is standard) */\n            if (n < 0 || array_length < n) {\n                if (!size_only) {\n                    init_putv(t1, sec, c + (array_length * size1), 0, EXPR_VAL);\n                }\n                array_length++;\n            }\n        } else {\n            index = 0;\n            while (tok != '}') {\n                decl_designator(type, sec, c, &index, NULL, size_only);\n                if (n >= 0 && index >= n)\n                    tcc_error(\"index too large\");\n                /* must put zero in holes (note that doing it that way\n                   ensures that it even works with designators) */\n                if (!size_only && array_length < index) {\n                    init_putz(t1, sec, c + array_length * size1, \n                              (index - array_length) * size1);\n                }\n                index++;\n                if (index > array_length)\n                    array_length = index;\n                /* special test for multi dimensional arrays (may not\n                   be strictly correct if designators are used at the\n                   same time) */\n                if (index >= n && no_oblock)\n                    break;\n                if (tok == '}')\n                    break;\n                skip(',');\n            }\n        }\n        if (!no_oblock)\n            skip('}');\n        /* put zeros at the end */\n        if (!size_only && n >= 0 && array_length < n) {\n            init_putz(t1, sec, c + array_length * size1, \n                      (n - array_length) * size1);\n        }\n        /* patch type size if needed */\n        if (n < 0)\n            s->c = array_length;\n    } else if ((type->t & VT_BTYPE) == VT_STRUCT &&\n               (sec || !first || tok == '{')) {\n        int par_count;\n\n        /* NOTE: the previous test is a specific case for automatic\n           struct/union init */\n        /* XXX: union needs only one init */\n\n        /* XXX: this test is incorrect for local initializers\n           beginning with ( without {. It would be much more difficult\n           to do it correctly (ideally, the expression parser should\n           be used in all cases) */\n        par_count = 0;\n        if (tok == '(') {\n            AttributeDef ad1;\n            CType type1;\n            next();\n            while (tok == '(') {\n                par_count++;\n                next();\n            }\n            if (!parse_btype(&type1, &ad1))\n                expect(\"cast\");\n            type_decl(&type1, &ad1, &n, TYPE_ABSTRACT);\n#if 0\n            if (!is_assignable_types(type, &type1))\n                tcc_error(\"invalid type for cast\");\n#endif\n            skip(')');\n        }\n        no_oblock = 1;\n        if (first || tok == '{') {\n            skip('{');\n            no_oblock = 0;\n        }\n        s = type->ref;\n        f = s->next;\n        array_length = 0;\n        index = 0;\n        n = s->c;\n        while (tok != '}') {\n            decl_designator(type, sec, c, NULL, &f, size_only);\n            index = f->c;\n            if (!size_only && array_length < index) {\n                init_putz(type, sec, c + array_length, \n                          index - array_length);\n            }\n            index = index + type_size(&f->type, &align1);\n            if (index > array_length)\n                array_length = index;\n\n            /* gr: skip fields from same union - ugly. */\n            while (f->next) {\n                ///printf(\"index: %2d %08x -- %2d %08x\\n\", f->c, f->type.t, f->next->c, f->next->type.t);\n                /* test for same offset */\n                if (f->next->c != f->c)\n                    break;\n                /* if yes, test for bitfield shift */\n                if ((f->type.t & VT_BITFIELD) && (f->next->type.t & VT_BITFIELD)) {\n                    int bit_pos_1 = (f->type.t >> VT_STRUCT_SHIFT) & 0x3f;\n                    int bit_pos_2 = (f->next->type.t >> VT_STRUCT_SHIFT) & 0x3f;\n                    //printf(\"bitfield %d %d\\n\", bit_pos_1, bit_pos_2);\n                    if (bit_pos_1 != bit_pos_2)\n                        break;\n                }\n                f = f->next;\n            }\n\n            f = f->next;\n            if (no_oblock && f == NULL)\n                break;\n            if (tok == '}')\n                break;\n            skip(',');\n        }\n        /* put zeros at the end */\n        if (!size_only && array_length < n) {\n            init_putz(type, sec, c + array_length, \n                      n - array_length);\n        }\n        if (!no_oblock)\n            skip('}');\n        while (par_count) {\n            skip(')');\n            par_count--;\n        }\n    } else if (tok == '{') {\n        next();\n        decl_initializer(type, sec, c, first, size_only);\n        skip('}');\n    } else if (size_only) {\n        /* just skip expression */\n        parlevel = parlevel1 = 0;\n        while ((parlevel > 0 || parlevel1 > 0 ||\n\t\t(tok != '}' && tok != ',')) &&  tok != -1) {\n            if (tok == '(')\n                parlevel++;\n            else if (tok == ')')\n                parlevel--;\n\t    else if (tok == '{')\n\t\tparlevel1++;\n\t    else if (tok == '}')\n\t\tparlevel1--;\n            next();\n        }\n    } else {\n        /* currently, we always use constant expression for globals\n           (may change for scripting case) */\n        expr_type = EXPR_CONST;\n        if (!sec)\n            expr_type = EXPR_ANY;\n        init_putv(type, sec, c, 0, expr_type);\n    }\n}\n\n/* parse an initializer for type 't' if 'has_init' is non zero, and\n   allocate space in local or global data space ('r' is either\n   VT_LOCAL or VT_CONST). If 'v' is non zero, then an associated\n   variable 'v' with an associated name represented by 'asm_label' of\n   scope 'scope' is declared before initializers are parsed. If 'v' is\n   zero, then a reference to the new object is put in the value stack.\n   If 'has_init' is 2, a special parsing is done to handle string\n   constants. */\nstatic void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, \n                                   int has_init, int v, char *asm_label,\n                                   int scope)\n{\n    int size, align, addr, data_offset;\n    int level;\n    ParseState saved_parse_state = {0};\n    TokenString init_str;\n    Section *sec;\n    Sym *flexible_array;\n\n    flexible_array = NULL;\n    if ((type->t & VT_BTYPE) == VT_STRUCT) {\n        Sym *field;\n        field = type->ref;\n        while (field && field->next)\n            field = field->next;\n        if (field->type.t & VT_ARRAY && field->type.ref->c < 0)\n            flexible_array = field;\n    }\n\n    size = type_size(type, &align);\n    /* If unknown size, we must evaluate it before\n       evaluating initializers because\n       initializers can generate global data too\n       (e.g. string pointers or ISOC99 compound\n       literals). It also simplifies local\n       initializers handling */\n    tok_str_new(&init_str);\n    if (size < 0 || (flexible_array && has_init)) {\n        if (!has_init) \n            tcc_error(\"unknown type size\");\n        /* get all init string */\n        if (has_init == 2) {\n            /* only get strings */\n            while (tok == TOK_STR || tok == TOK_LSTR) {\n                tok_str_add_tok(&init_str);\n                next();\n            }\n        } else {\n            level = 0;\n            while (level > 0 || (tok != ',' && tok != ';')) {\n                if (tok < 0)\n                    tcc_error(\"unexpected end of file in initializer\");\n                tok_str_add_tok(&init_str);\n                if (tok == '{')\n                    level++;\n                else if (tok == '}') {\n                    level--;\n                    if (level <= 0) {\n                        next();\n                        break;\n                    }\n                }\n                next();\n            }\n        }\n        tok_str_add(&init_str, -1);\n        tok_str_add(&init_str, 0);\n        \n        /* compute size */\n        save_parse_state(&saved_parse_state);\n\n        macro_ptr = init_str.str;\n        next();\n        decl_initializer(type, NULL, 0, 1, 1);\n        /* prepare second initializer parsing */\n        macro_ptr = init_str.str;\n        next();\n        \n        /* if still unknown size, error */\n        size = type_size(type, &align);\n        if (size < 0) \n            tcc_error(\"unknown type size\");\n    }\n    if (flexible_array)\n        size += flexible_array->type.ref->c * pointed_size(&flexible_array->type);\n    /* take into account specified alignment if bigger */\n    if (ad->aligned) {\n        if (ad->aligned > align)\n            align = ad->aligned;\n    } else if (ad->packed) {\n        align = 1;\n    }\n    if ((r & VT_VALMASK) == VT_LOCAL) {\n        sec = NULL;\n#ifdef CONFIG_TCC_BCHECK\n        if (tcc_state->do_bounds_check && (type->t & VT_ARRAY)) {\n            loc--;\n        }\n#endif\n        loc = (loc - size) & -align;\n        addr = loc;\n#ifdef CONFIG_TCC_BCHECK\n        /* handles bounds */\n        /* XXX: currently, since we do only one pass, we cannot track\n           '&' operators, so we add only arrays */\n        if (tcc_state->do_bounds_check && (type->t & VT_ARRAY)) {\n            unsigned long *bounds_ptr;\n            /* add padding between regions */\n            loc--;\n            /* then add local bound info */\n            bounds_ptr = section_ptr_add(lbounds_section, 2 * sizeof(unsigned long));\n            bounds_ptr[0] = addr;\n            bounds_ptr[1] = size;\n        }\n#endif\n        if (v) {\n            /* local variable */\n            sym_push(v, type, r, addr);\n        } else {\n            /* push local reference */\n            vset(type, r, addr);\n        }\n    } else {\n        Sym *sym;\n\n        sym = NULL;\n        if (v && scope == VT_CONST) {\n            /* see if the symbol was already defined */\n            sym = sym_find(v);\n            if (sym) {\n                if (!is_compatible_types(&sym->type, type))\n                    tcc_error(\"incompatible types for redefinition of '%s'\", \n                          get_tok_str(v, NULL));\n                if (sym->type.t & VT_EXTERN) {\n                    /* if the variable is extern, it was not allocated */\n                    sym->type.t &= ~VT_EXTERN;\n                    /* set array size if it was ommited in extern\n                       declaration */\n                    if ((sym->type.t & VT_ARRAY) && \n                        sym->type.ref->c < 0 &&\n                        type->ref->c >= 0)\n                        sym->type.ref->c = type->ref->c;\n                } else {\n                    /* we accept several definitions of the same\n                       global variable. this is tricky, because we\n                       must play with the SHN_COMMON type of the symbol */\n                    /* XXX: should check if the variable was already\n                       initialized. It is incorrect to initialized it\n                       twice */\n                    /* no init data, we won't add more to the symbol */\n                    if (!has_init)\n                        goto no_alloc;\n                }\n            }\n        }\n\n        /* allocate symbol in corresponding section */\n        sec = ad->section;\n        if (!sec) {\n            if (has_init)\n                sec = data_section;\n            else if (tcc_state->nocommon)\n                sec = bss_section;\n        }\n        if (sec) {\n            data_offset = sec->data_offset;\n            data_offset = (data_offset + align - 1) & -align;\n            addr = data_offset;\n            /* very important to increment global pointer at this time\n               because initializers themselves can create new initializers */\n            data_offset += size;\n#ifdef CONFIG_TCC_BCHECK\n            /* add padding if bound check */\n            if (tcc_state->do_bounds_check)\n                data_offset++;\n#endif\n            sec->data_offset = data_offset;\n            /* allocate section space to put the data */\n            if (sec->sh_type != SHT_NOBITS && \n                data_offset > sec->data_allocated)\n                section_realloc(sec, data_offset);\n            /* align section if needed */\n            if (align > sec->sh_addralign)\n                sec->sh_addralign = align;\n        } else {\n            addr = 0; /* avoid warning */\n        }\n\n        if (v) {\n            if (scope != VT_CONST || !sym) {\n                sym = sym_push(v, type, r | VT_SYM, 0);\n                sym->asm_label = asm_label;\n            }\n            /* update symbol definition */\n            if (sec) {\n                put_extern_sym(sym, sec, addr, size);\n            } else {\n                ElfW(Sym) *esym;\n                /* put a common area */\n                put_extern_sym(sym, NULL, align, size);\n                /* XXX: find a nicer way */\n                esym = &((ElfW(Sym) *)symtab_section->data)[sym->c];\n                esym->st_shndx = SHN_COMMON;\n            }\n        } else {\n            CValue cval;\n\n            /* push global reference */\n            sym = get_sym_ref(type, sec, addr, size);\n            cval.ul = 0;\n            vsetc(type, VT_CONST | VT_SYM, &cval);\n            vtop->sym = sym;\n        }\n        /* patch symbol weakness */\n        if (type->t & VT_WEAK)\n            weaken_symbol(sym);\n#ifdef CONFIG_TCC_BCHECK\n        /* handles bounds now because the symbol must be defined\n           before for the relocation */\n        if (tcc_state->do_bounds_check) {\n            unsigned long *bounds_ptr;\n\n            greloc(bounds_section, sym, bounds_section->data_offset, R_DATA_PTR);\n            /* then add global bound info */\n            bounds_ptr = section_ptr_add(bounds_section, 2 * sizeof(long));\n            bounds_ptr[0] = 0; /* relocated */\n            bounds_ptr[1] = size;\n        }\n#endif\n    }\n    if (has_init || (type->t & VT_VLA)) {\n        decl_initializer(type, sec, addr, 1, 0);\n        /* restore parse state if needed */\n        if (init_str.str) {\n            tok_str_free(init_str.str);\n            restore_parse_state(&saved_parse_state);\n        }\n        /* patch flexible array member size back to -1, */\n        /* for possible subsequent similar declarations */\n        if (flexible_array)\n            flexible_array->type.ref->c = -1;\n    }\n no_alloc: ;\n}\n\nstatic void put_func_debug(Sym *sym)\n{\n    char buf[512];\n\n    /* stabs info */\n    /* XXX: we put here a dummy type */\n    snprintf(buf, sizeof(buf), \"%s:%c1\", \n             funcname, sym->type.t & VT_STATIC ? 'f' : 'F');\n    put_stabs_r(buf, N_FUN, 0, file->line_num, 0,\n                cur_text_section, sym->c);\n    /* //gr gdb wants a line at the function */\n    put_stabn(N_SLINE, 0, file->line_num, 0); \n    last_ind = 0;\n    last_line_num = 0;\n}\n\n/* parse an old style function declaration list */\n/* XXX: check multiple parameter */\nstatic void func_decl_list(Sym *func_sym)\n{\n    AttributeDef ad;\n    int v;\n    Sym *s;\n    CType btype, type;\n\n    /* parse each declaration */\n    while (tok != '{' && tok != ';' && tok != ',' && tok != TOK_EOF &&\n           tok != TOK_ASM1 && tok != TOK_ASM2 && tok != TOK_ASM3) {\n        if (!parse_btype(&btype, &ad)) \n            expect(\"declaration list\");\n        if (((btype.t & VT_BTYPE) == VT_ENUM ||\n             (btype.t & VT_BTYPE) == VT_STRUCT) && \n            tok == ';') {\n            /* we accept no variable after */\n        } else {\n            for(;;) {\n                type = btype;\n                type_decl(&type, &ad, &v, TYPE_DIRECT);\n                /* find parameter in function parameter list */\n                s = func_sym->next;\n                while (s != NULL) {\n                    if ((s->v & ~SYM_FIELD) == v)\n                        goto found;\n                    s = s->next;\n                }\n                tcc_error(\"declaration for parameter '%s' but no such parameter\",\n                      get_tok_str(v, NULL));\n            found:\n                /* check that no storage specifier except 'register' was given */\n                if (type.t & VT_STORAGE)\n                    tcc_error(\"storage class specified for '%s'\", get_tok_str(v, NULL)); \n                convert_parameter_type(&type);\n                /* we can add the type (NOTE: it could be local to the function) */\n                s->type = type;\n                /* accept other parameters */\n                if (tok == ',')\n                    next();\n                else\n                    break;\n            }\n        }\n        skip(';');\n    }\n}\n\n/* parse a function defined by symbol 'sym' and generate its code in\n   'cur_text_section' */\nstatic void gen_function(Sym *sym)\n{\n    int saved_nocode_wanted = nocode_wanted;\n    nocode_wanted = 0;\n    ind = cur_text_section->data_offset;\n    /* NOTE: we patch the symbol size later */\n    put_extern_sym(sym, cur_text_section, ind, 0);\n    funcname = get_tok_str(sym->v, NULL);\n    func_ind = ind;\n    /* put debug symbol */\n    if (tcc_state->do_debug)\n        put_func_debug(sym);\n    /* push a dummy symbol to enable local sym storage */\n    sym_push2(&local_stack, SYM_FIELD, 0, 0);\n    gfunc_prolog(&sym->type);\n    rsym = 0;\n    block(NULL, NULL, NULL, NULL, 0, 0);\n    gsym(rsym);\n    gfunc_epilog();\n    cur_text_section->data_offset = ind;\n    label_pop(&global_label_stack, NULL);\n    /* reset local stack */\n    scope_stack_bottom = NULL;\n    sym_pop(&local_stack, NULL);\n    /* end of function */\n    /* patch symbol size */\n    ((ElfW(Sym) *)symtab_section->data)[sym->c].st_size = \n        ind - func_ind;\n    /* patch symbol weakness (this definition overrules any prototype) */\n    if (sym->type.t & VT_WEAK)\n        weaken_symbol(sym);\n    if (tcc_state->do_debug) {\n        put_stabn(N_FUN, 0, 0, ind - func_ind);\n    }\n    /* It's better to crash than to generate wrong code */\n    cur_text_section = NULL;\n    funcname = \"\"; /* for safety */\n    func_vt.t = VT_VOID; /* for safety */\n    ind = 0; /* for safety */\n    nocode_wanted = saved_nocode_wanted;\n}\n\nST_FUNC void gen_inline_functions(void)\n{\n    Sym *sym;\n    int *str, inline_generated, i;\n    struct InlineFunc *fn;\n\n    /* iterate while inline function are referenced */\n    for(;;) {\n        inline_generated = 0;\n        for (i = 0; i < tcc_state->nb_inline_fns; ++i) {\n            fn = tcc_state->inline_fns[i];\n            sym = fn->sym;\n            if (sym && sym->c) {\n                /* the function was used: generate its code and\n                   convert it to a normal function */\n                str = fn->token_str;\n                fn->sym = NULL;\n                if (file)\n                    pstrcpy(file->filename, sizeof file->filename, fn->filename);\n                sym->r = VT_SYM | VT_CONST;\n                sym->type.t &= ~VT_INLINE;\n\n                macro_ptr = str;\n                next();\n                cur_text_section = text_section;\n                gen_function(sym);\n                macro_ptr = NULL; /* fail safe */\n\n                inline_generated = 1;\n            }\n        }\n        if (!inline_generated)\n            break;\n    }\n    for (i = 0; i < tcc_state->nb_inline_fns; ++i) {\n        fn = tcc_state->inline_fns[i];\n        str = fn->token_str;\n        tok_str_free(str);\n    }\n    dynarray_reset(&tcc_state->inline_fns, &tcc_state->nb_inline_fns);\n}\n\n/* 'l' is VT_LOCAL or VT_CONST to define default storage type */\nstatic int decl0(int l, int is_for_loop_init)\n{\n    int v, has_init, r;\n    CType type, btype;\n    Sym *sym;\n    AttributeDef ad;\n\n    while (1) {\n        if (!parse_btype(&btype, &ad)) {\n            if (is_for_loop_init)\n                return 0;\n            /* skip redundant ';' */\n            /* XXX: find more elegant solution */\n            if (tok == ';') {\n                next();\n                continue;\n            }\n            if (l == VT_CONST &&\n                (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3)) {\n                /* global asm block */\n                asm_global_instr();\n                continue;\n            }\n            /* special test for old K&R protos without explicit int\n               type. Only accepted when defining global data */\n            if (l == VT_LOCAL || tok < TOK_DEFINE)\n                break;\n            btype.t = VT_INT;\n        }\n        if (((btype.t & VT_BTYPE) == VT_ENUM ||\n             (btype.t & VT_BTYPE) == VT_STRUCT) && \n            tok == ';') {\n            /* we accept no variable after */\n            next();\n            continue;\n        }\n        while (1) { /* iterate thru each declaration */\n            char *asm_label; // associated asm label\n            type = btype;\n            type_decl(&type, &ad, &v, TYPE_DIRECT);\n#if 0\n            {\n                char buf[500];\n                type_to_str(buf, sizeof(buf), t, get_tok_str(v, NULL));\n                printf(\"type = '%s'\\n\", buf);\n            }\n#endif\n            if ((type.t & VT_BTYPE) == VT_FUNC) {\n                if ((type.t & VT_STATIC) && (l == VT_LOCAL)) {\n                    tcc_error(\"function without file scope cannot be static\");\n                }\n                /* if old style function prototype, we accept a\n                   declaration list */\n                sym = type.ref;\n                if (sym->c == FUNC_OLD)\n                    func_decl_list(sym);\n            }\n\n            asm_label = NULL;\n            if (gnu_ext && (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3)) {\n                CString astr;\n\n                asm_label_instr(&astr);\n                asm_label = tcc_strdup(astr.data);\n                cstr_free(&astr);\n                \n                /* parse one last attribute list, after asm label */\n                parse_attribute(&ad);\n            }\n\n            if (ad.weak)\n                type.t |= VT_WEAK;\n#ifdef TCC_TARGET_PE\n            if (ad.func_import)\n                type.t |= VT_IMPORT;\n            if (ad.func_export)\n                type.t |= VT_EXPORT;\n#endif\n            if (tok == '{') {\n                if (l == VT_LOCAL)\n                    tcc_error(\"cannot use local functions\");\n                if ((type.t & VT_BTYPE) != VT_FUNC)\n                    expect(\"function definition\");\n\n                /* reject abstract declarators in function definition */\n                sym = type.ref;\n                while ((sym = sym->next) != NULL)\n                    if (!(sym->v & ~SYM_FIELD))\n                       expect(\"identifier\");\n                \n                /* XXX: cannot do better now: convert extern line to static inline */\n                if ((type.t & (VT_EXTERN | VT_INLINE)) == (VT_EXTERN | VT_INLINE))\n                    type.t = (type.t & ~VT_EXTERN) | VT_STATIC;\n                \n                sym = sym_find(v);\n                if (sym) {\n                    if ((sym->type.t & VT_BTYPE) != VT_FUNC)\n                        goto func_error1;\n\n                    r = sym->type.ref->r;\n                    /* use func_call from prototype if not defined */\n                    if (FUNC_CALL(r) != FUNC_CDECL\n                     && FUNC_CALL(type.ref->r) == FUNC_CDECL)\n                        FUNC_CALL(type.ref->r) = FUNC_CALL(r);\n\n                    /* use export from prototype */\n                    if (FUNC_EXPORT(r))\n                        FUNC_EXPORT(type.ref->r) = 1;\n\n                    /* use static from prototype */\n                    if (sym->type.t & VT_STATIC)\n                        type.t = (type.t & ~VT_EXTERN) | VT_STATIC;\n\n                    if (!is_compatible_types(&sym->type, &type)) {\n                    func_error1:\n                        tcc_error(\"incompatible types for redefinition of '%s'\", \n                              get_tok_str(v, NULL));\n                    }\n                    /* if symbol is already defined, then put complete type */\n                    sym->type = type;\n                } else {\n                    /* put function symbol */\n                    sym = global_identifier_push(v, type.t, 0);\n                    sym->type.ref = type.ref;\n                }\n\n                /* static inline functions are just recorded as a kind\n                   of macro. Their code will be emitted at the end of\n                   the compilation unit only if they are used */\n                if ((type.t & (VT_INLINE | VT_STATIC)) == \n                    (VT_INLINE | VT_STATIC)) {\n                    TokenString func_str;\n                    int block_level;\n                    struct InlineFunc *fn;\n                    const char *filename;\n                           \n                    tok_str_new(&func_str);\n                    \n                    block_level = 0;\n                    for(;;) {\n                        int t;\n                        if (tok == TOK_EOF)\n                            tcc_error(\"unexpected end of file\");\n                        tok_str_add_tok(&func_str);\n                        t = tok;\n                        next();\n                        if (t == '{') {\n                            block_level++;\n                        } else if (t == '}') {\n                            block_level--;\n                            if (block_level == 0)\n                                break;\n                        }\n                    }\n                    tok_str_add(&func_str, -1);\n                    tok_str_add(&func_str, 0);\n                    filename = file ? file->filename : \"\";\n                    fn = tcc_malloc(sizeof *fn + strlen(filename));\n                    strcpy(fn->filename, filename);\n                    fn->sym = sym;\n                    fn->token_str = func_str.str;\n                    dynarray_add((void ***)&tcc_state->inline_fns, &tcc_state->nb_inline_fns, fn);\n\n                } else {\n                    /* compute text section */\n                    cur_text_section = ad.section;\n                    if (!cur_text_section)\n                        cur_text_section = text_section;\n                    sym->r = VT_SYM | VT_CONST;\n                    gen_function(sym);\n                }\n                break;\n            } else {\n                if (btype.t & VT_TYPEDEF) {\n                    /* save typedefed type  */\n                    /* XXX: test storage specifiers ? */\n                    sym = sym_push(v, &type, INT_ATTR(&ad), 0);\n                    sym->type.t |= VT_TYPEDEF;\n                } else {\n                    r = 0;\n                    if ((type.t & VT_BTYPE) == VT_FUNC) {\n                        /* external function definition */\n                        /* specific case for func_call attribute */\n                        type.ref->r = INT_ATTR(&ad);\n                    } else if (!(type.t & VT_ARRAY)) {\n                        /* not lvalue if array */\n                        r |= lvalue_type(type.t);\n                    }\n                    has_init = (tok == '=');\n                    if (has_init && (type.t & VT_VLA))\n                        tcc_error(\"Variable length array cannot be initialized\");\n                    if ((btype.t & VT_EXTERN) || ((type.t & VT_BTYPE) == VT_FUNC) ||\n                        ((type.t & VT_ARRAY) && (type.t & VT_STATIC) &&\n                         !has_init && l == VT_CONST && type.ref->c < 0)) {\n                        /* external variable or function */\n                        /* NOTE: as GCC, uninitialized global static\n                           arrays of null size are considered as\n                           extern */\n                        sym = external_sym(v, &type, r, asm_label);\n\n                        if (type.t & VT_WEAK)\n                            weaken_symbol(sym);\n\n                        if (ad.alias_target) {\n                            Section tsec;\n                            Elf32_Sym *esym;\n                            Sym *alias_target;\n\n                            alias_target = sym_find(ad.alias_target);\n                            if (!alias_target || !alias_target->c)\n                                tcc_error(\"unsupported forward __alias__ attribute\");\n                            esym = &((Elf32_Sym *)symtab_section->data)[alias_target->c];\n                            tsec.sh_num = esym->st_shndx;\n                            put_extern_sym2(sym, &tsec, esym->st_value, esym->st_size, 0);\n                        }\n                    } else {\n                        type.t |= (btype.t & VT_STATIC); /* Retain \"static\". */\n                        if (type.t & VT_STATIC)\n                            r |= VT_CONST;\n                        else\n                            r |= l;\n                        if (has_init)\n                            next();\n                        decl_initializer_alloc(&type, &ad, r, has_init, v, asm_label, l);\n                    }\n                }\n                if (tok != ',') {\n                    if (is_for_loop_init)\n                        return 1;\n                    skip(';');\n                    break;\n                }\n                next();\n            }\n            ad.aligned = 0;\n        }\n    }\n    return 0;\n}\n\nST_FUNC void decl(int l)\n{\n    decl0(l, 0);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tccpe.c",
    "content": "/*\n *  TCCPE.C - PE file output for the Tiny C Compiler\n *\n *  Copyright (c) 2005-2007 grischka\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\n#ifndef _WIN32\n#define stricmp strcasecmp\n#define strnicmp strncasecmp\n#endif\n\n#ifndef MAX_PATH\n#define MAX_PATH 260\n#endif\n\n#define PE_MERGE_DATA\n// #define PE_PRINT_SECTIONS\n\n#ifdef TCC_TARGET_X86_64\n# define ADDR3264 ULONGLONG\n#else\n# define ADDR3264 DWORD\n#endif\n\n#ifdef _WIN32\nvoid dbg_printf (const char *fmt, ...)\n{\n    char buffer[4000];\n    va_list arg;\n    int x;\n    va_start(arg, fmt);\n    x = vsprintf (buffer, fmt, arg);\n    strcpy(buffer+x, \"\\n\");\n    OutputDebugString(buffer);\n}\n#endif\n\n/* ----------------------------------------------------------- */\n#ifndef IMAGE_NT_SIGNATURE\n/* ----------------------------------------------------------- */\n/* definitions below are from winnt.h */\n\ntypedef unsigned char BYTE;\ntypedef unsigned short WORD;\ntypedef unsigned int DWORD;\ntypedef unsigned long long ULONGLONG;\n#pragma pack(push, 1)\n\ntypedef struct _IMAGE_DOS_HEADER {  /* DOS .EXE header */\n    WORD e_magic;         /* Magic number */\n    WORD e_cblp;          /* Bytes on last page of file */\n    WORD e_cp;            /* Pages in file */\n    WORD e_crlc;          /* Relocations */\n    WORD e_cparhdr;       /* Size of header in paragraphs */\n    WORD e_minalloc;      /* Minimum extra paragraphs needed */\n    WORD e_maxalloc;      /* Maximum extra paragraphs needed */\n    WORD e_ss;            /* Initial (relative) SS value */\n    WORD e_sp;            /* Initial SP value */\n    WORD e_csum;          /* Checksum */\n    WORD e_ip;            /* Initial IP value */\n    WORD e_cs;            /* Initial (relative) CS value */\n    WORD e_lfarlc;        /* File address of relocation table */\n    WORD e_ovno;          /* Overlay number */\n    WORD e_res[4];        /* Reserved words */\n    WORD e_oemid;         /* OEM identifier (for e_oeminfo) */\n    WORD e_oeminfo;       /* OEM information; e_oemid specific */\n    WORD e_res2[10];      /* Reserved words */\n    DWORD e_lfanew;        /* File address of new exe header */\n} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;\n\n#define IMAGE_NT_SIGNATURE  0x00004550  /* PE00 */\n#define SIZE_OF_NT_SIGNATURE 4\n\ntypedef struct _IMAGE_FILE_HEADER {\n    WORD    Machine;\n    WORD    NumberOfSections;\n    DWORD   TimeDateStamp;\n    DWORD   PointerToSymbolTable;\n    DWORD   NumberOfSymbols;\n    WORD    SizeOfOptionalHeader;\n    WORD    Characteristics;\n} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;\n\n\n#define IMAGE_SIZEOF_FILE_HEADER 20\n\ntypedef struct _IMAGE_DATA_DIRECTORY {\n    DWORD   VirtualAddress;\n    DWORD   Size;\n} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;\n\n\ntypedef struct _IMAGE_OPTIONAL_HEADER {\n    /* Standard fields. */\n    WORD    Magic;\n    BYTE    MajorLinkerVersion;\n    BYTE    MinorLinkerVersion;\n    DWORD   SizeOfCode;\n    DWORD   SizeOfInitializedData;\n    DWORD   SizeOfUninitializedData;\n    DWORD   AddressOfEntryPoint;\n    DWORD   BaseOfCode;\n#ifndef TCC_TARGET_X86_64\n    DWORD   BaseOfData;\n#endif\n    /* NT additional fields. */\n    ADDR3264 ImageBase;\n    DWORD   SectionAlignment;\n    DWORD   FileAlignment;\n    WORD    MajorOperatingSystemVersion;\n    WORD    MinorOperatingSystemVersion;\n    WORD    MajorImageVersion;\n    WORD    MinorImageVersion;\n    WORD    MajorSubsystemVersion;\n    WORD    MinorSubsystemVersion;\n    DWORD   Win32VersionValue;\n    DWORD   SizeOfImage;\n    DWORD   SizeOfHeaders;\n    DWORD   CheckSum;\n    WORD    Subsystem;\n    WORD    DllCharacteristics;\n    ADDR3264 SizeOfStackReserve;\n    ADDR3264 SizeOfStackCommit;\n    ADDR3264 SizeOfHeapReserve;\n    ADDR3264 SizeOfHeapCommit;\n    DWORD   LoaderFlags;\n    DWORD   NumberOfRvaAndSizes;\n    IMAGE_DATA_DIRECTORY DataDirectory[16];\n} IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, IMAGE_OPTIONAL_HEADER;\n\n#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   /* Export Directory */\n#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   /* Import Directory */\n#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   /* Resource Directory */\n#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   /* Exception Directory */\n#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   /* Security Directory */\n#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   /* Base Relocation Table */\n#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   /* Debug Directory */\n/*      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7      (X86 usage) */\n#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   /* Architecture Specific Data */\n#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   /* RVA of GP */\n#define IMAGE_DIRECTORY_ENTRY_TLS             9   /* TLS Directory */\n#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   /* Load Configuration Directory */\n#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   /* Bound Import Directory in headers */\n#define IMAGE_DIRECTORY_ENTRY_IAT            12   /* Import Address Table */\n#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   /* Delay Load Import Descriptors */\n#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   /* COM Runtime descriptor */\n\n/* Section header format. */\n#define IMAGE_SIZEOF_SHORT_NAME         8\n\ntypedef struct _IMAGE_SECTION_HEADER {\n    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];\n    union {\n            DWORD   PhysicalAddress;\n            DWORD   VirtualSize;\n    } Misc;\n    DWORD   VirtualAddress;\n    DWORD   SizeOfRawData;\n    DWORD   PointerToRawData;\n    DWORD   PointerToRelocations;\n    DWORD   PointerToLinenumbers;\n    WORD    NumberOfRelocations;\n    WORD    NumberOfLinenumbers;\n    DWORD   Characteristics;\n} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;\n\n#define IMAGE_SIZEOF_SECTION_HEADER     40\n\ntypedef struct _IMAGE_EXPORT_DIRECTORY {\n    DWORD Characteristics;\n    DWORD TimeDateStamp;\n    WORD MajorVersion;\n    WORD MinorVersion;\n    DWORD Name;\n    DWORD Base;\n    DWORD NumberOfFunctions;\n    DWORD NumberOfNames;\n    DWORD AddressOfFunctions;\n    DWORD AddressOfNames;\n    DWORD AddressOfNameOrdinals;\n} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;\n\ntypedef struct _IMAGE_IMPORT_DESCRIPTOR {\n    union {\n        DWORD Characteristics;\n        DWORD OriginalFirstThunk;\n    };\n    DWORD TimeDateStamp;\n    DWORD ForwarderChain;\n    DWORD Name;\n    DWORD FirstThunk;\n} IMAGE_IMPORT_DESCRIPTOR;\n\ntypedef struct _IMAGE_BASE_RELOCATION {\n    DWORD   VirtualAddress;\n    DWORD   SizeOfBlock;\n//  WORD    TypeOffset[1];\n} IMAGE_BASE_RELOCATION;\n\n#define IMAGE_SIZEOF_BASE_RELOCATION     8\n\n#define IMAGE_REL_BASED_ABSOLUTE         0\n#define IMAGE_REL_BASED_HIGH             1\n#define IMAGE_REL_BASED_LOW              2\n#define IMAGE_REL_BASED_HIGHLOW          3\n#define IMAGE_REL_BASED_HIGHADJ          4\n#define IMAGE_REL_BASED_MIPS_JMPADDR     5\n#define IMAGE_REL_BASED_SECTION          6\n#define IMAGE_REL_BASED_REL32            7\n\n#pragma pack(pop)\n\n/* ----------------------------------------------------------- */\n#endif /* ndef IMAGE_NT_SIGNATURE */\n/* ----------------------------------------------------------- */\n#pragma pack(push, 1)\n\nstruct pe_header\n{\n    IMAGE_DOS_HEADER doshdr;\n    BYTE dosstub[0x40];\n    DWORD nt_sig;\n    IMAGE_FILE_HEADER filehdr;\n#ifdef TCC_TARGET_X86_64\n    IMAGE_OPTIONAL_HEADER64 opthdr;\n#else\n#ifdef _WIN64\n    IMAGE_OPTIONAL_HEADER32 opthdr;\n#else\n    IMAGE_OPTIONAL_HEADER opthdr;\n#endif\n#endif\n};\n\nstruct pe_reloc_header {\n    DWORD offset;\n    DWORD size;\n};\n\nstruct pe_rsrc_header {\n    struct _IMAGE_FILE_HEADER filehdr;\n    struct _IMAGE_SECTION_HEADER sectionhdr;\n};\n\nstruct pe_rsrc_reloc {\n    DWORD offset;\n    DWORD size;\n    WORD type;\n};\n\n#pragma pack(pop)\n\n/* ------------------------------------------------------------- */\n/* internal temporary structures */\n\n/*\n#define IMAGE_SCN_CNT_CODE                  0x00000020\n#define IMAGE_SCN_CNT_INITIALIZED_DATA      0x00000040\n#define IMAGE_SCN_CNT_UNINITIALIZED_DATA    0x00000080\n#define IMAGE_SCN_MEM_DISCARDABLE           0x02000000\n#define IMAGE_SCN_MEM_SHARED                0x10000000\n#define IMAGE_SCN_MEM_EXECUTE               0x20000000\n#define IMAGE_SCN_MEM_READ                  0x40000000\n#define IMAGE_SCN_MEM_WRITE                 0x80000000\n*/\n\nenum {\n    sec_text = 0,\n    sec_data ,\n    sec_bss ,\n    sec_idata ,\n    sec_pdata ,\n    sec_other ,\n    sec_rsrc ,\n    sec_stab ,\n    sec_reloc ,\n    sec_last\n};\n\nstatic const DWORD pe_sec_flags[] = {\n    0x60000020, /* \".text\"     , */\n    0xC0000040, /* \".data\"     , */\n    0xC0000080, /* \".bss\"      , */\n    0x40000040, /* \".idata\"    , */\n    0x40000040, /* \".pdata\"    , */\n    0xE0000060, /* < other >   , */\n    0x40000040, /* \".rsrc\"     , */\n    0x42000802, /* \".stab\"     , */\n    0x42000040, /* \".reloc\"    , */\n};\n\nstruct section_info {\n    int cls, ord;\n    char name[32];\n    DWORD sh_addr;\n    DWORD sh_size;\n    DWORD sh_flags;\n    unsigned char *data;\n    DWORD data_size;\n    IMAGE_SECTION_HEADER ish;\n};\n\nstruct import_symbol {\n    int sym_index;\n    int iat_index;\n    int thk_offset;\n};\n\nstruct pe_import_info {\n    int dll_index;\n    int sym_count;\n    struct import_symbol **symbols;\n};\n\nstruct pe_info {\n    TCCState *s1;\n    Section *reloc;\n    Section *thunk;\n    const char *filename;\n    int type;\n    DWORD sizeofheaders;\n    ADDR3264 imagebase;\n    DWORD start_addr;\n    DWORD imp_offs;\n    DWORD imp_size;\n    DWORD iat_offs;\n    DWORD iat_size;\n    DWORD exp_offs;\n    DWORD exp_size;\n    int subsystem;\n    DWORD section_align;\n    DWORD file_align;\n    struct section_info *sec_info;\n    int sec_count;\n    struct pe_import_info **imp_info;\n    int imp_count;\n};\n\n#define PE_NUL 0\n#define PE_DLL 1\n#define PE_GUI 2\n#define PE_EXE 3\n#define PE_RUN 4\n\n/* --------------------------------------------*/\n\nstatic const char *pe_export_name(TCCState *s1, ElfW(Sym) *sym)\n{\n    const char *name = symtab_section->link->data + sym->st_name;\n    if (s1->leading_underscore && name[0] == '_' && !(sym->st_other & 2))\n        return name + 1;\n    return name;\n}\n\nstatic int pe_find_import(TCCState * s1, ElfW(Sym) *sym)\n{\n    char buffer[200];\n    const char *s, *p;\n    int sym_index = 0, n = 0;\n\n    do {\n        s = pe_export_name(s1, sym);\n        if (n) {\n            /* second try: */\n\t    if (sym->st_other & 2) {\n                /* try w/0 stdcall deco (windows API convention) */\n\t        p = strrchr(s, '@');\n\t        if (!p || s[0] != '_')\n\t            break;\n\t        strcpy(buffer, s+1)[p-s-1] = 0;\n\t    } else if (s[0] != '_') { /* try non-ansi function */\n\t        buffer[0] = '_', strcpy(buffer + 1, s);\n\t    } else if (0 == memcmp(s, \"__imp__\", 7)) { /* mingw 2.0 */\n\t        strcpy(buffer, s + 6);\n\t    } else if (0 == memcmp(s, \"_imp___\", 7)) { /* mingw 3.7 */\n\t        strcpy(buffer, s + 6);\n\t    } else {\n\t        break;\n\t    }\n\t    s = buffer;\n        }\n        sym_index = find_elf_sym(s1->dynsymtab_section, s);\n        // printf(\"find (%d) %d %s\\n\", n, sym_index, s);\n    } while (0 == sym_index && ++n < 2);\n    return sym_index;\n}\n\n/*----------------------------------------------------------------------------*/\n\nstatic int dynarray_assoc(void **pp, int n, int key)\n{\n    int i;\n    for (i = 0; i < n; ++i, ++pp)\n    if (key == **(int **) pp)\n        return i;\n    return -1;\n}\n\n#if 0\nST_FN DWORD umin(DWORD a, DWORD b)\n{\n    return a < b ? a : b;\n}\n#endif\n\nstatic DWORD umax(DWORD a, DWORD b)\n{\n    return a < b ? b : a;\n}\n\nstatic DWORD pe_file_align(struct pe_info *pe, DWORD n)\n{\n    return (n + (pe->file_align - 1)) & ~(pe->file_align - 1);\n}\n\nstatic DWORD pe_virtual_align(struct pe_info *pe, DWORD n)\n{\n    return (n + (pe->section_align - 1)) & ~(pe->section_align - 1);\n}\n\nstatic void pe_align_section(Section *s, int a)\n{\n    int i = s->data_offset & (a-1);\n    if (i)\n        section_ptr_add(s, a - i);\n}\n\nstatic void pe_set_datadir(struct pe_header *hdr, int dir, DWORD addr, DWORD size)\n{\n    hdr->opthdr.DataDirectory[dir].VirtualAddress = addr;\n    hdr->opthdr.DataDirectory[dir].Size = size;\n}\n\nstatic int pe_fwrite(void *data, unsigned len, FILE *fp, DWORD *psum)\n{\n    if (psum) {\n        DWORD sum = *psum;\n        WORD *p = data;\n        int i;\n        for (i = len; i > 0; i -= 2) {\n            sum += (i >= 2) ? *p++ : *(BYTE*)p;\n            sum = (sum + (sum >> 16)) & 0xFFFF;\n        }\n        *psum = sum;\n    }\n    return len == fwrite(data, 1, len, fp) ? 0 : -1;\n}\n\nstatic void pe_fpad(FILE *fp, DWORD new_pos)\n{\n    DWORD pos = ftell(fp);\n    while (++pos <= new_pos)\n        fputc(0, fp);\n}\n\n/*----------------------------------------------------------------------------*/\nstatic int pe_write(struct pe_info *pe)\n{\n    static const struct pe_header pe_template = {\n    {\n    /* IMAGE_DOS_HEADER doshdr */\n    0x5A4D, /*WORD e_magic;         Magic number */\n    0x0090, /*WORD e_cblp;          Bytes on last page of file */\n    0x0003, /*WORD e_cp;            Pages in file */\n    0x0000, /*WORD e_crlc;          Relocations */\n\n    0x0004, /*WORD e_cparhdr;       Size of header in paragraphs */\n    0x0000, /*WORD e_minalloc;      Minimum extra paragraphs needed */\n    0xFFFF, /*WORD e_maxalloc;      Maximum extra paragraphs needed */\n    0x0000, /*WORD e_ss;            Initial (relative) SS value */\n\n    0x00B8, /*WORD e_sp;            Initial SP value */\n    0x0000, /*WORD e_csum;          Checksum */\n    0x0000, /*WORD e_ip;            Initial IP value */\n    0x0000, /*WORD e_cs;            Initial (relative) CS value */\n    0x0040, /*WORD e_lfarlc;        File address of relocation table */\n    0x0000, /*WORD e_ovno;          Overlay number */\n    {0,0,0,0}, /*WORD e_res[4];     Reserved words */\n    0x0000, /*WORD e_oemid;         OEM identifier (for e_oeminfo) */\n    0x0000, /*WORD e_oeminfo;       OEM information; e_oemid specific */\n    {0,0,0,0,0,0,0,0,0,0}, /*WORD e_res2[10];      Reserved words */\n    0x00000080  /*DWORD   e_lfanew;        File address of new exe header */\n    },{\n    /* BYTE dosstub[0x40] */\n    /* 14 code bytes + \"This program cannot be run in DOS mode.\\r\\r\\n$\" + 6 * 0x00 */\n    0x0e,0x1f,0xba,0x0e,0x00,0xb4,0x09,0xcd,0x21,0xb8,0x01,0x4c,0xcd,0x21,0x54,0x68,\n    0x69,0x73,0x20,0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,0x20,0x63,0x61,0x6e,0x6e,0x6f,\n    0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6e,0x20,0x69,0x6e,0x20,0x44,0x4f,0x53,0x20,\n    0x6d,0x6f,0x64,0x65,0x2e,0x0d,0x0d,0x0a,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n    },\n    0x00004550, /* DWORD nt_sig = IMAGE_NT_SIGNATURE */\n    {\n    /* IMAGE_FILE_HEADER filehdr */\n#if defined(TCC_TARGET_I386)\n    0x014C,   /*WORD    Machine; */\n#elif defined(TCC_TARGET_X86_64)\n    0x8664,   /*WORD    Machine; */\n#elif defined(TCC_TARGET_ARM)\n    0x01C0,   /*WORD    Machine; */\n#endif\n    0x0003, /*WORD    NumberOfSections; */\n    0x00000000, /*DWORD   TimeDateStamp; */\n    0x00000000, /*DWORD   PointerToSymbolTable; */\n    0x00000000, /*DWORD   NumberOfSymbols; */\n#if defined(TCC_TARGET_X86_64)\n    0x00F0, /*WORD    SizeOfOptionalHeader; */\n    0x022F  /*WORD    Characteristics; */\n#define CHARACTERISTICS_DLL 0x222E\n#elif defined(TCC_TARGET_I386)\n    0x00E0, /*WORD    SizeOfOptionalHeader; */\n    0x030F  /*WORD    Characteristics; */\n#define CHARACTERISTICS_DLL 0x230E\n#elif defined(TCC_TARGET_ARM)\n    0x00E0, /*WORD    SizeOfOptionalHeader; */\n    0x010F, /*WORD    Characteristics; */\n#define CHARACTERISTICS_DLL 0x230F\n#endif\n},{\n    /* IMAGE_OPTIONAL_HEADER opthdr */\n    /* Standard fields. */\n#ifdef TCC_TARGET_X86_64\n    0x020B, /*WORD    Magic; */\n#else\n    0x010B, /*WORD    Magic; */\n#endif\n    0x06, /*BYTE    MajorLinkerVersion; */\n    0x00, /*BYTE    MinorLinkerVersion; */\n    0x00000000, /*DWORD   SizeOfCode; */\n    0x00000000, /*DWORD   SizeOfInitializedData; */\n    0x00000000, /*DWORD   SizeOfUninitializedData; */\n    0x00000000, /*DWORD   AddressOfEntryPoint; */\n    0x00000000, /*DWORD   BaseOfCode; */\n#ifndef TCC_TARGET_X86_64\n    0x00000000, /*DWORD   BaseOfData; */\n#endif\n    /* NT additional fields. */\n#if defined(TCC_TARGET_ARM)\n    0x00100000,\t    /*DWORD   ImageBase; */\n#else\n    0x00400000,\t    /*DWORD   ImageBase; */\n#endif\n    0x00001000, /*DWORD   SectionAlignment; */\n    0x00000200, /*DWORD   FileAlignment; */\n    0x0004, /*WORD    MajorOperatingSystemVersion; */\n    0x0000, /*WORD    MinorOperatingSystemVersion; */\n    0x0000, /*WORD    MajorImageVersion; */\n    0x0000, /*WORD    MinorImageVersion; */\n    0x0004, /*WORD    MajorSubsystemVersion; */\n    0x0000, /*WORD    MinorSubsystemVersion; */\n    0x00000000, /*DWORD   Win32VersionValue; */\n    0x00000000, /*DWORD   SizeOfImage; */\n    0x00000200, /*DWORD   SizeOfHeaders; */\n    0x00000000, /*DWORD   CheckSum; */\n    0x0002, /*WORD    Subsystem; */\n    0x0000, /*WORD    DllCharacteristics; */\n    0x00100000, /*DWORD   SizeOfStackReserve; */\n    0x00001000, /*DWORD   SizeOfStackCommit; */\n    0x00100000, /*DWORD   SizeOfHeapReserve; */\n    0x00001000, /*DWORD   SizeOfHeapCommit; */\n    0x00000000, /*DWORD   LoaderFlags; */\n    0x00000010, /*DWORD   NumberOfRvaAndSizes; */\n\n    /* IMAGE_DATA_DIRECTORY DataDirectory[16]; */\n    {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},\n     {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}}\n    }};\n\n    struct pe_header pe_header = pe_template;\n\n    int i;\n    FILE *op;\n    DWORD file_offset, sum;\n    struct section_info *si;\n    IMAGE_SECTION_HEADER *psh;\n\n    op = fopen(pe->filename, \"wb\");\n    if (NULL == op) {\n        tcc_error_noabort(\"could not write '%s': %s\", pe->filename, strerror(errno));\n        return -1;\n    }\n\n    pe->sizeofheaders = pe_file_align(pe,\n        sizeof (struct pe_header)\n        + pe->sec_count * sizeof (IMAGE_SECTION_HEADER)\n        );\n\n    file_offset = pe->sizeofheaders;\n\n    if (2 == pe->s1->verbose)\n        printf(\"-------------------------------\"\n               \"\\n  virt   file   size  section\" \"\\n\");\n    for (i = 0; i < pe->sec_count; ++i) {\n        DWORD addr, size;\n        const char *sh_name;\n\n        si = pe->sec_info + i;\n        sh_name = si->name;\n        addr = si->sh_addr - pe->imagebase;\n        size = si->sh_size;\n        psh = &si->ish;\n\n        if (2 == pe->s1->verbose)\n            printf(\"%6x %6x %6x  %s\\n\",\n                (unsigned)addr, (unsigned)file_offset, (unsigned)size, sh_name);\n\n        switch (si->cls) {\n            case sec_text:\n                pe_header.opthdr.BaseOfCode = addr;\n                pe_header.opthdr.AddressOfEntryPoint = addr + pe->start_addr;\n                break;\n\n            case sec_data:\n#ifndef TCC_TARGET_X86_64\n                pe_header.opthdr.BaseOfData = addr;\n#endif\n                break;\n\n            case sec_bss:\n                break;\n\n            case sec_reloc:\n                pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_BASERELOC, addr, size);\n                break;\n\n            case sec_rsrc:\n                pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_RESOURCE, addr, size);\n                break;\n\n            case sec_pdata:\n                pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_EXCEPTION, addr, size);\n                break;\n\n            case sec_stab:\n                break;\n        }\n\n        if (pe->thunk == pe->s1->sections[si->ord]) {\n            if (pe->imp_size) {\n                pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_IMPORT,\n                    pe->imp_offs + addr, pe->imp_size);\n                pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_IAT,\n                    pe->iat_offs + addr, pe->iat_size);\n            }\n            if (pe->exp_size) {\n                pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_EXPORT,\n                    pe->exp_offs + addr, pe->exp_size);\n            }\n        }\n\n        pstrcpy((char*)psh->Name, sizeof psh->Name, sh_name);\n\n        psh->Characteristics = pe_sec_flags[si->cls];\n        psh->VirtualAddress = addr;\n        psh->Misc.VirtualSize = size;\n        pe_header.opthdr.SizeOfImage =\n            umax(pe_virtual_align(pe, size + addr), pe_header.opthdr.SizeOfImage);\n\n        if (si->data_size) {\n            psh->PointerToRawData = file_offset;\n            file_offset = pe_file_align(pe, file_offset + si->data_size);\n            psh->SizeOfRawData = file_offset - psh->PointerToRawData;\n        }\n    }\n\n    //pe_header.filehdr.TimeDateStamp = time(NULL);\n    pe_header.filehdr.NumberOfSections = pe->sec_count;\n    pe_header.opthdr.SizeOfHeaders = pe->sizeofheaders;\n    pe_header.opthdr.ImageBase = pe->imagebase;\n    pe_header.opthdr.Subsystem = pe->subsystem;\n    if (pe->s1->pe_stack_size)\n        pe_header.opthdr.SizeOfStackReserve = pe->s1->pe_stack_size;\n    if (PE_DLL == pe->type)\n        pe_header.filehdr.Characteristics = CHARACTERISTICS_DLL;\n\n    sum = 0;\n    pe_fwrite(&pe_header, sizeof pe_header, op, &sum);\n    for (i = 0; i < pe->sec_count; ++i)\n        pe_fwrite(&pe->sec_info[i].ish, sizeof(IMAGE_SECTION_HEADER), op, &sum);\n    pe_fpad(op, pe->sizeofheaders);\n    for (i = 0; i < pe->sec_count; ++i) {\n        si = pe->sec_info + i;\n        psh = &si->ish;\n        if (si->data_size) {\n            pe_fwrite(si->data, si->data_size, op, &sum);\n            file_offset = psh->PointerToRawData + psh->SizeOfRawData;\n            pe_fpad(op, file_offset);\n        }\n    }\n\n    pe_header.opthdr.CheckSum = sum + file_offset;\n    fseek(op, offsetof(struct pe_header, opthdr.CheckSum), SEEK_SET);\n    pe_fwrite(&pe_header.opthdr.CheckSum, sizeof pe_header.opthdr.CheckSum, op, NULL);\n    fclose (op);\n\n    if (2 == pe->s1->verbose)\n        printf(\"-------------------------------\\n\");\n    if (pe->s1->verbose)\n        printf(\"<- %s (%u bytes)\\n\", pe->filename, (unsigned)file_offset);\n\n    return 0;\n}\n\n/*----------------------------------------------------------------------------*/\n\n#if defined(TCC_TARGET_X86_64)\n#define REL_TYPE_DIRECT R_X86_64_64\n#define R_XXX_THUNKFIX R_X86_64_PC32\n#define R_XXX_RELATIVE R_X86_64_RELATIVE\n\n#elif defined(TCC_TARGET_I386)\n#define REL_TYPE_DIRECT R_386_32\n#define R_XXX_THUNKFIX R_386_32\n#define R_XXX_RELATIVE R_386_RELATIVE\n\n#elif defined(TCC_TARGET_ARM)\n#define REL_TYPE_DIRECT R_ARM_ABS32\n#define R_XXX_THUNKFIX R_ARM_ABS32\n#define R_XXX_RELATIVE R_ARM_RELATIVE\n\n#endif\n/*----------------------------------------------------------------------------*/\n\nstatic struct import_symbol *pe_add_import(struct pe_info *pe, int sym_index)\n{\n    int i;\n    int dll_index;\n    struct pe_import_info *p;\n    struct import_symbol *s;\n    ElfW(Sym) *isym;\n\n    isym = (ElfW(Sym) *)pe->s1->dynsymtab_section->data + sym_index;\n    dll_index = isym->st_size;\n\n    i = dynarray_assoc ((void**)pe->imp_info, pe->imp_count, dll_index);\n    if (-1 != i) {\n        p = pe->imp_info[i];\n        goto found_dll;\n    }\n    p = tcc_mallocz(sizeof *p);\n    p->dll_index = dll_index;\n    dynarray_add((void***)&pe->imp_info, &pe->imp_count, p);\n\nfound_dll:\n    i = dynarray_assoc ((void**)p->symbols, p->sym_count, sym_index);\n    if (-1 != i)\n        return p->symbols[i];\n\n    s = tcc_mallocz(sizeof *s);\n    dynarray_add((void***)&p->symbols, &p->sym_count, s);\n    s->sym_index = sym_index;\n    return s;\n}\n\n/*----------------------------------------------------------------------------*/\nstatic void pe_build_imports(struct pe_info *pe)\n{\n    int thk_ptr, ent_ptr, dll_ptr, sym_cnt, i;\n    DWORD rva_base = pe->thunk->sh_addr - pe->imagebase;\n    int ndlls = pe->imp_count;\n\n    for (sym_cnt = i = 0; i < ndlls; ++i)\n        sym_cnt += pe->imp_info[i]->sym_count;\n\n    if (0 == sym_cnt)\n        return;\n\n    pe_align_section(pe->thunk, 16);\n\n    pe->imp_offs = dll_ptr = pe->thunk->data_offset;\n    pe->imp_size = (ndlls + 1) * sizeof(IMAGE_IMPORT_DESCRIPTOR);\n    pe->iat_offs = dll_ptr + pe->imp_size;\n    pe->iat_size = (sym_cnt + ndlls) * sizeof(ADDR3264);\n    section_ptr_add(pe->thunk, pe->imp_size + 2*pe->iat_size);\n\n    thk_ptr = pe->iat_offs;\n    ent_ptr = pe->iat_offs + pe->iat_size;\n\n    for (i = 0; i < pe->imp_count; ++i) {\n        IMAGE_IMPORT_DESCRIPTOR *hdr;\n        int k, n, dllindex;\n        ADDR3264 v;\n        struct pe_import_info *p = pe->imp_info[i];\n        const char *name;\n        DLLReference *dllref;\n\n        dllindex = p->dll_index;\n        if (dllindex)\n            name = (dllref = pe->s1->loaded_dlls[dllindex-1])->name;\n        else\n            name = \"\", dllref = NULL;\n\n        /* put the dll name into the import header */\n        v = put_elf_str(pe->thunk, name);\n        hdr = (IMAGE_IMPORT_DESCRIPTOR*)(pe->thunk->data + dll_ptr);\n        hdr->FirstThunk = thk_ptr + rva_base;\n        hdr->OriginalFirstThunk = ent_ptr + rva_base;\n        hdr->Name = v + rva_base;\n\n        for (k = 0, n = p->sym_count; k <= n; ++k) {\n            if (k < n) {\n                int iat_index = p->symbols[k]->iat_index;\n                int sym_index = p->symbols[k]->sym_index;\n                ElfW(Sym) *imp_sym = (ElfW(Sym) *)pe->s1->dynsymtab_section->data + sym_index;\n                ElfW(Sym) *org_sym = (ElfW(Sym) *)symtab_section->data + iat_index;\n                const char *name = pe->s1->dynsymtab_section->link->data + imp_sym->st_name;\n\n                org_sym->st_value = thk_ptr;\n                org_sym->st_shndx = pe->thunk->sh_num;\n                v = pe->thunk->data_offset + rva_base;\n                section_ptr_add(pe->thunk, sizeof(WORD)); /* hint, not used */\n                put_elf_str(pe->thunk, name);\n#ifdef TCC_IS_NATIVE\n                if (pe->type == PE_RUN) {\n                    v = imp_sym->st_value;\n                    if (dllref) {\n                        if ( !dllref->handle )\n                            dllref->handle = LoadLibrary(dllref->name);\n                        v = (ADDR3264)GetProcAddress(dllref->handle, name);\n                    }\n                    if (!v)\n                        tcc_error_noabort(\"undefined symbol '%s'\", name);\n                }\n#endif\n            } else {\n                v = 0; /* last entry is zero */\n            }\n            *(ADDR3264*)(pe->thunk->data+thk_ptr) =\n            *(ADDR3264*)(pe->thunk->data+ent_ptr) = v;\n            thk_ptr += sizeof (ADDR3264);\n            ent_ptr += sizeof (ADDR3264);\n        }\n        dll_ptr += sizeof(IMAGE_IMPORT_DESCRIPTOR);\n        dynarray_reset(&p->symbols, &p->sym_count);\n    }\n    dynarray_reset(&pe->imp_info, &pe->imp_count);\n}\n\n/* ------------------------------------------------------------- */\n\nstruct pe_sort_sym\n{\n    int index;\n    const char *name;\n};\n\nstatic int sym_cmp(const void *va, const void *vb)\n{\n    const char *ca = (*(struct pe_sort_sym**)va)->name;\n    const char *cb = (*(struct pe_sort_sym**)vb)->name;\n    return strcmp(ca, cb);\n}\n\nstatic void pe_build_exports(struct pe_info *pe)\n{\n    ElfW(Sym) *sym;\n    int sym_index, sym_end;\n    DWORD rva_base, func_o, name_o, ord_o, str_o;\n    IMAGE_EXPORT_DIRECTORY *hdr;\n    int sym_count, ord;\n    struct pe_sort_sym **sorted, *p;\n\n    FILE *op;\n    char buf[MAX_PATH];\n    const char *dllname;\n    const char *name;\n\n    rva_base = pe->thunk->sh_addr - pe->imagebase;\n    sym_count = 0, sorted = NULL, op = NULL;\n\n    sym_end = symtab_section->data_offset / sizeof(ElfW(Sym));\n    for (sym_index = 1; sym_index < sym_end; ++sym_index) {\n        sym = (ElfW(Sym)*)symtab_section->data + sym_index;\n        name = pe_export_name(pe->s1, sym);\n        if ((sym->st_other & 1)\n            /* export only symbols from actually written sections */\n            && pe->s1->sections[sym->st_shndx]->sh_addr) {\n            p = tcc_malloc(sizeof *p);\n            p->index = sym_index;\n            p->name = name;\n            dynarray_add((void***)&sorted, &sym_count, p);\n        }\n#if 0\n        if (sym->st_other & 1)\n            printf(\"export: %s\\n\", name);\n        if (sym->st_other & 2)\n            printf(\"stdcall: %s\\n\", name);\n#endif\n    }\n\n    if (0 == sym_count)\n        return;\n\n    qsort (sorted, sym_count, sizeof *sorted, sym_cmp);\n\n    pe_align_section(pe->thunk, 16);\n    dllname = tcc_basename(pe->filename);\n\n    pe->exp_offs = pe->thunk->data_offset;\n    func_o = pe->exp_offs + sizeof(IMAGE_EXPORT_DIRECTORY);\n    name_o = func_o + sym_count * sizeof (DWORD);\n    ord_o = name_o + sym_count * sizeof (DWORD);\n    str_o = ord_o + sym_count * sizeof(WORD);\n\n    hdr = section_ptr_add(pe->thunk, str_o - pe->exp_offs);\n    hdr->Characteristics        = 0;\n    hdr->Base                   = 1;\n    hdr->NumberOfFunctions      = sym_count;\n    hdr->NumberOfNames          = sym_count;\n    hdr->AddressOfFunctions     = func_o + rva_base;\n    hdr->AddressOfNames         = name_o + rva_base;\n    hdr->AddressOfNameOrdinals  = ord_o + rva_base;\n    hdr->Name                   = str_o + rva_base;\n    put_elf_str(pe->thunk, dllname);\n\n#if 1\n    /* automatically write exports to <output-filename>.def */\n    pstrcpy(buf, sizeof buf, pe->filename);\n    strcpy(tcc_fileextension(buf), \".def\");\n    op = fopen(buf, \"w\");\n    if (NULL == op) {\n        tcc_error_noabort(\"could not create '%s': %s\", buf, strerror(errno));\n    } else {\n        fprintf(op, \"LIBRARY %s\\n\\nEXPORTS\\n\", dllname);\n        if (pe->s1->verbose)\n            printf(\"<- %s (%d symbols)\\n\", buf, sym_count);\n    }\n#endif\n\n    for (ord = 0; ord < sym_count; ++ord)\n    {\n        p = sorted[ord], sym_index = p->index, name = p->name;\n        /* insert actual address later in pe_relocate_rva */\n        put_elf_reloc(symtab_section, pe->thunk,\n            func_o, R_XXX_RELATIVE, sym_index);\n        *(DWORD*)(pe->thunk->data + name_o)\n            = pe->thunk->data_offset + rva_base;\n        *(WORD*)(pe->thunk->data + ord_o)\n            = ord;\n        put_elf_str(pe->thunk, name);\n        func_o += sizeof (DWORD);\n        name_o += sizeof (DWORD);\n        ord_o += sizeof (WORD);\n        if (op)\n            fprintf(op, \"%s\\n\", name);\n    }\n    pe->exp_size = pe->thunk->data_offset - pe->exp_offs;\n    dynarray_reset(&sorted, &sym_count);\n    if (op)\n        fclose(op);\n}\n\n/* ------------------------------------------------------------- */\nstatic void pe_build_reloc (struct pe_info *pe)\n{\n    DWORD offset, block_ptr, addr;\n    int count, i;\n    ElfW_Rel *rel, *rel_end;\n    Section *s = NULL, *sr;\n\n    offset = addr = block_ptr = count = i = 0;\n    rel = rel_end = NULL;\n\n    for(;;) {\n        if (rel < rel_end) {\n            int type = ELFW(R_TYPE)(rel->r_info);\n            addr = rel->r_offset + s->sh_addr;\n            ++ rel;\n            if (type != REL_TYPE_DIRECT)\n                continue;\n            if (count == 0) { /* new block */\n                block_ptr = pe->reloc->data_offset;\n                section_ptr_add(pe->reloc, sizeof(struct pe_reloc_header));\n                offset = addr & 0xFFFFFFFF<<12;\n            }\n            if ((addr -= offset)  < (1<<12)) { /* one block spans 4k addresses */\n                WORD *wp = section_ptr_add(pe->reloc, sizeof (WORD));\n                *wp = addr | IMAGE_REL_BASED_HIGHLOW<<12;\n                ++count;\n                continue;\n            }\n            -- rel;\n\n        } else if (i < pe->sec_count) {\n            sr = (s = pe->s1->sections[pe->sec_info[i++].ord])->reloc;\n            if (sr) {\n                rel = (ElfW_Rel *)sr->data;\n                rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);\n            }\n            continue;\n        }\n\n        if (count) {\n            /* store the last block and ready for a new one */\n            struct pe_reloc_header *hdr;\n            if (count & 1) /* align for DWORDS */\n                section_ptr_add(pe->reloc, sizeof(WORD)), ++count;\n            hdr = (struct pe_reloc_header *)(pe->reloc->data + block_ptr);\n            hdr -> offset = offset - pe->imagebase;\n            hdr -> size = count * sizeof(WORD) + sizeof(struct pe_reloc_header);\n            count = 0;\n        }\n\n        if (rel >= rel_end)\n            break;\n    }\n}\n\n/* ------------------------------------------------------------- */\nstatic int pe_section_class(Section *s)\n{\n    int type, flags;\n    const char *name;\n\n    type = s->sh_type;\n    flags = s->sh_flags;\n    name = s->name;\n    if (flags & SHF_ALLOC) {\n        if (type == SHT_PROGBITS) {\n            if (flags & SHF_EXECINSTR)\n                return sec_text;\n            if (flags & SHF_WRITE)\n                return sec_data;\n            if (0 == strcmp(name, \".rsrc\"))\n                return sec_rsrc;\n            if (0 == strcmp(name, \".iedat\"))\n                return sec_idata;\n            if (0 == strcmp(name, \".pdata\"))\n                return sec_pdata;\n            return sec_other;\n        } else if (type == SHT_NOBITS) {\n            if (flags & SHF_WRITE)\n                return sec_bss;\n        }\n    } else {\n        if (0 == strcmp(name, \".reloc\"))\n            return sec_reloc;\n        if (0 == strncmp(name, \".stab\", 5)) /* .stab and .stabstr */\n            return sec_stab;\n    }\n    return -1;\n}\n\nstatic int pe_assign_addresses (struct pe_info *pe)\n{\n    int i, k, o, c;\n    DWORD addr;\n    int *section_order;\n    struct section_info *si;\n    Section *s;\n\n    // pe->thunk = new_section(pe->s1, \".iedat\", SHT_PROGBITS, SHF_ALLOC);\n\n    section_order = tcc_malloc(pe->s1->nb_sections * sizeof (int));\n    for (o = k = 0 ; k < sec_last; ++k) {\n        for (i = 1; i < pe->s1->nb_sections; ++i) {\n            s = pe->s1->sections[i];\n            if (k == pe_section_class(s)) {\n                // printf(\"%s %d\\n\", s->name, k);\n                s->sh_addr = pe->imagebase;\n                section_order[o++] = i;\n            }\n        }\n    }\n\n    pe->sec_info = tcc_mallocz(o * sizeof (struct section_info));\n    addr = pe->imagebase + 1;\n\n    for (i = 0; i < o; ++i)\n    {\n        k = section_order[i];\n        s = pe->s1->sections[k];\n        c = pe_section_class(s);\n        si = &pe->sec_info[pe->sec_count];\n\n#ifdef PE_MERGE_DATA\n        if (c == sec_bss && pe->sec_count && si[-1].cls == sec_data) {\n            /* append .bss to .data */\n            s->sh_addr = addr = ((addr-1) | (s->sh_addralign-1)) + 1;\n            addr += s->data_offset;\n            si[-1].sh_size = addr - si[-1].sh_addr;\n            continue;\n        }\n#endif\n        if (c == sec_stab && 0 == pe->s1->do_debug)\n            continue;\n\n        strcpy(si->name, s->name);\n        si->cls = c;\n        si->ord = k;\n        si->sh_addr = s->sh_addr = addr = pe_virtual_align(pe, addr);\n        si->sh_flags = s->sh_flags;\n\n        if (c == sec_data && NULL == pe->thunk)\n            pe->thunk = s;\n\n        if (s == pe->thunk) {\n            pe_build_imports(pe);\n            pe_build_exports(pe);\n        }\n\n        if (c == sec_reloc)\n            pe_build_reloc (pe);\n\n        if (s->data_offset)\n        {\n            if (s->sh_type != SHT_NOBITS) {\n                si->data = s->data;\n                si->data_size = s->data_offset;\n            }\n\n            addr += s->data_offset;\n            si->sh_size = s->data_offset;\n            ++pe->sec_count;\n        }\n        // printf(\"%08x %05x %s\\n\", si->sh_addr, si->sh_size, si->name);\n    }\n\n#if 0\n    for (i = 1; i < pe->s1->nb_sections; ++i) {\n        Section *s = pe->s1->sections[i];\n        int type = s->sh_type;\n        int flags = s->sh_flags;\n        printf(\"section %-16s %-10s %5x %s,%s,%s\\n\",\n            s->name,\n            type == SHT_PROGBITS ? \"progbits\" :\n            type == SHT_NOBITS ? \"nobits\" :\n            type == SHT_SYMTAB ? \"symtab\" :\n            type == SHT_STRTAB ? \"strtab\" :\n            type == SHT_RELX ? \"rel\" : \"???\",\n            s->data_offset,\n            flags & SHF_ALLOC ? \"alloc\" : \"\",\n            flags & SHF_WRITE ? \"write\" : \"\",\n            flags & SHF_EXECINSTR ? \"exec\" : \"\"\n            );\n    }\n    pe->s1->verbose = 2;\n#endif\n\n    tcc_free(section_order);\n    return 0;\n}\n\n/* ------------------------------------------------------------- */\nstatic void pe_relocate_rva (struct pe_info *pe, Section *s)\n{\n    Section *sr = s->reloc;\n    ElfW_Rel *rel, *rel_end;\n    rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);\n    for(rel = (ElfW_Rel *)sr->data; rel < rel_end; rel++) {\n        if (ELFW(R_TYPE)(rel->r_info) == R_XXX_RELATIVE) {\n            int sym_index = ELFW(R_SYM)(rel->r_info);\n            DWORD addr = s->sh_addr;\n            if (sym_index) {\n                ElfW(Sym) *sym = (ElfW(Sym) *)symtab_section->data + sym_index;\n                addr = sym->st_value;\n            }\n            // printf(\"reloc rva %08x %08x %s\\n\", (DWORD)rel->r_offset, addr, s->name);\n            *(DWORD*)(s->data + rel->r_offset) += addr - pe->imagebase;\n        }\n    }\n}\n\n/*----------------------------------------------------------------------------*/\n\nstatic int pe_isafunc(int sym_index)\n{\n    Section *sr = text_section->reloc;\n    ElfW_Rel *rel, *rel_end;\n    Elf32_Word info = ELF32_R_INFO(sym_index, R_386_PC32);\n    if (!sr)\n        return 0;\n    rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);\n    for (rel = (ElfW_Rel *)sr->data; rel < rel_end; rel++)\n        if (rel->r_info == info)\n            return 1;\n    return 0;\n}\n\n/*----------------------------------------------------------------------------*/\nstatic int pe_check_symbols(struct pe_info *pe)\n{\n    ElfW(Sym) *sym;\n    int sym_index, sym_end;\n    int ret = 0;\n\n    pe_align_section(text_section, 8);\n\n    sym_end = symtab_section->data_offset / sizeof(ElfW(Sym));\n    for (sym_index = 1; sym_index < sym_end; ++sym_index) {\n\n        sym = (ElfW(Sym) *)symtab_section->data + sym_index;\n        if (sym->st_shndx == SHN_UNDEF) {\n\n            const char *name = symtab_section->link->data + sym->st_name;\n            unsigned type = ELFW(ST_TYPE)(sym->st_info);\n            int imp_sym = pe_find_import(pe->s1, sym);\n            struct import_symbol *is;\n\n            if (0 == imp_sym)\n                goto not_found;\n\n            if (type == STT_NOTYPE) {\n                /* symbols from assembler have no type, find out which */\n                if (pe_isafunc(sym_index))\n                    type = STT_FUNC;\n                else\n                    type = STT_OBJECT;\n            }\n\n            is = pe_add_import(pe, imp_sym);\n\n            if (type == STT_FUNC) {\n                unsigned long offset = is->thk_offset;\n                if (offset) {\n                    /* got aliased symbol, like stricmp and _stricmp */\n\n                } else {\n                    char buffer[100];\n                    WORD *p;\n\n                    offset = text_section->data_offset;\n                    /* add the 'jmp IAT[x]' instruction */\n#ifdef TCC_TARGET_ARM\n                    p = section_ptr_add(text_section, 8+4); // room for code and address\n                    (*(DWORD*)(p)) = 0xE59FC000; // arm code ldr ip, [pc] ; PC+8+0 = 0001xxxx\n                    (*(DWORD*)(p+2)) = 0xE59CF000; // arm code ldr pc, [ip]\n#else\n                    p = section_ptr_add(text_section, 8);\n                    *p = 0x25FF;\n#ifdef TCC_TARGET_X86_64\n                    *(DWORD*)(p+1) = (DWORD)-4;\n#endif\n#endif\n                    /* add a helper symbol, will be patched later in\n                       pe_build_imports */\n                    sprintf(buffer, \"IAT.%s\", name);\n                    is->iat_index = put_elf_sym(\n                        symtab_section, 0, sizeof(DWORD),\n                        ELFW(ST_INFO)(STB_GLOBAL, STT_OBJECT),\n                        0, SHN_UNDEF, buffer);\n#ifdef TCC_TARGET_ARM\n                    put_elf_reloc(symtab_section, text_section,\n                        offset + 8, R_XXX_THUNKFIX, is->iat_index); // offset to IAT position\n#else\n                    put_elf_reloc(symtab_section, text_section, \n                        offset + 2, R_XXX_THUNKFIX, is->iat_index);\n#endif\n                    is->thk_offset = offset;\n                }\n\n                /* tcc_realloc might have altered sym's address */\n                sym = (ElfW(Sym) *)symtab_section->data + sym_index;\n\n                /* patch the original symbol */\n                sym->st_value = offset;\n                sym->st_shndx = text_section->sh_num;\n                sym->st_other &= ~1; /* do not export */\n                continue;\n            }\n\n            if (type == STT_OBJECT) { /* data, ptr to that should be */\n                if (0 == is->iat_index) {\n                    /* original symbol will be patched later in pe_build_imports */\n                    is->iat_index = sym_index;\n                    continue;\n                }\n            }\n\n        not_found:\n            tcc_error_noabort(\"undefined symbol '%s'\", name);\n            ret = -1;\n\n        } else if (pe->s1->rdynamic\n                   && ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {\n            /* if -rdynamic option, then export all non local symbols */\n            sym->st_other |= 1;\n        }\n    }\n    return ret;\n}\n\n/*----------------------------------------------------------------------------*/\n#ifdef PE_PRINT_SECTIONS\nstatic void pe_print_section(FILE * f, Section * s)\n{\n    /* just if you'r curious */\n    BYTE *p, *e, b;\n    int i, n, l, m;\n    p = s->data;\n    e = s->data + s->data_offset;\n    l = e - p;\n\n    fprintf(f, \"section  \\\"%s\\\"\", s->name);\n    if (s->link)\n        fprintf(f, \"\\nlink     \\\"%s\\\"\", s->link->name);\n    if (s->reloc)\n        fprintf(f, \"\\nreloc    \\\"%s\\\"\", s->reloc->name);\n    fprintf(f, \"\\nv_addr   %08X\", (unsigned)s->sh_addr);\n    fprintf(f, \"\\ncontents %08X\", (unsigned)l);\n    fprintf(f, \"\\n\\n\");\n\n    if (s->sh_type == SHT_NOBITS)\n        return;\n\n    if (0 == l)\n        return;\n\n    if (s->sh_type == SHT_SYMTAB)\n        m = sizeof(ElfW(Sym));\n    else if (s->sh_type == SHT_RELX)\n        m = sizeof(ElfW_Rel);\n    else\n        m = 16;\n\n    fprintf(f, \"%-8s\", \"offset\");\n    for (i = 0; i < m; ++i)\n        fprintf(f, \" %02x\", i);\n    n = 56;\n\n    if (s->sh_type == SHT_SYMTAB || s->sh_type == SHT_RELX) {\n        const char *fields1[] = {\n            \"name\",\n            \"value\",\n            \"size\",\n            \"bind\",\n            \"type\",\n            \"other\",\n            \"shndx\",\n            NULL\n        };\n\n        const char *fields2[] = {\n            \"offs\",\n            \"type\",\n            \"symb\",\n            NULL\n        };\n\n        const char **p;\n\n        if (s->sh_type == SHT_SYMTAB)\n            p = fields1, n = 106;\n        else\n            p = fields2, n = 58;\n\n        for (i = 0; p[i]; ++i)\n            fprintf(f, \"%6s\", p[i]);\n        fprintf(f, \"  symbol\");\n    }\n\n    fprintf(f, \"\\n\");\n    for (i = 0; i < n; ++i)\n        fprintf(f, \"-\");\n    fprintf(f, \"\\n\");\n\n    for (i = 0; i < l;)\n    {\n        fprintf(f, \"%08X\", i);\n        for (n = 0; n < m; ++n) {\n            if (n + i < l)\n                fprintf(f, \" %02X\", p[i + n]);\n            else\n                fprintf(f, \"   \");\n        }\n\n        if (s->sh_type == SHT_SYMTAB) {\n            ElfW(Sym) *sym = (ElfW(Sym) *) (p + i);\n            const char *name = s->link->data + sym->st_name;\n            fprintf(f, \"  %04X  %04X  %04X   %02X    %02X    %02X   %04X  \\\"%s\\\"\",\n                    (unsigned)sym->st_name,\n                    (unsigned)sym->st_value,\n                    (unsigned)sym->st_size,\n                    (unsigned)ELFW(ST_BIND)(sym->st_info),\n                    (unsigned)ELFW(ST_TYPE)(sym->st_info),\n                    (unsigned)sym->st_other,\n                    (unsigned)sym->st_shndx,\n                    name);\n\n        } else if (s->sh_type == SHT_RELX) {\n            ElfW_Rel *rel = (ElfW_Rel *) (p + i);\n            ElfW(Sym) *sym =\n                (ElfW(Sym) *) s->link->data + ELFW(R_SYM)(rel->r_info);\n            const char *name = s->link->link->data + sym->st_name;\n            fprintf(f, \"  %04X   %02X   %04X  \\\"%s\\\"\",\n                    (unsigned)rel->r_offset,\n                    (unsigned)ELFW(R_TYPE)(rel->r_info),\n                    (unsigned)ELFW(R_SYM)(rel->r_info),\n                    name);\n        } else {\n            fprintf(f, \"   \");\n            for (n = 0; n < m; ++n) {\n                if (n + i < l) {\n                    b = p[i + n];\n                    if (b < 32 || b >= 127)\n                        b = '.';\n                    fprintf(f, \"%c\", b);\n                }\n            }\n        }\n        i += m;\n        fprintf(f, \"\\n\");\n    }\n    fprintf(f, \"\\n\\n\");\n}\n\nstatic void pe_print_sections(TCCState *s1, const char *fname)\n{\n    Section *s;\n    FILE *f;\n    int i;\n    f = fopen(fname, \"w\");\n    for (i = 1; i < s1->nb_sections; ++i) {\n        s = s1->sections[i];\n        pe_print_section(f, s);\n    }\n    pe_print_section(f, s1->dynsymtab_section);\n    fclose(f);\n}\n#endif\n\n/* ------------------------------------------------------------- */\n/* helper function for load/store to insert one more indirection */\n\nST_FUNC SValue *pe_getimport(SValue *sv, SValue *v2)\n{\n    Sym *sym;\n    ElfW(Sym) *esym;\n    int r2;\n\n    if ((sv->r & (VT_VALMASK|VT_SYM)) != (VT_CONST|VT_SYM) || (sv->r2 != VT_CONST))\n        return sv;\n    sym = sv->sym;\n    if ((sym->type.t & (VT_EXTERN|VT_STATIC)) != VT_EXTERN)\n        return sv;\n    if (!sym->c)\n        put_extern_sym(sym, NULL, 0, 0);\n    esym = &((ElfW(Sym) *)symtab_section->data)[sym->c];\n    if (!(esym->st_other & 4))\n        return sv;\n\n    // printf(\"import %04x %04x %04x %s\\n\", sv->type.t, sym->type.t, sv->r, get_tok_str(sv->sym->v, NULL));\n\n    memset(v2, 0, sizeof *v2);\n    v2->type.t = VT_PTR;\n    v2->r = VT_CONST | VT_SYM | VT_LVAL;\n    v2->sym = sv->sym;\n\n    r2 = get_reg(RC_INT);\n    load(r2, v2);\n    v2->r = r2;\n\n    if (sv->c.ui) {\n        vpushv(v2);\n        vpushi(sv->c.ui);\n        gen_opi('+');\n        *v2 = *vtop--;\n    }\n\n    v2->type.t = sv->type.t;\n    v2->r |= sv->r & VT_LVAL;\n    return v2;\n}\n\nST_FUNC int pe_putimport(TCCState *s1, int dllindex, const char *name, addr_t value)\n{\n    return add_elf_sym(\n        s1->dynsymtab_section,\n        value,\n        dllindex, /* st_size */\n        ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE),\n        0,\n        value ? SHN_ABS : SHN_UNDEF,\n        name\n        );\n}\n\nstatic int add_dllref(TCCState *s1, const char *dllname)\n{\n    DLLReference *dllref;\n    int i;\n    for (i = 0; i < s1->nb_loaded_dlls; ++i)\n        if (0 == strcmp(s1->loaded_dlls[i]->name, dllname))\n            return i + 1;\n    dllref = tcc_mallocz(sizeof(DLLReference) + strlen(dllname));\n    strcpy(dllref->name, dllname);\n    dynarray_add((void ***) &s1->loaded_dlls, &s1->nb_loaded_dlls, dllref);\n    return s1->nb_loaded_dlls;\n}\n\n/* ------------------------------------------------------------- */\n\nstatic int read_mem(int fd, unsigned offset, void *buffer, unsigned len)\n{\n    lseek(fd, offset, SEEK_SET);\n    return len == read(fd, buffer, len);\n}\n\n/* -------------------------------------------------------------\n *  This is for compiled windows resources in 'coff' format\n *  as generated by 'windres.exe -O coff ...'.\n */\n\nstatic int pe_load_res(TCCState *s1, int fd)\n{\n    struct pe_rsrc_header hdr;\n    Section *rsrc_section;\n    int i, ret = -1;\n    BYTE *ptr;\n    unsigned offs;\n\n    if (!read_mem(fd, 0, &hdr, sizeof hdr))\n        goto quit;\n\n    if (hdr.filehdr.Machine != 0x014C\n        || hdr.filehdr.NumberOfSections != 1\n        || strcmp(hdr.sectionhdr.Name, \".rsrc\") != 0)\n        goto quit;\n\n    rsrc_section = new_section(s1, \".rsrc\", SHT_PROGBITS, SHF_ALLOC);\n    ptr = section_ptr_add(rsrc_section, hdr.sectionhdr.SizeOfRawData);\n    offs = hdr.sectionhdr.PointerToRawData;\n    if (!read_mem(fd, offs, ptr, hdr.sectionhdr.SizeOfRawData))\n        goto quit;\n    offs = hdr.sectionhdr.PointerToRelocations;\n    for (i = 0; i < hdr.sectionhdr.NumberOfRelocations; ++i)\n    {\n        struct pe_rsrc_reloc rel;\n        if (!read_mem(fd, offs, &rel, sizeof rel))\n            goto quit;\n        // printf(\"rsrc_reloc: %x %x %x\\n\", rel.offset, rel.size, rel.type);\n        if (rel.type != 7) /* DIR32NB */\n            goto quit;\n        put_elf_reloc(symtab_section, rsrc_section,\n            rel.offset, R_XXX_RELATIVE, 0);\n        offs += sizeof rel;\n    }\n    ret = 0;\nquit:\n    return ret;\n}\n\n/* ------------------------------------------------------------- */\nstatic char *trimfront(char *p)\n{\n    while (*p && (unsigned char)*p <= ' ')\n        ++p;\n    return p;\n}\n\nstatic char *trimback(char *a, char *e)\n{\n    while (e > a && (unsigned char)e[-1] <= ' ')\n        --e;\n    *e = 0;;\n    return a;\n}\n\nstatic char *get_line(char *line, int size, int fd)\n{\n    int n;\n    for (n = 0; n < size - 1; )\n        if (read(fd, line + n, 1) < 1 || line[n++] == '\\n')\n            break;\n    if (0 == n)\n        return NULL;\n    trimback(line, line + n);\n    return trimfront(line);\n}\n\n/* ------------------------------------------------------------- */\nstatic int pe_load_def(TCCState *s1, int fd)\n{\n    int state = 0, ret = -1, dllindex = 0;\n    char line[400], dllname[80], *p;\n\n    for (;;) {\n        p = get_line(line, sizeof line, fd);\n        if (NULL == p)\n            break;\n        if (0 == *p || ';' == *p)\n            continue;\n        switch (state) {\n        case 0:\n            if (0 != strnicmp(p, \"LIBRARY\", 7))\n                goto quit;\n            pstrcpy(dllname, sizeof dllname, trimfront(p+7));\n            ++state;\n            continue;\n\n        case 1:\n            if (0 != stricmp(p, \"EXPORTS\"))\n                goto quit;\n            ++state;\n            continue;\n\n        case 2:\n            dllindex = add_dllref(s1, dllname);\n            ++state;\n\n        default:\n            pe_putimport(s1, dllindex, p, 0);\n            continue;\n        }\n    }\n    ret = 0;\nquit:\n    return ret;\n}\n\n/* ------------------------------------------------------------- */\n#define TINY_IMPDEF_GET_EXPORT_NAMES_ONLY\n#include \"win32/tools/tiny_impdef.c\"\n\nstatic int pe_load_dll(TCCState *s1, const char *dllname, int fd)\n{\n    char *p, *q;\n    int index;\n    p = get_export_names(fd);\n    if (!p)\n        return -1;\n    index = add_dllref(s1, dllname);\n    for (q = p; *q; q += 1 + strlen(q))\n        pe_putimport(s1, index, q, 0);\n    tcc_free(p);\n    return 0;\n}\n\n/* ------------------------------------------------------------- */\nST_FUNC int pe_load_file(struct TCCState *s1, const char *filename, int fd)\n{\n    int ret = -1;\n    char buf[10];\n    if (0 == strcmp(tcc_fileextension(filename), \".def\"))\n        ret = pe_load_def(s1, fd);\n    else if (pe_load_res(s1, fd) == 0)\n        ret = 0;\n    else if (read_mem(fd, 0, buf, sizeof buf) && 0 == strncmp(buf, \"MZ\", 2))\n        ret = pe_load_dll(s1, tcc_basename(filename), fd);\n    return ret;\n}\n\n/* ------------------------------------------------------------- */\n#ifdef TCC_TARGET_X86_64\nstatic unsigned pe_add_uwwind_info(TCCState *s1)\n{\n    if (NULL == s1->uw_pdata) {\n        s1->uw_pdata = find_section(tcc_state, \".pdata\");\n        s1->uw_pdata->sh_addralign = 4;\n        s1->uw_sym = put_elf_sym(symtab_section, 0, 0, 0, 0, text_section->sh_num, NULL);\n    }\n\n    if (0 == s1->uw_offs) {\n        /* As our functions all have the same stackframe, we use one entry for all */\n        static const unsigned char uw_info[] = {\n            0x01, // UBYTE: 3 Version , UBYTE: 5 Flags\n            0x04, // UBYTE Size of prolog\n            0x02, // UBYTE Count of unwind codes\n            0x05, // UBYTE: 4 Frame Register (rbp), UBYTE: 4 Frame Register offset (scaled)\n            // USHORT * n Unwind codes array\n            // 0x0b, 0x01, 0xff, 0xff, // stack size\n            0x04, 0x03, // set frame ptr (mov rsp -> rbp)\n            0x01, 0x50  // push reg (rbp)\n        };\n\n        Section *s = text_section;\n        unsigned char *p;\n\n        section_ptr_add(s, -s->data_offset & 3); /* align */\n        s1->uw_offs = s->data_offset;\n        p = section_ptr_add(s, sizeof uw_info);\n        memcpy(p, uw_info, sizeof uw_info);\n    }\n\n    return s1->uw_offs;\n}\n\nST_FUNC void pe_add_unwind_data(unsigned start, unsigned end, unsigned stack)\n{\n    TCCState *s1 = tcc_state;\n    Section *pd;\n    unsigned o, n, d;\n    struct /* _RUNTIME_FUNCTION */ {\n      DWORD BeginAddress;\n      DWORD EndAddress;\n      DWORD UnwindData;\n    } *p;\n\n    d = pe_add_uwwind_info(s1);\n    pd = s1->uw_pdata;\n    o = pd->data_offset;\n    p = section_ptr_add(pd, sizeof *p);\n\n    /* record this function */\n    p->BeginAddress = start;\n    p->EndAddress = end;\n    p->UnwindData = d;\n\n    /* put relocations on it */\n    for (n = o + sizeof *p; o < n; o += sizeof p->BeginAddress)\n        put_elf_reloc(symtab_section, pd, o,  R_X86_64_RELATIVE, s1->uw_sym);\n}\n#endif\n/* ------------------------------------------------------------- */\n#ifdef TCC_TARGET_X86_64\n#define PE_STDSYM(n,s) n\n#else\n#define PE_STDSYM(n,s) \"_\" n s\n#endif\n\nstatic void pe_add_runtime(TCCState *s1, struct pe_info *pe)\n{\n    const char *start_symbol;\n    ADDR3264 addr = 0;\n    int pe_type = 0;\n\n    if (find_elf_sym(symtab_section, PE_STDSYM(\"WinMain\",\"@16\")))\n        pe_type = PE_GUI;\n    else\n    if (TCC_OUTPUT_DLL == s1->output_type) {\n        pe_type = PE_DLL;\n        /* need this for 'tccelf.c:relocate_section()' */\n        s1->output_type = TCC_OUTPUT_EXE;\n    }\n    else\n        pe_type = PE_EXE;\n\n    start_symbol =\n        TCC_OUTPUT_MEMORY == s1->output_type\n        ? PE_GUI == pe_type ? \"__runwinmain\" : \"_main\"\n        : PE_DLL == pe_type ? PE_STDSYM(\"__dllstart\",\"@12\")\n        : PE_GUI == pe_type ? \"__winstart\" : \"__start\"\n        ;\n\n    if (!s1->leading_underscore || strchr(start_symbol, '@')) {\n        ++start_symbol;\n        if (start_symbol[0] != '_')\n            start_symbol = NULL;\n    }\n\n    /* grab the startup code from libtcc1 */\n    if (start_symbol)\n        add_elf_sym(symtab_section,\n            0, 0,\n            ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n            SHN_UNDEF, start_symbol);\n\n    if (0 == s1->nostdlib) {\n        static const char *libs[] = {\n            \"libtcc1.a\", \"msvcrt\", \"kernel32\", \"\", \"user32\", \"gdi32\", NULL\n        };\n        const char **pp, *p;\n        for (pp = libs; 0 != (p = *pp); ++pp) {\n            if (0 == *p) {\n                if (PE_DLL != pe_type && PE_GUI != pe_type)\n                    break;\n            } else if (pp == libs ? tcc_add_dll(s1, p, 0) : tcc_add_library(s1, p)) {\n                tcc_error_noabort(\"cannot find library: %s\", p);\n                break;\n            }\n        }\n    }\n\n    if (TCC_OUTPUT_MEMORY == s1->output_type)\n        pe_type = PE_RUN;\n\n    if (start_symbol) {\n        addr = get_elf_sym_addr(s1, start_symbol, 1);\n        if (PE_RUN == pe_type && addr)\n            /* for -run GUI's, put '_runwinmain' instead of 'main' */\n            add_elf_sym(symtab_section,\n                    addr, 0,\n                    ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,\n                    text_section->sh_num, \"main\");\n    }\n\n    pe->type = pe_type;\n    pe->start_addr = addr;\n}\n\nST_FUNC int pe_output_file(TCCState * s1, const char *filename)\n{\n    int ret;\n    struct pe_info pe;\n    int i;\n\n    memset(&pe, 0, sizeof pe);\n    pe.filename = filename;\n    pe.s1 = s1;\n\n    tcc_add_bcheck(s1);\n    pe_add_runtime(s1, &pe);\n    relocate_common_syms(); /* assign bss adresses */\n    tcc_add_linker_symbols(s1);\n\n    ret = pe_check_symbols(&pe);\n    if (ret)\n        ;\n    else if (filename) {\n        if (PE_DLL == pe.type) {\n            pe.reloc = new_section(pe.s1, \".reloc\", SHT_PROGBITS, 0);\n            /* XXX: check if is correct for arm-pe target */\n            pe.imagebase = 0x10000000;\n        } else {\n#if defined(TCC_TARGET_ARM)\n            pe.imagebase = 0x00010000;\n#else\n            pe.imagebase = 0x00400000;\n#endif\n        }\n\n#if defined(TCC_TARGET_ARM)\n        /* we use \"console\" subsystem by default */\n        pe.subsystem = 9;\n#else\n        if (PE_DLL == pe.type || PE_GUI == pe.type)\n            pe.subsystem = 2;\n        else\n            pe.subsystem = 3;\n#endif\n        /* Allow override via -Wl,-subsystem=... option */\n        if (s1->pe_subsystem != 0)\n            pe.subsystem = s1->pe_subsystem;\n\n        /* set default file/section alignment */\n\tif (pe.subsystem == 1) {\n\t    pe.section_align = 0x20;\n\t    pe.file_align = 0x20;\n\t} else {\n\t    pe.section_align = 0x1000;\n\t    pe.file_align = 0x200;\n\t}\n\n        if (s1->section_align != 0)\n            pe.section_align = s1->section_align;\n        if (s1->pe_file_align != 0)\n            pe.file_align = s1->pe_file_align;\n\n        if ((pe.subsystem >= 10) && (pe.subsystem <= 12))\n            pe.imagebase = 0;\n\n        if (s1->has_text_addr)\n            pe.imagebase = s1->text_addr;\n\n        pe_assign_addresses(&pe);\n        relocate_syms(s1, 0);\n        for (i = 1; i < s1->nb_sections; ++i) {\n            Section *s = s1->sections[i];\n            if (s->reloc) {\n                relocate_section(s1, s);\n                pe_relocate_rva(&pe, s);\n            }\n        }\n        if (s1->nb_errors)\n            ret = -1;\n        else\n            ret = pe_write(&pe);\n        tcc_free(pe.sec_info);\n    } else {\n#ifdef TCC_IS_NATIVE\n        pe.thunk = data_section;\n        pe_build_imports(&pe);\n#endif\n    }\n\n#ifdef PE_PRINT_SECTIONS\n    pe_print_sections(s1, \"tcc.log\");\n#endif\n    return ret;\n}\n\n/* ------------------------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tccpp.c",
    "content": "/*\n *  TCC - Tiny C Compiler\n * \n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\n/********************************************************/\n/* global variables */\n\nST_DATA int tok_flags;\n/* additional informations about token */\n#define TOK_FLAG_BOL   0x0001 /* beginning of line before */\n#define TOK_FLAG_BOF   0x0002 /* beginning of file before */\n#define TOK_FLAG_ENDIF 0x0004 /* a endif was found matching starting #ifdef */\n#define TOK_FLAG_EOF   0x0008 /* end of file */\n\nST_DATA int parse_flags;\n#define PARSE_FLAG_PREPROCESS 0x0001 /* activate preprocessing */\n#define PARSE_FLAG_TOK_NUM    0x0002 /* return numbers instead of TOK_PPNUM */\n#define PARSE_FLAG_LINEFEED   0x0004 /* line feed is returned as a\n                                        token. line feed is also\n                                        returned at eof */\n#define PARSE_FLAG_ASM_COMMENTS 0x0008 /* '#' can be used for line comment */\n#define PARSE_FLAG_SPACES     0x0010 /* next() returns space tokens (for -E) */\n\nST_DATA struct BufferedFile *file;\nST_DATA int ch, tok;\nST_DATA CValue tokc;\nST_DATA const int *macro_ptr;\nST_DATA CString tokcstr; /* current parsed string, if any */\n\n/* display benchmark infos */\nST_DATA int total_lines;\nST_DATA int total_bytes;\nST_DATA int tok_ident;\nST_DATA TokenSym **table_ident;\n\n/* ------------------------------------------------------------------------- */\n\nstatic int *macro_ptr_allocated;\nstatic const int *unget_saved_macro_ptr;\nstatic int unget_saved_buffer[TOK_MAX_SIZE + 1];\nstatic int unget_buffer_enabled;\nstatic TokenSym *hash_ident[TOK_HASH_SIZE];\nstatic char token_buf[STRING_MAX_SIZE + 1];\n/* true if isid(c) || isnum(c) */\nstatic unsigned char isidnum_table[256-CH_EOF];\n\nstatic const char tcc_keywords[] = \n#define DEF(id, str) str \"\\0\"\n#include \"tcctok.h\"\n#undef DEF\n;\n\n/* WARNING: the content of this string encodes token numbers */\nstatic const unsigned char tok_two_chars[] =\n    \"<=\\236>=\\235!=\\225&&\\240||\\241++\\244--\\242==\\224<<\\1>>\\2+=\\253\"\n    \"-=\\255*=\\252/=\\257%=\\245&=\\246^=\\336|=\\374->\\313..\\250##\\266\";\n\nstruct macro_level {\n    struct macro_level *prev;\n    const int *p;\n};\n\nST_FUNC void next_nomacro(void);\nstatic void next_nomacro_spc(void);\nstatic void macro_subst(\n    TokenString *tok_str,\n    Sym **nested_list,\n    const int *macro_str,\n    struct macro_level **can_read_stream\n    );\n\nST_FUNC void skip(int c)\n{\n    if (tok != c)\n        tcc_error(\"'%c' expected (got \\\"%s\\\")\", c, get_tok_str(tok, &tokc));\n    next();\n}\n\nST_FUNC void expect(const char *msg)\n{\n    tcc_error(\"%s expected\", msg);\n}\n\n/* ------------------------------------------------------------------------- */\n/* CString handling */\nstatic void cstr_realloc(CString *cstr, int new_size)\n{\n    int size;\n    void *data;\n\n    size = cstr->size_allocated;\n    if (size == 0)\n        size = 8; /* no need to allocate a too small first string */\n    while (size < new_size)\n        size = size * 2;\n    data = tcc_realloc(cstr->data_allocated, size);\n    cstr->data_allocated = data;\n    cstr->size_allocated = size;\n    cstr->data = data;\n}\n\n/* add a byte */\nST_FUNC void cstr_ccat(CString *cstr, int ch)\n{\n    int size;\n    size = cstr->size + 1;\n    if (size > cstr->size_allocated)\n        cstr_realloc(cstr, size);\n    ((unsigned char *)cstr->data)[size - 1] = ch;\n    cstr->size = size;\n}\n\nST_FUNC void cstr_cat(CString *cstr, const char *str)\n{\n    int c;\n    for(;;) {\n        c = *str;\n        if (c == '\\0')\n            break;\n        cstr_ccat(cstr, c);\n        str++;\n    }\n}\n\n/* add a wide char */\nST_FUNC void cstr_wccat(CString *cstr, int ch)\n{\n    int size;\n    size = cstr->size + sizeof(nwchar_t);\n    if (size > cstr->size_allocated)\n        cstr_realloc(cstr, size);\n    *(nwchar_t *)(((unsigned char *)cstr->data) + size - sizeof(nwchar_t)) = ch;\n    cstr->size = size;\n}\n\nST_FUNC void cstr_new(CString *cstr)\n{\n    memset(cstr, 0, sizeof(CString));\n}\n\n/* free string and reset it to NULL */\nST_FUNC void cstr_free(CString *cstr)\n{\n    tcc_free(cstr->data_allocated);\n    cstr_new(cstr);\n}\n\n/* reset string to empty */\nST_FUNC void cstr_reset(CString *cstr)\n{\n    cstr->size = 0;\n}\n\n/* XXX: unicode ? */\nstatic void add_char(CString *cstr, int c)\n{\n    if (c == '\\'' || c == '\\\"' || c == '\\\\') {\n        /* XXX: could be more precise if char or string */\n        cstr_ccat(cstr, '\\\\');\n    }\n    if (c >= 32 && c <= 126) {\n        cstr_ccat(cstr, c);\n    } else {\n        cstr_ccat(cstr, '\\\\');\n        if (c == '\\n') {\n            cstr_ccat(cstr, 'n');\n        } else {\n            cstr_ccat(cstr, '0' + ((c >> 6) & 7));\n            cstr_ccat(cstr, '0' + ((c >> 3) & 7));\n            cstr_ccat(cstr, '0' + (c & 7));\n        }\n    }\n}\n\n/* ------------------------------------------------------------------------- */\n/* allocate a new token */\nstatic TokenSym *tok_alloc_new(TokenSym **pts, const char *str, int len)\n{\n    TokenSym *ts, **ptable;\n    int i;\n\n    if (tok_ident >= SYM_FIRST_ANOM) \n        tcc_error(\"memory full\");\n\n    /* expand token table if needed */\n    i = tok_ident - TOK_IDENT;\n    if ((i % TOK_ALLOC_INCR) == 0) {\n        ptable = tcc_realloc(table_ident, (i + TOK_ALLOC_INCR) * sizeof(TokenSym *));\n        table_ident = ptable;\n    }\n\n    ts = tcc_malloc(sizeof(TokenSym) + len);\n    table_ident[i] = ts;\n    ts->tok = tok_ident++;\n    ts->sym_define = NULL;\n    ts->sym_label = NULL;\n    ts->sym_struct = NULL;\n    ts->sym_identifier = NULL;\n    ts->len = len;\n    ts->hash_next = NULL;\n    memcpy(ts->str, str, len);\n    ts->str[len] = '\\0';\n    *pts = ts;\n    return ts;\n}\n\n#define TOK_HASH_INIT 1\n#define TOK_HASH_FUNC(h, c) ((h) * 263 + (c))\n\n/* find a token and add it if not found */\nST_FUNC TokenSym *tok_alloc(const char *str, int len)\n{\n    TokenSym *ts, **pts;\n    int i;\n    unsigned int h;\n    \n    h = TOK_HASH_INIT;\n    for(i=0;i<len;i++)\n        h = TOK_HASH_FUNC(h, ((unsigned char *)str)[i]);\n    h &= (TOK_HASH_SIZE - 1);\n\n    pts = &hash_ident[h];\n    for(;;) {\n        ts = *pts;\n        if (!ts)\n            break;\n        if (ts->len == len && !memcmp(ts->str, str, len))\n            return ts;\n        pts = &(ts->hash_next);\n    }\n    return tok_alloc_new(pts, str, len);\n}\n\n/* XXX: buffer overflow */\n/* XXX: float tokens */\nST_FUNC char *get_tok_str(int v, CValue *cv)\n{\n    static char buf[STRING_MAX_SIZE + 1];\n    static CString cstr_buf;\n    CString *cstr;\n    char *p;\n    int i, len;\n\n    /* NOTE: to go faster, we give a fixed buffer for small strings */\n    cstr_reset(&cstr_buf);\n    cstr_buf.data = buf;\n    cstr_buf.size_allocated = sizeof(buf);\n    p = buf;\n\n    switch(v) {\n    case TOK_CINT:\n    case TOK_CUINT:\n        /* XXX: not quite exact, but only useful for testing */\n        sprintf(p, \"%u\", cv->ui);\n        break;\n    case TOK_CLLONG:\n    case TOK_CULLONG:\n        /* XXX: not quite exact, but only useful for testing  */\n#ifdef _WIN32\n        sprintf(p, \"%u\", (unsigned)cv->ull);\n#else\n        sprintf(p, \"%Lu\", cv->ull);\n#endif\n        break;\n    case TOK_LCHAR:\n        cstr_ccat(&cstr_buf, 'L');\n    case TOK_CCHAR:\n        cstr_ccat(&cstr_buf, '\\'');\n        add_char(&cstr_buf, cv->i);\n        cstr_ccat(&cstr_buf, '\\'');\n        cstr_ccat(&cstr_buf, '\\0');\n        break;\n    case TOK_PPNUM:\n        cstr = cv->cstr;\n        len = cstr->size - 1;\n        for(i=0;i<len;i++)\n            add_char(&cstr_buf, ((unsigned char *)cstr->data)[i]);\n        cstr_ccat(&cstr_buf, '\\0');\n        break;\n    case TOK_LSTR:\n        cstr_ccat(&cstr_buf, 'L');\n    case TOK_STR:\n        cstr = cv->cstr;\n        cstr_ccat(&cstr_buf, '\\\"');\n        if (v == TOK_STR) {\n            len = cstr->size - 1;\n            for(i=0;i<len;i++)\n                add_char(&cstr_buf, ((unsigned char *)cstr->data)[i]);\n        } else {\n            len = (cstr->size / sizeof(nwchar_t)) - 1;\n            for(i=0;i<len;i++)\n                add_char(&cstr_buf, ((nwchar_t *)cstr->data)[i]);\n        }\n        cstr_ccat(&cstr_buf, '\\\"');\n        cstr_ccat(&cstr_buf, '\\0');\n        break;\n    case TOK_LT:\n        v = '<';\n        goto addv;\n    case TOK_GT:\n        v = '>';\n        goto addv;\n    case TOK_DOTS:\n        return strcpy(p, \"...\");\n    case TOK_A_SHL:\n        return strcpy(p, \"<<=\");\n    case TOK_A_SAR:\n        return strcpy(p, \">>=\");\n    default:\n        if (v < TOK_IDENT) {\n            /* search in two bytes table */\n            const unsigned char *q = tok_two_chars;\n            while (*q) {\n                if (q[2] == v) {\n                    *p++ = q[0];\n                    *p++ = q[1];\n                    *p = '\\0';\n                    return buf;\n                }\n                q += 3;\n            }\n        addv:\n            *p++ = v;\n            *p = '\\0';\n        } else if (v < tok_ident) {\n            return table_ident[v - TOK_IDENT]->str;\n        } else if (v >= SYM_FIRST_ANOM) {\n            /* special name for anonymous symbol */\n            sprintf(p, \"L.%u\", v - SYM_FIRST_ANOM);\n        } else {\n            /* should never happen */\n            return NULL;\n        }\n        break;\n    }\n    return cstr_buf.data;\n}\n\n/* fill input buffer and peek next char */\nstatic int tcc_peekc_slow(BufferedFile *bf)\n{\n    int len;\n    /* only tries to read if really end of buffer */\n    if (bf->buf_ptr >= bf->buf_end) {\n        if (bf->fd != -1) {\n#if defined(PARSE_DEBUG)\n            len = 8;\n#else\n            len = IO_BUF_SIZE;\n#endif\n            len = read(bf->fd, bf->buffer, len);\n            if (len < 0)\n                len = 0;\n        } else {\n            len = 0;\n        }\n        total_bytes += len;\n        bf->buf_ptr = bf->buffer;\n        bf->buf_end = bf->buffer + len;\n        *bf->buf_end = CH_EOB;\n    }\n    if (bf->buf_ptr < bf->buf_end) {\n        return bf->buf_ptr[0];\n    } else {\n        bf->buf_ptr = bf->buf_end;\n        return CH_EOF;\n    }\n}\n\n/* return the current character, handling end of block if necessary\n   (but not stray) */\nST_FUNC int handle_eob(void)\n{\n    return tcc_peekc_slow(file);\n}\n\n/* read next char from current input file and handle end of input buffer */\nST_INLN void inp(void)\n{\n    ch = *(++(file->buf_ptr));\n    /* end of buffer/file handling */\n    if (ch == CH_EOB)\n        ch = handle_eob();\n}\n\n/* handle '\\[\\r]\\n' */\nstatic int handle_stray_noerror(void)\n{\n    while (ch == '\\\\') {\n        inp();\n        if (ch == '\\n') {\n            file->line_num++;\n            inp();\n        } else if (ch == '\\r') {\n            inp();\n            if (ch != '\\n')\n                goto fail;\n            file->line_num++;\n            inp();\n        } else {\n        fail:\n            return 1;\n        }\n    }\n    return 0;\n}\n\nstatic void handle_stray(void)\n{\n    if (handle_stray_noerror())\n        tcc_error(\"stray '\\\\' in program\");\n}\n\n/* skip the stray and handle the \\\\n case. Output an error if\n   incorrect char after the stray */\nstatic int handle_stray1(uint8_t *p)\n{\n    int c;\n\n    if (p >= file->buf_end) {\n        file->buf_ptr = p;\n        c = handle_eob();\n        p = file->buf_ptr;\n        if (c == '\\\\')\n            goto parse_stray;\n    } else {\n    parse_stray:\n        file->buf_ptr = p;\n        ch = *p;\n        handle_stray();\n        p = file->buf_ptr;\n        c = *p;\n    }\n    return c;\n}\n\n/* handle just the EOB case, but not stray */\n#define PEEKC_EOB(c, p)\\\n{\\\n    p++;\\\n    c = *p;\\\n    if (c == '\\\\') {\\\n        file->buf_ptr = p;\\\n        c = handle_eob();\\\n        p = file->buf_ptr;\\\n    }\\\n}\n\n/* handle the complicated stray case */\n#define PEEKC(c, p)\\\n{\\\n    p++;\\\n    c = *p;\\\n    if (c == '\\\\') {\\\n        c = handle_stray1(p);\\\n        p = file->buf_ptr;\\\n    }\\\n}\n\n/* input with '\\[\\r]\\n' handling. Note that this function cannot\n   handle other characters after '\\', so you cannot call it inside\n   strings or comments */\nST_FUNC void minp(void)\n{\n    inp();\n    if (ch == '\\\\') \n        handle_stray();\n}\n\n\n/* single line C++ comments */\nstatic uint8_t *parse_line_comment(uint8_t *p)\n{\n    int c;\n\n    p++;\n    for(;;) {\n        c = *p;\n    redo:\n        if (c == '\\n' || c == CH_EOF) {\n            break;\n        } else if (c == '\\\\') {\n            file->buf_ptr = p;\n            c = handle_eob();\n            p = file->buf_ptr;\n            if (c == '\\\\') {\n                PEEKC_EOB(c, p);\n                if (c == '\\n') {\n                    file->line_num++;\n                    PEEKC_EOB(c, p);\n                } else if (c == '\\r') {\n                    PEEKC_EOB(c, p);\n                    if (c == '\\n') {\n                        file->line_num++;\n                        PEEKC_EOB(c, p);\n                    }\n                }\n            } else {\n                goto redo;\n            }\n        } else {\n            p++;\n        }\n    }\n    return p;\n}\n\n/* C comments */\nST_FUNC uint8_t *parse_comment(uint8_t *p)\n{\n    int c;\n    \n    p++;\n    for(;;) {\n        /* fast skip loop */\n        for(;;) {\n            c = *p;\n            if (c == '\\n' || c == '*' || c == '\\\\')\n                break;\n            p++;\n            c = *p;\n            if (c == '\\n' || c == '*' || c == '\\\\')\n                break;\n            p++;\n        }\n        /* now we can handle all the cases */\n        if (c == '\\n') {\n            file->line_num++;\n            p++;\n        } else if (c == '*') {\n            p++;\n            for(;;) {\n                c = *p;\n                if (c == '*') {\n                    p++;\n                } else if (c == '/') {\n                    goto end_of_comment;\n                } else if (c == '\\\\') {\n                    file->buf_ptr = p;\n                    c = handle_eob();\n                    p = file->buf_ptr;\n                    if (c == '\\\\') {\n                        /* skip '\\[\\r]\\n', otherwise just skip the stray */\n                        while (c == '\\\\') {\n                            PEEKC_EOB(c, p);\n                            if (c == '\\n') {\n                                file->line_num++;\n                                PEEKC_EOB(c, p);\n                            } else if (c == '\\r') {\n                                PEEKC_EOB(c, p);\n                                if (c == '\\n') {\n                                    file->line_num++;\n                                    PEEKC_EOB(c, p);\n                                }\n                            } else {\n                                goto after_star;\n                            }\n                        }\n                    }\n                } else {\n                    break;\n                }\n            }\n        after_star: ;\n        } else {\n            /* stray, eob or eof */\n            file->buf_ptr = p;\n            c = handle_eob();\n            p = file->buf_ptr;\n            if (c == CH_EOF) {\n                tcc_error(\"unexpected end of file in comment\");\n            } else if (c == '\\\\') {\n                p++;\n            }\n        }\n    }\n end_of_comment:\n    p++;\n    return p;\n}\n\n#define cinp minp\n\nstatic inline void skip_spaces(void)\n{\n    while (is_space(ch))\n        cinp();\n}\n\nstatic inline int check_space(int t, int *spc) \n{\n    if (is_space(t)) {\n        if (*spc) \n            return 1;\n        *spc = 1;\n    } else \n        *spc = 0;\n    return 0;\n}\n\n/* parse a string without interpreting escapes */\nstatic uint8_t *parse_pp_string(uint8_t *p,\n                                int sep, CString *str)\n{\n    int c;\n    p++;\n    for(;;) {\n        c = *p;\n        if (c == sep) {\n            break;\n        } else if (c == '\\\\') {\n            file->buf_ptr = p;\n            c = handle_eob();\n            p = file->buf_ptr;\n            if (c == CH_EOF) {\n            unterminated_string:\n                /* XXX: indicate line number of start of string */\n                tcc_error(\"missing terminating %c character\", sep);\n            } else if (c == '\\\\') {\n                /* escape : just skip \\[\\r]\\n */\n                PEEKC_EOB(c, p);\n                if (c == '\\n') {\n                    file->line_num++;\n                    p++;\n                } else if (c == '\\r') {\n                    PEEKC_EOB(c, p);\n                    if (c != '\\n')\n                        expect(\"'\\n' after '\\r'\");\n                    file->line_num++;\n                    p++;\n                } else if (c == CH_EOF) {\n                    goto unterminated_string;\n                } else {\n                    if (str) {\n                        cstr_ccat(str, '\\\\');\n                        cstr_ccat(str, c);\n                    }\n                    p++;\n                }\n            }\n        } else if (c == '\\n') {\n            file->line_num++;\n            goto add_char;\n        } else if (c == '\\r') {\n            PEEKC_EOB(c, p);\n            if (c != '\\n') {\n                if (str)\n                    cstr_ccat(str, '\\r');\n            } else {\n                file->line_num++;\n                goto add_char;\n            }\n        } else {\n        add_char:\n            if (str)\n                cstr_ccat(str, c);\n            p++;\n        }\n    }\n    p++;\n    return p;\n}\n\n/* skip block of text until #else, #elif or #endif. skip also pairs of\n   #if/#endif */\nstatic void preprocess_skip(void)\n{\n    int a, start_of_line, c, in_warn_or_error;\n    uint8_t *p;\n\n    p = file->buf_ptr;\n    a = 0;\nredo_start:\n    start_of_line = 1;\n    in_warn_or_error = 0;\n    for(;;) {\n    redo_no_start:\n        c = *p;\n        switch(c) {\n        case ' ':\n        case '\\t':\n        case '\\f':\n        case '\\v':\n        case '\\r':\n            p++;\n            goto redo_no_start;\n        case '\\n':\n            file->line_num++;\n            p++;\n            goto redo_start;\n        case '\\\\':\n            file->buf_ptr = p;\n            c = handle_eob();\n            if (c == CH_EOF) {\n                expect(\"#endif\");\n            } else if (c == '\\\\') {\n                ch = file->buf_ptr[0];\n                handle_stray_noerror();\n            }\n            p = file->buf_ptr;\n            goto redo_no_start;\n        /* skip strings */\n        case '\\\"':\n        case '\\'':\n            if (in_warn_or_error)\n                goto _default;\n            p = parse_pp_string(p, c, NULL);\n            break;\n        /* skip comments */\n        case '/':\n            if (in_warn_or_error)\n                goto _default;\n            file->buf_ptr = p;\n            ch = *p;\n            minp();\n            p = file->buf_ptr;\n            if (ch == '*') {\n                p = parse_comment(p);\n            } else if (ch == '/') {\n                p = parse_line_comment(p);\n            }\n            break;\n        case '#':\n            p++;\n            if (start_of_line) {\n                file->buf_ptr = p;\n                next_nomacro();\n                p = file->buf_ptr;\n                if (a == 0 && \n                    (tok == TOK_ELSE || tok == TOK_ELIF || tok == TOK_ENDIF))\n                    goto the_end;\n                if (tok == TOK_IF || tok == TOK_IFDEF || tok == TOK_IFNDEF)\n                    a++;\n                else if (tok == TOK_ENDIF)\n                    a--;\n                else if( tok == TOK_ERROR || tok == TOK_WARNING)\n                    in_warn_or_error = 1;\n                else if (tok == TOK_LINEFEED)\n                    goto redo_start;\n            }\n            break;\n_default:\n        default:\n            p++;\n            break;\n        }\n        start_of_line = 0;\n    }\n the_end: ;\n    file->buf_ptr = p;\n}\n\n/* ParseState handling */\n\n/* XXX: currently, no include file info is stored. Thus, we cannot display\n   accurate messages if the function or data definition spans multiple\n   files */\n\n/* save current parse state in 's' */\nST_FUNC void save_parse_state(ParseState *s)\n{\n    s->line_num = file->line_num;\n    s->macro_ptr = macro_ptr;\n    s->tok = tok;\n    s->tokc = tokc;\n}\n\n/* restore parse state from 's' */\nST_FUNC void restore_parse_state(ParseState *s)\n{\n    file->line_num = s->line_num;\n    macro_ptr = s->macro_ptr;\n    tok = s->tok;\n    tokc = s->tokc;\n}\n\n/* return the number of additional 'ints' necessary to store the\n   token */\nstatic inline int tok_ext_size(int t)\n{\n    switch(t) {\n        /* 4 bytes */\n    case TOK_CINT:\n    case TOK_CUINT:\n    case TOK_CCHAR:\n    case TOK_LCHAR:\n    case TOK_CFLOAT:\n    case TOK_LINENUM:\n        return 1;\n    case TOK_STR:\n    case TOK_LSTR:\n    case TOK_PPNUM:\n        tcc_error(\"unsupported token\");\n        return 1;\n    case TOK_CDOUBLE:\n    case TOK_CLLONG:\n    case TOK_CULLONG:\n        return 2;\n    case TOK_CLDOUBLE:\n        return LDOUBLE_SIZE / 4;\n    default:\n        return 0;\n    }\n}\n\n/* token string handling */\n\nST_INLN void tok_str_new(TokenString *s)\n{\n    s->str = NULL;\n    s->len = 0;\n    s->allocated_len = 0;\n    s->last_line_num = -1;\n}\n\nST_FUNC void tok_str_free(int *str)\n{\n    tcc_free(str);\n}\n\nstatic int *tok_str_realloc(TokenString *s)\n{\n    int *str, len;\n\n    if (s->allocated_len == 0) {\n        len = 8;\n    } else {\n        len = s->allocated_len * 2;\n    }\n    str = tcc_realloc(s->str, len * sizeof(int));\n    s->allocated_len = len;\n    s->str = str;\n    return str;\n}\n\nST_FUNC void tok_str_add(TokenString *s, int t)\n{\n    int len, *str;\n\n    len = s->len;\n    str = s->str;\n    if (len >= s->allocated_len)\n        str = tok_str_realloc(s);\n    str[len++] = t;\n    s->len = len;\n}\n\nstatic void tok_str_add2(TokenString *s, int t, CValue *cv)\n{\n    int len, *str;\n\n    len = s->len;\n    str = s->str;\n\n    /* allocate space for worst case */\n    if (len + TOK_MAX_SIZE > s->allocated_len)\n        str = tok_str_realloc(s);\n    str[len++] = t;\n    switch(t) {\n    case TOK_CINT:\n    case TOK_CUINT:\n    case TOK_CCHAR:\n    case TOK_LCHAR:\n    case TOK_CFLOAT:\n    case TOK_LINENUM:\n        str[len++] = cv->tab[0];\n        break;\n    case TOK_PPNUM:\n    case TOK_STR:\n    case TOK_LSTR:\n        {\n            int nb_words;\n            CString *cstr;\n\n            nb_words = (sizeof(CString) + cv->cstr->size + 3) >> 2;\n            while ((len + nb_words) > s->allocated_len)\n                str = tok_str_realloc(s);\n            cstr = (CString *)(str + len);\n            cstr->data = NULL;\n            cstr->size = cv->cstr->size;\n            cstr->data_allocated = NULL;\n            cstr->size_allocated = cstr->size;\n            memcpy((char *)cstr + sizeof(CString), \n                   cv->cstr->data, cstr->size);\n            len += nb_words;\n        }\n        break;\n    case TOK_CDOUBLE:\n    case TOK_CLLONG:\n    case TOK_CULLONG:\n#if LDOUBLE_SIZE == 8\n    case TOK_CLDOUBLE:\n#endif\n        str[len++] = cv->tab[0];\n        str[len++] = cv->tab[1];\n        break;\n#if LDOUBLE_SIZE == 12\n    case TOK_CLDOUBLE:\n        str[len++] = cv->tab[0];\n        str[len++] = cv->tab[1];\n        str[len++] = cv->tab[2];\n#elif LDOUBLE_SIZE == 16\n    case TOK_CLDOUBLE:\n        str[len++] = cv->tab[0];\n        str[len++] = cv->tab[1];\n        str[len++] = cv->tab[2];\n        str[len++] = cv->tab[3];\n#elif LDOUBLE_SIZE != 8\n#error add long double size support\n#endif\n        break;\n    default:\n        break;\n    }\n    s->len = len;\n}\n\n/* add the current parse token in token string 's' */\nST_FUNC void tok_str_add_tok(TokenString *s)\n{\n    CValue cval;\n\n    /* save line number info */\n    if (file->line_num != s->last_line_num) {\n        s->last_line_num = file->line_num;\n        cval.i = s->last_line_num;\n        tok_str_add2(s, TOK_LINENUM, &cval);\n    }\n    tok_str_add2(s, tok, &tokc);\n}\n\n/* get a token from an integer array and increment pointer\n   accordingly. we code it as a macro to avoid pointer aliasing. */\nstatic inline void TOK_GET(int *t, const int **pp, CValue *cv)\n{\n    const int *p = *pp;\n    int n, *tab;\n\n    tab = cv->tab;\n    switch(*t = *p++) {\n    case TOK_CINT:\n    case TOK_CUINT:\n    case TOK_CCHAR:\n    case TOK_LCHAR:\n    case TOK_CFLOAT:\n    case TOK_LINENUM:\n        tab[0] = *p++;\n        break;\n    case TOK_STR:\n    case TOK_LSTR:\n    case TOK_PPNUM:\n        cv->cstr = (CString *)p;\n        cv->cstr->data = (char *)p + sizeof(CString);\n        p += (sizeof(CString) + cv->cstr->size + 3) >> 2;\n        break;\n    case TOK_CDOUBLE:\n    case TOK_CLLONG:\n    case TOK_CULLONG:\n        n = 2;\n        goto copy;\n    case TOK_CLDOUBLE:\n#if LDOUBLE_SIZE == 16\n        n = 4;\n#elif LDOUBLE_SIZE == 12\n        n = 3;\n#elif LDOUBLE_SIZE == 8\n        n = 2;\n#else\n# error add long double size support\n#endif\n    copy:\n        do\n            *tab++ = *p++;\n        while (--n);\n        break;\n    default:\n        break;\n    }\n    *pp = p;\n}\n\nstatic int macro_is_equal(const int *a, const int *b)\n{\n    char buf[STRING_MAX_SIZE + 1];\n    CValue cv;\n    int t;\n    while (*a && *b) {\n        TOK_GET(&t, &a, &cv);\n        pstrcpy(buf, sizeof buf, get_tok_str(t, &cv));\n        TOK_GET(&t, &b, &cv);\n        if (strcmp(buf, get_tok_str(t, &cv)))\n            return 0;\n    }\n    return !(*a || *b);\n}\n\n/* defines handling */\nST_INLN void define_push(int v, int macro_type, int *str, Sym *first_arg)\n{\n    Sym *s;\n\n    s = define_find(v);\n    if (s && !macro_is_equal(s->d, str))\n        tcc_warning(\"%s redefined\", get_tok_str(v, NULL));\n\n    s = sym_push2(&define_stack, v, macro_type, 0);\n    s->d = str;\n    s->next = first_arg;\n    table_ident[v - TOK_IDENT]->sym_define = s;\n}\n\n/* undefined a define symbol. Its name is just set to zero */\nST_FUNC void define_undef(Sym *s)\n{\n    int v;\n    v = s->v;\n    if (v >= TOK_IDENT && v < tok_ident)\n        table_ident[v - TOK_IDENT]->sym_define = NULL;\n    s->v = 0;\n}\n\nST_INLN Sym *define_find(int v)\n{\n    v -= TOK_IDENT;\n    if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))\n        return NULL;\n    return table_ident[v]->sym_define;\n}\n\n/* free define stack until top reaches 'b' */\nST_FUNC void free_defines(Sym *b)\n{\n    Sym *top, *top1;\n    int v;\n\n    top = define_stack;\n    while (top != b) {\n        top1 = top->prev;\n        /* do not free args or predefined defines */\n        if (top->d)\n            tok_str_free(top->d);\n        v = top->v;\n        if (v >= TOK_IDENT && v < tok_ident)\n            table_ident[v - TOK_IDENT]->sym_define = NULL;\n        sym_free(top);\n        top = top1;\n    }\n    define_stack = b;\n}\n\n/* label lookup */\nST_FUNC Sym *label_find(int v)\n{\n    v -= TOK_IDENT;\n    if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))\n        return NULL;\n    return table_ident[v]->sym_label;\n}\n\nST_FUNC Sym *label_push(Sym **ptop, int v, int flags)\n{\n    Sym *s, **ps;\n    s = sym_push2(ptop, v, 0, 0);\n    s->r = flags;\n    ps = &table_ident[v - TOK_IDENT]->sym_label;\n    if (ptop == &global_label_stack) {\n        /* modify the top most local identifier, so that\n           sym_identifier will point to 's' when popped */\n        while (*ps != NULL)\n            ps = &(*ps)->prev_tok;\n    }\n    s->prev_tok = *ps;\n    *ps = s;\n    return s;\n}\n\n/* pop labels until element last is reached. Look if any labels are\n   undefined. Define symbols if '&&label' was used. */\nST_FUNC void label_pop(Sym **ptop, Sym *slast)\n{\n    Sym *s, *s1;\n    for(s = *ptop; s != slast; s = s1) {\n        s1 = s->prev;\n        if (s->r == LABEL_DECLARED) {\n            tcc_warning(\"label '%s' declared but not used\", get_tok_str(s->v, NULL));\n        } else if (s->r == LABEL_FORWARD) {\n                tcc_error(\"label '%s' used but not defined\",\n                      get_tok_str(s->v, NULL));\n        } else {\n            if (s->c) {\n                /* define corresponding symbol. A size of\n                   1 is put. */\n                put_extern_sym(s, cur_text_section, s->jnext, 1);\n            }\n        }\n        /* remove label */\n        table_ident[s->v - TOK_IDENT]->sym_label = s->prev_tok;\n        sym_free(s);\n    }\n    *ptop = slast;\n}\n\n/* eval an expression for #if/#elif */\nstatic int expr_preprocess(void)\n{\n    int c, t;\n    TokenString str;\n    \n    tok_str_new(&str);\n    while (tok != TOK_LINEFEED && tok != TOK_EOF) {\n        next(); /* do macro subst */\n        if (tok == TOK_DEFINED) {\n            next_nomacro();\n            t = tok;\n            if (t == '(') \n                next_nomacro();\n            c = define_find(tok) != 0;\n            if (t == '(')\n                next_nomacro();\n            tok = TOK_CINT;\n            tokc.i = c;\n        } else if (tok >= TOK_IDENT) {\n            /* if undefined macro */\n            tok = TOK_CINT;\n            tokc.i = 0;\n        }\n        tok_str_add_tok(&str);\n    }\n    tok_str_add(&str, -1); /* simulate end of file */\n    tok_str_add(&str, 0);\n    /* now evaluate C constant expression */\n    macro_ptr = str.str;\n    next();\n    c = expr_const();\n    macro_ptr = NULL;\n    tok_str_free(str.str);\n    return c != 0;\n}\n\n#if defined(PARSE_DEBUG) || defined(PP_DEBUG)\nstatic void tok_print(int *str)\n{\n    int t;\n    CValue cval;\n\n    printf(\"<\");\n    while (1) {\n        TOK_GET(&t, &str, &cval);\n        if (!t)\n            break;\n        printf(\"%s\", get_tok_str(t, &cval));\n    }\n    printf(\">\\n\");\n}\n#endif\n\n/* parse after #define */\nST_FUNC void parse_define(void)\n{\n    Sym *s, *first, **ps;\n    int v, t, varg, is_vaargs, spc;\n    TokenString str;\n    \n    v = tok;\n    if (v < TOK_IDENT)\n        tcc_error(\"invalid macro name '%s'\", get_tok_str(tok, &tokc));\n    /* XXX: should check if same macro (ANSI) */\n    first = NULL;\n    t = MACRO_OBJ;\n    /* '(' must be just after macro definition for MACRO_FUNC */\n    next_nomacro_spc();\n    if (tok == '(') {\n        next_nomacro();\n        ps = &first;\n        while (tok != ')') {\n            varg = tok;\n            next_nomacro();\n            is_vaargs = 0;\n            if (varg == TOK_DOTS) {\n                varg = TOK___VA_ARGS__;\n                is_vaargs = 1;\n            } else if (tok == TOK_DOTS && gnu_ext) {\n                is_vaargs = 1;\n                next_nomacro();\n            }\n            if (varg < TOK_IDENT)\n                tcc_error(\"badly punctuated parameter list\");\n            s = sym_push2(&define_stack, varg | SYM_FIELD, is_vaargs, 0);\n            *ps = s;\n            ps = &s->next;\n            if (tok != ',')\n                break;\n            next_nomacro();\n        }\n        if (tok == ')')\n            next_nomacro_spc();\n        t = MACRO_FUNC;\n    }\n    tok_str_new(&str);\n    spc = 2;\n    /* EOF testing necessary for '-D' handling */\n    while (tok != TOK_LINEFEED && tok != TOK_EOF) {\n        /* remove spaces around ## and after '#' */        \n        if (TOK_TWOSHARPS == tok) {\n            if (1 == spc)\n                --str.len;\n            spc = 2;\n        } else if ('#' == tok) {\n            spc = 2;\n        } else if (check_space(tok, &spc)) {\n            goto skip;\n        }\n        tok_str_add2(&str, tok, &tokc);\n    skip:\n        next_nomacro_spc();\n    }\n    if (spc == 1)\n        --str.len; /* remove trailing space */\n    tok_str_add(&str, 0);\n#ifdef PP_DEBUG\n    printf(\"define %s %d: \", get_tok_str(v, NULL), t);\n    tok_print(str.str);\n#endif\n    define_push(v, t, str.str, first);\n}\n\nstatic inline int hash_cached_include(const char *filename)\n{\n    const unsigned char *s;\n    unsigned int h;\n\n    h = TOK_HASH_INIT;\n    s = filename;\n    while (*s) {\n        h = TOK_HASH_FUNC(h, *s);\n        s++;\n    }\n    h &= (CACHED_INCLUDES_HASH_SIZE - 1);\n    return h;\n}\n\nstatic CachedInclude *search_cached_include(TCCState *s1, const char *filename)\n{\n    CachedInclude *e;\n    int i, h;\n    h = hash_cached_include(filename);\n    i = s1->cached_includes_hash[h];\n    for(;;) {\n        if (i == 0)\n            break;\n        e = s1->cached_includes[i - 1];\n        if (0 == PATHCMP(e->filename, filename))\n            return e;\n        i = e->hash_next;\n    }\n    return NULL;\n}\n\nstatic inline void add_cached_include(TCCState *s1, const char *filename, int ifndef_macro)\n{\n    CachedInclude *e;\n    int h;\n\n    if (search_cached_include(s1, filename))\n        return;\n#ifdef INC_DEBUG\n    printf(\"adding cached '%s' %s\\n\", filename, get_tok_str(ifndef_macro, NULL));\n#endif\n    e = tcc_malloc(sizeof(CachedInclude) + strlen(filename));\n    strcpy(e->filename, filename);\n    e->ifndef_macro = ifndef_macro;\n    dynarray_add((void ***)&s1->cached_includes, &s1->nb_cached_includes, e);\n    /* add in hash table */\n    h = hash_cached_include(filename);\n    e->hash_next = s1->cached_includes_hash[h];\n    s1->cached_includes_hash[h] = s1->nb_cached_includes;\n}\n\nstatic void pragma_parse(TCCState *s1)\n{\n    int val;\n\n    next();\n    if (tok == TOK_pack) {\n        /*\n          This may be:\n          #pragma pack(1) // set\n          #pragma pack() // reset to default\n          #pragma pack(push,1) // push & set\n          #pragma pack(pop) // restore previous\n        */\n        next();\n        skip('(');\n        if (tok == TOK_ASM_pop) {\n            next();\n            if (s1->pack_stack_ptr <= s1->pack_stack) {\n            stk_error:\n                tcc_error(\"out of pack stack\");\n            }\n            s1->pack_stack_ptr--;\n        } else {\n            val = 0;\n            if (tok != ')') {\n                if (tok == TOK_ASM_push) {\n                    next();\n                    if (s1->pack_stack_ptr >= s1->pack_stack + PACK_STACK_SIZE - 1)\n                        goto stk_error;\n                    s1->pack_stack_ptr++;\n                    skip(',');\n                }\n                if (tok != TOK_CINT) {\n                pack_error:\n                    tcc_error(\"invalid pack pragma\");\n                }\n                val = tokc.i;\n                if (val < 1 || val > 16 || (val & (val - 1)) != 0)\n                    goto pack_error;\n                next();\n            }\n            *s1->pack_stack_ptr = val;\n            skip(')');\n        }\n    }\n}\n\n/* is_bof is true if first non space token at beginning of file */\nST_FUNC void preprocess(int is_bof)\n{\n    TCCState *s1 = tcc_state;\n    int i, c, n, saved_parse_flags;\n    char buf[1024], *q;\n    Sym *s;\n\n    saved_parse_flags = parse_flags;\n    parse_flags = PARSE_FLAG_PREPROCESS | PARSE_FLAG_TOK_NUM | \n        PARSE_FLAG_LINEFEED;\n    next_nomacro();\n redo:\n    switch(tok) {\n    case TOK_DEFINE:\n        next_nomacro();\n        parse_define();\n        break;\n    case TOK_UNDEF:\n        next_nomacro();\n        s = define_find(tok);\n        /* undefine symbol by putting an invalid name */\n        if (s)\n            define_undef(s);\n        break;\n    case TOK_INCLUDE:\n    case TOK_INCLUDE_NEXT:\n        ch = file->buf_ptr[0];\n        /* XXX: incorrect if comments : use next_nomacro with a special mode */\n        skip_spaces();\n        if (ch == '<') {\n            c = '>';\n            goto read_name;\n        } else if (ch == '\\\"') {\n            c = ch;\n        read_name:\n            inp();\n            q = buf;\n            while (ch != c && ch != '\\n' && ch != CH_EOF) {\n                if ((q - buf) < sizeof(buf) - 1)\n                    *q++ = ch;\n                if (ch == '\\\\') {\n                    if (handle_stray_noerror() == 0)\n                        --q;\n                } else\n                    inp();\n            }\n            *q = '\\0';\n            minp();\n#if 0\n            /* eat all spaces and comments after include */\n            /* XXX: slightly incorrect */\n            while (ch1 != '\\n' && ch1 != CH_EOF)\n                inp();\n#endif\n        } else {\n            /* computed #include : either we have only strings or\n               we have anything enclosed in '<>' */\n            next();\n            buf[0] = '\\0';\n            if (tok == TOK_STR) {\n                while (tok != TOK_LINEFEED) {\n                    if (tok != TOK_STR) {\n                    include_syntax:\n                        tcc_error(\"'#include' expects \\\"FILENAME\\\" or <FILENAME>\");\n                    }\n                    pstrcat(buf, sizeof(buf), (char *)tokc.cstr->data);\n                    next();\n                }\n                c = '\\\"';\n            } else {\n                int len;\n                while (tok != TOK_LINEFEED) {\n                    pstrcat(buf, sizeof(buf), get_tok_str(tok, &tokc));\n                    next();\n                }\n                len = strlen(buf);\n                /* check syntax and remove '<>' */\n                if (len < 2 || buf[0] != '<' || buf[len - 1] != '>')\n                    goto include_syntax;\n                memmove(buf, buf + 1, len - 2);\n                buf[len - 2] = '\\0';\n                c = '>';\n            }\n        }\n\n        if (s1->include_stack_ptr >= s1->include_stack + INCLUDE_STACK_SIZE)\n            tcc_error(\"#include recursion too deep\");\n        /* store current file in stack, but increment stack later below */\n        *s1->include_stack_ptr = file;\n\n        n = s1->nb_include_paths + s1->nb_sysinclude_paths;\n        for (i = -2; i < n; ++i) {\n            char buf1[sizeof file->filename];\n            CachedInclude *e;\n            BufferedFile **f;\n            const char *path;\n\n            if (i == -2) {\n                /* check absolute include path */\n                if (!IS_ABSPATH(buf))\n                    continue;\n                buf1[0] = 0;\n                i = n; /* force end loop */\n\n            } else if (i == -1) {\n                /* search in current dir if \"header.h\" */\n                if (c != '\\\"')\n                    continue;\n                path = file->filename;\n                pstrncpy(buf1, path, tcc_basename(path) - path);\n\n            } else {\n                /* search in all the include paths */\n                if (i < s1->nb_include_paths)\n                    path = s1->include_paths[i];\n                else\n                    path = s1->sysinclude_paths[i - s1->nb_include_paths];\n                pstrcpy(buf1, sizeof(buf1), path);\n                pstrcat(buf1, sizeof(buf1), \"/\");\n            }\n\n            pstrcat(buf1, sizeof(buf1), buf);\n\n            if (tok == TOK_INCLUDE_NEXT)\n                for (f = s1->include_stack_ptr; f >= s1->include_stack; --f)\n                    if (0 == PATHCMP((*f)->filename, buf1)) {\n#ifdef INC_DEBUG\n                        printf(\"%s: #include_next skipping %s\\n\", file->filename, buf1);\n#endif\n                        goto include_trynext;\n                    }\n\n            e = search_cached_include(s1, buf1);\n            if (e && define_find(e->ifndef_macro)) {\n                /* no need to parse the include because the 'ifndef macro'\n                   is defined */\n#ifdef INC_DEBUG\n                printf(\"%s: skipping cached %s\\n\", file->filename, buf1);\n#endif\n                goto include_done;\n            }\n\n            if (tcc_open(s1, buf1) < 0)\ninclude_trynext:\n                continue;\n\n#ifdef INC_DEBUG\n            printf(\"%s: including %s\\n\", file->prev->filename, file->filename);\n#endif\n            /* update target deps */\n            dynarray_add((void ***)&s1->target_deps, &s1->nb_target_deps,\n                    tcc_strdup(buf1));\n            /* push current file in stack */\n            ++s1->include_stack_ptr;\n            /* add include file debug info */\n            if (s1->do_debug)\n                put_stabs(file->filename, N_BINCL, 0, 0, 0);\n            tok_flags |= TOK_FLAG_BOF | TOK_FLAG_BOL;\n            ch = file->buf_ptr[0];\n            goto the_end;\n        }\n        tcc_error(\"include file '%s' not found\", buf);\ninclude_done:\n        break;\n    case TOK_IFNDEF:\n        c = 1;\n        goto do_ifdef;\n    case TOK_IF:\n        c = expr_preprocess();\n        goto do_if;\n    case TOK_IFDEF:\n        c = 0;\n    do_ifdef:\n        next_nomacro();\n        if (tok < TOK_IDENT)\n            tcc_error(\"invalid argument for '#if%sdef'\", c ? \"n\" : \"\");\n        if (is_bof) {\n            if (c) {\n#ifdef INC_DEBUG\n                printf(\"#ifndef %s\\n\", get_tok_str(tok, NULL));\n#endif\n                file->ifndef_macro = tok;\n            }\n        }\n        c = (define_find(tok) != 0) ^ c;\n    do_if:\n        if (s1->ifdef_stack_ptr >= s1->ifdef_stack + IFDEF_STACK_SIZE)\n            tcc_error(\"memory full\");\n        *s1->ifdef_stack_ptr++ = c;\n        goto test_skip;\n    case TOK_ELSE:\n        if (s1->ifdef_stack_ptr == s1->ifdef_stack)\n            tcc_error(\"#else without matching #if\");\n        if (s1->ifdef_stack_ptr[-1] & 2)\n            tcc_error(\"#else after #else\");\n        c = (s1->ifdef_stack_ptr[-1] ^= 3);\n        goto test_else;\n    case TOK_ELIF:\n        if (s1->ifdef_stack_ptr == s1->ifdef_stack)\n            tcc_error(\"#elif without matching #if\");\n        c = s1->ifdef_stack_ptr[-1];\n        if (c > 1)\n            tcc_error(\"#elif after #else\");\n        /* last #if/#elif expression was true: we skip */\n        if (c == 1)\n            goto skip;\n        c = expr_preprocess();\n        s1->ifdef_stack_ptr[-1] = c;\n    test_else:\n        if (s1->ifdef_stack_ptr == file->ifdef_stack_ptr + 1)\n            file->ifndef_macro = 0;\n    test_skip:\n        if (!(c & 1)) {\n        skip:\n            preprocess_skip();\n            is_bof = 0;\n            goto redo;\n        }\n        break;\n    case TOK_ENDIF:\n        if (s1->ifdef_stack_ptr <= file->ifdef_stack_ptr)\n            tcc_error(\"#endif without matching #if\");\n        s1->ifdef_stack_ptr--;\n        /* '#ifndef macro' was at the start of file. Now we check if\n           an '#endif' is exactly at the end of file */\n        if (file->ifndef_macro &&\n            s1->ifdef_stack_ptr == file->ifdef_stack_ptr) {\n            file->ifndef_macro_saved = file->ifndef_macro;\n            /* need to set to zero to avoid false matches if another\n               #ifndef at middle of file */\n            file->ifndef_macro = 0;\n            while (tok != TOK_LINEFEED)\n                next_nomacro();\n            tok_flags |= TOK_FLAG_ENDIF;\n            goto the_end;\n        }\n        break;\n    case TOK_LINE:\n        next();\n        if (tok != TOK_CINT)\n            tcc_error(\"#line\");\n        file->line_num = tokc.i - 1; /* the line number will be incremented after */\n        next();\n        if (tok != TOK_LINEFEED) {\n            if (tok != TOK_STR)\n                tcc_error(\"#line\");\n            pstrcpy(file->filename, sizeof(file->filename), \n                    (char *)tokc.cstr->data);\n        }\n        break;\n    case TOK_ERROR:\n    case TOK_WARNING:\n        c = tok;\n        ch = file->buf_ptr[0];\n        skip_spaces();\n        q = buf;\n        while (ch != '\\n' && ch != CH_EOF) {\n            if ((q - buf) < sizeof(buf) - 1)\n                *q++ = ch;\n            if (ch == '\\\\') {\n                if (handle_stray_noerror() == 0)\n                    --q;\n            } else\n                inp();\n        }\n        *q = '\\0';\n        if (c == TOK_ERROR)\n            tcc_error(\"#error %s\", buf);\n        else\n            tcc_warning(\"#warning %s\", buf);\n        break;\n    case TOK_PRAGMA:\n        pragma_parse(s1);\n        break;\n    default:\n        if (tok == TOK_LINEFEED || tok == '!' || tok == TOK_PPNUM) {\n            /* '!' is ignored to allow C scripts. numbers are ignored\n               to emulate cpp behaviour */\n        } else {\n            if (!(saved_parse_flags & PARSE_FLAG_ASM_COMMENTS))\n                tcc_warning(\"Ignoring unknown preprocessing directive #%s\", get_tok_str(tok, &tokc));\n            else {\n                /* this is a gas line comment in an 'S' file. */\n                file->buf_ptr = parse_line_comment(file->buf_ptr);\n                goto the_end;\n            }\n        }\n        break;\n    }\n    /* ignore other preprocess commands or #! for C scripts */\n    while (tok != TOK_LINEFEED)\n        next_nomacro();\n the_end:\n    parse_flags = saved_parse_flags;\n}\n\n/* evaluate escape codes in a string. */\nstatic void parse_escape_string(CString *outstr, const uint8_t *buf, int is_long)\n{\n    int c, n;\n    const uint8_t *p;\n\n    p = buf;\n    for(;;) {\n        c = *p;\n        if (c == '\\0')\n            break;\n        if (c == '\\\\') {\n            p++;\n            /* escape */\n            c = *p;\n            switch(c) {\n            case '0': case '1': case '2': case '3':\n            case '4': case '5': case '6': case '7':\n                /* at most three octal digits */\n                n = c - '0';\n                p++;\n                c = *p;\n                if (isoct(c)) {\n                    n = n * 8 + c - '0';\n                    p++;\n                    c = *p;\n                    if (isoct(c)) {\n                        n = n * 8 + c - '0';\n                        p++;\n                    }\n                }\n                c = n;\n                goto add_char_nonext;\n            case 'x':\n            case 'u':\n            case 'U':\n                p++;\n                n = 0;\n                for(;;) {\n                    c = *p;\n                    if (c >= 'a' && c <= 'f')\n                        c = c - 'a' + 10;\n                    else if (c >= 'A' && c <= 'F')\n                        c = c - 'A' + 10;\n                    else if (isnum(c))\n                        c = c - '0';\n                    else\n                        break;\n                    n = n * 16 + c;\n                    p++;\n                }\n                c = n;\n                goto add_char_nonext;\n            case 'a':\n                c = '\\a';\n                break;\n            case 'b':\n                c = '\\b';\n                break;\n            case 'f':\n                c = '\\f';\n                break;\n            case 'n':\n                c = '\\n';\n                break;\n            case 'r':\n                c = '\\r';\n                break;\n            case 't':\n                c = '\\t';\n                break;\n            case 'v':\n                c = '\\v';\n                break;\n            case 'e':\n                if (!gnu_ext)\n                    goto invalid_escape;\n                c = 27;\n                break;\n            case '\\'':\n            case '\\\"':\n            case '\\\\': \n            case '?':\n                break;\n            default:\n            invalid_escape:\n                if (c >= '!' && c <= '~')\n                    tcc_warning(\"unknown escape sequence: \\'\\\\%c\\'\", c);\n                else\n                    tcc_warning(\"unknown escape sequence: \\'\\\\x%x\\'\", c);\n                break;\n            }\n        }\n        p++;\n    add_char_nonext:\n        if (!is_long)\n            cstr_ccat(outstr, c);\n        else\n            cstr_wccat(outstr, c);\n    }\n    /* add a trailing '\\0' */\n    if (!is_long)\n        cstr_ccat(outstr, '\\0');\n    else\n        cstr_wccat(outstr, '\\0');\n}\n\n/* we use 64 bit numbers */\n#define BN_SIZE 2\n\n/* bn = (bn << shift) | or_val */\nstatic void bn_lshift(unsigned int *bn, int shift, int or_val)\n{\n    int i;\n    unsigned int v;\n    for(i=0;i<BN_SIZE;i++) {\n        v = bn[i];\n        bn[i] = (v << shift) | or_val;\n        or_val = v >> (32 - shift);\n    }\n}\n\nstatic void bn_zero(unsigned int *bn)\n{\n    int i;\n    for(i=0;i<BN_SIZE;i++) {\n        bn[i] = 0;\n    }\n}\n\n/* parse number in null terminated string 'p' and return it in the\n   current token */\nstatic void parse_number(const char *p)\n{\n    int b, t, shift, frac_bits, s, exp_val, ch;\n    char *q;\n    unsigned int bn[BN_SIZE];\n    double d;\n\n    /* number */\n    q = token_buf;\n    ch = *p++;\n    t = ch;\n    ch = *p++;\n    *q++ = t;\n    b = 10;\n    if (t == '.') {\n        goto float_frac_parse;\n    } else if (t == '0') {\n        if (ch == 'x' || ch == 'X') {\n            q--;\n            ch = *p++;\n            b = 16;\n        } else if (tcc_ext && (ch == 'b' || ch == 'B')) {\n            q--;\n            ch = *p++;\n            b = 2;\n        }\n    }\n    /* parse all digits. cannot check octal numbers at this stage\n       because of floating point constants */\n    while (1) {\n        if (ch >= 'a' && ch <= 'f')\n            t = ch - 'a' + 10;\n        else if (ch >= 'A' && ch <= 'F')\n            t = ch - 'A' + 10;\n        else if (isnum(ch))\n            t = ch - '0';\n        else\n            break;\n        if (t >= b)\n            break;\n        if (q >= token_buf + STRING_MAX_SIZE) {\n        num_too_long:\n            tcc_error(\"number too long\");\n        }\n        *q++ = ch;\n        ch = *p++;\n    }\n    if (ch == '.' ||\n        ((ch == 'e' || ch == 'E') && b == 10) ||\n        ((ch == 'p' || ch == 'P') && (b == 16 || b == 2))) {\n        if (b != 10) {\n            /* NOTE: strtox should support that for hexa numbers, but\n               non ISOC99 libcs do not support it, so we prefer to do\n               it by hand */\n            /* hexadecimal or binary floats */\n            /* XXX: handle overflows */\n            *q = '\\0';\n            if (b == 16)\n                shift = 4;\n            else \n                shift = 2;\n            bn_zero(bn);\n            q = token_buf;\n            while (1) {\n                t = *q++;\n                if (t == '\\0') {\n                    break;\n                } else if (t >= 'a') {\n                    t = t - 'a' + 10;\n                } else if (t >= 'A') {\n                    t = t - 'A' + 10;\n                } else {\n                    t = t - '0';\n                }\n                bn_lshift(bn, shift, t);\n            }\n            frac_bits = 0;\n            if (ch == '.') {\n                ch = *p++;\n                while (1) {\n                    t = ch;\n                    if (t >= 'a' && t <= 'f') {\n                        t = t - 'a' + 10;\n                    } else if (t >= 'A' && t <= 'F') {\n                        t = t - 'A' + 10;\n                    } else if (t >= '0' && t <= '9') {\n                        t = t - '0';\n                    } else {\n                        break;\n                    }\n                    if (t >= b)\n                        tcc_error(\"invalid digit\");\n                    bn_lshift(bn, shift, t);\n                    frac_bits += shift;\n                    ch = *p++;\n                }\n            }\n            if (ch != 'p' && ch != 'P')\n                expect(\"exponent\");\n            ch = *p++;\n            s = 1;\n            exp_val = 0;\n            if (ch == '+') {\n                ch = *p++;\n            } else if (ch == '-') {\n                s = -1;\n                ch = *p++;\n            }\n            if (ch < '0' || ch > '9')\n                expect(\"exponent digits\");\n            while (ch >= '0' && ch <= '9') {\n                exp_val = exp_val * 10 + ch - '0';\n                ch = *p++;\n            }\n            exp_val = exp_val * s;\n            \n            /* now we can generate the number */\n            /* XXX: should patch directly float number */\n            d = (double)bn[1] * 4294967296.0 + (double)bn[0];\n            d = ldexp(d, exp_val - frac_bits);\n            t = toup(ch);\n            if (t == 'F') {\n                ch = *p++;\n                tok = TOK_CFLOAT;\n                /* float : should handle overflow */\n                tokc.f = (float)d;\n            } else if (t == 'L') {\n                ch = *p++;\n#ifdef TCC_TARGET_PE\n                tok = TOK_CDOUBLE;\n                tokc.d = d;\n#else\n                tok = TOK_CLDOUBLE;\n                /* XXX: not large enough */\n                tokc.ld = (long double)d;\n#endif\n            } else {\n                tok = TOK_CDOUBLE;\n                tokc.d = d;\n            }\n        } else {\n            /* decimal floats */\n            if (ch == '.') {\n                if (q >= token_buf + STRING_MAX_SIZE)\n                    goto num_too_long;\n                *q++ = ch;\n                ch = *p++;\n            float_frac_parse:\n                while (ch >= '0' && ch <= '9') {\n                    if (q >= token_buf + STRING_MAX_SIZE)\n                        goto num_too_long;\n                    *q++ = ch;\n                    ch = *p++;\n                }\n            }\n            if (ch == 'e' || ch == 'E') {\n                if (q >= token_buf + STRING_MAX_SIZE)\n                    goto num_too_long;\n                *q++ = ch;\n                ch = *p++;\n                if (ch == '-' || ch == '+') {\n                    if (q >= token_buf + STRING_MAX_SIZE)\n                        goto num_too_long;\n                    *q++ = ch;\n                    ch = *p++;\n                }\n                if (ch < '0' || ch > '9')\n                    expect(\"exponent digits\");\n                while (ch >= '0' && ch <= '9') {\n                    if (q >= token_buf + STRING_MAX_SIZE)\n                        goto num_too_long;\n                    *q++ = ch;\n                    ch = *p++;\n                }\n            }\n            *q = '\\0';\n            t = toup(ch);\n            errno = 0;\n            if (t == 'F') {\n                ch = *p++;\n                tok = TOK_CFLOAT;\n                tokc.f = strtof(token_buf, NULL);\n            } else if (t == 'L') {\n                ch = *p++;\n#ifdef TCC_TARGET_PE\n                tok = TOK_CDOUBLE;\n                tokc.d = strtod(token_buf, NULL);\n#else\n                tok = TOK_CLDOUBLE;\n                tokc.ld = strtold(token_buf, NULL);\n#endif\n            } else {\n                tok = TOK_CDOUBLE;\n                tokc.d = strtod(token_buf, NULL);\n            }\n        }\n    } else {\n        unsigned long long n, n1;\n        int lcount, ucount;\n\n        /* integer number */\n        *q = '\\0';\n        q = token_buf;\n        if (b == 10 && *q == '0') {\n            b = 8;\n            q++;\n        }\n        n = 0;\n        while(1) {\n            t = *q++;\n            /* no need for checks except for base 10 / 8 errors */\n            if (t == '\\0') {\n                break;\n            } else if (t >= 'a') {\n                t = t - 'a' + 10;\n            } else if (t >= 'A') {\n                t = t - 'A' + 10;\n            } else {\n                t = t - '0';\n                if (t >= b)\n                    tcc_error(\"invalid digit\");\n            }\n            n1 = n;\n            n = n * b + t;\n            /* detect overflow */\n            /* XXX: this test is not reliable */\n            if (n < n1)\n                tcc_error(\"integer constant overflow\");\n        }\n        \n        /* XXX: not exactly ANSI compliant */\n        if ((n & 0xffffffff00000000LL) != 0) {\n            if ((n >> 63) != 0)\n                tok = TOK_CULLONG;\n            else\n                tok = TOK_CLLONG;\n        } else if (n > 0x7fffffff) {\n            tok = TOK_CUINT;\n        } else {\n            tok = TOK_CINT;\n        }\n        lcount = 0;\n        ucount = 0;\n        for(;;) {\n            t = toup(ch);\n            if (t == 'L') {\n                if (lcount >= 2)\n                    tcc_error(\"three 'l's in integer constant\");\n                lcount++;\n#if !defined TCC_TARGET_X86_64 || defined TCC_TARGET_PE\n                if (lcount == 2) {\n#endif\n                    if (tok == TOK_CINT)\n                        tok = TOK_CLLONG;\n                    else if (tok == TOK_CUINT)\n                        tok = TOK_CULLONG;\n#if !defined TCC_TARGET_X86_64 || defined TCC_TARGET_PE\n                }\n#endif\n                ch = *p++;\n            } else if (t == 'U') {\n                if (ucount >= 1)\n                    tcc_error(\"two 'u's in integer constant\");\n                ucount++;\n                if (tok == TOK_CINT)\n                    tok = TOK_CUINT;\n                else if (tok == TOK_CLLONG)\n                    tok = TOK_CULLONG;\n                ch = *p++;\n            } else {\n                break;\n            }\n        }\n        if (tok == TOK_CINT || tok == TOK_CUINT)\n            tokc.ui = n;\n        else\n            tokc.ull = n;\n    }\n    if (ch)\n        tcc_error(\"invalid number\\n\");\n}\n\n\n#define PARSE2(c1, tok1, c2, tok2)              \\\n    case c1:                                    \\\n        PEEKC(c, p);                            \\\n        if (c == c2) {                          \\\n            p++;                                \\\n            tok = tok2;                         \\\n        } else {                                \\\n            tok = tok1;                         \\\n        }                                       \\\n        break;\n\n/* return next token without macro substitution */\nstatic inline void next_nomacro1(void)\n{\n    int t, c, is_long;\n    TokenSym *ts;\n    uint8_t *p, *p1;\n    unsigned int h;\n\n    p = file->buf_ptr;\n redo_no_start:\n    c = *p;\n    switch(c) {\n    case ' ':\n    case '\\t':\n        tok = c;\n        p++;\n        goto keep_tok_flags;\n    case '\\f':\n    case '\\v':\n    case '\\r':\n        p++;\n        goto redo_no_start;\n    case '\\\\':\n        /* first look if it is in fact an end of buffer */\n        if (p >= file->buf_end) {\n            file->buf_ptr = p;\n            handle_eob();\n            p = file->buf_ptr;\n            if (p >= file->buf_end)\n                goto parse_eof;\n            else\n                goto redo_no_start;\n        } else {\n            file->buf_ptr = p;\n            ch = *p;\n            handle_stray();\n            p = file->buf_ptr;\n            goto redo_no_start;\n        }\n    parse_eof:\n        {\n            TCCState *s1 = tcc_state;\n            if ((parse_flags & PARSE_FLAG_LINEFEED)\n                && !(tok_flags & TOK_FLAG_EOF)) {\n                tok_flags |= TOK_FLAG_EOF;\n                tok = TOK_LINEFEED;\n                goto keep_tok_flags;\n            } else if (!(parse_flags & PARSE_FLAG_PREPROCESS)) {\n                tok = TOK_EOF;\n            } else if (s1->ifdef_stack_ptr != file->ifdef_stack_ptr) {\n                tcc_error(\"missing #endif\");\n            } else if (s1->include_stack_ptr == s1->include_stack) {\n                /* no include left : end of file. */\n                tok = TOK_EOF;\n            } else {\n                tok_flags &= ~TOK_FLAG_EOF;\n                /* pop include file */\n                \n                /* test if previous '#endif' was after a #ifdef at\n                   start of file */\n                if (tok_flags & TOK_FLAG_ENDIF) {\n#ifdef INC_DEBUG\n                    printf(\"#endif %s\\n\", get_tok_str(file->ifndef_macro_saved, NULL));\n#endif\n                    add_cached_include(s1, file->filename, file->ifndef_macro_saved);\n                    tok_flags &= ~TOK_FLAG_ENDIF;\n                }\n\n                /* add end of include file debug info */\n                if (tcc_state->do_debug) {\n                    put_stabd(N_EINCL, 0, 0);\n                }\n                /* pop include stack */\n                tcc_close();\n                s1->include_stack_ptr--;\n                p = file->buf_ptr;\n                goto redo_no_start;\n            }\n        }\n        break;\n\n    case '\\n':\n        file->line_num++;\n        tok_flags |= TOK_FLAG_BOL;\n        p++;\nmaybe_newline:\n        if (0 == (parse_flags & PARSE_FLAG_LINEFEED))\n            goto redo_no_start;\n        tok = TOK_LINEFEED;\n        goto keep_tok_flags;\n\n    case '#':\n        /* XXX: simplify */\n        PEEKC(c, p);\n        if ((tok_flags & TOK_FLAG_BOL) && \n            (parse_flags & PARSE_FLAG_PREPROCESS)) {\n            file->buf_ptr = p;\n            preprocess(tok_flags & TOK_FLAG_BOF);\n            p = file->buf_ptr;\n            goto maybe_newline;\n        } else {\n            if (c == '#') {\n                p++;\n                tok = TOK_TWOSHARPS;\n            } else {\n                if (parse_flags & PARSE_FLAG_ASM_COMMENTS) {\n                    p = parse_line_comment(p - 1);\n                    goto redo_no_start;\n                } else {\n                    tok = '#';\n                }\n            }\n        }\n        break;\n\n    case 'a': case 'b': case 'c': case 'd':\n    case 'e': case 'f': case 'g': case 'h':\n    case 'i': case 'j': case 'k': case 'l':\n    case 'm': case 'n': case 'o': case 'p':\n    case 'q': case 'r': case 's': case 't':\n    case 'u': case 'v': case 'w': case 'x':\n    case 'y': case 'z': \n    case 'A': case 'B': case 'C': case 'D':\n    case 'E': case 'F': case 'G': case 'H':\n    case 'I': case 'J': case 'K': \n    case 'M': case 'N': case 'O': case 'P':\n    case 'Q': case 'R': case 'S': case 'T':\n    case 'U': case 'V': case 'W': case 'X':\n    case 'Y': case 'Z': \n    case '_':\n    parse_ident_fast:\n        p1 = p;\n        h = TOK_HASH_INIT;\n        h = TOK_HASH_FUNC(h, c);\n        p++;\n        for(;;) {\n            c = *p;\n            if (!isidnum_table[c-CH_EOF])\n                break;\n            h = TOK_HASH_FUNC(h, c);\n            p++;\n        }\n        if (c != '\\\\') {\n            TokenSym **pts;\n            int len;\n\n            /* fast case : no stray found, so we have the full token\n               and we have already hashed it */\n            len = p - p1;\n            h &= (TOK_HASH_SIZE - 1);\n            pts = &hash_ident[h];\n            for(;;) {\n                ts = *pts;\n                if (!ts)\n                    break;\n                if (ts->len == len && !memcmp(ts->str, p1, len))\n                    goto token_found;\n                pts = &(ts->hash_next);\n            }\n            ts = tok_alloc_new(pts, p1, len);\n        token_found: ;\n        } else {\n            /* slower case */\n            cstr_reset(&tokcstr);\n\n            while (p1 < p) {\n                cstr_ccat(&tokcstr, *p1);\n                p1++;\n            }\n            p--;\n            PEEKC(c, p);\n        parse_ident_slow:\n            while (isidnum_table[c-CH_EOF]) {\n                cstr_ccat(&tokcstr, c);\n                PEEKC(c, p);\n            }\n            ts = tok_alloc(tokcstr.data, tokcstr.size);\n        }\n        tok = ts->tok;\n        break;\n    case 'L':\n        t = p[1];\n        if (t != '\\\\' && t != '\\'' && t != '\\\"') {\n            /* fast case */\n            goto parse_ident_fast;\n        } else {\n            PEEKC(c, p);\n            if (c == '\\'' || c == '\\\"') {\n                is_long = 1;\n                goto str_const;\n            } else {\n                cstr_reset(&tokcstr);\n                cstr_ccat(&tokcstr, 'L');\n                goto parse_ident_slow;\n            }\n        }\n        break;\n    case '0': case '1': case '2': case '3':\n    case '4': case '5': case '6': case '7':\n    case '8': case '9':\n\n        cstr_reset(&tokcstr);\n        /* after the first digit, accept digits, alpha, '.' or sign if\n           prefixed by 'eEpP' */\n    parse_num:\n        for(;;) {\n            t = c;\n            cstr_ccat(&tokcstr, c);\n            PEEKC(c, p);\n            if (!(isnum(c) || isid(c) || c == '.' ||\n                  ((c == '+' || c == '-') && \n                   (t == 'e' || t == 'E' || t == 'p' || t == 'P'))))\n                break;\n        }\n        /* We add a trailing '\\0' to ease parsing */\n        cstr_ccat(&tokcstr, '\\0');\n        tokc.cstr = &tokcstr;\n        tok = TOK_PPNUM;\n        break;\n    case '.':\n        /* special dot handling because it can also start a number */\n        PEEKC(c, p);\n        if (isnum(c)) {\n            cstr_reset(&tokcstr);\n            cstr_ccat(&tokcstr, '.');\n            goto parse_num;\n        } else if (c == '.') {\n            PEEKC(c, p);\n            if (c != '.')\n                expect(\"'.'\");\n            PEEKC(c, p);\n            tok = TOK_DOTS;\n        } else {\n            tok = '.';\n        }\n        break;\n    case '\\'':\n    case '\\\"':\n        is_long = 0;\n    str_const:\n        {\n            CString str;\n            int sep;\n\n            sep = c;\n\n            /* parse the string */\n            cstr_new(&str);\n            p = parse_pp_string(p, sep, &str);\n            cstr_ccat(&str, '\\0');\n            \n            /* eval the escape (should be done as TOK_PPNUM) */\n            cstr_reset(&tokcstr);\n            parse_escape_string(&tokcstr, str.data, is_long);\n            cstr_free(&str);\n\n            if (sep == '\\'') {\n                int char_size;\n                /* XXX: make it portable */\n                if (!is_long)\n                    char_size = 1;\n                else\n                    char_size = sizeof(nwchar_t);\n                if (tokcstr.size <= char_size)\n                    tcc_error(\"empty character constant\");\n                if (tokcstr.size > 2 * char_size)\n                    tcc_warning(\"multi-character character constant\");\n                if (!is_long) {\n                    tokc.i = *(int8_t *)tokcstr.data;\n                    tok = TOK_CCHAR;\n                } else {\n                    tokc.i = *(nwchar_t *)tokcstr.data;\n                    tok = TOK_LCHAR;\n                }\n            } else {\n                tokc.cstr = &tokcstr;\n                if (!is_long)\n                    tok = TOK_STR;\n                else\n                    tok = TOK_LSTR;\n            }\n        }\n        break;\n\n    case '<':\n        PEEKC(c, p);\n        if (c == '=') {\n            p++;\n            tok = TOK_LE;\n        } else if (c == '<') {\n            PEEKC(c, p);\n            if (c == '=') {\n                p++;\n                tok = TOK_A_SHL;\n            } else {\n                tok = TOK_SHL;\n            }\n        } else {\n            tok = TOK_LT;\n        }\n        break;\n        \n    case '>':\n        PEEKC(c, p);\n        if (c == '=') {\n            p++;\n            tok = TOK_GE;\n        } else if (c == '>') {\n            PEEKC(c, p);\n            if (c == '=') {\n                p++;\n                tok = TOK_A_SAR;\n            } else {\n                tok = TOK_SAR;\n            }\n        } else {\n            tok = TOK_GT;\n        }\n        break;\n        \n    case '&':\n        PEEKC(c, p);\n        if (c == '&') {\n            p++;\n            tok = TOK_LAND;\n        } else if (c == '=') {\n            p++;\n            tok = TOK_A_AND;\n        } else {\n            tok = '&';\n        }\n        break;\n        \n    case '|':\n        PEEKC(c, p);\n        if (c == '|') {\n            p++;\n            tok = TOK_LOR;\n        } else if (c == '=') {\n            p++;\n            tok = TOK_A_OR;\n        } else {\n            tok = '|';\n        }\n        break;\n\n    case '+':\n        PEEKC(c, p);\n        if (c == '+') {\n            p++;\n            tok = TOK_INC;\n        } else if (c == '=') {\n            p++;\n            tok = TOK_A_ADD;\n        } else {\n            tok = '+';\n        }\n        break;\n        \n    case '-':\n        PEEKC(c, p);\n        if (c == '-') {\n            p++;\n            tok = TOK_DEC;\n        } else if (c == '=') {\n            p++;\n            tok = TOK_A_SUB;\n        } else if (c == '>') {\n            p++;\n            tok = TOK_ARROW;\n        } else {\n            tok = '-';\n        }\n        break;\n\n    PARSE2('!', '!', '=', TOK_NE)\n    PARSE2('=', '=', '=', TOK_EQ)\n    PARSE2('*', '*', '=', TOK_A_MUL)\n    PARSE2('%', '%', '=', TOK_A_MOD)\n    PARSE2('^', '^', '=', TOK_A_XOR)\n        \n        /* comments or operator */\n    case '/':\n        PEEKC(c, p);\n        if (c == '*') {\n            p = parse_comment(p);\n            /* comments replaced by a blank */\n            tok = ' ';\n            goto keep_tok_flags;\n        } else if (c == '/') {\n            p = parse_line_comment(p);\n            tok = ' ';\n            goto keep_tok_flags;\n        } else if (c == '=') {\n            p++;\n            tok = TOK_A_DIV;\n        } else {\n            tok = '/';\n        }\n        break;\n        \n        /* simple tokens */\n    case '(':\n    case ')':\n    case '[':\n    case ']':\n    case '{':\n    case '}':\n    case ',':\n    case ';':\n    case ':':\n    case '?':\n    case '~':\n    case '$': /* only used in assembler */\n    case '@': /* dito */\n        tok = c;\n        p++;\n        break;\n    default:\n        tcc_error(\"unrecognized character \\\\x%02x\", c);\n        break;\n    }\n    tok_flags = 0;\nkeep_tok_flags:\n    file->buf_ptr = p;\n#if defined(PARSE_DEBUG)\n    printf(\"token = %s\\n\", get_tok_str(tok, &tokc));\n#endif\n}\n\n/* return next token without macro substitution. Can read input from\n   macro_ptr buffer */\nstatic void next_nomacro_spc(void)\n{\n    if (macro_ptr) {\n    redo:\n        tok = *macro_ptr;\n        if (tok) {\n            TOK_GET(&tok, &macro_ptr, &tokc);\n            if (tok == TOK_LINENUM) {\n                file->line_num = tokc.i;\n                goto redo;\n            }\n        }\n    } else {\n        next_nomacro1();\n    }\n}\n\nST_FUNC void next_nomacro(void)\n{\n    do {\n        next_nomacro_spc();\n    } while (is_space(tok));\n}\n \n/* substitute args in macro_str and return allocated string */\nstatic int *macro_arg_subst(Sym **nested_list, const int *macro_str, Sym *args)\n{\n    int last_tok, t, spc;\n    const int *st;\n    Sym *s;\n    CValue cval;\n    TokenString str;\n    CString cstr;\n\n    tok_str_new(&str);\n    last_tok = 0;\n    while(1) {\n        TOK_GET(&t, &macro_str, &cval);\n        if (!t)\n            break;\n        if (t == '#') {\n            /* stringize */\n            TOK_GET(&t, &macro_str, &cval);\n            if (!t)\n                break;\n            s = sym_find2(args, t);\n            if (s) {\n                cstr_new(&cstr);\n                st = s->d;\n                spc = 0;\n                while (*st) {\n                    TOK_GET(&t, &st, &cval);\n                    if (!check_space(t, &spc))\n                        cstr_cat(&cstr, get_tok_str(t, &cval));\n                }\n                cstr.size -= spc;\n                cstr_ccat(&cstr, '\\0');\n#ifdef PP_DEBUG\n                printf(\"stringize: %s\\n\", (char *)cstr.data);\n#endif\n                /* add string */\n                cval.cstr = &cstr;\n                tok_str_add2(&str, TOK_STR, &cval);\n                cstr_free(&cstr);\n            } else {\n                tok_str_add2(&str, t, &cval);\n            }\n        } else if (t >= TOK_IDENT) {\n            s = sym_find2(args, t);\n            if (s) {\n                st = s->d;\n                /* if '##' is present before or after, no arg substitution */\n                if (*macro_str == TOK_TWOSHARPS || last_tok == TOK_TWOSHARPS) {\n                    /* special case for var arg macros : ## eats the\n                       ',' if empty VA_ARGS variable. */\n                    /* XXX: test of the ',' is not 100%\n                       reliable. should fix it to avoid security\n                       problems */\n                    if (gnu_ext && s->type.t &&\n                        last_tok == TOK_TWOSHARPS && \n                        str.len >= 2 && str.str[str.len - 2] == ',') {\n                        if (*st == 0) {\n                            /* suppress ',' '##' */\n                            str.len -= 2;\n                        } else {\n                            /* suppress '##' and add variable */\n                            str.len--;\n                            goto add_var;\n                        }\n                    } else {\n                        int t1;\n                    add_var:\n                        for(;;) {\n                            TOK_GET(&t1, &st, &cval);\n                            if (!t1)\n                                break;\n                            tok_str_add2(&str, t1, &cval);\n                        }\n                    }\n                } else {\n                    /* NOTE: the stream cannot be read when macro\n                       substituing an argument */\n                    macro_subst(&str, nested_list, st, NULL);\n                }\n            } else {\n                tok_str_add(&str, t);\n            }\n        } else {\n            tok_str_add2(&str, t, &cval);\n        }\n        last_tok = t;\n    }\n    tok_str_add(&str, 0);\n    return str.str;\n}\n\nstatic char const ab_month_name[12][4] =\n{\n    \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n    \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"\n};\n\n/* do macro substitution of current token with macro 's' and add\n   result to (tok_str,tok_len). 'nested_list' is the list of all\n   macros we got inside to avoid recursing. Return non zero if no\n   substitution needs to be done */\nstatic int macro_subst_tok(TokenString *tok_str,\n                           Sym **nested_list, Sym *s, struct macro_level **can_read_stream)\n{\n    Sym *args, *sa, *sa1;\n    int mstr_allocated, parlevel, *mstr, t, t1, spc;\n    const int *p;\n    TokenString str;\n    char *cstrval;\n    CValue cval;\n    CString cstr;\n    char buf[32];\n    \n    /* if symbol is a macro, prepare substitution */\n    /* special macros */\n    if (tok == TOK___LINE__) {\n        snprintf(buf, sizeof(buf), \"%d\", file->line_num);\n        cstrval = buf;\n        t1 = TOK_PPNUM;\n        goto add_cstr1;\n    } else if (tok == TOK___FILE__) {\n        cstrval = file->filename;\n        goto add_cstr;\n    } else if (tok == TOK___DATE__ || tok == TOK___TIME__) {\n        time_t ti;\n        struct tm *tm;\n\n        time(&ti);\n        tm = localtime(&ti);\n        if (tok == TOK___DATE__) {\n            snprintf(buf, sizeof(buf), \"%s %2d %d\", \n                     ab_month_name[tm->tm_mon], tm->tm_mday, tm->tm_year + 1900);\n        } else {\n            snprintf(buf, sizeof(buf), \"%02d:%02d:%02d\", \n                     tm->tm_hour, tm->tm_min, tm->tm_sec);\n        }\n        cstrval = buf;\n    add_cstr:\n        t1 = TOK_STR;\n    add_cstr1:\n        cstr_new(&cstr);\n        cstr_cat(&cstr, cstrval);\n        cstr_ccat(&cstr, '\\0');\n        cval.cstr = &cstr;\n        tok_str_add2(tok_str, t1, &cval);\n        cstr_free(&cstr);\n    } else {\n        mstr = s->d;\n        mstr_allocated = 0;\n        if (s->type.t == MACRO_FUNC) {\n            /* NOTE: we do not use next_nomacro to avoid eating the\n               next token. XXX: find better solution */\n        redo:\n            if (macro_ptr) {\n                p = macro_ptr;\n                while (is_space(t = *p) || TOK_LINEFEED == t) \n                    ++p;\n                if (t == 0 && can_read_stream) {\n                    /* end of macro stream: we must look at the token\n                       after in the file */\n                    struct macro_level *ml = *can_read_stream;\n                    macro_ptr = NULL;\n                    if (ml)\n                    {\n                        macro_ptr = ml->p;\n                        ml->p = NULL;\n                        *can_read_stream = ml -> prev;\n                    }\n                    /* also, end of scope for nested defined symbol */\n                    (*nested_list)->v = -1;\n                    goto redo;\n                }\n            } else {\n                ch = file->buf_ptr[0];\n                while (is_space(ch) || ch == '\\n' || ch == '/')\n\t\t  {\n\t\t    if (ch == '/')\n\t\t      {\n\t\t\tint c;\n\t\t\tuint8_t *p = file->buf_ptr;\n\t\t\tPEEKC(c, p);\n\t\t\tif (c == '*') {\n\t\t\t    p = parse_comment(p);\n\t\t\t    file->buf_ptr = p - 1;\n\t\t\t} else if (c == '/') {\n\t\t\t    p = parse_line_comment(p);\n\t\t\t    file->buf_ptr = p - 1;\n\t\t\t} else\n\t\t\t  break;\n\t\t      }\n\t\t    cinp();\n\t\t  }\n                t = ch;\n            }\n            if (t != '(') /* no macro subst */\n                return -1;\n                    \n            /* argument macro */\n            next_nomacro();\n            next_nomacro();\n            args = NULL;\n            sa = s->next;\n            /* NOTE: empty args are allowed, except if no args */\n            for(;;) {\n                /* handle '()' case */\n                if (!args && !sa && tok == ')')\n                    break;\n                if (!sa)\n                    tcc_error(\"macro '%s' used with too many args\",\n                          get_tok_str(s->v, 0));\n                tok_str_new(&str);\n                parlevel = spc = 0;\n                /* NOTE: non zero sa->t indicates VA_ARGS */\n                while ((parlevel > 0 || \n                        (tok != ')' && \n                         (tok != ',' || sa->type.t))) && \n                       tok != -1) {\n                    if (tok == '(')\n                        parlevel++;\n                    else if (tok == ')')\n                        parlevel--;\n                    if (tok == TOK_LINEFEED)\n                        tok = ' ';\n                    if (!check_space(tok, &spc))\n                        tok_str_add2(&str, tok, &tokc);\n                    next_nomacro_spc();\n                }\n                str.len -= spc;\n                tok_str_add(&str, 0);\n                sa1 = sym_push2(&args, sa->v & ~SYM_FIELD, sa->type.t, 0);\n                sa1->d = str.str;\n                sa = sa->next;\n                if (tok == ')') {\n                    /* special case for gcc var args: add an empty\n                       var arg argument if it is omitted */\n                    if (sa && sa->type.t && gnu_ext)\n                        continue;\n                    else\n                        break;\n                }\n                if (tok != ',')\n                    expect(\",\");\n                next_nomacro();\n            }\n            if (sa) {\n                tcc_error(\"macro '%s' used with too few args\",\n                      get_tok_str(s->v, 0));\n            }\n\n            /* now subst each arg */\n            mstr = macro_arg_subst(nested_list, mstr, args);\n            /* free memory */\n            sa = args;\n            while (sa) {\n                sa1 = sa->prev;\n                tok_str_free(sa->d);\n                sym_free(sa);\n                sa = sa1;\n            }\n            mstr_allocated = 1;\n        }\n        sym_push2(nested_list, s->v, 0, 0);\n        macro_subst(tok_str, nested_list, mstr, can_read_stream);\n        /* pop nested defined symbol */\n        sa1 = *nested_list;\n        *nested_list = sa1->prev;\n        sym_free(sa1);\n        if (mstr_allocated)\n            tok_str_free(mstr);\n    }\n    return 0;\n}\n\n/* handle the '##' operator. Return NULL if no '##' seen. Otherwise\n   return the resulting string (which must be freed). */\nstatic inline int *macro_twosharps(const int *macro_str)\n{\n    const int *ptr;\n    int t;\n    TokenString macro_str1;\n    CString cstr;\n    int n, start_of_nosubsts;\n\n    /* we search the first '##' */\n    for(ptr = macro_str;;) {\n        CValue cval;\n        TOK_GET(&t, &ptr, &cval);\n        if (t == TOK_TWOSHARPS)\n            break;\n        /* nothing more to do if end of string */\n        if (t == 0)\n            return NULL;\n    }\n\n    /* we saw '##', so we need more processing to handle it */\n    start_of_nosubsts = -1;\n    tok_str_new(&macro_str1);\n    for(ptr = macro_str;;) {\n        TOK_GET(&tok, &ptr, &tokc);\n        if (tok == 0)\n            break;\n        if (tok == TOK_TWOSHARPS)\n            continue;\n        if (tok == TOK_NOSUBST && start_of_nosubsts < 0)\n            start_of_nosubsts = macro_str1.len;\n        while (*ptr == TOK_TWOSHARPS) {\n            /* given 'a##b', remove nosubsts preceding 'a' */\n            if (start_of_nosubsts >= 0)\n                macro_str1.len = start_of_nosubsts;\n            /* given 'a##b', skip '##' */\n            t = *++ptr;\n            /* given 'a##b', remove nosubsts preceding 'b' */\n            while (t == TOK_NOSUBST)\n                t = *++ptr;\n            if (t && t != TOK_TWOSHARPS) {\n                CValue cval;\n                TOK_GET(&t, &ptr, &cval);\n                /* We concatenate the two tokens */\n                cstr_new(&cstr);\n                cstr_cat(&cstr, get_tok_str(tok, &tokc));\n                n = cstr.size;\n                cstr_cat(&cstr, get_tok_str(t, &cval));\n                cstr_ccat(&cstr, '\\0');\n\n                tcc_open_bf(tcc_state, \":paste:\", cstr.size);\n                memcpy(file->buffer, cstr.data, cstr.size);\n                for (;;) {\n                    next_nomacro1();\n                    if (0 == *file->buf_ptr)\n                        break;\n                    tok_str_add2(&macro_str1, tok, &tokc);\n                    tcc_warning(\"pasting \\\"%.*s\\\" and \\\"%s\\\" does not give a valid preprocessing token\",\n                        n, cstr.data, (char*)cstr.data + n);\n                }\n                tcc_close();\n                cstr_free(&cstr);\n            }\n        }\n        if (tok != TOK_NOSUBST) \n            start_of_nosubsts = -1;\n        tok_str_add2(&macro_str1, tok, &tokc);\n    }\n    tok_str_add(&macro_str1, 0);\n    return macro_str1.str;\n}\n\n\n/* do macro substitution of macro_str and add result to\n   (tok_str,tok_len). 'nested_list' is the list of all macros we got\n   inside to avoid recursing. */\nstatic void macro_subst(TokenString *tok_str, Sym **nested_list, \n                        const int *macro_str, struct macro_level ** can_read_stream)\n{\n    Sym *s;\n    int *macro_str1;\n    const int *ptr;\n    int t, ret, spc;\n    CValue cval;\n    struct macro_level ml;\n    int force_blank;\n    \n    /* first scan for '##' operator handling */\n    ptr = macro_str;\n    macro_str1 = macro_twosharps(ptr);\n\n    if (macro_str1) \n        ptr = macro_str1;\n    spc = 0;\n    force_blank = 0;\n\n    while (1) {\n        /* NOTE: ptr == NULL can only happen if tokens are read from\n           file stream due to a macro function call */\n        if (ptr == NULL)\n            break;\n        TOK_GET(&t, &ptr, &cval);\n        if (t == 0)\n            break;\n        if (t == TOK_NOSUBST) {\n            /* following token has already been subst'd. just copy it on */\n            tok_str_add2(tok_str, TOK_NOSUBST, NULL);\n            TOK_GET(&t, &ptr, &cval);\n            goto no_subst;\n        }\n        s = define_find(t);\n        if (s != NULL) {\n            /* if nested substitution, do nothing */\n            if (sym_find2(*nested_list, t)) {\n                /* and mark it as TOK_NOSUBST, so it doesn't get subst'd again */\n                tok_str_add2(tok_str, TOK_NOSUBST, NULL);\n                goto no_subst;\n            }\n            ml.p = macro_ptr;\n            if (can_read_stream)\n                ml.prev = *can_read_stream, *can_read_stream = &ml;\n            macro_ptr = (int *)ptr;\n            tok = t;\n            ret = macro_subst_tok(tok_str, nested_list, s, can_read_stream);\n            ptr = (int *)macro_ptr;\n            macro_ptr = ml.p;\n            if (can_read_stream && *can_read_stream == &ml)\n                *can_read_stream = ml.prev;\n            if (ret != 0)\n                goto no_subst;\n            if (parse_flags & PARSE_FLAG_SPACES)\n                force_blank = 1;\n        } else {\n        no_subst:\n            if (force_blank) {\n                tok_str_add(tok_str, ' ');\n                spc = 1;\n                force_blank = 0;\n            }\n            if (!check_space(t, &spc)) \n                tok_str_add2(tok_str, t, &cval);\n        }\n    }\n    if (macro_str1)\n        tok_str_free(macro_str1);\n}\n\n/* return next token with macro substitution */\nST_FUNC void next(void)\n{\n    Sym *nested_list, *s;\n    TokenString str;\n    struct macro_level *ml;\n\n redo:\n    if (parse_flags & PARSE_FLAG_SPACES)\n        next_nomacro_spc();\n    else\n        next_nomacro();\n    if (!macro_ptr) {\n        /* if not reading from macro substituted string, then try\n           to substitute macros */\n        if (tok >= TOK_IDENT &&\n            (parse_flags & PARSE_FLAG_PREPROCESS)) {\n            s = define_find(tok);\n            if (s) {\n                /* we have a macro: we try to substitute */\n                tok_str_new(&str);\n                nested_list = NULL;\n                ml = NULL;\n                if (macro_subst_tok(&str, &nested_list, s, &ml) == 0) {\n                    /* substitution done, NOTE: maybe empty */\n                    tok_str_add(&str, 0);\n                    macro_ptr = str.str;\n                    macro_ptr_allocated = str.str;\n                    goto redo;\n                }\n            }\n        }\n    } else {\n        if (tok == 0) {\n            /* end of macro or end of unget buffer */\n            if (unget_buffer_enabled) {\n                macro_ptr = unget_saved_macro_ptr;\n                unget_buffer_enabled = 0;\n            } else {\n                /* end of macro string: free it */\n                tok_str_free(macro_ptr_allocated);\n                macro_ptr_allocated = NULL;\n                macro_ptr = NULL;\n            }\n            goto redo;\n        } else if (tok == TOK_NOSUBST) {\n            /* discard preprocessor's nosubst markers */\n            goto redo;\n        }\n    }\n    \n    /* convert preprocessor tokens into C tokens */\n    if (tok == TOK_PPNUM &&\n        (parse_flags & PARSE_FLAG_TOK_NUM)) {\n        parse_number((char *)tokc.cstr->data);\n    }\n}\n\n/* push back current token and set current token to 'last_tok'. Only\n   identifier case handled for labels. */\nST_INLN void unget_tok(int last_tok)\n{\n    int i, n;\n    int *q;\n    if (unget_buffer_enabled)\n      {\n        /* assert(macro_ptr == unget_saved_buffer + 1);\n\t   assert(*macro_ptr == 0);  */\n      }\n    else\n      {\n\tunget_saved_macro_ptr = macro_ptr;\n\tunget_buffer_enabled = 1;\n      }\n    q = unget_saved_buffer;\n    macro_ptr = q;\n    *q++ = tok;\n    n = tok_ext_size(tok) - 1;\n    for(i=0;i<n;i++)\n        *q++ = tokc.tab[i];\n    *q = 0; /* end of token string */\n    tok = last_tok;\n}\n\n\n/* better than nothing, but needs extension to handle '-E' option\n   correctly too */\nST_FUNC void preprocess_init(TCCState *s1)\n{\n    s1->include_stack_ptr = s1->include_stack;\n    /* XXX: move that before to avoid having to initialize\n       file->ifdef_stack_ptr ? */\n    s1->ifdef_stack_ptr = s1->ifdef_stack;\n    file->ifdef_stack_ptr = s1->ifdef_stack_ptr;\n\n    vtop = vstack - 1;\n    s1->pack_stack[0] = 0;\n    s1->pack_stack_ptr = s1->pack_stack;\n}\n\nST_FUNC void preprocess_new(void)\n{\n    int i, c;\n    const char *p, *r;\n\n    /* init isid table */\n    for(i=CH_EOF;i<256;i++)\n        isidnum_table[i-CH_EOF] = isid(i) || isnum(i);\n\n    /* add all tokens */\n    table_ident = NULL;\n    memset(hash_ident, 0, TOK_HASH_SIZE * sizeof(TokenSym *));\n    \n    tok_ident = TOK_IDENT;\n    p = tcc_keywords;\n    while (*p) {\n        r = p;\n        for(;;) {\n            c = *r++;\n            if (c == '\\0')\n                break;\n        }\n        tok_alloc(p, r - p - 1);\n        p = r;\n    }\n}\n\n/* Preprocess the current file */\nST_FUNC int tcc_preprocess(TCCState *s1)\n{\n    Sym *define_start;\n\n    BufferedFile *file_ref, **iptr, **iptr_new;\n    int token_seen, line_ref, d;\n    const char *s;\n\n    preprocess_init(s1);\n    define_start = define_stack;\n    ch = file->buf_ptr[0];\n    tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF;\n    parse_flags = PARSE_FLAG_ASM_COMMENTS | PARSE_FLAG_PREPROCESS |\n        PARSE_FLAG_LINEFEED | PARSE_FLAG_SPACES;\n    token_seen = 0;\n    line_ref = 0;\n    file_ref = NULL;\n    iptr = s1->include_stack_ptr;\n\n    for (;;) {\n        next();\n        if (tok == TOK_EOF) {\n            break;\n        } else if (file != file_ref) {\n            goto print_line;\n        } else if (tok == TOK_LINEFEED) {\n            if (!token_seen)\n                continue;\n            ++line_ref;\n            token_seen = 0;\n        } else if (!token_seen) {\n            d = file->line_num - line_ref;\n            if (file != file_ref || d < 0 || d >= 8) {\nprint_line:\n                iptr_new = s1->include_stack_ptr;\n                s = iptr_new > iptr ? \" 1\"\n                  : iptr_new < iptr ? \" 2\"\n                  : iptr_new > s1->include_stack ? \" 3\"\n                  : \"\"\n                  ;\n                iptr = iptr_new;\n                fprintf(s1->ppfp, \"# %d \\\"%s\\\"%s\\n\", file->line_num, file->filename, s);\n            } else {\n                while (d)\n                    fputs(\"\\n\", s1->ppfp), --d;\n            }\n            line_ref = (file_ref = file)->line_num;\n            token_seen = tok != TOK_LINEFEED;\n            if (!token_seen)\n                continue;\n        }\n        fputs(get_tok_str(tok, &tokc), s1->ppfp);\n    }\n    free_defines(define_start);\n    return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tccrun.c",
    "content": "/*\n *  TCC - Tiny C Compiler - Support for -run switch\n *\n *  Copyright (c) 2001-2004 Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#include \"tcc.h\"\n\n/* only native compiler supports -run */\n#ifdef TCC_IS_NATIVE\n\n#ifdef CONFIG_TCC_BACKTRACE\nST_DATA int rt_num_callers = 6;\nST_DATA const char **rt_bound_error_msg;\nST_DATA void *rt_prog_main;\n#endif\n\n#ifdef _WIN32\n#define ucontext_t CONTEXT\n#endif\n\nstatic void set_pages_executable(void *ptr, unsigned long length);\nstatic void set_exception_handler(void);\nstatic int rt_get_caller_pc(addr_t *paddr, ucontext_t *uc, int level);\nstatic void rt_error(ucontext_t *uc, const char *fmt, ...);\nstatic int tcc_relocate_ex(TCCState *s1, void *ptr);\n\n#ifdef _WIN64\nstatic void win64_add_function_table(TCCState *s1);\n#endif\n\n/* ------------------------------------------------------------- */\n/* Do all relocations (needed before using tcc_get_symbol())\n   Returns -1 on error. */\n\nLIBTCCAPI int tcc_relocate(TCCState *s1, void *ptr)\n{\n    int ret;\n\n    if (TCC_RELOCATE_AUTO != ptr)\n        return tcc_relocate_ex(s1, ptr);\n\n    ret = tcc_relocate_ex(s1, NULL);\n    if (ret < 0)\n        return ret;\n\n#ifdef HAVE_SELINUX\n    {   /* Use mmap instead of malloc for Selinux.  Ref:\n           http://www.gnu.org/s/libc/manual/html_node/File-Size.html */\n\n        char tmpfname[] = \"/tmp/.tccrunXXXXXX\";\n        int fd = mkstemp (tmpfname);\n\n        s1->mem_size = ret;\n        unlink (tmpfname);\n        ftruncate (fd, s1->mem_size);\n\n        s1->write_mem = mmap (NULL, ret, PROT_READ|PROT_WRITE,\n            MAP_SHARED, fd, 0);\n        if (s1->write_mem == MAP_FAILED)\n            tcc_error(\"/tmp not writeable\");\n\n        s1->runtime_mem = mmap (NULL, ret, PROT_READ|PROT_EXEC,\n            MAP_SHARED, fd, 0);\n        if (s1->runtime_mem == MAP_FAILED)\n            tcc_error(\"/tmp not executable\");\n\n        ret = tcc_relocate_ex(s1, s1->write_mem);\n    }\n#else\n    s1->runtime_mem = tcc_malloc(ret);\n    ret = tcc_relocate_ex(s1, s1->runtime_mem);\n#endif\n    return ret;\n}\n\n/* launch the compiled program with the given arguments */\nLIBTCCAPI int tcc_run(TCCState *s1, int argc, char **argv)\n{\n    int (*prog_main)(int, char **);\n    int ret;\n\n    if (tcc_relocate(s1, TCC_RELOCATE_AUTO) < 0)\n        return -1;\n\n    prog_main = tcc_get_symbol_err(s1, \"main\");\n\n#ifdef CONFIG_TCC_BACKTRACE\n    if (s1->do_debug) {\n        set_exception_handler();\n        rt_prog_main = prog_main;\n    }\n#endif\n\n#ifdef CONFIG_TCC_BCHECK\n    if (s1->do_bounds_check) {\n        void (*bound_init)(void);\n        void (*bound_exit)(void);\n        /* set error function */\n        rt_bound_error_msg = tcc_get_symbol_err(s1, \"__bound_error_msg\");\n        /* XXX: use .init section so that it also work in binary ? */\n        bound_init = tcc_get_symbol_err(s1, \"__bound_init\");\n        bound_exit = tcc_get_symbol_err(s1, \"__bound_exit\");\n        bound_init();\n        ret = (*prog_main)(argc, argv);\n        bound_exit();\n    } else\n#endif\n        ret = (*prog_main)(argc, argv);\n    return ret;\n}\n\n/* relocate code. Return -1 on error, required size if ptr is NULL,\n   otherwise copy code into buffer passed by the caller */\nstatic int tcc_relocate_ex(TCCState *s1, void *ptr)\n{\n    Section *s;\n    unsigned long offset, length;\n    addr_t mem;\n    int i;\n\n    if (NULL == ptr) {\n        s1->nb_errors = 0;\n#ifdef TCC_TARGET_PE\n        pe_output_file(s1, NULL);\n#else\n        tcc_add_runtime(s1);\n        relocate_common_syms();\n        tcc_add_linker_symbols(s1);\n        build_got_entries(s1);\n#endif\n        if (s1->nb_errors)\n            return -1;\n    }\n\n    offset = 0, mem = (addr_t)ptr;\n    for(i = 1; i < s1->nb_sections; i++) {\n        s = s1->sections[i];\n        if (0 == (s->sh_flags & SHF_ALLOC))\n            continue;\n        length = s->data_offset;\n        s->sh_addr = mem ? (mem + offset + 15) & ~15 : 0;\n        offset = (offset + length + 15) & ~15;\n    }\n    offset += 16;\n\n    /* relocate symbols */\n    relocate_syms(s1, 1);\n    if (s1->nb_errors)\n        return -1;\n\n#ifdef TCC_HAS_RUNTIME_PLTGOT\n    s1->runtime_plt_and_got_offset = 0;\n    s1->runtime_plt_and_got = (char *)(mem + offset);\n    /* double the size of the buffer for got and plt entries\n       XXX: calculate exact size for them? */\n    offset *= 2;\n#endif\n\n    if (0 == mem)\n        return offset;\n\n    /* relocate each section */\n    for(i = 1; i < s1->nb_sections; i++) {\n        s = s1->sections[i];\n        if (s->reloc)\n            relocate_section(s1, s);\n    }\n\n    for(i = 1; i < s1->nb_sections; i++) {\n        s = s1->sections[i];\n        if (0 == (s->sh_flags & SHF_ALLOC))\n            continue;\n        length = s->data_offset;\n        // printf(\"%-12s %08x %04x\\n\", s->name, s->sh_addr, length);\n        ptr = (void*)s->sh_addr;\n        if (NULL == s->data || s->sh_type == SHT_NOBITS)\n            memset(ptr, 0, length);\n        else\n            memcpy(ptr, s->data, length);\n        /* mark executable sections as executable in memory */\n        if (s->sh_flags & SHF_EXECINSTR)\n            set_pages_executable(ptr, length);\n    }\n\n#ifdef TCC_HAS_RUNTIME_PLTGOT\n    set_pages_executable(s1->runtime_plt_and_got,\n                         s1->runtime_plt_and_got_offset);\n#endif\n\n#ifdef _WIN64\n    win64_add_function_table(s1);\n#endif\n    return 0;\n}\n\n/* ------------------------------------------------------------- */\n/* allow to run code in memory */\n\nstatic void set_pages_executable(void *ptr, unsigned long length)\n{\n#if 0\n#ifdef _WIN32\n    unsigned long old_protect;\n    VirtualProtect(ptr, length, PAGE_EXECUTE_READWRITE, &old_protect);\n#else\n#ifndef PAGESIZE\n# define PAGESIZE 4096\n#endif\n    addr_t start, end;\n    start = (addr_t)ptr & ~(PAGESIZE - 1);\n    end = (addr_t)ptr + length;\n    end = (end + PAGESIZE - 1) & ~(PAGESIZE - 1);\n    mprotect((void *)start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC);\n#endif\n#endif\n}\n\n/* ------------------------------------------------------------- */\n#ifdef CONFIG_TCC_BACKTRACE\n\nST_FUNC void tcc_set_num_callers(int n)\n{\n    rt_num_callers = n;\n}\n\n/* print the position in the source file of PC value 'pc' by reading\n   the stabs debug information */\nstatic addr_t rt_printline(addr_t wanted_pc, const char *msg)\n{\n    char func_name[128], last_func_name[128];\n    addr_t func_addr, last_pc, pc;\n    const char *incl_files[INCLUDE_STACK_SIZE];\n    int incl_index, len, last_line_num, i;\n    const char *str, *p;\n\n    Stab_Sym *stab_sym = NULL, *stab_sym_end, *sym;\n    int stab_len = 0;\n    char *stab_str = NULL;\n\n    if (stab_section) {\n        stab_len = stab_section->data_offset;\n        stab_sym = (Stab_Sym *)stab_section->data;\n        stab_str = stabstr_section->data;\n    }\n\n    func_name[0] = '\\0';\n    func_addr = 0;\n    incl_index = 0;\n    last_func_name[0] = '\\0';\n    last_pc = (addr_t)-1;\n    last_line_num = 1;\n\n    if (!stab_sym)\n        goto no_stabs;\n\n    stab_sym_end = (Stab_Sym*)((char*)stab_sym + stab_len);\n    for (sym = stab_sym + 1; sym < stab_sym_end; ++sym) {\n        switch(sym->n_type) {\n            /* function start or end */\n        case N_FUN:\n            if (sym->n_strx == 0) {\n                /* we test if between last line and end of function */\n                pc = sym->n_value + func_addr;\n                if (wanted_pc >= last_pc && wanted_pc < pc)\n                    goto found;\n                func_name[0] = '\\0';\n                func_addr = 0;\n            } else {\n                str = stab_str + sym->n_strx;\n                p = strchr(str, ':');\n                if (!p) {\n                    pstrcpy(func_name, sizeof(func_name), str);\n                } else {\n                    len = p - str;\n                    if (len > sizeof(func_name) - 1)\n                        len = sizeof(func_name) - 1;\n                    memcpy(func_name, str, len);\n                    func_name[len] = '\\0';\n                }\n                func_addr = sym->n_value;\n            }\n            break;\n            /* line number info */\n        case N_SLINE:\n            pc = sym->n_value + func_addr;\n            if (wanted_pc >= last_pc && wanted_pc < pc)\n                goto found;\n            last_pc = pc;\n            last_line_num = sym->n_desc;\n            /* XXX: slow! */\n            strcpy(last_func_name, func_name);\n            break;\n            /* include files */\n        case N_BINCL:\n            str = stab_str + sym->n_strx;\n        add_incl:\n            if (incl_index < INCLUDE_STACK_SIZE) {\n                incl_files[incl_index++] = str;\n            }\n            break;\n        case N_EINCL:\n            if (incl_index > 1)\n                incl_index--;\n            break;\n        case N_SO:\n            if (sym->n_strx == 0) {\n                incl_index = 0; /* end of translation unit */\n            } else {\n                str = stab_str + sym->n_strx;\n                /* do not add path */\n                len = strlen(str);\n                if (len > 0 && str[len - 1] != '/')\n                    goto add_incl;\n            }\n            break;\n        }\n    }\n\nno_stabs:\n    /* second pass: we try symtab symbols (no line number info) */\n    incl_index = 0;\n    if (symtab_section)\n    {\n        ElfW(Sym) *sym, *sym_end;\n        int type;\n\n        sym_end = (ElfW(Sym) *)(symtab_section->data + symtab_section->data_offset);\n        for(sym = (ElfW(Sym) *)symtab_section->data + 1;\n            sym < sym_end;\n            sym++) {\n            type = ELFW(ST_TYPE)(sym->st_info);\n            if (type == STT_FUNC || type == STT_GNU_IFUNC) {\n                if (wanted_pc >= sym->st_value &&\n                    wanted_pc < sym->st_value + sym->st_size) {\n                    pstrcpy(last_func_name, sizeof(last_func_name),\n                            strtab_section->data + sym->st_name);\n                    func_addr = sym->st_value;\n                    goto found;\n                }\n            }\n        }\n    }\n    /* did not find any info: */\n    fprintf(stderr, \"%s %p ???\\n\", msg, (void*)wanted_pc);\n    fflush(stderr);\n    return 0;\n found:\n    i = incl_index;\n    if (i > 0)\n        fprintf(stderr, \"%s:%d: \", incl_files[--i], last_line_num);\n    fprintf(stderr, \"%s %p\", msg, (void*)wanted_pc);\n    if (last_func_name[0] != '\\0')\n        fprintf(stderr, \" %s()\", last_func_name);\n    if (--i >= 0) {\n        fprintf(stderr, \" (included from \");\n        for (;;) {\n            fprintf(stderr, \"%s\", incl_files[i]);\n            if (--i < 0)\n                break;\n            fprintf(stderr, \", \");\n        }\n        fprintf(stderr, \")\");\n    }\n    fprintf(stderr, \"\\n\");\n    fflush(stderr);\n    return func_addr;\n}\n\n/* emit a run time error at position 'pc' */\nstatic void rt_error(ucontext_t *uc, const char *fmt, ...)\n{\n    va_list ap;\n    addr_t pc;\n    int i;\n\n    fprintf(stderr, \"Runtime error: \");\n    va_start(ap, fmt);\n    vfprintf(stderr, fmt, ap);\n    va_end(ap);\n    fprintf(stderr, \"\\n\");\n\n    for(i=0;i<rt_num_callers;i++) {\n        if (rt_get_caller_pc(&pc, uc, i) < 0)\n            break;\n        pc = rt_printline(pc, i ? \"by\" : \"at\");\n        if (pc == (addr_t)rt_prog_main && pc)\n            break;\n    }\n}\n\n/* ------------------------------------------------------------- */\n#ifndef _WIN32\n\n/* signal handler for fatal errors */\nstatic void sig_error(int signum, siginfo_t *siginf, void *puc)\n{\n    ucontext_t *uc = puc;\n\n    switch(signum) {\n    case SIGFPE:\n        switch(siginf->si_code) {\n        case FPE_INTDIV:\n        case FPE_FLTDIV:\n            rt_error(uc, \"division by zero\");\n            break;\n        default:\n            rt_error(uc, \"floating point exception\");\n            break;\n        }\n        break;\n    case SIGBUS:\n    case SIGSEGV:\n        if (rt_bound_error_msg && *rt_bound_error_msg)\n            rt_error(uc, *rt_bound_error_msg);\n        else\n            rt_error(uc, \"dereferencing invalid pointer\");\n        break;\n    case SIGILL:\n        rt_error(uc, \"illegal instruction\");\n        break;\n    case SIGABRT:\n        rt_error(uc, \"abort() called\");\n        break;\n    default:\n        rt_error(uc, \"caught signal %d\", signum);\n        break;\n    }\n    exit(255);\n}\n\n#ifndef SA_SIGINFO\n# define SA_SIGINFO 0x00000004u\n#endif\n\n/* Generate a stack backtrace when a CPU exception occurs. */\nstatic void set_exception_handler(void)\n{\n    struct sigaction sigact;\n    /* install TCC signal handlers to print debug info on fatal\n       runtime errors */\n    sigact.sa_flags = SA_SIGINFO | SA_RESETHAND;\n    sigact.sa_sigaction = sig_error;\n    sigemptyset(&sigact.sa_mask);\n    sigaction(SIGFPE, &sigact, NULL);\n    sigaction(SIGILL, &sigact, NULL);\n    sigaction(SIGSEGV, &sigact, NULL);\n    sigaction(SIGBUS, &sigact, NULL);\n    sigaction(SIGABRT, &sigact, NULL);\n}\n\n/* ------------------------------------------------------------- */\n#ifdef __i386__\n\n/* fix for glibc 2.1 */\n#ifndef REG_EIP\n#define REG_EIP EIP\n#define REG_EBP EBP\n#endif\n\n/* return the PC at frame level 'level'. Return negative if not found */\nstatic int rt_get_caller_pc(addr_t *paddr, ucontext_t *uc, int level)\n{\n    addr_t fp;\n    int i;\n\n    if (level == 0) {\n#if defined(__APPLE__)\n        *paddr = uc->uc_mcontext->__ss.__eip;\n#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n        *paddr = uc->uc_mcontext.mc_eip;\n#elif defined(__dietlibc__) || defined(ANDROID)\n        *paddr = uc->uc_mcontext.eip;\n#else\n        *paddr = uc->uc_mcontext.gregs[REG_EIP];\n#endif\n        return 0;\n    } else {\n#if defined(__APPLE__)\n        fp = uc->uc_mcontext->__ss.__ebp;\n#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n        fp = uc->uc_mcontext.mc_ebp;\n#elif defined(__dietlibc__) || defined(ANDROID)\n        fp = uc->uc_mcontext.ebp;\n#else\n        fp = uc->uc_mcontext.gregs[REG_EBP];\n#endif\n        for(i=1;i<level;i++) {\n            /* XXX: check address validity with program info */\n            if (fp <= 0x1000 || fp >= 0xc0000000)\n                return -1;\n            fp = ((addr_t *)fp)[0];\n        }\n        *paddr = ((addr_t *)fp)[1];\n        return 0;\n    }\n}\n\n/* ------------------------------------------------------------- */\n#elif defined(__x86_64__)\n\n/* return the PC at frame level 'level'. Return negative if not found */\nstatic int rt_get_caller_pc(addr_t *paddr, ucontext_t *uc, int level)\n{\n    addr_t fp;\n    int i;\n\n    if (level == 0) {\n        /* XXX: only support linux */\n#if defined(__APPLE__)\n        *paddr = uc->uc_mcontext->__ss.__rip;\n#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \n        *paddr = uc->uc_mcontext.mc_rip;\n#else\n        *paddr = uc->uc_mcontext.gregs[REG_RIP];\n#endif\n        return 0;\n    } else {\n#if defined(__APPLE__)\n        fp = uc->uc_mcontext->__ss.__rbp;\n#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\n        fp = uc->uc_mcontext.mc_rbp;\n#else\n        fp = uc->uc_mcontext.gregs[REG_RBP];\n#endif\n        for(i=1;i<level;i++) {\n            /* XXX: check address validity with program info */\n            if (fp <= 0x1000)\n                return -1;\n            fp = ((addr_t *)fp)[0];\n        }\n        *paddr = ((addr_t *)fp)[1];\n        return 0;\n    }\n}\n\n/* ------------------------------------------------------------- */\n#elif defined(__arm__)\n\n/* return the PC at frame level 'level'. Return negative if not found */\nstatic int rt_get_caller_pc(addr_t *paddr, ucontext_t *uc, int level)\n{\n    addr_t fp, sp;\n    int i;\n\n    if (level == 0) {\n        /* XXX: only supports linux */\n#if defined(__linux__)\n        *paddr = uc->uc_mcontext.arm_pc;\n#else\n        return -1;\n#endif\n        return 0;\n    } else {\n#if defined(__linux__)\n        fp = uc->uc_mcontext.arm_fp;\n        sp = uc->uc_mcontext.arm_sp;\n        if (sp < 0x1000)\n            sp = 0x1000;\n#else\n        return -1;\n#endif\n        /* XXX: specific to tinycc stack frames */\n        if (fp < sp + 12 || fp & 3)\n            return -1;\n        for(i = 1; i < level; i++) {\n            sp = ((addr_t *)fp)[-2];\n            if (sp < fp || sp - fp > 16 || sp & 3)\n                return -1;\n            fp = ((addr_t *)fp)[-3];\n            if (fp <= sp || fp - sp < 12 || fp & 3)\n                return -1;\n        }\n        /* XXX: check address validity with program info */\n        *paddr = ((addr_t *)fp)[-1];\n        return 0;\n    }\n}\n\n/* ------------------------------------------------------------- */\n#else\n\n#warning add arch specific rt_get_caller_pc()\nstatic int rt_get_caller_pc(addr_t *paddr, ucontext_t *uc, int level)\n{\n    return -1;\n}\n\n#endif /* !__i386__ */\n\n/* ------------------------------------------------------------- */\n#else /* WIN32 */\n\nstatic long __stdcall cpu_exception_handler(EXCEPTION_POINTERS *ex_info)\n{\n    EXCEPTION_RECORD *er = ex_info->ExceptionRecord;\n    CONTEXT *uc = ex_info->ContextRecord;\n    switch (er->ExceptionCode) {\n    case EXCEPTION_ACCESS_VIOLATION:\n        if (rt_bound_error_msg && *rt_bound_error_msg)\n            rt_error(uc, *rt_bound_error_msg);\n        else\n\t    rt_error(uc, \"access violation\");\n        break;\n    case EXCEPTION_STACK_OVERFLOW:\n        rt_error(uc, \"stack overflow\");\n        break;\n    case EXCEPTION_INT_DIVIDE_BY_ZERO:\n        rt_error(uc, \"division by zero\");\n        break;\n    default:\n        rt_error(uc, \"exception caught\");\n        break;\n    }\n    return EXCEPTION_EXECUTE_HANDLER;\n}\n\n/* Generate a stack backtrace when a CPU exception occurs. */\nstatic void set_exception_handler(void)\n{\n    SetUnhandledExceptionFilter(cpu_exception_handler);\n}\n\n#ifdef _WIN64\nstatic void win64_add_function_table(TCCState *s1)\n{\n    RtlAddFunctionTable(\n        (RUNTIME_FUNCTION*)s1->uw_pdata->sh_addr,\n        s1->uw_pdata->data_offset / sizeof (RUNTIME_FUNCTION),\n        text_section->sh_addr\n        );\n}\n#endif\n\n/* return the PC at frame level 'level'. Return non zero if not found */\nstatic int rt_get_caller_pc(addr_t *paddr, CONTEXT *uc, int level)\n{\n    addr_t fp, pc;\n    int i;\n#ifdef _WIN64\n    pc = uc->Rip;\n    fp = uc->Rbp;\n#else\n    pc = uc->Eip;\n    fp = uc->Ebp;\n#endif\n    if (level > 0) {\n        for(i=1;i<level;i++) {\n\t    /* XXX: check address validity with program info */\n\t    if (fp <= 0x1000 || fp >= 0xc0000000)\n\t\treturn -1;\n\t    fp = ((addr_t*)fp)[0];\n\t}\n        pc = ((addr_t*)fp)[1];\n    }\n    *paddr = pc;\n    return 0;\n}\n\n#endif /* _WIN32 */\n#endif /* CONFIG_TCC_BACKTRACE */\n/* ------------------------------------------------------------- */\n#ifdef CONFIG_TCC_STATIC\n\n/* dummy function for profiling */\nST_FUNC void *dlopen(const char *filename, int flag)\n{\n    return NULL;\n}\n\nST_FUNC void dlclose(void *p)\n{\n}\n\nST_FUNC const char *dlerror(void)\n{\n    return \"error\";\n}\n\ntypedef struct TCCSyms {\n    char *str;\n    void *ptr;\n} TCCSyms;\n\n\n/* add the symbol you want here if no dynamic linking is done */\nstatic TCCSyms tcc_syms[] = {\n#if !defined(CONFIG_TCCBOOT)\n#define TCCSYM(a) { #a, &a, },\n    TCCSYM(printf)\n    TCCSYM(fprintf)\n    TCCSYM(fopen)\n    TCCSYM(fclose)\n#undef TCCSYM\n#endif\n    { NULL, NULL },\n};\n\nST_FUNC void *resolve_sym(TCCState *s1, const char *symbol)\n{\n    TCCSyms *p;\n    p = tcc_syms;\n    while (p->str != NULL) {\n        if (!strcmp(p->str, symbol))\n            return p->ptr;\n        p++;\n    }\n    return NULL;\n}\n\n#elif !defined(_WIN32)\n\nST_FUNC void *resolve_sym(TCCState *s1, const char *sym)\n{\n    return dlsym(RTLD_DEFAULT, sym);\n}\n\n#endif /* CONFIG_TCC_STATIC */\n#endif /* TCC_IS_NATIVE */\n/* ------------------------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tcctok.h",
    "content": "/* keywords */\n     DEF(TOK_INT, \"int\")\n     DEF(TOK_VOID, \"void\")\n     DEF(TOK_CHAR, \"char\")\n     DEF(TOK_IF, \"if\")\n     DEF(TOK_ELSE, \"else\")\n     DEF(TOK_WHILE, \"while\")\n     DEF(TOK_BREAK, \"break\")\n     DEF(TOK_RETURN, \"return\")\n     DEF(TOK_FOR, \"for\")\n     DEF(TOK_EXTERN, \"extern\")\n     DEF(TOK_STATIC, \"static\")\n     DEF(TOK_UNSIGNED, \"unsigned\")\n     DEF(TOK_GOTO, \"goto\")\n     DEF(TOK_DO, \"do\")\n     DEF(TOK_CONTINUE, \"continue\")\n     DEF(TOK_SWITCH, \"switch\")\n     DEF(TOK_CASE, \"case\")\n\n     DEF(TOK_CONST1, \"const\")\n     DEF(TOK_CONST2, \"__const\") /* gcc keyword */\n     DEF(TOK_CONST3, \"__const__\") /* gcc keyword */\n     DEF(TOK_VOLATILE1, \"volatile\")\n     DEF(TOK_VOLATILE2, \"__volatile\") /* gcc keyword */\n     DEF(TOK_VOLATILE3, \"__volatile__\") /* gcc keyword */\n     DEF(TOK_LONG, \"long\")\n     DEF(TOK_REGISTER, \"register\")\n     DEF(TOK_SIGNED1, \"signed\")\n     DEF(TOK_SIGNED2, \"__signed\") /* gcc keyword */\n     DEF(TOK_SIGNED3, \"__signed__\") /* gcc keyword */\n     DEF(TOK_AUTO, \"auto\")\n     DEF(TOK_INLINE1, \"inline\")\n     DEF(TOK_INLINE2, \"__inline\") /* gcc keyword */\n     DEF(TOK_INLINE3, \"__inline__\") /* gcc keyword */\n     DEF(TOK_RESTRICT1, \"restrict\")\n     DEF(TOK_RESTRICT2, \"__restrict\")\n     DEF(TOK_RESTRICT3, \"__restrict__\")\n     DEF(TOK_EXTENSION, \"__extension__\") /* gcc keyword */\n     \n     DEF(TOK_FLOAT, \"float\")\n     DEF(TOK_DOUBLE, \"double\")\n     DEF(TOK_BOOL, \"_Bool\")\n     DEF(TOK_SHORT, \"short\")\n     DEF(TOK_STRUCT, \"struct\")\n     DEF(TOK_UNION, \"union\")\n     DEF(TOK_TYPEDEF, \"typedef\")\n     DEF(TOK_DEFAULT, \"default\")\n     DEF(TOK_ENUM, \"enum\")\n     DEF(TOK_SIZEOF, \"sizeof\")\n     DEF(TOK_ATTRIBUTE1, \"__attribute\")\n     DEF(TOK_ATTRIBUTE2, \"__attribute__\")\n     DEF(TOK_ALIGNOF1, \"__alignof\")\n     DEF(TOK_ALIGNOF2, \"__alignof__\")\n     DEF(TOK_TYPEOF1, \"typeof\")\n     DEF(TOK_TYPEOF2, \"__typeof\")\n     DEF(TOK_TYPEOF3, \"__typeof__\")\n     DEF(TOK_LABEL, \"__label__\")\n     DEF(TOK_ASM1, \"asm\")\n     DEF(TOK_ASM2, \"__asm\")\n     DEF(TOK_ASM3, \"__asm__\")\n\n/*********************************************************************/\n/* the following are not keywords. They are included to ease parsing */\n/* preprocessor only */\n     DEF(TOK_DEFINE, \"define\")\n     DEF(TOK_INCLUDE, \"include\")\n     DEF(TOK_INCLUDE_NEXT, \"include_next\")\n     DEF(TOK_IFDEF, \"ifdef\")\n     DEF(TOK_IFNDEF, \"ifndef\")\n     DEF(TOK_ELIF, \"elif\")\n     DEF(TOK_ENDIF, \"endif\")\n     DEF(TOK_DEFINED, \"defined\")\n     DEF(TOK_UNDEF, \"undef\")\n     DEF(TOK_ERROR, \"error\")\n     DEF(TOK_WARNING, \"warning\")\n     DEF(TOK_LINE, \"line\")\n     DEF(TOK_PRAGMA, \"pragma\")\n     DEF(TOK___LINE__, \"__LINE__\")\n     DEF(TOK___FILE__, \"__FILE__\")\n     DEF(TOK___DATE__, \"__DATE__\")\n     DEF(TOK___TIME__, \"__TIME__\")\n     DEF(TOK___FUNCTION__, \"__FUNCTION__\")\n     DEF(TOK___VA_ARGS__, \"__VA_ARGS__\")\n\n/* special identifiers */\n     DEF(TOK___FUNC__, \"__func__\")\n\n/* special floating point values */\n     DEF(TOK___NAN__, \"__nan__\")\n     DEF(TOK___SNAN__, \"__snan__\")\n     DEF(TOK___INF__, \"__inf__\")\n\n/* attribute identifiers */\n/* XXX: handle all tokens generically since speed is not critical */\n     DEF(TOK_SECTION1, \"section\")\n     DEF(TOK_SECTION2, \"__section__\")\n     DEF(TOK_ALIGNED1, \"aligned\")\n     DEF(TOK_ALIGNED2, \"__aligned__\")\n     DEF(TOK_PACKED1, \"packed\")\n     DEF(TOK_PACKED2, \"__packed__\")\n     DEF(TOK_WEAK1, \"weak\")\n     DEF(TOK_WEAK2, \"__weak__\")\n     DEF(TOK_ALIAS1, \"alias\")\n     DEF(TOK_ALIAS2, \"__alias__\")\n     DEF(TOK_UNUSED1, \"unused\")\n     DEF(TOK_UNUSED2, \"__unused__\")\n     DEF(TOK_CDECL1, \"cdecl\")\n     DEF(TOK_CDECL2, \"__cdecl\")\n     DEF(TOK_CDECL3, \"__cdecl__\")\n     DEF(TOK_STDCALL1, \"stdcall\")\n     DEF(TOK_STDCALL2, \"__stdcall\")\n     DEF(TOK_STDCALL3, \"__stdcall__\")\n     DEF(TOK_FASTCALL1, \"fastcall\")\n     DEF(TOK_FASTCALL2, \"__fastcall\")\n     DEF(TOK_FASTCALL3, \"__fastcall__\")\n     DEF(TOK_MODE, \"__mode__\")\n     DEF(TOK_MODE_DI, \"__DI__\")\n     DEF(TOK_MODE_HI, \"__HI__\")\n     DEF(TOK_MODE_SI, \"__SI__\")\n     DEF(TOK_DLLEXPORT, \"dllexport\")\n     DEF(TOK_DLLIMPORT, \"dllimport\")\n     DEF(TOK_NORETURN1, \"noreturn\")\n     DEF(TOK_NORETURN2, \"__noreturn__\")\n     DEF(TOK_builtin_types_compatible_p, \"__builtin_types_compatible_p\")\n     DEF(TOK_builtin_constant_p, \"__builtin_constant_p\")\n     DEF(TOK_builtin_frame_address, \"__builtin_frame_address\")\n#ifdef TCC_TARGET_X86_64\n     DEF(TOK_builtin_va_arg_types, \"__builtin_va_arg_types\")\n#endif\n     DEF(TOK_REGPARM1, \"regparm\")\n     DEF(TOK_REGPARM2, \"__regparm__\")\n\n/* pragma */\n     DEF(TOK_pack, \"pack\")\n#if !defined(TCC_TARGET_I386) && !defined(TCC_TARGET_X86_64)\n     /* already defined for assembler */\n     DEF(TOK_ASM_push, \"push\")\n     DEF(TOK_ASM_pop, \"pop\")\n#endif\n\n/* builtin functions or variables */\n#ifdef TCC_ARM_EABI\n     DEF(TOK_memcpy, \"__aeabi_memcpy\")\n     DEF(TOK_memcpy4, \"__aeabi_memcpy4\")\n     DEF(TOK_memcpy8, \"__aeabi_memcpy8\")\n     DEF(TOK_memset, \"__aeabi_memset\")\n     DEF(TOK___aeabi_ldivmod, \"__aeabi_ldivmod\")\n     DEF(TOK___aeabi_uldivmod, \"__aeabi_uldivmod\")\n#else\n     DEF(TOK_memcpy, \"memcpy\")\n     DEF(TOK_memset, \"memset\")\n     DEF(TOK___divdi3, \"__divdi3\")\n     DEF(TOK___moddi3, \"__moddi3\")\n     DEF(TOK___udivdi3, \"__udivdi3\")\n     DEF(TOK___umoddi3, \"__umoddi3\")\n#endif\n#if defined(TCC_TARGET_ARM)\n#ifdef TCC_ARM_EABI\n     DEF(TOK___aeabi_idivmod, \"__aeabi_idivmod\")\n     DEF(TOK___aeabi_uidivmod, \"__aeabi_uidivmod\")\n     DEF(TOK___divsi3, \"__aeabi_idiv\")\n     DEF(TOK___udivsi3, \"__aeabi_uidiv\")\n     DEF(TOK___floatdisf, \"__aeabi_l2f\")\n     DEF(TOK___floatdidf, \"__aeabi_l2d\")\n     DEF(TOK___fixsfdi, \"__aeabi_f2lz\")\n     DEF(TOK___fixdfdi, \"__aeabi_d2lz\")\n#else\n     DEF(TOK___modsi3, \"__modsi3\")\n     DEF(TOK___umodsi3, \"__umodsi3\")\n     DEF(TOK___divsi3, \"__divsi3\")\n     DEF(TOK___udivsi3, \"__udivsi3\")\n     DEF(TOK___floatdisf, \"__floatdisf\")\n     DEF(TOK___floatdidf, \"__floatdidf\")\n#ifndef TCC_ARM_VFP\n     DEF(TOK___floatdixf, \"__floatdixf\")\n     DEF(TOK___fixunssfsi, \"__fixunssfsi\")\n     DEF(TOK___fixunsdfsi, \"__fixunsdfsi\")\n     DEF(TOK___fixunsxfsi, \"__fixunsxfsi\")\n     DEF(TOK___fixxfdi, \"__fixxfdi\")\n#endif\n     DEF(TOK___fixsfdi, \"__fixsfdi\")\n     DEF(TOK___fixdfdi, \"__fixdfdi\")\n#endif\n#elif defined(TCC_TARGET_C67)\n     DEF(TOK__divi, \"_divi\")\n     DEF(TOK__divu, \"_divu\")\n     DEF(TOK__divf, \"_divf\")\n     DEF(TOK__divd, \"_divd\")\n     DEF(TOK__remi, \"_remi\")\n     DEF(TOK__remu, \"_remu\")\n#endif\n#ifdef TCC_TARGET_I386\n     DEF(TOK___tcc_int_fpu_control, \"__tcc_int_fpu_control\")\n     DEF(TOK___tcc_fpu_control, \"__tcc_fpu_control\")\n#endif\n#ifdef TCC_ARM_EABI\n     DEF(TOK___ashrdi3, \"__aeabi_lasr\")\n     DEF(TOK___lshrdi3, \"__aeabi_llsr\")\n     DEF(TOK___ashldi3, \"__aeabi_llsl\")\n     DEF(TOK___floatundisf, \"__aeabi_ul2f\")\n     DEF(TOK___floatundidf, \"__aeabi_ul2d\")\n     DEF(TOK___fixunssfdi, \"__aeabi_f2ulz\")\n     DEF(TOK___fixunsdfdi, \"__aeabi_d2ulz\")\n#else\n     DEF(TOK___ashrdi3, \"__ashrdi3\")\n     DEF(TOK___lshrdi3, \"__lshrdi3\")\n     DEF(TOK___ashldi3, \"__ashldi3\")\n     DEF(TOK___floatundisf, \"__floatundisf\")\n     DEF(TOK___floatundidf, \"__floatundidf\")\n#ifndef TCC_ARM_VFP\n     DEF(TOK___floatundixf, \"__floatundixf\")\n     DEF(TOK___fixunsxfdi, \"__fixunsxfdi\")\n#endif\n     DEF(TOK___fixunssfdi, \"__fixunssfdi\")\n     DEF(TOK___fixunsdfdi, \"__fixunsdfdi\")\n#endif\n#ifdef TCC_TARGET_PE\n     DEF(TOK___chkstk, \"__chkstk\")\n#endif\n\n/* bound checking symbols */\n#ifdef CONFIG_TCC_BCHECK\n     DEF(TOK___bound_ptr_add, \"__bound_ptr_add\")\n     DEF(TOK___bound_ptr_indir1, \"__bound_ptr_indir1\")\n     DEF(TOK___bound_ptr_indir2, \"__bound_ptr_indir2\")\n     DEF(TOK___bound_ptr_indir4, \"__bound_ptr_indir4\")\n     DEF(TOK___bound_ptr_indir8, \"__bound_ptr_indir8\")\n     DEF(TOK___bound_ptr_indir12, \"__bound_ptr_indir12\")\n     DEF(TOK___bound_ptr_indir16, \"__bound_ptr_indir16\")\n     DEF(TOK___bound_local_new, \"__bound_local_new\")\n     DEF(TOK___bound_local_delete, \"__bound_local_delete\")\n#ifdef TCC_TARGET_PE\n     DEF(TOK_malloc, \"malloc\")\n     DEF(TOK_free, \"free\")\n     DEF(TOK_realloc, \"realloc\")\n     DEF(TOK_memalign, \"memalign\")\n     DEF(TOK_calloc, \"calloc\")\n#endif\n     DEF(TOK_memmove, \"memmove\")\n     DEF(TOK_strlen, \"strlen\")\n     DEF(TOK_strcpy, \"strcpy\")\n#endif\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n     DEF(TOK_alloca, \"alloca\")\n#endif\n\n/* Tiny Assembler */\n DEF_ASM(byte)\n DEF_ASM(word)\n DEF_ASM(align)\n DEF_ASM(skip)\n DEF_ASM(space)\n DEF_ASM(string)\n DEF_ASM(asciz)\n DEF_ASM(ascii)\n DEF_ASM(file)\n DEF_ASM(globl)\n DEF_ASM(global)\n DEF_ASM(ident)\n DEF_ASM(size)\n DEF_ASM(type)\n DEF_ASM(text)\n DEF_ASM(data)\n DEF_ASM(bss)\n DEF_ASM(previous)\n DEF_ASM(fill)\n DEF_ASM(org)\n DEF_ASM(quad)\n#if defined(TCC_TARGET_I386)\n DEF_ASM(code16)\n DEF_ASM(code32)\n#elif defined(TCC_TARGET_X86_64)\n DEF_ASM(code64)\n#endif\n\n#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64\n#include \"i386-tok.h\"\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/Makefile",
    "content": "#\n# Tiny C Compiler Makefile - tests\n#\n\nTOP = ..\ninclude $(TOP)/Makefile\nVPATH = $(top_srcdir)/tests\n\n# what tests to run\nTESTS = \\\n hello-exe \\\n hello-run \\\n libtest \\\n test3 \\\n moretests\n\n# test4 -- problem with -static\n# asmtest -- minor differences with gcc\n# btest -- works on i386 (including win32)\n# test3 -- win32 does not know how to printf long doubles\n\n# bounds-checking is supported only on i386\nifneq ($(ARCH),i386)\n TESTS := $(filter-out btest,$(TESTS))\nendif\nifdef CONFIG_WIN32\n TESTS := $(filter-out test3,$(TESTS))\nendif\nifeq ($(TARGETOS),Darwin)\n TESTS := $(filter-out hello-exe test3 btest,$(TESTS))\nendif\n\nifdef DISABLE_STATIC\n export LD_LIBRARY_PATH:=$(CURDIR)/..\nendif\n\nifeq ($(TARGETOS),Darwin)\n CFLAGS+=-Wl,-flat_namespace,-undefined,warning\n export MACOSX_DEPLOYMENT_TARGET:=10.2\n NATIVE_DEFINES+=-D_ANSI_SOURCE\nendif\n\n# run local version of tcc with local libraries and includes\nTCCFLAGS = -B$(TOP)\nifdef CONFIG_WIN32\n TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)\nendif\n\nTCC = $(TOP)/tcc $(TCCFLAGS)\nRUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(TOP)/tcc.c $(TCCFLAGS)\n\nDISAS = objdump -d\n\n# libtcc test\nifdef LIBTCC1\n LIBTCC1:=$(TOP)/$(LIBTCC1)\nendif\n\nall test : $(TESTS)\n\nhello-exe: ../examples/ex1.c\n\t@echo ------------ $@ ------------\n\t$(TCC) $< -o hello$(EXESUF) || ($(TOP)/tcc -vv; exit 1) && ./hello$(EXESUF)\n\nhello-run: ../examples/ex1.c\n\t@echo ------------ $@ ------------\n\t$(TCC) -run $<\n\nlibtest: libtcc_test$(EXESUF) $(LIBTCC1)\n\t@echo ------------ $@ ------------\n\t./libtcc_test$(EXESUF) lib_path=..\n\nlibtcc_test$(EXESUF): libtcc_test.c $(top_builddir)/$(LIBTCC)\n\t$(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS)\n\nmoretests:\n\t@echo ------------ $@ ------------\n\t$(MAKE) -C tests2\n\n# test.ref - generate using gcc\n# copy only tcclib.h so GCC's stddef and stdarg will be used\ntest.ref: tcctest.c\n\tcp ../include/tcclib.h .\n\tgcc -o tcctest.gcc $< -I. $(CPPFLAGS) -w $(CFLAGS) $(NATIVE_DEFINES) -std=gnu99 -O0 -fno-omit-frame-pointer $(LDFLAGS)\n\t./tcctest.gcc > $@\n\n# auto test\ntest1: test.ref\n\t@echo ------------ $@ ------------\n\t$(TCC) -run tcctest.c > test.out1\n\t@if diff -u test.ref test.out1 ; then echo \"Auto Test OK\"; fi\n\n# iterated test2 (compile tcc then compile tcctest.c !)\ntest2: test.ref\n\t@echo ------------ $@ ------------\n\t$(TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out2\n\t@if diff -u test.ref test.out2 ; then echo \"Auto Test2 OK\"; fi\n\n# iterated test3 (compile tcc then compile tcc then compile tcctest.c !)\ntest3: test.ref\n\t@echo ------------ $@ ------------\n\t$(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out3\n\t@if diff -u test.ref test.out3 ; then echo \"Auto Test3 OK\"; fi\n\n# binary output test\ntest4: test.ref\n\t@echo ------------ $@ ------------\n# object + link output\n\t$(TCC) -c -o tcctest3.o tcctest.c\n\t$(TCC) -o tcctest3 tcctest3.o\n\t./tcctest3 > test3.out\n\t@if diff -u test.ref test3.out ; then echo \"Object Auto Test OK\"; fi\n# dynamic output\n\t$(TCC) -o tcctest1 tcctest.c\n\t./tcctest1 > test1.out\n\t@if diff -u test.ref test1.out ; then echo \"Dynamic Auto Test OK\"; fi\n# dynamic output + bound check\n\t$(TCC) -b -o tcctest4 tcctest.c\n\t./tcctest4 > test4.out\n\t@if diff -u test.ref test4.out ; then echo \"BCheck Auto Test OK\"; fi\n# static output\n\t$(TCC) -static -o tcctest2 tcctest.c\n\t./tcctest2 > test2.out\n\t@if diff -u test.ref test2.out ; then echo \"Static Auto Test OK\"; fi\n\n# memory and bound check auto test\nBOUNDS_OK  = 1 4 8 10 14\nBOUNDS_FAIL= 2 5 7 9 11 12 13 15\n\nbtest: boundtest.c\n\t@echo ------------ $@ ------------\n\t@for i in $(BOUNDS_OK); do \\\n\t   echo ; echo --- boundtest $$i ---; \\\n\t   if $(TCC) -b -run boundtest.c $$i ; then \\\n\t       echo succeded as expected; \\\n\t   else\\\n\t       echo Failed positive test $$i ; exit 1 ; \\\n\t   fi ;\\\n\tdone ;\\\n\tfor i in $(BOUNDS_FAIL); do \\\n\t   echo ; echo --- boundtest $$i ---; \\\n\t   if $(TCC) -b -run boundtest.c $$i ; then \\\n\t       echo Failed negative test $$i ; exit 1 ;\\\n\t   else\\\n\t       echo failed as expected; \\\n\t   fi ;\\\n\tdone ;\\\n\techo; echo Bound test OK\n\n# speed test\nspeedtest: ex2 ex3\n\t@echo ------------ $@ ------------\n\ttime ./ex2 1238 2 3 4 10 13 4\n\ttime $(TCC) -run $(top_srcdir)/examples/ex2.c 1238 2 3 4 10 13 4\n\ttime ./ex3 35\n\ttime $(TCC) -run $(top_srcdir)/examples/ex3.c 35\n\nweaktest: test.ref\n\t$(TCC) -c tcctest.c -o weaktest.tcc.o $(CPPFLAGS) $(CFLAGS)\n\t $(CC) -c tcctest.c -o weaktest.gcc.o -I. $(CPPFLAGS) -w $(CFLAGS)\n\tobjdump -t weaktest.tcc.o | grep ' w ' | sed -e 's/.* \\([a-zA-Z0-9_]*\\)$$/\\1/' | LC_ALL=C sort > weaktest.tcc.o.txt\n\tobjdump -t weaktest.gcc.o | grep ' w ' | sed -e 's/.* \\([a-zA-Z0-9_]*\\)$$/\\1/' | LC_ALL=C sort > weaktest.gcc.o.txt\n\tdiff weaktest.gcc.o.txt weaktest.tcc.o.txt && echo \"Weak Auto Test OK\"\n\nex%: $(top_srcdir)/examples/ex%.c\n\t$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)\n\n# tiny assembler testing\nasmtest.ref: asmtest.S\n\t$(CC) -Wa,-W -o asmtest.ref.o -c asmtest.S\n\tobjdump -D asmtest.ref.o > asmtest.ref\n\nasmtest: asmtest.ref\n\t@echo ------------ $@ ------------\n\t$(TCC) -c asmtest.S\n\tobjdump -D asmtest.o > asmtest.out\n\t@if diff -u --ignore-matching-lines=\"file format\" asmtest.ref asmtest.out ; then echo \"ASM Auto Test OK\"; fi\n\n# targets for development\n%.bin: %.c tcc\n\t$(TCC) -g -o $@ $<\n\t$(DISAS) $@\n\ninstr: instr.o\n\tobjdump -d instr.o\n\ninstr.o: instr.S\n\t$(CC) -o $@ -c $< -O2 -Wall -g\n\ncache: tcc_g\n\tcachegrind ./tcc_g -o /tmp/linpack -lm bench/linpack.c\n\tvg_annotate tcc.c > /tmp/linpack.cache.log\n\n# clean\nclean:\n\t$(MAKE) -C tests2 $@\n\trm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc *.exe \\\n\t   hello libtcc_test tcctest[1234] ex? tcc_g tcclib.h\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/asmtest.S",
    "content": "# gas comment with ``gnu'' style quotes\n\n/* some directive tests */\n\n   .byte 0xff\n   .byte 1, 2, 3\n   .short 1, 2, 3\n   .word 1, 2, 3\n   .long 1, 2, 3\n   .int 1, 2, 3\n   .align 8\n   .byte 1\n/* .align 16, 0x90 gas is too clever for us with 0x90 fill */\n   .align 16, 0x91 /* 0x91 tests the non-clever behaviour */\n   .skip 3\n   .skip 15, 0x90\n   .string \"hello\\0world\"\n\n/* some label tests */\n\n        movl %eax, %ebx\nL1:\n        movl %eax, %ebx\n        mov 0x10000, %eax\nL2:\n        movl $L2 - L1, %ecx\nvar1:\n        nop ; nop ; nop ; nop\n\n        mov var1, %eax\n\n/* instruction tests */\nmovl %eax, %ebx\nmov 0x10000, %eax\nmov 0x10000, %ax\nmov 0x10000, %al\nmov %al, 0x10000\n                \nmov $1, %edx\nmov $1, %dx\nmov $1, %dl\nmovb $2, 0x100(%ebx,%edx,2)\nmovw $2, 0x100(%ebx,%edx,2)\nmovl $2, 0x100(%ebx,%edx,2)\nmovl %eax, 0x100(%ebx,%edx,2)\nmovl 0x100(%ebx,%edx,2), %edx\nmovw %ax, 0x100(%ebx,%edx,2)\n\nmov %eax, 0x12(,%edx,2)\n        \nmov %cr3, %edx\nmov %ecx, %cr3\nmovl %cr3, %eax\nmovl %tr3, %eax\nmovl %db3, %ebx\nmovl %dr6, %eax\nmovl %fs, %ecx\nmovl %ebx, %fs\n\n     movsbl 0x1000, %eax\n     movsbw 0x1000, %ax\n     movswl 0x1000, %eax\n\n     movzbl 0x1000, %eax\n     movzbw 0x1000, %ax\n     movzwl 0x1000, %eax\n            \n     movzb 0x1000, %eax\n     movzb 0x1000, %ax\n                \n        \n  pushl %eax\n  pushw %ax\n  push %eax\n  push %cs\n  push %gs\n  push $1\n  push $100\n                                                \n  popl %eax\n  popw %ax\n  pop %eax\n  pop %ds\n  pop %fs\n          \n  xchg %eax, %ecx\n  xchg %edx, %eax\n  xchg %bx, 0x10000\n  xchg 0x10000, %ebx\n  xchg 0x10000, %dl\n\n  in $100, %al               \n  in $100, %ax               \n  in $100, %eax\n  in %dx, %al\n  in %dx, %ax               \n  in %dx, %eax\n  inb %dx\n  inw %dx               \n  inl %dx\n\n  out %al, $100                       \n  out %ax, $100                       \n  out %eax, $100                       \n\n  /* NOTE: gas is bugged here, so size must be added */\n  outb %al, %dx                       \n  outw %ax, %dx                       \n  outl %eax, %dx                       \n\n  leal 0x1000(%ebx), %ecx\n  lea 0x1000(%ebx), %ecx\n\n  les 0x2000, %eax\n  lds 0x2000, %ebx\n  lfs 0x2000, %ecx\n  lgs 0x2000, %edx\n  lss 0x2000, %edx\n\naddl $0x123, %eax\nadd $0x123, %ebx\naddl $0x123, 0x100\naddl $0x123, 0x100(%ebx)\naddl $0x123, 0x100(%ebx,%edx,2)\naddl $0x123, 0x100(%esp)\naddl $0x123, (3*8)(%esp)\naddl $0x123, (%ebp)\naddl $0x123, (%esp)\ncmpl $0x123, (%esp)\n\nadd %eax, (%ebx)\nadd (%ebx), %eax\n                \nor %dx, (%ebx)\nor (%ebx), %si\n        \nadd %cl, (%ebx)\nadd (%ebx), %dl\n\n    inc %edx\n    incl 0x10000\n    incb 0x10000\n    dec %dx\n  \n  test $1, %al\n  test $1, %cl\n\n  testl $1, 0x1000\n  testb $1, 0x1000\n  testw $1, 0x1000\n  test %eax, %ebx\n  test %eax, 0x1000\n  test 0x1000, %edx\n\n    not %edx\n    notw 0x10000\n    notl 0x10000\n    notb 0x10000\n\n    neg %edx\n    negw 0x10000\n    negl 0x10000\n    negb 0x10000\n\n    imul %ecx\n    mul %edx\n    mulb %cl\n\n    imul %eax, %ecx\n    imul 0x1000, %cx\n    imul $10, %eax, %ecx\n    imul $10, %ax, %cx\n    imul $10, %eax\n    imul $0x1100000, %eax\n    imul $1, %eax\n    \n    idivw 0x1000\n    div %ecx\n    div %bl\n    div %ecx, %eax\n\n\nshl %edx\nshl $10, %edx\nshl %cl, %edx\n\nshld $1, %eax, %edx\nshld %cl, %eax, %edx\nshld %eax, %edx\n\nshrd $1, %eax, %edx\nshrd %cl, %eax, %edx\nshrd %eax, %edx\n\nL4:\ncall 0x1000\ncall L4\ncall *%eax\ncall *0x1000\ncall func1\n\n.global L5,L6\n\nL5:\nL6:\n\nlcall $0x100, $0x1000\n\njmp 0x1000\njmp *%eax\njmp *0x1000\n\nljmp $0x100, $0x1000\n\nret\nretl\n\nret $10\nretl $10\n\nlret\n\nlret $10\n\nenter $1234, $10\n\nL3:\n jo 0x1000\n jnp 0x1001\n jne 0x1002\n jg 0x1003\n\n jo L3\n jnp L3\n jne L3\n jg L3\n\n loopne L3\n loopnz L3\n loope L3\n loopz L3\n loop L3\n jecxz L3\n\n        \n seto %al\n setnp 0x1000\n setl 0xaaaa\n setg %dl\n\n fadd\n fadd %st(1), %st\n fadd %st(0), %st(1)\n fadd %st(3)\n\n fmul %st(0),%st(0)\n fmul %st(0),%st(1)\n\n faddp %st(5)\n faddp\n faddp %st(1), %st\n\n fadds 0x1000\n fiadds 0x1002\n faddl 0x1004\n fiaddl 0x1006\n\n fmul\n fmul %st(1), %st\n fmul %st(3)\n\n fmulp %st(5)\n fmulp\n fmulp %st(1), %st\n\n fmuls 0x1000\n fimuls 0x1002\n fmull 0x1004\n fimull 0x1006\n\n fsub\n fsub %st(1), %st\n fsub %st(3)\n\n fsubp %st(5)\n fsubp\n fsubp %st(1), %st\n\n fsubs 0x1000\n fisubs 0x1002\n fsubl 0x1004\n fisubl 0x1006\n\n fsubr\n fsubr %st(1), %st\n fsubr %st(3)\n\n fsubrp %st(5)\n fsubrp\n fsubrp %st(1), %st\n\n fsubrs 0x1000\n fisubrs 0x1002\n fsubrl 0x1004\n fisubrl 0x1006\n\n fdiv\n fdiv %st(1), %st\n fdiv %st(3)\n\n fdivp %st(5)\n fdivp\n fdivp %st(1), %st\n\n fdivs 0x1000\n fidivs 0x1002\n fdivl 0x1004\n fidivl 0x1006\n\n fcom %st(3)\n\n fcoms 0x1000\n ficoms 0x1002\n fcoml 0x1004\n ficoml 0x1006\n\n fcomp %st(5)\n fcomp\n fcompp\n\n fcomps 0x1000\n ficomps 0x1002\n fcompl 0x1004\n ficompl 0x1006\n\n fld %st(5)\n fldl 0x1000\n flds 0x1002\n fildl 0x1004\n fst %st(4)\n fstp %st(6)\n fstpt 0x1006\n fbstp 0x1008\n\n fxch\n fxch %st(4)\n\n fucom %st(6)\n fucomp %st(3)\n fucompp\n\n finit\n fninit\n fldcw 0x1000\n fnstcw 0x1002\n fstcw 0x1002\n fnstsw 0x1004\n fnstsw (%eax)\n fstsw 0x1004\n fstsw (%eax)\n fnclex\n fclex\n fnstenv 0x1000\n fstenv 0x1000\n fldenv 0x1000\n fnsave 0x1002\n fsave 0x1000\n frstor 0x1000\n ffree %st(7)\n ffreep %st(6)\n \n    ftst\n    fxam\n    fld1\n    fldl2t\n    fldl2e\n    fldpi\n    fldlg2\n    fldln2\n    fldz\n\n    f2xm1\n    fyl2x\n    fptan\n    fpatan\n    fxtract\n    fprem1\n    fdecstp\n    fincstp\n    fprem\n    fyl2xp1\n    fsqrt\n    fsincos\n    frndint\n    fscale\n    fsin\n    fcos\n    fchs\n    fabs\n    fnop\n    fwait\n\nbswap %edx\nxadd %ecx, %edx\nxaddb %dl, 0x1000\nxaddw %ax, 0x1000\nxaddl %eax, 0x1000\ncmpxchg %ecx, %edx\ncmpxchgb %dl, 0x1000\ncmpxchgw %ax, 0x1000\ncmpxchgl %eax, 0x1000\ninvlpg 0x1000\ncmpxchg8b 0x1002\n\nfcmovb %st(5), %st\nfcmove %st(5), %st\nfcmovbe %st(5), %st\nfcmovu %st(5), %st\nfcmovnb %st(5), %st\nfcmovne %st(5), %st\nfcmovnbe %st(5), %st\nfcmovnu %st(5), %st\nfcomi %st(5), %st\nfucomi %st(5), %st\nfcomip %st(5), %st\nfucomip %st(5), %st\n\n\n\n cmovo 0x1000, %eax\n cmovs 0x1000, %eax\n cmovns %edx, %edi\n\nint $3\nint $0x10\n\n    pusha\n    popa\n    clc\n    cld\n    cli\n    clts\n    cmc\n    lahf\n    sahf\n    pushfl\n    popfl\n    pushf\n    popf\n    stc\n    std\n    sti\n    aaa\n    aas\n    daa\n    das\n    aad\n    aam\n    cbw\n    cwd\n    cwde\n    cdq\n    cbtw\n    cwtd\n    cwtl\n    cltd\n    leave\n    int3\n    into\n    iret\n    rsm\n    hlt\n    wait\n    nop\n\n    /* XXX: handle prefixes */\n#if 0\n    aword\n    addr16\n#endif\n    lock\n    rep\n    repe\n    repz\n    repne\n    repnz\n    nop\n\n    lock ;negl (%eax)\n    wait ;pushf\n    rep  ;stosb\n    repe ;lodsb\n    repz ;cmpsb\n    repne;movsb\n    repnz;outsb\n\n    /* handle one-line prefix + ops */\n    lock  negl (%eax)\n    wait  pushf\n    rep   stosb\n    repe  lodsb\n    repz  cmpsb\n    repne movsb\n    repnz outsb\n    \n    invd\n    wbinvd\n    cpuid\n    wrmsr\n    rdtsc\n    rdmsr\n    rdpmc\n    ud2\n\n    emms\n    movd %edx, %mm3\n    movd 0x1000, %mm2\n    movd %mm4, %ecx\n    movd %mm5, 0x1000\n                    \n    movq 0x1000, %mm2\n    movq %mm4, 0x1000\n    \n    pand 0x1000, %mm3\n    pand %mm4, %mm5\n    \n    psllw $1, %mm6\n    psllw 0x1000, %mm7\n    psllw %mm2, %mm7\n\n    xlat\n    cmpsb\n    scmpw\n    insl\n    outsw\n    lodsb\n    slodl\n    movsb\n    movsl\n    smovb\n    scasb\n    sscaw\n    stosw\n    sstol\n\n    bsf 0x1000, %ebx\n    bsr 0x1000, %ebx\n    bt %edx, 0x1000\n    btl $2, 0x1000\n    btc %edx, 0x1000\n    btcl $2, 0x1000\n    btr %edx, 0x1000\n    btrl $2, 0x1000\n    bts %edx, 0x1000\n    btsl $2, 0x1000\n\n        \n        \n    boundl %edx, 0x10000\n    boundw %bx, 0x1000\n    \n    arpl %bx, 0x1000\n    lar 0x1000, %eax\n    lgdt 0x1000\n    lidt 0x1000\n    lldt 0x1000\n    lmsw 0x1000\n    lsl 0x1000, %ecx\n    ltr 0x1000\n    \n    sgdt 0x1000\n    sidt 0x1000\n    sldt 0x1000\n    smsw 0x1000\n    str 0x1000\n    \n    verr 0x1000\n    verw 0x1000\n  \n    push %ds\n    pushw %ds\n    pushl %ds\n    pop %ds\n    popw %ds\n    popl %ds\n    fxsave 1(%ebx)\n    fxrstor 1(%ecx)\n    pushl $1\n    pushw $1\n    push $1\n\n#ifdef __ASSEMBLER__ // should be defined, for S files\n    inc %eax\n#endif\n\nft1: ft2: ft3: ft4: ft5: ft6: ft7: ft8: ft9:\n    xor %eax, %eax\n    ret\n\n.type ft1,STT_FUNC\n.type ft2,@STT_FUNC\n.type ft3,%STT_FUNC\n.type ft4,\"STT_FUNC\"\n.type ft5,function\n.type ft6,@function\n.type ft7,%function\n.type ft8,\"function\"\n\n    pause\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/boundtest.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n\n#define NB_ITS 1000000\n//#define NB_ITS 1\n#define TAB_SIZE 100\n\nint tab[TAB_SIZE];\nint ret_sum;\nchar tab3[256];\n\nint test1(void)\n{\n    int i, sum = 0;\n    for(i=0;i<TAB_SIZE;i++) {\n        sum += tab[i];\n    }\n    return sum;\n}\n\n/* error */\nint test2(void)\n{\n    int i, sum = 0;\n    for(i=0;i<TAB_SIZE + 1;i++) {\n        sum += tab[i];\n    }\n    return sum;\n}\n\n/* actually, profiling test */\nint test3(void)\n{\n    int sum;\n    int i, it;\n\n    sum = 0;\n    for(it=0;it<NB_ITS;it++) {\n        for(i=0;i<TAB_SIZE;i++) {\n            sum += tab[i];\n        }\n    }\n    return sum;\n}\n\n/* ok */\nint test4(void)\n{\n    int i, sum = 0;\n    int *tab4;\n\n    tab4 = malloc(20 * sizeof(int));\n    for(i=0;i<20;i++) {\n        sum += tab4[i];\n    }\n    free(tab4);\n\n    return sum;\n}\n\n/* error */\nint test5(void)\n{\n    int i, sum = 0;\n    int *tab4;\n\n    tab4 = malloc(20 * sizeof(int));\n    for(i=0;i<21;i++) {\n        sum += tab4[i];\n    }\n    free(tab4);\n\n    return sum;\n}\n\n/* error */\n/* XXX: currently: bug */\nint test6(void)\n{\n    int i, sum = 0;\n    int *tab4;\n    \n    tab4 = malloc(20 * sizeof(int));\n    free(tab4);\n    for(i=0;i<21;i++) {\n        sum += tab4[i];\n    }\n\n    return sum;\n}\n\n/* error */\nint test7(void)\n{\n    int i, sum = 0;\n    int *p;\n\n    for(i=0;i<TAB_SIZE + 1;i++) {\n        p = &tab[i];\n        if (i == TAB_SIZE)\n            printf(\"i=%d %x\\n\", i, p);\n        sum += *p;\n    }\n    return sum;\n}\n\n/* ok */\nint test8(void)\n{\n    int i, sum = 0;\n    int tab[10];\n\n    for(i=0;i<10;i++) {\n        sum += tab[i];\n    }\n    return sum;\n}\n\n/* error */\nint test9(void)\n{\n    int i, sum = 0;\n    char tab[10];\n\n    for(i=0;i<11;i++) {\n        sum += tab[i];\n    }\n    return sum;\n}\n\n/* ok */\nint test10(void)\n{\n    char tab[10];\n    char tab1[10];\n\n    memset(tab, 0, 10);\n    memcpy(tab, tab1, 10);\n    memmove(tab, tab1, 10);\n    return 0;\n}\n\n/* error */\nint test11(void)\n{\n    char tab[10];\n\n    memset(tab, 0, 11);\n    return 0;\n}\n\n/* error */\nint test12(void)\n{\n    void *ptr;\n    ptr = malloc(10);\n    free(ptr);\n    free(ptr);\n    return 0;\n}\n\n/* error */\nint test13(void)\n{\n    char pad1 = 0;\n    char tab[10];\n    char pad2 = 0;\n    memset(tab, 'a', sizeof(tab));\n    return strlen(tab);\n}\n\nint test14(void)\n{\n    char *p = alloca(TAB_SIZE);\n    memset(p, 'a', TAB_SIZE);\n    p[TAB_SIZE-1] = 0;\n    return strlen(p);\n}\n\n/* error */\nint test15(void)\n{\n    char *p = alloca(TAB_SIZE-1);\n    memset(p, 'a', TAB_SIZE);\n    p[TAB_SIZE-1] = 0;\n    return strlen(p);\n}\n\nint (*table_test[])(void) = {\n    test1,\n    test1,\n    test2,\n    test3,\n    test4,\n    test5,\n    test6,\n    test7,\n    test8,\n    test9,\n    test10,\n    test11,\n    test12,\n    test13,\n    test14,\n    test15,\n};\n\nint main(int argc, char **argv)\n{\n    int index;\n    int (*ftest)(void);\n\n    if (argc < 2) {\n        printf(\"usage: boundtest n\\n\"\n               \"test TCC bound checking system\\n\"\n               );\n        exit(1);\n    }\n\n    index = 0;\n    if (argc >= 2)\n        index = atoi(argv[1]);\n    /* well, we also use bounds on this ! */\n    ftest = table_test[index];\n    ftest();\n\n    return 0;\n}\n\n/*\n * without bound   0.77 s\n * with bounds    4.73\n */  \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/gcctestsuite.sh",
    "content": "#!/bin/sh\n\nTESTSUITE_PATH=$HOME/gcc/gcc-3.2/gcc/testsuite/gcc.c-torture\nTCC=\"./tcc -B. -I. -DNO_TRAMPOLINES\" \nrm -f tcc.sum tcc.log\nnb_failed=\"0\"\n\nfor src in $TESTSUITE_PATH/compile/*.c ; do\n  echo $TCC -o /tmp/test.o -c $src \n  $TCC -o /tmp/test.o -c $src >> tcc.log 2>&1\n  if [ \"$?\" = \"0\" ] ; then\n     result=\"PASS\"\n  else\n     result=\"FAIL\"\n     nb_failed=$(( $nb_failed + 1 ))\n  fi\n  echo \"$result: $src\"  >> tcc.sum\ndone\n\nfor src in $TESTSUITE_PATH/execute/*.c ; do\n  echo $TCC $src \n  $TCC $src >> tcc.log 2>&1\n  if [ \"$?\" = \"0\" ] ; then\n     result=\"PASS\"\n  else\n     result=\"FAIL\"\n     nb_failed=$(( $nb_failed + 1 ))\n  fi\n  echo \"$result: $src\"  >> tcc.sum\ndone\n\necho \"$nb_failed test(s) failed.\" >> tcc.sum\necho \"$nb_failed test(s) failed.\"\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/libtcc_test.c",
    "content": "/*\n * Simple Test program for libtcc\n *\n * libtcc can be useful to use tcc as a \"backend\" for a code generator.\n */\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"libtcc.h\"\n\n/* this function is called by the generated code */\nint add(int a, int b)\n{\n    return a + b;\n}\n\nchar my_program[] =\n\"int fib(int n)\\n\"\n\"{\\n\"\n\"    if (n <= 2)\\n\"\n\"        return 1;\\n\"\n\"    else\\n\"\n\"        return fib(n-1) + fib(n-2);\\n\"\n\"}\\n\"\n\"\\n\"\n\"int foo(int n)\\n\"\n\"{\\n\"\n\"    printf(\\\"Hello World!\\\\n\\\");\\n\"\n\"    printf(\\\"fib(%d) = %d\\\\n\\\", n, fib(n));\\n\"\n\"    printf(\\\"add(%d, %d) = %d\\\\n\\\", n, 2 * n, add(n, 2 * n));\\n\"\n\"    return 0;\\n\"\n\"}\\n\";\n\nint main(int argc, char **argv)\n{\n    TCCState *s;\n    int (*func)(int);\n\n    s = tcc_new();\n    if (!s) {\n        fprintf(stderr, \"Could not create tcc state\\n\");\n        exit(1);\n    }\n\n    /* if tcclib.h and libtcc1.a are not installed, where can we find them */\n    if (argc == 2 && !memcmp(argv[1], \"lib_path=\",9))\n        tcc_set_lib_path(s, argv[1]+9);\n\n    /* MUST BE CALLED before any compilation */\n    tcc_set_output_type(s, TCC_OUTPUT_MEMORY);\n\n    if (tcc_compile_string(s, my_program) == -1)\n        return 1;\n\n    /* as a test, we add a symbol that the compiled program can use.\n       You may also open a dll with tcc_add_dll() and use symbols from that */\n    tcc_add_symbol(s, \"add\", add);\n\n    /* relocate the code */\n    if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0)\n        return 1;\n\n    /* get entry symbol */\n    func = tcc_get_symbol(s, \"foo\");\n    if (!func)\n        return 1;\n\n    /* run the code */\n    func(32);\n\n    /* delete the state */\n    tcc_delete(s);\n\n    return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tcctest.c",
    "content": "/*\n * TCC auto test program\n */\n#include \"../config.h\"\n\n#if GCC_MAJOR >= 3\n\n/* Unfortunately, gcc version < 3 does not handle that! */\n#define ALL_ISOC99\n\n/* only gcc 3 handles _Bool correctly */\n#define BOOL_ISOC99\n\n/* gcc 2.95.3 does not handle correctly CR in strings or after strays */\n#define CORRECT_CR_HANDLING\n\n#endif\n\n/* deprecated and no longer supported in gcc 3.3 */\n//#define ACCEPT_CR_IN_STRINGS\n\n/* __VA_ARGS__ and __func__ support */\n#define C99_MACROS\n\n/* test various include syntaxes */\n\n#define TCCLIB_INC <tcclib.h>\n#define TCCLIB_INC1 <tcclib\n#define TCCLIB_INC2 h>\n#define TCCLIB_INC3 \"tcclib\"\n\n#include TCCLIB_INC\n\n#include TCCLIB_INC1.TCCLIB_INC2\n\n#include TCCLIB_INC1.h>\n\n/* gcc 3.2 does not accept that (bug ?) */\n//#include TCCLIB_INC3 \".h\"\n\n#include <tcclib.h>\n\n#include \"tcclib.h\"\n\nvoid string_test();\nvoid expr_test();\nvoid macro_test();\nvoid recursive_macro_test();\nvoid scope_test();\nvoid forward_test();\nvoid funcptr_test();\nvoid loop_test();\nvoid switch_test();\nvoid goto_test();\nvoid enum_test();\nvoid typedef_test();\nvoid struct_test();\nvoid array_test();\nvoid expr_ptr_test();\nvoid bool_test();\nvoid expr2_test();\nvoid constant_expr_test();\nvoid expr_cmp_test();\nvoid char_short_test();\nvoid init_test(void);\nvoid compound_literal_test(void);\nint kr_test();\nvoid struct_assign_test(void);\nvoid cast_test(void);\nvoid bitfield_test(void);\nvoid c99_bool_test(void);\nvoid float_test(void);\nvoid longlong_test(void);\nvoid manyarg_test(void);\nvoid stdarg_test(void);\nvoid whitespace_test(void);\nvoid relocation_test(void);\nvoid old_style_function(void);\nvoid alloca_test(void);\nvoid c99_vla_test(int size1, int size2);\nvoid sizeof_test(void);\nvoid typeof_test(void);\nvoid local_label_test(void);\nvoid statement_expr_test(void);\nvoid asm_test(void);\nvoid builtin_test(void);\nvoid weak_test(void);\nvoid global_data_test(void);\nvoid cmp_comparison_test(void);\nvoid math_cmp_test(void);\nvoid callsave_test(void);\nvoid builtin_frame_address_test(void);\n\nint fib(int n);\nvoid num(int n);\nvoid forward_ref(void);\nint isid(int c);\n\n#define A 2\n#define N 1234 + A\n#define pf printf\n#define M1(a, b)  (a) + (b)\n\n#define str\\\n(s) # s\n#define glue(a, b) a ## b\n#define xglue(a, b) glue(a, b)\n#define HIGHLOW \"hello\"\n#define LOW LOW \", world\"\n\nstatic int onetwothree = 123;\n#define onetwothree4 onetwothree\n#define onetwothree xglue(onetwothree,4)\n\n#define min(a, b) ((a) < (b) ? (a) : (b))\n\n#ifdef C99_MACROS\n#define dprintf(level,...) printf(__VA_ARGS__)\n#endif\n\n/* gcc vararg macros */\n#define dprintf1(level, fmt, args...) printf(fmt, ## args)\n\n#define MACRO_NOARGS()\n\n#define AAA 3\n#undef AAA\n#define AAA 4\n\n#if 1\n#define B3 1\n#elif 1\n#define B3 2\n#elif 0\n#define B3 3\n#else\n#define B3 4\n#endif\n\n#define __INT64_C(c)\tc ## LL\n#define INT64_MIN\t(-__INT64_C(9223372036854775807)-1)\n\nint qq(int x)\n{\n    return x + 40;\n}\n#define qq(x) x\n\n#define spin_lock(lock) do { } while (0)\n#define wq_spin_lock spin_lock\n#define TEST2() wq_spin_lock(a)\n\nvoid macro_test(void)\n{\n    printf(\"macro:\\n\");\f\u000b\r\n    pf(\"N=%d\\n\", N);\n    printf(\"aaa=%d\\n\", AAA);\n\n    printf(\"min=%d\\n\", min(1, min(2, -1)));\n\n    printf(\"s1=%s\\n\", glue(HIGH, LOW));\n    printf(\"s2=%s\\n\", xglue(HIGH, LOW));\n    printf(\"s3=%s\\n\", str(\"c\"));\n    printf(\"s4=%s\\n\", str(a1));\n    printf(\"B3=%d\\n\", B3);\n\n    printf(\"onetwothree=%d\\n\", onetwothree);\n\n#ifdef A\n    printf(\"A defined\\n\");\n#endif\n#ifdef B\n    printf(\"B defined\\n\");\n#endif\n#ifdef A\n    printf(\"A defined\\n\");\n#else\n    printf(\"A not defined\\n\");\n#endif\n#ifdef B\n    printf(\"B defined\\n\");\n#else\n    printf(\"B not defined\\n\");\n#endif\n\n#ifdef A\n    printf(\"A defined\\n\");\n#ifdef B\n    printf(\"B1 defined\\n\");\n#else\n    printf(\"B1 not defined\\n\");\n#endif\n#else\n    printf(\"A not defined\\n\");\n#ifdef B\n    printf(\"B2 defined\\n\");\n#else\n    printf(\"B2 not defined\\n\");\n#endif\n#endif\n\n#if 1+1\n    printf(\"test true1\\n\");\n#endif\n#if 0\n    printf(\"test true2\\n\");\n#endif\n#if 1-1\n    printf(\"test true3\\n\");\n#endif\n#if defined(A)\n    printf(\"test trueA\\n\");\n#endif\n#if defined(B)\n    printf(\"test trueB\\n\");\n#endif\n\n#if 0\n    printf(\"test 0\\n\");\n#elif 0\n    printf(\"test 1\\n\");\n#elif 2\n    printf(\"test 2\\n\");\n#else\n    printf(\"test 3\\n\");\n#endif\n\n    MACRO_NOARGS();\n\n#ifdef __LINE__\n    printf(\"__LINE__ defined\\n\");\n#endif\n\n    printf(\"__LINE__=%d __FILE__=%s\\n\",\n           __LINE__, __FILE__);\n#line 200\n    printf(\"__LINE__=%d __FILE__=%s\\n\",\n           __LINE__, __FILE__);\n#line 203 \"test\" \n    printf(\"__LINE__=%d __FILE__=%s\\n\",\n           __LINE__, __FILE__);\n#line 227 \"tcctest.c\"\n\n    /* not strictly preprocessor, but we test it there */\n#ifdef C99_MACROS\n    printf(\"__func__ = %s\\n\", __func__);\n    dprintf(1, \"vaarg=%d\\n\", 1);\n#endif\n    dprintf1(1, \"vaarg1\\n\");\n    dprintf1(1, \"vaarg1=%d\\n\", 2);\n    dprintf1(1, \"vaarg1=%d %d\\n\", 1, 2);\n\n    /* gcc extension */\n    printf(\"func='%s'\\n\", __FUNCTION__);\n\n    /* complicated macros in glibc */\n    printf(\"INT64_MIN=%Ld\\n\", INT64_MIN);\n    {\n        int a;\n        a = 1;\n        glue(a+, +);\n        printf(\"a=%d\\n\", a);\n        glue(a <, <= 2);\n        printf(\"a=%d\\n\", a);\n    }\n    \n    /* macro function with argument outside the macro string */\n#define MF_s MF_hello\n#define MF_hello(msg) printf(\"%s\\n\",msg)\n\n#define MF_t printf(\"tralala\\n\"); MF_hello\n\n    MF_s(\"hi\");\n    MF_t(\"hi\");\n    \n    /* test macro substituion inside args (should not eat stream) */\n    printf(\"qq=%d\\n\", qq(qq)(2));\n\n    /* test zero argument case. NOTE: gcc 2.95.x does not accept a\n       null argument without a space. gcc 3.2 fixes that. */\n\n#define qq1(x) 1\n    printf(\"qq1=%d\\n\", qq1( ));\n\n    /* comment with stray handling *\\\n/\n       /* this is a valid *\\/ comment */\n       /* this is a valid comment *\\*/\n    //  this is a valid\\\ncomment\n\n    /* test function macro substitution when the function name is\n       substituted */\n    TEST2();\n\n    /* And again when the name and parenthes are separated by a\n       comment.  */\n    TEST2 /* the comment */ ();\n}\n\n\nstatic void print_num(char *fn, int line, int num) {\n    printf(\"fn %s, line %d, num %d\\n\", fn, line, num);\n}\n\nvoid recursive_macro_test(void)\n{\n\n#define ELF32_ST_TYPE(val)              ((val) & 0xf)\n#define ELF32_ST_INFO(bind, type)       (((bind) << 4) + ((type) & 0xf))\n#define STB_WEAK        2               /* Weak symbol */\n#define ELFW(type) ELF##32##_##type\n    printf(\"%d\\n\", ELFW(ST_INFO)(STB_WEAK, ELFW(ST_TYPE)(123)));\n\n#define WRAP(x) x\n    \n#define print_num(x) print_num(__FILE__,__LINE__,x)\n    print_num(123);\n    WRAP(print_num(123));\n    WRAP(WRAP(print_num(123)));\n\nstatic struct recursive_macro { int rm_field; } G;\n#define rm_field (G.rm_field)\n    printf(\"rm_field = %d\\n\", rm_field);\n    printf(\"rm_field = %d\\n\", WRAP(rm_field));\n    WRAP((printf(\"rm_field = %d %d\\n\", rm_field, WRAP(rm_field))));\n}\n\nint op(a,b)\n{\n    return a / b;\n}\n\nint ret(a)\n{\n    if (a == 2)\n        return 1;\n    if (a == 3)\n        return 2;\n    return 0;\n}\n\nvoid ps(const char *s)\n{\n    int c;\n    while (1) {\n        c = *s;\n        if (c == 0)\n            break;\n        printf(\"%c\", c);\n        s++;\n    }\n}\n\nconst char foo1_string[] = \"\\\nbar\\n\\\ntest\\14\\\n1\";\n\nvoid string_test()\n{\n    unsigned int b;\n    printf(\"string:\\n\");\n    printf(\"\\141\\1423\\143\\n\");/* dezdez test */\n    printf(\"\\x41\\x42\\x43\\x3a\\n\");\n    printf(\"c=%c\\n\", 'r');\n    printf(\"wc=%C 0x%lx %C\\n\", L'a', L'\\x1234', L'c');\n    printf(\"foo1_string='%s'\\n\", foo1_string);\n#if 0\n    printf(\"wstring=%S\\n\", L\"abc\");\n    printf(\"wstring=%S\\n\", L\"abc\" L\"def\" \"ghi\");\n    printf(\"'\\\\377'=%d '\\\\xff'=%d\\n\", '\\377', '\\xff');\n    printf(\"L'\\\\377'=%d L'\\\\xff'=%d\\n\", L'\\377', L'\\xff');\n#endif\n    ps(\"test\\n\");\n    b = 32;\n    while ((b = b + 1) < 96) {\n        printf(\"%c\", b);\n    }\n    printf(\"\\n\");\n    printf(\"fib=%d\\n\", fib(33));\n    b = 262144;\n    while (b != 0x80000000) {\n        num(b);\n        b = b * 2;\n    }\n}\n\nvoid loop_test()\n{\n    int i;\n    i = 0;\n    while (i < 10)\n        printf(\"%d\", i++);\n    printf(\"\\n\");\n    for(i = 0; i < 10;i++)\n        printf(\"%d\", i);\n    printf(\"\\n\");\n    i = 0;\n    do {\n        printf(\"%d\", i++);\n    } while (i < 10);\n    printf(\"\\n\");\n\n    char count = 123;\n    /* c99 for loop init test */\n    for (size_t count = 1; count < 3; count++)\n        printf(\"count=%d\\n\", count);\n    printf(\"count = %d\\n\", count);\n\n    /* break/continue tests */\n    i = 0;\n    while (1) {\n        if (i == 6)\n            break;\n        i++;\n        if (i == 3)\n            continue;\n        printf(\"%d\", i);\n    }\n    printf(\"\\n\");\n\n    /* break/continue tests */\n    i = 0;\n    do {\n        if (i == 6)\n            break;\n        i++;\n        if (i == 3)\n            continue;\n        printf(\"%d\", i);\n    } while(1);\n    printf(\"\\n\");\n\n    for(i = 0;i < 10;i++) {\n        if (i == 3)\n            continue;\n        printf(\"%d\", i);\n    }\n    printf(\"\\n\");\n}\n\ntypedef int typedef_and_label;\n\nvoid goto_test()\n{\n    int i;\n    static void *label_table[3] = { &&label1, &&label2, &&label3 };\n\n    printf(\"goto:\\n\");\n    i = 0;\n    /* This needs to parse as label, not as start of decl.  */\n typedef_and_label:\n s_loop:\n    if (i >= 10) \n        goto s_end;\n    printf(\"%d\", i);\n    i++;\n    goto s_loop;\n s_end:\n    printf(\"\\n\");\n\n    /* we also test computed gotos (GCC extension) */\n    for(i=0;i<3;i++) {\n        goto *label_table[i];\n    label1:\n        printf(\"label1\\n\");\n        goto next;\n    label2:\n        printf(\"label2\\n\");\n        goto next;\n    label3:\n        printf(\"label3\\n\");\n    next: ;\n    }\n}\n\nenum {\n    E0,\n    E1 = 2,\n    E2 = 4,\n    E3,\n    E4,\n};\n\nenum test {\n    E5 = 1000,\n};\n\nvoid enum_test()\n{\n    enum test b1;\n    printf(\"enum:\\n%d %d %d %d %d %d\\n\",\n           E0, E1, E2, E3, E4, E5);\n    b1 = 1;\n    printf(\"b1=%d\\n\", b1);\n}\n\ntypedef int *my_ptr;\n\ntypedef int mytype1;\ntypedef int mytype2;\n\nvoid typedef_test()\n{\n    my_ptr a;\n    mytype1 mytype2;\n    int b;\n\n    a = &b;\n    *a = 1234;\n    printf(\"typedef:\\n\");\n    printf(\"a=%d\\n\", *a);\n    mytype2 = 2;\n    printf(\"mytype2=%d\\n\", mytype2);\n}\n\nvoid forward_test()\n{\n    printf(\"forward:\\n\");\n    forward_ref();\n    forward_ref();\n}\n\n\nvoid forward_ref(void)\n{\n    printf(\"forward ok\\n\");\n}\n\ntypedef struct struct1 {\n    int f1;\n    int f2, f3;\n    union union1 {\n        int v1;\n        int v2;\n    } u;\n    char str[3];\n} struct1;\n\nstruct struct2 {\n    int a;\n    char b;\n};\n\nunion union2 {\n    int w1;\n    int w2;\n};\n\nstruct struct1 st1, st2;\n\nint main(int argc, char **argv)\n{\n    string_test();\n    expr_test();\n    macro_test();\n    recursive_macro_test();\n    scope_test();\n    forward_test();\n    funcptr_test();\n    loop_test();\n    switch_test();\n    goto_test();\n    enum_test();\n    typedef_test();\n    struct_test();\n    array_test();\n    expr_ptr_test();\n    bool_test();\n    expr2_test();\n    constant_expr_test();\n    expr_cmp_test();\n    char_short_test();\n    init_test();\n    compound_literal_test();\n    kr_test();\n    struct_assign_test();\n    cast_test();\n    bitfield_test();\n    c99_bool_test();\n    float_test();\n    longlong_test();\n    manyarg_test();\n    stdarg_test();\n    whitespace_test();\n    relocation_test();\n    old_style_function();\n    alloca_test();\n    c99_vla_test(5, 2);\n    sizeof_test();\n    typeof_test();\n    statement_expr_test();\n    local_label_test();\n    asm_test();\n    builtin_test();\n#ifndef _WIN32\n    weak_test();\n#endif\n    global_data_test();\n    cmp_comparison_test();\n    math_cmp_test();\n    callsave_test();\n    builtin_frame_address_test();\n    return 0; \n}\n\nint tab[3];\nint tab2[3][2];\n\nint g;\n\nvoid f1(g)\n{\n    printf(\"g1=%d\\n\", g);\n}\n\nvoid scope_test()\n{\n    printf(\"scope:\\n\");\n    g = 2;\n    f1(1);\n    printf(\"g2=%d\\n\", g);\n    {\n        int g;\n        g = 3;\n        printf(\"g3=%d\\n\", g);\n        {\n            int g;\n            g = 4;\n            printf(\"g4=%d\\n\", g);\n        }\n    }\n    printf(\"g5=%d\\n\", g);\n}\n\nvoid array_test()\n{\n    int i, j, a[4];\n\n    printf(\"array:\\n\");\n    printf(\"sizeof(a) = %d\\n\", sizeof(a));\n    printf(\"sizeof(\\\"a\\\") = %d\\n\", sizeof(\"a\"));\n#ifdef C99_MACROS\n    printf(\"sizeof(__func__) = %d\\n\", sizeof(__func__));\n#endif\n    printf(\"sizeof tab %d\\n\", sizeof(tab));\n    printf(\"sizeof tab2 %d\\n\", sizeof tab2);\n    tab[0] = 1;\n    tab[1] = 2;\n    tab[2] = 3;\n    printf(\"%d %d %d\\n\", tab[0], tab[1], tab[2]);\n    for(i=0;i<3;i++)\n        for(j=0;j<2;j++)\n            tab2[i][j] = 10 * i + j;\n    for(i=0;i<3*2;i++) {\n        printf(\" %3d\", ((int *)tab2)[i]);\n    }\n    printf(\"\\n\");\n    printf(\"sizeof(size_t)=%d\\n\", sizeof(size_t));\n    printf(\"sizeof(ptrdiff_t)=%d\\n\", sizeof(ptrdiff_t));\n}\n\nvoid expr_test()\n{\n    int a, b;\n    a = 0;\n    printf(\"%d\\n\", a += 1);\n    printf(\"%d\\n\", a -= 2);\n    printf(\"%d\\n\", a *= 31232132);\n    printf(\"%d\\n\", a /= 4);\n    printf(\"%d\\n\", a %= 20);\n    printf(\"%d\\n\", a &= 6);\n    printf(\"%d\\n\", a ^= 7);\n    printf(\"%d\\n\", a |= 8);\n    printf(\"%d\\n\", a >>= 3);\n    printf(\"%d\\n\", a <<= 4);\n\n    a = 22321;\n    b = -22321;\n    printf(\"%d\\n\", a + 1);\n    printf(\"%d\\n\", a - 2);\n    printf(\"%d\\n\", a * 312);\n    printf(\"%d\\n\", a / 4);\n    printf(\"%d\\n\", b / 4);\n    printf(\"%d\\n\", (unsigned)b / 4);\n    printf(\"%d\\n\", a % 20);\n    printf(\"%d\\n\", b % 20);\n    printf(\"%d\\n\", (unsigned)b % 20);\n    printf(\"%d\\n\", a & 6);\n    printf(\"%d\\n\", a ^ 7);\n    printf(\"%d\\n\", a | 8);\n    printf(\"%d\\n\", a >> 3);\n    printf(\"%d\\n\", b >> 3);\n    printf(\"%d\\n\", (unsigned)b >> 3);\n    printf(\"%d\\n\", a << 4);\n    printf(\"%d\\n\", ~a);\n    printf(\"%d\\n\", -a);\n    printf(\"%d\\n\", +a);\n\n    printf(\"%d\\n\", 12 + 1);\n    printf(\"%d\\n\", 12 - 2);\n    printf(\"%d\\n\", 12 * 312);\n    printf(\"%d\\n\", 12 / 4);\n    printf(\"%d\\n\", 12 % 20);\n    printf(\"%d\\n\", 12 & 6);\n    printf(\"%d\\n\", 12 ^ 7);\n    printf(\"%d\\n\", 12 | 8);\n    printf(\"%d\\n\", 12 >> 2);\n    printf(\"%d\\n\", 12 << 4);\n    printf(\"%d\\n\", ~12);\n    printf(\"%d\\n\", -12);\n    printf(\"%d\\n\", +12);\n    printf(\"%d %d %d %d\\n\", \n           isid('a'), \n           isid('g'), \n           isid('T'), \n           isid('('));\n}\n\nint isid(int c)\n{\n    return (c >= 'a' & c <= 'z') | (c >= 'A' & c <= 'Z') | c == '_';\n}\n\n/**********************/\n\nint vstack[10], *vstack_ptr;\n\nvoid vpush(int vt, int vc)\n{\n    *vstack_ptr++ = vt;\n    *vstack_ptr++ = vc;\n}\n\nvoid vpop(int *ft, int *fc)\n{\n    *fc = *--vstack_ptr;\n    *ft = *--vstack_ptr;\n}\n\nvoid expr2_test()\n{\n    int a, b;\n\n    printf(\"expr2:\\n\");\n    vstack_ptr = vstack;\n    vpush(1432432, 2);\n    vstack_ptr[-2] &= ~0xffffff80;\n    vpop(&a, &b);\n    printf(\"res= %d %d\\n\", a, b);\n}\n\nvoid constant_expr_test()\n{\n    int a;\n    printf(\"constant_expr:\\n\");\n    a = 3;\n    printf(\"%d\\n\", a * 16);\n    printf(\"%d\\n\", a * 1);\n    printf(\"%d\\n\", a + 0);\n}\n\nint tab4[10];\n\nvoid expr_ptr_test()\n{\n    int *p, *q;\n    int i = -1;\n\n    printf(\"expr_ptr:\\n\");\n    p = tab4;\n    q = tab4 + 10;\n    printf(\"diff=%d\\n\", q - p);\n    p++;\n    printf(\"inc=%d\\n\", p - tab4);\n    p--;\n    printf(\"dec=%d\\n\", p - tab4);\n    ++p;\n    printf(\"inc=%d\\n\", p - tab4);\n    --p;\n    printf(\"dec=%d\\n\", p - tab4);\n    printf(\"add=%d\\n\", p + 3 - tab4);\n    printf(\"add=%d\\n\", 3 + p - tab4);\n\n    /* check if 64bit support is ok */\n    q = p = 0;\n    q += i;\n    printf(\"%p %p %ld\\n\", q, p, p-q);\n    printf(\"%d %d %d %d %d %d\\n\",\n           p == q, p != q, p < q, p <= q, p >= q, p > q);\n    i = 0xf0000000;\n    p += i;\n    printf(\"%p %p %ld\\n\", q, p, p-q);\n    printf(\"%d %d %d %d %d %d\\n\",\n           p == q, p != q, p < q, p <= q, p >= q, p > q);\n    p = (int *)((char *)p + 0xf0000000);\n    printf(\"%p %p %ld\\n\", q, p, p-q);\n    printf(\"%d %d %d %d %d %d\\n\",\n           p == q, p != q, p < q, p <= q, p >= q, p > q);\n    p += 0xf0000000;\n    printf(\"%p %p %ld\\n\", q, p, p-q);\n    printf(\"%d %d %d %d %d %d\\n\",\n           p == q, p != q, p < q, p <= q, p >= q, p > q);\n    {\n        struct size12 {\n            int i, j, k;\n        };\n        struct size12 s[2], *sp = s;\n        int i, j;\n        sp->i = 42;\n        sp++;\n        j = -1;\n        printf(\"%d\\n\", sp[j].i);\n    }\n}\n\nvoid expr_cmp_test()\n{\n    int a, b;\n    printf(\"constant_expr:\\n\");\n    a = -1;\n    b = 1;\n    printf(\"%d\\n\", a == a);\n    printf(\"%d\\n\", a != a);\n\n    printf(\"%d\\n\", a < b);\n    printf(\"%d\\n\", a <= b);\n    printf(\"%d\\n\", a <= a);\n    printf(\"%d\\n\", b >= a);\n    printf(\"%d\\n\", a >= a);\n    printf(\"%d\\n\", b > a);\n\n    printf(\"%d\\n\", (unsigned)a < b);\n    printf(\"%d\\n\", (unsigned)a <= b);\n    printf(\"%d\\n\", (unsigned)a <= a);\n    printf(\"%d\\n\", (unsigned)b >= a);\n    printf(\"%d\\n\", (unsigned)a >= a);\n    printf(\"%d\\n\", (unsigned)b > a);\n}\n\nstruct empty {\n};\n\nstruct aligntest1 {\n    char a[10];\n};\n\nstruct aligntest2 {\n    int a;\n    char b[10];\n};\n\nstruct aligntest3 {\n    double a, b;\n};\n\nstruct aligntest4 {\n    double a[0];\n};\n\nvoid struct_test()\n{\n    struct1 *s;\n    union union2 u;\n\n    printf(\"struct:\\n\");\n    printf(\"sizes: %d %d %d %d\\n\",\n           sizeof(struct struct1),\n           sizeof(struct struct2),\n           sizeof(union union1),\n           sizeof(union union2));\n    st1.f1 = 1;\n    st1.f2 = 2;\n    st1.f3 = 3;\n    printf(\"st1: %d %d %d\\n\",\n           st1.f1, st1.f2, st1.f3);\n    st1.u.v1 = 1;\n    st1.u.v2 = 2;\n    printf(\"union1: %d\\n\", st1.u.v1);\n    u.w1 = 1;\n    u.w2 = 2;\n    printf(\"union2: %d\\n\", u.w1);\n    s = &st2;\n    s->f1 = 3;\n    s->f2 = 2;\n    s->f3 = 1;\n    printf(\"st2: %d %d %d\\n\",\n           s->f1, s->f2, s->f3);\n    printf(\"str_addr=%x\\n\", (int)st1.str - (int)&st1.f1);\n\n    /* align / size tests */\n    printf(\"aligntest1 sizeof=%d alignof=%d\\n\",\n           sizeof(struct aligntest1), __alignof__(struct aligntest1));\n    printf(\"aligntest2 sizeof=%d alignof=%d\\n\",\n           sizeof(struct aligntest2), __alignof__(struct aligntest2));\n    printf(\"aligntest3 sizeof=%d alignof=%d\\n\",\n           sizeof(struct aligntest3), __alignof__(struct aligntest3));\n    printf(\"aligntest4 sizeof=%d alignof=%d\\n\",\n           sizeof(struct aligntest4), __alignof__(struct aligntest4));\n           \n    /* empty structures (GCC extension) */\n    printf(\"sizeof(struct empty) = %d\\n\", sizeof(struct empty));\n    printf(\"alignof(struct empty) = %d\\n\", __alignof__(struct empty));\n}\n\n/* XXX: depend on endianness */\nvoid char_short_test()\n{\n    int var1, var2;\n\n    printf(\"char_short:\\n\");\n\n    var1 = 0x01020304;\n    var2 = 0xfffefdfc;\n    printf(\"s8=%d %d\\n\", \n           *(char *)&var1, *(char *)&var2);\n    printf(\"u8=%d %d\\n\", \n           *(unsigned char *)&var1, *(unsigned char *)&var2);\n    printf(\"s16=%d %d\\n\", \n           *(short *)&var1, *(short *)&var2);\n    printf(\"u16=%d %d\\n\", \n           *(unsigned short *)&var1, *(unsigned short *)&var2);\n    printf(\"s32=%d %d\\n\", \n           *(int *)&var1, *(int *)&var2);\n    printf(\"u32=%d %d\\n\", \n           *(unsigned int *)&var1, *(unsigned int *)&var2);\n    *(char *)&var1 = 0x08;\n    printf(\"var1=%x\\n\", var1);\n    *(short *)&var1 = 0x0809;\n    printf(\"var1=%x\\n\", var1);\n    *(int *)&var1 = 0x08090a0b;\n    printf(\"var1=%x\\n\", var1);\n}\n\n/******************/\n\ntypedef struct Sym {\n    int v;\n    int t;\n    int c;\n    struct Sym *next;\n    struct Sym *prev;\n} Sym;\n\n#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n\nstatic int toupper1(int a)\n{\n    return TOUPPER(a);\n}\n\nvoid bool_test()\n{\n    int *s, a, b, t, f, i;\n\n    a = 0;\n    s = (void*)0;\n    printf(\"!s=%d\\n\", !s);\n\n    if (!s || !s[0])\n        a = 1;\n    printf(\"a=%d\\n\", a);\n\n    printf(\"a=%d %d %d\\n\", 0 || 0, 0 || 1, 1 || 1);\n    printf(\"a=%d %d %d\\n\", 0 && 0, 0 && 1, 1 && 1);\n    printf(\"a=%d %d\\n\", 1 ? 1 : 0, 0 ? 1 : 0);\n#if 1 && 1\n    printf(\"a1\\n\");\n#endif\n#if 1 || 0\n    printf(\"a2\\n\");\n#endif\n#if 1 ? 0 : 1\n    printf(\"a3\\n\");\n#endif\n#if 0 ? 0 : 1\n    printf(\"a4\\n\");\n#endif\n\n    a = 4;\n    printf(\"b=%d\\n\", a + (0 ? 1 : a / 2));\n\n    /* test register spilling */\n    a = 10;\n    b = 10;\n    a = (a + b) * ((a < b) ?\n                   ((b - a) * (a - b)): a + b);\n    printf(\"a=%d\\n\", a);\n\n    /* test complex || or && expressions */\n    t = 1;\n    f = 0;\n    a = 32;\n    printf(\"exp=%d\\n\", f == (32 <= a && a <= 3));\n    printf(\"r=%d\\n\", (t || f) + (t && f));\n\n    /* test ? : cast */\n    {\n        int aspect_on;\n        int aspect_native = 65536;\n        double bfu_aspect = 1.0;\n        int aspect;\n        for(aspect_on = 0; aspect_on < 2; aspect_on++) {\n            aspect=aspect_on?(aspect_native*bfu_aspect+0.5):65535UL;\n            printf(\"aspect=%d\\n\", aspect);\n        }\n    }\n\n    /* test ? : GCC extension */\n    {\n        static int v1 = 34 ? : -1; /* constant case */\n        static int v2 = 0 ? : -1; /* constant case */\n        int a = 30;\n        \n        printf(\"%d %d\\n\", v1, v2);\n        printf(\"%d %d\\n\", a - 30 ? : a * 2, a + 1 ? : a * 2);\n    }\n\n    /* again complex expression */\n    for(i=0;i<256;i++) {\n        if (toupper1 (i) != TOUPPER (i))\n            printf(\"error %d\\n\", i);\n    }\n}\n\n/* GCC accepts that */\nstatic int tab_reinit[];\nstatic int tab_reinit[10];\n\n//int cinit1; /* a global variable can be defined several times without error ! */\nint cinit1; \nint cinit1; \nint cinit1 = 0;\nint *cinit2 = (int []){3, 2, 1};\n\nvoid compound_literal_test(void)\n{\n    int *p, i;\n    char *q, *q3;\n\n    printf(\"compound_test:\\n\");\n\n    p = (int []){1, 2, 3};\n    for(i=0;i<3;i++)\n        printf(\" %d\", p[i]);\n    printf(\"\\n\");\n\n    for(i=0;i<3;i++)\n        printf(\"%d\", cinit2[i]);\n    printf(\"\\n\");\n\n    q = \"tralala1\";\n    printf(\"q1=%s\\n\", q);\n\n    q = (char *){ \"tralala2\" };\n    printf(\"q2=%s\\n\", q);\n\n    q3 = (char *){ q };\n    printf(\"q3=%s\\n\", q3);\n\n    q = (char []){ \"tralala3\" };\n    printf(\"q4=%s\\n\", q);\n\n#ifdef ALL_ISOC99\n    p = (int []){1, 2, cinit1 + 3};\n    for(i=0;i<3;i++)\n        printf(\" %d\", p[i]);\n    printf(\"\\n\");\n\n    for(i=0;i<3;i++) {\n        p = (int []){1, 2, 4 + i};\n        printf(\"%d %d %d\\n\", \n               p[0],\n               p[1],\n               p[2]);\n    }\n#endif\n}\n\n/* K & R protos */\n\nkr_func1(a, b)\n{\n    return a + b;\n}\n\nint kr_func2(a, b)\n{\n    return a + b;\n}\n\nkr_test()\n{\n    printf(\"kr_test:\\n\");\n    printf(\"func1=%d\\n\", kr_func1(3, 4));\n    printf(\"func2=%d\\n\", kr_func2(3, 4));\n    return 0;\n}\n\nvoid num(int n)\n{\n    char *tab, *p;\n    tab = (char*)malloc(20); \n    p = tab;\n    while (1) {\n        *p = 48 + (n % 10);\n        p++;\n        n = n / 10;\n        if (n == 0)\n            break;\n    }\n    while (p != tab) {\n        p--;\n        printf(\"%c\", *p);\n    }\n    printf(\"\\n\");\n    free(tab);\n}\n\n/* structure assignment tests */\nstruct structa1 {\n    int f1;\n    char f2;\n};\n\nstruct structa1 ssta1;\n\nvoid struct_assign_test1(struct structa1 s1, int t, float f)\n{\n    printf(\"%d %d %d %f\\n\", s1.f1, s1.f2, t, f);\n}\n\nstruct structa1 struct_assign_test2(struct structa1 s1, int t)\n{\n    s1.f1 += t;\n    s1.f2 -= t;\n    return s1;\n}\n\nvoid struct_assign_test(void)\n{\n    struct S {\n      struct structa1 lsta1, lsta2;\n      int i;\n    } s, *ps;\n    \n    ps = &s;\n    ps->i = 4;\n#if 0\n    printf(\"struct_assign_test:\\n\");\n\n    s.lsta1.f1 = 1;\n    s.lsta1.f2 = 2;\n    printf(\"%d %d\\n\", s.lsta1.f1, s.lsta1.f2);\n    s.lsta2 = s.lsta1;\n    printf(\"%d %d\\n\", s.lsta2.f1, s.lsta2.f2);\n#else\n    s.lsta2.f1 = 1;\n    s.lsta2.f2 = 2;\n#endif\n    struct_assign_test1(ps->lsta2, 3, 4.5);\n    \n    printf(\"before call: %d %d\\n\", s.lsta2.f1, s.lsta2.f2);\n    ps->lsta2 = struct_assign_test2(ps->lsta2, ps->i);\n    printf(\"after call: %d %d\\n\", ps->lsta2.f1, ps->lsta2.f2);\n\n    static struct {\n        void (*elem)();\n    } t[] = {\n        /* XXX: we should allow this even without braces */\n        { struct_assign_test }\n    };\n    printf(\"%d\\n\", struct_assign_test == t[0].elem);\n}\n\n/* casts to short/char */\n\nvoid cast1(char a, short b, unsigned char c, unsigned short d)\n{\n    printf(\"%d %d %d %d\\n\", a, b, c, d);\n}\n\nchar bcast;\nshort scast;\n\nvoid cast_test()\n{\n    int a;\n    char c;\n    char tab[10];\n    unsigned b,d;\n    short s;\n    char *p = NULL;\n    p -= 0x700000000042;\n\n    printf(\"cast_test:\\n\");\n    a = 0xfffff;\n    cast1(a, a, a, a);\n    a = 0xffffe;\n    printf(\"%d %d %d %d\\n\",\n           (char)(a + 1),\n           (short)(a + 1),\n           (unsigned char)(a + 1),\n           (unsigned short)(a + 1));\n    printf(\"%d %d %d %d\\n\",\n           (char)0xfffff,\n           (short)0xfffff,\n           (unsigned char)0xfffff,\n           (unsigned short)0xfffff);\n\n    a = (bcast = 128) + 1;\n    printf(\"%d\\n\", a);\n    a = (scast = 65536) + 1;\n    printf(\"%d\\n\", a);\n    \n    printf(\"sizeof(c) = %d, sizeof((int)c) = %d\\n\", sizeof(c), sizeof((int)c));\n    \n    /* test cast from unsigned to signed short to int */\n    b = 0xf000;\n    d = (short)b;\n    printf(\"((unsigned)(short)0x%08x) = 0x%08x\\n\", b, d);\n    b = 0xf0f0;\n    d = (char)b;\n    printf(\"((unsigned)(char)0x%08x) = 0x%08x\\n\", b, d);\n    \n    /* test implicit int casting for array accesses */\n    c = 0;\n    tab[1] = 2;\n    tab[c] = 1;\n    printf(\"%d %d\\n\", tab[0], tab[1]);\n\n    /* test implicit casting on some operators */\n    printf(\"sizeof(+(char)'a') = %d\\n\", sizeof(+(char)'a'));\n    printf(\"sizeof(-(char)'a') = %d\\n\", sizeof(-(char)'a'));\n    printf(\"sizeof(~(char)'a') = %d\\n\", sizeof(-(char)'a'));\n\n    /* from pointer to integer types */\n    printf(\"%d %d %ld %ld %lld %lld\\n\",\n           (int)p, (unsigned int)p,\n           (long)p, (unsigned long)p,\n           (long long)p, (unsigned long long)p);\n\n    /* from integers to pointers */\n    printf(\"%p %p %p %p\\n\",\n           (void *)a, (void *)b, (void *)c, (void *)d);\n}\n\n/* initializers tests */\nstruct structinit1 {\n    int f1;\n    char f2;\n    short f3;\n    int farray[3];\n};\n\nint sinit1 = 2;\nint sinit2 = { 3 };\nint sinit3[3] = { 1, 2, {{3}}, };\nint sinit4[3][2] = { {1, 2}, {3, 4}, {5, 6} };\nint sinit5[3][2] = { 1, 2, 3, 4, 5, 6 };\nint sinit6[] = { 1, 2, 3 };\nint sinit7[] = { [2] = 3, [0] = 1, 2 };\nchar sinit8[] = \"hello\" \"trala\";\n\nstruct structinit1 sinit9 = { 1, 2, 3 };\nstruct structinit1 sinit10 = { .f2 = 2, 3, .f1 = 1 };\nstruct structinit1 sinit11 = { .f2 = 2, 3, .f1 = 1, \n#ifdef ALL_ISOC99\n                               .farray[0] = 10,\n                               .farray[1] = 11,\n                               .farray[2] = 12,\n#endif\n};\n\nchar *sinit12 = \"hello world\";\nchar *sinit13[] = {\n    \"test1\",\n    \"test2\",\n    \"test3\",\n};\nchar sinit14[10] = { \"abc\" };\nint sinit15[3] = { sizeof(sinit15), 1, 2 };\n\nstruct { int a[3], b; } sinit16[] = { { 1 }, 2 };\n\nstruct bar {\n        char *s;\n        int len;\n} sinit17[] = {\n        \"a1\", 4,\n        \"a2\", 1\n};\n\nint sinit18[10] = {\n    [2 ... 5] = 20,\n    2,\n    [8] = 10,\n};\n\nstruct complexinit0 {\n    int a;\n    int b;\n};\n\nstruct complexinit {\n    int a;\n    const struct complexinit0 *b;\n};\n\nconst static struct complexinit cix[] = {\n    [0] = {\n\t.a = 2000,\n\t.b = (const struct complexinit0[]) {\n\t\t{ 2001, 2002 },\n\t\t{ 2003, 2003 },\n\t\t{}\n\t}\n    }\n};\n\nstruct complexinit2 {\n\tint a;\n\tint b[];\n};\n\nstruct complexinit2 cix20;\n\nstruct complexinit2 cix21 = {\n\t.a = 3000,\n\t.b = { 3001, 3002, 3003 }\n};\n\nstruct complexinit2 cix22 = {\n\t.a = 4000,\n\t.b = { 4001, 4002, 4003, 4004, 4005, 4006 }\n};\n\nvoid init_test(void)\n{\n    int linit1 = 2;\n    int linit2 = { 3 };\n    int linit4[3][2] = { {1, 2}, {3, 4}, {5, 6} };\n    int linit6[] = { 1, 2, 3 };\n    int i, j;\n    char linit8[] = \"hello\" \"trala\";\n    int linit12[10] = { 1, 2 };\n    int linit13[10] = { 1, 2, [7] = 3, [3] = 4, };\n    char linit14[10] = \"abc\";\n    int linit15[10] = { linit1, linit1 + 1, [6] = linit1 + 2, };\n    struct linit16 { int a1, a2, a3, a4; } linit16 = { 1, .a3 = 2 };\n    int linit17 = sizeof(linit17);\n    \n    printf(\"init_test:\\n\");\n\n    printf(\"sinit1=%d\\n\", sinit1);\n    printf(\"sinit2=%d\\n\", sinit2);\n    printf(\"sinit3=%d %d %d %d\\n\", \n           sizeof(sinit3),\n           sinit3[0],\n           sinit3[1],\n           sinit3[2]\n           );\n    printf(\"sinit6=%d\\n\", sizeof(sinit6));\n    printf(\"sinit7=%d %d %d %d\\n\", \n           sizeof(sinit7),\n           sinit7[0],\n           sinit7[1],\n           sinit7[2]\n           );\n    printf(\"sinit8=%s\\n\", sinit8);\n    printf(\"sinit9=%d %d %d\\n\", \n           sinit9.f1,\n           sinit9.f2,\n           sinit9.f3\n           );\n    printf(\"sinit10=%d %d %d\\n\", \n           sinit10.f1,\n           sinit10.f2,\n           sinit10.f3\n           );\n    printf(\"sinit11=%d %d %d %d %d %d\\n\", \n           sinit11.f1,\n           sinit11.f2,\n           sinit11.f3,\n           sinit11.farray[0],\n           sinit11.farray[1],\n           sinit11.farray[2]\n           );\n\n    for(i=0;i<3;i++)\n        for(j=0;j<2;j++)\n            printf(\"[%d][%d] = %d %d %d\\n\", \n                   i, j, sinit4[i][j], sinit5[i][j], linit4[i][j]);\n    printf(\"linit1=%d\\n\", linit1);\n    printf(\"linit2=%d\\n\", linit2);\n    printf(\"linit6=%d\\n\", sizeof(linit6));\n    printf(\"linit8=%d %s\\n\", sizeof(linit8), linit8);\n\n    printf(\"sinit12=%s\\n\", sinit12);\n    printf(\"sinit13=%d %s %s %s\\n\",\n           sizeof(sinit13), \n           sinit13[0],\n           sinit13[1],\n           sinit13[2]);\n    printf(\"sinit14=%s\\n\", sinit14);\n\n    for(i=0;i<10;i++) printf(\" %d\", linit12[i]);\n    printf(\"\\n\");\n    for(i=0;i<10;i++) printf(\" %d\", linit13[i]);\n    printf(\"\\n\");\n    for(i=0;i<10;i++) printf(\" %d\", linit14[i]);\n    printf(\"\\n\");\n    for(i=0;i<10;i++) printf(\" %d\", linit15[i]);\n    printf(\"\\n\");\n    printf(\"%d %d %d %d\\n\", \n           linit16.a1,\n           linit16.a2,\n           linit16.a3,\n           linit16.a4);\n    /* test that initialisation is done after variable declare */\n    printf(\"linit17=%d\\n\", linit17);\n    printf(\"sinit15=%d\\n\", sinit15[0]);\n    printf(\"sinit16=%d %d\\n\", sinit16[0].a[0], sinit16[1].a[0]);\n    printf(\"sinit17=%s %d %s %d\\n\",\n           sinit17[0].s, sinit17[0].len,\n           sinit17[1].s, sinit17[1].len);\n    for(i=0;i<10;i++)\n        printf(\"%x \", sinit18[i]);\n    printf(\"\\n\");\n    /* complex init check */\n    printf(\"cix: %d %d %d %d %d %d %d\\n\",\n\tcix[0].a,\n\tcix[0].b[0].a, cix[0].b[0].b,\n\tcix[0].b[1].a, cix[0].b[1].b,\n\tcix[0].b[2].a, cix[0].b[2].b);\n    printf(\"cix2: %d %d\\n\", cix21.b[2], cix22.b[5]);\n    printf(\"sizeof cix20 %d, cix21 %d, sizeof cix22 %d\\n\", sizeof cix20, sizeof cix21, sizeof cix22);\n}\n\n\nvoid switch_test()\n{\n    int i;\n\n    for(i=0;i<15;i++) {\n        switch(i) {\n        case 0:\n        case 1:\n            printf(\"a\");\n            break;\n        default:\n            printf(\"%d\", i);\n            break;\n        case 8 ... 12:\n            printf(\"c\");\n            break;\n        case 3:\n            printf(\"b\");\n            break;\n        }\n    }\n    printf(\"\\n\");\n}\n\n/* ISOC99 _Bool type */\nvoid c99_bool_test(void)\n{\n#ifdef BOOL_ISOC99\n    int a;\n    _Bool b;\n\n    printf(\"bool_test:\\n\");\n    printf(\"sizeof(_Bool) = %d\\n\", sizeof(_Bool));\n    a = 3;\n    printf(\"cast: %d %d %d\\n\", (_Bool)10, (_Bool)0, (_Bool)a);\n    b = 3;\n    printf(\"b = %d\\n\", b);\n    b++;\n    printf(\"b = %d\\n\", b);\n#endif\n}\n\nvoid bitfield_test(void)\n{\n    int a;\n    short sa;\n    unsigned char ca;\n    struct sbf1 {\n        int f1 : 3;\n        int : 2;\n        int f2 : 1;\n        int : 0;\n        int f3 : 5;\n        int f4 : 7;\n        unsigned int f5 : 7;\n    } st1;\n    printf(\"bitfield_test:\");\n    printf(\"sizeof(st1) = %d\\n\", sizeof(st1));\n\n    st1.f1 = 3;\n    st1.f2 = 1;\n    st1.f3 = 15;\n    a = 120;\n    st1.f4 = a;\n    st1.f5 = a;\n    st1.f5++;\n    printf(\"%d %d %d %d %d\\n\",\n           st1.f1, st1.f2, st1.f3, st1.f4, st1.f5);\n    sa = st1.f5;\n    ca = st1.f5;\n    printf(\"%d %d\\n\", sa, ca);\n\n    st1.f1 = 7;\n    if (st1.f1 == -1) \n        printf(\"st1.f1 == -1\\n\");\n    else \n        printf(\"st1.f1 != -1\\n\");\n    if (st1.f2 == -1) \n        printf(\"st1.f2 == -1\\n\");\n    else \n        printf(\"st1.f2 != -1\\n\");\n\n    /* bit sizes below must be bigger than 32 since GCC doesn't allow\n       long-long bitfields whose size is not bigger than int */\n    struct sbf2 {\n        long long f1 : 45;\n        long long : 2;\n        long long f2 : 35;\n        unsigned long long f3 : 38;\n    } st2;\n    st2.f1 = 0x123456789ULL;\n    a = 120;\n    st2.f2 = (long long)a << 25;\n    st2.f3 = a;\n    st2.f2++;\n    printf(\"%lld %lld %lld\\n\", st2.f1, st2.f2, st2.f3);\n}\n\n#ifdef __x86_64__\n#define FLOAT_FMT \"%f\\n\"\n#else\n/* x86's float isn't compatible with GCC */\n#define FLOAT_FMT \"%.5f\\n\"\n#endif\n\n/* declare strto* functions as they are C99 */\ndouble strtod(const char *nptr, char **endptr);\nfloat strtof(const char *nptr, char **endptr);\nlong double strtold(const char *nptr, char **endptr);\n\n#define FTEST(prefix, type, fmt)\\\nvoid prefix ## cmp(type a, type b)\\\n{\\\n    printf(\"%d %d %d %d %d %d\\n\",\\\n           a == b,\\\n           a != b,\\\n           a < b,\\\n           a > b,\\\n           a >= b,\\\n           a <= b);\\\n    printf(fmt \" \" fmt \" \" fmt \" \" fmt \" \" fmt \" \" fmt \" \" fmt \"\\n\",\\\n           a,\\\n           b,\\\n           a + b,\\\n           a - b,\\\n           a * b,\\\n           a / b,\\\n           -a);\\\n    printf(fmt \"\\n\", ++a);\\\n    printf(fmt \"\\n\", a++);\\\n    printf(fmt \"\\n\", a);\\\n    b = 0;\\\n    printf(\"%d %d\\n\", !a, !b);\\\n}\\\nvoid prefix ## fcast(type a)\\\n{\\\n    float fa;\\\n    double da;\\\n    long double la;\\\n    int ia;\\\n    unsigned int ua;\\\n    type b;\\\n    fa = a;\\\n    da = a;\\\n    la = a;\\\n    printf(\"ftof: %f %f %Lf\\n\", fa, da, la);\\\n    ia = (int)a;\\\n    ua = (unsigned int)a;\\\n    printf(\"ftoi: %d %u\\n\", ia, ua);\\\n    ia = -1234;\\\n    ua = 0x81234500;\\\n    b = ia;\\\n    printf(\"itof: \" fmt \"\\n\", b);\\\n    b = ua;\\\n    printf(\"utof: \" fmt \"\\n\", b);\\\n}\\\n\\\nfloat prefix ## retf(type a) { return a; }\\\ndouble prefix ## retd(type a) { return a; }\\\nlong double prefix ## retld(type a) { return a; }\\\n\\\nvoid prefix ## call(void)\\\n{\\\n    printf(\"float: \" FLOAT_FMT, prefix ## retf(42.123456789));\\\n    printf(\"double: %f\\n\", prefix ## retd(42.123456789));\\\n    printf(\"long double: %Lf\\n\", prefix ## retld(42.123456789));\\\n    printf(\"strto%s: %f\\n\", #prefix, (double)strto ## prefix(\"1.2\", NULL));\\\n}\\\n\\\nvoid prefix ## test(void)\\\n{\\\n    printf(\"testing '%s'\\n\", #type);\\\n    prefix ## cmp(1, 2.5);\\\n    prefix ## cmp(2, 1.5);\\\n    prefix ## cmp(1, 1);\\\n    prefix ## fcast(234.6);\\\n    prefix ## fcast(-2334.6);\\\n    prefix ## call();\\\n}\n\nFTEST(f, float, \"%f\")\nFTEST(d, double, \"%f\")\nFTEST(ld, long double, \"%Lf\")\n\ndouble ftab1[3] = { 1.2, 3.4, -5.6 };\n\n\nvoid float_test(void)\n{\n    float fa, fb;\n    double da, db;\n    int a;\n    unsigned int b;\n\n    printf(\"float_test:\\n\");\n    printf(\"sizeof(float) = %d\\n\", sizeof(float));\n    printf(\"sizeof(double) = %d\\n\", sizeof(double));\n    printf(\"sizeof(long double) = %d\\n\", sizeof(long double));\n    ftest();\n    dtest();\n    ldtest();\n    printf(\"%f %f %f\\n\", ftab1[0], ftab1[1], ftab1[2]);\n    printf(\"%f %f %f\\n\", 2.12, .5, 2.3e10);\n    //    printf(\"%f %f %f\\n\", 0x1234p12, 0x1e23.23p10, 0x12dp-10);\n    da = 123;\n    printf(\"da=%f\\n\", da);\n    fa = 123;\n    printf(\"fa=%f\\n\", fa);\n    a = 4000000000;\n    da = a;\n    printf(\"da = %f\\n\", da);\n    b = 4000000000;\n    db = b;\n    printf(\"db = %f\\n\", db);\n}\n\nint fib(int n)\n{\n    if (n <= 2)\n        return 1;\n    else\n        return fib(n-1) + fib(n-2);\n}\n\nvoid funcptr_test()\n{\n    void (*func)(int);\n    int a;\n    struct {\n        int dummy;\n        void (*func)(int);\n    } st1;\n\n    printf(\"funcptr:\\n\");\n    func = &num;\n    (*func)(12345);\n    func = num;\n    a = 1;\n    a = 1;\n    func(12345);\n    /* more complicated pointer computation */\n    st1.func = num;\n    st1.func(12346);\n    printf(\"sizeof1 = %d\\n\", sizeof(funcptr_test));\n    printf(\"sizeof2 = %d\\n\", sizeof funcptr_test);\n    printf(\"sizeof3 = %d\\n\", sizeof(&funcptr_test));\n    printf(\"sizeof4 = %d\\n\", sizeof &funcptr_test);\n}\n\nvoid lloptest(long long a, long long b)\n{\n    unsigned long long ua, ub;\n\n    ua = a;\n    ub = b;\n    /* arith */\n    printf(\"arith: %Ld %Ld %Ld\\n\",\n           a + b,\n           a - b,\n           a * b);\n    \n    if (b != 0) {\n        printf(\"arith1: %Ld %Ld\\n\",\n           a / b,\n           a % b);\n    }\n\n    /* binary */\n    printf(\"bin: %Ld %Ld %Ld\\n\",\n           a & b,\n           a | b,\n           a ^ b);\n\n    /* tests */\n    printf(\"test: %d %d %d %d %d %d\\n\",\n           a == b,\n           a != b,\n           a < b,\n           a > b,\n           a >= b,\n           a <= b);\n    \n    printf(\"utest: %d %d %d %d %d %d\\n\",\n           ua == ub,\n           ua != ub,\n           ua < ub,\n           ua > ub,\n           ua >= ub,\n           ua <= ub);\n\n    /* arith2 */\n    a++;\n    b++;\n    printf(\"arith2: %Ld %Ld\\n\", a, b);\n    printf(\"arith2: %Ld %Ld\\n\", a++, b++);\n    printf(\"arith2: %Ld %Ld\\n\", --a, --b);\n    printf(\"arith2: %Ld %Ld\\n\", a, b);\n    b = ub = 0;\n    printf(\"not: %d %d %d %d\\n\", !a, !ua, !b, !ub);\n}\n\nvoid llshift(long long a, int b)\n{\n    printf(\"shift: %Ld %Ld %Ld\\n\",\n           (unsigned long long)a >> b,\n           a >> b,\n           a << b);\n    printf(\"shiftc: %Ld %Ld %Ld\\n\",\n           (unsigned long long)a >> 3,\n           a >> 3,\n           a << 3);\n    printf(\"shiftc: %Ld %Ld %Ld\\n\",\n           (unsigned long long)a >> 35,\n           a >> 35,\n           a << 35);\n}\n\nvoid llfloat(void)\n{\n    float fa;\n    double da;\n    long double lda;\n    long long la, lb, lc;\n    unsigned long long ula, ulb, ulc;\n    la = 0x12345678;\n    ula = 0x72345678;\n    la = (la << 20) | 0x12345;\n    ula = ula << 33;\n    printf(\"la=%Ld ula=%Lu\\n\", la, ula);\n\n    fa = la;\n    da = la;\n    lda = la;\n    printf(\"lltof: %f %f %Lf\\n\", fa, da, lda);\n\n    la = fa;\n    lb = da;\n    lc = lda;\n    printf(\"ftoll: %Ld %Ld %Ld\\n\", la, lb, lc);\n\n    fa = ula;\n    da = ula;\n    lda = ula;\n    printf(\"ulltof: %f %f %Lf\\n\", fa, da, lda);\n\n    ula = fa;\n    ulb = da;\n    ulc = lda;\n    printf(\"ftoull: %Lu %Lu %Lu\\n\", ula, ulb, ulc);\n}\n\nlong long llfunc1(int a)\n{\n    return a * 2;\n}\n\nstruct S {\n    int id; \n    char item;\n};\n\nlong long int value(struct S *v)\n{\n    return ((long long int)v->item);\n}\n\nvoid longlong_test(void)\n{\n    long long a, b, c;\n    int ia;\n    unsigned int ua;\n    printf(\"longlong_test:\\n\");\n    printf(\"sizeof(long long) = %d\\n\", sizeof(long long));\n    ia = -1;\n    ua = -2;\n    a = ia;\n    b = ua;\n    printf(\"%Ld %Ld\\n\", a, b);\n    printf(\"%Ld %Ld %Ld %Lx\\n\", \n           (long long)1, \n           (long long)-2,\n           1LL,\n           0x1234567812345679);\n    a = llfunc1(-3);\n    printf(\"%Ld\\n\", a);\n\n    lloptest(1000, 23);\n    lloptest(0xff, 0x1234);\n    b = 0x72345678 << 10;\n    lloptest(-3, b);\n    llshift(0x123, 5);\n    llshift(-23, 5);\n    b = 0x72345678LL << 10;\n    llshift(b, 47);\n\n    llfloat();\n#if 1\n    b = 0x12345678;\n    a = -1;\n    c = a + b;\n    printf(\"%Lx\\n\", c);\n#endif\n\n    /* long long reg spill test */\n    {\n          struct S a;\n\n          a.item = 3;\n          printf(\"%lld\\n\", value(&a));\n    }\n    lloptest(0x80000000, 0);\n\n    /* another long long spill test */\n    {\n        long long *p, v;\n        v = 1;\n        p = &v;\n        p[0]++;\n        printf(\"%lld\\n\", *p);\n    }\n\n    a = 68719476720LL;\n    b = 4294967295LL;\n    printf(\"%d %d %d %d\\n\", a > b, a < b, a >= b, a <= b);\n\n    printf(\"%Ld\\n\", 0x123456789LLU);\n}\n\nvoid manyarg_test(void)\n{\n    long double ld = 1234567891234LL;\n    printf(\"manyarg_test:\\n\");\n    printf(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f\\n\",\n           1, 2, 3, 4, 5, 6, 7, 8,\n           0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0);\n    printf(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n           \"%Ld %Ld %f %f\\n\",\n           1, 2, 3, 4, 5, 6, 7, 8,\n           0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n           1234567891234LL, 987654321986LL,\n           42.0, 43.0);\n    printf(\"%Lf %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n           \"%Ld %Ld %f %f\\n\",\n           ld, 1, 2, 3, 4, 5, 6, 7, 8,\n           0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n           1234567891234LL, 987654321986LL,\n           42.0, 43.0);\n    /* XXX: known bug of x86-64 */\n#ifndef __x86_64__\n    printf(\"%d %d %d %d %d %d %d %d %Lf\\n\",\n           1, 2, 3, 4, 5, 6, 7, 8, ld);\n    printf(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n           \"%Ld %Ld %f %f %Lf\\n\",\n           1, 2, 3, 4, 5, 6, 7, 8,\n           0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n           1234567891234LL, 987654321986LL,\n           42.0, 43.0, ld);\n    printf(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n           \"%Lf %Ld %Ld %f %f %Lf\\n\",\n           1, 2, 3, 4, 5, 6, 7, 8,\n           0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n           ld, 1234567891234LL, 987654321986LL,\n           42.0, 43.0, ld);\n#endif\n}\n\nvoid vprintf1(const char *fmt, ...)\n{\n    va_list ap, aq;\n    const char *p;\n    int c, i;\n    double d;\n    long long ll;\n    long double ld;\n\n    va_start(aq, fmt);\n    va_copy(ap, aq);\n    \n    p = fmt;\n    for(;;) {\n        c = *p;\n        if (c == '\\0')\n            break;\n        p++;\n        if (c == '%') {\n            c = *p;\n            switch(c) {\n            case '\\0':\n                goto the_end;\n            case 'd':\n                i = va_arg(ap, int);\n                printf(\"%d\", i);\n                break;\n            case 'f':\n                d = va_arg(ap, double);\n                printf(\"%f\", d);\n                break;\n            case 'l':\n                ll = va_arg(ap, long long);\n                printf(\"%Ld\", ll);\n                break;\n            case 'F':\n                ld = va_arg(ap, long double);\n                printf(\"%Lf\", ld);\n                break;\n            }\n            p++;\n        } else {\n            putchar(c);\n        }\n    }\n the_end:\n    va_end(aq);\n    va_end(ap);\n}\n\nstruct myspace {\n    short int profile;\n};\n\nvoid stdarg_for_struct(struct myspace bob, ...)\n{\n    struct myspace george, bill;\n    va_list ap;\n    short int validate;\n\n    va_start(ap, bob);\n    bill     = va_arg(ap, struct myspace);\n    george   = va_arg(ap, struct myspace);\n    validate = va_arg(ap, int);\n    printf(\"stdarg_for_struct: %d %d %d %d\\n\",\n           bob.profile, bill.profile, george.profile, validate);\n    va_end(ap);\n}\n\nvoid stdarg_test(void)\n{\n    long double ld = 1234567891234LL;\n    struct myspace bob;\n\n    vprintf1(\"%d %d %d\\n\", 1, 2, 3);\n    vprintf1(\"%f %d %f\\n\", 1.0, 2, 3.0);\n    vprintf1(\"%l %l %d %f\\n\", 1234567891234LL, 987654321986LL, 3, 1234.0);\n    vprintf1(\"%F %F %F\\n\", 1.2L, 2.3L, 3.4L);\n#ifdef __x86_64__\n    /* a bug of x86's TCC */\n    vprintf1(\"%d %f %l %F %d %f %l %F\\n\",\n             1, 1.2, 3L, 4.5L, 6, 7.8, 9L, 0.1L);\n#endif\n    vprintf1(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f\\n\",\n             1, 2, 3, 4, 5, 6, 7, 8,\n             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8);\n    vprintf1(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f\\n\",\n             1, 2, 3, 4, 5, 6, 7, 8,\n             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0);\n    vprintf1(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n             \"%l %l %f %f\\n\",\n             1, 2, 3, 4, 5, 6, 7, 8,\n             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n             1234567891234LL, 987654321986LL,\n             42.0, 43.0);\n    vprintf1(\"%F %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n             \"%l %l %f %f\\n\",\n             ld, 1, 2, 3, 4, 5, 6, 7, 8,\n             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n             1234567891234LL, 987654321986LL,\n             42.0, 43.0);\n    vprintf1(\"%d %d %d %d %d %d %d %d %F\\n\",\n             1, 2, 3, 4, 5, 6, 7, 8, ld);\n    vprintf1(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n             \"%l %l %f %f %F\\n\",\n             1, 2, 3, 4, 5, 6, 7, 8,\n             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n             1234567891234LL, 987654321986LL,\n             42.0, 43.0, ld);\n    vprintf1(\"%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f \"\n             \"%F %l %l %f %f %F\\n\",\n             1, 2, 3, 4, 5, 6, 7, 8,\n             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,\n             ld, 1234567891234LL, 987654321986LL,\n             42.0, 43.0, ld);\n\n    bob.profile = 42;\n    stdarg_for_struct(bob, bob, bob, bob.profile);\n}\n\nvoid whitespace_test(void)\n{\n    char *str;\n\n\f\u000b\r#if 1\n    pri\\\nntf(\"whitspace:\\n\");\f\u000b\r\n#endif\n    pf(\"N=%d\\n\", 2);\n\n#ifdef CORRECT_CR_HANDLING\n    pri\\\r\nntf(\"aaa=%d\\n\", 3);\n#endif\n\n    pri\\\n\\\nntf(\"min=%d\\n\", 4);\n\n#ifdef ACCEPT_CR_IN_STRINGS\n    printf(\"len1=%d\\n\", strlen(\"\n\"));\n#ifdef CORRECT_CR_HANDLING\n    str = \"\r\n\";\n    printf(\"len1=%d str[0]=%d\\n\", strlen(str), str[0]);\n#endif\n    printf(\"len1=%d\\n\", strlen(\"\ra\n\"));\n#endif /* ACCEPT_CR_IN_STRINGS */\n}\n\nint reltab[3] = { 1, 2, 3 };\n\nint *rel1 = &reltab[1];\nint *rel2 = &reltab[2];\n\nvoid relocation_test(void)\n{\n    printf(\"*rel1=%d\\n\", *rel1);\n    printf(\"*rel2=%d\\n\", *rel2);\n}\n\nvoid old_style_f(a,b,c)\n     int a, b;\n     double c;\n{\n    printf(\"a=%d b=%d b=%f\\n\", a, b, c);\n}\n\nvoid decl_func1(int cmpfn())\n{\n    printf(\"cmpfn=%lx\\n\", (long)cmpfn);\n}\n\nvoid decl_func2(cmpfn)\nint cmpfn();\n{\n    printf(\"cmpfn=%lx\\n\", (long)cmpfn);\n}\n\nvoid old_style_function(void)\n{\n    old_style_f((void *)1, 2, 3.0);\n    decl_func1(NULL);\n    decl_func2(NULL);\n}\n\nvoid alloca_test()\n{\n#if defined __i386__ || defined __x86_64__\n    char *p = alloca(16);\n    strcpy(p,\"123456789012345\");\n    printf(\"alloca: p is %s\\n\", p);\n    char *demo = \"This is only a test.\\n\";\n    /* Test alloca embedded in a larger expression */\n    printf(\"alloca: %s\\n\", strcpy(alloca(strlen(demo)+1),demo) );\n#endif\n}\n\nvoid *bounds_checking_is_enabled()\n{\n    char ca[10], *cp = ca-1;\n    return (ca != cp + 1) ? cp : NULL;\n}\n\ntypedef int constant_negative_array_size_as_compile_time_assertion_idiom[(1 ? 2 : 0) - 1];\n\nvoid c99_vla_test(int size1, int size2)\n{\n#if defined __i386__ || defined __x86_64__\n    int size = size1 * size2;\n    int tab1[size][2], tab2[10][2];\n    void *tab1_ptr, *tab2_ptr, *bad_ptr;\n\n    /* \"size\" should have been 'captured' at tab1 declaration, \n        so modifying it should have no effect on VLA behaviour. */\n    size = size-1;\n    \n    printf(\"Test C99 VLA 1 (sizeof): \");\n    printf(\"%s\\n\", (sizeof tab1 == size1 * size2 * 2 * sizeof(int)) ? \"PASSED\" : \"FAILED\");\n    tab1_ptr = tab1;\n    tab2_ptr = tab2;\n    printf(\"Test C99 VLA 2 (ptrs substract): \");\n    printf(\"%s\\n\", (tab2 - tab1 == (tab2_ptr - tab1_ptr) / (sizeof(int) * 2)) ? \"PASSED\" : \"FAILED\");\n    printf(\"Test C99 VLA 3 (ptr add): \");\n    printf(\"%s\\n\", &tab1[5][1] == (tab1_ptr + (5 * 2 + 1) * sizeof(int)) ? \"PASSED\" : \"FAILED\");\n    printf(\"Test C99 VLA 4 (ptr access): \");\n    tab1[size1][1] = 42;\n    printf(\"%s\\n\", (*((int *) (tab1_ptr + (size1 * 2 + 1) * sizeof(int))) == 42) ? \"PASSED\" : \"FAILED\");\n\n    printf(\"Test C99 VLA 5 (bounds checking (might be disabled)): \");\n    if (bad_ptr = bounds_checking_is_enabled()) {\n        int *t1 = &tab1[size1 * size2 - 1][3];\n        int *t2 = &tab2[9][3];\n        printf(\"%s \", bad_ptr == t1 ? \"PASSED\" : \"FAILED\");\n        printf(\"%s \", bad_ptr == t2 ? \"PASSED\" : \"FAILED\");\n\n        char*c1 = 1 + sizeof(tab1) + (char*)tab1;\n        char*c2 = 1 + sizeof(tab2) + (char*)tab2;\n        printf(\"%s \", bad_ptr == c1 ? \"PASSED\" : \"FAILED\");\n        printf(\"%s \", bad_ptr == c2 ? \"PASSED\" : \"FAILED\");\n\n        int *i1 = tab1[-1];\n        int *i2 = tab2[-1];\n        printf(\"%s \", bad_ptr == i1 ? \"PASSED\" : \"FAILED\");\n        printf(\"%s \", bad_ptr == i2 ? \"PASSED\" : \"FAILED\");\n\n        int *x1 = tab1[size1 * size2 + 1];\n        int *x2 = tab2[10 + 1];\n        printf(\"%s \", bad_ptr == x1 ? \"PASSED\" : \"FAILED\");\n        printf(\"%s \", bad_ptr == x2 ? \"PASSED\" : \"FAILED\");\n    } else {\n        printf(\"PASSED PASSED PASSED PASSED PASSED PASSED PASSED PASSED \");\n    }\n    printf(\"\\n\");\n#endif\n}\n\ntypedef __SIZE_TYPE__ uintptr_t;\n\nvoid sizeof_test(void)\n{\n    int a;\n    int **ptr;\n\n    printf(\"sizeof(int) = %d\\n\", sizeof(int));\n    printf(\"sizeof(unsigned int) = %d\\n\", sizeof(unsigned int));\n    printf(\"sizeof(long) = %d\\n\", sizeof(long));\n    printf(\"sizeof(unsigned long) = %d\\n\", sizeof(unsigned long));\n    printf(\"sizeof(short) = %d\\n\", sizeof(short));\n    printf(\"sizeof(unsigned short) = %d\\n\", sizeof(unsigned short));\n    printf(\"sizeof(char) = %d\\n\", sizeof(char));\n    printf(\"sizeof(unsigned char) = %d\\n\", sizeof(unsigned char));\n    printf(\"sizeof(func) = %d\\n\", sizeof sizeof_test());\n    a = 1;\n    printf(\"sizeof(a++) = %d\\n\", sizeof a++);\n    printf(\"a=%d\\n\", a);\n    ptr = NULL;\n    printf(\"sizeof(**ptr) = %d\\n\", sizeof (**ptr));\n\n    /* The type of sizeof should be as large as a pointer, actually\n       it should be size_t.  */\n    printf(\"sizeof(sizeof(int) = %d\\n\", sizeof(sizeof(int)));\n    uintptr_t t = 1;\n    uintptr_t t2;\n    /* Effectively <<32, but defined also on 32bit machines.  */\n    t <<= 16;\n    t <<= 16;\n    t++;\n    /* This checks that sizeof really can be used to manipulate \n       uintptr_t objects, without truncation.  */\n    t2 = t & -sizeof(uintptr_t);\n    printf (\"%lu %lu\\n\", t, t2);\n\n    /* some alignof tests */\n    printf(\"__alignof__(int) = %d\\n\", __alignof__(int));\n    printf(\"__alignof__(unsigned int) = %d\\n\", __alignof__(unsigned int));\n    printf(\"__alignof__(short) = %d\\n\", __alignof__(short));\n    printf(\"__alignof__(unsigned short) = %d\\n\", __alignof__(unsigned short));\n    printf(\"__alignof__(char) = %d\\n\", __alignof__(char));\n    printf(\"__alignof__(unsigned char) = %d\\n\", __alignof__(unsigned char));\n    printf(\"__alignof__(func) = %d\\n\", __alignof__ sizeof_test());\n}\n\nvoid typeof_test(void)\n{\n    double a;\n    typeof(a) b;\n    typeof(float) c;\n\n    a = 1.5;\n    b = 2.5;\n    c = 3.5;\n    printf(\"a=%f b=%f c=%f\\n\", a, b, c);\n}\n\nvoid statement_expr_test(void)\n{\n    int a, i;\n\n    a = 0;\n    for(i=0;i<10;i++) {\n        a += 1 + \n            ( { int b, j; \n                b = 0; \n                for(j=0;j<5;j++) \n                    b += j; b; \n            } );\n    }\n    printf(\"a=%d\\n\", a);\n    \n}\n\nvoid local_label_test(void)\n{\n    int a;\n    goto l1;\n l2:\n    a = 1 + ({\n        __label__ l1, l2, l3, l4;\n        goto l1;\n    l4:\n        printf(\"aa1\\n\");\n        goto l3;\n    l2:\n        printf(\"aa3\\n\");\n        goto l4;\n    l1:\n        printf(\"aa2\\n\");\n        goto l2;\n    l3:;\n        1;\n    });\n    printf(\"a=%d\\n\", a);\n    return;\n l4:\n    printf(\"bb1\\n\");\n    goto l2;\n l1:\n    printf(\"bb2\\n\");\n    goto l4;\n}\n\n/* inline assembler test */\n#ifdef __i386__\n\n/* from linux kernel */\nstatic char * strncat1(char * dest,const char * src,size_t count)\n{\nint d0, d1, d2, d3;\n__asm__ __volatile__(\n\t\"repne\\n\\t\"\n\t\"scasb\\n\\t\"\n\t\"decl %1\\n\\t\"\n\t\"movl %8,%3\\n\"\n\t\"1:\\tdecl %3\\n\\t\"\n\t\"js 2f\\n\\t\"\n\t\"lodsb\\n\\t\"\n\t\"stosb\\n\\t\"\n\t\"testb %%al,%%al\\n\\t\"\n\t\"jne 1b\\n\"\n\t\"2:\\txorl %2,%2\\n\\t\"\n\t\"stosb\"\n\t: \"=&S\" (d0), \"=&D\" (d1), \"=&a\" (d2), \"=&c\" (d3)\n\t: \"0\" (src),\"1\" (dest),\"2\" (0),\"3\" (0xffffffff), \"g\" (count)\n\t: \"memory\");\nreturn dest;\n}\n\nstatic char * strncat2(char * dest,const char * src,size_t count)\n{\nint d0, d1, d2, d3;\n__asm__ __volatile__(\n\t\"repne scasb\\n\\t\" /* one-line repne prefix + string op */\n\t\"decl %1\\n\\t\"\n\t\"movl %8,%3\\n\"\n\t\"1:\\tdecl %3\\n\\t\"\n\t\"js 2f\\n\\t\"\n\t\"lodsb\\n\\t\"\n\t\"stosb\\n\\t\"\n\t\"testb %%al,%%al\\n\\t\"\n\t\"jne 1b\\n\"\n\t\"2:\\txorl %2,%2\\n\\t\"\n\t\"stosb\"\n\t: \"=&S\" (d0), \"=&D\" (d1), \"=&a\" (d2), \"=&c\" (d3)\n\t: \"0\" (src),\"1\" (dest),\"2\" (0),\"3\" (0xffffffff), \"g\" (count)\n\t: \"memory\");\nreturn dest;\n}\n\nstatic inline void * memcpy1(void * to, const void * from, size_t n)\n{\nint d0, d1, d2;\n__asm__ __volatile__(\n\t\"rep ; movsl\\n\\t\"\n\t\"testb $2,%b4\\n\\t\"\n\t\"je 1f\\n\\t\"\n\t\"movsw\\n\"\n\t\"1:\\ttestb $1,%b4\\n\\t\"\n\t\"je 2f\\n\\t\"\n\t\"movsb\\n\"\n\t\"2:\"\n\t: \"=&c\" (d0), \"=&D\" (d1), \"=&S\" (d2)\n\t:\"0\" (n/4), \"q\" (n),\"1\" ((long) to),\"2\" ((long) from)\n\t: \"memory\");\nreturn (to);\n}\n\nstatic inline void * memcpy2(void * to, const void * from, size_t n)\n{\nint d0, d1, d2;\n__asm__ __volatile__(\n\t\"rep movsl\\n\\t\"  /* one-line rep prefix + string op */\n\t\"testb $2,%b4\\n\\t\"\n\t\"je 1f\\n\\t\"\n\t\"movsw\\n\"\n\t\"1:\\ttestb $1,%b4\\n\\t\"\n\t\"je 2f\\n\\t\"\n\t\"movsb\\n\"\n\t\"2:\"\n\t: \"=&c\" (d0), \"=&D\" (d1), \"=&S\" (d2)\n\t:\"0\" (n/4), \"q\" (n),\"1\" ((long) to),\"2\" ((long) from)\n\t: \"memory\");\nreturn (to);\n}\n\nstatic __inline__ void sigaddset1(unsigned int *set, int _sig)\n{\n\t__asm__(\"btsl %1,%0\" : \"=m\"(*set) : \"Ir\"(_sig - 1) : \"cc\");\n}\n\nstatic __inline__ void sigdelset1(unsigned int *set, int _sig)\n{\n\tasm(\"btrl %1,%0\" : \"=m\"(*set) : \"Ir\"(_sig - 1) : \"cc\");\n}\n\nstatic __inline__ __const__ unsigned int swab32(unsigned int x)\n{\n\t__asm__(\"xchgb %b0,%h0\\n\\t\"\t/* swap lower bytes\t*/\n\t\t\"rorl $16,%0\\n\\t\"\t/* swap words\t\t*/\n\t\t\"xchgb %b0,%h0\"\t\t/* swap higher bytes\t*/\n\t\t:\"=q\" (x)\n\t\t: \"0\" (x));\n\treturn x;\n}\n\nstatic __inline__ unsigned long long mul64(unsigned int a, unsigned int b)\n{\n    unsigned long long res;\n    __asm__(\"mull %2\" : \"=A\" (res) : \"a\" (a), \"r\" (b));\n    return res;\n}\n\nstatic __inline__ unsigned long long inc64(unsigned long long a)\n{\n    unsigned long long res;\n    __asm__(\"addl $1, %%eax ; adcl $0, %%edx\" : \"=A\" (res) : \"A\" (a));\n    return res;\n}\n\nunsigned int set;\n\nvoid asm_test(void)\n{\n    char buf[128];\n    unsigned int val;\n\n    printf(\"inline asm:\\n\");\n    /* test the no operand case */\n    asm volatile (\"xorl %eax, %eax\");\n\n    memcpy1(buf, \"hello\", 6);\n    strncat1(buf, \" worldXXXXX\", 3);\n    printf(\"%s\\n\", buf);\n\n    memcpy2(buf, \"hello\", 6);\n    strncat2(buf, \" worldXXXXX\", 3);\n    printf(\"%s\\n\", buf);\n\n    /* 'A' constraint test */\n    printf(\"mul64=0x%Lx\\n\", mul64(0x12345678, 0xabcd1234));\n    printf(\"inc64=0x%Lx\\n\", inc64(0x12345678ffffffff));\n\n    set = 0xff;\n    sigdelset1(&set, 2);\n    sigaddset1(&set, 16);\n    /* NOTE: we test here if C labels are correctly restored after the\n       asm statement */\n    goto label1;\n label2:\n    __asm__(\"btsl %1,%0\" : \"=m\"(set) : \"Ir\"(20) : \"cc\");\n#ifdef __GNUC__ // works strange with GCC 4.3\n    set=0x1080fd;\n#endif\n    printf(\"set=0x%x\\n\", set);\n    val = 0x01020304;\n    printf(\"swab32(0x%08x) = 0x%0x\\n\", val, swab32(val));\n    return;\n label1:\n    goto label2;\n}\n\n#else\n\nvoid asm_test(void)\n{\n}\n\n#endif\n\n#define COMPAT_TYPE(type1, type2) \\\n{\\\n    printf(\"__builtin_types_compatible_p(%s, %s) = %d\\n\", #type1, #type2, \\\n           __builtin_types_compatible_p (type1, type2));\\\n}\n\nint constant_p_var;\n\nvoid builtin_test(void)\n{\n#if GCC_MAJOR >= 3\n    COMPAT_TYPE(int, int);\n    COMPAT_TYPE(int, unsigned int);\n    COMPAT_TYPE(int, char);\n    COMPAT_TYPE(int, const int);\n    COMPAT_TYPE(int, volatile int);\n    COMPAT_TYPE(int *, int *);\n    COMPAT_TYPE(int *, void *);\n    COMPAT_TYPE(int *, const int *);\n    COMPAT_TYPE(char *, unsigned char *);\n/* space is needed because tcc preprocessor introduces a space between each token */\n    COMPAT_TYPE(char * *, void *); \n#endif\n    printf(\"res = %d\\n\", __builtin_constant_p(1));\n    printf(\"res = %d\\n\", __builtin_constant_p(1 + 2));\n    printf(\"res = %d\\n\", __builtin_constant_p(&constant_p_var));\n    printf(\"res = %d\\n\", __builtin_constant_p(constant_p_var));\n}\n\n#ifndef _WIN32\nextern int __attribute__((weak)) weak_f1(void);\nextern int __attribute__((weak)) weak_f2(void);\nextern int                       weak_f3(void);\nextern int __attribute__((weak)) weak_v1;\nextern int __attribute__((weak)) weak_v2;\nextern int                       weak_v3;\n\nextern int                           (*weak_fpa)() __attribute__((weak));\nextern int __attribute__((weak))     (*weak_fpb)();\nextern     __attribute__((weak)) int (*weak_fpc)();\n\nextern int                     weak_asm_f1(void) asm(\"weak_asm_f1x\") __attribute((weak));\nextern int __attribute((weak)) weak_asm_f2(void) asm(\"weak_asm_f2x\")                    ;\nextern int __attribute((weak)) weak_asm_f3(void) asm(\"weak_asm_f3x\") __attribute((weak));\nextern int                     weak_asm_v1       asm(\"weak_asm_v1x\") __attribute((weak));\nextern int __attribute((weak)) weak_asm_v2       asm(\"weak_asm_v2x\")                    ;\nextern int __attribute((weak)) weak_asm_v3(void) asm(\"weak_asm_v3x\") __attribute((weak));\n\nstatic const size_t dummy = 0;\nextern __typeof(dummy) weak_dummy1 __attribute__((weak, alias(\"dummy\")));\nextern __typeof(dummy) __attribute__((weak, alias(\"dummy\"))) weak_dummy2;\nextern __attribute__((weak, alias(\"dummy\"))) __typeof(dummy) weak_dummy3;\n\nint some_lib_func(void);\nint dummy_impl_of_slf(void) { return 444; }\nint some_lib_func(void) __attribute__((weak, alias(\"dummy_impl_of_slf\")));\n\nint weak_toolate() __attribute__((weak));\nint weak_toolate() { return 0; }\n\nvoid __attribute__((weak)) weak_test(void)\n{\n\tprintf(\"weak_f1=%d\\n\", weak_f1 ? weak_f1() : 123);\n\tprintf(\"weak_f2=%d\\n\", weak_f2 ? weak_f2() : 123);\n\tprintf(\"weak_f3=%d\\n\", weak_f3 ? weak_f3() : 123);\n\tprintf(\"weak_v1=%d\\n\",&weak_v1 ? weak_v1   : 123);\n\tprintf(\"weak_v2=%d\\n\",&weak_v2 ? weak_v2   : 123);\n\tprintf(\"weak_v3=%d\\n\",&weak_v3 ? weak_v3   : 123);\n\n\tprintf(\"weak_fpa=%d\\n\",&weak_fpa ? weak_fpa() : 123);\n\tprintf(\"weak_fpb=%d\\n\",&weak_fpb ? weak_fpb() : 123);\n\tprintf(\"weak_fpc=%d\\n\",&weak_fpc ? weak_fpc() : 123);\n\t\n\tprintf(\"weak_asm_f1=%d\\n\", weak_asm_f1 != NULL);\n\tprintf(\"weak_asm_f2=%d\\n\", weak_asm_f2 != NULL);\n\tprintf(\"weak_asm_f3=%d\\n\", weak_asm_f3 != NULL);\n\tprintf(\"weak_asm_v1=%d\\n\",&weak_asm_v1 != NULL);\n\tprintf(\"weak_asm_v2=%d\\n\",&weak_asm_v2 != NULL);\n\tprintf(\"weak_asm_v3=%d\\n\",&weak_asm_v3 != NULL);\n}\n\nint __attribute__((weak)) weak_f2() { return 222; }\nint __attribute__((weak)) weak_f3() { return 333; }\nint __attribute__((weak)) weak_v2 = 222;\nint __attribute__((weak)) weak_v3 = 333;\n#endif\n\nvoid const_func(const int a)\n{\n}\n\nvoid const_warn_test(void)\n{\n    const_func(1);\n}\n\nstruct condstruct {\n  int i;\n};\n\nint getme (struct condstruct *s, int i)\n{\n  int i1 = (i == 0 ? 0 : s)->i;\n  int i2 = (i == 0 ? s : 0)->i;\n  int i3 = (i == 0 ? (void*)0 : s)->i;\n  int i4 = (i == 0 ? s : (void*)0)->i;\n  return i1 + i2 + i3 + i4;\n}\n\nstruct global_data\n{\n  int a[40];\n  int *b[40];\n};\n\nstruct global_data global_data;\n\nint global_data_getstuff (int *, int);\n\nvoid global_data_callit (int i)\n{\n  *global_data.b[i] = global_data_getstuff (global_data.b[i], 1);\n}\n\nint global_data_getstuff (int *p, int i)\n{\n  return *p + i;\n}\n\nvoid global_data_test (void)\n{\n  global_data.a[0] = 42;\n  global_data.b[0] = &global_data.a[0];\n  global_data_callit (0);\n  printf (\"%d\\n\", global_data.a[0]);\n}\n\nstruct cmpcmpS\n{\n  unsigned char fill : 3;\n  unsigned char b1 : 1;\n  unsigned char b2 : 1;\n  unsigned char fill2 : 3;\n};\n\nint glob1, glob2, glob3;\n\nvoid compare_comparisons (struct cmpcmpS *s)\n{\n  if (s->b1 != (glob1 == glob2)\n      || (s->b2 != (glob1 == glob3)))\n    printf (\"comparing comparisons broken\\n\");\n}\n\nvoid cmp_comparison_test(void)\n{\n  struct cmpcmpS s;\n  s.b1 = 1;\n  glob1 = 42; glob2 = 42;\n  s.b2 = 0;\n  glob3 = 43;\n  compare_comparisons (&s);\n}\n\nint fcompare (double a, double b, int code)\n{\n  switch (code) {\n    case 0: return a == b;\n    case 1: return a != b;\n    case 2: return a < b;\n    case 3: return a >= b;\n    case 4: return a > b;\n    case 5: return a <= b;\n  }\n}\n\nvoid math_cmp_test(void)\n{\n  double nan = 0.0/0.0;\n  double one = 1.0;\n  double two = 2.0;\n  int comp = 0;\n#define bug(a,b,op,iop,part) printf(\"Test broken: %s %s %s %s %d\\n\", #a, #b, #op, #iop, part)\n\n  /* This asserts that \"a op b\" is _not_ true, but \"a iop b\" is true.\n     And it does this in various ways so that all code generation paths\n     are checked (generating inverted tests, or non-inverted tests, or\n     producing a 0/1 value without jumps (that's done in the fcompare\n     function).  */\n#define FCMP(a,b,op,iop,code) \\\n  if (fcompare (a,b,code))    \\\n    bug (a,b,op,iop,1); \\\n  if (a op b) \\\n    bug (a,b,op,iop,2); \\\n  if (a iop b) \\\n    ; \\\n  else \\\n    bug (a,b,op,iop,3); \\\n  if ((a op b) || comp) \\\n    bug (a,b,op,iop,4); \\\n  if ((a iop b) || comp) \\\n    ; \\\n  else \\\n    bug (a,b,op,iop,5);\n\n  /* Equality tests.  */\n  FCMP(nan, nan, ==, !=, 0);\n  FCMP(one, two, ==, !=, 0);\n  FCMP(one, one, !=, ==, 1);\n  /* Non-equality is a bit special.  */\n  if (!fcompare (nan, nan, 1))\n    bug (nan, nan, !=, ==, 6);\n\n  /* Relational tests on numbers.  */\n  FCMP(two, one, <, >=, 2);\n  FCMP(one, two, >=, <, 3);\n  FCMP(one, two, >, <=, 4);\n  FCMP(two, one, <=, >, 5);\n\n  /* Relational tests on NaNs.  Note that the inverse op here is\n     always !=, there's no operator in C that is equivalent to !(a < b),\n     when NaNs are involved, same for the other relational ops.  */\n  FCMP(nan, nan, <, !=, 2);\n  FCMP(nan, nan, >=, !=, 3);\n  FCMP(nan, nan, >, !=, 4);\n  FCMP(nan, nan, <=, !=, 5);\n}\n\ndouble get100 () { return 100.0; }\n\nvoid callsave_test(void)\n{\n#if defined __i386__ || defined __x86_64__\n  int i, s; double *d; double t;\n  s = sizeof (double);\n  printf (\"callsavetest: %d\\n\", s);\n  d = alloca (sizeof(double));\n  d[0] = 10.0;\n  /* x86-64 had a bug were the next call to get100 would evict\n     the lvalue &d[0] as VT_LLOCAL, and the reload would be done\n     in int type, not pointer type.  When alloca returns a pointer\n     with the high 32 bit set (which is likely on x86-64) the access\n     generates a segfault.  */\n  i = d[0] > get100 ();\n  printf (\"%d\\n\", i);\n#endif\n}\n\n\nvoid bfa3(ptrdiff_t str_offset)\n{\n    printf(\"bfa3: %s\\n\", (char *)__builtin_frame_address(3) + str_offset);\n}\nvoid bfa2(ptrdiff_t str_offset)\n{\n    printf(\"bfa2: %s\\n\", (char *)__builtin_frame_address(2) + str_offset);\n    bfa3(str_offset);\n}\nvoid bfa1(ptrdiff_t str_offset)\n{\n    printf(\"bfa1: %s\\n\", (char *)__builtin_frame_address(1) + str_offset);\n#if defined(__arm__) && !defined(__GNUC__)\n    bfa2(str_offset);\n#endif\n}\n\nvoid builtin_frame_address_test(void)\n{\n    char str[] = \"__builtin_frame_address\";\n    char *fp0 = __builtin_frame_address(0);\n\n    printf(\"str: %s\\n\", str);\n    bfa1(str-fp0);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/00_assignment.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   int a;\n   a = 42;\n   printf(\"%d\\n\", a);\n\n   int b = 64;\n   printf(\"%d\\n\", b);\n\n   int c = 12, d = 34;\n   printf(\"%d, %d\\n\", c, d);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/00_assignment.expect",
    "content": "42\n64\n12, 34\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/01_comment.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   printf(\"Hello\\n\");\n   printf(\"Hello\\n\"); /* this is a comment */ printf(\"Hello\\n\");\n   printf(\"Hello\\n\");\n   // this is also a comment sayhello();\n   printf(\"Hello\\n\");\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/01_comment.expect",
    "content": "Hello\nHello\nHello\nHello\nHello\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/02_printf.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   printf(\"Hello world\\n\");\n\n   int Count;\n   for (Count = -5; Count <= 5; Count++)\n      printf(\"Count = %d\\n\", Count);\n\n   printf(\"String 'hello', 'there' is '%s', '%s'\\n\", \"hello\", \"there\");\n   printf(\"Character 'A' is '%c'\\n\", 65);\n   printf(\"Character 'a' is '%c'\\n\", 'a');\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/02_printf.expect",
    "content": "Hello world\nCount = -5\nCount = -4\nCount = -3\nCount = -2\nCount = -1\nCount = 0\nCount = 1\nCount = 2\nCount = 3\nCount = 4\nCount = 5\nString 'hello', 'there' is 'hello', 'there'\nCharacter 'A' is 'A'\nCharacter 'a' is 'a'\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/03_struct.c",
    "content": "#include <stdio.h>\n\nstruct fred\n{\n   int boris;\n   int natasha;\n};\n\nvoid main() \n{\n   struct fred bloggs;\n\n   bloggs.boris = 12;\n   bloggs.natasha = 34;\n\n   printf(\"%d\\n\", bloggs.boris);\n   printf(\"%d\\n\", bloggs.natasha);\n\n   struct fred jones[2];\n   jones[0].boris = 12;\n   jones[0].natasha = 34;\n   jones[1].boris = 56;\n   jones[1].natasha = 78;\n\n   printf(\"%d\\n\", jones[0].boris);\n   printf(\"%d\\n\", jones[0].natasha);\n   printf(\"%d\\n\", jones[1].boris);\n   printf(\"%d\\n\", jones[1].natasha);\n\n   return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/03_struct.expect",
    "content": "12\n34\n12\n34\n56\n78\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/04_for.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   int Count;\n\n   for (Count = 1; Count <= 10; Count++)\n   {\n      printf(\"%d\\n\", Count);\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/04_for.expect",
    "content": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/05_array.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   int Count;\n   int Array[10];\n\n   for (Count = 1; Count <= 10; Count++)\n   {\n      Array[Count-1] = Count * Count;\n   }\n\n   for (Count = 0; Count < 10; Count++)\n   {\n      printf(\"%d\\n\", Array[Count]);\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/05_array.expect",
    "content": "1\n4\n9\n16\n25\n36\n49\n64\n81\n100\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/06_case.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count;\n\n   for (Count = 0; Count < 4; Count++)\n   {\n      printf(\"%d\\n\", Count);\n      switch (Count)\n      {\n         case 1:\n            printf(\"%d\\n\", 1);\n            break;\n\n         case 2:\n            printf(\"%d\\n\", 2);\n            break;\n\n         default:\n            printf(\"%d\\n\", 0);\n            break;\n      }\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/06_case.expect",
    "content": "0\n0\n1\n1\n2\n2\n3\n0\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/07_function.c",
    "content": "#include <stdio.h>\n\nint myfunc(int x)\n{\n   return x * x;\n}\n\nvoid vfunc(int a)\n{\n   printf(\"a=%d\\n\", a);\n}\n\nvoid qfunc()\n{\n   printf(\"qfunc()\\n\");\n}\n\nint main()\n{\n   printf(\"%d\\n\", myfunc(3));\n   printf(\"%d\\n\", myfunc(4));\n\n   vfunc(1234);\n\n   qfunc();\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/07_function.expect",
    "content": "9\n16\na=1234\nqfunc()\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/08_while.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int p;\n   int t;\n\n   a = 1;\n   p = 0;\n   t = 0;\n\n   while (a < 100)\n   {\n      printf(\"%d\\n\", a);\n      t = a;\n      a = t + p;\n      p = t;\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/08_while.expect",
    "content": "1\n1\n2\n3\n5\n8\n13\n21\n34\n55\n89\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/09_do_while.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int p;\n   int t;\n\n   a = 1;\n   p = 0;\n   t = 0;\n\n   do\n   {\n      printf(\"%d\\n\", a);\n      t = a;\n      a = t + p;\n      p = t;\n   } while (a < 100);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/09_do_while.expect",
    "content": "1\n1\n2\n3\n5\n8\n13\n21\n34\n55\n89\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/10_pointer.c",
    "content": "#include <stdio.h>\n\nstruct ziggy\n{\n   int a;\n   int b;\n   int c;\n} bolshevic;\n\nint main()\n{\n   int a;\n   int *b;\n   int c;\n\n   a = 42;\n   b = &a;\n   printf(\"a = %d\\n\", *b);\n\n   bolshevic.a = 12;\n   bolshevic.b = 34;\n   bolshevic.c = 56;\n\n   printf(\"bolshevic.a = %d\\n\", bolshevic.a);\n   printf(\"bolshevic.b = %d\\n\", bolshevic.b);\n   printf(\"bolshevic.c = %d\\n\", bolshevic.c);\n\n   struct ziggy *tsar = &bolshevic;\n\n   printf(\"tsar->a = %d\\n\", tsar->a);\n   printf(\"tsar->b = %d\\n\", tsar->b);\n   printf(\"tsar->c = %d\\n\", tsar->c);\n\n   b = &(bolshevic.b);\n   printf(\"bolshevic.b = %d\\n\", *b);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/10_pointer.expect",
    "content": "a = 42\nbolshevic.a = 12\nbolshevic.b = 34\nbolshevic.c = 56\ntsar->a = 12\ntsar->b = 34\ntsar->c = 56\nbolshevic.b = 34\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/11_precedence.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int b;\n   int c;\n   int d;\n   int e;\n   int f;\n   int x;\n   int y;\n\n   a = 12;\n   b = 34;\n   c = 56;\n   d = 78;\n   e = 0;\n   f = 1;\n\n   printf(\"%d\\n\", c + d);\n   printf(\"%d\\n\", (y = c + d));\n   printf(\"%d\\n\", e || e && f);\n   printf(\"%d\\n\", e || f && f);\n   printf(\"%d\\n\", e && e || f);\n   printf(\"%d\\n\", e && f || f);\n   printf(\"%d\\n\", a && f | f);\n   printf(\"%d\\n\", a | b ^ c & d);\n   printf(\"%d, %d\\n\", a == a, a == b);\n   printf(\"%d, %d\\n\", a != a, a != b);\n   printf(\"%d\\n\", a != b && c != d);\n   printf(\"%d\\n\", a + b * c / f);\n   printf(\"%d\\n\", a + b * c / f);\n   printf(\"%d\\n\", (4 << 4));\n   printf(\"%d\\n\", (64 >> 4));\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/11_precedence.expect",
    "content": "134\n134\n0\n1\n1\n1\n1\n46\n1, 0\n0, 1\n1\n1916\n1916\n64\n4\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/12_hashdefine.c",
    "content": "#include <stdio.h>\n\n#define FRED 12\n#define BLOGGS(x) (12*(x))\n\nint main()\n{\n   printf(\"%d\\n\", FRED);\n   printf(\"%d, %d, %d\\n\", BLOGGS(1), BLOGGS(2), BLOGGS(3));\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/12_hashdefine.expect",
    "content": "12\n12, 24, 36\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/13_integer_literals.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a = 24680;\n   int b = 01234567;\n   int c = 0x2468ac;\n   int d = 0x2468AC;\n   int e = 0b010101010101;\n\n   printf(\"%d\\n\", a);\n   printf(\"%d\\n\", b);\n   printf(\"%d\\n\", c);\n   printf(\"%d\\n\", d);\n   printf(\"%d\\n\", e);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/13_integer_literals.expect",
    "content": "24680\n342391\n2386092\n2386092\n1365\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/14_if.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a = 1;\n\n   if (a)\n      printf(\"a is true\\n\");\n   else\n      printf(\"a is false\\n\");\n\n   int b = 0;\n   if (b)\n      printf(\"b is true\\n\");\n   else\n      printf(\"b is false\\n\");\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/14_if.expect",
    "content": "a is true\nb is false\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/15_recursion.c",
    "content": "#include <stdio.h>\n\nint factorial(int i) \n{\n   if (i < 2)\n      return i;\n   else\n      return i * factorial(i - 1);\n}\n\nint main()\n{\n   int Count;\n\n   for (Count = 1; Count <= 10; Count++)\n      printf(\"%d\\n\", factorial(Count));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/15_recursion.expect",
    "content": "1\n2\n6\n24\n120\n720\n5040\n40320\n362880\n3628800\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/16_nesting.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int x, y, z;\n\n   for (x = 0; x < 2; x++)\n   {\n      for (y = 0; y < 3; y++)\n      {\n         for (z = 0; z < 3; z++)\n         {\n            printf(\"%d %d %d\\n\", x, y, z);\n         }\n      }\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/16_nesting.expect",
    "content": "0 0 0\n0 0 1\n0 0 2\n0 1 0\n0 1 1\n0 1 2\n0 2 0\n0 2 1\n0 2 2\n1 0 0\n1 0 1\n1 0 2\n1 1 0\n1 1 1\n1 1 2\n1 2 0\n1 2 1\n1 2 2\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/17_enum.c",
    "content": "#include <stdio.h>\n\nenum fred\n{\n   a,\n   b,\n   c,\n   d,\n   e = 54,\n   f = 73,\n   g,\n   h\n};\n\nint main()\n{\n   enum fred frod;\n\n   printf(\"%d %d %d %d %d %d %d %d\\n\", a, b, c, d, e, f, g, h);\n   /* printf(\"%d\\n\", frod); */\n   frod = 12;\n   printf(\"%d\\n\", frod);\n   frod = e;\n   printf(\"%d\\n\", frod);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/17_enum.expect",
    "content": "0 1 2 3 54 73 74 75\n12\n54\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/18_include.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   printf(\"including\\n\");\n#include \"18_include.h\"\n   printf(\"done\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/18_include.expect",
    "content": "including\nincluded\ndone\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/18_include.h",
    "content": "printf(\"included\\n\");\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/19_pointer_arithmetic.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int *b;\n   int *c;\n\n   a = 42;\n   b = &a;\n   c = NULL;\n\n   printf(\"%d\\n\", *b);\n\n   if (b == NULL)\n      printf(\"b is NULL\\n\");\n   else\n      printf(\"b is not NULL\\n\");\n\n   if (c == NULL)\n      printf(\"c is NULL\\n\");\n   else\n      printf(\"c is not NULL\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/19_pointer_arithmetic.expect",
    "content": "42\nb is not NULL\nc is NULL\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/20_pointer_comparison.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int b;\n   int *d;\n   int *e;\n   d = &a;\n   e = &b;\n   a = 12;\n   b = 34;\n   printf(\"%d\\n\", *d);\n   printf(\"%d\\n\", *e);\n   printf(\"%d\\n\", d == e);\n   printf(\"%d\\n\", d != e);\n   d = e;\n   printf(\"%d\\n\", d == e);\n   printf(\"%d\\n\", d != e);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/20_pointer_comparison.expect",
    "content": "12\n34\n0\n1\n1\n0\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/21_char_array.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int x = 'a';\n   char y = x;\n\n   char *a = \"hello\";\n\n   printf(\"%s\\n\", a);\n\n   int c;\n   c = *a;\n\n   char *b;\n   for (b = a; *b != 0; b++)\n      printf(\"%c: %d\\n\", *b, *b);\n\n   char destarray[10];\n   char *dest = &destarray[0];\n   char *src = a;\n\n   while (*src != 0)\n      *dest++ = *src++;\n\n   *dest = 0;\n\n   printf(\"copied string is %s\\n\", destarray);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/21_char_array.expect",
    "content": "hello\nh: 104\ne: 101\nl: 108\nl: 108\no: 111\ncopied string is hello\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/22_floating_point.c",
    "content": "#include <stdio.h>\n#include <math.h>\n\nint main()\n{\n   // variables\n   float a = 12.34 + 56.78;\n   printf(\"%f\\n\", a);\n\n   // infix operators\n   printf(\"%f\\n\", 12.34 + 56.78);\n   printf(\"%f\\n\", 12.34 - 56.78);\n   printf(\"%f\\n\", 12.34 * 56.78);\n   printf(\"%f\\n\", 12.34 / 56.78);\n\n   // comparison operators\n   printf(\"%d %d %d %d %d %d\\n\", 12.34 < 56.78, 12.34 <= 56.78, 12.34 == 56.78, 12.34 >= 56.78, 12.34 > 56.78, 12.34 != 56.78);\n   printf(\"%d %d %d %d %d %d\\n\", 12.34 < 12.34, 12.34 <= 12.34, 12.34 == 12.34, 12.34 >= 12.34, 12.34 > 12.34, 12.34 != 12.34);\n   printf(\"%d %d %d %d %d %d\\n\", 56.78 < 12.34, 56.78 <= 12.34, 56.78 == 12.34, 56.78 >= 12.34, 56.78 > 12.34, 56.78 != 12.34);\n\n   // assignment operators\n   a = 12.34;\n   a += 56.78;\n   printf(\"%f\\n\", a);\n\n   a = 12.34;\n   a -= 56.78;\n   printf(\"%f\\n\", a);\n\n   a = 12.34;\n   a *= 56.78;\n   printf(\"%f\\n\", a);\n\n   a = 12.34;\n   a /= 56.78;\n   printf(\"%f\\n\", a);\n\n   // prefix operators\n   printf(\"%f\\n\", +12.34);\n   printf(\"%f\\n\", -12.34);\n\n   // type coercion\n   a = 2;\n   printf(\"%f\\n\", a);\n   printf(\"%f\\n\", sin(2));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/22_floating_point.expect",
    "content": "69.120003\n69.120000\n-44.440000\n700.665200\n0.217330\n1 1 0 0 0 1\n0 1 1 1 0 0\n0 0 0 1 1 1\n69.120003\n-44.439999\n700.665222\n0.217330\n12.340000\n-12.340000\n2.000000\n0.909297\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/23_type_coercion.c",
    "content": "#include <stdio.h>\n\nvoid charfunc(char a)\n{\n   printf(\"char: %c\\n\", a);\n}\n\nvoid intfunc(int a)\n{\n   printf(\"int: %d\\n\", a);\n}\n\nvoid floatfunc(float a)\n{\n   printf(\"float: %f\\n\", a);\n}\n\nint main()\n{\n   charfunc('a');\n   charfunc(98);\n   charfunc(99.0);\n\n   intfunc('a');\n   intfunc(98);\n   intfunc(99.0);\n\n   floatfunc('a');\n   floatfunc(98);\n   floatfunc(99.0);\n\n   /* printf(\"%c %d %f\\n\", 'a', 'b', 'c'); */\n   /* printf(\"%c %d %f\\n\", 97, 98, 99); */\n   /* printf(\"%c %d %f\\n\", 97.0, 98.0, 99.0); */\n\n   char b = 97;\n   char c = 97.0;\n\n   printf(\"%d %d\\n\", b, c);\n\n   int d = 'a';\n   int e = 97.0;\n\n   printf(\"%d %d\\n\", d, e);\n\n   float f = 'a';\n   float g = 97;\n\n   printf(\"%f %f\\n\", f, g);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/23_type_coercion.expect",
    "content": "char: a\nchar: b\nchar: c\nint: 97\nint: 98\nint: 99\nfloat: 97.000000\nfloat: 98.000000\nfloat: 99.000000\n97 97\n97 97\n97.000000 97.000000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/24_math_library.c",
    "content": "#include <stdio.h>\n#include <math.h>\n\nint main()\n{\n   printf(\"%f\\n\", sin(0.12));\n   printf(\"%f\\n\", cos(0.12));\n   printf(\"%f\\n\", tan(0.12));\n   printf(\"%f\\n\", asin(0.12));\n   printf(\"%f\\n\", acos(0.12));\n   printf(\"%f\\n\", atan(0.12));\n   printf(\"%f\\n\", sinh(0.12));\n   printf(\"%f\\n\", cosh(0.12));\n   printf(\"%f\\n\", tanh(0.12));\n   printf(\"%f\\n\", exp(0.12));\n   printf(\"%f\\n\", fabs(-0.12));\n   printf(\"%f\\n\", log(0.12));\n   printf(\"%f\\n\", log10(0.12));\n   printf(\"%f\\n\", pow(0.12, 0.12));\n   printf(\"%f\\n\", sqrt(0.12));\n   printf(\"%f\\n\", round(12.34));\n   printf(\"%f\\n\", ceil(12.34));\n   printf(\"%f\\n\", floor(12.34));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/24_math_library.expect",
    "content": "0.119712\n0.992809\n0.120579\n0.120290\n1.450506\n0.119429\n0.120288\n1.007209\n0.119427\n1.127497\n0.120000\n-2.120264\n-0.920819\n0.775357\n0.346410\n12.000000\n13.000000\n12.000000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/25_quicksort.c",
    "content": "#include <stdio.h>\n\nint array[16];\n\n//Swap integer values by array indexes\nvoid swap(int a, int b)\n{\n   int tmp  = array[a];\n   array[a] = array[b];\n   array[b] = tmp;\n}\n\n//Partition the array into two halves and return the\n//index about which the array is partitioned\nint partition(int left, int right)\n{\n   int pivotIndex = left;\n   int pivotValue = array[pivotIndex];\n   int index = left;\n   int i;\n\n   swap(pivotIndex, right);\n   for(i = left; i < right; i++)\n   {\n      if(array[i] < pivotValue)\n      {\n         swap(i, index);\n         index += 1;\n      }\n   }\n   swap(right, index);\n\n   return index;\n}\n\n//Quicksort the array\nvoid quicksort(int left, int right)\n{\n   if(left >= right)\n      return;\n\n   int index = partition(left, right);\n   quicksort(left, index - 1);\n   quicksort(index + 1, right);\n}\n\nint main()\n{\n   int i;\n\n   array[0] = 62;\n   array[1] = 83;\n   array[2] = 4;\n   array[3] = 89;\n   array[4] = 36;\n   array[5] = 21;\n   array[6] = 74;\n   array[7] = 37;\n   array[8] = 65;\n   array[9] = 33;\n   array[10] = 96;\n   array[11] = 38;\n   array[12] = 53;\n   array[13] = 16;\n   array[14] = 74;\n   array[15] = 55;\n\n   for (i = 0; i < 16; i++)\n      printf(\"%d \", array[i]);\n\n   printf(\"\\n\");\n\n   quicksort(0, 15);\n\n   for (i = 0; i < 16; i++)\n      printf(\"%d \", array[i]);\n\n   printf(\"\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/25_quicksort.expect",
    "content": "62 83 4 89 36 21 74 37 65 33 96 38 53 16 74 55 \n4 16 21 33 36 37 38 53 55 62 65 74 74 83 89 96 \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/26_character_constants.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   printf(\"%d\\n\", '\\1');\n   printf(\"%d\\n\", '\\10');\n   printf(\"%d\\n\", '\\100');\n   printf(\"%d\\n\", '\\x01');\n   printf(\"%d\\n\", '\\x0e');\n   printf(\"%d\\n\", '\\x10');\n   printf(\"%d\\n\", '\\x40');\n   printf(\"test \\x40\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/26_character_constants.expect",
    "content": "1\n8\n64\n1\n14\n16\n64\ntest @\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/27_sizeof.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   char a;\n   int b;\n   double c;\n\n   printf(\"%d\\n\", sizeof(a));\n   printf(\"%d\\n\", sizeof(b));\n   printf(\"%d\\n\", sizeof(c));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/27_sizeof.expect",
    "content": "1\n4\n8\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/28_strings.c",
    "content": "#include <stdio.h>\n#include <string.h>\n#include <strings.h>\n\nint main()\n{\n   char a[10];\n\n   strcpy(a, \"hello\");\n   printf(\"%s\\n\", a);\n\n   strncpy(a, \"gosh\", 2);\n   printf(\"%s\\n\", a);\n\n   printf(\"%d\\n\", strcmp(a, \"apple\") > 0);\n   printf(\"%d\\n\", strcmp(a, \"goere\") > 0);\n   printf(\"%d\\n\", strcmp(a, \"zebra\") < 0);\n\n   printf(\"%d\\n\", strlen(a));\n\n   strcat(a, \"!\");\n   printf(\"%s\\n\", a);\n\n   printf(\"%d\\n\", strncmp(a, \"apple\", 2) > 0);\n   printf(\"%d\\n\", strncmp(a, \"goere\", 2) == 0);\n   printf(\"%d\\n\", strncmp(a, \"goerg\", 2) == 0);\n   printf(\"%d\\n\", strncmp(a, \"zebra\", 2) < 0);\n\n   printf(\"%s\\n\", index(a, 'o'));\n   printf(\"%s\\n\", rindex(a, 'l'));\n   printf(\"%d\\n\", rindex(a, 'x') == NULL);\n\n   memset(&a[1], 'r', 4);\n   printf(\"%s\\n\", a);\n\n   memcpy(&a[2], a, 2);\n   printf(\"%s\\n\", a);\n\n   printf(\"%d\\n\", memcmp(a, \"apple\", 4) > 0);\n   printf(\"%d\\n\", memcmp(a, \"grgr\", 4) == 0);\n   printf(\"%d\\n\", memcmp(a, \"zebra\", 4) < 0);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/28_strings.expect",
    "content": "hello\ngollo\n1\n1\n1\n5\ngollo!\n1\n1\n1\n1\nollo!\nlo!\n1\ngrrrr!\ngrgrr!\n1\n1\n1\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/29_array_address.c",
    "content": "#include <stdio.h>\n#include <string.h>\n\nint main()\n{\n   char a[10];\n   strcpy(a, \"abcdef\");\n   printf(\"%s\\n\", &a[1]);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/29_array_address.expect",
    "content": "bcdef\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/30_hanoi.c",
    "content": "/* example from http://barnyard.syr.edu/quickies/hanoi.c */\n\n/* hanoi.c: solves the tower of hanoi problem. (Programming exercise.) */\n/* By Terry R. McConnell (12/2/97) */\n/* Compile: cc -o hanoi hanoi.c */\n\n/* This program does no error checking. But then, if it's right, \n   it's right ... right ? */\n\n\n/* The original towers of hanoi problem seems to have been originally posed\n   by one M. Claus in 1883. There is a popular legend that goes along with\n   it that has been often repeated and paraphrased. It goes something like this:\n   In the great temple at Benares there are 3 golden spikes. On one of them,\n   God placed 64 disks increasing in size from bottom to top, at the beginning\n   of time. Since then, and to this day, the priest on duty constantly transfers\n   disks, one at a time, in such a way that no larger disk is ever put on top\n   of a smaller one. When the disks have been transferred entirely to another\n   spike the Universe will come to an end in a large thunderclap.\n\n   This paraphrases the original legend due to DeParville, La Nature, Paris 1884,\n   Part I, 285-286. For this and further information see: Mathematical \n   Recreations & Essays, W.W. Rouse Ball, MacMillan, NewYork, 11th Ed. 1967,\n   303-305.\n *\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#define TRUE 1\n#define FALSE 0\n\n/* This is the number of \"disks\" on tower A initially. Taken to be 64 in the\n * legend. The number of moves required, in general, is 2^N - 1. For N = 64,\n * this is 18,446,744,073,709,551,615 */\n#define N 4\n\n/* These are the three towers. For example if the state of A is 0,1,3,4, that\n * means that there are three discs on A of sizes 1, 3, and 4. (Think of right\n * as being the \"down\" direction.) */\nint A[N], B[N], C[N]; \n\nvoid Hanoi(int,int*,int*,int*);\n\n/* Print the current configuration of A, B, and C to the screen */\nvoid PrintAll()\n{\n   int i;\n\n   printf(\"A: \");\n   for(i=0;i<N;i++)printf(\" %d \",A[i]);\n   printf(\"\\n\");\n\n   printf(\"B: \");\n   for(i=0;i<N;i++)printf(\" %d \",B[i]);\n   printf(\"\\n\");\n\n   printf(\"C: \");\n   for(i=0;i<N;i++)printf(\" %d \",C[i]);\n   printf(\"\\n\");\n   printf(\"------------------------------------------\\n\");\n   return;\n}\n\n/* Move the leftmost nonzero element of source to dest, leave behind 0. */\n/* Returns the value moved (not used.) */\nint Move(int *source, int *dest)\n{\n   int i,j;\n\n   while (i<N && (source[i])==0) i++;\n   while (j<N && (dest[j])==0) j++;\n\n   dest[j-1] = source[i];\n   source[i] = 0;\n   PrintAll();       /* Print configuration after each move. */\n   return dest[j-1];\n}\n\n\n/* Moves first n nonzero numbers from source to dest using the rules of Hanoi.\n   Calls itself recursively.\n   */\nvoid Hanoi(int n,int *source, int *dest, int *spare)\n{\n   int i;\n   if(n==1){\n      Move(source,dest);\n      return;\n   }\n\n   Hanoi(n-1,source,spare,dest);\n   Move(source,dest);\n   Hanoi(n-1,spare,dest,source);\t\n   return;\n}\n\nint main()\n{\n   int i;\n\n   /* initialize the towers */\n   for(i=0;i<N;i++)A[i]=i+1;\n   for(i=0;i<N;i++)B[i]=0;\n   for(i=0;i<N;i++)C[i]=0;\n\n   printf(\"Solution of Tower of Hanoi Problem with %d Disks\\n\\n\",N);\n\n   /* Print the starting state */\n   printf(\"Starting state:\\n\");\n   PrintAll();\n   printf(\"\\n\\nSubsequent states:\\n\\n\");\n\n   /* Do it! Use A = Source, B = Destination, C = Spare */\n   Hanoi(N,A,B,C);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/30_hanoi.expect",
    "content": "Solution of Tower of Hanoi Problem with 4 Disks\n\nStarting state:\nA:  1  2  3  4 \nB:  0  0  0  0 \nC:  0  0  0  0 \n------------------------------------------\n\n\nSubsequent states:\n\nA:  0  2  3  4 \nB:  0  0  0  0 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  3  4 \nB:  0  0  0  2 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  3  4 \nB:  0  0  1  2 \nC:  0  0  0  0 \n------------------------------------------\nA:  0  0  0  4 \nB:  0  0  1  2 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  4 \nB:  0  0  0  2 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  4 \nB:  0  0  0  0 \nC:  0  0  2  3 \n------------------------------------------\nA:  0  0  0  4 \nB:  0  0  0  0 \nC:  0  1  2  3 \n------------------------------------------\nA:  0  0  0  0 \nB:  0  0  0  4 \nC:  0  1  2  3 \n------------------------------------------\nA:  0  0  0  0 \nB:  0  0  1  4 \nC:  0  0  2  3 \n------------------------------------------\nA:  0  0  0  2 \nB:  0  0  1  4 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  2 \nB:  0  0  0  4 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  2 \nB:  0  0  3  4 \nC:  0  0  0  0 \n------------------------------------------\nA:  0  0  0  2 \nB:  0  0  3  4 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  0  0 \nB:  0  2  3  4 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  0  0 \nB:  1  2  3  4 \nC:  0  0  0  0 \n------------------------------------------\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/31_args.c",
    "content": "#include <stdio.h>\n\nint main(int argc, char **argv)\n{\n   int Count;\n\n   printf(\"hello world %d\\n\", argc);\n   for (Count = 0; Count < argc; Count++)\n      printf(\"arg %d: %s\\n\", Count, argv[Count]);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/31_args.expect",
    "content": "hello world 6\narg 0: 31_args.c\narg 1: -\narg 2: arg1\narg 3: arg2\narg 4: arg3\narg 5: arg4\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/32_led.c",
    "content": "/* example from http://barnyard.syr.edu/quickies/led.c */\n\n/* led.c: print out number as if on 7 line led display. I.e., write integer\n   given on command line like this:  \n      _   _       _  \n   |  _|  _| |_| |_  \n   | |_   _|   |  _| etc.\n\n   We assume the terminal behaves like a classical teletype. So the top\n   lines of all digits have to be printed first, then the middle lines of\n   all digits, etc.\n\n   By Terry R. McConnell\n\ncompile: cc -o led led.c\n\nIf you just want to link in the subroutine print_led that does all the\nwork, compile with -DNO_MAIN, and declare the following in any source file\nthat uses the call:\n\nextern void print_led(unsigned long x, char *buf);\n\nBug: you cannot call repeatedly to print more than one number to a line.\nThat would require curses or some other terminal API that allows moving the\ncursor to a previous line.\n\n*/\n\n\n\n#include <stdlib.h>\n#include <stdio.h>\n\n#define MAX_DIGITS 32\n#define NO_MAIN\n\n\n/* Print the top line of the digit d into buffer. \n   Does not null terminate buffer. */\n\nvoid topline(int d, char *p){\n\n   *p++ = ' ';\n   switch(d){\n\n      /* all these have _ on top line */\n\n      case 0:\n      case 2:\n      case 3:\n      case 5:\n      case 7:\n      case 8:\n      case 9:\n         *p++ = '_';\n         break;\n      default:\n         *p++=' ';\n\n   }\n   *p++=' ';\n}\n\n/* Print the middle line of the digit d into the buffer. \n   Does not null terminate. */\n\nvoid midline(int d, char *p){\n\n   switch(d){\n\n      /* those that have leading | on middle line */\n\n      case 0:\n      case 4:\n      case 5:\n      case 6:\n      case 8:\n      case 9:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\t\n   }\n   switch(d){\n\n      /* those that have _ on middle line */\n\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 8:\n      case 9:\n         *p++='_';\n         break;\n      default:\n         *p++=' ';\n\n   }\n   switch(d){\n\n      /* those that have closing | on middle line */\n\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 7:\n      case 8:\n      case 9:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\n\n   }\n}\n\n/* Print the bottom line of the digit d. Does not null terminate. */\n\nvoid botline(int d, char *p){\n\n\n   switch(d){\n\n      /* those that have leading | on bottom line */\n\n      case 0:\n      case 2:\n      case 6:\n      case 8:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\t\n   }\n   switch(d){\n\n      /* those that have _ on bottom line */\n\n      case 0:\n      case 2:\n      case 3:\n      case 5:\n      case 6:\n      case 8:\n         *p++='_';\n         break;\n      default:\n         *p++=' ';\n\n   }\n   switch(d){\n\n      /* those that have closing | on bottom line */\n\n      case 0:\n      case 1:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n      case 8:\n      case 9:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\n\n   }\n}\n\n/* Write the led representation of integer to string buffer. */\n\nvoid print_led(unsigned long x, char *buf)\n{\n\n   int i=0,n;\n   static int d[MAX_DIGITS];\n\n\n   /* extract digits from x */\n\n   n = ( x == 0L ? 1 : 0 );  /* 0 is a digit, hence a special case */\n\n   while(x){\n      d[n++] = (int)(x%10L);\n      if(n >= MAX_DIGITS)break;\n      x = x/10L;\n   }\n\n   /* print top lines of all digits */\n\n   for(i=n-1;i>=0;i--){\n      topline(d[i],buf);\n      buf += 3;\n      *buf++=' ';\n   }\n   *buf++='\\n'; /* move teletype to next line */\n\n   /* print middle lines of all digits */\n\n   for(i=n-1;i>=0;i--){\n      midline(d[i],buf);\n      buf += 3;\n      *buf++=' ';\n   }\n   *buf++='\\n';\n\n   /* print bottom lines of all digits */\n\n   for(i=n-1;i>=0;i--){\n      botline(d[i],buf);\n      buf += 3;\n      *buf++=' ';\n   }\n   *buf++='\\n';\n   *buf='\\0';\n}\n\nint main()\n{\n   char buf[5*MAX_DIGITS];\n   print_led(1234567, buf);\n   printf(\"%s\\n\",buf);\n\n   return 0;\n}\n\n#ifndef NO_MAIN\nint main(int argc, char **argv)\n{\n\n   int i=0,n;\n   long x;\n   static int d[MAX_DIGITS];\n   char buf[5*MAX_DIGITS];\n\n   if(argc != 2){\n      fprintf(stderr,\"led: usage: led integer\\n\");\n      return 1;\n   }\n\n   /* fetch argument from command line */\n\n   x = atol(argv[1]);\n\n   /* sanity check */\n\n   if(x<0){\n      fprintf(stderr,\"led: %d must be non-negative\\n\",x);\n      return 1;\n   }\n\n   print_led(x,buf);\n   printf(\"%s\\n\",buf);\n\n   return 0;\n\n}\n#endif\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/32_led.expect",
    "content": "     _   _       _       _  \n  |  _|  _| |_| |_  |_    | \n  | |_   _|   |  _| |_|   | \n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/33_ternary_op.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count;\n\n   for (Count = 0; Count < 10; Count++)\n   {\n      printf(\"%d\\n\", (Count < 5) ? (Count*Count) : (Count * 3));\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/33_ternary_op.expect",
    "content": "0\n1\n4\n9\n16\n15\n18\n21\n24\n27\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/34_array_assignment.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a[4];\n\n   a[0] = 12;\n   a[1] = 23;\n   a[2] = 34;\n   a[3] = 45;\n\n   printf(\"%d %d %d %d\\n\", a[0], a[1], a[2], a[3]);\n\n   int b[4];\n\n   b = a;\n\n   printf(\"%d %d %d %d\\n\", b[0], b[1], b[2], b[3]);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/34_array_assignment.expect",
    "content": "12 23 34 45\n12 23 34 45\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/35_sizeof.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   char a;\n   short b;\n\n   printf(\"%d %d\\n\", sizeof(char), sizeof(a));\n   printf(\"%d %d\\n\", sizeof(short), sizeof(b));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/35_sizeof.expect",
    "content": "1 1\n2 2\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/36_array_initialisers.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count;\n\n   int Array[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753 };\n\n   for (Count = 0; Count < 10; Count++)\n      printf(\"%d: %d\\n\", Count, Array[Count]);\n\n   int Array2[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753, };\n\n   for (Count = 0; Count < 10; Count++)\n      printf(\"%d: %d\\n\", Count, Array2[Count]);\n\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/36_array_initialisers.expect",
    "content": "0: 12\n1: 34\n2: 56\n3: 78\n4: 90\n5: 123\n6: 456\n7: 789\n8: 8642\n9: 9753\n0: 12\n1: 34\n2: 56\n3: 78\n4: 90\n5: 123\n6: 456\n7: 789\n8: 8642\n9: 9753\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/37_sprintf.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   char Buf[100];\n   int Count;\n\n   for (Count = 1; Count <= 20; Count++)\n   {\n      sprintf(Buf, \"->%02d<-\\n\", Count);\n      printf(\"%s\", Buf);\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/37_sprintf.expect",
    "content": "->01<-\n->02<-\n->03<-\n->04<-\n->05<-\n->06<-\n->07<-\n->08<-\n->09<-\n->10<-\n->11<-\n->12<-\n->13<-\n->14<-\n->15<-\n->16<-\n->17<-\n->18<-\n->19<-\n->20<-\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/38_multiple_array_index.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a[4][4];\n   int b = 0;\n   int x;\n   int y;\n\n   for (x = 0; x < 4; x++)\n   {\n      for (y = 0; y < 4; y++)\n      {\n         b++;\n         a[x][y] = b;\n      }\n   }\n\n   for (x = 0; x < 4; x++)\n   {\n      printf(\"x=%d: \", x);\n      for (y = 0; y < 4; y++)\n      {\n         printf(\"%d \", a[x][y]);\n      }\n      printf(\"\\n\");\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/38_multiple_array_index.expect",
    "content": "x=0: 1 2 3 4\nx=1: 5 6 7 8\nx=2: 9 10 11 12\nx=3: 13 14 15 16 \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/39_typedef.c",
    "content": "#include <stdio.h>\n\ntypedef int MyInt;\n\nstruct FunStruct\n{\n   int i;\n   int j;\n};\n\ntypedef struct FunStruct MyFunStruct;\n\ntypedef MyFunStruct *MoreFunThanEver;\n\nint main()\n{\n   MyInt a = 1;\n   printf(\"%d\\n\", a);\n\n   MyFunStruct b;\n   b.i = 12;\n   b.j = 34;\n   printf(\"%d,%d\\n\", b.i, b.j);\n\n   MoreFunThanEver c = &b;\n   printf(\"%d,%d\\n\", c->i, c->j);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/39_typedef.expect",
    "content": "1\n12,34\n12,34\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/40_stdio.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   FILE *f = fopen(\"fred.txt\", \"w\");\n   fwrite(\"hello\\nhello\\n\", 1, 12, f);\n   fclose(f);\n\n   char freddy[7];\n   f = fopen(\"fred.txt\", \"r\");\n   if (fread(freddy, 1, 6, f) != 6)\n      printf(\"couldn't read fred.txt\\n\");\n\n   freddy[6] = '\\0';\n   fclose(f);\n\n   printf(\"%s\", freddy);\n\n   int InChar;\n   char ShowChar;\n   f = fopen(\"fred.txt\", \"r\");\n   while ( (InChar = fgetc(f)) != EOF)\n   {\n      ShowChar = InChar;\n      if (ShowChar < ' ')\n         ShowChar = '.';\n\n      printf(\"ch: %d '%c'\\n\", InChar, ShowChar);\n   }\n   fclose(f);\n\n   f = fopen(\"fred.txt\", \"r\");\n   while ( (InChar = getc(f)) != EOF)\n   {\n      ShowChar = InChar;\n      if (ShowChar < ' ')\n         ShowChar = '.';\n\n      printf(\"ch: %d '%c'\\n\", InChar, ShowChar);\n   }\n   fclose(f);\n\n   f = fopen(\"fred.txt\", \"r\");\n   while (fgets(freddy, sizeof(freddy), f) != NULL)\n      printf(\"x: %s\", freddy);\n\n   fclose(f);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/40_stdio.expect",
    "content": "hello\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nx: hello\nx: hello\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/41_hashif.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   printf(\"#include test\\n\");\n\n#if 1\n#if 0\n   printf(\"a\\n\");\n#else\n   printf(\"b\\n\");\n#endif\n#else\n#if 0\n   printf(\"c\\n\");\n#else\n   printf(\"d\\n\");\n#endif\n#endif\n\n#if 0\n#if 1\n   printf(\"e\\n\");\n#else\n   printf(\"f\\n\");\n#endif\n#else\n#if 1\n   printf(\"g\\n\");\n#else\n   printf(\"h\\n\");\n#endif\n#endif\n\n#define DEF\n\n#ifdef DEF\n#ifdef DEF\n   printf(\"i\\n\");\n#else\n   printf(\"j\\n\");\n#endif\n#else\n#ifdef DEF\n   printf(\"k\\n\");\n#else\n   printf(\"l\\n\");\n#endif\n#endif\n\n#ifndef DEF\n#ifndef DEF\n   printf(\"m\\n\");\n#else\n   printf(\"n\\n\");\n#endif\n#else\n#ifndef DEF\n   printf(\"o\\n\");\n#else\n   printf(\"p\\n\");\n#endif\n#endif\n\n#define ONE 1\n#define ZERO 0\n\n#if ONE\n#if ZERO\n   printf(\"q\\n\");\n#else\n   printf(\"r\\n\");\n#endif\n#else\n#if ZERO\n   printf(\"s\\n\");\n#else\n   printf(\"t\\n\");\n#endif\n#endif\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/41_hashif.expect",
    "content": "#include test\nb\ng\ni\np\nr\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/42_function_pointer.c",
    "content": "#include <stdio.h>\n\nint fred(int p)\n{\n   printf(\"yo %d\\n\", p);\n   return 42;\n}\n\nint (*f)(int) = &fred;\n\nint main()\n{\n   printf(\"%d\\n\", (*f)(24));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/42_function_pointer.expect",
    "content": "yo 24\n42\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/43_void_param.c",
    "content": "#include <stdio.h>\n\nvoid fred(void)\n{\n   printf(\"yo\\n\");\n}\n\nint main()\n{\n   fred();\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/43_void_param.expect",
    "content": "yo\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/44_scoped_declarations.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n\n   for (a = 0; a < 2; a++)\n   {\n      int b = a;\n   }\n\n   printf(\"it's all good\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/44_scoped_declarations.expect",
    "content": "it's all good\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/45_empty_for.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count = 0;\n\n   for (;;)\n   {\n      Count++;\n      printf(\"%d\\n\", Count);\n      if (Count >= 10)\n         break;\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/45_empty_for.expect",
    "content": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/46_grep.c",
    "content": "/*\n * The  information  in  this  document  is  subject  to  change\n * without  notice  and  should not be construed as a commitment\n * by Digital Equipment Corporation or by DECUS.\n *\n * Neither Digital Equipment Corporation, DECUS, nor the authors\n * assume any responsibility for the use or reliability of  this\n * document or the described software.\n *\n *      Copyright (C) 1980, DECUS\n *\n * General permission to copy or modify, but not for profit,  is\n * hereby  granted,  provided that the above copyright notice is\n * included and reference made to  the  fact  that  reproduction\n * privileges were granted by DECUS.\n */\n#include <stdio.h>\n\n/*\n * grep\n *\n * Runs on the Decus compiler or on vms, On vms, define as:\n *      grep :== \"$disk:[account]grep\"      (native)\n *      grep :== \"$disk:[account]grep grep\" (Decus)\n * See below for more information.\n */\n\n#if 0\nchar    *documentation[] = {\n   \"grep searches a file for a given pattern.  Execute by\",\n   \"   grep [flags] regular_expression file_list\\n\",\n   \"Flags are single characters preceeded by '-':\",\n   \"   -c      Only a count of matching lines is printed\",\n   \"   -f      Print file name for matching lines switch, see below\",\n   \"   -n      Each line is preceeded by its line number\",\n   \"   -v      Only print non-matching lines\\n\",\n   \"The file_list is a list of files (wildcards are acceptable on RSX modes).\",\n   \"\\nThe file name is normally printed if there is a file given.\",\n   \"The -f flag reverses this action (print name no file, not if more).\\n\",\n   0 };\n\nchar    *patdoc[] = {\n   \"The regular_expression defines the pattern to search for.  Upper- and\",\n   \"lower-case are always ignored.  Blank lines never match.  The expression\",\n   \"should be quoted to prevent file-name translation.\",\n   \"x      An ordinary character (not mentioned below) matches that character.\",\n   \"'\\\\'    The backslash quotes any character.  \\\"\\\\$\\\" matches a dollar-sign.\",\n   \"'^'    A circumflex at the beginning of an expression matches the\",\n   \"       beginning of a line.\",\n   \"'$'    A dollar-sign at the end of an expression matches the end of a line.\",\n   \"'.'    A period matches any character except \\\"new-line\\\".\",\n   \"':a'   A colon matches a class of characters described by the following\",\n   \"':d'     character.  \\\":a\\\" matches any alphabetic, \\\":d\\\" matches digits,\",\n   \"':n'     \\\":n\\\" matches alphanumerics, \\\": \\\" matches spaces, tabs, and\",\n   \"': '     other control characters, such as new-line.\",\n   \"'*'    An expression followed by an asterisk matches zero or more\",\n   \"       occurrances of that expression: \\\"fo*\\\" matches \\\"f\\\", \\\"fo\\\"\",\n   \"       \\\"foo\\\", etc.\",\n   \"'+'    An expression followed by a plus sign matches one or more\",\n   \"       occurrances of that expression: \\\"fo+\\\" matches \\\"fo\\\", etc.\",\n   \"'-'    An expression followed by a minus sign optionally matches\",\n   \"       the expression.\",\n   \"'[]'   A string enclosed in square brackets matches any character in\",\n   \"       that string, but no others.  If the first character in the\",\n   \"       string is a circumflex, the expression matches any character\",\n   \"       except \\\"new-line\\\" and the characters in the string.  For\",\n   \"       example, \\\"[xyz]\\\" matches \\\"xx\\\" and \\\"zyx\\\", while \\\"[^xyz]\\\"\",\n   \"       matches \\\"abc\\\" but not \\\"axb\\\".  A range of characters may be\",\n   \"       specified by two characters separated by \\\"-\\\".  Note that,\",\n   \"       [a-z] matches alphabetics, while [z-a] never matches.\",\n   \"The concatenation of regular expressions is a regular expression.\",\n   0};\n#endif\n\n#define LMAX    512\n#define PMAX    256\n\n#define CHAR    1\n#define BOL     2\n#define EOL     3\n#define ANY     4\n#define CLASS   5\n#define NCLASS  6\n#define STAR    7\n#define PLUS    8\n#define MINUS   9\n#define ALPHA   10\n#define DIGIT   11\n#define NALPHA  12\n#define PUNCT   13\n#define RANGE   14\n#define ENDPAT  15\n\nint cflag=0, fflag=0, nflag=0, vflag=0, nfile=0, debug=0;\n\nchar *pp, lbuf[LMAX], pbuf[PMAX];\n\nchar *cclass();\nchar *pmatch();\n\n\n/*** Display a file name *******************************/\nvoid file(char *s)\n{\n   printf(\"File %s:\\n\", s);\n}\n\n/*** Report unopenable file ****************************/\nvoid cant(char *s)\n{\n   fprintf(stderr, \"%s: cannot open\\n\", s);\n}\n\n/*** Give good help ************************************/\nvoid help(char **hp)\n{\n   char   **dp;\n\n   for (dp = hp; *dp; ++dp)\n      printf(\"%s\\n\", *dp);\n}\n\n/*** Display usage summary *****************************/\nvoid usage(char *s)\n{\n   fprintf(stderr, \"?GREP-E-%s\\n\", s);\n   fprintf(stderr,\n         \"Usage: grep [-cfnv] pattern [file ...].  grep ? for help\\n\");\n   exit(1);\n}\n\n/*** Compile the pattern into global pbuf[] ************/\nvoid compile(char *source)\n{\n   char  *s;         /* Source string pointer     */\n   char  *lp;        /* Last pattern pointer      */\n   int   c;          /* Current character         */\n   int            o;          /* Temp                      */\n   char           *spp;       /* Save beginning of pattern */\n\n   s = source;\n   if (debug)\n      printf(\"Pattern = \\\"%s\\\"\\n\", s);\n   pp = pbuf;\n   while (c = *s++) {\n      /*\n       * STAR, PLUS and MINUS are special.\n       */\n      if (c == '*' || c == '+' || c == '-') {\n         if (pp == pbuf ||\n               (o=pp[-1]) == BOL ||\n               o == EOL ||\n               o == STAR ||\n               o == PLUS ||\n               o == MINUS)\n            badpat(\"Illegal occurrance op.\", source, s);\n         store(ENDPAT);\n         store(ENDPAT);\n         spp = pp;               /* Save pattern end     */\n         while (--pp > lp)       /* Move pattern down    */\n            *pp = pp[-1];        /* one byte             */\n         *pp =   (c == '*') ? STAR :\n            (c == '-') ? MINUS : PLUS;\n         pp = spp;               /* Restore pattern end  */\n         continue;\n      }\n      /*\n       * All the rest.\n       */\n      lp = pp;         /* Remember start       */\n      switch(c) {\n\n         case '^':\n            store(BOL);\n            break;\n\n         case '$':\n            store(EOL);\n            break;\n\n         case '.':\n            store(ANY);\n            break;\n\n         case '[':\n            s = cclass(source, s);\n            break;\n\n         case ':':\n            if (*s) {\n               switch(tolower(c = *s++)) {\n\n                  case 'a':\n                  case 'A':\n                     store(ALPHA);\n                     break;\n\n                  case 'd':\n                  case 'D':\n                     store(DIGIT);\n                     break;\n\n                  case 'n':\n                  case 'N':\n                     store(NALPHA);\n                     break;\n\n                  case ' ':\n                     store(PUNCT);\n                     break;\n\n                  default:\n                     badpat(\"Unknown : type\", source, s);\n\n               }\n               break;\n            }\n            else    badpat(\"No : type\", source, s);\n\n         case '\\\\':\n            if (*s)\n               c = *s++;\n\n         default:\n            store(CHAR);\n            store(tolower(c));\n      }\n   }\n   store(ENDPAT);\n   store(0);                /* Terminate string     */\n   if (debug) {\n      for (lp = pbuf; lp < pp;) {\n         if ((c = (*lp++ & 0377)) < ' ')\n            printf(\"\\\\%o \", c);\n         else    printf(\"%c \", c);\n      }\n      printf(\"\\n\");\n   }\n}\n\n/*** Compile a class (within []) ***********************/\nchar *cclass(char *source, char *src)\n   /* char       *source;   // Pattern start -- for error msg. */\n   /* char       *src;      // Class start */\n{\n   char   *s;        /* Source pointer    */\n   char   *cp;       /* Pattern start     */\n   int    c;         /* Current character */\n   int             o;         /* Temp              */\n\n   s = src;\n   o = CLASS;\n   if (*s == '^') {\n      ++s;\n      o = NCLASS;\n   }\n   store(o);\n   cp = pp;\n   store(0);                          /* Byte count      */\n   while ((c = *s++) && c!=']') {\n      if (c == '\\\\') {                /* Store quoted char    */\n         if ((c = *s++) == '\\0')      /* Gotta get something  */\n            badpat(\"Class terminates badly\", source, s);\n         else    store(tolower(c));\n      }\n      else if (c == '-' &&\n            (pp - cp) > 1 && *s != ']' && *s != '\\0') {\n         c = pp[-1];             /* Range start     */\n         pp[-1] = RANGE;         /* Range signal    */\n         store(c);               /* Re-store start  */\n         c = *s++;               /* Get end char and*/\n         store(tolower(c));      /* Store it        */\n      }\n      else {\n         store(tolower(c));      /* Store normal char */\n      }\n   }\n   if (c != ']')\n      badpat(\"Unterminated class\", source, s);\n   if ((c = (pp - cp)) >= 256)\n      badpat(\"Class too large\", source, s);\n   if (c == 0)\n      badpat(\"Empty class\", source, s);\n   *cp = c;\n   return(s);\n}\n\n/*** Store an entry in the pattern buffer **************/\nvoid store(int op)\n{\n   if (pp >= &pbuf[PMAX])\n      error(\"Pattern too complex\\n\");\n   *pp++ = op;\n}\n\n/*** Report a bad pattern specification ****************/\nvoid badpat(char *message, char *source, char *stop)\n   /* char  *message;       // Error message */\n   /* char  *source;        // Pattern start */\n   /* char  *stop;          // Pattern end   */\n{\n   fprintf(stderr, \"-GREP-E-%s, pattern is\\\"%s\\\"\\n\", message, source);\n   fprintf(stderr, \"-GREP-E-Stopped at byte %d, '%c'\\n\",\n         stop-source, stop[-1]);\n   error(\"?GREP-E-Bad pattern\\n\");\n}\n\n/*** Scan the file for the pattern in pbuf[] ***********/\nvoid grep(FILE *fp, char *fn)\n   /* FILE       *fp;       // File to process            */\n   /* char       *fn;       // File name (for -f option)  */\n{\n   int lno, count, m;\n\n   lno = 0;\n   count = 0;\n   while (fgets(lbuf, LMAX, fp)) {\n      ++lno;\n      m = match();\n      if ((m && !vflag) || (!m && vflag)) {\n         ++count;\n         if (!cflag) {\n            if (fflag && fn) {\n               file(fn);\n               fn = 0;\n            }\n            if (nflag)\n               printf(\"%d\\t\", lno);\n            printf(\"%s\\n\", lbuf);\n         }\n      }\n   }\n   if (cflag) {\n      if (fflag && fn)\n         file(fn);\n      printf(\"%d\\n\", count);\n   }\n}\n\n/*** Match line (lbuf) with pattern (pbuf) return 1 if match ***/\nvoid match()\n{\n   char   *l;        /* Line pointer       */\n\n   for (l = lbuf; *l; ++l) {\n      if (pmatch(l, pbuf))\n         return(1);\n   }\n   return(0);\n}\n\n/*** Match partial line with pattern *******************/\nchar *pmatch(char *line, char *pattern)\n   /* char               *line;     // (partial) line to match      */\n   /* char               *pattern;  // (partial) pattern to match   */\n{\n   char   *l;        /* Current line pointer         */\n   char   *p;        /* Current pattern pointer      */\n   char   c;         /* Current character            */\n   char            *e;        /* End for STAR and PLUS match  */\n   int             op;        /* Pattern operation            */\n   int             n;         /* Class counter                */\n   char            *are;      /* Start of STAR match          */\n\n   l = line;\n   if (debug > 1)\n      printf(\"pmatch(\\\"%s\\\")\\n\", line);\n   p = pattern;\n   while ((op = *p++) != ENDPAT) {\n      if (debug > 1)\n         printf(\"byte[%d] = 0%o, '%c', op = 0%o\\n\",\n               l-line, *l, *l, op);\n      switch(op) {\n\n         case CHAR:\n            if (tolower(*l++) != *p++)\n               return(0);\n            break;\n\n         case BOL:\n            if (l != lbuf)\n               return(0);\n            break;\n\n         case EOL:\n            if (*l != '\\0')\n               return(0);\n            break;\n\n         case ANY:\n            if (*l++ == '\\0')\n               return(0);\n            break;\n\n         case DIGIT:\n            if ((c = *l++) < '0' || (c > '9'))\n               return(0);\n            break;\n\n         case ALPHA:\n            c = tolower(*l++);\n            if (c < 'a' || c > 'z')\n               return(0);\n            break;\n\n         case NALPHA:\n            c = tolower(*l++);\n            if (c >= 'a' && c <= 'z')\n               break;\n            else if (c < '0' || c > '9')\n               return(0);\n            break;\n\n         case PUNCT:\n            c = *l++;\n            if (c == 0 || c > ' ')\n               return(0);\n            break;\n\n         case CLASS:\n         case NCLASS:\n            c = tolower(*l++);\n            n = *p++ & 0377;\n            do {\n               if (*p == RANGE) {\n                  p += 3;\n                  n -= 2;\n                  if (c >= p[-2] && c <= p[-1])\n                     break;\n               }\n               else if (c == *p++)\n                  break;\n            } while (--n > 1);\n            if ((op == CLASS) == (n <= 1))\n               return(0);\n            if (op == CLASS)\n               p += n - 2;\n            break;\n\n         case MINUS:\n            e = pmatch(l, p);       /* Look for a match    */\n            while (*p++ != ENDPAT); /* Skip over pattern   */\n            if (e)                  /* Got a match?        */\n               l = e;               /* Yes, update string  */\n            break;                  /* Always succeeds     */\n\n         case PLUS:                 /* One or more ...     */\n            if ((l = pmatch(l, p)) == 0)\n               return(0);           /* Gotta have a match  */\n         case STAR:                 /* Zero or more ...    */\n            are = l;                /* Remember line start */\n            while (*l && (e = pmatch(l, p)))\n               l = e;               /* Get longest match   */\n            while (*p++ != ENDPAT); /* Skip over pattern   */\n            while (l >= are) {      /* Try to match rest   */\n               if (e = pmatch(l, p))\n                  return(e);\n               --l;                 /* Nope, try earlier   */\n            }\n            return(0);              /* Nothing else worked */\n\n         default:\n            printf(\"Bad op code %d\\n\", op);\n            error(\"Cannot happen -- match\\n\");\n      }\n   }\n   return(l);\n}\n\n/*** Report an error ***********************************/\nvoid error(char *s)\n{\n   fprintf(stderr, \"%s\", s);\n   exit(1);\n}\n\n/*** Main program - parse arguments & grep *************/\nint main(int argc, char **argv)\n{\n   char   *p;\n   int    c, i;\n   int             gotpattern;\n\n   FILE            *f;\n\n   if (argc <= 1)\n      usage(\"No arguments\");\n   if (argc == 2 && argv[1][0] == '?' && argv[1][1] == 0) {\n      help(documentation);\n      help(patdoc);\n      return 0;\n   }\n   nfile = argc-1;\n   gotpattern = 0;\n   for (i=1; i < argc; ++i) {\n      p = argv[i];\n      if (*p == '-') {\n         ++p;\n         while (c = *p++) {\n            switch(tolower(c)) {\n\n               case '?':\n                  help(documentation);\n                  break;\n\n               case 'C':\n               case 'c':\n                  ++cflag;\n                  break;\n\n               case 'D':\n               case 'd':\n                  ++debug;\n                  break;\n\n               case 'F':\n               case 'f':\n                  ++fflag;\n                  break;\n\n               case 'n':\n               case 'N':\n                  ++nflag;\n                  break;\n\n               case 'v':\n               case 'V':\n                  ++vflag;\n                  break;\n\n               default:\n                  usage(\"Unknown flag\");\n            }\n         }\n         argv[i] = 0;\n         --nfile;\n      } else if (!gotpattern) {\n         compile(p);\n         argv[i] = 0;\n         ++gotpattern;\n         --nfile;\n      }\n   }\n   if (!gotpattern)\n      usage(\"No pattern\");\n   if (nfile == 0)\n      grep(stdin, 0);\n   else {\n      fflag = fflag ^ (nfile > 0);\n      for (i=1; i < argc; ++i) {\n         if (p = argv[i]) {\n            if ((f=fopen(p, \"r\")) == NULL)\n               cant(p);\n            else {\n               grep(f, p);\n               fclose(f);\n            }\n         }\n      }\n   }\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/47_switch_return.c",
    "content": "#include <stdio.h>\n\nvoid fred(int x)\n{\n   switch (x)\n   {\n      case 1: printf(\"1\\n\"); return;\n      case 2: printf(\"2\\n\"); break;\n      case 3: printf(\"3\\n\"); return;\n   }\n\n   printf(\"out\\n\");\n}\n\nint main()\n{\n   fred(1);\n   fred(2);\n   fred(3);\n\n   return 0;\n}    \n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/47_switch_return.expect",
    "content": "1\n2\nout\n3\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/48_nested_break.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   char b;\n\n   a = 0;\n   while (a < 2)\n   {\n      printf(\"%d\", a++);\n      break;\n\n      b = 'A';\n      while (b < 'C')\n      {\n         printf(\"%c\", b++);\n      }\n      printf(\"e\");\n   }\n   printf(\"\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/48_nested_break.expect",
    "content": "0\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/49_bracket_evaluation.c",
    "content": "#include <stdio.h>\n\nstruct point\n{\n   double x;\n   double y;\n};\n\nstruct point point_array[100];\n\nint main()\n{\n   int my_point = 10;\n\n   point_array[my_point].x = 12.34;\n   point_array[my_point].y = 56.78;\n\n   printf(\"%f, %f\\n\", point_array[my_point].x, point_array[my_point].y);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/49_bracket_evaluation.expect",
    "content": "12.340000, 56.780000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/50_logical_second_arg.c",
    "content": "#include <stdio.h>\n\nint fred()\n{\n   printf(\"fred\\n\");\n   return 0;\n}\n\nint joe()\n{\n   printf(\"joe\\n\");\n   return 1;\n}\n\nint main()\n{\n   printf(\"%d\\n\", fred() && joe());\n   printf(\"%d\\n\", fred() || joe());\n   printf(\"%d\\n\", joe() && fred());\n   printf(\"%d\\n\", joe() || fred());\n   printf(\"%d\\n\", fred() && (1 + joe()));\n   printf(\"%d\\n\", fred() || (0 + joe()));\n   printf(\"%d\\n\", joe() && (0 + fred()));\n   printf(\"%d\\n\", joe() || (1 + fred()));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/50_logical_second_arg.expect",
    "content": "fred\n0\nfred\njoe\n1\njoe\nfred\n0\njoe\n1\nfred\n0\nfred\njoe\n1\njoe\nfred\n0\njoe\n1\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/51_static.c",
    "content": "#include <stdio.h>\n\nstatic int fred = 1234;\nstatic int joe;\n\nvoid henry()\n{\n   static int fred = 4567;\n\n   printf(\"%d\\n\", fred);\n   fred++;\n}\n\nint main()\n{\n   printf(\"%d\\n\", fred);\n   henry();\n   henry();\n   henry();\n   henry();\n   printf(\"%d\\n\", fred);\n   fred = 8901;\n   joe = 2345;\n   printf(\"%d\\n\", fred);\n   printf(\"%d\\n\", joe);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/51_static.expect",
    "content": "1234\n4567\n4568\n4569\n4570\n1234\n8901\n2345\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/52_unnamed_enum.c",
    "content": "#include <stdio.h>\n\nenum fred { a, b, c };\n\nint main()\n{\n   printf(\"a=%d\\n\", a);\n   printf(\"b=%d\\n\", b);\n   printf(\"c=%d\\n\", c);\n\n   enum fred d;\n\n   typedef enum { e, f, g } h;\n   typedef enum { i, j, k } m;\n\n   printf(\"e=%d\\n\", e);\n   printf(\"f=%d\\n\", f);\n   printf(\"g=%d\\n\", g);\n\n   printf(\"i=%d\\n\", i);\n   printf(\"j=%d\\n\", j);\n   printf(\"k=%d\\n\", k);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/52_unnamed_enum.expect",
    "content": "a=0\nb=1\nc=2\ne=0\nf=1\ng=2\ni=0\nj=1\nk=2\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/54_goto.c",
    "content": "#include <stdio.h>\n\nvoid fred()\n{\n   printf(\"In fred()\\n\");\n   goto done;\n   printf(\"In middle\\n\");\ndone:\n   printf(\"At end\\n\");\n}\n\nvoid joe()\n{\n   int b = 5678;\n\n   printf(\"In joe()\\n\");\n\n   {\n      int c = 1234;\n      printf(\"c = %d\\n\", c);\n      goto outer;\n      printf(\"uh-oh\\n\");\n   }\n\nouter:    \n\n   printf(\"done\\n\");\n}\n\nvoid henry()\n{\n   int a;\n\n   printf(\"In henry()\\n\");\n   goto inner;\n\n   {\n      int b;\ninner:    \n      b = 1234;\n      printf(\"b = %d\\n\", b);\n   }\n\n   printf(\"done\\n\");\n}\n\nint main()\n{\n   fred();\n   joe();\n   henry();\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/54_goto.expect",
    "content": "In fred()\nAt end\nIn joe()\nc = 1234\ndone\nIn henry()\nb = 1234\ndone\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/55_lshift_type.c",
    "content": "/* $Id: lshift-type.c 53089 2012-07-06 11:18:26Z vinc17/ypig $\n\nTests on left-shift type, written by Vincent Lefevre <vincent@vinc17.net>.\n\nISO C99 TC3 says: [6.5.7#3] \"The integer promotions are performed on\neach of the operands. The type of the result is that of the promoted\nleft operand.\"\n*/\n\n#include <stdio.h>\n\n#define PTYPE(M) ((M) < 0 || -(M) < 0 ? -1 : 1) * (int) sizeof((M)+0)\n#define CHECK(X,T) check(#X, PTYPE(X), PTYPE((X) << (T) 1))\n#define TEST1(X,T) do { CHECK(X,T); CHECK(X,unsigned T); } while (0)\n#define TEST2(X)                 \\\n  do                             \\\n    {                            \\\n      TEST1((X),short);          \\\n      TEST1((X),int);            \\\n      TEST1((X),long);           \\\n      TEST1((X),long long);      \\\n    }                            \\\n  while (0)\n#define TEST3(X,T) do { TEST2((T)(X)); TEST2((unsigned T)(X)); } while (0)\n#define TEST4(X)                 \\\n  do                             \\\n    {                            \\\n      TEST3((X),short);          \\\n      TEST3((X),int);            \\\n      TEST3((X),long);           \\\n      TEST3((X),long long);      \\\n    }                            \\\n while (0)\n\nstatic int debug, nfailed = 0;\n\nstatic void check (const char *s, int arg1, int shift)\n{\n  int failed = arg1 != shift;\n  if (debug || failed)\n    printf (\"%s %d %d\\n\", s, arg1, shift);\n  nfailed += failed;\n}\n\nint main (int argc, char **argv)\n{\n  debug = argc > 1;\n  TEST4(1);\n  TEST4(-1);\n  printf (\"%d test(s) failed\\n\", nfailed);\n  return nfailed != 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/55_lshift_type.expect",
    "content": "0 test(s) failed\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/LICENSE",
    "content": "The tests in this directory are either directly copied from the picoc project or\nare subsequently modified and added to for the purpose of TinyCC project. All\nthese modifications are licensed under the same terms as TinyCC as specified in\nthe file COPYING.\n\n=== picoc license ===\n\nCopyright (c) 2009-2011, Zik Saleeba\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without \nmodification, are permitted provided that the following conditions are \nmet:\n\n    * Redistributions of source code must retain the above copyright \n      notice, this list of conditions and the following disclaimer.\n      \n    * Redistributions in binary form must reproduce the above copyright \n      notice, this list of conditions and the following disclaimer in \n      the documentation and/or other materials provided with the \n      distribution.\n      \n    * Neither the name of the Zik Saleeba nor the names of its \n      contributors may be used to endorse or promote products derived \n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests/tests2/Makefile",
    "content": "TOP = ../..\ninclude $(TOP)/Makefile\nVPATH = $(top_srcdir)/tests/tests2\n\nTCCFLAGS = -B$(TOP)\nifdef CONFIG_WIN32\n TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)\nendif\n\nifeq ($(TARGETOS),Darwin)\n CFLAGS += -Wl,-flat_namespace,-undefined,warning\n TCCFLAGS += -D_ANSI_SOURCE\n export MACOSX_DEPLOYMENT_TARGET:=10.2\nendif\n\nTCC_RUN = $(TOP)/tcc $(TCCFLAGS) -run\n\nTESTS =\t\\\n 00_assignment.test \\\n 01_comment.test \\\n 02_printf.test \\\n 03_struct.test \\\n 04_for.test \\\n 05_array.test \\\n 06_case.test \\\n 07_function.test \\\n 08_while.test \\\n 09_do_while.test \\\n 10_pointer.test \\\n 11_precedence.test \\\n 12_hashdefine.test \\\n 13_integer_literals.test \\\n 14_if.test \\\n 15_recursion.test \\\n 16_nesting.test \\\n 17_enum.test \\\n 18_include.test \\\n 19_pointer_arithmetic.test \\\n 20_pointer_comparison.test \\\n 21_char_array.test \\\n 22_floating_point.test \\\n 23_type_coercion.test \\\n 24_math_library.test \\\n 25_quicksort.test \\\n 26_character_constants.test \\\n 27_sizeof.test \\\n 28_strings.test \\\n 29_array_address.test \\\n 31_args.test \\\n 32_led.test \\\n 33_ternary_op.test \\\n 35_sizeof.test \\\n 36_array_initialisers.test \\\n 37_sprintf.test \\\n 38_multiple_array_index.test \\\n 39_typedef.test \\\n 40_stdio.test \\\n 41_hashif.test \\\n 42_function_pointer.test \\\n 43_void_param.test \\\n 44_scoped_declarations.test \\\n 45_empty_for.test \\\n 47_switch_return.test \\\n 48_nested_break.test \\\n 49_bracket_evaluation.test \\\n 50_logical_second_arg.test \\\n 51_static.test \\\n 52_unnamed_enum.test \\\n 54_goto.test \\\n 55_lshift_type.test\n\n# 30_hanoi.test -- seg fault in the code, gcc as well\n# 34_array_assignment.test -- array assignment is not in C standard\n# 46_grep.test -- does not compile even with gcc\n\n# some tests do not pass on all platforms, remove them for now\nifeq ($(TARGETOS),Darwin)\n  TESTS := $(filter-out 40_stdio.test,$(TESTS))\nendif\nifdef CONFIG_WIN32\n  TESTS := $(filter-out 24_math_library.test 28_strings.test,$(TESTS))\nendif\n\n%.test: %.c %.expect\n\t@echo Test: $*...\n\t@if [ \"x`echo $* | grep args`\" != \"x\" ]; \\\n\tthen $(TCC_RUN) $< - arg1 arg2 arg3 arg4 >$*.output; \\\n\telse $(TCC_RUN) $< >$*.output; \\\n\tfi\n\t@if diff -bu $(<:.c=.expect) $*.output ; \\\n\tthen rm -f $*.output; \\\n\telse exit 1; \\\n\tfi\n\nall test: $(TESTS)\n\nclean:\n\trm -vf fred.txt *.output\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/00_assignment.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   int a;\n   a = 42;\n   printf(\"%d\\n\", a);\n\n   int b = 64;\n   printf(\"%d\\n\", b);\n\n   int c = 12, d = 34;\n   printf(\"%d, %d\\n\", c, d);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/00_assignment.expect",
    "content": "42\n64\n12, 34\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/01_comment.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   printf(\"Hello\\n\");\n   printf(\"Hello\\n\"); /* this is a comment */ printf(\"Hello\\n\");\n   printf(\"Hello\\n\");\n   // this is also a comment sayhello();\n   printf(\"Hello\\n\");\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/01_comment.expect",
    "content": "Hello\nHello\nHello\nHello\nHello\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/02_printf.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   printf(\"Hello world\\n\");\n\n   int Count;\n   for (Count = -5; Count <= 5; Count++)\n      printf(\"Count = %d\\n\", Count);\n\n   printf(\"String 'hello', 'there' is '%s', '%s'\\n\", \"hello\", \"there\");\n   printf(\"Character 'A' is '%c'\\n\", 65);\n   printf(\"Character 'a' is '%c'\\n\", 'a');\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/02_printf.expect",
    "content": "Hello world\nCount = -5\nCount = -4\nCount = -3\nCount = -2\nCount = -1\nCount = 0\nCount = 1\nCount = 2\nCount = 3\nCount = 4\nCount = 5\nString 'hello', 'there' is 'hello', 'there'\nCharacter 'A' is 'A'\nCharacter 'a' is 'a'\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/03_struct.c",
    "content": "#include <stdio.h>\n\nstruct fred\n{\n   int boris;\n   int natasha;\n};\n\nvoid main() \n{\n   struct fred bloggs;\n\n   bloggs.boris = 12;\n   bloggs.natasha = 34;\n\n   printf(\"%d\\n\", bloggs.boris);\n   printf(\"%d\\n\", bloggs.natasha);\n\n   struct fred jones[2];\n   jones[0].boris = 12;\n   jones[0].natasha = 34;\n   jones[1].boris = 56;\n   jones[1].natasha = 78;\n\n   printf(\"%d\\n\", jones[0].boris);\n   printf(\"%d\\n\", jones[0].natasha);\n   printf(\"%d\\n\", jones[1].boris);\n   printf(\"%d\\n\", jones[1].natasha);\n\n   return 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/03_struct.expect",
    "content": "12\n34\n12\n34\n56\n78\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/04_for.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   int Count;\n\n   for (Count = 1; Count <= 10; Count++)\n   {\n      printf(\"%d\\n\", Count);\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/04_for.expect",
    "content": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/05_array.c",
    "content": "#include <stdio.h>\n\nint main() \n{\n   int Count;\n   int Array[10];\n\n   for (Count = 1; Count <= 10; Count++)\n   {\n      Array[Count-1] = Count * Count;\n   }\n\n   for (Count = 0; Count < 10; Count++)\n   {\n      printf(\"%d\\n\", Array[Count]);\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/05_array.expect",
    "content": "1\n4\n9\n16\n25\n36\n49\n64\n81\n100\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/06_case.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count;\n\n   for (Count = 0; Count < 4; Count++)\n   {\n      printf(\"%d\\n\", Count);\n      switch (Count)\n      {\n         case 1:\n            printf(\"%d\\n\", 1);\n            break;\n\n         case 2:\n            printf(\"%d\\n\", 2);\n            break;\n\n         default:\n            printf(\"%d\\n\", 0);\n            break;\n      }\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/06_case.expect",
    "content": "0\n0\n1\n1\n2\n2\n3\n0\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/07_function.c",
    "content": "#include <stdio.h>\n\nint myfunc(int x)\n{\n   return x * x;\n}\n\nvoid vfunc(int a)\n{\n   printf(\"a=%d\\n\", a);\n}\n\nvoid qfunc()\n{\n   printf(\"qfunc()\\n\");\n}\n\nint main()\n{\n   printf(\"%d\\n\", myfunc(3));\n   printf(\"%d\\n\", myfunc(4));\n\n   vfunc(1234);\n\n   qfunc();\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/07_function.expect",
    "content": "9\n16\na=1234\nqfunc()\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/08_while.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int p;\n   int t;\n\n   a = 1;\n   p = 0;\n   t = 0;\n\n   while (a < 100)\n   {\n      printf(\"%d\\n\", a);\n      t = a;\n      a = t + p;\n      p = t;\n   }\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/08_while.expect",
    "content": "1\n1\n2\n3\n5\n8\n13\n21\n34\n55\n89\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/09_do_while.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int p;\n   int t;\n\n   a = 1;\n   p = 0;\n   t = 0;\n\n   do\n   {\n      printf(\"%d\\n\", a);\n      t = a;\n      a = t + p;\n      p = t;\n   } while (a < 100);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/09_do_while.expect",
    "content": "1\n1\n2\n3\n5\n8\n13\n21\n34\n55\n89\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/10_pointer.c",
    "content": "#include <stdio.h>\n\nstruct ziggy\n{\n   int a;\n   int b;\n   int c;\n} bolshevic;\n\nint main()\n{\n   int a;\n   int *b;\n   int c;\n\n   a = 42;\n   b = &a;\n   printf(\"a = %d\\n\", *b);\n\n   bolshevic.a = 12;\n   bolshevic.b = 34;\n   bolshevic.c = 56;\n\n   printf(\"bolshevic.a = %d\\n\", bolshevic.a);\n   printf(\"bolshevic.b = %d\\n\", bolshevic.b);\n   printf(\"bolshevic.c = %d\\n\", bolshevic.c);\n\n   struct ziggy *tsar = &bolshevic;\n\n   printf(\"tsar->a = %d\\n\", tsar->a);\n   printf(\"tsar->b = %d\\n\", tsar->b);\n   printf(\"tsar->c = %d\\n\", tsar->c);\n\n   b = &(bolshevic.b);\n   printf(\"bolshevic.b = %d\\n\", *b);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/10_pointer.expect",
    "content": "a = 42\nbolshevic.a = 12\nbolshevic.b = 34\nbolshevic.c = 56\ntsar->a = 12\ntsar->b = 34\ntsar->c = 56\nbolshevic.b = 34\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/11_precedence.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int b;\n   int c;\n   int d;\n   int e;\n   int f;\n   int x;\n   int y;\n\n   a = 12;\n   b = 34;\n   c = 56;\n   d = 78;\n   e = 0;\n   f = 1;\n\n   printf(\"%d\\n\", c + d);\n   printf(\"%d\\n\", (y = c + d));\n   printf(\"%d\\n\", e || e && f);\n   printf(\"%d\\n\", e || f && f);\n   printf(\"%d\\n\", e && e || f);\n   printf(\"%d\\n\", e && f || f);\n   printf(\"%d\\n\", a && f | f);\n   printf(\"%d\\n\", a | b ^ c & d);\n   printf(\"%d, %d\\n\", a == a, a == b);\n   printf(\"%d, %d\\n\", a != a, a != b);\n   printf(\"%d\\n\", a != b && c != d);\n   printf(\"%d\\n\", a + b * c / f);\n   printf(\"%d\\n\", a + b * c / f);\n   printf(\"%d\\n\", (4 << 4));\n   printf(\"%d\\n\", (64 >> 4));\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/11_precedence.expect",
    "content": "134\n134\n0\n1\n1\n1\n1\n46\n1, 0\n0, 1\n1\n1916\n1916\n64\n4\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/12_hashdefine.c",
    "content": "#include <stdio.h>\n\n#define FRED 12\n#define BLOGGS(x) (12*(x))\n\nint main()\n{\n   printf(\"%d\\n\", FRED);\n   printf(\"%d, %d, %d\\n\", BLOGGS(1), BLOGGS(2), BLOGGS(3));\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/12_hashdefine.expect",
    "content": "12\n12, 24, 36\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/13_integer_literals.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a = 24680;\n   int b = 01234567;\n   int c = 0x2468ac;\n   int d = 0x2468AC;\n   int e = 0b010101010101;\n\n   printf(\"%d\\n\", a);\n   printf(\"%d\\n\", b);\n   printf(\"%d\\n\", c);\n   printf(\"%d\\n\", d);\n   printf(\"%d\\n\", e);\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/13_integer_literals.expect",
    "content": "24680\n342391\n2386092\n2386092\n1365\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/14_if.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a = 1;\n\n   if (a)\n      printf(\"a is true\\n\");\n   else\n      printf(\"a is false\\n\");\n\n   int b = 0;\n   if (b)\n      printf(\"b is true\\n\");\n   else\n      printf(\"b is false\\n\");\n\n   return 0;\n}\n\n// vim: set expandtab ts=4 sw=3 sts=3 tw=80 :\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/14_if.expect",
    "content": "a is true\nb is false\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/15_recursion.c",
    "content": "#include <stdio.h>\n\nint factorial(int i) \n{\n   if (i < 2)\n      return i;\n   else\n      return i * factorial(i - 1);\n}\n\nint main()\n{\n   int Count;\n\n   for (Count = 1; Count <= 10; Count++)\n      printf(\"%d\\n\", factorial(Count));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/15_recursion.expect",
    "content": "1\n2\n6\n24\n120\n720\n5040\n40320\n362880\n3628800\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/16_nesting.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int x, y, z;\n\n   for (x = 0; x < 2; x++)\n   {\n      for (y = 0; y < 3; y++)\n      {\n         for (z = 0; z < 3; z++)\n         {\n            printf(\"%d %d %d\\n\", x, y, z);\n         }\n      }\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/16_nesting.expect",
    "content": "0 0 0\n0 0 1\n0 0 2\n0 1 0\n0 1 1\n0 1 2\n0 2 0\n0 2 1\n0 2 2\n1 0 0\n1 0 1\n1 0 2\n1 1 0\n1 1 1\n1 1 2\n1 2 0\n1 2 1\n1 2 2\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/17_enum.c",
    "content": "#include <stdio.h>\n\nenum fred\n{\n   a,\n   b,\n   c,\n   d,\n   e = 54,\n   f = 73,\n   g,\n   h\n};\n\nint main()\n{\n   enum fred frod;\n\n   printf(\"%d %d %d %d %d %d %d %d\\n\", a, b, c, d, e, f, g, h);\n   /* printf(\"%d\\n\", frod); */\n   frod = 12;\n   printf(\"%d\\n\", frod);\n   frod = e;\n   printf(\"%d\\n\", frod);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/17_enum.expect",
    "content": "0 1 2 3 54 73 74 75\n12\n54\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/18_include.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   printf(\"including\\n\");\n#include \"18_include.h\"\n   printf(\"done\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/18_include.expect",
    "content": "including\nincluded\ndone\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/18_include.h",
    "content": "printf(\"included\\n\");\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/19_pointer_arithmetic.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int *b;\n   int *c;\n\n   a = 42;\n   b = &a;\n   c = NULL;\n\n   printf(\"%d\\n\", *b);\n\n   if (b == NULL)\n      printf(\"b is NULL\\n\");\n   else\n      printf(\"b is not NULL\\n\");\n\n   if (c == NULL)\n      printf(\"c is NULL\\n\");\n   else\n      printf(\"c is not NULL\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/19_pointer_arithmetic.expect",
    "content": "42\nb is not NULL\nc is NULL\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/20_pointer_comparison.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   int b;\n   int *d;\n   int *e;\n   d = &a;\n   e = &b;\n   a = 12;\n   b = 34;\n   printf(\"%d\\n\", *d);\n   printf(\"%d\\n\", *e);\n   printf(\"%d\\n\", d == e);\n   printf(\"%d\\n\", d != e);\n   d = e;\n   printf(\"%d\\n\", d == e);\n   printf(\"%d\\n\", d != e);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/20_pointer_comparison.expect",
    "content": "12\n34\n0\n1\n1\n0\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/21_char_array.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int x = 'a';\n   char y = x;\n\n   char *a = \"hello\";\n\n   printf(\"%s\\n\", a);\n\n   int c;\n   c = *a;\n\n   char *b;\n   for (b = a; *b != 0; b++)\n      printf(\"%c: %d\\n\", *b, *b);\n\n   char destarray[10];\n   char *dest = &destarray[0];\n   char *src = a;\n\n   while (*src != 0)\n      *dest++ = *src++;\n\n   *dest = 0;\n\n   printf(\"copied string is %s\\n\", destarray);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/21_char_array.expect",
    "content": "hello\nh: 104\ne: 101\nl: 108\nl: 108\no: 111\ncopied string is hello\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/22_floating_point.c",
    "content": "#include <stdio.h>\n#include <math.h>\n\nint main()\n{\n   // variables\n   float a = 12.34 + 56.78;\n   printf(\"%f\\n\", a);\n\n   // infix operators\n   printf(\"%f\\n\", 12.34 + 56.78);\n   printf(\"%f\\n\", 12.34 - 56.78);\n   printf(\"%f\\n\", 12.34 * 56.78);\n   printf(\"%f\\n\", 12.34 / 56.78);\n\n   // comparison operators\n   printf(\"%d %d %d %d %d %d\\n\", 12.34 < 56.78, 12.34 <= 56.78, 12.34 == 56.78, 12.34 >= 56.78, 12.34 > 56.78, 12.34 != 56.78);\n   printf(\"%d %d %d %d %d %d\\n\", 12.34 < 12.34, 12.34 <= 12.34, 12.34 == 12.34, 12.34 >= 12.34, 12.34 > 12.34, 12.34 != 12.34);\n   printf(\"%d %d %d %d %d %d\\n\", 56.78 < 12.34, 56.78 <= 12.34, 56.78 == 12.34, 56.78 >= 12.34, 56.78 > 12.34, 56.78 != 12.34);\n\n   // assignment operators\n   a = 12.34;\n   a += 56.78;\n   printf(\"%f\\n\", a);\n\n   a = 12.34;\n   a -= 56.78;\n   printf(\"%f\\n\", a);\n\n   a = 12.34;\n   a *= 56.78;\n   printf(\"%f\\n\", a);\n\n   a = 12.34;\n   a /= 56.78;\n   printf(\"%f\\n\", a);\n\n   // prefix operators\n   printf(\"%f\\n\", +12.34);\n   printf(\"%f\\n\", -12.34);\n\n   // type coercion\n   a = 2;\n   printf(\"%f\\n\", a);\n   printf(\"%f\\n\", sin(2));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/22_floating_point.expect",
    "content": "69.120003\n69.120000\n-44.440000\n700.665200\n0.217330\n1 1 0 0 0 1\n0 1 1 1 0 0\n0 0 0 1 1 1\n69.120003\n-44.439999\n700.665222\n0.217330\n12.340000\n-12.340000\n2.000000\n0.909297\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/23_type_coercion.c",
    "content": "#include <stdio.h>\n\nvoid charfunc(char a)\n{\n   printf(\"char: %c\\n\", a);\n}\n\nvoid intfunc(int a)\n{\n   printf(\"int: %d\\n\", a);\n}\n\nvoid floatfunc(float a)\n{\n   printf(\"float: %f\\n\", a);\n}\n\nint main()\n{\n   charfunc('a');\n   charfunc(98);\n   charfunc(99.0);\n\n   intfunc('a');\n   intfunc(98);\n   intfunc(99.0);\n\n   floatfunc('a');\n   floatfunc(98);\n   floatfunc(99.0);\n\n   /* printf(\"%c %d %f\\n\", 'a', 'b', 'c'); */\n   /* printf(\"%c %d %f\\n\", 97, 98, 99); */\n   /* printf(\"%c %d %f\\n\", 97.0, 98.0, 99.0); */\n\n   char b = 97;\n   char c = 97.0;\n\n   printf(\"%d %d\\n\", b, c);\n\n   int d = 'a';\n   int e = 97.0;\n\n   printf(\"%d %d\\n\", d, e);\n\n   float f = 'a';\n   float g = 97;\n\n   printf(\"%f %f\\n\", f, g);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/23_type_coercion.expect",
    "content": "char: a\nchar: b\nchar: c\nint: 97\nint: 98\nint: 99\nfloat: 97.000000\nfloat: 98.000000\nfloat: 99.000000\n97 97\n97 97\n97.000000 97.000000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/24_math_library.c",
    "content": "#include <stdio.h>\n#include <math.h>\n\nint main()\n{\n   printf(\"%f\\n\", sin(0.12));\n   printf(\"%f\\n\", cos(0.12));\n   printf(\"%f\\n\", tan(0.12));\n   printf(\"%f\\n\", asin(0.12));\n   printf(\"%f\\n\", acos(0.12));\n   printf(\"%f\\n\", atan(0.12));\n   printf(\"%f\\n\", sinh(0.12));\n   printf(\"%f\\n\", cosh(0.12));\n   printf(\"%f\\n\", tanh(0.12));\n   printf(\"%f\\n\", exp(0.12));\n   printf(\"%f\\n\", fabs(-0.12));\n   printf(\"%f\\n\", log(0.12));\n   printf(\"%f\\n\", log10(0.12));\n   printf(\"%f\\n\", pow(0.12, 0.12));\n   printf(\"%f\\n\", sqrt(0.12));\n   printf(\"%f\\n\", round(12.34));\n   printf(\"%f\\n\", ceil(12.34));\n   printf(\"%f\\n\", floor(12.34));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/24_math_library.expect",
    "content": "0.119712\n0.992809\n0.120579\n0.120290\n1.450506\n0.119429\n0.120288\n1.007209\n0.119427\n1.127497\n0.120000\n-2.120264\n-0.920819\n0.775357\n0.346410\n12.000000\n13.000000\n12.000000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/25_quicksort.c",
    "content": "#include <stdio.h>\n\nint array[16];\n\n//Swap integer values by array indexes\nvoid swap(int a, int b)\n{\n   int tmp  = array[a];\n   array[a] = array[b];\n   array[b] = tmp;\n}\n\n//Partition the array into two halves and return the\n//index about which the array is partitioned\nint partition(int left, int right)\n{\n   int pivotIndex = left;\n   int pivotValue = array[pivotIndex];\n   int index = left;\n   int i;\n\n   swap(pivotIndex, right);\n   for(i = left; i < right; i++)\n   {\n      if(array[i] < pivotValue)\n      {\n         swap(i, index);\n         index += 1;\n      }\n   }\n   swap(right, index);\n\n   return index;\n}\n\n//Quicksort the array\nvoid quicksort(int left, int right)\n{\n   if(left >= right)\n      return;\n\n   int index = partition(left, right);\n   quicksort(left, index - 1);\n   quicksort(index + 1, right);\n}\n\nint main()\n{\n   int i;\n\n   array[0] = 62;\n   array[1] = 83;\n   array[2] = 4;\n   array[3] = 89;\n   array[4] = 36;\n   array[5] = 21;\n   array[6] = 74;\n   array[7] = 37;\n   array[8] = 65;\n   array[9] = 33;\n   array[10] = 96;\n   array[11] = 38;\n   array[12] = 53;\n   array[13] = 16;\n   array[14] = 74;\n   array[15] = 55;\n\n   for (i = 0; i < 16; i++)\n      printf(\"%d \", array[i]);\n\n   printf(\"\\n\");\n\n   quicksort(0, 15);\n\n   for (i = 0; i < 16; i++)\n      printf(\"%d \", array[i]);\n\n   printf(\"\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/25_quicksort.expect",
    "content": "62 83 4 89 36 21 74 37 65 33 96 38 53 16 74 55 \n4 16 21 33 36 37 38 53 55 62 65 74 74 83 89 96 \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/26_character_constants.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   printf(\"%d\\n\", '\\1');\n   printf(\"%d\\n\", '\\10');\n   printf(\"%d\\n\", '\\100');\n   printf(\"%d\\n\", '\\x01');\n   printf(\"%d\\n\", '\\x0e');\n   printf(\"%d\\n\", '\\x10');\n   printf(\"%d\\n\", '\\x40');\n   printf(\"test \\x40\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/26_character_constants.expect",
    "content": "1\n8\n64\n1\n14\n16\n64\ntest @\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/27_sizeof.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   char a;\n   int b;\n   double c;\n\n   printf(\"%d\\n\", sizeof(a));\n   printf(\"%d\\n\", sizeof(b));\n   printf(\"%d\\n\", sizeof(c));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/27_sizeof.expect",
    "content": "1\n4\n8\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/28_strings.c",
    "content": "#include <stdio.h>\n#include <string.h>\n#include <strings.h>\n\nint main()\n{\n   char a[10];\n\n   strcpy(a, \"hello\");\n   printf(\"%s\\n\", a);\n\n   strncpy(a, \"gosh\", 2);\n   printf(\"%s\\n\", a);\n\n   printf(\"%d\\n\", strcmp(a, \"apple\") > 0);\n   printf(\"%d\\n\", strcmp(a, \"goere\") > 0);\n   printf(\"%d\\n\", strcmp(a, \"zebra\") < 0);\n\n   printf(\"%d\\n\", strlen(a));\n\n   strcat(a, \"!\");\n   printf(\"%s\\n\", a);\n\n   printf(\"%d\\n\", strncmp(a, \"apple\", 2) > 0);\n   printf(\"%d\\n\", strncmp(a, \"goere\", 2) == 0);\n   printf(\"%d\\n\", strncmp(a, \"goerg\", 2) == 0);\n   printf(\"%d\\n\", strncmp(a, \"zebra\", 2) < 0);\n\n   printf(\"%s\\n\", index(a, 'o'));\n   printf(\"%s\\n\", rindex(a, 'l'));\n   printf(\"%d\\n\", rindex(a, 'x') == NULL);\n\n   memset(&a[1], 'r', 4);\n   printf(\"%s\\n\", a);\n\n   memcpy(&a[2], a, 2);\n   printf(\"%s\\n\", a);\n\n   printf(\"%d\\n\", memcmp(a, \"apple\", 4) > 0);\n   printf(\"%d\\n\", memcmp(a, \"grgr\", 4) == 0);\n   printf(\"%d\\n\", memcmp(a, \"zebra\", 4) < 0);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/28_strings.expect",
    "content": "hello\ngollo\n1\n1\n1\n5\ngollo!\n1\n1\n1\n1\nollo!\nlo!\n1\ngrrrr!\ngrgrr!\n1\n1\n1\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/29_array_address.c",
    "content": "#include <stdio.h>\n#include <string.h>\n\nint main()\n{\n   char a[10];\n   strcpy(a, \"abcdef\");\n   printf(\"%s\\n\", &a[1]);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/29_array_address.expect",
    "content": "bcdef\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/30_hanoi.c",
    "content": "/* example from http://barnyard.syr.edu/quickies/hanoi.c */\n\n/* hanoi.c: solves the tower of hanoi problem. (Programming exercise.) */\n/* By Terry R. McConnell (12/2/97) */\n/* Compile: cc -o hanoi hanoi.c */\n\n/* This program does no error checking. But then, if it's right, \n   it's right ... right ? */\n\n\n/* The original towers of hanoi problem seems to have been originally posed\n   by one M. Claus in 1883. There is a popular legend that goes along with\n   it that has been often repeated and paraphrased. It goes something like this:\n   In the great temple at Benares there are 3 golden spikes. On one of them,\n   God placed 64 disks increasing in size from bottom to top, at the beginning\n   of time. Since then, and to this day, the priest on duty constantly transfers\n   disks, one at a time, in such a way that no larger disk is ever put on top\n   of a smaller one. When the disks have been transferred entirely to another\n   spike the Universe will come to an end in a large thunderclap.\n\n   This paraphrases the original legend due to DeParville, La Nature, Paris 1884,\n   Part I, 285-286. For this and further information see: Mathematical \n   Recreations & Essays, W.W. Rouse Ball, MacMillan, NewYork, 11th Ed. 1967,\n   303-305.\n *\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#define TRUE 1\n#define FALSE 0\n\n/* This is the number of \"disks\" on tower A initially. Taken to be 64 in the\n * legend. The number of moves required, in general, is 2^N - 1. For N = 64,\n * this is 18,446,744,073,709,551,615 */\n#define N 4\n\n/* These are the three towers. For example if the state of A is 0,1,3,4, that\n * means that there are three discs on A of sizes 1, 3, and 4. (Think of right\n * as being the \"down\" direction.) */\nint A[N], B[N], C[N]; \n\nvoid Hanoi(int,int*,int*,int*);\n\n/* Print the current configuration of A, B, and C to the screen */\nvoid PrintAll()\n{\n   int i;\n\n   printf(\"A: \");\n   for(i=0;i<N;i++)printf(\" %d \",A[i]);\n   printf(\"\\n\");\n\n   printf(\"B: \");\n   for(i=0;i<N;i++)printf(\" %d \",B[i]);\n   printf(\"\\n\");\n\n   printf(\"C: \");\n   for(i=0;i<N;i++)printf(\" %d \",C[i]);\n   printf(\"\\n\");\n   printf(\"------------------------------------------\\n\");\n   return;\n}\n\n/* Move the leftmost nonzero element of source to dest, leave behind 0. */\n/* Returns the value moved (not used.) */\nint Move(int *source, int *dest)\n{\n   int i,j;\n\n   while (i<N && (source[i])==0) i++;\n   while (j<N && (dest[j])==0) j++;\n\n   dest[j-1] = source[i];\n   source[i] = 0;\n   PrintAll();       /* Print configuration after each move. */\n   return dest[j-1];\n}\n\n\n/* Moves first n nonzero numbers from source to dest using the rules of Hanoi.\n   Calls itself recursively.\n   */\nvoid Hanoi(int n,int *source, int *dest, int *spare)\n{\n   int i;\n   if(n==1){\n      Move(source,dest);\n      return;\n   }\n\n   Hanoi(n-1,source,spare,dest);\n   Move(source,dest);\n   Hanoi(n-1,spare,dest,source);\t\n   return;\n}\n\nint main()\n{\n   int i;\n\n   /* initialize the towers */\n   for(i=0;i<N;i++)A[i]=i+1;\n   for(i=0;i<N;i++)B[i]=0;\n   for(i=0;i<N;i++)C[i]=0;\n\n   printf(\"Solution of Tower of Hanoi Problem with %d Disks\\n\\n\",N);\n\n   /* Print the starting state */\n   printf(\"Starting state:\\n\");\n   PrintAll();\n   printf(\"\\n\\nSubsequent states:\\n\\n\");\n\n   /* Do it! Use A = Source, B = Destination, C = Spare */\n   Hanoi(N,A,B,C);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/30_hanoi.expect",
    "content": "Solution of Tower of Hanoi Problem with 4 Disks\n\nStarting state:\nA:  1  2  3  4 \nB:  0  0  0  0 \nC:  0  0  0  0 \n------------------------------------------\n\n\nSubsequent states:\n\nA:  0  2  3  4 \nB:  0  0  0  0 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  3  4 \nB:  0  0  0  2 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  3  4 \nB:  0  0  1  2 \nC:  0  0  0  0 \n------------------------------------------\nA:  0  0  0  4 \nB:  0  0  1  2 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  4 \nB:  0  0  0  2 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  4 \nB:  0  0  0  0 \nC:  0  0  2  3 \n------------------------------------------\nA:  0  0  0  4 \nB:  0  0  0  0 \nC:  0  1  2  3 \n------------------------------------------\nA:  0  0  0  0 \nB:  0  0  0  4 \nC:  0  1  2  3 \n------------------------------------------\nA:  0  0  0  0 \nB:  0  0  1  4 \nC:  0  0  2  3 \n------------------------------------------\nA:  0  0  0  2 \nB:  0  0  1  4 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  2 \nB:  0  0  0  4 \nC:  0  0  0  3 \n------------------------------------------\nA:  0  0  1  2 \nB:  0  0  3  4 \nC:  0  0  0  0 \n------------------------------------------\nA:  0  0  0  2 \nB:  0  0  3  4 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  0  0 \nB:  0  2  3  4 \nC:  0  0  0  1 \n------------------------------------------\nA:  0  0  0  0 \nB:  1  2  3  4 \nC:  0  0  0  0 \n------------------------------------------\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/31_args.c",
    "content": "#include <stdio.h>\n\nint main(int argc, char **argv)\n{\n   int Count;\n\n   printf(\"hello world %d\\n\", argc);\n   for (Count = 0; Count < argc; Count++)\n      printf(\"arg %d: %s\\n\", Count, argv[Count]);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/31_args.expect",
    "content": "hello world 6\narg 0: 31_args.c\narg 1: -\narg 2: arg1\narg 3: arg2\narg 4: arg3\narg 5: arg4\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/32_led.c",
    "content": "/* example from http://barnyard.syr.edu/quickies/led.c */\n\n/* led.c: print out number as if on 7 line led display. I.e., write integer\n   given on command line like this:  \n      _   _       _  \n   |  _|  _| |_| |_  \n   | |_   _|   |  _| etc.\n\n   We assume the terminal behaves like a classical teletype. So the top\n   lines of all digits have to be printed first, then the middle lines of\n   all digits, etc.\n\n   By Terry R. McConnell\n\ncompile: cc -o led led.c\n\nIf you just want to link in the subroutine print_led that does all the\nwork, compile with -DNO_MAIN, and declare the following in any source file\nthat uses the call:\n\nextern void print_led(unsigned long x, char *buf);\n\nBug: you cannot call repeatedly to print more than one number to a line.\nThat would require curses or some other terminal API that allows moving the\ncursor to a previous line.\n\n*/\n\n\n\n#include <stdlib.h>\n#include <stdio.h>\n\n#define MAX_DIGITS 32\n#define NO_MAIN\n\n\n/* Print the top line of the digit d into buffer. \n   Does not null terminate buffer. */\n\nvoid topline(int d, char *p){\n\n   *p++ = ' ';\n   switch(d){\n\n      /* all these have _ on top line */\n\n      case 0:\n      case 2:\n      case 3:\n      case 5:\n      case 7:\n      case 8:\n      case 9:\n         *p++ = '_';\n         break;\n      default:\n         *p++=' ';\n\n   }\n   *p++=' ';\n}\n\n/* Print the middle line of the digit d into the buffer. \n   Does not null terminate. */\n\nvoid midline(int d, char *p){\n\n   switch(d){\n\n      /* those that have leading | on middle line */\n\n      case 0:\n      case 4:\n      case 5:\n      case 6:\n      case 8:\n      case 9:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\t\n   }\n   switch(d){\n\n      /* those that have _ on middle line */\n\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 8:\n      case 9:\n         *p++='_';\n         break;\n      default:\n         *p++=' ';\n\n   }\n   switch(d){\n\n      /* those that have closing | on middle line */\n\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 7:\n      case 8:\n      case 9:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\n\n   }\n}\n\n/* Print the bottom line of the digit d. Does not null terminate. */\n\nvoid botline(int d, char *p){\n\n\n   switch(d){\n\n      /* those that have leading | on bottom line */\n\n      case 0:\n      case 2:\n      case 6:\n      case 8:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\t\n   }\n   switch(d){\n\n      /* those that have _ on bottom line */\n\n      case 0:\n      case 2:\n      case 3:\n      case 5:\n      case 6:\n      case 8:\n         *p++='_';\n         break;\n      default:\n         *p++=' ';\n\n   }\n   switch(d){\n\n      /* those that have closing | on bottom line */\n\n      case 0:\n      case 1:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n      case 8:\n      case 9:\n         *p++='|';\n         break;\n      default:\n         *p++=' ';\n\n   }\n}\n\n/* Write the led representation of integer to string buffer. */\n\nvoid print_led(unsigned long x, char *buf)\n{\n\n   int i=0,n;\n   static int d[MAX_DIGITS];\n\n\n   /* extract digits from x */\n\n   n = ( x == 0L ? 1 : 0 );  /* 0 is a digit, hence a special case */\n\n   while(x){\n      d[n++] = (int)(x%10L);\n      if(n >= MAX_DIGITS)break;\n      x = x/10L;\n   }\n\n   /* print top lines of all digits */\n\n   for(i=n-1;i>=0;i--){\n      topline(d[i],buf);\n      buf += 3;\n      *buf++=' ';\n   }\n   *buf++='\\n'; /* move teletype to next line */\n\n   /* print middle lines of all digits */\n\n   for(i=n-1;i>=0;i--){\n      midline(d[i],buf);\n      buf += 3;\n      *buf++=' ';\n   }\n   *buf++='\\n';\n\n   /* print bottom lines of all digits */\n\n   for(i=n-1;i>=0;i--){\n      botline(d[i],buf);\n      buf += 3;\n      *buf++=' ';\n   }\n   *buf++='\\n';\n   *buf='\\0';\n}\n\nint main()\n{\n   char buf[5*MAX_DIGITS];\n   print_led(1234567, buf);\n   printf(\"%s\\n\",buf);\n\n   return 0;\n}\n\n#ifndef NO_MAIN\nint main(int argc, char **argv)\n{\n\n   int i=0,n;\n   long x;\n   static int d[MAX_DIGITS];\n   char buf[5*MAX_DIGITS];\n\n   if(argc != 2){\n      fprintf(stderr,\"led: usage: led integer\\n\");\n      return 1;\n   }\n\n   /* fetch argument from command line */\n\n   x = atol(argv[1]);\n\n   /* sanity check */\n\n   if(x<0){\n      fprintf(stderr,\"led: %d must be non-negative\\n\",x);\n      return 1;\n   }\n\n   print_led(x,buf);\n   printf(\"%s\\n\",buf);\n\n   return 0;\n\n}\n#endif\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/32_led.expect",
    "content": "     _   _       _       _  \n  |  _|  _| |_| |_  |_    | \n  | |_   _|   |  _| |_|   | \n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/33_ternary_op.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count;\n\n   for (Count = 0; Count < 10; Count++)\n   {\n      printf(\"%d\\n\", (Count < 5) ? (Count*Count) : (Count * 3));\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/33_ternary_op.expect",
    "content": "0\n1\n4\n9\n16\n15\n18\n21\n24\n27\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/34_array_assignment.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a[4];\n\n   a[0] = 12;\n   a[1] = 23;\n   a[2] = 34;\n   a[3] = 45;\n\n   printf(\"%d %d %d %d\\n\", a[0], a[1], a[2], a[3]);\n\n   int b[4];\n\n   b = a;\n\n   printf(\"%d %d %d %d\\n\", b[0], b[1], b[2], b[3]);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/34_array_assignment.expect",
    "content": "12 23 34 45\n12 23 34 45\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/35_sizeof.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   char a;\n   short b;\n\n   printf(\"%d %d\\n\", sizeof(char), sizeof(a));\n   printf(\"%d %d\\n\", sizeof(short), sizeof(b));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/35_sizeof.expect",
    "content": "1 1\n2 2\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/36_array_initialisers.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count;\n\n   int Array[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753 };\n\n   for (Count = 0; Count < 10; Count++)\n      printf(\"%d: %d\\n\", Count, Array[Count]);\n\n   int Array2[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753, };\n\n   for (Count = 0; Count < 10; Count++)\n      printf(\"%d: %d\\n\", Count, Array2[Count]);\n\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/36_array_initialisers.expect",
    "content": "0: 12\n1: 34\n2: 56\n3: 78\n4: 90\n5: 123\n6: 456\n7: 789\n8: 8642\n9: 9753\n0: 12\n1: 34\n2: 56\n3: 78\n4: 90\n5: 123\n6: 456\n7: 789\n8: 8642\n9: 9753\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/37_sprintf.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   char Buf[100];\n   int Count;\n\n   for (Count = 1; Count <= 20; Count++)\n   {\n      sprintf(Buf, \"->%02d<-\\n\", Count);\n      printf(\"%s\", Buf);\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/37_sprintf.expect",
    "content": "->01<-\n->02<-\n->03<-\n->04<-\n->05<-\n->06<-\n->07<-\n->08<-\n->09<-\n->10<-\n->11<-\n->12<-\n->13<-\n->14<-\n->15<-\n->16<-\n->17<-\n->18<-\n->19<-\n->20<-\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/38_multiple_array_index.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a[4][4];\n   int b = 0;\n   int x;\n   int y;\n\n   for (x = 0; x < 4; x++)\n   {\n      for (y = 0; y < 4; y++)\n      {\n         b++;\n         a[x][y] = b;\n      }\n   }\n\n   for (x = 0; x < 4; x++)\n   {\n      printf(\"x=%d: \", x);\n      for (y = 0; y < 4; y++)\n      {\n         printf(\"%d \", a[x][y]);\n      }\n      printf(\"\\n\");\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/38_multiple_array_index.expect",
    "content": "x=0: 1 2 3 4\nx=1: 5 6 7 8\nx=2: 9 10 11 12\nx=3: 13 14 15 16 \n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/39_typedef.c",
    "content": "#include <stdio.h>\n\ntypedef int MyInt;\n\nstruct FunStruct\n{\n   int i;\n   int j;\n};\n\ntypedef struct FunStruct MyFunStruct;\n\ntypedef MyFunStruct *MoreFunThanEver;\n\nint main()\n{\n   MyInt a = 1;\n   printf(\"%d\\n\", a);\n\n   MyFunStruct b;\n   b.i = 12;\n   b.j = 34;\n   printf(\"%d,%d\\n\", b.i, b.j);\n\n   MoreFunThanEver c = &b;\n   printf(\"%d,%d\\n\", c->i, c->j);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/39_typedef.expect",
    "content": "1\n12,34\n12,34\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/40_stdio.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   FILE *f = fopen(\"fred.txt\", \"w\");\n   fwrite(\"hello\\nhello\\n\", 1, 12, f);\n   fclose(f);\n\n   char freddy[7];\n   f = fopen(\"fred.txt\", \"r\");\n   if (fread(freddy, 1, 6, f) != 6)\n      printf(\"couldn't read fred.txt\\n\");\n\n   freddy[6] = '\\0';\n   fclose(f);\n\n   printf(\"%s\", freddy);\n\n   int InChar;\n   char ShowChar;\n   f = fopen(\"fred.txt\", \"r\");\n   while ( (InChar = fgetc(f)) != EOF)\n   {\n      ShowChar = InChar;\n      if (ShowChar < ' ')\n         ShowChar = '.';\n\n      printf(\"ch: %d '%c'\\n\", InChar, ShowChar);\n   }\n   fclose(f);\n\n   f = fopen(\"fred.txt\", \"r\");\n   while ( (InChar = getc(f)) != EOF)\n   {\n      ShowChar = InChar;\n      if (ShowChar < ' ')\n         ShowChar = '.';\n\n      printf(\"ch: %d '%c'\\n\", InChar, ShowChar);\n   }\n   fclose(f);\n\n   f = fopen(\"fred.txt\", \"r\");\n   while (fgets(freddy, sizeof(freddy), f) != NULL)\n      printf(\"x: %s\", freddy);\n\n   fclose(f);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/40_stdio.expect",
    "content": "hello\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nch: 104 'h'\nch: 101 'e'\nch: 108 'l'\nch: 108 'l'\nch: 111 'o'\nch: 10 '.'\nx: hello\nx: hello\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/41_hashif.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   printf(\"#include test\\n\");\n\n#if 1\n#if 0\n   printf(\"a\\n\");\n#else\n   printf(\"b\\n\");\n#endif\n#else\n#if 0\n   printf(\"c\\n\");\n#else\n   printf(\"d\\n\");\n#endif\n#endif\n\n#if 0\n#if 1\n   printf(\"e\\n\");\n#else\n   printf(\"f\\n\");\n#endif\n#else\n#if 1\n   printf(\"g\\n\");\n#else\n   printf(\"h\\n\");\n#endif\n#endif\n\n#define DEF\n\n#ifdef DEF\n#ifdef DEF\n   printf(\"i\\n\");\n#else\n   printf(\"j\\n\");\n#endif\n#else\n#ifdef DEF\n   printf(\"k\\n\");\n#else\n   printf(\"l\\n\");\n#endif\n#endif\n\n#ifndef DEF\n#ifndef DEF\n   printf(\"m\\n\");\n#else\n   printf(\"n\\n\");\n#endif\n#else\n#ifndef DEF\n   printf(\"o\\n\");\n#else\n   printf(\"p\\n\");\n#endif\n#endif\n\n#define ONE 1\n#define ZERO 0\n\n#if ONE\n#if ZERO\n   printf(\"q\\n\");\n#else\n   printf(\"r\\n\");\n#endif\n#else\n#if ZERO\n   printf(\"s\\n\");\n#else\n   printf(\"t\\n\");\n#endif\n#endif\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/41_hashif.expect",
    "content": "#include test\nb\ng\ni\np\nr\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/42_function_pointer.c",
    "content": "#include <stdio.h>\n\nint fred(int p)\n{\n   printf(\"yo %d\\n\", p);\n   return 42;\n}\n\nint (*f)(int) = &fred;\n\nint main()\n{\n   printf(\"%d\\n\", (*f)(24));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/42_function_pointer.expect",
    "content": "yo 24\n42\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/43_void_param.c",
    "content": "#include <stdio.h>\n\nvoid fred(void)\n{\n   printf(\"yo\\n\");\n}\n\nint main()\n{\n   fred();\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/43_void_param.expect",
    "content": "yo\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/44_scoped_declarations.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n\n   for (a = 0; a < 2; a++)\n   {\n      int b = a;\n   }\n\n   printf(\"it's all good\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/44_scoped_declarations.expect",
    "content": "it's all good\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/45_empty_for.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int Count = 0;\n\n   for (;;)\n   {\n      Count++;\n      printf(\"%d\\n\", Count);\n      if (Count >= 10)\n         break;\n   }\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/45_empty_for.expect",
    "content": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/46_grep.c",
    "content": "/*\n * The  information  in  this  document  is  subject  to  change\n * without  notice  and  should not be construed as a commitment\n * by Digital Equipment Corporation or by DECUS.\n *\n * Neither Digital Equipment Corporation, DECUS, nor the authors\n * assume any responsibility for the use or reliability of  this\n * document or the described software.\n *\n *      Copyright (C) 1980, DECUS\n *\n * General permission to copy or modify, but not for profit,  is\n * hereby  granted,  provided that the above copyright notice is\n * included and reference made to  the  fact  that  reproduction\n * privileges were granted by DECUS.\n */\n#include <stdio.h>\n\n/*\n * grep\n *\n * Runs on the Decus compiler or on vms, On vms, define as:\n *      grep :== \"$disk:[account]grep\"      (native)\n *      grep :== \"$disk:[account]grep grep\" (Decus)\n * See below for more information.\n */\n\n#if 0\nchar    *documentation[] = {\n   \"grep searches a file for a given pattern.  Execute by\",\n   \"   grep [flags] regular_expression file_list\\n\",\n   \"Flags are single characters preceeded by '-':\",\n   \"   -c      Only a count of matching lines is printed\",\n   \"   -f      Print file name for matching lines switch, see below\",\n   \"   -n      Each line is preceeded by its line number\",\n   \"   -v      Only print non-matching lines\\n\",\n   \"The file_list is a list of files (wildcards are acceptable on RSX modes).\",\n   \"\\nThe file name is normally printed if there is a file given.\",\n   \"The -f flag reverses this action (print name no file, not if more).\\n\",\n   0 };\n\nchar    *patdoc[] = {\n   \"The regular_expression defines the pattern to search for.  Upper- and\",\n   \"lower-case are always ignored.  Blank lines never match.  The expression\",\n   \"should be quoted to prevent file-name translation.\",\n   \"x      An ordinary character (not mentioned below) matches that character.\",\n   \"'\\\\'    The backslash quotes any character.  \\\"\\\\$\\\" matches a dollar-sign.\",\n   \"'^'    A circumflex at the beginning of an expression matches the\",\n   \"       beginning of a line.\",\n   \"'$'    A dollar-sign at the end of an expression matches the end of a line.\",\n   \"'.'    A period matches any character except \\\"new-line\\\".\",\n   \"':a'   A colon matches a class of characters described by the following\",\n   \"':d'     character.  \\\":a\\\" matches any alphabetic, \\\":d\\\" matches digits,\",\n   \"':n'     \\\":n\\\" matches alphanumerics, \\\": \\\" matches spaces, tabs, and\",\n   \"': '     other control characters, such as new-line.\",\n   \"'*'    An expression followed by an asterisk matches zero or more\",\n   \"       occurrances of that expression: \\\"fo*\\\" matches \\\"f\\\", \\\"fo\\\"\",\n   \"       \\\"foo\\\", etc.\",\n   \"'+'    An expression followed by a plus sign matches one or more\",\n   \"       occurrances of that expression: \\\"fo+\\\" matches \\\"fo\\\", etc.\",\n   \"'-'    An expression followed by a minus sign optionally matches\",\n   \"       the expression.\",\n   \"'[]'   A string enclosed in square brackets matches any character in\",\n   \"       that string, but no others.  If the first character in the\",\n   \"       string is a circumflex, the expression matches any character\",\n   \"       except \\\"new-line\\\" and the characters in the string.  For\",\n   \"       example, \\\"[xyz]\\\" matches \\\"xx\\\" and \\\"zyx\\\", while \\\"[^xyz]\\\"\",\n   \"       matches \\\"abc\\\" but not \\\"axb\\\".  A range of characters may be\",\n   \"       specified by two characters separated by \\\"-\\\".  Note that,\",\n   \"       [a-z] matches alphabetics, while [z-a] never matches.\",\n   \"The concatenation of regular expressions is a regular expression.\",\n   0};\n#endif\n\n#define LMAX    512\n#define PMAX    256\n\n#define CHAR    1\n#define BOL     2\n#define EOL     3\n#define ANY     4\n#define CLASS   5\n#define NCLASS  6\n#define STAR    7\n#define PLUS    8\n#define MINUS   9\n#define ALPHA   10\n#define DIGIT   11\n#define NALPHA  12\n#define PUNCT   13\n#define RANGE   14\n#define ENDPAT  15\n\nint cflag=0, fflag=0, nflag=0, vflag=0, nfile=0, debug=0;\n\nchar *pp, lbuf[LMAX], pbuf[PMAX];\n\nchar *cclass();\nchar *pmatch();\n\n\n/*** Display a file name *******************************/\nvoid file(char *s)\n{\n   printf(\"File %s:\\n\", s);\n}\n\n/*** Report unopenable file ****************************/\nvoid cant(char *s)\n{\n   fprintf(stderr, \"%s: cannot open\\n\", s);\n}\n\n/*** Give good help ************************************/\nvoid help(char **hp)\n{\n   char   **dp;\n\n   for (dp = hp; *dp; ++dp)\n      printf(\"%s\\n\", *dp);\n}\n\n/*** Display usage summary *****************************/\nvoid usage(char *s)\n{\n   fprintf(stderr, \"?GREP-E-%s\\n\", s);\n   fprintf(stderr,\n         \"Usage: grep [-cfnv] pattern [file ...].  grep ? for help\\n\");\n   exit(1);\n}\n\n/*** Compile the pattern into global pbuf[] ************/\nvoid compile(char *source)\n{\n   char  *s;         /* Source string pointer     */\n   char  *lp;        /* Last pattern pointer      */\n   int   c;          /* Current character         */\n   int            o;          /* Temp                      */\n   char           *spp;       /* Save beginning of pattern */\n\n   s = source;\n   if (debug)\n      printf(\"Pattern = \\\"%s\\\"\\n\", s);\n   pp = pbuf;\n   while (c = *s++) {\n      /*\n       * STAR, PLUS and MINUS are special.\n       */\n      if (c == '*' || c == '+' || c == '-') {\n         if (pp == pbuf ||\n               (o=pp[-1]) == BOL ||\n               o == EOL ||\n               o == STAR ||\n               o == PLUS ||\n               o == MINUS)\n            badpat(\"Illegal occurrance op.\", source, s);\n         store(ENDPAT);\n         store(ENDPAT);\n         spp = pp;               /* Save pattern end     */\n         while (--pp > lp)       /* Move pattern down    */\n            *pp = pp[-1];        /* one byte             */\n         *pp =   (c == '*') ? STAR :\n            (c == '-') ? MINUS : PLUS;\n         pp = spp;               /* Restore pattern end  */\n         continue;\n      }\n      /*\n       * All the rest.\n       */\n      lp = pp;         /* Remember start       */\n      switch(c) {\n\n         case '^':\n            store(BOL);\n            break;\n\n         case '$':\n            store(EOL);\n            break;\n\n         case '.':\n            store(ANY);\n            break;\n\n         case '[':\n            s = cclass(source, s);\n            break;\n\n         case ':':\n            if (*s) {\n               switch(tolower(c = *s++)) {\n\n                  case 'a':\n                  case 'A':\n                     store(ALPHA);\n                     break;\n\n                  case 'd':\n                  case 'D':\n                     store(DIGIT);\n                     break;\n\n                  case 'n':\n                  case 'N':\n                     store(NALPHA);\n                     break;\n\n                  case ' ':\n                     store(PUNCT);\n                     break;\n\n                  default:\n                     badpat(\"Unknown : type\", source, s);\n\n               }\n               break;\n            }\n            else    badpat(\"No : type\", source, s);\n\n         case '\\\\':\n            if (*s)\n               c = *s++;\n\n         default:\n            store(CHAR);\n            store(tolower(c));\n      }\n   }\n   store(ENDPAT);\n   store(0);                /* Terminate string     */\n   if (debug) {\n      for (lp = pbuf; lp < pp;) {\n         if ((c = (*lp++ & 0377)) < ' ')\n            printf(\"\\\\%o \", c);\n         else    printf(\"%c \", c);\n      }\n      printf(\"\\n\");\n   }\n}\n\n/*** Compile a class (within []) ***********************/\nchar *cclass(char *source, char *src)\n   /* char       *source;   // Pattern start -- for error msg. */\n   /* char       *src;      // Class start */\n{\n   char   *s;        /* Source pointer    */\n   char   *cp;       /* Pattern start     */\n   int    c;         /* Current character */\n   int             o;         /* Temp              */\n\n   s = src;\n   o = CLASS;\n   if (*s == '^') {\n      ++s;\n      o = NCLASS;\n   }\n   store(o);\n   cp = pp;\n   store(0);                          /* Byte count      */\n   while ((c = *s++) && c!=']') {\n      if (c == '\\\\') {                /* Store quoted char    */\n         if ((c = *s++) == '\\0')      /* Gotta get something  */\n            badpat(\"Class terminates badly\", source, s);\n         else    store(tolower(c));\n      }\n      else if (c == '-' &&\n            (pp - cp) > 1 && *s != ']' && *s != '\\0') {\n         c = pp[-1];             /* Range start     */\n         pp[-1] = RANGE;         /* Range signal    */\n         store(c);               /* Re-store start  */\n         c = *s++;               /* Get end char and*/\n         store(tolower(c));      /* Store it        */\n      }\n      else {\n         store(tolower(c));      /* Store normal char */\n      }\n   }\n   if (c != ']')\n      badpat(\"Unterminated class\", source, s);\n   if ((c = (pp - cp)) >= 256)\n      badpat(\"Class too large\", source, s);\n   if (c == 0)\n      badpat(\"Empty class\", source, s);\n   *cp = c;\n   return(s);\n}\n\n/*** Store an entry in the pattern buffer **************/\nvoid store(int op)\n{\n   if (pp >= &pbuf[PMAX])\n      error(\"Pattern too complex\\n\");\n   *pp++ = op;\n}\n\n/*** Report a bad pattern specification ****************/\nvoid badpat(char *message, char *source, char *stop)\n   /* char  *message;       // Error message */\n   /* char  *source;        // Pattern start */\n   /* char  *stop;          // Pattern end   */\n{\n   fprintf(stderr, \"-GREP-E-%s, pattern is\\\"%s\\\"\\n\", message, source);\n   fprintf(stderr, \"-GREP-E-Stopped at byte %d, '%c'\\n\",\n         stop-source, stop[-1]);\n   error(\"?GREP-E-Bad pattern\\n\");\n}\n\n/*** Scan the file for the pattern in pbuf[] ***********/\nvoid grep(FILE *fp, char *fn)\n   /* FILE       *fp;       // File to process            */\n   /* char       *fn;       // File name (for -f option)  */\n{\n   int lno, count, m;\n\n   lno = 0;\n   count = 0;\n   while (fgets(lbuf, LMAX, fp)) {\n      ++lno;\n      m = match();\n      if ((m && !vflag) || (!m && vflag)) {\n         ++count;\n         if (!cflag) {\n            if (fflag && fn) {\n               file(fn);\n               fn = 0;\n            }\n            if (nflag)\n               printf(\"%d\\t\", lno);\n            printf(\"%s\\n\", lbuf);\n         }\n      }\n   }\n   if (cflag) {\n      if (fflag && fn)\n         file(fn);\n      printf(\"%d\\n\", count);\n   }\n}\n\n/*** Match line (lbuf) with pattern (pbuf) return 1 if match ***/\nvoid match()\n{\n   char   *l;        /* Line pointer       */\n\n   for (l = lbuf; *l; ++l) {\n      if (pmatch(l, pbuf))\n         return(1);\n   }\n   return(0);\n}\n\n/*** Match partial line with pattern *******************/\nchar *pmatch(char *line, char *pattern)\n   /* char               *line;     // (partial) line to match      */\n   /* char               *pattern;  // (partial) pattern to match   */\n{\n   char   *l;        /* Current line pointer         */\n   char   *p;        /* Current pattern pointer      */\n   char   c;         /* Current character            */\n   char            *e;        /* End for STAR and PLUS match  */\n   int             op;        /* Pattern operation            */\n   int             n;         /* Class counter                */\n   char            *are;      /* Start of STAR match          */\n\n   l = line;\n   if (debug > 1)\n      printf(\"pmatch(\\\"%s\\\")\\n\", line);\n   p = pattern;\n   while ((op = *p++) != ENDPAT) {\n      if (debug > 1)\n         printf(\"byte[%d] = 0%o, '%c', op = 0%o\\n\",\n               l-line, *l, *l, op);\n      switch(op) {\n\n         case CHAR:\n            if (tolower(*l++) != *p++)\n               return(0);\n            break;\n\n         case BOL:\n            if (l != lbuf)\n               return(0);\n            break;\n\n         case EOL:\n            if (*l != '\\0')\n               return(0);\n            break;\n\n         case ANY:\n            if (*l++ == '\\0')\n               return(0);\n            break;\n\n         case DIGIT:\n            if ((c = *l++) < '0' || (c > '9'))\n               return(0);\n            break;\n\n         case ALPHA:\n            c = tolower(*l++);\n            if (c < 'a' || c > 'z')\n               return(0);\n            break;\n\n         case NALPHA:\n            c = tolower(*l++);\n            if (c >= 'a' && c <= 'z')\n               break;\n            else if (c < '0' || c > '9')\n               return(0);\n            break;\n\n         case PUNCT:\n            c = *l++;\n            if (c == 0 || c > ' ')\n               return(0);\n            break;\n\n         case CLASS:\n         case NCLASS:\n            c = tolower(*l++);\n            n = *p++ & 0377;\n            do {\n               if (*p == RANGE) {\n                  p += 3;\n                  n -= 2;\n                  if (c >= p[-2] && c <= p[-1])\n                     break;\n               }\n               else if (c == *p++)\n                  break;\n            } while (--n > 1);\n            if ((op == CLASS) == (n <= 1))\n               return(0);\n            if (op == CLASS)\n               p += n - 2;\n            break;\n\n         case MINUS:\n            e = pmatch(l, p);       /* Look for a match    */\n            while (*p++ != ENDPAT); /* Skip over pattern   */\n            if (e)                  /* Got a match?        */\n               l = e;               /* Yes, update string  */\n            break;                  /* Always succeeds     */\n\n         case PLUS:                 /* One or more ...     */\n            if ((l = pmatch(l, p)) == 0)\n               return(0);           /* Gotta have a match  */\n         case STAR:                 /* Zero or more ...    */\n            are = l;                /* Remember line start */\n            while (*l && (e = pmatch(l, p)))\n               l = e;               /* Get longest match   */\n            while (*p++ != ENDPAT); /* Skip over pattern   */\n            while (l >= are) {      /* Try to match rest   */\n               if (e = pmatch(l, p))\n                  return(e);\n               --l;                 /* Nope, try earlier   */\n            }\n            return(0);              /* Nothing else worked */\n\n         default:\n            printf(\"Bad op code %d\\n\", op);\n            error(\"Cannot happen -- match\\n\");\n      }\n   }\n   return(l);\n}\n\n/*** Report an error ***********************************/\nvoid error(char *s)\n{\n   fprintf(stderr, \"%s\", s);\n   exit(1);\n}\n\n/*** Main program - parse arguments & grep *************/\nint main(int argc, char **argv)\n{\n   char   *p;\n   int    c, i;\n   int             gotpattern;\n\n   FILE            *f;\n\n   if (argc <= 1)\n      usage(\"No arguments\");\n   if (argc == 2 && argv[1][0] == '?' && argv[1][1] == 0) {\n      help(documentation);\n      help(patdoc);\n      return 0;\n   }\n   nfile = argc-1;\n   gotpattern = 0;\n   for (i=1; i < argc; ++i) {\n      p = argv[i];\n      if (*p == '-') {\n         ++p;\n         while (c = *p++) {\n            switch(tolower(c)) {\n\n               case '?':\n                  help(documentation);\n                  break;\n\n               case 'C':\n               case 'c':\n                  ++cflag;\n                  break;\n\n               case 'D':\n               case 'd':\n                  ++debug;\n                  break;\n\n               case 'F':\n               case 'f':\n                  ++fflag;\n                  break;\n\n               case 'n':\n               case 'N':\n                  ++nflag;\n                  break;\n\n               case 'v':\n               case 'V':\n                  ++vflag;\n                  break;\n\n               default:\n                  usage(\"Unknown flag\");\n            }\n         }\n         argv[i] = 0;\n         --nfile;\n      } else if (!gotpattern) {\n         compile(p);\n         argv[i] = 0;\n         ++gotpattern;\n         --nfile;\n      }\n   }\n   if (!gotpattern)\n      usage(\"No pattern\");\n   if (nfile == 0)\n      grep(stdin, 0);\n   else {\n      fflag = fflag ^ (nfile > 0);\n      for (i=1; i < argc; ++i) {\n         if (p = argv[i]) {\n            if ((f=fopen(p, \"r\")) == NULL)\n               cant(p);\n            else {\n               grep(f, p);\n               fclose(f);\n            }\n         }\n      }\n   }\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/47_switch_return.c",
    "content": "#include <stdio.h>\n\nvoid fred(int x)\n{\n   switch (x)\n   {\n      case 1: printf(\"1\\n\"); return;\n      case 2: printf(\"2\\n\"); break;\n      case 3: printf(\"3\\n\"); return;\n   }\n\n   printf(\"out\\n\");\n}\n\nint main()\n{\n   fred(1);\n   fred(2);\n   fred(3);\n\n   return 0;\n}    \n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/47_switch_return.expect",
    "content": "1\n2\nout\n3\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/48_nested_break.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n   int a;\n   char b;\n\n   a = 0;\n   while (a < 2)\n   {\n      printf(\"%d\", a++);\n      break;\n\n      b = 'A';\n      while (b < 'C')\n      {\n         printf(\"%c\", b++);\n      }\n      printf(\"e\");\n   }\n   printf(\"\\n\");\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/48_nested_break.expect",
    "content": "0\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/49_bracket_evaluation.c",
    "content": "#include <stdio.h>\n\nstruct point\n{\n   double x;\n   double y;\n};\n\nstruct point point_array[100];\n\nint main()\n{\n   int my_point = 10;\n\n   point_array[my_point].x = 12.34;\n   point_array[my_point].y = 56.78;\n\n   printf(\"%f, %f\\n\", point_array[my_point].x, point_array[my_point].y);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/49_bracket_evaluation.expect",
    "content": "12.340000, 56.780000\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/50_logical_second_arg.c",
    "content": "#include <stdio.h>\n\nint fred()\n{\n   printf(\"fred\\n\");\n   return 0;\n}\n\nint joe()\n{\n   printf(\"joe\\n\");\n   return 1;\n}\n\nint main()\n{\n   printf(\"%d\\n\", fred() && joe());\n   printf(\"%d\\n\", fred() || joe());\n   printf(\"%d\\n\", joe() && fred());\n   printf(\"%d\\n\", joe() || fred());\n   printf(\"%d\\n\", fred() && (1 + joe()));\n   printf(\"%d\\n\", fred() || (0 + joe()));\n   printf(\"%d\\n\", joe() && (0 + fred()));\n   printf(\"%d\\n\", joe() || (1 + fred()));\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/50_logical_second_arg.expect",
    "content": "fred\n0\nfred\njoe\n1\njoe\nfred\n0\njoe\n1\nfred\n0\nfred\njoe\n1\njoe\nfred\n0\njoe\n1\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/51_static.c",
    "content": "#include <stdio.h>\n\nstatic int fred = 1234;\nstatic int joe;\n\nvoid henry()\n{\n   static int fred = 4567;\n\n   printf(\"%d\\n\", fred);\n   fred++;\n}\n\nint main()\n{\n   printf(\"%d\\n\", fred);\n   henry();\n   henry();\n   henry();\n   henry();\n   printf(\"%d\\n\", fred);\n   fred = 8901;\n   joe = 2345;\n   printf(\"%d\\n\", fred);\n   printf(\"%d\\n\", joe);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/51_static.expect",
    "content": "1234\n4567\n4568\n4569\n4570\n1234\n8901\n2345\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/52_unnamed_enum.c",
    "content": "#include <stdio.h>\n\nenum fred { a, b, c };\n\nint main()\n{\n   printf(\"a=%d\\n\", a);\n   printf(\"b=%d\\n\", b);\n   printf(\"c=%d\\n\", c);\n\n   enum fred d;\n\n   typedef enum { e, f, g } h;\n   typedef enum { i, j, k } m;\n\n   printf(\"e=%d\\n\", e);\n   printf(\"f=%d\\n\", f);\n   printf(\"g=%d\\n\", g);\n\n   printf(\"i=%d\\n\", i);\n   printf(\"j=%d\\n\", j);\n   printf(\"k=%d\\n\", k);\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/52_unnamed_enum.expect",
    "content": "a=0\nb=1\nc=2\ne=0\nf=1\ng=2\ni=0\nj=1\nk=2\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/54_goto.c",
    "content": "#include <stdio.h>\n\nvoid fred()\n{\n   printf(\"In fred()\\n\");\n   goto done;\n   printf(\"In middle\\n\");\ndone:\n   printf(\"At end\\n\");\n}\n\nvoid joe()\n{\n   int b = 5678;\n\n   printf(\"In joe()\\n\");\n\n   {\n      int c = 1234;\n      printf(\"c = %d\\n\", c);\n      goto outer;\n      printf(\"uh-oh\\n\");\n   }\n\nouter:    \n\n   printf(\"done\\n\");\n}\n\nvoid henry()\n{\n   int a;\n\n   printf(\"In henry()\\n\");\n   goto inner;\n\n   {\n      int b;\ninner:    \n      b = 1234;\n      printf(\"b = %d\\n\", b);\n   }\n\n   printf(\"done\\n\");\n}\n\nint main()\n{\n   fred();\n   joe();\n   henry();\n\n   return 0;\n}\n\n/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/54_goto.expect",
    "content": "In fred()\nAt end\nIn joe()\nc = 1234\ndone\nIn henry()\nb = 1234\ndone\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/55_lshift_type.c",
    "content": "/* $Id: lshift-type.c 53089 2012-07-06 11:18:26Z vinc17/ypig $\n\nTests on left-shift type, written by Vincent Lefevre <vincent@vinc17.net>.\n\nISO C99 TC3 says: [6.5.7#3] \"The integer promotions are performed on\neach of the operands. The type of the result is that of the promoted\nleft operand.\"\n*/\n\n#include <stdio.h>\n\n#define PTYPE(M) ((M) < 0 || -(M) < 0 ? -1 : 1) * (int) sizeof((M)+0)\n#define CHECK(X,T) check(#X, PTYPE(X), PTYPE((X) << (T) 1))\n#define TEST1(X,T) do { CHECK(X,T); CHECK(X,unsigned T); } while (0)\n#define TEST2(X)                 \\\n  do                             \\\n    {                            \\\n      TEST1((X),short);          \\\n      TEST1((X),int);            \\\n      TEST1((X),long);           \\\n      TEST1((X),long long);      \\\n    }                            \\\n  while (0)\n#define TEST3(X,T) do { TEST2((T)(X)); TEST2((unsigned T)(X)); } while (0)\n#define TEST4(X)                 \\\n  do                             \\\n    {                            \\\n      TEST3((X),short);          \\\n      TEST3((X),int);            \\\n      TEST3((X),long);           \\\n      TEST3((X),long long);      \\\n    }                            \\\n while (0)\n\nstatic int debug, nfailed = 0;\n\nstatic void check (const char *s, int arg1, int shift)\n{\n  int failed = arg1 != shift;\n  if (debug || failed)\n    printf (\"%s %d %d\\n\", s, arg1, shift);\n  nfailed += failed;\n}\n\nint main (int argc, char **argv)\n{\n  debug = argc > 1;\n  TEST4(1);\n  TEST4(-1);\n  printf (\"%d test(s) failed\\n\", nfailed);\n  return nfailed != 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/55_lshift_type.expect",
    "content": "0 test(s) failed\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/LICENSE",
    "content": "The tests in this directory are either directly copied from the picoc project or\nare subsequently modified and added to for the purpose of TinyCC project. All\nthese modifications are licensed under the same terms as TinyCC as specified in\nthe file COPYING.\n\n=== picoc license ===\n\nCopyright (c) 2009-2011, Zik Saleeba\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without \nmodification, are permitted provided that the following conditions are \nmet:\n\n    * Redistributions of source code must retain the above copyright \n      notice, this list of conditions and the following disclaimer.\n      \n    * Redistributions in binary form must reproduce the above copyright \n      notice, this list of conditions and the following disclaimer in \n      the documentation and/or other materials provided with the \n      distribution.\n      \n    * Neither the name of the Zik Saleeba nor the names of its \n      contributors may be used to endorse or promote products derived \n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/tests2/Makefile",
    "content": "TOP = ..\ninclude $(TOP)/Makefile\nVPATH = $(top_srcdir)/tests2\n\nifeq ($(TARGETOS),Darwin)\n    CFLAGS+=-Wl,-flat_namespace,-undefined,warning\n    TCCFLAGS=-D_ANSI_SOURCE\n    export MACOSX_DEPLOYMENT_TARGET:=10.2\nendif\n\nifdef CONFIG_WIN32\n    TCCFLAGS=-I $(TOP)/win32/include -L$(TOP)\nendif\n\nTESTS=\t00_assignment.test \\\n\t\t01_comment.test \\\n\t\t02_printf.test \\\n\t\t03_struct.test \\\n\t\t04_for.test \\\n\t\t05_array.test \\\n\t\t06_case.test \\\n\t\t07_function.test \\\n\t\t08_while.test \\\n\t\t09_do_while.test \\\n\t\t10_pointer.test \\\n\t\t11_precedence.test \\\n\t\t12_hashdefine.test \\\n\t\t13_integer_literals.test \\\n\t\t14_if.test \\\n\t\t15_recursion.test \\\n\t\t16_nesting.test \\\n\t\t17_enum.test \\\n\t\t18_include.test \\\n\t\t19_pointer_arithmetic.test \\\n\t\t20_pointer_comparison.test \\\n\t\t21_char_array.test \\\n\t\t22_floating_point.test \\\n\t\t23_type_coercion.test \\\n\t\t24_math_library.test \\\n\t\t25_quicksort.test \\\n\t\t26_character_constants.test \\\n        27_sizeof.test \\\n\t\t28_strings.test \\\n\t\t29_array_address.test \\\n\t\t31_args.test \\\n\t\t32_led.test \\\n\t\t33_ternary_op.test \\\n\t\t35_sizeof.test \\\n\t\t36_array_initialisers.test \\\n\t\t37_sprintf.test \\\n\t\t38_multiple_array_index.test \\\n\t\t39_typedef.test \\\n\t\t40_stdio.test \\\n\t\t41_hashif.test \\\n        42_function_pointer.test \\\n\t\t43_void_param.test \\\n\t\t44_scoped_declarations.test \\\n\t\t45_empty_for.test \\\n\t\t47_switch_return.test \\\n\t\t48_nested_break.test \\\n\t\t49_bracket_evaluation.test \\\n\t\t50_logical_second_arg.test \\\n\t\t51_static.test \\\n\t\t52_unnamed_enum.test \\\n\t\t54_goto.test \\\n\t\t55_lshift_type.test\n\n\t\t# 30_hanoi.test \\ # seg fault in the code, gcc as well\n\t\t# 34_array_assignment.test \\ # array assignment is not in C standard\n        # 46_grep.test \\ # does not compile even with gcc\n\n# some tests do not pass on all platforms, remove them for now\nifeq ($(TARGETOS),Darwin)\n    TESTS := $(filter-out 40_stdio.test,$(TESTS))\nendif\nifdef CONFIG_WIN32\n    TESTS := $(filter-out 24_math_library.test,$(TESTS))\n    TESTS := $(filter-out 28_strings.test,$(TESTS))\nendif\n\n%.test: %.c %.expect\n\t@echo Test: $*...\n\t@if [ \"x`echo $* | grep args`\" != \"x\" ]; \\\n\tthen \\\n\t\t../tcc -B.. $(TCCFLAGS) -run $< - arg1 arg2 arg3 arg4 2>&1 >$*.output; \\\n\telse \\\n\t\t../tcc -B.. $(TCCFLAGS) -run $< 2>&1 >$*.output; \\\n\tfi\n\t@if diff -bu $(<:.c=.expect) $*.output ; \\\n\tthen \\\n        rm -f $*.output \\\n\telse \\\n\t\techo \"ERROR: test $*\"; \\\n\tfi\n\nall: test\n\ntest: $(TESTS)\n\n#  vim: set expandtab ts=4 sw=4 sts=4 tw=80 :\n\nclean:\n\trm -vf fred.txt\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/texi2pod.pl",
    "content": "#! /usr/bin/perl -w\n\n#   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.\n\n# This file is part of GNU CC.\n\n# GNU CC is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# GNU CC is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with GNU CC; see the file COPYING.  If not, write to\n# the Free Software Foundation, 59 Temple Place - Suite 330,\n# Boston MA 02111-1307, USA.\n\n# This does trivial (and I mean _trivial_) conversion of Texinfo\n# markup to Perl POD format.  It's intended to be used to extract\n# something suitable for a manpage from a Texinfo document.\n\n$output = 0;\n$skipping = 0;\n%sects = ();\n$section = \"\";\n@icstack = ();\n@endwstack = ();\n@skstack = ();\n@instack = ();\n$shift = \"\";\n%defs = ();\n$fnno = 1;\n$inf = \"\";\n$ibase = \"\";\n\nwhile ($_ = shift) {\n    if (/^-D(.*)$/) {\n\tif ($1 ne \"\") {\n\t    $flag = $1;\n\t} else {\n\t    $flag = shift;\n\t}\n\t$value = \"\";\n\t($flag, $value) = ($flag =~ /^([^=]+)(?:=(.+))?/);\n\tdie \"no flag specified for -D\\n\"\n\t    unless $flag ne \"\";\n\tdie \"flags may only contain letters, digits, hyphens, dashes and underscores\\n\"\n\t    unless $flag =~ /^[a-zA-Z0-9_-]+$/;\n\t$defs{$flag} = $value;\n    } elsif (/^-/) {\n\tusage();\n    } else {\n\t$in = $_, next unless defined $in;\n\t$out = $_, next unless defined $out;\n\tusage();\n    }\n}\n\nif (defined $in) {\n    $inf = gensym();\n    open($inf, \"<$in\") or die \"opening \\\"$in\\\": $!\\n\";\n    $ibase = $1 if $in =~ m|^(.+)/[^/]+$|;\n} else {\n    $inf = \\*STDIN;\n}\n\nif (defined $out) {\n    open(STDOUT, \">$out\") or die \"opening \\\"$out\\\": $!\\n\";\n}\n\nwhile(defined $inf) {\nwhile(<$inf>) {\n    # Certain commands are discarded without further processing.\n    /^\\@(?:\n\t [a-z]+index\t\t# @*index: useful only in complete manual\n\t |need\t\t\t# @need: useful only in printed manual\n\t |(?:end\\s+)?group\t# @group .. @end group: ditto\n\t |page\t\t\t# @page: ditto\n\t |node\t\t\t# @node: useful only in .info file\n\t |(?:end\\s+)?ifnottex   # @ifnottex .. @end ifnottex: use contents\n\t)\\b/x and next;\n\n    chomp;\n\n    # Look for filename and title markers.\n    /^\\@setfilename\\s+([^.]+)/ and $fn = $1, next;\n    /^\\@settitle\\s+([^.]+)/ and $tl = postprocess($1), next;\n\n    # Identify a man title but keep only the one we are interested in.\n    /^\\@c\\s+man\\s+title\\s+([A-Za-z0-9-]+)\\s+(.+)/ and do {\n\tif (exists $defs{$1}) {\n\t    $fn = $1;\n\t    $tl = postprocess($2);\n\t}\n\tnext;\n    };\n\n    # Look for blocks surrounded by @c man begin SECTION ... @c man end.\n    # This really oughta be @ifman ... @end ifman and the like, but such\n    # would require rev'ing all other Texinfo translators.\n    /^\\@c\\s+man\\s+begin\\s+([A-Z]+)\\s+([A-Za-z0-9-]+)/ and do {\n\t$output = 1 if exists $defs{$2};\n        $sect = $1;\n\tnext;\n    };\n    /^\\@c\\s+man\\s+begin\\s+([A-Z]+)/ and $sect = $1, $output = 1, next;\n    /^\\@c\\s+man\\s+end/ and do {\n\t$sects{$sect} = \"\" unless exists $sects{$sect};\n\t$sects{$sect} .= postprocess($section);\n\t$section = \"\";\n\t$output = 0;\n\tnext;\n    };\n\n    # handle variables\n    /^\\@set\\s+([a-zA-Z0-9_-]+)\\s*(.*)$/ and do {\n\t$defs{$1} = $2;\n\tnext;\n    };\n    /^\\@clear\\s+([a-zA-Z0-9_-]+)/ and do {\n\tdelete $defs{$1};\n\tnext;\n    };\n\n    next unless $output;\n\n    # Discard comments.  (Can't do it above, because then we'd never see\n    # @c man lines.)\n    /^\\@c\\b/ and next;\n\n    # End-block handler goes up here because it needs to operate even\n    # if we are skipping.\n    /^\\@end\\s+([a-z]+)/ and do {\n\t# Ignore @end foo, where foo is not an operation which may\n\t# cause us to skip, if we are presently skipping.\n\tmy $ended = $1;\n\tnext if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex)$/;\n\n\tdie \"\\@end $ended without \\@$ended at line $.\\n\" unless defined $endw;\n\tdie \"\\@$endw ended by \\@end $ended at line $.\\n\" unless $ended eq $endw;\n\n\t$endw = pop @endwstack;\n\n\tif ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex)$/) {\n\t    $skipping = pop @skstack;\n\t    next;\n\t} elsif ($ended =~ /^(?:example|smallexample|display)$/) {\n\t    $shift = \"\";\n\t    $_ = \"\";\t# need a paragraph break\n\t} elsif ($ended =~ /^(?:itemize|enumerate|[fv]?table)$/) {\n\t    $_ = \"\\n=back\\n\";\n\t    $ic = pop @icstack;\n\t} else {\n\t    die \"unknown command \\@end $ended at line $.\\n\";\n\t}\n    };\n\n    # We must handle commands which can cause skipping even while we\n    # are skipping, otherwise we will not process nested conditionals\n    # correctly.\n    /^\\@ifset\\s+([a-zA-Z0-9_-]+)/ and do {\n\tpush @endwstack, $endw;\n\tpush @skstack, $skipping;\n\t$endw = \"ifset\";\n\t$skipping = 1 unless exists $defs{$1};\n\tnext;\n    };\n\n    /^\\@ifclear\\s+([a-zA-Z0-9_-]+)/ and do {\n\tpush @endwstack, $endw;\n\tpush @skstack, $skipping;\n\t$endw = \"ifclear\";\n\t$skipping = 1 if exists $defs{$1};\n\tnext;\n    };\n\n    /^\\@(ignore|menu|iftex)\\b/ and do {\n\tpush @endwstack, $endw;\n\tpush @skstack, $skipping;\n\t$endw = $1;\n\t$skipping = 1;\n\tnext;\n    };\n\n    next if $skipping;\n\n    # Character entities.  First the ones that can be replaced by raw text\n    # or discarded outright:\n    s/\\@copyright\\{\\}/(c)/g;\n    s/\\@dots\\{\\}/.../g;\n    s/\\@enddots\\{\\}/..../g;\n    s/\\@([.!? ])/$1/g;\n    s/\\@[:-]//g;\n    s/\\@bullet(?:\\{\\})?/*/g;\n    s/\\@TeX\\{\\}/TeX/g;\n    s/\\@pounds\\{\\}/\\#/g;\n    s/\\@minus(?:\\{\\})?/-/g;\n    s/\\\\,/,/g;\n\n    # Now the ones that have to be replaced by special escapes\n    # (which will be turned back into text by unmunge())\n    s/&/&amp;/g;\n    s/\\@\\{/&lbrace;/g;\n    s/\\@\\}/&rbrace;/g;\n    s/\\@\\@/&at;/g;\n\n    # Inside a verbatim block, handle @var specially.\n    if ($shift ne \"\") {\n\ts/\\@var\\{([^\\}]*)\\}/<$1>/g;\n    }\n\n    # POD doesn't interpret E<> inside a verbatim block.\n    if ($shift eq \"\") {\n\ts/</&lt;/g;\n\ts/>/&gt;/g;\n    } else {\n\ts/</&LT;/g;\n\ts/>/&GT;/g;\n    }\n\n    # Single line command handlers.\n\n    /^\\@include\\s+(.+)$/ and do {\n\tpush @instack, $inf;\n\t$inf = gensym();\n\n\t# Try cwd and $ibase.\n\topen($inf, \"<\" . $1) \n\t    or open($inf, \"<\" . $ibase . \"/\" . $1)\n\t\tor die \"cannot open $1 or $ibase/$1: $!\\n\";\n\tnext;\n    };\n\n    /^\\@(?:section|unnumbered|unnumberedsec|center)\\s+(.+)$/\n\tand $_ = \"\\n=head2 $1\\n\";\n    /^\\@subsection\\s+(.+)$/\n\tand $_ = \"\\n=head3 $1\\n\";\n\n    # Block command handlers:\n    /^\\@itemize\\s+(\\@[a-z]+|\\*|-)/ and do {\n\tpush @endwstack, $endw;\n\tpush @icstack, $ic;\n\t$ic = $1;\n\t$_ = \"\\n=over 4\\n\";\n\t$endw = \"itemize\";\n    };\n\n    /^\\@enumerate(?:\\s+([a-zA-Z0-9]+))?/ and do {\n\tpush @endwstack, $endw;\n\tpush @icstack, $ic;\n\tif (defined $1) {\n\t    $ic = $1 . \".\";\n\t} else {\n\t    $ic = \"1.\";\n\t}\n\t$_ = \"\\n=over 4\\n\";\n\t$endw = \"enumerate\";\n    };\n\n    /^\\@([fv]?table)\\s+(\\@[a-z]+)/ and do {\n\tpush @endwstack, $endw;\n\tpush @icstack, $ic;\n\t$endw = $1;\n\t$ic = $2;\n\t$ic =~ s/\\@(?:samp|strong|key|gcctabopt|option|env)/B/;\n\t$ic =~ s/\\@(?:code|kbd)/C/;\n\t$ic =~ s/\\@(?:dfn|var|emph|cite|i)/I/;\n\t$ic =~ s/\\@(?:file)/F/;\n\t$_ = \"\\n=over 4\\n\";\n    };\n\n    /^\\@((?:small)?example|display)/ and do {\n\tpush @endwstack, $endw;\n\t$endw = $1;\n\t$shift = \"\\t\";\n\t$_ = \"\";\t# need a paragraph break\n    };\n\n    /^\\@itemx?\\s*(.+)?$/ and do {\n\tif (defined $1) {\n\t    # Entity escapes prevent munging by the <> processing below.\n\t    $_ = \"\\n=item $ic\\&LT;$1\\&GT;\\n\";\n\t} else {\n\t    $_ = \"\\n=item $ic\\n\";\n\t    $ic =~ y/A-Ya-y/B-Zb-z/;\n\t    $ic =~ s/(\\d+)/$1 + 1/eg;\n\t}\n    };\n\n    $section .= $shift.$_.\"\\n\";\n}\n# End of current file.\nclose($inf);\n$inf = pop @instack;\n}\n\ndie \"No filename or title\\n\" unless defined $fn && defined $tl;\n\n$sects{NAME} = \"$fn \\- $tl\\n\";\n$sects{FOOTNOTES} .= \"=back\\n\" if exists $sects{FOOTNOTES};\n\nfor $sect (qw(NAME SYNOPSIS DESCRIPTION OPTIONS ENVIRONMENT FILES\n\t      BUGS NOTES FOOTNOTES SEEALSO AUTHOR COPYRIGHT)) {\n    if(exists $sects{$sect}) {\n\t$head = $sect;\n\t$head =~ s/SEEALSO/SEE ALSO/;\n\tprint \"=head1 $head\\n\\n\";\n\tprint scalar unmunge ($sects{$sect});\n\tprint \"\\n\";\n    }\n}\n\nsub usage\n{\n    die \"usage: $0 [-D toggle...] [infile [outfile]]\\n\";\n}\n\nsub postprocess\n{\n    local $_ = $_[0];\n\n    # @value{foo} is replaced by whatever 'foo' is defined as.\n    while (m/(\\@value\\{([a-zA-Z0-9_-]+)\\})/g) {\n\tif (! exists $defs{$2}) {\n\t    print STDERR \"Option $2 not defined\\n\";\n\t    s/\\Q$1\\E//;\n\t} else {\n\t    $value = $defs{$2};\n\t    s/\\Q$1\\E/$value/;\n\t}\n    }\n\n    # Formatting commands.\n    # Temporary escape for @r.\n    s/\\@r\\{([^\\}]*)\\}/R<$1>/g;\n    s/\\@(?:dfn|var|emph|cite|i)\\{([^\\}]*)\\}/I<$1>/g;\n    s/\\@(?:code|kbd)\\{([^\\}]*)\\}/C<$1>/g;\n    s/\\@(?:gccoptlist|samp|strong|key|option|env|command|b)\\{([^\\}]*)\\}/B<$1>/g;\n    s/\\@sc\\{([^\\}]*)\\}/\\U$1/g;\n    s/\\@file\\{([^\\}]*)\\}/F<$1>/g;\n    s/\\@w\\{([^\\}]*)\\}/S<$1>/g;\n    s/\\@(?:dmn|math)\\{([^\\}]*)\\}/$1/g;\n\n    # Cross references are thrown away, as are @noindent and @refill.\n    # (@noindent is impossible in .pod, and @refill is unnecessary.)\n    # @* is also impossible in .pod; we discard it and any newline that\n    # follows it.  Similarly, our macro @gol must be discarded.\n\n    s/\\(?\\@xref\\{(?:[^\\}]*)\\}(?:[^.<]|(?:<[^<>]*>))*\\.\\)?//g;\n    s/\\s+\\(\\@pxref\\{(?:[^\\}]*)\\}\\)//g;\n    s/;\\s+\\@pxref\\{(?:[^\\}]*)\\}//g;\n    s/\\@noindent\\s*//g;\n    s/\\@refill//g;\n    s/\\@gol//g;\n    s/\\@\\*\\s*\\n?//g;\n\n    # @uref can take one, two, or three arguments, with different\n    # semantics each time.  @url and @email are just like @uref with\n    # one argument, for our purposes.\n    s/\\@(?:uref|url|email)\\{([^\\},]*)\\}/&lt;B<$1>&gt;/g;\n    s/\\@uref\\{([^\\},]*),([^\\},]*)\\}/$2 (C<$1>)/g;\n    s/\\@uref\\{([^\\},]*),([^\\},]*),([^\\},]*)\\}/$3/g;\n\n    # Turn B<blah I<blah> blah> into B<blah> I<blah> B<blah> to\n    # match Texinfo semantics of @emph inside @samp.  Also handle @r\n    # inside bold.\n    s/&LT;/</g;\n    s/&GT;/>/g;\n    1 while s/B<((?:[^<>]|I<[^<>]*>)*)R<([^>]*)>/B<$1>${2}B</g;\n    1 while (s/B<([^<>]*)I<([^>]+)>/B<$1>I<$2>B</g);\n    1 while (s/I<([^<>]*)B<([^>]+)>/I<$1>B<$2>I</g);\n    s/[BI]<>//g;\n    s/([BI])<(\\s+)([^>]+)>/$2$1<$3>/g;\n    s/([BI])<([^>]+?)(\\s+)>/$1<$2>$3/g;\n\n    # Extract footnotes.  This has to be done after all other\n    # processing because otherwise the regexp will choke on formatting\n    # inside @footnote.\n    while (/\\@footnote/g) {\n\ts/\\@footnote\\{([^\\}]+)\\}/[$fnno]/;\n\tadd_footnote($1, $fnno);\n\t$fnno++;\n    }\n\n    return $_;\n}\n\nsub unmunge\n{\n    # Replace escaped symbols with their equivalents.\n    local $_ = $_[0];\n\n    s/&lt;/E<lt>/g;\n    s/&gt;/E<gt>/g;\n    s/&lbrace;/\\{/g;\n    s/&rbrace;/\\}/g;\n    s/&at;/\\@/g;\n    s/&amp;/&/g;\n    return $_;\n}\n\nsub add_footnote\n{\n    unless (exists $sects{FOOTNOTES}) {\n\t$sects{FOOTNOTES} = \"\\n=over 4\\n\\n\";\n    }\n\n    $sects{FOOTNOTES} .= \"=item $fnno.\\n\\n\"; $fnno++;\n    $sects{FOOTNOTES} .= $_[0];\n    $sects{FOOTNOTES} .= \"\\n\\n\";\n}\n\n# stolen from Symbol.pm\n{\n    my $genseq = 0;\n    sub gensym\n    {\n\tmy $name = \"GEN\" . $genseq++;\n\tmy $ref = \\*{$name};\n\tdelete $::{$name};\n\treturn $ref;\n    }\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/ucontext.h",
    "content": "/*  Android NDK doesn't have its own ucontext.h */\r\n#ifndef ucontext_h_seen\r\n#define ucontext_h_seen\r\n\r\n#include <asm/sigcontext.h>       /* for sigcontext */\r\n#include <asm/signal.h>           /* for stack_t */\r\n\r\ntypedef struct ucontext {\r\n\tunsigned long uc_flags;\r\n\tstruct ucontext *uc_link;\r\n\tstack_t uc_stack;\r\n\tstruct sigcontext uc_mcontext;\r\n\tunsigned long uc_sigmask;\r\n} ucontext_t;\r\n\r\n#endif"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/build-tcc.bat",
    "content": "@rem ----------------------------------------------------\n@rem batch file to build tcc using mingw gcc\n@rem ----------------------------------------------------\n\n@set /p VERSION= < ..\\VERSION\necho>..\\config.h #define TCC_VERSION \"%VERSION%\"\n\n@if _%PROCESSOR_ARCHITEW6432%_==_AMD64_ goto x86_64\n@if _%PROCESSOR_ARCHITECTURE%_==_AMD64_ goto x86_64\n\n@set target=-DTCC_TARGET_PE -DTCC_TARGET_I386\n@set CC=gcc -Os -s -fno-strict-aliasing\n@set P=32\n@goto tools\n\n:x86_64\n@set target=-DTCC_TARGET_PE -DTCC_TARGET_X86_64\n@rem mingw 64 has an ICE with -Os\n@set CC=x86_64-pc-mingw32-gcc -O0 -s -fno-strict-aliasing\n@set P=64\n@goto tools\n\n:tools\n%CC% %target% tools/tiny_impdef.c -o tiny_impdef.exe\n%CC% %target% tools/tiny_libmaker.c -o tiny_libmaker.exe\n\n:libtcc\nif not exist libtcc\\nul mkdir libtcc\ncopy ..\\libtcc.h libtcc\\libtcc.h\n%CC% %target% -shared -DLIBTCC_AS_DLL -DONE_SOURCE ../libtcc.c -o libtcc.dll -Wl,-out-implib,libtcc/libtcc.a\ntiny_impdef libtcc.dll -o libtcc/libtcc.def\n\n:tcc\n%CC% %target% ../tcc.c -o tcc.exe -ltcc -Llibtcc\n\n:copy_std_includes\ncopy ..\\include\\*.h include\n\n:libtcc1.a\n.\\tcc %target% -c ../lib/libtcc1.c\n.\\tcc %target% -c lib/crt1.c\n.\\tcc %target% -c lib/wincrt1.c\n.\\tcc %target% -c lib/dllcrt1.c\n.\\tcc %target% -c lib/dllmain.c\n.\\tcc %target% -c lib/chkstk.S\ngoto lib%P%\n\n:lib32\n.\\tcc %target% -c ../lib/alloca86.S\n.\\tcc %target% -c ../lib/alloca86-bt.S\n.\\tcc %target% -c ../lib/bcheck.c\ntiny_libmaker lib/libtcc1.a libtcc1.o alloca86.o alloca86-bt.o crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o bcheck.o\n@goto the_end\n\n:lib64\n.\\tcc %target% -c ../lib/alloca86_64.S\ntiny_libmaker lib/libtcc1.a libtcc1.o alloca86_64.o crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o\n\n:the_end\ndel *.o\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/examples/dll.c",
    "content": "//+---------------------------------------------------------------------------\n//\n//  dll.c - Windows DLL example - dynamically linked part\n//\n\n#include <windows.h>\n#define DLL_EXPORT __declspec(dllexport)\n\nDLL_EXPORT void HelloWorld (void)\n{\n    MessageBox (0, \"Hello World!\", \"From DLL\", MB_ICONINFORMATION);\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/examples/fib.c",
    "content": "#include <stdio.h>\n\nint fib(n)\n{\n\tif (n <= 2)\n\t\treturn 1;\n\telse\n\t\treturn fib(n-1) + fib(n-2);\n}\n\nint main(int argc, char **argv) \n{\n\tint n;\n\tif (argc < 2) {\n\t\tprintf(\"usage: fib n\\n\"\n\t\t\t   \"Compute nth Fibonacci number\\n\");\n\t\treturn 1;\n\t}\n\t\t\n\tn = atoi(argv[1]);\n\tprintf(\"fib(%d) = %d\\n\", n, fib(n));\n\treturn 0;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/examples/hello_dll.c",
    "content": "//+---------------------------------------------------------------------------\n//\n//  HELLO_DLL.C - Windows DLL example - main application part\n//\n\n#include <windows.h>\n\nvoid HelloWorld (void);\n\nint WINAPI WinMain(\n\tHINSTANCE hInstance,\n\tHINSTANCE hPrevInstance,\n\tLPSTR     lpCmdLine,\n\tint       nCmdShow)\n{\n\tHelloWorld();\n\treturn 0;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/examples/hello_win.c",
    "content": "//+---------------------------------------------------------------------------\n//\n//  HELLO_WIN.C - Windows GUI 'Hello World!' Example\n//\n//+---------------------------------------------------------------------------\n\n#include <windows.h>\n\n#define APPNAME \"HELLO_WIN\"\n\nchar szAppName[] = APPNAME; // The name of this application\nchar szTitle[]   = APPNAME; // The title bar text\nconst char *pWindowText;\n\nvoid CenterWindow(HWND hWnd);\n\n//+---------------------------------------------------------------------------\n//\n//  Function:   WndProc\n//\n//  Synopsis:   very unusual type of function - gets called by system to\n//              process windows messages.\n//\n//  Arguments:  same as always.\n//----------------------------------------------------------------------------\n\nLRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\n{\n    switch (message) {\n\n        // ----------------------- first and last\n        case WM_CREATE:\n            CenterWindow(hwnd);\n            break;\n\n        case WM_DESTROY:\n            PostQuitMessage(0);\n            break;\n\n        // ----------------------- get out of it...\n        case WM_RBUTTONUP:\n            DestroyWindow(hwnd);\n            break;\n\n        case WM_KEYDOWN:\n            if (VK_ESCAPE == wParam)\n                DestroyWindow(hwnd);\n            break;\n\n        // ----------------------- display our minimal info\n        case WM_PAINT:\n        {\n            PAINTSTRUCT ps;\n            HDC         hdc;\n            RECT        rc;\n            hdc = BeginPaint(hwnd, &ps);\n\n            GetClientRect(hwnd, &rc);\n            SetTextColor(hdc, RGB(240,240,96));\n            SetBkMode(hdc, TRANSPARENT);\n            DrawText(hdc, pWindowText, -1, &rc, DT_CENTER|DT_SINGLELINE|DT_VCENTER);\n\n            EndPaint(hwnd, &ps);\n            break;\n        }\n\n        // ----------------------- let windows do all other stuff\n        default:\n            return DefWindowProc(hwnd, message, wParam, lParam);\n    }\n    return 0;\n}\n\n//+---------------------------------------------------------------------------\n//\n//  Function:   WinMain\n//\n//  Synopsis:   standard entrypoint for GUI Win32 apps\n//\n//----------------------------------------------------------------------------\nint APIENTRY WinMain(\n        HINSTANCE hInstance,\n        HINSTANCE hPrevInstance,\n        LPSTR lpCmdLine,\n        int nCmdShow\n        )\n{\n    MSG msg;\n    WNDCLASS wc;\n    HWND hwnd;\n\n    pWindowText = lpCmdLine[0] ? lpCmdLine : \"Hello Windows!\";\n\n    // Fill in window class structure with parameters that describe\n    // the main window.\n\n    ZeroMemory(&wc, sizeof wc);\n    wc.hInstance     = hInstance;\n    wc.lpszClassName = szAppName;\n    wc.lpfnWndProc   = (WNDPROC)WndProc;\n    wc.style         = CS_DBLCLKS|CS_VREDRAW|CS_HREDRAW;\n    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);\n    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);\n    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);\n\n    if (FALSE == RegisterClass(&wc))\n        return 0;\n\n    // create the browser\n    hwnd = CreateWindow(\n        szAppName,\n        szTitle,\n        WS_OVERLAPPEDWINDOW|WS_VISIBLE,\n        CW_USEDEFAULT,\n        CW_USEDEFAULT,\n        360,//CW_USEDEFAULT,\n        240,//CW_USEDEFAULT,\n        0,\n        0,\n        hInstance,\n        0);\n\n    if (NULL == hwnd)\n        return 0;\n\n    // Main message loop:\n    while (GetMessage(&msg, NULL, 0, 0) > 0) {\n        TranslateMessage(&msg);\n        DispatchMessage(&msg);\n    }\n\n    return msg.wParam;\n}\n\n//+---------------------------------------------------------------------------\n\n//+---------------------------------------------------------------------------\n\nvoid CenterWindow(HWND hwnd_self)\n{\n    HWND hwnd_parent;\n    RECT rw_self, rc_parent, rw_parent;\n    int xpos, ypos;\n\n    hwnd_parent = GetParent(hwnd_self);\n    if (NULL == hwnd_parent)\n        hwnd_parent = GetDesktopWindow();\n\n    GetWindowRect(hwnd_parent, &rw_parent);\n    GetClientRect(hwnd_parent, &rc_parent);\n    GetWindowRect(hwnd_self, &rw_self);\n\n    xpos = rw_parent.left + (rc_parent.right + rw_self.left - rw_self.right) / 2;\n    ypos = rw_parent.top + (rc_parent.bottom + rw_self.top - rw_self.bottom) / 2;\n\n    SetWindowPos(\n        hwnd_self, NULL,\n        xpos, ypos, 0, 0,\n        SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE\n        );\n}\n\n//+---------------------------------------------------------------------------\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/_mingw.h",
    "content": "/*\n * _mingw.h\n *\n *  This file is for TinyCC and not part of the Mingw32 package.\n *\n *  THIS SOFTWARE IS NOT COPYRIGHTED\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n */\n\n#ifndef __MINGW_H\n#define __MINGW_H\n\n/* some winapi files define these before including _mingw.h --> */\n#undef __cdecl\n#undef _X86_\n#undef WIN32\n/* <-- */\n\n#include <stddef.h>\n#include <stdarg.h>\n\n#define __int8 char\n#define __int16 short\n#define __int32 int\n#define __int64 long long\n\n#define __cdecl __attribute__((__cdecl__))\n#define __declspec(x) __attribute__((x))\n#define __unaligned __attribute__((packed))\n#define __fastcall __attribute__((fastcall))\n\n#define __MSVCRT__ 1\n#undef _MSVCRT_\n#define __MINGW_IMPORT extern __declspec(dllimport)\n#define __MINGW_ATTRIB_NORETURN\n#define __MINGW_ATTRIB_CONST\n#define __MINGW_ATTRIB_DEPRECATED\n#define __MINGW_ATTRIB_MALLOC\n#define __MINGW_ATTRIB_PURE\n#define __MINGW_ATTRIB_NONNULL(arg)\n#define __MINGW_NOTHROW\n#define __GNUC_VA_LIST\n\n#define _CRTIMP extern\n#define __CRT_INLINE extern __inline__\n\n#define _CRT_ALIGN(x) __attribute__((aligned(x)))\n#define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))\n#define _CRT_PACKING 8\n#define __CRT_UNALIGNED\n#define _CONST_RETURN\n\n#define __CRT_STRINGIZE(_Value) #_Value\n#define _CRT_STRINGIZE(_Value) __CRT_STRINGIZE(_Value)\n#define __CRT_WIDE(_String) L ## _String\n#define _CRT_WIDE(_String) __CRT_WIDE(_String)\n\n#ifdef _WIN64\n#define __stdcall\n#define _AMD64_ 1\n#define __x86_64 1\n#define USE_MINGW_SETJMP_TWO_ARGS\n#define mingw_getsp tinyc_getbp\n#define __TRY__\n#else\n#define __stdcall __attribute__((__stdcall__))\n#define _X86_ 1\n#define WIN32 1\n#define _USE_32BIT_TIME_T\n#define __TRY__ void __try__(void**), *_sehrec[6]; __try__(_sehrec);\n#endif\n\n/* in stddef.h */\n#define _SIZE_T_DEFINED\n#define _SSIZE_T_DEFINED\n#define _PTRDIFF_T_DEFINED\n#define _WCHAR_T_DEFINED\n#define _UINTPTR_T_DEFINED\n#define _INTPTR_T_DEFINED\n\n#define _INTEGRAL_MAX_BITS 64\n\ntypedef long __time32_t;\n#define _TIME32_T_DEFINED\ntypedef __int64 __time64_t;\n#define _TIME64_T_DEFINED\n#ifdef _USE_32BIT_TIME_T\ntypedef __time32_t time_t;\n#define _TIME_T_DEFINED\n#else\ntypedef __time64_t time_t;\n#define _TIME_T_DEFINED\n#endif\n\ntypedef unsigned long size_t;\n#define _SIZE_T_DEFINED\ntypedef long ssize_t;\n#define _SSIZE_T_DEFINED\n\ntypedef unsigned int wint_t;\ntypedef unsigned short wctype_t;\n#define _WCTYPE_T_DEFINED\ntypedef unsigned short wchar_t;\n#define _WCHAR_T_DEFINED\n\ntypedef int errno_t;\n#define _ERRCODE_DEFINED\n\ntypedef struct threadlocaleinfostruct *pthreadlocinfo;\ntypedef struct threadmbcinfostruct *pthreadmbcinfo;\ntypedef struct localeinfo_struct _locale_tstruct,*_locale_t;\n\n/* for winapi */\n#define _ANONYMOUS_UNION\n#define _ANONYMOUS_STRUCT\n#define DECLSPEC_NORETURN\n#define DECLARE_STDCALL_P(type) __stdcall type\n#define NOSERVICE 1\n#define NOMCX 1\n#define NOIME 1\n#ifndef WIN32_LEAN_AND_MEAN\n# define WIN32_LEAN_AND_MEAN 1\n#endif\n#ifndef WINVER\n# define WINVER 0x0502\n#endif\n#ifndef _WIN32_WINNT\n# define _WIN32_WINNT 0x502\n#endif\n\n#endif /* __MINGW_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/assert.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef __ASSERT_H_\n#define __ASSERT_H_\n\n#include <_mingw.h>\n#ifdef __cplusplus\n#include <stdlib.h>\n#endif\n\n#ifdef NDEBUG\n#ifndef assert\n#define assert(_Expression) ((void)0)\n#endif\n#else\n\n#ifndef _CRT_TERMINATE_DEFINED\n#define _CRT_TERMINATE_DEFINED\n  void __cdecl __MINGW_NOTHROW exit(int _Code) __MINGW_ATTRIB_NORETURN;\n _CRTIMP void __cdecl __MINGW_NOTHROW _exit(int _Code) __MINGW_ATTRIB_NORETURN;\n#if !defined __NO_ISOCEXT /* extern stub in static libmingwex.a */\n/* C99 function name */\nvoid __cdecl _Exit(int) __MINGW_ATTRIB_NORETURN;\n__CRT_INLINE __MINGW_ATTRIB_NORETURN void __cdecl _Exit(int status)\n{  _exit(status); }\n#endif\n\n#pragma push_macro(\"abort\")\n#undef abort\n  void __cdecl __declspec(noreturn) abort(void);\n#pragma pop_macro(\"abort\")\n\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nextern void __cdecl _wassert(const wchar_t *_Message,const wchar_t *_File,unsigned _Line);\n\n#ifdef __cplusplus\n}\n#endif\n\n#ifndef assert\n#define assert(_Expression) (void)((!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression),_CRT_WIDE(__FILE__),__LINE__),0))\n#endif\n\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/conio.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_CONIO\n#define _INC_CONIO\n\n#include <_mingw.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  _CRTIMP char *_cgets(char *_Buffer);\n  _CRTIMP int __cdecl _cprintf(const char *_Format,...);\n  _CRTIMP int __cdecl _cputs(const char *_Str);\n  _CRTIMP int __cdecl _cscanf(const char *_Format,...);\n  _CRTIMP int __cdecl _cscanf_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _getch(void);\n  _CRTIMP int __cdecl _getche(void);\n  _CRTIMP int __cdecl _vcprintf(const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cprintf_p(const char *_Format,...);\n  _CRTIMP int __cdecl _vcprintf_p(const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cprintf_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcprintf_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _cprintf_p_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcprintf_p_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _kbhit(void);\n\n#if defined(_X86_) && !defined(__x86_64)\n  int __cdecl _inp(unsigned short);\n  unsigned short __cdecl _inpw(unsigned short);\n  unsigned long __cdecl _inpd(unsigned short);\n  int __cdecl _outp(unsigned short,int);\n  unsigned short __cdecl _outpw(unsigned short,unsigned short);\n  unsigned long __cdecl _outpd(unsigned short,unsigned long);\n#endif\n\n  _CRTIMP int __cdecl _putch(int _Ch);\n  _CRTIMP int __cdecl _ungetch(int _Ch);\n  _CRTIMP int __cdecl _getch_nolock(void);\n  _CRTIMP int __cdecl _getche_nolock(void);\n  _CRTIMP int __cdecl _putch_nolock(int _Ch);\n  _CRTIMP int __cdecl _ungetch_nolock(int _Ch);\n\n#ifndef _WCONIO_DEFINED\n#define _WCONIO_DEFINED\n\n#ifndef WEOF\n#define WEOF (wint_t)(0xFFFF)\n#endif\n\n  _CRTIMP wchar_t *_cgetws(wchar_t *_Buffer);\n  _CRTIMP wint_t __cdecl _getwch(void);\n  _CRTIMP wint_t __cdecl _getwche(void);\n  _CRTIMP wint_t __cdecl _putwch(wchar_t _WCh);\n  _CRTIMP wint_t __cdecl _ungetwch(wint_t _WCh);\n  _CRTIMP int __cdecl _cputws(const wchar_t *_String);\n  _CRTIMP int __cdecl _cwprintf(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cwprintf_p(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vcwprintf_p(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cwprintf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _cwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP wint_t __cdecl _putwch_nolock(wchar_t _WCh);\n  _CRTIMP wint_t __cdecl _getwch_nolock(void);\n  _CRTIMP wint_t __cdecl _getwche_nolock(void);\n  _CRTIMP wint_t __cdecl _ungetwch_nolock(wint_t _WCh);\n#endif\n\n#ifndef\tNO_OLDNAMES\n  char *__cdecl cgets(char *_Buffer);\n  int __cdecl cprintf(const char *_Format,...);\n  int __cdecl cputs(const char *_Str);\n  int __cdecl cscanf(const char *_Format,...);\n  int __cdecl getch(void);\n  int __cdecl getche(void);\n  int __cdecl kbhit(void);\n  int __cdecl putch(int _Ch);\n  int __cdecl ungetch(int _Ch);\n\n#if (defined(_X86_) && !defined(__x86_64))\n  int __cdecl inp(unsigned short);\n  unsigned short __cdecl inpw(unsigned short);\n  int __cdecl outp(unsigned short,int);\n  unsigned short __cdecl outpw(unsigned short,unsigned short);\n#endif\n\n  /* I/O intrin functions.  */\n  __CRT_INLINE unsigned char __inbyte(unsigned short Port)\n  {\n      unsigned char value;\n      __asm__ __volatile__ (\"inb %w1,%b0\"\n          : \"=a\" (value)\n          : \"Nd\" (Port));\n      return value;\n  }\n  __CRT_INLINE unsigned short __inword(unsigned short Port)\n  {\n      unsigned short value;\n      __asm__ __volatile__ (\"inw %w1,%w0\"\n          : \"=a\" (value)\n          : \"Nd\" (Port));\n      return value;\n  }\n  __CRT_INLINE unsigned long __indword(unsigned short Port)\n  {\n      unsigned long value;\n      __asm__ __volatile__ (\"inl %w1,%0\"\n          : \"=a\" (value)\n          : \"Nd\" (Port));\n      return value;\n  }\n  __CRT_INLINE void __outbyte(unsigned short Port,unsigned char Data)\n  {\n      __asm__ __volatile__ (\"outb %b0,%w1\"\n          :\n          : \"a\" (Data), \"Nd\" (Port));\n  }\n  __CRT_INLINE void __outword(unsigned short Port,unsigned short Data)\n  {\n      __asm__ __volatile__ (\"outw %w0,%w1\"\n          :\n          : \"a\" (Data), \"Nd\" (Port));\n  }\n  __CRT_INLINE void __outdword(unsigned short Port,unsigned long Data)\n  {\n      __asm__ __volatile__ (\"outl %0,%w1\"\n          :\n          : \"a\" (Data), \"Nd\" (Port));\n  }\n  __CRT_INLINE void __inbytestring(unsigned short Port,unsigned char *Buffer,unsigned long Count)\n  {\n\t__asm__ __volatile__ (\n\t\t\"cld ; rep ; insb \" \n\t\t: \"=D\" (Buffer), \"=c\" (Count)\n\t\t: \"d\"(Port), \"0\"(Buffer), \"1\" (Count)\n\t\t);\n  }\n  __CRT_INLINE void __inwordstring(unsigned short Port,unsigned short *Buffer,unsigned long Count)\n  {\n\t__asm__ __volatile__ (\n\t\t\"cld ; rep ; insw \" \n\t\t: \"=D\" (Buffer), \"=c\" (Count)\n\t\t: \"d\"(Port), \"0\"(Buffer), \"1\" (Count)\n\t\t);\n  }\n  __CRT_INLINE void __indwordstring(unsigned short Port,unsigned long *Buffer,unsigned long Count)\n  {\n\t__asm__ __volatile__ (\n\t\t\"cld ; rep ; insl \" \n\t\t: \"=D\" (Buffer), \"=c\" (Count)\n\t\t: \"d\"(Port), \"0\"(Buffer), \"1\" (Count)\n\t\t);\n  }\n\n  __CRT_INLINE void __outbytestring(unsigned short Port,unsigned char *Buffer,unsigned long Count)\n  {\n      __asm__ __volatile__ (\n          \"cld ; rep ; outsb \" \n          : \"=S\" (Buffer), \"=c\" (Count)\n          : \"d\"(Port), \"0\"(Buffer), \"1\" (Count)\n          );\n  }\n  __CRT_INLINE void __outwordstring(unsigned short Port,unsigned short *Buffer,unsigned long Count)\n  {\n      __asm__ __volatile__ (\n          \"cld ; rep ; outsw \" \n          : \"=S\" (Buffer), \"=c\" (Count)\n          : \"d\"(Port), \"0\"(Buffer), \"1\" (Count)\n          );\n  }\n  __CRT_INLINE void __outdwordstring(unsigned short Port,unsigned long *Buffer,unsigned long Count)\n  {\n      __asm__ __volatile__ (\n          \"cld ; rep ; outsl \" \n          : \"=S\" (Buffer), \"=c\" (Count)\n          : \"d\"(Port), \"0\"(Buffer), \"1\" (Count)\n          );\n  }\n\n  __CRT_INLINE unsigned __int64 __readcr0(void)\n  {\n      unsigned __int64 value;\n      __asm__ __volatile__ (\n          \"mov %%cr0, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n \n  /* Register sizes are different between 32/64 bit mode. So we have to do this for _WIN64 and _WIN32\n     seperatly.  */\n \n#ifdef _WIN64\n  __CRT_INLINE void __writecr0(unsigned __int64 Data)\n  {\n   __asm__ __volatile__ (\n       \"mov %[Data], %%cr0\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n  }\n \n  __CRT_INLINE unsigned __int64 __readcr2(void)\n  {\n      unsigned __int64 value;\n      __asm__ __volatile__ (\n          \"mov %%cr2, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n\n __CRT_INLINE void __writecr2(unsigned __int64 Data)\n {\n   __asm__ __volatile__ (\n       \"mov %[Data], %%cr2\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n }\n \n  __CRT_INLINE unsigned __int64 __readcr3(void)\n  {\n      unsigned __int64 value;\n      __asm__ __volatile__ (\n          \"mov %%cr3, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n\n __CRT_INLINE void __writecr3(unsigned __int64 Data)\n {\n   __asm__ __volatile__ (\n       \"mov %[Data], %%cr3\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n }\n \n  __CRT_INLINE unsigned __int64 __readcr4(void)\n  {\n      unsigned __int64 value;\n      __asm__ __volatile__ (\n          \"mov %%cr4, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n\n __CRT_INLINE void __writecr4(unsigned __int64 Data)\n {\n     __asm__ __volatile__ (\n         \"mov %[Data], %%cr4\"\n         :\n         : [Data] \"q\" (Data)\n         : \"memory\");\n }\n \n  __CRT_INLINE unsigned __int64 __readcr8(void)\n  {\n      unsigned __int64 value;\n      __asm__ __volatile__ (\n          \"mov %%cr8, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n\n __CRT_INLINE void __writecr8(unsigned __int64 Data)\n {\n   __asm__ __volatile__ (\n       \"mov %[Data], %%cr8\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n }\n \n#elif defined(_WIN32)\n\n  __CRT_INLINE void __writecr0(unsigned Data)\n  {\n    __asm__ __volatile__ (\n       \"mov %[Data], %%cr0\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n  }\n \n  __CRT_INLINE unsigned long __readcr2(void)\n  {\n      unsigned long value;\n      __asm__ __volatile__ (\n          \"mov %%cr2, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n\n __CRT_INLINE void __writecr2(unsigned Data)\n {\n   __asm__ __volatile__ (\n       \"mov %[Data], %%cr2\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n }\n \n  __CRT_INLINE unsigned long __readcr3(void)\n  {\n      unsigned long value;\n      __asm__ __volatile__ (\n          \"mov %%cr3, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n\n __CRT_INLINE void __writecr3(unsigned Data)\n {\n   __asm__ __volatile__ (\n       \"mov %[Data], %%cr3\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n }\n \n  __CRT_INLINE unsigned long __readcr4(void)\n  {\n      unsigned long value;\n      __asm__ __volatile__ (\n          \"mov %%cr4, %[value]\" \n          : [value] \"=q\" (value));\n      return value;\n  }\n\n __CRT_INLINE void __writecr4(unsigned Data)\n {\n     __asm__ __volatile__ (\n         \"mov %[Data], %%cr4\"\n         :\n         : [Data] \"q\" (Data)\n         : \"memory\");\n }\n \n __CRT_INLINE unsigned long __readcr8(void)\n {\n   unsigned long value;      __asm__ __volatile__ (\n          \"mov %%cr8, %[value]\" \n          : [value] \"=q\" (value));\n     return value;\n }\n\n __CRT_INLINE void __writecr8(unsigned Data)\n {\n   __asm__ __volatile__ (\n       \"mov %[Data], %%cr8\"\n       :\n       : [Data] \"q\" (Data)\n       : \"memory\");\n }\n \n#endif\n\n  __CRT_INLINE unsigned __int64 __readmsr(unsigned long msr)\n  {\n      unsigned __int64 val1, val2;\n       __asm__ __volatile__(\n           \"rdmsr\"\n           : \"=a\" (val1), \"=d\" (val2)\n           : \"c\" (msr));\n      return val1 | (val2 << 32);\n  }\n\n __CRT_INLINE void __writemsr (unsigned long msr, unsigned __int64 Value)\n {\n    unsigned long val1 = Value, val2 = Value >> 32;\n   __asm__ __volatile__ (\n       \"wrmsr\"\n       :\n       : \"c\" (msr), \"a\" (val1), \"d\" (val2));\n }\n \n  __CRT_INLINE unsigned __int64 __rdtsc(void)\n  {\n      unsigned __int64 val1, val2;\n      __asm__ __volatile__ (\n          \"rdtsc\" \n          : \"=a\" (val1), \"=d\" (val2));\n      return val1 | (val2 << 32);\n  }\n\n  __CRT_INLINE void __cpuid(int CPUInfo[4], int InfoType)\n  {\n      __asm__ __volatile__ (\n          \"cpuid\"\n          : \"=a\" (CPUInfo [0]), \"=b\" (CPUInfo [1]), \"=c\" (CPUInfo [2]), \"=d\" (CPUInfo [3])\n          : \"a\" (InfoType));\n  }\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#include <sec_api/conio_s.h>\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/ctype.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_CTYPE\n#define _INC_CTYPE\n\n#include <_mingw.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef WEOF\n#define WEOF (wint_t)(0xFFFF)\n#endif\n\n#ifndef _CRT_CTYPEDATA_DEFINED\n#define _CRT_CTYPEDATA_DEFINED\n#ifndef _CTYPE_DISABLE_MACROS\n\n#ifndef __PCTYPE_FUNC\n#define __PCTYPE_FUNC __pctype_func()\n#ifdef _MSVCRT_\n#define __pctype_func()\t(_pctype)\n#else\n#define __pctype_func()\t(*_imp___pctype)\n#endif\n#endif\n\n#ifndef _pctype\n#ifdef _MSVCRT_\n  extern unsigned short *_pctype;\n#else\n  extern unsigned short **_imp___pctype;\n#define _pctype (*_imp___pctype)\n#endif\n#endif\n\n#endif\n#endif\n\n#ifndef _CRT_WCTYPEDATA_DEFINED\n#define _CRT_WCTYPEDATA_DEFINED\n#ifndef _CTYPE_DISABLE_MACROS\n#ifndef _wctype\n#ifdef _MSVCRT_\n  extern unsigned short *_wctype;\n#else\n  extern unsigned short **_imp___wctype;\n#define _wctype (*_imp___wctype)\n#endif\n#endif\n#ifdef _MSVCRT_\n#define __pwctype_func() (_pwctype)\n#ifndef _pwctype\n  extern unsigned short *_pwctype;\n#endif\n#else\n#define __pwctype_func() (*_imp___pwctype)\n#ifndef _pwctype\n  extern unsigned short **_imp___pwctype;\n#define _pwctype (*_imp___pwctype)\n#endif\n#endif\n#endif\n#endif\n\n  /* CRT stuff */\n#if 1\n  extern const unsigned char __newclmap[];\n  extern const unsigned char __newcumap[];\n  extern pthreadlocinfo __ptlocinfo;\n  extern pthreadmbcinfo __ptmbcinfo;\n  extern int __globallocalestatus;\n  extern int __locale_changed;\n  extern struct threadlocaleinfostruct __initiallocinfo;\n  extern _locale_tstruct __initiallocalestructinfo;\n  pthreadlocinfo __cdecl __updatetlocinfo(void);\n  pthreadmbcinfo __cdecl __updatetmbcinfo(void);\n#endif\n\n#define _UPPER 0x1\n#define _LOWER 0x2\n#define _DIGIT 0x4\n#define _SPACE 0x8\n\n#define _PUNCT 0x10\n#define _CONTROL 0x20\n#define _BLANK 0x40\n#define _HEX 0x80\n\n#define _LEADBYTE 0x8000\n#define _ALPHA (0x0100|_UPPER|_LOWER)\n\n#ifndef _CTYPE_DEFINED\n#define _CTYPE_DEFINED\n\n  _CRTIMP int __cdecl _isctype(int _C,int _Type);\n  _CRTIMP int __cdecl _isctype_l(int _C,int _Type,_locale_t _Locale);\n  _CRTIMP int __cdecl isalpha(int _C);\n  _CRTIMP int __cdecl _isalpha_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl isupper(int _C);\n  _CRTIMP int __cdecl _isupper_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl islower(int _C);\n  _CRTIMP int __cdecl _islower_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl isdigit(int _C);\n  _CRTIMP int __cdecl _isdigit_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl isxdigit(int _C);\n  _CRTIMP int __cdecl _isxdigit_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl isspace(int _C);\n  _CRTIMP int __cdecl _isspace_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl ispunct(int _C);\n  _CRTIMP int __cdecl _ispunct_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl isalnum(int _C);\n  _CRTIMP int __cdecl _isalnum_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl isprint(int _C);\n  _CRTIMP int __cdecl _isprint_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl isgraph(int _C);\n  _CRTIMP int __cdecl _isgraph_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl iscntrl(int _C);\n  _CRTIMP int __cdecl _iscntrl_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl toupper(int _C);\n  _CRTIMP int __cdecl tolower(int _C);\n  _CRTIMP int __cdecl _tolower(int _C);\n  _CRTIMP int __cdecl _tolower_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl _toupper(int _C);\n  _CRTIMP int __cdecl _toupper_l(int _C,_locale_t _Locale);\n  _CRTIMP int __cdecl __isascii(int _C);\n  _CRTIMP int __cdecl __toascii(int _C);\n  _CRTIMP int __cdecl __iscsymf(int _C);\n  _CRTIMP int __cdecl __iscsym(int _C);\n\n#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || !defined (NO_OLDNAMES)\nint __cdecl isblank(int _C);\n#endif\n#endif\n\n#ifndef _WCTYPE_DEFINED\n#define _WCTYPE_DEFINED\n\n  int __cdecl iswalpha(wint_t _C);\n  _CRTIMP int __cdecl _iswalpha_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswupper(wint_t _C);\n  _CRTIMP int __cdecl _iswupper_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswlower(wint_t _C);\n  _CRTIMP int __cdecl _iswlower_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswdigit(wint_t _C);\n  _CRTIMP int __cdecl _iswdigit_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswxdigit(wint_t _C);\n  _CRTIMP int __cdecl _iswxdigit_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswspace(wint_t _C);\n  _CRTIMP int __cdecl _iswspace_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswpunct(wint_t _C);\n  _CRTIMP int __cdecl _iswpunct_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswalnum(wint_t _C);\n  _CRTIMP int __cdecl _iswalnum_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswprint(wint_t _C);\n  _CRTIMP int __cdecl _iswprint_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswgraph(wint_t _C);\n  _CRTIMP int __cdecl _iswgraph_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswcntrl(wint_t _C);\n  _CRTIMP int __cdecl _iswcntrl_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswascii(wint_t _C);\n  int __cdecl isleadbyte(int _C);\n  _CRTIMP int __cdecl _isleadbyte_l(int _C,_locale_t _Locale);\n  wint_t __cdecl towupper(wint_t _C);\n  _CRTIMP wint_t __cdecl _towupper_l(wint_t _C,_locale_t _Locale);\n  wint_t __cdecl towlower(wint_t _C);\n  _CRTIMP wint_t __cdecl _towlower_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswctype(wint_t _C,wctype_t _Type);\n  _CRTIMP int __cdecl _iswctype_l(wint_t _C,wctype_t _Type,_locale_t _Locale);\n  _CRTIMP int __cdecl __iswcsymf(wint_t _C);\n  _CRTIMP int __cdecl _iswcsymf_l(wint_t _C,_locale_t _Locale);\n  _CRTIMP int __cdecl __iswcsym(wint_t _C);\n  _CRTIMP int __cdecl _iswcsym_l(wint_t _C,_locale_t _Locale);\n  int __cdecl is_wctype(wint_t _C,wctype_t _Type);\n\n#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || !defined (NO_OLDNAMES)\nint __cdecl iswblank(wint_t _C);\n#endif\n#endif\n\n#ifndef _CTYPE_DISABLE_MACROS\n\n#ifndef MB_CUR_MAX\n#define MB_CUR_MAX ___mb_cur_max_func()\n#ifndef __mb_cur_max\n#ifdef _MSVCRT_\n  extern int __mb_cur_max;\n#else\n#define __mb_cur_max\t(*_imp____mb_cur_max)\n  extern int *_imp____mb_cur_max;\n#endif\n#endif\n#ifdef _MSVCRT_\n#define ___mb_cur_max_func() (__mb_cur_max)\n#else\n#define ___mb_cur_max_func() (*_imp____mb_cur_max)\n#endif\n#endif\n\n#define __chvalidchk(a,b) (__PCTYPE_FUNC[(a)] & (b))\n#define _chvalidchk_l(_Char,_Flag,_Locale) (!_Locale ? __chvalidchk(_Char,_Flag) : ((_locale_t)_Locale)->locinfo->pctype[_Char] & (_Flag))\n#define _ischartype_l(_Char,_Flag,_Locale) (((_Locale)!=NULL && (((_locale_t)(_Locale))->locinfo->mb_cur_max) > 1) ? _isctype_l(_Char,(_Flag),_Locale) : _chvalidchk_l(_Char,_Flag,_Locale))\n#define _isalpha_l(_Char,_Locale) _ischartype_l(_Char,_ALPHA,_Locale)\n#define _isupper_l(_Char,_Locale) _ischartype_l(_Char,_UPPER,_Locale)\n#define _islower_l(_Char,_Locale) _ischartype_l(_Char,_LOWER,_Locale)\n#define _isdigit_l(_Char,_Locale) _ischartype_l(_Char,_DIGIT,_Locale)\n#define _isxdigit_l(_Char,_Locale) _ischartype_l(_Char,_HEX,_Locale)\n#define _isspace_l(_Char,_Locale) _ischartype_l(_Char,_SPACE,_Locale)\n#define _ispunct_l(_Char,_Locale) _ischartype_l(_Char,_PUNCT,_Locale)\n#define _isalnum_l(_Char,_Locale) _ischartype_l(_Char,_ALPHA|_DIGIT,_Locale)\n#define _isprint_l(_Char,_Locale) _ischartype_l(_Char,_BLANK|_PUNCT|_ALPHA|_DIGIT,_Locale)\n#define _isgraph_l(_Char,_Locale) _ischartype_l(_Char,_PUNCT|_ALPHA|_DIGIT,_Locale)\n#define _iscntrl_l(_Char,_Locale) _ischartype_l(_Char,_CONTROL,_Locale)\n#define _tolower(_Char) ((_Char)-'A'+'a')\n#define _toupper(_Char) ((_Char)-'a'+'A')\n#define __isascii(_Char) ((unsigned)(_Char) < 0x80)\n#define __toascii(_Char) ((_Char) & 0x7f)\n\n#ifndef _WCTYPE_INLINE_DEFINED\n#define _WCTYPE_INLINE_DEFINED\n\n#undef _CRT_WCTYPE_NOINLINE\n#ifndef __cplusplus\n#define iswalpha(_c) (iswctype(_c,_ALPHA))\n#define iswupper(_c) (iswctype(_c,_UPPER))\n#define iswlower(_c) (iswctype(_c,_LOWER))\n#define iswdigit(_c) (iswctype(_c,_DIGIT))\n#define iswxdigit(_c) (iswctype(_c,_HEX))\n#define iswspace(_c) (iswctype(_c,_SPACE))\n#define iswpunct(_c) (iswctype(_c,_PUNCT))\n#define iswalnum(_c) (iswctype(_c,_ALPHA|_DIGIT))\n#define iswprint(_c) (iswctype(_c,_BLANK|_PUNCT|_ALPHA|_DIGIT))\n#define iswgraph(_c) (iswctype(_c,_PUNCT|_ALPHA|_DIGIT))\n#define iswcntrl(_c) (iswctype(_c,_CONTROL))\n#define iswascii(_c) ((unsigned)(_c) < 0x80)\n#define _iswalpha_l(_c,_p) (_iswctype_l(_c,_ALPHA,_p))\n#define _iswupper_l(_c,_p) (_iswctype_l(_c,_UPPER,_p))\n#define _iswlower_l(_c,_p) (_iswctype_l(_c,_LOWER,_p))\n#define _iswdigit_l(_c,_p) (_iswctype_l(_c,_DIGIT,_p))\n#define _iswxdigit_l(_c,_p) (_iswctype_l(_c,_HEX,_p))\n#define _iswspace_l(_c,_p) (_iswctype_l(_c,_SPACE,_p))\n#define _iswpunct_l(_c,_p) (_iswctype_l(_c,_PUNCT,_p))\n#define _iswalnum_l(_c,_p) (_iswctype_l(_c,_ALPHA|_DIGIT,_p))\n#define _iswprint_l(_c,_p) (_iswctype_l(_c,_BLANK|_PUNCT|_ALPHA|_DIGIT,_p))\n#define _iswgraph_l(_c,_p) (_iswctype_l(_c,_PUNCT|_ALPHA|_DIGIT,_p))\n#define _iswcntrl_l(_c,_p) (_iswctype_l(_c,_CONTROL,_p))\n#endif\n#endif\n\n#define __iscsymf(_c) (isalpha(_c) || ((_c)=='_'))\n#define __iscsym(_c) (isalnum(_c) || ((_c)=='_'))\n#define __iswcsymf(_c) (iswalpha(_c) || ((_c)=='_'))\n#define __iswcsym(_c) (iswalnum(_c) || ((_c)=='_'))\n#define _iscsymf_l(_c,_p) (_isalpha_l(_c,_p) || ((_c)=='_'))\n#define _iscsym_l(_c,_p) (_isalnum_l(_c,_p) || ((_c)=='_'))\n#define _iswcsymf_l(_c,_p) (_iswalpha_l(_c,_p) || ((_c)=='_'))\n#define _iswcsym_l(_c,_p) (_iswalnum_l(_c,_p) || ((_c)=='_'))\n#endif\n\n#ifndef\tNO_OLDNAMES\n#ifndef _CTYPE_DEFINED\n  int __cdecl isascii(int _C);\n  int __cdecl toascii(int _C);\n  int __cdecl iscsymf(int _C);\n  int __cdecl iscsym(int _C);\n#else\n#define isascii __isascii\n#define toascii __toascii\n#define iscsymf __iscsymf\n#define iscsym __iscsym\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/dir.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/* \n * dir.h\n *\n * This file OBSOLESCENT and only provided for backward compatibility.\n * Please use io.h instead.\n *\n * This file is part of the Mingw32 package.\n *\n * Contributors:\n *  Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>\n *             Mumit Khan <khan@xraylith.wisc.edu>\n *\n *  THIS SOFTWARE IS NOT COPYRIGHTED\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n */\n\n#include <io.h>\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/direct.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_DIRECT\n#define _INC_DIRECT\n\n#include <_mingw.h>\n#include <io.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _DISKFREE_T_DEFINED\n#define _DISKFREE_T_DEFINED\n  struct _diskfree_t {\n    unsigned total_clusters;\n    unsigned avail_clusters;\n    unsigned sectors_per_cluster;\n    unsigned bytes_per_sector;\n  };\n#endif\n\n  _CRTIMP char *__cdecl _getcwd(char *_DstBuf,int _SizeInBytes);\n  _CRTIMP char *__cdecl _getdcwd(int _Drive,char *_DstBuf,int _SizeInBytes);\n  char *__cdecl _getdcwd_nolock(int _Drive,char *_DstBuf,int _SizeInBytes);\n  _CRTIMP int __cdecl _chdir(const char *_Path);\n  _CRTIMP int __cdecl _mkdir(const char *_Path);\n  _CRTIMP int __cdecl _rmdir(const char *_Path);\n  _CRTIMP int __cdecl _chdrive(int _Drive);\n  _CRTIMP int __cdecl _getdrive(void);\n  _CRTIMP unsigned long __cdecl _getdrives(void);\n\n#ifndef _GETDISKFREE_DEFINED\n#define _GETDISKFREE_DEFINED\n  _CRTIMP unsigned __cdecl _getdiskfree(unsigned _Drive,struct _diskfree_t *_DiskFree);\n#endif\n\n#ifndef _WDIRECT_DEFINED\n#define _WDIRECT_DEFINED\n  _CRTIMP wchar_t *__cdecl _wgetcwd(wchar_t *_DstBuf,int _SizeInWords);\n  _CRTIMP wchar_t *__cdecl _wgetdcwd(int _Drive,wchar_t *_DstBuf,int _SizeInWords);\n  wchar_t *__cdecl _wgetdcwd_nolock(int _Drive,wchar_t *_DstBuf,int _SizeInWords);\n  _CRTIMP int __cdecl _wchdir(const wchar_t *_Path);\n  _CRTIMP int __cdecl _wmkdir(const wchar_t *_Path);\n  _CRTIMP int __cdecl _wrmdir(const wchar_t *_Path);\n#endif\n\n#ifndef\tNO_OLDNAMES\n\n#define diskfree_t _diskfree_t\n\n  char *__cdecl getcwd(char *_DstBuf,int _SizeInBytes);\n  int __cdecl chdir(const char *_Path);\n  int __cdecl mkdir(const char *_Path);\n  int __cdecl rmdir(const char *_Path);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/dirent.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/* All the headers include this file. */\n#include <_mingw.h>\n\n#ifndef\t__STRICT_ANSI__\n\n#ifndef _DIRENT_H_\n#define _DIRENT_H_\n\n\n#pragma pack(push,_CRT_PACKING)\n\n#include <io.h>\n\n#ifndef RC_INVOKED\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  struct dirent\n  {\n    long\t\td_ino;\t\t/* Always zero. */\n    unsigned short\td_reclen;\t/* Always zero. */\n    unsigned short\td_namlen;\t/* Length of name in d_name. */\n    char*\t\td_name;\t\t/* File name. */\n    /* NOTE: The name in the dirent structure points to the name in the\n    *       finddata_t structure in the DIR. */\n  };\n\n  /*\n  * This is an internal data structure. Good programmers will not use it\n  * except as an argument to one of the functions below.\n  * dd_stat field is now int (was short in older versions).\n  */\n  typedef struct\n  {\n    /* disk transfer area for this dir */\n    struct _finddata_t\tdd_dta;\n\n    /* dirent struct to return from dir (NOTE: this makes this thread\n    * safe as long as only one thread uses a particular DIR struct at\n    * a time) */\n    struct dirent\t\tdd_dir;\n\n    /* _findnext handle */\n    long\t\t\tdd_handle;\n\n    /*\n    * Status of search:\n    *   0 = not started yet (next entry to read is first entry)\n    *  -1 = off the end\n    *   positive = 0 based index of next entry\n    */\n    int\t\t\tdd_stat;\n\n    /* given path for dir with search pattern (struct is extended) */\n    char\t\t\tdd_name[1];\n  } DIR;\n\n  DIR* __cdecl opendir (const char*);\n  struct dirent* __cdecl readdir (DIR*);\n  int __cdecl closedir (DIR*);\n  void __cdecl rewinddir (DIR*);\n  long __cdecl telldir (DIR*);\n  void __cdecl seekdir (DIR*, long);\n\n\n  /* wide char versions */\n\n  struct _wdirent\n  {\n    long\t\td_ino;\t\t/* Always zero. */\n    unsigned short\td_reclen;\t/* Always zero. */\n    unsigned short\td_namlen;\t/* Length of name in d_name. */\n    wchar_t*\td_name;\t\t/* File name. */\n    /* NOTE: The name in the dirent structure points to the name in the\t *       wfinddata_t structure in the _WDIR. */\n  };\n\n  /*\n  * This is an internal data structure. Good programmers will not use it\n  * except as an argument to one of the functions below.\n  */\n  typedef struct\n  {\n    /* disk transfer area for this dir */\n    struct _wfinddata_t\tdd_dta;\n\n    /* dirent struct to return from dir (NOTE: this makes this thread\n    * safe as long as only one thread uses a particular DIR struct at\n    * a time) */\n    struct _wdirent\t\tdd_dir;\n\n    /* _findnext handle */\n    long\t\t\tdd_handle;\n\n    /*\n    * Status of search:\n    *   0 = not started yet (next entry to read is first entry)\n    *  -1 = off the end\n    *   positive = 0 based index of next entry\n    */\n    int\t\t\tdd_stat;\n\n    /* given path for dir with search pattern (struct is extended) */\n    wchar_t\t\t\tdd_name[1];\n  } _WDIR;\n\n\n\n  _WDIR* __cdecl _wopendir (const wchar_t*);\n  struct _wdirent*  __cdecl _wreaddir (_WDIR*);\n  int __cdecl _wclosedir (_WDIR*);\n  void __cdecl _wrewinddir (_WDIR*);\n  long __cdecl _wtelldir (_WDIR*);\n  void __cdecl _wseekdir (_WDIR*, long);\n\n\n#ifdef\t__cplusplus\n}\n#endif\n\n#endif\t/* Not RC_INVOKED */\n\n#pragma pack(pop)\n\n#endif\t/* Not _DIRENT_H_ */\n\n\n#endif\t/* Not __STRICT_ANSI__ */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/dos.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_DOS\n#define _INC_DOS\n\n#include <_mingw.h>\n#include <io.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _DISKFREE_T_DEFINED\n#define _DISKFREE_T_DEFINED\n\n  struct _diskfree_t {\n    unsigned total_clusters;\n    unsigned avail_clusters;\n    unsigned sectors_per_cluster;\n    unsigned bytes_per_sector;\n  };\n#endif\n\n#define _A_NORMAL 0x00\n#define _A_RDONLY 0x01\n#define _A_HIDDEN 0x02\n#define _A_SYSTEM 0x04\n#define _A_SUBDIR 0x10\n#define _A_ARCH 0x20\n\n#ifndef _GETDISKFREE_DEFINED\n#define _GETDISKFREE_DEFINED\n  _CRTIMP unsigned __cdecl _getdiskfree(unsigned _Drive,struct _diskfree_t *_DiskFree);\n#endif\n\n#if (defined(_X86_) && !defined(__x86_64))\n  void __cdecl _disable(void);\n  void __cdecl _enable(void);\n#endif\n\n#ifndef\tNO_OLDNAMES\n#define diskfree_t _diskfree_t\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/errno.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_ERRNO\n#define _INC_ERRNO\n\n#include <_mingw.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _CRT_ERRNO_DEFINED\n#define _CRT_ERRNO_DEFINED\n  _CRTIMP extern int *__cdecl _errno(void);\n#define errno (*_errno())\n\n  errno_t __cdecl _set_errno(int _Value);\n  errno_t __cdecl _get_errno(int *_Value);\n#endif\n\n#define EPERM 1\n#define ENOENT 2\n#define ESRCH 3\n#define EINTR 4\n#define EIO 5\n#define ENXIO 6\n#define E2BIG 7\n#define ENOEXEC 8\n#define EBADF 9\n#define ECHILD 10\n#define EAGAIN 11\n#define ENOMEM 12\n#define EACCES 13\n#define EFAULT 14\n#define EBUSY 16\n#define EEXIST 17\n#define EXDEV 18\n#define ENODEV 19\n#define ENOTDIR 20\n#define EISDIR 21\n#define ENFILE 23\n#define EMFILE 24\n#define ENOTTY 25\n#define EFBIG 27\n#define ENOSPC 28\n#define ESPIPE 29\n#define EROFS 30\n#define EMLINK 31\n#define EPIPE 32\n#define EDOM 33\n#define EDEADLK 36\n#define ENAMETOOLONG 38\n#define ENOLCK 39\n#define ENOSYS 40\n#define ENOTEMPTY 41\n\n#ifndef RC_INVOKED\n#if !defined(_SECURECRT_ERRCODE_VALUES_DEFINED)\n#define _SECURECRT_ERRCODE_VALUES_DEFINED\n#define EINVAL 22\n#define ERANGE 34\n#define EILSEQ 42\n#define STRUNCATE 80\n#endif\n#endif\n\n#define EDEADLOCK EDEADLK\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/excpt.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_EXCPT\n#define _INC_EXCPT\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  struct _EXCEPTION_POINTERS;\n\n#ifndef EXCEPTION_DISPOSITION\n#define EXCEPTION_DISPOSITION   int\n#endif\n#define ExceptionContinueExecution 0\n#define ExceptionContinueSearch 1\n#define ExceptionNestedException 2\n#define ExceptionCollidedUnwind 3\n\n#if (defined(_X86_) && !defined(__x86_64))\n  struct _EXCEPTION_RECORD;\n  struct _CONTEXT;\n\n  EXCEPTION_DISPOSITION __cdecl _except_handler(struct _EXCEPTION_RECORD *_ExceptionRecord,void *_EstablisherFrame,struct _CONTEXT *_ContextRecord,void *_DispatcherContext);\n#elif defined(__ia64__)\n\n  typedef struct _EXCEPTION_POINTERS *Exception_info_ptr;\n  struct _EXCEPTION_RECORD;\n  struct _CONTEXT;\n  struct _DISPATCHER_CONTEXT;\n\n  _CRTIMP EXCEPTION_DISPOSITION __cdecl __C_specific_handler (struct _EXCEPTION_RECORD *_ExceptionRecord,unsigned __int64 _MemoryStackFp,unsigned __int64 _BackingStoreFp,struct _CONTEXT *_ContextRecord,struct _DISPATCHER_CONTEXT *_DispatcherContext,unsigned __int64 _GlobalPointer);\n#elif defined(__x86_64)\n\n  struct _EXCEPTION_RECORD;\n  struct _CONTEXT;\n#endif\n\n#define GetExceptionCode _exception_code\n#define exception_code _exception_code\n#define GetExceptionInformation (struct _EXCEPTION_POINTERS *)_exception_info\n#define exception_info (struct _EXCEPTION_POINTERS *)_exception_info\n#define AbnormalTermination _abnormal_termination\n#define abnormal_termination _abnormal_termination\n\n  unsigned long __cdecl _exception_code(void);\n  void *__cdecl _exception_info(void);\n  int __cdecl _abnormal_termination(void);\n\n#define EXCEPTION_EXECUTE_HANDLER 1\n#define EXCEPTION_CONTINUE_SEARCH 0\n#define EXCEPTION_CONTINUE_EXECUTION -1\n\n  /* CRT stuff */\n  typedef void (__cdecl * _PHNDLR)(int);\n\n  struct _XCPT_ACTION {\n    unsigned long XcptNum;\n    int SigNum;\n    _PHNDLR XcptAction;\n  };\n\n  extern struct _XCPT_ACTION _XcptActTab[];\n  extern int _XcptActTabCount;\n  extern int _XcptActTabSize;\n  extern int _First_FPE_Indx;\n  extern int _Num_FPE;\n\n  int __cdecl __CppXcptFilter(unsigned long _ExceptionNum,struct _EXCEPTION_POINTERS * _ExceptionPtr);\n  int __cdecl _XcptFilter(unsigned long _ExceptionNum,struct _EXCEPTION_POINTERS * _ExceptionPtr);\n\n  /*\n  * The type of function that is expected as an exception handler to be\n  * installed with _try1.\n  */\n  typedef EXCEPTION_DISPOSITION (*PEXCEPTION_HANDLER)(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);\n\n#ifndef HAVE_NO_SEH\n  /*\n  * This is not entirely necessary, but it is the structure installed by\n  * the _try1 primitive below.\n  */\n  typedef struct _EXCEPTION_REGISTRATION {\n    struct _EXCEPTION_REGISTRATION *prev;\n    EXCEPTION_DISPOSITION (*handler)(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);\n  } EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION;\n\n  typedef EXCEPTION_REGISTRATION EXCEPTION_REGISTRATION_RECORD;\n  typedef PEXCEPTION_REGISTRATION PEXCEPTION_REGISTRATION_RECORD;\n#endif\n\n#if (defined(_X86_) && !defined(__x86_64))\n#define __try1(pHandler) \\\n  __asm__ (\"pushl %0;pushl %%fs:0;movl %%esp,%%fs:0;\" : : \"g\" (pHandler));\n\n#define\t__except1\t\\\n  __asm__ (\"movl (%%esp),%%eax;movl %%eax,%%fs:0;addl $8,%%esp;\" \\\n  : : : \"%eax\");\n#elif defined(__x86_64)\n#define __try1(pHandler) \\\n  __asm__ (\"pushq %0;pushq %%gs:0;movq %%rsp,%%gs:0;\" : : \"g\" (pHandler));\n\n#define\t__except1\t\\\n  __asm__ (\"movq (%%rsp),%%rax;movq %%rax,%%gs:0;addq $16,%%rsp;\" \\\n  : : : \"%rax\");\n#else\n#define __try1(pHandler)\n#define __except1\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/fcntl.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#include <_mingw.h>\n\n#include <io.h>\n\n#ifndef _INC_FCNTL\n#define _INC_FCNTL\n\n#define _O_RDONLY 0x0000\n#define _O_WRONLY 0x0001\n#define _O_RDWR 0x0002\n#define _O_APPEND 0x0008\n#define _O_CREAT 0x0100\n#define _O_TRUNC 0x0200\n#define _O_EXCL 0x0400\n#define _O_TEXT 0x4000\n#define _O_BINARY 0x8000\n#define _O_WTEXT 0x10000\n#define _O_U16TEXT 0x20000\n#define _O_U8TEXT 0x40000\n#define _O_ACCMODE (_O_RDONLY|_O_WRONLY|_O_RDWR)\n\n#define _O_RAW _O_BINARY\n#define _O_NOINHERIT 0x0080\n#define _O_TEMPORARY 0x0040\n#define _O_SHORT_LIVED 0x1000\n\n#define _O_SEQUENTIAL 0x0020\n#define _O_RANDOM 0x0010\n\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n#define O_RDONLY _O_RDONLY\n#define O_WRONLY _O_WRONLY\n#define O_RDWR _O_RDWR\n#define O_APPEND _O_APPEND\n#define O_CREAT _O_CREAT\n#define O_TRUNC _O_TRUNC\n#define O_EXCL _O_EXCL\n#define O_TEXT _O_TEXT\n#define O_BINARY _O_BINARY\n#define O_RAW _O_BINARY\n#define O_TEMPORARY _O_TEMPORARY\n#define O_NOINHERIT _O_NOINHERIT\n#define O_SEQUENTIAL _O_SEQUENTIAL\n#define O_RANDOM _O_RANDOM\n#define O_ACCMODE _O_ACCMODE\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/fenv.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _FENV_H_\n#define _FENV_H_\n\n#include <_mingw.h>\n\n/* FPU status word exception flags */\n#define FE_INVALID\t0x01\n#define FE_DENORMAL\t0x02\n#define FE_DIVBYZERO\t0x04\n#define FE_OVERFLOW\t0x08\n#define FE_UNDERFLOW\t0x10\n#define FE_INEXACT\t0x20\n#define FE_ALL_EXCEPT (FE_INVALID | FE_DENORMAL | FE_DIVBYZERO \\\n\t\t       | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)\n\n/* FPU control word rounding flags */\n#define FE_TONEAREST\t0x0000\n#define FE_DOWNWARD\t0x0400\n#define FE_UPWARD\t0x0800\n#define FE_TOWARDZERO\t0x0c00\n\n/* The MXCSR exception flags are the same as the\n   FE flags. */\n#define __MXCSR_EXCEPT_FLAG_SHIFT 0\n\n/* How much to shift FE status word exception flags\n   to get MXCSR rounding flags,  */\n#define __MXCSR_ROUND_FLAG_SHIFT 3\n\n#ifndef RC_INVOKED\n/*\n  For now, support only for the basic abstraction of flags that are\n  either set or clear. fexcept_t could be  structure that holds more\n  info about the fp environment.\n*/\ntypedef unsigned short fexcept_t;\n\n/* This 32-byte struct represents the entire floating point\n   environment as stored by fnstenv or fstenv, augmented by\n   the  contents of the MXCSR register, as stored by stmxcsr\n   (if CPU supports it). */\ntypedef struct\n{\n  unsigned short __control_word;\n  unsigned short __unused0;\n  unsigned short __status_word;\n  unsigned short __unused1;\n  unsigned short __tag_word;\n  unsigned short __unused2;  \n  unsigned int\t __ip_offset;    /* instruction pointer offset */\n  unsigned short __ip_selector;  \n  unsigned short __opcode;\n  unsigned int\t __data_offset;\n  unsigned short __data_selector;  \n  unsigned short __unused3;\n  unsigned int   __mxcsr; /* contents of the MXCSR register  */\n} fenv_t;\n\n\n/*The C99 standard (7.6.9) allows us to define implementation-specific macros for\n  different fp environments */\n  \n/* The default Intel x87 floating point environment (64-bit mantissa) */\n#define FE_PC64_ENV ((const fenv_t *)-1)\n\n/* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */\n#define FE_PC53_ENV ((const fenv_t *)-2)\n\n/* The FE_DFL_ENV macro is required by standard.\n  fesetenv will use the environment set at app startup.*/\n#define FE_DFL_ENV ((const fenv_t *) 0)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*TODO: Some of these could be inlined */\n/* 7.6.2 Exception */\n\nextern int __cdecl feclearexcept (int);\nextern int __cdecl fegetexceptflag (fexcept_t * flagp, int excepts);\nextern int __cdecl feraiseexcept (int excepts );\nextern int __cdecl fesetexceptflag (const fexcept_t *, int);\nextern int __cdecl fetestexcept (int excepts);\n\n/* 7.6.3 Rounding */\n\nextern int __cdecl fegetround (void);\nextern int __cdecl fesetround (int mode);\n\n/* 7.6.4 Environment */\n\nextern int __cdecl fegetenv(fenv_t * envp);\nextern int __cdecl fesetenv(const fenv_t * );\nextern int __cdecl feupdateenv(const fenv_t *);\nextern int __cdecl feholdexcept(fenv_t *);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\t/* Not RC_INVOKED */\n\n#endif /* ndef _FENV_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/inttypes.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/* 7.8 Format conversion of integer types <inttypes.h> */\n\n#ifndef _INTTYPES_H_\n#define _INTTYPES_H_\n\n#include <_mingw.h>\n#include <stdint.h>\n#define __need_wchar_t\n#include <stddef.h>\n\n#ifdef\t__cplusplus\nextern\t\"C\"\t{\n#endif\n\ntypedef struct {\n\tintmax_t quot;\n\tintmax_t rem;\n\t} imaxdiv_t;\n\n#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)\n\n/* 7.8.1 Macros for format specifiers\n * \n * MS runtime does not yet understand C9x standard \"ll\"\n * length specifier. It appears to treat \"ll\" as \"l\".\n * The non-standard I64 length specifier causes warning in GCC,\n * but understood by MS runtime functions.\n */\n\n/* fprintf macros for signed types */\n#define PRId8 \"d\"\n#define PRId16 \"d\"\n#define PRId32 \"d\"\n#define PRId64 \"I64d\"\n\n#define PRIdLEAST8 \"d\"\n#define PRIdLEAST16 \"d\"\n#define PRIdLEAST32 \"d\"\n#define PRIdLEAST64 \"I64d\"\n\n#define PRIdFAST8 \"d\"\n#define PRIdFAST16 \"d\"\n#define PRIdFAST32 \"d\"\n#define PRIdFAST64 \"I64d\"\n\n#define PRIdMAX \"I64d\"\n\n#define PRIi8 \"i\"\n#define PRIi16 \"i\"\n#define PRIi32 \"i\"\n#define PRIi64 \"I64i\"\n\n#define PRIiLEAST8 \"i\"\n#define PRIiLEAST16 \"i\"\n#define PRIiLEAST32 \"i\"\n#define PRIiLEAST64 \"I64i\"\n\n#define PRIiFAST8 \"i\"\n#define PRIiFAST16 \"i\"\n#define PRIiFAST32 \"i\"\n#define PRIiFAST64 \"I64i\"\n\n#define PRIiMAX \"I64i\"\n\n#define PRIo8 \"o\"\n#define PRIo16 \"o\"\n#define PRIo32 \"o\"\n#define PRIo64 \"I64o\"\n\n#define PRIoLEAST8 \"o\"\n#define PRIoLEAST16 \"o\"\n#define PRIoLEAST32 \"o\"\n#define PRIoLEAST64 \"I64o\"\n\n#define PRIoFAST8 \"o\"\n#define PRIoFAST16 \"o\"\n#define PRIoFAST32 \"o\"\n#define PRIoFAST64 \"I64o\"\n\n#define PRIoMAX \"I64o\"\n\n/* fprintf macros for unsigned types */\n#define PRIu8 \"u\"\n#define PRIu16 \"u\"\n#define PRIu32 \"u\"\n#define PRIu64 \"I64u\"\n\n\n#define PRIuLEAST8 \"u\"\n#define PRIuLEAST16 \"u\"\n#define PRIuLEAST32 \"u\"\n#define PRIuLEAST64 \"I64u\"\n\n#define PRIuFAST8 \"u\"\n#define PRIuFAST16 \"u\"\n#define PRIuFAST32 \"u\"\n#define PRIuFAST64 \"I64u\"\n\n#define PRIuMAX \"I64u\"\n\n#define PRIx8 \"x\"\n#define PRIx16 \"x\"\n#define PRIx32 \"x\"\n#define PRIx64 \"I64x\"\n\n#define PRIxLEAST8 \"x\"\n#define PRIxLEAST16 \"x\"\n#define PRIxLEAST32 \"x\"\n#define PRIxLEAST64 \"I64x\"\n\n#define PRIxFAST8 \"x\"\n#define PRIxFAST16 \"x\"\n#define PRIxFAST32 \"x\"\n#define PRIxFAST64 \"I64x\"\n\n#define PRIxMAX \"I64x\"\n\n#define PRIX8 \"X\"\n#define PRIX16 \"X\"\n#define PRIX32 \"X\"\n#define PRIX64 \"I64X\"\n\n#define PRIXLEAST8 \"X\"\n#define PRIXLEAST16 \"X\"\n#define PRIXLEAST32 \"X\"\n#define PRIXLEAST64 \"I64X\"\n\n#define PRIXFAST8 \"X\"\n#define PRIXFAST16 \"X\"\n#define PRIXFAST32 \"X\"\n#define PRIXFAST64 \"I64X\"\n\n#define PRIXMAX \"I64X\"\n\n/*\n *   fscanf macros for signed int types\n *   NOTE: if 32-bit int is used for int_fast8_t and int_fast16_t\n *   (see stdint.h, 7.18.1.3), FAST8 and FAST16 should have\n *   no length identifiers\n */\n\n#define SCNd16 \"hd\"\n#define SCNd32 \"d\"\n#define SCNd64 \"I64d\"\n\n#define SCNdLEAST16 \"hd\"\n#define SCNdLEAST32 \"d\"\n#define SCNdLEAST64 \"I64d\"\n\n#define SCNdFAST16 \"hd\"\n#define SCNdFAST32 \"d\"\n#define SCNdFAST64 \"I64d\"\n\n#define SCNdMAX \"I64d\"\n\n#define SCNi16 \"hi\"\n#define SCNi32 \"i\"\n#define SCNi64 \"I64i\"\n\n#define SCNiLEAST16 \"hi\"\n#define SCNiLEAST32 \"i\"\n#define SCNiLEAST64 \"I64i\"\n\n#define SCNiFAST16 \"hi\"\n#define SCNiFAST32 \"i\"\n#define SCNiFAST64 \"I64i\"\n\n#define SCNiMAX \"I64i\"\n\n#define SCNo16 \"ho\"\n#define SCNo32 \"o\"\n#define SCNo64 \"I64o\"\n\n#define SCNoLEAST16 \"ho\"\n#define SCNoLEAST32 \"o\"\n#define SCNoLEAST64 \"I64o\"\n\n#define SCNoFAST16 \"ho\"\n#define SCNoFAST32 \"o\"\n#define SCNoFAST64 \"I64o\"\n\n#define SCNoMAX \"I64o\"\n\n#define SCNx16 \"hx\"\n#define SCNx32 \"x\"\n#define SCNx64 \"I64x\"\n\n#define SCNxLEAST16 \"hx\"\n#define SCNxLEAST32 \"x\"\n#define SCNxLEAST64 \"I64x\"\n\n#define SCNxFAST16 \"hx\"\n#define SCNxFAST32 \"x\"\n#define SCNxFAST64 \"I64x\"\n\n#define SCNxMAX \"I64x\"\n\n/* fscanf macros for unsigned int types */\n\n#define SCNu16 \"hu\"\n#define SCNu32 \"u\"\n#define SCNu64 \"I64u\"\n\n#define SCNuLEAST16 \"hu\"\n#define SCNuLEAST32 \"u\"\n#define SCNuLEAST64 \"I64u\"\n\n#define SCNuFAST16 \"hu\"\n#define SCNuFAST32 \"u\"\n#define SCNuFAST64 \"I64u\"\n\n#define SCNuMAX \"I64u\"\n\n#ifdef _WIN64\n#define PRIdPTR \"I64d\"\n#define PRIiPTR \"I64i\"\n#define PRIoPTR \"I64o\"\n#define PRIuPTR \"I64u\"\n#define PRIxPTR \"I64x\"\n#define PRIXPTR \"I64X\"\n#define SCNdPTR \"I64d\"\n#define SCNiPTR \"I64i\"\n#define SCNoPTR \"I64o\"\n#define SCNxPTR \"I64x\"\n#define SCNuPTR \"I64u\"\n#else\n#define PRIdPTR \"d\"\n#define PRIiPTR \"i\"\n#define PRIoPTR \"o\"\n#define PRIuPTR \"u\"\n#define PRIxPTR \"x\"\n#define PRIXPTR \"X\"\n#define SCNdPTR \"d\"\n#define SCNiPTR \"i\"\n#define SCNoPTR \"o\"\n#define SCNxPTR \"x\"\n #define SCNuPTR \"u\"\n#endif\n\n#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n/*\n * no length modifier for char types prior to C9x\n * MS runtime  scanf appears to treat \"hh\" as \"h\" \n */\n\n/* signed char */\n#define SCNd8 \"hhd\"\n#define SCNdLEAST8 \"hhd\"\n#define SCNdFAST8 \"hhd\"\n\n#define SCNi8 \"hhi\"\n#define SCNiLEAST8 \"hhi\"\n#define SCNiFAST8 \"hhi\"\n\n#define SCNo8 \"hho\"\n#define SCNoLEAST8 \"hho\"\n#define SCNoFAST8 \"hho\"\n\n#define SCNx8 \"hhx\"\n#define SCNxLEAST8 \"hhx\"\n#define SCNxFAST8 \"hhx\"\n\n/* unsigned char */\n#define SCNu8 \"hhu\"\n#define SCNuLEAST8 \"hhu\"\n#define SCNuFAST8 \"hhu\"\n#endif /* __STDC_VERSION__ >= 199901 */\n\n#endif\t/* !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) */\n\nintmax_t __cdecl imaxabs (intmax_t j);\n__CRT_INLINE intmax_t __cdecl imaxabs (intmax_t j)\n\t{return\t(j >= 0 ? j : -j);}\nimaxdiv_t __cdecl imaxdiv (intmax_t numer, intmax_t denom);\n\n/* 7.8.2 Conversion functions for greatest-width integer types */\n\nintmax_t __cdecl strtoimax (const char* __restrict__ nptr,\n                            char** __restrict__ endptr, int base);\nuintmax_t __cdecl strtoumax (const char* __restrict__ nptr,\n\t\t\t     char** __restrict__ endptr, int base);\n\nintmax_t __cdecl wcstoimax (const wchar_t* __restrict__ nptr,\n                            wchar_t** __restrict__ endptr, int base);\nuintmax_t __cdecl wcstoumax (const wchar_t* __restrict__ nptr,\n\t\t\t     wchar_t** __restrict__ endptr, int base);\n\n#ifdef\t__cplusplus\n}\n#endif\n\n#endif /* ndef _INTTYPES_H */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/io.h",
    "content": "\n/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _IO_H_\n#define _IO_H_\n\n#include <_mingw.h>\n#include <string.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifndef _POSIX_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_CRTIMP char* __cdecl _getcwd (char*, int);\n#ifndef _FSIZE_T_DEFINED\n  typedef unsigned long _fsize_t;\n#define _FSIZE_T_DEFINED\n#endif\n\n#ifndef _FINDDATA_T_DEFINED\n\n  struct _finddata32_t {\n    unsigned attrib;\n    __time32_t time_create;\n    __time32_t time_access;\n    __time32_t time_write;\n    _fsize_t size;\n    char name[260];\n  };\n\n/*#if _INTEGRAL_MAX_BITS >= 64*/\n\n  struct _finddata32i64_t {\n    unsigned attrib;\n    __time32_t time_create;\n    __time32_t time_access;\n    __time32_t time_write;\n    __int64 size;\n    char name[260];\n  };\n\n  struct _finddata64i32_t {\n    unsigned attrib;\n    __time64_t time_create;\n    __time64_t time_access;\n    __time64_t time_write;\n    _fsize_t size;\n    char name[260];\n  };\n\n  struct __finddata64_t {\n    unsigned attrib;\n    __time64_t time_create;\n    __time64_t time_access;\n    __time64_t time_write;\n    __int64 size;\n    char name[260];\n  };\n/* #endif */\n\n#ifdef _USE_32BIT_TIME_T\n#define _finddata_t _finddata32_t\n#define _finddatai64_t _finddata32i64_t\n\n#ifdef _WIN64\n#define _findfirst _findfirst32\n#define _findnext _findnext32\n#else\n#define _findfirst32 _findfirst\n#define _findnext32 _findnext\n#endif\n#define _findfirsti64 _findfirst32i64\n#define _findnexti64 _findnext32i64\n#else\n#define _finddata_t _finddata64i32_t\n#define _finddatai64_t __finddata64_t\n\n#define _findfirst _findfirst64i32\n#define _findnext _findnext64i32\n#define _findfirsti64 _findfirst64\n#define _findnexti64 _findnext64\n#endif\n\n#define _FINDDATA_T_DEFINED\n#endif\n\n#ifndef _WFINDDATA_T_DEFINED\n\n  struct _wfinddata32_t {\n    unsigned attrib;\n    __time32_t time_create;\n    __time32_t time_access;\n    __time32_t time_write;\n    _fsize_t size;\n    wchar_t name[260];\n  };\n\n/* #if _INTEGRAL_MAX_BITS >= 64 */\n\n  struct _wfinddata32i64_t {\n    unsigned attrib;\n    __time32_t time_create;\n    __time32_t time_access;\n    __time32_t time_write;\n    __int64 size;\n    wchar_t name[260];\n  };\n\n  struct _wfinddata64i32_t {\n    unsigned attrib;\n    __time64_t time_create;\n    __time64_t time_access;\n    __time64_t time_write;\n    _fsize_t size;\n    wchar_t name[260];\n  };\n\n  struct _wfinddata64_t {\n    unsigned attrib;\n    __time64_t time_create;\n    __time64_t time_access;\n    __time64_t time_write;\n    __int64 size;\n    wchar_t name[260];\n  };\n/* #endif */\n\n#ifdef _USE_32BIT_TIME_T\n#define _wfinddata_t _wfinddata32_t\n#define _wfinddatai64_t _wfinddata32i64_t\n\n#define _wfindfirst _wfindfirst32\n#define _wfindnext _wfindnext32\n#define _wfindfirsti64 _wfindfirst32i64\n#define _wfindnexti64 _wfindnext32i64\n#else\n#define _wfinddata_t _wfinddata64i32_t\n#define _wfinddatai64_t _wfinddata64_t\n\n#define _wfindfirst _wfindfirst64i32\n#define _wfindnext _wfindnext64i32\n#define _wfindfirsti64 _wfindfirst64\n#define _wfindnexti64 _wfindnext64\n#endif\n\n#define _WFINDDATA_T_DEFINED\n#endif\n\n#define _A_NORMAL 0x00\n#define _A_RDONLY 0x01\n#define _A_HIDDEN 0x02\n#define _A_SYSTEM 0x04\n#define _A_SUBDIR 0x10\n#define _A_ARCH 0x20\n\n#ifndef _SIZE_T_DEFINED\n#define _SIZE_T_DEFINED\n#undef size_t\n#ifdef _WIN64\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef unsigned int size_t __attribute__ ((mode (DI)));\n#else\n  typedef unsigned __int64 size_t;\n#endif\n#else\n  typedef unsigned int size_t;\n#endif\n#endif\n\n#ifndef _SSIZE_T_DEFINED\n#define _SSIZE_T_DEFINED\n#undef ssize_t\n#ifdef _WIN64\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef int ssize_t __attribute__ ((mode (DI)));\n#else\n  typedef __int64 ssize_t;\n#endif\n#else\n  typedef int ssize_t;\n#endif\n#endif\n\n#ifndef _OFF_T_DEFINED\n#define _OFF_T_DEFINED\n#ifndef _OFF_T_\n#define _OFF_T_\n  typedef long _off_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long off_t;\n#endif\n#endif\n#endif\n\n#ifndef _OFF64_T_DEFINED\n#define _OFF64_T_DEFINED\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef int _off64_t __attribute__ ((mode (DI)));\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef int off64_t __attribute__ ((mode (DI)));\n#endif\n#else\n  typedef long long _off64_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long long off64_t;\n#endif\n#endif\n#endif\n\n  /* Some defines for _access nAccessMode (MS doesn't define them, but\n  * it doesn't seem to hurt to add them). */\n#define\tF_OK\t0\t/* Check for file existence */\n#define\tX_OK\t1\t/* Check for execute permission. */\n#define\tW_OK\t2\t/* Check for write permission */\n#define\tR_OK\t4\t/* Check for read permission */\n\n  _CRTIMP int __cdecl _access(const char *_Filename,int _AccessMode);\n  _CRTIMP int __cdecl _chmod(const char *_Filename,int _Mode);\n  _CRTIMP int __cdecl _chsize(int _FileHandle,long _Size);\n  _CRTIMP int __cdecl _close(int _FileHandle);\n  _CRTIMP int __cdecl _commit(int _FileHandle);\n  _CRTIMP int __cdecl _creat(const char *_Filename,int _PermissionMode);\n  _CRTIMP int __cdecl _dup(int _FileHandle);\n  _CRTIMP int __cdecl _dup2(int _FileHandleSrc,int _FileHandleDst);\n  _CRTIMP int __cdecl _eof(int _FileHandle);\n  _CRTIMP long __cdecl _filelength(int _FileHandle);\n  _CRTIMP intptr_t __cdecl _findfirst32(const char *_Filename,struct _finddata32_t *_FindData);\n  _CRTIMP int __cdecl _findnext32(intptr_t _FindHandle,struct _finddata32_t *_FindData);\n  _CRTIMP int __cdecl _findclose(intptr_t _FindHandle);\n  _CRTIMP int __cdecl _isatty(int _FileHandle);\n  _CRTIMP int __cdecl _locking(int _FileHandle,int _LockMode,long _NumOfBytes);\n  _CRTIMP long __cdecl _lseek(int _FileHandle,long _Offset,int _Origin);\n  _off64_t lseek64(int fd,_off64_t offset, int whence);\n  _CRTIMP char *__cdecl _mktemp(char *_TemplateName);\n  _CRTIMP int __cdecl _pipe(int *_PtHandles,unsigned int _PipeSize,int _TextMode);\n  _CRTIMP int __cdecl _read(int _FileHandle,void *_DstBuf,unsigned int _MaxCharCount);\n\n#ifndef _CRT_DIRECTORY_DEFINED\n#define _CRT_DIRECTORY_DEFINED\n  int __cdecl remove(const char *_Filename);\n  int __cdecl rename(const char *_OldFilename,const char *_NewFilename);\n  _CRTIMP int __cdecl _unlink(const char *_Filename);\n#ifndef\tNO_OLDNAMES\n  int __cdecl unlink(const char *_Filename);\n#endif\n#endif\n\n  _CRTIMP int __cdecl _setmode(int _FileHandle,int _Mode);\n  _CRTIMP long __cdecl _tell(int _FileHandle);\n  _CRTIMP int __cdecl _umask(int _Mode);\n  _CRTIMP int __cdecl _write(int _FileHandle,const void *_Buf,unsigned int _MaxCharCount);\n\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP __int64 __cdecl _filelengthi64(int _FileHandle);\n  _CRTIMP intptr_t __cdecl _findfirst32i64(const char *_Filename,struct _finddata32i64_t *_FindData);\n  _CRTIMP intptr_t __cdecl _findfirst64(const char *_Filename,struct __finddata64_t *_FindData);\n#ifdef __cplusplus\n#include <string.h>\n#endif\n  intptr_t __cdecl _findfirst64i32(const char *_Filename,struct _finddata64i32_t *_FindData);\n  __CRT_INLINE intptr_t __cdecl _findfirst64i32(const char *_Filename,struct _finddata64i32_t *_FindData)\n  {\n    struct __finddata64_t fd;\n    intptr_t ret = _findfirst64(_Filename,&fd);\n    _FindData->attrib=fd.attrib;\n    _FindData->time_create=fd.time_create;\n    _FindData->time_access=fd.time_access;\n    _FindData->time_write=fd.time_write;\n    _FindData->size=(_fsize_t) fd.size;\n    strncpy(_FindData->name,fd.name,260);\n    return ret;\n  }\n  _CRTIMP int __cdecl _findnext32i64(intptr_t _FindHandle,struct _finddata32i64_t *_FindData);\n  _CRTIMP int __cdecl _findnext64(intptr_t _FindHandle,struct __finddata64_t *_FindData);\n  int __cdecl _findnext64i32(intptr_t _FindHandle,struct _finddata64i32_t *_FindData);\n  __CRT_INLINE int __cdecl _findnext64i32(intptr_t _FindHandle,struct _finddata64i32_t *_FindData)\n  {\n    struct __finddata64_t fd;\n    int ret = _findnext64(_FindHandle,&fd);\n    _FindData->attrib=fd.attrib;\n    _FindData->time_create=fd.time_create;\n    _FindData->time_access=fd.time_access;\n    _FindData->time_write=fd.time_write;\n    _FindData->size=(_fsize_t) fd.size;\n    strncpy(_FindData->name,fd.name,260);\n    return ret;\n  }\n  __int64 __cdecl _lseeki64(int _FileHandle,__int64 _Offset,int _Origin);\n  __int64 __cdecl _telli64(int _FileHandle);\n#endif\n#ifndef NO_OLDNAMES\n\n#ifndef _UWIN\n  int __cdecl chdir (const char *);\n  char *__cdecl getcwd (char *, int);\n  int __cdecl mkdir (const char *);\n  char *__cdecl mktemp(char *);\n  int __cdecl rmdir (const char*);\n  int __cdecl chmod (const char *, int);\n#endif /* _UWIN */\n\n#endif /* Not NO_OLDNAMES */\n\n  _CRTIMP errno_t __cdecl _sopen_s(int *_FileHandle,const char *_Filename,int _OpenFlag,int _ShareFlag,int _PermissionMode);\n\n#ifndef __cplusplus\n  _CRTIMP int __cdecl _open(const char *_Filename,int _OpenFlag,...);\n  _CRTIMP int __cdecl _sopen(const char *_Filename,int _OpenFlag,int _ShareFlag,...);\n#else\n  extern \"C++\" _CRTIMP int __cdecl _open(const char *_Filename,int _Openflag,int _PermissionMode = 0);\n  extern \"C++\" _CRTIMP int __cdecl _sopen(const char *_Filename,int _Openflag,int _ShareFlag,int _PermissionMode = 0);\n#endif\n\n#ifndef _WIO_DEFINED\n#define _WIO_DEFINED\n  _CRTIMP int __cdecl _waccess(const wchar_t *_Filename,int _AccessMode);\n  _CRTIMP int __cdecl _wchmod(const wchar_t *_Filename,int _Mode);\n  _CRTIMP int __cdecl _wcreat(const wchar_t *_Filename,int _PermissionMode);\n  _CRTIMP intptr_t __cdecl _wfindfirst32(const wchar_t *_Filename,struct _wfinddata32_t *_FindData);\n  _CRTIMP int __cdecl _wfindnext32(intptr_t _FindHandle,struct _wfinddata32_t *_FindData);\n  _CRTIMP int __cdecl _wunlink(const wchar_t *_Filename);\n  _CRTIMP int __cdecl _wrename(const wchar_t *_NewFilename,const wchar_t *_OldFilename);\n  _CRTIMP wchar_t *__cdecl _wmktemp(wchar_t *_TemplateName);\n\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP intptr_t __cdecl _wfindfirst32i64(const wchar_t *_Filename,struct _wfinddata32i64_t *_FindData);\n  intptr_t __cdecl _wfindfirst64i32(const wchar_t *_Filename,struct _wfinddata64i32_t *_FindData);\n  _CRTIMP intptr_t __cdecl _wfindfirst64(const wchar_t *_Filename,struct _wfinddata64_t *_FindData);\n  _CRTIMP int __cdecl _wfindnext32i64(intptr_t _FindHandle,struct _wfinddata32i64_t *_FindData);\n  int __cdecl _wfindnext64i32(intptr_t _FindHandle,struct _wfinddata64i32_t *_FindData);\n  _CRTIMP int __cdecl _wfindnext64(intptr_t _FindHandle,struct _wfinddata64_t *_FindData);\n#endif\n\n  _CRTIMP errno_t __cdecl _wsopen_s(int *_FileHandle,const wchar_t *_Filename,int _OpenFlag,int _ShareFlag,int _PermissionFlag);\n\n#if !defined(__cplusplus) || !(defined(_X86_) && !defined(__x86_64))\n  _CRTIMP int __cdecl _wopen(const wchar_t *_Filename,int _OpenFlag,...);\n  _CRTIMP int __cdecl _wsopen(const wchar_t *_Filename,int _OpenFlag,int _ShareFlag,...);\n#else\n  extern \"C++\" _CRTIMP int __cdecl _wopen(const wchar_t *_Filename,int _OpenFlag,int _PermissionMode = 0);\n  extern \"C++\" _CRTIMP int __cdecl _wsopen(const wchar_t *_Filename,int _OpenFlag,int _ShareFlag,int _PermissionMode = 0);\n#endif\n\n#endif\n\n  int __cdecl __lock_fhandle(int _Filehandle);\n  void __cdecl _unlock_fhandle(int _Filehandle);\n  _CRTIMP intptr_t __cdecl _get_osfhandle(int _FileHandle);\n  _CRTIMP int __cdecl _open_osfhandle(intptr_t _OSFileHandle,int _Flags);\n\n#ifndef\tNO_OLDNAMES\n  int __cdecl access(const char *_Filename,int _AccessMode);\n  int __cdecl chmod(const char *_Filename,int _AccessMode);\n  int __cdecl chsize(int _FileHandle,long _Size);\n  int __cdecl close(int _FileHandle);\n  int __cdecl creat(const char *_Filename,int _PermissionMode);\n  int __cdecl dup(int _FileHandle);\n  int __cdecl dup2(int _FileHandleSrc,int _FileHandleDst);\n  int __cdecl eof(int _FileHandle);\n  long __cdecl filelength(int _FileHandle);\n  int __cdecl isatty(int _FileHandle);\n  int __cdecl locking(int _FileHandle,int _LockMode,long _NumOfBytes);\n  long __cdecl lseek(int _FileHandle,long _Offset,int _Origin);\n  char *__cdecl mktemp(char *_TemplateName);\n  int __cdecl open(const char *_Filename,int _OpenFlag,...);\n  int __cdecl read(int _FileHandle,void *_DstBuf,unsigned int _MaxCharCount);\n  int __cdecl setmode(int _FileHandle,int _Mode);\n  int __cdecl sopen(const char *_Filename,int _OpenFlag,int _ShareFlag,...);\n  long __cdecl tell(int _FileHandle);\n  int __cdecl umask(int _Mode);\n  int __cdecl write(int _Filehandle,const void *_Buf,unsigned int _MaxCharCount);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Misc stuff */\nchar *getlogin(void);\n#ifdef __USE_MINGW_ALARM\nunsigned int alarm(unsigned int seconds);\n#endif\n\n#ifdef __USE_MINGW_ACCESS\n/*  Old versions of MSVCRT access() just ignored X_OK, while the version\n    shipped with Vista, returns an error code.  This will restore the\n    old behaviour  */\nstatic inline int __mingw_access (const char *__fname, int __mode) {\n  return  _access (__fname, __mode & ~X_OK);\n}\n\n#define access(__f,__m)  __mingw_access (__f, __m)\n#endif\n\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#pragma pack(pop)\n\n#include <sec_api/io_s.h>\n\n#endif /* End _IO_H_ */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/limits.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#include <_mingw.h>\n\n#ifndef _INC_LIMITS\n#define _INC_LIMITS\n\n/*\n* File system limits\n*\n* TODO: NAME_MAX and OPEN_MAX are file system limits or not? Are they the\n*       same as FILENAME_MAX and FOPEN_MAX from stdio.h?\n* NOTE: Apparently the actual size of PATH_MAX is 260, but a space is\n*       required for the NUL. TODO: Test?\n*/\n#define PATH_MAX\t(259)\n\n#define CHAR_BIT 8\n#define SCHAR_MIN (-128)\n#define SCHAR_MAX 127\n#define UCHAR_MAX 0xff\n\n#define CHAR_MIN SCHAR_MIN\n#define CHAR_MAX SCHAR_MAX\n\n#define MB_LEN_MAX 5\n#define SHRT_MIN (-32768)\n#define SHRT_MAX 32767\n#define USHRT_MAX 0xffff\n#define INT_MIN (-2147483647 - 1)\n#define INT_MAX 2147483647\n#define UINT_MAX 0xffffffff\n#define LONG_MIN (-2147483647L - 1)\n#define LONG_MAX 2147483647L\n#define ULONG_MAX 0xffffffffUL\n#define LLONG_MAX 9223372036854775807ll\n#define LLONG_MIN (-9223372036854775807ll - 1)\n#define ULLONG_MAX 0xffffffffffffffffull\n\n#if _INTEGRAL_MAX_BITS >= 8\n#define _I8_MIN (-127 - 1)\n#define _I8_MAX 127i8\n#define _UI8_MAX 0xffu\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 16\n#define _I16_MIN (-32767 - 1)\n#define _I16_MAX 32767i16\n#define _UI16_MAX 0xffffu\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 32\n#define _I32_MIN (-2147483647 - 1)\n#define _I32_MAX 2147483647\n#define _UI32_MAX 0xffffffffu\n#endif\n\n#if defined(__GNUC__)\n#undef LONG_LONG_MAX\n#define LONG_LONG_MAX 9223372036854775807ll\n#undef LONG_LONG_MIN\n#define LONG_LONG_MIN (-LONG_LONG_MAX-1)\n#undef ULONG_LONG_MAX\n#define ULONG_LONG_MAX (2ull * LONG_LONG_MAX + 1ull)\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 64\n#define _I64_MIN (-9223372036854775807ll - 1)\n#define _I64_MAX 9223372036854775807ll\n#define _UI64_MAX 0xffffffffffffffffull\n#endif\n\n#ifndef SIZE_MAX\n#ifdef _WIN64\n#define SIZE_MAX _UI64_MAX\n#else\n#define SIZE_MAX UINT_MAX\n#endif\n#endif\n\n#ifdef _POSIX_\n#define _POSIX_ARG_MAX 4096\n#define _POSIX_CHILD_MAX 6\n#define _POSIX_LINK_MAX 8\n#define _POSIX_MAX_CANON 255\n#define _POSIX_MAX_INPUT 255\n#define _POSIX_NAME_MAX 14\n#define _POSIX_NGROUPS_MAX 0\n#define _POSIX_OPEN_MAX 16\n#define _POSIX_PATH_MAX 255\n#define _POSIX_PIPE_BUF 512\n#define _POSIX_SSIZE_MAX 32767\n#define _POSIX_STREAM_MAX 8\n#define _POSIX_TZNAME_MAX 3\n#define ARG_MAX 14500\n#define LINK_MAX 1024\n#define MAX_CANON _POSIX_MAX_CANON\n#define MAX_INPUT _POSIX_MAX_INPUT\n#define NAME_MAX 255\n#define NGROUPS_MAX 16\n#define OPEN_MAX 32\n#define PATH_MAX 512\n#define PIPE_BUF _POSIX_PIPE_BUF\n#define SSIZE_MAX _POSIX_SSIZE_MAX\n#define STREAM_MAX 20\n#define TZNAME_MAX 10\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/locale.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_LOCALE\n#define _INC_LOCALE\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#define LC_ALL 0\n#define LC_COLLATE 1\n#define LC_CTYPE 2\n#define LC_MONETARY 3\n#define LC_NUMERIC 4\n#define LC_TIME 5\n\n#define LC_MIN LC_ALL\n#define LC_MAX LC_TIME\n\n#ifndef _LCONV_DEFINED\n#define _LCONV_DEFINED\n  struct lconv {\n    char *decimal_point;\n    char *thousands_sep;\n    char *grouping;\n    char *int_curr_symbol;\n    char *currency_symbol;\n    char *mon_decimal_point;\n    char *mon_thousands_sep;\n    char *mon_grouping;\n    char *positive_sign;\n    char *negative_sign;\n    char int_frac_digits;\n    char frac_digits;\n    char p_cs_precedes;\n    char p_sep_by_space;\n    char n_cs_precedes;\n    char n_sep_by_space;\n    char p_sign_posn;\n    char n_sign_posn;\n  };\n#endif\n\n#ifndef _CONFIG_LOCALE_SWT\n#define _CONFIG_LOCALE_SWT\n\n#define _ENABLE_PER_THREAD_LOCALE 0x1\n#define _DISABLE_PER_THREAD_LOCALE 0x2\n#define _ENABLE_PER_THREAD_LOCALE_GLOBAL 0x10\n#define _DISABLE_PER_THREAD_LOCALE_GLOBAL 0x20\n#define _ENABLE_PER_THREAD_LOCALE_NEW 0x100\n#define _DISABLE_PER_THREAD_LOCALE_NEW 0x200\n\n#endif\n\n  int __cdecl _configthreadlocale(int _Flag);\n  char *__cdecl setlocale(int _Category,const char *_Locale);\n  _CRTIMP struct lconv *__cdecl localeconv(void);\n  _locale_t __cdecl _get_current_locale(void);\n  _locale_t __cdecl _create_locale(int _Category,const char *_Locale);\n  void __cdecl _free_locale(_locale_t _Locale);\n  _locale_t __cdecl __get_current_locale(void);\n  _locale_t __cdecl __create_locale(int _Category,const char *_Locale);\n  void __cdecl __free_locale(_locale_t _Locale);\n\n#ifndef _WLOCALE_DEFINED\n#define _WLOCALE_DEFINED\n  _CRTIMP wchar_t *__cdecl _wsetlocale(int _Category,const wchar_t *_Locale);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/malloc.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _MALLOC_H_\n#define _MALLOC_H_\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifndef _MM_MALLOC_H_INCLUDED\n#define _MM_MALLOC_H_INCLUDED\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef _WIN64\n#define _HEAP_MAXREQ 0xFFFFFFFFFFFFFFE0\n#else\n#define _HEAP_MAXREQ 0xFFFFFFE0\n#endif\n\n#ifndef _STATIC_ASSERT\n#define _STATIC_ASSERT(expr) extern void __static_assert_t(int [(expr)?1:-1])\n#endif\n\n/* Return codes for _heapwalk()  */\n#define _HEAPEMPTY (-1)\n#define _HEAPOK (-2)\n#define _HEAPBADBEGIN (-3)\n#define _HEAPBADNODE (-4)\n#define _HEAPEND (-5)\n#define _HEAPBADPTR (-6)\n\n/* Values for _heapinfo.useflag */\n#define _FREEENTRY 0\n#define _USEDENTRY 1\n\n#ifndef _HEAPINFO_DEFINED\n#define _HEAPINFO_DEFINED\n /* The structure used to walk through the heap with _heapwalk.  */\n  typedef struct _heapinfo {\n    int *_pentry;\n    size_t _size;\n    int _useflag;\n  } _HEAPINFO;\n#endif\n\n  extern unsigned int _amblksiz;\n\n#define _mm_free(a) _aligned_free(a)\n#define _mm_malloc(a,b) _aligned_malloc(a,b)\n\n#ifndef _CRT_ALLOCATION_DEFINED\n#define _CRT_ALLOCATION_DEFINED\n  void *__cdecl calloc(size_t _NumOfElements,size_t _SizeOfElements);\n  void __cdecl free(void *_Memory);\n  void *__cdecl malloc(size_t _Size);\n  void *__cdecl realloc(void *_Memory,size_t _NewSize);\n  _CRTIMP void *__cdecl _recalloc(void *_Memory,size_t _Count,size_t _Size);\n  /*\t_CRTIMP void __cdecl _aligned_free(void *_Memory);\n  _CRTIMP void *__cdecl _aligned_malloc(size_t _Size,size_t _Alignment); */\n  _CRTIMP void *__cdecl _aligned_offset_malloc(size_t _Size,size_t _Alignment,size_t _Offset);\n  _CRTIMP void *__cdecl _aligned_realloc(void *_Memory,size_t _Size,size_t _Alignment);\n  _CRTIMP void *__cdecl _aligned_recalloc(void *_Memory,size_t _Count,size_t _Size,size_t _Alignment);\n  _CRTIMP void *__cdecl _aligned_offset_realloc(void *_Memory,size_t _Size,size_t _Alignment,size_t _Offset);\n  _CRTIMP void *__cdecl _aligned_offset_recalloc(void *_Memory,size_t _Count,size_t _Size,size_t _Alignment,size_t _Offset);\n#endif\n\n#define _MAX_WAIT_MALLOC_CRT 60000\n\n  _CRTIMP int __cdecl _resetstkoflw (void);\n  _CRTIMP unsigned long __cdecl _set_malloc_crt_max_wait(unsigned long _NewValue);\n\n  _CRTIMP void *__cdecl _expand(void *_Memory,size_t _NewSize);\n  _CRTIMP size_t __cdecl _msize(void *_Memory);\n#ifdef __GNUC__\n#undef _alloca\n#define _alloca(x) __builtin_alloca((x))\n#else\n  void *__cdecl _alloca(size_t _Size);\n#endif\n  _CRTIMP size_t __cdecl _get_sbh_threshold(void);\n  _CRTIMP int __cdecl _set_sbh_threshold(size_t _NewValue);\n  _CRTIMP errno_t __cdecl _set_amblksiz(size_t _Value);\n  _CRTIMP errno_t __cdecl _get_amblksiz(size_t *_Value);\n  _CRTIMP int __cdecl _heapadd(void *_Memory,size_t _Size);\n  _CRTIMP int __cdecl _heapchk(void);\n  _CRTIMP int __cdecl _heapmin(void);\n  _CRTIMP int __cdecl _heapset(unsigned int _Fill);\n  _CRTIMP int __cdecl _heapwalk(_HEAPINFO *_EntryInfo);\n  _CRTIMP size_t __cdecl _heapused(size_t *_Used,size_t *_Commit);\n  _CRTIMP intptr_t __cdecl _get_heap_handle(void);\n\n#define _ALLOCA_S_THRESHOLD 1024\n#define _ALLOCA_S_STACK_MARKER 0xCCCC\n#define _ALLOCA_S_HEAP_MARKER 0xDDDD\n\n#if(defined(_X86_) && !defined(__x86_64))\n#define _ALLOCA_S_MARKER_SIZE 8\n#elif defined(__ia64__) || defined(__x86_64)\n#define _ALLOCA_S_MARKER_SIZE 16\n#endif\n\n#if !defined(RC_INVOKED)\n  static __inline void *_MarkAllocaS(void *_Ptr,unsigned int _Marker) {\n    if(_Ptr) {\n      *((unsigned int*)_Ptr) = _Marker;\n      _Ptr = (char*)_Ptr + _ALLOCA_S_MARKER_SIZE;\n    }\n    return _Ptr;\n  }\n#endif\n\n#undef _malloca\n#define _malloca(size) \\\n  ((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \\\n    _MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE),_ALLOCA_S_STACK_MARKER) : \\\n    _MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE),_ALLOCA_S_HEAP_MARKER))\n#undef _FREEA_INLINE\n#define _FREEA_INLINE\n\n#ifndef RC_INVOKED\n#undef _freea\n  static __inline void __cdecl _freea(void *_Memory) {\n    unsigned int _Marker;\n    if(_Memory) {\n      _Memory = (char*)_Memory - _ALLOCA_S_MARKER_SIZE;\n      _Marker = *(unsigned int *)_Memory;\n      if(_Marker==_ALLOCA_S_HEAP_MARKER) {\n\tfree(_Memory);\n      }\n#ifdef _ASSERTE\n      else if(_Marker!=_ALLOCA_S_STACK_MARKER) {\n\t_ASSERTE((\"Corrupted pointer passed to _freea\",0));\n      }\n#endif\n    }\n  }\n#endif /* RC_INVOKED */\n\n#ifndef\tNO_OLDNAMES\n#ifdef __GNUC__\n#undef alloca\n#define alloca(x) __builtin_alloca((x))\n#endif\n#endif\n\n#ifdef HEAPHOOK\n#ifndef _HEAPHOOK_DEFINED\n#define _HEAPHOOK_DEFINED\n  typedef int (__cdecl *_HEAPHOOK)(int,size_t,void *,void **);\n#endif\n\n  _CRTIMP _HEAPHOOK __cdecl _setheaphook(_HEAPHOOK _NewHook);\n\n#define _HEAP_MALLOC 1\n#define _HEAP_CALLOC 2\n#define _HEAP_FREE 3\n#define _HEAP_REALLOC 4\n#define _HEAP_MSIZE 5\n#define _HEAP_EXPAND 6\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n\n#endif /* _MALLOC_H_ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/math.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _MATH_H_\n#define _MATH_H_\n\n#if __GNUC__ >= 3\n#pragma GCC system_header\n#endif\n\n#include <_mingw.h>\n\nstruct exception;\n\n#pragma pack(push,_CRT_PACKING)\n\n#define _DOMAIN 1\n#define _SING 2\n#define _OVERFLOW 3\n#define _UNDERFLOW 4\n#define _TLOSS 5\n#define _PLOSS 6\n\n#ifndef __STRICT_ANSI__\n#ifndef\tNO_OLDNAMES\n#define DOMAIN _DOMAIN\n#define SING _SING\n#define OVERFLOW _OVERFLOW\n#define UNDERFLOW _UNDERFLOW\n#define TLOSS _TLOSS\n#define PLOSS _PLOSS\n#endif\n#endif\n\n#ifndef __STRICT_ANSI__\n#define M_E 2.71828182845904523536\n#define M_LOG2E 1.44269504088896340736\n#define M_LOG10E 0.434294481903251827651\n#define M_LN2 0.693147180559945309417\n#define M_LN10 2.30258509299404568402\n#define M_PI 3.14159265358979323846\n#define M_PI_2 1.57079632679489661923\n#define M_PI_4 0.785398163397448309616\n#define M_1_PI 0.318309886183790671538\n#define M_2_PI 0.636619772367581343076\n#define M_2_SQRTPI 1.12837916709551257390\n#define M_SQRT2 1.41421356237309504880\n#define M_SQRT1_2 0.707106781186547524401\n#endif\n\n#ifndef __STRICT_ANSI__\n/* See also float.h  */\n#ifndef __MINGW_FPCLASS_DEFINED\n#define __MINGW_FPCLASS_DEFINED 1\n#define\t_FPCLASS_SNAN\t0x0001\t/* Signaling \"Not a Number\" */\n#define\t_FPCLASS_QNAN\t0x0002\t/* Quiet \"Not a Number\" */\n#define\t_FPCLASS_NINF\t0x0004\t/* Negative Infinity */\n#define\t_FPCLASS_NN\t0x0008\t/* Negative Normal */\n#define\t_FPCLASS_ND\t0x0010\t/* Negative Denormal */\n#define\t_FPCLASS_NZ\t0x0020\t/* Negative Zero */\n#define\t_FPCLASS_PZ\t0x0040\t/* Positive Zero */\n#define\t_FPCLASS_PD\t0x0080\t/* Positive Denormal */\n#define\t_FPCLASS_PN\t0x0100\t/* Positive Normal */\n#define\t_FPCLASS_PINF\t0x0200\t/* Positive Infinity */\n#endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _EXCEPTION_DEFINED\n#define _EXCEPTION_DEFINED\n  struct _exception {\n    int type;\n    char *name;\n    double arg1;\n    double arg2;\n    double retval;\n  };\n#endif\n\n#ifndef _COMPLEX_DEFINED\n#define _COMPLEX_DEFINED\n  struct _complex {\n    double x,y;\n  };\n#endif\n\n#define EDOM 33\n#define ERANGE 34\n\n#ifndef _HUGE\n#ifdef _MSVCRT_\n  extern double *_HUGE;\n#else\n  extern double *_imp___HUGE;\n#define _HUGE\t(*_imp___HUGE)\n#endif\n#endif\n\n#define HUGE_VAL _HUGE\n\n#ifndef _CRT_ABS_DEFINED\n#define _CRT_ABS_DEFINED\n  int __cdecl abs(int _X);\n  long __cdecl labs(long _X);\n#endif\n  double __cdecl acos(double _X);\n  double __cdecl asin(double _X);\n  double __cdecl atan(double _X);\n  double __cdecl atan2(double _Y,double _X);\n#ifndef _SIGN_DEFINED\n#define _SIGN_DEFINED\n  _CRTIMP double __cdecl _copysign (double _Number,double _Sign);\n  _CRTIMP double __cdecl _chgsign (double _X);\n#endif\n  double __cdecl cos(double _X);\n  double __cdecl cosh(double _X);\n  double __cdecl exp(double _X);\n  double __cdecl expm1(double _X);\n  double __cdecl fabs(double _X);\n  double __cdecl fmod(double _X,double _Y);\n  double __cdecl log(double _X);\n  double __cdecl log10(double _X);\n  double __cdecl pow(double _X,double _Y);\n  double __cdecl sin(double _X);\n  double __cdecl sinh(double _X);\n  double __cdecl tan(double _X);\n  double __cdecl tanh(double _X);\n  double __cdecl sqrt(double _X);\n#ifndef _CRT_ATOF_DEFINED\n#define _CRT_ATOF_DEFINED\n  double __cdecl atof(const char *_String);\n  double __cdecl _atof_l(const char *_String,_locale_t _Locale);\n#endif\n\n  _CRTIMP double __cdecl _cabs(struct _complex _ComplexA);\n  double __cdecl ceil(double _X);\n  double __cdecl floor(double _X);\n  double __cdecl frexp(double _X,int *_Y);\n  double __cdecl _hypot(double _X,double _Y);\n  _CRTIMP double __cdecl _j0(double _X);\n  _CRTIMP double __cdecl _j1(double _X);\n  _CRTIMP double __cdecl _jn(int _X,double _Y);\n  double __cdecl ldexp(double _X,int _Y);\n#ifndef _CRT_MATHERR_DEFINED\n#define _CRT_MATHERR_DEFINED\n  int __cdecl _matherr(struct _exception *_Except);\n#endif\n  double __cdecl modf(double _X,double *_Y);\n  _CRTIMP double __cdecl _y0(double _X);\n  _CRTIMP double __cdecl _y1(double _X);\n  _CRTIMP double __cdecl _yn(int _X,double _Y);\n\n#if(defined(_X86_) && !defined(__x86_64))\n  _CRTIMP int __cdecl _set_SSE2_enable(int _Flag);\n  /* from libmingwex */\n  float __cdecl _hypotf(float _X,float _Y);\n#endif\n\n  float frexpf(float _X,int *_Y);\n  float __cdecl ldexpf(float _X,int _Y);\n  long double __cdecl ldexpl(long double _X,int _Y);\n  float __cdecl acosf(float _X);\n  float __cdecl asinf(float _X);\n   float __cdecl atanf(float _X);\n   float __cdecl atan2f(float _X,float _Y);\n   float __cdecl cosf(float _X);\n   float __cdecl sinf(float _X);\n   float __cdecl tanf(float _X);\n   float __cdecl coshf(float _X);\n   float __cdecl sinhf(float _X);\n   float __cdecl tanhf(float _X);\n   float __cdecl expf(float _X);\n   float __cdecl expm1f(float _X);\n   float __cdecl logf(float _X);\n   float __cdecl log10f(float _X);\n   float __cdecl modff(float _X,float *_Y);\n   float __cdecl powf(float _X,float _Y);\n   float __cdecl sqrtf(float _X);\n   float __cdecl ceilf(float _X);\n   float __cdecl floorf(float _X);\n  float __cdecl fmodf(float _X,float _Y);\n   float __cdecl _hypotf(float _X,float _Y);\n  float __cdecl fabsf(float _X);\n#if !defined(__ia64__)\n   /* from libmingwex */\n   float __cdecl _copysignf (float _Number,float _Sign);\n   float __cdecl _chgsignf (float _X);\n   float __cdecl _logbf(float _X);\n   float __cdecl _nextafterf(float _X,float _Y);\n   int __cdecl _finitef(float _X);\n   int __cdecl _isnanf(float _X);\n   int __cdecl _fpclassf(float _X);\n#endif\n\n#ifndef __cplusplus\n  __CRT_INLINE long double __cdecl fabsl (long double x)\n  {\n    long double res;\n    __asm__ (\"fabs;\" : \"=t\" (res) : \"0\" (x));\n    return res;\n  }\n#define _hypotl(x,y) ((long double)_hypot((double)(x),(double)(y)))\n#define _matherrl _matherr\n  __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign((double)(_Number)); }\n  __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign((double)(_Number),(double)(_Sign)); }\n  __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); }\n\n#if !defined (__ia64__)\n  __CRT_INLINE float __cdecl fabsf (float x)\n  {\n    float res;\n    __asm__ (\"fabs;\" : \"=t\" (res) : \"0\" (x));\n    return res;\n  }\n\n  __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); }\n#endif\n#else\n  // cplusplus\n  __CRT_INLINE long double __cdecl fabsl (long double x)\n  {\n    long double res;\n    __asm__ (\"fabs;\" : \"=t\" (res) : \"0\" (x));\n    return res;\n  }\n  __CRT_INLINE long double modfl(long double _X,long double *_Y) {\n    double _Di,_Df = modf((double)_X,&_Di);\n    *_Y = (long double)_Di;\n    return (_Df);\n  }\n  __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign(static_cast<double>(_Number)); }\n  __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign(static_cast<double>(_Number),static_cast<double>(_Sign)); }\n  __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); }\n#ifndef __ia64__\n  __CRT_INLINE float __cdecl fabsf (float x)\n  {\n    float res;\n    __asm__ (\"fabs;\" : \"=t\" (res) : \"0\" (x));\n    return res;\n  }\n  __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); }\n#ifndef __x86_64\n  __CRT_INLINE float acosf(float _X) { return ((float)acos((double)_X)); }\n  __CRT_INLINE float asinf(float _X) { return ((float)asin((double)_X)); }\n  __CRT_INLINE float atanf(float _X) { return ((float)atan((double)_X)); }\n  __CRT_INLINE float atan2f(float _X,float _Y) { return ((float)atan2((double)_X,(double)_Y)); }\n  __CRT_INLINE float ceilf(float _X) { return ((float)ceil((double)_X)); }\n  __CRT_INLINE float cosf(float _X) { return ((float)cos((double)_X)); }\n  __CRT_INLINE float coshf(float _X) { return ((float)cosh((double)_X)); }\n  __CRT_INLINE float expf(float _X) { return ((float)exp((double)_X)); }\n  __CRT_INLINE float floorf(float _X) { return ((float)floor((double)_X)); }\n  __CRT_INLINE float fmodf(float _X,float _Y) { return ((float)fmod((double)_X,(double)_Y)); }\n  __CRT_INLINE float logf(float _X) { return ((float)log((double)_X)); }\n  __CRT_INLINE float log10f(float _X) { return ((float)log10((double)_X)); }\n  __CRT_INLINE float modff(float _X,float *_Y) {\n    double _Di,_Df = modf((double)_X,&_Di);\n    *_Y = (float)_Di;\n    return ((float)_Df);\n  }\n  __CRT_INLINE float powf(float _X,float _Y) { return ((float)pow((double)_X,(double)_Y)); }\n  __CRT_INLINE float sinf(float _X) { return ((float)sin((double)_X)); }\n  __CRT_INLINE float sinhf(float _X) { return ((float)sinh((double)_X)); }\n  __CRT_INLINE float sqrtf(float _X) { return ((float)sqrt((double)_X)); }\n  __CRT_INLINE float tanf(float _X) { return ((float)tan((double)_X)); }\n  __CRT_INLINE float tanhf(float _X) { return ((float)tanh((double)_X)); }\n#endif\n#endif\n#endif\n\n#ifndef\tNO_OLDNAMES\n#define matherr _matherr\n\n#define HUGE\t_HUGE\n  /*\tdouble __cdecl cabs(struct _complex _X); */\n  double __cdecl hypot(double _X,double _Y);\n  _CRTIMP double __cdecl j0(double _X);\n  _CRTIMP double __cdecl j1(double _X);\n  _CRTIMP double __cdecl jn(int _X,double _Y);\n  _CRTIMP double __cdecl y0(double _X);\n  _CRTIMP double __cdecl y1(double _X);\n  _CRTIMP double __cdecl yn(int _X,double _Y);\n#endif\n\n#ifndef __NO_ISOCEXT\n#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \\\n  || !defined __STRICT_ANSI__ || defined __GLIBCPP__\n\n#define NAN (0.0F/0.0F)\n#define HUGE_VALF (1.0F/0.0F)\n#define HUGE_VALL (1.0L/0.0L)\n#define INFINITY (1.0F/0.0F)\n\n\n#define FP_NAN\t\t0x0100\n#define FP_NORMAL\t0x0400\n#define FP_INFINITE\t(FP_NAN | FP_NORMAL)\n#define FP_ZERO\t\t0x4000\n#define FP_SUBNORMAL\t(FP_NORMAL | FP_ZERO)\n  /* 0x0200 is signbit mask */\n\n\n  /*\n  We can't __CRT_INLINE float or double, because we want to ensure truncation\n  to semantic type before classification. \n  (A normal long double value might become subnormal when \n  converted to double, and zero when converted to float.)\n  */\n\n  extern int __cdecl __fpclassifyf (float);\n  extern int __cdecl __fpclassify (double);\n\n  __CRT_INLINE int __cdecl __fpclassifyl (long double x){\n    unsigned short sw;\n    __asm__ (\"fxam; fstsw %%ax;\" : \"=a\" (sw): \"t\" (x));\n    return sw & (FP_NAN | FP_NORMAL | FP_ZERO );\n  }\n\n#define fpclassify(x) (sizeof (x) == sizeof (float) ? __fpclassifyf (x)\t  \\\n  : sizeof (x) == sizeof (double) ? __fpclassify (x) \\\n  : __fpclassifyl (x))\n\n  /* 7.12.3.2 */\n#define isfinite(x) ((fpclassify(x) & FP_NAN) == 0)\n\n  /* 7.12.3.3 */\n#define isinf(x) (fpclassify(x) == FP_INFINITE)\n\n  /* 7.12.3.4 */\n  /* We don't need to worry about trucation here:\n  A NaN stays a NaN. */\n\n  __CRT_INLINE int __cdecl __isnan (double _x)\n  {\n    unsigned short sw;\n    __asm__ (\"fxam;\"\n      \"fstsw %%ax\": \"=a\" (sw) : \"t\" (_x));\n    return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))\n      == FP_NAN;\n  }\n\n  __CRT_INLINE int __cdecl __isnanf (float _x)\n  {\n    unsigned short sw;\n    __asm__ (\"fxam;\"\n      \"fstsw %%ax\": \"=a\" (sw) : \"t\" (_x));\n    return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))\n      == FP_NAN;\n  }\n\n  __CRT_INLINE int __cdecl __isnanl (long double _x)\n  {\n    unsigned short sw;\n    __asm__ (\"fxam;\"\n      \"fstsw %%ax\": \"=a\" (sw) : \"t\" (_x));\n    return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))\n      == FP_NAN;\n  }\n\n\n#define isnan(x) (sizeof (x) == sizeof (float) ? __isnanf (x)\t\\\n  : sizeof (x) == sizeof (double) ? __isnan (x)\t\\\n  : __isnanl (x))\n\n  /* 7.12.3.5 */\n#define isnormal(x) (fpclassify(x) == FP_NORMAL)\n\n  /* 7.12.3.6 The signbit macro */\n  __CRT_INLINE int __cdecl __signbit (double x) {\n    unsigned short stw;\n    __asm__ ( \"fxam; fstsw %%ax;\": \"=a\" (stw) : \"t\" (x));\n    return stw & 0x0200;\n  }\n\n  __CRT_INLINE int __cdecl __signbitf (float x) {\n    unsigned short stw;\n    __asm__ (\"fxam; fstsw %%ax;\": \"=a\" (stw) : \"t\" (x));\n    return stw & 0x0200;\n  }\n\n  __CRT_INLINE int __cdecl __signbitl (long double x) {\n    unsigned short stw;\n    __asm__ (\"fxam; fstsw %%ax;\": \"=a\" (stw) : \"t\" (x));\n    return stw & 0x0200;\n  }\n\n#define signbit(x) (sizeof (x) == sizeof (float) ? __signbitf (x)\t\\\n  : sizeof (x) == sizeof (double) ? __signbit (x)\t\\\n  : __signbitl (x))\n\n  extern double __cdecl exp2(double);\n  extern float __cdecl exp2f(float);\n  extern long double __cdecl exp2l(long double);\n\n#define FP_ILOGB0 ((int)0x80000000)\n#define FP_ILOGBNAN ((int)0x80000000)\n  extern int __cdecl ilogb (double);\n  extern int __cdecl ilogbf (float);\n  extern int __cdecl ilogbl (long double);\n\n  extern double __cdecl log1p(double);\n  extern float __cdecl log1pf(float);\n  extern long double __cdecl log1pl(long double);\n\n  extern double __cdecl log2 (double);\n  extern float __cdecl log2f (float);\n  extern long double __cdecl log2l (long double);\n\n  extern double __cdecl logb (double);\n  extern float __cdecl logbf (float);\n  extern long double __cdecl logbl (long double);\n\n  __CRT_INLINE double __cdecl logb (double x)\n  {\n    double res;\n    __asm__ (\"fxtract\\n\\t\"\n      \"fstp\t%%st\" : \"=t\" (res) : \"0\" (x));\n    return res;\n  }\n\n  __CRT_INLINE float __cdecl logbf (float x)\n  {\n    float res;\n    __asm__ (\"fxtract\\n\\t\"\n      \"fstp\t%%st\" : \"=t\" (res) : \"0\" (x));\n    return res;\n  }\n\n  __CRT_INLINE long double __cdecl logbl (long double x)\n  {\n    long double res;\n    __asm__ (\"fxtract\\n\\t\"\n      \"fstp\t%%st\" : \"=t\" (res) : \"0\" (x));\n    return res;\n  }\n\n  extern long double __cdecl modfl (long double, long double*);\n\n  /* 7.12.6.13 */\n  extern double __cdecl scalbn (double, int);\n  extern float __cdecl scalbnf (float, int);\n  extern long double __cdecl scalbnl (long double, int);\n\n  extern double __cdecl scalbln (double, long);\n  extern float __cdecl scalblnf (float, long);\n  extern long double __cdecl scalblnl (long double, long);\n\n  /* 7.12.7.1 */\n  /* Implementations adapted from Cephes versions */ \n  extern double __cdecl cbrt (double);\n  extern float __cdecl cbrtf (float);\n  extern long double __cdecl cbrtl (long double);\n\n  __CRT_INLINE float __cdecl hypotf (float x, float y)\n  { return (float) hypot (x, y);}\n  extern long double __cdecl hypotl (long double, long double);\n\n  extern long double __cdecl powl (long double, long double);\n  extern long double __cdecl expl(long double);\n  extern long double __cdecl expm1l(long double);\n  extern long double __cdecl coshl(long double);\n  extern long double __cdecl fabsl (long double);\n  extern long double __cdecl acosl(long double);\n  extern long double __cdecl asinl(long double);\n  extern long double __cdecl atanl(long double);\n  extern long double __cdecl atan2l(long double,long double);\n  extern long double __cdecl sinhl(long double);\n  extern long double __cdecl tanhl(long double);\n\n  /* 7.12.8.1 The erf functions  */\n  extern double __cdecl erf (double);\n  extern float __cdecl erff (float);\n  /* TODO\n  extern long double __cdecl erfl (long double);\n  */ \n\n  /* 7.12.8.2 The erfc functions  */\n  extern double __cdecl erfc (double);\n  extern float __cdecl erfcf (float);\n  /* TODO\n  extern long double __cdecl erfcl (long double);\n  */ \n\n  /* 7.12.8.3 The lgamma functions */\n  extern double __cdecl lgamma (double);\n  extern float __cdecl lgammaf (float);\n  extern long double __cdecl lgammal (long double);\n\n  /* 7.12.8.4 The tgamma functions */\n  extern double __cdecl tgamma (double);\n  extern float __cdecl tgammaf (float);\n  extern long double __cdecl tgammal (long double);\n\n  extern long double __cdecl ceill (long double);\n  extern long double __cdecl floorl (long double);\n  extern long double __cdecl frexpl(long double,int *);\n  extern long double __cdecl log10l(long double);\n  extern long double __cdecl logl(long double);\n  extern long double __cdecl cosl(long double);\n  extern long double __cdecl sinl(long double);\n  extern long double __cdecl tanl(long double);\n  extern long double sqrtl(long double);\n\n  /* 7.12.9.3 */\n  extern double __cdecl nearbyint ( double);\n  extern float __cdecl nearbyintf (float);\n  extern long double __cdecl nearbyintl (long double);\n\n  /* 7.12.9.4 */\n  /* round, using fpu control word settings */\n  __CRT_INLINE double __cdecl rint (double x)\n  {\n    double retval;\n    __asm__ (\"frndint;\": \"=t\" (retval) : \"0\" (x));\n    return retval;\n  }\n\n  __CRT_INLINE float __cdecl rintf (float x)\n  {\n    float retval;\n    __asm__ (\"frndint;\" : \"=t\" (retval) : \"0\" (x) );\n    return retval;\n  }\n\n  __CRT_INLINE long double __cdecl rintl (long double x)\n  {\n    long double retval;\n    __asm__ (\"frndint;\" : \"=t\" (retval) : \"0\" (x) );\n    return retval;\n  }\n\n  /* 7.12.9.5 */\n  __CRT_INLINE long __cdecl lrint (double x) \n  {\n    long retval;  \n    __asm__ __volatile__\t\t\t\t\t\t\t      \\\n      (\"fistpl %0\"  : \"=m\" (retval) : \"t\" (x) : \"st\");\t\t\t\t      \\\n      return retval;\n  }\n\n  __CRT_INLINE long __cdecl lrintf (float x) \n  {\n    long retval;\n    __asm__ __volatile__\t\t\t\t\t\t\t      \\\n      (\"fistpl %0\"  : \"=m\" (retval) : \"t\" (x) : \"st\");\t\t\t\t      \\\n      return retval;\n  }\n\n  __CRT_INLINE long __cdecl lrintl (long double x) \n  {\n    long retval;\n    __asm__ __volatile__\t\t\t\t\t\t\t      \\\n      (\"fistpl %0\"  : \"=m\" (retval) : \"t\" (x) : \"st\");\t\t\t\t      \\\n      return retval;\n  }\n\n  __CRT_INLINE long long __cdecl llrint (double x) \n  {\n    long long retval;\n    __asm__ __volatile__\t\t\t\t\t\t\t      \\\n      (\"fistpll %0\"  : \"=m\" (retval) : \"t\" (x) : \"st\");\t\t\t\t      \\\n      return retval;\n  }\n\n  __CRT_INLINE long long __cdecl llrintf (float x) \n  {\n    long long retval;\n    __asm__ __volatile__\t\t\t\t\t\t\t      \\\n      (\"fistpll %0\"  : \"=m\" (retval) : \"t\" (x) : \"st\");\t\t\t\t      \\\n      return retval;\n  }\n\n  __CRT_INLINE long long __cdecl llrintl (long double x) \n  {\n    long long retval;\n    __asm__ __volatile__\t\t\t\t\t\t\t      \\\n      (\"fistpll %0\"  : \"=m\" (retval) : \"t\" (x) : \"st\");\t\t\t\t      \\\n      return retval;\n  }\n\n  /* 7.12.9.6 */\n  /* round away from zero, regardless of fpu control word settings */\n  extern double __cdecl round (double);\n  extern float __cdecl roundf (float);\n  extern long double __cdecl roundl (long double);\n\n  /* 7.12.9.7  */\n  extern long __cdecl lround (double);\n  extern long __cdecl lroundf (float);\n  extern long __cdecl lroundl (long double);\n\n  extern long long __cdecl llround (double);\n  extern long long __cdecl llroundf (float);\n  extern long long __cdecl llroundl (long double);\n\n  /* 7.12.9.8 */\n  /* round towards zero, regardless of fpu control word settings */\n  extern double __cdecl trunc (double);\n  extern float __cdecl truncf (float);\n  extern long double __cdecl truncl (long double);\n\n  extern long double __cdecl fmodl (long double, long double);\n\n  /* 7.12.10.2 */ \n  extern double __cdecl remainder (double, double);\n  extern float __cdecl remainderf (float, float);\n  extern long double __cdecl remainderl (long double, long double);\n\n  /* 7.12.10.3 */\n  extern double __cdecl remquo(double, double, int *);\n  extern float __cdecl remquof(float, float, int *);\n  extern long double __cdecl remquol(long double, long double, int *);\n\n  /* 7.12.11.1 */\n  extern double __cdecl copysign (double, double); /* in libmoldname.a */\n  extern float __cdecl copysignf (float, float);\n  extern long double __cdecl copysignl (long double, long double);\n\n  /* 7.12.11.2 Return a NaN */\n  extern double __cdecl nan(const char *tagp);\n  extern float __cdecl nanf(const char *tagp);\n  extern long double __cdecl nanl(const char *tagp);\n\n#ifndef __STRICT_ANSI__\n#define _nan() nan(\"\")\n#define _nanf() nanf(\"\")\n#define _nanl() nanl(\"\")\n#endif\n\n  /* 7.12.11.3 */\n  extern double __cdecl nextafter (double, double); /* in libmoldname.a */\n  extern float __cdecl nextafterf (float, float);\n  extern long double __cdecl nextafterl (long double, long double);\n\n  /* 7.12.11.4 The nexttoward functions: TODO */\n\n  /* 7.12.12.1 */\n  /*  x > y ? (x - y) : 0.0  */\n  extern double __cdecl fdim (double x, double y);\n  extern float __cdecl fdimf (float x, float y);\n  extern long double __cdecl fdiml (long double x, long double y);\n\n  /* fmax and fmin.\n  NaN arguments are treated as missing data: if one argument is a NaN\n  and the other numeric, then these functions choose the numeric\n  value. */\n\n  /* 7.12.12.2 */\n  extern double __cdecl fmax  (double, double);\n  extern float __cdecl fmaxf (float, float);\n  extern long double __cdecl fmaxl (long double, long double);\n\n  /* 7.12.12.3 */\n  extern double __cdecl fmin (double, double);\n  extern float __cdecl fminf (float, float);\n  extern long double __cdecl fminl (long double, long double);\n\n  /* 7.12.13.1 */\n  /* return x * y + z as a ternary op */ \n  extern double __cdecl fma (double, double, double);\n  extern float __cdecl fmaf (float, float, float);\n  extern long double __cdecl fmal (long double, long double, long double);\n\n\n  /* 7.12.14 */\n  /* \n  *  With these functions, comparisons involving quiet NaNs set the FP\n  *  condition code to \"unordered\".  The IEEE floating-point spec\n  *  dictates that the result of floating-point comparisons should be\n  *  false whenever a NaN is involved, with the exception of the != op, \n  *  which always returns true: yes, (NaN != NaN) is true).\n  */\n\n#if __GNUC__ >= 3\n\n#define isgreater(x, y) __builtin_isgreater(x, y)\n#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)\n#define isless(x, y) __builtin_isless(x, y)\n#define islessequal(x, y) __builtin_islessequal(x, y)\n#define islessgreater(x, y) __builtin_islessgreater(x, y)\n#define isunordered(x, y) __builtin_isunordered(x, y)\n\n#else\n  /*  helper  */\n  __CRT_INLINE int  __cdecl\n    __fp_unordered_compare (long double x, long double y){\n      unsigned short retval;\n      __asm__ (\"fucom %%st(1);\"\n\t\"fnstsw;\": \"=a\" (retval) : \"t\" (x), \"u\" (y));\n      return retval;\n  }\n\n#define isgreater(x, y) ((__fp_unordered_compare(x, y) \\\n  & 0x4500) == 0)\n#define isless(x, y) ((__fp_unordered_compare (y, x) \\\n  & 0x4500) == 0)\n#define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \\\n  & FP_INFINITE) == 0)\n#define islessequal(x, y) ((__fp_unordered_compare(y, x) \\\n  & FP_INFINITE) == 0)\n#define islessgreater(x, y) ((__fp_unordered_compare(x, y) \\\n  & FP_SUBNORMAL) == 0)\n#define isunordered(x, y) ((__fp_unordered_compare(x, y) \\\n  & 0x4500) == 0x4500)\n\n#endif\n\n\n#endif /* __STDC_VERSION__ >= 199901L */\n#endif /* __NO_ISOCEXT */\n\n#ifdef __cplusplus\n}\nextern \"C++\" {\n  template<class _Ty> inline _Ty _Pow_int(_Ty _X,int _Y) {\n    unsigned int _N;\n    if(_Y >= 0) _N = (unsigned int)_Y;\n    else _N = (unsigned int)(-_Y);\n    for(_Ty _Z = _Ty(1);;_X *= _X) {\n      if((_N & 1)!=0) _Z *= _X;\n      if((_N >>= 1)==0) return (_Y < 0 ? _Ty(1) / _Z : _Z); \n    }\n  }\n}\n#endif\n\n#pragma pack(pop)\n\n/* 7.12.14 */\n/* \n *  With these functions, comparisons involving quiet NaNs set the FP\n *  condition code to \"unordered\".  The IEEE floating-point spec\n *  dictates that the result of floating-point comparisons should be\n *  false whenever a NaN is involved, with the exception of the != op, \n *  which always returns true: yes, (NaN != NaN) is true).\n */\n\n#if __GNUC__ >= 3\n\n#define isgreater(x, y) __builtin_isgreater(x, y)\n#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)\n#define isless(x, y) __builtin_isless(x, y)\n#define islessequal(x, y) __builtin_islessequal(x, y)\n#define islessgreater(x, y) __builtin_islessgreater(x, y)\n#define isunordered(x, y) __builtin_isunordered(x, y)\n\n#else\n/*  helper  */\n__CRT_INLINE int  __cdecl\n__fp_unordered_compare (long double x, long double y){\n  unsigned short retval;\n  __asm__ (\"fucom %%st(1);\"\n\t   \"fnstsw;\": \"=a\" (retval) : \"t\" (x), \"u\" (y));\n  return retval;\n}\n\n#define isgreater(x, y) ((__fp_unordered_compare(x, y) \\\n\t\t\t   & 0x4500) == 0)\n#define isless(x, y) ((__fp_unordered_compare (y, x) \\\n                       & 0x4500) == 0)\n#define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \\\n                               & FP_INFINITE) == 0)\n#define islessequal(x, y) ((__fp_unordered_compare(y, x) \\\n\t\t\t    & FP_INFINITE) == 0)\n#define islessgreater(x, y) ((__fp_unordered_compare(x, y) \\\n\t\t\t      & FP_SUBNORMAL) == 0)\n#define isunordered(x, y) ((__fp_unordered_compare(x, y) \\\n\t\t\t    & 0x4500) == 0x4500)\n\n#endif\n\n#endif /* End _MATH_H_ */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/mem.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/*\n * This file is part of the Mingw32 package.\n *\n * mem.h maps to string.h\n */\n#ifndef\t__STRICT_ANSI__\n#include <string.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/memory.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_MEMORY\n#define _INC_MEMORY\n\n#include <_mingw.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _CONST_RETURN\n#define _CONST_RETURN\n#endif\n\n#define _WConst_return _CONST_RETURN\n\n#ifndef _CRT_MEMORY_DEFINED\n#define _CRT_MEMORY_DEFINED\n  _CRTIMP void *__cdecl _memccpy(void *_Dst,const void *_Src,int _Val,size_t _MaxCount);\n  _CONST_RETURN void *__cdecl memchr(const void *_Buf ,int _Val,size_t _MaxCount);\n  _CRTIMP int __cdecl _memicmp(const void *_Buf1,const void *_Buf2,size_t _Size);\n  _CRTIMP int __cdecl _memicmp_l(const void *_Buf1,const void *_Buf2,size_t _Size,_locale_t _Locale);\n  int __cdecl memcmp(const void *_Buf1,const void *_Buf2,size_t _Size);\n  void *__cdecl memcpy(void *_Dst,const void *_Src,size_t _Size);\n  void *__cdecl memset(void *_Dst,int _Val,size_t _Size);\n\n#ifndef\tNO_OLDNAMES\n  void *__cdecl memccpy(void *_Dst,const void *_Src,int _Val,size_t _Size);\n  int __cdecl memicmp(const void *_Buf1,const void *_Buf2,size_t _Size);\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/process.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_PROCESS\n#define _INC_PROCESS\n\n#include <_mingw.h>\n\n/* Includes a definition of _pid_t and pid_t */\n#include <sys/types.h>\n\n#ifndef _POSIX_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define _P_WAIT 0\n#define _P_NOWAIT 1\n#define _OLD_P_OVERLAY 2\n#define _P_NOWAITO 3\n#define _P_DETACH 4\n#define _P_OVERLAY 2\n\n#define _WAIT_CHILD 0\n#define _WAIT_GRANDCHILD 1\n\n  _CRTIMP uintptr_t __cdecl _beginthread(void (__cdecl *_StartAddress) (void *),unsigned _StackSize,void *_ArgList);\n  _CRTIMP void __cdecl _endthread(void);\n  _CRTIMP uintptr_t __cdecl _beginthreadex(void *_Security,unsigned _StackSize,unsigned (__stdcall *_StartAddress) (void *),void *_ArgList,unsigned _InitFlag,unsigned *_ThrdAddr);\n  _CRTIMP void __cdecl _endthreadex(unsigned _Retval);\n\n#ifndef _CRT_TERMINATE_DEFINED\n#define _CRT_TERMINATE_DEFINED\n  void __cdecl __MINGW_NOTHROW exit(int _Code) __MINGW_ATTRIB_NORETURN;\n  _CRTIMP void __cdecl __MINGW_NOTHROW _exit(int _Code) __MINGW_ATTRIB_NORETURN;\n\n#pragma push_macro(\"abort\")\n#undef abort\n  void __cdecl __declspec(noreturn) abort(void);\n#pragma pop_macro(\"abort\")\n\n#endif\n\n  _CRTIMP void __cdecl __MINGW_NOTHROW _cexit(void);\n  _CRTIMP void __cdecl __MINGW_NOTHROW _c_exit(void);\n  _CRTIMP int __cdecl _getpid(void);\n  _CRTIMP intptr_t __cdecl _cwait(int *_TermStat,intptr_t _ProcHandle,int _Action);\n  _CRTIMP intptr_t __cdecl _execl(const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _execle(const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _execlp(const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _execlpe(const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _execv(const char *_Filename,const char *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _execve(const char *_Filename,const char *const *_ArgList,const char *const *_Env);\n  _CRTIMP intptr_t __cdecl _execvp(const char *_Filename,const char *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _execvpe(const char *_Filename,const char *const *_ArgList,const char *const *_Env);\n  _CRTIMP intptr_t __cdecl _spawnl(int _Mode,const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _spawnle(int _Mode,const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _spawnlp(int _Mode,const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _spawnlpe(int _Mode,const char *_Filename,const char *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _spawnv(int _Mode,const char *_Filename,const char *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _spawnve(int _Mode,const char *_Filename,const char *const *_ArgList,const char *const *_Env);\n  _CRTIMP intptr_t __cdecl _spawnvp(int _Mode,const char *_Filename,const char *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _spawnvpe(int _Mode,const char *_Filename,const char *const *_ArgList,const char *const *_Env);\n\n#ifndef _CRT_SYSTEM_DEFINED\n#define _CRT_SYSTEM_DEFINED\n  int __cdecl system(const char *_Command);\n#endif\n\n#ifndef _WPROCESS_DEFINED\n#define _WPROCESS_DEFINED\n  _CRTIMP intptr_t __cdecl _wexecl(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexecle(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexeclp(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexeclpe(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexecv(const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wexecve(const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n  _CRTIMP intptr_t __cdecl _wexecvp(const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wexecvpe(const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n  _CRTIMP intptr_t __cdecl _wspawnl(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnle(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnlp(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnlpe(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnv(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wspawnve(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n  _CRTIMP intptr_t __cdecl _wspawnvp(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wspawnvpe(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n#ifndef _CRT_WSYSTEM_DEFINED\n#define _CRT_WSYSTEM_DEFINED\n  _CRTIMP int __cdecl _wsystem(const wchar_t *_Command);\n#endif\n#endif\n\n  void __cdecl __security_init_cookie(void);\n#if (defined(_X86_) && !defined(__x86_64))\n  void __fastcall __security_check_cookie(uintptr_t _StackCookie);\n  __declspec(noreturn) void __cdecl __report_gsfailure(void);\n#else\n  void __cdecl __security_check_cookie(uintptr_t _StackCookie);\n  __declspec(noreturn) void __cdecl __report_gsfailure(uintptr_t _StackCookie);\n#endif\n  extern uintptr_t __security_cookie;\n\n  intptr_t __cdecl _loaddll(char *_Filename);\n  int __cdecl _unloaddll(intptr_t _Handle);\n  int (__cdecl *__cdecl _getdllprocaddr(intptr_t _Handle,char *_ProcedureName,intptr_t _Ordinal))(void);\n\n#ifdef _DECL_DLLMAIN\n#ifdef _WINDOWS_\n  WINBOOL WINAPI DllMain(HANDLE _HDllHandle,DWORD _Reason,LPVOID _Reserved);\n  WINBOOL WINAPI _CRT_INIT(HANDLE _HDllHandle,DWORD _Reason,LPVOID _Reserved);\n  WINBOOL WINAPI _wCRT_INIT(HANDLE _HDllHandle,DWORD _Reason,LPVOID _Reserved);\n  extern WINBOOL (WINAPI *const _pRawDllMain)(HANDLE,DWORD,LPVOID);\n#else\n  int __stdcall DllMain(void *_HDllHandle,unsigned _Reason,void *_Reserved);\n  int __stdcall _CRT_INIT(void *_HDllHandle,unsigned _Reason,void *_Reserved);\n  int __stdcall _wCRT_INIT(void *_HDllHandle,unsigned _Reason,void *_Reserved);\n  extern int (__stdcall *const _pRawDllMain)(void *,unsigned,void *);\n#endif\n#endif\n\n#ifndef\tNO_OLDNAMES\n#define P_WAIT _P_WAIT\n#define P_NOWAIT _P_NOWAIT\n#define P_OVERLAY _P_OVERLAY\n#define OLD_P_OVERLAY _OLD_P_OVERLAY\n#define P_NOWAITO _P_NOWAITO\n#define P_DETACH _P_DETACH\n#define WAIT_CHILD _WAIT_CHILD\n#define WAIT_GRANDCHILD _WAIT_GRANDCHILD\n\n  intptr_t __cdecl cwait(int *_TermStat,intptr_t _ProcHandle,int _Action);\n#ifdef __GNUC__\n  int __cdecl execl(const char *_Filename,const char *_ArgList,...);\n  int __cdecl execle(const char *_Filename,const char *_ArgList,...);\n  int __cdecl execlp(const char *_Filename,const char *_ArgList,...);\n  int __cdecl execlpe(const char *_Filename,const char *_ArgList,...);\n#else\n    intptr_t __cdecl execl(const char *_Filename,const char *_ArgList,...);\n  intptr_t __cdecl execle(const char *_Filename,const char *_ArgList,...);\n  intptr_t __cdecl execlp(const char *_Filename,const char *_ArgList,...);\n  intptr_t __cdecl execlpe(const char *_Filename,const char *_ArgList,...);\n#endif\n  intptr_t __cdecl spawnl(int,const char *_Filename,const char *_ArgList,...);\n  intptr_t __cdecl spawnle(int,const char *_Filename,const char *_ArgList,...);\n  intptr_t __cdecl spawnlp(int,const char *_Filename,const char *_ArgList,...);\n  intptr_t __cdecl spawnlpe(int,const char *_Filename,const char *_ArgList,...);\n  int __cdecl getpid(void);\n#ifdef __GNUC__\n  /* Those methods are predefined by gcc builtins to return int. So to prevent\n     stupid warnings, define them in POSIX way.  This is save, because those\n     methods do not return in success case, so that the return value is not\n     really dependent to its scalar width.  */\n  int __cdecl execv(const char *_Filename,char *const _ArgList[]);\n  int __cdecl execve(const char *_Filename,char *const _ArgList[],char *const _Env[]);\n  int __cdecl execvp(const char *_Filename,char *const _ArgList[]);\n  int __cdecl execvpe(const char *_Filename,char *const _ArgList[],char *const _Env[]);\n#else\n  intptr_t __cdecl execv(const char *_Filename,char *const _ArgList[]);\n  intptr_t __cdecl execve(const char *_Filename,char *const _ArgList[],char *const _Env[]);\n  intptr_t __cdecl execvp(const char *_Filename,char *const _ArgList[]);\n  intptr_t __cdecl execvpe(const char *_Filename,char *const _ArgList[],char *const _Env[]);\n#endif\n  intptr_t __cdecl spawnv(int,const char *_Filename,char *const _ArgList[]);\n  intptr_t __cdecl spawnve(int,const char *_Filename,char *const _ArgList[],char *const _Env[]);\n  intptr_t __cdecl spawnvp(int,const char *_Filename,char *const _ArgList[]);\n  intptr_t __cdecl spawnvpe(int,const char *_Filename,char *const _ArgList[],char *const _Env[]);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/conio_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n\n#ifndef _INC_CONIO_S\n#define _INC_CONIO_S\n\n#include <conio.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  _CRTIMP errno_t __cdecl _cgets_s(char *_Buffer,size_t _Size,size_t *_SizeRead);\n  _CRTIMP int __cdecl _cprintf_s(const char *_Format,...);\n  _CRTIMP int __cdecl _cscanf_s(const char *_Format,...);\n  _CRTIMP int __cdecl _cscanf_s_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcprintf_s(const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cprintf_s_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcprintf_s_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n\n#ifndef _WCONIO_DEFINED_S\n#define _WCONIO_DEFINED_S\n  _CRTIMP errno_t __cdecl _cgetws_s(wchar_t *_Buffer,size_t _SizeInWords,size_t *_SizeRead);\n  _CRTIMP int __cdecl _cwprintf_s(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf_s(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_s(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cwprintf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_s_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/crtdbg_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n\n#ifndef _INC_CRTDBG_S\n#define _INC_CRTDBG_S\n\n#include <crtdbg.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#define _dupenv_s_dbg(ps1,size,s2,t,f,l) _dupenv_s(ps1,size,s2)\n#define _wdupenv_s_dbg(ps1,size,s2,t,f,l) _wdupenv_s(ps1,size,s2)\n\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/io_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_IO_S\n#define _INC_IO_S\n\n#include <io.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  _CRTIMP errno_t __cdecl _access_s(const char *_Filename,int _AccessMode);\n  _CRTIMP errno_t __cdecl _chsize_s(int _FileHandle,__int64 _Size);\n  _CRTIMP errno_t __cdecl _mktemp_s(char *_TemplateName,size_t _Size);\n  _CRTIMP errno_t __cdecl _umask_s(int _NewMode,int *_OldMode);\n\n#ifndef _WIO_S_DEFINED\n#define _WIO_S_DEFINED\n  _CRTIMP errno_t __cdecl _waccess_s(const wchar_t *_Filename,int _AccessMode);\n  _CRTIMP errno_t __cdecl _wmktemp_s(wchar_t *_TemplateName,size_t _SizeInWords);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/mbstring_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_MBSTRING_S\n#define _INC_MBSTRING_S\n\n#include <mbstring.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _MBSTRING_S_DEFINED\n#define _MBSTRING_S_DEFINED\n  _CRTIMP errno_t __cdecl _mbscat_s(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src);\n  _CRTIMP errno_t __cdecl _mbscat_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbscpy_s(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src);\n  _CRTIMP errno_t __cdecl _mbscpy_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbslwr_s(unsigned char *_Str,size_t _SizeInBytes);\n  _CRTIMP errno_t __cdecl _mbslwr_s_l(unsigned char *_Str,size_t _SizeInBytes,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsnbcat_s(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _mbsnbcat_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsnbcpy_s(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _mbsnbcpy_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsnbset_s(unsigned char *_Dst,size_t _DstSizeInBytes,unsigned int _Ch,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _mbsnbset_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,unsigned int _Ch,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsncat_s(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _mbsncat_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsncpy_s(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _mbsncpy_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,const unsigned char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsnset_s(unsigned char *_Dst,size_t _DstSizeInBytes,unsigned int _Val,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _mbsnset_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,unsigned int _Val,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsset_s(unsigned char *_Dst,size_t _DstSizeInBytes,unsigned int _Val);\n  _CRTIMP errno_t __cdecl _mbsset_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,unsigned int _Val,_locale_t _Locale);\n  _CRTIMP unsigned char *__cdecl _mbstok_s(unsigned char *_Str,const unsigned char *_Delim,unsigned char **_Context);\n  _CRTIMP unsigned char *__cdecl _mbstok_s_l(unsigned char *_Str,const unsigned char *_Delim,unsigned char **_Context,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbsupr_s(unsigned char *_Str,size_t _SizeInBytes);\n  _CRTIMP errno_t __cdecl _mbsupr_s_l(unsigned char *_Str,size_t _SizeInBytes,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _mbccpy_s(unsigned char *_Dst,size_t _DstSizeInBytes,int *_PCopied,const unsigned char *_Src);\n  _CRTIMP errno_t __cdecl _mbccpy_s_l(unsigned char *_Dst,size_t _DstSizeInBytes,int *_PCopied,const unsigned char *_Src,_locale_t _Locale);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/search_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_SEARCH_S\n#define _INC_SEARCH_S\n\n#include <search.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  _CRTIMP void *__cdecl _lfind_s(const void *_Key,const void *_Base,unsigned int *_NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(void *,const void *,const void *),void *_Context);\n  _CRTIMP void *__cdecl _lsearch_s(const void *_Key,void *_Base,unsigned int *_NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(void *,const void *,const void *),void *_Context);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/stdio_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_STDIO_S\n#define _INC_STDIO_S\n\n#include <stdio.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _STDIO_S_DEFINED\n#define _STDIO_S_DEFINED\n  _CRTIMP errno_t __cdecl clearerr_s(FILE *_File);\n  int __cdecl fprintf_s(FILE *_File,const char *_Format,...);\n  size_t __cdecl fread_s(void *_DstBuf,size_t _DstSize,size_t _ElementSize,size_t _Count,FILE *_File);\n  _CRTIMP int __cdecl _fscanf_s_l(FILE *_File,const char *_Format,_locale_t _Locale,...);\n  int __cdecl printf_s(const char *_Format,...);\n  _CRTIMP int __cdecl _scanf_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _scanf_s_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snprintf_s(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,...);\n  _CRTIMP int __cdecl _snprintf_c(char *_DstBuf,size_t _MaxCount,const char *_Format,...);\n  _CRTIMP int __cdecl _vsnprintf_c(char *_DstBuf,size_t _MaxCount,const char *_Format,va_list _ArgList);\n  int __cdecl sprintf_s(char *_DstBuf,size_t _DstSize,const char *_Format,...);\n  _CRTIMP int __cdecl _fscanf_l(FILE *_File,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _sscanf_l(const char *_Src,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _sscanf_s_l(const char *_Src,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snscanf_s(const char *_Src,size_t _MaxCount,const char *_Format,...);\n  _CRTIMP int __cdecl _snscanf_l(const char *_Src,size_t _MaxCount,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snscanf_s_l(const char *_Src,size_t _MaxCount,const char *_Format,_locale_t _Locale,...);\n  int __cdecl vfprintf_s(FILE *_File,const char *_Format,va_list _ArgList);\n  int __cdecl vprintf_s(const char *_Format,va_list _ArgList);\n  int __cdecl vsnprintf_s(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _vsnprintf_s(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,va_list _ArgList);\n  int __cdecl vsprintf_s(char *_DstBuf,size_t _Size,const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _fprintf_p(FILE *_File,const char *_Format,...);\n  _CRTIMP int __cdecl _printf_p(const char *_Format,...);\n  _CRTIMP int __cdecl _sprintf_p(char *_Dst,size_t _MaxCount,const char *_Format,...);\n  _CRTIMP int __cdecl _vfprintf_p(FILE *_File,const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _vprintf_p(const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _vsprintf_p(char *_Dst,size_t _MaxCount,const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _scprintf_p(const char *_Format,...);\n  _CRTIMP int __cdecl _vscprintf_p(const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _printf_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _printf_p_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vprintf_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vprintf_p_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fprintf_l(FILE *_File,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _fprintf_p_l(FILE *_File,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vfprintf_l(FILE *_File,const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vfprintf_p_l(FILE *_File,const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _sprintf_l(char *_DstBuf,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _sprintf_p_l(char *_DstBuf,size_t _MaxCount,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsprintf_l(char *_DstBuf,const char *_Format,_locale_t,va_list _ArgList);\n  _CRTIMP int __cdecl _vsprintf_p_l(char *_DstBuf,size_t _MaxCount,const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _scprintf_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _scprintf_p_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vscprintf_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vscprintf_p_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _printf_s_l(const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vprintf_s_l(const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fprintf_s_l(FILE *_File,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vfprintf_s_l(FILE *_File,const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _sprintf_s_l(char *_DstBuf,size_t _DstSize,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsprintf_s_l(char *_DstBuf,size_t _DstSize,const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _snprintf_s_l(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsnprintf_s_l(char *_DstBuf,size_t _DstSize,size_t _MaxCount,const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _snprintf_l(char *_DstBuf,size_t _MaxCount,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snprintf_c_l(char *_DstBuf,size_t _MaxCount,const char *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsnprintf_l(char *_DstBuf,size_t _MaxCount,const char *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vsnprintf_c_l(char *_DstBuf,size_t _MaxCount,const char *,_locale_t _Locale,va_list _ArgList);\n\n#ifndef _WSTDIO_S_DEFINED\n#define _WSTDIO_S_DEFINED\n  _CRTIMP wchar_t *__cdecl _getws_s(wchar_t *_Str,size_t _SizeInWords);\n  int __cdecl fwprintf_s(FILE *_File,const wchar_t *_Format,...);\n  int __cdecl wprintf_s(const wchar_t *_Format,...);\n  int __cdecl vwprintf_s(const wchar_t *_Format,va_list _ArgList);\n  int __cdecl swprintf_s(wchar_t *_Dst,size_t _SizeInWords,const wchar_t *_Format,...);\n  int __cdecl vswprintf_s(wchar_t *_Dst,size_t _SizeInWords,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf_s(wchar_t *_DstBuf,size_t _DstSizeInWords,size_t _MaxCount,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vsnwprintf_s(wchar_t *_DstBuf,size_t _DstSizeInWords,size_t _MaxCount,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _wprintf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vwprintf_s_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fwprintf_s_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vfwprintf_s_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _swprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vswprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsnwprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fwscanf_s_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _swscanf_s_l(const wchar_t *_Src,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snwscanf_s(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _snwscanf_s_l(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _wscanf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP errno_t __cdecl _wfopen_s(FILE **_File,const wchar_t *_Filename,const wchar_t *_Mode);\n  _CRTIMP errno_t __cdecl _wfreopen_s(FILE **_File,const wchar_t *_Filename,const wchar_t *_Mode,FILE *_OldFile);\n  _CRTIMP errno_t __cdecl _wtmpnam_s(wchar_t *_DstBuf,size_t _SizeInWords);\n  _CRTIMP int __cdecl _fwprintf_p(FILE *_File,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _wprintf_p(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vfwprintf_p(FILE *_File,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _vwprintf_p(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _swprintf_p(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vswprintf_p(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _scwprintf_p(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vscwprintf_p(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _wprintf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _wprintf_p_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vwprintf_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fwprintf_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _fwprintf_p_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vfwprintf_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vfwprintf_p_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _swprintf_c_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _swprintf_p_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vswprintf_c_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vswprintf_p_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _scwprintf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _scwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vscwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsnwprintf_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl __swprintf_l(wchar_t *_Dest,const wchar_t *_Format,_locale_t _Plocinfo,...);\n  _CRTIMP int __cdecl __vswprintf_l(wchar_t *_Dest,const wchar_t *_Format,_locale_t _Plocinfo,va_list _Args);\n  _CRTIMP int __cdecl _vscwprintf_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fwscanf_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _swscanf_l(const wchar_t *_Src,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snwscanf_l(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _wscanf_l(const wchar_t *_Format,_locale_t _Locale,...);\n#endif\n#endif\n\n  _CRTIMP size_t __cdecl _fread_nolock_s(void *_DstBuf,size_t _DstSize,size_t _ElementSize,size_t _Count,FILE *_File);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/stdlib_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_STDLIB_S\n#define _INC_STDLIB_S\n\n#include <stdlib.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  _CRTIMP errno_t __cdecl _dupenv_s(char **_PBuffer,size_t *_PBufferSizeInBytes,const char *_VarName);\n  _CRTIMP errno_t __cdecl _itoa_s(int _Value,char *_DstBuf,size_t _Size,int _Radix);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP errno_t __cdecl _i64toa_s(__int64 _Val,char *_DstBuf,size_t _Size,int _Radix);\n  _CRTIMP errno_t __cdecl _ui64toa_s(unsigned __int64 _Val,char *_DstBuf,size_t _Size,int _Radix);\n#endif\n  _CRTIMP errno_t __cdecl _ltoa_s(long _Val,char *_DstBuf,size_t _Size,int _Radix);\n  _CRTIMP errno_t __cdecl mbstowcs_s(size_t *_PtNumOfCharConverted,wchar_t *_DstBuf,size_t _SizeInWords,const char *_SrcBuf,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _mbstowcs_s_l(size_t *_PtNumOfCharConverted,wchar_t *_DstBuf,size_t _SizeInWords,const char *_SrcBuf,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _ultoa_s(unsigned long _Val,char *_DstBuf,size_t _Size,int _Radix);\n  _CRTIMP errno_t __cdecl _wctomb_s_l(int *_SizeConverted,char *_MbCh,size_t _SizeInBytes,wchar_t _WCh,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl wcstombs_s(size_t *_PtNumOfCharConverted,char *_Dst,size_t _DstSizeInBytes,const wchar_t *_Src,size_t _MaxCountInBytes);\n  _CRTIMP errno_t __cdecl _wcstombs_s_l(size_t *_PtNumOfCharConverted,char *_Dst,size_t _DstSizeInBytes,const wchar_t *_Src,size_t _MaxCountInBytes,_locale_t _Locale);\n\n#ifndef _WSTDLIB_S_DEFINED\n#define _WSTDLIB_S_DEFINED\n  _CRTIMP errno_t __cdecl _itow_s (int _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _ltow_s (long _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _ultow_s (unsigned long _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _wgetenv_s(size_t *_ReturnSize,wchar_t *_DstBuf,size_t _DstSizeInWords,const wchar_t *_VarName);\n  _CRTIMP errno_t __cdecl _wdupenv_s(wchar_t **_Buffer,size_t *_BufferSizeInWords,const wchar_t *_VarName);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP errno_t __cdecl _i64tow_s(__int64 _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _ui64tow_s(unsigned __int64 _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n#endif\n#endif\n\n#ifndef _POSIX_\n  _CRTIMP errno_t __cdecl _ecvt_s(char *_DstBuf,size_t _Size,double _Val,int _NumOfDights,int *_PtDec,int *_PtSign);\n  _CRTIMP errno_t __cdecl _fcvt_s(char *_DstBuf,size_t _Size,double _Val,int _NumOfDec,int *_PtDec,int *_PtSign);\n  _CRTIMP errno_t __cdecl _gcvt_s(char *_DstBuf,size_t _Size,double _Val,int _NumOfDigits);\n  _CRTIMP errno_t __cdecl _makepath_s(char *_PathResult,size_t _Size,const char *_Drive,const char *_Dir,const char *_Filename,const char *_Ext);\n  _CRTIMP errno_t __cdecl _putenv_s(const char *_Name,const char *_Value);\n  _CRTIMP errno_t __cdecl _searchenv_s(const char *_Filename,const char *_EnvVar,char *_ResultPath,size_t _SizeInBytes);\n  _CRTIMP errno_t __cdecl _splitpath_s(const char *_FullPath,char *_Drive,size_t _DriveSize,char *_Dir,size_t _DirSize,char *_Filename,size_t _FilenameSize,char *_Ext,size_t _ExtSize);\n\n#ifndef _WSTDLIBP_S_DEFINED\n#define _WSTDLIBP_S_DEFINED\n  _CRTIMP errno_t __cdecl _wmakepath_s(wchar_t *_PathResult,size_t _SizeInWords,const wchar_t *_Drive,const wchar_t *_Dir,const wchar_t *_Filename,const wchar_t *_Ext);\n  _CRTIMP errno_t __cdecl _wputenv_s(const wchar_t *_Name,const wchar_t *_Value);\n  _CRTIMP errno_t __cdecl _wsearchenv_s(const wchar_t *_Filename,const wchar_t *_EnvVar,wchar_t *_ResultPath,size_t _SizeInWords);\n  _CRTIMP errno_t __cdecl _wsplitpath_s(const wchar_t *_FullPath,wchar_t *_Drive,size_t _DriveSizeInWords,wchar_t *_Dir,size_t _DirSizeInWords,wchar_t *_Filename,size_t _FilenameSizeInWords,wchar_t *_Ext,size_t _ExtSizeInWords);\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/stralign_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef __STRALIGN_H_S_\n#define __STRALIGN_H_S_\n\n#include <stralign.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if !defined(I_X86_) && defined(_WSTRING_S_DEFINED)\n#if defined(__cplusplus) && defined(_WConst_Return)\n  static __inline PUWSTR ua_wcscpy_s(PUWSTR Destination,size_t DestinationSize,PCUWSTR Source) {\n    if(WSTR_ALIGNED(Source) && WSTR_ALIGNED(Destination)) return (wcscpy_s((PWSTR)Destination,DestinationSize,(PCWSTR)Source)==0 ? Destination : NULL);\n    return uaw_wcscpy((PCUWSTR)String,Character);\n  }\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/string_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_STRING_S\n#define _INC_STRING_S\n\n#include <string.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  _CRTIMP errno_t __cdecl _strset_s(char *_Dst,size_t _DstSize,int _Value);\n  _CRTIMP errno_t __cdecl _strerror_s(char *_Buf,size_t _SizeInBytes,const char *_ErrMsg);\n  _CRTIMP errno_t __cdecl _strlwr_s(char *_Str,size_t _Size);\n  _CRTIMP errno_t __cdecl _strlwr_s_l(char *_Str,size_t _Size,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _strnset_s(char *_Str,size_t _Size,int _Val,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _strupr_s(char *_Str,size_t _Size);\n  _CRTIMP errno_t __cdecl _strupr_s_l(char *_Str,size_t _Size,_locale_t _Locale);\n#ifndef _WSTRING_S_DEFINED\n#define _WSTRING_S_DEFINED\n  _CRTIMP wchar_t *__cdecl wcstok_s(wchar_t *_Str,const wchar_t *_Delim,wchar_t **_Context);\n  _CRTIMP errno_t __cdecl _wcserror_s(wchar_t *_Buf,size_t _SizeInWords,int _ErrNum);\n  _CRTIMP errno_t __cdecl __wcserror_s(wchar_t *_Buffer,size_t _SizeInWords,const wchar_t *_ErrMsg);\n  _CRTIMP errno_t __cdecl _wcsnset_s(wchar_t *_Dst,size_t _DstSizeInWords,wchar_t _Val,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _wcsset_s(wchar_t *_Str,size_t _SizeInWords,wchar_t _Val);\n  _CRTIMP errno_t __cdecl _wcslwr_s(wchar_t *_Str,size_t _SizeInWords);\n  _CRTIMP errno_t __cdecl _wcslwr_s_l(wchar_t *_Str,size_t _SizeInWords,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _wcsupr_s(wchar_t *_Str,size_t _Size);\n  _CRTIMP errno_t __cdecl _wcsupr_s_l(wchar_t *_Str,size_t _Size,_locale_t _Locale);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/sys/timeb_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n\n#ifndef _TIMEB_H_S\n#define _TIMEB_H_S\n\n#include <sys/timeb.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef _USE_32BIT_TIME_T\n#define _ftime_s _ftime32_s\n#else\n#define _ftime_s _ftime64_s\n#endif\n\n  _CRTIMP errno_t __cdecl _ftime32_s(struct __timeb32 *_Time);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP errno_t __cdecl _ftime64_s(struct __timeb64 *_Time);\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/tchar_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_TCHAR_S\n#define _INC_TCHAR_S\n\n#include <tchar.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef _UNICODE\n\n#define _tprintf_s wprintf_s\n#define _tprintf_s_l _wprintf_s_l\n#define _tcprintf_s _cwprintf_s\n#define _tcprintf_s_l _cwprintf_s_l\n#define _vtcprintf_s _vcwprintf_s\n#define _vtcprintf_s_l _vcwprintf_s_l\n#define _ftprintf_s fwprintf_s\n#define _ftprintf_s_l _fwprintf_s_l\n#define _stprintf_s swprintf_s\n#define _stprintf_s_l _swprintf_s_l\n#define _sntprintf_s _snwprintf_s\n#define _sntprintf_s_l _snwprintf_s_l\n#define _vtprintf_s vwprintf_s\n#define _vtprintf_s_l _vwprintf_s_l\n#define _vftprintf_s vfwprintf_s\n#define _vftprintf_s_l _vfwprintf_s_l\n#define _vstprintf_s vswprintf_s\n#define _vstprintf_s_l _vswprintf_s_l\n#define _vsntprintf_s _vsnwprintf_s\n#define _vsntprintf_s_l _vsnwprintf_s_l\n\n#define _tscanf_s wscanf_s\n#define _tscanf_s_l _wscanf_s_l\n#define _tcscanf_s _cwscanf_s\n#define _tcscanf_s_l _cwscanf_s_l\n#define _ftscanf_s fwscanf_s\n#define _ftscanf_s_l _fwscanf_s_l\n#define _stscanf_s swscanf_s\n#define _stscanf_s_l _swscanf_s_l\n#define _sntscanf_s _snwscanf_s\n#define _sntscanf_s_l _snwscanf_s_l\n\n#define _cgetts_s _cgetws_s\n#define _getts_s _getws_s\n\n#define _itot_s _itow_s\n#define _ltot_s _ltow_s\n#define _ultot_s _ultow_s\n#define _i64tot_s _i64tow_s\n#define _ui64tot_s _ui64tow_s\n\n#define _tcscat_s wcscat_s\n#define _tcscpy_s wcscpy_s\n#define _tcsncat_s wcsncat_s\n#define _tcsncat_s_l _wcsncat_s_l\n#define _tcsncpy_s wcsncpy_s\n#define _tcsncpy_s_l _wcsncpy_s_l\n#define _tcstok_s wcstok_s\n#define _tcstok_s_l _wcstok_s_l\n#define _tcserror_s _wcserror_s\n#define __tcserror_s __wcserror_s\n\n#define _tcsnset_s _wcsnset_s\n#define _tcsnset_s_l _wcsnset_s_l\n#define _tcsset_s _wcsset_s\n#define _tcsset_s_l _wcsset_s_l\n\n#define _tasctime_s _wasctime_s\n#define _tctime_s _wctime_s\n#define _tctime32_s _wctime32_s\n#define _tctime64_s _wctime64_s\n#define _tstrdate_s _wstrdate_s\n#define _tstrtime_s _wstrtime_s\n\n#define _tgetenv_s _wgetenv_s\n#define _tdupenv_s _wdupenv_s\n#define _tmakepath_s _wmakepath_s\n#define _tputenv_s _wputenv_s\n#define _tsearchenv_s _wsearchenv_s\n#define _tsplitpath_s _wsplitpath_s\n\n#define _tfopen_s _wfopen_s\n#define _tfreopen_s _wfreopen_s\n#define _ttmpnam_s _wtmpnam_s\n#define _taccess_s _waccess_s\n#define _tmktemp_s _wmktemp_s\n\n#define _tcsnccat_s wcsncat_s\n#define _tcsnccat_s_l _wcsncat_s_l\n#define _tcsnccpy_s wcsncpy_s\n#define _tcsnccpy_s_l _wcsncpy_s_l\n\n#define _tcslwr_s _wcslwr_s\n#define _tcslwr_s_l _wcslwr_s_l\n#define _tcsupr_s _wcsupr_s\n#define _tcsupr_s_l _wcsupr_s_l\n\n#define _wcstok_s_l(_String,_Delimiters,_Current_position,_Locale) (wcstok_s(_String,_Delimiters,_Current_position))\n#define _wcsnset_s_l(_Destination,_Destination_size_chars,_Value,_Count,_Locale) (_wcsnset_s(_Destination,_Destination_size_chars,_Value,_Count))\n#define _wcsset_s_l(_Destination,_Destination_size_chars,_Value,_Locale) (_wcsset_s(_Destination,_Destination_size_chars,_Value))\n\n#else\n\n#define _tprintf_s printf_s\n#define _tprintf_s_l _printf_s_l\n#define _tcprintf_s _cprintf_s\n#define _tcprintf_s_l _cprintf_s_l\n#define _vtcprintf_s _vcprintf_s\n#define _vtcprintf_s_l _vcprintf_s_l\n#define _ftprintf_s fprintf_s\n#define _ftprintf_s_l _fprintf_s_l\n#define _stprintf_s sprintf_s\n#define _stprintf_s_l _sprintf_s_l\n#define _sntprintf_s _snprintf_s\n#define _sntprintf_s_l _snprintf_s_l\n#define _vtprintf_s vprintf_s\n#define _vtprintf_s_l _vprintf_s_l\n#define _vftprintf_s vfprintf_s\n#define _vftprintf_s_l _vfprintf_s_l\n#define _vstprintf_s vsprintf_s\n#define _vstprintf_s_l _vsprintf_s_l\n#define _vsntprintf_s _vsnprintf_s\n#define _vsntprintf_s_l _vsnprintf_s_l\n#define _tscanf_s scanf_s\n#define _tscanf_s_l _scanf_s_l\n#define _tcscanf_s _cscanf_s\n#define _tcscanf_s_l _cscanf_s_l\n#define _ftscanf_s fscanf_s\n#define _ftscanf_s_l _fscanf_s_l\n#define _stscanf_s sscanf_s\n#define _stscanf_s_l _sscanf_s_l\n#define _sntscanf_s _snscanf_s\n#define _sntscanf_s_l _snscanf_s_l\n\n#define _getts_s gets_s\n#define _cgetts_s _cgets_s\n#define _itot_s _itoa_s\n#define _ltot_s _ltoa_s\n#define _ultot_s _ultoa_s\n#define _i64tot_s _i64toa_s\n#define _ui64tot_s _ui64toa_s\n\n#define _tcscat_s strcat_s\n#define _tcscpy_s strcpy_s\n#define _tcserror_s strerror_s\n#define __tcserror_s _strerror_s\n\n#define _tasctime_s asctime_s\n#define _tctime_s ctime_s\n#define _tctime32_s _ctime32_s\n#define _tctime64_s _ctime64_s\n#define _tstrdate_s _strdate_s\n#define _tstrtime_s _strtime_s\n\n#define _tgetenv_s getenv_s\n#define _tdupenv_s _dupenv_s\n#define _tmakepath_s _makepath_s\n#define _tputenv_s _putenv_s\n#define _tsearchenv_s _searchenv_s\n#define _tsplitpath_s _splitpath_s\n\n#define _tfopen_s fopen_s\n#define _tfreopen_s freopen_s\n#define _ttmpnam_s tmpnam_s\n#define _tmktemp_s _mktemp_s\n\n#ifndef _POSIX_\n#define _taccess_s _access_s\n#endif\n\n#define _tsopen_s _sopen_s\n\n#ifdef _MBCS\n\n#ifdef _MB_MAP_DIRECT\n\n#define _tcsncat_s _mbsnbcat_s\n#define _tcsncat_s_l _mbsnbcat_s_l\n#define _tcsncpy_s _mbsnbcpy_s\n#define _tcsncpy_s_l _mbsnbcpy_s_l\n#define _tcstok_s _mbstok_s\n#define _tcstok_s_l _mbstok_s_l\n\n#define _tcsnset_s _mbsnbset_s\n#define _tcsnset_s_l _mbsnbset_s_l\n#define _tcsset_s _mbsset_s\n#define _tcsset_s_l _mbsset_s_l\n\n#define _tcsnccat_s _mbsncat_s\n#define _tcsnccat_s_l _mbsncat_s_l\n#define _tcsnccpy_s _mbsncpy_s\n#define _tcsnccpy_s_l _mbsncpy_s_l\n#define _tcsncset_s _mbsnset_s\n#define _tcsncset_s_l _mbsnset_s_l\n\n#define _tcslwr_s _mbslwr_s\n#define _tcslwr_s_l _mbslwr_s_l\n#define _tcsupr_s _mbsupr_s\n#define _tcsupr_s_l _mbsupr_s_l\n\n#define _tccpy_s _mbccpy_s\n#define _tccpy_s_l _mbccpy_s_l\n#else\n\n  _CRTIMP char *__cdecl _tcsncat_s(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsncat_s_l(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsncpy_s(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsncpy_s_l(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcstok_s(char *_Str,const char *_Delim,char **_Context);\n  _CRTIMP char *__cdecl _tcstok_s_l(char *_Str,const char *_Delim,char **_Context,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _tcsset_s(char *_Str,size_t _SizeInChars,unsigned int _Val);\n  _CRTIMP errno_t __cdecl _tcsset_s_l(char *_Str,size_t _SizeInChars,unsigned int,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsnccat_s(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsnccat_s_l(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsnccpy_s(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsnccpy_s_l(char *_Dst,size_t _DstSizeInChars,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcslwr_s(char *_Str,size_t _SizeInChars);\n  _CRTIMP char *__cdecl _tcslwr_s_l(char *_Str,size_t _SizeInChars,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsupr_s(char *_Str,size_t _SizeInChars);\n  _CRTIMP char *__cdecl _tcsupr_s_l(char *_Str,size_t _SizeInChars,_locale_t _Locale);\n\n#endif\n\n#else\n\n#define _tcsncat_s strncat_s\n#define _tcsncat_s_l _strncat_s_l\n#define _tcsncpy_s strncpy_s\n#define _tcsncpy_s_l _strncpy_s_l\n#define _tcstok_s strtok_s\n#define _tcstok_s_l _strtok_s_l\n\n#define _tcsnset_s _strnset_s\n#define _tcsnset_s_l _strnset_s_l\n#define _tcsset_s _strset_s\n#define _tcsset_s _strset_s\n#define _tcsset_s_l _strset_s_l\n\n#define _tcsnccat_s strncat_s\n#define _tcsnccat_s_l _strncat_s_l\n#define _tcsnccpy_s strncpy_s\n#define _tcsnccpy_s_l _strncpy_s_l\n\n#define _tcslwr_s _strlwr_s\n#define _tcslwr_s_l _strlwr_s_l\n#define _tcsupr_s _strupr_s\n#define _tcsupr_s_l _strupr_s_l\n\n#define _strnset_s_l(_Destination,_Destination_size_chars,_Value,_Count,_Locale) (_strnset_s(_Destination,_Destination_size_chars,_Value,_Count))\n#define _strset_s_l(_Destination,_Destination_size_chars,_Value,_Locale) (_strset_s(_Destination,_Destination_size_chars,_Value))\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/time_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _TIME_H__S\n#define _TIME_H__S\n\n#include <time.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  _CRTIMP errno_t __cdecl _ctime32_s(char *_Buf,size_t _SizeInBytes,const __time32_t *_Time);\n  _CRTIMP errno_t __cdecl _gmtime32_s(struct tm *_Tm,const __time32_t *_Time);\n  _CRTIMP errno_t __cdecl _localtime32_s(struct tm *_Tm,const __time32_t *_Time);\n  _CRTIMP errno_t __cdecl _strdate_s(char *_Buf,size_t _SizeInBytes);\n  _CRTIMP errno_t __cdecl _strtime_s(char *_Buf ,size_t _SizeInBytes);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP errno_t __cdecl _ctime64_s(char *_Buf,size_t _SizeInBytes,const __time64_t *_Time);\n  _CRTIMP errno_t __cdecl _gmtime64_s(struct tm *_Tm,const __time64_t *_Time);\n  _CRTIMP errno_t __cdecl _localtime64_s(struct tm *_Tm,const __time64_t *_Time);\n#endif\n\n#ifndef _WTIME_S_DEFINED\n#define _WTIME_S_DEFINED\n  _CRTIMP errno_t __cdecl _wasctime_s(wchar_t *_Buf,size_t _SizeInWords,const struct tm *_Tm);\n  _CRTIMP errno_t __cdecl _wctime32_s(wchar_t *_Buf,size_t _SizeInWords,const __time32_t *_Time);\n  _CRTIMP errno_t __cdecl _wstrdate_s(wchar_t *_Buf,size_t _SizeInWords);\n  _CRTIMP errno_t __cdecl _wstrtime_s(wchar_t *_Buf,size_t _SizeInWords);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP errno_t __cdecl _wctime64_s(wchar_t *_Buf,size_t _SizeInWords,const __time64_t *_Time);\n#endif\n\n#if !defined (RC_INVOKED) && !defined (_INC_WTIME_S_INL)\n#define _INC_WTIME_S_INL\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE errno_t __cdecl _wctime_s(wchar_t *_Buffer,size_t _SizeInWords,const time_t *_Time) { return _wctime32_s(_Buffer,_SizeInWords,_Time); }\n#else\n__CRT_INLINE errno_t __cdecl _wctime_s(wchar_t *_Buffer,size_t _SizeInWords,const time_t *_Time) { return _wctime64_s(_Buffer,_SizeInWords,_Time); }\n#endif\n#endif\n#endif\n\n#ifndef RC_INVOKED\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE errno_t __cdecl localtime_s(struct tm *_Tm,const time_t *_Time) { return _localtime32_s(_Tm,_Time); }\n#else\n__CRT_INLINE errno_t __cdecl localtime_s(struct tm *_Tm,const time_t *_Time) { return _localtime64_s(_Tm,_Time); }\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sec_api/wchar_s.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_WCHAR_S\n#define _INC_WCHAR_S\n\n#include <wchar.h>\n\n#if defined(MINGW_HAS_SECURE_API)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _WIO_S_DEFINED\n#define _WIO_S_DEFINED\n  _CRTIMP errno_t __cdecl _waccess_s(const wchar_t *_Filename,int _AccessMode);\n  _CRTIMP errno_t __cdecl _wmktemp_s(wchar_t *_TemplateName,size_t _SizeInWords);\n#endif\n\n#ifndef _WCONIO_S_DEFINED\n#define _WCONIO_S_DEFINED\n  _CRTIMP errno_t __cdecl _cgetws_s(wchar_t *_Buffer,size_t _SizeInWords,size_t *_SizeRead);\n  _CRTIMP int __cdecl _cwprintf_s(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf_s(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_s(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cwprintf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_s_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n#endif\n\n#ifndef _WSTDIO_S_DEFINED\n#define _WSTDIO_S_DEFINED\n  _CRTIMP wchar_t *__cdecl _getws_s(wchar_t *_Str,size_t _SizeInWords);\n  int __cdecl fwprintf_s(FILE *_File,const wchar_t *_Format,...);\n  int __cdecl wprintf_s(const wchar_t *_Format,...);\n  int __cdecl vfwprintf_s(FILE *_File,const wchar_t *_Format,va_list _ArgList);\n  int __cdecl vwprintf_s(const wchar_t *_Format,va_list _ArgList);\n  int __cdecl swprintf_s(wchar_t *_Dst,size_t _SizeInWords,const wchar_t *_Format,...);\n  int __cdecl vswprintf_s(wchar_t *_Dst,size_t _SizeInWords,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf_s(wchar_t *_DstBuf,size_t _DstSizeInWords,size_t _MaxCount,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vsnwprintf_s(wchar_t *_DstBuf,size_t _DstSizeInWords,size_t _MaxCount,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _wprintf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vwprintf_s_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fwprintf_s_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vfwprintf_s_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _swprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vswprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsnwprintf_s_l(wchar_t *_DstBuf,size_t _DstSize,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fwscanf_s_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _swscanf_s_l(const wchar_t *_Src,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snwscanf_s(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _snwscanf_s_l(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _wscanf_s_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP errno_t __cdecl _wfopen_s(FILE **_File,const wchar_t *_Filename,const wchar_t *_Mode);\n  _CRTIMP errno_t __cdecl _wfreopen_s(FILE **_File,const wchar_t *_Filename,const wchar_t *_Mode,FILE *_OldFile);\n  _CRTIMP errno_t __cdecl _wtmpnam_s(wchar_t *_DstBuf,size_t _SizeInWords);\n#endif\n\n#ifndef _WSTDLIB_S_DEFINED\n#define _WSTDLIB_S_DEFINED\n  _CRTIMP errno_t __cdecl _itow_s (int _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _ltow_s (long _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _ultow_s (unsigned long _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _wgetenv_s(size_t *_ReturnSize,wchar_t *_DstBuf,size_t _DstSizeInWords,const wchar_t *_VarName);\n  _CRTIMP errno_t __cdecl _wdupenv_s(wchar_t **_Buffer,size_t *_BufferSizeInWords,const wchar_t *_VarName);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP errno_t __cdecl _i64tow_s(__int64 _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n  _CRTIMP errno_t __cdecl _ui64tow_s(unsigned __int64 _Val,wchar_t *_DstBuf,size_t _SizeInWords,int _Radix);\n#endif\n#endif\n\n#ifndef _POSIX_\n#ifndef _WSTDLIBP_S_DEFINED\n#define _WSTDLIBP_S_DEFINED\n  _CRTIMP errno_t __cdecl _wmakepath_s(wchar_t *_PathResult,size_t _SizeInWords,const wchar_t *_Drive,const wchar_t *_Dir,const wchar_t *_Filename,const wchar_t *_Ext);\n  _CRTIMP errno_t __cdecl _wputenv_s(const wchar_t *_Name,const wchar_t *_Value);\n  _CRTIMP errno_t __cdecl _wsearchenv_s(const wchar_t *_Filename,const wchar_t *_EnvVar,wchar_t *_ResultPath,size_t _SizeInWords);\n  _CRTIMP errno_t __cdecl _wsplitpath_s(const wchar_t *_FullPath,wchar_t *_Drive,size_t _DriveSizeInWords,wchar_t *_Dir,size_t _DirSizeInWords,wchar_t *_Filename,size_t _FilenameSizeInWords,wchar_t *_Ext,size_t _ExtSizeInWords);\n#endif\n#endif\n\n#ifndef _WSTRING_S_DEFINED\n#define _WSTRING_S_DEFINED\n  _CRTIMP wchar_t *__cdecl wcstok_s(wchar_t *_Str,const wchar_t *_Delim,wchar_t **_Context);\n  _CRTIMP errno_t __cdecl _wcserror_s(wchar_t *_Buf,size_t _SizeInWords,int _ErrNum);\n  _CRTIMP errno_t __cdecl __wcserror_s(wchar_t *_Buffer,size_t _SizeInWords,const wchar_t *_ErrMsg);\n  _CRTIMP errno_t __cdecl _wcsnset_s(wchar_t *_Dst,size_t _DstSizeInWords,wchar_t _Val,size_t _MaxCount);\n  _CRTIMP errno_t __cdecl _wcsset_s(wchar_t *_Str,size_t _SizeInWords,wchar_t _Val);\n  _CRTIMP errno_t __cdecl _wcslwr_s(wchar_t *_Str,size_t _SizeInWords);\n  _CRTIMP errno_t __cdecl _wcslwr_s_l(wchar_t *_Str,size_t _SizeInWords,_locale_t _Locale);\n  _CRTIMP errno_t __cdecl _wcsupr_s(wchar_t *_Str,size_t _Size);\n  _CRTIMP errno_t __cdecl _wcsupr_s_l(wchar_t *_Str,size_t _Size,_locale_t _Locale);\n#endif\n\n#ifndef _WTIME_S_DEFINED\n#define _WTIME_S_DEFINED\n  _CRTIMP errno_t __cdecl _wasctime_s(wchar_t *_Buf,size_t _SizeInWords,const struct tm *_Tm);\n  _CRTIMP errno_t __cdecl _wctime32_s(wchar_t *_Buf,size_t _SizeInWords,const __time32_t *_Time);\n  _CRTIMP errno_t __cdecl _wstrdate_s(wchar_t *_Buf,size_t _SizeInWords);\n  _CRTIMP errno_t __cdecl _wstrtime_s(wchar_t *_Buf,size_t _SizeInWords);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP errno_t __cdecl _wctime64_s(wchar_t *_Buf,size_t _SizeInWords,const __time64_t *_Time);\n#endif\n\n#if !defined (RC_INVOKED) && !defined (_INC_WTIME_S_INL)\n#define _INC_WTIME_S_INL\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE errno_t __cdecl _wctime_s(wchar_t *_Buffer,size_t _SizeInWords,const time_t *_Time) { return _wctime32_s(_Buffer,_SizeInWords,_Time); }\n#else\n__CRT_INLINE errno_t __cdecl _wctime_s(wchar_t *_Buffer,size_t _SizeInWords,const time_t *_Time) { return _wctime64_s(_Buffer,_SizeInWords,_Time); }\n#endif\n#endif\n#endif\n\n  _CRTIMP errno_t __cdecl mbsrtowcs_s(size_t *_Retval,wchar_t *_Dst,size_t _SizeInWords,const char **_PSrc,size_t _N,mbstate_t *_State);\n  _CRTIMP errno_t __cdecl wcrtomb_s(size_t *_Retval,char *_Dst,size_t _SizeInBytes,wchar_t _Ch,mbstate_t *_State);\n  _CRTIMP errno_t __cdecl wcsrtombs_s(size_t *_Retval,char *_Dst,size_t _SizeInBytes,const wchar_t **_Src,size_t _Size,mbstate_t *_State);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/setjmp.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_SETJMP\n#define _INC_SETJMP\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if (defined(_X86_) && !defined(__x86_64))\n\n#define _JBLEN 16\n#define _JBTYPE int\n\n  typedef struct __JUMP_BUFFER {\n    unsigned long Ebp;\n    unsigned long Ebx;\n    unsigned long Edi;\n    unsigned long Esi;\n    unsigned long Esp;\n    unsigned long Eip;\n    unsigned long Registration;\n    unsigned long TryLevel;\n    unsigned long Cookie;\n    unsigned long UnwindFunc;\n    unsigned long UnwindData[6];\n  } _JUMP_BUFFER;\n#elif defined(__ia64__)\n  typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {\n    __int64 LowPart;\n    __int64 HighPart;\n  } SETJMP_FLOAT128;\n\n#define _JBLEN 33\n  typedef SETJMP_FLOAT128 _JBTYPE;\n\n  typedef struct __JUMP_BUFFER {\n\n    unsigned long iAReserved[6];\n\n    unsigned long Registration;\n    unsigned long TryLevel;\n    unsigned long Cookie;\n    unsigned long UnwindFunc;\n\n    unsigned long UnwindData[6];\n\n    SETJMP_FLOAT128 FltS0;\n    SETJMP_FLOAT128 FltS1;\n    SETJMP_FLOAT128 FltS2;\n    SETJMP_FLOAT128 FltS3;\n    SETJMP_FLOAT128 FltS4;\n    SETJMP_FLOAT128 FltS5;\n    SETJMP_FLOAT128 FltS6;\n    SETJMP_FLOAT128 FltS7;\n    SETJMP_FLOAT128 FltS8;\n    SETJMP_FLOAT128 FltS9;\n    SETJMP_FLOAT128 FltS10;\n    SETJMP_FLOAT128 FltS11;\n    SETJMP_FLOAT128 FltS12;\n    SETJMP_FLOAT128 FltS13;\n    SETJMP_FLOAT128 FltS14;\n    SETJMP_FLOAT128 FltS15;\n    SETJMP_FLOAT128 FltS16;\n    SETJMP_FLOAT128 FltS17;\n    SETJMP_FLOAT128 FltS18;\n    SETJMP_FLOAT128 FltS19;\n    __int64 FPSR;\n    __int64 StIIP;\n    __int64 BrS0;\n    __int64 BrS1;\n    __int64 BrS2;\n    __int64 BrS3;\n    __int64 BrS4;\n    __int64 IntS0;\n    __int64 IntS1;\n    __int64 IntS2;\n    __int64 IntS3;\n    __int64 RsBSP;\n    __int64 RsPFS;\n    __int64 ApUNAT;\n    __int64 ApLC;\n    __int64 IntSp;\n    __int64 IntNats;\n    __int64 Preds;\n\n  } _JUMP_BUFFER;\n#elif defined(__x86_64)\n  typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {\n    unsigned __int64 Part[2];\n  } SETJMP_FLOAT128;\n\n#define _JBLEN 16\n  typedef SETJMP_FLOAT128 _JBTYPE;\n\n  typedef struct _JUMP_BUFFER {\n    unsigned __int64 Frame;\n    unsigned __int64 Rbx;\n    unsigned __int64 Rsp;\n    unsigned __int64 Rbp;\n    unsigned __int64 Rsi;\n    unsigned __int64 Rdi;\n    unsigned __int64 R12;\n    unsigned __int64 R13;\n    unsigned __int64 R14;\n    unsigned __int64 R15;\n    unsigned __int64 Rip;\n    unsigned __int64 Spare;\n    SETJMP_FLOAT128 Xmm6;\n    SETJMP_FLOAT128 Xmm7;\n    SETJMP_FLOAT128 Xmm8;\n    SETJMP_FLOAT128 Xmm9;\n    SETJMP_FLOAT128 Xmm10;\n    SETJMP_FLOAT128 Xmm11;\n    SETJMP_FLOAT128 Xmm12;\n    SETJMP_FLOAT128 Xmm13;\n    SETJMP_FLOAT128 Xmm14;\n    SETJMP_FLOAT128 Xmm15;\n  } _JUMP_BUFFER;\n#endif\n#ifndef _JMP_BUF_DEFINED\n  typedef _JBTYPE jmp_buf[_JBLEN];\n#define _JMP_BUF_DEFINED\n#endif\n\n  void * __cdecl __attribute__ ((__nothrow__)) mingw_getsp(void);\n\n#ifdef USE_MINGW_SETJMP_TWO_ARGS\n#ifndef _INC_SETJMPEX\n#define setjmp(BUF) _setjmp((BUF),mingw_getsp())\n  int __cdecl __attribute__ ((__nothrow__)) _setjmp(jmp_buf _Buf,void *_Ctx);\n#else\n#undef setjmp\n#define setjmp(BUF) _setjmpex((BUF),mingw_getsp())\n#define setjmpex(BUF) _setjmpex((BUF),mingw_getsp())\n  int __cdecl __attribute__ ((__nothrow__)) _setjmpex(jmp_buf _Buf,void *_Ctx);\n#endif\n#else\n#ifndef _INC_SETJMPEX\n#define setjmp _setjmp\n#endif\n  int __cdecl __attribute__ ((__nothrow__)) setjmp(jmp_buf _Buf);\n#endif\n\n  __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/;\n  __declspec(noreturn) __attribute__ ((__nothrow__)) void __cdecl longjmp(jmp_buf _Buf,int _Value);\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/share.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_SHARE\n#define _INC_SHARE\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n#define _SH_COMPAT 0x00\n#define _SH_DENYRW 0x10\n#define _SH_DENYWR 0x20\n#define _SH_DENYRD 0x30\n#define _SH_DENYNO 0x40\n#define _SH_SECURE 0x80\n\n#ifndef\tNO_OLDNAMES\n#define SH_COMPAT _SH_COMPAT\n#define SH_DENYRW _SH_DENYRW\n#define SH_DENYWR _SH_DENYWR\n#define SH_DENYRD _SH_DENYRD\n#define SH_DENYNO _SH_DENYNO\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/signal.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_SIGNAL\n#define _INC_SIGNAL\n\n#include <_mingw.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _SIG_ATOMIC_T_DEFINED\n#define _SIG_ATOMIC_T_DEFINED\n  typedef int sig_atomic_t;\n#endif\n\n#define NSIG 23\n\n#define\tSIGHUP\t1\t/* hangup */\n#define SIGINT 2\n#define\tSIGQUIT\t3\t/* quit */\n#define SIGILL 4\n#define\tSIGTRAP\t5\t/* trace trap (not reset when caught) */\n#define\tSIGIOT\t6\t/* IOT instruction */\n#define\tSIGABRT 6\t/* used by abort, replace SIGIOT in the future */\n#define\tSIGEMT\t7\t/* EMT instruction */\n#define SIGFPE 8\n#define\tSIGKILL\t9\t/* kill (cannot be caught or ignored) */\n#define\tSIGBUS\t10\t/* bus error */\n#define SIGSEGV 11\n#define\tSIGSYS\t12\t/* bad argument to system call */\n#define\tSIGPIPE\t13\t/* write on a pipe with no one to read it */\n#ifdef __USE_MINGW_ALARM\n#define\tSIGALRM\t14\t/* alarm clock */\n#endif\n#define SIGTERM 15\n#define SIGBREAK 21\n#define SIGABRT2 22\n\n#define SIGABRT_COMPAT 6\n\n  typedef\tvoid (*__p_sig_fn_t)(int);\n\n#define SIG_DFL (__p_sig_fn_t)0\n#define SIG_IGN (__p_sig_fn_t)1\n#define SIG_GET (__p_sig_fn_t)2\n#define SIG_SGE (__p_sig_fn_t)3\n#define SIG_ACK (__p_sig_fn_t)4\n#define SIG_ERR (__p_sig_fn_t)-1\n\n  extern void **__cdecl __pxcptinfoptrs(void);\n#define _pxcptinfoptrs (*__pxcptinfoptrs())\n\n  __p_sig_fn_t __cdecl signal(int _SigNum,__p_sig_fn_t _Func);\n  int __cdecl raise(int _SigNum);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/stdint.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/* ISO C9x  7.18  Integer types <stdint.h>\n * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794)\n *\n *  THIS SOFTWARE IS NOT COPYRIGHTED\n *\n *  Contributor: Danny Smith <danny_r_smith_2001@yahoo.co.nz>\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n *  Date: 2000-12-02\n */\n\n\n#ifndef _STDINT_H\n#define _STDINT_H\n\n#include <_mingw.h>\n\n#define __need_wint_t\n#define __need_wchar_t\n#include \"stddef.h\"\n\n/* 7.18.1.1  Exact-width integer types */\ntypedef signed char int8_t;\ntypedef unsigned char   uint8_t;\ntypedef short  int16_t;\ntypedef unsigned short  uint16_t;\ntypedef int  int32_t;\ntypedef unsigned   uint32_t;\ntypedef long long  int64_t;\ntypedef unsigned long long   uint64_t;\n\n/* 7.18.1.2  Minimum-width integer types */\ntypedef signed char int_least8_t;\ntypedef unsigned char   uint_least8_t;\ntypedef short  int_least16_t;\ntypedef unsigned short  uint_least16_t;\ntypedef int  int_least32_t;\ntypedef unsigned   uint_least32_t;\ntypedef long long  int_least64_t;\ntypedef unsigned long long   uint_least64_t;\n\n/*  7.18.1.3  Fastest minimum-width integer types\n *  Not actually guaranteed to be fastest for all purposes\n *  Here we use the exact-width types for 8 and 16-bit ints.\n */\ntypedef char int_fast8_t;\ntypedef unsigned char uint_fast8_t;\ntypedef short  int_fast16_t;\ntypedef unsigned short  uint_fast16_t;\ntypedef int  int_fast32_t;\ntypedef unsigned  int  uint_fast32_t;\ntypedef long long  int_fast64_t;\ntypedef unsigned long long   uint_fast64_t;\n\n/* 7.18.1.5  Greatest-width integer types */\ntypedef long long  intmax_t;\ntypedef unsigned long long   uintmax_t;\n\n/* 7.18.2  Limits of specified-width integer types */\n#if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS)\n\n/* 7.18.2.1  Limits of exact-width integer types */\n#define INT8_MIN (-128)\n#define INT16_MIN (-32768)\n#define INT32_MIN (-2147483647 - 1)\n#define INT64_MIN  (-9223372036854775807LL - 1)\n\n#define INT8_MAX 127\n#define INT16_MAX 32767\n#define INT32_MAX 2147483647\n#define INT64_MAX 9223372036854775807LL\n\n#define UINT8_MAX 0xff /* 255U */\n#define UINT16_MAX 0xffff /* 65535U */\n#define UINT32_MAX 0xffffffff  /* 4294967295U */\n#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */\n\n/* 7.18.2.2  Limits of minimum-width integer types */\n#define INT_LEAST8_MIN INT8_MIN\n#define INT_LEAST16_MIN INT16_MIN\n#define INT_LEAST32_MIN INT32_MIN\n#define INT_LEAST64_MIN INT64_MIN\n\n#define INT_LEAST8_MAX INT8_MAX\n#define INT_LEAST16_MAX INT16_MAX\n#define INT_LEAST32_MAX INT32_MAX\n#define INT_LEAST64_MAX INT64_MAX\n\n#define UINT_LEAST8_MAX UINT8_MAX\n#define UINT_LEAST16_MAX UINT16_MAX\n#define UINT_LEAST32_MAX UINT32_MAX\n#define UINT_LEAST64_MAX UINT64_MAX\n\n/* 7.18.2.3  Limits of fastest minimum-width integer types */\n#define INT_FAST8_MIN INT8_MIN\n#define INT_FAST16_MIN INT16_MIN\n#define INT_FAST32_MIN INT32_MIN\n#define INT_FAST64_MIN INT64_MIN\n\n#define INT_FAST8_MAX INT8_MAX\n#define INT_FAST16_MAX INT16_MAX\n#define INT_FAST32_MAX INT32_MAX\n#define INT_FAST64_MAX INT64_MAX\n\n#define UINT_FAST8_MAX UINT8_MAX\n#define UINT_FAST16_MAX UINT16_MAX\n#define UINT_FAST32_MAX UINT32_MAX\n#define UINT_FAST64_MAX UINT64_MAX\n\n/* 7.18.2.4  Limits of integer types capable of holding\n    object pointers */\n#ifdef _WIN64\n#define INTPTR_MIN INT64_MIN\n#define INTPTR_MAX INT64_MAX\n#define UINTPTR_MAX UINT64_MAX\n#else\n#define INTPTR_MIN INT32_MIN\n#define INTPTR_MAX INT32_MAX\n#define UINTPTR_MAX UINT32_MAX\n#endif\n\n/* 7.18.2.5  Limits of greatest-width integer types */\n#define INTMAX_MIN INT64_MIN\n#define INTMAX_MAX INT64_MAX\n#define UINTMAX_MAX UINT64_MAX\n\n/* 7.18.3  Limits of other integer types */\n#ifdef _WIN64\n#define PTRDIFF_MIN INT64_MIN\n#define PTRDIFF_MAX INT64_MAX\n#else\n#define PTRDIFF_MIN INT32_MIN\n#define PTRDIFF_MAX INT32_MAX\n#endif\n\n#define SIG_ATOMIC_MIN INT32_MIN\n#define SIG_ATOMIC_MAX INT32_MAX\n\n#ifndef SIZE_MAX\n#ifdef _WIN64\n#define SIZE_MAX UINT64_MAX\n#else\n#define SIZE_MAX UINT32_MAX\n#endif\n#endif\n\n#ifndef WCHAR_MIN  /* also in wchar.h */\n#define WCHAR_MIN 0\n#define WCHAR_MAX ((wchar_t)-1) /* UINT16_MAX */\n#endif\n\n/*\n * wint_t is unsigned short for compatibility with MS runtime\n */\n#define WINT_MIN 0\n#define WINT_MAX ((wint_t)-1) /* UINT16_MAX */\n\n#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */\n\n\n/* 7.18.4  Macros for integer constants */\n#if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS)\n\n/* 7.18.4.1  Macros for minimum-width integer constants\n\n    Accoding to Douglas Gwyn <gwyn@arl.mil>:\n\t\"This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC\n\t9899:1999 as initially published, the expansion was required\n\tto be an integer constant of precisely matching type, which\n\tis impossible to accomplish for the shorter types on most\n\tplatforms, because C99 provides no standard way to designate\n\tan integer constant with width less than that of type int.\n\tTC1 changed this to require just an integer constant\n\t*expression* with *promoted* type.\"\n\n\tThe trick used here is from Clive D W Feather.\n*/\n\n#define INT8_C(val) (INT_LEAST8_MAX-INT_LEAST8_MAX+(val))\n#define INT16_C(val) (INT_LEAST16_MAX-INT_LEAST16_MAX+(val))\n#define INT32_C(val) (INT_LEAST32_MAX-INT_LEAST32_MAX+(val))\n/*  The 'trick' doesn't work in C89 for long long because, without\n    suffix, (val) will be evaluated as int, not intmax_t */\n#define INT64_C(val) val##LL\n\n#define UINT8_C(val) (UINT_LEAST8_MAX-UINT_LEAST8_MAX+(val))\n#define UINT16_C(val) (UINT_LEAST16_MAX-UINT_LEAST16_MAX+(val))\n#define UINT32_C(val) (UINT_LEAST32_MAX-UINT_LEAST32_MAX+(val))\n#define UINT64_C(val) val##ULL\n\n/* 7.18.4.2  Macros for greatest-width integer constants */\n#define INTMAX_C(val) val##LL\n#define UINTMAX_C(val) val##ULL\n\n#endif  /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/stdio.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_STDIO\n#define _INC_STDIO\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define BUFSIZ 512\n#define _NFILE _NSTREAM_\n#define _NSTREAM_ 512\n#define _IOB_ENTRIES 20\n#define EOF (-1)\n\n#ifndef _FILE_DEFINED\n  struct _iobuf {\n    char *_ptr;\n    int _cnt;\n    char *_base;\n    int _flag;\n    int _file;\n    int _charbuf;\n    int _bufsiz;\n    char *_tmpfname;\n  };\n  typedef struct _iobuf FILE;\n#define _FILE_DEFINED\n#endif\n\n#ifdef _POSIX_\n#define _P_tmpdir \"/\"\n#define _wP_tmpdir L\"/\"\n#else\n#define _P_tmpdir \"\\\\\"\n#define _wP_tmpdir L\"\\\\\"\n#endif\n\n#define L_tmpnam (sizeof(_P_tmpdir) + 12)\n\n#ifdef _POSIX_\n#define L_ctermid 9\n#define L_cuserid 32\n#endif\n\n#define SEEK_CUR 1\n#define SEEK_END 2\n#define SEEK_SET 0\n\n#define STDIN_FILENO    0\n#define STDOUT_FILENO   1\n#define STDERR_FILENO   2\n\n#define FILENAME_MAX 260\n#define FOPEN_MAX 20\n#define _SYS_OPEN 20\n#define TMP_MAX 32767\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#ifndef _OFF_T_DEFINED\n#define _OFF_T_DEFINED\n#ifndef _OFF_T_\n#define _OFF_T_\n  typedef long _off_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long off_t;\n#endif\n#endif\n#endif\n\n#ifndef _OFF64_T_DEFINED\n#define _OFF64_T_DEFINED\n  typedef long long _off64_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long long off64_t;\n#endif\n#endif\n\n#ifndef _STDIO_DEFINED\n#ifdef _WIN64\n  _CRTIMP FILE *__cdecl __iob_func(void);\n#else\n#ifdef _MSVCRT_\nextern FILE _iob[];     /* A pointer to an array of FILE */\n#define __iob_func()    (_iob)\n#else\nextern FILE (*_imp___iob)[];    /* A pointer to an array of FILE */\n#define __iob_func()    (*_imp___iob)\n#define _iob __iob_func()\n#endif\n#endif\n#endif\n\n#ifndef _FPOS_T_DEFINED\n#define _FPOS_T_DEFINED\n#undef _FPOSOFF\n\n#if (!defined(NO_OLDNAMES) || defined(__GNUC__)) && _INTEGRAL_MAX_BITS >= 64\n  typedef __int64 fpos_t;\n#define _FPOSOFF(fp) ((long)(fp))\n#else\n  typedef long long fpos_t;\n#define _FPOSOFF(fp) ((long)(fp))\n#endif\n\n#endif\n\n#ifndef _STDSTREAM_DEFINED\n#define _STDSTREAM_DEFINED\n\n#define stdin (&__iob_func()[0])\n#define stdout (&__iob_func()[1])\n#define stderr (&__iob_func()[2])\n#endif\n\n#define _IOREAD 0x0001\n#define _IOWRT 0x0002\n\n#define _IOFBF 0x0000\n#define _IOLBF 0x0040\n#define _IONBF 0x0004\n\n#define _IOMYBUF 0x0008\n#define _IOEOF 0x0010\n#define _IOERR 0x0020\n#define _IOSTRG 0x0040\n#define _IORW 0x0080\n#ifdef _POSIX_\n#define _IOAPPEND 0x0200\n#endif\n\n#define _TWO_DIGIT_EXPONENT 0x1\n\n#ifndef _STDIO_DEFINED\n\n  _CRTIMP int __cdecl _filbuf(FILE *_File);\n  _CRTIMP int __cdecl _flsbuf(int _Ch,FILE *_File);\n#ifdef _POSIX_\n  _CRTIMP FILE *__cdecl _fsopen(const char *_Filename,const char *_Mode);\n#else\n  _CRTIMP FILE *__cdecl _fsopen(const char *_Filename,const char *_Mode,int _ShFlag);\n#endif\n  void __cdecl clearerr(FILE *_File);\n  int __cdecl fclose(FILE *_File);\n  _CRTIMP int __cdecl _fcloseall(void);\n#ifdef _POSIX_\n  FILE *__cdecl fdopen(int _FileHandle,const char *_Mode);\n#else\n  _CRTIMP FILE *__cdecl _fdopen(int _FileHandle,const char *_Mode);\n#endif\n  int __cdecl feof(FILE *_File);\n  int __cdecl ferror(FILE *_File);\n  int __cdecl fflush(FILE *_File);\n  int __cdecl fgetc(FILE *_File);\n  _CRTIMP int __cdecl _fgetchar(void);\n  int __cdecl fgetpos(FILE *_File ,fpos_t *_Pos);\n  char *__cdecl fgets(char *_Buf,int _MaxCount,FILE *_File);\n#ifdef _POSIX_\n  int __cdecl fileno(FILE *_File);\n#else\n  _CRTIMP int __cdecl _fileno(FILE *_File);\n#endif\n  _CRTIMP char *__cdecl _tempnam(const char *_DirName,const char *_FilePrefix);\n  _CRTIMP int __cdecl _flushall(void);\n  FILE *__cdecl fopen(const char *_Filename,const char *_Mode);\n  FILE *fopen64(const char *filename,const char *mode);\n  int __cdecl fprintf(FILE *_File,const char *_Format,...);\n  int __cdecl fputc(int _Ch,FILE *_File);\n  _CRTIMP int __cdecl _fputchar(int _Ch);\n  int __cdecl fputs(const char *_Str,FILE *_File);\n  size_t __cdecl fread(void *_DstBuf,size_t _ElementSize,size_t _Count,FILE *_File);\n  FILE *__cdecl freopen(const char *_Filename,const char *_Mode,FILE *_File);\n  int __cdecl fscanf(FILE *_File,const char *_Format,...);\n  int __cdecl fsetpos(FILE *_File,const fpos_t *_Pos);\n  int __cdecl fseek(FILE *_File,long _Offset,int _Origin);\n   int fseeko64(FILE* stream, _off64_t offset, int whence);\n  long __cdecl ftell(FILE *_File);\n  _off64_t ftello64(FILE * stream);\n  int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin);\n  __int64 __cdecl _ftelli64(FILE *_File);\n  size_t __cdecl fwrite(const void *_Str,size_t _Size,size_t _Count,FILE *_File);\n  int __cdecl getc(FILE *_File);\n  int __cdecl getchar(void);\n  _CRTIMP int __cdecl _getmaxstdio(void);\n  char *__cdecl gets(char *_Buffer);\n  int __cdecl _getw(FILE *_File);\n#ifndef _CRT_PERROR_DEFINED\n#define _CRT_PERROR_DEFINED\n  void __cdecl perror(const char *_ErrMsg);\n#endif\n  _CRTIMP int __cdecl _pclose(FILE *_File);\n  _CRTIMP FILE *__cdecl _popen(const char *_Command,const char *_Mode);\n#if !defined(NO_OLDNAMES) && !defined(popen)\n#define popen   _popen\n#define pclose  _pclose\n#endif\n  int __cdecl printf(const char *_Format,...);\n  int __cdecl putc(int _Ch,FILE *_File);\n  int __cdecl putchar(int _Ch);\n  int __cdecl puts(const char *_Str);\n  _CRTIMP int __cdecl _putw(int _Word,FILE *_File);\n#ifndef _CRT_DIRECTORY_DEFINED\n#define _CRT_DIRECTORY_DEFINED\n  int __cdecl remove(const char *_Filename);\n  int __cdecl rename(const char *_OldFilename,const char *_NewFilename);\n  _CRTIMP int __cdecl _unlink(const char *_Filename);\n#ifndef NO_OLDNAMES\n  int __cdecl unlink(const char *_Filename);\n#endif\n#endif\n  void __cdecl rewind(FILE *_File);\n  _CRTIMP int __cdecl _rmtmp(void);\n  int __cdecl scanf(const char *_Format,...);\n  void __cdecl setbuf(FILE *_File,char *_Buffer);\n  _CRTIMP int __cdecl _setmaxstdio(int _Max);\n  _CRTIMP unsigned int __cdecl _set_output_format(unsigned int _Format);\n  _CRTIMP unsigned int __cdecl _get_output_format(void);\n  int __cdecl setvbuf(FILE *_File,char *_Buf,int _Mode,size_t _Size);\n  _CRTIMP int __cdecl _scprintf(const char *_Format,...);\n  int __cdecl sscanf(const char *_Src,const char *_Format,...);\n  _CRTIMP int __cdecl _snscanf(const char *_Src,size_t _MaxCount,const char *_Format,...);\n  FILE *__cdecl tmpfile(void);\n  char *__cdecl tmpnam(char *_Buffer);\n  int __cdecl ungetc(int _Ch,FILE *_File);\n  int __cdecl vfprintf(FILE *_File,const char *_Format,va_list _ArgList);\n  int __cdecl vprintf(const char *_Format,va_list _ArgList);\n  /* Make sure macros are not defined.  */\n#pragma push_macro(\"vsnprintf\")\n#pragma push_macro(\"snprintf\")\n  #undef vsnprintf\n  #undef snprintf\n  extern\n  __attribute__((format(gnu_printf, 3, 0))) __attribute__((nonnull (3)))\n  int __mingw_vsnprintf(char *_DstBuf,size_t _MaxCount,const char *_Format,va_list _ArgList);\n  extern\n  __attribute__((format(gnu_printf, 3, 4))) __attribute__((nonnull (3)))\n  int __mingw_snprintf(char* s, size_t n, const char*  format, ...);\n  int __cdecl vsnprintf(char *_DstBuf,size_t _MaxCount,const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _snprintf(char *_Dest,size_t _Count,const char *_Format,...);\n  _CRTIMP int __cdecl _vsnprintf(char *_Dest,size_t _Count,const char *_Format,va_list _Args);\n  int __cdecl sprintf(char *_Dest,const char *_Format,...);\n  int __cdecl vsprintf(char *_Dest,const char *_Format,va_list _Args);\n#ifndef __NO_ISOCEXT  /* externs in libmingwex.a */\n  int __cdecl snprintf(char* s, size_t n, const char*  format, ...);\n  __CRT_INLINE int __cdecl vsnprintf (char* s, size_t n, const char* format,va_list arg) {\n    return _vsnprintf ( s, n, format, arg);\n  }\n  int __cdecl vscanf(const char * Format, va_list argp);\n  int __cdecl vfscanf (FILE * fp, const char * Format,va_list argp);\n  int __cdecl vsscanf (const char * _Str,const char * Format,va_list argp);\n#endif\n/* Restore may prior defined macros snprintf/vsnprintf.  */\n#pragma pop_macro(\"snprintf\")\n#pragma pop_macro(\"vsnprintf\")\n/* Check if vsnprintf and snprintf are defaulting to gnu-style.  */\n  #if defined(USE_MINGW_GNU_SNPRINTF) && USE_MINGW_GNU_SNPRINTF\n  #ifndef vsnprint\n  #define vsnprintf __mingw_vsnprintf\n  #endif\n  #ifndef snprintf\n  #define snprintf __mingw_snprintf\n  #endif\n  #endif\n  _CRTIMP int __cdecl _vscprintf(const char *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _set_printf_count_output(int _Value);\n  _CRTIMP int __cdecl _get_printf_count_output(void);\n\n#ifndef _WSTDIO_DEFINED\n\n#ifndef WEOF\n#define WEOF (wint_t)(0xFFFF)\n#endif\n\n#ifdef _POSIX_\n  _CRTIMP FILE *__cdecl _wfsopen(const wchar_t *_Filename,const wchar_t *_Mode);\n#else\n  _CRTIMP FILE *__cdecl _wfsopen(const wchar_t *_Filename,const wchar_t *_Mode,int _ShFlag);\n#endif\n  wint_t __cdecl fgetwc(FILE *_File);\n  _CRTIMP wint_t __cdecl _fgetwchar(void);\n  wint_t __cdecl fputwc(wchar_t _Ch,FILE *_File);\n  _CRTIMP wint_t __cdecl _fputwchar(wchar_t _Ch);\n  wint_t __cdecl getwc(FILE *_File);\n  wint_t __cdecl getwchar(void);\n  wint_t __cdecl putwc(wchar_t _Ch,FILE *_File);\n  wint_t __cdecl putwchar(wchar_t _Ch);\n  wint_t __cdecl ungetwc(wint_t _Ch,FILE *_File);\n  wchar_t *__cdecl fgetws(wchar_t *_Dst,int _SizeInWords,FILE *_File);\n  int __cdecl fputws(const wchar_t *_Str,FILE *_File);\n  _CRTIMP wchar_t *__cdecl _getws(wchar_t *_String);\n  _CRTIMP int __cdecl _putws(const wchar_t *_Str);\n  int __cdecl fwprintf(FILE *_File,const wchar_t *_Format,...);\n  int __cdecl wprintf(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _scwprintf(const wchar_t *_Format,...);\n  int __cdecl vfwprintf(FILE *_File,const wchar_t *_Format,va_list _ArgList);\n  int __cdecl vwprintf(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl swprintf(wchar_t*, const wchar_t*, ...);\n  _CRTIMP int __cdecl vswprintf(wchar_t*, const wchar_t*,va_list);\n  _CRTIMP int __cdecl _swprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vswprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf(wchar_t *_Dest,size_t _Count,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vsnwprintf(wchar_t *_Dest,size_t _Count,const wchar_t *_Format,va_list _Args);\n#ifndef __NO_ISOCEXT  /* externs in libmingwex.a */\n  int __cdecl snwprintf (wchar_t* s, size_t n, const wchar_t*  format, ...);\n  __CRT_INLINE int __cdecl vsnwprintf (wchar_t* s, size_t n, const wchar_t* format, va_list arg) { return _vsnwprintf(s,n,format,arg); }\n  int __cdecl vwscanf (const wchar_t *, va_list);\n  int __cdecl vfwscanf (FILE *,const wchar_t *,va_list);\n  int __cdecl vswscanf (const wchar_t *,const wchar_t *,va_list);\n#endif\n  _CRTIMP int __cdecl _swprintf(wchar_t *_Dest,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vswprintf(wchar_t *_Dest,const wchar_t *_Format,va_list _Args);\n\n#ifndef RC_INVOKED\n#include <vadefs.h>\n#endif\n\n#ifdef _CRT_NON_CONFORMING_SWPRINTFS\n#ifndef __cplusplus\n#define swprintf _swprintf\n#define vswprintf _vswprintf\n#define _swprintf_l __swprintf_l\n#define _vswprintf_l __vswprintf_l\n#endif\n#endif\n\n  _CRTIMP wchar_t *__cdecl _wtempnam(const wchar_t *_Directory,const wchar_t *_FilePrefix);\n  _CRTIMP int __cdecl _vscwprintf(const wchar_t *_Format,va_list _ArgList);\n  int __cdecl fwscanf(FILE *_File,const wchar_t *_Format,...);\n  int __cdecl swscanf(const wchar_t *_Src,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _snwscanf(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,...);\n  int __cdecl wscanf(const wchar_t *_Format,...);\n  _CRTIMP FILE *__cdecl _wfdopen(int _FileHandle ,const wchar_t *_Mode);\n  _CRTIMP FILE *__cdecl _wfopen(const wchar_t *_Filename,const wchar_t *_Mode);\n  _CRTIMP FILE *__cdecl _wfreopen(const wchar_t *_Filename,const wchar_t *_Mode,FILE *_OldFile);\n#ifndef _CRT_WPERROR_DEFINED\n#define _CRT_WPERROR_DEFINED\n  _CRTIMP void __cdecl _wperror(const wchar_t *_ErrMsg);\n#endif\n  _CRTIMP FILE *__cdecl _wpopen(const wchar_t *_Command,const wchar_t *_Mode);\n#if !defined(NO_OLDNAMES) && !defined(wpopen)\n#define wpopen  _wpopen\n#endif\n  _CRTIMP int __cdecl _wremove(const wchar_t *_Filename);\n  _CRTIMP wchar_t *__cdecl _wtmpnam(wchar_t *_Buffer);\n  _CRTIMP wint_t __cdecl _fgetwc_nolock(FILE *_File);\n  _CRTIMP wint_t __cdecl _fputwc_nolock(wchar_t _Ch,FILE *_File);\n  _CRTIMP wint_t __cdecl _ungetwc_nolock(wint_t _Ch,FILE *_File);\n\n#undef _CRT_GETPUTWCHAR_NOINLINE\n\n#if !defined(__cplusplus) || defined(_CRT_GETPUTWCHAR_NOINLINE)\n#define getwchar() fgetwc(stdin)\n#define putwchar(_c) fputwc((_c),stdout)\n#else\n  __CRT_INLINE wint_t __cdecl getwchar() { return (fgetwc(stdin)); }\n  __CRT_INLINE wint_t __cdecl putwchar(wchar_t _C) { return (fputwc(_C,stdout)); }\n#endif\n\n#define getwc(_stm) fgetwc(_stm)\n#define putwc(_c,_stm) fputwc(_c,_stm)\n#define _putwc_nolock(_c,_stm) _fputwc_nolock(_c,_stm)\n#define _getwc_nolock(_stm) _fgetwc_nolock(_stm)\n\n#define _WSTDIO_DEFINED\n#endif\n\n#define _STDIO_DEFINED\n#endif\n\n#define _fgetc_nolock(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))\n#define _fputc_nolock(_c,_stream) (--(_stream)->_cnt >= 0 ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c),(_stream)))\n#define _getc_nolock(_stream) _fgetc_nolock(_stream)\n#define _putc_nolock(_c,_stream) _fputc_nolock(_c,_stream)\n#define _getchar_nolock() _getc_nolock(stdin)\n#define _putchar_nolock(_c) _putc_nolock((_c),stdout)\n#define _getwchar_nolock() _getwc_nolock(stdin)\n#define _putwchar_nolock(_c) _putwc_nolock((_c),stdout)\n\n  _CRTIMP void __cdecl _lock_file(FILE *_File);\n  _CRTIMP void __cdecl _unlock_file(FILE *_File);\n  _CRTIMP int __cdecl _fclose_nolock(FILE *_File);\n  _CRTIMP int __cdecl _fflush_nolock(FILE *_File);\n  _CRTIMP size_t __cdecl _fread_nolock(void *_DstBuf,size_t _ElementSize,size_t _Count,FILE *_File);\n  _CRTIMP int __cdecl _fseek_nolock(FILE *_File,long _Offset,int _Origin);\n  _CRTIMP long __cdecl _ftell_nolock(FILE *_File);\n  _CRTIMP int __cdecl _fseeki64_nolock(FILE *_File,__int64 _Offset,int _Origin);\n  _CRTIMP __int64 __cdecl _ftelli64_nolock(FILE *_File);\n  _CRTIMP size_t __cdecl _fwrite_nolock(const void *_DstBuf,size_t _Size,size_t _Count,FILE *_File);\n  _CRTIMP int __cdecl _ungetc_nolock(int _Ch,FILE *_File);\n\n#if !defined(NO_OLDNAMES) || !defined(_POSIX)\n#define P_tmpdir _P_tmpdir\n#define SYS_OPEN _SYS_OPEN\n\n  char *__cdecl tempnam(const char *_Directory,const char *_FilePrefix);\n  int __cdecl fcloseall(void);\n  FILE *__cdecl fdopen(int _FileHandle,const char *_Format);\n  int __cdecl fgetchar(void);\n  int __cdecl fileno(FILE *_File);\n  int __cdecl flushall(void);\n  int __cdecl fputchar(int _Ch);\n  int __cdecl getw(FILE *_File);\n  int __cdecl putw(int _Ch,FILE *_File);\n  int __cdecl rmtmp(void);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n\n#include <sec_api/stdio_s.h>\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/stdlib.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_STDLIB\n#define _INC_STDLIB\n\n#include <_mingw.h>\n#include <limits.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#define EXIT_SUCCESS 0\n#define EXIT_FAILURE 1\n\n#ifndef _ONEXIT_T_DEFINED\n#define _ONEXIT_T_DEFINED\n\n  typedef int (__cdecl *_onexit_t)(void);\n\n#ifndef NO_OLDNAMES\n#define onexit_t _onexit_t\n#endif\n#endif\n\n#ifndef _DIV_T_DEFINED\n#define _DIV_T_DEFINED\n\n  typedef struct _div_t {\n    int quot;\n    int rem;\n  } div_t;\n\n  typedef struct _ldiv_t {\n    long quot;\n    long rem;\n  } ldiv_t;\n#endif\n\n#ifndef _CRT_DOUBLE_DEC\n#define _CRT_DOUBLE_DEC\n\n#pragma pack(4)\n  typedef struct {\n    unsigned char ld[10];\n  } _LDOUBLE;\n#pragma pack()\n\n#define _PTR_LD(x) ((unsigned char *)(&(x)->ld))\n\n  typedef struct {\n    double x;\n  } _CRT_DOUBLE;\n\n  typedef struct {\n    float f;\n  } _CRT_FLOAT;\n\n#pragma push_macro(\"long\")\n#undef long\n\n  typedef struct {\n    long double x;\n  } _LONGDOUBLE;\n\n#pragma pop_macro(\"long\")\n\n#pragma pack(4)\n  typedef struct {\n    unsigned char ld12[12];\n  } _LDBL12;\n#pragma pack()\n#endif\n\n#define RAND_MAX 0x7fff\n\n#ifndef MB_CUR_MAX\n#define MB_CUR_MAX ___mb_cur_max_func()\n#ifndef __mb_cur_max\n#ifdef _MSVCRT_\n  extern int __mb_cur_max;\n#else\n#define __mb_cur_max    (*_imp____mb_cur_max)\n  extern int *_imp____mb_cur_max;\n#endif\n#endif\n#ifdef _MSVCRT_\n  extern int __mbcur_max;\n#define ___mb_cur_max_func() (__mb_cur_max)\n#else\n  extern int* _imp____mbcur_max;\n#define ___mb_cur_max_func() (*_imp____mb_cur_max)\n#endif\n#endif\n\n#define __max(a,b) (((a) > (b)) ? (a) : (b))\n#define __min(a,b) (((a) < (b)) ? (a) : (b))\n\n#define _MAX_PATH 260\n#define _MAX_DRIVE 3\n#define _MAX_DIR 256\n#define _MAX_FNAME 256\n#define _MAX_EXT 256\n\n#define _OUT_TO_DEFAULT 0\n#define _OUT_TO_STDERR 1\n#define _OUT_TO_MSGBOX 2\n#define _REPORT_ERRMODE 3\n\n#define _WRITE_ABORT_MSG 0x1\n#define _CALL_REPORTFAULT 0x2\n\n#define _MAX_ENV 32767\n\n  typedef void (__cdecl *_purecall_handler)(void);\n\n  _CRTIMP _purecall_handler __cdecl _set_purecall_handler(_purecall_handler _Handler);\n  _CRTIMP _purecall_handler __cdecl _get_purecall_handler(void);\n\n  typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *,const wchar_t *,const wchar_t *,unsigned int,uintptr_t);\n  _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(_invalid_parameter_handler _Handler);\n  _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);\n\n#ifndef _CRT_ERRNO_DEFINED\n#define _CRT_ERRNO_DEFINED\n  _CRTIMP extern int *__cdecl _errno(void);\n#define errno (*_errno())\n  errno_t __cdecl _set_errno(int _Value);\n  errno_t __cdecl _get_errno(int *_Value);\n#endif\n  _CRTIMP unsigned long *__cdecl __doserrno(void);\n#define _doserrno (*__doserrno())\n  errno_t __cdecl _set_doserrno(unsigned long _Value);\n  errno_t __cdecl _get_doserrno(unsigned long *_Value);\n#ifdef _MSVCRT_\n  extern char *_sys_errlist[];\n  extern int _sys_nerr;\n#else\n  _CRTIMP char *_sys_errlist[1];\n  _CRTIMP int _sys_nerr;\n#endif\n#if (defined(_X86_) && !defined(__x86_64))\n  _CRTIMP int *__cdecl __p___argc(void);\n  _CRTIMP char ***__cdecl __p___argv(void);\n  _CRTIMP wchar_t ***__cdecl __p___wargv(void);\n  _CRTIMP char ***__cdecl __p__environ(void);\n  _CRTIMP wchar_t ***__cdecl __p__wenviron(void);\n  _CRTIMP char **__cdecl __p__pgmptr(void);\n  _CRTIMP wchar_t **__cdecl __p__wpgmptr(void);\n#endif\n#ifndef __argc\n#ifdef _MSVCRT_\n  extern int __argc;\n#else\n#define __argc (*_imp____argc)\n  extern int *_imp____argc;\n#endif\n#endif\n#ifndef __argv\n#ifdef _MSVCRT_\n  extern char **__argv;\n#else\n#define __argv  (*_imp____argv)\n  extern char ***_imp____argv;\n#endif\n#endif\n#ifndef __wargv\n#ifdef _MSVCRT_\n  extern wchar_t **__wargv;\n#else\n#define __wargv (*_imp____wargv)\n  extern wchar_t ***_imp____wargv;\n#endif\n#endif\n\n#ifdef _POSIX_\n  extern char **environ;\n#else\n#ifndef _environ\n#ifdef _MSVCRT_\n  extern char **_environ;\n#else\n#define _environ (*_imp___environ)\n  extern char ***_imp___environ;\n#endif\n#endif\n\n#ifndef _wenviron\n#ifdef _MSVCRT_\n  extern wchar_t **_wenviron;\n#else\n#define _wenviron       (*_imp___wenviron)\n  extern wchar_t ***_imp___wenviron;\n#endif\n#endif\n#endif\n#ifndef _pgmptr\n#ifdef _MSVCRT_\n  extern char *_pgmptr;\n#else\n#define _pgmptr (*_imp___pgmptr)\n  extern char **_imp___pgmptr;\n#endif\n#endif\n\n#ifndef _wpgmptr\n#ifdef _MSVCRT_\n  extern wchar_t *_wpgmptr;\n#else\n#define _wpgmptr        (*_imp___wpgmptr)\n  extern wchar_t **_imp___wpgmptr;\n#endif\n#endif\n  errno_t __cdecl _get_pgmptr(char **_Value);\n  errno_t __cdecl _get_wpgmptr(wchar_t **_Value);\n#ifndef _fmode\n#ifdef _MSVCRT_\n  extern int _fmode;\n#else\n#define _fmode  (*_imp___fmode)\n  extern int *_imp___fmode;\n#endif\n#endif\n  _CRTIMP errno_t __cdecl _set_fmode(int _Mode);\n  _CRTIMP errno_t __cdecl _get_fmode(int *_PMode);\n\n#ifndef _osplatform\n#ifdef _MSVCRT_\n  extern unsigned int _osplatform;\n#else\n#define _osplatform (*_imp___osplatform)\n  extern unsigned int *_imp___osplatform;\n#endif\n#endif\n\n#ifndef _osver\n#ifdef _MSVCRT_\n  extern unsigned int _osver;\n#else\n#define _osver  (*_imp___osver)\n  extern unsigned int *_imp___osver;\n#endif\n#endif\n\n#ifndef _winver\n#ifdef _MSVCRT_\n  extern unsigned int _winver;\n#else\n#define _winver (*_imp___winver)\n  extern unsigned int *_imp___winver;\n#endif\n#endif\n\n#ifndef _winmajor\n#ifdef _MSVCRT_\n  extern unsigned int _winmajor;\n#else\n#define _winmajor       (*_imp___winmajor)\n  extern unsigned int *_imp___winmajor;\n#endif\n#endif\n\n#ifndef _winminor\n#ifdef _MSVCRT_\n  extern unsigned int _winminor;\n#else\n#define _winminor       (*_imp___winminor)\n  extern unsigned int *_imp___winminor;\n#endif\n#endif\n\n  errno_t __cdecl _get_osplatform(unsigned int *_Value);\n  errno_t __cdecl _get_osver(unsigned int *_Value);\n  errno_t __cdecl _get_winver(unsigned int *_Value);\n  errno_t __cdecl _get_winmajor(unsigned int *_Value);\n  errno_t __cdecl _get_winminor(unsigned int *_Value);\n#ifndef _countof\n#ifndef __cplusplus\n#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))\n#else\n  extern \"C++\" {\n    template <typename _CountofType,size_t _SizeOfArray> char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];\n#define _countof(_Array) sizeof(*__countof_helper(_Array))\n  }\n#endif\n#endif\n\n#ifndef _CRT_TERMINATE_DEFINED\n#define _CRT_TERMINATE_DEFINED\n  void __cdecl __MINGW_NOTHROW exit(int _Code) __MINGW_ATTRIB_NORETURN;\n  _CRTIMP void __cdecl __MINGW_NOTHROW _exit(int _Code) __MINGW_ATTRIB_NORETURN;\n#if !defined __NO_ISOCEXT /* extern stub in static libmingwex.a */\n  /* C99 function name */\n  void __cdecl _Exit(int) __MINGW_ATTRIB_NORETURN;\n  __CRT_INLINE __MINGW_ATTRIB_NORETURN void  __cdecl _Exit(int status)\n  {  _exit(status); }\n#endif\n\n#pragma push_macro(\"abort\")\n#undef abort\n  void __cdecl __declspec(noreturn) abort(void);\n#pragma pop_macro(\"abort\")\n\n#endif\n\n  _CRTIMP unsigned int __cdecl _set_abort_behavior(unsigned int _Flags,unsigned int _Mask);\n\n#ifndef _CRT_ABS_DEFINED\n#define _CRT_ABS_DEFINED\n  int __cdecl abs(int _X);\n  long __cdecl labs(long _X);\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 64\n  __int64 __cdecl _abs64(__int64);\n#endif\n  int __cdecl atexit(void (__cdecl *)(void));\n#ifndef _CRT_ATOF_DEFINED\n#define _CRT_ATOF_DEFINED\n  double __cdecl atof(const char *_String);\n  double __cdecl _atof_l(const char *_String,_locale_t _Locale);\n#endif\n  int __cdecl atoi(const char *_Str);\n  _CRTIMP int __cdecl _atoi_l(const char *_Str,_locale_t _Locale);\n  long __cdecl atol(const char *_Str);\n  _CRTIMP long __cdecl _atol_l(const char *_Str,_locale_t _Locale);\n#ifndef _CRT_ALGO_DEFINED\n#define _CRT_ALGO_DEFINED\n  void *__cdecl bsearch(const void *_Key,const void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));\n  void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));\n#endif\n  unsigned short __cdecl _byteswap_ushort(unsigned short _Short);\n  /*unsigned long __cdecl _byteswap_ulong (unsigned long _Long); */\n#if _INTEGRAL_MAX_BITS >= 64\n  unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);\n#endif\n  div_t __cdecl div(int _Numerator,int _Denominator);\n  char *__cdecl getenv(const char *_VarName);\n  _CRTIMP char *__cdecl _itoa(int _Value,char *_Dest,int _Radix);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP char *__cdecl _i64toa(__int64 _Val,char *_DstBuf,int _Radix);\n  _CRTIMP char *__cdecl _ui64toa(unsigned __int64 _Val,char *_DstBuf,int _Radix);\n  _CRTIMP __int64 __cdecl _atoi64(const char *_String);\n  _CRTIMP __int64 __cdecl _atoi64_l(const char *_String,_locale_t _Locale);\n  _CRTIMP __int64 __cdecl _strtoi64(const char *_String,char **_EndPtr,int _Radix);\n  _CRTIMP __int64 __cdecl _strtoi64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale);\n  _CRTIMP unsigned __int64 __cdecl _strtoui64(const char *_String,char **_EndPtr,int _Radix);\n  _CRTIMP unsigned __int64 __cdecl _strtoui64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale);\n#endif\n  ldiv_t __cdecl ldiv(long _Numerator,long _Denominator);\n  _CRTIMP char *__cdecl _ltoa(long _Value,char *_Dest,int _Radix);\n  int __cdecl mblen(const char *_Ch,size_t _MaxCount);\n  _CRTIMP int __cdecl _mblen_l(const char *_Ch,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP size_t __cdecl _mbstrlen(const char *_Str);\n  _CRTIMP size_t __cdecl _mbstrlen_l(const char *_Str,_locale_t _Locale);\n  _CRTIMP size_t __cdecl _mbstrnlen(const char *_Str,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _mbstrnlen_l(const char *_Str,size_t _MaxCount,_locale_t _Locale);\n  int __cdecl mbtowc(wchar_t *_DstCh,const char *_SrcCh,size_t _SrcSizeInBytes);\n  _CRTIMP int __cdecl _mbtowc_l(wchar_t *_DstCh,const char *_SrcCh,size_t _SrcSizeInBytes,_locale_t _Locale);\n  size_t __cdecl mbstowcs(wchar_t *_Dest,const char *_Source,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _mbstowcs_l(wchar_t *_Dest,const char *_Source,size_t _MaxCount,_locale_t _Locale);\n  int __cdecl rand(void);\n  _CRTIMP int __cdecl _set_error_mode(int _Mode);\n  void __cdecl srand(unsigned int _Seed);\n  double __cdecl strtod(const char *_Str,char **_EndPtr);\n  float __cdecl strtof(const char *nptr, char **endptr);\n#if !defined __NO_ISOCEXT  /* in libmingwex.a */\n  float __cdecl strtof (const char * __restrict__, char ** __restrict__);\n  long double __cdecl strtold(const char * __restrict__, char ** __restrict__);\n#endif /* __NO_ISOCEXT */\n  _CRTIMP double __cdecl _strtod_l(const char *_Str,char **_EndPtr,_locale_t _Locale);\n  long __cdecl strtol(const char *_Str,char **_EndPtr,int _Radix);\n  _CRTIMP long __cdecl _strtol_l(const char *_Str,char **_EndPtr,int _Radix,_locale_t _Locale);\n  unsigned long __cdecl strtoul(const char *_Str,char **_EndPtr,int _Radix);\n  _CRTIMP unsigned long __cdecl _strtoul_l(const char *_Str,char **_EndPtr,int _Radix,_locale_t _Locale);\n#ifndef _CRT_SYSTEM_DEFINED\n#define _CRT_SYSTEM_DEFINED\n  int __cdecl system(const char *_Command);\n#endif\n  _CRTIMP char *__cdecl _ultoa(unsigned long _Value,char *_Dest,int _Radix);\n  int __cdecl wctomb(char *_MbCh,wchar_t _WCh);\n  _CRTIMP int __cdecl _wctomb_l(char *_MbCh,wchar_t _WCh,_locale_t _Locale);\n  size_t __cdecl wcstombs(char *_Dest,const wchar_t *_Source,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _wcstombs_l(char *_Dest,const wchar_t *_Source,size_t _MaxCount,_locale_t _Locale);\n\n#ifndef _CRT_ALLOCATION_DEFINED\n#define _CRT_ALLOCATION_DEFINED\n  void *__cdecl calloc(size_t _NumOfElements,size_t _SizeOfElements);\n  void __cdecl free(void *_Memory);\n  void *__cdecl malloc(size_t _Size);\n  void *__cdecl realloc(void *_Memory,size_t _NewSize);\n  _CRTIMP void *__cdecl _recalloc(void *_Memory,size_t _Count,size_t _Size);\n  //_CRTIMP void __cdecl _aligned_free(void *_Memory);\n  //_CRTIMP void *__cdecl _aligned_malloc(size_t _Size,size_t _Alignment);\n  _CRTIMP void *__cdecl _aligned_offset_malloc(size_t _Size,size_t _Alignment,size_t _Offset);\n  _CRTIMP void *__cdecl _aligned_realloc(void *_Memory,size_t _Size,size_t _Alignment);\n  _CRTIMP void *__cdecl _aligned_recalloc(void *_Memory,size_t _Count,size_t _Size,size_t _Alignment);\n  _CRTIMP void *__cdecl _aligned_offset_realloc(void *_Memory,size_t _Size,size_t _Alignment,size_t _Offset);\n  _CRTIMP void *__cdecl _aligned_offset_recalloc(void *_Memory,size_t _Count,size_t _Size,size_t _Alignment,size_t _Offset);\n#endif\n\n#ifndef _WSTDLIB_DEFINED\n#define _WSTDLIB_DEFINED\n\n  _CRTIMP wchar_t *__cdecl _itow(int _Value,wchar_t *_Dest,int _Radix);\n  _CRTIMP wchar_t *__cdecl _ltow(long _Value,wchar_t *_Dest,int _Radix);\n  _CRTIMP wchar_t *__cdecl _ultow(unsigned long _Value,wchar_t *_Dest,int _Radix);\n  double __cdecl wcstod(const wchar_t *_Str,wchar_t **_EndPtr);\n  float __cdecl wcstof(const wchar_t *nptr, wchar_t **endptr);\n#if !defined __NO_ISOCEXT /* in libmingwex.a */\n  float __cdecl wcstof( const wchar_t * __restrict__, wchar_t ** __restrict__);\n  long double __cdecl wcstold(const wchar_t * __restrict__, wchar_t ** __restrict__);\n#endif /* __NO_ISOCEXT */\n  _CRTIMP double __cdecl _wcstod_l(const wchar_t *_Str,wchar_t **_EndPtr,_locale_t _Locale);\n  long __cdecl wcstol(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP long __cdecl _wcstol_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n  unsigned long __cdecl wcstoul(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP unsigned long __cdecl _wcstoul_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wgetenv(const wchar_t *_VarName);\n#ifndef _CRT_WSYSTEM_DEFINED\n#define _CRT_WSYSTEM_DEFINED\n  _CRTIMP int __cdecl _wsystem(const wchar_t *_Command);\n#endif\n  _CRTIMP double __cdecl _wtof(const wchar_t *_Str);\n  _CRTIMP double __cdecl _wtof_l(const wchar_t *_Str,_locale_t _Locale);\n  _CRTIMP int __cdecl _wtoi(const wchar_t *_Str);\n  _CRTIMP int __cdecl _wtoi_l(const wchar_t *_Str,_locale_t _Locale);\n  _CRTIMP long __cdecl _wtol(const wchar_t *_Str);\n  _CRTIMP long __cdecl _wtol_l(const wchar_t *_Str,_locale_t _Locale);\n\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix);\n  _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix);\n  _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str);\n  _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale);\n  _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n  _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str ,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n#endif\n#endif\n\n#ifndef _POSIX_\n#define _CVTBUFSIZE (309+40)\n  _CRTIMP char *__cdecl _fullpath(char *_FullPath,const char *_Path,size_t _SizeInBytes);\n  _CRTIMP char *__cdecl _ecvt(double _Val,int _NumOfDigits,int *_PtDec,int *_PtSign);\n  _CRTIMP char *__cdecl _fcvt(double _Val,int _NumOfDec,int *_PtDec,int *_PtSign);\n  _CRTIMP char *__cdecl _gcvt(double _Val,int _NumOfDigits,char *_DstBuf);\n  _CRTIMP int __cdecl _atodbl(_CRT_DOUBLE *_Result,char *_Str);\n  _CRTIMP int __cdecl _atoldbl(_LDOUBLE *_Result,char *_Str);\n  _CRTIMP int __cdecl _atoflt(_CRT_FLOAT *_Result,char *_Str);\n  _CRTIMP int __cdecl _atodbl_l(_CRT_DOUBLE *_Result,char *_Str,_locale_t _Locale);\n  _CRTIMP int __cdecl _atoldbl_l(_LDOUBLE *_Result,char *_Str,_locale_t _Locale);\n  _CRTIMP int __cdecl _atoflt_l(_CRT_FLOAT *_Result,char *_Str,_locale_t _Locale);\n  unsigned long __cdecl _lrotl(unsigned long _Val,int _Shift);\n  unsigned long __cdecl _lrotr(unsigned long _Val,int _Shift);\n  _CRTIMP void __cdecl _makepath(char *_Path,const char *_Drive,const char *_Dir,const char *_Filename,const char *_Ext);\n  _onexit_t __cdecl _onexit(_onexit_t _Func);\n\n#ifndef _CRT_PERROR_DEFINED\n#define _CRT_PERROR_DEFINED\n  void __cdecl perror(const char *_ErrMsg);\n#endif\n  _CRTIMP int __cdecl _putenv(const char *_EnvString);\n  unsigned int __cdecl _rotl(unsigned int _Val,int _Shift);\n#if _INTEGRAL_MAX_BITS >= 64\n  unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val,int _Shift);\n#endif\n  unsigned int __cdecl _rotr(unsigned int _Val,int _Shift);\n#if _INTEGRAL_MAX_BITS >= 64\n  unsigned __int64 __cdecl _rotr64(unsigned __int64 _Val,int _Shift);\n#endif\n  _CRTIMP void __cdecl _searchenv(const char *_Filename,const char *_EnvVar,char *_ResultPath);\n  _CRTIMP void __cdecl _splitpath(const char *_FullPath,char *_Drive,char *_Dir,char *_Filename,char *_Ext);\n  _CRTIMP void __cdecl _swab(char *_Buf1,char *_Buf2,int _SizeInBytes);\n\n#ifndef _WSTDLIBP_DEFINED\n#define _WSTDLIBP_DEFINED\n  _CRTIMP wchar_t *__cdecl _wfullpath(wchar_t *_FullPath,const wchar_t *_Path,size_t _SizeInWords);\n  _CRTIMP void __cdecl _wmakepath(wchar_t *_ResultPath,const wchar_t *_Drive,const wchar_t *_Dir,const wchar_t *_Filename,const wchar_t *_Ext);\n#ifndef _CRT_WPERROR_DEFINED\n#define _CRT_WPERROR_DEFINED\n  _CRTIMP void __cdecl _wperror(const wchar_t *_ErrMsg);\n#endif\n  _CRTIMP int __cdecl _wputenv(const wchar_t *_EnvString);\n  _CRTIMP void __cdecl _wsearchenv(const wchar_t *_Filename,const wchar_t *_EnvVar,wchar_t *_ResultPath);\n  _CRTIMP void __cdecl _wsplitpath(const wchar_t *_FullPath,wchar_t *_Drive,wchar_t *_Dir,wchar_t *_Filename,wchar_t *_Ext);\n#endif\n\n  _CRTIMP void __cdecl _beep(unsigned _Frequency,unsigned _Duration) __MINGW_ATTRIB_DEPRECATED;\n  /* Not to be confused with  _set_error_mode (int).  */\n  _CRTIMP void __cdecl _seterrormode(int _Mode) __MINGW_ATTRIB_DEPRECATED;\n  _CRTIMP void __cdecl _sleep(unsigned long _Duration) __MINGW_ATTRIB_DEPRECATED;\n#endif\n\n#ifndef NO_OLDNAMES\n#ifndef _POSIX_\n#if 0\n#ifndef __cplusplus\n#ifndef NOMINMAX\n#ifndef max\n#define max(a,b) (((a) > (b)) ? (a) : (b))\n#endif\n#ifndef min\n#define min(a,b) (((a) < (b)) ? (a) : (b))\n#endif\n#endif\n#endif\n#endif\n\n#define sys_errlist _sys_errlist\n#define sys_nerr _sys_nerr\n#define environ _environ\n  char *__cdecl ecvt(double _Val,int _NumOfDigits,int *_PtDec,int *_PtSign);\n  char *__cdecl fcvt(double _Val,int _NumOfDec,int *_PtDec,int *_PtSign);\n  char *__cdecl gcvt(double _Val,int _NumOfDigits,char *_DstBuf);\n  char *__cdecl itoa(int _Val,char *_DstBuf,int _Radix);\n  char *__cdecl ltoa(long _Val,char *_DstBuf,int _Radix);\n  int __cdecl putenv(const char *_EnvString);\n  void __cdecl swab(char *_Buf1,char *_Buf2,int _SizeInBytes);\n  char *__cdecl ultoa(unsigned long _Val,char *_Dstbuf,int _Radix);\n  onexit_t __cdecl onexit(onexit_t _Func);\n#endif\n#endif\n\n#if !defined __NO_ISOCEXT /* externs in static libmingwex.a */\n\n  typedef struct { long long quot, rem; } lldiv_t;\n\n  lldiv_t __cdecl lldiv(long long, long long);\n\n  __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }\n\n  long long  __cdecl strtoll(const char* __restrict__, char** __restrict, int);\n  unsigned long long  __cdecl strtoull(const char* __restrict__, char** __restrict__, int);\n\n  /* these are stubs for MS _i64 versions */\n  long long  __cdecl atoll (const char *);\n\n#ifndef __STRICT_ANSI__\n  long long  __cdecl wtoll (const wchar_t *);\n  char *__cdecl lltoa (long long, char *, int);\n  char *__cdecl ulltoa (unsigned long long , char *, int);\n  wchar_t *__cdecl lltow (long long, wchar_t *, int);\n  wchar_t *__cdecl ulltow (unsigned long long, wchar_t *, int);\n\n  /* __CRT_INLINE using non-ansi functions */\n  __CRT_INLINE long long  __cdecl atoll (const char * _c) { return _atoi64 (_c); }\n  __CRT_INLINE char *__cdecl lltoa (long long _n, char * _c, int _i) { return _i64toa (_n, _c, _i); }\n  __CRT_INLINE char *__cdecl ulltoa (unsigned long long _n, char * _c, int _i) { return _ui64toa (_n, _c, _i); }\n  __CRT_INLINE long long  __cdecl wtoll (const wchar_t * _w) { return _wtoi64 (_w); }\n  __CRT_INLINE wchar_t *__cdecl lltow (long long _n, wchar_t * _w, int _i) { return _i64tow (_n, _w, _i); }\n  __CRT_INLINE wchar_t *__cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); }\n#endif /* (__STRICT_ANSI__)  */\n\n#endif /* !__NO_ISOCEXT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n\n#include <sec_api/stdlib_s.h>\n#include <malloc.h>\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/string.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_STRING\n#define _INC_STRING\n\n#include <_mingw.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _NLSCMP_DEFINED\n#define _NLSCMP_DEFINED\n#define _NLSCMPERROR 2147483647\n#endif\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#define _WConst_return _CONST_RETURN\n\n#ifndef _CRT_MEMORY_DEFINED\n#define _CRT_MEMORY_DEFINED\n  _CRTIMP void *__cdecl _memccpy(void *_Dst,const void *_Src,int _Val,size_t _MaxCount);\n  _CONST_RETURN void *__cdecl memchr(const void *_Buf ,int _Val,size_t _MaxCount);\n  _CRTIMP int __cdecl _memicmp(const void *_Buf1,const void *_Buf2,size_t _Size);\n  _CRTIMP int __cdecl _memicmp_l(const void *_Buf1,const void *_Buf2,size_t _Size,_locale_t _Locale);\n  int __cdecl memcmp(const void *_Buf1,const void *_Buf2,size_t _Size);\n  void *__cdecl memcpy(void *_Dst,const void *_Src,size_t _Size);\n  void *__cdecl memset(void *_Dst,int _Val,size_t _Size);\n#ifndef\tNO_OLDNAMES\n  void *__cdecl memccpy(void *_Dst,const void *_Src,int _Val,size_t _Size);\n  int __cdecl memicmp(const void *_Buf1,const void *_Buf2,size_t _Size);\n#endif\n#endif\n  char *__cdecl _strset(char *_Str,int _Val);\n  char *__cdecl strcpy(char *_Dest,const char *_Source);\n  char *__cdecl strcat(char *_Dest,const char *_Source);\n  int __cdecl strcmp(const char *_Str1,const char *_Str2);\n  size_t __cdecl strlen(const char *_Str);\n#if 0\n  size_t __cdecl strnlen(const char *_Str,size_t _MaxCount);\n#endif\n  void *__cdecl memmove(void *_Dst,const void *_Src,size_t _Size);\n  _CRTIMP char *__cdecl _strdup(const char *_Src);\n  _CONST_RETURN char *__cdecl strchr(const char *_Str,int _Val);\n  _CRTIMP int __cdecl _stricmp(const char *_Str1,const char *_Str2);\n  _CRTIMP int __cdecl _strcmpi(const char *_Str1,const char *_Str2);\n  _CRTIMP int __cdecl _stricmp_l(const char *_Str1,const char *_Str2,_locale_t _Locale);\n  int __cdecl strcoll(const char *_Str1,const char *_Str2);\n  _CRTIMP int __cdecl _strcoll_l(const char *_Str1,const char *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _stricoll(const char *_Str1,const char *_Str2);\n  _CRTIMP int __cdecl _stricoll_l(const char *_Str1,const char *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _strncoll (const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _strncoll_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _strnicoll (const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _strnicoll_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  size_t __cdecl strcspn(const char *_Str,const char *_Control);\n  _CRTIMP char *__cdecl _strerror(const char *_ErrMsg);\n  char *__cdecl strerror(int);\n  _CRTIMP char *__cdecl _strlwr(char *_String);\n  char *strlwr_l(char *_String,_locale_t _Locale);\n  char *__cdecl strncat(char *_Dest,const char *_Source,size_t _Count);\n  int __cdecl strncmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _strnicmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _strnicmp_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  char *strncpy(char *_Dest,const char *_Source,size_t _Count);\n  _CRTIMP char *__cdecl _strnset(char *_Str,int _Val,size_t _MaxCount);\n  _CONST_RETURN char *__cdecl strpbrk(const char *_Str,const char *_Control);\n  _CONST_RETURN char *__cdecl strrchr(const char *_Str,int _Ch);\n  _CRTIMP char *__cdecl _strrev(char *_Str);\n  size_t __cdecl strspn(const char *_Str,const char *_Control);\n  _CONST_RETURN char *__cdecl strstr(const char *_Str,const char *_SubStr);\n  char *__cdecl strtok(char *_Str,const char *_Delim);\n  _CRTIMP char *__cdecl _strupr(char *_String);\n  _CRTIMP char *_strupr_l(char *_String,_locale_t _Locale);\n  size_t __cdecl strxfrm(char *_Dst,const char *_Src,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _strxfrm_l(char *_Dst,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n\n#ifndef\tNO_OLDNAMES\n  char *__cdecl strdup(const char *_Src);\n  int __cdecl strcmpi(const char *_Str1,const char *_Str2);\n  int __cdecl stricmp(const char *_Str1,const char *_Str2);\n  char *__cdecl strlwr(char *_Str);\n  int __cdecl strnicmp(const char *_Str1,const char *_Str,size_t _MaxCount);\n  __CRT_INLINE int __cdecl strncasecmp (const char *__sz1, const char *__sz2, size_t __sizeMaxCompare) { return _strnicmp (__sz1, __sz2, __sizeMaxCompare); }\n  __CRT_INLINE int __cdecl strcasecmp (const char *__sz1, const char *__sz2) { return _stricmp (__sz1, __sz2); }\n  char *__cdecl strnset(char *_Str,int _Val,size_t _MaxCount);\n  char *__cdecl strrev(char *_Str);\n  char *__cdecl strset(char *_Str,int _Val);\n  char *__cdecl strupr(char *_Str);\n#endif\n\n#ifndef _WSTRING_DEFINED\n#define _WSTRING_DEFINED\n\n  _CRTIMP wchar_t *__cdecl _wcsdup(const wchar_t *_Str);\n  wchar_t *__cdecl wcscat(wchar_t *_Dest,const wchar_t *_Source);\n  _CONST_RETURN wchar_t *__cdecl wcschr(const wchar_t *_Str,wchar_t _Ch);\n  int __cdecl wcscmp(const wchar_t *_Str1,const wchar_t *_Str2);\n  wchar_t *__cdecl wcscpy(wchar_t *_Dest,const wchar_t *_Source);\n  size_t __cdecl wcscspn(const wchar_t *_Str,const wchar_t *_Control);\n  size_t __cdecl wcslen(const wchar_t *_Str);\n  size_t __cdecl wcsnlen(const wchar_t *_Src,size_t _MaxCount);\n  wchar_t *wcsncat(wchar_t *_Dest,const wchar_t *_Source,size_t _Count);\n  int __cdecl wcsncmp(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  wchar_t *wcsncpy(wchar_t *_Dest,const wchar_t *_Source,size_t _Count);\n  _CONST_RETURN wchar_t *__cdecl wcspbrk(const wchar_t *_Str,const wchar_t *_Control);\n  _CONST_RETURN wchar_t *__cdecl wcsrchr(const wchar_t *_Str,wchar_t _Ch);\n  size_t __cdecl wcsspn(const wchar_t *_Str,const wchar_t *_Control);\n  _CONST_RETURN wchar_t *__cdecl wcsstr(const wchar_t *_Str,const wchar_t *_SubStr);\n  wchar_t *__cdecl wcstok(wchar_t *_Str,const wchar_t *_Delim);\n  _CRTIMP wchar_t *__cdecl _wcserror(int _ErrNum);\n  _CRTIMP wchar_t *__cdecl __wcserror(const wchar_t *_Str);\n  _CRTIMP int __cdecl _wcsicmp(const wchar_t *_Str1,const wchar_t *_Str2);\n  _CRTIMP int __cdecl _wcsicmp_l(const wchar_t *_Str1,const wchar_t *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsnicmp(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _wcsnicmp_l(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wcsnset(wchar_t *_Str,wchar_t _Val,size_t _MaxCount);\n  _CRTIMP wchar_t *__cdecl _wcsrev(wchar_t *_Str);\n  _CRTIMP wchar_t *__cdecl _wcsset(wchar_t *_Str,wchar_t _Val);\n  _CRTIMP wchar_t *__cdecl _wcslwr(wchar_t *_String);\n  _CRTIMP wchar_t *_wcslwr_l(wchar_t *_String,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wcsupr(wchar_t *_String);\n  _CRTIMP wchar_t *_wcsupr_l(wchar_t *_String,_locale_t _Locale);\n  size_t __cdecl wcsxfrm(wchar_t *_Dst,const wchar_t *_Src,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _wcsxfrm_l(wchar_t *_Dst,const wchar_t *_Src,size_t _MaxCount,_locale_t _Locale);\n  int __cdecl wcscoll(const wchar_t *_Str1,const wchar_t *_Str2);\n  _CRTIMP int __cdecl _wcscoll_l(const wchar_t *_Str1,const wchar_t *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsicoll(const wchar_t *_Str1,const wchar_t *_Str2);\n  _CRTIMP int __cdecl _wcsicoll_l(const wchar_t *_Str1,const wchar_t *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsncoll(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _wcsncoll_l(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsnicoll(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _wcsnicoll_l(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount,_locale_t _Locale);\n\n#ifndef\tNO_OLDNAMES\n  wchar_t *__cdecl wcsdup(const wchar_t *_Str);\n#define wcswcs wcsstr\n  int __cdecl wcsicmp(const wchar_t *_Str1,const wchar_t *_Str2);\n  int __cdecl wcsnicmp(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  wchar_t *__cdecl wcsnset(wchar_t *_Str,wchar_t _Val,size_t _MaxCount);\n  wchar_t *__cdecl wcsrev(wchar_t *_Str);\n  wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val);\n  wchar_t *__cdecl wcslwr(wchar_t *_Str);\n  wchar_t *__cdecl wcsupr(wchar_t *_Str);\n  int __cdecl wcsicoll(const wchar_t *_Str1,const wchar_t *_Str2);\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#include <sec_api/string_s.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/fcntl.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/*\n * This file is part of the Mingw32 package.\n *\n * This fcntl.h maps to the root fcntl.h\n */\n#ifndef __STRICT_ANSI__\n#include <fcntl.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/file.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/*\n * This file is part of the Mingw32 package.\n *\n * This file.h maps to the root fcntl.h\n * TODO?\n */\n#ifndef __STRICT_ANSI__\n#include <fcntl.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/locking.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_LOCKING\n#define _INC_LOCKING\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n/* All the headers include this file. */\n#include <_mingw.h>\n\n#define _LK_UNLCK 0\n#define _LK_LOCK 1\n#define _LK_NBLCK 2\n#define _LK_RLCK 3\n#define _LK_NBRLCK 4\n\n#ifndef\tNO_OLDNAMES\n#define LK_UNLCK _LK_UNLCK\n#define LK_LOCK _LK_LOCK\n#define LK_NBLCK _LK_NBLCK\n#define LK_RLCK _LK_RLCK\n#define LK_NBRLCK _LK_NBRLCK\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/stat.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_STAT\n#define _INC_STAT\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n#include <_mingw.h>\n#include <io.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _CRTIMP\n#define _CRTIMP __declspec(dllimport)\n#endif\n\n#include <sys/types.h>\n\n#ifndef __TINYC__ //gr\n#ifdef _USE_32BIT_TIME_T\n#ifdef _WIN64\n#undef _USE_32BIT_TIME_T\n#endif\n#else\n#if _INTEGRAL_MAX_BITS < 64\n#define _USE_32BIT_TIME_T\n#endif\n#endif\n#endif\n\n#ifndef _TIME32_T_DEFINED\n  typedef long __time32_t;\n#define _TIME32_T_DEFINED\n#endif\n\n#ifndef _TIME64_T_DEFINED\n#if _INTEGRAL_MAX_BITS >= 64\n  typedef __int64 __time64_t;\n#endif\n#define _TIME64_T_DEFINED\n#endif\n\n#ifndef _TIME_T_DEFINED\n#ifdef _USE_32BIT_TIME_T\n  typedef __time32_t time_t;\n#else\n  typedef __time64_t time_t;\n#endif\n#define _TIME_T_DEFINED\n#endif\n\n#ifndef _WCHAR_T_DEFINED\n  typedef unsigned short wchar_t;\n#define _WCHAR_T_DEFINED\n#endif\n\n#ifndef _STAT_DEFINED\n\n#ifdef _USE_32BIT_TIME_T\n#ifndef _WIN64\n#define _fstat32 _fstat\n#define _stat32 _stat\n#define _wstat32 _wstat\n#else\n#define _fstat _fstat32\n#define _stat _stat32\n#define _wstat _wstat32\n#endif\n#define _fstati64 _fstat32i64\n#define _stati64 _stat32i64\n#define _wstati64 _wstat32i64\n#else\n#define _fstat _fstat64i32\n#define _fstati64 _fstat64\n#define _stat _stat64i32\n#define _stati64 _stat64\n#define _wstat _wstat64i32\n#define _wstati64 _wstat64\n#endif\n\n  struct _stat32 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    _off_t st_size;\n    __time32_t st_atime;\n    __time32_t st_mtime;\n    __time32_t st_ctime;\n  };\n\n#ifndef\tNO_OLDNAMES\n  struct stat {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    _off_t st_size;\n    time_t st_atime;\n    time_t st_mtime;\n    time_t st_ctime;\n  };\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 64\n  struct _stat32i64 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    __int64 st_size;\n    __time32_t st_atime;\n    __time32_t st_mtime;\n    __time32_t st_ctime;\n  };\n\n  struct _stat64i32 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    _off_t st_size;\n    __time64_t st_atime;\n    __time64_t st_mtime;\n    __time64_t st_ctime;\n  };\n\n  struct _stat64 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    __int64 st_size;\n    __time64_t st_atime;\n    __time64_t st_mtime;\n    __time64_t st_ctime;\n  };\n#endif\n\n#define __stat64 _stat64\n\n#define _STAT_DEFINED\n#endif\n\n#define _S_IFMT 0xF000\n#define _S_IFDIR 0x4000\n#define _S_IFCHR 0x2000\n#define _S_IFIFO 0x1000\n#define _S_IFREG 0x8000\n#define _S_IREAD 0x0100\n#define _S_IWRITE 0x0080\n#define _S_IEXEC 0x0040\n\n  _CRTIMP int __cdecl _fstat32(int _FileDes,struct _stat32 *_Stat);\n  _CRTIMP int __cdecl _stat32(const char *_Name,struct _stat32 *_Stat);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP int __cdecl _fstat64(int _FileDes,struct _stat64 *_Stat);\n  _CRTIMP int __cdecl _fstat32i64(int _FileDes,struct _stat32i64 *_Stat);\n  int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat);\n  __CRT_INLINE int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat)\n  {\n    struct _stat64 st;\n    int ret=_fstat64(_FileDes,&st);\n    _Stat->st_dev=st.st_dev;\n    _Stat->st_ino=st.st_ino;\n    _Stat->st_mode=st.st_mode;\n    _Stat->st_nlink=st.st_nlink;\n    _Stat->st_uid=st.st_uid;\n    _Stat->st_gid=st.st_gid;\n    _Stat->st_rdev=st.st_rdev;\n    _Stat->st_size=(_off_t) st.st_size;\n    _Stat->st_atime=st.st_atime;\n    _Stat->st_mtime=st.st_mtime;\n    _Stat->st_ctime=st.st_ctime;\n    return ret;\n  }\n  _CRTIMP int __cdecl _stat64(const char *_Name,struct _stat64 *_Stat);\n  _CRTIMP int __cdecl _stat32i64(const char *_Name,struct _stat32i64 *_Stat);\n  int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat);\n  __CRT_INLINE int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat)\n  {\n    struct _stat64 st;\n    int ret=_stat64(_Name,&st);\n    _Stat->st_dev=st.st_dev;\n    _Stat->st_ino=st.st_ino;\n    _Stat->st_mode=st.st_mode;\n    _Stat->st_nlink=st.st_nlink;\n    _Stat->st_uid=st.st_uid;\n    _Stat->st_gid=st.st_gid;\n    _Stat->st_rdev=st.st_rdev;\n    _Stat->st_size=(_off_t) st.st_size;\n    _Stat->st_atime=st.st_atime;\n    _Stat->st_mtime=st.st_mtime;\n    _Stat->st_ctime=st.st_ctime;\n    return ret;\n  }\n#endif\n\n#ifndef _WSTAT_DEFINED\n#define _WSTAT_DEFINED\n  _CRTIMP int __cdecl _wstat32(const wchar_t *_Name,struct _stat32 *_Stat);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP int __cdecl _wstat32i64(const wchar_t *_Name,struct _stat32i64 *_Stat);\n  int __cdecl _wstat64i32(const wchar_t *_Name,struct _stat64i32 *_Stat);\n  _CRTIMP int __cdecl _wstat64(const wchar_t *_Name,struct _stat64 *_Stat);\n#endif\n#endif\n\n#ifndef\tNO_OLDNAMES\n#define\t_S_IFBLK\t0x3000\t/* Block: Is this ever set under w32? */\n\n#define S_IFMT _S_IFMT\n#define S_IFDIR _S_IFDIR\n#define S_IFCHR _S_IFCHR\n#define S_IFREG _S_IFREG\n#define S_IREAD _S_IREAD\n#define S_IWRITE _S_IWRITE\n#define S_IEXEC _S_IEXEC\n#define\tS_IFIFO\t\t_S_IFIFO\n#define\tS_IFBLK\t\t_S_IFBLK\n\n#define\t_S_IRWXU\t(_S_IREAD | _S_IWRITE | _S_IEXEC)\n#define\t_S_IXUSR\t_S_IEXEC\n#define\t_S_IWUSR\t_S_IWRITE\n\n#define\tS_IRWXU\t\t_S_IRWXU\n#define\tS_IXUSR\t\t_S_IXUSR\n#define\tS_IWUSR\t\t_S_IWUSR\n#define\tS_IRUSR\t\t_S_IRUSR\n#define\t_S_IRUSR\t_S_IREAD\n\n#define\tS_ISDIR(m)\t(((m) & S_IFMT) == S_IFDIR)\n#define\tS_ISFIFO(m)\t(((m) & S_IFMT) == S_IFIFO)\n#define\tS_ISCHR(m)\t(((m) & S_IFMT) == S_IFCHR)\n#define\tS_ISBLK(m)\t(((m) & S_IFMT) == S_IFBLK)\n#define\tS_ISREG(m)\t(((m) & S_IFMT) == S_IFREG)\n\n#endif\n\n#if !defined (RC_INVOKED) && !defined (NO_OLDNAMES)\nint __cdecl stat(const char *_Filename,struct stat *_Stat);\nint __cdecl fstat(int _Desc,struct stat *_Stat);\nint __cdecl wstat(const wchar_t *_Filename,struct stat *_Stat);\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE int __cdecl fstat(int _Desc,struct stat *_Stat) {\n  return _fstat32(_Desc,(struct _stat32 *)_Stat);\n}\n__CRT_INLINE int __cdecl stat(const char *_Filename,struct stat *_Stat) {\n  return _stat32(_Filename,(struct _stat32 *)_Stat);\n}\n#else\n__CRT_INLINE int __cdecl fstat(int _Desc,struct stat *_Stat) {\n  return _fstat64i32(_Desc,(struct _stat64i32 *)_Stat);\n}\n__CRT_INLINE int __cdecl stat(const char *_Filename,struct stat *_Stat) {\n  return _stat64i32(_Filename,(struct _stat64i32 *)_Stat);\n}\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/time.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n\n#ifndef _SYS_TIME_H_\n#define _SYS_TIME_H_\n\n#include <time.h>\n\n#ifdef  __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef __STRICT_ANSI__\n#ifndef _TIMEVAL_DEFINED /* also in winsock[2].h */\n#define _TIMEVAL_DEFINED\nstruct timeval {\n  long tv_sec;\n  long tv_usec;\n};\n#define timerisset(tvp)\t ((tvp)->tv_sec || (tvp)->tv_usec)\n#define timercmp(tvp, uvp, cmp) \\\n  (((tvp)->tv_sec != (uvp)->tv_sec) ? \\\n  ((tvp)->tv_sec cmp (uvp)->tv_sec) : \\\n  ((tvp)->tv_usec cmp (uvp)->tv_usec))\n#define timerclear(tvp)\t (tvp)->tv_sec = (tvp)->tv_usec = 0\n#endif /* _TIMEVAL_DEFINED */\n\n#ifndef _TIMEZONE_DEFINED /* also in sys/time.h */\n#define _TIMEZONE_DEFINED\n/* Provided for compatibility with code that assumes that\n   the presence of gettimeofday function implies a definition\n   of struct timezone. */\nstruct timezone\n{\n  int tz_minuteswest; /* of Greenwich */\n  int tz_dsttime;     /* type of dst correction to apply */\n};\n\n  extern int __cdecl mingw_gettimeofday (struct timeval *p, struct timezone *z);\n\n#endif\n\n/*\n   Implementation as per:\n   The Open Group Base Specifications, Issue 6\n   IEEE Std 1003.1, 2004 Edition\n\n   The timezone pointer arg is ignored.  Errors are ignored.\n*/\n#ifndef _GETTIMEOFDAY_DEFINED\n#define _GETTIMEOFDAY_DEFINED\nint __cdecl gettimeofday(struct timeval *__restrict__,\n                         void *__restrict__  /* tzp (unused) */);\n#endif\n\n#endif /* __STRICT_ANSI__ */\n\n#ifdef  __cplusplus\n}\n#endif\n\n/* Adding timespec definition.  */\n#include <sys/timeb.h>\n\n\n#endif /* _SYS_TIME_H_ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/timeb.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _TIMEB_H_\n#define _TIMEB_H_\n\n#include <_mingw.h>\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _CRTIMP\n#define _CRTIMP __declspec(dllimport)\n#endif\n\n#ifndef __TINYC__ //gr\n#ifdef _USE_32BIT_TIME_T\n#ifdef _WIN64\n#undef _USE_32BIT_TIME_T\n#endif\n#else\n#if _INTEGRAL_MAX_BITS < 64\n#define _USE_32BIT_TIME_T\n#endif\n#endif\n#endif\n\n#ifndef _TIME32_T_DEFINED\n  typedef long __time32_t;\n#define _TIME32_T_DEFINED\n#endif\n\n#ifndef _TIME64_T_DEFINED\n#if _INTEGRAL_MAX_BITS >= 64\n  typedef __int64 __time64_t;\n#endif\n#define _TIME64_T_DEFINED\n#endif\n\n#ifndef _TIME_T_DEFINED\n#ifdef _USE_32BIT_TIME_T\n  typedef __time32_t time_t;\n#else\n  typedef __time64_t time_t;\n#endif\n#define _TIME_T_DEFINED\n#endif\n\n#ifndef _TIMEB_DEFINED\n#define _TIMEB_DEFINED\n\n  struct __timeb32 {\n    __time32_t time;\n    unsigned short millitm;\n    short timezone;\n    short dstflag;\n  };\n\n#ifndef\tNO_OLDNAMES\n  struct timeb {\n    time_t time;\n    unsigned short millitm;\n    short timezone;\n    short dstflag;\n  };\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 64\n  struct __timeb64 {\n    __time64_t time;\n    unsigned short millitm;\n    short timezone;\n    short dstflag;\n  };\n#endif\n\n#ifdef _USE_32BIT_TIME_T\n#define _timeb __timeb32\n//gr #define _ftime _ftime32\n#define _ftime32 _ftime\n#else\n#define _timeb __timeb64\n#define _ftime _ftime64\n#endif\n#endif\n\n  _CRTIMP void __cdecl _ftime32(struct __timeb32 *_Time);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP void __cdecl _ftime64(struct __timeb64 *_Time);\n#endif\n\n#ifndef _TIMESPEC_DEFINED\n#define _TIMESPEC_DEFINED\nstruct timespec {\n  time_t  tv_sec;   /* Seconds */\n  long    tv_nsec;  /* Nanoseconds */\n};\n\nstruct itimerspec {\n  struct timespec  it_interval;  /* Timer period */\n  struct timespec  it_value;     /* Timer expiration */\n};\n#endif\n\n#if !defined (RC_INVOKED) && !defined (NO_OLDNAMES)\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE void __cdecl ftime(struct timeb *_Tmb) {\n  _ftime32((struct __timeb32 *)_Tmb);\n}\n#else\n__CRT_INLINE void __cdecl ftime(struct timeb *_Tmb) {\n  _ftime64((struct __timeb64 *)_Tmb);\n}\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n\n#include <sec_api/sys/timeb_s.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/types.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_TYPES\n#define _INC_TYPES\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n#include <_mingw.h>\n\n#ifndef __TINYC__ //gr\n#ifdef _USE_32BIT_TIME_T\n#ifdef _WIN64\n#undef _USE_32BIT_TIME_T\n#endif\n#else\n#if _INTEGRAL_MAX_BITS < 64\n#define _USE_32BIT_TIME_T\n#endif\n#endif\n#endif\n\n#ifndef _TIME32_T_DEFINED\n#define _TIME32_T_DEFINED\ntypedef long __time32_t;\n#endif\n\n#ifndef _TIME64_T_DEFINED\n#define _TIME64_T_DEFINED\n#if _INTEGRAL_MAX_BITS >= 64\ntypedef __int64 __time64_t;\n#endif\n#endif\n\n#ifndef _TIME_T_DEFINED\n#define _TIME_T_DEFINED\n#ifdef _USE_32BIT_TIME_T\ntypedef __time32_t time_t;\n#else\ntypedef __time64_t time_t;\n#endif\n#endif\n\n#ifndef _INO_T_DEFINED\n#define _INO_T_DEFINED\ntypedef unsigned short _ino_t;\n#ifndef\tNO_OLDNAMES\ntypedef unsigned short ino_t;\n#endif\n#endif\n\n#ifndef _DEV_T_DEFINED\n#define _DEV_T_DEFINED\ntypedef unsigned int _dev_t;\n#ifndef\tNO_OLDNAMES\ntypedef unsigned int dev_t;\n#endif\n#endif\n\n#ifndef _PID_T_\n#define\t_PID_T_\n#ifndef _WIN64\ntypedef int\t_pid_t;\n#else\ntypedef __int64\t_pid_t;\n#endif\n\n#ifndef\tNO_OLDNAMES\ntypedef _pid_t\tpid_t;\n#endif\n#endif\t/* Not _PID_T_ */\n\n#ifndef _MODE_T_\n#define\t_MODE_T_\ntypedef unsigned short _mode_t;\n\n#ifndef\tNO_OLDNAMES\ntypedef _mode_t\tmode_t;\n#endif\n#endif\t/* Not _MODE_T_ */\n\n#ifndef _OFF_T_DEFINED\n#define _OFF_T_DEFINED\n#ifndef _OFF_T_\n#define _OFF_T_\n  typedef long _off_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long off_t;\n#endif\n#endif\n#endif\n\n#ifndef _OFF64_T_DEFINED\n#define _OFF64_T_DEFINED\n  typedef long long _off64_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long long off64_t;\n#endif\n#endif\n\n#ifndef _TIMESPEC_DEFINED\n#define _TIMESPEC_DEFINED\nstruct timespec {\n  time_t  tv_sec;   /* Seconds */\n  long    tv_nsec;  /* Nanoseconds */\n};\n\nstruct itimerspec {\n  struct timespec  it_interval;  /* Timer period */\n  struct timespec  it_value;     /* Timer expiration */\n};\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/unistd.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n/*\n * This file is part of the Mingw32 package.\n *\n * unistd.h maps (roughly) to io.h\n */\n#ifndef __STRICT_ANSI__\n#include <io.h>\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/sys/utime.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_UTIME\n#define _INC_UTIME\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _CRTIMP\n#define _CRTIMP __declspec(dllimport)\n#endif\n\n#ifndef _WCHAR_T_DEFINED\n  typedef unsigned short wchar_t;\n#define _WCHAR_T_DEFINED\n#endif\n\n#ifndef __TINYC__ //gr\n#ifdef _USE_32BIT_TIME_T\n#ifdef _WIN64\n#undef _USE_32BIT_TIME_T\n#endif\n#else\n#if _INTEGRAL_MAX_BITS < 64\n#define _USE_32BIT_TIME_T\n#endif\n#endif\n#endif\n\n#ifndef _TIME32_T_DEFINED\n#define _TIME32_T_DEFINED\n  typedef long __time32_t;\n#endif\n\n#ifndef _TIME64_T_DEFINED\n#define _TIME64_T_DEFINED\n#if _INTEGRAL_MAX_BITS >= 64\n  typedef __int64 __time64_t;\n#endif\n#endif\n\n#ifndef _TIME_T_DEFINED\n#define _TIME_T_DEFINED\n#ifdef _USE_32BIT_TIME_T\n  typedef __time32_t time_t;\n#else\n  typedef __time64_t time_t;\n#endif\n#endif\n\n#ifndef _UTIMBUF_DEFINED\n#define _UTIMBUF_DEFINED\n\n  struct _utimbuf {\n    time_t actime;\n    time_t modtime;\n  };\n\n  struct __utimbuf32 {\n    __time32_t actime;\n    __time32_t modtime;\n  };\n\n#if _INTEGRAL_MAX_BITS >= 64\n  struct __utimbuf64 {\n    __time64_t actime;\n    __time64_t modtime;\n  };\n#endif\n\n#ifndef\tNO_OLDNAMES\n  struct utimbuf {\n    time_t actime;\n    time_t modtime;\n  };\n\n  struct utimbuf32 {\n    __time32_t actime;\n    __time32_t modtime;\n  };\n#endif\n#endif\n\n  _CRTIMP int __cdecl _utime32(const char *_Filename,struct __utimbuf32 *_Time);\n  _CRTIMP int __cdecl _futime32(int _FileDes,struct __utimbuf32 *_Time);\n  _CRTIMP int __cdecl _wutime32(const wchar_t *_Filename,struct __utimbuf32 *_Time);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP int __cdecl _utime64(const char *_Filename,struct __utimbuf64 *_Time);\n  _CRTIMP int __cdecl _futime64(int _FileDes,struct __utimbuf64 *_Time);\n  _CRTIMP int __cdecl _wutime64(const wchar_t *_Filename,struct __utimbuf64 *_Time);\n#endif\n\n#ifndef RC_INVOKED\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE int __cdecl _utime(const char *_Filename,struct _utimbuf *_Utimbuf) {\n  return _utime32(_Filename,(struct __utimbuf32 *)_Utimbuf);\n}\n__CRT_INLINE int __cdecl _futime(int _Desc,struct _utimbuf *_Utimbuf) {\n  return _futime32(_Desc,(struct __utimbuf32 *)_Utimbuf);\n}\n__CRT_INLINE int __cdecl _wutime(const wchar_t *_Filename,struct _utimbuf *_Utimbuf) {\n  return _wutime32(_Filename,(struct __utimbuf32 *)_Utimbuf);\n}\n#else\n__CRT_INLINE int __cdecl _utime(const char *_Filename,struct _utimbuf *_Utimbuf) {\n  return _utime64(_Filename,(struct __utimbuf64 *)_Utimbuf);\n}\n__CRT_INLINE int __cdecl _futime(int _Desc,struct _utimbuf *_Utimbuf) {\n  return _futime64(_Desc,(struct __utimbuf64 *)_Utimbuf);\n}\n__CRT_INLINE int __cdecl _wutime(const wchar_t *_Filename,struct _utimbuf *_Utimbuf) {\n  return _wutime64(_Filename,(struct __utimbuf64 *)_Utimbuf);\n}\n#endif\n\n#ifndef\tNO_OLDNAMES\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE int __cdecl utime(const char *_Filename,struct utimbuf *_Utimbuf) {\n  return _utime32(_Filename,(struct __utimbuf32 *)_Utimbuf);\n}\n#else\n__CRT_INLINE int __cdecl utime(const char *_Filename,struct utimbuf *_Utimbuf) {\n  return _utime64(_Filename,(struct __utimbuf64 *)_Utimbuf);\n}\n#endif\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/tchar.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#include <_mingw.h>\n\n#ifndef _INC_TCHAR\n#define _INC_TCHAR\n\n#ifdef _STRSAFE_H_INCLUDED_\n#error Need to include strsafe.h after tchar.h\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define _ftcscat _tcscat\n#define _ftcschr _tcschr\n#define _ftcscpy _tcscpy\n#define _ftcscspn _tcscspn\n#define _ftcslen _tcslen\n#define _ftcsncat _tcsncat\n#define _ftcsncpy _tcsncpy\n#define _ftcspbrk _tcspbrk\n#define _ftcsrchr _tcsrchr\n#define _ftcsspn _tcsspn\n#define _ftcsstr _tcsstr\n#define _ftcstok _tcstok\n\n#define _ftcsdup _tcsdup\n#define _ftcsnset _tcsnset\n#define _ftcsrev _tcsrev\n#define _ftcsset _tcsset\n\n#define _ftcscmp _tcscmp\n#define _ftcsicmp _tcsicmp\n#define _ftcsnccmp _tcsnccmp\n#define _ftcsncmp _tcsncmp\n#define _ftcsncicmp _tcsncicmp\n#define _ftcsnicmp _tcsnicmp\n\n#define _ftcscoll _tcscoll\n#define _ftcsicoll _tcsicoll\n#define _ftcsnccoll _tcsnccoll\n#define _ftcsncoll _tcsncoll\n#define _ftcsncicoll _tcsncicoll\n#define _ftcsnicoll _tcsnicoll\n\n#define _ftcsclen _tcsclen\n#define _ftcsnccat _tcsnccat\n#define _ftcsnccpy _tcsnccpy\n#define _ftcsncset _tcsncset\n\n#define _ftcsdec _tcsdec\n#define _ftcsinc _tcsinc\n#define _ftcsnbcnt _tcsnbcnt\n#define _ftcsnccnt _tcsnccnt\n#define _ftcsnextc _tcsnextc\n#define _ftcsninc _tcsninc\n#define _ftcsspnp _tcsspnp\n\n#define _ftcslwr _tcslwr\n#define _ftcsupr _tcsupr\n\n#define _ftclen _tclen\n#define _ftccpy _tccpy\n#define _ftccmp _tccmp\n\n#ifndef _CONST_RETURN\n#ifdef __cplusplus\n#define _CONST_RETURN const\n#define _CRT_CONST_CORRECT_OVERLOADS\n#else\n#define _CONST_RETURN\n#endif\n#endif\n\n#define _WConst_return _CONST_RETURN\n\n#ifdef _UNICODE\n\n#ifdef __cplusplus\n}\n#endif\n\n#include <wchar.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _WCTYPE_T_DEFINED\n#define _WCTYPE_T_DEFINED\n  typedef unsigned short wint_t;\n  typedef unsigned short wctype_t;\n#endif\n\n#ifndef __TCHAR_DEFINED\n#define __TCHAR_DEFINED\n  typedef wchar_t _TCHAR;\n  typedef wchar_t _TSCHAR;\n  typedef wchar_t _TUCHAR;\n  typedef wchar_t _TXCHAR;\n  typedef wint_t _TINT;\n#endif\n\n#ifndef _TCHAR_DEFINED\n#define _TCHAR_DEFINED\n#ifndef\tNO_OLDNAMES\n  typedef wchar_t TCHAR;\n#endif\n#endif\n\n#define _TEOF WEOF\n\n#define __T(x) L##x\n\n#define _tmain wmain\n#define _tWinMain wWinMain\n#define _tenviron _wenviron\n#define __targv __wargv\n\n#define _tprintf wprintf\n#define _tprintf_l _wprintf_l\n#define _tprintf_p _wprintf_p\n#define _tprintf_p_l _wprintf_p_l\n#define _tcprintf _cwprintf\n#define _tcprintf_l _cwprintf_l\n#define _tcprintf_p _cwprintf_p\n#define _tcprintf_p_l _cwprintf_p_l\n#define _vtcprintf _vcwprintf\n#define _vtcprintf_l _vcwprintf_l\n#define _vtcprintf_p _vcwprintf_p\n#define _vtcprintf_p_l _vcwprintf_p_l\n#define _ftprintf fwprintf\n#define _ftprintf_l _fwprintf_l\n#define _ftprintf_p _fwprintf_p\n#define _ftprintf_p_l _fwprintf_p_l\n#define _stprintf swprintf\n#define _stprintf_l __swprintf_l\n#define _stprintf_p _swprintf_p\n#define _stprintf_p_l _swprintf_p_l\n#define _sctprintf _scwprintf\n#define _sctprintf_l _scwprintf_l\n#define _sctprintf_p _scwprintf_p\n#define _sctprintf_p_l _scwprintf_p_l\n#define _sntprintf _snwprintf\n#define _sntprintf_l _snwprintf_l\n#define _vtprintf vwprintf\n#define _vtprintf_l _vwprintf_l\n#define _vtprintf_p _vwprintf_p\n#define _vtprintf_p_l _vwprintf_p_l\n#define _vftprintf vfwprintf\n#define _vftprintf_l _vfwprintf_l\n#define _vftprintf_p _vfwprintf_p\n#define _vftprintf_p_l _vfwprintf_p_l\n#define _vstprintf vswprintf\n#define _vstprintf_l _vswprintf_l\n#define _vstprintf_p _vswprintf_p\n#define _vstprintf_p_l _vswprintf_p_l\n#define _vsctprintf _vscwprintf\n#define _vsctprintf_l _vscwprintf_l\n#define _vsctprintf_p _vscwprintf_p\n#define _vsctprintf_p_l _vscwprintf_p_l\n#define _vsntprintf _vsnwprintf\n#define _vsntprintf_l _vsnwprintf_l\n\n#define _tscanf wscanf\n#define _tscanf_l _wscanf_l\n#define _tcscanf _cwscanf\n#define _tcscanf_l _cwscanf_l\n#define _ftscanf fwscanf\n#define _ftscanf_l _fwscanf_l\n#define _stscanf swscanf\n#define _stscanf_l _swscanf_l\n#define _sntscanf _snwscanf\n#define _sntscanf_l _snwscanf_l\n\n#define _fgettc fgetwc\n#define _fgettc_nolock _fgetwc_nolock\n#define _fgettchar _fgetwchar\n#define _fgetts fgetws\n#define _fputtc fputwc\n#define _fputtc_nolock _fputwc_nolock\n#define _fputtchar _fputwchar\n#define _fputts fputws\n#define _cputts _cputws\n#define _cgetts _cgetws\n#define _gettc getwc\n#define _gettc_nolock _getwc_nolock\n#define _gettch _getwch\n#define _gettch_nolock _getwch_nolock\n#define _gettche _getwche\n#define _gettche_nolock _getwche_nolock\n#define _gettchar getwchar\n#define _gettchar_nolock _getwchar_nolock\n#define _getts _getws\n#define _puttc putwc\n#define _puttc_nolock _putwc_nolock\n#define _puttchar putwchar\n#define _puttchar_nolock _putwchar_nolock\n#define _puttch _putwch\n#define _puttch_nolock _putwch_nolock\n#define _putts _putws\n#define _ungettc ungetwc\n#define _ungettc_nolock _ungetwc_nolock\n#define _ungettch _ungetwch\n#define _ungettch_nolock _ungetwch_nolock\n\n#define _tcstod wcstod\n#define _tcstol wcstol\n#define _tcstoul wcstoul\n#define _tcstoi64 _wcstoi64\n#define _tcstoui64 _wcstoui64\n#define _tstof _wtof\n#define _tstol _wtol\n#define _tstoi _wtoi\n#define _tstoi64 _wtoi64\n#define _tcstod_l _wcstod_l\n#define _tcstol_l _wcstol_l\n#define _tcstoul_l _wcstoul_l\n#define _tcstoi64_l _wcstoi64_l\n#define _tcstoui64_l _wcstoui64_l\n#define _tstof_l _wtof_l\n#define _tstol_l _wtol_l\n#define _tstoi_l _wtoi_l\n#define _tstoi64_l _wtoi64_l\n\n#define _itot _itow\n#define _ltot _ltow\n#define _ultot _ultow\n#define _ttoi _wtoi\n#define _ttol _wtol\n\n#define _ttoi64 _wtoi64\n#define _i64tot _i64tow\n#define _ui64tot _ui64tow\n\n#define _tcscat wcscat\n#define _tcschr wcschr\n#define _tcscpy wcscpy\n#define _tcscspn wcscspn\n#define _tcslen wcslen\n#define _tcsnlen wcsnlen\n#define _tcsncat wcsncat\n#define _tcsncat_l _wcsncat_l\n#define _tcsncpy wcsncpy\n#define _tcsncpy_l _wcsncpy_l\n#define _tcspbrk wcspbrk\n#define _tcsrchr wcsrchr\n#define _tcsspn wcsspn\n#define _tcsstr wcsstr\n#define _tcstok wcstok\n#define _tcstok_l _wcstok_l\n#define _tcserror _wcserror\n#define __tcserror __wcserror\n\n#define _tcsdup _wcsdup\n#define _tcsnset _wcsnset\n#define _tcsnset_l _wcsnset_l\n#define _tcsrev _wcsrev\n#define _tcsset _wcsset\n#define _tcsset_l _wcsset_l\n\n#define _tcscmp wcscmp\n#define _tcsicmp _wcsicmp\n#define _tcsicmp_l _wcsicmp_l\n#define _tcsnccmp wcsncmp\n#define _tcsncmp wcsncmp\n#define _tcsncicmp _wcsnicmp\n#define _tcsncicmp_l _wcsnicmp_l\n#define _tcsnicmp _wcsnicmp\n#define _tcsnicmp_l _wcsnicmp_l\n\n#define _tcscoll wcscoll\n#define _tcscoll_l _wcscoll_l\n#define _tcsicoll _wcsicoll\n#define _tcsicoll_l _wcsicoll_l\n#define _tcsnccoll _wcsncoll\n#define _tcsnccoll_l _wcsncoll_l\n#define _tcsncoll _wcsncoll\n#define _tcsncoll_l _wcsncoll_l\n#define _tcsncicoll _wcsnicoll\n#define _tcsncicoll_l _wcsnicoll_l\n#define _tcsnicoll _wcsnicoll\n#define _tcsnicoll_l _wcsnicoll_l\n\n#define _texecl _wexecl\n#define _texecle _wexecle\n#define _texeclp _wexeclp\n#define _texeclpe _wexeclpe\n#define _texecv _wexecv\n#define _texecve _wexecve\n#define _texecvp _wexecvp\n#define _texecvpe _wexecvpe\n\n#define _tspawnl _wspawnl\n#define _tspawnle _wspawnle\n#define _tspawnlp _wspawnlp\n#define _tspawnlpe _wspawnlpe\n#define _tspawnv _wspawnv\n#define _tspawnve _wspawnve\n#define _tspawnvp _wspawnvp\n#define _tspawnvp _wspawnvp\n#define _tspawnvpe _wspawnvpe\n\n#define _tsystem _wsystem\n\n#define _tasctime _wasctime\n#define _tctime _wctime\n#define _tctime32 _wctime32\n#define _tctime64 _wctime64\n#define _tstrdate _wstrdate\n#define _tstrtime _wstrtime\n#define _tutime _wutime\n#define _tutime32 _wutime32\n#define _tutime64 _wutime64\n#define _tcsftime wcsftime\n#define _tcsftime_l _wcsftime_l\n\n#define _tchdir _wchdir\n#define _tgetcwd _wgetcwd\n#define _tgetdcwd _wgetdcwd\n#define _tgetdcwd_nolock _wgetdcwd_nolock\n#define _tmkdir _wmkdir\n#define _trmdir _wrmdir\n\n#define _tfullpath _wfullpath\n#define _tgetenv _wgetenv\n#define _tmakepath _wmakepath\n#define _tpgmptr _wpgmptr\n#define _get_tpgmptr _get_wpgmptr\n#define _tputenv _wputenv\n#define _tsearchenv _wsearchenv\n#define _tsplitpath _wsplitpath\n\n#define _tfdopen _wfdopen\n#define _tfsopen _wfsopen\n#define _tfopen _wfopen\n#define _tfreopen _wfreopen\n#define _tperror _wperror\n#define _tpopen _wpopen\n#define _ttempnam _wtempnam\n#define _ttmpnam _wtmpnam\n\n#define _taccess _waccess\n#define _tchmod _wchmod\n#define _tcreat _wcreat\n#define _tfindfirst _wfindfirst\n#define _tfindfirst32 _wfindfirst32\n#define _tfindfirst64 _wfindfirst64\n#define _tfindfirsti64 _wfindfirsti64\n#define _tfindfirst32i64 _wfindfirst32i64\n#define _tfindfirst64i32 _wfindfirst64i32\n#define _tfindnext _wfindnext\n#define _tfindnext32 _wfindnext32\n#define _tfindnext64 _wfindnext64\n#define _tfindnexti64 _wfindnexti64\n#define _tfindnext32i64 _wfindnext32i64\n#define _tfindnext64i32 _wfindnext64i32\n#define _tmktemp _wmktemp\n#define _topen _wopen\n#define _tremove _wremove\n#define _trename _wrename\n#define _tsopen _wsopen\n#define _tunlink _wunlink\n\n#define _tfinddata_t _wfinddata_t\n#define _tfinddata32_t _wfinddata32_t\n#define _tfinddata64_t _wfinddata64_t\n#define _tfinddatai64_t _wfinddatai64_t\n#define _tfinddata32i64_t _wfinddata32i64_t\n#define _tfinddata64i32_t _wfinddata64i32_t\n\n#define _tstat _wstat\n#define _tstat32 _wstat32\n#define _tstat32i64 _wstat32i64\n#define _tstat64 _wstat64\n#define _tstat64i32 _wstat64i32\n#define _tstati64 _wstati64\n\n#define _tsetlocale _wsetlocale\n\n#define _tcsclen wcslen\n#define _tcscnlen wcsnlen\n#define _tcsclen_l(_String,_Locale) wcslen(_String)\n#define _tcscnlen_l(_String,_Max_count,_Locale) wcsnlen_l((_String),(_Max_count))\n#define _tcsnccat wcsncat\n#define _tcsnccat_l _wcsncat_l\n#define _tcsnccpy wcsncpy\n#define _tcsnccpy_l _wcsncpy_l\n#define _tcsncset _wcsnset\n\n#define _tcsdec _wcsdec\n#define _tcsinc _wcsinc\n#define _tcsnbcnt _wcsncnt\n#define _tcsnccnt _wcsncnt\n#define _tcsnextc _wcsnextc\n#define _tcsninc _wcsninc\n#define _tcsspnp _wcsspnp\n\n#define _tcslwr _wcslwr\n#define _tcslwr_l _wcslwr_l\n#define _tcsupr _wcsupr\n#define _tcsupr_l _wcsupr_l\n#define _tcsxfrm wcsxfrm\n#define _tcsxfrm_l _wcsxfrm_l\n\n#define _tclen(_pc) (1)\n#define _tccpy(_pc1,_cpc2) ((*(_pc1) = *(_cpc2)))\n#define _tccmp(_cpc1,_cpc2) ((*(_cpc1))-(*(_cpc2)))\n\n#define _istalnum iswalnum\n#define _istalnum_l _iswalnum_l\n#define _istalpha iswalpha\n#define _istalpha_l _iswalpha_l\n#define _istascii iswascii\n#define _istcntrl iswcntrl\n#define _istcntrl_l _iswcntrl_l\n#define _istdigit iswdigit\n#define _istdigit_l _iswdigit_l\n#define _istgraph iswgraph\n#define _istgraph_l _iswgraph_l\n#define _istlower iswlower\n#define _istlower_l _iswlower_l\n#define _istprint iswprint\n#define _istprint_l _iswprint_l\n#define _istpunct iswpunct\n#define _istpunct_l _iswpunct_l\n#define _istspace iswspace\n#define _istspace_l _iswspace_l\n#define _istupper iswupper\n#define _istupper_l _iswupper_l\n#define _istxdigit iswxdigit\n#define _istxdigit_l _iswxdigit_l\n\n#define _totupper towupper\n#define _totupper_l _towupper_l\n#define _totlower towlower\n#define _totlower_l _towlower_l\n\n#define _istlegal(_Char) (1)\n#define _istlead(_Char) (0)\n#define _istleadbyte(_Char) (0)\n#define _istleadbyte_l(_Char,_Locale) (0)\n\n#define _wcsdec(_cpc1,_cpc2) ((_cpc1)>=(_cpc2) ? NULL : (_cpc2)-1)\n#define _wcsinc(_pc) ((_pc)+1)\n#define _wcsnextc(_cpc) ((unsigned int) *(_cpc))\n#define _wcsninc(_pc,_sz) (((_pc)+(_sz)))\n  _CRTIMP size_t __cdecl __wcsncnt(const wchar_t *_Str,size_t _MaxCount);\n#define _wcsncnt(_cpc,_sz) (__wcsncnt(_cpc,_sz))\n#define _wcsspnp(_cpc1,_cpc2) (!_cpc1 ? NULL : ((*((_cpc1)+wcsspn(_cpc1,_cpc2))) ? ((_cpc1)+wcsspn(_cpc1,_cpc2)) : NULL))\n#define _wcsncpy_l(_Destination,_Source,_Count,_Locale) (wcsncpy(_Destination,_Source,_Count))\n#define _wcsncat_l(_Destination,_Source,_Count,_Locale) (wcsncat(_Destination,_Source,_Count))\n#define _wcstok_l(_String,_Delimiters,_Locale) (wcstok(_String,_Delimiters))\n#define _wcsnset_l(_Destination,_Value,_Count,_Locale) (_wcsnset(_Destination,_Value,_Count))\n#define _wcsset_l(_Destination,_Value,_Locale) (_wcsset(_Destination,_Value))\n\n  /* dirent structures and functions */\n#define _tdirent\t_wdirent\n#define _TDIR \t\t_WDIR\n#define _topendir\t_wopendir\n#define _tclosedir\t_wclosedir\n#define _treaddir\t_wreaddir\n#define _trewinddir\t_wrewinddir\n#define _ttelldir\t_wtelldir\n#define _tseekdir\t_wseekdir\n\n#else\n\n#ifdef __cplusplus\n}\n#endif\n\n#include <string.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define _TEOF EOF\n\n#define __T(x) x\n\n#define _tmain main\n#define _tWinMain WinMain\n#ifdef _POSIX_\n#define _tenviron environ\n#else\n#define _tenviron _environ\n#endif\n#define __targv __argv\n\n#define _tprintf printf\n#define _tprintf_l _printf_l\n#define _tprintf_p _printf_p\n#define _tprintf_p_l _printf_p_l\n#define _tcprintf _cprintf\n#define _tcprintf_l _cprintf_l\n#define _tcprintf_p _cprintf_p\n#define _tcprintf_p_l _cprintf_p_l\n#define _vtcprintf _vcprintf\n#define _vtcprintf_l _vcprintf_l\n#define _vtcprintf_p _vcprintf_p\n#define _vtcprintf_p_l _vcprintf_p_l\n#define _ftprintf fprintf\n#define _ftprintf_l _fprintf_l\n#define _ftprintf_p _fprintf_p\n#define _ftprintf_p_l _fprintf_p_l\n#define _stprintf sprintf\n#define _stprintf_l _sprintf_l\n#define _stprintf_p _sprintf_p\n#define _stprintf_p_l _sprintf_p_l\n#define _sctprintf _scprintf\n#define _sctprintf_l _scprintf_l\n#define _sctprintf_p _scprintf_p\n#define _sctprintf_p_l _scprintf_p_l\n#define _sntprintf _snprintf\n#define _sntprintf_l _snprintf_l\n#define _vtprintf vprintf\n#define _vtprintf_l _vprintf_l\n#define _vtprintf_p _vprintf_p\n#define _vtprintf_p_l _vprintf_p_l\n#define _vftprintf vfprintf\n#define _vftprintf_l _vfprintf_l\n#define _vftprintf_p _vfprintf_p\n#define _vftprintf_p_l _vfprintf_p_l\n#define _vstprintf vsprintf\n#define _vstprintf_l _vsprintf_l\n#define _vstprintf_p _vsprintf_p\n#define _vstprintf_p_l _vsprintf_p_l\n#define _vsctprintf _vscprintf\n#define _vsctprintf_l _vscprintf_l\n#define _vsctprintf_p _vscprintf_p\n#define _vsctprintf_p_l _vscprintf_p_l\n#define _vsntprintf _vsnprintf\n#define _vsntprintf_l _vsnprintf_l\n\n#define _tscanf scanf\n#define _tscanf_l _scanf_l\n#define _tcscanf _cscanf\n#define _tcscanf_l _cscanf_l\n#define _ftscanf fscanf\n#define _ftscanf_l _fscanf_l\n#define _stscanf sscanf\n#define _stscanf_l _sscanf_l\n#define _sntscanf _snscanf\n#define _sntscanf_l _snscanf_l\n\n#define _fgettc fgetc\n#define _fgettc_nolock _fgetc_nolock\n#define _fgettchar _fgetchar\n#define _fgetts fgets\n#define _fputtc fputc\n#define _fputtc_nolock _fputc_nolock\n#define _fputtchar _fputchar\n#define _fputts fputs\n#define _cputts _cputs\n#define _gettc getc\n#define _gettc_nolock _getc_nolock\n#define _gettch _getch\n#define _gettch_nolock _getch_nolock\n#define _gettche _getche\n#define _gettche_nolock _getche_nolock\n#define _gettchar getchar\n#define _gettchar_nolock _getchar_nolock\n#define _getts gets\n#define _cgetts _cgets\n#define _puttc putc\n#define _puttc_nolock _putc_nolock\n#define _puttchar putchar\n#define _puttchar_nolock _putchar_nolock\n#define _puttch _putch\n#define _puttch_nolock _putch_nolock\n#define _putts puts\n#define _ungettc ungetc\n#define _ungettc_nolock _ungetc_nolock\n#define _ungettch _ungetch\n#define _ungettch_nolock _ungetch_nolock\n\n#define _tcstod strtod\n#define _tcstol strtol\n#define _tcstoul strtoul\n#define _tstof atof\n#define _tstol atol\n#define _tstoi atoi\n#define _tstoi64 _atoi64\n#define _tcstod_l _strtod_l\n#define _tcstol_l _strtol_l\n#define _tcstoul_l _strtoul_l\n#define _tstof_l _atof_l\n#define _tstol_l _atol_l\n#define _tstoi_l _atoi_l\n#define _tstoi64_l _atoi64_l\n\n#define _itot _itoa\n#define _ltot _ltoa\n#define _ultot _ultoa\n#define _ttoi atoi\n#define _ttol atol\n\n#define _ttoi64 _atoi64\n#define _tcstoi64 _strtoi64\n#define _tcstoi64_l _strtoi64_l\n#define _tcstoui64 _strtoui64\n#define _tcstoui64_l _strtoui64_l\n#define _i64tot _i64toa\n#define _ui64tot _ui64toa\n\n#define _tcscat strcat\n#define _tcscpy strcpy\n#define _tcsdup _strdup\n#define _tcslen strlen\n#if 0\n#define _tcsnlen strnlen\n#endif\n#define _tcsxfrm strxfrm\n#define _tcsxfrm_l _strxfrm_l\n#define _tcserror strerror\n#define __tcserror _strerror\n\n#define _texecl _execl\n#define _texecle _execle\n#define _texeclp _execlp\n#define _texeclpe _execlpe\n#define _texecv _execv\n#define _texecve _execve\n#define _texecvp _execvp\n#define _texecvpe _execvpe\n\n#define _tspawnl _spawnl\n#define _tspawnle _spawnle\n#define _tspawnlp _spawnlp\n#define _tspawnlpe _spawnlpe\n#define _tspawnv _spawnv\n#define _tspawnve _spawnve\n#define _tspawnvp _spawnvp\n#define _tspawnvpe _spawnvpe\n\n#define _tsystem system\n\n#define _tasctime asctime\n#define _tctime ctime\n#define _tctime32 _ctime32\n#define _tctime64 _ctime64\n#define _tstrdate _strdate\n#define _tstrtime _strtime\n#define _tutime _utime\n#define _tutime32 _utime32\n#define _tutime64 _utime64\n#define _tcsftime strftime\n#define _tcsftime_l _strftime_l\n\n#define _tchdir _chdir\n#define _tgetcwd _getcwd\n#define _tgetdcwd _getdcwd\n#define _tgetdcwd_nolock _getdcwd_nolock\n#define _tmkdir _mkdir\n#define _trmdir _rmdir\n\n#define _tfullpath _fullpath\n#define _tgetenv getenv\n#define _tmakepath _makepath\n#define _tpgmptr _pgmptr\n#define _get_tpgmptr _get_pgmptr\n#define _tputenv _putenv\n#define _tsearchenv _searchenv\n#define _tsplitpath _splitpath\n\n#ifdef _POSIX_\n#define _tfdopen fdopen\n#else\n#define _tfdopen _fdopen\n#endif\n#define _tfsopen _fsopen\n#define _tfopen fopen\n#define _tfreopen freopen\n#define _tperror perror\n#define _tpopen _popen\n#define _ttempnam _tempnam\n#define _ttmpnam tmpnam\n\n#define _tchmod _chmod\n#define _tcreat _creat\n#define _tfindfirst _findfirst\n#define _tfindfirst32 _findfirst32\n#define _tfindfirst64 _findfirst64\n#define _tfindfirsti64 _findfirsti64\n#define _tfindfirst32i64 _findfirst32i64\n#define _tfindfirst64i32 _findfirst64i32\n#define _tfindnext _findnext\n#define _tfindnext32 _findnext32\n#define _tfindnext64 _findnext64\n#define _tfindnexti64 _findnexti64\n#define _tfindnext32i64 _findnext32i64\n#define _tfindnext64i32 _findnext64i32\n#define _tmktemp _mktemp\n\n#ifdef _POSIX_\n#define _topen open\n#define _taccess access\n#else\n#define _topen _open\n#define _taccess _access\n#endif\n\n#define _tremove remove\n#define _trename rename\n#define _tsopen _sopen\n#define _tunlink _unlink\n\n#define _tfinddata_t _finddata_t\n#define _tfinddata32_t _finddata32_t\n#define _tfinddata64_t __finddata64_t\n#define _tfinddatai64_t _finddatai64_t\n#define _tfinddata32i64_t _finddata32i64_t\n#define _tfinddata64i32_t _finddata64i32_t\n\n#define _istascii __isascii\n#define _istcntrl iscntrl\n#define _istcntrl_l _iscntrl_l\n#define _istxdigit isxdigit\n#define _istxdigit_l _isxdigit_l\n\n#define _tstat _stat\n#define _tstat32 _stat32\n#define _tstat32i64 _stat32i64\n#define _tstat64 _stat64\n#define _tstat64i32 _stat64i32\n#define _tstati64 _stati64\n\n#define _tsetlocale setlocale\n\n#ifdef _MBCS\n\n#ifdef __cplusplus\n}\n#endif\n\n#include <mbstring.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef __TCHAR_DEFINED\n  typedef char _TCHAR;\n  typedef signed char _TSCHAR;\n  typedef unsigned char _TUCHAR;\n  typedef unsigned char _TXCHAR;\n  typedef unsigned int _TINT;\n#define __TCHAR_DEFINED\n#endif\n\n#ifndef _TCHAR_DEFINED\n#ifndef\tNO_OLDNAMES\n  typedef char TCHAR;\n#endif\n#define _TCHAR_DEFINED\n#endif\n\n#ifdef _MB_MAP_DIRECT\n\n#define _tcschr _mbschr\n#define _tcscspn _mbscspn\n#define _tcsncat _mbsnbcat\n#define _tcsncat_l _mbsnbcat_l\n#define _tcsncpy _mbsnbcpy\n#define _tcsncpy_l _mbsnbcpy_l\n#define _tcspbrk _mbspbrk\n#define _tcsrchr _mbsrchr\n#define _tcsspn _mbsspn\n#define _tcsstr _mbsstr\n#define _tcstok _mbstok\n#define _tcstok_l _mbstok_l\n\n#define _tcsnset _mbsnbset\n#define _tcsnset_l _mbsnbset_l\n#define _tcsrev _mbsrev\n#define _tcsset _mbsset\n#define _tcsset_l _mbsset_l\n\n#define _tcscmp _mbscmp\n#define _tcsicmp _mbsicmp\n#define _tcsicmp_l _mbsicmp_l\n#define _tcsnccmp _mbsncmp\n#define _tcsncmp _mbsnbcmp\n#define _tcsncicmp _mbsnicmp\n#define _tcsncicmp_l _mbsnicmp_l\n#define _tcsnicmp _mbsnbicmp\n#define _tcsnicmp_l _mbsnbicmp_l\n\n#define _tcscoll _mbscoll\n#define _tcscoll_l _mbscoll_l\n#define _tcsicoll _mbsicoll\n#define _tcsicoll_l _mbsicoll_l\n#define _tcsnccoll _mbsncoll\n#define _tcsnccoll_l _mbsncoll_l\n#define _tcsncoll _mbsnbcoll\n#define _tcsncoll_l _mbsnbcoll_l\n#define _tcsncicoll _mbsnicoll\n#define _tcsncicoll_l _mbsnicoll_l\n#define _tcsnicoll _mbsnbicoll\n#define _tcsnicoll_l _mbsnbicoll_l\n\n#define _tcsclen _mbslen\n#define _tcscnlen _mbsnlen\n#define _tcsclen_l _mbslen_l\n#define _tcscnlen_l _mbsnlen_l\n#define _tcsnccat _mbsncat\n#define _tcsnccat_l _mbsncat_l\n#define _tcsnccpy _mbsncpy\n#define _tcsnccpy_l _mbsncpy_l\n#define _tcsncset _mbsnset\n#define _tcsncset_l _mbsnset_l\n\n#define _tcsdec _mbsdec\n#define _tcsinc _mbsinc\n#define _tcsnbcnt _mbsnbcnt\n#define _tcsnccnt _mbsnccnt\n#define _tcsnextc _mbsnextc\n#define _tcsninc _mbsninc\n#define _tcsspnp _mbsspnp\n\n#define _tcslwr _mbslwr\n#define _tcslwr_l _mbslwr_l\n#define _tcsupr _mbsupr\n#define _tcsupr_l _mbsupr_l\n\n#define _tclen _mbclen\n#define _tccpy _mbccpy\n#define _tccpy_l _mbccpy_l\n#else\n\n  _CRTIMP _CONST_RETURN char *__cdecl _tcschr(const char *_Str,unsigned int _Val);\n  _CRTIMP size_t __cdecl _tcscspn(const char *_Str,const char *_Control);\n  _CRTIMP char *__cdecl _tcsncat(char *_Dst,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsncat_l(char *_Dst,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsncpy(char *_Dst,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsncpy_l(char *_Dst,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP _CONST_RETURN char *__cdecl _tcspbrk(const char *_Str,const char *_Control);\n  _CRTIMP _CONST_RETURN char *__cdecl _tcsrchr(const char *_Str,unsigned int _Ch);\n  _CRTIMP size_t __cdecl _tcsspn(const char *_Str,const char *_Control);\n  _CRTIMP _CONST_RETURN char *__cdecl _tcsstr(const char *_Str,const char *_Substr);\n  _CRTIMP char *__cdecl _tcstok(char *_Str,const char *_Delim);\n  _CRTIMP char *__cdecl _tcstok_l(char *_Str,const char *_Delim,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsnset(char *_Str,unsigned int _Val,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsrev(char *_Str);\n  _CRTIMP char *__cdecl _tcsset(char *_Str,unsigned int _Val);\n  _CRTIMP char *__cdecl _tcsset_l(char *_Str,unsigned int _Val,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcscmp(const char *_Str1,const char *_Str);\n  _CRTIMP int __cdecl _tcsicmp(const char *_Str1,const char *_Str2);\n  _CRTIMP int __cdecl _tcsicmp_l(const char *_Str1,const char *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcsnccmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsncmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsncicmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsncicmp_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcsnicmp(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsnicmp_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcscoll(const char *_Str1,const char *_Str2);\n  _CRTIMP int __cdecl _tcscoll_l(const char *_Str1,const char *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcsicoll(const char *_Str1,const char *_Str2);\n  _CRTIMP int __cdecl _tcsicoll_l(const char *_Str1,const char *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcsnccoll(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsnccoll_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcsncoll(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsncoll_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcsncicoll(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsncicoll_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _tcsnicoll(const char *_Str1,const char *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _tcsnicoll_l(const char *_Str1,const char *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP size_t __cdecl _tcsclen(const char *_Str);\n  _CRTIMP size_t __cdecl _tcscnlen(const char *_Str,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _tcsclen_l(const char *_Str,_locale_t _Locale);\n  _CRTIMP size_t __cdecl _tcscnlen_l(const char *_Str,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsnccat(char *_Dst,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsnccat_l(char *_Dst,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsnccpy(char *_Dst,const char *_Src,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsnccpy_l(char *_Dst,const char *_Src,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsncset(char *_Str,unsigned int _Val,size_t _MaxCount);\n  _CRTIMP char *__cdecl _tcsdec(const char *_Start,const char *_Pos);\n  _CRTIMP char *__cdecl _tcsinc(const char *_Ptr);\n  _CRTIMP size_t __cdecl _tcsnbcnt(const char *_Str,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _tcsnccnt(const char *_Str,size_t _MaxCount);\n  _CRTIMP unsigned int __cdecl _tcsnextc (const char *_Str);\n  _CRTIMP char *__cdecl _tcsninc(const char *_Ptr,size_t _Count);\n  _CRTIMP char *__cdecl _tcsspnp(const char *_Str1,const char *_Str2);\n  _CRTIMP char *__cdecl _tcslwr(char *_Str);\n  _CRTIMP char *__cdecl _tcslwr_l(char *_Str,_locale_t _Locale);\n  _CRTIMP char *__cdecl _tcsupr(char *_Str);\n  _CRTIMP char *__cdecl _tcsupr_l(char *_Str,_locale_t _Locale);\n  _CRTIMP size_t __cdecl _tclen(const char *_Str);\n  _CRTIMP void __cdecl _tccpy(char *_DstCh,const char *_SrcCh);\n\n#ifdef __cplusplus\n#ifndef _CPP_TCHAR_INLINES_DEFINED\n#define _CPP_TCHAR_INLINES_DEFINED\n  extern \"C++\" {\n    extern inline char *__cdecl _tcschr(char *_S,unsigned int _C) { return ((char *)_tcschr((const char *)_S,_C)); }\n    extern inline char *__cdecl _tcspbrk(char *_S,const char *_P) { return ((char *)_tcspbrk((const char *)_S,_P)); }\n    extern inline char *__cdecl _tcsrchr(char *_S,unsigned int _C) { return ((char *)_tcsrchr((const char *)_S,_C)); }\n    extern inline char *__cdecl _tcsstr(char *_S,const char *_P) { return ((char *)_tcsstr((const char *)_S,_P)); }\n  }\n#endif\n#endif\n#endif\n\n#define _tccmp(_cp1,_cp2) _tcsnccmp(_cp1,_cp2,1)\n\n#define _istalnum _ismbcalnum\n#define _istalnum_l _ismbcalnum_l\n#define _istalpha _ismbcalpha\n#define _istalpha_l _ismbcalpha_l\n#define _istdigit _ismbcdigit\n#define _istdigit_l _ismbcdigit_l\n#define _istgraph _ismbcgraph\n#define _istgraph_l _ismbcgraph_l\n#define _istlegal _ismbclegal\n#define _istlegal_l _ismbclegal_l\n#define _istlower _ismbclower\n#define _istlower_l _ismbclower_l\n#define _istprint _ismbcprint\n#define _istprint_l _ismbcprint_l\n#define _istpunct _ismbcpunct\n#define _istpunct_l _ismbcpunct_l\n#define _istspace _ismbcspace\n#define _istspace_l _ismbcspace_l\n#define _istupper _ismbcupper\n#define _istupper_l _ismbcupper_l\n\n#define _totupper _mbctoupper\n#define _totupper_l _mbctoupper_l\n#define _totlower _mbctolower\n#define _totlower_l _mbctolower_l\n\n#define _istlead _ismbblead\n#define _istleadbyte isleadbyte\n#define _istleadbyte_l _isleadbyte_l\n#else\n\n#ifndef __TCHAR_DEFINED\n#define __TCHAR_DEFINED\n  typedef char _TCHAR;\n  typedef signed char _TSCHAR;\n  typedef unsigned char _TUCHAR;\n  typedef char _TXCHAR;\n  typedef int _TINT;\n#endif\n\n#ifndef _TCHAR_DEFINED\n#define _TCHAR_DEFINED\n#ifndef\tNO_OLDNAMES\n  typedef char TCHAR;\n#endif\n#endif\n\n#define _tcschr strchr\n#define _tcscspn strcspn\n#define _tcsncat strncat\n#define _tcsncat_l _strncat_l\n#define _tcsncpy strncpy\n#define _tcsncpy_l _strncpy_l\n#define _tcspbrk strpbrk\n#define _tcsrchr strrchr\n#define _tcsspn strspn\n#define _tcsstr strstr\n#define _tcstok strtok\n#define _tcstok_l _strtok_l\n\n#define _tcsnset _strnset\n#define _tcsnset_l _strnset_l\n#define _tcsrev _strrev\n#define _tcsset _strset\n\n#define _tcscmp strcmp\n#define _tcsicmp _stricmp\n#define _tcsicmp_l _stricmp_l\n#define _tcsnccmp strncmp\n#define _tcsncmp strncmp\n#define _tcsncicmp _strnicmp\n#define _tcsncicmp_l _strnicmp_l\n#define _tcsnicmp _strnicmp\n#define _tcsnicmp_l _strnicmp_l\n\n#define _tcscoll strcoll\n#define _tcscoll_l _strcoll_l\n#define _tcsicoll _stricoll\n#define _tcsicoll_l _stricoll_l\n#define _tcsnccoll _strncoll\n#define _tcsnccoll_l _strncoll_l\n#define _tcsncoll _strncoll\n#define _tcsncoll_l _strncoll_l\n#define _tcsncicoll _strnicoll\n#define _tcsncicoll_l _strnicoll_l\n#define _tcsnicoll _strnicoll\n#define _tcsnicoll_l _strnicoll_l\n\n#define _tcsclen strlen\n#define _tcscnlen strnlen\n#define _tcsclen_l(_String,_Locale) strlen(_String)\n#define _tcscnlen_l(_String,_Max_count,_Locale) strnlen_l((_String),(_Max_count))\n#define _tcsnccat strncat\n#define _tcsnccat_l _strncat_l\n#define _tcsnccpy strncpy\n#define _tcsnccpy_l _strncpy_l\n#define _tcsncset _strnset\n\n#define _tcsdec _strdec\n#define _tcsinc _strinc\n#define _tcsnbcnt _strncnt\n#define _tcsnccnt _strncnt\n#define _tcsnextc _strnextc\n#define _tcsninc _strninc\n#define _tcsspnp _strspnp\n\n#define _tcslwr _strlwr\n#define _tcslwr_l _strlwr_l\n#define _tcsupr _strupr\n#define _tcsupr_l _strupr_l\n#define _tcsxfrm strxfrm\n#define _tcsxfrm_l _strxfrm_l\n\n#define _istlead(_Char) (0)\n#define _istleadbyte(_Char) (0)\n#define _istleadbyte_l(_Char,_Locale) (0)\n\n#define _tclen(_pc) (1)\n#define _tccpy(_pc1,_cpc2) (*(_pc1) = *(_cpc2))\n#define _tccmp(_cpc1,_cpc2) (((unsigned char)*(_cpc1))-((unsigned char)*(_cpc2)))\n\n  /* dirent structures and functions */\n#define _tdirent\tdirent\n#define _TDIR \t\tDIR\n#define _topendir\topendir\n#define _tclosedir\tclosedir\n#define _treaddir\treaddir\n#define _trewinddir\trewinddir\n#define _ttelldir\ttelldir\n#define _tseekdir\tseekdir\n\n#define _istalnum isalnum\n#define _istalnum_l _isalnum_l\n#define _istalpha isalpha\n#define _istalpha_l _isalpha_l\n#define _istdigit isdigit\n#define _istdigit_l _isdigit_l\n#define _istgraph isgraph\n#define _istgraph_l _isgraph_l\n#define _istlower islower\n#define _istlower_l _islower_l\n#define _istprint isprint\n#define _istprint_l _isprint_l\n#define _istpunct ispunct\n#define _istpunct_l _ispunct_l\n#define _istspace isspace\n#define _istspace_l _isspace_l\n#define _istupper isupper\n#define _istupper_l _isupper_l\n\n#define _totupper toupper\n#define _totupper_l _toupper_l\n#define _totlower tolower\n#define _totlower_l _tolower_l\n\n#define _istlegal(_c) (1)\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#define _strdec(_cpc1,_cpc2) ((_cpc1)>=(_cpc2) ? NULL : (_cpc2)-1)\n#define _strinc(_pc) ((_pc)+1)\n#define _strnextc(_cpc) ((unsigned int) *(const unsigned char *)(_cpc))\n#define _strninc(_pc,_sz) (((_pc)+(_sz)))\n  _CRTIMP size_t __cdecl __strncnt(const char *_Str,size_t _Cnt);\n#define _strncnt(_cpc,_sz) (__strncnt(_cpc,_sz))\n#define _strspnp(_cpc1,_cpc2) (!_cpc1 ? NULL : ((*((_cpc1)+strspn(_cpc1,_cpc2))) ? ((_cpc1)+strspn(_cpc1,_cpc2)) : NULL))\n\n#define _strncpy_l(_Destination,_Source,_Count,_Locale) (strncpy(_Destination,_Source,_Count))\n#define _strncat_l(_Destination,_Source,_Count,_Locale) (strncat(_Destination,_Source,_Count))\n#define _strtok_l(_String,_Delimiters,_Locale) (strtok(_String,_Delimiters))\n#define _strnset_l(_Destination,_Value,_Count,_Locale) (_strnset(_Destination,_Value,_Count))\n#define _strset_l(_Destination,_Value,_Locale) (_strset(_Destination,_Value))\n#endif\n#endif\n\n#define _T(x) __T(x)\n#define _TEXT(x) __T(x)\n\n#ifdef __cplusplus\n}\n#endif\n\n#include <sec_api/tchar_s.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/time.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _TIME_H_\n#define _TIME_H_\n\n#include <_mingw.h>\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _CRTIMP\n#define _CRTIMP __declspec(dllimport)\n#endif\n\n#ifndef _WCHAR_T_DEFINED\n#define _WCHAR_T_DEFINED\n  typedef unsigned short wchar_t;\n#endif\n\n#ifndef _TIME32_T_DEFINED\n#define _TIME32_T_DEFINED\n  typedef long __time32_t;\n#endif\n\n#ifndef _TIME64_T_DEFINED\n#define _TIME64_T_DEFINED\n#if _INTEGRAL_MAX_BITS >= 64\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef int _time64_t __attribute__ ((mode (DI)));\n#else\n  typedef __int64 __time64_t;\n#endif\n#endif\n#endif\n\n#ifndef _TIME_T_DEFINED\n#define _TIME_T_DEFINED\n#ifdef _USE_32BIT_TIME_T\n  typedef __time32_t time_t;\n#else\n  typedef __time64_t time_t;\n#endif\n#endif\n\n#ifndef _CLOCK_T_DEFINED\n#define _CLOCK_T_DEFINED\n  typedef long clock_t;\n#endif\n\n#ifndef _SIZE_T_DEFINED\n#define _SIZE_T_DEFINED\n#undef size_t\n#ifdef _WIN64\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef unsigned int size_t __attribute__ ((mode (DI)));\n#else\n  typedef unsigned __int64 size_t;\n#endif\n#else\n  typedef unsigned int size_t;\n#endif\n#endif\n\n#ifndef _SSIZE_T_DEFINED\n#define _SSIZE_T_DEFINED\n#undef ssize_t\n#ifdef _WIN64\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef int ssize_t __attribute__ ((mode (DI)));\n#else\n  typedef __int64 ssize_t;\n#endif\n#else\n  typedef int ssize_t;\n#endif\n#endif\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#ifdef _USE_32BIT_TIME_T\n#define _localtime32 localtime\n#define _difftime32     difftime\n#define _ctime32        ctime\n#define _gmtime32       gmtime\n#define _mktime32       mktime\n#define _time32 time\n#endif\n\n#ifndef _TM_DEFINED\n#define _TM_DEFINED\n  struct tm {\n    int tm_sec;\n    int tm_min;\n    int tm_hour;\n    int tm_mday;\n    int tm_mon;\n    int tm_year;\n    int tm_wday;\n    int tm_yday;\n    int tm_isdst;\n  };\n#endif\n\n#define CLOCKS_PER_SEC 1000\n\n  __MINGW_IMPORT int _daylight;\n  __MINGW_IMPORT long _dstbias;\n  __MINGW_IMPORT long _timezone;\n  __MINGW_IMPORT char * _tzname[2];\n  _CRTIMP errno_t __cdecl _get_daylight(int *_Daylight);\n  _CRTIMP errno_t __cdecl _get_dstbias(long *_Daylight_savings_bias);\n  _CRTIMP errno_t __cdecl _get_timezone(long *_Timezone);\n  _CRTIMP errno_t __cdecl _get_tzname(size_t *_ReturnValue,char *_Buffer,size_t _SizeInBytes,int _Index);\n  char *__cdecl asctime(const struct tm *_Tm);\n  _CRTIMP char *__cdecl _ctime32(const __time32_t *_Time);\n  clock_t __cdecl clock(void);\n  _CRTIMP double __cdecl _difftime32(__time32_t _Time1,__time32_t _Time2);\n  _CRTIMP struct tm *__cdecl _gmtime32(const __time32_t *_Time);\n  _CRTIMP struct tm *__cdecl _localtime32(const __time32_t *_Time);\n  size_t __cdecl strftime(char *_Buf,size_t _SizeInBytes,const char *_Format,const struct tm *_Tm);\n  _CRTIMP size_t __cdecl _strftime_l(char *_Buf,size_t _Max_size,const char *_Format,const struct tm *_Tm,_locale_t _Locale);\n  _CRTIMP char *__cdecl _strdate(char *_Buffer);\n  _CRTIMP char *__cdecl _strtime(char *_Buffer);\n  _CRTIMP __time32_t __cdecl _time32(__time32_t *_Time);\n  _CRTIMP __time32_t __cdecl _mktime32(struct tm *_Tm);\n  _CRTIMP __time32_t __cdecl _mkgmtime32(struct tm *_Tm);\n#if defined (_POSIX_) || defined(__GNUC__)\n  void __cdecl tzset(void);\n#else\n  _CRTIMP void __cdecl _tzset(void);\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 64\n  double __cdecl _difftime64(__time64_t _Time1,__time64_t _Time2);\n  _CRTIMP char *__cdecl _ctime64(const __time64_t *_Time);\n  _CRTIMP struct tm *__cdecl _gmtime64(const __time64_t *_Time);\n  _CRTIMP struct tm *__cdecl _localtime64(const __time64_t *_Time);\n  _CRTIMP __time64_t __cdecl _mktime64(struct tm *_Tm);\n  _CRTIMP __time64_t __cdecl _mkgmtime64(struct tm *_Tm);\n  _CRTIMP __time64_t __cdecl _time64(__time64_t *_Time);\n#endif\n  unsigned __cdecl _getsystime(struct tm *_Tm);\n  unsigned __cdecl _setsystime(struct tm *_Tm,unsigned _MilliSec);\n\n#ifndef _SIZE_T_DEFINED\n#define _SIZE_T_DEFINED\n#ifdef _WIN64\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef unsigned int size_t __attribute__ ((mode (DI)));\n#else\n  typedef unsigned __int64 size_t;\n#endif\n#else\n  typedef unsigned long size_t;\n#endif\n#endif\n\n#ifndef _SSIZE_T_DEFINED\n#define _SSIZE_T_DEFINED\n#ifdef _WIN64\n#if defined(__GNUC__) && defined(__STRICT_ANSI__)\n  typedef int ssize_t __attribute__ ((mode (DI)));\n#else\n  typedef __int64 ssize_t;\n#endif\n#else\n  typedef long ssize_t;\n#endif\n#endif\n\n#ifndef _WTIME_DEFINED\n  _CRTIMP wchar_t *__cdecl _wasctime(const struct tm *_Tm);\n  _CRTIMP wchar_t *__cdecl _wctime32(const __time32_t *_Time);\n  size_t __cdecl wcsftime(wchar_t *_Buf,size_t _SizeInWords,const wchar_t *_Format,const struct tm *_Tm);\n  _CRTIMP size_t __cdecl _wcsftime_l(wchar_t *_Buf,size_t _SizeInWords,const wchar_t *_Format,const struct tm *_Tm,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wstrdate(wchar_t *_Buffer);\n  _CRTIMP wchar_t *__cdecl _wstrtime(wchar_t *_Buffer);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP wchar_t *__cdecl _wctime64(const __time64_t *_Time);\n#endif\n\n#if !defined (RC_INVOKED) && !defined (_INC_WTIME_INL)\n#define _INC_WTIME_INL\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime32(_Time); }\n#else\n__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime64(_Time); }\n#endif\n#endif\n\n#define _WTIME_DEFINED\n#endif\n\n#ifndef RC_INVOKED\ndouble __cdecl difftime(time_t _Time1,time_t _Time2);\nchar *__cdecl ctime(const time_t *_Time);\nstruct tm *__cdecl gmtime(const time_t *_Time);\nstruct tm *__cdecl localtime(const time_t *_Time);\nstruct tm *__cdecl localtime_r(const time_t *_Time,struct tm *);\n\ntime_t __cdecl mktime(struct tm *_Tm);\ntime_t __cdecl _mkgmtime(struct tm *_Tm);\ntime_t __cdecl time(time_t *_Time);\n\n#ifdef _USE_32BIT_TIME_T\n#if 0\n__CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2) { return _difftime32(_Time1,_Time2); }\n__CRT_INLINE char *__cdecl ctime(const time_t *_Time) { return _ctime32(_Time); }\n__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime32(_Time); }\n__CRT_INLINE struct tm *__cdecl localtime(const time_t *_Time) { return _localtime32(_Time); }\n__CRT_INLINE time_t __cdecl mktime(struct tm *_Tm) { return _mktime32(_Tm); }\n__CRT_INLINE time_t __cdecl _mkgmtime(struct tm *_Tm) { return _mkgmtime32(_Tm); }\n__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time32(_Time); }\n#endif\n#else\n__CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2) { return _difftime64(_Time1,_Time2); }\n__CRT_INLINE char *__cdecl ctime(const time_t *_Time) { return _ctime64(_Time); }\n__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime64(_Time); }\n__CRT_INLINE struct tm *__cdecl localtime(const time_t *_Time) { return _localtime64(_Time); }\n__CRT_INLINE time_t __cdecl mktime(struct tm *_Tm) { return _mktime64(_Tm); }\n__CRT_INLINE time_t __cdecl _mkgmtime(struct tm *_Tm) { return _mkgmtime64(_Tm); }\n__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }\n#endif\n#endif\n\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n#define CLK_TCK CLOCKS_PER_SEC\n\n  __MINGW_IMPORT int daylight;\n  __MINGW_IMPORT long dstbias;\n  __MINGW_IMPORT long timezone;\n  __MINGW_IMPORT char *tzname[2];\n  void __cdecl tzset(void);\n#endif\n\n#ifndef _TIMEVAL_DEFINED /* also in winsock[2].h */\n#define _TIMEVAL_DEFINED\nstruct timeval {\n  long tv_sec;\n  long tv_usec;\n};\n#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)\n#define timercmp(tvp,uvp,cmp) ((tvp)->tv_sec cmp (uvp)->tv_sec || (tvp)->tv_sec==(uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)\n#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0\n#endif /* _TIMEVAL_DEFINED */\n\n#ifndef __STRICT_ANSI__\n#ifndef _TIMEZONE_DEFINED /* also in sys/time.h */\n#define _TIMEZONE_DEFINED\nstruct timezone {\n  int tz_minuteswest;\n  int tz_dsttime;\n};\n\n  extern int __cdecl mingw_gettimeofday (struct timeval *p, struct timezone *z);\n#endif\n#endif /* __STRICT_ANSI__ */\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n\n#include <sec_api/time_s.h>\n\n/* Adding timespec definition.  */\n#include <sys/timeb.h>\n\n#endif /* End _TIME_H_ */\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/vadefs.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_VADEFS\n#define _INC_VADEFS\n\n//!__TINYC__: GNUC specific stuff removed\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/values.h",
    "content": "/*\n * TODO: Nothing here yet. Should provide UNIX compatibility constants\n * comparible to those in limits.h and float.h.\n */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/wchar.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_WCHAR\n#define _INC_WCHAR\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define WCHAR_MIN 0\n#define WCHAR_MAX ((wchar_t) -1) /* UINT16_MAX */\n\n#ifndef __GNUC_VA_LIST\n#define __GNUC_VA_LIST\n  typedef __builtin_va_list __gnuc_va_list;\n#endif\n\n#ifndef _VA_LIST_DEFINED\n#define _VA_LIST_DEFINED\n  typedef __gnuc_va_list va_list;\n#endif\n\n#ifndef WEOF\n#define WEOF (wint_t)(0xFFFF)\n#endif\n\n#ifndef _FILE_DEFINED\n  struct _iobuf {\n    char *_ptr;\n    int _cnt;\n    char *_base;\n    int _flag;\n    int _file;\n    int _charbuf;\n    int _bufsiz;\n    char *_tmpfname;\n  };\n  typedef struct _iobuf FILE;\n#define _FILE_DEFINED\n#endif\n\n#ifndef _STDIO_DEFINED\n#ifdef _WIN64\n  _CRTIMP FILE *__cdecl __iob_func(void);\n#else\n#ifdef _MSVCRT_\nextern FILE _iob[];\t/* A pointer to an array of FILE */\n#define __iob_func()\t(_iob)\n#else\nextern FILE (*_imp___iob)[];\t/* A pointer to an array of FILE */\n#define __iob_func()\t(*_imp___iob)\n#define _iob __iob_func()\n#endif\n#endif\n\n#define _iob __iob_func()\n#endif\n\n#ifndef _STDSTREAM_DEFINED\n#define stdin (&__iob_func()[0])\n#define stdout (&__iob_func()[1])\n#define stderr (&__iob_func()[2])\n#define _STDSTREAM_DEFINED\n#endif\n\n#ifndef _FSIZE_T_DEFINED\n  typedef unsigned long _fsize_t;\n#define _FSIZE_T_DEFINED\n#endif\n\n#ifndef _WFINDDATA_T_DEFINED\n  struct _wfinddata32_t {\n    unsigned attrib;\n    __time32_t time_create;\n    __time32_t time_access;\n    __time32_t time_write;\n    _fsize_t size;\n    wchar_t name[260];\n  };\n\n/* #if _INTEGRAL_MAX_BITS >= 64 */\n\n  struct _wfinddata32i64_t {\n    unsigned attrib;\n    __time32_t time_create;\n    __time32_t time_access;\n    __time32_t time_write;\n    __int64 size;\n    wchar_t name[260];\n  };\n\n  struct _wfinddata64i32_t {\n    unsigned attrib;\n    __time64_t time_create;\n    __time64_t time_access;\n    __time64_t time_write;\n    _fsize_t size;\n    wchar_t name[260];\n  };\n\n  struct _wfinddata64_t {\n    unsigned attrib;\n    __time64_t time_create;\n    __time64_t time_access;\n    __time64_t time_write;\n    __int64 size;\n    wchar_t name[260];\n  };\n/* #endif */\n\n#ifdef _USE_32BIT_TIME_T\n#define _wfinddata_t _wfinddata32_t\n#define _wfinddatai64_t _wfinddata32i64_t\n\n#define _wfindfirst _wfindfirst32\n#define _wfindnext _wfindnext32\n#define _wfindfirsti64 _wfindfirst32i64\n#define _wfindnexti64 _wfindnext32i64\n#else\n#define _wfinddata_t _wfinddata64i32_t\n#define _wfinddatai64_t _wfinddata64_t\n\n#define _wfindfirst _wfindfirst64i32\n#define _wfindnext _wfindnext64i32\n#define _wfindfirsti64 _wfindfirst64\n#define _wfindnexti64 _wfindnext64\n#endif\n\n#define _WFINDDATA_T_DEFINED\n#endif\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#ifndef _CONST_RETURN\n#define _CONST_RETURN\n#endif\n\n#define _WConst_return _CONST_RETURN\n\n#ifndef _CRT_CTYPEDATA_DEFINED\n#define _CRT_CTYPEDATA_DEFINED\n#ifndef _CTYPE_DISABLE_MACROS\n\n#ifndef __PCTYPE_FUNC\n#define __PCTYPE_FUNC __pctype_func()\n#ifdef _MSVCRT_\n#define __pctype_func() (_pctype)\n#else\n#define __pctype_func() (*_imp___pctype)\n#endif\n#endif\n\n#ifndef _pctype\n#ifdef _MSVCRT_\n  extern unsigned short *_pctype;\n#else\n  extern unsigned short **_imp___pctype;\n#define _pctype (*_imp___pctype)\n#endif\n#endif\n#endif\n#endif\n\n#ifndef _CRT_WCTYPEDATA_DEFINED\n#define _CRT_WCTYPEDATA_DEFINED\n#ifndef _CTYPE_DISABLE_MACROS\n#ifndef _wctype\n#ifdef _MSVCRT_\n  extern unsigned short *_wctype;\n#else\n  extern unsigned short **_imp___wctype;\n#define _wctype (*_imp___wctype)\n#endif\n#endif\n\n#ifdef _MSVCRT_\n#define __pwctype_func() (_pwctype)\n#else\n#define __pwctype_func() (*_imp___pwctype)\n#endif\n\n#ifndef _pwctype\n#ifdef _MSVCRT_\n  extern unsigned short *_pwctype;\n#else\n  extern unsigned short **_imp___pwctype;\n#define _pwctype (*_imp___pwctype)\n#endif\n#endif\n\n#endif\n#endif\n\n#define _UPPER 0x1\n#define _LOWER 0x2\n#define _DIGIT 0x4\n#define _SPACE 0x8\n\n#define _PUNCT 0x10\n#define _CONTROL 0x20\n#define _BLANK 0x40\n#define _HEX 0x80\n\n#define _LEADBYTE 0x8000\n#define _ALPHA (0x0100|_UPPER|_LOWER)\n\n#ifndef _WCTYPE_DEFINED\n#define _WCTYPE_DEFINED\n\n  int __cdecl iswalpha(wint_t _C);\n  _CRTIMP int __cdecl _iswalpha_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswupper(wint_t _C);\n  _CRTIMP int __cdecl _iswupper_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswlower(wint_t _C);\n  _CRTIMP int __cdecl _iswlower_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswdigit(wint_t _C);\n  _CRTIMP int __cdecl _iswdigit_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswxdigit(wint_t _C);\n  _CRTIMP int __cdecl _iswxdigit_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswspace(wint_t _C);\n  _CRTIMP int __cdecl _iswspace_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswpunct(wint_t _C);\n  _CRTIMP int __cdecl _iswpunct_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswalnum(wint_t _C);\n  _CRTIMP int __cdecl _iswalnum_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswprint(wint_t _C);\n  _CRTIMP int __cdecl _iswprint_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswgraph(wint_t _C);\n  _CRTIMP int __cdecl _iswgraph_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswcntrl(wint_t _C);\n  _CRTIMP int __cdecl _iswcntrl_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswascii(wint_t _C);\n  int __cdecl isleadbyte(int _C);\n  _CRTIMP int __cdecl _isleadbyte_l(int _C,_locale_t _Locale);\n  wint_t __cdecl towupper(wint_t _C);\n  _CRTIMP wint_t __cdecl _towupper_l(wint_t _C,_locale_t _Locale);\n  wint_t __cdecl towlower(wint_t _C);\n  _CRTIMP wint_t __cdecl _towlower_l(wint_t _C,_locale_t _Locale);\n  int __cdecl iswctype(wint_t _C,wctype_t _Type);\n  _CRTIMP int __cdecl _iswctype_l(wint_t _C,wctype_t _Type,_locale_t _Locale);\n  _CRTIMP int __cdecl __iswcsymf(wint_t _C);\n  _CRTIMP int __cdecl _iswcsymf_l(wint_t _C,_locale_t _Locale);\n  _CRTIMP int __cdecl __iswcsym(wint_t _C);\n  _CRTIMP int __cdecl _iswcsym_l(wint_t _C,_locale_t _Locale);\n  int __cdecl is_wctype(wint_t _C,wctype_t _Type);\n#endif\n\n#ifndef _WDIRECT_DEFINED\n#define _WDIRECT_DEFINED\n\n  _CRTIMP wchar_t *__cdecl _wgetcwd(wchar_t *_DstBuf,int _SizeInWords);\n  _CRTIMP wchar_t *__cdecl _wgetdcwd(int _Drive,wchar_t *_DstBuf,int _SizeInWords);\n  wchar_t *__cdecl _wgetdcwd_nolock(int _Drive,wchar_t *_DstBuf,int _SizeInWords);\n  _CRTIMP int __cdecl _wchdir(const wchar_t *_Path);\n  _CRTIMP int __cdecl _wmkdir(const wchar_t *_Path);\n  _CRTIMP int __cdecl _wrmdir(const wchar_t *_Path);\n#endif\n\n#ifndef _WIO_DEFINED\n#define _WIO_DEFINED\n\n  _CRTIMP int __cdecl _waccess(const wchar_t *_Filename,int _AccessMode);\n  _CRTIMP int __cdecl _wchmod(const wchar_t *_Filename,int _Mode);\n  _CRTIMP int __cdecl _wcreat(const wchar_t *_Filename,int _PermissionMode);\n  _CRTIMP intptr_t __cdecl _wfindfirst32(const wchar_t *_Filename,struct _wfinddata32_t *_FindData);\n  _CRTIMP int __cdecl _wfindnext32(intptr_t _FindHandle,struct _wfinddata32_t *_FindData);\n  _CRTIMP int __cdecl _wunlink(const wchar_t *_Filename);\n  _CRTIMP int __cdecl _wrename(const wchar_t *_NewFilename,const wchar_t *_OldFilename);\n  _CRTIMP wchar_t *__cdecl _wmktemp(wchar_t *_TemplateName);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP intptr_t __cdecl _wfindfirst32i64(const wchar_t *_Filename,struct _wfinddata32i64_t *_FindData);\n  intptr_t __cdecl _wfindfirst64i32(const wchar_t *_Filename,struct _wfinddata64i32_t *_FindData);\n  _CRTIMP intptr_t __cdecl _wfindfirst64(const wchar_t *_Filename,struct _wfinddata64_t *_FindData);\n  _CRTIMP int __cdecl _wfindnext32i64(intptr_t _FindHandle,struct _wfinddata32i64_t *_FindData);\n  int __cdecl _wfindnext64i32(intptr_t _FindHandle,struct _wfinddata64i32_t *_FindData);\n  _CRTIMP int __cdecl _wfindnext64(intptr_t _FindHandle,struct _wfinddata64_t *_FindData);\n#endif\n  _CRTIMP errno_t __cdecl _wsopen_s(int *_FileHandle,const wchar_t *_Filename,int _OpenFlag,int _ShareFlag,int _PermissionFlag);\n#if !defined(__cplusplus) || !(defined(_X86_) && !defined(__x86_64))\n  _CRTIMP int __cdecl _wopen(const wchar_t *_Filename,int _OpenFlag,...);\n  _CRTIMP int __cdecl _wsopen(const wchar_t *_Filename,int _OpenFlag,int _ShareFlag,...);\n#else\n  extern \"C++\" _CRTIMP int __cdecl _wopen(const wchar_t *_Filename,int _OpenFlag,int _PermissionMode = 0);\n  extern \"C++\" _CRTIMP int __cdecl _wsopen(const wchar_t *_Filename,int _OpenFlag,int _ShareFlag,int _PermissionMode = 0);\n#endif\n#endif\n\n#ifndef _WLOCALE_DEFINED\n#define _WLOCALE_DEFINED\n  _CRTIMP wchar_t *__cdecl _wsetlocale(int _Category,const wchar_t *_Locale);\n#endif\n\n#ifndef _WPROCESS_DEFINED\n#define _WPROCESS_DEFINED\n\n  _CRTIMP intptr_t __cdecl _wexecl(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexecle(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexeclp(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexeclpe(const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wexecv(const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wexecve(const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n  _CRTIMP intptr_t __cdecl _wexecvp(const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wexecvpe(const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n  _CRTIMP intptr_t __cdecl _wspawnl(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnle(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnlp(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnlpe(int _Mode,const wchar_t *_Filename,const wchar_t *_ArgList,...);\n  _CRTIMP intptr_t __cdecl _wspawnv(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wspawnve(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n  _CRTIMP intptr_t __cdecl _wspawnvp(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList);\n  _CRTIMP intptr_t __cdecl _wspawnvpe(int _Mode,const wchar_t *_Filename,const wchar_t *const *_ArgList,const wchar_t *const *_Env);\n#ifndef _CRT_WSYSTEM_DEFINED\n#define _CRT_WSYSTEM_DEFINED\n  _CRTIMP int __cdecl _wsystem(const wchar_t *_Command);\n#endif\n#endif\n\n#ifndef _WCTYPE_INLINE_DEFINED\n#undef _CRT_WCTYPE_NOINLINE\n#if !defined(__cplusplus) || defined(_CRT_WCTYPE_NOINLINE)\n#define iswalpha(_c) (iswctype(_c,_ALPHA))\n#define iswupper(_c) (iswctype(_c,_UPPER))\n#define iswlower(_c) (iswctype(_c,_LOWER))\n#define iswdigit(_c) (iswctype(_c,_DIGIT))\n#define iswxdigit(_c) (iswctype(_c,_HEX))\n#define iswspace(_c) (iswctype(_c,_SPACE))\n#define iswpunct(_c) (iswctype(_c,_PUNCT))\n#define iswalnum(_c) (iswctype(_c,_ALPHA|_DIGIT))\n#define iswprint(_c) (iswctype(_c,_BLANK|_PUNCT|_ALPHA|_DIGIT))\n#define iswgraph(_c) (iswctype(_c,_PUNCT|_ALPHA|_DIGIT))\n#define iswcntrl(_c) (iswctype(_c,_CONTROL))\n#define iswascii(_c) ((unsigned)(_c) < 0x80)\n\n#define _iswalpha_l(_c,_p) (_iswctype_l(_c,_ALPHA,_p))\n#define _iswupper_l(_c,_p) (_iswctype_l(_c,_UPPER,_p))\n#define _iswlower_l(_c,_p) (_iswctype_l(_c,_LOWER,_p))\n#define _iswdigit_l(_c,_p) (_iswctype_l(_c,_DIGIT,_p))\n#define _iswxdigit_l(_c,_p) (_iswctype_l(_c,_HEX,_p))\n#define _iswspace_l(_c,_p) (_iswctype_l(_c,_SPACE,_p))\n#define _iswpunct_l(_c,_p) (_iswctype_l(_c,_PUNCT,_p))\n#define _iswalnum_l(_c,_p) (_iswctype_l(_c,_ALPHA|_DIGIT,_p))\n#define _iswprint_l(_c,_p) (_iswctype_l(_c,_BLANK|_PUNCT|_ALPHA|_DIGIT,_p))\n#define _iswgraph_l(_c,_p) (_iswctype_l(_c,_PUNCT|_ALPHA|_DIGIT,_p))\n#define _iswcntrl_l(_c,_p) (_iswctype_l(_c,_CONTROL,_p))\n#ifndef _CTYPE_DISABLE_MACROS\n#define isleadbyte(_c) (__PCTYPE_FUNC[(unsigned char)(_c)] & _LEADBYTE)\n#endif\n#endif\n#define _WCTYPE_INLINE_DEFINED\n#endif\n\n#if !defined(_POSIX_) || defined(__GNUC__)\n#ifndef _INO_T_DEFINED\n#define _INO_T_DEFINED\n  typedef unsigned short _ino_t;\n#ifndef\tNO_OLDNAMES\n  typedef unsigned short ino_t;\n#endif\n#endif\n\n#ifndef _DEV_T_DEFINED\n#define _DEV_T_DEFINED\n  typedef unsigned int _dev_t;\n#ifndef\tNO_OLDNAMES\n  typedef unsigned int dev_t;\n#endif\n#endif\n\n#ifndef _OFF_T_DEFINED\n#define _OFF_T_DEFINED\n#ifndef _OFF_T_\n#define _OFF_T_\n  typedef long _off_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long off_t;\n#endif\n#endif\n#endif\n\n#ifndef _OFF64_T_DEFINED\n#define _OFF64_T_DEFINED\n  typedef long long _off64_t;\n#if !defined(NO_OLDNAMES) || defined(_POSIX)\n  typedef long long off64_t;\n#endif\n#endif\n\n#ifndef _STAT_DEFINED\n#define _STAT_DEFINED\n\n#ifdef _USE_32BIT_TIME_T\n#ifdef WIN64\n#define _fstat _fstat32\n#define _stat _stat32\n#define _wstat _wstat32\n#else\n#define _fstat32 _fstat\n#define _stat32 _stat\n#define _wstat32 _wstat\n#endif\n#define _fstati64 _fstat32i64\n#define _stati64 _stat32i64\n#define _wstati64 _wstat32i64\n#else\n#define _fstat _fstat64i32\n#define _fstati64 _fstat64\n#define _stat _stat64i32\n#define _stati64 _stat64\n#define _wstat _wstat64i32\n#define _wstati64 _wstat64\n#endif\n\n  struct _stat32 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    _off_t st_size;\n    __time32_t st_atime;\n    __time32_t st_mtime;\n    __time32_t st_ctime;\n  };\n\n#ifndef\tNO_OLDNAMES\n  struct stat {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    _off_t st_size;\n    time_t st_atime;\n    time_t st_mtime;\n    time_t st_ctime;\n  };\n#endif\n\n#if _INTEGRAL_MAX_BITS >= 64\n\n  struct _stat32i64 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    __int64 st_size;\n    __time32_t st_atime;\n    __time32_t st_mtime;\n    __time32_t st_ctime;\n  };\n\n  struct _stat64i32 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    _off_t st_size;\n    __time64_t st_atime;\n    __time64_t st_mtime;\n    __time64_t st_ctime;\n  };\n\n  struct _stat64 {\n    _dev_t st_dev;\n    _ino_t st_ino;\n    unsigned short st_mode;\n    short st_nlink;\n    short st_uid;\n    short st_gid;\n    _dev_t st_rdev;\n    __int64 st_size;\n    __time64_t st_atime;\n    __time64_t st_mtime;\n    __time64_t st_ctime;\n  };\n#endif\n\n#define __stat64 _stat64\n\n#endif\n\n#ifndef _WSTAT_DEFINED\n#define _WSTAT_DEFINED\n\n  _CRTIMP int __cdecl _wstat32(const wchar_t *_Name,struct _stat32 *_Stat);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP int __cdecl _wstat32i64(const wchar_t *_Name,struct _stat32i64 *_Stat);\n  int __cdecl _wstat64i32(const wchar_t *_Name,struct _stat64i32 *_Stat);\n  _CRTIMP int __cdecl _wstat64(const wchar_t *_Name,struct _stat64 *_Stat);\n#endif\n#endif\n#endif\n\n#ifndef _WCONIO_DEFINED\n#define _WCONIO_DEFINED\n\n#ifndef WEOF\n#define WEOF (wint_t)(0xFFFF)\n#endif\n\n  _CRTIMP wchar_t *_cgetws(wchar_t *_Buffer);\n  _CRTIMP wint_t __cdecl _getwch(void);\n  _CRTIMP wint_t __cdecl _getwche(void);\n  _CRTIMP wint_t __cdecl _putwch(wchar_t _WCh);\n  _CRTIMP wint_t __cdecl _ungetwch(wint_t _WCh);\n  _CRTIMP int __cdecl _cputws(const wchar_t *_String);\n  _CRTIMP int __cdecl _cwprintf(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _cwscanf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _cwprintf_p(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vcwprintf_p(const wchar_t *_Format,va_list _ArgList);\n\n  _CRTIMP int __cdecl _cwprintf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _cwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vcwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  wint_t __cdecl _putwch_nolock(wchar_t _WCh);\n  wint_t __cdecl _getwch_nolock(void);\n  wint_t __cdecl _getwche_nolock(void);\n  wint_t __cdecl _ungetwch_nolock(wint_t _WCh);\n#endif\n\n#ifndef _WSTDIO_DEFINED\n#define _WSTDIO_DEFINED\n\n#ifndef WEOF\n#define WEOF (wint_t)(0xFFFF)\n#endif\n\n#ifdef _POSIX_\n  _CRTIMP FILE *__cdecl _wfsopen(const wchar_t *_Filename,const wchar_t *_Mode);\n#else\n  _CRTIMP FILE *__cdecl _wfsopen(const wchar_t *_Filename,const wchar_t *_Mode,int _ShFlag);\n#endif\n\n  wint_t __cdecl fgetwc(FILE *_File);\n  _CRTIMP wint_t __cdecl _fgetwchar(void);\n  wint_t __cdecl fputwc(wchar_t _Ch,FILE *_File);\n  _CRTIMP wint_t __cdecl _fputwchar(wchar_t _Ch);\n  wint_t __cdecl getwc(FILE *_File);\n  wint_t __cdecl getwchar(void);\n  wint_t __cdecl putwc(wchar_t _Ch,FILE *_File);\n  wint_t __cdecl putwchar(wchar_t _Ch);\n  wint_t __cdecl ungetwc(wint_t _Ch,FILE *_File);\n  wchar_t *__cdecl fgetws(wchar_t *_Dst,int _SizeInWords,FILE *_File);\n  int __cdecl fputws(const wchar_t *_Str,FILE *_File);\n  _CRTIMP wchar_t *__cdecl _getws(wchar_t *_String);\n  _CRTIMP int __cdecl _putws(const wchar_t *_Str);\n  int __cdecl fwprintf(FILE *_File,const wchar_t *_Format,...);\n  int __cdecl wprintf(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _scwprintf(const wchar_t *_Format,...);\n  int __cdecl vfwprintf(FILE *_File,const wchar_t *_Format,va_list _ArgList);\n  int __cdecl vwprintf(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl swprintf(wchar_t*, const wchar_t*, ...);\n  _CRTIMP int __cdecl vswprintf(wchar_t*, const wchar_t*,va_list);\n  _CRTIMP int __cdecl _swprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vswprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf(wchar_t *_Dest,size_t _Count,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vsnwprintf(wchar_t *_Dest,size_t _Count,const wchar_t *_Format,va_list _Args);\n#ifndef __NO_ISOCEXT  /* externs in libmingwex.a */\n  int __cdecl snwprintf (wchar_t *s, size_t n, const wchar_t * format, ...);\n  __CRT_INLINE int __cdecl vsnwprintf (wchar_t *s, size_t n, const wchar_t *format, va_list arg) { return _vsnwprintf(s,n,format,arg); }\n  int __cdecl vwscanf (const wchar_t *, va_list);\n  int __cdecl vfwscanf (FILE *,const wchar_t *,va_list);\n  int __cdecl vswscanf (const wchar_t *,const wchar_t *,va_list);\n#endif\n  _CRTIMP int __cdecl _fwprintf_p(FILE *_File,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _wprintf_p(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vfwprintf_p(FILE *_File,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _vwprintf_p(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _swprintf_p(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vswprintf_p(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _scwprintf_p(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vscwprintf_p(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _wprintf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _wprintf_p_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vwprintf_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _fwprintf_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _fwprintf_p_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vfwprintf_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vfwprintf_p_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _swprintf_c_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _swprintf_p_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vswprintf_c_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _vswprintf_p_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _scwprintf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _scwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vscwprintf_p_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _snwprintf_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _vsnwprintf_l(wchar_t *_DstBuf,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  _CRTIMP int __cdecl _swprintf(wchar_t *_Dest,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _vswprintf(wchar_t *_Dest,const wchar_t *_Format,va_list _Args);\n  _CRTIMP int __cdecl __swprintf_l(wchar_t *_Dest,const wchar_t *_Format,_locale_t _Plocinfo,...);\n  _CRTIMP int __cdecl __vswprintf_l(wchar_t *_Dest,const wchar_t *_Format,_locale_t _Plocinfo,va_list _Args);\n#ifndef RC_INVOKED\n#include <vadefs.h>\n#endif\n\n#ifdef _CRT_NON_CONFORMING_SWPRINTFS\n#ifndef __cplusplus\n#define swprintf _swprintf\n#define vswprintf _vswprintf\n#define _swprintf_l __swprintf_l\n#define _vswprintf_l __vswprintf_l\n#endif\n#endif\n\n  _CRTIMP wchar_t *__cdecl _wtempnam(const wchar_t *_Directory,const wchar_t *_FilePrefix);\n  _CRTIMP int __cdecl _vscwprintf(const wchar_t *_Format,va_list _ArgList);\n  _CRTIMP int __cdecl _vscwprintf_l(const wchar_t *_Format,_locale_t _Locale,va_list _ArgList);\n  int __cdecl fwscanf(FILE *_File,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _fwscanf_l(FILE *_File,const wchar_t *_Format,_locale_t _Locale,...);\n  int __cdecl swscanf(const wchar_t *_Src,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _swscanf_l(const wchar_t *_Src,const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP int __cdecl _snwscanf(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _snwscanf_l(const wchar_t *_Src,size_t _MaxCount,const wchar_t *_Format,_locale_t _Locale,...);\n  int __cdecl wscanf(const wchar_t *_Format,...);\n  _CRTIMP int __cdecl _wscanf_l(const wchar_t *_Format,_locale_t _Locale,...);\n  _CRTIMP FILE *__cdecl _wfdopen(int _FileHandle ,const wchar_t *_Mode);\n  _CRTIMP FILE *__cdecl _wfopen(const wchar_t *_Filename,const wchar_t *_Mode);\n  _CRTIMP FILE *__cdecl _wfreopen(const wchar_t *_Filename,const wchar_t *_Mode,FILE *_OldFile);\n\n#ifndef _CRT_WPERROR_DEFINED\n#define _CRT_WPERROR_DEFINED\n  _CRTIMP void __cdecl _wperror(const wchar_t *_ErrMsg);\n#endif\n  _CRTIMP FILE *__cdecl _wpopen(const wchar_t *_Command,const wchar_t *_Mode);\n#if !defined(NO_OLDNAMES) && !defined(wpopen)\n#define wpopen\t_wpopen\n#endif\n  _CRTIMP int __cdecl _wremove(const wchar_t *_Filename);\n  _CRTIMP wchar_t *__cdecl _wtmpnam(wchar_t *_Buffer);\n  _CRTIMP wint_t __cdecl _fgetwc_nolock(FILE *_File);\n  _CRTIMP wint_t __cdecl _fputwc_nolock(wchar_t _Ch,FILE *_File);\n  _CRTIMP wint_t __cdecl _ungetwc_nolock(wint_t _Ch,FILE *_File);\n\n#undef _CRT_GETPUTWCHAR_NOINLINE\n\n#if !defined(__cplusplus) || defined(_CRT_GETPUTWCHAR_NOINLINE)\n#define getwchar() fgetwc(stdin)\n#define putwchar(_c) fputwc((_c),stdout)\n#else\n  __CRT_INLINE wint_t __cdecl getwchar() {return (fgetwc(stdin)); }\n  __CRT_INLINE wint_t __cdecl putwchar(wchar_t _C) {return (fputwc(_C,stdout)); }\n#endif\n\n#define getwc(_stm) fgetwc(_stm)\n#define putwc(_c,_stm) fputwc(_c,_stm)\n#define _putwc_nolock(_c,_stm) _fputwc_nolock(_c,_stm)\n#define _getwc_nolock(_c) _fgetwc_nolock(_c)\n#endif\n\n#ifndef _WSTDLIB_DEFINED\n#define _WSTDLIB_DEFINED\n\n  _CRTIMP wchar_t *__cdecl _itow(int _Value,wchar_t *_Dest,int _Radix);\n  _CRTIMP wchar_t *__cdecl _ltow(long _Value,wchar_t *_Dest,int _Radix);\n  _CRTIMP wchar_t *__cdecl _ultow(unsigned long _Value,wchar_t *_Dest,int _Radix);\n  double __cdecl wcstod(const wchar_t *_Str,wchar_t **_EndPtr);\n  _CRTIMP double __cdecl _wcstod_l(const wchar_t *_Str,wchar_t **_EndPtr,_locale_t _Locale);\n  float __cdecl wcstof( const wchar_t *nptr, wchar_t **endptr);\n#if !defined __NO_ISOCEXT /* in libmingwex.a */\n  float __cdecl wcstof (const wchar_t * __restrict__, wchar_t ** __restrict__);\n  long double __cdecl wcstold (const wchar_t * __restrict__, wchar_t ** __restrict__);\n#endif /* __NO_ISOCEXT */\n  long __cdecl wcstol(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP long __cdecl _wcstol_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n  unsigned long __cdecl wcstoul(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP unsigned long __cdecl _wcstoul_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wgetenv(const wchar_t *_VarName);\n#ifndef _CRT_WSYSTEM_DEFINED\n#define _CRT_WSYSTEM_DEFINED\n  _CRTIMP int __cdecl _wsystem(const wchar_t *_Command);\n#endif\n  _CRTIMP double __cdecl _wtof(const wchar_t *_Str);\n  _CRTIMP double __cdecl _wtof_l(const wchar_t *_Str,_locale_t _Locale);\n  _CRTIMP int __cdecl _wtoi(const wchar_t *_Str);\n  _CRTIMP int __cdecl _wtoi_l(const wchar_t *_Str,_locale_t _Locale);\n  _CRTIMP long __cdecl _wtol(const wchar_t *_Str);\n  _CRTIMP long __cdecl _wtol_l(const wchar_t *_Str,_locale_t _Locale);\n\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix);\n  _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix);\n  _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str);\n  _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale);\n  _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n  _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);\n  _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);\n#endif\n#endif\n\n#ifndef _POSIX_\n#ifndef _WSTDLIBP_DEFINED\n#define _WSTDLIBP_DEFINED\n  _CRTIMP wchar_t *__cdecl _wfullpath(wchar_t *_FullPath,const wchar_t *_Path,size_t _SizeInWords);\n  _CRTIMP void __cdecl _wmakepath(wchar_t *_ResultPath,const wchar_t *_Drive,const wchar_t *_Dir,const wchar_t *_Filename,const wchar_t *_Ext);\n#ifndef _CRT_WPERROR_DEFINED\n#define _CRT_WPERROR_DEFINED\n  _CRTIMP void __cdecl _wperror(const wchar_t *_ErrMsg);\n#endif\n  _CRTIMP int __cdecl _wputenv(const wchar_t *_EnvString);\n  _CRTIMP void __cdecl _wsearchenv(const wchar_t *_Filename,const wchar_t *_EnvVar,wchar_t *_ResultPath);\n  _CRTIMP void __cdecl _wsplitpath(const wchar_t *_FullPath,wchar_t *_Drive,wchar_t *_Dir,wchar_t *_Filename,wchar_t *_Ext);\n#endif\n#endif\n\n#ifndef _WSTRING_DEFINED\n#define _WSTRING_DEFINED\n  _CRTIMP wchar_t *__cdecl _wcsdup(const wchar_t *_Str);\n  wchar_t *__cdecl wcscat(wchar_t *_Dest,const wchar_t *_Source);\n  _CONST_RETURN wchar_t *__cdecl wcschr(const wchar_t *_Str,wchar_t _Ch);\n  int __cdecl wcscmp(const wchar_t *_Str1,const wchar_t *_Str2);\n  wchar_t *__cdecl wcscpy(wchar_t *_Dest,const wchar_t *_Source);\n  size_t __cdecl wcscspn(const wchar_t *_Str,const wchar_t *_Control);\n  size_t __cdecl wcslen(const wchar_t *_Str);\n  size_t __cdecl wcsnlen(const wchar_t *_Src,size_t _MaxCount);\n  wchar_t *__cdecl wcsncat(wchar_t *_Dest,const wchar_t *_Source,size_t _Count);\n  int __cdecl wcsncmp(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  wchar_t *__cdecl wcsncpy(wchar_t *_Dest,const wchar_t *_Source,size_t _Count);\n  _CONST_RETURN wchar_t *__cdecl wcspbrk(const wchar_t *_Str,const wchar_t *_Control);\n  _CONST_RETURN wchar_t *__cdecl wcsrchr(const wchar_t *_Str,wchar_t _Ch);\n  size_t __cdecl wcsspn(const wchar_t *_Str,const wchar_t *_Control);\n  _CONST_RETURN wchar_t *__cdecl wcsstr(const wchar_t *_Str,const wchar_t *_SubStr);\n  wchar_t *__cdecl wcstok(wchar_t *_Str,const wchar_t *_Delim);\n  _CRTIMP wchar_t *__cdecl _wcserror(int _ErrNum);\n  _CRTIMP wchar_t *__cdecl __wcserror(const wchar_t *_Str);\n  _CRTIMP int __cdecl _wcsicmp(const wchar_t *_Str1,const wchar_t *_Str2);\n  _CRTIMP int __cdecl _wcsicmp_l(const wchar_t *_Str1,const wchar_t *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsnicmp(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _wcsnicmp_l(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wcsnset(wchar_t *_Str,wchar_t _Val,size_t _MaxCount);\n  _CRTIMP wchar_t *__cdecl _wcsrev(wchar_t *_Str);\n  _CRTIMP wchar_t *__cdecl _wcsset(wchar_t *_Str,wchar_t _Val);\n  _CRTIMP wchar_t *__cdecl _wcslwr(wchar_t *_String);\n  _CRTIMP wchar_t *_wcslwr_l(wchar_t *_String,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wcsupr(wchar_t *_String);\n  _CRTIMP wchar_t *_wcsupr_l(wchar_t *_String,_locale_t _Locale);\n  size_t __cdecl wcsxfrm(wchar_t *_Dst,const wchar_t *_Src,size_t _MaxCount);\n  _CRTIMP size_t __cdecl _wcsxfrm_l(wchar_t *_Dst,const wchar_t *_Src,size_t _MaxCount,_locale_t _Locale);\n  int __cdecl wcscoll(const wchar_t *_Str1,const wchar_t *_Str2);\n  _CRTIMP int __cdecl _wcscoll_l(const wchar_t *_Str1,const wchar_t *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsicoll(const wchar_t *_Str1,const wchar_t *_Str2);\n  _CRTIMP int __cdecl _wcsicoll_l(const wchar_t *_Str1,const wchar_t *_Str2,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsncoll(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _wcsncoll_l(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount,_locale_t _Locale);\n  _CRTIMP int __cdecl _wcsnicoll(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  _CRTIMP int __cdecl _wcsnicoll_l(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount,_locale_t _Locale);\n\n#ifndef\tNO_OLDNAMES\n  wchar_t *__cdecl wcsdup(const wchar_t *_Str);\n#define wcswcs wcsstr\n  int __cdecl wcsicmp(const wchar_t *_Str1,const wchar_t *_Str2);\n  int __cdecl wcsnicmp(const wchar_t *_Str1,const wchar_t *_Str2,size_t _MaxCount);\n  wchar_t *__cdecl wcsnset(wchar_t *_Str,wchar_t _Val,size_t _MaxCount);\n  wchar_t *__cdecl wcsrev(wchar_t *_Str);\n  wchar_t *__cdecl wcsset(wchar_t *_Str,wchar_t _Val);\n  wchar_t *__cdecl wcslwr(wchar_t *_Str);\n  wchar_t *__cdecl wcsupr(wchar_t *_Str);\n  int __cdecl wcsicoll(const wchar_t *_Str1,const wchar_t *_Str2);\n#endif\n#endif\n\n#ifndef _TM_DEFINED\n#define _TM_DEFINED\n  struct tm {\n    int tm_sec;\n    int tm_min;\n    int tm_hour;\n    int tm_mday;\n    int tm_mon;\n    int tm_year;\n    int tm_wday;\n    int tm_yday;\n    int tm_isdst;\n  };\n#endif\n\n#ifndef _WTIME_DEFINED\n#define _WTIME_DEFINED\n\n  _CRTIMP wchar_t *__cdecl _wasctime(const struct tm *_Tm);\n  _CRTIMP wchar_t *__cdecl _wctime32(const __time32_t *_Time);\n  size_t __cdecl wcsftime(wchar_t *_Buf,size_t _SizeInWords,const wchar_t *_Format,const struct tm *_Tm);\n  _CRTIMP size_t __cdecl _wcsftime_l(wchar_t *_Buf,size_t _SizeInWords,const wchar_t *_Format,const struct tm *_Tm,_locale_t _Locale);\n  _CRTIMP wchar_t *__cdecl _wstrdate(wchar_t *_Buffer);\n  _CRTIMP wchar_t *__cdecl _wstrtime(wchar_t *_Buffer);\n#if _INTEGRAL_MAX_BITS >= 64\n  _CRTIMP wchar_t *__cdecl _wctime64(const __time64_t *_Time);\n#endif\n\n#if !defined (RC_INVOKED) && !defined (_INC_WTIME_INL)\n#define _INC_WTIME_INL\n#ifdef _USE_32BIT_TIME_T\n__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime32(_Time); }\n#else\n__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime64(_Time); }\n#endif\n#endif\n#endif\n\n  typedef int mbstate_t;\n  typedef wchar_t _Wint_t;\n\n  wint_t __cdecl btowc(int);\n  size_t __cdecl mbrlen(const char *_Ch,size_t _SizeInBytes,mbstate_t *_State);\n  size_t __cdecl mbrtowc(wchar_t *_DstCh,const char *_SrcCh,size_t _SizeInBytes,mbstate_t *_State);\n  size_t __cdecl mbsrtowcs(wchar_t *_Dest,const char **_PSrc,size_t _Count,mbstate_t *_State);\n  size_t __cdecl wcrtomb(char *_Dest,wchar_t _Source,mbstate_t *_State);\n  size_t __cdecl wcsrtombs(char *_Dest,const wchar_t **_PSource,size_t _Count,mbstate_t *_State);\n  int __cdecl wctob(wint_t _WCh);\n\n#ifndef __NO_ISOCEXT /* these need static lib libmingwex.a */\n  wchar_t *__cdecl wmemset(wchar_t *s, wchar_t c, size_t n);\n  _CONST_RETURN wchar_t *__cdecl wmemchr(const wchar_t *s, wchar_t c, size_t n);\n  int wmemcmp(const wchar_t *s1, const wchar_t *s2,size_t n);\n  wchar_t *__cdecl wmemcpy(wchar_t *s1,const wchar_t *s2,size_t n);\n  wchar_t *__cdecl wmemmove(wchar_t *s1, const wchar_t *s2, size_t n);\n  long long __cdecl wcstoll(const wchar_t *nptr,wchar_t **endptr, int base);\n  unsigned long long __cdecl wcstoull(const wchar_t *nptr,wchar_t **endptr, int base);\n#endif /* __NO_ISOCEXT */\n\n  void *__cdecl memmove(void *_Dst,const void *_Src,size_t _MaxCount);\n  void *__cdecl memcpy(void *_Dst,const void *_Src,size_t _MaxCount);\n  __CRT_INLINE int __cdecl fwide(FILE *_F,int _M) { (void)_F; return (_M); }\n  __CRT_INLINE int __cdecl mbsinit(const mbstate_t *_P) { return (!_P || *_P==0); }\n  __CRT_INLINE _CONST_RETURN wchar_t *__cdecl wmemchr(const wchar_t *_S,wchar_t _C,size_t _N) { for (;0<_N;++_S,--_N) if (*_S==_C) return (_CONST_RETURN wchar_t *)(_S); return (0); }\n  __CRT_INLINE int __cdecl wmemcmp(const wchar_t *_S1,const wchar_t *_S2,size_t _N) { for (; 0 < _N; ++_S1,++_S2,--_N) if (*_S1!=*_S2) return (*_S1 < *_S2 ? -1 : +1); return (0); }\n  __CRT_INLINE wchar_t *__cdecl wmemcpy(wchar_t *_S1,const wchar_t *_S2,size_t _N) { return (wchar_t *)memcpy(_S1,_S2,_N*sizeof(wchar_t)); }\n  __CRT_INLINE wchar_t *__cdecl wmemmove(wchar_t *_S1,const wchar_t *_S2,size_t _N) { return (wchar_t *)memmove(_S1,_S2,_N*sizeof(wchar_t)); }\n  __CRT_INLINE wchar_t *__cdecl wmemset(wchar_t *_S,wchar_t _C,size_t _N) {\n    wchar_t *_Su = _S;\n    for (;0<_N;++_Su,--_N) {\n      *_Su = _C;\n    }\n    return (_S);\n  }\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n\n#include <sec_api/wchar_s.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/wctype.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _INC_WCTYPE\n#define _INC_WCTYPE\n\n#ifndef _WIN32\n#error Only Win32 target is supported!\n#endif\n\n#include <_mingw.h>\n\n#pragma pack(push,_CRT_PACKING)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _CRTIMP\n#define _CRTIMP __declspec(dllimport)\n#endif\n\n#ifndef _WCHAR_T_DEFINED\n  typedef unsigned short wchar_t;\n#define _WCHAR_T_DEFINED\n#endif\n\n#ifndef _WCTYPE_T_DEFINED\n  typedef unsigned short wint_t;\n  typedef unsigned short wctype_t;\n#define _WCTYPE_T_DEFINED\n#endif\n\n#ifndef WEOF\n#define WEOF (wint_t)(0xFFFF)\n#endif\n\n#ifndef _CRT_CTYPEDATA_DEFINED\n#define _CRT_CTYPEDATA_DEFINED\n#ifndef _CTYPE_DISABLE_MACROS\n\n#ifndef __PCTYPE_FUNC\n#define __PCTYPE_FUNC __pctype_func()\n#ifdef _MSVCRT_\n#define __pctype_func() (_pctype)\n#else\n#define __pctype_func() (*_imp___pctype)\n#endif\n#endif\n\n#ifndef _pctype\n#ifdef _MSVCRT_\n  extern unsigned short *_pctype;\n#else\n  extern unsigned short **_imp___pctype;\n#define _pctype (*_imp___pctype)\n#endif\n#endif\n\n#endif\n#endif\n\n#ifndef _CRT_WCTYPEDATA_DEFINED\n#define _CRT_WCTYPEDATA_DEFINED\n#ifndef _CTYPE_DISABLE_MACROS\n#ifndef _wctype\n#ifdef _MSVCRT_\n  extern unsigned short *_wctype;\n#else\n  extern unsigned short **_imp___wctype;\n#define _wctype (*_imp___wctype)\n#endif\n#endif\n\n#ifndef _pwctype\n#ifdef _MSVCRT_\n  extern unsigned short *_pwctype;\n#else\n  extern unsigned short **_imp___pwctype;\n#define _pwctype (*_imp___pwctype)\n#define __pwctype_func() (*_imp___pwctype)\n#endif\n#endif\n#endif\n#endif\n\n#define _UPPER 0x1\n#define _LOWER 0x2\n#define _DIGIT 0x4\n#define _SPACE 0x8\n\n#define _PUNCT 0x10\n#define _CONTROL 0x20\n#define _BLANK 0x40\n#define _HEX 0x80\n\n#define _LEADBYTE 0x8000\n#define _ALPHA (0x0100|_UPPER|_LOWER)\n\n#ifndef _WCTYPE_DEFINED\n#define _WCTYPE_DEFINED\n\n  int __cdecl iswalpha(wint_t);\n  int __cdecl iswupper(wint_t);\n  int __cdecl iswlower(wint_t);\n  int __cdecl iswdigit(wint_t);\n  int __cdecl iswxdigit(wint_t);\n  int __cdecl iswspace(wint_t);\n  int __cdecl iswpunct(wint_t);\n  int __cdecl iswalnum(wint_t);\n  int __cdecl iswprint(wint_t);\n  int __cdecl iswgraph(wint_t);\n  int __cdecl iswcntrl(wint_t);\n  int __cdecl iswascii(wint_t);\n  int __cdecl isleadbyte(int);\n  wint_t __cdecl towupper(wint_t);\n  wint_t __cdecl towlower(wint_t);\n  int __cdecl iswctype(wint_t,wctype_t);\n  _CRTIMP int __cdecl __iswcsymf(wint_t);\n  _CRTIMP int __cdecl __iswcsym(wint_t);\n  int __cdecl is_wctype(wint_t,wctype_t);\n#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || !defined (NO_OLDNAMES)\nint __cdecl isblank(int _C);\n#endif\n#endif\n\n#ifndef _WCTYPE_INLINE_DEFINED\n#define _WCTYPE_INLINE_DEFINED\n#ifndef __cplusplus\n#define iswalpha(_c) (iswctype(_c,_ALPHA))\n#define iswupper(_c) (iswctype(_c,_UPPER))\n#define iswlower(_c) (iswctype(_c,_LOWER))\n#define iswdigit(_c) (iswctype(_c,_DIGIT))\n#define iswxdigit(_c) (iswctype(_c,_HEX))\n#define iswspace(_c) (iswctype(_c,_SPACE))\n#define iswpunct(_c) (iswctype(_c,_PUNCT))\n#define iswalnum(_c) (iswctype(_c,_ALPHA|_DIGIT))\n#define iswprint(_c) (iswctype(_c,_BLANK|_PUNCT|_ALPHA|_DIGIT))\n#define iswgraph(_c) (iswctype(_c,_PUNCT|_ALPHA|_DIGIT))\n#define iswcntrl(_c) (iswctype(_c,_CONTROL))\n#define iswascii(_c) ((unsigned)(_c) < 0x80)\n#define isleadbyte(c) (__pctype_func()[(unsigned char)(c)] & _LEADBYTE)\n#else\n  __CRT_INLINE int __cdecl iswalpha(wint_t _C) {return (iswctype(_C,_ALPHA)); }\n  __CRT_INLINE int __cdecl iswupper(wint_t _C) {return (iswctype(_C,_UPPER)); }\n  __CRT_INLINE int __cdecl iswlower(wint_t _C) {return (iswctype(_C,_LOWER)); }\n  __CRT_INLINE int __cdecl iswdigit(wint_t _C) {return (iswctype(_C,_DIGIT)); }\n  __CRT_INLINE int __cdecl iswxdigit(wint_t _C) {return (iswctype(_C,_HEX)); }\n  __CRT_INLINE int __cdecl iswspace(wint_t _C) {return (iswctype(_C,_SPACE)); }\n  __CRT_INLINE int __cdecl iswpunct(wint_t _C) {return (iswctype(_C,_PUNCT)); }\n  __CRT_INLINE int __cdecl iswalnum(wint_t _C) {return (iswctype(_C,_ALPHA|_DIGIT)); }\n  __CRT_INLINE int __cdecl iswprint(wint_t _C) {return (iswctype(_C,_BLANK|_PUNCT|_ALPHA|_DIGIT)); }\n  __CRT_INLINE int __cdecl iswgraph(wint_t _C) {return (iswctype(_C,_PUNCT|_ALPHA|_DIGIT)); }\n  __CRT_INLINE int __cdecl iswcntrl(wint_t _C) {return (iswctype(_C,_CONTROL)); }\n  __CRT_INLINE int __cdecl iswascii(wint_t _C) {return ((unsigned)(_C) < 0x80); }\n  __CRT_INLINE int __cdecl isleadbyte(int _C) {return (__pctype_func()[(unsigned char)(_C)] & _LEADBYTE); }\n#endif\n#endif\n\n  typedef wchar_t wctrans_t;\n  wint_t __cdecl towctrans(wint_t,wctrans_t);\n  wctrans_t __cdecl wctrans(const char *);\n  wctype_t __cdecl wctype(const char *);\n\n#ifdef __cplusplus\n}\n#endif\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/basetsd.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _BASETSD_H_\n#define _BASETSD_H_\n\n#if (defined(__x86_64) || defined(__ia64__)) && !defined(RC_INVOKED)\ntypedef unsigned __int64 POINTER_64_INT;\n#else\ntypedef unsigned long POINTER_64_INT;\n#endif\n\n#define POINTER_32\n#define POINTER_64\n#define FIRMWARE_PTR\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  typedef signed char INT8,*PINT8;\n  typedef signed short INT16,*PINT16;\n  typedef signed int INT32,*PINT32;\n  typedef signed __int64 INT64,*PINT64;\n  typedef unsigned char UINT8,*PUINT8;\n  typedef unsigned short UINT16,*PUINT16;\n  typedef unsigned int UINT32,*PUINT32;\n  typedef unsigned __int64 UINT64,*PUINT64;\n  typedef signed int LONG32,*PLONG32;\n  typedef unsigned int ULONG32,*PULONG32;\n  typedef unsigned int DWORD32,*PDWORD32;\n\n#ifndef _W64\n#define _W64\n#endif\n\n#ifdef _WIN64\n  typedef __int64 INT_PTR,*PINT_PTR;\n  typedef unsigned __int64 UINT_PTR,*PUINT_PTR;\n  typedef __int64 LONG_PTR,*PLONG_PTR;\n  typedef unsigned __int64 ULONG_PTR,*PULONG_PTR;\n#define __int3264 __int64\n#else\n  typedef int INT_PTR,*PINT_PTR;\n  typedef unsigned int UINT_PTR,*PUINT_PTR;\n  typedef long LONG_PTR,*PLONG_PTR;\n  typedef unsigned long ULONG_PTR,*PULONG_PTR;\n#define __int3264 __int32\n#endif\n\n#ifdef _WIN64\n#define ADDRESS_TAG_BIT 0x40000000000ULL\n  typedef __int64 SHANDLE_PTR;\n  typedef unsigned __int64 HANDLE_PTR;\n  typedef unsigned int UHALF_PTR,*PUHALF_PTR;\n  typedef int HALF_PTR,*PHALF_PTR;\n\n  static __inline unsigned long HandleToULong(const void *h) { return((unsigned long) (ULONG_PTR) h); }\n  static __inline long HandleToLong(const void *h) { return((long) (LONG_PTR) h); }\n  static __inline void *ULongToHandle(const unsigned long h) { return((void *) (UINT_PTR) h); }\n  static __inline void *LongToHandle(const long h) { return((void *) (INT_PTR) h); }\n  static __inline unsigned long PtrToUlong(const void *p) { return((unsigned long) (ULONG_PTR) p); }\n  static __inline unsigned int PtrToUint(const void *p) { return((unsigned int) (UINT_PTR) p); }\n  static __inline unsigned short PtrToUshort(const void *p) { return((unsigned short) (unsigned long) (ULONG_PTR) p); }\n  static __inline long PtrToLong(const void *p) { return((long) (LONG_PTR) p); }\n  static __inline int PtrToInt(const void *p) { return((int) (INT_PTR) p); }\n  static __inline short PtrToShort(const void *p) { return((short) (long) (LONG_PTR) p); }\n  static __inline void *IntToPtr(const int i) { return((void *)(INT_PTR)i); }\n  static __inline void *UIntToPtr(const unsigned int ui) { return((void *)(UINT_PTR)ui); }\n  static __inline void *LongToPtr(const long l) { return((void *)(LONG_PTR)l); }\n  static __inline void *ULongToPtr(const unsigned long ul) { return((void *)(ULONG_PTR)ul); }\n\n#define PtrToPtr64(p) ((void *) p)\n#define Ptr64ToPtr(p) ((void *) p)\n#define HandleToHandle64(h) (PtrToPtr64(h))\n#define Handle64ToHandle(h) (Ptr64ToPtr(h))\n\n  static __inline void *Ptr32ToPtr(const void *p) { return (void *)p; }\n  static __inline void *Handle32ToHandle(const void *h) { return((void *) h); }\n  static __inline void *PtrToPtr32(const void *p) { return((void *) (ULONG_PTR) p); }\n\n#define HandleToHandle32(h) (PtrToPtr32(h))\n#else\n\n#define ADDRESS_TAG_BIT 0x80000000UL\n\n  typedef unsigned short UHALF_PTR,*PUHALF_PTR;\n  typedef short HALF_PTR,*PHALF_PTR;\n  typedef long SHANDLE_PTR;\n  typedef unsigned long HANDLE_PTR;\n\n#define HandleToULong(h) ((ULONG)(ULONG_PTR)(h))\n#define HandleToLong(h) ((LONG)(LONG_PTR) (h))\n#define ULongToHandle(ul) ((HANDLE)(ULONG_PTR) (ul))\n#define LongToHandle(h) ((HANDLE)(LONG_PTR) (h))\n#define PtrToUlong(p) ((ULONG)(ULONG_PTR) (p))\n#define PtrToLong(p) ((LONG)(LONG_PTR) (p))\n#define PtrToUint(p) ((UINT)(UINT_PTR) (p))\n#define PtrToInt(p) ((INT)(INT_PTR) (p))\n#define PtrToUshort(p) ((unsigned short)(ULONG_PTR)(p))\n#define PtrToShort(p) ((short)(LONG_PTR)(p))\n#define IntToPtr(i) ((VOID *)(INT_PTR)((int)i))\n#define UIntToPtr(ui) ((VOID *)(UINT_PTR)((unsigned int)ui))\n#define LongToPtr(l) ((VOID *)(LONG_PTR)((long)l))\n#define ULongToPtr(ul) ((VOID *)(ULONG_PTR)((unsigned long)ul))\n\n  static __inline void *PtrToPtr64(const void *p) { return((void *) (ULONG_PTR)p); }\n  static __inline void *Ptr64ToPtr(const void *p) { return((void *) (ULONG_PTR) p); }\n  static __inline void *HandleToHandle64(const void *h) { return((void *) h); }\n  static __inline void *Handle64ToHandle(const void *h) { return((void *) (ULONG_PTR) h); }\n\n#define Ptr32ToPtr(p) ((void *) p)\n#define Handle32ToHandle(h) (Ptr32ToPtr(h))\n#define PtrToPtr32(p) ((void *) p)\n#define HandleToHandle32(h) (PtrToPtr32(h))\n#endif\n\n#define HandleToUlong(h) HandleToULong(h)\n#define UlongToHandle(ul) ULongToHandle(ul)\n#define UlongToPtr(ul) ULongToPtr(ul)\n#define UintToPtr(ui) UIntToPtr(ui)\n\n#define MAXUINT_PTR (~((UINT_PTR)0))\n#define MAXINT_PTR ((INT_PTR)(MAXUINT_PTR >> 1))\n#define MININT_PTR (~MAXINT_PTR)\n\n#define MAXULONG_PTR (~((ULONG_PTR)0))\n#define MAXLONG_PTR ((LONG_PTR)(MAXULONG_PTR >> 1))\n#define MINLONG_PTR (~MAXLONG_PTR)\n\n#define MAXUHALF_PTR ((UHALF_PTR)~0)\n#define MAXHALF_PTR ((HALF_PTR)(MAXUHALF_PTR >> 1))\n#define MINHALF_PTR (~MAXHALF_PTR)\n\n  typedef ULONG_PTR SIZE_T,*PSIZE_T;\n  typedef LONG_PTR SSIZE_T,*PSSIZE_T;\n  typedef ULONG_PTR DWORD_PTR,*PDWORD_PTR;\n  typedef __int64 LONG64,*PLONG64;\n  typedef unsigned __int64 ULONG64,*PULONG64;\n  typedef unsigned __int64 DWORD64,*PDWORD64;\n  typedef ULONG_PTR KAFFINITY;\n  typedef KAFFINITY *PKAFFINITY;\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/basetyps.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#if !defined(_BASETYPS_H_)\n#define _BASETYPS_H_\n\n#ifdef __cplusplus\n#define EXTERN_C extern \"C\"\n#else\n#define EXTERN_C extern\n#endif\n\n#define STDMETHODCALLTYPE WINAPI\n#define STDMETHODVCALLTYPE __cdecl\n\n#define STDAPICALLTYPE WINAPI\n#define STDAPIVCALLTYPE __cdecl\n\n#define STDAPI EXTERN_C HRESULT WINAPI\n#define STDAPI_(type) EXTERN_C type WINAPI\n\n#define STDMETHODIMP HRESULT WINAPI\n#define STDMETHODIMP_(type) type WINAPI\n\n#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE\n#define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE\n\n#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE\n#define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE\n\n#if defined(__cplusplus) && !defined(CINTERFACE)\n\n#define __STRUCT__ struct\n#define STDMETHOD(method) virtual HRESULT WINAPI method\n#define STDMETHOD_(type,method) virtual type WINAPI method\n#define STDMETHODV(method) virtual HRESULT STDMETHODVCALLTYPE method\n#define STDMETHODV_(type,method) virtual type STDMETHODVCALLTYPE method\n#define PURE = 0\n#define THIS_\n#define THIS void\n#define DECLARE_INTERFACE(iface) __STRUCT__ iface\n#define DECLARE_INTERFACE_(iface,baseiface) __STRUCT__ iface : public baseiface\n#else\n\n#ifndef __OBJC__\n#define interface struct\n#endif\n\n#define STDMETHOD(method) HRESULT (WINAPI *method)\n#define STDMETHOD_(type,method) type (WINAPI *method)\n#define STDMETHODV(method) HRESULT (STDMETHODVCALLTYPE *method)\n#define STDMETHODV_(type,method) type (STDMETHODVCALLTYPE *method)\n\n#define PURE\n#define THIS_ INTERFACE *This,\n#define THIS INTERFACE *This\n#ifdef CONST_VTABLE\n#define DECLARE_INTERFACE(iface) typedef struct iface { \\\n  const struct iface##Vtbl *lpVtbl; } iface; \\\n  typedef const struct iface##Vtbl iface##Vtbl; \\\n  const struct iface##Vtbl\n#else\n#define DECLARE_INTERFACE(iface) typedef struct iface { \\\n    struct iface##Vtbl *lpVtbl; \\\n  } iface; \\\n  typedef struct iface##Vtbl iface##Vtbl; \\\n  struct iface##Vtbl\n#endif\n#define DECLARE_INTERFACE_(iface,baseiface) DECLARE_INTERFACE(iface)\n#endif\n\n#include <guiddef.h>\n\n#ifndef _ERROR_STATUS_T_DEFINED\n#define _ERROR_STATUS_T_DEFINED\ntypedef unsigned long error_status_t;\n#endif\n\n#ifndef _WCHAR_T_DEFINED\ntypedef unsigned short wchar_t;\n#define _WCHAR_T_DEFINED\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/guiddef.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef GUID_DEFINED\n#define GUID_DEFINED\ntypedef struct _GUID {\n  unsigned long Data1;\n  unsigned short Data2;\n  unsigned short Data3;\n  unsigned char Data4[8 ];\n} GUID;\n#endif\n\n#ifndef FAR\n#define FAR\n#endif\n\n#ifndef DECLSPEC_SELECTANY\n#define DECLSPEC_SELECTANY __declspec(selectany)\n#endif\n\n#ifndef EXTERN_C\n#ifdef __cplusplus\n#define EXTERN_C extern \"C\"\n#else\n#define EXTERN_C extern\n#endif\n#endif\n\n#ifdef DEFINE_GUID\n#undef DEFINE_GUID\n#endif\n\n#ifdef INITGUID\n#ifdef __cplusplus\n#define DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) EXTERN_C const GUID DECLSPEC_SELECTANY name = { l,w1,w2,{ b1,b2,b3,b4,b5,b6,b7,b8 } }\n#else\n#define DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID DECLSPEC_SELECTANY name = { l,w1,w2,{ b1,b2,b3,b4,b5,b6,b7,b8 } }\n#endif\n#else\n#define DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) EXTERN_C const GUID name\n#endif\n\n#define DEFINE_OLEGUID(name,l,w1,w2) DEFINE_GUID(name,l,w1,w2,0xC0,0,0,0,0,0,0,0x46)\n\n#ifndef _GUIDDEF_H_\n#define _GUIDDEF_H_\n\n#ifndef __LPGUID_DEFINED__\n#define __LPGUID_DEFINED__\ntypedef GUID *LPGUID;\n#endif\n\n#ifndef __LPCGUID_DEFINED__\n#define __LPCGUID_DEFINED__\ntypedef const GUID *LPCGUID;\n#endif\n\n#ifndef __IID_DEFINED__\n#define __IID_DEFINED__\n\ntypedef GUID IID;\ntypedef IID *LPIID;\n#define IID_NULL GUID_NULL\n#define IsEqualIID(riid1,riid2) IsEqualGUID(riid1,riid2)\ntypedef GUID CLSID;\ntypedef CLSID *LPCLSID;\n#define CLSID_NULL GUID_NULL\n#define IsEqualCLSID(rclsid1,rclsid2) IsEqualGUID(rclsid1,rclsid2)\ntypedef GUID FMTID;\ntypedef FMTID *LPFMTID;\n#define FMTID_NULL GUID_NULL\n#define IsEqualFMTID(rfmtid1,rfmtid2) IsEqualGUID(rfmtid1,rfmtid2)\n\n#ifdef __midl_proxy\n#define __MIDL_CONST\n#else\n#define __MIDL_CONST const\n#endif\n\n#ifndef _REFGUID_DEFINED\n#define _REFGUID_DEFINED\n#ifdef __cplusplus\n#define REFGUID const GUID &\n#else\n#define REFGUID const GUID *__MIDL_CONST\n#endif\n#endif\n\n#ifndef _REFIID_DEFINED\n#define _REFIID_DEFINED\n#ifdef __cplusplus\n#define REFIID const IID &\n#else\n#define REFIID const IID *__MIDL_CONST\n#endif\n#endif\n\n#ifndef _REFCLSID_DEFINED\n#define _REFCLSID_DEFINED\n#ifdef __cplusplus\n#define REFCLSID const IID &\n#else\n#define REFCLSID const IID *__MIDL_CONST\n#endif\n#endif\n\n#ifndef _REFFMTID_DEFINED\n#define _REFFMTID_DEFINED\n#ifdef __cplusplus\n#define REFFMTID const IID &\n#else\n#define REFFMTID const IID *__MIDL_CONST\n#endif\n#endif\n#endif\n\n#ifndef _SYS_GUID_OPERATORS_\n#define _SYS_GUID_OPERATORS_\n#include <string.h>\n\n#ifdef __cplusplus\n__inline int InlineIsEqualGUID(REFGUID rguid1,REFGUID rguid2) {\n  return (((unsigned long *) &rguid1)[0]==((unsigned long *) &rguid2)[0] && ((unsigned long *) &rguid1)[1]==((unsigned long *) &rguid2)[1] &&\n    ((unsigned long *) &rguid1)[2]==((unsigned long *) &rguid2)[2] && ((unsigned long *) &rguid1)[3]==((unsigned long *) &rguid2)[3]);\n}\n__inline int IsEqualGUID(REFGUID rguid1,REFGUID rguid2) { return !memcmp(&rguid1,&rguid2,sizeof(GUID)); }\n#else\n#define InlineIsEqualGUID(rguid1,rguid2) (((unsigned long *) rguid1)[0]==((unsigned long *) rguid2)[0] && ((unsigned long *) rguid1)[1]==((unsigned long *) rguid2)[1] && ((unsigned long *) rguid1)[2]==((unsigned long *) rguid2)[2] && ((unsigned long *) rguid1)[3]==((unsigned long *) rguid2)[3])\n#define IsEqualGUID(rguid1,rguid2) (!memcmp(rguid1,rguid2,sizeof(GUID)))\n#endif\n\n#ifdef __INLINE_ISEQUAL_GUID\n#undef IsEqualGUID\n#define IsEqualGUID(rguid1,rguid2) InlineIsEqualGUID(rguid1,rguid2)\n#endif\n\n#define IsEqualIID(riid1,riid2) IsEqualGUID(riid1,riid2)\n#define IsEqualCLSID(rclsid1,rclsid2) IsEqualGUID(rclsid1,rclsid2)\n\n#if !defined _SYS_GUID_OPERATOR_EQ_ && !defined _NO_SYS_GUID_OPERATOR_EQ_\n#define _SYS_GUID_OPERATOR_EQ_\n#ifdef __cplusplus\n__inline int operator==(REFGUID guidOne,REFGUID guidOther) { return IsEqualGUID(guidOne,guidOther); }\n__inline int operator!=(REFGUID guidOne,REFGUID guidOther) { return !(guidOne==guidOther); }\n#endif\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/intrin.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef __INTRIN_H_\n#define __INTRIN_H_\n\n//!__TINYC__: intrinsic stuff removed\n\n#endif /* end __INTRIN_H_ */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/poppack.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#if !(defined(lint) || defined(RC_INVOKED))\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/pshpack1.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#if !(defined(lint) || defined(RC_INVOKED))\n#pragma pack(push,1)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/pshpack2.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#if !(defined(lint) || defined(RC_INVOKED))\n#pragma pack(push,2)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/pshpack4.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#if !(defined(lint) || defined(RC_INVOKED))\n#pragma pack(push,4)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/pshpack8.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#if !(defined(lint) || defined(RC_INVOKED))\n#pragma pack(push,8)\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/reason.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#if !defined SENTINEL_Reason\n#define SENTINEL_Reason\n\n#define SHTDN_REASON_FLAG_COMMENT_REQUIRED 0x01000000\n#define SHTDN_REASON_FLAG_DIRTY_PROBLEM_ID_REQUIRED 0x02000000\n#define SHTDN_REASON_FLAG_CLEAN_UI 0x04000000\n#define SHTDN_REASON_FLAG_DIRTY_UI 0x08000000\n#define SHTDN_REASON_FLAG_USER_DEFINED 0x40000000\n#define SHTDN_REASON_FLAG_PLANNED 0x80000000\n#define SHTDN_REASON_MAJOR_OTHER 0x00000000\n#define SHTDN_REASON_MAJOR_NONE 0x00000000\n#define SHTDN_REASON_MAJOR_HARDWARE 0x00010000\n#define SHTDN_REASON_MAJOR_OPERATINGSYSTEM 0x00020000\n#define SHTDN_REASON_MAJOR_SOFTWARE 0x00030000\n#define SHTDN_REASON_MAJOR_APPLICATION 0x00040000\n#define SHTDN_REASON_MAJOR_SYSTEM 0x00050000\n#define SHTDN_REASON_MAJOR_POWER 0x00060000\n#define SHTDN_REASON_MAJOR_LEGACY_API 0x00070000\n#define SHTDN_REASON_MINOR_OTHER 0x00000000\n#define SHTDN_REASON_MINOR_NONE 0x000000ff\n#define SHTDN_REASON_MINOR_MAINTENANCE 0x00000001\n#define SHTDN_REASON_MINOR_INSTALLATION 0x00000002\n#define SHTDN_REASON_MINOR_UPGRADE 0x00000003\n#define SHTDN_REASON_MINOR_RECONFIG 0x00000004\n#define SHTDN_REASON_MINOR_HUNG 0x00000005\n#define SHTDN_REASON_MINOR_UNSTABLE 0x00000006\n#define SHTDN_REASON_MINOR_DISK 0x00000007\n#define SHTDN_REASON_MINOR_PROCESSOR 0x00000008\n#define SHTDN_REASON_MINOR_NETWORKCARD 0x00000009\n#define SHTDN_REASON_MINOR_POWER_SUPPLY 0x0000000a\n#define SHTDN_REASON_MINOR_CORDUNPLUGGED 0x0000000b\n#define SHTDN_REASON_MINOR_ENVIRONMENT 0x0000000c\n#define SHTDN_REASON_MINOR_HARDWARE_DRIVER 0x0000000d\n#define SHTDN_REASON_MINOR_OTHERDRIVER 0x0000000e\n#define SHTDN_REASON_MINOR_BLUESCREEN 0x0000000F\n#define SHTDN_REASON_MINOR_SERVICEPACK 0x00000010\n#define SHTDN_REASON_MINOR_HOTFIX 0x00000011\n#define SHTDN_REASON_MINOR_SECURITYFIX 0x00000012\n#define SHTDN_REASON_MINOR_SECURITY 0x00000013\n#define SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY 0x00000014\n#define SHTDN_REASON_MINOR_WMI 0x00000015\n#define SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL 0x00000016\n#define SHTDN_REASON_MINOR_HOTFIX_UNINSTALL 0x00000017\n#define SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL 0x00000018\n#define SHTDN_REASON_MINOR_MMC 0x00000019\n#define SHTDN_REASON_MINOR_SYSTEMRESTORE 0x0000001a\n#define SHTDN_REASON_MINOR_TERMSRV 0x00000020\n#define SHTDN_REASON_MINOR_DC_PROMOTION 0x00000021\n#define SHTDN_REASON_MINOR_DC_DEMOTION 0x00000022\n#define SHTDN_REASON_UNKNOWN SHTDN_REASON_MINOR_NONE\n#define SHTDN_REASON_LEGACY_API (SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED)\n#define SHTDN_REASON_VALID_BIT_MASK 0xc0ffffff\n\n#define PCLEANUI (SHTDN_REASON_FLAG_PLANNED | SHTDN_REASON_FLAG_CLEAN_UI)\n#define UCLEANUI (SHTDN_REASON_FLAG_CLEAN_UI)\n#define PDIRTYUI (SHTDN_REASON_FLAG_PLANNED | SHTDN_REASON_FLAG_DIRTY_UI)\n#define UDIRTYUI (SHTDN_REASON_FLAG_DIRTY_UI)\n\n#define MAX_REASON_NAME_LEN 64\n#define MAX_REASON_DESC_LEN 256\n#define MAX_REASON_BUGID_LEN 32\n#define MAX_REASON_COMMENT_LEN 512\n#define SHUTDOWN_TYPE_LEN 32\n\n#define POLICY_SHOWREASONUI_NEVER 0\n#define POLICY_SHOWREASONUI_ALWAYS 1\n#define POLICY_SHOWREASONUI_WORKSTATIONONLY 2\n#define POLICY_SHOWREASONUI_SERVERONLY 3\n\n#define SNAPSHOT_POLICY_NEVER 0\n#define SNAPSHOT_POLICY_ALWAYS 1\n#define SNAPSHOT_POLICY_UNPLANNED 2\n\n#define MAX_NUM_REASONS 256\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/specstrings.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n\n#define __specstrings\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/stralign.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef __STRALIGN_H_\n#define __STRALIGN_H_\n\n#ifndef _STRALIGN_USE_SECURE_CRT\n#define _STRALIGN_USE_SECURE_CRT 0\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(I_X86_)\n#define WSTR_ALIGNED(s) TRUE\n#define ua_CharUpperW CharUpperW\n#define ua_lstrcmpiW lstrcmpiW\n#define ua_lstrcmpW lstrcmpW\n#define ua_lstrlenW lstrlenW\n#define ua_wcschr wcschr\n#define ua_wcsicmp wcsicmp\n#define ua_wcslen wcslen\n#define ua_wcsrchr wcsrchr\n  static __inline PUWSTR ua_wcscpy(PUWSTR Destination,PCUWSTR Source) { return wcscpy(Destination,Source); }\n#else\n#define WSTR_ALIGNED(s) (((DWORD_PTR)(s) & (sizeof(WCHAR)-1))==0)\n\n  LPUWSTR WINAPI uaw_CharUpperW(LPUWSTR String);\n  int WINAPI uaw_lstrcmpW(PCUWSTR String1,PCUWSTR String2);\n  int WINAPI uaw_lstrcmpiW(PCUWSTR String1,PCUWSTR String2);\n  int WINAPI uaw_lstrlenW(LPCUWSTR String);\n  PUWSTR __cdecl uaw_wcschr(PCUWSTR String,WCHAR Character);\n  PUWSTR __cdecl uaw_wcscpy(PUWSTR Destination,PCUWSTR Source);\n  int __cdecl uaw_wcsicmp(PCUWSTR String1,PCUWSTR String2);\n  size_t __cdecl uaw_wcslen(PCUWSTR String);\n  PUWSTR __cdecl uaw_wcsrchr(PCUWSTR String,WCHAR Character);\n#ifdef CharUpper\n  static __inline LPUWSTR ua_CharUpperW(LPUWSTR String) {\n    if(WSTR_ALIGNED(String)) return CharUpperW((PWSTR)String);\n    return uaw_CharUpperW(String);\n  }\n#endif\n\n#ifdef lstrcmp\n  static __inline int ua_lstrcmpW(LPCUWSTR String1,LPCUWSTR String2) {\n    if(WSTR_ALIGNED(String1) && WSTR_ALIGNED(String2)) return lstrcmpW((LPCWSTR)String1,(LPCWSTR)String2);\n    return uaw_lstrcmpW(String1,String2);\n  }\n#endif\n\n#ifdef lstrcmpi\n  static __inline int ua_lstrcmpiW(LPCUWSTR String1,LPCUWSTR String2) {\n    if(WSTR_ALIGNED(String1) && WSTR_ALIGNED(String2)) return lstrcmpiW((LPCWSTR)String1,(LPCWSTR)String2);\n    return uaw_lstrcmpiW(String1,String2);\n  }\n#endif\n\n#ifdef lstrlen\n  static __inline int ua_lstrlenW(LPCUWSTR String) {\n    if(WSTR_ALIGNED(String)) return lstrlenW((PCWSTR)String);\n    return uaw_lstrlenW(String);\n  }\n#endif\n\n#if defined(_WSTRING_DEFINED)\n#ifdef _WConst_return\n  typedef _WConst_return WCHAR UNALIGNED *PUWSTR_C;\n#else\n  typedef WCHAR UNALIGNED *PUWSTR_C;\n#endif\n  static __inline PUWSTR_C ua_wcschr(PCUWSTR String,WCHAR Character) {\n    if(WSTR_ALIGNED(String)) return wcschr((PCWSTR)String,Character);\n    return (PUWSTR_C)uaw_wcschr(String,Character);\n  }\n  static __inline PUWSTR_C ua_wcsrchr(PCUWSTR String,WCHAR Character) {\n    if(WSTR_ALIGNED(String)) return wcsrchr((PCWSTR)String,Character);\n    return (PUWSTR_C)uaw_wcsrchr(String,Character);\n  }\n#if defined(__cplusplus) && defined(_WConst_Return)\n  static __inline PUWSTR ua_wcschr(PUWSTR String,WCHAR Character) {\n    if(WSTR_ALIGNED(String)) return wcscpy((PWSTR)Destination,(PCWSTR)Source);\n    return uaw_wcscpy(Destination,Source);\n  }\n  static __inline PUWSTR ua_wcsrchr(PUWSTR String,WCHAR Character) {\n    if(WSTR_ALIGNED(String)) return wcsrchr(String,Character);\n    return uaw_wcsrchr((PCUWSTR)String,Character);\n  }\n#endif\n\n  static __inline PUWSTR ua_wcscpy(PUWSTR Destination,PCUWSTR Source) {\n    if(WSTR_ALIGNED(Source) && WSTR_ALIGNED(Destination)) return wcscpy((PWSTR)Destination,(PCWSTR)Source);\n    return uaw_wcscpy(Destination,Source);\n  }\n  static __inline size_t ua_wcslen(PCUWSTR String) {\n    if(WSTR_ALIGNED(String)) return wcslen((PCWSTR)String);\n    return uaw_wcslen(String);\n  }\n#endif\n\n  static __inline int ua_wcsicmp(LPCUWSTR String1,LPCUWSTR String2) {\n    if(WSTR_ALIGNED(String1) && WSTR_ALIGNED(String2)) return _wcsicmp((LPCWSTR)String1,(LPCWSTR)String2);\n    return uaw_wcsicmp(String1,String2);\n  }\n#endif\n\n#ifndef __UA_WCSLEN\n#define __UA_WCSLEN ua_wcslen\n#endif\n\n#define __UA_WSTRSIZE(s) ((__UA_WCSLEN(s)+1)*sizeof(WCHAR))\n#define __UA_STACKCOPY(p,s) memcpy(_alloca(s),p,s)\n\n#ifdef I_X86_\n#define WSTR_ALIGNED_STACK_COPY(d,s) (*(d) = (PCWSTR)(s))\n#else\n#define WSTR_ALIGNED_STACK_COPY(d,s) { PCUWSTR __ua_src; ULONG __ua_size; PWSTR __ua_dst; __ua_src = (s); if(WSTR_ALIGNED(__ua_src)) { __ua_dst = (PWSTR)__ua_src; } else { __ua_size = __UA_WSTRSIZE(__ua_src); __ua_dst = (PWSTR)_alloca(__ua_size); memcpy(__ua_dst,__ua_src,__ua_size); } *(d) = (PCWSTR)__ua_dst; }\n#endif\n\n#define ASTR_ALIGNED_STACK_COPY(d,s) (*(d) = (PCSTR)(s))\n\n#ifndef I_X86_\n#define __UA_STRUC_ALIGNED(t,s) (((DWORD_PTR)(s) & (TYPE_ALIGNMENT(t)-1))==0)\n#define STRUC_ALIGNED_STACK_COPY(t,s) __UA_STRUC_ALIGNED(t,s) ? ((t const *)(s)) : ((t const *)__UA_STACKCOPY((s),sizeof(t)))\n#else\n#define STRUC_ALIGNED_STACK_COPY(t,s) ((CONST t *)(s))\n#endif\n\n#ifdef UNICODE\n#define TSTR_ALIGNED_STACK_COPY(d,s) WSTR_ALIGNED_STACK_COPY(d,s)\n#define TSTR_ALIGNED(x) WSTR_ALIGNED(x)\n#define ua_CharUpper ua_CharUpperW\n#define ua_lstrcmp ua_lstrcmpW\n#define ua_lstrcmpi ua_lstrcmpiW\n#define ua_lstrlen ua_lstrlenW\n#define ua_tcscpy ua_wcscpy\n#else\n#define TSTR_ALIGNED_STACK_COPY(d,s) ASTR_ALIGNED_STACK_COPY(d,s)\n#define TSTR_ALIGNED(x) TRUE\n#define ua_CharUpper CharUpperA\n#define ua_lstrcmp lstrcmpA\n#define ua_lstrcmpi lstrcmpiA\n#define ua_lstrlen lstrlenA\n#define ua_tcscpy strcpy\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#include <sec_api/stralign_s.h>\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/tvout.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef __TVOUT__\n#define __TVOUT__\n\n#include <guiddef.h>\n\ntypedef struct _VIDEOPARAMETERS {\n  GUID Guid;\n  ULONG dwOffset;\n  ULONG dwCommand;\n  ULONG dwFlags;\n  ULONG dwMode;\n  ULONG dwTVStandard;\n  ULONG dwAvailableModes;\n  ULONG dwAvailableTVStandard;\n  ULONG dwFlickerFilter;\n  ULONG dwOverScanX;\n  ULONG dwOverScanY;\n  ULONG dwMaxUnscaledX;\n  ULONG dwMaxUnscaledY;\n  ULONG dwPositionX;\n  ULONG dwPositionY;\n  ULONG dwBrightness;\n  ULONG dwContrast;\n  ULONG dwCPType;\n  ULONG dwCPCommand;\n  ULONG dwCPStandard;\n  ULONG dwCPKey;\n  ULONG bCP_APSTriggerBits;\n  UCHAR bOEMCopyProtection[256];\n} VIDEOPARAMETERS,*PVIDEOPARAMETERS,*LPVIDEOPARAMETERS;\n\n#define VP_COMMAND_GET 0x0001\n#define VP_COMMAND_SET 0x0002\n\n#define VP_FLAGS_TV_MODE 0x0001\n#define VP_FLAGS_TV_STANDARD 0x0002\n#define VP_FLAGS_FLICKER 0x0004\n#define VP_FLAGS_OVERSCAN 0x0008\n#define VP_FLAGS_MAX_UNSCALED 0x0010\n#define VP_FLAGS_POSITION 0x0020\n#define VP_FLAGS_BRIGHTNESS 0x0040\n#define VP_FLAGS_CONTRAST 0x0080\n#define VP_FLAGS_COPYPROTECT 0x0100\n\n#define VP_MODE_WIN_GRAPHICS 0x0001\n#define VP_MODE_TV_PLAYBACK 0x0002\n\n#define VP_TV_STANDARD_NTSC_M 0x0001\n#define VP_TV_STANDARD_NTSC_M_J 0x0002\n#define VP_TV_STANDARD_PAL_B 0x0004\n#define VP_TV_STANDARD_PAL_D 0x0008\n#define VP_TV_STANDARD_PAL_H 0x0010\n#define VP_TV_STANDARD_PAL_I 0x0020\n#define VP_TV_STANDARD_PAL_M 0x0040\n#define VP_TV_STANDARD_PAL_N 0x0080\n#define VP_TV_STANDARD_SECAM_B 0x0100\n#define VP_TV_STANDARD_SECAM_D 0x0200\n#define VP_TV_STANDARD_SECAM_G 0x0400\n#define VP_TV_STANDARD_SECAM_H 0x0800\n#define VP_TV_STANDARD_SECAM_K 0x1000\n#define VP_TV_STANDARD_SECAM_K1 0x2000\n#define VP_TV_STANDARD_SECAM_L 0x4000\n#define VP_TV_STANDARD_WIN_VGA 0x8000\n#define VP_TV_STANDARD_NTSC_433 0x00010000\n#define VP_TV_STANDARD_PAL_G 0x00020000\n#define VP_TV_STANDARD_PAL_60 0x00040000\n#define VP_TV_STANDARD_SECAM_L1 0x00080000\n\n#define VP_CP_TYPE_APS_TRIGGER 0x0001\n#define VP_CP_TYPE_MACROVISION 0x0002\n#define VP_CP_CMD_ACTIVATE 0x0001\n#define VP_CP_CMD_DEACTIVATE 0x0002\n#define VP_CP_CMD_CHANGE 0x0004\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winbase.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINBASE_\n#define _WINBASE_\n\n#define WINADVAPI DECLSPEC_IMPORT\n#define WINBASEAPI DECLSPEC_IMPORT\n#define ZAWPROXYAPI DECLSPEC_IMPORT\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define DefineHandleTable(w) ((w),TRUE)\n#define LimitEmsPages(dw)\n#define SetSwapAreaSize(w) (w)\n#define LockSegment(w) GlobalFix((HANDLE)(w))\n#define UnlockSegment(w) GlobalUnfix((HANDLE)(w))\n#define GetCurrentTime() GetTickCount()\n\n#define Yield()\n\n#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)\n#define INVALID_FILE_SIZE ((DWORD)0xffffffff)\n#define INVALID_SET_FILE_POINTER ((DWORD)-1)\n#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)\n\n#define FILE_BEGIN 0\n#define FILE_CURRENT 1\n#define FILE_END 2\n\n#define TIME_ZONE_ID_INVALID ((DWORD)0xffffffff)\n\n#define WAIT_FAILED ((DWORD)0xffffffff)\n#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0)\n#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0) + 0)\n#define WAIT_ABANDONED_0 ((STATUS_ABANDONED_WAIT_0) + 0)\n#define WAIT_IO_COMPLETION STATUS_USER_APC\n#define STILL_ACTIVE STATUS_PENDING\n#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION\n#define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT\n#define EXCEPTION_BREAKPOINT STATUS_BREAKPOINT\n#define EXCEPTION_SINGLE_STEP STATUS_SINGLE_STEP\n#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED\n#define EXCEPTION_FLT_DENORMAL_OPERAND STATUS_FLOAT_DENORMAL_OPERAND\n#define EXCEPTION_FLT_DIVIDE_BY_ZERO STATUS_FLOAT_DIVIDE_BY_ZERO\n#define EXCEPTION_FLT_INEXACT_RESULT STATUS_FLOAT_INEXACT_RESULT\n#define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION\n#define EXCEPTION_FLT_OVERFLOW STATUS_FLOAT_OVERFLOW\n#define EXCEPTION_FLT_STACK_CHECK STATUS_FLOAT_STACK_CHECK\n#define EXCEPTION_FLT_UNDERFLOW STATUS_FLOAT_UNDERFLOW\n#define EXCEPTION_INT_DIVIDE_BY_ZERO STATUS_INTEGER_DIVIDE_BY_ZERO\n#define EXCEPTION_INT_OVERFLOW STATUS_INTEGER_OVERFLOW\n#define EXCEPTION_PRIV_INSTRUCTION STATUS_PRIVILEGED_INSTRUCTION\n#define EXCEPTION_IN_PAGE_ERROR STATUS_IN_PAGE_ERROR\n#define EXCEPTION_ILLEGAL_INSTRUCTION STATUS_ILLEGAL_INSTRUCTION\n#define EXCEPTION_NONCONTINUABLE_EXCEPTION STATUS_NONCONTINUABLE_EXCEPTION\n#define EXCEPTION_STACK_OVERFLOW STATUS_STACK_OVERFLOW\n#define EXCEPTION_INVALID_DISPOSITION STATUS_INVALID_DISPOSITION\n#define EXCEPTION_GUARD_PAGE STATUS_GUARD_PAGE_VIOLATION\n#define EXCEPTION_INVALID_HANDLE STATUS_INVALID_HANDLE\n#define EXCEPTION_POSSIBLE_DEADLOCK STATUS_POSSIBLE_DEADLOCK\n#define CONTROL_C_EXIT STATUS_CONTROL_C_EXIT\n#define MoveMemory RtlMoveMemory\n#define CopyMemory RtlCopyMemory\n#define FillMemory RtlFillMemory\n#define ZeroMemory RtlZeroMemory\n#define SecureZeroMemory RtlSecureZeroMemory\n\n#define FILE_FLAG_WRITE_THROUGH 0x80000000\n#define FILE_FLAG_OVERLAPPED 0x40000000\n#define FILE_FLAG_NO_BUFFERING 0x20000000\n#define FILE_FLAG_RANDOM_ACCESS 0x10000000\n#define FILE_FLAG_SEQUENTIAL_SCAN 0x8000000\n#define FILE_FLAG_DELETE_ON_CLOSE 0x4000000\n#define FILE_FLAG_BACKUP_SEMANTICS 0x2000000\n#define FILE_FLAG_POSIX_SEMANTICS 0x1000000\n#define FILE_FLAG_OPEN_REPARSE_POINT 0x200000\n#define FILE_FLAG_OPEN_NO_RECALL 0x100000\n#define FILE_FLAG_FIRST_PIPE_INSTANCE 0x80000\n\n#define CREATE_NEW 1\n#define CREATE_ALWAYS 2\n#define OPEN_EXISTING 3\n#define OPEN_ALWAYS 4\n#define TRUNCATE_EXISTING 5\n\n#define PROGRESS_CONTINUE 0\n#define PROGRESS_CANCEL 1\n#define PROGRESS_STOP 2\n#define PROGRESS_QUIET 3\n\n#define CALLBACK_CHUNK_FINISHED 0x0\n#define CALLBACK_STREAM_SWITCH 0x1\n\n#define COPY_FILE_FAIL_IF_EXISTS 0x1\n#define COPY_FILE_RESTARTABLE 0x2\n#define COPY_FILE_OPEN_SOURCE_FOR_WRITE 0x4\n#define COPY_FILE_ALLOW_DECRYPTED_DESTINATION 0x8\n\n#define REPLACEFILE_WRITE_THROUGH 0x1\n#define REPLACEFILE_IGNORE_MERGE_ERRORS 0x2\n\n#define PIPE_ACCESS_INBOUND 0x1\n#define PIPE_ACCESS_OUTBOUND 0x2\n#define PIPE_ACCESS_DUPLEX 0x3\n\n#define PIPE_CLIENT_END 0x0\n#define PIPE_SERVER_END 0x1\n\n#define PIPE_WAIT 0x0\n#define PIPE_NOWAIT 0x1\n#define PIPE_READMODE_BYTE 0x0\n#define PIPE_READMODE_MESSAGE 0x2\n#define PIPE_TYPE_BYTE 0x0\n#define PIPE_TYPE_MESSAGE 0x4\n\n#define PIPE_UNLIMITED_INSTANCES 255\n\n#define SECURITY_ANONYMOUS (SecurityAnonymous << 16)\n#define SECURITY_IDENTIFICATION (SecurityIdentification << 16)\n#define SECURITY_IMPERSONATION (SecurityImpersonation << 16)\n#define SECURITY_DELEGATION (SecurityDelegation << 16)\n\n#define SECURITY_CONTEXT_TRACKING 0x40000\n#define SECURITY_EFFECTIVE_ONLY 0x80000\n\n#define SECURITY_SQOS_PRESENT 0x100000\n#define SECURITY_VALID_SQOS_FLAGS 0x1f0000\n\n  typedef struct _OVERLAPPED {\n    ULONG_PTR Internal;\n    ULONG_PTR InternalHigh;\n    union {\n      struct {\n\tDWORD Offset;\n\tDWORD OffsetHigh;\n      };\n      PVOID Pointer;\n    };\n    HANDLE hEvent;\n  } OVERLAPPED,*LPOVERLAPPED;\n\n  typedef struct _SECURITY_ATTRIBUTES {\n    DWORD nLength;\n    LPVOID lpSecurityDescriptor;\n    WINBOOL bInheritHandle;\n  } SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES,*LPSECURITY_ATTRIBUTES;\n\n  typedef struct _PROCESS_INFORMATION {\n    HANDLE hProcess;\n    HANDLE hThread;\n    DWORD dwProcessId;\n    DWORD dwThreadId;\n  } PROCESS_INFORMATION,*PPROCESS_INFORMATION,*LPPROCESS_INFORMATION;\n\n#ifndef _FILETIME_\n#define _FILETIME_\n  typedef struct _FILETIME {\n    DWORD dwLowDateTime;\n    DWORD dwHighDateTime;\n  } FILETIME,*PFILETIME,*LPFILETIME;\n#endif\n\n  typedef struct _SYSTEMTIME {\n    WORD wYear;\n    WORD wMonth;\n    WORD wDayOfWeek;\n    WORD wDay;\n    WORD wHour;\n    WORD wMinute;\n    WORD wSecond;\n    WORD wMilliseconds;\n  } SYSTEMTIME,*PSYSTEMTIME,*LPSYSTEMTIME;\n\n  typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter);\n  typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;\n  typedef VOID (WINAPI *PFIBER_START_ROUTINE)(LPVOID lpFiberParameter);\n  typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE;\n\n  typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;\n  typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION;\n  typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION;\n  typedef RTL_CRITICAL_SECTION_DEBUG CRITICAL_SECTION_DEBUG;\n  typedef PRTL_CRITICAL_SECTION_DEBUG PCRITICAL_SECTION_DEBUG;\n  typedef PRTL_CRITICAL_SECTION_DEBUG LPCRITICAL_SECTION_DEBUG;\n\n  WINBASEAPI PVOID WINAPI EncodePointer(PVOID Ptr);\n  WINBASEAPI PVOID WINAPI DecodePointer(PVOID Ptr);\n  WINBASEAPI PVOID WINAPI EncodeSystemPointer(PVOID Ptr);\n  WINBASEAPI PVOID WINAPI DecodeSystemPointer(PVOID Ptr);\n\n#ifdef I_X86_\n  typedef PLDT_ENTRY LPLDT_ENTRY;\n#else\n  typedef LPVOID LPLDT_ENTRY;\n#endif\n\n#define MUTEX_MODIFY_STATE MUTANT_QUERY_STATE\n#define MUTEX_ALL_ACCESS MUTANT_ALL_ACCESS\n\n#define SP_SERIALCOMM ((DWORD)0x1)\n\n#define PST_UNSPECIFIED ((DWORD)0x0)\n#define PST_RS232 ((DWORD)0x1)\n#define PST_PARALLELPORT ((DWORD)0x2)\n#define PST_RS422 ((DWORD)0x3)\n#define PST_RS423 ((DWORD)0x4)\n#define PST_RS449 ((DWORD)0x5)\n#define PST_MODEM ((DWORD)0x6)\n#define PST_FAX ((DWORD)0x21)\n#define PST_SCANNER ((DWORD)0x22)\n#define PST_NETWORK_BRIDGE ((DWORD)0x100)\n#define PST_LAT ((DWORD)0x101)\n#define PST_TCPIP_TELNET ((DWORD)0x102)\n#define PST_X25 ((DWORD)0x103)\n\n#define PCF_DTRDSR ((DWORD)0x1)\n#define PCF_RTSCTS ((DWORD)0x2)\n#define PCF_RLSD ((DWORD)0x4)\n#define PCF_PARITY_CHECK ((DWORD)0x8)\n#define PCF_XONXOFF ((DWORD)0x10)\n#define PCF_SETXCHAR ((DWORD)0x20)\n#define PCF_TOTALTIMEOUTS ((DWORD)0x40)\n#define PCF_INTTIMEOUTS ((DWORD)0x80)\n#define PCF_SPECIALCHARS ((DWORD)0x100)\n#define PCF_16BITMODE ((DWORD)0x200)\n\n#define SP_PARITY ((DWORD)0x1)\n#define SP_BAUD ((DWORD)0x2)\n#define SP_DATABITS ((DWORD)0x4)\n#define SP_STOPBITS ((DWORD)0x8)\n#define SP_HANDSHAKING ((DWORD)0x10)\n#define SP_PARITY_CHECK ((DWORD)0x20)\n#define SP_RLSD ((DWORD)0x40)\n\n#define BAUD_075 ((DWORD)0x1)\n#define BAUD_110 ((DWORD)0x2)\n#define BAUD_134_5 ((DWORD)0x4)\n#define BAUD_150 ((DWORD)0x8)\n#define BAUD_300 ((DWORD)0x10)\n#define BAUD_600 ((DWORD)0x20)\n#define BAUD_1200 ((DWORD)0x40)\n#define BAUD_1800 ((DWORD)0x80)\n#define BAUD_2400 ((DWORD)0x100)\n#define BAUD_4800 ((DWORD)0x200)\n#define BAUD_7200 ((DWORD)0x400)\n#define BAUD_9600 ((DWORD)0x800)\n#define BAUD_14400 ((DWORD)0x1000)\n#define BAUD_19200 ((DWORD)0x2000)\n#define BAUD_38400 ((DWORD)0x4000)\n#define BAUD_56K ((DWORD)0x8000)\n#define BAUD_128K ((DWORD)0x10000)\n#define BAUD_115200 ((DWORD)0x20000)\n#define BAUD_57600 ((DWORD)0x40000)\n#define BAUD_USER ((DWORD)0x10000000)\n\n#define DATABITS_5 ((WORD)0x1)\n#define DATABITS_6 ((WORD)0x2)\n#define DATABITS_7 ((WORD)0x4)\n#define DATABITS_8 ((WORD)0x8)\n#define DATABITS_16 ((WORD)0x10)\n#define DATABITS_16X ((WORD)0x20)\n\n#define STOPBITS_10 ((WORD)0x1)\n#define STOPBITS_15 ((WORD)0x2)\n#define STOPBITS_20 ((WORD)0x4)\n#define PARITY_NONE ((WORD)0x100)\n#define PARITY_ODD ((WORD)0x200)\n#define PARITY_EVEN ((WORD)0x400)\n#define PARITY_MARK ((WORD)0x800)\n#define PARITY_SPACE ((WORD)0x1000)\n\n  typedef struct _COMMPROP {\n    WORD wPacketLength;\n    WORD wPacketVersion;\n    DWORD dwServiceMask;\n    DWORD dwReserved1;\n    DWORD dwMaxTxQueue;\n    DWORD dwMaxRxQueue;\n    DWORD dwMaxBaud;\n    DWORD dwProvSubType;\n    DWORD dwProvCapabilities;\n    DWORD dwSettableParams;\n    DWORD dwSettableBaud;\n    WORD wSettableData;\n    WORD wSettableStopParity;\n    DWORD dwCurrentTxQueue;\n    DWORD dwCurrentRxQueue;\n    DWORD dwProvSpec1;\n    DWORD dwProvSpec2;\n    WCHAR wcProvChar[1];\n  } COMMPROP,*LPCOMMPROP;\n\n#define COMMPROP_INITIALIZED ((DWORD)0xE73CF52E)\n\n  typedef struct _COMSTAT {\n    DWORD fCtsHold : 1;\n    DWORD fDsrHold : 1;\n    DWORD fRlsdHold : 1;\n    DWORD fXoffHold : 1;\n    DWORD fXoffSent : 1;\n    DWORD fEof : 1;\n    DWORD fTxim : 1;\n    DWORD fReserved : 25;\n    DWORD cbInQue;\n    DWORD cbOutQue;\n  } COMSTAT,*LPCOMSTAT;\n\n#define DTR_CONTROL_DISABLE 0x0\n#define DTR_CONTROL_ENABLE 0x1\n#define DTR_CONTROL_HANDSHAKE 0x2\n\n#define RTS_CONTROL_DISABLE 0x0\n#define RTS_CONTROL_ENABLE 0x1\n#define RTS_CONTROL_HANDSHAKE 0x2\n#define RTS_CONTROL_TOGGLE 0x3\n\n  typedef struct _DCB {\n    DWORD DCBlength;\n    DWORD BaudRate;\n    DWORD fBinary: 1;\n    DWORD fParity: 1;\n    DWORD fOutxCtsFlow:1;\n    DWORD fOutxDsrFlow:1;\n    DWORD fDtrControl:2;\n    DWORD fDsrSensitivity:1;\n    DWORD fTXContinueOnXoff: 1;\n    DWORD fOutX: 1;\n    DWORD fInX: 1;\n    DWORD fErrorChar: 1;\n    DWORD fNull: 1;\n    DWORD fRtsControl:2;\n    DWORD fAbortOnError:1;\n    DWORD fDummy2:17;\n    WORD wReserved;\n    WORD XonLim;\n    WORD XoffLim;\n    BYTE ByteSize;\n    BYTE Parity;\n    BYTE StopBits;\n    char XonChar;\n    char XoffChar;\n    char ErrorChar;\n    char EofChar;\n    char EvtChar;\n    WORD wReserved1;\n  } DCB,*LPDCB;\n\n  typedef struct _COMMTIMEOUTS {\n    DWORD ReadIntervalTimeout;\n    DWORD ReadTotalTimeoutMultiplier;\n    DWORD ReadTotalTimeoutConstant;\n    DWORD WriteTotalTimeoutMultiplier;\n    DWORD WriteTotalTimeoutConstant;\n  } COMMTIMEOUTS,*LPCOMMTIMEOUTS;\n\n  typedef struct _COMMCONFIG {\n    DWORD dwSize;\n    WORD wVersion;\n    WORD wReserved;\n    DCB dcb;\n    DWORD dwProviderSubType;\n    DWORD dwProviderOffset;\n    DWORD dwProviderSize;\n    WCHAR wcProviderData[1];\n  } COMMCONFIG,*LPCOMMCONFIG;\n\n  typedef struct _SYSTEM_INFO {\n    union {\n      DWORD dwOemId;\n      struct {\n\tWORD wProcessorArchitecture;\n\tWORD wReserved;\n      };\n    };\n    DWORD dwPageSize;\n    LPVOID lpMinimumApplicationAddress;\n    LPVOID lpMaximumApplicationAddress;\n    DWORD_PTR dwActiveProcessorMask;\n    DWORD dwNumberOfProcessors;\n    DWORD dwProcessorType;\n    DWORD dwAllocationGranularity;\n    WORD wProcessorLevel;\n    WORD wProcessorRevision;\n  } SYSTEM_INFO,*LPSYSTEM_INFO;\n\n#define FreeModule(hLibModule) FreeLibrary((hLibModule))\n#define MakeProcInstance(lpProc,hInstance) (lpProc)\n#define FreeProcInstance(lpProc) (lpProc)\n\n#define GMEM_FIXED 0x0\n#define GMEM_MOVEABLE 0x2\n#define GMEM_NOCOMPACT 0x10\n#define GMEM_NODISCARD 0x20\n#define GMEM_ZEROINIT 0x40\n#define GMEM_MODIFY 0x80\n#define GMEM_DISCARDABLE 0x100\n#define GMEM_NOT_BANKED 0x1000\n#define GMEM_SHARE 0x2000\n#define GMEM_DDESHARE 0x2000\n#define GMEM_NOTIFY 0x4000\n#define GMEM_LOWER GMEM_NOT_BANKED\n#define GMEM_VALID_FLAGS 0x7F72\n#define GMEM_INVALID_HANDLE 0x8000\n\n#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)\n#define GPTR (GMEM_FIXED | GMEM_ZEROINIT)\n\n#define GlobalLRUNewest(h) ((HANDLE)(h))\n#define GlobalLRUOldest(h) ((HANDLE)(h))\n#define GlobalDiscard(h) GlobalReAlloc((h),0,GMEM_MOVEABLE)\n\n#define GMEM_DISCARDED 0x4000\n#define GMEM_LOCKCOUNT 0xff\n\n  typedef struct _MEMORYSTATUS {\n    DWORD dwLength;\n    DWORD dwMemoryLoad;\n    SIZE_T dwTotalPhys;\n    SIZE_T dwAvailPhys;\n    SIZE_T dwTotalPageFile;\n    SIZE_T dwAvailPageFile;\n    SIZE_T dwTotalVirtual;\n    SIZE_T dwAvailVirtual;\n  } MEMORYSTATUS,*LPMEMORYSTATUS;\n\n#define LMEM_FIXED 0x0\n#define LMEM_MOVEABLE 0x2\n#define LMEM_NOCOMPACT 0x10\n#define LMEM_NODISCARD 0x20\n#define LMEM_ZEROINIT 0x40\n#define LMEM_MODIFY 0x80\n#define LMEM_DISCARDABLE 0xf00\n#define LMEM_VALID_FLAGS 0xf72\n#define LMEM_INVALID_HANDLE 0x8000\n\n#define LHND (LMEM_MOVEABLE | LMEM_ZEROINIT)\n#define LPTR (LMEM_FIXED | LMEM_ZEROINIT)\n\n#define NONZEROLHND (LMEM_MOVEABLE)\n#define NONZEROLPTR (LMEM_FIXED)\n\n#define LocalDiscard(h) LocalReAlloc((h),0,LMEM_MOVEABLE)\n\n#define LMEM_DISCARDED 0x4000\n#define LMEM_LOCKCOUNT 0xff\n\n#define DEBUG_PROCESS 0x1\n#define DEBUG_ONLY_THIS_PROCESS 0x2\n#define CREATE_SUSPENDED 0x4\n#define DETACHED_PROCESS 0x8\n#define CREATE_NEW_CONSOLE 0x10\n#define NORMAL_PRIORITY_CLASS 0x20\n#define IDLE_PRIORITY_CLASS 0x40\n#define HIGH_PRIORITY_CLASS 0x80\n#define REALTIME_PRIORITY_CLASS 0x100\n#define CREATE_NEW_PROCESS_GROUP 0x200\n#define CREATE_UNICODE_ENVIRONMENT 0x400\n#define CREATE_SEPARATE_WOW_VDM 0x800\n#define CREATE_SHARED_WOW_VDM 0x1000\n#define CREATE_FORCEDOS 0x2000\n#define BELOW_NORMAL_PRIORITY_CLASS 0x4000\n#define ABOVE_NORMAL_PRIORITY_CLASS 0x8000\n#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x10000\n\n#define CREATE_BREAKAWAY_FROM_JOB 0x1000000\n#define CREATE_PRESERVE_CODE_AUTHZ_LEVEL 0x2000000\n\n#define CREATE_DEFAULT_ERROR_MODE 0x4000000\n#define CREATE_NO_WINDOW 0x8000000\n\n#define PROFILE_USER 0x10000000\n#define PROFILE_KERNEL 0x20000000\n#define PROFILE_SERVER 0x40000000\n\n#define CREATE_IGNORE_SYSTEM_DEFAULT 0x80000000\n\n#define THREAD_PRIORITY_LOWEST THREAD_BASE_PRIORITY_MIN\n#define THREAD_PRIORITY_BELOW_NORMAL (THREAD_PRIORITY_LOWEST+1)\n#define THREAD_PRIORITY_NORMAL 0\n#define THREAD_PRIORITY_HIGHEST THREAD_BASE_PRIORITY_MAX\n#define THREAD_PRIORITY_ABOVE_NORMAL (THREAD_PRIORITY_HIGHEST-1)\n#define THREAD_PRIORITY_ERROR_RETURN (MAXLONG)\n\n#define THREAD_PRIORITY_TIME_CRITICAL THREAD_BASE_PRIORITY_LOWRT\n#define THREAD_PRIORITY_IDLE THREAD_BASE_PRIORITY_IDLE\n\n#define EXCEPTION_DEBUG_EVENT 1\n#define CREATE_THREAD_DEBUG_EVENT 2\n#define CREATE_PROCESS_DEBUG_EVENT 3\n#define EXIT_THREAD_DEBUG_EVENT 4\n#define EXIT_PROCESS_DEBUG_EVENT 5\n#define LOAD_DLL_DEBUG_EVENT 6\n#define UNLOAD_DLL_DEBUG_EVENT 7\n#define OUTPUT_DEBUG_STRING_EVENT 8\n#define RIP_EVENT 9\n\n  typedef struct _EXCEPTION_DEBUG_INFO {\n    EXCEPTION_RECORD ExceptionRecord;\n    DWORD dwFirstChance;\n  } EXCEPTION_DEBUG_INFO,*LPEXCEPTION_DEBUG_INFO;\n\n  typedef struct _CREATE_THREAD_DEBUG_INFO {\n    HANDLE hThread;\n    LPVOID lpThreadLocalBase;\n    LPTHREAD_START_ROUTINE lpStartAddress;\n  } CREATE_THREAD_DEBUG_INFO,*LPCREATE_THREAD_DEBUG_INFO;\n\n  typedef struct _CREATE_PROCESS_DEBUG_INFO {\n    HANDLE hFile;\n    HANDLE hProcess;\n    HANDLE hThread;\n    LPVOID lpBaseOfImage;\n    DWORD dwDebugInfoFileOffset;\n    DWORD nDebugInfoSize;\n    LPVOID lpThreadLocalBase;\n    LPTHREAD_START_ROUTINE lpStartAddress;\n    LPVOID lpImageName;\n    WORD fUnicode;\n  } CREATE_PROCESS_DEBUG_INFO,*LPCREATE_PROCESS_DEBUG_INFO;\n\n  typedef struct _EXIT_THREAD_DEBUG_INFO {\n    DWORD dwExitCode;\n  } EXIT_THREAD_DEBUG_INFO,*LPEXIT_THREAD_DEBUG_INFO;\n\n  typedef struct _EXIT_PROCESS_DEBUG_INFO {\n    DWORD dwExitCode;\n  } EXIT_PROCESS_DEBUG_INFO,*LPEXIT_PROCESS_DEBUG_INFO;\n\n  typedef struct _LOAD_DLL_DEBUG_INFO {\n    HANDLE hFile;\n    LPVOID lpBaseOfDll;\n    DWORD dwDebugInfoFileOffset;\n    DWORD nDebugInfoSize;\n    LPVOID lpImageName;\n    WORD fUnicode;\n  } LOAD_DLL_DEBUG_INFO,*LPLOAD_DLL_DEBUG_INFO;\n\n  typedef struct _UNLOAD_DLL_DEBUG_INFO {\n    LPVOID lpBaseOfDll;\n  } UNLOAD_DLL_DEBUG_INFO,*LPUNLOAD_DLL_DEBUG_INFO;\n\n  typedef struct _OUTPUT_DEBUG_STRING_INFO {\n    LPSTR lpDebugStringData;\n    WORD fUnicode;\n    WORD nDebugStringLength;\n  } OUTPUT_DEBUG_STRING_INFO,*LPOUTPUT_DEBUG_STRING_INFO;\n\n  typedef struct _RIP_INFO {\n    DWORD dwError;\n    DWORD dwType;\n  } RIP_INFO,*LPRIP_INFO;\n\n  typedef struct _DEBUG_EVENT {\n    DWORD dwDebugEventCode;\n    DWORD dwProcessId;\n    DWORD dwThreadId;\n    union {\n      EXCEPTION_DEBUG_INFO Exception;\n      CREATE_THREAD_DEBUG_INFO CreateThread;\n      CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;\n      EXIT_THREAD_DEBUG_INFO ExitThread;\n      EXIT_PROCESS_DEBUG_INFO ExitProcess;\n      LOAD_DLL_DEBUG_INFO LoadDll;\n      UNLOAD_DLL_DEBUG_INFO UnloadDll;\n      OUTPUT_DEBUG_STRING_INFO DebugString;\n      RIP_INFO RipInfo;\n    } u;\n  } DEBUG_EVENT,*LPDEBUG_EVENT;\n\n  typedef PCONTEXT LPCONTEXT;\n  typedef PEXCEPTION_RECORD LPEXCEPTION_RECORD;\n  typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS;\n\n#define DRIVE_UNKNOWN 0\n#define DRIVE_NO_ROOT_DIR 1\n#define DRIVE_REMOVABLE 2\n#define DRIVE_FIXED 3\n#define DRIVE_REMOTE 4\n#define DRIVE_CDROM 5\n#define DRIVE_RAMDISK 6\n\n#define GetFreeSpace(w) (0x100000L)\n#define FILE_TYPE_UNKNOWN 0x0\n#define FILE_TYPE_DISK 0x1\n#define FILE_TYPE_CHAR 0x2\n#define FILE_TYPE_PIPE 0x3\n#define FILE_TYPE_REMOTE 0x8000\n\n#define STD_INPUT_HANDLE ((DWORD)-10)\n#define STD_OUTPUT_HANDLE ((DWORD)-11)\n#define STD_ERROR_HANDLE ((DWORD)-12)\n\n#define NOPARITY 0\n#define ODDPARITY 1\n#define EVENPARITY 2\n#define MARKPARITY 3\n#define SPACEPARITY 4\n\n#define ONESTOPBIT 0\n#define ONE5STOPBITS 1\n#define TWOSTOPBITS 2\n\n#define IGNORE 0\n#define INFINITE 0xffffffff\n\n#define CBR_110 110\n#define CBR_300 300\n#define CBR_600 600\n#define CBR_1200 1200\n#define CBR_2400 2400\n#define CBR_4800 4800\n#define CBR_9600 9600\n#define CBR_14400 14400\n#define CBR_19200 19200\n#define CBR_38400 38400\n#define CBR_56000 56000\n#define CBR_57600 57600\n#define CBR_115200 115200\n#define CBR_128000 128000\n#define CBR_256000 256000\n\n#define CE_RXOVER 0x1\n#define CE_OVERRUN 0x2\n#define CE_RXPARITY 0x4\n#define CE_FRAME 0x8\n#define CE_BREAK 0x10\n#define CE_TXFULL 0x100\n#define CE_PTO 0x200\n#define CE_IOE 0x400\n#define CE_DNS 0x800\n#define CE_OOP 0x1000\n#define CE_MODE 0x8000\n\n#define IE_BADID (-1)\n#define IE_OPEN (-2)\n#define IE_NOPEN (-3)\n#define IE_MEMORY (-4)\n#define IE_DEFAULT (-5)\n#define IE_HARDWARE (-10)\n#define IE_BYTESIZE (-11)\n#define IE_BAUDRATE (-12)\n\n#define EV_RXCHAR 0x1\n#define EV_RXFLAG 0x2\n#define EV_TXEMPTY 0x4\n#define EV_CTS 0x8\n#define EV_DSR 0x10\n#define EV_RLSD 0x20\n#define EV_BREAK 0x40\n#define EV_ERR 0x80\n#define EV_RING 0x100\n#define EV_PERR 0x200\n#define EV_RX80FULL 0x400\n#define EV_EVENT1 0x800\n#define EV_EVENT2 0x1000\n\n#define SETXOFF 1\n#define SETXON 2\n#define SETRTS 3\n#define CLRRTS 4\n#define SETDTR 5\n#define CLRDTR 6\n#define RESETDEV 7\n#define SETBREAK 8\n#define CLRBREAK 9\n\n#define PURGE_TXABORT 0x1\n#define PURGE_RXABORT 0x2\n#define PURGE_TXCLEAR 0x4\n#define PURGE_RXCLEAR 0x8\n\n#define LPTx 0x80\n\n#define MS_CTS_ON ((DWORD)0x10)\n#define MS_DSR_ON ((DWORD)0x20)\n#define MS_RING_ON ((DWORD)0x40)\n#define MS_RLSD_ON ((DWORD)0x80)\n\n#define S_QUEUEEMPTY 0\n#define S_THRESHOLD 1\n#define S_ALLTHRESHOLD 2\n\n#define S_NORMAL 0\n#define S_LEGATO 1\n#define S_STACCATO 2\n\n#define S_PERIOD512 0\n#define S_PERIOD1024 1\n#define S_PERIOD2048 2\n#define S_PERIODVOICE 3\n#define S_WHITE512 4\n#define S_WHITE1024 5\n#define S_WHITE2048 6\n#define S_WHITEVOICE 7\n\n#define S_SERDVNA (-1)\n#define S_SEROFM (-2)\n#define S_SERMACT (-3)\n#define S_SERQFUL (-4)\n#define S_SERBDNT (-5)\n#define S_SERDLN (-6)\n#define S_SERDCC (-7)\n#define S_SERDTP (-8)\n#define S_SERDVL (-9)\n#define S_SERDMD (-10)\n#define S_SERDSH (-11)\n#define S_SERDPT (-12)\n#define S_SERDFQ (-13)\n#define S_SERDDR (-14)\n#define S_SERDSR (-15)\n#define S_SERDST (-16)\n\n#define NMPWAIT_WAIT_FOREVER 0xffffffff\n#define NMPWAIT_NOWAIT 0x1\n#define NMPWAIT_USE_DEFAULT_WAIT 0x0\n\n#define FS_CASE_IS_PRESERVED FILE_CASE_PRESERVED_NAMES\n#define FS_CASE_SENSITIVE FILE_CASE_SENSITIVE_SEARCH\n#define FS_UNICODE_STORED_ON_DISK FILE_UNICODE_ON_DISK\n#define FS_PERSISTENT_ACLS FILE_PERSISTENT_ACLS\n#define FS_VOL_IS_COMPRESSED FILE_VOLUME_IS_COMPRESSED\n#define FS_FILE_COMPRESSION FILE_FILE_COMPRESSION\n#define FS_FILE_ENCRYPTION FILE_SUPPORTS_ENCRYPTION\n\n#define FILE_MAP_COPY SECTION_QUERY\n#define FILE_MAP_WRITE SECTION_MAP_WRITE\n#define FILE_MAP_READ SECTION_MAP_READ\n#define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS\n#define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT\n\n#define OF_READ 0x0\n#define OF_WRITE 0x1\n#define OF_READWRITE 0x2\n#define OF_SHARE_COMPAT 0x0\n#define OF_SHARE_EXCLUSIVE 0x10\n#define OF_SHARE_DENY_WRITE 0x20\n#define OF_SHARE_DENY_READ 0x30\n#define OF_SHARE_DENY_NONE 0x40\n#define OF_PARSE 0x100\n#define OF_DELETE 0x200\n#define OF_VERIFY 0x400\n#define OF_CANCEL 0x800\n#define OF_CREATE 0x1000\n#define OF_PROMPT 0x2000\n#define OF_EXIST 0x4000\n#define OF_REOPEN 0x8000\n\n#define OFS_MAXPATHNAME 128\n  typedef struct _OFSTRUCT {\n    BYTE cBytes;\n    BYTE fFixedDisk;\n    WORD nErrCode;\n    WORD Reserved1;\n    WORD Reserved2;\n    CHAR szPathName[OFS_MAXPATHNAME];\n  } OFSTRUCT,*LPOFSTRUCT,*POFSTRUCT;\n\n#ifndef NOWINBASEINTERLOCK\n\n#ifndef _NTOS_\n\n#if defined(__ia64__) && !defined(RC_INVOKED)\n\n#define InterlockedIncrement _InterlockedIncrement\n#define InterlockedIncrementAcquire _InterlockedIncrement_acq\n#define InterlockedIncrementRelease _InterlockedIncrement_rel\n#define InterlockedDecrement _InterlockedDecrement\n#define InterlockedDecrementAcquire _InterlockedDecrement_acq\n#define InterlockedDecrementRelease _InterlockedDecrement_rel\n#define InterlockedExchange _InterlockedExchange\n#define InterlockedExchangeAdd _InterlockedExchangeAdd\n#define InterlockedCompareExchange _InterlockedCompareExchange\n#define InterlockedCompareExchangeAcquire _InterlockedCompareExchange_acq\n#define InterlockedCompareExchangeRelease _InterlockedCompareExchange_rel\n#define InterlockedExchangePointer _InterlockedExchangePointer\n#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer\n#define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer_rel\n#define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer_acq\n\n#define InterlockedIncrement64 _InterlockedIncrement64\n#define InterlockedDecrement64 _InterlockedDecrement64\n#define InterlockedExchange64 _InterlockedExchange64\n#define InterlockedExchangeAcquire64 _InterlockedExchange64_acq\n#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64\n#define InterlockedCompareExchange64 _InterlockedCompareExchange64\n#define InterlockedCompareExchangeAcquire64 _InterlockedCompareExchange64_acq\n#define InterlockedCompareExchangeRelease64 _InterlockedCompareExchange64_rel\n\n  LONGLONG __cdecl InterlockedIncrement64(LONGLONG volatile *Addend);\n  LONGLONG __cdecl InterlockedDecrement64(LONGLONG volatile *Addend);\n  LONG __cdecl InterlockedIncrementAcquire(LONG volatile *Addend);\n  LONG __cdecl InterlockedDecrementAcquire(LONG volatile *Addend);\n  LONG __cdecl InterlockedIncrementRelease(LONG volatile *Addend);\n  LONG __cdecl InterlockedDecrementRelease(LONG volatile *Addend);\n  LONGLONG __cdecl InterlockedExchange64 (LONGLONG volatile *Target,LONGLONG Value);\n  LONGLONG __cdecl InterlockedExchangeAcquire64 (LONGLONG volatile *Target,LONGLONG Value);\n  LONGLONG __cdecl InterlockedExchangeAdd64 (LONGLONG volatile *Addend,LONGLONG Value);\n  LONGLONG __cdecl InterlockedCompareExchange64 (LONGLONG volatile *Destination,LONGLONG ExChange,LONGLONG Comperand);\n  LONGLONG __cdecl InterlockedCompareExchangeAcquire64 (LONGLONG volatile *Destination,LONGLONG ExChange,LONGLONG Comperand);\n  LONGLONG __cdecl InterlockedCompareExchangeRelease64 (LONGLONG volatile *Destination,LONGLONG ExChange,LONGLONG Comperand);\n  LONG __cdecl InterlockedIncrement(LONG volatile *lpAddend);\n  LONG __cdecl InterlockedDecrement(LONG volatile *lpAddend);\n  LONG __cdecl InterlockedExchange(LONG volatile *Target,LONG Value);\n  LONG __cdecl InterlockedExchangeAdd(LONG volatile *Addend,LONG Value);\n  LONG __cdecl InterlockedCompareExchange(LONG volatile *Destination,LONG ExChange,LONG Comperand);\n  LONG __cdecl InterlockedCompareExchangeRelease(LONG volatile *Destination,LONG ExChange,LONG Comperand);\n  LONG __cdecl InterlockedCompareExchangeAcquire(LONG volatile *Destination,LONG ExChange,LONG Comperand);\n  PVOID __cdecl InterlockedExchangePointer(PVOID volatile *Target,PVOID Value);\n  PVOID __cdecl InterlockedCompareExchangePointer(PVOID volatile *Destination,PVOID ExChange,PVOID Comperand);\n  PVOID __cdecl InterlockedCompareExchangePointerAcquire(PVOID volatile *Destination,PVOID Exchange,PVOID Comperand);\n  PVOID __cdecl InterlockedCompareExchangePointerRelease(PVOID volatile *Destination,PVOID Exchange,PVOID Comperand);\n\n#ifndef InterlockedAnd\n#define InterlockedAnd InterlockedAnd_Inline\n  __CRT_INLINE LONG InterlockedAnd_Inline(LONG volatile *Target,LONG Set) {\n    LONG i;\n    LONG j;\n    j = *Target;\n    do {\n      i = j;\n      j = InterlockedCompareExchange(Target,i & Set,i);\n    } while(i!=j);\n    return j;\n  }\n#endif\n\n#ifndef InterlockedOr\n#define InterlockedOr InterlockedOr_Inline\n\n  __CRT_INLINE LONG InterlockedOr_Inline(LONG volatile *Target,LONG Set) {\n    LONG i;\n    LONG j;\n    j = *Target;\n    do {\n      i = j;\n      j = InterlockedCompareExchange(Target,i | Set,i);\n    } while(i!=j);\n    return j;\n  }\n#endif\n\n#ifndef InterlockedXor\n#define InterlockedXor InterlockedXor_Inline\n\n  __CRT_INLINE LONG InterlockedXor_Inline(LONG volatile *Target,LONG Set) {\n    LONG i;\n    LONG j;\n    j = *Target;\n    do {\n      i = j;\n      j = InterlockedCompareExchange(Target,i ^ Set,i);\n    } while(i!=j);\n    return j;\n  }\n#endif\n\n#ifndef !defined (InterlockedAnd64)\n#define InterlockedAnd64 InterlockedAnd64_Inline\n\n  __CRT_INLINE LONGLONG InterlockedAnd64_Inline (LONGLONG volatile *Destination,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Destination;\n    } while(InterlockedCompareExchange64(Destination,Old & Value,Old)!=Old);\n    return Old;\n  }\n#endif\n\n#ifndef InterlockedOr64\n#define InterlockedOr64 InterlockedOr64_Inline\n\n  __CRT_INLINE LONGLONG InterlockedOr64_Inline (LONGLONG volatile *Destination,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Destination;\n    } while(InterlockedCompareExchange64(Destination,Old | Value,Old)!=Old);\n    return Old;\n  }\n#endif\n\n#ifndef InterlockedXor64\n#define InterlockedXor64 InterlockedXor64_Inline\n\n  __CRT_INLINE LONGLONG InterlockedXor64_Inline (LONGLONG volatile *Destination,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Destination;\n    } while(InterlockedCompareExchange64(Destination,Old ^ Value,Old)!=Old);\n    return Old;\n  }\n#endif\n\n#ifndef InterlockedBitTestAndSet\n#define InterlockedBitTestAndSet InterlockedBitTestAndSet_Inline\n\n  __CRT_INLINE BOOLEAN InterlockedBitTestAndSet_Inline(LONG *Base,LONG Bit) {\n    LONG tBit;\n    tBit = 1<<(Bit & (sizeof (*Base)*8-1));\n    return (BOOLEAN)((InterlockedOr(&Base[Bit/(sizeof(*Base)*8)],tBit)&tBit)!=0);\n  }\n#endif\n\n#ifndef InterlockedBitTestAndReset\n#define InterlockedBitTestAndReset InterlockedBitTestAndReset_Inline\n\n  __CRT_INLINE BOOLEAN InterlockedBitTestAndReset_Inline(LONG *Base,LONG Bit) {\n    LONG tBit;\n    tBit = 1<<(Bit & (sizeof (*Base)*8-1));\n    return (BOOLEAN)((InterlockedAnd(&Base[Bit/(sizeof(*Base)*8)],~tBit)&tBit)!=0);\n  }\n#endif\n\n#ifndef InterlockedBitTestAndComplement\n#define InterlockedBitTestAndComplement InterlockedBitTestAndComplement_Inline\n\n  __CRT_INLINE BOOLEAN InterlockedBitTestAndComplement_Inline(LONG *Base,LONG Bit) {\n    LONG tBit;\n    tBit = 1<<(Bit & (sizeof (*Base)*8-1));\n    return (BOOLEAN)((InterlockedXor(&Base[Bit/(sizeof(*Base)*8)],tBit)&tBit)!=0);\n  }\n#endif\n#elif defined(__x86_64) && !defined(RC_INVOKED)\n\n#define InterlockedIncrement _InterlockedIncrement\n#define InterlockedIncrementAcquire InterlockedIncrement\n#define InterlockedIncrementRelease InterlockedIncrement\n#define InterlockedDecrement _InterlockedDecrement\n#define InterlockedDecrementAcquire InterlockedDecrement\n#define InterlockedDecrementRelease InterlockedDecrement\n#define InterlockedExchange _InterlockedExchange\n#define InterlockedExchangeAdd _InterlockedExchangeAdd\n#define InterlockedCompareExchange _InterlockedCompareExchange\n#define InterlockedCompareExchangeAcquire InterlockedCompareExchange\n#define InterlockedCompareExchangeRelease InterlockedCompareExchange\n#define InterlockedExchangePointer _InterlockedExchangePointer\n#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer\n#define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer\n#define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer\n#define InterlockedAnd64 _InterlockedAnd64\n#define InterlockedOr64 _InterlockedOr64\n#define InterlockedXor64 _InterlockedXor64\n#define InterlockedIncrement64 _InterlockedIncrement64\n#define InterlockedDecrement64 _InterlockedDecrement64\n#define InterlockedExchange64 _InterlockedExchange64\n#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64\n#define InterlockedCompareExchange64 _InterlockedCompareExchange64\n#define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64\n#define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64\n\n  LONG InterlockedIncrement(LONG volatile *Addend);\n  LONG InterlockedDecrement(LONG volatile *Addend);\n  LONG InterlockedExchange(LONG volatile *Target,LONG Value);\n  LONG InterlockedExchangeAdd(LONG volatile *Addend,LONG Value);\n  LONG InterlockedCompareExchange(LONG volatile *Destination,LONG ExChange,LONG Comperand);\n  PVOID InterlockedCompareExchangePointer(PVOID volatile *Destination,PVOID Exchange,PVOID Comperand);\n  PVOID InterlockedExchangePointer(PVOID volatile *Target,PVOID Value);\n  LONG64 InterlockedAnd64(LONG64 volatile *Destination,LONG64 Value);\n  LONG64 InterlockedOr64(LONG64 volatile *Destination,LONG64 Value);\n  LONG64 InterlockedXor64(LONG64 volatile *Destination,LONG64 Value);\n  LONG64 InterlockedIncrement64(LONG64 volatile *Addend);\n  LONG64 InterlockedDecrement64(LONG64 volatile *Addend);\n  LONG64 InterlockedExchange64(LONG64 volatile *Target,LONG64 Value);\n  LONG64 InterlockedExchangeAdd64(LONG64 volatile *Addend,LONG64 Value);\n  LONG64 InterlockedCompareExchange64(LONG64 volatile *Destination,LONG64 ExChange,LONG64 Comperand);\n#else\n  LONG InterlockedIncrement(LONG volatile *lpAddend);\n  LONG InterlockedDecrement(LONG volatile *lpAddend);\n  LONG InterlockedExchange(LONG volatile *Target,LONG Value);\n\n#define InterlockedExchangePointer(Target,Value) (PVOID)InterlockedExchange((PLONG)(Target),(LONG)(Value))\n\n  LONG InterlockedExchangeAdd(LONG volatile *Addend,LONG Value);\n  LONG InterlockedCompareExchange(LONG volatile *Destination,LONG Exchange,LONG Comperand);\n  LONGLONG InterlockedCompareExchange64(LONGLONG volatile *Destination,LONGLONG Exchange,LONGLONG Comperand);\n\n  __CRT_INLINE LONGLONG InterlockedAnd64 (LONGLONG volatile *Destination,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Destination;\n    } while(InterlockedCompareExchange64(Destination,Old & Value,Old)!=Old);\n    return Old;\n  }\n\n  __CRT_INLINE LONGLONG InterlockedOr64 (LONGLONG volatile *Destination,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Destination;\n    } while(InterlockedCompareExchange64(Destination,Old | Value,Old)!=Old);\n    return Old;\n  }\n\n  __CRT_INLINE LONGLONG InterlockedXor64 (LONGLONG volatile *Destination,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Destination;\n    } while(InterlockedCompareExchange64(Destination,Old ^ Value,Old)!=Old);\n\n    return Old;\n  }\n\n  __CRT_INLINE LONGLONG InterlockedIncrement64(LONGLONG volatile *Addend) {\n    LONGLONG Old;\n    do {\n      Old = *Addend;\n    } while(InterlockedCompareExchange64(Addend,Old + 1,Old)!=Old);\n    return Old + 1;\n  }\n\n  __CRT_INLINE LONGLONG InterlockedDecrement64(LONGLONG volatile *Addend) {\n    LONGLONG Old;\n    do {\n      Old = *Addend;\n    } while(InterlockedCompareExchange64(Addend,Old - 1,Old)!=Old);\n    return Old - 1;\n  }\n\n  __CRT_INLINE LONGLONG InterlockedExchange64(LONGLONG volatile *Target,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Target;\n    } while(InterlockedCompareExchange64(Target,Value,Old)!=Old);\n    return Old;\n  }\n\n  __CRT_INLINE LONGLONG InterlockedExchangeAdd64(LONGLONG volatile *Addend,LONGLONG Value) {\n    LONGLONG Old;\n    do {\n      Old = *Addend;\n    } while(InterlockedCompareExchange64(Addend,Old + Value,Old)!=Old);\n    return Old;\n  }\n\n#ifdef __cplusplus\n  __CRT_INLINE PVOID __cdecl __InlineInterlockedCompareExchangePointer(PVOID volatile *Destination,PVOID ExChange,PVOID Comperand) {\n    return((PVOID)(LONG_PTR)InterlockedCompareExchange((LONG volatile *)Destination,(LONG)(LONG_PTR)ExChange,(LONG)(LONG_PTR)Comperand));\n  }\n#define InterlockedCompareExchangePointer __InlineInterlockedCompareExchangePointer\n#else\n#define InterlockedCompareExchangePointer(Destination,ExChange,Comperand)(PVOID)(LONG_PTR)InterlockedCompareExchange((LONG volatile *)(Destination),(LONG)(LONG_PTR)(ExChange),(LONG)(LONG_PTR)(Comperand))\n#endif\n\n#define InterlockedIncrementAcquire InterlockedIncrement\n#define InterlockedIncrementRelease InterlockedIncrement\n#define InterlockedDecrementAcquire InterlockedDecrement\n#define InterlockedDecrementRelease InterlockedDecrement\n#define InterlockedIncrementAcquire InterlockedIncrement\n#define InterlockedIncrementRelease InterlockedIncrement\n#define InterlockedCompareExchangeAcquire InterlockedCompareExchange\n#define InterlockedCompareExchangeRelease InterlockedCompareExchange\n#define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64\n#define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64\n#define InterlockedCompareExchangePointerAcquire InterlockedCompareExchangePointer\n#define InterlockedCompareExchangePointerRelease InterlockedCompareExchangePointer\n#endif\n\n#if defined(_SLIST_HEADER_) && !defined(_NTOSP_)\n  WINBASEAPI VOID WINAPI InitializeSListHead(PSLIST_HEADER ListHead);\n  WINBASEAPI PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER ListHead);\n  WINBASEAPI PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER ListHead,PSLIST_ENTRY ListEntry);\n  WINBASEAPI PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER ListHead);\n  WINBASEAPI USHORT WINAPI QueryDepthSList(PSLIST_HEADER ListHead);\n#endif\n#endif\n#endif\n\n  WINBASEAPI WINBOOL WINAPI FreeResource(HGLOBAL hResData);\n  WINBASEAPI LPVOID WINAPI LockResource(HGLOBAL hResData);\n\n#define UnlockResource(hResData) ((hResData),0)\n#define MAXINTATOM 0xC000\n#define MAKEINTATOM(i) (LPTSTR)((ULONG_PTR)((WORD)(i)))\n#define INVALID_ATOM ((ATOM)0)\n\n  int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd);\n  WINBASEAPI WINBOOL WINAPI FreeLibrary(HMODULE hLibModule);\n  WINBASEAPI DECLSPEC_NORETURN VOID WINAPI FreeLibraryAndExitThread(HMODULE hLibModule,DWORD dwExitCode);\n  WINBASEAPI WINBOOL WINAPI DisableThreadLibraryCalls(HMODULE hLibModule);\n  WINBASEAPI FARPROC WINAPI GetProcAddress(HMODULE hModule,LPCSTR lpProcName);\n  WINBASEAPI DWORD WINAPI GetVersion(VOID);\n  WINBASEAPI HGLOBAL WINAPI GlobalAlloc(UINT uFlags,SIZE_T dwBytes);\n  WINBASEAPI HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem,SIZE_T dwBytes,UINT uFlags);\n  WINBASEAPI SIZE_T WINAPI GlobalSize(HGLOBAL hMem);\n  WINBASEAPI UINT WINAPI GlobalFlags(HGLOBAL hMem);\n  WINBASEAPI LPVOID WINAPI GlobalLock(HGLOBAL hMem);\n  WINBASEAPI HGLOBAL WINAPI GlobalHandle(LPCVOID pMem);\n  WINBASEAPI WINBOOL WINAPI GlobalUnlock(HGLOBAL hMem);\n  WINBASEAPI HGLOBAL WINAPI GlobalFree(HGLOBAL hMem);\n  WINBASEAPI SIZE_T WINAPI GlobalCompact(DWORD dwMinFree);\n  WINBASEAPI VOID WINAPI GlobalFix(HGLOBAL hMem);\n  WINBASEAPI VOID WINAPI GlobalUnfix(HGLOBAL hMem);\n  WINBASEAPI LPVOID WINAPI GlobalWire(HGLOBAL hMem);\n  WINBASEAPI WINBOOL WINAPI GlobalUnWire(HGLOBAL hMem);\n  WINBASEAPI VOID WINAPI GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);\n\n  typedef struct _MEMORYSTATUSEX {\n    DWORD dwLength;\n    DWORD dwMemoryLoad;\n    DWORDLONG ullTotalPhys;\n    DWORDLONG ullAvailPhys;\n    DWORDLONG ullTotalPageFile;\n    DWORDLONG ullAvailPageFile;\n    DWORDLONG ullTotalVirtual;\n    DWORDLONG ullAvailVirtual;\n    DWORDLONG ullAvailExtendedVirtual;\n  } MEMORYSTATUSEX,*LPMEMORYSTATUSEX;\n\n  WINBASEAPI WINBOOL WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer);\n  WINBASEAPI HLOCAL WINAPI LocalAlloc(UINT uFlags,SIZE_T uBytes);\n  WINBASEAPI HLOCAL WINAPI LocalReAlloc(HLOCAL hMem,SIZE_T uBytes,UINT uFlags);\n  WINBASEAPI LPVOID WINAPI LocalLock(HLOCAL hMem);\n  WINBASEAPI HLOCAL WINAPI LocalHandle(LPCVOID pMem);\n  WINBASEAPI WINBOOL WINAPI LocalUnlock(HLOCAL hMem);\n  WINBASEAPI SIZE_T WINAPI LocalSize(HLOCAL hMem);\n  WINBASEAPI UINT WINAPI LocalFlags(HLOCAL hMem);\n  WINBASEAPI HLOCAL WINAPI LocalFree(HLOCAL hMem);\n  WINBASEAPI SIZE_T WINAPI LocalShrink(HLOCAL hMem,UINT cbNewSize);\n  WINBASEAPI SIZE_T WINAPI LocalCompact(UINT uMinFree);\n  WINBASEAPI WINBOOL WINAPI FlushInstructionCache(HANDLE hProcess,LPCVOID lpBaseAddress,SIZE_T dwSize);\n  WINBASEAPI LPVOID WINAPI VirtualAlloc(LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect);\n  WINBASEAPI WINBOOL WINAPI VirtualFree(LPVOID lpAddress,SIZE_T dwSize,DWORD dwFreeType);\n  WINBASEAPI WINBOOL WINAPI VirtualProtect(LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,PDWORD lpflOldProtect);\n  WINBASEAPI SIZE_T WINAPI VirtualQuery(LPCVOID lpAddress,PMEMORY_BASIC_INFORMATION lpBuffer,SIZE_T dwLength);\n  WINBASEAPI LPVOID WINAPI VirtualAllocEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect);\n  WINBASEAPI UINT WINAPI GetWriteWatch(DWORD dwFlags,PVOID lpBaseAddress,SIZE_T dwRegionSize,PVOID *lpAddresses,ULONG_PTR *lpdwCount,PULONG lpdwGranularity);\n  WINBASEAPI UINT WINAPI ResetWriteWatch(LPVOID lpBaseAddress,SIZE_T dwRegionSize);\n  WINBASEAPI SIZE_T WINAPI GetLargePageMinimum(VOID);\n  WINBASEAPI UINT WINAPI EnumSystemFirmwareTables(DWORD FirmwareTableProviderSignature,PVOID pFirmwareTableEnumBuffer,DWORD BufferSize);\n  WINBASEAPI UINT WINAPI GetSystemFirmwareTable(DWORD FirmwareTableProviderSignature,DWORD FirmwareTableID,PVOID pFirmwareTableBuffer,DWORD BufferSize);\n  WINBASEAPI WINBOOL WINAPI VirtualFreeEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD dwFreeType);\n  WINBASEAPI WINBOOL WINAPI VirtualProtectEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,PDWORD lpflOldProtect);\n  WINBASEAPI SIZE_T WINAPI VirtualQueryEx(HANDLE hProcess,LPCVOID lpAddress,PMEMORY_BASIC_INFORMATION lpBuffer,SIZE_T dwLength);\n  WINBASEAPI HANDLE WINAPI HeapCreate(DWORD flOptions,SIZE_T dwInitialSize,SIZE_T dwMaximumSize);\n  WINBASEAPI WINBOOL WINAPI HeapDestroy(HANDLE hHeap);\n  WINBASEAPI LPVOID WINAPI HeapAlloc(HANDLE hHeap,DWORD dwFlags,SIZE_T dwBytes);\n  WINBASEAPI LPVOID WINAPI HeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,SIZE_T dwBytes);\n  WINBASEAPI WINBOOL WINAPI HeapFree(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem);\n  WINBASEAPI SIZE_T WINAPI HeapSize(HANDLE hHeap,DWORD dwFlags,LPCVOID lpMem);\n  WINBASEAPI WINBOOL WINAPI HeapValidate(HANDLE hHeap,DWORD dwFlags,LPCVOID lpMem);\n  WINBASEAPI SIZE_T WINAPI HeapCompact(HANDLE hHeap,DWORD dwFlags);\n  WINBASEAPI HANDLE WINAPI GetProcessHeap(VOID);\n  WINBASEAPI DWORD WINAPI GetProcessHeaps(DWORD NumberOfHeaps,PHANDLE ProcessHeaps);\n\n  typedef struct _PROCESS_HEAP_ENTRY {\n    PVOID lpData;\n    DWORD cbData;\n    BYTE cbOverhead;\n    BYTE iRegionIndex;\n    WORD wFlags;\n    union {\n      struct {\n\tHANDLE hMem;\n\tDWORD dwReserved[3];\n      } Block;\n      struct {\n\tDWORD dwCommittedSize;\n\tDWORD dwUnCommittedSize;\n\tLPVOID lpFirstBlock;\n\tLPVOID lpLastBlock;\n      } Region;\n    };\n  } PROCESS_HEAP_ENTRY,*LPPROCESS_HEAP_ENTRY,*PPROCESS_HEAP_ENTRY;\n\n#define PROCESS_HEAP_REGION 0x1\n#define PROCESS_HEAP_UNCOMMITTED_RANGE 0x2\n#define PROCESS_HEAP_ENTRY_BUSY 0x4\n#define PROCESS_HEAP_ENTRY_MOVEABLE 0x10\n#define PROCESS_HEAP_ENTRY_DDESHARE 0x20\n\n  WINBASEAPI WINBOOL WINAPI HeapLock(HANDLE hHeap);\n  WINBASEAPI WINBOOL WINAPI HeapUnlock(HANDLE hHeap);\n  WINBASEAPI WINBOOL WINAPI HeapWalk(HANDLE hHeap,LPPROCESS_HEAP_ENTRY lpEntry);\n  WINBASEAPI WINBOOL WINAPI HeapSetInformation(HANDLE HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength);\n  WINBASEAPI WINBOOL WINAPI HeapQueryInformation(HANDLE HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength,PSIZE_T ReturnLength);\n\n#define SCS_32BIT_BINARY 0\n#define SCS_DOS_BINARY 1\n#define SCS_WOW_BINARY 2\n#define SCS_PIF_BINARY 3\n#define SCS_POSIX_BINARY 4\n#define SCS_OS216_BINARY 5\n#define SCS_64BIT_BINARY 6\n\n#ifdef UNICODE\n#define GetBinaryType GetBinaryTypeW\n#define GetShortPathName GetShortPathNameW\n#define GetLongPathName GetLongPathNameW\n#define GetEnvironmentStrings GetEnvironmentStringsW\n#define SetEnvironmentStrings SetEnvironmentStringsW\n#define FreeEnvironmentStrings FreeEnvironmentStringsW\n#else\n#define GetBinaryType GetBinaryTypeA\n#define GetShortPathName GetShortPathNameA\n#define GetLongPathName GetLongPathNameA\n#define GetEnvironmentStringsA GetEnvironmentStrings\n#define SetEnvironmentStrings SetEnvironmentStringsA\n#define FreeEnvironmentStrings FreeEnvironmentStringsA\n#endif\n\n#ifdef _WIN64\n#define SCS_THIS_PLATFORM_BINARY SCS_64BIT_BINARY\n#else\n#define SCS_THIS_PLATFORM_BINARY SCS_32BIT_BINARY\n#endif\n\n  WINBASEAPI WINBOOL WINAPI GetBinaryTypeA(LPCSTR lpApplicationName,LPDWORD lpBinaryType);\n  WINBASEAPI WINBOOL WINAPI GetBinaryTypeW(LPCWSTR lpApplicationName,LPDWORD lpBinaryType);\n  WINBASEAPI DWORD WINAPI GetShortPathNameA(LPCSTR lpszLongPath,LPSTR lpszShortPath,DWORD cchBuffer);\n  WINBASEAPI DWORD WINAPI GetShortPathNameW(LPCWSTR lpszLongPath,LPWSTR lpszShortPath,DWORD cchBuffer);\n  WINBASEAPI DWORD WINAPI GetLongPathNameA(LPCSTR lpszShortPath,LPSTR lpszLongPath,DWORD cchBuffer);\n  WINBASEAPI DWORD WINAPI GetLongPathNameW(LPCWSTR lpszShortPath,LPWSTR lpszLongPath,DWORD cchBuffer);\n  WINBASEAPI WINBOOL WINAPI GetProcessAffinityMask(HANDLE hProcess,PDWORD_PTR lpProcessAffinityMask,PDWORD_PTR lpSystemAffinityMask);\n  WINBASEAPI WINBOOL WINAPI SetProcessAffinityMask(HANDLE hProcess,DWORD_PTR dwProcessAffinityMask);\n  WINBASEAPI WINBOOL WINAPI GetProcessHandleCount(HANDLE hProcess,PDWORD pdwHandleCount);\n  WINBASEAPI WINBOOL WINAPI GetProcessTimes(HANDLE hProcess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime);\n  WINBASEAPI WINBOOL WINAPI GetProcessIoCounters(HANDLE hProcess,PIO_COUNTERS lpIoCounters);\n  WINBASEAPI WINBOOL WINAPI GetProcessWorkingSetSize(HANDLE hProcess,PSIZE_T lpMinimumWorkingSetSize,PSIZE_T lpMaximumWorkingSetSize);\n  WINBASEAPI WINBOOL WINAPI GetProcessWorkingSetSizeEx(HANDLE hProcess,PSIZE_T lpMinimumWorkingSetSize,PSIZE_T lpMaximumWorkingSetSize,PDWORD Flags);\n  WINBASEAPI WINBOOL WINAPI SetProcessWorkingSetSize(HANDLE hProcess,SIZE_T dwMinimumWorkingSetSize,SIZE_T dwMaximumWorkingSetSize);\n  WINBASEAPI WINBOOL WINAPI SetProcessWorkingSetSizeEx(HANDLE hProcess,SIZE_T dwMinimumWorkingSetSize,SIZE_T dwMaximumWorkingSetSize,DWORD Flags);\n  WINBASEAPI HANDLE WINAPI OpenProcess(DWORD dwDesiredAccess,WINBOOL bInheritHandle,DWORD dwProcessId);\n  WINBASEAPI HANDLE WINAPI GetCurrentProcess(VOID);\n  WINBASEAPI DWORD WINAPI GetCurrentProcessId(VOID);\n  WINBASEAPI DECLSPEC_NORETURN VOID WINAPI ExitProcess(UINT uExitCode);\n  WINBASEAPI WINBOOL WINAPI TerminateProcess(HANDLE hProcess,UINT uExitCode);\n  WINBASEAPI WINBOOL WINAPI GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode);\n  WINBASEAPI VOID WINAPI FatalExit(int ExitCode);\n  /*\tWINBASEAPI LPCH WINAPI GetEnvironmentStrings(VOID); */\n  WINBASEAPI LPWCH WINAPI GetEnvironmentStringsW(VOID);\n  WINBASEAPI WINBOOL WINAPI SetEnvironmentStringsA(LPCH NewEnvironment);\n  WINBASEAPI WINBOOL WINAPI SetEnvironmentStringsW(LPWCH NewEnvironment);\n  WINBASEAPI WINBOOL WINAPI FreeEnvironmentStringsA(LPCH);\n  WINBASEAPI WINBOOL WINAPI FreeEnvironmentStringsW(LPWCH);\n  WINBASEAPI VOID WINAPI RaiseException(DWORD dwExceptionCode,DWORD dwExceptionFlags,DWORD nNumberOfArguments,CONST ULONG_PTR *lpArguments);\n  WINBASEAPI LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo);\n\n  typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(struct _EXCEPTION_POINTERS *ExceptionInfo);\n  typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;\n\n  WINBASEAPI LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);\n\n#define FIBER_FLAG_FLOAT_SWITCH 0x1\n\n  WINBASEAPI LPVOID WINAPI CreateFiber(SIZE_T dwStackSize,LPFIBER_START_ROUTINE lpStartAddress,LPVOID lpParameter);\n  WINBASEAPI LPVOID WINAPI CreateFiberEx(SIZE_T dwStackCommitSize,SIZE_T dwStackReserveSize,DWORD dwFlags,LPFIBER_START_ROUTINE lpStartAddress,LPVOID lpParameter);\n  WINBASEAPI VOID WINAPI DeleteFiber(LPVOID lpFiber);\n  WINBASEAPI LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter);\n  WINBASEAPI LPVOID WINAPI ConvertThreadToFiberEx(LPVOID lpParameter,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI ConvertFiberToThread(VOID);\n  WINBASEAPI VOID WINAPI SwitchToFiber(LPVOID lpFiber);\n  WINBASEAPI WINBOOL WINAPI SwitchToThread(VOID);\n  WINBASEAPI HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);\n  WINBASEAPI HANDLE WINAPI CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);\n  WINBASEAPI HANDLE WINAPI GetCurrentThread(VOID);\n  WINBASEAPI DWORD WINAPI GetCurrentThreadId(VOID);\n  WINBASEAPI WINBOOL WINAPI SetThreadStackGuarantee (PULONG StackSizeInBytes);\n  WINBASEAPI DWORD WINAPI GetProcessIdOfThread(HANDLE Thread);\n  WINBASEAPI DWORD WINAPI GetThreadId(HANDLE Thread);\n  WINBASEAPI DWORD WINAPI GetProcessId(HANDLE Process);\n  WINBASEAPI DWORD WINAPI GetCurrentProcessorNumber(VOID);\n  WINBASEAPI DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE hThread,DWORD_PTR dwThreadAffinityMask);\n  WINBASEAPI DWORD WINAPI SetThreadIdealProcessor(HANDLE hThread,DWORD dwIdealProcessor);\n  WINBASEAPI WINBOOL WINAPI SetProcessPriorityBoost(HANDLE hProcess,WINBOOL bDisablePriorityBoost);\n  WINBASEAPI WINBOOL WINAPI GetProcessPriorityBoost(HANDLE hProcess,PBOOL pDisablePriorityBoost);\n  WINBASEAPI WINBOOL WINAPI RequestWakeupLatency(LATENCY_TIME latency);\n  WINBASEAPI WINBOOL WINAPI IsSystemResumeAutomatic(VOID);\n  WINBASEAPI HANDLE WINAPI OpenThread(DWORD dwDesiredAccess,WINBOOL bInheritHandle,DWORD dwThreadId);\n  WINBASEAPI WINBOOL WINAPI SetThreadPriority(HANDLE hThread,int nPriority);\n  WINBASEAPI WINBOOL WINAPI SetThreadPriorityBoost(HANDLE hThread,WINBOOL bDisablePriorityBoost);\n  WINBASEAPI WINBOOL WINAPI GetThreadPriorityBoost(HANDLE hThread,PBOOL pDisablePriorityBoost);\n  WINBASEAPI int WINAPI GetThreadPriority(HANDLE hThread);\n  WINBASEAPI WINBOOL WINAPI GetThreadTimes(HANDLE hThread,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime);\n  WINBASEAPI WINBOOL WINAPI GetThreadIOPendingFlag(HANDLE hThread,PBOOL lpIOIsPending);\n  WINBASEAPI DECLSPEC_NORETURN VOID WINAPI ExitThread(DWORD dwExitCode);\n  WINBASEAPI WINBOOL WINAPI TerminateThread(HANDLE hThread,DWORD dwExitCode);\n  WINBASEAPI WINBOOL WINAPI GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode);\n  WINBASEAPI WINBOOL WINAPI GetThreadSelectorEntry(HANDLE hThread,DWORD dwSelector,LPLDT_ENTRY lpSelectorEntry);\n  WINBASEAPI EXECUTION_STATE WINAPI SetThreadExecutionState(EXECUTION_STATE esFlags);\n  WINBASEAPI DWORD WINAPI GetLastError(VOID);\n  WINBASEAPI VOID WINAPI SetLastError(DWORD dwErrCode);\n\n#ifndef RC_INVOKED\n#ifdef WINBASE_DECLARE_RESTORE_LAST_ERROR\n  WINBASEAPI VOID WINAPI RestoreLastError(DWORD dwErrCode);\n\n  typedef VOID (WINAPI *PRESTORE_LAST_ERROR)(DWORD);\n\n#define RESTORE_LAST_ERROR_NAME_A \"RestoreLastError\"\n#define RESTORE_LAST_ERROR_NAME_W L\"RestoreLastError\"\n#define RESTORE_LAST_ERROR_NAME TEXT(\"RestoreLastError\")\n#endif\n#endif\n\n#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal)!=STATUS_PENDING)\n\n  WINBASEAPI WINBOOL WINAPI GetOverlappedResult(HANDLE hFile,LPOVERLAPPED lpOverlapped,LPDWORD lpNumberOfBytesTransferred,WINBOOL bWait);\n  WINBASEAPI HANDLE WINAPI CreateIoCompletionPort(HANDLE FileHandle,HANDLE ExistingCompletionPort,ULONG_PTR CompletionKey,DWORD NumberOfConcurrentThreads);\n  WINBASEAPI WINBOOL WINAPI GetQueuedCompletionStatus(HANDLE CompletionPort,LPDWORD lpNumberOfBytesTransferred,PULONG_PTR lpCompletionKey,LPOVERLAPPED *lpOverlapped,DWORD dwMilliseconds);\n  WINBASEAPI WINBOOL WINAPI PostQueuedCompletionStatus(HANDLE CompletionPort,DWORD dwNumberOfBytesTransferred,ULONG_PTR dwCompletionKey,LPOVERLAPPED lpOverlapped);\n\n#define SEM_FAILCRITICALERRORS 0x1\n#define SEM_NOGPFAULTERRORBOX 0x2\n#define SEM_NOALIGNMENTFAULTEXCEPT 0x4\n#define SEM_NOOPENFILEERRORBOX 0x8000\n\n  WINBASEAPI UINT WINAPI SetErrorMode(UINT uMode);\n  WINBASEAPI WINBOOL WINAPI ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddress,LPVOID lpBuffer,SIZE_T nSize,SIZE_T *lpNumberOfBytesRead);\n  WINBASEAPI WINBOOL WINAPI WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPCVOID lpBuffer,SIZE_T nSize,SIZE_T *lpNumberOfBytesWritten);\n  WINBASEAPI WINBOOL WINAPI GetThreadContext(HANDLE hThread,LPCONTEXT lpContext);\n  WINBASEAPI WINBOOL WINAPI SetThreadContext(HANDLE hThread,CONST CONTEXT *lpContext);\n  WINBASEAPI DWORD WINAPI SuspendThread(HANDLE hThread);\n  WINBASEAPI DWORD WINAPI ResumeThread(HANDLE hThread);\n\n  typedef VOID (WINAPI *PAPCFUNC)(ULONG_PTR dwParam);\n\n  WINBASEAPI DWORD WINAPI QueueUserAPC(PAPCFUNC pfnAPC,HANDLE hThread,ULONG_PTR dwData);\n  WINBASEAPI WINBOOL WINAPI IsDebuggerPresent(VOID);\n  WINBASEAPI WINBOOL WINAPI CheckRemoteDebuggerPresent(HANDLE hProcess,PBOOL pbDebuggerPresent);\n  WINBASEAPI VOID WINAPI DebugBreak(VOID);\n  WINBASEAPI WINBOOL WINAPI WaitForDebugEvent(LPDEBUG_EVENT lpDebugEvent,DWORD dwMilliseconds);\n  WINBASEAPI WINBOOL WINAPI ContinueDebugEvent(DWORD dwProcessId,DWORD dwThreadId,DWORD dwContinueStatus);\n  WINBASEAPI WINBOOL WINAPI DebugActiveProcess(DWORD dwProcessId);\n  WINBASEAPI WINBOOL WINAPI DebugActiveProcessStop(DWORD dwProcessId);\n  WINBASEAPI WINBOOL WINAPI DebugSetProcessKillOnExit(WINBOOL KillOnExit);\n  WINBASEAPI WINBOOL WINAPI DebugBreakProcess(HANDLE Process);\n  WINBASEAPI VOID WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);\n  WINBASEAPI VOID WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);\n  WINBASEAPI VOID WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);\n  WINBASEAPI WINBOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection,DWORD dwSpinCount);\n  WINBASEAPI DWORD WINAPI SetCriticalSectionSpinCount(LPCRITICAL_SECTION lpCriticalSection,DWORD dwSpinCount);\n  WINBASEAPI WINBOOL WINAPI TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);\n  WINBASEAPI VOID WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);\n  WINBASEAPI WINBOOL WINAPI SetEvent(HANDLE hEvent);\n  WINBASEAPI WINBOOL WINAPI ResetEvent(HANDLE hEvent);\n  WINBASEAPI WINBOOL WINAPI PulseEvent(HANDLE hEvent);\n  WINBASEAPI WINBOOL WINAPI ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount);\n  WINBASEAPI WINBOOL WINAPI ReleaseMutex(HANDLE hMutex);\n  WINBASEAPI DWORD WINAPI WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);\n  WINBASEAPI DWORD WINAPI WaitForMultipleObjects(DWORD nCount,CONST HANDLE *lpHandles,WINBOOL bWaitAll,DWORD dwMilliseconds);\n  WINBASEAPI VOID WINAPI Sleep(DWORD dwMilliseconds);\n  WINBASEAPI HGLOBAL WINAPI LoadResource(HMODULE hModule,HRSRC hResInfo);\n  WINBASEAPI DWORD WINAPI SizeofResource(HMODULE hModule,HRSRC hResInfo);\n  WINBASEAPI ATOM WINAPI GlobalDeleteAtom(ATOM nAtom);\n  WINBASEAPI WINBOOL WINAPI InitAtomTable(DWORD nSize);\n  WINBASEAPI ATOM WINAPI DeleteAtom(ATOM nAtom);\n  WINBASEAPI UINT WINAPI SetHandleCount(UINT uNumber);\n  WINBASEAPI DWORD WINAPI GetLogicalDrives(VOID);\n  WINBASEAPI WINBOOL WINAPI LockFile(HANDLE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh);\n  WINBASEAPI WINBOOL WINAPI UnlockFile(HANDLE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh);\n  WINBASEAPI WINBOOL WINAPI LockFileEx(HANDLE hFile,DWORD dwFlags,DWORD dwReserved,DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh,LPOVERLAPPED lpOverlapped);\n\n#define LOCKFILE_FAIL_IMMEDIATELY 0x1\n#define LOCKFILE_EXCLUSIVE_LOCK 0x2\n\n  WINBASEAPI WINBOOL WINAPI UnlockFileEx(HANDLE hFile,DWORD dwReserved,DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh,LPOVERLAPPED lpOverlapped);\n\n  typedef struct _BY_HANDLE_FILE_INFORMATION {\n    DWORD dwFileAttributes;\n    FILETIME ftCreationTime;\n    FILETIME ftLastAccessTime;\n    FILETIME ftLastWriteTime;\n    DWORD dwVolumeSerialNumber;\n    DWORD nFileSizeHigh;\n    DWORD nFileSizeLow;\n    DWORD nNumberOfLinks;\n    DWORD nFileIndexHigh;\n    DWORD nFileIndexLow;\n  } BY_HANDLE_FILE_INFORMATION,*PBY_HANDLE_FILE_INFORMATION,*LPBY_HANDLE_FILE_INFORMATION;\n\n#ifdef UNICODE\n#define SetFileShortName SetFileShortNameW\n#else\n#define SetFileShortName SetFileShortNameA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI GetFileInformationByHandle(HANDLE hFile,LPBY_HANDLE_FILE_INFORMATION lpFileInformation);\n  WINBASEAPI DWORD WINAPI GetFileType(HANDLE hFile);\n  WINBASEAPI DWORD WINAPI GetFileSize(HANDLE hFile,LPDWORD lpFileSizeHigh);\n  WINBASEAPI WINBOOL WINAPI GetFileSizeEx(HANDLE hFile,PLARGE_INTEGER lpFileSize);\n  WINBASEAPI HANDLE WINAPI GetStdHandle(DWORD nStdHandle);\n  WINBASEAPI WINBOOL WINAPI SetStdHandle(DWORD nStdHandle,HANDLE hHandle);\n  WINBASEAPI WINBOOL WINAPI WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped);\n  WINBASEAPI WINBOOL WINAPI ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped);\n  WINBASEAPI WINBOOL WINAPI FlushFileBuffers(HANDLE hFile);\n  WINBASEAPI WINBOOL WINAPI DeviceIoControl(HANDLE hDevice,DWORD dwIoControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped);\n  WINBASEAPI WINBOOL WINAPI RequestDeviceWakeup(HANDLE hDevice);\n  WINBASEAPI WINBOOL WINAPI CancelDeviceWakeupRequest(HANDLE hDevice);\n  WINBASEAPI WINBOOL WINAPI GetDevicePowerState(HANDLE hDevice,WINBOOL *pfOn);\n  WINBASEAPI WINBOOL WINAPI SetMessageWaitingIndicator(HANDLE hMsgIndicator,ULONG ulMsgCount);\n  WINBASEAPI WINBOOL WINAPI SetEndOfFile(HANDLE hFile);\n  WINBASEAPI DWORD WINAPI SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);\n  WINBASEAPI WINBOOL WINAPI SetFilePointerEx(HANDLE hFile,LARGE_INTEGER liDistanceToMove,PLARGE_INTEGER lpNewFilePointer,DWORD dwMoveMethod);\n  WINBASEAPI WINBOOL WINAPI FindClose(HANDLE hFindFile);\n  WINBASEAPI WINBOOL WINAPI GetFileTime(HANDLE hFile,LPFILETIME lpCreationTime,LPFILETIME lpLastAccessTime,LPFILETIME lpLastWriteTime);\n  WINBASEAPI WINBOOL WINAPI SetFileTime(HANDLE hFile,CONST FILETIME *lpCreationTime,CONST FILETIME *lpLastAccessTime,CONST FILETIME *lpLastWriteTime);\n  WINBASEAPI WINBOOL WINAPI SetFileValidData(HANDLE hFile,LONGLONG ValidDataLength);\n  WINBASEAPI WINBOOL WINAPI SetFileShortNameA(HANDLE hFile,LPCSTR lpShortName);\n  WINBASEAPI WINBOOL WINAPI SetFileShortNameW(HANDLE hFile,LPCWSTR lpShortName);\n  WINBASEAPI WINBOOL WINAPI CloseHandle(HANDLE hObject);\n  WINBASEAPI WINBOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,HANDLE hSourceHandle,HANDLE hTargetProcessHandle,LPHANDLE lpTargetHandle,DWORD dwDesiredAccess,WINBOOL bInheritHandle,DWORD dwOptions);\n  WINBASEAPI WINBOOL WINAPI GetHandleInformation(HANDLE hObject,LPDWORD lpdwFlags);\n  WINBASEAPI WINBOOL WINAPI SetHandleInformation(HANDLE hObject,DWORD dwMask,DWORD dwFlags);\n\n#define HANDLE_FLAG_INHERIT 0x1\n#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x2\n\n#define HINSTANCE_ERROR 32\n\n  WINBASEAPI DWORD WINAPI LoadModule(LPCSTR lpModuleName,LPVOID lpParameterBlock);\n  WINBASEAPI UINT WINAPI WinExec(LPCSTR lpCmdLine,UINT uCmdShow);\n  WINBASEAPI WINBOOL WINAPI ClearCommBreak(HANDLE hFile);\n  WINBASEAPI WINBOOL WINAPI ClearCommError(HANDLE hFile,LPDWORD lpErrors,LPCOMSTAT lpStat);\n  WINBASEAPI WINBOOL WINAPI SetupComm(HANDLE hFile,DWORD dwInQueue,DWORD dwOutQueue);\n  WINBASEAPI WINBOOL WINAPI EscapeCommFunction(HANDLE hFile,DWORD dwFunc);\n  WINBASEAPI WINBOOL WINAPI GetCommConfig(HANDLE hCommDev,LPCOMMCONFIG lpCC,LPDWORD lpdwSize);\n  WINBASEAPI WINBOOL WINAPI GetCommMask(HANDLE hFile,LPDWORD lpEvtMask);\n  WINBASEAPI WINBOOL WINAPI GetCommProperties(HANDLE hFile,LPCOMMPROP lpCommProp);\n  WINBASEAPI WINBOOL WINAPI GetCommModemStatus(HANDLE hFile,LPDWORD lpModemStat);\n  WINBASEAPI WINBOOL WINAPI GetCommState(HANDLE hFile,LPDCB lpDCB);\n  WINBASEAPI WINBOOL WINAPI GetCommTimeouts(HANDLE hFile,LPCOMMTIMEOUTS lpCommTimeouts);\n  WINBASEAPI WINBOOL WINAPI PurgeComm(HANDLE hFile,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI SetCommBreak(HANDLE hFile);\n  WINBASEAPI WINBOOL WINAPI SetCommConfig(HANDLE hCommDev,LPCOMMCONFIG lpCC,DWORD dwSize);\n  WINBASEAPI WINBOOL WINAPI SetCommMask(HANDLE hFile,DWORD dwEvtMask);\n  WINBASEAPI WINBOOL WINAPI SetCommState(HANDLE hFile,LPDCB lpDCB);\n  WINBASEAPI WINBOOL WINAPI SetCommTimeouts(HANDLE hFile,LPCOMMTIMEOUTS lpCommTimeouts);\n  WINBASEAPI WINBOOL WINAPI TransmitCommChar(HANDLE hFile,char cChar);\n  WINBASEAPI WINBOOL WINAPI WaitCommEvent(HANDLE hFile,LPDWORD lpEvtMask,LPOVERLAPPED lpOverlapped);\n  WINBASEAPI DWORD WINAPI SetTapePosition(HANDLE hDevice,DWORD dwPositionMethod,DWORD dwPartition,DWORD dwOffsetLow,DWORD dwOffsetHigh,WINBOOL bImmediate);\n  WINBASEAPI DWORD WINAPI GetTapePosition(HANDLE hDevice,DWORD dwPositionType,LPDWORD lpdwPartition,LPDWORD lpdwOffsetLow,LPDWORD lpdwOffsetHigh);\n  WINBASEAPI DWORD WINAPI PrepareTape(HANDLE hDevice,DWORD dwOperation,WINBOOL bImmediate);\n  WINBASEAPI DWORD WINAPI EraseTape(HANDLE hDevice,DWORD dwEraseType,WINBOOL bImmediate);\n  WINBASEAPI DWORD WINAPI CreateTapePartition(HANDLE hDevice,DWORD dwPartitionMethod,DWORD dwCount,DWORD dwSize);\n  WINBASEAPI DWORD WINAPI WriteTapemark(HANDLE hDevice,DWORD dwTapemarkType,DWORD dwTapemarkCount,WINBOOL bImmediate);\n  WINBASEAPI DWORD WINAPI GetTapeStatus(HANDLE hDevice);\n  WINBASEAPI DWORD WINAPI GetTapeParameters(HANDLE hDevice,DWORD dwOperation,LPDWORD lpdwSize,LPVOID lpTapeInformation);\n\n#define GET_TAPE_MEDIA_INFORMATION 0\n#define GET_TAPE_DRIVE_INFORMATION 1\n\n  WINBASEAPI DWORD WINAPI SetTapeParameters(HANDLE hDevice,DWORD dwOperation,LPVOID lpTapeInformation);\n\n#define SET_TAPE_MEDIA_INFORMATION 0\n#define SET_TAPE_DRIVE_INFORMATION 1\n\n  WINBASEAPI WINBOOL WINAPI Beep(DWORD dwFreq,DWORD dwDuration);\n  WINBASEAPI int WINAPI MulDiv(int nNumber,int nNumerator,int nDenominator);\n  WINBASEAPI VOID WINAPI GetSystemTime(LPSYSTEMTIME lpSystemTime);\n  WINBASEAPI VOID WINAPI GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime);\n  WINBASEAPI WINBOOL WINAPI SetSystemTime(CONST SYSTEMTIME *lpSystemTime);\n  WINBASEAPI VOID WINAPI GetLocalTime(LPSYSTEMTIME lpSystemTime);\n  WINBASEAPI WINBOOL WINAPI SetLocalTime(CONST SYSTEMTIME *lpSystemTime);\n  WINBASEAPI VOID WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);\n  WINBASEAPI WINBOOL WINAPI SetSystemFileCacheSize(SIZE_T MinimumFileCacheSize,SIZE_T MaximumFileCacheSize,DWORD Flags);\n  WINBASEAPI WINBOOL WINAPI GetSystemFileCacheSize(PSIZE_T lpMinimumFileCacheSize,PSIZE_T lpMaximumFileCacheSize,PDWORD lpFlags);\n  WINBASEAPI WINBOOL WINAPI GetSystemRegistryQuota(PDWORD pdwQuotaAllowed,PDWORD pdwQuotaUsed);\n  WINBOOL WINAPI GetSystemTimes(LPFILETIME lpIdleTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime);\n  WINBASEAPI VOID WINAPI GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo);\n  WINBASEAPI WINBOOL WINAPI IsProcessorFeaturePresent(DWORD ProcessorFeature);\n\n  typedef struct _TIME_ZONE_INFORMATION {\n    LONG Bias;\n    WCHAR StandardName[32];\n    SYSTEMTIME StandardDate;\n    LONG StandardBias;\n    WCHAR DaylightName[32];\n    SYSTEMTIME DaylightDate;\n    LONG DaylightBias;\n  } TIME_ZONE_INFORMATION,*PTIME_ZONE_INFORMATION,*LPTIME_ZONE_INFORMATION;\n\n#ifdef UNICODE\n#define FormatMessage FormatMessageW\n#else\n#define FormatMessage FormatMessageA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,LPSYSTEMTIME lpUniversalTime,LPSYSTEMTIME lpLocalTime);\n  WINBASEAPI WINBOOL WINAPI TzSpecificLocalTimeToSystemTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,LPSYSTEMTIME lpLocalTime,LPSYSTEMTIME lpUniversalTime);\n  WINBASEAPI DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation);\n  WINBASEAPI WINBOOL WINAPI SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation);\n  WINBASEAPI WINBOOL WINAPI SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime,LPFILETIME lpFileTime);\n  WINBASEAPI WINBOOL WINAPI FileTimeToLocalFileTime(CONST FILETIME *lpFileTime,LPFILETIME lpLocalFileTime);\n  WINBASEAPI WINBOOL WINAPI LocalFileTimeToFileTime(CONST FILETIME *lpLocalFileTime,LPFILETIME lpFileTime);\n  WINBASEAPI WINBOOL WINAPI FileTimeToSystemTime(CONST FILETIME *lpFileTime,LPSYSTEMTIME lpSystemTime);\n  WINBASEAPI LONG WINAPI CompareFileTime(CONST FILETIME *lpFileTime1,CONST FILETIME *lpFileTime2);\n  WINBASEAPI WINBOOL WINAPI FileTimeToDosDateTime(CONST FILETIME *lpFileTime,LPWORD lpFatDate,LPWORD lpFatTime);\n  WINBASEAPI WINBOOL WINAPI DosDateTimeToFileTime(WORD wFatDate,WORD wFatTime,LPFILETIME lpFileTime);\n  WINBASEAPI DWORD WINAPI GetTickCount(VOID);\n  WINBASEAPI WINBOOL WINAPI SetSystemTimeAdjustment(DWORD dwTimeAdjustment,WINBOOL bTimeAdjustmentDisabled);\n  WINBASEAPI WINBOOL WINAPI GetSystemTimeAdjustment(PDWORD lpTimeAdjustment,PDWORD lpTimeIncrement,PBOOL lpTimeAdjustmentDisabled);\n  WINBASEAPI DWORD WINAPI FormatMessageA(DWORD dwFlags,LPCVOID lpSource,DWORD dwMessageId,DWORD dwLanguageId,LPSTR lpBuffer,DWORD nSize,va_list *Arguments);\n  WINBASEAPI DWORD WINAPI FormatMessageW(DWORD dwFlags,LPCVOID lpSource,DWORD dwMessageId,DWORD dwLanguageId,LPWSTR lpBuffer,DWORD nSize,va_list *Arguments);\n\n#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x100\n#define FORMAT_MESSAGE_IGNORE_INSERTS 0x200\n#define FORMAT_MESSAGE_FROM_STRING 0x400\n#define FORMAT_MESSAGE_FROM_HMODULE 0x800\n#define FORMAT_MESSAGE_FROM_SYSTEM 0x1000\n#define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x2000\n#define FORMAT_MESSAGE_MAX_WIDTH_MASK 0xff\n\n#ifdef UNICODE\n#define CreateMailslot CreateMailslotW\n#define EncryptFile EncryptFileW\n#define DecryptFile DecryptFileW\n#define FileEncryptionStatus FileEncryptionStatusW\n#else\n#define CreateMailslot CreateMailslotA\n#define EncryptFile EncryptFileA\n#define DecryptFile DecryptFileA\n#define FileEncryptionStatus FileEncryptionStatusA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI CreatePipe(PHANDLE hReadPipe,PHANDLE hWritePipe,LPSECURITY_ATTRIBUTES lpPipeAttributes,DWORD nSize);\n  WINBASEAPI WINBOOL WINAPI ConnectNamedPipe(HANDLE hNamedPipe,LPOVERLAPPED lpOverlapped);\n  WINBASEAPI WINBOOL WINAPI DisconnectNamedPipe(HANDLE hNamedPipe);\n  WINBASEAPI WINBOOL WINAPI SetNamedPipeHandleState(HANDLE hNamedPipe,LPDWORD lpMode,LPDWORD lpMaxCollectionCount,LPDWORD lpCollectDataTimeout);\n  WINBASEAPI WINBOOL WINAPI GetNamedPipeInfo(HANDLE hNamedPipe,LPDWORD lpFlags,LPDWORD lpOutBufferSize,LPDWORD lpInBufferSize,LPDWORD lpMaxInstances);\n  WINBASEAPI WINBOOL WINAPI PeekNamedPipe(HANDLE hNamedPipe,LPVOID lpBuffer,DWORD nBufferSize,LPDWORD lpBytesRead,LPDWORD lpTotalBytesAvail,LPDWORD lpBytesLeftThisMessage);\n  WINBASEAPI WINBOOL WINAPI TransactNamedPipe(HANDLE hNamedPipe,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesRead,LPOVERLAPPED lpOverlapped);\n  WINBASEAPI HANDLE WINAPI CreateMailslotA(LPCSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI HANDLE WINAPI CreateMailslotW(LPCWSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI WINBOOL WINAPI GetMailslotInfo(HANDLE hMailslot,LPDWORD lpMaxMessageSize,LPDWORD lpNextSize,LPDWORD lpMessageCount,LPDWORD lpReadTimeout);\n  WINBASEAPI WINBOOL WINAPI SetMailslotInfo(HANDLE hMailslot,DWORD lReadTimeout);\n  WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap);\n  WINBASEAPI WINBOOL WINAPI FlushViewOfFile(LPCVOID lpBaseAddress,SIZE_T dwNumberOfBytesToFlush);\n  WINBASEAPI WINBOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress);\n  WINADVAPI WINBOOL WINAPI EncryptFileA(LPCSTR lpFileName);\n  WINADVAPI WINBOOL WINAPI EncryptFileW(LPCWSTR lpFileName);\n  WINADVAPI WINBOOL WINAPI DecryptFileA(LPCSTR lpFileName,DWORD dwReserved);\n  WINADVAPI WINBOOL WINAPI DecryptFileW(LPCWSTR lpFileName,DWORD dwReserved);\n\n#define FILE_ENCRYPTABLE 0\n#define FILE_IS_ENCRYPTED 1\n#define FILE_SYSTEM_ATTR 2\n#define FILE_ROOT_DIR 3\n#define FILE_SYSTEM_DIR 4\n#define FILE_UNKNOWN 5\n#define FILE_SYSTEM_NOT_SUPPORT 6\n#define FILE_USER_DISALLOWED 7\n#define FILE_READ_ONLY 8\n#define FILE_DIR_DISALLOWED 9\n\n  WINADVAPI WINBOOL WINAPI FileEncryptionStatusA(LPCSTR lpFileName,LPDWORD lpStatus);\n  WINADVAPI WINBOOL WINAPI FileEncryptionStatusW(LPCWSTR lpFileName,LPDWORD lpStatus);\n\n#define EFS_USE_RECOVERY_KEYS (0x1)\n\n  typedef DWORD (WINAPI *PFE_EXPORT_FUNC)(PBYTE pbData,PVOID pvCallbackContext,ULONG ulLength);\n  typedef DWORD (WINAPI *PFE_IMPORT_FUNC)(PBYTE pbData,PVOID pvCallbackContext,PULONG ulLength);\n\n#define CREATE_FOR_IMPORT (1)\n#define CREATE_FOR_DIR (2)\n#define OVERWRITE_HIDDEN (4)\n\n#ifdef UNICODE\n#define OpenEncryptedFileRaw OpenEncryptedFileRawW\n#define lstrcmp lstrcmpW\n#define lstrcmpi lstrcmpiW\n#define lstrcpyn lstrcpynW\n#define lstrcpy lstrcpyW\n#define lstrcat lstrcatW\n#define lstrlen lstrlenW\n#else\n#define OpenEncryptedFileRaw OpenEncryptedFileRawA\n#define lstrcmp lstrcmpA\n#define lstrcmpi lstrcmpiA\n#define lstrcpyn lstrcpynA\n#define lstrcpy lstrcpyA\n#define lstrcat lstrcatA\n#define lstrlen lstrlenA\n#endif\n\n  WINADVAPI DWORD WINAPI OpenEncryptedFileRawA(LPCSTR lpFileName,ULONG ulFlags,PVOID *pvContext);\n  WINADVAPI DWORD WINAPI OpenEncryptedFileRawW(LPCWSTR lpFileName,ULONG ulFlags,PVOID *pvContext);\n  WINADVAPI DWORD WINAPI ReadEncryptedFileRaw(PFE_EXPORT_FUNC pfExportCallback,PVOID pvCallbackContext,PVOID pvContext);\n  WINADVAPI DWORD WINAPI WriteEncryptedFileRaw(PFE_IMPORT_FUNC pfImportCallback,PVOID pvCallbackContext,PVOID pvContext);\n  WINADVAPI VOID WINAPI CloseEncryptedFileRaw(PVOID pvContext);\n  WINBASEAPI int WINAPI lstrcmpA(LPCSTR lpString1,LPCSTR lpString2);\n  WINBASEAPI int WINAPI lstrcmpW(LPCWSTR lpString1,LPCWSTR lpString2);\n  WINBASEAPI int WINAPI lstrcmpiA(LPCSTR lpString1,LPCSTR lpString2);\n  WINBASEAPI int WINAPI lstrcmpiW(LPCWSTR lpString1,LPCWSTR lpString2);\n  WINBASEAPI LPSTR WINAPI lstrcpynA(LPSTR lpString1,LPCSTR lpString2,int iMaxLength);\n  WINBASEAPI LPWSTR WINAPI lstrcpynW(LPWSTR lpString1,LPCWSTR lpString2,int iMaxLength);\n  WINBASEAPI LPSTR WINAPI lstrcpyA(LPSTR lpString1,LPCSTR lpString2);\n  WINBASEAPI LPWSTR WINAPI lstrcpyW(LPWSTR lpString1,LPCWSTR lpString2);\n  WINBASEAPI LPSTR WINAPI lstrcatA(LPSTR lpString1,LPCSTR lpString2);\n  WINBASEAPI LPWSTR WINAPI lstrcatW(LPWSTR lpString1,LPCWSTR lpString2);\n  WINBASEAPI int WINAPI lstrlenA(LPCSTR lpString);\n  WINBASEAPI int WINAPI lstrlenW(LPCWSTR lpString);\n  WINBASEAPI HFILE WINAPI OpenFile(LPCSTR lpFileName,LPOFSTRUCT lpReOpenBuff,UINT uStyle);\n  WINBASEAPI HFILE WINAPI _lopen(LPCSTR lpPathName,int iReadWrite);\n  WINBASEAPI HFILE WINAPI _lcreat(LPCSTR lpPathName,int iAttribute);\n  WINBASEAPI UINT WINAPI _lread(HFILE hFile,LPVOID lpBuffer,UINT uBytes);\n  WINBASEAPI UINT WINAPI _lwrite(HFILE hFile,LPCCH lpBuffer,UINT uBytes);\n  WINBASEAPI long WINAPI _hread(HFILE hFile,LPVOID lpBuffer,long lBytes);\n  WINBASEAPI long WINAPI _hwrite(HFILE hFile,LPCCH lpBuffer,long lBytes);\n  WINBASEAPI HFILE WINAPI _lclose(HFILE hFile);\n  WINBASEAPI LONG WINAPI _llseek(HFILE hFile,LONG lOffset,int iOrigin);\n  WINADVAPI WINBOOL WINAPI IsTextUnicode(CONST VOID *lpv,int iSize,LPINT lpiResult);\n\n#define FLS_OUT_OF_INDEXES ((DWORD)0xffffffff)\n\n  WINBASEAPI DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback);\n  WINBASEAPI PVOID WINAPI FlsGetValue(DWORD dwFlsIndex);\n  WINBASEAPI WINBOOL WINAPI FlsSetValue(DWORD dwFlsIndex,PVOID lpFlsData);\n  WINBASEAPI WINBOOL WINAPI FlsFree(DWORD dwFlsIndex);\n\n#define TLS_OUT_OF_INDEXES ((DWORD)0xffffffff)\n\n  WINBASEAPI DWORD WINAPI TlsAlloc(VOID);\n  WINBASEAPI LPVOID WINAPI TlsGetValue(DWORD dwTlsIndex);\n  WINBASEAPI WINBOOL WINAPI TlsSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue);\n  WINBASEAPI WINBOOL WINAPI TlsFree(DWORD dwTlsIndex);\n\n  typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwErrorCode,DWORD dwNumberOfBytesTransfered,LPOVERLAPPED lpOverlapped);\n\n  WINBASEAPI DWORD WINAPI SleepEx(DWORD dwMilliseconds,WINBOOL bAlertable);\n  WINBASEAPI DWORD WINAPI WaitForSingleObjectEx(HANDLE hHandle,DWORD dwMilliseconds,WINBOOL bAlertable);\n  WINBASEAPI DWORD WINAPI WaitForMultipleObjectsEx(DWORD nCount,CONST HANDLE *lpHandles,WINBOOL bWaitAll,DWORD dwMilliseconds,WINBOOL bAlertable);\n  WINBASEAPI DWORD WINAPI SignalObjectAndWait(HANDLE hObjectToSignal,HANDLE hObjectToWaitOn,DWORD dwMilliseconds,WINBOOL bAlertable);\n  WINBASEAPI WINBOOL WINAPI ReadFileEx(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);\n  WINBASEAPI WINBOOL WINAPI WriteFileEx(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);\n  WINBASEAPI WINBOOL WINAPI BackupRead(HANDLE hFile,LPBYTE lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,WINBOOL bAbort,WINBOOL bProcessSecurity,LPVOID *lpContext);\n  WINBASEAPI WINBOOL WINAPI BackupSeek(HANDLE hFile,DWORD dwLowBytesToSeek,DWORD dwHighBytesToSeek,LPDWORD lpdwLowByteSeeked,LPDWORD lpdwHighByteSeeked,LPVOID *lpContext);\n  WINBASEAPI WINBOOL WINAPI BackupWrite(HANDLE hFile,LPBYTE lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,WINBOOL bAbort,WINBOOL bProcessSecurity,LPVOID *lpContext);\n\n  typedef struct _WIN32_STREAM_ID {\n    DWORD dwStreamId;\n    DWORD dwStreamAttributes;\n    LARGE_INTEGER Size;\n    DWORD dwStreamNameSize;\n    WCHAR cStreamName[ANYSIZE_ARRAY];\n  } WIN32_STREAM_ID,*LPWIN32_STREAM_ID;\n\n#define BACKUP_INVALID 0x0\n#define BACKUP_DATA 0x1\n#define BACKUP_EA_DATA 0x2\n#define BACKUP_SECURITY_DATA 0x3\n#define BACKUP_ALTERNATE_DATA 0x4\n#define BACKUP_LINK 0x5\n#define BACKUP_PROPERTY_DATA 0x6\n#define BACKUP_OBJECT_ID 0x7\n#define BACKUP_REPARSE_DATA 0x8\n#define BACKUP_SPARSE_BLOCK 0x9\n\n#define STREAM_NORMAL_ATTRIBUTE 0x0\n#define STREAM_MODIFIED_WHEN_READ 0x1\n#define STREAM_CONTAINS_SECURITY 0x2\n#define STREAM_CONTAINS_PROPERTIES 0x4\n#define STREAM_SPARSE_ATTRIBUTE 0x8\n\n  WINBASEAPI WINBOOL WINAPI ReadFileScatter(HANDLE hFile,FILE_SEGMENT_ELEMENT aSegmentArray[],DWORD nNumberOfBytesToRead,LPDWORD lpReserved,LPOVERLAPPED lpOverlapped);\n  WINBASEAPI WINBOOL WINAPI WriteFileGather(HANDLE hFile,FILE_SEGMENT_ELEMENT aSegmentArray[],DWORD nNumberOfBytesToWrite,LPDWORD lpReserved,LPOVERLAPPED lpOverlapped);\n\n#define STARTF_USESHOWWINDOW 0x1\n#define STARTF_USESIZE 0x2\n#define STARTF_USEPOSITION 0x4\n#define STARTF_USECOUNTCHARS 0x8\n#define STARTF_USEFILLATTRIBUTE 0x10\n#define STARTF_RUNFULLSCREEN 0x20\n#define STARTF_FORCEONFEEDBACK 0x40\n#define STARTF_FORCEOFFFEEDBACK 0x80\n#define STARTF_USESTDHANDLES 0x100\n\n#define STARTF_USEHOTKEY 0x200\n\n  typedef struct _STARTUPINFOA {\n    DWORD cb;\n    LPSTR lpReserved;\n    LPSTR lpDesktop;\n    LPSTR lpTitle;\n    DWORD dwX;\n    DWORD dwY;\n    DWORD dwXSize;\n    DWORD dwYSize;\n    DWORD dwXCountChars;\n    DWORD dwYCountChars;\n    DWORD dwFillAttribute;\n    DWORD dwFlags;\n    WORD wShowWindow;\n    WORD cbReserved2;\n    LPBYTE lpReserved2;\n    HANDLE hStdInput;\n    HANDLE hStdOutput;\n    HANDLE hStdError;\n  } STARTUPINFOA,*LPSTARTUPINFOA;\n\n  typedef struct _STARTUPINFOW {\n    DWORD cb;\n    LPWSTR lpReserved;\n    LPWSTR lpDesktop;\n    LPWSTR lpTitle;\n    DWORD dwX;\n    DWORD dwY;\n    DWORD dwXSize;\n    DWORD dwYSize;\n    DWORD dwXCountChars;\n    DWORD dwYCountChars;\n    DWORD dwFillAttribute;\n    DWORD dwFlags;\n    WORD wShowWindow;\n    WORD cbReserved2;\n    LPBYTE lpReserved2;\n    HANDLE hStdInput;\n    HANDLE hStdOutput;\n    HANDLE hStdError;\n  } STARTUPINFOW,*LPSTARTUPINFOW;\n\n#ifdef UNICODE\n  typedef STARTUPINFOW STARTUPINFO;\n  typedef LPSTARTUPINFOW LPSTARTUPINFO;\n#else\n  typedef STARTUPINFOA STARTUPINFO;\n  typedef LPSTARTUPINFOA LPSTARTUPINFO;\n#endif\n\n#define SHUTDOWN_NORETRY 0x1\n\n  typedef struct _WIN32_FIND_DATAA {\n    DWORD dwFileAttributes;\n    FILETIME ftCreationTime;\n    FILETIME ftLastAccessTime;\n    FILETIME ftLastWriteTime;\n    DWORD nFileSizeHigh;\n    DWORD nFileSizeLow;\n    DWORD dwReserved0;\n    DWORD dwReserved1;\n    CHAR cFileName[MAX_PATH];\n    CHAR cAlternateFileName[14];\n  } WIN32_FIND_DATAA,*PWIN32_FIND_DATAA,*LPWIN32_FIND_DATAA;\n\n  typedef struct _WIN32_FIND_DATAW {\n    DWORD dwFileAttributes;\n    FILETIME ftCreationTime;\n    FILETIME ftLastAccessTime;\n    FILETIME ftLastWriteTime;\n    DWORD nFileSizeHigh;\n    DWORD nFileSizeLow;\n    DWORD dwReserved0;\n    DWORD dwReserved1;\n    WCHAR cFileName[MAX_PATH];\n    WCHAR cAlternateFileName[14];\n  } WIN32_FIND_DATAW,*PWIN32_FIND_DATAW,*LPWIN32_FIND_DATAW;\n\n#ifdef UNICODE\n  typedef WIN32_FIND_DATAW WIN32_FIND_DATA;\n  typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA;\n  typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA;\n#else\n  typedef WIN32_FIND_DATAA WIN32_FIND_DATA;\n  typedef PWIN32_FIND_DATAA PWIN32_FIND_DATA;\n  typedef LPWIN32_FIND_DATAA LPWIN32_FIND_DATA;\n#endif\n\n  typedef struct _WIN32_FILE_ATTRIBUTE_DATA {\n    DWORD dwFileAttributes;\n    FILETIME ftCreationTime;\n    FILETIME ftLastAccessTime;\n    FILETIME ftLastWriteTime;\n    DWORD nFileSizeHigh;\n    DWORD nFileSizeLow;\n  } WIN32_FILE_ATTRIBUTE_DATA,*LPWIN32_FILE_ATTRIBUTE_DATA;\n\n#ifdef UNICODE\n#define CreateMutex CreateMutexW\n#define OpenMutex OpenMutexW\n#define CreateEvent CreateEventW\n#define OpenEvent OpenEventW\n#define CreateSemaphore CreateSemaphoreW\n#define OpenSemaphore OpenSemaphoreW\n#else\n#define CreateMutex CreateMutexA\n#define OpenMutex OpenMutexA\n#define CreateEvent CreateEventA\n#define OpenEvent OpenEventA\n#define CreateSemaphore CreateSemaphoreA\n#define OpenSemaphore OpenSemaphoreA\n#endif\n\n  WINBASEAPI HANDLE WINAPI CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes,WINBOOL bInitialOwner,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,WINBOOL bInitialOwner,LPCWSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenMutexA(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenMutexW(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCWSTR lpName);\n  WINBASEAPI HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,WINBOOL bManualReset,WINBOOL bInitialState,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes,WINBOOL bManualReset,WINBOOL bInitialState,LPCWSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenEventA(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenEventW(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCWSTR lpName);\n  WINBASEAPI HANDLE WINAPI CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCWSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenSemaphoreA(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenSemaphoreW(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCWSTR lpName);\n\n  typedef VOID (WINAPI *PTIMERAPCROUTINE)(LPVOID lpArgToCompletionRoutine,DWORD dwTimerLowValue,DWORD dwTimerHighValue);\n\n#ifdef UNICODE\n#define CreateWaitableTimer CreateWaitableTimerW\n#define OpenWaitableTimer OpenWaitableTimerW\n#define CreateFileMapping CreateFileMappingW\n#define OpenFileMapping OpenFileMappingW\n#define GetLogicalDriveStrings GetLogicalDriveStringsW\n#define LoadLibrary LoadLibraryW\n#define LoadLibraryEx LoadLibraryExW\n#define GetModuleFileName GetModuleFileNameW\n#define GetModuleHandle GetModuleHandleW\n#else\n#define CreateWaitableTimer CreateWaitableTimerA\n#define OpenWaitableTimer OpenWaitableTimerA\n#define CreateFileMapping CreateFileMappingA\n#define OpenFileMapping OpenFileMappingA\n#define GetLogicalDriveStrings GetLogicalDriveStringsA\n#define LoadLibrary LoadLibraryA\n#define LoadLibraryEx LoadLibraryExA\n#define GetModuleFileName GetModuleFileNameA\n#define GetModuleHandle GetModuleHandleA\n#endif\n\n  WINBASEAPI HANDLE WINAPI CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes,WINBOOL bManualReset,LPCSTR lpTimerName);\n  WINBASEAPI HANDLE WINAPI CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,WINBOOL bManualReset,LPCWSTR lpTimerName);\n  WINBASEAPI HANDLE WINAPI OpenWaitableTimerA(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCSTR lpTimerName);\n  WINBASEAPI HANDLE WINAPI OpenWaitableTimerW(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCWSTR lpTimerName);\n  WINBASEAPI WINBOOL WINAPI SetWaitableTimer(HANDLE hTimer,const LARGE_INTEGER *lpDueTime,LONG lPeriod,PTIMERAPCROUTINE pfnCompletionRoutine,LPVOID lpArgToCompletionRoutine,WINBOOL fResume);\n  WINBASEAPI WINBOOL WINAPI CancelWaitableTimer(HANDLE hTimer);\n  WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCWSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenFileMappingA(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenFileMappingW(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCWSTR lpName);\n  WINBASEAPI DWORD WINAPI GetLogicalDriveStringsA(DWORD nBufferLength,LPSTR lpBuffer);\n  WINBASEAPI DWORD WINAPI GetLogicalDriveStringsW(DWORD nBufferLength,LPWSTR lpBuffer);\n\n  typedef enum _MEMORY_RESOURCE_NOTIFICATION_TYPE {\n    LowMemoryResourceNotification,HighMemoryResourceNotification\n  } MEMORY_RESOURCE_NOTIFICATION_TYPE;\n\n  WINBASEAPI HANDLE WINAPI CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType);\n  WINBASEAPI WINBOOL WINAPI QueryMemoryResourceNotification(HANDLE ResourceNotificationHandle,PBOOL ResourceState);\n  WINBASEAPI HMODULE WINAPI LoadLibraryA(LPCSTR lpLibFileName);\n  WINBASEAPI HMODULE WINAPI LoadLibraryW(LPCWSTR lpLibFileName);\n  WINBASEAPI HMODULE WINAPI LoadLibraryExA(LPCSTR lpLibFileName,HANDLE hFile,DWORD dwFlags);\n  WINBASEAPI HMODULE WINAPI LoadLibraryExW(LPCWSTR lpLibFileName,HANDLE hFile,DWORD dwFlags);\n\n#define DONT_RESOLVE_DLL_REFERENCES 0x1\n#define LOAD_LIBRARY_AS_DATAFILE 0x2\n#define LOAD_WITH_ALTERED_SEARCH_PATH 0x8\n#define LOAD_IGNORE_CODE_AUTHZ_LEVEL 0x10\n#define LOAD_LINRARY_AS_IMAGE_RESOURCE 0x20\n#define LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 0x40\n\n  WINBASEAPI DWORD WINAPI GetModuleFileNameA(HMODULE hModule,LPCH lpFilename,DWORD nSize);\n  WINBASEAPI DWORD WINAPI GetModuleFileNameW(HMODULE hModule,LPWCH lpFilename,DWORD nSize);\n  WINBASEAPI HMODULE WINAPI GetModuleHandleA(LPCSTR lpModuleName);\n  WINBASEAPI HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName);\n\n#ifndef RC_INVOKED\n#define GET_MODULE_HANDLE_EX_FLAG_PIN (0x1)\n#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT (0x2)\n#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS (0x4)\n\n  typedef WINBOOL (WINAPI *PGET_MODULE_HANDLE_EXA)(DWORD dwFlags,LPCSTR lpModuleName,HMODULE *phModule);\n  typedef WINBOOL (WINAPI *PGET_MODULE_HANDLE_EXW)(DWORD dwFlags,LPCWSTR lpModuleName,HMODULE *phModule);\n\n#ifdef UNICODE\n#define PGET_MODULE_HANDLE_EX PGET_MODULE_HANDLE_EXW\n#define GetModuleHandleEx GetModuleHandleExW\n#else\n#define PGET_MODULE_HANDLE_EX PGET_MODULE_HANDLE_EXA\n#define GetModuleHandleEx GetModuleHandleExA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI GetModuleHandleExA(DWORD dwFlags,LPCSTR lpModuleName,HMODULE *phModule);\n  WINBASEAPI WINBOOL WINAPI GetModuleHandleExW(DWORD dwFlags,LPCWSTR lpModuleName,HMODULE *phModule);\n#endif\n\n#ifdef UNICODE\n#define NeedCurrentDirectoryForExePath NeedCurrentDirectoryForExePathW\n#define CreateProcess CreateProcessW\n#define FatalAppExit FatalAppExitW\n#define GetStartupInfo GetStartupInfoW\n#define GetCommandLine GetCommandLineW\n#define GetEnvironmentVariable GetEnvironmentVariableW\n#define SetEnvironmentVariable SetEnvironmentVariableW\n#define ExpandEnvironmentStrings ExpandEnvironmentStringsW\n#define GetFirmwareEnvironmentVariable GetFirmwareEnvironmentVariableW\n#define SetFirmwareEnvironmentVariable SetFirmwareEnvironmentVariableW\n#define OutputDebugString OutputDebugStringW\n#define FindResource FindResourceW\n#define FindResourceEx FindResourceExW\n#else\n#define NeedCurrentDirectoryForExePath NeedCurrentDirectoryForExePathA\n#define CreateProcess CreateProcessA\n#define FatalAppExit FatalAppExitA\n#define GetStartupInfo GetStartupInfoA\n#define GetCommandLine GetCommandLineA\n#define GetEnvironmentVariable GetEnvironmentVariableA\n#define SetEnvironmentVariable SetEnvironmentVariableA\n#define ExpandEnvironmentStrings ExpandEnvironmentStringsA\n#define GetFirmwareEnvironmentVariable GetFirmwareEnvironmentVariableA\n#define SetFirmwareEnvironmentVariable SetFirmwareEnvironmentVariableA\n#define OutputDebugString OutputDebugStringA\n#define FindResource FindResourceA\n#define FindResourceEx FindResourceExA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI NeedCurrentDirectoryForExePathA(LPCSTR ExeName);\n  WINBASEAPI WINBOOL WINAPI NeedCurrentDirectoryForExePathW(LPCWSTR ExeName);\n  WINBASEAPI WINBOOL WINAPI CreateProcessA(LPCSTR lpApplicationName,LPSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,WINBOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);\n  WINBASEAPI WINBOOL WINAPI CreateProcessW(LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,WINBOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);\n  WINBASEAPI DWORD WINAPI AddLocalAlternateComputerNameA(LPCSTR lpDnsFQHostname,ULONG ulFlags);\n  WINBASEAPI DWORD WINAPI AddLocalAlternateComputerNameW(LPCWSTR lpDnsFQHostname,ULONG ulFlags);\n  WINBASEAPI WINBOOL WINAPI SetProcessShutdownParameters(DWORD dwLevel,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI GetProcessShutdownParameters(LPDWORD lpdwLevel,LPDWORD lpdwFlags);\n  WINBASEAPI DWORD WINAPI GetProcessVersion(DWORD ProcessId);\n  WINBASEAPI VOID WINAPI FatalAppExitA(UINT uAction,LPCSTR lpMessageText);\n  WINBASEAPI VOID WINAPI FatalAppExitW(UINT uAction,LPCWSTR lpMessageText);\n  WINBASEAPI VOID WINAPI GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo);\n  WINBASEAPI VOID WINAPI GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo);\n  WINBASEAPI LPSTR WINAPI GetCommandLineA(VOID);\n  WINBASEAPI LPWSTR WINAPI GetCommandLineW(VOID);\n  WINBASEAPI DWORD WINAPI GetEnvironmentVariableA(LPCSTR lpName,LPSTR lpBuffer,DWORD nSize);\n  WINBASEAPI DWORD WINAPI GetEnvironmentVariableW(LPCWSTR lpName,LPWSTR lpBuffer,DWORD nSize);\n  WINBASEAPI WINBOOL WINAPI SetEnvironmentVariableA(LPCSTR lpName,LPCSTR lpValue);\n  WINBASEAPI WINBOOL WINAPI SetEnvironmentVariableW(LPCWSTR lpName,LPCWSTR lpValue);\n  WINBASEAPI DWORD WINAPI ExpandEnvironmentStringsA(LPCSTR lpSrc,LPSTR lpDst,DWORD nSize);\n  WINBASEAPI DWORD WINAPI ExpandEnvironmentStringsW(LPCWSTR lpSrc,LPWSTR lpDst,DWORD nSize);\n  WINBASEAPI DWORD WINAPI GetFirmwareEnvironmentVariableA(LPCSTR lpName,LPCSTR lpGuid,PVOID pBuffer,DWORD nSize);\n  WINBASEAPI DWORD WINAPI GetFirmwareEnvironmentVariableW(LPCWSTR lpName,LPCWSTR lpGuid,PVOID pBuffer,DWORD nSize);\n  WINBASEAPI WINBOOL WINAPI SetFirmwareEnvironmentVariableA(LPCSTR lpName,LPCSTR lpGuid,PVOID pValue,DWORD nSize);\n  WINBASEAPI WINBOOL WINAPI SetFirmwareEnvironmentVariableW(LPCWSTR lpName,LPCWSTR lpGuid,PVOID pValue,DWORD nSize);\n  WINBASEAPI VOID WINAPI OutputDebugStringA(LPCSTR lpOutputString);\n  WINBASEAPI VOID WINAPI OutputDebugStringW(LPCWSTR lpOutputString);\n  WINBASEAPI HRSRC WINAPI FindResourceA(HMODULE hModule,LPCSTR lpName,LPCSTR lpType);\n  WINBASEAPI HRSRC WINAPI FindResourceW(HMODULE hModule,LPCWSTR lpName,LPCWSTR lpType);\n  WINBASEAPI HRSRC WINAPI FindResourceExA(HMODULE hModule,LPCSTR lpType,LPCSTR lpName,WORD wLanguage);\n  WINBASEAPI HRSRC WINAPI FindResourceExW(HMODULE hModule,LPCWSTR lpType,LPCWSTR lpName,WORD wLanguage);\n\n#ifdef UNICODE\n#define ENUMRESTYPEPROC ENUMRESTYPEPROCW\n#define ENUMRESNAMEPROC ENUMRESNAMEPROCW\n#define ENUMRESLANGPROC ENUMRESLANGPROCW\n#define EnumResourceTypes EnumResourceTypesW\n#define EnumResourceNames EnumResourceNamesW\n#define EnumResourceLanguages EnumResourceLanguagesW\n#define BeginUpdateResource BeginUpdateResourceW\n#define UpdateResource UpdateResourceW\n#define EndUpdateResource EndUpdateResourceW\n#define GlobalAddAtom GlobalAddAtomW\n#define GlobalFindAtom GlobalFindAtomW\n#define GlobalGetAtomName GlobalGetAtomNameW\n#define AddAtom AddAtomW\n#define FindAtom FindAtomW\n#define GetAtomName GetAtomNameW\n#define GetProfileInt GetProfileIntW\n#define GetProfileString GetProfileStringW\n#define WriteProfileString WriteProfileStringW\n#define GetProfileSection GetProfileSectionW\n#define WriteProfileSection WriteProfileSectionW\n#define GetPrivateProfileInt GetPrivateProfileIntW\n#define GetPrivateProfileString GetPrivateProfileStringW\n#define WritePrivateProfileString WritePrivateProfileStringW\n#define GetPrivateProfileSection GetPrivateProfileSectionW\n#define WritePrivateProfileSection WritePrivateProfileSectionW\n#define GetPrivateProfileSectionNames GetPrivateProfileSectionNamesW\n#define GetPrivateProfileStruct GetPrivateProfileStructW\n#define WritePrivateProfileStruct WritePrivateProfileStructW\n#define GetDriveType GetDriveTypeW\n#define GetSystemDirectory GetSystemDirectoryW\n#define GetTempPath GetTempPathW\n#define GetTempFileName GetTempFileNameW\n#define GetWindowsDirectory GetWindowsDirectoryW\n#define GetSystemWindowsDirectory GetSystemWindowsDirectoryW\n#define AddLocalAlternateComputerName AddLocalAlternateComputerNameW\n#else\n#define ENUMRESTYPEPROC ENUMRESTYPEPROCA\n#define ENUMRESNAMEPROC ENUMRESNAMEPROCA\n#define ENUMRESLANGPROC ENUMRESLANGPROCA\n#define EnumResourceTypes EnumResourceTypesA\n#define EnumResourceNames EnumResourceNamesA\n#define EnumResourceLanguages EnumResourceLanguagesA\n#define BeginUpdateResource BeginUpdateResourceA\n#define UpdateResource UpdateResourceA\n#define EndUpdateResource EndUpdateResourceA\n#define GlobalAddAtom GlobalAddAtomA\n#define GlobalFindAtom GlobalFindAtomA\n#define GlobalGetAtomName GlobalGetAtomNameA\n#define AddAtom AddAtomA\n#define FindAtom FindAtomA\n#define GetAtomName GetAtomNameA\n#define GetProfileInt GetProfileIntA\n#define GetProfileString GetProfileStringA\n#define WriteProfileString WriteProfileStringA\n#define GetProfileSection GetProfileSectionA\n#define WriteProfileSection WriteProfileSectionA\n#define GetPrivateProfileInt GetPrivateProfileIntA\n#define GetPrivateProfileString GetPrivateProfileStringA\n#define WritePrivateProfileString WritePrivateProfileStringA\n#define GetPrivateProfileSection GetPrivateProfileSectionA\n#define WritePrivateProfileSection WritePrivateProfileSectionA\n#define GetPrivateProfileSectionNames GetPrivateProfileSectionNamesA\n#define GetPrivateProfileStruct GetPrivateProfileStructA\n#define WritePrivateProfileStruct WritePrivateProfileStructA\n#define GetDriveType GetDriveTypeA\n#define GetSystemDirectory GetSystemDirectoryA\n#define GetTempPath GetTempPathA\n#define GetTempFileName GetTempFileNameA\n#define GetWindowsDirectory GetWindowsDirectoryA\n#define GetSystemWindowsDirectory GetSystemWindowsDirectoryA\n#define AddLocalAlternateComputerName AddLocalAlternateComputerNameA\n#endif\n\n  typedef WINBOOL (CALLBACK *ENUMRESTYPEPROCA)(HMODULE hModule,LPSTR lpType,LONG_PTR lParam);\n  typedef WINBOOL (CALLBACK *ENUMRESTYPEPROCW)(HMODULE hModule,LPWSTR lpType,LONG_PTR lParam);\n  typedef WINBOOL (CALLBACK *ENUMRESNAMEPROCA)(HMODULE hModule,LPCSTR lpType,LPSTR lpName,LONG_PTR lParam);\n  typedef WINBOOL (CALLBACK *ENUMRESNAMEPROCW)(HMODULE hModule,LPCWSTR lpType,LPWSTR lpName,LONG_PTR lParam);\n  typedef WINBOOL (CALLBACK *ENUMRESLANGPROCA)(HMODULE hModule,LPCSTR lpType,LPCSTR lpName,WORD wLanguage,LONG_PTR lParam);\n  typedef WINBOOL (CALLBACK *ENUMRESLANGPROCW)(HMODULE hModule,LPCWSTR lpType,LPCWSTR lpName,WORD wLanguage,LONG_PTR lParam);\n\n  WINBASEAPI WINBOOL WINAPI EnumResourceTypesA(HMODULE hModule,ENUMRESTYPEPROCA lpEnumFunc,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumResourceTypesW(HMODULE hModule,ENUMRESTYPEPROCW lpEnumFunc,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumResourceNamesA(HMODULE hModule,LPCSTR lpType,ENUMRESNAMEPROCA lpEnumFunc,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumResourceNamesW(HMODULE hModule,LPCWSTR lpType,ENUMRESNAMEPROCW lpEnumFunc,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumResourceLanguagesA(HMODULE hModule,LPCSTR lpType,LPCSTR lpName,ENUMRESLANGPROCA lpEnumFunc,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumResourceLanguagesW(HMODULE hModule,LPCWSTR lpType,LPCWSTR lpName,ENUMRESLANGPROCW lpEnumFunc,LONG_PTR lParam);\n  WINBASEAPI HANDLE WINAPI BeginUpdateResourceA(LPCSTR pFileName,WINBOOL bDeleteExistingResources);\n  WINBASEAPI HANDLE WINAPI BeginUpdateResourceW(LPCWSTR pFileName,WINBOOL bDeleteExistingResources);\n  WINBASEAPI WINBOOL WINAPI UpdateResourceA(HANDLE hUpdate,LPCSTR lpType,LPCSTR lpName,WORD wLanguage,LPVOID lpData,DWORD cb);\n  WINBASEAPI WINBOOL WINAPI UpdateResourceW(HANDLE hUpdate,LPCWSTR lpType,LPCWSTR lpName,WORD wLanguage,LPVOID lpData,DWORD cb);\n  WINBASEAPI WINBOOL WINAPI EndUpdateResourceA(HANDLE hUpdate,WINBOOL fDiscard);\n  WINBASEAPI WINBOOL WINAPI EndUpdateResourceW(HANDLE hUpdate,WINBOOL fDiscard);\n  WINBASEAPI ATOM WINAPI GlobalAddAtomA(LPCSTR lpString);\n  WINBASEAPI ATOM WINAPI GlobalAddAtomW(LPCWSTR lpString);\n  WINBASEAPI ATOM WINAPI GlobalFindAtomA(LPCSTR lpString);\n  WINBASEAPI ATOM WINAPI GlobalFindAtomW(LPCWSTR lpString);\n  WINBASEAPI UINT WINAPI GlobalGetAtomNameA(ATOM nAtom,LPSTR lpBuffer,int nSize);\n  WINBASEAPI UINT WINAPI GlobalGetAtomNameW(ATOM nAtom,LPWSTR lpBuffer,int nSize);\n  WINBASEAPI ATOM WINAPI AddAtomA(LPCSTR lpString);\n  WINBASEAPI ATOM WINAPI AddAtomW(LPCWSTR lpString);\n  WINBASEAPI ATOM WINAPI FindAtomA(LPCSTR lpString);\n  WINBASEAPI ATOM WINAPI FindAtomW(LPCWSTR lpString);\n  WINBASEAPI UINT WINAPI GetAtomNameA(ATOM nAtom,LPSTR lpBuffer,int nSize);\n  WINBASEAPI UINT WINAPI GetAtomNameW(ATOM nAtom,LPWSTR lpBuffer,int nSize);\n  WINBASEAPI UINT WINAPI GetProfileIntA(LPCSTR lpAppName,LPCSTR lpKeyName,INT nDefault);\n  WINBASEAPI UINT WINAPI GetProfileIntW(LPCWSTR lpAppName,LPCWSTR lpKeyName,INT nDefault);\n  WINBASEAPI DWORD WINAPI GetProfileStringA(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpDefault,LPSTR lpReturnedString,DWORD nSize);\n  WINBASEAPI DWORD WINAPI GetProfileStringW(LPCWSTR lpAppName,LPCWSTR lpKeyName,LPCWSTR lpDefault,LPWSTR lpReturnedString,DWORD nSize);\n  WINBASEAPI WINBOOL WINAPI WriteProfileStringA(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpString);\n  WINBASEAPI WINBOOL WINAPI WriteProfileStringW(LPCWSTR lpAppName,LPCWSTR lpKeyName,LPCWSTR lpString);\n  WINBASEAPI DWORD WINAPI GetProfileSectionA(LPCSTR lpAppName,LPSTR lpReturnedString,DWORD nSize);\n  WINBASEAPI DWORD WINAPI GetProfileSectionW(LPCWSTR lpAppName,LPWSTR lpReturnedString,DWORD nSize);\n  WINBASEAPI WINBOOL WINAPI WriteProfileSectionA(LPCSTR lpAppName,LPCSTR lpString);\n  WINBASEAPI WINBOOL WINAPI WriteProfileSectionW(LPCWSTR lpAppName,LPCWSTR lpString);\n  WINBASEAPI UINT WINAPI GetPrivateProfileIntA(LPCSTR lpAppName,LPCSTR lpKeyName,INT nDefault,LPCSTR lpFileName);\n  WINBASEAPI UINT WINAPI GetPrivateProfileIntW(LPCWSTR lpAppName,LPCWSTR lpKeyName,INT nDefault,LPCWSTR lpFileName);\n  WINBASEAPI DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpDefault,LPSTR lpReturnedString,DWORD nSize,LPCSTR lpFileName);\n  WINBASEAPI DWORD WINAPI GetPrivateProfileStringW(LPCWSTR lpAppName,LPCWSTR lpKeyName,LPCWSTR lpDefault,LPWSTR lpReturnedString,DWORD nSize,LPCWSTR lpFileName);\n  WINBASEAPI WINBOOL WINAPI WritePrivateProfileStringA(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpString,LPCSTR lpFileName);\n  WINBASEAPI WINBOOL WINAPI WritePrivateProfileStringW(LPCWSTR lpAppName,LPCWSTR lpKeyName,LPCWSTR lpString,LPCWSTR lpFileName);\n  WINBASEAPI DWORD WINAPI GetPrivateProfileSectionA(LPCSTR lpAppName,LPSTR lpReturnedString,DWORD nSize,LPCSTR lpFileName);\n  WINBASEAPI DWORD WINAPI GetPrivateProfileSectionW(LPCWSTR lpAppName,LPWSTR lpReturnedString,DWORD nSize,LPCWSTR lpFileName);\n  WINBASEAPI WINBOOL WINAPI WritePrivateProfileSectionA(LPCSTR lpAppName,LPCSTR lpString,LPCSTR lpFileName);\n  WINBASEAPI WINBOOL WINAPI WritePrivateProfileSectionW(LPCWSTR lpAppName,LPCWSTR lpString,LPCWSTR lpFileName);\n  WINBASEAPI DWORD WINAPI GetPrivateProfileSectionNamesA(LPSTR lpszReturnBuffer,DWORD nSize,LPCSTR lpFileName);\n  WINBASEAPI DWORD WINAPI GetPrivateProfileSectionNamesW(LPWSTR lpszReturnBuffer,DWORD nSize,LPCWSTR lpFileName);\n  WINBASEAPI WINBOOL WINAPI GetPrivateProfileStructA(LPCSTR lpszSection,LPCSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCSTR szFile);\n  WINBASEAPI WINBOOL WINAPI GetPrivateProfileStructW(LPCWSTR lpszSection,LPCWSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCWSTR szFile);\n  WINBASEAPI WINBOOL WINAPI WritePrivateProfileStructA(LPCSTR lpszSection,LPCSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCSTR szFile);\n  WINBASEAPI WINBOOL WINAPI WritePrivateProfileStructW(LPCWSTR lpszSection,LPCWSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCWSTR szFile);\n  WINBASEAPI UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName);\n  WINBASEAPI UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName);\n  WINBASEAPI UINT WINAPI GetSystemDirectoryA(LPSTR lpBuffer,UINT uSize);\n  WINBASEAPI UINT WINAPI GetSystemDirectoryW(LPWSTR lpBuffer,UINT uSize);\n  WINBASEAPI DWORD WINAPI GetTempPathA(DWORD nBufferLength,LPSTR lpBuffer);\n  WINBASEAPI DWORD WINAPI GetTempPathW(DWORD nBufferLength,LPWSTR lpBuffer);\n  WINBASEAPI UINT WINAPI GetTempFileNameA(LPCSTR lpPathName,LPCSTR lpPrefixString,UINT uUnique,LPSTR lpTempFileName);\n  WINBASEAPI UINT WINAPI GetTempFileNameW(LPCWSTR lpPathName,LPCWSTR lpPrefixString,UINT uUnique,LPWSTR lpTempFileName);\n  WINBASEAPI UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer,UINT uSize);\n  WINBASEAPI UINT WINAPI GetWindowsDirectoryW(LPWSTR lpBuffer,UINT uSize);\n  WINBASEAPI UINT WINAPI GetSystemWindowsDirectoryA(LPSTR lpBuffer,UINT uSize);\n  WINBASEAPI UINT WINAPI GetSystemWindowsDirectoryW(LPWSTR lpBuffer,UINT uSize);\n\n#ifndef RC_INVOKED\n#ifdef UNICODE\n#define GetSystemWow64Directory GetSystemWow64DirectoryW\n#else\n#define GetSystemWow64Directory GetSystemWow64DirectoryA\n#endif\n\n  WINBASEAPI UINT WINAPI GetSystemWow64DirectoryA(LPSTR lpBuffer,UINT uSize);\n  WINBASEAPI UINT WINAPI GetSystemWow64DirectoryW(LPWSTR lpBuffer,UINT uSize);\n  WINBASEAPI BOOLEAN WINAPI Wow64EnableWow64FsRedirection(BOOLEAN Wow64FsEnableRedirection);\n  WINBASEAPI WINBOOL WINAPI Wow64DisableWow64FsRedirection(PVOID *OldValue);\n  WINBASEAPI WINBOOL WINAPI Wow64RevertWow64FsRedirection(PVOID OlValue);\n\n  typedef UINT (WINAPI *PGET_SYSTEM_WOW64_DIRECTORY_A)(LPSTR lpBuffer,UINT uSize);\n  typedef UINT (WINAPI *PGET_SYSTEM_WOW64_DIRECTORY_W)(LPWSTR lpBuffer,UINT uSize);\n\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_A_A \"GetSystemWow64DirectoryA\"\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_A_W L\"GetSystemWow64DirectoryA\"\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_A_T TEXT(\"GetSystemWow64DirectoryA\")\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_W_A \"GetSystemWow64DirectoryW\"\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_W_W L\"GetSystemWow64DirectoryW\"\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_W_T TEXT(\"GetSystemWow64DirectoryW\")\n\n#ifdef UNICODE\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_A GET_SYSTEM_WOW64_DIRECTORY_NAME_W_A\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_W GET_SYSTEM_WOW64_DIRECTORY_NAME_W_W\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_T GET_SYSTEM_WOW64_DIRECTORY_NAME_W_T\n#else\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_A GET_SYSTEM_WOW64_DIRECTORY_NAME_A_A\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_W GET_SYSTEM_WOW64_DIRECTORY_NAME_A_W\n#define GET_SYSTEM_WOW64_DIRECTORY_NAME_T_T GET_SYSTEM_WOW64_DIRECTORY_NAME_A_T\n#endif\n#endif\n\n#ifdef UNICODE\n#define SetCurrentDirectory SetCurrentDirectoryW\n#define GetCurrentDirectory GetCurrentDirectoryW\n#define SetDllDirectory SetDllDirectoryW\n#define GetDllDirectory GetDllDirectoryW\n#define GetDiskFreeSpace GetDiskFreeSpaceW\n#define GetDiskFreeSpaceEx GetDiskFreeSpaceExW\n#define CreateDirectory CreateDirectoryW\n#define CreateDirectoryEx CreateDirectoryExW\n#define RemoveDirectory RemoveDirectoryW\n#define GetFullPathName GetFullPathNameW\n#define DefineDosDevice DefineDosDeviceW\n#define QueryDosDevice QueryDosDeviceW\n#define CreateFile CreateFileW\n#define SetFileAttributes SetFileAttributesW\n#define GetFileAttributes GetFileAttributesW\n#else\n#define SetCurrentDirectory SetCurrentDirectoryA\n#define GetCurrentDirectory GetCurrentDirectoryA\n#define SetDllDirectory SetDllDirectoryA\n#define GetDllDirectory GetDllDirectoryA\n#define GetDiskFreeSpace GetDiskFreeSpaceA\n#define GetDiskFreeSpaceEx GetDiskFreeSpaceExA\n#define CreateDirectory CreateDirectoryA\n#define CreateDirectoryEx CreateDirectoryExA\n#define RemoveDirectory RemoveDirectoryA\n#define GetFullPathName GetFullPathNameA\n#define DefineDosDevice DefineDosDeviceA\n#define QueryDosDevice QueryDosDeviceA\n#define CreateFile CreateFileA\n#define SetFileAttributes SetFileAttributesA\n#define GetFileAttributes GetFileAttributesA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI SetCurrentDirectoryA(LPCSTR lpPathName);\n  WINBASEAPI WINBOOL WINAPI SetCurrentDirectoryW(LPCWSTR lpPathName);\n  WINBASEAPI DWORD WINAPI GetCurrentDirectoryA(DWORD nBufferLength,LPSTR lpBuffer);\n  WINBASEAPI DWORD WINAPI GetCurrentDirectoryW(DWORD nBufferLength,LPWSTR lpBuffer);\n  WINBASEAPI WINBOOL WINAPI SetDllDirectoryA(LPCSTR lpPathName);\n  WINBASEAPI WINBOOL WINAPI SetDllDirectoryW(LPCWSTR lpPathName);\n  WINBASEAPI DWORD WINAPI GetDllDirectoryA(DWORD nBufferLength,LPSTR lpBuffer);\n  WINBASEAPI DWORD WINAPI GetDllDirectoryW(DWORD nBufferLength,LPWSTR lpBuffer);\n  WINBASEAPI WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters);\n  WINBASEAPI WINBOOL WINAPI GetDiskFreeSpaceW(LPCWSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters);\n  WINBASEAPI WINBOOL WINAPI GetDiskFreeSpaceExA(LPCSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailableToCaller,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes);\n  WINBASEAPI WINBOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailableToCaller,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes);\n  WINBASEAPI WINBOOL WINAPI CreateDirectoryA(LPCSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI WINBOOL WINAPI CreateDirectoryW(LPCWSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI WINBOOL WINAPI CreateDirectoryExA(LPCSTR lpTemplateDirectory,LPCSTR lpNewDirectory,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI WINBOOL WINAPI CreateDirectoryExW(LPCWSTR lpTemplateDirectory,LPCWSTR lpNewDirectory,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI WINBOOL WINAPI RemoveDirectoryA(LPCSTR lpPathName);\n  WINBASEAPI WINBOOL WINAPI RemoveDirectoryW(LPCWSTR lpPathName);\n  WINBASEAPI DWORD WINAPI GetFullPathNameA(LPCSTR lpFileName,DWORD nBufferLength,LPSTR lpBuffer,LPSTR *lpFilePart);\n  WINBASEAPI DWORD WINAPI GetFullPathNameW(LPCWSTR lpFileName,DWORD nBufferLength,LPWSTR lpBuffer,LPWSTR *lpFilePart);\n\n#define DDD_RAW_TARGET_PATH 0x1\n#define DDD_REMOVE_DEFINITION 0x2\n#define DDD_EXACT_MATCH_ON_REMOVE 0x4\n#define DDD_NO_BROADCAST_SYSTEM 0x8\n#define DDD_LUID_BROADCAST_DRIVE 0x10\n\n  WINBASEAPI WINBOOL WINAPI DefineDosDeviceA(DWORD dwFlags,LPCSTR lpDeviceName,LPCSTR lpTargetPath);\n  WINBASEAPI WINBOOL WINAPI DefineDosDeviceW(DWORD dwFlags,LPCWSTR lpDeviceName,LPCWSTR lpTargetPath);\n  WINBASEAPI DWORD WINAPI QueryDosDeviceA(LPCSTR lpDeviceName,LPSTR lpTargetPath,DWORD ucchMax);\n  WINBASEAPI DWORD WINAPI QueryDosDeviceW(LPCWSTR lpDeviceName,LPWSTR lpTargetPath,DWORD ucchMax);\n\n#define EXPAND_LOCAL_DRIVES\n\n  WINBASEAPI HANDLE WINAPI CreateFileA(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);\n  WINBASEAPI HANDLE WINAPI CreateFileW(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);\n  WINBASEAPI HANDLE WINAPI ReOpenFile(HANDLE hOriginalFile,DWORD dwDesiredAccess,DWORD dwShareMode,DWORD dwFlagsAndAttributes);\n  WINBASEAPI WINBOOL WINAPI SetFileAttributesA(LPCSTR lpFileName,DWORD dwFileAttributes);\n  WINBASEAPI WINBOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName,DWORD dwFileAttributes);\n  WINBASEAPI DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName);\n  WINBASEAPI DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName);\n\n  typedef enum _GET_FILEEX_INFO_LEVELS {\n    GetFileExInfoStandard,GetFileExMaxInfoLevel\n  } GET_FILEEX_INFO_LEVELS;\n\n#ifdef UNICODE\n#define GetFileAttributesEx GetFileAttributesExW\n#define GetCompressedFileSize GetCompressedFileSizeW\n#define DeleteFile DeleteFileW\n#define CheckNameLegalDOS8Dot3 CheckNameLegalDOS8Dot3W\n#else\n#define GetFileAttributesEx GetFileAttributesExA\n#define GetCompressedFileSize GetCompressedFileSizeA\n#define DeleteFile DeleteFileA\n#define CheckNameLegalDOS8Dot3 CheckNameLegalDOS8Dot3A\n#endif\n\n  WINBASEAPI WINBOOL WINAPI GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation);\n  WINBASEAPI WINBOOL WINAPI GetFileAttributesExW(LPCWSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation);\n  WINBASEAPI DWORD WINAPI GetCompressedFileSizeA(LPCSTR lpFileName,LPDWORD lpFileSizeHigh);\n  WINBASEAPI DWORD WINAPI GetCompressedFileSizeW(LPCWSTR lpFileName,LPDWORD lpFileSizeHigh);\n  WINBASEAPI WINBOOL WINAPI DeleteFileA(LPCSTR lpFileName);\n  WINBASEAPI WINBOOL WINAPI DeleteFileW(LPCWSTR lpFileName);\n  WINBASEAPI WINBOOL WINAPI CheckNameLegalDOS8Dot3A(LPCSTR lpName,LPSTR lpOemName,DWORD OemNameSize,PBOOL pbNameContainsSpaces,PBOOL pbNameLegal);\n  WINBASEAPI WINBOOL WINAPI CheckNameLegalDOS8Dot3W(LPCWSTR lpName,LPSTR lpOemName,DWORD OemNameSize,PBOOL pbNameContainsSpaces,PBOOL pbNameLegal);\n\n  typedef enum _FINDEX_INFO_LEVELS {\n    FindExInfoStandard,FindExInfoMaxInfoLevel\n  } FINDEX_INFO_LEVELS;\n\n  typedef enum _FINDEX_SEARCH_OPS {\n    FindExSearchNameMatch,FindExSearchLimitToDirectories,FindExSearchLimitToDevices,FindExSearchMaxSearchOp\n  } FINDEX_SEARCH_OPS;\n\n#define FIND_FIRST_EX_CASE_SENSITIVE 0x1\n\n#ifdef UNICODE\n#define FindFirstFileEx FindFirstFileExW\n#define FindFirstFile FindFirstFileW\n#define FindNextFile FindNextFileW\n#define SearchPath SearchPathW\n#define CopyFile CopyFileW\n#define CopyFileEx CopyFileExW\n#define MoveFile MoveFileW\n#define MoveFileEx MoveFileExW\n#define MoveFileWithProgress MoveFileWithProgressW\n#define ReplaceFile ReplaceFileW\n#define CreateHardLink CreateHardLinkW\n#define CreateNamedPipe CreateNamedPipeW\n#define GetNamedPipeHandleState GetNamedPipeHandleStateW\n#define CallNamedPipe CallNamedPipeW\n#define WaitNamedPipe WaitNamedPipeW\n#define SetVolumeLabel SetVolumeLabelW\n#define GetVolumeInformation GetVolumeInformationW\n#define ClearEventLog ClearEventLogW\n#define BackupEventLog BackupEventLogW\n#define OpenEventLog OpenEventLogW\n#define RegisterEventSource RegisterEventSourceW\n#define OpenBackupEventLog OpenBackupEventLogW\n#define ReadEventLog ReadEventLogW\n#define ReportEvent ReportEventW\n#define AccessCheckAndAuditAlarm AccessCheckAndAuditAlarmW\n#define AccessCheckByTypeAndAuditAlarm AccessCheckByTypeAndAuditAlarmW\n#define AccessCheckByTypeResultListAndAuditAlarm AccessCheckByTypeResultListAndAuditAlarmW\n#define AccessCheckByTypeResultListAndAuditAlarmByHandle AccessCheckByTypeResultListAndAuditAlarmByHandleW\n#define ObjectOpenAuditAlarm ObjectOpenAuditAlarmW\n#define ObjectPrivilegeAuditAlarm ObjectPrivilegeAuditAlarmW\n#define ObjectCloseAuditAlarm ObjectCloseAuditAlarmW\n#define ObjectDeleteAuditAlarm ObjectDeleteAuditAlarmW\n#define PrivilegedServiceAuditAlarm PrivilegedServiceAuditAlarmW\n#define SetFileSecurity SetFileSecurityW\n#define GetFileSecurity GetFileSecurityW\n#define FindFirstChangeNotification FindFirstChangeNotificationW\n#define IsBadStringPtr IsBadStringPtrW\n#define LookupAccountSid LookupAccountSidW\n#define LookupAccountName LookupAccountNameW\n#define LookupPrivilegeValue LookupPrivilegeValueW\n#define LookupPrivilegeName LookupPrivilegeNameW\n#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameW\n#define BuildCommDCB BuildCommDCBW\n#define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsW\n#define CommConfigDialog CommConfigDialogW\n#define GetDefaultCommConfig GetDefaultCommConfigW\n#define SetDefaultCommConfig SetDefaultCommConfigW\n#define GetComputerName GetComputerNameW\n#define SetComputerName SetComputerNameW\n#define GetComputerNameEx GetComputerNameExW\n#define SetComputerNameEx SetComputerNameExW\n#define DnsHostnameToComputerName DnsHostnameToComputerNameW\n#define GetUserName GetUserNameW\n#else\n#define FindFirstFileEx FindFirstFileExA\n#define FindFirstFile FindFirstFileA\n#define FindNextFile FindNextFileA\n#define SearchPath SearchPathA\n#define CopyFile CopyFileA\n#define CopyFileEx CopyFileExA\n#define MoveFile MoveFileA\n#define MoveFileEx MoveFileExA\n#define MoveFileWithProgress MoveFileWithProgressA\n#define ReplaceFile ReplaceFileA\n#define CreateHardLink CreateHardLinkA\n#define CreateNamedPipe CreateNamedPipeA\n#define GetNamedPipeHandleState GetNamedPipeHandleStateA\n#define CallNamedPipe CallNamedPipeA\n#define WaitNamedPipe WaitNamedPipeA\n#define SetVolumeLabel SetVolumeLabelA\n#define GetVolumeInformation GetVolumeInformationA\n#define ClearEventLog ClearEventLogA\n#define BackupEventLog BackupEventLogA\n#define OpenEventLog OpenEventLogA\n#define RegisterEventSource RegisterEventSourceA\n#define OpenBackupEventLog OpenBackupEventLogA\n#define ReadEventLog ReadEventLogA\n#define ReportEvent ReportEventA\n#define AccessCheckAndAuditAlarm AccessCheckAndAuditAlarmA\n#define AccessCheckByTypeAndAuditAlarm AccessCheckByTypeAndAuditAlarmA\n#define AccessCheckByTypeResultListAndAuditAlarm AccessCheckByTypeResultListAndAuditAlarmA\n#define AccessCheckByTypeResultListAndAuditAlarmByHandle AccessCheckByTypeResultListAndAuditAlarmByHandleA\n#define ObjectOpenAuditAlarm ObjectOpenAuditAlarmA\n#define ObjectPrivilegeAuditAlarm ObjectPrivilegeAuditAlarmA\n#define ObjectCloseAuditAlarm ObjectCloseAuditAlarmA\n#define ObjectDeleteAuditAlarm ObjectDeleteAuditAlarmA\n#define PrivilegedServiceAuditAlarm PrivilegedServiceAuditAlarmA\n#define SetFileSecurity SetFileSecurityA\n#define GetFileSecurity GetFileSecurityA\n#define FindFirstChangeNotification FindFirstChangeNotificationA\n#define IsBadStringPtr IsBadStringPtrA\n#define LookupAccountSid LookupAccountSidA\n#define LookupAccountName LookupAccountNameA\n#define LookupPrivilegeValue LookupPrivilegeValueA\n#define LookupPrivilegeName LookupPrivilegeNameA\n#define LookupPrivilegeDisplayName LookupPrivilegeDisplayNameA\n#define BuildCommDCB BuildCommDCBA\n#define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsA\n#define CommConfigDialog CommConfigDialogA\n#define GetDefaultCommConfig GetDefaultCommConfigA\n#define SetDefaultCommConfig SetDefaultCommConfigA\n#define GetComputerName GetComputerNameA\n#define SetComputerName SetComputerNameA\n#define GetComputerNameEx GetComputerNameExA\n#define SetComputerNameEx SetComputerNameExA\n#define DnsHostnameToComputerName DnsHostnameToComputerNameA\n#define GetUserName GetUserNameA\n#endif\n\n  WINBASEAPI HANDLE WINAPI FindFirstFileExA(LPCSTR lpFileName,FINDEX_INFO_LEVELS fInfoLevelId,LPVOID lpFindFileData,FINDEX_SEARCH_OPS fSearchOp,LPVOID lpSearchFilter,DWORD dwAdditionalFlags);\n  WINBASEAPI HANDLE WINAPI FindFirstFileExW(LPCWSTR lpFileName,FINDEX_INFO_LEVELS fInfoLevelId,LPVOID lpFindFileData,FINDEX_SEARCH_OPS fSearchOp,LPVOID lpSearchFilter,DWORD dwAdditionalFlags);\n  WINBASEAPI HANDLE WINAPI FindFirstFileA(LPCSTR lpFileName,LPWIN32_FIND_DATAA lpFindFileData);\n  WINBASEAPI HANDLE WINAPI FindFirstFileW(LPCWSTR lpFileName,LPWIN32_FIND_DATAW lpFindFileData);\n  WINBASEAPI WINBOOL WINAPI FindNextFileA(HANDLE hFindFile,LPWIN32_FIND_DATAA lpFindFileData);\n  WINBASEAPI WINBOOL WINAPI FindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData);\n  WINBASEAPI DWORD WINAPI SearchPathA(LPCSTR lpPath,LPCSTR lpFileName,LPCSTR lpExtension,DWORD nBufferLength,LPSTR lpBuffer,LPSTR *lpFilePart);\n  WINBASEAPI DWORD WINAPI SearchPathW(LPCWSTR lpPath,LPCWSTR lpFileName,LPCWSTR lpExtension,DWORD nBufferLength,LPWSTR lpBuffer,LPWSTR *lpFilePart);\n  WINBASEAPI WINBOOL WINAPI CopyFileA(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,WINBOOL bFailIfExists);\n  WINBASEAPI WINBOOL WINAPI CopyFileW(LPCWSTR lpExistingFileName,LPCWSTR lpNewFileName,WINBOOL bFailIfExists);\n\n  typedef DWORD (WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER TotalFileSize,LARGE_INTEGER TotalBytesTransferred,LARGE_INTEGER StreamSize,LARGE_INTEGER StreamBytesTransferred,DWORD dwStreamNumber,DWORD dwCallbackReason,HANDLE hSourceFile,HANDLE hDestinationFile,LPVOID lpData);\n\n  WINBASEAPI WINBOOL WINAPI CopyFileExA(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,LPBOOL pbCancel,DWORD dwCopyFlags);\n  WINBASEAPI WINBOOL WINAPI CopyFileExW(LPCWSTR lpExistingFileName,LPCWSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,LPBOOL pbCancel,DWORD dwCopyFlags);\n  WINBASEAPI WINBOOL WINAPI MoveFileA(LPCSTR lpExistingFileName,LPCSTR lpNewFileName);\n  WINBASEAPI WINBOOL WINAPI MoveFileW(LPCWSTR lpExistingFileName,LPCWSTR lpNewFileName);\n  WINBASEAPI WINBOOL WINAPI MoveFileExA(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI MoveFileExW(LPCWSTR lpExistingFileName,LPCWSTR lpNewFileName,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI MoveFileWithProgressA(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI MoveFileWithProgressW(LPCWSTR lpExistingFileName,LPCWSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,DWORD dwFlags);\n\n#define MOVEFILE_REPLACE_EXISTING 0x1\n#define MOVEFILE_COPY_ALLOWED 0x2\n#define MOVEFILE_DELAY_UNTIL_REBOOT 0x4\n#define MOVEFILE_WRITE_THROUGH 0x8\n#define MOVEFILE_CREATE_HARDLINK 0x10\n#define MOVEFILE_FAIL_IF_NOT_TRACKABLE 0x20\n\n  WINBASEAPI WINBOOL WINAPI ReplaceFileA(LPCSTR lpReplacedFileName,LPCSTR lpReplacementFileName,LPCSTR lpBackupFileName,DWORD dwReplaceFlags,LPVOID lpExclude,LPVOID lpReserved);\n  WINBASEAPI WINBOOL WINAPI ReplaceFileW(LPCWSTR lpReplacedFileName,LPCWSTR lpReplacementFileName,LPCWSTR lpBackupFileName,DWORD dwReplaceFlags,LPVOID lpExclude,LPVOID lpReserved);\n  WINBASEAPI WINBOOL WINAPI CreateHardLinkA(LPCSTR lpFileName,LPCSTR lpExistingFileName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI WINBOOL WINAPI CreateHardLinkW(LPCWSTR lpFileName,LPCWSTR lpExistingFileName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n\n  typedef enum _STREAM_INFO_LEVELS {\n    FindStreamInfoStandard,FindStreamInfoMaxInfoLevel\n  } STREAM_INFO_LEVELS;\n\n  typedef struct _WIN32_FIND_STREAM_DATA {\n    LARGE_INTEGER StreamSize;\n    WCHAR cStreamName[MAX_PATH + 36];\n  } WIN32_FIND_STREAM_DATA,*PWIN32_FIND_STREAM_DATA;\n\n  HANDLE WINAPI FindFirstStreamW(LPCWSTR lpFileName,STREAM_INFO_LEVELS InfoLevel,LPVOID lpFindStreamData,DWORD dwFlags);\n  WINBOOL WINAPI FindNextStreamW(HANDLE hFindStream,LPVOID lpFindStreamData);\n  WINBASEAPI HANDLE WINAPI CreateNamedPipeA(LPCSTR lpName,DWORD dwOpenMode,DWORD dwPipeMode,DWORD nMaxInstances,DWORD nOutBufferSize,DWORD nInBufferSize,DWORD nDefaultTimeOut,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI HANDLE WINAPI CreateNamedPipeW(LPCWSTR lpName,DWORD dwOpenMode,DWORD dwPipeMode,DWORD nMaxInstances,DWORD nOutBufferSize,DWORD nInBufferSize,DWORD nDefaultTimeOut,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINBASEAPI WINBOOL WINAPI GetNamedPipeHandleStateA(HANDLE hNamedPipe,LPDWORD lpState,LPDWORD lpCurInstances,LPDWORD lpMaxCollectionCount,LPDWORD lpCollectDataTimeout,LPSTR lpUserName,DWORD nMaxUserNameSize);\n  WINBASEAPI WINBOOL WINAPI GetNamedPipeHandleStateW(HANDLE hNamedPipe,LPDWORD lpState,LPDWORD lpCurInstances,LPDWORD lpMaxCollectionCount,LPDWORD lpCollectDataTimeout,LPWSTR lpUserName,DWORD nMaxUserNameSize);\n  WINBASEAPI WINBOOL WINAPI CallNamedPipeA(LPCSTR lpNamedPipeName,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesRead,DWORD nTimeOut);\n  WINBASEAPI WINBOOL WINAPI CallNamedPipeW(LPCWSTR lpNamedPipeName,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesRead,DWORD nTimeOut);\n  WINBASEAPI WINBOOL WINAPI WaitNamedPipeA(LPCSTR lpNamedPipeName,DWORD nTimeOut);\n  WINBASEAPI WINBOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName,DWORD nTimeOut);\n  WINBASEAPI WINBOOL WINAPI SetVolumeLabelA(LPCSTR lpRootPathName,LPCSTR lpVolumeName);\n  WINBASEAPI WINBOOL WINAPI SetVolumeLabelW(LPCWSTR lpRootPathName,LPCWSTR lpVolumeName);\n  WINBASEAPI VOID WINAPI SetFileApisToOEM(VOID);\n  WINBASEAPI VOID WINAPI SetFileApisToANSI(VOID);\n  WINBASEAPI WINBOOL WINAPI AreFileApisANSI(VOID);\n  WINBASEAPI WINBOOL WINAPI GetVolumeInformationA(LPCSTR lpRootPathName,LPSTR lpVolumeNameBuffer,DWORD nVolumeNameSize,LPDWORD lpVolumeSerialNumber,LPDWORD lpMaximumComponentLength,LPDWORD lpFileSystemFlags,LPSTR lpFileSystemNameBuffer,DWORD nFileSystemNameSize);\n  WINBASEAPI WINBOOL WINAPI GetVolumeInformationW(LPCWSTR lpRootPathName,LPWSTR lpVolumeNameBuffer,DWORD nVolumeNameSize,LPDWORD lpVolumeSerialNumber,LPDWORD lpMaximumComponentLength,LPDWORD lpFileSystemFlags,LPWSTR lpFileSystemNameBuffer,DWORD nFileSystemNameSize);\n  WINBASEAPI WINBOOL WINAPI CancelIo(HANDLE hFile);\n  WINADVAPI WINBOOL WINAPI ClearEventLogA(HANDLE hEventLog,LPCSTR lpBackupFileName);\n  WINADVAPI WINBOOL WINAPI ClearEventLogW(HANDLE hEventLog,LPCWSTR lpBackupFileName);\n  WINADVAPI WINBOOL WINAPI BackupEventLogA(HANDLE hEventLog,LPCSTR lpBackupFileName);\n  WINADVAPI WINBOOL WINAPI BackupEventLogW(HANDLE hEventLog,LPCWSTR lpBackupFileName);\n  WINADVAPI WINBOOL WINAPI CloseEventLog(HANDLE hEventLog);\n  WINADVAPI WINBOOL WINAPI DeregisterEventSource(HANDLE hEventLog);\n  WINADVAPI WINBOOL WINAPI NotifyChangeEventLog(HANDLE hEventLog,HANDLE hEvent);\n  WINADVAPI WINBOOL WINAPI GetNumberOfEventLogRecords(HANDLE hEventLog,PDWORD NumberOfRecords);\n  WINADVAPI WINBOOL WINAPI GetOldestEventLogRecord(HANDLE hEventLog,PDWORD OldestRecord);\n  WINADVAPI HANDLE WINAPI OpenEventLogA(LPCSTR lpUNCServerName,LPCSTR lpSourceName);\n  WINADVAPI HANDLE WINAPI OpenEventLogW(LPCWSTR lpUNCServerName,LPCWSTR lpSourceName);\n  WINADVAPI HANDLE WINAPI RegisterEventSourceA(LPCSTR lpUNCServerName,LPCSTR lpSourceName);\n  WINADVAPI HANDLE WINAPI RegisterEventSourceW(LPCWSTR lpUNCServerName,LPCWSTR lpSourceName);\n  WINADVAPI HANDLE WINAPI OpenBackupEventLogA(LPCSTR lpUNCServerName,LPCSTR lpFileName);\n  WINADVAPI HANDLE WINAPI OpenBackupEventLogW(LPCWSTR lpUNCServerName,LPCWSTR lpFileName);\n  WINADVAPI WINBOOL WINAPI ReadEventLogA(HANDLE hEventLog,DWORD dwReadFlags,DWORD dwRecordOffset,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,DWORD *pnBytesRead,DWORD *pnMinNumberOfBytesNeeded);\n  WINADVAPI WINBOOL WINAPI ReadEventLogW(HANDLE hEventLog,DWORD dwReadFlags,DWORD dwRecordOffset,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,DWORD *pnBytesRead,DWORD *pnMinNumberOfBytesNeeded);\n  WINADVAPI WINBOOL WINAPI ReportEventA(HANDLE hEventLog,WORD wType,WORD wCategory,DWORD dwEventID,PSID lpUserSid,WORD wNumStrings,DWORD dwDataSize,LPCSTR *lpStrings,LPVOID lpRawData);\n  WINADVAPI WINBOOL WINAPI ReportEventW(HANDLE hEventLog,WORD wType,WORD wCategory,DWORD dwEventID,PSID lpUserSid,WORD wNumStrings,DWORD dwDataSize,LPCWSTR *lpStrings,LPVOID lpRawData);\n\n#define EVENTLOG_FULL_INFO 0\n\n  typedef struct _EVENTLOG_FULL_INFORMATION {\n    DWORD dwFull;\n  } EVENTLOG_FULL_INFORMATION,*LPEVENTLOG_FULL_INFORMATION;\n\n  WINADVAPI WINBOOL WINAPI GetEventLogInformation(HANDLE hEventLog,DWORD dwInfoLevel,LPVOID lpBuffer,DWORD cbBufSize,LPDWORD pcbBytesNeeded);\n  WINADVAPI WINBOOL WINAPI DuplicateToken(HANDLE ExistingTokenHandle,SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,PHANDLE DuplicateTokenHandle);\n  WINADVAPI WINBOOL WINAPI GetKernelObjectSecurity(HANDLE Handle,SECURITY_INFORMATION RequestedInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor,DWORD nLength,LPDWORD lpnLengthNeeded);\n  WINADVAPI WINBOOL WINAPI ImpersonateNamedPipeClient(HANDLE hNamedPipe);\n  WINADVAPI WINBOOL WINAPI ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);\n  WINADVAPI WINBOOL WINAPI RevertToSelf(VOID);\n  WINADVAPI WINBOOL WINAPI SetThreadToken (PHANDLE Thread,HANDLE Token);\n  WINADVAPI WINBOOL WINAPI AccessCheck(PSECURITY_DESCRIPTOR pSecurityDescriptor,HANDLE ClientToken,DWORD DesiredAccess,PGENERIC_MAPPING GenericMapping,PPRIVILEGE_SET PrivilegeSet,LPDWORD PrivilegeSetLength,LPDWORD GrantedAccess,LPBOOL AccessStatus);\n  WINADVAPI WINBOOL WINAPI AccessCheckByType(PSECURITY_DESCRIPTOR pSecurityDescriptor,PSID PrincipalSelfSid,HANDLE ClientToken,DWORD DesiredAccess,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,PPRIVILEGE_SET PrivilegeSet,LPDWORD PrivilegeSetLength,LPDWORD GrantedAccess,LPBOOL AccessStatus);\n  WINADVAPI WINBOOL WINAPI AccessCheckByTypeResultList(PSECURITY_DESCRIPTOR pSecurityDescriptor,PSID PrincipalSelfSid,HANDLE ClientToken,DWORD DesiredAccess,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,PPRIVILEGE_SET PrivilegeSet,LPDWORD PrivilegeSetLength,LPDWORD GrantedAccessList,LPDWORD AccessStatusList);\n  WINADVAPI WINBOOL WINAPI OpenProcessToken(HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle);\n  WINADVAPI WINBOOL WINAPI OpenThreadToken(HANDLE ThreadHandle,DWORD DesiredAccess,WINBOOL OpenAsSelf,PHANDLE TokenHandle);\n  WINADVAPI WINBOOL WINAPI GetTokenInformation(HANDLE TokenHandle,TOKEN_INFORMATION_CLASS TokenInformationClass,LPVOID TokenInformation,DWORD TokenInformationLength,PDWORD ReturnLength);\n  WINADVAPI WINBOOL WINAPI SetTokenInformation(HANDLE TokenHandle,TOKEN_INFORMATION_CLASS TokenInformationClass,LPVOID TokenInformation,DWORD TokenInformationLength);\n  WINADVAPI WINBOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle,WINBOOL DisableAllPrivileges,PTOKEN_PRIVILEGES NewState,DWORD BufferLength,PTOKEN_PRIVILEGES PreviousState,PDWORD ReturnLength);\n  WINADVAPI WINBOOL WINAPI AdjustTokenGroups(HANDLE TokenHandle,WINBOOL ResetToDefault,PTOKEN_GROUPS NewState,DWORD BufferLength,PTOKEN_GROUPS PreviousState,PDWORD ReturnLength);\n  WINADVAPI WINBOOL WINAPI PrivilegeCheck(HANDLE ClientToken,PPRIVILEGE_SET RequiredPrivileges,LPBOOL pfResult);\n  WINADVAPI WINBOOL WINAPI AccessCheckAndAuditAlarmA(LPCSTR SubsystemName,LPVOID HandleId,LPSTR ObjectTypeName,LPSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,DWORD DesiredAccess,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPBOOL AccessStatus,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI AccessCheckAndAuditAlarmW(LPCWSTR SubsystemName,LPVOID HandleId,LPWSTR ObjectTypeName,LPWSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,DWORD DesiredAccess,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPBOOL AccessStatus,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI AccessCheckByTypeAndAuditAlarmA(LPCSTR SubsystemName,LPVOID HandleId,LPCSTR ObjectTypeName,LPCSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,PSID PrincipalSelfSid,DWORD DesiredAccess,AUDIT_EVENT_TYPE AuditType,DWORD Flags,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPBOOL AccessStatus,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI AccessCheckByTypeAndAuditAlarmW(LPCWSTR SubsystemName,LPVOID HandleId,LPCWSTR ObjectTypeName,LPCWSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,PSID PrincipalSelfSid,DWORD DesiredAccess,AUDIT_EVENT_TYPE AuditType,DWORD Flags,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPBOOL AccessStatus,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI AccessCheckByTypeResultListAndAuditAlarmA(LPCSTR SubsystemName,LPVOID HandleId,LPCSTR ObjectTypeName,LPCSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,PSID PrincipalSelfSid,DWORD DesiredAccess,AUDIT_EVENT_TYPE AuditType,DWORD Flags,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPDWORD AccessStatusList,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI AccessCheckByTypeResultListAndAuditAlarmW(LPCWSTR SubsystemName,LPVOID HandleId,LPCWSTR ObjectTypeName,LPCWSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,PSID PrincipalSelfSid,DWORD DesiredAccess,AUDIT_EVENT_TYPE AuditType,DWORD Flags,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPDWORD AccessStatusList,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI AccessCheckByTypeResultListAndAuditAlarmByHandleA(LPCSTR SubsystemName,LPVOID HandleId,HANDLE ClientToken,LPCSTR ObjectTypeName,LPCSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,PSID PrincipalSelfSid,DWORD DesiredAccess,AUDIT_EVENT_TYPE AuditType,DWORD Flags,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPDWORD AccessStatusList,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI AccessCheckByTypeResultListAndAuditAlarmByHandleW(LPCWSTR SubsystemName,LPVOID HandleId,HANDLE ClientToken,LPCWSTR ObjectTypeName,LPCWSTR ObjectName,PSECURITY_DESCRIPTOR SecurityDescriptor,PSID PrincipalSelfSid,DWORD DesiredAccess,AUDIT_EVENT_TYPE AuditType,DWORD Flags,POBJECT_TYPE_LIST ObjectTypeList,DWORD ObjectTypeListLength,PGENERIC_MAPPING GenericMapping,WINBOOL ObjectCreation,LPDWORD GrantedAccess,LPDWORD AccessStatusList,LPBOOL pfGenerateOnClose);\n  WINADVAPI WINBOOL WINAPI ObjectOpenAuditAlarmA(LPCSTR SubsystemName,LPVOID HandleId,LPSTR ObjectTypeName,LPSTR ObjectName,PSECURITY_DESCRIPTOR pSecurityDescriptor,HANDLE ClientToken,DWORD DesiredAccess,DWORD GrantedAccess,PPRIVILEGE_SET Privileges,WINBOOL ObjectCreation,WINBOOL AccessGranted,LPBOOL GenerateOnClose);\n  WINADVAPI WINBOOL WINAPI ObjectOpenAuditAlarmW(LPCWSTR SubsystemName,LPVOID HandleId,LPWSTR ObjectTypeName,LPWSTR ObjectName,PSECURITY_DESCRIPTOR pSecurityDescriptor,HANDLE ClientToken,DWORD DesiredAccess,DWORD GrantedAccess,PPRIVILEGE_SET Privileges,WINBOOL ObjectCreation,WINBOOL AccessGranted,LPBOOL GenerateOnClose);\n  WINADVAPI WINBOOL WINAPI ObjectPrivilegeAuditAlarmA(LPCSTR SubsystemName,LPVOID HandleId,HANDLE ClientToken,DWORD DesiredAccess,PPRIVILEGE_SET Privileges,WINBOOL AccessGranted);\n  WINADVAPI WINBOOL WINAPI ObjectPrivilegeAuditAlarmW(LPCWSTR SubsystemName,LPVOID HandleId,HANDLE ClientToken,DWORD DesiredAccess,PPRIVILEGE_SET Privileges,WINBOOL AccessGranted);\n  WINADVAPI WINBOOL WINAPI ObjectCloseAuditAlarmA(LPCSTR SubsystemName,LPVOID HandleId,WINBOOL GenerateOnClose);\n  WINADVAPI WINBOOL WINAPI ObjectCloseAuditAlarmW(LPCWSTR SubsystemName,LPVOID HandleId,WINBOOL GenerateOnClose);\n  WINADVAPI WINBOOL WINAPI ObjectDeleteAuditAlarmA(LPCSTR SubsystemName,LPVOID HandleId,WINBOOL GenerateOnClose);\n  WINADVAPI WINBOOL WINAPI ObjectDeleteAuditAlarmW(LPCWSTR SubsystemName,LPVOID HandleId,WINBOOL GenerateOnClose);\n  WINADVAPI WINBOOL WINAPI PrivilegedServiceAuditAlarmA(LPCSTR SubsystemName,LPCSTR ServiceName,HANDLE ClientToken,PPRIVILEGE_SET Privileges,WINBOOL AccessGranted);\n  WINADVAPI WINBOOL WINAPI PrivilegedServiceAuditAlarmW(LPCWSTR SubsystemName,LPCWSTR ServiceName,HANDLE ClientToken,PPRIVILEGE_SET Privileges,WINBOOL AccessGranted);\n  WINADVAPI WINBOOL WINAPI IsWellKnownSid(PSID pSid,WELL_KNOWN_SID_TYPE WellKnownSidType);\n  WINADVAPI WINBOOL WINAPI CreateWellKnownSid(WELL_KNOWN_SID_TYPE WellKnownSidType,PSID DomainSid,PSID pSid,DWORD *cbSid);\n  WINADVAPI WINBOOL WINAPI EqualDomainSid(PSID pSid1,PSID pSid2,WINBOOL *pfEqual);\n  WINADVAPI WINBOOL WINAPI GetWindowsAccountDomainSid(PSID pSid,PSID pDomainSid,DWORD *cbDomainSid);\n  WINADVAPI WINBOOL WINAPI IsValidSid(PSID pSid);\n  WINADVAPI WINBOOL WINAPI EqualSid(PSID pSid1,PSID pSid2);\n  WINADVAPI WINBOOL WINAPI EqualPrefixSid(PSID pSid1,PSID pSid2);\n  WINADVAPI DWORD WINAPI GetSidLengthRequired (UCHAR nSubAuthorityCount);\n  WINADVAPI WINBOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,BYTE nSubAuthorityCount,DWORD nSubAuthority0,DWORD nSubAuthority1,DWORD nSubAuthority2,DWORD nSubAuthority3,DWORD nSubAuthority4,DWORD nSubAuthority5,DWORD nSubAuthority6,DWORD nSubAuthority7,PSID *pSid);\n  WINADVAPI PVOID WINAPI FreeSid(PSID pSid);\n  WINADVAPI WINBOOL WINAPI InitializeSid(PSID Sid,PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,BYTE nSubAuthorityCount);\n  WINADVAPI PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(PSID pSid);\n  WINADVAPI PDWORD WINAPI GetSidSubAuthority(PSID pSid,DWORD nSubAuthority);\n  WINADVAPI PUCHAR WINAPI GetSidSubAuthorityCount(PSID pSid);\n  WINADVAPI DWORD WINAPI GetLengthSid(PSID pSid);\n  WINADVAPI WINBOOL WINAPI CopySid(DWORD nDestinationSidLength,PSID pDestinationSid,PSID pSourceSid);\n  WINADVAPI WINBOOL WINAPI AreAllAccessesGranted(DWORD GrantedAccess,DWORD DesiredAccess);\n  WINADVAPI WINBOOL WINAPI AreAnyAccessesGranted(DWORD GrantedAccess,DWORD DesiredAccess);\n  WINADVAPI VOID WINAPI MapGenericMask(PDWORD AccessMask,PGENERIC_MAPPING GenericMapping);\n  WINADVAPI WINBOOL WINAPI IsValidAcl(PACL pAcl);\n  WINADVAPI WINBOOL WINAPI InitializeAcl(PACL pAcl,DWORD nAclLength,DWORD dwAclRevision);\n  WINADVAPI WINBOOL WINAPI GetAclInformation(PACL pAcl,LPVOID pAclInformation,DWORD nAclInformationLength,ACL_INFORMATION_CLASS dwAclInformationClass);\n  WINADVAPI WINBOOL WINAPI SetAclInformation(PACL pAcl,LPVOID pAclInformation,DWORD nAclInformationLength,ACL_INFORMATION_CLASS dwAclInformationClass);\n  WINADVAPI WINBOOL WINAPI AddAce(PACL pAcl,DWORD dwAceRevision,DWORD dwStartingAceIndex,LPVOID pAceList,DWORD nAceListLength);\n  WINADVAPI WINBOOL WINAPI DeleteAce(PACL pAcl,DWORD dwAceIndex);\n  WINADVAPI WINBOOL WINAPI GetAce(PACL pAcl,DWORD dwAceIndex,LPVOID *pAce);\n  WINADVAPI WINBOOL WINAPI AddAccessAllowedAce(PACL pAcl,DWORD dwAceRevision,DWORD AccessMask,PSID pSid);\n  WINADVAPI WINBOOL WINAPI AddAccessAllowedAceEx(PACL pAcl,DWORD dwAceRevision,DWORD AceFlags,DWORD AccessMask,PSID pSid);\n  WINADVAPI WINBOOL WINAPI AddAccessDeniedAce(PACL pAcl,DWORD dwAceRevision,DWORD AccessMask,PSID pSid);\n  WINADVAPI WINBOOL WINAPI AddAccessDeniedAceEx(PACL pAcl,DWORD dwAceRevision,DWORD AceFlags,DWORD AccessMask,PSID pSid);\n  WINADVAPI WINBOOL WINAPI AddAuditAccessAce(PACL pAcl,DWORD dwAceRevision,DWORD dwAccessMask,PSID pSid,WINBOOL bAuditSuccess,WINBOOL bAuditFailure);\n  WINADVAPI WINBOOL WINAPI AddAuditAccessAceEx(PACL pAcl,DWORD dwAceRevision,DWORD AceFlags,DWORD dwAccessMask,PSID pSid,WINBOOL bAuditSuccess,WINBOOL bAuditFailure);\n  WINADVAPI WINBOOL WINAPI AddAccessAllowedObjectAce(PACL pAcl,DWORD dwAceRevision,DWORD AceFlags,DWORD AccessMask,GUID *ObjectTypeGuid,GUID *InheritedObjectTypeGuid,PSID pSid);\n  WINADVAPI WINBOOL WINAPI AddAccessDeniedObjectAce(PACL pAcl,DWORD dwAceRevision,DWORD AceFlags,DWORD AccessMask,GUID *ObjectTypeGuid,GUID *InheritedObjectTypeGuid,PSID pSid);\n  WINADVAPI WINBOOL WINAPI AddAuditAccessObjectAce(PACL pAcl,DWORD dwAceRevision,DWORD AceFlags,DWORD AccessMask,GUID *ObjectTypeGuid,GUID *InheritedObjectTypeGuid,PSID pSid,WINBOOL bAuditSuccess,WINBOOL bAuditFailure);\n  WINADVAPI WINBOOL WINAPI FindFirstFreeAce(PACL pAcl,LPVOID *pAce);\n  WINADVAPI WINBOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor,DWORD dwRevision);\n  WINADVAPI WINBOOL WINAPI IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor);\n  WINADVAPI DWORD WINAPI GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR pSecurityDescriptor);\n  WINADVAPI WINBOOL WINAPI GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR pSecurityDescriptor,PSECURITY_DESCRIPTOR_CONTROL pControl,LPDWORD lpdwRevision);\n  WINADVAPI WINBOOL WINAPI SetSecurityDescriptorControl(PSECURITY_DESCRIPTOR pSecurityDescriptor,SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet);\n  WINADVAPI WINBOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor,WINBOOL bDaclPresent,PACL pDacl,WINBOOL bDaclDefaulted);\n  WINADVAPI WINBOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor,LPBOOL lpbDaclPresent,PACL *pDacl,LPBOOL lpbDaclDefaulted);\n  WINADVAPI WINBOOL WINAPI SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR pSecurityDescriptor,WINBOOL bSaclPresent,PACL pSacl,WINBOOL bSaclDefaulted);\n  WINADVAPI WINBOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR pSecurityDescriptor,LPBOOL lpbSaclPresent,PACL *pSacl,LPBOOL lpbSaclDefaulted);\n  WINADVAPI WINBOOL WINAPI SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR pSecurityDescriptor,PSID pOwner,WINBOOL bOwnerDefaulted);\n  WINADVAPI WINBOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR pSecurityDescriptor,PSID *pOwner,LPBOOL lpbOwnerDefaulted);\n  WINADVAPI WINBOOL WINAPI SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR pSecurityDescriptor,PSID pGroup,WINBOOL bGroupDefaulted);\n  WINADVAPI WINBOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR pSecurityDescriptor,PSID *pGroup,LPBOOL lpbGroupDefaulted);\n  WINADVAPI DWORD WINAPI SetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor,PUCHAR RMControl);\n  WINADVAPI DWORD WINAPI GetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor,PUCHAR RMControl);\n  WINADVAPI WINBOOL WINAPI CreatePrivateObjectSecurity(PSECURITY_DESCRIPTOR ParentDescriptor,PSECURITY_DESCRIPTOR CreatorDescriptor,PSECURITY_DESCRIPTOR *NewDescriptor,WINBOOL IsDirectoryObject,HANDLE Token,PGENERIC_MAPPING GenericMapping);\n  WINADVAPI WINBOOL WINAPI ConvertToAutoInheritPrivateObjectSecurity(PSECURITY_DESCRIPTOR ParentDescriptor,PSECURITY_DESCRIPTOR CurrentSecurityDescriptor,PSECURITY_DESCRIPTOR *NewSecurityDescriptor,GUID *ObjectType,BOOLEAN IsDirectoryObject,PGENERIC_MAPPING GenericMapping);\n  WINADVAPI WINBOOL WINAPI CreatePrivateObjectSecurityEx(PSECURITY_DESCRIPTOR ParentDescriptor,PSECURITY_DESCRIPTOR CreatorDescriptor,PSECURITY_DESCRIPTOR *NewDescriptor,GUID *ObjectType,WINBOOL IsContainerObject,ULONG AutoInheritFlags,HANDLE Token,PGENERIC_MAPPING GenericMapping);\n  WINADVAPI WINBOOL WINAPI CreatePrivateObjectSecurityWithMultipleInheritance(PSECURITY_DESCRIPTOR ParentDescriptor,PSECURITY_DESCRIPTOR CreatorDescriptor,PSECURITY_DESCRIPTOR *NewDescriptor,GUID **ObjectTypes,ULONG GuidCount,WINBOOL IsContainerObject,ULONG AutoInheritFlags,HANDLE Token,PGENERIC_MAPPING GenericMapping);\n  WINADVAPI WINBOOL WINAPI SetPrivateObjectSecurity (SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR ModificationDescriptor,PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,PGENERIC_MAPPING GenericMapping,HANDLE Token);\n  WINADVAPI WINBOOL WINAPI SetPrivateObjectSecurityEx (SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR ModificationDescriptor,PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,ULONG AutoInheritFlags,PGENERIC_MAPPING GenericMapping,HANDLE Token);\n  WINADVAPI WINBOOL WINAPI GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR ObjectDescriptor,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR ResultantDescriptor,DWORD DescriptorLength,PDWORD ReturnLength);\n  WINADVAPI WINBOOL WINAPI DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR *ObjectDescriptor);\n  WINADVAPI WINBOOL WINAPI MakeSelfRelativeSD(PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,LPDWORD lpdwBufferLength);\n  WINADVAPI WINBOOL WINAPI MakeAbsoluteSD(PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,LPDWORD lpdwAbsoluteSecurityDescriptorSize,PACL pDacl,LPDWORD lpdwDaclSize,PACL pSacl,LPDWORD lpdwSaclSize,PSID pOwner,LPDWORD lpdwOwnerSize,PSID pPrimaryGroup,LPDWORD lpdwPrimaryGroupSize);\n  WINADVAPI WINBOOL WINAPI MakeAbsoluteSD2(PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,LPDWORD lpdwBufferSize);\n  WINADVAPI WINBOOL WINAPI SetFileSecurityA(LPCSTR lpFileName,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor);\n  WINADVAPI WINBOOL WINAPI SetFileSecurityW(LPCWSTR lpFileName,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor);\n  WINADVAPI WINBOOL WINAPI GetFileSecurityA(LPCSTR lpFileName,SECURITY_INFORMATION RequestedInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor,DWORD nLength,LPDWORD lpnLengthNeeded);\n  WINADVAPI WINBOOL WINAPI GetFileSecurityW(LPCWSTR lpFileName,SECURITY_INFORMATION RequestedInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor,DWORD nLength,LPDWORD lpnLengthNeeded);\n  WINADVAPI WINBOOL WINAPI SetKernelObjectSecurity(HANDLE Handle,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR SecurityDescriptor);\n  WINBASEAPI HANDLE WINAPI FindFirstChangeNotificationA(LPCSTR lpPathName,WINBOOL bWatchSubtree,DWORD dwNotifyFilter);\n  WINBASEAPI HANDLE WINAPI FindFirstChangeNotificationW(LPCWSTR lpPathName,WINBOOL bWatchSubtree,DWORD dwNotifyFilter);\n  WINBASEAPI WINBOOL WINAPI FindNextChangeNotification(HANDLE hChangeHandle);\n  WINBASEAPI WINBOOL WINAPI FindCloseChangeNotification(HANDLE hChangeHandle);\n  WINBASEAPI WINBOOL WINAPI ReadDirectoryChangesW(HANDLE hDirectory,LPVOID lpBuffer,DWORD nBufferLength,WINBOOL bWatchSubtree,DWORD dwNotifyFilter,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);\n  WINBASEAPI WINBOOL WINAPI VirtualLock(LPVOID lpAddress,SIZE_T dwSize);\n  WINBASEAPI WINBOOL WINAPI VirtualUnlock(LPVOID lpAddress,SIZE_T dwSize);\n  WINBASEAPI LPVOID WINAPI MapViewOfFileEx(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap,LPVOID lpBaseAddress);\n  WINBASEAPI WINBOOL WINAPI SetPriorityClass(HANDLE hProcess,DWORD dwPriorityClass);\n  WINBASEAPI DWORD WINAPI GetPriorityClass(HANDLE hProcess);\n  WINBASEAPI WINBOOL WINAPI IsBadReadPtr(CONST VOID *lp,UINT_PTR ucb);\n  WINBASEAPI WINBOOL WINAPI IsBadWritePtr(LPVOID lp,UINT_PTR ucb);\n  WINBASEAPI WINBOOL WINAPI IsBadHugeReadPtr(CONST VOID *lp,UINT_PTR ucb);\n  WINBASEAPI WINBOOL WINAPI IsBadHugeWritePtr(LPVOID lp,UINT_PTR ucb);\n  WINBASEAPI WINBOOL WINAPI IsBadCodePtr(FARPROC lpfn);\n  WINBASEAPI WINBOOL WINAPI IsBadStringPtrA(LPCSTR lpsz,UINT_PTR ucchMax);\n  WINBASEAPI WINBOOL WINAPI IsBadStringPtrW(LPCWSTR lpsz,UINT_PTR ucchMax);\n  WINADVAPI WINBOOL WINAPI LookupAccountSidA(LPCSTR lpSystemName,PSID Sid,LPSTR Name,LPDWORD cchName,LPSTR ReferencedDomainName,LPDWORD cchReferencedDomainName,PSID_NAME_USE peUse);\n  WINADVAPI WINBOOL WINAPI LookupAccountSidW(LPCWSTR lpSystemName,PSID Sid,LPWSTR Name,LPDWORD cchName,LPWSTR ReferencedDomainName,LPDWORD cchReferencedDomainName,PSID_NAME_USE peUse);\n  WINADVAPI WINBOOL WINAPI LookupAccountNameA(LPCSTR lpSystemName,LPCSTR lpAccountName,PSID Sid,LPDWORD cbSid,LPSTR ReferencedDomainName,LPDWORD cchReferencedDomainName,PSID_NAME_USE peUse);\n  WINADVAPI WINBOOL WINAPI LookupAccountNameW(LPCWSTR lpSystemName,LPCWSTR lpAccountName,PSID Sid,LPDWORD cbSid,LPWSTR ReferencedDomainName,LPDWORD cchReferencedDomainName,PSID_NAME_USE peUse);\n  WINADVAPI WINBOOL WINAPI LookupPrivilegeValueA(LPCSTR lpSystemName,LPCSTR lpName,PLUID lpLuid);\n  WINADVAPI WINBOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName,LPCWSTR lpName,PLUID lpLuid);\n  WINADVAPI WINBOOL WINAPI LookupPrivilegeNameA(LPCSTR lpSystemName,PLUID lpLuid,LPSTR lpName,LPDWORD cchName);\n  WINADVAPI WINBOOL WINAPI LookupPrivilegeNameW(LPCWSTR lpSystemName,PLUID lpLuid,LPWSTR lpName,LPDWORD cchName);\n  WINADVAPI WINBOOL WINAPI LookupPrivilegeDisplayNameA(LPCSTR lpSystemName,LPCSTR lpName,LPSTR lpDisplayName,LPDWORD cchDisplayName,LPDWORD lpLanguageId);\n  WINADVAPI WINBOOL WINAPI LookupPrivilegeDisplayNameW(LPCWSTR lpSystemName,LPCWSTR lpName,LPWSTR lpDisplayName,LPDWORD cchDisplayName,LPDWORD lpLanguageId);\n  WINADVAPI WINBOOL WINAPI AllocateLocallyUniqueId(PLUID Luid);\n  WINBASEAPI WINBOOL WINAPI BuildCommDCBA(LPCSTR lpDef,LPDCB lpDCB);\n  WINBASEAPI WINBOOL WINAPI BuildCommDCBW(LPCWSTR lpDef,LPDCB lpDCB);\n  WINBASEAPI WINBOOL WINAPI BuildCommDCBAndTimeoutsA(LPCSTR lpDef,LPDCB lpDCB,LPCOMMTIMEOUTS lpCommTimeouts);\n  WINBASEAPI WINBOOL WINAPI BuildCommDCBAndTimeoutsW(LPCWSTR lpDef,LPDCB lpDCB,LPCOMMTIMEOUTS lpCommTimeouts);\n  WINBASEAPI WINBOOL WINAPI CommConfigDialogA(LPCSTR lpszName,HWND hWnd,LPCOMMCONFIG lpCC);\n  WINBASEAPI WINBOOL WINAPI CommConfigDialogW(LPCWSTR lpszName,HWND hWnd,LPCOMMCONFIG lpCC);\n  WINBASEAPI WINBOOL WINAPI GetDefaultCommConfigA(LPCSTR lpszName,LPCOMMCONFIG lpCC,LPDWORD lpdwSize);\n  WINBASEAPI WINBOOL WINAPI GetDefaultCommConfigW(LPCWSTR lpszName,LPCOMMCONFIG lpCC,LPDWORD lpdwSize);\n  WINBASEAPI WINBOOL WINAPI SetDefaultCommConfigA(LPCSTR lpszName,LPCOMMCONFIG lpCC,DWORD dwSize);\n  WINBASEAPI WINBOOL WINAPI SetDefaultCommConfigW(LPCWSTR lpszName,LPCOMMCONFIG lpCC,DWORD dwSize);\n\n#define MAX_COMPUTERNAME_LENGTH 15\n\n  WINBASEAPI WINBOOL WINAPI GetComputerNameA(LPSTR lpBuffer,LPDWORD nSize);\n  WINBASEAPI WINBOOL WINAPI GetComputerNameW(LPWSTR lpBuffer,LPDWORD nSize);\n  WINBASEAPI WINBOOL WINAPI SetComputerNameA(LPCSTR lpComputerName);\n  WINBASEAPI WINBOOL WINAPI SetComputerNameW(LPCWSTR lpComputerName);\n\n  typedef enum _COMPUTER_NAME_FORMAT {\n    ComputerNameNetBIOS,ComputerNameDnsHostname,ComputerNameDnsDomain,ComputerNameDnsFullyQualified,ComputerNamePhysicalNetBIOS,ComputerNamePhysicalDnsHostname,ComputerNamePhysicalDnsDomain,ComputerNamePhysicalDnsFullyQualified,ComputerNameMax\n  } COMPUTER_NAME_FORMAT;\n\n  WINBASEAPI WINBOOL WINAPI GetComputerNameExA(COMPUTER_NAME_FORMAT NameType,LPSTR lpBuffer,LPDWORD nSize);\n  WINBASEAPI WINBOOL WINAPI GetComputerNameExW(COMPUTER_NAME_FORMAT NameType,LPWSTR lpBuffer,LPDWORD nSize);\n  WINBASEAPI WINBOOL WINAPI SetComputerNameExA(COMPUTER_NAME_FORMAT NameType,LPCSTR lpBuffer);\n  WINBASEAPI WINBOOL WINAPI SetComputerNameExW(COMPUTER_NAME_FORMAT NameType,LPCWSTR lpBuffer);\n  WINBASEAPI WINBOOL WINAPI DnsHostnameToComputerNameA(LPCSTR Hostname,LPSTR ComputerName,LPDWORD nSize);\n  WINBASEAPI WINBOOL WINAPI DnsHostnameToComputerNameW(LPCWSTR Hostname,LPWSTR ComputerName,LPDWORD nSize);\n  WINADVAPI WINBOOL WINAPI GetUserNameA(LPSTR lpBuffer,LPDWORD pcbBuffer);\n  WINADVAPI WINBOOL WINAPI GetUserNameW(LPWSTR lpBuffer,LPDWORD pcbBuffer);\n\n#define LOGON32_LOGON_INTERACTIVE 2\n#define LOGON32_LOGON_NETWORK 3\n#define LOGON32_LOGON_BATCH 4\n#define LOGON32_LOGON_SERVICE 5\n#define LOGON32_LOGON_UNLOCK 7\n#define LOGON32_LOGON_NETWORK_CLEARTEXT 8\n#define LOGON32_LOGON_NEW_CREDENTIALS 9\n\n#define LOGON32_PROVIDER_DEFAULT 0\n#define LOGON32_PROVIDER_WINNT35 1\n#define LOGON32_PROVIDER_WINNT40 2\n#define LOGON32_PROVIDER_WINNT50 3\n\n#ifdef UNICODE\n#define LogonUser LogonUserW\n#define LogonUserEx LogonUserExW\n#define CreateProcessAsUser CreateProcessAsUserW\n#else\n#define LogonUser LogonUserA\n#define LogonUserEx LogonUserExA\n#define CreateProcessAsUser CreateProcessAsUserA\n#endif\n\n  WINADVAPI WINBOOL WINAPI LogonUserA(LPCSTR lpszUsername,LPCSTR lpszDomain,LPCSTR lpszPassword,DWORD dwLogonType,DWORD dwLogonProvider,PHANDLE phToken);\n  WINADVAPI WINBOOL WINAPI LogonUserW(LPCWSTR lpszUsername,LPCWSTR lpszDomain,LPCWSTR lpszPassword,DWORD dwLogonType,DWORD dwLogonProvider,PHANDLE phToken);\n  WINADVAPI WINBOOL WINAPI LogonUserExA(LPCSTR lpszUsername,LPCSTR lpszDomain,LPCSTR lpszPassword,DWORD dwLogonType,DWORD dwLogonProvider,PHANDLE phToken,PSID *ppLogonSid,PVOID *ppProfileBuffer,LPDWORD pdwProfileLength,PQUOTA_LIMITS pQuotaLimits);\n  WINADVAPI WINBOOL WINAPI LogonUserExW(LPCWSTR lpszUsername,LPCWSTR lpszDomain,LPCWSTR lpszPassword,DWORD dwLogonType,DWORD dwLogonProvider,PHANDLE phToken,PSID *ppLogonSid,PVOID *ppProfileBuffer,LPDWORD pdwProfileLength,PQUOTA_LIMITS pQuotaLimits);\n  WINADVAPI WINBOOL WINAPI ImpersonateLoggedOnUser(HANDLE hToken);\n  WINADVAPI WINBOOL WINAPI CreateProcessAsUserA(HANDLE hToken,LPCSTR lpApplicationName,LPSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,WINBOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);\n  WINADVAPI WINBOOL WINAPI CreateProcessAsUserW(HANDLE hToken,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,WINBOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);\n\n#define LOGON_WITH_PROFILE 0x1\n#define LOGON_NETCREDENTIALS_ONLY 0x2\n#define LOGON_ZERO_PASSWORD_BUFFER 0x80000000\n\n  WINADVAPI WINBOOL WINAPI CreateProcessWithLogonW(LPCWSTR lpUsername,LPCWSTR lpDomain,LPCWSTR lpPassword,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);\n  WINADVAPI WINBOOL WINAPI CreateProcessWithTokenW(HANDLE hToken,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);\n  WINADVAPI WINBOOL WINAPI ImpersonateAnonymousToken(HANDLE ThreadHandle);\n  WINADVAPI WINBOOL WINAPI DuplicateTokenEx(HANDLE hExistingToken,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpTokenAttributes,SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,TOKEN_TYPE TokenType,PHANDLE phNewToken);\n  WINADVAPI WINBOOL WINAPI CreateRestrictedToken(HANDLE ExistingTokenHandle,DWORD Flags,DWORD DisableSidCount,PSID_AND_ATTRIBUTES SidsToDisable,DWORD DeletePrivilegeCount,PLUID_AND_ATTRIBUTES PrivilegesToDelete,DWORD RestrictedSidCount,PSID_AND_ATTRIBUTES SidsToRestrict,PHANDLE NewTokenHandle);\n  WINADVAPI WINBOOL WINAPI IsTokenRestricted(HANDLE TokenHandle);\n  WINADVAPI WINBOOL WINAPI IsTokenUntrusted(HANDLE TokenHandle);\n  WINADVAPI WINBOOL WINAPI CheckTokenMembership(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);\n\n  typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK;\n\n  WINBASEAPI WINBOOL WINAPI RegisterWaitForSingleObject(PHANDLE phNewWaitObject,HANDLE hObject,WAITORTIMERCALLBACK Callback,PVOID Context,ULONG dwMilliseconds,ULONG dwFlags);\n  WINBASEAPI HANDLE WINAPI RegisterWaitForSingleObjectEx(HANDLE hObject,WAITORTIMERCALLBACK Callback,PVOID Context,ULONG dwMilliseconds,ULONG dwFlags);\n  WINBASEAPI WINBOOL WINAPI UnregisterWait(HANDLE WaitHandle);\n  WINBASEAPI WINBOOL WINAPI UnregisterWaitEx(HANDLE WaitHandle,HANDLE CompletionEvent);\n  WINBASEAPI WINBOOL WINAPI QueueUserWorkItem(LPTHREAD_START_ROUTINE Function,PVOID Context,ULONG Flags);\n  WINBASEAPI WINBOOL WINAPI BindIoCompletionCallback(HANDLE FileHandle,LPOVERLAPPED_COMPLETION_ROUTINE Function,ULONG Flags);\n  WINBASEAPI HANDLE WINAPI CreateTimerQueue(VOID);\n  WINBASEAPI WINBOOL WINAPI CreateTimerQueueTimer(PHANDLE phNewTimer,HANDLE TimerQueue,WAITORTIMERCALLBACK Callback,PVOID Parameter,DWORD DueTime,DWORD Period,ULONG Flags);\n  WINBASEAPI WINBOOL WINAPI ChangeTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period);\n  WINBASEAPI WINBOOL WINAPI DeleteTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent);\n  WINBASEAPI WINBOOL WINAPI DeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent);\n  WINBASEAPI HANDLE WINAPI SetTimerQueueTimer(HANDLE TimerQueue,WAITORTIMERCALLBACK Callback,PVOID Parameter,DWORD DueTime,DWORD Period,WINBOOL PreferIo);\n  WINBASEAPI WINBOOL WINAPI CancelTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer);\n  WINBASEAPI WINBOOL WINAPI DeleteTimerQueue(HANDLE TimerQueue);\n\n#define HW_PROFILE_GUIDLEN 39\n#define MAX_PROFILE_LEN 80\n\n#define DOCKINFO_UNDOCKED (0x1)\n#define DOCKINFO_DOCKED (0x2)\n#define DOCKINFO_USER_SUPPLIED (0x4)\n#define DOCKINFO_USER_UNDOCKED (DOCKINFO_USER_SUPPLIED | DOCKINFO_UNDOCKED)\n#define DOCKINFO_USER_DOCKED (DOCKINFO_USER_SUPPLIED | DOCKINFO_DOCKED)\n\n  typedef struct tagHW_PROFILE_INFOA {\n    DWORD dwDockInfo;\n    CHAR szHwProfileGuid[HW_PROFILE_GUIDLEN];\n    CHAR szHwProfileName[MAX_PROFILE_LEN];\n  } HW_PROFILE_INFOA,*LPHW_PROFILE_INFOA;\n\n  typedef struct tagHW_PROFILE_INFOW {\n    DWORD dwDockInfo;\n    WCHAR szHwProfileGuid[HW_PROFILE_GUIDLEN];\n    WCHAR szHwProfileName[MAX_PROFILE_LEN];\n  } HW_PROFILE_INFOW,*LPHW_PROFILE_INFOW;\n\n#ifdef UNICODE\n  typedef HW_PROFILE_INFOW HW_PROFILE_INFO;\n  typedef LPHW_PROFILE_INFOW LPHW_PROFILE_INFO;\n#else\n  typedef HW_PROFILE_INFOA HW_PROFILE_INFO;\n  typedef LPHW_PROFILE_INFOA LPHW_PROFILE_INFO;\n#endif\n\n#ifdef UNICODE\n#define GetCurrentHwProfile GetCurrentHwProfileW\n#define GetVersionEx GetVersionExW\n#define VerifyVersionInfo VerifyVersionInfoW\n#else\n#define GetCurrentHwProfile GetCurrentHwProfileA\n#define GetVersionEx GetVersionExA\n#define VerifyVersionInfo VerifyVersionInfoA\n#endif\n\n  WINADVAPI WINBOOL WINAPI GetCurrentHwProfileA (LPHW_PROFILE_INFOA lpHwProfileInfo);\n  WINADVAPI WINBOOL WINAPI GetCurrentHwProfileW (LPHW_PROFILE_INFOW lpHwProfileInfo);\n  WINBASEAPI WINBOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);\n  WINBASEAPI WINBOOL WINAPI QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);\n  WINBASEAPI WINBOOL WINAPI GetVersionExA(LPOSVERSIONINFOA lpVersionInformation);\n  WINBASEAPI WINBOOL WINAPI GetVersionExW(LPOSVERSIONINFOW lpVersionInformation);\n  WINBASEAPI WINBOOL WINAPI VerifyVersionInfoA(LPOSVERSIONINFOEXA lpVersionInformation,DWORD dwTypeMask,DWORDLONG dwlConditionMask);\n  WINBASEAPI WINBOOL WINAPI VerifyVersionInfoW(LPOSVERSIONINFOEXW lpVersionInformation,DWORD dwTypeMask,DWORDLONG dwlConditionMask);\n\n#include <winerror.h>\n\n#define TC_NORMAL 0\n#define TC_HARDERR 1\n#define TC_GP_TRAP 2\n#define TC_SIGNAL 3\n\n#define AC_LINE_OFFLINE 0x0\n#define AC_LINE_ONLINE 0x1\n#define AC_LINE_BACKUP_POWER 0x2\n#define AC_LINE_UNKNOWN 0xff\n\n#define BATTERY_FLAG_HIGH 0x1\n#define BATTERY_FLAG_LOW 0x2\n#define BATTERY_FLAG_CRITICAL 0x4\n#define BATTERY_FLAG_CHARGING 0x8\n#define BATTERY_FLAG_NO_BATTERY 0x80\n#define BATTERY_FLAG_UNKNOWN 0xff\n\n#define BATTERY_PERCENTAGE_UNKNOWN 0xff\n\n#define BATTERY_LIFE_UNKNOWN 0xffffffff\n\n  typedef struct _SYSTEM_POWER_STATUS {\n    BYTE ACLineStatus;\n    BYTE BatteryFlag;\n    BYTE BatteryLifePercent;\n    BYTE Reserved1;\n    DWORD BatteryLifeTime;\n    DWORD BatteryFullLifeTime;\n  } SYSTEM_POWER_STATUS,*LPSYSTEM_POWER_STATUS;\n\n#ifdef UNICODE\n#define CreateJobObject CreateJobObjectW\n#define OpenJobObject OpenJobObjectW\n#define FindFirstVolume FindFirstVolumeW\n#define FindNextVolume FindNextVolumeW\n#define FindFirstVolumeMountPoint FindFirstVolumeMountPointW\n#define FindNextVolumeMountPoint FindNextVolumeMountPointW\n#define SetVolumeMountPoint SetVolumeMountPointW\n#define DeleteVolumeMountPoint DeleteVolumeMountPointW\n#define GetVolumeNameForVolumeMountPoint GetVolumeNameForVolumeMountPointW\n#define GetVolumePathName GetVolumePathNameW\n#define GetVolumePathNamesForVolumeName GetVolumePathNamesForVolumeNameW\n#else\n#define CreateJobObject CreateJobObjectA\n#define OpenJobObject OpenJobObjectA\n#define FindFirstVolume FindFirstVolumeA\n#define FindNextVolume FindNextVolumeA\n#define FindFirstVolumeMountPoint FindFirstVolumeMountPointA\n#define FindNextVolumeMountPoint FindNextVolumeMountPointA\n#define SetVolumeMountPoint SetVolumeMountPointA\n#define DeleteVolumeMountPoint DeleteVolumeMountPointA\n#define GetVolumeNameForVolumeMountPoint GetVolumeNameForVolumeMountPointA\n#define GetVolumePathName GetVolumePathNameA\n#define GetVolumePathNamesForVolumeName GetVolumePathNamesForVolumeNameA\n#endif\n\n  WINBOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS lpSystemPowerStatus);\n  WINBOOL WINAPI SetSystemPowerState(WINBOOL fSuspend,WINBOOL fForce);\n  WINBASEAPI WINBOOL WINAPI AllocateUserPhysicalPages(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR PageArray);\n  WINBASEAPI WINBOOL WINAPI FreeUserPhysicalPages(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR PageArray);\n  WINBASEAPI WINBOOL WINAPI MapUserPhysicalPages(PVOID VirtualAddress,ULONG_PTR NumberOfPages,PULONG_PTR PageArray);\n  WINBASEAPI WINBOOL WINAPI MapUserPhysicalPagesScatter(PVOID *VirtualAddresses,ULONG_PTR NumberOfPages,PULONG_PTR PageArray);\n  WINBASEAPI HANDLE WINAPI CreateJobObjectA(LPSECURITY_ATTRIBUTES lpJobAttributes,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI CreateJobObjectW(LPSECURITY_ATTRIBUTES lpJobAttributes,LPCWSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenJobObjectA(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCSTR lpName);\n  WINBASEAPI HANDLE WINAPI OpenJobObjectW(DWORD dwDesiredAccess,WINBOOL bInheritHandle,LPCWSTR lpName);\n  WINBASEAPI WINBOOL WINAPI AssignProcessToJobObject(HANDLE hJob,HANDLE hProcess);\n  WINBASEAPI WINBOOL WINAPI TerminateJobObject(HANDLE hJob,UINT uExitCode);\n  WINBASEAPI WINBOOL WINAPI QueryInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInformationClass,LPVOID lpJobObjectInformation,DWORD cbJobObjectInformationLength,LPDWORD lpReturnLength);\n  WINBASEAPI WINBOOL WINAPI SetInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInformationClass,LPVOID lpJobObjectInformation,DWORD cbJobObjectInformationLength);\n  WINBASEAPI WINBOOL WINAPI IsProcessInJob(HANDLE ProcessHandle,HANDLE JobHandle,PBOOL Result);\n  WINBASEAPI WINBOOL WINAPI CreateJobSet(ULONG NumJob,PJOB_SET_ARRAY UserJobSet,ULONG Flags);\n  WINBASEAPI PVOID WINAPI AddVectoredExceptionHandler (ULONG First,PVECTORED_EXCEPTION_HANDLER Handler);\n  WINBASEAPI ULONG WINAPI RemoveVectoredExceptionHandler(PVOID Handle);\n  WINBASEAPI PVOID WINAPI AddVectoredContinueHandler (ULONG First,PVECTORED_EXCEPTION_HANDLER Handler);\n  WINBASEAPI ULONG WINAPI RemoveVectoredContinueHandler(PVOID Handle);\n  WINBASEAPI HANDLE WINAPI FindFirstVolumeA(LPSTR lpszVolumeName,DWORD cchBufferLength);\n  WINBASEAPI HANDLE WINAPI FindFirstVolumeW(LPWSTR lpszVolumeName,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI FindNextVolumeA(HANDLE hFindVolume,LPSTR lpszVolumeName,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI FindNextVolumeW(HANDLE hFindVolume,LPWSTR lpszVolumeName,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI FindVolumeClose(HANDLE hFindVolume);\n  WINBASEAPI HANDLE WINAPI FindFirstVolumeMountPointA(LPCSTR lpszRootPathName,LPSTR lpszVolumeMountPoint,DWORD cchBufferLength);\n  WINBASEAPI HANDLE WINAPI FindFirstVolumeMountPointW(LPCWSTR lpszRootPathName,LPWSTR lpszVolumeMountPoint,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI FindNextVolumeMountPointA(HANDLE hFindVolumeMountPoint,LPSTR lpszVolumeMountPoint,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI FindNextVolumeMountPointW(HANDLE hFindVolumeMountPoint,LPWSTR lpszVolumeMountPoint,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI FindVolumeMountPointClose(HANDLE hFindVolumeMountPoint);\n  WINBASEAPI WINBOOL WINAPI SetVolumeMountPointA(LPCSTR lpszVolumeMountPoint,LPCSTR lpszVolumeName);\n  WINBASEAPI WINBOOL WINAPI SetVolumeMountPointW(LPCWSTR lpszVolumeMountPoint,LPCWSTR lpszVolumeName);\n  WINBASEAPI WINBOOL WINAPI DeleteVolumeMountPointA(LPCSTR lpszVolumeMountPoint);\n  WINBASEAPI WINBOOL WINAPI DeleteVolumeMountPointW(LPCWSTR lpszVolumeMountPoint);\n  WINBASEAPI WINBOOL WINAPI GetVolumeNameForVolumeMountPointA(LPCSTR lpszVolumeMountPoint,LPSTR lpszVolumeName,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI GetVolumeNameForVolumeMountPointW(LPCWSTR lpszVolumeMountPoint,LPWSTR lpszVolumeName,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI GetVolumePathNameA(LPCSTR lpszFileName,LPSTR lpszVolumePathName,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI GetVolumePathNameW(LPCWSTR lpszFileName,LPWSTR lpszVolumePathName,DWORD cchBufferLength);\n  WINBASEAPI WINBOOL WINAPI GetVolumePathNamesForVolumeNameA(LPCSTR lpszVolumeName,LPCH lpszVolumePathNames,DWORD cchBufferLength,PDWORD lpcchReturnLength);\n  WINBASEAPI WINBOOL WINAPI GetVolumePathNamesForVolumeNameW(LPCWSTR lpszVolumeName,LPWCH lpszVolumePathNames,DWORD cchBufferLength,PDWORD lpcchReturnLength);\n\n#define ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID 0x1\n#define ACTCTX_FLAG_LANGID_VALID 0x2\n#define ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID 0x4\n#define ACTCTX_FLAG_RESOURCE_NAME_VALID 0x8\n#define ACTCTX_FLAG_SET_PROCESS_DEFAULT 0x10\n#define ACTCTX_FLAG_APPLICATION_NAME_VALID 0x20\n#define ACTCTX_FLAG_SOURCE_IS_ASSEMBLYREF 0x40\n#define ACTCTX_FLAG_HMODULE_VALID 0x80\n\n  typedef struct tagACTCTXA {\n    ULONG cbSize;\n    DWORD dwFlags;\n    LPCSTR lpSource;\n    USHORT wProcessorArchitecture;\n    LANGID wLangId;\n    LPCSTR lpAssemblyDirectory;\n    LPCSTR lpResourceName;\n    LPCSTR lpApplicationName;\n    HMODULE hModule;\n  } ACTCTXA,*PACTCTXA;\n\n  typedef struct tagACTCTXW {\n    ULONG cbSize;\n    DWORD dwFlags;\n    LPCWSTR lpSource;\n    USHORT wProcessorArchitecture;\n    LANGID wLangId;\n    LPCWSTR lpAssemblyDirectory;\n    LPCWSTR lpResourceName;\n    LPCWSTR lpApplicationName;\n    HMODULE hModule;\n  } ACTCTXW,*PACTCTXW;\n\n  typedef const ACTCTXA *PCACTCTXA;\n  typedef const ACTCTXW *PCACTCTXW;\n\n#ifdef UNICODE\n  typedef ACTCTXW ACTCTX;\n  typedef PACTCTXW PACTCTX;\n  typedef PCACTCTXW PCACTCTX;\n#else\n  typedef ACTCTXA ACTCTX;\n  typedef PACTCTXA PACTCTX;\n  typedef PCACTCTXA PCACTCTX;\n#endif\n\n#ifdef UNICODE\n#define CreateActCtx CreateActCtxW\n#else\n#define CreateActCtx CreateActCtxA\n#endif\n\n  WINBASEAPI HANDLE WINAPI CreateActCtxA(PCACTCTXA pActCtx);\n  WINBASEAPI HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx);\n  WINBASEAPI VOID WINAPI AddRefActCtx(HANDLE hActCtx);\n  WINBASEAPI VOID WINAPI ReleaseActCtx(HANDLE hActCtx);\n  WINBASEAPI WINBOOL WINAPI ZombifyActCtx(HANDLE hActCtx);\n  WINBASEAPI WINBOOL WINAPI ActivateActCtx(HANDLE hActCtx,ULONG_PTR *lpCookie);\n\n#define DEACTIVATE_ACTCTX_FLAG_FORCE_EARLY_DEACTIVATION (0x1)\n\n  WINBASEAPI WINBOOL WINAPI DeactivateActCtx(DWORD dwFlags,ULONG_PTR ulCookie);\n  WINBASEAPI WINBOOL WINAPI GetCurrentActCtx(HANDLE *lphActCtx);\n\n  typedef struct tagACTCTX_SECTION_KEYED_DATA_2600 {\n    ULONG cbSize;\n    ULONG ulDataFormatVersion;\n    PVOID lpData;\n    ULONG ulLength;\n    PVOID lpSectionGlobalData;\n    ULONG ulSectionGlobalDataLength;\n    PVOID lpSectionBase;\n    ULONG ulSectionTotalLength;\n    HANDLE hActCtx;\n    ULONG ulAssemblyRosterIndex;\n  } ACTCTX_SECTION_KEYED_DATA_2600,*PACTCTX_SECTION_KEYED_DATA_2600;\n\n  typedef const ACTCTX_SECTION_KEYED_DATA_2600 *PCACTCTX_SECTION_KEYED_DATA_2600;\n\n  typedef struct tagACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA {\n    PVOID lpInformation;\n    PVOID lpSectionBase;\n    ULONG ulSectionLength;\n    PVOID lpSectionGlobalDataBase;\n    ULONG ulSectionGlobalDataLength;\n  } ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA,*PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;\n\n  typedef const ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA *PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;\n\n  typedef struct tagACTCTX_SECTION_KEYED_DATA {\n    ULONG cbSize;\n    ULONG ulDataFormatVersion;\n    PVOID lpData;\n    ULONG ulLength;\n    PVOID lpSectionGlobalData;\n    ULONG ulSectionGlobalDataLength;\n    PVOID lpSectionBase;\n    ULONG ulSectionTotalLength;\n    HANDLE hActCtx;\n    ULONG ulAssemblyRosterIndex;\n\n    ULONG ulFlags;\n    ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA AssemblyMetadata;\n  } ACTCTX_SECTION_KEYED_DATA,*PACTCTX_SECTION_KEYED_DATA;\n\n  typedef const ACTCTX_SECTION_KEYED_DATA *PCACTCTX_SECTION_KEYED_DATA;\n\n#define FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX 0x1\n#define FIND_ACTCTX_SECTION_KEY_RETURN_FLAGS 0x2\n#define FIND_ACTCTX_SECTION_KEY_RETURN_ASSEMBLY_METADATA 0x4\n\n#ifdef UNICODE\n#define FindActCtxSectionString FindActCtxSectionStringW\n#else\n#define FindActCtxSectionString FindActCtxSectionStringA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags,const GUID *lpExtensionGuid,ULONG ulSectionId,LPCSTR lpStringToFind,PACTCTX_SECTION_KEYED_DATA ReturnedData);\n  WINBASEAPI WINBOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags,const GUID *lpExtensionGuid,ULONG ulSectionId,LPCWSTR lpStringToFind,PACTCTX_SECTION_KEYED_DATA ReturnedData);\n  WINBASEAPI WINBOOL WINAPI FindActCtxSectionGuid(DWORD dwFlags,const GUID *lpExtensionGuid,ULONG ulSectionId,const GUID *lpGuidToFind,PACTCTX_SECTION_KEYED_DATA ReturnedData);\n\n#ifndef RC_INVOKED\n#ifndef ACTIVATION_CONTEXT_BASIC_INFORMATION_DEFINED\n\n  typedef struct _ACTIVATION_CONTEXT_BASIC_INFORMATION {\n    HANDLE hActCtx;\n    DWORD dwFlags;\n  } ACTIVATION_CONTEXT_BASIC_INFORMATION,*PACTIVATION_CONTEXT_BASIC_INFORMATION;\n\n  typedef const struct _ACTIVATION_CONTEXT_BASIC_INFORMATION *PCACTIVATION_CONTEXT_BASIC_INFORMATION;\n\n#define ACTIVATION_CONTEXT_BASIC_INFORMATION_DEFINED 1\n#endif\n#endif\n\n#define QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX 0x4\n#define QUERY_ACTCTX_FLAG_ACTCTX_IS_HMODULE 0x8\n#define QUERY_ACTCTX_FLAG_ACTCTX_IS_ADDRESS 0x10\n#define QUERY_ACTCTX_FLAG_NO_ADDREF 0x80000000\n\n  WINBASEAPI WINBOOL WINAPI QueryActCtxW(DWORD dwFlags,HANDLE hActCtx,PVOID pvSubInstance,ULONG ulInfoClass,PVOID pvBuffer,SIZE_T cbBuffer,SIZE_T *pcbWrittenOrRequired);\n\n  typedef WINBOOL (WINAPI *PQUERYACTCTXW_FUNC)(DWORD dwFlags,HANDLE hActCtx,PVOID pvSubInstance,ULONG ulInfoClass,PVOID pvBuffer,SIZE_T cbBuffer,SIZE_T *pcbWrittenOrRequired);\n\n  WINBASEAPI WINBOOL WINAPI ProcessIdToSessionId(DWORD dwProcessId,DWORD *pSessionId);\n  WINBASEAPI DWORD WINAPI WTSGetActiveConsoleSessionId();\n  WINBASEAPI WINBOOL WINAPI IsWow64Process(HANDLE hProcess,PBOOL Wow64Process);\n  WINBASEAPI WINBOOL WINAPI GetLogicalProcessorInformation(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,PDWORD ReturnedLength);\n  WINBASEAPI WINBOOL WINAPI GetNumaHighestNodeNumber(PULONG HighestNodeNumber);\n  WINBASEAPI WINBOOL WINAPI GetNumaProcessorNode(UCHAR Processor,PUCHAR NodeNumber);\n  WINBASEAPI WINBOOL WINAPI GetNumaNodeProcessorMask(UCHAR Node,PULONGLONG ProcessorMask);\n  WINBASEAPI WINBOOL WINAPI GetNumaAvailableMemoryNode(UCHAR Node,PULONGLONG AvailableBytes);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/wincon.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINCON_\n#define _WINCON_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n  typedef struct _COORD {\n    SHORT X;\n    SHORT Y;\n  } COORD,*PCOORD;\n\n  typedef struct _SMALL_RECT {\n    SHORT Left;\n    SHORT Top;\n    SHORT Right;\n    SHORT Bottom;\n  } SMALL_RECT,*PSMALL_RECT;\n\n  typedef struct _KEY_EVENT_RECORD {\n    WINBOOL bKeyDown;\n    WORD wRepeatCount;\n    WORD wVirtualKeyCode;\n    WORD wVirtualScanCode;\n    union {\n      WCHAR UnicodeChar;\n      CHAR AsciiChar;\n    } uChar;\n    DWORD dwControlKeyState;\n  } KEY_EVENT_RECORD,*PKEY_EVENT_RECORD;\n\n#define RIGHT_ALT_PRESSED 0x1\n#define LEFT_ALT_PRESSED 0x2\n#define RIGHT_CTRL_PRESSED 0x4\n#define LEFT_CTRL_PRESSED 0x8\n#define SHIFT_PRESSED 0x10\n#define NUMLOCK_ON 0x20\n#define SCROLLLOCK_ON 0x40\n#define CAPSLOCK_ON 0x80\n#define ENHANCED_KEY 0x100\n#define NLS_DBCSCHAR 0x10000\n#define NLS_ALPHANUMERIC 0x0\n#define NLS_KATAKANA 0x20000\n#define NLS_HIRAGANA 0x40000\n#define NLS_ROMAN 0x400000\n#define NLS_IME_CONVERSION 0x800000\n#define NLS_IME_DISABLE 0x20000000\n\n  typedef struct _MOUSE_EVENT_RECORD {\n    COORD dwMousePosition;\n    DWORD dwButtonState;\n    DWORD dwControlKeyState;\n    DWORD dwEventFlags;\n  } MOUSE_EVENT_RECORD,*PMOUSE_EVENT_RECORD;\n\n#define FROM_LEFT_1ST_BUTTON_PRESSED 0x1\n#define RIGHTMOST_BUTTON_PRESSED 0x2\n#define FROM_LEFT_2ND_BUTTON_PRESSED 0x4\n#define FROM_LEFT_3RD_BUTTON_PRESSED 0x8\n#define FROM_LEFT_4TH_BUTTON_PRESSED 0x10\n\n#define MOUSE_MOVED 0x1\n#define DOUBLE_CLICK 0x2\n#define MOUSE_WHEELED 0x4\n\n  typedef struct _WINDOW_BUFFER_SIZE_RECORD {\n    COORD dwSize;\n  } WINDOW_BUFFER_SIZE_RECORD,*PWINDOW_BUFFER_SIZE_RECORD;\n\n  typedef struct _MENU_EVENT_RECORD {\n    UINT dwCommandId;\n  } MENU_EVENT_RECORD,*PMENU_EVENT_RECORD;\n\n  typedef struct _FOCUS_EVENT_RECORD {\n    WINBOOL bSetFocus;\n  } FOCUS_EVENT_RECORD,*PFOCUS_EVENT_RECORD;\n\n  typedef struct _INPUT_RECORD {\n    WORD EventType;\n    union {\n      KEY_EVENT_RECORD KeyEvent;\n      MOUSE_EVENT_RECORD MouseEvent;\n      WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;\n      MENU_EVENT_RECORD MenuEvent;\n      FOCUS_EVENT_RECORD FocusEvent;\n    } Event;\n  } INPUT_RECORD,*PINPUT_RECORD;\n\n#define KEY_EVENT 0x1\n#define MOUSE_EVENT 0x2\n#define WINDOW_BUFFER_SIZE_EVENT 0x4\n#define MENU_EVENT 0x8\n#define FOCUS_EVENT 0x10\n\n  typedef struct _CHAR_INFO {\n    union {\n      WCHAR UnicodeChar;\n      CHAR AsciiChar;\n    } Char;\n    WORD Attributes;\n  } CHAR_INFO,*PCHAR_INFO;\n\n#define FOREGROUND_BLUE 0x1\n#define FOREGROUND_GREEN 0x2\n#define FOREGROUND_RED 0x4\n#define FOREGROUND_INTENSITY 0x8\n#define BACKGROUND_BLUE 0x10\n#define BACKGROUND_GREEN 0x20\n#define BACKGROUND_RED 0x40\n#define BACKGROUND_INTENSITY 0x80\n#define COMMON_LVB_LEADING_BYTE 0x100\n#define COMMON_LVB_TRAILING_BYTE 0x200\n#define COMMON_LVB_GRID_HORIZONTAL 0x400\n#define COMMON_LVB_GRID_LVERTICAL 0x800\n#define COMMON_LVB_GRID_RVERTICAL 0x1000\n#define COMMON_LVB_REVERSE_VIDEO 0x4000\n#define COMMON_LVB_UNDERSCORE 0x8000\n\n#define COMMON_LVB_SBCSDBCS 0x300\n\n  typedef struct _CONSOLE_SCREEN_BUFFER_INFO {\n    COORD dwSize;\n    COORD dwCursorPosition;\n    WORD wAttributes;\n    SMALL_RECT srWindow;\n    COORD dwMaximumWindowSize;\n  } CONSOLE_SCREEN_BUFFER_INFO,*PCONSOLE_SCREEN_BUFFER_INFO;\n\n  typedef struct _CONSOLE_CURSOR_INFO {\n    DWORD dwSize;\n    WINBOOL bVisible;\n  } CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO;\n\n  typedef struct _CONSOLE_FONT_INFO {\n    DWORD nFont;\n    COORD dwFontSize;\n  } CONSOLE_FONT_INFO,*PCONSOLE_FONT_INFO;\n\n  typedef struct _CONSOLE_SELECTION_INFO {\n    DWORD dwFlags;\n    COORD dwSelectionAnchor;\n    SMALL_RECT srSelection;\n  } CONSOLE_SELECTION_INFO,*PCONSOLE_SELECTION_INFO;\n\n#define CONSOLE_NO_SELECTION 0x0\n#define CONSOLE_SELECTION_IN_PROGRESS 0x1\n#define CONSOLE_SELECTION_NOT_EMPTY 0x2\n#define CONSOLE_MOUSE_SELECTION 0x4\n#define CONSOLE_MOUSE_DOWN 0x8\n\n  typedef WINBOOL (WINAPI *PHANDLER_ROUTINE)(DWORD CtrlType);\n\n#define CTRL_C_EVENT 0\n#define CTRL_BREAK_EVENT 1\n#define CTRL_CLOSE_EVENT 2\n\n#define CTRL_LOGOFF_EVENT 5\n#define CTRL_SHUTDOWN_EVENT 6\n\n#define ENABLE_PROCESSED_INPUT 0x1\n#define ENABLE_LINE_INPUT 0x2\n#define ENABLE_ECHO_INPUT 0x4\n#define ENABLE_WINDOW_INPUT 0x8\n#define ENABLE_MOUSE_INPUT 0x10\n\n#define ENABLE_PROCESSED_OUTPUT 0x1\n#define ENABLE_WRAP_AT_EOL_OUTPUT 0x2\n\n#ifdef UNICODE\n#define PeekConsoleInput PeekConsoleInputW\n#define ReadConsoleInput ReadConsoleInputW\n#define WriteConsoleInput WriteConsoleInputW\n#define ReadConsoleOutput ReadConsoleOutputW\n#define WriteConsoleOutput WriteConsoleOutputW\n#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterW\n#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterW\n#define FillConsoleOutputCharacter FillConsoleOutputCharacterW\n#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferW\n#define GetConsoleTitle GetConsoleTitleW\n#define SetConsoleTitle SetConsoleTitleW\n#define ReadConsole ReadConsoleW\n#define WriteConsole WriteConsoleW\n#define AddConsoleAlias AddConsoleAliasW\n#define GetConsoleAlias GetConsoleAliasW\n#define GetConsoleAliasesLength GetConsoleAliasesLengthW\n#define GetConsoleAliasExesLength GetConsoleAliasExesLengthW\n#define GetConsoleAliases GetConsoleAliasesW\n#define GetConsoleAliasExes GetConsoleAliasExesW\n#else\n#define PeekConsoleInput PeekConsoleInputA\n#define ReadConsoleInput ReadConsoleInputA\n#define WriteConsoleInput WriteConsoleInputA\n#define ReadConsoleOutput ReadConsoleOutputA\n#define WriteConsoleOutput WriteConsoleOutputA\n#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterA\n#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterA\n#define FillConsoleOutputCharacter FillConsoleOutputCharacterA\n#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferA\n#define GetConsoleTitle GetConsoleTitleA\n#define SetConsoleTitle SetConsoleTitleA\n#define ReadConsole ReadConsoleA\n#define WriteConsole WriteConsoleA\n#define AddConsoleAlias AddConsoleAliasA\n#define GetConsoleAlias GetConsoleAliasA\n#define GetConsoleAliasesLength GetConsoleAliasesLengthA\n#define GetConsoleAliasExesLength GetConsoleAliasExesLengthA\n#define GetConsoleAliases GetConsoleAliasesA\n#define GetConsoleAliasExes GetConsoleAliasExesA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI PeekConsoleInputA(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead);\n  WINBASEAPI WINBOOL WINAPI PeekConsoleInputW(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleInputA(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleInputW(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleInputA(HANDLE hConsoleInput,CONST INPUT_RECORD *lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsWritten);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleInputW(HANDLE hConsoleInput,CONST INPUT_RECORD *lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsWritten);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleOutputA(HANDLE hConsoleOutput,PCHAR_INFO lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpReadRegion);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleOutputW(HANDLE hConsoleOutput,PCHAR_INFO lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpReadRegion);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleOutputA(HANDLE hConsoleOutput,CONST CHAR_INFO *lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpWriteRegion);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleOutputW(HANDLE hConsoleOutput,CONST CHAR_INFO *lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpWriteRegion);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleOutputCharacterA(HANDLE hConsoleOutput,LPSTR lpCharacter,DWORD nLength,COORD dwReadCoord,LPDWORD lpNumberOfCharsRead);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleOutputCharacterW(HANDLE hConsoleOutput,LPWSTR lpCharacter,DWORD nLength,COORD dwReadCoord,LPDWORD lpNumberOfCharsRead);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleOutputAttribute(HANDLE hConsoleOutput,LPWORD lpAttribute,DWORD nLength,COORD dwReadCoord,LPDWORD lpNumberOfAttrsRead);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleOutputCharacterA(HANDLE hConsoleOutput,LPCSTR lpCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleOutputCharacterW(HANDLE hConsoleOutput,LPCWSTR lpCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleOutputAttribute(HANDLE hConsoleOutput,CONST WORD *lpAttribute,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfAttrsWritten);\n  WINBASEAPI WINBOOL WINAPI FillConsoleOutputCharacterA(HANDLE hConsoleOutput,CHAR cCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten);\n  WINBASEAPI WINBOOL WINAPI FillConsoleOutputCharacterW(HANDLE hConsoleOutput,WCHAR cCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten);\n  WINBASEAPI WINBOOL WINAPI FillConsoleOutputAttribute(HANDLE hConsoleOutput,WORD wAttribute,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfAttrsWritten);\n  WINBASEAPI WINBOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle,LPDWORD lpMode);\n  WINBASEAPI WINBOOL WINAPI GetNumberOfConsoleInputEvents(HANDLE hConsoleInput,LPDWORD lpNumberOfEvents);\n  WINBASEAPI WINBOOL WINAPI GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo);\n  WINBASEAPI COORD WINAPI GetLargestConsoleWindowSize(HANDLE hConsoleOutput);\n  WINBASEAPI WINBOOL WINAPI GetConsoleCursorInfo(HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo);\n  WINBASEAPI WINBOOL WINAPI GetCurrentConsoleFont(HANDLE hConsoleOutput,WINBOOL bMaximumWindow,PCONSOLE_FONT_INFO lpConsoleCurrentFont);\n  WINBASEAPI COORD WINAPI GetConsoleFontSize(HANDLE hConsoleOutput,DWORD nFont);\n  WINBASEAPI WINBOOL WINAPI GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo);\n  WINBASEAPI WINBOOL WINAPI GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons);\n  WINBASEAPI WINBOOL WINAPI SetConsoleMode(HANDLE hConsoleHandle,DWORD dwMode);\n  WINBASEAPI WINBOOL WINAPI SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput);\n  WINBASEAPI WINBOOL WINAPI FlushConsoleInputBuffer(HANDLE hConsoleInput);\n  WINBASEAPI WINBOOL WINAPI SetConsoleScreenBufferSize(HANDLE hConsoleOutput,COORD dwSize);\n  WINBASEAPI WINBOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD dwCursorPosition);\n  WINBASEAPI WINBOOL WINAPI SetConsoleCursorInfo(HANDLE hConsoleOutput,CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo);\n  WINBASEAPI WINBOOL WINAPI ScrollConsoleScreenBufferA(HANDLE hConsoleOutput,CONST SMALL_RECT *lpScrollRectangle,CONST SMALL_RECT *lpClipRectangle,COORD dwDestinationOrigin,CONST CHAR_INFO *lpFill);\n  WINBASEAPI WINBOOL WINAPI ScrollConsoleScreenBufferW(HANDLE hConsoleOutput,CONST SMALL_RECT *lpScrollRectangle,CONST SMALL_RECT *lpClipRectangle,COORD dwDestinationOrigin,CONST CHAR_INFO *lpFill);\n  WINBASEAPI WINBOOL WINAPI SetConsoleWindowInfo(HANDLE hConsoleOutput,WINBOOL bAbsolute,CONST SMALL_RECT *lpConsoleWindow);\n  WINBASEAPI WINBOOL WINAPI SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes);\n  WINBASEAPI WINBOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine,WINBOOL Add);\n  WINBASEAPI WINBOOL WINAPI GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,DWORD dwProcessGroupId);\n  WINBASEAPI WINBOOL WINAPI AllocConsole(VOID);\n  WINBASEAPI WINBOOL WINAPI FreeConsole(VOID);\n  WINBASEAPI WINBOOL WINAPI AttachConsole(DWORD dwProcessId);\n\n#define ATTACH_PARENT_PROCESS ((DWORD)-1)\n\n  WINBASEAPI DWORD WINAPI GetConsoleTitleA(LPSTR lpConsoleTitle,DWORD nSize);\n  WINBASEAPI DWORD WINAPI GetConsoleTitleW(LPWSTR lpConsoleTitle,DWORD nSize);\n  WINBASEAPI WINBOOL WINAPI SetConsoleTitleA(LPCSTR lpConsoleTitle);\n  WINBASEAPI WINBOOL WINAPI SetConsoleTitleW(LPCWSTR lpConsoleTitle);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleA(HANDLE hConsoleInput,LPVOID lpBuffer,DWORD nNumberOfCharsToRead,LPDWORD lpNumberOfCharsRead,LPVOID lpReserved);\n  WINBASEAPI WINBOOL WINAPI ReadConsoleW(HANDLE hConsoleInput,LPVOID lpBuffer,DWORD nNumberOfCharsToRead,LPDWORD lpNumberOfCharsRead,LPVOID lpReserved);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleA(HANDLE hConsoleOutput,CONST VOID *lpBuffer,DWORD nNumberOfCharsToWrite,LPDWORD lpNumberOfCharsWritten,LPVOID lpReserved);\n  WINBASEAPI WINBOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput,CONST VOID *lpBuffer,DWORD nNumberOfCharsToWrite,LPDWORD lpNumberOfCharsWritten,LPVOID lpReserved);\n\n#define CONSOLE_TEXTMODE_BUFFER 1\n\n  WINBASEAPI HANDLE WINAPI CreateConsoleScreenBuffer(DWORD dwDesiredAccess,DWORD dwShareMode,CONST SECURITY_ATTRIBUTES *lpSecurityAttributes,DWORD dwFlags,LPVOID lpScreenBufferData);\n  WINBASEAPI UINT WINAPI GetConsoleCP(VOID);\n  WINBASEAPI WINBOOL WINAPI SetConsoleCP(UINT wCodePageID);\n  WINBASEAPI UINT WINAPI GetConsoleOutputCP(VOID);\n  WINBASEAPI WINBOOL WINAPI SetConsoleOutputCP(UINT wCodePageID);\n\n#define CONSOLE_FULLSCREEN 1\n#define CONSOLE_FULLSCREEN_HARDWARE 2\n\n  WINBASEAPI WINBOOL WINAPI GetConsoleDisplayMode(LPDWORD lpModeFlags);\n  WINBASEAPI HWND WINAPI GetConsoleWindow(VOID);\n  WINBASEAPI DWORD WINAPI GetConsoleProcessList(LPDWORD lpdwProcessList,DWORD dwProcessCount);\n  WINBASEAPI WINBOOL WINAPI AddConsoleAliasA(LPSTR Source,LPSTR Target,LPSTR ExeName);\n  WINBASEAPI WINBOOL WINAPI AddConsoleAliasW(LPWSTR Source,LPWSTR Target,LPWSTR ExeName);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasA(LPSTR Source,LPSTR TargetBuffer,DWORD TargetBufferLength,LPSTR ExeName);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasW(LPWSTR Source,LPWSTR TargetBuffer,DWORD TargetBufferLength,LPWSTR ExeName);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasesLengthA(LPSTR ExeName);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasesLengthW(LPWSTR ExeName);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasExesLengthA(VOID);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasExesLengthW(VOID);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasesA(LPSTR AliasBuffer,DWORD AliasBufferLength,LPSTR ExeName);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasesW(LPWSTR AliasBuffer,DWORD AliasBufferLength,LPWSTR ExeName);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasExesA(LPSTR ExeNameBuffer,DWORD ExeNameBufferLength);\n  WINBASEAPI DWORD WINAPI GetConsoleAliasExesW(LPWSTR ExeNameBuffer,DWORD ExeNameBufferLength);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/windef.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINDEF_\n#define _WINDEF_\n\n#ifndef STRICT\n#define STRICT 1\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef WINVER\n#define WINVER 0x0502\n#endif\n\n#ifndef BASETYPES\n#define BASETYPES\n  typedef unsigned long ULONG;\n  typedef ULONG *PULONG;\n  typedef unsigned short USHORT;\n  typedef USHORT *PUSHORT;\n  typedef unsigned char UCHAR;\n  typedef UCHAR *PUCHAR;\n  typedef char *PSZ;\n#endif\n\n#define MAX_PATH 260\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#ifndef FALSE\n#define FALSE 0\n#endif\n\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#ifndef IN\n#define IN\n#endif\n\n#ifndef OUT\n#define OUT\n#endif\n\n#ifndef OPTIONAL\n#define OPTIONAL\n#endif\n\n#undef far\n#undef near\n#undef pascal\n\n#define far\n#define near\n#define pascal __stdcall\n\n#define cdecl\n#ifndef CDECL\n#define CDECL\n#endif\n#ifndef CALLBACK\n#define CALLBACK __stdcall\n#endif\n#ifndef WINAPI\n#define WINAPI __stdcall\n#endif\n#define WINAPIV __cdecl\n#define APIENTRY WINAPI\n#define APIPRIVATE WINAPI\n#define PASCAL WINAPI\n#define WINAPI_INLINE WINAPI\n\n#undef FAR\n#undef NEAR\n#define FAR\n#define NEAR\n#ifndef CONST\n#define CONST const\n#endif\n\n  typedef unsigned long DWORD;\n  typedef int WINBOOL;\n#define BOOL WINBOOL\n  typedef unsigned char BYTE;\n  typedef unsigned short WORD;\n  typedef float FLOAT;\n  typedef FLOAT *PFLOAT;\n  typedef WINBOOL *PBOOL;\n  typedef WINBOOL *LPBOOL;\n  typedef BYTE *PBYTE;\n  typedef BYTE *LPBYTE;\n  typedef int *PINT;\n  typedef int *LPINT;\n  typedef WORD *PWORD;\n  typedef WORD *LPWORD;\n  typedef long *LPLONG;\n  typedef DWORD *PDWORD;\n  typedef DWORD *LPDWORD;\n  typedef void *LPVOID;\n  #ifndef _LPCVOID_DEFINED\n#define _LPCVOID_DEFINED\ntypedef CONST void *LPCVOID;\n#endif\n  typedef int INT;\n  typedef unsigned int UINT;\n  typedef unsigned int *PUINT;\n\n#ifndef NT_INCLUDED\n#include <winnt.h>\n#endif\n\n#include <specstrings.h>\n\n  typedef UINT_PTR WPARAM;\n  typedef LONG_PTR LPARAM;\n  typedef LONG_PTR LRESULT;\n\n#ifndef __cplusplus\n#ifndef NOMINMAX\n#ifndef max\n#define max(a,b) (((a) > (b)) ? (a) : (b))\n#endif\n\n#ifndef min\n#define min(a,b) (((a) < (b)) ? (a) : (b))\n#endif\n#endif\n#endif\n\n#define MAKEWORD(a,b) ((WORD)(((BYTE)((DWORD_PTR)(a) & 0xff)) | ((WORD)((BYTE)((DWORD_PTR)(b) & 0xff))) << 8))\n#define MAKELONG(a,b) ((LONG)(((WORD)((DWORD_PTR)(a) & 0xffff)) | ((DWORD)((WORD)((DWORD_PTR)(b) & 0xffff))) << 16))\n#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))\n#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))\n#define LOBYTE(w) ((BYTE)((DWORD_PTR)(w) & 0xff))\n#define HIBYTE(w) ((BYTE)((DWORD_PTR)(w) >> 8))\n\n#ifndef WIN_INTERNAL\n  DECLARE_HANDLE (HWND);\n  DECLARE_HANDLE (HHOOK);\n#ifdef WINABLE\n  DECLARE_HANDLE (HEVENT);\n#endif\n#endif\n\n  typedef WORD ATOM;\n\n  typedef HANDLE *SPHANDLE;\n  typedef HANDLE *LPHANDLE;\n  typedef HANDLE HGLOBAL;\n  typedef HANDLE HLOCAL;\n  typedef HANDLE GLOBALHANDLE;\n  typedef HANDLE LOCALHANDLE;\n#ifdef _WIN64\n  typedef INT_PTR (WINAPI *FARPROC)();\n  typedef INT_PTR (WINAPI *NEARPROC)();\n  typedef INT_PTR (WINAPI *PROC)();\n#else\n  typedef int (WINAPI *FARPROC)();\n  typedef int (WINAPI *NEARPROC)();\n  typedef int (WINAPI *PROC)();\n#endif\n\n  typedef void *HGDIOBJ;\n\n  DECLARE_HANDLE(HKEY);\n  typedef HKEY *PHKEY;\n\n  DECLARE_HANDLE(HACCEL);\n  DECLARE_HANDLE(HBITMAP);\n  DECLARE_HANDLE(HBRUSH);\n  DECLARE_HANDLE(HCOLORSPACE);\n  DECLARE_HANDLE(HDC);\n  DECLARE_HANDLE(HGLRC);\n  DECLARE_HANDLE(HDESK);\n  DECLARE_HANDLE(HENHMETAFILE);\n  DECLARE_HANDLE(HFONT);\n  DECLARE_HANDLE(HICON);\n  DECLARE_HANDLE(HMENU);\n  DECLARE_HANDLE(HMETAFILE);\n  DECLARE_HANDLE(HINSTANCE);\n  typedef HINSTANCE HMODULE;\n  DECLARE_HANDLE(HPALETTE);\n  DECLARE_HANDLE(HPEN);\n  DECLARE_HANDLE(HRGN);\n  DECLARE_HANDLE(HRSRC);\n  DECLARE_HANDLE(HSTR);\n  DECLARE_HANDLE(HTASK);\n  DECLARE_HANDLE(HWINSTA);\n  DECLARE_HANDLE(HKL);\n  DECLARE_HANDLE(HMONITOR);\n  DECLARE_HANDLE(HWINEVENTHOOK);\n  DECLARE_HANDLE(HUMPD);\n\n  typedef int HFILE;\n  typedef HICON HCURSOR;\n  typedef DWORD COLORREF;\n  typedef DWORD *LPCOLORREF;\n\n#define HFILE_ERROR ((HFILE)-1)\n\n  typedef struct tagRECT {\n    LONG left;\n    LONG top;\n    LONG right;\n    LONG bottom;\n  } RECT,*PRECT,*NPRECT,*LPRECT;\n\n  typedef const RECT *LPCRECT;\n\n  typedef struct _RECTL {\n    LONG left;\n    LONG top;\n    LONG right;\n    LONG bottom;\n  } RECTL,*PRECTL,*LPRECTL;\n\n  typedef const RECTL *LPCRECTL;\n\n  typedef struct tagPOINT {\n    LONG x;\n    LONG y;\n  } POINT,*PPOINT,*NPPOINT,*LPPOINT;\n\n  typedef struct _POINTL {\n    LONG x;\n    LONG y;\n  } POINTL,*PPOINTL;\n\n  typedef struct tagSIZE {\n    LONG cx;\n    LONG cy;\n  } SIZE,*PSIZE,*LPSIZE;\n\n  typedef SIZE SIZEL;\n  typedef SIZE *PSIZEL,*LPSIZEL;\n\n  typedef struct tagPOINTS {\n    SHORT x;\n    SHORT y;\n  } POINTS,*PPOINTS,*LPPOINTS;\n\n  typedef struct _FILETIME {\n    DWORD dwLowDateTime;\n    DWORD dwHighDateTime;\n  } FILETIME,*PFILETIME,*LPFILETIME;\n#define _FILETIME_\n\n#define DM_UPDATE 1\n#define DM_COPY 2\n#define DM_PROMPT 4\n#define DM_MODIFY 8\n\n#define DM_IN_BUFFER DM_MODIFY\n#define DM_IN_PROMPT DM_PROMPT\n#define DM_OUT_BUFFER DM_COPY\n#define DM_OUT_DEFAULT DM_UPDATE\n\n#define DC_FIELDS 1\n#define DC_PAPERS 2\n#define DC_PAPERSIZE 3\n#define DC_MINEXTENT 4\n#define DC_MAXEXTENT 5\n#define DC_BINS 6\n#define DC_DUPLEX 7\n#define DC_SIZE 8\n#define DC_EXTRA 9\n#define DC_VERSION 10\n#define DC_DRIVER 11\n#define DC_BINNAMES 12\n#define DC_ENUMRESOLUTIONS 13\n#define DC_FILEDEPENDENCIES 14\n#define DC_TRUETYPE 15\n#define DC_PAPERNAMES 16\n#define DC_ORIENTATION 17\n#define DC_COPIES 18\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/windows.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINDOWS_\n#define _WINDOWS_\n\n#ifndef WINVER\n#define WINVER 0x0502\n#endif\n\n#include <_mingw.h>\n\n#ifndef _INC_WINDOWS\n#define _INC_WINDOWS\n\n#if defined(RC_INVOKED) && !defined(NOWINRES)\n\n#include <winresrc.h>\n#else\n\n#ifdef RC_INVOKED\n#define NOATOM\n#define NOGDI\n#define NOGDICAPMASKS\n#define NOMETAFILE\n#define NOMINMAX\n#define NOMSG\n#define NOOPENFILE\n#define NORASTEROPS\n#define NOSCROLL\n#define NOSOUND\n#define NOSYSMETRICS\n#define NOTEXTMETRIC\n#define NOWH\n#define NOCOMM\n#define NOKANJI\n#define NOCRYPT\n#define NOMCX\n#endif\n\n#if !defined(I_X86_) && !defined(_IA64_) && !defined(_AMD64_) && (defined(_X86_) && !defined(__x86_64))\n#define I_X86_\n#endif\n\n#if !defined(I_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(__x86_64)\n#define _AMD64_\n#endif\n\n#if !defined(I_X86_) && !(defined(_X86_) && !defined(__x86_64)) && !defined(_AMD64_) && defined(__ia64__)\n#if !defined(_IA64_)\n#define _IA64_\n#endif\n#endif\n\n#ifndef RC_INVOKED\n#include <excpt.h>\n#include <stdarg.h>\n#endif\n\n#include <windef.h>\n#include <winbase.h>\n#include <wingdi.h>\n#include <winuser.h>\n#include <winnls.h>\n#include <wincon.h>\n#include <winver.h>\n#include <winreg.h>\n#include <winnetwk.h>\n\n#ifndef WIN32_LEAN_AND_MEAN\n#include <cderr.h>\n#include <dde.h>\n#include <ddeml.h>\n#include <dlgs.h>\n#include <lzexpand.h>\n#include <mmsystem.h>\n#include <nb30.h>\n#include <rpc.h>\n#include <shellapi.h>\n#include <winperf.h>\n#include <winsock.h>\n#ifndef NOCRYPT\n#include <wincrypt.h>\n#include <winefs.h>\n#include <winscard.h>\n#endif\n\n#ifndef NOUSER\n#ifndef NOGDI\n#include <winspool.h>\n#ifdef INC_OLE1\n#include <ole.h>\n#else\n#include <ole2.h>\n#endif\n#include <commdlg.h>\n#endif\n#endif\n#endif\n\n#include <stralign.h>\n\n#ifdef INC_OLE2\n#include <ole2.h>\n#endif\n\n#ifndef NOSERVICE\n#include <winsvc.h>\n#endif\n\n#ifndef NOMCX\n#include <mcx.h>\n#endif\n\n#ifndef NOIME\n#include <imm.h>\n#endif\n\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winerror.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINERROR_\n#define _WINERROR_\n\n#define FACILITY_WINDOWSUPDATE 36\n#define FACILITY_WINDOWS_CE 24\n#define FACILITY_WINDOWS 8\n#define FACILITY_URT 19\n#define FACILITY_UMI 22\n#define FACILITY_SXS 23\n#define FACILITY_STORAGE 3\n#define FACILITY_STATE_MANAGEMENT 34\n#define FACILITY_SSPI 9\n#define FACILITY_SCARD 16\n#define FACILITY_SETUPAPI 15\n#define FACILITY_SECURITY 9\n#define FACILITY_RPC 1\n#define FACILITY_WIN32 7\n#define FACILITY_CONTROL 10\n#define FACILITY_NULL 0\n#define FACILITY_METADIRECTORY 35\n#define FACILITY_MSMQ 14\n#define FACILITY_MEDIASERVER 13\n#define FACILITY_INTERNET 12\n#define FACILITY_ITF 4\n#define FACILITY_HTTP 25\n#define FACILITY_DPLAY 21\n#define FACILITY_DISPATCH 2\n#define FACILITY_DIRECTORYSERVICE 37\n#define FACILITY_CONFIGURATION 33\n#define FACILITY_COMPLUS 17\n#define FACILITY_CERT 11\n#define FACILITY_BACKGROUNDCOPY 32\n#define FACILITY_ACS 20\n#define FACILITY_AAF 18\n#define ERROR_SUCCESS 0L\n#define NO_ERROR 0L\n#define SEC_E_OK ((HRESULT)0x00000000L)\n#define ERROR_INVALID_FUNCTION 1L\n#define ERROR_FILE_NOT_FOUND 2L\n#define ERROR_PATH_NOT_FOUND 3L\n#define ERROR_TOO_MANY_OPEN_FILES 4L\n#define ERROR_ACCESS_DENIED 5L\n#define ERROR_INVALID_HANDLE 6L\n#define ERROR_ARENA_TRASHED 7L\n#define ERROR_NOT_ENOUGH_MEMORY 8L\n#define ERROR_INVALID_BLOCK 9L\n#define ERROR_BAD_ENVIRONMENT 10L\n#define ERROR_BAD_FORMAT 11L\n#define ERROR_INVALID_ACCESS 12L\n#define ERROR_INVALID_DATA 13L\n#define ERROR_OUTOFMEMORY 14L\n#define ERROR_INVALID_DRIVE 15L\n#define ERROR_CURRENT_DIRECTORY 16L\n#define ERROR_NOT_SAME_DEVICE 17L\n#define ERROR_NO_MORE_FILES 18L\n#define ERROR_WRITE_PROTECT 19L\n#define ERROR_BAD_UNIT 20L\n#define ERROR_NOT_READY 21L\n#define ERROR_BAD_COMMAND 22L\n#define ERROR_CRC 23L\n#define ERROR_BAD_LENGTH 24L\n#define ERROR_SEEK 25L\n#define ERROR_NOT_DOS_DISK 26L\n#define ERROR_SECTOR_NOT_FOUND 27L\n#define ERROR_OUT_OF_PAPER 28L\n#define ERROR_WRITE_FAULT 29L\n#define ERROR_READ_FAULT 30L\n#define ERROR_GEN_FAILURE 31L\n#define ERROR_SHARING_VIOLATION 32L\n#define ERROR_LOCK_VIOLATION 33L\n#define ERROR_WRONG_DISK 34L\n#define ERROR_SHARING_BUFFER_EXCEEDED 36L\n#define ERROR_HANDLE_EOF 38L\n#define ERROR_HANDLE_DISK_FULL 39L\n#define ERROR_NOT_SUPPORTED 50L\n#define ERROR_REM_NOT_LIST 51L\n#define ERROR_DUP_NAME 52L\n#define ERROR_BAD_NETPATH 53L\n#define ERROR_NETWORK_BUSY 54L\n#define ERROR_DEV_NOT_EXIST 55L\n#define ERROR_TOO_MANY_CMDS 56L\n#define ERROR_ADAP_HDW_ERR 57L\n#define ERROR_BAD_NET_RESP 58L\n#define ERROR_UNEXP_NET_ERR 59L\n#define ERROR_BAD_REM_ADAP 60L\n#define ERROR_PRINTQ_FULL 61L\n#define ERROR_NO_SPOOL_SPACE 62L\n#define ERROR_PRINT_CANCELLED 63L\n#define ERROR_NETNAME_DELETED 64L\n#define ERROR_NETWORK_ACCESS_DENIED 65L\n#define ERROR_BAD_DEV_TYPE 66L\n#define ERROR_BAD_NET_NAME 67L\n#define ERROR_TOO_MANY_NAMES 68L\n#define ERROR_TOO_MANY_SESS 69L\n#define ERROR_SHARING_PAUSED 70L\n#define ERROR_REQ_NOT_ACCEP 71L\n#define ERROR_REDIR_PAUSED 72L\n#define ERROR_FILE_EXISTS 80L\n#define ERROR_CANNOT_MAKE 82L\n#define ERROR_FAIL_I24 83L\n#define ERROR_OUT_OF_STRUCTURES 84L\n#define ERROR_ALREADY_ASSIGNED 85L\n#define ERROR_INVALID_PASSWORD 86L\n#define ERROR_INVALID_PARAMETER 87L\n#define ERROR_NET_WRITE_FAULT 88L\n#define ERROR_NO_PROC_SLOTS 89L\n#define ERROR_TOO_MANY_SEMAPHORES 100L\n#define ERROR_EXCL_SEM_ALREADY_OWNED 101L\n#define ERROR_SEM_IS_SET 102L\n#define ERROR_TOO_MANY_SEM_REQUESTS 103L\n#define ERROR_INVALID_AT_INTERRUPT_TIME 104L\n#define ERROR_SEM_OWNER_DIED 105L\n#define ERROR_SEM_USER_LIMIT 106L\n#define ERROR_DISK_CHANGE 107L\n#define ERROR_DRIVE_LOCKED 108L\n#define ERROR_BROKEN_PIPE 109L\n#define ERROR_OPEN_FAILED 110L\n#define ERROR_BUFFER_OVERFLOW 111L\n#define ERROR_DISK_FULL 112L\n#define ERROR_NO_MORE_SEARCH_HANDLES 113L\n#define ERROR_INVALID_TARGET_HANDLE 114L\n#define ERROR_INVALID_CATEGORY 117L\n#define ERROR_INVALID_VERIFY_SWITCH 118L\n#define ERROR_BAD_DRIVER_LEVEL 119L\n#define ERROR_CALL_NOT_IMPLEMENTED 120L\n#define ERROR_SEM_TIMEOUT 121L\n#define ERROR_INSUFFICIENT_BUFFER 122L\n#define ERROR_INVALID_NAME 123L\n#define ERROR_INVALID_LEVEL 124L\n#define ERROR_NO_VOLUME_LABEL 125L\n#define ERROR_MOD_NOT_FOUND 126L\n#define ERROR_PROC_NOT_FOUND 127L\n#define ERROR_WAIT_NO_CHILDREN 128L\n#define ERROR_CHILD_NOT_COMPLETE 129L\n#define ERROR_DIRECT_ACCESS_HANDLE 130L\n#define ERROR_NEGATIVE_SEEK 131L\n#define ERROR_SEEK_ON_DEVICE 132L\n#define ERROR_IS_JOIN_TARGET 133L\n#define ERROR_IS_JOINED 134L\n#define ERROR_IS_SUBSTED 135L\n#define ERROR_NOT_JOINED 136L\n#define ERROR_NOT_SUBSTED 137L\n#define ERROR_JOIN_TO_JOIN 138L\n#define ERROR_SUBST_TO_SUBST 139L\n#define ERROR_JOIN_TO_SUBST 140L\n#define ERROR_SUBST_TO_JOIN 141L\n#define ERROR_BUSY_DRIVE 142L\n#define ERROR_SAME_DRIVE 143L\n#define ERROR_DIR_NOT_ROOT 144L\n#define ERROR_DIR_NOT_EMPTY 145L\n#define ERROR_IS_SUBST_PATH 146L\n#define ERROR_IS_JOIN_PATH 147L\n#define ERROR_PATH_BUSY 148L\n#define ERROR_IS_SUBST_TARGET 149L\n#define ERROR_SYSTEM_TRACE 150L\n#define ERROR_INVALID_EVENT_COUNT 151L\n#define ERROR_TOO_MANY_MUXWAITERS 152L\n#define ERROR_INVALID_LIST_FORMAT 153L\n#define ERROR_LABEL_TOO_LONG 154L\n#define ERROR_TOO_MANY_TCBS 155L\n#define ERROR_SIGNAL_REFUSED 156L\n#define ERROR_DISCARDED 157L\n#define ERROR_NOT_LOCKED 158L\n#define ERROR_BAD_THREADID_ADDR 159L\n#define ERROR_BAD_ARGUMENTS 160L\n#define ERROR_BAD_PATHNAME 161L\n#define ERROR_SIGNAL_PENDING 162L\n#define ERROR_MAX_THRDS_REACHED 164L\n#define ERROR_LOCK_FAILED 167L\n#define ERROR_BUSY 170L\n#define ERROR_CANCEL_VIOLATION 173L\n#define ERROR_ATOMIC_LOCKS_NOT_SUPPORTED 174L\n#define ERROR_INVALID_SEGMENT_NUMBER 180L\n#define ERROR_INVALID_ORDINAL 182L\n#define ERROR_ALREADY_EXISTS 183L\n#define ERROR_INVALID_FLAG_NUMBER 186L\n#define ERROR_SEM_NOT_FOUND 187L\n#define ERROR_INVALID_STARTING_CODESEG 188L\n#define ERROR_INVALID_STACKSEG 189L\n#define ERROR_INVALID_MODULETYPE 190L\n#define ERROR_INVALID_EXE_SIGNATURE 191L\n#define ERROR_EXE_MARKED_INVALID 192L\n#define ERROR_BAD_EXE_FORMAT 193L\n#define ERROR_ITERATED_DATA_EXCEEDS_64k 194L\n#define ERROR_INVALID_MINALLOCSIZE 195L\n#define ERROR_DYNLINK_FROM_INVALID_RING 196L\n#define ERROR_IOPL_NOT_ENABLED 197L\n#define ERROR_INVALID_SEGDPL 198L\n#define ERROR_AUTODATASEG_EXCEEDS_64k 199L\n#define ERROR_RING2SEG_MUST_BE_MOVABLE 200L\n#define ERROR_RELOC_CHAIN_XEEDS_SEGLIM 201L\n#define ERROR_INFLOOP_IN_RELOC_CHAIN 202L\n#define ERROR_ENVVAR_NOT_FOUND 203L\n#define ERROR_NO_SIGNAL_SENT 205L\n#define ERROR_FILENAME_EXCED_RANGE 206L\n#define ERROR_RING2_STACK_IN_USE 207L\n#define ERROR_META_EXPANSION_TOO_LONG 208L\n#define ERROR_INVALID_SIGNAL_NUMBER 209L\n#define ERROR_THREAD_1_INACTIVE 210L\n#define ERROR_LOCKED 212L\n#define ERROR_TOO_MANY_MODULES 214L\n#define ERROR_NESTING_NOT_ALLOWED 215L\n#define ERROR_EXE_MACHINE_TYPE_MISMATCH 216L\n#define ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY 217L\n#define ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY 218L\n#define ERROR_BAD_PIPE 230L\n#define ERROR_PIPE_BUSY 231L\n#define ERROR_NO_DATA 232L\n#define ERROR_PIPE_NOT_CONNECTED 233L\n#define ERROR_MORE_DATA 234L\n#define ERROR_VC_DISCONNECTED 240L\n#define ERROR_INVALID_EA_NAME 254L\n#define ERROR_EA_LIST_INCONSISTENT 255L\n#define WAIT_TIMEOUT 258L\n#define ERROR_NO_MORE_ITEMS 259L\n#define ERROR_CANNOT_COPY 266L\n#define ERROR_DIRECTORY 267L\n#define ERROR_EAS_DIDNT_FIT 275L\n#define ERROR_EA_FILE_CORRUPT 276L\n#define ERROR_EA_TABLE_FULL 277L\n#define ERROR_INVALID_EA_HANDLE 278L\n#define ERROR_EAS_NOT_SUPPORTED 282L\n#define ERROR_NOT_OWNER 288L\n#define ERROR_TOO_MANY_POSTS 298L\n#define ERROR_PARTIAL_COPY 299L\n#define ERROR_OPLOCK_NOT_GRANTED 300L\n#define ERROR_INVALID_OPLOCK_PROTOCOL 301L\n#define ERROR_DISK_TOO_FRAGMENTED 302L\n#define ERROR_DELETE_PENDING 303L\n#define ERROR_MR_MID_NOT_FOUND 317L\n#define ERROR_SCOPE_NOT_FOUND 318L\n#define ERROR_INVALID_ADDRESS 487L\n#define ERROR_ARITHMETIC_OVERFLOW 534L\n#define ERROR_PIPE_CONNECTED 535L\n#define ERROR_PIPE_LISTENING 536L\n#define ERROR_EA_ACCESS_DENIED 994L\n#define ERROR_OPERATION_ABORTED 995L\n#define ERROR_IO_INCOMPLETE 996L\n#define ERROR_IO_PENDING 997L\n#define ERROR_NOACCESS 998L\n#define ERROR_SWAPERROR 999L\n#define ERROR_STACK_OVERFLOW 1001L\n#define ERROR_INVALID_MESSAGE 1002L\n#define ERROR_CAN_NOT_COMPLETE 1003L\n#define ERROR_INVALID_FLAGS 1004L\n#define ERROR_UNRECOGNIZED_VOLUME 1005L\n#define ERROR_FILE_INVALID 1006L\n#define ERROR_FULLSCREEN_MODE 1007L\n#define ERROR_NO_TOKEN 1008L\n#define ERROR_BADDB 1009L\n#define ERROR_BADKEY 1010L\n#define ERROR_CANTOPEN 1011L\n#define ERROR_CANTREAD 1012L\n#define ERROR_CANTWRITE 1013L\n#define ERROR_REGISTRY_RECOVERED 1014L\n#define ERROR_REGISTRY_CORRUPT 1015L\n#define ERROR_REGISTRY_IO_FAILED 1016L\n#define ERROR_NOT_REGISTRY_FILE 1017L\n#define ERROR_KEY_DELETED 1018L\n#define ERROR_NO_LOG_SPACE 1019L\n#define ERROR_KEY_HAS_CHILDREN 1020L\n#define ERROR_CHILD_MUST_BE_VOLATILE 1021L\n#define ERROR_NOTIFY_ENUM_DIR 1022L\n#define ERROR_DEPENDENT_SERVICES_RUNNING 1051L\n#define ERROR_INVALID_SERVICE_CONTROL 1052L\n#define ERROR_SERVICE_REQUEST_TIMEOUT 1053L\n#define ERROR_SERVICE_NO_THREAD 1054L\n#define ERROR_SERVICE_DATABASE_LOCKED 1055L\n#define ERROR_SERVICE_ALREADY_RUNNING 1056L\n#define ERROR_INVALID_SERVICE_ACCOUNT 1057L\n#define ERROR_SERVICE_DISABLED 1058L\n#define ERROR_CIRCULAR_DEPENDENCY 1059L\n#define ERROR_SERVICE_DOES_NOT_EXIST 1060L\n#define ERROR_SERVICE_CANNOT_ACCEPT_CTRL 1061L\n#define ERROR_SERVICE_NOT_ACTIVE 1062L\n#define ERROR_FAILED_SERVICE_CONTROLLER_CONNECT 1063L\n#define ERROR_EXCEPTION_IN_SERVICE 1064L\n#define ERROR_DATABASE_DOES_NOT_EXIST 1065L\n#define ERROR_SERVICE_SPECIFIC_ERROR 1066L\n#define ERROR_PROCESS_ABORTED 1067L\n#define ERROR_SERVICE_DEPENDENCY_FAIL 1068L\n#define ERROR_SERVICE_LOGON_FAILED 1069L\n#define ERROR_SERVICE_START_HANG 1070L\n#define ERROR_INVALID_SERVICE_LOCK 1071L\n#define ERROR_SERVICE_MARKED_FOR_DELETE 1072L\n#define ERROR_SERVICE_EXISTS 1073L\n#define ERROR_ALREADY_RUNNING_LKG 1074L\n#define ERROR_SERVICE_DEPENDENCY_DELETED 1075L\n#define ERROR_BOOT_ALREADY_ACCEPTED 1076L\n#define ERROR_SERVICE_NEVER_STARTED 1077L\n#define ERROR_DUPLICATE_SERVICE_NAME 1078L\n#define ERROR_DIFFERENT_SERVICE_ACCOUNT 1079L\n#define ERROR_CANNOT_DETECT_DRIVER_FAILURE 1080L\n#define ERROR_CANNOT_DETECT_PROCESS_ABORT 1081L\n#define ERROR_NO_RECOVERY_PROGRAM 1082L\n#define ERROR_SERVICE_NOT_IN_EXE 1083L\n#define ERROR_NOT_SAFEBOOT_SERVICE 1084L\n#define ERROR_END_OF_MEDIA 1100L\n#define ERROR_FILEMARK_DETECTED 1101L\n#define ERROR_BEGINNING_OF_MEDIA 1102L\n#define ERROR_SETMARK_DETECTED 1103L\n#define ERROR_NO_DATA_DETECTED 1104L\n#define ERROR_PARTITION_FAILURE 1105L\n#define ERROR_INVALID_BLOCK_LENGTH 1106L\n#define ERROR_DEVICE_NOT_PARTITIONED 1107L\n#define ERROR_UNABLE_TO_LOCK_MEDIA 1108L\n#define ERROR_UNABLE_TO_UNLOAD_MEDIA 1109L\n#define ERROR_MEDIA_CHANGED 1110L\n#define ERROR_BUS_RESET 1111L\n#define ERROR_NO_MEDIA_IN_DRIVE 1112L\n#define ERROR_NO_UNICODE_TRANSLATION 1113L\n#define ERROR_DLL_INIT_FAILED 1114L\n#define ERROR_SHUTDOWN_IN_PROGRESS 1115L\n#define ERROR_NO_SHUTDOWN_IN_PROGRESS 1116L\n#define ERROR_IO_DEVICE 1117L\n#define ERROR_SERIAL_NO_DEVICE 1118L\n#define ERROR_IRQ_BUSY 1119L\n#define ERROR_MORE_WRITES 1120L\n#define ERROR_COUNTER_TIMEOUT 1121L\n#define ERROR_FLOPPY_ID_MARK_NOT_FOUND 1122L\n#define ERROR_FLOPPY_WRONG_CYLINDER 1123L\n#define ERROR_FLOPPY_UNKNOWN_ERROR 1124L\n#define ERROR_FLOPPY_BAD_REGISTERS 1125L\n#define ERROR_DISK_RECALIBRATE_FAILED 1126L\n#define ERROR_DISK_OPERATION_FAILED 1127L\n#define ERROR_DISK_RESET_FAILED 1128L\n#define ERROR_EOM_OVERFLOW 1129L\n#define ERROR_NOT_ENOUGH_SERVER_MEMORY 1130L\n#define ERROR_POSSIBLE_DEADLOCK 1131L\n#define ERROR_MAPPED_ALIGNMENT 1132L\n#define ERROR_SET_POWER_STATE_VETOED 1140L\n#define ERROR_SET_POWER_STATE_FAILED 1141L\n#define ERROR_TOO_MANY_LINKS 1142L\n#define ERROR_OLD_WIN_VERSION 1150L\n#define ERROR_APP_WRONG_OS 1151L\n#define ERROR_SINGLE_INSTANCE_APP 1152L\n#define ERROR_RMODE_APP 1153L\n#define ERROR_INVALID_DLL 1154L\n#define ERROR_NO_ASSOCIATION 1155L\n#define ERROR_DDE_FAIL 1156L\n#define ERROR_DLL_NOT_FOUND 1157L\n#define ERROR_NO_MORE_USER_HANDLES 1158L\n#define ERROR_MESSAGE_SYNC_ONLY 1159L\n#define ERROR_SOURCE_ELEMENT_EMPTY 1160L\n#define ERROR_DESTINATION_ELEMENT_FULL 1161L\n#define ERROR_ILLEGAL_ELEMENT_ADDRESS 1162L\n#define ERROR_MAGAZINE_NOT_PRESENT 1163L\n#define ERROR_DEVICE_REINITIALIZATION_NEEDED 1164L\n#define ERROR_DEVICE_REQUIRES_CLEANING 1165L\n#define ERROR_DEVICE_DOOR_OPEN 1166L\n#define ERROR_DEVICE_NOT_CONNECTED 1167L\n#define ERROR_NOT_FOUND 1168L\n#define ERROR_NO_MATCH 1169L\n#define ERROR_SET_NOT_FOUND 1170L\n#define ERROR_POINT_NOT_FOUND 1171L\n#define ERROR_NO_TRACKING_SERVICE 1172L\n#define ERROR_NO_VOLUME_ID 1173L\n#define ERROR_UNABLE_TO_REMOVE_REPLACED 1175L\n#define ERROR_UNABLE_TO_MOVE_REPLACEMENT 1176L\n#define ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 1177L\n#define ERROR_JOURNAL_DELETE_IN_PROGRESS 1178L\n#define ERROR_JOURNAL_NOT_ACTIVE 1179L\n#define ERROR_POTENTIAL_FILE_FOUND 1180L\n#define ERROR_JOURNAL_ENTRY_DELETED 1181L\n#define ERROR_BAD_DEVICE 1200L\n#define ERROR_CONNECTION_UNAVAIL 1201L\n#define ERROR_DEVICE_ALREADY_REMEMBERED 1202L\n#define ERROR_NO_NET_OR_BAD_PATH 1203L\n#define ERROR_BAD_PROVIDER 1204L\n#define ERROR_CANNOT_OPEN_PROFILE 1205L\n#define ERROR_BAD_PROFILE 1206L\n#define ERROR_NOT_CONTAINER 1207L\n#define ERROR_EXTENDED_ERROR 1208L\n#define ERROR_INVALID_GROUPNAME 1209L\n#define ERROR_INVALID_COMPUTERNAME 1210L\n#define ERROR_INVALID_EVENTNAME 1211L\n#define ERROR_INVALID_DOMAINNAME 1212L\n#define ERROR_INVALID_SERVICENAME 1213L\n#define ERROR_INVALID_NETNAME 1214L\n#define ERROR_INVALID_SHARENAME 1215L\n#define ERROR_INVALID_PASSWORDNAME 1216L\n#define ERROR_INVALID_MESSAGENAME 1217L\n#define ERROR_INVALID_MESSAGEDEST 1218L\n#define ERROR_SESSION_CREDENTIAL_CONFLICT 1219L\n#define ERROR_REMOTE_SESSION_LIMIT_EXCEEDED 1220L\n#define ERROR_DUP_DOMAINNAME 1221L\n#define ERROR_NO_NETWORK 1222L\n#define ERROR_CANCELLED 1223L\n#define ERROR_USER_MAPPED_FILE 1224L\n#define ERROR_CONNECTION_REFUSED 1225L\n#define ERROR_GRACEFUL_DISCONNECT 1226L\n#define ERROR_ADDRESS_ALREADY_ASSOCIATED 1227L\n#define ERROR_ADDRESS_NOT_ASSOCIATED 1228L\n#define ERROR_CONNECTION_INVALID 1229L\n#define ERROR_CONNECTION_ACTIVE 1230L\n#define ERROR_NETWORK_UNREACHABLE 1231L\n#define ERROR_HOST_UNREACHABLE 1232L\n#define ERROR_PROTOCOL_UNREACHABLE 1233L\n#define ERROR_PORT_UNREACHABLE 1234L\n#define ERROR_REQUEST_ABORTED 1235L\n#define ERROR_CONNECTION_ABORTED 1236L\n#define ERROR_RETRY 1237L\n#define ERROR_CONNECTION_COUNT_LIMIT 1238L\n#define ERROR_LOGIN_TIME_RESTRICTION 1239L\n#define ERROR_LOGIN_WKSTA_RESTRICTION 1240L\n#define ERROR_INCORRECT_ADDRESS 1241L\n#define ERROR_ALREADY_REGISTERED 1242L\n#define ERROR_SERVICE_NOT_FOUND 1243L\n#define ERROR_NOT_AUTHENTICATED 1244L\n#define ERROR_NOT_LOGGED_ON 1245L\n#define ERROR_CONTINUE 1246L\n#define ERROR_ALREADY_INITIALIZED 1247L\n#define ERROR_NO_MORE_DEVICES 1248L\n#define ERROR_NO_SUCH_SITE 1249L\n#define ERROR_DOMAIN_CONTROLLER_EXISTS 1250L\n#define ERROR_ONLY_IF_CONNECTED 1251L\n#define ERROR_OVERRIDE_NOCHANGES 1252L\n#define ERROR_BAD_USER_PROFILE 1253L\n#define ERROR_NOT_SUPPORTED_ON_SBS 1254L\n#define ERROR_SERVER_SHUTDOWN_IN_PROGRESS 1255L\n#define ERROR_HOST_DOWN 1256L\n#define ERROR_NON_ACCOUNT_SID 1257L\n#define ERROR_NON_DOMAIN_SID 1258L\n#define ERROR_APPHELP_BLOCK 1259L\n#define ERROR_ACCESS_DISABLED_BY_POLICY 1260L\n#define ERROR_REG_NAT_CONSUMPTION 1261L\n#define ERROR_CSCSHARE_OFFLINE 1262L\n#define ERROR_PKINIT_FAILURE 1263L\n#define ERROR_SMARTCARD_SUBSYSTEM_FAILURE 1264L\n#define ERROR_DOWNGRADE_DETECTED 1265L\n#define ERROR_MACHINE_LOCKED 1271L\n#define ERROR_CALLBACK_SUPPLIED_INVALID_DATA 1273L\n#define ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED 1274L\n#define ERROR_DRIVER_BLOCKED 1275L\n#define ERROR_INVALID_IMPORT_OF_NON_DLL 1276L\n#define ERROR_ACCESS_DISABLED_WEBBLADE 1277L\n#define ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER 1278L\n#define ERROR_RECOVERY_FAILURE 1279L\n#define ERROR_ALREADY_FIBER 1280L\n#define ERROR_ALREADY_THREAD 1281L\n#define ERROR_STACK_BUFFER_OVERRUN 1282L\n#define ERROR_PARAMETER_QUOTA_EXCEEDED 1283L\n#define ERROR_DEBUGGER_INACTIVE 1284L\n#define ERROR_DELAY_LOAD_FAILED 1285L\n#define ERROR_VDM_DISALLOWED 1286L\n#define ERROR_UNIDENTIFIED_ERROR 1287L\n#define ERROR_NOT_ALL_ASSIGNED 1300L\n#define ERROR_SOME_NOT_MAPPED 1301L\n#define ERROR_NO_QUOTAS_FOR_ACCOUNT 1302L\n#define ERROR_LOCAL_USER_SESSION_KEY 1303L\n#define ERROR_NULL_LM_PASSWORD 1304L\n#define ERROR_UNKNOWN_REVISION 1305L\n#define ERROR_REVISION_MISMATCH 1306L\n#define ERROR_INVALID_OWNER 1307L\n#define ERROR_INVALID_PRIMARY_GROUP 1308L\n#define ERROR_NO_IMPERSONATION_TOKEN 1309L\n#define ERROR_CANT_DISABLE_MANDATORY 1310L\n#define ERROR_NO_LOGON_SERVERS 1311L\n#define ERROR_NO_SUCH_LOGON_SESSION 1312L\n#define ERROR_NO_SUCH_PRIVILEGE 1313L\n#define ERROR_PRIVILEGE_NOT_HELD 1314L\n#define ERROR_INVALID_ACCOUNT_NAME 1315L\n#define ERROR_USER_EXISTS 1316L\n#define ERROR_NO_SUCH_USER 1317L\n#define ERROR_GROUP_EXISTS 1318L\n#define ERROR_NO_SUCH_GROUP 1319L\n#define ERROR_MEMBER_IN_GROUP 1320L\n#define ERROR_MEMBER_NOT_IN_GROUP 1321L\n#define ERROR_LAST_ADMIN 1322L\n#define ERROR_WRONG_PASSWORD 1323L\n#define ERROR_ILL_FORMED_PASSWORD 1324L\n#define ERROR_PASSWORD_RESTRICTION 1325L\n#define ERROR_LOGON_FAILURE 1326L\n#define ERROR_ACCOUNT_RESTRICTION 1327L\n#define ERROR_INVALID_LOGON_HOURS 1328L\n#define ERROR_INVALID_WORKSTATION 1329L\n#define ERROR_PASSWORD_EXPIRED 1330L\n#define ERROR_ACCOUNT_DISABLED 1331L\n#define ERROR_NONE_MAPPED 1332L\n#define ERROR_TOO_MANY_LUIDS_REQUESTED 1333L\n#define ERROR_LUIDS_EXHAUSTED 1334L\n#define ERROR_INVALID_SUB_AUTHORITY 1335L\n#define ERROR_INVALID_ACL 1336L\n#define ERROR_INVALID_SID 1337L\n#define ERROR_INVALID_SECURITY_DESCR 1338L\n#define ERROR_BAD_INHERITANCE_ACL 1340L\n#define ERROR_SERVER_DISABLED 1341L\n#define ERROR_SERVER_NOT_DISABLED 1342L\n#define ERROR_INVALID_ID_AUTHORITY 1343L\n#define ERROR_ALLOTTED_SPACE_EXCEEDED 1344L\n#define ERROR_INVALID_GROUP_ATTRIBUTES 1345L\n#define ERROR_BAD_IMPERSONATION_LEVEL 1346L\n#define ERROR_CANT_OPEN_ANONYMOUS 1347L\n#define ERROR_BAD_VALIDATION_CLASS 1348L\n#define ERROR_BAD_TOKEN_TYPE 1349L\n#define ERROR_NO_SECURITY_ON_OBJECT 1350L\n#define ERROR_CANT_ACCESS_DOMAIN_INFO 1351L\n#define ERROR_INVALID_SERVER_STATE 1352L\n#define ERROR_INVALID_DOMAIN_STATE 1353L\n#define ERROR_INVALID_DOMAIN_ROLE 1354L\n#define ERROR_NO_SUCH_DOMAIN 1355L\n#define ERROR_DOMAIN_EXISTS 1356L\n#define ERROR_DOMAIN_LIMIT_EXCEEDED 1357L\n#define ERROR_INTERNAL_DB_CORRUPTION 1358L\n#define ERROR_INTERNAL_ERROR 1359L\n#define ERROR_GENERIC_NOT_MAPPED 1360L\n#define ERROR_BAD_DESCRIPTOR_FORMAT 1361L\n#define ERROR_NOT_LOGON_PROCESS 1362L\n#define ERROR_LOGON_SESSION_EXISTS 1363L\n#define ERROR_NO_SUCH_PACKAGE 1364L\n#define ERROR_BAD_LOGON_SESSION_STATE 1365L\n#define ERROR_LOGON_SESSION_COLLISION 1366L\n#define ERROR_INVALID_LOGON_TYPE 1367L\n#define ERROR_CANNOT_IMPERSONATE 1368L\n#define ERROR_RXACT_INVALID_STATE 1369L\n#define ERROR_RXACT_COMMIT_FAILURE 1370L\n#define ERROR_SPECIAL_ACCOUNT 1371L\n#define ERROR_SPECIAL_GROUP 1372L\n#define ERROR_SPECIAL_USER 1373L\n#define ERROR_MEMBERS_PRIMARY_GROUP 1374L\n#define ERROR_TOKEN_ALREADY_IN_USE 1375L\n#define ERROR_NO_SUCH_ALIAS 1376L\n#define ERROR_MEMBER_NOT_IN_ALIAS 1377L\n#define ERROR_MEMBER_IN_ALIAS 1378L\n#define ERROR_ALIAS_EXISTS 1379L\n#define ERROR_LOGON_NOT_GRANTED 1380L\n#define ERROR_TOO_MANY_SECRETS 1381L\n#define ERROR_SECRET_TOO_LONG 1382L\n#define ERROR_INTERNAL_DB_ERROR 1383L\n#define ERROR_TOO_MANY_CONTEXT_IDS 1384L\n#define ERROR_LOGON_TYPE_NOT_GRANTED 1385L\n#define ERROR_NT_CROSS_ENCRYPTION_REQUIRED 1386L\n#define ERROR_NO_SUCH_MEMBER 1387L\n#define ERROR_INVALID_MEMBER 1388L\n#define ERROR_TOO_MANY_SIDS 1389L\n#define ERROR_LM_CROSS_ENCRYPTION_REQUIRED 1390L\n#define ERROR_NO_INHERITANCE 1391L\n#define ERROR_FILE_CORRUPT 1392L\n#define ERROR_DISK_CORRUPT 1393L\n#define ERROR_NO_USER_SESSION_KEY 1394L\n#define ERROR_LICENSE_QUOTA_EXCEEDED 1395L\n#define ERROR_WRONG_TARGET_NAME 1396L\n#define ERROR_MUTUAL_AUTH_FAILED 1397L\n#define ERROR_TIME_SKEW 1398L\n#define ERROR_CURRENT_DOMAIN_NOT_ALLOWED 1399L\n#define ERROR_INVALID_WINDOW_HANDLE 1400L\n#define ERROR_INVALID_MENU_HANDLE 1401L\n#define ERROR_INVALID_CURSOR_HANDLE 1402L\n#define ERROR_INVALID_ACCEL_HANDLE 1403L\n#define ERROR_INVALID_HOOK_HANDLE 1404L\n#define ERROR_INVALID_DWP_HANDLE 1405L\n#define ERROR_TLW_WITH_WSCHILD 1406L\n#define ERROR_CANNOT_FIND_WND_CLASS 1407L\n#define ERROR_WINDOW_OF_OTHER_THREAD 1408L\n#define ERROR_HOTKEY_ALREADY_REGISTERED 1409L\n#define ERROR_CLASS_ALREADY_EXISTS 1410L\n#define ERROR_CLASS_DOES_NOT_EXIST 1411L\n#define ERROR_CLASS_HAS_WINDOWS 1412L\n#define ERROR_INVALID_INDEX 1413L\n#define ERROR_INVALID_ICON_HANDLE 1414L\n#define ERROR_PRIVATE_DIALOG_INDEX 1415L\n#define ERROR_LISTBOX_ID_NOT_FOUND 1416L\n#define ERROR_NO_WILDCARD_CHARACTERS 1417L\n#define ERROR_CLIPBOARD_NOT_OPEN 1418L\n#define ERROR_HOTKEY_NOT_REGISTERED 1419L\n#define ERROR_WINDOW_NOT_DIALOG 1420L\n#define ERROR_CONTROL_ID_NOT_FOUND 1421L\n#define ERROR_INVALID_COMBOBOX_MESSAGE 1422L\n#define ERROR_WINDOW_NOT_COMBOBOX 1423L\n#define ERROR_INVALID_EDIT_HEIGHT 1424L\n#define ERROR_DC_NOT_FOUND 1425L\n#define ERROR_INVALID_HOOK_FILTER 1426L\n#define ERROR_INVALID_FILTER_PROC 1427L\n#define ERROR_HOOK_NEEDS_HMOD 1428L\n#define ERROR_GLOBAL_ONLY_HOOK 1429L\n#define ERROR_JOURNAL_HOOK_SET 1430L\n#define ERROR_HOOK_NOT_INSTALLED 1431L\n#define ERROR_INVALID_LB_MESSAGE 1432L\n#define ERROR_SETCOUNT_ON_BAD_LB 1433L\n#define ERROR_LB_WITHOUT_TABSTOPS 1434L\n#define ERROR_DESTROY_OBJECT_OF_OTHER_THREAD 1435L\n#define ERROR_CHILD_WINDOW_MENU 1436L\n#define ERROR_NO_SYSTEM_MENU 1437L\n#define ERROR_INVALID_MSGBOX_STYLE 1438L\n#define ERROR_INVALID_SPI_VALUE 1439L\n#define ERROR_SCREEN_ALREADY_LOCKED 1440L\n#define ERROR_HWNDS_HAVE_DIFF_PARENT 1441L\n#define ERROR_NOT_CHILD_WINDOW 1442L\n#define ERROR_INVALID_GW_COMMAND 1443L\n#define ERROR_INVALID_THREAD_ID 1444L\n#define ERROR_NON_MDICHILD_WINDOW 1445L\n#define ERROR_POPUP_ALREADY_ACTIVE 1446L\n#define ERROR_NO_SCROLLBARS 1447L\n#define ERROR_INVALID_SCROLLBAR_RANGE 1448L\n#define ERROR_INVALID_SHOWWIN_COMMAND 1449L\n#define ERROR_NO_SYSTEM_RESOURCES 1450L\n#define ERROR_NONPAGED_SYSTEM_RESOURCES 1451L\n#define ERROR_PAGED_SYSTEM_RESOURCES 1452L\n#define ERROR_WORKING_SET_QUOTA 1453L\n#define ERROR_PAGEFILE_QUOTA 1454L\n#define ERROR_COMMITMENT_LIMIT 1455L\n#define ERROR_MENU_ITEM_NOT_FOUND 1456L\n#define ERROR_INVALID_KEYBOARD_HANDLE 1457L\n#define ERROR_HOOK_TYPE_NOT_ALLOWED 1458L\n#define ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION 1459L\n#define ERROR_TIMEOUT 1460L\n#define ERROR_INVALID_MONITOR_HANDLE 1461L\n#define ERROR_INCORRECT_SIZE 1462L\n#define ERROR_EVENTLOG_FILE_CORRUPT 1500L\n#define ERROR_EVENTLOG_CANT_START 1501L\n#define ERROR_LOG_FILE_FULL 1502L\n#define ERROR_EVENTLOG_FILE_CHANGED 1503L\n#define ERROR_INSTALL_SERVICE_FAILURE 1601L\n#define ERROR_INSTALL_USEREXIT 1602L\n#define ERROR_INSTALL_FAILURE 1603L\n#define ERROR_INSTALL_SUSPEND 1604L\n#define ERROR_UNKNOWN_PRODUCT 1605L\n#define ERROR_UNKNOWN_FEATURE 1606L\n#define ERROR_UNKNOWN_COMPONENT 1607L\n#define ERROR_UNKNOWN_PROPERTY 1608L\n#define ERROR_INVALID_HANDLE_STATE 1609L\n#define ERROR_BAD_CONFIGURATION 1610L\n#define ERROR_INDEX_ABSENT 1611L\n#define ERROR_INSTALL_SOURCE_ABSENT 1612L\n#define ERROR_INSTALL_PACKAGE_VERSION 1613L\n#define ERROR_PRODUCT_UNINSTALLED 1614L\n#define ERROR_BAD_QUERY_SYNTAX 1615L\n#define ERROR_INVALID_FIELD 1616L\n#define ERROR_DEVICE_REMOVED 1617L\n#define ERROR_INSTALL_ALREADY_RUNNING 1618L\n#define ERROR_INSTALL_PACKAGE_OPEN_FAILED 1619L\n#define ERROR_INSTALL_PACKAGE_INVALID 1620L\n#define ERROR_INSTALL_UI_FAILURE 1621L\n#define ERROR_INSTALL_LOG_FAILURE 1622L\n#define ERROR_INSTALL_LANGUAGE_UNSUPPORTED 1623L\n#define ERROR_INSTALL_TRANSFORM_FAILURE 1624L\n#define ERROR_INSTALL_PACKAGE_REJECTED 1625L\n#define ERROR_FUNCTION_NOT_CALLED 1626L\n#define ERROR_FUNCTION_FAILED 1627L\n#define ERROR_INVALID_TABLE 1628L\n#define ERROR_DATATYPE_MISMATCH 1629L\n#define ERROR_UNSUPPORTED_TYPE 1630L\n#define ERROR_CREATE_FAILED 1631L\n#define ERROR_INSTALL_TEMP_UNWRITABLE 1632L\n#define ERROR_INSTALL_PLATFORM_UNSUPPORTED 1633L\n#define ERROR_INSTALL_NOTUSED 1634L\n#define ERROR_PATCH_PACKAGE_OPEN_FAILED 1635L\n#define ERROR_PATCH_PACKAGE_INVALID 1636L\n#define ERROR_PATCH_PACKAGE_UNSUPPORTED 1637L\n#define ERROR_PRODUCT_VERSION 1638L\n#define ERROR_INVALID_COMMAND_LINE 1639L\n#define ERROR_INSTALL_REMOTE_DISALLOWED 1640L\n#define ERROR_SUCCESS_REBOOT_INITIATED 1641L\n#define ERROR_PATCH_TARGET_NOT_FOUND 1642L\n#define ERROR_PATCH_PACKAGE_REJECTED 1643L\n#define ERROR_INSTALL_TRANSFORM_REJECTED 1644L\n#define ERROR_INSTALL_REMOTE_PROHIBITED 1645L\n#define RPC_S_INVALID_STRING_BINDING 1700L\n#define RPC_S_WRONG_KIND_OF_BINDING 1701L\n#define RPC_S_INVALID_BINDING 1702L\n#define RPC_S_PROTSEQ_NOT_SUPPORTED 1703L\n#define RPC_S_INVALID_RPC_PROTSEQ 1704L\n#define RPC_S_INVALID_STRING_UUID 1705L\n#define RPC_S_INVALID_ENDPOINT_FORMAT 1706L\n#define RPC_S_INVALID_NET_ADDR 1707L\n#define RPC_S_NO_ENDPOINT_FOUND 1708L\n#define RPC_S_INVALID_TIMEOUT 1709L\n#define RPC_S_OBJECT_NOT_FOUND 1710L\n#define RPC_S_ALREADY_REGISTERED 1711L\n#define RPC_S_TYPE_ALREADY_REGISTERED 1712L\n#define RPC_S_ALREADY_LISTENING 1713L\n#define RPC_S_NO_PROTSEQS_REGISTERED 1714L\n#define RPC_S_NOT_LISTENING 1715L\n#define RPC_S_UNKNOWN_MGR_TYPE 1716L\n#define RPC_S_UNKNOWN_IF 1717L\n#define RPC_S_NO_BINDINGS 1718L\n#define RPC_S_NO_PROTSEQS 1719L\n#define RPC_S_CANT_CREATE_ENDPOINT 1720L\n#define RPC_S_OUT_OF_RESOURCES 1721L\n#define RPC_S_SERVER_UNAVAILABLE 1722L\n#define RPC_S_SERVER_TOO_BUSY 1723L\n#define RPC_S_INVALID_NETWORK_OPTIONS 1724L\n#define RPC_S_NO_CALL_ACTIVE 1725L\n#define RPC_S_CALL_FAILED 1726L\n#define RPC_S_CALL_FAILED_DNE 1727L\n#define RPC_S_PROTOCOL_ERROR 1728L\n#define RPC_S_UNSUPPORTED_TRANS_SYN 1730L\n#define RPC_S_UNSUPPORTED_TYPE 1732L\n#define RPC_S_INVALID_TAG 1733L\n#define RPC_S_INVALID_BOUND 1734L\n#define RPC_S_NO_ENTRY_NAME 1735L\n#define RPC_S_INVALID_NAME_SYNTAX 1736L\n#define RPC_S_UNSUPPORTED_NAME_SYNTAX 1737L\n#define RPC_S_UUID_NO_ADDRESS 1739L\n#define RPC_S_DUPLICATE_ENDPOINT 1740L\n#define RPC_S_UNKNOWN_AUTHN_TYPE 1741L\n#define RPC_S_MAX_CALLS_TOO_SMALL 1742L\n#define RPC_S_STRING_TOO_LONG 1743L\n#define RPC_S_PROTSEQ_NOT_FOUND 1744L\n#define RPC_S_PROCNUM_OUT_OF_RANGE 1745L\n#define RPC_S_BINDING_HAS_NO_AUTH 1746L\n#define RPC_S_UNKNOWN_AUTHN_SERVICE 1747L\n#define RPC_S_UNKNOWN_AUTHN_LEVEL 1748L\n#define RPC_S_INVALID_AUTH_IDENTITY 1749L\n#define RPC_S_UNKNOWN_AUTHZ_SERVICE 1750L\n#define EPT_S_INVALID_ENTRY 1751L\n#define EPT_S_CANT_PERFORM_OP 1752L\n#define EPT_S_NOT_REGISTERED 1753L\n#define RPC_S_NOTHING_TO_EXPORT 1754L\n#define RPC_S_INCOMPLETE_NAME 1755L\n#define RPC_S_INVALID_VERS_OPTION 1756L\n#define RPC_S_NO_MORE_MEMBERS 1757L\n#define RPC_S_NOT_ALL_OBJS_UNEXPORTED 1758L\n#define RPC_S_INTERFACE_NOT_FOUND 1759L\n#define RPC_S_ENTRY_ALREADY_EXISTS 1760L\n#define RPC_S_ENTRY_NOT_FOUND 1761L\n#define RPC_S_NAME_SERVICE_UNAVAILABLE 1762L\n#define RPC_S_INVALID_NAF_ID 1763L\n#define RPC_S_CANNOT_SUPPORT 1764L\n#define RPC_S_NO_CONTEXT_AVAILABLE 1765L\n#define RPC_S_INTERNAL_ERROR 1766L\n#define RPC_S_ZERO_DIVIDE 1767L\n#define RPC_S_ADDRESS_ERROR 1768L\n#define RPC_S_FP_DIV_ZERO 1769L\n#define RPC_S_FP_UNDERFLOW 1770L\n#define RPC_S_FP_OVERFLOW 1771L\n#define RPC_X_NO_MORE_ENTRIES 1772L\n#define RPC_X_SS_CHAR_TRANS_OPEN_FAIL 1773L\n#define RPC_X_SS_CHAR_TRANS_SHORT_FILE 1774L\n#define RPC_X_SS_IN_NULL_CONTEXT 1775L\n#define RPC_X_SS_CONTEXT_DAMAGED 1777L\n#define RPC_X_SS_HANDLES_MISMATCH 1778L\n#define RPC_X_SS_CANNOT_GET_CALL_HANDLE 1779L\n#define RPC_X_NULL_REF_POINTER 1780L\n#define RPC_X_ENUM_VALUE_OUT_OF_RANGE 1781L\n#define RPC_X_BYTE_COUNT_TOO_SMALL 1782L\n#define RPC_X_BAD_STUB_DATA 1783L\n#define ERROR_INVALID_USER_BUFFER 1784L\n#define ERROR_UNRECOGNIZED_MEDIA 1785L\n#define ERROR_NO_TRUST_LSA_SECRET 1786L\n#define ERROR_NO_TRUST_SAM_ACCOUNT 1787L\n#define ERROR_TRUSTED_DOMAIN_FAILURE 1788L\n#define ERROR_TRUSTED_RELATIONSHIP_FAILURE 1789L\n#define ERROR_TRUST_FAILURE 1790L\n#define RPC_S_CALL_IN_PROGRESS 1791L\n#define ERROR_NETLOGON_NOT_STARTED 1792L\n#define ERROR_ACCOUNT_EXPIRED 1793L\n#define ERROR_REDIRECTOR_HAS_OPEN_HANDLES 1794L\n#define ERROR_PRINTER_DRIVER_ALREADY_INSTALLED 1795L\n#define ERROR_UNKNOWN_PORT 1796L\n#define ERROR_UNKNOWN_PRINTER_DRIVER 1797L\n#define ERROR_UNKNOWN_PRINTPROCESSOR 1798L\n#define ERROR_INVALID_SEPARATOR_FILE 1799L\n#define ERROR_INVALID_PRIORITY 1800L\n#define ERROR_INVALID_PRINTER_NAME 1801L\n#define ERROR_PRINTER_ALREADY_EXISTS 1802L\n#define ERROR_INVALID_PRINTER_COMMAND 1803L\n#define ERROR_INVALID_DATATYPE 1804L\n#define ERROR_INVALID_ENVIRONMENT 1805L\n#define RPC_S_NO_MORE_BINDINGS 1806L\n#define ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 1807L\n#define ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT 1808L\n#define ERROR_NOLOGON_SERVER_TRUST_ACCOUNT 1809L\n#define ERROR_DOMAIN_TRUST_INCONSISTENT 1810L\n#define ERROR_SERVER_HAS_OPEN_HANDLES 1811L\n#define ERROR_RESOURCE_DATA_NOT_FOUND 1812L\n#define ERROR_RESOURCE_TYPE_NOT_FOUND 1813L\n#define ERROR_RESOURCE_NAME_NOT_FOUND 1814L\n#define ERROR_RESOURCE_LANG_NOT_FOUND 1815L\n#define ERROR_NOT_ENOUGH_QUOTA 1816L\n#define RPC_S_NO_INTERFACES 1817L\n#define RPC_S_CALL_CANCELLED 1818L\n#define RPC_S_BINDING_INCOMPLETE 1819L\n#define RPC_S_COMM_FAILURE 1820L\n#define RPC_S_UNSUPPORTED_AUTHN_LEVEL 1821L\n#define RPC_S_NO_PRINC_NAME 1822L\n#define RPC_S_NOT_RPC_ERROR 1823L\n#define RPC_S_UUID_LOCAL_ONLY 1824L\n#define RPC_S_SEC_PKG_ERROR 1825L\n#define RPC_S_NOT_CANCELLED 1826L\n#define RPC_X_INVALID_ES_ACTION 1827L\n#define RPC_X_WRONG_ES_VERSION 1828L\n#define RPC_X_WRONG_STUB_VERSION 1829L\n#define RPC_X_INVALID_PIPE_OBJECT 1830L\n#define RPC_X_WRONG_PIPE_ORDER 1831L\n#define RPC_X_WRONG_PIPE_VERSION 1832L\n#define RPC_S_GROUP_MEMBER_NOT_FOUND 1898L\n#define EPT_S_CANT_CREATE 1899L\n#define RPC_S_INVALID_OBJECT 1900L\n#define ERROR_INVALID_TIME 1901L\n#define ERROR_INVALID_FORM_NAME 1902L\n#define ERROR_INVALID_FORM_SIZE 1903L\n#define ERROR_ALREADY_WAITING 1904L\n#define ERROR_PRINTER_DELETED 1905L\n#define ERROR_INVALID_PRINTER_STATE 1906L\n#define ERROR_PASSWORD_MUST_CHANGE 1907L\n#define ERROR_DOMAIN_CONTROLLER_NOT_FOUND 1908L\n#define ERROR_ACCOUNT_LOCKED_OUT 1909L\n#define OR_INVALID_OXID 1910L\n#define OR_INVALID_OID 1911L\n#define OR_INVALID_SET 1912L\n#define RPC_S_SEND_INCOMPLETE 1913L\n#define RPC_S_INVALID_ASYNC_HANDLE 1914L\n#define RPC_S_INVALID_ASYNC_CALL 1915L\n#define RPC_X_PIPE_CLOSED 1916L\n#define RPC_X_PIPE_DISCIPLINE_ERROR 1917L\n#define RPC_X_PIPE_EMPTY 1918L\n#define ERROR_NO_SITENAME 1919L\n#define ERROR_CANT_ACCESS_FILE 1920L\n#define ERROR_CANT_RESOLVE_FILENAME 1921L\n#define RPC_S_ENTRY_TYPE_MISMATCH 1922L\n#define RPC_S_NOT_ALL_OBJS_EXPORTED 1923L\n#define RPC_S_INTERFACE_NOT_EXPORTED 1924L\n#define RPC_S_PROFILE_NOT_ADDED 1925L\n#define RPC_S_PRF_ELT_NOT_ADDED 1926L\n#define RPC_S_PRF_ELT_NOT_REMOVED 1927L\n#define RPC_S_GRP_ELT_NOT_ADDED 1928L\n#define RPC_S_GRP_ELT_NOT_REMOVED 1929L\n#define ERROR_KM_DRIVER_BLOCKED 1930L\n#define ERROR_CONTEXT_EXPIRED 1931L\n#define ERROR_PER_USER_TRUST_QUOTA_EXCEEDED 1932L\n#define ERROR_ALL_USER_TRUST_QUOTA_EXCEEDED 1933L\n#define ERROR_USER_DELETE_TRUST_QUOTA_EXCEEDED 1934L\n#define ERROR_AUTHENTICATION_FIREWALL_FAILED 1935L\n#define ERROR_REMOTE_PRINT_CONNECTIONS_BLOCKED 1936L\n#define ERROR_INVALID_PIXEL_FORMAT 2000L\n#define ERROR_BAD_DRIVER 2001L\n#define ERROR_INVALID_WINDOW_STYLE 2002L\n#define ERROR_METAFILE_NOT_SUPPORTED 2003L\n#define ERROR_TRANSFORM_NOT_SUPPORTED 2004L\n#define ERROR_CLIPPING_NOT_SUPPORTED 2005L\n#define ERROR_INVALID_CMM 2010L\n#define ERROR_INVALID_PROFILE 2011L\n#define ERROR_TAG_NOT_FOUND 2012L\n#define ERROR_TAG_NOT_PRESENT 2013L\n#define ERROR_DUPLICATE_TAG 2014L\n#define ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE 2015L\n#define ERROR_PROFILE_NOT_FOUND 2016L\n#define ERROR_INVALID_COLORSPACE 2017L\n#define ERROR_ICM_NOT_ENABLED 2018L\n#define ERROR_DELETING_ICM_XFORM 2019L\n#define ERROR_INVALID_TRANSFORM 2020L\n#define ERROR_COLORSPACE_MISMATCH 2021L\n#define ERROR_INVALID_COLORINDEX 2022L\n#define ERROR_CONNECTED_OTHER_PASSWORD 2108L\n#define ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT 2109L\n#define ERROR_BAD_USERNAME 2202L\n#define ERROR_NOT_CONNECTED 2250L\n#define ERROR_OPEN_FILES 2401L\n#define ERROR_ACTIVE_CONNECTIONS 2402L\n#define ERROR_DEVICE_IN_USE 2404L\n#define ERROR_UNKNOWN_PRINT_MONITOR 3000L\n#define ERROR_PRINTER_DRIVER_IN_USE 3001L\n#define ERROR_SPOOL_FILE_NOT_FOUND 3002L\n#define ERROR_SPL_NO_STARTDOC 3003L\n#define ERROR_SPL_NO_ADDJOB 3004L\n#define ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED 3005L\n#define ERROR_PRINT_MONITOR_ALREADY_INSTALLED 3006L\n#define ERROR_INVALID_PRINT_MONITOR 3007L\n#define ERROR_PRINT_MONITOR_IN_USE 3008L\n#define ERROR_PRINTER_HAS_JOBS_QUEUED 3009L\n#define ERROR_SUCCESS_REBOOT_REQUIRED 3010L\n#define ERROR_SUCCESS_RESTART_REQUIRED 3011L\n#define ERROR_PRINTER_NOT_FOUND 3012L\n#define ERROR_PRINTER_DRIVER_WARNED 3013L\n#define ERROR_PRINTER_DRIVER_BLOCKED 3014L\n#define ERROR_WINS_INTERNAL 4000L\n#define ERROR_CAN_NOT_DEL_LOCAL_WINS 4001L\n#define ERROR_STATIC_INIT 4002L\n#define ERROR_INC_BACKUP 4003L\n#define ERROR_FULL_BACKUP 4004L\n#define ERROR_REC_NON_EXISTENT 4005L\n#define ERROR_RPL_NOT_ALLOWED 4006L\n#define ERROR_DHCP_ADDRESS_CONFLICT 4100L\n#define ERROR_WMI_GUID_NOT_FOUND 4200L\n#define ERROR_WMI_INSTANCE_NOT_FOUND 4201L\n#define ERROR_WMI_ITEMID_NOT_FOUND 4202L\n#define ERROR_WMI_TRY_AGAIN 4203L\n#define ERROR_WMI_DP_NOT_FOUND 4204L\n#define ERROR_WMI_UNRESOLVED_INSTANCE_REF 4205L\n#define ERROR_WMI_ALREADY_ENABLED 4206L\n#define ERROR_WMI_GUID_DISCONNECTED 4207L\n#define ERROR_WMI_SERVER_UNAVAILABLE 4208L\n#define ERROR_WMI_DP_FAILED 4209L\n#define ERROR_WMI_INVALID_MOF 4210L\n#define ERROR_WMI_INVALID_REGINFO 4211L\n#define ERROR_WMI_ALREADY_DISABLED 4212L\n#define ERROR_WMI_READ_ONLY 4213L\n#define ERROR_WMI_SET_FAILURE 4214L\n#define ERROR_INVALID_MEDIA 4300L\n#define ERROR_INVALID_LIBRARY 4301L\n#define ERROR_INVALID_MEDIA_POOL 4302L\n#define ERROR_DRIVE_MEDIA_MISMATCH 4303L\n#define ERROR_MEDIA_OFFLINE 4304L\n#define ERROR_LIBRARY_OFFLINE 4305L\n#define ERROR_EMPTY 4306L\n#define ERROR_NOT_EMPTY 4307L\n#define ERROR_MEDIA_UNAVAILABLE 4308L\n#define ERROR_RESOURCE_DISABLED 4309L\n#define ERROR_INVALID_CLEANER 4310L\n#define ERROR_UNABLE_TO_CLEAN 4311L\n#define ERROR_OBJECT_NOT_FOUND 4312L\n#define ERROR_DATABASE_FAILURE 4313L\n#define ERROR_DATABASE_FULL 4314L\n#define ERROR_MEDIA_INCOMPATIBLE 4315L\n#define ERROR_RESOURCE_NOT_PRESENT 4316L\n#define ERROR_INVALID_OPERATION 4317L\n#define ERROR_MEDIA_NOT_AVAILABLE 4318L\n#define ERROR_DEVICE_NOT_AVAILABLE 4319L\n#define ERROR_REQUEST_REFUSED 4320L\n#define ERROR_INVALID_DRIVE_OBJECT 4321L\n#define ERROR_LIBRARY_FULL 4322L\n#define ERROR_MEDIUM_NOT_ACCESSIBLE 4323L\n#define ERROR_UNABLE_TO_LOAD_MEDIUM 4324L\n#define ERROR_UNABLE_TO_INVENTORY_DRIVE 4325L\n#define ERROR_UNABLE_TO_INVENTORY_SLOT 4326L\n#define ERROR_UNABLE_TO_INVENTORY_TRANSPORT 4327L\n#define ERROR_TRANSPORT_FULL 4328L\n#define ERROR_CONTROLLING_IEPORT 4329L\n#define ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA 4330L\n#define ERROR_CLEANER_SLOT_SET 4331L\n#define ERROR_CLEANER_SLOT_NOT_SET 4332L\n#define ERROR_CLEANER_CARTRIDGE_SPENT 4333L\n#define ERROR_UNEXPECTED_OMID 4334L\n#define ERROR_CANT_DELETE_LAST_ITEM 4335L\n#define ERROR_MESSAGE_EXCEEDS_MAX_SIZE 4336L\n#define ERROR_VOLUME_CONTAINS_SYS_FILES 4337L\n#define ERROR_INDIGENOUS_TYPE 4338L\n#define ERROR_NO_SUPPORTING_DRIVES 4339L\n#define ERROR_CLEANER_CARTRIDGE_INSTALLED 4340L\n#define ERROR_IEPORT_FULL 4341L\n#define ERROR_FILE_OFFLINE 4350L\n#define ERROR_REMOTE_STORAGE_NOT_ACTIVE 4351L\n#define ERROR_REMOTE_STORAGE_MEDIA_ERROR 4352L\n#define ERROR_NOT_A_REPARSE_POINT 4390L\n#define ERROR_REPARSE_ATTRIBUTE_CONFLICT 4391L\n#define ERROR_INVALID_REPARSE_DATA 4392L\n#define ERROR_REPARSE_TAG_INVALID 4393L\n#define ERROR_REPARSE_TAG_MISMATCH 4394L\n#define ERROR_VOLUME_NOT_SIS_ENABLED 4500L\n#define ERROR_DEPENDENT_RESOURCE_EXISTS 5001L\n#define ERROR_DEPENDENCY_NOT_FOUND 5002L\n#define ERROR_DEPENDENCY_ALREADY_EXISTS 5003L\n#define ERROR_RESOURCE_NOT_ONLINE 5004L\n#define ERROR_HOST_NODE_NOT_AVAILABLE 5005L\n#define ERROR_RESOURCE_NOT_AVAILABLE 5006L\n#define ERROR_RESOURCE_NOT_FOUND 5007L\n#define ERROR_SHUTDOWN_CLUSTER 5008L\n#define ERROR_CANT_EVICT_ACTIVE_NODE 5009L\n#define ERROR_OBJECT_ALREADY_EXISTS 5010L\n#define ERROR_OBJECT_IN_LIST 5011L\n#define ERROR_GROUP_NOT_AVAILABLE 5012L\n#define ERROR_GROUP_NOT_FOUND 5013L\n#define ERROR_GROUP_NOT_ONLINE 5014L\n#define ERROR_HOST_NODE_NOT_RESOURCE_OWNER 5015L\n#define ERROR_HOST_NODE_NOT_GROUP_OWNER 5016L\n#define ERROR_RESMON_CREATE_FAILED 5017L\n#define ERROR_RESMON_ONLINE_FAILED 5018L\n#define ERROR_RESOURCE_ONLINE 5019L\n#define ERROR_QUORUM_RESOURCE 5020L\n#define ERROR_NOT_QUORUM_CAPABLE 5021L\n#define ERROR_CLUSTER_SHUTTING_DOWN 5022L\n#define ERROR_INVALID_STATE 5023L\n#define ERROR_RESOURCE_PROPERTIES_STORED 5024L\n#define ERROR_NOT_QUORUM_CLASS 5025L\n#define ERROR_CORE_RESOURCE 5026L\n#define ERROR_QUORUM_RESOURCE_ONLINE_FAILED 5027L\n#define ERROR_QUORUMLOG_OPEN_FAILED 5028L\n#define ERROR_CLUSTERLOG_CORRUPT 5029L\n#define ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE 5030L\n#define ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE 5031L\n#define ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND 5032L\n#define ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE 5033L\n#define ERROR_QUORUM_OWNER_ALIVE 5034L\n#define ERROR_NETWORK_NOT_AVAILABLE 5035L\n#define ERROR_NODE_NOT_AVAILABLE 5036L\n#define ERROR_ALL_NODES_NOT_AVAILABLE 5037L\n#define ERROR_RESOURCE_FAILED 5038L\n#define ERROR_CLUSTER_INVALID_NODE 5039L\n#define ERROR_CLUSTER_NODE_EXISTS 5040L\n#define ERROR_CLUSTER_JOIN_IN_PROGRESS 5041L\n#define ERROR_CLUSTER_NODE_NOT_FOUND 5042L\n#define ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND 5043L\n#define ERROR_CLUSTER_NETWORK_EXISTS 5044L\n#define ERROR_CLUSTER_NETWORK_NOT_FOUND 5045L\n#define ERROR_CLUSTER_NETINTERFACE_EXISTS 5046L\n#define ERROR_CLUSTER_NETINTERFACE_NOT_FOUND 5047L\n#define ERROR_CLUSTER_INVALID_REQUEST 5048L\n#define ERROR_CLUSTER_INVALID_NETWORK_PROVIDER 5049L\n#define ERROR_CLUSTER_NODE_DOWN 5050L\n#define ERROR_CLUSTER_NODE_UNREACHABLE 5051L\n#define ERROR_CLUSTER_NODE_NOT_MEMBER 5052L\n#define ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS 5053L\n#define ERROR_CLUSTER_INVALID_NETWORK 5054L\n#define ERROR_CLUSTER_NODE_UP 5056L\n#define ERROR_CLUSTER_IPADDR_IN_USE 5057L\n#define ERROR_CLUSTER_NODE_NOT_PAUSED 5058L\n#define ERROR_CLUSTER_NO_SECURITY_CONTEXT 5059L\n#define ERROR_CLUSTER_NETWORK_NOT_INTERNAL 5060L\n#define ERROR_CLUSTER_NODE_ALREADY_UP 5061L\n#define ERROR_CLUSTER_NODE_ALREADY_DOWN 5062L\n#define ERROR_CLUSTER_NETWORK_ALREADY_ONLINE 5063L\n#define ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE 5064L\n#define ERROR_CLUSTER_NODE_ALREADY_MEMBER 5065L\n#define ERROR_CLUSTER_LAST_INTERNAL_NETWORK 5066L\n#define ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS 5067L\n#define ERROR_INVALID_OPERATION_ON_QUORUM 5068L\n#define ERROR_DEPENDENCY_NOT_ALLOWED 5069L\n#define ERROR_CLUSTER_NODE_PAUSED 5070L\n#define ERROR_NODE_CANT_HOST_RESOURCE 5071L\n#define ERROR_CLUSTER_NODE_NOT_READY 5072L\n#define ERROR_CLUSTER_NODE_SHUTTING_DOWN 5073L\n#define ERROR_CLUSTER_JOIN_ABORTED 5074L\n#define ERROR_CLUSTER_INCOMPATIBLE_VERSIONS 5075L\n#define ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED 5076L\n#define ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED 5077L\n#define ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND 5078L\n#define ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED 5079L\n#define ERROR_CLUSTER_RESNAME_NOT_FOUND 5080L\n#define ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED 5081L\n#define ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST 5082L\n#define ERROR_CLUSTER_DATABASE_SEQMISMATCH 5083L\n#define ERROR_RESMON_INVALID_STATE 5084L\n#define ERROR_CLUSTER_GUM_NOT_LOCKER 5085L\n#define ERROR_QUORUM_DISK_NOT_FOUND 5086L\n#define ERROR_DATABASE_BACKUP_CORRUPT 5087L\n#define ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT 5088L\n#define ERROR_RESOURCE_PROPERTY_UNCHANGEABLE 5089L\n#define ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE 5890L\n#define ERROR_CLUSTER_QUORUMLOG_NOT_FOUND 5891L\n#define ERROR_CLUSTER_MEMBERSHIP_HALT 5892L\n#define ERROR_CLUSTER_INSTANCE_ID_MISMATCH 5893L\n#define ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP 5894L\n#define ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH 5895L\n#define ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP 5896L\n#define ERROR_CLUSTER_PARAMETER_MISMATCH 5897L\n#define ERROR_NODE_CANNOT_BE_CLUSTERED 5898L\n#define ERROR_CLUSTER_WRONG_OS_VERSION 5899L\n#define ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME 5900L\n#define ERROR_CLUSCFG_ALREADY_COMMITTED 5901L\n#define ERROR_CLUSCFG_ROLLBACK_FAILED 5902L\n#define ERROR_CLUSCFG_SYSTEM_DISK_DRIVE_LETTER_CONFLICT 5903L\n#define ERROR_CLUSTER_OLD_VERSION 5904L\n#define ERROR_CLUSTER_MISMATCHED_COMPUTER_ACCT_NAME 5905L\n#define ERROR_ENCRYPTION_FAILED 6000L\n#define ERROR_DECRYPTION_FAILED 6001L\n#define ERROR_FILE_ENCRYPTED 6002L\n#define ERROR_NO_RECOVERY_POLICY 6003L\n#define ERROR_NO_EFS 6004L\n#define ERROR_WRONG_EFS 6005L\n#define ERROR_NO_USER_KEYS 6006L\n#define ERROR_FILE_NOT_ENCRYPTED 6007L\n#define ERROR_NOT_EXPORT_FORMAT 6008L\n#define ERROR_FILE_READ_ONLY 6009L\n#define ERROR_DIR_EFS_DISALLOWED 6010L\n#define ERROR_EFS_SERVER_NOT_TRUSTED 6011L\n#define ERROR_BAD_RECOVERY_POLICY 6012L\n#define ERROR_EFS_ALG_BLOB_TOO_BIG 6013L\n#define ERROR_VOLUME_NOT_SUPPORT_EFS 6014L\n#define ERROR_EFS_DISABLED 6015L\n#define ERROR_EFS_VERSION_NOT_SUPPORT 6016L\n#define ERROR_NO_BROWSER_SERVERS_FOUND 6118L\n#define SCHED_E_SERVICE_NOT_LOCALSYSTEM 6200L\n#define ERROR_CTX_WINSTATION_NAME_INVALID 7001L\n#define ERROR_CTX_INVALID_PD 7002L\n#define ERROR_CTX_PD_NOT_FOUND 7003L\n#define ERROR_CTX_WD_NOT_FOUND 7004L\n#define ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY 7005L\n#define ERROR_CTX_SERVICE_NAME_COLLISION 7006L\n#define ERROR_CTX_CLOSE_PENDING 7007L\n#define ERROR_CTX_NO_OUTBUF 7008L\n#define ERROR_CTX_MODEM_INF_NOT_FOUND 7009L\n#define ERROR_CTX_INVALID_MODEMNAME 7010L\n#define ERROR_CTX_MODEM_RESPONSE_ERROR 7011L\n#define ERROR_CTX_MODEM_RESPONSE_TIMEOUT 7012L\n#define ERROR_CTX_MODEM_RESPONSE_NO_CARRIER 7013L\n#define ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE 7014L\n#define ERROR_CTX_MODEM_RESPONSE_BUSY 7015L\n#define ERROR_CTX_MODEM_RESPONSE_VOICE 7016L\n#define ERROR_CTX_TD_ERROR 7017L\n#define ERROR_CTX_WINSTATION_NOT_FOUND 7022L\n#define ERROR_CTX_WINSTATION_ALREADY_EXISTS 7023L\n#define ERROR_CTX_WINSTATION_BUSY 7024L\n#define ERROR_CTX_BAD_VIDEO_MODE 7025L\n#define ERROR_CTX_GRAPHICS_INVALID 7035L\n#define ERROR_CTX_LOGON_DISABLED 7037L\n#define ERROR_CTX_NOT_CONSOLE 7038L\n#define ERROR_CTX_CLIENT_QUERY_TIMEOUT 7040L\n#define ERROR_CTX_CONSOLE_DISCONNECT 7041L\n#define ERROR_CTX_CONSOLE_CONNECT 7042L\n#define ERROR_CTX_SHADOW_DENIED 7044L\n#define ERROR_CTX_WINSTATION_ACCESS_DENIED 7045L\n#define ERROR_CTX_INVALID_WD 7049L\n#define ERROR_CTX_SHADOW_INVALID 7050L\n#define ERROR_CTX_SHADOW_DISABLED 7051L\n#define ERROR_CTX_CLIENT_LICENSE_IN_USE 7052L\n#define ERROR_CTX_CLIENT_LICENSE_NOT_SET 7053L\n#define ERROR_CTX_LICENSE_NOT_AVAILABLE 7054L\n#define ERROR_CTX_LICENSE_CLIENT_INVALID 7055L\n#define ERROR_CTX_LICENSE_EXPIRED 7056L\n#define ERROR_CTX_SHADOW_NOT_RUNNING 7057L\n#define ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE 7058L\n#define ERROR_ACTIVATION_COUNT_EXCEEDED 7059L\n#define FRS_ERR_INVALID_API_SEQUENCE 8001L\n#define FRS_ERR_STARTING_SERVICE 8002L\n#define FRS_ERR_STOPPING_SERVICE 8003L\n#define FRS_ERR_INTERNAL_API 8004L\n#define FRS_ERR_INTERNAL 8005L\n#define FRS_ERR_SERVICE_COMM 8006L\n#define FRS_ERR_INSUFFICIENT_PRIV 8007L\n#define FRS_ERR_AUTHENTICATION 8008L\n#define FRS_ERR_PARENT_INSUFFICIENT_PRIV 8009L\n#define FRS_ERR_PARENT_AUTHENTICATION 8010L\n#define FRS_ERR_CHILD_TO_PARENT_COMM 8011L\n#define FRS_ERR_PARENT_TO_CHILD_COMM 8012L\n#define FRS_ERR_SYSVOL_POPULATE 8013L\n#define FRS_ERR_SYSVOL_POPULATE_TIMEOUT 8014L\n#define FRS_ERR_SYSVOL_IS_BUSY 8015L\n#define FRS_ERR_SYSVOL_DEMOTE 8016L\n#define FRS_ERR_INVALID_SERVICE_PARAMETER 8017L\n#define DS_S_SUCCESS NO_ERROR\n#define ERROR_DS_NOT_INSTALLED 8200L\n#define ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY 8201L\n#define ERROR_DS_NO_ATTRIBUTE_OR_VALUE 8202L\n#define ERROR_DS_INVALID_ATTRIBUTE_SYNTAX 8203L\n#define ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED 8204L\n#define ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS 8205L\n#define ERROR_DS_BUSY 8206L\n#define ERROR_DS_UNAVAILABLE 8207L\n#define ERROR_DS_NO_RIDS_ALLOCATED 8208L\n#define ERROR_DS_NO_MORE_RIDS 8209L\n#define ERROR_DS_INCORRECT_ROLE_OWNER 8210L\n#define ERROR_DS_RIDMGR_INIT_ERROR 8211L\n#define ERROR_DS_OBJ_CLASS_VIOLATION 8212L\n#define ERROR_DS_CANT_ON_NON_LEAF 8213L\n#define ERROR_DS_CANT_ON_RDN 8214L\n#define ERROR_DS_CANT_MOD_OBJ_CLASS 8215L\n#define ERROR_DS_CROSS_DOM_MOVE_ERROR 8216L\n#define ERROR_DS_GC_NOT_AVAILABLE 8217L\n#define ERROR_SHARED_POLICY 8218L\n#define ERROR_POLICY_OBJECT_NOT_FOUND 8219L\n#define ERROR_POLICY_ONLY_IN_DS 8220L\n#define ERROR_PROMOTION_ACTIVE 8221L\n#define ERROR_NO_PROMOTION_ACTIVE 8222L\n#define ERROR_DS_OPERATIONS_ERROR 8224L\n#define ERROR_DS_PROTOCOL_ERROR 8225L\n#define ERROR_DS_TIMELIMIT_EXCEEDED 8226L\n#define ERROR_DS_SIZELIMIT_EXCEEDED 8227L\n#define ERROR_DS_ADMIN_LIMIT_EXCEEDED 8228L\n#define ERROR_DS_COMPARE_FALSE 8229L\n#define ERROR_DS_COMPARE_TRUE 8230L\n#define ERROR_DS_AUTH_METHOD_NOT_SUPPORTED 8231L\n#define ERROR_DS_STRONG_AUTH_REQUIRED 8232L\n#define ERROR_DS_INAPPROPRIATE_AUTH 8233L\n#define ERROR_DS_AUTH_UNKNOWN 8234L\n#define ERROR_DS_REFERRAL 8235L\n#define ERROR_DS_UNAVAILABLE_CRIT_EXTENSION 8236L\n#define ERROR_DS_CONFIDENTIALITY_REQUIRED 8237L\n#define ERROR_DS_INAPPROPRIATE_MATCHING 8238L\n#define ERROR_DS_CONSTRAINT_VIOLATION 8239L\n#define ERROR_DS_NO_SUCH_OBJECT 8240L\n#define ERROR_DS_ALIAS_PROBLEM 8241L\n#define ERROR_DS_INVALID_DN_SYNTAX 8242L\n#define ERROR_DS_IS_LEAF 8243L\n#define ERROR_DS_ALIAS_DEREF_PROBLEM 8244L\n#define ERROR_DS_UNWILLING_TO_PERFORM 8245L\n#define ERROR_DS_LOOP_DETECT 8246L\n#define ERROR_DS_NAMING_VIOLATION 8247L\n#define ERROR_DS_OBJECT_RESULTS_TOO_LARGE 8248L\n#define ERROR_DS_AFFECTS_MULTIPLE_DSAS 8249L\n#define ERROR_DS_SERVER_DOWN 8250L\n#define ERROR_DS_LOCAL_ERROR 8251L\n#define ERROR_DS_ENCODING_ERROR 8252L\n#define ERROR_DS_DECODING_ERROR 8253L\n#define ERROR_DS_FILTER_UNKNOWN 8254L\n#define ERROR_DS_PARAM_ERROR 8255L\n#define ERROR_DS_NOT_SUPPORTED 8256L\n#define ERROR_DS_NO_RESULTS_RETURNED 8257L\n#define ERROR_DS_CONTROL_NOT_FOUND 8258L\n#define ERROR_DS_CLIENT_LOOP 8259L\n#define ERROR_DS_REFERRAL_LIMIT_EXCEEDED 8260L\n#define ERROR_DS_SORT_CONTROL_MISSING 8261L\n#define ERROR_DS_OFFSET_RANGE_ERROR 8262L\n#define ERROR_DS_ROOT_MUST_BE_NC 8301L\n#define ERROR_DS_ADD_REPLICA_INHIBITED 8302L\n#define ERROR_DS_ATT_NOT_DEF_IN_SCHEMA 8303L\n#define ERROR_DS_MAX_OBJ_SIZE_EXCEEDED 8304L\n#define ERROR_DS_OBJ_STRING_NAME_EXISTS 8305L\n#define ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA 8306L\n#define ERROR_DS_RDN_DOESNT_MATCH_SCHEMA 8307L\n#define ERROR_DS_NO_REQUESTED_ATTS_FOUND 8308L\n#define ERROR_DS_USER_BUFFER_TO_SMALL 8309L\n#define ERROR_DS_ATT_IS_NOT_ON_OBJ 8310L\n#define ERROR_DS_ILLEGAL_MOD_OPERATION 8311L\n#define ERROR_DS_OBJ_TOO_LARGE 8312L\n#define ERROR_DS_BAD_INSTANCE_TYPE 8313L\n#define ERROR_DS_MASTERDSA_REQUIRED 8314L\n#define ERROR_DS_OBJECT_CLASS_REQUIRED 8315L\n#define ERROR_DS_MISSING_REQUIRED_ATT 8316L\n#define ERROR_DS_ATT_NOT_DEF_FOR_CLASS 8317L\n#define ERROR_DS_ATT_ALREADY_EXISTS 8318L\n#define ERROR_DS_CANT_ADD_ATT_VALUES 8320L\n#define ERROR_DS_SINGLE_VALUE_CONSTRAINT 8321L\n#define ERROR_DS_RANGE_CONSTRAINT 8322L\n#define ERROR_DS_ATT_VAL_ALREADY_EXISTS 8323L\n#define ERROR_DS_CANT_REM_MISSING_ATT 8324L\n#define ERROR_DS_CANT_REM_MISSING_ATT_VAL 8325L\n#define ERROR_DS_ROOT_CANT_BE_SUBREF 8326L\n#define ERROR_DS_NO_CHAINING 8327L\n#define ERROR_DS_NO_CHAINED_EVAL 8328L\n#define ERROR_DS_NO_PARENT_OBJECT 8329L\n#define ERROR_DS_PARENT_IS_AN_ALIAS 8330L\n#define ERROR_DS_CANT_MIX_MASTER_AND_REPS 8331L\n#define ERROR_DS_CHILDREN_EXIST 8332L\n#define ERROR_DS_OBJ_NOT_FOUND 8333L\n#define ERROR_DS_ALIASED_OBJ_MISSING 8334L\n#define ERROR_DS_BAD_NAME_SYNTAX 8335L\n#define ERROR_DS_ALIAS_POINTS_TO_ALIAS 8336L\n#define ERROR_DS_CANT_DEREF_ALIAS 8337L\n#define ERROR_DS_OUT_OF_SCOPE 8338L\n#define ERROR_DS_OBJECT_BEING_REMOVED 8339L\n#define ERROR_DS_CANT_DELETE_DSA_OBJ 8340L\n#define ERROR_DS_GENERIC_ERROR 8341L\n#define ERROR_DS_DSA_MUST_BE_INT_MASTER 8342L\n#define ERROR_DS_CLASS_NOT_DSA 8343L\n#define ERROR_DS_INSUFF_ACCESS_RIGHTS 8344L\n#define ERROR_DS_ILLEGAL_SUPERIOR 8345L\n#define ERROR_DS_ATTRIBUTE_OWNED_BY_SAM 8346L\n#define ERROR_DS_NAME_TOO_MANY_PARTS 8347L\n#define ERROR_DS_NAME_TOO_LONG 8348L\n#define ERROR_DS_NAME_VALUE_TOO_LONG 8349L\n#define ERROR_DS_NAME_UNPARSEABLE 8350L\n#define ERROR_DS_NAME_TYPE_UNKNOWN 8351L\n#define ERROR_DS_NOT_AN_OBJECT 8352L\n#define ERROR_DS_SEC_DESC_TOO_SHORT 8353L\n#define ERROR_DS_SEC_DESC_INVALID 8354L\n#define ERROR_DS_NO_DELETED_NAME 8355L\n#define ERROR_DS_SUBREF_MUST_HAVE_PARENT 8356L\n#define ERROR_DS_NCNAME_MUST_BE_NC 8357L\n#define ERROR_DS_CANT_ADD_SYSTEM_ONLY 8358L\n#define ERROR_DS_CLASS_MUST_BE_CONCRETE 8359L\n#define ERROR_DS_INVALID_DMD 8360L\n#define ERROR_DS_OBJ_GUID_EXISTS 8361L\n#define ERROR_DS_NOT_ON_BACKLINK 8362L\n#define ERROR_DS_NO_CROSSREF_FOR_NC 8363L\n#define ERROR_DS_SHUTTING_DOWN 8364L\n#define ERROR_DS_UNKNOWN_OPERATION 8365L\n#define ERROR_DS_INVALID_ROLE_OWNER 8366L\n#define ERROR_DS_COULDNT_CONTACT_FSMO 8367L\n#define ERROR_DS_CROSS_NC_DN_RENAME 8368L\n#define ERROR_DS_CANT_MOD_SYSTEM_ONLY 8369L\n#define ERROR_DS_REPLICATOR_ONLY 8370L\n#define ERROR_DS_OBJ_CLASS_NOT_DEFINED 8371L\n#define ERROR_DS_OBJ_CLASS_NOT_SUBCLASS 8372L\n#define ERROR_DS_NAME_REFERENCE_INVALID 8373L\n#define ERROR_DS_CROSS_REF_EXISTS 8374L\n#define ERROR_DS_CANT_DEL_MASTER_CROSSREF 8375L\n#define ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD 8376L\n#define ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX 8377L\n#define ERROR_DS_DUP_RDN 8378L\n#define ERROR_DS_DUP_OID 8379L\n#define ERROR_DS_DUP_MAPI_ID 8380L\n#define ERROR_DS_DUP_SCHEMA_ID_GUID 8381L\n#define ERROR_DS_DUP_LDAP_DISPLAY_NAME 8382L\n#define ERROR_DS_SEMANTIC_ATT_TEST 8383L\n#define ERROR_DS_SYNTAX_MISMATCH 8384L\n#define ERROR_DS_EXISTS_IN_MUST_HAVE 8385L\n#define ERROR_DS_EXISTS_IN_MAY_HAVE 8386L\n#define ERROR_DS_NONEXISTENT_MAY_HAVE 8387L\n#define ERROR_DS_NONEXISTENT_MUST_HAVE 8388L\n#define ERROR_DS_AUX_CLS_TEST_FAIL 8389L\n#define ERROR_DS_NONEXISTENT_POSS_SUP 8390L\n#define ERROR_DS_SUB_CLS_TEST_FAIL 8391L\n#define ERROR_DS_BAD_RDN_ATT_ID_SYNTAX 8392L\n#define ERROR_DS_EXISTS_IN_AUX_CLS 8393L\n#define ERROR_DS_EXISTS_IN_SUB_CLS 8394L\n#define ERROR_DS_EXISTS_IN_POSS_SUP 8395L\n#define ERROR_DS_RECALCSCHEMA_FAILED 8396L\n#define ERROR_DS_TREE_DELETE_NOT_FINISHED 8397L\n#define ERROR_DS_CANT_DELETE 8398L\n#define ERROR_DS_ATT_SCHEMA_REQ_ID 8399L\n#define ERROR_DS_BAD_ATT_SCHEMA_SYNTAX 8400L\n#define ERROR_DS_CANT_CACHE_ATT 8401L\n#define ERROR_DS_CANT_CACHE_CLASS 8402L\n#define ERROR_DS_CANT_REMOVE_ATT_CACHE 8403L\n#define ERROR_DS_CANT_REMOVE_CLASS_CACHE 8404L\n#define ERROR_DS_CANT_RETRIEVE_DN 8405L\n#define ERROR_DS_MISSING_SUPREF 8406L\n#define ERROR_DS_CANT_RETRIEVE_INSTANCE 8407L\n#define ERROR_DS_CODE_INCONSISTENCY 8408L\n#define ERROR_DS_DATABASE_ERROR 8409L\n#define ERROR_DS_GOVERNSID_MISSING 8410L\n#define ERROR_DS_MISSING_EXPECTED_ATT 8411L\n#define ERROR_DS_NCNAME_MISSING_CR_REF 8412L\n#define ERROR_DS_SECURITY_CHECKING_ERROR 8413L\n#define ERROR_DS_SCHEMA_NOT_LOADED 8414L\n#define ERROR_DS_SCHEMA_ALLOC_FAILED 8415L\n#define ERROR_DS_ATT_SCHEMA_REQ_SYNTAX 8416L\n#define ERROR_DS_GCVERIFY_ERROR 8417L\n#define ERROR_DS_DRA_SCHEMA_MISMATCH 8418L\n#define ERROR_DS_CANT_FIND_DSA_OBJ 8419L\n#define ERROR_DS_CANT_FIND_EXPECTED_NC 8420L\n#define ERROR_DS_CANT_FIND_NC_IN_CACHE 8421L\n#define ERROR_DS_CANT_RETRIEVE_CHILD 8422L\n#define ERROR_DS_SECURITY_ILLEGAL_MODIFY 8423L\n#define ERROR_DS_CANT_REPLACE_HIDDEN_REC 8424L\n#define ERROR_DS_BAD_HIERARCHY_FILE 8425L\n#define ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED 8426L\n#define ERROR_DS_CONFIG_PARAM_MISSING 8427L\n#define ERROR_DS_COUNTING_AB_INDICES_FAILED 8428L\n#define ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED 8429L\n#define ERROR_DS_INTERNAL_FAILURE 8430L\n#define ERROR_DS_UNKNOWN_ERROR 8431L\n#define ERROR_DS_ROOT_REQUIRES_CLASS_TOP 8432L\n#define ERROR_DS_REFUSING_FSMO_ROLES 8433L\n#define ERROR_DS_MISSING_FSMO_SETTINGS 8434L\n#define ERROR_DS_UNABLE_TO_SURRENDER_ROLES 8435L\n#define ERROR_DS_DRA_GENERIC 8436L\n#define ERROR_DS_DRA_INVALID_PARAMETER 8437L\n#define ERROR_DS_DRA_BUSY 8438L\n#define ERROR_DS_DRA_BAD_DN 8439L\n#define ERROR_DS_DRA_BAD_NC 8440L\n#define ERROR_DS_DRA_DN_EXISTS 8441L\n#define ERROR_DS_DRA_INTERNAL_ERROR 8442L\n#define ERROR_DS_DRA_INCONSISTENT_DIT 8443L\n#define ERROR_DS_DRA_CONNECTION_FAILED 8444L\n#define ERROR_DS_DRA_BAD_INSTANCE_TYPE 8445L\n#define ERROR_DS_DRA_OUT_OF_MEM 8446L\n#define ERROR_DS_DRA_MAIL_PROBLEM 8447L\n#define ERROR_DS_DRA_REF_ALREADY_EXISTS 8448L\n#define ERROR_DS_DRA_REF_NOT_FOUND 8449L\n#define ERROR_DS_DRA_OBJ_IS_REP_SOURCE 8450L\n#define ERROR_DS_DRA_DB_ERROR 8451L\n#define ERROR_DS_DRA_NO_REPLICA 8452L\n#define ERROR_DS_DRA_ACCESS_DENIED 8453L\n#define ERROR_DS_DRA_NOT_SUPPORTED 8454L\n#define ERROR_DS_DRA_RPC_CANCELLED 8455L\n#define ERROR_DS_DRA_SOURCE_DISABLED 8456L\n#define ERROR_DS_DRA_SINK_DISABLED 8457L\n#define ERROR_DS_DRA_NAME_COLLISION 8458L\n#define ERROR_DS_DRA_SOURCE_REINSTALLED 8459L\n#define ERROR_DS_DRA_MISSING_PARENT 8460L\n#define ERROR_DS_DRA_PREEMPTED 8461L\n#define ERROR_DS_DRA_ABANDON_SYNC 8462L\n#define ERROR_DS_DRA_SHUTDOWN 8463L\n#define ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET 8464L\n#define ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA 8465L\n#define ERROR_DS_DRA_EXTN_CONNECTION_FAILED 8466L\n#define ERROR_DS_INSTALL_SCHEMA_MISMATCH 8467L\n#define ERROR_DS_DUP_LINK_ID 8468L\n#define ERROR_DS_NAME_ERROR_RESOLVING 8469L\n#define ERROR_DS_NAME_ERROR_NOT_FOUND 8470L\n#define ERROR_DS_NAME_ERROR_NOT_UNIQUE 8471L\n#define ERROR_DS_NAME_ERROR_NO_MAPPING 8472L\n#define ERROR_DS_NAME_ERROR_DOMAIN_ONLY 8473L\n#define ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING 8474L\n#define ERROR_DS_CONSTRUCTED_ATT_MOD 8475L\n#define ERROR_DS_WRONG_OM_OBJ_CLASS 8476L\n#define ERROR_DS_DRA_REPL_PENDING 8477L\n#define ERROR_DS_DS_REQUIRED 8478L\n#define ERROR_DS_INVALID_LDAP_DISPLAY_NAME 8479L\n#define ERROR_DS_NON_BASE_SEARCH 8480L\n#define ERROR_DS_CANT_RETRIEVE_ATTS 8481L\n#define ERROR_DS_BACKLINK_WITHOUT_LINK 8482L\n#define ERROR_DS_EPOCH_MISMATCH 8483L\n#define ERROR_DS_SRC_NAME_MISMATCH 8484L\n#define ERROR_DS_SRC_AND_DST_NC_IDENTICAL 8485L\n#define ERROR_DS_DST_NC_MISMATCH 8486L\n#define ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC 8487L\n#define ERROR_DS_SRC_GUID_MISMATCH 8488L\n#define ERROR_DS_CANT_MOVE_DELETED_OBJECT 8489L\n#define ERROR_DS_PDC_OPERATION_IN_PROGRESS 8490L\n#define ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD 8491L\n#define ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION 8492L\n#define ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS 8493L\n#define ERROR_DS_NC_MUST_HAVE_NC_PARENT 8494L\n#define ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE 8495L\n#define ERROR_DS_DST_DOMAIN_NOT_NATIVE 8496L\n#define ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER 8497L\n#define ERROR_DS_CANT_MOVE_ACCOUNT_GROUP 8498L\n#define ERROR_DS_CANT_MOVE_RESOURCE_GROUP 8499L\n#define ERROR_DS_INVALID_SEARCH_FLAG 8500L\n#define ERROR_DS_NO_TREE_DELETE_ABOVE_NC 8501L\n#define ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE 8502L\n#define ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE 8503L\n#define ERROR_DS_SAM_INIT_FAILURE 8504L\n#define ERROR_DS_SENSITIVE_GROUP_VIOLATION 8505L\n#define ERROR_DS_CANT_MOD_PRIMARYGROUPID 8506L\n#define ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD 8507L\n#define ERROR_DS_NONSAFE_SCHEMA_CHANGE 8508L\n#define ERROR_DS_SCHEMA_UPDATE_DISALLOWED 8509L\n#define ERROR_DS_CANT_CREATE_UNDER_SCHEMA 8510L\n#define ERROR_DS_INSTALL_NO_SRC_SCH_VERSION 8511L\n#define ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE 8512L\n#define ERROR_DS_INVALID_GROUP_TYPE 8513L\n#define ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN 8514L\n#define ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN 8515L\n#define ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER 8516L\n#define ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER 8517L\n#define ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER 8518L\n#define ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER 8519L\n#define ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER 8520L\n#define ERROR_DS_HAVE_PRIMARY_MEMBERS 8521L\n#define ERROR_DS_STRING_SD_CONVERSION_FAILED 8522L\n#define ERROR_DS_NAMING_MASTER_GC 8523L\n#define ERROR_DS_DNS_LOOKUP_FAILURE 8524L\n#define ERROR_DS_COULDNT_UPDATE_SPNS 8525L\n#define ERROR_DS_CANT_RETRIEVE_SD 8526L\n#define ERROR_DS_KEY_NOT_UNIQUE 8527L\n#define ERROR_DS_WRONG_LINKED_ATT_SYNTAX 8528L\n#define ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD 8529L\n#define ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY 8530L\n#define ERROR_DS_CANT_START 8531L\n#define ERROR_DS_INIT_FAILURE 8532L\n#define ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION 8533L\n#define ERROR_DS_SOURCE_DOMAIN_IN_FOREST 8534L\n#define ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST 8535L\n#define ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED 8536L\n#define ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN 8537L\n#define ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER 8538L\n#define ERROR_DS_SRC_SID_EXISTS_IN_FOREST 8539L\n#define ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH 8540L\n#define ERROR_SAM_INIT_FAILURE 8541L\n#define ERROR_DS_DRA_SCHEMA_INFO_SHIP 8542L\n#define ERROR_DS_DRA_SCHEMA_CONFLICT 8543L\n#define ERROR_DS_DRA_EARLIER_SCHEMA_CONFLICT 8544L\n#define ERROR_DS_DRA_OBJ_NC_MISMATCH 8545L\n#define ERROR_DS_NC_STILL_HAS_DSAS 8546L\n#define ERROR_DS_GC_REQUIRED 8547L\n#define ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY 8548L\n#define ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS 8549L\n#define ERROR_DS_CANT_ADD_TO_GC 8550L\n#define ERROR_DS_NO_CHECKPOINT_WITH_PDC 8551L\n#define ERROR_DS_SOURCE_AUDITING_NOT_ENABLED 8552L\n#define ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC 8553L\n#define ERROR_DS_INVALID_NAME_FOR_SPN 8554L\n#define ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS 8555L\n#define ERROR_DS_UNICODEPWD_NOT_IN_QUOTES 8556L\n#define ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED 8557L\n#define ERROR_DS_MUST_BE_RUN_ON_DST_DC 8558L\n#define ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER 8559L\n#define ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ 8560L\n#define ERROR_DS_INIT_FAILURE_CONSOLE 8561L\n#define ERROR_DS_SAM_INIT_FAILURE_CONSOLE 8562L\n#define ERROR_DS_FOREST_VERSION_TOO_HIGH 8563L\n#define ERROR_DS_DOMAIN_VERSION_TOO_HIGH 8564L\n#define ERROR_DS_FOREST_VERSION_TOO_LOW 8565L\n#define ERROR_DS_DOMAIN_VERSION_TOO_LOW 8566L\n#define ERROR_DS_INCOMPATIBLE_VERSION 8567L\n#define ERROR_DS_LOW_DSA_VERSION 8568L\n#define ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN 8569L\n#define ERROR_DS_NOT_SUPPORTED_SORT_ORDER 8570L\n#define ERROR_DS_NAME_NOT_UNIQUE 8571L\n#define ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4 8572L\n#define ERROR_DS_OUT_OF_VERSION_STORE 8573L\n#define ERROR_DS_INCOMPATIBLE_CONTROLS_USED 8574L\n#define ERROR_DS_NO_REF_DOMAIN 8575L\n#define ERROR_DS_RESERVED_LINK_ID 8576L\n#define ERROR_DS_LINK_ID_NOT_AVAILABLE 8577L\n#define ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER 8578L\n#define ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE 8579L\n#define ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC 8580L\n#define ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG 8581L\n#define ERROR_DS_MODIFYDN_WRONG_GRANDPARENT 8582L\n#define ERROR_DS_NAME_ERROR_TRUST_REFERRAL 8583L\n#define ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER 8584L\n#define ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD 8585L\n#define ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE_V2 8586L\n#define ERROR_DS_THREAD_LIMIT_EXCEEDED 8587L\n#define ERROR_DS_NOT_CLOSEST 8588L\n#define ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF 8589L\n#define ERROR_DS_SINGLE_USER_MODE_FAILED 8590L\n#define ERROR_DS_NTDSCRIPT_SYNTAX_ERROR 8591L\n#define ERROR_DS_NTDSCRIPT_PROCESS_ERROR 8592L\n#define ERROR_DS_DIFFERENT_REPL_EPOCHS 8593L\n#define ERROR_DS_DRS_EXTENSIONS_CHANGED 8594L\n#define ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR 8595L\n#define ERROR_DS_NO_MSDS_INTID 8596L\n#define ERROR_DS_DUP_MSDS_INTID 8597L\n#define ERROR_DS_EXISTS_IN_RDNATTID 8598L\n#define ERROR_DS_AUTHORIZATION_FAILED 8599L\n#define ERROR_DS_INVALID_SCRIPT 8600L\n#define ERROR_DS_REMOTE_CROSSREF_OP_FAILED 8601L\n#define ERROR_DS_CROSS_REF_BUSY 8602L\n#define ERROR_DS_CANT_DERIVE_SPN_FOR_DELETED_DOMAIN 8603L\n#define ERROR_DS_CANT_DEMOTE_WITH_WRITEABLE_NC 8604L\n#define ERROR_DS_DUPLICATE_ID_FOUND 8605L\n#define ERROR_DS_INSUFFICIENT_ATTR_TO_CREATE_OBJECT 8606L\n#define ERROR_DS_GROUP_CONVERSION_ERROR 8607L\n#define ERROR_DS_CANT_MOVE_APP_BASIC_GROUP 8608L\n#define ERROR_DS_CANT_MOVE_APP_QUERY_GROUP 8609L\n#define ERROR_DS_ROLE_NOT_VERIFIED 8610L\n#define ERROR_DS_WKO_CONTAINER_CANNOT_BE_SPECIAL 8611L\n#define ERROR_DS_DOMAIN_RENAME_IN_PROGRESS 8612L\n#define ERROR_DS_EXISTING_AD_CHILD_NC 8613L\n#define ERROR_DS_REPL_LIFETIME_EXCEEDED 8614L\n#define ERROR_DS_DISALLOWED_IN_SYSTEM_CONTAINER 8615L\n#define ERROR_DS_LDAP_SEND_QUEUE_FULL 8616L\n#define ERROR_DS_DRA_OUT_SCHEDULE_WINDOW 8617L\n#define DNS_ERROR_RESPONSE_CODES_BASE 9000\n#define DNS_ERROR_RCODE_NO_ERROR NO_ERROR\n#define DNS_ERROR_MASK 0x00002328\n#define DNS_ERROR_RCODE_FORMAT_ERROR 9001L\n#define DNS_ERROR_RCODE_SERVER_FAILURE 9002L\n#define DNS_ERROR_RCODE_NAME_ERROR 9003L\n#define DNS_ERROR_RCODE_NOT_IMPLEMENTED 9004L\n#define DNS_ERROR_RCODE_REFUSED 9005L\n#define DNS_ERROR_RCODE_YXDOMAIN 9006L\n#define DNS_ERROR_RCODE_YXRRSET 9007L\n#define DNS_ERROR_RCODE_NXRRSET 9008L\n#define DNS_ERROR_RCODE_NOTAUTH 9009L\n#define DNS_ERROR_RCODE_NOTZONE 9010L\n#define DNS_ERROR_RCODE_BADSIG 9016L\n#define DNS_ERROR_RCODE_BADKEY 9017L\n#define DNS_ERROR_RCODE_BADTIME 9018L\n#define DNS_ERROR_RCODE_LAST DNS_ERROR_RCODE_BADTIME\n#define DNS_ERROR_PACKET_FMT_BASE 9500\n#define DNS_INFO_NO_RECORDS 9501L\n#define DNS_ERROR_BAD_PACKET 9502L\n#define DNS_ERROR_NO_PACKET 9503L\n#define DNS_ERROR_RCODE 9504L\n#define DNS_ERROR_UNSECURE_PACKET 9505L\n#define DNS_STATUS_PACKET_UNSECURE DNS_ERROR_UNSECURE_PACKET\n#define DNS_ERROR_NO_MEMORY ERROR_OUTOFMEMORY\n#define DNS_ERROR_INVALID_NAME ERROR_INVALID_NAME\n#define DNS_ERROR_INVALID_DATA ERROR_INVALID_DATA\n#define DNS_ERROR_GENERAL_API_BASE 9550\n#define DNS_ERROR_INVALID_TYPE 9551L\n#define DNS_ERROR_INVALID_IP_ADDRESS 9552L\n#define DNS_ERROR_INVALID_PROPERTY 9553L\n#define DNS_ERROR_TRY_AGAIN_LATER 9554L\n#define DNS_ERROR_NOT_UNIQUE 9555L\n#define DNS_ERROR_NON_RFC_NAME 9556L\n#define DNS_STATUS_FQDN 9557L\n#define DNS_STATUS_DOTTED_NAME 9558L\n#define DNS_STATUS_SINGLE_PART_NAME 9559L\n#define DNS_ERROR_INVALID_NAME_CHAR 9560L\n#define DNS_ERROR_NUMERIC_NAME 9561L\n#define DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER 9562L\n#define DNS_ERROR_NOT_ALLOWED_UNDER_DELEGATION 9563L\n#define DNS_ERROR_CANNOT_FIND_ROOT_HINTS 9564L\n#define DNS_ERROR_INCONSISTENT_ROOT_HINTS 9565L\n#define DNS_ERROR_ZONE_BASE 9600\n#define DNS_ERROR_ZONE_DOES_NOT_EXIST 9601L\n#define DNS_ERROR_NO_ZONE_INFO 9602L\n#define DNS_ERROR_INVALID_ZONE_OPERATION 9603L\n#define DNS_ERROR_ZONE_CONFIGURATION_ERROR 9604L\n#define DNS_ERROR_ZONE_HAS_NO_SOA_RECORD 9605L\n#define DNS_ERROR_ZONE_HAS_NO_NS_RECORDS 9606L\n#define DNS_ERROR_ZONE_LOCKED 9607L\n#define DNS_ERROR_ZONE_CREATION_FAILED 9608L\n#define DNS_ERROR_ZONE_ALREADY_EXISTS 9609L\n#define DNS_ERROR_AUTOZONE_ALREADY_EXISTS 9610L\n#define DNS_ERROR_INVALID_ZONE_TYPE 9611L\n#define DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP 9612L\n#define DNS_ERROR_ZONE_NOT_SECONDARY 9613L\n#define DNS_ERROR_NEED_SECONDARY_ADDRESSES 9614L\n#define DNS_ERROR_WINS_INIT_FAILED 9615L\n#define DNS_ERROR_NEED_WINS_SERVERS 9616L\n#define DNS_ERROR_NBSTAT_INIT_FAILED 9617L\n#define DNS_ERROR_SOA_DELETE_INVALID 9618L\n#define DNS_ERROR_FORWARDER_ALREADY_EXISTS 9619L\n#define DNS_ERROR_ZONE_REQUIRES_MASTER_IP 9620L\n#define DNS_ERROR_ZONE_IS_SHUTDOWN 9621L\n#define DNS_ERROR_DATAFILE_BASE 9650\n#define DNS_ERROR_PRIMARY_REQUIRES_DATAFILE 9651L\n#define DNS_ERROR_INVALID_DATAFILE_NAME 9652L\n#define DNS_ERROR_DATAFILE_OPEN_FAILURE 9653L\n#define DNS_ERROR_FILE_WRITEBACK_FAILED 9654L\n#define DNS_ERROR_DATAFILE_PARSING 9655L\n#define DNS_ERROR_DATABASE_BASE 9700\n#define DNS_ERROR_RECORD_DOES_NOT_EXIST 9701L\n#define DNS_ERROR_RECORD_FORMAT 9702L\n#define DNS_ERROR_NODE_CREATION_FAILED 9703L\n#define DNS_ERROR_UNKNOWN_RECORD_TYPE 9704L\n#define DNS_ERROR_RECORD_TIMED_OUT 9705L\n#define DNS_ERROR_NAME_NOT_IN_ZONE 9706L\n#define DNS_ERROR_CNAME_LOOP 9707L\n#define DNS_ERROR_NODE_IS_CNAME 9708L\n#define DNS_ERROR_CNAME_COLLISION 9709L\n#define DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT 9710L\n#define DNS_ERROR_RECORD_ALREADY_EXISTS 9711L\n#define DNS_ERROR_SECONDARY_DATA 9712L\n#define DNS_ERROR_NO_CREATE_CACHE_DATA 9713L\n#define DNS_ERROR_NAME_DOES_NOT_EXIST 9714L\n#define DNS_WARNING_PTR_CREATE_FAILED 9715L\n#define DNS_WARNING_DOMAIN_UNDELETED 9716L\n#define DNS_ERROR_DS_UNAVAILABLE 9717L\n#define DNS_ERROR_DS_ZONE_ALREADY_EXISTS 9718L\n#define DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE 9719L\n#define DNS_ERROR_OPERATION_BASE 9750\n#define DNS_INFO_AXFR_COMPLETE 9751L\n#define DNS_ERROR_AXFR 9752L\n#define DNS_INFO_ADDED_LOCAL_WINS 9753L\n#define DNS_ERROR_SECURE_BASE 9800\n#define DNS_STATUS_CONTINUE_NEEDED 9801L\n#define DNS_ERROR_SETUP_BASE 9850\n#define DNS_ERROR_NO_TCPIP 9851L\n#define DNS_ERROR_NO_DNS_SERVERS 9852L\n#define DNS_ERROR_DP_BASE 9900\n#define DNS_ERROR_DP_DOES_NOT_EXIST 9901L\n#define DNS_ERROR_DP_ALREADY_EXISTS 9902L\n#define DNS_ERROR_DP_NOT_ENLISTED 9903L\n#define DNS_ERROR_DP_ALREADY_ENLISTED 9904L\n#define DNS_ERROR_DP_NOT_AVAILABLE 9905L\n#define DNS_ERROR_DP_FSMO_ERROR 9906L\n\n#ifndef WSABASEERR\n#define WSABASEERR 10000\n#define WSAEINTR 10004L\n#define WSAEBADF 10009L\n#define WSAEACCES 10013L\n#define WSAEFAULT 10014L\n#define WSAEINVAL 10022L\n#define WSAEMFILE 10024L\n#define WSAEWOULDBLOCK 10035L\n#define WSAEINPROGRESS 10036L\n#define WSAEALREADY 10037L\n#define WSAENOTSOCK 10038L\n#define WSAEDESTADDRREQ 10039L\n#define WSAEMSGSIZE 10040L\n#define WSAEPROTOTYPE 10041L\n#define WSAENOPROTOOPT 10042L\n#define WSAEPROTONOSUPPORT 10043L\n#define WSAESOCKTNOSUPPORT 10044L\n#define WSAEOPNOTSUPP 10045L\n#define WSAEPFNOSUPPORT 10046L\n#define WSAEAFNOSUPPORT 10047L\n#define WSAEADDRINUSE 10048L\n#define WSAEADDRNOTAVAIL 10049L\n#define WSAENETDOWN 10050L\n#define WSAENETUNREACH 10051L\n#define WSAENETRESET 10052L\n#define WSAECONNABORTED 10053L\n#define WSAECONNRESET 10054L\n#define WSAENOBUFS 10055L\n#define WSAEISCONN 10056L\n#define WSAENOTCONN 10057L\n#define WSAESHUTDOWN 10058L\n#define WSAETOOMANYREFS 10059L\n#define WSAETIMEDOUT 10060L\n#define WSAECONNREFUSED 10061L\n#define WSAELOOP 10062L\n#define WSAENAMETOOLONG 10063L\n#define WSAEHOSTDOWN 10064L\n#define WSAEHOSTUNREACH 10065L\n#define WSAENOTEMPTY 10066L\n#define WSAEPROCLIM 10067L\n#define WSAEUSERS 10068L\n#define WSAEDQUOT 10069L\n#define WSAESTALE 10070L\n#define WSAEREMOTE 10071L\n#define WSASYSNOTREADY 10091L\n#define WSAVERNOTSUPPORTED 10092L\n#define WSANOTINITIALISED 10093L\n#define WSAEDISCON 10101L\n#define WSAENOMORE 10102L\n#define WSAECANCELLED 10103L\n#define WSAEINVALIDPROCTABLE 10104L\n#define WSAEINVALIDPROVIDER 10105L\n#define WSAEPROVIDERFAILEDINIT 10106L\n#define WSASYSCALLFAILURE 10107L\n#define WSASERVICE_NOT_FOUND 10108L\n#define WSATYPE_NOT_FOUND 10109L\n#define WSA_E_NO_MORE 10110L\n#define WSA_E_CANCELLED 10111L\n#define WSAEREFUSED 10112L\n#ifndef WSAHOST_NOT_FOUND\n#define WSAHOST_NOT_FOUND 11001L\n#endif\n#ifndef WSATRY_AGAIN\n#define WSATRY_AGAIN 11002L\n#endif\n#ifndef WSANO_RECOVERY\n#define WSANO_RECOVERY 11003L\n#endif\n#ifndef WSANO_DATA\n#define WSANO_DATA 11004L\n#endif\n#ifndef WSA_QOS_RECEIVERS\n#define WSA_QOS_RECEIVERS 11005L\n#endif\n#ifndef WSA_QOS_SENDERS\n#define WSA_QOS_SENDERS 11006L\n#endif\n#ifndef WSA_QOS_NO_SENDERS\n#define WSA_QOS_NO_SENDERS 11007L\n#endif\n#ifndef WSA_QOS_NO_RECEIVERS\n#define WSA_QOS_NO_RECEIVERS 11008L\n#endif\n#ifndef WSA_QOS_REQUEST_CONFIRMED\n#define WSA_QOS_REQUEST_CONFIRMED 11009L\n#endif\n#ifndef WSA_QOS_ADMISSION_FAILURE\n#define WSA_QOS_ADMISSION_FAILURE 11010L\n#endif\n#ifndef WSA_QOS_POLICY_FAILURE\n#define WSA_QOS_POLICY_FAILURE 11011L\n#endif\n#ifndef WSA_QOS_BAD_STYLE\n#define WSA_QOS_BAD_STYLE 11012L\n#endif\n#ifndef WSA_QOS_BAD_OBJECT\n#define WSA_QOS_BAD_OBJECT 11013L\n#endif\n#ifndef WSA_QOS_TRAFFIC_CTRL_ERROR\n#define WSA_QOS_TRAFFIC_CTRL_ERROR 11014L\n#endif\n#ifndef WSA_QOS_GENERIC_ERROR\n#define WSA_QOS_GENERIC_ERROR 11015L\n#endif\n#ifndef WSA_QOS_ESERVICETYPE\n#define WSA_QOS_ESERVICETYPE 11016L\n#endif\n#ifndef WSA_QOS_EFLOWSPEC\n#define WSA_QOS_EFLOWSPEC 11017L\n#endif\n#ifndef WSA_QOS_EPROVSPECBUF\n#define WSA_QOS_EPROVSPECBUF 11018L\n#endif\n#ifndef WSA_QOS_EFILTERSTYLE\n#define WSA_QOS_EFILTERSTYLE 11019L\n#endif\n#ifndef WSA_QOS_EFILTERTYPE\n#define WSA_QOS_EFILTERTYPE 11020L\n#endif\n#ifndef WSA_QOS_EFILTERCOUNT\n#define WSA_QOS_EFILTERCOUNT 11021L\n#endif\n#ifndef WSA_QOS_EOBJLENGTH\n#define WSA_QOS_EOBJLENGTH 11022L\n#endif\n#ifndef WSA_QOS_EFLOWCOUNT\n#define WSA_QOS_EFLOWCOUNT 11023L\n#endif\n#ifndef WSA_QOS_EUNKNOWNPSOBJ\n#define WSA_QOS_EUNKNOWNPSOBJ 11024L\n#endif\n#ifndef WSA_QOS_EPOLICYOBJ\n#define WSA_QOS_EPOLICYOBJ 11025L\n#endif\n#ifndef WSA_QOS_EFLOWDESC\n#define WSA_QOS_EFLOWDESC 11026L\n#endif\n#ifndef WSA_QOS_EPSFLOWSPEC\n#define WSA_QOS_EPSFLOWSPEC 11027L\n#endif\n#ifndef WSA_QOS_EPSFILTERSPEC\n#define WSA_QOS_EPSFILTERSPEC 11028L\n#endif\n#ifndef WSA_QOS_ESDMODEOBJ\n#define WSA_QOS_ESDMODEOBJ 11029L\n#endif\n#ifndef WSA_QOS_ESHAPERATEOBJ\n#define WSA_QOS_ESHAPERATEOBJ 11030L\n#endif\n#ifndef WSA_QOS_RESERVED_PETYPE\n#define WSA_QOS_RESERVED_PETYPE 11031L\n#endif\n#endif // WSABASEERR\n\n#define ERROR_SXS_SECTION_NOT_FOUND 14000L\n#define ERROR_SXS_CANT_GEN_ACTCTX 14001L\n#define ERROR_SXS_INVALID_ACTCTXDATA_FORMAT 14002L\n#define ERROR_SXS_ASSEMBLY_NOT_FOUND 14003L\n#define ERROR_SXS_MANIFEST_FORMAT_ERROR 14004L\n#define ERROR_SXS_MANIFEST_PARSE_ERROR 14005L\n#define ERROR_SXS_ACTIVATION_CONTEXT_DISABLED 14006L\n#define ERROR_SXS_KEY_NOT_FOUND 14007L\n#define ERROR_SXS_VERSION_CONFLICT 14008L\n#define ERROR_SXS_WRONG_SECTION_TYPE 14009L\n#define ERROR_SXS_THREAD_QUERIES_DISABLED 14010L\n#define ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET 14011L\n#define ERROR_SXS_UNKNOWN_ENCODING_GROUP 14012L\n#define ERROR_SXS_UNKNOWN_ENCODING 14013L\n#define ERROR_SXS_INVALID_XML_NAMESPACE_URI 14014L\n#define ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED 14015L\n#define ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED 14016L\n#define ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE 14017L\n#define ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE 14018L\n#define ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE 14019L\n#define ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT 14020L\n#define ERROR_SXS_DUPLICATE_DLL_NAME 14021L\n#define ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME 14022L\n#define ERROR_SXS_DUPLICATE_CLSID 14023L\n#define ERROR_SXS_DUPLICATE_IID 14024L\n#define ERROR_SXS_DUPLICATE_TLBID 14025L\n#define ERROR_SXS_DUPLICATE_PROGID 14026L\n#define ERROR_SXS_DUPLICATE_ASSEMBLY_NAME 14027L\n#define ERROR_SXS_FILE_HASH_MISMATCH 14028L\n#define ERROR_SXS_POLICY_PARSE_ERROR 14029L\n#define ERROR_SXS_XML_E_MISSINGQUOTE 14030L\n#define ERROR_SXS_XML_E_COMMENTSYNTAX 14031L\n#define ERROR_SXS_XML_E_BADSTARTNAMECHAR 14032L\n#define ERROR_SXS_XML_E_BADNAMECHAR 14033L\n#define ERROR_SXS_XML_E_BADCHARINSTRING 14034L\n#define ERROR_SXS_XML_E_XMLDECLSYNTAX 14035L\n#define ERROR_SXS_XML_E_BADCHARDATA 14036L\n#define ERROR_SXS_XML_E_MISSINGWHITESPACE 14037L\n#define ERROR_SXS_XML_E_EXPECTINGTAGEND 14038L\n#define ERROR_SXS_XML_E_MISSINGSEMICOLON 14039L\n#define ERROR_SXS_XML_E_UNBALANCEDPAREN 14040L\n#define ERROR_SXS_XML_E_INTERNALERROR 14041L\n#define ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE 14042L\n#define ERROR_SXS_XML_E_INCOMPLETE_ENCODING 14043L\n#define ERROR_SXS_XML_E_MISSING_PAREN 14044L\n#define ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE 14045L\n#define ERROR_SXS_XML_E_MULTIPLE_COLONS 14046L\n#define ERROR_SXS_XML_E_INVALID_DECIMAL 14047L\n#define ERROR_SXS_XML_E_INVALID_HEXIDECIMAL 14048L\n#define ERROR_SXS_XML_E_INVALID_UNICODE 14049L\n#define ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK 14050L\n#define ERROR_SXS_XML_E_UNEXPECTEDENDTAG 14051L\n#define ERROR_SXS_XML_E_UNCLOSEDTAG 14052L\n#define ERROR_SXS_XML_E_DUPLICATEATTRIBUTE 14053L\n#define ERROR_SXS_XML_E_MULTIPLEROOTS 14054L\n#define ERROR_SXS_XML_E_INVALIDATROOTLEVEL 14055L\n#define ERROR_SXS_XML_E_BADXMLDECL 14056L\n#define ERROR_SXS_XML_E_MISSINGROOT 14057L\n#define ERROR_SXS_XML_E_UNEXPECTEDEOF 14058L\n#define ERROR_SXS_XML_E_BADPEREFINSUBSET 14059L\n#define ERROR_SXS_XML_E_UNCLOSEDSTARTTAG 14060L\n#define ERROR_SXS_XML_E_UNCLOSEDENDTAG 14061L\n#define ERROR_SXS_XML_E_UNCLOSEDSTRING 14062L\n#define ERROR_SXS_XML_E_UNCLOSEDCOMMENT 14063L\n#define ERROR_SXS_XML_E_UNCLOSEDDECL 14064L\n#define ERROR_SXS_XML_E_UNCLOSEDCDATA 14065L\n#define ERROR_SXS_XML_E_RESERVEDNAMESPACE 14066L\n#define ERROR_SXS_XML_E_INVALIDENCODING 14067L\n#define ERROR_SXS_XML_E_INVALIDSWITCH 14068L\n#define ERROR_SXS_XML_E_BADXMLCASE 14069L\n#define ERROR_SXS_XML_E_INVALID_STANDALONE 14070L\n#define ERROR_SXS_XML_E_UNEXPECTED_STANDALONE 14071L\n#define ERROR_SXS_XML_E_INVALID_VERSION 14072L\n#define ERROR_SXS_XML_E_MISSINGEQUALS 14073L\n#define ERROR_SXS_PROTECTION_RECOVERY_FAILED 14074L\n#define ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT 14075L\n#define ERROR_SXS_PROTECTION_CATALOG_NOT_VALID 14076L\n#define ERROR_SXS_UNTRANSLATABLE_HRESULT 14077L\n#define ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING 14078L\n#define ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE 14079L\n#define ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME 14080L\n#define ERROR_IPSEC_QM_POLICY_EXISTS 13000L\n#define ERROR_IPSEC_QM_POLICY_NOT_FOUND 13001L\n#define ERROR_IPSEC_QM_POLICY_IN_USE 13002L\n#define ERROR_IPSEC_MM_POLICY_EXISTS 13003L\n#define ERROR_IPSEC_MM_POLICY_NOT_FOUND 13004L\n#define ERROR_IPSEC_MM_POLICY_IN_USE 13005L\n#define ERROR_IPSEC_MM_FILTER_EXISTS 13006L\n#define ERROR_IPSEC_MM_FILTER_NOT_FOUND 13007L\n#define ERROR_IPSEC_TRANSPORT_FILTER_EXISTS 13008L\n#define ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND 13009L\n#define ERROR_IPSEC_MM_AUTH_EXISTS 13010L\n#define ERROR_IPSEC_MM_AUTH_NOT_FOUND 13011L\n#define ERROR_IPSEC_MM_AUTH_IN_USE 13012L\n#define ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND 13013L\n#define ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND 13014L\n#define ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND 13015L\n#define ERROR_IPSEC_TUNNEL_FILTER_EXISTS 13016L\n#define ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND 13017L\n#define ERROR_IPSEC_MM_FILTER_PENDING_DELETION 13018L\n#define ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION 13019L\n#define ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION 13020L\n#define ERROR_IPSEC_MM_POLICY_PENDING_DELETION 13021L\n#define ERROR_IPSEC_MM_AUTH_PENDING_DELETION 13022L\n#define ERROR_IPSEC_QM_POLICY_PENDING_DELETION 13023L\n#define WARNING_IPSEC_MM_POLICY_PRUNED 13024L\n#define WARNING_IPSEC_QM_POLICY_PRUNED 13025L\n#define ERROR_IPSEC_IKE_NEG_STATUS_BEGIN 13800L\n#define ERROR_IPSEC_IKE_AUTH_FAIL 13801L\n#define ERROR_IPSEC_IKE_ATTRIB_FAIL 13802L\n#define ERROR_IPSEC_IKE_NEGOTIATION_PENDING 13803L\n#define ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR 13804L\n#define ERROR_IPSEC_IKE_TIMED_OUT 13805L\n#define ERROR_IPSEC_IKE_NO_CERT 13806L\n#define ERROR_IPSEC_IKE_SA_DELETED 13807L\n#define ERROR_IPSEC_IKE_SA_REAPED 13808L\n#define ERROR_IPSEC_IKE_MM_ACQUIRE_DROP 13809L\n#define ERROR_IPSEC_IKE_QM_ACQUIRE_DROP 13810L\n#define ERROR_IPSEC_IKE_QUEUE_DROP_MM 13811L\n#define ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM 13812L\n#define ERROR_IPSEC_IKE_DROP_NO_RESPONSE 13813L\n#define ERROR_IPSEC_IKE_MM_DELAY_DROP 13814L\n#define ERROR_IPSEC_IKE_QM_DELAY_DROP 13815L\n#define ERROR_IPSEC_IKE_ERROR 13816L\n#define ERROR_IPSEC_IKE_CRL_FAILED 13817L\n#define ERROR_IPSEC_IKE_INVALID_KEY_USAGE 13818L\n#define ERROR_IPSEC_IKE_INVALID_CERT_TYPE 13819L\n#define ERROR_IPSEC_IKE_NO_PRIVATE_KEY 13820L\n#define ERROR_IPSEC_IKE_DH_FAIL 13822L\n#define ERROR_IPSEC_IKE_INVALID_HEADER 13824L\n#define ERROR_IPSEC_IKE_NO_POLICY 13825L\n#define ERROR_IPSEC_IKE_INVALID_SIGNATURE 13826L\n#define ERROR_IPSEC_IKE_KERBEROS_ERROR 13827L\n#define ERROR_IPSEC_IKE_NO_PUBLIC_KEY 13828L\n#define ERROR_IPSEC_IKE_PROCESS_ERR 13829L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_SA 13830L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_PROP 13831L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_TRANS 13832L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_KE 13833L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_ID 13834L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_CERT 13835L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ 13836L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_HASH 13837L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_SIG 13838L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_NONCE 13839L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY 13840L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_DELETE 13841L\n#define ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR 13842L\n#define ERROR_IPSEC_IKE_INVALID_PAYLOAD 13843L\n#define ERROR_IPSEC_IKE_LOAD_SOFT_SA 13844L\n#define ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN 13845L\n#define ERROR_IPSEC_IKE_INVALID_COOKIE 13846L\n#define ERROR_IPSEC_IKE_NO_PEER_CERT 13847L\n#define ERROR_IPSEC_IKE_PEER_CRL_FAILED 13848L\n#define ERROR_IPSEC_IKE_POLICY_CHANGE 13849L\n#define ERROR_IPSEC_IKE_NO_MM_POLICY 13850L\n#define ERROR_IPSEC_IKE_NOTCBPRIV 13851L\n#define ERROR_IPSEC_IKE_SECLOADFAIL 13852L\n#define ERROR_IPSEC_IKE_FAILSSPINIT 13853L\n#define ERROR_IPSEC_IKE_FAILQUERYSSP 13854L\n#define ERROR_IPSEC_IKE_SRVACQFAIL 13855L\n#define ERROR_IPSEC_IKE_SRVQUERYCRED 13856L\n#define ERROR_IPSEC_IKE_GETSPIFAIL 13857L\n#define ERROR_IPSEC_IKE_INVALID_FILTER 13858L\n#define ERROR_IPSEC_IKE_OUT_OF_MEMORY 13859L\n#define ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED 13860L\n#define ERROR_IPSEC_IKE_INVALID_POLICY 13861L\n#define ERROR_IPSEC_IKE_UNKNOWN_DOI 13862L\n#define ERROR_IPSEC_IKE_INVALID_SITUATION 13863L\n#define ERROR_IPSEC_IKE_DH_FAILURE 13864L\n#define ERROR_IPSEC_IKE_INVALID_GROUP 13865L\n#define ERROR_IPSEC_IKE_ENCRYPT 13866L\n#define ERROR_IPSEC_IKE_DECRYPT 13867L\n#define ERROR_IPSEC_IKE_POLICY_MATCH 13868L\n#define ERROR_IPSEC_IKE_UNSUPPORTED_ID 13869L\n#define ERROR_IPSEC_IKE_INVALID_HASH 13870L\n#define ERROR_IPSEC_IKE_INVALID_HASH_ALG 13871L\n#define ERROR_IPSEC_IKE_INVALID_HASH_SIZE 13872L\n#define ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG 13873L\n#define ERROR_IPSEC_IKE_INVALID_AUTH_ALG 13874L\n#define ERROR_IPSEC_IKE_INVALID_SIG 13875L\n#define ERROR_IPSEC_IKE_LOAD_FAILED 13876L\n#define ERROR_IPSEC_IKE_RPC_DELETE 13877L\n#define ERROR_IPSEC_IKE_BENIGN_REINIT 13878L\n#define ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY 13879L\n#define ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN 13881L\n#define ERROR_IPSEC_IKE_MM_LIMIT 13882L\n#define ERROR_IPSEC_IKE_NEGOTIATION_DISABLED 13883L\n#define ERROR_IPSEC_IKE_NEG_STATUS_END 13884L\n#define SEVERITY_SUCCESS 0\n#define SEVERITY_ERROR 1\n#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)\n#define FAILED(hr) ((HRESULT)(hr) < 0)\n#define IS_ERROR(Status) ((unsigned long)(Status) >> 31==SEVERITY_ERROR)\n#define HRESULT_CODE(hr) ((hr) & 0xFFFF)\n#define SCODE_CODE(sc) ((sc) & 0xFFFF)\n#define HRESULT_FACILITY(hr) (((hr) >> 16) & 0x1fff)\n#define SCODE_FACILITY(sc) (((sc) >> 16) & 0x1fff)\n#define HRESULT_SEVERITY(hr) (((hr) >> 31) & 0x1)\n#define SCODE_SEVERITY(sc) (((sc) >> 31) & 0x1)\n#define MAKE_HRESULT(sev,fac,code) ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))))\n#define MAKE_SCODE(sev,fac,code) ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))))\n#define FACILITY_NT_BIT 0x10000000\n#define __HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))\n#ifdef INLINE_HRESULT_FROM_WIN32\n#ifndef _HRESULT_DEFINED\n#define _HRESULT_DEFINED\ntypedef long HRESULT;\n#endif\n__CRT_INLINE HRESULT HRESULT_FROM_WIN32(long x) { return x <= 0 ? (HRESULT)x : (HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000);}\n#else\n#define HRESULT_FROM_WIN32(x) __HRESULT_FROM_WIN32(x)\n#endif\n#define HRESULT_FROM_NT(x) ((HRESULT) ((x) | FACILITY_NT_BIT))\n#define GetScode(hr) ((SCODE) (hr))\n#define ResultFromScode(sc) ((HRESULT) (sc))\n#define PropagateResult(hrPrevious,scBase) ((HRESULT) scBase)\n#ifdef RC_INVOKED\n#define _HRESULT_TYPEDEF_(_sc) _sc\n#else\n#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)\n#endif\n#define NOERROR 0\n#define E_UNEXPECTED _HRESULT_TYPEDEF_(0x8000FFFFL)\n#define E_NOTIMPL _HRESULT_TYPEDEF_(0x80004001L)\n#define E_OUTOFMEMORY _HRESULT_TYPEDEF_(0x8007000EL)\n#define E_INVALIDARG _HRESULT_TYPEDEF_(0x80070057L)\n#define E_NOINTERFACE _HRESULT_TYPEDEF_(0x80004002L)\n#define E_POINTER _HRESULT_TYPEDEF_(0x80004003L)\n#define E_HANDLE _HRESULT_TYPEDEF_(0x80070006L)\n#define E_ABORT _HRESULT_TYPEDEF_(0x80004004L)\n#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)\n#define E_ACCESSDENIED _HRESULT_TYPEDEF_(0x80070005L)\n#define E_PENDING _HRESULT_TYPEDEF_(0x8000000AL)\n#define CO_E_INIT_TLS _HRESULT_TYPEDEF_(0x80004006L)\n#define CO_E_INIT_SHARED_ALLOCATOR _HRESULT_TYPEDEF_(0x80004007L)\n#define CO_E_INIT_MEMORY_ALLOCATOR _HRESULT_TYPEDEF_(0x80004008L)\n#define CO_E_INIT_CLASS_CACHE _HRESULT_TYPEDEF_(0x80004009L)\n#define CO_E_INIT_RPC_CHANNEL _HRESULT_TYPEDEF_(0x8000400AL)\n#define CO_E_INIT_TLS_SET_CHANNEL_CONTROL _HRESULT_TYPEDEF_(0x8000400BL)\n#define CO_E_INIT_TLS_CHANNEL_CONTROL _HRESULT_TYPEDEF_(0x8000400CL)\n#define CO_E_INIT_UNACCEPTED_USER_ALLOCATOR _HRESULT_TYPEDEF_(0x8000400DL)\n#define CO_E_INIT_SCM_MUTEX_EXISTS _HRESULT_TYPEDEF_(0x8000400EL)\n#define CO_E_INIT_SCM_FILE_MAPPING_EXISTS _HRESULT_TYPEDEF_(0x8000400FL)\n#define CO_E_INIT_SCM_MAP_VIEW_OF_FILE _HRESULT_TYPEDEF_(0x80004010L)\n#define CO_E_INIT_SCM_EXEC_FAILURE _HRESULT_TYPEDEF_(0x80004011L)\n#define CO_E_INIT_ONLY_SINGLE_THREADED _HRESULT_TYPEDEF_(0x80004012L)\n#define CO_E_CANT_REMOTE _HRESULT_TYPEDEF_(0x80004013L)\n#define CO_E_BAD_SERVER_NAME _HRESULT_TYPEDEF_(0x80004014L)\n#define CO_E_WRONG_SERVER_IDENTITY _HRESULT_TYPEDEF_(0x80004015L)\n#define CO_E_OLE1DDE_DISABLED _HRESULT_TYPEDEF_(0x80004016L)\n#define CO_E_RUNAS_SYNTAX _HRESULT_TYPEDEF_(0x80004017L)\n#define CO_E_CREATEPROCESS_FAILURE _HRESULT_TYPEDEF_(0x80004018L)\n#define CO_E_RUNAS_CREATEPROCESS_FAILURE _HRESULT_TYPEDEF_(0x80004019L)\n#define CO_E_RUNAS_LOGON_FAILURE _HRESULT_TYPEDEF_(0x8000401AL)\n#define CO_E_LAUNCH_PERMSSION_DENIED _HRESULT_TYPEDEF_(0x8000401BL)\n#define CO_E_START_SERVICE_FAILURE _HRESULT_TYPEDEF_(0x8000401CL)\n#define CO_E_REMOTE_COMMUNICATION_FAILURE _HRESULT_TYPEDEF_(0x8000401DL)\n#define CO_E_SERVER_START_TIMEOUT _HRESULT_TYPEDEF_(0x8000401EL)\n#define CO_E_CLSREG_INCONSISTENT _HRESULT_TYPEDEF_(0x8000401FL)\n#define CO_E_IIDREG_INCONSISTENT _HRESULT_TYPEDEF_(0x80004020L)\n#define CO_E_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x80004021L)\n#define CO_E_RELOAD_DLL _HRESULT_TYPEDEF_(0x80004022L)\n#define CO_E_MSI_ERROR _HRESULT_TYPEDEF_(0x80004023L)\n#define CO_E_ATTEMPT_TO_CREATE_OUTSIDE_CLIENT_CONTEXT _HRESULT_TYPEDEF_(0x80004024L)\n#define CO_E_SERVER_PAUSED _HRESULT_TYPEDEF_(0x80004025L)\n#define CO_E_SERVER_NOT_PAUSED _HRESULT_TYPEDEF_(0x80004026L)\n#define CO_E_CLASS_DISABLED _HRESULT_TYPEDEF_(0x80004027L)\n#define CO_E_CLRNOTAVAILABLE _HRESULT_TYPEDEF_(0x80004028L)\n#define CO_E_ASYNC_WORK_REJECTED _HRESULT_TYPEDEF_(0x80004029L)\n#define CO_E_SERVER_INIT_TIMEOUT _HRESULT_TYPEDEF_(0x8000402AL)\n#define CO_E_NO_SECCTX_IN_ACTIVATE _HRESULT_TYPEDEF_(0x8000402BL)\n#define CO_E_TRACKER_CONFIG _HRESULT_TYPEDEF_(0x80004030L)\n#define CO_E_THREADPOOL_CONFIG _HRESULT_TYPEDEF_(0x80004031L)\n#define CO_E_SXS_CONFIG _HRESULT_TYPEDEF_(0x80004032L)\n#define CO_E_MALFORMED_SPN _HRESULT_TYPEDEF_(0x80004033L)\n#define S_OK ((HRESULT)0x00000000L)\n#define S_FALSE ((HRESULT)0x00000001L)\n#define OLE_E_FIRST ((HRESULT)0x80040000L)\n#define OLE_E_LAST ((HRESULT)0x800400FFL)\n#define OLE_S_FIRST ((HRESULT)0x00040000L)\n#define OLE_S_LAST ((HRESULT)0x000400FFL)\n#define OLE_E_OLEVERB _HRESULT_TYPEDEF_(0x80040000L)\n#define OLE_E_ADVF _HRESULT_TYPEDEF_(0x80040001L)\n#define OLE_E_ENUM_NOMORE _HRESULT_TYPEDEF_(0x80040002L)\n#define OLE_E_ADVISENOTSUPPORTED _HRESULT_TYPEDEF_(0x80040003L)\n#define OLE_E_NOCONNECTION _HRESULT_TYPEDEF_(0x80040004L)\n#define OLE_E_NOTRUNNING _HRESULT_TYPEDEF_(0x80040005L)\n#define OLE_E_NOCACHE _HRESULT_TYPEDEF_(0x80040006L)\n#define OLE_E_BLANK _HRESULT_TYPEDEF_(0x80040007L)\n#define OLE_E_CLASSDIFF _HRESULT_TYPEDEF_(0x80040008L)\n#define OLE_E_CANT_GETMONIKER _HRESULT_TYPEDEF_(0x80040009L)\n#define OLE_E_CANT_BINDTOSOURCE _HRESULT_TYPEDEF_(0x8004000AL)\n#define OLE_E_STATIC _HRESULT_TYPEDEF_(0x8004000BL)\n#define OLE_E_PROMPTSAVECANCELLED _HRESULT_TYPEDEF_(0x8004000CL)\n#define OLE_E_INVALIDRECT _HRESULT_TYPEDEF_(0x8004000DL)\n#define OLE_E_WRONGCOMPOBJ _HRESULT_TYPEDEF_(0x8004000EL)\n#define OLE_E_INVALIDHWND _HRESULT_TYPEDEF_(0x8004000FL)\n#define OLE_E_NOT_INPLACEACTIVE _HRESULT_TYPEDEF_(0x80040010L)\n#define OLE_E_CANTCONVERT _HRESULT_TYPEDEF_(0x80040011L)\n#define OLE_E_NOSTORAGE _HRESULT_TYPEDEF_(0x80040012L)\n#define DV_E_FORMATETC _HRESULT_TYPEDEF_(0x80040064L)\n#define DV_E_DVTARGETDEVICE _HRESULT_TYPEDEF_(0x80040065L)\n#define DV_E_STGMEDIUM _HRESULT_TYPEDEF_(0x80040066L)\n#define DV_E_STATDATA _HRESULT_TYPEDEF_(0x80040067L)\n#define DV_E_LINDEX _HRESULT_TYPEDEF_(0x80040068L)\n#define DV_E_TYMED _HRESULT_TYPEDEF_(0x80040069L)\n#define DV_E_CLIPFORMAT _HRESULT_TYPEDEF_(0x8004006AL)\n#define DV_E_DVASPECT _HRESULT_TYPEDEF_(0x8004006BL)\n#define DV_E_DVTARGETDEVICE_SIZE _HRESULT_TYPEDEF_(0x8004006CL)\n#define DV_E_NOIVIEWOBJECT _HRESULT_TYPEDEF_(0x8004006DL)\n#define DRAGDROP_E_FIRST 0x80040100L\n#define DRAGDROP_E_LAST 0x8004010FL\n#define DRAGDROP_S_FIRST 0x00040100L\n#define DRAGDROP_S_LAST 0x0004010FL\n#define DRAGDROP_E_NOTREGISTERED _HRESULT_TYPEDEF_(0x80040100L)\n#define DRAGDROP_E_ALREADYREGISTERED _HRESULT_TYPEDEF_(0x80040101L)\n#define DRAGDROP_E_INVALIDHWND _HRESULT_TYPEDEF_(0x80040102L)\n#define CLASSFACTORY_E_FIRST 0x80040110L\n#define CLASSFACTORY_E_LAST 0x8004011FL\n#define CLASSFACTORY_S_FIRST 0x00040110L\n#define CLASSFACTORY_S_LAST 0x0004011FL\n#define CLASS_E_NOAGGREGATION _HRESULT_TYPEDEF_(0x80040110L)\n#define CLASS_E_CLASSNOTAVAILABLE _HRESULT_TYPEDEF_(0x80040111L)\n#define CLASS_E_NOTLICENSED _HRESULT_TYPEDEF_(0x80040112L)\n#define MARSHAL_E_FIRST 0x80040120L\n#define MARSHAL_E_LAST 0x8004012FL\n#define MARSHAL_S_FIRST 0x00040120L\n#define MARSHAL_S_LAST 0x0004012FL\n#define DATA_E_FIRST 0x80040130L\n#define DATA_E_LAST 0x8004013FL\n#define DATA_S_FIRST 0x00040130L\n#define DATA_S_LAST 0x0004013FL\n#define VIEW_E_FIRST 0x80040140L\n#define VIEW_E_LAST 0x8004014FL\n#define VIEW_S_FIRST 0x00040140L\n#define VIEW_S_LAST 0x0004014FL\n#define VIEW_E_DRAW _HRESULT_TYPEDEF_(0x80040140L)\n#define REGDB_E_FIRST 0x80040150L\n#define REGDB_E_LAST 0x8004015FL\n#define REGDB_S_FIRST 0x00040150L\n#define REGDB_S_LAST 0x0004015FL\n#define REGDB_E_READREGDB _HRESULT_TYPEDEF_(0x80040150L)\n#define REGDB_E_WRITEREGDB _HRESULT_TYPEDEF_(0x80040151L)\n#define REGDB_E_KEYMISSING _HRESULT_TYPEDEF_(0x80040152L)\n#define REGDB_E_INVALIDVALUE _HRESULT_TYPEDEF_(0x80040153L)\n#define REGDB_E_CLASSNOTREG _HRESULT_TYPEDEF_(0x80040154L)\n#define REGDB_E_IIDNOTREG _HRESULT_TYPEDEF_(0x80040155L)\n#define REGDB_E_BADTHREADINGMODEL _HRESULT_TYPEDEF_(0x80040156L)\n#define CAT_E_FIRST 0x80040160L\n#define CAT_E_LAST 0x80040161L\n#define CAT_E_CATIDNOEXIST _HRESULT_TYPEDEF_(0x80040160L)\n#define CAT_E_NODESCRIPTION _HRESULT_TYPEDEF_(0x80040161L)\n#define CS_E_FIRST 0x80040164L\n#define CS_E_LAST 0x8004016FL\n#define CS_E_PACKAGE_NOTFOUND _HRESULT_TYPEDEF_(0x80040164L)\n#define CS_E_NOT_DELETABLE _HRESULT_TYPEDEF_(0x80040165L)\n#define CS_E_CLASS_NOTFOUND _HRESULT_TYPEDEF_(0x80040166L)\n#define CS_E_INVALID_VERSION _HRESULT_TYPEDEF_(0x80040167L)\n#define CS_E_NO_CLASSSTORE _HRESULT_TYPEDEF_(0x80040168L)\n#define CS_E_OBJECT_NOTFOUND _HRESULT_TYPEDEF_(0x80040169L)\n#define CS_E_OBJECT_ALREADY_EXISTS _HRESULT_TYPEDEF_(0x8004016AL)\n#define CS_E_INVALID_PATH _HRESULT_TYPEDEF_(0x8004016BL)\n#define CS_E_NETWORK_ERROR _HRESULT_TYPEDEF_(0x8004016CL)\n#define CS_E_ADMIN_LIMIT_EXCEEDED _HRESULT_TYPEDEF_(0x8004016DL)\n#define CS_E_SCHEMA_MISMATCH _HRESULT_TYPEDEF_(0x8004016EL)\n#define CS_E_INTERNAL_ERROR _HRESULT_TYPEDEF_(0x8004016FL)\n#define CACHE_E_FIRST 0x80040170L\n#define CACHE_E_LAST 0x8004017FL\n#define CACHE_S_FIRST 0x00040170L\n#define CACHE_S_LAST 0x0004017FL\n#define CACHE_E_NOCACHE_UPDATED _HRESULT_TYPEDEF_(0x80040170L)\n#define OLEOBJ_E_FIRST 0x80040180L\n#define OLEOBJ_E_LAST 0x8004018FL\n#define OLEOBJ_S_FIRST 0x00040180L\n#define OLEOBJ_S_LAST 0x0004018FL\n#define OLEOBJ_E_NOVERBS _HRESULT_TYPEDEF_(0x80040180L)\n#define OLEOBJ_E_INVALIDVERB _HRESULT_TYPEDEF_(0x80040181L)\n#define CLIENTSITE_E_FIRST 0x80040190L\n#define CLIENTSITE_E_LAST 0x8004019FL\n#define CLIENTSITE_S_FIRST 0x00040190L\n#define CLIENTSITE_S_LAST 0x0004019FL\n#define INPLACE_E_NOTUNDOABLE _HRESULT_TYPEDEF_(0x800401A0L)\n#define INPLACE_E_NOTOOLSPACE _HRESULT_TYPEDEF_(0x800401A1L)\n#define INPLACE_E_FIRST 0x800401A0L\n#define INPLACE_E_LAST 0x800401AFL\n#define INPLACE_S_FIRST 0x000401A0L\n#define INPLACE_S_LAST 0x000401AFL\n#define ENUM_E_FIRST 0x800401B0L\n#define ENUM_E_LAST 0x800401BFL\n#define ENUM_S_FIRST 0x000401B0L\n#define ENUM_S_LAST 0x000401BFL\n#define CONVERT10_E_FIRST 0x800401C0L\n#define CONVERT10_E_LAST 0x800401CFL\n#define CONVERT10_S_FIRST 0x000401C0L\n#define CONVERT10_S_LAST 0x000401CFL\n#define CONVERT10_E_OLESTREAM_GET _HRESULT_TYPEDEF_(0x800401C0L)\n#define CONVERT10_E_OLESTREAM_PUT _HRESULT_TYPEDEF_(0x800401C1L)\n#define CONVERT10_E_OLESTREAM_FMT _HRESULT_TYPEDEF_(0x800401C2L)\n#define CONVERT10_E_OLESTREAM_BITMAP_TO_DIB _HRESULT_TYPEDEF_(0x800401C3L)\n#define CONVERT10_E_STG_FMT _HRESULT_TYPEDEF_(0x800401C4L)\n#define CONVERT10_E_STG_NO_STD_STREAM _HRESULT_TYPEDEF_(0x800401C5L)\n#define CONVERT10_E_STG_DIB_TO_BITMAP _HRESULT_TYPEDEF_(0x800401C6L)\n#define CLIPBRD_E_FIRST 0x800401D0L\n#define CLIPBRD_E_LAST 0x800401DFL\n#define CLIPBRD_S_FIRST 0x000401D0L\n#define CLIPBRD_S_LAST 0x000401DFL\n#define CLIPBRD_E_CANT_OPEN _HRESULT_TYPEDEF_(0x800401D0L)\n#define CLIPBRD_E_CANT_EMPTY _HRESULT_TYPEDEF_(0x800401D1L)\n#define CLIPBRD_E_CANT_SET _HRESULT_TYPEDEF_(0x800401D2L)\n#define CLIPBRD_E_BAD_DATA _HRESULT_TYPEDEF_(0x800401D3L)\n#define CLIPBRD_E_CANT_CLOSE _HRESULT_TYPEDEF_(0x800401D4L)\n#define MK_E_FIRST 0x800401E0L\n#define MK_E_LAST 0x800401EFL\n#define MK_S_FIRST 0x000401E0L\n#define MK_S_LAST 0x000401EFL\n#define MK_E_CONNECTMANUALLY _HRESULT_TYPEDEF_(0x800401E0L)\n#define MK_E_EXCEEDEDDEADLINE _HRESULT_TYPEDEF_(0x800401E1L)\n#define MK_E_NEEDGENERIC _HRESULT_TYPEDEF_(0x800401E2L)\n#define MK_E_UNAVAILABLE _HRESULT_TYPEDEF_(0x800401E3L)\n#define MK_E_SYNTAX _HRESULT_TYPEDEF_(0x800401E4L)\n#define MK_E_NOOBJECT _HRESULT_TYPEDEF_(0x800401E5L)\n#define MK_E_INVALIDEXTENSION _HRESULT_TYPEDEF_(0x800401E6L)\n#define MK_E_INTERMEDIATEINTERFACENOTSUPPORTED _HRESULT_TYPEDEF_(0x800401E7L)\n#define MK_E_NOTBINDABLE _HRESULT_TYPEDEF_(0x800401E8L)\n#define MK_E_NOTBOUND _HRESULT_TYPEDEF_(0x800401E9L)\n#define MK_E_CANTOPENFILE _HRESULT_TYPEDEF_(0x800401EAL)\n#define MK_E_MUSTBOTHERUSER _HRESULT_TYPEDEF_(0x800401EBL)\n#define MK_E_NOINVERSE _HRESULT_TYPEDEF_(0x800401ECL)\n#define MK_E_NOSTORAGE _HRESULT_TYPEDEF_(0x800401EDL)\n#define MK_E_NOPREFIX _HRESULT_TYPEDEF_(0x800401EEL)\n#define MK_E_ENUMERATION_FAILED _HRESULT_TYPEDEF_(0x800401EFL)\n#define CO_E_FIRST 0x800401F0L\n#define CO_E_LAST 0x800401FFL\n#define CO_S_FIRST 0x000401F0L\n#define CO_S_LAST 0x000401FFL\n#define CO_E_NOTINITIALIZED _HRESULT_TYPEDEF_(0x800401F0L)\n#define CO_E_ALREADYINITIALIZED _HRESULT_TYPEDEF_(0x800401F1L)\n#define CO_E_CANTDETERMINECLASS _HRESULT_TYPEDEF_(0x800401F2L)\n#define CO_E_CLASSSTRING _HRESULT_TYPEDEF_(0x800401F3L)\n#define CO_E_IIDSTRING _HRESULT_TYPEDEF_(0x800401F4L)\n#define CO_E_APPNOTFOUND _HRESULT_TYPEDEF_(0x800401F5L)\n#define CO_E_APPSINGLEUSE _HRESULT_TYPEDEF_(0x800401F6L)\n#define CO_E_ERRORINAPP _HRESULT_TYPEDEF_(0x800401F7L)\n#define CO_E_DLLNOTFOUND _HRESULT_TYPEDEF_(0x800401F8L)\n#define CO_E_ERRORINDLL _HRESULT_TYPEDEF_(0x800401F9L)\n#define CO_E_WRONGOSFORAPP _HRESULT_TYPEDEF_(0x800401FAL)\n#define CO_E_OBJNOTREG _HRESULT_TYPEDEF_(0x800401FBL)\n#define CO_E_OBJISREG _HRESULT_TYPEDEF_(0x800401FCL)\n#define CO_E_OBJNOTCONNECTED _HRESULT_TYPEDEF_(0x800401FDL)\n#define CO_E_APPDIDNTREG _HRESULT_TYPEDEF_(0x800401FEL)\n#define CO_E_RELEASED _HRESULT_TYPEDEF_(0x800401FFL)\n#define EVENT_E_FIRST 0x80040200L\n#define EVENT_E_LAST 0x8004021FL\n#define EVENT_S_FIRST 0x00040200L\n#define EVENT_S_LAST 0x0004021FL\n#define EVENT_S_SOME_SUBSCRIBERS_FAILED _HRESULT_TYPEDEF_(0x00040200L)\n#define EVENT_E_ALL_SUBSCRIBERS_FAILED _HRESULT_TYPEDEF_(0x80040201L)\n#define EVENT_S_NOSUBSCRIBERS _HRESULT_TYPEDEF_(0x00040202L)\n#define EVENT_E_QUERYSYNTAX _HRESULT_TYPEDEF_(0x80040203L)\n#define EVENT_E_QUERYFIELD _HRESULT_TYPEDEF_(0x80040204L)\n#define EVENT_E_INTERNALEXCEPTION _HRESULT_TYPEDEF_(0x80040205L)\n#define EVENT_E_INTERNALERROR _HRESULT_TYPEDEF_(0x80040206L)\n#define EVENT_E_INVALID_PER_USER_SID _HRESULT_TYPEDEF_(0x80040207L)\n#define EVENT_E_USER_EXCEPTION _HRESULT_TYPEDEF_(0x80040208L)\n#define EVENT_E_TOO_MANY_METHODS _HRESULT_TYPEDEF_(0x80040209L)\n#define EVENT_E_MISSING_EVENTCLASS _HRESULT_TYPEDEF_(0x8004020AL)\n#define EVENT_E_NOT_ALL_REMOVED _HRESULT_TYPEDEF_(0x8004020BL)\n#define EVENT_E_COMPLUS_NOT_INSTALLED _HRESULT_TYPEDEF_(0x8004020CL)\n#define EVENT_E_CANT_MODIFY_OR_DELETE_UNCONFIGURED_OBJECT _HRESULT_TYPEDEF_(0x8004020DL)\n#define EVENT_E_CANT_MODIFY_OR_DELETE_CONFIGURED_OBJECT _HRESULT_TYPEDEF_(0x8004020EL)\n#define EVENT_E_INVALID_EVENT_CLASS_PARTITION _HRESULT_TYPEDEF_(0x8004020FL)\n#define EVENT_E_PER_USER_SID_NOT_LOGGED_ON _HRESULT_TYPEDEF_(0x80040210L)\n#define XACT_E_FIRST 0x8004D000\n#define XACT_E_LAST 0x8004D029\n#define XACT_S_FIRST 0x0004D000\n#define XACT_S_LAST 0x0004D010\n#define XACT_E_ALREADYOTHERSINGLEPHASE _HRESULT_TYPEDEF_(0x8004D000L)\n#define XACT_E_CANTRETAIN _HRESULT_TYPEDEF_(0x8004D001L)\n#define XACT_E_COMMITFAILED _HRESULT_TYPEDEF_(0x8004D002L)\n#define XACT_E_COMMITPREVENTED _HRESULT_TYPEDEF_(0x8004D003L)\n#define XACT_E_HEURISTICABORT _HRESULT_TYPEDEF_(0x8004D004L)\n#define XACT_E_HEURISTICCOMMIT _HRESULT_TYPEDEF_(0x8004D005L)\n#define XACT_E_HEURISTICDAMAGE _HRESULT_TYPEDEF_(0x8004D006L)\n#define XACT_E_HEURISTICDANGER _HRESULT_TYPEDEF_(0x8004D007L)\n#define XACT_E_ISOLATIONLEVEL _HRESULT_TYPEDEF_(0x8004D008L)\n#define XACT_E_NOASYNC _HRESULT_TYPEDEF_(0x8004D009L)\n#define XACT_E_NOENLIST _HRESULT_TYPEDEF_(0x8004D00AL)\n#define XACT_E_NOISORETAIN _HRESULT_TYPEDEF_(0x8004D00BL)\n#define XACT_E_NORESOURCE _HRESULT_TYPEDEF_(0x8004D00CL)\n#define XACT_E_NOTCURRENT _HRESULT_TYPEDEF_(0x8004D00DL)\n#define XACT_E_NOTRANSACTION _HRESULT_TYPEDEF_(0x8004D00EL)\n#define XACT_E_NOTSUPPORTED _HRESULT_TYPEDEF_(0x8004D00FL)\n#define XACT_E_UNKNOWNRMGRID _HRESULT_TYPEDEF_(0x8004D010L)\n#define XACT_E_WRONGSTATE _HRESULT_TYPEDEF_(0x8004D011L)\n#define XACT_E_WRONGUOW _HRESULT_TYPEDEF_(0x8004D012L)\n#define XACT_E_XTIONEXISTS _HRESULT_TYPEDEF_(0x8004D013L)\n#define XACT_E_NOIMPORTOBJECT _HRESULT_TYPEDEF_(0x8004D014L)\n#define XACT_E_INVALIDCOOKIE _HRESULT_TYPEDEF_(0x8004D015L)\n#define XACT_E_INDOUBT _HRESULT_TYPEDEF_(0x8004D016L)\n#define XACT_E_NOTIMEOUT _HRESULT_TYPEDEF_(0x8004D017L)\n#define XACT_E_ALREADYINPROGRESS _HRESULT_TYPEDEF_(0x8004D018L)\n#define XACT_E_ABORTED _HRESULT_TYPEDEF_(0x8004D019L)\n#define XACT_E_LOGFULL _HRESULT_TYPEDEF_(0x8004D01AL)\n#define XACT_E_TMNOTAVAILABLE _HRESULT_TYPEDEF_(0x8004D01BL)\n#define XACT_E_CONNECTION_DOWN _HRESULT_TYPEDEF_(0x8004D01CL)\n#define XACT_E_CONNECTION_DENIED _HRESULT_TYPEDEF_(0x8004D01DL)\n#define XACT_E_REENLISTTIMEOUT _HRESULT_TYPEDEF_(0x8004D01EL)\n#define XACT_E_TIP_CONNECT_FAILED _HRESULT_TYPEDEF_(0x8004D01FL)\n#define XACT_E_TIP_PROTOCOL_ERROR _HRESULT_TYPEDEF_(0x8004D020L)\n#define XACT_E_TIP_PULL_FAILED _HRESULT_TYPEDEF_(0x8004D021L)\n#define XACT_E_DEST_TMNOTAVAILABLE _HRESULT_TYPEDEF_(0x8004D022L)\n#define XACT_E_TIP_DISABLED _HRESULT_TYPEDEF_(0x8004D023L)\n#define XACT_E_NETWORK_TX_DISABLED _HRESULT_TYPEDEF_(0x8004D024L)\n#define XACT_E_PARTNER_NETWORK_TX_DISABLED _HRESULT_TYPEDEF_(0x8004D025L)\n#define XACT_E_XA_TX_DISABLED _HRESULT_TYPEDEF_(0x8004D026L)\n#define XACT_E_UNABLE_TO_READ_DTC_CONFIG _HRESULT_TYPEDEF_(0x8004D027L)\n#define XACT_E_UNABLE_TO_LOAD_DTC_PROXY _HRESULT_TYPEDEF_(0x8004D028L)\n#define XACT_E_ABORTING _HRESULT_TYPEDEF_(0x8004D029L)\n#define XACT_E_CLERKNOTFOUND _HRESULT_TYPEDEF_(0x8004D080L)\n#define XACT_E_CLERKEXISTS _HRESULT_TYPEDEF_(0x8004D081L)\n#define XACT_E_RECOVERYINPROGRESS _HRESULT_TYPEDEF_(0x8004D082L)\n#define XACT_E_TRANSACTIONCLOSED _HRESULT_TYPEDEF_(0x8004D083L)\n#define XACT_E_INVALIDLSN _HRESULT_TYPEDEF_(0x8004D084L)\n#define XACT_E_REPLAYREQUEST _HRESULT_TYPEDEF_(0x8004D085L)\n#define XACT_S_ASYNC _HRESULT_TYPEDEF_(0x0004D000L)\n#define XACT_S_DEFECT _HRESULT_TYPEDEF_(0x0004D001L)\n#define XACT_S_READONLY _HRESULT_TYPEDEF_(0x0004D002L)\n#define XACT_S_SOMENORETAIN _HRESULT_TYPEDEF_(0x0004D003L)\n#define XACT_S_OKINFORM _HRESULT_TYPEDEF_(0x0004D004L)\n#define XACT_S_MADECHANGESCONTENT _HRESULT_TYPEDEF_(0x0004D005L)\n#define XACT_S_MADECHANGESINFORM _HRESULT_TYPEDEF_(0x0004D006L)\n#define XACT_S_ALLNORETAIN _HRESULT_TYPEDEF_(0x0004D007L)\n#define XACT_S_ABORTING _HRESULT_TYPEDEF_(0x0004D008L)\n#define XACT_S_SINGLEPHASE _HRESULT_TYPEDEF_(0x0004D009L)\n#define XACT_S_LOCALLY_OK _HRESULT_TYPEDEF_(0x0004D00AL)\n#define XACT_S_LASTRESOURCEMANAGER _HRESULT_TYPEDEF_(0x0004D010L)\n#define CONTEXT_E_FIRST 0x8004E000L\n#define CONTEXT_E_LAST 0x8004E02FL\n#define CONTEXT_S_FIRST 0x0004E000L\n#define CONTEXT_S_LAST 0x0004E02FL\n#define CONTEXT_E_ABORTED _HRESULT_TYPEDEF_(0x8004E002L)\n#define CONTEXT_E_ABORTING _HRESULT_TYPEDEF_(0x8004E003L)\n#define CONTEXT_E_NOCONTEXT _HRESULT_TYPEDEF_(0x8004E004L)\n#define CONTEXT_E_WOULD_DEADLOCK _HRESULT_TYPEDEF_(0x8004E005L)\n#define CONTEXT_E_SYNCH_TIMEOUT _HRESULT_TYPEDEF_(0x8004E006L)\n#define CONTEXT_E_OLDREF _HRESULT_TYPEDEF_(0x8004E007L)\n#define CONTEXT_E_ROLENOTFOUND _HRESULT_TYPEDEF_(0x8004E00CL)\n#define CONTEXT_E_TMNOTAVAILABLE _HRESULT_TYPEDEF_(0x8004E00FL)\n#define CO_E_ACTIVATIONFAILED _HRESULT_TYPEDEF_(0x8004E021L)\n#define CO_E_ACTIVATIONFAILED_EVENTLOGGED _HRESULT_TYPEDEF_(0x8004E022L)\n#define CO_E_ACTIVATIONFAILED_CATALOGERROR _HRESULT_TYPEDEF_(0x8004E023L)\n#define CO_E_ACTIVATIONFAILED_TIMEOUT _HRESULT_TYPEDEF_(0x8004E024L)\n#define CO_E_INITIALIZATIONFAILED _HRESULT_TYPEDEF_(0x8004E025L)\n#define CONTEXT_E_NOJIT _HRESULT_TYPEDEF_(0x8004E026L)\n#define CONTEXT_E_NOTRANSACTION _HRESULT_TYPEDEF_(0x8004E027L)\n#define CO_E_THREADINGMODEL_CHANGED _HRESULT_TYPEDEF_(0x8004E028L)\n#define CO_E_NOIISINTRINSICS _HRESULT_TYPEDEF_(0x8004E029L)\n#define CO_E_NOCOOKIES _HRESULT_TYPEDEF_(0x8004E02AL)\n#define CO_E_DBERROR _HRESULT_TYPEDEF_(0x8004E02BL)\n#define CO_E_NOTPOOLED _HRESULT_TYPEDEF_(0x8004E02CL)\n#define CO_E_NOTCONSTRUCTED _HRESULT_TYPEDEF_(0x8004E02DL)\n#define CO_E_NOSYNCHRONIZATION _HRESULT_TYPEDEF_(0x8004E02EL)\n#define CO_E_ISOLEVELMISMATCH _HRESULT_TYPEDEF_(0x8004E02FL)\n#define OLE_S_USEREG _HRESULT_TYPEDEF_(0x00040000L)\n#define OLE_S_STATIC _HRESULT_TYPEDEF_(0x00040001L)\n#define OLE_S_MAC_CLIPFORMAT _HRESULT_TYPEDEF_(0x00040002L)\n#define DRAGDROP_S_DROP _HRESULT_TYPEDEF_(0x00040100L)\n#define DRAGDROP_S_CANCEL _HRESULT_TYPEDEF_(0x00040101L)\n#define DRAGDROP_S_USEDEFAULTCURSORS _HRESULT_TYPEDEF_(0x00040102L)\n#define DATA_S_SAMEFORMATETC _HRESULT_TYPEDEF_(0x00040130L)\n#define VIEW_S_ALREADY_FROZEN _HRESULT_TYPEDEF_(0x00040140L)\n#define CACHE_S_FORMATETC_NOTSUPPORTED _HRESULT_TYPEDEF_(0x00040170L)\n#define CACHE_S_SAMECACHE _HRESULT_TYPEDEF_(0x00040171L)\n#define CACHE_S_SOMECACHES_NOTUPDATED _HRESULT_TYPEDEF_(0x00040172L)\n#define OLEOBJ_S_INVALIDVERB _HRESULT_TYPEDEF_(0x00040180L)\n#define OLEOBJ_S_CANNOT_DOVERB_NOW _HRESULT_TYPEDEF_(0x00040181L)\n#define OLEOBJ_S_INVALIDHWND _HRESULT_TYPEDEF_(0x00040182L)\n#define INPLACE_S_TRUNCATED _HRESULT_TYPEDEF_(0x000401A0L)\n#define CONVERT10_S_NO_PRESENTATION _HRESULT_TYPEDEF_(0x000401C0L)\n#define MK_S_REDUCED_TO_SELF _HRESULT_TYPEDEF_(0x000401E2L)\n#define MK_S_ME _HRESULT_TYPEDEF_(0x000401E4L)\n#define MK_S_HIM _HRESULT_TYPEDEF_(0x000401E5L)\n#define MK_S_US _HRESULT_TYPEDEF_(0x000401E6L)\n#define MK_S_MONIKERALREADYREGISTERED _HRESULT_TYPEDEF_(0x000401E7L)\n#define SCHED_S_TASK_READY _HRESULT_TYPEDEF_(0x00041300L)\n#define SCHED_S_TASK_RUNNING _HRESULT_TYPEDEF_(0x00041301L)\n#define SCHED_S_TASK_DISABLED _HRESULT_TYPEDEF_(0x00041302L)\n#define SCHED_S_TASK_HAS_NOT_RUN _HRESULT_TYPEDEF_(0x00041303L)\n#define SCHED_S_TASK_NO_MORE_RUNS _HRESULT_TYPEDEF_(0x00041304L)\n#define SCHED_S_TASK_NOT_SCHEDULED _HRESULT_TYPEDEF_(0x00041305L)\n#define SCHED_S_TASK_TERMINATED _HRESULT_TYPEDEF_(0x00041306L)\n#define SCHED_S_TASK_NO_VALID_TRIGGERS _HRESULT_TYPEDEF_(0x00041307L)\n#define SCHED_S_EVENT_TRIGGER _HRESULT_TYPEDEF_(0x00041308L)\n#define SCHED_E_TRIGGER_NOT_FOUND _HRESULT_TYPEDEF_(0x80041309L)\n#define SCHED_E_TASK_NOT_READY _HRESULT_TYPEDEF_(0x8004130AL)\n#define SCHED_E_TASK_NOT_RUNNING _HRESULT_TYPEDEF_(0x8004130BL)\n#define SCHED_E_SERVICE_NOT_INSTALLED _HRESULT_TYPEDEF_(0x8004130CL)\n#define SCHED_E_CANNOT_OPEN_TASK _HRESULT_TYPEDEF_(0x8004130DL)\n#define SCHED_E_INVALID_TASK _HRESULT_TYPEDEF_(0x8004130EL)\n#define SCHED_E_ACCOUNT_INFORMATION_NOT_SET _HRESULT_TYPEDEF_(0x8004130FL)\n#define SCHED_E_ACCOUNT_NAME_NOT_FOUND _HRESULT_TYPEDEF_(0x80041310L)\n#define SCHED_E_ACCOUNT_DBASE_CORRUPT _HRESULT_TYPEDEF_(0x80041311L)\n#define SCHED_E_NO_SECURITY_SERVICES _HRESULT_TYPEDEF_(0x80041312L)\n#define SCHED_E_UNKNOWN_OBJECT_VERSION _HRESULT_TYPEDEF_(0x80041313L)\n#define SCHED_E_UNSUPPORTED_ACCOUNT_OPTION _HRESULT_TYPEDEF_(0x80041314L)\n#define SCHED_E_SERVICE_NOT_RUNNING _HRESULT_TYPEDEF_(0x80041315L)\n#define CO_E_CLASS_CREATE_FAILED _HRESULT_TYPEDEF_(0x80080001L)\n#define CO_E_SCM_ERROR _HRESULT_TYPEDEF_(0x80080002L)\n#define CO_E_SCM_RPC_FAILURE _HRESULT_TYPEDEF_(0x80080003L)\n#define CO_E_BAD_PATH _HRESULT_TYPEDEF_(0x80080004L)\n#define CO_E_SERVER_EXEC_FAILURE _HRESULT_TYPEDEF_(0x80080005L)\n#define CO_E_OBJSRV_RPC_FAILURE _HRESULT_TYPEDEF_(0x80080006L)\n#define MK_E_NO_NORMALIZED _HRESULT_TYPEDEF_(0x80080007L)\n#define CO_E_SERVER_STOPPING _HRESULT_TYPEDEF_(0x80080008L)\n#define MEM_E_INVALID_ROOT _HRESULT_TYPEDEF_(0x80080009L)\n#define MEM_E_INVALID_LINK _HRESULT_TYPEDEF_(0x80080010L)\n#define MEM_E_INVALID_SIZE _HRESULT_TYPEDEF_(0x80080011L)\n#define CO_S_NOTALLINTERFACES _HRESULT_TYPEDEF_(0x00080012L)\n#define CO_S_MACHINENAMENOTFOUND _HRESULT_TYPEDEF_(0x00080013L)\n#define DISP_E_UNKNOWNINTERFACE _HRESULT_TYPEDEF_(0x80020001L)\n#define DISP_E_MEMBERNOTFOUND _HRESULT_TYPEDEF_(0x80020003L)\n#define DISP_E_PARAMNOTFOUND _HRESULT_TYPEDEF_(0x80020004L)\n#define DISP_E_TYPEMISMATCH _HRESULT_TYPEDEF_(0x80020005L)\n#define DISP_E_UNKNOWNNAME _HRESULT_TYPEDEF_(0x80020006L)\n#define DISP_E_NONAMEDARGS _HRESULT_TYPEDEF_(0x80020007L)\n#define DISP_E_BADVARTYPE _HRESULT_TYPEDEF_(0x80020008L)\n#define DISP_E_EXCEPTION _HRESULT_TYPEDEF_(0x80020009L)\n#define DISP_E_OVERFLOW _HRESULT_TYPEDEF_(0x8002000AL)\n#define DISP_E_BADINDEX _HRESULT_TYPEDEF_(0x8002000BL)\n#define DISP_E_UNKNOWNLCID _HRESULT_TYPEDEF_(0x8002000CL)\n#define DISP_E_ARRAYISLOCKED _HRESULT_TYPEDEF_(0x8002000DL)\n#define DISP_E_BADPARAMCOUNT _HRESULT_TYPEDEF_(0x8002000EL)\n#define DISP_E_PARAMNOTOPTIONAL _HRESULT_TYPEDEF_(0x8002000FL)\n#define DISP_E_BADCALLEE _HRESULT_TYPEDEF_(0x80020010L)\n#define DISP_E_NOTACOLLECTION _HRESULT_TYPEDEF_(0x80020011L)\n#define DISP_E_DIVBYZERO _HRESULT_TYPEDEF_(0x80020012L)\n#define DISP_E_BUFFERTOOSMALL _HRESULT_TYPEDEF_(0x80020013L)\n#define TYPE_E_BUFFERTOOSMALL _HRESULT_TYPEDEF_(0x80028016L)\n#define TYPE_E_FIELDNOTFOUND _HRESULT_TYPEDEF_(0x80028017L)\n#define TYPE_E_INVDATAREAD _HRESULT_TYPEDEF_(0x80028018L)\n#define TYPE_E_UNSUPFORMAT _HRESULT_TYPEDEF_(0x80028019L)\n#define TYPE_E_REGISTRYACCESS _HRESULT_TYPEDEF_(0x8002801CL)\n#define TYPE_E_LIBNOTREGISTERED _HRESULT_TYPEDEF_(0x8002801DL)\n#define TYPE_E_UNDEFINEDTYPE _HRESULT_TYPEDEF_(0x80028027L)\n#define TYPE_E_QUALIFIEDNAMEDISALLOWED _HRESULT_TYPEDEF_(0x80028028L)\n#define TYPE_E_INVALIDSTATE _HRESULT_TYPEDEF_(0x80028029L)\n#define TYPE_E_WRONGTYPEKIND _HRESULT_TYPEDEF_(0x8002802AL)\n#define TYPE_E_ELEMENTNOTFOUND _HRESULT_TYPEDEF_(0x8002802BL)\n#define TYPE_E_AMBIGUOUSNAME _HRESULT_TYPEDEF_(0x8002802CL)\n#define TYPE_E_NAMECONFLICT _HRESULT_TYPEDEF_(0x8002802DL)\n#define TYPE_E_UNKNOWNLCID _HRESULT_TYPEDEF_(0x8002802EL)\n#define TYPE_E_DLLFUNCTIONNOTFOUND _HRESULT_TYPEDEF_(0x8002802FL)\n#define TYPE_E_BADMODULEKIND _HRESULT_TYPEDEF_(0x800288BDL)\n#define TYPE_E_SIZETOOBIG _HRESULT_TYPEDEF_(0x800288C5L)\n#define TYPE_E_DUPLICATEID _HRESULT_TYPEDEF_(0x800288C6L)\n#define TYPE_E_INVALIDID _HRESULT_TYPEDEF_(0x800288CFL)\n#define TYPE_E_TYPEMISMATCH _HRESULT_TYPEDEF_(0x80028CA0L)\n#define TYPE_E_OUTOFBOUNDS _HRESULT_TYPEDEF_(0x80028CA1L)\n#define TYPE_E_IOERROR _HRESULT_TYPEDEF_(0x80028CA2L)\n#define TYPE_E_CANTCREATETMPFILE _HRESULT_TYPEDEF_(0x80028CA3L)\n#define TYPE_E_CANTLOADLIBRARY _HRESULT_TYPEDEF_(0x80029C4AL)\n#define TYPE_E_INCONSISTENTPROPFUNCS _HRESULT_TYPEDEF_(0x80029C83L)\n#define TYPE_E_CIRCULARTYPE _HRESULT_TYPEDEF_(0x80029C84L)\n#define STG_E_INVALIDFUNCTION _HRESULT_TYPEDEF_(0x80030001L)\n#define STG_E_FILENOTFOUND _HRESULT_TYPEDEF_(0x80030002L)\n#define STG_E_PATHNOTFOUND _HRESULT_TYPEDEF_(0x80030003L)\n#define STG_E_TOOMANYOPENFILES _HRESULT_TYPEDEF_(0x80030004L)\n#define STG_E_ACCESSDENIED _HRESULT_TYPEDEF_(0x80030005L)\n#define STG_E_INVALIDHANDLE _HRESULT_TYPEDEF_(0x80030006L)\n#define STG_E_INSUFFICIENTMEMORY _HRESULT_TYPEDEF_(0x80030008L)\n#define STG_E_INVALIDPOINTER _HRESULT_TYPEDEF_(0x80030009L)\n#define STG_E_NOMOREFILES _HRESULT_TYPEDEF_(0x80030012L)\n#define STG_E_DISKISWRITEPROTECTED _HRESULT_TYPEDEF_(0x80030013L)\n#define STG_E_SEEKERROR _HRESULT_TYPEDEF_(0x80030019L)\n#define STG_E_WRITEFAULT _HRESULT_TYPEDEF_(0x8003001DL)\n#define STG_E_READFAULT _HRESULT_TYPEDEF_(0x8003001EL)\n#define STG_E_SHAREVIOLATION _HRESULT_TYPEDEF_(0x80030020L)\n#define STG_E_LOCKVIOLATION _HRESULT_TYPEDEF_(0x80030021L)\n#define STG_E_FILEALREADYEXISTS _HRESULT_TYPEDEF_(0x80030050L)\n#define STG_E_INVALIDPARAMETER _HRESULT_TYPEDEF_(0x80030057L)\n#define STG_E_MEDIUMFULL _HRESULT_TYPEDEF_(0x80030070L)\n#define STG_E_PROPSETMISMATCHED _HRESULT_TYPEDEF_(0x800300F0L)\n#define STG_E_ABNORMALAPIEXIT _HRESULT_TYPEDEF_(0x800300FAL)\n#define STG_E_INVALIDHEADER _HRESULT_TYPEDEF_(0x800300FBL)\n#define STG_E_INVALIDNAME _HRESULT_TYPEDEF_(0x800300FCL)\n#define STG_E_UNKNOWN _HRESULT_TYPEDEF_(0x800300FDL)\n#define STG_E_UNIMPLEMENTEDFUNCTION _HRESULT_TYPEDEF_(0x800300FEL)\n#define STG_E_INVALIDFLAG _HRESULT_TYPEDEF_(0x800300FFL)\n#define STG_E_INUSE _HRESULT_TYPEDEF_(0x80030100L)\n#define STG_E_NOTCURRENT _HRESULT_TYPEDEF_(0x80030101L)\n#define STG_E_REVERTED _HRESULT_TYPEDEF_(0x80030102L)\n#define STG_E_CANTSAVE _HRESULT_TYPEDEF_(0x80030103L)\n#define STG_E_OLDFORMAT _HRESULT_TYPEDEF_(0x80030104L)\n#define STG_E_OLDDLL _HRESULT_TYPEDEF_(0x80030105L)\n#define STG_E_SHAREREQUIRED _HRESULT_TYPEDEF_(0x80030106L)\n#define STG_E_NOTFILEBASEDSTORAGE _HRESULT_TYPEDEF_(0x80030107L)\n#define STG_E_EXTANTMARSHALLINGS _HRESULT_TYPEDEF_(0x80030108L)\n#define STG_E_DOCFILECORRUPT _HRESULT_TYPEDEF_(0x80030109L)\n#define STG_E_BADBASEADDRESS _HRESULT_TYPEDEF_(0x80030110L)\n#define STG_E_DOCFILETOOLARGE _HRESULT_TYPEDEF_(0x80030111L)\n#define STG_E_NOTSIMPLEFORMAT _HRESULT_TYPEDEF_(0x80030112L)\n#define STG_E_INCOMPLETE _HRESULT_TYPEDEF_(0x80030201L)\n#define STG_E_TERMINATED _HRESULT_TYPEDEF_(0x80030202L)\n#define STG_S_CONVERTED _HRESULT_TYPEDEF_(0x00030200L)\n#define STG_S_BLOCK _HRESULT_TYPEDEF_(0x00030201L)\n#define STG_S_RETRYNOW _HRESULT_TYPEDEF_(0x00030202L)\n#define STG_S_MONITORING _HRESULT_TYPEDEF_(0x00030203L)\n#define STG_S_MULTIPLEOPENS _HRESULT_TYPEDEF_(0x00030204L)\n#define STG_S_CONSOLIDATIONFAILED _HRESULT_TYPEDEF_(0x00030205L)\n#define STG_S_CANNOTCONSOLIDATE _HRESULT_TYPEDEF_(0x00030206L)\n#define STG_E_STATUS_COPY_PROTECTION_FAILURE _HRESULT_TYPEDEF_(0x80030305L)\n#define STG_E_CSS_AUTHENTICATION_FAILURE _HRESULT_TYPEDEF_(0x80030306L)\n#define STG_E_CSS_KEY_NOT_PRESENT _HRESULT_TYPEDEF_(0x80030307L)\n#define STG_E_CSS_KEY_NOT_ESTABLISHED _HRESULT_TYPEDEF_(0x80030308L)\n#define STG_E_CSS_SCRAMBLED_SECTOR _HRESULT_TYPEDEF_(0x80030309L)\n#define STG_E_CSS_REGION_MISMATCH _HRESULT_TYPEDEF_(0x8003030AL)\n#define STG_E_RESETS_EXHAUSTED _HRESULT_TYPEDEF_(0x8003030BL)\n#define RPC_E_CALL_REJECTED _HRESULT_TYPEDEF_(0x80010001L)\n#define RPC_E_CALL_CANCELED _HRESULT_TYPEDEF_(0x80010002L)\n#define RPC_E_CANTPOST_INSENDCALL _HRESULT_TYPEDEF_(0x80010003L)\n#define RPC_E_CANTCALLOUT_INASYNCCALL _HRESULT_TYPEDEF_(0x80010004L)\n#define RPC_E_CANTCALLOUT_INEXTERNALCALL _HRESULT_TYPEDEF_(0x80010005L)\n#define RPC_E_CONNECTION_TERMINATED _HRESULT_TYPEDEF_(0x80010006L)\n#define RPC_E_SERVER_DIED _HRESULT_TYPEDEF_(0x80010007L)\n#define RPC_E_CLIENT_DIED _HRESULT_TYPEDEF_(0x80010008L)\n#define RPC_E_INVALID_DATAPACKET _HRESULT_TYPEDEF_(0x80010009L)\n#define RPC_E_CANTTRANSMIT_CALL _HRESULT_TYPEDEF_(0x8001000AL)\n#define RPC_E_CLIENT_CANTMARSHAL_DATA _HRESULT_TYPEDEF_(0x8001000BL)\n#define RPC_E_CLIENT_CANTUNMARSHAL_DATA _HRESULT_TYPEDEF_(0x8001000CL)\n#define RPC_E_SERVER_CANTMARSHAL_DATA _HRESULT_TYPEDEF_(0x8001000DL)\n#define RPC_E_SERVER_CANTUNMARSHAL_DATA _HRESULT_TYPEDEF_(0x8001000EL)\n#define RPC_E_INVALID_DATA _HRESULT_TYPEDEF_(0x8001000FL)\n#define RPC_E_INVALID_PARAMETER _HRESULT_TYPEDEF_(0x80010010L)\n#define RPC_E_CANTCALLOUT_AGAIN _HRESULT_TYPEDEF_(0x80010011L)\n#define RPC_E_SERVER_DIED_DNE _HRESULT_TYPEDEF_(0x80010012L)\n#define RPC_E_SYS_CALL_FAILED _HRESULT_TYPEDEF_(0x80010100L)\n#define RPC_E_OUT_OF_RESOURCES _HRESULT_TYPEDEF_(0x80010101L)\n#define RPC_E_ATTEMPTED_MULTITHREAD _HRESULT_TYPEDEF_(0x80010102L)\n#define RPC_E_NOT_REGISTERED _HRESULT_TYPEDEF_(0x80010103L)\n#define RPC_E_FAULT _HRESULT_TYPEDEF_(0x80010104L)\n#define RPC_E_SERVERFAULT _HRESULT_TYPEDEF_(0x80010105L)\n#define RPC_E_CHANGED_MODE _HRESULT_TYPEDEF_(0x80010106L)\n#define RPC_E_INVALIDMETHOD _HRESULT_TYPEDEF_(0x80010107L)\n#define RPC_E_DISCONNECTED _HRESULT_TYPEDEF_(0x80010108L)\n#define RPC_E_RETRY _HRESULT_TYPEDEF_(0x80010109L)\n#define RPC_E_SERVERCALL_RETRYLATER _HRESULT_TYPEDEF_(0x8001010AL)\n#define RPC_E_SERVERCALL_REJECTED _HRESULT_TYPEDEF_(0x8001010BL)\n#define RPC_E_INVALID_CALLDATA _HRESULT_TYPEDEF_(0x8001010CL)\n#define RPC_E_CANTCALLOUT_ININPUTSYNCCALL _HRESULT_TYPEDEF_(0x8001010DL)\n#define RPC_E_WRONG_THREAD _HRESULT_TYPEDEF_(0x8001010EL)\n#define RPC_E_THREAD_NOT_INIT _HRESULT_TYPEDEF_(0x8001010FL)\n#define RPC_E_VERSION_MISMATCH _HRESULT_TYPEDEF_(0x80010110L)\n#define RPC_E_INVALID_HEADER _HRESULT_TYPEDEF_(0x80010111L)\n#define RPC_E_INVALID_EXTENSION _HRESULT_TYPEDEF_(0x80010112L)\n#define RPC_E_INVALID_IPID _HRESULT_TYPEDEF_(0x80010113L)\n#define RPC_E_INVALID_OBJECT _HRESULT_TYPEDEF_(0x80010114L)\n#define RPC_S_CALLPENDING _HRESULT_TYPEDEF_(0x80010115L)\n#define RPC_S_WAITONTIMER _HRESULT_TYPEDEF_(0x80010116L)\n#define RPC_E_CALL_COMPLETE _HRESULT_TYPEDEF_(0x80010117L)\n#define RPC_E_UNSECURE_CALL _HRESULT_TYPEDEF_(0x80010118L)\n#define RPC_E_TOO_LATE _HRESULT_TYPEDEF_(0x80010119L)\n#define RPC_E_NO_GOOD_SECURITY_PACKAGES _HRESULT_TYPEDEF_(0x8001011AL)\n#define RPC_E_ACCESS_DENIED _HRESULT_TYPEDEF_(0x8001011BL)\n#define RPC_E_REMOTE_DISABLED _HRESULT_TYPEDEF_(0x8001011CL)\n#define RPC_E_INVALID_OBJREF _HRESULT_TYPEDEF_(0x8001011DL)\n#define RPC_E_NO_CONTEXT _HRESULT_TYPEDEF_(0x8001011EL)\n#define RPC_E_TIMEOUT _HRESULT_TYPEDEF_(0x8001011FL)\n#define RPC_E_NO_SYNC _HRESULT_TYPEDEF_(0x80010120L)\n#define RPC_E_FULLSIC_REQUIRED _HRESULT_TYPEDEF_(0x80010121L)\n#define RPC_E_INVALID_STD_NAME _HRESULT_TYPEDEF_(0x80010122L)\n#define CO_E_FAILEDTOIMPERSONATE _HRESULT_TYPEDEF_(0x80010123L)\n#define CO_E_FAILEDTOGETSECCTX _HRESULT_TYPEDEF_(0x80010124L)\n#define CO_E_FAILEDTOOPENTHREADTOKEN _HRESULT_TYPEDEF_(0x80010125L)\n#define CO_E_FAILEDTOGETTOKENINFO _HRESULT_TYPEDEF_(0x80010126L)\n#define CO_E_TRUSTEEDOESNTMATCHCLIENT _HRESULT_TYPEDEF_(0x80010127L)\n#define CO_E_FAILEDTOQUERYCLIENTBLANKET _HRESULT_TYPEDEF_(0x80010128L)\n#define CO_E_FAILEDTOSETDACL _HRESULT_TYPEDEF_(0x80010129L)\n#define CO_E_ACCESSCHECKFAILED _HRESULT_TYPEDEF_(0x8001012AL)\n#define CO_E_NETACCESSAPIFAILED _HRESULT_TYPEDEF_(0x8001012BL)\n#define CO_E_WRONGTRUSTEENAMESYNTAX _HRESULT_TYPEDEF_(0x8001012CL)\n#define CO_E_INVALIDSID _HRESULT_TYPEDEF_(0x8001012DL)\n#define CO_E_CONVERSIONFAILED _HRESULT_TYPEDEF_(0x8001012EL)\n#define CO_E_NOMATCHINGSIDFOUND _HRESULT_TYPEDEF_(0x8001012FL)\n#define CO_E_LOOKUPACCSIDFAILED _HRESULT_TYPEDEF_(0x80010130L)\n#define CO_E_NOMATCHINGNAMEFOUND _HRESULT_TYPEDEF_(0x80010131L)\n#define CO_E_LOOKUPACCNAMEFAILED _HRESULT_TYPEDEF_(0x80010132L)\n#define CO_E_SETSERLHNDLFAILED _HRESULT_TYPEDEF_(0x80010133L)\n#define CO_E_FAILEDTOGETWINDIR _HRESULT_TYPEDEF_(0x80010134L)\n#define CO_E_PATHTOOLONG _HRESULT_TYPEDEF_(0x80010135L)\n#define CO_E_FAILEDTOGENUUID _HRESULT_TYPEDEF_(0x80010136L)\n#define CO_E_FAILEDTOCREATEFILE _HRESULT_TYPEDEF_(0x80010137L)\n#define CO_E_FAILEDTOCLOSEHANDLE _HRESULT_TYPEDEF_(0x80010138L)\n#define CO_E_EXCEEDSYSACLLIMIT _HRESULT_TYPEDEF_(0x80010139L)\n#define CO_E_ACESINWRONGORDER _HRESULT_TYPEDEF_(0x8001013AL)\n#define CO_E_INCOMPATIBLESTREAMVERSION _HRESULT_TYPEDEF_(0x8001013BL)\n#define CO_E_FAILEDTOOPENPROCESSTOKEN _HRESULT_TYPEDEF_(0x8001013CL)\n#define CO_E_DECODEFAILED _HRESULT_TYPEDEF_(0x8001013DL)\n#define CO_E_ACNOTINITIALIZED _HRESULT_TYPEDEF_(0x8001013FL)\n#define CO_E_CANCEL_DISABLED _HRESULT_TYPEDEF_(0x80010140L)\n#define RPC_E_UNEXPECTED _HRESULT_TYPEDEF_(0x8001FFFFL)\n#define ERROR_AUDITING_DISABLED _HRESULT_TYPEDEF_(0xC0090001L)\n#define ERROR_ALL_SIDS_FILTERED _HRESULT_TYPEDEF_(0xC0090002L)\n#define NTE_BAD_UID _HRESULT_TYPEDEF_(0x80090001L)\n#define NTE_BAD_HASH _HRESULT_TYPEDEF_(0x80090002L)\n#define NTE_BAD_KEY _HRESULT_TYPEDEF_(0x80090003L)\n#define NTE_BAD_LEN _HRESULT_TYPEDEF_(0x80090004L)\n#define NTE_BAD_DATA _HRESULT_TYPEDEF_(0x80090005L)\n#define NTE_BAD_SIGNATURE _HRESULT_TYPEDEF_(0x80090006L)\n#define NTE_BAD_VER _HRESULT_TYPEDEF_(0x80090007L)\n#define NTE_BAD_ALGID _HRESULT_TYPEDEF_(0x80090008L)\n#define NTE_BAD_FLAGS _HRESULT_TYPEDEF_(0x80090009L)\n#define NTE_BAD_TYPE _HRESULT_TYPEDEF_(0x8009000AL)\n#define NTE_BAD_KEY_STATE _HRESULT_TYPEDEF_(0x8009000BL)\n#define NTE_BAD_HASH_STATE _HRESULT_TYPEDEF_(0x8009000CL)\n#define NTE_NO_KEY _HRESULT_TYPEDEF_(0x8009000DL)\n#define NTE_NO_MEMORY _HRESULT_TYPEDEF_(0x8009000EL)\n#define NTE_EXISTS _HRESULT_TYPEDEF_(0x8009000FL)\n#define NTE_PERM _HRESULT_TYPEDEF_(0x80090010L)\n#define NTE_NOT_FOUND _HRESULT_TYPEDEF_(0x80090011L)\n#define NTE_DOUBLE_ENCRYPT _HRESULT_TYPEDEF_(0x80090012L)\n#define NTE_BAD_PROVIDER _HRESULT_TYPEDEF_(0x80090013L)\n#define NTE_BAD_PROV_TYPE _HRESULT_TYPEDEF_(0x80090014L)\n#define NTE_BAD_PUBLIC_KEY _HRESULT_TYPEDEF_(0x80090015L)\n#define NTE_BAD_KEYSET _HRESULT_TYPEDEF_(0x80090016L)\n#define NTE_PROV_TYPE_NOT_DEF _HRESULT_TYPEDEF_(0x80090017L)\n#define NTE_PROV_TYPE_ENTRY_BAD _HRESULT_TYPEDEF_(0x80090018L)\n#define NTE_KEYSET_NOT_DEF _HRESULT_TYPEDEF_(0x80090019L)\n#define NTE_KEYSET_ENTRY_BAD _HRESULT_TYPEDEF_(0x8009001AL)\n#define NTE_PROV_TYPE_NO_MATCH _HRESULT_TYPEDEF_(0x8009001BL)\n#define NTE_SIGNATURE_FILE_BAD _HRESULT_TYPEDEF_(0x8009001CL)\n#define NTE_PROVIDER_DLL_FAIL _HRESULT_TYPEDEF_(0x8009001DL)\n#define NTE_PROV_DLL_NOT_FOUND _HRESULT_TYPEDEF_(0x8009001EL)\n#define NTE_BAD_KEYSET_PARAM _HRESULT_TYPEDEF_(0x8009001FL)\n#define NTE_FAIL _HRESULT_TYPEDEF_(0x80090020L)\n#define NTE_SYS_ERR _HRESULT_TYPEDEF_(0x80090021L)\n#define NTE_SILENT_CONTEXT _HRESULT_TYPEDEF_(0x80090022L)\n#define NTE_TOKEN_KEYSET_STORAGE_FULL _HRESULT_TYPEDEF_(0x80090023L)\n#define NTE_TEMPORARY_PROFILE _HRESULT_TYPEDEF_(0x80090024L)\n#define NTE_FIXEDPARAMETER _HRESULT_TYPEDEF_(0x80090025L)\n#define SEC_E_INSUFFICIENT_MEMORY _HRESULT_TYPEDEF_(0x80090300L)\n#define SEC_E_INVALID_HANDLE _HRESULT_TYPEDEF_(0x80090301L)\n#define SEC_E_UNSUPPORTED_FUNCTION _HRESULT_TYPEDEF_(0x80090302L)\n#define SEC_E_TARGET_UNKNOWN _HRESULT_TYPEDEF_(0x80090303L)\n#define SEC_E_INTERNAL_ERROR _HRESULT_TYPEDEF_(0x80090304L)\n#define SEC_E_SECPKG_NOT_FOUND _HRESULT_TYPEDEF_(0x80090305L)\n#define SEC_E_NOT_OWNER _HRESULT_TYPEDEF_(0x80090306L)\n#define SEC_E_CANNOT_INSTALL _HRESULT_TYPEDEF_(0x80090307L)\n#define SEC_E_INVALID_TOKEN _HRESULT_TYPEDEF_(0x80090308L)\n#define SEC_E_CANNOT_PACK _HRESULT_TYPEDEF_(0x80090309L)\n#define SEC_E_QOP_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x8009030AL)\n#define SEC_E_NO_IMPERSONATION _HRESULT_TYPEDEF_(0x8009030BL)\n#define SEC_E_LOGON_DENIED _HRESULT_TYPEDEF_(0x8009030CL)\n#define SEC_E_UNKNOWN_CREDENTIALS _HRESULT_TYPEDEF_(0x8009030DL)\n#define SEC_E_NO_CREDENTIALS _HRESULT_TYPEDEF_(0x8009030EL)\n#define SEC_E_MESSAGE_ALTERED _HRESULT_TYPEDEF_(0x8009030FL)\n#define SEC_E_OUT_OF_SEQUENCE _HRESULT_TYPEDEF_(0x80090310L)\n#define SEC_E_NO_AUTHENTICATING_AUTHORITY _HRESULT_TYPEDEF_(0x80090311L)\n#define SEC_I_CONTINUE_NEEDED _HRESULT_TYPEDEF_(0x00090312L)\n#define SEC_I_COMPLETE_NEEDED _HRESULT_TYPEDEF_(0x00090313L)\n#define SEC_I_COMPLETE_AND_CONTINUE _HRESULT_TYPEDEF_(0x00090314L)\n#define SEC_I_LOCAL_LOGON _HRESULT_TYPEDEF_(0x00090315L)\n#define SEC_E_BAD_PKGID _HRESULT_TYPEDEF_(0x80090316L)\n#define SEC_E_CONTEXT_EXPIRED _HRESULT_TYPEDEF_(0x80090317L)\n#define SEC_I_CONTEXT_EXPIRED _HRESULT_TYPEDEF_(0x00090317L)\n#define SEC_E_INCOMPLETE_MESSAGE _HRESULT_TYPEDEF_(0x80090318L)\n#define SEC_E_INCOMPLETE_CREDENTIALS _HRESULT_TYPEDEF_(0x80090320L)\n#define SEC_E_BUFFER_TOO_SMALL _HRESULT_TYPEDEF_(0x80090321L)\n#define SEC_I_INCOMPLETE_CREDENTIALS _HRESULT_TYPEDEF_(0x00090320L)\n#define SEC_I_RENEGOTIATE _HRESULT_TYPEDEF_(0x00090321L)\n#define SEC_E_WRONG_PRINCIPAL _HRESULT_TYPEDEF_(0x80090322L)\n#define SEC_I_NO_LSA_CONTEXT _HRESULT_TYPEDEF_(0x00090323L)\n#define SEC_E_TIME_SKEW _HRESULT_TYPEDEF_(0x80090324L)\n#define SEC_E_UNTRUSTED_ROOT _HRESULT_TYPEDEF_(0x80090325L)\n#define SEC_E_ILLEGAL_MESSAGE _HRESULT_TYPEDEF_(0x80090326L)\n#define SEC_E_CERT_UNKNOWN _HRESULT_TYPEDEF_(0x80090327L)\n#define SEC_E_CERT_EXPIRED _HRESULT_TYPEDEF_(0x80090328L)\n#define SEC_E_ENCRYPT_FAILURE _HRESULT_TYPEDEF_(0x80090329L)\n#define SEC_E_DECRYPT_FAILURE _HRESULT_TYPEDEF_(0x80090330L)\n#define SEC_E_ALGORITHM_MISMATCH _HRESULT_TYPEDEF_(0x80090331L)\n#define SEC_E_SECURITY_QOS_FAILED _HRESULT_TYPEDEF_(0x80090332L)\n#define SEC_E_UNFINISHED_CONTEXT_DELETED _HRESULT_TYPEDEF_(0x80090333L)\n#define SEC_E_NO_TGT_REPLY _HRESULT_TYPEDEF_(0x80090334L)\n#define SEC_E_NO_IP_ADDRESSES _HRESULT_TYPEDEF_(0x80090335L)\n#define SEC_E_WRONG_CREDENTIAL_HANDLE _HRESULT_TYPEDEF_(0x80090336L)\n#define SEC_E_CRYPTO_SYSTEM_INVALID _HRESULT_TYPEDEF_(0x80090337L)\n#define SEC_E_MAX_REFERRALS_EXCEEDED _HRESULT_TYPEDEF_(0x80090338L)\n#define SEC_E_MUST_BE_KDC _HRESULT_TYPEDEF_(0x80090339L)\n#define SEC_E_STRONG_CRYPTO_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x8009033AL)\n#define SEC_E_TOO_MANY_PRINCIPALS _HRESULT_TYPEDEF_(0x8009033BL)\n#define SEC_E_NO_PA_DATA _HRESULT_TYPEDEF_(0x8009033CL)\n#define SEC_E_PKINIT_NAME_MISMATCH _HRESULT_TYPEDEF_(0x8009033DL)\n#define SEC_E_SMARTCARD_LOGON_REQUIRED _HRESULT_TYPEDEF_(0x8009033EL)\n#define SEC_E_SHUTDOWN_IN_PROGRESS _HRESULT_TYPEDEF_(0x8009033FL)\n#define SEC_E_KDC_INVALID_REQUEST _HRESULT_TYPEDEF_(0x80090340L)\n#define SEC_E_KDC_UNABLE_TO_REFER _HRESULT_TYPEDEF_(0x80090341L)\n#define SEC_E_KDC_UNKNOWN_ETYPE _HRESULT_TYPEDEF_(0x80090342L)\n#define SEC_E_UNSUPPORTED_PREAUTH _HRESULT_TYPEDEF_(0x80090343L)\n#define SEC_E_DELEGATION_REQUIRED _HRESULT_TYPEDEF_(0x80090345L)\n#define SEC_E_BAD_BINDINGS _HRESULT_TYPEDEF_(0x80090346L)\n#define SEC_E_MULTIPLE_ACCOUNTS _HRESULT_TYPEDEF_(0x80090347L)\n#define SEC_E_NO_KERB_KEY _HRESULT_TYPEDEF_(0x80090348L)\n#define SEC_E_CERT_WRONG_USAGE _HRESULT_TYPEDEF_(0x80090349L)\n#define SEC_E_DOWNGRADE_DETECTED _HRESULT_TYPEDEF_(0x80090350L)\n#define SEC_E_SMARTCARD_CERT_REVOKED _HRESULT_TYPEDEF_(0x80090351L)\n#define SEC_E_ISSUING_CA_UNTRUSTED _HRESULT_TYPEDEF_(0x80090352L)\n#define SEC_E_REVOCATION_OFFLINE_C _HRESULT_TYPEDEF_(0x80090353L)\n#define SEC_E_PKINIT_CLIENT_FAILURE _HRESULT_TYPEDEF_(0x80090354L)\n#define SEC_E_SMARTCARD_CERT_EXPIRED _HRESULT_TYPEDEF_(0x80090355L)\n#define SEC_E_NO_S4U_PROT_SUPPORT _HRESULT_TYPEDEF_(0x80090356L)\n#define SEC_E_CROSSREALM_DELEGATION_FAILURE _HRESULT_TYPEDEF_(0x80090357L)\n#define SEC_E_REVOCATION_OFFLINE_KDC _HRESULT_TYPEDEF_(0x80090358L)\n#define SEC_E_ISSUING_CA_UNTRUSTED_KDC _HRESULT_TYPEDEF_(0x80090359L)\n#define SEC_E_KDC_CERT_EXPIRED _HRESULT_TYPEDEF_(0x8009035AL)\n#define SEC_E_KDC_CERT_REVOKED _HRESULT_TYPEDEF_(0x8009035BL)\n#define SEC_E_NO_SPM SEC_E_INTERNAL_ERROR\n#define SEC_E_NOT_SUPPORTED SEC_E_UNSUPPORTED_FUNCTION\n#define CRYPT_E_MSG_ERROR _HRESULT_TYPEDEF_(0x80091001L)\n#define CRYPT_E_UNKNOWN_ALGO _HRESULT_TYPEDEF_(0x80091002L)\n#define CRYPT_E_OID_FORMAT _HRESULT_TYPEDEF_(0x80091003L)\n#define CRYPT_E_INVALID_MSG_TYPE _HRESULT_TYPEDEF_(0x80091004L)\n#define CRYPT_E_UNEXPECTED_ENCODING _HRESULT_TYPEDEF_(0x80091005L)\n#define CRYPT_E_AUTH_ATTR_MISSING _HRESULT_TYPEDEF_(0x80091006L)\n#define CRYPT_E_HASH_VALUE _HRESULT_TYPEDEF_(0x80091007L)\n#define CRYPT_E_INVALID_INDEX _HRESULT_TYPEDEF_(0x80091008L)\n#define CRYPT_E_ALREADY_DECRYPTED _HRESULT_TYPEDEF_(0x80091009L)\n#define CRYPT_E_NOT_DECRYPTED _HRESULT_TYPEDEF_(0x8009100AL)\n#define CRYPT_E_RECIPIENT_NOT_FOUND _HRESULT_TYPEDEF_(0x8009100BL)\n#define CRYPT_E_CONTROL_TYPE _HRESULT_TYPEDEF_(0x8009100CL)\n#define CRYPT_E_ISSUER_SERIALNUMBER _HRESULT_TYPEDEF_(0x8009100DL)\n#define CRYPT_E_SIGNER_NOT_FOUND _HRESULT_TYPEDEF_(0x8009100EL)\n#define CRYPT_E_ATTRIBUTES_MISSING _HRESULT_TYPEDEF_(0x8009100FL)\n#define CRYPT_E_STREAM_MSG_NOT_READY _HRESULT_TYPEDEF_(0x80091010L)\n#define CRYPT_E_STREAM_INSUFFICIENT_DATA _HRESULT_TYPEDEF_(0x80091011L)\n#define CRYPT_I_NEW_PROTECTION_REQUIRED _HRESULT_TYPEDEF_(0x00091012L)\n#define CRYPT_E_BAD_LEN _HRESULT_TYPEDEF_(0x80092001L)\n#define CRYPT_E_BAD_ENCODE _HRESULT_TYPEDEF_(0x80092002L)\n#define CRYPT_E_FILE_ERROR _HRESULT_TYPEDEF_(0x80092003L)\n#define CRYPT_E_NOT_FOUND _HRESULT_TYPEDEF_(0x80092004L)\n#define CRYPT_E_EXISTS _HRESULT_TYPEDEF_(0x80092005L)\n#define CRYPT_E_NO_PROVIDER _HRESULT_TYPEDEF_(0x80092006L)\n#define CRYPT_E_SELF_SIGNED _HRESULT_TYPEDEF_(0x80092007L)\n#define CRYPT_E_DELETED_PREV _HRESULT_TYPEDEF_(0x80092008L)\n#define CRYPT_E_NO_MATCH _HRESULT_TYPEDEF_(0x80092009L)\n#define CRYPT_E_UNEXPECTED_MSG_TYPE _HRESULT_TYPEDEF_(0x8009200AL)\n#define CRYPT_E_NO_KEY_PROPERTY _HRESULT_TYPEDEF_(0x8009200BL)\n#define CRYPT_E_NO_DECRYPT_CERT _HRESULT_TYPEDEF_(0x8009200CL)\n#define CRYPT_E_BAD_MSG _HRESULT_TYPEDEF_(0x8009200DL)\n#define CRYPT_E_NO_SIGNER _HRESULT_TYPEDEF_(0x8009200EL)\n#define CRYPT_E_PENDING_CLOSE _HRESULT_TYPEDEF_(0x8009200FL)\n#define CRYPT_E_REVOKED _HRESULT_TYPEDEF_(0x80092010L)\n#define CRYPT_E_NO_REVOCATION_DLL _HRESULT_TYPEDEF_(0x80092011L)\n#define CRYPT_E_NO_REVOCATION_CHECK _HRESULT_TYPEDEF_(0x80092012L)\n#define CRYPT_E_REVOCATION_OFFLINE _HRESULT_TYPEDEF_(0x80092013L)\n#define CRYPT_E_NOT_IN_REVOCATION_DATABASE _HRESULT_TYPEDEF_(0x80092014L)\n#define CRYPT_E_INVALID_NUMERIC_STRING _HRESULT_TYPEDEF_(0x80092020L)\n#define CRYPT_E_INVALID_PRINTABLE_STRING _HRESULT_TYPEDEF_(0x80092021L)\n#define CRYPT_E_INVALID_IA5_STRING _HRESULT_TYPEDEF_(0x80092022L)\n#define CRYPT_E_INVALID_X500_STRING _HRESULT_TYPEDEF_(0x80092023L)\n#define CRYPT_E_NOT_CHAR_STRING _HRESULT_TYPEDEF_(0x80092024L)\n#define CRYPT_E_FILERESIZED _HRESULT_TYPEDEF_(0x80092025L)\n#define CRYPT_E_SECURITY_SETTINGS _HRESULT_TYPEDEF_(0x80092026L)\n#define CRYPT_E_NO_VERIFY_USAGE_DLL _HRESULT_TYPEDEF_(0x80092027L)\n#define CRYPT_E_NO_VERIFY_USAGE_CHECK _HRESULT_TYPEDEF_(0x80092028L)\n#define CRYPT_E_VERIFY_USAGE_OFFLINE _HRESULT_TYPEDEF_(0x80092029L)\n#define CRYPT_E_NOT_IN_CTL _HRESULT_TYPEDEF_(0x8009202AL)\n#define CRYPT_E_NO_TRUSTED_SIGNER _HRESULT_TYPEDEF_(0x8009202BL)\n#define CRYPT_E_MISSING_PUBKEY_PARA _HRESULT_TYPEDEF_(0x8009202CL)\n#define CRYPT_E_OSS_ERROR _HRESULT_TYPEDEF_(0x80093000L)\n#define OSS_MORE_BUF _HRESULT_TYPEDEF_(0x80093001L)\n#define OSS_NEGATIVE_UINTEGER _HRESULT_TYPEDEF_(0x80093002L)\n#define OSS_PDU_RANGE _HRESULT_TYPEDEF_(0x80093003L)\n#define OSS_MORE_INPUT _HRESULT_TYPEDEF_(0x80093004L)\n#define OSS_DATA_ERROR _HRESULT_TYPEDEF_(0x80093005L)\n#define OSS_BAD_ARG _HRESULT_TYPEDEF_(0x80093006L)\n#define OSS_BAD_VERSION _HRESULT_TYPEDEF_(0x80093007L)\n#define OSS_OUT_MEMORY _HRESULT_TYPEDEF_(0x80093008L)\n#define OSS_PDU_MISMATCH _HRESULT_TYPEDEF_(0x80093009L)\n#define OSS_LIMITED _HRESULT_TYPEDEF_(0x8009300AL)\n#define OSS_BAD_PTR _HRESULT_TYPEDEF_(0x8009300BL)\n#define OSS_BAD_TIME _HRESULT_TYPEDEF_(0x8009300CL)\n#define OSS_INDEFINITE_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x8009300DL)\n#define OSS_MEM_ERROR _HRESULT_TYPEDEF_(0x8009300EL)\n#define OSS_BAD_TABLE _HRESULT_TYPEDEF_(0x8009300FL)\n#define OSS_TOO_LONG _HRESULT_TYPEDEF_(0x80093010L)\n#define OSS_CONSTRAINT_VIOLATED _HRESULT_TYPEDEF_(0x80093011L)\n#define OSS_FATAL_ERROR _HRESULT_TYPEDEF_(0x80093012L)\n#define OSS_ACCESS_SERIALIZATION_ERROR _HRESULT_TYPEDEF_(0x80093013L)\n#define OSS_NULL_TBL _HRESULT_TYPEDEF_(0x80093014L)\n#define OSS_NULL_FCN _HRESULT_TYPEDEF_(0x80093015L)\n#define OSS_BAD_ENCRULES _HRESULT_TYPEDEF_(0x80093016L)\n#define OSS_UNAVAIL_ENCRULES _HRESULT_TYPEDEF_(0x80093017L)\n#define OSS_CANT_OPEN_TRACE_WINDOW _HRESULT_TYPEDEF_(0x80093018L)\n#define OSS_UNIMPLEMENTED _HRESULT_TYPEDEF_(0x80093019L)\n#define OSS_OID_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x8009301AL)\n#define OSS_CANT_OPEN_TRACE_FILE _HRESULT_TYPEDEF_(0x8009301BL)\n#define OSS_TRACE_FILE_ALREADY_OPEN _HRESULT_TYPEDEF_(0x8009301CL)\n#define OSS_TABLE_MISMATCH _HRESULT_TYPEDEF_(0x8009301DL)\n#define OSS_TYPE_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x8009301EL)\n#define OSS_REAL_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x8009301FL)\n#define OSS_REAL_CODE_NOT_LINKED _HRESULT_TYPEDEF_(0x80093020L)\n#define OSS_OUT_OF_RANGE _HRESULT_TYPEDEF_(0x80093021L)\n#define OSS_COPIER_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x80093022L)\n#define OSS_CONSTRAINT_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x80093023L)\n#define OSS_COMPARATOR_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x80093024L)\n#define OSS_COMPARATOR_CODE_NOT_LINKED _HRESULT_TYPEDEF_(0x80093025L)\n#define OSS_MEM_MGR_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x80093026L)\n#define OSS_PDV_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x80093027L)\n#define OSS_PDV_CODE_NOT_LINKED _HRESULT_TYPEDEF_(0x80093028L)\n#define OSS_API_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x80093029L)\n#define OSS_BERDER_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x8009302AL)\n#define OSS_PER_DLL_NOT_LINKED _HRESULT_TYPEDEF_(0x8009302BL)\n#define OSS_OPEN_TYPE_ERROR _HRESULT_TYPEDEF_(0x8009302CL)\n#define OSS_MUTEX_NOT_CREATED _HRESULT_TYPEDEF_(0x8009302DL)\n#define OSS_CANT_CLOSE_TRACE_FILE _HRESULT_TYPEDEF_(0x8009302EL)\n#define CRYPT_E_ASN1_ERROR _HRESULT_TYPEDEF_(0x80093100L)\n#define CRYPT_E_ASN1_INTERNAL _HRESULT_TYPEDEF_(0x80093101L)\n#define CRYPT_E_ASN1_EOD _HRESULT_TYPEDEF_(0x80093102L)\n#define CRYPT_E_ASN1_CORRUPT _HRESULT_TYPEDEF_(0x80093103L)\n#define CRYPT_E_ASN1_LARGE _HRESULT_TYPEDEF_(0x80093104L)\n#define CRYPT_E_ASN1_CONSTRAINT _HRESULT_TYPEDEF_(0x80093105L)\n#define CRYPT_E_ASN1_MEMORY _HRESULT_TYPEDEF_(0x80093106L)\n#define CRYPT_E_ASN1_OVERFLOW _HRESULT_TYPEDEF_(0x80093107L)\n#define CRYPT_E_ASN1_BADPDU _HRESULT_TYPEDEF_(0x80093108L)\n#define CRYPT_E_ASN1_BADARGS _HRESULT_TYPEDEF_(0x80093109L)\n#define CRYPT_E_ASN1_BADREAL _HRESULT_TYPEDEF_(0x8009310AL)\n#define CRYPT_E_ASN1_BADTAG _HRESULT_TYPEDEF_(0x8009310BL)\n#define CRYPT_E_ASN1_CHOICE _HRESULT_TYPEDEF_(0x8009310CL)\n#define CRYPT_E_ASN1_RULE _HRESULT_TYPEDEF_(0x8009310DL)\n#define CRYPT_E_ASN1_UTF8 _HRESULT_TYPEDEF_(0x8009310EL)\n#define CRYPT_E_ASN1_PDU_TYPE _HRESULT_TYPEDEF_(0x80093133L)\n#define CRYPT_E_ASN1_NYI _HRESULT_TYPEDEF_(0x80093134L)\n#define CRYPT_E_ASN1_EXTENDED _HRESULT_TYPEDEF_(0x80093201L)\n#define CRYPT_E_ASN1_NOEOD _HRESULT_TYPEDEF_(0x80093202L)\n#define CERTSRV_E_BAD_REQUESTSUBJECT _HRESULT_TYPEDEF_(0x80094001L)\n#define CERTSRV_E_NO_REQUEST _HRESULT_TYPEDEF_(0x80094002L)\n#define CERTSRV_E_BAD_REQUESTSTATUS _HRESULT_TYPEDEF_(0x80094003L)\n#define CERTSRV_E_PROPERTY_EMPTY _HRESULT_TYPEDEF_(0x80094004L)\n#define CERTSRV_E_INVALID_CA_CERTIFICATE _HRESULT_TYPEDEF_(0x80094005L)\n#define CERTSRV_E_SERVER_SUSPENDED _HRESULT_TYPEDEF_(0x80094006L)\n#define CERTSRV_E_ENCODING_LENGTH _HRESULT_TYPEDEF_(0x80094007L)\n#define CERTSRV_E_ROLECONFLICT _HRESULT_TYPEDEF_(0x80094008L)\n#define CERTSRV_E_RESTRICTEDOFFICER _HRESULT_TYPEDEF_(0x80094009L)\n#define CERTSRV_E_KEY_ARCHIVAL_NOT_CONFIGURED _HRESULT_TYPEDEF_(0x8009400AL)\n#define CERTSRV_E_NO_VALID_KRA _HRESULT_TYPEDEF_(0x8009400BL)\n#define CERTSRV_E_BAD_REQUEST_KEY_ARCHIVAL _HRESULT_TYPEDEF_(0x8009400CL)\n#define CERTSRV_E_NO_CAADMIN_DEFINED _HRESULT_TYPEDEF_(0x8009400DL)\n#define CERTSRV_E_BAD_RENEWAL_CERT_ATTRIBUTE _HRESULT_TYPEDEF_(0x8009400EL)\n#define CERTSRV_E_NO_DB_SESSIONS _HRESULT_TYPEDEF_(0x8009400FL)\n#define CERTSRV_E_ALIGNMENT_FAULT _HRESULT_TYPEDEF_(0x80094010L)\n#define CERTSRV_E_ENROLL_DENIED _HRESULT_TYPEDEF_(0x80094011L)\n#define CERTSRV_E_TEMPLATE_DENIED _HRESULT_TYPEDEF_(0x80094012L)\n#define CERTSRV_E_DOWNLEVEL_DC_SSL_OR_UPGRADE _HRESULT_TYPEDEF_(0x80094013L)\n#define CERTSRV_E_UNSUPPORTED_CERT_TYPE _HRESULT_TYPEDEF_(0x80094800L)\n#define CERTSRV_E_NO_CERT_TYPE _HRESULT_TYPEDEF_(0x80094801L)\n#define CERTSRV_E_TEMPLATE_CONFLICT _HRESULT_TYPEDEF_(0x80094802L)\n#define CERTSRV_E_SUBJECT_ALT_NAME_REQUIRED _HRESULT_TYPEDEF_(0x80094803L)\n#define CERTSRV_E_ARCHIVED_KEY_REQUIRED _HRESULT_TYPEDEF_(0x80094804L)\n#define CERTSRV_E_SMIME_REQUIRED _HRESULT_TYPEDEF_(0x80094805L)\n#define CERTSRV_E_BAD_RENEWAL_SUBJECT _HRESULT_TYPEDEF_(0x80094806L)\n#define CERTSRV_E_BAD_TEMPLATE_VERSION _HRESULT_TYPEDEF_(0x80094807L)\n#define CERTSRV_E_TEMPLATE_POLICY_REQUIRED _HRESULT_TYPEDEF_(0x80094808L)\n#define CERTSRV_E_SIGNATURE_POLICY_REQUIRED _HRESULT_TYPEDEF_(0x80094809L)\n#define CERTSRV_E_SIGNATURE_COUNT _HRESULT_TYPEDEF_(0x8009480AL)\n#define CERTSRV_E_SIGNATURE_REJECTED _HRESULT_TYPEDEF_(0x8009480BL)\n#define CERTSRV_E_ISSUANCE_POLICY_REQUIRED _HRESULT_TYPEDEF_(0x8009480CL)\n#define CERTSRV_E_SUBJECT_UPN_REQUIRED _HRESULT_TYPEDEF_(0x8009480DL)\n#define CERTSRV_E_SUBJECT_DIRECTORY_GUID_REQUIRED _HRESULT_TYPEDEF_(0x8009480EL)\n#define CERTSRV_E_SUBJECT_DNS_REQUIRED _HRESULT_TYPEDEF_(0x8009480FL)\n#define CERTSRV_E_ARCHIVED_KEY_UNEXPECTED _HRESULT_TYPEDEF_(0x80094810L)\n#define CERTSRV_E_KEY_LENGTH _HRESULT_TYPEDEF_(0x80094811L)\n#define CERTSRV_E_SUBJECT_EMAIL_REQUIRED _HRESULT_TYPEDEF_(0x80094812L)\n#define CERTSRV_E_UNKNOWN_CERT_TYPE _HRESULT_TYPEDEF_(0x80094813L)\n#define CERTSRV_E_CERT_TYPE_OVERLAP _HRESULT_TYPEDEF_(0x80094814L)\n#define XENROLL_E_KEY_NOT_EXPORTABLE _HRESULT_TYPEDEF_(0x80095000L)\n#define XENROLL_E_CANNOT_ADD_ROOT_CERT _HRESULT_TYPEDEF_(0x80095001L)\n#define XENROLL_E_RESPONSE_KA_HASH_NOT_FOUND _HRESULT_TYPEDEF_(0x80095002L)\n#define XENROLL_E_RESPONSE_UNEXPECTED_KA_HASH _HRESULT_TYPEDEF_(0x80095003L)\n#define XENROLL_E_RESPONSE_KA_HASH_MISMATCH _HRESULT_TYPEDEF_(0x80095004L)\n#define XENROLL_E_KEYSPEC_SMIME_MISMATCH _HRESULT_TYPEDEF_(0x80095005L)\n#define TRUST_E_SYSTEM_ERROR _HRESULT_TYPEDEF_(0x80096001L)\n#define TRUST_E_NO_SIGNER_CERT _HRESULT_TYPEDEF_(0x80096002L)\n#define TRUST_E_COUNTER_SIGNER _HRESULT_TYPEDEF_(0x80096003L)\n#define TRUST_E_CERT_SIGNATURE _HRESULT_TYPEDEF_(0x80096004L)\n#define TRUST_E_TIME_STAMP _HRESULT_TYPEDEF_(0x80096005L)\n#define TRUST_E_BAD_DIGEST _HRESULT_TYPEDEF_(0x80096010L)\n#define TRUST_E_BASIC_CONSTRAINTS _HRESULT_TYPEDEF_(0x80096019L)\n#define TRUST_E_FINANCIAL_CRITERIA _HRESULT_TYPEDEF_(0x8009601EL)\n#define MSSIPOTF_E_OUTOFMEMRANGE _HRESULT_TYPEDEF_(0x80097001L)\n#define MSSIPOTF_E_CANTGETOBJECT _HRESULT_TYPEDEF_(0x80097002L)\n#define MSSIPOTF_E_NOHEADTABLE _HRESULT_TYPEDEF_(0x80097003L)\n#define MSSIPOTF_E_BAD_MAGICNUMBER _HRESULT_TYPEDEF_(0x80097004L)\n#define MSSIPOTF_E_BAD_OFFSET_TABLE _HRESULT_TYPEDEF_(0x80097005L)\n#define MSSIPOTF_E_TABLE_TAGORDER _HRESULT_TYPEDEF_(0x80097006L)\n#define MSSIPOTF_E_TABLE_LONGWORD _HRESULT_TYPEDEF_(0x80097007L)\n#define MSSIPOTF_E_BAD_FIRST_TABLE_PLACEMENT _HRESULT_TYPEDEF_(0x80097008L)\n#define MSSIPOTF_E_TABLES_OVERLAP _HRESULT_TYPEDEF_(0x80097009L)\n#define MSSIPOTF_E_TABLE_PADBYTES _HRESULT_TYPEDEF_(0x8009700AL)\n#define MSSIPOTF_E_FILETOOSMALL _HRESULT_TYPEDEF_(0x8009700BL)\n#define MSSIPOTF_E_TABLE_CHECKSUM _HRESULT_TYPEDEF_(0x8009700CL)\n#define MSSIPOTF_E_FILE_CHECKSUM _HRESULT_TYPEDEF_(0x8009700DL)\n#define MSSIPOTF_E_FAILED_POLICY _HRESULT_TYPEDEF_(0x80097010L)\n#define MSSIPOTF_E_FAILED_HINTS_CHECK _HRESULT_TYPEDEF_(0x80097011L)\n#define MSSIPOTF_E_NOT_OPENTYPE _HRESULT_TYPEDEF_(0x80097012L)\n#define MSSIPOTF_E_FILE _HRESULT_TYPEDEF_(0x80097013L)\n#define MSSIPOTF_E_CRYPT _HRESULT_TYPEDEF_(0x80097014L)\n#define MSSIPOTF_E_BADVERSION _HRESULT_TYPEDEF_(0x80097015L)\n#define MSSIPOTF_E_DSIG_STRUCTURE _HRESULT_TYPEDEF_(0x80097016L)\n#define MSSIPOTF_E_PCONST_CHECK _HRESULT_TYPEDEF_(0x80097017L)\n#define MSSIPOTF_E_STRUCTURE _HRESULT_TYPEDEF_(0x80097018L)\n#define NTE_OP_OK 0\n#define TRUST_E_PROVIDER_UNKNOWN _HRESULT_TYPEDEF_(0x800B0001L)\n#define TRUST_E_ACTION_UNKNOWN _HRESULT_TYPEDEF_(0x800B0002L)\n#define TRUST_E_SUBJECT_FORM_UNKNOWN _HRESULT_TYPEDEF_(0x800B0003L)\n#define TRUST_E_SUBJECT_NOT_TRUSTED _HRESULT_TYPEDEF_(0x800B0004L)\n#define DIGSIG_E_ENCODE _HRESULT_TYPEDEF_(0x800B0005L)\n#define DIGSIG_E_DECODE _HRESULT_TYPEDEF_(0x800B0006L)\n#define DIGSIG_E_EXTENSIBILITY _HRESULT_TYPEDEF_(0x800B0007L)\n#define DIGSIG_E_CRYPTO _HRESULT_TYPEDEF_(0x800B0008L)\n#define PERSIST_E_SIZEDEFINITE _HRESULT_TYPEDEF_(0x800B0009L)\n#define PERSIST_E_SIZEINDEFINITE _HRESULT_TYPEDEF_(0x800B000AL)\n#define PERSIST_E_NOTSELFSIZING _HRESULT_TYPEDEF_(0x800B000BL)\n#define TRUST_E_NOSIGNATURE _HRESULT_TYPEDEF_(0x800B0100L)\n#define CERT_E_EXPIRED _HRESULT_TYPEDEF_(0x800B0101L)\n#define CERT_E_VALIDITYPERIODNESTING _HRESULT_TYPEDEF_(0x800B0102L)\n#define CERT_E_ROLE _HRESULT_TYPEDEF_(0x800B0103L)\n#define CERT_E_PATHLENCONST _HRESULT_TYPEDEF_(0x800B0104L)\n#define CERT_E_CRITICAL _HRESULT_TYPEDEF_(0x800B0105L)\n#define CERT_E_PURPOSE _HRESULT_TYPEDEF_(0x800B0106L)\n#define CERT_E_ISSUERCHAINING _HRESULT_TYPEDEF_(0x800B0107L)\n#define CERT_E_MALFORMED _HRESULT_TYPEDEF_(0x800B0108L)\n#define CERT_E_UNTRUSTEDROOT _HRESULT_TYPEDEF_(0x800B0109L)\n#define CERT_E_CHAINING _HRESULT_TYPEDEF_(0x800B010AL)\n#define TRUST_E_FAIL _HRESULT_TYPEDEF_(0x800B010BL)\n#define CERT_E_REVOKED _HRESULT_TYPEDEF_(0x800B010CL)\n#define CERT_E_UNTRUSTEDTESTROOT _HRESULT_TYPEDEF_(0x800B010DL)\n#define CERT_E_REVOCATION_FAILURE _HRESULT_TYPEDEF_(0x800B010EL)\n#define CERT_E_CN_NO_MATCH _HRESULT_TYPEDEF_(0x800B010FL)\n#define CERT_E_WRONG_USAGE _HRESULT_TYPEDEF_(0x800B0110L)\n#define TRUST_E_EXPLICIT_DISTRUST _HRESULT_TYPEDEF_(0x800B0111L)\n#define CERT_E_UNTRUSTEDCA _HRESULT_TYPEDEF_(0x800B0112L)\n#define CERT_E_INVALID_POLICY _HRESULT_TYPEDEF_(0x800B0113L)\n#define CERT_E_INVALID_NAME _HRESULT_TYPEDEF_(0x800B0114L)\n#define HRESULT_FROM_SETUPAPI(x) ((((x) & (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR))==(APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR)) ? ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_SETUPAPI << 16) | 0x80000000)) : HRESULT_FROM_WIN32(x))\n#define SPAPI_E_EXPECTED_SECTION_NAME _HRESULT_TYPEDEF_(0x800F0000L)\n#define SPAPI_E_BAD_SECTION_NAME_LINE _HRESULT_TYPEDEF_(0x800F0001L)\n#define SPAPI_E_SECTION_NAME_TOO_LONG _HRESULT_TYPEDEF_(0x800F0002L)\n#define SPAPI_E_GENERAL_SYNTAX _HRESULT_TYPEDEF_(0x800F0003L)\n#define SPAPI_E_WRONG_INF_STYLE _HRESULT_TYPEDEF_(0x800F0100L)\n#define SPAPI_E_SECTION_NOT_FOUND _HRESULT_TYPEDEF_(0x800F0101L)\n#define SPAPI_E_LINE_NOT_FOUND _HRESULT_TYPEDEF_(0x800F0102L)\n#define SPAPI_E_NO_BACKUP _HRESULT_TYPEDEF_(0x800F0103L)\n#define SPAPI_E_NO_ASSOCIATED_CLASS _HRESULT_TYPEDEF_(0x800F0200L)\n#define SPAPI_E_CLASS_MISMATCH _HRESULT_TYPEDEF_(0x800F0201L)\n#define SPAPI_E_DUPLICATE_FOUND _HRESULT_TYPEDEF_(0x800F0202L)\n#define SPAPI_E_NO_DRIVER_SELECTED _HRESULT_TYPEDEF_(0x800F0203L)\n#define SPAPI_E_KEY_DOES_NOT_EXIST _HRESULT_TYPEDEF_(0x800F0204L)\n#define SPAPI_E_INVALID_DEVINST_NAME _HRESULT_TYPEDEF_(0x800F0205L)\n#define SPAPI_E_INVALID_CLASS _HRESULT_TYPEDEF_(0x800F0206L)\n#define SPAPI_E_DEVINST_ALREADY_EXISTS _HRESULT_TYPEDEF_(0x800F0207L)\n#define SPAPI_E_DEVINFO_NOT_REGISTERED _HRESULT_TYPEDEF_(0x800F0208L)\n#define SPAPI_E_INVALID_REG_PROPERTY _HRESULT_TYPEDEF_(0x800F0209L)\n#define SPAPI_E_NO_INF _HRESULT_TYPEDEF_(0x800F020AL)\n#define SPAPI_E_NO_SUCH_DEVINST _HRESULT_TYPEDEF_(0x800F020BL)\n#define SPAPI_E_CANT_LOAD_CLASS_ICON _HRESULT_TYPEDEF_(0x800F020CL)\n#define SPAPI_E_INVALID_CLASS_INSTALLER _HRESULT_TYPEDEF_(0x800F020DL)\n#define SPAPI_E_DI_DO_DEFAULT _HRESULT_TYPEDEF_(0x800F020EL)\n#define SPAPI_E_DI_NOFILECOPY _HRESULT_TYPEDEF_(0x800F020FL)\n#define SPAPI_E_INVALID_HWPROFILE _HRESULT_TYPEDEF_(0x800F0210L)\n#define SPAPI_E_NO_DEVICE_SELECTED _HRESULT_TYPEDEF_(0x800F0211L)\n#define SPAPI_E_DEVINFO_LIST_LOCKED _HRESULT_TYPEDEF_(0x800F0212L)\n#define SPAPI_E_DEVINFO_DATA_LOCKED _HRESULT_TYPEDEF_(0x800F0213L)\n#define SPAPI_E_DI_BAD_PATH _HRESULT_TYPEDEF_(0x800F0214L)\n#define SPAPI_E_NO_CLASSINSTALL_PARAMS _HRESULT_TYPEDEF_(0x800F0215L)\n#define SPAPI_E_FILEQUEUE_LOCKED _HRESULT_TYPEDEF_(0x800F0216L)\n#define SPAPI_E_BAD_SERVICE_INSTALLSECT _HRESULT_TYPEDEF_(0x800F0217L)\n#define SPAPI_E_NO_CLASS_DRIVER_LIST _HRESULT_TYPEDEF_(0x800F0218L)\n#define SPAPI_E_NO_ASSOCIATED_SERVICE _HRESULT_TYPEDEF_(0x800F0219L)\n#define SPAPI_E_NO_DEFAULT_DEVICE_INTERFACE _HRESULT_TYPEDEF_(0x800F021AL)\n#define SPAPI_E_DEVICE_INTERFACE_ACTIVE _HRESULT_TYPEDEF_(0x800F021BL)\n#define SPAPI_E_DEVICE_INTERFACE_REMOVED _HRESULT_TYPEDEF_(0x800F021CL)\n#define SPAPI_E_BAD_INTERFACE_INSTALLSECT _HRESULT_TYPEDEF_(0x800F021DL)\n#define SPAPI_E_NO_SUCH_INTERFACE_CLASS _HRESULT_TYPEDEF_(0x800F021EL)\n#define SPAPI_E_INVALID_REFERENCE_STRING _HRESULT_TYPEDEF_(0x800F021FL)\n#define SPAPI_E_INVALID_MACHINENAME _HRESULT_TYPEDEF_(0x800F0220L)\n#define SPAPI_E_REMOTE_COMM_FAILURE _HRESULT_TYPEDEF_(0x800F0221L)\n#define SPAPI_E_MACHINE_UNAVAILABLE _HRESULT_TYPEDEF_(0x800F0222L)\n#define SPAPI_E_NO_CONFIGMGR_SERVICES _HRESULT_TYPEDEF_(0x800F0223L)\n#define SPAPI_E_INVALID_PROPPAGE_PROVIDER _HRESULT_TYPEDEF_(0x800F0224L)\n#define SPAPI_E_NO_SUCH_DEVICE_INTERFACE _HRESULT_TYPEDEF_(0x800F0225L)\n#define SPAPI_E_DI_POSTPROCESSING_REQUIRED _HRESULT_TYPEDEF_(0x800F0226L)\n#define SPAPI_E_INVALID_COINSTALLER _HRESULT_TYPEDEF_(0x800F0227L)\n#define SPAPI_E_NO_COMPAT_DRIVERS _HRESULT_TYPEDEF_(0x800F0228L)\n#define SPAPI_E_NO_DEVICE_ICON _HRESULT_TYPEDEF_(0x800F0229L)\n#define SPAPI_E_INVALID_INF_LOGCONFIG _HRESULT_TYPEDEF_(0x800F022AL)\n#define SPAPI_E_DI_DONT_INSTALL _HRESULT_TYPEDEF_(0x800F022BL)\n#define SPAPI_E_INVALID_FILTER_DRIVER _HRESULT_TYPEDEF_(0x800F022CL)\n#define SPAPI_E_NON_WINDOWS_NT_DRIVER _HRESULT_TYPEDEF_(0x800F022DL)\n#define SPAPI_E_NON_WINDOWS_DRIVER _HRESULT_TYPEDEF_(0x800F022EL)\n#define SPAPI_E_NO_CATALOG_FOR_OEM_INF _HRESULT_TYPEDEF_(0x800F022FL)\n#define SPAPI_E_DEVINSTALL_QUEUE_NONNATIVE _HRESULT_TYPEDEF_(0x800F0230L)\n#define SPAPI_E_NOT_DISABLEABLE _HRESULT_TYPEDEF_(0x800F0231L)\n#define SPAPI_E_CANT_REMOVE_DEVINST _HRESULT_TYPEDEF_(0x800F0232L)\n#define SPAPI_E_INVALID_TARGET _HRESULT_TYPEDEF_(0x800F0233L)\n#define SPAPI_E_DRIVER_NONNATIVE _HRESULT_TYPEDEF_(0x800F0234L)\n#define SPAPI_E_IN_WOW64 _HRESULT_TYPEDEF_(0x800F0235L)\n#define SPAPI_E_SET_SYSTEM_RESTORE_POINT _HRESULT_TYPEDEF_(0x800F0236L)\n#define SPAPI_E_INCORRECTLY_COPIED_INF _HRESULT_TYPEDEF_(0x800F0237L)\n#define SPAPI_E_SCE_DISABLED _HRESULT_TYPEDEF_(0x800F0238L)\n#define SPAPI_E_UNKNOWN_EXCEPTION _HRESULT_TYPEDEF_(0x800F0239L)\n#define SPAPI_E_PNP_REGISTRY_ERROR _HRESULT_TYPEDEF_(0x800F023AL)\n#define SPAPI_E_REMOTE_REQUEST_UNSUPPORTED _HRESULT_TYPEDEF_(0x800F023BL)\n#define SPAPI_E_NOT_AN_INSTALLED_OEM_INF _HRESULT_TYPEDEF_(0x800F023CL)\n#define SPAPI_E_INF_IN_USE_BY_DEVICES _HRESULT_TYPEDEF_(0x800F023DL)\n#define SPAPI_E_DI_FUNCTION_OBSOLETE _HRESULT_TYPEDEF_(0x800F023EL)\n#define SPAPI_E_NO_AUTHENTICODE_CATALOG _HRESULT_TYPEDEF_(0x800F023FL)\n#define SPAPI_E_AUTHENTICODE_DISALLOWED _HRESULT_TYPEDEF_(0x800F0240L)\n#define SPAPI_E_AUTHENTICODE_TRUSTED_PUBLISHER _HRESULT_TYPEDEF_(0x800F0241L)\n#define SPAPI_E_AUTHENTICODE_TRUST_NOT_ESTABLISHED _HRESULT_TYPEDEF_(0x800F0242L)\n#define SPAPI_E_AUTHENTICODE_PUBLISHER_NOT_TRUSTED _HRESULT_TYPEDEF_(0x800F0243L)\n#define SPAPI_E_SIGNATURE_OSATTRIBUTE_MISMATCH _HRESULT_TYPEDEF_(0x800F0244L)\n#define SPAPI_E_ONLY_VALIDATE_VIA_AUTHENTICODE _HRESULT_TYPEDEF_(0x800F0245L)\n#define SPAPI_E_UNRECOVERABLE_STACK_OVERFLOW _HRESULT_TYPEDEF_(0x800F0300L)\n#define SPAPI_E_ERROR_NOT_INSTALLED _HRESULT_TYPEDEF_(0x800F1000L)\n#define SCARD_S_SUCCESS NO_ERROR\n#define SCARD_F_INTERNAL_ERROR _HRESULT_TYPEDEF_(0x80100001L)\n#define SCARD_E_CANCELLED _HRESULT_TYPEDEF_(0x80100002L)\n#define SCARD_E_INVALID_HANDLE _HRESULT_TYPEDEF_(0x80100003L)\n#define SCARD_E_INVALID_PARAMETER _HRESULT_TYPEDEF_(0x80100004L)\n#define SCARD_E_INVALID_TARGET _HRESULT_TYPEDEF_(0x80100005L)\n#define SCARD_E_NO_MEMORY _HRESULT_TYPEDEF_(0x80100006L)\n#define SCARD_F_WAITED_TOO_LONG _HRESULT_TYPEDEF_(0x80100007L)\n#define SCARD_E_INSUFFICIENT_BUFFER _HRESULT_TYPEDEF_(0x80100008L)\n#define SCARD_E_UNKNOWN_READER _HRESULT_TYPEDEF_(0x80100009L)\n#define SCARD_E_TIMEOUT _HRESULT_TYPEDEF_(0x8010000AL)\n#define SCARD_E_SHARING_VIOLATION _HRESULT_TYPEDEF_(0x8010000BL)\n#define SCARD_E_NO_SMARTCARD _HRESULT_TYPEDEF_(0x8010000CL)\n#define SCARD_E_UNKNOWN_CARD _HRESULT_TYPEDEF_(0x8010000DL)\n#define SCARD_E_CANT_DISPOSE _HRESULT_TYPEDEF_(0x8010000EL)\n#define SCARD_E_PROTO_MISMATCH _HRESULT_TYPEDEF_(0x8010000FL)\n#define SCARD_E_NOT_READY _HRESULT_TYPEDEF_(0x80100010L)\n#define SCARD_E_INVALID_VALUE _HRESULT_TYPEDEF_(0x80100011L)\n#define SCARD_E_SYSTEM_CANCELLED _HRESULT_TYPEDEF_(0x80100012L)\n#define SCARD_F_COMM_ERROR _HRESULT_TYPEDEF_(0x80100013L)\n#define SCARD_F_UNKNOWN_ERROR _HRESULT_TYPEDEF_(0x80100014L)\n#define SCARD_E_INVALID_ATR _HRESULT_TYPEDEF_(0x80100015L)\n#define SCARD_E_NOT_TRANSACTED _HRESULT_TYPEDEF_(0x80100016L)\n#define SCARD_E_READER_UNAVAILABLE _HRESULT_TYPEDEF_(0x80100017L)\n#define SCARD_P_SHUTDOWN _HRESULT_TYPEDEF_(0x80100018L)\n#define SCARD_E_PCI_TOO_SMALL _HRESULT_TYPEDEF_(0x80100019L)\n#define SCARD_E_READER_UNSUPPORTED _HRESULT_TYPEDEF_(0x8010001AL)\n#define SCARD_E_DUPLICATE_READER _HRESULT_TYPEDEF_(0x8010001BL)\n#define SCARD_E_CARD_UNSUPPORTED _HRESULT_TYPEDEF_(0x8010001CL)\n#define SCARD_E_NO_SERVICE _HRESULT_TYPEDEF_(0x8010001DL)\n#define SCARD_E_SERVICE_STOPPED _HRESULT_TYPEDEF_(0x8010001EL)\n#define SCARD_E_UNEXPECTED _HRESULT_TYPEDEF_(0x8010001FL)\n#define SCARD_E_ICC_INSTALLATION _HRESULT_TYPEDEF_(0x80100020L)\n#define SCARD_E_ICC_CREATEORDER _HRESULT_TYPEDEF_(0x80100021L)\n#define SCARD_E_UNSUPPORTED_FEATURE _HRESULT_TYPEDEF_(0x80100022L)\n#define SCARD_E_DIR_NOT_FOUND _HRESULT_TYPEDEF_(0x80100023L)\n#define SCARD_E_FILE_NOT_FOUND _HRESULT_TYPEDEF_(0x80100024L)\n#define SCARD_E_NO_DIR _HRESULT_TYPEDEF_(0x80100025L)\n#define SCARD_E_NO_FILE _HRESULT_TYPEDEF_(0x80100026L)\n#define SCARD_E_NO_ACCESS _HRESULT_TYPEDEF_(0x80100027L)\n#define SCARD_E_WRITE_TOO_MANY _HRESULT_TYPEDEF_(0x80100028L)\n#define SCARD_E_BAD_SEEK _HRESULT_TYPEDEF_(0x80100029L)\n#define SCARD_E_INVALID_CHV _HRESULT_TYPEDEF_(0x8010002AL)\n#define SCARD_E_UNKNOWN_RES_MNG _HRESULT_TYPEDEF_(0x8010002BL)\n#define SCARD_E_NO_SUCH_CERTIFICATE _HRESULT_TYPEDEF_(0x8010002CL)\n#define SCARD_E_CERTIFICATE_UNAVAILABLE _HRESULT_TYPEDEF_(0x8010002DL)\n#define SCARD_E_NO_READERS_AVAILABLE _HRESULT_TYPEDEF_(0x8010002EL)\n#define SCARD_E_COMM_DATA_LOST _HRESULT_TYPEDEF_(0x8010002FL)\n#define SCARD_E_NO_KEY_CONTAINER _HRESULT_TYPEDEF_(0x80100030L)\n#define SCARD_E_SERVER_TOO_BUSY _HRESULT_TYPEDEF_(0x80100031L)\n#define SCARD_W_UNSUPPORTED_CARD _HRESULT_TYPEDEF_(0x80100065L)\n#define SCARD_W_UNRESPONSIVE_CARD _HRESULT_TYPEDEF_(0x80100066L)\n#define SCARD_W_UNPOWERED_CARD _HRESULT_TYPEDEF_(0x80100067L)\n#define SCARD_W_RESET_CARD _HRESULT_TYPEDEF_(0x80100068L)\n#define SCARD_W_REMOVED_CARD _HRESULT_TYPEDEF_(0x80100069L)\n#define SCARD_W_SECURITY_VIOLATION _HRESULT_TYPEDEF_(0x8010006AL)\n#define SCARD_W_WRONG_CHV _HRESULT_TYPEDEF_(0x8010006BL)\n#define SCARD_W_CHV_BLOCKED _HRESULT_TYPEDEF_(0x8010006CL)\n#define SCARD_W_EOF _HRESULT_TYPEDEF_(0x8010006DL)\n#define SCARD_W_CANCELLED_BY_USER _HRESULT_TYPEDEF_(0x8010006EL)\n#define SCARD_W_CARD_NOT_AUTHENTICATED _HRESULT_TYPEDEF_(0x8010006FL)\n#define COMADMIN_E_OBJECTERRORS _HRESULT_TYPEDEF_(0x80110401L)\n#define COMADMIN_E_OBJECTINVALID _HRESULT_TYPEDEF_(0x80110402L)\n#define COMADMIN_E_KEYMISSING _HRESULT_TYPEDEF_(0x80110403L)\n#define COMADMIN_E_ALREADYINSTALLED _HRESULT_TYPEDEF_(0x80110404L)\n#define COMADMIN_E_APP_FILE_WRITEFAIL _HRESULT_TYPEDEF_(0x80110407L)\n#define COMADMIN_E_APP_FILE_READFAIL _HRESULT_TYPEDEF_(0x80110408L)\n#define COMADMIN_E_APP_FILE_VERSION _HRESULT_TYPEDEF_(0x80110409L)\n#define COMADMIN_E_BADPATH _HRESULT_TYPEDEF_(0x8011040AL)\n#define COMADMIN_E_APPLICATIONEXISTS _HRESULT_TYPEDEF_(0x8011040BL)\n#define COMADMIN_E_ROLEEXISTS _HRESULT_TYPEDEF_(0x8011040CL)\n#define COMADMIN_E_CANTCOPYFILE _HRESULT_TYPEDEF_(0x8011040DL)\n#define COMADMIN_E_NOUSER _HRESULT_TYPEDEF_(0x8011040FL)\n#define COMADMIN_E_INVALIDUSERIDS _HRESULT_TYPEDEF_(0x80110410L)\n#define COMADMIN_E_NOREGISTRYCLSID _HRESULT_TYPEDEF_(0x80110411L)\n#define COMADMIN_E_BADREGISTRYPROGID _HRESULT_TYPEDEF_(0x80110412L)\n#define COMADMIN_E_AUTHENTICATIONLEVEL _HRESULT_TYPEDEF_(0x80110413L)\n#define COMADMIN_E_USERPASSWDNOTVALID _HRESULT_TYPEDEF_(0x80110414L)\n#define COMADMIN_E_CLSIDORIIDMISMATCH _HRESULT_TYPEDEF_(0x80110418L)\n#define COMADMIN_E_REMOTEINTERFACE _HRESULT_TYPEDEF_(0x80110419L)\n#define COMADMIN_E_DLLREGISTERSERVER _HRESULT_TYPEDEF_(0x8011041AL)\n#define COMADMIN_E_NOSERVERSHARE _HRESULT_TYPEDEF_(0x8011041BL)\n#define COMADMIN_E_DLLLOADFAILED _HRESULT_TYPEDEF_(0x8011041DL)\n#define COMADMIN_E_BADREGISTRYLIBID _HRESULT_TYPEDEF_(0x8011041EL)\n#define COMADMIN_E_APPDIRNOTFOUND _HRESULT_TYPEDEF_(0x8011041FL)\n#define COMADMIN_E_REGISTRARFAILED _HRESULT_TYPEDEF_(0x80110423L)\n#define COMADMIN_E_COMPFILE_DOESNOTEXIST _HRESULT_TYPEDEF_(0x80110424L)\n#define COMADMIN_E_COMPFILE_LOADDLLFAIL _HRESULT_TYPEDEF_(0x80110425L)\n#define COMADMIN_E_COMPFILE_GETCLASSOBJ _HRESULT_TYPEDEF_(0x80110426L)\n#define COMADMIN_E_COMPFILE_CLASSNOTAVAIL _HRESULT_TYPEDEF_(0x80110427L)\n#define COMADMIN_E_COMPFILE_BADTLB _HRESULT_TYPEDEF_(0x80110428L)\n#define COMADMIN_E_COMPFILE_NOTINSTALLABLE _HRESULT_TYPEDEF_(0x80110429L)\n#define COMADMIN_E_NOTCHANGEABLE _HRESULT_TYPEDEF_(0x8011042AL)\n#define COMADMIN_E_NOTDELETEABLE _HRESULT_TYPEDEF_(0x8011042BL)\n#define COMADMIN_E_SESSION _HRESULT_TYPEDEF_(0x8011042CL)\n#define COMADMIN_E_COMP_MOVE_LOCKED _HRESULT_TYPEDEF_(0x8011042DL)\n#define COMADMIN_E_COMP_MOVE_BAD_DEST _HRESULT_TYPEDEF_(0x8011042EL)\n#define COMADMIN_E_REGISTERTLB _HRESULT_TYPEDEF_(0x80110430L)\n#define COMADMIN_E_SYSTEMAPP _HRESULT_TYPEDEF_(0x80110433L)\n#define COMADMIN_E_COMPFILE_NOREGISTRAR _HRESULT_TYPEDEF_(0x80110434L)\n#define COMADMIN_E_COREQCOMPINSTALLED _HRESULT_TYPEDEF_(0x80110435L)\n#define COMADMIN_E_SERVICENOTINSTALLED _HRESULT_TYPEDEF_(0x80110436L)\n#define COMADMIN_E_PROPERTYSAVEFAILED _HRESULT_TYPEDEF_(0x80110437L)\n#define COMADMIN_E_OBJECTEXISTS _HRESULT_TYPEDEF_(0x80110438L)\n#define COMADMIN_E_COMPONENTEXISTS _HRESULT_TYPEDEF_(0x80110439L)\n#define COMADMIN_E_REGFILE_CORRUPT _HRESULT_TYPEDEF_(0x8011043BL)\n#define COMADMIN_E_PROPERTY_OVERFLOW _HRESULT_TYPEDEF_(0x8011043CL)\n#define COMADMIN_E_NOTINREGISTRY _HRESULT_TYPEDEF_(0x8011043EL)\n#define COMADMIN_E_OBJECTNOTPOOLABLE _HRESULT_TYPEDEF_(0x8011043FL)\n#define COMADMIN_E_APPLID_MATCHES_CLSID _HRESULT_TYPEDEF_(0x80110446L)\n#define COMADMIN_E_ROLE_DOES_NOT_EXIST _HRESULT_TYPEDEF_(0x80110447L)\n#define COMADMIN_E_START_APP_NEEDS_COMPONENTS _HRESULT_TYPEDEF_(0x80110448L)\n#define COMADMIN_E_REQUIRES_DIFFERENT_PLATFORM _HRESULT_TYPEDEF_(0x80110449L)\n#define COMADMIN_E_CAN_NOT_EXPORT_APP_PROXY _HRESULT_TYPEDEF_(0x8011044AL)\n#define COMADMIN_E_CAN_NOT_START_APP _HRESULT_TYPEDEF_(0x8011044BL)\n#define COMADMIN_E_CAN_NOT_EXPORT_SYS_APP _HRESULT_TYPEDEF_(0x8011044CL)\n#define COMADMIN_E_CANT_SUBSCRIBE_TO_COMPONENT _HRESULT_TYPEDEF_(0x8011044DL)\n#define COMADMIN_E_EVENTCLASS_CANT_BE_SUBSCRIBER _HRESULT_TYPEDEF_(0x8011044EL)\n#define COMADMIN_E_LIB_APP_PROXY_INCOMPATIBLE _HRESULT_TYPEDEF_(0x8011044FL)\n#define COMADMIN_E_BASE_PARTITION_ONLY _HRESULT_TYPEDEF_(0x80110450L)\n#define COMADMIN_E_START_APP_DISABLED _HRESULT_TYPEDEF_(0x80110451L)\n#define COMADMIN_E_CAT_DUPLICATE_PARTITION_NAME _HRESULT_TYPEDEF_(0x80110457L)\n#define COMADMIN_E_CAT_INVALID_PARTITION_NAME _HRESULT_TYPEDEF_(0x80110458L)\n#define COMADMIN_E_CAT_PARTITION_IN_USE _HRESULT_TYPEDEF_(0x80110459L)\n#define COMADMIN_E_FILE_PARTITION_DUPLICATE_FILES _HRESULT_TYPEDEF_(0x8011045AL)\n#define COMADMIN_E_CAT_IMPORTED_COMPONENTS_NOT_ALLOWED _HRESULT_TYPEDEF_(0x8011045BL)\n#define COMADMIN_E_AMBIGUOUS_APPLICATION_NAME _HRESULT_TYPEDEF_(0x8011045CL)\n#define COMADMIN_E_AMBIGUOUS_PARTITION_NAME _HRESULT_TYPEDEF_(0x8011045DL)\n#define COMADMIN_E_REGDB_NOTINITIALIZED _HRESULT_TYPEDEF_(0x80110472L)\n#define COMADMIN_E_REGDB_NOTOPEN _HRESULT_TYPEDEF_(0x80110473L)\n#define COMADMIN_E_REGDB_SYSTEMERR _HRESULT_TYPEDEF_(0x80110474L)\n#define COMADMIN_E_REGDB_ALREADYRUNNING _HRESULT_TYPEDEF_(0x80110475L)\n#define COMADMIN_E_MIG_VERSIONNOTSUPPORTED _HRESULT_TYPEDEF_(0x80110480L)\n#define COMADMIN_E_MIG_SCHEMANOTFOUND _HRESULT_TYPEDEF_(0x80110481L)\n#define COMADMIN_E_CAT_BITNESSMISMATCH _HRESULT_TYPEDEF_(0x80110482L)\n#define COMADMIN_E_CAT_UNACCEPTABLEBITNESS _HRESULT_TYPEDEF_(0x80110483L)\n#define COMADMIN_E_CAT_WRONGAPPBITNESS _HRESULT_TYPEDEF_(0x80110484L)\n#define COMADMIN_E_CAT_PAUSE_RESUME_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x80110485L)\n#define COMADMIN_E_CAT_SERVERFAULT _HRESULT_TYPEDEF_(0x80110486L)\n#define COMQC_E_APPLICATION_NOT_QUEUED _HRESULT_TYPEDEF_(0x80110600L)\n#define COMQC_E_NO_QUEUEABLE_INTERFACES _HRESULT_TYPEDEF_(0x80110601L)\n#define COMQC_E_QUEUING_SERVICE_NOT_AVAILABLE _HRESULT_TYPEDEF_(0x80110602L)\n#define COMQC_E_NO_IPERSISTSTREAM _HRESULT_TYPEDEF_(0x80110603L)\n#define COMQC_E_BAD_MESSAGE _HRESULT_TYPEDEF_(0x80110604L)\n#define COMQC_E_UNAUTHENTICATED _HRESULT_TYPEDEF_(0x80110605L)\n#define COMQC_E_UNTRUSTED_ENQUEUER _HRESULT_TYPEDEF_(0x80110606L)\n#define MSDTC_E_DUPLICATE_RESOURCE _HRESULT_TYPEDEF_(0x80110701L)\n#define COMADMIN_E_OBJECT_PARENT_MISSING _HRESULT_TYPEDEF_(0x80110808L)\n#define COMADMIN_E_OBJECT_DOES_NOT_EXIST _HRESULT_TYPEDEF_(0x80110809L)\n#define COMADMIN_E_APP_NOT_RUNNING _HRESULT_TYPEDEF_(0x8011080AL)\n#define COMADMIN_E_INVALID_PARTITION _HRESULT_TYPEDEF_(0x8011080BL)\n#define COMADMIN_E_SVCAPP_NOT_POOLABLE_OR_RECYCLABLE _HRESULT_TYPEDEF_(0x8011080DL)\n#define COMADMIN_E_USER_IN_SET _HRESULT_TYPEDEF_(0x8011080EL)\n#define COMADMIN_E_CANTRECYCLELIBRARYAPPS _HRESULT_TYPEDEF_(0x8011080FL)\n#define COMADMIN_E_CANTRECYCLESERVICEAPPS _HRESULT_TYPEDEF_(0x80110811L)\n#define COMADMIN_E_PROCESSALREADYRECYCLED _HRESULT_TYPEDEF_(0x80110812L)\n#define COMADMIN_E_PAUSEDPROCESSMAYNOTBERECYCLED _HRESULT_TYPEDEF_(0x80110813L)\n#define COMADMIN_E_CANTMAKEINPROCSERVICE _HRESULT_TYPEDEF_(0x80110814L)\n#define COMADMIN_E_PROGIDINUSEBYCLSID _HRESULT_TYPEDEF_(0x80110815L)\n#define COMADMIN_E_DEFAULT_PARTITION_NOT_IN_SET _HRESULT_TYPEDEF_(0x80110816L)\n#define COMADMIN_E_RECYCLEDPROCESSMAYNOTBEPAUSED _HRESULT_TYPEDEF_(0x80110817L)\n#define COMADMIN_E_PARTITION_ACCESSDENIED _HRESULT_TYPEDEF_(0x80110818L)\n#define COMADMIN_E_PARTITION_MSI_ONLY _HRESULT_TYPEDEF_(0x80110819L)\n#define COMADMIN_E_LEGACYCOMPS_NOT_ALLOWED_IN_1_0_FORMAT _HRESULT_TYPEDEF_(0x8011081AL)\n#define COMADMIN_E_LEGACYCOMPS_NOT_ALLOWED_IN_NONBASE_PARTITIONS _HRESULT_TYPEDEF_(0x8011081BL)\n#define COMADMIN_E_COMP_MOVE_SOURCE _HRESULT_TYPEDEF_(0x8011081CL)\n#define COMADMIN_E_COMP_MOVE_DEST _HRESULT_TYPEDEF_(0x8011081DL)\n#define COMADMIN_E_COMP_MOVE_PRIVATE _HRESULT_TYPEDEF_(0x8011081EL)\n#define COMADMIN_E_BASEPARTITION_REQUIRED_IN_SET _HRESULT_TYPEDEF_(0x8011081FL)\n#define COMADMIN_E_CANNOT_ALIAS_EVENTCLASS _HRESULT_TYPEDEF_(0x80110820L)\n#define COMADMIN_E_PRIVATE_ACCESSDENIED _HRESULT_TYPEDEF_(0x80110821L)\n#define COMADMIN_E_SAFERINVALID _HRESULT_TYPEDEF_(0x80110822L)\n#define COMADMIN_E_REGISTRY_ACCESSDENIED _HRESULT_TYPEDEF_(0x80110823L)\n#define COMADMIN_E_PARTITIONS_DISABLED _HRESULT_TYPEDEF_(0x80110824L)\n#endif // _WINERROR_\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/wingdi.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINGDI_\n#define _WINGDI_\n\n#define WINGDIAPI DECLSPEC_IMPORT\n#define WINSPOOLAPI DECLSPEC_IMPORT\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef WINVER\n#define WINVER 0x0502\n#endif\n\n#ifndef NOGDI\n#ifndef NORASTEROPS\n#define R2_BLACK 1\n#define R2_NOTMERGEPEN 2\n#define R2_MASKNOTPEN 3\n#define R2_NOTCOPYPEN 4\n#define R2_MASKPENNOT 5\n#define R2_NOT 6\n#define R2_XORPEN 7\n#define R2_NOTMASKPEN 8\n#define R2_MASKPEN 9\n#define R2_NOTXORPEN 10\n#define R2_NOP 11\n#define R2_MERGENOTPEN 12\n#define R2_COPYPEN 13\n#define R2_MERGEPENNOT 14\n#define R2_MERGEPEN 15\n#define R2_WHITE 16\n#define R2_LAST 16\n\n#define SRCCOPY (DWORD)0x00CC0020\n#define SRCPAINT (DWORD)0x00EE0086\n#define SRCAND (DWORD)0x008800C6\n#define SRCINVERT (DWORD)0x00660046\n#define SRCERASE (DWORD)0x00440328\n#define NOTSRCCOPY (DWORD)0x00330008\n#define NOTSRCERASE (DWORD)0x001100A6\n#define MERGECOPY (DWORD)0x00C000CA\n#define MERGEPAINT (DWORD)0x00BB0226\n#define PATCOPY (DWORD)0x00F00021\n#define PATPAINT (DWORD)0x00FB0A09\n#define PATINVERT (DWORD)0x005A0049\n#define DSTINVERT (DWORD)0x00550009\n#define BLACKNESS (DWORD)0x00000042\n#define WHITENESS (DWORD)0x00FF0062\n#define NOMIRRORBITMAP (DWORD)0x80000000\n#define CAPTUREBLT (DWORD)0x40000000\n#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore))\n#endif\n\n#define GDI_ERROR (0xFFFFFFFFL)\n#define HGDI_ERROR (LongToHandle(0xFFFFFFFFL))\n\n#define ERROR 0\n#define NULLREGION 1\n#define SIMPLEREGION 2\n#define COMPLEXREGION 3\n#define RGN_ERROR ERROR\n\n#define RGN_AND 1\n#define RGN_OR 2\n#define RGN_XOR 3\n#define RGN_DIFF 4\n#define RGN_COPY 5\n#define RGN_MIN RGN_AND\n#define RGN_MAX RGN_COPY\n\n#define BLACKONWHITE 1\n#define WHITEONBLACK 2\n#define COLORONCOLOR 3\n#define HALFTONE 4\n#define MAXSTRETCHBLTMODE 4\n\n#define STRETCH_ANDSCANS BLACKONWHITE\n#define STRETCH_ORSCANS WHITEONBLACK\n#define STRETCH_DELETESCANS COLORONCOLOR\n#define STRETCH_HALFTONE HALFTONE\n\n#define ALTERNATE 1\n#define WINDING 2\n#define POLYFILL_LAST 2\n\n#define LAYOUT_RTL 0x00000001\n#define LAYOUT_BTT 0x00000002\n#define LAYOUT_VBH 0x00000004\n#define LAYOUT_ORIENTATIONMASK (LAYOUT_RTL | LAYOUT_BTT | LAYOUT_VBH)\n#define LAYOUT_BITMAPORIENTATIONPRESERVED 0x00000008\n\n#define TA_NOUPDATECP 0\n#define TA_UPDATECP 1\n\n#define TA_LEFT 0\n#define TA_RIGHT 2\n#define TA_CENTER 6\n\n#define TA_TOP 0\n#define TA_BOTTOM 8\n#define TA_BASELINE 24\n#define TA_RTLREADING 256\n#define TA_MASK (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING)\n\n#define VTA_BASELINE TA_BASELINE\n#define VTA_LEFT TA_BOTTOM\n#define VTA_RIGHT TA_TOP\n#define VTA_CENTER TA_CENTER\n#define VTA_BOTTOM TA_RIGHT\n#define VTA_TOP TA_LEFT\n\n#define ETO_OPAQUE 0x0002\n#define ETO_CLIPPED 0x0004\n#define ETO_GLYPH_INDEX 0x0010\n#define ETO_RTLREADING 0x0080\n#define ETO_NUMERICSLOCAL 0x0400\n#define ETO_NUMERICSLATIN 0x0800\n#define ETO_IGNORELANGUAGE 0x1000\n#define ETO_PDY 0x2000\n\n#define ASPECT_FILTERING 0x0001\n\n#define DCB_RESET 0x0001\n#define DCB_ACCUMULATE 0x0002\n#define DCB_DIRTY DCB_ACCUMULATE\n#define DCB_SET (DCB_RESET | DCB_ACCUMULATE)\n#define DCB_ENABLE 0x0004\n#define DCB_DISABLE 0x0008\n\n#ifndef NOMETAFILE\n\n#define META_SETBKCOLOR 0x0201\n#define META_SETBKMODE 0x0102\n#define META_SETMAPMODE 0x0103\n#define META_SETROP2 0x0104\n#define META_SETRELABS 0x0105\n#define META_SETPOLYFILLMODE 0x0106\n#define META_SETSTRETCHBLTMODE 0x0107\n#define META_SETTEXTCHAREXTRA 0x0108\n#define META_SETTEXTCOLOR 0x0209\n#define META_SETTEXTJUSTIFICATION 0x020A\n#define META_SETWINDOWORG 0x020B\n#define META_SETWINDOWEXT 0x020C\n#define META_SETVIEWPORTORG 0x020D\n#define META_SETVIEWPORTEXT 0x020E\n#define META_OFFSETWINDOWORG 0x020F\n#define META_SCALEWINDOWEXT 0x0410\n#define META_OFFSETVIEWPORTORG 0x0211\n#define META_SCALEVIEWPORTEXT 0x0412\n#define META_LINETO 0x0213\n#define META_MOVETO 0x0214\n#define META_EXCLUDECLIPRECT 0x0415\n#define META_INTERSECTCLIPRECT 0x0416\n#define META_ARC 0x0817\n#define META_ELLIPSE 0x0418\n#define META_FLOODFILL 0x0419\n#define META_PIE 0x081A\n#define META_RECTANGLE 0x041B\n#define META_ROUNDRECT 0x061C\n#define META_PATBLT 0x061D\n#define META_SAVEDC 0x001E\n#define META_SETPIXEL 0x041F\n#define META_OFFSETCLIPRGN 0x0220\n#define META_TEXTOUT 0x0521\n#define META_BITBLT 0x0922\n#define META_STRETCHBLT 0x0B23\n#define META_POLYGON 0x0324\n#define META_POLYLINE 0x0325\n#define META_ESCAPE 0x0626\n#define META_RESTOREDC 0x0127\n#define META_FILLREGION 0x0228\n#define META_FRAMEREGION 0x0429\n#define META_INVERTREGION 0x012A\n#define META_PAINTREGION 0x012B\n#define META_SELECTCLIPREGION 0x012C\n#define META_SELECTOBJECT 0x012D\n#define META_SETTEXTALIGN 0x012E\n#define META_CHORD 0x0830\n#define META_SETMAPPERFLAGS 0x0231\n#define META_EXTTEXTOUT 0x0a32\n#define META_SETDIBTODEV 0x0d33\n#define META_SELECTPALETTE 0x0234\n#define META_REALIZEPALETTE 0x0035\n#define META_ANIMATEPALETTE 0x0436\n#define META_SETPALENTRIES 0x0037\n#define META_POLYPOLYGON 0x0538\n#define META_RESIZEPALETTE 0x0139\n#define META_DIBBITBLT 0x0940\n#define META_DIBSTRETCHBLT 0x0b41\n#define META_DIBCREATEPATTERNBRUSH 0x0142\n#define META_STRETCHDIB 0x0f43\n#define META_EXTFLOODFILL 0x0548\n#define META_SETLAYOUT 0x0149\n#define META_DELETEOBJECT 0x01f0\n#define META_CREATEPALETTE 0x00f7\n#define META_CREATEPATTERNBRUSH 0x01F9\n#define META_CREATEPENINDIRECT 0x02FA\n#define META_CREATEFONTINDIRECT 0x02FB\n#define META_CREATEBRUSHINDIRECT 0x02FC\n#define META_CREATEREGION 0x06FF\n\n  typedef struct _DRAWPATRECT {\n    POINT ptPosition;\n    POINT ptSize;\n    WORD wStyle;\n    WORD wPattern;\n  } DRAWPATRECT,*PDRAWPATRECT;\n#endif\n\n#define NEWFRAME 1\n#define ABORTDOC 2\n#define NEXTBAND 3\n#define SETCOLORTABLE 4\n#define GETCOLORTABLE 5\n#define FLUSHOUTPUT 6\n#define DRAFTMODE 7\n#define QUERYESCSUPPORT 8\n#define SETABORTPROC 9\n#define STARTDOC 10\n#define ENDDOC 11\n#define GETPHYSPAGESIZE 12\n#define GETPRINTINGOFFSET 13\n#define GETSCALINGFACTOR 14\n#define MFCOMMENT 15\n#define GETPENWIDTH 16\n#define SETCOPYCOUNT 17\n#define SELECTPAPERSOURCE 18\n#define DEVICEDATA 19\n#define PASSTHROUGH 19\n#define GETTECHNOLGY 20\n#define GETTECHNOLOGY 20\n#define SETLINECAP 21\n#define SETLINEJOIN 22\n#define SETMITERLIMIT 23\n#define BANDINFO 24\n#define DRAWPATTERNRECT 25\n#define GETVECTORPENSIZE 26\n#define GETVECTORBRUSHSIZE 27\n#define ENABLEDUPLEX 28\n#define GETSETPAPERBINS 29\n#define GETSETPRINTORIENT 30\n#define ENUMPAPERBINS 31\n#define SETDIBSCALING 32\n#define EPSPRINTING 33\n#define ENUMPAPERMETRICS 34\n#define GETSETPAPERMETRICS 35\n#define POSTSCRIPT_DATA 37\n#define POSTSCRIPT_IGNORE 38\n#define MOUSETRAILS 39\n#define GETDEVICEUNITS 42\n\n#define GETEXTENDEDTEXTMETRICS 256\n#define GETEXTENTTABLE 257\n#define GETPAIRKERNTABLE 258\n#define GETTRACKKERNTABLE 259\n#define EXTTEXTOUT 512\n#define GETFACENAME 513\n#define DOWNLOADFACE 514\n#define ENABLERELATIVEWIDTHS 768\n#define ENABLEPAIRKERNING 769\n#define SETKERNTRACK 770\n#define SETALLJUSTVALUES 771\n#define SETCHARSET 772\n\n#define STRETCHBLT 2048\n#define METAFILE_DRIVER 2049\n#define GETSETSCREENPARAMS 3072\n#define QUERYDIBSUPPORT 3073\n#define BEGIN_PATH 4096\n#define CLIP_TO_PATH 4097\n#define END_PATH 4098\n#define EXT_DEVICE_CAPS 4099\n#define RESTORE_CTM 4100\n#define SAVE_CTM 4101\n#define SET_ARC_DIRECTION 4102\n#define SET_BACKGROUND_COLOR 4103\n#define SET_POLY_MODE 4104\n#define SET_SCREEN_ANGLE 4105\n#define SET_SPREAD 4106\n#define TRANSFORM_CTM 4107\n#define SET_CLIP_BOX 4108\n#define SET_BOUNDS 4109\n#define SET_MIRROR_MODE 4110\n#define OPENCHANNEL 4110\n#define DOWNLOADHEADER 4111\n#define CLOSECHANNEL 4112\n#define POSTSCRIPT_PASSTHROUGH 4115\n#define ENCAPSULATED_POSTSCRIPT 4116\n\n#define POSTSCRIPT_IDENTIFY 4117\n#define POSTSCRIPT_INJECTION 4118\n\n#define CHECKJPEGFORMAT 4119\n#define CHECKPNGFORMAT 4120\n\n#define GET_PS_FEATURESETTING 4121\n\n#define SPCLPASSTHROUGH2 4568\n\n#define PSIDENT_GDICENTRIC 0\n#define PSIDENT_PSCENTRIC 1\n\n  typedef struct _PSINJECTDATA {\n    DWORD DataBytes;\n    WORD InjectionPoint;\n    WORD PageNumber;\n  } PSINJECTDATA,*PPSINJECTDATA;\n\n#define PSINJECT_BEGINSTREAM 1\n#define PSINJECT_PSADOBE 2\n#define PSINJECT_PAGESATEND 3\n#define PSINJECT_PAGES 4\n\n#define PSINJECT_DOCNEEDEDRES 5\n#define PSINJECT_DOCSUPPLIEDRES 6\n#define PSINJECT_PAGEORDER 7\n#define PSINJECT_ORIENTATION 8\n#define PSINJECT_BOUNDINGBOX 9\n#define PSINJECT_DOCUMENTPROCESSCOLORS 10\n\n#define PSINJECT_COMMENTS 11\n#define PSINJECT_BEGINDEFAULTS 12\n#define PSINJECT_ENDDEFAULTS 13\n#define PSINJECT_BEGINPROLOG 14\n#define PSINJECT_ENDPROLOG 15\n#define PSINJECT_BEGINSETUP 16\n#define PSINJECT_ENDSETUP 17\n#define PSINJECT_TRAILER 18\n#define PSINJECT_EOF 19\n#define PSINJECT_ENDSTREAM 20\n#define PSINJECT_DOCUMENTPROCESSCOLORSATEND 21\n\n#define PSINJECT_PAGENUMBER 100\n#define PSINJECT_BEGINPAGESETUP 101\n#define PSINJECT_ENDPAGESETUP 102\n#define PSINJECT_PAGETRAILER 103\n#define PSINJECT_PLATECOLOR 104\n\n#define PSINJECT_SHOWPAGE 105\n#define PSINJECT_PAGEBBOX 106\n#define PSINJECT_ENDPAGECOMMENTS 107\n\n#define PSINJECT_VMSAVE 200\n#define PSINJECT_VMRESTORE 201\n\n#define FEATURESETTING_NUP 0\n#define FEATURESETTING_OUTPUT 1\n#define FEATURESETTING_PSLEVEL 2\n#define FEATURESETTING_CUSTPAPER 3\n#define FEATURESETTING_MIRROR 4\n#define FEATURESETTING_NEGATIVE 5\n#define FEATURESETTING_PROTOCOL 6\n\n#define FEATURESETTING_PRIVATE_BEGIN 0x1000\n#define FEATURESETTING_PRIVATE_END 0x1FFF\n\n  typedef struct _PSFEATURE_OUTPUT {\n    WINBOOL bPageIndependent;\n    WINBOOL bSetPageDevice;\n  } PSFEATURE_OUTPUT,*PPSFEATURE_OUTPUT;\n\n  typedef struct _PSFEATURE_CUSTPAPER {\n    LONG lOrientation;\n    LONG lWidth;\n    LONG lHeight;\n    LONG lWidthOffset;\n    LONG lHeightOffset;\n  } PSFEATURE_CUSTPAPER,*PPSFEATURE_CUSTPAPER;\n\n#define PSPROTOCOL_ASCII 0\n#define PSPROTOCOL_BCP 1\n#define PSPROTOCOL_TBCP 2\n#define PSPROTOCOL_BINARY 3\n\n#define QDI_SETDIBITS 1\n#define QDI_GETDIBITS 2\n#define QDI_DIBTOSCREEN 4\n#define QDI_STRETCHDIB 8\n\n#define SP_NOTREPORTED 0x4000\n#define SP_ERROR (-1)\n#define SP_APPABORT (-2)\n#define SP_USERABORT (-3)\n#define SP_OUTOFDISK (-4)\n#define SP_OUTOFMEMORY (-5)\n\n#define PR_JOBSTATUS 0x0000\n\n#define OBJ_PEN 1\n#define OBJ_BRUSH 2\n#define OBJ_DC 3\n#define OBJ_METADC 4\n#define OBJ_PAL 5\n#define OBJ_FONT 6\n#define OBJ_BITMAP 7\n#define OBJ_REGION 8\n#define OBJ_METAFILE 9\n#define OBJ_MEMDC 10\n#define OBJ_EXTPEN 11\n#define OBJ_ENHMETADC 12\n#define OBJ_ENHMETAFILE 13\n#define OBJ_COLORSPACE 14\n\n#define MWT_IDENTITY 1\n#define MWT_LEFTMULTIPLY 2\n#define MWT_RIGHTMULTIPLY 3\n\n#define MWT_MIN MWT_IDENTITY\n#define MWT_MAX MWT_RIGHTMULTIPLY\n\n#define _XFORM_\n  typedef struct tagXFORM {\n    FLOAT eM11;\n    FLOAT eM12;\n    FLOAT eM21;\n    FLOAT eM22;\n    FLOAT eDx;\n    FLOAT eDy;\n  } XFORM,*PXFORM,*LPXFORM;\n\n  typedef struct tagBITMAP {\n    LONG bmType;\n    LONG bmWidth;\n    LONG bmHeight;\n    LONG bmWidthBytes;\n    WORD bmPlanes;\n    WORD bmBitsPixel;\n    LPVOID bmBits;\n  } BITMAP,*PBITMAP,*NPBITMAP,*LPBITMAP;\n\n#include <pshpack1.h>\n  typedef struct tagRGBTRIPLE {\n    BYTE rgbtBlue;\n    BYTE rgbtGreen;\n    BYTE rgbtRed;\n  } RGBTRIPLE;\n#include <poppack.h>\n\n  typedef struct tagRGBQUAD {\n    BYTE rgbBlue;\n    BYTE rgbGreen;\n    BYTE rgbRed;\n    BYTE rgbReserved;\n  } RGBQUAD;\n  typedef RGBQUAD *LPRGBQUAD;\n\n#define CS_ENABLE 0x00000001L\n#define CS_DISABLE 0x00000002L\n#define CS_DELETE_TRANSFORM 0x00000003L\n\n//!__TINYC__: #define LCS_SIGNATURE 'PSOC'\n//!__TINYC__: #define LCS_sRGB 'sRGB'\n//!__TINYC__: #define LCS_WINDOWS_COLOR_SPACE 'Win '\n\n  typedef LONG LCSCSTYPE;\n#define LCS_CALIBRATED_RGB 0x00000000L\n\n  typedef LONG LCSGAMUTMATCH;\n#define LCS_GM_BUSINESS 0x00000001L\n#define LCS_GM_GRAPHICS 0x00000002L\n#define LCS_GM_IMAGES 0x00000004L\n#define LCS_GM_ABS_COLORIMETRIC 0x00000008L\n\n#define CM_OUT_OF_GAMUT 255\n#define CM_IN_GAMUT 0\n\n#define ICM_ADDPROFILE 1\n#define ICM_DELETEPROFILE 2\n#define ICM_QUERYPROFILE 3\n#define ICM_SETDEFAULTPROFILE 4\n#define ICM_REGISTERICMATCHER 5\n#define ICM_UNREGISTERICMATCHER 6\n#define ICM_QUERYMATCH 7\n\n#define GetKValue(cmyk) ((BYTE)(cmyk))\n#define GetYValue(cmyk) ((BYTE)((cmyk)>> 8))\n#define GetMValue(cmyk) ((BYTE)((cmyk)>>16))\n#define GetCValue(cmyk) ((BYTE)((cmyk)>>24))\n\n#define CMYK(c,m,y,k) ((COLORREF)((((BYTE)(k)|((WORD)((BYTE)(y))<<8))|(((DWORD)(BYTE)(m))<<16))|(((DWORD)(BYTE)(c))<<24)))\n\n  typedef long FXPT16DOT16,*LPFXPT16DOT16;\n  typedef long FXPT2DOT30,*LPFXPT2DOT30;\n\n  typedef struct tagCIEXYZ {\n    FXPT2DOT30 ciexyzX;\n    FXPT2DOT30 ciexyzY;\n    FXPT2DOT30 ciexyzZ;\n  } CIEXYZ;\n  typedef CIEXYZ *LPCIEXYZ;\n\n  typedef struct tagICEXYZTRIPLE {\n    CIEXYZ ciexyzRed;\n    CIEXYZ ciexyzGreen;\n    CIEXYZ ciexyzBlue;\n  } CIEXYZTRIPLE;\n\n  typedef CIEXYZTRIPLE *LPCIEXYZTRIPLE;\n\n  typedef struct tagLOGCOLORSPACEA {\n    DWORD lcsSignature;\n    DWORD lcsVersion;\n    DWORD lcsSize;\n    LCSCSTYPE lcsCSType;\n    LCSGAMUTMATCH lcsIntent;\n    CIEXYZTRIPLE lcsEndpoints;\n    DWORD lcsGammaRed;\n    DWORD lcsGammaGreen;\n    DWORD lcsGammaBlue;\n    CHAR lcsFilename[MAX_PATH];\n  } LOGCOLORSPACEA,*LPLOGCOLORSPACEA;\n\n  typedef struct tagLOGCOLORSPACEW {\n    DWORD lcsSignature;\n    DWORD lcsVersion;\n    DWORD lcsSize;\n    LCSCSTYPE lcsCSType;\n    LCSGAMUTMATCH lcsIntent;\n    CIEXYZTRIPLE lcsEndpoints;\n    DWORD lcsGammaRed;\n    DWORD lcsGammaGreen;\n    DWORD lcsGammaBlue;\n    WCHAR lcsFilename[MAX_PATH];\n  } LOGCOLORSPACEW,*LPLOGCOLORSPACEW;\n\n#ifdef UNICODE\n  typedef LOGCOLORSPACEW LOGCOLORSPACE;\n  typedef LPLOGCOLORSPACEW LPLOGCOLORSPACE;\n#else\n  typedef LOGCOLORSPACEA LOGCOLORSPACE;\n  typedef LPLOGCOLORSPACEA LPLOGCOLORSPACE;\n#endif\n\n  typedef struct tagBITMAPCOREHEADER {\n    DWORD bcSize;\n    WORD bcWidth;\n    WORD bcHeight;\n    WORD bcPlanes;\n    WORD bcBitCount;\n  } BITMAPCOREHEADER,*LPBITMAPCOREHEADER,*PBITMAPCOREHEADER;\n\n  typedef struct tagBITMAPINFOHEADER {\n    DWORD biSize;\n    LONG biWidth;\n    LONG biHeight;\n    WORD biPlanes;\n    WORD biBitCount;\n    DWORD biCompression;\n    DWORD biSizeImage;\n    LONG biXPelsPerMeter;\n    LONG biYPelsPerMeter;\n    DWORD biClrUsed;\n    DWORD biClrImportant;\n  } BITMAPINFOHEADER,*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;\n\n  typedef struct {\n    DWORD bV4Size;\n    LONG bV4Width;\n    LONG bV4Height;\n    WORD bV4Planes;\n    WORD bV4BitCount;\n    DWORD bV4V4Compression;\n    DWORD bV4SizeImage;\n    LONG bV4XPelsPerMeter;\n    LONG bV4YPelsPerMeter;\n    DWORD bV4ClrUsed;\n    DWORD bV4ClrImportant;\n    DWORD bV4RedMask;\n    DWORD bV4GreenMask;\n    DWORD bV4BlueMask;\n    DWORD bV4AlphaMask;\n    DWORD bV4CSType;\n    CIEXYZTRIPLE bV4Endpoints;\n    DWORD bV4GammaRed;\n    DWORD bV4GammaGreen;\n    DWORD bV4GammaBlue;\n  } BITMAPV4HEADER,*LPBITMAPV4HEADER,*PBITMAPV4HEADER;\n\n  typedef struct {\n    DWORD bV5Size;\n    LONG bV5Width;\n    LONG bV5Height;\n    WORD bV5Planes;\n    WORD bV5BitCount;\n    DWORD bV5Compression;\n    DWORD bV5SizeImage;\n    LONG bV5XPelsPerMeter;\n    LONG bV5YPelsPerMeter;\n    DWORD bV5ClrUsed;\n    DWORD bV5ClrImportant;\n    DWORD bV5RedMask;\n    DWORD bV5GreenMask;\n    DWORD bV5BlueMask;\n    DWORD bV5AlphaMask;\n    DWORD bV5CSType;\n    CIEXYZTRIPLE bV5Endpoints;\n    DWORD bV5GammaRed;\n    DWORD bV5GammaGreen;\n    DWORD bV5GammaBlue;\n    DWORD bV5Intent;\n    DWORD bV5ProfileData;\n    DWORD bV5ProfileSize;\n    DWORD bV5Reserved;\n  } BITMAPV5HEADER,*LPBITMAPV5HEADER,*PBITMAPV5HEADER;\n\n//!__TINYC__: #define PROFILE_LINKED 'LINK'\n//!__TINYC__: #define PROFILE_EMBEDDED 'MBED'\n\n#define BI_RGB 0L\n#define BI_RLE8 1L\n#define BI_RLE4 2L\n#define BI_BITFIELDS 3L\n#define BI_JPEG 4L\n#define BI_PNG 5L\n\n  typedef struct tagBITMAPINFO {\n    BITMAPINFOHEADER bmiHeader;\n    RGBQUAD bmiColors[1];\n  } BITMAPINFO,*LPBITMAPINFO,*PBITMAPINFO;\n\n  typedef struct tagBITMAPCOREINFO {\n    BITMAPCOREHEADER bmciHeader;\n    RGBTRIPLE bmciColors[1];\n  } BITMAPCOREINFO,*LPBITMAPCOREINFO,*PBITMAPCOREINFO;\n\n#include <pshpack2.h>\n  typedef struct tagBITMAPFILEHEADER {\n    WORD bfType;\n    DWORD bfSize;\n    WORD bfReserved1;\n    WORD bfReserved2;\n    DWORD bfOffBits;\n  } BITMAPFILEHEADER,*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;\n#include <poppack.h>\n\n#define MAKEPOINTS(l) (*((POINTS *)&(l)))\n\n#ifndef NOFONTSIG\n  typedef struct tagFONTSIGNATURE {\n    DWORD fsUsb[4];\n    DWORD fsCsb[2];\n  } FONTSIGNATURE,*PFONTSIGNATURE,*LPFONTSIGNATURE;\n\n  typedef struct tagCHARSETINFO {\n    UINT ciCharset;\n    UINT ciACP;\n    FONTSIGNATURE fs;\n  } CHARSETINFO,*PCHARSETINFO,*NPCHARSETINFO,*LPCHARSETINFO;\n\n#define TCI_SRCCHARSET 1\n#define TCI_SRCCODEPAGE 2\n#define TCI_SRCFONTSIG 3\n#define TCI_SRCLOCALE 0x1000\n\n  typedef struct tagLOCALESIGNATURE {\n    DWORD lsUsb[4];\n    DWORD lsCsbDefault[2];\n    DWORD lsCsbSupported[2];\n  } LOCALESIGNATURE,*PLOCALESIGNATURE,*LPLOCALESIGNATURE;\n#endif\n\n\n#ifndef NOMETAFILE\n  typedef struct tagHANDLETABLE {\n    HGDIOBJ objectHandle[1];\n  } HANDLETABLE,*PHANDLETABLE,*LPHANDLETABLE;\n\n  typedef struct tagMETARECORD {\n    DWORD rdSize;\n    WORD rdFunction;\n    WORD rdParm[1];\n  } METARECORD;\n  typedef struct tagMETARECORD UNALIGNED *PMETARECORD;\n  typedef struct tagMETARECORD UNALIGNED *LPMETARECORD;\n\n  typedef struct tagMETAFILEPICT {\n    LONG mm;\n    LONG xExt;\n    LONG yExt;\n    HMETAFILE hMF;\n  } METAFILEPICT,*LPMETAFILEPICT;\n\n#include <pshpack2.h>\n  typedef struct tagMETAHEADER {\n    WORD mtType;\n    WORD mtHeaderSize;\n    WORD mtVersion;\n    DWORD mtSize;\n    WORD mtNoObjects;\n    DWORD mtMaxRecord;\n    WORD mtNoParameters;\n  } METAHEADER;\n  typedef struct tagMETAHEADER UNALIGNED *PMETAHEADER;\n  typedef struct tagMETAHEADER UNALIGNED *LPMETAHEADER;\n\n#include <poppack.h>\n\n  typedef struct tagENHMETARECORD {\n    DWORD iType;\n    DWORD nSize;\n    DWORD dParm[1];\n  } ENHMETARECORD,*PENHMETARECORD,*LPENHMETARECORD;\n\n  typedef struct tagENHMETAHEADER {\n    DWORD iType;\n    DWORD nSize;\n    RECTL rclBounds;\n    RECTL rclFrame;\n    DWORD dSignature;\n    DWORD nVersion;\n    DWORD nBytes;\n    DWORD nRecords;\n    WORD nHandles;\n    WORD sReserved;\n    DWORD nDescription;\n    DWORD offDescription;\n    DWORD nPalEntries;\n    SIZEL szlDevice;\n    SIZEL szlMillimeters;\n    DWORD cbPixelFormat;\n    DWORD offPixelFormat;\n    DWORD bOpenGL;\n    SIZEL szlMicrometers;\n  } ENHMETAHEADER,*PENHMETAHEADER,*LPENHMETAHEADER;\n#endif\n\n#ifndef NOTEXTMETRIC\n#define TMPF_FIXED_PITCH 0x01\n#define TMPF_VECTOR 0x02\n#define TMPF_DEVICE 0x08\n#define TMPF_TRUETYPE 0x04\n\n#ifdef UNICODE\n  typedef WCHAR BCHAR;\n#else\n  typedef BYTE BCHAR;\n#endif\n\n#ifndef _TEXTMETRIC_DEFINED\n#define _TEXTMETRIC_DEFINED\n  typedef struct tagTEXTMETRICA {\n    LONG tmHeight;\n    LONG tmAscent;\n    LONG tmDescent;\n    LONG tmInternalLeading;\n    LONG tmExternalLeading;\n    LONG tmAveCharWidth;\n    LONG tmMaxCharWidth;\n    LONG tmWeight;\n    LONG tmOverhang;\n    LONG tmDigitizedAspectX;\n    LONG tmDigitizedAspectY;\n    BYTE tmFirstChar;\n    BYTE tmLastChar;\n    BYTE tmDefaultChar;\n    BYTE tmBreakChar;\n    BYTE tmItalic;\n    BYTE tmUnderlined;\n    BYTE tmStruckOut;\n    BYTE tmPitchAndFamily;\n    BYTE tmCharSet;\n  } TEXTMETRICA,*PTEXTMETRICA,*NPTEXTMETRICA,*LPTEXTMETRICA;\n\n  typedef struct tagTEXTMETRICW {\n    LONG tmHeight;\n    LONG tmAscent;\n    LONG tmDescent;\n    LONG tmInternalLeading;\n    LONG tmExternalLeading;\n    LONG tmAveCharWidth;\n    LONG tmMaxCharWidth;\n    LONG tmWeight;\n    LONG tmOverhang;\n    LONG tmDigitizedAspectX;\n    LONG tmDigitizedAspectY;\n    WCHAR tmFirstChar;\n    WCHAR tmLastChar;\n    WCHAR tmDefaultChar;\n    WCHAR tmBreakChar;\n    BYTE tmItalic;\n    BYTE tmUnderlined;\n    BYTE tmStruckOut;\n    BYTE tmPitchAndFamily;\n    BYTE tmCharSet;\n  } TEXTMETRICW,*PTEXTMETRICW,*NPTEXTMETRICW,*LPTEXTMETRICW;\n#ifdef UNICODE\n  typedef TEXTMETRICW TEXTMETRIC;\n  typedef PTEXTMETRICW PTEXTMETRIC;\n  typedef NPTEXTMETRICW NPTEXTMETRIC;\n  typedef LPTEXTMETRICW LPTEXTMETRIC;\n#else\n  typedef TEXTMETRICA TEXTMETRIC;\n  typedef PTEXTMETRICA PTEXTMETRIC;\n  typedef NPTEXTMETRICA NPTEXTMETRIC;\n  typedef LPTEXTMETRICA LPTEXTMETRIC;\n#endif\n#endif\n\n#define NTM_REGULAR 0x00000040L\n#define NTM_BOLD 0x00000020L\n#define NTM_ITALIC 0x00000001L\n\n#define NTM_NONNEGATIVE_AC 0x00010000\n#define NTM_PS_OPENTYPE 0x00020000\n#define NTM_TT_OPENTYPE 0x00040000\n#define NTM_MULTIPLEMASTER 0x00080000\n#define NTM_TYPE1 0x00100000\n#define NTM_DSIG 0x00200000\n\n#include <pshpack4.h>\n  typedef struct tagNEWTEXTMETRICA {\n    LONG tmHeight;\n    LONG tmAscent;\n    LONG tmDescent;\n    LONG tmInternalLeading;\n    LONG tmExternalLeading;\n    LONG tmAveCharWidth;\n    LONG tmMaxCharWidth;\n    LONG tmWeight;\n    LONG tmOverhang;\n    LONG tmDigitizedAspectX;\n    LONG tmDigitizedAspectY;\n    BYTE tmFirstChar;\n    BYTE tmLastChar;\n    BYTE tmDefaultChar;\n    BYTE tmBreakChar;\n    BYTE tmItalic;\n    BYTE tmUnderlined;\n    BYTE tmStruckOut;\n    BYTE tmPitchAndFamily;\n    BYTE tmCharSet;\n    DWORD ntmFlags;\n    UINT ntmSizeEM;\n    UINT ntmCellHeight;\n    UINT ntmAvgWidth;\n  } NEWTEXTMETRICA,*PNEWTEXTMETRICA,*NPNEWTEXTMETRICA,*LPNEWTEXTMETRICA;\n\n  typedef struct tagNEWTEXTMETRICW {\n    LONG tmHeight;\n    LONG tmAscent;\n    LONG tmDescent;\n    LONG tmInternalLeading;\n    LONG tmExternalLeading;\n    LONG tmAveCharWidth;\n    LONG tmMaxCharWidth;\n    LONG tmWeight;\n    LONG tmOverhang;\n    LONG tmDigitizedAspectX;\n    LONG tmDigitizedAspectY;\n    WCHAR tmFirstChar;\n    WCHAR tmLastChar;\n    WCHAR tmDefaultChar;\n    WCHAR tmBreakChar;\n    BYTE tmItalic;\n    BYTE tmUnderlined;\n    BYTE tmStruckOut;\n    BYTE tmPitchAndFamily;\n    BYTE tmCharSet;\n    DWORD ntmFlags;\n    UINT ntmSizeEM;\n    UINT ntmCellHeight;\n    UINT ntmAvgWidth;\n  } NEWTEXTMETRICW,*PNEWTEXTMETRICW,*NPNEWTEXTMETRICW,*LPNEWTEXTMETRICW;\n#ifdef UNICODE\n  typedef NEWTEXTMETRICW NEWTEXTMETRIC;\n  typedef PNEWTEXTMETRICW PNEWTEXTMETRIC;\n  typedef NPNEWTEXTMETRICW NPNEWTEXTMETRIC;\n  typedef LPNEWTEXTMETRICW LPNEWTEXTMETRIC;\n#else\n  typedef NEWTEXTMETRICA NEWTEXTMETRIC;\n  typedef PNEWTEXTMETRICA PNEWTEXTMETRIC;\n  typedef NPNEWTEXTMETRICA NPNEWTEXTMETRIC;\n  typedef LPNEWTEXTMETRICA LPNEWTEXTMETRIC;\n#endif\n#include <poppack.h>\n\n  typedef struct tagNEWTEXTMETRICEXA {\n    NEWTEXTMETRICA ntmTm;\n    FONTSIGNATURE ntmFontSig;\n  } NEWTEXTMETRICEXA;\n\n  typedef struct tagNEWTEXTMETRICEXW {\n    NEWTEXTMETRICW ntmTm;\n    FONTSIGNATURE ntmFontSig;\n  } NEWTEXTMETRICEXW;\n#ifdef UNICODE\n  typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX;\n#else\n  typedef NEWTEXTMETRICEXA NEWTEXTMETRICEX;\n#endif\n#endif\n\n  typedef struct tagPELARRAY {\n    LONG paXCount;\n    LONG paYCount;\n    LONG paXExt;\n    LONG paYExt;\n    BYTE paRGBs;\n  } PELARRAY,*PPELARRAY,*NPPELARRAY,*LPPELARRAY;\n\n  typedef struct tagLOGBRUSH {\n    UINT lbStyle;\n    COLORREF lbColor;\n    ULONG_PTR lbHatch;\n  } LOGBRUSH,*PLOGBRUSH,*NPLOGBRUSH,*LPLOGBRUSH;\n\n  typedef struct tagLOGBRUSH32 {\n    UINT lbStyle;\n    COLORREF lbColor;\n    ULONG lbHatch;\n  } LOGBRUSH32,*PLOGBRUSH32,*NPLOGBRUSH32,*LPLOGBRUSH32;\n\n  typedef LOGBRUSH PATTERN;\n  typedef PATTERN *PPATTERN;\n  typedef PATTERN *NPPATTERN;\n  typedef PATTERN *LPPATTERN;\n\n  typedef struct tagLOGPEN {\n    UINT lopnStyle;\n    POINT lopnWidth;\n    COLORREF lopnColor;\n  } LOGPEN,*PLOGPEN,*NPLOGPEN,*LPLOGPEN;\n\n  typedef struct tagEXTLOGPEN {\n    DWORD elpPenStyle;\n    DWORD elpWidth;\n    UINT elpBrushStyle;\n    COLORREF elpColor;\n    ULONG_PTR elpHatch;\n    DWORD elpNumEntries;\n    DWORD elpStyleEntry[1];\n  } EXTLOGPEN,*PEXTLOGPEN,*NPEXTLOGPEN,*LPEXTLOGPEN;\n\n#ifndef _PALETTEENTRY_DEFINED\n#define _PALETTEENTRY_DEFINED\n  typedef struct tagPALETTEENTRY {\n    BYTE peRed;\n    BYTE peGreen;\n    BYTE peBlue;\n    BYTE peFlags;\n  } PALETTEENTRY,*PPALETTEENTRY,*LPPALETTEENTRY;\n#endif\n\n#ifndef _LOGPALETTE_DEFINED\n#define _LOGPALETTE_DEFINED\n\n  typedef struct tagLOGPALETTE {\n    WORD palVersion;\n    WORD palNumEntries;\n    PALETTEENTRY palPalEntry[1];\n  } LOGPALETTE,*PLOGPALETTE,*NPLOGPALETTE,*LPLOGPALETTE;\n#endif\n\n#define LF_FACESIZE 32\n\n  typedef struct tagLOGFONTA {\n    LONG lfHeight;\n    LONG lfWidth;\n    LONG lfEscapement;\n    LONG lfOrientation;\n    LONG lfWeight;\n    BYTE lfItalic;\n    BYTE lfUnderline;\n    BYTE lfStrikeOut;\n    BYTE lfCharSet;\n    BYTE lfOutPrecision;\n    BYTE lfClipPrecision;\n    BYTE lfQuality;\n    BYTE lfPitchAndFamily;\n    CHAR lfFaceName[LF_FACESIZE];\n  } LOGFONTA,*PLOGFONTA,*NPLOGFONTA,*LPLOGFONTA;\n\n  typedef struct tagLOGFONTW {\n    LONG lfHeight;\n    LONG lfWidth;\n    LONG lfEscapement;\n    LONG lfOrientation;\n    LONG lfWeight;\n    BYTE lfItalic;\n    BYTE lfUnderline;\n    BYTE lfStrikeOut;\n    BYTE lfCharSet;\n    BYTE lfOutPrecision;\n    BYTE lfClipPrecision;\n    BYTE lfQuality;\n    BYTE lfPitchAndFamily;\n    WCHAR lfFaceName[LF_FACESIZE];\n  } LOGFONTW,*PLOGFONTW,*NPLOGFONTW,*LPLOGFONTW;\n#ifdef UNICODE\n  typedef LOGFONTW LOGFONT;\n  typedef PLOGFONTW PLOGFONT;\n  typedef NPLOGFONTW NPLOGFONT;\n  typedef LPLOGFONTW LPLOGFONT;\n#else\n  typedef LOGFONTA LOGFONT;\n  typedef PLOGFONTA PLOGFONT;\n  typedef NPLOGFONTA NPLOGFONT;\n  typedef LPLOGFONTA LPLOGFONT;\n#endif\n\n#define LF_FULLFACESIZE 64\n\n  typedef struct tagENUMLOGFONTA {\n    LOGFONTA elfLogFont;\n    BYTE elfFullName[LF_FULLFACESIZE];\n    BYTE elfStyle[LF_FACESIZE];\n  } ENUMLOGFONTA,*LPENUMLOGFONTA;\n\n  typedef struct tagENUMLOGFONTW {\n    LOGFONTW elfLogFont;\n    WCHAR elfFullName[LF_FULLFACESIZE];\n    WCHAR elfStyle[LF_FACESIZE];\n  } ENUMLOGFONTW,*LPENUMLOGFONTW;\n#ifdef UNICODE\n  typedef ENUMLOGFONTW ENUMLOGFONT;\n  typedef LPENUMLOGFONTW LPENUMLOGFONT;\n#else\n  typedef ENUMLOGFONTA ENUMLOGFONT;\n  typedef LPENUMLOGFONTA LPENUMLOGFONT;\n#endif\n\n  typedef struct tagENUMLOGFONTEXA {\n    LOGFONTA elfLogFont;\n    BYTE elfFullName[LF_FULLFACESIZE];\n    BYTE elfStyle[LF_FACESIZE];\n    BYTE elfScript[LF_FACESIZE];\n  } ENUMLOGFONTEXA,*LPENUMLOGFONTEXA;\n\n  typedef struct tagENUMLOGFONTEXW {\n    LOGFONTW elfLogFont;\n    WCHAR elfFullName[LF_FULLFACESIZE];\n    WCHAR elfStyle[LF_FACESIZE];\n    WCHAR elfScript[LF_FACESIZE];\n  } ENUMLOGFONTEXW,*LPENUMLOGFONTEXW;\n#ifdef UNICODE\n  typedef ENUMLOGFONTEXW ENUMLOGFONTEX;\n  typedef LPENUMLOGFONTEXW LPENUMLOGFONTEX;\n#else\n  typedef ENUMLOGFONTEXA ENUMLOGFONTEX;\n  typedef LPENUMLOGFONTEXA LPENUMLOGFONTEX;\n#endif\n\n#define OUT_DEFAULT_PRECIS 0\n#define OUT_STRING_PRECIS 1\n#define OUT_CHARACTER_PRECIS 2\n#define OUT_STROKE_PRECIS 3\n#define OUT_TT_PRECIS 4\n#define OUT_DEVICE_PRECIS 5\n#define OUT_RASTER_PRECIS 6\n#define OUT_TT_ONLY_PRECIS 7\n#define OUT_OUTLINE_PRECIS 8\n#define OUT_SCREEN_OUTLINE_PRECIS 9\n#define OUT_PS_ONLY_PRECIS 10\n\n#define CLIP_DEFAULT_PRECIS 0\n#define CLIP_CHARACTER_PRECIS 1\n#define CLIP_STROKE_PRECIS 2\n#define CLIP_MASK 0xf\n#define CLIP_LH_ANGLES (1<<4)\n#define CLIP_TT_ALWAYS (2<<4)\n#define CLIP_DFA_DISABLE (4<<4)\n#define CLIP_EMBEDDED (8<<4)\n\n#define DEFAULT_QUALITY 0\n#define DRAFT_QUALITY 1\n#define PROOF_QUALITY 2\n#define NONANTIALIASED_QUALITY 3\n#define ANTIALIASED_QUALITY 4\n\n#define CLEARTYPE_QUALITY 5\n#define CLEARTYPE_NATURAL_QUALITY 6\n\n#define DEFAULT_PITCH 0\n#define FIXED_PITCH 1\n#define VARIABLE_PITCH 2\n#define MONO_FONT 8\n\n#define ANSI_CHARSET 0\n#define DEFAULT_CHARSET 1\n#define SYMBOL_CHARSET 2\n#define SHIFTJIS_CHARSET 128\n#define HANGEUL_CHARSET 129\n#define HANGUL_CHARSET 129\n#define GB2312_CHARSET 134\n#define CHINESEBIG5_CHARSET 136\n#define OEM_CHARSET 255\n#define JOHAB_CHARSET 130\n#define HEBREW_CHARSET 177\n#define ARABIC_CHARSET 178\n#define GREEK_CHARSET 161\n#define TURKISH_CHARSET 162\n#define VIETNAMESE_CHARSET 163\n#define THAI_CHARSET 222\n#define EASTEUROPE_CHARSET 238\n#define RUSSIAN_CHARSET 204\n\n#define MAC_CHARSET 77\n#define BALTIC_CHARSET 186\n\n#define FS_LATIN1 0x00000001L\n#define FS_LATIN2 0x00000002L\n#define FS_CYRILLIC 0x00000004L\n#define FS_GREEK 0x00000008L\n#define FS_TURKISH 0x00000010L\n#define FS_HEBREW 0x00000020L\n#define FS_ARABIC 0x00000040L\n#define FS_BALTIC 0x00000080L\n#define FS_VIETNAMESE 0x00000100L\n#define FS_THAI 0x00010000L\n#define FS_JISJAPAN 0x00020000L\n#define FS_CHINESESIMP 0x00040000L\n#define FS_WANSUNG 0x00080000L\n#define FS_CHINESETRAD 0x00100000L\n#define FS_JOHAB 0x00200000L\n#define FS_SYMBOL 0x80000000L\n\n#define FF_DONTCARE (0<<4)\n#define FF_ROMAN (1<<4)\n\n#define FF_SWISS (2<<4)\n\n#define FF_MODERN (3<<4)\n\n#define FF_SCRIPT (4<<4)\n#define FF_DECORATIVE (5<<4)\n\n#define FW_DONTCARE 0\n#define FW_THIN 100\n#define FW_EXTRALIGHT 200\n#define FW_LIGHT 300\n#define FW_NORMAL 400\n#define FW_MEDIUM 500\n#define FW_SEMIBOLD 600\n#define FW_BOLD 700\n#define FW_EXTRABOLD 800\n#define FW_HEAVY 900\n\n#define FW_ULTRALIGHT FW_EXTRALIGHT\n#define FW_REGULAR FW_NORMAL\n#define FW_DEMIBOLD FW_SEMIBOLD\n#define FW_ULTRABOLD FW_EXTRABOLD\n#define FW_BLACK FW_HEAVY\n\n#define PANOSE_COUNT 10\n#define PAN_FAMILYTYPE_INDEX 0\n#define PAN_SERIFSTYLE_INDEX 1\n#define PAN_WEIGHT_INDEX 2\n#define PAN_PROPORTION_INDEX 3\n#define PAN_CONTRAST_INDEX 4\n#define PAN_STROKEVARIATION_INDEX 5\n#define PAN_ARMSTYLE_INDEX 6\n#define PAN_LETTERFORM_INDEX 7\n#define PAN_MIDLINE_INDEX 8\n#define PAN_XHEIGHT_INDEX 9\n\n#define PAN_CULTURE_LATIN 0\n\n  typedef struct tagPANOSE {\n    BYTE bFamilyType;\n    BYTE bSerifStyle;\n    BYTE bWeight;\n    BYTE bProportion;\n    BYTE bContrast;\n    BYTE bStrokeVariation;\n    BYTE bArmStyle;\n    BYTE bLetterform;\n    BYTE bMidline;\n    BYTE bXHeight;\n  } PANOSE,*LPPANOSE;\n\n#define PAN_ANY 0\n#define PAN_NO_FIT 1\n\n#define PAN_FAMILY_TEXT_DISPLAY 2\n#define PAN_FAMILY_SCRIPT 3\n#define PAN_FAMILY_DECORATIVE 4\n#define PAN_FAMILY_PICTORIAL 5\n\n#define PAN_SERIF_COVE 2\n#define PAN_SERIF_OBTUSE_COVE 3\n#define PAN_SERIF_SQUARE_COVE 4\n#define PAN_SERIF_OBTUSE_SQUARE_COVE 5\n#define PAN_SERIF_SQUARE 6\n#define PAN_SERIF_THIN 7\n#define PAN_SERIF_BONE 8\n#define PAN_SERIF_EXAGGERATED 9\n#define PAN_SERIF_TRIANGLE 10\n#define PAN_SERIF_NORMAL_SANS 11\n#define PAN_SERIF_OBTUSE_SANS 12\n#define PAN_SERIF_PERP_SANS 13\n#define PAN_SERIF_FLARED 14\n#define PAN_SERIF_ROUNDED 15\n\n#define PAN_WEIGHT_VERY_LIGHT 2\n#define PAN_WEIGHT_LIGHT 3\n#define PAN_WEIGHT_THIN 4\n#define PAN_WEIGHT_BOOK 5\n#define PAN_WEIGHT_MEDIUM 6\n#define PAN_WEIGHT_DEMI 7\n#define PAN_WEIGHT_BOLD 8\n#define PAN_WEIGHT_HEAVY 9\n#define PAN_WEIGHT_BLACK 10\n#define PAN_WEIGHT_NORD 11\n\n#define PAN_PROP_OLD_STYLE 2\n#define PAN_PROP_MODERN 3\n#define PAN_PROP_EVEN_WIDTH 4\n#define PAN_PROP_EXPANDED 5\n#define PAN_PROP_CONDENSED 6\n#define PAN_PROP_VERY_EXPANDED 7\n#define PAN_PROP_VERY_CONDENSED 8\n#define PAN_PROP_MONOSPACED 9\n\n#define PAN_CONTRAST_NONE 2\n#define PAN_CONTRAST_VERY_LOW 3\n#define PAN_CONTRAST_LOW 4\n#define PAN_CONTRAST_MEDIUM_LOW 5\n#define PAN_CONTRAST_MEDIUM 6\n#define PAN_CONTRAST_MEDIUM_HIGH 7\n#define PAN_CONTRAST_HIGH 8\n#define PAN_CONTRAST_VERY_HIGH 9\n\n#define PAN_STROKE_GRADUAL_DIAG 2\n#define PAN_STROKE_GRADUAL_TRAN 3\n#define PAN_STROKE_GRADUAL_VERT 4\n#define PAN_STROKE_GRADUAL_HORZ 5\n#define PAN_STROKE_RAPID_VERT 6\n#define PAN_STROKE_RAPID_HORZ 7\n#define PAN_STROKE_INSTANT_VERT 8\n\n#define PAN_STRAIGHT_ARMS_HORZ 2\n#define PAN_STRAIGHT_ARMS_WEDGE 3\n#define PAN_STRAIGHT_ARMS_VERT 4\n#define PAN_STRAIGHT_ARMS_SINGLE_SERIF 5\n#define PAN_STRAIGHT_ARMS_DOUBLE_SERIF 6\n#define PAN_BENT_ARMS_HORZ 7\n#define PAN_BENT_ARMS_WEDGE 8\n#define PAN_BENT_ARMS_VERT 9\n#define PAN_BENT_ARMS_SINGLE_SERIF 10\n#define PAN_BENT_ARMS_DOUBLE_SERIF 11\n\n#define PAN_LETT_NORMAL_CONTACT 2\n#define PAN_LETT_NORMAL_WEIGHTED 3\n#define PAN_LETT_NORMAL_BOXED 4\n#define PAN_LETT_NORMAL_FLATTENED 5\n#define PAN_LETT_NORMAL_ROUNDED 6\n#define PAN_LETT_NORMAL_OFF_CENTER 7\n#define PAN_LETT_NORMAL_SQUARE 8\n#define PAN_LETT_OBLIQUE_CONTACT 9\n#define PAN_LETT_OBLIQUE_WEIGHTED 10\n#define PAN_LETT_OBLIQUE_BOXED 11\n#define PAN_LETT_OBLIQUE_FLATTENED 12\n#define PAN_LETT_OBLIQUE_ROUNDED 13\n#define PAN_LETT_OBLIQUE_OFF_CENTER 14\n#define PAN_LETT_OBLIQUE_SQUARE 15\n\n#define PAN_MIDLINE_STANDARD_TRIMMED 2\n#define PAN_MIDLINE_STANDARD_POINTED 3\n#define PAN_MIDLINE_STANDARD_SERIFED 4\n#define PAN_MIDLINE_HIGH_TRIMMED 5\n#define PAN_MIDLINE_HIGH_POINTED 6\n#define PAN_MIDLINE_HIGH_SERIFED 7\n#define PAN_MIDLINE_CONSTANT_TRIMMED 8\n#define PAN_MIDLINE_CONSTANT_POINTED 9\n#define PAN_MIDLINE_CONSTANT_SERIFED 10\n#define PAN_MIDLINE_LOW_TRIMMED 11\n#define PAN_MIDLINE_LOW_POINTED 12\n#define PAN_MIDLINE_LOW_SERIFED 13\n\n#define PAN_XHEIGHT_CONSTANT_SMALL 2\n#define PAN_XHEIGHT_CONSTANT_STD 3\n#define PAN_XHEIGHT_CONSTANT_LARGE 4\n#define PAN_XHEIGHT_DUCKING_SMALL 5\n#define PAN_XHEIGHT_DUCKING_STD 6\n#define PAN_XHEIGHT_DUCKING_LARGE 7\n\n#define ELF_VENDOR_SIZE 4\n\n  typedef struct tagEXTLOGFONTA {\n    LOGFONTA elfLogFont;\n    BYTE elfFullName[LF_FULLFACESIZE];\n    BYTE elfStyle[LF_FACESIZE];\n    DWORD elfVersion;\n    DWORD elfStyleSize;\n    DWORD elfMatch;\n    DWORD elfReserved;\n    BYTE elfVendorId[ELF_VENDOR_SIZE];\n    DWORD elfCulture;\n    PANOSE elfPanose;\n  } EXTLOGFONTA,*PEXTLOGFONTA,*NPEXTLOGFONTA,*LPEXTLOGFONTA;\n\n  typedef struct tagEXTLOGFONTW {\n    LOGFONTW elfLogFont;\n    WCHAR elfFullName[LF_FULLFACESIZE];\n    WCHAR elfStyle[LF_FACESIZE];\n    DWORD elfVersion;\n    DWORD elfStyleSize;\n    DWORD elfMatch;\n    DWORD elfReserved;\n    BYTE elfVendorId[ELF_VENDOR_SIZE];\n    DWORD elfCulture;\n    PANOSE elfPanose;\n  } EXTLOGFONTW,*PEXTLOGFONTW,*NPEXTLOGFONTW,*LPEXTLOGFONTW;\n#ifdef UNICODE\n  typedef EXTLOGFONTW EXTLOGFONT;\n  typedef PEXTLOGFONTW PEXTLOGFONT;\n  typedef NPEXTLOGFONTW NPEXTLOGFONT;\n  typedef LPEXTLOGFONTW LPEXTLOGFONT;\n#else\n  typedef EXTLOGFONTA EXTLOGFONT;\n  typedef PEXTLOGFONTA PEXTLOGFONT;\n  typedef NPEXTLOGFONTA NPEXTLOGFONT;\n  typedef LPEXTLOGFONTA LPEXTLOGFONT;\n#endif\n\n#define ELF_VERSION 0\n#define ELF_CULTURE_LATIN 0\n\n#define RASTER_FONTTYPE 0x0001\n#define DEVICE_FONTTYPE 0x002\n#define TRUETYPE_FONTTYPE 0x004\n\n#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))\n#define PALETTERGB(r,g,b) (0x02000000 | RGB(r,g,b))\n#define PALETTEINDEX(i) ((COLORREF)(0x01000000 | (DWORD)(WORD)(i)))\n\n#define PC_RESERVED 0x01\n#define PC_EXPLICIT 0x02\n#define PC_NOCOLLAPSE 0x04\n\n#define GetRValue(rgb) (LOBYTE(rgb))\n#define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8))\n#define GetBValue(rgb) (LOBYTE((rgb)>>16))\n\n#define TRANSPARENT 1\n#define OPAQUE 2\n#define BKMODE_LAST 2\n\n#define GM_COMPATIBLE 1\n#define GM_ADVANCED 2\n#define GM_LAST 2\n\n#define PT_CLOSEFIGURE 0x01\n#define PT_LINETO 0x02\n#define PT_BEZIERTO 0x04\n#define PT_MOVETO 0x06\n\n#define MM_TEXT 1\n#define MM_LOMETRIC 2\n#define MM_HIMETRIC 3\n#define MM_LOENGLISH 4\n#define MM_HIENGLISH 5\n#define MM_TWIPS 6\n#define MM_ISOTROPIC 7\n#define MM_ANISOTROPIC 8\n\n#define MM_MIN MM_TEXT\n#define MM_MAX MM_ANISOTROPIC\n#define MM_MAX_FIXEDSCALE MM_TWIPS\n\n#define ABSOLUTE 1\n#define RELATIVE 2\n\n#define WHITE_BRUSH 0\n#define LTGRAY_BRUSH 1\n#define GRAY_BRUSH 2\n#define DKGRAY_BRUSH 3\n#define BLACK_BRUSH 4\n#define NULL_BRUSH 5\n#define HOLLOW_BRUSH NULL_BRUSH\n#define WHITE_PEN 6\n#define BLACK_PEN 7\n#define NULL_PEN 8\n#define OEM_FIXED_FONT 10\n#define ANSI_FIXED_FONT 11\n#define ANSI_VAR_FONT 12\n#define SYSTEM_FONT 13\n#define DEVICE_DEFAULT_FONT 14\n#define DEFAULT_PALETTE 15\n#define SYSTEM_FIXED_FONT 16\n\n#define DEFAULT_GUI_FONT 17\n\n#define DC_BRUSH 18\n#define DC_PEN 19\n\n#define STOCK_LAST 19\n\n#define CLR_INVALID 0xFFFFFFFF\n\n#define BS_SOLID 0\n#define BS_NULL 1\n#define BS_HOLLOW BS_NULL\n#define BS_HATCHED 2\n#define BS_PATTERN 3\n#define BS_INDEXED 4\n#define BS_DIBPATTERN 5\n#define BS_DIBPATTERNPT 6\n#define BS_PATTERN8X8 7\n#define BS_DIBPATTERN8X8 8\n#define BS_MONOPATTERN 9\n\n#define HS_HORIZONTAL 0\n#define HS_VERTICAL 1\n#define HS_FDIAGONAL 2\n#define HS_BDIAGONAL 3\n#define HS_CROSS 4\n#define HS_DIAGCROSS 5\n\n#define PS_SOLID 0\n#define PS_DASH 1\n#define PS_DOT 2\n#define PS_DASHDOT 3\n#define PS_DASHDOTDOT 4\n#define PS_NULL 5\n#define PS_INSIDEFRAME 6\n#define PS_USERSTYLE 7\n#define PS_ALTERNATE 8\n#define PS_STYLE_MASK 0x0000000F\n\n#define PS_ENDCAP_ROUND 0x00000000\n#define PS_ENDCAP_SQUARE 0x00000100\n#define PS_ENDCAP_FLAT 0x00000200\n#define PS_ENDCAP_MASK 0x00000F00\n\n#define PS_JOIN_ROUND 0x00000000\n#define PS_JOIN_BEVEL 0x00001000\n#define PS_JOIN_MITER 0x00002000\n#define PS_JOIN_MASK 0x0000F000\n\n#define PS_COSMETIC 0x00000000\n#define PS_GEOMETRIC 0x00010000\n#define PS_TYPE_MASK 0x000F0000\n\n#define AD_COUNTERCLOCKWISE 1\n#define AD_CLOCKWISE 2\n\n#define DRIVERVERSION 0\n#define TECHNOLOGY 2\n#define HORZSIZE 4\n#define VERTSIZE 6\n#define HORZRES 8\n#define VERTRES 10\n#define BITSPIXEL 12\n#define PLANES 14\n#define NUMBRUSHES 16\n#define NUMPENS 18\n#define NUMMARKERS 20\n#define NUMFONTS 22\n#define NUMCOLORS 24\n#define PDEVICESIZE 26\n#define CURVECAPS 28\n#define LINECAPS 30\n#define POLYGONALCAPS 32\n#define TEXTCAPS 34\n#define CLIPCAPS 36\n#define RASTERCAPS 38\n#define ASPECTX 40\n#define ASPECTY 42\n#define ASPECTXY 44\n\n#define LOGPIXELSX 88\n#define LOGPIXELSY 90\n\n#define SIZEPALETTE 104\n#define NUMRESERVED 106\n#define COLORRES 108\n\n#define PHYSICALWIDTH 110\n#define PHYSICALHEIGHT 111\n#define PHYSICALOFFSETX 112\n#define PHYSICALOFFSETY 113\n#define SCALINGFACTORX 114\n#define SCALINGFACTORY 115\n\n#define VREFRESH 116\n\n#define DESKTOPVERTRES 117\n\n#define DESKTOPHORZRES 118\n\n#define BLTALIGNMENT 119\n\n#define SHADEBLENDCAPS 120\n#define COLORMGMTCAPS 121\n\n#ifndef NOGDICAPMASKS\n#define DT_PLOTTER 0\n#define DT_RASDISPLAY 1\n#define DT_RASPRINTER 2\n#define DT_RASCAMERA 3\n#define DT_CHARSTREAM 4\n#define DT_METAFILE 5\n#define DT_DISPFILE 6\n\n#define CC_NONE 0\n#define CC_CIRCLES 1\n#define CC_PIE 2\n#define CC_CHORD 4\n#define CC_ELLIPSES 8\n#define CC_WIDE 16\n#define CC_STYLED 32\n#define CC_WIDESTYLED 64\n#define CC_INTERIORS 128\n#define CC_ROUNDRECT 256\n\n#define LC_NONE 0\n#define LC_POLYLINE 2\n#define LC_MARKER 4\n#define LC_POLYMARKER 8\n#define LC_WIDE 16\n#define LC_STYLED 32\n#define LC_WIDESTYLED 64\n#define LC_INTERIORS 128\n\n#define PC_NONE 0\n#define PC_POLYGON 1\n#define PC_RECTANGLE 2\n#define PC_WINDPOLYGON 4\n#define PC_TRAPEZOID 4\n#define PC_SCANLINE 8\n#define PC_WIDE 16\n#define PC_STYLED 32\n#define PC_WIDESTYLED 64\n#define PC_INTERIORS 128\n#define PC_POLYPOLYGON 256\n#define PC_PATHS 512\n\n#define CP_NONE 0\n#define CP_RECTANGLE 1\n#define CP_REGION 2\n\n#define TC_OP_CHARACTER 0x00000001\n#define TC_OP_STROKE 0x00000002\n#define TC_CP_STROKE 0x00000004\n#define TC_CR_90 0x00000008\n#define TC_CR_ANY 0x00000010\n#define TC_SF_X_YINDEP 0x00000020\n#define TC_SA_DOUBLE 0x00000040\n#define TC_SA_INTEGER 0x00000080\n#define TC_SA_CONTIN 0x00000100\n#define TC_EA_DOUBLE 0x00000200\n#define TC_IA_ABLE 0x00000400\n#define TC_UA_ABLE 0x00000800\n#define TC_SO_ABLE 0x00001000\n#define TC_RA_ABLE 0x00002000\n#define TC_VA_ABLE 0x00004000\n#define TC_RESERVED 0x00008000\n#define TC_SCROLLBLT 0x00010000\n#endif\n\n#define RC_NONE\n#define RC_BITBLT 1\n#define RC_BANDING 2\n#define RC_SCALING 4\n#define RC_BITMAP64 8\n#define RC_GDI20_OUTPUT 0x0010\n#define RC_GDI20_STATE 0x0020\n#define RC_SAVEBITMAP 0x0040\n#define RC_DI_BITMAP 0x0080\n#define RC_PALETTE 0x0100\n#define RC_DIBTODEV 0x0200\n#define RC_BIGFONT 0x0400\n#define RC_STRETCHBLT 0x0800\n#define RC_FLOODFILL 0x1000\n#define RC_STRETCHDIB 0x2000\n#define RC_OP_DX_OUTPUT 0x4000\n#define RC_DEVBITS 0x8000\n\n#define SB_NONE 0x00000000\n#define SB_CONST_ALPHA 0x00000001\n#define SB_PIXEL_ALPHA 0x00000002\n#define SB_PREMULT_ALPHA 0x00000004\n\n#define SB_GRAD_RECT 0x00000010\n#define SB_GRAD_TRI 0x00000020\n\n#define CM_NONE 0x00000000\n#define CM_DEVICE_ICM 0x00000001\n#define CM_GAMMA_RAMP 0x00000002\n#define CM_CMYK_COLOR 0x00000004\n\n#define DIB_RGB_COLORS 0\n#define DIB_PAL_COLORS 1\n\n#define SYSPAL_ERROR 0\n#define SYSPAL_STATIC 1\n#define SYSPAL_NOSTATIC 2\n#define SYSPAL_NOSTATIC256 3\n\n#define CBM_INIT 0x04L\n\n#define FLOODFILLBORDER 0\n#define FLOODFILLSURFACE 1\n\n#define CCHDEVICENAME 32\n\n#define CCHFORMNAME 32\n\n  typedef struct _devicemodeA {\n    BYTE dmDeviceName[CCHDEVICENAME];\n    WORD dmSpecVersion;\n    WORD dmDriverVersion;\n    WORD dmSize;\n    WORD dmDriverExtra;\n    DWORD dmFields;\n    union {\n      struct {\n        short dmOrientation;\n        short dmPaperSize;\n        short dmPaperLength;\n        short dmPaperWidth;\n        short dmScale;\n        short dmCopies;\n        short dmDefaultSource;\n        short dmPrintQuality;\n      };\n      struct {\n        POINTL dmPosition;\n        DWORD dmDisplayOrientation;\n        DWORD dmDisplayFixedOutput;\n      };\n    };\n    short dmColor;\n    short dmDuplex;\n    short dmYResolution;\n    short dmTTOption;\n    short dmCollate;\n    BYTE dmFormName[CCHFORMNAME];\n    WORD dmLogPixels;\n    DWORD dmBitsPerPel;\n    DWORD dmPelsWidth;\n    DWORD dmPelsHeight;\n    union {\n      DWORD dmDisplayFlags;\n      DWORD dmNup;\n    };\n    DWORD dmDisplayFrequency;\n    DWORD dmICMMethod;\n    DWORD dmICMIntent;\n    DWORD dmMediaType;\n    DWORD dmDitherType;\n    DWORD dmReserved1;\n    DWORD dmReserved2;\n    DWORD dmPanningWidth;\n    DWORD dmPanningHeight;\n  } DEVMODEA,*PDEVMODEA,*NPDEVMODEA,*LPDEVMODEA;\n\n  typedef struct _devicemodeW {\n    WCHAR dmDeviceName[CCHDEVICENAME];\n    WORD dmSpecVersion;\n    WORD dmDriverVersion;\n    WORD dmSize;\n    WORD dmDriverExtra;\n    DWORD dmFields;\n    union {\n      struct {\n        short dmOrientation;\n        short dmPaperSize;\n        short dmPaperLength;\n        short dmPaperWidth;\n        short dmScale;\n        short dmCopies;\n        short dmDefaultSource;\n        short dmPrintQuality;\n      };\n      struct {\n        POINTL dmPosition;\n        DWORD dmDisplayOrientation;\n        DWORD dmDisplayFixedOutput;\n      };\n    };\n    short dmColor;\n    short dmDuplex;\n    short dmYResolution;\n    short dmTTOption;\n    short dmCollate;\n    WCHAR dmFormName[CCHFORMNAME];\n    WORD dmLogPixels;\n    DWORD dmBitsPerPel;\n    DWORD dmPelsWidth;\n    DWORD dmPelsHeight;\n    union {\n      DWORD dmDisplayFlags;\n      DWORD dmNup;\n    };\n    DWORD dmDisplayFrequency;\n    DWORD dmICMMethod;\n    DWORD dmICMIntent;\n    DWORD dmMediaType;\n    DWORD dmDitherType;\n    DWORD dmReserved1;\n    DWORD dmReserved2;\n    DWORD dmPanningWidth;\n    DWORD dmPanningHeight;\n  } DEVMODEW,*PDEVMODEW,*NPDEVMODEW,*LPDEVMODEW;\n#ifdef UNICODE\n  typedef DEVMODEW DEVMODE;\n  typedef PDEVMODEW PDEVMODE;\n  typedef NPDEVMODEW NPDEVMODE;\n  typedef LPDEVMODEW LPDEVMODE;\n#else\n  typedef DEVMODEA DEVMODE;\n  typedef PDEVMODEA PDEVMODE;\n  typedef NPDEVMODEA NPDEVMODE;\n  typedef LPDEVMODEA LPDEVMODE;\n#endif\n\n#define DM_SPECVERSION 0x0401\n\n#define DM_ORIENTATION 0x00000001L\n#define DM_PAPERSIZE 0x00000002L\n#define DM_PAPERLENGTH 0x00000004L\n#define DM_PAPERWIDTH 0x00000008L\n#define DM_SCALE 0x00000010L\n#define DM_POSITION 0x00000020L\n#define DM_NUP 0x00000040L\n#define DM_DISPLAYORIENTATION 0x00000080L\n#define DM_COPIES 0x00000100L\n#define DM_DEFAULTSOURCE 0x00000200L\n#define DM_PRINTQUALITY 0x00000400L\n#define DM_COLOR 0x00000800L\n#define DM_DUPLEX 0x00001000L\n#define DM_YRESOLUTION 0x00002000L\n#define DM_TTOPTION 0x00004000L\n#define DM_COLLATE 0x00008000L\n#define DM_FORMNAME 0x00010000L\n#define DM_LOGPIXELS 0x00020000L\n#define DM_BITSPERPEL 0x00040000L\n#define DM_PELSWIDTH 0x00080000L\n#define DM_PELSHEIGHT 0x00100000L\n#define DM_DISPLAYFLAGS 0x00200000L\n#define DM_DISPLAYFREQUENCY 0x00400000L\n#define DM_ICMMETHOD 0x00800000L\n#define DM_ICMINTENT 0x01000000L\n#define DM_MEDIATYPE 0x02000000L\n#define DM_DITHERTYPE 0x04000000L\n#define DM_PANNINGWIDTH 0x08000000L\n#define DM_PANNINGHEIGHT 0x10000000L\n#define DM_DISPLAYFIXEDOUTPUT 0x20000000L\n\n#define DMORIENT_PORTRAIT 1\n#define DMORIENT_LANDSCAPE 2\n\n#define DMPAPER_FIRST DMPAPER_LETTER\n#define DMPAPER_LETTER 1\n#define DMPAPER_LETTERSMALL 2\n#define DMPAPER_TABLOID 3\n#define DMPAPER_LEDGER 4\n#define DMPAPER_LEGAL 5\n#define DMPAPER_STATEMENT 6\n#define DMPAPER_EXECUTIVE 7\n#define DMPAPER_A3 8\n#define DMPAPER_A4 9\n#define DMPAPER_A4SMALL 10\n#define DMPAPER_A5 11\n#define DMPAPER_B4 12\n#define DMPAPER_B5 13\n#define DMPAPER_FOLIO 14\n#define DMPAPER_QUARTO 15\n#define DMPAPER_10X14 16\n#define DMPAPER_11X17 17\n#define DMPAPER_NOTE 18\n#define DMPAPER_ENV_9 19\n#define DMPAPER_ENV_10 20\n#define DMPAPER_ENV_11 21\n#define DMPAPER_ENV_12 22\n#define DMPAPER_ENV_14 23\n#define DMPAPER_CSHEET 24\n#define DMPAPER_DSHEET 25\n#define DMPAPER_ESHEET 26\n#define DMPAPER_ENV_DL 27\n#define DMPAPER_ENV_C5 28\n#define DMPAPER_ENV_C3 29\n#define DMPAPER_ENV_C4 30\n#define DMPAPER_ENV_C6 31\n#define DMPAPER_ENV_C65 32\n#define DMPAPER_ENV_B4 33\n#define DMPAPER_ENV_B5 34\n#define DMPAPER_ENV_B6 35\n#define DMPAPER_ENV_ITALY 36\n#define DMPAPER_ENV_MONARCH 37\n#define DMPAPER_ENV_PERSONAL 38\n#define DMPAPER_FANFOLD_US 39\n#define DMPAPER_FANFOLD_STD_GERMAN 40\n#define DMPAPER_FANFOLD_LGL_GERMAN 41\n#define DMPAPER_ISO_B4 42\n#define DMPAPER_JAPANESE_POSTCARD 43\n#define DMPAPER_9X11 44\n#define DMPAPER_10X11 45\n#define DMPAPER_15X11 46\n#define DMPAPER_ENV_INVITE 47\n#define DMPAPER_RESERVED_48 48\n#define DMPAPER_RESERVED_49 49\n#define DMPAPER_LETTER_EXTRA 50\n#define DMPAPER_LEGAL_EXTRA 51\n#define DMPAPER_TABLOID_EXTRA 52\n#define DMPAPER_A4_EXTRA 53\n#define DMPAPER_LETTER_TRANSVERSE 54\n#define DMPAPER_A4_TRANSVERSE 55\n#define DMPAPER_LETTER_EXTRA_TRANSVERSE 56\n#define DMPAPER_A_PLUS 57\n#define DMPAPER_B_PLUS 58\n#define DMPAPER_LETTER_PLUS 59\n#define DMPAPER_A4_PLUS 60\n#define DMPAPER_A5_TRANSVERSE 61\n#define DMPAPER_B5_TRANSVERSE 62\n#define DMPAPER_A3_EXTRA 63\n#define DMPAPER_A5_EXTRA 64\n#define DMPAPER_B5_EXTRA 65\n#define DMPAPER_A2 66\n#define DMPAPER_A3_TRANSVERSE 67\n#define DMPAPER_A3_EXTRA_TRANSVERSE 68\n#define DMPAPER_DBL_JAPANESE_POSTCARD 69\n#define DMPAPER_A6 70\n#define DMPAPER_JENV_KAKU2 71\n#define DMPAPER_JENV_KAKU3 72\n#define DMPAPER_JENV_CHOU3 73\n#define DMPAPER_JENV_CHOU4 74\n#define DMPAPER_LETTER_ROTATED 75\n#define DMPAPER_A3_ROTATED 76\n#define DMPAPER_A4_ROTATED 77\n#define DMPAPER_A5_ROTATED 78\n#define DMPAPER_B4_JIS_ROTATED 79\n#define DMPAPER_B5_JIS_ROTATED 80\n#define DMPAPER_JAPANESE_POSTCARD_ROTATED 81\n#define DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED 82\n#define DMPAPER_A6_ROTATED 83\n#define DMPAPER_JENV_KAKU2_ROTATED 84\n#define DMPAPER_JENV_KAKU3_ROTATED 85\n#define DMPAPER_JENV_CHOU3_ROTATED 86\n#define DMPAPER_JENV_CHOU4_ROTATED 87\n#define DMPAPER_B6_JIS 88\n#define DMPAPER_B6_JIS_ROTATED 89\n#define DMPAPER_12X11 90\n#define DMPAPER_JENV_YOU4 91\n#define DMPAPER_JENV_YOU4_ROTATED 92\n#define DMPAPER_P16K 93\n#define DMPAPER_P32K 94\n#define DMPAPER_P32KBIG 95\n#define DMPAPER_PENV_1 96\n#define DMPAPER_PENV_2 97\n#define DMPAPER_PENV_3 98\n#define DMPAPER_PENV_4 99\n#define DMPAPER_PENV_5 100\n#define DMPAPER_PENV_6 101\n#define DMPAPER_PENV_7 102\n#define DMPAPER_PENV_8 103\n#define DMPAPER_PENV_9 104\n#define DMPAPER_PENV_10 105\n#define DMPAPER_P16K_ROTATED 106\n#define DMPAPER_P32K_ROTATED 107\n#define DMPAPER_P32KBIG_ROTATED 108\n#define DMPAPER_PENV_1_ROTATED 109\n#define DMPAPER_PENV_2_ROTATED 110\n#define DMPAPER_PENV_3_ROTATED 111\n#define DMPAPER_PENV_4_ROTATED 112\n#define DMPAPER_PENV_5_ROTATED 113\n#define DMPAPER_PENV_6_ROTATED 114\n#define DMPAPER_PENV_7_ROTATED 115\n#define DMPAPER_PENV_8_ROTATED 116\n#define DMPAPER_PENV_9_ROTATED 117\n#define DMPAPER_PENV_10_ROTATED 118\n\n#define DMPAPER_LAST DMPAPER_PENV_10_ROTATED\n\n#define DMPAPER_USER 256\n\n#define DMBIN_FIRST DMBIN_UPPER\n#define DMBIN_UPPER 1\n#define DMBIN_ONLYONE 1\n#define DMBIN_LOWER 2\n#define DMBIN_MIDDLE 3\n#define DMBIN_MANUAL 4\n#define DMBIN_ENVELOPE 5\n#define DMBIN_ENVMANUAL 6\n#define DMBIN_AUTO 7\n#define DMBIN_TRACTOR 8\n#define DMBIN_SMALLFMT 9\n#define DMBIN_LARGEFMT 10\n#define DMBIN_LARGECAPACITY 11\n#define DMBIN_CASSETTE 14\n#define DMBIN_FORMSOURCE 15\n#define DMBIN_LAST DMBIN_FORMSOURCE\n\n#define DMBIN_USER 256\n\n#define DMRES_DRAFT (-1)\n#define DMRES_LOW (-2)\n#define DMRES_MEDIUM (-3)\n#define DMRES_HIGH (-4)\n\n#define DMCOLOR_MONOCHROME 1\n#define DMCOLOR_COLOR 2\n\n#define DMDUP_SIMPLEX 1\n#define DMDUP_VERTICAL 2\n#define DMDUP_HORIZONTAL 3\n\n#define DMTT_BITMAP 1\n#define DMTT_DOWNLOAD 2\n#define DMTT_SUBDEV 3\n#define DMTT_DOWNLOAD_OUTLINE 4\n\n#define DMCOLLATE_FALSE 0\n#define DMCOLLATE_TRUE 1\n\n#define DMDO_DEFAULT 0\n#define DMDO_90 1\n#define DMDO_180 2\n#define DMDO_270 3\n\n#define DMDFO_DEFAULT 0\n#define DMDFO_STRETCH 1\n#define DMDFO_CENTER 2\n\n#define DMDISPLAYFLAGS_TEXTMODE 0x00000004\n\n#define DMNUP_SYSTEM 1\n#define DMNUP_ONEUP 2\n\n#define DMICMMETHOD_NONE 1\n#define DMICMMETHOD_SYSTEM 2\n#define DMICMMETHOD_DRIVER 3\n#define DMICMMETHOD_DEVICE 4\n\n#define DMICMMETHOD_USER 256\n\n#define DMICM_SATURATE 1\n#define DMICM_CONTRAST 2\n#define DMICM_COLORIMETRIC 3\n#define DMICM_ABS_COLORIMETRIC 4\n\n#define DMICM_USER 256\n\n#define DMMEDIA_STANDARD 1\n#define DMMEDIA_TRANSPARENCY 2\n#define DMMEDIA_GLOSSY 3\n\n#define DMMEDIA_USER 256\n\n#define DMDITHER_NONE 1\n#define DMDITHER_COARSE 2\n#define DMDITHER_FINE 3\n#define DMDITHER_LINEART 4\n#define DMDITHER_ERRORDIFFUSION 5\n#define DMDITHER_RESERVED6 6\n#define DMDITHER_RESERVED7 7\n#define DMDITHER_RESERVED8 8\n#define DMDITHER_RESERVED9 9\n#define DMDITHER_GRAYSCALE 10\n\n#define DMDITHER_USER 256\n\n  typedef struct _DISPLAY_DEVICEA {\n    DWORD cb;\n    CHAR DeviceName[32];\n    CHAR DeviceString[128];\n    DWORD StateFlags;\n    CHAR DeviceID[128];\n    CHAR DeviceKey[128];\n  } DISPLAY_DEVICEA,*PDISPLAY_DEVICEA,*LPDISPLAY_DEVICEA;\n  typedef struct _DISPLAY_DEVICEW {\n    DWORD cb;\n    WCHAR DeviceName[32];\n    WCHAR DeviceString[128];\n    DWORD StateFlags;\n    WCHAR DeviceID[128];\n    WCHAR DeviceKey[128];\n  } DISPLAY_DEVICEW,*PDISPLAY_DEVICEW,*LPDISPLAY_DEVICEW;\n#ifdef UNICODE\n  typedef DISPLAY_DEVICEW DISPLAY_DEVICE;\n  typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE;\n  typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE;\n#else\n  typedef DISPLAY_DEVICEA DISPLAY_DEVICE;\n  typedef PDISPLAY_DEVICEA PDISPLAY_DEVICE;\n  typedef LPDISPLAY_DEVICEA LPDISPLAY_DEVICE;\n#endif\n\n#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001\n#define DISPLAY_DEVICE_MULTI_DRIVER 0x00000002\n#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004\n#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008\n#define DISPLAY_DEVICE_VGA_COMPATIBLE 0x00000010\n#define DISPLAY_DEVICE_REMOVABLE 0x00000020\n#define DISPLAY_DEVICE_MODESPRUNED 0x08000000\n#define DISPLAY_DEVICE_REMOTE 0x04000000\n#define DISPLAY_DEVICE_DISCONNECT 0x02000000\n\n#define DISPLAY_DEVICE_ACTIVE 0x00000001\n#define DISPLAY_DEVICE_ATTACHED 0x00000002\n\n#define RDH_RECTANGLES 1\n\n  typedef struct _RGNDATAHEADER {\n    DWORD dwSize;\n    DWORD iType;\n    DWORD nCount;\n    DWORD nRgnSize;\n    RECT rcBound;\n  } RGNDATAHEADER,*PRGNDATAHEADER;\n\n  typedef struct _RGNDATA {\n    RGNDATAHEADER rdh;\n    char Buffer[1];\n  } RGNDATA,*PRGNDATA,*NPRGNDATA,*LPRGNDATA;\n\n#define SYSRGN 4\n\n  typedef struct _ABC {\n    int abcA;\n    UINT abcB;\n    int abcC;\n  } ABC,*PABC,*NPABC,*LPABC;\n\n  typedef struct _ABCFLOAT {\n    FLOAT abcfA;\n    FLOAT abcfB;\n    FLOAT abcfC;\n  } ABCFLOAT,*PABCFLOAT,*NPABCFLOAT,*LPABCFLOAT;\n\n#ifndef NOTEXTMETRIC\n\n  typedef struct _OUTLINETEXTMETRICA {\n    UINT otmSize;\n    TEXTMETRICA otmTextMetrics;\n    BYTE otmFiller;\n    PANOSE otmPanoseNumber;\n    UINT otmfsSelection;\n    UINT otmfsType;\n    int otmsCharSlopeRise;\n    int otmsCharSlopeRun;\n    int otmItalicAngle;\n    UINT otmEMSquare;\n    int otmAscent;\n    int otmDescent;\n    UINT otmLineGap;\n    UINT otmsCapEmHeight;\n    UINT otmsXHeight;\n    RECT otmrcFontBox;\n    int otmMacAscent;\n    int otmMacDescent;\n    UINT otmMacLineGap;\n    UINT otmusMinimumPPEM;\n    POINT otmptSubscriptSize;\n    POINT otmptSubscriptOffset;\n    POINT otmptSuperscriptSize;\n    POINT otmptSuperscriptOffset;\n    UINT otmsStrikeoutSize;\n    int otmsStrikeoutPosition;\n    int otmsUnderscoreSize;\n    int otmsUnderscorePosition;\n    PSTR otmpFamilyName;\n    PSTR otmpFaceName;\n    PSTR otmpStyleName;\n    PSTR otmpFullName;\n  } OUTLINETEXTMETRICA,*POUTLINETEXTMETRICA,*NPOUTLINETEXTMETRICA,*LPOUTLINETEXTMETRICA;\n\n  typedef struct _OUTLINETEXTMETRICW {\n    UINT otmSize;\n    TEXTMETRICW otmTextMetrics;\n    BYTE otmFiller;\n    PANOSE otmPanoseNumber;\n    UINT otmfsSelection;\n    UINT otmfsType;\n    int otmsCharSlopeRise;\n    int otmsCharSlopeRun;\n    int otmItalicAngle;\n    UINT otmEMSquare;\n    int otmAscent;\n    int otmDescent;\n    UINT otmLineGap;\n    UINT otmsCapEmHeight;\n    UINT otmsXHeight;\n    RECT otmrcFontBox;\n    int otmMacAscent;\n    int otmMacDescent;\n    UINT otmMacLineGap;\n    UINT otmusMinimumPPEM;\n    POINT otmptSubscriptSize;\n    POINT otmptSubscriptOffset;\n    POINT otmptSuperscriptSize;\n    POINT otmptSuperscriptOffset;\n    UINT otmsStrikeoutSize;\n    int otmsStrikeoutPosition;\n    int otmsUnderscoreSize;\n    int otmsUnderscorePosition;\n    PSTR otmpFamilyName;\n    PSTR otmpFaceName;\n    PSTR otmpStyleName;\n    PSTR otmpFullName;\n  } OUTLINETEXTMETRICW,*POUTLINETEXTMETRICW,*NPOUTLINETEXTMETRICW,*LPOUTLINETEXTMETRICW;\n#ifdef UNICODE\n  typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC;\n  typedef POUTLINETEXTMETRICW POUTLINETEXTMETRIC;\n  typedef NPOUTLINETEXTMETRICW NPOUTLINETEXTMETRIC;\n  typedef LPOUTLINETEXTMETRICW LPOUTLINETEXTMETRIC;\n#else\n  typedef OUTLINETEXTMETRICA OUTLINETEXTMETRIC;\n  typedef POUTLINETEXTMETRICA POUTLINETEXTMETRIC;\n  typedef NPOUTLINETEXTMETRICA NPOUTLINETEXTMETRIC;\n  typedef LPOUTLINETEXTMETRICA LPOUTLINETEXTMETRIC;\n#endif\n#endif\n\n  typedef struct tagPOLYTEXTA {\n    int x;\n    int y;\n    UINT n;\n    LPCSTR lpstr;\n    UINT uiFlags;\n    RECT rcl;\n    int *pdx;\n  } POLYTEXTA,*PPOLYTEXTA,*NPPOLYTEXTA,*LPPOLYTEXTA;\n\n  typedef struct tagPOLYTEXTW {\n    int x;\n    int y;\n    UINT n;\n    LPCWSTR lpstr;\n    UINT uiFlags;\n    RECT rcl;\n    int *pdx;\n  } POLYTEXTW,*PPOLYTEXTW,*NPPOLYTEXTW,*LPPOLYTEXTW;\n#ifdef UNICODE\n  typedef POLYTEXTW POLYTEXT;\n  typedef PPOLYTEXTW PPOLYTEXT;\n  typedef NPPOLYTEXTW NPPOLYTEXT;\n  typedef LPPOLYTEXTW LPPOLYTEXT;\n#else\n  typedef POLYTEXTA POLYTEXT;\n  typedef PPOLYTEXTA PPOLYTEXT;\n  typedef NPPOLYTEXTA NPPOLYTEXT;\n  typedef LPPOLYTEXTA LPPOLYTEXT;\n#endif\n\n  typedef struct _FIXED {\n    WORD fract;\n    short value;\n  } FIXED;\n\n  typedef struct _MAT2 {\n    FIXED eM11;\n    FIXED eM12;\n    FIXED eM21;\n    FIXED eM22;\n  } MAT2,*LPMAT2;\n\n  typedef struct _GLYPHMETRICS {\n    UINT gmBlackBoxX;\n    UINT gmBlackBoxY;\n    POINT gmptGlyphOrigin;\n    short gmCellIncX;\n    short gmCellIncY;\n  } GLYPHMETRICS,*LPGLYPHMETRICS;\n\n#define GGO_METRICS 0\n#define GGO_BITMAP 1\n#define GGO_NATIVE 2\n#define GGO_BEZIER 3\n\n#define GGO_GRAY2_BITMAP 4\n#define GGO_GRAY4_BITMAP 5\n#define GGO_GRAY8_BITMAP 6\n#define GGO_GLYPH_INDEX 0x0080\n#define GGO_UNHINTED 0x0100\n\n#define TT_POLYGON_TYPE 24\n\n#define TT_PRIM_LINE 1\n#define TT_PRIM_QSPLINE 2\n#define TT_PRIM_CSPLINE 3\n\n  typedef struct tagPOINTFX {\n    FIXED x;\n    FIXED y;\n  } POINTFX,*LPPOINTFX;\n\n  typedef struct tagTTPOLYCURVE {\n    WORD wType;\n    WORD cpfx;\n    POINTFX apfx[1];\n  } TTPOLYCURVE,*LPTTPOLYCURVE;\n\n  typedef struct tagTTPOLYGONHEADER {\n    DWORD cb;\n    DWORD dwType;\n    POINTFX pfxStart;\n  } TTPOLYGONHEADER,*LPTTPOLYGONHEADER;\n\n#define GCP_DBCS 0x0001\n#define GCP_REORDER 0x0002\n#define GCP_USEKERNING 0x0008\n#define GCP_GLYPHSHAPE 0x0010\n#define GCP_LIGATE 0x0020\n\n#define GCP_DIACRITIC 0x0100\n#define GCP_KASHIDA 0x0400\n#define GCP_ERROR 0x8000\n#define FLI_MASK 0x103B\n\n#define GCP_JUSTIFY 0x00010000L\n\n#define FLI_GLYPHS 0x00040000L\n#define GCP_CLASSIN 0x00080000L\n#define GCP_MAXEXTENT 0x00100000L\n#define GCP_JUSTIFYIN 0x00200000L\n#define GCP_DISPLAYZWG 0x00400000L\n#define GCP_SYMSWAPOFF 0x00800000L\n#define GCP_NUMERICOVERRIDE 0x01000000L\n#define GCP_NEUTRALOVERRIDE 0x02000000L\n#define GCP_NUMERICSLATIN 0x04000000L\n#define GCP_NUMERICSLOCAL 0x08000000L\n\n#define GCPCLASS_LATIN 1\n#define GCPCLASS_HEBREW 2\n#define GCPCLASS_ARABIC 2\n#define GCPCLASS_NEUTRAL 3\n#define GCPCLASS_LOCALNUMBER 4\n#define GCPCLASS_LATINNUMBER 5\n#define GCPCLASS_LATINNUMERICTERMINATOR 6\n#define GCPCLASS_LATINNUMERICSEPARATOR 7\n#define GCPCLASS_NUMERICSEPARATOR 8\n#define GCPCLASS_PREBOUNDLTR 0x80\n#define GCPCLASS_PREBOUNDRTL 0x40\n#define GCPCLASS_POSTBOUNDLTR 0x20\n#define GCPCLASS_POSTBOUNDRTL 0x10\n\n#define GCPGLYPH_LINKBEFORE 0x8000\n#define GCPGLYPH_LINKAFTER 0x4000\n\n  typedef struct tagGCP_RESULTSA {\n    DWORD lStructSize;\n    LPSTR lpOutString;\n    UINT *lpOrder;\n    int *lpDx;\n    int *lpCaretPos;\n    LPSTR lpClass;\n    LPWSTR lpGlyphs;\n    UINT nGlyphs;\n    int nMaxFit;\n  } GCP_RESULTSA,*LPGCP_RESULTSA;\n  typedef struct tagGCP_RESULTSW {\n    DWORD lStructSize;\n    LPWSTR lpOutString;\n    UINT *lpOrder;\n    int *lpDx;\n    int *lpCaretPos;\n    LPSTR lpClass;\n    LPWSTR lpGlyphs;\n    UINT nGlyphs;\n    int nMaxFit;\n  } GCP_RESULTSW,*LPGCP_RESULTSW;\n#ifdef UNICODE\n  typedef GCP_RESULTSW GCP_RESULTS;\n  typedef LPGCP_RESULTSW LPGCP_RESULTS;\n#else\n  typedef GCP_RESULTSA GCP_RESULTS;\n  typedef LPGCP_RESULTSA LPGCP_RESULTS;\n#endif\n\n  typedef struct _RASTERIZER_STATUS {\n    short nSize;\n    short wFlags;\n    short nLanguageID;\n  } RASTERIZER_STATUS,*LPRASTERIZER_STATUS;\n\n#define TT_AVAILABLE 0x0001\n#define TT_ENABLED 0x0002\n\n  typedef struct tagPIXELFORMATDESCRIPTOR {\n    WORD nSize;\n    WORD nVersion;\n    DWORD dwFlags;\n    BYTE iPixelType;\n    BYTE cColorBits;\n    BYTE cRedBits;\n    BYTE cRedShift;\n    BYTE cGreenBits;\n    BYTE cGreenShift;\n    BYTE cBlueBits;\n    BYTE cBlueShift;\n    BYTE cAlphaBits;\n    BYTE cAlphaShift;\n    BYTE cAccumBits;\n    BYTE cAccumRedBits;\n    BYTE cAccumGreenBits;\n    BYTE cAccumBlueBits;\n    BYTE cAccumAlphaBits;\n    BYTE cDepthBits;\n    BYTE cStencilBits;\n    BYTE cAuxBuffers;\n    BYTE iLayerType;\n    BYTE bReserved;\n    DWORD dwLayerMask;\n    DWORD dwVisibleMask;\n    DWORD dwDamageMask;\n  } PIXELFORMATDESCRIPTOR,*PPIXELFORMATDESCRIPTOR,*LPPIXELFORMATDESCRIPTOR;\n\n#define PFD_TYPE_RGBA 0\n#define PFD_TYPE_COLORINDEX 1\n\n#define PFD_MAIN_PLANE 0\n#define PFD_OVERLAY_PLANE 1\n#define PFD_UNDERLAY_PLANE (-1)\n\n#define PFD_DOUBLEBUFFER 0x00000001\n#define PFD_STEREO 0x00000002\n#define PFD_DRAW_TO_WINDOW 0x00000004\n#define PFD_DRAW_TO_BITMAP 0x00000008\n#define PFD_SUPPORT_GDI 0x00000010\n#define PFD_SUPPORT_OPENGL 0x00000020\n#define PFD_GENERIC_FORMAT 0x00000040\n#define PFD_NEED_PALETTE 0x00000080\n#define PFD_NEED_SYSTEM_PALETTE 0x00000100\n#define PFD_SWAP_EXCHANGE 0x00000200\n#define PFD_SWAP_COPY 0x00000400\n#define PFD_SWAP_LAYER_BUFFERS 0x00000800\n#define PFD_GENERIC_ACCELERATED 0x00001000\n#define PFD_SUPPORT_DIRECTDRAW 0x00002000\n\n#define PFD_DEPTH_DONTCARE 0x20000000\n#define PFD_DOUBLEBUFFER_DONTCARE 0x40000000\n#define PFD_STEREO_DONTCARE 0x80000000\n\n#ifndef NOTEXTMETRIC\n  typedef int (CALLBACK *OLDFONTENUMPROCA)(CONST LOGFONTA *,CONST TEXTMETRICA *,DWORD,LPARAM);\n  typedef int (CALLBACK *OLDFONTENUMPROCW)(CONST LOGFONTW *,CONST TEXTMETRICW *,DWORD,LPARAM);\n#ifdef UNICODE\n#define OLDFONTENUMPROC OLDFONTENUMPROCW\n#else\n#define OLDFONTENUMPROC OLDFONTENUMPROCA\n#endif\n#else\n  typedef int (CALLBACK *OLDFONTENUMPROCA)(CONST LOGFONTA *,CONST VOID *,DWORD,LPARAM);\n  typedef int (CALLBACK *OLDFONTENUMPROCW)(CONST LOGFONTW *,CONST VOID *,DWORD,LPARAM);\n#ifdef UNICODE\n#define OLDFONTENUMPROC OLDFONTENUMPROCW\n#else\n#define OLDFONTENUMPROC OLDFONTENUMPROCA\n#endif\n#endif\n\n  typedef OLDFONTENUMPROCA FONTENUMPROCA;\n  typedef OLDFONTENUMPROCW FONTENUMPROCW;\n#ifdef UNICODE\n  typedef FONTENUMPROCW FONTENUMPROC;\n#else\n  typedef FONTENUMPROCA FONTENUMPROC;\n#endif\n\n  typedef int (CALLBACK *GOBJENUMPROC)(LPVOID,LPARAM);\n  typedef VOID (CALLBACK *LINEDDAPROC)(int,int,LPARAM);\n\n#ifdef UNICODE\n#define AddFontResource AddFontResourceW\n#define CopyMetaFile CopyMetaFileW\n#define CreateDC CreateDCW\n#define CreateFontIndirect CreateFontIndirectW\n#define CreateFont CreateFontW\n#define CreateIC CreateICW\n#define CreateMetaFile CreateMetaFileW\n#define CreateScalableFontResource CreateScalableFontResourceW\n#else\n#define AddFontResource AddFontResourceA\n#define CopyMetaFile CopyMetaFileA\n#define CreateDC CreateDCA\n#define CreateFontIndirect CreateFontIndirectA\n#define CreateFont CreateFontA\n#define CreateIC CreateICA\n#define CreateMetaFile CreateMetaFileA\n#define CreateScalableFontResource CreateScalableFontResourceA\n#endif\n\n  WINGDIAPI int WINAPI AddFontResourceA(LPCSTR);\n  WINGDIAPI int WINAPI AddFontResourceW(LPCWSTR);\n  WINGDIAPI WINBOOL WINAPI AnimatePalette(HPALETTE hPal,UINT iStartIndex,UINT cEntries,CONST PALETTEENTRY *ppe);\n  WINGDIAPI WINBOOL WINAPI Arc(HDC hdc,int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);\n  WINGDIAPI WINBOOL WINAPI BitBlt(HDC hdc,int x,int y,int cx,int cy,HDC hdcSrc,int x1,int y1,DWORD rop);\n  WINGDIAPI WINBOOL WINAPI CancelDC(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI Chord(HDC hdc,int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);\n  WINGDIAPI int WINAPI ChoosePixelFormat(HDC hdc,CONST PIXELFORMATDESCRIPTOR *ppfd);\n  WINGDIAPI HMETAFILE WINAPI CloseMetaFile(HDC hdc);\n  WINGDIAPI int WINAPI CombineRgn(HRGN hrgnDst,HRGN hrgnSrc1,HRGN hrgnSrc2,int iMode);\n  WINGDIAPI HMETAFILE WINAPI CopyMetaFileA(HMETAFILE,LPCSTR);\n  WINGDIAPI HMETAFILE WINAPI CopyMetaFileW(HMETAFILE,LPCWSTR);\n  WINGDIAPI HBITMAP WINAPI CreateBitmap(int nWidth,int nHeight,UINT nPlanes,UINT nBitCount,CONST VOID *lpBits);\n  WINGDIAPI HBITMAP WINAPI CreateBitmapIndirect(CONST BITMAP *pbm);\n  WINGDIAPI HBRUSH WINAPI CreateBrushIndirect(CONST LOGBRUSH *plbrush);\n  WINGDIAPI HBITMAP WINAPI CreateCompatibleBitmap(HDC hdc,int cx,int cy);\n  WINGDIAPI HBITMAP WINAPI CreateDiscardableBitmap(HDC hdc,int cx,int cy);\n  WINGDIAPI HDC WINAPI CreateCompatibleDC(HDC hdc);\n  WINGDIAPI HDC WINAPI CreateDCA(LPCSTR pwszDriver,LPCSTR pwszDevice,LPCSTR pszPort,CONST DEVMODEA *pdm);\n  WINGDIAPI HDC WINAPI CreateDCW(LPCWSTR pwszDriver,LPCWSTR pwszDevice,LPCWSTR pszPort,CONST DEVMODEW *pdm);\n  WINGDIAPI HBITMAP WINAPI CreateDIBitmap(HDC hdc,CONST BITMAPINFOHEADER *pbmih,DWORD flInit,CONST VOID *pjBits,CONST BITMAPINFO *pbmi,UINT iUsage);\n  WINGDIAPI HBRUSH WINAPI CreateDIBPatternBrush(HGLOBAL h,UINT iUsage);\n  WINGDIAPI HBRUSH WINAPI CreateDIBPatternBrushPt(CONST VOID *lpPackedDIB,UINT iUsage);\n  WINGDIAPI HRGN WINAPI CreateEllipticRgn(int x1,int y1,int x2,int y2);\n  WINGDIAPI HRGN WINAPI CreateEllipticRgnIndirect(CONST RECT *lprect);\n  WINGDIAPI HFONT WINAPI CreateFontIndirectA(CONST LOGFONTA *lplf);\n  WINGDIAPI HFONT WINAPI CreateFontIndirectW(CONST LOGFONTW *lplf);\n  WINGDIAPI HFONT WINAPI CreateFontA(int cHeight,int cWidth,int cEscapement,int cOrientation,int cWeight,DWORD bItalic,DWORD bUnderline,DWORD bStrikeOut,DWORD iCharSet,DWORD iOutPrecision,DWORD iClipPrecision,DWORD iQuality,DWORD iPitchAndFamily,LPCSTR pszFaceName);\n  WINGDIAPI HFONT WINAPI CreateFontW(int cHeight,int cWidth,int cEscapement,int cOrientation,int cWeight,DWORD bItalic,DWORD bUnderline,DWORD bStrikeOut,DWORD iCharSet,DWORD iOutPrecision,DWORD iClipPrecision,DWORD iQuality,DWORD iPitchAndFamily,LPCWSTR pszFaceName);\n  WINGDIAPI HBRUSH WINAPI CreateHatchBrush(int iHatch,COLORREF color);\n  WINGDIAPI HDC WINAPI CreateICA(LPCSTR pszDriver,LPCSTR pszDevice,LPCSTR pszPort,CONST DEVMODEA *pdm);\n  WINGDIAPI HDC WINAPI CreateICW(LPCWSTR pszDriver,LPCWSTR pszDevice,LPCWSTR pszPort,CONST DEVMODEW *pdm);\n  WINGDIAPI HDC WINAPI CreateMetaFileA(LPCSTR pszFile);\n  WINGDIAPI HDC WINAPI CreateMetaFileW(LPCWSTR pszFile);\n  WINGDIAPI HPALETTE WINAPI CreatePalette(CONST LOGPALETTE *plpal);\n  WINGDIAPI HPEN WINAPI CreatePen(int iStyle,int cWidth,COLORREF color);\n  WINGDIAPI HPEN WINAPI CreatePenIndirect(CONST LOGPEN *plpen);\n  WINGDIAPI HRGN WINAPI CreatePolyPolygonRgn(CONST POINT *pptl,CONST INT *pc,int cPoly,int iMode);\n  WINGDIAPI HBRUSH WINAPI CreatePatternBrush(HBITMAP hbm);\n  WINGDIAPI HRGN WINAPI CreateRectRgn(int x1,int y1,int x2,int y2);\n  WINGDIAPI HRGN WINAPI CreateRectRgnIndirect(CONST RECT *lprect);\n  WINGDIAPI HRGN WINAPI CreateRoundRectRgn(int x1,int y1,int x2,int y2,int w,int h);\n  WINGDIAPI WINBOOL WINAPI CreateScalableFontResourceA(DWORD fdwHidden,LPCSTR lpszFont,LPCSTR lpszFile,LPCSTR lpszPath);\n  WINGDIAPI WINBOOL WINAPI CreateScalableFontResourceW(DWORD fdwHidden,LPCWSTR lpszFont,LPCWSTR lpszFile,LPCWSTR lpszPath);\n  WINGDIAPI HBRUSH WINAPI CreateSolidBrush(COLORREF color);\n  WINGDIAPI WINBOOL WINAPI DeleteDC(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI DeleteMetaFile(HMETAFILE hmf);\n  WINGDIAPI WINBOOL WINAPI DeleteObject(HGDIOBJ ho);\n  WINGDIAPI int WINAPI DescribePixelFormat(HDC hdc,int iPixelFormat,UINT nBytes,LPPIXELFORMATDESCRIPTOR ppfd);\n\n  typedef UINT (CALLBACK *LPFNDEVMODE)(HWND,HMODULE,LPDEVMODE,LPSTR,LPSTR,LPDEVMODE,LPSTR,UINT);\n  typedef DWORD (CALLBACK *LPFNDEVCAPS)(LPSTR,LPSTR,UINT,LPSTR,LPDEVMODE);\n\n#define DM_UPDATE 1\n#define DM_COPY 2\n#define DM_PROMPT 4\n#define DM_MODIFY 8\n\n#define DM_IN_BUFFER DM_MODIFY\n#define DM_IN_PROMPT DM_PROMPT\n#define DM_OUT_BUFFER DM_COPY\n#define DM_OUT_DEFAULT DM_UPDATE\n\n#define DC_FIELDS 1\n#define DC_PAPERS 2\n#define DC_PAPERSIZE 3\n#define DC_MINEXTENT 4\n#define DC_MAXEXTENT 5\n#define DC_BINS 6\n#define DC_DUPLEX 7\n#define DC_SIZE 8\n#define DC_EXTRA 9\n#define DC_VERSION 10\n#define DC_DRIVER 11\n#define DC_BINNAMES 12\n#define DC_ENUMRESOLUTIONS 13\n#define DC_FILEDEPENDENCIES 14\n#define DC_TRUETYPE 15\n#define DC_PAPERNAMES 16\n#define DC_ORIENTATION 17\n#define DC_COPIES 18\n#define DC_BINADJUST 19\n#define DC_EMF_COMPLIANT 20\n#define DC_DATATYPE_PRODUCED 21\n#define DC_COLLATE 22\n#define DC_MANUFACTURER 23\n#define DC_MODEL 24\n#define DC_PERSONALITY 25\n#define DC_PRINTRATE 26\n#define DC_PRINTRATEUNIT 27\n#define PRINTRATEUNIT_PPM 1\n#define PRINTRATEUNIT_CPS 2\n#define PRINTRATEUNIT_LPM 3\n#define PRINTRATEUNIT_IPM 4\n#define DC_PRINTERMEM 28\n#define DC_MEDIAREADY 29\n#define DC_STAPLE 30\n#define DC_PRINTRATEPPM 31\n#define DC_COLORDEVICE 32\n#define DC_NUP 33\n#define DC_MEDIATYPENAMES 34\n#define DC_MEDIATYPES 35\n\n#define DCTT_BITMAP 0x0000001L\n#define DCTT_DOWNLOAD 0x0000002L\n#define DCTT_SUBDEV 0x0000004L\n#define DCTT_DOWNLOAD_OUTLINE 0x0000008L\n\n#define DCBA_FACEUPNONE 0x0000\n#define DCBA_FACEUPCENTER 0x0001\n#define DCBA_FACEUPLEFT 0x0002\n#define DCBA_FACEUPRIGHT 0x0003\n#define DCBA_FACEDOWNNONE 0x0100\n#define DCBA_FACEDOWNCENTER 0x0101\n#define DCBA_FACEDOWNLEFT 0x0102\n#define DCBA_FACEDOWNRIGHT 0x0103\n\n#ifdef UNICODE\n#define DeviceCapabilities DeviceCapabilitiesW\n#define EnumFontFamiliesEx EnumFontFamiliesExW\n#define EnumFontFamilies EnumFontFamiliesW\n#define EnumFonts EnumFontsW\n#define GetCharWidth GetCharWidthW\n#define GetCharWidth32 GetCharWidth32W\n#define GetCharWidthFloat GetCharWidthFloatW\n#define GetCharABCWidths GetCharABCWidthsW\n#define GetCharABCWidthsFloat GetCharABCWidthsFloatW\n#define GetGlyphOutline GetGlyphOutlineW\n#define GetMetaFile GetMetaFileW\n#else\n#define DeviceCapabilities DeviceCapabilitiesA\n#define EnumFontFamiliesEx EnumFontFamiliesExA\n#define EnumFontFamilies EnumFontFamiliesA\n#define EnumFonts EnumFontsA\n#define GetCharWidth GetCharWidthA\n#define GetCharWidth32 GetCharWidth32A\n#define GetCharWidthFloat GetCharWidthFloatA\n#define GetCharABCWidths GetCharABCWidthsA\n#define GetCharABCWidthsFloat GetCharABCWidthsFloatA\n#define GetGlyphOutline GetGlyphOutlineA\n#define GetMetaFile GetMetaFileA\n#endif\n\n  WINSPOOLAPI int WINAPI DeviceCapabilitiesA(LPCSTR pDevice,LPCSTR pPort,WORD fwCapability,LPSTR pOutput,CONST DEVMODEA *pDevMode);\n  WINSPOOLAPI int WINAPI DeviceCapabilitiesW(LPCWSTR pDevice,LPCWSTR pPort,WORD fwCapability,LPWSTR pOutput,CONST DEVMODEW *pDevMode);\n  WINGDIAPI int WINAPI DrawEscape(HDC hdc,int iEscape,int cjIn,LPCSTR lpIn);\n  WINGDIAPI WINBOOL WINAPI Ellipse(HDC hdc,int left,int top,int right,int bottom);\n  WINGDIAPI int WINAPI EnumFontFamiliesExA(HDC hdc,LPLOGFONTA lpLogfont,FONTENUMPROCA lpProc,LPARAM lParam,DWORD dwFlags);\n  WINGDIAPI int WINAPI EnumFontFamiliesExW(HDC hdc,LPLOGFONTW lpLogfont,FONTENUMPROCW lpProc,LPARAM lParam,DWORD dwFlags);\n  WINGDIAPI int WINAPI EnumFontFamiliesA(HDC hdc,LPCSTR lpLogfont,FONTENUMPROCA lpProc,LPARAM lParam);\n  WINGDIAPI int WINAPI EnumFontFamiliesW(HDC hdc,LPCWSTR lpLogfont,FONTENUMPROCW lpProc,LPARAM lParam);\n  WINGDIAPI int WINAPI EnumFontsA(HDC hdc,LPCSTR lpLogfont,FONTENUMPROCA lpProc,LPARAM lParam);\n  WINGDIAPI int WINAPI EnumFontsW(HDC hdc,LPCWSTR lpLogfont,FONTENUMPROCW lpProc,LPARAM lParam);\n  WINGDIAPI int WINAPI EnumObjects(HDC hdc,int nType,GOBJENUMPROC lpFunc,LPARAM lParam);\n  WINGDIAPI WINBOOL WINAPI EqualRgn(HRGN hrgn1,HRGN hrgn2);\n  WINGDIAPI int WINAPI Escape(HDC hdc,int iEscape,int cjIn,LPCSTR pvIn,LPVOID pvOut);\n  WINGDIAPI int WINAPI ExtEscape(HDC hdc,int iEscape,int cjInput,LPCSTR lpInData,int cjOutput,LPSTR lpOutData);\n  WINGDIAPI int WINAPI ExcludeClipRect(HDC hdc,int left,int top,int right,int bottom);\n  WINGDIAPI HRGN WINAPI ExtCreateRegion(CONST XFORM *lpx,DWORD nCount,CONST RGNDATA *lpData);\n  WINGDIAPI WINBOOL WINAPI ExtFloodFill(HDC hdc,int x,int y,COLORREF color,UINT type);\n  WINGDIAPI WINBOOL WINAPI FillRgn(HDC hdc,HRGN hrgn,HBRUSH hbr);\n  WINGDIAPI WINBOOL WINAPI FloodFill(HDC hdc,int x,int y,COLORREF color);\n  WINGDIAPI WINBOOL WINAPI FrameRgn(HDC hdc,HRGN hrgn,HBRUSH hbr,int w,int h);\n  WINGDIAPI int WINAPI GetROP2(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI GetAspectRatioFilterEx(HDC hdc,LPSIZE lpsize);\n  WINGDIAPI COLORREF WINAPI GetBkColor(HDC hdc);\n  WINGDIAPI COLORREF WINAPI GetDCBrushColor(HDC hdc);\n  WINGDIAPI COLORREF WINAPI GetDCPenColor(HDC hdc);\n  WINGDIAPI int WINAPI GetBkMode(HDC hdc);\n  WINGDIAPI LONG WINAPI GetBitmapBits(HBITMAP hbit,LONG cb,LPVOID lpvBits);\n  WINGDIAPI WINBOOL WINAPI GetBitmapDimensionEx(HBITMAP hbit,LPSIZE lpsize);\n  WINGDIAPI UINT WINAPI GetBoundsRect(HDC hdc,LPRECT lprect,UINT flags);\n  WINGDIAPI WINBOOL WINAPI GetBrushOrgEx(HDC hdc,LPPOINT lppt);\n  WINGDIAPI WINBOOL WINAPI GetCharWidthA(HDC hdc,UINT iFirst,UINT iLast,LPINT lpBuffer);\n  WINGDIAPI WINBOOL WINAPI GetCharWidthW(HDC hdc,UINT iFirst,UINT iLast,LPINT lpBuffer);\n  WINGDIAPI WINBOOL WINAPI GetCharWidth32A(HDC hdc,UINT iFirst,UINT iLast,LPINT lpBuffer);\n  WINGDIAPI WINBOOL WINAPI GetCharWidth32W(HDC hdc,UINT iFirst,UINT iLast,LPINT lpBuffer);\n  WINGDIAPI WINBOOL WINAPI GetCharWidthFloatA(HDC hdc,UINT iFirst,UINT iLast,PFLOAT lpBuffer);\n  WINGDIAPI WINBOOL WINAPI GetCharWidthFloatW(HDC hdc,UINT iFirst,UINT iLast,PFLOAT lpBuffer);\n  WINGDIAPI WINBOOL WINAPI GetCharABCWidthsA(HDC hdc,UINT wFirst,UINT wLast,LPABC lpABC);\n  WINGDIAPI WINBOOL WINAPI GetCharABCWidthsW(HDC hdc,UINT wFirst,UINT wLast,LPABC lpABC);\n  WINGDIAPI WINBOOL WINAPI GetCharABCWidthsFloatA(HDC hdc,UINT iFirst,UINT iLast,LPABCFLOAT lpABC);\n  WINGDIAPI WINBOOL WINAPI GetCharABCWidthsFloatW(HDC hdc,UINT iFirst,UINT iLast,LPABCFLOAT lpABC);\n  WINGDIAPI int WINAPI GetClipBox(HDC hdc,LPRECT lprect);\n  WINGDIAPI int WINAPI GetClipRgn(HDC hdc,HRGN hrgn);\n  WINGDIAPI int WINAPI GetMetaRgn(HDC hdc,HRGN hrgn);\n  WINGDIAPI HGDIOBJ WINAPI GetCurrentObject(HDC hdc,UINT type);\n  WINGDIAPI WINBOOL WINAPI GetCurrentPositionEx(HDC hdc,LPPOINT lppt);\n  WINGDIAPI int WINAPI GetDeviceCaps(HDC hdc,int index);\n  WINGDIAPI int WINAPI GetDIBits(HDC hdc,HBITMAP hbm,UINT start,UINT cLines,LPVOID lpvBits,LPBITMAPINFO lpbmi,UINT usage);\n  WINGDIAPI DWORD WINAPI GetFontData (HDC hdc,DWORD dwTable,DWORD dwOffset,PVOID pvBuffer,DWORD cjBuffer);\n  WINGDIAPI DWORD WINAPI GetGlyphOutlineA(HDC hdc,UINT uChar,UINT fuFormat,LPGLYPHMETRICS lpgm,DWORD cjBuffer,LPVOID pvBuffer,CONST MAT2 *lpmat2);\n  WINGDIAPI DWORD WINAPI GetGlyphOutlineW(HDC hdc,UINT uChar,UINT fuFormat,LPGLYPHMETRICS lpgm,DWORD cjBuffer,LPVOID pvBuffer,CONST MAT2 *lpmat2);\n  WINGDIAPI int WINAPI GetGraphicsMode(HDC hdc);\n  WINGDIAPI int WINAPI GetMapMode(HDC hdc);\n  WINGDIAPI UINT WINAPI GetMetaFileBitsEx(HMETAFILE hMF,UINT cbBuffer,LPVOID lpData);\n  WINGDIAPI HMETAFILE WINAPI GetMetaFileA(LPCSTR lpName);\n  WINGDIAPI HMETAFILE WINAPI GetMetaFileW(LPCWSTR lpName);\n  WINGDIAPI COLORREF WINAPI GetNearestColor(HDC hdc,COLORREF color);\n  WINGDIAPI UINT WINAPI GetNearestPaletteIndex(HPALETTE h,COLORREF color);\n  WINGDIAPI DWORD WINAPI GetObjectType(HGDIOBJ h);\n\n#ifndef NOTEXTMETRIC\n#ifdef UNICODE\n#define GetOutlineTextMetrics GetOutlineTextMetricsW\n#else\n#define GetOutlineTextMetrics GetOutlineTextMetricsA\n#endif\n\n  WINGDIAPI UINT WINAPI GetOutlineTextMetricsA(HDC hdc,UINT cjCopy,LPOUTLINETEXTMETRICA potm);\n  WINGDIAPI UINT WINAPI GetOutlineTextMetricsW(HDC hdc,UINT cjCopy,LPOUTLINETEXTMETRICW potm);\n#endif\n\n#ifdef UNICODE\n#define GetTextExtentPoint GetTextExtentPointW\n#define GetTextExtentPoint32 GetTextExtentPoint32W\n#define GetTextExtentExPoint GetTextExtentExPointW\n#define GetCharacterPlacement GetCharacterPlacementW\n#else\n#define GetTextExtentPoint GetTextExtentPointA\n#define GetTextExtentPoint32 GetTextExtentPoint32A\n#define GetTextExtentExPoint GetTextExtentExPointA\n#define GetCharacterPlacement GetCharacterPlacementA\n#endif\n\n  WINGDIAPI UINT WINAPI GetPaletteEntries(HPALETTE hpal,UINT iStart,UINT cEntries,LPPALETTEENTRY pPalEntries);\n  WINGDIAPI COLORREF WINAPI GetPixel(HDC hdc,int x,int y);\n  WINGDIAPI int WINAPI GetPixelFormat(HDC hdc);\n  WINGDIAPI int WINAPI GetPolyFillMode(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI GetRasterizerCaps(LPRASTERIZER_STATUS lpraststat,UINT cjBytes);\n  WINGDIAPI int WINAPI GetRandomRgn (HDC hdc,HRGN hrgn,INT i);\n  WINGDIAPI DWORD WINAPI GetRegionData(HRGN hrgn,DWORD nCount,LPRGNDATA lpRgnData);\n  WINGDIAPI int WINAPI GetRgnBox(HRGN hrgn,LPRECT lprc);\n  WINGDIAPI HGDIOBJ WINAPI GetStockObject(int i);\n  WINGDIAPI int WINAPI GetStretchBltMode(HDC hdc);\n  WINGDIAPI UINT WINAPI GetSystemPaletteEntries(HDC hdc,UINT iStart,UINT cEntries,LPPALETTEENTRY pPalEntries);\n  WINGDIAPI UINT WINAPI GetSystemPaletteUse(HDC hdc);\n  WINGDIAPI int WINAPI GetTextCharacterExtra(HDC hdc);\n  WINGDIAPI UINT WINAPI GetTextAlign(HDC hdc);\n  WINGDIAPI COLORREF WINAPI GetTextColor(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentPointA(HDC hdc,LPCSTR lpString,int c,LPSIZE lpsz);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentPointW(HDC hdc,LPCWSTR lpString,int c,LPSIZE lpsz);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentPoint32A(HDC hdc,LPCSTR lpString,int c,LPSIZE psizl);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentPoint32W(HDC hdc,LPCWSTR lpString,int c,LPSIZE psizl);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentExPointA(HDC hdc,LPCSTR lpszString,int cchString,int nMaxExtent,LPINT lpnFit,LPINT lpnDx,LPSIZE lpSize);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentExPointW(HDC hdc,LPCWSTR lpszString,int cchString,int nMaxExtent,LPINT lpnFit,LPINT lpnDx,LPSIZE lpSize);\n  WINGDIAPI int WINAPI GetTextCharset(HDC hdc);\n  WINGDIAPI int WINAPI GetTextCharsetInfo(HDC hdc,LPFONTSIGNATURE lpSig,DWORD dwFlags);\n  WINGDIAPI WINBOOL WINAPI TranslateCharsetInfo(DWORD *lpSrc,LPCHARSETINFO lpCs,DWORD dwFlags);\n  WINGDIAPI DWORD WINAPI GetFontLanguageInfo(HDC hdc);\n  WINGDIAPI DWORD WINAPI GetCharacterPlacementA(HDC hdc,LPCSTR lpString,int nCount,int nMexExtent,LPGCP_RESULTSA lpResults,DWORD dwFlags);\n  WINGDIAPI DWORD WINAPI GetCharacterPlacementW(HDC hdc,LPCWSTR lpString,int nCount,int nMexExtent,LPGCP_RESULTSW lpResults,DWORD dwFlags);\n\n  typedef struct tagWCRANGE {\n    WCHAR wcLow;\n    USHORT cGlyphs;\n  } WCRANGE,*PWCRANGE,*LPWCRANGE;\n\n  typedef struct tagGLYPHSET {\n    DWORD cbThis;\n    DWORD flAccel;\n    DWORD cGlyphsSupported;\n    DWORD cRanges;\n    WCRANGE ranges[1];\n  } GLYPHSET,*PGLYPHSET,*LPGLYPHSET;\n\n#define GS_8BIT_INDICES 0x00000001\n\n#define GGI_MARK_NONEXISTING_GLYPHS 0X0001\n\n#ifdef UNICODE\n#define GetGlyphIndices GetGlyphIndicesW\n#else\n#define GetGlyphIndices GetGlyphIndicesA\n#endif\n\n  WINGDIAPI DWORD WINAPI GetFontUnicodeRanges(HDC hdc,LPGLYPHSET lpgs);\n  WINGDIAPI DWORD WINAPI GetGlyphIndicesA(HDC hdc,LPCSTR lpstr,int c,LPWORD pgi,DWORD fl);\n  WINGDIAPI DWORD WINAPI GetGlyphIndicesW(HDC hdc,LPCWSTR lpstr,int c,LPWORD pgi,DWORD fl);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentPointI(HDC hdc,LPWORD pgiIn,int cgi,LPSIZE psize);\n  WINGDIAPI WINBOOL WINAPI GetTextExtentExPointI (HDC hdc,LPWORD lpwszString,int cwchString,int nMaxExtent,LPINT lpnFit,LPINT lpnDx,LPSIZE lpSize);\n  WINGDIAPI WINBOOL WINAPI GetCharWidthI(HDC hdc,UINT giFirst,UINT cgi,LPWORD pgi,LPINT piWidths);\n  WINGDIAPI WINBOOL WINAPI GetCharABCWidthsI(HDC hdc,UINT giFirst,UINT cgi,LPWORD pgi,LPABC pabc);\n\n#define STAMP_DESIGNVECTOR (0x8000000 + 'd' + ('v' << 8))\n#define STAMP_AXESLIST (0x8000000 + 'a' + ('l' << 8))\n#define MM_MAX_NUMAXES 16\n\n  typedef struct tagDESIGNVECTOR {\n    DWORD dvReserved;\n    DWORD dvNumAxes;\n    LONG dvValues[MM_MAX_NUMAXES];\n  } DESIGNVECTOR,*PDESIGNVECTOR,*LPDESIGNVECTOR;\n\n#ifdef UNICODE\n#define AddFontResourceEx AddFontResourceExW\n#define RemoveFontResourceEx RemoveFontResourceExW\n#else\n#define AddFontResourceEx AddFontResourceExA\n#define RemoveFontResourceEx RemoveFontResourceExA\n#endif\n\n  WINGDIAPI int WINAPI AddFontResourceExA(LPCSTR name,DWORD fl,PVOID res);\n  WINGDIAPI int WINAPI AddFontResourceExW(LPCWSTR name,DWORD fl,PVOID res);\n  WINGDIAPI WINBOOL WINAPI RemoveFontResourceExA(LPCSTR name,DWORD fl,PVOID pdv);\n  WINGDIAPI WINBOOL WINAPI RemoveFontResourceExW(LPCWSTR name,DWORD fl,PVOID pdv);\n  WINGDIAPI HANDLE WINAPI AddFontMemResourceEx(PVOID pFileView,DWORD cjSize,PVOID pvResrved,DWORD *pNumFonts);\n  WINGDIAPI WINBOOL WINAPI RemoveFontMemResourceEx(HANDLE h);\n\n#define FR_PRIVATE 0x10\n#define FR_NOT_ENUM 0x20\n\n#define MM_MAX_AXES_NAMELEN 16\n\n  typedef struct tagAXISINFOA {\n    LONG axMinValue;\n    LONG axMaxValue;\n    BYTE axAxisName[MM_MAX_AXES_NAMELEN];\n  } AXISINFOA,*PAXISINFOA,*LPAXISINFOA;\n\n  typedef struct tagAXISINFOW {\n    LONG axMinValue;\n    LONG axMaxValue;\n    WCHAR axAxisName[MM_MAX_AXES_NAMELEN];\n  } AXISINFOW,*PAXISINFOW,*LPAXISINFOW;\n#ifdef UNICODE\n  typedef AXISINFOW AXISINFO;\n  typedef PAXISINFOW PAXISINFO;\n  typedef LPAXISINFOW LPAXISINFO;\n#else\n  typedef AXISINFOA AXISINFO;\n  typedef PAXISINFOA PAXISINFO;\n  typedef LPAXISINFOA LPAXISINFO;\n#endif\n\n  typedef struct tagAXESLISTA {\n    DWORD axlReserved;\n    DWORD axlNumAxes;\n    AXISINFOA axlAxisInfo[MM_MAX_NUMAXES];\n  } AXESLISTA,*PAXESLISTA,*LPAXESLISTA;\n\n  typedef struct tagAXESLISTW {\n    DWORD axlReserved;\n    DWORD axlNumAxes;\n    AXISINFOW axlAxisInfo[MM_MAX_NUMAXES];\n  } AXESLISTW,*PAXESLISTW,*LPAXESLISTW;\n#ifdef UNICODE\n  typedef AXESLISTW AXESLIST;\n  typedef PAXESLISTW PAXESLIST;\n  typedef LPAXESLISTW LPAXESLIST;\n#else\n  typedef AXESLISTA AXESLIST;\n  typedef PAXESLISTA PAXESLIST;\n  typedef LPAXESLISTA LPAXESLIST;\n#endif\n\n  typedef struct tagENUMLOGFONTEXDVA {\n    ENUMLOGFONTEXA elfEnumLogfontEx;\n    DESIGNVECTOR elfDesignVector;\n  } ENUMLOGFONTEXDVA,*PENUMLOGFONTEXDVA,*LPENUMLOGFONTEXDVA;\n\n  typedef struct tagENUMLOGFONTEXDVW {\n    ENUMLOGFONTEXW elfEnumLogfontEx;\n    DESIGNVECTOR elfDesignVector;\n  } ENUMLOGFONTEXDVW,*PENUMLOGFONTEXDVW,*LPENUMLOGFONTEXDVW;\n#ifdef UNICODE\n  typedef ENUMLOGFONTEXDVW ENUMLOGFONTEXDV;\n  typedef PENUMLOGFONTEXDVW PENUMLOGFONTEXDV;\n  typedef LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV;\n#else\n  typedef ENUMLOGFONTEXDVA ENUMLOGFONTEXDV;\n  typedef PENUMLOGFONTEXDVA PENUMLOGFONTEXDV;\n  typedef LPENUMLOGFONTEXDVA LPENUMLOGFONTEXDV;\n#endif\n\n#ifdef UNICODE\n#define CreateFontIndirectEx CreateFontIndirectExW\n#else\n#define CreateFontIndirectEx CreateFontIndirectExA\n#endif\n\n  WINGDIAPI HFONT WINAPI CreateFontIndirectExA(CONST ENUMLOGFONTEXDVA *);\n  WINGDIAPI HFONT WINAPI CreateFontIndirectExW(CONST ENUMLOGFONTEXDVW *);\n\n#ifndef NOTEXTMETRIC\n  typedef struct tagENUMTEXTMETRICA {\n    NEWTEXTMETRICEXA etmNewTextMetricEx;\n    AXESLISTA etmAxesList;\n  } ENUMTEXTMETRICA,*PENUMTEXTMETRICA,*LPENUMTEXTMETRICA;\n  typedef struct tagENUMTEXTMETRICW\n  {\n    NEWTEXTMETRICEXW etmNewTextMetricEx;\n    AXESLISTW etmAxesList;\n  } ENUMTEXTMETRICW,*PENUMTEXTMETRICW,*LPENUMTEXTMETRICW;\n#ifdef UNICODE\n  typedef ENUMTEXTMETRICW ENUMTEXTMETRIC;\n  typedef PENUMTEXTMETRICW PENUMTEXTMETRIC;\n  typedef LPENUMTEXTMETRICW LPENUMTEXTMETRIC;\n#else\n  typedef ENUMTEXTMETRICA ENUMTEXTMETRIC;\n  typedef PENUMTEXTMETRICA PENUMTEXTMETRIC;\n  typedef LPENUMTEXTMETRICA LPENUMTEXTMETRIC;\n#endif\n#endif\n\n#ifdef UNICODE\n#define ResetDC ResetDCW\n#define RemoveFontResource RemoveFontResourceW\n#else\n#define ResetDC ResetDCA\n#define RemoveFontResource RemoveFontResourceA\n#endif\n\n  WINGDIAPI WINBOOL WINAPI GetViewportExtEx(HDC hdc,LPSIZE lpsize);\n  WINGDIAPI WINBOOL WINAPI GetViewportOrgEx(HDC hdc,LPPOINT lppoint);\n  WINGDIAPI WINBOOL WINAPI GetWindowExtEx(HDC hdc,LPSIZE lpsize);\n  WINGDIAPI WINBOOL WINAPI GetWindowOrgEx(HDC hdc,LPPOINT lppoint);\n  WINGDIAPI int WINAPI IntersectClipRect(HDC hdc,int left,int top,int right,int bottom);\n  WINGDIAPI WINBOOL WINAPI InvertRgn(HDC hdc,HRGN hrgn);\n  WINGDIAPI WINBOOL WINAPI LineDDA(int xStart,int yStart,int xEnd,int yEnd,LINEDDAPROC lpProc,LPARAM data);\n  WINGDIAPI WINBOOL WINAPI LineTo(HDC hdc,int x,int y);\n  WINGDIAPI WINBOOL WINAPI MaskBlt(HDC hdcDest,int xDest,int yDest,int width,int height,HDC hdcSrc,int xSrc,int ySrc,HBITMAP hbmMask,int xMask,int yMask,DWORD rop);\n  WINGDIAPI WINBOOL WINAPI PlgBlt(HDC hdcDest,CONST POINT *lpPoint,HDC hdcSrc,int xSrc,int ySrc,int width,int height,HBITMAP hbmMask,int xMask,int yMask);\n  WINGDIAPI int WINAPI OffsetClipRgn(HDC hdc,int x,int y);\n  WINGDIAPI int WINAPI OffsetRgn(HRGN hrgn,int x,int y);\n  WINGDIAPI WINBOOL WINAPI PatBlt(HDC hdc,int x,int y,int w,int h,DWORD rop);\n  WINGDIAPI WINBOOL WINAPI Pie(HDC hdc,int left,int top,int right,int bottom,int xr1,int yr1,int xr2,int yr2);\n  WINGDIAPI WINBOOL WINAPI PlayMetaFile(HDC hdc,HMETAFILE hmf);\n  WINGDIAPI WINBOOL WINAPI PaintRgn(HDC hdc,HRGN hrgn);\n  WINGDIAPI WINBOOL WINAPI PolyPolygon(HDC hdc,CONST POINT *apt,CONST INT *asz,int csz);\n  WINGDIAPI WINBOOL WINAPI PtInRegion(HRGN hrgn,int x,int y);\n  WINGDIAPI WINBOOL WINAPI PtVisible(HDC hdc,int x,int y);\n  WINGDIAPI WINBOOL WINAPI RectInRegion(HRGN hrgn,CONST RECT *lprect);\n  WINGDIAPI WINBOOL WINAPI RectVisible(HDC hdc,CONST RECT *lprect);\n  WINGDIAPI WINBOOL WINAPI Rectangle(HDC hdc,int left,int top,int right,int bottom);\n  WINGDIAPI WINBOOL WINAPI RestoreDC(HDC hdc,int nSavedDC);\n  WINGDIAPI HDC WINAPI ResetDCA(HDC hdc,CONST DEVMODEA *lpdm);\n  WINGDIAPI HDC WINAPI ResetDCW(HDC hdc,CONST DEVMODEW *lpdm);\n  WINGDIAPI UINT WINAPI RealizePalette(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI RemoveFontResourceA(LPCSTR lpFileName);\n  WINGDIAPI WINBOOL WINAPI RemoveFontResourceW(LPCWSTR lpFileName);\n  WINGDIAPI WINBOOL WINAPI RoundRect(HDC hdc,int left,int top,int right,int bottom,int width,int height);\n  WINGDIAPI WINBOOL WINAPI ResizePalette(HPALETTE hpal,UINT n);\n  WINGDIAPI int WINAPI SaveDC(HDC hdc);\n  WINGDIAPI int WINAPI SelectClipRgn(HDC hdc,HRGN hrgn);\n  WINGDIAPI int WINAPI ExtSelectClipRgn(HDC hdc,HRGN hrgn,int mode);\n  WINGDIAPI int WINAPI SetMetaRgn(HDC hdc);\n  WINGDIAPI HGDIOBJ WINAPI SelectObject(HDC hdc,HGDIOBJ h);\n  WINGDIAPI HPALETTE WINAPI SelectPalette(HDC hdc,HPALETTE hPal,WINBOOL bForceBkgd);\n  WINGDIAPI COLORREF WINAPI SetBkColor(HDC hdc,COLORREF color);\n  WINGDIAPI COLORREF WINAPI SetDCBrushColor(HDC hdc,COLORREF color);\n  WINGDIAPI COLORREF WINAPI SetDCPenColor(HDC hdc,COLORREF color);\n  WINGDIAPI int WINAPI SetBkMode(HDC hdc,int mode);\n  WINGDIAPI LONG WINAPI SetBitmapBits(HBITMAP hbm,DWORD cb,CONST VOID *pvBits);\n  WINGDIAPI UINT WINAPI SetBoundsRect(HDC hdc,CONST RECT *lprect,UINT flags);\n  WINGDIAPI int WINAPI SetDIBits(HDC hdc,HBITMAP hbm,UINT start,UINT cLines,CONST VOID *lpBits,CONST BITMAPINFO *lpbmi,UINT ColorUse);\n  WINGDIAPI int WINAPI SetDIBitsToDevice(HDC hdc,int xDest,int yDest,DWORD w,DWORD h,int xSrc,int ySrc,UINT StartScan,UINT cLines,CONST VOID *lpvBits,CONST BITMAPINFO *lpbmi,UINT ColorUse);\n  WINGDIAPI DWORD WINAPI SetMapperFlags(HDC hdc,DWORD flags);\n  WINGDIAPI int WINAPI SetGraphicsMode(HDC hdc,int iMode);\n  WINGDIAPI int WINAPI SetMapMode(HDC hdc,int iMode);\n  WINGDIAPI DWORD WINAPI SetLayout(HDC hdc,DWORD l);\n  WINGDIAPI DWORD WINAPI GetLayout(HDC hdc);\n  WINGDIAPI HMETAFILE WINAPI SetMetaFileBitsEx(UINT cbBuffer,CONST BYTE *lpData);\n  WINGDIAPI UINT WINAPI SetPaletteEntries(HPALETTE hpal,UINT iStart,UINT cEntries,CONST PALETTEENTRY *pPalEntries);\n  WINGDIAPI COLORREF WINAPI SetPixel(HDC hdc,int x,int y,COLORREF color);\n  WINGDIAPI WINBOOL WINAPI SetPixelV(HDC hdc,int x,int y,COLORREF color);\n  WINGDIAPI WINBOOL WINAPI SetPixelFormat(HDC hdc,int format,CONST PIXELFORMATDESCRIPTOR *ppfd);\n  WINGDIAPI int WINAPI SetPolyFillMode(HDC hdc,int mode);\n  WINGDIAPI WINBOOL WINAPI StretchBlt(HDC hdcDest,int xDest,int yDest,int wDest,int hDest,HDC hdcSrc,int xSrc,int ySrc,int wSrc,int hSrc,DWORD rop);\n  WINGDIAPI WINBOOL WINAPI SetRectRgn(HRGN hrgn,int left,int top,int right,int bottom);\n  WINGDIAPI int WINAPI StretchDIBits(HDC hdc,int xDest,int yDest,int DestWidth,int DestHeight,int xSrc,int ySrc,int SrcWidth,int SrcHeight,CONST VOID *lpBits,CONST BITMAPINFO *lpbmi,UINT iUsage,DWORD rop);\n  WINGDIAPI int WINAPI SetROP2(HDC hdc,int rop2);\n  WINGDIAPI int WINAPI SetStretchBltMode(HDC hdc,int mode);\n  WINGDIAPI UINT WINAPI SetSystemPaletteUse(HDC hdc,UINT use);\n  WINGDIAPI int WINAPI SetTextCharacterExtra(HDC hdc,int extra);\n  WINGDIAPI COLORREF WINAPI SetTextColor(HDC hdc,COLORREF color);\n  WINGDIAPI UINT WINAPI SetTextAlign(HDC hdc,UINT align);\n  WINGDIAPI WINBOOL WINAPI SetTextJustification(HDC hdc,int extra,int count);\n  WINGDIAPI WINBOOL WINAPI UpdateColors(HDC hdc);\n\n  typedef USHORT COLOR16;\n\n  typedef struct _TRIVERTEX {\n    LONG x;\n    LONG y;\n    COLOR16 Red;\n    COLOR16 Green;\n    COLOR16 Blue;\n    COLOR16 Alpha;\n  } TRIVERTEX,*PTRIVERTEX,*LPTRIVERTEX;\n\n  typedef struct _GRADIENT_TRIANGLE {\n    ULONG Vertex1;\n    ULONG Vertex2;\n    ULONG Vertex3;\n  } GRADIENT_TRIANGLE,*PGRADIENT_TRIANGLE,*LPGRADIENT_TRIANGLE;\n\n  typedef struct _GRADIENT_RECT {\n    ULONG UpperLeft;\n    ULONG LowerRight;\n  } GRADIENT_RECT,*PGRADIENT_RECT,*LPGRADIENT_RECT;\n\n  typedef struct _BLENDFUNCTION {\n    BYTE BlendOp;\n    BYTE BlendFlags;\n    BYTE SourceConstantAlpha;\n    BYTE AlphaFormat;\n  } BLENDFUNCTION,*PBLENDFUNCTION;\n\n#define AC_SRC_OVER 0x00\n#define AC_SRC_ALPHA 0x01\n\n  WINGDIAPI WINBOOL WINAPI AlphaBlend(HDC hdcDest,int xoriginDest,int yoriginDest,int wDest,int hDest,HDC hdcSrc,int xoriginSrc,int yoriginSrc,int wSrc,int hSrc,BLENDFUNCTION ftn);\n  WINGDIAPI WINBOOL WINAPI TransparentBlt(HDC hdcDest,int xoriginDest,int yoriginDest,int wDest,int hDest,HDC hdcSrc,int xoriginSrc,int yoriginSrc,int wSrc,int hSrc,UINT crTransparent);\n\n#define GRADIENT_FILL_RECT_H 0x00000000\n#define GRADIENT_FILL_RECT_V 0x00000001\n#define GRADIENT_FILL_TRIANGLE 0x00000002\n#define GRADIENT_FILL_OP_FLAG 0x000000ff\n\n  WINGDIAPI WINBOOL WINAPI GradientFill(HDC hdc,PTRIVERTEX pVertex,ULONG nVertex,PVOID pMesh,ULONG nMesh,ULONG ulMode);\n\n#ifndef NOMETAFILE\n\n#ifdef UNICODE\n#define CopyEnhMetaFile CopyEnhMetaFileW\n#define CreateEnhMetaFile CreateEnhMetaFileW\n#define GetEnhMetaFile GetEnhMetaFileW\n#define GetEnhMetaFileDescription GetEnhMetaFileDescriptionW\n#else\n#define CopyEnhMetaFile CopyEnhMetaFileA\n#define CreateEnhMetaFile CreateEnhMetaFileA\n#define GetEnhMetaFile GetEnhMetaFileA\n#define GetEnhMetaFileDescription GetEnhMetaFileDescriptionA\n#endif\n\n  WINGDIAPI WINBOOL WINAPI PlayMetaFileRecord(HDC hdc,LPHANDLETABLE lpHandleTable,LPMETARECORD lpMR,UINT noObjs);\n\n  typedef int (CALLBACK *MFENUMPROC)(HDC hdc,HANDLETABLE *lpht,METARECORD *lpMR,int nObj,LPARAM param);\n\n  WINGDIAPI WINBOOL WINAPI EnumMetaFile(HDC hdc,HMETAFILE hmf,MFENUMPROC proc,LPARAM param);\n\n  typedef int (CALLBACK *ENHMFENUMPROC)(HDC hdc,HANDLETABLE *lpht,CONST ENHMETARECORD *lpmr,int hHandles,LPARAM data);\n\n  WINGDIAPI HENHMETAFILE WINAPI CloseEnhMetaFile(HDC hdc);\n  WINGDIAPI HENHMETAFILE WINAPI CopyEnhMetaFileA(HENHMETAFILE hEnh,LPCSTR lpFileName);\n  WINGDIAPI HENHMETAFILE WINAPI CopyEnhMetaFileW(HENHMETAFILE hEnh,LPCWSTR lpFileName);\n  WINGDIAPI HDC WINAPI CreateEnhMetaFileA(HDC hdc,LPCSTR lpFilename,CONST RECT *lprc,LPCSTR lpDesc);\n  WINGDIAPI HDC WINAPI CreateEnhMetaFileW(HDC hdc,LPCWSTR lpFilename,CONST RECT *lprc,LPCWSTR lpDesc);\n  WINGDIAPI WINBOOL WINAPI DeleteEnhMetaFile(HENHMETAFILE hmf);\n  WINGDIAPI WINBOOL WINAPI EnumEnhMetaFile(HDC hdc,HENHMETAFILE hmf,ENHMFENUMPROC proc,LPVOID param,CONST RECT *lpRect);\n  WINGDIAPI HENHMETAFILE WINAPI GetEnhMetaFileA(LPCSTR lpName);\n  WINGDIAPI HENHMETAFILE WINAPI GetEnhMetaFileW(LPCWSTR lpName);\n  WINGDIAPI UINT WINAPI GetEnhMetaFileBits(HENHMETAFILE hEMF,UINT nSize,LPBYTE lpData);\n  WINGDIAPI UINT WINAPI GetEnhMetaFileDescriptionA(HENHMETAFILE hemf,UINT cchBuffer,LPSTR lpDescription);\n  WINGDIAPI UINT WINAPI GetEnhMetaFileDescriptionW(HENHMETAFILE hemf,UINT cchBuffer,LPWSTR lpDescription);\n  WINGDIAPI UINT WINAPI GetEnhMetaFileHeader(HENHMETAFILE hemf,UINT nSize,LPENHMETAHEADER lpEnhMetaHeader);\n  WINGDIAPI UINT WINAPI GetEnhMetaFilePaletteEntries(HENHMETAFILE hemf,UINT nNumEntries,LPPALETTEENTRY lpPaletteEntries);\n  WINGDIAPI UINT WINAPI GetEnhMetaFilePixelFormat(HENHMETAFILE hemf,UINT cbBuffer,PIXELFORMATDESCRIPTOR *ppfd);\n  WINGDIAPI UINT WINAPI GetWinMetaFileBits(HENHMETAFILE hemf,UINT cbData16,LPBYTE pData16,INT iMapMode,HDC hdcRef);\n  WINGDIAPI WINBOOL WINAPI PlayEnhMetaFile(HDC hdc,HENHMETAFILE hmf,CONST RECT *lprect);\n  WINGDIAPI WINBOOL WINAPI PlayEnhMetaFileRecord(HDC hdc,LPHANDLETABLE pht,CONST ENHMETARECORD *pmr,UINT cht);\n  WINGDIAPI HENHMETAFILE WINAPI SetEnhMetaFileBits(UINT nSize,CONST BYTE *pb);\n  WINGDIAPI HENHMETAFILE WINAPI SetWinMetaFileBits(UINT nSize,CONST BYTE *lpMeta16Data,HDC hdcRef,CONST METAFILEPICT *lpMFP);\n  WINGDIAPI WINBOOL WINAPI GdiComment(HDC hdc,UINT nSize,CONST BYTE *lpData);\n#endif\n\n#ifndef NOTEXTMETRIC\n#ifdef UNICODE\n#define GetTextMetrics GetTextMetricsW\n#else\n#define GetTextMetrics GetTextMetricsA\n#endif\n\n  WINGDIAPI WINBOOL WINAPI GetTextMetricsA(HDC hdc,LPTEXTMETRICA lptm);\n  WINGDIAPI WINBOOL WINAPI GetTextMetricsW(HDC hdc,LPTEXTMETRICW lptm);\n#endif\n\n  typedef struct tagDIBSECTION {\n    BITMAP dsBm;\n    BITMAPINFOHEADER dsBmih;\n    DWORD dsBitfields[3];\n    HANDLE dshSection;\n    DWORD dsOffset;\n  } DIBSECTION,*LPDIBSECTION,*PDIBSECTION;\n\n  WINGDIAPI WINBOOL WINAPI AngleArc(HDC hdc,int x,int y,DWORD r,FLOAT StartAngle,FLOAT SweepAngle);\n  WINGDIAPI WINBOOL WINAPI PolyPolyline(HDC hdc,CONST POINT *apt,CONST DWORD *asz,DWORD csz);\n  WINGDIAPI WINBOOL WINAPI GetWorldTransform(HDC hdc,LPXFORM lpxf);\n  WINGDIAPI WINBOOL WINAPI SetWorldTransform(HDC hdc,CONST XFORM *lpxf);\n  WINGDIAPI WINBOOL WINAPI ModifyWorldTransform(HDC hdc,CONST XFORM *lpxf,DWORD mode);\n  WINGDIAPI WINBOOL WINAPI CombineTransform(LPXFORM lpxfOut,CONST XFORM *lpxf1,CONST XFORM *lpxf2);\n  WINGDIAPI HBITMAP WINAPI CreateDIBSection(HDC hdc,CONST BITMAPINFO *lpbmi,UINT usage,VOID **ppvBits,HANDLE hSection,DWORD offset);\n  WINGDIAPI UINT WINAPI GetDIBColorTable(HDC hdc,UINT iStart,UINT cEntries,RGBQUAD *prgbq);\n  WINGDIAPI UINT WINAPI SetDIBColorTable(HDC hdc,UINT iStart,UINT cEntries,CONST RGBQUAD *prgbq);\n\n#define CA_NEGATIVE 0x0001\n#define CA_LOG_FILTER 0x0002\n\n#define ILLUMINANT_DEVICE_DEFAULT 0\n#define ILLUMINANT_A 1\n#define ILLUMINANT_B 2\n#define ILLUMINANT_C 3\n#define ILLUMINANT_D50 4\n#define ILLUMINANT_D55 5\n#define ILLUMINANT_D65 6\n#define ILLUMINANT_D75 7\n#define ILLUMINANT_F2 8\n#define ILLUMINANT_MAX_INDEX ILLUMINANT_F2\n\n#define ILLUMINANT_TUNGSTEN ILLUMINANT_A\n#define ILLUMINANT_DAYLIGHT ILLUMINANT_C\n#define ILLUMINANT_FLUORESCENT ILLUMINANT_F2\n#define ILLUMINANT_NTSC ILLUMINANT_C\n\n#define RGB_GAMMA_MIN (WORD)02500\n#define RGB_GAMMA_MAX (WORD)65000\n\n#define REFERENCE_WHITE_MIN (WORD)6000\n#define REFERENCE_WHITE_MAX (WORD)10000\n#define REFERENCE_BLACK_MIN (WORD)0\n#define REFERENCE_BLACK_MAX (WORD)4000\n\n#define COLOR_ADJ_MIN (SHORT)-100\n#define COLOR_ADJ_MAX (SHORT)100\n\n  typedef struct tagCOLORADJUSTMENT {\n    WORD caSize;\n    WORD caFlags;\n    WORD caIlluminantIndex;\n    WORD caRedGamma;\n    WORD caGreenGamma;\n    WORD caBlueGamma;\n    WORD caReferenceBlack;\n    WORD caReferenceWhite;\n    SHORT caContrast;\n    SHORT caBrightness;\n    SHORT caColorfulness;\n    SHORT caRedGreenTint;\n  } COLORADJUSTMENT,*PCOLORADJUSTMENT,*LPCOLORADJUSTMENT;\n\n  WINGDIAPI WINBOOL WINAPI SetColorAdjustment(HDC hdc,CONST COLORADJUSTMENT *lpca);\n  WINGDIAPI WINBOOL WINAPI GetColorAdjustment(HDC hdc,LPCOLORADJUSTMENT lpca);\n  WINGDIAPI HPALETTE WINAPI CreateHalftonePalette(HDC hdc);\n\n  typedef WINBOOL (CALLBACK *ABORTPROC)(HDC,int);\n\n  typedef struct _DOCINFOA {\n    int cbSize;\n    LPCSTR lpszDocName;\n    LPCSTR lpszOutput;\n    LPCSTR lpszDatatype;\n    DWORD fwType;\n  } DOCINFOA,*LPDOCINFOA;\n\n  typedef struct _DOCINFOW {\n    int cbSize;\n    LPCWSTR lpszDocName;\n    LPCWSTR lpszOutput;\n    LPCWSTR lpszDatatype;\n    DWORD fwType;\n  } DOCINFOW,*LPDOCINFOW;\n\n#ifdef UNICODE\n  typedef DOCINFOW DOCINFO;\n  typedef LPDOCINFOW LPDOCINFO;\n#else\n  typedef DOCINFOA DOCINFO;\n  typedef LPDOCINFOA LPDOCINFO;\n#endif\n\n#define DI_APPBANDING 0x00000001\n#define DI_ROPS_READ_DESTINATION 0x00000002\n\n#ifdef UNICODE\n#define StartDoc StartDocW\n#define GetObject GetObjectW\n#define TextOut TextOutW\n#define ExtTextOut ExtTextOutW\n#define PolyTextOut PolyTextOutW\n#define GetTextFace GetTextFaceW\n#else\n#define StartDoc StartDocA\n#define GetObject GetObjectA\n#define TextOut TextOutA\n#define ExtTextOut ExtTextOutA\n#define PolyTextOut PolyTextOutA\n#define GetTextFace GetTextFaceA\n#endif\n\n  WINGDIAPI int WINAPI StartDocA(HDC hdc,CONST DOCINFOA *lpdi);\n  WINGDIAPI int WINAPI StartDocW(HDC hdc,CONST DOCINFOW *lpdi);\n  WINGDIAPI int WINAPI EndDoc(HDC hdc);\n  WINGDIAPI int WINAPI StartPage(HDC hdc);\n  WINGDIAPI int WINAPI EndPage(HDC hdc);\n  WINGDIAPI int WINAPI AbortDoc(HDC hdc);\n  WINGDIAPI int WINAPI SetAbortProc(HDC hdc,ABORTPROC proc);\n  WINGDIAPI WINBOOL WINAPI AbortPath(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI ArcTo(HDC hdc,int left,int top,int right,int bottom,int xr1,int yr1,int xr2,int yr2);\n  WINGDIAPI WINBOOL WINAPI BeginPath(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI CloseFigure(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI EndPath(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI FillPath(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI FlattenPath(HDC hdc);\n  WINGDIAPI int WINAPI GetPath(HDC hdc,LPPOINT apt,LPBYTE aj,int cpt);\n  WINGDIAPI HRGN WINAPI PathToRegion(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI PolyDraw(HDC hdc,CONST POINT *apt,CONST BYTE *aj,int cpt);\n  WINGDIAPI WINBOOL WINAPI SelectClipPath(HDC hdc,int mode);\n  WINGDIAPI int WINAPI SetArcDirection(HDC hdc,int dir);\n  WINGDIAPI WINBOOL WINAPI SetMiterLimit(HDC hdc,FLOAT limit,PFLOAT old);\n  WINGDIAPI WINBOOL WINAPI StrokeAndFillPath(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI StrokePath(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI WidenPath(HDC hdc);\n  WINGDIAPI HPEN WINAPI ExtCreatePen(DWORD iPenStyle,DWORD cWidth,CONST LOGBRUSH *plbrush,DWORD cStyle,CONST DWORD *pstyle);\n  WINGDIAPI WINBOOL WINAPI GetMiterLimit(HDC hdc,PFLOAT plimit);\n  WINGDIAPI int WINAPI GetArcDirection(HDC hdc);\n  WINGDIAPI int WINAPI GetObjectA(HANDLE h,int c,LPVOID pv);\n  WINGDIAPI int WINAPI GetObjectW(HANDLE h,int c,LPVOID pv);\n  WINGDIAPI WINBOOL WINAPI MoveToEx(HDC hdc,int x,int y,LPPOINT lppt);\n  WINGDIAPI WINBOOL WINAPI TextOutA(HDC hdc,int x,int y,LPCSTR lpString,int c);\n  WINGDIAPI WINBOOL WINAPI TextOutW(HDC hdc,int x,int y,LPCWSTR lpString,int c);\n  WINGDIAPI WINBOOL WINAPI ExtTextOutA(HDC hdc,int x,int y,UINT options,CONST RECT *lprect,LPCSTR lpString,UINT c,CONST INT *lpDx);\n  WINGDIAPI WINBOOL WINAPI ExtTextOutW(HDC hdc,int x,int y,UINT options,CONST RECT *lprect,LPCWSTR lpString,UINT c,CONST INT *lpDx);\n  WINGDIAPI WINBOOL WINAPI PolyTextOutA(HDC hdc,CONST POLYTEXTA *ppt,int nstrings);\n  WINGDIAPI WINBOOL WINAPI PolyTextOutW(HDC hdc,CONST POLYTEXTW *ppt,int nstrings);\n  WINGDIAPI HRGN WINAPI CreatePolygonRgn(CONST POINT *pptl,int cPoint,int iMode);\n  WINGDIAPI WINBOOL WINAPI DPtoLP(HDC hdc,LPPOINT lppt,int c);\n  WINGDIAPI WINBOOL WINAPI LPtoDP(HDC hdc,LPPOINT lppt,int c);\n  WINGDIAPI WINBOOL WINAPI Polygon(HDC hdc,CONST POINT *apt,int cpt);\n  WINGDIAPI WINBOOL WINAPI Polyline(HDC hdc,CONST POINT *apt,int cpt);\n  WINGDIAPI WINBOOL WINAPI PolyBezier(HDC hdc,CONST POINT *apt,DWORD cpt);\n  WINGDIAPI WINBOOL WINAPI PolyBezierTo(HDC hdc,CONST POINT *apt,DWORD cpt);\n  WINGDIAPI WINBOOL WINAPI PolylineTo(HDC hdc,CONST POINT *apt,DWORD cpt);\n  WINGDIAPI WINBOOL WINAPI SetViewportExtEx(HDC hdc,int x,int y,LPSIZE lpsz);\n  WINGDIAPI WINBOOL WINAPI SetViewportOrgEx(HDC hdc,int x,int y,LPPOINT lppt);\n  WINGDIAPI WINBOOL WINAPI SetWindowExtEx(HDC hdc,int x,int y,LPSIZE lpsz);\n  WINGDIAPI WINBOOL WINAPI SetWindowOrgEx(HDC hdc,int x,int y,LPPOINT lppt);\n  WINGDIAPI WINBOOL WINAPI OffsetViewportOrgEx(HDC hdc,int x,int y,LPPOINT lppt);\n  WINGDIAPI WINBOOL WINAPI OffsetWindowOrgEx(HDC hdc,int x,int y,LPPOINT lppt);\n  WINGDIAPI WINBOOL WINAPI ScaleViewportExtEx(HDC hdc,int xn,int dx,int yn,int yd,LPSIZE lpsz);\n  WINGDIAPI WINBOOL WINAPI ScaleWindowExtEx(HDC hdc,int xn,int xd,int yn,int yd,LPSIZE lpsz);\n  WINGDIAPI WINBOOL WINAPI SetBitmapDimensionEx(HBITMAP hbm,int w,int h,LPSIZE lpsz);\n  WINGDIAPI WINBOOL WINAPI SetBrushOrgEx(HDC hdc,int x,int y,LPPOINT lppt);\n  WINGDIAPI int WINAPI GetTextFaceA(HDC hdc,int c,LPSTR lpName);\n  WINGDIAPI int WINAPI GetTextFaceW(HDC hdc,int c,LPWSTR lpName);\n\n#define FONTMAPPER_MAX 10\n\n  typedef struct tagKERNINGPAIR {\n    WORD wFirst;\n    WORD wSecond;\n    int iKernAmount;\n  } KERNINGPAIR,*LPKERNINGPAIR;\n\n#ifdef UNICODE\n#define GetKerningPairs GetKerningPairsW\n#else\n#define GetKerningPairs GetKerningPairsA\n#endif\n\n  WINGDIAPI DWORD WINAPI GetKerningPairsA(HDC hdc,DWORD nPairs,LPKERNINGPAIR lpKernPair);\n  WINGDIAPI DWORD WINAPI GetKerningPairsW(HDC hdc,DWORD nPairs,LPKERNINGPAIR lpKernPair);\n  WINGDIAPI WINBOOL WINAPI GetDCOrgEx(HDC hdc,LPPOINT lppt);\n  WINGDIAPI WINBOOL WINAPI FixBrushOrgEx(HDC hdc,int x,int y,LPPOINT ptl);\n  WINGDIAPI WINBOOL WINAPI UnrealizeObject(HGDIOBJ h);\n  WINGDIAPI WINBOOL WINAPI GdiFlush();\n  WINGDIAPI DWORD WINAPI GdiSetBatchLimit(DWORD dw);\n  WINGDIAPI DWORD WINAPI GdiGetBatchLimit();\n\n#define ICM_OFF 1\n#define ICM_ON 2\n#define ICM_QUERY 3\n#define ICM_DONE_OUTSIDEDC 4\n\n  typedef int (CALLBACK *ICMENUMPROCA)(LPSTR,LPARAM);\n  typedef int (CALLBACK *ICMENUMPROCW)(LPWSTR,LPARAM);\n\n#ifdef UNICODE\n#define ICMENUMPROC ICMENUMPROCW\n#define EnumICMProfiles EnumICMProfilesW\n#define UpdateICMRegKey UpdateICMRegKeyW\n#define GetLogColorSpace GetLogColorSpaceW\n#define CreateColorSpace CreateColorSpaceW\n#define GetICMProfile GetICMProfileW\n#define SetICMProfile SetICMProfileW\n#else\n#define ICMENUMPROC ICMENUMPROCA\n#define EnumICMProfiles EnumICMProfilesA\n#define UpdateICMRegKey UpdateICMRegKeyA\n#define GetLogColorSpace GetLogColorSpaceA\n#define CreateColorSpace CreateColorSpaceA\n#define GetICMProfile GetICMProfileA\n#define SetICMProfile SetICMProfileA\n#endif\n\n  WINGDIAPI int WINAPI SetICMMode(HDC hdc,int mode);\n  WINGDIAPI WINBOOL WINAPI CheckColorsInGamut(HDC hdc,LPVOID lpRGBTriple,LPVOID dlpBuffer,DWORD nCount);\n  WINGDIAPI HCOLORSPACE WINAPI GetColorSpace(HDC hdc);\n  WINGDIAPI WINBOOL WINAPI GetLogColorSpaceA(HCOLORSPACE hColorSpace,LPLOGCOLORSPACEA lpBuffer,DWORD nSize);\n  WINGDIAPI WINBOOL WINAPI GetLogColorSpaceW(HCOLORSPACE hColorSpace,LPLOGCOLORSPACEW lpBuffer,DWORD nSize);\n  WINGDIAPI HCOLORSPACE WINAPI CreateColorSpaceA(LPLOGCOLORSPACEA lplcs);\n  WINGDIAPI HCOLORSPACE WINAPI CreateColorSpaceW(LPLOGCOLORSPACEW lplcs);\n  WINGDIAPI HCOLORSPACE WINAPI SetColorSpace(HDC hdc,HCOLORSPACE hcs);\n  WINGDIAPI WINBOOL WINAPI DeleteColorSpace(HCOLORSPACE hcs);\n  WINGDIAPI WINBOOL WINAPI GetICMProfileA(HDC hdc,LPDWORD pBufSize,LPSTR pszFilename);\n  WINGDIAPI WINBOOL WINAPI GetICMProfileW(HDC hdc,LPDWORD pBufSize,LPWSTR pszFilename);\n  WINGDIAPI WINBOOL WINAPI SetICMProfileA(HDC hdc,LPSTR lpFileName);\n  WINGDIAPI WINBOOL WINAPI SetICMProfileW(HDC hdc,LPWSTR lpFileName);\n  WINGDIAPI WINBOOL WINAPI GetDeviceGammaRamp(HDC hdc,LPVOID lpRamp);\n  WINGDIAPI WINBOOL WINAPI SetDeviceGammaRamp(HDC hdc,LPVOID lpRamp);\n  WINGDIAPI WINBOOL WINAPI ColorMatchToTarget(HDC hdc,HDC hdcTarget,DWORD action);\n  WINGDIAPI int WINAPI EnumICMProfilesA(HDC hdc,ICMENUMPROCA proc,LPARAM param);\n  WINGDIAPI int WINAPI EnumICMProfilesW(HDC hdc,ICMENUMPROCW proc,LPARAM param);\n  WINGDIAPI WINBOOL WINAPI UpdateICMRegKeyA(DWORD reserved,LPSTR lpszCMID,LPSTR lpszFileName,UINT command);\n  WINGDIAPI WINBOOL WINAPI UpdateICMRegKeyW(DWORD reserved,LPWSTR lpszCMID,LPWSTR lpszFileName,UINT command);\n  WINGDIAPI WINBOOL WINAPI ColorCorrectPalette(HDC hdc,HPALETTE hPal,DWORD deFirst,DWORD num);\n\n#ifndef NOMETAFILE\n\n#define ENHMETA_SIGNATURE 0x464D4520\n#define ENHMETA_STOCK_OBJECT 0x80000000\n\n#define EMR_HEADER 1\n#define EMR_POLYBEZIER 2\n#define EMR_POLYGON 3\n#define EMR_POLYLINE 4\n#define EMR_POLYBEZIERTO 5\n#define EMR_POLYLINETO 6\n#define EMR_POLYPOLYLINE 7\n#define EMR_POLYPOLYGON 8\n#define EMR_SETWINDOWEXTEX 9\n#define EMR_SETWINDOWORGEX 10\n#define EMR_SETVIEWPORTEXTEX 11\n#define EMR_SETVIEWPORTORGEX 12\n#define EMR_SETBRUSHORGEX 13\n#define EMR_EOF 14\n#define EMR_SETPIXELV 15\n#define EMR_SETMAPPERFLAGS 16\n#define EMR_SETMAPMODE 17\n#define EMR_SETBKMODE 18\n#define EMR_SETPOLYFILLMODE 19\n#define EMR_SETROP2 20\n#define EMR_SETSTRETCHBLTMODE 21\n#define EMR_SETTEXTALIGN 22\n#define EMR_SETCOLORADJUSTMENT 23\n#define EMR_SETTEXTCOLOR 24\n#define EMR_SETBKCOLOR 25\n#define EMR_OFFSETCLIPRGN 26\n#define EMR_MOVETOEX 27\n#define EMR_SETMETARGN 28\n#define EMR_EXCLUDECLIPRECT 29\n#define EMR_INTERSECTCLIPRECT 30\n#define EMR_SCALEVIEWPORTEXTEX 31\n#define EMR_SCALEWINDOWEXTEX 32\n#define EMR_SAVEDC 33\n#define EMR_RESTOREDC 34\n#define EMR_SETWORLDTRANSFORM 35\n#define EMR_MODIFYWORLDTRANSFORM 36\n#define EMR_SELECTOBJECT 37\n#define EMR_CREATEPEN 38\n#define EMR_CREATEBRUSHINDIRECT 39\n#define EMR_DELETEOBJECT 40\n#define EMR_ANGLEARC 41\n#define EMR_ELLIPSE 42\n#define EMR_RECTANGLE 43\n#define EMR_ROUNDRECT 44\n#define EMR_ARC 45\n#define EMR_CHORD 46\n#define EMR_PIE 47\n#define EMR_SELECTPALETTE 48\n#define EMR_CREATEPALETTE 49\n#define EMR_SETPALETTEENTRIES 50\n#define EMR_RESIZEPALETTE 51\n#define EMR_REALIZEPALETTE 52\n#define EMR_EXTFLOODFILL 53\n#define EMR_LINETO 54\n#define EMR_ARCTO 55\n#define EMR_POLYDRAW 56\n#define EMR_SETARCDIRECTION 57\n#define EMR_SETMITERLIMIT 58\n#define EMR_BEGINPATH 59\n#define EMR_ENDPATH 60\n#define EMR_CLOSEFIGURE 61\n#define EMR_FILLPATH 62\n#define EMR_STROKEANDFILLPATH 63\n#define EMR_STROKEPATH 64\n#define EMR_FLATTENPATH 65\n#define EMR_WIDENPATH 66\n#define EMR_SELECTCLIPPATH 67\n#define EMR_ABORTPATH 68\n\n#define EMR_GDICOMMENT 70\n#define EMR_FILLRGN 71\n#define EMR_FRAMERGN 72\n#define EMR_INVERTRGN 73\n#define EMR_PAINTRGN 74\n#define EMR_EXTSELECTCLIPRGN 75\n#define EMR_BITBLT 76\n#define EMR_STRETCHBLT 77\n#define EMR_MASKBLT 78\n#define EMR_PLGBLT 79\n#define EMR_SETDIBITSTODEVICE 80\n#define EMR_STRETCHDIBITS 81\n#define EMR_EXTCREATEFONTINDIRECTW 82\n#define EMR_EXTTEXTOUTA 83\n#define EMR_EXTTEXTOUTW 84\n#define EMR_POLYBEZIER16 85\n#define EMR_POLYGON16 86\n#define EMR_POLYLINE16 87\n#define EMR_POLYBEZIERTO16 88\n#define EMR_POLYLINETO16 89\n#define EMR_POLYPOLYLINE16 90\n#define EMR_POLYPOLYGON16 91\n#define EMR_POLYDRAW16 92\n#define EMR_CREATEMONOBRUSH 93\n#define EMR_CREATEDIBPATTERNBRUSHPT 94\n#define EMR_EXTCREATEPEN 95\n#define EMR_POLYTEXTOUTA 96\n#define EMR_POLYTEXTOUTW 97\n\n#define EMR_SETICMMODE 98\n#define EMR_CREATECOLORSPACE 99\n#define EMR_SETCOLORSPACE 100\n#define EMR_DELETECOLORSPACE 101\n#define EMR_GLSRECORD 102\n#define EMR_GLSBOUNDEDRECORD 103\n#define EMR_PIXELFORMAT 104\n#define EMR_RESERVED_105 105\n#define EMR_RESERVED_106 106\n#define EMR_RESERVED_107 107\n#define EMR_RESERVED_108 108\n#define EMR_RESERVED_109 109\n#define EMR_RESERVED_110 110\n#define EMR_COLORCORRECTPALETTE 111\n#define EMR_SETICMPROFILEA 112\n#define EMR_SETICMPROFILEW 113\n#define EMR_ALPHABLEND 114\n#define EMR_SETLAYOUT 115\n#define EMR_TRANSPARENTBLT 116\n#define EMR_RESERVED_117 117\n#define EMR_GRADIENTFILL 118\n#define EMR_RESERVED_119 119\n#define EMR_RESERVED_120 120\n#define EMR_COLORMATCHTOTARGETW 121\n#define EMR_CREATECOLORSPACEW 122\n\n#define EMR_MIN 1\n\n#define EMR_MAX 122\n\n  typedef struct tagEMR {\n    DWORD iType;\n    DWORD nSize;\n  } EMR,*PEMR;\n\n  typedef struct tagEMRTEXT {\n    POINTL ptlReference;\n    DWORD nChars;\n    DWORD offString;\n    DWORD fOptions;\n    RECTL rcl;\n    DWORD offDx;\n  } EMRTEXT,*PEMRTEXT;\n\n  typedef struct tagABORTPATH {\n    EMR emr;\n  } EMRABORTPATH,*PEMRABORTPATH,EMRBEGINPATH,*PEMRBEGINPATH,EMRENDPATH,*PEMRENDPATH,EMRCLOSEFIGURE,*PEMRCLOSEFIGURE,EMRFLATTENPATH,*PEMRFLATTENPATH,EMRWIDENPATH,*PEMRWIDENPATH,EMRSETMETARGN,*PEMRSETMETARGN,EMRSAVEDC,*PEMRSAVEDC,EMRREALIZEPALETTE,*PEMRREALIZEPALETTE;\n\n  typedef struct tagEMRSELECTCLIPPATH {\n    EMR emr;\n    DWORD iMode;\n  } EMRSELECTCLIPPATH,*PEMRSELECTCLIPPATH,EMRSETBKMODE,*PEMRSETBKMODE,EMRSETMAPMODE,*PEMRSETMAPMODE,EMRSETLAYOUT,*PEMRSETLAYOUT,\n    EMRSETPOLYFILLMODE,*PEMRSETPOLYFILLMODE,EMRSETROP2,*PEMRSETROP2,EMRSETSTRETCHBLTMODE,*PEMRSETSTRETCHBLTMODE,EMRSETICMMODE,\n    *PEMRSETICMMODE,EMRSETTEXTALIGN,*PEMRSETTEXTALIGN;\n\n  typedef struct tagEMRSETMITERLIMIT {\n    EMR emr;\n    FLOAT eMiterLimit;\n  } EMRSETMITERLIMIT,*PEMRSETMITERLIMIT;\n\n  typedef struct tagEMRRESTOREDC {\n    EMR emr;\n    LONG iRelative;\n  } EMRRESTOREDC,*PEMRRESTOREDC;\n\n  typedef struct tagEMRSETARCDIRECTION {\n    EMR emr;\n    DWORD iArcDirection;\n\n  } EMRSETARCDIRECTION,*PEMRSETARCDIRECTION;\n\n  typedef struct tagEMRSETMAPPERFLAGS {\n    EMR emr;\n    DWORD dwFlags;\n  } EMRSETMAPPERFLAGS,*PEMRSETMAPPERFLAGS;\n\n  typedef struct tagEMRSETTEXTCOLOR {\n    EMR emr;\n    COLORREF crColor;\n  } EMRSETBKCOLOR,*PEMRSETBKCOLOR,EMRSETTEXTCOLOR,*PEMRSETTEXTCOLOR;\n\n  typedef struct tagEMRSELECTOBJECT {\n    EMR emr;\n    DWORD ihObject;\n  } EMRSELECTOBJECT,*PEMRSELECTOBJECT,EMRDELETEOBJECT,*PEMRDELETEOBJECT;\n\n  typedef struct tagEMRSELECTPALETTE {\n    EMR emr;\n    DWORD ihPal;\n  } EMRSELECTPALETTE,*PEMRSELECTPALETTE;\n\n  typedef struct tagEMRRESIZEPALETTE {\n    EMR emr;\n    DWORD ihPal;\n    DWORD cEntries;\n  } EMRRESIZEPALETTE,*PEMRRESIZEPALETTE;\n\n  typedef struct tagEMRSETPALETTEENTRIES {\n    EMR emr;\n    DWORD ihPal;\n    DWORD iStart;\n    DWORD cEntries;\n    PALETTEENTRY aPalEntries[1];\n  } EMRSETPALETTEENTRIES,*PEMRSETPALETTEENTRIES;\n\n  typedef struct tagEMRSETCOLORADJUSTMENT {\n    EMR emr;\n    COLORADJUSTMENT ColorAdjustment;\n  } EMRSETCOLORADJUSTMENT,*PEMRSETCOLORADJUSTMENT;\n\n  typedef struct tagEMRGDICOMMENT {\n    EMR emr;\n    DWORD cbData;\n    BYTE Data[1];\n  } EMRGDICOMMENT,*PEMRGDICOMMENT;\n\n  typedef struct tagEMREOF {\n    EMR emr;\n    DWORD nPalEntries;\n    DWORD offPalEntries;\n    DWORD nSizeLast;\n  } EMREOF,*PEMREOF;\n\n  typedef struct tagEMRLINETO {\n    EMR emr;\n    POINTL ptl;\n  } EMRLINETO,*PEMRLINETO,EMRMOVETOEX,*PEMRMOVETOEX;\n\n  typedef struct tagEMROFFSETCLIPRGN {\n    EMR emr;\n    POINTL ptlOffset;\n  } EMROFFSETCLIPRGN,*PEMROFFSETCLIPRGN;\n\n  typedef struct tagEMRFILLPATH {\n    EMR emr;\n    RECTL rclBounds;\n  } EMRFILLPATH,*PEMRFILLPATH,EMRSTROKEANDFILLPATH,*PEMRSTROKEANDFILLPATH,EMRSTROKEPATH,*PEMRSTROKEPATH;\n\n  typedef struct tagEMREXCLUDECLIPRECT {\n    EMR emr;\n    RECTL rclClip;\n  } EMREXCLUDECLIPRECT,*PEMREXCLUDECLIPRECT,EMRINTERSECTCLIPRECT,*PEMRINTERSECTCLIPRECT;\n\n  typedef struct tagEMRSETVIEWPORTORGEX {\n    EMR emr;\n    POINTL ptlOrigin;\n  } EMRSETVIEWPORTORGEX,*PEMRSETVIEWPORTORGEX,EMRSETWINDOWORGEX,*PEMRSETWINDOWORGEX,EMRSETBRUSHORGEX,*PEMRSETBRUSHORGEX;\n\n  typedef struct tagEMRSETVIEWPORTEXTEX {\n    EMR emr;\n    SIZEL szlExtent;\n  } EMRSETVIEWPORTEXTEX,*PEMRSETVIEWPORTEXTEX,EMRSETWINDOWEXTEX,*PEMRSETWINDOWEXTEX;\n\n  typedef struct tagEMRSCALEVIEWPORTEXTEX {\n    EMR emr;\n    LONG xNum;\n    LONG xDenom;\n    LONG yNum;\n    LONG yDenom;\n  } EMRSCALEVIEWPORTEXTEX,*PEMRSCALEVIEWPORTEXTEX,EMRSCALEWINDOWEXTEX,*PEMRSCALEWINDOWEXTEX;\n\n  typedef struct tagEMRSETWORLDTRANSFORM {\n    EMR emr;\n    XFORM xform;\n  } EMRSETWORLDTRANSFORM,*PEMRSETWORLDTRANSFORM;\n\n  typedef struct tagEMRMODIFYWORLDTRANSFORM {\n    EMR emr;\n    XFORM xform;\n    DWORD iMode;\n  } EMRMODIFYWORLDTRANSFORM,*PEMRMODIFYWORLDTRANSFORM;\n\n  typedef struct tagEMRSETPIXELV {\n    EMR emr;\n    POINTL ptlPixel;\n    COLORREF crColor;\n  } EMRSETPIXELV,*PEMRSETPIXELV;\n\n  typedef struct tagEMREXTFLOODFILL {\n    EMR emr;\n    POINTL ptlStart;\n    COLORREF crColor;\n    DWORD iMode;\n  } EMREXTFLOODFILL,*PEMREXTFLOODFILL;\n\n  typedef struct tagEMRELLIPSE {\n    EMR emr;\n    RECTL rclBox;\n  } EMRELLIPSE,*PEMRELLIPSE,EMRRECTANGLE,*PEMRRECTANGLE;\n\n  typedef struct tagEMRROUNDRECT {\n    EMR emr;\n    RECTL rclBox;\n    SIZEL szlCorner;\n  } EMRROUNDRECT,*PEMRROUNDRECT;\n\n  typedef struct tagEMRARC {\n    EMR emr;\n    RECTL rclBox;\n    POINTL ptlStart;\n    POINTL ptlEnd;\n  } EMRARC,*PEMRARC,EMRARCTO,*PEMRARCTO,EMRCHORD,*PEMRCHORD,EMRPIE,*PEMRPIE;\n\n  typedef struct tagEMRANGLEARC {\n    EMR emr;\n    POINTL ptlCenter;\n    DWORD nRadius;\n    FLOAT eStartAngle;\n    FLOAT eSweepAngle;\n  } EMRANGLEARC,*PEMRANGLEARC;\n\n  typedef struct tagEMRPOLYLINE {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cptl;\n    POINTL aptl[1];\n  } EMRPOLYLINE,*PEMRPOLYLINE,EMRPOLYBEZIER,*PEMRPOLYBEZIER,EMRPOLYGON,*PEMRPOLYGON,EMRPOLYBEZIERTO,*PEMRPOLYBEZIERTO,EMRPOLYLINETO,*PEMRPOLYLINETO;\n\n  typedef struct tagEMRPOLYLINE16 {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cpts;\n    POINTS apts[1];\n  } EMRPOLYLINE16,*PEMRPOLYLINE16,EMRPOLYBEZIER16,*PEMRPOLYBEZIER16,EMRPOLYGON16,*PEMRPOLYGON16,EMRPOLYBEZIERTO16,*PEMRPOLYBEZIERTO16,EMRPOLYLINETO16,*PEMRPOLYLINETO16;\n\n  typedef struct tagEMRPOLYDRAW {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cptl;\n    POINTL aptl[1];\n    BYTE abTypes[1];\n  } EMRPOLYDRAW,*PEMRPOLYDRAW;\n\n  typedef struct tagEMRPOLYDRAW16 {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cpts;\n    POINTS apts[1];\n    BYTE abTypes[1];\n  } EMRPOLYDRAW16,*PEMRPOLYDRAW16;\n\n  typedef struct tagEMRPOLYPOLYLINE {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD nPolys;\n    DWORD cptl;\n    DWORD aPolyCounts[1];\n    POINTL aptl[1];\n  } EMRPOLYPOLYLINE,*PEMRPOLYPOLYLINE,EMRPOLYPOLYGON,*PEMRPOLYPOLYGON;\n\n  typedef struct tagEMRPOLYPOLYLINE16 {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD nPolys;\n    DWORD cpts;\n    DWORD aPolyCounts[1];\n    POINTS apts[1];\n  } EMRPOLYPOLYLINE16,*PEMRPOLYPOLYLINE16,EMRPOLYPOLYGON16,*PEMRPOLYPOLYGON16;\n\n  typedef struct tagEMRINVERTRGN {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cbRgnData;\n    BYTE RgnData[1];\n  } EMRINVERTRGN,*PEMRINVERTRGN,EMRPAINTRGN,*PEMRPAINTRGN;\n\n  typedef struct tagEMRFILLRGN {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cbRgnData;\n    DWORD ihBrush;\n    BYTE RgnData[1];\n  } EMRFILLRGN,*PEMRFILLRGN;\n\n  typedef struct tagEMRFRAMERGN {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cbRgnData;\n    DWORD ihBrush;\n    SIZEL szlStroke;\n    BYTE RgnData[1];\n  } EMRFRAMERGN,*PEMRFRAMERGN;\n\n  typedef struct tagEMREXTSELECTCLIPRGN {\n    EMR emr;\n    DWORD cbRgnData;\n    DWORD iMode;\n    BYTE RgnData[1];\n  } EMREXTSELECTCLIPRGN,*PEMREXTSELECTCLIPRGN;\n\n  typedef struct tagEMREXTTEXTOUTA {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD iGraphicsMode;\n    FLOAT exScale;\n    FLOAT eyScale;\n    EMRTEXT emrtext;\n  } EMREXTTEXTOUTA,*PEMREXTTEXTOUTA,EMREXTTEXTOUTW,*PEMREXTTEXTOUTW;\n\n  typedef struct tagEMRPOLYTEXTOUTA {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD iGraphicsMode;\n    FLOAT exScale;\n    FLOAT eyScale;\n    LONG cStrings;\n    EMRTEXT aemrtext[1];\n  } EMRPOLYTEXTOUTA,*PEMRPOLYTEXTOUTA,EMRPOLYTEXTOUTW,*PEMRPOLYTEXTOUTW;\n\n  typedef struct tagEMRBITBLT {\n    EMR emr;\n    RECTL rclBounds;\n    LONG xDest;\n    LONG yDest;\n    LONG cxDest;\n    LONG cyDest;\n    DWORD dwRop;\n    LONG xSrc;\n    LONG ySrc;\n    XFORM xformSrc;\n    COLORREF crBkColorSrc;\n    DWORD iUsageSrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n  } EMRBITBLT,*PEMRBITBLT;\n\n  typedef struct tagEMRSTRETCHBLT {\n    EMR emr;\n    RECTL rclBounds;\n    LONG xDest;\n    LONG yDest;\n    LONG cxDest;\n    LONG cyDest;\n    DWORD dwRop;\n    LONG xSrc;\n    LONG ySrc;\n    XFORM xformSrc;\n    COLORREF crBkColorSrc;\n    DWORD iUsageSrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n    LONG cxSrc;\n    LONG cySrc;\n  } EMRSTRETCHBLT,*PEMRSTRETCHBLT;\n\n  typedef struct tagEMRMASKBLT {\n    EMR emr;\n    RECTL rclBounds;\n    LONG xDest;\n    LONG yDest;\n    LONG cxDest;\n    LONG cyDest;\n    DWORD dwRop;\n    LONG xSrc;\n    LONG ySrc;\n    XFORM xformSrc;\n    COLORREF crBkColorSrc;\n    DWORD iUsageSrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n    LONG xMask;\n    LONG yMask;\n    DWORD iUsageMask;\n    DWORD offBmiMask;\n    DWORD cbBmiMask;\n    DWORD offBitsMask;\n    DWORD cbBitsMask;\n  } EMRMASKBLT,*PEMRMASKBLT;\n\n  typedef struct tagEMRPLGBLT {\n    EMR emr;\n    RECTL rclBounds;\n    POINTL aptlDest[3];\n    LONG xSrc;\n    LONG ySrc;\n    LONG cxSrc;\n    LONG cySrc;\n    XFORM xformSrc;\n    COLORREF crBkColorSrc;\n    DWORD iUsageSrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n    LONG xMask;\n    LONG yMask;\n    DWORD iUsageMask;\n    DWORD offBmiMask;\n    DWORD cbBmiMask;\n    DWORD offBitsMask;\n    DWORD cbBitsMask;\n  } EMRPLGBLT,*PEMRPLGBLT;\n\n  typedef struct tagEMRSETDIBITSTODEVICE {\n    EMR emr;\n    RECTL rclBounds;\n    LONG xDest;\n    LONG yDest;\n    LONG xSrc;\n    LONG ySrc;\n    LONG cxSrc;\n    LONG cySrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n    DWORD iUsageSrc;\n    DWORD iStartScan;\n    DWORD cScans;\n  } EMRSETDIBITSTODEVICE,*PEMRSETDIBITSTODEVICE;\n\n  typedef struct tagEMRSTRETCHDIBITS {\n    EMR emr;\n    RECTL rclBounds;\n    LONG xDest;\n    LONG yDest;\n    LONG xSrc;\n    LONG ySrc;\n    LONG cxSrc;\n    LONG cySrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n    DWORD iUsageSrc;\n    DWORD dwRop;\n    LONG cxDest;\n    LONG cyDest;\n  } EMRSTRETCHDIBITS,*PEMRSTRETCHDIBITS;\n\n  typedef struct tagEMREXTCREATEFONTINDIRECTW {\n    EMR emr;\n    DWORD ihFont;\n    EXTLOGFONTW elfw;\n  } EMREXTCREATEFONTINDIRECTW,*PEMREXTCREATEFONTINDIRECTW;\n\n  typedef struct tagEMRCREATEPALETTE {\n    EMR emr;\n    DWORD ihPal;\n    LOGPALETTE lgpl;\n  } EMRCREATEPALETTE,*PEMRCREATEPALETTE;\n\n  typedef struct tagEMRCREATEPEN {\n    EMR emr;\n    DWORD ihPen;\n    LOGPEN lopn;\n  } EMRCREATEPEN,*PEMRCREATEPEN;\n\n  typedef struct tagEMREXTCREATEPEN {\n    EMR emr;\n    DWORD ihPen;\n    DWORD offBmi;\n    DWORD cbBmi;\n    DWORD offBits;\n    DWORD cbBits;\n    EXTLOGPEN elp;\n  } EMREXTCREATEPEN,*PEMREXTCREATEPEN;\n\n  typedef struct tagEMRCREATEBRUSHINDIRECT {\n    EMR emr;\n    DWORD ihBrush;\n    LOGBRUSH32 lb;\n  } EMRCREATEBRUSHINDIRECT,*PEMRCREATEBRUSHINDIRECT;\n\n  typedef struct tagEMRCREATEMONOBRUSH {\n    EMR emr;\n    DWORD ihBrush;\n    DWORD iUsage;\n    DWORD offBmi;\n    DWORD cbBmi;\n    DWORD offBits;\n    DWORD cbBits;\n  } EMRCREATEMONOBRUSH,*PEMRCREATEMONOBRUSH;\n\n  typedef struct tagEMRCREATEDIBPATTERNBRUSHPT {\n    EMR emr;\n    DWORD ihBrush;\n    DWORD iUsage;\n    DWORD offBmi;\n    DWORD cbBmi;\n    DWORD offBits;\n    DWORD cbBits;\n  } EMRCREATEDIBPATTERNBRUSHPT,*PEMRCREATEDIBPATTERNBRUSHPT;\n\n  typedef struct tagEMRFORMAT {\n    DWORD dSignature;\n    DWORD nVersion;\n    DWORD cbData;\n    DWORD offData;\n  } EMRFORMAT,*PEMRFORMAT;\n\n  typedef struct tagEMRGLSRECORD {\n    EMR emr;\n    DWORD cbData;\n    BYTE Data[1];\n  } EMRGLSRECORD,*PEMRGLSRECORD;\n\n  typedef struct tagEMRGLSBOUNDEDRECORD {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD cbData;\n    BYTE Data[1];\n  } EMRGLSBOUNDEDRECORD,*PEMRGLSBOUNDEDRECORD;\n\n  typedef struct tagEMRPIXELFORMAT {\n    EMR emr;\n    PIXELFORMATDESCRIPTOR pfd;\n  } EMRPIXELFORMAT,*PEMRPIXELFORMAT;\n\n  typedef struct tagEMRCREATECOLORSPACE {\n    EMR emr;\n    DWORD ihCS;\n    LOGCOLORSPACEA lcs;\n  } EMRCREATECOLORSPACE,*PEMRCREATECOLORSPACE;\n\n  typedef struct tagEMRSETCOLORSPACE {\n    EMR emr;\n    DWORD ihCS;\n  } EMRSETCOLORSPACE,*PEMRSETCOLORSPACE,EMRSELECTCOLORSPACE,*PEMRSELECTCOLORSPACE,EMRDELETECOLORSPACE,*PEMRDELETECOLORSPACE;\n\n  typedef struct tagEMREXTESCAPE {\n    EMR emr;\n    INT iEscape;\n    INT cbEscData;\n    BYTE EscData[1];\n  } EMREXTESCAPE,*PEMREXTESCAPE,EMRDRAWESCAPE,*PEMRDRAWESCAPE;\n\n  typedef struct tagEMRNAMEDESCAPE {\n    EMR emr;\n    INT iEscape;\n    INT cbDriver;\n    INT cbEscData;\n    BYTE EscData[1];\n  } EMRNAMEDESCAPE,*PEMRNAMEDESCAPE;\n\n#define SETICMPROFILE_EMBEDED 0x00000001\n\n  typedef struct tagEMRSETICMPROFILE {\n    EMR emr;\n    DWORD dwFlags;\n    DWORD cbName;\n    DWORD cbData;\n    BYTE Data[1];\n  } EMRSETICMPROFILE,*PEMRSETICMPROFILE,EMRSETICMPROFILEA,*PEMRSETICMPROFILEA,EMRSETICMPROFILEW,*PEMRSETICMPROFILEW;\n\n#define CREATECOLORSPACE_EMBEDED 0x00000001\n\n  typedef struct tagEMRCREATECOLORSPACEW {\n    EMR emr;\n    DWORD ihCS;\n    LOGCOLORSPACEW lcs;\n    DWORD dwFlags;\n    DWORD cbData;\n    BYTE Data[1];\n  } EMRCREATECOLORSPACEW,*PEMRCREATECOLORSPACEW;\n\n#define COLORMATCHTOTARGET_EMBEDED 0x00000001\n\n  typedef struct tagCOLORMATCHTOTARGET {\n    EMR emr;\n    DWORD dwAction;\n    DWORD dwFlags;\n    DWORD cbName;\n    DWORD cbData;\n    BYTE Data[1];\n  } EMRCOLORMATCHTOTARGET,*PEMRCOLORMATCHTOTARGET;\n\n  typedef struct tagCOLORCORRECTPALETTE {\n    EMR emr;\n    DWORD ihPalette;\n    DWORD nFirstEntry;\n    DWORD nPalEntries;\n    DWORD nReserved;\n  } EMRCOLORCORRECTPALETTE,*PEMRCOLORCORRECTPALETTE;\n\n  typedef struct tagEMRALPHABLEND {\n    EMR emr;\n    RECTL rclBounds;\n    LONG xDest;\n    LONG yDest;\n    LONG cxDest;\n    LONG cyDest;\n    DWORD dwRop;\n    LONG xSrc;\n    LONG ySrc;\n    XFORM xformSrc;\n    COLORREF crBkColorSrc;\n    DWORD iUsageSrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n    LONG cxSrc;\n    LONG cySrc;\n  } EMRALPHABLEND,*PEMRALPHABLEND;\n\n  typedef struct tagEMRGRADIENTFILL {\n    EMR emr;\n    RECTL rclBounds;\n    DWORD nVer;\n    DWORD nTri;\n    ULONG ulMode;\n    TRIVERTEX Ver[1];\n  } EMRGRADIENTFILL,*PEMRGRADIENTFILL;\n\n  typedef struct tagEMRTRANSPARENTBLT {\n    EMR emr;\n    RECTL rclBounds;\n    LONG xDest;\n    LONG yDest;\n    LONG cxDest;\n    LONG cyDest;\n    DWORD dwRop;\n    LONG xSrc;\n    LONG ySrc;\n    XFORM xformSrc;\n    COLORREF crBkColorSrc;\n    DWORD iUsageSrc;\n    DWORD offBmiSrc;\n    DWORD cbBmiSrc;\n    DWORD offBitsSrc;\n    DWORD cbBitsSrc;\n    LONG cxSrc;\n    LONG cySrc;\n  } EMRTRANSPARENTBLT,*PEMRTRANSPARENTBLT;\n\n#define GDICOMMENT_IDENTIFIER 0x43494447\n#define GDICOMMENT_WINDOWS_METAFILE 0x80000001\n#define GDICOMMENT_BEGINGROUP 0x00000002\n#define GDICOMMENT_ENDGROUP 0x00000003\n#define GDICOMMENT_MULTIFORMATS 0x40000004\n#define EPS_SIGNATURE 0x46535045\n#define GDICOMMENT_UNICODE_STRING 0x00000040\n#define GDICOMMENT_UNICODE_END 0x00000080\n#endif\n\n#ifdef UNICODE\n#define wglUseFontBitmaps wglUseFontBitmapsW\n#else\n#define wglUseFontBitmaps wglUseFontBitmapsA\n#endif\n\n  WINGDIAPI WINBOOL WINAPI wglCopyContext(HGLRC,HGLRC,UINT);\n  WINGDIAPI HGLRC WINAPI wglCreateContext(HDC);\n  WINGDIAPI HGLRC WINAPI wglCreateLayerContext(HDC,int);\n  WINGDIAPI WINBOOL WINAPI wglDeleteContext(HGLRC);\n  WINGDIAPI HGLRC WINAPI wglGetCurrentContext(VOID);\n  WINGDIAPI HDC WINAPI wglGetCurrentDC(VOID);\n  WINGDIAPI PROC WINAPI wglGetProcAddress(LPCSTR);\n  WINGDIAPI WINBOOL WINAPI wglMakeCurrent(HDC,HGLRC);\n  WINGDIAPI WINBOOL WINAPI wglShareLists(HGLRC,HGLRC);\n  WINGDIAPI WINBOOL WINAPI wglUseFontBitmapsA(HDC,DWORD,DWORD,DWORD);\n  WINGDIAPI WINBOOL WINAPI wglUseFontBitmapsW(HDC,DWORD,DWORD,DWORD);\n  WINGDIAPI WINBOOL WINAPI SwapBuffers(HDC);\n\n  typedef struct _POINTFLOAT {\n    FLOAT x;\n    FLOAT y;\n  } POINTFLOAT,*PPOINTFLOAT;\n\n  typedef struct _GLYPHMETRICSFLOAT {\n    FLOAT gmfBlackBoxX;\n    FLOAT gmfBlackBoxY;\n    POINTFLOAT gmfptGlyphOrigin;\n    FLOAT gmfCellIncX;\n    FLOAT gmfCellIncY;\n  } GLYPHMETRICSFLOAT,*PGLYPHMETRICSFLOAT,*LPGLYPHMETRICSFLOAT;\n\n#define WGL_FONT_LINES 0\n#define WGL_FONT_POLYGONS 1\n\n#ifdef UNICODE\n#define wglUseFontOutlines wglUseFontOutlinesW\n#else\n#define wglUseFontOutlines wglUseFontOutlinesA\n#endif\n\n  WINGDIAPI WINBOOL WINAPI wglUseFontOutlinesA(HDC,DWORD,DWORD,DWORD,FLOAT,FLOAT,int,LPGLYPHMETRICSFLOAT);\n  WINGDIAPI WINBOOL WINAPI wglUseFontOutlinesW(HDC,DWORD,DWORD,DWORD,FLOAT,FLOAT,int,LPGLYPHMETRICSFLOAT);\n\n  typedef struct tagLAYERPLANEDESCRIPTOR {\n    WORD nSize;\n    WORD nVersion;\n    DWORD dwFlags;\n    BYTE iPixelType;\n    BYTE cColorBits;\n    BYTE cRedBits;\n    BYTE cRedShift;\n    BYTE cGreenBits;\n    BYTE cGreenShift;\n    BYTE cBlueBits;\n    BYTE cBlueShift;\n    BYTE cAlphaBits;\n    BYTE cAlphaShift;\n    BYTE cAccumBits;\n    BYTE cAccumRedBits;\n    BYTE cAccumGreenBits;\n    BYTE cAccumBlueBits;\n    BYTE cAccumAlphaBits;\n    BYTE cDepthBits;\n    BYTE cStencilBits;\n    BYTE cAuxBuffers;\n    BYTE iLayerPlane;\n    BYTE bReserved;\n    COLORREF crTransparent;\n  } LAYERPLANEDESCRIPTOR,*PLAYERPLANEDESCRIPTOR,*LPLAYERPLANEDESCRIPTOR;\n\n#define LPD_DOUBLEBUFFER 0x00000001\n#define LPD_STEREO 0x00000002\n#define LPD_SUPPORT_GDI 0x00000010\n#define LPD_SUPPORT_OPENGL 0x00000020\n#define LPD_SHARE_DEPTH 0x00000040\n#define LPD_SHARE_STENCIL 0x00000080\n#define LPD_SHARE_ACCUM 0x00000100\n#define LPD_SWAP_EXCHANGE 0x00000200\n#define LPD_SWAP_COPY 0x00000400\n#define LPD_TRANSPARENT 0x00001000\n\n#define LPD_TYPE_RGBA 0\n#define LPD_TYPE_COLORINDEX 1\n\n#define WGL_SWAP_MAIN_PLANE 0x00000001\n#define WGL_SWAP_OVERLAY1 0x00000002\n#define WGL_SWAP_OVERLAY2 0x00000004\n#define WGL_SWAP_OVERLAY3 0x00000008\n#define WGL_SWAP_OVERLAY4 0x00000010\n#define WGL_SWAP_OVERLAY5 0x00000020\n#define WGL_SWAP_OVERLAY6 0x00000040\n#define WGL_SWAP_OVERLAY7 0x00000080\n#define WGL_SWAP_OVERLAY8 0x00000100\n#define WGL_SWAP_OVERLAY9 0x00000200\n#define WGL_SWAP_OVERLAY10 0x00000400\n#define WGL_SWAP_OVERLAY11 0x00000800\n#define WGL_SWAP_OVERLAY12 0x00001000\n#define WGL_SWAP_OVERLAY13 0x00002000\n#define WGL_SWAP_OVERLAY14 0x00004000\n#define WGL_SWAP_OVERLAY15 0x00008000\n#define WGL_SWAP_UNDERLAY1 0x00010000\n#define WGL_SWAP_UNDERLAY2 0x00020000\n#define WGL_SWAP_UNDERLAY3 0x00040000\n#define WGL_SWAP_UNDERLAY4 0x00080000\n#define WGL_SWAP_UNDERLAY5 0x00100000\n#define WGL_SWAP_UNDERLAY6 0x00200000\n#define WGL_SWAP_UNDERLAY7 0x00400000\n#define WGL_SWAP_UNDERLAY8 0x00800000\n#define WGL_SWAP_UNDERLAY9 0x01000000\n#define WGL_SWAP_UNDERLAY10 0x02000000\n#define WGL_SWAP_UNDERLAY11 0x04000000\n#define WGL_SWAP_UNDERLAY12 0x08000000\n#define WGL_SWAP_UNDERLAY13 0x10000000\n#define WGL_SWAP_UNDERLAY14 0x20000000\n#define WGL_SWAP_UNDERLAY15 0x40000000\n\n  WINGDIAPI WINBOOL WINAPI wglDescribeLayerPlane(HDC,int,int,UINT,LPLAYERPLANEDESCRIPTOR);\n  WINGDIAPI int WINAPI wglSetLayerPaletteEntries(HDC,int,int,int,CONST COLORREF *);\n  WINGDIAPI int WINAPI wglGetLayerPaletteEntries(HDC,int,int,int,COLORREF *);\n  WINGDIAPI WINBOOL WINAPI wglRealizeLayerPalette(HDC,int,WINBOOL);\n  WINGDIAPI WINBOOL WINAPI wglSwapLayerBuffers(HDC,UINT);\n\n  typedef struct _WGLSWAP {\n    HDC hdc;\n    UINT uiFlags;\n  } WGLSWAP,*PWGLSWAP,*LPWGLSWAP;\n\n#define WGL_SWAPMULTIPLE_MAX 16\n\n  WINGDIAPI DWORD WINAPI wglSwapMultipleBuffers(UINT,CONST WGLSWAP *);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winnetwk.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINNETWK_\n#define _WINNETWK_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define WNNC_NET_MSNET 0x00010000\n#define WNNC_NET_LANMAN 0x00020000\n#define WNNC_NET_NETWARE 0x00030000\n#define WNNC_NET_VINES 0x00040000\n#define WNNC_NET_10NET 0x00050000\n#define WNNC_NET_LOCUS 0x00060000\n#define WNNC_NET_SUN_PC_NFS 0x00070000\n#define WNNC_NET_LANSTEP 0x00080000\n#define WNNC_NET_9TILES 0x00090000\n#define WNNC_NET_LANTASTIC 0x000A0000\n#define WNNC_NET_AS400 0x000B0000\n#define WNNC_NET_FTP_NFS 0x000C0000\n#define WNNC_NET_PATHWORKS 0x000D0000\n#define WNNC_NET_LIFENET 0x000E0000\n#define WNNC_NET_POWERLAN 0x000F0000\n#define WNNC_NET_BWNFS 0x00100000\n#define WNNC_NET_COGENT 0x00110000\n#define WNNC_NET_FARALLON 0x00120000\n#define WNNC_NET_APPLETALK 0x00130000\n#define WNNC_NET_INTERGRAPH 0x00140000\n#define WNNC_NET_SYMFONET 0x00150000\n#define WNNC_NET_CLEARCASE 0x00160000\n#define WNNC_NET_FRONTIER 0x00170000\n#define WNNC_NET_BMC 0x00180000\n#define WNNC_NET_DCE 0x00190000\n#define WNNC_NET_AVID 0x001A0000\n#define WNNC_NET_DOCUSPACE 0x001B0000\n#define WNNC_NET_MANGOSOFT 0x001C0000\n#define WNNC_NET_SERNET 0x001D0000\n#define WNNC_NET_RIVERFRONT1 0X001E0000\n#define WNNC_NET_RIVERFRONT2 0x001F0000\n#define WNNC_NET_DECORB 0x00200000\n#define WNNC_NET_PROTSTOR 0x00210000\n#define WNNC_NET_FJ_REDIR 0x00220000\n#define WNNC_NET_DISTINCT 0x00230000\n#define WNNC_NET_TWINS 0x00240000\n#define WNNC_NET_RDR2SAMPLE 0x00250000\n#define WNNC_NET_CSC 0x00260000\n#define WNNC_NET_3IN1 0x00270000\n#define WNNC_NET_EXTENDNET 0x00290000\n#define WNNC_NET_STAC 0x002A0000\n#define WNNC_NET_FOXBAT 0x002B0000\n#define WNNC_NET_YAHOO 0x002C0000\n#define WNNC_NET_EXIFS 0x002D0000\n#define WNNC_NET_DAV 0x002E0000\n#define WNNC_NET_KNOWARE 0x002F0000\n#define WNNC_NET_OBJECT_DIRE 0x00300000\n#define WNNC_NET_MASFAX 0x00310000\n#define WNNC_NET_HOB_NFS 0x00320000\n#define WNNC_NET_SHIVA 0x00330000\n#define WNNC_NET_IBMAL 0x00340000\n#define WNNC_NET_LOCK 0x00350000\n#define WNNC_NET_TERMSRV 0x00360000\n#define WNNC_NET_SRT 0x00370000\n#define WNNC_NET_QUINCY 0x00380000\n\n#define WNNC_CRED_MANAGER 0xFFFF0000\n\n#define RESOURCE_CONNECTED 0x00000001\n#define RESOURCE_GLOBALNET 0x00000002\n#define RESOURCE_REMEMBERED 0x00000003\n#define RESOURCE_RECENT 0x00000004\n#define RESOURCE_CONTEXT 0x00000005\n\n#define RESOURCETYPE_ANY 0x00000000\n#define RESOURCETYPE_DISK 0x00000001\n#define RESOURCETYPE_PRINT 0x00000002\n#define RESOURCETYPE_RESERVED 0x00000008\n#define RESOURCETYPE_UNKNOWN 0xFFFFFFFF\n\n#define RESOURCEUSAGE_CONNECTABLE 0x00000001\n#define RESOURCEUSAGE_CONTAINER 0x00000002\n#define RESOURCEUSAGE_NOLOCALDEVICE 0x00000004\n#define RESOURCEUSAGE_SIBLING 0x00000008\n#define RESOURCEUSAGE_ATTACHED 0x00000010\n#define RESOURCEUSAGE_ALL (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED)\n#define RESOURCEUSAGE_RESERVED 0x80000000\n\n#define RESOURCEDISPLAYTYPE_GENERIC 0x00000000\n#define RESOURCEDISPLAYTYPE_DOMAIN 0x00000001\n#define RESOURCEDISPLAYTYPE_SERVER 0x00000002\n#define RESOURCEDISPLAYTYPE_SHARE 0x00000003\n#define RESOURCEDISPLAYTYPE_FILE 0x00000004\n#define RESOURCEDISPLAYTYPE_GROUP 0x00000005\n#define RESOURCEDISPLAYTYPE_NETWORK 0x00000006\n#define RESOURCEDISPLAYTYPE_ROOT 0x00000007\n#define RESOURCEDISPLAYTYPE_SHAREADMIN 0x00000008\n#define RESOURCEDISPLAYTYPE_DIRECTORY 0x00000009\n#define RESOURCEDISPLAYTYPE_TREE 0x0000000A\n#define RESOURCEDISPLAYTYPE_NDSCONTAINER 0x0000000B\n\n  typedef struct _NETRESOURCEA {\n    DWORD dwScope;\n    DWORD dwType;\n    DWORD dwDisplayType;\n    DWORD dwUsage;\n    LPSTR lpLocalName;\n    LPSTR lpRemoteName;\n    LPSTR lpComment;\n    LPSTR lpProvider;\n  }NETRESOURCEA,*LPNETRESOURCEA;\n  typedef struct _NETRESOURCEW {\n    DWORD dwScope;\n    DWORD dwType;\n    DWORD dwDisplayType;\n    DWORD dwUsage;\n    LPWSTR lpLocalName;\n    LPWSTR lpRemoteName;\n    LPWSTR lpComment;\n    LPWSTR lpProvider;\n  }NETRESOURCEW,*LPNETRESOURCEW;\n#ifdef UNICODE\n  typedef NETRESOURCEW NETRESOURCE;\n  typedef LPNETRESOURCEW LPNETRESOURCE;\n#else\n  typedef NETRESOURCEA NETRESOURCE;\n  typedef LPNETRESOURCEA LPNETRESOURCE;\n#endif\n\n#define NETPROPERTY_PERSISTENT 1\n\n#define CONNECT_UPDATE_PROFILE 0x00000001\n#define CONNECT_UPDATE_RECENT 0x00000002\n#define CONNECT_TEMPORARY 0x00000004\n#define CONNECT_INTERACTIVE 0x00000008\n#define CONNECT_PROMPT 0x00000010\n#define CONNECT_NEED_DRIVE 0x00000020\n#define CONNECT_REFCOUNT 0x00000040\n#define CONNECT_REDIRECT 0x00000080\n#define CONNECT_LOCALDRIVE 0x00000100\n#define CONNECT_CURRENT_MEDIA 0x00000200\n#define CONNECT_DEFERRED 0x00000400\n#define CONNECT_RESERVED 0xFF000000\n#define CONNECT_COMMANDLINE 0x00000800\n#define CONNECT_CMD_SAVECRED 0x00001000\n\n#ifdef UNICODE\n#define WNetAddConnection WNetAddConnectionW\n#define WNetAddConnection2 WNetAddConnection2W\n#define WNetAddConnection3 WNetAddConnection3W\n#define WNetCancelConnection WNetCancelConnectionW\n#define WNetCancelConnection2 WNetCancelConnection2W\n#define WNetGetConnection WNetGetConnectionW\n#define WNetRestoreConnection WNetRestoreConnectionW\n#define WNetUseConnection WNetUseConnectionW\n#else\n#define WNetAddConnection WNetAddConnectionA\n#define WNetAddConnection2 WNetAddConnection2A\n#define WNetAddConnection3 WNetAddConnection3A\n#define WNetCancelConnection WNetCancelConnectionA\n#define WNetCancelConnection2 WNetCancelConnection2A\n#define WNetGetConnection WNetGetConnectionA\n#define WNetRestoreConnection WNetRestoreConnectionA\n#define WNetUseConnection WNetUseConnectionA\n#endif\n\n  DWORD WINAPI WNetAddConnectionA(LPCSTR lpRemoteName,LPCSTR lpPassword,LPCSTR lpLocalName);\n  DWORD WINAPI WNetAddConnectionW(LPCWSTR lpRemoteName,LPCWSTR lpPassword,LPCWSTR lpLocalName);\n  DWORD WINAPI WNetAddConnection2A(LPNETRESOURCEA lpNetResource,LPCSTR lpPassword,LPCSTR lpUserName,DWORD dwFlags);\n  DWORD WINAPI WNetAddConnection2W(LPNETRESOURCEW lpNetResource,LPCWSTR lpPassword,LPCWSTR lpUserName,DWORD dwFlags);\n  DWORD WINAPI WNetAddConnection3A(HWND hwndOwner,LPNETRESOURCEA lpNetResource,LPCSTR lpPassword,LPCSTR lpUserName,DWORD dwFlags);\n  DWORD WINAPI WNetAddConnection3W(HWND hwndOwner,LPNETRESOURCEW lpNetResource,LPCWSTR lpPassword,LPCWSTR lpUserName,DWORD dwFlags);\n  DWORD WINAPI WNetCancelConnectionA(LPCSTR lpName,WINBOOL fForce);\n  DWORD WINAPI WNetCancelConnectionW(LPCWSTR lpName,WINBOOL fForce);\n  DWORD WINAPI WNetCancelConnection2A(LPCSTR lpName,DWORD dwFlags,WINBOOL fForce);\n  DWORD WINAPI WNetCancelConnection2W(LPCWSTR lpName,DWORD dwFlags,WINBOOL fForce);\n  DWORD WINAPI WNetGetConnectionA(LPCSTR lpLocalName,LPSTR lpRemoteName,LPDWORD lpnLength);\n  DWORD WINAPI WNetGetConnectionW(LPCWSTR lpLocalName,LPWSTR lpRemoteName,LPDWORD lpnLength);\n  DWORD WINAPI WNetRestoreConnectionA(HWND hwndParent,LPCSTR lpDevice);\n  DWORD WINAPI WNetRestoreConnectionW(HWND hwndParent,LPCWSTR lpDevice);\n  DWORD WINAPI WNetUseConnectionA(HWND hwndOwner,LPNETRESOURCEA lpNetResource,LPCSTR lpPassword,LPCSTR lpUserID,DWORD dwFlags,LPSTR lpAccessName,LPDWORD lpBufferSize,LPDWORD lpResult);\n  DWORD WINAPI WNetUseConnectionW(HWND hwndOwner,LPNETRESOURCEW lpNetResource,LPCWSTR lpPassword,LPCWSTR lpUserID,DWORD dwFlags,LPWSTR lpAccessName,LPDWORD lpBufferSize,LPDWORD lpResult);\n  DWORD WINAPI WNetConnectionDialog(HWND hwnd,DWORD dwType);\n  DWORD WINAPI WNetDisconnectDialog(HWND hwnd,DWORD dwType);\n\n  typedef struct _CONNECTDLGSTRUCTA {\n    DWORD cbStructure;\n    HWND hwndOwner;\n    LPNETRESOURCEA lpConnRes;\n    DWORD dwFlags;\n    DWORD dwDevNum;\n  } CONNECTDLGSTRUCTA,*LPCONNECTDLGSTRUCTA;\n\n  typedef struct _CONNECTDLGSTRUCTW {\n    DWORD cbStructure;\n    HWND hwndOwner;\n    LPNETRESOURCEW lpConnRes;\n    DWORD dwFlags;\n    DWORD dwDevNum;\n  } CONNECTDLGSTRUCTW,*LPCONNECTDLGSTRUCTW;\n#ifdef UNICODE\n  typedef CONNECTDLGSTRUCTW CONNECTDLGSTRUCT;\n  typedef LPCONNECTDLGSTRUCTW LPCONNECTDLGSTRUCT;\n#else\n  typedef CONNECTDLGSTRUCTA CONNECTDLGSTRUCT;\n  typedef LPCONNECTDLGSTRUCTA LPCONNECTDLGSTRUCT;\n#endif\n\n#define CONNDLG_RO_PATH 0x00000001\n#define CONNDLG_CONN_POINT 0x00000002\n#define CONNDLG_USE_MRU 0x00000004\n#define CONNDLG_HIDE_BOX 0x00000008\n\n#define CONNDLG_PERSIST 0x00000010\n#define CONNDLG_NOT_PERSIST 0x00000020\n\n#ifdef UNICODE\n#define WNetConnectionDialog1 WNetConnectionDialog1W\n#else\n#define WNetConnectionDialog1 WNetConnectionDialog1A\n#endif\n\n  DWORD WINAPI WNetConnectionDialog1A(LPCONNECTDLGSTRUCTA lpConnDlgStruct);\n  DWORD WINAPI WNetConnectionDialog1W(LPCONNECTDLGSTRUCTW lpConnDlgStruct);\n\n  typedef struct _DISCDLGSTRUCTA {\n    DWORD cbStructure;\n    HWND hwndOwner;\n    LPSTR lpLocalName;\n    LPSTR lpRemoteName;\n    DWORD dwFlags;\n  } DISCDLGSTRUCTA,*LPDISCDLGSTRUCTA;\n\n  typedef struct _DISCDLGSTRUCTW {\n    DWORD cbStructure;\n    HWND hwndOwner;\n    LPWSTR lpLocalName;\n    LPWSTR lpRemoteName;\n    DWORD dwFlags;\n  } DISCDLGSTRUCTW,*LPDISCDLGSTRUCTW;\n\n#ifdef UNICODE\n  typedef DISCDLGSTRUCTW DISCDLGSTRUCT;\n  typedef LPDISCDLGSTRUCTW LPDISCDLGSTRUCT;\n#else\n  typedef DISCDLGSTRUCTA DISCDLGSTRUCT;\n  typedef LPDISCDLGSTRUCTA LPDISCDLGSTRUCT;\n#endif\n\n#define DISC_UPDATE_PROFILE 0x00000001\n#define DISC_NO_FORCE 0x00000040\n\n#ifdef UNICODE\n#define WNetDisconnectDialog1 WNetDisconnectDialog1W\n#define WNetOpenEnum WNetOpenEnumW\n#define WNetEnumResource WNetEnumResourceW\n#define WNetGetResourceParent WNetGetResourceParentW\n#define WNetGetResourceInformation WNetGetResourceInformationW\n#else\n#define WNetDisconnectDialog1 WNetDisconnectDialog1A\n#define WNetOpenEnum WNetOpenEnumA\n#define WNetEnumResource WNetEnumResourceA\n#define WNetGetResourceParent WNetGetResourceParentA\n#define WNetGetResourceInformation WNetGetResourceInformationA\n#endif\n\n  DWORD WINAPI WNetDisconnectDialog1A(LPDISCDLGSTRUCTA lpConnDlgStruct);\n  DWORD WINAPI WNetDisconnectDialog1W(LPDISCDLGSTRUCTW lpConnDlgStruct);\n  DWORD WINAPI WNetOpenEnumA(DWORD dwScope,DWORD dwType,DWORD dwUsage,LPNETRESOURCEA lpNetResource,LPHANDLE lphEnum);\n  DWORD WINAPI WNetOpenEnumW(DWORD dwScope,DWORD dwType,DWORD dwUsage,LPNETRESOURCEW lpNetResource,LPHANDLE lphEnum);\n  DWORD WINAPI WNetEnumResourceA(HANDLE hEnum,LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize);\n  DWORD WINAPI WNetEnumResourceW(HANDLE hEnum,LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize);\n  DWORD WINAPI WNetCloseEnum(HANDLE hEnum);\n  DWORD WINAPI WNetGetResourceParentA(LPNETRESOURCEA lpNetResource,LPVOID lpBuffer,LPDWORD lpcbBuffer);\n  DWORD WINAPI WNetGetResourceParentW(LPNETRESOURCEW lpNetResource,LPVOID lpBuffer,LPDWORD lpcbBuffer);\n  DWORD WINAPI WNetGetResourceInformationA(LPNETRESOURCEA lpNetResource,LPVOID lpBuffer,LPDWORD lpcbBuffer,LPSTR *lplpSystem);\n  DWORD WINAPI WNetGetResourceInformationW(LPNETRESOURCEW lpNetResource,LPVOID lpBuffer,LPDWORD lpcbBuffer,LPWSTR *lplpSystem);\n\n#define UNIVERSAL_NAME_INFO_LEVEL 0x00000001\n#define REMOTE_NAME_INFO_LEVEL 0x00000002\n\n  typedef struct _UNIVERSAL_NAME_INFOA {\n    LPSTR lpUniversalName;\n  } UNIVERSAL_NAME_INFOA,*LPUNIVERSAL_NAME_INFOA;\n\n  typedef struct _UNIVERSAL_NAME_INFOW {\n    LPWSTR lpUniversalName;\n  } UNIVERSAL_NAME_INFOW,*LPUNIVERSAL_NAME_INFOW;\n\n#ifdef UNICODE\n  typedef UNIVERSAL_NAME_INFOW UNIVERSAL_NAME_INFO;\n  typedef LPUNIVERSAL_NAME_INFOW LPUNIVERSAL_NAME_INFO;\n#else\n  typedef UNIVERSAL_NAME_INFOA UNIVERSAL_NAME_INFO;\n  typedef LPUNIVERSAL_NAME_INFOA LPUNIVERSAL_NAME_INFO;\n#endif\n\n  typedef struct _REMOTE_NAME_INFOA {\n    LPSTR lpUniversalName;\n    LPSTR lpConnectionName;\n    LPSTR lpRemainingPath;\n  } REMOTE_NAME_INFOA,*LPREMOTE_NAME_INFOA;\n\n  typedef struct _REMOTE_NAME_INFOW {\n    LPWSTR lpUniversalName;\n    LPWSTR lpConnectionName;\n    LPWSTR lpRemainingPath;\n  } REMOTE_NAME_INFOW,*LPREMOTE_NAME_INFOW;\n\n#ifdef UNICODE\n  typedef REMOTE_NAME_INFOW REMOTE_NAME_INFO;\n  typedef LPREMOTE_NAME_INFOW LPREMOTE_NAME_INFO;\n#else\n  typedef REMOTE_NAME_INFOA REMOTE_NAME_INFO;\n  typedef LPREMOTE_NAME_INFOA LPREMOTE_NAME_INFO;\n#endif\n\n#ifdef UNICODE\n#define WNetGetUniversalName WNetGetUniversalNameW\n#define WNetGetUser WNetGetUserW\n#define WNetGetProviderName WNetGetProviderNameW\n#else\n#define WNetGetUniversalName WNetGetUniversalNameA\n#define WNetGetUser WNetGetUserA\n#define WNetGetProviderName WNetGetProviderNameA\n#endif\n\n  DWORD WINAPI WNetGetUniversalNameA(LPCSTR lpLocalPath,DWORD dwInfoLevel,LPVOID lpBuffer,LPDWORD lpBufferSize);\n  DWORD WINAPI WNetGetUniversalNameW(LPCWSTR lpLocalPath,DWORD dwInfoLevel,LPVOID lpBuffer,LPDWORD lpBufferSize);\n  DWORD WINAPI WNetGetUserA(LPCSTR lpName,LPSTR lpUserName,LPDWORD lpnLength);\n  DWORD WINAPI WNetGetUserW(LPCWSTR lpName,LPWSTR lpUserName,LPDWORD lpnLength);\n\n#define WNFMT_MULTILINE 0x01\n#define WNFMT_ABBREVIATED 0x02\n#define WNFMT_INENUM 0x10\n#define WNFMT_CONNECTION 0x20\n\n  DWORD WINAPI WNetGetProviderNameA(DWORD dwNetType,LPSTR lpProviderName,LPDWORD lpBufferSize);\n  DWORD WINAPI WNetGetProviderNameW(DWORD dwNetType,LPWSTR lpProviderName,LPDWORD lpBufferSize);\n\n  typedef struct _NETINFOSTRUCT {\n    DWORD cbStructure;\n    DWORD dwProviderVersion;\n    DWORD dwStatus;\n    DWORD dwCharacteristics;\n    ULONG_PTR dwHandle;\n    WORD wNetType;\n    DWORD dwPrinters;\n    DWORD dwDrives;\n  } NETINFOSTRUCT,*LPNETINFOSTRUCT;\n\n#define NETINFO_DLL16 0x00000001\n#define NETINFO_DISKRED 0x00000004\n#define NETINFO_PRINTERRED 0x00000008\n\n#ifdef UNICODE\n#define WNetGetNetworkInformation WNetGetNetworkInformationW\n#else\n#define WNetGetNetworkInformation WNetGetNetworkInformationA\n#endif\n\n  DWORD WINAPI WNetGetNetworkInformationA(LPCSTR lpProvider,LPNETINFOSTRUCT lpNetInfoStruct);\n  DWORD WINAPI WNetGetNetworkInformationW(LPCWSTR lpProvider,LPNETINFOSTRUCT lpNetInfoStruct);\n\n  typedef UINT (WINAPI *PFNGETPROFILEPATHA) (LPCSTR pszUsername,LPSTR pszBuffer,UINT cbBuffer);\n  typedef UINT (WINAPI *PFNGETPROFILEPATHW) (LPCWSTR pszUsername,LPWSTR pszBuffer,UINT cbBuffer);\n\n#ifdef UNICODE\n#define PFNGETPROFILEPATH PFNGETPROFILEPATHW\n#else\n#define PFNGETPROFILEPATH PFNGETPROFILEPATHA\n#endif\n\n  typedef UINT (WINAPI *PFNRECONCILEPROFILEA) (LPCSTR pszCentralFile,LPCSTR pszLocalFile,DWORD dwFlags);\n  typedef UINT (WINAPI *PFNRECONCILEPROFILEW) (LPCWSTR pszCentralFile,LPCWSTR pszLocalFile,DWORD dwFlags);\n\n#ifdef UNICODE\n#define PFNRECONCILEPROFILE PFNRECONCILEPROFILEW\n#else\n#define PFNRECONCILEPROFILE PFNRECONCILEPROFILEA\n#endif\n\n#define RP_LOGON 0x01\n#define RP_INIFILE 0x02\n\n  typedef WINBOOL (WINAPI *PFNPROCESSPOLICIESA) (HWND hwnd,LPCSTR pszPath,LPCSTR pszUsername,LPCSTR pszComputerName,DWORD dwFlags);\n  typedef WINBOOL (WINAPI *PFNPROCESSPOLICIESW) (HWND hwnd,LPCWSTR pszPath,LPCWSTR pszUsername,LPCWSTR pszComputerName,DWORD dwFlags);\n\n#ifdef UNICODE\n#define PFNPROCESSPOLICIES PFNPROCESSPOLICIESW\n#else\n#define PFNPROCESSPOLICIES PFNPROCESSPOLICIESA\n#endif\n\n#define PP_DISPLAYERRORS 0x01\n\n#ifdef UNICODE\n#define WNetGetLastError WNetGetLastErrorW\n#else\n#define WNetGetLastError WNetGetLastErrorA\n#endif\n\n  DWORD WINAPI WNetGetLastErrorA(LPDWORD lpError,LPSTR lpErrorBuf,DWORD nErrorBufSize,LPSTR lpNameBuf,DWORD nNameBufSize);\n  DWORD WINAPI WNetGetLastErrorW(LPDWORD lpError,LPWSTR lpErrorBuf,DWORD nErrorBufSize,LPWSTR lpNameBuf,DWORD nNameBufSize);\n\n#define WN_SUCCESS NO_ERROR\n#define WN_NO_ERROR NO_ERROR\n#define WN_NOT_SUPPORTED ERROR_NOT_SUPPORTED\n#define WN_CANCEL ERROR_CANCELLED\n#define WN_RETRY ERROR_RETRY\n#define WN_NET_ERROR ERROR_UNEXP_NET_ERR\n#define WN_MORE_DATA ERROR_MORE_DATA\n#define WN_BAD_POINTER ERROR_INVALID_ADDRESS\n#define WN_BAD_VALUE ERROR_INVALID_PARAMETER\n#define WN_BAD_USER ERROR_BAD_USERNAME\n#define WN_BAD_PASSWORD ERROR_INVALID_PASSWORD\n#define WN_ACCESS_DENIED ERROR_ACCESS_DENIED\n#define WN_FUNCTION_BUSY ERROR_BUSY\n#define WN_WINDOWS_ERROR ERROR_UNEXP_NET_ERR\n#define WN_OUT_OF_MEMORY ERROR_NOT_ENOUGH_MEMORY\n#define WN_NO_NETWORK ERROR_NO_NETWORK\n#define WN_EXTENDED_ERROR ERROR_EXTENDED_ERROR\n#define WN_BAD_LEVEL ERROR_INVALID_LEVEL\n#define WN_BAD_HANDLE ERROR_INVALID_HANDLE\n#define WN_NOT_INITIALIZING ERROR_ALREADY_INITIALIZED\n#define WN_NO_MORE_DEVICES ERROR_NO_MORE_DEVICES\n#define WN_NOT_CONNECTED ERROR_NOT_CONNECTED\n#define WN_OPEN_FILES ERROR_OPEN_FILES\n#define WN_DEVICE_IN_USE ERROR_DEVICE_IN_USE\n#define WN_BAD_NETNAME ERROR_BAD_NET_NAME\n#define WN_BAD_LOCALNAME ERROR_BAD_DEVICE\n#define WN_ALREADY_CONNECTED ERROR_ALREADY_ASSIGNED\n#define WN_DEVICE_ERROR ERROR_GEN_FAILURE\n#define WN_CONNECTION_CLOSED ERROR_CONNECTION_UNAVAIL\n#define WN_NO_NET_OR_BAD_PATH ERROR_NO_NET_OR_BAD_PATH\n#define WN_BAD_PROVIDER ERROR_BAD_PROVIDER\n#define WN_CANNOT_OPEN_PROFILE ERROR_CANNOT_OPEN_PROFILE\n#define WN_BAD_PROFILE ERROR_BAD_PROFILE\n#define WN_BAD_DEV_TYPE ERROR_BAD_DEV_TYPE\n#define WN_DEVICE_ALREADY_REMEMBERED ERROR_DEVICE_ALREADY_REMEMBERED\n#define WN_CONNECTED_OTHER_PASSWORD ERROR_CONNECTED_OTHER_PASSWORD\n#define WN_CONNECTED_OTHER_PASSWORD_DEFAULT ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT\n#define WN_NO_MORE_ENTRIES ERROR_NO_MORE_ITEMS\n#define WN_NOT_CONTAINER ERROR_NOT_CONTAINER\n#define WN_NOT_AUTHENTICATED ERROR_NOT_AUTHENTICATED\n#define WN_NOT_LOGGED_ON ERROR_NOT_LOGGED_ON\n#define WN_NOT_VALIDATED ERROR_NO_LOGON_SERVERS\n\n  typedef struct _NETCONNECTINFOSTRUCT {\n    DWORD cbStructure;\n    DWORD dwFlags;\n    DWORD dwSpeed;\n    DWORD dwDelay;\n    DWORD dwOptDataSize;\n  } NETCONNECTINFOSTRUCT,*LPNETCONNECTINFOSTRUCT;\n\n#define WNCON_FORNETCARD 0x00000001\n#define WNCON_NOTROUTED 0x00000002\n#define WNCON_SLOWLINK 0x00000004\n#define WNCON_DYNAMIC 0x00000008\n\n#ifdef UNICODE\n#define MultinetGetConnectionPerformance MultinetGetConnectionPerformanceW\n#else\n#define MultinetGetConnectionPerformance MultinetGetConnectionPerformanceA\n#endif\n\n  DWORD WINAPI MultinetGetConnectionPerformanceA(LPNETRESOURCEA lpNetResource,LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct);\n  DWORD WINAPI MultinetGetConnectionPerformanceW(LPNETRESOURCEW lpNetResource,LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winnls.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINNLS_\n#define _WINNLS_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef NONLS\n\n#define MAX_LEADBYTES 12\n#define MAX_DEFAULTCHAR 2\n\n#define MB_PRECOMPOSED 0x00000001\n#define MB_COMPOSITE 0x00000002\n#define MB_USEGLYPHCHARS 0x00000004\n#define MB_ERR_INVALID_CHARS 0x00000008\n\n#define WC_COMPOSITECHECK 0x00000200\n#define WC_DISCARDNS 0x00000010\n#define WC_SEPCHARS 0x00000020\n#define WC_DEFAULTCHAR 0x00000040\n#define WC_NO_BEST_FIT_CHARS 0x00000400\n\n#define CT_CTYPE1 0x00000001\n#define CT_CTYPE2 0x00000002\n#define CT_CTYPE3 0x00000004\n\n#define C1_UPPER 0x0001\n#define C1_LOWER 0x0002\n#define C1_DIGIT 0x0004\n#define C1_SPACE 0x0008\n#define C1_PUNCT 0x0010\n#define C1_CNTRL 0x0020\n#define C1_BLANK 0x0040\n#define C1_XDIGIT 0x0080\n#define C1_ALPHA 0x0100\n#define C1_DEFINED 0x0200\n\n#define C2_LEFTTORIGHT 0x0001\n#define C2_RIGHTTOLEFT 0x0002\n\n#define C2_EUROPENUMBER 0x0003\n#define C2_EUROPESEPARATOR 0x0004\n#define C2_EUROPETERMINATOR 0x0005\n#define C2_ARABICNUMBER 0x0006\n#define C2_COMMONSEPARATOR 0x0007\n\n#define C2_BLOCKSEPARATOR 0x0008\n#define C2_SEGMENTSEPARATOR 0x0009\n#define C2_WHITESPACE 0x000A\n#define C2_OTHERNEUTRAL 0x000B\n\n#define C2_NOTAPPLICABLE 0x0000\n\n#define C3_NONSPACING 0x0001\n#define C3_DIACRITIC 0x0002\n#define C3_VOWELMARK 0x0004\n#define C3_SYMBOL 0x0008\n\n#define C3_KATAKANA 0x0010\n#define C3_HIRAGANA 0x0020\n#define C3_HALFWIDTH 0x0040\n#define C3_FULLWIDTH 0x0080\n#define C3_IDEOGRAPH 0x0100\n#define C3_KASHIDA 0x0200\n#define C3_LEXICAL 0x0400\n\n#define C3_ALPHA 0x8000\n\n#define C3_NOTAPPLICABLE 0x0000\n\n#define NORM_IGNORECASE 0x00000001\n#define NORM_IGNORENONSPACE 0x00000002\n#define NORM_IGNORESYMBOLS 0x00000004\n\n#define NORM_IGNOREKANATYPE 0x00010000\n#define NORM_IGNOREWIDTH 0x00020000\n\n#define MAP_FOLDCZONE 0x00000010\n#define MAP_PRECOMPOSED 0x00000020\n#define MAP_COMPOSITE 0x00000040\n#define MAP_FOLDDIGITS 0x00000080\n#define MAP_EXPAND_LIGATURES 0x00002000\n\n#define LCMAP_LOWERCASE 0x00000100\n#define LCMAP_UPPERCASE 0x00000200\n#define LCMAP_SORTKEY 0x00000400\n#define LCMAP_BYTEREV 0x00000800\n\n#define LCMAP_HIRAGANA 0x00100000\n#define LCMAP_KATAKANA 0x00200000\n#define LCMAP_HALFWIDTH 0x00400000\n#define LCMAP_FULLWIDTH 0x00800000\n\n#define LCMAP_LINGUISTIC_CASING 0x01000000\n\n#define LCMAP_SIMPLIFIED_CHINESE 0x02000000\n#define LCMAP_TRADITIONAL_CHINESE 0x04000000\n\n#define LGRPID_INSTALLED 0x00000001\n#define LGRPID_SUPPORTED 0x00000002\n\n#define LCID_INSTALLED 0x00000001\n#define LCID_SUPPORTED 0x00000002\n#define LCID_ALTERNATE_SORTS 0x00000004\n\n#define CP_INSTALLED 0x00000001\n#define CP_SUPPORTED 0x00000002\n\n#define SORT_STRINGSORT 0x00001000\n\n#define CSTR_LESS_THAN 1\n#define CSTR_EQUAL 2\n#define CSTR_GREATER_THAN 3\n\n#define CP_ACP 0\n#define CP_OEMCP 1\n#define CP_MACCP 2\n#define CP_THREAD_ACP 3\n#define CP_SYMBOL 42\n\n#define CP_UTF7 65000\n#define CP_UTF8 65001\n\n#define CTRY_DEFAULT 0\n\n#define CTRY_ALBANIA 355\n#define CTRY_ALGERIA 213\n#define CTRY_ARGENTINA 54\n#define CTRY_ARMENIA 374\n#define CTRY_AUSTRALIA 61\n#define CTRY_AUSTRIA 43\n#define CTRY_AZERBAIJAN 994\n#define CTRY_BAHRAIN 973\n#define CTRY_BELARUS 375\n#define CTRY_BELGIUM 32\n#define CTRY_BELIZE 501\n#define CTRY_BOLIVIA 591\n#define CTRY_BRAZIL 55\n#define CTRY_BRUNEI_DARUSSALAM 673\n#define CTRY_BULGARIA 359\n#define CTRY_CANADA 2\n#define CTRY_CARIBBEAN 1\n#define CTRY_CHILE 56\n#define CTRY_COLOMBIA 57\n#define CTRY_COSTA_RICA 506\n#define CTRY_CROATIA 385\n#define CTRY_CZECH 420\n#define CTRY_DENMARK 45\n#define CTRY_DOMINICAN_REPUBLIC 1\n#define CTRY_ECUADOR 593\n#define CTRY_EGYPT 20\n#define CTRY_EL_SALVADOR 503\n#define CTRY_ESTONIA 372\n#define CTRY_FAEROE_ISLANDS 298\n#define CTRY_FINLAND 358\n#define CTRY_FRANCE 33\n#define CTRY_GEORGIA 995\n#define CTRY_GERMANY 49\n#define CTRY_GREECE 30\n#define CTRY_GUATEMALA 502\n#define CTRY_HONDURAS 504\n#define CTRY_HONG_KONG 852\n#define CTRY_HUNGARY 36\n#define CTRY_ICELAND 354\n#define CTRY_INDIA 91\n#define CTRY_INDONESIA 62\n#define CTRY_IRAN 981\n#define CTRY_IRAQ 964\n#define CTRY_IRELAND 353\n#define CTRY_ISRAEL 972\n#define CTRY_ITALY 39\n#define CTRY_JAMAICA 1\n#define CTRY_JAPAN 81\n#define CTRY_JORDAN 962\n#define CTRY_KAZAKSTAN 7\n#define CTRY_KENYA 254\n#define CTRY_KUWAIT 965\n#define CTRY_KYRGYZSTAN 996\n#define CTRY_LATVIA 371\n#define CTRY_LEBANON 961\n#define CTRY_LIBYA 218\n#define CTRY_LIECHTENSTEIN 41\n#define CTRY_LITHUANIA 370\n#define CTRY_LUXEMBOURG 352\n#define CTRY_MACAU 853\n#define CTRY_MACEDONIA 389\n#define CTRY_MALAYSIA 60\n#define CTRY_MALDIVES 960\n#define CTRY_MEXICO 52\n#define CTRY_MONACO 33\n#define CTRY_MONGOLIA 976\n#define CTRY_MOROCCO 212\n#define CTRY_NETHERLANDS 31\n#define CTRY_NEW_ZEALAND 64\n#define CTRY_NICARAGUA 505\n#define CTRY_NORWAY 47\n#define CTRY_OMAN 968\n#define CTRY_PAKISTAN 92\n#define CTRY_PANAMA 507\n#define CTRY_PARAGUAY 595\n#define CTRY_PERU 51\n#define CTRY_PHILIPPINES 63\n#define CTRY_POLAND 48\n#define CTRY_PORTUGAL 351\n#define CTRY_PRCHINA 86\n#define CTRY_PUERTO_RICO 1\n#define CTRY_QATAR 974\n#define CTRY_ROMANIA 40\n#define CTRY_RUSSIA 7\n#define CTRY_SAUDI_ARABIA 966\n#define CTRY_SERBIA 381\n#define CTRY_SINGAPORE 65\n#define CTRY_SLOVAK 421\n#define CTRY_SLOVENIA 386\n#define CTRY_SOUTH_AFRICA 27\n#define CTRY_SOUTH_KOREA 82\n#define CTRY_SPAIN 34\n#define CTRY_SWEDEN 46\n#define CTRY_SWITZERLAND 41\n#define CTRY_SYRIA 963\n#define CTRY_TAIWAN 886\n#define CTRY_TATARSTAN 7\n#define CTRY_THAILAND 66\n#define CTRY_TRINIDAD_Y_TOBAGO 1\n#define CTRY_TUNISIA 216\n#define CTRY_TURKEY 90\n#define CTRY_UAE 971\n#define CTRY_UKRAINE 380\n#define CTRY_UNITED_KINGDOM 44\n#define CTRY_UNITED_STATES 1\n#define CTRY_URUGUAY 598\n#define CTRY_UZBEKISTAN 7\n#define CTRY_VENEZUELA 58\n#define CTRY_VIET_NAM 84\n#define CTRY_YEMEN 967\n#define CTRY_ZIMBABWE 263\n\n#define LOCALE_NOUSEROVERRIDE 0x80000000\n#define LOCALE_USE_CP_ACP 0x40000000\n#define LOCALE_RETURN_NUMBER 0x20000000\n\n#define LOCALE_ILANGUAGE 0x00000001\n#define LOCALE_SLANGUAGE 0x00000002\n#define LOCALE_SENGLANGUAGE 0x00001001\n#define LOCALE_SABBREVLANGNAME 0x00000003\n#define LOCALE_SNATIVELANGNAME 0x00000004\n\n#define LOCALE_ICOUNTRY 0x00000005\n#define LOCALE_SCOUNTRY 0x00000006\n#define LOCALE_SENGCOUNTRY 0x00001002\n#define LOCALE_SABBREVCTRYNAME 0x00000007\n#define LOCALE_SNATIVECTRYNAME 0x00000008\n\n#define LOCALE_IDEFAULTLANGUAGE 0x00000009\n#define LOCALE_IDEFAULTCOUNTRY 0x0000000A\n#define LOCALE_IDEFAULTCODEPAGE 0x0000000B\n#define LOCALE_IDEFAULTANSICODEPAGE 0x00001004\n#define LOCALE_IDEFAULTMACCODEPAGE 0x00001011\n\n#define LOCALE_SLIST 0x0000000C\n#define LOCALE_IMEASURE 0x0000000D\n\n#define LOCALE_SDECIMAL 0x0000000E\n#define LOCALE_STHOUSAND 0x0000000F\n#define LOCALE_SGROUPING 0x00000010\n#define LOCALE_IDIGITS 0x00000011\n#define LOCALE_ILZERO 0x00000012\n#define LOCALE_INEGNUMBER 0x00001010\n#define LOCALE_SNATIVEDIGITS 0x00000013\n\n#define LOCALE_SCURRENCY 0x00000014\n#define LOCALE_SINTLSYMBOL 0x00000015\n#define LOCALE_SMONDECIMALSEP 0x00000016\n#define LOCALE_SMONTHOUSANDSEP 0x00000017\n#define LOCALE_SMONGROUPING 0x00000018\n#define LOCALE_ICURRDIGITS 0x00000019\n#define LOCALE_IINTLCURRDIGITS 0x0000001A\n#define LOCALE_ICURRENCY 0x0000001B\n#define LOCALE_INEGCURR 0x0000001C\n\n#define LOCALE_SDATE 0x0000001D\n#define LOCALE_STIME 0x0000001E\n#define LOCALE_SSHORTDATE 0x0000001F\n#define LOCALE_SLONGDATE 0x00000020\n#define LOCALE_STIMEFORMAT 0x00001003\n#define LOCALE_IDATE 0x00000021\n#define LOCALE_ILDATE 0x00000022\n#define LOCALE_ITIME 0x00000023\n#define LOCALE_ITIMEMARKPOSN 0x00001005\n#define LOCALE_ICENTURY 0x00000024\n#define LOCALE_ITLZERO 0x00000025\n#define LOCALE_IDAYLZERO 0x00000026\n#define LOCALE_IMONLZERO 0x00000027\n#define LOCALE_S1159 0x00000028\n#define LOCALE_S2359 0x00000029\n\n#define LOCALE_ICALENDARTYPE 0x00001009\n#define LOCALE_IOPTIONALCALENDAR 0x0000100B\n#define LOCALE_IFIRSTDAYOFWEEK 0x0000100C\n#define LOCALE_IFIRSTWEEKOFYEAR 0x0000100D\n\n#define LOCALE_SDAYNAME1 0x0000002A\n#define LOCALE_SDAYNAME2 0x0000002B\n#define LOCALE_SDAYNAME3 0x0000002C\n#define LOCALE_SDAYNAME4 0x0000002D\n#define LOCALE_SDAYNAME5 0x0000002E\n#define LOCALE_SDAYNAME6 0x0000002F\n#define LOCALE_SDAYNAME7 0x00000030\n#define LOCALE_SABBREVDAYNAME1 0x00000031\n#define LOCALE_SABBREVDAYNAME2 0x00000032\n#define LOCALE_SABBREVDAYNAME3 0x00000033\n#define LOCALE_SABBREVDAYNAME4 0x00000034\n#define LOCALE_SABBREVDAYNAME5 0x00000035\n#define LOCALE_SABBREVDAYNAME6 0x00000036\n#define LOCALE_SABBREVDAYNAME7 0x00000037\n#define LOCALE_SMONTHNAME1 0x00000038\n#define LOCALE_SMONTHNAME2 0x00000039\n#define LOCALE_SMONTHNAME3 0x0000003A\n#define LOCALE_SMONTHNAME4 0x0000003B\n#define LOCALE_SMONTHNAME5 0x0000003C\n#define LOCALE_SMONTHNAME6 0x0000003D\n#define LOCALE_SMONTHNAME7 0x0000003E\n#define LOCALE_SMONTHNAME8 0x0000003F\n#define LOCALE_SMONTHNAME9 0x00000040\n#define LOCALE_SMONTHNAME10 0x00000041\n#define LOCALE_SMONTHNAME11 0x00000042\n#define LOCALE_SMONTHNAME12 0x00000043\n#define LOCALE_SMONTHNAME13 0x0000100E\n#define LOCALE_SABBREVMONTHNAME1 0x00000044\n#define LOCALE_SABBREVMONTHNAME2 0x00000045\n#define LOCALE_SABBREVMONTHNAME3 0x00000046\n#define LOCALE_SABBREVMONTHNAME4 0x00000047\n#define LOCALE_SABBREVMONTHNAME5 0x00000048\n#define LOCALE_SABBREVMONTHNAME6 0x00000049\n#define LOCALE_SABBREVMONTHNAME7 0x0000004A\n#define LOCALE_SABBREVMONTHNAME8 0x0000004B\n#define LOCALE_SABBREVMONTHNAME9 0x0000004C\n#define LOCALE_SABBREVMONTHNAME10 0x0000004D\n#define LOCALE_SABBREVMONTHNAME11 0x0000004E\n#define LOCALE_SABBREVMONTHNAME12 0x0000004F\n#define LOCALE_SABBREVMONTHNAME13 0x0000100F\n\n#define LOCALE_SPOSITIVESIGN 0x00000050\n#define LOCALE_SNEGATIVESIGN 0x00000051\n#define LOCALE_IPOSSIGNPOSN 0x00000052\n#define LOCALE_INEGSIGNPOSN 0x00000053\n#define LOCALE_IPOSSYMPRECEDES 0x00000054\n#define LOCALE_IPOSSEPBYSPACE 0x00000055\n#define LOCALE_INEGSYMPRECEDES 0x00000056\n#define LOCALE_INEGSEPBYSPACE 0x00000057\n#define LOCALE_FONTSIGNATURE 0x00000058\n#define LOCALE_SISO639LANGNAME 0x00000059\n#define LOCALE_SISO3166CTRYNAME 0x0000005A\n\n#define LOCALE_IDEFAULTEBCDICCODEPAGE 0x00001012\n#define LOCALE_IPAPERSIZE 0x0000100A\n#define LOCALE_SENGCURRNAME 0x00001007\n#define LOCALE_SNATIVECURRNAME 0x00001008\n#define LOCALE_SYEARMONTH 0x00001006\n#define LOCALE_SSORTNAME 0x00001013\n#define LOCALE_IDIGITSUBSTITUTION 0x00001014\n\n#define TIME_NOMINUTESORSECONDS 0x00000001\n#define TIME_NOSECONDS 0x00000002\n#define TIME_NOTIMEMARKER 0x00000004\n#define TIME_FORCE24HOURFORMAT 0x00000008\n\n#define DATE_SHORTDATE 0x00000001\n#define DATE_LONGDATE 0x00000002\n#define DATE_USE_ALT_CALENDAR 0x00000004\n#define DATE_YEARMONTH 0x00000008\n#define DATE_LTRREADING 0x00000010\n#define DATE_RTLREADING 0x00000020\n\n#define CAL_NOUSEROVERRIDE LOCALE_NOUSEROVERRIDE\n#define CAL_USE_CP_ACP LOCALE_USE_CP_ACP\n#define CAL_RETURN_NUMBER LOCALE_RETURN_NUMBER\n\n#define CAL_ICALINTVALUE 0x00000001\n#define CAL_SCALNAME 0x00000002\n#define CAL_IYEAROFFSETRANGE 0x00000003\n#define CAL_SERASTRING 0x00000004\n#define CAL_SSHORTDATE 0x00000005\n#define CAL_SLONGDATE 0x00000006\n#define CAL_SDAYNAME1 0x00000007\n#define CAL_SDAYNAME2 0x00000008\n#define CAL_SDAYNAME3 0x00000009\n#define CAL_SDAYNAME4 0x0000000a\n#define CAL_SDAYNAME5 0x0000000b\n#define CAL_SDAYNAME6 0x0000000c\n#define CAL_SDAYNAME7 0x0000000d\n#define CAL_SABBREVDAYNAME1 0x0000000e\n#define CAL_SABBREVDAYNAME2 0x0000000f\n#define CAL_SABBREVDAYNAME3 0x00000010\n#define CAL_SABBREVDAYNAME4 0x00000011\n#define CAL_SABBREVDAYNAME5 0x00000012\n#define CAL_SABBREVDAYNAME6 0x00000013\n#define CAL_SABBREVDAYNAME7 0x00000014\n#define CAL_SMONTHNAME1 0x00000015\n#define CAL_SMONTHNAME2 0x00000016\n#define CAL_SMONTHNAME3 0x00000017\n#define CAL_SMONTHNAME4 0x00000018\n#define CAL_SMONTHNAME5 0x00000019\n#define CAL_SMONTHNAME6 0x0000001a\n#define CAL_SMONTHNAME7 0x0000001b\n#define CAL_SMONTHNAME8 0x0000001c\n#define CAL_SMONTHNAME9 0x0000001d\n#define CAL_SMONTHNAME10 0x0000001e\n#define CAL_SMONTHNAME11 0x0000001f\n#define CAL_SMONTHNAME12 0x00000020\n#define CAL_SMONTHNAME13 0x00000021\n#define CAL_SABBREVMONTHNAME1 0x00000022\n#define CAL_SABBREVMONTHNAME2 0x00000023\n#define CAL_SABBREVMONTHNAME3 0x00000024\n#define CAL_SABBREVMONTHNAME4 0x00000025\n#define CAL_SABBREVMONTHNAME5 0x00000026\n#define CAL_SABBREVMONTHNAME6 0x00000027\n#define CAL_SABBREVMONTHNAME7 0x00000028\n#define CAL_SABBREVMONTHNAME8 0x00000029\n#define CAL_SABBREVMONTHNAME9 0x0000002a\n#define CAL_SABBREVMONTHNAME10 0x0000002b\n#define CAL_SABBREVMONTHNAME11 0x0000002c\n#define CAL_SABBREVMONTHNAME12 0x0000002d\n#define CAL_SABBREVMONTHNAME13 0x0000002e\n#define CAL_SYEARMONTH 0x0000002f\n#define CAL_ITWODIGITYEARMAX 0x00000030\n\n#define ENUM_ALL_CALENDARS 0xffffffff\n\n#define CAL_GREGORIAN 1\n#define CAL_GREGORIAN_US 2\n#define CAL_JAPAN 3\n#define CAL_TAIWAN 4\n#define CAL_KOREA 5\n#define CAL_HIJRI 6\n#define CAL_THAI 7\n#define CAL_HEBREW 8\n#define CAL_GREGORIAN_ME_FRENCH 9\n#define CAL_GREGORIAN_ARABIC 10\n#define CAL_GREGORIAN_XLIT_ENGLISH 11\n#define CAL_GREGORIAN_XLIT_FRENCH 12\n\n#define LGRPID_WESTERN_EUROPE 0x0001\n#define LGRPID_CENTRAL_EUROPE 0x0002\n#define LGRPID_BALTIC 0x0003\n#define LGRPID_GREEK 0x0004\n#define LGRPID_CYRILLIC 0x0005\n#define LGRPID_TURKISH 0x0006\n#define LGRPID_JAPANESE 0x0007\n#define LGRPID_KOREAN 0x0008\n#define LGRPID_TRADITIONAL_CHINESE 0x0009\n#define LGRPID_SIMPLIFIED_CHINESE 0x000a\n#define LGRPID_THAI 0x000b\n#define LGRPID_HEBREW 0x000c\n#define LGRPID_ARABIC 0x000d\n#define LGRPID_VIETNAMESE 0x000e\n#define LGRPID_INDIC 0x000f\n#define LGRPID_GEORGIAN 0x0010\n#define LGRPID_ARMENIAN 0x0011\n\n  typedef DWORD LGRPID;\n  typedef DWORD LCTYPE;\n  typedef DWORD CALTYPE;\n  typedef DWORD CALID;\n\n  typedef struct _cpinfo {\n    UINT MaxCharSize;\n    BYTE DefaultChar[MAX_DEFAULTCHAR];\n    BYTE LeadByte[MAX_LEADBYTES];\n  } CPINFO,*LPCPINFO;\n\n  typedef struct _cpinfoexA {\n    UINT MaxCharSize;\n    BYTE DefaultChar[MAX_DEFAULTCHAR];\n    BYTE LeadByte[MAX_LEADBYTES];\n    WCHAR UnicodeDefaultChar;\n    UINT CodePage;\n    CHAR CodePageName[MAX_PATH];\n  } CPINFOEXA,*LPCPINFOEXA;\n\n  typedef struct _cpinfoexW {\n    UINT MaxCharSize;\n    BYTE DefaultChar[MAX_DEFAULTCHAR];\n    BYTE LeadByte[MAX_LEADBYTES];\n    WCHAR UnicodeDefaultChar;\n    UINT CodePage;\n    WCHAR CodePageName[MAX_PATH];\n  } CPINFOEXW,*LPCPINFOEXW;\n\n#ifdef UNICODE\n  typedef CPINFOEXW CPINFOEX;\n  typedef LPCPINFOEXW LPCPINFOEX;\n#else\n  typedef CPINFOEXA CPINFOEX;\n  typedef LPCPINFOEXA LPCPINFOEX;\n#endif\n\n  typedef struct _numberfmtA {\n    UINT NumDigits;\n    UINT LeadingZero;\n    UINT Grouping;\n    LPSTR lpDecimalSep;\n    LPSTR lpThousandSep;\n    UINT NegativeOrder;\n  } NUMBERFMTA,*LPNUMBERFMTA;\n\n  typedef struct _numberfmtW {\n    UINT NumDigits;\n    UINT LeadingZero;\n    UINT Grouping;\n    LPWSTR lpDecimalSep;\n    LPWSTR lpThousandSep;\n    UINT NegativeOrder;\n  } NUMBERFMTW,*LPNUMBERFMTW;\n\n#ifdef UNICODE\n  typedef NUMBERFMTW NUMBERFMT;\n  typedef LPNUMBERFMTW LPNUMBERFMT;\n#else\n  typedef NUMBERFMTA NUMBERFMT;\n  typedef LPNUMBERFMTA LPNUMBERFMT;\n#endif\n\n  typedef struct _currencyfmtA {\n    UINT NumDigits;\n    UINT LeadingZero;\n    UINT Grouping;\n    LPSTR lpDecimalSep;\n    LPSTR lpThousandSep;\n    UINT NegativeOrder;\n    UINT PositiveOrder;\n    LPSTR lpCurrencySymbol;\n  } CURRENCYFMTA,*LPCURRENCYFMTA;\n\n  typedef struct _currencyfmtW {\n    UINT NumDigits;\n    UINT LeadingZero;\n    UINT Grouping;\n    LPWSTR lpDecimalSep;\n    LPWSTR lpThousandSep;\n    UINT NegativeOrder;\n    UINT PositiveOrder;\n    LPWSTR lpCurrencySymbol;\n  } CURRENCYFMTW,*LPCURRENCYFMTW;\n\n#ifdef UNICODE\n  typedef CURRENCYFMTW CURRENCYFMT;\n  typedef LPCURRENCYFMTW LPCURRENCYFMT;\n#else\n  typedef CURRENCYFMTA CURRENCYFMT;\n  typedef LPCURRENCYFMTA LPCURRENCYFMT;\n#endif\n\n  enum SYSNLS_FUNCTION {\n    COMPARE_STRING = 0x0001\n  };\n\n  typedef DWORD NLS_FUNCTION;\n\n  typedef struct _nlsversioninfo{\n    DWORD dwNLSVersionInfoSize;\n    DWORD dwNLSVersion;\n    DWORD dwDefinedVersion;\n  } NLSVERSIONINFO,*LPNLSVERSIONINFO;\n\n  typedef LONG GEOID;\n  typedef DWORD GEOTYPE;\n  typedef DWORD GEOCLASS;\n\n#define GEOID_NOT_AVAILABLE -1\n\n  enum SYSGEOTYPE {\n    GEO_NATION = 0x0001,GEO_LATITUDE = 0x0002,GEO_LONGITUDE = 0x0003,GEO_ISO2 = 0x0004,GEO_ISO3 = 0x0005,GEO_RFC1766 = 0x0006,GEO_LCID = 0x0007,\n    GEO_FRIENDLYNAME= 0x0008,GEO_OFFICIALNAME= 0x0009,GEO_TIMEZONES = 0x000A,GEO_OFFICIALLANGUAGES = 0x000B\n  };\n\n  enum SYSGEOCLASS {\n    GEOCLASS_NATION = 16,GEOCLASS_REGION = 14\n  };\n\n  typedef WINBOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCA)(LGRPID,LPSTR,LPSTR,DWORD,LONG_PTR);\n  typedef WINBOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCA)(LGRPID,LCID,LPSTR,LONG_PTR);\n  typedef WINBOOL (CALLBACK *UILANGUAGE_ENUMPROCA)(LPSTR,LONG_PTR);\n  typedef WINBOOL (CALLBACK *LOCALE_ENUMPROCA)(LPSTR);\n  typedef WINBOOL (CALLBACK *CODEPAGE_ENUMPROCA)(LPSTR);\n  typedef WINBOOL (CALLBACK *DATEFMT_ENUMPROCA)(LPSTR);\n  typedef WINBOOL (CALLBACK *DATEFMT_ENUMPROCEXA)(LPSTR,CALID);\n  typedef WINBOOL (CALLBACK *TIMEFMT_ENUMPROCA)(LPSTR);\n  typedef WINBOOL (CALLBACK *CALINFO_ENUMPROCA)(LPSTR);\n  typedef WINBOOL (CALLBACK *CALINFO_ENUMPROCEXA)(LPSTR,CALID);\n  typedef WINBOOL (CALLBACK *LANGUAGEGROUP_ENUMPROCW)(LGRPID,LPWSTR,LPWSTR,DWORD,LONG_PTR);\n  typedef WINBOOL (CALLBACK *LANGGROUPLOCALE_ENUMPROCW)(LGRPID,LCID,LPWSTR,LONG_PTR);\n  typedef WINBOOL (CALLBACK *UILANGUAGE_ENUMPROCW)(LPWSTR,LONG_PTR);\n  typedef WINBOOL (CALLBACK *LOCALE_ENUMPROCW)(LPWSTR);\n  typedef WINBOOL (CALLBACK *CODEPAGE_ENUMPROCW)(LPWSTR);\n  typedef WINBOOL (CALLBACK *DATEFMT_ENUMPROCW)(LPWSTR);\n  typedef WINBOOL (CALLBACK *DATEFMT_ENUMPROCEXW)(LPWSTR,CALID);\n  typedef WINBOOL (CALLBACK *TIMEFMT_ENUMPROCW)(LPWSTR);\n  typedef WINBOOL (CALLBACK *CALINFO_ENUMPROCW)(LPWSTR);\n  typedef WINBOOL (CALLBACK *CALINFO_ENUMPROCEXW)(LPWSTR,CALID);\n  typedef WINBOOL (CALLBACK *GEO_ENUMPROC)(GEOID);\n\n#ifdef UNICODE\n#define LANGUAGEGROUP_ENUMPROC LANGUAGEGROUP_ENUMPROCW\n#define LANGGROUPLOCALE_ENUMPROC LANGGROUPLOCALE_ENUMPROCW\n#define UILANGUAGE_ENUMPROC UILANGUAGE_ENUMPROCW\n#define LOCALE_ENUMPROC LOCALE_ENUMPROCW\n#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCW\n#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCW\n#define DATEFMT_ENUMPROCEX DATEFMT_ENUMPROCEXW\n#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCW\n#define CALINFO_ENUMPROC CALINFO_ENUMPROCW\n#define CALINFO_ENUMPROCEX CALINFO_ENUMPROCEXW\n#else\n#define LANGUAGEGROUP_ENUMPROC LANGUAGEGROUP_ENUMPROCA\n#define LANGGROUPLOCALE_ENUMPROC LANGGROUPLOCALE_ENUMPROCA\n#define UILANGUAGE_ENUMPROC UILANGUAGE_ENUMPROCA\n#define LOCALE_ENUMPROC LOCALE_ENUMPROCA\n#define CODEPAGE_ENUMPROC CODEPAGE_ENUMPROCA\n#define DATEFMT_ENUMPROC DATEFMT_ENUMPROCA\n#define DATEFMT_ENUMPROCEX DATEFMT_ENUMPROCEXA\n#define TIMEFMT_ENUMPROC TIMEFMT_ENUMPROCA\n#define CALINFO_ENUMPROC CALINFO_ENUMPROCA\n#define CALINFO_ENUMPROCEX CALINFO_ENUMPROCEXA\n#endif\n\n#ifdef UNICODE\n#define GetCPInfoEx GetCPInfoExW\n#define CompareString CompareStringW\n#define LCMapString LCMapStringW\n#define GetLocaleInfo GetLocaleInfoW\n#define SetLocaleInfo SetLocaleInfoW\n#define GetCalendarInfo GetCalendarInfoW\n#define SetCalendarInfo SetCalendarInfoW\n#define GetTimeFormat GetTimeFormatW\n#define GetDateFormat GetDateFormatW\n#define GetNumberFormat GetNumberFormatW\n#define GetCurrencyFormat GetCurrencyFormatW\n#define EnumCalendarInfo EnumCalendarInfoW\n#define EnumCalendarInfoEx EnumCalendarInfoExW\n#define EnumTimeFormats EnumTimeFormatsW\n#define EnumDateFormats EnumDateFormatsW\n#define EnumDateFormatsEx EnumDateFormatsExW\n#define GetGeoInfo GetGeoInfoW\n#define GetStringTypeEx GetStringTypeExW\n#define FoldString FoldStringW\n#define EnumSystemLanguageGroups EnumSystemLanguageGroupsW\n#define EnumLanguageGroupLocales EnumLanguageGroupLocalesW\n#define EnumUILanguages EnumUILanguagesW\n#define EnumSystemLocales EnumSystemLocalesW\n#define EnumSystemCodePages EnumSystemCodePagesW\n#else\n#define GetCPInfoEx GetCPInfoExA\n#define CompareString CompareStringA\n#define LCMapString LCMapStringA\n#define GetLocaleInfo GetLocaleInfoA\n#define SetLocaleInfo SetLocaleInfoA\n#define GetCalendarInfo GetCalendarInfoA\n#define SetCalendarInfo SetCalendarInfoA\n#define GetTimeFormat GetTimeFormatA\n#define GetDateFormat GetDateFormatA\n#define GetNumberFormat GetNumberFormatA\n#define GetCurrencyFormat GetCurrencyFormatA\n#define EnumCalendarInfo EnumCalendarInfoA\n#define EnumCalendarInfoEx EnumCalendarInfoExA\n#define EnumTimeFormats EnumTimeFormatsA\n#define EnumDateFormats EnumDateFormatsA\n#define EnumDateFormatsEx EnumDateFormatsExA\n#define GetGeoInfo GetGeoInfoA\n#define GetStringTypeEx GetStringTypeExA\n#define FoldString FoldStringA\n#define EnumSystemLanguageGroups EnumSystemLanguageGroupsA\n#define EnumLanguageGroupLocales EnumLanguageGroupLocalesA\n#define EnumUILanguages EnumUILanguagesA\n#define EnumSystemLocales EnumSystemLocalesA\n#define EnumSystemCodePages EnumSystemCodePagesA\n#endif\n\n  WINBASEAPI WINBOOL WINAPI IsValidCodePage(UINT CodePage);\n  WINBASEAPI UINT WINAPI GetACP(void);\n  WINBASEAPI UINT WINAPI GetOEMCP(void);\n  WINBASEAPI WINBOOL WINAPI GetCPInfo(UINT CodePage,LPCPINFO lpCPInfo);\n  WINBASEAPI WINBOOL WINAPI GetCPInfoExA(UINT CodePage,DWORD dwFlags,LPCPINFOEXA lpCPInfoEx);\n  WINBASEAPI WINBOOL WINAPI GetCPInfoExW(UINT CodePage,DWORD dwFlags,LPCPINFOEXW lpCPInfoEx);\n  WINBASEAPI WINBOOL WINAPI IsDBCSLeadByte(BYTE TestChar);\n  WINBASEAPI WINBOOL WINAPI IsDBCSLeadByteEx(UINT CodePage,BYTE TestChar);\n  WINBASEAPI int WINAPI MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cbMultiByte,LPWSTR lpWideCharStr,int cchWideChar);\n  WINBASEAPI int WINAPI WideCharToMultiByte(UINT CodePage,DWORD dwFlags,LPCWSTR lpWideCharStr,int cchWideChar,LPSTR lpMultiByteStr,int cbMultiByte,LPCSTR lpDefaultChar,LPBOOL lpUsedDefaultChar);\n  WINBASEAPI int WINAPI CompareStringA(LCID Locale,DWORD dwCmpFlags,LPCSTR lpString1,int cchCount1,LPCSTR lpString2,int cchCount2);\n  WINBASEAPI int WINAPI CompareStringW(LCID Locale,DWORD dwCmpFlags,LPCWSTR lpString1,int cchCount1,LPCWSTR lpString2,int cchCount2);\n  WINBASEAPI int WINAPI LCMapStringA(LCID Locale,DWORD dwMapFlags,LPCSTR lpSrcStr,int cchSrc,LPSTR lpDestStr,int cchDest);\n  WINBASEAPI int WINAPI LCMapStringW(LCID Locale,DWORD dwMapFlags,LPCWSTR lpSrcStr,int cchSrc,LPWSTR lpDestStr,int cchDest);\n  WINBASEAPI int WINAPI GetLocaleInfoA(LCID Locale,LCTYPE LCType,LPSTR lpLCData,int cchData);\n  WINBASEAPI int WINAPI GetLocaleInfoW(LCID Locale,LCTYPE LCType,LPWSTR lpLCData,int cchData);\n  WINBASEAPI WINBOOL WINAPI SetLocaleInfoA(LCID Locale,LCTYPE LCType,LPCSTR lpLCData);\n  WINBASEAPI WINBOOL WINAPI SetLocaleInfoW(LCID Locale,LCTYPE LCType,LPCWSTR lpLCData);\n  WINBASEAPI int WINAPI GetCalendarInfoA(LCID Locale,CALID Calendar,CALTYPE CalType,LPSTR lpCalData,int cchData,LPDWORD lpValue);\n  WINBASEAPI int WINAPI GetCalendarInfoW(LCID Locale,CALID Calendar,CALTYPE CalType,LPWSTR lpCalData,int cchData,LPDWORD lpValue);\n  WINBASEAPI WINBOOL WINAPI SetCalendarInfoA(LCID Locale,CALID Calendar,CALTYPE CalType,LPCSTR lpCalData);\n  WINBASEAPI WINBOOL WINAPI SetCalendarInfoW(LCID Locale,CALID Calendar,CALTYPE CalType,LPCWSTR lpCalData);\n  WINBASEAPI int WINAPI GetTimeFormatA(LCID Locale,DWORD dwFlags,CONST SYSTEMTIME *lpTime,LPCSTR lpFormat,LPSTR lpTimeStr,int cchTime);\n  WINBASEAPI int WINAPI GetTimeFormatW(LCID Locale,DWORD dwFlags,CONST SYSTEMTIME *lpTime,LPCWSTR lpFormat,LPWSTR lpTimeStr,int cchTime);\n  WINBASEAPI int WINAPI GetDateFormatA(LCID Locale,DWORD dwFlags,CONST SYSTEMTIME *lpDate,LPCSTR lpFormat,LPSTR lpDateStr,int cchDate);\n  WINBASEAPI int WINAPI GetDateFormatW(LCID Locale,DWORD dwFlags,CONST SYSTEMTIME *lpDate,LPCWSTR lpFormat,LPWSTR lpDateStr,int cchDate);\n  WINBASEAPI int WINAPI GetNumberFormatA(LCID Locale,DWORD dwFlags,LPCSTR lpValue,CONST NUMBERFMTA *lpFormat,LPSTR lpNumberStr,int cchNumber);\n  WINBASEAPI int WINAPI GetNumberFormatW(LCID Locale,DWORD dwFlags,LPCWSTR lpValue,CONST NUMBERFMTW *lpFormat,LPWSTR lpNumberStr,int cchNumber);\n  WINBASEAPI int WINAPI GetCurrencyFormatA(LCID Locale,DWORD dwFlags,LPCSTR lpValue,CONST CURRENCYFMTA *lpFormat,LPSTR lpCurrencyStr,int cchCurrency);\n  WINBASEAPI int WINAPI GetCurrencyFormatW(LCID Locale,DWORD dwFlags,LPCWSTR lpValue,CONST CURRENCYFMTW *lpFormat,LPWSTR lpCurrencyStr,int cchCurrency);\n  WINBASEAPI WINBOOL WINAPI EnumCalendarInfoA(CALINFO_ENUMPROCA lpCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType);\n  WINBASEAPI WINBOOL WINAPI EnumCalendarInfoW(CALINFO_ENUMPROCW lpCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType);\n  WINBASEAPI WINBOOL WINAPI EnumCalendarInfoExA(CALINFO_ENUMPROCEXA lpCalInfoEnumProcEx,LCID Locale,CALID Calendar,CALTYPE CalType);\n  WINBASEAPI WINBOOL WINAPI EnumCalendarInfoExW(CALINFO_ENUMPROCEXW lpCalInfoEnumProcEx,LCID Locale,CALID Calendar,CALTYPE CalType);\n  WINBASEAPI WINBOOL WINAPI EnumTimeFormatsA(TIMEFMT_ENUMPROCA lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumTimeFormatsW(TIMEFMT_ENUMPROCW lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumDateFormatsA(DATEFMT_ENUMPROCA lpDateFmtEnumProc,LCID Locale,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumDateFormatsW(DATEFMT_ENUMPROCW lpDateFmtEnumProc,LCID Locale,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumDateFormatsExA(DATEFMT_ENUMPROCEXA lpDateFmtEnumProcEx,LCID Locale,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumDateFormatsExW(DATEFMT_ENUMPROCEXW lpDateFmtEnumProcEx,LCID Locale,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI IsValidLanguageGroup(LGRPID LanguageGroup,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI GetNLSVersion(NLS_FUNCTION Function,LCID Locale,LPNLSVERSIONINFO lpVersionInformation);\n  WINBASEAPI WINBOOL WINAPI IsNLSDefinedString(NLS_FUNCTION Function,DWORD dwFlags,LPNLSVERSIONINFO lpVersionInformation,LPCWSTR lpString,INT cchStr);\n  WINBASEAPI WINBOOL WINAPI IsValidLocale(LCID Locale,DWORD dwFlags);\n  WINBASEAPI int WINAPI GetGeoInfoA(GEOID Location,GEOTYPE GeoType,LPSTR lpGeoData,int cchData,LANGID LangId);\n  WINBASEAPI int WINAPI GetGeoInfoW(GEOID Location,GEOTYPE GeoType,LPWSTR lpGeoData,int cchData,LANGID LangId);\n  WINBASEAPI WINBOOL WINAPI EnumSystemGeoID(GEOCLASS GeoClass,GEOID ParentGeoId,GEO_ENUMPROC lpGeoEnumProc);\n  WINBASEAPI GEOID WINAPI GetUserGeoID(GEOCLASS GeoClass);\n  WINBASEAPI WINBOOL WINAPI SetUserGeoID(GEOID GeoId);\n  WINBASEAPI LCID WINAPI ConvertDefaultLocale(LCID Locale);\n  WINBASEAPI LCID WINAPI GetThreadLocale(void);\n  WINBASEAPI WINBOOL WINAPI SetThreadLocale(LCID Locale);\n  WINBASEAPI LANGID WINAPI GetSystemDefaultUILanguage(void);\n  WINBASEAPI LANGID WINAPI GetUserDefaultUILanguage(void);\n  WINBASEAPI LANGID WINAPI GetSystemDefaultLangID(void);\n  WINBASEAPI LANGID WINAPI GetUserDefaultLangID(void);\n  WINBASEAPI LCID WINAPI GetSystemDefaultLCID(void);\n  WINBASEAPI LCID WINAPI GetUserDefaultLCID(void);\n  WINBASEAPI WINBOOL WINAPI GetStringTypeExA(LCID Locale,DWORD dwInfoType,LPCSTR lpSrcStr,int cchSrc,LPWORD lpCharType);\n  WINBASEAPI WINBOOL WINAPI GetStringTypeExW(LCID Locale,DWORD dwInfoType,LPCWSTR lpSrcStr,int cchSrc,LPWORD lpCharType);\n  WINBASEAPI WINBOOL WINAPI GetStringTypeA(LCID Locale,DWORD dwInfoType,LPCSTR lpSrcStr,int cchSrc,LPWORD lpCharType);\n  WINBASEAPI WINBOOL WINAPI GetStringTypeW(DWORD dwInfoType,LPCWSTR lpSrcStr,int cchSrc,LPWORD lpCharType);\n  WINBASEAPI int WINAPI FoldStringA(DWORD dwMapFlags,LPCSTR lpSrcStr,int cchSrc,LPSTR lpDestStr,int cchDest);\n  WINBASEAPI int WINAPI FoldStringW(DWORD dwMapFlags,LPCWSTR lpSrcStr,int cchSrc,LPWSTR lpDestStr,int cchDest);\n  WINBASEAPI WINBOOL WINAPI EnumSystemLanguageGroupsA(LANGUAGEGROUP_ENUMPROCA lpLanguageGroupEnumProc,DWORD dwFlags,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumSystemLanguageGroupsW(LANGUAGEGROUP_ENUMPROCW lpLanguageGroupEnumProc,DWORD dwFlags,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumLanguageGroupLocalesA(LANGGROUPLOCALE_ENUMPROCA lpLangGroupLocaleEnumProc,LGRPID LanguageGroup,DWORD dwFlags,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumLanguageGroupLocalesW(LANGGROUPLOCALE_ENUMPROCW lpLangGroupLocaleEnumProc,LGRPID LanguageGroup,DWORD dwFlags,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumUILanguagesA(UILANGUAGE_ENUMPROCA lpUILanguageEnumProc,DWORD dwFlags,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumUILanguagesW(UILANGUAGE_ENUMPROCW lpUILanguageEnumProc,DWORD dwFlags,LONG_PTR lParam);\n  WINBASEAPI WINBOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumSystemLocalesW(LOCALE_ENUMPROCW lpLocaleEnumProc,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumSystemCodePagesA(CODEPAGE_ENUMPROCA lpCodePageEnumProc,DWORD dwFlags);\n  WINBASEAPI WINBOOL WINAPI EnumSystemCodePagesW(CODEPAGE_ENUMPROCW lpCodePageEnumProc,DWORD dwFlags);\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winnt.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINNT_\n#define _WINNT_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <ctype.h>\n#define ANYSIZE_ARRAY 1\n\n#include <specstrings.h>\n\n#define RESTRICTED_POINTER\n\n#ifndef __CRT_UNALIGNED\n#define __CRT_UNALIGNED\n#endif\n\n#if defined(__ia64__) || defined(__x86_64)\n#define UNALIGNED __CRT_UNALIGNED\n#ifdef _WIN64\n#define UNALIGNED64 __CRT_UNALIGNED\n#else\n#define UNALIGNED64\n#endif\n#else\n#define UNALIGNED\n#define UNALIGNED64\n#endif\n\n#if !defined(I_X86_) && !defined(_IA64_) && !defined(_AMD64_) && (defined(_X86_) && !defined(__x86_64))\n#define I_X86_\n#endif\n\n#if !defined(I_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(__x86_64)\n#define _AMD64_\n#endif\n\n#if !defined(I_X86_) && !(defined(_X86_) && !defined(__x86_64)) && !defined(_AMD64_) && defined(__ia64__)\n#if !defined(_IA64_)\n#define _IA64_\n#endif\n#endif\n\n\n#ifdef _WIN64\n#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)\n#define MEMORY_ALLOCATION_ALIGNMENT 16\n#else\n#define MAX_NATURAL_ALIGNMENT sizeof(DWORD)\n#define MEMORY_ALLOCATION_ALIGNMENT 8\n#endif\n\n#ifdef __cplusplus\n#define TYPE_ALIGNMENT(t) __alignof__ (t)\n#else\n#define TYPE_ALIGNMENT(t) FIELD_OFFSET(struct { char x; t test; },test)\n#endif\n\n#ifdef _WIN64\n#ifdef _AMD64_\n#define PROBE_ALIGNMENT(_s) TYPE_ALIGNMENT(DWORD)\n#elif defined(_IA64_)\n#define PROBE_ALIGNMENT(_s) (TYPE_ALIGNMENT(_s) > TYPE_ALIGNMENT(DWORD) ? TYPE_ALIGNMENT(_s) : TYPE_ALIGNMENT(DWORD))\n#else\n#error No Target Architecture\n#endif\n#define PROBE_ALIGNMENT32(_s) TYPE_ALIGNMENT(DWORD)\n#else\n#define PROBE_ALIGNMENT(_s) TYPE_ALIGNMENT(DWORD)\n#endif\n\n#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]\n\n#include <basetsd.h>\n\n#if defined(_X86_) || defined(__ia64__) || defined(__x86_64)\n#define DECLSPEC_IMPORT __declspec(dllimport)\n#else\n#define DECLSPEC_IMPORT\n#endif\n\n#ifndef DECLSPEC_NORETURN\n#define DECLSPEC_NORETURN __declspec(noreturn)\n#endif\n\n#ifndef DECLSPEC_ALIGN\n#define DECLSPEC_ALIGN(x) __attribute__ ((aligned(x)))\n#endif\n\n#ifndef SYSTEM_CACHE_ALIGNMENT_SIZE\n#if defined(_AMD64_) || defined(I_X86_)\n#define SYSTEM_CACHE_ALIGNMENT_SIZE 64\n#else\n#define SYSTEM_CACHE_ALIGNMENT_SIZE 128\n#endif\n#endif\n\n#ifndef DECLSPEC_CACHEALIGN\n#define DECLSPEC_CACHEALIGN DECLSPEC_ALIGN(SYSTEM_CACHE_ALIGNMENT_SIZE)\n#endif\n\n#ifndef DECLSPEC_UUID\n#define DECLSPEC_UUID(x)\n#endif\n\n#ifndef DECLSPEC_NOVTABLE\n#define DECLSPEC_NOVTABLE\n#endif\n\n#ifndef DECLSPEC_SELECTANY\n#define DECLSPEC_SELECTANY __declspec(selectany)\n#endif\n\n#ifndef NOP_FUNCTION\n#define NOP_FUNCTION (void)0\n#endif\n\n#ifndef DECLSPEC_NOINLINE\n#define DECLSPEC_NOINLINE\n#endif\n\n#ifndef FORCEINLINE\n#define FORCEINLINE static __inline__\n#endif\n\n#ifndef DECLSPEC_DEPRECATED\n#define DECLSPEC_DEPRECATED __declspec(deprecated)\n#define DEPRECATE_SUPPORTED\n#endif\n\n#define DECLSPEC_DEPRECATED_DDK\n#define PRAGMA_DEPRECATED_DDK 0\n\n  typedef void *PVOID;\n  typedef void *PVOID64;\n\n#define NTAPI __stdcall\n#define NTSYSAPI DECLSPEC_IMPORT\n#define NTSYSCALLAPI DECLSPEC_IMPORT\n\n#ifndef VOID\n#define VOID void\n  typedef char CHAR;\n  typedef short SHORT;\n  typedef long LONG;\n#endif\n\n  typedef wchar_t WCHAR;\n  typedef WCHAR *PWCHAR,*LPWCH,*PWCH;\n  typedef CONST WCHAR *LPCWCH,*PCWCH;\n  typedef WCHAR *NWPSTR,*LPWSTR,*PWSTR;\n  typedef PWSTR *PZPWSTR;\n  typedef CONST PWSTR *PCZPWSTR;\n  typedef WCHAR UNALIGNED *LPUWSTR,*PUWSTR;\n  typedef CONST WCHAR *LPCWSTR,*PCWSTR;\n  typedef PCWSTR *PZPCWSTR;\n  typedef CONST WCHAR UNALIGNED *LPCUWSTR,*PCUWSTR;\n  typedef CHAR *PCHAR,*LPCH,*PCH;\n  typedef CONST CHAR *LPCCH,*PCCH;\n  typedef CHAR *NPSTR,*LPSTR,*PSTR;\n  typedef PSTR *PZPSTR;\n  typedef CONST PSTR *PCZPSTR;\n  typedef CONST CHAR *LPCSTR,*PCSTR;\n  typedef PCSTR *PZPCSTR;\n\n#ifdef UNICODE\n#ifndef _TCHAR_DEFINED\n#define _TCHAR_DEFINED\n  typedef WCHAR TCHAR,*PTCHAR;\n  typedef WCHAR TBYTE ,*PTBYTE;\n#endif\n\n  typedef LPWSTR LPTCH,PTCH;\n  typedef LPWSTR PTSTR,LPTSTR;\n  typedef LPCWSTR PCTSTR,LPCTSTR;\n  typedef LPUWSTR PUTSTR,LPUTSTR;\n  typedef LPCUWSTR PCUTSTR,LPCUTSTR;\n  typedef LPWSTR LP;\n#define __TEXT(quote) L##quote\n#else\n#ifndef _TCHAR_DEFINED\n#define _TCHAR_DEFINED\n  typedef char TCHAR,*PTCHAR;\n  typedef unsigned char TBYTE ,*PTBYTE;\n#endif\n\n  typedef LPSTR LPTCH,PTCH;\n  typedef LPSTR PTSTR,LPTSTR,PUTSTR,LPUTSTR;\n  typedef LPCSTR PCTSTR,LPCTSTR,PCUTSTR,LPCUTSTR;\n#define __TEXT(quote) quote\n#endif\n\n#define TEXT(quote) __TEXT(quote)\n\n  typedef SHORT *PSHORT;\n  typedef LONG *PLONG;\n\n  typedef void *HANDLE;\n#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name\n  typedef HANDLE *PHANDLE;\n\n  typedef BYTE FCHAR;\n  typedef WORD FSHORT;\n  typedef DWORD FLONG;\n\n#ifndef _HRESULT_DEFINED\n#define _HRESULT_DEFINED\n  typedef LONG HRESULT;\n#endif\n\n#ifdef __cplusplus\n#define EXTERN_C extern \"C\"\n#else\n#define EXTERN_C extern\n#endif\n\n#define STDMETHODCALLTYPE WINAPI\n#define STDMETHODVCALLTYPE __cdecl\n#define STDAPICALLTYPE WINAPI\n#define STDAPIVCALLTYPE __cdecl\n#define STDAPI EXTERN_C HRESULT WINAPI\n#define STDAPI_(type) EXTERN_C type WINAPI\n#define STDMETHODIMP HRESULT WINAPI\n#define STDMETHODIMP_(type) type WINAPI\n#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE\n#define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE\n#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE\n#define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE\n\n  typedef char CCHAR;\n#ifndef _LCID_DEFINED\n#define _LCID_DEFINED\ntypedef DWORD LCID;\n#endif\n  typedef PDWORD PLCID;\n#ifndef _LANGID_DEFINED\n#define _LANGID_DEFINED\n  typedef WORD LANGID;\n#endif\n#define APPLICATION_ERROR_MASK 0x20000000\n#define ERROR_SEVERITY_SUCCESS 0x00000000\n#define ERROR_SEVERITY_INFORMATIONAL 0x40000000\n#define ERROR_SEVERITY_WARNING 0x80000000\n#define ERROR_SEVERITY_ERROR 0xC0000000\n\n#ifdef __ia64__\n  __declspec(align(16))\n#endif\n    typedef struct _FLOAT128 {\n      __int64 LowPart;\n      __int64 HighPart;\n  } FLOAT128;\n\n  typedef FLOAT128 *PFLOAT128;\n\n#define _ULONGLONG_\n#if((!(defined(_X86_) && !defined(__x86_64)) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))\n  typedef __int64 LONGLONG;\n  typedef unsigned __int64 ULONGLONG;\n\n#define MAXLONGLONG (0x7fffffffffffffff)\n#else\n\n  typedef double LONGLONG;\n  typedef double ULONGLONG;\n#endif\n\n  typedef LONGLONG *PLONGLONG;\n  typedef ULONGLONG *PULONGLONG;\n\n  typedef LONGLONG USN;\n\n  typedef union _LARGE_INTEGER {\n    struct {\n      DWORD LowPart;\n      LONG HighPart;\n    };\n    struct {\n      DWORD LowPart;\n      LONG HighPart;\n    } u;\n    LONGLONG QuadPart;\n  } LARGE_INTEGER;\n\n  typedef LARGE_INTEGER *PLARGE_INTEGER;\n\n  typedef union _ULARGE_INTEGER {\n    struct {\n      DWORD LowPart;\n      DWORD HighPart;\n    };\n    struct {\n      DWORD LowPart;\n      DWORD HighPart;\n    } u;\n    ULONGLONG QuadPart;\n  } ULARGE_INTEGER;\n\n  typedef ULARGE_INTEGER *PULARGE_INTEGER;\n\n  typedef struct _LUID {\n    DWORD LowPart;\n    LONG HighPart;\n  } LUID,*PLUID;\n\n#define _DWORDLONG_\n  typedef ULONGLONG DWORDLONG;\n  typedef DWORDLONG *PDWORDLONG;\n\n#ifdef RC_INVOKED\n#define Int32x32To64(a,b) ((LONGLONG)((LONG)(a)) *(LONGLONG)((LONG)(b)))\n#define UInt32x32To64(a,b) ((ULONGLONG)((DWORD)(a)) *(ULONGLONG)((DWORD)(b)))\n#define Int64ShrlMod32(a,b) ((ULONGLONG)(a) >> (b))\n#elif (defined(_X86_) && !defined(__x86_64))\n#define Int32x32To64(a,b) (LONGLONG)((LONGLONG)(LONG)(a) *(LONG)(b))\n#define UInt32x32To64(a,b) (ULONGLONG)((ULONGLONG)(DWORD)(a) *(DWORD)(b))\n#define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))\n#elif defined(__ia64__) || defined(__x86_64)\n#define Int32x32To64(a,b) ((LONGLONG)((LONG)(a)) *(LONGLONG)((LONG)(b)))\n#define UInt32x32To64(a,b) ((ULONGLONG)((DWORD)(a)) *(ULONGLONG)((DWORD)(b)))\n#define Int64ShrlMod32(a,b) ((ULONGLONG)(a) >> (b))\n#else\n#error Must define a target architecture.\n#endif\n\n#define Int64ShraMod32(a,b) ((LONGLONG)(a) >> (b))\n#define Int64ShllMod32(a,b) ((ULONGLONG)(a) << (b))\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n#ifdef __x86_64\n\n#define RotateLeft8 _rotl8\n#define RotateLeft16 _rotl16\n#define RotateRight8 _rotr8\n#define RotateRight16 _rotr16\n\n    unsigned char __cdecl _rotl8(unsigned char Value,unsigned char Shift);\n    unsigned short __cdecl _rotl16(unsigned short Value,unsigned char Shift);\n    unsigned char __cdecl _rotr8(unsigned char Value,unsigned char Shift);\n    unsigned short __cdecl _rotr16(unsigned short Value,unsigned char Shift);\n#endif\n\n#define RotateLeft32 _rotl\n#define RotateLeft64 _rotl64\n#define RotateRight32 _rotr\n#define RotateRight64 _rotr64\n\n    unsigned int __cdecl _rotl(unsigned int Value,int Shift);\n    unsigned __int64 __cdecl _rotl64(unsigned __int64 Value,int Shift);\n    unsigned int __cdecl _rotr(unsigned int Value,int Shift);\n    unsigned __int64 __cdecl _rotr64(unsigned __int64 Value,int Shift);\n#ifdef __cplusplus\n  }\n#endif\n\n#define ANSI_NULL ((CHAR)0)\n#define UNICODE_NULL ((WCHAR)0)\n#define UNICODE_STRING_MAX_BYTES ((WORD) 65534)\n#define UNICODE_STRING_MAX_CHARS (32767)\n\n#ifndef _BOOLEAN_\n#define _BOOLEAN_\n  typedef BYTE BOOLEAN;\n#endif\n  typedef BOOLEAN *PBOOLEAN;\n\n  typedef struct _LIST_ENTRY {\n    struct _LIST_ENTRY *Flink;\n    struct _LIST_ENTRY *Blink;\n  } LIST_ENTRY,*PLIST_ENTRY,*RESTRICTED_POINTER PRLIST_ENTRY;\n\n  typedef struct _SINGLE_LIST_ENTRY {\n    struct _SINGLE_LIST_ENTRY *Next;\n  } SINGLE_LIST_ENTRY,*PSINGLE_LIST_ENTRY;\n\n  typedef struct LIST_ENTRY32 {\n    DWORD Flink;\n    DWORD Blink;\n  } LIST_ENTRY32;\n  typedef LIST_ENTRY32 *PLIST_ENTRY32;\n\n  typedef struct LIST_ENTRY64 {\n    ULONGLONG Flink;\n    ULONGLONG Blink;\n  } LIST_ENTRY64;\n  typedef LIST_ENTRY64 *PLIST_ENTRY64;\n\n#include <guiddef.h>\n\n#ifndef __OBJECTID_DEFINED\n#define __OBJECTID_DEFINED\n  typedef struct _OBJECTID {\n    GUID Lineage;\n    DWORD Uniquifier;\n  } OBJECTID;\n#endif\n\n#define MINCHAR 0x80\n#define MAXCHAR 0x7f\n#define MINSHORT 0x8000\n#define MAXSHORT 0x7fff\n#define MINLONG 0x80000000\n#define MAXLONG 0x7fffffff\n#define MAXBYTE 0xff\n#define MAXWORD 0xffff\n#define MAXDWORD 0xffffffff\n\n#define FIELD_OFFSET(type,field) ((LONG)(LONG_PTR)&(((type *)0)->field))\n#define RTL_FIELD_SIZE(type,field) (sizeof(((type *)0)->field))\n#define RTL_SIZEOF_THROUGH_FIELD(type,field) (FIELD_OFFSET(type,field) + RTL_FIELD_SIZE(type,field))\n#define RTL_CONTAINS_FIELD(Struct,Size,Field) ((((PCHAR)(&(Struct)->Field)) + sizeof((Struct)->Field)) <= (((PCHAR)(Struct))+(Size)))\n#define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0]))\n#define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A)\n\n#ifdef ENABLE_RTL_NUMBER_OF_V2\n#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)\n#else\n#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A)\n#endif\n\n#define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)\n#define _ARRAYSIZE(A) RTL_NUMBER_OF_V1(A)\n\n#define RTL_FIELD_TYPE(type,field) (((type*)0)->field)\n#define RTL_NUMBER_OF_FIELD(type,field) (RTL_NUMBER_OF(RTL_FIELD_TYPE(type,field)))\n#define RTL_PADDING_BETWEEN_FIELDS(T,F1,F2) ((FIELD_OFFSET(T,F2) > FIELD_OFFSET(T,F1)) ? (FIELD_OFFSET(T,F2) - FIELD_OFFSET(T,F1) - RTL_FIELD_SIZE(T,F1)) : (FIELD_OFFSET(T,F1) - FIELD_OFFSET(T,F2) - RTL_FIELD_SIZE(T,F2)))\n\n#ifdef __cplusplus\n#define RTL_CONST_CAST(type) const_cast<type>\n#else\n#define RTL_CONST_CAST(type) (type)\n#endif\n\n#define RTL_BITS_OF(sizeOfArg) (sizeof(sizeOfArg) *8)\n#define RTL_BITS_OF_FIELD(type,field) (RTL_BITS_OF(RTL_FIELD_TYPE(type,field)))\n#define CONTAINING_RECORD(address,type,field) ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))\n\n#define VER_SERVER_NT 0x80000000\n#define VER_WORKSTATION_NT 0x40000000\n#define VER_SUITE_SMALLBUSINESS 0x00000001\n#define VER_SUITE_ENTERPRISE 0x00000002\n#define VER_SUITE_BACKOFFICE 0x00000004\n#define VER_SUITE_COMMUNICATIONS 0x00000008\n#define VER_SUITE_TERMINAL 0x00000010\n#define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020\n#define VER_SUITE_EMBEDDEDNT 0x00000040\n#define VER_SUITE_DATACENTER 0x00000080\n#define VER_SUITE_SINGLEUSERTS 0x00000100\n#define VER_SUITE_PERSONAL 0x00000200\n#define VER_SUITE_BLADE 0x00000400\n#define VER_SUITE_EMBEDDED_RESTRICTED 0x00000800\n#define VER_SUITE_SECURITY_APPLIANCE 0x00001000\n#define VER_SUITE_STORAGE_SERVER 0x00002000\n#define VER_SUITE_COMPUTE_SERVER 0x00004000\n\n#define PRODUCT_UNDEFINED                       0x0\n\n#define PRODUCT_ULTIMATE                        0x1\n#define PRODUCT_HOME_BASIC                      0x2\n#define PRODUCT_HOME_PREMIUM                    0x3\n#define PRODUCT_ENTERPRISE                      0x4\n#define PRODUCT_HOME_BASIC_N                    0x5\n#define PRODUCT_BUSINESS                        0x6\n#define PRODUCT_STANDARD_SERVER                 0x7\n#define PRODUCT_DATACENTER_SERVER               0x8\n#define PRODUCT_SMALLBUSINESS_SERVER            0x9\n#define PRODUCT_ENTERPRISE_SERVER               0xa\n#define PRODUCT_STARTER                         0xb\n#define PRODUCT_DATACENTER_SERVER_CORE          0xc\n#define PRODUCT_STANDARD_SERVER_CORE            0xd\n#define PRODUCT_ENTERPRISE_SERVER_CORE          0xe\n#define PRODUCT_ENTERPRISE_SERVER_IA64          0xf\n#define PRODUCT_BUSINESS_N                      0x10\n#define PRODUCT_WEB_SERVER                      0x11\n#define PRODUCT_CLUSTER_SERVER                  0x12\n#define PRODUCT_HOME_SERVER                     0x13\n#define PRODUCT_STORAGE_EXPRESS_SERVER          0x14\n#define PRODUCT_STORAGE_STANDARD_SERVER         0x15\n#define PRODUCT_STORAGE_WORKGROUP_SERVER        0x16\n#define PRODUCT_STORAGE_ENTERPRISE_SERVER       0x17\n#define PRODUCT_SERVER_FOR_SMALLBUSINESS        0x18\n#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM    0x19\n\n#define PRODUCT_UNLICENSED                      0xabcdabcd\n\n#define LANG_NEUTRAL 0x00\n#define LANG_INVARIANT 0x7f\n\n#define LANG_AFRIKAANS 0x36\n#define LANG_ALBANIAN 0x1c\n#define LANG_ALSATIAN 0x84\n#define LANG_AMHARIC 0x5e\n#define LANG_ARABIC 0x01\n#define LANG_ARMENIAN 0x2b\n#define LANG_ASSAMESE 0x4d\n#define LANG_AZERI 0x2c\n#define LANG_BASHKIR 0x6d\n#define LANG_BASQUE 0x2d\n#define LANG_BELARUSIAN 0x23\n#define LANG_BENGALI 0x45\n#define LANG_BRETON 0x7e\n#define LANG_BOSNIAN 0x1a\n#define LANG_BOSNIAN_NEUTRAL 0x781a\n#define LANG_BULGARIAN 0x02\n#define LANG_CATALAN 0x03\n#define LANG_CHINESE 0x04\n#define LANG_CHINESE_SIMPLIFIED 0x04\n#define LANG_CHINESE_TRADITIONAL 0x7c04\n#define LANG_CORSICAN 0x83\n#define LANG_CROATIAN 0x1a\n#define LANG_CZECH 0x05\n#define LANG_DANISH 0x06\n#define LANG_DARI 0x8c\n#define LANG_DIVEHI 0x65\n#define LANG_DUTCH 0x13\n#define LANG_ENGLISH 0x09\n#define LANG_ESTONIAN 0x25\n#define LANG_FAEROESE 0x38\n#define LANG_FARSI 0x29\n#define LANG_FILIPINO 0x64\n#define LANG_FINNISH 0x0b\n#define LANG_FRENCH 0x0c\n#define LANG_FRISIAN 0x62\n#define LANG_GALICIAN 0x56\n#define LANG_GEORGIAN 0x37\n#define LANG_GERMAN 0x07\n#define LANG_GREEK 0x08\n#define LANG_GREENLANDIC 0x6f\n#define LANG_GUJARATI 0x47\n#define LANG_HAUSA 0x68\n#define LANG_HEBREW 0x0d\n#define LANG_HINDI 0x39\n#define LANG_HUNGARIAN 0x0e\n#define LANG_ICELANDIC 0x0f\n#define LANG_IGBO 0x70\n#define LANG_INDONESIAN 0x21\n#define LANG_INUKTITUT 0x5d\n#define LANG_IRISH 0x3c\n#define LANG_ITALIAN 0x10\n#define LANG_JAPANESE 0x11\n#define LANG_KANNADA 0x4b\n#define LANG_KASHMIRI 0x60\n#define LANG_KAZAK 0x3f\n#define LANG_KHMER 0x53\n#define LANG_KICHE 0x86\n#define LANG_KINYARWANDA 0x87\n#define LANG_KONKANI 0x57\n#define LANG_KOREAN 0x12\n#define LANG_KYRGYZ 0x40\n#define LANG_LAO 0x54\n#define LANG_LATVIAN 0x26\n#define LANG_LITHUANIAN 0x27\n#define LANG_LOWER_SORBIAN 0x2e\n#define LANG_LUXEMBOURGISH 0x6e\n#define LANG_MACEDONIAN 0x2f\n#define LANG_MALAY 0x3e\n#define LANG_MALAYALAM 0x4c\n#define LANG_MALTESE 0x3a\n#define LANG_MANIPURI 0x58\n#define LANG_MAORI 0x81\n#define LANG_MAPUDUNGUN 0x7a\n#define LANG_MARATHI 0x4e\n#define LANG_MOHAWK 0x7c\n#define LANG_MONGOLIAN 0x50\n#define LANG_NEPALI 0x61\n#define LANG_NORWEGIAN 0x14\n#define LANG_OCCITAN 0x82\n#define LANG_ORIYA 0x48\n#define LANG_PASHTO 0x63\n#define LANG_PERSIAN 0x29\n#define LANG_POLISH 0x15\n#define LANG_PORTUGUESE 0x16\n#define LANG_PUNJABI 0x46\n#define LANG_QUECHUA 0x6b\n#define LANG_ROMANIAN 0x18\n#define LANG_RUSSIAN 0x19\n#define LANG_SAMI 0x3b\n#define LANG_ROMANSH 0x17\n#define LANG_SANSKRIT 0x4f\n#define LANG_SERBIAN 0x1a\n#define LANG_SERBIAN_NEUTRAL 0x7c1a\n#define LANG_SINDHI 0x59\n#define LANG_SINHALESE 0x5b\n#define LANG_SLOVAK 0x1b\n#define LANG_SLOVENIAN 0x24\n#define LANG_SOTHO 0x6c\n#define LANG_SPANISH 0x0a\n#define LANG_SWAHILI 0x41\n#define LANG_SWEDISH 0x1d\n#define LANG_SYRIAC 0x5a\n#define LANG_TAJIK 0x28\n#define LANG_TAMAZIGHT 0x5f\n#define LANG_TAMIL 0x49\n#define LANG_TATAR 0x44\n#define LANG_TELUGU 0x4a\n#define LANG_THAI 0x1e\n#define LANG_TIBETAN 0x51\n#define LANG_TIGRIGNA 0x73\n#define LANG_TSWANA 0x32\n#define LANG_TURKISH 0x1f\n#define LANG_TURKMEN 0x42\n#define LANG_UIGHUR 0x80\n#define LANG_UKRAINIAN 0x22\n#define LANG_UPPER_SORBIAN 0x2e\n#define LANG_URDU 0x20\n#define LANG_UZBEK 0x43\n#define LANG_VIETNAMESE 0x2a\n#define LANG_WELSH 0x52\n#define LANG_WOLOF 0x88\n#define LANG_XHOSA 0x34\n#define LANG_YAKUT 0x85\n#define LANG_YI 0x78\n#define LANG_YORUBA 0x6a\n#define LANG_ZULU 0x35\n\n#define SUBLANG_NEUTRAL 0x0\n#define SUBLANG_DEFAULT 0x1\n#define SUBLANG_SYS_DEFAULT 0x2\n#define SUBLANG_CUSTOM_DEFAULT 0x3\n#define SUBLANG_CUSTOM_UNSPECIFIED 0x4\n#define SUBLANG_UI_CUSTOM_DEFAULT 0x5\n\n#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01\n#define SUBLANG_ARABIC_IRAQ 0x02\n#define SUBLANG_ARABIC_EGYPT 0x03\n#define SUBLANG_ARABIC_LIBYA 0x04\n#define SUBLANG_ARABIC_ALGERIA 0x05\n#define SUBLANG_ARABIC_MOROCCO 0x06\n#define SUBLANG_ARABIC_TUNISIA 0x07\n#define SUBLANG_ARABIC_OMAN 0x08\n#define SUBLANG_ARABIC_YEMEN 0x09\n#define SUBLANG_ARABIC_SYRIA 0x0a\n#define SUBLANG_ARABIC_JORDAN 0x0b\n#define SUBLANG_ARABIC_LEBANON 0x0c\n#define SUBLANG_ARABIC_KUWAIT 0x0d\n#define SUBLANG_ARABIC_UAE 0x0e\n#define SUBLANG_ARABIC_BAHRAIN 0x0f\n#define SUBLANG_ARABIC_QATAR 0x10\n#define SUBLANG_AZERI_LATIN 0x01\n#define SUBLANG_AZERI_CYRILLIC 0x02\n#define SUBLANG_CHINESE_TRADITIONAL 0x01\n#define SUBLANG_CHINESE_SIMPLIFIED 0x02\n#define SUBLANG_CHINESE_HONGKONG 0x03\n#define SUBLANG_CHINESE_SINGAPORE 0x04\n#define SUBLANG_CHINESE_MACAU 0x05\n#define SUBLANG_DUTCH 0x01\n#define SUBLANG_DUTCH_BELGIAN 0x02\n#define SUBLANG_ENGLISH_US 0x01\n#define SUBLANG_ENGLISH_UK 0x02\n#define SUBLANG_ENGLISH_AUS 0x03\n#define SUBLANG_ENGLISH_CAN 0x04\n#define SUBLANG_ENGLISH_NZ 0x05\n#define SUBLANG_ENGLISH_EIRE 0x06\n#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07\n#define SUBLANG_ENGLISH_JAMAICA 0x08\n#define SUBLANG_ENGLISH_CARIBBEAN 0x09\n#define SUBLANG_ENGLISH_BELIZE 0x0a\n#define SUBLANG_ENGLISH_TRINIDAD 0x0b\n#define SUBLANG_ENGLISH_ZIMBABWE 0x0c\n#define SUBLANG_ENGLISH_PHILIPPINES 0x0d\n#define SUBLANG_FRENCH 0x01\n#define SUBLANG_FRENCH_BELGIAN 0x02\n#define SUBLANG_FRENCH_CANADIAN 0x03\n#define SUBLANG_FRENCH_SWISS 0x04\n#define SUBLANG_FRENCH_LUXEMBOURG 0x05\n#define SUBLANG_FRENCH_MONACO 0x06\n#define SUBLANG_GERMAN 0x01\n#define SUBLANG_GERMAN_SWISS 0x02\n#define SUBLANG_GERMAN_AUSTRIAN 0x03\n#define SUBLANG_GERMAN_LUXEMBOURG 0x04\n#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05\n#define SUBLANG_ITALIAN 0x01\n#define SUBLANG_ITALIAN_SWISS 0x02\n#define SUBLANG_KASHMIRI_SASIA 0x02\n#define SUBLANG_KASHMIRI_INDIA 0x02\n#define SUBLANG_KOREAN 0x01\n#define SUBLANG_LITHUANIAN 0x01\n#define SUBLANG_MALAY_MALAYSIA 0x01\n#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02\n#define SUBLANG_NEPALI_INDIA 0x02\n#define SUBLANG_NORWEGIAN_BOKMAL 0x01\n#define SUBLANG_NORWEGIAN_NYNORSK 0x02\n#define SUBLANG_PORTUGUESE 0x02\n#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01\n#define SUBLANG_SERBIAN_LATIN 0x02\n#define SUBLANG_SERBIAN_CYRILLIC 0x03\n#define SUBLANG_SPANISH 0x01\n#define SUBLANG_SPANISH_MEXICAN 0x02\n#define SUBLANG_SPANISH_MODERN 0x03\n#define SUBLANG_SPANISH_GUATEMALA 0x04\n#define SUBLANG_SPANISH_COSTA_RICA 0x05\n#define SUBLANG_SPANISH_PANAMA 0x06\n#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07\n#define SUBLANG_SPANISH_VENEZUELA 0x08\n#define SUBLANG_SPANISH_COLOMBIA 0x09\n#define SUBLANG_SPANISH_PERU 0x0a\n#define SUBLANG_SPANISH_ARGENTINA 0x0b\n#define SUBLANG_SPANISH_ECUADOR 0x0c\n#define SUBLANG_SPANISH_CHILE 0x0d\n#define SUBLANG_SPANISH_URUGUAY 0x0e\n#define SUBLANG_SPANISH_PARAGUAY 0x0f\n#define SUBLANG_SPANISH_BOLIVIA 0x10\n#define SUBLANG_SPANISH_EL_SALVADOR 0x11\n#define SUBLANG_SPANISH_HONDURAS 0x12\n#define SUBLANG_SPANISH_NICARAGUA 0x13\n#define SUBLANG_SPANISH_PUERTO_RICO 0x14\n#define SUBLANG_SWEDISH 0x01\n#define SUBLANG_SWEDISH_FINLAND 0x02\n#define SUBLANG_URDU_PAKISTAN 0x01\n#define SUBLANG_URDU_INDIA 0x02\n#define SUBLANG_UZBEK_LATIN 0x01\n#define SUBLANG_UZBEK_CYRILLIC 0x02\n\n#define SORT_DEFAULT 0x0\n#define SORT_INVARIANT_MATH 0x1\n\n#define SORT_JAPANESE_XJIS 0x0\n#define SORT_JAPANESE_UNICODE 0x1\n#define SORT_JAPANESE_RADICALSTROKE 0x4\n\n#define SORT_CHINESE_BIG5 0x0\n#define SORT_CHINESE_PRCP 0x0\n#define SORT_CHINESE_UNICODE 0x1\n#define SORT_CHINESE_PRC 0x2\n#define SORT_CHINESE_BOPOMOFO 0x3\n\n#define SORT_KOREAN_KSC 0x0\n#define SORT_KOREAN_UNICODE 0x1\n\n#define SORT_GERMAN_PHONE_BOOK 0x1\n\n#define SORT_HUNGARIAN_DEFAULT 0x0\n#define SORT_HUNGARIAN_TECHNICAL 0x1\n\n#define SORT_GEORGIAN_TRADITIONAL 0x0\n#define SORT_GEORGIAN_MODERN 0x1\n\n#define MAKELANGID(p,s) ((((WORD)(s)) << 10) | (WORD)(p))\n#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff)\n#define SUBLANGID(lgid) ((WORD)(lgid) >> 10)\n\n#define NLS_VALID_LOCALE_MASK 0x000fffff\n\n#define MAKELCID(lgid,srtid) ((DWORD)((((DWORD)((WORD)(srtid))) << 16) | ((DWORD)((WORD)(lgid)))))\n#define MAKESORTLCID(lgid,srtid,ver) ((DWORD)((MAKELCID(lgid,srtid)) | (((DWORD)((WORD)(ver))) << 20)))\n#define LANGIDFROMLCID(lcid) ((WORD)(lcid))\n#define SORTIDFROMLCID(lcid) ((WORD)((((DWORD)(lcid)) >> 16) & 0xf))\n#define SORTVERSIONFROMLCID(lcid) ((WORD)((((DWORD)(lcid)) >> 20) & 0xf))\n\n#define LOCALE_NAME_MAX_LENGTH 85\n#define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT))\n#define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT))\n\n#define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT,SORT_DEFAULT))\n#define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT,SORT_DEFAULT))\n\n#define LOCALE_NEUTRAL (MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT))\n\n#define LOCALE_CUSTOM_DEFAULT (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_DEFAULT), SORT_DEFAULT))\n#define LOCALE_CUSTOM_UNSPECIFIED (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_UNSPECIFIED), SORT_DEFAULT))\n#define LOCALE_CUSTOM_UI_DEFAULT (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_UI_CUSTOM_DEFAULT), SORT_DEFAULT))\n\n#define LOCALE_INVARIANT (MAKELCID(MAKELANGID(LANG_INVARIANT,SUBLANG_NEUTRAL),SORT_DEFAULT))\n\n#define UNREFERENCED_PARAMETER(P) (P)\n#define DBG_UNREFERENCED_PARAMETER(P) (P)\n#define DBG_UNREFERENCED_LOCAL_VARIABLE(V) (V)\n\n#define DEFAULT_UNREACHABLE\n\n#ifndef WIN32_NO_STATUS\n#define STATUS_WAIT_0 ((DWORD)0x00000000L)\n#define STATUS_ABANDONED_WAIT_0 ((DWORD)0x00000080L)\n#define STATUS_USER_APC ((DWORD)0x000000C0L)\n#define STATUS_TIMEOUT ((DWORD)0x00000102L)\n#define STATUS_PENDING ((DWORD)0x00000103L)\n#define DBG_EXCEPTION_HANDLED ((DWORD)0x00010001L)\n#define DBG_CONTINUE ((DWORD)0x00010002L)\n#define STATUS_SEGMENT_NOTIFICATION ((DWORD)0x40000005L)\n#define DBG_TERMINATE_THREAD ((DWORD)0x40010003L)\n#define DBG_TERMINATE_PROCESS ((DWORD)0x40010004L)\n#define DBG_CONTROL_C ((DWORD)0x40010005L)\n#define DBG_CONTROL_BREAK ((DWORD)0x40010008L)\n#define DBG_COMMAND_EXCEPTION ((DWORD)0x40010009L)\n#define STATUS_GUARD_PAGE_VIOLATION ((DWORD)0x80000001L)\n#define STATUS_DATATYPE_MISALIGNMENT ((DWORD)0x80000002L)\n#define STATUS_BREAKPOINT ((DWORD)0x80000003L)\n#define STATUS_SINGLE_STEP ((DWORD)0x80000004L)\n#define DBG_EXCEPTION_NOT_HANDLED ((DWORD)0x80010001L)\n#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L)\n#define STATUS_IN_PAGE_ERROR ((DWORD)0xC0000006L)\n#define STATUS_INVALID_HANDLE ((DWORD)0xC0000008L)\n#define STATUS_NO_MEMORY ((DWORD)0xC0000017L)\n#define STATUS_ILLEGAL_INSTRUCTION ((DWORD)0xC000001DL)\n#define STATUS_NONCONTINUABLE_EXCEPTION ((DWORD)0xC0000025L)\n#define STATUS_INVALID_DISPOSITION ((DWORD)0xC0000026L)\n#define STATUS_ARRAY_BOUNDS_EXCEEDED ((DWORD)0xC000008CL)\n#define STATUS_FLOAT_DENORMAL_OPERAND ((DWORD)0xC000008DL)\n#define STATUS_FLOAT_DIVIDE_BY_ZERO ((DWORD)0xC000008EL)\n#define STATUS_FLOAT_INEXACT_RESULT ((DWORD)0xC000008FL)\n#define STATUS_FLOAT_INVALID_OPERATION ((DWORD)0xC0000090L)\n#define STATUS_FLOAT_OVERFLOW ((DWORD)0xC0000091L)\n#define STATUS_FLOAT_STACK_CHECK ((DWORD)0xC0000092L)\n#define STATUS_FLOAT_UNDERFLOW ((DWORD)0xC0000093L)\n#define STATUS_INTEGER_DIVIDE_BY_ZERO ((DWORD)0xC0000094L)\n#define STATUS_INTEGER_OVERFLOW ((DWORD)0xC0000095L)\n#define STATUS_PRIVILEGED_INSTRUCTION ((DWORD)0xC0000096L)\n#define STATUS_STACK_OVERFLOW ((DWORD)0xC00000FDL)\n#define STATUS_CONTROL_C_EXIT ((DWORD)0xC000013AL)\n#define STATUS_FLOAT_MULTIPLE_FAULTS ((DWORD)0xC00002B4L)\n#define STATUS_FLOAT_MULTIPLE_TRAPS ((DWORD)0xC00002B5L)\n#define STATUS_REG_NAT_CONSUMPTION ((DWORD)0xC00002C9L)\n#define STATUS_SXS_EARLY_DEACTIVATION ((DWORD)0xC015000FL)\n#define STATUS_SXS_INVALID_DEACTIVATION ((DWORD)0xC0150010L)\n#endif\n\n#define MAXIMUM_WAIT_OBJECTS 64\n#define MAXIMUM_SUSPEND_COUNT MAXCHAR\n\n  typedef ULONG_PTR KSPIN_LOCK;\n  typedef KSPIN_LOCK *PKSPIN_LOCK;\n\n#ifdef _AMD64_\n\n#if defined(__x86_64) && !defined(RC_INVOKED)\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n#define BitTest _bittest\n#define BitTestAndComplement _bittestandcomplement\n#define BitTestAndSet _bittestandset\n#define BitTestAndReset _bittestandreset\n#define InterlockedBitTestAndSet _interlockedbittestandset\n#define InterlockedBitTestAndReset _interlockedbittestandreset\n#define BitTest64 _bittest64\n#define BitTestAndComplement64 _bittestandcomplement64\n#define BitTestAndSet64 _bittestandset64\n#define BitTestAndReset64 _bittestandreset64\n#define InterlockedBitTestAndSet64 _interlockedbittestandset64\n#define InterlockedBitTestAndReset64 _interlockedbittestandreset64\n\n    __CRT_INLINE BOOLEAN _bittest(LONG const *Base,LONG Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _bittestandcomplement(LONG *Base,LONG Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btcl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN InterlockedBitTestAndComplement(LONG *Base,LONG Bit) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btcl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Bit));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _bittestandset(LONG *Base,LONG Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btsl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _bittestandreset(LONG *Base,LONG Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btrl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _interlockedbittestandset(LONG *Base,LONG Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btsl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _interlockedbittestandreset(LONG *Base,LONG Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btrl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _bittest64(LONG64 const *Base,LONG64 Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btq %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _bittestandcomplement64(LONG64 *Base,LONG64 Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btcq %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _bittestandset64(LONG64 *Base,LONG64 Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btsq %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _bittestandreset64(LONG64 *Base,LONG64 Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"btrq %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _interlockedbittestandset64(LONG64 *Base,LONG64 Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btsq %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n    __CRT_INLINE BOOLEAN _interlockedbittestandreset64(LONG64 *Base,LONG64 Offset) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btrq %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long long *) Base))\n\t:\"Ir\" (Offset));\n      return (BOOLEAN) (old!=0);\n    }\n#define BitScanForward _BitScanForward\n#define BitScanReverse _BitScanReverse\n#define BitScanForward64 _BitScanForward64\n#define BitScanReverse64 _BitScanReverse64\n\n    __CRT_INLINE BOOLEAN _BitScanForward(DWORD *Index,DWORD Mask) {\n      __asm__ __volatile__(\"bsfl %1,%0\" : \"=r\" (Mask),\"=m\" ((*(volatile long *)Index)));\n      return Mask!=0;\n    }\n    __CRT_INLINE BOOLEAN _BitScanReverse(DWORD *Index,DWORD Mask) {\n      __asm__ __volatile__(\"bsrl %1,%0\" : \"=r\" (Mask),\"=m\" ((*(volatile long *)Index)));\n      return Mask!=0;\n    }\n    __CRT_INLINE BOOLEAN _BitScanForward64(DWORD *Index,DWORD64 Mask) {\n      __asm__ __volatile__(\"bsfq %1,%0\" : \"=r\" (Mask),\"=m\" ((*(volatile long long *)Index)));\n      return Mask!=0;\n    }\n    __CRT_INLINE BOOLEAN _BitScanReverse64(DWORD *Index,DWORD64 Mask) {\n      __asm__ __volatile__(\"bsrq %1,%0\" : \"=r\" (Mask),\"=m\" ((*(volatile long long *)Index)));\n      return Mask!=0;\n    }\n\n#define InterlockedIncrement16 _InterlockedIncrement16\n#define InterlockedDecrement16 _InterlockedDecrement16\n#define InterlockedCompareExchange16 _InterlockedCompareExchange16\n\n#define InterlockedAnd _InterlockedAnd\n#define InterlockedOr _InterlockedOr\n#define InterlockedXor _InterlockedXor\n#define InterlockedIncrement _InterlockedIncrement\n#define InterlockedIncrementAcquire InterlockedIncrement\n#define InterlockedIncrementRelease InterlockedIncrement\n#define InterlockedDecrement _InterlockedDecrement\n#define InterlockedDecrementAcquire InterlockedDecrement\n#define InterlockedDecrementRelease InterlockedDecrement\n#define InterlockedAdd _InterlockedAdd\n#define InterlockedExchange _InterlockedExchange\n#define InterlockedExchangeAdd _InterlockedExchangeAdd\n#define InterlockedCompareExchange _InterlockedCompareExchange\n#define InterlockedCompareExchangeAcquire InterlockedCompareExchange\n#define InterlockedCompareExchangeRelease InterlockedCompareExchange\n\n#define InterlockedAnd64 _InterlockedAnd64\n#define InterlockedAndAffinity InterlockedAnd64\n#define InterlockedOr64 _InterlockedOr64\n#define InterlockedOrAffinity InterlockedOr64\n#define InterlockedXor64 _InterlockedXor64\n#define InterlockedIncrement64 _InterlockedIncrement64\n#define InterlockedDecrement64 _InterlockedDecrement64\n#define InterlockedAdd64 _InterlockedAdd64\n#define InterlockedExchange64 _InterlockedExchange64\n#define InterlockedExchangeAcquire64 InterlockedExchange64\n#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64\n#define InterlockedCompareExchange64 _InterlockedCompareExchange64\n#define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64\n#define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64\n\n#define InterlockedExchangePointer _InterlockedExchangePointer\n#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer\n#define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer\n#define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer\n\n#define InterlockedExchangeAddSizeT(a,b) InterlockedExchangeAdd64((LONG64 *)a,b)\n#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)\n#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)\n\n    __CRT_INLINE SHORT InterlockedIncrement16(SHORT volatile *Addend) {\n      unsigned char c;\n      unsigned char s;\n      __asm__ __volatile__(\n\t\"lock ; addw $1,%0; sete %1 ; sets %2\"\n\t:\"=m\" (*Addend), \"=qm\" (c), \"=qm\" (s)\n\t:\"m\" (*Addend) : \"memory\");\n      return (c != 0 ? 0 : (s != 0 ? -1 : 1));\n    }\n    __CRT_INLINE SHORT InterlockedDecrement16(SHORT volatile *Addend) {\n      unsigned char c;\n      unsigned char s;\n      __asm__ __volatile__(\n\t\"lock ; subw $1,%0; sete %1 ; sets %2\"\n\t:\"=m\" (*Addend), \"=qm\" (c), \"=qm\" (s)\n\t:\"m\" (*Addend) : \"memory\");\n      return (c != 0 ? 0 : (s != 0 ? -1 : 1));\n    }\n    __CRT_INLINE SHORT InterlockedCompareExchange16(SHORT volatile *Destination,SHORT ExChange,SHORT Comperand) {\n      SHORT prev;\n      __asm__ __volatile__(\"lock ; cmpxchgw %w1,%2\"\n\t:\"=a\"(prev)\n\t:\"q\"(ExChange), \"m\"(*Destination), \"0\"(Comperand)\n\t: \"memory\");\n      return prev;\n    }\n    __CRT_INLINE LONG InterlockedAnd(LONG volatile *Destination,LONG Value) {\n      __asm__ __volatile__(\"lock ; andl %0,%1\"\n\t: :\"r\"(Value),\"m\"(*Destination)\n\t: \"memory\");\n      return *Destination;\n    }\n    __CRT_INLINE LONG InterlockedOr(LONG volatile *Destination,LONG Value) {\n      __asm__ __volatile__(\"lock ; orl %0,%1\"\n\t: : \"r\"(Value),\"m\"(*Destination) : \"memory\");\n      return *Destination;\n    }\n    __CRT_INLINE LONG InterlockedXor(LONG volatile *Destination,LONG Value) {\n      __asm__ __volatile__(\"lock ; xorl %0,%1\"\n\t: : \"r\"(Value),\"m\"(*Destination) : \"memory\");\n      return *Destination;\n    }\n    //\t\t$$$$\n    __CRT_INLINE LONG64 InterlockedAnd64(LONG64 volatile *Destination,LONG64 Value) {\n      __asm__ __volatile__(\"lock ; andq %0,%1\"\n\t: : \"r\"(Value),\"m\"(*Destination) : \"memory\");\n      return *Destination;\n    }\n    __CRT_INLINE LONG64 InterlockedOr64(LONG64 volatile *Destination,LONG64 Value) {\n      __asm__ __volatile__(\"lock ; orq %0,%1\"\n\t: : \"r\"(Value),\"m\"(*Destination) : \"memory\");\n      return *Destination;\n    }\n    __CRT_INLINE LONG64 InterlockedXor64(LONG64 volatile *Destination,LONG64 Value) {\n      __asm__ __volatile__(\"lock ; xorq %0,%1\"\n\t: : \"r\"(Value),\"m\"(*Destination) : \"memory\");\n      return *Destination;\n    }\n    __CRT_INLINE LONG InterlockedIncrement(LONG volatile *Addend) {\n      unsigned char c;\n      unsigned char s;\n      __asm__ __volatile__(\n\t\"lock ; addl $1,%0; sete %1 ; sets %2\"\n\t:\"=m\" (*Addend), \"=qm\" (c), \"=qm\" (s)\n\t:\"m\" (*Addend) : \"memory\");\n      return (c != 0 ? 0 : (s != 0 ? -1 : 1));\n    }\n    __CRT_INLINE LONG InterlockedDecrement(LONG volatile *Addend) {\n      unsigned char c;\n      unsigned char s;\n      __asm__ __volatile__(\n\t\"lock ; subl $1,%0; sete %1 ; sets %2\"\n\t:\"=m\" (*Addend), \"=qm\" (c), \"=qm\" (s)\n\t:\"m\" (*Addend) : \"memory\");\n      return (c != 0 ? 0 : (s != 0 ? -1 : 1));\n    }\n    __CRT_INLINE LONG InterlockedExchange(LONG volatile *Target,LONG Value) {\n      __asm__ __volatile(\"lock ; xchgl %0,%1\"\n\t: \"=r\"(Value)\n\t: \"m\"(*Target),\"0\"(Value)\n\t: \"memory\");\n      return Value;\n    }\n    LONG InterlockedExchangeAdd(LONG volatile *Addend,LONG Value);\n\n#ifndef _X86AMD64_\n    __CRT_INLINE LONG InterlockedAdd(LONG volatile *Addend,LONG Value) { return InterlockedExchangeAdd(Addend,Value) + Value; }\n#endif\n    __CRT_INLINE LONG InterlockedCompareExchange(LONG volatile *Destination,LONG ExChange,LONG Comperand) {\n      LONG prev;\n      __asm__ __volatile__(\"lock ; cmpxchgl %1,%2\" : \"=a\" (prev) : \"q\" (ExChange),\"m\" (*Destination), \"0\" (Comperand) : \"memory\");\n      return prev;\n    }\n    __CRT_INLINE LONG64 InterlockedIncrement64(LONG64 volatile *Addend) {\n      unsigned char c;\n      unsigned char s;\n      __asm__ __volatile__(\n\t\"lock ; addq $1,%0; sete %1 ; sets %2\"\n\t:\"=m\" (*Addend), \"=qm\" (c), \"=qm\" (s)\n\t:\"m\" (*Addend) : \"memory\");\n      return (c != 0 ? 0 : (s != 0 ? -1 : 1));\n    }\n    __CRT_INLINE LONG64 InterlockedDecrement64(LONG64 volatile *Addend) {\n      unsigned char c;\n      unsigned char s;\n      __asm__ __volatile__(\n\t\"lock ; subq $1,%0; sete %1 ; sets %2\"\n\t:\"=m\" (*Addend), \"=qm\" (c), \"=qm\" (s)\n\t:\"m\" (*Addend) : \"memory\");\n      return (c != 0 ? 0 : (s != 0 ? -1 : 1));\n    }\n    __CRT_INLINE LONG64 InterlockedExchange64(LONG64 volatile *Target,LONG64 Value) {\n      __asm__ __volatile(\"lock ; xchgq %0,%1\"\n\t: \"=r\"(Value)\n\t: \"m\"(*Target),\"0\"(Value)\n\t: \"memory\");\n      return Value;\n    }\n    LONG64 InterlockedExchangeAdd64(LONG64 volatile *Addend,LONG64 Value);\n\n#ifndef _X86AMD64_\n    __CRT_INLINE LONG64 InterlockedAdd64(LONG64 volatile *Addend,LONG64 Value) { return InterlockedExchangeAdd64(Addend,Value) + Value; }\n#endif\n\n    __CRT_INLINE LONG64 InterlockedCompareExchange64(LONG64 volatile *Destination,LONG64 ExChange,LONG64 Comperand) {\n      LONG64 prev;\n      __asm__ __volatile__(\"lock ; cmpxchgq %1,%2\" : \"=a\" (prev) : \"q\" (ExChange),\"m\" (*Destination), \"0\" (Comperand) : \"memory\");\n      return prev;\n    }\n    __CRT_INLINE PVOID InterlockedCompareExchangePointer(PVOID volatile *Destination,PVOID ExChange,PVOID Comperand) {\n      PVOID prev;\n      __asm__ __volatile__(\"lock ; cmpxchgq %1,%2\" : \"=a\" (prev) : \"q\" (ExChange),\"m\" (*Destination), \"0\" (Comperand) : \"memory\");\n      return prev;\n    }\n    __CRT_INLINE PVOID InterlockedExchangePointer(PVOID volatile *Target,PVOID Value) {\n      __asm__ __volatile(\"lock ; xchgq %0,%1\"\n\t: \"=r\"(Value)\n\t: \"m\"(*Target),\"0\"(Value)\n\t: \"memory\");\n      return Value;\n    }\n\n#define CacheLineFlush(Address) _mm_clflush(Address)\n\n    VOID _ReadWriteBarrier(VOID);\n\n#define FastFence __faststorefence\n#define LoadFence _mm_lfence\n#define MemoryFence _mm_mfence\n#define StoreFence _mm_sfence\n\n    VOID __faststorefence(VOID);\n    VOID _m_prefetchw(volatile CONST VOID *Source);\n\n//!__TINYC__: #include <intrin.h>\n\n#define YieldProcessor _mm_pause\n#define MemoryBarrier __faststorefence\n#define PreFetchCacheLine(l,a) _mm_prefetch((CHAR CONST *) a,l)\n#define PrefetchForWrite(p) _m_prefetchw(p)\n#define ReadForWriteAccess(p) (_m_prefetchw(p),*(p))\n\n#define PF_TEMPORAL_LEVEL_1 _MM_HINT_T0\n#define PF_TEMPORAL_LEVEL_2 _MM_HINT_T1\n#define PF_TEMPORAL_LEVEL_3 _MM_HINT_T2\n#define PF_NON_TEMPORAL_LEVEL_ALL _MM_HINT_NTA\n\n#define ReadMxCsr _mm_getcsr\n#define WriteMxCsr _mm_setcsr\n\n    VOID __int2c(VOID);\n\n#define DbgRaiseAssertionFailure() __int2c()\n#define GetCallersEflags() __getcallerseflags()\n\n    unsigned __int32 __getcallerseflags(VOID);\n\n#define GetSegmentLimit __segmentlimit\n\n    DWORD __segmentlimit(DWORD Selector);\n\n#define ReadTimeStampCounter() __rdtsc()\n\n    DWORD64 __rdtsc(VOID);\n    VOID __movsb(PBYTE Destination,BYTE const *Source,SIZE_T Count);\n    VOID __movsw(PWORD Destination,WORD const *Source,SIZE_T Count);\n    VOID __movsd(PDWORD Destination,DWORD const *Source,SIZE_T Count);\n    VOID __movsq(PDWORD64 Destination,DWORD64 const *Source,SIZE_T Count);\n    VOID __stosb(PBYTE Destination,BYTE Value,SIZE_T Count);\n    VOID __stosw(PWORD Destination,WORD Value,SIZE_T Count);\n    VOID __stosd(PDWORD Destination,DWORD Value,SIZE_T Count);\n    VOID __stosq(PDWORD64 Destination,DWORD64 Value,SIZE_T Count);\n\n#define MultiplyHigh __mulh\n#define UnsignedMultiplyHigh __umulh\n\n    LONGLONG MultiplyHigh(LONGLONG Multiplier,LONGLONG Multiplicand);\n    ULONGLONG UnsignedMultiplyHigh(ULONGLONG Multiplier,ULONGLONG Multiplicand);\n\n#define ShiftLeft128 __shiftleft128\n#define ShiftRight128 __shiftright128\n\n    DWORD64 ShiftLeft128(DWORD64 LowPart,DWORD64 HighPart,BYTE Shift);\n    DWORD64 ShiftRight128(DWORD64 LowPart,DWORD64 HighPart,BYTE Shift);\n\n#define Multiply128 _mul128\n\n    LONG64 Multiply128(LONG64 Multiplier,LONG64 Multiplicand,LONG64 *HighProduct);\n\n#define UnsignedMultiply128 _umul128\n\n    DWORD64 UnsignedMultiply128(DWORD64 Multiplier,DWORD64 Multiplicand,DWORD64 *HighProduct);\n\n    __CRT_INLINE LONG64 MultiplyExtract128(LONG64 Multiplier,LONG64 Multiplicand,BYTE Shift) {\n      LONG64 extractedProduct;\n      LONG64 highProduct;\n      LONG64 lowProduct;\n      lowProduct = Multiply128(Multiplier,Multiplicand,&highProduct);\n      extractedProduct = (LONG64)ShiftRight128((LONG64)lowProduct,(LONG64)highProduct,Shift);\n      return extractedProduct;\n    }\n\n    __CRT_INLINE DWORD64 UnsignedMultiplyExtract128(DWORD64 Multiplier,DWORD64 Multiplicand,BYTE Shift) {\n      DWORD64 extractedProduct;\n      DWORD64 highProduct;\n      DWORD64 lowProduct;\n      lowProduct = UnsignedMultiply128(Multiplier,Multiplicand,&highProduct);\n      extractedProduct = ShiftRight128(lowProduct,highProduct,Shift);\n      return extractedProduct;\n    }\n\n    __CRT_INLINE BYTE __readgsbyte(DWORD Offset) {\n      BYTE ret;\n      __asm__ volatile (\"movb\t%%gs:%1,%0\"\n\t: \"=r\" (ret) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n      return ret;\n    }\n    __CRT_INLINE WORD __readgsword(DWORD Offset) {\n      WORD ret;\n      __asm__ volatile (\"movw\t%%gs:%1,%0\"\n\t: \"=r\" (ret) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n      return ret;\n    }\n    __CRT_INLINE DWORD __readgsdword(DWORD Offset) {\n      DWORD ret;\n      __asm__ volatile (\"movl\t%%gs:%1,%0\"\n\t: \"=r\" (ret) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n      return ret;\n    }\n    __CRT_INLINE DWORD64 __readgsqword(DWORD Offset) {\n      void *ret;\n      __asm__ volatile (\"movq\t%%gs:%1,%0\"\n\t: \"=r\" (ret) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n      return (DWORD64) ret;\n    }\n    __CRT_INLINE VOID __writegsbyte(DWORD Offset,BYTE Data) {\n      __asm__ volatile (\"movb\t%0,%%gs:%1\"\n\t: \"=r\" (Data) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n    }\n    __CRT_INLINE VOID __writegsword(DWORD Offset,WORD Data) {\n      __asm__ volatile (\"movw\t%0,%%gs:%1\"\n\t: \"=r\" (Data) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n    }\n    __CRT_INLINE VOID __writegsdword(DWORD Offset,DWORD Data) {\n      __asm__ volatile (\"movl\t%0,%%gs:%1\"\n\t: \"=r\" (Data) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n    }\n    __CRT_INLINE VOID __writegsqword(DWORD Offset,DWORD64 Data) {\n      __asm__ volatile (\"movq\t%0,%%gs:%1\"\n\t: \"=r\" (Data) ,\"=m\" ((*(volatile long *) (DWORD64) Offset)));\n    }\n\n#ifdef __cplusplus\n  }\n#endif\n#endif\n\n#define EXCEPTION_READ_FAULT 0\n#define EXCEPTION_WRITE_FAULT 1\n#define EXCEPTION_EXECUTE_FAULT 8\n\n#if !defined(RC_INVOKED)\n\n#define CONTEXT_AMD64 0x100000\n\n#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)\n#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)\n#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)\n#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)\n#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)\n\n#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)\n#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)\n\n#define CONTEXT_EXCEPTION_ACTIVE 0x8000000\n#define CONTEXT_SERVICE_ACTIVE 0x10000000\n#define CONTEXT_EXCEPTION_REQUEST 0x40000000\n#define CONTEXT_EXCEPTION_REPORTING 0x80000000\n#endif\n\n#define INITIAL_MXCSR 0x1f80\n#define INITIAL_FPCSR 0x027f\n\n  typedef DECLSPEC_ALIGN(16) struct _M128A {\n    ULONGLONG Low;\n    LONGLONG High;\n  } M128A,*PM128A;\n\n  typedef struct _XMM_SAVE_AREA32 {\n    WORD ControlWord;\n    WORD StatusWord;\n    BYTE TagWord;\n    BYTE Reserved1;\n    WORD ErrorOpcode;\n    DWORD ErrorOffset;\n    WORD ErrorSelector;\n    WORD Reserved2;\n    DWORD DataOffset;\n    WORD DataSelector;\n    WORD Reserved3;\n    DWORD MxCsr;\n    DWORD MxCsr_Mask;\n    M128A FloatRegisters[8];\n    M128A XmmRegisters[16];\n    BYTE Reserved4[96];\n  } XMM_SAVE_AREA32,*PXMM_SAVE_AREA32;\n\n#define LEGACY_SAVE_AREA_LENGTH sizeof(XMM_SAVE_AREA32)\n\n  typedef DECLSPEC_ALIGN(16) struct _CONTEXT {\n    DWORD64 P1Home;\n    DWORD64 P2Home;\n    DWORD64 P3Home;\n    DWORD64 P4Home;\n    DWORD64 P5Home;\n    DWORD64 P6Home;\n    DWORD ContextFlags;\n    DWORD MxCsr;\n    WORD SegCs;\n    WORD SegDs;\n    WORD SegEs;\n    WORD SegFs;\n    WORD SegGs;\n    WORD SegSs;\n    DWORD EFlags;\n    DWORD64 Dr0;\n    DWORD64 Dr1;\n    DWORD64 Dr2;\n    DWORD64 Dr3;\n    DWORD64 Dr6;\n    DWORD64 Dr7;\n    DWORD64 Rax;\n    DWORD64 Rcx;\n    DWORD64 Rdx;\n    DWORD64 Rbx;\n    DWORD64 Rsp;\n    DWORD64 Rbp;\n    DWORD64 Rsi;\n    DWORD64 Rdi;\n    DWORD64 R8;\n    DWORD64 R9;\n    DWORD64 R10;\n    DWORD64 R11;\n    DWORD64 R12;\n    DWORD64 R13;\n    DWORD64 R14;\n    DWORD64 R15;\n    DWORD64 Rip;\n    union {\n      XMM_SAVE_AREA32 FltSave;\n      XMM_SAVE_AREA32 FloatSave;\n      struct {\n\tM128A Header[2];\n\tM128A Legacy[8];\n\tM128A Xmm0;\n\tM128A Xmm1;\n\tM128A Xmm2;\n\tM128A Xmm3;\n\tM128A Xmm4;\n\tM128A Xmm5;\n\tM128A Xmm6;\n\tM128A Xmm7;\n\tM128A Xmm8;\n\tM128A Xmm9;\n\tM128A Xmm10;\n\tM128A Xmm11;\n\tM128A Xmm12;\n\tM128A Xmm13;\n\tM128A Xmm14;\n\tM128A Xmm15;\n      };\n    };\n    M128A VectorRegister[26];\n    DWORD64 VectorControl;\n    DWORD64 DebugControl;\n    DWORD64 LastBranchToRip;\n    DWORD64 LastBranchFromRip;\n    DWORD64 LastExceptionToRip;\n    DWORD64 LastExceptionFromRip;\n  } CONTEXT,*PCONTEXT;\n\n#define RUNTIME_FUNCTION_INDIRECT 0x1\n\n  typedef struct _RUNTIME_FUNCTION {\n    DWORD BeginAddress;\n    DWORD EndAddress;\n    DWORD UnwindData;\n  } RUNTIME_FUNCTION,*PRUNTIME_FUNCTION;\n\n  typedef PRUNTIME_FUNCTION (*PGET_RUNTIME_FUNCTION_CALLBACK)(DWORD64 ControlPc,PVOID Context);\n  typedef DWORD (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK)(HANDLE Process,PVOID TableAddress,PDWORD Entries,PRUNTIME_FUNCTION *Functions);\n\n#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \"OutOfProcessFunctionTableCallback\"\n\n  NTSYSAPI VOID __cdecl RtlRestoreContext (PCONTEXT ContextRecord,struct _EXCEPTION_RECORD *ExceptionRecord);\n  NTSYSAPI BOOLEAN __cdecl RtlAddFunctionTable(PRUNTIME_FUNCTION FunctionTable,DWORD EntryCount,DWORD64 BaseAddress);\n  NTSYSAPI BOOLEAN __cdecl RtlInstallFunctionTableCallback(DWORD64 TableIdentifier,DWORD64 BaseAddress,DWORD Length,PGET_RUNTIME_FUNCTION_CALLBACK Callback,PVOID Context,PCWSTR OutOfProcessCallbackDll);\n  NTSYSAPI BOOLEAN __cdecl RtlDeleteFunctionTable(PRUNTIME_FUNCTION FunctionTable);\n#endif\n\n#ifdef I_X86_\n#if(defined(_X86_) && !defined(__x86_64)) && !defined(RC_INVOKED)\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n    __CRT_INLINE BOOLEAN InterlockedBitTestAndSet(LONG *Base,LONG Bit) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btsl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Bit));\n      return (BOOLEAN) (old!=0);\n    }\n\n    __CRT_INLINE BOOLEAN InterlockedBitTestAndReset(LONG *Base,LONG Bit) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btrl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Bit));\n      return (BOOLEAN) (old!=0);\n    }\n\n    __CRT_INLINE BOOLEAN InterlockedBitTestAndComplement(LONG *Base,LONG Bit) {\n      int old = 0;\n      __asm__ __volatile__(\"lock ; btcl %2,%1\\n\\tsbbl %0,%0 \"\n\t:\"=r\" (old),\"=m\" ((*(volatile long *) Base))\n\t:\"Ir\" (Bit));\n      return (BOOLEAN) (old!=0);\n    }\n\n#ifdef _PREFIX_\n    BYTE __readfsbyte(DWORD Offset);\n    WORD __readfsword(DWORD Offset);\n    DWORD __readfsdword(DWORD Offset);\n    VOID __writefsbyte(DWORD Offset,BYTE Data);\n    VOID __writefsword(DWORD Offset,WORD Data);\n    VOID __writefsdword(DWORD Offset,DWORD Data);\n#endif\n\n#ifdef __cplusplus\n  }\n#endif\n#endif\n\n#if(defined(_X86_) && !defined(__x86_64))\n  __CRT_INLINE VOID MemoryBarrier(VOID) {\n    LONG Barrier;\n    __asm__ __volatile__(\"xchgl %eax,%0 \"\n      :\"=r\" (Barrier));\n  }\n#define YieldProcessor() __asm__ __volatile__(\"rep nop \");\n\n#define PreFetchCacheLine(l,a)\n#define ReadForWriteAccess(p) (*(p))\n\n#define PF_TEMPORAL_LEVEL_1\n#define PF_NON_TEMPORAL_LEVEL_ALL\n\n  __CRT_INLINE VOID DbgRaiseAssertionFailure(void) {\n    __asm__ __volatile__(\"int 0x2c \");\n  }\n  PVOID GetCurrentFiber(void);\n  __CRT_INLINE PVOID GetCurrentFiber(void)\n  {\n    void *ret;\n    __asm__ volatile (\"movl\t%%fs:0x10,%0\"\n\t: \"=r\" (ret));\n    return ret;\n  }\n  PVOID GetFiberData(void);\n  __CRT_INLINE PVOID GetFiberData(void)\n  {\n    void *ret;\n    __asm__ volatile (\"movl\t%%fs:0x10,%0\\n\"\n\t\"movl\t(%0),%0\"\n\t: \"=r\" (ret));\n    return ret;\n  }\n#endif\n\n#define EXCEPTION_READ_FAULT 0\n#define EXCEPTION_WRITE_FAULT 1\n#define EXCEPTION_EXECUTE_FAULT 8\n\n#define SIZE_OF_80387_REGISTERS 80\n\n#if !defined(RC_INVOKED)\n\n#define CONTEXT_i386 0x00010000\n#define CONTEXT_i486 0x00010000\n\n#define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L)\n#define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L)\n#define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x00000004L)\n#define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x00000008L)\n#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L)\n#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x00000020L)\n\n#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)\n\n#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)\n#endif\n\n#define MAXIMUM_SUPPORTED_EXTENSION 512\n\n    typedef struct _FLOATING_SAVE_AREA {\n      DWORD ControlWord;\n      DWORD StatusWord;\n      DWORD TagWord;\n      DWORD ErrorOffset;\n      DWORD ErrorSelector;\n      DWORD DataOffset;\n      DWORD DataSelector;\n      BYTE RegisterArea[SIZE_OF_80387_REGISTERS];\n      DWORD Cr0NpxState;\n    } FLOATING_SAVE_AREA;\n\n    typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;\n\n    typedef struct _CONTEXT {\n      DWORD ContextFlags;\n      DWORD Dr0;\n      DWORD Dr1;\n      DWORD Dr2;\n      DWORD Dr3;\n      DWORD Dr6;\n      DWORD Dr7;\n      FLOATING_SAVE_AREA FloatSave;\n      DWORD SegGs;\n      DWORD SegFs;\n      DWORD SegEs;\n      DWORD SegDs;\n\n      DWORD Edi;\n      DWORD Esi;\n      DWORD Ebx;\n      DWORD Edx;\n      DWORD Ecx;\n      DWORD Eax;\n      DWORD Ebp;\n      DWORD Eip;\n      DWORD SegCs;\n      DWORD EFlags;\n      DWORD Esp;\n      DWORD SegSs;\n      BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];\n    } CONTEXT;\n\n    typedef CONTEXT *PCONTEXT;\n#endif\n\n#ifndef _LDT_ENTRY_DEFINED\n#define _LDT_ENTRY_DEFINED\n\n    typedef struct _LDT_ENTRY {\n      WORD LimitLow;\n      WORD BaseLow;\n      union {\n\tstruct {\n\t  BYTE BaseMid;\n\t  BYTE Flags1;\n\t  BYTE Flags2;\n\t  BYTE BaseHi;\n\t} Bytes;\n\tstruct {\n\t  DWORD BaseMid : 8;\n\t  DWORD Type : 5;\n\t  DWORD Dpl : 2;\n\t  DWORD Pres : 1;\n\t  DWORD LimitHi : 4;\n\t  DWORD Sys : 1;\n\t  DWORD Reserved_0 : 1;\n\t  DWORD Default_Big : 1;\n\t  DWORD Granularity : 1;\n\t  DWORD BaseHi : 8;\n\t} Bits;\n      } HighWord;\n    } LDT_ENTRY,*PLDT_ENTRY;\n#endif\n\n#if defined(__ia64__) && !defined(RC_INVOKED)\n\n#ifdef __cplusplus\n    extern \"C\" {\n#endif\n\n      BOOLEAN BitScanForward64(DWORD *Index,DWORD64 Mask);\n      BOOLEAN BitScanReverse64(DWORD *Index,DWORD64 Mask);\n\n#ifdef __cplusplus\n    }\n#endif\n#endif\n\n#if !defined(GENUTIL) && !defined(_GENIA64_) && defined(_IA64_)\n\n    void *_cdecl _rdteb(void);\n#ifdef __ia64__\n\n#define NtCurrentTeb() ((struct _TEB *)_rdteb())\n#define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)\n#define GetFiberData() (*(PVOID *)(GetCurrentFiber()))\n\n#ifdef __cplusplus\n    extern \"C\" {\n#endif\n\n      void __break(int);\n      void __yield(void);\n      void __mf(void);\n      void __lfetch(int Level,VOID CONST *Address);\n      void __lfetchfault(int Level,VOID CONST *Address);\n      void __lfetch_excl(int Level,VOID CONST *Address);\n      void __lfetchfault_excl(int Level,VOID CONST *Address);\n\n#define MD_LFHINT_NONE 0x00\n#define MD_LFHINT_NT1 0x01\n#define MD_LFHINT_NT2 0x02\n#define MD_LFHINT_NTA 0x03\n\n#ifdef __cplusplus\n    }\n#endif\n\n#define YieldProcessor __yield\n#define MemoryBarrier __mf\n#define PreFetchCacheLine __lfetch\n#define ReadForWriteAccess(p) (*(p))\n#define DbgRaiseAssertionFailure() __break(ASSERT_BREAKPOINT)\n\n#define PF_TEMPORAL_LEVEL_1 MD_LFHINT_NONE\n#define PF_NON_TEMPORAL_LEVEL_ALL MD_LFHINT_NTA\n\n#define UnsignedMultiplyHigh __UMULH\n\n    ULONGLONG UnsignedMultiplyHigh(ULONGLONG Multiplier,ULONGLONG Multiplicand);\n#else\n    struct _TEB *NtCurrentTeb(void);\n#endif\n#endif\n\n#ifdef _IA64_\n\n#define EXCEPTION_READ_FAULT 0\n#define EXCEPTION_WRITE_FAULT 1\n#define EXCEPTION_EXECUTE_FAULT 2\n\n#if !defined(RC_INVOKED)\n\n#define CONTEXT_IA64 0x00080000\n\n#define CONTEXT_CONTROL (CONTEXT_IA64 | 0x00000001L)\n#define CONTEXT_LOWER_FLOATING_POINT (CONTEXT_IA64 | 0x00000002L)\n#define CONTEXT_HIGHER_FLOATING_POINT (CONTEXT_IA64 | 0x00000004L)\n#define CONTEXT_INTEGER (CONTEXT_IA64 | 0x00000008L)\n#define CONTEXT_DEBUG (CONTEXT_IA64 | 0x00000010L)\n#define CONTEXT_IA32_CONTROL (CONTEXT_IA64 | 0x00000020L)\n\n#define CONTEXT_FLOATING_POINT (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT)\n#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL)\n#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_DEBUG | CONTEXT_IA32_CONTROL)\n\n#define CONTEXT_EXCEPTION_ACTIVE 0x8000000\n#define CONTEXT_SERVICE_ACTIVE 0x10000000\n#define CONTEXT_EXCEPTION_REQUEST 0x40000000\n#define CONTEXT_EXCEPTION_REPORTING 0x80000000\n#endif\n\n    typedef struct _CONTEXT {\n      DWORD ContextFlags;\n      DWORD Fill1[3];\n      ULONGLONG DbI0;\n      ULONGLONG DbI1;\n      ULONGLONG DbI2;\n      ULONGLONG DbI3;\n      ULONGLONG DbI4;\n      ULONGLONG DbI5;\n      ULONGLONG DbI6;\n      ULONGLONG DbI7;\n      ULONGLONG DbD0;\n      ULONGLONG DbD1;\n      ULONGLONG DbD2;\n      ULONGLONG DbD3;\n      ULONGLONG DbD4;\n      ULONGLONG DbD5;\n      ULONGLONG DbD6;\n      ULONGLONG DbD7;\n      FLOAT128 FltS0;\n      FLOAT128 FltS1;\n      FLOAT128 FltS2;\n      FLOAT128 FltS3;\n      FLOAT128 FltT0;\n      FLOAT128 FltT1;\n      FLOAT128 FltT2;\n      FLOAT128 FltT3;\n      FLOAT128 FltT4;\n      FLOAT128 FltT5;\n      FLOAT128 FltT6;\n      FLOAT128 FltT7;\n      FLOAT128 FltT8;\n      FLOAT128 FltT9;\n      FLOAT128 FltS4;\n      FLOAT128 FltS5;\n      FLOAT128 FltS6;\n      FLOAT128 FltS7;\n      FLOAT128 FltS8;\n      FLOAT128 FltS9;\n      FLOAT128 FltS10;\n      FLOAT128 FltS11;\n      FLOAT128 FltS12;\n      FLOAT128 FltS13;\n      FLOAT128 FltS14;\n      FLOAT128 FltS15;\n      FLOAT128 FltS16;\n      FLOAT128 FltS17;\n      FLOAT128 FltS18;\n      FLOAT128 FltS19;\n      FLOAT128 FltF32;\n      FLOAT128 FltF33;\n      FLOAT128 FltF34;\n      FLOAT128 FltF35;\n      FLOAT128 FltF36;\n      FLOAT128 FltF37;\n      FLOAT128 FltF38;\n      FLOAT128 FltF39;\n      FLOAT128 FltF40;\n      FLOAT128 FltF41;\n      FLOAT128 FltF42;\n      FLOAT128 FltF43;\n      FLOAT128 FltF44;\n      FLOAT128 FltF45;\n      FLOAT128 FltF46;\n      FLOAT128 FltF47;\n      FLOAT128 FltF48;\n      FLOAT128 FltF49;\n      FLOAT128 FltF50;\n      FLOAT128 FltF51;\n      FLOAT128 FltF52;\n      FLOAT128 FltF53;\n      FLOAT128 FltF54;\n      FLOAT128 FltF55;\n      FLOAT128 FltF56;\n      FLOAT128 FltF57;\n      FLOAT128 FltF58;\n      FLOAT128 FltF59;\n      FLOAT128 FltF60;\n      FLOAT128 FltF61;\n      FLOAT128 FltF62;\n      FLOAT128 FltF63;\n      FLOAT128 FltF64;\n      FLOAT128 FltF65;\n      FLOAT128 FltF66;\n      FLOAT128 FltF67;\n      FLOAT128 FltF68;\n      FLOAT128 FltF69;\n      FLOAT128 FltF70;\n      FLOAT128 FltF71;\n      FLOAT128 FltF72;\n      FLOAT128 FltF73;\n      FLOAT128 FltF74;\n      FLOAT128 FltF75;\n      FLOAT128 FltF76;\n      FLOAT128 FltF77;\n      FLOAT128 FltF78;\n      FLOAT128 FltF79;\n      FLOAT128 FltF80;\n      FLOAT128 FltF81;\n      FLOAT128 FltF82;\n      FLOAT128 FltF83;\n      FLOAT128 FltF84;\n      FLOAT128 FltF85;\n      FLOAT128 FltF86;\n      FLOAT128 FltF87;\n      FLOAT128 FltF88;\n      FLOAT128 FltF89;\n      FLOAT128 FltF90;\n      FLOAT128 FltF91;\n      FLOAT128 FltF92;\n      FLOAT128 FltF93;\n      FLOAT128 FltF94;\n      FLOAT128 FltF95;\n      FLOAT128 FltF96;\n      FLOAT128 FltF97;\n      FLOAT128 FltF98;\n      FLOAT128 FltF99;\n      FLOAT128 FltF100;\n      FLOAT128 FltF101;\n      FLOAT128 FltF102;\n      FLOAT128 FltF103;\n      FLOAT128 FltF104;\n      FLOAT128 FltF105;\n      FLOAT128 FltF106;\n      FLOAT128 FltF107;\n      FLOAT128 FltF108;\n      FLOAT128 FltF109;\n      FLOAT128 FltF110;\n      FLOAT128 FltF111;\n      FLOAT128 FltF112;\n      FLOAT128 FltF113;\n      FLOAT128 FltF114;\n      FLOAT128 FltF115;\n      FLOAT128 FltF116;\n      FLOAT128 FltF117;\n      FLOAT128 FltF118;\n      FLOAT128 FltF119;\n      FLOAT128 FltF120;\n      FLOAT128 FltF121;\n      FLOAT128 FltF122;\n      FLOAT128 FltF123;\n      FLOAT128 FltF124;\n      FLOAT128 FltF125;\n      FLOAT128 FltF126;\n      FLOAT128 FltF127;\n      ULONGLONG StFPSR;\n      ULONGLONG IntGp;\n      ULONGLONG IntT0;\n      ULONGLONG IntT1;\n      ULONGLONG IntS0;\n      ULONGLONG IntS1;\n      ULONGLONG IntS2;\n      ULONGLONG IntS3;\n      ULONGLONG IntV0;\n      ULONGLONG IntT2;\n      ULONGLONG IntT3;\n      ULONGLONG IntT4;\n      ULONGLONG IntSp;\n      ULONGLONG IntTeb;\n      ULONGLONG IntT5;\n      ULONGLONG IntT6;\n      ULONGLONG IntT7;\n      ULONGLONG IntT8;\n      ULONGLONG IntT9;\n      ULONGLONG IntT10;\n      ULONGLONG IntT11;\n      ULONGLONG IntT12;\n      ULONGLONG IntT13;\n      ULONGLONG IntT14;\n      ULONGLONG IntT15;\n      ULONGLONG IntT16;\n      ULONGLONG IntT17;\n      ULONGLONG IntT18;\n      ULONGLONG IntT19;\n      ULONGLONG IntT20;\n      ULONGLONG IntT21;\n      ULONGLONG IntT22;\n      ULONGLONG IntNats;\n      ULONGLONG Preds;\n      ULONGLONG BrRp;\n      ULONGLONG BrS0;\n      ULONGLONG BrS1;\n      ULONGLONG BrS2;\n      ULONGLONG BrS3;\n      ULONGLONG BrS4;\n      ULONGLONG BrT0;\n      ULONGLONG BrT1;\n      ULONGLONG ApUNAT;\n      ULONGLONG ApLC;\n      ULONGLONG ApEC;\n      ULONGLONG ApCCV;\n      ULONGLONG ApDCR;\n      ULONGLONG RsPFS;\n      ULONGLONG RsBSP;\n      ULONGLONG RsBSPSTORE;\n      ULONGLONG RsRSC;\n      ULONGLONG RsRNAT;\n      ULONGLONG StIPSR;\n      ULONGLONG StIIP;\n      ULONGLONG StIFS;\n      ULONGLONG StFCR;\n      ULONGLONG Eflag;\n      ULONGLONG SegCSD;\n      ULONGLONG SegSSD;\n      ULONGLONG Cflag;\n      ULONGLONG StFSR;\n      ULONGLONG StFIR;\n      ULONGLONG StFDR;\n      ULONGLONG UNUSEDPACK;\n    } CONTEXT,*PCONTEXT;\n\n    typedef struct _PLABEL_DESCRIPTOR {\n      ULONGLONG EntryPoint;\n      ULONGLONG GlobalPointer;\n    } PLABEL_DESCRIPTOR,*PPLABEL_DESCRIPTOR;\n\n    typedef struct _RUNTIME_FUNCTION {\n      DWORD BeginAddress;\n      DWORD EndAddress;\n      DWORD UnwindInfoAddress;\n    } RUNTIME_FUNCTION,*PRUNTIME_FUNCTION;\n\n    typedef PRUNTIME_FUNCTION (*PGET_RUNTIME_FUNCTION_CALLBACK)(DWORD64 ControlPc,PVOID Context);\n    typedef DWORD (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK)(HANDLE Process,PVOID TableAddress,PDWORD Entries,PRUNTIME_FUNCTION *Functions);\n\n#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \"OutOfProcessFunctionTableCallback\"\n\n    BOOLEAN RtlAddFunctionTable(PRUNTIME_FUNCTION FunctionTable,DWORD EntryCount,ULONGLONG BaseAddress,ULONGLONG TargetGp);\n    BOOLEAN RtlInstallFunctionTableCallback(DWORD64 TableIdentifier,DWORD64 BaseAddress,DWORD Length,DWORD64 TargetGp,PGET_RUNTIME_FUNCTION_CALLBACK Callback,PVOID Context,PCWSTR OutOfProcessCallbackDll);\n    BOOLEAN RtlDeleteFunctionTable(PRUNTIME_FUNCTION FunctionTable);\n    VOID RtlRestoreContext (PCONTEXT ContextRecord,struct _EXCEPTION_RECORD *ExceptionRecord);\n    VOID __jump_unwind(ULONGLONG TargetMsFrame,ULONGLONG TargetBsFrame,ULONGLONG TargetPc);\n#endif\n\n#define EXCEPTION_NONCONTINUABLE 0x1\n#define EXCEPTION_MAXIMUM_PARAMETERS 15\n\n    typedef struct _EXCEPTION_RECORD {\n      DWORD ExceptionCode;\n      DWORD ExceptionFlags;\n      struct _EXCEPTION_RECORD *ExceptionRecord;\n      PVOID ExceptionAddress;\n      DWORD NumberParameters;\n      ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];\n    } EXCEPTION_RECORD;\n\n    typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;\n\n    typedef struct _EXCEPTION_RECORD32 {\n      DWORD ExceptionCode;\n      DWORD ExceptionFlags;\n      DWORD ExceptionRecord;\n      DWORD ExceptionAddress;\n      DWORD NumberParameters;\n      DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];\n    } EXCEPTION_RECORD32,*PEXCEPTION_RECORD32;\n\n    typedef struct _EXCEPTION_RECORD64 {\n      DWORD ExceptionCode;\n      DWORD ExceptionFlags;\n      DWORD64 ExceptionRecord;\n      DWORD64 ExceptionAddress;\n      DWORD NumberParameters;\n      DWORD __unusedAlignment;\n      DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];\n    } EXCEPTION_RECORD64,*PEXCEPTION_RECORD64;\n\n    typedef struct _EXCEPTION_POINTERS {\n      PEXCEPTION_RECORD ExceptionRecord;\n      PCONTEXT ContextRecord;\n    } EXCEPTION_POINTERS,*PEXCEPTION_POINTERS;\n    typedef PVOID PACCESS_TOKEN;\n    typedef PVOID PSECURITY_DESCRIPTOR;\n    typedef PVOID PSID;\n\n    typedef DWORD ACCESS_MASK;\n    typedef ACCESS_MASK *PACCESS_MASK;\n\n#define DELETE (0x00010000L)\n#define READ_CONTROL (0x00020000L)\n#define WRITE_DAC (0x00040000L)\n#define WRITE_OWNER (0x00080000L)\n#define SYNCHRONIZE (0x00100000L)\n\n#define STANDARD_RIGHTS_REQUIRED (0x000F0000L)\n#define STANDARD_RIGHTS_READ (READ_CONTROL)\n#define STANDARD_RIGHTS_WRITE (READ_CONTROL)\n#define STANDARD_RIGHTS_EXECUTE (READ_CONTROL)\n#define STANDARD_RIGHTS_ALL (0x001F0000L)\n\n#define SPECIFIC_RIGHTS_ALL (0x0000FFFFL)\n\n#define ACCESS_SYSTEM_SECURITY (0x01000000L)\n\n#define MAXIMUM_ALLOWED (0x02000000L)\n\n#define GENERIC_READ (0x80000000L)\n#define GENERIC_WRITE (0x40000000L)\n#define GENERIC_EXECUTE (0x20000000L)\n#define GENERIC_ALL (0x10000000L)\n\n    typedef struct _GENERIC_MAPPING {\n      ACCESS_MASK GenericRead;\n      ACCESS_MASK GenericWrite;\n      ACCESS_MASK GenericExecute;\n      ACCESS_MASK GenericAll;\n    } GENERIC_MAPPING;\n    typedef GENERIC_MAPPING *PGENERIC_MAPPING;\n\n#include <pshpack4.h>\n\n    typedef struct _LUID_AND_ATTRIBUTES {\n      LUID Luid;\n      DWORD Attributes;\n    } LUID_AND_ATTRIBUTES,*PLUID_AND_ATTRIBUTES;\n    typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];\n    typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;\n\n#include <poppack.h>\n\n#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED\n#define SID_IDENTIFIER_AUTHORITY_DEFINED\n    typedef struct _SID_IDENTIFIER_AUTHORITY {\n      BYTE Value[6];\n    } SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY;\n#endif\n\n#ifndef SID_DEFINED\n#define SID_DEFINED\n    typedef struct _SID {\n      BYTE Revision;\n      BYTE SubAuthorityCount;\n      SID_IDENTIFIER_AUTHORITY IdentifierAuthority;\n      DWORD SubAuthority[ANYSIZE_ARRAY];\n    } SID,*PISID;\n#endif\n\n#define SID_REVISION (1)\n#define SID_MAX_SUB_AUTHORITIES (15)\n#define SID_RECOMMENDED_SUB_AUTHORITIES (1)\n\n#define SECURITY_MAX_SID_SIZE (sizeof(SID) - sizeof(DWORD) + (SID_MAX_SUB_AUTHORITIES *sizeof(DWORD)))\n\n    typedef enum _SID_NAME_USE {\n      SidTypeUser = 1,SidTypeGroup,SidTypeDomain,SidTypeAlias,SidTypeWellKnownGroup,SidTypeDeletedAccount,SidTypeInvalid,SidTypeUnknown,SidTypeComputer\n    } SID_NAME_USE,*PSID_NAME_USE;\n\n    typedef struct _SID_AND_ATTRIBUTES {\n      PSID Sid;\n      DWORD Attributes;\n    } SID_AND_ATTRIBUTES,*PSID_AND_ATTRIBUTES;\n\n    typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];\n    typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;\n\n#define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0}\n#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1}\n#define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2}\n#define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3}\n#define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4}\n#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}\n\n#define SECURITY_NULL_RID (0x00000000L)\n#define SECURITY_WORLD_RID (0x00000000L)\n#define SECURITY_LOCAL_RID (0x00000000L)\n\n#define SECURITY_CREATOR_OWNER_RID (0x00000000L)\n#define SECURITY_CREATOR_GROUP_RID (0x00000001L)\n\n#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)\n#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)\n\n#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5}\n\n#define SECURITY_DIALUP_RID (0x00000001L)\n#define SECURITY_NETWORK_RID (0x00000002L)\n#define SECURITY_BATCH_RID (0x00000003L)\n#define SECURITY_INTERACTIVE_RID (0x00000004L)\n#define SECURITY_LOGON_IDS_RID (0x00000005L)\n#define SECURITY_LOGON_IDS_RID_COUNT (3L)\n#define SECURITY_SERVICE_RID (0x00000006L)\n#define SECURITY_ANONYMOUS_LOGON_RID (0x00000007L)\n#define SECURITY_PROXY_RID (0x00000008L)\n#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)\n#define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID\n#define SECURITY_PRINCIPAL_SELF_RID (0x0000000AL)\n#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)\n#define SECURITY_RESTRICTED_CODE_RID (0x0000000CL)\n#define SECURITY_TERMINAL_SERVER_RID (0x0000000DL)\n#define SECURITY_REMOTE_LOGON_RID (0x0000000EL)\n#define SECURITY_THIS_ORGANIZATION_RID (0x0000000FL)\n#define SECURITY_IUSER_RID (0x00000011L)\n\n#define SECURITY_LOCAL_SYSTEM_RID (0x00000012L)\n#define SECURITY_LOCAL_SERVICE_RID (0x00000013L)\n#define SECURITY_NETWORK_SERVICE_RID (0x00000014L)\n\n#define SECURITY_NT_NON_UNIQUE (0x00000015L)\n#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT (3L)\n\n#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)\n\n#define SECURITY_BUILTIN_DOMAIN_RID (0x00000020L)\n#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)\n\n#define SECURITY_PACKAGE_BASE_RID (0x00000040L)\n#define SECURITY_PACKAGE_RID_COUNT (2L)\n#define SECURITY_PACKAGE_NTLM_RID (0x0000000AL)\n#define SECURITY_PACKAGE_SCHANNEL_RID (0x0000000EL)\n#define SECURITY_PACKAGE_DIGEST_RID (0x00000015L)\n\n#define SECURITY_SERVICE_ID_BASE_RID (0x00000050L)\n#define SECURITY_SERVICE_ID_RID_COUNT (6L)\n\n#define SECURITY_RESERVED_ID_BASE_RID (0x00000051L)\n\n#define SECURITY_MAX_ALWAYS_FILTERED (0x000003E7L)\n#define SECURITY_MIN_NEVER_FILTERED (0x000003E8L)\n\n#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)\n\n#define FOREST_USER_RID_MAX (0x000001F3L)\n\n#define DOMAIN_USER_RID_ADMIN (0x000001F4L)\n#define DOMAIN_USER_RID_GUEST (0x000001F5L)\n#define DOMAIN_USER_RID_KRBTGT (0x000001F6L)\n\n#define DOMAIN_USER_RID_MAX (0x000003E7L)\n\n#define DOMAIN_GROUP_RID_ADMINS (0x00000200L)\n#define DOMAIN_GROUP_RID_USERS (0x00000201L)\n#define DOMAIN_GROUP_RID_GUESTS (0x00000202L)\n#define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L)\n#define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L)\n#define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L)\n#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)\n#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)\n#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)\n#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)\n\n#define DOMAIN_ALIAS_RID_ADMINS (0x00000220L)\n#define DOMAIN_ALIAS_RID_USERS (0x00000221L)\n#define DOMAIN_ALIAS_RID_GUESTS (0x00000222L)\n#define DOMAIN_ALIAS_RID_POWER_USERS (0x00000223L)\n\n#define DOMAIN_ALIAS_RID_ACCOUNT_OPS (0x00000224L)\n#define DOMAIN_ALIAS_RID_SYSTEM_OPS (0x00000225L)\n#define DOMAIN_ALIAS_RID_PRINT_OPS (0x00000226L)\n#define DOMAIN_ALIAS_RID_BACKUP_OPS (0x00000227L)\n\n#define DOMAIN_ALIAS_RID_REPLICATOR (0x00000228L)\n#define DOMAIN_ALIAS_RID_RAS_SERVERS (0x00000229L)\n#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS (0x0000022AL)\n#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS (0x0000022BL)\n#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS (0x0000022CL)\n#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)\n\n#define DOMAIN_ALIAS_RID_MONITORING_USERS (0x0000022EL)\n#define DOMAIN_ALIAS_RID_LOGGING_USERS (0x0000022FL)\n#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS (0x00000230L)\n#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS (0x00000231L)\n#define DOMAIN_ALIAS_RID_DCOM_USERS (0x00000232L)\n\n#define DOMAIN_ALIAS_RID_IUSERS (0x00000238L)\n#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS (0x00000239L)\n#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP (0x0000023BL)\n#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)\n#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP (0x0000023DL)\n\n#define SECURITY_MANDATORY_LABEL_AUTHORITY {0,0,0,0,0,16}\n#define SECURITY_MANDATORY_UNTRUSTED_RID (0x00000000L)\n#define SECURITY_MANDATORY_LOW_RID (0x00001000L)\n#define SECURITY_MANDATORY_MEDIUM_RID (0x00002000L)\n#define SECURITY_MANDATORY_HIGH_RID (0x00003000L)\n#define SECURITY_MANDATORY_SYSTEM_RID (0x00004000L)\n#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID (0x00005000L)\n\n#define SECURITY_MANDATORY_MAXIMUM_USER_RID SECURITY_MANDATORY_SYSTEM_RID\n\n#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)\n\n    typedef enum {\n      WinNullSid = 0,WinWorldSid = 1,WinLocalSid = 2,WinCreatorOwnerSid = 3,WinCreatorGroupSid = 4,WinCreatorOwnerServerSid = 5,WinCreatorGroupServerSid = 6,WinNtAuthoritySid = 7,WinDialupSid = 8,WinNetworkSid = 9,WinBatchSid = 10,WinInteractiveSid = 11,WinServiceSid = 12,WinAnonymousSid = 13,WinProxySid = 14,WinEnterpriseControllersSid = 15,WinSelfSid = 16,WinAuthenticatedUserSid = 17,WinRestrictedCodeSid = 18,WinTerminalServerSid = 19,WinRemoteLogonIdSid = 20,WinLogonIdsSid = 21,WinLocalSystemSid = 22,WinLocalServiceSid = 23,WinNetworkServiceSid = 24,WinBuiltinDomainSid = 25,WinBuiltinAdministratorsSid = 26,WinBuiltinUsersSid = 27,WinBuiltinGuestsSid = 28,WinBuiltinPowerUsersSid = 29,WinBuiltinAccountOperatorsSid = 30,WinBuiltinSystemOperatorsSid = 31,WinBuiltinPrintOperatorsSid = 32,WinBuiltinBackupOperatorsSid = 33,WinBuiltinReplicatorSid = 34,WinBuiltinPreWindows2000CompatibleAccessSid = 35,WinBuiltinRemoteDesktopUsersSid = 36,WinBuiltinNetworkConfigurationOperatorsSid = 37,WinAccountAdministratorSid = 38,WinAccountGuestSid = 39,WinAccountKrbtgtSid = 40,WinAccountDomainAdminsSid = 41,WinAccountDomainUsersSid = 42,WinAccountDomainGuestsSid = 43,WinAccountComputersSid = 44,WinAccountControllersSid = 45,WinAccountCertAdminsSid = 46,WinAccountSchemaAdminsSid = 47,WinAccountEnterpriseAdminsSid = 48,WinAccountPolicyAdminsSid = 49,WinAccountRasAndIasServersSid = 50,WinNTLMAuthenticationSid = 51,WinDigestAuthenticationSid = 52,WinSChannelAuthenticationSid = 53,WinThisOrganizationSid = 54,WinOtherOrganizationSid = 55,WinBuiltinIncomingForestTrustBuildersSid = 56,WinBuiltinPerfMonitoringUsersSid = 57,WinBuiltinPerfLoggingUsersSid = 58,WinBuiltinAuthorizationAccessSid = 59,WinBuiltinTerminalServerLicenseServersSid = 60,WinBuiltinDCOMUsersSid = 61\n    } WELL_KNOWN_SID_TYPE;\n\n#define SYSTEM_LUID { 0x3E7,0x0 }\n#define ANONYMOUS_LOGON_LUID { 0x3e6,0x0 }\n#define LOCALSERVICE_LUID { 0x3e5,0x0 }\n#define NETWORKSERVICE_LUID { 0x3e4,0x0 }\n#define IUSER_LUID { 0x3e3, 0x0 }\n\n#define SE_GROUP_MANDATORY (0x00000001L)\n#define SE_GROUP_ENABLED_BY_DEFAULT (0x00000002L)\n#define SE_GROUP_ENABLED (0x00000004L)\n#define SE_GROUP_OWNER (0x00000008L)\n#define SE_GROUP_USE_FOR_DENY_ONLY (0x00000010L)\n#define SE_GROUP_INTEGRITY (0x00000020L)\n#define SE_GROUP_INTEGRITY_ENABLED (0x00000040L)\n#define SE_GROUP_LOGON_ID (0xC0000000L)\n#define SE_GROUP_RESOURCE (0x20000000L)\n\n#define ACL_REVISION (2)\n#define ACL_REVISION_DS (4)\n\n#define ACL_REVISION1 (1)\n#define MIN_ACL_REVISION ACL_REVISION2\n#define ACL_REVISION2 (2)\n#define ACL_REVISION3 (3)\n#define ACL_REVISION4 (4)\n#define MAX_ACL_REVISION ACL_REVISION4\n\n    typedef struct _ACL {\n      BYTE AclRevision;\n      BYTE Sbz1;\n      WORD AclSize;\n      WORD AceCount;\n      WORD Sbz2;\n    } ACL;\n    typedef ACL *PACL;\n\n    typedef struct _ACE_HEADER {\n      BYTE AceType;\n      BYTE AceFlags;\n      WORD AceSize;\n    } ACE_HEADER;\n    typedef ACE_HEADER *PACE_HEADER;\n\n#define ACCESS_MIN_MS_ACE_TYPE (0x0)\n#define ACCESS_ALLOWED_ACE_TYPE (0x0)\n#define ACCESS_DENIED_ACE_TYPE (0x1)\n#define SYSTEM_AUDIT_ACE_TYPE (0x2)\n#define SYSTEM_ALARM_ACE_TYPE (0x3)\n#define ACCESS_MAX_MS_V2_ACE_TYPE (0x3)\n\n#define ACCESS_ALLOWED_COMPOUND_ACE_TYPE (0x4)\n#define ACCESS_MAX_MS_V3_ACE_TYPE (0x4)\n\n#define ACCESS_MIN_MS_OBJECT_ACE_TYPE (0x5)\n#define ACCESS_ALLOWED_OBJECT_ACE_TYPE (0x5)\n#define ACCESS_DENIED_OBJECT_ACE_TYPE (0x6)\n#define SYSTEM_AUDIT_OBJECT_ACE_TYPE (0x7)\n#define SYSTEM_ALARM_OBJECT_ACE_TYPE (0x8)\n#define ACCESS_MAX_MS_OBJECT_ACE_TYPE (0x8)\n\n#define ACCESS_MAX_MS_V4_ACE_TYPE (0x8)\n#define ACCESS_MAX_MS_ACE_TYPE (0x8)\n\n#define ACCESS_ALLOWED_CALLBACK_ACE_TYPE (0x9)\n#define ACCESS_DENIED_CALLBACK_ACE_TYPE (0xA)\n#define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)\n#define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE (0xC)\n#define SYSTEM_AUDIT_CALLBACK_ACE_TYPE (0xD)\n#define SYSTEM_ALARM_CALLBACK_ACE_TYPE (0xE)\n#define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE (0xF)\n#define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE (0x10)\n\n#define SYSTEM_MANDATORY_LABEL_ACE_TYPE (0x11)\n#define ACCESS_MAX_MS_V5_ACE_TYPE (0x11)\n\n#define OBJECT_INHERIT_ACE (0x1)\n#define CONTAINER_INHERIT_ACE (0x2)\n#define NO_PROPAGATE_INHERIT_ACE (0x4)\n#define INHERIT_ONLY_ACE (0x8)\n#define INHERITED_ACE (0x10)\n#define VALID_INHERIT_FLAGS (0x1F)\n\n#define SUCCESSFUL_ACCESS_ACE_FLAG (0x40)\n#define FAILED_ACCESS_ACE_FLAG (0x80)\n\n    typedef struct _ACCESS_ALLOWED_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n    } ACCESS_ALLOWED_ACE;\n\n    typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;\n\n    typedef struct _ACCESS_DENIED_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n    } ACCESS_DENIED_ACE;\n    typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;\n\n    typedef struct _SYSTEM_AUDIT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n    } SYSTEM_AUDIT_ACE;\n    typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;\n\n    typedef struct _SYSTEM_ALARM_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n    } SYSTEM_ALARM_ACE;\n    typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;\n\n    typedef struct _ACCESS_ALLOWED_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n    } ACCESS_ALLOWED_OBJECT_ACE,*PACCESS_ALLOWED_OBJECT_ACE;\n\n    typedef struct _ACCESS_DENIED_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n    } ACCESS_DENIED_OBJECT_ACE,*PACCESS_DENIED_OBJECT_ACE;\n\n    typedef struct _SYSTEM_AUDIT_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n    } SYSTEM_AUDIT_OBJECT_ACE,*PSYSTEM_AUDIT_OBJECT_ACE;\n\n    typedef struct _SYSTEM_ALARM_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n    } SYSTEM_ALARM_OBJECT_ACE,*PSYSTEM_ALARM_OBJECT_ACE;\n\n    typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n\n    } ACCESS_ALLOWED_CALLBACK_ACE,*PACCESS_ALLOWED_CALLBACK_ACE;\n\n    typedef struct _ACCESS_DENIED_CALLBACK_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n\n    } ACCESS_DENIED_CALLBACK_ACE,*PACCESS_DENIED_CALLBACK_ACE;\n\n    typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n\n    } SYSTEM_AUDIT_CALLBACK_ACE,*PSYSTEM_AUDIT_CALLBACK_ACE;\n\n    typedef struct _SYSTEM_ALARM_CALLBACK_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD SidStart;\n\n    } SYSTEM_ALARM_CALLBACK_ACE,*PSYSTEM_ALARM_CALLBACK_ACE;\n\n    typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n\n    } ACCESS_ALLOWED_CALLBACK_OBJECT_ACE,*PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;\n\n    typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n\n    } ACCESS_DENIED_CALLBACK_OBJECT_ACE,*PACCESS_DENIED_CALLBACK_OBJECT_ACE;\n\n    typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n\n    } SYSTEM_AUDIT_CALLBACK_OBJECT_ACE,*PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;\n\n    typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {\n      ACE_HEADER Header;\n      ACCESS_MASK Mask;\n      DWORD Flags;\n      GUID ObjectType;\n      GUID InheritedObjectType;\n      DWORD SidStart;\n\n    } SYSTEM_ALARM_CALLBACK_OBJECT_ACE,*PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;\n\n#define ACE_OBJECT_TYPE_PRESENT 0x1\n#define ACE_INHERITED_OBJECT_TYPE_PRESENT 0x2\n\n    typedef enum _ACL_INFORMATION_CLASS {\n      AclRevisionInformation = 1,AclSizeInformation\n    } ACL_INFORMATION_CLASS;\n\n    typedef struct _ACL_REVISION_INFORMATION {\n      DWORD AclRevision;\n    } ACL_REVISION_INFORMATION;\n    typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;\n\n    typedef struct _ACL_SIZE_INFORMATION {\n      DWORD AceCount;\n      DWORD AclBytesInUse;\n      DWORD AclBytesFree;\n    } ACL_SIZE_INFORMATION;\n    typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;\n\n#define SECURITY_DESCRIPTOR_REVISION (1)\n#define SECURITY_DESCRIPTOR_REVISION1 (1)\n\n#define SECURITY_DESCRIPTOR_MIN_LENGTH (sizeof(SECURITY_DESCRIPTOR))\n\n    typedef WORD SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;\n\n#define SE_OWNER_DEFAULTED (0x0001)\n#define SE_GROUP_DEFAULTED (0x0002)\n#define SE_DACL_PRESENT (0x0004)\n#define SE_DACL_DEFAULTED (0x0008)\n#define SE_SACL_PRESENT (0x0010)\n#define SE_SACL_DEFAULTED (0x0020)\n#define SE_DACL_AUTO_INHERIT_REQ (0x0100)\n#define SE_SACL_AUTO_INHERIT_REQ (0x0200)\n#define SE_DACL_AUTO_INHERITED (0x0400)\n#define SE_SACL_AUTO_INHERITED (0x0800)\n#define SE_DACL_PROTECTED (0x1000)\n#define SE_SACL_PROTECTED (0x2000)\n#define SE_RM_CONTROL_VALID (0x4000)\n#define SE_SELF_RELATIVE (0x8000)\n\n    typedef struct _SECURITY_DESCRIPTOR_RELATIVE {\n      BYTE Revision;\n      BYTE Sbz1;\n      SECURITY_DESCRIPTOR_CONTROL Control;\n      DWORD Owner;\n      DWORD Group;\n      DWORD Sacl;\n      DWORD Dacl;\n    } SECURITY_DESCRIPTOR_RELATIVE,*PISECURITY_DESCRIPTOR_RELATIVE;\n\n    typedef struct _SECURITY_DESCRIPTOR {\n      BYTE Revision;\n      BYTE Sbz1;\n      SECURITY_DESCRIPTOR_CONTROL Control;\n      PSID Owner;\n      PSID Group;\n      PACL Sacl;\n      PACL Dacl;\n\n    } SECURITY_DESCRIPTOR,*PISECURITY_DESCRIPTOR;\n\n    typedef struct _OBJECT_TYPE_LIST {\n      WORD Level;\n      WORD Sbz;\n      GUID *ObjectType;\n    } OBJECT_TYPE_LIST,*POBJECT_TYPE_LIST;\n\n#define ACCESS_OBJECT_GUID 0\n#define ACCESS_PROPERTY_SET_GUID 1\n#define ACCESS_PROPERTY_GUID 2\n\n#define ACCESS_MAX_LEVEL 4\n\n    typedef enum _AUDIT_EVENT_TYPE {\n      AuditEventObjectAccess,AuditEventDirectoryServiceAccess\n    } AUDIT_EVENT_TYPE,*PAUDIT_EVENT_TYPE;\n\n#define AUDIT_ALLOW_NO_PRIVILEGE 0x1\n\n#define ACCESS_DS_SOURCE_A \"DS\"\n#define ACCESS_DS_SOURCE_W L\"DS\"\n#define ACCESS_DS_OBJECT_TYPE_NAME_A \"Directory Service Object\"\n#define ACCESS_DS_OBJECT_TYPE_NAME_W L\"Directory Service Object\"\n\n#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)\n#define SE_PRIVILEGE_ENABLED (0x00000002L)\n#define SE_PRIVILEGE_REMOVED (0X00000004L)\n#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)\n\n#define PRIVILEGE_SET_ALL_NECESSARY (1)\n\n    typedef struct _PRIVILEGE_SET {\n      DWORD PrivilegeCount;\n      DWORD Control;\n      LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];\n    } PRIVILEGE_SET,*PPRIVILEGE_SET;\n\n#define SE_CREATE_TOKEN_NAME TEXT(\"SeCreateTokenPrivilege\")\n#define SE_ASSIGNPRIMARYTOKEN_NAME TEXT(\"SeAssignPrimaryTokenPrivilege\")\n#define SE_LOCK_MEMORY_NAME TEXT(\"SeLockMemoryPrivilege\")\n#define SE_INCREASE_QUOTA_NAME TEXT(\"SeIncreaseQuotaPrivilege\")\n#define SE_UNSOLICITED_INPUT_NAME TEXT(\"SeUnsolicitedInputPrivilege\")\n#define SE_MACHINE_ACCOUNT_NAME TEXT(\"SeMachineAccountPrivilege\")\n#define SE_TCB_NAME TEXT(\"SeTcbPrivilege\")\n#define SE_SECURITY_NAME TEXT(\"SeSecurityPrivilege\")\n#define SE_TAKE_OWNERSHIP_NAME TEXT(\"SeTakeOwnershipPrivilege\")\n#define SE_LOAD_DRIVER_NAME TEXT(\"SeLoadDriverPrivilege\")\n#define SE_SYSTEM_PROFILE_NAME TEXT(\"SeSystemProfilePrivilege\")\n#define SE_SYSTEMTIME_NAME TEXT(\"SeSystemtimePrivilege\")\n#define SE_PROF_SINGLE_PROCESS_NAME TEXT(\"SeProfileSingleProcessPrivilege\")\n#define SE_INC_BASE_PRIORITY_NAME TEXT(\"SeIncreaseBasePriorityPrivilege\")\n#define SE_CREATE_PAGEFILE_NAME TEXT(\"SeCreatePagefilePrivilege\")\n#define SE_CREATE_PERMANENT_NAME TEXT(\"SeCreatePermanentPrivilege\")\n#define SE_BACKUP_NAME TEXT(\"SeBackupPrivilege\")\n#define SE_RESTORE_NAME TEXT(\"SeRestorePrivilege\")\n#define SE_SHUTDOWN_NAME TEXT(\"SeShutdownPrivilege\")\n#define SE_DEBUG_NAME TEXT(\"SeDebugPrivilege\")\n#define SE_AUDIT_NAME TEXT(\"SeAuditPrivilege\")\n#define SE_SYSTEM_ENVIRONMENT_NAME TEXT(\"SeSystemEnvironmentPrivilege\")\n#define SE_CHANGE_NOTIFY_NAME TEXT(\"SeChangeNotifyPrivilege\")\n#define SE_REMOTE_SHUTDOWN_NAME TEXT(\"SeRemoteShutdownPrivilege\")\n#define SE_UNDOCK_NAME TEXT(\"SeUndockPrivilege\")\n#define SE_SYNC_AGENT_NAME TEXT(\"SeSyncAgentPrivilege\")\n#define SE_ENABLE_DELEGATION_NAME TEXT(\"SeEnableDelegationPrivilege\")\n#define SE_MANAGE_VOLUME_NAME TEXT(\"SeManageVolumePrivilege\")\n#define SE_IMPERSONATE_NAME TEXT(\"SeImpersonatePrivilege\")\n#define SE_CREATE_GLOBAL_NAME TEXT(\"SeCreateGlobalPrivilege\")\n\n    typedef enum _SECURITY_IMPERSONATION_LEVEL {\n      SecurityAnonymous,SecurityIdentification,SecurityImpersonation,SecurityDelegation\n    } SECURITY_IMPERSONATION_LEVEL,*PSECURITY_IMPERSONATION_LEVEL;\n\n#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation\n#define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous\n#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation\n#define VALID_IMPERSONATION_LEVEL(L) (((L) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((L) <= SECURITY_MAX_IMPERSONATION_LEVEL))\n\n#define TOKEN_ASSIGN_PRIMARY (0x0001)\n#define TOKEN_DUPLICATE (0x0002)\n#define TOKEN_IMPERSONATE (0x0004)\n#define TOKEN_QUERY (0x0008)\n#define TOKEN_QUERY_SOURCE (0x0010)\n#define TOKEN_ADJUST_PRIVILEGES (0x0020)\n#define TOKEN_ADJUST_GROUPS (0x0040)\n#define TOKEN_ADJUST_DEFAULT (0x0080)\n#define TOKEN_ADJUST_SESSIONID (0x0100)\n\n#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT)\n#define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P | TOKEN_ADJUST_SESSIONID)\n#define TOKEN_READ (STANDARD_RIGHTS_READ | TOKEN_QUERY)\n\n#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT)\n\n#define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE)\n\n    typedef enum _TOKEN_TYPE {\n      TokenPrimary = 1,TokenImpersonation\n    } TOKEN_TYPE;\n    typedef TOKEN_TYPE *PTOKEN_TYPE;\n\n    typedef enum _TOKEN_INFORMATION_CLASS {\n      TokenUser = 1,TokenGroups,TokenPrivileges,TokenOwner,TokenPrimaryGroup,TokenDefaultDacl,TokenSource,TokenType,TokenImpersonationLevel,\n      TokenStatistics,TokenRestrictedSids,TokenSessionId,TokenGroupsAndPrivileges,TokenSessionReference,TokenSandBoxInert,TokenAuditPolicy,\n      TokenOrigin,MaxTokenInfoClass\n    } TOKEN_INFORMATION_CLASS,*PTOKEN_INFORMATION_CLASS;\n\n    typedef struct _TOKEN_USER {\n      SID_AND_ATTRIBUTES User;\n    } TOKEN_USER,*PTOKEN_USER;\n\n    typedef struct _TOKEN_GROUPS {\n      DWORD GroupCount;\n      SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];\n    } TOKEN_GROUPS,*PTOKEN_GROUPS;\n\n    typedef struct _TOKEN_PRIVILEGES {\n      DWORD PrivilegeCount;\n      LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];\n    } TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES;\n\n    typedef struct _TOKEN_OWNER {\n      PSID Owner;\n    } TOKEN_OWNER,*PTOKEN_OWNER;\n\n    typedef struct _TOKEN_PRIMARY_GROUP {\n      PSID PrimaryGroup;\n    } TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP;\n\n    typedef struct _TOKEN_DEFAULT_DACL {\n      PACL DefaultDacl;\n    } TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL;\n\n    typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {\n      DWORD SidCount;\n      DWORD SidLength;\n      PSID_AND_ATTRIBUTES Sids;\n      DWORD RestrictedSidCount;\n      DWORD RestrictedSidLength;\n      PSID_AND_ATTRIBUTES RestrictedSids;\n      DWORD PrivilegeCount;\n      DWORD PrivilegeLength;\n      PLUID_AND_ATTRIBUTES Privileges;\n      LUID AuthenticationId;\n    } TOKEN_GROUPS_AND_PRIVILEGES,*PTOKEN_GROUPS_AND_PRIVILEGES;\n\n#define TOKEN_AUDIT_SUCCESS_INCLUDE 0x1\n#define TOKEN_AUDIT_SUCCESS_EXCLUDE 0x2\n#define TOKEN_AUDIT_FAILURE_INCLUDE 0x4\n#define TOKEN_AUDIT_FAILURE_EXCLUDE 0x8\n\n#define VALID_AUDIT_POLICY_BITS (TOKEN_AUDIT_SUCCESS_INCLUDE | TOKEN_AUDIT_SUCCESS_EXCLUDE | TOKEN_AUDIT_FAILURE_INCLUDE | TOKEN_AUDIT_FAILURE_EXCLUDE)\n#define VALID_TOKEN_AUDIT_POLICY_ELEMENT(P) ((((P).PolicyMask & ~VALID_AUDIT_POLICY_BITS)==0) && ((P).Category <= AuditEventMaxType))\n\n    typedef struct _TOKEN_AUDIT_POLICY_ELEMENT {\n      DWORD Category;\n      DWORD PolicyMask;\n    } TOKEN_AUDIT_POLICY_ELEMENT,*PTOKEN_AUDIT_POLICY_ELEMENT;\n\n    typedef struct _TOKEN_AUDIT_POLICY {\n      DWORD PolicyCount;\n      TOKEN_AUDIT_POLICY_ELEMENT Policy[ANYSIZE_ARRAY];\n    } TOKEN_AUDIT_POLICY,*PTOKEN_AUDIT_POLICY;\n\n#define PER_USER_AUDITING_POLICY_SIZE(p) (sizeof(TOKEN_AUDIT_POLICY) + (((p)->PolicyCount > ANYSIZE_ARRAY) ? (sizeof(TOKEN_AUDIT_POLICY_ELEMENT) *((p)->PolicyCount - ANYSIZE_ARRAY)) : 0))\n#define PER_USER_AUDITING_POLICY_SIZE_BY_COUNT(C) (sizeof(TOKEN_AUDIT_POLICY) + (((C) > ANYSIZE_ARRAY) ? (sizeof(TOKEN_AUDIT_POLICY_ELEMENT) *((C) - ANYSIZE_ARRAY)) : 0))\n\n#define TOKEN_SOURCE_LENGTH 8\n\n    typedef struct _TOKEN_SOURCE {\n      CHAR SourceName[TOKEN_SOURCE_LENGTH];\n      LUID SourceIdentifier;\n    } TOKEN_SOURCE,*PTOKEN_SOURCE;\n\n    typedef struct _TOKEN_STATISTICS {\n      LUID TokenId;\n      LUID AuthenticationId;\n      LARGE_INTEGER ExpirationTime;\n      TOKEN_TYPE TokenType;\n      SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;\n      DWORD DynamicCharged;\n      DWORD DynamicAvailable;\n      DWORD GroupCount;\n      DWORD PrivilegeCount;\n      LUID ModifiedId;\n    } TOKEN_STATISTICS,*PTOKEN_STATISTICS;\n\n    typedef struct _TOKEN_CONTROL {\n      LUID TokenId;\n      LUID AuthenticationId;\n      LUID ModifiedId;\n      TOKEN_SOURCE TokenSource;\n    } TOKEN_CONTROL,*PTOKEN_CONTROL;\n\n    typedef struct _TOKEN_ORIGIN {\n      LUID OriginatingLogonSession;\n    } TOKEN_ORIGIN,*PTOKEN_ORIGIN;\n\n#define SECURITY_DYNAMIC_TRACKING (TRUE)\n#define SECURITY_STATIC_TRACKING (FALSE)\n\n    typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,*PSECURITY_CONTEXT_TRACKING_MODE;\n\n    typedef struct _SECURITY_QUALITY_OF_SERVICE {\n      DWORD Length;\n      SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;\n      SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;\n      BOOLEAN EffectiveOnly;\n    } SECURITY_QUALITY_OF_SERVICE,*PSECURITY_QUALITY_OF_SERVICE;\n\n    typedef struct _SE_IMPERSONATION_STATE {\n      PACCESS_TOKEN Token;\n      BOOLEAN CopyOnOpen;\n      BOOLEAN EffectiveOnly;\n      SECURITY_IMPERSONATION_LEVEL Level;\n    } SE_IMPERSONATION_STATE,*PSE_IMPERSONATION_STATE;\n\n#define DISABLE_MAX_PRIVILEGE 0x1\n#define SANDBOX_INERT 0x2\n\n    typedef DWORD SECURITY_INFORMATION,*PSECURITY_INFORMATION;\n\n#define OWNER_SECURITY_INFORMATION (0x00000001L)\n#define GROUP_SECURITY_INFORMATION (0x00000002L)\n#define DACL_SECURITY_INFORMATION (0x00000004L)\n#define SACL_SECURITY_INFORMATION (0x00000008L)\n\n#define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)\n#define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)\n#define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)\n#define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)\n\n#define PROCESS_TERMINATE (0x0001)\n#define PROCESS_CREATE_THREAD (0x0002)\n#define PROCESS_SET_SESSIONID (0x0004)\n#define PROCESS_VM_OPERATION (0x0008)\n#define PROCESS_VM_READ (0x0010)\n#define PROCESS_VM_WRITE (0x0020)\n#define PROCESS_DUP_HANDLE (0x0040)\n#define PROCESS_CREATE_PROCESS (0x0080)\n#define PROCESS_SET_QUOTA (0x0100)\n#define PROCESS_SET_INFORMATION (0x0200)\n#define PROCESS_QUERY_INFORMATION (0x0400)\n#define PROCESS_SUSPEND_RESUME (0x0800)\n#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)\n\n#ifdef _WIN64\n#define MAXIMUM_PROCESSORS 64\n#else\n#define MAXIMUM_PROCESSORS 32\n#endif\n\n#define THREAD_TERMINATE (0x0001)\n#define THREAD_SUSPEND_RESUME (0x0002)\n#define THREAD_GET_CONTEXT (0x0008)\n#define THREAD_SET_CONTEXT (0x0010)\n#define THREAD_SET_INFORMATION (0x0020)\n#define THREAD_QUERY_INFORMATION (0x0040)\n#define THREAD_SET_THREAD_TOKEN (0x0080)\n#define THREAD_IMPERSONATE (0x0100)\n#define THREAD_DIRECT_IMPERSONATION (0x0200)\n\n#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)\n\n#define JOB_OBJECT_ASSIGN_PROCESS (0x0001)\n#define JOB_OBJECT_SET_ATTRIBUTES (0x0002)\n#define JOB_OBJECT_QUERY (0x0004)\n#define JOB_OBJECT_TERMINATE (0x0008)\n#define JOB_OBJECT_SET_SECURITY_ATTRIBUTES (0x0010)\n#define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1F)\n\n    typedef struct _JOB_SET_ARRAY {\n      HANDLE JobHandle;\n      DWORD MemberLevel;\n      DWORD Flags;\n    } JOB_SET_ARRAY,*PJOB_SET_ARRAY;\n\n#define FLS_MAXIMUM_AVAILABLE 128\n#define TLS_MINIMUM_AVAILABLE 64\n\n#ifndef _NT_TIB_DEFINED\n#define _NT_TIB_DEFINED\n    typedef struct _NT_TIB {\n      struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;\n      PVOID StackBase;\n      PVOID StackLimit;\n      PVOID SubSystemTib;\n      union {\n\tPVOID FiberData;\n\tDWORD Version;\n      };\n      PVOID ArbitraryUserPointer;\n      struct _NT_TIB *Self;\n    } NT_TIB;\n    typedef NT_TIB *PNT_TIB;\n#endif\n\n    typedef struct _NT_TIB32 {\n      DWORD ExceptionList;\n      DWORD StackBase;\n      DWORD StackLimit;\n      DWORD SubSystemTib;\n      union {\n\tDWORD FiberData;\n\tDWORD Version;\n      };\n      DWORD ArbitraryUserPointer;\n      DWORD Self;\n    } NT_TIB32,*PNT_TIB32;\n\n    typedef struct _NT_TIB64 {\n      DWORD64 ExceptionList;\n      DWORD64 StackBase;\n      DWORD64 StackLimit;\n      DWORD64 SubSystemTib;\n      union {\n\tDWORD64 FiberData;\n\tDWORD Version;\n      };\n      DWORD64 ArbitraryUserPointer;\n      DWORD64 Self;\n    } NT_TIB64,*PNT_TIB64;\n\n#if !defined(I_X86_) && !defined(_IA64_) && !defined(_AMD64_)\n#define WX86\n#endif\n\n#define THREAD_BASE_PRIORITY_LOWRT 15\n#define THREAD_BASE_PRIORITY_MAX 2\n#define THREAD_BASE_PRIORITY_MIN (-2)\n#define THREAD_BASE_PRIORITY_IDLE (-15)\n\n    typedef struct _QUOTA_LIMITS {\n      SIZE_T PagedPoolLimit;\n      SIZE_T NonPagedPoolLimit;\n      SIZE_T MinimumWorkingSetSize;\n      SIZE_T MaximumWorkingSetSize;\n      SIZE_T PagefileLimit;\n      LARGE_INTEGER TimeLimit;\n    } QUOTA_LIMITS,*PQUOTA_LIMITS;\n\n#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001\n#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002\n#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004\n#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008\n\n    typedef struct _QUOTA_LIMITS_EX {\n      SIZE_T PagedPoolLimit;\n      SIZE_T NonPagedPoolLimit;\n      SIZE_T MinimumWorkingSetSize;\n      SIZE_T MaximumWorkingSetSize;\n      SIZE_T PagefileLimit;\n      LARGE_INTEGER TimeLimit;\n      SIZE_T Reserved1;\n      SIZE_T Reserved2;\n      SIZE_T Reserved3;\n      SIZE_T Reserved4;\n      DWORD Flags;\n      DWORD Reserved5;\n    } QUOTA_LIMITS_EX,*PQUOTA_LIMITS_EX;\n\n    typedef struct _IO_COUNTERS {\n      ULONGLONG ReadOperationCount;\n      ULONGLONG WriteOperationCount;\n      ULONGLONG OtherOperationCount;\n      ULONGLONG ReadTransferCount;\n      ULONGLONG WriteTransferCount;\n      ULONGLONG OtherTransferCount;\n    } IO_COUNTERS;\n    typedef IO_COUNTERS *PIO_COUNTERS;\n\n    typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {\n      LARGE_INTEGER TotalUserTime;\n      LARGE_INTEGER TotalKernelTime;\n      LARGE_INTEGER ThisPeriodTotalUserTime;\n      LARGE_INTEGER ThisPeriodTotalKernelTime;\n      DWORD TotalPageFaultCount;\n      DWORD TotalProcesses;\n      DWORD ActiveProcesses;\n      DWORD TotalTerminatedProcesses;\n    } JOBOBJECT_BASIC_ACCOUNTING_INFORMATION,*PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;\n\n    typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {\n      LARGE_INTEGER PerProcessUserTimeLimit;\n      LARGE_INTEGER PerJobUserTimeLimit;\n      DWORD LimitFlags;\n      SIZE_T MinimumWorkingSetSize;\n      SIZE_T MaximumWorkingSetSize;\n      DWORD ActiveProcessLimit;\n      ULONG_PTR Affinity;\n      DWORD PriorityClass;\n      DWORD SchedulingClass;\n    } JOBOBJECT_BASIC_LIMIT_INFORMATION,*PJOBOBJECT_BASIC_LIMIT_INFORMATION;\n\n    typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {\n      JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;\n      IO_COUNTERS IoInfo;\n      SIZE_T ProcessMemoryLimit;\n      SIZE_T JobMemoryLimit;\n      SIZE_T PeakProcessMemoryUsed;\n      SIZE_T PeakJobMemoryUsed;\n    } JOBOBJECT_EXTENDED_LIMIT_INFORMATION,*PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;\n\n    typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {\n      DWORD NumberOfAssignedProcesses;\n      DWORD NumberOfProcessIdsInList;\n      ULONG_PTR ProcessIdList[1];\n    } JOBOBJECT_BASIC_PROCESS_ID_LIST,*PJOBOBJECT_BASIC_PROCESS_ID_LIST;\n\n    typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {\n      DWORD UIRestrictionsClass;\n    } JOBOBJECT_BASIC_UI_RESTRICTIONS,*PJOBOBJECT_BASIC_UI_RESTRICTIONS;\n\n    typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {\n      DWORD SecurityLimitFlags;\n      HANDLE JobToken;\n      PTOKEN_GROUPS SidsToDisable;\n      PTOKEN_PRIVILEGES PrivilegesToDelete;\n      PTOKEN_GROUPS RestrictedSids;\n    } JOBOBJECT_SECURITY_LIMIT_INFORMATION,*PJOBOBJECT_SECURITY_LIMIT_INFORMATION;\n\n    typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {\n      DWORD EndOfJobTimeAction;\n    } JOBOBJECT_END_OF_JOB_TIME_INFORMATION,*PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;\n\n    typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {\n      PVOID CompletionKey;\n      HANDLE CompletionPort;\n    } JOBOBJECT_ASSOCIATE_COMPLETION_PORT,*PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;\n\n    typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {\n      JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;\n      IO_COUNTERS IoInfo;\n    } JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION,*PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;\n\n    typedef struct _JOBOBJECT_JOBSET_INFORMATION {\n      DWORD MemberLevel;\n    } JOBOBJECT_JOBSET_INFORMATION,*PJOBOBJECT_JOBSET_INFORMATION;\n\n#define JOB_OBJECT_TERMINATE_AT_END_OF_JOB 0\n#define JOB_OBJECT_POST_AT_END_OF_JOB 1\n\n#define JOB_OBJECT_MSG_END_OF_JOB_TIME 1\n#define JOB_OBJECT_MSG_END_OF_PROCESS_TIME 2\n#define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT 3\n#define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO 4\n#define JOB_OBJECT_MSG_NEW_PROCESS 6\n#define JOB_OBJECT_MSG_EXIT_PROCESS 7\n#define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS 8\n#define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT 9\n#define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT 10\n\n#define JOB_OBJECT_LIMIT_WORKINGSET 0x00000001\n#define JOB_OBJECT_LIMIT_PROCESS_TIME 0x00000002\n#define JOB_OBJECT_LIMIT_JOB_TIME 0x00000004\n#define JOB_OBJECT_LIMIT_ACTIVE_PROCESS 0x00000008\n#define JOB_OBJECT_LIMIT_AFFINITY 0x00000010\n#define JOB_OBJECT_LIMIT_PRIORITY_CLASS 0x00000020\n#define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME 0x00000040\n#define JOB_OBJECT_LIMIT_SCHEDULING_CLASS 0x00000080\n\n#define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100\n#define JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200\n#define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400\n#define JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800\n#define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000\n#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000\n\n#define JOB_OBJECT_LIMIT_RESERVED2 0x00004000\n#define JOB_OBJECT_LIMIT_RESERVED3 0x00008000\n#define JOB_OBJECT_LIMIT_RESERVED4 0x00010000\n#define JOB_OBJECT_LIMIT_RESERVED5 0x00020000\n#define JOB_OBJECT_LIMIT_RESERVED6 0x00040000\n\n#define JOB_OBJECT_LIMIT_VALID_FLAGS 0x0007ffff\n\n#define JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS 0x000000ff\n#define JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS 0x00003fff\n#define JOB_OBJECT_RESERVED_LIMIT_VALID_FLAGS 0x0007ffff\n\n#define JOB_OBJECT_UILIMIT_NONE 0x00000000\n\n#define JOB_OBJECT_UILIMIT_HANDLES 0x00000001\n#define JOB_OBJECT_UILIMIT_READCLIPBOARD 0x00000002\n#define JOB_OBJECT_UILIMIT_WRITECLIPBOARD 0x00000004\n#define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x00000008\n#define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 0x00000010\n#define JOB_OBJECT_UILIMIT_GLOBALATOMS 0x00000020\n#define JOB_OBJECT_UILIMIT_DESKTOP 0x00000040\n#define JOB_OBJECT_UILIMIT_EXITWINDOWS 0x00000080\n\n#define JOB_OBJECT_UILIMIT_ALL 0x000000FF\n\n#define JOB_OBJECT_UI_VALID_FLAGS 0x000000FF\n\n#define JOB_OBJECT_SECURITY_NO_ADMIN 0x00000001\n#define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN 0x00000002\n#define JOB_OBJECT_SECURITY_ONLY_TOKEN 0x00000004\n#define JOB_OBJECT_SECURITY_FILTER_TOKENS 0x00000008\n\n#define JOB_OBJECT_SECURITY_VALID_FLAGS 0x0000000f\n\n    typedef enum _JOBOBJECTINFOCLASS {\n      JobObjectBasicAccountingInformation = 1,JobObjectBasicLimitInformation,JobObjectBasicProcessIdList,JobObjectBasicUIRestrictions,\n      JobObjectSecurityLimitInformation,JobObjectEndOfJobTimeInformation,JobObjectAssociateCompletionPortInformation,\n      JobObjectBasicAndIoAccountingInformation,JobObjectExtendedLimitInformation,JobObjectJobSetInformation,MaxJobObjectInfoClass\n    } JOBOBJECTINFOCLASS;\n\n#define EVENT_MODIFY_STATE 0x0002\n#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)\n\n#define MUTANT_QUERY_STATE 0x0001\n\n#define MUTANT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE| MUTANT_QUERY_STATE)\n#define SEMAPHORE_MODIFY_STATE 0x0002\n#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)\n\n#define TIMER_QUERY_STATE 0x0001\n#define TIMER_MODIFY_STATE 0x0002\n\n#define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE| TIMER_QUERY_STATE|TIMER_MODIFY_STATE)\n\n#define TIME_ZONE_ID_UNKNOWN 0\n#define TIME_ZONE_ID_STANDARD 1\n#define TIME_ZONE_ID_DAYLIGHT 2\n\n    typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {\n      RelationProcessorCore,RelationNumaNode,RelationCache\n    } LOGICAL_PROCESSOR_RELATIONSHIP;\n\n#define LTP_PC_SMT 0x1\n\n    typedef enum _PROCESSOR_CACHE_TYPE {\n      CacheUnified,CacheInstruction,CacheData,CacheTrace\n    } PROCESSOR_CACHE_TYPE;\n\n#define CACHE_FULLY_ASSOCIATIVE 0xFF\n\n    typedef struct _CACHE_DESCRIPTOR {\n      BYTE Level;\n      BYTE Associativity;\n      WORD LineSize;\n      DWORD Size;\n      PROCESSOR_CACHE_TYPE Type;\n    } CACHE_DESCRIPTOR,*PCACHE_DESCRIPTOR;\n\n    typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {\n      ULONG_PTR ProcessorMask;\n      LOGICAL_PROCESSOR_RELATIONSHIP Relationship;\n      union {\n\tstruct {\n\t  BYTE Flags;\n\t} ProcessorCore;\n\tstruct {\n\t  DWORD NodeNumber;\n\t} NumaNode;\n\tCACHE_DESCRIPTOR Cache;\n\tULONGLONG Reserved[2];\n      };\n    } SYSTEM_LOGICAL_PROCESSOR_INFORMATION,*PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;\n\n#define PROCESSOR_INTEL_386 386\n#define PROCESSOR_INTEL_486 486\n#define PROCESSOR_INTEL_PENTIUM 586\n#define PROCESSOR_INTEL_IA64 2200\n#define PROCESSOR_AMD_X8664 8664\n#define PROCESSOR_MIPS_R4000 4000\n#define PROCESSOR_ALPHA_21064 21064\n#define PROCESSOR_PPC_601 601\n#define PROCESSOR_PPC_603 603\n#define PROCESSOR_PPC_604 604\n#define PROCESSOR_PPC_620 620\n#define PROCESSOR_HITACHI_SH3 10003\n#define PROCESSOR_HITACHI_SH3E 10004\n#define PROCESSOR_HITACHI_SH4 10005\n#define PROCESSOR_MOTOROLA_821 821\n#define PROCESSOR_SHx_SH3 103\n#define PROCESSOR_SHx_SH4 104\n#define PROCESSOR_STRONGARM 2577\n#define PROCESSOR_ARM720 1824\n#define PROCESSOR_ARM820 2080\n#define PROCESSOR_ARM920 2336\n#define PROCESSOR_ARM_7TDMI 70001\n#define PROCESSOR_OPTIL 0x494f\n\n#define PROCESSOR_ARCHITECTURE_INTEL 0\n#define PROCESSOR_ARCHITECTURE_MIPS 1\n#define PROCESSOR_ARCHITECTURE_ALPHA 2\n#define PROCESSOR_ARCHITECTURE_PPC 3\n#define PROCESSOR_ARCHITECTURE_SHX 4\n#define PROCESSOR_ARCHITECTURE_ARM 5\n#define PROCESSOR_ARCHITECTURE_IA64 6\n#define PROCESSOR_ARCHITECTURE_ALPHA64 7\n#define PROCESSOR_ARCHITECTURE_MSIL 8\n#define PROCESSOR_ARCHITECTURE_AMD64 9\n#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10\n\n#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF\n\n#define PF_FLOATING_POINT_PRECISION_ERRATA 0\n#define PF_FLOATING_POINT_EMULATED 1\n#define PF_COMPARE_EXCHANGE_DOUBLE 2\n#define PF_MMX_INSTRUCTIONS_AVAILABLE 3\n#define PF_PPC_MOVEMEM_64BIT_OK 4\n#define PF_ALPHA_BYTE_INSTRUCTIONS 5\n#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6\n#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7\n#define PF_RDTSC_INSTRUCTION_AVAILABLE 8\n#define PF_PAE_ENABLED 9\n#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10\n#define PF_SSE_DAZ_MODE_AVAILABLE 11\n#define PF_NX_ENABLED 12\n\n    typedef struct _MEMORY_BASIC_INFORMATION {\n      PVOID BaseAddress;\n      PVOID AllocationBase;\n      DWORD AllocationProtect;\n      SIZE_T RegionSize;\n      DWORD State;\n      DWORD Protect;\n      DWORD Type;\n    } MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;\n\n    typedef struct _MEMORY_BASIC_INFORMATION32 {\n      DWORD BaseAddress;\n      DWORD AllocationBase;\n      DWORD AllocationProtect;\n      DWORD RegionSize;\n      DWORD State;\n      DWORD Protect;\n      DWORD Type;\n    } MEMORY_BASIC_INFORMATION32,*PMEMORY_BASIC_INFORMATION32;\n\n    typedef DECLSPEC_ALIGN(16) struct _MEMORY_BASIC_INFORMATION64 {\n      ULONGLONG BaseAddress;\n      ULONGLONG AllocationBase;\n      DWORD AllocationProtect;\n      DWORD __alignment1;\n      ULONGLONG RegionSize;\n      DWORD State;\n      DWORD Protect;\n      DWORD Type;\n      DWORD __alignment2;\n    } MEMORY_BASIC_INFORMATION64,*PMEMORY_BASIC_INFORMATION64;\n\n#define SECTION_QUERY 0x0001\n#define SECTION_MAP_WRITE 0x0002\n#define SECTION_MAP_READ 0x0004\n#define SECTION_MAP_EXECUTE 0x0008\n#define SECTION_EXTEND_SIZE 0x0010\n#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020\n\n#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE)\n#define PAGE_NOACCESS 0x01\n#define PAGE_READONLY 0x02\n#define PAGE_READWRITE 0x04\n#define PAGE_WRITECOPY 0x08\n#define PAGE_EXECUTE 0x10\n#define PAGE_EXECUTE_READ 0x20\n#define PAGE_EXECUTE_READWRITE 0x40\n#define PAGE_EXECUTE_WRITECOPY 0x80\n#define PAGE_GUARD 0x100\n#define PAGE_NOCACHE 0x200\n#define PAGE_WRITECOMBINE 0x400\n#define MEM_COMMIT 0x1000\n#define MEM_RESERVE 0x2000\n#define MEM_DECOMMIT 0x4000\n#define MEM_RELEASE 0x8000\n#define MEM_FREE 0x10000\n#define MEM_PRIVATE 0x20000\n#define MEM_MAPPED 0x40000\n#define MEM_RESET 0x80000\n#define MEM_TOP_DOWN 0x100000\n#define MEM_WRITE_WATCH 0x200000\n#define MEM_PHYSICAL 0x400000\n#define MEM_LARGE_PAGES 0x20000000\n#define MEM_4MB_PAGES 0x80000000\n#define SEC_FILE 0x800000\n#define SEC_IMAGE 0x1000000\n#define SEC_RESERVE 0x4000000\n#define SEC_COMMIT 0x8000000\n#define SEC_NOCACHE 0x10000000\n#define SEC_LARGE_PAGES 0x80000000\n#define MEM_IMAGE SEC_IMAGE\n#define WRITE_WATCH_FLAG_RESET 0x01\n\n#define FILE_READ_DATA (0x0001)\n#define FILE_LIST_DIRECTORY (0x0001)\n\n#define FILE_WRITE_DATA (0x0002)\n#define FILE_ADD_FILE (0x0002)\n\n#define FILE_APPEND_DATA (0x0004)\n#define FILE_ADD_SUBDIRECTORY (0x0004)\n#define FILE_CREATE_PIPE_INSTANCE (0x0004)\n\n#define FILE_READ_EA (0x0008)\n\n#define FILE_WRITE_EA (0x0010)\n\n#define FILE_EXECUTE (0x0020)\n#define FILE_TRAVERSE (0x0020)\n\n#define FILE_DELETE_CHILD (0x0040)\n\n#define FILE_READ_ATTRIBUTES (0x0080)\n\n#define FILE_WRITE_ATTRIBUTES (0x0100)\n\n#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)\n#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE)\n#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE)\n#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE)\n\n#define FILE_SHARE_READ 0x00000001\n#define FILE_SHARE_WRITE 0x00000002\n#define FILE_SHARE_DELETE 0x00000004\n#define FILE_ATTRIBUTE_READONLY 0x00000001\n#define FILE_ATTRIBUTE_HIDDEN 0x00000002\n#define FILE_ATTRIBUTE_SYSTEM 0x00000004\n#define FILE_ATTRIBUTE_DIRECTORY 0x00000010\n#define FILE_ATTRIBUTE_ARCHIVE 0x00000020\n#define FILE_ATTRIBUTE_DEVICE 0x00000040\n#define FILE_ATTRIBUTE_NORMAL 0x00000080\n#define FILE_ATTRIBUTE_TEMPORARY 0x00000100\n#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200\n#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400\n#define FILE_ATTRIBUTE_COMPRESSED 0x00000800\n#define FILE_ATTRIBUTE_OFFLINE 0x00001000\n#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000\n#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000\n#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001\n#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002\n#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004\n#define FILE_NOTIFY_CHANGE_SIZE 0x00000008\n#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010\n#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020\n#define FILE_NOTIFY_CHANGE_CREATION 0x00000040\n#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100\n#define FILE_ACTION_ADDED 0x00000001\n#define FILE_ACTION_REMOVED 0x00000002\n#define FILE_ACTION_MODIFIED 0x00000003\n#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004\n#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005\n#define MAILSLOT_NO_MESSAGE ((DWORD)-1)\n#define MAILSLOT_WAIT_FOREVER ((DWORD)-1)\n#define FILE_CASE_SENSITIVE_SEARCH 0x00000001\n#define FILE_CASE_PRESERVED_NAMES 0x00000002\n#define FILE_UNICODE_ON_DISK 0x00000004\n#define FILE_PERSISTENT_ACLS 0x00000008\n#define FILE_FILE_COMPRESSION 0x00000010\n#define FILE_VOLUME_QUOTAS 0x00000020\n#define FILE_SUPPORTS_SPARSE_FILES 0x00000040\n#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080\n#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100\n#define FILE_VOLUME_IS_COMPRESSED 0x00008000\n#define FILE_SUPPORTS_OBJECT_IDS 0x00010000\n#define FILE_SUPPORTS_ENCRYPTION 0x00020000\n#define FILE_NAMED_STREAMS 0x00040000\n#define FILE_READ_ONLY_VOLUME 0x00080000\n\n    typedef struct _FILE_NOTIFY_INFORMATION {\n      DWORD NextEntryOffset;\n      DWORD Action;\n      DWORD FileNameLength;\n      WCHAR FileName[1];\n    } FILE_NOTIFY_INFORMATION,*PFILE_NOTIFY_INFORMATION;\n\n    typedef union _FILE_SEGMENT_ELEMENT {\n      PVOID64 Buffer;\n      ULONGLONG Alignment;\n    }FILE_SEGMENT_ELEMENT,*PFILE_SEGMENT_ELEMENT;\n\n    typedef struct _REPARSE_GUID_DATA_BUFFER {\n      DWORD ReparseTag;\n      WORD ReparseDataLength;\n      WORD Reserved;\n      GUID ReparseGuid;\n      struct {\n\tBYTE DataBuffer[1];\n      } GenericReparseBuffer;\n    } REPARSE_GUID_DATA_BUFFER,*PREPARSE_GUID_DATA_BUFFER;\n\n#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER,GenericReparseBuffer)\n\n#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE (16 *1024)\n\n#define IO_REPARSE_TAG_RESERVED_ZERO (0)\n#define IO_REPARSE_TAG_RESERVED_ONE (1)\n\n#define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE\n\n#define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))\n#define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))\n\n#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)\n#define IO_REPARSE_TAG_HSM (0xC0000004L)\n#define IO_REPARSE_TAG_SIS (0x80000007L)\n#define IO_REPARSE_TAG_DFS (0x8000000AL)\n#define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL)\n#define IO_COMPLETION_MODIFY_STATE 0x0002\n#define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)\n#define DUPLICATE_CLOSE_SOURCE 0x00000001\n#define DUPLICATE_SAME_ACCESS 0x00000002\n\n    typedef enum _SYSTEM_POWER_STATE {\n      PowerSystemUnspecified = 0,PowerSystemWorking = 1,PowerSystemSleeping1 = 2,PowerSystemSleeping2 = 3,PowerSystemSleeping3 = 4,PowerSystemHibernate = 5,PowerSystemShutdown = 6,PowerSystemMaximum = 7\n    } SYSTEM_POWER_STATE,*PSYSTEM_POWER_STATE;\n\n#define POWER_SYSTEM_MAXIMUM 7\n\n    typedef enum {\n      PowerActionNone = 0,PowerActionReserved,PowerActionSleep,PowerActionHibernate,PowerActionShutdown,PowerActionShutdownReset,PowerActionShutdownOff,PowerActionWarmEject\n    } POWER_ACTION,*PPOWER_ACTION;\n\n    typedef enum _DEVICE_POWER_STATE {\n      PowerDeviceUnspecified = 0,PowerDeviceD0,PowerDeviceD1,PowerDeviceD2,PowerDeviceD3,PowerDeviceMaximum\n    } DEVICE_POWER_STATE,*PDEVICE_POWER_STATE;\n\n#define ES_SYSTEM_REQUIRED ((DWORD)0x00000001)\n#define ES_DISPLAY_REQUIRED ((DWORD)0x00000002)\n#define ES_USER_PRESENT ((DWORD)0x00000004)\n#define ES_CONTINUOUS ((DWORD)0x80000000)\n\n    typedef DWORD EXECUTION_STATE;\n\n    typedef enum {\n      LT_DONT_CARE,LT_LOWEST_LATENCY\n    } LATENCY_TIME;\n\n#define PDCAP_D0_SUPPORTED 0x00000001\n#define PDCAP_D1_SUPPORTED 0x00000002\n#define PDCAP_D2_SUPPORTED 0x00000004\n#define PDCAP_D3_SUPPORTED 0x00000008\n#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010\n#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020\n#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040\n#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080\n#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100\n\n    typedef struct CM_Power_Data_s {\n      DWORD PD_Size;\n      DEVICE_POWER_STATE PD_MostRecentPowerState;\n      DWORD PD_Capabilities;\n      DWORD PD_D1Latency;\n      DWORD PD_D2Latency;\n      DWORD PD_D3Latency;\n      DEVICE_POWER_STATE PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM];\n      SYSTEM_POWER_STATE PD_DeepestSystemWake;\n    } CM_POWER_DATA,*PCM_POWER_DATA;\n\n    typedef enum {\n      SystemPowerPolicyAc,SystemPowerPolicyDc,VerifySystemPolicyAc,VerifySystemPolicyDc,SystemPowerCapabilities,SystemBatteryState,SystemPowerStateHandler,ProcessorStateHandler,SystemPowerPolicyCurrent,AdministratorPowerPolicy,SystemReserveHiberFile,ProcessorInformation,SystemPowerInformation,ProcessorStateHandler2,LastWakeTime,LastSleepTime,SystemExecutionState,SystemPowerStateNotifyHandler,ProcessorPowerPolicyAc,ProcessorPowerPolicyDc,VerifyProcessorPowerPolicyAc,VerifyProcessorPowerPolicyDc,ProcessorPowerPolicyCurrent,SystemPowerStateLogging,SystemPowerLoggingEntry\n    } POWER_INFORMATION_LEVEL;\n\n    typedef struct {\n      DWORD Granularity;\n      DWORD Capacity;\n    } BATTERY_REPORTING_SCALE,*PBATTERY_REPORTING_SCALE;\n\n    typedef struct {\n      POWER_ACTION Action;\n      DWORD Flags;\n      DWORD EventCode;\n    } POWER_ACTION_POLICY,*PPOWER_ACTION_POLICY;\n\n#define POWER_ACTION_QUERY_ALLOWED 0x00000001\n#define POWER_ACTION_UI_ALLOWED 0x00000002\n#define POWER_ACTION_OVERRIDE_APPS 0x00000004\n#define POWER_ACTION_LIGHTEST_FIRST 0x10000000\n#define POWER_ACTION_LOCK_CONSOLE 0x20000000\n#define POWER_ACTION_DISABLE_WAKES 0x40000000\n#define POWER_ACTION_CRITICAL 0x80000000\n\n#define POWER_LEVEL_USER_NOTIFY_TEXT 0x00000001\n#define POWER_LEVEL_USER_NOTIFY_SOUND 0x00000002\n#define POWER_LEVEL_USER_NOTIFY_EXEC 0x00000004\n#define POWER_USER_NOTIFY_BUTTON 0x00000008\n#define POWER_USER_NOTIFY_SHUTDOWN 0x00000010\n#define POWER_FORCE_TRIGGER_RESET 0x80000000\n\n    typedef struct {\n      BOOLEAN Enable;\n      BYTE Spare[3];\n      DWORD BatteryLevel;\n      POWER_ACTION_POLICY PowerPolicy;\n      SYSTEM_POWER_STATE MinSystemState;\n    } SYSTEM_POWER_LEVEL,*PSYSTEM_POWER_LEVEL;\n\n#define NUM_DISCHARGE_POLICIES 4\n#define DISCHARGE_POLICY_CRITICAL 0\n#define DISCHARGE_POLICY_LOW 1\n\n#define PO_THROTTLE_NONE 0\n#define PO_THROTTLE_CONSTANT 1\n#define PO_THROTTLE_DEGRADE 2\n#define PO_THROTTLE_ADAPTIVE 3\n#define PO_THROTTLE_MAXIMUM 4\n\n    typedef struct _SYSTEM_POWER_POLICY {\n      DWORD Revision;\n      POWER_ACTION_POLICY PowerButton;\n      POWER_ACTION_POLICY SleepButton;\n      POWER_ACTION_POLICY LidClose;\n      SYSTEM_POWER_STATE LidOpenWake;\n      DWORD Reserved;\n      POWER_ACTION_POLICY Idle;\n      DWORD IdleTimeout;\n      BYTE IdleSensitivity;\n      BYTE DynamicThrottle;\n      BYTE Spare2[2];\n      SYSTEM_POWER_STATE MinSleep;\n      SYSTEM_POWER_STATE MaxSleep;\n      SYSTEM_POWER_STATE ReducedLatencySleep;\n      DWORD WinLogonFlags;\n      DWORD Spare3;\n      DWORD DozeS4Timeout;\n      DWORD BroadcastCapacityResolution;\n      SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES];\n      DWORD VideoTimeout;\n      BOOLEAN VideoDimDisplay;\n      DWORD VideoReserved[3];\n      DWORD SpindownTimeout;\n      BOOLEAN OptimizeForPower;\n      BYTE FanThrottleTolerance;\n      BYTE ForcedThrottle;\n      BYTE MinThrottle;\n      POWER_ACTION_POLICY OverThrottled;\n    } SYSTEM_POWER_POLICY,*PSYSTEM_POWER_POLICY;\n\n    typedef struct _PROCESSOR_POWER_POLICY_INFO {\n      DWORD TimeCheck;\n      DWORD DemoteLimit;\n      DWORD PromoteLimit;\n      BYTE DemotePercent;\n      BYTE PromotePercent;\n      BYTE Spare[2];\n      DWORD AllowDemotion:1;\n      DWORD AllowPromotion:1;\n      DWORD Reserved:30;\n    } PROCESSOR_POWER_POLICY_INFO,*PPROCESSOR_POWER_POLICY_INFO;\n\n    typedef struct _PROCESSOR_POWER_POLICY {\n      DWORD Revision;\n      BYTE DynamicThrottle;\n      BYTE Spare[3];\n      DWORD DisableCStates:1;\n      DWORD Reserved:31;\n      DWORD PolicyCount;\n      PROCESSOR_POWER_POLICY_INFO Policy[3];\n    } PROCESSOR_POWER_POLICY,*PPROCESSOR_POWER_POLICY;\n\n    typedef struct _ADMINISTRATOR_POWER_POLICY {\n      SYSTEM_POWER_STATE MinSleep;\n      SYSTEM_POWER_STATE MaxSleep;\n      DWORD MinVideoTimeout;\n      DWORD MaxVideoTimeout;\n      DWORD MinSpindownTimeout;\n      DWORD MaxSpindownTimeout;\n    } ADMINISTRATOR_POWER_POLICY,*PADMINISTRATOR_POWER_POLICY;\n\n    typedef struct {\n      BOOLEAN PowerButtonPresent;\n      BOOLEAN SleepButtonPresent;\n      BOOLEAN LidPresent;\n      BOOLEAN SystemS1;\n      BOOLEAN SystemS2;\n      BOOLEAN SystemS3;\n      BOOLEAN SystemS4;\n      BOOLEAN SystemS5;\n      BOOLEAN HiberFilePresent;\n      BOOLEAN FullWake;\n      BOOLEAN VideoDimPresent;\n      BOOLEAN ApmPresent;\n      BOOLEAN UpsPresent;\n      BOOLEAN ThermalControl;\n      BOOLEAN ProcessorThrottle;\n      BYTE ProcessorMinThrottle;\n      BYTE ProcessorMaxThrottle;\n      BYTE spare2[4];\n      BOOLEAN DiskSpinDown;\n      BYTE spare3[8];\n      BOOLEAN SystemBatteriesPresent;\n      BOOLEAN BatteriesAreShortTerm;\n      BATTERY_REPORTING_SCALE BatteryScale[3];\n      SYSTEM_POWER_STATE AcOnLineWake;\n      SYSTEM_POWER_STATE SoftLidWake;\n      SYSTEM_POWER_STATE RtcWake;\n      SYSTEM_POWER_STATE MinDeviceWakeState;\n      SYSTEM_POWER_STATE DefaultLowLatencyWake;\n    } SYSTEM_POWER_CAPABILITIES,*PSYSTEM_POWER_CAPABILITIES;\n\n    typedef struct {\n      BOOLEAN AcOnLine;\n      BOOLEAN BatteryPresent;\n      BOOLEAN Charging;\n      BOOLEAN Discharging;\n      BOOLEAN Spare1[4];\n      DWORD MaxCapacity;\n      DWORD RemainingCapacity;\n      DWORD Rate;\n      DWORD EstimatedTime;\n      DWORD DefaultAlert1;\n      DWORD DefaultAlert2;\n    } SYSTEM_BATTERY_STATE,*PSYSTEM_BATTERY_STATE;\n\n#include \"pshpack4.h\"\n\n#define IMAGE_DOS_SIGNATURE 0x5A4D\n#define IMAGE_OS2_SIGNATURE 0x454E\n#define IMAGE_OS2_SIGNATURE_LE 0x454C\n#define IMAGE_VXD_SIGNATURE 0x454C\n#define IMAGE_NT_SIGNATURE 0x00004550\n\n#include \"pshpack2.h\"\n\n    typedef struct _IMAGE_DOS_HEADER {\n      WORD e_magic;\n      WORD e_cblp;\n      WORD e_cp;\n      WORD e_crlc;\n      WORD e_cparhdr;\n      WORD e_minalloc;\n      WORD e_maxalloc;\n      WORD e_ss;\n      WORD e_sp;\n      WORD e_csum;\n      WORD e_ip;\n      WORD e_cs;\n      WORD e_lfarlc;\n      WORD e_ovno;\n      WORD e_res[4];\n      WORD e_oemid;\n      WORD e_oeminfo;\n      WORD e_res2[10];\n      LONG e_lfanew;\n    } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;\n\n    typedef struct _IMAGE_OS2_HEADER {\n      WORD ne_magic;\n      CHAR ne_ver;\n      CHAR ne_rev;\n      WORD ne_enttab;\n      WORD ne_cbenttab;\n      LONG ne_crc;\n      WORD ne_flags;\n      WORD ne_autodata;\n      WORD ne_heap;\n      WORD ne_stack;\n      LONG ne_csip;\n      LONG ne_sssp;\n      WORD ne_cseg;\n      WORD ne_cmod;\n      WORD ne_cbnrestab;\n      WORD ne_segtab;\n      WORD ne_rsrctab;\n      WORD ne_restab;\n      WORD ne_modtab;\n      WORD ne_imptab;\n      LONG ne_nrestab;\n      WORD ne_cmovent;\n      WORD ne_align;\n      WORD ne_cres;\n      BYTE ne_exetyp;\n      BYTE ne_flagsothers;\n      WORD ne_pretthunks;\n      WORD ne_psegrefbytes;\n      WORD ne_swaparea;\n      WORD ne_expver;\n    } IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;\n\n    typedef struct _IMAGE_VXD_HEADER {\n      WORD e32_magic;\n      BYTE e32_border;\n      BYTE e32_worder;\n      DWORD e32_level;\n      WORD e32_cpu;\n      WORD e32_os;\n      DWORD e32_ver;\n      DWORD e32_mflags;\n      DWORD e32_mpages;\n      DWORD e32_startobj;\n      DWORD e32_eip;\n      DWORD e32_stackobj;\n      DWORD e32_esp;\n      DWORD e32_pagesize;\n      DWORD e32_lastpagesize;\n      DWORD e32_fixupsize;\n      DWORD e32_fixupsum;\n      DWORD e32_ldrsize;\n      DWORD e32_ldrsum;\n      DWORD e32_objtab;\n      DWORD e32_objcnt;\n      DWORD e32_objmap;\n      DWORD e32_itermap;\n      DWORD e32_rsrctab;\n      DWORD e32_rsrccnt;\n      DWORD e32_restab;\n      DWORD e32_enttab;\n      DWORD e32_dirtab;\n      DWORD e32_dircnt;\n      DWORD e32_fpagetab;\n      DWORD e32_frectab;\n      DWORD e32_impmod;\n      DWORD e32_impmodcnt;\n      DWORD e32_impproc;\n      DWORD e32_pagesum;\n      DWORD e32_datapage;\n      DWORD e32_preload;\n      DWORD e32_nrestab;\n      DWORD e32_cbnrestab;\n      DWORD e32_nressum;\n      DWORD e32_autodata;\n      DWORD e32_debuginfo;\n      DWORD e32_debuglen;\n      DWORD e32_instpreload;\n      DWORD e32_instdemand;\n      DWORD e32_heapsize;\n      BYTE e32_res3[12];\n      DWORD e32_winresoff;\n      DWORD e32_winreslen;\n      WORD e32_devid;\n      WORD e32_ddkver;\n    } IMAGE_VXD_HEADER,*PIMAGE_VXD_HEADER;\n\n#include \"poppack.h\"\n\n    typedef struct _IMAGE_FILE_HEADER {\n      WORD Machine;\n      WORD NumberOfSections;\n      DWORD TimeDateStamp;\n      DWORD PointerToSymbolTable;\n      DWORD NumberOfSymbols;\n      WORD SizeOfOptionalHeader;\n      WORD Characteristics;\n    } IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;\n\n#define IMAGE_SIZEOF_FILE_HEADER 20\n\n#define IMAGE_FILE_RELOCS_STRIPPED 0x0001\n#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002\n#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004\n#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008\n#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010\n#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020\n#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080\n#define IMAGE_FILE_32BIT_MACHINE 0x0100\n#define IMAGE_FILE_DEBUG_STRIPPED 0x0200\n#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400\n#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800\n#define IMAGE_FILE_SYSTEM 0x1000\n#define IMAGE_FILE_DLL 0x2000\n#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000\n#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000\n\n#define IMAGE_FILE_MACHINE_UNKNOWN 0\n#define IMAGE_FILE_MACHINE_I386 0x014c\n#define IMAGE_FILE_MACHINE_R3000 0x0162\n#define IMAGE_FILE_MACHINE_R4000 0x0166\n#define IMAGE_FILE_MACHINE_R10000 0x0168\n#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169\n#define IMAGE_FILE_MACHINE_ALPHA 0x0184\n#define IMAGE_FILE_MACHINE_SH3 0x01a2\n#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3\n#define IMAGE_FILE_MACHINE_SH3E 0x01a4\n#define IMAGE_FILE_MACHINE_SH4 0x01a6\n#define IMAGE_FILE_MACHINE_SH5 0x01a8\n#define IMAGE_FILE_MACHINE_ARM 0x01c0\n#define IMAGE_FILE_MACHINE_THUMB 0x01c2\n#define IMAGE_FILE_MACHINE_AM33 0x01d3\n#define IMAGE_FILE_MACHINE_POWERPC 0x01F0\n#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1\n#define IMAGE_FILE_MACHINE_IA64 0x0200\n#define IMAGE_FILE_MACHINE_MIPS16 0x0266\n#define IMAGE_FILE_MACHINE_ALPHA64 0x0284\n#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366\n#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466\n#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64\n#define IMAGE_FILE_MACHINE_TRICORE 0x0520\n#define IMAGE_FILE_MACHINE_CEF 0x0CEF\n#define IMAGE_FILE_MACHINE_EBC 0x0EBC\n#define IMAGE_FILE_MACHINE_AMD64 0x8664\n#define IMAGE_FILE_MACHINE_M32R 0x9041\n#define IMAGE_FILE_MACHINE_CEE 0xC0EE\n\n    typedef struct _IMAGE_DATA_DIRECTORY {\n      DWORD VirtualAddress;\n      DWORD Size;\n    } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;\n\n#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16\n\n    typedef struct _IMAGE_OPTIONAL_HEADER {\n\n      WORD Magic;\n      BYTE MajorLinkerVersion;\n      BYTE MinorLinkerVersion;\n      DWORD SizeOfCode;\n      DWORD SizeOfInitializedData;\n      DWORD SizeOfUninitializedData;\n      DWORD AddressOfEntryPoint;\n      DWORD BaseOfCode;\n      DWORD BaseOfData;\n      DWORD ImageBase;\n      DWORD SectionAlignment;\n      DWORD FileAlignment;\n      WORD MajorOperatingSystemVersion;\n      WORD MinorOperatingSystemVersion;\n      WORD MajorImageVersion;\n      WORD MinorImageVersion;\n      WORD MajorSubsystemVersion;\n      WORD MinorSubsystemVersion;\n      DWORD Win32VersionValue;\n      DWORD SizeOfImage;\n      DWORD SizeOfHeaders;\n      DWORD CheckSum;\n      WORD Subsystem;\n      WORD DllCharacteristics;\n      DWORD SizeOfStackReserve;\n      DWORD SizeOfStackCommit;\n      DWORD SizeOfHeapReserve;\n      DWORD SizeOfHeapCommit;\n      DWORD LoaderFlags;\n      DWORD NumberOfRvaAndSizes;\n      IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];\n    } IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;\n\n    typedef struct _IMAGE_ROM_OPTIONAL_HEADER {\n      WORD Magic;\n      BYTE MajorLinkerVersion;\n      BYTE MinorLinkerVersion;\n      DWORD SizeOfCode;\n      DWORD SizeOfInitializedData;\n      DWORD SizeOfUninitializedData;\n      DWORD AddressOfEntryPoint;\n      DWORD BaseOfCode;\n      DWORD BaseOfData;\n      DWORD BaseOfBss;\n      DWORD GprMask;\n      DWORD CprMask[4];\n      DWORD GpValue;\n    } IMAGE_ROM_OPTIONAL_HEADER,*PIMAGE_ROM_OPTIONAL_HEADER;\n\n    typedef struct _IMAGE_OPTIONAL_HEADER64 {\n      WORD Magic;\n      BYTE MajorLinkerVersion;\n      BYTE MinorLinkerVersion;\n      DWORD SizeOfCode;\n      DWORD SizeOfInitializedData;\n      DWORD SizeOfUninitializedData;\n      DWORD AddressOfEntryPoint;\n      DWORD BaseOfCode;\n      ULONGLONG ImageBase;\n      DWORD SectionAlignment;\n      DWORD FileAlignment;\n      WORD MajorOperatingSystemVersion;\n      WORD MinorOperatingSystemVersion;\n      WORD MajorImageVersion;\n      WORD MinorImageVersion;\n      WORD MajorSubsystemVersion;\n      WORD MinorSubsystemVersion;\n      DWORD Win32VersionValue;\n      DWORD SizeOfImage;\n      DWORD SizeOfHeaders;\n      DWORD CheckSum;\n      WORD Subsystem;\n      WORD DllCharacteristics;\n      ULONGLONG SizeOfStackReserve;\n      ULONGLONG SizeOfStackCommit;\n      ULONGLONG SizeOfHeapReserve;\n      ULONGLONG SizeOfHeapCommit;\n      DWORD LoaderFlags;\n      DWORD NumberOfRvaAndSizes;\n      IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];\n    } IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64;\n\n#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56\n#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28\n#define IMAGE_SIZEOF_NT_OPTIONAL32_HEADER 224\n#define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER 240\n\n#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b\n#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b\n#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107\n\n#ifdef _WIN64\n    typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;\n    typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;\n#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL64_HEADER\n#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC\n#else\n    typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;\n    typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;\n#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL32_HEADER\n#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC\n#endif\n\n    typedef struct _IMAGE_NT_HEADERS64 {\n      DWORD Signature;\n      IMAGE_FILE_HEADER FileHeader;\n      IMAGE_OPTIONAL_HEADER64 OptionalHeader;\n    } IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;\n\n    typedef struct _IMAGE_NT_HEADERS {\n      DWORD Signature;\n      IMAGE_FILE_HEADER FileHeader;\n      IMAGE_OPTIONAL_HEADER32 OptionalHeader;\n    } IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;\n\n    typedef struct _IMAGE_ROM_HEADERS {\n      IMAGE_FILE_HEADER FileHeader;\n      IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;\n    } IMAGE_ROM_HEADERS,*PIMAGE_ROM_HEADERS;\n\n#ifdef _WIN64\n    typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;\n    typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;\n#else\n    typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;\n    typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;\n#endif\n\n#define IMAGE_FIRST_SECTION(ntheader) ((PIMAGE_SECTION_HEADER) ((ULONG_PTR)ntheader + FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader) + ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader))\n\n#define IMAGE_SUBSYSTEM_UNKNOWN 0\n#define IMAGE_SUBSYSTEM_NATIVE 1\n#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2\n#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3\n#define IMAGE_SUBSYSTEM_OS2_CUI 5\n#define IMAGE_SUBSYSTEM_POSIX_CUI 7\n#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8\n#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9\n#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10\n#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11\n#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12\n#define IMAGE_SUBSYSTEM_EFI_ROM 13\n#define IMAGE_SUBSYSTEM_XBOX 14\n\n#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200\n#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400\n#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800\n#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000\n#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000\n\n#define IMAGE_DIRECTORY_ENTRY_EXPORT 0\n#define IMAGE_DIRECTORY_ENTRY_IMPORT 1\n#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2\n#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3\n#define IMAGE_DIRECTORY_ENTRY_SECURITY 4\n#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5\n#define IMAGE_DIRECTORY_ENTRY_DEBUG 6\n\n#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7\n#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8\n#define IMAGE_DIRECTORY_ENTRY_TLS 9\n#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10\n#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11\n#define IMAGE_DIRECTORY_ENTRY_IAT 12\n#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13\n#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14\n\n    typedef struct ANON_OBJECT_HEADER {\n      WORD Sig1;\n      WORD Sig2;\n      WORD Version;\n      WORD Machine;\n      DWORD TimeDateStamp;\n      CLSID ClassID;\n      DWORD SizeOfData;\n    } ANON_OBJECT_HEADER;\n\n#define IMAGE_SIZEOF_SHORT_NAME 8\n\n    typedef struct _IMAGE_SECTION_HEADER {\n      BYTE Name[IMAGE_SIZEOF_SHORT_NAME];\n      union {\n\tDWORD PhysicalAddress;\n\tDWORD VirtualSize;\n      } Misc;\n      DWORD VirtualAddress;\n      DWORD SizeOfRawData;\n      DWORD PointerToRawData;\n      DWORD PointerToRelocations;\n      DWORD PointerToLinenumbers;\n      WORD NumberOfRelocations;\n      WORD NumberOfLinenumbers;\n      DWORD Characteristics;\n    } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;\n\n#define IMAGE_SIZEOF_SECTION_HEADER 40\n\n#define IMAGE_SCN_TYPE_NO_PAD 0x00000008\n\n#define IMAGE_SCN_CNT_CODE 0x00000020\n#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040\n#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080\n#define IMAGE_SCN_LNK_OTHER 0x00000100\n#define IMAGE_SCN_LNK_INFO 0x00000200\n#define IMAGE_SCN_LNK_REMOVE 0x00000800\n#define IMAGE_SCN_LNK_COMDAT 0x00001000\n#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000\n#define IMAGE_SCN_GPREL 0x00008000\n#define IMAGE_SCN_MEM_FARDATA 0x00008000\n#define IMAGE_SCN_MEM_PURGEABLE 0x00020000\n#define IMAGE_SCN_MEM_16BIT 0x00020000\n#define IMAGE_SCN_MEM_LOCKED 0x00040000\n#define IMAGE_SCN_MEM_PRELOAD 0x00080000\n\n#define IMAGE_SCN_ALIGN_1BYTES 0x00100000\n#define IMAGE_SCN_ALIGN_2BYTES 0x00200000\n#define IMAGE_SCN_ALIGN_4BYTES 0x00300000\n#define IMAGE_SCN_ALIGN_8BYTES 0x00400000\n#define IMAGE_SCN_ALIGN_16BYTES 0x00500000\n#define IMAGE_SCN_ALIGN_32BYTES 0x00600000\n#define IMAGE_SCN_ALIGN_64BYTES 0x00700000\n#define IMAGE_SCN_ALIGN_128BYTES 0x00800000\n#define IMAGE_SCN_ALIGN_256BYTES 0x00900000\n#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000\n#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000\n#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000\n#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000\n#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000\n\n#define IMAGE_SCN_ALIGN_MASK 0x00F00000\n\n#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000\n#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000\n#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000\n#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000\n#define IMAGE_SCN_MEM_SHARED 0x10000000\n#define IMAGE_SCN_MEM_EXECUTE 0x20000000\n#define IMAGE_SCN_MEM_READ 0x40000000\n#define IMAGE_SCN_MEM_WRITE 0x80000000\n\n#define IMAGE_SCN_SCALE_INDEX 0x00000001\n\n#include \"pshpack2.h\"\n\n    typedef struct _IMAGE_SYMBOL {\n      union {\n\tBYTE ShortName[8];\n\tstruct {\n\t  DWORD Short;\n\t  DWORD Long;\n\t} Name;\n\tDWORD LongName[2];\n      } N;\n      DWORD Value;\n      SHORT SectionNumber;\n      WORD Type;\n      BYTE StorageClass;\n      BYTE NumberOfAuxSymbols;\n    } IMAGE_SYMBOL;\n    typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;\n\n#define IMAGE_SIZEOF_SYMBOL 18\n\n#define IMAGE_SYM_UNDEFINED (SHORT)0\n#define IMAGE_SYM_ABSOLUTE (SHORT)-1\n#define IMAGE_SYM_DEBUG (SHORT)-2\n#define IMAGE_SYM_SECTION_MAX 0xFEFF\n\n#define IMAGE_SYM_TYPE_NULL 0x0000\n#define IMAGE_SYM_TYPE_VOID 0x0001\n#define IMAGE_SYM_TYPE_CHAR 0x0002\n#define IMAGE_SYM_TYPE_SHORT 0x0003\n#define IMAGE_SYM_TYPE_INT 0x0004\n#define IMAGE_SYM_TYPE_LONG 0x0005\n#define IMAGE_SYM_TYPE_FLOAT 0x0006\n#define IMAGE_SYM_TYPE_DOUBLE 0x0007\n#define IMAGE_SYM_TYPE_STRUCT 0x0008\n#define IMAGE_SYM_TYPE_UNION 0x0009\n#define IMAGE_SYM_TYPE_ENUM 0x000A\n#define IMAGE_SYM_TYPE_MOE 0x000B\n#define IMAGE_SYM_TYPE_BYTE 0x000C\n#define IMAGE_SYM_TYPE_WORD 0x000D\n#define IMAGE_SYM_TYPE_UINT 0x000E\n#define IMAGE_SYM_TYPE_DWORD 0x000F\n#define IMAGE_SYM_TYPE_PCODE 0x8000\n\n#define IMAGE_SYM_DTYPE_NULL 0\n#define IMAGE_SYM_DTYPE_POINTER 1\n#define IMAGE_SYM_DTYPE_FUNCTION 2\n#define IMAGE_SYM_DTYPE_ARRAY 3\n\n#define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE)-1\n#define IMAGE_SYM_CLASS_NULL 0x0000\n#define IMAGE_SYM_CLASS_AUTOMATIC 0x0001\n#define IMAGE_SYM_CLASS_EXTERNAL 0x0002\n#define IMAGE_SYM_CLASS_STATIC 0x0003\n#define IMAGE_SYM_CLASS_REGISTER 0x0004\n#define IMAGE_SYM_CLASS_EXTERNAL_DEF 0x0005\n#define IMAGE_SYM_CLASS_LABEL 0x0006\n#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 0x0007\n#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 0x0008\n#define IMAGE_SYM_CLASS_ARGUMENT 0x0009\n#define IMAGE_SYM_CLASS_STRUCT_TAG 0x000A\n#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 0x000B\n#define IMAGE_SYM_CLASS_UNION_TAG 0x000C\n#define IMAGE_SYM_CLASS_TYPE_DEFINITION 0x000D\n#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 0x000E\n#define IMAGE_SYM_CLASS_ENUM_TAG 0x000F\n#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 0x0010\n#define IMAGE_SYM_CLASS_REGISTER_PARAM 0x0011\n#define IMAGE_SYM_CLASS_BIT_FIELD 0x0012\n#define IMAGE_SYM_CLASS_FAR_EXTERNAL 0x0044\n#define IMAGE_SYM_CLASS_BLOCK 0x0064\n#define IMAGE_SYM_CLASS_FUNCTION 0x0065\n#define IMAGE_SYM_CLASS_END_OF_STRUCT 0x0066\n#define IMAGE_SYM_CLASS_FILE 0x0067\n#define IMAGE_SYM_CLASS_SECTION 0x0068\n#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 0x0069\n#define IMAGE_SYM_CLASS_CLR_TOKEN 0x006B\n\n#define N_BTMASK 0x000F\n#define N_TMASK 0x0030\n#define N_TMASK1 0x00C0\n#define N_TMASK2 0x00F0\n#define N_BTSHFT 4\n#define N_TSHIFT 2\n\n#define BTYPE(x) ((x) & N_BTMASK)\n\n#ifndef ISPTR\n#define ISPTR(x) (((x) & N_TMASK)==(IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))\n#endif\n\n#ifndef ISFCN\n#define ISFCN(x) (((x) & N_TMASK)==(IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))\n#endif\n\n#ifndef ISARY\n#define ISARY(x) (((x) & N_TMASK)==(IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))\n#endif\n\n#ifndef ISTAG\n#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)\n#endif\n\n#ifndef INCREF\n#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))\n#endif\n#ifndef DECREF\n#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))\n#endif\n\n    typedef union _IMAGE_AUX_SYMBOL {\n      struct {\n\tDWORD TagIndex;\n\tunion {\n\t  struct {\n\t    WORD Linenumber;\n\t    WORD Size;\n\t  } LnSz;\n\t  DWORD TotalSize;\n\t} Misc;\n\tunion {\n\t  struct {\n\t    DWORD PointerToLinenumber;\n\t    DWORD PointerToNextFunction;\n\t  } Function;\n\t  struct {\n\t    WORD Dimension[4];\n\t  } Array;\n\t} FcnAry;\n\tWORD TvIndex;\n      } Sym;\n      struct {\n\tBYTE Name[IMAGE_SIZEOF_SYMBOL];\n      } File;\n      struct {\n\tDWORD Length;\n\tWORD NumberOfRelocations;\n\tWORD NumberOfLinenumbers;\n\tDWORD CheckSum;\n\tSHORT Number;\n\tBYTE Selection;\n      } Section;\n    } IMAGE_AUX_SYMBOL;\n    typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;\n\n#define IMAGE_SIZEOF_AUX_SYMBOL 18\n\n    typedef enum IMAGE_AUX_SYMBOL_TYPE {\n      IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1\n    } IMAGE_AUX_SYMBOL_TYPE;\n\n#include <pshpack2.h>\n\n    typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {\n      BYTE bAuxType;\n      BYTE bReserved;\n      DWORD SymbolTableIndex;\n      BYTE rgbReserved[12];\n    } IMAGE_AUX_SYMBOL_TOKEN_DEF;\n\n    typedef IMAGE_AUX_SYMBOL_TOKEN_DEF UNALIGNED *PIMAGE_AUX_SYMBOL_TOKEN_DEF;\n\n#include <poppack.h>\n\n#define IMAGE_COMDAT_SELECT_NODUPLICATES 1\n#define IMAGE_COMDAT_SELECT_ANY 2\n#define IMAGE_COMDAT_SELECT_SAME_SIZE 3\n#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4\n#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5\n#define IMAGE_COMDAT_SELECT_LARGEST 6\n#define IMAGE_COMDAT_SELECT_NEWEST 7\n\n#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1\n#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2\n#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3\n\n    typedef struct _IMAGE_RELOCATION {\n      union {\n\tDWORD VirtualAddress;\n\tDWORD RelocCount;\n      };\n      DWORD SymbolTableIndex;\n      WORD Type;\n    } IMAGE_RELOCATION;\n    typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;\n\n#define IMAGE_SIZEOF_RELOCATION 10\n\n#define IMAGE_REL_I386_ABSOLUTE 0x0000\n#define IMAGE_REL_I386_DIR16 0x0001\n#define IMAGE_REL_I386_REL16 0x0002\n#define IMAGE_REL_I386_DIR32 0x0006\n#define IMAGE_REL_I386_DIR32NB 0x0007\n#define IMAGE_REL_I386_SEG12 0x0009\n#define IMAGE_REL_I386_SECTION 0x000A\n#define IMAGE_REL_I386_SECREL 0x000B\n#define IMAGE_REL_I386_TOKEN 0x000C\n#define IMAGE_REL_I386_SECREL7 0x000D\n#define IMAGE_REL_I386_REL32 0x0014\n\n#define IMAGE_REL_MIPS_ABSOLUTE 0x0000\n#define IMAGE_REL_MIPS_REFHALF 0x0001\n#define IMAGE_REL_MIPS_REFWORD 0x0002\n#define IMAGE_REL_MIPS_JMPADDR 0x0003\n#define IMAGE_REL_MIPS_REFHI 0x0004\n#define IMAGE_REL_MIPS_REFLO 0x0005\n#define IMAGE_REL_MIPS_GPREL 0x0006\n#define IMAGE_REL_MIPS_LITERAL 0x0007\n#define IMAGE_REL_MIPS_SECTION 0x000A\n#define IMAGE_REL_MIPS_SECREL 0x000B\n#define IMAGE_REL_MIPS_SECRELLO 0x000C\n#define IMAGE_REL_MIPS_SECRELHI 0x000D\n#define IMAGE_REL_MIPS_TOKEN 0x000E\n#define IMAGE_REL_MIPS_JMPADDR16 0x0010\n#define IMAGE_REL_MIPS_REFWORDNB 0x0022\n#define IMAGE_REL_MIPS_PAIR 0x0025\n\n#define IMAGE_REL_ALPHA_ABSOLUTE 0x0000\n#define IMAGE_REL_ALPHA_REFLONG 0x0001\n#define IMAGE_REL_ALPHA_REFQUAD 0x0002\n#define IMAGE_REL_ALPHA_GPREL32 0x0003\n#define IMAGE_REL_ALPHA_LITERAL 0x0004\n#define IMAGE_REL_ALPHA_LITUSE 0x0005\n#define IMAGE_REL_ALPHA_GPDISP 0x0006\n#define IMAGE_REL_ALPHA_BRADDR 0x0007\n#define IMAGE_REL_ALPHA_HINT 0x0008\n#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009\n#define IMAGE_REL_ALPHA_REFHI 0x000A\n#define IMAGE_REL_ALPHA_REFLO 0x000B\n#define IMAGE_REL_ALPHA_PAIR 0x000C\n#define IMAGE_REL_ALPHA_MATCH 0x000D\n#define IMAGE_REL_ALPHA_SECTION 0x000E\n#define IMAGE_REL_ALPHA_SECREL 0x000F\n#define IMAGE_REL_ALPHA_REFLONGNB 0x0010\n#define IMAGE_REL_ALPHA_SECRELLO 0x0011\n#define IMAGE_REL_ALPHA_SECRELHI 0x0012\n#define IMAGE_REL_ALPHA_REFQ3 0x0013\n#define IMAGE_REL_ALPHA_REFQ2 0x0014\n#define IMAGE_REL_ALPHA_REFQ1 0x0015\n#define IMAGE_REL_ALPHA_GPRELLO 0x0016\n#define IMAGE_REL_ALPHA_GPRELHI 0x0017\n\n#define IMAGE_REL_PPC_ABSOLUTE 0x0000\n#define IMAGE_REL_PPC_ADDR64 0x0001\n#define IMAGE_REL_PPC_ADDR32 0x0002\n#define IMAGE_REL_PPC_ADDR24 0x0003\n#define IMAGE_REL_PPC_ADDR16 0x0004\n#define IMAGE_REL_PPC_ADDR14 0x0005\n#define IMAGE_REL_PPC_REL24 0x0006\n#define IMAGE_REL_PPC_REL14 0x0007\n#define IMAGE_REL_PPC_TOCREL16 0x0008\n#define IMAGE_REL_PPC_TOCREL14 0x0009\n#define IMAGE_REL_PPC_ADDR32NB 0x000A\n#define IMAGE_REL_PPC_SECREL 0x000B\n#define IMAGE_REL_PPC_SECTION 0x000C\n#define IMAGE_REL_PPC_IFGLUE 0x000D\n#define IMAGE_REL_PPC_IMGLUE 0x000E\n#define IMAGE_REL_PPC_SECREL16 0x000F\n#define IMAGE_REL_PPC_REFHI 0x0010\n#define IMAGE_REL_PPC_REFLO 0x0011\n#define IMAGE_REL_PPC_PAIR 0x0012\n#define IMAGE_REL_PPC_SECRELLO 0x0013\n#define IMAGE_REL_PPC_SECRELHI 0x0014\n#define IMAGE_REL_PPC_GPREL 0x0015\n#define IMAGE_REL_PPC_TOKEN 0x0016\n#define IMAGE_REL_PPC_TYPEMASK 0x00FF\n#define IMAGE_REL_PPC_NEG 0x0100\n#define IMAGE_REL_PPC_BRTAKEN 0x0200\n#define IMAGE_REL_PPC_BRNTAKEN 0x0400\n#define IMAGE_REL_PPC_TOCDEFN 0x0800\n\n#define IMAGE_REL_SH3_ABSOLUTE 0x0000\n#define IMAGE_REL_SH3_DIRECT16 0x0001\n#define IMAGE_REL_SH3_DIRECT32 0x0002\n#define IMAGE_REL_SH3_DIRECT8 0x0003\n#define IMAGE_REL_SH3_DIRECT8_WORD 0x0004\n#define IMAGE_REL_SH3_DIRECT8_LONG 0x0005\n#define IMAGE_REL_SH3_DIRECT4 0x0006\n#define IMAGE_REL_SH3_DIRECT4_WORD 0x0007\n#define IMAGE_REL_SH3_DIRECT4_LONG 0x0008\n#define IMAGE_REL_SH3_PCREL8_WORD 0x0009\n#define IMAGE_REL_SH3_PCREL8_LONG 0x000A\n#define IMAGE_REL_SH3_PCREL12_WORD 0x000B\n#define IMAGE_REL_SH3_STARTOF_SECTION 0x000C\n#define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D\n#define IMAGE_REL_SH3_SECTION 0x000E\n#define IMAGE_REL_SH3_SECREL 0x000F\n#define IMAGE_REL_SH3_DIRECT32_NB 0x0010\n#define IMAGE_REL_SH3_GPREL4_LONG 0x0011\n#define IMAGE_REL_SH3_TOKEN 0x0012\n\n#define IMAGE_REL_SHM_PCRELPT 0x0013\n#define IMAGE_REL_SHM_REFLO 0x0014\n#define IMAGE_REL_SHM_REFHALF 0x0015\n#define IMAGE_REL_SHM_RELLO 0x0016\n#define IMAGE_REL_SHM_RELHALF 0x0017\n#define IMAGE_REL_SHM_PAIR 0x0018\n\n#define IMAGE_REL_SH_NOMODE 0x8000\n\n#define IMAGE_REL_ARM_ABSOLUTE 0x0000\n#define IMAGE_REL_ARM_ADDR32 0x0001\n#define IMAGE_REL_ARM_ADDR32NB 0x0002\n#define IMAGE_REL_ARM_BRANCH24 0x0003\n#define IMAGE_REL_ARM_BRANCH11 0x0004\n#define IMAGE_REL_ARM_TOKEN 0x0005\n#define IMAGE_REL_ARM_GPREL12 0x0006\n#define IMAGE_REL_ARM_GPREL7 0x0007\n#define IMAGE_REL_ARM_BLX24 0x0008\n#define IMAGE_REL_ARM_BLX11 0x0009\n#define IMAGE_REL_ARM_SECTION 0x000E\n#define IMAGE_REL_ARM_SECREL 0x000F\n\n#define IMAGE_REL_AM_ABSOLUTE 0x0000\n#define IMAGE_REL_AM_ADDR32 0x0001\n#define IMAGE_REL_AM_ADDR32NB 0x0002\n#define IMAGE_REL_AM_CALL32 0x0003\n#define IMAGE_REL_AM_FUNCINFO 0x0004\n#define IMAGE_REL_AM_REL32_1 0x0005\n#define IMAGE_REL_AM_REL32_2 0x0006\n#define IMAGE_REL_AM_SECREL 0x0007\n#define IMAGE_REL_AM_SECTION 0x0008\n#define IMAGE_REL_AM_TOKEN 0x0009\n\n#define IMAGE_REL_AMD64_ABSOLUTE 0x0000\n#define IMAGE_REL_AMD64_ADDR64 0x0001\n#define IMAGE_REL_AMD64_ADDR32 0x0002\n#define IMAGE_REL_AMD64_ADDR32NB 0x0003\n#define IMAGE_REL_AMD64_REL32 0x0004\n#define IMAGE_REL_AMD64_REL32_1 0x0005\n#define IMAGE_REL_AMD64_REL32_2 0x0006\n#define IMAGE_REL_AMD64_REL32_3 0x0007\n#define IMAGE_REL_AMD64_REL32_4 0x0008\n#define IMAGE_REL_AMD64_REL32_5 0x0009\n#define IMAGE_REL_AMD64_SECTION 0x000A\n#define IMAGE_REL_AMD64_SECREL 0x000B\n#define IMAGE_REL_AMD64_SECREL7 0x000C\n#define IMAGE_REL_AMD64_TOKEN 0x000D\n#define IMAGE_REL_AMD64_SREL32 0x000E\n#define IMAGE_REL_AMD64_PAIR 0x000F\n#define IMAGE_REL_AMD64_SSPAN32 0x0010\n\n#define IMAGE_REL_IA64_ABSOLUTE 0x0000\n#define IMAGE_REL_IA64_IMM14 0x0001\n#define IMAGE_REL_IA64_IMM22 0x0002\n#define IMAGE_REL_IA64_IMM64 0x0003\n#define IMAGE_REL_IA64_DIR32 0x0004\n#define IMAGE_REL_IA64_DIR64 0x0005\n#define IMAGE_REL_IA64_PCREL21B 0x0006\n#define IMAGE_REL_IA64_PCREL21M 0x0007\n#define IMAGE_REL_IA64_PCREL21F 0x0008\n#define IMAGE_REL_IA64_GPREL22 0x0009\n#define IMAGE_REL_IA64_LTOFF22 0x000A\n#define IMAGE_REL_IA64_SECTION 0x000B\n#define IMAGE_REL_IA64_SECREL22 0x000C\n#define IMAGE_REL_IA64_SECREL64I 0x000D\n#define IMAGE_REL_IA64_SECREL32 0x000E\n\n#define IMAGE_REL_IA64_DIR32NB 0x0010\n#define IMAGE_REL_IA64_SREL14 0x0011\n#define IMAGE_REL_IA64_SREL22 0x0012\n#define IMAGE_REL_IA64_SREL32 0x0013\n#define IMAGE_REL_IA64_UREL32 0x0014\n#define IMAGE_REL_IA64_PCREL60X 0x0015\n#define IMAGE_REL_IA64_PCREL60B 0x0016\n#define IMAGE_REL_IA64_PCREL60F 0x0017\n#define IMAGE_REL_IA64_PCREL60I 0x0018\n#define IMAGE_REL_IA64_PCREL60M 0x0019\n#define IMAGE_REL_IA64_IMMGPREL64 0x001A\n#define IMAGE_REL_IA64_TOKEN 0x001B\n#define IMAGE_REL_IA64_GPREL32 0x001C\n#define IMAGE_REL_IA64_ADDEND 0x001F\n\n#define IMAGE_REL_CEF_ABSOLUTE 0x0000\n#define IMAGE_REL_CEF_ADDR32 0x0001\n#define IMAGE_REL_CEF_ADDR64 0x0002\n#define IMAGE_REL_CEF_ADDR32NB 0x0003\n#define IMAGE_REL_CEF_SECTION 0x0004\n#define IMAGE_REL_CEF_SECREL 0x0005\n#define IMAGE_REL_CEF_TOKEN 0x0006\n\n#define IMAGE_REL_CEE_ABSOLUTE 0x0000\n#define IMAGE_REL_CEE_ADDR32 0x0001\n#define IMAGE_REL_CEE_ADDR64 0x0002\n#define IMAGE_REL_CEE_ADDR32NB 0x0003\n#define IMAGE_REL_CEE_SECTION 0x0004\n#define IMAGE_REL_CEE_SECREL 0x0005\n#define IMAGE_REL_CEE_TOKEN 0x0006\n\n#define IMAGE_REL_M32R_ABSOLUTE 0x0000\n#define IMAGE_REL_M32R_ADDR32 0x0001\n#define IMAGE_REL_M32R_ADDR32NB 0x0002\n#define IMAGE_REL_M32R_ADDR24 0x0003\n#define IMAGE_REL_M32R_GPREL16 0x0004\n#define IMAGE_REL_M32R_PCREL24 0x0005\n#define IMAGE_REL_M32R_PCREL16 0x0006\n#define IMAGE_REL_M32R_PCREL8 0x0007\n#define IMAGE_REL_M32R_REFHALF 0x0008\n#define IMAGE_REL_M32R_REFHI 0x0009\n#define IMAGE_REL_M32R_REFLO 0x000A\n#define IMAGE_REL_M32R_PAIR 0x000B\n#define IMAGE_REL_M32R_SECTION 0x000C\n#define IMAGE_REL_M32R_SECREL32 0x000D\n#define IMAGE_REL_M32R_TOKEN 0x000E\n\n#define EXT_IMM64(Value,Address,Size,InstPos,ValPos) Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos)\n#define INS_IMM64(Value,Address,Size,InstPos,ValPos) *(PDWORD)Address = (*(PDWORD)Address & ~(((1 << Size) - 1) << InstPos)) | ((DWORD)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos)\n\n#define EMARCH_ENC_I17_IMM7B_INST_WORD_X 3\n#define EMARCH_ENC_I17_IMM7B_SIZE_X 7\n#define EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X 4\n#define EMARCH_ENC_I17_IMM7B_VAL_POS_X 0\n\n#define EMARCH_ENC_I17_IMM9D_INST_WORD_X 3\n#define EMARCH_ENC_I17_IMM9D_SIZE_X 9\n#define EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X 18\n#define EMARCH_ENC_I17_IMM9D_VAL_POS_X 7\n\n#define EMARCH_ENC_I17_IMM5C_INST_WORD_X 3\n#define EMARCH_ENC_I17_IMM5C_SIZE_X 5\n#define EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X 13\n#define EMARCH_ENC_I17_IMM5C_VAL_POS_X 16\n\n#define EMARCH_ENC_I17_IC_INST_WORD_X 3\n#define EMARCH_ENC_I17_IC_SIZE_X 1\n#define EMARCH_ENC_I17_IC_INST_WORD_POS_X 12\n#define EMARCH_ENC_I17_IC_VAL_POS_X 21\n\n#define EMARCH_ENC_I17_IMM41a_INST_WORD_X 1\n#define EMARCH_ENC_I17_IMM41a_SIZE_X 10\n#define EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X 14\n#define EMARCH_ENC_I17_IMM41a_VAL_POS_X 22\n\n#define EMARCH_ENC_I17_IMM41b_INST_WORD_X 1\n#define EMARCH_ENC_I17_IMM41b_SIZE_X 8\n#define EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X 24\n#define EMARCH_ENC_I17_IMM41b_VAL_POS_X 32\n\n#define EMARCH_ENC_I17_IMM41c_INST_WORD_X 2\n#define EMARCH_ENC_I17_IMM41c_SIZE_X 23\n#define EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X 0\n#define EMARCH_ENC_I17_IMM41c_VAL_POS_X 40\n\n#define EMARCH_ENC_I17_SIGN_INST_WORD_X 3\n#define EMARCH_ENC_I17_SIGN_SIZE_X 1\n#define EMARCH_ENC_I17_SIGN_INST_WORD_POS_X 27\n#define EMARCH_ENC_I17_SIGN_VAL_POS_X 63\n\n#define X3_OPCODE_INST_WORD_X 3\n#define X3_OPCODE_SIZE_X 4\n#define X3_OPCODE_INST_WORD_POS_X 28\n#define X3_OPCODE_SIGN_VAL_POS_X 0\n\n#define X3_I_INST_WORD_X 3\n#define X3_I_SIZE_X 1\n#define X3_I_INST_WORD_POS_X 27\n#define X3_I_SIGN_VAL_POS_X 59\n\n#define X3_D_WH_INST_WORD_X 3\n#define X3_D_WH_SIZE_X 3\n#define X3_D_WH_INST_WORD_POS_X 24\n#define X3_D_WH_SIGN_VAL_POS_X 0\n\n#define X3_IMM20_INST_WORD_X 3\n#define X3_IMM20_SIZE_X 20\n#define X3_IMM20_INST_WORD_POS_X 4\n#define X3_IMM20_SIGN_VAL_POS_X 0\n\n#define X3_IMM39_1_INST_WORD_X 2\n#define X3_IMM39_1_SIZE_X 23\n#define X3_IMM39_1_INST_WORD_POS_X 0\n#define X3_IMM39_1_SIGN_VAL_POS_X 36\n\n#define X3_IMM39_2_INST_WORD_X 1\n#define X3_IMM39_2_SIZE_X 16\n#define X3_IMM39_2_INST_WORD_POS_X 16\n#define X3_IMM39_2_SIGN_VAL_POS_X 20\n\n#define X3_P_INST_WORD_X 3\n#define X3_P_SIZE_X 4\n#define X3_P_INST_WORD_POS_X 0\n#define X3_P_SIGN_VAL_POS_X 0\n\n#define X3_TMPLT_INST_WORD_X 0\n#define X3_TMPLT_SIZE_X 4\n#define X3_TMPLT_INST_WORD_POS_X 0\n#define X3_TMPLT_SIGN_VAL_POS_X 0\n\n#define X3_BTYPE_QP_INST_WORD_X 2\n#define X3_BTYPE_QP_SIZE_X 9\n#define X3_BTYPE_QP_INST_WORD_POS_X 23\n#define X3_BTYPE_QP_INST_VAL_POS_X 0\n\n#define X3_EMPTY_INST_WORD_X 1\n#define X3_EMPTY_SIZE_X 2\n#define X3_EMPTY_INST_WORD_POS_X 14\n#define X3_EMPTY_INST_VAL_POS_X 0\n\n    typedef struct _IMAGE_LINENUMBER {\n      union {\n\tDWORD SymbolTableIndex;\n\tDWORD VirtualAddress;\n      } Type;\n      WORD Linenumber;\n    } IMAGE_LINENUMBER;\n    typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;\n\n#define IMAGE_SIZEOF_LINENUMBER 6\n\n#include \"poppack.h\"\n\n    typedef struct _IMAGE_BASE_RELOCATION {\n      DWORD VirtualAddress;\n      DWORD SizeOfBlock;\n\n    } IMAGE_BASE_RELOCATION;\n    typedef IMAGE_BASE_RELOCATION UNALIGNED *PIMAGE_BASE_RELOCATION;\n\n#define IMAGE_SIZEOF_BASE_RELOCATION 8\n\n#define IMAGE_REL_BASED_ABSOLUTE 0\n#define IMAGE_REL_BASED_HIGH 1\n#define IMAGE_REL_BASED_LOW 2\n#define IMAGE_REL_BASED_HIGHLOW 3\n#define IMAGE_REL_BASED_HIGHADJ 4\n#define IMAGE_REL_BASED_MIPS_JMPADDR 5\n#define IMAGE_REL_BASED_MIPS_JMPADDR16 9\n#define IMAGE_REL_BASED_IA64_IMM64 9\n#define IMAGE_REL_BASED_DIR64 10\n\n#define IMAGE_ARCHIVE_START_SIZE 8\n#define IMAGE_ARCHIVE_START \"!<arch>\\n\"\n#define IMAGE_ARCHIVE_END \"`\\n\"\n#define IMAGE_ARCHIVE_PAD \"\\n\"\n#define IMAGE_ARCHIVE_LINKER_MEMBER \"/               \"\n#define IMAGE_ARCHIVE_LONGNAMES_MEMBER \"//              \"\n\n    typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {\n      BYTE Name[16];\n      BYTE Date[12];\n      BYTE UserID[6];\n      BYTE GroupID[6];\n      BYTE Mode[8];\n      BYTE Size[10];\n      BYTE EndHeader[2];\n    } IMAGE_ARCHIVE_MEMBER_HEADER,*PIMAGE_ARCHIVE_MEMBER_HEADER;\n\n#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60\n\n    typedef struct _IMAGE_EXPORT_DIRECTORY {\n      DWORD Characteristics;\n      DWORD TimeDateStamp;\n      WORD MajorVersion;\n      WORD MinorVersion;\n      DWORD Name;\n      DWORD Base;\n      DWORD NumberOfFunctions;\n      DWORD NumberOfNames;\n      DWORD AddressOfFunctions;\n      DWORD AddressOfNames;\n      DWORD AddressOfNameOrdinals;\n    } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;\n\n    typedef struct _IMAGE_IMPORT_BY_NAME {\n      WORD Hint;\n      BYTE Name[1];\n    } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;\n\n#include \"pshpack8.h\"\n\n    typedef struct _IMAGE_THUNK_DATA64 {\n      union {\n\tULONGLONG ForwarderString;\n\tULONGLONG Function;\n\tULONGLONG Ordinal;\n\tULONGLONG AddressOfData;\n      } u1;\n    } IMAGE_THUNK_DATA64;\n    typedef IMAGE_THUNK_DATA64 *PIMAGE_THUNK_DATA64;\n\n#include \"poppack.h\"\n\n    typedef struct _IMAGE_THUNK_DATA32 {\n      union {\n\tDWORD ForwarderString;\n\tDWORD Function;\n\tDWORD Ordinal;\n\tDWORD AddressOfData;\n      } u1;\n    } IMAGE_THUNK_DATA32;\n    typedef IMAGE_THUNK_DATA32 *PIMAGE_THUNK_DATA32;\n\n#define IMAGE_ORDINAL_FLAG64 0x8000000000000000ull\n#define IMAGE_ORDINAL_FLAG32 0x80000000\n#define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffffull)\n#define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)\n#define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64)!=0)\n#define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32)!=0)\n\n    typedef VOID\n      (NTAPI *PIMAGE_TLS_CALLBACK)(PVOID DllHandle,DWORD Reason,PVOID Reserved);\n\n    typedef struct _IMAGE_TLS_DIRECTORY64 {\n      ULONGLONG StartAddressOfRawData;\n      ULONGLONG EndAddressOfRawData;\n      ULONGLONG AddressOfIndex;\n      ULONGLONG AddressOfCallBacks;\n      DWORD SizeOfZeroFill;\n      DWORD Characteristics;\n    } IMAGE_TLS_DIRECTORY64;\n    typedef IMAGE_TLS_DIRECTORY64 *PIMAGE_TLS_DIRECTORY64;\n\n    typedef struct _IMAGE_TLS_DIRECTORY32 {\n      DWORD StartAddressOfRawData;\n      DWORD EndAddressOfRawData;\n      DWORD AddressOfIndex;\n      DWORD AddressOfCallBacks;\n      DWORD SizeOfZeroFill;\n      DWORD Characteristics;\n    } IMAGE_TLS_DIRECTORY32;\n    typedef IMAGE_TLS_DIRECTORY32 *PIMAGE_TLS_DIRECTORY32;\n\n#ifdef _WIN64\n#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64\n#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)\n    typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;\n    typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA;\n#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL64(Ordinal)\n    typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;\n    typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY;\n#else\n#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32\n#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL32(Ordinal)\n    typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;\n    typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA;\n#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL32(Ordinal)\n    typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;\n    typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY;\n#endif\n\n    typedef struct _IMAGE_IMPORT_DESCRIPTOR {\n      union {\n\tDWORD Characteristics;\n\tDWORD OriginalFirstThunk;\n      };\n      DWORD TimeDateStamp;\n\n      DWORD ForwarderChain;\n      DWORD Name;\n      DWORD FirstThunk;\n    } IMAGE_IMPORT_DESCRIPTOR;\n    typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;\n\n    typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {\n      DWORD TimeDateStamp;\n      WORD OffsetModuleName;\n      WORD NumberOfModuleForwarderRefs;\n    } IMAGE_BOUND_IMPORT_DESCRIPTOR,*PIMAGE_BOUND_IMPORT_DESCRIPTOR;\n\n    typedef struct _IMAGE_BOUND_FORWARDER_REF {\n      DWORD TimeDateStamp;\n      WORD OffsetModuleName;\n      WORD Reserved;\n    } IMAGE_BOUND_FORWARDER_REF,*PIMAGE_BOUND_FORWARDER_REF;\n\n    typedef struct _IMAGE_RESOURCE_DIRECTORY {\n      DWORD Characteristics;\n      DWORD TimeDateStamp;\n      WORD MajorVersion;\n      WORD MinorVersion;\n      WORD NumberOfNamedEntries;\n      WORD NumberOfIdEntries;\n    } IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;\n\n#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000\n#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000\n\n    typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {\n      union {\n\tstruct {\n\t  DWORD NameOffset:31;\n\t  DWORD NameIsString:1;\n\t};\n\tDWORD Name;\n\tWORD Id;\n      };\n      union {\n\tDWORD OffsetToData;\n\tstruct {\n\t  DWORD OffsetToDirectory:31;\n\t  DWORD DataIsDirectory:1;\n\t};\n      };\n    } IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;\n\n    typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {\n      WORD Length;\n      CHAR NameString[1];\n    } IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;\n\n    typedef struct _IMAGE_RESOURCE_DIR_STRING_U {\n      WORD Length;\n      WCHAR NameString[1];\n    } IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;\n\n    typedef struct _IMAGE_RESOURCE_DATA_ENTRY {\n      DWORD OffsetToData;\n      DWORD Size;\n      DWORD CodePage;\n      DWORD Reserved;\n    } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;\n\n    typedef struct {\n      DWORD Size;\n      DWORD TimeDateStamp;\n      WORD MajorVersion;\n      WORD MinorVersion;\n      DWORD GlobalFlagsClear;\n      DWORD GlobalFlagsSet;\n      DWORD CriticalSectionDefaultTimeout;\n      DWORD DeCommitFreeBlockThreshold;\n      DWORD DeCommitTotalFreeThreshold;\n      DWORD LockPrefixTable;\n      DWORD MaximumAllocationSize;\n      DWORD VirtualMemoryThreshold;\n      DWORD ProcessHeapFlags;\n      DWORD ProcessAffinityMask;\n      WORD CSDVersion;\n      WORD Reserved1;\n      DWORD EditList;\n      DWORD SecurityCookie;\n      DWORD SEHandlerTable;\n      DWORD SEHandlerCount;\n    } IMAGE_LOAD_CONFIG_DIRECTORY32,*PIMAGE_LOAD_CONFIG_DIRECTORY32;\n\n    typedef struct {\n      DWORD Size;\n      DWORD TimeDateStamp;\n      WORD MajorVersion;\n      WORD MinorVersion;\n      DWORD GlobalFlagsClear;\n      DWORD GlobalFlagsSet;\n      DWORD CriticalSectionDefaultTimeout;\n      ULONGLONG DeCommitFreeBlockThreshold;\n      ULONGLONG DeCommitTotalFreeThreshold;\n      ULONGLONG LockPrefixTable;\n      ULONGLONG MaximumAllocationSize;\n      ULONGLONG VirtualMemoryThreshold;\n      ULONGLONG ProcessAffinityMask;\n      DWORD ProcessHeapFlags;\n      WORD CSDVersion;\n      WORD Reserved1;\n      ULONGLONG EditList;\n      ULONGLONG SecurityCookie;\n      ULONGLONG SEHandlerTable;\n      ULONGLONG SEHandlerCount;\n    } IMAGE_LOAD_CONFIG_DIRECTORY64,*PIMAGE_LOAD_CONFIG_DIRECTORY64;\n\n#ifdef _WIN64\n    typedef IMAGE_LOAD_CONFIG_DIRECTORY64 IMAGE_LOAD_CONFIG_DIRECTORY;\n    typedef PIMAGE_LOAD_CONFIG_DIRECTORY64 PIMAGE_LOAD_CONFIG_DIRECTORY;\n#else\n    typedef IMAGE_LOAD_CONFIG_DIRECTORY32 IMAGE_LOAD_CONFIG_DIRECTORY;\n    typedef PIMAGE_LOAD_CONFIG_DIRECTORY32 PIMAGE_LOAD_CONFIG_DIRECTORY;\n#endif\n\n    typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {\n      DWORD FuncStart;\n      DWORD PrologLen : 8;\n      DWORD FuncLen : 22;\n      DWORD ThirtyTwoBit : 1;\n      DWORD ExceptionFlag : 1;\n    } IMAGE_CE_RUNTIME_FUNCTION_ENTRY,*PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;\n\n    typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {\n      ULONGLONG BeginAddress;\n      ULONGLONG EndAddress;\n      ULONGLONG ExceptionHandler;\n      ULONGLONG HandlerData;\n      ULONGLONG PrologEndAddress;\n    } IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY,*PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;\n\n    typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {\n      DWORD BeginAddress;\n      DWORD EndAddress;\n      DWORD ExceptionHandler;\n      DWORD HandlerData;\n      DWORD PrologEndAddress;\n    } IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY,*PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;\n\n    typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {\n      DWORD BeginAddress;\n      DWORD EndAddress;\n      DWORD UnwindInfoAddress;\n    } _IMAGE_RUNTIME_FUNCTION_ENTRY,*_PIMAGE_RUNTIME_FUNCTION_ENTRY;\n\n    typedef _IMAGE_RUNTIME_FUNCTION_ENTRY IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;\n    typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;\n\n    typedef _IMAGE_RUNTIME_FUNCTION_ENTRY IMAGE_RUNTIME_FUNCTION_ENTRY;\n    typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;\n\n    typedef struct _IMAGE_DEBUG_DIRECTORY {\n      DWORD Characteristics;\n      DWORD TimeDateStamp;\n      WORD MajorVersion;\n      WORD MinorVersion;\n      DWORD Type;\n      DWORD SizeOfData;\n      DWORD AddressOfRawData;\n      DWORD PointerToRawData;\n    } IMAGE_DEBUG_DIRECTORY,*PIMAGE_DEBUG_DIRECTORY;\n\n#define IMAGE_DEBUG_TYPE_UNKNOWN 0\n#define IMAGE_DEBUG_TYPE_COFF 1\n#define IMAGE_DEBUG_TYPE_CODEVIEW 2\n#define IMAGE_DEBUG_TYPE_FPO 3\n#define IMAGE_DEBUG_TYPE_MISC 4\n#define IMAGE_DEBUG_TYPE_EXCEPTION 5\n#define IMAGE_DEBUG_TYPE_FIXUP 6\n#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7\n#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8\n#define IMAGE_DEBUG_TYPE_BORLAND 9\n#define IMAGE_DEBUG_TYPE_RESERVED10 10\n#define IMAGE_DEBUG_TYPE_CLSID 11\n\n    typedef struct _IMAGE_COFF_SYMBOLS_HEADER {\n      DWORD NumberOfSymbols;\n      DWORD LvaToFirstSymbol;\n      DWORD NumberOfLinenumbers;\n      DWORD LvaToFirstLinenumber;\n      DWORD RvaToFirstByteOfCode;\n      DWORD RvaToLastByteOfCode;\n      DWORD RvaToFirstByteOfData;\n      DWORD RvaToLastByteOfData;\n    } IMAGE_COFF_SYMBOLS_HEADER,*PIMAGE_COFF_SYMBOLS_HEADER;\n\n#define FRAME_FPO 0\n#define FRAME_TRAP 1\n#define FRAME_TSS 2\n#define FRAME_NONFPO 3\n\n    typedef struct _FPO_DATA {\n      DWORD ulOffStart;\n      DWORD cbProcSize;\n      DWORD cdwLocals;\n      WORD cdwParams;\n      WORD cbProlog : 8;\n      WORD cbRegs : 3;\n      WORD fHasSEH : 1;\n      WORD fUseBP : 1;\n      WORD reserved : 1;\n      WORD cbFrame : 2;\n    } FPO_DATA,*PFPO_DATA;\n#define SIZEOF_RFPO_DATA 16\n\n#define IMAGE_DEBUG_MISC_EXENAME 1\n\n    typedef struct _IMAGE_DEBUG_MISC {\n      DWORD DataType;\n      DWORD Length;\n      BOOLEAN Unicode;\n      BYTE Reserved[3];\n      BYTE Data[1];\n    } IMAGE_DEBUG_MISC,*PIMAGE_DEBUG_MISC;\n\n    typedef struct _IMAGE_FUNCTION_ENTRY {\n      DWORD StartingAddress;\n      DWORD EndingAddress;\n      DWORD EndOfPrologue;\n    } IMAGE_FUNCTION_ENTRY,*PIMAGE_FUNCTION_ENTRY;\n\n    typedef struct _IMAGE_FUNCTION_ENTRY64 {\n      ULONGLONG StartingAddress;\n      ULONGLONG EndingAddress;\n      union {\n\tULONGLONG EndOfPrologue;\n\tULONGLONG UnwindInfoAddress;\n      };\n    } IMAGE_FUNCTION_ENTRY64,*PIMAGE_FUNCTION_ENTRY64;\n\n    typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {\n      WORD Signature;\n      WORD Flags;\n      WORD Machine;\n      WORD Characteristics;\n      DWORD TimeDateStamp;\n      DWORD CheckSum;\n      DWORD ImageBase;\n      DWORD SizeOfImage;\n      DWORD NumberOfSections;\n      DWORD ExportedNamesSize;\n      DWORD DebugDirectorySize;\n      DWORD SectionAlignment;\n      DWORD Reserved[2];\n    } IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;\n\n    typedef struct _NON_PAGED_DEBUG_INFO {\n      WORD Signature;\n      WORD Flags;\n      DWORD Size;\n      WORD Machine;\n      WORD Characteristics;\n      DWORD TimeDateStamp;\n      DWORD CheckSum;\n      DWORD SizeOfImage;\n      ULONGLONG ImageBase;\n\n    } NON_PAGED_DEBUG_INFO,*PNON_PAGED_DEBUG_INFO;\n\n#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944\n#define NON_PAGED_DEBUG_SIGNATURE 0x494E\n\n#define IMAGE_SEPARATE_DEBUG_FLAGS_MASK 0x8000\n#define IMAGE_SEPARATE_DEBUG_MISMATCH 0x8000\n\n    typedef struct _ImageArchitectureHeader {\n      unsigned int AmaskValue: 1;\n      int Adummy1 :7;\n      unsigned int AmaskShift: 8;\n      int Adummy2 :16;\n      DWORD FirstEntryRVA;\n    } IMAGE_ARCHITECTURE_HEADER,*PIMAGE_ARCHITECTURE_HEADER;\n\n    typedef struct _ImageArchitectureEntry {\n      DWORD FixupInstRVA;\n      DWORD NewInst;\n    } IMAGE_ARCHITECTURE_ENTRY,*PIMAGE_ARCHITECTURE_ENTRY;\n\n#include \"poppack.h\"\n\n#define IMPORT_OBJECT_HDR_SIG2 0xffff\n\n    typedef struct IMPORT_OBJECT_HEADER {\n      WORD Sig1;\n      WORD Sig2;\n      WORD Version;\n      WORD Machine;\n      DWORD TimeDateStamp;\n      DWORD SizeOfData;\n      union {\n\tWORD Ordinal;\n\tWORD Hint;\n      };\n      WORD Type : 2;\n      WORD NameType : 3;\n      WORD Reserved : 11;\n    } IMPORT_OBJECT_HEADER;\n\n    typedef enum IMPORT_OBJECT_TYPE {\n      IMPORT_OBJECT_CODE = 0,IMPORT_OBJECT_DATA = 1,IMPORT_OBJECT_CONST = 2\n    } IMPORT_OBJECT_TYPE;\n\n    typedef enum IMPORT_OBJECT_NAME_TYPE {\n      IMPORT_OBJECT_ORDINAL = 0,IMPORT_OBJECT_NAME = 1,IMPORT_OBJECT_NAME_NO_PREFIX = 2,IMPORT_OBJECT_NAME_UNDECORATE = 3\n    } IMPORT_OBJECT_NAME_TYPE;\n\n#ifndef __IMAGE_COR20_HEADER_DEFINED__\n#define __IMAGE_COR20_HEADER_DEFINED__\n    typedef enum ReplacesCorHdrNumericDefines {\n      COMIMAGE_FLAGS_ILONLY =0x00000001,COMIMAGE_FLAGS_32BITREQUIRED =0x00000002,COMIMAGE_FLAGS_IL_LIBRARY =0x00000004,\n      COMIMAGE_FLAGS_STRONGNAMESIGNED =0x00000008,COMIMAGE_FLAGS_TRACKDEBUGDATA =0x00010000,COR_VERSION_MAJOR_V2 =2,\n      COR_VERSION_MAJOR =COR_VERSION_MAJOR_V2,COR_VERSION_MINOR =0,COR_DELETED_NAME_LENGTH =8,COR_VTABLEGAP_NAME_LENGTH =8,\n      NATIVE_TYPE_MAX_CB =1,COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,IMAGE_COR_MIH_METHODRVA =0x01,IMAGE_COR_MIH_EHRVA =0x02,\n      IMAGE_COR_MIH_BASICBLOCK =0x08,COR_VTABLE_32BIT =0x01,COR_VTABLE_64BIT =0x02,COR_VTABLE_FROM_UNMANAGED =0x04,\n      COR_VTABLE_CALL_MOST_DERIVED =0x10,IMAGE_COR_EATJ_THUNK_SIZE =32,MAX_CLASS_NAME =1024,MAX_PACKAGE_NAME =1024\n    } ReplacesCorHdrNumericDefines;\n\n    typedef struct IMAGE_COR20_HEADER {\n      DWORD cb;\n      WORD MajorRuntimeVersion;\n      WORD MinorRuntimeVersion;\n      IMAGE_DATA_DIRECTORY MetaData;\n      DWORD Flags;\n      DWORD EntryPointToken;\n      IMAGE_DATA_DIRECTORY Resources;\n      IMAGE_DATA_DIRECTORY StrongNameSignature;\n      IMAGE_DATA_DIRECTORY CodeManagerTable;\n      IMAGE_DATA_DIRECTORY VTableFixups;\n      IMAGE_DATA_DIRECTORY ExportAddressTableJumps;\n      IMAGE_DATA_DIRECTORY ManagedNativeHeader;\n    } IMAGE_COR20_HEADER,*PIMAGE_COR20_HEADER;\n#endif\n\n#include <string.h>\n\n#ifndef _SLIST_HEADER_\n#define _SLIST_HEADER_\n\n#ifdef _WIN64\n    typedef struct _SLIST_ENTRY *PSLIST_ENTRY;\n    typedef DECLSPEC_ALIGN(16) struct _SLIST_ENTRY {\n      PSLIST_ENTRY Next;\n    } SLIST_ENTRY;\n#else\n\n#define SLIST_ENTRY SINGLE_LIST_ENTRY\n#define _SLIST_ENTRY _SINGLE_LIST_ENTRY\n#define PSLIST_ENTRY PSINGLE_LIST_ENTRY\n#endif\n\n#if defined(_WIN64)\n\n    typedef DECLSPEC_ALIGN(16) struct _SLIST_HEADER {\n      ULONGLONG Alignment;\n      ULONGLONG Region;\n    } SLIST_HEADER;\n\n    typedef struct _SLIST_HEADER *PSLIST_HEADER;\n#else\n\n    typedef union _SLIST_HEADER {\n      ULONGLONG Alignment;\n      struct {\n\tSLIST_ENTRY Next;\n\tWORD Depth;\n\tWORD Sequence;\n      };\n    } SLIST_HEADER,*PSLIST_HEADER;\n#endif\n#endif\n\n    NTSYSAPI VOID NTAPI RtlInitializeSListHead(PSLIST_HEADER ListHead);\n    NTSYSAPI PSLIST_ENTRY NTAPI RtlFirstEntrySList(const SLIST_HEADER *ListHead);\n    NTSYSAPI PSLIST_ENTRY NTAPI RtlInterlockedPopEntrySList(PSLIST_HEADER ListHead);\n    NTSYSAPI PSLIST_ENTRY NTAPI RtlInterlockedPushEntrySList(PSLIST_HEADER ListHead,PSLIST_ENTRY ListEntry);\n    NTSYSAPI PSLIST_ENTRY NTAPI RtlInterlockedFlushSList(PSLIST_HEADER ListHead);\n    NTSYSAPI WORD NTAPI RtlQueryDepthSList(PSLIST_HEADER ListHead);\n\n#define HEAP_NO_SERIALIZE 0x00000001\n#define HEAP_GROWABLE 0x00000002\n#define HEAP_GENERATE_EXCEPTIONS 0x00000004\n#define HEAP_ZERO_MEMORY 0x00000008\n#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010\n#define HEAP_TAIL_CHECKING_ENABLED 0x00000020\n#define HEAP_FREE_CHECKING_ENABLED 0x00000040\n#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080\n#define HEAP_CREATE_ALIGN_16 0x00010000\n#define HEAP_CREATE_ENABLE_TRACING 0x00020000\n#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000\n#define HEAP_MAXIMUM_TAG 0x0FFF\n#define HEAP_PSEUDO_TAG_FLAG 0x8000\n#define HEAP_TAG_SHIFT 18\n#define HEAP_MAKE_TAG_FLAGS(b,o) ((DWORD)((b) + ((o) << 18)))\n\n    NTSYSAPI VOID NTAPI RtlCaptureContext(PCONTEXT ContextRecord);\n\n#define IS_TEXT_UNICODE_ASCII16 0x0001\n#define IS_TEXT_UNICODE_REVERSE_ASCII16 0x0010\n\n#define IS_TEXT_UNICODE_STATISTICS 0x0002\n#define IS_TEXT_UNICODE_REVERSE_STATISTICS 0x0020\n\n#define IS_TEXT_UNICODE_CONTROLS 0x0004\n#define IS_TEXT_UNICODE_REVERSE_CONTROLS 0x0040\n\n#define IS_TEXT_UNICODE_SIGNATURE 0x0008\n#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 0x0080\n\n#define IS_TEXT_UNICODE_ILLEGAL_CHARS 0x0100\n#define IS_TEXT_UNICODE_ODD_LENGTH 0x0200\n#define IS_TEXT_UNICODE_DBCS_LEADBYTE 0x0400\n#define IS_TEXT_UNICODE_NULL_BYTES 0x1000\n\n#define IS_TEXT_UNICODE_UNICODE_MASK 0x000F\n#define IS_TEXT_UNICODE_REVERSE_MASK 0x00F0\n#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 0x0F00\n#define IS_TEXT_UNICODE_NOT_ASCII_MASK 0xF000\n\n#define COMPRESSION_FORMAT_NONE (0x0000)\n#define COMPRESSION_FORMAT_DEFAULT (0x0001)\n#define COMPRESSION_FORMAT_LZNT1 (0x0002)\n#define COMPRESSION_ENGINE_STANDARD (0x0000)\n#define COMPRESSION_ENGINE_MAXIMUM (0x0100)\n#define COMPRESSION_ENGINE_HIBER (0x0200)\n\n#if _DBG_MEMCPY_INLINE_ && !defined(_MEMCPY_INLINE_) && !defined(_CRTBLD)\n#define _MEMCPY_INLINE_\n    __CRT_INLINE PVOID __cdecl memcpy_inline(void *dst,const void *src,size_t size) {\n      if(((char *)dst > (char *)src) && ((char *)dst < ((char *)src + size))) {\n\t__debugbreak();\n      }\n      return memcpy(dst,src,size);\n    }\n#define memcpy memcpy_inline\n#endif\n\n    NTSYSAPI SIZE_T NTAPI RtlCompareMemory(const VOID *Source1,const VOID *Source2,SIZE_T Length);\n\n#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))\n#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))\n#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))\n#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))\n#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))\n\n    __CRT_INLINE PVOID RtlSecureZeroMemory(PVOID ptr,SIZE_T cnt) {\n      volatile char *vptr =(volatile char *)ptr;\n#ifdef __x86_64\n      __stosb((PBYTE)((DWORD64)vptr),0,cnt);\n#else\n      while(cnt) {\n\t*vptr = 0;\n\tvptr++;\n\tcnt--;\n      }\n#endif\n      return ptr;\n    }\n\n    typedef struct _MESSAGE_RESOURCE_ENTRY {\n      WORD Length;\n      WORD Flags;\n      BYTE Text[1];\n    } MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;\n\n#define MESSAGE_RESOURCE_UNICODE 0x0001\n\n    typedef struct _MESSAGE_RESOURCE_BLOCK {\n      DWORD LowId;\n      DWORD HighId;\n      DWORD OffsetToEntries;\n    } MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK;\n\n    typedef struct _MESSAGE_RESOURCE_DATA {\n      DWORD NumberOfBlocks;\n      MESSAGE_RESOURCE_BLOCK Blocks[1];\n    } MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;\n\n    typedef struct _OSVERSIONINFOA {\n      DWORD dwOSVersionInfoSize;\n      DWORD dwMajorVersion;\n      DWORD dwMinorVersion;\n      DWORD dwBuildNumber;\n      DWORD dwPlatformId;\n      CHAR szCSDVersion[128];\n    } OSVERSIONINFOA,*POSVERSIONINFOA,*LPOSVERSIONINFOA;\n\n    typedef struct _OSVERSIONINFOW {\n      DWORD dwOSVersionInfoSize;\n      DWORD dwMajorVersion;\n      DWORD dwMinorVersion;\n      DWORD dwBuildNumber;\n      DWORD dwPlatformId;\n      WCHAR szCSDVersion[128];\n    } OSVERSIONINFOW,*POSVERSIONINFOW,*LPOSVERSIONINFOW,RTL_OSVERSIONINFOW,*PRTL_OSVERSIONINFOW;\n\n#ifdef UNICODE\n    typedef OSVERSIONINFOW OSVERSIONINFO;\n    typedef POSVERSIONINFOW POSVERSIONINFO;\n    typedef LPOSVERSIONINFOW LPOSVERSIONINFO;\n#else\n    typedef OSVERSIONINFOA OSVERSIONINFO;\n    typedef POSVERSIONINFOA POSVERSIONINFO;\n    typedef LPOSVERSIONINFOA LPOSVERSIONINFO;\n#endif\n\n    typedef struct _OSVERSIONINFOEXA {\n      DWORD dwOSVersionInfoSize;\n      DWORD dwMajorVersion;\n      DWORD dwMinorVersion;\n      DWORD dwBuildNumber;\n      DWORD dwPlatformId;\n      CHAR szCSDVersion[128];\n      WORD wServicePackMajor;\n      WORD wServicePackMinor;\n      WORD wSuiteMask;\n      BYTE wProductType;\n      BYTE wReserved;\n    } OSVERSIONINFOEXA,*POSVERSIONINFOEXA,*LPOSVERSIONINFOEXA;\n\n    typedef struct _OSVERSIONINFOEXW {\n      DWORD dwOSVersionInfoSize;\n      DWORD dwMajorVersion;\n      DWORD dwMinorVersion;\n      DWORD dwBuildNumber;\n      DWORD dwPlatformId;\n      WCHAR szCSDVersion[128];\n      WORD wServicePackMajor;\n      WORD wServicePackMinor;\n      WORD wSuiteMask;\n      BYTE wProductType;\n      BYTE wReserved;\n    } OSVERSIONINFOEXW,*POSVERSIONINFOEXW,*LPOSVERSIONINFOEXW,RTL_OSVERSIONINFOEXW,*PRTL_OSVERSIONINFOEXW;\n#ifdef UNICODE\n    typedef OSVERSIONINFOEXW OSVERSIONINFOEX;\n    typedef POSVERSIONINFOEXW POSVERSIONINFOEX;\n    typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;\n#else\n    typedef OSVERSIONINFOEXA OSVERSIONINFOEX;\n    typedef POSVERSIONINFOEXA POSVERSIONINFOEX;\n    typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;\n#endif\n\n#define VER_EQUAL 1\n#define VER_GREATER 2\n#define VER_GREATER_EQUAL 3\n#define VER_LESS 4\n#define VER_LESS_EQUAL 5\n#define VER_AND 6\n#define VER_OR 7\n\n#define VER_CONDITION_MASK 7\n#define VER_NUM_BITS_PER_CONDITION_MASK 3\n\n#define VER_MINORVERSION 0x0000001\n#define VER_MAJORVERSION 0x0000002\n#define VER_BUILDNUMBER 0x0000004\n#define VER_PLATFORMID 0x0000008\n#define VER_SERVICEPACKMINOR 0x0000010\n#define VER_SERVICEPACKMAJOR 0x0000020\n#define VER_SUITENAME 0x0000040\n#define VER_PRODUCT_TYPE 0x0000080\n\n#define VER_NT_WORKSTATION 0x0000001\n#define VER_NT_DOMAIN_CONTROLLER 0x0000002\n#define VER_NT_SERVER 0x0000003\n\n#define VER_PLATFORM_WIN32s 0\n#define VER_PLATFORM_WIN32_WINDOWS 1\n#define VER_PLATFORM_WIN32_NT 2\n\n#define VER_SET_CONDITION(_m_,_t_,_c_) ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))\n\n    NTSYSAPI ULONGLONG NTAPI VerSetConditionMask(ULONGLONG ConditionMask,DWORD TypeMask,BYTE Condition);\n\n    typedef struct _RTL_CRITICAL_SECTION_DEBUG {\n      WORD Type;\n      WORD CreatorBackTraceIndex;\n      struct _RTL_CRITICAL_SECTION *CriticalSection;\n      LIST_ENTRY ProcessLocksList;\n      DWORD EntryCount;\n      DWORD ContentionCount;\n      DWORD Spare[2];\n    } RTL_CRITICAL_SECTION_DEBUG,*PRTL_CRITICAL_SECTION_DEBUG,RTL_RESOURCE_DEBUG,*PRTL_RESOURCE_DEBUG;\n\n#define RTL_CRITSECT_TYPE 0\n#define RTL_RESOURCE_TYPE 1\n\n    typedef struct _RTL_CRITICAL_SECTION {\n      PRTL_CRITICAL_SECTION_DEBUG DebugInfo;\n      LONG LockCount;\n      LONG RecursionCount;\n      HANDLE OwningThread;\n      HANDLE LockSemaphore;\n      ULONG_PTR SpinCount;\n    } RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;\n\n    typedef VOID (NTAPI *RTL_VERIFIER_DLL_LOAD_CALLBACK) (PWSTR DllName,PVOID DllBase,SIZE_T DllSize,PVOID Reserved);\n    typedef VOID (NTAPI *RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (PWSTR DllName,PVOID DllBase,SIZE_T DllSize,PVOID Reserved);\n    typedef VOID (NTAPI *RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK)(PVOID AllocationBase,SIZE_T AllocationSize);\n\n    typedef struct _RTL_VERIFIER_THUNK_DESCRIPTOR {\n      PCHAR ThunkName;\n      PVOID ThunkOldAddress;\n      PVOID ThunkNewAddress;\n    } RTL_VERIFIER_THUNK_DESCRIPTOR,*PRTL_VERIFIER_THUNK_DESCRIPTOR;\n\n    typedef struct _RTL_VERIFIER_DLL_DESCRIPTOR {\n      PWCHAR DllName;\n      DWORD DllFlags;\n      PVOID DllAddress;\n      PRTL_VERIFIER_THUNK_DESCRIPTOR DllThunks;\n    } RTL_VERIFIER_DLL_DESCRIPTOR,*PRTL_VERIFIER_DLL_DESCRIPTOR;\n\n    typedef struct _RTL_VERIFIER_PROVIDER_DESCRIPTOR {\n      DWORD Length;\n      PRTL_VERIFIER_DLL_DESCRIPTOR ProviderDlls;\n      RTL_VERIFIER_DLL_LOAD_CALLBACK ProviderDllLoadCallback;\n      RTL_VERIFIER_DLL_UNLOAD_CALLBACK ProviderDllUnloadCallback;\n      PWSTR VerifierImage;\n      DWORD VerifierFlags;\n      DWORD VerifierDebug;\n      PVOID RtlpGetStackTraceAddress;\n      PVOID RtlpDebugPageHeapCreate;\n      PVOID RtlpDebugPageHeapDestroy;\n      RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK ProviderNtdllHeapFreeCallback;\n    } RTL_VERIFIER_PROVIDER_DESCRIPTOR,*PRTL_VERIFIER_PROVIDER_DESCRIPTOR;\n\n#define RTL_VRF_FLG_FULL_PAGE_HEAP 0x00000001\n#define RTL_VRF_FLG_RESERVED_DONOTUSE 0x00000002\n#define RTL_VRF_FLG_HANDLE_CHECKS 0x00000004\n#define RTL_VRF_FLG_STACK_CHECKS 0x00000008\n#define RTL_VRF_FLG_APPCOMPAT_CHECKS 0x00000010\n#define RTL_VRF_FLG_TLS_CHECKS 0x00000020\n#define RTL_VRF_FLG_DIRTY_STACKS 0x00000040\n#define RTL_VRF_FLG_RPC_CHECKS 0x00000080\n#define RTL_VRF_FLG_COM_CHECKS 0x00000100\n#define RTL_VRF_FLG_DANGEROUS_APIS 0x00000200\n#define RTL_VRF_FLG_RACE_CHECKS 0x00000400\n#define RTL_VRF_FLG_DEADLOCK_CHECKS 0x00000800\n#define RTL_VRF_FLG_FIRST_CHANCE_EXCEPTION_CHECKS 0x00001000\n#define RTL_VRF_FLG_VIRTUAL_MEM_CHECKS 0x00002000\n#define RTL_VRF_FLG_ENABLE_LOGGING 0x00004000\n#define RTL_VRF_FLG_FAST_FILL_HEAP 0x00008000\n#define RTL_VRF_FLG_VIRTUAL_SPACE_TRACKING 0x00010000\n#define RTL_VRF_FLG_ENABLED_SYSTEM_WIDE 0x00020000\n#define RTL_VRF_FLG_MISCELLANEOUS_CHECKS 0x00020000\n#define RTL_VRF_FLG_LOCK_CHECKS 0x00040000\n\n#define APPLICATION_VERIFIER_INTERNAL_ERROR 0x80000000\n#define APPLICATION_VERIFIER_INTERNAL_WARNING 0x40000000\n#define APPLICATION_VERIFIER_NO_BREAK 0x20000000\n#define APPLICATION_VERIFIER_CONTINUABLE_BREAK 0x10000000\n\n#define APPLICATION_VERIFIER_UNKNOWN_ERROR 0x0001\n#define APPLICATION_VERIFIER_ACCESS_VIOLATION 0x0002\n#define APPLICATION_VERIFIER_UNSYNCHRONIZED_ACCESS 0x0003\n#define APPLICATION_VERIFIER_EXTREME_SIZE_REQUEST 0x0004\n#define APPLICATION_VERIFIER_BAD_HEAP_HANDLE 0x0005\n#define APPLICATION_VERIFIER_SWITCHED_HEAP_HANDLE 0x0006\n#define APPLICATION_VERIFIER_DOUBLE_FREE 0x0007\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK 0x0008\n#define APPLICATION_VERIFIER_DESTROY_PROCESS_HEAP 0x0009\n#define APPLICATION_VERIFIER_UNEXPECTED_EXCEPTION 0x000A\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_HEADER 0x000B\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_EXCEPTION_RAISED_FOR_PROBING 0x000C\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_HEADER 0x000D\n#define APPLICATION_VERIFIER_CORRUPTED_FREED_HEAP_BLOCK 0x000E\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_SUFFIX 0x000F\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_START_STAMP 0x0010\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_END_STAMP 0x0011\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK_PREFIX 0x0012\n#define APPLICATION_VERIFIER_FIRST_CHANCE_ACCESS_VIOLATION 0x0013\n#define APPLICATION_VERIFIER_CORRUPTED_HEAP_LIST 0x0014\n\n#define APPLICATION_VERIFIER_TERMINATE_THREAD_CALL 0x0100\n#define APPLICATION_VERIFIER_STACK_OVERFLOW 0x0101\n#define APPLICATION_VERIFIER_INVALID_EXIT_PROCESS_CALL 0x0102\n\n#define APPLICATION_VERIFIER_EXIT_THREAD_OWNS_LOCK 0x0200\n#define APPLICATION_VERIFIER_LOCK_IN_UNLOADED_DLL 0x0201\n#define APPLICATION_VERIFIER_LOCK_IN_FREED_HEAP 0x0202\n#define APPLICATION_VERIFIER_LOCK_DOUBLE_INITIALIZE 0x0203\n#define APPLICATION_VERIFIER_LOCK_IN_FREED_MEMORY 0x0204\n#define APPLICATION_VERIFIER_LOCK_CORRUPTED 0x0205\n#define APPLICATION_VERIFIER_LOCK_INVALID_OWNER 0x0206\n#define APPLICATION_VERIFIER_LOCK_INVALID_RECURSION_COUNT 0x0207\n#define APPLICATION_VERIFIER_LOCK_INVALID_LOCK_COUNT 0x0208\n#define APPLICATION_VERIFIER_LOCK_OVER_RELEASED 0x0209\n#define APPLICATION_VERIFIER_LOCK_NOT_INITIALIZED 0x0210\n#define APPLICATION_VERIFIER_LOCK_ALREADY_INITIALIZED 0x0211\n#define APPLICATION_VERIFIER_LOCK_IN_FREED_VMEM 0x0212\n#define APPLICATION_VERIFIER_LOCK_IN_UNMAPPED_MEM 0x0213\n#define APPLICATION_VERIFIER_THREAD_NOT_LOCK_OWNER 0x0214\n\n#define APPLICATION_VERIFIER_INVALID_HANDLE 0x0300\n#define APPLICATION_VERIFIER_INVALID_TLS_VALUE 0x0301\n#define APPLICATION_VERIFIER_INCORRECT_WAIT_CALL 0x0302\n#define APPLICATION_VERIFIER_NULL_HANDLE 0x0303\n#define APPLICATION_VERIFIER_WAIT_IN_DLLMAIN 0x0304\n\n#define APPLICATION_VERIFIER_COM_ERROR 0x0400\n#define APPLICATION_VERIFIER_COM_API_IN_DLLMAIN 0x0401\n#define APPLICATION_VERIFIER_COM_UNHANDLED_EXCEPTION 0x0402\n#define APPLICATION_VERIFIER_COM_UNBALANCED_COINIT 0x0403\n#define APPLICATION_VERIFIER_COM_UNBALANCED_OLEINIT 0x0404\n#define APPLICATION_VERIFIER_COM_UNBALANCED_SWC 0x0405\n#define APPLICATION_VERIFIER_COM_NULL_DACL 0x0406\n#define APPLICATION_VERIFIER_COM_UNSAFE_IMPERSONATION 0x0407\n#define APPLICATION_VERIFIER_COM_SMUGGLED_WRAPPER 0x0408\n#define APPLICATION_VERIFIER_COM_SMUGGLED_PROXY 0x0409\n#define APPLICATION_VERIFIER_COM_CF_SUCCESS_WITH_NULL 0x040A\n#define APPLICATION_VERIFIER_COM_GCO_SUCCESS_WITH_NULL 0x040B\n#define APPLICATION_VERIFIER_COM_OBJECT_IN_FREED_MEMORY 0x040C\n#define APPLICATION_VERIFIER_COM_OBJECT_IN_UNLOADED_DLL 0x040D\n#define APPLICATION_VERIFIER_COM_VTBL_IN_FREED_MEMORY 0x040E\n#define APPLICATION_VERIFIER_COM_VTBL_IN_UNLOADED_DLL 0x040F\n#define APPLICATION_VERIFIER_COM_HOLDING_LOCKS_ON_CALL 0x0410\n\n#define APPLICATION_VERIFIER_RPC_ERROR 0x0500\n\n#define APPLICATION_VERIFIER_INVALID_FREEMEM 0x0600\n#define APPLICATION_VERIFIER_INVALID_ALLOCMEM 0x0601\n#define APPLICATION_VERIFIER_INVALID_MAPVIEW 0x0602\n#define APPLICATION_VERIFIER_PROBE_INVALID_ADDRESS 0x0603\n#define APPLICATION_VERIFIER_PROBE_FREE_MEM 0x0604\n#define APPLICATION_VERIFIER_PROBE_GUARD_PAGE 0x0605\n#define APPLICATION_VERIFIER_PROBE_NULL 0x0606\n#define APPLICATION_VERIFIER_PROBE_INVALID_START_OR_SIZE 0x0607\n#define APPLICATION_VERIFIER_SIZE_HEAP_UNEXPECTED_EXCEPTION 0x0618\n\n#define VERIFIER_STOP(Code,Msg,P1,S1,P2,S2,P3,S3,P4,S4) { RtlApplicationVerifierStop ((Code),(Msg),(ULONG_PTR)(P1),(S1),(ULONG_PTR)(P2),(S2),(ULONG_PTR)(P3),(S3),(ULONG_PTR)(P4),(S4)); }\n\n    VOID NTAPI RtlApplicationVerifierStop(ULONG_PTR Code,PSTR Message,ULONG_PTR Param1,PSTR Description1,ULONG_PTR Param2,PSTR Description2,ULONG_PTR Param3,PSTR Description3,ULONG_PTR Param4,PSTR Description4);\n\n    typedef LONG (NTAPI *PVECTORED_EXCEPTION_HANDLER)(struct _EXCEPTION_POINTERS *ExceptionInfo);\n#define SEF_DACL_AUTO_INHERIT 0x01\n#define SEF_SACL_AUTO_INHERIT 0x02\n#define SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT 0x04\n#define SEF_AVOID_PRIVILEGE_CHECK 0x08\n#define SEF_AVOID_OWNER_CHECK 0x10\n#define SEF_DEFAULT_OWNER_FROM_PARENT 0x20\n#define SEF_DEFAULT_GROUP_FROM_PARENT 0x40\n\n    typedef enum _HEAP_INFORMATION_CLASS {\n      HeapCompatibilityInformation\n    } HEAP_INFORMATION_CLASS;\n\n    NTSYSAPI DWORD NTAPI RtlSetHeapInformation(PVOID HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength);\n    NTSYSAPI DWORD NTAPI RtlQueryHeapInformation(PVOID HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength,PSIZE_T ReturnLength);\n    DWORD NTAPI RtlMultipleAllocateHeap(PVOID HeapHandle,DWORD Flags,SIZE_T Size,DWORD Count,PVOID *Array);\n    DWORD NTAPI RtlMultipleFreeHeap(PVOID HeapHandle,DWORD Flags,DWORD Count,PVOID *Array);\n\n#define WT_EXECUTEDEFAULT 0x00000000\n#define WT_EXECUTEINIOTHREAD 0x00000001\n#define WT_EXECUTEINUITHREAD 0x00000002\n#define WT_EXECUTEINWAITTHREAD 0x00000004\n#define WT_EXECUTEONLYONCE 0x00000008\n#define WT_EXECUTEINTIMERTHREAD 0x00000020\n#define WT_EXECUTELONGFUNCTION 0x00000010\n#define WT_EXECUTEINPERSISTENTIOTHREAD 0x00000040\n#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080\n#define WT_TRANSFER_IMPERSONATION 0x00000100\n#define WT_SET_MAX_THREADPOOL_THREADS(Flags,Limit) ((Flags) |= (Limit)<<16)\n    typedef VOID (NTAPI *WAITORTIMERCALLBACKFUNC)(PVOID,BOOLEAN);\n    typedef VOID (NTAPI *WORKERCALLBACKFUNC)(PVOID);\n    typedef VOID (NTAPI *APC_CALLBACK_FUNCTION)(DWORD ,PVOID,PVOID);\n    typedef\n      VOID\n      (NTAPI *PFLS_CALLBACK_FUNCTION)(PVOID lpFlsData);\n#define WT_EXECUTEINLONGTHREAD 0x00000010\n#define WT_EXECUTEDELETEWAIT 0x00000008\n\n    typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {\n      ActivationContextBasicInformation = 1,ActivationContextDetailedInformation = 2,AssemblyDetailedInformationInActivationContext = 3,FileInformationInAssemblyOfAssemblyInActivationContext = 4,MaxActivationContextInfoClass,AssemblyDetailedInformationInActivationContxt = 3,FileInformationInAssemblyOfAssemblyInActivationContxt = 4\n    } ACTIVATION_CONTEXT_INFO_CLASS;\n\n#define ACTIVATIONCONTEXTINFOCLASS ACTIVATION_CONTEXT_INFO_CLASS\n\n    typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {\n      DWORD ulAssemblyIndex;\n      DWORD ulFileIndexInAssembly;\n    } ACTIVATION_CONTEXT_QUERY_INDEX,*PACTIVATION_CONTEXT_QUERY_INDEX;\n\n    typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX *PCACTIVATION_CONTEXT_QUERY_INDEX;\n\n#define ACTIVATION_CONTEXT_PATH_TYPE_NONE (1)\n#define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE (2)\n#define ACTIVATION_CONTEXT_PATH_TYPE_URL (3)\n#define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF (4)\n\n    typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {\n      DWORD ulFlags;\n      DWORD ulFilenameLength;\n      DWORD ulPathLength;\n\n      PCWSTR lpFileName;\n      PCWSTR lpFilePath;\n    } ASSEMBLY_FILE_DETAILED_INFORMATION,*PASSEMBLY_FILE_DETAILED_INFORMATION;\n    typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;\n\n#define _ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION _ASSEMBLY_FILE_DETAILED_INFORMATION\n#define ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION ASSEMBLY_FILE_DETAILED_INFORMATION\n#define PASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PASSEMBLY_FILE_DETAILED_INFORMATION\n#define PCASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PCASSEMBLY_FILE_DETAILED_INFORMATION\n\n    typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {\n      DWORD ulFlags;\n      DWORD ulEncodedAssemblyIdentityLength;\n      DWORD ulManifestPathType;\n      DWORD ulManifestPathLength;\n      LARGE_INTEGER liManifestLastWriteTime;\n      DWORD ulPolicyPathType;\n      DWORD ulPolicyPathLength;\n      LARGE_INTEGER liPolicyLastWriteTime;\n      DWORD ulMetadataSatelliteRosterIndex;\n      DWORD ulManifestVersionMajor;\n      DWORD ulManifestVersionMinor;\n      DWORD ulPolicyVersionMajor;\n      DWORD ulPolicyVersionMinor;\n      DWORD ulAssemblyDirectoryNameLength;\n      PCWSTR lpAssemblyEncodedAssemblyIdentity;\n      PCWSTR lpAssemblyManifestPath;\n      PCWSTR lpAssemblyPolicyPath;\n      PCWSTR lpAssemblyDirectoryName;\n      DWORD ulFileCount;\n    } ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION,*PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;\n\n    typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;\n\n    typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {\n      DWORD dwFlags;\n      DWORD ulFormatVersion;\n      DWORD ulAssemblyCount;\n      DWORD ulRootManifestPathType;\n      DWORD ulRootManifestPathChars;\n      DWORD ulRootConfigurationPathType;\n      DWORD ulRootConfigurationPathChars;\n      DWORD ulAppDirPathType;\n      DWORD ulAppDirPathChars;\n      PCWSTR lpRootManifestPath;\n      PCWSTR lpRootConfigurationPath;\n      PCWSTR lpAppDirPath;\n    } ACTIVATION_CONTEXT_DETAILED_INFORMATION,*PACTIVATION_CONTEXT_DETAILED_INFORMATION;\n\n    typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;\n\n#define DLL_PROCESS_ATTACH 1\n#define DLL_THREAD_ATTACH 2\n#define DLL_THREAD_DETACH 3\n#define DLL_PROCESS_DETACH 0\n#define DLL_PROCESS_VERIFIER 4\n\n#define EVENTLOG_SEQUENTIAL_READ 0x0001\n#define EVENTLOG_SEEK_READ 0x0002\n#define EVENTLOG_FORWARDS_READ 0x0004\n#define EVENTLOG_BACKWARDS_READ 0x0008\n\n#define EVENTLOG_SUCCESS 0x0000\n#define EVENTLOG_ERROR_TYPE 0x0001\n#define EVENTLOG_WARNING_TYPE 0x0002\n#define EVENTLOG_INFORMATION_TYPE 0x0004\n#define EVENTLOG_AUDIT_SUCCESS 0x0008\n#define EVENTLOG_AUDIT_FAILURE 0x0010\n\n#define EVENTLOG_START_PAIRED_EVENT 0x0001\n#define EVENTLOG_END_PAIRED_EVENT 0x0002\n#define EVENTLOG_END_ALL_PAIRED_EVENTS 0x0004\n#define EVENTLOG_PAIRED_EVENT_ACTIVE 0x0008\n#define EVENTLOG_PAIRED_EVENT_INACTIVE 0x0010\n\n    typedef struct _EVENTLOGRECORD {\n      DWORD Length;\n      DWORD Reserved;\n      DWORD RecordNumber;\n      DWORD TimeGenerated;\n      DWORD TimeWritten;\n      DWORD EventID;\n      WORD EventType;\n      WORD NumStrings;\n      WORD EventCategory;\n      WORD ReservedFlags;\n      DWORD ClosingRecordNumber;\n      DWORD StringOffset;\n      DWORD UserSidLength;\n      DWORD UserSidOffset;\n      DWORD DataLength;\n      DWORD DataOffset;\n    } EVENTLOGRECORD,*PEVENTLOGRECORD;\n\n#define MAXLOGICALLOGNAMESIZE 256\n\n    typedef struct _EVENTSFORLOGFILE{\n      DWORD ulSize;\n      WCHAR szLogicalLogFile[MAXLOGICALLOGNAMESIZE];\n      DWORD ulNumRecords;\n      EVENTLOGRECORD pEventLogRecords[];\n    } EVENTSFORLOGFILE,*PEVENTSFORLOGFILE;\n\n    typedef struct _PACKEDEVENTINFO{\n      DWORD ulSize;\n      DWORD ulNumEventsForLogFile;\n      DWORD ulOffsets[];\n    } PACKEDEVENTINFO,*PPACKEDEVENTINFO;\n\n#define KEY_QUERY_VALUE (0x0001)\n#define KEY_SET_VALUE (0x0002)\n#define KEY_CREATE_SUB_KEY (0x0004)\n#define KEY_ENUMERATE_SUB_KEYS (0x0008)\n#define KEY_NOTIFY (0x0010)\n#define KEY_CREATE_LINK (0x0020)\n#define KEY_WOW64_32KEY (0x0200)\n#define KEY_WOW64_64KEY (0x0100)\n#define KEY_WOW64_RES (0x0300)\n\n#define KEY_READ ((STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIZE))\n#define KEY_WRITE ((STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE))\n#define KEY_EXECUTE ((KEY_READ) & (~SYNCHRONIZE))\n#define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL | KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY | KEY_CREATE_LINK) & (~SYNCHRONIZE))\n#define REG_OPTION_RESERVED (0x00000000L)\n\n#define REG_OPTION_NON_VOLATILE (0x00000000L)\n#define REG_OPTION_VOLATILE (0x00000001L)\n#define REG_OPTION_CREATE_LINK (0x00000002L)\n#define REG_OPTION_BACKUP_RESTORE (0x00000004L)\n#define REG_OPTION_OPEN_LINK (0x00000008L)\n#define REG_LEGAL_OPTION (REG_OPTION_RESERVED | REG_OPTION_NON_VOLATILE | REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK | REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK)\n#define REG_CREATED_NEW_KEY (0x00000001L)\n#define REG_OPENED_EXISTING_KEY (0x00000002L)\n#define REG_STANDARD_FORMAT 1\n#define REG_LATEST_FORMAT 2\n#define REG_NO_COMPRESSION 4\n#define REG_WHOLE_HIVE_VOLATILE (0x00000001L)\n#define REG_REFRESH_HIVE (0x00000002L)\n#define REG_NO_LAZY_FLUSH (0x00000004L)\n#define REG_FORCE_RESTORE (0x00000008L)\n#define REG_FORCE_UNLOAD 1\n\n#define REG_NOTIFY_CHANGE_NAME (0x00000001L)\n#define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)\n#define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)\n#define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)\n\n#define REG_LEGAL_CHANGE_FILTER (REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATTRIBUTES | REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_SECURITY)\n\n#define REG_NONE (0)\n#define REG_SZ (1)\n#define REG_EXPAND_SZ (2)\n\n#define REG_BINARY (3)\n#define REG_DWORD (4)\n#define REG_DWORD_LITTLE_ENDIAN (4)\n#define REG_DWORD_BIG_ENDIAN (5)\n#define REG_LINK (6)\n#define REG_MULTI_SZ (7)\n#define REG_RESOURCE_LIST (8)\n#define REG_FULL_RESOURCE_DESCRIPTOR (9)\n#define REG_RESOURCE_REQUIREMENTS_LIST (10)\n#define REG_QWORD (11)\n#define REG_QWORD_LITTLE_ENDIAN (11)\n\n#define SERVICE_KERNEL_DRIVER 0x00000001\n#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002\n#define SERVICE_ADAPTER 0x00000004\n#define SERVICE_RECOGNIZER_DRIVER 0x00000008\n\n#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER)\n\n#define SERVICE_WIN32_OWN_PROCESS 0x00000010\n#define SERVICE_WIN32_SHARE_PROCESS 0x00000020\n#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS)\n\n#define SERVICE_INTERACTIVE_PROCESS 0x00000100\n\n#define SERVICE_TYPE_ALL (SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS)\n\n#define SERVICE_BOOT_START 0x00000000\n#define SERVICE_SYSTEM_START 0x00000001\n#define SERVICE_AUTO_START 0x00000002\n#define SERVICE_DEMAND_START 0x00000003\n#define SERVICE_DISABLED 0x00000004\n\n#define SERVICE_ERROR_IGNORE 0x00000000\n#define SERVICE_ERROR_NORMAL 0x00000001\n#define SERVICE_ERROR_SEVERE 0x00000002\n#define SERVICE_ERROR_CRITICAL 0x00000003\n\n    typedef enum _CM_SERVICE_NODE_TYPE {\n      DriverType = SERVICE_KERNEL_DRIVER,FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,\n      Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,AdapterType = SERVICE_ADAPTER,RecognizerType = SERVICE_RECOGNIZER_DRIVER\n    } SERVICE_NODE_TYPE;\n\n    typedef enum _CM_SERVICE_LOAD_TYPE {\n      BootLoad = SERVICE_BOOT_START,SystemLoad = SERVICE_SYSTEM_START,AutoLoad = SERVICE_AUTO_START,DemandLoad = SERVICE_DEMAND_START,\n      DisableLoad = SERVICE_DISABLED\n    } SERVICE_LOAD_TYPE;\n\n    typedef enum _CM_ERROR_CONTROL_TYPE {\n      IgnoreError = SERVICE_ERROR_IGNORE,NormalError = SERVICE_ERROR_NORMAL,SevereError = SERVICE_ERROR_SEVERE,CriticalError = SERVICE_ERROR_CRITICAL\n    } SERVICE_ERROR_TYPE;\n\n#define TAPE_ERASE_SHORT 0L\n#define TAPE_ERASE_LONG 1L\n\n    typedef struct _TAPE_ERASE {\n      DWORD Type;\n      BOOLEAN Immediate;\n    } TAPE_ERASE,*PTAPE_ERASE;\n\n#define TAPE_LOAD 0L\n#define TAPE_UNLOAD 1L\n#define TAPE_TENSION 2L\n#define TAPE_LOCK 3L\n#define TAPE_UNLOCK 4L\n#define TAPE_FORMAT 5L\n\n    typedef struct _TAPE_PREPARE {\n      DWORD Operation;\n      BOOLEAN Immediate;\n    } TAPE_PREPARE,*PTAPE_PREPARE;\n\n#define TAPE_SETMARKS 0L\n#define TAPE_FILEMARKS 1L\n#define TAPE_SHORT_FILEMARKS 2L\n#define TAPE_LONG_FILEMARKS 3L\n\n    typedef struct _TAPE_WRITE_MARKS {\n      DWORD Type;\n      DWORD Count;\n      BOOLEAN Immediate;\n    } TAPE_WRITE_MARKS,*PTAPE_WRITE_MARKS;\n\n#define TAPE_ABSOLUTE_POSITION 0L\n#define TAPE_LOGICAL_POSITION 1L\n#define TAPE_PSEUDO_LOGICAL_POSITION 2L\n\n    typedef struct _TAPE_GET_POSITION {\n      DWORD Type;\n      DWORD Partition;\n      LARGE_INTEGER Offset;\n    } TAPE_GET_POSITION,*PTAPE_GET_POSITION;\n\n#define TAPE_REWIND 0L\n#define TAPE_ABSOLUTE_BLOCK 1L\n#define TAPE_LOGICAL_BLOCK 2L\n#define TAPE_PSEUDO_LOGICAL_BLOCK 3L\n#define TAPE_SPACE_END_OF_DATA 4L\n#define TAPE_SPACE_RELATIVE_BLOCKS 5L\n#define TAPE_SPACE_FILEMARKS 6L\n#define TAPE_SPACE_SEQUENTIAL_FMKS 7L\n#define TAPE_SPACE_SETMARKS 8L\n#define TAPE_SPACE_SEQUENTIAL_SMKS 9L\n\n    typedef struct _TAPE_SET_POSITION {\n      DWORD Method;\n      DWORD Partition;\n      LARGE_INTEGER Offset;\n      BOOLEAN Immediate;\n    } TAPE_SET_POSITION,*PTAPE_SET_POSITION;\n\n#define TAPE_DRIVE_FIXED 0x00000001\n#define TAPE_DRIVE_SELECT 0x00000002\n#define TAPE_DRIVE_INITIATOR 0x00000004\n\n#define TAPE_DRIVE_ERASE_SHORT 0x00000010\n#define TAPE_DRIVE_ERASE_LONG 0x00000020\n#define TAPE_DRIVE_ERASE_BOP_ONLY 0x00000040\n#define TAPE_DRIVE_ERASE_IMMEDIATE 0x00000080\n\n#define TAPE_DRIVE_TAPE_CAPACITY 0x00000100\n#define TAPE_DRIVE_TAPE_REMAINING 0x00000200\n#define TAPE_DRIVE_FIXED_BLOCK 0x00000400\n#define TAPE_DRIVE_VARIABLE_BLOCK 0x00000800\n\n#define TAPE_DRIVE_WRITE_PROTECT 0x00001000\n#define TAPE_DRIVE_EOT_WZ_SIZE 0x00002000\n\n#define TAPE_DRIVE_ECC 0x00010000\n#define TAPE_DRIVE_COMPRESSION 0x00020000\n#define TAPE_DRIVE_PADDING 0x00040000\n#define TAPE_DRIVE_REPORT_SMKS 0x00080000\n\n#define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x00100000\n#define TAPE_DRIVE_GET_LOGICAL_BLK 0x00200000\n#define TAPE_DRIVE_SET_EOT_WZ_SIZE 0x00400000\n\n#define TAPE_DRIVE_EJECT_MEDIA 0x01000000\n#define TAPE_DRIVE_CLEAN_REQUESTS 0x02000000\n#define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x04000000\n\n#define TAPE_DRIVE_RESERVED_BIT 0x80000000\n\n#define TAPE_DRIVE_LOAD_UNLOAD 0x80000001\n#define TAPE_DRIVE_TENSION 0x80000002\n#define TAPE_DRIVE_LOCK_UNLOCK 0x80000004\n#define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008\n\n#define TAPE_DRIVE_SET_BLOCK_SIZE 0x80000010\n#define TAPE_DRIVE_LOAD_UNLD_IMMED 0x80000020\n#define TAPE_DRIVE_TENSION_IMMED 0x80000040\n#define TAPE_DRIVE_LOCK_UNLK_IMMED 0x80000080\n\n#define TAPE_DRIVE_SET_ECC 0x80000100\n#define TAPE_DRIVE_SET_COMPRESSION 0x80000200\n#define TAPE_DRIVE_SET_PADDING 0x80000400\n#define TAPE_DRIVE_SET_REPORT_SMKS 0x80000800\n\n#define TAPE_DRIVE_ABSOLUTE_BLK 0x80001000\n#define TAPE_DRIVE_ABS_BLK_IMMED 0x80002000\n#define TAPE_DRIVE_LOGICAL_BLK 0x80004000\n#define TAPE_DRIVE_LOG_BLK_IMMED 0x80008000\n\n#define TAPE_DRIVE_END_OF_DATA 0x80010000\n#define TAPE_DRIVE_RELATIVE_BLKS 0x80020000\n#define TAPE_DRIVE_FILEMARKS 0x80040000\n#define TAPE_DRIVE_SEQUENTIAL_FMKS 0x80080000\n\n#define TAPE_DRIVE_SETMARKS 0x80100000\n#define TAPE_DRIVE_SEQUENTIAL_SMKS 0x80200000\n#define TAPE_DRIVE_REVERSE_POSITION 0x80400000\n#define TAPE_DRIVE_SPACE_IMMEDIATE 0x80800000\n\n#define TAPE_DRIVE_WRITE_SETMARKS 0x81000000\n#define TAPE_DRIVE_WRITE_FILEMARKS 0x82000000\n#define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000\n#define TAPE_DRIVE_WRITE_LONG_FMKS 0x88000000\n\n#define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000\n#define TAPE_DRIVE_FORMAT 0xA0000000\n#define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000\n#define TAPE_DRIVE_HIGH_FEATURES 0x80000000\n\n    typedef struct _TAPE_GET_DRIVE_PARAMETERS {\n      BOOLEAN ECC;\n      BOOLEAN Compression;\n      BOOLEAN DataPadding;\n      BOOLEAN ReportSetmarks;\n      DWORD DefaultBlockSize;\n      DWORD MaximumBlockSize;\n      DWORD MinimumBlockSize;\n      DWORD MaximumPartitionCount;\n      DWORD FeaturesLow;\n      DWORD FeaturesHigh;\n      DWORD EOTWarningZoneSize;\n    } TAPE_GET_DRIVE_PARAMETERS,*PTAPE_GET_DRIVE_PARAMETERS;\n\n    typedef struct _TAPE_SET_DRIVE_PARAMETERS {\n      BOOLEAN ECC;\n      BOOLEAN Compression;\n      BOOLEAN DataPadding;\n      BOOLEAN ReportSetmarks;\n      DWORD EOTWarningZoneSize;\n    } TAPE_SET_DRIVE_PARAMETERS,*PTAPE_SET_DRIVE_PARAMETERS;\n\n    typedef struct _TAPE_GET_MEDIA_PARAMETERS {\n      LARGE_INTEGER Capacity;\n      LARGE_INTEGER Remaining;\n      DWORD BlockSize;\n      DWORD PartitionCount;\n      BOOLEAN WriteProtected;\n    } TAPE_GET_MEDIA_PARAMETERS,*PTAPE_GET_MEDIA_PARAMETERS;\n\n    typedef struct _TAPE_SET_MEDIA_PARAMETERS {\n      DWORD BlockSize;\n    } TAPE_SET_MEDIA_PARAMETERS,*PTAPE_SET_MEDIA_PARAMETERS;\n\n#define TAPE_FIXED_PARTITIONS 0L\n#define TAPE_SELECT_PARTITIONS 1L\n#define TAPE_INITIATOR_PARTITIONS 2L\n\n    typedef struct _TAPE_CREATE_PARTITION {\n      DWORD Method;\n      DWORD Count;\n      DWORD Size;\n    } TAPE_CREATE_PARTITION,*PTAPE_CREATE_PARTITION;\n\n#define TAPE_QUERY_DRIVE_PARAMETERS 0L\n#define TAPE_QUERY_MEDIA_CAPACITY 1L\n#define TAPE_CHECK_FOR_DRIVE_PROBLEM 2L\n#define TAPE_QUERY_IO_ERROR_DATA 3L\n#define TAPE_QUERY_DEVICE_ERROR_DATA 4L\n\n    typedef struct _TAPE_WMI_OPERATIONS {\n      DWORD Method;\n      DWORD DataBufferSize;\n      PVOID DataBuffer;\n    } TAPE_WMI_OPERATIONS,*PTAPE_WMI_OPERATIONS;\n\n    typedef enum _TAPE_DRIVE_PROBLEM_TYPE {\n      TapeDriveProblemNone,TapeDriveReadWriteWarning,TapeDriveReadWriteError,TapeDriveReadWarning,TapeDriveWriteWarning,TapeDriveReadError,TapeDriveWriteError,TapeDriveHardwareError,TapeDriveUnsupportedMedia,TapeDriveScsiConnectionError,TapeDriveTimetoClean,TapeDriveCleanDriveNow,TapeDriveMediaLifeExpired,TapeDriveSnappedTape\n    } TAPE_DRIVE_PROBLEM_TYPE;\n\n#if defined(__x86_64)\n    __CRT_INLINE struct _TEB *NtCurrentTeb(VOID) { return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB,Self)); }\n    __CRT_INLINE PVOID GetCurrentFiber(VOID) { return(PVOID)__readgsqword(FIELD_OFFSET(NT_TIB,FiberData)); }\n    __CRT_INLINE PVOID GetFiberData(VOID) {\n      return *(PVOID *)GetCurrentFiber();\n    }\n#endif\n\n#if(defined(_X86_) && !defined(__x86_64))\n#define PcTeb 0x18\n    __CRT_INLINE struct _TEB *NtCurrentTeb(void) {\n      struct _TEB *ret;\n      __asm__ volatile (\"movl\t%%fs:0x18,%0\"\n\t: \"=r\" (ret));\n      return ret;\n    }\n#endif\n\n#define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION (1)\n#define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION (2)\n#define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION (3)\n#define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION (4)\n#define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION (5)\n#define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6)\n#define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION (7)\n#define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE (8)\n#define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES (9)\n#define ACTIVATION_CONTEXT_SECTION_APPLICATION_SETTINGS (10)\n\n#ifdef __cplusplus\n  }\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winreg.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINREG_\n#define _WINREG_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef WINVER\n#define WINVER 0x0502\n#endif\n\n#define RRF_RT_REG_NONE 0x00000001\n#define RRF_RT_REG_SZ 0x00000002\n#define RRF_RT_REG_EXPAND_SZ 0x00000004\n#define RRF_RT_REG_BINARY 0x00000008\n#define RRF_RT_REG_DWORD 0x00000010\n#define RRF_RT_REG_MULTI_SZ 0x00000020\n#define RRF_RT_REG_QWORD 0x00000040\n\n#define RRF_RT_DWORD (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD)\n#define RRF_RT_QWORD (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD)\n#define RRF_RT_ANY 0x0000ffff\n\n#define RRF_NOEXPAND 0x10000000\n#define RRF_ZEROONFAILURE 0x20000000\n\n  typedef ACCESS_MASK REGSAM;\n\n#define HKEY_CLASSES_ROOT ((HKEY) (ULONG_PTR)((LONG)0x80000000))\n#define HKEY_CURRENT_USER ((HKEY) (ULONG_PTR)((LONG)0x80000001))\n#define HKEY_LOCAL_MACHINE ((HKEY) (ULONG_PTR)((LONG)0x80000002))\n#define HKEY_USERS ((HKEY) (ULONG_PTR)((LONG)0x80000003))\n#define HKEY_PERFORMANCE_DATA ((HKEY) (ULONG_PTR)((LONG)0x80000004))\n#define HKEY_PERFORMANCE_TEXT ((HKEY) (ULONG_PTR)((LONG)0x80000050))\n#define HKEY_PERFORMANCE_NLSTEXT ((HKEY) (ULONG_PTR)((LONG)0x80000060))\n#define HKEY_CURRENT_CONFIG ((HKEY) (ULONG_PTR)((LONG)0x80000005))\n#define HKEY_DYN_DATA ((HKEY) (ULONG_PTR)((LONG)0x80000006))\n\n#define REG_SECURE_CONNECTION 1\n\n#ifndef _PROVIDER_STRUCTS_DEFINED\n#define _PROVIDER_STRUCTS_DEFINED\n\n#define PROVIDER_KEEPS_VALUE_LENGTH 0x1\n  struct val_context {\n    int valuelen;\n    LPVOID value_context;\n    LPVOID val_buff_ptr;\n  };\n\n  typedef struct val_context *PVALCONTEXT;\n\n  typedef struct pvalueA {\n    LPSTR pv_valuename;\n    int pv_valuelen;\n    LPVOID pv_value_context;\n    DWORD pv_type;\n  }PVALUEA,*PPVALUEA;\n\n  typedef struct pvalueW {\n    LPWSTR pv_valuename;\n    int pv_valuelen;\n    LPVOID pv_value_context;\n    DWORD pv_type;\n  }PVALUEW,*PPVALUEW;\n\n#ifdef UNICODE\n  typedef PVALUEW PVALUE;\n  typedef PPVALUEW PPVALUE;\n#else\n  typedef PVALUEA PVALUE;\n  typedef PPVALUEA PPVALUE;\n#endif\n\n  typedef DWORD __cdecl QUERYHANDLER(LPVOID keycontext,PVALCONTEXT val_list,DWORD num_vals,LPVOID outputbuffer,DWORD *total_outlen,DWORD input_blen);\n\n  typedef QUERYHANDLER *PQUERYHANDLER;\n\n  typedef struct provider_info {\n    PQUERYHANDLER pi_R0_1val;\n    PQUERYHANDLER pi_R0_allvals;\n    PQUERYHANDLER pi_R3_1val;\n    PQUERYHANDLER pi_R3_allvals;\n    DWORD pi_flags;\n    LPVOID pi_key_context;\n  } REG_PROVIDER;\n\n  typedef struct provider_info *PPROVIDER;\n\n  typedef struct value_entA {\n    LPSTR ve_valuename;\n    DWORD ve_valuelen;\n    DWORD_PTR ve_valueptr;\n    DWORD ve_type;\n  } VALENTA,*PVALENTA;\n\n  typedef struct value_entW {\n    LPWSTR ve_valuename;\n    DWORD ve_valuelen;\n    DWORD_PTR ve_valueptr;\n    DWORD ve_type;\n  } VALENTW,*PVALENTW;\n\n#ifdef UNICODE\n  typedef VALENTW VALENT;\n  typedef PVALENTW PVALENT;\n#else\n  typedef VALENTA VALENT;\n  typedef PVALENTA PVALENT;\n#endif\n#endif\n\n#define WIN31_CLASS NULL\n\n#ifdef UNICODE\n#define RegConnectRegistry RegConnectRegistryW\n#define RegConnectRegistryEx RegConnectRegistryExW\n#define RegCreateKey RegCreateKeyW\n#define RegCreateKeyEx RegCreateKeyExW\n#define RegDeleteKey RegDeleteKeyW\n#define RegDeleteKeyEx RegDeleteKeyExW\n#define RegDeleteValue RegDeleteValueW\n#define RegEnumKey RegEnumKeyW\n#define RegEnumKeyEx RegEnumKeyExW\n#define RegEnumValue RegEnumValueW\n#define RegLoadKey RegLoadKeyW\n#define RegOpenKey RegOpenKeyW\n#define RegOpenKeyEx RegOpenKeyExW\n#define RegQueryInfoKey RegQueryInfoKeyW\n#define RegQueryValue RegQueryValueW\n#define RegQueryMultipleValues RegQueryMultipleValuesW\n#define RegQueryValueEx RegQueryValueExW\n#define RegReplaceKey RegReplaceKeyW\n#define RegRestoreKey RegRestoreKeyW\n#define RegSaveKey RegSaveKeyW\n#define RegSetValue RegSetValueW\n#define RegSetValueEx RegSetValueExW\n#define RegUnLoadKey RegUnLoadKeyW\n#define RegGetValue RegGetValueW\n#define InitiateSystemShutdown InitiateSystemShutdownW\n#define AbortSystemShutdown AbortSystemShutdownW\n#else\n#define RegConnectRegistry RegConnectRegistryA\n#define RegConnectRegistryEx RegConnectRegistryExA\n#define RegCreateKey RegCreateKeyA\n#define RegCreateKeyEx RegCreateKeyExA\n#define RegDeleteKey RegDeleteKeyA\n#define RegDeleteKeyEx RegDeleteKeyExA\n#define RegDeleteValue RegDeleteValueA\n#define RegEnumKey RegEnumKeyA\n#define RegEnumKeyEx RegEnumKeyExA\n#define RegEnumValue RegEnumValueA\n#define RegLoadKey RegLoadKeyA\n#define RegOpenKey RegOpenKeyA\n#define RegOpenKeyEx RegOpenKeyExA\n#define RegQueryInfoKey RegQueryInfoKeyA\n#define RegQueryValue RegQueryValueA\n#define RegQueryMultipleValues RegQueryMultipleValuesA\n#define RegQueryValueEx RegQueryValueExA\n#define RegReplaceKey RegReplaceKeyA\n#define RegRestoreKey RegRestoreKeyA\n#define RegSaveKey RegSaveKeyA\n#define RegSetValue RegSetValueA\n#define RegSetValueEx RegSetValueExA\n#define RegUnLoadKey RegUnLoadKeyA\n#define RegGetValue RegGetValueA\n#define InitiateSystemShutdown InitiateSystemShutdownA\n#define AbortSystemShutdown AbortSystemShutdownA\n#endif\n\n  WINADVAPI LONG WINAPI RegCloseKey(HKEY hKey);\n  WINADVAPI LONG WINAPI RegOverridePredefKey(HKEY hKey,HKEY hNewHKey);\n  WINADVAPI LONG WINAPI RegOpenUserClassesRoot(HANDLE hToken,DWORD dwOptions,REGSAM samDesired,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegOpenCurrentUser(REGSAM samDesired,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegDisablePredefinedCache();\n  WINADVAPI LONG WINAPI RegConnectRegistryA(LPCSTR lpMachineName,HKEY hKey,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegConnectRegistryW(LPCWSTR lpMachineName,HKEY hKey,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegConnectRegistryExA(LPCSTR lpMachineName,HKEY hKey,ULONG Flags,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegConnectRegistryExW(LPCWSTR lpMachineName,HKEY hKey,ULONG Flags,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegCreateKeyA(HKEY hKey,LPCSTR lpSubKey,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegCreateKeyW(HKEY hKey,LPCWSTR lpSubKey,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegCreateKeyExA(HKEY hKey,LPCSTR lpSubKey,DWORD Reserved,LPSTR lpClass,DWORD dwOptions,REGSAM samDesired,LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition);\n  WINADVAPI LONG WINAPI RegCreateKeyExW(HKEY hKey,LPCWSTR lpSubKey,DWORD Reserved,LPWSTR lpClass,DWORD dwOptions,REGSAM samDesired,LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition);\n  WINADVAPI LONG WINAPI RegDeleteKeyA(HKEY hKey,LPCSTR lpSubKey);\n  WINADVAPI LONG WINAPI RegDeleteKeyW(HKEY hKey,LPCWSTR lpSubKey);\n  WINADVAPI LONG WINAPI RegDeleteKeyExA(HKEY hKey,LPCSTR lpSubKey,REGSAM samDesired,DWORD Reserved);\n  WINADVAPI LONG WINAPI RegDeleteKeyExW(HKEY hKey,LPCWSTR lpSubKey,REGSAM samDesired,DWORD Reserved);\n  WINADVAPI LONG WINAPI RegDisableReflectionKey(HKEY hBase);\n  WINADVAPI LONG WINAPI RegEnableReflectionKey(HKEY hBase);\n  WINADVAPI LONG WINAPI RegQueryReflectionKey(HKEY hBase,WINBOOL *bIsReflectionDisabled);\n  WINADVAPI LONG WINAPI RegDeleteValueA(HKEY hKey,LPCSTR lpValueName);\n  WINADVAPI LONG WINAPI RegDeleteValueW(HKEY hKey,LPCWSTR lpValueName);\n  WINADVAPI LONG WINAPI RegEnumKeyA(HKEY hKey,DWORD dwIndex,LPSTR lpName,DWORD cchName);\n  WINADVAPI LONG WINAPI RegEnumKeyW(HKEY hKey,DWORD dwIndex,LPWSTR lpName,DWORD cchName);\n  WINADVAPI LONG WINAPI RegEnumKeyExA(HKEY hKey,DWORD dwIndex,LPSTR lpName,LPDWORD lpcchName,LPDWORD lpReserved,LPSTR lpClass,LPDWORD lpcchClass,PFILETIME lpftLastWriteTime);\n  WINADVAPI LONG WINAPI RegEnumKeyExW(HKEY hKey,DWORD dwIndex,LPWSTR lpName,LPDWORD lpcchName,LPDWORD lpReserved,LPWSTR lpClass,LPDWORD lpcchClass,PFILETIME lpftLastWriteTime);\n  WINADVAPI LONG WINAPI RegEnumValueA(HKEY hKey,DWORD dwIndex,LPSTR lpValueName,LPDWORD lpcchValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\n  WINADVAPI LONG WINAPI RegEnumValueW(HKEY hKey,DWORD dwIndex,LPWSTR lpValueName,LPDWORD lpcchValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\n  WINADVAPI LONG WINAPI RegFlushKey(HKEY hKey);\n  WINADVAPI LONG WINAPI RegGetKeySecurity(HKEY hKey,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor,LPDWORD lpcbSecurityDescriptor);\n  WINADVAPI LONG WINAPI RegLoadKeyA(HKEY hKey,LPCSTR lpSubKey,LPCSTR lpFile);\n  WINADVAPI LONG WINAPI RegLoadKeyW(HKEY hKey,LPCWSTR lpSubKey,LPCWSTR lpFile);\n  WINADVAPI LONG WINAPI RegNotifyChangeKeyValue(HKEY hKey,WINBOOL bWatchSubtree,DWORD dwNotifyFilter,HANDLE hEvent,WINBOOL fAsynchronous);\n  WINADVAPI LONG WINAPI RegOpenKeyA(HKEY hKey,LPCSTR lpSubKey,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegOpenKeyW(HKEY hKey,LPCWSTR lpSubKey,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegOpenKeyExA(HKEY hKey,LPCSTR lpSubKey,DWORD ulOptions,REGSAM samDesired,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegOpenKeyExW(HKEY hKey,LPCWSTR lpSubKey,DWORD ulOptions,REGSAM samDesired,PHKEY phkResult);\n  WINADVAPI LONG WINAPI RegQueryInfoKeyA(HKEY hKey,LPSTR lpClass,LPDWORD lpcchClass,LPDWORD lpReserved,LPDWORD lpcSubKeys,LPDWORD lpcbMaxSubKeyLen,LPDWORD lpcbMaxClassLen,LPDWORD lpcValues,LPDWORD lpcbMaxValueNameLen,LPDWORD lpcbMaxValueLen,LPDWORD lpcbSecurityDescriptor,PFILETIME lpftLastWriteTime);\n  WINADVAPI LONG WINAPI RegQueryInfoKeyW(HKEY hKey,LPWSTR lpClass,LPDWORD lpcchClass,LPDWORD lpReserved,LPDWORD lpcSubKeys,LPDWORD lpcbMaxSubKeyLen,LPDWORD lpcbMaxClassLen,LPDWORD lpcValues,LPDWORD lpcbMaxValueNameLen,LPDWORD lpcbMaxValueLen,LPDWORD lpcbSecurityDescriptor,PFILETIME lpftLastWriteTime);\n  WINADVAPI LONG WINAPI RegQueryValueA(HKEY hKey,LPCSTR lpSubKey,LPSTR lpData,PLONG lpcbData);\n  WINADVAPI LONG WINAPI RegQueryValueW(HKEY hKey,LPCWSTR lpSubKey,LPWSTR lpData,PLONG lpcbData);\n  WINADVAPI LONG WINAPI RegQueryMultipleValuesA(HKEY hKey,PVALENTA val_list,DWORD num_vals,LPSTR lpValueBuf,LPDWORD ldwTotsize);\n  WINADVAPI LONG WINAPI RegQueryMultipleValuesW(HKEY hKey,PVALENTW val_list,DWORD num_vals,LPWSTR lpValueBuf,LPDWORD ldwTotsize);\n  WINADVAPI LONG WINAPI RegQueryValueExA(HKEY hKey,LPCSTR lpValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\n  WINADVAPI LONG WINAPI RegQueryValueExW(HKEY hKey,LPCWSTR lpValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData);\n  WINADVAPI LONG WINAPI RegReplaceKeyA(HKEY hKey,LPCSTR lpSubKey,LPCSTR lpNewFile,LPCSTR lpOldFile);\n  WINADVAPI LONG WINAPI RegReplaceKeyW(HKEY hKey,LPCWSTR lpSubKey,LPCWSTR lpNewFile,LPCWSTR lpOldFile);\n  WINADVAPI LONG WINAPI RegRestoreKeyA(HKEY hKey,LPCSTR lpFile,DWORD dwFlags);\n  WINADVAPI LONG WINAPI RegRestoreKeyW(HKEY hKey,LPCWSTR lpFile,DWORD dwFlags);\n  WINADVAPI LONG WINAPI RegSaveKeyA(HKEY hKey,LPCSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINADVAPI LONG WINAPI RegSaveKeyW(HKEY hKey,LPCWSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes);\n  WINADVAPI LONG WINAPI RegSetKeySecurity(HKEY hKey,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor);\n  WINADVAPI LONG WINAPI RegSetValueA(HKEY hKey,LPCSTR lpSubKey,DWORD dwType,LPCSTR lpData,DWORD cbData);\n  WINADVAPI LONG WINAPI RegSetValueW(HKEY hKey,LPCWSTR lpSubKey,DWORD dwType,LPCWSTR lpData,DWORD cbData);\n  WINADVAPI LONG WINAPI RegSetValueExA(HKEY hKey,LPCSTR lpValueName,DWORD Reserved,DWORD dwType,CONST BYTE *lpData,DWORD cbData);\n  WINADVAPI LONG WINAPI RegSetValueExW(HKEY hKey,LPCWSTR lpValueName,DWORD Reserved,DWORD dwType,CONST BYTE *lpData,DWORD cbData);\n  WINADVAPI LONG WINAPI RegUnLoadKeyA(HKEY hKey,LPCSTR lpSubKey);\n  WINADVAPI LONG WINAPI RegUnLoadKeyW(HKEY hKey,LPCWSTR lpSubKey);\n  WINADVAPI LONG WINAPI RegGetValueA(HKEY hkey,LPCSTR lpSubKey,LPCSTR lpValue,DWORD dwFlags,LPDWORD pdwType,PVOID pvData,LPDWORD pcbData);\n  WINADVAPI LONG WINAPI RegGetValueW(HKEY hkey,LPCWSTR lpSubKey,LPCWSTR lpValue,DWORD dwFlags,LPDWORD pdwType,PVOID pvData,LPDWORD pcbData);\n  WINADVAPI WINBOOL WINAPI InitiateSystemShutdownA(LPSTR lpMachineName,LPSTR lpMessage,DWORD dwTimeout,WINBOOL bForceAppsClosed,WINBOOL bRebootAfterShutdown);\n  WINADVAPI WINBOOL WINAPI InitiateSystemShutdownW(LPWSTR lpMachineName,LPWSTR lpMessage,DWORD dwTimeout,WINBOOL bForceAppsClosed,WINBOOL bRebootAfterShutdown);\n  WINADVAPI WINBOOL WINAPI AbortSystemShutdownA(LPSTR lpMachineName);\n  WINADVAPI WINBOOL WINAPI AbortSystemShutdownW(LPWSTR lpMachineName);\n\n#include <reason.h>\n\n#define REASON_SWINSTALL SHTDN_REASON_MAJOR_SOFTWARE|SHTDN_REASON_MINOR_INSTALLATION\n#define REASON_HWINSTALL SHTDN_REASON_MAJOR_HARDWARE|SHTDN_REASON_MINOR_INSTALLATION\n#define REASON_SERVICEHANG SHTDN_REASON_MAJOR_SOFTWARE|SHTDN_REASON_MINOR_HUNG\n#define REASON_UNSTABLE SHTDN_REASON_MAJOR_SYSTEM|SHTDN_REASON_MINOR_UNSTABLE\n#define REASON_SWHWRECONF SHTDN_REASON_MAJOR_SOFTWARE|SHTDN_REASON_MINOR_RECONFIG\n#define REASON_OTHER SHTDN_REASON_MAJOR_OTHER|SHTDN_REASON_MINOR_OTHER\n#define REASON_UNKNOWN SHTDN_REASON_UNKNOWN\n#define REASON_LEGACY_API SHTDN_REASON_LEGACY_API\n#define REASON_PLANNED_FLAG SHTDN_REASON_FLAG_PLANNED\n\n#define MAX_SHUTDOWN_TIMEOUT (10*365*24*60*60)\n\n#ifdef UNICODE\n#define InitiateSystemShutdownEx InitiateSystemShutdownExW\n#define RegSaveKeyEx RegSaveKeyExW\n#else\n#define InitiateSystemShutdownEx InitiateSystemShutdownExA\n#define RegSaveKeyEx RegSaveKeyExA\n#endif\n\n  WINADVAPI WINBOOL WINAPI InitiateSystemShutdownExA(LPSTR lpMachineName,LPSTR lpMessage,DWORD dwTimeout,WINBOOL bForceAppsClosed,WINBOOL bRebootAfterShutdown,DWORD dwReason);\n  WINADVAPI WINBOOL WINAPI InitiateSystemShutdownExW(LPWSTR lpMachineName,LPWSTR lpMessage,DWORD dwTimeout,WINBOOL bForceAppsClosed,WINBOOL bRebootAfterShutdown,DWORD dwReason);\n  WINADVAPI LONG WINAPI RegSaveKeyExA(HKEY hKey,LPCSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD Flags);\n  WINADVAPI LONG WINAPI RegSaveKeyExW(HKEY hKey,LPCWSTR lpFile,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD Flags);\n  WINADVAPI LONG WINAPI Wow64Win32ApiEntry (DWORD dwFuncNumber,DWORD dwFlag,DWORD dwRes);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winuser.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef _WINUSER_\n#define _WINUSER_\n\n#define WINUSERAPI DECLSPEC_IMPORT\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef WINVER\n#define WINVER 0x0502\n#endif\n\n#include <stdarg.h>\n\n#ifndef NOUSER\n  typedef HANDLE HDWP;\n  typedef VOID MENUTEMPLATEA;\n  typedef VOID MENUTEMPLATEW;\n  typedef PVOID LPMENUTEMPLATEA;\n  typedef PVOID LPMENUTEMPLATEW;\n\n#ifdef UNICODE\n  typedef MENUTEMPLATEW MENUTEMPLATE;\n  typedef LPMENUTEMPLATEW LPMENUTEMPLATE;\n#else\n  typedef MENUTEMPLATEA MENUTEMPLATE;\n  typedef LPMENUTEMPLATEA LPMENUTEMPLATE;\n#endif\n\n  typedef LRESULT (CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM);\n  typedef INT_PTR (CALLBACK *DLGPROC)(HWND,UINT,WPARAM,LPARAM);\n  typedef VOID (CALLBACK *TIMERPROC)(HWND,UINT,UINT_PTR,DWORD);\n  typedef WINBOOL (CALLBACK *GRAYSTRINGPROC)(HDC,LPARAM,int);\n  typedef WINBOOL (CALLBACK *WNDENUMPROC)(HWND,LPARAM);\n  typedef LRESULT (CALLBACK *HOOKPROC)(int code,WPARAM wParam,LPARAM lParam);\n  typedef VOID (CALLBACK *SENDASYNCPROC)(HWND,UINT,ULONG_PTR,LRESULT);\n  typedef WINBOOL (CALLBACK *PROPENUMPROCA)(HWND,LPCSTR,HANDLE);\n  typedef WINBOOL (CALLBACK *PROPENUMPROCW)(HWND,LPCWSTR,HANDLE);\n  typedef WINBOOL (CALLBACK *PROPENUMPROCEXA)(HWND,LPSTR,HANDLE,ULONG_PTR);\n  typedef WINBOOL (CALLBACK *PROPENUMPROCEXW)(HWND,LPWSTR,HANDLE,ULONG_PTR);\n  typedef int (CALLBACK *EDITWORDBREAKPROCA)(LPSTR lpch,int ichCurrent,int cch,int code);\n  typedef int (CALLBACK *EDITWORDBREAKPROCW)(LPWSTR lpch,int ichCurrent,int cch,int code);\n  typedef WINBOOL (CALLBACK *DRAWSTATEPROC)(HDC hdc,LPARAM lData,WPARAM wData,int cx,int cy);\n\n#ifdef UNICODE\n  typedef PROPENUMPROCW PROPENUMPROC;\n  typedef PROPENUMPROCEXW PROPENUMPROCEX;\n  typedef EDITWORDBREAKPROCW EDITWORDBREAKPROC;\n#else\n  typedef PROPENUMPROCA PROPENUMPROC;\n  typedef PROPENUMPROCEXA PROPENUMPROCEX;\n  typedef EDITWORDBREAKPROCA EDITWORDBREAKPROC;\n#endif\n\n  typedef WINBOOL (CALLBACK *NAMEENUMPROCA)(LPSTR,LPARAM);\n  typedef WINBOOL (CALLBACK *NAMEENUMPROCW)(LPWSTR,LPARAM);\n  typedef NAMEENUMPROCA WINSTAENUMPROCA;\n  typedef NAMEENUMPROCA DESKTOPENUMPROCA;\n  typedef NAMEENUMPROCW WINSTAENUMPROCW;\n  typedef NAMEENUMPROCW DESKTOPENUMPROCW;\n\n#ifdef UNICODE\n  typedef WINSTAENUMPROCW WINSTAENUMPROC;\n  typedef DESKTOPENUMPROCW DESKTOPENUMPROC;\n#else\n  typedef WINSTAENUMPROCA WINSTAENUMPROC;\n  typedef DESKTOPENUMPROCA DESKTOPENUMPROC;\n#endif\n\n#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16)==0)\n#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))\n#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))\n#ifdef UNICODE\n#define MAKEINTRESOURCE MAKEINTRESOURCEW\n#else\n#define MAKEINTRESOURCE MAKEINTRESOURCEA\n#endif\n\n#ifndef NORESOURCE\n\n#define RT_CURSOR MAKEINTRESOURCE(1)\n#define RT_BITMAP MAKEINTRESOURCE(2)\n#define RT_ICON MAKEINTRESOURCE(3)\n#define RT_MENU MAKEINTRESOURCE(4)\n#define RT_DIALOG MAKEINTRESOURCE(5)\n#define RT_STRING MAKEINTRESOURCE(6)\n#define RT_FONTDIR MAKEINTRESOURCE(7)\n#define RT_FONT MAKEINTRESOURCE(8)\n#define RT_ACCELERATOR MAKEINTRESOURCE(9)\n#define RT_RCDATA MAKEINTRESOURCE(10)\n#define RT_MESSAGETABLE MAKEINTRESOURCE(11)\n\n#define DIFFERENCE 11\n#define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)RT_CURSOR + DIFFERENCE)\n#define RT_GROUP_ICON MAKEINTRESOURCE((ULONG_PTR)RT_ICON + DIFFERENCE)\n#define RT_VERSION MAKEINTRESOURCE(16)\n#define RT_DLGINCLUDE MAKEINTRESOURCE(17)\n#define RT_PLUGPLAY MAKEINTRESOURCE(19)\n#define RT_VXD MAKEINTRESOURCE(20)\n#define RT_ANICURSOR MAKEINTRESOURCE(21)\n#define RT_ANIICON MAKEINTRESOURCE(22)\n#define RT_HTML MAKEINTRESOURCE(23)\n#ifdef RC_INVOKED\n#define RT_MANIFEST 24\n#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1\n#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2\n#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3\n#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1\n#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16\n#else\n#define RT_MANIFEST MAKEINTRESOURCE(24)\n#define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1)\n#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2)\n#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3)\n#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1)\n#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(16)\n#endif\n#endif\n\n#ifdef UNICODE\n#define wvsprintf wvsprintfW\n#define wsprintf wsprintfW\n#else\n#define wvsprintf wvsprintfA\n#define wsprintf wsprintfA\n#endif\n\n  WINUSERAPI int WINAPI wvsprintfA(LPSTR,LPCSTR,va_list arglist);\n  WINUSERAPI int WINAPI wvsprintfW(LPWSTR,LPCWSTR,va_list arglist);\n  WINUSERAPI int WINAPIV wsprintfA(LPSTR,LPCSTR,...);\n  WINUSERAPI int WINAPIV wsprintfW(LPWSTR,LPCWSTR,...);\n\n#define SETWALLPAPER_DEFAULT ((LPWSTR)-1)\n\n#ifndef NOSCROLL\n#define SB_HORZ 0\n#define SB_VERT 1\n#define SB_CTL 2\n#define SB_BOTH 3\n\n#define SB_LINEUP 0\n#define SB_LINELEFT 0\n#define SB_LINEDOWN 1\n#define SB_LINERIGHT 1\n#define SB_PAGEUP 2\n#define SB_PAGELEFT 2\n#define SB_PAGEDOWN 3\n#define SB_PAGERIGHT 3\n#define SB_THUMBPOSITION 4\n#define SB_THUMBTRACK 5\n#define SB_TOP 6\n#define SB_LEFT 6\n#define SB_BOTTOM 7\n#define SB_RIGHT 7\n#define SB_ENDSCROLL 8\n#endif\n\n#ifndef NOSHOWWINDOW\n#define SW_HIDE 0\n#define SW_SHOWNORMAL 1\n#define SW_NORMAL 1\n#define SW_SHOWMINIMIZED 2\n#define SW_SHOWMAXIMIZED 3\n#define SW_MAXIMIZE 3\n#define SW_SHOWNOACTIVATE 4\n#define SW_SHOW 5\n#define SW_MINIMIZE 6\n#define SW_SHOWMINNOACTIVE 7\n#define SW_SHOWNA 8\n#define SW_RESTORE 9\n#define SW_SHOWDEFAULT 10\n#define SW_FORCEMINIMIZE 11\n#define SW_MAX 11\n\n#define HIDE_WINDOW 0\n#define SHOW_OPENWINDOW 1\n#define SHOW_ICONWINDOW 2\n#define SHOW_FULLSCREEN 3\n#define SHOW_OPENNOACTIVATE 4\n\n#define SW_PARENTCLOSING 1\n#define SW_OTHERZOOM 2\n#define SW_PARENTOPENING 3\n#define SW_OTHERUNZOOM 4\n#endif\n\n#define AW_HOR_POSITIVE 0x00000001\n#define AW_HOR_NEGATIVE 0x00000002\n#define AW_VER_POSITIVE 0x00000004\n#define AW_VER_NEGATIVE 0x00000008\n#define AW_CENTER 0x00000010\n#define AW_HIDE 0x00010000\n#define AW_ACTIVATE 0x00020000\n#define AW_SLIDE 0x00040000\n#define AW_BLEND 0x00080000\n\n#define KF_EXTENDED 0x0100\n#define KF_DLGMODE 0x0800\n#define KF_MENUMODE 0x1000\n#define KF_ALTDOWN 0x2000\n#define KF_REPEAT 0x4000\n#define KF_UP 0x8000\n\n#ifndef NOVIRTUALKEYCODES\n\n#define VK_LBUTTON 0x01\n#define VK_RBUTTON 0x02\n#define VK_CANCEL 0x03\n#define VK_MBUTTON 0x04\n#define VK_XBUTTON1 0x05\n#define VK_XBUTTON2 0x06\n#define VK_BACK 0x08\n#define VK_TAB 0x09\n#define VK_CLEAR 0x0C\n#define VK_RETURN 0x0D\n#define VK_SHIFT 0x10\n#define VK_CONTROL 0x11\n#define VK_MENU 0x12\n#define VK_PAUSE 0x13\n#define VK_CAPITAL 0x14\n#define VK_KANA 0x15\n#define VK_HANGEUL 0x15\n#define VK_HANGUL 0x15\n#define VK_JUNJA 0x17\n#define VK_FINAL 0x18\n#define VK_HANJA 0x19\n#define VK_KANJI 0x19\n#define VK_ESCAPE 0x1B\n#define VK_CONVERT 0x1C\n#define VK_NONCONVERT 0x1D\n#define VK_ACCEPT 0x1E\n#define VK_MODECHANGE 0x1F\n#define VK_SPACE 0x20\n#define VK_PRIOR 0x21\n#define VK_NEXT 0x22\n#define VK_END 0x23\n#define VK_HOME 0x24\n#define VK_LEFT 0x25\n#define VK_UP 0x26\n#define VK_RIGHT 0x27\n#define VK_DOWN 0x28\n#define VK_SELECT 0x29\n#define VK_PRINT 0x2A\n#define VK_EXECUTE 0x2B\n#define VK_SNAPSHOT 0x2C\n#define VK_INSERT 0x2D\n#define VK_DELETE 0x2E\n#define VK_HELP 0x2F\n\n#define VK_LWIN 0x5B\n#define VK_RWIN 0x5C\n#define VK_APPS 0x5D\n#define VK_SLEEP 0x5F\n#define VK_NUMPAD0 0x60\n#define VK_NUMPAD1 0x61\n#define VK_NUMPAD2 0x62\n#define VK_NUMPAD3 0x63\n#define VK_NUMPAD4 0x64\n#define VK_NUMPAD5 0x65\n#define VK_NUMPAD6 0x66\n#define VK_NUMPAD7 0x67\n#define VK_NUMPAD8 0x68\n#define VK_NUMPAD9 0x69\n#define VK_MULTIPLY 0x6A\n#define VK_ADD 0x6B\n#define VK_SEPARATOR 0x6C\n#define VK_SUBTRACT 0x6D\n#define VK_DECIMAL 0x6E\n#define VK_DIVIDE 0x6F\n#define VK_F1 0x70\n#define VK_F2 0x71\n#define VK_F3 0x72\n#define VK_F4 0x73\n#define VK_F5 0x74\n#define VK_F6 0x75\n#define VK_F7 0x76\n#define VK_F8 0x77\n#define VK_F9 0x78\n#define VK_F10 0x79\n#define VK_F11 0x7A\n#define VK_F12 0x7B\n#define VK_F13 0x7C\n#define VK_F14 0x7D\n#define VK_F15 0x7E\n#define VK_F16 0x7F\n#define VK_F17 0x80\n#define VK_F18 0x81\n#define VK_F19 0x82\n#define VK_F20 0x83\n#define VK_F21 0x84\n#define VK_F22 0x85\n#define VK_F23 0x86\n#define VK_F24 0x87\n#define VK_NUMLOCK 0x90\n#define VK_SCROLL 0x91\n#define VK_OEM_NEC_EQUAL 0x92\n#define VK_OEM_FJ_JISHO 0x92\n#define VK_OEM_FJ_MASSHOU 0x93\n#define VK_OEM_FJ_TOUROKU 0x94\n#define VK_OEM_FJ_LOYA 0x95\n#define VK_OEM_FJ_ROYA 0x96\n#define VK_LSHIFT 0xA0\n#define VK_RSHIFT 0xA1\n#define VK_LCONTROL 0xA2\n#define VK_RCONTROL 0xA3\n#define VK_LMENU 0xA4\n#define VK_RMENU 0xA5\n#define VK_BROWSER_BACK 0xA6\n#define VK_BROWSER_FORWARD 0xA7\n#define VK_BROWSER_REFRESH 0xA8\n#define VK_BROWSER_STOP 0xA9\n#define VK_BROWSER_SEARCH 0xAA\n#define VK_BROWSER_FAVORITES 0xAB\n#define VK_BROWSER_HOME 0xAC\n#define VK_VOLUME_MUTE 0xAD\n#define VK_VOLUME_DOWN 0xAE\n#define VK_VOLUME_UP 0xAF\n#define VK_MEDIA_NEXT_TRACK 0xB0\n#define VK_MEDIA_PREV_TRACK 0xB1\n#define VK_MEDIA_STOP 0xB2\n#define VK_MEDIA_PLAY_PAUSE 0xB3\n#define VK_LAUNCH_MAIL 0xB4\n#define VK_LAUNCH_MEDIA_SELECT 0xB5\n#define VK_LAUNCH_APP1 0xB6\n#define VK_LAUNCH_APP2 0xB7\n#define VK_OEM_1 0xBA\n#define VK_OEM_PLUS 0xBB\n#define VK_OEM_COMMA 0xBC\n#define VK_OEM_MINUS 0xBD\n#define VK_OEM_PERIOD 0xBE\n#define VK_OEM_2 0xBF\n#define VK_OEM_3 0xC0\n#define VK_OEM_4 0xDB\n#define VK_OEM_5 0xDC\n#define VK_OEM_6 0xDD\n#define VK_OEM_7 0xDE\n#define VK_OEM_8 0xDF\n#define VK_OEM_AX 0xE1\n#define VK_OEM_102 0xE2\n#define VK_ICO_HELP 0xE3\n#define VK_ICO_00 0xE4\n#define VK_PROCESSKEY 0xE5\n#define VK_ICO_CLEAR 0xE6\n#define VK_PACKET 0xE7\n#define VK_OEM_RESET 0xE9\n#define VK_OEM_JUMP 0xEA\n#define VK_OEM_PA1 0xEB\n#define VK_OEM_PA2 0xEC\n#define VK_OEM_PA3 0xED\n#define VK_OEM_WSCTRL 0xEE\n#define VK_OEM_CUSEL 0xEF\n#define VK_OEM_ATTN 0xF0\n#define VK_OEM_FINISH 0xF1\n#define VK_OEM_COPY 0xF2\n#define VK_OEM_AUTO 0xF3\n#define VK_OEM_ENLW 0xF4\n#define VK_OEM_BACKTAB 0xF5\n#define VK_ATTN 0xF6\n#define VK_CRSEL 0xF7\n#define VK_EXSEL 0xF8\n#define VK_EREOF 0xF9\n#define VK_PLAY 0xFA\n#define VK_ZOOM 0xFB\n#define VK_NONAME 0xFC\n#define VK_PA1 0xFD\n#define VK_OEM_CLEAR 0xFE\n#endif\n\n#ifndef NOWH\n\n#define WH_MIN (-1)\n#define WH_MSGFILTER (-1)\n#define WH_JOURNALRECORD 0\n#define WH_JOURNALPLAYBACK 1\n#define WH_KEYBOARD 2\n#define WH_GETMESSAGE 3\n#define WH_CALLWNDPROC 4\n#define WH_CBT 5\n#define WH_SYSMSGFILTER 6\n#define WH_MOUSE 7\n#define WH_HARDWARE 8\n#define WH_DEBUG 9\n#define WH_SHELL 10\n#define WH_FOREGROUNDIDLE 11\n#define WH_CALLWNDPROCRET 12\n\n#define WH_KEYBOARD_LL 13\n#define WH_MOUSE_LL 14\n\n#define WH_MAX 14\n\n#define WH_MINHOOK WH_MIN\n#define WH_MAXHOOK WH_MAX\n\n#define HC_ACTION 0\n#define HC_GETNEXT 1\n#define HC_SKIP 2\n#define HC_NOREMOVE 3\n#define HC_NOREM HC_NOREMOVE\n#define HC_SYSMODALON 4\n#define HC_SYSMODALOFF 5\n\n#define HCBT_MOVESIZE 0\n#define HCBT_MINMAX 1\n#define HCBT_QS 2\n#define HCBT_CREATEWND 3\n#define HCBT_DESTROYWND 4\n#define HCBT_ACTIVATE 5\n#define HCBT_CLICKSKIPPED 6\n#define HCBT_KEYSKIPPED 7\n#define HCBT_SYSCOMMAND 8\n#define HCBT_SETFOCUS 9\n\n  typedef struct tagCBT_CREATEWNDA {\n    struct tagCREATESTRUCTA *lpcs;\n    HWND hwndInsertAfter;\n  } CBT_CREATEWNDA,*LPCBT_CREATEWNDA;\n\n  typedef struct tagCBT_CREATEWNDW {\n    struct tagCREATESTRUCTW *lpcs;\n    HWND hwndInsertAfter;\n  } CBT_CREATEWNDW,*LPCBT_CREATEWNDW;\n#ifdef UNICODE\n  typedef CBT_CREATEWNDW CBT_CREATEWND;\n  typedef LPCBT_CREATEWNDW LPCBT_CREATEWND;\n#else\n  typedef CBT_CREATEWNDA CBT_CREATEWND;\n  typedef LPCBT_CREATEWNDA LPCBT_CREATEWND;\n#endif\n\n  typedef struct tagCBTACTIVATESTRUCT\n  {\n    WINBOOL fMouse;\n    HWND hWndActive;\n  } CBTACTIVATESTRUCT,*LPCBTACTIVATESTRUCT;\n\n  typedef struct tagWTSSESSION_NOTIFICATION {\n    DWORD cbSize;\n    DWORD dwSessionId;\n\n  } WTSSESSION_NOTIFICATION,*PWTSSESSION_NOTIFICATION;\n\n#define WTS_CONSOLE_CONNECT 0x1\n#define WTS_CONSOLE_DISCONNECT 0x2\n#define WTS_REMOTE_CONNECT 0x3\n#define WTS_REMOTE_DISCONNECT 0x4\n#define WTS_SESSION_LOGON 0x5\n#define WTS_SESSION_LOGOFF 0x6\n#define WTS_SESSION_LOCK 0x7\n#define WTS_SESSION_UNLOCK 0x8\n#define WTS_SESSION_REMOTE_CONTROL 0x9\n\n#define MSGF_DIALOGBOX 0\n#define MSGF_MESSAGEBOX 1\n#define MSGF_MENU 2\n#define MSGF_SCROLLBAR 5\n#define MSGF_NEXTWINDOW 6\n#define MSGF_MAX 8\n#define MSGF_USER 4096\n\n#define HSHELL_WINDOWCREATED 1\n#define HSHELL_WINDOWDESTROYED 2\n#define HSHELL_ACTIVATESHELLWINDOW 3\n\n#define HSHELL_WINDOWACTIVATED 4\n#define HSHELL_GETMINRECT 5\n#define HSHELL_REDRAW 6\n#define HSHELL_TASKMAN 7\n#define HSHELL_LANGUAGE 8\n#define HSHELL_SYSMENU 9\n#define HSHELL_ENDTASK 10\n#define HSHELL_ACCESSIBILITYSTATE 11\n#define HSHELL_APPCOMMAND 12\n#define HSHELL_WINDOWREPLACED 13\n#define HSHELL_WINDOWREPLACING 14\n#define HSHELL_HIGHBIT 0x8000\n#define HSHELL_FLASH (HSHELL_REDRAW|HSHELL_HIGHBIT)\n#define HSHELL_RUDEAPPACTIVATED (HSHELL_WINDOWACTIVATED|HSHELL_HIGHBIT)\n\n#define ACCESS_STICKYKEYS 0x0001\n#define ACCESS_FILTERKEYS 0x0002\n#define ACCESS_MOUSEKEYS 0x0003\n\n#define APPCOMMAND_BROWSER_BACKWARD 1\n#define APPCOMMAND_BROWSER_FORWARD 2\n#define APPCOMMAND_BROWSER_REFRESH 3\n#define APPCOMMAND_BROWSER_STOP 4\n#define APPCOMMAND_BROWSER_SEARCH 5\n#define APPCOMMAND_BROWSER_FAVORITES 6\n#define APPCOMMAND_BROWSER_HOME 7\n#define APPCOMMAND_VOLUME_MUTE 8\n#define APPCOMMAND_VOLUME_DOWN 9\n#define APPCOMMAND_VOLUME_UP 10\n#define APPCOMMAND_MEDIA_NEXTTRACK 11\n#define APPCOMMAND_MEDIA_PREVIOUSTRACK 12\n#define APPCOMMAND_MEDIA_STOP 13\n#define APPCOMMAND_MEDIA_PLAY_PAUSE 14\n#define APPCOMMAND_LAUNCH_MAIL 15\n#define APPCOMMAND_LAUNCH_MEDIA_SELECT 16\n#define APPCOMMAND_LAUNCH_APP1 17\n#define APPCOMMAND_LAUNCH_APP2 18\n#define APPCOMMAND_BASS_DOWN 19\n#define APPCOMMAND_BASS_BOOST 20\n#define APPCOMMAND_BASS_UP 21\n#define APPCOMMAND_TREBLE_DOWN 22\n#define APPCOMMAND_TREBLE_UP 23\n#define APPCOMMAND_MICROPHONE_VOLUME_MUTE 24\n#define APPCOMMAND_MICROPHONE_VOLUME_DOWN 25\n#define APPCOMMAND_MICROPHONE_VOLUME_UP 26\n#define APPCOMMAND_HELP 27\n#define APPCOMMAND_FIND 28\n#define APPCOMMAND_NEW 29\n#define APPCOMMAND_OPEN 30\n#define APPCOMMAND_CLOSE 31\n#define APPCOMMAND_SAVE 32\n#define APPCOMMAND_PRINT 33\n#define APPCOMMAND_UNDO 34\n#define APPCOMMAND_REDO 35\n#define APPCOMMAND_COPY 36\n#define APPCOMMAND_CUT 37\n#define APPCOMMAND_PASTE 38\n#define APPCOMMAND_REPLY_TO_MAIL 39\n#define APPCOMMAND_FORWARD_MAIL 40\n#define APPCOMMAND_SEND_MAIL 41\n#define APPCOMMAND_SPELL_CHECK 42\n#define APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE 43\n#define APPCOMMAND_MIC_ON_OFF_TOGGLE 44\n#define APPCOMMAND_CORRECTION_LIST 45\n#define APPCOMMAND_MEDIA_PLAY 46\n#define APPCOMMAND_MEDIA_PAUSE 47\n#define APPCOMMAND_MEDIA_RECORD 48\n#define APPCOMMAND_MEDIA_FAST_FORWARD 49\n#define APPCOMMAND_MEDIA_REWIND 50\n#define APPCOMMAND_MEDIA_CHANNEL_UP 51\n#define APPCOMMAND_MEDIA_CHANNEL_DOWN 52\n\n#define FAPPCOMMAND_MOUSE 0x8000\n#define FAPPCOMMAND_KEY 0\n#define FAPPCOMMAND_OEM 0x1000\n#define FAPPCOMMAND_MASK 0xF000\n\n#define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK))\n#define GET_DEVICE_LPARAM(lParam) ((WORD)(HIWORD(lParam) & FAPPCOMMAND_MASK))\n#define GET_MOUSEORKEY_LPARAM GET_DEVICE_LPARAM\n#define GET_FLAGS_LPARAM(lParam) (LOWORD(lParam))\n#define GET_KEYSTATE_LPARAM(lParam) GET_FLAGS_LPARAM(lParam)\n\n  typedef struct {\n    HWND hwnd;\n    RECT rc;\n  } SHELLHOOKINFO,*LPSHELLHOOKINFO;\n\n  typedef struct tagEVENTMSG {\n    UINT message;\n    UINT paramL;\n    UINT paramH;\n    DWORD time;\n    HWND hwnd;\n  } EVENTMSG,*PEVENTMSGMSG,*NPEVENTMSGMSG,*LPEVENTMSGMSG;\n\n  typedef struct tagEVENTMSG *PEVENTMSG,*NPEVENTMSG,*LPEVENTMSG;\n\n  typedef struct tagCWPSTRUCT {\n    LPARAM lParam;\n    WPARAM wParam;\n    UINT message;\n    HWND hwnd;\n  } CWPSTRUCT,*PCWPSTRUCT,*NPCWPSTRUCT,*LPCWPSTRUCT;\n\n  typedef struct tagCWPRETSTRUCT {\n    LRESULT lResult;\n    LPARAM lParam;\n    WPARAM wParam;\n    UINT message;\n    HWND hwnd;\n  } CWPRETSTRUCT,*PCWPRETSTRUCT,*NPCWPRETSTRUCT,*LPCWPRETSTRUCT;\n\n#define LLKHF_EXTENDED (KF_EXTENDED >> 8)\n#define LLKHF_INJECTED 0x00000010\n#define LLKHF_ALTDOWN (KF_ALTDOWN >> 8)\n#define LLKHF_UP (KF_UP >> 8)\n\n#define LLMHF_INJECTED 0x00000001\n\n  typedef struct tagKBDLLHOOKSTRUCT {\n    DWORD vkCode;\n    DWORD scanCode;\n    DWORD flags;\n    DWORD time;\n    ULONG_PTR dwExtraInfo;\n  } KBDLLHOOKSTRUCT,*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT;\n\n  typedef struct tagMSLLHOOKSTRUCT {\n    POINT pt;\n    DWORD mouseData;\n    DWORD flags;\n    DWORD time;\n    ULONG_PTR dwExtraInfo;\n  } MSLLHOOKSTRUCT,*LPMSLLHOOKSTRUCT,*PMSLLHOOKSTRUCT;\n\n  typedef struct tagDEBUGHOOKINFO {\n    DWORD idThread;\n    DWORD idThreadInstaller;\n    LPARAM lParam;\n    WPARAM wParam;\n    int code;\n  } DEBUGHOOKINFO,*PDEBUGHOOKINFO,*NPDEBUGHOOKINFO,*LPDEBUGHOOKINFO;\n\n  typedef struct tagMOUSEHOOKSTRUCT {\n    POINT pt;\n    HWND hwnd;\n    UINT wHitTestCode;\n    ULONG_PTR dwExtraInfo;\n  } MOUSEHOOKSTRUCT,*LPMOUSEHOOKSTRUCT,*PMOUSEHOOKSTRUCT;\n\n#ifdef __cplusplus\n  typedef struct tagMOUSEHOOKSTRUCTEX : public tagMOUSEHOOKSTRUCT {\n    DWORD mouseData;\n  } MOUSEHOOKSTRUCTEX,*LPMOUSEHOOKSTRUCTEX,*PMOUSEHOOKSTRUCTEX;\n#else\n  typedef struct tagMOUSEHOOKSTRUCTEX {\n    MOUSEHOOKSTRUCT _unnamed;\n    DWORD mouseData;\n  } MOUSEHOOKSTRUCTEX,*LPMOUSEHOOKSTRUCTEX,*PMOUSEHOOKSTRUCTEX;\n#endif\n\n  typedef struct tagHARDWAREHOOKSTRUCT {\n    HWND hwnd;\n    UINT message;\n    WPARAM wParam;\n    LPARAM lParam;\n  } HARDWAREHOOKSTRUCT,*LPHARDWAREHOOKSTRUCT,*PHARDWAREHOOKSTRUCT;\n#endif\n\n#define HKL_PREV 0\n#define HKL_NEXT 1\n\n#define KLF_ACTIVATE 0x00000001\n#define KLF_SUBSTITUTE_OK 0x00000002\n#define KLF_REORDER 0x00000008\n#define KLF_REPLACELANG 0x00000010\n#define KLF_NOTELLSHELL 0x00000080\n#define KLF_SETFORPROCESS 0x00000100\n#define KLF_SHIFTLOCK 0x00010000\n#define KLF_RESET 0x40000000\n\n#define INPUTLANGCHANGE_SYSCHARSET 0x0001\n#define INPUTLANGCHANGE_FORWARD 0x0002\n#define INPUTLANGCHANGE_BACKWARD 0x0004\n\n#define KL_NAMELENGTH 9\n\n#ifdef UNICODE\n#define LoadKeyboardLayout LoadKeyboardLayoutW\n#define GetKeyboardLayoutName GetKeyboardLayoutNameW\n#else\n#define LoadKeyboardLayout LoadKeyboardLayoutA\n#define GetKeyboardLayoutName GetKeyboardLayoutNameA\n#endif\n\n  WINUSERAPI HKL WINAPI LoadKeyboardLayoutA(LPCSTR pwszKLID,UINT Flags);\n  WINUSERAPI HKL WINAPI LoadKeyboardLayoutW(LPCWSTR pwszKLID,UINT Flags);\n  WINUSERAPI HKL WINAPI ActivateKeyboardLayout(HKL hkl,UINT Flags);\n  WINUSERAPI int WINAPI ToUnicodeEx(UINT wVirtKey,UINT wScanCode,CONST BYTE *lpKeyState,LPWSTR pwszBuff,int cchBuff,UINT wFlags,HKL dwhkl);\n  WINUSERAPI WINBOOL WINAPI UnloadKeyboardLayout(HKL hkl);\n  WINUSERAPI WINBOOL WINAPI GetKeyboardLayoutNameA(LPSTR pwszKLID);\n  WINUSERAPI WINBOOL WINAPI GetKeyboardLayoutNameW(LPWSTR pwszKLID);\n  WINUSERAPI int WINAPI GetKeyboardLayoutList(int nBuff,HKL *lpList);\n  WINUSERAPI HKL WINAPI GetKeyboardLayout(DWORD idThread);\n\n  typedef struct tagMOUSEMOVEPOINT {\n    int x;\n    int y;\n    DWORD time;\n    ULONG_PTR dwExtraInfo;\n  } MOUSEMOVEPOINT,*PMOUSEMOVEPOINT,*LPMOUSEMOVEPOINT;\n\n#define GMMP_USE_DISPLAY_POINTS 1\n#define GMMP_USE_HIGH_RESOLUTION_POINTS 2\n\n  WINUSERAPI int WINAPI GetMouseMovePointsEx(UINT cbSize,LPMOUSEMOVEPOINT lppt,LPMOUSEMOVEPOINT lpptBuf,int nBufPoints,DWORD resolution);\n\n#ifndef NODESKTOP\n\n#define DESKTOP_READOBJECTS 0x0001L\n#define DESKTOP_CREATEWINDOW 0x0002L\n#define DESKTOP_CREATEMENU 0x0004L\n#define DESKTOP_HOOKCONTROL 0x0008L\n#define DESKTOP_JOURNALRECORD 0x0010L\n#define DESKTOP_JOURNALPLAYBACK 0x0020L\n#define DESKTOP_ENUMERATE 0x0040L\n#define DESKTOP_WRITEOBJECTS 0x0080L\n#define DESKTOP_SWITCHDESKTOP 0x0100L\n\n#define DF_ALLOWOTHERACCOUNTHOOK 0x0001L\n\n#ifdef _WINGDI_\n#ifndef NOGDI\n#ifdef UNICODE\n#define CreateDesktop CreateDesktopW\n#else\n#define CreateDesktop CreateDesktopA\n#endif\n\n  WINUSERAPI HDESK WINAPI CreateDesktopA(LPCSTR lpszDesktop,LPCSTR lpszDevice,LPDEVMODEA pDevmode,DWORD dwFlags,ACCESS_MASK dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa);\n  WINUSERAPI HDESK WINAPI CreateDesktopW(LPCWSTR lpszDesktop,LPCWSTR lpszDevice,LPDEVMODEW pDevmode,DWORD dwFlags,ACCESS_MASK dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa);\n#endif\n#endif\n\n#ifdef UNICODE\n#define OpenDesktop OpenDesktopW\n#define EnumDesktops EnumDesktopsW\n#else\n#define OpenDesktop OpenDesktopA\n#define EnumDesktops EnumDesktopsA\n#endif\n\n  WINUSERAPI HDESK WINAPI OpenDesktopA(LPCSTR lpszDesktop,DWORD dwFlags,WINBOOL fInherit,ACCESS_MASK dwDesiredAccess);\n  WINUSERAPI HDESK WINAPI OpenDesktopW(LPCWSTR lpszDesktop,DWORD dwFlags,WINBOOL fInherit,ACCESS_MASK dwDesiredAccess);\n  WINUSERAPI HDESK WINAPI OpenInputDesktop(DWORD dwFlags,WINBOOL fInherit,ACCESS_MASK dwDesiredAccess);\n  WINUSERAPI WINBOOL WINAPI EnumDesktopsA(HWINSTA hwinsta,DESKTOPENUMPROCA lpEnumFunc,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI EnumDesktopsW(HWINSTA hwinsta,DESKTOPENUMPROCW lpEnumFunc,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI EnumDesktopWindows(HDESK hDesktop,WNDENUMPROC lpfn,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI SwitchDesktop(HDESK hDesktop);\n  WINUSERAPI WINBOOL WINAPI SetThreadDesktop(HDESK hDesktop);\n  WINUSERAPI WINBOOL WINAPI CloseDesktop(HDESK hDesktop);\n  WINUSERAPI HDESK WINAPI GetThreadDesktop(DWORD dwThreadId);\n#endif\n\n#ifndef NOWINDOWSTATION\n#define WINSTA_ENUMDESKTOPS 0x0001L\n#define WINSTA_READATTRIBUTES 0x0002L\n#define WINSTA_ACCESSCLIPBOARD 0x0004L\n#define WINSTA_CREATEDESKTOP 0x0008L\n#define WINSTA_WRITEATTRIBUTES 0x0010L\n#define WINSTA_ACCESSGLOBALATOMS 0x0020L\n#define WINSTA_EXITWINDOWS 0x0040L\n#define WINSTA_ENUMERATE 0x0100L\n#define WINSTA_READSCREEN 0x0200L\n#define WINSTA_ALL_ACCESS (WINSTA_ENUMDESKTOPS | WINSTA_READATTRIBUTES | WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | WINSTA_EXITWINDOWS | WINSTA_ENUMERATE | WINSTA_READSCREEN)\n\n#define CWF_CREATE_ONLY 0x0001L\n\n#define WSF_VISIBLE 0x0001L\n\n#ifdef UNICODE\n#define CreateWindowStation CreateWindowStationW\n#define OpenWindowStation OpenWindowStationW\n#define EnumWindowStations EnumWindowStationsW\n#else\n#define CreateWindowStation CreateWindowStationA\n#define OpenWindowStation OpenWindowStationA\n#define EnumWindowStations EnumWindowStationsA\n#endif\n\n  WINUSERAPI HWINSTA WINAPI CreateWindowStationA(LPCSTR lpwinsta,DWORD dwFlags,ACCESS_MASK dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa);\n  WINUSERAPI HWINSTA WINAPI CreateWindowStationW(LPCWSTR lpwinsta,DWORD dwFlags,ACCESS_MASK dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa);\n  WINUSERAPI HWINSTA WINAPI OpenWindowStationA(LPCSTR lpszWinSta,WINBOOL fInherit,ACCESS_MASK dwDesiredAccess);\n  WINUSERAPI HWINSTA WINAPI OpenWindowStationW(LPCWSTR lpszWinSta,WINBOOL fInherit,ACCESS_MASK dwDesiredAccess);\n  WINUSERAPI WINBOOL WINAPI EnumWindowStationsA(WINSTAENUMPROCA lpEnumFunc,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI EnumWindowStationsW(WINSTAENUMPROCW lpEnumFunc,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI CloseWindowStation(HWINSTA hWinSta);\n  WINUSERAPI WINBOOL WINAPI SetProcessWindowStation(HWINSTA hWinSta);\n  WINUSERAPI HWINSTA WINAPI GetProcessWindowStation(VOID);\n#endif\n\n#ifndef NOSECURITY\n  WINUSERAPI WINBOOL WINAPI SetUserObjectSecurity(HANDLE hObj,PSECURITY_INFORMATION pSIRequested,PSECURITY_DESCRIPTOR pSID);\n  WINUSERAPI WINBOOL WINAPI GetUserObjectSecurity(HANDLE hObj,PSECURITY_INFORMATION pSIRequested,PSECURITY_DESCRIPTOR pSID,DWORD nLength,LPDWORD lpnLengthNeeded);\n\n#define UOI_FLAGS 1\n#define UOI_NAME 2\n#define UOI_TYPE 3\n#define UOI_USER_SID 4\n\n  typedef struct tagUSEROBJECTFLAGS {\n    WINBOOL fInherit;\n    WINBOOL fReserved;\n    DWORD dwFlags;\n  } USEROBJECTFLAGS,*PUSEROBJECTFLAGS;\n\n#ifdef UNICODE\n#define GetUserObjectInformation GetUserObjectInformationW\n#define SetUserObjectInformation SetUserObjectInformationW\n#else\n#define GetUserObjectInformation GetUserObjectInformationA\n#define SetUserObjectInformation SetUserObjectInformationA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GetUserObjectInformationA(HANDLE hObj,int nIndex,PVOID pvInfo,DWORD nLength,LPDWORD lpnLengthNeeded);\n  WINUSERAPI WINBOOL WINAPI GetUserObjectInformationW(HANDLE hObj,int nIndex,PVOID pvInfo,DWORD nLength,LPDWORD lpnLengthNeeded);\n  WINUSERAPI WINBOOL WINAPI SetUserObjectInformationA(HANDLE hObj,int nIndex,PVOID pvInfo,DWORD nLength);\n  WINUSERAPI WINBOOL WINAPI SetUserObjectInformationW(HANDLE hObj,int nIndex,PVOID pvInfo,DWORD nLength);\n#endif\n\n  typedef struct tagWNDCLASSEXA {\n    UINT cbSize;\n    UINT style;\n    WNDPROC lpfnWndProc;\n    int cbClsExtra;\n    int cbWndExtra;\n    HINSTANCE hInstance;\n    HICON hIcon;\n    HCURSOR hCursor;\n    HBRUSH hbrBackground;\n    LPCSTR lpszMenuName;\n    LPCSTR lpszClassName;\n    HICON hIconSm;\n  } WNDCLASSEXA,*PWNDCLASSEXA,*NPWNDCLASSEXA,*LPWNDCLASSEXA;\n\n  typedef struct tagWNDCLASSEXW {\n    UINT cbSize;\n    UINT style;\n    WNDPROC lpfnWndProc;\n    int cbClsExtra;\n    int cbWndExtra;\n    HINSTANCE hInstance;\n    HICON hIcon;\n    HCURSOR hCursor;\n    HBRUSH hbrBackground;\n    LPCWSTR lpszMenuName;\n    LPCWSTR lpszClassName;\n\n    HICON hIconSm;\n  } WNDCLASSEXW,*PWNDCLASSEXW,*NPWNDCLASSEXW,*LPWNDCLASSEXW;\n\n#ifdef UNICODE\n  typedef WNDCLASSEXW WNDCLASSEX;\n  typedef PWNDCLASSEXW PWNDCLASSEX;\n  typedef NPWNDCLASSEXW NPWNDCLASSEX;\n  typedef LPWNDCLASSEXW LPWNDCLASSEX;\n#else\n  typedef WNDCLASSEXA WNDCLASSEX;\n  typedef PWNDCLASSEXA PWNDCLASSEX;\n  typedef NPWNDCLASSEXA NPWNDCLASSEX;\n  typedef LPWNDCLASSEXA LPWNDCLASSEX;\n#endif\n\n  typedef struct tagWNDCLASSA {\n    UINT style;\n    WNDPROC lpfnWndProc;\n    int cbClsExtra;\n    int cbWndExtra;\n    HINSTANCE hInstance;\n    HICON hIcon;\n    HCURSOR hCursor;\n    HBRUSH hbrBackground;\n    LPCSTR lpszMenuName;\n    LPCSTR lpszClassName;\n  } WNDCLASSA,*PWNDCLASSA,*NPWNDCLASSA,*LPWNDCLASSA;\n\n  typedef struct tagWNDCLASSW {\n    UINT style;\n    WNDPROC lpfnWndProc;\n    int cbClsExtra;\n    int cbWndExtra;\n    HINSTANCE hInstance;\n    HICON hIcon;\n    HCURSOR hCursor;\n    HBRUSH hbrBackground;\n    LPCWSTR lpszMenuName;\n    LPCWSTR lpszClassName;\n  } WNDCLASSW,*PWNDCLASSW,*NPWNDCLASSW,*LPWNDCLASSW;\n\n#ifdef UNICODE\n  typedef WNDCLASSW WNDCLASS;\n  typedef PWNDCLASSW PWNDCLASS;\n  typedef NPWNDCLASSW NPWNDCLASS;\n  typedef LPWNDCLASSW LPWNDCLASS;\n#else\n  typedef WNDCLASSA WNDCLASS;\n  typedef PWNDCLASSA PWNDCLASS;\n  typedef NPWNDCLASSA NPWNDCLASS;\n  typedef LPWNDCLASSA LPWNDCLASS;\n#endif\n\n  WINUSERAPI WINBOOL WINAPI IsHungAppWindow(HWND hwnd);\n  WINUSERAPI VOID WINAPI DisableProcessWindowsGhosting(VOID);\n\n#ifndef NOMSG\n  typedef struct tagMSG {\n    HWND hwnd;\n    UINT message;\n    WPARAM wParam;\n    LPARAM lParam;\n    DWORD time;\n    POINT pt;\n  } MSG,*PMSG,*NPMSG,*LPMSG;\n\n#define POINTSTOPOINT(pt,pts) { (pt).x = (LONG)(SHORT)LOWORD(*(LONG*)&pts); (pt).y = (LONG)(SHORT)HIWORD(*(LONG*)&pts); }\n\n#define POINTTOPOINTS(pt) (MAKELONG((short)((pt).x),(short)((pt).y)))\n#define MAKEWPARAM(l,h) ((WPARAM)(DWORD)MAKELONG(l,h))\n#define MAKELPARAM(l,h) ((LPARAM)(DWORD)MAKELONG(l,h))\n#define MAKELRESULT(l,h) ((LRESULT)(DWORD)MAKELONG(l,h))\n#endif\n\n#ifndef NOWINOFFSETS\n#define GWL_WNDPROC (-4)\n#define GWL_HINSTANCE (-6)\n#define GWL_HWNDPARENT (-8)\n#define GWL_STYLE (-16)\n#define GWL_EXSTYLE (-20)\n#define GWL_USERDATA (-21)\n#define GWL_ID (-12)\n\n#ifdef _WIN64\n#undef GWL_WNDPROC\n#undef GWL_HINSTANCE\n#undef GWL_HWNDPARENT\n#undef GWL_USERDATA\n#endif\n\n#define GWLP_WNDPROC (-4)\n#define GWLP_HINSTANCE (-6)\n#define GWLP_HWNDPARENT (-8)\n#define GWLP_USERDATA (-21)\n#define GWLP_ID (-12)\n\n#define GCL_MENUNAME (-8)\n#define GCL_HBRBACKGROUND (-10)\n#define GCL_HCURSOR (-12)\n#define GCL_HICON (-14)\n#define GCL_HMODULE (-16)\n#define GCL_CBWNDEXTRA (-18)\n#define GCL_CBCLSEXTRA (-20)\n#define GCL_WNDPROC (-24)\n#define GCL_STYLE (-26)\n#define GCW_ATOM (-32)\n#define GCL_HICONSM (-34)\n\n#ifdef _WIN64\n\n#undef GCL_MENUNAME\n#undef GCL_HBRBACKGROUND\n#undef GCL_HCURSOR\n#undef GCL_HICON\n#undef GCL_HMODULE\n#undef GCL_WNDPROC\n#undef GCL_HICONSM\n#endif\n\n#define GCLP_MENUNAME (-8)\n#define GCLP_HBRBACKGROUND (-10)\n#define GCLP_HCURSOR (-12)\n#define GCLP_HICON (-14)\n#define GCLP_HMODULE (-16)\n#define GCLP_WNDPROC (-24)\n#define GCLP_HICONSM (-34)\n#endif\n\n#ifndef NOWINMESSAGES\n\n#define WM_NULL 0x0000\n#define WM_CREATE 0x0001\n#define WM_DESTROY 0x0002\n#define WM_MOVE 0x0003\n#define WM_SIZE 0x0005\n\n#define WM_ACTIVATE 0x0006\n\n#define WA_INACTIVE 0\n#define WA_ACTIVE 1\n#define WA_CLICKACTIVE 2\n\n#define WM_SETFOCUS 0x0007\n#define WM_KILLFOCUS 0x0008\n#define WM_ENABLE 0x000A\n#define WM_SETREDRAW 0x000B\n#define WM_SETTEXT 0x000C\n#define WM_GETTEXT 0x000D\n#define WM_GETTEXTLENGTH 0x000E\n#define WM_PAINT 0x000F\n#define WM_CLOSE 0x0010\n#ifndef _WIN32_WCE\n#define WM_QUERYENDSESSION 0x0011\n#define WM_QUERYOPEN 0x0013\n#define WM_ENDSESSION 0x0016\n#endif\n#define WM_QUIT 0x0012\n#define WM_ERASEBKGND 0x0014\n#define WM_SYSCOLORCHANGE 0x0015\n#define WM_SHOWWINDOW 0x0018\n#define WM_WININICHANGE 0x001A\n#define WM_SETTINGCHANGE WM_WININICHANGE\n#define WM_DEVMODECHANGE 0x001B\n#define WM_ACTIVATEAPP 0x001C\n#define WM_FONTCHANGE 0x001D\n#define WM_TIMECHANGE 0x001E\n#define WM_CANCELMODE 0x001F\n#define WM_SETCURSOR 0x0020\n#define WM_MOUSEACTIVATE 0x0021\n#define WM_CHILDACTIVATE 0x0022\n#define WM_QUEUESYNC 0x0023\n\n#define WM_GETMINMAXINFO 0x0024\n\n  typedef struct tagMINMAXINFO {\n    POINT ptReserved;\n    POINT ptMaxSize;\n    POINT ptMaxPosition;\n    POINT ptMinTrackSize;\n    POINT ptMaxTrackSize;\n  } MINMAXINFO,*PMINMAXINFO,*LPMINMAXINFO;\n\n#define WM_PAINTICON 0x0026\n#define WM_ICONERASEBKGND 0x0027\n#define WM_NEXTDLGCTL 0x0028\n#define WM_SPOOLERSTATUS 0x002A\n#define WM_DRAWITEM 0x002B\n#define WM_MEASUREITEM 0x002C\n#define WM_DELETEITEM 0x002D\n#define WM_VKEYTOITEM 0x002E\n#define WM_CHARTOITEM 0x002F\n#define WM_SETFONT 0x0030\n#define WM_GETFONT 0x0031\n#define WM_SETHOTKEY 0x0032\n#define WM_GETHOTKEY 0x0033\n#define WM_QUERYDRAGICON 0x0037\n#define WM_COMPAREITEM 0x0039\n#ifndef _WIN32_WCE\n#define WM_GETOBJECT 0x003D\n#endif\n#define WM_COMPACTING 0x0041\n#define WM_COMMNOTIFY 0x0044\n#define WM_WINDOWPOSCHANGING 0x0046\n#define WM_WINDOWPOSCHANGED 0x0047\n\n#define WM_POWER 0x0048\n\n#define PWR_OK 1\n#define PWR_FAIL (-1)\n#define PWR_SUSPENDREQUEST 1\n#define PWR_SUSPENDRESUME 2\n#define PWR_CRITICALRESUME 3\n\n#define WM_COPYDATA 0x004A\n#define WM_CANCELJOURNAL 0x004B\n\n  typedef struct tagCOPYDATASTRUCT {\n    ULONG_PTR dwData;\n    DWORD cbData;\n    PVOID lpData;\n  } COPYDATASTRUCT,*PCOPYDATASTRUCT;\n\n  typedef struct tagMDINEXTMENU {\n    HMENU hmenuIn;\n    HMENU hmenuNext;\n    HWND hwndNext;\n  } MDINEXTMENU,*PMDINEXTMENU,*LPMDINEXTMENU;\n\n#define WM_NOTIFY 0x004E\n#define WM_INPUTLANGCHANGEREQUEST 0x0050\n#define WM_INPUTLANGCHANGE 0x0051\n#define WM_TCARD 0x0052\n#define WM_HELP 0x0053\n#define WM_USERCHANGED 0x0054\n#define WM_NOTIFYFORMAT 0x0055\n\n#define NFR_ANSI 1\n#define NFR_UNICODE 2\n#define NF_QUERY 3\n#define NF_REQUERY 4\n\n#define WM_CONTEXTMENU 0x007B\n#define WM_STYLECHANGING 0x007C\n#define WM_STYLECHANGED 0x007D\n#define WM_DISPLAYCHANGE 0x007E\n#define WM_GETICON 0x007F\n#define WM_SETICON 0x0080\n\n#define WM_NCCREATE 0x0081\n#define WM_NCDESTROY 0x0082\n#define WM_NCCALCSIZE 0x0083\n#define WM_NCHITTEST 0x0084\n#define WM_NCPAINT 0x0085\n#define WM_NCACTIVATE 0x0086\n#define WM_GETDLGCODE 0x0087\n#ifndef _WIN32_WCE\n#define WM_SYNCPAINT 0x0088\n#endif\n#define WM_NCMOUSEMOVE 0x00A0\n#define WM_NCLBUTTONDOWN 0x00A1\n#define WM_NCLBUTTONUP 0x00A2\n#define WM_NCLBUTTONDBLCLK 0x00A3\n#define WM_NCRBUTTONDOWN 0x00A4\n#define WM_NCRBUTTONUP 0x00A5\n#define WM_NCRBUTTONDBLCLK 0x00A6\n#define WM_NCMBUTTONDOWN 0x00A7\n#define WM_NCMBUTTONUP 0x00A8\n#define WM_NCMBUTTONDBLCLK 0x00A9\n\n#define WM_NCXBUTTONDOWN 0x00AB\n#define WM_NCXBUTTONUP 0x00AC\n#define WM_NCXBUTTONDBLCLK 0x00AD\n#define WM_INPUT 0x00FF\n#define WM_KEYFIRST 0x0100\n#define WM_KEYDOWN 0x0100\n#define WM_KEYUP 0x0101\n#define WM_CHAR 0x0102\n#define WM_DEADCHAR 0x0103\n#define WM_SYSKEYDOWN 0x0104\n#define WM_SYSKEYUP 0x0105\n#define WM_SYSCHAR 0x0106\n#define WM_SYSDEADCHAR 0x0107\n#define WM_UNICHAR 0x0109\n#define WM_KEYLAST 0x0109\n#define UNICODE_NOCHAR 0xFFFF\n#define WM_IME_STARTCOMPOSITION 0x010D\n#define WM_IME_ENDCOMPOSITION 0x010E\n#define WM_IME_COMPOSITION 0x010F\n#define WM_IME_KEYLAST 0x010F\n#define WM_INITDIALOG 0x0110\n#define WM_COMMAND 0x0111\n#define WM_SYSCOMMAND 0x0112\n#define WM_TIMER 0x0113\n#define WM_HSCROLL 0x0114\n#define WM_VSCROLL 0x0115\n#define WM_INITMENU 0x0116\n#define WM_INITMENUPOPUP 0x0117\n#define WM_MENUSELECT 0x011F\n#define WM_MENUCHAR 0x0120\n#define WM_ENTERIDLE 0x0121\n#ifndef _WIN32_WCE\n#define WM_MENURBUTTONUP 0x0122\n#define WM_MENUDRAG 0x0123\n#define WM_MENUGETOBJECT 0x0124\n#define WM_UNINITMENUPOPUP 0x0125\n#define WM_MENUCOMMAND 0x0126\n\n#ifndef _WIN32_WCE\n#define WM_CHANGEUISTATE 0x0127\n#define WM_UPDATEUISTATE 0x0128\n#define WM_QUERYUISTATE 0x0129\n\n#define UIS_SET 1\n#define UIS_CLEAR 2\n#define UIS_INITIALIZE 3\n\n#define UISF_HIDEFOCUS 0x1\n#define UISF_HIDEACCEL 0x2\n#define UISF_ACTIVE 0x4\n#endif\n#endif\n\n#define WM_CTLCOLORMSGBOX 0x0132\n#define WM_CTLCOLOREDIT 0x0133\n#define WM_CTLCOLORLISTBOX 0x0134\n#define WM_CTLCOLORBTN 0x0135\n#define WM_CTLCOLORDLG 0x0136\n#define WM_CTLCOLORSCROLLBAR 0x0137\n#define WM_CTLCOLORSTATIC 0x0138\n#define MN_GETHMENU 0x01E1\n\n#define WM_MOUSEFIRST 0x0200\n#define WM_MOUSEMOVE 0x0200\n#define WM_LBUTTONDOWN 0x0201\n#define WM_LBUTTONUP 0x0202\n#define WM_LBUTTONDBLCLK 0x0203\n#define WM_RBUTTONDOWN 0x0204\n#define WM_RBUTTONUP 0x0205\n#define WM_RBUTTONDBLCLK 0x0206\n#define WM_MBUTTONDOWN 0x0207\n#define WM_MBUTTONUP 0x0208\n#define WM_MBUTTONDBLCLK 0x0209\n#define WM_MOUSEWHEEL 0x020A\n#define WM_XBUTTONDOWN 0x020B\n#define WM_XBUTTONUP 0x020C\n#define WM_XBUTTONDBLCLK 0x020D\n#define WM_MOUSELAST 0x020D\n\n#define WHEEL_DELTA 120\n#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam))\n\n#define WHEEL_PAGESCROLL (UINT_MAX)\n\n#define GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam))\n#define GET_NCHITTEST_WPARAM(wParam) ((short)LOWORD(wParam))\n#define GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam))\n\n#define XBUTTON1 0x0001\n#define XBUTTON2 0x0002\n\n#define WM_PARENTNOTIFY 0x0210\n#define WM_ENTERMENULOOP 0x0211\n#define WM_EXITMENULOOP 0x0212\n\n#define WM_NEXTMENU 0x0213\n#define WM_SIZING 0x0214\n#define WM_CAPTURECHANGED 0x0215\n#define WM_MOVING 0x0216\n\n#define WM_POWERBROADCAST 0x0218\n\n#ifndef _WIN32_WCE\n#define PBT_APMQUERYSUSPEND 0x0000\n#define PBT_APMQUERYSTANDBY 0x0001\n\n#define PBT_APMQUERYSUSPENDFAILED 0x0002\n#define PBT_APMQUERYSTANDBYFAILED 0x0003\n\n#define PBT_APMSUSPEND 0x0004\n#define PBT_APMSTANDBY 0x0005\n\n#define PBT_APMRESUMECRITICAL 0x0006\n#define PBT_APMRESUMESUSPEND 0x0007\n#define PBT_APMRESUMESTANDBY 0x0008\n\n#define PBTF_APMRESUMEFROMFAILURE 0x00000001\n\n#define PBT_APMBATTERYLOW 0x0009\n#define PBT_APMPOWERSTATUSCHANGE 0x000A\n\n#define PBT_APMOEMEVENT 0x000B\n#define PBT_APMRESUMEAUTOMATIC 0x0012\n#endif\n\n#define WM_DEVICECHANGE 0x0219\n\n#define WM_MDICREATE 0x0220\n#define WM_MDIDESTROY 0x0221\n#define WM_MDIACTIVATE 0x0222\n#define WM_MDIRESTORE 0x0223\n#define WM_MDINEXT 0x0224\n#define WM_MDIMAXIMIZE 0x0225\n#define WM_MDITILE 0x0226\n#define WM_MDICASCADE 0x0227\n#define WM_MDIICONARRANGE 0x0228\n#define WM_MDIGETACTIVE 0x0229\n\n#define WM_MDISETMENU 0x0230\n#define WM_ENTERSIZEMOVE 0x0231\n#define WM_EXITSIZEMOVE 0x0232\n#define WM_DROPFILES 0x0233\n#define WM_MDIREFRESHMENU 0x0234\n\n#define WM_IME_SETCONTEXT 0x0281\n#define WM_IME_NOTIFY 0x0282\n#define WM_IME_CONTROL 0x0283\n#define WM_IME_COMPOSITIONFULL 0x0284\n#define WM_IME_SELECT 0x0285\n#define WM_IME_CHAR 0x0286\n#define WM_IME_REQUEST 0x0288\n#define WM_IME_KEYDOWN 0x0290\n#define WM_IME_KEYUP 0x0291\n\n#define WM_MOUSEHOVER 0x02A1\n#define WM_MOUSELEAVE 0x02A3\n#define WM_NCMOUSEHOVER 0x02A0\n#define WM_NCMOUSELEAVE 0x02A2\n#define WM_WTSSESSION_CHANGE 0x02B1\n#define WM_TABLET_FIRST 0x02c0\n#define WM_TABLET_LAST 0x02df\n#define WM_CUT 0x0300\n#define WM_COPY 0x0301\n#define WM_PASTE 0x0302\n#define WM_CLEAR 0x0303\n#define WM_UNDO 0x0304\n#define WM_RENDERFORMAT 0x0305\n#define WM_RENDERALLFORMATS 0x0306\n#define WM_DESTROYCLIPBOARD 0x0307\n#define WM_DRAWCLIPBOARD 0x0308\n#define WM_PAINTCLIPBOARD 0x0309\n#define WM_VSCROLLCLIPBOARD 0x030A\n#define WM_SIZECLIPBOARD 0x030B\n#define WM_ASKCBFORMATNAME 0x030C\n#define WM_CHANGECBCHAIN 0x030D\n#define WM_HSCROLLCLIPBOARD 0x030E\n#define WM_QUERYNEWPALETTE 0x030F\n#define WM_PALETTEISCHANGING 0x0310\n#define WM_PALETTECHANGED 0x0311\n#define WM_HOTKEY 0x0312\n#define WM_PRINT 0x0317\n#define WM_PRINTCLIENT 0x0318\n#define WM_APPCOMMAND 0x0319\n#define WM_THEMECHANGED 0x031A\n#define WM_HANDHELDFIRST 0x0358\n#define WM_HANDHELDLAST 0x035F\n#define WM_AFXFIRST 0x0360\n#define WM_AFXLAST 0x037F\n#define WM_PENWINFIRST 0x0380\n#define WM_PENWINLAST 0x038F\n#define WM_APP 0x8000\n#define WM_USER 0x0400\n\n#define WMSZ_LEFT 1\n#define WMSZ_RIGHT 2\n#define WMSZ_TOP 3\n#define WMSZ_TOPLEFT 4\n#define WMSZ_TOPRIGHT 5\n#define WMSZ_BOTTOM 6\n#define WMSZ_BOTTOMLEFT 7\n#define WMSZ_BOTTOMRIGHT 8\n\n#ifndef NONCMESSAGES\n\n#define HTERROR (-2)\n#define HTTRANSPARENT (-1)\n#define HTNOWHERE 0\n#define HTCLIENT 1\n#define HTCAPTION 2\n#define HTSYSMENU 3\n#define HTGROWBOX 4\n#define HTSIZE HTGROWBOX\n#define HTMENU 5\n#define HTHSCROLL 6\n#define HTVSCROLL 7\n#define HTMINBUTTON 8\n#define HTMAXBUTTON 9\n#define HTLEFT 10\n#define HTRIGHT 11\n#define HTTOP 12\n#define HTTOPLEFT 13\n#define HTTOPRIGHT 14\n#define HTBOTTOM 15\n#define HTBOTTOMLEFT 16\n#define HTBOTTOMRIGHT 17\n#define HTBORDER 18\n#define HTREDUCE HTMINBUTTON\n#define HTZOOM HTMAXBUTTON\n#define HTSIZEFIRST HTLEFT\n#define HTSIZELAST HTBOTTOMRIGHT\n#define HTOBJECT 19\n#define HTCLOSE 20\n#define HTHELP 21\n\n#define SMTO_NORMAL 0x0000\n#define SMTO_BLOCK 0x0001\n#define SMTO_ABORTIFHUNG 0x0002\n#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008\n#endif\n\n#define MA_ACTIVATE 1\n#define MA_ACTIVATEANDEAT 2\n#define MA_NOACTIVATE 3\n#define MA_NOACTIVATEANDEAT 4\n\n#define ICON_SMALL 0\n#define ICON_BIG 1\n#define ICON_SMALL2 2\n\n#ifdef UNICODE\n#define RegisterWindowMessage RegisterWindowMessageW\n#else\n#define RegisterWindowMessage RegisterWindowMessageA\n#endif\n\n  WINUSERAPI UINT WINAPI RegisterWindowMessageA(LPCSTR lpString);\n  WINUSERAPI UINT WINAPI RegisterWindowMessageW(LPCWSTR lpString);\n\n#define SIZE_RESTORED 0\n#define SIZE_MINIMIZED 1\n#define SIZE_MAXIMIZED 2\n#define SIZE_MAXSHOW 3\n#define SIZE_MAXHIDE 4\n\n#define SIZENORMAL SIZE_RESTORED\n#define SIZEICONIC SIZE_MINIMIZED\n#define SIZEFULLSCREEN SIZE_MAXIMIZED\n#define SIZEZOOMSHOW SIZE_MAXSHOW\n#define SIZEZOOMHIDE SIZE_MAXHIDE\n\n  typedef struct tagWINDOWPOS {\n    HWND hwnd;\n    HWND hwndInsertAfter;\n    int x;\n    int y;\n    int cx;\n    int cy;\n    UINT flags;\n  } WINDOWPOS,*LPWINDOWPOS,*PWINDOWPOS;\n\n  typedef struct tagNCCALCSIZE_PARAMS {\n    RECT rgrc[3];\n    PWINDOWPOS lppos;\n  } NCCALCSIZE_PARAMS,*LPNCCALCSIZE_PARAMS;\n\n#define WVR_ALIGNTOP 0x0010\n#define WVR_ALIGNLEFT 0x0020\n#define WVR_ALIGNBOTTOM 0x0040\n#define WVR_ALIGNRIGHT 0x0080\n#define WVR_HREDRAW 0x0100\n#define WVR_VREDRAW 0x0200\n#define WVR_REDRAW (WVR_HREDRAW | WVR_VREDRAW)\n#define WVR_VALIDRECTS 0x0400\n\n#ifndef NOKEYSTATES\n\n#define MK_LBUTTON 0x0001\n#define MK_RBUTTON 0x0002\n#define MK_SHIFT 0x0004\n#define MK_CONTROL 0x0008\n#define MK_MBUTTON 0x0010\n#define MK_XBUTTON1 0x0020\n#define MK_XBUTTON2 0x0040\n#endif\n\n#ifndef NOTRACKMOUSEEVENT\n#define TME_HOVER 0x00000001\n#define TME_LEAVE 0x00000002\n#define TME_NONCLIENT 0x00000010\n#define TME_QUERY 0x40000000\n#define TME_CANCEL 0x80000000\n\n#define HOVER_DEFAULT 0xFFFFFFFF\n#endif\n\n  typedef struct tagTRACKMOUSEEVENT {\n    DWORD cbSize;\n    DWORD dwFlags;\n    HWND hwndTrack;\n    DWORD dwHoverTime;\n  } TRACKMOUSEEVENT,*LPTRACKMOUSEEVENT;\n\n  WINUSERAPI WINBOOL WINAPI TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);\n#endif\n\n#ifndef NOWINSTYLES\n\n#define WS_OVERLAPPED 0x00000000L\n#define WS_POPUP 0x80000000L\n#define WS_CHILD 0x40000000L\n#define WS_MINIMIZE 0x20000000L\n#define WS_VISIBLE 0x10000000L\n#define WS_DISABLED 0x08000000L\n#define WS_CLIPSIBLINGS 0x04000000L\n#define WS_CLIPCHILDREN 0x02000000L\n#define WS_MAXIMIZE 0x01000000L\n#define WS_CAPTION 0x00C00000L\n#define WS_BORDER 0x00800000L\n#define WS_DLGFRAME 0x00400000L\n#define WS_VSCROLL 0x00200000L\n#define WS_HSCROLL 0x00100000L\n#define WS_SYSMENU 0x00080000L\n#define WS_THICKFRAME 0x00040000L\n#define WS_GROUP 0x00020000L\n#define WS_TABSTOP 0x00010000L\n#define WS_MINIMIZEBOX 0x00020000L\n#define WS_MAXIMIZEBOX 0x00010000L\n#define WS_TILED WS_OVERLAPPED\n#define WS_ICONIC WS_MINIMIZE\n#define WS_SIZEBOX WS_THICKFRAME\n#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW\n#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)\n#define WS_POPUPWINDOW (WS_POPUP | WS_BORDER | WS_SYSMENU)\n#define WS_CHILDWINDOW (WS_CHILD)\n\n#define WS_EX_DLGMODALFRAME 0x00000001L\n#define WS_EX_NOPARENTNOTIFY 0x00000004L\n#define WS_EX_TOPMOST 0x00000008L\n#define WS_EX_ACCEPTFILES 0x00000010L\n#define WS_EX_TRANSPARENT 0x00000020L\n#define WS_EX_MDICHILD 0x00000040L\n#define WS_EX_TOOLWINDOW 0x00000080L\n#define WS_EX_WINDOWEDGE 0x00000100L\n#define WS_EX_CLIENTEDGE 0x00000200L\n#define WS_EX_CONTEXTHELP 0x00000400L\n#define WS_EX_RIGHT 0x00001000L\n#define WS_EX_LEFT 0x00000000L\n#define WS_EX_RTLREADING 0x00002000L\n#define WS_EX_LTRREADING 0x00000000L\n#define WS_EX_LEFTSCROLLBAR 0x00004000L\n#define WS_EX_RIGHTSCROLLBAR 0x00000000L\n#define WS_EX_CONTROLPARENT 0x00010000L\n#define WS_EX_STATICEDGE 0x00020000L\n#define WS_EX_APPWINDOW 0x00040000L\n#define WS_EX_OVERLAPPEDWINDOW (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)\n#define WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)\n#define WS_EX_LAYERED 0x00080000\n#define WS_EX_NOINHERITLAYOUT 0x00100000L\n#define WS_EX_LAYOUTRTL 0x00400000L\n#define WS_EX_COMPOSITED 0x02000000L\n#define WS_EX_NOACTIVATE 0x08000000L\n\n#define CS_VREDRAW 0x0001\n#define CS_HREDRAW 0x0002\n#define CS_DBLCLKS 0x0008\n#define CS_OWNDC 0x0020\n#define CS_CLASSDC 0x0040\n#define CS_PARENTDC 0x0080\n#define CS_NOCLOSE 0x0200\n#define CS_SAVEBITS 0x0800\n#define CS_BYTEALIGNCLIENT 0x1000\n#define CS_BYTEALIGNWINDOW 0x2000\n#define CS_GLOBALCLASS 0x4000\n#define CS_IME 0x00010000\n#define CS_DROPSHADOW 0x00020000\n#endif\n\n#define PRF_CHECKVISIBLE 0x00000001L\n#define PRF_NONCLIENT 0x00000002L\n#define PRF_CLIENT 0x00000004L\n#define PRF_ERASEBKGND 0x00000008L\n#define PRF_CHILDREN 0x00000010L\n#define PRF_OWNED 0x00000020L\n\n#define BDR_RAISEDOUTER 0x0001\n#define BDR_SUNKENOUTER 0x0002\n#define BDR_RAISEDINNER 0x0004\n#define BDR_SUNKENINNER 0x0008\n\n#define BDR_OUTER (BDR_RAISEDOUTER | BDR_SUNKENOUTER)\n#define BDR_INNER (BDR_RAISEDINNER | BDR_SUNKENINNER)\n#define BDR_RAISED (BDR_RAISEDOUTER | BDR_RAISEDINNER)\n#define BDR_SUNKEN (BDR_SUNKENOUTER | BDR_SUNKENINNER)\n\n#define EDGE_RAISED (BDR_RAISEDOUTER | BDR_RAISEDINNER)\n#define EDGE_SUNKEN (BDR_SUNKENOUTER | BDR_SUNKENINNER)\n#define EDGE_ETCHED (BDR_SUNKENOUTER | BDR_RAISEDINNER)\n#define EDGE_BUMP (BDR_RAISEDOUTER | BDR_SUNKENINNER)\n\n#define BF_LEFT 0x0001\n#define BF_TOP 0x0002\n#define BF_RIGHT 0x0004\n#define BF_BOTTOM 0x0008\n\n#define BF_TOPLEFT (BF_TOP | BF_LEFT)\n#define BF_TOPRIGHT (BF_TOP | BF_RIGHT)\n#define BF_BOTTOMLEFT (BF_BOTTOM | BF_LEFT)\n#define BF_BOTTOMRIGHT (BF_BOTTOM | BF_RIGHT)\n#define BF_RECT (BF_LEFT | BF_TOP | BF_RIGHT | BF_BOTTOM)\n\n#define BF_DIAGONAL 0x0010\n\n#define BF_DIAGONAL_ENDTOPRIGHT (BF_DIAGONAL | BF_TOP | BF_RIGHT)\n#define BF_DIAGONAL_ENDTOPLEFT (BF_DIAGONAL | BF_TOP | BF_LEFT)\n#define BF_DIAGONAL_ENDBOTTOMLEFT (BF_DIAGONAL | BF_BOTTOM | BF_LEFT)\n#define BF_DIAGONAL_ENDBOTTOMRIGHT (BF_DIAGONAL | BF_BOTTOM | BF_RIGHT)\n\n#define BF_MIDDLE 0x0800\n#define BF_SOFT 0x1000\n#define BF_ADJUST 0x2000\n#define BF_FLAT 0x4000\n#define BF_MONO 0x8000\n\n  WINUSERAPI WINBOOL WINAPI DrawEdge(HDC hdc,LPRECT qrc,UINT edge,UINT grfFlags);\n\n#define DFC_CAPTION 1\n#define DFC_MENU 2\n#define DFC_SCROLL 3\n#define DFC_BUTTON 4\n#define DFC_POPUPMENU 5\n\n#define DFCS_CAPTIONCLOSE 0x0000\n#define DFCS_CAPTIONMIN 0x0001\n#define DFCS_CAPTIONMAX 0x0002\n#define DFCS_CAPTIONRESTORE 0x0003\n#define DFCS_CAPTIONHELP 0x0004\n\n#define DFCS_MENUARROW 0x0000\n#define DFCS_MENUCHECK 0x0001\n#define DFCS_MENUBULLET 0x0002\n#define DFCS_MENUARROWRIGHT 0x0004\n#define DFCS_SCROLLUP 0x0000\n#define DFCS_SCROLLDOWN 0x0001\n#define DFCS_SCROLLLEFT 0x0002\n#define DFCS_SCROLLRIGHT 0x0003\n#define DFCS_SCROLLCOMBOBOX 0x0005\n#define DFCS_SCROLLSIZEGRIP 0x0008\n#define DFCS_SCROLLSIZEGRIPRIGHT 0x0010\n\n#define DFCS_BUTTONCHECK 0x0000\n#define DFCS_BUTTONRADIOIMAGE 0x0001\n#define DFCS_BUTTONRADIOMASK 0x0002\n#define DFCS_BUTTONRADIO 0x0004\n#define DFCS_BUTTON3STATE 0x0008\n#define DFCS_BUTTONPUSH 0x0010\n\n#define DFCS_INACTIVE 0x0100\n#define DFCS_PUSHED 0x0200\n#define DFCS_CHECKED 0x0400\n\n#define DFCS_TRANSPARENT 0x0800\n#define DFCS_HOT 0x1000\n\n#define DFCS_ADJUSTRECT 0x2000\n#define DFCS_FLAT 0x4000\n#define DFCS_MONO 0x8000\n\n  WINUSERAPI WINBOOL WINAPI DrawFrameControl(HDC,LPRECT,UINT,UINT);\n\n#define DC_ACTIVE 0x0001\n#define DC_SMALLCAP 0x0002\n#define DC_ICON 0x0004\n#define DC_TEXT 0x0008\n#define DC_INBUTTON 0x0010\n#define DC_GRADIENT 0x0020\n#define DC_BUTTONS 0x1000\n\n  WINUSERAPI WINBOOL WINAPI DrawCaption(HWND hwnd,HDC hdc,CONST RECT *lprect,UINT flags);\n\n#define IDANI_OPEN 1\n#define IDANI_CAPTION 3\n\n  WINUSERAPI WINBOOL WINAPI DrawAnimatedRects(HWND hwnd,int idAni,CONST RECT *lprcFrom,CONST RECT *lprcTo);\n\n#ifndef NOCLIPBOARD\n\n#define CF_TEXT 1\n#define CF_BITMAP 2\n#define CF_METAFILEPICT 3\n#define CF_SYLK 4\n#define CF_DIF 5\n#define CF_TIFF 6\n#define CF_OEMTEXT 7\n#define CF_DIB 8\n#define CF_PALETTE 9\n#define CF_PENDATA 10\n#define CF_RIFF 11\n#define CF_WAVE 12\n#define CF_UNICODETEXT 13\n#define CF_ENHMETAFILE 14\n#define CF_HDROP 15\n#define CF_LOCALE 16\n#define CF_DIBV5 17\n#define CF_MAX 18\n\n#define CF_OWNERDISPLAY 0x0080\n#define CF_DSPTEXT 0x0081\n#define CF_DSPBITMAP 0x0082\n#define CF_DSPMETAFILEPICT 0x0083\n#define CF_DSPENHMETAFILE 0x008E\n\n#define CF_PRIVATEFIRST 0x0200\n#define CF_PRIVATELAST 0x02FF\n\n#define CF_GDIOBJFIRST 0x0300\n#define CF_GDIOBJLAST 0x03FF\n#endif\n\n#define FVIRTKEY TRUE\n#define FNOINVERT 0x02\n#define FSHIFT 0x04\n#define FCONTROL 0x08\n#define FALT 0x10\n\n  typedef struct tagACCEL {\n    BYTE fVirt;\n    WORD key;\n    WORD cmd;\n  } ACCEL,*LPACCEL;\n\n  typedef struct tagPAINTSTRUCT {\n    HDC hdc;\n    WINBOOL fErase;\n    RECT rcPaint;\n    WINBOOL fRestore;\n    WINBOOL fIncUpdate;\n    BYTE rgbReserved[32];\n  } PAINTSTRUCT,*PPAINTSTRUCT,*NPPAINTSTRUCT,*LPPAINTSTRUCT;\n\n  typedef struct tagCREATESTRUCTA {\n    LPVOID lpCreateParams;\n    HINSTANCE hInstance;\n    HMENU hMenu;\n    HWND hwndParent;\n    int cy;\n    int cx;\n    int y;\n    int x;\n    LONG style;\n    LPCSTR lpszName;\n    LPCSTR lpszClass;\n    DWORD dwExStyle;\n  } CREATESTRUCTA,*LPCREATESTRUCTA;\n\n  typedef struct tagCREATESTRUCTW {\n    LPVOID lpCreateParams;\n    HINSTANCE hInstance;\n    HMENU hMenu;\n    HWND hwndParent;\n    int cy;\n    int cx;\n    int y;\n    int x;\n    LONG style;\n    LPCWSTR lpszName;\n    LPCWSTR lpszClass;\n    DWORD dwExStyle;\n  } CREATESTRUCTW,*LPCREATESTRUCTW;\n\n#ifdef UNICODE\n  typedef CREATESTRUCTW CREATESTRUCT;\n  typedef LPCREATESTRUCTW LPCREATESTRUCT;\n#else\n  typedef CREATESTRUCTA CREATESTRUCT;\n  typedef LPCREATESTRUCTA LPCREATESTRUCT;\n#endif\n\n  typedef struct tagWINDOWPLACEMENT {\n    UINT length;\n    UINT flags;\n    UINT showCmd;\n    POINT ptMinPosition;\n    POINT ptMaxPosition;\n    RECT rcNormalPosition;\n  } WINDOWPLACEMENT;\n  typedef WINDOWPLACEMENT *PWINDOWPLACEMENT,*LPWINDOWPLACEMENT;\n\n#define WPF_SETMINPOSITION 0x0001\n#define WPF_RESTORETOMAXIMIZED 0x0002\n#define WPF_ASYNCWINDOWPLACEMENT 0x0004\n\n  typedef struct tagNMHDR {\n    HWND hwndFrom;\n    UINT_PTR idFrom;\n    UINT code;\n  } NMHDR;\n\n  typedef NMHDR *LPNMHDR;\n\n  typedef struct tagSTYLESTRUCT {\n    DWORD styleOld;\n    DWORD styleNew;\n  } STYLESTRUCT,*LPSTYLESTRUCT;\n\n#define ODT_MENU 1\n#define ODT_LISTBOX 2\n#define ODT_COMBOBOX 3\n#define ODT_BUTTON 4\n#define ODT_STATIC 5\n\n#define ODA_DRAWENTIRE 0x0001\n#define ODA_SELECT 0x0002\n#define ODA_FOCUS 0x0004\n\n#define ODS_SELECTED 0x0001\n#define ODS_GRAYED 0x0002\n#define ODS_DISABLED 0x0004\n#define ODS_CHECKED 0x0008\n#define ODS_FOCUS 0x0010\n#define ODS_DEFAULT 0x0020\n#define ODS_COMBOBOXEDIT 0x1000\n#define ODS_HOTLIGHT 0x0040\n#define ODS_INACTIVE 0x0080\n#define ODS_NOACCEL 0x0100\n#define ODS_NOFOCUSRECT 0x0200\n\n  typedef struct tagMEASUREITEMSTRUCT {\n    UINT CtlType;\n    UINT CtlID;\n    UINT itemID;\n    UINT itemWidth;\n    UINT itemHeight;\n    ULONG_PTR itemData;\n  } MEASUREITEMSTRUCT,*PMEASUREITEMSTRUCT,*LPMEASUREITEMSTRUCT;\n\n  typedef struct tagDRAWITEMSTRUCT {\n    UINT CtlType;\n    UINT CtlID;\n    UINT itemID;\n    UINT itemAction;\n    UINT itemState;\n    HWND hwndItem;\n    HDC hDC;\n    RECT rcItem;\n    ULONG_PTR itemData;\n  } DRAWITEMSTRUCT,*PDRAWITEMSTRUCT,*LPDRAWITEMSTRUCT;\n\n  typedef struct tagDELETEITEMSTRUCT {\n    UINT CtlType;\n    UINT CtlID;\n    UINT itemID;\n    HWND hwndItem;\n    ULONG_PTR itemData;\n  } DELETEITEMSTRUCT,*PDELETEITEMSTRUCT,*LPDELETEITEMSTRUCT;\n\n  typedef struct tagCOMPAREITEMSTRUCT {\n    UINT CtlType;\n    UINT CtlID;\n    HWND hwndItem;\n    UINT itemID1;\n    ULONG_PTR itemData1;\n    UINT itemID2;\n    ULONG_PTR itemData2;\n    DWORD dwLocaleId;\n  } COMPAREITEMSTRUCT,*PCOMPAREITEMSTRUCT,*LPCOMPAREITEMSTRUCT;\n\n#ifndef NOMSG\n#ifdef UNICODE\n#define GetMessage GetMessageW\n#define DispatchMessage DispatchMessageW\n#define PeekMessage PeekMessageW\n#else\n#define GetMessage GetMessageA\n#define DispatchMessage DispatchMessageA\n#define PeekMessage PeekMessageA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GetMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax);\n  WINUSERAPI WINBOOL WINAPI GetMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax);\n  WINUSERAPI WINBOOL WINAPI TranslateMessage(CONST MSG *lpMsg);\n  WINUSERAPI LRESULT WINAPI DispatchMessageA(CONST MSG *lpMsg);\n  WINUSERAPI LRESULT WINAPI DispatchMessageW(CONST MSG *lpMsg);\n  WINUSERAPI WINBOOL WINAPI SetMessageQueue(int cMessagesMax);\n  WINUSERAPI WINBOOL WINAPI PeekMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);\n  WINUSERAPI WINBOOL WINAPI PeekMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);\n\n#define PM_NOREMOVE 0x0000\n#define PM_REMOVE 0x0001\n#define PM_NOYIELD 0x0002\n#define PM_QS_INPUT (QS_INPUT << 16)\n#define PM_QS_POSTMESSAGE ((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16)\n#define PM_QS_PAINT (QS_PAINT << 16)\n#define PM_QS_SENDMESSAGE (QS_SENDMESSAGE << 16)\n#endif\n\n  WINUSERAPI WINBOOL WINAPI RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk);\n  WINUSERAPI WINBOOL WINAPI UnregisterHotKey(HWND hWnd,int id);\n\n#define MOD_ALT 0x0001\n#define MOD_CONTROL 0x0002\n#define MOD_SHIFT 0x0004\n#define MOD_WIN 0x0008\n\n#define IDHOT_SNAPWINDOW (-1)\n#define IDHOT_SNAPDESKTOP (-2)\n\n#ifdef WIN_INTERNAL\n#ifndef LSTRING\n#define NOLSTRING\n#endif\n#ifndef LFILEIO\n#define NOLFILEIO\n#endif\n#endif\n\n#define ENDSESSION_LOGOFF 0x80000000\n\n#define EWX_LOGOFF 0\n#define EWX_SHUTDOWN 0x00000001\n#define EWX_REBOOT 0x00000002\n#define EWX_FORCE 0x00000004\n#define EWX_POWEROFF 0x00000008\n#define EWX_FORCEIFHUNG 0x00000010\n\n#define ExitWindows(dwReserved,Code) ExitWindowsEx(EWX_LOGOFF,0xFFFFFFFF)\n\n#ifdef UNICODE\n#define SendMessage SendMessageW\n#define SendMessageTimeout SendMessageTimeoutW\n#define SendNotifyMessage SendNotifyMessageW\n#define SendMessageCallback SendMessageCallbackW\n#else\n#define SendMessage SendMessageA\n#define SendMessageTimeout SendMessageTimeoutA\n#define SendNotifyMessage SendNotifyMessageA\n#define SendMessageCallback SendMessageCallbackA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI ExitWindowsEx(UINT uFlags,DWORD dwReason);\n  WINUSERAPI WINBOOL WINAPI SwapMouseButton(WINBOOL fSwap);\n  WINUSERAPI DWORD WINAPI GetMessagePos(VOID);\n  WINUSERAPI LONG WINAPI GetMessageTime(VOID);\n  WINUSERAPI LPARAM WINAPI GetMessageExtraInfo(VOID);\n  WINUSERAPI WINBOOL WINAPI IsWow64Message(VOID);\n  WINUSERAPI LPARAM WINAPI SetMessageExtraInfo(LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI SendMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI SendMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI SendMessageTimeoutA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult);\n  WINUSERAPI LRESULT WINAPI SendMessageTimeoutW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult);\n  WINUSERAPI WINBOOL WINAPI SendNotifyMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI SendNotifyMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI SendMessageCallbackA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData);\n  WINUSERAPI WINBOOL WINAPI SendMessageCallbackW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData);\n\n  typedef struct {\n    UINT cbSize;\n    HDESK hdesk;\n    HWND hwnd;\n    LUID luid;\n  } BSMINFO,*PBSMINFO;\n\n#ifdef UNICODE\n#define BroadcastSystemMessageEx BroadcastSystemMessageExW\n#define BroadcastSystemMessage BroadcastSystemMessageW\n#else\n#define BroadcastSystemMessageEx BroadcastSystemMessageExA\n#define BroadcastSystemMessage BroadcastSystemMessageA\n#endif\n\n  WINUSERAPI long WINAPI BroadcastSystemMessageExA(DWORD flags,LPDWORD lpInfo,UINT Msg,WPARAM wParam,LPARAM lParam,PBSMINFO pbsmInfo);\n  WINUSERAPI long WINAPI BroadcastSystemMessageExW(DWORD flags,LPDWORD lpInfo,UINT Msg,WPARAM wParam,LPARAM lParam,PBSMINFO pbsmInfo);\n  WINUSERAPI long WINAPI BroadcastSystemMessageA(DWORD flags,LPDWORD lpInfo,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI long WINAPI BroadcastSystemMessageW(DWORD flags,LPDWORD lpInfo,UINT Msg,WPARAM wParam,LPARAM lParam);\n\n#define BSM_ALLCOMPONENTS 0x00000000\n#define BSM_VXDS 0x00000001\n#define BSM_NETDRIVER 0x00000002\n#define BSM_INSTALLABLEDRIVERS 0x00000004\n#define BSM_APPLICATIONS 0x00000008\n#define BSM_ALLDESKTOPS 0x00000010\n\n#define BSF_QUERY 0x00000001\n#define BSF_IGNORECURRENTTASK 0x00000002\n#define BSF_FLUSHDISK 0x00000004\n#define BSF_NOHANG 0x00000008\n#define BSF_POSTMESSAGE 0x00000010\n#define BSF_FORCEIFHUNG 0x00000020\n#define BSF_NOTIMEOUTIFNOTHUNG 0x00000040\n#define BSF_ALLOWSFW 0x00000080\n#define BSF_SENDNOTIFYMESSAGE 0x00000100\n#define BSF_RETURNHDESK 0x00000200\n#define BSF_LUID 0x00000400\n\n#define BROADCAST_QUERY_DENY 0x424D5144\n\n  typedef PVOID HDEVNOTIFY;\n  typedef HDEVNOTIFY *PHDEVNOTIFY;\n\n#define DEVICE_NOTIFY_WINDOW_HANDLE 0x00000000\n#define DEVICE_NOTIFY_SERVICE_HANDLE 0x00000001\n#define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES 0x00000004\n\n#ifdef UNICODE\n#define RegisterDeviceNotification RegisterDeviceNotificationW\n#define PostMessage PostMessageW\n#define PostThreadMessage PostThreadMessageW\n#define PostAppMessage PostAppMessageW\n#define DefWindowProc DefWindowProcW\n#define CallWindowProc CallWindowProcW\n#define RegisterClass RegisterClassW\n#define UnregisterClass UnregisterClassW\n#define GetClassInfo GetClassInfoW\n#define RegisterClassEx RegisterClassExW\n#define GetClassInfoEx GetClassInfoExW\n#else\n#define RegisterDeviceNotification RegisterDeviceNotificationA\n#define PostMessage PostMessageA\n#define PostThreadMessage PostThreadMessageA\n#define PostAppMessage PostAppMessageA\n#define DefWindowProc DefWindowProcA\n#define CallWindowProc CallWindowProcA\n#define RegisterClass RegisterClassA\n#define UnregisterClass UnregisterClassA\n#define GetClassInfo GetClassInfoA\n#define RegisterClassEx RegisterClassExA\n#define GetClassInfoEx GetClassInfoExA\n#endif\n\n  WINUSERAPI HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE hRecipient,LPVOID NotificationFilter,DWORD Flags);\n  WINUSERAPI HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE hRecipient,LPVOID NotificationFilter,DWORD Flags);\n  WINUSERAPI WINBOOL WINAPI UnregisterDeviceNotification(HDEVNOTIFY Handle);\n  WINUSERAPI WINBOOL WINAPI PostMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI PostMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI PostThreadMessageA(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI PostThreadMessageW(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);\n#define PostAppMessageA(idThread,wMsg,wParam,lParam) PostThreadMessageA((DWORD)idThread,wMsg,wParam,lParam)\n#define PostAppMessageW(idThread,wMsg,wParam,lParam) PostThreadMessageW((DWORD)idThread,wMsg,wParam,lParam)\n\n#define HWND_BROADCAST ((HWND)0xffff)\n#define HWND_MESSAGE ((HWND)-3)\n\n  WINUSERAPI WINBOOL WINAPI AttachThreadInput(DWORD idAttach,DWORD idAttachTo,WINBOOL fAttach);\n  WINUSERAPI WINBOOL WINAPI ReplyMessage(LRESULT lResult);\n  WINUSERAPI WINBOOL WINAPI WaitMessage(VOID);\n  WINUSERAPI DWORD WINAPI WaitForInputIdle(HANDLE hProcess,DWORD dwMilliseconds);\n  WINUSERAPI LRESULT WINAPI DefWindowProcA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI DefWindowProcW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI VOID WINAPI PostQuitMessage(int nExitCode);\n  WINUSERAPI LRESULT WINAPI CallWindowProcA(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI CallWindowProcW(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI InSendMessage(VOID);\n  WINUSERAPI DWORD WINAPI InSendMessageEx(LPVOID lpReserved);\n\n#define ISMEX_NOSEND 0x00000000\n#define ISMEX_SEND 0x00000001\n#define ISMEX_NOTIFY 0x00000002\n#define ISMEX_CALLBACK 0x00000004\n#define ISMEX_REPLIED 0x00000008\n\n  WINUSERAPI UINT WINAPI GetDoubleClickTime(VOID);\n  WINUSERAPI WINBOOL WINAPI SetDoubleClickTime(UINT);\n  WINUSERAPI ATOM WINAPI RegisterClassA(CONST WNDCLASSA *lpWndClass);\n  WINUSERAPI ATOM WINAPI RegisterClassW(CONST WNDCLASSW *lpWndClass);\n  WINUSERAPI WINBOOL WINAPI UnregisterClassA(LPCSTR lpClassName,HINSTANCE hInstance);\n  WINUSERAPI WINBOOL WINAPI UnregisterClassW(LPCWSTR lpClassName,HINSTANCE hInstance);\n  WINUSERAPI WINBOOL WINAPI GetClassInfoA(HINSTANCE hInstance,LPCSTR lpClassName,LPWNDCLASSA lpWndClass);\n  WINUSERAPI WINBOOL WINAPI GetClassInfoW(HINSTANCE hInstance,LPCWSTR lpClassName,LPWNDCLASSW lpWndClass);\n  WINUSERAPI ATOM WINAPI RegisterClassExA(CONST WNDCLASSEXA *);\n  WINUSERAPI ATOM WINAPI RegisterClassExW(CONST WNDCLASSEXW *);\n  WINUSERAPI WINBOOL WINAPI GetClassInfoExA(HINSTANCE hInstance,LPCSTR lpszClass,LPWNDCLASSEXA lpwcx);\n  WINUSERAPI WINBOOL WINAPI GetClassInfoExW(HINSTANCE hInstance,LPCWSTR lpszClass,LPWNDCLASSEXW lpwcx);\n\n#define CW_USEDEFAULT ((int)0x80000000)\n\n#define HWND_DESKTOP ((HWND)0)\n\n  typedef BOOLEAN (WINAPI *PREGISTERCLASSNAMEW)(LPCWSTR);\n\n#ifdef UNICODE\n#define CreateWindowEx CreateWindowExW\n#define CreateWindow CreateWindowW\n#else\n#define CreateWindowEx CreateWindowExA\n#define CreateWindow CreateWindowA\n#endif\n\n  WINUSERAPI HWND WINAPI CreateWindowExA(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);\n  WINUSERAPI HWND WINAPI CreateWindowExW(DWORD dwExStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);\n#define CreateWindowA(lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam) CreateWindowExA(0L,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam)\n#define CreateWindowW(lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam) CreateWindowExW(0L,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam)\n  WINUSERAPI WINBOOL WINAPI IsWindow(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI IsMenu(HMENU hMenu);\n  WINUSERAPI WINBOOL WINAPI IsChild(HWND hWndParent,HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI DestroyWindow(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI ShowWindow(HWND hWnd,int nCmdShow);\n  WINUSERAPI WINBOOL WINAPI AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags);\n\n#if defined(_WINGDI_) && !defined(NOGDI)\n  WINUSERAPI WINBOOL WINAPI UpdateLayeredWindow(HWND hWnd,HDC hdcDst,POINT *pptDst,SIZE *psize,HDC hdcSrc,POINT *pptSrc,COLORREF crKey,BLENDFUNCTION *pblend,DWORD dwFlags);\n\n  typedef struct tagUPDATELAYEREDWINDOWINFO {\n    DWORD cbSize;\n    HDC hdcDst;\n    POINT CONST *pptDst;\n    SIZE CONST *psize;\n    HDC hdcSrc;\n    POINT CONST *pptSrc;\n    COLORREF crKey;\n    BLENDFUNCTION CONST *pblend;\n    DWORD dwFlags;\n    RECT CONST *prcDirty;\n  } UPDATELAYEREDWINDOWINFO,*PUPDATELAYEREDWINDOWINFO;\n\n  WINUSERAPI WINBOOL WINAPI UpdateLayeredWindowIndirect(HWND hWnd,UPDATELAYEREDWINDOWINFO CONST *pULWInfo);\n  WINUSERAPI WINBOOL WINAPI GetLayeredWindowAttributes(HWND hwnd,COLORREF *pcrKey,BYTE *pbAlpha,DWORD *pdwFlags);\n\n#define PW_CLIENTONLY 0x00000001\n\n  WINUSERAPI WINBOOL WINAPI PrintWindow(HWND hwnd,HDC hdcBlt,UINT nFlags);\n  WINUSERAPI WINBOOL WINAPI SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);\n\n#define LWA_COLORKEY 0x00000001\n#define LWA_ALPHA 0x00000002\n\n#define ULW_COLORKEY 0x00000001\n#define ULW_ALPHA 0x00000002\n#define ULW_OPAQUE 0x00000004\n\n#define ULW_EX_NORESIZE 0x00000008\n\n  WINUSERAPI WINBOOL WINAPI ShowWindowAsync(HWND hWnd,int nCmdShow);\n  WINUSERAPI WINBOOL WINAPI FlashWindow(HWND hWnd,WINBOOL bInvert);\n\n  typedef struct {\n    UINT cbSize;\n    HWND hwnd;\n    DWORD dwFlags;\n    UINT uCount;\n    DWORD dwTimeout;\n  } FLASHWINFO,*PFLASHWINFO;\n\n  WINUSERAPI WINBOOL WINAPI FlashWindowEx(PFLASHWINFO pfwi);\n\n#define FLASHW_STOP 0\n#define FLASHW_CAPTION 0x00000001\n#define FLASHW_TRAY 0x00000002\n#define FLASHW_ALL (FLASHW_CAPTION | FLASHW_TRAY)\n#define FLASHW_TIMER 0x00000004\n#define FLASHW_TIMERNOFG 0x0000000C\n\n  WINUSERAPI WINBOOL WINAPI ShowOwnedPopups(HWND hWnd,WINBOOL fShow);\n  WINUSERAPI WINBOOL WINAPI OpenIcon(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI CloseWindow(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI MoveWindow(HWND hWnd,int X,int Y,int nWidth,int nHeight,WINBOOL bRepaint);\n  WINUSERAPI WINBOOL WINAPI SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx,int cy,UINT uFlags);\n  WINUSERAPI WINBOOL WINAPI GetWindowPlacement(HWND hWnd,WINDOWPLACEMENT *lpwndpl);\n  WINUSERAPI WINBOOL WINAPI SetWindowPlacement(HWND hWnd,CONST WINDOWPLACEMENT *lpwndpl);\n\n#ifndef NODEFERWINDOWPOS\n  WINUSERAPI HDWP WINAPI BeginDeferWindowPos(int nNumWindows);\n  WINUSERAPI HDWP WINAPI DeferWindowPos(HDWP hWinPosInfo,HWND hWnd,HWND hWndInsertAfter,int x,int y,int cx,int cy,UINT uFlags);\n  WINUSERAPI WINBOOL WINAPI EndDeferWindowPos(HDWP hWinPosInfo);\n#endif\n\n  WINUSERAPI WINBOOL WINAPI IsWindowVisible(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI IsIconic(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI AnyPopup(VOID);\n  WINUSERAPI WINBOOL WINAPI BringWindowToTop(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI IsZoomed(HWND hWnd);\n\n#define SWP_NOSIZE 0x0001\n#define SWP_NOMOVE 0x0002\n#define SWP_NOZORDER 0x0004\n#define SWP_NOREDRAW 0x0008\n#define SWP_NOACTIVATE 0x0010\n#define SWP_FRAMECHANGED 0x0020\n#define SWP_SHOWWINDOW 0x0040\n#define SWP_HIDEWINDOW 0x0080\n#define SWP_NOCOPYBITS 0x0100\n#define SWP_NOOWNERZORDER 0x0200\n#define SWP_NOSENDCHANGING 0x0400\n\n#define SWP_DRAWFRAME SWP_FRAMECHANGED\n#define SWP_NOREPOSITION SWP_NOOWNERZORDER\n#define SWP_DEFERERASE 0x2000\n#define SWP_ASYNCWINDOWPOS 0x4000\n\n#define HWND_TOP ((HWND)0)\n#define HWND_BOTTOM ((HWND)1)\n#define HWND_TOPMOST ((HWND)-1)\n#define HWND_NOTOPMOST ((HWND)-2)\n\n#ifndef NOCTLMGR\n\n#include <pshpack2.h>\n\n  typedef struct {\n    DWORD style;\n    DWORD dwExtendedStyle;\n    WORD cdit;\n    short x;\n    short y;\n    short cx;\n    short cy;\n  } DLGTEMPLATE;\n\n  typedef DLGTEMPLATE *LPDLGTEMPLATEA;\n  typedef DLGTEMPLATE *LPDLGTEMPLATEW;\n\n#ifdef UNICODE\n  typedef LPDLGTEMPLATEW LPDLGTEMPLATE;\n#else\n  typedef LPDLGTEMPLATEA LPDLGTEMPLATE;\n#endif\n\n  typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEA;\n  typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEW;\n\n#ifdef UNICODE\n  typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;\n#else\n  typedef LPCDLGTEMPLATEA LPCDLGTEMPLATE;\n#endif\n\n  typedef struct {\n    DWORD style;\n    DWORD dwExtendedStyle;\n    short x;\n    short y;\n    short cx;\n    short cy;\n    WORD id;\n  } DLGITEMTEMPLATE;\n\n  typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEA;\n  typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEW;\n\n#ifdef UNICODE\n  typedef PDLGITEMTEMPLATEW PDLGITEMTEMPLATE;\n#else\n  typedef PDLGITEMTEMPLATEA PDLGITEMTEMPLATE;\n#endif\n\n  typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEA;\n  typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEW;\n\n#ifdef UNICODE\n  typedef LPDLGITEMTEMPLATEW LPDLGITEMTEMPLATE;\n#else\n  typedef LPDLGITEMTEMPLATEA LPDLGITEMTEMPLATE;\n#endif\n\n#include <poppack.h>\n\n#ifdef UNICODE\n#define CreateDialogParam CreateDialogParamW\n#define CreateDialogIndirectParam CreateDialogIndirectParamW\n#define CreateDialog CreateDialogW\n#define CreateDialogIndirect CreateDialogIndirectW\n#define DialogBoxParam DialogBoxParamW\n#define DialogBoxIndirectParam DialogBoxIndirectParamW\n#define DialogBox DialogBoxW\n#define DialogBoxIndirect DialogBoxIndirectW\n#define SetDlgItemText SetDlgItemTextW\n#define GetDlgItemText GetDlgItemTextW\n#define SendDlgItemMessage SendDlgItemMessageW\n#define DefDlgProc DefDlgProcW\n#else\n#define CreateDialogParam CreateDialogParamA\n#define CreateDialogIndirectParam CreateDialogIndirectParamA\n#define CreateDialog CreateDialogA\n#define CreateDialogIndirect CreateDialogIndirectA\n#define DialogBoxParam DialogBoxParamA\n#define DialogBoxIndirectParam DialogBoxIndirectParamA\n#define DialogBox DialogBoxA\n#define DialogBoxIndirect DialogBoxIndirectA\n#define SetDlgItemText SetDlgItemTextA\n#define GetDlgItemText GetDlgItemTextA\n#define SendDlgItemMessage SendDlgItemMessageA\n#define DefDlgProc DefDlgProcA\n#endif\n\n  WINUSERAPI HWND WINAPI CreateDialogParamA(HINSTANCE hInstance,LPCSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n  WINUSERAPI HWND WINAPI CreateDialogParamW(HINSTANCE hInstance,LPCWSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n  WINUSERAPI HWND WINAPI CreateDialogIndirectParamA(HINSTANCE hInstance,LPCDLGTEMPLATEA lpTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n  WINUSERAPI HWND WINAPI CreateDialogIndirectParamW(HINSTANCE hInstance,LPCDLGTEMPLATEW lpTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n#define CreateDialogA(hInstance,lpName,hWndParent,lpDialogFunc) CreateDialogParamA(hInstance,lpName,hWndParent,lpDialogFunc,0L)\n#define CreateDialogW(hInstance,lpName,hWndParent,lpDialogFunc) CreateDialogParamW(hInstance,lpName,hWndParent,lpDialogFunc,0L)\n#define CreateDialogIndirectA(hInstance,lpTemplate,hWndParent,lpDialogFunc) CreateDialogIndirectParamA(hInstance,lpTemplate,hWndParent,lpDialogFunc,0L)\n#define CreateDialogIndirectW(hInstance,lpTemplate,hWndParent,lpDialogFunc) CreateDialogIndirectParamW(hInstance,lpTemplate,hWndParent,lpDialogFunc,0L)\n  WINUSERAPI INT_PTR WINAPI DialogBoxParamA(HINSTANCE hInstance,LPCSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n  WINUSERAPI INT_PTR WINAPI DialogBoxParamW(HINSTANCE hInstance,LPCWSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n  WINUSERAPI INT_PTR WINAPI DialogBoxIndirectParamA(HINSTANCE hInstance,LPCDLGTEMPLATEA hDialogTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n  WINUSERAPI INT_PTR WINAPI DialogBoxIndirectParamW(HINSTANCE hInstance,LPCDLGTEMPLATEW hDialogTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam);\n#define DialogBoxA(hInstance,lpTemplate,hWndParent,lpDialogFunc) DialogBoxParamA(hInstance,lpTemplate,hWndParent,lpDialogFunc,0L)\n#define DialogBoxW(hInstance,lpTemplate,hWndParent,lpDialogFunc) DialogBoxParamW(hInstance,lpTemplate,hWndParent,lpDialogFunc,0L)\n#define DialogBoxIndirectA(hInstance,lpTemplate,hWndParent,lpDialogFunc) DialogBoxIndirectParamA(hInstance,lpTemplate,hWndParent,lpDialogFunc,0L)\n#define DialogBoxIndirectW(hInstance,lpTemplate,hWndParent,lpDialogFunc) DialogBoxIndirectParamW(hInstance,lpTemplate,hWndParent,lpDialogFunc,0L)\n  WINUSERAPI WINBOOL WINAPI EndDialog(HWND hDlg,INT_PTR nResult);\n  WINUSERAPI HWND WINAPI GetDlgItem(HWND hDlg,int nIDDlgItem);\n  WINUSERAPI WINBOOL WINAPI SetDlgItemInt(HWND hDlg,int nIDDlgItem,UINT uValue,WINBOOL bSigned);\n  WINUSERAPI UINT WINAPI GetDlgItemInt(HWND hDlg,int nIDDlgItem,WINBOOL *lpTranslated,WINBOOL bSigned);\n  WINUSERAPI WINBOOL WINAPI SetDlgItemTextA(HWND hDlg,int nIDDlgItem,LPCSTR lpString);\n  WINUSERAPI WINBOOL WINAPI SetDlgItemTextW(HWND hDlg,int nIDDlgItem,LPCWSTR lpString);\n  WINUSERAPI UINT WINAPI GetDlgItemTextA(HWND hDlg,int nIDDlgItem,LPSTR lpString,int cchMax);\n  WINUSERAPI UINT WINAPI GetDlgItemTextW(HWND hDlg,int nIDDlgItem,LPWSTR lpString,int cchMax);\n  WINUSERAPI WINBOOL WINAPI CheckDlgButton(HWND hDlg,int nIDButton,UINT uCheck);\n  WINUSERAPI WINBOOL WINAPI CheckRadioButton(HWND hDlg,int nIDFirstButton,int nIDLastButton,int nIDCheckButton);\n  WINUSERAPI UINT WINAPI IsDlgButtonChecked(HWND hDlg,int nIDButton);\n  WINUSERAPI LRESULT WINAPI SendDlgItemMessageA(HWND hDlg,int nIDDlgItem,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI SendDlgItemMessageW(HWND hDlg,int nIDDlgItem,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI HWND WINAPI GetNextDlgGroupItem(HWND hDlg,HWND hCtl,WINBOOL bPrevious);\n  WINUSERAPI HWND WINAPI GetNextDlgTabItem(HWND hDlg,HWND hCtl,WINBOOL bPrevious);\n  WINUSERAPI int WINAPI GetDlgCtrlID(HWND hWnd);\n  WINUSERAPI long WINAPI GetDialogBaseUnits(VOID);\n  WINUSERAPI LRESULT WINAPI DefDlgProcA(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI DefDlgProcW(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam);\n\n#define DLGWINDOWEXTRA 30\n#endif\n\n#ifndef NOMSG\n\n#ifdef UNICODE\n#define CallMsgFilter CallMsgFilterW\n#else\n#define CallMsgFilter CallMsgFilterA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI CallMsgFilterA(LPMSG lpMsg,int nCode);\n  WINUSERAPI WINBOOL WINAPI CallMsgFilterW(LPMSG lpMsg,int nCode);\n#endif\n\n#ifndef NOCLIPBOARD\n\n#ifdef UNICODE\n#define RegisterClipboardFormat RegisterClipboardFormatW\n#define GetClipboardFormatName GetClipboardFormatNameW\n#else\n#define RegisterClipboardFormat RegisterClipboardFormatA\n#define GetClipboardFormatName GetClipboardFormatNameA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI OpenClipboard(HWND hWndNewOwner);\n  WINUSERAPI WINBOOL WINAPI CloseClipboard(VOID);\n  WINUSERAPI DWORD WINAPI GetClipboardSequenceNumber(VOID);\n  WINUSERAPI HWND WINAPI GetClipboardOwner(VOID);\n  WINUSERAPI HWND WINAPI SetClipboardViewer(HWND hWndNewViewer);\n  WINUSERAPI HWND WINAPI GetClipboardViewer(VOID);\n  WINUSERAPI WINBOOL WINAPI ChangeClipboardChain(HWND hWndRemove,HWND hWndNewNext);\n  WINUSERAPI HANDLE WINAPI SetClipboardData(UINT uFormat,HANDLE hMem);\n  WINUSERAPI HANDLE WINAPI GetClipboardData(UINT uFormat);\n  WINUSERAPI UINT WINAPI RegisterClipboardFormatA(LPCSTR lpszFormat);\n  WINUSERAPI UINT WINAPI RegisterClipboardFormatW(LPCWSTR lpszFormat);\n  WINUSERAPI int WINAPI CountClipboardFormats(VOID);\n  WINUSERAPI UINT WINAPI EnumClipboardFormats(UINT format);\n  WINUSERAPI int WINAPI GetClipboardFormatNameA(UINT format,LPSTR lpszFormatName,int cchMaxCount);\n  WINUSERAPI int WINAPI GetClipboardFormatNameW(UINT format,LPWSTR lpszFormatName,int cchMaxCount);\n  WINUSERAPI WINBOOL WINAPI EmptyClipboard(VOID);\n  WINUSERAPI WINBOOL WINAPI IsClipboardFormatAvailable(UINT format);\n  WINUSERAPI int WINAPI GetPriorityClipboardFormat(UINT *paFormatPriorityList,int cFormats);\n  WINUSERAPI HWND WINAPI GetOpenClipboardWindow(VOID);\n#endif\n\n#ifdef UNICODE\n#define CharToOem CharToOemW\n#define OemToChar OemToCharW\n#define CharToOemBuff CharToOemBuffW\n#define OemToCharBuff OemToCharBuffW\n#define CharUpper CharUpperW\n#define CharUpperBuff CharUpperBuffW\n#define CharLower CharLowerW\n#define CharLowerBuff CharLowerBuffW\n#define CharNext CharNextW\n#define CharPrev CharPrevW\n#else\n#define CharToOem CharToOemA\n#define OemToChar OemToCharA\n#define CharToOemBuff CharToOemBuffA\n#define OemToCharBuff OemToCharBuffA\n#define CharUpper CharUpperA\n#define CharUpperBuff CharUpperBuffA\n#define CharLower CharLowerA\n#define CharLowerBuff CharLowerBuffA\n#define CharNext CharNextA\n#define CharPrev CharPrevA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI CharToOemA(LPCSTR lpszSrc,LPSTR lpszDst);\n  WINUSERAPI WINBOOL WINAPI CharToOemW(LPCWSTR lpszSrc,LPSTR lpszDst);\n  WINUSERAPI WINBOOL WINAPI OemToCharA(LPCSTR lpszSrc,LPSTR lpszDst);\n  WINUSERAPI WINBOOL WINAPI OemToCharW(LPCSTR lpszSrc,LPWSTR lpszDst);\n  WINUSERAPI WINBOOL WINAPI CharToOemBuffA(LPCSTR lpszSrc,LPSTR lpszDst,DWORD cchDstLength);\n  WINUSERAPI WINBOOL WINAPI CharToOemBuffW(LPCWSTR lpszSrc,LPSTR lpszDst,DWORD cchDstLength);\n  WINUSERAPI WINBOOL WINAPI OemToCharBuffA(LPCSTR lpszSrc,LPSTR lpszDst,DWORD cchDstLength);\n  WINUSERAPI WINBOOL WINAPI OemToCharBuffW(LPCSTR lpszSrc,LPWSTR lpszDst,DWORD cchDstLength);\n  WINUSERAPI LPSTR WINAPI CharUpperA(LPSTR lpsz);\n  WINUSERAPI LPWSTR WINAPI CharUpperW(LPWSTR lpsz);\n  WINUSERAPI DWORD WINAPI CharUpperBuffA(LPSTR lpsz,DWORD cchLength);\n  WINUSERAPI DWORD WINAPI CharUpperBuffW(LPWSTR lpsz,DWORD cchLength);\n  WINUSERAPI LPSTR WINAPI CharLowerA(LPSTR lpsz);\n  WINUSERAPI LPWSTR WINAPI CharLowerW(LPWSTR lpsz);\n  WINUSERAPI DWORD WINAPI CharLowerBuffA(LPSTR lpsz,DWORD cchLength);\n  WINUSERAPI DWORD WINAPI CharLowerBuffW(LPWSTR lpsz,DWORD cchLength);\n  WINUSERAPI LPSTR WINAPI CharNextA(LPCSTR lpsz);\n  WINUSERAPI LPWSTR WINAPI CharNextW(LPCWSTR lpsz);\n  WINUSERAPI LPSTR WINAPI CharPrevA(LPCSTR lpszStart,LPCSTR lpszCurrent);\n  WINUSERAPI LPWSTR WINAPI CharPrevW(LPCWSTR lpszStart,LPCWSTR lpszCurrent);\n  WINUSERAPI LPSTR WINAPI CharNextExA(WORD CodePage,LPCSTR lpCurrentChar,DWORD dwFlags);\n  WINUSERAPI LPSTR WINAPI CharPrevExA(WORD CodePage,LPCSTR lpStart,LPCSTR lpCurrentChar,DWORD dwFlags);\n\n#define AnsiToOem CharToOemA\n#define OemToAnsi OemToCharA\n#define AnsiToOemBuff CharToOemBuffA\n#define OemToAnsiBuff OemToCharBuffA\n#define AnsiUpper CharUpperA\n#define AnsiUpperBuff CharUpperBuffA\n#define AnsiLower CharLowerA\n#define AnsiLowerBuff CharLowerBuffA\n#define AnsiNext CharNextA\n#define AnsiPrev CharPrevA\n\n#ifndef NOLANGUAGE\n\n#ifdef UNICODE\n#define IsCharAlpha IsCharAlphaW\n#define IsCharAlphaNumeric IsCharAlphaNumericW\n#define IsCharUpper IsCharUpperW\n#define IsCharLower IsCharLowerW\n#else\n#define IsCharAlpha IsCharAlphaA\n#define IsCharAlphaNumeric IsCharAlphaNumericA\n#define IsCharUpper IsCharUpperA\n#define IsCharLower IsCharLowerA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI IsCharAlphaA(CHAR ch);\n  WINUSERAPI WINBOOL WINAPI IsCharAlphaW(WCHAR ch);\n  WINUSERAPI WINBOOL WINAPI IsCharAlphaNumericA(CHAR ch);\n  WINUSERAPI WINBOOL WINAPI IsCharAlphaNumericW(WCHAR ch);\n  WINUSERAPI WINBOOL WINAPI IsCharUpperA(CHAR ch);\n  WINUSERAPI WINBOOL WINAPI IsCharUpperW(WCHAR ch);\n  WINUSERAPI WINBOOL WINAPI IsCharLowerA(CHAR ch);\n  WINUSERAPI WINBOOL WINAPI IsCharLowerW(WCHAR ch);\n#endif\n\n#ifdef UNICODE\n#define GetKeyNameText GetKeyNameTextW\n#define VkKeyScan VkKeyScanW\n#define VkKeyScanEx VkKeyScanExW\n#else\n#define GetKeyNameText GetKeyNameTextA\n#define VkKeyScan VkKeyScanA\n#define VkKeyScanEx VkKeyScanExA\n#endif\n\n  WINUSERAPI HWND WINAPI SetFocus(HWND hWnd);\n  WINUSERAPI HWND WINAPI GetActiveWindow(VOID);\n  WINUSERAPI HWND WINAPI GetFocus(VOID);\n  WINUSERAPI UINT WINAPI GetKBCodePage(VOID);\n  WINUSERAPI SHORT WINAPI GetKeyState(int nVirtKey);\n  WINUSERAPI SHORT WINAPI GetAsyncKeyState(int vKey);\n  WINUSERAPI WINBOOL WINAPI GetKeyboardState(PBYTE lpKeyState);\n  WINUSERAPI WINBOOL WINAPI SetKeyboardState(LPBYTE lpKeyState);\n  WINUSERAPI int WINAPI GetKeyNameTextA(LONG lParam,LPSTR lpString,int cchSize);\n  WINUSERAPI int WINAPI GetKeyNameTextW(LONG lParam,LPWSTR lpString,int cchSize);\n  WINUSERAPI int WINAPI GetKeyboardType(int nTypeFlag);\n  WINUSERAPI int WINAPI ToAscii(UINT uVirtKey,UINT uScanCode,CONST BYTE *lpKeyState,LPWORD lpChar,UINT uFlags);\n  WINUSERAPI int WINAPI ToAsciiEx(UINT uVirtKey,UINT uScanCode,CONST BYTE *lpKeyState,LPWORD lpChar,UINT uFlags,HKL dwhkl);\n  WINUSERAPI int WINAPI ToUnicode(UINT wVirtKey,UINT wScanCode,CONST BYTE *lpKeyState,LPWSTR pwszBuff,int cchBuff,UINT wFlags);\n  WINUSERAPI DWORD WINAPI OemKeyScan(WORD wOemChar);\n  WINUSERAPI SHORT WINAPI VkKeyScanA(CHAR ch);\n  WINUSERAPI SHORT WINAPI VkKeyScanW(WCHAR ch);\n  WINUSERAPI SHORT WINAPI VkKeyScanExA(CHAR ch,HKL dwhkl);\n  WINUSERAPI SHORT WINAPI VkKeyScanExW(WCHAR ch,HKL dwhkl);\n\n#define KEYEVENTF_EXTENDEDKEY 0x0001\n#define KEYEVENTF_KEYUP 0x0002\n#define KEYEVENTF_UNICODE 0x0004\n#define KEYEVENTF_SCANCODE 0x0008\n\n  WINUSERAPI VOID WINAPI keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,ULONG_PTR dwExtraInfo);\n\n#define MOUSEEVENTF_MOVE 0x0001\n#define MOUSEEVENTF_LEFTDOWN 0x0002\n#define MOUSEEVENTF_LEFTUP 0x0004\n#define MOUSEEVENTF_RIGHTDOWN 0x0008\n#define MOUSEEVENTF_RIGHTUP 0x0010\n#define MOUSEEVENTF_MIDDLEDOWN 0x0020\n#define MOUSEEVENTF_MIDDLEUP 0x0040\n#define MOUSEEVENTF_XDOWN 0x0080\n#define MOUSEEVENTF_XUP 0x0100\n#define MOUSEEVENTF_WHEEL 0x0800\n#define MOUSEEVENTF_VIRTUALDESK 0x4000\n#define MOUSEEVENTF_ABSOLUTE 0x8000\n\n  WINUSERAPI VOID WINAPI mouse_event(DWORD dwFlags,DWORD dx,DWORD dy,DWORD dwData,ULONG_PTR dwExtraInfo);\n\n  typedef struct tagMOUSEINPUT {\n    LONG dx;\n    LONG dy;\n    DWORD mouseData;\n    DWORD dwFlags;\n    DWORD time;\n    ULONG_PTR dwExtraInfo;\n  } MOUSEINPUT,*PMOUSEINPUT,*LPMOUSEINPUT;\n\n  typedef struct tagKEYBDINPUT {\n    WORD wVk;\n    WORD wScan;\n    DWORD dwFlags;\n    DWORD time;\n    ULONG_PTR dwExtraInfo;\n  } KEYBDINPUT,*PKEYBDINPUT,*LPKEYBDINPUT;\n\n  typedef struct tagHARDWAREINPUT {\n    DWORD uMsg;\n    WORD wParamL;\n    WORD wParamH;\n  } HARDWAREINPUT,*PHARDWAREINPUT,*LPHARDWAREINPUT;\n\n#define INPUT_MOUSE 0\n#define INPUT_KEYBOARD 1\n#define INPUT_HARDWARE 2\n\n  typedef struct tagINPUT {\n    DWORD type;\n    union {\n      MOUSEINPUT mi;\n      KEYBDINPUT ki;\n      HARDWAREINPUT hi;\n    };\n  } INPUT,*PINPUT,*LPINPUT;\n\n  WINUSERAPI UINT WINAPI SendInput(UINT cInputs,LPINPUT pInputs,int cbSize);\n\n  typedef struct tagLASTINPUTINFO {\n    UINT cbSize;\n    DWORD dwTime;\n  } LASTINPUTINFO,*PLASTINPUTINFO;\n\n#ifdef UNICODE\n#define MapVirtualKey MapVirtualKeyW\n#define MapVirtualKeyEx MapVirtualKeyExW\n#else\n#define MapVirtualKey MapVirtualKeyA\n#define MapVirtualKeyEx MapVirtualKeyExA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii);\n  WINUSERAPI UINT WINAPI MapVirtualKeyA(UINT uCode,UINT uMapType);\n  WINUSERAPI UINT WINAPI MapVirtualKeyW(UINT uCode,UINT uMapType);\n  WINUSERAPI UINT WINAPI MapVirtualKeyExA(UINT uCode,UINT uMapType,HKL dwhkl);\n  WINUSERAPI UINT WINAPI MapVirtualKeyExW(UINT uCode,UINT uMapType,HKL dwhkl);\n  WINUSERAPI WINBOOL WINAPI GetInputState(VOID);\n  WINUSERAPI DWORD WINAPI GetQueueStatus(UINT flags);\n  WINUSERAPI HWND WINAPI GetCapture(VOID);\n  WINUSERAPI HWND WINAPI SetCapture(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI ReleaseCapture(VOID);\n  WINUSERAPI DWORD WINAPI MsgWaitForMultipleObjects(DWORD nCount,CONST HANDLE *pHandles,WINBOOL fWaitAll,DWORD dwMilliseconds,DWORD dwWakeMask);\n  WINUSERAPI DWORD WINAPI MsgWaitForMultipleObjectsEx(DWORD nCount,CONST HANDLE *pHandles,DWORD dwMilliseconds,DWORD dwWakeMask,DWORD dwFlags);\n\n#define MWMO_WAITALL 0x0001\n#define MWMO_ALERTABLE 0x0002\n#define MWMO_INPUTAVAILABLE 0x0004\n\n#define QS_KEY 0x0001\n#define QS_MOUSEMOVE 0x0002\n#define QS_MOUSEBUTTON 0x0004\n#define QS_POSTMESSAGE 0x0008\n#define QS_TIMER 0x0010\n#define QS_PAINT 0x0020\n#define QS_SENDMESSAGE 0x0040\n#define QS_HOTKEY 0x0080\n#define QS_ALLPOSTMESSAGE 0x0100\n#define QS_RAWINPUT 0x0400\n#define QS_MOUSE (QS_MOUSEMOVE | QS_MOUSEBUTTON)\n#define QS_INPUT (QS_MOUSE | QS_KEY | QS_RAWINPUT)\n#define QS_ALLEVENTS (QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY)\n#define QS_ALLINPUT (QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE)\n\n#define USER_TIMER_MAXIMUM 0x7FFFFFFF\n#define USER_TIMER_MINIMUM 0x0000000A\n\n#ifdef UNICODE\n#define LoadAccelerators LoadAcceleratorsW\n#define CreateAcceleratorTable CreateAcceleratorTableW\n#define CopyAcceleratorTable CopyAcceleratorTableW\n#else\n#define LoadAccelerators LoadAcceleratorsA\n#define CreateAcceleratorTable CreateAcceleratorTableA\n#define CopyAcceleratorTable CopyAcceleratorTableA\n#endif\n\n  WINUSERAPI UINT_PTR WINAPI SetTimer(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc);\n  WINUSERAPI WINBOOL WINAPI KillTimer(HWND hWnd,UINT_PTR uIDEvent);\n  WINUSERAPI WINBOOL WINAPI IsWindowUnicode(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI EnableWindow(HWND hWnd,WINBOOL bEnable);\n  WINUSERAPI WINBOOL WINAPI IsWindowEnabled(HWND hWnd);\n  WINUSERAPI HACCEL WINAPI LoadAcceleratorsA(HINSTANCE hInstance,LPCSTR lpTableName);\n  WINUSERAPI HACCEL WINAPI LoadAcceleratorsW(HINSTANCE hInstance,LPCWSTR lpTableName);\n  WINUSERAPI HACCEL WINAPI CreateAcceleratorTableA(LPACCEL paccel,int cAccel);\n  WINUSERAPI HACCEL WINAPI CreateAcceleratorTableW(LPACCEL paccel,int cAccel);\n  WINUSERAPI WINBOOL WINAPI DestroyAcceleratorTable(HACCEL hAccel);\n  WINUSERAPI int WINAPI CopyAcceleratorTableA(HACCEL hAccelSrc,LPACCEL lpAccelDst,int cAccelEntries);\n  WINUSERAPI int WINAPI CopyAcceleratorTableW(HACCEL hAccelSrc,LPACCEL lpAccelDst,int cAccelEntries);\n\n#ifndef NOMSG\n\n#ifdef UNICODE\n#define TranslateAccelerator TranslateAcceleratorW\n#else\n#define TranslateAccelerator TranslateAcceleratorA\n#endif\n\n  WINUSERAPI int WINAPI TranslateAcceleratorA(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg);\n  WINUSERAPI int WINAPI TranslateAcceleratorW(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg);\n#endif\n\n#ifndef NOSYSMETRICS\n\n#define SM_CXSCREEN 0\n#define SM_CYSCREEN 1\n#define SM_CXVSCROLL 2\n#define SM_CYHSCROLL 3\n#define SM_CYCAPTION 4\n#define SM_CXBORDER 5\n#define SM_CYBORDER 6\n#define SM_CXDLGFRAME 7\n#define SM_CYDLGFRAME 8\n#define SM_CYVTHUMB 9\n#define SM_CXHTHUMB 10\n#define SM_CXICON 11\n#define SM_CYICON 12\n#define SM_CXCURSOR 13\n#define SM_CYCURSOR 14\n#define SM_CYMENU 15\n#define SM_CXFULLSCREEN 16\n#define SM_CYFULLSCREEN 17\n#define SM_CYKANJIWINDOW 18\n#define SM_MOUSEPRESENT 19\n#define SM_CYVSCROLL 20\n#define SM_CXHSCROLL 21\n#define SM_DEBUG 22\n#define SM_SWAPBUTTON 23\n#define SM_RESERVED1 24\n#define SM_RESERVED2 25\n#define SM_RESERVED3 26\n#define SM_RESERVED4 27\n#define SM_CXMIN 28\n#define SM_CYMIN 29\n#define SM_CXSIZE 30\n#define SM_CYSIZE 31\n#define SM_CXFRAME 32\n#define SM_CYFRAME 33\n#define SM_CXMINTRACK 34\n#define SM_CYMINTRACK 35\n#define SM_CXDOUBLECLK 36\n#define SM_CYDOUBLECLK 37\n#define SM_CXICONSPACING 38\n#define SM_CYICONSPACING 39\n#define SM_MENUDROPALIGNMENT 40\n#define SM_PENWINDOWS 41\n#define SM_DBCSENABLED 42\n#define SM_CMOUSEBUTTONS 43\n\n#define SM_CXFIXEDFRAME SM_CXDLGFRAME\n#define SM_CYFIXEDFRAME SM_CYDLGFRAME\n#define SM_CXSIZEFRAME SM_CXFRAME\n#define SM_CYSIZEFRAME SM_CYFRAME\n\n#define SM_SECURE 44\n#define SM_CXEDGE 45\n#define SM_CYEDGE 46\n#define SM_CXMINSPACING 47\n#define SM_CYMINSPACING 48\n#define SM_CXSMICON 49\n#define SM_CYSMICON 50\n#define SM_CYSMCAPTION 51\n#define SM_CXSMSIZE 52\n#define SM_CYSMSIZE 53\n#define SM_CXMENUSIZE 54\n#define SM_CYMENUSIZE 55\n#define SM_ARRANGE 56\n#define SM_CXMINIMIZED 57\n#define SM_CYMINIMIZED 58\n#define SM_CXMAXTRACK 59\n#define SM_CYMAXTRACK 60\n#define SM_CXMAXIMIZED 61\n#define SM_CYMAXIMIZED 62\n#define SM_NETWORK 63\n#define SM_CLEANBOOT 67\n#define SM_CXDRAG 68\n#define SM_CYDRAG 69\n#define SM_SHOWSOUNDS 70\n#define SM_CXMENUCHECK 71\n#define SM_CYMENUCHECK 72\n#define SM_SLOWMACHINE 73\n#define SM_MIDEASTENABLED 74\n#define SM_MOUSEWHEELPRESENT 75\n#define SM_XVIRTUALSCREEN 76\n#define SM_YVIRTUALSCREEN 77\n#define SM_CXVIRTUALSCREEN 78\n#define SM_CYVIRTUALSCREEN 79\n#define SM_CMONITORS 80\n#define SM_SAMEDISPLAYFORMAT 81\n#define SM_IMMENABLED 82\n#define SM_CXFOCUSBORDER 83\n#define SM_CYFOCUSBORDER 84\n#define SM_TABLETPC 86\n#define SM_MEDIACENTER 87\n#define SM_STARTER 88\n#define SM_SERVERR2 89\n#define SM_CMETRICS 90\n#define SM_REMOTESESSION 0x1000\n#define SM_SHUTTINGDOWN 0x2000\n#define SM_REMOTECONTROL 0x2001\n#define SM_CARETBLINKINGENABLED 0x2002\n\n  WINUSERAPI int WINAPI GetSystemMetrics(int nIndex);\n#endif\n\n#ifndef NOMENUS\n\n#ifdef UNICODE\n#define LoadMenu LoadMenuW\n#define LoadMenuIndirect LoadMenuIndirectW\n#define ChangeMenu ChangeMenuW\n#define GetMenuString GetMenuStringW\n#define InsertMenu InsertMenuW\n#define AppendMenu AppendMenuW\n#define ModifyMenu ModifyMenuW\n#else\n#define LoadMenu LoadMenuA\n#define LoadMenuIndirect LoadMenuIndirectA\n#define ChangeMenu ChangeMenuA\n#define GetMenuString GetMenuStringA\n#define InsertMenu InsertMenuA\n#define AppendMenu AppendMenuA\n#define ModifyMenu ModifyMenuA\n#endif\n\n  WINUSERAPI HMENU WINAPI LoadMenuA(HINSTANCE hInstance,LPCSTR lpMenuName);\n  WINUSERAPI HMENU WINAPI LoadMenuW(HINSTANCE hInstance,LPCWSTR lpMenuName);\n  WINUSERAPI HMENU WINAPI LoadMenuIndirectA(CONST MENUTEMPLATEA *lpMenuTemplate);\n  WINUSERAPI HMENU WINAPI LoadMenuIndirectW(CONST MENUTEMPLATEW *lpMenuTemplate);\n  WINUSERAPI HMENU WINAPI GetMenu(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI SetMenu(HWND hWnd,HMENU hMenu);\n  WINUSERAPI WINBOOL WINAPI ChangeMenuA(HMENU hMenu,UINT cmd,LPCSTR lpszNewItem,UINT cmdInsert,UINT flags);\n  WINUSERAPI WINBOOL WINAPI ChangeMenuW(HMENU hMenu,UINT cmd,LPCWSTR lpszNewItem,UINT cmdInsert,UINT flags);\n  WINUSERAPI WINBOOL WINAPI HiliteMenuItem(HWND hWnd,HMENU hMenu,UINT uIDHiliteItem,UINT uHilite);\n  WINUSERAPI int WINAPI GetMenuStringA(HMENU hMenu,UINT uIDItem,LPSTR lpString,int cchMax,UINT flags);\n  WINUSERAPI int WINAPI GetMenuStringW(HMENU hMenu,UINT uIDItem,LPWSTR lpString,int cchMax,UINT flags);\n  WINUSERAPI UINT WINAPI GetMenuState(HMENU hMenu,UINT uId,UINT uFlags);\n  WINUSERAPI WINBOOL WINAPI DrawMenuBar(HWND hWnd);\n\n#define PMB_ACTIVE 0x00000001\n\n  WINUSERAPI HMENU WINAPI GetSystemMenu(HWND hWnd,WINBOOL bRevert);\n  WINUSERAPI HMENU WINAPI CreateMenu(VOID);\n  WINUSERAPI HMENU WINAPI CreatePopupMenu(VOID);\n  WINUSERAPI WINBOOL WINAPI DestroyMenu(HMENU hMenu);\n  WINUSERAPI DWORD WINAPI CheckMenuItem(HMENU hMenu,UINT uIDCheckItem,UINT uCheck);\n  WINUSERAPI WINBOOL WINAPI EnableMenuItem(HMENU hMenu,UINT uIDEnableItem,UINT uEnable);\n  WINUSERAPI HMENU WINAPI GetSubMenu(HMENU hMenu,int nPos);\n  WINUSERAPI UINT WINAPI GetMenuItemID(HMENU hMenu,int nPos);\n  WINUSERAPI int WINAPI GetMenuItemCount(HMENU hMenu);\n  WINUSERAPI WINBOOL WINAPI InsertMenuA(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCSTR lpNewItem);\n  WINUSERAPI WINBOOL WINAPI InsertMenuW(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCWSTR lpNewItem);\n  WINUSERAPI WINBOOL WINAPI AppendMenuA(HMENU hMenu,UINT uFlags,UINT_PTR uIDNewItem,LPCSTR lpNewItem);\n  WINUSERAPI WINBOOL WINAPI AppendMenuW(HMENU hMenu,UINT uFlags,UINT_PTR uIDNewItem,LPCWSTR lpNewItem);\n  WINUSERAPI WINBOOL WINAPI ModifyMenuA(HMENU hMnu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCSTR lpNewItem);\n  WINUSERAPI WINBOOL WINAPI ModifyMenuW(HMENU hMnu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCWSTR lpNewItem);\n  WINUSERAPI WINBOOL WINAPI RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlags);\n  WINUSERAPI WINBOOL WINAPI DeleteMenu(HMENU hMenu,UINT uPosition,UINT uFlags);\n  WINUSERAPI WINBOOL WINAPI SetMenuItemBitmaps(HMENU hMenu,UINT uPosition,UINT uFlags,HBITMAP hBitmapUnchecked,HBITMAP hBitmapChecked);\n  WINUSERAPI LONG WINAPI GetMenuCheckMarkDimensions(VOID);\n  WINUSERAPI WINBOOL WINAPI TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT *prcRect);\n\n#define MNC_IGNORE 0\n#define MNC_CLOSE 1\n#define MNC_EXECUTE 2\n#define MNC_SELECT 3\n\n  typedef struct tagTPMPARAMS {\n    UINT cbSize;\n    RECT rcExclude;\n  } TPMPARAMS;\n\n  typedef TPMPARAMS *LPTPMPARAMS;\n\n  WINUSERAPI WINBOOL WINAPI TrackPopupMenuEx(HMENU,UINT,int,int,HWND,LPTPMPARAMS);\n\n#define MNS_NOCHECK 0x80000000\n#define MNS_MODELESS 0x40000000\n#define MNS_DRAGDROP 0x20000000\n#define MNS_AUTODISMISS 0x10000000\n#define MNS_NOTIFYBYPOS 0x08000000\n#define MNS_CHECKORBMP 0x04000000\n\n#define MIM_MAXHEIGHT 0x00000001\n#define MIM_BACKGROUND 0x00000002\n#define MIM_HELPID 0x00000004\n#define MIM_MENUDATA 0x00000008\n#define MIM_STYLE 0x00000010\n#define MIM_APPLYTOSUBMENUS 0x80000000\n\n  typedef struct tagMENUINFO {\n    DWORD cbSize;\n    DWORD fMask;\n    DWORD dwStyle;\n    UINT cyMax;\n    HBRUSH hbrBack;\n    DWORD dwContextHelpID;\n    ULONG_PTR dwMenuData;\n  } MENUINFO,*LPMENUINFO;\n\n  typedef MENUINFO CONST *LPCMENUINFO;\n\n  WINUSERAPI WINBOOL WINAPI GetMenuInfo(HMENU,LPMENUINFO);\n  WINUSERAPI WINBOOL WINAPI SetMenuInfo(HMENU,LPCMENUINFO);\n  WINUSERAPI WINBOOL WINAPI EndMenu(VOID);\n\n#define MND_CONTINUE 0\n#define MND_ENDMENU 1\n\n  typedef struct tagMENUGETOBJECTINFO {\n    DWORD dwFlags;\n    UINT uPos;\n    HMENU hmenu;\n    PVOID riid;\n    PVOID pvObj;\n  } MENUGETOBJECTINFO,*PMENUGETOBJECTINFO;\n\n#define MNGOF_TOPGAP 0x00000001\n#define MNGOF_BOTTOMGAP 0x00000002\n\n#define MNGO_NOINTERFACE 0x00000000\n#define MNGO_NOERROR 0x00000001\n\n#define MIIM_STATE 0x00000001\n#define MIIM_ID 0x00000002\n#define MIIM_SUBMENU 0x00000004\n#define MIIM_CHECKMARKS 0x00000008\n#define MIIM_TYPE 0x00000010\n#define MIIM_DATA 0x00000020\n\n#define MIIM_STRING 0x00000040\n#define MIIM_BITMAP 0x00000080\n#define MIIM_FTYPE 0x00000100\n\n#define HBMMENU_CALLBACK ((HBITMAP) -1)\n#define HBMMENU_SYSTEM ((HBITMAP) 1)\n#define HBMMENU_MBAR_RESTORE ((HBITMAP) 2)\n#define HBMMENU_MBAR_MINIMIZE ((HBITMAP) 3)\n#define HBMMENU_MBAR_CLOSE ((HBITMAP) 5)\n#define HBMMENU_MBAR_CLOSE_D ((HBITMAP) 6)\n#define HBMMENU_MBAR_MINIMIZE_D ((HBITMAP) 7)\n#define HBMMENU_POPUP_CLOSE ((HBITMAP) 8)\n#define HBMMENU_POPUP_RESTORE ((HBITMAP) 9)\n#define HBMMENU_POPUP_MAXIMIZE ((HBITMAP) 10)\n#define HBMMENU_POPUP_MINIMIZE ((HBITMAP) 11)\n\n  typedef struct tagMENUITEMINFOA {\n    UINT cbSize;\n    UINT fMask;\n    UINT fType;\n    UINT fState;\n    UINT wID;\n    HMENU hSubMenu;\n    HBITMAP hbmpChecked;\n    HBITMAP hbmpUnchecked;\n    ULONG_PTR dwItemData;\n    LPSTR dwTypeData;\n    UINT cch;\n    HBITMAP hbmpItem;\n  } MENUITEMINFOA,*LPMENUITEMINFOA;\n\n  typedef struct tagMENUITEMINFOW {\n    UINT cbSize;\n    UINT fMask;\n    UINT fType;\n    UINT fState;\n    UINT wID;\n    HMENU hSubMenu;\n    HBITMAP hbmpChecked;\n    HBITMAP hbmpUnchecked;\n    ULONG_PTR dwItemData;\n    LPWSTR dwTypeData;\n    UINT cch;\n    HBITMAP hbmpItem;\n  } MENUITEMINFOW,*LPMENUITEMINFOW;\n\n#ifdef UNICODE\n  typedef MENUITEMINFOW MENUITEMINFO;\n  typedef LPMENUITEMINFOW LPMENUITEMINFO;\n#else\n  typedef MENUITEMINFOA MENUITEMINFO;\n  typedef LPMENUITEMINFOA LPMENUITEMINFO;\n#endif\n  typedef MENUITEMINFOA CONST *LPCMENUITEMINFOA;\n  typedef MENUITEMINFOW CONST *LPCMENUITEMINFOW;\n#ifdef UNICODE\n  typedef LPCMENUITEMINFOW LPCMENUITEMINFO;\n#else\n  typedef LPCMENUITEMINFOA LPCMENUITEMINFO;\n#endif\n\n#ifdef UNICODE\n#define InsertMenuItem InsertMenuItemW\n#define GetMenuItemInfo GetMenuItemInfoW\n#define SetMenuItemInfo SetMenuItemInfoW\n#else\n#define InsertMenuItem InsertMenuItemA\n#define GetMenuItemInfo GetMenuItemInfoA\n#define SetMenuItemInfo SetMenuItemInfoA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI InsertMenuItemA(HMENU hmenu,UINT item,WINBOOL fByPosition,LPCMENUITEMINFOA lpmi);\n  WINUSERAPI WINBOOL WINAPI InsertMenuItemW(HMENU hmenu,UINT item,WINBOOL fByPosition,LPCMENUITEMINFOW lpmi);\n  WINUSERAPI WINBOOL WINAPI GetMenuItemInfoA(HMENU hmenu,UINT item,WINBOOL fByPosition,LPMENUITEMINFOA lpmii);\n  WINUSERAPI WINBOOL WINAPI GetMenuItemInfoW(HMENU hmenu,UINT item,WINBOOL fByPosition,LPMENUITEMINFOW lpmii);\n  WINUSERAPI WINBOOL WINAPI SetMenuItemInfoA(HMENU hmenu,UINT item,WINBOOL fByPositon,LPCMENUITEMINFOA lpmii);\n  WINUSERAPI WINBOOL WINAPI SetMenuItemInfoW(HMENU hmenu,UINT item,WINBOOL fByPositon,LPCMENUITEMINFOW lpmii);\n\n#define GMDI_USEDISABLED 0x0001L\n#define GMDI_GOINTOPOPUPS 0x0002L\n\n  WINUSERAPI UINT WINAPI GetMenuDefaultItem(HMENU hMenu,UINT fByPos,UINT gmdiFlags);\n  WINUSERAPI WINBOOL WINAPI SetMenuDefaultItem(HMENU hMenu,UINT uItem,UINT fByPos);\n  WINUSERAPI WINBOOL WINAPI GetMenuItemRect(HWND hWnd,HMENU hMenu,UINT uItem,LPRECT lprcItem);\n  WINUSERAPI int WINAPI MenuItemFromPoint(HWND hWnd,HMENU hMenu,POINT ptScreen);\n\n#define TPM_LEFTBUTTON 0x0000L\n#define TPM_RIGHTBUTTON 0x0002L\n#define TPM_LEFTALIGN 0x0000L\n#define TPM_CENTERALIGN 0x0004L\n#define TPM_RIGHTALIGN 0x0008L\n#define TPM_TOPALIGN 0x0000L\n#define TPM_VCENTERALIGN 0x0010L\n#define TPM_BOTTOMALIGN 0x0020L\n\n#define TPM_HORIZONTAL 0x0000L\n#define TPM_VERTICAL 0x0040L\n#define TPM_NONOTIFY 0x0080L\n#define TPM_RETURNCMD 0x0100L\n#define TPM_RECURSE 0x0001L\n#define TPM_HORPOSANIMATION 0x0400L\n#define TPM_HORNEGANIMATION 0x0800L\n#define TPM_VERPOSANIMATION 0x1000L\n#define TPM_VERNEGANIMATION 0x2000L\n#define TPM_NOANIMATION 0x4000L\n#define TPM_LAYOUTRTL 0x8000L\n#endif\n\n  typedef struct tagDROPSTRUCT {\n    HWND hwndSource;\n    HWND hwndSink;\n    DWORD wFmt;\n    ULONG_PTR dwData;\n    POINT ptDrop;\n    DWORD dwControlData;\n  } DROPSTRUCT,*PDROPSTRUCT,*LPDROPSTRUCT;\n\n#define DOF_EXECUTABLE 0x8001\n#define DOF_DOCUMENT 0x8002\n#define DOF_DIRECTORY 0x8003\n#define DOF_MULTIPLE 0x8004\n#define DOF_PROGMAN 0x0001\n#define DOF_SHELLDATA 0x0002\n\n#define DO_DROPFILE 0x454C4946L\n#define DO_PRINTFILE 0x544E5250L\n\n  WINUSERAPI DWORD WINAPI DragObject(HWND hwndParent,HWND hwndFrom,UINT fmt,ULONG_PTR data,HCURSOR hcur);\n  WINUSERAPI WINBOOL WINAPI DragDetect(HWND hwnd,POINT pt);\n  WINUSERAPI WINBOOL WINAPI DrawIcon(HDC hDC,int X,int Y,HICON hIcon);\n\n#ifndef NODRAWTEXT\n\n#define DT_TOP 0x00000000\n#define DT_LEFT 0x00000000\n#define DT_CENTER 0x00000001\n#define DT_RIGHT 0x00000002\n#define DT_VCENTER 0x00000004\n#define DT_BOTTOM 0x00000008\n#define DT_WORDBREAK 0x00000010\n#define DT_SINGLELINE 0x00000020\n#define DT_EXPANDTABS 0x00000040\n#define DT_TABSTOP 0x00000080\n#define DT_NOCLIP 0x00000100\n#define DT_EXTERNALLEADING 0x00000200\n#define DT_CALCRECT 0x00000400\n#define DT_NOPREFIX 0x00000800\n#define DT_INTERNAL 0x00001000\n\n#define DT_EDITCONTROL 0x00002000\n#define DT_PATH_ELLIPSIS 0x00004000\n#define DT_END_ELLIPSIS 0x00008000\n#define DT_MODIFYSTRING 0x00010000\n#define DT_RTLREADING 0x00020000\n#define DT_WORD_ELLIPSIS 0x00040000\n#define DT_NOFULLWIDTHCHARBREAK 0x00080000\n#define DT_HIDEPREFIX 0x00100000\n#define DT_PREFIXONLY 0x00200000\n\n  typedef struct tagDRAWTEXTPARAMS {\n    UINT cbSize;\n    int iTabLength;\n    int iLeftMargin;\n    int iRightMargin;\n    UINT uiLengthDrawn;\n  } DRAWTEXTPARAMS,*LPDRAWTEXTPARAMS;\n\n#ifdef UNICODE\n#define DrawText DrawTextW\n#define DrawTextEx DrawTextExW\n#else\n#define DrawText DrawTextA\n#define DrawTextEx DrawTextExA\n#endif\n\n  WINUSERAPI int WINAPI DrawTextA(HDC hdc,LPCSTR lpchText,int cchText,LPRECT lprc,UINT format);\n  WINUSERAPI int WINAPI DrawTextW(HDC hdc,LPCWSTR lpchText,int cchText,LPRECT lprc,UINT format);\n  WINUSERAPI int WINAPI DrawTextExA(HDC hdc,LPSTR lpchText,int cchText,LPRECT lprc,UINT format,LPDRAWTEXTPARAMS lpdtp);\n  WINUSERAPI int WINAPI DrawTextExW(HDC hdc,LPWSTR lpchText,int cchText,LPRECT lprc,UINT format,LPDRAWTEXTPARAMS lpdtp);\n#endif\n\n#ifdef UNICODE\n#define GrayString GrayStringW\n#define DrawState DrawStateW\n#define TabbedTextOut TabbedTextOutW\n#define GetTabbedTextExtent GetTabbedTextExtentW\n#else\n#define GrayString GrayStringA\n#define DrawState DrawStateA\n#define TabbedTextOut TabbedTextOutA\n#define GetTabbedTextExtent GetTabbedTextExtentA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GrayStringA(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight);\n  WINUSERAPI WINBOOL WINAPI GrayStringW(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight);\n\n#define DST_COMPLEX 0x0000\n#define DST_TEXT 0x0001\n#define DST_PREFIXTEXT 0x0002\n#define DST_ICON 0x0003\n#define DST_BITMAP 0x0004\n\n#define DSS_NORMAL 0x0000\n#define DSS_UNION 0x0010\n#define DSS_DISABLED 0x0020\n#define DSS_MONO 0x0080\n#define DSS_HIDEPREFIX 0x0200\n#define DSS_PREFIXONLY 0x0400\n#define DSS_RIGHT 0x8000\n\n  WINUSERAPI WINBOOL WINAPI DrawStateA(HDC hdc,HBRUSH hbrFore,DRAWSTATEPROC qfnCallBack,LPARAM lData,WPARAM wData,int x,int y,int cx,int cy,UINT uFlags);\n  WINUSERAPI WINBOOL WINAPI DrawStateW(HDC hdc,HBRUSH hbrFore,DRAWSTATEPROC qfnCallBack,LPARAM lData,WPARAM wData,int x,int y,int cx,int cy,UINT uFlags);\n  WINUSERAPI LONG WINAPI TabbedTextOutA(HDC hdc,int x,int y,LPCSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions,int nTabOrigin);\n  WINUSERAPI LONG WINAPI TabbedTextOutW(HDC hdc,int x,int y,LPCWSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions,int nTabOrigin);\n  WINUSERAPI DWORD WINAPI GetTabbedTextExtentA(HDC hdc,LPCSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions);\n  WINUSERAPI DWORD WINAPI GetTabbedTextExtentW(HDC hdc,LPCWSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions);\n  WINUSERAPI WINBOOL WINAPI UpdateWindow(HWND hWnd);\n  WINUSERAPI HWND WINAPI SetActiveWindow(HWND hWnd);\n  WINUSERAPI HWND WINAPI GetForegroundWindow(VOID);\n  WINUSERAPI WINBOOL WINAPI PaintDesktop(HDC hdc);\n  WINUSERAPI VOID WINAPI SwitchToThisWindow(HWND hwnd,WINBOOL fUnknown);\n  WINUSERAPI WINBOOL WINAPI SetForegroundWindow(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI AllowSetForegroundWindow(DWORD dwProcessId);\n\n#define ASFW_ANY ((DWORD)-1)\n\n  WINUSERAPI WINBOOL WINAPI LockSetForegroundWindow(UINT uLockCode);\n\n#define LSFW_LOCK 1\n#define LSFW_UNLOCK 2\n\n  WINUSERAPI HWND WINAPI WindowFromDC(HDC hDC);\n  WINUSERAPI HDC WINAPI GetDC(HWND hWnd);\n  WINUSERAPI HDC WINAPI GetDCEx(HWND hWnd,HRGN hrgnClip,DWORD flags);\n\n#define DCX_WINDOW 0x00000001L\n#define DCX_CACHE 0x00000002L\n#define DCX_NORESETATTRS 0x00000004L\n#define DCX_CLIPCHILDREN 0x00000008L\n#define DCX_CLIPSIBLINGS 0x00000010L\n#define DCX_PARENTCLIP 0x00000020L\n#define DCX_EXCLUDERGN 0x00000040L\n#define DCX_INTERSECTRGN 0x00000080L\n#define DCX_EXCLUDEUPDATE 0x00000100L\n#define DCX_INTERSECTUPDATE 0x00000200L\n#define DCX_LOCKWINDOWUPDATE 0x00000400L\n\n#define DCX_VALIDATE 0x00200000L\n\n  WINUSERAPI HDC WINAPI GetWindowDC(HWND hWnd);\n  WINUSERAPI int WINAPI ReleaseDC(HWND hWnd,HDC hDC);\n  WINUSERAPI HDC WINAPI BeginPaint(HWND hWnd,LPPAINTSTRUCT lpPaint);\n  WINUSERAPI WINBOOL WINAPI EndPaint(HWND hWnd,CONST PAINTSTRUCT *lpPaint);\n  WINUSERAPI WINBOOL WINAPI GetUpdateRect(HWND hWnd,LPRECT lpRect,WINBOOL bErase);\n  WINUSERAPI int WINAPI GetUpdateRgn(HWND hWnd,HRGN hRgn,WINBOOL bErase);\n  WINUSERAPI int WINAPI SetWindowRgn(HWND hWnd,HRGN hRgn,WINBOOL bRedraw);\n  WINUSERAPI int WINAPI GetWindowRgn(HWND hWnd,HRGN hRgn);\n  WINUSERAPI int WINAPI GetWindowRgnBox(HWND hWnd,LPRECT lprc);\n  WINUSERAPI int WINAPI ExcludeUpdateRgn(HDC hDC,HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI InvalidateRect(HWND hWnd,CONST RECT *lpRect,WINBOOL bErase);\n  WINUSERAPI WINBOOL WINAPI ValidateRect(HWND hWnd,CONST RECT *lpRect);\n  WINUSERAPI WINBOOL WINAPI InvalidateRgn(HWND hWnd,HRGN hRgn,WINBOOL bErase);\n  WINUSERAPI WINBOOL WINAPI ValidateRgn(HWND hWnd,HRGN hRgn);\n  WINUSERAPI WINBOOL WINAPI RedrawWindow(HWND hWnd,CONST RECT *lprcUpdate,HRGN hrgnUpdate,UINT flags);\n\n#define RDW_INVALIDATE 0x0001\n#define RDW_INTERNALPAINT 0x0002\n#define RDW_ERASE 0x0004\n\n#define RDW_VALIDATE 0x0008\n#define RDW_NOINTERNALPAINT 0x0010\n#define RDW_NOERASE 0x0020\n\n#define RDW_NOCHILDREN 0x0040\n#define RDW_ALLCHILDREN 0x0080\n\n#define RDW_UPDATENOW 0x0100\n#define RDW_ERASENOW 0x0200\n\n#define RDW_FRAME 0x0400\n#define RDW_NOFRAME 0x0800\n\n  WINUSERAPI WINBOOL WINAPI LockWindowUpdate(HWND hWndLock);\n  WINUSERAPI WINBOOL WINAPI ScrollWindow(HWND hWnd,int XAmount,int YAmount,CONST RECT *lpRect,CONST RECT *lpClipRect);\n  WINUSERAPI WINBOOL WINAPI ScrollDC(HDC hDC,int dx,int dy,CONST RECT *lprcScroll,CONST RECT *lprcClip,HRGN hrgnUpdate,LPRECT lprcUpdate);\n  WINUSERAPI int WINAPI ScrollWindowEx(HWND hWnd,int dx,int dy,CONST RECT *prcScroll,CONST RECT *prcClip,HRGN hrgnUpdate,LPRECT prcUpdate,UINT flags);\n\n#define SW_SCROLLCHILDREN 0x0001\n#define SW_INVALIDATE 0x0002\n#define SW_ERASE 0x0004\n#define SW_SMOOTHSCROLL 0x0010\n\n#ifndef NOSCROLL\n  WINUSERAPI int WINAPI SetScrollPos(HWND hWnd,int nBar,int nPos,WINBOOL bRedraw);\n  WINUSERAPI int WINAPI GetScrollPos(HWND hWnd,int nBar);\n  WINUSERAPI WINBOOL WINAPI SetScrollRange(HWND hWnd,int nBar,int nMinPos,int nMaxPos,WINBOOL bRedraw);\n  WINUSERAPI WINBOOL WINAPI GetScrollRange(HWND hWnd,int nBar,LPINT lpMinPos,LPINT lpMaxPos);\n  WINUSERAPI WINBOOL WINAPI ShowScrollBar(HWND hWnd,int wBar,WINBOOL bShow);\n  WINUSERAPI WINBOOL WINAPI EnableScrollBar(HWND hWnd,UINT wSBflags,UINT wArrows);\n\n#define ESB_ENABLE_BOTH 0x0000\n#define ESB_DISABLE_BOTH 0x0003\n\n#define ESB_DISABLE_LEFT 0x0001\n#define ESB_DISABLE_RIGHT 0x0002\n\n#define ESB_DISABLE_UP 0x0001\n#define ESB_DISABLE_DOWN 0x0002\n\n#define ESB_DISABLE_LTUP ESB_DISABLE_LEFT\n#define ESB_DISABLE_RTDN ESB_DISABLE_RIGHT\n#endif\n\n#ifdef UNICODE\n#define SetProp SetPropW\n#define GetProp GetPropW\n#define RemoveProp RemovePropW\n#define EnumPropsEx EnumPropsExW\n#define EnumProps EnumPropsW\n#define SetWindowText SetWindowTextW\n#define GetWindowText GetWindowTextW\n#define GetWindowTextLength GetWindowTextLengthW\n#else\n#define SetProp SetPropA\n#define GetProp GetPropA\n#define RemoveProp RemovePropA\n#define EnumPropsEx EnumPropsExA\n#define EnumProps EnumPropsA\n#define SetWindowText SetWindowTextA\n#define GetWindowText GetWindowTextA\n#define GetWindowTextLength GetWindowTextLengthA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI SetPropA(HWND hWnd,LPCSTR lpString,HANDLE hData);\n  WINUSERAPI WINBOOL WINAPI SetPropW(HWND hWnd,LPCWSTR lpString,HANDLE hData);\n  WINUSERAPI HANDLE WINAPI GetPropA(HWND hWnd,LPCSTR lpString);\n  WINUSERAPI HANDLE WINAPI GetPropW(HWND hWnd,LPCWSTR lpString);\n  WINUSERAPI HANDLE WINAPI RemovePropA(HWND hWnd,LPCSTR lpString);\n  WINUSERAPI HANDLE WINAPI RemovePropW(HWND hWnd,LPCWSTR lpString);\n  WINUSERAPI int WINAPI EnumPropsExA(HWND hWnd,PROPENUMPROCEXA lpEnumFunc,LPARAM lParam);\n  WINUSERAPI int WINAPI EnumPropsExW(HWND hWnd,PROPENUMPROCEXW lpEnumFunc,LPARAM lParam);\n  WINUSERAPI int WINAPI EnumPropsA(HWND hWnd,PROPENUMPROCA lpEnumFunc);\n  WINUSERAPI int WINAPI EnumPropsW(HWND hWnd,PROPENUMPROCW lpEnumFunc);\n  WINUSERAPI WINBOOL WINAPI SetWindowTextA(HWND hWnd,LPCSTR lpString);\n  WINUSERAPI WINBOOL WINAPI SetWindowTextW(HWND hWnd,LPCWSTR lpString);\n  WINUSERAPI int WINAPI GetWindowTextA(HWND hWnd,LPSTR lpString,int nMaxCount);\n  WINUSERAPI int WINAPI GetWindowTextW(HWND hWnd,LPWSTR lpString,int nMaxCount);\n  WINUSERAPI int WINAPI GetWindowTextLengthA(HWND hWnd);\n  WINUSERAPI int WINAPI GetWindowTextLengthW(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI GetClientRect(HWND hWnd,LPRECT lpRect);\n  WINUSERAPI WINBOOL WINAPI GetWindowRect(HWND hWnd,LPRECT lpRect);\n  WINUSERAPI WINBOOL WINAPI AdjustWindowRect(LPRECT lpRect,DWORD dwStyle,WINBOOL bMenu);\n  WINUSERAPI WINBOOL WINAPI AdjustWindowRectEx(LPRECT lpRect,DWORD dwStyle,WINBOOL bMenu,DWORD dwExStyle);\n\n#define HELPINFO_WINDOW 0x0001\n#define HELPINFO_MENUITEM 0x0002\n\n  typedef struct tagHELPINFO {\n    UINT cbSize;\n    int iContextType;\n    int iCtrlId;\n    HANDLE hItemHandle;\n    DWORD_PTR dwContextId;\n    POINT MousePos;\n  } HELPINFO,*LPHELPINFO;\n\n  WINUSERAPI WINBOOL WINAPI SetWindowContextHelpId(HWND,DWORD);\n  WINUSERAPI DWORD WINAPI GetWindowContextHelpId(HWND);\n  WINUSERAPI WINBOOL WINAPI SetMenuContextHelpId(HMENU,DWORD);\n  WINUSERAPI DWORD WINAPI GetMenuContextHelpId(HMENU);\n\n#ifndef NOMB\n\n#define MB_OK 0x00000000L\n#define MB_OKCANCEL 0x00000001L\n#define MB_ABORTRETRYIGNORE 0x00000002L\n#define MB_YESNOCANCEL 0x00000003L\n#define MB_YESNO 0x00000004L\n#define MB_RETRYCANCEL 0x00000005L\n#define MB_CANCELTRYCONTINUE 0x00000006L\n#define MB_ICONHAND 0x00000010L\n#define MB_ICONQUESTION 0x00000020L\n#define MB_ICONEXCLAMATION 0x00000030L\n#define MB_ICONASTERISK 0x00000040L\n#define MB_USERICON 0x00000080L\n#define MB_ICONWARNING MB_ICONEXCLAMATION\n#define MB_ICONERROR MB_ICONHAND\n#define MB_ICONINFORMATION MB_ICONASTERISK\n#define MB_ICONSTOP MB_ICONHAND\n#define MB_DEFBUTTON1 0x00000000L\n#define MB_DEFBUTTON2 0x00000100L\n#define MB_DEFBUTTON3 0x00000200L\n#define MB_DEFBUTTON4 0x00000300L\n#define MB_APPLMODAL 0x00000000L\n#define MB_SYSTEMMODAL 0x00001000L\n#define MB_TASKMODAL 0x00002000L\n#define MB_HELP 0x00004000L\n#define MB_NOFOCUS 0x00008000L\n#define MB_SETFOREGROUND 0x00010000L\n#define MB_DEFAULT_DESKTOP_ONLY 0x00020000L\n#define MB_TOPMOST 0x00040000L\n#define MB_RIGHT 0x00080000L\n#define MB_RTLREADING 0x00100000L\n#define MB_SERVICE_NOTIFICATION 0x00200000L\n#define MB_SERVICE_NOTIFICATION_NT3X 0x00040000L\n#define MB_TYPEMASK 0x0000000FL\n#define MB_ICONMASK 0x000000F0L\n#define MB_DEFMASK 0x00000F00L\n#define MB_MODEMASK 0x00003000L\n#define MB_MISCMASK 0x0000C000L\n\n#ifdef UNICODE\n#define MessageBox MessageBoxW\n#define MessageBoxEx MessageBoxExW\n#else\n#define MessageBox MessageBoxA\n#define MessageBoxEx MessageBoxExA\n#endif\n\n  WINUSERAPI int WINAPI MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);\n  WINUSERAPI int WINAPI MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);\n  WINUSERAPI int WINAPI MessageBoxExA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType,WORD wLanguageId);\n  WINUSERAPI int WINAPI MessageBoxExW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType,WORD wLanguageId);\n\n  typedef VOID (CALLBACK *MSGBOXCALLBACK)(LPHELPINFO lpHelpInfo);\n\n  typedef struct tagMSGBOXPARAMSA {\n    UINT cbSize;\n    HWND hwndOwner;\n    HINSTANCE hInstance;\n    LPCSTR lpszText;\n    LPCSTR lpszCaption;\n    DWORD dwStyle;\n    LPCSTR lpszIcon;\n    DWORD_PTR dwContextHelpId;\n    MSGBOXCALLBACK lpfnMsgBoxCallback;\n    DWORD dwLanguageId;\n  } MSGBOXPARAMSA,*PMSGBOXPARAMSA,*LPMSGBOXPARAMSA;\n\n  typedef struct tagMSGBOXPARAMSW {\n    UINT cbSize;\n    HWND hwndOwner;\n    HINSTANCE hInstance;\n    LPCWSTR lpszText;\n    LPCWSTR lpszCaption;\n    DWORD dwStyle;\n    LPCWSTR lpszIcon;\n    DWORD_PTR dwContextHelpId;\n    MSGBOXCALLBACK lpfnMsgBoxCallback;\n    DWORD dwLanguageId;\n  } MSGBOXPARAMSW,*PMSGBOXPARAMSW,*LPMSGBOXPARAMSW;\n\n#ifdef UNICODE\n  typedef MSGBOXPARAMSW MSGBOXPARAMS;\n  typedef PMSGBOXPARAMSW PMSGBOXPARAMS;\n  typedef LPMSGBOXPARAMSW LPMSGBOXPARAMS;\n#else\n  typedef MSGBOXPARAMSA MSGBOXPARAMS;\n  typedef PMSGBOXPARAMSA PMSGBOXPARAMS;\n  typedef LPMSGBOXPARAMSA LPMSGBOXPARAMS;\n#endif\n\n#ifdef UNICODE\n#define MessageBoxIndirect MessageBoxIndirectW\n#else\n#define MessageBoxIndirect MessageBoxIndirectA\n#endif\n\n  WINUSERAPI int WINAPI MessageBoxIndirectA(CONST MSGBOXPARAMSA *lpmbp);\n  WINUSERAPI int WINAPI MessageBoxIndirectW(CONST MSGBOXPARAMSW *lpmbp);\n  WINUSERAPI WINBOOL WINAPI MessageBeep(UINT uType);\n#endif\n\n  WINUSERAPI int WINAPI ShowCursor(WINBOOL bShow);\n  WINUSERAPI WINBOOL WINAPI SetCursorPos(int X,int Y);\n  WINUSERAPI HCURSOR WINAPI SetCursor(HCURSOR hCursor);\n  WINUSERAPI WINBOOL WINAPI GetCursorPos(LPPOINT lpPoint);\n  WINUSERAPI WINBOOL WINAPI ClipCursor(CONST RECT *lpRect);\n  WINUSERAPI WINBOOL WINAPI GetClipCursor(LPRECT lpRect);\n  WINUSERAPI HCURSOR WINAPI GetCursor(VOID);\n  WINUSERAPI WINBOOL WINAPI CreateCaret(HWND hWnd,HBITMAP hBitmap,int nWidth,int nHeight);\n  WINUSERAPI UINT WINAPI GetCaretBlinkTime(VOID);\n  WINUSERAPI WINBOOL WINAPI SetCaretBlinkTime(UINT uMSeconds);\n  WINUSERAPI WINBOOL WINAPI DestroyCaret(VOID);\n  WINUSERAPI WINBOOL WINAPI HideCaret(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI ShowCaret(HWND hWnd);\n  WINUSERAPI WINBOOL WINAPI SetCaretPos(int X,int Y);\n  WINUSERAPI WINBOOL WINAPI GetCaretPos(LPPOINT lpPoint);\n  WINUSERAPI WINBOOL WINAPI ClientToScreen(HWND hWnd,LPPOINT lpPoint);\n  WINUSERAPI WINBOOL WINAPI ScreenToClient(HWND hWnd,LPPOINT lpPoint);\n  WINUSERAPI int WINAPI MapWindowPoints(HWND hWndFrom,HWND hWndTo,LPPOINT lpPoints,UINT cPoints);\n  WINUSERAPI HWND WINAPI WindowFromPoint(POINT Point);\n  WINUSERAPI HWND WINAPI ChildWindowFromPoint(HWND hWndParent,POINT Point);\n\n#define CWP_ALL 0x0000\n#define CWP_SKIPINVISIBLE 0x0001\n#define CWP_SKIPDISABLED 0x0002\n#define CWP_SKIPTRANSPARENT 0x0004\n\n  WINUSERAPI HWND WINAPI ChildWindowFromPointEx(HWND hwnd,POINT pt,UINT flags);\n\n#ifndef NOCOLOR\n\n#define CTLCOLOR_MSGBOX 0\n#define CTLCOLOR_EDIT 1\n#define CTLCOLOR_LISTBOX 2\n#define CTLCOLOR_BTN 3\n#define CTLCOLOR_DLG 4\n#define CTLCOLOR_SCROLLBAR 5\n#define CTLCOLOR_STATIC 6\n#define CTLCOLOR_MAX 7\n\n#define COLOR_SCROLLBAR 0\n#define COLOR_BACKGROUND 1\n#define COLOR_ACTIVECAPTION 2\n#define COLOR_INACTIVECAPTION 3\n#define COLOR_MENU 4\n#define COLOR_WINDOW 5\n#define COLOR_WINDOWFRAME 6\n#define COLOR_MENUTEXT 7\n#define COLOR_WINDOWTEXT 8\n#define COLOR_CAPTIONTEXT 9\n#define COLOR_ACTIVEBORDER 10\n#define COLOR_INACTIVEBORDER 11\n#define COLOR_APPWORKSPACE 12\n#define COLOR_HIGHLIGHT 13\n#define COLOR_HIGHLIGHTTEXT 14\n#define COLOR_BTNFACE 15\n#define COLOR_BTNSHADOW 16\n#define COLOR_GRAYTEXT 17\n#define COLOR_BTNTEXT 18\n#define COLOR_INACTIVECAPTIONTEXT 19\n#define COLOR_BTNHIGHLIGHT 20\n\n#define COLOR_3DDKSHADOW 21\n#define COLOR_3DLIGHT 22\n#define COLOR_INFOTEXT 23\n#define COLOR_INFOBK 24\n\n#define COLOR_HOTLIGHT 26\n#define COLOR_GRADIENTACTIVECAPTION 27\n#define COLOR_GRADIENTINACTIVECAPTION 28\n#define COLOR_MENUHILIGHT 29\n#define COLOR_MENUBAR 30\n\n#define COLOR_DESKTOP COLOR_BACKGROUND\n#define COLOR_3DFACE COLOR_BTNFACE\n#define COLOR_3DSHADOW COLOR_BTNSHADOW\n#define COLOR_3DHIGHLIGHT COLOR_BTNHIGHLIGHT\n#define COLOR_3DHILIGHT COLOR_BTNHIGHLIGHT\n#define COLOR_BTNHILIGHT COLOR_BTNHIGHLIGHT\n\n  WINUSERAPI DWORD WINAPI GetSysColor(int nIndex);\n  WINUSERAPI HBRUSH WINAPI GetSysColorBrush(int nIndex);\n  WINUSERAPI WINBOOL WINAPI SetSysColors(int cElements,CONST INT *lpaElements,CONST COLORREF *lpaRgbValues);\n#endif\n\n  WINUSERAPI WINBOOL WINAPI DrawFocusRect(HDC hDC,CONST RECT *lprc);\n  WINUSERAPI int WINAPI FillRect(HDC hDC,CONST RECT *lprc,HBRUSH hbr);\n  WINUSERAPI int WINAPI FrameRect(HDC hDC,CONST RECT *lprc,HBRUSH hbr);\n  WINUSERAPI WINBOOL WINAPI InvertRect(HDC hDC,CONST RECT *lprc);\n  WINUSERAPI WINBOOL WINAPI SetRect(LPRECT lprc,int xLeft,int yTop,int xRight,int yBottom);\n  WINUSERAPI WINBOOL WINAPI SetRectEmpty(LPRECT lprc);\n  WINUSERAPI WINBOOL WINAPI CopyRect(LPRECT lprcDst,CONST RECT *lprcSrc);\n  WINUSERAPI WINBOOL WINAPI InflateRect(LPRECT lprc,int dx,int dy);\n  WINUSERAPI WINBOOL WINAPI IntersectRect(LPRECT lprcDst,CONST RECT *lprcSrc1,CONST RECT *lprcSrc2);\n  WINUSERAPI WINBOOL WINAPI UnionRect(LPRECT lprcDst,CONST RECT *lprcSrc1,CONST RECT *lprcSrc2);\n  WINUSERAPI WINBOOL WINAPI SubtractRect(LPRECT lprcDst,CONST RECT *lprcSrc1,CONST RECT *lprcSrc2);\n  WINUSERAPI WINBOOL WINAPI OffsetRect(LPRECT lprc,int dx,int dy);\n  WINUSERAPI WINBOOL WINAPI IsRectEmpty(CONST RECT *lprc);\n  WINUSERAPI WINBOOL WINAPI EqualRect(CONST RECT *lprc1,CONST RECT *lprc2);\n  WINUSERAPI WINBOOL WINAPI PtInRect(CONST RECT *lprc,POINT pt);\n\n#ifndef NOWINOFFSETS\n\n#ifdef UNICODE\n#define GetWindowLong GetWindowLongW\n#define SetWindowLong SetWindowLongW\n#else\n#define GetWindowLong GetWindowLongA\n#define SetWindowLong SetWindowLongA\n#endif\n\n  WINUSERAPI WORD WINAPI GetWindowWord(HWND hWnd,int nIndex);\n  WINUSERAPI WORD WINAPI SetWindowWord(HWND hWnd,int nIndex,WORD wNewWord);\n  WINUSERAPI LONG WINAPI GetWindowLongA(HWND hWnd,int nIndex);\n  WINUSERAPI LONG WINAPI GetWindowLongW(HWND hWnd,int nIndex);\n  WINUSERAPI LONG WINAPI SetWindowLongA(HWND hWnd,int nIndex,LONG dwNewLong);\n  WINUSERAPI LONG WINAPI SetWindowLongW(HWND hWnd,int nIndex,LONG dwNewLong);\n\n#ifdef _WIN64\n\n#ifdef UNICODE\n#define GetWindowLongPtr GetWindowLongPtrW\n#define SetWindowLongPtr SetWindowLongPtrW\n#else\n#define GetWindowLongPtr GetWindowLongPtrA\n#define SetWindowLongPtr SetWindowLongPtrA\n#endif\n\n  WINUSERAPI LONG_PTR WINAPI GetWindowLongPtrA(HWND hWnd,int nIndex);\n  WINUSERAPI LONG_PTR WINAPI GetWindowLongPtrW(HWND hWnd,int nIndex);\n  WINUSERAPI LONG_PTR WINAPI SetWindowLongPtrA(HWND hWnd,int nIndex,LONG_PTR dwNewLong);\n  WINUSERAPI LONG_PTR WINAPI SetWindowLongPtrW(HWND hWnd,int nIndex,LONG_PTR dwNewLong);\n#else\n\n#ifdef UNICODE\n#define GetWindowLongPtr GetWindowLongPtrW\n#define SetWindowLongPtr SetWindowLongPtrW\n#else\n#define GetWindowLongPtr GetWindowLongPtrA\n#define SetWindowLongPtr SetWindowLongPtrA\n#endif\n\n#define GetWindowLongPtrA GetWindowLongA\n#define GetWindowLongPtrW GetWindowLongW\n#define SetWindowLongPtrA SetWindowLongA\n#define SetWindowLongPtrW SetWindowLongW\n#endif\n\n#ifdef UNICODE\n#define GetClassLong GetClassLongW\n#define SetClassLong SetClassLongW\n#else\n#define GetClassLong GetClassLongA\n#define SetClassLong SetClassLongA\n#endif\n\n  WINUSERAPI WORD WINAPI GetClassWord(HWND hWnd,int nIndex);\n  WINUSERAPI WORD WINAPI SetClassWord(HWND hWnd,int nIndex,WORD wNewWord);\n  WINUSERAPI DWORD WINAPI GetClassLongA(HWND hWnd,int nIndex);\n  WINUSERAPI DWORD WINAPI GetClassLongW(HWND hWnd,int nIndex);\n  WINUSERAPI DWORD WINAPI SetClassLongA(HWND hWnd,int nIndex,LONG dwNewLong);\n  WINUSERAPI DWORD WINAPI SetClassLongW(HWND hWnd,int nIndex,LONG dwNewLong);\n\n#ifdef _WIN64\n\n#ifdef UNICODE\n#define GetClassLongPtr GetClassLongPtrW\n#define SetClassLongPtr SetClassLongPtrW\n#else\n#define GetClassLongPtr GetClassLongPtrA\n#define SetClassLongPtr SetClassLongPtrA\n#endif\n\n  WINUSERAPI ULONG_PTR WINAPI GetClassLongPtrA(HWND hWnd,int nIndex);\n  WINUSERAPI ULONG_PTR WINAPI GetClassLongPtrW(HWND hWnd,int nIndex);\n  WINUSERAPI ULONG_PTR WINAPI SetClassLongPtrA(HWND hWnd,int nIndex,LONG_PTR dwNewLong);\n  WINUSERAPI ULONG_PTR WINAPI SetClassLongPtrW(HWND hWnd,int nIndex,LONG_PTR dwNewLong);\n#else\n#ifdef UNICODE\n#define GetClassLongPtr GetClassLongPtrW\n#define SetClassLongPtr SetClassLongPtrW\n#else\n#define GetClassLongPtr GetClassLongPtrA\n#define SetClassLongPtr SetClassLongPtrA\n#endif\n\n#define GetClassLongPtrA GetClassLongA\n#define GetClassLongPtrW GetClassLongW\n#define SetClassLongPtrA SetClassLongA\n#define SetClassLongPtrW SetClassLongW\n#endif\n#endif\n\n#ifdef UNICODE\n#define FindWindow FindWindowW\n#define FindWindowEx FindWindowExW\n#define GetClassName GetClassNameW\n#else\n#define FindWindow FindWindowA\n#define FindWindowEx FindWindowExA\n#define GetClassName GetClassNameA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GetProcessDefaultLayout(DWORD *pdwDefaultLayout);\n  WINUSERAPI WINBOOL WINAPI SetProcessDefaultLayout(DWORD dwDefaultLayout);\n  WINUSERAPI HWND WINAPI GetDesktopWindow(VOID);\n  WINUSERAPI HWND WINAPI GetParent(HWND hWnd);\n  WINUSERAPI HWND WINAPI SetParent(HWND hWndChild,HWND hWndNewParent);\n  WINUSERAPI WINBOOL WINAPI EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc,LPARAM lParam);\n  WINUSERAPI HWND WINAPI FindWindowA(LPCSTR lpClassName,LPCSTR lpWindowName);\n  WINUSERAPI HWND WINAPI FindWindowW(LPCWSTR lpClassName,LPCWSTR lpWindowName);\n  WINUSERAPI HWND WINAPI FindWindowExA(HWND hWndParent,HWND hWndChildAfter,LPCSTR lpszClass,LPCSTR lpszWindow);\n  WINUSERAPI HWND WINAPI FindWindowExW(HWND hWndParent,HWND hWndChildAfter,LPCWSTR lpszClass,LPCWSTR lpszWindow);\n  WINUSERAPI HWND WINAPI GetShellWindow(VOID);\n  WINUSERAPI WINBOOL WINAPI RegisterShellHookWindow(HWND hwnd);\n  WINUSERAPI WINBOOL WINAPI DeregisterShellHookWindow(HWND hwnd);\n  WINUSERAPI WINBOOL WINAPI EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);\n  WINUSERAPI WINBOOL WINAPI EnumThreadWindows(DWORD dwThreadId,WNDENUMPROC lpfn,LPARAM lParam);\n\n#define EnumTaskWindows(hTask,lpfn,lParam) EnumThreadWindows(HandleToUlong(hTask),lpfn,lParam)\n\n  WINUSERAPI int WINAPI GetClassNameA(HWND hWnd,LPSTR lpClassName,int nMaxCount);\n  WINUSERAPI int WINAPI GetClassNameW(HWND hWnd,LPWSTR lpClassName,int nMaxCount);\n  WINUSERAPI HWND WINAPI GetTopWindow(HWND hWnd);\n\n#define GetNextWindow(hWnd,wCmd) GetWindow(hWnd,wCmd)\n#define GetSysModalWindow() (NULL)\n#define SetSysModalWindow(hWnd) (NULL)\n\n  WINUSERAPI DWORD WINAPI GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId);\n  WINUSERAPI WINBOOL WINAPI IsGUIThread(WINBOOL bConvert);\n\n#define GetWindowTask(hWnd) ((HANDLE)(DWORD_PTR)GetWindowThreadProcessId(hWnd,NULL))\n\n  WINUSERAPI HWND WINAPI GetLastActivePopup(HWND hWnd);\n\n#define GW_HWNDFIRST 0\n#define GW_HWNDLAST 1\n#define GW_HWNDNEXT 2\n#define GW_HWNDPREV 3\n#define GW_OWNER 4\n#define GW_CHILD 5\n#define GW_ENABLEDPOPUP 6\n#define GW_MAX 6\n\n  WINUSERAPI HWND WINAPI GetWindow(HWND hWnd,UINT uCmd);\n\n#ifndef NOWH\n\n#ifdef UNICODE\n#define SetWindowsHook SetWindowsHookW\n#define SetWindowsHookEx SetWindowsHookExW\n#else\n#define SetWindowsHook SetWindowsHookA\n#define SetWindowsHookEx SetWindowsHookExA\n#endif\n\n  WINUSERAPI HHOOK WINAPI SetWindowsHookA(int nFilterType,HOOKPROC pfnFilterProc);\n  WINUSERAPI HHOOK WINAPI SetWindowsHookW(int nFilterType,HOOKPROC pfnFilterProc);\n  WINUSERAPI WINBOOL WINAPI UnhookWindowsHook(int nCode,HOOKPROC pfnFilterProc);\n  WINUSERAPI HHOOK WINAPI SetWindowsHookExA(int idHook,HOOKPROC lpfn,HINSTANCE hmod,DWORD dwThreadId);\n  WINUSERAPI HHOOK WINAPI SetWindowsHookExW(int idHook,HOOKPROC lpfn,HINSTANCE hmod,DWORD dwThreadId);\n  WINUSERAPI WINBOOL WINAPI UnhookWindowsHookEx(HHOOK hhk);\n  WINUSERAPI LRESULT WINAPI CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam);\n#define DefHookProc(nCode,wParam,lParam,phhk) CallNextHookEx(*phhk,nCode,wParam,lParam)\n#endif\n\n#ifndef NOMENUS\n\n#define MF_INSERT 0x00000000L\n#define MF_CHANGE 0x00000080L\n#define MF_APPEND 0x00000100L\n#define MF_DELETE 0x00000200L\n#define MF_REMOVE 0x00001000L\n#define MF_BYCOMMAND 0x00000000L\n#define MF_BYPOSITION 0x00000400L\n#define MF_SEPARATOR 0x00000800L\n#define MF_ENABLED 0x00000000L\n#define MF_GRAYED 0x00000001L\n#define MF_DISABLED 0x00000002L\n#define MF_UNCHECKED 0x00000000L\n#define MF_CHECKED 0x00000008L\n#define MF_USECHECKBITMAPS 0x00000200L\n#define MF_STRING 0x00000000L\n#define MF_BITMAP 0x00000004L\n#define MF_OWNERDRAW 0x00000100L\n#define MF_POPUP 0x00000010L\n#define MF_MENUBARBREAK 0x00000020L\n#define MF_MENUBREAK 0x00000040L\n#define MF_UNHILITE 0x00000000L\n#define MF_HILITE 0x00000080L\n#define MF_DEFAULT 0x00001000L\n#define MF_SYSMENU 0x00002000L\n#define MF_HELP 0x00004000L\n#define MF_RIGHTJUSTIFY 0x00004000L\n#define MF_MOUSESELECT 0x00008000L\n#define MF_END 0x00000080L\n\n#define MFT_STRING MF_STRING\n#define MFT_BITMAP MF_BITMAP\n#define MFT_MENUBARBREAK MF_MENUBARBREAK\n#define MFT_MENUBREAK MF_MENUBREAK\n#define MFT_OWNERDRAW MF_OWNERDRAW\n#define MFT_RADIOCHECK 0x00000200L\n#define MFT_SEPARATOR MF_SEPARATOR\n#define MFT_RIGHTORDER 0x00002000L\n#define MFT_RIGHTJUSTIFY MF_RIGHTJUSTIFY\n\n#define MFS_GRAYED 0x00000003L\n#define MFS_DISABLED MFS_GRAYED\n#define MFS_CHECKED MF_CHECKED\n#define MFS_HILITE MF_HILITE\n#define MFS_ENABLED MF_ENABLED\n#define MFS_UNCHECKED MF_UNCHECKED\n#define MFS_UNHILITE MF_UNHILITE\n#define MFS_DEFAULT MF_DEFAULT\n\n  WINUSERAPI WINBOOL WINAPI CheckMenuRadioItem(HMENU hmenu,UINT first,UINT last,UINT check,UINT flags);\n\n  typedef struct {\n    WORD versionNumber;\n    WORD offset;\n  } MENUITEMTEMPLATEHEADER,*PMENUITEMTEMPLATEHEADER;\n\n  typedef struct {\n    WORD mtOption;\n    WORD mtID;\n    WCHAR mtString[1];\n  } MENUITEMTEMPLATE,*PMENUITEMTEMPLATE;\n#define MF_END 0x00000080L\n#endif\n\n#ifndef NOSYSCOMMANDS\n\n#define SC_SIZE 0xF000\n#define SC_MOVE 0xF010\n#define SC_MINIMIZE 0xF020\n#define SC_MAXIMIZE 0xF030\n#define SC_NEXTWINDOW 0xF040\n#define SC_PREVWINDOW 0xF050\n#define SC_CLOSE 0xF060\n#define SC_VSCROLL 0xF070\n#define SC_HSCROLL 0xF080\n#define SC_MOUSEMENU 0xF090\n#define SC_KEYMENU 0xF100\n#define SC_ARRANGE 0xF110\n#define SC_RESTORE 0xF120\n#define SC_TASKLIST 0xF130\n#define SC_SCREENSAVE 0xF140\n#define SC_HOTKEY 0xF150\n#define SC_DEFAULT 0xF160\n#define SC_MONITORPOWER 0xF170\n#define SC_CONTEXTHELP 0xF180\n#define SC_SEPARATOR 0xF00F\n#define SC_ICON SC_MINIMIZE\n#define SC_ZOOM SC_MAXIMIZE\n#endif\n\n#ifdef UNICODE\n#define LoadBitmap LoadBitmapW\n#define LoadCursor LoadCursorW\n#define LoadCursorFromFile LoadCursorFromFileW\n#else\n#define LoadBitmap LoadBitmapA\n#define LoadCursor LoadCursorA\n#define LoadCursorFromFile LoadCursorFromFileA\n#endif\n\n  WINUSERAPI HBITMAP WINAPI LoadBitmapA(HINSTANCE hInstance,LPCSTR lpBitmapName);\n  WINUSERAPI HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);\n  WINUSERAPI HCURSOR WINAPI LoadCursorA(HINSTANCE hInstance,LPCSTR lpCursorName);\n  WINUSERAPI HCURSOR WINAPI LoadCursorW(HINSTANCE hInstance,LPCWSTR lpCursorName);\n  WINUSERAPI HCURSOR WINAPI LoadCursorFromFileA(LPCSTR lpFileName);\n  WINUSERAPI HCURSOR WINAPI LoadCursorFromFileW(LPCWSTR lpFileName);\n  WINUSERAPI HCURSOR WINAPI CreateCursor(HINSTANCE hInst,int xHotSpot,int yHotSpot,int nWidth,int nHeight,CONST VOID *pvANDPlane,CONST VOID *pvXORPlane);\n  WINUSERAPI WINBOOL WINAPI DestroyCursor(HCURSOR hCursor);\n\n#define CopyCursor(pcur) ((HCURSOR)CopyIcon((HICON)(pcur)))\n\n#define IDC_ARROW MAKEINTRESOURCE(32512)\n#define IDC_IBEAM MAKEINTRESOURCE(32513)\n#define IDC_WAIT MAKEINTRESOURCE(32514)\n#define IDC_CROSS MAKEINTRESOURCE(32515)\n#define IDC_UPARROW MAKEINTRESOURCE(32516)\n#define IDC_SIZE MAKEINTRESOURCE(32640)\n#define IDC_ICON MAKEINTRESOURCE(32641)\n#define IDC_SIZENWSE MAKEINTRESOURCE(32642)\n#define IDC_SIZENESW MAKEINTRESOURCE(32643)\n#define IDC_SIZEWE MAKEINTRESOURCE(32644)\n#define IDC_SIZENS MAKEINTRESOURCE(32645)\n#define IDC_SIZEALL MAKEINTRESOURCE(32646)\n#define IDC_NO MAKEINTRESOURCE(32648)\n#define IDC_HAND MAKEINTRESOURCE(32649)\n#define IDC_APPSTARTING MAKEINTRESOURCE(32650)\n#define IDC_HELP MAKEINTRESOURCE(32651)\n\n  WINUSERAPI WINBOOL WINAPI SetSystemCursor(HCURSOR hcur,DWORD id);\n\n  typedef struct _ICONINFO {\n    WINBOOL fIcon;\n    DWORD xHotspot;\n    DWORD yHotspot;\n    HBITMAP hbmMask;\n    HBITMAP hbmColor;\n  } ICONINFO;\n  typedef ICONINFO *PICONINFO;\n\n#ifdef UNICODE\n#define LoadIcon LoadIconW\n#define PrivateExtractIcons PrivateExtractIconsW\n#else\n#define LoadIcon LoadIconA\n#define PrivateExtractIcons PrivateExtractIconsA\n#endif\n\n  WINUSERAPI HICON WINAPI LoadIconA(HINSTANCE hInstance,LPCSTR lpIconName);\n  WINUSERAPI HICON WINAPI LoadIconW(HINSTANCE hInstance,LPCWSTR lpIconName);\n  WINUSERAPI UINT WINAPI PrivateExtractIconsA(LPCSTR szFileName,int nIconIndex,int cxIcon,int cyIcon,HICON *phicon,UINT *piconid,UINT nIcons,UINT flags);\n  WINUSERAPI UINT WINAPI PrivateExtractIconsW(LPCWSTR szFileName,int nIconIndex,int cxIcon,int cyIcon,HICON *phicon,UINT *piconid,UINT nIcons,UINT flags);\n  WINUSERAPI HICON WINAPI CreateIcon(HINSTANCE hInstance,int nWidth,int nHeight,BYTE cPlanes,BYTE cBitsPixel,CONST BYTE *lpbANDbits,CONST BYTE *lpbXORbits);\n  WINUSERAPI WINBOOL WINAPI DestroyIcon(HICON hIcon);\n  WINUSERAPI int WINAPI LookupIconIdFromDirectory(PBYTE presbits,WINBOOL fIcon);\n  WINUSERAPI int WINAPI LookupIconIdFromDirectoryEx(PBYTE presbits,WINBOOL fIcon,int cxDesired,int cyDesired,UINT Flags);\n  WINUSERAPI HICON WINAPI CreateIconFromResource(PBYTE presbits,DWORD dwResSize,WINBOOL fIcon,DWORD dwVer);\n  WINUSERAPI HICON WINAPI CreateIconFromResourceEx(PBYTE presbits,DWORD dwResSize,WINBOOL fIcon,DWORD dwVer,int cxDesired,int cyDesired,UINT Flags);\n\n  typedef struct tagCURSORSHAPE {\n    int xHotSpot;\n    int yHotSpot;\n    int cx;\n    int cy;\n    int cbWidth;\n    BYTE Planes;\n    BYTE BitsPixel;\n  } CURSORSHAPE,*LPCURSORSHAPE;\n\n#define IMAGE_BITMAP 0\n#define IMAGE_ICON 1\n#define IMAGE_CURSOR 2\n#define IMAGE_ENHMETAFILE 3\n\n#define LR_DEFAULTCOLOR 0x0000\n#define LR_MONOCHROME 0x0001\n#define LR_COLOR 0x0002\n#define LR_COPYRETURNORG 0x0004\n#define LR_COPYDELETEORG 0x0008\n#define LR_LOADFROMFILE 0x0010\n#define LR_LOADTRANSPARENT 0x0020\n#define LR_DEFAULTSIZE 0x0040\n#define LR_VGACOLOR 0x0080\n#define LR_LOADMAP3DCOLORS 0x1000\n#define LR_CREATEDIBSECTION 0x2000\n#define LR_COPYFROMRESOURCE 0x4000\n#define LR_SHARED 0x8000\n\n#ifdef UNICODE\n#define LoadImage LoadImageW\n#else\n#define LoadImage LoadImageA\n#endif\n\n  WINUSERAPI HANDLE WINAPI LoadImageA(HINSTANCE hInst,LPCSTR name,UINT type,int cx,int cy,UINT fuLoad);\n  WINUSERAPI HANDLE WINAPI LoadImageW(HINSTANCE hInst,LPCWSTR name,UINT type,int cx,int cy,UINT fuLoad);\n  WINUSERAPI HANDLE WINAPI CopyImage(HANDLE h,UINT type,int cx,int cy,UINT flags);\n\n#define DI_MASK 0x0001\n#define DI_IMAGE 0x0002\n#define DI_NORMAL 0x0003\n#define DI_COMPAT 0x0004\n#define DI_DEFAULTSIZE 0x0008\n#define DI_NOMIRROR 0x0010\n\n  WINUSERAPI WINBOOL WINAPI DrawIconEx(HDC hdc,int xLeft,int yTop,HICON hIcon,int cxWidth,int cyWidth,UINT istepIfAniCur,HBRUSH hbrFlickerFreeDraw,UINT diFlags);\n  WINUSERAPI HICON WINAPI CreateIconIndirect(PICONINFO piconinfo);\n  WINUSERAPI HICON WINAPI CopyIcon(HICON hIcon);\n  WINUSERAPI WINBOOL WINAPI GetIconInfo(HICON hIcon,PICONINFO piconinfo);\n\n#define RES_ICON 1\n#define RES_CURSOR 2\n\n#ifdef OEMRESOURCE\n\n#define OBM_CLOSE 32754\n#define OBM_UPARROW 32753\n#define OBM_DNARROW 32752\n#define OBM_RGARROW 32751\n#define OBM_LFARROW 32750\n#define OBM_REDUCE 32749\n#define OBM_ZOOM 32748\n#define OBM_RESTORE 32747\n#define OBM_REDUCED 32746\n#define OBM_ZOOMD 32745\n#define OBM_RESTORED 32744\n#define OBM_UPARROWD 32743\n#define OBM_DNARROWD 32742\n#define OBM_RGARROWD 32741\n#define OBM_LFARROWD 32740\n#define OBM_MNARROW 32739\n#define OBM_COMBO 32738\n#define OBM_UPARROWI 32737\n#define OBM_DNARROWI 32736\n#define OBM_RGARROWI 32735\n#define OBM_LFARROWI 32734\n\n#define OBM_OLD_CLOSE 32767\n#define OBM_SIZE 32766\n#define OBM_OLD_UPARROW 32765\n#define OBM_OLD_DNARROW 32764\n#define OBM_OLD_RGARROW 32763\n#define OBM_OLD_LFARROW 32762\n#define OBM_BTSIZE 32761\n#define OBM_CHECK 32760\n#define OBM_CHECKBOXES 32759\n#define OBM_BTNCORNERS 32758\n#define OBM_OLD_REDUCE 32757\n#define OBM_OLD_ZOOM 32756\n#define OBM_OLD_RESTORE 32755\n\n#define OCR_NORMAL 32512\n#define OCR_IBEAM 32513\n#define OCR_WAIT 32514\n#define OCR_CROSS 32515\n#define OCR_UP 32516\n#define OCR_SIZE 32640\n#define OCR_ICON 32641\n#define OCR_SIZENWSE 32642\n#define OCR_SIZENESW 32643\n#define OCR_SIZEWE 32644\n#define OCR_SIZENS 32645\n#define OCR_SIZEALL 32646\n#define OCR_ICOCUR 32647\n#define OCR_NO 32648\n#define OCR_HAND 32649\n#define OCR_APPSTARTING 32650\n\n#define OIC_SAMPLE 32512\n#define OIC_HAND 32513\n#define OIC_QUES 32514\n#define OIC_BANG 32515\n#define OIC_NOTE 32516\n#define OIC_WINLOGO 32517\n#define OIC_WARNING OIC_BANG\n#define OIC_ERROR OIC_HAND\n#define OIC_INFORMATION OIC_NOTE\n#endif\n\n#define ORD_LANGDRIVER 1\n\n#ifndef NOICONS\n\n#ifdef RC_INVOKED\n#define IDI_APPLICATION 32512\n#define IDI_HAND 32513\n#define IDI_QUESTION 32514\n#define IDI_EXCLAMATION 32515\n#define IDI_ASTERISK 32516\n#define IDI_WINLOGO 32517\n#else\n#define IDI_APPLICATION MAKEINTRESOURCE(32512)\n#define IDI_HAND MAKEINTRESOURCE(32513)\n#define IDI_QUESTION MAKEINTRESOURCE(32514)\n#define IDI_EXCLAMATION MAKEINTRESOURCE(32515)\n#define IDI_ASTERISK MAKEINTRESOURCE(32516)\n#define IDI_WINLOGO MAKEINTRESOURCE(32517)\n#endif\n\n#define IDI_WARNING IDI_EXCLAMATION\n#define IDI_ERROR IDI_HAND\n#define IDI_INFORMATION IDI_ASTERISK\n#endif\n\n#ifdef UNICODE\n#define LoadString LoadStringW\n#else\n#define LoadString LoadStringA\n#endif\n\n  WINUSERAPI int WINAPI LoadStringA(HINSTANCE hInstance,UINT uID,LPSTR lpBuffer,int cchBufferMax);\n  WINUSERAPI int WINAPI LoadStringW(HINSTANCE hInstance,UINT uID,LPWSTR lpBuffer,int cchBufferMax);\n\n#define IDOK 1\n#define IDCANCEL 2\n#define IDABORT 3\n#define IDRETRY 4\n#define IDIGNORE 5\n#define IDYES 6\n#define IDNO 7\n#define IDCLOSE 8\n#define IDHELP 9\n#define IDTRYAGAIN 10\n#define IDCONTINUE 11\n\n#ifndef IDTIMEOUT\n#define IDTIMEOUT 32000\n#endif\n\n#ifndef NOCTLMGR\n\n#ifndef NOWINSTYLES\n#define ES_LEFT 0x0000L\n#define ES_CENTER 0x0001L\n#define ES_RIGHT 0x0002L\n#define ES_MULTILINE 0x0004L\n#define ES_UPPERCASE 0x0008L\n#define ES_LOWERCASE 0x0010L\n#define ES_PASSWORD 0x0020L\n#define ES_AUTOVSCROLL 0x0040L\n#define ES_AUTOHSCROLL 0x0080L\n#define ES_NOHIDESEL 0x0100L\n#define ES_OEMCONVERT 0x0400L\n#define ES_READONLY 0x0800L\n#define ES_WANTRETURN 0x1000L\n#define ES_NUMBER 0x2000L\n#endif\n\n#define EN_SETFOCUS 0x0100\n#define EN_KILLFOCUS 0x0200\n#define EN_CHANGE 0x0300\n#define EN_UPDATE 0x0400\n#define EN_ERRSPACE 0x0500\n#define EN_MAXTEXT 0x0501\n#define EN_HSCROLL 0x0601\n#define EN_VSCROLL 0x0602\n#define EN_ALIGN_LTR_EC 0x0700\n#define EN_ALIGN_RTL_EC 0x0701\n\n#define EC_LEFTMARGIN 0x0001\n#define EC_RIGHTMARGIN 0x0002\n#define EC_USEFONTINFO 0xffff\n\n#define EMSIS_COMPOSITIONSTRING 0x0001\n\n#define EIMES_GETCOMPSTRATONCE 0x0001\n#define EIMES_CANCELCOMPSTRINFOCUS 0x0002\n#define EIMES_COMPLETECOMPSTRKILLFOCUS 0x0004\n\n#ifndef NOWINMESSAGES\n\n#define EM_GETSEL 0x00B0\n#define EM_SETSEL 0x00B1\n#define EM_GETRECT 0x00B2\n#define EM_SETRECT 0x00B3\n#define EM_SETRECTNP 0x00B4\n#define EM_SCROLL 0x00B5\n#define EM_LINESCROLL 0x00B6\n#define EM_SCROLLCARET 0x00B7\n#define EM_GETMODIFY 0x00B8\n#define EM_SETMODIFY 0x00B9\n#define EM_GETLINECOUNT 0x00BA\n#define EM_LINEINDEX 0x00BB\n#define EM_SETHANDLE 0x00BC\n#define EM_GETHANDLE 0x00BD\n#define EM_GETTHUMB 0x00BE\n#define EM_LINELENGTH 0x00C1\n#define EM_REPLACESEL 0x00C2\n#define EM_GETLINE 0x00C4\n#define EM_LIMITTEXT 0x00C5\n#define EM_CANUNDO 0x00C6\n#define EM_UNDO 0x00C7\n#define EM_FMTLINES 0x00C8\n#define EM_LINEFROMCHAR 0x00C9\n#define EM_SETTABSTOPS 0x00CB\n#define EM_SETPASSWORDCHAR 0x00CC\n#define EM_EMPTYUNDOBUFFER 0x00CD\n#define EM_GETFIRSTVISIBLELINE 0x00CE\n#define EM_SETREADONLY 0x00CF\n#define EM_SETWORDBREAKPROC 0x00D0\n#define EM_GETWORDBREAKPROC 0x00D1\n#define EM_GETPASSWORDCHAR 0x00D2\n#define EM_SETMARGINS 0x00D3\n#define EM_GETMARGINS 0x00D4\n#define EM_SETLIMITTEXT EM_LIMITTEXT\n#define EM_GETLIMITTEXT 0x00D5\n#define EM_POSFROMCHAR 0x00D6\n#define EM_CHARFROMPOS 0x00D7\n#define EM_SETIMESTATUS 0x00D8\n#define EM_GETIMESTATUS 0x00D9\n#endif\n\n#define WB_LEFT 0\n#define WB_RIGHT 1\n#define WB_ISDELIMITER 2\n\n#define BS_PUSHBUTTON 0x00000000L\n#define BS_DEFPUSHBUTTON 0x00000001L\n#define BS_CHECKBOX 0x00000002L\n#define BS_AUTOCHECKBOX 0x00000003L\n#define BS_RADIOBUTTON 0x00000004L\n#define BS_3STATE 0x00000005L\n#define BS_AUTO3STATE 0x00000006L\n#define BS_GROUPBOX 0x00000007L\n#define BS_USERBUTTON 0x00000008L\n#define BS_AUTORADIOBUTTON 0x00000009L\n#define BS_PUSHBOX 0x0000000AL\n#define BS_OWNERDRAW 0x0000000BL\n#define BS_TYPEMASK 0x0000000FL\n#define BS_LEFTTEXT 0x00000020L\n#define BS_TEXT 0x00000000L\n#define BS_ICON 0x00000040L\n#define BS_BITMAP 0x00000080L\n#define BS_LEFT 0x00000100L\n#define BS_RIGHT 0x00000200L\n#define BS_CENTER 0x00000300L\n#define BS_TOP 0x00000400L\n#define BS_BOTTOM 0x00000800L\n#define BS_VCENTER 0x00000C00L\n#define BS_PUSHLIKE 0x00001000L\n#define BS_MULTILINE 0x00002000L\n#define BS_NOTIFY 0x00004000L\n#define BS_FLAT 0x00008000L\n#define BS_RIGHTBUTTON BS_LEFTTEXT\n\n#define BN_CLICKED 0\n#define BN_PAINT 1\n#define BN_HILITE 2\n#define BN_UNHILITE 3\n#define BN_DISABLE 4\n#define BN_DOUBLECLICKED 5\n#define BN_PUSHED BN_HILITE\n#define BN_UNPUSHED BN_UNHILITE\n#define BN_DBLCLK BN_DOUBLECLICKED\n#define BN_SETFOCUS 6\n#define BN_KILLFOCUS 7\n\n#define BM_GETCHECK 0x00F0\n#define BM_SETCHECK 0x00F1\n#define BM_GETSTATE 0x00F2\n#define BM_SETSTATE 0x00F3\n#define BM_SETSTYLE 0x00F4\n#define BM_CLICK 0x00F5\n#define BM_GETIMAGE 0x00F6\n#define BM_SETIMAGE 0x00F7\n\n#define BST_UNCHECKED 0x0000\n#define BST_CHECKED 0x0001\n#define BST_INDETERMINATE 0x0002\n#define BST_PUSHED 0x0004\n#define BST_FOCUS 0x0008\n\n#define SS_LEFT 0x00000000L\n#define SS_CENTER 0x00000001L\n#define SS_RIGHT 0x00000002L\n#define SS_ICON 0x00000003L\n#define SS_BLACKRECT 0x00000004L\n#define SS_GRAYRECT 0x00000005L\n#define SS_WHITERECT 0x00000006L\n#define SS_BLACKFRAME 0x00000007L\n#define SS_GRAYFRAME 0x00000008L\n#define SS_WHITEFRAME 0x00000009L\n#define SS_USERITEM 0x0000000AL\n#define SS_SIMPLE 0x0000000BL\n#define SS_LEFTNOWORDWRAP 0x0000000CL\n#define SS_OWNERDRAW 0x0000000DL\n#define SS_BITMAP 0x0000000EL\n#define SS_ENHMETAFILE 0x0000000FL\n#define SS_ETCHEDHORZ 0x00000010L\n#define SS_ETCHEDVERT 0x00000011L\n#define SS_ETCHEDFRAME 0x00000012L\n#define SS_TYPEMASK 0x0000001FL\n#define SS_REALSIZECONTROL 0x00000040L\n#define SS_NOPREFIX 0x00000080L\n#define SS_NOTIFY 0x00000100L\n#define SS_CENTERIMAGE 0x00000200L\n#define SS_RIGHTJUST 0x00000400L\n#define SS_REALSIZEIMAGE 0x00000800L\n#define SS_SUNKEN 0x00001000L\n#define SS_EDITCONTROL 0x00002000L\n#define SS_ENDELLIPSIS 0x00004000L\n#define SS_PATHELLIPSIS 0x00008000L\n#define SS_WORDELLIPSIS 0x0000C000L\n#define SS_ELLIPSISMASK 0x0000C000L\n\n#ifndef NOWINMESSAGES\n\n#define STM_SETICON 0x0170\n#define STM_GETICON 0x0171\n#define STM_SETIMAGE 0x0172\n#define STM_GETIMAGE 0x0173\n#define STN_CLICKED 0\n#define STN_DBLCLK 1\n#define STN_ENABLE 2\n#define STN_DISABLE 3\n#define STM_MSGMAX 0x0174\n#endif\n\n#define WC_DIALOG (MAKEINTATOM(0x8002))\n\n#define DWL_MSGRESULT 0\n#define DWL_DLGPROC 4\n#define DWL_USER 8\n\n#ifdef _WIN64\n\n#undef DWL_MSGRESULT\n#undef DWL_DLGPROC\n#undef DWL_USER\n#endif\n\n#define DWLP_MSGRESULT 0\n#define DWLP_DLGPROC DWLP_MSGRESULT + sizeof(LRESULT)\n#define DWLP_USER DWLP_DLGPROC + sizeof(DLGPROC)\n\n#ifndef NOMSG\n\n#ifdef UNICODE\n#define IsDialogMessage IsDialogMessageW\n#else\n#define IsDialogMessage IsDialogMessageA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI IsDialogMessageA(HWND hDlg,LPMSG lpMsg);\n  WINUSERAPI WINBOOL WINAPI IsDialogMessageW(HWND hDlg,LPMSG lpMsg);\n#endif\n\n#ifdef UNICODE\n#define DlgDirList DlgDirListW\n#define DlgDirSelectEx DlgDirSelectExW\n#define DlgDirListComboBox DlgDirListComboBoxW\n#define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExW\n#else\n#define DlgDirList DlgDirListA\n#define DlgDirSelectEx DlgDirSelectExA\n#define DlgDirListComboBox DlgDirListComboBoxA\n#define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI MapDialogRect(HWND hDlg,LPRECT lpRect);\n  WINUSERAPI int WINAPI DlgDirListA(HWND hDlg,LPSTR lpPathSpec,int nIDListBox,int nIDStaticPath,UINT uFileType);\n  WINUSERAPI int WINAPI DlgDirListW(HWND hDlg,LPWSTR lpPathSpec,int nIDListBox,int nIDStaticPath,UINT uFileType);\n\n#define DDL_READWRITE 0x0000\n#define DDL_READONLY 0x0001\n#define DDL_HIDDEN 0x0002\n#define DDL_SYSTEM 0x0004\n#define DDL_DIRECTORY 0x0010\n#define DDL_ARCHIVE 0x0020\n\n#define DDL_POSTMSGS 0x2000\n#define DDL_DRIVES 0x4000\n#define DDL_EXCLUSIVE 0x8000\n\n  WINUSERAPI WINBOOL WINAPI DlgDirSelectExA(HWND hwndDlg,LPSTR lpString,int chCount,int idListBox);\n  WINUSERAPI WINBOOL WINAPI DlgDirSelectExW(HWND hwndDlg,LPWSTR lpString,int chCount,int idListBox);\n  WINUSERAPI int WINAPI DlgDirListComboBoxA(HWND hDlg,LPSTR lpPathSpec,int nIDComboBox,int nIDStaticPath,UINT uFiletype);\n  WINUSERAPI int WINAPI DlgDirListComboBoxW(HWND hDlg,LPWSTR lpPathSpec,int nIDComboBox,int nIDStaticPath,UINT uFiletype);\n  WINUSERAPI WINBOOL WINAPI DlgDirSelectComboBoxExA(HWND hwndDlg,LPSTR lpString,int cchOut,int idComboBox);\n  WINUSERAPI WINBOOL WINAPI DlgDirSelectComboBoxExW(HWND hwndDlg,LPWSTR lpString,int cchOut,int idComboBox);\n\n#define DS_ABSALIGN 0x01L\n#define DS_SYSMODAL 0x02L\n#define DS_LOCALEDIT 0x20L\n#define DS_SETFONT 0x40L\n#define DS_MODALFRAME 0x80L\n#define DS_NOIDLEMSG 0x100L\n#define DS_SETFOREGROUND 0x200L\n\n#define DS_3DLOOK 0x0004L\n#define DS_FIXEDSYS 0x0008L\n#define DS_NOFAILCREATE 0x0010L\n#define DS_CONTROL 0x0400L\n#define DS_CENTER 0x0800L\n#define DS_CENTERMOUSE 0x1000L\n#define DS_CONTEXTHELP 0x2000L\n\n#define DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS)\n\n#if(_WIN32_WCE >= 0x0500)\n#define DS_USEPIXELS 0x8000L\n#endif\n\n#define DM_GETDEFID (WM_USER+0)\n#define DM_SETDEFID (WM_USER+1)\n#define DM_REPOSITION (WM_USER+2)\n\n#define DC_HASDEFID 0x534B\n\n#define DLGC_WANTARROWS 0x0001\n#define DLGC_WANTTAB 0x0002\n#define DLGC_WANTALLKEYS 0x0004\n#define DLGC_WANTMESSAGE 0x0004\n#define DLGC_HASSETSEL 0x0008\n#define DLGC_DEFPUSHBUTTON 0x0010\n#define DLGC_UNDEFPUSHBUTTON 0x0020\n#define DLGC_RADIOBUTTON 0x0040\n#define DLGC_WANTCHARS 0x0080\n#define DLGC_STATIC 0x0100\n#define DLGC_BUTTON 0x2000\n\n#define LB_CTLCODE 0L\n\n#define LB_OKAY 0\n#define LB_ERR (-1)\n#define LB_ERRSPACE (-2)\n\n#define LBN_ERRSPACE (-2)\n#define LBN_SELCHANGE 1\n#define LBN_DBLCLK 2\n#define LBN_SELCANCEL 3\n#define LBN_SETFOCUS 4\n#define LBN_KILLFOCUS 5\n\n#ifndef NOWINMESSAGES\n\n#define LB_ADDSTRING 0x0180\n#define LB_INSERTSTRING 0x0181\n#define LB_DELETESTRING 0x0182\n#define LB_SELITEMRANGEEX 0x0183\n#define LB_RESETCONTENT 0x0184\n#define LB_SETSEL 0x0185\n#define LB_SETCURSEL 0x0186\n#define LB_GETSEL 0x0187\n#define LB_GETCURSEL 0x0188\n#define LB_GETTEXT 0x0189\n#define LB_GETTEXTLEN 0x018A\n#define LB_GETCOUNT 0x018B\n#define LB_SELECTSTRING 0x018C\n#define LB_DIR 0x018D\n#define LB_GETTOPINDEX 0x018E\n#define LB_FINDSTRING 0x018F\n#define LB_GETSELCOUNT 0x0190\n#define LB_GETSELITEMS 0x0191\n#define LB_SETTABSTOPS 0x0192\n#define LB_GETHORIZONTALEXTENT 0x0193\n#define LB_SETHORIZONTALEXTENT 0x0194\n#define LB_SETCOLUMNWIDTH 0x0195\n#define LB_ADDFILE 0x0196\n#define LB_SETTOPINDEX 0x0197\n#define LB_GETITEMRECT 0x0198\n#define LB_GETITEMDATA 0x0199\n#define LB_SETITEMDATA 0x019A\n#define LB_SELITEMRANGE 0x019B\n#define LB_SETANCHORINDEX 0x019C\n#define LB_GETANCHORINDEX 0x019D\n#define LB_SETCARETINDEX 0x019E\n#define LB_GETCARETINDEX 0x019F\n#define LB_SETITEMHEIGHT 0x01A0\n#define LB_GETITEMHEIGHT 0x01A1\n#define LB_FINDSTRINGEXACT 0x01A2\n#define LB_SETLOCALE 0x01A5\n#define LB_GETLOCALE 0x01A6\n#define LB_SETCOUNT 0x01A7\n#define LB_INITSTORAGE 0x01A8\n#define LB_ITEMFROMPOINT 0x01A9\n#if(_WIN32_WCE >= 0x0400)\n#define LB_MULTIPLEADDSTRING 0x01B1\n#endif\n#define LB_GETLISTBOXINFO 0x01B2\n#define LB_MSGMAX 0x01B3\n#endif\n\n#ifndef NOWINSTYLES\n\n#define LBS_NOTIFY 0x0001L\n#define LBS_SORT 0x0002L\n#define LBS_NOREDRAW 0x0004L\n#define LBS_MULTIPLESEL 0x0008L\n#define LBS_OWNERDRAWFIXED 0x0010L\n#define LBS_OWNERDRAWVARIABLE 0x0020L\n#define LBS_HASSTRINGS 0x0040L\n#define LBS_USETABSTOPS 0x0080L\n#define LBS_NOINTEGRALHEIGHT 0x0100L\n#define LBS_MULTICOLUMN 0x0200L\n#define LBS_WANTKEYBOARDINPUT 0x0400L\n#define LBS_EXTENDEDSEL 0x0800L\n#define LBS_DISABLENOSCROLL 0x1000L\n#define LBS_NODATA 0x2000L\n#define LBS_NOSEL 0x4000L\n#define LBS_COMBOBOX 0x8000L\n\n#define LBS_STANDARD (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)\n#endif\n\n#define CB_OKAY 0\n#define CB_ERR (-1)\n#define CB_ERRSPACE (-2)\n\n#define CBN_ERRSPACE (-1)\n#define CBN_SELCHANGE 1\n#define CBN_DBLCLK 2\n#define CBN_SETFOCUS 3\n#define CBN_KILLFOCUS 4\n#define CBN_EDITCHANGE 5\n#define CBN_EDITUPDATE 6\n#define CBN_DROPDOWN 7\n#define CBN_CLOSEUP 8\n#define CBN_SELENDOK 9\n#define CBN_SELENDCANCEL 10\n\n#ifndef NOWINSTYLES\n\n#define CBS_SIMPLE 0x0001L\n#define CBS_DROPDOWN 0x0002L\n#define CBS_DROPDOWNLIST 0x0003L\n#define CBS_OWNERDRAWFIXED 0x0010L\n#define CBS_OWNERDRAWVARIABLE 0x0020L\n#define CBS_AUTOHSCROLL 0x0040L\n#define CBS_OEMCONVERT 0x0080L\n#define CBS_SORT 0x0100L\n#define CBS_HASSTRINGS 0x0200L\n#define CBS_NOINTEGRALHEIGHT 0x0400L\n#define CBS_DISABLENOSCROLL 0x0800L\n#define CBS_UPPERCASE 0x2000L\n#define CBS_LOWERCASE 0x4000L\n#endif\n\n#ifndef NOWINMESSAGES\n#define CB_GETEDITSEL 0x0140\n#define CB_LIMITTEXT 0x0141\n#define CB_SETEDITSEL 0x0142\n#define CB_ADDSTRING 0x0143\n#define CB_DELETESTRING 0x0144\n#define CB_DIR 0x0145\n#define CB_GETCOUNT 0x0146\n#define CB_GETCURSEL 0x0147\n#define CB_GETLBTEXT 0x0148\n#define CB_GETLBTEXTLEN 0x0149\n#define CB_INSERTSTRING 0x014A\n#define CB_RESETCONTENT 0x014B\n#define CB_FINDSTRING 0x014C\n#define CB_SELECTSTRING 0x014D\n#define CB_SETCURSEL 0x014E\n#define CB_SHOWDROPDOWN 0x014F\n#define CB_GETITEMDATA 0x0150\n#define CB_SETITEMDATA 0x0151\n#define CB_GETDROPPEDCONTROLRECT 0x0152\n#define CB_SETITEMHEIGHT 0x0153\n#define CB_GETITEMHEIGHT 0x0154\n#define CB_SETEXTENDEDUI 0x0155\n#define CB_GETEXTENDEDUI 0x0156\n#define CB_GETDROPPEDSTATE 0x0157\n#define CB_FINDSTRINGEXACT 0x0158\n#define CB_SETLOCALE 0x0159\n#define CB_GETLOCALE 0x015A\n#define CB_GETTOPINDEX 0x015b\n#define CB_SETTOPINDEX 0x015c\n#define CB_GETHORIZONTALEXTENT 0x015d\n#define CB_SETHORIZONTALEXTENT 0x015e\n#define CB_GETDROPPEDWIDTH 0x015f\n#define CB_SETDROPPEDWIDTH 0x0160\n#define CB_INITSTORAGE 0x0161\n#if(_WIN32_WCE >= 0x0400)\n#define CB_MULTIPLEADDSTRING 0x0163\n#endif\n#define CB_GETCOMBOBOXINFO 0x0164\n#define CB_MSGMAX 0x0165\n#endif\n\n#ifndef NOWINSTYLES\n\n#define SBS_HORZ 0x0000L\n#define SBS_VERT 0x0001L\n#define SBS_TOPALIGN 0x0002L\n#define SBS_LEFTALIGN 0x0002L\n#define SBS_BOTTOMALIGN 0x0004L\n#define SBS_RIGHTALIGN 0x0004L\n#define SBS_SIZEBOXTOPLEFTALIGN 0x0002L\n#define SBS_SIZEBOXBOTTOMRIGHTALIGN 0x0004L\n#define SBS_SIZEBOX 0x0008L\n#define SBS_SIZEGRIP 0x0010L\n#endif\n\n#ifndef NOWINMESSAGES\n#define SBM_SETPOS 0x00E0\n#define SBM_GETPOS 0x00E1\n#define SBM_SETRANGE 0x00E2\n#define SBM_SETRANGEREDRAW 0x00E6\n#define SBM_GETRANGE 0x00E3\n#define SBM_ENABLE_ARROWS 0x00E4\n#define SBM_SETSCROLLINFO 0x00E9\n#define SBM_GETSCROLLINFO 0x00EA\n#define SBM_GETSCROLLBARINFO 0x00EB\n\n#define SIF_RANGE 0x0001\n#define SIF_PAGE 0x0002\n#define SIF_POS 0x0004\n#define SIF_DISABLENOSCROLL 0x0008\n#define SIF_TRACKPOS 0x0010\n#define SIF_ALL (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)\n\n  typedef struct tagSCROLLINFO {\n    UINT cbSize;\n    UINT fMask;\n    int nMin;\n    int nMax;\n    UINT nPage;\n    int nPos;\n    int nTrackPos;\n  } SCROLLINFO,*LPSCROLLINFO;\n  typedef SCROLLINFO CONST *LPCSCROLLINFO;\n\n  WINUSERAPI int WINAPI SetScrollInfo(HWND hwnd,int nBar,LPCSCROLLINFO lpsi,WINBOOL redraw);\n  WINUSERAPI WINBOOL WINAPI GetScrollInfo(HWND hwnd,int nBar,LPSCROLLINFO lpsi);\n#endif\n#endif\n\n#ifndef NOMDI\n\n#define MDIS_ALLCHILDSTYLES 0x0001\n\n#define MDITILE_VERTICAL 0x0000\n#define MDITILE_HORIZONTAL 0x0001\n#define MDITILE_SKIPDISABLED 0x0002\n#define MDITILE_ZORDER 0x0004\n\n  typedef struct tagMDICREATESTRUCTA {\n    LPCSTR szClass;\n    LPCSTR szTitle;\n    HANDLE hOwner;\n    int x;\n    int y;\n    int cx;\n    int cy;\n    DWORD style;\n    LPARAM lParam;\n  } MDICREATESTRUCTA,*LPMDICREATESTRUCTA;\n\n  typedef struct tagMDICREATESTRUCTW {\n    LPCWSTR szClass;\n    LPCWSTR szTitle;\n    HANDLE hOwner;\n    int x;\n    int y;\n    int cx;\n    int cy;\n    DWORD style;\n    LPARAM lParam;\n  } MDICREATESTRUCTW,*LPMDICREATESTRUCTW;\n\n#ifdef UNICODE\n  typedef MDICREATESTRUCTW MDICREATESTRUCT;\n  typedef LPMDICREATESTRUCTW LPMDICREATESTRUCT;\n#else\n  typedef MDICREATESTRUCTA MDICREATESTRUCT;\n  typedef LPMDICREATESTRUCTA LPMDICREATESTRUCT;\n#endif\n\n  typedef struct tagCLIENTCREATESTRUCT {\n    HANDLE hWindowMenu;\n    UINT idFirstChild;\n  } CLIENTCREATESTRUCT,*LPCLIENTCREATESTRUCT;\n\n#ifdef UNICODE\n#define DefFrameProc DefFrameProcW\n#define DefMDIChildProc DefMDIChildProcW\n#define CreateMDIWindow CreateMDIWindowW\n#else\n#define DefFrameProc DefFrameProcA\n#define DefMDIChildProc DefMDIChildProcA\n#define CreateMDIWindow CreateMDIWindowA\n#endif\n\n  WINUSERAPI LRESULT WINAPI DefFrameProcA(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI DefFrameProcW(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI DefMDIChildProcA(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);\n  WINUSERAPI LRESULT WINAPI DefMDIChildProcW(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);\n\n#ifndef NOMSG\n  WINUSERAPI WINBOOL WINAPI TranslateMDISysAccel(HWND hWndClient,LPMSG lpMsg);\n#endif\n\n  WINUSERAPI UINT WINAPI ArrangeIconicWindows(HWND hWnd);\n  WINUSERAPI HWND WINAPI CreateMDIWindowA(LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam);\n  WINUSERAPI HWND WINAPI CreateMDIWindowW(LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam);\n  WINUSERAPI WORD WINAPI TileWindows(HWND hwndParent,UINT wHow,CONST RECT *lpRect,UINT cKids,const HWND *lpKids);\n  WINUSERAPI WORD WINAPI CascadeWindows(HWND hwndParent,UINT wHow,CONST RECT *lpRect,UINT cKids,const HWND *lpKids);\n#endif\n#endif\n\n#ifndef NOHELP\n\n  typedef DWORD HELPPOLY;\n  typedef struct tagMULTIKEYHELPA {\n    DWORD mkSize;\n    CHAR mkKeylist;\n    CHAR szKeyphrase[1];\n  } MULTIKEYHELPA,*PMULTIKEYHELPA,*LPMULTIKEYHELPA;\n\n  typedef struct tagMULTIKEYHELPW {\n    DWORD mkSize;\n    WCHAR mkKeylist;\n    WCHAR szKeyphrase[1];\n  } MULTIKEYHELPW,*PMULTIKEYHELPW,*LPMULTIKEYHELPW;\n\n#ifdef UNICODE\n  typedef MULTIKEYHELPW MULTIKEYHELP;\n  typedef PMULTIKEYHELPW PMULTIKEYHELP;\n  typedef LPMULTIKEYHELPW LPMULTIKEYHELP;\n#else\n  typedef MULTIKEYHELPA MULTIKEYHELP;\n  typedef PMULTIKEYHELPA PMULTIKEYHELP;\n  typedef LPMULTIKEYHELPA LPMULTIKEYHELP;\n#endif\n\n  typedef struct tagHELPWININFOA {\n    int wStructSize;\n    int x;\n    int y;\n    int dx;\n    int dy;\n    int wMax;\n    CHAR rgchMember[2];\n  } HELPWININFOA,*PHELPWININFOA,*LPHELPWININFOA;\n\n  typedef struct tagHELPWININFOW {\n    int wStructSize;\n    int x;\n    int y;\n    int dx;\n    int dy;\n    int wMax;\n    WCHAR rgchMember[2];\n  } HELPWININFOW,*PHELPWININFOW,*LPHELPWININFOW;\n\n#ifdef UNICODE\n  typedef HELPWININFOW HELPWININFO;\n  typedef PHELPWININFOW PHELPWININFO;\n  typedef LPHELPWININFOW LPHELPWININFO;\n#else\n  typedef HELPWININFOA HELPWININFO;\n  typedef PHELPWININFOA PHELPWININFO;\n  typedef LPHELPWININFOA LPHELPWININFO;\n#endif\n\n#define HELP_CONTEXT 0x0001L\n#define HELP_QUIT 0x0002L\n#define HELP_INDEX 0x0003L\n#define HELP_CONTENTS 0x0003L\n#define HELP_HELPONHELP 0x0004L\n#define HELP_SETINDEX 0x0005L\n#define HELP_SETCONTENTS 0x0005L\n#define HELP_CONTEXTPOPUP 0x0008L\n#define HELP_FORCEFILE 0x0009L\n#define HELP_KEY 0x0101L\n#define HELP_COMMAND 0x0102L\n#define HELP_PARTIALKEY 0x0105L\n#define HELP_MULTIKEY 0x0201L\n#define HELP_SETWINPOS 0x0203L\n#define HELP_CONTEXTMENU 0x000a\n#define HELP_FINDER 0x000b\n#define HELP_WM_HELP 0x000c\n#define HELP_SETPOPUP_POS 0x000d\n\n#define HELP_TCARD 0x8000\n#define HELP_TCARD_DATA 0x0010\n#define HELP_TCARD_OTHER_CALLER 0x0011\n\n#define IDH_NO_HELP 28440\n#define IDH_MISSING_CONTEXT 28441\n#define IDH_GENERIC_HELP_BUTTON 28442\n#define IDH_OK 28443\n#define IDH_CANCEL 28444\n#define IDH_HELP 28445\n\n#ifdef UNICODE\n#define WinHelp WinHelpW\n#else\n#define WinHelp WinHelpA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI WinHelpA(HWND hWndMain,LPCSTR lpszHelp,UINT uCommand,ULONG_PTR dwData);\n  WINUSERAPI WINBOOL WINAPI WinHelpW(HWND hWndMain,LPCWSTR lpszHelp,UINT uCommand,ULONG_PTR dwData);\n#endif\n\n#define GR_GDIOBJECTS 0\n#define GR_USEROBJECTS 1\n\n  WINUSERAPI DWORD WINAPI GetGuiResources(HANDLE hProcess,DWORD uiFlags);\n\n#ifndef NOSYSPARAMSINFO\n\n#define SPI_GETBEEP 0x0001\n#define SPI_SETBEEP 0x0002\n#define SPI_GETMOUSE 0x0003\n#define SPI_SETMOUSE 0x0004\n#define SPI_GETBORDER 0x0005\n#define SPI_SETBORDER 0x0006\n#define SPI_GETKEYBOARDSPEED 0x000A\n#define SPI_SETKEYBOARDSPEED 0x000B\n#define SPI_LANGDRIVER 0x000C\n#define SPI_ICONHORIZONTALSPACING 0x000D\n#define SPI_GETSCREENSAVETIMEOUT 0x000E\n#define SPI_SETSCREENSAVETIMEOUT 0x000F\n#define SPI_GETSCREENSAVEACTIVE 0x0010\n#define SPI_SETSCREENSAVEACTIVE 0x0011\n#define SPI_GETGRIDGRANULARITY 0x0012\n#define SPI_SETGRIDGRANULARITY 0x0013\n#define SPI_SETDESKWALLPAPER 0x0014\n#define SPI_SETDESKPATTERN 0x0015\n#define SPI_GETKEYBOARDDELAY 0x0016\n#define SPI_SETKEYBOARDDELAY 0x0017\n#define SPI_ICONVERTICALSPACING 0x0018\n#define SPI_GETICONTITLEWRAP 0x0019\n#define SPI_SETICONTITLEWRAP 0x001A\n#define SPI_GETMENUDROPALIGNMENT 0x001B\n#define SPI_SETMENUDROPALIGNMENT 0x001C\n#define SPI_SETDOUBLECLKWIDTH 0x001D\n#define SPI_SETDOUBLECLKHEIGHT 0x001E\n#define SPI_GETICONTITLELOGFONT 0x001F\n#define SPI_SETDOUBLECLICKTIME 0x0020\n#define SPI_SETMOUSEBUTTONSWAP 0x0021\n#define SPI_SETICONTITLELOGFONT 0x0022\n#define SPI_GETFASTTASKSWITCH 0x0023\n#define SPI_SETFASTTASKSWITCH 0x0024\n#define SPI_SETDRAGFULLWINDOWS 0x0025\n#define SPI_GETDRAGFULLWINDOWS 0x0026\n#define SPI_GETNONCLIENTMETRICS 0x0029\n#define SPI_SETNONCLIENTMETRICS 0x002A\n#define SPI_GETMINIMIZEDMETRICS 0x002B\n#define SPI_SETMINIMIZEDMETRICS 0x002C\n#define SPI_GETICONMETRICS 0x002D\n#define SPI_SETICONMETRICS 0x002E\n#define SPI_SETWORKAREA 0x002F\n#define SPI_GETWORKAREA 0x0030\n#define SPI_SETPENWINDOWS 0x0031\n\n#define SPI_GETHIGHCONTRAST 0x0042\n#define SPI_SETHIGHCONTRAST 0x0043\n#define SPI_GETKEYBOARDPREF 0x0044\n#define SPI_SETKEYBOARDPREF 0x0045\n#define SPI_GETSCREENREADER 0x0046\n#define SPI_SETSCREENREADER 0x0047\n#define SPI_GETANIMATION 0x0048\n#define SPI_SETANIMATION 0x0049\n#define SPI_GETFONTSMOOTHING 0x004A\n#define SPI_SETFONTSMOOTHING 0x004B\n#define SPI_SETDRAGWIDTH 0x004C\n#define SPI_SETDRAGHEIGHT 0x004D\n#define SPI_SETHANDHELD 0x004E\n#define SPI_GETLOWPOWERTIMEOUT 0x004F\n#define SPI_GETPOWEROFFTIMEOUT 0x0050\n#define SPI_SETLOWPOWERTIMEOUT 0x0051\n#define SPI_SETPOWEROFFTIMEOUT 0x0052\n#define SPI_GETLOWPOWERACTIVE 0x0053\n#define SPI_GETPOWEROFFACTIVE 0x0054\n#define SPI_SETLOWPOWERACTIVE 0x0055\n#define SPI_SETPOWEROFFACTIVE 0x0056\n#define SPI_SETCURSORS 0x0057\n#define SPI_SETICONS 0x0058\n#define SPI_GETDEFAULTINPUTLANG 0x0059\n#define SPI_SETDEFAULTINPUTLANG 0x005A\n#define SPI_SETLANGTOGGLE 0x005B\n#define SPI_GETWINDOWSEXTENSION 0x005C\n#define SPI_SETMOUSETRAILS 0x005D\n#define SPI_GETMOUSETRAILS 0x005E\n#define SPI_SETSCREENSAVERRUNNING 0x0061\n#define SPI_SCREENSAVERRUNNING SPI_SETSCREENSAVERRUNNING\n#define SPI_GETFILTERKEYS 0x0032\n#define SPI_SETFILTERKEYS 0x0033\n#define SPI_GETTOGGLEKEYS 0x0034\n#define SPI_SETTOGGLEKEYS 0x0035\n#define SPI_GETMOUSEKEYS 0x0036\n#define SPI_SETMOUSEKEYS 0x0037\n#define SPI_GETSHOWSOUNDS 0x0038\n#define SPI_SETSHOWSOUNDS 0x0039\n#define SPI_GETSTICKYKEYS 0x003A\n#define SPI_SETSTICKYKEYS 0x003B\n#define SPI_GETACCESSTIMEOUT 0x003C\n#define SPI_SETACCESSTIMEOUT 0x003D\n#define SPI_GETSERIALKEYS 0x003E\n#define SPI_SETSERIALKEYS 0x003F\n#define SPI_GETSOUNDSENTRY 0x0040\n#define SPI_SETSOUNDSENTRY 0x0041\n#define SPI_GETSNAPTODEFBUTTON 0x005F\n#define SPI_SETSNAPTODEFBUTTON 0x0060\n#define SPI_GETMOUSEHOVERWIDTH 0x0062\n#define SPI_SETMOUSEHOVERWIDTH 0x0063\n#define SPI_GETMOUSEHOVERHEIGHT 0x0064\n#define SPI_SETMOUSEHOVERHEIGHT 0x0065\n#define SPI_GETMOUSEHOVERTIME 0x0066\n#define SPI_SETMOUSEHOVERTIME 0x0067\n#define SPI_GETWHEELSCROLLLINES 0x0068\n#define SPI_SETWHEELSCROLLLINES 0x0069\n#define SPI_GETMENUSHOWDELAY 0x006A\n#define SPI_SETMENUSHOWDELAY 0x006B\n#define SPI_GETSHOWIMEUI 0x006E\n#define SPI_SETSHOWIMEUI 0x006F\n#define SPI_GETMOUSESPEED 0x0070\n#define SPI_SETMOUSESPEED 0x0071\n#define SPI_GETSCREENSAVERRUNNING 0x0072\n#define SPI_GETDESKWALLPAPER 0x0073\n\n#define SPI_GETACTIVEWINDOWTRACKING 0x1000\n#define SPI_SETACTIVEWINDOWTRACKING 0x1001\n#define SPI_GETMENUANIMATION 0x1002\n#define SPI_SETMENUANIMATION 0x1003\n#define SPI_GETCOMBOBOXANIMATION 0x1004\n#define SPI_SETCOMBOBOXANIMATION 0x1005\n#define SPI_GETLISTBOXSMOOTHSCROLLING 0x1006\n#define SPI_SETLISTBOXSMOOTHSCROLLING 0x1007\n#define SPI_GETGRADIENTCAPTIONS 0x1008\n#define SPI_SETGRADIENTCAPTIONS 0x1009\n#define SPI_GETKEYBOARDCUES 0x100A\n#define SPI_SETKEYBOARDCUES 0x100B\n#define SPI_GETMENUUNDERLINES SPI_GETKEYBOARDCUES\n#define SPI_SETMENUUNDERLINES SPI_SETKEYBOARDCUES\n#define SPI_GETACTIVEWNDTRKZORDER 0x100C\n#define SPI_SETACTIVEWNDTRKZORDER 0x100D\n#define SPI_GETHOTTRACKING 0x100E\n#define SPI_SETHOTTRACKING 0x100F\n#define SPI_GETMENUFADE 0x1012\n#define SPI_SETMENUFADE 0x1013\n#define SPI_GETSELECTIONFADE 0x1014\n#define SPI_SETSELECTIONFADE 0x1015\n#define SPI_GETTOOLTIPANIMATION 0x1016\n#define SPI_SETTOOLTIPANIMATION 0x1017\n#define SPI_GETTOOLTIPFADE 0x1018\n#define SPI_SETTOOLTIPFADE 0x1019\n#define SPI_GETCURSORSHADOW 0x101A\n#define SPI_SETCURSORSHADOW 0x101B\n#define SPI_GETMOUSESONAR 0x101C\n#define SPI_SETMOUSESONAR 0x101D\n#define SPI_GETMOUSECLICKLOCK 0x101E\n#define SPI_SETMOUSECLICKLOCK 0x101F\n#define SPI_GETMOUSEVANISH 0x1020\n#define SPI_SETMOUSEVANISH 0x1021\n#define SPI_GETFLATMENU 0x1022\n#define SPI_SETFLATMENU 0x1023\n#define SPI_GETDROPSHADOW 0x1024\n#define SPI_SETDROPSHADOW 0x1025\n#define SPI_GETBLOCKSENDINPUTRESETS 0x1026\n#define SPI_SETBLOCKSENDINPUTRESETS 0x1027\n#define SPI_GETUIEFFECTS 0x103E\n#define SPI_SETUIEFFECTS 0x103F\n#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000\n#define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001\n#define SPI_GETACTIVEWNDTRKTIMEOUT 0x2002\n#define SPI_SETACTIVEWNDTRKTIMEOUT 0x2003\n#define SPI_GETFOREGROUNDFLASHCOUNT 0x2004\n#define SPI_SETFOREGROUNDFLASHCOUNT 0x2005\n#define SPI_GETCARETWIDTH 0x2006\n#define SPI_SETCARETWIDTH 0x2007\n#define SPI_GETMOUSECLICKLOCKTIME 0x2008\n#define SPI_SETMOUSECLICKLOCKTIME 0x2009\n#define SPI_GETFONTSMOOTHINGTYPE 0x200A\n#define SPI_SETFONTSMOOTHINGTYPE 0x200B\n\n#define FE_FONTSMOOTHINGSTANDARD 0x0001\n#define FE_FONTSMOOTHINGCLEARTYPE 0x0002\n#define FE_FONTSMOOTHINGDOCKING 0x8000\n\n#define SPI_GETFONTSMOOTHINGCONTRAST 0x200C\n#define SPI_SETFONTSMOOTHINGCONTRAST 0x200D\n#define SPI_GETFOCUSBORDERWIDTH 0x200E\n#define SPI_SETFOCUSBORDERWIDTH 0x200F\n#define SPI_GETFOCUSBORDERHEIGHT 0x2010\n#define SPI_SETFOCUSBORDERHEIGHT 0x2011\n#define SPI_GETFONTSMOOTHINGORIENTATION 0x2012\n#define SPI_SETFONTSMOOTHINGORIENTATION 0x2013\n\n#define FE_FONTSMOOTHINGORIENTATIONBGR 0x0000\n#define FE_FONTSMOOTHINGORIENTATIONRGB 0x0001\n\n#define SPIF_UPDATEINIFILE 0x0001\n#define SPIF_SENDWININICHANGE 0x0002\n#define SPIF_SENDCHANGE SPIF_SENDWININICHANGE\n\n#define METRICS_USEDEFAULT -1\n#ifdef _WINGDI_\n#ifndef NOGDI\n  typedef struct tagNONCLIENTMETRICSA {\n    UINT cbSize;\n    int iBorderWidth;\n    int iScrollWidth;\n    int iScrollHeight;\n    int iCaptionWidth;\n    int iCaptionHeight;\n    LOGFONTA lfCaptionFont;\n    int iSmCaptionWidth;\n    int iSmCaptionHeight;\n    LOGFONTA lfSmCaptionFont;\n    int iMenuWidth;\n    int iMenuHeight;\n    LOGFONTA lfMenuFont;\n    LOGFONTA lfStatusFont;\n    LOGFONTA lfMessageFont;\n  } NONCLIENTMETRICSA,*PNONCLIENTMETRICSA,*LPNONCLIENTMETRICSA;\n\n  typedef struct tagNONCLIENTMETRICSW {\n    UINT cbSize;\n    int iBorderWidth;\n    int iScrollWidth;\n    int iScrollHeight;\n    int iCaptionWidth;\n    int iCaptionHeight;\n    LOGFONTW lfCaptionFont;\n    int iSmCaptionWidth;\n    int iSmCaptionHeight;\n    LOGFONTW lfSmCaptionFont;\n    int iMenuWidth;\n    int iMenuHeight;\n    LOGFONTW lfMenuFont;\n    LOGFONTW lfStatusFont;\n    LOGFONTW lfMessageFont;\n  } NONCLIENTMETRICSW,*PNONCLIENTMETRICSW,*LPNONCLIENTMETRICSW;\n\n#ifdef UNICODE\n  typedef NONCLIENTMETRICSW NONCLIENTMETRICS;\n  typedef PNONCLIENTMETRICSW PNONCLIENTMETRICS;\n  typedef LPNONCLIENTMETRICSW LPNONCLIENTMETRICS;\n#else\n  typedef NONCLIENTMETRICSA NONCLIENTMETRICS;\n  typedef PNONCLIENTMETRICSA PNONCLIENTMETRICS;\n  typedef LPNONCLIENTMETRICSA LPNONCLIENTMETRICS;\n#endif\n#endif\n#endif\n\n#define ARW_BOTTOMLEFT 0x0000L\n#define ARW_BOTTOMRIGHT 0x0001L\n#define ARW_TOPLEFT 0x0002L\n#define ARW_TOPRIGHT 0x0003L\n#define ARW_STARTMASK 0x0003L\n#define ARW_STARTRIGHT 0x0001L\n#define ARW_STARTTOP 0x0002L\n\n#define ARW_LEFT 0x0000L\n#define ARW_RIGHT 0x0000L\n#define ARW_UP 0x0004L\n#define ARW_DOWN 0x0004L\n#define ARW_HIDE 0x0008L\n\n  typedef struct tagMINIMIZEDMETRICS {\n    UINT cbSize;\n    int iWidth;\n    int iHorzGap;\n    int iVertGap;\n    int iArrange;\n  } MINIMIZEDMETRICS,*PMINIMIZEDMETRICS,*LPMINIMIZEDMETRICS;\n\n#ifdef _WINGDI_\n#ifndef NOGDI\n  typedef struct tagICONMETRICSA {\n    UINT cbSize;\n    int iHorzSpacing;\n    int iVertSpacing;\n    int iTitleWrap;\n    LOGFONTA lfFont;\n  } ICONMETRICSA,*PICONMETRICSA,*LPICONMETRICSA;\n\n  typedef struct tagICONMETRICSW {\n    UINT cbSize;\n    int iHorzSpacing;\n    int iVertSpacing;\n    int iTitleWrap;\n    LOGFONTW lfFont;\n  } ICONMETRICSW,*PICONMETRICSW,*LPICONMETRICSW;\n\n#ifdef UNICODE\n  typedef ICONMETRICSW ICONMETRICS;\n  typedef PICONMETRICSW PICONMETRICS;\n  typedef LPICONMETRICSW LPICONMETRICS;\n#else\n  typedef ICONMETRICSA ICONMETRICS;\n  typedef PICONMETRICSA PICONMETRICS;\n  typedef LPICONMETRICSA LPICONMETRICS;\n#endif\n#endif\n#endif\n\n  typedef struct tagANIMATIONINFO {\n    UINT cbSize;\n    int iMinAnimate;\n  } ANIMATIONINFO,*LPANIMATIONINFO;\n\n  typedef struct tagSERIALKEYSA {\n    UINT cbSize;\n    DWORD dwFlags;\n    LPSTR lpszActivePort;\n    LPSTR lpszPort;\n    UINT iBaudRate;\n    UINT iPortState;\n    UINT iActive;\n  } SERIALKEYSA,*LPSERIALKEYSA;\n\n  typedef struct tagSERIALKEYSW {\n    UINT cbSize;\n    DWORD dwFlags;\n    LPWSTR lpszActivePort;\n    LPWSTR lpszPort;\n    UINT iBaudRate;\n    UINT iPortState;\n    UINT iActive;\n  } SERIALKEYSW,*LPSERIALKEYSW;\n\n#ifdef UNICODE\n  typedef SERIALKEYSW SERIALKEYS;\n  typedef LPSERIALKEYSW LPSERIALKEYS;\n#else\n  typedef SERIALKEYSA SERIALKEYS;\n  typedef LPSERIALKEYSA LPSERIALKEYS;\n#endif\n\n#define SERKF_SERIALKEYSON 0x00000001\n#define SERKF_AVAILABLE 0x00000002\n#define SERKF_INDICATOR 0x00000004\n\n  typedef struct tagHIGHCONTRASTA {\n    UINT cbSize;\n    DWORD dwFlags;\n    LPSTR lpszDefaultScheme;\n  } HIGHCONTRASTA,*LPHIGHCONTRASTA;\n\n  typedef struct tagHIGHCONTRASTW {\n    UINT cbSize;\n    DWORD dwFlags;\n    LPWSTR lpszDefaultScheme;\n  } HIGHCONTRASTW,*LPHIGHCONTRASTW;\n\n#ifdef UNICODE\n  typedef HIGHCONTRASTW HIGHCONTRAST;\n  typedef LPHIGHCONTRASTW LPHIGHCONTRAST;\n#else\n  typedef HIGHCONTRASTA HIGHCONTRAST;\n  typedef LPHIGHCONTRASTA LPHIGHCONTRAST;\n#endif\n\n#define HCF_HIGHCONTRASTON 0x00000001\n#define HCF_AVAILABLE 0x00000002\n#define HCF_HOTKEYACTIVE 0x00000004\n#define HCF_CONFIRMHOTKEY 0x00000008\n#define HCF_HOTKEYSOUND 0x00000010\n#define HCF_INDICATOR 0x00000020\n#define HCF_HOTKEYAVAILABLE 0x00000040\n#define HCF_LOGONDESKTOP 0x00000100\n#define HCF_DEFAULTDESKTOP 0x00000200\n\n#define CDS_UPDATEREGISTRY 0x00000001\n#define CDS_TEST 0x00000002\n#define CDS_FULLSCREEN 0x00000004\n#define CDS_GLOBAL 0x00000008\n#define CDS_SET_PRIMARY 0x00000010\n#define CDS_VIDEOPARAMETERS 0x00000020\n#define CDS_RESET 0x40000000\n#define CDS_NORESET 0x10000000\n\n#include <tvout.h>\n\n#define DISP_CHANGE_SUCCESSFUL 0\n#define DISP_CHANGE_RESTART 1\n#define DISP_CHANGE_FAILED -1\n#define DISP_CHANGE_BADMODE -2\n#define DISP_CHANGE_NOTUPDATED -3\n#define DISP_CHANGE_BADFLAGS -4\n#define DISP_CHANGE_BADPARAM -5\n#define DISP_CHANGE_BADDUALVIEW -6\n\n#ifdef _WINGDI_\n#ifndef NOGDI\n\n#ifdef UNICODE\n#define ChangeDisplaySettings ChangeDisplaySettingsW\n#define ChangeDisplaySettingsEx ChangeDisplaySettingsExW\n#define EnumDisplaySettings EnumDisplaySettingsW\n#define EnumDisplaySettingsEx EnumDisplaySettingsExW\n#define EnumDisplayDevices EnumDisplayDevicesW\n#else\n#define ChangeDisplaySettings ChangeDisplaySettingsA\n#define ChangeDisplaySettingsEx ChangeDisplaySettingsExA\n#define EnumDisplaySettings EnumDisplaySettingsA\n#define EnumDisplaySettingsEx EnumDisplaySettingsExA\n#define EnumDisplayDevices EnumDisplayDevicesA\n#endif\n\n  WINUSERAPI LONG WINAPI ChangeDisplaySettingsA(LPDEVMODEA lpDevMode,DWORD dwFlags);\n  WINUSERAPI LONG WINAPI ChangeDisplaySettingsW(LPDEVMODEW lpDevMode,DWORD dwFlags);\n  WINUSERAPI LONG WINAPI ChangeDisplaySettingsExA(LPCSTR lpszDeviceName,LPDEVMODEA lpDevMode,HWND hwnd,DWORD dwflags,LPVOID lParam);\n  WINUSERAPI LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName,LPDEVMODEW lpDevMode,HWND hwnd,DWORD dwflags,LPVOID lParam);\n\n#define ENUM_CURRENT_SETTINGS ((DWORD)-1)\n#define ENUM_REGISTRY_SETTINGS ((DWORD)-2)\n\n  WINUSERAPI WINBOOL WINAPI EnumDisplaySettingsA(LPCSTR lpszDeviceName,DWORD iModeNum,LPDEVMODEA lpDevMode);\n  WINUSERAPI WINBOOL WINAPI EnumDisplaySettingsW(LPCWSTR lpszDeviceName,DWORD iModeNum,LPDEVMODEW lpDevMode);\n  WINUSERAPI WINBOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName,DWORD iModeNum,LPDEVMODEA lpDevMode,DWORD dwFlags);\n  WINUSERAPI WINBOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName,DWORD iModeNum,LPDEVMODEW lpDevMode,DWORD dwFlags);\n\n#define EDS_RAWMODE 0x00000002\n\n  WINUSERAPI WINBOOL WINAPI EnumDisplayDevicesA(LPCSTR lpDevice,DWORD iDevNum,PDISPLAY_DEVICEA lpDisplayDevice,DWORD dwFlags);\n  WINUSERAPI WINBOOL WINAPI EnumDisplayDevicesW(LPCWSTR lpDevice,DWORD iDevNum,PDISPLAY_DEVICEW lpDisplayDevice,DWORD dwFlags);\n#endif\n#endif\n\n#ifdef UNICODE\n#define SystemParametersInfo SystemParametersInfoW\n#else\n#define SystemParametersInfo SystemParametersInfoA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI SystemParametersInfoA(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinIni);\n  WINUSERAPI WINBOOL WINAPI SystemParametersInfoW(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinIni);\n#endif\n\n  typedef struct tagFILTERKEYS {\n    UINT cbSize;\n    DWORD dwFlags;\n    DWORD iWaitMSec;\n    DWORD iDelayMSec;\n    DWORD iRepeatMSec;\n    DWORD iBounceMSec;\n  } FILTERKEYS,*LPFILTERKEYS;\n\n#define FKF_FILTERKEYSON 0x00000001\n#define FKF_AVAILABLE 0x00000002\n#define FKF_HOTKEYACTIVE 0x00000004\n#define FKF_CONFIRMHOTKEY 0x00000008\n#define FKF_HOTKEYSOUND 0x00000010\n#define FKF_INDICATOR 0x00000020\n#define FKF_CLICKON 0x00000040\n\n  typedef struct tagSTICKYKEYS {\n    UINT cbSize;\n    DWORD dwFlags;\n  } STICKYKEYS,*LPSTICKYKEYS;\n\n#define SKF_STICKYKEYSON 0x00000001\n#define SKF_AVAILABLE 0x00000002\n#define SKF_HOTKEYACTIVE 0x00000004\n#define SKF_CONFIRMHOTKEY 0x00000008\n#define SKF_HOTKEYSOUND 0x00000010\n#define SKF_INDICATOR 0x00000020\n#define SKF_AUDIBLEFEEDBACK 0x00000040\n#define SKF_TRISTATE 0x00000080\n#define SKF_TWOKEYSOFF 0x00000100\n#define SKF_LALTLATCHED 0x10000000\n#define SKF_LCTLLATCHED 0x04000000\n#define SKF_LSHIFTLATCHED 0x01000000\n#define SKF_RALTLATCHED 0x20000000\n#define SKF_RCTLLATCHED 0x08000000\n#define SKF_RSHIFTLATCHED 0x02000000\n#define SKF_LWINLATCHED 0x40000000\n#define SKF_RWINLATCHED 0x80000000\n#define SKF_LALTLOCKED 0x00100000\n#define SKF_LCTLLOCKED 0x00040000\n#define SKF_LSHIFTLOCKED 0x00010000\n#define SKF_RALTLOCKED 0x00200000\n#define SKF_RCTLLOCKED 0x00080000\n#define SKF_RSHIFTLOCKED 0x00020000\n#define SKF_LWINLOCKED 0x00400000\n#define SKF_RWINLOCKED 0x00800000\n\n  typedef struct tagMOUSEKEYS {\n    UINT cbSize;\n    DWORD dwFlags;\n    DWORD iMaxSpeed;\n    DWORD iTimeToMaxSpeed;\n    DWORD iCtrlSpeed;\n    DWORD dwReserved1;\n    DWORD dwReserved2;\n  } MOUSEKEYS,*LPMOUSEKEYS;\n\n#define MKF_MOUSEKEYSON 0x00000001\n#define MKF_AVAILABLE 0x00000002\n#define MKF_HOTKEYACTIVE 0x00000004\n#define MKF_CONFIRMHOTKEY 0x00000008\n#define MKF_HOTKEYSOUND 0x00000010\n#define MKF_INDICATOR 0x00000020\n#define MKF_MODIFIERS 0x00000040\n#define MKF_REPLACENUMBERS 0x00000080\n#define MKF_LEFTBUTTONSEL 0x10000000\n#define MKF_RIGHTBUTTONSEL 0x20000000\n#define MKF_LEFTBUTTONDOWN 0x01000000\n#define MKF_RIGHTBUTTONDOWN 0x02000000\n#define MKF_MOUSEMODE 0x80000000\n\n  typedef struct tagACCESSTIMEOUT {\n    UINT cbSize;\n    DWORD dwFlags;\n    DWORD iTimeOutMSec;\n  } ACCESSTIMEOUT,*LPACCESSTIMEOUT;\n\n#define ATF_TIMEOUTON 0x00000001\n#define ATF_ONOFFFEEDBACK 0x00000002\n\n#define SSGF_NONE 0\n#define SSGF_DISPLAY 3\n\n#define SSTF_NONE 0\n#define SSTF_CHARS 1\n#define SSTF_BORDER 2\n#define SSTF_DISPLAY 3\n\n#define SSWF_NONE 0\n#define SSWF_TITLE 1\n#define SSWF_WINDOW 2\n#define SSWF_DISPLAY 3\n#define SSWF_CUSTOM 4\n\n  typedef struct tagSOUNDSENTRYA {\n    UINT cbSize;\n    DWORD dwFlags;\n    DWORD iFSTextEffect;\n    DWORD iFSTextEffectMSec;\n    DWORD iFSTextEffectColorBits;\n    DWORD iFSGrafEffect;\n    DWORD iFSGrafEffectMSec;\n    DWORD iFSGrafEffectColor;\n    DWORD iWindowsEffect;\n    DWORD iWindowsEffectMSec;\n    LPSTR lpszWindowsEffectDLL;\n    DWORD iWindowsEffectOrdinal;\n  } SOUNDSENTRYA,*LPSOUNDSENTRYA;\n\n  typedef struct tagSOUNDSENTRYW {\n    UINT cbSize;\n    DWORD dwFlags;\n    DWORD iFSTextEffect;\n    DWORD iFSTextEffectMSec;\n    DWORD iFSTextEffectColorBits;\n    DWORD iFSGrafEffect;\n    DWORD iFSGrafEffectMSec;\n    DWORD iFSGrafEffectColor;\n    DWORD iWindowsEffect;\n    DWORD iWindowsEffectMSec;\n    LPWSTR lpszWindowsEffectDLL;\n    DWORD iWindowsEffectOrdinal;\n  } SOUNDSENTRYW,*LPSOUNDSENTRYW;\n\n#ifdef UNICODE\n  typedef SOUNDSENTRYW SOUNDSENTRY;\n  typedef LPSOUNDSENTRYW LPSOUNDSENTRY;\n#else\n  typedef SOUNDSENTRYA SOUNDSENTRY;\n  typedef LPSOUNDSENTRYA LPSOUNDSENTRY;\n#endif\n\n#define SSF_SOUNDSENTRYON 0x00000001\n#define SSF_AVAILABLE 0x00000002\n#define SSF_INDICATOR 0x00000004\n\n  typedef struct tagTOGGLEKEYS {\n    UINT cbSize;\n    DWORD dwFlags;\n  } TOGGLEKEYS,*LPTOGGLEKEYS;\n\n#define TKF_TOGGLEKEYSON 0x00000001\n#define TKF_AVAILABLE 0x00000002\n#define TKF_HOTKEYACTIVE 0x00000004\n#define TKF_CONFIRMHOTKEY 0x00000008\n#define TKF_HOTKEYSOUND 0x00000010\n#define TKF_INDICATOR 0x00000020\n\n  WINUSERAPI VOID WINAPI SetDebugErrorLevel(DWORD dwLevel);\n\n#define SLE_ERROR 0x00000001\n#define SLE_MINORERROR 0x00000002\n#define SLE_WARNING 0x00000003\n\n  WINUSERAPI VOID WINAPI SetLastErrorEx(DWORD dwErrCode,DWORD dwType);\n  WINUSERAPI int WINAPI InternalGetWindowText(HWND hWnd,LPWSTR pString,int cchMaxCount);\n\n#ifdef WINNT\n  WINUSERAPI WINBOOL WINAPI EndTask(HWND hWnd,WINBOOL fShutDown,WINBOOL fForce);\n#endif\n\n#define MONITOR_DEFAULTTONULL 0x00000000\n#define MONITOR_DEFAULTTOPRIMARY 0x00000001\n#define MONITOR_DEFAULTTONEAREST 0x00000002\n\n  WINUSERAPI HMONITOR WINAPI MonitorFromPoint(POINT pt,DWORD dwFlags);\n  WINUSERAPI HMONITOR WINAPI MonitorFromRect(LPCRECT lprc,DWORD dwFlags);\n  WINUSERAPI HMONITOR WINAPI MonitorFromWindow(HWND hwnd,DWORD dwFlags);\n\n#define MONITORINFOF_PRIMARY 0x00000001\n\n#ifndef CCHDEVICENAME\n#define CCHDEVICENAME 32\n#endif\n\n  typedef struct tagMONITORINFO {\n    DWORD cbSize;\n    RECT rcMonitor;\n    RECT rcWork;\n    DWORD dwFlags;\n  } MONITORINFO,*LPMONITORINFO;\n\n#ifdef __cplusplus\n  typedef struct tagMONITORINFOEXA : public tagMONITORINFO {\n    CHAR szDevice[CCHDEVICENAME];\n  } MONITORINFOEXA,*LPMONITORINFOEXA;\n\n  typedef struct tagMONITORINFOEXW : public tagMONITORINFO {\n    WCHAR szDevice[CCHDEVICENAME];\n  } MONITORINFOEXW,*LPMONITORINFOEXW;\n\n#ifdef UNICODE\n  typedef MONITORINFOEXW MONITORINFOEX;\n  typedef LPMONITORINFOEXW LPMONITORINFOEX;\n#else\n  typedef MONITORINFOEXA MONITORINFOEX;\n  typedef LPMONITORINFOEXA LPMONITORINFOEX;\n#endif\n#else\n  typedef struct tagMONITORINFOEXA {\n    MONITORINFO mi;\n    CHAR szDevice[CCHDEVICENAME];\n  } MONITORINFOEXA,*LPMONITORINFOEXA;\n\n  typedef struct tagMONITORINFOEXW {\n    MONITORINFO mi;\n    WCHAR szDevice[CCHDEVICENAME];\n  } MONITORINFOEXW,*LPMONITORINFOEXW;\n#ifdef UNICODE\n  typedef MONITORINFOEXW MONITORINFOEX;\n  typedef LPMONITORINFOEXW LPMONITORINFOEX;\n#else\n  typedef MONITORINFOEXA MONITORINFOEX;\n  typedef LPMONITORINFOEXA LPMONITORINFOEX;\n#endif\n#endif\n\n#ifdef UNICODE \n#define GetMonitorInfo GetMonitorInfoW\n#else\n#define GetMonitorInfo GetMonitorInfoA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GetMonitorInfoA(HMONITOR hMonitor,LPMONITORINFO lpmi);\n  WINUSERAPI WINBOOL WINAPI GetMonitorInfoW(HMONITOR hMonitor,LPMONITORINFO lpmi);\n\n  typedef WINBOOL (CALLBACK *MONITORENUMPROC)(HMONITOR,HDC,LPRECT,LPARAM);\n\n  WINUSERAPI WINBOOL WINAPI EnumDisplayMonitors(HDC hdc,LPCRECT lprcClip,MONITORENUMPROC lpfnEnum,LPARAM dwData);\n\n#ifndef NOWINABLE\n  WINUSERAPI VOID WINAPI NotifyWinEvent(DWORD event,HWND hwnd,LONG idObject,LONG idChild);\n\n  typedef VOID (CALLBACK *WINEVENTPROC)(HWINEVENTHOOK hWinEventHook,DWORD event,HWND hwnd,LONG idObject,LONG idChild,DWORD idEventThread,DWORD dwmsEventTime);\n\n  WINUSERAPI HWINEVENTHOOK WINAPI SetWinEventHook(DWORD eventMin,DWORD eventMax,HMODULE hmodWinEventProc,WINEVENTPROC pfnWinEventProc,DWORD idProcess,DWORD idThread,DWORD dwFlags);\n  WINUSERAPI WINBOOL WINAPI IsWinEventHookInstalled(DWORD event);\n\n#define WINEVENT_OUTOFCONTEXT 0x0000\n#define WINEVENT_SKIPOWNTHREAD 0x0001\n#define WINEVENT_SKIPOWNPROCESS 0x0002\n#define WINEVENT_INCONTEXT 0x0004\n\n  WINUSERAPI WINBOOL WINAPI UnhookWinEvent(HWINEVENTHOOK hWinEventHook);\n\n#define CHILDID_SELF 0\n#define INDEXID_OBJECT 0\n#define INDEXID_CONTAINER 0\n\n#define OBJID_WINDOW ((LONG)0x00000000)\n#define OBJID_SYSMENU ((LONG)0xFFFFFFFF)\n#define OBJID_TITLEBAR ((LONG)0xFFFFFFFE)\n#define OBJID_MENU ((LONG)0xFFFFFFFD)\n#define OBJID_CLIENT ((LONG)0xFFFFFFFC)\n#define OBJID_VSCROLL ((LONG)0xFFFFFFFB)\n#define OBJID_HSCROLL ((LONG)0xFFFFFFFA)\n#define OBJID_SIZEGRIP ((LONG)0xFFFFFFF9)\n#define OBJID_CARET ((LONG)0xFFFFFFF8)\n#define OBJID_CURSOR ((LONG)0xFFFFFFF7)\n#define OBJID_ALERT ((LONG)0xFFFFFFF6)\n#define OBJID_SOUND ((LONG)0xFFFFFFF5)\n#define OBJID_QUERYCLASSNAMEIDX ((LONG)0xFFFFFFF4)\n#define OBJID_NATIVEOM ((LONG)0xFFFFFFF0)\n\n#define EVENT_MIN 0x00000001\n#define EVENT_MAX 0x7FFFFFFF\n\n#define EVENT_SYSTEM_SOUND 0x0001\n#define EVENT_SYSTEM_ALERT 0x0002\n#define EVENT_SYSTEM_FOREGROUND 0x0003\n#define EVENT_SYSTEM_MENUSTART 0x0004\n#define EVENT_SYSTEM_MENUEND 0x0005\n#define EVENT_SYSTEM_MENUPOPUPSTART 0x0006\n#define EVENT_SYSTEM_MENUPOPUPEND 0x0007\n#define EVENT_SYSTEM_CAPTURESTART 0x0008\n#define EVENT_SYSTEM_CAPTUREEND 0x0009\n#define EVENT_SYSTEM_MOVESIZESTART 0x000A\n#define EVENT_SYSTEM_MOVESIZEEND 0x000B\n#define EVENT_SYSTEM_CONTEXTHELPSTART 0x000C\n#define EVENT_SYSTEM_CONTEXTHELPEND 0x000D\n#define EVENT_SYSTEM_DRAGDROPSTART 0x000E\n#define EVENT_SYSTEM_DRAGDROPEND 0x000F\n#define EVENT_SYSTEM_DIALOGSTART 0x0010\n#define EVENT_SYSTEM_DIALOGEND 0x0011\n#define EVENT_SYSTEM_SCROLLINGSTART 0x0012\n#define EVENT_SYSTEM_SCROLLINGEND 0x0013\n#define EVENT_SYSTEM_SWITCHSTART 0x0014\n#define EVENT_SYSTEM_SWITCHEND 0x0015\n#define EVENT_SYSTEM_MINIMIZESTART 0x0016\n#define EVENT_SYSTEM_MINIMIZEEND 0x0017\n\n#define EVENT_CONSOLE_CARET 0x4001\n#define EVENT_CONSOLE_UPDATE_REGION 0x4002\n#define EVENT_CONSOLE_UPDATE_SIMPLE 0x4003\n#define EVENT_CONSOLE_UPDATE_SCROLL 0x4004\n#define EVENT_CONSOLE_LAYOUT 0x4005\n#define EVENT_CONSOLE_START_APPLICATION 0x4006\n#define EVENT_CONSOLE_END_APPLICATION 0x4007\n\n#define CONSOLE_APPLICATION_16BIT 0x0001\n\n#define CONSOLE_CARET_SELECTION 0x0001\n#define CONSOLE_CARET_VISIBLE 0x0002\n\n#define EVENT_OBJECT_CREATE 0x8000\n#define EVENT_OBJECT_DESTROY 0x8001\n#define EVENT_OBJECT_SHOW 0x8002\n#define EVENT_OBJECT_HIDE 0x8003\n#define EVENT_OBJECT_REORDER 0x8004\n\n#define EVENT_OBJECT_FOCUS 0x8005\n#define EVENT_OBJECT_SELECTION 0x8006\n#define EVENT_OBJECT_SELECTIONADD 0x8007\n#define EVENT_OBJECT_SELECTIONREMOVE 0x8008\n#define EVENT_OBJECT_SELECTIONWITHIN 0x8009\n\n#define EVENT_OBJECT_STATECHANGE 0x800A\n\n#define EVENT_OBJECT_LOCATIONCHANGE 0x800B\n\n#define EVENT_OBJECT_NAMECHANGE 0x800C\n#define EVENT_OBJECT_DESCRIPTIONCHANGE 0x800D\n#define EVENT_OBJECT_VALUECHANGE 0x800E\n#define EVENT_OBJECT_PARENTCHANGE 0x800F\n#define EVENT_OBJECT_HELPCHANGE 0x8010\n#define EVENT_OBJECT_DEFACTIONCHANGE 0x8011\n#define EVENT_OBJECT_ACCELERATORCHANGE 0x8012\n\n#define SOUND_SYSTEM_STARTUP 1\n#define SOUND_SYSTEM_SHUTDOWN 2\n#define SOUND_SYSTEM_BEEP 3\n#define SOUND_SYSTEM_ERROR 4\n#define SOUND_SYSTEM_QUESTION 5\n#define SOUND_SYSTEM_WARNING 6\n#define SOUND_SYSTEM_INFORMATION 7\n#define SOUND_SYSTEM_MAXIMIZE 8\n#define SOUND_SYSTEM_MINIMIZE 9\n#define SOUND_SYSTEM_RESTOREUP 10\n#define SOUND_SYSTEM_RESTOREDOWN 11\n#define SOUND_SYSTEM_APPSTART 12\n#define SOUND_SYSTEM_FAULT 13\n#define SOUND_SYSTEM_APPEND 14\n#define SOUND_SYSTEM_MENUCOMMAND 15\n#define SOUND_SYSTEM_MENUPOPUP 16\n#define CSOUND_SYSTEM 16\n\n#define ALERT_SYSTEM_INFORMATIONAL 1\n#define ALERT_SYSTEM_WARNING 2\n#define ALERT_SYSTEM_ERROR 3\n#define ALERT_SYSTEM_QUERY 4\n#define ALERT_SYSTEM_CRITICAL 5\n#define CALERT_SYSTEM 6\n\n  typedef struct tagGUITHREADINFO {\n    DWORD cbSize;\n    DWORD flags;\n    HWND hwndActive;\n    HWND hwndFocus;\n    HWND hwndCapture;\n    HWND hwndMenuOwner;\n    HWND hwndMoveSize;\n    HWND hwndCaret;\n    RECT rcCaret;\n  } GUITHREADINFO,*PGUITHREADINFO,*LPGUITHREADINFO;\n\n#define GUI_CARETBLINKING 0x00000001\n#define GUI_INMOVESIZE 0x00000002\n#define GUI_INMENUMODE 0x00000004\n#define GUI_SYSTEMMENUMODE 0x00000008\n#define GUI_POPUPMENUMODE 0x00000010\n#define GUI_16BITTASK 0x00000020\n\n#ifdef UNICODE\n#define GetWindowModuleFileName GetWindowModuleFileNameW\n#else\n#define GetWindowModuleFileName GetWindowModuleFileNameA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GetGUIThreadInfo(DWORD idThread,PGUITHREADINFO pgui);\n  WINUSERAPI UINT WINAPI GetWindowModuleFileNameA(HWND hwnd,LPSTR pszFileName,UINT cchFileNameMax);\n  WINUSERAPI UINT WINAPI GetWindowModuleFileNameW(HWND hwnd,LPWSTR pszFileName,UINT cchFileNameMax);\n\n#ifndef NO_STATE_FLAGS\n#define STATE_SYSTEM_UNAVAILABLE 0x00000001\n#define STATE_SYSTEM_SELECTED 0x00000002\n#define STATE_SYSTEM_FOCUSED 0x00000004\n#define STATE_SYSTEM_PRESSED 0x00000008\n#define STATE_SYSTEM_CHECKED 0x00000010\n#define STATE_SYSTEM_MIXED 0x00000020\n#define STATE_SYSTEM_INDETERMINATE STATE_SYSTEM_MIXED\n#define STATE_SYSTEM_READONLY 0x00000040\n#define STATE_SYSTEM_HOTTRACKED 0x00000080\n#define STATE_SYSTEM_DEFAULT 0x00000100\n#define STATE_SYSTEM_EXPANDED 0x00000200\n#define STATE_SYSTEM_COLLAPSED 0x00000400\n#define STATE_SYSTEM_BUSY 0x00000800\n#define STATE_SYSTEM_FLOATING 0x00001000\n#define STATE_SYSTEM_MARQUEED 0x00002000\n#define STATE_SYSTEM_ANIMATED 0x00004000\n#define STATE_SYSTEM_INVISIBLE 0x00008000\n#define STATE_SYSTEM_OFFSCREEN 0x00010000\n#define STATE_SYSTEM_SIZEABLE 0x00020000\n#define STATE_SYSTEM_MOVEABLE 0x00040000\n#define STATE_SYSTEM_SELFVOICING 0x00080000\n#define STATE_SYSTEM_FOCUSABLE 0x00100000\n#define STATE_SYSTEM_SELECTABLE 0x00200000\n#define STATE_SYSTEM_LINKED 0x00400000\n#define STATE_SYSTEM_TRAVERSED 0x00800000\n#define STATE_SYSTEM_MULTISELECTABLE 0x01000000\n#define STATE_SYSTEM_EXTSELECTABLE 0x02000000\n#define STATE_SYSTEM_ALERT_LOW 0x04000000\n#define STATE_SYSTEM_ALERT_MEDIUM 0x08000000\n#define STATE_SYSTEM_ALERT_HIGH 0x10000000\n#define STATE_SYSTEM_PROTECTED 0x20000000\n#define STATE_SYSTEM_VALID 0x3FFFFFFF\n#endif\n\n#define CCHILDREN_TITLEBAR 5\n#define CCHILDREN_SCROLLBAR 5\n\n  typedef struct tagCURSORINFO {\n    DWORD cbSize;\n    DWORD flags;\n    HCURSOR hCursor;\n    POINT ptScreenPos;\n  } CURSORINFO,*PCURSORINFO,*LPCURSORINFO;\n\n#define CURSOR_SHOWING 0x00000001\n\n  WINUSERAPI WINBOOL WINAPI GetCursorInfo(PCURSORINFO pci);\n\n  typedef struct tagWINDOWINFO {\n    DWORD cbSize;\n    RECT rcWindow;\n    RECT rcClient;\n    DWORD dwStyle;\n    DWORD dwExStyle;\n    DWORD dwWindowStatus;\n    UINT cxWindowBorders;\n    UINT cyWindowBorders;\n    ATOM atomWindowType;\n    WORD wCreatorVersion;\n  } WINDOWINFO,*PWINDOWINFO,*LPWINDOWINFO;\n\n#define WS_ACTIVECAPTION 0x0001\n\n  WINUSERAPI WINBOOL WINAPI GetWindowInfo(HWND hwnd,PWINDOWINFO pwi);\n\n  typedef struct tagTITLEBARINFO {\n    DWORD cbSize;\n    RECT rcTitleBar;\n    DWORD rgstate[CCHILDREN_TITLEBAR + 1];\n  } TITLEBARINFO,*PTITLEBARINFO,*LPTITLEBARINFO;\n\n  WINUSERAPI WINBOOL WINAPI GetTitleBarInfo(HWND hwnd,PTITLEBARINFO pti);\n\n  typedef struct tagMENUBARINFO {\n    DWORD cbSize;\n    RECT rcBar;\n    HMENU hMenu;\n    HWND hwndMenu;\n    WINBOOL fBarFocused:1;\n    WINBOOL fFocused:1;\n  } MENUBARINFO,*PMENUBARINFO,*LPMENUBARINFO;\n\n  WINUSERAPI WINBOOL WINAPI GetMenuBarInfo(HWND hwnd,LONG idObject,LONG idItem,PMENUBARINFO pmbi);\n\n  typedef struct tagSCROLLBARINFO {\n    DWORD cbSize;\n    RECT rcScrollBar;\n    int dxyLineButton;\n    int xyThumbTop;\n    int xyThumbBottom;\n    int reserved;\n    DWORD rgstate[CCHILDREN_SCROLLBAR + 1];\n  } SCROLLBARINFO,*PSCROLLBARINFO,*LPSCROLLBARINFO;\n\n  WINUSERAPI WINBOOL WINAPI GetScrollBarInfo(HWND hwnd,LONG idObject,PSCROLLBARINFO psbi);\n\n  typedef struct tagCOMBOBOXINFO {\n    DWORD cbSize;\n    RECT rcItem;\n    RECT rcButton;\n    DWORD stateButton;\n    HWND hwndCombo;\n    HWND hwndItem;\n    HWND hwndList;\n  } COMBOBOXINFO,*PCOMBOBOXINFO,*LPCOMBOBOXINFO;\n\n  WINUSERAPI WINBOOL WINAPI GetComboBoxInfo(HWND hwndCombo,PCOMBOBOXINFO pcbi);\n\n#define GA_PARENT 1\n#define GA_ROOT 2\n#define GA_ROOTOWNER 3\n\n  WINUSERAPI HWND WINAPI GetAncestor(HWND hwnd,UINT gaFlags);\n  WINUSERAPI HWND WINAPI RealChildWindowFromPoint(HWND hwndParent,POINT ptParentClientCoords);\n  WINUSERAPI UINT WINAPI RealGetWindowClassA(HWND hwnd,LPSTR ptszClassName,UINT cchClassNameMax);\n  WINUSERAPI UINT WINAPI RealGetWindowClassW(HWND hwnd,LPWSTR ptszClassName,UINT cchClassNameMax);\n#ifdef UNICODE\n#define RealGetWindowClass RealGetWindowClassW\n#else\n#define RealGetWindowClass RealGetWindowClassA\n#endif\n\n  typedef struct tagALTTABINFO {\n    DWORD cbSize;\n    int cItems;\n    int cColumns;\n    int cRows;\n    int iColFocus;\n    int iRowFocus;\n    int cxItem;\n    int cyItem;\n    POINT ptStart;\n  } ALTTABINFO,*PALTTABINFO,*LPALTTABINFO;\n\n#ifdef UNICODE\n#define GetAltTabInfo GetAltTabInfoW\n#else\n#define GetAltTabInfo GetAltTabInfoA\n#endif\n\n  WINUSERAPI WINBOOL WINAPI GetAltTabInfoA(HWND hwnd,int iItem,PALTTABINFO pati,LPSTR pszItemText,UINT cchItemText);\n  WINUSERAPI WINBOOL WINAPI GetAltTabInfoW(HWND hwnd,int iItem,PALTTABINFO pati,LPWSTR pszItemText,UINT cchItemText);\n  WINUSERAPI DWORD WINAPI GetListBoxInfo(HWND hwnd);\n#endif\n\n  WINUSERAPI WINBOOL WINAPI LockWorkStation(VOID);\n  WINUSERAPI WINBOOL WINAPI UserHandleGrantAccess(HANDLE hUserHandle,HANDLE hJob,WINBOOL bGrant);\n\n  DECLARE_HANDLE(HRAWINPUT);\n\n#define GET_RAWINPUT_CODE_WPARAM(wParam) ((wParam) & 0xff)\n\n#define RIM_INPUT 0\n#define RIM_INPUTSINK 1\n\n  typedef struct tagRAWINPUTHEADER {\n    DWORD dwType;\n    DWORD dwSize;\n    HANDLE hDevice;\n    WPARAM wParam;\n  } RAWINPUTHEADER,*PRAWINPUTHEADER,*LPRAWINPUTHEADER;\n\n#define RIM_TYPEMOUSE 0\n#define RIM_TYPEKEYBOARD 1\n#define RIM_TYPEHID 2\n\n  typedef struct tagRAWMOUSE {\n    USHORT usFlags;\n    union {\n      ULONG ulButtons;\n      struct {\n\tUSHORT usButtonFlags;\n\tUSHORT usButtonData;\n      };\n    };\n    ULONG ulRawButtons;\n    LONG lLastX;\n    LONG lLastY;\n    ULONG ulExtraInformation;\n  } RAWMOUSE,*PRAWMOUSE,*LPRAWMOUSE;\n\n#define RI_MOUSE_LEFT_BUTTON_DOWN 0x0001\n#define RI_MOUSE_LEFT_BUTTON_UP 0x0002\n#define RI_MOUSE_RIGHT_BUTTON_DOWN 0x0004\n#define RI_MOUSE_RIGHT_BUTTON_UP 0x0008\n#define RI_MOUSE_MIDDLE_BUTTON_DOWN 0x0010\n#define RI_MOUSE_MIDDLE_BUTTON_UP 0x0020\n\n#define RI_MOUSE_BUTTON_1_DOWN RI_MOUSE_LEFT_BUTTON_DOWN\n#define RI_MOUSE_BUTTON_1_UP RI_MOUSE_LEFT_BUTTON_UP\n#define RI_MOUSE_BUTTON_2_DOWN RI_MOUSE_RIGHT_BUTTON_DOWN\n#define RI_MOUSE_BUTTON_2_UP RI_MOUSE_RIGHT_BUTTON_UP\n#define RI_MOUSE_BUTTON_3_DOWN RI_MOUSE_MIDDLE_BUTTON_DOWN\n#define RI_MOUSE_BUTTON_3_UP RI_MOUSE_MIDDLE_BUTTON_UP\n\n#define RI_MOUSE_BUTTON_4_DOWN 0x0040\n#define RI_MOUSE_BUTTON_4_UP 0x0080\n#define RI_MOUSE_BUTTON_5_DOWN 0x0100\n#define RI_MOUSE_BUTTON_5_UP 0x0200\n\n#define RI_MOUSE_WHEEL 0x0400\n\n#define MOUSE_MOVE_RELATIVE 0\n#define MOUSE_MOVE_ABSOLUTE 1\n#define MOUSE_VIRTUAL_DESKTOP 0x02\n#define MOUSE_ATTRIBUTES_CHANGED 0x04\n\n  typedef struct tagRAWKEYBOARD {\n    USHORT MakeCode;\n    USHORT Flags;\n    USHORT Reserved;\n    USHORT VKey;\n    UINT Message;\n    ULONG ExtraInformation;\n  } RAWKEYBOARD,*PRAWKEYBOARD,*LPRAWKEYBOARD;\n\n#define KEYBOARD_OVERRUN_MAKE_CODE 0xFF\n\n#define RI_KEY_MAKE 0\n#define RI_KEY_BREAK 1\n#define RI_KEY_E0 2\n#define RI_KEY_E1 4\n#define RI_KEY_TERMSRV_SET_LED 8\n#define RI_KEY_TERMSRV_SHADOW 0x10\n\n  typedef struct tagRAWHID {\n    DWORD dwSizeHid;\n    DWORD dwCount;\n    BYTE bRawData[1];\n  } RAWHID,*PRAWHID,*LPRAWHID;\n\n  typedef struct tagRAWINPUT {\n    RAWINPUTHEADER header;\n    union {\n      RAWMOUSE mouse;\n      RAWKEYBOARD keyboard;\n      RAWHID hid;\n    } data;\n  } RAWINPUT,*PRAWINPUT,*LPRAWINPUT;\n\n#ifdef _WIN64\n#define RAWINPUT_ALIGN(x) (((x) + sizeof(QWORD) - 1) & ~(sizeof(QWORD) - 1))\n#else\n#define RAWINPUT_ALIGN(x) (((x) + sizeof(DWORD) - 1) & ~(sizeof(DWORD) - 1))\n#endif\n\n#define NEXTRAWINPUTBLOCK(ptr) ((PRAWINPUT)RAWINPUT_ALIGN((ULONG_PTR)((PBYTE)(ptr) + (ptr)->header.dwSize)))\n\n#define RID_INPUT 0x10000003\n#define RID_HEADER 0x10000005\n\n  WINUSERAPI UINT WINAPI GetRawInputData(HRAWINPUT hRawInput,UINT uiCommand,LPVOID pData,PUINT pcbSize,UINT cbSizeHeader);\n\n#define RIDI_PREPARSEDDATA 0x20000005\n#define RIDI_DEVICENAME 0x20000007\n#define RIDI_DEVICEINFO 0x2000000b\n\n  typedef struct tagRID_DEVICE_INFO_MOUSE {\n    DWORD dwId;\n    DWORD dwNumberOfButtons;\n    DWORD dwSampleRate;\n  } RID_DEVICE_INFO_MOUSE,*PRID_DEVICE_INFO_MOUSE;\n\n  typedef struct tagRID_DEVICE_INFO_KEYBOARD {\n    DWORD dwType;\n    DWORD dwSubType;\n    DWORD dwKeyboardMode;\n    DWORD dwNumberOfFunctionKeys;\n    DWORD dwNumberOfIndicators;\n    DWORD dwNumberOfKeysTotal;\n  } RID_DEVICE_INFO_KEYBOARD,*PRID_DEVICE_INFO_KEYBOARD;\n\n  typedef struct tagRID_DEVICE_INFO_HID {\n    DWORD dwVendorId;\n    DWORD dwProductId;\n    DWORD dwVersionNumber;\n    USHORT usUsagePage;\n    USHORT usUsage;\n  } RID_DEVICE_INFO_HID,*PRID_DEVICE_INFO_HID;\n\n  typedef struct tagRID_DEVICE_INFO {\n    DWORD cbSize;\n    DWORD dwType;\n    union {\n      RID_DEVICE_INFO_MOUSE mouse;\n      RID_DEVICE_INFO_KEYBOARD keyboard;\n      RID_DEVICE_INFO_HID hid;\n    };\n  } RID_DEVICE_INFO,*PRID_DEVICE_INFO,*LPRID_DEVICE_INFO;\n\n#ifdef UNICODE\n#define GetRawInputDeviceInfo GetRawInputDeviceInfoW\n#else\n#define GetRawInputDeviceInfo GetRawInputDeviceInfoA\n#endif\n\n  WINUSERAPI UINT WINAPI GetRawInputDeviceInfoA(HANDLE hDevice,UINT uiCommand,LPVOID pData,PUINT pcbSize);\n  WINUSERAPI UINT WINAPI GetRawInputDeviceInfoW(HANDLE hDevice,UINT uiCommand,LPVOID pData,PUINT pcbSize);\n  WINUSERAPI UINT WINAPI GetRawInputBuffer(PRAWINPUT pData,PUINT pcbSize,UINT cbSizeHeader);\n\n  typedef struct tagRAWINPUTDEVICE {\n    USHORT usUsagePage;\n    USHORT usUsage;\n    DWORD dwFlags;\n    HWND hwndTarget;\n  } RAWINPUTDEVICE,*PRAWINPUTDEVICE,*LPRAWINPUTDEVICE;\n\n  typedef CONST RAWINPUTDEVICE *PCRAWINPUTDEVICE;\n\n#define RIDEV_REMOVE 0x00000001\n#define RIDEV_EXCLUDE 0x00000010\n#define RIDEV_PAGEONLY 0x00000020\n#define RIDEV_NOLEGACY 0x00000030\n#define RIDEV_INPUTSINK 0x00000100\n#define RIDEV_CAPTUREMOUSE 0x00000200\n#define RIDEV_NOHOTKEYS 0x00000200\n#define RIDEV_APPKEYS 0x00000400\n#define RIDEV_EXMODEMASK 0x000000F0\n#define RIDEV_EXMODE(mode) ((mode) & RIDEV_EXMODEMASK)\n\n  WINUSERAPI WINBOOL WINAPI RegisterRawInputDevices(PCRAWINPUTDEVICE pRawInputDevices,UINT uiNumDevices,UINT cbSize);\n  WINUSERAPI UINT WINAPI GetRegisteredRawInputDevices(PRAWINPUTDEVICE pRawInputDevices,PUINT puiNumDevices,UINT cbSize);\n\n  typedef struct tagRAWINPUTDEVICELIST {\n    HANDLE hDevice;\n    DWORD dwType;\n  } RAWINPUTDEVICELIST,*PRAWINPUTDEVICELIST;\n\n  WINUSERAPI UINT WINAPI GetRawInputDeviceList(PRAWINPUTDEVICELIST pRawInputDeviceList,PUINT puiNumDevices,UINT cbSize);\n  WINUSERAPI LRESULT WINAPI DefRawInputProc(PRAWINPUT *paRawInput,INT nInput,UINT cbSizeHeader);\n\n#endif /* NOUSER */\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/include/winapi/winver.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the w64 mingw-runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n#ifndef VER_H\n#define VER_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define VS_FILE_INFO RT_VERSION\n#define VS_VERSION_INFO 1\n#define VS_USER_DEFINED 100\n\n#define VS_FFI_SIGNATURE 0xFEEF04BDL\n#define VS_FFI_STRUCVERSION 0x00010000L\n#define VS_FFI_FILEFLAGSMASK 0x0000003FL\n\n#define VS_FF_DEBUG 0x00000001L\n#define VS_FF_PRERELEASE 0x00000002L\n#define VS_FF_PATCHED 0x00000004L\n#define VS_FF_PRIVATEBUILD 0x00000008L\n#define VS_FF_INFOINFERRED 0x00000010L\n#define VS_FF_SPECIALBUILD 0x00000020L\n\n#define VOS_UNKNOWN 0x00000000L\n#define VOS_DOS 0x00010000L\n#define VOS_OS216 0x00020000L\n#define VOS_OS232 0x00030000L\n#define VOS_NT 0x00040000L\n#define VOS_WINCE 0x00050000L\n\n#define VOS__BASE 0x00000000L\n#define VOS__WINDOWS16 0x00000001L\n#define VOS__PM16 0x00000002L\n#define VOS__PM32 0x00000003L\n#define VOS__WINDOWS32 0x00000004L\n\n#define VOS_DOS_WINDOWS16 0x00010001L\n#define VOS_DOS_WINDOWS32 0x00010004L\n#define VOS_OS216_PM16 0x00020002L\n#define VOS_OS232_PM32 0x00030003L\n#define VOS_NT_WINDOWS32 0x00040004L\n\n#define VFT_UNKNOWN 0x00000000L\n#define VFT_APP 0x00000001L\n#define VFT_DLL 0x00000002L\n#define VFT_DRV 0x00000003L\n#define VFT_FONT 0x00000004L\n#define VFT_VXD 0x00000005L\n#define VFT_STATIC_LIB 0x00000007L\n\n#define VFT2_UNKNOWN 0x00000000L\n#define VFT2_DRV_PRINTER 0x00000001L\n#define VFT2_DRV_KEYBOARD 0x00000002L\n#define VFT2_DRV_LANGUAGE 0x00000003L\n#define VFT2_DRV_DISPLAY 0x00000004L\n#define VFT2_DRV_MOUSE 0x00000005L\n#define VFT2_DRV_NETWORK 0x00000006L\n#define VFT2_DRV_SYSTEM 0x00000007L\n#define VFT2_DRV_INSTALLABLE 0x00000008L\n#define VFT2_DRV_SOUND 0x00000009L\n#define VFT2_DRV_COMM 0x0000000AL\n#define VFT2_DRV_INPUTMETHOD 0x0000000BL\n#define VFT2_DRV_VERSIONED_PRINTER 0x0000000CL\n\n#define VFT2_FONT_RASTER 0x00000001L\n#define VFT2_FONT_VECTOR 0x00000002L\n#define VFT2_FONT_TRUETYPE 0x00000003L\n\n#define VFFF_ISSHAREDFILE 0x0001\n\n#define VFF_CURNEDEST 0x0001\n#define VFF_FILEINUSE 0x0002\n#define VFF_BUFFTOOSMALL 0x0004\n\n#define VIFF_FORCEINSTALL 0x0001\n#define VIFF_DONTDELETEOLD 0x0002\n\n#define VIF_TEMPFILE 0x00000001L\n#define VIF_MISMATCH 0x00000002L\n#define VIF_SRCOLD 0x00000004L\n\n#define VIF_DIFFLANG 0x00000008L\n#define VIF_DIFFCODEPG 0x00000010L\n#define VIF_DIFFTYPE 0x00000020L\n\n#define VIF_WRITEPROT 0x00000040L\n#define VIF_FILEINUSE 0x00000080L\n#define VIF_OUTOFSPACE 0x00000100L\n#define VIF_ACCESSVIOLATION 0x00000200L\n#define VIF_SHARINGVIOLATION 0x00000400L\n#define VIF_CANNOTCREATE 0x00000800L\n#define VIF_CANNOTDELETE 0x00001000L\n#define VIF_CANNOTRENAME 0x00002000L\n#define VIF_CANNOTDELETECUR 0x00004000L\n#define VIF_OUTOFMEMORY 0x00008000L\n\n#define VIF_CANNOTREADSRC 0x00010000L\n#define VIF_CANNOTREADDST 0x00020000L\n\n#define VIF_BUFFTOOSMALL 0x00040000L\n#define VIF_CANNOTLOADLZ32 0x00080000L\n#define VIF_CANNOTLOADCABINET 0x00100000L\n\n#ifndef RC_INVOKED\n\n  typedef struct tagVS_FIXEDFILEINFO\n  {\n    DWORD dwSignature;\n    DWORD dwStrucVersion;\n    DWORD dwFileVersionMS;\n    DWORD dwFileVersionLS;\n    DWORD dwProductVersionMS;\n    DWORD dwProductVersionLS;\n    DWORD dwFileFlagsMask;\n    DWORD dwFileFlags;\n    DWORD dwFileOS;\n    DWORD dwFileType;\n    DWORD dwFileSubtype;\n    DWORD dwFileDateMS;\n    DWORD dwFileDateLS;\n  } VS_FIXEDFILEINFO;\n\n#ifdef UNICODE\n#define VerFindFile VerFindFileW\n#define VerInstallFile VerInstallFileW\n#define GetFileVersionInfoSize GetFileVersionInfoSizeW\n#define GetFileVersionInfo GetFileVersionInfoW\n#define VerLanguageName VerLanguageNameW\n#define VerQueryValue VerQueryValueW\n#else\n#define VerFindFile VerFindFileA\n#define VerInstallFile VerInstallFileA\n#define GetFileVersionInfoSize GetFileVersionInfoSizeA\n#define GetFileVersionInfo GetFileVersionInfoA\n#define VerLanguageName VerLanguageNameA\n#define VerQueryValue VerQueryValueA\n#endif\n\n  DWORD WINAPI VerFindFileA(DWORD uFlags,LPSTR szFileName,LPSTR szWinDir,LPSTR szAppDir,LPSTR szCurDir,PUINT lpuCurDirLen,LPSTR szDestDir,PUINT lpuDestDirLen);\n  DWORD WINAPI VerFindFileW(DWORD uFlags,LPWSTR szFileName,LPWSTR szWinDir,LPWSTR szAppDir,LPWSTR szCurDir,PUINT lpuCurDirLen,LPWSTR szDestDir,PUINT lpuDestDirLen);\n  DWORD WINAPI VerInstallFileA(DWORD uFlags,LPSTR szSrcFileName,LPSTR szDestFileName,LPSTR szSrcDir,LPSTR szDestDir,LPSTR szCurDir,LPSTR szTmpFile,PUINT lpuTmpFileLen);\n  DWORD WINAPI VerInstallFileW(DWORD uFlags,LPWSTR szSrcFileName,LPWSTR szDestFileName,LPWSTR szSrcDir,LPWSTR szDestDir,LPWSTR szCurDir,LPWSTR szTmpFile,PUINT lpuTmpFileLen);\n  DWORD WINAPI GetFileVersionInfoSizeA(LPCSTR lptstrFilename,LPDWORD lpdwHandle);\n  DWORD WINAPI GetFileVersionInfoSizeW(LPCWSTR lptstrFilename,LPDWORD lpdwHandle);\n  WINBOOL WINAPI GetFileVersionInfoA(LPCSTR lptstrFilename,DWORD dwHandle,DWORD dwLen,LPVOID lpData);\n  WINBOOL WINAPI GetFileVersionInfoW(LPCWSTR lptstrFilename,DWORD dwHandle,DWORD dwLen,LPVOID lpData);\n  DWORD WINAPI VerLanguageNameA(DWORD wLang,LPSTR szLang,DWORD nSize);\n  DWORD WINAPI VerLanguageNameW(DWORD wLang,LPWSTR szLang,DWORD nSize);\n  WINBOOL WINAPI VerQueryValueA(const LPVOID pBlock,LPSTR lpSubBlock,LPVOID *lplpBuffer,PUINT puLen);\n  WINBOOL WINAPI VerQueryValueW(const LPVOID pBlock,LPWSTR lpSubBlock,LPVOID *lplpBuffer,PUINT puLen);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/chkstk.S",
    "content": "/* ---------------------------------------------- */\n/* chkstk86.s */\n\n/* ---------------------------------------------- */\n#ifndef TCC_TARGET_X86_64\n/* ---------------------------------------------- */\n\n.globl __chkstk\n\n__chkstk:\n    xchg    (%esp),%ebp     /* store ebp, get ret.addr */\n    push    %ebp            /* push ret.addr */\n    lea     4(%esp),%ebp    /* setup frame ptr */\n    push    %ecx            /* save ecx */\n    mov     %ebp,%ecx\nP0:\n    sub     $4096,%ecx\n    test    %eax,(%ecx)\n    sub     $4096,%eax\n    cmp     $4096,%eax\n    jge     P0\n    sub     %eax,%ecx\n    test    %eax,(%ecx)\n\n    mov     %esp,%eax\n    mov     %ecx,%esp\n    mov     (%eax),%ecx     /* restore ecx */\n    jmp     *4(%eax)\n\n/* ---------------------------------------------- */\n#else\n/* ---------------------------------------------- */\n\n.globl __chkstk\n\n__chkstk:\n    xchg    (%rsp),%rbp     /* store ebp, get ret.addr */\n    push    %rbp            /* push ret.addr */\n    lea     8(%rsp),%rbp    /* setup frame ptr */\n    push    %rcx            /* save ecx */\n    mov     %rbp,%rcx\n    movslq  %eax,%rax\nP0:\n    sub     $4096,%rcx\n    test    %rax,(%rcx)\n    sub     $4096,%rax\n    cmp     $4096,%rax\n    jge     P0\n    sub     %rax,%rcx\n    test    %rax,(%rcx)\n\n    mov     %rsp,%rax\n    mov     %rcx,%rsp\n    mov     (%rax),%rcx     /* restore ecx */\n    jmp     *8(%rax)\n\n/* ---------------------------------------------- */\n/* setjmp/longjmp support */\n\n.globl tinyc_getbp\ntinyc_getbp:\n    mov %rbp,%rax\n    ret\n\n/* ---------------------------------------------- */\n#endif\n/* ---------------------------------------------- */\n\n\n/* ---------------------------------------------- */\n#ifndef TCC_TARGET_X86_64\n/* ---------------------------------------------- */\n\n/*\n    int _except_handler3(\n       PEXCEPTION_RECORD exception_record,\n       PEXCEPTION_REGISTRATION registration,\n       PCONTEXT context,\n       PEXCEPTION_REGISTRATION dispatcher\n    );\n\n    int __cdecl _XcptFilter(\n       unsigned long xcptnum,\n       PEXCEPTION_POINTERS pxcptinfoptrs\n    );\n\n    struct _sehrec {\n       void *esp;                // 0\n       void *exception_pointers; // 1\n       void *prev;               // 2\n       void *handler;            // 3\n       void *scopetable;         // 4\n       int trylevel;             // 5\n       void *ebp                 // 6\n    };\n\n    // this is what the assembler code below means:\n    __try\n    {\n         // ...\n    }\n    __except (_XcptFilter(GetExceptionCode(), GetExceptionInformation()))\n    {\n         exit(GetExceptionCode());\n    }\n*/\n\n.globl _exception_info\n_exception_info:\n    mov 1*4-24(%ebp),%eax\n    ret\n\n.globl _exception_code\n_exception_code:\n    call _exception_info\n    mov (%eax),%eax\n    mov (%eax),%eax\n    ret\n\nseh_filter:\n    call _exception_info\n    push %eax\n    call _exception_code\n    push %eax\n    call _XcptFilter\n    add $ 8,%esp\n    ret\n\nseh_except:\n    mov 0*4-24(%ebp),%esp\n    call _exception_code\n    push %eax\n    call _exit\n\n// msvcrt wants scopetables aligned and in read-only segment (using .text)\n.align 4\nseh_scopetable:\n    .long -1\n    .long seh_filter\n    .long seh_except\n\nseh_handler:\n    jmp _except_handler3\n\n.globl ___try__\n___try__:\n.globl __try__\n__try__:\n    push %ebp\n    mov 8(%esp),%ebp\n\n//    void *esp;\n    lea 12(%esp),%eax\n    mov %eax,0*4(%ebp)\n\n//    void *exception_pointers;\n    xor %eax,%eax\n    mov %eax,1*4(%ebp)\n\n//    void *prev;\n    mov %fs:0,%eax\n    mov %eax,2*4(%ebp)\n\n//    void *handler;\n    mov $ seh_handler,%eax\n    mov %eax,3*4(%ebp)\n\n//    void *scopetable;\n    mov $ seh_scopetable,%eax\n    mov %eax,4*4(%ebp)\n\n//    int trylevel;\n    xor %eax,%eax\n    mov %eax,5*4(%ebp)\n\n//    register new SEH\n    lea 2*4(%ebp),%eax\n    mov %eax,%fs:0\n\n    pop %ebp\n    ret\n\n/* ---------------------------------------------- */\n#else\n/* ---------------------------------------------- */\n\n/* SEH on x86-64 not implemented */\n\n/* ---------------------------------------------- */\n#endif\n/* ---------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/crt1.c",
    "content": "// =============================================\n// crt1.c\n\n#include <stdlib.h>\n\n#define __UNKNOWN_APP    0\n#define __CONSOLE_APP    1\n#define __GUI_APP        2\nvoid __set_app_type(int);\nvoid _controlfp(unsigned a, unsigned b);\n\ntypedef struct\n{\n    int newmode;\n} _startupinfo;\n\nvoid __getmainargs(int *pargc, char ***pargv, char ***penv, int globb, _startupinfo*);\nint main(int argc, char **argv, char **env);\n\nint _start(void)\n{\n    __TRY__\n    int argc; char **argv; char **env; int ret;\n    _startupinfo start_info = {0};\n\n    _controlfp(0x10000, 0x30000);\n    __set_app_type(__CONSOLE_APP);\n    __getmainargs(&argc, &argv, &env, 0, &start_info);\n\n    ret = main(argc, argv, env);\n    exit(ret);\n}\n\n// =============================================\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/dllcrt1.c",
    "content": "//+---------------------------------------------------------------------------\n\n#include <windows.h>\n\nBOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved);\n\nBOOL WINAPI _dllstart(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)\n{\n\tBOOL bRet;\n\tbRet = DllMain (hDll, dwReason, lpReserved);\n\treturn bRet;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/dllmain.c",
    "content": "//+---------------------------------------------------------------------------\n\n#include <windows.h>\n\nBOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)\n{\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/gdi32.def",
    "content": "LIBRARY gdi32.dll\n\nEXPORTS\nAbortDoc\nAbortPath\nAddFontResourceA\nAddFontResourceW\nAngleArc\nAnimatePalette\nArc\nArcTo\nBeginPath\nBitBlt\nByeByeGDI\nCancelDC\nCheckColorsInGamut\nChoosePixelFormat\nChord\nCloseEnhMetaFile\nCloseFigure\nCloseMetaFile\nColorCorrectPalette\nColorMatchToTarget\nCombineRgn\nCombineTransform\nCopyEnhMetaFileA\nCopyEnhMetaFileW\nCopyMetaFileA\nCopyMetaFileW\nCreateBitmap\nCreateBitmapIndirect\nCreateBrushIndirect\nCreateColorSpaceA\nCreateColorSpaceW\nCreateCompatibleBitmap\nCreateCompatibleDC\nCreateDCA\nCreateDCW\nCreateDIBPatternBrush\nCreateDIBPatternBrushPt\nCreateDIBSection\nCreateDIBitmap\nCreateDiscardableBitmap\nCreateEllipticRgn\nCreateEllipticRgnIndirect\nCreateEnhMetaFileA\nCreateEnhMetaFileW\nCreateFontA\nCreateFontIndirectA\nCreateFontIndirectW\nCreateFontW\nCreateHalftonePalette\nCreateHatchBrush\nCreateICA\nCreateICW\nCreateMetaFileA\nCreateMetaFileW\nCreatePalette\nCreatePatternBrush\nCreatePen\nCreatePenIndirect\nCreatePolyPolygonRgn\nCreatePolygonRgn\nCreateRectRgn\nCreateRectRgnIndirect\nCreateRoundRectRgn\nCreateScalableFontResourceA\nCreateScalableFontResourceW\nCreateSolidBrush\nDPtoLP\nDeleteColorSpace\nDeleteDC\nDeleteEnhMetaFile\nDeleteMetaFile\nDeleteObject\nDescribePixelFormat\nDeviceCapabilitiesEx\nDeviceCapabilitiesExA\nDeviceCapabilitiesExW\nDrawEscape\nEllipse\nEnableEUDC\nEndDoc\nEndPage\nEndPath\nEnumEnhMetaFile\nEnumFontFamiliesA\nEnumFontFamiliesExA\nEnumFontFamiliesExW\nEnumFontFamiliesW\nEnumFontsA\nEnumFontsW\nEnumICMProfilesA\nEnumICMProfilesW\nEnumMetaFile\nEnumObjects\nEqualRgn\nEscape\nExcludeClipRect\nExtCreatePen\nExtCreateRegion\nExtEscape\nExtFloodFill\nExtSelectClipRgn\nExtTextOutA\nExtTextOutW\nFillPath\nFillRgn\nFixBrushOrgEx\nFlattenPath\nFloodFill\nFrameRgn\nGdiComment\nGdiFlush\nGdiGetBatchLimit\nGdiPlayDCScript\nGdiPlayJournal\nGdiPlayScript\nGdiSetBatchLimit\nGetArcDirection\nGetAspectRatioFilterEx\nGetBitmapBits\nGetBitmapDimensionEx\nGetBkColor\nGetBkMode\nGetBoundsRect\nGetBrushOrgEx\nGetCharABCWidthsA\nGetCharABCWidthsFloatA\nGetCharABCWidthsFloatW\nGetCharABCWidthsW\nGetCharWidth32A\nGetCharWidth32W\nGetCharWidthA\nGetCharWidthFloatA\nGetCharWidthFloatW\nGetCharWidthW\nGetCharacterPlacementA\nGetCharacterPlacementW\nGetClipBox\nGetClipRgn\nGetColorAdjustment\nGetColorSpace\nGetCurrentObject\nGetCurrentPositionEx\nGetDCOrgEx\nGetDIBColorTable\nGetDIBits\nGetDeviceCaps\nGetDeviceGammaRamp\nGetEnhMetaFileA\nGetEnhMetaFileBits\nGetEnhMetaFileDescriptionA\nGetEnhMetaFileDescriptionW\nGetEnhMetaFileHeader\nGetEnhMetaFilePaletteEntries\nGetEnhMetaFileW\nGetFontData\nGetFontLanguageInfo\nGetFontResourceInfo\nGetGlyphOutline\nGetGlyphOutlineA\nGetGlyphOutlineW\nGetGraphicsMode\nGetICMProfileA\nGetICMProfileW\nGetKerningPairs\nGetKerningPairsA\nGetKerningPairsW\nGetLayout\nGetLogColorSpaceA\nGetLogColorSpaceW\nGetMapMode\nGetMetaFileA\nGetMetaFileBitsEx\nGetMetaFileW\nGetMetaRgn\nGetMiterLimit\nGetNearestColor\nGetNearestPaletteIndex\nGetObjectA\nGetObjectType\nGetObjectW\nGetOutlineTextMetricsA\nGetOutlineTextMetricsW\nGetPaletteEntries\nGetPath\nGetPixel\nGetPixelFormat\nGetPolyFillMode\nGetROP2\nGetRandomRgn\nGetRasterizerCaps\nGetRegionData\nGetRgnBox\nGetStockObject\nGetStretchBltMode\nGetSystemPaletteEntries\nGetSystemPaletteUse\nGetTextAlign\nGetTextCharacterExtra\nGetTextCharset\nGetTextCharsetInfo\nGetTextColor\nGetTextExtentExPointA\nGetTextExtentExPointW\nGetTextExtentPoint32A\nGetTextExtentPoint32W\nGetTextExtentPointA\nGetTextExtentPointW\nGetTextFaceA\nGetTextFaceW\nGetTextMetricsA\nGetTextMetricsW\nGetViewportExtEx\nGetViewportOrgEx\nGetWinMetaFileBits\nGetWindowExtEx\nGetWindowOrgEx\nGetWorldTransform\nIntersectClipRect\nInvertRgn\nLPtoDP\nLineDDA\nLineTo\nMaskBlt\nModifyWorldTransform\nMoveToEx\nOffsetClipRgn\nOffsetRgn\nOffsetViewportOrgEx\nOffsetWindowOrgEx\nPaintRgn\nPatBlt\nPathToRegion\nPie\nPlayEnhMetaFile\nPlayEnhMetaFileRecord\nPlayMetaFile\nPlayMetaFileRecord\nPlgBlt\nPolyBezier\nPolyBezierTo\nPolyDraw\nPolyPolygon\nPolyPolyline\nPolyTextOutA\nPolyTextOutW\nPolygon\nPolyline\nPolylineTo\nPtInRegion\nPtVisible\nRealizePalette\nRectInRegion\nRectVisible\nRectangle\nRemoveFontResourceA\nRemoveFontResourceW\nResetDCA\nResetDCW\nResizePalette\nRestoreDC\nRoundRect\nSaveDC\nScaleViewportExtEx\nScaleWindowExtEx\nSelectClipPath\nSelectClipRgn\nSelectObject\nSelectPalette\nSetAbortProc\nSetArcDirection\nSetBitmapBits\nSetBitmapDimensionEx\nSetBkColor\nSetBkMode\nSetBoundsRect\nSetBrushOrgEx\nSetColorAdjustment\nSetColorSpace\nSetDIBColorTable\nSetDIBits\nSetDIBitsToDevice\nSetDeviceGammaRamp\nSetEnhMetaFileBits\nSetFontEnumeration\nSetGraphicsMode\nSetICMMode\nSetICMProfileA\nSetICMProfileW\nSetLayout\nSetMagicColors\nSetMapMode\nSetMapperFlags\nSetMetaFileBitsEx\nSetMetaRgn\nSetMiterLimit\nSetObjectOwner\nSetPaletteEntries\nSetPixel\nSetPixelFormat\nSetPixelV\nSetPolyFillMode\nSetROP2\nSetRectRgn\nSetStretchBltMode\nSetSystemPaletteUse\nSetTextAlign\nSetTextCharacterExtra\nSetTextColor\nSetTextJustification\nSetViewportExtEx\nSetViewportOrgEx\nSetWinMetaFileBits\nSetWindowExtEx\nSetWindowOrgEx\nSetWorldTransform\nStartDocA\nStartDocW\nStartPage\nStretchBlt\nStretchDIBits\nStrokeAndFillPath\nStrokePath\nSwapBuffers\nTextOutA\nTextOutW\nTranslateCharsetInfo\nUnrealizeObject\nUpdateColors\nUpdateICMRegKeyA\nUpdateICMRegKeyW\nWidenPath\ngdiPlaySpoolStream\npfnRealizePalette\npfnSelectPalette\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/kernel32.def",
    "content": "LIBRARY kernel32.dll\n\nEXPORTS\nAddAtomA\nAddAtomW\nAllocConsole\nAllocLSCallback\nAllocSLCallback\nAreFileApisANSI\nBackupRead\nBackupSeek\nBackupWrite\nBeep\nBeginUpdateResourceA\nBeginUpdateResourceW\nBuildCommDCBA\nBuildCommDCBAndTimeoutsA\nBuildCommDCBAndTimeoutsW\nBuildCommDCBW\nCallNamedPipeA\nCallNamedPipeW\nCallback12\nCallback16\nCallback20\nCallback24\nCallback28\nCallback32\nCallback36\nCallback4\nCallback40\nCallback44\nCallback48\nCallback52\nCallback56\nCallback60\nCallback64\nCallback8\nCancelDeviceWakeupRequest\nCancelIo\nCancelWaitableTimer\nClearCommBreak\nClearCommError\nCloseHandle\nCloseProfileUserMapping\nCloseSystemHandle\nCommConfigDialogA\nCommConfigDialogW\nCompareFileTime\nCompareStringA\nCompareStringW\nConnectNamedPipe\nContinueDebugEvent\nConvertDefaultLocale\nConvertThreadToFiber\nConvertToGlobalHandle\nCopyFileA\nCopyFileExA\nCopyFileExW\nCopyFileW\nCreateConsoleScreenBuffer\nCreateDirectoryA\nCreateDirectoryExA\nCreateDirectoryExW\nCreateDirectoryW\nCreateEventA\nCreateEventW\nCreateFiber\nCreateFileA\nCreateFileMappingA\nCreateFileMappingW\nCreateFileW\nCreateIoCompletionPort\nCreateKernelThread\nCreateMailslotA\nCreateMailslotW\nCreateMutexA\nCreateMutexW\nCreateNamedPipeA\nCreateNamedPipeW\nCreatePipe\nCreateProcessA\nCreateProcessW\nCreateRemoteThread\nCreateSemaphoreA\nCreateSemaphoreW\nCreateSocketHandle\nCreateTapePartition\nCreateThread\nCreateToolhelp32Snapshot\nCreateWaitableTimerA\nCreateWaitableTimerW\nDebugActiveProcess\nDebugBreak\nDefineDosDeviceA\nDefineDosDeviceW\nDeleteAtom\nDeleteCriticalSection\nDeleteFiber\nDeleteFileA\nDeleteFileW\nDeviceIoControl\nDisableThreadLibraryCalls\nDisconnectNamedPipe\nDosDateTimeToFileTime\nDuplicateHandle\nEndUpdateResourceA\nEndUpdateResourceW\nEnterCriticalSection\nEnumCalendarInfoA\nEnumCalendarInfoExA\nEnumCalendarInfoExW\nEnumCalendarInfoW\nEnumDateFormatsA\nEnumDateFormatsExA\nEnumDateFormatsExW\nEnumDateFormatsW\nEnumLanguageGroupLocalesA\nEnumLanguageGroupLocalesW\nEnumResourceLanguagesA\nEnumResourceLanguagesW\nEnumResourceNamesA\nEnumResourceNamesW\nEnumResourceTypesA\nEnumResourceTypesW\nEnumSystemCodePagesA\nEnumSystemCodePagesW\nEnumSystemGeoID\nEnumSystemLanguageGroupsA\nEnumSystemLanguageGroupsW\nEnumSystemLocalesA\nEnumSystemLocalesW\nEnumTimeFormatsA\nEnumTimeFormatsW\nEnumUILanguagesA\nEnumUILanguagesW\nEraseTape\nEscapeCommFunction\nExitProcess\nExitThread\nExpandEnvironmentStringsA\nExpandEnvironmentStringsW\nFT_Exit0\nFT_Exit12\nFT_Exit16\nFT_Exit20\nFT_Exit24\nFT_Exit28\nFT_Exit32\nFT_Exit36\nFT_Exit4\nFT_Exit40\nFT_Exit44\nFT_Exit48\nFT_Exit52\nFT_Exit56\nFT_Exit8\nFT_Prolog\nFT_Thunk\nFatalAppExitA\nFatalAppExitW\nFatalExit\nFileTimeToDosDateTime\nFileTimeToLocalFileTime\nFileTimeToSystemTime\nFillConsoleOutputAttribute\nFillConsoleOutputCharacterA\nFillConsoleOutputCharacterW\nFindAtomA\nFindAtomW\nFindClose\nFindCloseChangeNotification\nFindFirstChangeNotificationA\nFindFirstChangeNotificationW\nFindFirstFileA\nFindFirstFileExA\nFindFirstFileExW\nFindFirstFileW\nFindNextChangeNotification\nFindNextFileA\nFindNextFileW\nFindResourceA\nFindResourceExA\nFindResourceExW\nFindResourceW\nFlushConsoleInputBuffer\nFlushFileBuffers\nFlushInstructionCache\nFlushViewOfFile\nFoldStringA\nFoldStringW\nFormatMessageA\nFormatMessageW\nFreeConsole\nFreeEnvironmentStringsA\nFreeEnvironmentStringsW\nFreeLSCallback\nFreeLibrary\nFreeLibraryAndExitThread\nFreeResource\nFreeSLCallback\nGenerateConsoleCtrlEvent\nGetACP\nGetAtomNameA\nGetAtomNameW\nGetBinaryType\nGetBinaryTypeA\nGetBinaryTypeW\nGetCPInfo\nGetCPInfoExA\nGetCPInfoExW\nGetCalendarInfoA\nGetCalendarInfoW\nGetCommConfig\nGetCommMask\nGetCommModemStatus\nGetCommProperties\nGetCommState\nGetCommTimeouts\nGetCommandLineA\nGetCommandLineW\nGetCompressedFileSizeA\nGetCompressedFileSizeW\nGetComputerNameA\nGetComputerNameW\nGetConsoleCP\nGetConsoleCursorInfo\nGetConsoleMode\nGetConsoleOutputCP\nGetConsoleScreenBufferInfo\nGetConsoleTitleA\nGetConsoleTitleW\nGetCurrencyFormatA\nGetCurrencyFormatW\nGetCurrentDirectoryA\nGetCurrentDirectoryW\nGetCurrentProcess\nGetCurrentProcessId\nGetCurrentThread\nGetCurrentThreadId\nGetDateFormatA\nGetDateFormatW\nGetDaylightFlag\nGetDefaultCommConfigA\nGetDefaultCommConfigW\nGetDevicePowerState\nGetDiskFreeSpaceA\nGetDiskFreeSpaceExA\nGetDiskFreeSpaceExW\nGetDiskFreeSpaceW\nGetDriveTypeA\nGetDriveTypeW\nGetEnvironmentStrings\nGetEnvironmentStringsA\nGetEnvironmentStringsW\nGetEnvironmentVariableA\nGetEnvironmentVariableW\nGetErrorMode\nGetExitCodeProcess\nGetExitCodeThread\nGetFileAttributesA\nGetFileAttributesExA\nGetFileAttributesExW\nGetFileAttributesW\nGetFileInformationByHandle\nGetFileSize\nGetFileTime\nGetFileType\nGetFullPathNameA\nGetFullPathNameW\nGetGeoInfoA\nGetGeoInfoW\nGetHandleContext\nGetHandleInformation\nGetLSCallbackTarget\nGetLSCallbackTemplate\nGetLargestConsoleWindowSize\nGetLastError\nGetLocalTime\nGetLocaleInfoA\nGetLocaleInfoW\nGetLogicalDriveStringsA\nGetLogicalDriveStringsW\nGetLogicalDrives\nGetLongPathNameA\nGetLongPathNameW\nGetMailslotInfo\nGetModuleFileNameA\nGetModuleFileNameW\nGetModuleHandleA\nGetModuleHandleW\nGetNamedPipeHandleStateA\nGetNamedPipeHandleStateW\nGetNamedPipeInfo\nGetNumberFormatA\nGetNumberFormatW\nGetNumberOfConsoleInputEvents\nGetNumberOfConsoleMouseButtons\nGetOEMCP\nGetOverlappedResult\nGetPriorityClass\nGetPrivateProfileIntA\nGetPrivateProfileIntW\nGetPrivateProfileSectionA\nGetPrivateProfileSectionNamesA\nGetPrivateProfileSectionNamesW\nGetPrivateProfileSectionW\nGetPrivateProfileStringA\nGetPrivateProfileStringW\nGetPrivateProfileStructA\nGetPrivateProfileStructW\nGetProcAddress\nGetProcessAffinityMask\nGetProcessFlags\nGetProcessHeap\nGetProcessHeaps\nGetProcessPriorityBoost\nGetProcessShutdownParameters\nGetProcessTimes\nGetProcessVersion\nGetProcessWorkingSetSize\nGetProductName\nGetProfileIntA\nGetProfileIntW\nGetProfileSectionA\nGetProfileSectionW\nGetProfileStringA\nGetProfileStringW\nGetQueuedCompletionStatus\nGetSLCallbackTarget\nGetSLCallbackTemplate\nGetShortPathNameA\nGetShortPathNameW\nGetStartupInfoA\nGetStartupInfoW\nGetStdHandle\nGetStringTypeA\nGetStringTypeExA\nGetStringTypeExW\nGetStringTypeW\nGetSystemDefaultLCID\nGetSystemDefaultLangID\nGetSystemDefaultUILanguage\nGetSystemDirectoryA\nGetSystemDirectoryW\nGetSystemInfo\nGetSystemPowerStatus\nGetSystemTime\nGetSystemTimeAdjustment\nGetSystemTimeAsFileTime\nGetTapeParameters\nGetTapePosition\nGetTapeStatus\nGetTempFileNameA\nGetTempFileNameW\nGetTempPathA\nGetTempPathW\nGetThreadContext\nGetThreadLocale\nGetThreadPriority\nGetThreadPriorityBoost\nGetThreadSelectorEntry\nGetThreadTimes\nGetTickCount\nGetTimeFormatA\nGetTimeFormatW\nGetTimeZoneInformation\nGetUserDefaultLCID\nGetUserDefaultLangID\nGetUserDefaultUILanguage\nGetUserGeoID\nGetVersion\nGetVersionExA\nGetVersionExW\nGetVolumeInformationA\nGetVolumeInformationW\nGetWindowsDirectoryA\nGetWindowsDirectoryW\nGetWriteWatch\nGlobalAddAtomA\nGlobalAddAtomW\nGlobalAlloc\nGlobalCompact\nGlobalDeleteAtom\nGlobalFindAtomA\nGlobalFindAtomW\nGlobalFix\nGlobalFlags\nGlobalFree\nGlobalGetAtomNameA\nGlobalGetAtomNameW\nGlobalHandle\nGlobalLock\nGlobalMemoryStatus\nGlobalReAlloc\nGlobalSize\nGlobalUnWire\nGlobalUnfix\nGlobalUnlock\nGlobalWire\nHeap32First\nHeap32ListFirst\nHeap32ListNext\nHeap32Next\nHeapAlloc\nHeapCompact\nHeapCreate\nHeapDestroy\nHeapFree\nHeapLock\nHeapReAlloc\nHeapSetFlags\nHeapSize\nHeapUnlock\nHeapValidate\nHeapWalk\nInitAtomTable\nInitializeCriticalSection\nInitializeCriticalSectionAndSpinCount\nInterlockedCompareExchange\nInterlockedDecrement\nInterlockedExchange\nInterlockedExchangeAdd\nInterlockedIncrement\nInvalidateNLSCache\nIsBadCodePtr\nIsBadHugeReadPtr\nIsBadHugeWritePtr\nIsBadReadPtr\nIsBadStringPtrA\nIsBadStringPtrW\nIsBadWritePtr\nIsDBCSLeadByte\nIsDBCSLeadByteEx\nIsDebuggerPresent\nIsLSCallback\nIsProcessorFeaturePresent\nIsSLCallback\nIsSystemResumeAutomatic\nIsValidCodePage\nIsValidLanguageGroup\nIsValidLocale\nK32Thk1632Epilog\nK32Thk1632Prolog\nK32_NtCreateFile\nK32_RtlNtStatusToDosError\nLCMapStringA\nLCMapStringW\nLeaveCriticalSection\nLoadLibraryA\nLoadLibraryExA\nLoadLibraryExW\nLoadLibraryW\nLoadModule\nLoadResource\nLocalAlloc\nLocalCompact\nLocalFileTimeToFileTime\nLocalFlags\nLocalFree\nLocalHandle\nLocalLock\nLocalReAlloc\nLocalShrink\nLocalSize\nLocalUnlock\nLockFile\nLockFileEx\nLockResource\nMakeCriticalSectionGlobal\nMapHInstLS\nMapHInstLS_PN\nMapHInstSL\nMapHInstSL_PN\nMapHModuleLS\nMapHModuleSL\nMapLS\nMapSL\nMapSLFix\nMapViewOfFile\nMapViewOfFileEx\nModule32First\nModule32Next\nMoveFileA\nMoveFileExA\nMoveFileExW\nMoveFileW\nMulDiv\nMultiByteToWideChar\nNotifyNLSUserCache\nOpenEventA\nOpenEventW\nOpenFile\nOpenFileMappingA\nOpenFileMappingW\nOpenMutexA\nOpenMutexW\nOpenProcess\nOpenProfileUserMapping\nOpenSemaphoreA\nOpenSemaphoreW\nOpenThread\nOpenVxDHandle\nOpenWaitableTimerA\nOpenWaitableTimerW\nOutputDebugStringA\nOutputDebugStringW\nPeekConsoleInputA\nPeekConsoleInputW\nPeekNamedPipe\nPostQueuedCompletionStatus\nPrepareTape\nProcess32First\nProcess32Next\nPulseEvent\nPurgeComm\nQT_Thunk\nQueryDosDeviceA\nQueryDosDeviceW\nQueryNumberOfEventLogRecords\nQueryOldestEventLogRecord\nQueryPerformanceCounter\nQueryPerformanceFrequency\nQueueUserAPC\nRaiseException\nReadConsoleA\nReadConsoleInputA\nReadConsoleInputW\nReadConsoleOutputA\nReadConsoleOutputAttribute\nReadConsoleOutputCharacterA\nReadConsoleOutputCharacterW\nReadConsoleOutputW\nReadConsoleW\nReadDirectoryChangesW\nReadFile\nReadFileEx\nReadFileScatter\nReadProcessMemory\nRegisterServiceProcess\nRegisterSysMsgHandler\nReinitializeCriticalSection\nReleaseMutex\nReleaseSemaphore\nRemoveDirectoryA\nRemoveDirectoryW\nRequestDeviceWakeup\nRequestWakeupLatency\nResetEvent\nResetNLSUserInfoCache\nResetWriteWatch\nResumeThread\nRtlAddFunctionTable\nRtlFillMemory\nRtlInstallFunctionTableCallback\nRtlMoveMemory\nRtlUnwind\nRtlZeroMemory\nSMapLS\nSMapLS_IP_EBP_12\nSMapLS_IP_EBP_16\nSMapLS_IP_EBP_20\nSMapLS_IP_EBP_24\nSMapLS_IP_EBP_28\nSMapLS_IP_EBP_32\nSMapLS_IP_EBP_36\nSMapLS_IP_EBP_40\nSMapLS_IP_EBP_8\nSUnMapLS\nSUnMapLS_IP_EBP_12\nSUnMapLS_IP_EBP_16\nSUnMapLS_IP_EBP_20\nSUnMapLS_IP_EBP_24\nSUnMapLS_IP_EBP_28\nSUnMapLS_IP_EBP_32\nSUnMapLS_IP_EBP_36\nSUnMapLS_IP_EBP_40\nSUnMapLS_IP_EBP_8\nScrollConsoleScreenBufferA\nScrollConsoleScreenBufferW\nSearchPathA\nSearchPathW\nSetCalendarInfoA\nSetCalendarInfoW\nSetCommBreak\nSetCommConfig\nSetCommMask\nSetCommState\nSetCommTimeouts\nSetComputerNameA\nSetComputerNameW\nSetConsoleActiveScreenBuffer\nSetConsoleCP\nSetConsoleCtrlHandler\nSetConsoleCursorInfo\nSetConsoleCursorPosition\nSetConsoleMode\nSetConsoleOutputCP\nSetConsoleScreenBufferSize\nSetConsoleTextAttribute\nSetConsoleTitleA\nSetConsoleTitleW\nSetConsoleWindowInfo\nSetCriticalSectionSpinCount\nSetCurrentDirectoryA\nSetCurrentDirectoryW\nSetDaylightFlag\nSetDefaultCommConfigA\nSetDefaultCommConfigW\nSetEndOfFile\nSetEnvironmentVariableA\nSetEnvironmentVariableW\nSetErrorMode\nSetEvent\nSetFileApisToANSI\nSetFileApisToOEM\nSetFileAttributesA\nSetFileAttributesW\nSetFilePointer\nSetFileTime\nSetHandleContext\nSetHandleCount\nSetHandleInformation\nSetLastError\nSetLocalTime\nSetLocaleInfoA\nSetLocaleInfoW\nSetMailslotInfo\nSetMessageWaitingIndicator\nSetNamedPipeHandleState\nSetPriorityClass\nSetProcessAffinityMask\nSetProcessPriorityBoost\nSetProcessShutdownParameters\nSetProcessWorkingSetSize\nSetStdHandle\nSetSystemPowerState\nSetSystemTime\nSetSystemTimeAdjustment\nSetTapeParameters\nSetTapePosition\nSetThreadAffinityMask\nSetThreadContext\nSetThreadExecutionState\nSetThreadIdealProcessor\nSetThreadLocale\nSetThreadPriority\nSetThreadPriorityBoost\nSetTimeZoneInformation\nSetUnhandledExceptionFilter\nSetUserGeoID\nSetVolumeLabelA\nSetVolumeLabelW\nSetWaitableTimer\nSetupComm\nSignalObjectAndWait\nSignalSysMsgHandlers\nSizeofResource\nSleep\nSleepEx\nSuspendThread\nSwitchToFiber\nSwitchToThread\nSystemTimeToFileTime\nSystemTimeToTzSpecificLocalTime\nTerminateProcess\nTerminateThread\nThread32First\nThread32Next\nThunkConnect32\nTlsAlloc\nTlsAllocInternal\nTlsFree\nTlsFreeInternal\nTlsGetValue\nTlsSetValue\nToolhelp32ReadProcessMemory\nTransactNamedPipe\nTransmitCommChar\nTryEnterCriticalSection\nUTRegister\nUTUnRegister\nUnMapLS\nUnMapSLFixArray\nUnhandledExceptionFilter\nUninitializeCriticalSection\nUnlockFile\nUnlockFileEx\nUnmapViewOfFile\nUpdateResourceA\nUpdateResourceW\nVerLanguageNameA\nVerLanguageNameW\nVirtualAlloc\nVirtualAllocEx\nVirtualFree\nVirtualFreeEx\nVirtualLock\nVirtualProtect\nVirtualProtectEx\nVirtualQuery\nVirtualQueryEx\nVirtualUnlock\nWaitCommEvent\nWaitForDebugEvent\nWaitForMultipleObjects\nWaitForMultipleObjectsEx\nWaitForSingleObject\nWaitForSingleObjectEx\nWaitNamedPipeA\nWaitNamedPipeW\nWideCharToMultiByte\nWinExec\nWriteConsoleA\nWriteConsoleInputA\nWriteConsoleInputW\nWriteConsoleOutputA\nWriteConsoleOutputAttribute\nWriteConsoleOutputCharacterA\nWriteConsoleOutputCharacterW\nWriteConsoleOutputW\nWriteConsoleW\nWriteFile\nWriteFileEx\nWriteFileGather\nWritePrivateProfileSectionA\nWritePrivateProfileSectionW\nWritePrivateProfileStringA\nWritePrivateProfileStringW\nWritePrivateProfileStructA\nWritePrivateProfileStructW\nWriteProcessMemory\nWriteProfileSectionA\nWriteProfileSectionW\nWriteProfileStringA\nWriteProfileStringW\nWriteTapemark\n_DebugOut\n_DebugPrintf\n_hread\n_hwrite\n_lclose\n_lcreat\n_llseek\n_lopen\n_lread\n_lwrite\ndprintf\nlstrcat\nlstrcatA\nlstrcatW\nlstrcmp\nlstrcmpA\nlstrcmpW\nlstrcmpi\nlstrcmpiA\nlstrcmpiW\nlstrcpy\nlstrcpyA\nlstrcpyW\nlstrcpyn\nlstrcpynA\nlstrcpynW\nlstrlen\nlstrlenA\nlstrlenW\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/msvcrt.def",
    "content": "LIBRARY msvcrt.dll\n\nEXPORTS\n$I10_OUTPUT\n??0__non_rtti_object@@QAE@ABV0@@Z\n??0__non_rtti_object@@QAE@PBD@Z\n??0bad_cast@@AAE@PBQBD@Z\n??0bad_cast@@QAE@ABQBD@Z\n??0bad_cast@@QAE@ABV0@@Z\n??0bad_cast@@QAE@PBD@Z\n??0bad_typeid@@QAE@ABV0@@Z\n??0bad_typeid@@QAE@PBD@Z\n??0exception@@QAE@ABQBD@Z\n??0exception@@QAE@ABQBDH@Z\n??0exception@@QAE@ABV0@@Z\n??0exception@@QAE@XZ\n??1__non_rtti_object@@UAE@XZ\n??1bad_cast@@UAE@XZ\n??1bad_typeid@@UAE@XZ\n??1exception@@UAE@XZ\n??1type_info@@UAE@XZ\n??2@YAPAXI@Z\n??2@YAPAXIHPBDH@Z\n??3@YAXPAX@Z\n??4__non_rtti_object@@QAEAAV0@ABV0@@Z\n??4bad_cast@@QAEAAV0@ABV0@@Z\n??4bad_typeid@@QAEAAV0@ABV0@@Z\n??4exception@@QAEAAV0@ABV0@@Z\n??8type_info@@QBEHABV0@@Z\n??9type_info@@QBEHABV0@@Z\n??_7__non_rtti_object@@6B@\n??_7bad_cast@@6B@\n??_7bad_typeid@@6B@\n??_7exception@@6B@\n??_E__non_rtti_object@@UAEPAXI@Z\n??_Ebad_cast@@UAEPAXI@Z\n??_Ebad_typeid@@UAEPAXI@Z\n??_Eexception@@UAEPAXI@Z\n??_Fbad_cast@@QAEXXZ\n??_Fbad_typeid@@QAEXXZ\n??_G__non_rtti_object@@UAEPAXI@Z\n??_Gbad_cast@@UAEPAXI@Z\n??_Gbad_typeid@@UAEPAXI@Z\n??_Gexception@@UAEPAXI@Z\n??_U@YAPAXI@Z\n??_U@YAPAXIHPBDH@Z\n??_V@YAXPAX@Z\n?_query_new_handler@@YAP6AHI@ZXZ\n?_query_new_mode@@YAHXZ\n?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z\n?_set_new_mode@@YAHH@Z\n?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z\n?before@type_info@@QBEHABV1@@Z\n?name@type_info@@QBEPBDXZ\n?raw_name@type_info@@QBEPBDXZ\n?set_new_handler@@YAP6AXXZP6AXXZ@Z\n?set_terminate@@YAP6AXXZP6AXXZ@Z\n?set_unexpected@@YAP6AXXZP6AXXZ@Z\n?terminate@@YAXXZ\n?unexpected@@YAXXZ\n?what@exception@@UBEPBDXZ\n_CIacos\n_CIasin\n_CIatan\n_CIatan2\n_CIcos\n_CIcosh\n_CIexp\n_CIfmod\n_CIlog\n_CIlog10\n_CIpow\n_CIsin\n_CIsinh\n_CIsqrt\n_CItan\n_CItanh\n_CrtCheckMemory\n_CrtDbgBreak\n_CrtDbgReport\n_CrtDbgReportV\n_CrtDbgReportW\n_CrtDbgReportWV\n_CrtDoForAllClientObjects\n_CrtDumpMemoryLeaks\n_CrtIsMemoryBlock\n_CrtIsValidHeapPointer\n_CrtIsValidPointer\n_CrtMemCheckpoint\n_CrtMemDifference\n_CrtMemDumpAllObjectsSince\n_CrtMemDumpStatistics\n_CrtReportBlockType\n_CrtSetAllocHook\n_CrtSetBreakAlloc\n_CrtSetDbgBlockType\n_CrtSetDbgFlag\n_CrtSetDumpClient\n_CrtSetReportFile\n_CrtSetReportHook\n_CrtSetReportHook2\n_CrtSetReportMode\n_CxxThrowException\n_EH_prolog\n_Getdays\n_Getmonths\n_Gettnames\n_HUGE\n_Strftime\n_XcptFilter\n__CppXcptFilter\n__CxxCallUnwindDelDtor\n__CxxCallUnwindDtor\n__CxxCallUnwindVecDtor\n__CxxDetectRethrow\n__CxxExceptionFilter\n__CxxFrameHandler\n__CxxFrameHandler2\n__CxxFrameHandler3\n__CxxLongjmpUnwind\n__CxxQueryExceptionSize\n__CxxRegisterExceptionObject\n__CxxUnregisterExceptionObject\n__DestructExceptionObject\n__RTCastToVoid\n__RTDynamicCast\n__RTtypeid\n__STRINGTOLD\n___lc_codepage_func\n___lc_collate_cp_func\n___lc_handle_func\n___mb_cur_max_func\n___setlc_active_func\n___unguarded_readlc_active_add_func\n__argc\n__argv\n__badioinfo\n__crtCompareStringA\n__crtCompareStringW\n__crtGetLocaleInfoW\n__crtGetStringTypeW\n__crtLCMapStringA\n__crtLCMapStringW\n__daylight\n__dllonexit\n__doserrno\n__dstbias\n__fpecode\n__getmainargs\n__initenv\n__iob_func\n__isascii\n__iscsym\n__iscsymf\n__lc_codepage\n__lc_collate_cp\n__lc_handle\n__lconv_init\n__libm_sse2_acos\n__libm_sse2_acosf\n__libm_sse2_asin\n__libm_sse2_asinf\n__libm_sse2_atan\n__libm_sse2_atan2\n__libm_sse2_atanf\n__libm_sse2_cos\n__libm_sse2_cosf\n__libm_sse2_exp\n__libm_sse2_expf\n__libm_sse2_log\n__libm_sse2_log10\n__libm_sse2_log10f\n__libm_sse2_logf\n__libm_sse2_pow\n__libm_sse2_powf\n__libm_sse2_sin\n__libm_sse2_sinf\n__libm_sse2_tan\n__libm_sse2_tanf\n__mb_cur_max\n__p___argc\n__p___argv\n__p___initenv\n__p___mb_cur_max\n__p___wargv\n__p___winitenv\n__p__acmdln\n__p__amblksiz\n__p__commode\n__p__daylight\n__p__dstbias\n__p__environ\n__p__fileinfo\n__p__fmode\n__p__iob\n__p__mbcasemap\n__p__mbctype\n__p__osver\n__p__pctype\n__p__pgmptr\n__p__pwctype\n__p__timezone\n__p__tzname\n__p__wcmdln\n__p__wenviron\n__p__winmajor\n__p__winminor\n__p__winver\n__p__wpgmptr\n__pctype_func\n__pioinfo\n__pwctype_func\n__pxcptinfoptrs\n__set_app_type\n__setlc_active\n__setusermatherr\n__strncnt\n__threadhandle\n__threadid\n__toascii\n__unDName\n__unDNameEx\n__uncaught_exception\n__unguarded_readlc_active\n__wargv\n__wcserror\n__wcserror_s\n__wcsncnt\n__wgetmainargs\n__winitenv\n_abnormal_termination\n_abs64\n_access\n_access_s\n_acmdln\n_adj_fdiv_m16i\n_adj_fdiv_m32\n_adj_fdiv_m32i\n_adj_fdiv_m64\n_adj_fdiv_r\n_adj_fdivr_m16i\n_adj_fdivr_m32\n_adj_fdivr_m32i\n_adj_fdivr_m64\n_adj_fpatan\n_adj_fprem\n_adj_fprem1\n_adj_fptan\n_adjust_fdiv\n_aexit_rtn\n_aligned_free\n_aligned_free_dbg\n_aligned_malloc\n_aligned_malloc_dbg\n_aligned_offset_malloc\n_aligned_offset_malloc_dbg\n_aligned_offset_realloc\n_aligned_offset_realloc_dbg\n_aligned_realloc\n_aligned_realloc_dbg\n_amsg_exit\n_assert\n_atodbl\n_atodbl_l\n_atof_l\n_atoflt_l\n_atoi64\n_atoi64_l\n_atoi_l\n_atol_l\n_atoldbl\n_atoldbl_l\n_beep\n_beginthread\n_beginthreadex\n_c_exit\n_cabs\n_callnewh\n_calloc_dbg\n_cexit\n_cgets\n_cgets_s\n_cgetws\n_cgetws_s\n_chdir\n_chdrive\n_chgsign\n_chkesp\n_chmod\n_chsize\n_chsize_s\n_chvalidator\n_chvalidator_l\n_clearfp\n_close\n_commit\n_commode\n_control87\n_controlfp\n_controlfp_s\n_copysign\n_cprintf\n_cprintf_l\n_cprintf_p\n_cprintf_p_l\n_cprintf_s\n_cprintf_s_l\n_cputs\n_cputws\n_creat\n_crtAssertBusy\n_crtBreakAlloc\n_crtDbgFlag\n_cscanf\n_cscanf_l\n_cscanf_s\n_cscanf_s_l\n_ctime32\n_ctime32_s\n_ctime64\n_ctime64_s\n_ctype\n_cwait\n_cwprintf\n_cwprintf_l\n_cwprintf_p\n_cwprintf_p_l\n_cwprintf_s\n_cwprintf_s_l\n_cwscanf\n_cwscanf_l\n_cwscanf_s\n_cwscanf_s_l\n_daylight\n_difftime32\n_difftime64\n_dstbias\n_dup\n_dup2\n_ecvt\n_ecvt_s\n_endthread\n_endthreadex\n_environ\n_eof\n_errno\n_except_handler2\n_except_handler3\n_except_handler4_common\n_execl\n_execle\n_execlp\n_execlpe\n_execv\n_execve\n_execvp\n_execvpe\n_exit\n_expand\n_expand_dbg\n_fcloseall\n_fcvt\n_fcvt_s\n_fdopen\n_fgetchar\n_fgetwchar\n_filbuf\n_fileinfo\n_filelength\n_filelengthi64\n_fileno\n_findclose\n_findfirst\n_findfirst64\n_findfirsti64\n_findnext\n_findnext64\n_findnexti64\n_finite\n_flsbuf\n_flushall\n_fmode\n_fpclass\n_fpieee_flt\n_fpreset\n_fprintf_l\n_fprintf_p\n_fprintf_p_l\n_fprintf_s_l\n_fputchar\n_fputwchar\n_free_dbg\n_freea\n_freea_s\n_fscanf_l\n_fscanf_s_l\n_fseeki64\n_fsopen\n_fstat\n_fstat64\n_fstati64\n_ftime\n_ftime32\n_ftime32_s\n_ftime64\n_ftime64_s\n_ftol\n_ftol2\n_ftol2_sse\n_ftol2_sse_excpt\n_fullpath\n_fullpath_dbg\n_futime\n_futime32\n_futime64\n_fwprintf_l\n_fwprintf_p\n_fwprintf_p_l\n_fwprintf_s_l\n_fwscanf_l\n_fwscanf_s_l\n_gcvt\n_gcvt_s\n_get_doserrno\n_get_environ\n_get_errno\n_get_fileinfo\n_get_fmode\n_get_heap_handle\n_get_osfhandle\n_get_osplatform\n_get_osver\n_get_output_format\n_get_pgmptr\n_get_sbh_threshold\n_get_wenviron\n_get_winmajor\n_get_winminor\n_get_winver\n_get_wpgmptr\n_getch\n_getche\n_getcwd\n_getdcwd\n_getdiskfree\n_getdllprocaddr\n_getdrive\n_getdrives\n_getmaxstdio\n_getmbcp\n_getpid\n_getsystime\n_getw\n_getwch\n_getwche\n_getws\n_global_unwind2\n_gmtime32\n_gmtime32_s\n_gmtime64\n_gmtime64_s\n_heapadd\n_heapchk\n_heapmin\n_heapset\n_heapused\n_heapwalk\n_hypot\n_i64toa\n_i64toa_s\n_i64tow\n_i64tow_s\n_initterm\n_initterm_e\n_inp\n_inpd\n_inpw\n_invalid_parameter\n_iob\n_isalnum_l\n_isalpha_l\n_isatty\n_iscntrl_l\n_isctype\n_isctype_l\n_isdigit_l\n_isgraph_l\n_isleadbyte_l\n_islower_l\n_ismbbalnum\n_ismbbalnum_l\n_ismbbalpha\n_ismbbalpha_l\n_ismbbgraph\n_ismbbgraph_l\n_ismbbkalnum\n_ismbbkalnum_l\n_ismbbkana\n_ismbbkana_l\n_ismbbkprint\n_ismbbkprint_l\n_ismbbkpunct\n_ismbbkpunct_l\n_ismbblead\n_ismbblead_l\n_ismbbprint\n_ismbbprint_l\n_ismbbpunct\n_ismbbpunct_l\n_ismbbtrail\n_ismbbtrail_l\n_ismbcalnum\n_ismbcalnum_l\n_ismbcalpha\n_ismbcalpha_l\n_ismbcdigit\n_ismbcdigit_l\n_ismbcgraph\n_ismbcgraph_l\n_ismbchira\n_ismbchira_l\n_ismbckata\n_ismbckata_l\n_ismbcl0\n_ismbcl0_l\n_ismbcl1\n_ismbcl1_l\n_ismbcl2\n_ismbcl2_l\n_ismbclegal\n_ismbclegal_l\n_ismbclower\n_ismbclower_l\n_ismbcprint\n_ismbcprint_l\n_ismbcpunct\n_ismbcpunct_l\n_ismbcspace\n_ismbcspace_l\n_ismbcsymbol\n_ismbcsymbol_l\n_ismbcupper\n_ismbcupper_l\n_ismbslead\n_ismbslead_l\n_ismbstrail\n_ismbstrail_l\n_isnan\n_isprint_l\n_isspace_l\n_isupper_l\n_iswalnum_l\n_iswalpha_l\n_iswcntrl_l\n_iswctype_l\n_iswdigit_l\n_iswgraph_l\n_iswlower_l\n_iswprint_l\n_iswpunct_l\n_iswspace_l\n_iswupper_l\n_iswxdigit_l\n_isxdigit_l\n_itoa\n_itoa_s\n_itow\n_itow_s\n_j0\n_j1\n_jn\n_kbhit\n_lfind\n_lfind_s\n_loaddll\n_local_unwind2\n_local_unwind4\n_localtime32\n_localtime32_s\n_localtime64\n_localtime64_s\n_lock\n_locking\n_logb\n_longjmpex\n_lrotl\n_lrotr\n_lsearch\n_lsearch_s\n_lseek\n_lseeki64\n_ltoa\n_ltoa_s\n_ltow\n_ltow_s\n_makepath\n_makepath_s\n_malloc_dbg\n_mbbtombc\n_mbbtombc_l\n_mbbtype\n_mbcasemap\n_mbccpy\n_mbccpy_l\n_mbccpy_s\n_mbccpy_s_l\n_mbcjistojms\n_mbcjistojms_l\n_mbcjmstojis\n_mbcjmstojis_l\n_mbclen\n_mbclen_l\n_mbctohira\n_mbctohira_l\n_mbctokata\n_mbctokata_l\n_mbctolower\n_mbctolower_l\n_mbctombb\n_mbctombb_l\n_mbctoupper\n_mbctoupper_l\n_mbctype\n_mblen_l\n_mbsbtype\n_mbsbtype_l\n_mbscat\n_mbscat_s\n_mbscat_s_l\n_mbschr\n_mbschr_l\n_mbscmp\n_mbscmp_l\n_mbscoll\n_mbscoll_l\n_mbscpy\n_mbscpy_s\n_mbscpy_s_l\n_mbscspn\n_mbscspn_l\n_mbsdec\n_mbsdec_l\n_mbsdup\n_mbsicmp\n_mbsicmp_l\n_mbsicoll\n_mbsicoll_l\n_mbsinc\n_mbsinc_l\n_mbslen\n_mbslen_l\n_mbslwr\n_mbslwr_l\n_mbslwr_s\n_mbslwr_s_l\n_mbsnbcat\n_mbsnbcat_l\n_mbsnbcat_s\n_mbsnbcat_s_l\n_mbsnbcmp\n_mbsnbcmp_l\n_mbsnbcnt\n_mbsnbcnt_l\n_mbsnbcoll\n_mbsnbcoll_l\n_mbsnbcpy\n_mbsnbcpy_l\n_mbsnbcpy_s\n_mbsnbcpy_s_l\n_mbsnbicmp\n_mbsnbicmp_l\n_mbsnbicoll\n_mbsnbicoll_l\n_mbsnbset\n_mbsnbset_l\n_mbsnbset_s\n_mbsnbset_s_l\n_mbsncat\n_mbsncat_l\n_mbsncat_s\n_mbsncat_s_l\n_mbsnccnt\n_mbsnccnt_l\n_mbsncmp\n_mbsncmp_l\n_mbsncoll\n_mbsncoll_l\n_mbsncpy\n_mbsncpy_l\n_mbsncpy_s\n_mbsncpy_s_l\n_mbsnextc\n_mbsnextc_l\n_mbsnicmp\n_mbsnicmp_l\n_mbsnicoll\n_mbsnicoll_l\n_mbsninc\n_mbsninc_l\n_mbsnlen\n_mbsnlen_l\n_mbsnset\n_mbsnset_l\n_mbsnset_s\n_mbsnset_s_l\n_mbspbrk\n_mbspbrk_l\n_mbsrchr\n_mbsrchr_l\n_mbsrev\n_mbsrev_l\n_mbsset\n_mbsset_l\n_mbsset_s\n_mbsset_s_l\n_mbsspn\n_mbsspn_l\n_mbsspnp\n_mbsspnp_l\n_mbsstr\n_mbsstr_l\n_mbstok\n_mbstok_l\n_mbstok_s\n_mbstok_s_l\n_mbstowcs_l\n_mbstowcs_s_l\n_mbstrlen\n_mbstrlen_l\n_mbstrnlen\n_mbstrnlen_l\n_mbsupr\n_mbsupr_l\n_mbsupr_s\n_mbsupr_s_l\n_mbtowc_l\n_memccpy\n_memicmp\n_memicmp_l\n_mkdir\n_mkgmtime\n_mkgmtime32\n_mkgmtime64\n_mktemp\n_mktemp_s\n_mktime32\n_mktime64\n_msize\n_msize_debug\n_nextafter\n_onexit\n_open\n_open_osfhandle\n_osplatform\n_osver\n_outp\n_outpd\n_outpw\n_pclose\n_pctype\n_pgmptr\n_pipe\n_popen\n_printf_l\n_printf_p\n_printf_p_l\n_printf_s_l\n_purecall\n_putch\n_putenv\n_putenv_s\n_putw\n_putwch\n_putws\n_pwctype\n_read\n_realloc_dbg\n_resetstkoflw\n_rmdir\n_rmtmp\n_rotl\n_rotl64\n_rotr\n_rotr64\n_safe_fdiv\n_safe_fdivr\n_safe_fprem\n_safe_fprem1\n_scalb\n_scanf_l\n_scanf_s_l\n_scprintf\n_scprintf_l\n_scprintf_p_l\n_scwprintf\n_scwprintf_l\n_scwprintf_p_l\n_searchenv\n_searchenv_s\n_seh_longjmp_unwind\n_seh_longjmp_unwind4\n_set_SSE2_enable\n_set_controlfp\n_set_doserrno\n_set_errno\n_set_error_mode\n_set_fileinfo\n_set_fmode\n_set_output_format\n_set_sbh_threshold\n_seterrormode\n_setjmp\n_setjmp3\n_setmaxstdio\n_setmbcp\n_setmode\n_setsystime\n_sleep\n_snprintf\n_snprintf_c\n_snprintf_c_l\n_snprintf_l\n_snprintf_s\n_snprintf_s_l\n_snscanf\n_snscanf_l\n_snscanf_s\n_snscanf_s_l\n_snwprintf\n_snwprintf_l\n_snwprintf_s\n_snwprintf_s_l\n_snwscanf\n_snwscanf_l\n_snwscanf_s\n_snwscanf_s_l\n_sopen\n_sopen_s\n_spawnl\n_spawnle\n_spawnlp\n_spawnlpe\n_spawnv\n_spawnve\n_spawnvp\n_spawnvpe\n_splitpath\n_splitpath_s\n_sprintf_l\n_sprintf_p_l\n_sprintf_s_l\n_sscanf_l\n_sscanf_s_l\n_stat\n_stat64\n_stati64\n_statusfp\n_strcmpi\n_strcoll_l\n_strdate\n_strdate_s\n_strdup\n_strdup_dbg\n_strerror\n_strerror_s\n_stricmp\n_stricmp_l\n_stricoll\n_stricoll_l\n_strlwr\n_strlwr_l\n_strlwr_s\n_strlwr_s_l\n_strncoll\n_strncoll_l\n_strnicmp\n_strnicmp_l\n_strnicoll\n_strnicoll_l\n_strnset\n_strnset_s\n_strrev\n_strset\n_strset_s\n_strtime\n_strtime_s\n_strtod_l\n_strtoi64\n_strtoi64_l\n_strtol_l\n_strtoui64\n_strtoui64_l\n_strtoul_l\n_strupr\n_strupr_l\n_strupr_s\n_strupr_s_l\n_strxfrm_l\n_swab\n_swprintf\n_swprintf_c\n_swprintf_c_l\n_swprintf_p_l\n_swprintf_s_l\n_swscanf_l\n_swscanf_s_l\n_sys_errlist\n_sys_nerr\n_tell\n_telli64\n_tempnam\n_tempnam_dbg\n_time32\n_time64\n_timezone\n_tolower\n_tolower_l\n_toupper\n_toupper_l\n_towlower_l\n_towupper_l\n_tzname\n_tzset\n_ui64toa\n_ui64toa_s\n_ui64tow\n_ui64tow_s\n_ultoa\n_ultoa_s\n_ultow\n_ultow_s\n_umask\n_umask_s\n_ungetch\n_ungetwch\n_unlink\n_unloaddll\n_unlock\n_utime\n_utime32\n_utime64\n_vcprintf\n_vcprintf_l\n_vcprintf_p\n_vcprintf_p_l\n_vcprintf_s\n_vcprintf_s_l\n_vcwprintf\n_vcwprintf_l\n_vcwprintf_p\n_vcwprintf_p_l\n_vcwprintf_s\n_vcwprintf_s_l\n_vfprintf_l\n_vfprintf_p\n_vfprintf_p_l\n_vfprintf_s_l\n_vfwprintf_l\n_vfwprintf_p\n_vfwprintf_p_l\n_vfwprintf_s_l\n_vprintf_l\n_vprintf_p\n_vprintf_p_l\n_vprintf_s_l\n_vscprintf\n_vscprintf_l\n_vscprintf_p_l\n_vscwprintf\n_vscwprintf_l\n_vscwprintf_p_l\n_vsnprintf\n_vsnprintf_c\n_vsnprintf_c_l\n_vsnprintf_l\n_vsnprintf_s\n_vsnprintf_s_l\n_vsnwprintf\n_vsnwprintf_l\n_vsnwprintf_s\n_vsnwprintf_s_l\n_vsprintf_l\n_vsprintf_p\n_vsprintf_p_l\n_vsprintf_s_l\n_vswprintf\n_vswprintf_c\n_vswprintf_c_l\n_vswprintf_l\n_vswprintf_p_l\n_vswprintf_s_l\n_vwprintf_l\n_vwprintf_p\n_vwprintf_p_l\n_vwprintf_s_l\n_waccess\n_waccess_s\n_wasctime\n_wasctime_s\n_wassert\n_wchdir\n_wchmod\n_wcmdln\n_wcreat\n_wcscoll_l\n_wcsdup\n_wcsdup_dbg\n_wcserror\n_wcserror_s\n_wcsftime_l\n_wcsicmp\n_wcsicmp_l\n_wcsicoll\n_wcsicoll_l\n_wcslwr\n_wcslwr_l\n_wcslwr_s\n_wcslwr_s_l\n_wcsncoll\n_wcsncoll_l\n_wcsnicmp\n_wcsnicmp_l\n_wcsnicoll\n_wcsnicoll_l\n_wcsnset\n_wcsnset_s\n_wcsrev\n_wcsset\n_wcsset_s\n_wcstoi64\n_wcstoi64_l\n_wcstol_l\n_wcstombs_l\n_wcstombs_s_l\n_wcstoui64\n_wcstoui64_l\n_wcstoul_l\n_wcsupr\n_wcsupr_l\n_wcsupr_s\n_wcsupr_s_l\n_wcsxfrm_l\n_wctime\n_wctime32\n_wctime32_s\n_wctime64\n_wctime64_s\n_wctomb_l\n_wctomb_s_l\n_wctype\n_wenviron\n_wexecl\n_wexecle\n_wexeclp\n_wexeclpe\n_wexecv\n_wexecve\n_wexecvp\n_wexecvpe\n_wfdopen\n_wfindfirst\n_wfindfirst64\n_wfindfirsti64\n_wfindnext\n_wfindnext64\n_wfindnexti64\n_wfopen\n_wfopen_s\n_wfreopen\n_wfreopen_s\n_wfsopen\n_wfullpath\n_wfullpath_dbg\n_wgetcwd\n_wgetdcwd\n_wgetenv\n_wgetenv_s\n_winmajor\n_winminor\n_winput_s\n_winver\n_wmakepath\n_wmakepath_s\n_wmkdir\n_wmktemp\n_wmktemp_s\n_wopen\n_woutput_s\n_wperror\n_wpgmptr\n_wpopen\n_wprintf_l\n_wprintf_p\n_wprintf_p_l\n_wprintf_s_l\n_wputenv\n_wputenv_s\n_wremove\n_wrename\n_write\n_wrmdir\n_wscanf_l\n_wscanf_s_l\n_wsearchenv\n_wsearchenv_s\n_wsetlocale\n_wsopen\n_wsopen_s\n_wspawnl\n_wspawnle\n_wspawnlp\n_wspawnlpe\n_wspawnv\n_wspawnve\n_wspawnvp\n_wspawnvpe\n_wsplitpath\n_wsplitpath_s\n_wstat\n_wstat64\n_wstati64\n_wstrdate\n_wstrdate_s\n_wstrtime\n_wstrtime_s\n_wsystem\n_wtempnam\n_wtempnam_dbg\n_wtmpnam\n_wtmpnam_s\n_wtof\n_wtof_l\n_wtoi\n_wtoi64\n_wtoi64_l\n_wtoi_l\n_wtol\n_wtol_l\n_wunlink\n_wutime\n_wutime32\n_wutime64\n_y0\n_y1\n_yn\nabort\nabs\nacos\nasctime\nasctime_s\nasin\natan\natan2\natexit\natof\natoi\natol\nbsearch\nbsearch_s\nbtowc\ncalloc\nceil\nclearerr\nclearerr_s\nclock\ncos\ncosh\nctime\ndifftime\ndiv\nexit\nexp\nfabs\nfclose\nfeof\nferror\nfflush\nfgetc\nfgetpos\nfgets\nfgetwc\nfgetws\nfloor\nfmod\nfopen\nfopen_s\nfprintf\nfprintf_s\nfputc\nfputs\nfputwc\nfputws\nfread\nfree\nfreopen\nfreopen_s\nfrexp\nfscanf\nfscanf_s\nfseek\nfsetpos\nftell\nfwprintf\nfwprintf_s\nfwrite\nfwscanf\nfwscanf_s\ngetc\ngetchar\ngetenv\ngetenv_s\ngets\ngetwc\ngetwchar\ngmtime\nis_wctype\nisalnum\nisalpha\niscntrl\nisdigit\nisgraph\nisleadbyte\nislower\nisprint\nispunct\nisspace\nisupper\niswalnum\niswalpha\niswascii\niswcntrl\niswctype\niswdigit\niswgraph\niswlower\niswprint\niswpunct\niswspace\niswupper\niswxdigit\nisxdigit\nlabs\nldexp\nldiv\nlocaleconv\nlocaltime\nlog\nlog10\nlongjmp\nmalloc\nmblen\nmbrlen\nmbrtowc\nmbsdup_dbg\nmbsrtowcs\nmbsrtowcs_s\nmbstowcs\nmbstowcs_s\nmbtowc\nmemchr\nmemcmp\nmemcpy\nmemcpy_s\nmemmove\nmemmove_s\nmemset\nmktime\nmodf\nperror\npow\nprintf\nprintf_s\nputc\nputchar\nputs\nputwc\nputwchar\nqsort\nqsort_s\nraise\nrand\nrand_s\nrealloc\nremove\nrename\nrewind\nscanf\nscanf_s\nsetbuf\nsetlocale\nsetvbuf\nsignal\nsin\nsinh\nsprintf\nsprintf_s\nsqrt\nsrand\nsscanf\nsscanf_s\nstrcat\nstrcat_s\nstrchr\nstrcmp\nstrcoll\nstrcpy\nstrcpy_s\nstrcspn\nstrerror\nstrerror_s\nstrftime\nstrlen\nstrncat\nstrncat_s\nstrncmp\nstrncpy\nstrncpy_s\nstrnlen\nstrpbrk\nstrrchr\nstrspn\nstrstr\nstrtod\nstrtok\nstrtok_s\nstrtol\nstrtoul\nstrxfrm\nswprintf\nswprintf_s\nswscanf\nswscanf_s\nsystem\ntan\ntanh\ntime\ntmpfile\ntmpfile_s\ntmpnam\ntmpnam_s\ntolower\ntoupper\ntowlower\ntowupper\nungetc\nungetwc\nutime\nvfprintf\nvfprintf_s\nvfwprintf\nvfwprintf_s\nvprintf\nvprintf_s\nvsnprintf\nvsprintf\nvsprintf_s\nvswprintf\nvswprintf_s\nvwprintf\nvwprintf_s\nwcrtomb\nwcrtomb_s\nwcscat\nwcscat_s\nwcschr\nwcscmp\nwcscoll\nwcscpy\nwcscpy_s\nwcscspn\nwcsftime\nwcslen\nwcsncat\nwcsncat_s\nwcsncmp\nwcsncpy\nwcsncpy_s\nwcsnlen\nwcspbrk\nwcsrchr\nwcsrtombs\nwcsrtombs_s\nwcsspn\nwcsstr\nwcstod\nwcstok\nwcstok_s\nwcstol\nwcstombs\nwcstombs_s\nwcstoul\nwcsxfrm\nwctob\nwctomb\nwctomb_s\nwprintf\nwprintf_s\nwscanf\nwscanf_s\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/user32.def",
    "content": "LIBRARY user32.dll\n\nEXPORTS\nActivateKeyboardLayout\nAdjustWindowRect\nAdjustWindowRectEx\nAlignRects\nAllowSetForegroundWindow\nAnimateWindow\nAnyPopup\nAppendMenuA\nAppendMenuW\nArrangeIconicWindows\nAttachThreadInput\nBeginDeferWindowPos\nBeginPaint\nBlockInput\nBringWindowToTop\nBroadcastSystemMessage\nBroadcastSystemMessageA\nBroadcastSystemMessageW\nCalcChildScroll\nCallMsgFilter\nCallMsgFilterA\nCallMsgFilterW\nCallNextHookEx\nCallWindowProcA\nCallWindowProcW\nCascadeChildWindows\nCascadeWindows\nChangeClipboardChain\nChangeDisplaySettingsA\nChangeDisplaySettingsExA\nChangeDisplaySettingsExW\nChangeDisplaySettingsW\nChangeMenuA\nChangeMenuW\nCharLowerA\nCharLowerBuffA\nCharLowerBuffW\nCharLowerW\nCharNextA\nCharNextExA\nCharNextExW\nCharNextW\nCharPrevA\nCharPrevExA\nCharPrevExW\nCharPrevW\nCharToOemA\nCharToOemBuffA\nCharToOemBuffW\nCharToOemW\nCharUpperA\nCharUpperBuffA\nCharUpperBuffW\nCharUpperW\nCheckDlgButton\nCheckMenuItem\nCheckMenuRadioItem\nCheckRadioButton\nChildWindowFromPoint\nChildWindowFromPointEx\nClientThreadConnect\nClientToScreen\nClipCursor\nCloseClipboard\nCloseDesktop\nCloseWindow\nCloseWindowStation\nCopyAcceleratorTableA\nCopyAcceleratorTableW\nCopyIcon\nCopyImage\nCopyRect\nCountClipboardFormats\nCreateAcceleratorTableA\nCreateAcceleratorTableW\nCreateCaret\nCreateCursor\nCreateDesktopA\nCreateDesktopW\nCreateDialogIndirectParamA\nCreateDialogIndirectParamW\nCreateDialogParamA\nCreateDialogParamW\nCreateIcon\nCreateIconFromResource\nCreateIconFromResourceEx\nCreateIconIndirect\nCreateMDIWindowA\nCreateMDIWindowW\nCreateMenu\nCreatePopupMenu\nCreateWindowExA\nCreateWindowExW\nCreateWindowStationA\nCreateWindowStationW\nDdeAbandonTransaction\nDdeAccessData\nDdeAddData\nDdeClientTransaction\nDdeCmpStringHandles\nDdeConnect\nDdeConnectList\nDdeCreateDataHandle\nDdeCreateStringHandleA\nDdeCreateStringHandleW\nDdeDisconnect\nDdeDisconnectList\nDdeEnableCallback\nDdeFreeDataHandle\nDdeFreeStringHandle\nDdeGetData\nDdeGetLastError\nDdeImpersonateClient\nDdeInitializeA\nDdeInitializeW\nDdeKeepStringHandle\nDdeNameService\nDdePostAdvise\nDdeQueryConvInfo\nDdeQueryNextServer\nDdeQueryStringA\nDdeQueryStringW\nDdeReconnect\nDdeSetQualityOfService\nDdeSetUserHandle\nDdeUnaccessData\nDdeUninitialize\nDefDlgProcA\nDefDlgProcW\nDefFrameProcA\nDefFrameProcW\nDefMDIChildProcA\nDefMDIChildProcW\nDefWindowProcA\nDefWindowProcW\nDeferWindowPos\nDeleteMenu\nDestroyAcceleratorTable\nDestroyCaret\nDestroyCursor\nDestroyIcon\nDestroyMenu\nDestroyWindow\nDialogBoxIndirectParamA\nDialogBoxIndirectParamW\nDialogBoxParamA\nDialogBoxParamW\nDispatchMessageA\nDispatchMessageW\nDlgDirListA\nDlgDirListComboBoxA\nDlgDirListComboBoxW\nDlgDirListW\nDlgDirSelectComboBoxExA\nDlgDirSelectComboBoxExW\nDlgDirSelectExA\nDlgDirSelectExW\nDragDetect\nDragObject\nDrawAnimatedRects\nDrawCaption\nDrawCaptionTempA\nDrawCaptionTempW\nDrawEdge\nDrawFocusRect\nDrawFrame\nDrawFrameControl\nDrawIcon\nDrawIconEx\nDrawMenuBar\nDrawMenuBarTemp\nDrawStateA\nDrawStateW\nDrawTextA\nDrawTextExA\nDrawTextExW\nDrawTextW\nEditWndProc\nEmptyClipboard\nEnableMenuItem\nEnableScrollBar\nEnableWindow\nEndDeferWindowPos\nEndDialog\nEndMenu\nEndPaint\nEndTask\nEnumChildWindows\nEnumClipboardFormats\nEnumDesktopWindows\nEnumDesktopsA\nEnumDesktopsW\nEnumDisplayDevicesA\nEnumDisplayDevicesW\nEnumDisplayMonitors\nEnumDisplaySettingsA\nEnumDisplaySettingsExA\nEnumDisplaySettingsExW\nEnumDisplaySettingsW\nEnumPropsA\nEnumPropsExA\nEnumPropsExW\nEnumPropsW\nEnumThreadWindows\nEnumWindowStationsA\nEnumWindowStationsW\nEnumWindows\nEqualRect\nExcludeUpdateRgn\nExitWindowsEx\nFillRect\nFindWindowA\nFindWindowExA\nFindWindowExW\nFindWindowW\nFlashWindow\nFlashWindowEx\nFrameRect\nFreeDDElParam\nGetActiveWindow\nGetAltTabInfo\nGetAncestor\nGetAsyncKeyState\nGetCapture\nGetCaretBlinkTime\nGetCaretPos\nGetClassInfoA\nGetClassInfoExA\nGetClassInfoExW\nGetClassInfoW\nGetClassLongA\nGetClassLongW\nGetClassNameA\nGetClassNameW\nGetClassWord\nGetClientRect\nGetClipCursor\nGetClipboardData\nGetClipboardFormatNameA\nGetClipboardFormatNameW\nGetClipboardOwner\nGetClipboardSequenceNumber\nGetClipboardViewer\nGetComboBoxInfo\nGetCursor\nGetCursorInfo\nGetCursorPos\nGetDC\nGetDCEx\nGetDesktopWindow\nGetDialogBaseUnits\nGetDlgCtrlID\nGetDlgItem\nGetDlgItemInt\nGetDlgItemTextA\nGetDlgItemTextW\nGetDoubleClickTime\nGetFocus\nGetForegroundWindow\nGetGUIThreadInfo\nGetGuiResources\nGetIconInfo\nGetInputDesktop\nGetInputState\nGetInternalWindowPos\nGetKBCodePage\nGetKeyNameTextA\nGetKeyNameTextW\nGetKeyState\nGetKeyboardLayout\nGetKeyboardLayoutList\nGetKeyboardLayoutNameA\nGetKeyboardLayoutNameW\nGetKeyboardState\nGetKeyboardType\nGetLastActivePopup\nGetListBoxInfo\nGetMenu\nGetMenuBarInfo\nGetMenuCheckMarkDimensions\nGetMenuContextHelpId\nGetMenuDefaultItem\nGetMenuInfo\nGetMenuItemCount\nGetMenuItemID\nGetMenuItemInfoA\nGetMenuItemInfoW\nGetMenuItemRect\nGetMenuState\nGetMenuStringA\nGetMenuStringW\nGetMessageA\nGetMessageExtraInfo\nGetMessagePos\nGetMessageTime\nGetMessageW\nGetMonitorInfoA\nGetMonitorInfoW\nGetMouseMovePoints\nGetMouseMovePointsEx\nGetNextDlgGroupItem\nGetNextDlgTabItem\nGetNextQueueWindow\nGetOpenClipboardWindow\nGetParent\nGetPriorityClipboardFormat\nGetProcessDefaultLayout\nGetProcessWindowStation\nGetPropA\nGetPropW\nGetQueueStatus\nGetScrollBarInfo\nGetScrollInfo\nGetScrollPos\nGetScrollRange\nGetShellWindow\nGetSubMenu\nGetSysColor\nGetSysColorBrush\nGetSystemMenu\nGetSystemMetrics\nGetTabbedTextExtentA\nGetTabbedTextExtentW\nGetThreadDesktop\nGetTitleBarInfo\nGetTopWindow\nGetUpdateRect\nGetUpdateRgn\nGetUserObjectInformationA\nGetUserObjectInformationW\nGetUserObjectSecurity\nGetWindow\nGetWindowContextHelpId\nGetWindowDC\nGetWindowInfo\nGetWindowLongA\nGetWindowLongW\nGetWindowModuleFileNameA\nGetWindowModuleFileNameW\nGetWindowPlacement\nGetWindowRect\nGetWindowRgn\nGetWindowTextA\nGetWindowTextLengthA\nGetWindowTextLengthW\nGetWindowTextW\nGetWindowThreadProcessId\nGetWindowWord\nGrayStringA\nGrayStringW\nHasSystemSleepStarted\nHideCaret\nHiliteMenuItem\nIMPGetIMEA\nIMPGetIMEW\nIMPQueryIMEA\nIMPQueryIMEW\nIMPSetIMEA\nIMPSetIMEW\nImpersonateDdeClientWindow\nInSendMessage\nInSendMessageEx\nInflateRect\nInitSharedTable\nInitTask\nInsertMenuA\nInsertMenuItemA\nInsertMenuItemW\nInsertMenuW\nInternalGetWindowText\nIntersectRect\nInvalidateRect\nInvalidateRgn\nInvertRect\nIsCharAlphaA\nIsCharAlphaNumericA\nIsCharAlphaNumericW\nIsCharAlphaW\nIsCharLowerA\nIsCharLowerW\nIsCharUpperA\nIsCharUpperW\nIsChild\nIsClipboardFormatAvailable\nIsDialogMessage\nIsDialogMessageA\nIsDialogMessageW\nIsDlgButtonChecked\nIsHungThread\nIsIconic\nIsMenu\nIsRectEmpty\nIsWindow\nIsWindowEnabled\nIsWindowUnicode\nIsWindowVisible\nIsZoomed\nKillTimer\nLoadAcceleratorsA\nLoadAcceleratorsW\nLoadBitmapA\nLoadBitmapW\nLoadCursorA\nLoadCursorFromFileA\nLoadCursorFromFileW\nLoadCursorW\nLoadIconA\nLoadIconW\nLoadImageA\nLoadImageW\nLoadKeyboardLayoutA\nLoadKeyboardLayoutW\nLoadMenuA\nLoadMenuIndirectA\nLoadMenuIndirectW\nLoadMenuW\nLoadStringA\nLoadStringW\nLockSetForegroundWindow\nLockWindowStation\nLockWindowUpdate\nLookupIconIdFromDirectory\nLookupIconIdFromDirectoryEx\nMapDialogRect\nMapVirtualKeyA\nMapVirtualKeyExA\nMapVirtualKeyExW\nMapVirtualKeyW\nMapWindowPoints\nMenuItemFromPoint\nMessageBeep\nMessageBoxA\nMessageBoxExA\nMessageBoxExW\nMessageBoxIndirectA\nMessageBoxIndirectW\nMessageBoxW\nModifyAccess\nModifyMenuA\nModifyMenuW\nMonitorFromPoint\nMonitorFromRect\nMonitorFromWindow\nMoveWindow\nMsgWaitForMultipleObjects\nMsgWaitForMultipleObjectsEx\nNotifyWinEvent\nOemKeyScan\nOemToCharA\nOemToCharBuffA\nOemToCharBuffW\nOemToCharW\nOffsetRect\nOpenClipboard\nOpenDesktopA\nOpenDesktopW\nOpenIcon\nOpenInputDesktop\nOpenWindowStationA\nOpenWindowStationW\nPackDDElParam\nPaintDesktop\nPeekMessageA\nPeekMessageW\nPlaySoundEvent\nPostMessageA\nPostMessageW\nPostQuitMessage\nPostThreadMessageA\nPostThreadMessageW\nPtInRect\nRealChildWindowFromPoint\nRealGetWindowClass\nRedrawWindow\nRegisterClassA\nRegisterClassExA\nRegisterClassExW\nRegisterClassW\nRegisterClipboardFormatA\nRegisterClipboardFormatW\nRegisterDeviceNotificationA\nRegisterDeviceNotificationW\nRegisterHotKey\nRegisterLogonProcess\nRegisterNetworkCapabilities\nRegisterSystemThread\nRegisterTasklist\nRegisterWindowMessageA\nRegisterWindowMessageW\nReleaseCapture\nReleaseDC\nRemoveMenu\nRemovePropA\nRemovePropW\nReplyMessage\nReuseDDElParam\nScreenToClient\nScrollDC\nScrollWindow\nScrollWindowEx\nSendDlgItemMessageA\nSendDlgItemMessageW\nSendIMEMessageExA\nSendIMEMessageExW\nSendInput\nSendMessageA\nSendMessageCallbackA\nSendMessageCallbackW\nSendMessageTimeoutA\nSendMessageTimeoutW\nSendMessageW\nSendNotifyMessageA\nSendNotifyMessageW\nSetActiveWindow\nSetCapture\nSetCaretBlinkTime\nSetCaretPos\nSetClassLongA\nSetClassLongW\nSetClassWord\nSetClipboardData\nSetClipboardViewer\nSetCursor\nSetCursorPos\nSetDebugErrorLevel\nSetDeskWallpaper\nSetDesktopBitmap\nSetDlgItemInt\nSetDlgItemTextA\nSetDlgItemTextW\nSetDoubleClickTime\nSetFocus\nSetForegroundWindow\nSetInternalWindowPos\nSetKeyboardState\nSetLastErrorEx\nSetLogonNotifyWindow\nSetMenu\nSetMenuContextHelpId\nSetMenuDefaultItem\nSetMenuInfo\nSetMenuItemBitmaps\nSetMenuItemInfoA\nSetMenuItemInfoW\nSetMessageExtraInfo\nSetMessageQueue\nSetParent\nSetProcessDefaultLayout\nSetProcessWindowStation\nSetPropA\nSetPropW\nSetRect\nSetRectEmpty\nSetScrollInfo\nSetScrollPos\nSetScrollRange\nSetShellWindow\nSetSysColors\nSetSysColorsTemp\nSetSystemCursor\nSetThreadDesktop\nSetTimer\nSetUserObjectInformationA\nSetUserObjectInformationW\nSetUserObjectSecurity\nSetWinEventHook\nSetWindowContextHelpId\nSetWindowFullScreenState\nSetWindowLongA\nSetWindowLongW\nSetWindowPlacement\nSetWindowPos\nSetWindowRgn\nSetWindowTextA\nSetWindowTextW\nSetWindowWord\nSetWindowsHookA\nSetWindowsHookExA\nSetWindowsHookExW\nSetWindowsHookW\nShowCaret\nShowCursor\nShowOwnedPopups\nShowScrollBar\nShowWindow\nShowWindowAsync\nSubtractRect\nSwapMouseButton\nSwitchDesktop\nSwitchToThisWindow\nSysErrorBox\nSystemParametersInfoA\nSystemParametersInfoW\nTabbedTextOutA\nTabbedTextOutW\nTileChildWindows\nTileWindows\nToAscii\nToAsciiEx\nToUnicode\nToUnicodeEx\nTrackMouseEvent\nTrackPopupMenu\nTrackPopupMenuEx\nTranslateAccelerator\nTranslateAcceleratorA\nTranslateAcceleratorW\nTranslateMDISysAccel\nTranslateMessage\nUnhookWinEvent\nUnhookWindowsHook\nUnhookWindowsHookEx\nUnionRect\nUnloadKeyboardLayout\nUnlockWindowStation\nUnpackDDElParam\nUnregisterClassA\nUnregisterClassW\nUnregisterDeviceNotification\nUnregisterHotKey\nUpdateWindow\nUserClientDllInitialize\nUserIsSystemResumeAutomatic\nUserSetDeviceHoldState\nUserSignalProc\nUserTickleTimer\nValidateRect\nValidateRgn\nVkKeyScanA\nVkKeyScanExA\nVkKeyScanExW\nVkKeyScanW\nWINNLSEnableIME\nWINNLSGetEnableStatus\nWINNLSGetIMEHotkey\nWNDPROC_CALLBACK\nWaitForInputIdle\nWaitMessage\nWinHelpA\nWinHelpW\nWinOldAppHackoMatic\nWindowFromDC\nWindowFromPoint\nYieldTask\n_SetProcessDefaultLayout\nkeybd_event\nmouse_event\nwsprintfA\nwsprintfW\nwvsprintfA\nwvsprintfW\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/lib/wincrt1.c",
    "content": "//+---------------------------------------------------------------------------\n\n#include <windows.h>\n#include <stdlib.h>\n\n#define __UNKNOWN_APP    0\n#define __CONSOLE_APP    1\n#define __GUI_APP        2\nvoid __set_app_type(int);\nvoid _controlfp(unsigned a, unsigned b);\n\nint _winstart(void)\n{\n    __TRY__\n    char *szCmd;\n    STARTUPINFO startinfo;\n    int fShow;\n    int ret;\n\n    __set_app_type(__GUI_APP);\n    _controlfp(0x10000, 0x30000);\n\n    szCmd = GetCommandLine();\n    if (szCmd) {\n        while (' ' == *szCmd)\n            szCmd++;\n        if ('\\\"' == *szCmd) {\n            while (*++szCmd)\n                if ('\\\"' == *szCmd) {\n                    szCmd++;\n                    break;\n                }\n        } else {\n            while (*szCmd && ' ' != *szCmd)\n                szCmd++;\n        }\n        while (' ' == *szCmd)\n            szCmd++;\n    }\n\n    GetStartupInfo(&startinfo);\n    fShow = startinfo.wShowWindow;\n    if (0 == (startinfo.dwFlags & STARTF_USESHOWWINDOW))\n        fShow = SW_SHOWDEFAULT;\n\n    ret = WinMain(GetModuleHandle(NULL), NULL, szCmd, fShow);\n    exit(ret);\n}\n\nint _runwinmain(int argc, char **argv)\n{\n    char *szCmd, *p;\n\n    p = GetCommandLine();\n    szCmd = NULL;\n    if (argc > 1)\n        szCmd = strstr(p, argv[1]);\n    if (NULL == szCmd)\n        szCmd = \"\";\n    else if (szCmd > p && szCmd[-1] == '\\\"')\n        --szCmd;\n    return WinMain(GetModuleHandle(NULL), NULL, szCmd, SW_SHOWDEFAULT);\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/tcc-win32.txt",
    "content": "\n    TinyCC\n    ======\n\n    This file contains specific information for usage of TinyCC\n    under MS-Windows.  See tcc-doc.html to have all the features.\n\n\n    Installation from the binary ZIP package:\n    -----------------------------------------\n    Unzip the package to a directory of your choice.\n    \n\n    Set the system PATH:\n    --------------------\n    To be able to invoke the compiler from everywhere on your computer by\n    just typing \"tcc\", please add the directory containing tcc.exe to your\n    system PATH.\n\n\n    Examples:\n    ---------\n    Open a console window (DOS box) and 'cd' to the examples directory.\n\n    For the 'Fibonacci' example type:\n\n\ttcc fib.c\n\n    For the 'Hello Windows' GUI example type:\n\n\ttcc hello_win.c\n\n    For the 'Hello DLL' example type\n\n\ttcc -shared dll.c\n\ttiny_impdef dll.dll (optional)\n        tcc hello_dll.c dll.def\n\n\n    Using libtcc as JIT compiler in your program\n    --------------------------------------------\n    Check out the 'libtcc_test' example:\n\n    - Running it from source:\n        tcc -I libtcc libtcc/libtcc.def -run examples/libtcc_test.c\n\n    - Compiling with TCC:\n        tcc examples/libtcc_test.c -I libtcc libtcc/libtcc.def\n\n    - Compiling with MinGW:\n        gcc examples/libtcc_test.c -I libtcc libtcc.dll\n\n    - Compiling with MSVC:\n        lib /def:libtcc\\libtcc.def /out:libtcc.lib\n        cl /MD examples/libtcc_test.c -I libtcc libtcc.lib\n\n\n    Import Definition Files:\n    ------------------------\n    To link with Windows system DLLs, TCC uses import definition\n    files (.def) instead of libraries.\n\n    The included 'tiny_impdef' program may be used to make additional \n    .def files for any DLL. For example:\n\n        tiny_impdef.exe opengl32.dll\n\n    Put opengl32.def into the tcc/lib directory.  Specify -lopengl32 at\n    the TCC commandline to link a program that uses opengl32.dll.\n\n\n    Header Files:\n    -------------\n    The system header files (except _mingw.h) are from the MinGW\n    distribution:\n\n\thttp://www.mingw.org/\n\n    From the windows headers, only a minimal set is included.  If you need\n    more,  get MinGW's \"w32api\" package.  Extract the files from \"include\"\n    into your \"tcc/include/winapi\" directory.\n\n\n    Resource Files:\n    ---------------\n    TCC can link windows resources in coff format as generated by MinGW's\n    windres.exe.  For example:\n\n        windres -O coff app.rc -o appres.o\n        tcc app.c appres.o -o app.exe\n\n\n    Tiny Libmaker:\n    --------------\n    The included tiny_libmaker tool by Timovj Lahde can be used as\n    'ar' replacement to make a library from several object files:\n\n\ttiny_libmaker [rcs] library objectfiles ...\n\n\n    Compilation from source:\n    ------------------------\n    * You can use the MinGW and MSYS tools available at\n\n        http://www.mingw.org\n\n      Untar the TCC archive and type in the MSYS shell:\n\n        ./configure [--prefix installpath]\n        make\n        make install\n\n    The default install location is c:\\Program Files\\tcc\n\n    * Alternatively you can compile TCC with just GCC from MinGW using\n\n        build-tcc.bat (from the win32 directory)\n\n      To install, copy the entire contents of the win32 directory to\n      where you want.\n\n\n    Limitations:\n    ------------\n    - On the object file level, currently TCC supports only the ELF format,\n      not COFF as used by MinGW and MSVC.  It is not possible to exchange\n      object files or libraries between TCC and these compilers.  However\n      libraries for TCC from objects by TCC can be made using tiny_libmaker\n      or MinGW's ar.\n\n    - No leading underscore is generated in the ELF symbols.\n\n    - Bounds checking (option -b) is not supported on 64-bit OS.\n\n\n    Documentation and License:\n    --------------------------\n    TCC is distributed under the GNU Lesser General Public License. (See\n    COPYING file or http://www.gnu.org/licenses/lgpl-2.1.html)\n\n    TinyCC homepage is at:\n\n\thttp://fabrice.bellard.free.fr/tcc/\n\n\n    WinAPI Help and 3rd-party tools:\n    --------------------------------\n    The Windows API documentation (Win95) in a single .hlp file is\n    available on the lcc-win32 site as \"win32hlp.exe\" or from other\n    locations as \"win32hlp_big.zip\".\n\n    A nice RAD tool to create windows resources (dialog boxes etc.) is\n    \"ResEd\", available at the RadASM website.\n\n\n    --- grischka\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/tools/tiny_impdef.c",
    "content": "/* -------------------------------------------------------------- */\n/*\n * tiny_impdef creates an export definition file (.def) from a dll\n * on MS-Windows. Usage: tiny_impdef library.dll [-o outputfile]\"\n * \n *  Copyright (c) 2005,2007 grischka\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 2 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n */\n\n#ifndef TINY_IMPDEF_GET_EXPORT_NAMES_ONLY\n\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#include <stdio.h>\n#include <io.h>\n#include <malloc.h>\n\nchar *get_export_names(int fd);\n#define tcc_free free\n#define tcc_realloc realloc\n\n/* extract the basename of a file */\nstatic char *file_basename(const char *name)\n{\n    const char *p = strchr(name, 0);\n    while (p > name\n        && p[-1] != '/'\n        && p[-1] != '\\\\'\n        )\n        --p;\n    return (char*)p;\n}\n\nint main(int argc, char **argv)\n{\n    int ret, v, i;\n    char infile[MAX_PATH];\n    char outfile[MAX_PATH];\n\n    static const char *ext[] = { \".dll\", \".exe\", NULL };\n    const char *file, **pp;\n    char path[MAX_PATH], *p, *q;\n    FILE *fp, *op;\n\n    infile[0] = 0;\n    outfile[0] = 0;\n    fp = op = NULL;\n    v = 0;\n    ret = 1;\n    p = NULL;\n\n    for (i = 1; i < argc; ++i) {\n        const char *a = argv[i];\n        if ('-' == a[0]) {\n            if (0 == strcmp(a, \"-v\")) {\n                v = 1;\n            } else if (0 == strcmp(a, \"-o\")) {\n                if (++i == argc)\n                    goto usage;\n                strcpy(outfile, argv[i]);\n            } else\n                goto usage;\n        } else if (0 == infile[0])\n            strcpy(infile, a);\n        else\n            goto usage;\n    }\n\n    if (0 == infile[0]) {\nusage:\n        fprintf(stderr,\n            \"tiny_impdef: create export definition file (.def) from a dll\\n\"\n            \"Usage: tiny_impdef library.dll [-o outputfile]\\n\"\n            );\n        goto the_end;\n    }\n\n    if (0 == outfile[0])\n    {\n        strcpy(outfile, file_basename(infile));\n        q = strrchr(outfile, '.');\n        if (NULL == q)\n            q = strchr(outfile, 0);\n        strcpy(q, \".def\");\n    }\n\n    file = infile;\n\n#ifdef _WIN32\n    pp = ext;\n    do if (SearchPath(NULL, file, *pp, sizeof path, path, NULL)) {\n       file = path;\n       break;\n    } while (*pp++);\n#endif\n\n    fp = fopen(file, \"rb\");\n    if (NULL == fp) {\n        fprintf(stderr, \"tiny_impdef: no such file: %s\\n\", infile);\n        goto the_end;\n    }\n    if (v)\n        printf(\"--> %s\\n\", file);\n\n    p = get_export_names(fileno(fp));\n    if (NULL == p) {\n        fprintf(stderr, \"tiny_impdef: could not get exported function names.\\n\");\n        goto the_end;\n    }\n\n    op = fopen(outfile, \"w\");\n    if (NULL == op) {\n        fprintf(stderr, \"tiny_impdef: could not create output file: %s\\n\", outfile);\n        goto the_end;\n    }\n\n    fprintf(op, \"LIBRARY %s\\n\\nEXPORTS\\n\", file_basename(file));\n    for (q = p, i = 0; *q; ++i) {\n        fprintf(op, \"%s\\n\", q);\n        q += strlen(q) + 1;\n    }\n\n    if (v) {\n        printf(\"<-- %s\\n\", outfile);\n        printf(\"%d symbol(s) found\\n\", i);\n    }\n\n    ret = 0;\n\nthe_end:\n    if (p)\n        free(p);\n    if (fp)\n        fclose(fp);\n    if (op)\n        fclose(op);\n    return ret;\n}\n\nint read_mem(int fd, unsigned offset, void *buffer, unsigned len)\n{\n    lseek(fd, offset, SEEK_SET);\n    return len == read(fd, buffer, len);\n}\n\n/* -------------------------------------------------------------- */\n\n/* -------------------------------------------------------------- */\n#endif\n\nchar *get_export_names(int fd)\n{\n    int l, i, n, n0;\n    char *p;\n\n    IMAGE_SECTION_HEADER ish;\n    IMAGE_EXPORT_DIRECTORY ied;\n    IMAGE_DOS_HEADER dh;\n    IMAGE_FILE_HEADER ih;\n    DWORD sig, ref, addr, ptr, namep;\n#ifdef TCC_TARGET_X86_64\n    IMAGE_OPTIONAL_HEADER64 oh;\n    const int MACHINE = 0x8664;\n#else\n    IMAGE_OPTIONAL_HEADER32 oh;\n    const int MACHINE = 0x014C;\n#endif\n    int pef_hdroffset, opt_hdroffset, sec_hdroffset;\n\n    n = n0 = 0;\n    p = NULL;\n\n    if (!read_mem(fd, 0, &dh, sizeof dh))\n        goto the_end;\n    if (!read_mem(fd, dh.e_lfanew, &sig, sizeof sig))\n        goto the_end;\n    if (sig != 0x00004550)\n        goto the_end;\n    pef_hdroffset = dh.e_lfanew + sizeof sig;\n    if (!read_mem(fd, pef_hdroffset, &ih, sizeof ih))\n        goto the_end;\n    if (MACHINE != ih.Machine)\n        goto the_end;\n    opt_hdroffset = pef_hdroffset + sizeof ih;\n    sec_hdroffset = opt_hdroffset + sizeof oh;\n    if (!read_mem(fd, opt_hdroffset, &oh, sizeof oh))\n        goto the_end;\n\n    if (IMAGE_DIRECTORY_ENTRY_EXPORT >= oh.NumberOfRvaAndSizes)\n        goto the_end;\n\n    addr = oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;\n    //printf(\"addr: %08x\\n\", addr);\n    for (i = 0; i < ih.NumberOfSections; ++i) {\n        if (!read_mem(fd, sec_hdroffset + i * sizeof ish, &ish, sizeof ish))\n            goto the_end;\n        //printf(\"vaddr: %08x\\n\", ish.VirtualAddress);\n        if (addr >= ish.VirtualAddress && addr < ish.VirtualAddress + ish.SizeOfRawData)\n            goto found;\n    }\n    goto the_end;\n\nfound:\n    ref = ish.VirtualAddress - ish.PointerToRawData;\n    if (!read_mem(fd, addr - ref, &ied, sizeof ied))\n        goto the_end;\n\n    namep = ied.AddressOfNames - ref;\n    for (i = 0; i < ied.NumberOfNames; ++i) {\n        if (!read_mem(fd, namep, &ptr, sizeof ptr))\n            goto the_end;\n        namep += sizeof ptr;\n        for (l = 0;;) {\n            if (n+1 >= n0)\n                p = tcc_realloc(p, n0 = n0 ? n0 * 2 : 256);\n            if (!read_mem(fd, ptr - ref + l, p + n, 1) || ++l >= 80) {\n                tcc_free(p), p = NULL;\n                goto the_end;\n            }\n            if (p[n++] == 0)\n                break;\n        }\n    }\n    if (p)\n        p[n] = 0;\nthe_end:\n    return p;\n}\n\n/* -------------------------------------------------------------- */\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/win32/tools/tiny_libmaker.c",
    "content": "/*\n * This program is for making libtcc1.a without ar\n * tiny_libmaker - tiny elf lib maker\n * usage: tiny_libmaker [lib] files...\n * Copyright (c) 2007 Timppa\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n */\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"../../elf.h\"\n\n#ifdef TCC_TARGET_X86_64\n# define ELFCLASSW ELFCLASS64\n# define ElfW(type) Elf##64##_##type\n# define ELFW(type) ELF##64##_##type\n#else\n# define ELFCLASSW ELFCLASS32\n# define ElfW(type) Elf##32##_##type\n# define ELFW(type) ELF##32##_##type\n#endif\n\n#define ARMAG  \"!<arch>\\n\"\n#define ARFMAG \"`\\n\"\n\ntypedef struct ArHdr {\n    char ar_name[16];\n    char ar_date[12];\n    char ar_uid[6];\n    char ar_gid[6];\n    char ar_mode[8];\n    char ar_size[10];\n    char ar_fmag[2];\n} ArHdr;\n\nunsigned long le2belong(unsigned long ul) {\n    return ((ul & 0xFF0000)>>8)+((ul & 0xFF000000)>>24) +\n        ((ul & 0xFF)<<24)+((ul & 0xFF00)<<8);\n}\n\nArHdr arhdr = {\n    \"/               \",\n    \"            \",\n    \"0     \",\n    \"0     \",\n    \"0       \",\n    \"          \",\n    ARFMAG\n    };\n\nArHdr arhdro = {\n    \"                \",\n    \"            \",\n    \"0     \",\n    \"0     \",\n    \"0       \",\n    \"          \",\n    ARFMAG\n    };\n\nint main(int argc, char **argv)\n{\n    FILE *fi, *fh = NULL, *fo = NULL;\n    ElfW(Ehdr) *ehdr;\n    ElfW(Shdr) *shdr;\n    ElfW(Sym) *sym;\n    int i, fsize, iarg;\n    char *buf, *shstr, *symtab = NULL, *strtab = NULL;\n    int symtabsize = 0;//, strtabsize = 0;\n    char *anames = NULL;\n    int *afpos = NULL;\n    int istrlen, strpos = 0, fpos = 0, funccnt = 0, funcmax, hofs;\n    char afile[260], tfile[260], stmp[20];\n    char *file, *name;\n    int ret = 2;\n\n\n    strcpy(afile, \"ar_test.a\");\n    iarg = 1;\n\n    if (argc < 2)\n    {\n        printf(\"usage: tiny_libmaker [lib] file...\\n\");\n        return 1;\n    }\n    for (i=1; i<argc; i++) {\n        istrlen = strlen(argv[i]);\n        if (argv[i][istrlen-2] == '.') {\n            if(argv[i][istrlen-1] == 'a')\n                strcpy(afile, argv[i]);\n            else if(argv[i][istrlen-1] == 'o') {\n                iarg = i;\n                break;\n            }\n        }\n    }\n\n    if ((fh = fopen(afile, \"wb\")) == NULL)\n    {\n        fprintf(stderr, \"Can't open file %s \\n\", afile);\n        goto the_end;\n    }\n\n    sprintf(tfile, \"%s.tmp\", afile);\n    if ((fo = fopen(tfile, \"wb+\")) == NULL)\n    {\n        fprintf(stderr, \"Can't create temporary file %s\\n\", tfile);\n        goto the_end;\n    }\n\n    funcmax = 250;\n    afpos = realloc(NULL, funcmax * sizeof *afpos); // 250 func\n    memcpy(&arhdro.ar_mode, \"100666\", 6);\n\n    //iarg = 1;\n    while (iarg < argc)\n    {\n        if (!strcmp(argv[iarg], \"rcs\")) {\n            iarg++;\n            continue;\n        }\n        if ((fi = fopen(argv[iarg], \"rb\")) == NULL)\n        {\n            fprintf(stderr, \"Can't open file %s \\n\", argv[iarg]);\n            goto the_end;\n        }\n        fseek(fi, 0, SEEK_END);\n        fsize = ftell(fi);\n        fseek(fi, 0, SEEK_SET);\n        buf = malloc(fsize + 1);\n        fread(buf, fsize, 1, fi);\n        fclose(fi);\n\n        //printf(\"%s:\\n\", argv[iarg]);\n\n        // elf header\n        ehdr = (ElfW(Ehdr) *)buf;\n        if (ehdr->e_ident[4] != ELFCLASSW)\n        {\n            fprintf(stderr, \"Unsupported Elf Class: %s\\n\", argv[iarg]);\n            goto the_end;\n        }\n\n        shdr = (ElfW(Shdr) *) (buf + ehdr->e_shoff + ehdr->e_shstrndx * ehdr->e_shentsize);\n        shstr = (char *)(buf + shdr->sh_offset);\n        for (i = 0; i < ehdr->e_shnum; i++)\n        {\n            shdr = (ElfW(Shdr) *) (buf + ehdr->e_shoff + i * ehdr->e_shentsize);\n            if (!shdr->sh_offset)\n                continue;\n            if (shdr->sh_type == SHT_SYMTAB)\n            {\n                symtab = (char *)(buf + shdr->sh_offset);\n                symtabsize = shdr->sh_size;\n            }\n            if (shdr->sh_type == SHT_STRTAB)\n            {\n                if (!strcmp(shstr + shdr->sh_name, \".strtab\"))\n                {\n                    strtab = (char *)(buf + shdr->sh_offset);\n                    //strtabsize = shdr->sh_size;\n                }\n            }\n        }\n\n        if (symtab && symtabsize)\n        {\n            int nsym = symtabsize / sizeof(ElfW(Sym));\n            //printf(\"symtab: info size shndx name\\n\");\n            for (i = 1; i < nsym; i++)\n            {\n                sym = (ElfW(Sym) *) (symtab + i * sizeof(ElfW(Sym)));\n                if (sym->st_shndx &&\n                    (sym->st_info == 0x10\n                    || sym->st_info == 0x11\n                    || sym->st_info == 0x12\n                    )) {\n                    //printf(\"symtab: %2Xh %4Xh %2Xh %s\\n\", sym->st_info, sym->st_size, sym->st_shndx, strtab + sym->st_name);\n                    istrlen = strlen(strtab + sym->st_name)+1;\n                    anames = realloc(anames, strpos+istrlen);\n                    strcpy(anames + strpos, strtab + sym->st_name);\n                    strpos += istrlen;\n                    if (++funccnt >= funcmax) {\n                        funcmax += 250;\n                        afpos = realloc(afpos, funcmax * sizeof *afpos); // 250 func more\n                    }\n                    afpos[funccnt] = fpos;\n                }\n            }\n        }\n\n        file = argv[iarg];\n        for (name = strchr(file, 0);\n             name > file && name[-1] != '/' && name[-1] != '\\\\';\n             --name);\n        istrlen = strlen(name);\n        if (istrlen >= sizeof(arhdro.ar_name))\n            istrlen = sizeof(arhdro.ar_name) - 1;\n        memset(arhdro.ar_name, ' ', sizeof(arhdro.ar_name));\n        memcpy(arhdro.ar_name, name, istrlen);\n        arhdro.ar_name[istrlen] = '/';\n        sprintf(stmp, \"%-10d\", fsize);\n        memcpy(&arhdro.ar_size, stmp, 10);\n        fwrite(&arhdro, sizeof(arhdro), 1, fo);\n        fwrite(buf, fsize, 1, fo);\n        free(buf);\n        iarg++;\n        fpos += (fsize + sizeof(arhdro));\n    }\n    hofs = 8 + sizeof(arhdr) + strpos + (funccnt+1) * sizeof(int);\n    fpos = 0;\n    if ((hofs & 1)) // align\n        hofs++, fpos = 1;\n    // write header\n    fwrite(\"!<arch>\\n\", 8, 1, fh);\n    sprintf(stmp, \"%-10d\", (int)(strpos + (funccnt+1) * sizeof(int)));\n    memcpy(&arhdr.ar_size, stmp, 10);\n    fwrite(&arhdr, sizeof(arhdr), 1, fh);\n    afpos[0] = le2belong(funccnt);\n    for (i=1; i<=funccnt; i++)\n        afpos[i] = le2belong(afpos[i] + hofs);\n    fwrite(afpos, (funccnt+1) * sizeof(int), 1, fh);\n    fwrite(anames, strpos, 1, fh);\n    if (fpos)\n        fwrite(\"\", 1, 1, fh);\n    // write objects\n    fseek(fo, 0, SEEK_END);\n    fsize = ftell(fo);\n    fseek(fo, 0, SEEK_SET);\n    buf = malloc(fsize + 1);\n    fread(buf, fsize, 1, fo);\n    fwrite(buf, fsize, 1, fh);\n    free(buf);\n    ret = 0;\nthe_end:\n    if (anames)\n        free(anames);\n    if (afpos)\n        free(afpos);\n    if (fh)\n        fclose(fh);\n    if (fo)\n        fclose(fo), remove(tfile);\n    return ret;\n}\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/x86_64-asm.h",
    "content": "     DEF_ASM_OP0(clc, 0xf8) /* must be first OP0 */\n     DEF_ASM_OP0(cld, 0xfc)\n     DEF_ASM_OP0(cli, 0xfa)\n     DEF_ASM_OP0(clts, 0x0f06)\n     DEF_ASM_OP0(cmc, 0xf5)\n     DEF_ASM_OP0(lahf, 0x9f)\n     DEF_ASM_OP0(sahf, 0x9e)\n     DEF_ASM_OP0(pushfl, 0x9c)\n     DEF_ASM_OP0(popfl, 0x9d)\n     DEF_ASM_OP0(pushf, 0x9c)\n     DEF_ASM_OP0(popf, 0x9d)\n     DEF_ASM_OP0(stc, 0xf9)\n     DEF_ASM_OP0(std, 0xfd)\n     DEF_ASM_OP0(sti, 0xfb)\n     DEF_ASM_OP0(aaa, 0x37)\n     DEF_ASM_OP0(aas, 0x3f)\n     DEF_ASM_OP0(daa, 0x27)\n     DEF_ASM_OP0(das, 0x2f)\n     DEF_ASM_OP0(aad, 0xd50a)\n     DEF_ASM_OP0(aam, 0xd40a)\n     DEF_ASM_OP0(cbw, 0x6698)\n     DEF_ASM_OP0(cwd, 0x6699)\n     DEF_ASM_OP0(cwde, 0x98)\n     DEF_ASM_OP0(cdq, 0x99)\n     DEF_ASM_OP0(cbtw, 0x6698)\n     DEF_ASM_OP0(cwtl, 0x98)\n     DEF_ASM_OP0(cwtd, 0x6699)\n     DEF_ASM_OP0(cltd, 0x99)\n     DEF_ASM_OP0(cqto, 0x4899)\n     DEF_ASM_OP0(int3, 0xcc)\n     DEF_ASM_OP0(into, 0xce)\n     DEF_ASM_OP0(iret, 0xcf)\n     DEF_ASM_OP0(rsm, 0x0faa)\n     DEF_ASM_OP0(hlt, 0xf4)\n     DEF_ASM_OP0(wait, 0x9b)\n     DEF_ASM_OP0(nop, 0x90)\n     DEF_ASM_OP0(xlat, 0xd7)\n\n     /* strings */\nALT(DEF_ASM_OP0L(cmpsb, 0xa6, 0, OPC_BWLQ))\nALT(DEF_ASM_OP0L(scmpb, 0xa6, 0, OPC_BWLQ))\n\nALT(DEF_ASM_OP0L(insb, 0x6c, 0, OPC_BWLQ))\nALT(DEF_ASM_OP0L(outsb, 0x6e, 0, OPC_BWLQ))\n\nALT(DEF_ASM_OP0L(lodsb, 0xac, 0, OPC_BWLQ))\nALT(DEF_ASM_OP0L(slodb, 0xac, 0, OPC_BWLQ))\n\nALT(DEF_ASM_OP0L(movsb, 0xa4, 0, OPC_BWLQ))\nALT(DEF_ASM_OP0L(smovb, 0xa4, 0, OPC_BWLQ))\n\nALT(DEF_ASM_OP0L(scasb, 0xae, 0, OPC_BWLQ))\nALT(DEF_ASM_OP0L(sscab, 0xae, 0, OPC_BWLQ))\n\nALT(DEF_ASM_OP0L(stosb, 0xaa, 0, OPC_BWLQ))\nALT(DEF_ASM_OP0L(sstob, 0xaa, 0, OPC_BWLQ))\n\n     /* bits */\n\nALT(DEF_ASM_OP2(bsfw, 0x0fbc, 0, OPC_MODRM | OPC_WLQ, OPT_REGW | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(bsrw, 0x0fbd, 0, OPC_MODRM | OPC_WLQ, OPT_REGW | OPT_EA, OPT_REGW))\n\nALT(DEF_ASM_OP2(btw, 0x0fa3, 0, OPC_MODRM | OPC_WLQ, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btw, 0x0fba, 4, OPC_MODRM | OPC_WLQ, OPT_IM8, OPT_REGW | OPT_EA))\n\nALT(DEF_ASM_OP2(btsw, 0x0fab, 0, OPC_MODRM | OPC_WLQ, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btsw, 0x0fba, 5, OPC_MODRM | OPC_WLQ, OPT_IM8, OPT_REGW | OPT_EA))\n\nALT(DEF_ASM_OP2(btrw, 0x0fb3, 0, OPC_MODRM | OPC_WLQ, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btrw, 0x0fba, 6, OPC_MODRM | OPC_WLQ, OPT_IM8, OPT_REGW | OPT_EA))\n\nALT(DEF_ASM_OP2(btcw, 0x0fbb, 0, OPC_MODRM | OPC_WLQ, OPT_REGW, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP2(btcw, 0x0fba, 7, OPC_MODRM | OPC_WLQ, OPT_IM8, OPT_REGW | OPT_EA))\n\n     /* prefixes */\n     DEF_ASM_OP0(lock, 0xf0)\n     DEF_ASM_OP0(rep, 0xf3)\n     DEF_ASM_OP0(repe, 0xf3)\n     DEF_ASM_OP0(repz, 0xf3)\n     DEF_ASM_OP0(repne, 0xf2)\n     DEF_ASM_OP0(repnz, 0xf2)\n\n     DEF_ASM_OP0(invd, 0x0f08)\n     DEF_ASM_OP0(wbinvd, 0x0f09)\n     DEF_ASM_OP0(cpuid, 0x0fa2)\n     DEF_ASM_OP0(wrmsr, 0x0f30)\n     DEF_ASM_OP0(rdtsc, 0x0f31)\n     DEF_ASM_OP0(rdmsr, 0x0f32)\n     DEF_ASM_OP0(rdpmc, 0x0f33)\n     DEF_ASM_OP0(ud2, 0x0f0b)\n\n     /* NOTE: we took the same order as gas opcode definition order */\nALT(DEF_ASM_OP2(movb, 0xa0, 0, OPC_BWLQ, OPT_ADDR, OPT_EAX))\nALT(DEF_ASM_OP2(movb, 0xa2, 0, OPC_BWLQ, OPT_EAX, OPT_ADDR))\nALT(DEF_ASM_OP2(movb, 0x88, 0, OPC_MODRM | OPC_BWLQ, OPT_REG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(movb, 0x8a, 0, OPC_MODRM | OPC_BWLQ, OPT_EA | OPT_REG, OPT_REG))\nALT(DEF_ASM_OP2(movb, 0xb0, 0, OPC_REG | OPC_BWLQ, OPT_IM, OPT_REG))\nALT(DEF_ASM_OP2(movb, 0xc6, 0, OPC_MODRM | OPC_BWLQ, OPT_IM, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP2(movw, 0x8c, 0, OPC_MODRM | OPC_WLQ, OPT_SEG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(movw, 0x8e, 0, OPC_MODRM | OPC_WLQ, OPT_EA | OPT_REG, OPT_SEG))\n\nALT(DEF_ASM_OP2(movw, 0x0f20, 0, OPC_MODRM | OPC_WLQ, OPT_CR, OPT_REG64))\nALT(DEF_ASM_OP2(movw, 0x0f21, 0, OPC_MODRM | OPC_WLQ, OPT_DB, OPT_REG64))\nALT(DEF_ASM_OP2(movw, 0x0f24, 0, OPC_MODRM | OPC_WLQ, OPT_TR, OPT_REG64))\nALT(DEF_ASM_OP2(movw, 0x0f22, 0, OPC_MODRM | OPC_WLQ, OPT_REG64, OPT_CR))\nALT(DEF_ASM_OP2(movw, 0x0f23, 0, OPC_MODRM | OPC_WLQ, OPT_REG64, OPT_DB))\nALT(DEF_ASM_OP2(movw, 0x0f26, 0, OPC_MODRM | OPC_WLQ, OPT_REG64, OPT_TR))\n\nALT(DEF_ASM_OP2(movsbl, 0x0fbe, 0, OPC_MODRM, OPT_REG8 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(movsbw, 0x0fbe, 0, OPC_MODRM | OPC_D16, OPT_REG8 | OPT_EA, OPT_REG16))\nALT(DEF_ASM_OP2(movswl, 0x0fbf, 0, OPC_MODRM, OPT_REG16 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(movslq, 0x4863, 0, OPC_MODRM, OPT_REG32 | OPT_EA, OPT_REG))\nALT(DEF_ASM_OP2(movzbw, 0x0fb6, 0, OPC_MODRM | OPC_WL, OPT_REG8 | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(movzwl, 0x0fb7, 0, OPC_MODRM, OPT_REG16 | OPT_EA, OPT_REG32))\n\nALT(DEF_ASM_OP1(pushw, 0x50, 0, OPC_REG | OPC_WLQ, OPT_REG64))\nALT(DEF_ASM_OP1(pushw, 0xff, 6, OPC_MODRM | OPC_WLQ, OPT_REG64 | OPT_EA))\nALT(DEF_ASM_OP1(pushw, 0x68, 0, OPC_WLQ, OPT_IM32))\nALT(DEF_ASM_OP1(pushw, 0x06, 0, OPC_WLQ, OPT_SEG))\n    DEF_ASM_OP1(pushb, 0x6a, 0, OPC_B, OPT_IM8S)\n\nALT(DEF_ASM_OP1(popw, 0x58, 0, OPC_REG | OPC_WLQ, OPT_REGW))\nALT(DEF_ASM_OP1(popw, 0x8f, 0, OPC_MODRM | OPC_WLQ, OPT_REGW | OPT_EA))\nALT(DEF_ASM_OP1(popw, 0x07, 0, OPC_WLQ, OPT_SEG))\n\nALT(DEF_ASM_OP2(xchgw, 0x90, 0, OPC_REG | OPC_WLQ, OPT_REG, OPT_EAX))\nALT(DEF_ASM_OP2(xchgw, 0x90, 0, OPC_REG | OPC_WLQ, OPT_EAX, OPT_REG))\nALT(DEF_ASM_OP2(xchgb, 0x86, 0, OPC_MODRM | OPC_BWLQ, OPT_REG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(xchgb, 0x86, 0, OPC_MODRM | OPC_BWLQ, OPT_EA | OPT_REG, OPT_REG))\n\nALT(DEF_ASM_OP2(inb, 0xe4, 0, OPC_BWL, OPT_IM8, OPT_EAX))\nALT(DEF_ASM_OP1(inb, 0xe4, 0, OPC_BWL, OPT_IM8))\nALT(DEF_ASM_OP2(inb, 0xec, 0, OPC_BWL, OPT_DX, OPT_EAX))\nALT(DEF_ASM_OP1(inb, 0xec, 0, OPC_BWL, OPT_DX))\n\nALT(DEF_ASM_OP2(outb, 0xe6, 0, OPC_BWL, OPT_EAX, OPT_IM8))\nALT(DEF_ASM_OP1(outb, 0xe6, 0, OPC_BWL, OPT_IM8))\nALT(DEF_ASM_OP2(outb, 0xee, 0, OPC_BWL, OPT_EAX, OPT_DX))\nALT(DEF_ASM_OP1(outb, 0xee, 0, OPC_BWL, OPT_DX))\n\nALT(DEF_ASM_OP2(leaw, 0x8d, 0, OPC_MODRM | OPC_WLQ, OPT_EA, OPT_REG))\n\nALT(DEF_ASM_OP2(les, 0xc4, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lds, 0xc5, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lss, 0x0fb2, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lfs, 0x0fb4, 0, OPC_MODRM, OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(lgs, 0x0fb5, 0, OPC_MODRM, OPT_EA, OPT_REG32))\n\n     /* arith */\nALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLQ, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */\nALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLQ, OPT_EA | OPT_REG, OPT_REG))\nALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLQ, OPT_IMNO64, OPT_EAX))\nALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLQ, OPT_IMNO64, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLQ, OPT_IM8S, OPT_EA | OPT_REG))\n\nALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLQ, OPT_EA | OPT_REG, OPT_REG))\nALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLQ, OPT_REG, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(testb, 0xa8, 0, OPC_BWLQ, OPT_IMNO64, OPT_EAX))\nALT(DEF_ASM_OP2(testb, 0xf6, 0, OPC_MODRM | OPC_BWLQ, OPT_IMNO64, OPT_EA | OPT_REG))\n\nALT(DEF_ASM_OP1(incw, 0x40, 0, OPC_REG | OPC_WLQ, OPT_REGW))\nALT(DEF_ASM_OP1(incb, 0xfe, 0, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP1(decw, 0x48, 0, OPC_REG | OPC_WLQ, OPT_REGW))\nALT(DEF_ASM_OP1(decb, 0xfe, 1, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP1(notb, 0xf6, 2, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP1(negb, 0xf6, 3, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP1(mulb, 0xf6, 4, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP1(imulb, 0xf6, 5, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\n\nALT(DEF_ASM_OP2(imulw, 0x0faf, 0, OPC_MODRM | OPC_WLQ, OPT_REG | OPT_EA, OPT_REG))\nALT(DEF_ASM_OP3(imulw, 0x6b, 0, OPC_MODRM | OPC_WLQ, OPT_IM8S, OPT_REGW | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(imulw, 0x6b, 0, OPC_MODRM | OPC_WLQ, OPT_IM8S, OPT_REGW))\nALT(DEF_ASM_OP3(imulw, 0x69, 0, OPC_MODRM | OPC_WLQ, OPT_IMW, OPT_REGW | OPT_EA, OPT_REGW))\nALT(DEF_ASM_OP2(imulw, 0x69, 0, OPC_MODRM | OPC_WLQ, OPT_IMW, OPT_REGW))\n\nALT(DEF_ASM_OP1(divb, 0xf6, 6, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP2(divb, 0xf6, 6, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA, OPT_EAX))\nALT(DEF_ASM_OP1(idivb, 0xf6, 7, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA))\nALT(DEF_ASM_OP2(idivb, 0xf6, 7, OPC_MODRM | OPC_BWLQ, OPT_REG | OPT_EA, OPT_EAX))\n\n     /* shifts */\nALT(DEF_ASM_OP2(rolb, 0xc0, 0, OPC_MODRM | OPC_BWLQ | OPC_SHIFT, OPT_IM8, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP2(rolb, 0xd2, 0, OPC_MODRM | OPC_BWLQ | OPC_SHIFT, OPT_CL, OPT_EA | OPT_REG))\nALT(DEF_ASM_OP1(rolb, 0xd0, 0, OPC_MODRM | OPC_BWLQ | OPC_SHIFT, OPT_EA | OPT_REG))\n\nALT(DEF_ASM_OP3(shldw, 0x0fa4, 0, OPC_MODRM | OPC_WLQ, OPT_IM8, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP3(shldw, 0x0fa5, 0, OPC_MODRM | OPC_WLQ, OPT_CL, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP2(shldw, 0x0fa5, 0, OPC_MODRM | OPC_WLQ, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP3(shrdw, 0x0fac, 0, OPC_MODRM | OPC_WLQ, OPT_IM8, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP3(shrdw, 0x0fad, 0, OPC_MODRM | OPC_WLQ, OPT_CL, OPT_REGW, OPT_EA | OPT_REGW))\nALT(DEF_ASM_OP2(shrdw, 0x0fad, 0, OPC_MODRM | OPC_WLQ, OPT_REGW, OPT_EA | OPT_REGW))\n\nALT(DEF_ASM_OP1(call, 0xff, 2, OPC_MODRM, OPT_INDIR))\nALT(DEF_ASM_OP1(call, 0xe8, 0, OPC_JMP, OPT_ADDR))\nALT(DEF_ASM_OP1(jmp, 0xff, 4, OPC_MODRM, OPT_INDIR))\nALT(DEF_ASM_OP1(jmp, 0xff, 0, OPC_JMP | OPC_WL, OPT_REGW))\nALT(DEF_ASM_OP1(jmp, 0xeb, 0, OPC_SHORTJMP | OPC_JMP, OPT_ADDR))\n\nALT(DEF_ASM_OP1(lcall, 0xff, 3, 0, OPT_EA))\nALT(DEF_ASM_OP1(ljmp, 0xff, 5, 0, OPT_EA))\n\nALT(DEF_ASM_OP1(int, 0xcd, 0, 0, OPT_IM8))\nALT(DEF_ASM_OP1(seto, 0x0f90, 0, OPC_MODRM | OPC_TEST, OPT_REG8 | OPT_EA))\n    DEF_ASM_OP2(enter, 0xc8, 0, 0, OPT_IM16, OPT_IM8)\n    DEF_ASM_OP0(leave, 0xc9)\n    DEF_ASM_OP0(ret, 0xc3)\nALT(DEF_ASM_OP1(ret, 0xc2, 0, 0, OPT_IM16))\n    DEF_ASM_OP0(lret, 0xcb)\nALT(DEF_ASM_OP1(lret, 0xca, 0, 0, OPT_IM16))\n\nALT(DEF_ASM_OP1(jo, 0x70, 0, OPC_SHORTJMP | OPC_JMP | OPC_TEST, OPT_ADDR))\n    DEF_ASM_OP1(loopne, 0xe0, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loopnz, 0xe0, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loope, 0xe1, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loopz, 0xe1, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(loop, 0xe2, 0, OPC_SHORTJMP, OPT_ADDR)\n    DEF_ASM_OP1(jecxz, 0xe3, 0, OPC_SHORTJMP, OPT_ADDR)\n\n     /* float */\n     /* specific fcomp handling */\nALT(DEF_ASM_OP0L(fcomp, 0xd8d9, 0, 0))\n\nALT(DEF_ASM_OP1(fadd, 0xd8c0, 0, OPC_FARITH | OPC_REG, OPT_ST))\nALT(DEF_ASM_OP2(fadd, 0xd8c0, 0, OPC_FARITH | OPC_REG, OPT_ST, OPT_ST0))\nALT(DEF_ASM_OP0L(fadd, 0xdec1, 0, OPC_FARITH))\nALT(DEF_ASM_OP1(faddp, 0xdec0, 0, OPC_FARITH | OPC_REG, OPT_ST))\nALT(DEF_ASM_OP2(faddp, 0xdec0, 0, OPC_FARITH | OPC_REG, OPT_ST, OPT_ST0))\nALT(DEF_ASM_OP2(faddp, 0xdec0, 0, OPC_FARITH | OPC_REG, OPT_ST0, OPT_ST))\nALT(DEF_ASM_OP0L(faddp, 0xdec1, 0, OPC_FARITH))\nALT(DEF_ASM_OP1(fadds, 0xd8, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\nALT(DEF_ASM_OP1(fiaddl, 0xda, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\nALT(DEF_ASM_OP1(faddl, 0xdc, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\nALT(DEF_ASM_OP1(fiadds, 0xde, 0, OPC_FARITH | OPC_MODRM, OPT_EA))\n\n     DEF_ASM_OP0(fucompp, 0xdae9)\n     DEF_ASM_OP0(ftst, 0xd9e4)\n     DEF_ASM_OP0(fxam, 0xd9e5)\n     DEF_ASM_OP0(fld1, 0xd9e8)\n     DEF_ASM_OP0(fldl2t, 0xd9e9)\n     DEF_ASM_OP0(fldl2e, 0xd9ea)\n     DEF_ASM_OP0(fldpi, 0xd9eb)\n     DEF_ASM_OP0(fldlg2, 0xd9ec)\n     DEF_ASM_OP0(fldln2, 0xd9ed)\n     DEF_ASM_OP0(fldz, 0xd9ee)\n\n     DEF_ASM_OP0(f2xm1, 0xd9f0)\n     DEF_ASM_OP0(fyl2x, 0xd9f1)\n     DEF_ASM_OP0(fptan, 0xd9f2)\n     DEF_ASM_OP0(fpatan, 0xd9f3)\n     DEF_ASM_OP0(fxtract, 0xd9f4)\n     DEF_ASM_OP0(fprem1, 0xd9f5)\n     DEF_ASM_OP0(fdecstp, 0xd9f6)\n     DEF_ASM_OP0(fincstp, 0xd9f7)\n     DEF_ASM_OP0(fprem, 0xd9f8)\n     DEF_ASM_OP0(fyl2xp1, 0xd9f9)\n     DEF_ASM_OP0(fsqrt, 0xd9fa)\n     DEF_ASM_OP0(fsincos, 0xd9fb)\n     DEF_ASM_OP0(frndint, 0xd9fc)\n     DEF_ASM_OP0(fscale, 0xd9fd)\n     DEF_ASM_OP0(fsin, 0xd9fe)\n     DEF_ASM_OP0(fcos, 0xd9ff)\n     DEF_ASM_OP0(fchs, 0xd9e0)\n     DEF_ASM_OP0(fabs, 0xd9e1)\n     DEF_ASM_OP0(fninit, 0xdbe3)\n     DEF_ASM_OP0(fnclex, 0xdbe2)\n     DEF_ASM_OP0(fnop, 0xd9d0)\n     DEF_ASM_OP0(fwait, 0x9b)\n\n    /* fp load */\n    DEF_ASM_OP1(fld, 0xd9c0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fldl, 0xd9c0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(flds, 0xd9, 0, OPC_MODRM, OPT_EA)\nALT(DEF_ASM_OP1(fldl, 0xdd, 0, OPC_MODRM, OPT_EA))\n    DEF_ASM_OP1(fildl, 0xdb, 0, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fildq, 0xdf, 5, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fildll, 0xdf, 5, OPC_MODRM,OPT_EA)\n    DEF_ASM_OP1(fldt, 0xdb, 5, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fbld, 0xdf, 4, OPC_MODRM, OPT_EA)\n\n    /* fp store */\n    DEF_ASM_OP1(fst, 0xddd0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fstl, 0xddd0, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fsts, 0xd9, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fstps, 0xd9, 3, OPC_MODRM, OPT_EA)\nALT(DEF_ASM_OP1(fstl, 0xdd, 2, OPC_MODRM, OPT_EA))\n    DEF_ASM_OP1(fstpl, 0xdd, 3, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fist, 0xdf, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistp, 0xdf, 3, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistl, 0xdb, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistpl, 0xdb, 3, OPC_MODRM, OPT_EA)\n\n    DEF_ASM_OP1(fstp, 0xddd8, 0, OPC_REG, OPT_ST)\n    DEF_ASM_OP1(fistpq, 0xdf, 7, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fistpll, 0xdf, 7, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fstpt, 0xdb, 7, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(fbstp, 0xdf, 6, OPC_MODRM, OPT_EA)\n\n    /* exchange */\n    DEF_ASM_OP0(fxch, 0xd9c9)\nALT(DEF_ASM_OP1(fxch, 0xd9c8, 0, OPC_REG, OPT_ST))\n\n    /* misc FPU */\n    DEF_ASM_OP1(fucom, 0xdde0, 0, OPC_REG, OPT_ST )\n    DEF_ASM_OP1(fucomp, 0xdde8, 0, OPC_REG, OPT_ST )\n\n    DEF_ASM_OP0L(finit, 0xdbe3, 0, OPC_FWAIT)\n    DEF_ASM_OP1(fldcw, 0xd9, 5, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fnstcw, 0xd9, 7, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fstcw, 0xd9, 7, OPC_MODRM | OPC_FWAIT, OPT_EA )\n    DEF_ASM_OP0(fnstsw, 0xdfe0)\nALT(DEF_ASM_OP1(fnstsw, 0xdfe0, 0, 0, OPT_EAX ))\nALT(DEF_ASM_OP1(fnstsw, 0xdd, 7, OPC_MODRM, OPT_EA ))\n    DEF_ASM_OP1(fstsw, 0xdfe0, 0, OPC_FWAIT, OPT_EAX )\nALT(DEF_ASM_OP0L(fstsw, 0xdfe0, 0, OPC_FWAIT))\nALT(DEF_ASM_OP1(fstsw, 0xdd, 7, OPC_MODRM | OPC_FWAIT, OPT_EA ))\n    DEF_ASM_OP0L(fclex, 0xdbe2, 0, OPC_FWAIT)\n    DEF_ASM_OP1(fnstenv, 0xd9, 6, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fstenv, 0xd9, 6, OPC_MODRM | OPC_FWAIT, OPT_EA )\n    DEF_ASM_OP1(fldenv, 0xd9, 4, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fnsave, 0xdd, 6, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fsave, 0xdd, 6, OPC_MODRM | OPC_FWAIT, OPT_EA )\n    DEF_ASM_OP1(frstor, 0xdd, 4, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(ffree, 0xddc0, 4, OPC_REG, OPT_ST )\n    DEF_ASM_OP1(ffreep, 0xdfc0, 4, OPC_REG, OPT_ST )\n    DEF_ASM_OP1(fxsave, 0x0fae, 0, OPC_MODRM, OPT_EA )\n    DEF_ASM_OP1(fxrstor, 0x0fae, 1, OPC_MODRM, OPT_EA )\n\n    /* segments */\n    DEF_ASM_OP2(arpl, 0x63, 0, OPC_MODRM, OPT_REG16, OPT_REG16 | OPT_EA)\n    DEF_ASM_OP2(lar, 0x0f02, 0, OPC_MODRM, OPT_REG32 | OPT_EA, OPT_REG32)\n    DEF_ASM_OP1(lgdt, 0x0f01, 2, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(lidt, 0x0f01, 3, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(lldt, 0x0f00, 2, OPC_MODRM, OPT_EA | OPT_REG)\n    DEF_ASM_OP1(lmsw, 0x0f01, 6, OPC_MODRM, OPT_EA | OPT_REG)\nALT(DEF_ASM_OP2(lslw, 0x0f03, 0, OPC_MODRM | OPC_WL, OPT_EA | OPT_REG, OPT_REG))\n    DEF_ASM_OP1(ltr, 0x0f00, 3, OPC_MODRM, OPT_EA | OPT_REG)\n    DEF_ASM_OP1(sgdt, 0x0f01, 0, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(sidt, 0x0f01, 1, OPC_MODRM, OPT_EA)\n    DEF_ASM_OP1(sldt, 0x0f00, 0, OPC_MODRM, OPT_REG | OPT_EA)\n    DEF_ASM_OP1(smsw, 0x0f01, 4, OPC_MODRM, OPT_REG | OPT_EA)\n    DEF_ASM_OP1(str, 0x0f00, 1, OPC_MODRM, OPT_REG16| OPT_EA)\n    DEF_ASM_OP1(verr, 0x0f00, 4, OPC_MODRM, OPT_REG | OPT_EA)\n    DEF_ASM_OP1(verw, 0x0f00, 5, OPC_MODRM, OPT_REG | OPT_EA)\n\n    /* 486 */\n    DEF_ASM_OP1(bswap, 0x0fc8, 0, OPC_REG, OPT_REG32 )\nALT(DEF_ASM_OP2(xaddb, 0x0fc0, 0, OPC_MODRM | OPC_BWL, OPT_REG, OPT_REG | OPT_EA ))\nALT(DEF_ASM_OP2(cmpxchgb, 0x0fb0, 0, OPC_MODRM | OPC_BWL, OPT_REG, OPT_REG | OPT_EA ))\n    DEF_ASM_OP1(invlpg, 0x0f01, 7, OPC_MODRM, OPT_EA )\n\n    DEF_ASM_OP2(boundl, 0x62, 0, OPC_MODRM, OPT_REG32, OPT_EA)\n    DEF_ASM_OP2(boundw, 0x62, 0, OPC_MODRM | OPC_D16, OPT_REG16, OPT_EA)\n\n    /* pentium */\n    DEF_ASM_OP1(cmpxchg8b, 0x0fc7, 1, OPC_MODRM, OPT_EA )\n\n    /* pentium pro */\nALT(DEF_ASM_OP2(cmovo, 0x0f40, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovno, 0x0f41, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovc, 0x0f42, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovnc, 0x0f43, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovz, 0x0f44, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovnz, 0x0f45, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmovna, 0x0f46, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\nALT(DEF_ASM_OP2(cmova, 0x0f47, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_REG32))\n\n    DEF_ASM_OP2(fcmovb, 0xdac0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmove, 0xdac8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovbe, 0xdad0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovu, 0xdad8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovnb, 0xdbc0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovne, 0xdbc8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovnbe, 0xdbd0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcmovnu, 0xdbd8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n\n    DEF_ASM_OP2(fucomi, 0xdbe8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcomi, 0xdbf0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fucomip, 0xdfe8, 0, OPC_REG, OPT_ST, OPT_ST0 )\n    DEF_ASM_OP2(fcomip, 0xdff0, 0, OPC_REG, OPT_ST, OPT_ST0 )\n\n    /* mmx */\n    DEF_ASM_OP0(emms, 0x0f77) /* must be last OP0 */\n    DEF_ASM_OP2(movd, 0x0f6e, 0, OPC_MODRM, OPT_EA | OPT_REG32, OPT_MMX )\nALT(DEF_ASM_OP2(movd, 0x0f7e, 0, OPC_MODRM, OPT_MMX, OPT_EA | OPT_REG32 ))\nALT(DEF_ASM_OP2(movq, 0x0f6f, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX ))\nALT(DEF_ASM_OP2(movq, 0x0f7f, 0, OPC_MODRM, OPT_MMX, OPT_EA | OPT_MMX ))\n    DEF_ASM_OP2(packssdw, 0x0f6b, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(packsswb, 0x0f63, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(packuswb, 0x0f67, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddb, 0x0ffc, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddw, 0x0ffd, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddd, 0x0ffe, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddsb, 0x0fec, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddsw, 0x0fed, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddusb, 0x0fdc, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(paddusw, 0x0fdd, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pand, 0x0fdb, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pandn, 0x0fdf, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpeqb, 0x0f74, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpeqw, 0x0f75, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpeqd, 0x0f76, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpgtb, 0x0f64, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpgtw, 0x0f65, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pcmpgtd, 0x0f66, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pmaddwd, 0x0ff5, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pmulhw, 0x0fe5, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pmullw, 0x0fd5, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(por, 0x0feb, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psllw, 0x0ff1, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psllw, 0x0f71, 6, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(pslld, 0x0ff2, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(pslld, 0x0f72, 6, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psllq, 0x0ff3, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psllq, 0x0f73, 6, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psraw, 0x0fe1, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psraw, 0x0f71, 4, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrad, 0x0fe2, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrad, 0x0f72, 4, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrlw, 0x0fd1, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrlw, 0x0f71, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrld, 0x0fd2, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrld, 0x0f72, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psrlq, 0x0fd3, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\nALT(DEF_ASM_OP2(psrlq, 0x0f73, 2, OPC_MODRM, OPT_IM8, OPT_MMX ))\n    DEF_ASM_OP2(psubb, 0x0ff8, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubw, 0x0ff9, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubd, 0x0ffa, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubsb, 0x0fe8, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubsw, 0x0fe9, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubusb, 0x0fd8, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(psubusw, 0x0fd9, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckhbw, 0x0f68, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckhwd, 0x0f69, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckhdq, 0x0f6a, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpcklbw, 0x0f60, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpcklwd, 0x0f61, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(punpckldq, 0x0f62, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n    DEF_ASM_OP2(pxor, 0x0fef, 0, OPC_MODRM, OPT_EA | OPT_MMX, OPT_MMX )\n\n#undef ALT\n#undef DEF_ASM_OP0\n#undef DEF_ASM_OP0L\n#undef DEF_ASM_OP1\n#undef DEF_ASM_OP2\n#undef DEF_ASM_OP3\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinycc/x86_64-gen.c",
    "content": "/*\n *  x86-64 code generator for TCC\n *\n *  Copyright (c) 2008 Shinichiro Hamaji\n *\n *  Based on i386-gen.c by Fabrice Bellard\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n#ifdef TARGET_DEFS_ONLY\n\n/* number of available registers */\n#define NB_REGS         5\n#define NB_ASM_REGS     8\n\n/* a register can belong to several classes. The classes must be\n   sorted from more general to more precise (see gv2() code which does\n   assumptions on it). */\n#define RC_INT     0x0001 /* generic integer register */\n#define RC_FLOAT   0x0002 /* generic float register */\n#define RC_RAX     0x0004\n#define RC_RCX     0x0008\n#define RC_RDX     0x0010\n#define RC_R8      0x0100\n#define RC_R9      0x0200\n#define RC_R10     0x0400\n#define RC_R11     0x0800\n#define RC_XMM0    0x0020\n#define RC_ST0     0x0040 /* only for long double */\n#define RC_IRET    RC_RAX /* function return: integer register */\n#define RC_LRET    RC_RDX /* function return: second integer register */\n#define RC_FRET    RC_XMM0 /* function return: float register */\n\n/* pretty names for the registers */\nenum {\n    TREG_RAX = 0,\n    TREG_RCX = 1,\n    TREG_RDX = 2,\n    TREG_XMM0 = 3,\n    TREG_ST0 = 4,\n\n    TREG_RSI = 6,\n    TREG_RDI = 7,\n    TREG_R8  = 8,\n    TREG_R9  = 9,\n\n    TREG_R10 = 10,\n    TREG_R11 = 11,\n\n    TREG_MEM = 0x10,\n};\n\n#define REX_BASE(reg) (((reg) >> 3) & 1)\n#define REG_VALUE(reg) ((reg) & 7)\n\n/* return registers for function */\n#define REG_IRET TREG_RAX /* single word int return register */\n#define REG_LRET TREG_RDX /* second word return register (for long long) */\n#define REG_FRET TREG_XMM0 /* float return register */\n\n/* defined if function parameters must be evaluated in reverse order */\n#define INVERT_FUNC_PARAMS\n\n/* pointer size, in bytes */\n#define PTR_SIZE 8\n\n/* long double size and alignment, in bytes */\n#define LDOUBLE_SIZE  16\n#define LDOUBLE_ALIGN 8\n/* maximum alignment (for aligned attribute support) */\n#define MAX_ALIGN     8\n\n/******************************************************/\n/* ELF defines */\n\n#define EM_TCC_TARGET EM_X86_64\n\n/* relocation type for 32 bit data relocation */\n#define R_DATA_32   R_X86_64_32\n#define R_DATA_PTR  R_X86_64_64\n#define R_JMP_SLOT  R_X86_64_JUMP_SLOT\n#define R_COPY      R_X86_64_COPY\n\n#define ELF_START_ADDR 0x08048000\n#define ELF_PAGE_SIZE  0x1000\n\n/******************************************************/\n#else /* ! TARGET_DEFS_ONLY */\n/******************************************************/\n#include \"tcc.h\"\n#include <assert.h>\n\nST_DATA const int reg_classes[NB_REGS+7] = {\n    /* eax */ RC_INT | RC_RAX,\n    /* ecx */ RC_INT | RC_RCX,\n    /* edx */ RC_INT | RC_RDX,\n    /* xmm0 */ RC_FLOAT | RC_XMM0,\n    /* st0 */ RC_ST0,\n    0,\n    0,\n    0,\n    RC_INT | RC_R8,\n    RC_INT | RC_R9,\n    RC_INT | RC_R10,\n    RC_INT | RC_R11\n};\n\nstatic unsigned long func_sub_sp_offset;\nstatic int func_ret_sub;\n\n/* XXX: make it faster ? */\nvoid g(int c)\n{\n    int ind1;\n    ind1 = ind + 1;\n    if (ind1 > cur_text_section->data_allocated)\n        section_realloc(cur_text_section, ind1);\n    cur_text_section->data[ind] = c;\n    ind = ind1;\n}\n\nvoid o(unsigned int c)\n{\n    while (c) {\n        g(c);\n        c = c >> 8;\n    }\n}\n\nvoid gen_le16(int v)\n{\n    g(v);\n    g(v >> 8);\n}\n\nvoid gen_le32(int c)\n{\n    g(c);\n    g(c >> 8);\n    g(c >> 16);\n    g(c >> 24);\n}\n\nvoid gen_le64(int64_t c)\n{\n    g(c);\n    g(c >> 8);\n    g(c >> 16);\n    g(c >> 24);\n    g(c >> 32);\n    g(c >> 40);\n    g(c >> 48);\n    g(c >> 56);\n}\n\nvoid orex(int ll, int r, int r2, int b)\n{\n    if ((r & VT_VALMASK) >= VT_CONST)\n        r = 0;\n    if ((r2 & VT_VALMASK) >= VT_CONST)\n        r2 = 0;\n    if (ll || REX_BASE(r) || REX_BASE(r2))\n        o(0x40 | REX_BASE(r) | (REX_BASE(r2) << 2) | (ll << 3));\n    o(b);\n}\n\n/* output a symbol and patch all calls to it */\nvoid gsym_addr(int t, int a)\n{\n    int n, *ptr;\n    while (t) {\n        ptr = (int *)(cur_text_section->data + t);\n        n = *ptr; /* next value */\n        *ptr = a - t - 4;\n        t = n;\n    }\n}\n\nvoid gsym(int t)\n{\n    gsym_addr(t, ind);\n}\n\n/* psym is used to put an instruction with a data field which is a\n   reference to a symbol. It is in fact the same as oad ! */\n#define psym oad\n\nstatic int is64_type(int t)\n{\n    return ((t & VT_BTYPE) == VT_PTR ||\n            (t & VT_BTYPE) == VT_FUNC ||\n            (t & VT_BTYPE) == VT_LLONG);\n}\n\nstatic int is_sse_float(int t) {\n    int bt;\n    bt = t & VT_BTYPE;\n    return bt == VT_DOUBLE || bt == VT_FLOAT;\n}\n\n\n/* instruction + 4 bytes data. Return the address of the data */\nST_FUNC int oad(int c, int s)\n{\n    int ind1;\n\n    o(c);\n    ind1 = ind + 4;\n    if (ind1 > cur_text_section->data_allocated)\n        section_realloc(cur_text_section, ind1);\n    *(int *)(cur_text_section->data + ind) = s;\n    s = ind;\n    ind = ind1;\n    return s;\n}\n\nST_FUNC void gen_addr32(int r, Sym *sym, int c)\n{\n    if (r & VT_SYM)\n        greloc(cur_text_section, sym, ind, R_X86_64_32);\n    gen_le32(c);\n}\n\n/* output constant with relocation if 'r & VT_SYM' is true */\nST_FUNC void gen_addr64(int r, Sym *sym, int64_t c)\n{\n    if (r & VT_SYM)\n        greloc(cur_text_section, sym, ind, R_X86_64_64);\n    gen_le64(c);\n}\n\n/* output constant with relocation if 'r & VT_SYM' is true */\nST_FUNC void gen_addrpc32(int r, Sym *sym, int c)\n{\n    if (r & VT_SYM)\n        greloc(cur_text_section, sym, ind, R_X86_64_PC32);\n    gen_le32(c-4);\n}\n\n/* output got address with relocation */\nstatic void gen_gotpcrel(int r, Sym *sym, int c)\n{\n#ifndef TCC_TARGET_PE\n    Section *sr;\n    ElfW(Rela) *rel;\n    greloc(cur_text_section, sym, ind, R_X86_64_GOTPCREL);\n    sr = cur_text_section->reloc;\n    rel = (ElfW(Rela) *)(sr->data + sr->data_offset - sizeof(ElfW(Rela)));\n    rel->r_addend = -4;\n#else\n    printf(\"picpic: %s %x %x | %02x %02x %02x\\n\", get_tok_str(sym->v, NULL), c, r,\n        cur_text_section->data[ind-3],\n        cur_text_section->data[ind-2],\n        cur_text_section->data[ind-1]\n        );\n    greloc(cur_text_section, sym, ind, R_X86_64_PC32);\n#endif\n    gen_le32(0);\n    if (c) {\n        /* we use add c, %xxx for displacement */\n        orex(1, r, 0, 0x81);\n        o(0xc0 + REG_VALUE(r));\n        gen_le32(c);\n    }\n}\n\nstatic void gen_modrm_impl(int op_reg, int r, Sym *sym, int c, int is_got)\n{\n    op_reg = REG_VALUE(op_reg) << 3;\n    if ((r & VT_VALMASK) == VT_CONST) {\n        /* constant memory reference */\n        o(0x05 | op_reg);\n        if (is_got) {\n            gen_gotpcrel(r, sym, c);\n        } else {\n            gen_addrpc32(r, sym, c);\n        }\n    } else if ((r & VT_VALMASK) == VT_LOCAL) {\n        /* currently, we use only ebp as base */\n        if (c == (char)c) {\n            /* short reference */\n            o(0x45 | op_reg);\n            g(c);\n        } else {\n            oad(0x85 | op_reg, c);\n        }\n    } else if ((r & VT_VALMASK) >= TREG_MEM) {\n        if (c) {\n            g(0x80 | op_reg | REG_VALUE(r));\n            gen_le32(c);\n        } else {\n            g(0x00 | op_reg | REG_VALUE(r));\n        }\n    } else {\n        g(0x00 | op_reg | REG_VALUE(r));\n    }\n}\n\n/* generate a modrm reference. 'op_reg' contains the addtionnal 3\n   opcode bits */\nstatic void gen_modrm(int op_reg, int r, Sym *sym, int c)\n{\n    gen_modrm_impl(op_reg, r, sym, c, 0);\n}\n\n/* generate a modrm reference. 'op_reg' contains the addtionnal 3\n   opcode bits */\nstatic void gen_modrm64(int opcode, int op_reg, int r, Sym *sym, int c)\n{\n    int is_got;\n    is_got = (op_reg & TREG_MEM) && !(sym->type.t & VT_STATIC);\n    orex(1, r, op_reg, opcode);\n    gen_modrm_impl(op_reg, r, sym, c, is_got);\n}\n\n\n/* load 'r' from value 'sv' */\nvoid load(int r, SValue *sv)\n{\n    int v, t, ft, fc, fr;\n    SValue v1;\n\n#ifdef TCC_TARGET_PE\n    SValue v2;\n    sv = pe_getimport(sv, &v2);\n#endif\n\n    fr = sv->r;\n    ft = sv->type.t;\n    fc = sv->c.ul;\n\n#ifndef TCC_TARGET_PE\n    /* we use indirect access via got */\n    if ((fr & VT_VALMASK) == VT_CONST && (fr & VT_SYM) &&\n        (fr & VT_LVAL) && !(sv->sym->type.t & VT_STATIC)) {\n        /* use the result register as a temporal register */\n        int tr = r | TREG_MEM;\n        if (is_float(ft)) {\n            /* we cannot use float registers as a temporal register */\n            tr = get_reg(RC_INT) | TREG_MEM;\n        }\n        gen_modrm64(0x8b, tr, fr, sv->sym, 0);\n\n        /* load from the temporal register */\n        fr = tr | VT_LVAL;\n    }\n#endif\n\n    v = fr & VT_VALMASK;\n    if (fr & VT_LVAL) {\n        int b, ll;\n        if (v == VT_LLOCAL) {\n            v1.type.t = VT_PTR;\n            v1.r = VT_LOCAL | VT_LVAL;\n            v1.c.ul = fc;\n            fr = r;\n            if (!(reg_classes[fr] & RC_INT))\n                fr = get_reg(RC_INT);\n            load(fr, &v1);\n        }\n        ll = 0;\n        if ((ft & VT_BTYPE) == VT_FLOAT) {\n            b = 0x6e0f66, r = 0; /* movd */\n        } else if ((ft & VT_BTYPE) == VT_DOUBLE) {\n            b = 0x7e0ff3, r = 0; /* movq */\n        } else if ((ft & VT_BTYPE) == VT_LDOUBLE) {\n            b = 0xdb, r = 5; /* fldt */\n        } else if ((ft & VT_TYPE) == VT_BYTE) {\n            b = 0xbe0f;   /* movsbl */\n        } else if ((ft & VT_TYPE) == (VT_BYTE | VT_UNSIGNED)) {\n            b = 0xb60f;   /* movzbl */\n        } else if ((ft & VT_TYPE) == VT_SHORT) {\n            b = 0xbf0f;   /* movswl */\n        } else if ((ft & VT_TYPE) == (VT_SHORT | VT_UNSIGNED)) {\n            b = 0xb70f;   /* movzwl */\n        } else {\n            ll = is64_type(ft);\n            b = 0x8b;\n        }\n        if (ll) {\n            gen_modrm64(b, r, fr, sv->sym, fc);\n        } else {\n            orex(ll, fr, r, b);\n            gen_modrm(r, fr, sv->sym, fc);\n        }\n    } else {\n        if (v == VT_CONST) {\n            if (fr & VT_SYM) {\n#ifdef TCC_TARGET_PE\n                orex(1,0,r,0x8d);\n                o(0x05 + REG_VALUE(r) * 8); /* lea xx(%rip), r */\n                gen_addrpc32(fr, sv->sym, fc);\n#else\n                if (sv->sym->type.t & VT_STATIC) {\n                    orex(1,0,r,0x8d);\n                    o(0x05 + REG_VALUE(r) * 8); /* lea xx(%rip), r */\n                    gen_addrpc32(fr, sv->sym, fc);\n                } else {\n                    orex(1,0,r,0x8b);\n                    o(0x05 + REG_VALUE(r) * 8); /* mov xx(%rip), r */\n                    gen_gotpcrel(r, sv->sym, fc);\n                }\n#endif\n            } else if (is64_type(ft)) {\n                orex(1,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */\n                gen_le64(sv->c.ull);\n            } else {\n                orex(0,r,0, 0xb8 + REG_VALUE(r)); /* mov $xx, r */\n                gen_le32(fc);\n            }\n        } else if (v == VT_LOCAL) {\n            orex(1,0,r,0x8d); /* lea xxx(%ebp), r */\n            gen_modrm(r, VT_LOCAL, sv->sym, fc);\n        } else if (v == VT_CMP) {\n            orex(0,r,0,0);\n\t    if ((fc & ~0x100) != TOK_NE)\n              oad(0xb8 + REG_VALUE(r), 0); /* mov $0, r */\n\t    else\n              oad(0xb8 + REG_VALUE(r), 1); /* mov $1, r */\n\t    if (fc & 0x100)\n\t      {\n\t        /* This was a float compare.  If the parity bit is\n\t\t   set the result was unordered, meaning false for everything\n\t\t   except TOK_NE, and true for TOK_NE.  */\n\t\tfc &= ~0x100;\n\t\to(0x037a + (REX_BASE(r) << 8));\n\t      }\n            orex(0,r,0, 0x0f); /* setxx %br */\n            o(fc);\n            o(0xc0 + REG_VALUE(r));\n        } else if (v == VT_JMP || v == VT_JMPI) {\n            t = v & 1;\n            orex(0,r,0,0);\n            oad(0xb8 + REG_VALUE(r), t); /* mov $1, r */\n            o(0x05eb + (REX_BASE(r) << 8)); /* jmp after */\n            gsym(fc);\n            orex(0,r,0,0);\n            oad(0xb8 + REG_VALUE(r), t ^ 1); /* mov $0, r */\n        } else if (v != r) {\n            if (r == TREG_XMM0) {\n                assert(v == TREG_ST0);\n                /* gen_cvt_ftof(VT_DOUBLE); */\n                o(0xf0245cdd); /* fstpl -0x10(%rsp) */\n                /* movsd -0x10(%rsp),%xmm0 */\n                o(0x44100ff2);\n                o(0xf024);\n            } else if (r == TREG_ST0) {\n                assert(v == TREG_XMM0);\n                /* gen_cvt_ftof(VT_LDOUBLE); */\n                /* movsd %xmm0,-0x10(%rsp) */\n                o(0x44110ff2);\n                o(0xf024);\n                o(0xf02444dd); /* fldl -0x10(%rsp) */\n            } else {\n                orex(1,r,v, 0x89);\n                o(0xc0 + REG_VALUE(r) + REG_VALUE(v) * 8); /* mov v, r */\n            }\n        }\n    }\n}\n\n/* store register 'r' in lvalue 'v' */\nvoid store(int r, SValue *v)\n{\n    int fr, bt, ft, fc;\n    int op64 = 0;\n    /* store the REX prefix in this variable when PIC is enabled */\n    int pic = 0;\n\n#ifdef TCC_TARGET_PE\n    SValue v2;\n    v = pe_getimport(v, &v2);\n#endif\n\n    ft = v->type.t;\n    fc = v->c.ul;\n    fr = v->r & VT_VALMASK;\n    bt = ft & VT_BTYPE;\n\n#ifndef TCC_TARGET_PE\n    /* we need to access the variable via got */\n    if (fr == VT_CONST && (v->r & VT_SYM)) {\n        /* mov xx(%rip), %r11 */\n        o(0x1d8b4c);\n        gen_gotpcrel(TREG_R11, v->sym, v->c.ul);\n        pic = is64_type(bt) ? 0x49 : 0x41;\n    }\n#endif\n\n    /* XXX: incorrect if float reg to reg */\n    if (bt == VT_FLOAT) {\n        o(0x66);\n        o(pic);\n        o(0x7e0f); /* movd */\n        r = 0;\n    } else if (bt == VT_DOUBLE) {\n        o(0x66);\n        o(pic);\n        o(0xd60f); /* movq */\n        r = 0;\n    } else if (bt == VT_LDOUBLE) {\n        o(0xc0d9); /* fld %st(0) */\n        o(pic);\n        o(0xdb); /* fstpt */\n        r = 7;\n    } else {\n        if (bt == VT_SHORT)\n            o(0x66);\n        o(pic);\n        if (bt == VT_BYTE || bt == VT_BOOL)\n            orex(0, 0, r, 0x88);\n        else if (is64_type(bt))\n            op64 = 0x89;\n        else\n            orex(0, 0, r, 0x89);\n    }\n    if (pic) {\n        /* xxx r, (%r11) where xxx is mov, movq, fld, or etc */\n        if (op64)\n            o(op64);\n        o(3 + (r << 3));\n    } else if (op64) {\n        if (fr == VT_CONST || fr == VT_LOCAL || (v->r & VT_LVAL)) {\n            gen_modrm64(op64, r, v->r, v->sym, fc);\n        } else if (fr != r) {\n            /* XXX: don't we really come here? */\n            abort();\n            o(0xc0 + fr + r * 8); /* mov r, fr */\n        }\n    } else {\n        if (fr == VT_CONST || fr == VT_LOCAL || (v->r & VT_LVAL)) {\n            gen_modrm(r, v->r, v->sym, fc);\n        } else if (fr != r) {\n            /* XXX: don't we really come here? */\n            abort();\n            o(0xc0 + fr + r * 8); /* mov r, fr */\n        }\n    }\n}\n\n/* 'is_jmp' is '1' if it is a jump */\nstatic void gcall_or_jmp(int is_jmp)\n{\n    int r;\n    if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n        /* constant case */\n        if (vtop->r & VT_SYM) {\n            /* relocation case */\n            greloc(cur_text_section, vtop->sym,\n                   ind + 1, R_X86_64_PC32);\n        } else {\n            /* put an empty PC32 relocation */\n            put_elf_reloc(symtab_section, cur_text_section,\n                          ind + 1, R_X86_64_PC32, 0);\n        }\n        oad(0xe8 + is_jmp, vtop->c.ul - 4); /* call/jmp im */\n    } else {\n        /* otherwise, indirect call */\n        r = TREG_R11;\n        load(r, vtop);\n        o(0x41); /* REX */\n        o(0xff); /* call/jmp *r */\n        o(0xd0 + REG_VALUE(r) + (is_jmp << 4));\n    }\n}\n\n#ifdef TCC_TARGET_PE\n\n#define REGN 4\nstatic const uint8_t arg_regs[] = {\n    TREG_RCX, TREG_RDX, TREG_R8, TREG_R9\n};\n\nstatic int func_scratch;\n\n/* Generate function call. The function address is pushed first, then\n   all the parameters in call order. This functions pops all the\n   parameters and the function address. */\n\nvoid gen_offs_sp(int b, int r, int d)\n{\n    orex(1,0,r & 0x100 ? 0 : r, b);\n    if (d == (char)d) {\n        o(0x2444 | (REG_VALUE(r) << 3));\n        g(d);\n    } else {\n        o(0x2484 | (REG_VALUE(r) << 3));\n        gen_le32(d);\n    }\n}\n\nvoid gfunc_call(int nb_args)\n{\n    int size, align, r, args_size, i, d, j, bt, struct_size;\n    int nb_reg_args, gen_reg;\n\n    nb_reg_args = nb_args;\n    args_size = (nb_reg_args < REGN ? REGN : nb_reg_args) * PTR_SIZE;\n\n    /* for struct arguments, we need to call memcpy and the function\n       call breaks register passing arguments we are preparing.\n       So, we process arguments which will be passed by stack first. */\n    struct_size = args_size;\n    for(i = 0; i < nb_args; i++) {\n        SValue *sv = &vtop[-i];\n        bt = (sv->type.t & VT_BTYPE);\n        if (bt == VT_STRUCT) {\n            size = type_size(&sv->type, &align);\n            /* align to stack align size */\n            size = (size + 15) & ~15;\n            /* generate structure store */\n            r = get_reg(RC_INT);\n            gen_offs_sp(0x8d, r, struct_size);\n            struct_size += size;\n\n            /* generate memcpy call */\n            vset(&sv->type, r | VT_LVAL, 0);\n            vpushv(sv);\n            vstore();\n            --vtop;\n\n        } else if (bt == VT_LDOUBLE) {\n\n            gv(RC_ST0);\n            gen_offs_sp(0xdb, 0x107, struct_size);\n            struct_size += 16;\n\n        }\n    }\n\n    if (func_scratch < struct_size)\n        func_scratch = struct_size;\n#if 1\n    for (i = 0; i < REGN; ++i)\n        save_reg(arg_regs[i]);\n    save_reg(TREG_RAX);\n#endif\n    gen_reg = nb_reg_args;\n    struct_size = args_size;\n\n    for(i = 0; i < nb_args; i++) {\n        bt = (vtop->type.t & VT_BTYPE);\n\n        if (bt == VT_STRUCT || bt == VT_LDOUBLE) {\n            if (bt == VT_LDOUBLE)\n                size = 16;\n            else\n                size = type_size(&vtop->type, &align);\n            /* align to stack align size */\n            size = (size + 15) & ~15;\n            j = --gen_reg;\n            if (j >= REGN) {\n                d = TREG_RAX;\n                gen_offs_sp(0x8d, d, struct_size);\n                gen_offs_sp(0x89, d, j*8);\n            } else {\n                d = arg_regs[j];\n                gen_offs_sp(0x8d, d, struct_size);\n            }\n            struct_size += size;\n\n        } else if (is_sse_float(vtop->type.t)) {\n            gv(RC_FLOAT); /* only one float register */\n            j = --gen_reg;\n            if (j >= REGN) {\n                /* movq %xmm0, j*8(%rsp) */\n                gen_offs_sp(0xd60f66, 0x100, j*8);\n            } else {\n                /* movaps %xmm0, %xmmN */\n                o(0x280f);\n                o(0xc0 + (j << 3));\n                d = arg_regs[j];\n                /* mov %xmm0, %rxx */\n                o(0x66);\n                orex(1,d,0, 0x7e0f);\n                o(0xc0 + REG_VALUE(d));\n            }\n        } else {\n            j = --gen_reg;\n            if (j >= REGN) {\n                r = gv(RC_INT);\n                gen_offs_sp(0x89, r, j*8);\n            } else {\n                d = arg_regs[j];\n                if (d < NB_REGS) {\n                    gv(reg_classes[d] & ~RC_INT);\n                } else {\n                    r = gv(RC_INT);\n                    if (d != r) {\n                        orex(1,d,r, 0x89);\n                        o(0xc0 + REG_VALUE(d) + REG_VALUE(r) * 8);\n                    }\n                }\n\n            }\n        }\n        vtop--;\n    }\n    save_regs(0);\n    gcall_or_jmp(0);\n    vtop--;\n}\n\n\n#define FUNC_PROLOG_SIZE 11\n\n/* generate function prolog of type 't' */\nvoid gfunc_prolog(CType *func_type)\n{\n    int addr, reg_param_index, bt;\n    Sym *sym;\n    CType *type;\n\n    func_ret_sub = 0;\n    func_scratch = 0;\n    loc = 0;\n\n    addr = PTR_SIZE * 2;\n    ind += FUNC_PROLOG_SIZE;\n    func_sub_sp_offset = ind;\n    reg_param_index = 0;\n\n    sym = func_type->ref;\n\n    /* if the function returns a structure, then add an\n       implicit pointer parameter */\n    func_vt = sym->type;\n    if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {\n        gen_modrm64(0x89, arg_regs[reg_param_index], VT_LOCAL, NULL, addr);\n        reg_param_index++;\n        addr += PTR_SIZE;\n    }\n\n    /* define parameters */\n    while ((sym = sym->next) != NULL) {\n        type = &sym->type;\n        bt = type->t & VT_BTYPE;\n        if (reg_param_index < REGN) {\n            /* save arguments passed by register */\n            gen_modrm64(0x89, arg_regs[reg_param_index], VT_LOCAL, NULL, addr);\n        }\n        if (bt == VT_STRUCT || bt == VT_LDOUBLE) {\n            sym_push(sym->v & ~SYM_FIELD, type, VT_LOCAL | VT_LVAL | VT_REF, addr);\n        } else {\n            sym_push(sym->v & ~SYM_FIELD, type, VT_LOCAL | VT_LVAL, addr);\n        }\n        reg_param_index++;\n        addr += PTR_SIZE;\n    }\n\n    while (reg_param_index < REGN) {\n        if (func_type->ref->c == FUNC_ELLIPSIS)\n            gen_modrm64(0x89, arg_regs[reg_param_index], VT_LOCAL, NULL, addr);\n        reg_param_index++;\n        addr += PTR_SIZE;\n    }\n}\n\n/* generate function epilog */\nvoid gfunc_epilog(void)\n{\n    int v, saved_ind;\n\n    o(0xc9); /* leave */\n    if (func_ret_sub == 0) {\n        o(0xc3); /* ret */\n    } else {\n        o(0xc2); /* ret n */\n        g(func_ret_sub);\n        g(func_ret_sub >> 8);\n    }\n\n    saved_ind = ind;\n    ind = func_sub_sp_offset - FUNC_PROLOG_SIZE;\n    /* align local size to word & save local variables */\n    v = (func_scratch + -loc + 15) & -16;\n\n    if (v >= 4096) {\n        Sym *sym = external_global_sym(TOK___chkstk, &func_old_type, 0);\n        oad(0xb8, v); /* mov stacksize, %eax */\n        oad(0xe8, -4); /* call __chkstk, (does the stackframe too) */\n        greloc(cur_text_section, sym, ind-4, R_X86_64_PC32);\n        o(0x90); /* fill for FUNC_PROLOG_SIZE = 11 bytes */\n    } else {\n        o(0xe5894855);  /* push %rbp, mov %rsp, %rbp */\n        o(0xec8148);  /* sub rsp, stacksize */\n        gen_le32(v);\n    }\n\n    cur_text_section->data_offset = saved_ind;\n    pe_add_unwind_data(ind, saved_ind, v);\n    ind = cur_text_section->data_offset;\n}\n\n#else\n\nstatic void gadd_sp(int val)\n{\n    if (val == (char)val) {\n        o(0xc48348);\n        g(val);\n    } else {\n        oad(0xc48148, val); /* add $xxx, %rsp */\n    }\n}\n\n#define REGN 6\nstatic const uint8_t arg_regs[REGN] = {\n    TREG_RDI, TREG_RSI, TREG_RDX, TREG_RCX, TREG_R8, TREG_R9\n};\n\n/* Generate function call. The function address is pushed first, then\n   all the parameters in call order. This functions pops all the\n   parameters and the function address. */\nvoid gfunc_call(int nb_args)\n{\n    int size, align, r, args_size, i;\n    int nb_reg_args = 0;\n    int nb_sse_args = 0;\n    int sse_reg, gen_reg;\n\n    /* calculate the number of integer/float arguments */\n    args_size = 0;\n    for(i = 0; i < nb_args; i++) {\n        if ((vtop[-i].type.t & VT_BTYPE) == VT_STRUCT) {\n            args_size += type_size(&vtop[-i].type, &align);\n            args_size = (args_size + 7) & ~7;\n        } else if ((vtop[-i].type.t & VT_BTYPE) == VT_LDOUBLE) {\n            args_size += 16;\n        } else if (is_sse_float(vtop[-i].type.t)) {\n            nb_sse_args++;\n            if (nb_sse_args > 8) args_size += 8;\n        } else {\n            nb_reg_args++;\n            if (nb_reg_args > REGN) args_size += 8;\n        }\n    }\n\n    /* for struct arguments, we need to call memcpy and the function\n       call breaks register passing arguments we are preparing.\n       So, we process arguments which will be passed by stack first. */\n    gen_reg = nb_reg_args;\n    sse_reg = nb_sse_args;\n\n    /* adjust stack to align SSE boundary */\n    if (args_size &= 15) {\n        /* fetch cpu flag before the following sub will change the value */\n        if (vtop >= vstack && (vtop->r & VT_VALMASK) == VT_CMP)\n            gv(RC_INT);\n\n        args_size = 16 - args_size;\n        o(0x48);\n        oad(0xec81, args_size); /* sub $xxx, %rsp */\n    }\n\n    for(i = 0; i < nb_args; i++) {\n\t/* Swap argument to top, it will possibly be changed here,\n\t   and might use more temps.  All arguments must remain on the\n\t   stack, so that get_reg can correctly evict some of them onto\n\t   stack.  We could use also use a vrott(nb_args) at the end\n\t   of this loop, but this seems faster.  */\n        SValue tmp = vtop[0];\n\tvtop[0] = vtop[-i];\n\tvtop[-i] = tmp;\n        if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {\n            size = type_size(&vtop->type, &align);\n            /* align to stack align size */\n            size = (size + 7) & ~7;\n            /* allocate the necessary size on stack */\n            o(0x48);\n            oad(0xec81, size); /* sub $xxx, %rsp */\n            /* generate structure store */\n            r = get_reg(RC_INT);\n            orex(1, r, 0, 0x89); /* mov %rsp, r */\n            o(0xe0 + REG_VALUE(r));\n\t    vset(&vtop->type, r | VT_LVAL, 0);\n\t    vswap();\n\t    vstore();\n            args_size += size;\n        } else if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {\n            gv(RC_ST0);\n            size = LDOUBLE_SIZE;\n            oad(0xec8148, size); /* sub $xxx, %rsp */\n            o(0x7cdb); /* fstpt 0(%rsp) */\n            g(0x24);\n            g(0x00);\n            args_size += size;\n        } else if (is_sse_float(vtop->type.t)) {\n            int j = --sse_reg;\n            if (j >= 8) {\n                gv(RC_FLOAT);\n                o(0x50); /* push $rax */\n                /* movq %xmm0, (%rsp) */\n                o(0x04d60f66);\n                o(0x24);\n                args_size += 8;\n            }\n        } else {\n            int j = --gen_reg;\n            /* simple type */\n            /* XXX: implicit cast ? */\n            if (j >= REGN) {\n                r = gv(RC_INT);\n                orex(0,r,0,0x50 + REG_VALUE(r)); /* push r */\n                args_size += 8;\n            }\n        }\n\n\t/* And swap the argument back to it's original position.  */\n        tmp = vtop[0];\n\tvtop[0] = vtop[-i];\n\tvtop[-i] = tmp;\n    }\n\n    /* XXX This should be superfluous.  */\n    save_regs(0); /* save used temporary registers */\n\n    /* then, we prepare register passing arguments.\n       Note that we cannot set RDX and RCX in this loop because gv()\n       may break these temporary registers. Let's use R10 and R11\n       instead of them */\n    gen_reg = nb_reg_args;\n    sse_reg = nb_sse_args;\n    for(i = 0; i < nb_args; i++) {\n        if ((vtop->type.t & VT_BTYPE) == VT_STRUCT ||\n            (vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {\n        } else if (is_sse_float(vtop->type.t)) {\n            int j = --sse_reg;\n            if (j < 8) {\n                gv(RC_FLOAT); /* only one float register */\n                /* movaps %xmm0, %xmmN */\n                o(0x280f);\n                o(0xc0 + (sse_reg << 3));\n            }\n        } else {\n            int j = --gen_reg;\n            /* simple type */\n            /* XXX: implicit cast ? */\n            if (j < REGN) {\n                int d = arg_regs[j];\n                r = gv(RC_INT);\n                if (j == 2 || j == 3)\n                    /* j=2: r10, j=3: r11 */\n                    d = j + 8;\n                orex(1,d,r,0x89); /* mov */\n                o(0xc0 + REG_VALUE(r) * 8 + REG_VALUE(d));\n            }\n        }\n        vtop--;\n    }\n\n    /* We shouldn't have many operands on the stack anymore, but the\n       call address itself is still there, and it might be in %eax\n       (or edx/ecx) currently, which the below writes would clobber.\n       So evict all remaining operands here.  */\n    save_regs(0);\n\n    /* Copy R10 and R11 into RDX and RCX, respectively */\n    if (nb_reg_args > 2) {\n        o(0xd2894c); /* mov %r10, %rdx */\n        if (nb_reg_args > 3) {\n            o(0xd9894c); /* mov %r11, %rcx */\n        }\n    }\n\n    oad(0xb8, nb_sse_args < 8 ? nb_sse_args : 8); /* mov nb_sse_args, %eax */\n    gcall_or_jmp(0);\n    if (args_size)\n        gadd_sp(args_size);\n    vtop--;\n}\n\n\n#define FUNC_PROLOG_SIZE 11\n\nstatic void push_arg_reg(int i) {\n    loc -= 8;\n    gen_modrm64(0x89, arg_regs[i], VT_LOCAL, NULL, loc);\n}\n\n/* generate function prolog of type 't' */\nvoid gfunc_prolog(CType *func_type)\n{\n    int i, addr, align, size;\n    int param_index, param_addr, reg_param_index, sse_param_index;\n    Sym *sym;\n    CType *type;\n\n    sym = func_type->ref;\n    addr = PTR_SIZE * 2;\n    loc = 0;\n    ind += FUNC_PROLOG_SIZE;\n    func_sub_sp_offset = ind;\n    func_ret_sub = 0;\n\n    if (func_type->ref->c == FUNC_ELLIPSIS) {\n        int seen_reg_num, seen_sse_num, seen_stack_size;\n        seen_reg_num = seen_sse_num = 0;\n        /* frame pointer and return address */\n        seen_stack_size = PTR_SIZE * 2;\n        /* count the number of seen parameters */\n        sym = func_type->ref;\n        while ((sym = sym->next) != NULL) {\n            type = &sym->type;\n            if (is_sse_float(type->t)) {\n                if (seen_sse_num < 8) {\n                    seen_sse_num++;\n                } else {\n                    seen_stack_size += 8;\n                }\n            } else if ((type->t & VT_BTYPE) == VT_STRUCT) {\n                size = type_size(type, &align);\n                size = (size + 7) & ~7;\n                seen_stack_size += size;\n            } else if ((type->t & VT_BTYPE) == VT_LDOUBLE) {\n                seen_stack_size += LDOUBLE_SIZE;\n            } else {\n                if (seen_reg_num < REGN) {\n                    seen_reg_num++;\n                } else {\n                    seen_stack_size += 8;\n                }\n            }\n        }\n\n        loc -= 16;\n        /* movl $0x????????, -0x10(%rbp) */\n        o(0xf045c7);\n        gen_le32(seen_reg_num * 8);\n        /* movl $0x????????, -0xc(%rbp) */\n        o(0xf445c7);\n        gen_le32(seen_sse_num * 16 + 48);\n        /* movl $0x????????, -0x8(%rbp) */\n        o(0xf845c7);\n        gen_le32(seen_stack_size);\n\n        /* save all register passing arguments */\n        for (i = 0; i < 8; i++) {\n            loc -= 16;\n            o(0xd60f66); /* movq */\n            gen_modrm(7 - i, VT_LOCAL, NULL, loc);\n            /* movq $0, loc+8(%rbp) */\n            o(0x85c748);\n            gen_le32(loc + 8);\n            gen_le32(0);\n        }\n        for (i = 0; i < REGN; i++) {\n            push_arg_reg(REGN-1-i);\n        }\n    }\n\n    sym = func_type->ref;\n    param_index = 0;\n    reg_param_index = 0;\n    sse_param_index = 0;\n\n    /* if the function returns a structure, then add an\n       implicit pointer parameter */\n    func_vt = sym->type;\n    if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {\n        push_arg_reg(reg_param_index);\n        param_addr = loc;\n\n        func_vc = loc;\n        param_index++;\n        reg_param_index++;\n    }\n    /* define parameters */\n    while ((sym = sym->next) != NULL) {\n        type = &sym->type;\n        size = type_size(type, &align);\n        size = (size + 7) & ~7;\n        if (is_sse_float(type->t)) {\n            if (sse_param_index < 8) {\n                /* save arguments passed by register */\n                loc -= 8;\n                o(0xd60f66); /* movq */\n                gen_modrm(sse_param_index, VT_LOCAL, NULL, loc);\n                param_addr = loc;\n            } else {\n                param_addr = addr;\n                addr += size;\n            }\n            sse_param_index++;\n\n        } else if ((type->t & VT_BTYPE) == VT_STRUCT ||\n                   (type->t & VT_BTYPE) == VT_LDOUBLE) {\n            param_addr = addr;\n            addr += size;\n        } else {\n            if (reg_param_index < REGN) {\n                /* save arguments passed by register */\n                push_arg_reg(reg_param_index);\n                param_addr = loc;\n            } else {\n                param_addr = addr;\n                addr += 8;\n            }\n            reg_param_index++;\n        }\n        sym_push(sym->v & ~SYM_FIELD, type,\n                 VT_LOCAL | VT_LVAL, param_addr);\n        param_index++;\n    }\n}\n\n/* generate function epilog */\nvoid gfunc_epilog(void)\n{\n    int v, saved_ind;\n\n    o(0xc9); /* leave */\n    if (func_ret_sub == 0) {\n        o(0xc3); /* ret */\n    } else {\n        o(0xc2); /* ret n */\n        g(func_ret_sub);\n        g(func_ret_sub >> 8);\n    }\n    /* align local size to word & save local variables */\n    v = (-loc + 15) & -16;\n    saved_ind = ind;\n    ind = func_sub_sp_offset - FUNC_PROLOG_SIZE;\n    o(0xe5894855);  /* push %rbp, mov %rsp, %rbp */\n    o(0xec8148);  /* sub rsp, stacksize */\n    gen_le32(v);\n    ind = saved_ind;\n}\n\n#endif /* not PE */\n\n/* generate a jump to a label */\nint gjmp(int t)\n{\n    return psym(0xe9, t);\n}\n\n/* generate a jump to a fixed address */\nvoid gjmp_addr(int a)\n{\n    int r;\n    r = a - ind - 2;\n    if (r == (char)r) {\n        g(0xeb);\n        g(r);\n    } else {\n        oad(0xe9, a - ind - 5);\n    }\n}\n\n/* generate a test. set 'inv' to invert test. Stack entry is popped */\nint gtst(int inv, int t)\n{\n    int v, *p;\n\n    v = vtop->r & VT_VALMASK;\n    if (v == VT_CMP) {\n        /* fast case : can jump directly since flags are set */\n\tif (vtop->c.i & 0x100)\n\t  {\n\t    /* This was a float compare.  If the parity flag is set\n\t       the result was unordered.  For anything except != this\n\t       means false and we don't jump (anding both conditions).\n\t       For != this means true (oring both).\n\t       Take care about inverting the test.  We need to jump\n\t       to our target if the result was unordered and test wasn't NE,\n\t       otherwise if unordered we don't want to jump.  */\n\t    vtop->c.i &= ~0x100;\n\t    if (!inv == (vtop->c.i != TOK_NE))\n\t      o(0x067a);  /* jp +6 */\n\t    else\n\t      {\n\t        g(0x0f);\n\t\tt = psym(0x8a, t); /* jp t */\n\t      }\n\t  }\n        g(0x0f);\n        t = psym((vtop->c.i - 16) ^ inv, t);\n    } else if (v == VT_JMP || v == VT_JMPI) {\n        /* && or || optimization */\n        if ((v & 1) == inv) {\n            /* insert vtop->c jump list in t */\n            p = &vtop->c.i;\n            while (*p != 0)\n                p = (int *)(cur_text_section->data + *p);\n            *p = t;\n            t = vtop->c.i;\n        } else {\n            t = gjmp(t);\n            gsym(vtop->c.i);\n        }\n    } else {\n        if (is_float(vtop->type.t) ||\n            (vtop->type.t & VT_BTYPE) == VT_LLONG) {\n            vpushi(0);\n            gen_op(TOK_NE);\n        }\n        if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {\n            /* constant jmp optimization */\n            if ((vtop->c.i != 0) != inv)\n                t = gjmp(t);\n        } else {\n            v = gv(RC_INT);\n            orex(0,v,v,0x85);\n            o(0xc0 + REG_VALUE(v) * 9);\n            g(0x0f);\n            t = psym(0x85 ^ inv, t);\n        }\n    }\n    vtop--;\n    return t;\n}\n\n/* generate an integer binary operation */\nvoid gen_opi(int op)\n{\n    int r, fr, opc, c;\n    int ll, uu, cc;\n\n    ll = is64_type(vtop[-1].type.t);\n    uu = (vtop[-1].type.t & VT_UNSIGNED) != 0;\n    cc = (vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;\n\n    switch(op) {\n    case '+':\n    case TOK_ADDC1: /* add with carry generation */\n        opc = 0;\n    gen_op8:\n        if (cc && (!ll || (int)vtop->c.ll == vtop->c.ll)) {\n            /* constant case */\n            vswap();\n            r = gv(RC_INT);\n            vswap();\n            c = vtop->c.i;\n            if (c == (char)c) {\n                /* XXX: generate inc and dec for smaller code ? */\n                orex(ll, r, 0, 0x83);\n                o(0xc0 | (opc << 3) | REG_VALUE(r));\n                g(c);\n            } else {\n                orex(ll, r, 0, 0x81);\n                oad(0xc0 | (opc << 3) | REG_VALUE(r), c);\n            }\n        } else {\n            gv2(RC_INT, RC_INT);\n            r = vtop[-1].r;\n            fr = vtop[0].r;\n            orex(ll, r, fr, (opc << 3) | 0x01);\n            o(0xc0 + REG_VALUE(r) + REG_VALUE(fr) * 8);\n        }\n        vtop--;\n        if (op >= TOK_ULT && op <= TOK_GT) {\n            vtop->r = VT_CMP;\n            vtop->c.i = op;\n        }\n        break;\n    case '-':\n    case TOK_SUBC1: /* sub with carry generation */\n        opc = 5;\n        goto gen_op8;\n    case TOK_ADDC2: /* add with carry use */\n        opc = 2;\n        goto gen_op8;\n    case TOK_SUBC2: /* sub with carry use */\n        opc = 3;\n        goto gen_op8;\n    case '&':\n        opc = 4;\n        goto gen_op8;\n    case '^':\n        opc = 6;\n        goto gen_op8;\n    case '|':\n        opc = 1;\n        goto gen_op8;\n    case '*':\n        gv2(RC_INT, RC_INT);\n        r = vtop[-1].r;\n        fr = vtop[0].r;\n        orex(ll, fr, r, 0xaf0f); /* imul fr, r */\n        o(0xc0 + REG_VALUE(fr) + REG_VALUE(r) * 8);\n        vtop--;\n        break;\n    case TOK_SHL:\n        opc = 4;\n        goto gen_shift;\n    case TOK_SHR:\n        opc = 5;\n        goto gen_shift;\n    case TOK_SAR:\n        opc = 7;\n    gen_shift:\n        opc = 0xc0 | (opc << 3);\n        if (cc) {\n            /* constant case */\n            vswap();\n            r = gv(RC_INT);\n            vswap();\n            orex(ll, r, 0, 0xc1); /* shl/shr/sar $xxx, r */\n            o(opc | REG_VALUE(r));\n            g(vtop->c.i & (ll ? 63 : 31));\n        } else {\n            /* we generate the shift in ecx */\n            gv2(RC_INT, RC_RCX);\n            r = vtop[-1].r;\n            orex(ll, r, 0, 0xd3); /* shl/shr/sar %cl, r */\n            o(opc | REG_VALUE(r));\n        }\n        vtop--;\n        break;\n    case TOK_UDIV:\n    case TOK_UMOD:\n        uu = 1;\n        goto divmod;\n    case '/':\n    case '%':\n    case TOK_PDIV:\n        uu = 0;\n    divmod:\n        /* first operand must be in eax */\n        /* XXX: need better constraint for second operand */\n        gv2(RC_RAX, RC_RCX);\n        r = vtop[-1].r;\n        fr = vtop[0].r;\n        vtop--;\n        save_reg(TREG_RDX);\n        orex(ll, 0, 0, uu ? 0xd231 : 0x99); /* xor %edx,%edx : cqto */\n        orex(ll, fr, 0, 0xf7); /* div fr, %eax */\n        o((uu ? 0xf0 : 0xf8) + REG_VALUE(fr));\n        if (op == '%' || op == TOK_UMOD)\n            r = TREG_RDX;\n        else\n            r = TREG_RAX;\n        vtop->r = r;\n        break;\n    default:\n        opc = 7;\n        goto gen_op8;\n    }\n}\n\nvoid gen_opl(int op)\n{\n    gen_opi(op);\n}\n\n/* generate a floating point operation 'v = t1 op t2' instruction. The\n   two operands are guaranted to have the same floating point type */\n/* XXX: need to use ST1 too */\nvoid gen_opf(int op)\n{\n    int a, ft, fc, swapped, r;\n    int float_type =\n        (vtop->type.t & VT_BTYPE) == VT_LDOUBLE ? RC_ST0 : RC_FLOAT;\n\n    /* convert constants to memory references */\n    if ((vtop[-1].r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {\n        vswap();\n        gv(float_type);\n        vswap();\n    }\n    if ((vtop[0].r & (VT_VALMASK | VT_LVAL)) == VT_CONST)\n        gv(float_type);\n\n    /* must put at least one value in the floating point register */\n    if ((vtop[-1].r & VT_LVAL) &&\n        (vtop[0].r & VT_LVAL)) {\n        vswap();\n        gv(float_type);\n        vswap();\n    }\n    swapped = 0;\n    /* swap the stack if needed so that t1 is the register and t2 is\n       the memory reference */\n    if (vtop[-1].r & VT_LVAL) {\n        vswap();\n        swapped = 1;\n    }\n    if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {\n        if (op >= TOK_ULT && op <= TOK_GT) {\n            /* load on stack second operand */\n            load(TREG_ST0, vtop);\n            save_reg(TREG_RAX); /* eax is used by FP comparison code */\n            if (op == TOK_GE || op == TOK_GT)\n                swapped = !swapped;\n            else if (op == TOK_EQ || op == TOK_NE)\n                swapped = 0;\n            if (swapped)\n                o(0xc9d9); /* fxch %st(1) */\n            o(0xe9da); /* fucompp */\n            o(0xe0df); /* fnstsw %ax */\n            if (op == TOK_EQ) {\n                o(0x45e480); /* and $0x45, %ah */\n                o(0x40fC80); /* cmp $0x40, %ah */\n            } else if (op == TOK_NE) {\n                o(0x45e480); /* and $0x45, %ah */\n                o(0x40f480); /* xor $0x40, %ah */\n                op = TOK_NE;\n            } else if (op == TOK_GE || op == TOK_LE) {\n                o(0x05c4f6); /* test $0x05, %ah */\n                op = TOK_EQ;\n            } else {\n                o(0x45c4f6); /* test $0x45, %ah */\n                op = TOK_EQ;\n            }\n            vtop--;\n            vtop->r = VT_CMP;\n            vtop->c.i = op;\n        } else {\n            /* no memory reference possible for long double operations */\n            load(TREG_ST0, vtop);\n            swapped = !swapped;\n\n            switch(op) {\n            default:\n            case '+':\n                a = 0;\n                break;\n            case '-':\n                a = 4;\n                if (swapped)\n                    a++;\n                break;\n            case '*':\n                a = 1;\n                break;\n            case '/':\n                a = 6;\n                if (swapped)\n                    a++;\n                break;\n            }\n            ft = vtop->type.t;\n            fc = vtop->c.ul;\n            o(0xde); /* fxxxp %st, %st(1) */\n            o(0xc1 + (a << 3));\n            vtop--;\n        }\n    } else {\n        if (op >= TOK_ULT && op <= TOK_GT) {\n            /* if saved lvalue, then we must reload it */\n            r = vtop->r;\n            fc = vtop->c.ul;\n            if ((r & VT_VALMASK) == VT_LLOCAL) {\n                SValue v1;\n                r = get_reg(RC_INT);\n                v1.type.t = VT_PTR;\n                v1.r = VT_LOCAL | VT_LVAL;\n                v1.c.ul = fc;\n                load(r, &v1);\n                fc = 0;\n            }\n\n            if (op == TOK_EQ || op == TOK_NE) {\n                swapped = 0;\n            } else {\n                if (op == TOK_LE || op == TOK_LT)\n                    swapped = !swapped;\n                if (op == TOK_LE || op == TOK_GE) {\n                    op = 0x93; /* setae */\n                } else {\n                    op = 0x97; /* seta */\n                }\n            }\n\n            if (swapped) {\n                o(0x7e0ff3); /* movq */\n                gen_modrm(1, r, vtop->sym, fc);\n\n                if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE) {\n                    o(0x66);\n                }\n                o(0x2e0f); /* ucomisd %xmm0, %xmm1 */\n                o(0xc8);\n            } else {\n                if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE) {\n                    o(0x66);\n                }\n                o(0x2e0f); /* ucomisd */\n                gen_modrm(0, r, vtop->sym, fc);\n            }\n\n            vtop--;\n            vtop->r = VT_CMP;\n            vtop->c.i = op | 0x100;\n        } else {\n            /* no memory reference possible for long double operations */\n            if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {\n                load(TREG_XMM0, vtop);\n                swapped = !swapped;\n            }\n            switch(op) {\n            default:\n            case '+':\n                a = 0;\n                break;\n            case '-':\n                a = 4;\n                break;\n            case '*':\n                a = 1;\n                break;\n            case '/':\n                a = 6;\n                break;\n            }\n            ft = vtop->type.t;\n            fc = vtop->c.ul;\n            if ((ft & VT_BTYPE) == VT_LDOUBLE) {\n                o(0xde); /* fxxxp %st, %st(1) */\n                o(0xc1 + (a << 3));\n            } else {\n                /* if saved lvalue, then we must reload it */\n                r = vtop->r;\n                if ((r & VT_VALMASK) == VT_LLOCAL) {\n                    SValue v1;\n                    r = get_reg(RC_INT);\n                    v1.type.t = VT_PTR;\n                    v1.r = VT_LOCAL | VT_LVAL;\n                    v1.c.ul = fc;\n                    load(r, &v1);\n                    fc = 0;\n                }\n                if (swapped) {\n                    /* movq %xmm0,%xmm1 */\n                    o(0x7e0ff3);\n                    o(0xc8);\n                    load(TREG_XMM0, vtop);\n                    /* subsd  %xmm1,%xmm0 (f2 0f 5c c1) */\n                    if ((ft & VT_BTYPE) == VT_DOUBLE) {\n                        o(0xf2);\n                    } else {\n                        o(0xf3);\n                    }\n                    o(0x0f);\n                    o(0x58 + a);\n                    o(0xc1);\n                } else {\n                    if ((ft & VT_BTYPE) == VT_DOUBLE) {\n                        o(0xf2);\n                    } else {\n                        o(0xf3);\n                    }\n                    o(0x0f);\n                    o(0x58 + a);\n                    gen_modrm(0, r, vtop->sym, fc);\n                }\n            }\n            vtop--;\n        }\n    }\n}\n\n/* convert integers to fp 't' type. Must handle 'int', 'unsigned int'\n   and 'long long' cases. */\nvoid gen_cvt_itof(int t)\n{\n    if ((t & VT_BTYPE) == VT_LDOUBLE) {\n        save_reg(TREG_ST0);\n        gv(RC_INT);\n        if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {\n            /* signed long long to float/double/long double (unsigned case\n               is handled generically) */\n            o(0x50 + (vtop->r & VT_VALMASK)); /* push r */\n            o(0x242cdf); /* fildll (%rsp) */\n            o(0x08c48348); /* add $8, %rsp */\n        } else if ((vtop->type.t & (VT_BTYPE | VT_UNSIGNED)) ==\n                   (VT_INT | VT_UNSIGNED)) {\n            /* unsigned int to float/double/long double */\n            o(0x6a); /* push $0 */\n            g(0x00);\n            o(0x50 + (vtop->r & VT_VALMASK)); /* push r */\n            o(0x242cdf); /* fildll (%rsp) */\n            o(0x10c48348); /* add $16, %rsp */\n        } else {\n            /* int to float/double/long double */\n            o(0x50 + (vtop->r & VT_VALMASK)); /* push r */\n            o(0x2404db); /* fildl (%rsp) */\n            o(0x08c48348); /* add $8, %rsp */\n        }\n        vtop->r = TREG_ST0;\n    } else {\n        save_reg(TREG_XMM0);\n        gv(RC_INT);\n        o(0xf2 + ((t & VT_BTYPE) == VT_FLOAT));\n        if ((vtop->type.t & (VT_BTYPE | VT_UNSIGNED)) ==\n            (VT_INT | VT_UNSIGNED) ||\n            (vtop->type.t & VT_BTYPE) == VT_LLONG) {\n            o(0x48); /* REX */\n        }\n        o(0x2a0f);\n        o(0xc0 + (vtop->r & VT_VALMASK)); /* cvtsi2sd */\n        vtop->r = TREG_XMM0;\n    }\n}\n\n/* convert from one floating point type to another */\nvoid gen_cvt_ftof(int t)\n{\n    int ft, bt, tbt;\n\n    ft = vtop->type.t;\n    bt = ft & VT_BTYPE;\n    tbt = t & VT_BTYPE;\n\n    if (bt == VT_FLOAT) {\n        gv(RC_FLOAT);\n        if (tbt == VT_DOUBLE) {\n            o(0xc0140f); /* unpcklps */\n            o(0xc05a0f); /* cvtps2pd */\n        } else if (tbt == VT_LDOUBLE) {\n            /* movss %xmm0,-0x10(%rsp) */\n            o(0x44110ff3);\n            o(0xf024);\n            o(0xf02444d9); /* flds -0x10(%rsp) */\n            vtop->r = TREG_ST0;\n        }\n    } else if (bt == VT_DOUBLE) {\n        gv(RC_FLOAT);\n        if (tbt == VT_FLOAT) {\n            o(0xc0140f66); /* unpcklpd */\n            o(0xc05a0f66); /* cvtpd2ps */\n        } else if (tbt == VT_LDOUBLE) {\n            /* movsd %xmm0,-0x10(%rsp) */\n            o(0x44110ff2);\n            o(0xf024);\n            o(0xf02444dd); /* fldl -0x10(%rsp) */\n            vtop->r = TREG_ST0;\n        }\n    } else {\n        gv(RC_ST0);\n        if (tbt == VT_DOUBLE) {\n            o(0xf0245cdd); /* fstpl -0x10(%rsp) */\n            /* movsd -0x10(%rsp),%xmm0 */\n            o(0x44100ff2);\n            o(0xf024);\n            vtop->r = TREG_XMM0;\n        } else if (tbt == VT_FLOAT) {\n            o(0xf0245cd9); /* fstps -0x10(%rsp) */\n            /* movss -0x10(%rsp),%xmm0 */\n            o(0x44100ff3);\n            o(0xf024);\n            vtop->r = TREG_XMM0;\n        }\n    }\n}\n\n/* convert fp to int 't' type */\nvoid gen_cvt_ftoi(int t)\n{\n    int ft, bt, size, r;\n    ft = vtop->type.t;\n    bt = ft & VT_BTYPE;\n    if (bt == VT_LDOUBLE) {\n        gen_cvt_ftof(VT_DOUBLE);\n        bt = VT_DOUBLE;\n    }\n\n    gv(RC_FLOAT);\n    if (t != VT_INT)\n        size = 8;\n    else\n        size = 4;\n\n    r = get_reg(RC_INT);\n    if (bt == VT_FLOAT) {\n        o(0xf3);\n    } else if (bt == VT_DOUBLE) {\n        o(0xf2);\n    } else {\n        assert(0);\n    }\n    orex(size == 8, r, 0, 0x2c0f); /* cvttss2si or cvttsd2si */\n    o(0xc0 + (REG_VALUE(r) << 3));\n    vtop->r = r;\n}\n\n/* computed goto support */\nvoid ggoto(void)\n{\n    gcall_or_jmp(1);\n    vtop--;\n}\n\n/* end of x86-64 code generator */\n/*************************************************************/\n#endif /* ! TARGET_DEFS_ONLY */\n/******************************************************/\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinyxml/tinystr.cpp",
    "content": "/*\nwww.sourceforge.net/projects/tinyxml\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any\ndamages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any\npurpose, including commercial applications, and to alter it and\nredistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must\nnot claim that you wrote the original software. If you use this\nsoftware in a product, an acknowledgment in the product documentation\nwould be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and\nmust not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n*/\n\n\n#ifndef TIXML_USE_STL\n\n#include \"tinystr.h\"\n\n// Error value for find primitive\nconst TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1);\n\n\n// Null rep.\nTiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\\0' } };\n\n\nvoid TiXmlString::reserve (size_type cap)\n{\n\tif (cap > capacity())\n\t{\n\t\tTiXmlString tmp;\n\t\ttmp.init(length(), cap);\n\t\tmemcpy(tmp.start(), data(), length());\n\t\tswap(tmp);\n\t}\n}\n\n\nTiXmlString& TiXmlString::assign(const char* str, size_type len)\n{\n\tsize_type cap = capacity();\n\tif (len > cap || cap > 3*(len + 8))\n\t{\n\t\tTiXmlString tmp;\n\t\ttmp.init(len);\n\t\tmemcpy(tmp.start(), str, len);\n\t\tswap(tmp);\n\t}\n\telse\n\t{\n\t\tmemmove(start(), str, len);\n\t\tset_size(len);\n\t}\n\treturn *this;\n}\n\n\nTiXmlString& TiXmlString::append(const char* str, size_type len)\n{\n\tsize_type newsize = length() + len;\n\tif (newsize > capacity())\n\t{\n\t\treserve (newsize + capacity());\n\t}\n\tmemmove(finish(), str, len);\n\tset_size(newsize);\n\treturn *this;\n}\n\n\nTiXmlString operator + (const TiXmlString & a, const TiXmlString & b)\n{\n\tTiXmlString tmp;\n\ttmp.reserve(a.length() + b.length());\n\ttmp += a;\n\ttmp += b;\n\treturn tmp;\n}\n\nTiXmlString operator + (const TiXmlString & a, const char* b)\n{\n\tTiXmlString tmp;\n\tTiXmlString::size_type b_len = static_cast<TiXmlString::size_type>( strlen(b) );\n\ttmp.reserve(a.length() + b_len);\n\ttmp += a;\n\ttmp.append(b, b_len);\n\treturn tmp;\n}\n\nTiXmlString operator + (const char* a, const TiXmlString & b)\n{\n\tTiXmlString tmp;\n\tTiXmlString::size_type a_len = static_cast<TiXmlString::size_type>( strlen(a) );\n\ttmp.reserve(a_len + b.length());\n\ttmp.append(a, a_len);\n\ttmp += b;\n\treturn tmp;\n}\n\n\n#endif\t// TIXML_USE_STL\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinyxml/tinystr.h",
    "content": "/*\nwww.sourceforge.net/projects/tinyxml\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any\ndamages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any\npurpose, including commercial applications, and to alter it and\nredistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must\nnot claim that you wrote the original software. If you use this\nsoftware in a product, an acknowledgment in the product documentation\nwould be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and\nmust not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n*/\n\n\n#ifndef TIXML_USE_STL\n\n#ifndef TIXML_STRING_INCLUDED\n#define TIXML_STRING_INCLUDED\n\n#include <assert.h>\n#include <string.h>\n\n/*\tThe support for explicit isn't that universal, and it isn't really\n\trequired - it is used to check that the TiXmlString class isn't incorrectly\n\tused. Be nice to old compilers and macro it here:\n*/\n#if defined(_MSC_VER) && (_MSC_VER >= 1200 )\n\t// Microsoft visual studio, version 6 and higher.\n\t#define TIXML_EXPLICIT explicit\n#elif defined(__GNUC__) && (__GNUC__ >= 3 )\n\t// GCC version 3 and higher.s\n\t#define TIXML_EXPLICIT explicit\n#else\n\t#define TIXML_EXPLICIT\n#endif\n\n\n/*\n   TiXmlString is an emulation of a subset of the std::string template.\n   Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.\n   Only the member functions relevant to the TinyXML project have been implemented.\n   The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase\n   a string and there's no more room, we allocate a buffer twice as big as we need.\n*/\nclass TiXmlString\n{\n  public :\n\t// The size type used\n  \ttypedef size_t size_type;\n\n\t// Error value for find primitive\n\tstatic const size_type npos; // = -1;\n\n\n\t// TiXmlString empty constructor\n\tTiXmlString () : rep_(&nullrep_)\n\t{\n\t}\n\n\t// TiXmlString copy constructor\n\tTiXmlString ( const TiXmlString & copy) : rep_(0)\n\t{\n\t\tinit(copy.length());\n\t\tmemcpy(start(), copy.data(), length());\n\t}\n\n\t// TiXmlString constructor, based on a string\n\tTIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0)\n\t{\n\t\tinit( static_cast<size_type>( strlen(copy) ));\n\t\tmemcpy(start(), copy, length());\n\t}\n\n\t// TiXmlString constructor, based on a string\n\tTIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0)\n\t{\n\t\tinit(len);\n\t\tmemcpy(start(), str, len);\n\t}\n\n\t// TiXmlString destructor\n\t~TiXmlString ()\n\t{\n\t\tquit();\n\t}\n\n\tTiXmlString& operator = (const char * copy)\n\t{\n\t\treturn assign( copy, (size_type)strlen(copy));\n\t}\n\n\tTiXmlString& operator = (const TiXmlString & copy)\n\t{\n\t\treturn assign(copy.start(), copy.length());\n\t}\n\n\n\t// += operator. Maps to append\n\tTiXmlString& operator += (const char * suffix)\n\t{\n\t\treturn append(suffix, static_cast<size_type>( strlen(suffix) ));\n\t}\n\n\t// += operator. Maps to append\n\tTiXmlString& operator += (char single)\n\t{\n\t\treturn append(&single, 1);\n\t}\n\n\t// += operator. Maps to append\n\tTiXmlString& operator += (const TiXmlString & suffix)\n\t{\n\t\treturn append(suffix.data(), suffix.length());\n\t}\n\n\n\t// Convert a TiXmlString into a null-terminated char *\n\tconst char * c_str () const { return rep_->str; }\n\n\t// Convert a TiXmlString into a char * (need not be null terminated).\n\tconst char * data () const { return rep_->str; }\n\n\t// Return the length of a TiXmlString\n\tsize_type length () const { return rep_->size; }\n\n\t// Alias for length()\n\tsize_type size () const { return rep_->size; }\n\n\t// Checks if a TiXmlString is empty\n\tbool empty () const { return rep_->size == 0; }\n\n\t// Return capacity of string\n\tsize_type capacity () const { return rep_->capacity; }\n\n\n\t// single char extraction\n\tconst char& at (size_type index) const\n\t{\n\t\tassert( index < length() );\n\t\treturn rep_->str[ index ];\n\t}\n\n\t// [] operator\n\tchar& operator [] (size_type index) const\n\t{\n\t\tassert( index < length() );\n\t\treturn rep_->str[ index ];\n\t}\n\n\t// find a char in a string. Return TiXmlString::npos if not found\n\tsize_type find (char lookup) const\n\t{\n\t\treturn find(lookup, 0);\n\t}\n\n\t// find a char in a string from an offset. Return TiXmlString::npos if not found\n\tsize_type find (char tofind, size_type offset) const\n\t{\n\t\tif (offset >= length()) return npos;\n\n\t\tfor (const char* p = c_str() + offset; *p != '\\0'; ++p)\n\t\t{\n\t\t   if (*p == tofind) return static_cast< size_type >( p - c_str() );\n\t\t}\n\t\treturn npos;\n\t}\n\n\tvoid clear ()\n\t{\n\t\t//Lee:\n\t\t//The original was just too strange, though correct:\n\t\t//\tTiXmlString().swap(*this);\n\t\t//Instead use the quit & re-init:\n\t\tquit();\n\t\tinit(0,0);\n\t}\n\n\t/*\tFunction to reserve a big amount of data when we know we'll need it. Be aware that this\n\t\tfunction DOES NOT clear the content of the TiXmlString if any exists.\n\t*/\n\tvoid reserve (size_type cap);\n\n\tTiXmlString& assign (const char* str, size_type len);\n\n\tTiXmlString& append (const char* str, size_type len);\n\n\tvoid swap (TiXmlString& other)\n\t{\n\t\tRep* r = rep_;\n\t\trep_ = other.rep_;\n\t\tother.rep_ = r;\n\t}\n\n  private:\n\n\tvoid init(size_type sz) { init(sz, sz); }\n\tvoid set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\\0'; }\n\tchar* start() const { return rep_->str; }\n\tchar* finish() const { return rep_->str + rep_->size; }\n\n\tstruct Rep\n\t{\n\t\tsize_type size, capacity;\n\t\tchar str[1];\n\t};\n\n\tvoid init(size_type sz, size_type cap)\n\t{\n\t\tif (cap)\n\t\t{\n\t\t\t// Lee: the original form:\n\t\t\t//\trep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));\n\t\t\t// doesn't work in some cases of new being overloaded. Switching\n\t\t\t// to the normal allocation, although use an 'int' for systems\n\t\t\t// that are overly picky about structure alignment.\n\t\t\tconst size_type bytesNeeded = sizeof(Rep) + cap;\n\t\t\tconst size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); \n\t\t\trep_ = reinterpret_cast<Rep*>( new int[ intsNeeded ] );\n\n\t\t\trep_->str[ rep_->size = sz ] = '\\0';\n\t\t\trep_->capacity = cap;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trep_ = &nullrep_;\n\t\t}\n\t}\n\n\tvoid quit()\n\t{\n\t\tif (rep_ != &nullrep_)\n\t\t{\n\t\t\t// The rep_ is really an array of ints. (see the allocator, above).\n\t\t\t// Cast it back before delete, so the compiler won't incorrectly call destructors.\n\t\t\tdelete [] ( reinterpret_cast<int*>( rep_ ) );\n\t\t}\n\t}\n\n\tRep * rep_;\n\tstatic Rep nullrep_;\n\n} ;\n\n\ninline bool operator == (const TiXmlString & a, const TiXmlString & b)\n{\n\treturn    ( a.length() == b.length() )\t\t\t\t// optimization on some platforms\n\t       && ( strcmp(a.c_str(), b.c_str()) == 0 );\t// actual compare\n}\ninline bool operator < (const TiXmlString & a, const TiXmlString & b)\n{\n\treturn strcmp(a.c_str(), b.c_str()) < 0;\n}\n\ninline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }\ninline bool operator >  (const TiXmlString & a, const TiXmlString & b) { return b < a; }\ninline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }\ninline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }\n\ninline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }\ninline bool operator == (const char* a, const TiXmlString & b) { return b == a; }\ninline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }\ninline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }\n\nTiXmlString operator + (const TiXmlString & a, const TiXmlString & b);\nTiXmlString operator + (const TiXmlString & a, const char* b);\nTiXmlString operator + (const char* a, const TiXmlString & b);\n\n\n/*\n   TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.\n   Only the operators that we need for TinyXML have been developped.\n*/\nclass TiXmlOutStream : public TiXmlString\n{\npublic :\n\n\t// TiXmlOutStream << operator.\n\tTiXmlOutStream & operator << (const TiXmlString & in)\n\t{\n\t\t*this += in;\n\t\treturn *this;\n\t}\n\n\t// TiXmlOutStream << operator.\n\tTiXmlOutStream & operator << (const char * in)\n\t{\n\t\t*this += in;\n\t\treturn *this;\n\t}\n\n} ;\n\n#endif\t// TIXML_STRING_INCLUDED\n#endif\t// TIXML_USE_STL\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinyxml/tinyxml.cpp",
    "content": "/*\nwww.sourceforge.net/projects/tinyxml\nOriginal code by Lee Thomason (www.grinninglizard.com)\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any\ndamages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any\npurpose, including commercial applications, and to alter it and\nredistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must\nnot claim that you wrote the original software. If you use this\nsoftware in a product, an acknowledgment in the product documentation\nwould be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and\nmust not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n*/\n\n#include <ctype.h>\n\n#ifdef TIXML_USE_STL\n#include <sstream>\n#include <iostream>\n#endif\n\n#include \"tinyxml.h\"\n\nFILE* TiXmlFOpen( const char* filename, const char* mode );\n\nbool TiXmlBase::condenseWhiteSpace = true;\n\n// Microsoft compiler security\nFILE* TiXmlFOpen( const char* filename, const char* mode )\n{\n\t#if defined(_MSC_VER) && (_MSC_VER >= 1400 )\n\t\tFILE* fp = 0;\n\t\terrno_t err = fopen_s( &fp, filename, mode );\n\t\tif ( !err && fp )\n\t\t\treturn fp;\n\t\treturn 0;\n\t#else\n\t\treturn fopen( filename, mode );\n\t#endif\n}\n\nvoid TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString )\n{\n\tint i=0;\n\n\twhile( i<(int)str.length() )\n\t{\n\t\tunsigned char c = (unsigned char) str[i];\n\n\t\tif (    c == '&' \n\t\t     && i < ( (int)str.length() - 2 )\n\t\t\t && str[i+1] == '#'\n\t\t\t && str[i+2] == 'x' )\n\t\t{\n\t\t\t// Hexadecimal character reference.\n\t\t\t// Pass through unchanged.\n\t\t\t// &#xA9;\t-- copyright symbol, for example.\n\t\t\t//\n\t\t\t// The -1 is a bug fix from Rob Laveaux. It keeps\n\t\t\t// an overflow from happening if there is no ';'.\n\t\t\t// There are actually 2 ways to exit this loop -\n\t\t\t// while fails (error case) and break (semicolon found).\n\t\t\t// However, there is no mechanism (currently) for\n\t\t\t// this function to return an error.\n\t\t\twhile ( i<(int)str.length()-1 )\n\t\t\t{\n\t\t\t\toutString->append( str.c_str() + i, 1 );\n\t\t\t\t++i;\n\t\t\t\tif ( str[i] == ';' )\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse if ( c == '&' )\n\t\t{\n\t\t\toutString->append( entity[0].str, entity[0].strLength );\n\t\t\t++i;\n\t\t}\n\t\telse if ( c == '<' )\n\t\t{\n\t\t\toutString->append( entity[1].str, entity[1].strLength );\n\t\t\t++i;\n\t\t}\n\t\telse if ( c == '>' )\n\t\t{\n\t\t\toutString->append( entity[2].str, entity[2].strLength );\n\t\t\t++i;\n\t\t}\n\t\telse if ( c == '\\\"' )\n\t\t{\n\t\t\toutString->append( entity[3].str, entity[3].strLength );\n\t\t\t++i;\n\t\t}\n\t\telse if ( c == '\\'' )\n\t\t{\n\t\t\toutString->append( entity[4].str, entity[4].strLength );\n\t\t\t++i;\n\t\t}\n\t\telse if ( c < 32 )\n\t\t{\n\t\t\t// Easy pass at non-alpha/numeric/symbol\n\t\t\t// Below 32 is symbolic.\n\t\t\tchar buf[ 32 ];\n\t\t\t\n\t\t\t#if defined(TIXML_SNPRINTF)\t\t\n\t\t\t\tTIXML_SNPRINTF( buf, sizeof(buf), \"&#x%02X;\", (unsigned) ( c & 0xff ) );\n\t\t\t#else\n\t\t\t\tsprintf( buf, \"&#x%02X;\", (unsigned) ( c & 0xff ) );\n\t\t\t#endif\t\t\n\n\t\t\t//*ME:\twarning C4267: convert 'size_t' to 'int'\n\t\t\t//*ME:\tInt-Cast to make compiler happy ...\n\t\t\toutString->append( buf, (int)strlen( buf ) );\n\t\t\t++i;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//char realc = (char) c;\n\t\t\t//outString->append( &realc, 1 );\n\t\t\t*outString += (char) c;\t// somewhat more efficient function call.\n\t\t\t++i;\n\t\t}\n\t}\n}\n\n\nTiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase()\n{\n\tparent = 0;\n\ttype = _type;\n\tfirstChild = 0;\n\tlastChild = 0;\n\tprev = 0;\n\tnext = 0;\n}\n\n\nTiXmlNode::~TiXmlNode()\n{\n\tTiXmlNode* node = firstChild;\n\tTiXmlNode* temp = 0;\n\n\twhile ( node )\n\t{\n\t\ttemp = node;\n\t\tnode = node->next;\n\t\tdelete temp;\n\t}\t\n}\n\n\nvoid TiXmlNode::CopyTo( TiXmlNode* target ) const\n{\n\ttarget->SetValue (value.c_str() );\n\ttarget->userData = userData; \n\ttarget->location = location;\n}\n\n\nvoid TiXmlNode::Clear()\n{\n\tTiXmlNode* node = firstChild;\n\tTiXmlNode* temp = 0;\n\n\twhile ( node )\n\t{\n\t\ttemp = node;\n\t\tnode = node->next;\n\t\tdelete temp;\n\t}\t\n\n\tfirstChild = 0;\n\tlastChild = 0;\n}\n\n\nTiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )\n{\n\tassert( node->parent == 0 || node->parent == this );\n\tassert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() );\n\n\tif ( node->Type() == TiXmlNode::TINYXML_DOCUMENT )\n\t{\n\t\tdelete node;\n\t\tif ( GetDocument() ) \n\t\t\tGetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn 0;\n\t}\n\n\tnode->parent = this;\n\n\tnode->prev = lastChild;\n\tnode->next = 0;\n\n\tif ( lastChild )\n\t\tlastChild->next = node;\n\telse\n\t\tfirstChild = node;\t\t\t// it was an empty list.\n\n\tlastChild = node;\n\treturn node;\n}\n\n\nTiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis )\n{\n\tif ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )\n\t{\n\t\tif ( GetDocument() ) \n\t\t\tGetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn 0;\n\t}\n\tTiXmlNode* node = addThis.Clone();\n\tif ( !node )\n\t\treturn 0;\n\n\treturn LinkEndChild( node );\n}\n\n\nTiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis )\n{\t\n\tif ( !beforeThis || beforeThis->parent != this ) {\n\t\treturn 0;\n\t}\n\tif ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )\n\t{\n\t\tif ( GetDocument() ) \n\t\t\tGetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn 0;\n\t}\n\n\tTiXmlNode* node = addThis.Clone();\n\tif ( !node )\n\t\treturn 0;\n\tnode->parent = this;\n\n\tnode->next = beforeThis;\n\tnode->prev = beforeThis->prev;\n\tif ( beforeThis->prev )\n\t{\n\t\tbeforeThis->prev->next = node;\n\t}\n\telse\n\t{\n\t\tassert( firstChild == beforeThis );\n\t\tfirstChild = node;\n\t}\n\tbeforeThis->prev = node;\n\treturn node;\n}\n\n\nTiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis )\n{\n\tif ( !afterThis || afterThis->parent != this ) {\n\t\treturn 0;\n\t}\n\tif ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )\n\t{\n\t\tif ( GetDocument() ) \n\t\t\tGetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn 0;\n\t}\n\n\tTiXmlNode* node = addThis.Clone();\n\tif ( !node )\n\t\treturn 0;\n\tnode->parent = this;\n\n\tnode->prev = afterThis;\n\tnode->next = afterThis->next;\n\tif ( afterThis->next )\n\t{\n\t\tafterThis->next->prev = node;\n\t}\n\telse\n\t{\n\t\tassert( lastChild == afterThis );\n\t\tlastChild = node;\n\t}\n\tafterThis->next = node;\n\treturn node;\n}\n\n\nTiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )\n{\n\tif ( !replaceThis )\n\t\treturn 0;\n\n\tif ( replaceThis->parent != this )\n\t\treturn 0;\n\n\tif ( withThis.ToDocument() ) {\n\t\t// A document can never be a child.\tThanks to Noam.\n\t\tTiXmlDocument* document = GetDocument();\n\t\tif ( document ) \n\t\t\tdocument->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn 0;\n\t}\n\n\tTiXmlNode* node = withThis.Clone();\n\tif ( !node )\n\t\treturn 0;\n\n\tnode->next = replaceThis->next;\n\tnode->prev = replaceThis->prev;\n\n\tif ( replaceThis->next )\n\t\treplaceThis->next->prev = node;\n\telse\n\t\tlastChild = node;\n\n\tif ( replaceThis->prev )\n\t\treplaceThis->prev->next = node;\n\telse\n\t\tfirstChild = node;\n\n\tdelete replaceThis;\n\tnode->parent = this;\n\treturn node;\n}\n\n\nbool TiXmlNode::RemoveChild( TiXmlNode* removeThis )\n{\n\tif ( !removeThis ) {\n\t\treturn false;\n\t}\n\n\tif ( removeThis->parent != this )\n\t{\t\n\t\tassert( 0 );\n\t\treturn false;\n\t}\n\n\tif ( removeThis->next )\n\t\tremoveThis->next->prev = removeThis->prev;\n\telse\n\t\tlastChild = removeThis->prev;\n\n\tif ( removeThis->prev )\n\t\tremoveThis->prev->next = removeThis->next;\n\telse\n\t\tfirstChild = removeThis->next;\n\n\tdelete removeThis;\n\treturn true;\n}\n\nconst TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const\n{\n\tconst TiXmlNode* node;\n\tfor ( node = firstChild; node; node = node->next )\n\t{\n\t\tif ( strcmp( node->Value(), _value ) == 0 )\n\t\t\treturn node;\n\t}\n\treturn 0;\n}\n\n\nconst TiXmlNode* TiXmlNode::LastChild( const char * _value ) const\n{\n\tconst TiXmlNode* node;\n\tfor ( node = lastChild; node; node = node->prev )\n\t{\n\t\tif ( strcmp( node->Value(), _value ) == 0 )\n\t\t\treturn node;\n\t}\n\treturn 0;\n}\n\n\nconst TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const\n{\n\tif ( !previous )\n\t{\n\t\treturn FirstChild();\n\t}\n\telse\n\t{\n\t\tassert( previous->parent == this );\n\t\treturn previous->NextSibling();\n\t}\n}\n\n\nconst TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const\n{\n\tif ( !previous )\n\t{\n\t\treturn FirstChild( val );\n\t}\n\telse\n\t{\n\t\tassert( previous->parent == this );\n\t\treturn previous->NextSibling( val );\n\t}\n}\n\n\nconst TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const \n{\n\tconst TiXmlNode* node;\n\tfor ( node = next; node; node = node->next )\n\t{\n\t\tif ( strcmp( node->Value(), _value ) == 0 )\n\t\t\treturn node;\n\t}\n\treturn 0;\n}\n\n\nconst TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const\n{\n\tconst TiXmlNode* node;\n\tfor ( node = prev; node; node = node->prev )\n\t{\n\t\tif ( strcmp( node->Value(), _value ) == 0 )\n\t\t\treturn node;\n\t}\n\treturn 0;\n}\n\n\nvoid TiXmlElement::RemoveAttribute( const char * name )\n{\n    #ifdef TIXML_USE_STL\n\tTIXML_STRING str( name );\n\tTiXmlAttribute* node = attributeSet.Find( str );\n\t#else\n\tTiXmlAttribute* node = attributeSet.Find( name );\n\t#endif\n\tif ( node )\n\t{\n\t\tattributeSet.Remove( node );\n\t\tdelete node;\n\t}\n}\n\nconst TiXmlElement* TiXmlNode::FirstChildElement() const\n{\n\tconst TiXmlNode* node;\n\n\tfor (\tnode = FirstChild();\n\t\t\tnode;\n\t\t\tnode = node->NextSibling() )\n\t{\n\t\tif ( node->ToElement() )\n\t\t\treturn node->ToElement();\n\t}\n\treturn 0;\n}\n\n\nconst TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const\n{\n\tconst TiXmlNode* node;\n\n\tfor (\tnode = FirstChild( _value );\n\t\t\tnode;\n\t\t\tnode = node->NextSibling( _value ) )\n\t{\n\t\tif ( node->ToElement() )\n\t\t\treturn node->ToElement();\n\t}\n\treturn 0;\n}\n\n\nconst TiXmlElement* TiXmlNode::NextSiblingElement() const\n{\n\tconst TiXmlNode* node;\n\n\tfor (\tnode = NextSibling();\n\t\t\tnode;\n\t\t\tnode = node->NextSibling() )\n\t{\n\t\tif ( node->ToElement() )\n\t\t\treturn node->ToElement();\n\t}\n\treturn 0;\n}\n\n\nconst TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const\n{\n\tconst TiXmlNode* node;\n\n\tfor (\tnode = NextSibling( _value );\n\t\t\tnode;\n\t\t\tnode = node->NextSibling( _value ) )\n\t{\n\t\tif ( node->ToElement() )\n\t\t\treturn node->ToElement();\n\t}\n\treturn 0;\n}\n\n\nconst TiXmlDocument* TiXmlNode::GetDocument() const\n{\n\tconst TiXmlNode* node;\n\n\tfor( node = this; node; node = node->parent )\n\t{\n\t\tif ( node->ToDocument() )\n\t\t\treturn node->ToDocument();\n\t}\n\treturn 0;\n}\n\n\nTiXmlElement::TiXmlElement (const char * _value)\n\t: TiXmlNode( TiXmlNode::TINYXML_ELEMENT )\n{\n\tfirstChild = lastChild = 0;\n\tvalue = _value;\n}\n\n\n#ifdef TIXML_USE_STL\nTiXmlElement::TiXmlElement( const std::string& _value ) \n\t: TiXmlNode( TiXmlNode::TINYXML_ELEMENT )\n{\n\tfirstChild = lastChild = 0;\n\tvalue = _value;\n}\n#endif\n\n\nTiXmlElement::TiXmlElement( const TiXmlElement& copy)\n\t: TiXmlNode( TiXmlNode::TINYXML_ELEMENT )\n{\n\tfirstChild = lastChild = 0;\n\tcopy.CopyTo( this );\t\n}\n\n\nTiXmlElement& TiXmlElement::operator=( const TiXmlElement& base )\n{\n\tClearThis();\n\tbase.CopyTo( this );\n\treturn *this;\n}\n\n\nTiXmlElement::~TiXmlElement()\n{\n\tClearThis();\n}\n\n\nvoid TiXmlElement::ClearThis()\n{\n\tClear();\n\twhile( attributeSet.First() )\n\t{\n\t\tTiXmlAttribute* node = attributeSet.First();\n\t\tattributeSet.Remove( node );\n\t\tdelete node;\n\t}\n}\n\n\nconst char* TiXmlElement::Attribute( const char* name ) const\n{\n\tconst TiXmlAttribute* node = attributeSet.Find( name );\n\tif ( node )\n\t\treturn node->Value();\n\treturn 0;\n}\n\n\n#ifdef TIXML_USE_STL\nconst std::string* TiXmlElement::Attribute( const std::string& name ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tif ( attrib )\n\t\treturn &attrib->ValueStr();\n\treturn 0;\n}\n#endif\n\n\nconst char* TiXmlElement::Attribute( const char* name, int* i ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tconst char* result = 0;\n\n\tif ( attrib ) {\n\t\tresult = attrib->Value();\n\t\tif ( i ) {\n\t\t\tattrib->QueryIntValue( i );\n\t\t}\n\t}\n\treturn result;\n}\n\n\n#ifdef TIXML_USE_STL\nconst std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tconst std::string* result = 0;\n\n\tif ( attrib ) {\n\t\tresult = &attrib->ValueStr();\n\t\tif ( i ) {\n\t\t\tattrib->QueryIntValue( i );\n\t\t}\n\t}\n\treturn result;\n}\n#endif\n\n\nconst char* TiXmlElement::Attribute( const char* name, double* d ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tconst char* result = 0;\n\n\tif ( attrib ) {\n\t\tresult = attrib->Value();\n\t\tif ( d ) {\n\t\t\tattrib->QueryDoubleValue( d );\n\t\t}\n\t}\n\treturn result;\n}\n\n\n#ifdef TIXML_USE_STL\nconst std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tconst std::string* result = 0;\n\n\tif ( attrib ) {\n\t\tresult = &attrib->ValueStr();\n\t\tif ( d ) {\n\t\t\tattrib->QueryDoubleValue( d );\n\t\t}\n\t}\n\treturn result;\n}\n#endif\n\n\nint TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tif ( !attrib )\n\t\treturn TIXML_NO_ATTRIBUTE;\n\treturn attrib->QueryIntValue( ival );\n}\n\n\nint TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value ) const\n{\n\tconst TiXmlAttribute* node = attributeSet.Find( name );\n\tif ( !node )\n\t\treturn TIXML_NO_ATTRIBUTE;\n\n\tint ival = 0;\n\tint result = node->QueryIntValue( &ival );\n\t*value = (unsigned)ival;\n\treturn result;\n}\n\n\nint TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const\n{\n\tconst TiXmlAttribute* node = attributeSet.Find( name );\n\tif ( !node )\n\t\treturn TIXML_NO_ATTRIBUTE;\n\t\n\tint result = TIXML_WRONG_TYPE;\n\tif (    StringEqual( node->Value(), \"true\", true, TIXML_ENCODING_UNKNOWN ) \n\t\t || StringEqual( node->Value(), \"yes\", true, TIXML_ENCODING_UNKNOWN ) \n\t\t || StringEqual( node->Value(), \"1\", true, TIXML_ENCODING_UNKNOWN ) ) \n\t{\n\t\t*bval = true;\n\t\tresult = TIXML_SUCCESS;\n\t}\n\telse if (    StringEqual( node->Value(), \"false\", true, TIXML_ENCODING_UNKNOWN ) \n\t\t\t  || StringEqual( node->Value(), \"no\", true, TIXML_ENCODING_UNKNOWN ) \n\t\t\t  || StringEqual( node->Value(), \"0\", true, TIXML_ENCODING_UNKNOWN ) ) \n\t{\n\t\t*bval = false;\n\t\tresult = TIXML_SUCCESS;\n\t}\n\treturn result;\n}\n\n\n\n#ifdef TIXML_USE_STL\nint TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tif ( !attrib )\n\t\treturn TIXML_NO_ATTRIBUTE;\n\treturn attrib->QueryIntValue( ival );\n}\n#endif\n\n\nint TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tif ( !attrib )\n\t\treturn TIXML_NO_ATTRIBUTE;\n\treturn attrib->QueryDoubleValue( dval );\n}\n\n\n#ifdef TIXML_USE_STL\nint TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const\n{\n\tconst TiXmlAttribute* attrib = attributeSet.Find( name );\n\tif ( !attrib )\n\t\treturn TIXML_NO_ATTRIBUTE;\n\treturn attrib->QueryDoubleValue( dval );\n}\n#endif\n\n\nvoid TiXmlElement::SetAttribute( const char * name, int val )\n{\t\n\tTiXmlAttribute* attrib = attributeSet.FindOrCreate( name );\n\tif ( attrib ) {\n\t\tattrib->SetIntValue( val );\n\t}\n}\n\n\n#ifdef TIXML_USE_STL\nvoid TiXmlElement::SetAttribute( const std::string& name, int val )\n{\t\n\tTiXmlAttribute* attrib = attributeSet.FindOrCreate( name );\n\tif ( attrib ) {\n\t\tattrib->SetIntValue( val );\n\t}\n}\n#endif\n\n\nvoid TiXmlElement::SetDoubleAttribute( const char * name, double val )\n{\t\n\tTiXmlAttribute* attrib = attributeSet.FindOrCreate( name );\n\tif ( attrib ) {\n\t\tattrib->SetDoubleValue( val );\n\t}\n}\n\n\n#ifdef TIXML_USE_STL\nvoid TiXmlElement::SetDoubleAttribute( const std::string& name, double val )\n{\t\n\tTiXmlAttribute* attrib = attributeSet.FindOrCreate( name );\n\tif ( attrib ) {\n\t\tattrib->SetDoubleValue( val );\n\t}\n}\n#endif \n\n\nvoid TiXmlElement::SetAttribute( const char * cname, const char * cvalue )\n{\n\tTiXmlAttribute* attrib = attributeSet.FindOrCreate( cname );\n\tif ( attrib ) {\n\t\tattrib->SetValue( cvalue );\n\t}\n}\n\n\n#ifdef TIXML_USE_STL\nvoid TiXmlElement::SetAttribute( const std::string& _name, const std::string& _value )\n{\n\tTiXmlAttribute* attrib = attributeSet.FindOrCreate( _name );\n\tif ( attrib ) {\n\t\tattrib->SetValue( _value );\n\t}\n}\n#endif\n\n\nvoid TiXmlElement::Print( FILE* cfile, int depth ) const\n{\n\tint i;\n\tassert( cfile );\n\tfor ( i=0; i<depth; i++ ) {\n\t\tfprintf( cfile, \"    \" );\n\t}\n\n\tfprintf( cfile, \"<%s\", value.c_str() );\n\n\tconst TiXmlAttribute* attrib;\n\tfor ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )\n\t{\n\t\tfprintf( cfile, \" \" );\n\t\tattrib->Print( cfile, depth );\n\t}\n\n\t// There are 3 different formatting approaches:\n\t// 1) An element without children is printed as a <foo /> node\n\t// 2) An element with only a text child is printed as <foo> text </foo>\n\t// 3) An element with children is printed on multiple lines.\n\tTiXmlNode* node;\n\tif ( !firstChild )\n\t{\n\t\tfprintf( cfile, \" />\" );\n\t}\n\telse if ( firstChild == lastChild && firstChild->ToText() )\n\t{\n\t\tfprintf( cfile, \">\" );\n\t\tfirstChild->Print( cfile, depth + 1 );\n\t\tfprintf( cfile, \"</%s>\", value.c_str() );\n\t}\n\telse\n\t{\n\t\tfprintf( cfile, \">\" );\n\n\t\tfor ( node = firstChild; node; node=node->NextSibling() )\n\t\t{\n\t\t\tif ( !node->ToText() )\n\t\t\t{\n\t\t\t\tfprintf( cfile, \"\\n\" );\n\t\t\t}\n\t\t\tnode->Print( cfile, depth+1 );\n\t\t}\n\t\tfprintf( cfile, \"\\n\" );\n\t\tfor( i=0; i<depth; ++i ) {\n\t\t\tfprintf( cfile, \"    \" );\n\t\t}\n\t\tfprintf( cfile, \"</%s>\", value.c_str() );\n\t}\n}\n\n\nvoid TiXmlElement::CopyTo( TiXmlElement* target ) const\n{\n\t// superclass:\n\tTiXmlNode::CopyTo( target );\n\n\t// Element class: \n\t// Clone the attributes, then clone the children.\n\tconst TiXmlAttribute* attribute = 0;\n\tfor(\tattribute = attributeSet.First();\n\tattribute;\n\tattribute = attribute->Next() )\n\t{\n\t\ttarget->SetAttribute( attribute->Name(), attribute->Value() );\n\t}\n\n\tTiXmlNode* node = 0;\n\tfor ( node = firstChild; node; node = node->NextSibling() )\n\t{\n\t\ttarget->LinkEndChild( node->Clone() );\n\t}\n}\n\nbool TiXmlElement::Accept( TiXmlVisitor* visitor ) const\n{\n\tif ( visitor->VisitEnter( *this, attributeSet.First() ) ) \n\t{\n\t\tfor ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )\n\t\t{\n\t\t\tif ( !node->Accept( visitor ) )\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn visitor->VisitExit( *this );\n}\n\n\nTiXmlNode* TiXmlElement::Clone() const\n{\n\tTiXmlElement* clone = new TiXmlElement( Value() );\n\tif ( !clone )\n\t\treturn 0;\n\n\tCopyTo( clone );\n\treturn clone;\n}\n\n\nconst char* TiXmlElement::GetText() const\n{\n\tconst TiXmlNode* child = this->FirstChild();\n\tif ( child ) {\n\t\tconst TiXmlText* childText = child->ToText();\n\t\tif ( childText ) {\n\t\t\treturn childText->Value();\n\t\t}\n\t}\n\treturn 0;\n}\n\n\nTiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )\n{\n\ttabsize = 4;\n\tuseMicrosoftBOM = false;\n\tClearError();\n}\n\nTiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )\n{\n\ttabsize = 4;\n\tuseMicrosoftBOM = false;\n\tvalue = documentName;\n\tClearError();\n}\n\n\n#ifdef TIXML_USE_STL\nTiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )\n{\n\ttabsize = 4;\n\tuseMicrosoftBOM = false;\n    value = documentName;\n\tClearError();\n}\n#endif\n\n\nTiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )\n{\n\tcopy.CopyTo( this );\n}\n\n\nTiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy )\n{\n\tClear();\n\tcopy.CopyTo( this );\n\treturn *this;\n}\n\n\nbool TiXmlDocument::LoadFile( TiXmlEncoding encoding )\n{\n\treturn LoadFile( Value(), encoding );\n}\n\n\nbool TiXmlDocument::SaveFile() const\n{\n\treturn SaveFile( Value() );\n}\n\nbool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding )\n{\n\tTIXML_STRING filename( _filename );\n\tvalue = filename;\n\n\t// reading in binary mode so that tinyxml can normalize the EOL\n\tFILE* file = TiXmlFOpen( value.c_str (), \"rb\" );\t\n\n\tif ( file )\n\t{\n\t\tbool result = LoadFile( file, encoding );\n\t\tfclose( file );\n\t\treturn result;\n\t}\n\telse\n\t{\n\t\tSetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn false;\n\t}\n}\n\nbool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding )\n{\n\tif ( !file ) \n\t{\n\t\tSetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn false;\n\t}\n\n\t// Delete the existing data:\n\tClear();\n\tlocation.Clear();\n\n\t// Get the file size, so we can pre-allocate the string. HUGE speed impact.\n\tlong length = 0;\n\tfseek( file, 0, SEEK_END );\n\tlength = ftell( file );\n\tfseek( file, 0, SEEK_SET );\n\n\t// Strange case, but good to handle up front.\n\tif ( length <= 0 )\n\t{\n\t\tSetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn false;\n\t}\n\n\t// Subtle bug here. TinyXml did use fgets. But from the XML spec:\n\t// 2.11 End-of-Line Handling\n\t// <snip>\n\t// <quote>\n\t// ...the XML processor MUST behave as if it normalized all line breaks in external \n\t// parsed entities (including the document entity) on input, before parsing, by translating \n\t// both the two-character sequence #xD #xA and any #xD that is not followed by #xA to \n\t// a single #xA character.\n\t// </quote>\n\t//\n\t// It is not clear fgets does that, and certainly isn't clear it works cross platform. \n\t// Generally, you expect fgets to translate from the convention of the OS to the c/unix\n\t// convention, and not work generally.\n\n\t/*\n\twhile( fgets( buf, sizeof(buf), file ) )\n\t{\n\t\tdata += buf;\n\t}\n\t*/\n\n\tchar* buf = new char[ length+1 ];\n\tbuf[0] = 0;\n\n\tif ( fread( buf, length, 1, file ) != 1 ) {\n\t\tdelete [] buf;\n\t\tSetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn false;\n\t}\n\n\t// Process the buffer in place to normalize new lines. (See comment above.)\n\t// Copies from the 'p' to 'q' pointer, where p can advance faster if\n\t// a newline-carriage return is hit.\n\t//\n\t// Wikipedia:\n\t// Systems based on ASCII or a compatible character set use either LF  (Line feed, '\\n', 0x0A, 10 in decimal) or \n\t// CR (Carriage return, '\\r', 0x0D, 13 in decimal) individually, or CR followed by LF (CR+LF, 0x0D 0x0A)...\n\t//\t\t* LF:    Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others\n    //\t\t* CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS\n    //\t\t* CR:    Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9\n\n\tconst char* p = buf;\t// the read head\n\tchar* q = buf;\t\t\t// the write head\n\tconst char CR = 0x0d;\n\tconst char LF = 0x0a;\n\n\tbuf[length] = 0;\n\twhile( *p ) {\n\t\tassert( p < (buf+length) );\n\t\tassert( q <= (buf+length) );\n\t\tassert( q <= p );\n\n\t\tif ( *p == CR ) {\n\t\t\t*q++ = LF;\n\t\t\tp++;\n\t\t\tif ( *p == LF ) {\t\t// check for CR+LF (and skip LF)\n\t\t\t\tp++;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t*q++ = *p++;\n\t\t}\n\t}\n\tassert( q <= (buf+length) );\n\t*q = 0;\n\n\tParse( buf, 0, encoding );\n\n\tdelete [] buf;\n\treturn !Error();\n}\n\n\nbool TiXmlDocument::SaveFile( const char * filename ) const\n{\n\t// The old c stuff lives on...\n\tFILE* fp = TiXmlFOpen( filename, \"w\" );\n\tif ( fp )\n\t{\n\t\tbool result = SaveFile( fp );\n\t\tfclose( fp );\n\t\treturn result;\n\t}\n\treturn false;\n}\n\n\nbool TiXmlDocument::SaveFile( FILE* fp ) const\n{\n\tif ( useMicrosoftBOM ) \n\t{\n\t\tconst unsigned char TIXML_UTF_LEAD_0 = 0xefU;\n\t\tconst unsigned char TIXML_UTF_LEAD_1 = 0xbbU;\n\t\tconst unsigned char TIXML_UTF_LEAD_2 = 0xbfU;\n\n\t\tfputc( TIXML_UTF_LEAD_0, fp );\n\t\tfputc( TIXML_UTF_LEAD_1, fp );\n\t\tfputc( TIXML_UTF_LEAD_2, fp );\n\t}\n\tPrint( fp, 0 );\n\treturn (ferror(fp) == 0);\n}\n\n\nvoid TiXmlDocument::CopyTo( TiXmlDocument* target ) const\n{\n\tTiXmlNode::CopyTo( target );\n\n\ttarget->error = error;\n\ttarget->errorId = errorId;\n\ttarget->errorDesc = errorDesc;\n\ttarget->tabsize = tabsize;\n\ttarget->errorLocation = errorLocation;\n\ttarget->useMicrosoftBOM = useMicrosoftBOM;\n\n\tTiXmlNode* node = 0;\n\tfor ( node = firstChild; node; node = node->NextSibling() )\n\t{\n\t\ttarget->LinkEndChild( node->Clone() );\n\t}\t\n}\n\n\nTiXmlNode* TiXmlDocument::Clone() const\n{\n\tTiXmlDocument* clone = new TiXmlDocument();\n\tif ( !clone )\n\t\treturn 0;\n\n\tCopyTo( clone );\n\treturn clone;\n}\n\n\nvoid TiXmlDocument::Print( FILE* cfile, int depth ) const\n{\n\tassert( cfile );\n\tfor ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )\n\t{\n\t\tnode->Print( cfile, depth );\n\t\tfprintf( cfile, \"\\n\" );\n\t}\n}\n\n\nbool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const\n{\n\tif ( visitor->VisitEnter( *this ) )\n\t{\n\t\tfor ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )\n\t\t{\n\t\t\tif ( !node->Accept( visitor ) )\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn visitor->VisitExit( *this );\n}\n\n\nconst TiXmlAttribute* TiXmlAttribute::Next() const\n{\n\t// We are using knowledge of the sentinel. The sentinel\n\t// have a value or name.\n\tif ( next->value.empty() && next->name.empty() )\n\t\treturn 0;\n\treturn next;\n}\n\n/*\nTiXmlAttribute* TiXmlAttribute::Next()\n{\n\t// We are using knowledge of the sentinel. The sentinel\n\t// have a value or name.\n\tif ( next->value.empty() && next->name.empty() )\n\t\treturn 0;\n\treturn next;\n}\n*/\n\nconst TiXmlAttribute* TiXmlAttribute::Previous() const\n{\n\t// We are using knowledge of the sentinel. The sentinel\n\t// have a value or name.\n\tif ( prev->value.empty() && prev->name.empty() )\n\t\treturn 0;\n\treturn prev;\n}\n\n/*\nTiXmlAttribute* TiXmlAttribute::Previous()\n{\n\t// We are using knowledge of the sentinel. The sentinel\n\t// have a value or name.\n\tif ( prev->value.empty() && prev->name.empty() )\n\t\treturn 0;\n\treturn prev;\n}\n*/\n\nvoid TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const\n{\n\tTIXML_STRING n, v;\n\n\tEncodeString( name, &n );\n\tEncodeString( value, &v );\n\n\tif (value.find ('\\\"') == TIXML_STRING::npos) {\n\t\tif ( cfile ) {\n\t\t\tfprintf (cfile, \"%s=\\\"%s\\\"\", n.c_str(), v.c_str() );\n\t\t}\n\t\tif ( str ) {\n\t\t\t(*str) += n; (*str) += \"=\\\"\"; (*str) += v; (*str) += \"\\\"\";\n\t\t}\n\t}\n\telse {\n\t\tif ( cfile ) {\n\t\t\tfprintf (cfile, \"%s='%s'\", n.c_str(), v.c_str() );\n\t\t}\n\t\tif ( str ) {\n\t\t\t(*str) += n; (*str) += \"='\"; (*str) += v; (*str) += \"'\";\n\t\t}\n\t}\n}\n\n\nint TiXmlAttribute::QueryIntValue( int* ival ) const\n{\n\tif ( TIXML_SSCANF( value.c_str(), \"%d\", ival ) == 1 )\n\t\treturn TIXML_SUCCESS;\n\treturn TIXML_WRONG_TYPE;\n}\n\nint TiXmlAttribute::QueryDoubleValue( double* dval ) const\n{\n\tif ( TIXML_SSCANF( value.c_str(), \"%lf\", dval ) == 1 )\n\t\treturn TIXML_SUCCESS;\n\treturn TIXML_WRONG_TYPE;\n}\n\nvoid TiXmlAttribute::SetIntValue( int _value )\n{\n\tchar buf [64];\n\t#if defined(TIXML_SNPRINTF)\t\t\n\t\tTIXML_SNPRINTF(buf, sizeof(buf), \"%d\", _value);\n\t#else\n\t\tsprintf (buf, \"%d\", _value);\n\t#endif\n\tSetValue (buf);\n}\n\nvoid TiXmlAttribute::SetDoubleValue( double _value )\n{\n\tchar buf [256];\n\t#if defined(TIXML_SNPRINTF)\t\t\n\t\tTIXML_SNPRINTF( buf, sizeof(buf), \"%g\", _value);\n\t#else\n\t\tsprintf (buf, \"%g\", _value);\n\t#endif\n\tSetValue (buf);\n}\n\nint TiXmlAttribute::IntValue() const\n{\n\treturn atoi (value.c_str ());\n}\n\ndouble  TiXmlAttribute::DoubleValue() const\n{\n\treturn atof (value.c_str ());\n}\n\n\nTiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT )\n{\n\tcopy.CopyTo( this );\n}\n\n\nTiXmlComment& TiXmlComment::operator=( const TiXmlComment& base )\n{\n\tClear();\n\tbase.CopyTo( this );\n\treturn *this;\n}\n\n\nvoid TiXmlComment::Print( FILE* cfile, int depth ) const\n{\n\tassert( cfile );\n\tfor ( int i=0; i<depth; i++ )\n\t{\n\t\tfprintf( cfile,  \"    \" );\n\t}\n\tfprintf( cfile, \"<!--%s-->\", value.c_str() );\n}\n\n\nvoid TiXmlComment::CopyTo( TiXmlComment* target ) const\n{\n\tTiXmlNode::CopyTo( target );\n}\n\n\nbool TiXmlComment::Accept( TiXmlVisitor* visitor ) const\n{\n\treturn visitor->Visit( *this );\n}\n\n\nTiXmlNode* TiXmlComment::Clone() const\n{\n\tTiXmlComment* clone = new TiXmlComment();\n\n\tif ( !clone )\n\t\treturn 0;\n\n\tCopyTo( clone );\n\treturn clone;\n}\n\n\nvoid TiXmlText::Print( FILE* cfile, int depth ) const\n{\n\tassert( cfile );\n\tif ( cdata )\n\t{\n\t\tint i;\n\t\tfprintf( cfile, \"\\n\" );\n\t\tfor ( i=0; i<depth; i++ ) {\n\t\t\tfprintf( cfile, \"    \" );\n\t\t}\n\t\tfprintf( cfile, \"<![CDATA[%s]]>\\n\", value.c_str() );\t// unformatted output\n\t}\n\telse\n\t{\n\t\tTIXML_STRING buffer;\n\t\tEncodeString( value, &buffer );\n\t\tfprintf( cfile, \"%s\", buffer.c_str() );\n\t}\n}\n\n\nvoid TiXmlText::CopyTo( TiXmlText* target ) const\n{\n\tTiXmlNode::CopyTo( target );\n\ttarget->cdata = cdata;\n}\n\n\nbool TiXmlText::Accept( TiXmlVisitor* visitor ) const\n{\n\treturn visitor->Visit( *this );\n}\n\n\nTiXmlNode* TiXmlText::Clone() const\n{\t\n\tTiXmlText* clone = 0;\n\tclone = new TiXmlText( \"\" );\n\n\tif ( !clone )\n\t\treturn 0;\n\n\tCopyTo( clone );\n\treturn clone;\n}\n\n\nTiXmlDeclaration::TiXmlDeclaration( const char * _version,\n\t\t\t\t\t\t\t\t\tconst char * _encoding,\n\t\t\t\t\t\t\t\t\tconst char * _standalone )\n\t: TiXmlNode( TiXmlNode::TINYXML_DECLARATION )\n{\n\tversion = _version;\n\tencoding = _encoding;\n\tstandalone = _standalone;\n}\n\n\n#ifdef TIXML_USE_STL\nTiXmlDeclaration::TiXmlDeclaration(\tconst std::string& _version,\n\t\t\t\t\t\t\t\t\tconst std::string& _encoding,\n\t\t\t\t\t\t\t\t\tconst std::string& _standalone )\n\t: TiXmlNode( TiXmlNode::TINYXML_DECLARATION )\n{\n\tversion = _version;\n\tencoding = _encoding;\n\tstandalone = _standalone;\n}\n#endif\n\n\nTiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy )\n\t: TiXmlNode( TiXmlNode::TINYXML_DECLARATION )\n{\n\tcopy.CopyTo( this );\t\n}\n\n\nTiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy )\n{\n\tClear();\n\tcopy.CopyTo( this );\n\treturn *this;\n}\n\n\nvoid TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const\n{\n\tif ( cfile ) fprintf( cfile, \"<?xml \" );\n\tif ( str )\t (*str) += \"<?xml \";\n\n\tif ( !version.empty() ) {\n\t\tif ( cfile ) fprintf (cfile, \"version=\\\"%s\\\" \", version.c_str ());\n\t\tif ( str ) { (*str) += \"version=\\\"\"; (*str) += version; (*str) += \"\\\" \"; }\n\t}\n\tif ( !encoding.empty() ) {\n\t\tif ( cfile ) fprintf (cfile, \"encoding=\\\"%s\\\" \", encoding.c_str ());\n\t\tif ( str ) { (*str) += \"encoding=\\\"\"; (*str) += encoding; (*str) += \"\\\" \"; }\n\t}\n\tif ( !standalone.empty() ) {\n\t\tif ( cfile ) fprintf (cfile, \"standalone=\\\"%s\\\" \", standalone.c_str ());\n\t\tif ( str ) { (*str) += \"standalone=\\\"\"; (*str) += standalone; (*str) += \"\\\" \"; }\n\t}\n\tif ( cfile ) fprintf( cfile, \"?>\" );\n\tif ( str )\t (*str) += \"?>\";\n}\n\n\nvoid TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const\n{\n\tTiXmlNode::CopyTo( target );\n\n\ttarget->version = version;\n\ttarget->encoding = encoding;\n\ttarget->standalone = standalone;\n}\n\n\nbool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const\n{\n\treturn visitor->Visit( *this );\n}\n\n\nTiXmlNode* TiXmlDeclaration::Clone() const\n{\t\n\tTiXmlDeclaration* clone = new TiXmlDeclaration();\n\n\tif ( !clone )\n\t\treturn 0;\n\n\tCopyTo( clone );\n\treturn clone;\n}\n\n\nvoid TiXmlUnknown::Print( FILE* cfile, int depth ) const\n{\n\tfor ( int i=0; i<depth; i++ )\n\t\tfprintf( cfile, \"    \" );\n\tfprintf( cfile, \"<%s>\", value.c_str() );\n}\n\n\nvoid TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const\n{\n\tTiXmlNode::CopyTo( target );\n}\n\n\nbool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const\n{\n\treturn visitor->Visit( *this );\n}\n\n\nTiXmlNode* TiXmlUnknown::Clone() const\n{\n\tTiXmlUnknown* clone = new TiXmlUnknown();\n\n\tif ( !clone )\n\t\treturn 0;\n\n\tCopyTo( clone );\n\treturn clone;\n}\n\n\nTiXmlAttributeSet::TiXmlAttributeSet()\n{\n\tsentinel.next = &sentinel;\n\tsentinel.prev = &sentinel;\n}\n\n\nTiXmlAttributeSet::~TiXmlAttributeSet()\n{\n\tassert( sentinel.next == &sentinel );\n\tassert( sentinel.prev == &sentinel );\n}\n\n\nvoid TiXmlAttributeSet::Add( TiXmlAttribute* addMe )\n{\n    #ifdef TIXML_USE_STL\n\tassert( !Find( TIXML_STRING( addMe->Name() ) ) );\t// Shouldn't be multiply adding to the set.\n\t#else\n\tassert( !Find( addMe->Name() ) );\t// Shouldn't be multiply adding to the set.\n\t#endif\n\n\taddMe->next = &sentinel;\n\taddMe->prev = sentinel.prev;\n\n\tsentinel.prev->next = addMe;\n\tsentinel.prev      = addMe;\n}\n\nvoid TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe )\n{\n\tTiXmlAttribute* node;\n\n\tfor( node = sentinel.next; node != &sentinel; node = node->next )\n\t{\n\t\tif ( node == removeMe )\n\t\t{\n\t\t\tnode->prev->next = node->next;\n\t\t\tnode->next->prev = node->prev;\n\t\t\tnode->next = 0;\n\t\t\tnode->prev = 0;\n\t\t\treturn;\n\t\t}\n\t}\n\tassert( 0 );\t\t// we tried to remove a non-linked attribute.\n}\n\n\n#ifdef TIXML_USE_STL\nTiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const\n{\n\tfor( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next )\n\t{\n\t\tif ( node->name == name )\n\t\t\treturn node;\n\t}\n\treturn 0;\n}\n\nTiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const std::string& _name )\n{\n\tTiXmlAttribute* attrib = Find( _name );\n\tif ( !attrib ) {\n\t\tattrib = new TiXmlAttribute();\n\t\tAdd( attrib );\n\t\tattrib->SetName( _name );\n\t}\n\treturn attrib;\n}\n#endif\n\n\nTiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const\n{\n\tfor( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next )\n\t{\n\t\tif ( strcmp( node->name.c_str(), name ) == 0 )\n\t\t\treturn node;\n\t}\n\treturn 0;\n}\n\n\nTiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const char* _name )\n{\n\tTiXmlAttribute* attrib = Find( _name );\n\tif ( !attrib ) {\n\t\tattrib = new TiXmlAttribute();\n\t\tAdd( attrib );\n\t\tattrib->SetName( _name );\n\t}\n\treturn attrib;\n}\n\n\n#ifdef TIXML_USE_STL\t\nstd::istream& operator>> (std::istream & in, TiXmlNode & base)\n{\n\tTIXML_STRING tag;\n\ttag.reserve( 8 * 1000 );\n\tbase.StreamIn( &in, &tag );\n\n\tbase.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING );\n\treturn in;\n}\n#endif\n\n\n#ifdef TIXML_USE_STL\t\nstd::ostream& operator<< (std::ostream & out, const TiXmlNode & base)\n{\n\tTiXmlPrinter printer;\n\tprinter.SetStreamPrinting();\n\tbase.Accept( &printer );\n\tout << printer.Str();\n\n\treturn out;\n}\n\n\nstd::string& operator<< (std::string& out, const TiXmlNode& base )\n{\n\tTiXmlPrinter printer;\n\tprinter.SetStreamPrinting();\n\tbase.Accept( &printer );\n\tout.append( printer.Str() );\n\n\treturn out;\n}\n#endif\n\n\nTiXmlHandle TiXmlHandle::FirstChild() const\n{\n\tif ( node )\n\t{\n\t\tTiXmlNode* child = node->FirstChild();\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nTiXmlHandle TiXmlHandle::FirstChild( const char * value ) const\n{\n\tif ( node )\n\t{\n\t\tTiXmlNode* child = node->FirstChild( value );\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nTiXmlHandle TiXmlHandle::FirstChildElement() const\n{\n\tif ( node )\n\t{\n\t\tTiXmlElement* child = node->FirstChildElement();\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nTiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const\n{\n\tif ( node )\n\t{\n\t\tTiXmlElement* child = node->FirstChildElement( value );\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nTiXmlHandle TiXmlHandle::Child( int count ) const\n{\n\tif ( node )\n\t{\n\t\tint i;\n\t\tTiXmlNode* child = node->FirstChild();\n\t\tfor (\ti=0;\n\t\t\t\tchild && i<count;\n\t\t\t\tchild = child->NextSibling(), ++i )\n\t\t{\n\t\t\t// nothing\n\t\t}\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nTiXmlHandle TiXmlHandle::Child( const char* value, int count ) const\n{\n\tif ( node )\n\t{\n\t\tint i;\n\t\tTiXmlNode* child = node->FirstChild( value );\n\t\tfor (\ti=0;\n\t\t\t\tchild && i<count;\n\t\t\t\tchild = child->NextSibling( value ), ++i )\n\t\t{\n\t\t\t// nothing\n\t\t}\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nTiXmlHandle TiXmlHandle::ChildElement( int count ) const\n{\n\tif ( node )\n\t{\n\t\tint i;\n\t\tTiXmlElement* child = node->FirstChildElement();\n\t\tfor (\ti=0;\n\t\t\t\tchild && i<count;\n\t\t\t\tchild = child->NextSiblingElement(), ++i )\n\t\t{\n\t\t\t// nothing\n\t\t}\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nTiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const\n{\n\tif ( node )\n\t{\n\t\tint i;\n\t\tTiXmlElement* child = node->FirstChildElement( value );\n\t\tfor (\ti=0;\n\t\t\t\tchild && i<count;\n\t\t\t\tchild = child->NextSiblingElement( value ), ++i )\n\t\t{\n\t\t\t// nothing\n\t\t}\n\t\tif ( child )\n\t\t\treturn TiXmlHandle( child );\n\t}\n\treturn TiXmlHandle( 0 );\n}\n\n\nbool TiXmlPrinter::VisitEnter( const TiXmlDocument& )\n{\n\treturn true;\n}\n\nbool TiXmlPrinter::VisitExit( const TiXmlDocument& )\n{\n\treturn true;\n}\n\nbool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute )\n{\n\tDoIndent();\n\tbuffer += \"<\";\n\tbuffer += element.Value();\n\n\tfor( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() )\n\t{\n\t\tbuffer += \" \";\n\t\tattrib->Print( 0, 0, &buffer );\n\t}\n\n\tif ( !element.FirstChild() ) \n\t{\n\t\tbuffer += \" />\";\n\t\tDoLineBreak();\n\t}\n\telse \n\t{\n\t\tbuffer += \">\";\n\t\tif (    element.FirstChild()->ToText()\n\t\t\t  && element.LastChild() == element.FirstChild()\n\t\t\t  && element.FirstChild()->ToText()->CDATA() == false )\n\t\t{\n\t\t\tsimpleTextPrint = true;\n\t\t\t// no DoLineBreak()!\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDoLineBreak();\n\t\t}\n\t}\n\t++depth;\t\n\treturn true;\n}\n\n\nbool TiXmlPrinter::VisitExit( const TiXmlElement& element )\n{\n\t--depth;\n\tif ( !element.FirstChild() ) \n\t{\n\t\t// nothing.\n\t}\n\telse \n\t{\n\t\tif ( simpleTextPrint )\n\t\t{\n\t\t\tsimpleTextPrint = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDoIndent();\n\t\t}\n\t\tbuffer += \"</\";\n\t\tbuffer += element.Value();\n\t\tbuffer += \">\";\n\t\tDoLineBreak();\n\t}\n\treturn true;\n}\n\n\nbool TiXmlPrinter::Visit( const TiXmlText& text )\n{\n\tif ( text.CDATA() )\n\t{\n\t\tDoIndent();\n\t\tbuffer += \"<![CDATA[\";\n\t\tbuffer += text.Value();\n\t\tbuffer += \"]]>\";\n\t\tDoLineBreak();\n\t}\n\telse if ( simpleTextPrint )\n\t{\n\t\tTIXML_STRING str;\n\t\tTiXmlBase::EncodeString( text.ValueTStr(), &str );\n\t\tbuffer += str;\n\t}\n\telse\n\t{\n\t\tDoIndent();\n\t\tTIXML_STRING str;\n\t\tTiXmlBase::EncodeString( text.ValueTStr(), &str );\n\t\tbuffer += str;\n\t\tDoLineBreak();\n\t}\n\treturn true;\n}\n\n\nbool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration )\n{\n\tDoIndent();\n\tdeclaration.Print( 0, 0, &buffer );\n\tDoLineBreak();\n\treturn true;\n}\n\n\nbool TiXmlPrinter::Visit( const TiXmlComment& comment )\n{\n\tDoIndent();\n\tbuffer += \"<!--\";\n\tbuffer += comment.Value();\n\tbuffer += \"-->\";\n\tDoLineBreak();\n\treturn true;\n}\n\n\nbool TiXmlPrinter::Visit( const TiXmlUnknown& unknown )\n{\n\tDoIndent();\n\tbuffer += \"<\";\n\tbuffer += unknown.Value();\n\tbuffer += \">\";\n\tDoLineBreak();\n\treturn true;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinyxml/tinyxml.h",
    "content": "/*\nwww.sourceforge.net/projects/tinyxml\nOriginal code by Lee Thomason (www.grinninglizard.com)\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any\ndamages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any\npurpose, including commercial applications, and to alter it and\nredistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must\nnot claim that you wrote the original software. If you use this\nsoftware in a product, an acknowledgment in the product documentation\nwould be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and\nmust not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n*/\n\n\n#ifndef TINYXML_INCLUDED\n#define TINYXML_INCLUDED\n\n#ifdef _MSC_VER\n#pragma warning( push )\n#pragma warning( disable : 4530 )\n#pragma warning( disable : 4786 )\n#endif\n\n#include <ctype.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n\n// Help out windows:\n#if defined( _DEBUG ) && !defined( DEBUG )\n#define DEBUG\n#endif\n\n#ifdef TIXML_USE_STL\n\t#include <string>\n \t#include <iostream>\n\t#include <sstream>\n\t#define TIXML_STRING\t\tstd::string\n#else\n\t#include \"tinystr.h\"\n\t#define TIXML_STRING\t\tTiXmlString\n#endif\n\n// Deprecated library function hell. Compilers want to use the\n// new safe versions. This probably doesn't fully address the problem,\n// but it gets closer. There are too many compilers for me to fully\n// test. If you get compilation troubles, undefine TIXML_SAFE\n#define TIXML_SAFE\n\n#ifdef TIXML_SAFE\n\t#if defined(_MSC_VER) && (_MSC_VER >= 1400 )\n\t\t// Microsoft visual studio, version 2005 and higher.\n\t\t#define TIXML_SNPRINTF _snprintf_s\n\t\t#define TIXML_SSCANF   sscanf_s\n\t#elif defined(_MSC_VER) && (_MSC_VER >= 1200 )\n\t\t// Microsoft visual studio, version 6 and higher.\n\t\t//#pragma message( \"Using _sn* functions.\" )\n\t\t#define TIXML_SNPRINTF _snprintf\n\t\t#define TIXML_SSCANF   sscanf\n\t#elif defined(__GNUC__) && (__GNUC__ >= 3 )\n\t\t// GCC version 3 and higher.s\n\t\t//#warning( \"Using sn* functions.\" )\n\t\t#define TIXML_SNPRINTF snprintf\n\t\t#define TIXML_SSCANF   sscanf\n\t#else\n\t\t#define TIXML_SNPRINTF snprintf\n\t\t#define TIXML_SSCANF   sscanf\n\t#endif\n#endif\t\n\nclass TiXmlDocument;\nclass TiXmlElement;\nclass TiXmlComment;\nclass TiXmlUnknown;\nclass TiXmlAttribute;\nclass TiXmlText;\nclass TiXmlDeclaration;\nclass TiXmlParsingData;\n\nconst int TIXML_MAJOR_VERSION = 2;\nconst int TIXML_MINOR_VERSION = 6;\nconst int TIXML_PATCH_VERSION = 2;\n\n/*\tInternal structure for tracking location of items \n\tin the XML file.\n*/\nstruct TiXmlCursor\n{\n\tTiXmlCursor()\t\t{ Clear(); }\n\tvoid Clear()\t\t{ row = col = -1; }\n\n\tint row;\t// 0 based.\n\tint col;\t// 0 based.\n};\n\n\n/**\n\tImplements the interface to the \"Visitor pattern\" (see the Accept() method.)\n\tIf you call the Accept() method, it requires being passed a TiXmlVisitor\n\tclass to handle callbacks. For nodes that contain other nodes (Document, Element)\n\tyou will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves\n\tare simply called with Visit().\n\n\tIf you return 'true' from a Visit method, recursive parsing will continue. If you return\n\tfalse, <b>no children of this node or its sibilings</b> will be Visited.\n\n\tAll flavors of Visit methods have a default implementation that returns 'true' (continue \n\tvisiting). You need to only override methods that are interesting to you.\n\n\tGenerally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting.\n\n\tYou should never change the document from a callback.\n\n\t@sa TiXmlNode::Accept()\n*/\nclass TiXmlVisitor\n{\npublic:\n\tvirtual ~TiXmlVisitor() {}\n\n\t/// Visit a document.\n\tvirtual bool VisitEnter( const TiXmlDocument& /*doc*/ )\t\t\t{ return true; }\n\t/// Visit a document.\n\tvirtual bool VisitExit( const TiXmlDocument& /*doc*/ )\t\t\t{ return true; }\n\n\t/// Visit an element.\n\tvirtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ )\t{ return true; }\n\t/// Visit an element.\n\tvirtual bool VisitExit( const TiXmlElement& /*element*/ )\t\t{ return true; }\n\n\t/// Visit a declaration\n\tvirtual bool Visit( const TiXmlDeclaration& /*declaration*/ )\t{ return true; }\n\t/// Visit a text node\n\tvirtual bool Visit( const TiXmlText& /*text*/ )\t\t\t\t\t{ return true; }\n\t/// Visit a comment node\n\tvirtual bool Visit( const TiXmlComment& /*comment*/ )\t\t\t{ return true; }\n\t/// Visit an unknown node\n\tvirtual bool Visit( const TiXmlUnknown& /*unknown*/ )\t\t\t{ return true; }\n};\n\n// Only used by Attribute::Query functions\nenum \n{ \n\tTIXML_SUCCESS,\n\tTIXML_NO_ATTRIBUTE,\n\tTIXML_WRONG_TYPE\n};\n\n\n// Used by the parsing routines.\nenum TiXmlEncoding\n{\n\tTIXML_ENCODING_UNKNOWN,\n\tTIXML_ENCODING_UTF8,\n\tTIXML_ENCODING_LEGACY\n};\n\nconst TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;\n\n/** TiXmlBase is a base class for every class in TinyXml.\n\tIt does little except to establish that TinyXml classes\n\tcan be printed and provide some utility functions.\n\n\tIn XML, the document and elements can contain\n\tother elements and other types of nodes.\n\n\t@verbatim\n\tA Document can contain:\tElement\t(container or leaf)\n\t\t\t\t\t\t\tComment (leaf)\n\t\t\t\t\t\t\tUnknown (leaf)\n\t\t\t\t\t\t\tDeclaration( leaf )\n\n\tAn Element can contain:\tElement (container or leaf)\n\t\t\t\t\t\t\tText\t(leaf)\n\t\t\t\t\t\t\tAttributes (not on tree)\n\t\t\t\t\t\t\tComment (leaf)\n\t\t\t\t\t\t\tUnknown (leaf)\n\n\tA Decleration contains: Attributes (not on tree)\n\t@endverbatim\n*/\nclass TiXmlBase\n{\n\tfriend class TiXmlNode;\n\tfriend class TiXmlElement;\n\tfriend class TiXmlDocument;\n\npublic:\n\tTiXmlBase()\t:\tuserData(0)\t\t{}\n\tvirtual ~TiXmlBase()\t\t\t{}\n\n\t/**\tAll TinyXml classes can print themselves to a filestream\n\t\tor the string class (TiXmlString in non-STL mode, std::string\n\t\tin STL mode.) Either or both cfile and str can be null.\n\t\t\n\t\tThis is a formatted print, and will insert \n\t\ttabs and newlines.\n\t\t\n\t\t(For an unformatted stream, use the << operator.)\n\t*/\n\tvirtual void Print( FILE* cfile, int depth ) const = 0;\n\n\t/**\tThe world does not agree on whether white space should be kept or\n\t\tnot. In order to make everyone happy, these global, static functions\n\t\tare provided to set whether or not TinyXml will condense all white space\n\t\tinto a single space or not. The default is to condense. Note changing this\n\t\tvalue is not thread safe.\n\t*/\n\tstatic void SetCondenseWhiteSpace( bool condense )\t\t{ condenseWhiteSpace = condense; }\n\n\t/// Return the current white space setting.\n\tstatic bool IsWhiteSpaceCondensed()\t\t\t\t\t\t{ return condenseWhiteSpace; }\n\n\t/** Return the position, in the original source file, of this node or attribute.\n\t\tThe row and column are 1-based. (That is the first row and first column is\n\t\t1,1). If the returns values are 0 or less, then the parser does not have\n\t\ta row and column value.\n\n\t\tGenerally, the row and column value will be set when the TiXmlDocument::Load(),\n\t\tTiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set\n\t\twhen the DOM was created from operator>>.\n\n\t\tThe values reflect the initial load. Once the DOM is modified programmatically\n\t\t(by adding or changing nodes and attributes) the new values will NOT update to\n\t\treflect changes in the document.\n\n\t\tThere is a minor performance cost to computing the row and column. Computation\n\t\tcan be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value.\n\n\t\t@sa TiXmlDocument::SetTabSize()\n\t*/\n\tint Row() const\t\t\t{ return location.row + 1; }\n\tint Column() const\t\t{ return location.col + 1; }\t///< See Row()\n\n\tvoid  SetUserData( void* user )\t\t\t{ userData = user; }\t///< Set a pointer to arbitrary user data.\n\tvoid* GetUserData()\t\t\t\t\t\t{ return userData; }\t///< Get a pointer to arbitrary user data.\n\tconst void* GetUserData() const \t\t{ return userData; }\t///< Get a pointer to arbitrary user data.\n\n\t// Table that returs, for a given lead byte, the total number of bytes\n\t// in the UTF-8 sequence.\n\tstatic const int utf8ByteTable[256];\n\n\tvirtual const char* Parse(\tconst char* p, \n\t\t\t\t\t\t\t\tTiXmlParsingData* data, \n\t\t\t\t\t\t\t\tTiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0;\n\n\t/** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, \n\t\tor they will be transformed into entities!\n\t*/\n\tstatic void EncodeString( const TIXML_STRING& str, TIXML_STRING* out );\n\n\tenum\n\t{\n\t\tTIXML_NO_ERROR = 0,\n\t\tTIXML_ERROR,\n\t\tTIXML_ERROR_OPENING_FILE,\n\t\tTIXML_ERROR_PARSING_ELEMENT,\n\t\tTIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,\n\t\tTIXML_ERROR_READING_ELEMENT_VALUE,\n\t\tTIXML_ERROR_READING_ATTRIBUTES,\n\t\tTIXML_ERROR_PARSING_EMPTY,\n\t\tTIXML_ERROR_READING_END_TAG,\n\t\tTIXML_ERROR_PARSING_UNKNOWN,\n\t\tTIXML_ERROR_PARSING_COMMENT,\n\t\tTIXML_ERROR_PARSING_DECLARATION,\n\t\tTIXML_ERROR_DOCUMENT_EMPTY,\n\t\tTIXML_ERROR_EMBEDDED_NULL,\n\t\tTIXML_ERROR_PARSING_CDATA,\n\t\tTIXML_ERROR_DOCUMENT_TOP_ONLY,\n\n\t\tTIXML_ERROR_STRING_COUNT\n\t};\n\nprotected:\n\n\tstatic const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding );\n\n\tinline static bool IsWhiteSpace( char c )\t\t\n\t{ \n\t\treturn ( isspace( (unsigned char) c ) || c == '\\n' || c == '\\r' ); \n\t}\n\tinline static bool IsWhiteSpace( int c )\n\t{\n\t\tif ( c < 256 )\n\t\t\treturn IsWhiteSpace( (char) c );\n\t\treturn false;\t// Again, only truly correct for English/Latin...but usually works.\n\t}\n\n\t#ifdef TIXML_USE_STL\n\tstatic bool\tStreamWhiteSpace( std::istream * in, TIXML_STRING * tag );\n\tstatic bool StreamTo( std::istream * in, int character, TIXML_STRING * tag );\n\t#endif\n\n\t/*\tReads an XML name into the string provided. Returns\n\t\ta pointer just past the last character of the name,\n\t\tor 0 if the function has an error.\n\t*/\n\tstatic const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding );\n\n\t/*\tReads text. Returns a pointer past the given end tag.\n\t\tWickedly complex options, but it keeps the (sensitive) code in one place.\n\t*/\n\tstatic const char* ReadText(\tconst char* in,\t\t\t\t// where to start\n\t\t\t\t\t\t\t\t\tTIXML_STRING* text,\t\t\t// the string read\n\t\t\t\t\t\t\t\t\tbool ignoreWhiteSpace,\t\t// whether to keep the white space\n\t\t\t\t\t\t\t\t\tconst char* endTag,\t\t\t// what ends this text\n\t\t\t\t\t\t\t\t\tbool ignoreCase,\t\t\t// whether to ignore case in the end tag\n\t\t\t\t\t\t\t\t\tTiXmlEncoding encoding );\t// the current encoding\n\n\t// If an entity has been found, transform it into a character.\n\tstatic const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding );\n\n\t// Get a character, while interpreting entities.\n\t// The length can be from 0 to 4 bytes.\n\tinline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding )\n\t{\n\t\tassert( p );\n\t\tif ( encoding == TIXML_ENCODING_UTF8 )\n\t\t{\n\t\t\t*length = utf8ByteTable[ *((const unsigned char*)p) ];\n\t\t\tassert( *length >= 0 && *length < 5 );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*length = 1;\n\t\t}\n\n\t\tif ( *length == 1 )\n\t\t{\n\t\t\tif ( *p == '&' )\n\t\t\t\treturn GetEntity( p, _value, length, encoding );\n\t\t\t*_value = *p;\n\t\t\treturn p+1;\n\t\t}\n\t\telse if ( *length )\n\t\t{\n\t\t\t//strncpy( _value, p, *length );\t// lots of compilers don't like this function (unsafe),\n\t\t\t\t\t\t\t\t\t\t\t\t// and the null terminator isn't needed\n\t\t\tfor( int i=0; p[i] && i<*length; ++i ) {\n\t\t\t\t_value[i] = p[i];\n\t\t\t}\n\t\t\treturn p + (*length);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Not valid text.\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t// Return true if the next characters in the stream are any of the endTag sequences.\n\t// Ignore case only works for english, and should only be relied on when comparing\n\t// to English words: StringEqual( p, \"version\", true ) is fine.\n\tstatic bool StringEqual(\tconst char* p,\n\t\t\t\t\t\t\t\tconst char* endTag,\n\t\t\t\t\t\t\t\tbool ignoreCase,\n\t\t\t\t\t\t\t\tTiXmlEncoding encoding );\n\n\tstatic const char* errorString[ TIXML_ERROR_STRING_COUNT ];\n\n\tTiXmlCursor location;\n\n    /// Field containing a generic user pointer\n\tvoid*\t\t\tuserData;\n\t\n\t// None of these methods are reliable for any language except English.\n\t// Good for approximation, not great for accuracy.\n\tstatic int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding );\n\tstatic int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding );\n\tinline static int ToLower( int v, TiXmlEncoding encoding )\n\t{\n\t\tif ( encoding == TIXML_ENCODING_UTF8 )\n\t\t{\n\t\t\tif ( v < 128 ) return tolower( v );\n\t\t\treturn v;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn tolower( v );\n\t\t}\n\t}\n\tstatic void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );\n\nprivate:\n\tTiXmlBase( const TiXmlBase& );\t\t\t\t// not implemented.\n\tvoid operator=( const TiXmlBase& base );\t// not allowed.\n\n\tstruct Entity\n\t{\n\t\tconst char*     str;\n\t\tunsigned int\tstrLength;\n\t\tchar\t\t    chr;\n\t};\n\tenum\n\t{\n\t\tNUM_ENTITY = 5,\n\t\tMAX_ENTITY_LENGTH = 6\n\n\t};\n\tstatic Entity entity[ NUM_ENTITY ];\n\tstatic bool condenseWhiteSpace;\n};\n\n\n/** The parent class for everything in the Document Object Model.\n\t(Except for attributes).\n\tNodes have siblings, a parent, and children. A node can be\n\tin a document, or stand on its own. The type of a TiXmlNode\n\tcan be queried, and it can be cast to its more defined type.\n*/\nclass TiXmlNode : public TiXmlBase\n{\n\tfriend class TiXmlDocument;\n\tfriend class TiXmlElement;\n\npublic:\n\t#ifdef TIXML_USE_STL\t\n\n\t    /** An input stream operator, for every class. Tolerant of newlines and\n\t\t    formatting, but doesn't expect them.\n\t    */\n\t    friend std::istream& operator >> (std::istream& in, TiXmlNode& base);\n\n\t    /** An output stream operator, for every class. Note that this outputs\n\t\t    without any newlines or formatting, as opposed to Print(), which\n\t\t    includes tabs and new lines.\n\n\t\t    The operator<< and operator>> are not completely symmetric. Writing\n\t\t    a node to a stream is very well defined. You'll get a nice stream\n\t\t    of output, without any extra whitespace or newlines.\n\t\t    \n\t\t    But reading is not as well defined. (As it always is.) If you create\n\t\t    a TiXmlElement (for example) and read that from an input stream,\n\t\t    the text needs to define an element or junk will result. This is\n\t\t    true of all input streams, but it's worth keeping in mind.\n\n\t\t    A TiXmlDocument will read nodes until it reads a root element, and\n\t\t\tall the children of that root element.\n\t    */\t\n\t    friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base);\n\n\t\t/// Appends the XML node or attribute to a std::string.\n\t\tfriend std::string& operator<< (std::string& out, const TiXmlNode& base );\n\n\t#endif\n\n\t/** The types of XML nodes supported by TinyXml. (All the\n\t\t\tunsupported types are picked up by UNKNOWN.)\n\t*/\n\tenum NodeType\n\t{\n\t\tTINYXML_DOCUMENT,\n\t\tTINYXML_ELEMENT,\n\t\tTINYXML_COMMENT,\n\t\tTINYXML_UNKNOWN,\n\t\tTINYXML_TEXT,\n\t\tTINYXML_DECLARATION,\n\t\tTINYXML_TYPECOUNT\n\t};\n\n\tvirtual ~TiXmlNode();\n\n\t/** The meaning of 'value' changes for the specific type of\n\t\tTiXmlNode.\n\t\t@verbatim\n\t\tDocument:\tfilename of the xml file\n\t\tElement:\tname of the element\n\t\tComment:\tthe comment text\n\t\tUnknown:\tthe tag contents\n\t\tText:\t\tthe text string\n\t\t@endverbatim\n\n\t\tThe subclasses will wrap this function.\n\t*/\n\tconst char *Value() const { return value.c_str (); }\n\n    #ifdef TIXML_USE_STL\n\t/** Return Value() as a std::string. If you only use STL,\n\t    this is more efficient than calling Value().\n\t\tOnly available in STL mode.\n\t*/\n\tconst std::string& ValueStr() const { return value; }\n\t#endif\n\n\tconst TIXML_STRING& ValueTStr() const { return value; }\n\n\t/** Changes the value of the node. Defined as:\n\t\t@verbatim\n\t\tDocument:\tfilename of the xml file\n\t\tElement:\tname of the element\n\t\tComment:\tthe comment text\n\t\tUnknown:\tthe tag contents\n\t\tText:\t\tthe text string\n\t\t@endverbatim\n\t*/\n\tvoid SetValue(const char * _value) { value = _value;}\n\n    #ifdef TIXML_USE_STL\n\t/// STL std::string form.\n\tvoid SetValue( const std::string& _value )\t{ value = _value; }\n\t#endif\n\n\t/// Delete all the children of this node. Does not affect 'this'.\n\tvoid Clear();\n\n\t/// One step up the DOM.\n\tTiXmlNode* Parent()\t\t\t\t\t\t\t{ return parent; }\n\tconst TiXmlNode* Parent() const\t\t\t\t{ return parent; }\n\n\tconst TiXmlNode* FirstChild()\tconst\t\t{ return firstChild; }\t///< The first child of this node. Will be null if there are no children.\n\tTiXmlNode* FirstChild()\t\t\t\t\t\t{ return firstChild; }\n\tconst TiXmlNode* FirstChild( const char * value ) const;\t\t\t///< The first child of this node with the matching 'value'. Will be null if none found.\n\t/// The first child of this node with the matching 'value'. Will be null if none found.\n\tTiXmlNode* FirstChild( const char * _value ) {\n\t\t// Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe)\n\t\t// call the method, cast the return back to non-const.\n\t\treturn const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value ));\n\t}\n\tconst TiXmlNode* LastChild() const\t{ return lastChild; }\t\t/// The last child of this node. Will be null if there are no children.\n\tTiXmlNode* LastChild()\t{ return lastChild; }\n\t\n\tconst TiXmlNode* LastChild( const char * value ) const;\t\t\t/// The last child of this node matching 'value'. Will be null if there are no children.\n\tTiXmlNode* LastChild( const char * _value ) {\n\t\treturn const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value ));\n\t}\n\n    #ifdef TIXML_USE_STL\n\tconst TiXmlNode* FirstChild( const std::string& _value ) const\t{\treturn FirstChild (_value.c_str ());\t}\t///< STL std::string form.\n\tTiXmlNode* FirstChild( const std::string& _value )\t\t\t\t{\treturn FirstChild (_value.c_str ());\t}\t///< STL std::string form.\n\tconst TiXmlNode* LastChild( const std::string& _value ) const\t{\treturn LastChild (_value.c_str ());\t}\t///< STL std::string form.\n\tTiXmlNode* LastChild( const std::string& _value )\t\t\t\t{\treturn LastChild (_value.c_str ());\t}\t///< STL std::string form.\n\t#endif\n\n\t/** An alternate way to walk the children of a node.\n\t\tOne way to iterate over nodes is:\n\t\t@verbatim\n\t\t\tfor( child = parent->FirstChild(); child; child = child->NextSibling() )\n\t\t@endverbatim\n\n\t\tIterateChildren does the same thing with the syntax:\n\t\t@verbatim\n\t\t\tchild = 0;\n\t\t\twhile( child = parent->IterateChildren( child ) )\n\t\t@endverbatim\n\n\t\tIterateChildren takes the previous child as input and finds\n\t\tthe next one. If the previous child is null, it returns the\n\t\tfirst. IterateChildren will return null when done.\n\t*/\n\tconst TiXmlNode* IterateChildren( const TiXmlNode* previous ) const;\n\tTiXmlNode* IterateChildren( const TiXmlNode* previous ) {\n\t\treturn const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) );\n\t}\n\n\t/// This flavor of IterateChildren searches for children with a particular 'value'\n\tconst TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const;\n\tTiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) {\n\t\treturn const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) );\n\t}\n\n    #ifdef TIXML_USE_STL\n\tconst TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const\t{\treturn IterateChildren (_value.c_str (), previous);\t}\t///< STL std::string form.\n\tTiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) {\treturn IterateChildren (_value.c_str (), previous);\t}\t///< STL std::string form.\n\t#endif\n\n\t/** Add a new node related to this. Adds a child past the LastChild.\n\t\tReturns a pointer to the new object or NULL if an error occured.\n\t*/\n\tTiXmlNode* InsertEndChild( const TiXmlNode& addThis );\n\n\n\t/** Add a new node related to this. Adds a child past the LastChild.\n\n\t\tNOTE: the node to be added is passed by pointer, and will be\n\t\thenceforth owned (and deleted) by tinyXml. This method is efficient\n\t\tand avoids an extra copy, but should be used with care as it\n\t\tuses a different memory model than the other insert functions.\n\n\t\t@sa InsertEndChild\n\t*/\n\tTiXmlNode* LinkEndChild( TiXmlNode* addThis );\n\n\t/** Add a new node related to this. Adds a child before the specified child.\n\t\tReturns a pointer to the new object or NULL if an error occured.\n\t*/\n\tTiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );\n\n\t/** Add a new node related to this. Adds a child after the specified child.\n\t\tReturns a pointer to the new object or NULL if an error occured.\n\t*/\n\tTiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );\n\n\t/** Replace a child of this node.\n\t\tReturns a pointer to the new object or NULL if an error occured.\n\t*/\n\tTiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );\n\n\t/// Delete a child of this node.\n\tbool RemoveChild( TiXmlNode* removeThis );\n\n\t/// Navigate to a sibling node.\n\tconst TiXmlNode* PreviousSibling() const\t\t\t{ return prev; }\n\tTiXmlNode* PreviousSibling()\t\t\t\t\t\t{ return prev; }\n\n\t/// Navigate to a sibling node.\n\tconst TiXmlNode* PreviousSibling( const char * ) const;\n\tTiXmlNode* PreviousSibling( const char *_prev ) {\n\t\treturn const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) );\n\t}\n\n    #ifdef TIXML_USE_STL\n\tconst TiXmlNode* PreviousSibling( const std::string& _value ) const\t{\treturn PreviousSibling (_value.c_str ());\t}\t///< STL std::string form.\n\tTiXmlNode* PreviousSibling( const std::string& _value ) \t\t\t{\treturn PreviousSibling (_value.c_str ());\t}\t///< STL std::string form.\n\tconst TiXmlNode* NextSibling( const std::string& _value) const\t\t{\treturn NextSibling (_value.c_str ());\t}\t///< STL std::string form.\n\tTiXmlNode* NextSibling( const std::string& _value) \t\t\t\t\t{\treturn NextSibling (_value.c_str ());\t}\t///< STL std::string form.\n\t#endif\n\n\t/// Navigate to a sibling node.\n\tconst TiXmlNode* NextSibling() const\t\t\t\t{ return next; }\n\tTiXmlNode* NextSibling()\t\t\t\t\t\t\t{ return next; }\n\n\t/// Navigate to a sibling node with the given 'value'.\n\tconst TiXmlNode* NextSibling( const char * ) const;\n\tTiXmlNode* NextSibling( const char* _next ) {\n\t\treturn const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) );\n\t}\n\n\t/** Convenience function to get through elements.\n\t\tCalls NextSibling and ToElement. Will skip all non-Element\n\t\tnodes. Returns 0 if there is not another element.\n\t*/\n\tconst TiXmlElement* NextSiblingElement() const;\n\tTiXmlElement* NextSiblingElement() {\n\t\treturn const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() );\n\t}\n\n\t/** Convenience function to get through elements.\n\t\tCalls NextSibling and ToElement. Will skip all non-Element\n\t\tnodes. Returns 0 if there is not another element.\n\t*/\n\tconst TiXmlElement* NextSiblingElement( const char * ) const;\n\tTiXmlElement* NextSiblingElement( const char *_next ) {\n\t\treturn const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) );\n\t}\n\n    #ifdef TIXML_USE_STL\n\tconst TiXmlElement* NextSiblingElement( const std::string& _value) const\t{\treturn NextSiblingElement (_value.c_str ());\t}\t///< STL std::string form.\n\tTiXmlElement* NextSiblingElement( const std::string& _value)\t\t\t\t{\treturn NextSiblingElement (_value.c_str ());\t}\t///< STL std::string form.\n\t#endif\n\n\t/// Convenience function to get through elements.\n\tconst TiXmlElement* FirstChildElement()\tconst;\n\tTiXmlElement* FirstChildElement() {\n\t\treturn const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() );\n\t}\n\n\t/// Convenience function to get through elements.\n\tconst TiXmlElement* FirstChildElement( const char * _value ) const;\n\tTiXmlElement* FirstChildElement( const char * _value ) {\n\t\treturn const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) );\n\t}\n\n    #ifdef TIXML_USE_STL\n\tconst TiXmlElement* FirstChildElement( const std::string& _value ) const\t{\treturn FirstChildElement (_value.c_str ());\t}\t///< STL std::string form.\n\tTiXmlElement* FirstChildElement( const std::string& _value )\t\t\t\t{\treturn FirstChildElement (_value.c_str ());\t}\t///< STL std::string form.\n\t#endif\n\n\t/** Query the type (as an enumerated value, above) of this node.\n\t\tThe possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT,\n\t\t\t\t\t\t\t\tTINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION.\n\t*/\n\tint Type() const\t{ return type; }\n\n\t/** Return a pointer to the Document this node lives in.\n\t\tReturns null if not in a document.\n\t*/\n\tconst TiXmlDocument* GetDocument() const;\n\tTiXmlDocument* GetDocument() {\n\t\treturn const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() );\n\t}\n\n\t/// Returns true if this node has no children.\n\tbool NoChildren() const\t\t\t\t\t\t{ return !firstChild; }\n\n\tvirtual const TiXmlDocument*    ToDocument()    const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual const TiXmlElement*     ToElement()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual const TiXmlComment*     ToComment()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual const TiXmlUnknown*     ToUnknown()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual const TiXmlText*        ToText()        const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\n\tvirtual TiXmlDocument*          ToDocument()    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual TiXmlElement*           ToElement()\t    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual TiXmlComment*           ToComment()     { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual TiXmlUnknown*           ToUnknown()\t    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual TiXmlText*\t            ToText()        { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\tvirtual TiXmlDeclaration*       ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.\n\n\t/** Create an exact duplicate of this node and return it. The memory must be deleted\n\t\tby the caller. \n\t*/\n\tvirtual TiXmlNode* Clone() const = 0;\n\n\t/** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the \n\t\tXML tree will be conditionally visited and the host will be called back\n\t\tvia the TiXmlVisitor interface.\n\n\t\tThis is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse\n\t\tthe XML for the callbacks, so the performance of TinyXML is unchanged by using this\n\t\tinterface versus any other.)\n\n\t\tThe interface has been based on ideas from:\n\n\t\t- http://www.saxproject.org/\n\t\t- http://c2.com/cgi/wiki?HierarchicalVisitorPattern \n\n\t\tWhich are both good references for \"visiting\".\n\n\t\tAn example of using Accept():\n\t\t@verbatim\n\t\tTiXmlPrinter printer;\n\t\ttinyxmlDoc.Accept( &printer );\n\t\tconst char* xmlcstr = printer.CStr();\n\t\t@endverbatim\n\t*/\n\tvirtual bool Accept( TiXmlVisitor* visitor ) const = 0;\n\nprotected:\n\tTiXmlNode( NodeType _type );\n\n\t// Copy to the allocated object. Shared functionality between Clone, Copy constructor,\n\t// and the assignment operator.\n\tvoid CopyTo( TiXmlNode* target ) const;\n\n\t#ifdef TIXML_USE_STL\n\t    // The real work of the input operator.\n\tvirtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0;\n\t#endif\n\n\t// Figure out what is at *p, and parse it. Returns null if it is not an xml node.\n\tTiXmlNode* Identify( const char* start, TiXmlEncoding encoding );\n\n\tTiXmlNode*\t\tparent;\n\tNodeType\t\ttype;\n\n\tTiXmlNode*\t\tfirstChild;\n\tTiXmlNode*\t\tlastChild;\n\n\tTIXML_STRING\tvalue;\n\n\tTiXmlNode*\t\tprev;\n\tTiXmlNode*\t\tnext;\n\nprivate:\n\tTiXmlNode( const TiXmlNode& );\t\t\t\t// not implemented.\n\tvoid operator=( const TiXmlNode& base );\t// not allowed.\n};\n\n\n/** An attribute is a name-value pair. Elements have an arbitrary\n\tnumber of attributes, each with a unique name.\n\n\t@note The attributes are not TiXmlNodes, since they are not\n\t\t  part of the tinyXML document object model. There are other\n\t\t  suggested ways to look at this problem.\n*/\nclass TiXmlAttribute : public TiXmlBase\n{\n\tfriend class TiXmlAttributeSet;\n\npublic:\n\t/// Construct an empty attribute.\n\tTiXmlAttribute() : TiXmlBase()\n\t{\n\t\tdocument = 0;\n\t\tprev = next = 0;\n\t}\n\n\t#ifdef TIXML_USE_STL\n\t/// std::string constructor.\n\tTiXmlAttribute( const std::string& _name, const std::string& _value )\n\t{\n\t\tname = _name;\n\t\tvalue = _value;\n\t\tdocument = 0;\n\t\tprev = next = 0;\n\t}\n\t#endif\n\n\t/// Construct an attribute with a name and value.\n\tTiXmlAttribute( const char * _name, const char * _value )\n\t{\n\t\tname = _name;\n\t\tvalue = _value;\n\t\tdocument = 0;\n\t\tprev = next = 0;\n\t}\n\n\tconst char*\t\tName()  const\t\t{ return name.c_str(); }\t\t///< Return the name of this attribute.\n\tconst char*\t\tValue() const\t\t{ return value.c_str(); }\t\t///< Return the value of this attribute.\n\t#ifdef TIXML_USE_STL\n\tconst std::string& ValueStr() const\t{ return value; }\t\t\t\t///< Return the value of this attribute.\n\t#endif\n\tint\t\t\t\tIntValue() const;\t\t\t\t\t\t\t\t\t///< Return the value of this attribute, converted to an integer.\n\tdouble\t\t\tDoubleValue() const;\t\t\t\t\t\t\t\t///< Return the value of this attribute, converted to a double.\n\n\t// Get the tinyxml string representation\n\tconst TIXML_STRING& NameTStr() const { return name; }\n\n\t/** QueryIntValue examines the value string. It is an alternative to the\n\t\tIntValue() method with richer error checking.\n\t\tIf the value is an integer, it is stored in 'value' and \n\t\tthe call returns TIXML_SUCCESS. If it is not\n\t\tan integer, it returns TIXML_WRONG_TYPE.\n\n\t\tA specialized but useful call. Note that for success it returns 0,\n\t\twhich is the opposite of almost all other TinyXml calls.\n\t*/\n\tint QueryIntValue( int* _value ) const;\n\t/// QueryDoubleValue examines the value string. See QueryIntValue().\n\tint QueryDoubleValue( double* _value ) const;\n\n\tvoid SetName( const char* _name )\t{ name = _name; }\t\t\t\t///< Set the name of this attribute.\n\tvoid SetValue( const char* _value )\t{ value = _value; }\t\t\t\t///< Set the value.\n\n\tvoid SetIntValue( int _value );\t\t\t\t\t\t\t\t\t\t///< Set the value from an integer.\n\tvoid SetDoubleValue( double _value );\t\t\t\t\t\t\t\t///< Set the value from a double.\n\n    #ifdef TIXML_USE_STL\n\t/// STL std::string form.\n\tvoid SetName( const std::string& _name )\t{ name = _name; }\t\n\t/// STL std::string form.\t\n\tvoid SetValue( const std::string& _value )\t{ value = _value; }\n\t#endif\n\n\t/// Get the next sibling attribute in the DOM. Returns null at end.\n\tconst TiXmlAttribute* Next() const;\n\tTiXmlAttribute* Next() {\n\t\treturn const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); \n\t}\n\n\t/// Get the previous sibling attribute in the DOM. Returns null at beginning.\n\tconst TiXmlAttribute* Previous() const;\n\tTiXmlAttribute* Previous() {\n\t\treturn const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); \n\t}\n\n\tbool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }\n\tbool operator<( const TiXmlAttribute& rhs )\t const { return name < rhs.name; }\n\tbool operator>( const TiXmlAttribute& rhs )  const { return name > rhs.name; }\n\n\t/*\tAttribute parsing starts: first letter of the name\n\t\t\t\t\t\t returns: the next char after the value end quote\n\t*/\n\tvirtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );\n\n\t// Prints this Attribute to a FILE stream.\n\tvirtual void Print( FILE* cfile, int depth ) const {\n\t\tPrint( cfile, depth, 0 );\n\t}\n\tvoid Print( FILE* cfile, int depth, TIXML_STRING* str ) const;\n\n\t// [internal use]\n\t// Set the document pointer so the attribute can report errors.\n\tvoid SetDocument( TiXmlDocument* doc )\t{ document = doc; }\n\nprivate:\n\tTiXmlAttribute( const TiXmlAttribute& );\t\t\t\t// not implemented.\n\tvoid operator=( const TiXmlAttribute& base );\t// not allowed.\n\n\tTiXmlDocument*\tdocument;\t// A pointer back to a document, for error reporting.\n\tTIXML_STRING name;\n\tTIXML_STRING value;\n\tTiXmlAttribute*\tprev;\n\tTiXmlAttribute*\tnext;\n};\n\n\n/*\tA class used to manage a group of attributes.\n\tIt is only used internally, both by the ELEMENT and the DECLARATION.\n\t\n\tThe set can be changed transparent to the Element and Declaration\n\tclasses that use it, but NOT transparent to the Attribute\n\twhich has to implement a next() and previous() method. Which makes\n\tit a bit problematic and prevents the use of STL.\n\n\tThis version is implemented with circular lists because:\n\t\t- I like circular lists\n\t\t- it demonstrates some independence from the (typical) doubly linked list.\n*/\nclass TiXmlAttributeSet\n{\npublic:\n\tTiXmlAttributeSet();\n\t~TiXmlAttributeSet();\n\n\tvoid Add( TiXmlAttribute* attribute );\n\tvoid Remove( TiXmlAttribute* attribute );\n\n\tconst TiXmlAttribute* First()\tconst\t{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }\n\tTiXmlAttribute* First()\t\t\t\t\t{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }\n\tconst TiXmlAttribute* Last() const\t\t{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }\n\tTiXmlAttribute* Last()\t\t\t\t\t{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }\n\n\tTiXmlAttribute*\tFind( const char* _name ) const;\n\tTiXmlAttribute* FindOrCreate( const char* _name );\n\n#\tifdef TIXML_USE_STL\n\tTiXmlAttribute*\tFind( const std::string& _name ) const;\n\tTiXmlAttribute* FindOrCreate( const std::string& _name );\n#\tendif\n\n\nprivate:\n\t//*ME:\tBecause of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element),\n\t//*ME:\tthis class must be also use a hidden/disabled copy-constructor !!!\n\tTiXmlAttributeSet( const TiXmlAttributeSet& );\t// not allowed\n\tvoid operator=( const TiXmlAttributeSet& );\t// not allowed (as TiXmlAttribute)\n\n\tTiXmlAttribute sentinel;\n};\n\n\n/** The element is a container class. It has a value, the element name,\n\tand can contain other elements, text, comments, and unknowns.\n\tElements also contain an arbitrary number of attributes.\n*/\nclass TiXmlElement : public TiXmlNode\n{\npublic:\n\t/// Construct an element.\n\tTiXmlElement (const char * in_value);\n\n\t#ifdef TIXML_USE_STL\n\t/// std::string constructor.\n\tTiXmlElement( const std::string& _value );\n\t#endif\n\n\tTiXmlElement( const TiXmlElement& );\n\n\tTiXmlElement& operator=( const TiXmlElement& base );\n\n\tvirtual ~TiXmlElement();\n\n\t/** Given an attribute name, Attribute() returns the value\n\t\tfor the attribute of that name, or null if none exists.\n\t*/\n\tconst char* Attribute( const char* name ) const;\n\n\t/** Given an attribute name, Attribute() returns the value\n\t\tfor the attribute of that name, or null if none exists.\n\t\tIf the attribute exists and can be converted to an integer,\n\t\tthe integer value will be put in the return 'i', if 'i'\n\t\tis non-null.\n\t*/\n\tconst char* Attribute( const char* name, int* i ) const;\n\n\t/** Given an attribute name, Attribute() returns the value\n\t\tfor the attribute of that name, or null if none exists.\n\t\tIf the attribute exists and can be converted to an double,\n\t\tthe double value will be put in the return 'd', if 'd'\n\t\tis non-null.\n\t*/\n\tconst char* Attribute( const char* name, double* d ) const;\n\n\t/** QueryIntAttribute examines the attribute - it is an alternative to the\n\t\tAttribute() method with richer error checking.\n\t\tIf the attribute is an integer, it is stored in 'value' and \n\t\tthe call returns TIXML_SUCCESS. If it is not\n\t\tan integer, it returns TIXML_WRONG_TYPE. If the attribute\n\t\tdoes not exist, then TIXML_NO_ATTRIBUTE is returned.\n\t*/\t\n\tint QueryIntAttribute( const char* name, int* _value ) const;\n\t/// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute().\n\tint QueryUnsignedAttribute( const char* name, unsigned* _value ) const;\n\t/** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). \n\t\tNote that '1', 'true', or 'yes' are considered true, while '0', 'false'\n\t\tand 'no' are considered false.\n\t*/\n\tint QueryBoolAttribute( const char* name, bool* _value ) const;\n\t/// QueryDoubleAttribute examines the attribute - see QueryIntAttribute().\n\tint QueryDoubleAttribute( const char* name, double* _value ) const;\n\t/// QueryFloatAttribute examines the attribute - see QueryIntAttribute().\n\tint QueryFloatAttribute( const char* name, float* _value ) const {\n\t\tdouble d;\n\t\tint result = QueryDoubleAttribute( name, &d );\n\t\tif ( result == TIXML_SUCCESS ) {\n\t\t\t*_value = (float)d;\n\t\t}\n\t\treturn result;\n\t}\n\n    #ifdef TIXML_USE_STL\n\t/// QueryStringAttribute examines the attribute - see QueryIntAttribute().\n\tint QueryStringAttribute( const char* name, std::string* _value ) const {\n\t\tconst char* cstr = Attribute( name );\n\t\tif ( cstr ) {\n\t\t\t*_value = std::string( cstr );\n\t\t\treturn TIXML_SUCCESS;\n\t\t}\n\t\treturn TIXML_NO_ATTRIBUTE;\n\t}\n\n\t/** Template form of the attribute query which will try to read the\n\t\tattribute into the specified type. Very easy, very powerful, but\n\t\tbe careful to make sure to call this with the correct type.\n\t\t\n\t\tNOTE: This method doesn't work correctly for 'string' types that contain spaces.\n\n\t\t@return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE\n\t*/\n\ttemplate< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const\n\t{\n\t\tconst TiXmlAttribute* node = attributeSet.Find( name );\n\t\tif ( !node )\n\t\t\treturn TIXML_NO_ATTRIBUTE;\n\n\t\tstd::stringstream sstream( node->ValueStr() );\n\t\tsstream >> *outValue;\n\t\tif ( !sstream.fail() )\n\t\t\treturn TIXML_SUCCESS;\n\t\treturn TIXML_WRONG_TYPE;\n\t}\n\n\tint QueryValueAttribute( const std::string& name, std::string* outValue ) const\n\t{\n\t\tconst TiXmlAttribute* node = attributeSet.Find( name );\n\t\tif ( !node )\n\t\t\treturn TIXML_NO_ATTRIBUTE;\n\t\t*outValue = node->ValueStr();\n\t\treturn TIXML_SUCCESS;\n\t}\n\t#endif\n\n\t/** Sets an attribute of name to a given value. The attribute\n\t\twill be created if it does not exist, or changed if it does.\n\t*/\n\tvoid SetAttribute( const char* name, const char * _value );\n\n    #ifdef TIXML_USE_STL\n\tconst std::string* Attribute( const std::string& name ) const;\n\tconst std::string* Attribute( const std::string& name, int* i ) const;\n\tconst std::string* Attribute( const std::string& name, double* d ) const;\n\tint QueryIntAttribute( const std::string& name, int* _value ) const;\n\tint QueryDoubleAttribute( const std::string& name, double* _value ) const;\n\n\t/// STL std::string form.\n\tvoid SetAttribute( const std::string& name, const std::string& _value );\n\t///< STL std::string form.\n\tvoid SetAttribute( const std::string& name, int _value );\n\t///< STL std::string form.\n\tvoid SetDoubleAttribute( const std::string& name, double value );\n\t#endif\n\n\t/** Sets an attribute of name to a given value. The attribute\n\t\twill be created if it does not exist, or changed if it does.\n\t*/\n\tvoid SetAttribute( const char * name, int value );\n\n\t/** Sets an attribute of name to a given value. The attribute\n\t\twill be created if it does not exist, or changed if it does.\n\t*/\n\tvoid SetDoubleAttribute( const char * name, double value );\n\n\t/** Deletes an attribute with the given name.\n\t*/\n\tvoid RemoveAttribute( const char * name );\n    #ifdef TIXML_USE_STL\n\tvoid RemoveAttribute( const std::string& name )\t{\tRemoveAttribute (name.c_str ());\t}\t///< STL std::string form.\n\t#endif\n\n\tconst TiXmlAttribute* FirstAttribute() const\t{ return attributeSet.First(); }\t\t///< Access the first attribute in this element.\n\tTiXmlAttribute* FirstAttribute() \t\t\t\t{ return attributeSet.First(); }\n\tconst TiXmlAttribute* LastAttribute()\tconst \t{ return attributeSet.Last(); }\t\t///< Access the last attribute in this element.\n\tTiXmlAttribute* LastAttribute()\t\t\t\t\t{ return attributeSet.Last(); }\n\n\t/** Convenience function for easy access to the text inside an element. Although easy\n\t\tand concise, GetText() is limited compared to getting the TiXmlText child\n\t\tand accessing it directly.\n\t\n\t\tIf the first child of 'this' is a TiXmlText, the GetText()\n\t\treturns the character string of the Text node, else null is returned.\n\n\t\tThis is a convenient method for getting the text of simple contained text:\n\t\t@verbatim\n\t\t<foo>This is text</foo>\n\t\tconst char* str = fooElement->GetText();\n\t\t@endverbatim\n\n\t\t'str' will be a pointer to \"This is text\". \n\t\t\n\t\tNote that this function can be misleading. If the element foo was created from\n\t\tthis XML:\n\t\t@verbatim\n\t\t<foo><b>This is text</b></foo> \n\t\t@endverbatim\n\n\t\tthen the value of str would be null. The first child node isn't a text node, it is\n\t\tanother element. From this XML:\n\t\t@verbatim\n\t\t<foo>This is <b>text</b></foo> \n\t\t@endverbatim\n\t\tGetText() will return \"This is \".\n\n\t\tWARNING: GetText() accesses a child node - don't become confused with the \n\t\t\t\t similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are \n\t\t\t\t safe type casts on the referenced node.\n\t*/\n\tconst char* GetText() const;\n\n\t/// Creates a new Element and returns it - the returned element is a copy.\n\tvirtual TiXmlNode* Clone() const;\n\t// Print the Element to a FILE stream.\n\tvirtual void Print( FILE* cfile, int depth ) const;\n\n\t/*\tAttribtue parsing starts: next char past '<'\n\t\t\t\t\t\t returns: next char past '>'\n\t*/\n\tvirtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );\n\n\tvirtual const TiXmlElement*     ToElement()     const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\tvirtual TiXmlElement*           ToElement()\t          { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\n\t/** Walk the XML tree visiting this node and all of its children. \n\t*/\n\tvirtual bool Accept( TiXmlVisitor* visitor ) const;\n\nprotected:\n\n\tvoid CopyTo( TiXmlElement* target ) const;\n\tvoid ClearThis();\t// like clear, but initializes 'this' object as well\n\n\t// Used to be public [internal use]\n\t#ifdef TIXML_USE_STL\n\tvirtual void StreamIn( std::istream * in, TIXML_STRING * tag );\n\t#endif\n\t/*\t[internal use]\n\t\tReads the \"value\" of the element -- another element, or text.\n\t\tThis should terminate with the current end tag.\n\t*/\n\tconst char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );\n\nprivate:\n\tTiXmlAttributeSet attributeSet;\n};\n\n\n/**\tAn XML comment.\n*/\nclass TiXmlComment : public TiXmlNode\n{\npublic:\n\t/// Constructs an empty comment.\n\tTiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {}\n\t/// Construct a comment from text.\n\tTiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {\n\t\tSetValue( _value );\n\t}\n\tTiXmlComment( const TiXmlComment& );\n\tTiXmlComment& operator=( const TiXmlComment& base );\n\n\tvirtual ~TiXmlComment()\t{}\n\n\t/// Returns a copy of this Comment.\n\tvirtual TiXmlNode* Clone() const;\n\t// Write this Comment to a FILE stream.\n\tvirtual void Print( FILE* cfile, int depth ) const;\n\n\t/*\tAttribtue parsing starts: at the ! of the !--\n\t\t\t\t\t\t returns: next char past '>'\n\t*/\n\tvirtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );\n\n\tvirtual const TiXmlComment*  ToComment() const\t{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\tvirtual\t\t  TiXmlComment*  ToComment()\t\t{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\n\t/** Walk the XML tree visiting this node and all of its children. \n\t*/\n\tvirtual bool Accept( TiXmlVisitor* visitor ) const;\n\nprotected:\n\tvoid CopyTo( TiXmlComment* target ) const;\n\n\t// used to be public\n\t#ifdef TIXML_USE_STL\n\tvirtual void StreamIn( std::istream * in, TIXML_STRING * tag );\n\t#endif\n//\tvirtual void StreamOut( TIXML_OSTREAM * out ) const;\n\nprivate:\n\n};\n\n\n/** XML text. A text node can have 2 ways to output the next. \"normal\" output \n\tand CDATA. It will default to the mode it was parsed from the XML file and\n\tyou generally want to leave it alone, but you can change the output mode with \n\tSetCDATA() and query it with CDATA().\n*/\nclass TiXmlText : public TiXmlNode\n{\n\tfriend class TiXmlElement;\npublic:\n\t/** Constructor for text element. By default, it is treated as \n\t\tnormal, encoded text. If you want it be output as a CDATA text\n\t\telement, set the parameter _cdata to 'true'\n\t*/\n\tTiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)\n\t{\n\t\tSetValue( initValue );\n\t\tcdata = false;\n\t}\n\tvirtual ~TiXmlText() {}\n\n\t#ifdef TIXML_USE_STL\n\t/// Constructor.\n\tTiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)\n\t{\n\t\tSetValue( initValue );\n\t\tcdata = false;\n\t}\n\t#endif\n\n\tTiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT )\t{ copy.CopyTo( this ); }\n\tTiXmlText& operator=( const TiXmlText& base )\t\t\t\t\t\t\t \t{ base.CopyTo( this ); return *this; }\n\n\t// Write this text object to a FILE stream.\n\tvirtual void Print( FILE* cfile, int depth ) const;\n\n\t/// Queries whether this represents text using a CDATA section.\n\tbool CDATA() const\t\t\t\t{ return cdata; }\n\t/// Turns on or off a CDATA representation of text.\n\tvoid SetCDATA( bool _cdata )\t{ cdata = _cdata; }\n\n\tvirtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );\n\n\tvirtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\tvirtual TiXmlText*       ToText()       { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\n\t/** Walk the XML tree visiting this node and all of its children. \n\t*/\n\tvirtual bool Accept( TiXmlVisitor* content ) const;\n\nprotected :\n\t///  [internal use] Creates a new Element and returns it.\n\tvirtual TiXmlNode* Clone() const;\n\tvoid CopyTo( TiXmlText* target ) const;\n\n\tbool Blank() const;\t// returns true if all white space and new lines\n\t// [internal use]\n\t#ifdef TIXML_USE_STL\n\tvirtual void StreamIn( std::istream * in, TIXML_STRING * tag );\n\t#endif\n\nprivate:\n\tbool cdata;\t\t\t// true if this should be input and output as a CDATA style text element\n};\n\n\n/** In correct XML the declaration is the first entry in the file.\n\t@verbatim\n\t\t<?xml version=\"1.0\" standalone=\"yes\"?>\n\t@endverbatim\n\n\tTinyXml will happily read or write files without a declaration,\n\thowever. There are 3 possible attributes to the declaration:\n\tversion, encoding, and standalone.\n\n\tNote: In this version of the code, the attributes are\n\thandled as special cases, not generic attributes, simply\n\tbecause there can only be at most 3 and they are always the same.\n*/\nclass TiXmlDeclaration : public TiXmlNode\n{\npublic:\n\t/// Construct an empty declaration.\n\tTiXmlDeclaration()   : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {}\n\n#ifdef TIXML_USE_STL\n\t/// Constructor.\n\tTiXmlDeclaration(\tconst std::string& _version,\n\t\t\t\t\t\tconst std::string& _encoding,\n\t\t\t\t\t\tconst std::string& _standalone );\n#endif\n\n\t/// Construct.\n\tTiXmlDeclaration(\tconst char* _version,\n\t\t\t\t\t\tconst char* _encoding,\n\t\t\t\t\t\tconst char* _standalone );\n\n\tTiXmlDeclaration( const TiXmlDeclaration& copy );\n\tTiXmlDeclaration& operator=( const TiXmlDeclaration& copy );\n\n\tvirtual ~TiXmlDeclaration()\t{}\n\n\t/// Version. Will return an empty string if none was found.\n\tconst char *Version() const\t\t\t{ return version.c_str (); }\n\t/// Encoding. Will return an empty string if none was found.\n\tconst char *Encoding() const\t\t{ return encoding.c_str (); }\n\t/// Is this a standalone document?\n\tconst char *Standalone() const\t\t{ return standalone.c_str (); }\n\n\t/// Creates a copy of this Declaration and returns it.\n\tvirtual TiXmlNode* Clone() const;\n\t// Print this declaration to a FILE stream.\n\tvirtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;\n\tvirtual void Print( FILE* cfile, int depth ) const {\n\t\tPrint( cfile, depth, 0 );\n\t}\n\n\tvirtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );\n\n\tvirtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\tvirtual TiXmlDeclaration*       ToDeclaration()       { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\n\t/** Walk the XML tree visiting this node and all of its children. \n\t*/\n\tvirtual bool Accept( TiXmlVisitor* visitor ) const;\n\nprotected:\n\tvoid CopyTo( TiXmlDeclaration* target ) const;\n\t// used to be public\n\t#ifdef TIXML_USE_STL\n\tvirtual void StreamIn( std::istream * in, TIXML_STRING * tag );\n\t#endif\n\nprivate:\n\n\tTIXML_STRING version;\n\tTIXML_STRING encoding;\n\tTIXML_STRING standalone;\n};\n\n\n/** Any tag that tinyXml doesn't recognize is saved as an\n\tunknown. It is a tag of text, but should not be modified.\n\tIt will be written back to the XML, unchanged, when the file\n\tis saved.\n\n\tDTD tags get thrown into TiXmlUnknowns.\n*/\nclass TiXmlUnknown : public TiXmlNode\n{\npublic:\n\tTiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )\t{}\n\tvirtual ~TiXmlUnknown() {}\n\n\tTiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )\t\t{ copy.CopyTo( this ); }\n\tTiXmlUnknown& operator=( const TiXmlUnknown& copy )\t\t\t\t\t\t\t\t\t\t{ copy.CopyTo( this ); return *this; }\n\n\t/// Creates a copy of this Unknown and returns it.\n\tvirtual TiXmlNode* Clone() const;\n\t// Print this Unknown to a FILE stream.\n\tvirtual void Print( FILE* cfile, int depth ) const;\n\n\tvirtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );\n\n\tvirtual const TiXmlUnknown*     ToUnknown()     const\t{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\tvirtual TiXmlUnknown*           ToUnknown()\t\t\t\t{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\n\t/** Walk the XML tree visiting this node and all of its children. \n\t*/\n\tvirtual bool Accept( TiXmlVisitor* content ) const;\n\nprotected:\n\tvoid CopyTo( TiXmlUnknown* target ) const;\n\n\t#ifdef TIXML_USE_STL\n\tvirtual void StreamIn( std::istream * in, TIXML_STRING * tag );\n\t#endif\n\nprivate:\n\n};\n\n\n/** Always the top level node. A document binds together all the\n\tXML pieces. It can be saved, loaded, and printed to the screen.\n\tThe 'value' of a document node is the xml file name.\n*/\nclass TiXmlDocument : public TiXmlNode\n{\npublic:\n\t/// Create an empty document, that has no name.\n\tTiXmlDocument();\n\t/// Create a document with a name. The name of the document is also the filename of the xml.\n\tTiXmlDocument( const char * documentName );\n\n\t#ifdef TIXML_USE_STL\n\t/// Constructor.\n\tTiXmlDocument( const std::string& documentName );\n\t#endif\n\n\tTiXmlDocument( const TiXmlDocument& copy );\n\tTiXmlDocument& operator=( const TiXmlDocument& copy );\n\n\tvirtual ~TiXmlDocument() {}\n\n\t/** Load a file using the current document value.\n\t\tReturns true if successful. Will delete any existing\n\t\tdocument data before loading.\n\t*/\n\tbool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );\n\t/// Save a file using the current document value. Returns true if successful.\n\tbool SaveFile() const;\n\t/// Load a file using the given filename. Returns true if successful.\n\tbool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );\n\t/// Save a file using the given filename. Returns true if successful.\n\tbool SaveFile( const char * filename ) const;\n\t/** Load a file using the given FILE*. Returns true if successful. Note that this method\n\t\tdoesn't stream - the entire object pointed at by the FILE*\n\t\twill be interpreted as an XML file. TinyXML doesn't stream in XML from the current\n\t\tfile location. Streaming may be added in the future.\n\t*/\n\tbool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );\n\t/// Save a file using the given FILE*. Returns true if successful.\n\tbool SaveFile( FILE* ) const;\n\n\t#ifdef TIXML_USE_STL\n\tbool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )\t\t\t///< STL std::string version.\n\t{\n\t\treturn LoadFile( filename.c_str(), encoding );\n\t}\n\tbool SaveFile( const std::string& filename ) const\t\t///< STL std::string version.\n\t{\n\t\treturn SaveFile( filename.c_str() );\n\t}\n\t#endif\n\n\t/** Parse the given null terminated block of xml data. Passing in an encoding to this\n\t\tmethod (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml\n\t\tto use that encoding, regardless of what TinyXml might otherwise try to detect.\n\t*/\n\tvirtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );\n\n\t/** Get the root element -- the only top level element -- of the document.\n\t\tIn well formed XML, there should only be one. TinyXml is tolerant of\n\t\tmultiple elements at the document level.\n\t*/\n\tconst TiXmlElement* RootElement() const\t\t{ return FirstChildElement(); }\n\tTiXmlElement* RootElement()\t\t\t\t\t{ return FirstChildElement(); }\n\n\t/** If an error occurs, Error will be set to true. Also,\n\t\t- The ErrorId() will contain the integer identifier of the error (not generally useful)\n\t\t- The ErrorDesc() method will return the name of the error. (very useful)\n\t\t- The ErrorRow() and ErrorCol() will return the location of the error (if known)\n\t*/\t\n\tbool Error() const\t\t\t\t\t\t{ return error; }\n\n\t/// Contains a textual (english) description of the error if one occurs.\n\tconst char * ErrorDesc() const\t{ return errorDesc.c_str (); }\n\n\t/** Generally, you probably want the error string ( ErrorDesc() ). But if you\n\t\tprefer the ErrorId, this function will fetch it.\n\t*/\n\tint ErrorId()\tconst\t\t\t\t{ return errorId; }\n\n\t/** Returns the location (if known) of the error. The first column is column 1, \n\t\tand the first row is row 1. A value of 0 means the row and column wasn't applicable\n\t\t(memory errors, for example, have no row/column) or the parser lost the error. (An\n\t\terror in the error reporting, in that case.)\n\n\t\t@sa SetTabSize, Row, Column\n\t*/\n\tint ErrorRow() const\t{ return errorLocation.row+1; }\n\tint ErrorCol() const\t{ return errorLocation.col+1; }\t///< The column where the error occured. See ErrorRow()\n\n\t/** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol())\n\t\tto report the correct values for row and column. It does not change the output\n\t\tor input in any way.\n\t\t\n\t\tBy calling this method, with a tab size\n\t\tgreater than 0, the row and column of each node and attribute is stored\n\t\twhen the file is loaded. Very useful for tracking the DOM back in to\n\t\tthe source file.\n\n\t\tThe tab size is required for calculating the location of nodes. If not\n\t\tset, the default of 4 is used. The tabsize is set per document. Setting\n\t\tthe tabsize to 0 disables row/column tracking.\n\n\t\tNote that row and column tracking is not supported when using operator>>.\n\n\t\tThe tab size needs to be enabled before the parse or load. Correct usage:\n\t\t@verbatim\n\t\tTiXmlDocument doc;\n\t\tdoc.SetTabSize( 8 );\n\t\tdoc.Load( \"myfile.xml\" );\n\t\t@endverbatim\n\n\t\t@sa Row, Column\n\t*/\n\tvoid SetTabSize( int _tabsize )\t\t{ tabsize = _tabsize; }\n\n\tint TabSize() const\t{ return tabsize; }\n\n\t/** If you have handled the error, it can be reset with this call. The error\n\t\tstate is automatically cleared if you Parse a new XML block.\n\t*/\n\tvoid ClearError()\t\t\t\t\t\t{\terror = false; \n\t\t\t\t\t\t\t\t\t\t\t\terrorId = 0; \n\t\t\t\t\t\t\t\t\t\t\t\terrorDesc = \"\"; \n\t\t\t\t\t\t\t\t\t\t\t\terrorLocation.row = errorLocation.col = 0; \n\t\t\t\t\t\t\t\t\t\t\t\t//errorLocation.last = 0; \n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t/** Write the document to standard out using formatted printing (\"pretty print\"). */\n\tvoid Print() const\t\t\t\t\t\t{ Print( stdout, 0 ); }\n\n\t/* Write the document to a string using formatted printing (\"pretty print\"). This\n\t\twill allocate a character array (new char[]) and return it as a pointer. The\n\t\tcalling code pust call delete[] on the return char* to avoid a memory leak.\n\t*/\n\t//char* PrintToMemory() const; \n\n\t/// Print this Document to a FILE stream.\n\tvirtual void Print( FILE* cfile, int depth = 0 ) const;\n\t// [internal use]\n\tvoid SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );\n\n\tvirtual const TiXmlDocument*    ToDocument()    const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\tvirtual TiXmlDocument*          ToDocument()          { return this; } ///< Cast to a more defined type. Will return null not of the requested type.\n\n\t/** Walk the XML tree visiting this node and all of its children. \n\t*/\n\tvirtual bool Accept( TiXmlVisitor* content ) const;\n\nprotected :\n\t// [internal use]\n\tvirtual TiXmlNode* Clone() const;\n\t#ifdef TIXML_USE_STL\n\tvirtual void StreamIn( std::istream * in, TIXML_STRING * tag );\n\t#endif\n\nprivate:\n\tvoid CopyTo( TiXmlDocument* target ) const;\n\n\tbool error;\n\tint  errorId;\n\tTIXML_STRING errorDesc;\n\tint tabsize;\n\tTiXmlCursor errorLocation;\n\tbool useMicrosoftBOM;\t\t// the UTF-8 BOM were found when read. Note this, and try to write.\n};\n\n\n/**\n\tA TiXmlHandle is a class that wraps a node pointer with null checks; this is\n\tan incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml\n\tDOM structure. It is a separate utility class.\n\n\tTake an example:\n\t@verbatim\n\t<Document>\n\t\t<Element attributeA = \"valueA\">\n\t\t\t<Child attributeB = \"value1\" />\n\t\t\t<Child attributeB = \"value2\" />\n\t\t</Element>\n\t<Document>\n\t@endverbatim\n\n\tAssuming you want the value of \"attributeB\" in the 2nd \"Child\" element, it's very \n\teasy to write a *lot* of code that looks like:\n\n\t@verbatim\n\tTiXmlElement* root = document.FirstChildElement( \"Document\" );\n\tif ( root )\n\t{\n\t\tTiXmlElement* element = root->FirstChildElement( \"Element\" );\n\t\tif ( element )\n\t\t{\n\t\t\tTiXmlElement* child = element->FirstChildElement( \"Child\" );\n\t\t\tif ( child )\n\t\t\t{\n\t\t\t\tTiXmlElement* child2 = child->NextSiblingElement( \"Child\" );\n\t\t\t\tif ( child2 )\n\t\t\t\t{\n\t\t\t\t\t// Finally do something useful.\n\t@endverbatim\n\n\tAnd that doesn't even cover \"else\" cases. TiXmlHandle addresses the verbosity\n\tof such code. A TiXmlHandle checks for null\tpointers so it is perfectly safe \n\tand correct to use:\n\n\t@verbatim\n\tTiXmlHandle docHandle( &document );\n\tTiXmlElement* child2 = docHandle.FirstChild( \"Document\" ).FirstChild( \"Element\" ).Child( \"Child\", 1 ).ToElement();\n\tif ( child2 )\n\t{\n\t\t// do something useful\n\t@endverbatim\n\n\tWhich is MUCH more concise and useful.\n\n\tIt is also safe to copy handles - internally they are nothing more than node pointers.\n\t@verbatim\n\tTiXmlHandle handleCopy = handle;\n\t@endverbatim\n\n\tWhat they should not be used for is iteration:\n\n\t@verbatim\n\tint i=0; \n\twhile ( true )\n\t{\n\t\tTiXmlElement* child = docHandle.FirstChild( \"Document\" ).FirstChild( \"Element\" ).Child( \"Child\", i ).ToElement();\n\t\tif ( !child )\n\t\t\tbreak;\n\t\t// do something\n\t\t++i;\n\t}\n\t@endverbatim\n\n\tIt seems reasonable, but it is in fact two embedded while loops. The Child method is \n\ta linear walk to find the element, so this code would iterate much more than it needs \n\tto. Instead, prefer:\n\n\t@verbatim\n\tTiXmlElement* child = docHandle.FirstChild( \"Document\" ).FirstChild( \"Element\" ).FirstChild( \"Child\" ).ToElement();\n\n\tfor( child; child; child=child->NextSiblingElement() )\n\t{\n\t\t// do something\n\t}\n\t@endverbatim\n*/\nclass TiXmlHandle\n{\npublic:\n\t/// Create a handle from any node (at any depth of the tree.) This can be a null pointer.\n\tTiXmlHandle( TiXmlNode* _node )\t\t\t\t\t{ this->node = _node; }\n\t/// Copy constructor\n\tTiXmlHandle( const TiXmlHandle& ref )\t\t\t{ this->node = ref.node; }\n\tTiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; }\n\n\t/// Return a handle to the first child node.\n\tTiXmlHandle FirstChild() const;\n\t/// Return a handle to the first child node with the given name.\n\tTiXmlHandle FirstChild( const char * value ) const;\n\t/// Return a handle to the first child element.\n\tTiXmlHandle FirstChildElement() const;\n\t/// Return a handle to the first child element with the given name.\n\tTiXmlHandle FirstChildElement( const char * value ) const;\n\n\t/** Return a handle to the \"index\" child with the given name. \n\t\tThe first child is 0, the second 1, etc.\n\t*/\n\tTiXmlHandle Child( const char* value, int index ) const;\n\t/** Return a handle to the \"index\" child. \n\t\tThe first child is 0, the second 1, etc.\n\t*/\n\tTiXmlHandle Child( int index ) const;\n\t/** Return a handle to the \"index\" child element with the given name. \n\t\tThe first child element is 0, the second 1, etc. Note that only TiXmlElements\n\t\tare indexed: other types are not counted.\n\t*/\n\tTiXmlHandle ChildElement( const char* value, int index ) const;\n\t/** Return a handle to the \"index\" child element. \n\t\tThe first child element is 0, the second 1, etc. Note that only TiXmlElements\n\t\tare indexed: other types are not counted.\n\t*/\n\tTiXmlHandle ChildElement( int index ) const;\n\n\t#ifdef TIXML_USE_STL\n\tTiXmlHandle FirstChild( const std::string& _value ) const\t\t\t\t{ return FirstChild( _value.c_str() ); }\n\tTiXmlHandle FirstChildElement( const std::string& _value ) const\t\t{ return FirstChildElement( _value.c_str() ); }\n\n\tTiXmlHandle Child( const std::string& _value, int index ) const\t\t\t{ return Child( _value.c_str(), index ); }\n\tTiXmlHandle ChildElement( const std::string& _value, int index ) const\t{ return ChildElement( _value.c_str(), index ); }\n\t#endif\n\n\t/** Return the handle as a TiXmlNode. This may return null.\n\t*/\n\tTiXmlNode* ToNode() const\t\t\t{ return node; } \n\t/** Return the handle as a TiXmlElement. This may return null.\n\t*/\n\tTiXmlElement* ToElement() const\t\t{ return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }\n\t/**\tReturn the handle as a TiXmlText. This may return null.\n\t*/\n\tTiXmlText* ToText() const\t\t\t{ return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }\n\t/** Return the handle as a TiXmlUnknown. This may return null.\n\t*/\n\tTiXmlUnknown* ToUnknown() const\t\t{ return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }\n\n\t/** @deprecated use ToNode. \n\t\tReturn the handle as a TiXmlNode. This may return null.\n\t*/\n\tTiXmlNode* Node() const\t\t\t{ return ToNode(); } \n\t/** @deprecated use ToElement. \n\t\tReturn the handle as a TiXmlElement. This may return null.\n\t*/\n\tTiXmlElement* Element() const\t{ return ToElement(); }\n\t/**\t@deprecated use ToText()\n\t\tReturn the handle as a TiXmlText. This may return null.\n\t*/\n\tTiXmlText* Text() const\t\t\t{ return ToText(); }\n\t/** @deprecated use ToUnknown()\n\t\tReturn the handle as a TiXmlUnknown. This may return null.\n\t*/\n\tTiXmlUnknown* Unknown() const\t{ return ToUnknown(); }\n\nprivate:\n\tTiXmlNode* node;\n};\n\n\n/** Print to memory functionality. The TiXmlPrinter is useful when you need to:\n\n\t-# Print to memory (especially in non-STL mode)\n\t-# Control formatting (line endings, etc.)\n\n\tWhen constructed, the TiXmlPrinter is in its default \"pretty printing\" mode.\n\tBefore calling Accept() you can call methods to control the printing\n\tof the XML document. After TiXmlNode::Accept() is called, the printed document can\n\tbe accessed via the CStr(), Str(), and Size() methods.\n\n\tTiXmlPrinter uses the Visitor API.\n\t@verbatim\n\tTiXmlPrinter printer;\n\tprinter.SetIndent( \"\\t\" );\n\n\tdoc.Accept( &printer );\n\tfprintf( stdout, \"%s\", printer.CStr() );\n\t@endverbatim\n*/\nclass TiXmlPrinter : public TiXmlVisitor\n{\npublic:\n\tTiXmlPrinter() : depth( 0 ), simpleTextPrint( false ),\n\t\t\t\t\t buffer(), indent( \"    \" ), lineBreak( \"\\n\" ) {}\n\n\tvirtual bool VisitEnter( const TiXmlDocument& doc );\n\tvirtual bool VisitExit( const TiXmlDocument& doc );\n\n\tvirtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute );\n\tvirtual bool VisitExit( const TiXmlElement& element );\n\n\tvirtual bool Visit( const TiXmlDeclaration& declaration );\n\tvirtual bool Visit( const TiXmlText& text );\n\tvirtual bool Visit( const TiXmlComment& comment );\n\tvirtual bool Visit( const TiXmlUnknown& unknown );\n\n\t/** Set the indent characters for printing. By default 4 spaces\n\t\tbut tab (\\t) is also useful, or null/empty string for no indentation.\n\t*/\n\tvoid SetIndent( const char* _indent )\t\t\t{ indent = _indent ? _indent : \"\" ; }\n\t/// Query the indention string.\n\tconst char* Indent()\t\t\t\t\t\t\t{ return indent.c_str(); }\n\t/** Set the line breaking string. By default set to newline (\\n). \n\t\tSome operating systems prefer other characters, or can be\n\t\tset to the null/empty string for no indenation.\n\t*/\n\tvoid SetLineBreak( const char* _lineBreak )\t\t{ lineBreak = _lineBreak ? _lineBreak : \"\"; }\n\t/// Query the current line breaking string.\n\tconst char* LineBreak()\t\t\t\t\t\t\t{ return lineBreak.c_str(); }\n\n\t/** Switch over to \"stream printing\" which is the most dense formatting without \n\t\tlinebreaks. Common when the XML is needed for network transmission.\n\t*/\n\tvoid SetStreamPrinting()\t\t\t\t\t\t{ indent = \"\";\n\t\t\t\t\t\t\t\t\t\t\t\t\t  lineBreak = \"\";\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\t\n\t/// Return the result.\n\tconst char* CStr()\t\t\t\t\t\t\t\t{ return buffer.c_str(); }\n\t/// Return the length of the result string.\n\tsize_t Size()\t\t\t\t\t\t\t\t\t{ return buffer.size(); }\n\n\t#ifdef TIXML_USE_STL\n\t/// Return the result.\n\tconst std::string& Str()\t\t\t\t\t\t{ return buffer; }\n\t#endif\n\nprivate:\n\tvoid DoIndent()\t{\n\t\tfor( int i=0; i<depth; ++i )\n\t\t\tbuffer += indent;\n\t}\n\tvoid DoLineBreak() {\n\t\tbuffer += lineBreak;\n\t}\n\n\tint depth;\n\tbool simpleTextPrint;\n\tTIXML_STRING buffer;\n\tTIXML_STRING indent;\n\tTIXML_STRING lineBreak;\n};\n\n\n#ifdef _MSC_VER\n#pragma warning( pop )\n#endif\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinyxml/tinyxmlerror.cpp",
    "content": "/*\nwww.sourceforge.net/projects/tinyxml\nOriginal code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)\n\nThis software is provided 'as-is', without any express or implied \nwarranty. In no event will the authors be held liable for any \ndamages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any \npurpose, including commercial applications, and to alter it and \nredistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must\nnot claim that you wrote the original software. If you use this\nsoftware in a product, an acknowledgment in the product documentation\nwould be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and\nmust not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\ndistribution.\n*/\n\n#include \"tinyxml.h\"\n\n// The goal of the seperate error file is to make the first\n// step towards localization. tinyxml (currently) only supports\n// english error messages, but the could now be translated.\n//\n// It also cleans up the code a bit.\n//\n\nconst char* TiXmlBase::errorString[ TiXmlBase::TIXML_ERROR_STRING_COUNT ] =\n{\n\t\"No error\",\n\t\"Error\",\n\t\"Failed to open file\",\n\t\"Error parsing Element.\",\n\t\"Failed to read Element name\",\n\t\"Error reading Element value.\",\n\t\"Error reading Attributes.\",\n\t\"Error: empty tag.\",\n\t\"Error reading end tag.\",\n\t\"Error parsing Unknown.\",\n\t\"Error parsing Comment.\",\n\t\"Error parsing Declaration.\",\n\t\"Error document empty.\",\n\t\"Error null (0) or unexpected EOF found in input stream.\",\n\t\"Error parsing CDATA.\",\n\t\"Error when TiXmlDocument added to document, because TiXmlDocument can only be at the root.\",\n};\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/tinyxml/tinyxmlparser.cpp",
    "content": "/*\nwww.sourceforge.net/projects/tinyxml\nOriginal code by Lee Thomason (www.grinninglizard.com)\n\nThis software is provided 'as-is', without any express or implied \nwarranty. In no event will the authors be held liable for any \ndamages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any \npurpose, including commercial applications, and to alter it and \nredistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must \nnot claim that you wrote the original software. If you use this\nsoftware in a product, an acknowledgment in the product documentation\nwould be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and \nmust not be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source \ndistribution.\n*/\n\n#include <ctype.h>\n#include <stddef.h>\n\n#include \"tinyxml.h\"\n\n//#define DEBUG_PARSER\n#if defined( DEBUG_PARSER )\n#\tif defined( DEBUG ) && defined( _MSC_VER )\n#\t\tinclude <windows.h>\n#\t\tdefine TIXML_LOG OutputDebugString\n#\telse\n#\t\tdefine TIXML_LOG printf\n#\tendif\n#endif\n\n// Note tha \"PutString\" hardcodes the same list. This\n// is less flexible than it appears. Changing the entries\n// or order will break putstring.\t\nTiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] = \n{\n\t{ \"&amp;\",  5, '&' },\n\t{ \"&lt;\",   4, '<' },\n\t{ \"&gt;\",   4, '>' },\n\t{ \"&quot;\", 6, '\\\"' },\n\t{ \"&apos;\", 6, '\\'' }\n};\n\n// Bunch of unicode info at:\n//\t\thttp://www.unicode.org/faq/utf_bom.html\n// Including the basic of this table, which determines the #bytes in the\n// sequence from the lead byte. 1 placed for invalid sequences --\n// although the result will be junk, pass it through as much as possible.\n// Beware of the non-characters in UTF-8:\t\n//\t\t\t\tef bb bf (Microsoft \"lead bytes\")\n//\t\t\t\tef bf be\n//\t\t\t\tef bf bf \n\nconst unsigned char TIXML_UTF_LEAD_0 = 0xefU;\nconst unsigned char TIXML_UTF_LEAD_1 = 0xbbU;\nconst unsigned char TIXML_UTF_LEAD_2 = 0xbfU;\n\nconst int TiXmlBase::utf8ByteTable[256] = \n{\n\t//\t0\t1\t2\t3\t4\t5\t6\t7\t8\t9\ta\tb\tc\td\te\tf\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x00\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x10\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x20\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x30\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x40\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x50\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x60\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x70\tEnd of ASCII range\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x80 0x80 to 0xc1 invalid\n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0x90 \n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0xa0 \n\t\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t// 0xb0 \n\t\t1,\t1,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t// 0xc0 0xc2 to 0xdf 2 byte\n\t\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t2,\t// 0xd0\n\t\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t3,\t// 0xe0 0xe0 to 0xef 3 byte\n\t\t4,\t4,\t4,\t4,\t4,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1,\t1\t// 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid\n};\n\n\nvoid TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length )\n{\n\tconst unsigned long BYTE_MASK = 0xBF;\n\tconst unsigned long BYTE_MARK = 0x80;\n\tconst unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\n\tif (input < 0x80) \n\t\t*length = 1;\n\telse if ( input < 0x800 )\n\t\t*length = 2;\n\telse if ( input < 0x10000 )\n\t\t*length = 3;\n\telse if ( input < 0x200000 )\n\t\t*length = 4;\n\telse\n\t\t{ *length = 0; return; }\t// This code won't covert this correctly anyway.\n\n\toutput += *length;\n\n\t// Scary scary fall throughs.\n\tswitch (*length) \n\t{\n\t\tcase 4:\n\t\t\t--output; \n\t\t\t*output = (char)((input | BYTE_MARK) & BYTE_MASK); \n\t\t\tinput >>= 6;\n\t\tcase 3:\n\t\t\t--output; \n\t\t\t*output = (char)((input | BYTE_MARK) & BYTE_MASK); \n\t\t\tinput >>= 6;\n\t\tcase 2:\n\t\t\t--output; \n\t\t\t*output = (char)((input | BYTE_MARK) & BYTE_MASK); \n\t\t\tinput >>= 6;\n\t\tcase 1:\n\t\t\t--output; \n\t\t\t*output = (char)(input | FIRST_BYTE_MARK[*length]);\n\t}\n}\n\n\n/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ )\n{\n\t// This will only work for low-ascii, everything else is assumed to be a valid\n\t// letter. I'm not sure this is the best approach, but it is quite tricky trying\n\t// to figure out alhabetical vs. not across encoding. So take a very \n\t// conservative approach.\n\n//\tif ( encoding == TIXML_ENCODING_UTF8 )\n//\t{\n\t\tif ( anyByte < 127 )\n\t\t\treturn isalpha( anyByte );\n\t\telse\n\t\t\treturn 1;\t// What else to do? The unicode set is huge...get the english ones right.\n//\t}\n//\telse\n//\t{\n//\t\treturn isalpha( anyByte );\n//\t}\n}\n\n\n/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ )\n{\n\t// This will only work for low-ascii, everything else is assumed to be a valid\n\t// letter. I'm not sure this is the best approach, but it is quite tricky trying\n\t// to figure out alhabetical vs. not across encoding. So take a very \n\t// conservative approach.\n\n//\tif ( encoding == TIXML_ENCODING_UTF8 )\n//\t{\n\t\tif ( anyByte < 127 )\n\t\t\treturn isalnum( anyByte );\n\t\telse\n\t\t\treturn 1;\t// What else to do? The unicode set is huge...get the english ones right.\n//\t}\n//\telse\n//\t{\n//\t\treturn isalnum( anyByte );\n//\t}\n}\n\n\nclass TiXmlParsingData\n{\n\tfriend class TiXmlDocument;\n  public:\n\tvoid Stamp( const char* now, TiXmlEncoding encoding );\n\n\tconst TiXmlCursor& Cursor() const\t{ return cursor; }\n\n  private:\n\t// Only used by the document!\n\tTiXmlParsingData( const char* start, int _tabsize, int row, int col )\n\t{\n\t\tassert( start );\n\t\tstamp = start;\n\t\ttabsize = _tabsize;\n\t\tcursor.row = row;\n\t\tcursor.col = col;\n\t}\n\n\tTiXmlCursor\t\tcursor;\n\tconst char*\t\tstamp;\n\tint\t\t\t\ttabsize;\n};\n\n\nvoid TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding )\n{\n\tassert( now );\n\n\t// Do nothing if the tabsize is 0.\n\tif ( tabsize < 1 )\n\t{\n\t\treturn;\n\t}\n\n\t// Get the current row, column.\n\tint row = cursor.row;\n\tint col = cursor.col;\n\tconst char* p = stamp;\n\tassert( p );\n\n\twhile ( p < now )\n\t{\n\t\t// Treat p as unsigned, so we have a happy compiler.\n\t\tconst unsigned char* pU = (const unsigned char*)p;\n\n\t\t// Code contributed by Fletcher Dunn: (modified by lee)\n\t\tswitch (*pU) {\n\t\t\tcase 0:\n\t\t\t\t// We *should* never get here, but in case we do, don't\n\t\t\t\t// advance past the terminating null character, ever\n\t\t\t\treturn;\n\n\t\t\tcase '\\r':\n\t\t\t\t// bump down to the next line\n\t\t\t\t++row;\n\t\t\t\tcol = 0;\t\t\t\t\n\t\t\t\t// Eat the character\n\t\t\t\t++p;\n\n\t\t\t\t// Check for \\r\\n sequence, and treat this as a single character\n\t\t\t\tif (*p == '\\n') {\n\t\t\t\t\t++p;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '\\n':\n\t\t\t\t// bump down to the next line\n\t\t\t\t++row;\n\t\t\t\tcol = 0;\n\n\t\t\t\t// Eat the character\n\t\t\t\t++p;\n\n\t\t\t\t// Check for \\n\\r sequence, and treat this as a single\n\t\t\t\t// character.  (Yes, this bizarre thing does occur still\n\t\t\t\t// on some arcane platforms...)\n\t\t\t\tif (*p == '\\r') {\n\t\t\t\t\t++p;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase '\\t':\n\t\t\t\t// Eat the character\n\t\t\t\t++p;\n\n\t\t\t\t// Skip to next tab stop\n\t\t\t\tcol = (col / tabsize + 1) * tabsize;\n\t\t\t\tbreak;\n\n\t\t\tcase TIXML_UTF_LEAD_0:\n\t\t\t\tif ( encoding == TIXML_ENCODING_UTF8 )\n\t\t\t\t{\n\t\t\t\t\tif ( *(p+1) && *(p+2) )\n\t\t\t\t\t{\n\t\t\t\t\t\t// In these cases, don't advance the column. These are\n\t\t\t\t\t\t// 0-width spaces.\n\t\t\t\t\t\tif ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 )\n\t\t\t\t\t\t\tp += 3;\t\n\t\t\t\t\t\telse if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU )\n\t\t\t\t\t\t\tp += 3;\t\n\t\t\t\t\t\telse if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU )\n\t\t\t\t\t\t\tp += 3;\t\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{ p +=3; ++col; }\t// A normal character.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++p;\n\t\t\t\t\t++col;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tif ( encoding == TIXML_ENCODING_UTF8 )\n\t\t\t\t{\n\t\t\t\t\t// Eat the 1 to 4 byte utf8 character.\n\t\t\t\t\tint step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)];\n\t\t\t\t\tif ( step == 0 )\n\t\t\t\t\t\tstep = 1;\t\t// Error case from bad encoding, but handle gracefully.\n\t\t\t\t\tp += step;\n\n\t\t\t\t\t// Just advance one column, of course.\n\t\t\t\t\t++col;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++p;\n\t\t\t\t\t++col;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tcursor.row = row;\n\tcursor.col = col;\n\tassert( cursor.row >= -1 );\n\tassert( cursor.col >= -1 );\n\tstamp = p;\n\tassert( stamp );\n}\n\n\nconst char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding )\n{\n\tif ( !p || !*p )\n\t{\n\t\treturn 0;\n\t}\n\tif ( encoding == TIXML_ENCODING_UTF8 )\n\t{\n\t\twhile ( *p )\n\t\t{\n\t\t\tconst unsigned char* pU = (const unsigned char*)p;\n\t\t\t\n\t\t\t// Skip the stupid Microsoft UTF-8 Byte order marks\n\t\t\tif (\t*(pU+0)==TIXML_UTF_LEAD_0\n\t\t\t\t && *(pU+1)==TIXML_UTF_LEAD_1 \n\t\t\t\t && *(pU+2)==TIXML_UTF_LEAD_2 )\n\t\t\t{\n\t\t\t\tp += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if(*(pU+0)==TIXML_UTF_LEAD_0\n\t\t\t\t && *(pU+1)==0xbfU\n\t\t\t\t && *(pU+2)==0xbeU )\n\t\t\t{\n\t\t\t\tp += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if(*(pU+0)==TIXML_UTF_LEAD_0\n\t\t\t\t && *(pU+1)==0xbfU\n\t\t\t\t && *(pU+2)==0xbfU )\n\t\t\t{\n\t\t\t\tp += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( IsWhiteSpace( *p ) )\t\t// Still using old rules for white space.\n\t\t\t\t++p;\n\t\t\telse\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\twhile ( *p && IsWhiteSpace( *p ) )\n\t\t\t++p;\n\t}\n\n\treturn p;\n}\n\n#ifdef TIXML_USE_STL\n/*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag )\n{\n\tfor( ;; )\n\t{\n\t\tif ( !in->good() ) return false;\n\n\t\tint c = in->peek();\n\t\t// At this scope, we can't get to a document. So fail silently.\n\t\tif ( !IsWhiteSpace( c ) || c <= 0 )\n\t\t\treturn true;\n\n\t\t*tag += (char) in->get();\n\t}\n}\n\n/*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag )\n{\n\t//assert( character > 0 && character < 128 );\t// else it won't work in utf-8\n\twhile ( in->good() )\n\t{\n\t\tint c = in->peek();\n\t\tif ( c == character )\n\t\t\treturn true;\n\t\tif ( c <= 0 )\t\t// Silent failure: can't get document at this scope\n\t\t\treturn false;\n\n\t\tin->get();\n\t\t*tag += (char) c;\n\t}\n\treturn false;\n}\n#endif\n\n// One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The\n// \"assign\" optimization removes over 10% of the execution time.\n//\nconst char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding )\n{\n\t// Oddly, not supported on some comilers,\n\t//name->clear();\n\t// So use this:\n\t*name = \"\";\n\tassert( p );\n\n\t// Names start with letters or underscores.\n\t// Of course, in unicode, tinyxml has no idea what a letter *is*. The\n\t// algorithm is generous.\n\t//\n\t// After that, they can be letters, underscores, numbers,\n\t// hyphens, or colons. (Colons are valid ony for namespaces,\n\t// but tinyxml can't tell namespaces from names.)\n\tif (    p && *p \n\t\t && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) )\n\t{\n\t\tconst char* start = p;\n\t\twhile(\t\tp && *p\n\t\t\t\t&&\t(\t\tIsAlphaNum( (unsigned char ) *p, encoding ) \n\t\t\t\t\t\t || *p == '_'\n\t\t\t\t\t\t || *p == '-'\n\t\t\t\t\t\t || *p == '.'\n\t\t\t\t\t\t || *p == ':' ) )\n\t\t{\n\t\t\t//(*name) += *p; // expensive\n\t\t\t++p;\n\t\t}\n\t\tif ( p-start > 0 ) {\n\t\t\tname->assign( start, p-start );\n\t\t}\n\t\treturn p;\n\t}\n\treturn 0;\n}\n\nconst char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding )\n{\n\t// Presume an entity, and pull it out.\n    TIXML_STRING ent;\n\tint i;\n\t*length = 0;\n\n\tif ( *(p+1) && *(p+1) == '#' && *(p+2) )\n\t{\n\t\tunsigned long ucs = 0;\n\t\tptrdiff_t delta = 0;\n\t\tunsigned mult = 1;\n\n\t\tif ( *(p+2) == 'x' )\n\t\t{\n\t\t\t// Hexadecimal.\n\t\t\tif ( !*(p+3) ) return 0;\n\n\t\t\tconst char* q = p+3;\n\t\t\tq = strchr( q, ';' );\n\n\t\t\tif ( !q || !*q ) return 0;\n\n\t\t\tdelta = q-p;\n\t\t\t--q;\n\n\t\t\twhile ( *q != 'x' )\n\t\t\t{\n\t\t\t\tif ( *q >= '0' && *q <= '9' )\n\t\t\t\t\tucs += mult * (*q - '0');\n\t\t\t\telse if ( *q >= 'a' && *q <= 'f' )\n\t\t\t\t\tucs += mult * (*q - 'a' + 10);\n\t\t\t\telse if ( *q >= 'A' && *q <= 'F' )\n\t\t\t\t\tucs += mult * (*q - 'A' + 10 );\n\t\t\t\telse \n\t\t\t\t\treturn 0;\n\t\t\t\tmult *= 16;\n\t\t\t\t--q;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Decimal.\n\t\t\tif ( !*(p+2) ) return 0;\n\n\t\t\tconst char* q = p+2;\n\t\t\tq = strchr( q, ';' );\n\n\t\t\tif ( !q || !*q ) return 0;\n\n\t\t\tdelta = q-p;\n\t\t\t--q;\n\n\t\t\twhile ( *q != '#' )\n\t\t\t{\n\t\t\t\tif ( *q >= '0' && *q <= '9' )\n\t\t\t\t\tucs += mult * (*q - '0');\n\t\t\t\telse \n\t\t\t\t\treturn 0;\n\t\t\t\tmult *= 10;\n\t\t\t\t--q;\n\t\t\t}\n\t\t}\n\t\tif ( encoding == TIXML_ENCODING_UTF8 )\n\t\t{\n\t\t\t// convert the UCS to UTF-8\n\t\t\tConvertUTF32ToUTF8( ucs, value, length );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*value = (char)ucs;\n\t\t\t*length = 1;\n\t\t}\n\t\treturn p + delta + 1;\n\t}\n\n\t// Now try to match it.\n\tfor( i=0; i<NUM_ENTITY; ++i )\n\t{\n\t\tif ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 )\n\t\t{\n\t\t\tassert( strlen( entity[i].str ) == entity[i].strLength );\n\t\t\t*value = entity[i].chr;\n\t\t\t*length = 1;\n\t\t\treturn ( p + entity[i].strLength );\n\t\t}\n\t}\n\n\t// So it wasn't an entity, its unrecognized, or something like that.\n\t*value = *p;\t// Don't put back the last one, since we return it!\n\t//*length = 1;\t// Leave unrecognized entities - this doesn't really work.\n\t\t\t\t\t// Just writes strange XML.\n\treturn p+1;\n}\n\n\nbool TiXmlBase::StringEqual( const char* p,\n\t\t\t\t\t\t\t const char* tag,\n\t\t\t\t\t\t\t bool ignoreCase,\n\t\t\t\t\t\t\t TiXmlEncoding encoding )\n{\n\tassert( p );\n\tassert( tag );\n\tif ( !p || !*p )\n\t{\n\t\tassert( 0 );\n\t\treturn false;\n\t}\n\n\tconst char* q = p;\n\n\tif ( ignoreCase )\n\t{\n\t\twhile ( *q && *tag && ToLower( *q, encoding ) == ToLower( *tag, encoding ) )\n\t\t{\n\t\t\t++q;\n\t\t\t++tag;\n\t\t}\n\n\t\tif ( *tag == 0 )\n\t\t\treturn true;\n\t}\n\telse\n\t{\n\t\twhile ( *q && *tag && *q == *tag )\n\t\t{\n\t\t\t++q;\n\t\t\t++tag;\n\t\t}\n\n\t\tif ( *tag == 0 )\t\t// Have we found the end of the tag, and everything equal?\n\t\t\treturn true;\n\t}\n\treturn false;\n}\n\nconst char* TiXmlBase::ReadText(\tconst char* p, \n\t\t\t\t\t\t\t\t\tTIXML_STRING * text, \n\t\t\t\t\t\t\t\t\tbool trimWhiteSpace, \n\t\t\t\t\t\t\t\t\tconst char* endTag, \n\t\t\t\t\t\t\t\t\tbool caseInsensitive,\n\t\t\t\t\t\t\t\t\tTiXmlEncoding encoding )\n{\n    *text = \"\";\n\tif (    !trimWhiteSpace\t\t\t// certain tags always keep whitespace\n\t\t || !condenseWhiteSpace )\t// if true, whitespace is always kept\n\t{\n\t\t// Keep all the white space.\n\t\twhile (\t   p && *p\n\t\t\t\t&& !StringEqual( p, endTag, caseInsensitive, encoding )\n\t\t\t  )\n\t\t{\n\t\t\tint len;\n\t\t\tchar cArr[4] = { 0, 0, 0, 0 };\n\t\t\tp = GetChar( p, cArr, &len, encoding );\n\t\t\ttext->append( cArr, len );\n\t\t}\n\t}\n\telse\n\t{\n\t\tbool whitespace = false;\n\n\t\t// Remove leading white space:\n\t\tp = SkipWhiteSpace( p, encoding );\n\t\twhile (\t   p && *p\n\t\t\t\t&& !StringEqual( p, endTag, caseInsensitive, encoding ) )\n\t\t{\n\t\t\tif ( *p == '\\r' || *p == '\\n' )\n\t\t\t{\n\t\t\t\twhitespace = true;\n\t\t\t\t++p;\n\t\t\t}\n\t\t\telse if ( IsWhiteSpace( *p ) )\n\t\t\t{\n\t\t\t\twhitespace = true;\n\t\t\t\t++p;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// If we've found whitespace, add it before the\n\t\t\t\t// new character. Any whitespace just becomes a space.\n\t\t\t\tif ( whitespace )\n\t\t\t\t{\n\t\t\t\t\t(*text) += ' ';\n\t\t\t\t\twhitespace = false;\n\t\t\t\t}\n\t\t\t\tint len;\n\t\t\t\tchar cArr[4] = { 0, 0, 0, 0 };\n\t\t\t\tp = GetChar( p, cArr, &len, encoding );\n\t\t\t\tif ( len == 1 )\n\t\t\t\t\t(*text) += cArr[0];\t// more efficient\n\t\t\t\telse\n\t\t\t\t\ttext->append( cArr, len );\n\t\t\t}\n\t\t}\n\t}\n\tif ( p && *p )\n\t\tp += strlen( endTag );\n\treturn ( p && *p ) ? p : 0;\n}\n\n#ifdef TIXML_USE_STL\n\nvoid TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag )\n{\n\t// The basic issue with a document is that we don't know what we're\n\t// streaming. Read something presumed to be a tag (and hope), then\n\t// identify it, and call the appropriate stream method on the tag.\n\t//\n\t// This \"pre-streaming\" will never read the closing \">\" so the\n\t// sub-tag can orient itself.\n\n\tif ( !StreamTo( in, '<', tag ) ) \n\t{\n\t\tSetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn;\n\t}\n\n\twhile ( in->good() )\n\t{\n\t\tint tagIndex = (int) tag->length();\n\t\twhile ( in->good() && in->peek() != '>' )\n\t\t{\n\t\t\tint c = in->get();\n\t\t\tif ( c <= 0 )\n\t\t\t{\n\t\t\t\tSetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t(*tag) += (char) c;\n\t\t}\n\n\t\tif ( in->good() )\n\t\t{\n\t\t\t// We now have something we presume to be a node of \n\t\t\t// some sort. Identify it, and call the node to\n\t\t\t// continue streaming.\n\t\t\tTiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING );\n\n\t\t\tif ( node )\n\t\t\t{\n\t\t\t\tnode->StreamIn( in, tag );\n\t\t\t\tbool isElement = node->ToElement() != 0;\n\t\t\t\tdelete node;\n\t\t\t\tnode = 0;\n\n\t\t\t\t// If this is the root element, we're done. Parsing will be\n\t\t\t\t// done by the >> operator.\n\t\t\t\tif ( isElement )\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\t// We should have returned sooner.\n\tSetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN );\n}\n\n#endif\n\nconst char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding )\n{\n\tClearError();\n\n\t// Parse away, at the document level. Since a document\n\t// contains nothing but other tags, most of what happens\n\t// here is skipping white space.\n\tif ( !p || !*p )\n\t{\n\t\tSetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn 0;\n\t}\n\n\t// Note that, for a document, this needs to come\n\t// before the while space skip, so that parsing\n\t// starts from the pointer we are given.\n\tlocation.Clear();\n\tif ( prevData )\n\t{\n\t\tlocation.row = prevData->cursor.row;\n\t\tlocation.col = prevData->cursor.col;\n\t}\n\telse\n\t{\n\t\tlocation.row = 0;\n\t\tlocation.col = 0;\n\t}\n\tTiXmlParsingData data( p, TabSize(), location.row, location.col );\n\tlocation = data.Cursor();\n\n\tif ( encoding == TIXML_ENCODING_UNKNOWN )\n\t{\n\t\t// Check for the Microsoft UTF-8 lead bytes.\n\t\tconst unsigned char* pU = (const unsigned char*)p;\n\t\tif (\t*(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0\n\t\t\t && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1\n\t\t\t && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 )\n\t\t{\n\t\t\tencoding = TIXML_ENCODING_UTF8;\n\t\t\tuseMicrosoftBOM = true;\n\t\t}\n\t}\n\n    p = SkipWhiteSpace( p, encoding );\n\tif ( !p )\n\t{\n\t\tSetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\treturn 0;\n\t}\n\n\twhile ( p && *p )\n\t{\n\t\tTiXmlNode* node = Identify( p, encoding );\n\t\tif ( node )\n\t\t{\n\t\t\tp = node->Parse( p, &data, encoding );\n\t\t\tLinkEndChild( node );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t// Did we get encoding info?\n\t\tif (    encoding == TIXML_ENCODING_UNKNOWN\n\t\t\t && node->ToDeclaration() )\n\t\t{\n\t\t\tTiXmlDeclaration* dec = node->ToDeclaration();\n\t\t\tconst char* enc = dec->Encoding();\n\t\t\tassert( enc );\n\n\t\t\tif ( *enc == 0 )\n\t\t\t\tencoding = TIXML_ENCODING_UTF8;\n\t\t\telse if ( StringEqual( enc, \"UTF-8\", true, TIXML_ENCODING_UNKNOWN ) )\n\t\t\t\tencoding = TIXML_ENCODING_UTF8;\n\t\t\telse if ( StringEqual( enc, \"UTF8\", true, TIXML_ENCODING_UNKNOWN ) )\n\t\t\t\tencoding = TIXML_ENCODING_UTF8;\t// incorrect, but be nice\n\t\t\telse \n\t\t\t\tencoding = TIXML_ENCODING_LEGACY;\n\t\t}\n\n\t\tp = SkipWhiteSpace( p, encoding );\n\t}\n\n\t// Was this empty?\n\tif ( !firstChild ) {\n\t\tSetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding );\n\t\treturn 0;\n\t}\n\n\t// All is well.\n\treturn p;\n}\n\nvoid TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding )\n{\t\n\t// The first error in a chain is more accurate - don't set again!\n\tif ( error )\n\t\treturn;\n\n\tassert( err > 0 && err < TIXML_ERROR_STRING_COUNT );\n\terror   = true;\n\terrorId = err;\n\terrorDesc = errorString[ errorId ];\n\n\terrorLocation.Clear();\n\tif ( pError && data )\n\t{\n\t\tdata->Stamp( pError, encoding );\n\t\terrorLocation = data->Cursor();\n\t}\n}\n\n\nTiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding )\n{\n\tTiXmlNode* returnNode = 0;\n\n\tp = SkipWhiteSpace( p, encoding );\n\tif( !p || !*p || *p != '<' )\n\t{\n\t\treturn 0;\n\t}\n\n\tp = SkipWhiteSpace( p, encoding );\n\n\tif ( !p || !*p )\n\t{\n\t\treturn 0;\n\t}\n\n\t// What is this thing? \n\t// - Elements start with a letter or underscore, but xml is reserved.\n\t// - Comments: <!--\n\t// - Decleration: <?xml\n\t// - Everthing else is unknown to tinyxml.\n\t//\n\n\tconst char* xmlHeader = { \"<?xml\" };\n\tconst char* commentHeader = { \"<!--\" };\n\tconst char* dtdHeader = { \"<!\" };\n\tconst char* cdataHeader = { \"<![CDATA[\" };\n\n\tif ( StringEqual( p, xmlHeader, true, encoding ) )\n\t{\n\t\t#ifdef DEBUG_PARSER\n\t\t\tTIXML_LOG( \"XML parsing Declaration\\n\" );\n\t\t#endif\n\t\treturnNode = new TiXmlDeclaration();\n\t}\n\telse if ( StringEqual( p, commentHeader, false, encoding ) )\n\t{\n\t\t#ifdef DEBUG_PARSER\n\t\t\tTIXML_LOG( \"XML parsing Comment\\n\" );\n\t\t#endif\n\t\treturnNode = new TiXmlComment();\n\t}\n\telse if ( StringEqual( p, cdataHeader, false, encoding ) )\n\t{\n\t\t#ifdef DEBUG_PARSER\n\t\t\tTIXML_LOG( \"XML parsing CDATA\\n\" );\n\t\t#endif\n\t\tTiXmlText* text = new TiXmlText( \"\" );\n\t\ttext->SetCDATA( true );\n\t\treturnNode = text;\n\t}\n\telse if ( StringEqual( p, dtdHeader, false, encoding ) )\n\t{\n\t\t#ifdef DEBUG_PARSER\n\t\t\tTIXML_LOG( \"XML parsing Unknown(1)\\n\" );\n\t\t#endif\n\t\treturnNode = new TiXmlUnknown();\n\t}\n\telse if (    IsAlpha( *(p+1), encoding )\n\t\t\t  || *(p+1) == '_' )\n\t{\n\t\t#ifdef DEBUG_PARSER\n\t\t\tTIXML_LOG( \"XML parsing Element\\n\" );\n\t\t#endif\n\t\treturnNode = new TiXmlElement( \"\" );\n\t}\n\telse\n\t{\n\t\t#ifdef DEBUG_PARSER\n\t\t\tTIXML_LOG( \"XML parsing Unknown(2)\\n\" );\n\t\t#endif\n\t\treturnNode = new TiXmlUnknown();\n\t}\n\n\tif ( returnNode )\n\t{\n\t\t// Set the parent, so it can report errors\n\t\treturnNode->parent = this;\n\t}\n\treturn returnNode;\n}\n\n#ifdef TIXML_USE_STL\n\nvoid TiXmlElement::StreamIn (std::istream * in, TIXML_STRING * tag)\n{\n\t// We're called with some amount of pre-parsing. That is, some of \"this\"\n\t// element is in \"tag\". Go ahead and stream to the closing \">\"\n\twhile( in->good() )\n\t{\n\t\tint c = in->get();\n\t\tif ( c <= 0 )\n\t\t{\n\t\t\tTiXmlDocument* document = GetDocument();\n\t\t\tif ( document )\n\t\t\t\tdocument->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\treturn;\n\t\t}\n\t\t(*tag) += (char) c ;\n\t\t\n\t\tif ( c == '>' )\n\t\t\tbreak;\n\t}\n\n\tif ( tag->length() < 3 ) return;\n\n\t// Okay...if we are a \"/>\" tag, then we're done. We've read a complete tag.\n\t// If not, identify and stream.\n\n\tif (    tag->at( tag->length() - 1 ) == '>' \n\t\t && tag->at( tag->length() - 2 ) == '/' )\n\t{\n\t\t// All good!\n\t\treturn;\n\t}\n\telse if ( tag->at( tag->length() - 1 ) == '>' )\n\t{\n\t\t// There is more. Could be:\n\t\t//\t\ttext\n\t\t//\t\tcdata text (which looks like another node)\n\t\t//\t\tclosing tag\n\t\t//\t\tanother node.\n\t\tfor ( ;; )\n\t\t{\n\t\t\tStreamWhiteSpace( in, tag );\n\n\t\t\t// Do we have text?\n\t\t\tif ( in->good() && in->peek() != '<' ) \n\t\t\t{\n\t\t\t\t// Yep, text.\n\t\t\t\tTiXmlText text( \"\" );\n\t\t\t\ttext.StreamIn( in, tag );\n\n\t\t\t\t// What follows text is a closing tag or another node.\n\t\t\t\t// Go around again and figure it out.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We now have either a closing tag...or another node.\n\t\t\t// We should be at a \"<\", regardless.\n\t\t\tif ( !in->good() ) return;\n\t\t\tassert( in->peek() == '<' );\n\t\t\tint tagIndex = (int) tag->length();\n\n\t\t\tbool closingTag = false;\n\t\t\tbool firstCharFound = false;\n\n\t\t\tfor( ;; )\n\t\t\t{\n\t\t\t\tif ( !in->good() )\n\t\t\t\t\treturn;\n\n\t\t\t\tint c = in->peek();\n\t\t\t\tif ( c <= 0 )\n\t\t\t\t{\n\t\t\t\t\tTiXmlDocument* document = GetDocument();\n\t\t\t\t\tif ( document )\n\t\t\t\t\t\tdocument->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( c == '>' )\n\t\t\t\t\tbreak;\n\n\t\t\t\t*tag += (char) c;\n\t\t\t\tin->get();\n\n\t\t\t\t// Early out if we find the CDATA id.\n\t\t\t\tif ( c == '[' && tag->size() >= 9 )\n\t\t\t\t{\n\t\t\t\t\tsize_t len = tag->size();\n\t\t\t\t\tconst char* start = tag->c_str() + len - 9;\n\t\t\t\t\tif ( strcmp( start, \"<![CDATA[\" ) == 0 ) {\n\t\t\t\t\t\tassert( !closingTag );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( !firstCharFound && c != '<' && !IsWhiteSpace( c ) )\n\t\t\t\t{\n\t\t\t\t\tfirstCharFound = true;\n\t\t\t\t\tif ( c == '/' )\n\t\t\t\t\t\tclosingTag = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If it was a closing tag, then read in the closing '>' to clean up the input stream.\n\t\t\t// If it was not, the streaming will be done by the tag.\n\t\t\tif ( closingTag )\n\t\t\t{\n\t\t\t\tif ( !in->good() )\n\t\t\t\t\treturn;\n\n\t\t\t\tint c = in->get();\n\t\t\t\tif ( c <= 0 )\n\t\t\t\t{\n\t\t\t\t\tTiXmlDocument* document = GetDocument();\n\t\t\t\t\tif ( document )\n\t\t\t\t\t\tdocument->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tassert( c == '>' );\n\t\t\t\t*tag += (char) c;\n\n\t\t\t\t// We are done, once we've found our closing tag.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// If not a closing tag, id it, and stream.\n\t\t\t\tconst char* tagloc = tag->c_str() + tagIndex;\n\t\t\t\tTiXmlNode* node = Identify( tagloc, TIXML_DEFAULT_ENCODING );\n\t\t\t\tif ( !node )\n\t\t\t\t\treturn;\n\t\t\t\tnode->StreamIn( in, tag );\n\t\t\t\tdelete node;\n\t\t\t\tnode = 0;\n\n\t\t\t\t// No return: go around from the beginning: text, closing tag, or node.\n\t\t\t}\n\t\t}\n\t}\n}\n#endif\n\nconst char* TiXmlElement::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )\n{\n\tp = SkipWhiteSpace( p, encoding );\n\tTiXmlDocument* document = GetDocument();\n\n\tif ( !p || !*p )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, 0, 0, encoding );\n\t\treturn 0;\n\t}\n\n\tif ( data )\n\t{\n\t\tdata->Stamp( p, encoding );\n\t\tlocation = data->Cursor();\n\t}\n\n\tif ( *p != '<' )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, p, data, encoding );\n\t\treturn 0;\n\t}\n\n\tp = SkipWhiteSpace( p+1, encoding );\n\n\t// Read the name.\n\tconst char* pErr = p;\n\n    p = ReadName( p, &value, encoding );\n\tif ( !p || !*p )\n\t{\n\t\tif ( document )\tdocument->SetError( TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, pErr, data, encoding );\n\t\treturn 0;\n\t}\n\n    TIXML_STRING endTag (\"</\");\n\tendTag += value;\n\n\t// Check for and read attributes. Also look for an empty\n\t// tag or an end tag.\n\twhile ( p && *p )\n\t{\n\t\tpErr = p;\n\t\tp = SkipWhiteSpace( p, encoding );\n\t\tif ( !p || !*p )\n\t\t{\n\t\t\tif ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding );\n\t\t\treturn 0;\n\t\t}\n\t\tif ( *p == '/' )\n\t\t{\n\t\t\t++p;\n\t\t\t// Empty tag.\n\t\t\tif ( *p  != '>' )\n\t\t\t{\n\t\t\t\tif ( document ) document->SetError( TIXML_ERROR_PARSING_EMPTY, p, data, encoding );\t\t\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn (p+1);\n\t\t}\n\t\telse if ( *p == '>' )\n\t\t{\n\t\t\t// Done with attributes (if there were any.)\n\t\t\t// Read the value -- which can include other\n\t\t\t// elements -- read the end tag, and return.\n\t\t\t++p;\n\t\t\tp = ReadValue( p, data, encoding );\t\t// Note this is an Element method, and will set the error if one happens.\n\t\t\tif ( !p || !*p ) {\n\t\t\t\t// We were looking for the end tag, but found nothing.\n\t\t\t\t// Fix for [ 1663758 ] Failure to report error on bad XML\n\t\t\t\tif ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding );\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// We should find the end tag now\n\t\t\t// note that:\n\t\t\t// </foo > and\n\t\t\t// </foo> \n\t\t\t// are both valid end tags.\n\t\t\tif ( StringEqual( p, endTag.c_str(), false, encoding ) )\n\t\t\t{\n\t\t\t\tp += endTag.length();\n\t\t\t\tp = SkipWhiteSpace( p, encoding );\n\t\t\t\tif ( p && *p && *p == '>' ) {\n\t\t\t\t\t++p;\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\t\t\t\tif ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding );\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding );\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Try to read an attribute:\n\t\t\tTiXmlAttribute* attrib = new TiXmlAttribute();\n\t\t\tif ( !attrib )\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tattrib->SetDocument( document );\n\t\t\tpErr = p;\n\t\t\tp = attrib->Parse( p, data, encoding );\n\n\t\t\tif ( !p || !*p )\n\t\t\t{\n\t\t\t\tif ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, pErr, data, encoding );\n\t\t\t\tdelete attrib;\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Handle the strange case of double attributes:\n\t\t\t#ifdef TIXML_USE_STL\n\t\t\tTiXmlAttribute* node = attributeSet.Find( attrib->NameTStr() );\n\t\t\t#else\n\t\t\tTiXmlAttribute* node = attributeSet.Find( attrib->Name() );\n\t\t\t#endif\n\t\t\tif ( node )\n\t\t\t{\n\t\t\t\tif ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, pErr, data, encoding );\n\t\t\t\tdelete attrib;\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tattributeSet.Add( attrib );\n\t\t}\n\t}\n\treturn p;\n}\n\n\nconst char* TiXmlElement::ReadValue( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )\n{\n\tTiXmlDocument* document = GetDocument();\n\n\t// Read in text and elements in any order.\n\tconst char* pWithWhiteSpace = p;\n\tp = SkipWhiteSpace( p, encoding );\n\n\twhile ( p && *p )\n\t{\n\t\tif ( *p != '<' )\n\t\t{\n\t\t\t// Take what we have, make a text element.\n\t\t\tTiXmlText* textNode = new TiXmlText( \"\" );\n\n\t\t\tif ( !textNode )\n\t\t\t{\n\t\t\t    return 0;\n\t\t\t}\n\n\t\t\tif ( TiXmlBase::IsWhiteSpaceCondensed() )\n\t\t\t{\n\t\t\t\tp = textNode->Parse( p, data, encoding );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Special case: we want to keep the white space\n\t\t\t\t// so that leading spaces aren't removed.\n\t\t\t\tp = textNode->Parse( pWithWhiteSpace, data, encoding );\n\t\t\t}\n\n\t\t\tif ( !textNode->Blank() )\n\t\t\t\tLinkEndChild( textNode );\n\t\t\telse\n\t\t\t\tdelete textNode;\n\t\t} \n\t\telse \n\t\t{\n\t\t\t// We hit a '<'\n\t\t\t// Have we hit a new element or an end tag? This could also be\n\t\t\t// a TiXmlText in the \"CDATA\" style.\n\t\t\tif ( StringEqual( p, \"</\", false, encoding ) )\n\t\t\t{\n\t\t\t\treturn p;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTiXmlNode* node = Identify( p, encoding );\n\t\t\t\tif ( node )\n\t\t\t\t{\n\t\t\t\t\tp = node->Parse( p, data, encoding );\n\t\t\t\t\tLinkEndChild( node );\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpWithWhiteSpace = p;\n\t\tp = SkipWhiteSpace( p, encoding );\n\t}\n\n\tif ( !p )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_READING_ELEMENT_VALUE, 0, 0, encoding );\n\t}\t\n\treturn p;\n}\n\n\n#ifdef TIXML_USE_STL\nvoid TiXmlUnknown::StreamIn( std::istream * in, TIXML_STRING * tag )\n{\n\twhile ( in->good() )\n\t{\n\t\tint c = in->get();\t\n\t\tif ( c <= 0 )\n\t\t{\n\t\t\tTiXmlDocument* document = GetDocument();\n\t\t\tif ( document )\n\t\t\t\tdocument->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\treturn;\n\t\t}\n\t\t(*tag) += (char) c;\n\n\t\tif ( c == '>' )\n\t\t{\n\t\t\t// All is well.\n\t\t\treturn;\t\t\n\t\t}\n\t}\n}\n#endif\n\n\nconst char* TiXmlUnknown::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )\n{\n\tTiXmlDocument* document = GetDocument();\n\tp = SkipWhiteSpace( p, encoding );\n\n\tif ( data )\n\t{\n\t\tdata->Stamp( p, encoding );\n\t\tlocation = data->Cursor();\n\t}\n\tif ( !p || !*p || *p != '<' )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN, p, data, encoding );\n\t\treturn 0;\n\t}\n\t++p;\n    value = \"\";\n\n\twhile ( p && *p && *p != '>' )\n\t{\n\t\tvalue += *p;\n\t\t++p;\n\t}\n\n\tif ( !p )\n\t{\n\t\tif ( document )\t\n\t\t\tdocument->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding );\n\t}\n\tif ( p && *p == '>' )\n\t\treturn p+1;\n\treturn p;\n}\n\n#ifdef TIXML_USE_STL\nvoid TiXmlComment::StreamIn( std::istream * in, TIXML_STRING * tag )\n{\n\twhile ( in->good() )\n\t{\n\t\tint c = in->get();\t\n\t\tif ( c <= 0 )\n\t\t{\n\t\t\tTiXmlDocument* document = GetDocument();\n\t\t\tif ( document )\n\t\t\t\tdocument->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\treturn;\n\t\t}\n\n\t\t(*tag) += (char) c;\n\n\t\tif ( c == '>' \n\t\t\t && tag->at( tag->length() - 2 ) == '-'\n\t\t\t && tag->at( tag->length() - 3 ) == '-' )\n\t\t{\n\t\t\t// All is well.\n\t\t\treturn;\t\t\n\t\t}\n\t}\n}\n#endif\n\n\nconst char* TiXmlComment::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )\n{\n\tTiXmlDocument* document = GetDocument();\n\tvalue = \"\";\n\n\tp = SkipWhiteSpace( p, encoding );\n\n\tif ( data )\n\t{\n\t\tdata->Stamp( p, encoding );\n\t\tlocation = data->Cursor();\n\t}\n\tconst char* startTag = \"<!--\";\n\tconst char* endTag   = \"-->\";\n\n\tif ( !StringEqual( p, startTag, false, encoding ) )\n\t{\n\t\tif ( document )\n\t\t\tdocument->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding );\n\t\treturn 0;\n\t}\n\tp += strlen( startTag );\n\n\t// [ 1475201 ] TinyXML parses entities in comments\n\t// Oops - ReadText doesn't work, because we don't want to parse the entities.\n\t// p = ReadText( p, &value, false, endTag, false, encoding );\n\t//\n\t// from the XML spec:\n\t/*\n\t [Definition: Comments may appear anywhere in a document outside other markup; in addition, \n\t              they may appear within the document type declaration at places allowed by the grammar. \n\t\t\t\t  They are not part of the document's character data; an XML processor MAY, but need not, \n\t\t\t\t  make it possible for an application to retrieve the text of comments. For compatibility, \n\t\t\t\t  the string \"--\" (double-hyphen) MUST NOT occur within comments.] Parameter entity \n\t\t\t\t  references MUST NOT be recognized within comments.\n\n\t\t\t\t  An example of a comment:\n\n\t\t\t\t  <!-- declarations for <head> & <body> -->\n\t*/\n\n    value = \"\";\n\t// Keep all the white space.\n\twhile (\tp && *p && !StringEqual( p, endTag, false, encoding ) )\n\t{\n\t\tvalue.append( p, 1 );\n\t\t++p;\n\t}\n\tif ( p && *p ) \n\t\tp += strlen( endTag );\n\n\treturn p;\n}\n\n\nconst char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )\n{\n\tp = SkipWhiteSpace( p, encoding );\n\tif ( !p || !*p ) return 0;\n\n\tif ( data )\n\t{\n\t\tdata->Stamp( p, encoding );\n\t\tlocation = data->Cursor();\n\t}\n\t// Read the name, the '=' and the value.\n\tconst char* pErr = p;\n\tp = ReadName( p, &name, encoding );\n\tif ( !p || !*p )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding );\n\t\treturn 0;\n\t}\n\tp = SkipWhiteSpace( p, encoding );\n\tif ( !p || !*p || *p != '=' )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );\n\t\treturn 0;\n\t}\n\n\t++p;\t// skip '='\n\tp = SkipWhiteSpace( p, encoding );\n\tif ( !p || !*p )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );\n\t\treturn 0;\n\t}\n\t\n\tconst char* end;\n\tconst char SINGLE_QUOTE = '\\'';\n\tconst char DOUBLE_QUOTE = '\\\"';\n\n\tif ( *p == SINGLE_QUOTE )\n\t{\n\t\t++p;\n\t\tend = \"\\'\";\t\t// single quote in string\n\t\tp = ReadText( p, &value, false, end, false, encoding );\n\t}\n\telse if ( *p == DOUBLE_QUOTE )\n\t{\n\t\t++p;\n\t\tend = \"\\\"\";\t\t// double quote in string\n\t\tp = ReadText( p, &value, false, end, false, encoding );\n\t}\n\telse\n\t{\n\t\t// All attribute values should be in single or double quotes.\n\t\t// But this is such a common error that the parser will try\n\t\t// its best, even without them.\n\t\tvalue = \"\";\n\t\twhile (    p && *p\t\t\t\t\t\t\t\t\t\t\t// existence\n\t\t\t\t&& !IsWhiteSpace( *p )\t\t\t\t\t\t\t\t// whitespace\n\t\t\t\t&& *p != '/' && *p != '>' )\t\t\t\t\t\t\t// tag end\n\t\t{\n\t\t\tif ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) {\n\t\t\t\t// [ 1451649 ] Attribute values with trailing quotes not handled correctly\n\t\t\t\t// We did not have an opening quote but seem to have a \n\t\t\t\t// closing one. Give up and throw an error.\n\t\t\t\tif ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tvalue += *p;\n\t\t\t++p;\n\t\t}\n\t}\n\treturn p;\n}\n\n#ifdef TIXML_USE_STL\nvoid TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag )\n{\n\twhile ( in->good() )\n\t{\n\t\tint c = in->peek();\t\n\t\tif ( !cdata && (c == '<' ) ) \n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif ( c <= 0 )\n\t\t{\n\t\t\tTiXmlDocument* document = GetDocument();\n\t\t\tif ( document )\n\t\t\t\tdocument->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\treturn;\n\t\t}\n\n\t\t(*tag) += (char) c;\n\t\tin->get();\t// \"commits\" the peek made above\n\n\t\tif ( cdata && c == '>' && tag->size() >= 3 ) {\n\t\t\tsize_t len = tag->size();\n\t\t\tif ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) {\n\t\t\t\t// terminator of cdata.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}    \n\t}\n}\n#endif\n\nconst char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )\n{\n\tvalue = \"\";\n\tTiXmlDocument* document = GetDocument();\n\n\tif ( data )\n\t{\n\t\tdata->Stamp( p, encoding );\n\t\tlocation = data->Cursor();\n\t}\n\n\tconst char* const startTag = \"<![CDATA[\";\n\tconst char* const endTag   = \"]]>\";\n\n\tif ( cdata || StringEqual( p, startTag, false, encoding ) )\n\t{\n\t\tcdata = true;\n\n\t\tif ( !StringEqual( p, startTag, false, encoding ) )\n\t\t{\n\t\t\tif ( document )\n\t\t\t\tdocument->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding );\n\t\t\treturn 0;\n\t\t}\n\t\tp += strlen( startTag );\n\n\t\t// Keep all the white space, ignore the encoding, etc.\n\t\twhile (\t   p && *p\n\t\t\t\t&& !StringEqual( p, endTag, false, encoding )\n\t\t\t  )\n\t\t{\n\t\t\tvalue += *p;\n\t\t\t++p;\n\t\t}\n\n\t\tTIXML_STRING dummy; \n\t\tp = ReadText( p, &dummy, false, endTag, false, encoding );\n\t\treturn p;\n\t}\n\telse\n\t{\n\t\tbool ignoreWhite = true;\n\n\t\tconst char* end = \"<\";\n\t\tp = ReadText( p, &value, ignoreWhite, end, false, encoding );\n\t\tif ( p && *p )\n\t\t\treturn p-1;\t// don't truncate the '<'\n\t\treturn 0;\n\t}\n}\n\n#ifdef TIXML_USE_STL\nvoid TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag )\n{\n\twhile ( in->good() )\n\t{\n\t\tint c = in->get();\n\t\tif ( c <= 0 )\n\t\t{\n\t\t\tTiXmlDocument* document = GetDocument();\n\t\t\tif ( document )\n\t\t\t\tdocument->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );\n\t\t\treturn;\n\t\t}\n\t\t(*tag) += (char) c;\n\n\t\tif ( c == '>' )\n\t\t{\n\t\t\t// All is well.\n\t\t\treturn;\n\t\t}\n\t}\n}\n#endif\n\nconst char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding )\n{\n\tp = SkipWhiteSpace( p, _encoding );\n\t// Find the beginning, find the end, and look for\n\t// the stuff in-between.\n\tTiXmlDocument* document = GetDocument();\n\tif ( !p || !*p || !StringEqual( p, \"<?xml\", true, _encoding ) )\n\t{\n\t\tif ( document ) document->SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding );\n\t\treturn 0;\n\t}\n\tif ( data )\n\t{\n\t\tdata->Stamp( p, _encoding );\n\t\tlocation = data->Cursor();\n\t}\n\tp += 5;\n\n\tversion = \"\";\n\tencoding = \"\";\n\tstandalone = \"\";\n\n\twhile ( p && *p )\n\t{\n\t\tif ( *p == '>' )\n\t\t{\n\t\t\t++p;\n\t\t\treturn p;\n\t\t}\n\n\t\tp = SkipWhiteSpace( p, _encoding );\n\t\tif ( StringEqual( p, \"version\", true, _encoding ) )\n\t\t{\n\t\t\tTiXmlAttribute attrib;\n\t\t\tp = attrib.Parse( p, data, _encoding );\t\t\n\t\t\tversion = attrib.Value();\n\t\t}\n\t\telse if ( StringEqual( p, \"encoding\", true, _encoding ) )\n\t\t{\n\t\t\tTiXmlAttribute attrib;\n\t\t\tp = attrib.Parse( p, data, _encoding );\t\t\n\t\t\tencoding = attrib.Value();\n\t\t}\n\t\telse if ( StringEqual( p, \"standalone\", true, _encoding ) )\n\t\t{\n\t\t\tTiXmlAttribute attrib;\n\t\t\tp = attrib.Parse( p, data, _encoding );\t\t\n\t\t\tstandalone = attrib.Value();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Read over whatever it is.\n\t\t\twhile( p && *p && *p != '>' && !IsWhiteSpace( *p ) )\n\t\t\t\t++p;\n\t\t}\n\t}\n\treturn 0;\n}\n\nbool TiXmlText::Blank() const\n{\n\tfor ( unsigned i=0; i<value.length(); i++ )\n\t\tif ( !IsWhiteSpace( value[i] ) )\n\t\t\treturn false;\n\treturn true;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/valuearray.h",
    "content": "/*\n\tCopyright (C) 2008 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _VALUEARRAY_H_\n#define _VALUEARRAY_H_\n\ntemplate<typename T, int N>\nstruct ValueArray\n{\n\tT data[N];\n\tT &operator[](int index) { return data[index]; }\n\tstatic const int size = N;\n\tbool operator!=(ValueArray<T,N> &other) { return !operator==(other); }\n\tbool operator==(ValueArray<T,N> &other)\n\t{\n\t\tfor(int i=0;i<size;i++)\n\t\t\tif(data[i] != other[i])\n\t\t\t\treturn false;\n\t\treturn true;\n\t}\n};\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/vfat.cpp",
    "content": "/*\r\n\tCopyright (C) 2006 yopyop\r\n\tCopyright (C) 2006 Mic\r\n\tCopyright (C) 2010-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include <string>\r\n#include <string.h>\r\n#include <errno.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <stack>\r\n\r\n#include \"../types.h\"\r\n#include \"../debug.h\"\r\n#include \"../fs.h\"\r\n\r\n#include \"emufat.h\"\r\n#include \"vfat.h\"\r\n#include \"libfat/libfat_public_api.h\"\r\n\r\n\r\nenum EListCallbackArg {\r\n\tEListCallbackArg_Item, EListCallbackArg_Pop\r\n};\r\n\r\ntypedef void (*ListCallback)(FsEntry* fs, EListCallbackArg);\r\n\r\n// List all files and subdirectories recursively\r\nstatic void list_files(const char *filepath, ListCallback list_callback)\r\n{\r\n\tchar DirSpec[255+1], SubDir[255+1];\r\n\tFsEntry entry;\r\n\tvoid * hFind;\r\n\tchar *fname;\r\n\tu32 dwError;\r\n\r\n\tstrncpy(DirSpec, filepath, ARRAY_SIZE(DirSpec));\r\n\tDirSpec[255] = 0 ; // hard limit the string here\r\n\r\n\thFind = FsReadFirst(DirSpec, &entry);\r\n\tif (hFind == NULL) return;\r\n\r\n\tdo {\r\n\t\tfname = (strlen(entry.cAlternateFileName)>0) ? entry.cAlternateFileName : entry.cFileName;\r\n\t\tlist_callback(&entry,EListCallbackArg_Item);\r\n\t\tprintf(\"cflash added %s\\n\",entry.cFileName);\r\n\r\n\t\tif ((entry.flags & FS_IS_DIR) && (strcmp(fname, \".\")) && (strcmp(fname, \"..\"))) \r\n\t\t{\r\n\t\t\tif (strlen(fname)+strlen(filepath)+2 < 256) \r\n\t\t\t{\r\n\t\t\t\tsprintf(SubDir, \"%s%c%s\", filepath, FS_SEPARATOR, fname);\r\n\t\t\t\tlist_files(SubDir, list_callback);\r\n\t\t\t\tlist_callback(&entry, EListCallbackArg_Pop);\r\n\t\t\t}\r\n\t\t}\r\n\t} while (FsReadNext(hFind, &entry) != 0);\r\n\r\n\tdwError = FsError();\r\n\tFsClose(hFind);\r\n\tif (dwError != FS_ERR_NO_MORE_FILES) return;\r\n}\r\n\r\nstatic u64 dataSectors = 0;\r\nvoid count_ListCallback(FsEntry* fs, EListCallbackArg arg)\r\n{\r\n\tif(arg == EListCallbackArg_Pop) return;\r\n\tu32 sectors = 1;\r\n\tif(fs->flags & FS_IS_DIR)\r\n\t{\r\n\t}\r\n\telse\r\n\t\tsectors += (fs->fileSize+511)/512 + 1;\r\n\tdataSectors += sectors; \r\n}\r\n\r\nstatic std::string currPath;\r\nstatic std::stack<std::string> pathStack;\r\nstatic std::stack<std::string> virtPathStack;\r\nstatic std::string currVirtPath;\r\nvoid build_ListCallback(FsEntry* fs, EListCallbackArg arg)\r\n{\r\n\tchar* fname = (strlen(fs->cAlternateFileName)>0) ? fs->cAlternateFileName : fs->cFileName;\r\n\r\n\t//we use cFileName always because it is a LFN and we are making sure that we always make a fat32 image\r\n\tfname = fs->cFileName;\r\n\r\n\tif(arg == EListCallbackArg_Pop) \r\n\t{\r\n\t\tcurrPath = pathStack.top();\r\n\t\tpathStack.pop();\r\n\t\tcurrVirtPath = virtPathStack.top();\r\n\t\tvirtPathStack.pop();\r\n\t\treturn;\r\n\t}\r\n\t\r\n\tif(fs->flags & FS_IS_DIR)\r\n\t{\r\n\t\tif(!strcmp(fname,\".\")) return;\r\n\t\tif(!strcmp(fname,\"..\")) return;\r\n\r\n\t\tpathStack.push(currPath);\r\n\t\tvirtPathStack.push(currVirtPath);\r\n\r\n\t\tcurrVirtPath = currVirtPath + \"/\" + fname;\r\n\t\tbool ok = LIBFAT::MkDir(currVirtPath.c_str());\r\n\r\n\t\tif(!ok)\r\n\t\t\tprintf(\"ERROR adding dir %s via libfat\\n\",currVirtPath.c_str());\r\n\r\n\t\tcurrPath = currPath + std::string(1,FS_SEPARATOR) + fname;\r\n\t\treturn;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tstd::string path = currPath + std::string(1,FS_SEPARATOR) + fname;\r\n\r\n\t\tFILE* inf = fopen(path.c_str(),\"rb\");\r\n\t\tif(inf)\r\n\t\t{\r\n\t\t\tfseek(inf,0,SEEK_END);\r\n\t\t\tlong len = ftell(inf);\r\n\t\t\tfseek(inf,0,SEEK_SET);\r\n\t\t\tu8 *buf = new u8[len];\r\n\t\t\tfread(buf,1,len,inf);\r\n\t\t\tfclose(inf);\r\n\r\n\t\t\tstd::string path = currVirtPath + \"/\" + fname;\r\n\t\t\tprintf(\"adding path %s for libfat\\n\",path.c_str());\r\n\t\t\tbool ok = LIBFAT::WriteFile(path.c_str(),buf,len);\r\n\t\t\tif(!ok) \r\n\t\t\t\tprintf(\"ERROR adding file to fat\\n\");\r\n\t\t\tdelete[] buf;\r\n\t\t} else printf(\"ERROR opening file for fat\\n\");\r\n\t}\r\n\t\t\r\n}\r\n\r\n\r\n\r\nbool VFAT::build(const char* path, int extra_MB)\r\n{\r\n\tdataSectors = 0;\r\n\tcurrVirtPath = \"\";\r\n\tcurrPath = path;\r\n\tlist_files(path, count_ListCallback);\r\n\r\n\tdataSectors += 8; //a few for reserved sectors, etc.\r\n\r\n\tdataSectors += extra_MB*1024*1024/512; //add extra write space\r\n\t//dataSectors += 16*1024*1024/512; //add 16MB worth of write space. this is probably enough for anyone, but maybe it should be configurable.\r\n\t//we could always suggest to users to add a big file to their directory to overwrite (that would cause the image to get padded)\r\n\r\n\t//this seems to be the minimum size that will turn into a solid fat32\r\n\tif(dataSectors<36*1024*1024/512)\r\n\t\tdataSectors = 36*1024*1024/512;\r\n\r\n\tif(dataSectors>=(0x80000000>>9))\r\n\t{\r\n\t\tprintf(\"error allocating memory for fat (%d KBytes)\\n\",(dataSectors*512)/1024);\r\n\t\tprintf(\"total fat sizes > 2GB are never going to work\\n\");\r\n\t}\r\n\t\r\n\tdelete file;\r\n\r\n\tfile = new EMUFILE_MEMORY(dataSectors*512);\r\n\r\n\tif(file == NULL)\r\n\t{\r\n\t\tprintf(\"error allocating memory for fat (%d KBytes)\\n\",(dataSectors*512)/1024);\r\n\t\tprintf(\"(out of memory)\\n\");\r\n\t\treturn false;\r\n\t}\r\n\r\n\r\n\t//debug..\r\n\t//file = new EMUFILE_FILE(\"c:\\\\temp.ima\",\"rb+\");\r\n\t\r\n\t//format the disk\r\n\t{\r\n\t\tEmuFat fat(file);\r\n\t\tEmuFatVolume vol;\r\n\t\tu8 ok = vol.init(&fat);\r\n\t\tvol.formatNew(dataSectors);\r\n\r\n\t\t//ensure we are working in memory, just in case we were testing with a disk file.\r\n\t\t//libfat will need to go straight to memory (for now; we could easily change it to work with the disk)\r\n\t\tfile = file->memwrap();\r\n\t}\r\n\tEMUFILE_MEMORY* memf = (EMUFILE_MEMORY*)file;\r\n\r\n\t//setup libfat and write all the files through it\r\n\tLIBFAT::Init(memf->buf(),memf->size());\r\n\tlist_files(path, build_ListCallback);\r\n\tLIBFAT::Shutdown();\r\n\r\n\treturn true;\r\n}\r\n\r\nVFAT::VFAT()\r\n\t: file(NULL)\r\n{\r\n}\r\n\r\nVFAT::~VFAT()\r\n{\r\n\tdelete file;\r\n}\r\n\r\nEMUFILE* VFAT::detach()\r\n{\r\n\tEMUFILE* ret = file;\r\n\tfile = NULL;\r\n\treturn ret;\r\n}"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/vfat.h",
    "content": "/*\r\n\tCopyright (C) 2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#ifndef _VFAT_H\r\n\r\nclass EMUFILE;\r\n\r\n//THIS CLASS IS NOT THREAD SAFE!! SORRY SO SLOPPY\r\nclass VFAT\r\n{\r\npublic:\r\n\tVFAT();\r\n\t~VFAT();\r\n\tbool build(const char* path, int extra_MB=0);\r\n\r\n\tEMUFILE* detach();\r\n\r\nprivate:\r\n\tEMUFILE* file;\r\n};\r\n\r\n#endif //_VFAT_H\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/xstring.cpp",
    "content": "//taken from fceux on 10/27/08\n//subsequently modified for desmume\n\n/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"xstring.h\"\n#include <string>\n\n//a vc-style substring operation (very kind and lenient)\nstd::string strsub(const std::string& str, int pos, int len) {\n\tint strlen = str.size();\n\t\n\tif(strlen==0) return str; //empty strings always return empty strings\n\tif(pos>=strlen) return str; //if you start past the end of the string, return the entire string. this is unusual, but there you have it\n\n\t//clipping\n\tif(pos<0) {\n\t\tlen += pos;\n\t\tpos = 0;\n\t}\n\n\tif (pos+len>=strlen)\n\t\tlen=strlen-pos+1;\n\t\n\t//return str.str().substr(pos,len);\n\treturn str.substr(pos,len);\n}\n\nstd::string strmid(const std::string& str, int pos, int len) { return strsub(str,pos,len); }\nstd::string strleft(const std::string& str, int len) { return strsub(str,0,len); }\nstd::string strright(const std::string& str, int len) { return len ? strsub(str,str.size()-len,len) : \"\"; }\nstd::string toupper(const std::string& str)\n{\n\tstd::string ret = str;\n\tfor(u32 i=0;i<str.size();i++)\n\t\tret[i] = toupper(ret[i]);\n\treturn ret;\n}\n\n///Upper case routine. Returns number of characters modified\nint str_ucase(char *str) {\n\tu32 i=0,j=0;\n\n\twhile (i < strlen(str)) {\n\t\tif ((str[i] >= 'a') && (str[i] <= 'z')) {\n\t\t\tstr[i] &= ~0x20;\n\t\t\tj++;\n\t\t}\n\t\ti++;\n\t}\n\treturn j;\n}\n\n\n///Lower case routine. Returns number of characters modified\nint str_lcase(char *str) {\n\tu32 i=0,j=0;\n\n\twhile (i < strlen(str)) {\n\t\tif ((str[i] >= 'A') && (str[i] <= 'Z')) {\n\t\t\tstr[i] |= 0x20;\n\t\t\tj++;\n\t\t}\n\t\ti++;\n\t}\n\treturn j;\n}\n\n\n///White space-trimming routine\n\n///Removes whitespace from left side of string, depending on the flags set (See STRIP_x definitions in xstring.h)\n///Returns number of characters removed\nint str_ltrim(char *str, int flags) {\n\tu32 i=0;\n\n\twhile (str[0]) {\n\t\tif ((str[0] != ' ') || (str[0] != '\\t') || (str[0] != '\\r') || (str[0] != '\\n')) break;\n\n\t\tif ((flags & STRIP_SP) && (str[0] == ' ')) {\n\t\t\ti++;\n\t\t\tstrcpy(str,str+1);\n\t\t}\n\t\tif ((flags & STRIP_TAB) && (str[0] == '\\t')) {\n\t\t\ti++;\n\t\t\tstrcpy(str,str+1);\n\t\t}\n\t\tif ((flags & STRIP_CR) && (str[0] == '\\r')) {\n\t\t\ti++;\n\t\t\tstrcpy(str,str+1);\n\t\t}\n\t\tif ((flags & STRIP_LF) && (str[0] == '\\n')) {\n\t\t\ti++;\n\t\t\tstrcpy(str,str+1);\n\t\t}\n\t}\n\treturn i;\n}\n\n\n///White space-trimming routine\n\n///Removes whitespace from right side of string, depending on the flags set (See STRIP_x definitions in xstring.h)\n///Returns number of characters removed\nint str_rtrim(char *str, int flags) {\n\tu32 i=0;\n\n\twhile (strlen(str)) {\n\t\tif ((str[strlen(str)-1] != ' ') ||\n\t\t\t(str[strlen(str)-1] != '\\t') ||\n\t\t\t(str[strlen(str)-1] != '\\r') ||\n\t\t\t(str[strlen(str)-1] != '\\n')) break;\n\n\t\tif ((flags & STRIP_SP) && (str[0] == ' ')) {\n\t\t\ti++;\n\t\t\tstr[strlen(str)-1] = 0;\n\t\t}\n\t\tif ((flags & STRIP_TAB) && (str[0] == '\\t')) {\n\t\t\ti++;\n\t\t\tstr[strlen(str)-1] = 0;\n\t\t}\n\t\tif ((flags & STRIP_CR) && (str[0] == '\\r')) {\n\t\t\ti++;\n\t\t\tstr[strlen(str)-1] = 0;\n\t\t}\n\t\tif ((flags & STRIP_LF) && (str[0] == '\\n')) {\n\t\t\ti++;\n\t\t\tstr[strlen(str)-1] = 0;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n///White space-stripping routine\n\n///Removes whitespace depending on the flags set (See STRIP_x definitions in xstring.h)\n///Returns number of characters removed, or -1 on error\nint str_strip(char *str, int flags) {\n\tu32 i=0,j=0;\n\tchar *astr,chr;\n\n\tif (!strlen(str)) return -1;\n\tif (!(flags & (STRIP_SP|STRIP_TAB|STRIP_CR|STRIP_LF))) return -1;\n\tif (!(astr = (char*)malloc(strlen(str)+1))) return -1;\n\twhile (i < strlen(str)) {\n\t\tchr = str[i++];\n\t\tif ((flags & STRIP_SP) && (chr == ' ')) chr = 0;\n\t\tif ((flags & STRIP_TAB) && (chr == '\\t')) chr = 0;\n\t\tif ((flags & STRIP_CR) && (chr == '\\r')) chr = 0;\n\t\tif ((flags & STRIP_LF) && (chr == '\\n')) chr = 0;\n\n\t\tif (chr) astr[j++] = chr;\n\t}\n\tastr[j] = 0;\n\tstrcpy(str,astr);\n\tfree(astr);\n\treturn j;\n}\n\n\n///Character replacement routine\n\n///Replaces all instances of 'search' with 'replace'\n///Returns number of characters modified\nint chr_replace(char *str, char search, char replace) {\n\tu32 i=0,j=0;\n\n\twhile (i < strlen(str)) {\n\t\tif (str[i] == search) {\n\t\t\tstr[i] = replace;\n\t\t\tj++;\n\t\t}\n\t\ti++;\n\t}\n\treturn j;\n}\n\n\n///Sub-String replacement routine\n\n///Replaces all instances of 'search' with 'replace'\n///Returns number of sub-strings modified, or -1 on error\nint str_replace(char *str, char *search, char *replace) {\n\tu32 i=0,j=0;\n\tint searchlen,replacelen;\n\tchar *astr;\n\n\tsearchlen = strlen(search);\n\treplacelen = strlen(replace);\n\tif ((!strlen(str)) || (!searchlen)) return -1; //note: allow *replace to have a length of zero!\n\tif (!(astr = (char*)malloc(strlen(str)+1))) return -1;\n\twhile (i < strlen(str)) {\n\t\tif (!strncmp(str+i,search,searchlen)) {\n\t\t\tif (replacelen) memcpy(astr+j,replace,replacelen);\n\t\t\ti += searchlen;\n\t\t\tj += replacelen;\n\t\t}\n\t\telse astr[j++] = str[i++];\n\t}\n\tastr[j] = 0;\n\tstrcpy(str,astr);\n\tfree(astr);\n\treturn j;\n}\n\nstatic const struct Base64Table\n{\n\tBase64Table()\n\t{\n\t\tsize_t a=0;\n\t\tfor(a=0; a<256; ++a) data[a] = 0xFF; // mark everything as invalid by default\n\t\t// create value->ascii mapping\n\t\ta=0;\n\t\tfor(unsigned char c='A'; c<='Z'; ++c) data[a++] = c; // 0..25\n\t\tfor(unsigned char c='a'; c<='z'; ++c) data[a++] = c; // 26..51\n\t\tfor(unsigned char c='0'; c<='9'; ++c) data[a++] = c; // 52..61\n\t\tdata[62] = '+';                             // 62\n\t\tdata[63] = '/';                             // 63\n\t\t// create ascii->value mapping (but due to overlap, write it to highbit region)\n\t\tfor(a=0; a<64; ++a) data[data[a]^0x80] = a; // \n\t\tdata[((unsigned char)'=') ^ 0x80] = 0;\n\t}\n\tunsigned char operator[] (size_t pos) const { return data[pos]; }\nprivate:\n\tunsigned char data[256];\n} Base64Table;\n\nstd::string u32ToHexString(u32 val)\n{\n\tchar temp[16];\n\tsprintf(temp,\"%08X\",val);\n\treturn temp;\n}\n\n///Converts the provided data to a string in a standard, user-friendly, round-trippable format\nstd::string BytesToString(const void* data, int len)\n{\n\tchar temp[16];\n\tif(len==1) {\n\t\tsprintf(temp,\"%d\",*(const unsigned char*)data);\n\t\treturn temp;\n\t} else if(len==2) {\n\t\tsprintf(temp,\"%d\",*(const unsigned short*)data);\n\t\treturn temp;\n\t} else if(len==4) {\n\t\tsprintf(temp,\"%d\",*(const unsigned int*)data);\n\t\treturn temp;\t\t\n\t}\n\t\n\tstd::string ret;\n\tif(1) // use base64\n\t{\n\t\tconst unsigned char* src = (const unsigned char*)data;\n\t\tret = \"base64:\";\n\t\tfor(int n; len > 0; len -= n)\n\t\t{\n\t\t\tunsigned char input[3] = {0,0,0};\n\t\t\tfor(n=0; n<3 && n<len; ++n)\n\t\t\t\tinput[n] = *src++;\n\t\t\tunsigned char output[4] =\n\t\t\t{\n\t\t\t\tBase64Table[ input[0] >> 2 ],\n\t\t\t\tBase64Table[ ((input[0] & 0x03) << 4) | (input[1] >> 4) ],\n\t\t\t\tn<2 ? '=' : Base64Table[ ((input[1] & 0x0F) << 2) | (input[2] >> 6) ],\n\t\t\t\tn<3 ? '=' : Base64Table[ input[2] & 0x3F ]\n\t\t\t};\n\t\t\tret.append(output, output+4);\n\t\t}\n\t}\n\telse // use hex\n\t{\n\t\tret.resize(len*2+2);\n\t\tret[0] = '0';\n\t\tret[1] = 'x';\n\t\tfor(int i=0;i<len;i++)\n\t\t{\n\t\t\tint a = (((const unsigned char*)data)[i]>>4);\n\t\t\tint b = (((const unsigned char*)data)[i])&15;\n\t\t\tif(a>9) a += 'A'-10;\n\t\t\telse a += '0';\n\t\t\tif(b>9) b += 'A'-10;\n\t\t\telse b += '0';\n\t\t\tret[2+i*2] = a;\n\t\t\tret[2+i*2+1] = b;\n\t\t}\n\t}\n\treturn ret;\n}\n\n///returns -1 if this is not a hex string\nint HexStringToBytesLength(const std::string& str)\n{\n\tif(str.size()>2 && str[0] == '0' && toupper(str[1]) == 'X')\n\t\treturn str.size()/2-1;\n\telse return -1;\n}\n\nint Base64StringToBytesLength(const std::string& str)\n{\n\tif(str.size() < 7 || (str.size()-7) % 4 || str.substr(0,7) != \"base64:\") return -1;\n\t\n\tsize_t c = ((str.size() - 7) / 4) * 3;\n\tif(str[str.size()-1] == '=') { --c;\n\tif(str[str.size()-2] == '=') --c; }\n\treturn c;\n}\n\n///parses a string in the same format as BytesToString\n///returns true if success.\nbool StringToBytes(const std::string& str, void* data, int len)\n{\n\tif(str.substr(0,7) == \"base64:\")\n\t{\n\t\t// base64\n\t\tunsigned char* tgt = (unsigned char*)data;\n\t\tfor(size_t pos = 7; pos < str.size() && len > 0; )\n\t\t{\n\t\t\tunsigned char input[4], converted[4];\n\t\t\tfor(int i=0; i<4; ++i)\n\t\t\t{\n\t\t\t\tif(pos >= str.size() && i > 0) return false; // invalid data\n\t\t\t\tinput[i]\t = str[pos++];\n\t\t\t\tif(input[i] & 0x80) return false;\t  // illegal character\n\t\t\t\tconverted[i] = Base64Table[input[i]^0x80];\n\t\t\t\tif(converted[i] & 0x80) return false; // illegal character\n\t\t\t}\n\t\t\tunsigned char outpacket[3] =\n\t\t\t{\n\t\t\t\t(converted[0] << 2) | (converted[1] >> 4),\n\t\t\t\t(converted[1] << 4) | (converted[2] >> 2),\n\t\t\t\t(converted[2] << 6) | (converted[3])\n\t\t\t};\n\t\t\tint outlen = (input[2] == '=') ? 1 : (input[3] == '=' ? 2 : 3);\n\t\t\tif(outlen > len) outlen = len;\n\t\t\tmemcpy(tgt, outpacket, outlen);\n\t\t\ttgt += outlen;\n\t\t\tlen -= outlen;\n\t\t}\n\t\treturn true;\n\t}\n\tif(str.size()>2 && str[0] == '0' && toupper(str[1]) == 'X')\n\t{\n\t\t// hex\n\t\tint amt = len;\n\t\tint bytesAvailable = str.size()/2;\n\t\tif(bytesAvailable < amt)\n\t\t\tamt = bytesAvailable;\n\t\tconst char* cstr = str.c_str()+2;\n\t\tfor(int i=0;i<amt;i++) {\n\t\t\tchar a = toupper(cstr[i*2]);\n\t\t\tchar b = toupper(cstr[i*2+1]);\n\t\t\tif(a>='A') a=a-'A'+10;\n\t\t\telse a-='0';\n\t\t\tif(b>='A') b=b-'A'+10;\n\t\t\telse b-='0';\n\t\t\tunsigned char val = ((unsigned char)a<<4)|(unsigned char)b; \n\t\t\t((unsigned char*)data)[i] = val;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tif(len==1) {\n\t\tint x = atoi(str.c_str());\n\t\t*(unsigned char*)data = x;\n\t\treturn true;\n\t} else if(len==2) {\n\t\tint x = atoi(str.c_str());\n\t\t*(unsigned short*)data = x;\n\t\treturn true;\n\t} else if(len==4) {\n\t\tint x = atoi(str.c_str());\n\t\t*(unsigned int*)data = x;\n\t\treturn true;\n\t}\n\t//we can't handle it\n\treturn false;\n}\n\n#include <string>\n#include <vector>\n/// \\brief convert input string into vector of string tokens\n///\n/// \\note consecutive delimiters will be treated as single delimiter\n/// \\note delimiters are _not_ included in return data\n///\n/// \\param input string to be parsed\n/// \\param delims list of delimiters.\n\nstd::vector<std::string> tokenize_str(const std::string & str,\n                                      const std::string & delims=\", \\t\")\n{\n  using namespace std;\n  // Skip delims at beginning, find start of first token\n  string::size_type lastPos = str.find_first_not_of(delims, 0);\n  // Find next delimiter @ end of token\n  string::size_type pos     = str.find_first_of(delims, lastPos);\n\n  // output vector\n  vector<string> tokens;\n\n  while (string::npos != pos || string::npos != lastPos)\n    {\n      // Found a token, add it to the vector.\n      tokens.push_back(str.substr(lastPos, pos - lastPos));\n      // Skip delims.  Note the \"not_of\". this is beginning of token\n      lastPos = str.find_first_not_of(delims, pos);\n      // Find next delimiter at end of token.\n      pos     = str.find_first_of(delims, lastPos);\n    }\n\n  return tokens;\n}\n\n//this code was taken from WINE (LGPL)\n//http://google.com/codesearch?hl=en&q=+lang:c+splitpath+show:CPvw9Z-euls:_RSotQzmLeU:KGzljMEYFbY&sa=N&cd=9&ct=rc&cs_p=http://gentoo.osuosl.org/distfiles/Wine-20050524.tar.gz&cs_f=wine-20050524/programs/winefile/splitpath.c\nvoid splitpath(const char* path, char* drv, char* dir, char* name, char* ext)\n{\n    const char* end; /* end of processed string */\n\tconst char* p;\t /* search pointer */\n\tconst char* s;\t /* copy pointer */\n\n\t/* extract drive name */\n\tif (path[0] && path[1]==':') {\n\t\tif (drv) {\n\t\t\t*drv++ = *path++;\n\t\t\t*drv++ = *path++;\n\t\t\t*drv = '\\0';\n\t\t} else path+=2;\n\t} else if (drv)\n\t\t*drv = '\\0';\n\n\t/* search for end of string or stream separator */\n\tfor(end=path; *end && *end!=':'; )\n\t\tend++;\n\n\t/* search for begin of file extension */\n\tfor(p=end; p>path && *--p!='\\\\' && *p!='/'; )\n\t\tif (*p == '.') {\n\t\t\tend = p;\n\t\t\tbreak;\n\t\t}\n\n\tif (ext)\n\t\tfor(s=end; (*ext=*s++); )\n\t\t\text++;\n\telse\n\t\tfor(s=end; *s++; ) {}\n\n\t/* search for end of directory name */\n\tfor(p=end; p>path; )\n\t\tif (*--p=='\\\\' || *p=='/') {\n\t\t\tp++;\n\t\t\tbreak;\n\t\t}\n\n\tif (name) {\n\t\tfor(s=p; s<end; )\n\t\t\t*name++ = *s++;\n\n\t\t*name = '\\0';\n\t} else\n\t\tfor(s=p; s<end; )\n\t\t\t*s++;\n\n\tif (dir) {\n\t\tfor(s=path; s<p; )\n\t\t\t*dir++ = *s++;\n\n\t\t*dir = '\\0';\n\t}\n}\n\n//mbg 5/12/08\n//for the curious, I tested U16ToHexStr and it was 10x faster than printf.\n//so the author of these dedicated functions is not insane, and I will leave them.\n\nstatic char TempArray[11];\n\nuint16 FastStrToU16(char* s, bool& valid)\n{\n\tint i;\n\tuint16 v=0;\n\tfor(i=0; i < 4; i++)\n\t{\n\t\tif(s[i] == 0) return v;\n\t\tv<<=4;\n\t\tif(s[i] >= '0' && s[i] <= '9')\n\t\t{\n\t\t\tv+=s[i]-'0';\n\t\t}\n\t\telse if(s[i] >= 'a' && s[i] <= 'f')\n\t\t{\n\t\t\tv+=s[i]-'a'+10;\n\t\t}\n\t\telse if(s[i] >= 'A' && s[i] <= 'F')\n\t\t{\n\t\t\tv+=s[i]-'A'+10;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvalid = false;\n\t\t\treturn 0xFFFF;\n\t\t}\n\t}\n\tvalid = true;\n\treturn v;\n}\n\nchar *U8ToDecStr(uint8 a)\n{\n\tTempArray[0] = '0' + a/100;\n\tTempArray[1] = '0' + (a%100)/10;\n\tTempArray[2] = '0' + (a%10);\n\tTempArray[3] = 0;\n\treturn TempArray;\n}\n\nchar *U16ToDecStr(uint16 a)\n{\n\tTempArray[0] = '0' + a/10000;\n\tTempArray[1] = '0' + (a%10000)/1000;\n\tTempArray[2] = '0' + (a%1000)/100;\n\tTempArray[3] = '0' + (a%100)/10;\n\tTempArray[4] = '0' + (a%10);\n\tTempArray[5] = 0;\n\treturn TempArray;\n}\n\nchar *U32ToDecStr(char* buf, uint32 a)\n{\n\tbuf[0] = '0' + a/1000000000;\n\tbuf[1] = '0' + (a%1000000000)/100000000;\n\tbuf[2] = '0' + (a%100000000)/10000000;\n\tbuf[3] = '0' + (a%10000000)/1000000;\n\tbuf[4] = '0' + (a%1000000)/100000;\n\tbuf[5] = '0' + (a%100000)/10000;\n\tbuf[6] = '0' + (a%10000)/1000;\n\tbuf[7] = '0' + (a%1000)/100;\n\tbuf[8] = '0' + (a%100)/10;\n\tbuf[9] = '0' + (a%10);\n\tbuf[10] = 0;\n\treturn buf;\n}\nchar *U32ToDecStr(uint32 a)\n{\n\treturn U32ToDecStr(TempArray,a);\n}\n\nchar *U16ToHexStr(uint16 a)\n{\n\tTempArray[0] = a/4096 > 9?'A'+a/4096-10:'0' + a/4096;\n\tTempArray[1] = (a%4096)/256 > 9?'A'+(a%4096)/256 - 10:'0' + (a%4096)/256;\n\tTempArray[2] = (a%256)/16 > 9?'A'+(a%256)/16 - 10:'0' + (a%256)/16;\n\tTempArray[3] = a%16 > 9?'A'+(a%16) - 10:'0' + (a%16);\n\tTempArray[4] = 0;\n\treturn TempArray;\n}\n\nchar *U8ToHexStr(uint8 a)\n{\n\tTempArray[0] = a/16 > 9?'A'+a/16 - 10:'0' + a/16;\n\tTempArray[1] = a%16 > 9?'A'+(a%16) - 10:'0' + (a%16);\n\tTempArray[2] = 0;\n\treturn TempArray;\n}\n\nstd::string stditoa(int n)\n{\n\tchar tempbuf[16];\n\tsprintf(tempbuf, \"%d\", n);\n\treturn tempbuf;\n}\n\n\nstd::string readNullTerminatedAscii(std::istream* is)\n{\n\tstd::string ret;\n\tret.reserve(50);\n\tfor(;;) \n\t{\n\t\tint c = is->get();\n\t\tif(c == 0) break;\n\t\telse ret += (char)c;\n\t}\n\treturn ret;\n}\n\n// replace all instances of victim with replacement\nstd::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement)\n{\n\tstd::string answer = source;\n\tstd::string::size_type j = 0;\n\twhile ((j = answer.find(victim, j)) != std::string::npos )\n\t{\n\t\tanswer.replace(j, victim.length(), replacement);\n\t\tj+= replacement.length();\n\t}\n\treturn answer;\n}\n\n//http://www.codeproject.com/KB/string/UtfConverter.aspx\n#include \"ConvertUTF.h\"\nnamespace UtfConverter\n{\n    static std::wstring FromUtf8(const std::string& utf8string)\n    {\n        size_t widesize = utf8string.length();\n        if (sizeof(wchar_t) == 2)\n        {\n            wchar_t* widestringnative = new wchar_t[widesize+1];\n            const UTF8* sourcestart = reinterpret_cast<const UTF8*>(utf8string.c_str());\n            const UTF8* sourceend = sourcestart + widesize;\n            UTF16* targetstart = reinterpret_cast<UTF16*>(widestringnative);\n            UTF16* targetend = targetstart + widesize+1;\n            ConversionResult res = ConvertUTF8toUTF16(&sourcestart, sourceend, &targetstart, targetend, strictConversion);\n            if (res != conversionOK)\n            {\n                delete [] widestringnative;\n                return L\"\";\n            }\n            *targetstart = 0;\n            std::wstring resultstring(widestringnative);\n            delete [] widestringnative;\n            return resultstring;\n        }\n        else if (sizeof(wchar_t) == 4)\n        {\n            wchar_t* widestringnative = new wchar_t[widesize+1];\n            const UTF8* sourcestart = reinterpret_cast<const UTF8*>(utf8string.c_str());\n            const UTF8* sourceend = sourcestart + widesize;\n            UTF32* targetstart = reinterpret_cast<UTF32*>(widestringnative);\n            UTF32* targetend = targetstart + widesize;\n            ConversionResult res = ConvertUTF8toUTF32(&sourcestart, sourceend, &targetstart, targetend, strictConversion);\n            if (res != conversionOK)\n            {\n                delete [] widestringnative;\n                return L\"\";\n            }\n            *targetstart = 0;\n            std::wstring resultstring(widestringnative);\n            delete [] widestringnative;\n            return resultstring;\n        }\n        else\n        {\n            return L\"\";\n        }\n        return L\"\";\n    }\n\n    static std::string ToUtf8(const std::wstring& widestring)\n    {\n        size_t widesize = widestring.length();\n\n        if (sizeof(wchar_t) == 2)\n        {\n            size_t utf8size = 3 * widesize + 1;\n            char* utf8stringnative = new char[utf8size];\n            const UTF16* sourcestart = reinterpret_cast<const UTF16*>(widestring.c_str());\n            const UTF16* sourceend = sourcestart + widesize;\n            UTF8* targetstart = reinterpret_cast<UTF8*>(utf8stringnative);\n            UTF8* targetend = targetstart + utf8size;\n            ConversionResult res = ConvertUTF16toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion);\n            if (res != conversionOK)\n            {\n                delete [] utf8stringnative;\n                return \"\";\n            }\n            *targetstart = 0;\n            std::string resultstring(utf8stringnative);\n            delete [] utf8stringnative;\n            return resultstring;\n        }\n        else if (sizeof(wchar_t) == 4)\n        {\n            size_t utf8size = 4 * widesize + 1;\n            char* utf8stringnative = new char[utf8size];\n            const UTF32* sourcestart = reinterpret_cast<const UTF32*>(widestring.c_str());\n            const UTF32* sourceend = sourcestart + widesize;\n            UTF8* targetstart = reinterpret_cast<UTF8*>(utf8stringnative);\n            UTF8* targetend = targetstart + utf8size;\n            ConversionResult res = ConvertUTF32toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion);\n            if (res != conversionOK)\n            {\n                delete [] utf8stringnative;\n                return \"\";\n            }\n            *targetstart = 0;\n            std::string resultstring(utf8stringnative);\n            delete [] utf8stringnative;\n            return resultstring;\n        }\n        else\n        {\n            return \"\";\n        }\n        return \"\";\n    }\n}\n  \n//convert a std::string to std::wstring\nstd::wstring mbstowcs(std::string str)\n{\n\treturn UtfConverter::FromUtf8(str);\n}\n\nstd::string wcstombs(std::wstring str)\n{\n\treturn UtfConverter::ToUtf8(str);\n}\n\n\n//TODO - dont we already have another  function that can do this\nstd::string getExtension(const char* input) {\n\tchar buf[1024];\n\tstrcpy(buf,input);\n\tchar* dot=strrchr(buf,'.');\n\tif(!dot)\n\t\treturn \"\";\n\tchar ext [512];\n\tstrcpy(ext, dot+1);\n\tint k, extlen=strlen(ext);\n\tfor(k=0;k<extlen;k++)\n\t\text[k]=tolower(ext[k]);\n\treturn ext;\n}\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/xstring.h",
    "content": "//taken from fceux on 27-oct-2008\n//subsequently modified for desmume\n\n/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _STRINGUTIL_H_\n#define _STRINGUTIL_H_\n\n#include <string>\n#include <string.h>\n#include <stdlib.h>\n#include <vector>\n#include <iostream>\n#include <cstdio>\n\n#include \"../types.h\"\n#include \"../emufile.h\"\n\n//definitions for str_strip() flags\n#define STRIP_SP\t0x01 // space\n#define STRIP_TAB\t0x02 // tab\n#define STRIP_CR\t0x04 // carriage return\n#define STRIP_LF\t0x08 // line feed\n\n\nint str_ucase(char *str);\nint str_lcase(char *str);\nint str_ltrim(char *str, int flags);\nint str_rtrim(char *str, int flags);\nint str_strip(char *str, int flags);\nint chr_replace(char *str, char search, char replace);\nint str_replace(char *str, char *search, char *replace);\n\nstd::string strsub(const std::string& str, int pos, int len);\nstd::string strmid(const std::string& str, int pos, int len);\nstd::string strleft(const std::string& str, int len);\nstd::string strright(const std::string& str, int len);\nstd::string toupper(const std::string& str);\n\nint HexStringToBytesLength(const std::string& str);\nint Base64StringToBytesLength(const std::string& str);\nstd::string u32ToHexString(u32 val);\nstd::string BytesToString(const void* data, int len);\nbool StringToBytes(const std::string& str, void* data, int len);\n\nstd::vector<std::string> tokenize_str(const std::string & str,const std::string & delims);\nvoid splitpath(const char* path, char* drv, char* dir, char* name, char* ext);\n\nuint16 FastStrToU16(char* s, bool& valid);\nchar *U16ToDecStr(uint16 a);\nchar *U32ToDecStr(uint32 a);\nchar *U32ToDecStr(char* buf, uint32 a);\nchar *U8ToDecStr(uint8 a);\nchar *U8ToHexStr(uint8 a);\nchar *U16ToHexStr(uint16 a);\n\nstd::string stditoa(int n);\n\nstd::string readNullTerminatedAscii(std::istream* is);\n\n//extracts a decimal uint from an istream\ntemplate<typename T> T templateIntegerDecFromIstream(EMUFILE* is)\n{\n\tunsigned int ret = 0;\n\tbool pre = true;\n\n\tfor(;;)\n\t{\n\t\tint c = is->fgetc();\n\t\tif(c == -1) return ret;\n\t\tint d = c - '0';\n\t\tif((d<0 || d>9))\n\t\t{\n\t\t\tif(!pre)\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpre = false;\n\t\t\tret *= 10;\n\t\t\tret += d;\n\t\t}\n\t}\n\tis->unget();\n\treturn ret;\n}\n\ninline u32 u32DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream<u32>(is); }\ninline u64 u64DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream<u64>(is); }\n\n//puts an optionally 0-padded decimal integer of type T into the ostream (0-padding is quicker)\ntemplate<typename T, int DIGITS, bool PAD> void putdec(EMUFILE* os, T dec)\n{\n\tchar temp[DIGITS];\n\tint ctr = 0;\n\tfor(int i=0;i<DIGITS;i++)\n\t{\n\t\tint quot = dec/10;\n\t\tint rem = dec%10;\n\t\ttemp[DIGITS-1-i] = '0' + rem;\n\t\tif(!PAD)\n\t\t{\n\t\t\tif(rem != 0) ctr = i;\n\t\t}\n\t\tdec = quot;\n\t}\n\tif(!PAD)\n\t\tos->fwrite(temp+DIGITS-ctr-1,ctr+1);\n\telse\n\t\tos->fwrite(temp,DIGITS);\n}\n\nstd::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement);\n\nstd::wstring mbstowcs(std::string str);\nstd::string wcstombs(std::wstring str);\n\n\n//TODO - dont we already have another  function that can do this\nstd::string getExtension(const char* input);\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/utils/xstring_r7b.h",
    "content": "//taken from fceux on 27-oct-2008\n//subsequently modified for desmume\n\n/*\n\tCopyright (C) 2008-2009 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef _STRINGUTIL_H_\n#define _STRINGUTIL_H_\n\n#include <string>\n#include <string.h>\n#include <stdlib.h>\n#include <vector>\n#include <iostream>\n#include <cstdio>\n\n#include \"../types.h\"\n#include \"../emufile.h\"\n\n#ifdef ANDROID\n//Google makes not supporting wstring a source of pride.\nnamespace std {\ntypedef string wstring;\n}\n#endif\n\n\n//definitions for str_strip() flags\n#define STRIP_SP\t0x01 // space\n#define STRIP_TAB\t0x02 // tab\n#define STRIP_CR\t0x04 // carriage return\n#define STRIP_LF\t0x08 // line feed\n\n\nint str_ucase(char *str);\nint str_lcase(char *str);\nint str_ltrim(char *str, int flags);\nint str_rtrim(char *str, int flags);\nint str_strip(char *str, int flags);\nint chr_replace(char *str, char search, char replace);\nint str_replace(char *str, char *search, char *replace);\n\nstd::string strsub(const std::string& str, int pos, int len);\nstd::string strmid(const std::string& str, int pos, int len);\nstd::string strleft(const std::string& str, int len);\nstd::string strright(const std::string& str, int len);\nstd::string toupper(const std::string& str);\n\nint HexStringToBytesLength(const std::string& str);\nint Base64StringToBytesLength(const std::string& str);\nstd::string u32ToHexString(u32 val);\nstd::string BytesToString(const void* data, int len);\nbool StringToBytes(const std::string& str, void* data, int len);\n\nstd::vector<std::string> tokenize_str(const std::string & str,const std::string & delims);\nvoid splitpath(const char* path, char* drv, char* dir, char* name, char* ext);\n\nuint16 FastStrToU16(char* s, bool& valid);\nchar *U16ToDecStr(uint16 a);\nchar *U32ToDecStr(uint32 a);\nchar *U32ToDecStr(char* buf, uint32 a);\nchar *U8ToDecStr(uint8 a);\nchar *U8ToHexStr(uint8 a);\nchar *U16ToHexStr(uint16 a);\n\nstd::string stditoa(int n);\n\nstd::string readNullTerminatedAscii(std::istream* is);\n\n//extracts a decimal uint from an istream\ntemplate<typename T> T templateIntegerDecFromIstream(EMUFILE* is)\n{\n\tunsigned int ret = 0;\n\tbool pre = true;\n\n\tfor(;;)\n\t{\n\t\tint c = is->fgetc();\n\t\tif(c == -1) return ret;\n\t\tint d = c - '0';\n\t\tif((d<0 || d>9))\n\t\t{\n\t\t\tif(!pre)\n\t\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpre = false;\n\t\t\tret *= 10;\n\t\t\tret += d;\n\t\t}\n\t}\n\tis->unget();\n\treturn ret;\n}\n\ninline u32 u32DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream<u32>(is); }\ninline u64 u64DecFromIstream(EMUFILE* is) { return templateIntegerDecFromIstream<u64>(is); }\n\n//puts an optionally 0-padded decimal integer of type T into the ostream (0-padding is quicker)\ntemplate<typename T, int DIGITS, bool PAD> void putdec(EMUFILE* os, T dec)\n{\n\tchar temp[DIGITS];\n\tint ctr = 0;\n\tfor(int i=0;i<DIGITS;i++)\n\t{\n\t\tint quot = dec/10;\n\t\tint rem = dec%10;\n\t\ttemp[DIGITS-1-i] = '0' + rem;\n\t\tif(!PAD)\n\t\t{\n\t\t\tif(rem != 0) ctr = i;\n\t\t}\n\t\tdec = quot;\n\t}\n\tif(!PAD)\n\t\tos->fwrite(temp+DIGITS-ctr-1,ctr+1);\n\telse\n\t\tos->fwrite(temp,DIGITS);\n}\n\nstd::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement);\n\nstd::wstring mbstowcs(std::string str);\nstd::string wcstombs(std::wstring str);\n\n\n#ifdef ANDROID\nstd::wstring wstringFromWideLiteral(const wchar_t* ptr);\n#define WSTR(X) wstringFromWideLiteral(X)\n#else\n#define WSTR(X) X\n#endif\n\n//TODO - dont we already have another  function that can do this\nstd::string getExtension(const char* input);\n\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/version.cpp",
    "content": "/*\r\n\tCopyright (C) 2009-2012 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include \"types.h\"\r\n#include \"version.h\"\r\n\r\n// Helper macros to convert numerics to strings\r\n#if defined(_MSC_VER)\r\n\t//re: http://72.14.203.104/search?q=cache:HG-okth5NGkJ:mail.python.org/pipermail/python-checkins/2002-November/030704.html+_msc_ver+compiler+version+string&hl=en&gl=us&ct=clnk&cd=5\r\n\t#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X))\r\n\t#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X\r\n\t#define _Py_STRINGIZE2(X) #X\r\n\r\n\t#define TOSTRING(X) _Py_STRINGIZE(X) // Alias _Py_STRINGIZE so that we have a common macro name\r\n#else\r\n\t#define STRINGIFY(x) #x\r\n\t#define TOSTRING(x) STRINGIFY(x)\r\n#endif\r\n\r\n//todo - everyone will want to support this eventually, i suppose\r\n#if (defined(_WINDOWS) && !defined(WXPORT)) || defined(DESMUME_COCOA)\r\n\t#include \"svnrev.h\"\r\n#else\r\n\t#ifdef SVN_REV\r\n\t\t#define SVN_REV_STR SVN_REV\r\n\t#else\r\n\t\t#define SVN_REV_STR \"\"\r\n\t#endif\r\n#endif\r\n\r\n#define DESMUME_NAME \"DeSmuME\"\r\n\r\n#if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) \r\n\t#define DESMUME_PLATFORM_STRING \" x64\"\r\n#elif defined(__i386__) || defined(_M_IX86) || defined(_WIN32)\r\n\t#define DESMUME_PLATFORM_STRING \" x86\"\r\n#elif defined(__arm__)\r\n\t#define DESMUME_PLATFORM_STRING \" ARM\"\r\n#elif defined(__thumb__)\r\n\t#define DESMUME_PLATFORM_STRING \" ARM-Thumb\"\r\n#elif defined(__ppc64__)\r\n\t#define DESMUME_PLATFORM_STRING \" PPC64\"\r\n#elif defined(__ppc__) || defined(_M_PPC)\r\n\t#define DESMUME_PLATFORM_STRING \" PPC\"\r\n#else\r\n\t#define DESMUME_PLATFORM_STRING \"\"\r\n#endif\r\n\r\n#ifndef ENABLE_SSE2\r\n\t#ifndef ENABLE_SSE\r\n\t\t#define DESMUME_CPUEXT_STRING \" NOSSE\"\r\n\t#else\r\n\t\t#define DESMUME_CPUEXT_STRING \" NOSSE2\"\r\n\t#endif\r\n#else\r\n\t#define DESMUME_CPUEXT_STRING \"\"\r\n#endif\r\n\r\n#ifdef DEVELOPER\r\n\t#define DESMUME_FEATURE_STRING \" dev+\"\r\n#else\r\n\t#define DESMUME_FEATURE_STRING \"\"\r\n#endif\r\n\r\n#ifdef DEBUG\r\n\t#define DESMUME_SUBVERSION_STRING \" debug\"\r\n#elif defined(PUBLIC_RELEASE)\r\n\t#define DESMUME_SUBVERSION_STRING \"\"\r\n#else\r\n\t#define DESMUME_SUBVERSION_STRING \" svn\" SVN_REV_STR\r\n#endif\r\n\r\n#ifdef __INTEL_COMPILER\r\n\t#define DESMUME_COMPILER \" (Intel)\"\r\n\t#define DESMUME_COMPILER_DETAIL \" (Intel v\" TOSTRING(__INTEL_COMPILER) \")\"\r\n#elif defined(_MSC_VER)\r\n\t#define DESMUME_COMPILER \" (MSVC)\"\r\n\t#define DESMUME_COMPILER_DETAIL \" (MSVC v\" TOSTRING(_MSC_VER) \")\"\r\n#elif defined(__clang__)\r\n\t#define DESMUME_COMPILER \" (LLVM-Clang)\"\r\n\t#define DESMUME_COMPILER_DETAIL \" (LLVM-Clang v\" TOSTRING(__clang_major__) \".\" TOSTRING(__clang_minor__) \".\" TOSTRING(__clang_patchlevel__) \")\"\r\n#elif defined(__llvm__)\r\n\t#define DESMUME_COMPILER \" (LLVM)\"\r\n\t#define DESMUME_COMPILER_DETAIL \" (LLVM)\"\r\n#elif defined(__GNUC__) // Always make GCC the last check, since other compilers, such as Clang, may define __GNUC__ internally.\r\n\t#define DESMUME_COMPILER \" (GCC)\"\r\n\t\r\n\t#if defined(__GNUC_PATCHLEVEL__)\r\n\t\t#define DESMUME_COMPILER_DETAIL \" (GCC v\" TOSTRING(__GNUC__) \".\" TOSTRING(__GNUC_MINOR__) \".\" TOSTRING(__GNUC_PATCHLEVEL__) \")\"\r\n\t#else\r\n\t\t#define DESMUME_COMPILER_DETAIL \" (GCC v\" TOSTRING(__GNUC__) \".\" TOSTRING(__GNUC_MINOR__) \")\"\r\n\t#endif\r\n#else\r\n\t#define DESMUME_COMPILER \"\"\r\n\t#define DESMUME_COMPILER_DETAIL \"\"\r\n#endif\r\n\r\n#if defined(HAVE_JIT) && !defined(PUBLIC_RELEASE)\r\n\t#define DESMUME_JIT \"-JIT\"\r\n#else\r\n\t#define DESMUME_JIT \"\"\r\n#endif\r\n\r\n#define DESMUME_VERSION_NUMERIC 91000\r\n#define DESMUME_VERSION_STRING \" \" \"0.9.10\" DESMUME_SUBVERSION_STRING DESMUME_FEATURE_STRING DESMUME_PLATFORM_STRING DESMUME_JIT DESMUME_CPUEXT_STRING\r\n#define DESMUME_NAME_AND_VERSION DESMUME_NAME DESMUME_VERSION_STRING\r\n\r\nu32 EMU_DESMUME_VERSION_NUMERIC() { return DESMUME_VERSION_NUMERIC; }\r\nconst char* EMU_DESMUME_VERSION_STRING() { return DESMUME_VERSION_STRING; }\r\nconst char* EMU_DESMUME_NAME_AND_VERSION() { return DESMUME_NAME_AND_VERSION; }\r\nconst char* EMU_DESMUME_COMPILER_DETAIL() { return DESMUME_COMPILER_DETAIL; }\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/version.h",
    "content": "/*\r\n\tCopyright (C) 2009-2011 DeSmuME team\r\n\r\n\tThis file is free software: you can redistribute it and/or modify\r\n\tit under the terms of the GNU General Public License as published by\r\n\tthe Free Software Foundation, either version 2 of the License, or\r\n\t(at your option) any later version.\r\n\r\n\tThis file is distributed in the hope that it will be useful,\r\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n\tGNU General Public License for more details.\r\n\r\n\tYou should have received a copy of the GNU General Public License\r\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n#include <string>\r\n#include \"types.h\"\r\n\r\nu32 EMU_DESMUME_VERSION_NUMERIC();\r\nconst char* EMU_DESMUME_VERSION_STRING();\r\nconst char* EMU_DESMUME_NAME_AND_VERSION();\r\nconst char* EMU_DESMUME_COMPILER_DETAIL();\r\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/wifi.cpp",
    "content": "/*\n\tCopyright (C) 2007 Tim Seidel\n\tCopyright (C) 2008-2012 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include <assert.h>\n#include \"wifi.h\"\n#include \"armcpu.h\"\n#include \"NDSSystem.h\"\n#include \"debug.h\"\n#include \"bits.h\"\n\n\n#ifdef _WINDOWS\n\t#include <winsock2.h> \t \n\t#include <ws2tcpip.h>\n\t#define socket_t    SOCKET \t \n\t#define sockaddr_t  SOCKADDR\n\t#ifndef WXPORT\n\t\t#include \"windriver.h\"\n\t#endif\n\t#define PCAP_DEVICE_NAME description\n#else\n\t#include <unistd.h> \t \n\t#include <stdlib.h> \t \n\t#include <string.h> \t \n\t#include <arpa/inet.h> \t \n\t#include <sys/socket.h> \t \n\t#define socket_t    int \t \n\t#define sockaddr_t  struct sockaddr\n\t#define closesocket close\n\t#define PCAP_DEVICE_NAME name\n#endif\n\n#ifndef INVALID_SOCKET \t \n\t#define INVALID_SOCKET  (socket_t)-1 \t \n#endif \n\n#define BASEPORT 7000\n\nconst u8 BroadcastMAC[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};\n\nbool bWFCUserWarned = false;\n\n#ifdef EXPERIMENTAL_WIFI_COMM\nsocket_t wifi_socket = INVALID_SOCKET;\nsockaddr_t sendAddr;\n#ifndef WIN32\n#include \"pcap/pcap.h\"\n#endif\npcap_t *wifi_bridge = NULL;\n#endif\n\n//sometimes this isnt defined\n#ifndef PCAP_OPENFLAG_PROMISCUOUS\n#define PCAP_OPENFLAG_PROMISCUOUS 1\n#endif\n\nwifimac_t wifiMac;\nSoftAP_t SoftAP;\nint wifi_lastmode;\n\n/*******************************************************************************\n\n\tWIFI TODO\n\n\t- emulate transmission delays for Beacon and Extra transfers\n\t- emulate delays when receiving as well (may need some queuing system)\n\t- take transfer rate and preamble into account\n\t- figure out RFSTATUS and RFPINS\n\n *******************************************************************************/\n\n/*******************************************************************************\n\n\tFirmware info needed for if no firmware image is available\n\tsee: http://www.akkit.org/info/dswifi.htm#WifiInit\n\n\twritten in bytes, to avoid endianess issues\n\n *******************************************************************************/\n\nu8 FW_Mac[6] \t\t\t= { 0x00, 0x09, 0xBF, 0x12, 0x34, 0x56 };\n\nconst u8 FW_WIFIInit[32] \t\t= { 0x02,0x00,  0x17,0x00,  0x26,0x00,  0x18,0x18,\n\t\t\t\t\t\t\t0x48,0x00,  0x40,0x48,  0x58,0x00,  0x42,0x00,\n\t\t\t\t\t\t\t0x40,0x01,  0x64,0x80,  0xE0,0xE0,  0x43,0x24,\n\t\t\t\t\t\t\t0x0E,0x00,  0x32,0x00,  0xF4,0x01,  0x01,0x01 };\nconst u8 FW_BBInit[105] \t\t= { 0x6D, 0x9E, 0x40, 0x05,\n\t\t\t\t\t\t\t0x1B, 0x6C, 0x48, 0x80,\n\t\t\t\t\t\t\t0x38, 0x00, 0x35, 0x07,\n\t\t\t\t\t\t\t0x00, 0x00, 0x00, 0x00,\n\t\t\t\t\t\t\t0x00, 0x00, 0x00, 0x00,\n\t\t\t\t\t\t\t0xb0, 0x00, 0x04, 0x01,\n\t\t\t\t\t\t\t0xd8, 0xff, 0xff, 0xc7,\n\t\t\t\t\t\t\t0xbb, 0x01, 0xb6, 0x7f,\n\t\t\t\t\t\t\t0x5a, 0x01, 0x3f, 0x01,\n\t\t\t\t\t\t\t0x3f, 0x36, 0x36, 0x00,\n\t\t\t\t\t\t\t0x78, 0x28, 0x55, 0x08,\n\t\t\t\t\t\t\t0x28, 0x16, 0x00, 0x01,\n\t\t\t\t\t\t\t0x0e, 0x20, 0x02, 0x98,\n\t\t\t\t\t\t\t0x98, 0x1f, 0x0a, 0x08,\n\t\t\t\t\t\t\t0x04, 0x01, 0x00, 0x00,\n\t\t\t\t\t\t\t0x00, 0xff, 0xff, 0xfe,\n\t\t\t\t\t\t\t0xfe, 0xfe, 0xfe, 0xfc,\n\t\t\t\t\t\t\t0xfa, 0xfa, 0xf8, 0xf8,\n\t\t\t\t\t\t\t0xf6, 0xa5, 0x12, 0x14,\n\t\t\t\t\t\t\t0x12, 0x41, 0x23, 0x03,\n\t\t\t\t\t\t\t0x04, 0x70, 0x35, 0x0E,\n\t\t\t\t\t\t\t0x16, 0x16, 0x00, 0x00,\n\t\t\t\t\t\t\t0x06, 0x01, 0xff, 0xfe,\n\t\t\t\t\t\t\t0xff, 0xff, 0x00, 0x0e,\n\t\t\t\t\t\t\t0x13, 0x00, 0x00, 0x28,\n\t\t\t\t\t\t\t0x1c\n\t\t\t\t\t\t  };\nconst u8 FW_RFInit[36] \t\t= { 0x07, 0xC0, 0x00,\n\t\t\t\t\t\t\t0x03, 0x9C, 0x12,\n\t\t\t\t\t\t\t0x28, 0x17, 0x14,\n\t\t\t\t\t\t\t0xba, 0xe8, 0x1a,\n\t\t\t\t\t\t\t0x6f, 0x45, 0x1d,\n\t\t\t\t\t\t\t0xfa, 0xff, 0x23,\n\t\t\t\t\t\t\t0x30, 0x1d, 0x24,\n\t\t\t\t\t\t\t0x01, 0x00, 0x28,\n\t\t\t\t\t\t\t0x00, 0x00, 0x2c,\n\t\t\t\t\t\t\t0x03, 0x9c, 0x06,\n\t\t\t\t\t\t\t0x22, 0x00, 0x08,\n\t\t\t\t\t\t\t0x6f, 0xff, 0x0d\n\t\t\t\t\t\t  };\nconst u8 FW_RFChannel[6*14]\t= { 0x28, 0x17, 0x14,\t\t/* Channel 1 */\n\t\t\t\t\t\t\t0xba, 0xe8, 0x1a,\t\t\n\t\t\t\t\t\t\t0x37, 0x17, 0x14,\t\t/* Channel 2 */\n\t\t\t\t\t\t\t0x46, 0x17, 0x19,\t\t\n\t\t\t\t\t\t\t0x45, 0x17, 0x14,\t\t/* Channel 3 */\n\t\t\t\t\t\t\t0xd1, 0x45, 0x1b,\t\t\n\t\t\t\t\t\t\t0x54, 0x17, 0x14,\t\t/* Channel 4 */\n\t\t\t\t\t\t\t0x5d, 0x74, 0x19,\t\t\n\t\t\t\t\t\t\t0x62, 0x17, 0x14,\t\t/* Channel 5 */\n\t\t\t\t\t\t\t0xe9, 0xa2, 0x1b,\t\t\n\t\t\t\t\t\t\t0x71, 0x17, 0x14,\t\t/* Channel 6 */\n\t\t\t\t\t\t\t0x74, 0xd1, 0x19,\t\t\n\t\t\t\t\t\t\t0x80, 0x17, 0x14,\t\t/* Channel 7 */\n\t\t\t\t\t\t\t0x00, 0x00, 0x18,\n\t\t\t\t\t\t\t0x8e, 0x17, 0x14,\t\t/* Channel 8 */\n\t\t\t\t\t\t\t0x8c, 0x2e, 0x1a,\n\t\t\t\t\t\t\t0x9d, 0x17, 0x14,\t\t/* Channel 9 */\n\t\t\t\t\t\t\t0x17, 0x5d, 0x18,\n\t\t\t\t\t\t\t0xab, 0x17, 0x14,\t\t/* Channel 10 */\n\t\t\t\t\t\t\t0xa3, 0x8b, 0x1a,\n\t\t\t\t\t\t\t0xba, 0x17, 0x14,\t\t/* Channel 11 */\n\t\t\t\t\t\t\t0x2f, 0xba, 0x18,\n\t\t\t\t\t\t\t0xc8, 0x17, 0x14,\t\t/* Channel 12 */\n\t\t\t\t\t\t\t0xba, 0xe8, 0x1a,\n\t\t\t\t\t\t\t0xd7, 0x17, 0x14,\t\t/* Channel 13 */\n\t\t\t\t\t\t\t0x46, 0x17, 0x19,\n\t\t\t\t\t\t\t0xfa, 0x17, 0x14,\t\t/* Channel 14 */\n\t\t\t\t\t\t\t0x2f, 0xba, 0x18\n\t\t\t\t\t\t  };\nconst u8 FW_BBChannel[14]\t\t= { 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,\t/* channel  1- 6 */\n\t\t\t\t\t\t\t0xb4, 0xb4, 0xb4, 0xb4, 0xb4,\t/* channel  7-10 */ \n\t\t\t\t\t\t\t0xb5, 0xb5,\t\t\t\t\t\t/* channel 11-12 */\n\t\t\t\t\t\t\t0xb6, 0xb6\t\t\t\t\t\t/* channel 13-14 */\n\t\t\t\t\t\t  };\n\nFW_WFCProfile FW_WFCProfile1 = {\"SoftAP\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t{0, 0, 0, 0, 0, 0, 0},\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0}\n\t\t\t\t\t\t\t   };\n\nFW_WFCProfile FW_WFCProfile2 = {\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0xFF,\n\t\t\t\t\t\t\t\t{0, 0, 0, 0, 0, 0, 0},\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0}\n\t\t\t\t\t\t\t   };\n\nFW_WFCProfile FW_WFCProfile3 = {\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0xFF,\n\t\t\t\t\t\t\t\t{0, 0, 0, 0, 0, 0, 0},\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t\t\t\t\t\t\t{0, 0}\n\t\t\t\t\t\t\t   };\n\n/*******************************************************************************\n\n\tCommunication interface\n\n *******************************************************************************/\n\nstruct WifiComInterface\n{\n\tbool (*Init)();\n\tvoid (*DeInit)();\n\tvoid (*Reset)();\n\tvoid (*SendPacket)(u8* packet, u32 len);\n\tvoid (*msTrigger)();\n};\n\n#ifdef EXPERIMENTAL_WIFI_COMM\nbool SoftAP_Init();\nvoid SoftAP_DeInit();\nvoid SoftAP_Reset();\nvoid SoftAP_SendPacket(u8 *packet, u32 len);\nvoid SoftAP_msTrigger();\n\nWifiComInterface CI_SoftAP = {\n\tSoftAP_Init,\n\tSoftAP_DeInit,\n\tSoftAP_Reset,\n\tSoftAP_SendPacket,\n\tSoftAP_msTrigger\n};\n\nbool Adhoc_Init();\nvoid Adhoc_DeInit();\nvoid Adhoc_Reset();\nvoid Adhoc_SendPacket(u8* packet, u32 len);\nvoid Adhoc_msTrigger();\n\nWifiComInterface CI_Adhoc = {\n        Adhoc_Init,\n        Adhoc_DeInit,\n        Adhoc_Reset,\n        Adhoc_SendPacket,\n        Adhoc_msTrigger\n};\n#endif\n\nWifiComInterface* wifiComs[] = {\n#ifdef EXPERIMENTAL_WIFI_COMM\n\t&CI_Adhoc,\n\t&CI_SoftAP,\n#endif\n\tNULL\n};\nWifiComInterface* wifiCom;\n\n/*******************************************************************************\n\n\tLogging\n\n *******************************************************************************/\n\n// 0: disable logging\n// 1: lowest logging, shows most important messages such as errors\n// 2: low logging, shows things such as warnings\n// 3: medium logging, for debugging, shows lots of stuff\n// 4: high logging, for debugging, shows almost everything, may slow down\n// 5: highest logging, for debugging, shows everything, may slow down a lot\n#define WIFI_LOGGING_LEVEL 3\n\n#define WIFI_LOG_USE_LOGC 0\n\n#if (WIFI_LOGGING_LEVEL >= 1)\n\t#if WIFI_LOG_USE_LOGC\n\t\t#define WIFI_LOG(level, ...) if(level <= WIFI_LOGGING_LEVEL) LOGC(8, \"WIFI: \"__VA_ARGS__);\n\t#else\n\t\t#define WIFI_LOG(level, ...) if(level <= WIFI_LOGGING_LEVEL) printf(\"WIFI: \"__VA_ARGS__);\n\t#endif\n#else\n#define WIFI_LOG(level, ...) {}\n#endif\n\n/*******************************************************************************\n\n\tHax\n\n *******************************************************************************/\n\n// TODO: find the right value\n// GBAtek says it is 10s, however that value seems too small\n// (MP host sends floods of data frames, clients can't keep up)\n// 100 would make more sense since CMDCOUNT is set to 166\n// that would be 16.6ms ~= 1 frame\n// however this is guessed, like a lot of the wifi here\n#define WIFI_CMDCOUNT_SLICE 100\n\n/*******************************************************************************\n\n\tHelpers\n\n *******************************************************************************/\n\nINLINE u32 WIFI_alignedLen(u32 len)\n{\n\treturn ((len + 3) & ~3);\n}\n\n// Fast MAC compares\n\nINLINE bool WIFI_compareMAC(u8* a, u8* b)\n{\n\treturn ((*(u32*)&a[0]) == (*(u32*)&b[0])) && ((*(u16*)&a[4]) == (*(u16*)&b[4]));\n}\n\nINLINE bool WIFI_isBroadcastMAC(u8* a)\n{\n\treturn (a[0] & 0x01);\n\t//return ((*(u32*)&a[0]) == 0xFFFFFFFF) && ((*(u16*)&a[4]) == 0xFFFF);\n}\n\n/*******************************************************************************\n\n\tCRC32 (http://www.codeproject.com/KB/recipes/crc32_large.aspx)\n\n *******************************************************************************/\n\nu32 WIFI_CRC32Table[256];\n\nstatic u32 reflect(u32 ref, char ch)\n{\n    u32 value = 0;\n\n    for(int i = 1; i < (ch + 1); i++)\n    {\n        if (ref & 1)\n            value |= 1 << (ch - i);\n        ref >>= 1;\n    } \n\t\n\treturn value;\n}\n\nstatic u32 WIFI_calcCRC32(u8 *data, int len)\n{\n\tu32 crc = 0xFFFFFFFF;\n\n\twhile(len--)\n        crc = (crc >> 8) ^ WIFI_CRC32Table[(crc & 0xFF) ^ *data++];\n\n\treturn (crc ^ 0xFFFFFFFF);\n}\n\nstatic void WIFI_initCRC32Table()\n{\n\tstatic bool initialized = false;\n\tif(initialized) return;\n\tinitialized = true;\n\n\tu32 polynomial = 0x04C11DB7;\n\n\tfor(int i = 0; i < 0x100; i++)\n    {\n        WIFI_CRC32Table[i] = reflect(i, 8) << 24;\n        for(int j = 0; j < 8; j++)\n            WIFI_CRC32Table[i] = (WIFI_CRC32Table[i] << 1) ^ (WIFI_CRC32Table[i] & (1 << 31) ? polynomial : 0);\n        WIFI_CRC32Table[i] = reflect(WIFI_CRC32Table[i],  32);\n    }\n}\n\n/*******************************************************************************\n\n\tRF-Chip\n\n *******************************************************************************/\n\nstatic void WIFI_resetRF(rffilter_t *rf) \n{\n\t/* reinitialize RF chip with the default values refer RF2958 docs */\n\t/* CFG1 */\n\trf->CFG1.bits.IF_VGA_REG_EN = 1;\n\trf->CFG1.bits.IF_VCO_REG_EN = 1;\n\trf->CFG1.bits.RF_VCO_REG_EN = 1;\n\trf->CFG1.bits.HYBERNATE = 0;\n\trf->CFG1.bits.REF_SEL = 0;\n\t/* IFPLL1 */\n\trf->IFPLL1.bits.DAC = 3;\n\trf->IFPLL1.bits.P1 = 0;\n\trf->IFPLL1.bits.LD_EN1 = 0;\n\trf->IFPLL1.bits.AUTOCAL_EN1 = 0;\n\trf->IFPLL1.bits.PDP1 = 1;\n\trf->IFPLL1.bits.CPL1 = 0;\n\trf->IFPLL1.bits.LPF1 = 0;\n\trf->IFPLL1.bits.VTC_EN1 = 1;\n\trf->IFPLL1.bits.KV_EN1 = 0;\n\trf->IFPLL1.bits.PLL_EN1 = 0;\n\t/* IFPLL2 */\n\trf->IFPLL2.bits.IF_N = 0x22;\n\t/* IFPLL3 */\n\trf->IFPLL3.bits.KV_DEF1 = 8;\n\trf->IFPLL3.bits.CT_DEF1 = 7;\n\trf->IFPLL3.bits.DN1 = 0x1FF;\n\t/* RFPLL1 */\n\trf->RFPLL1.bits.DAC = 3;\n\trf->RFPLL1.bits.P = 0;\n\trf->RFPLL1.bits.LD_EN = 0;\n\trf->RFPLL1.bits.AUTOCAL_EN = 0;\n\trf->RFPLL1.bits.PDP = 1;\n\trf->RFPLL1.bits.CPL = 0;\n\trf->RFPLL1.bits.LPF = 0;\n\trf->RFPLL1.bits.VTC_EN = 0;\n\trf->RFPLL1.bits.KV_EN = 0;\n\trf->RFPLL1.bits.PLL_EN = 0;\n\t/* RFPLL2 */\n\trf->RFPLL2.bits.NUM2 = 0;\n\trf->RFPLL2.bits.N2 = 0x5E;\n\t/* RFPLL3 */\n\trf->RFPLL3.bits.NUM2 = 0;\n\t/* RFPLL4 */\n\trf->RFPLL4.bits.KV_DEF = 8;\n\trf->RFPLL4.bits.CT_DEF = 7;\n\trf->RFPLL4.bits.DN = 0x145;\n\t/* CAL1 */\n\trf->CAL1.bits.LD_WINDOW = 2;\n\trf->CAL1.bits.M_CT_VALUE = 8;\n\trf->CAL1.bits.TLOCK = 7;\n\trf->CAL1.bits.TVCO = 0x0F;\n\t/* TXRX1 */\n\trf->TXRX1.bits.TXBYPASS = 0;\n\trf->TXRX1.bits.INTBIASEN = 0;\n\trf->TXRX1.bits.TXENMODE = 0;\n\trf->TXRX1.bits.TXDIFFMODE = 0;\n\trf->TXRX1.bits.TXLPFBW = 2;\n\trf->TXRX1.bits.RXLPFBW = 2;\n\trf->TXRX1.bits.TXVGC = 0;\n\trf->TXRX1.bits.PCONTROL = 0;\n\trf->TXRX1.bits.RXDCFBBYPS = 0;\n\t/* PCNT1 */\n\trf->PCNT1.bits.TX_DELAY = 0;\n\trf->PCNT1.bits.PC_OFFSET = 0;\n\trf->PCNT1.bits.P_DESIRED = 0;\n\trf->PCNT1.bits.MID_BIAS = 0;\n\t/* PCNT2 */\n\trf->PCNT2.bits.MIN_POWER = 0;\n\trf->PCNT2.bits.MID_POWER = 0;\n\trf->PCNT2.bits.MAX_POWER = 0;\n\t/* VCOT1 */\n\trf->VCOT1.bits.AUX1 = 0;\n\trf->VCOT1.bits.AUX = 0;\n}\n\n\nvoid WIFI_setRF_CNT(u16 val)\n{\n\tif (!wifiMac.rfIOStatus.bits.busy)\n\t\twifiMac.rfIOCnt.val = val;\n}\n\nvoid WIFI_setRF_DATA(u16 val, u8 part)\n{\n\tif (!wifiMac.rfIOStatus.bits.busy)\n\t{\n        rfIOData_t *rfreg = (rfIOData_t *)&wifiMac.RF;\n\t\tswitch (wifiMac.rfIOCnt.bits.readOperation)\n\t\t{\n\t\t\tcase 1: /* read from RF chip */\n\t\t\t\t/* low part of data is ignored on reads */\n\t\t\t\t/* on high part, the address is read, and the data at this is written back */\n\t\t\t\tif (part==1)\n\t\t\t\t{\n\t\t\t\t\twifiMac.rfIOData.array16[part] = val;\n\t\t\t\t\tif (wifiMac.rfIOData.bits.address > (sizeof(wifiMac.RF) / 4)) return; /* out of bound */\n\t\t\t\t\t/* get content of the addressed register */\n\t\t\t\t\twifiMac.rfIOData.bits.content = rfreg[wifiMac.rfIOData.bits.address].bits.content;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0: /* write to RF chip */\n\t\t\t\twifiMac.rfIOData.array16[part] = val;\n\t\t\t\tif (wifiMac.rfIOData.bits.address > (sizeof(wifiMac.RF) / 4)) return; /* out of bound */\n\t\t\t\t/* the actual transfer is done on high part write */\n\t\t\t\tif (part==1)\n\t\t\t\t{\n\t\t\t\t\tswitch (wifiMac.rfIOData.bits.address)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 5:\t\t/* write to upper part of the frequency filter */\n\t\t\t\t\t\tcase 6:\t\t/* write to lower part of the frequency filter */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tu32 channelFreqN;\n\t\t\t\t\t\t\t\trfreg[wifiMac.rfIOData.bits.address].bits.content = wifiMac.rfIOData.bits.content;\n\t\t\t\t\t\t\t\t/* get the complete rfpll.n */\n\t\t\t\t\t\t\t\tchannelFreqN = (u32)wifiMac.RF.RFPLL3.bits.NUM2 + ((u32)wifiMac.RF.RFPLL2.bits.NUM2 << 18) + ((u32)wifiMac.RF.RFPLL2.bits.N2 << 24);\n\t\t\t\t\t\t\t\t/* frequency setting is out of range */\n\t\t\t\t\t\t\t\tif (channelFreqN<0x00A2E8BA) return;\n\t\t\t\t\t\t\t\t/* substract base frequency (channel 1) */\n\t\t\t\t\t\t\t\tchannelFreqN -= 0x00A2E8BA;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\t/* special purpose register: TEST1, on write, the RF chip resets */\n\t\t\t\t\t\t\tWIFI_resetRF(&wifiMac.RF);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t/* set content of the addressed register */\n\t\t\t\t\trfreg[wifiMac.rfIOData.bits.address].bits.content = wifiMac.rfIOData.bits.content;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nu16 WIFI_getRF_DATA(u8 part)\n{\n\tif (!wifiMac.rfIOStatus.bits.busy)\n\t\treturn wifiMac.rfIOData.array16[part];\n\telse\n\t\t/* data is not (yet) available */\n\t\treturn 0;\n }\n\nu16 WIFI_getRF_STATUS()\n{\n\treturn wifiMac.rfIOStatus.val;\n}\n\n/*******************************************************************************\n\n\tBB-Chip\n\n *******************************************************************************/\n\nvoid WIFI_setBB_CNT(u16 val)\n{\n\twifiMac.bbIOCnt.val = val;\n\n\tif(wifiMac.bbIOCnt.bits.mode == 1)\n\t\twifiMac.BB.data[wifiMac.bbIOCnt.bits.address] = WIFI_IOREG(REG_WIFI_BBWRITE);\n}\n\nu8 WIFI_getBB_DATA()\n{\n\tif((!wifiMac.bbIOCnt.bits.enable) || (wifiMac.bbIOCnt.bits.mode != 2))\n\t\treturn 0;\n\n\treturn wifiMac.BB.data[wifiMac.bbIOCnt.bits.address];\n}\n\n/*******************************************************************************\n\n\twifimac IO: a lot of the wifi regs are action registers, that are mirrored\n\t\t\t\twithout action, so the default IO via MMU.c does not seem to\n\t\t\t\tbe very suitable\n\n\t\t\t\tall registers are 16 bit\n\n *******************************************************************************/\n\nstatic void WIFI_TXStart(u32 slot);\n\nstatic void WIFI_triggerIRQMask(u16 mask)\n{\n\tu16 oResult,nResult;\n\toResult = wifiMac.IE & wifiMac.IF;\n\twifiMac.IF = wifiMac.IF | (mask & ~0x0400);\n\tnResult = wifiMac.IE & wifiMac.IF;\n\n\tif (!oResult && nResult)\n\t{\n\t\tNDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_ARM7_WIFI);   /* cascade it via arm7 wifi irq */\n\t}\n}\n\nstatic void WIFI_triggerIRQ(u8 irq)\n{\n\tswitch (irq)\n\t{\n\tcase WIFI_IRQ_TXSTART:\n\t\tbreak;\n\tcase WIFI_IRQ_TIMEPREBEACON:\n\t\tif (wifiMac.TXPower & 0x0001)\n\t\t{\n\t\t\t//wifiMac.rfStatus = 1;\n\t\t\t//wifiMac.rfPins = 0x0084;\n\t\t}\n\t\tbreak;\n\tcase WIFI_IRQ_TIMEBEACON:\n\t\twifiMac.BeaconCount1 = wifiMac.BeaconInterval;\n\n\t\tif (wifiMac.ucmpEnable)\n\t\t{\n\t\t\twifiMac.BeaconCount2 = 0xFFFF;\n\t\t\twifiMac.TXCnt &= 0xFFF2;\n\n\t\t\tWIFI_TXStart(WIFI_TXSLOT_BEACON);\n\n\t\t\tif (wifiMac.ListenCount == 0) wifiMac.ListenCount = wifiMac.ListenInterval;\n\t\t\twifiMac.ListenCount--;\n\t\t}\n\t\tbreak;\n\tcase WIFI_IRQ_TIMEPOSTBEACON:\n\t\tif (wifiMac.TXPower & 0x0002)\n\t\t{\n\t\t\t//wifiMac.rfStatus = 9;\n\t\t\t//wifiMac.rfPins = 0x0004;\n\t\t}\n\t\tbreak;\n\tcase WIFI_IRQ_UNK:\n\t\tWIFI_LOG(3, \"IRQ 12 triggered.\\n\");\n\t\tbreak;\n\t}\n\n\tWIFI_triggerIRQMask(1<<irq);\n}\n\n\nbool WIFI_Init()\n{\n\tWIFI_initCRC32Table();\n\twifi_lastmode = -999;\n\tWIFI_Reset();\n\treturn true;\n}\n\nvoid WIFI_DeInit()\n{\n\tif (wifiCom) wifiCom->DeInit();\n}\n\nvoid WIFI_Reset()\n{\n#ifdef EXPERIMENTAL_WIFI_COMM\n\t//memset(&wifiMac, 0, sizeof(wifimac_t));\n\n\tWIFI_resetRF(&wifiMac.RF);\n\n\tmemset(wifiMac.IOPorts, 0, sizeof(wifiMac.IOPorts));\n\n\twifiMac.randomSeed = 1;\n\n\twifiMac.crystalEnabled = FALSE;\n\twifiMac.powerOn = FALSE;\n\twifiMac.powerOnPending = FALSE;\n\n\twifiMac.GlobalUsecTimer = wifiMac.usec = wifiMac.ucmp = 0ULL;\n\t\n\t//wifiMac.rfStatus = 0x0000;\n\t//wifiMac.rfPins = 0x0004;\n\twifiMac.rfStatus = 0x0009;\n\twifiMac.rfPins = 0x00C6;\n\n\tmemset(wifiMac.TXSlots, 0, sizeof(wifiMac.TXSlots));\n\twifiMac.TXCurSlot = -1;\n\twifiMac.TXCnt = wifiMac.TXStat = wifiMac.TXSeqNo = wifiMac.TXBusy = 0;\n\twhile (!wifiMac.RXPacketQueue.empty())\n\t\twifiMac.RXPacketQueue.pop();\n\n\tif((u32)CommonSettings.wifi.mode >= ARRAY_SIZE(wifiComs))\n\t\tCommonSettings.wifi.mode = 0;\n\tif (wifiCom && (wifi_lastmode != CommonSettings.wifi.mode))\n\t\twifiCom->DeInit();\n\twifiCom = wifiComs[CommonSettings.wifi.mode];\n\tif (wifiCom && (wifi_lastmode != CommonSettings.wifi.mode))\n\t\twifiCom->Init();\n\telse if (wifiCom)\n\t\twifiCom->Reset();\n\twifi_lastmode = CommonSettings.wifi.mode;\n\n\tbWFCUserWarned = false;\n#endif\n}\n\n\nINLINE u16 WIFI_GetRXFlags(u8* packet)\n{\n\tu16 ret = 0x0010;\n\tu16 frameCtl = *(u16*)&packet[0];\n\tu32 bssid_offset = 10;\n\n\tframeCtl &= 0xE7FF;\n\n\tswitch(frameCtl & 0x000C)\n\t{\n\tcase 0x0000:  // Management frame\n\t\t{\n\t\t\tbssid_offset = 16;\n\n\t\t\tif ((frameCtl & 0x00F0) == 0x0080)\n\t\t\t\tret |= 0x0001;\n\t\t}\n\t\tbreak;\n\n\tcase 0x0004:  // Control frame\n\t\tret |= 0x0005;\n\t\tbreak;\n\n\tcase 0x0008:  // Data frame\n\t\t{\n\t\t\tswitch (frameCtl & 0x0300)\n\t\t\t{\n\t\t\tcase 0x0000: bssid_offset = 16; break;\n\t\t\tcase 0x0100: bssid_offset = 4; break;\n\t\t\tcase 0x0200: bssid_offset = 10; break;\n\t\t\t}\n\n\t\t\tif (frameCtl == 0x0228)\n\t\t\t\tret |= 0x000C;\n\t\t\telse if (frameCtl == 0x0218)\n\t\t\t\tret |= 0x000D;\n\t\t\telse if (frameCtl == 0x0118)\n\t\t\t\tret |= 0x000E;\n\t\t\telse\n\t\t\t\tret |= 0x0008;\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (frameCtl & 0x0400)\n\t\tret |= 0x0100;\n\n\tif (WIFI_compareMAC(&packet[bssid_offset], &wifiMac.bss.bytes[0]))\n\t\tret |= 0x8000;\n\n\treturn ret;\n}\n\nINLINE void WIFI_MakeRXHeader(u8* buf, u16 flags, u16 xferRate, u16 len, u8 maxRSSI, u8 minRSSI)\n{\n\t*(u16*)&buf[0] = flags;\n\n\t// Unknown, seems to always be 0x0040\n\t// except with from-DS-to-STA data+cfpoll frames (0228)\n\t*(u16*)&buf[2] = ((flags & 0xF) == 0xC) ? 0x0000 : 0x0040;\n\n\t// random (probably left unchanged)\n\t//*(u16*)&buf[4] = 0x0000;\n\n\t*(u16*)&buf[6] = xferRate;\n\t*(u16*)&buf[8] = len;\n\n\t// idk about those, really\n\tbuf[10] = 0x20;//maxRSSI;\n\tbuf[11] = 0xA0;//minRSSI;\n}\n\nstatic void WIFI_RXPutWord(u16 val)\n{\n\t/* abort when RX data queuing is not enabled */\n\tif (!(wifiMac.RXCnt & 0x8000)) return;\n\t/* write the data to cursor position */\n\twifiMac.RAM[wifiMac.RXWriteCursor & 0xFFF] = val;\n\t/* move cursor by one */\n\twifiMac.RXWriteCursor++;\n\t\n\t/* wrap around */\n\tif(wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1))\n\t\twifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1);\n\t\n\twifiMac.RXTXAddr = wifiMac.RXWriteCursor;\n}\n\n#ifdef EXPERIMENTAL_WIFI_COMM\nstatic void WIFI_RXQueuePacket(u8* packet, u32 len)\n{\n\tif (!(wifiMac.RXCnt & 0x8000)) return;\n\n\tWifi_RXPacket pkt;\n\tpkt.Data = packet;\n\tpkt.RemHWords = (len - 11) >> 1;\n\tpkt.CurOffset = 12;\n\tpkt.NotStarted = true;\n\twifiMac.RXPacketQueue.push(pkt);\n}\n#endif\n\ntemplate<int stat> static void WIFI_IncrementRXStat()\n{\n\tu16 bitmasks[] = {\t0x0001, 0, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040,\n\t\t\t\t\t\t0x0080, 0, 0x0100, 0, 0x0200, 0x0400, 0x0800, 0x1000};\n\n\tu16 bitmask = bitmasks[stat];\n\n\twifiMac.RXStat[stat]++;\n\tif (wifiMac.RXStatIncIE & bitmask)\n\t{\n\t\twifiMac.RXStatIncIF |= bitmask;\n\t\tWIFI_triggerIRQ(WIFI_IRQ_RXINC);\n\t}\n\n\tif (wifiMac.RXStat[stat] & 0x80)\n\t{\n\t\tif (wifiMac.RXStatOvfIE & bitmask)\n\t\t{\n\t\t\twifiMac.RXStatOvfIF |= bitmask;\n\t\t\tWIFI_triggerIRQ(WIFI_IRQ_RXOVF);\n\t\t}\n\t}\n}\n\n// TODO: find out if this is correct at all\n// this was mostly guessed, like most of the MP reply functionality\nstatic void WIFI_DoAutoReply(u8* cmd)\n{\n\tcmd += 12;\n\n\tu16 frameCtl = *(u16*)&cmd[0] & 0xE7FF;\n\tif (frameCtl == 0x0228)\n\t{\n\t\t// if the packet we got is a multiplayer command (data+cf-poll),\n\t\t// check if it was destined to us\n\t\tu16 slaveflags = *(u16*)&cmd[24 + 2];\n\t\tif (!(slaveflags & (1 << wifiMac.pid)))\n\t\t\treturn;\n\n\t\t// if it was destined to us, (try to) send a reply\n\t\tu16 regval = WIFI_IOREG(REG_WIFI_TXBUF_REPLY1);\n\t\twifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal = regval;\n\n\t\tregval &= 0x0FFF;\n\t\twifiMac.RAM[regval + 6 + 1] = *(u16*)&cmd[24];\n\n\t\tWIFI_TXStart(WIFI_TXSLOT_MPREPLY);\n\t}\n\t/*else if (frameCtl == 0x0118)\n\t{\n\t\t// broadcast MP ACK\n\t\t// this packet appears to be sent automatically\n\t\t// PS: nope. Enabling this code causes NSMB to break the connection even quicker.\n\t\t// Probably it should send the ACK itself whenever it wants to...\n\n\t\tu8 ack[32];\n\t\t*(u16*)&ack[0] = 0x0218;\n\t\t*(u16*)&ack[2] = 0x0000;\n\t\t*(u16*)&ack[4] = 0x0903;\n\t\t*(u16*)&ack[6] = 0x00BF;\n\t\t*(u16*)&ack[8] = 0x0300;\n\t\tmemcpy(&ack[10], &wifiMac.mac.bytes[0], 6);\n\t\tmemcpy(&ack[16], &wifiMac.mac.bytes[0], 6);\n\t\t*(u16*)&ack[22] = wifiMac.TXSeqNo << 4; wifiMac.TXSeqNo++;\n\t\t*(u16*)&ack[24] = 0x0555; // lol random\n\t\t*(u16*)&ack[26] = 0x0000;\n\t\t*(u32*)&ack[28] = 0x00000000;\n\n\t\twifiCom->SendPacket(ack, 32);\n\t}*/\n}\n\nstatic void WIFI_TXStart(u32 slot)\n{\n\tWIFI_LOG(4, \"TX slot %i trying to send a packet: TXCnt = %04X, TXBufLoc = %04X\\n\", \n\t\tslot, wifiMac.TXCnt, wifiMac.TXSlots[slot].RegVal);\n\n\tu16 reg = wifiMac.TXSlots[slot].RegVal;\n\tif (BIT15(reg))\n\t{\n\t\tu16 address = reg & 0x0FFF;\n\t\tif (address > 0x1000-6)\n\t\t{\n\t\t\tWIFI_LOG(1, \"TX slot %i trying to send a packet overflowing from the TX buffer (address %04X). Attempt ignored.\\n\", \n\t\t\t\tslot, (address << 1));\n\t\t\treturn;\n\t\t}\n\n\t\tu16 txLen = wifiMac.RAM[address+5] & 0x3FFF;\n\t\tif (txLen == 0) // zero length\n\t\t{\n\t\t\tWIFI_LOG(1, \"TX slot %i trying to send a packet with length field set to zero. Attempt ignored.\\n\", \n\t\t\t\tslot);\n\t\t\treturn;\n\t\t}\n\n\t\tu32 timemask = ((wifiMac.RAM[address+4] & 0xFF) == 20) ? 7 : 15;\n\t\t\n\t\twifiMac.TXSlots[slot].CurAddr = address + 6;\n\t\twifiMac.TXSlots[slot].RemHWords = (txLen + 1) >> 1;\n\t\twifiMac.TXSlots[slot].RemPreamble = (BIT2(WIFI_IOREG(REG_WIFI_PREAMBLE)) && (timemask == 7)) ? 96 : 192;\n\t\twifiMac.TXSlots[slot].TimeMask = timemask;\n\t\twifiMac.TXSlots[slot].NotStarted = true;\n\n\t\tif (wifiMac.TXCurSlot < 0)\n\t\t\twifiMac.TXCurSlot = slot;\n\t\twifiMac.TXBusy |= (1 << slot);\n\n\t\t//wifiMac.rfStatus = 3;\n\t\t//wifiMac.rfPins = 0x0046;\n\t}\n}\n\nstatic void WIFI_PreTXAdjustments(u32 slot)\n{\n\tu16 reg = wifiMac.TXSlots[slot].RegVal;\n\tu16 address = reg & 0x0FFF;\n\tu16 txLen = wifiMac.RAM[address+5] & 0x3FFF;\n\n\t// Set sequence number if required\n\tif ((!BIT13(reg)) || (slot == WIFI_TXSLOT_BEACON))\n\t{\n\t\twifiMac.RAM[address + 6 + 11] = wifiMac.TXSeqNo << 4;\n\t\twifiMac.TXSeqNo++;\n\t\t// TODO: find out when this happens (if it actually happens at all)\n\t\t// real-life NSMB multiplayer traffic capture shows no such behavior\n\t\t//if (slot == WIFI_TXSLOT_MPCMD) wifiMac.TXSeqNo++;\n\t}\n\n\t// Set timestamp (for beacons only)\n\tif (slot == WIFI_TXSLOT_BEACON)\n\t{\n\t\t*(u64*)&wifiMac.RAM[address + 6 + 12] = wifiMac.usec;\n\t\t//((u8*)wifiMac.RAM)[((address+6+12)<<1) + WIFI_IOREG(0x84)] = 0x01;\n\t}\n\n\t// TODO: check if this is correct\n\t// this sometimes happens in real world, but not always\n\t/*if (slot == WIFI_TXSLOT_MPREPLY)\n\t{\n\t\twifiMac.RAM[address + 6 + 12] |= 0x8000;\n\t}*/\n\n\t// Calculate and set FCS\n\tu32 crc32 = WIFI_calcCRC32((u8*)&wifiMac.RAM[address + 6], txLen - 4);\n\t*(u32*)&wifiMac.RAM[address + 6 + ((txLen-4) >> 1)] = crc32;\n}\n\nvoid WIFI_write16(u32 address, u16 val)\n{\n\tBOOL action = FALSE;\n\tif (!nds.power2.wifi) return;\n\n\tu32 page = address & 0x7000;\n\n\t// 0x2000 - 0x3FFF: unused\n\tif ((page >= 0x2000) && (page < 0x4000))\n\t\treturn;\n\n\tWIFI_LOG(5, \"Write at address %08X, %04X\\n\", address, val);\n\t/*if (address == 0x04804008 && val == 0x0200)\n\t{\n\t\tprintf(\"WIFI: Write at address %08X, %04X, pc=%08X\\n\", address, val, NDS_ARM7.instruct_adr);\n\t\temu_halt();\n\t}*/\n\n\t// 0x4000 - 0x5FFF: wifi RAM\n\tif ((page >= 0x4000) && (page < 0x6000))\n\t{\n\t\t/* access to the circular buffer */\n\t\taddress &= 0x1FFF;\n\t\t/*if (address >= 0x958 && address < (0x95A)) //address < (0x958+0x2A)) \n\t\t\tprintf(\"PACKET[%04X] = %04X %08X %08X\\n\", \n\t\t\tNDS_ARM7.R[12], val, NDS_ARM7.R[14], NDS_ARM7.R[5]);*/\n        wifiMac.RAM[address >> 1] = val;\n\t\treturn;\n\t}\n\n\t// anything else: I/O ports\n\t// only the first mirror (0x0000 - 0x0FFF) causes a special action\n\tif (page == 0x0000) action = TRUE;\n\n\taddress &= 0x0FFF;\n\tswitch (address)\n\t{\n\t\tcase REG_WIFI_ID:\n\t\t\tbreak;\n\t\tcase REG_WIFI_MODE:\n\t\t\t{\n\t\t\t\tu16 oldval = wifiMac.macMode;\n\n\t\t\t\tif (!BIT0(oldval) && BIT0(val))\n\t\t\t\t{\n\t\t\t\t\tWIFI_IOREG(0x034)\t\t\t\t\t= 0x0002;\n\t\t\t\t\twifiMac.rfPins \t\t\t\t\t\t= 0x0046;\n\t\t\t\t\twifiMac.rfStatus \t\t\t\t\t= 0x0009;\n\t\t\t\t\tWIFI_IOREG(0x27C)\t\t\t\t\t= 0x0005;\n\t\t\t\t}\n\n\t\t\t\tif (BIT0(oldval) && !BIT0(val))\n\t\t\t\t{\n\t\t\t\t\tWIFI_IOREG(0x27C)\t\t \t\t\t= 0x000A;\n\t\t\t\t}\n\n\t\t\t\tif (BIT13(val))\n\t\t\t\t{\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_WRITECSRLATCH) \t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(0x0C0)\t\t \t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(0x0C4)\t\t \t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_MAYBE_RATE)\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(0x278)\t\t \t\t\t= 0x000F;\n\t\t\t\t}\n\n\t\t\t\tif (BIT14(val))\n\t\t\t\t{\n\t\t\t\t\twifiMac.wepMode \t\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.TXStatCnt\t\t\t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_0A)\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.mac.words[0]\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.mac.words[1]\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.mac.words[2]\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.bss.words[0]\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.bss.words[1]\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.bss.words[2]\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.pid\t\t\t\t\t\t\t= 0x0000;\n\t\t\t\t\twifiMac.aid \t\t\t\t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_RETRYLIMIT)\t\t= 0x0707;\n\t\t\t\t\tWIFI_IOREG(0x02E)\t\t \t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_RXRANGEBEGIN)\t= 0x4000;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_RXRANGEEND)\t\t= 0x4800;\n\t\t\t\t\twifiMac.RXRangeBegin\t\t\t\t= 0x0000; // 0x4000\n\t\t\t\t\twifiMac.RXRangeEnd\t\t\t\t\t= 0x0800; // 0x4800\n\t\t\t\t\tWIFI_IOREG(0x084)\t\t\t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_PREAMBLE) \t\t= 0x0001;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_RXFILTER) \t\t= 0x0401;\n\t\t\t\t\tWIFI_IOREG(0x0D4)\t\t\t\t\t= 0x0001;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_RXFILTER2)\t\t= 0x0008;\n\t\t\t\t\tWIFI_IOREG(0x0EC)\t\t \t\t\t= 0x3F03;\n\t\t\t\t\tWIFI_IOREG(0x194)\t\t \t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(0x198) \t\t\t\t\t= 0x0000;\n\t\t\t\t\tWIFI_IOREG(0x1A2)\t\t \t\t\t= 0x0001;\n\t\t\t\t\tWIFI_IOREG(0x224)\t\t \t\t\t= 0x0003;\n\t\t\t\t\tWIFI_IOREG(0x230)\t\t \t\t\t= 0x0047;\n\t\t\t\t}\n\n\t\t\t\twifiMac.macMode = val & 0xAFFF;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase REG_WIFI_WEP:\n\t\t\twifiMac.wepMode = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXSTATCNT:\n\t\t\twifiMac.TXStatCnt = val;\n\t\t\t//printf(\"txstatcnt=%04X\\n\", val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_IE:\n\t\t\twifiMac.IE = val;\n\t\t\t//printf(\"wifi ie write %04X\\n\", val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_IF:\n\t\t\twifiMac.IF &= ~val;\t\t/* clear flagging bits */\n\t\t\tbreak;\n\t\tcase REG_WIFI_MAC0:\n\t\tcase REG_WIFI_MAC1:\n\t\tcase REG_WIFI_MAC2:\n\t\t\twifiMac.mac.words[(address - REG_WIFI_MAC0) >> 1] = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_BSS0:\n\t\tcase REG_WIFI_BSS1:\n\t\tcase REG_WIFI_BSS2:\n\t\t\twifiMac.bss.words[(address - REG_WIFI_BSS0) >> 1] = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_RETRYLIMIT:\n\t\t\twifiMac.retryLimit = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_WEPCNT:\n\t\t\twifiMac.WEP_enable = (val & 0x8000) != 0;\n\t\t\tbreak;\n\t\tcase REG_WIFI_POWERSTATE:\n\t\t\twifiMac.powerOn = ((val & 0x0002)?TRUE:FALSE);\n\t\t\tif(wifiMac.powerOn) WIFI_triggerIRQ(WIFI_IRQ_RFWAKEUP);\n\t\t\tbreak;\n\t\tcase REG_WIFI_POWERFORCE:\n\t\t\tif((val & 0x8000) && (!wifiMac.powerOnPending))\n\t\t\t{\n\t\t\t/*\tBOOL newPower = ((val & 0x0001)?FALSE:TRUE);\n\t\t\t\tif(newPower != wifiMac.powerOn)\n\t\t\t\t{\n\t\t\t\t\tif(!newPower)\n\t\t\t\t\t\twifiMac.powerOn = FALSE;\n\t\t\t\t\telse\n\t\t\t\t\t\twifiMac.powerOnPending = TRUE;\n\t\t\t\t}*/\n\t\t\t\twifiMac.powerOn = ((val & 0x0001) ? FALSE : TRUE);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase REG_WIFI_POWERACK:\n\t\t\tif((val == 0x0000) && wifiMac.powerOnPending)\n\t\t\t{\n\t\t\t\twifiMac.powerOn = TRUE;\n\t\t\t\twifiMac.powerOnPending = FALSE;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase REG_WIFI_POWER_TX:\n\t\t\twifiMac.TXPower = val & 0x0007;\n\t\t\tbreak;\n\t\tcase REG_WIFI_RXCNT:\n\t\t\twifiMac.RXCnt = val & 0xFF0E;\n\t\t\tif (BIT0(val))\n\t\t\t{\n\t\t\t\twifiMac.RXWriteCursor = WIFI_IOREG(REG_WIFI_WRITECSRLATCH);\n\t\t\t\tWIFI_IOREG(REG_WIFI_RXHWWRITECSR) = wifiMac.RXWriteCursor;\n\t\t\t\t//printf(\"latch RX cursor: %04X @ %08X\\n\", wifiMac.RXWriteCursor, NDS_ARM7.instruct_adr);\n\t\t\t}\n\t\t\tif (BIT7(val))\n\t\t\t{\n\t\t\t\tWIFI_LOG(2, \"TXBUF_REPLY=%04X\\n\", WIFI_IOREG(REG_WIFI_TXBUF_REPLY1));\n\t\t\t\twifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal = WIFI_IOREG(REG_WIFI_TXBUF_REPLY1);\n\t\t\t\tWIFI_IOREG(REG_WIFI_TXBUF_REPLY1) = 0x0000;\n\t\t\t}\n\t\t\tif (!BIT15(val))\n\t\t\t{\n\t\t\t\twhile (!wifiMac.RXPacketQueue.empty())\n\t\t\t\t\twifiMac.RXPacketQueue.pop();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase REG_WIFI_RXRANGEBEGIN:\n\t\t\twifiMac.RXRangeBegin = val & 0x1FFE;\n\t\t\tif(wifiMac.RXWriteCursor < (wifiMac.RXRangeBegin >> 1))\n\t\t\t\twifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1);\n\t\t\tbreak;\n\t\tcase REG_WIFI_RXRANGEEND:\n\t\t\twifiMac.RXRangeEnd = val & 0x1FFE;\n\t\t\tif(wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1))\n\t\t\t\twifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1);\n\t\t\tbreak;\n\n\t\tcase REG_WIFI_CIRCBUFRADR:\n\t\t\twifiMac.CircBufReadAddress = (val & 0x1FFE);\n\t\t\tbreak;\n\t\tcase REG_WIFI_RXREADCSR:\n\t\t\twifiMac.RXReadCursor = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_CIRCBUFWADR:\n\t\t\twifiMac.CircBufWriteAddress = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_CIRCBUFWRITE:\n\t\t\t/* set value into the circ buffer, and move cursor to the next hword on action */\n\t\t\t//printf(\"wifi: circbuf fifo write at %04X, %04X (action=%i)\\n\", (wifiMac.CircBufWriteAddress & 0x1FFF), val, action);\n\t\t\twifiMac.RAM[(wifiMac.CircBufWriteAddress >> 1) & 0xFFF] = val;\n\t\t\tif (action)\n\t\t\t{\n\t\t\t\t/* move to next hword */\n                wifiMac.CircBufWriteAddress+=2;\n\t\t\t\tif (wifiMac.CircBufWriteAddress == wifiMac.CircBufWrEnd)\n\t\t\t\t{\n\t\t\t\t\t/* on end of buffer, add skip hwords to it */\n\t\t\t\t\twifiMac.CircBufWrEnd += wifiMac.CircBufWrSkip * 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase REG_WIFI_CIRCBUFWR_SKIP:\n\t\t\twifiMac.CircBufWrSkip = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXBUF_BEACON:\n\t\t\twifiMac.TXSlots[WIFI_TXSLOT_BEACON].RegVal = val;\n\t\t\tif (BIT15(val)) \n\t\t\t\tWIFI_LOG(3, \"Beacon transmission enabled to send the packet at %08X every %i milliseconds.\\n\",\n\t\t\t\t\t0x04804000 + ((val & 0x0FFF) << 1), wifiMac.BeaconInterval);\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXBUF_CMD:\n\t\t\twifiMac.TXSlots[WIFI_TXSLOT_MPCMD].RegVal = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXBUF_LOC1:\n\t\t\t//printf(\"-------- TXBUF_LOC1 = %04X %08X --------\\n\", val, NDS_ARM7.instruct_adr);\n\t\t\twifiMac.TXSlots[WIFI_TXSLOT_LOC1].RegVal = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXBUF_LOC2:\n\t\t\t//printf(\"-------- TXBUF_LOC2 = %04X %08X --------\\n\", val, NDS_ARM7.instruct_adr);\n\t\t\twifiMac.TXSlots[WIFI_TXSLOT_LOC2].RegVal = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXBUF_LOC3:\n\t\t\t//printf(\"-------- TXBUF_LOC3 = %04X %08X --------\\n\", val, NDS_ARM7.instruct_adr);\n\t\t\twifiMac.TXSlots[WIFI_TXSLOT_LOC3].RegVal = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXRESET:\n\t\t\tWIFI_LOG(4, \"Write to TXRESET: %04X\\n\", val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXREQ_RESET:\n\t\t\twifiMac.TXCnt &= ~val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_TXREQ_SET:\n\t\t\t//printf(\"--- TXREQ=%04X ---\\n\", val);\n\t\t\twifiMac.TXCnt |= val;\n\t\t\tif (BIT0(val)) WIFI_TXStart(WIFI_TXSLOT_LOC1);\n\t\t\tif (BIT1(val)) WIFI_TXStart(WIFI_TXSLOT_MPCMD);\n\t\t\tif (BIT2(val)) WIFI_TXStart(WIFI_TXSLOT_LOC2);\n\t\t\tif (BIT3(val)) WIFI_TXStart(WIFI_TXSLOT_LOC3);\n\t\t\tif (val & 0xFFF0) WIFI_LOG(2, \"Unknown TXREQ bits set: %04X\\n\", val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_RFCNT:\n\t\t\tWIFI_setRF_CNT(val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_RFBUSY:\n\t\t\t/* CHECKME: read only? */\n\t\t\tbreak;\n\t\tcase REG_WIFI_RFDATA1:\n\t\t\tWIFI_setRF_DATA(val,0);\n\t\t\tbreak;\n\t\tcase REG_WIFI_RFDATA2:\n\t\t\tWIFI_setRF_DATA(val,1);\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOUNTERCNT:\n\t\t\twifiMac.usecEnable = BIT0(val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOMPARECNT:\n\t\t\twifiMac.ucmpEnable = BIT0(val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOUNTER0:\n\t\t\twifiMac.usec = (wifiMac.usec & 0xFFFFFFFFFFFF0000ULL) | (u64)val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOUNTER1:\n\t\t\twifiMac.usec = (wifiMac.usec & 0xFFFFFFFF0000FFFFULL) | (u64)val << 16;\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOUNTER2:\n\t\t\twifiMac.usec = (wifiMac.usec & 0xFFFF0000FFFFFFFFULL) | (u64)val << 32;\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOUNTER3:\n\t\t\twifiMac.usec = (wifiMac.usec & 0x0000FFFFFFFFFFFFULL) | (u64)val << 48;\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOMPARE0:\n\t\t\twifiMac.ucmp = (wifiMac.ucmp & 0xFFFFFFFFFFFF0000ULL) | (u64)(val & 0xFFFE);\n\t\t\t// in NSMB multiplayer, Luigi sets USCOMPARE to the USCOUNTER of Mario, and sets bit0\n\t\t\t// possibly bit0 writes USCOMPARE into USCOUNTER?\n\t\t\t// it seems to also trigger IRQ14\n\t\t\t// in NSMB, Luigi sends packets on the first attempt only if we trigger IRQ14 here\n\t\t\tif (BIT0(val))\n\t\t\t{\n\t\t\t\t//printf(\"OBSCURE BIT SET @ %08X\\n\", NDS_ARM7.instruct_adr);\n\t\t\t\twifiMac.usec = wifiMac.ucmp;\n\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOMPARE1:\n\t\t\twifiMac.ucmp = (wifiMac.ucmp & 0xFFFFFFFF0000FFFFULL) | (u64)val << 16;\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOMPARE2:\n\t\t\twifiMac.ucmp = (wifiMac.ucmp & 0xFFFF0000FFFFFFFFULL) | (u64)val << 32;\n\t\t\tbreak;\n\t\tcase REG_WIFI_USCOMPARE3:\n\t\t\twifiMac.ucmp = (wifiMac.ucmp & 0x0000FFFFFFFFFFFFULL) | (u64)val << 48;\n\t\t\tbreak;\n\t\tcase REG_WIFI_BEACONPERIOD:\n\t\t\twifiMac.BeaconInterval = val & 0x03FF;\n\t\t\tbreak;\n\t\tcase REG_WIFI_BEACONCOUNT1:\n\t\t\twifiMac.BeaconCount1 = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_BEACONCOUNT2:\n\t\t\twifiMac.BeaconCount2 = val;\n\t\t\tbreak;\n\t\tcase REG_WIFI_BBCNT:\n            WIFI_setBB_CNT(val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_RXBUF_COUNT:\n\t\t\twifiMac.RXBufCount = val & 0x0FFF;\n\t\t\tbreak;\n\t\tcase REG_WIFI_EXTRACOUNTCNT:\n\t\t\twifiMac.eCountEnable = BIT0(val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_EXTRACOUNT:\n\t\t\tWIFI_LOG(3, \"EXTRACOUNT=%i (%i s)\\n\", val, val*WIFI_CMDCOUNT_SLICE);\n\t\t\twifiMac.eCount = (u32)val * WIFI_CMDCOUNT_SLICE;\n\t\t\tbreak;\n\t\tcase REG_WIFI_LISTENINT:\n\t\t\twifiMac.ListenInterval = val & 0x00FF;\n\t\t\tbreak;\n\t\tcase REG_WIFI_LISTENCOUNT:\n\t\t\twifiMac.ListenCount = val & 0x00FF;\n\t\t\tbreak;\n\t\tcase REG_WIFI_POWER_US:\n\t\t\twifiMac.crystalEnabled = !BIT0(val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_IF_SET:\n\t\t\tWIFI_triggerIRQMask(val);\n\t\t\tbreak;\n\t\tcase REG_WIFI_CIRCBUFRD_END:\n\t\t\twifiMac.CircBufRdEnd = (val & 0x1FFE);\n\t\t\tbreak;\n\t\tcase REG_WIFI_CIRCBUFRD_SKIP:\n\t\t\twifiMac.CircBufRdSkip = val & 0xFFF;\n\t\t\tbreak;\n\t\tcase REG_WIFI_AID_LOW:\n\t\t\t//printf(\"AID_LOW = %04X @ %08X %08X\\n\", val, NDS_ARM7.instruct_adr, NDS_ARM7.R[14]);\n\t\t\twifiMac.pid = val & 0x0F;\n\t\t\tbreak;\n\t\tcase REG_WIFI_AID_HIGH:\n\t\t\t//printf(\"AID_HIGH = %04X @ %08X %08X\\n\", val, NDS_ARM7.instruct_adr, NDS_ARM7.R[14]);\n\t\t\twifiMac.aid = val & 0x07FF;\n\t\t\tbreak;\n\t\tcase 0xD0:\n\t\t\t//printf(\"wifi: rxfilter=%04X\\n\", val);\n\t\t\tbreak;\n\t\tcase 0x0E0:\n\t\t\t//printf(\"wifi: rxfilter2=%04X\\n\", val);\n\t\t\tbreak;\n\n\t\tcase 0x84:\n\t\t\t//printf(\"TXBUF_TIM = %04X\\n\", val);\n\t\t\tbreak;\n\n\t\tcase 0x94:\n\t\t\tprintf(\"!!!!! TXBUF_REPLY = %04X !!!!!\\n\", val);\n\t\t\tbreak;\n\n\t\tcase REG_WIFI_RXSTAT_INC_IE: wifiMac.RXStatIncIE = val; break;\n\t\tcase REG_WIFI_RXSTAT_OVF_IE: wifiMac.RXStatOvfIE = val; break;\n\n\t\tcase 0x1A8:\n\t\tcase 0x1AC:\n\t\tcase 0x1B0:\n\t\tcase 0x1B2:\n\t\tcase 0x1B4:\n\t\tcase 0x1B6:\n\t\tcase 0x1B8:\n\t\tcase 0x1BA:\n\t\tcase 0x1BC:\n\t\tcase 0x1BE:\n\t\t\tWIFI_LOG(2, \"Write to RXSTAT register: %03X = %04X\\n\", address, val);\n\t\t\tbreak;\n\n\t\tcase 0x194:\n\t\t\tprintf(\"TX_HDR_CNT = %04X\\n\", val);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tWIFI_IOREG(address) = val;\n}\n\nu16 WIFI_read16(u32 address)\n{\n\tBOOL action = FALSE;\n\tif (!nds.power2.wifi) return 0;\n\n\tu32 page = address & 0x7000;\n\n\t// 0x2000 - 0x3FFF: unused\n\tif ((page >= 0x2000) && (page < 0x4000))\n\t\treturn 0xFFFF;\n\n\tWIFI_LOG(5, \"Read at address %08X\\n\", address);\n\n\t// 0x4000 - 0x5FFF: wifi RAM\n\tif ((page >= 0x4000) && (page < 0x6000))\n\t{\n        return wifiMac.RAM[(address & 0x1FFF) >> 1];\n\t}\n\n\t// anything else: I/O ports\n\t// only the first mirror causes a special action\n\tif (page == 0x0000) action = TRUE;\n\n\taddress &= 0x0FFF;\n\tswitch (address)\n\t{\n\t\tcase REG_WIFI_ID:\n\t\t\treturn WIFI_CHIPID;\n\t\tcase REG_WIFI_MODE:\n\t\t\treturn wifiMac.macMode;\n\t\tcase REG_WIFI_WEP:\n\t\t\treturn wifiMac.wepMode;\n\t\tcase REG_WIFI_IE:\n\t\t\treturn wifiMac.IE;\n\t\tcase REG_WIFI_IF:\n\t\t\treturn wifiMac.IF;\n\t\tcase REG_WIFI_POWERSTATE:\n\t\t\treturn ((wifiMac.powerOn ? 0x0000 : 0x0200) | (wifiMac.powerOnPending ? 0x0102 : 0x0000));\n\t\tcase REG_WIFI_RFDATA1:\n\t\t\treturn WIFI_getRF_DATA(0);\n\t\tcase REG_WIFI_RFDATA2:\n\t\t\treturn WIFI_getRF_DATA(1);\n\t\tcase REG_WIFI_RFBUSY:\n\t\tcase REG_WIFI_BBBUSY:\n\t\t\treturn 0;\t/* we are never busy :p */\n\t\tcase REG_WIFI_BBREAD:\n\t\t\treturn WIFI_getBB_DATA();\n\t\tcase REG_WIFI_RANDOM:\n\t\t\t// probably not right, but it's better than using the unsaved and shared rand().\n\t\t\t// at the very least, rand() shouldn't be used when movieMode is active.\n\t\t\t{\n\t\t\t\tu16 returnValue = wifiMac.randomSeed;\n\t\t\t\twifiMac.randomSeed = (wifiMac.randomSeed & 1) ^ (((wifiMac.randomSeed << 1) & 0x7FE) | ((wifiMac.randomSeed >> 10) & 0x1));\n\t\t\t\treturn returnValue;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\tcase REG_WIFI_MAC0:\n\t\tcase REG_WIFI_MAC1:\n\t\tcase REG_WIFI_MAC2:\n\t\t\treturn wifiMac.mac.words[(address - REG_WIFI_MAC0) >> 1];\n\t\tcase REG_WIFI_BSS0:\n\t\tcase REG_WIFI_BSS1:\n\t\tcase REG_WIFI_BSS2:\n\t\t\treturn wifiMac.bss.words[(address - REG_WIFI_BSS0) >> 1];\n\t\tcase REG_WIFI_RXCNT:\n\t\t\treturn wifiMac.RXCnt;\n\t\tcase REG_WIFI_CIRCBUFREAD:\n\t\t\t{\n\t\t\t\tu16 val = wifiMac.RAM[wifiMac.CircBufReadAddress >> 1];\n\t\t\t\tif (action)\n\t\t\t\t{\n\t\t\t\t\twifiMac.CircBufReadAddress += 2;\n\n\t\t\t\t\tif (wifiMac.CircBufReadAddress >= wifiMac.RXRangeEnd) \n\t\t\t\t\t{ \n\t\t\t\t\t\twifiMac.CircBufReadAddress = wifiMac.RXRangeBegin;\n\t\t\t\t\t} \n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/* skip does not fire after a reset */\n\t\t\t\t\t\tif (wifiMac.CircBufReadAddress == wifiMac.CircBufRdEnd)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twifiMac.CircBufReadAddress += wifiMac.CircBufRdSkip * 2;\n\t\t\t\t\t\t\twifiMac.CircBufReadAddress &= 0x1FFE;\n\t\t\t\t\t\t\tif (wifiMac.CircBufReadAddress + wifiMac.RXRangeBegin == wifiMac.RXRangeEnd) wifiMac.CircBufReadAddress = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (wifiMac.RXBufCount > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (wifiMac.RXBufCount == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_RXCOUNTEXP);\n\t\t\t\t\t\t}\n\t\t\t\t\t\twifiMac.RXBufCount--;\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\n\t\t\t\treturn val;\n\t\t\t}\n\t\tcase REG_WIFI_CIRCBUFRADR:\n\t\t\treturn wifiMac.CircBufReadAddress;\n\t\tcase REG_WIFI_RXBUF_COUNT:\n\t\t\treturn wifiMac.RXBufCount;\n\t\tcase REG_WIFI_TXREQ_READ:\n\t\t\treturn wifiMac.TXCnt | 0x10;\n\t\tcase REG_WIFI_TXBUSY:\n\t\t\treturn wifiMac.TXBusy;\n\t\tcase REG_WIFI_TXSTAT:\n\t\t\treturn wifiMac.TXStat;\n\t\tcase REG_WIFI_TXBUF_CMD:\n\t\t\treturn wifiMac.TXSlots[WIFI_TXSLOT_MPCMD].RegVal;\n\t\tcase REG_WIFI_TXBUF_REPLY2:\n\t\t\treturn wifiMac.TXSlots[WIFI_TXSLOT_MPREPLY].RegVal;\n\t\tcase REG_WIFI_TXBUF_LOC1:\n\t\t\treturn wifiMac.TXSlots[WIFI_TXSLOT_LOC1].RegVal;\n\t\tcase REG_WIFI_TXBUF_LOC2:\n\t\t\treturn wifiMac.TXSlots[WIFI_TXSLOT_LOC2].RegVal;\n\t\tcase REG_WIFI_TXBUF_LOC3:\n\t\t\treturn wifiMac.TXSlots[WIFI_TXSLOT_LOC3].RegVal;\n\t\tcase REG_WIFI_TXBUF_BEACON:\n\t\t\treturn wifiMac.TXSlots[WIFI_TXSLOT_BEACON].RegVal;\n\t\tcase REG_WIFI_EXTRACOUNTCNT:\n\t\t\treturn wifiMac.eCountEnable?1:0;\n\t\tcase REG_WIFI_EXTRACOUNT:\n\t\t\treturn (u16)((wifiMac.eCount + (WIFI_CMDCOUNT_SLICE-1)) / WIFI_CMDCOUNT_SLICE);\n\t\tcase REG_WIFI_USCOUNTER0:\n\t\t\treturn (u16)wifiMac.usec;\n\t\tcase REG_WIFI_USCOUNTER1:\n\t\t\treturn (u16)(wifiMac.usec >> 16);\n\t\tcase REG_WIFI_USCOUNTER2:\n\t\t\treturn (u16)(wifiMac.usec >> 32);\n\t\tcase REG_WIFI_USCOUNTER3:\n\t\t\treturn (u16)(wifiMac.usec >> 48);\n\t\tcase REG_WIFI_USCOMPARE0:\n\t\t\treturn (u16)wifiMac.ucmp;\n\t\tcase REG_WIFI_USCOMPARE1:\n\t\t\treturn (u16)(wifiMac.ucmp >> 16);\n\t\tcase REG_WIFI_USCOMPARE2:\n\t\t\treturn (u16)(wifiMac.ucmp >> 32);\n\t\tcase REG_WIFI_USCOMPARE3:\n\t\t\treturn (u16)(wifiMac.ucmp >> 48);\n\t\tcase REG_WIFI_BEACONCOUNT1:\n\t\t\treturn wifiMac.BeaconCount1;\n\t\tcase REG_WIFI_BEACONCOUNT2:\n\t\t\treturn wifiMac.BeaconCount2;\n\t\tcase REG_WIFI_LISTENCOUNT:\n\t\t\treturn wifiMac.ListenCount;\n\t\tcase REG_WIFI_POWER_US:\n\t\t\treturn wifiMac.crystalEnabled?0:1;\n\t\tcase REG_WIFI_CIRCBUFRD_END:\n\t\t\treturn wifiMac.CircBufRdEnd;\n\t\tcase REG_WIFI_CIRCBUFRD_SKIP:\n\t\t\treturn wifiMac.CircBufRdSkip;\n\t\tcase REG_WIFI_AID_LOW:\n\t\t\treturn wifiMac.pid;\n\t\tcase REG_WIFI_AID_HIGH:\n\t\t\treturn wifiMac.aid;\n\n\t\t\t// RFSTATUS, RFPINS\n\t\t\t// TODO: figure out how to emulate those correctly\n\t\t\t// without breaking Nintendo's games\n\t\tcase REG_WIFI_RFSTATUS:\n\t\t\treturn wifiMac.rfStatus;\n\t\t\t//return 9;\n\t\tcase REG_WIFI_RFPINS:\n\t\t\treturn wifiMac.rfPins;\n\t\t\t//return 0x00C6;\n\n\t\tcase REG_WIFI_RXSTAT_INC_IF:\n\t\t\t{\n\t\t\t\tu16 ret = wifiMac.RXStatIncIF;\n\t\t\t\twifiMac.RXStatIncIF = 0;\n\t\t\t\treturn ret;\n\t\t\t}\n\t\tcase REG_WIFI_RXSTAT_OVF_IF:\n\t\t\t{\n\t\t\t\tu16 ret = wifiMac.RXStatOvfIF;\n\t\t\t\twifiMac.RXStatOvfIF = 0;\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\tcase REG_WIFI_RXSTAT_INC_IE: return wifiMac.RXStatIncIE;\n\t\tcase REG_WIFI_RXSTAT_OVF_IE: return wifiMac.RXStatOvfIE;\n\n\t\tcase 0x1B0:\n\t\tcase 0x1B2:\n\t\tcase 0x1B4:\n\t\tcase 0x1B6:\n\t\tcase 0x1B8:\n\t\tcase 0x1BA:\n\t\tcase 0x1BC:\n\t\tcase 0x1BE:\n\t\t\t{\n\t\t\t\tu16 ret = *(u16*)&wifiMac.RXStat[address & 0xF];\n\t\t\t\t*(u16*)&wifiMac.RXStat[address & 0xF] = 0;\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\tcase REG_WIFI_RXTXADDR:\n\t\t\treturn wifiMac.RXTXAddr;\n\n\t\tcase 0x84:\n\t\t\tWIFI_LOG(2, \"Read to TXBUF_TIM @ %08X %08X\\n\", NDS_ARM7.instruct_adr, NDS_ARM7.R[14]);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t//\tprintf(\"wifi: read unhandled reg %03X\\n\", address);\n\t\t\tbreak;\n\t}\n\n\treturn WIFI_IOREG(address);\n}\n\n\nvoid WIFI_usTrigger()\n{\n\twifiMac.GlobalUsecTimer++;\n\n\tif (wifiMac.crystalEnabled)\n\t{\n\t\t/* a usec has passed */\n\t\tif (wifiMac.usecEnable)\n\t\t\twifiMac.usec++;\n\n\t\t// Note: the extra counter is decremented every 10 microseconds.\n\t\t// To avoid a modulo every microsecond, we multiply the counter\n\t\t// value by 10 and decrement it every microsecond :)\n\t\tif (wifiMac.eCountEnable)\n\t\t{\n\t\t\tif (wifiMac.eCount > 0)\n\t\t\t{\n\t\t\t\twifiMac.eCount--;\n\t\t\t\tif (wifiMac.eCount == 0)\n\t\t\t\t\tWIFI_TXStart(WIFI_TXSLOT_MPCMD);\n\t\t\t}\n\t\t}\n\n\t\t// The beacon counters are in milliseconds\n\t\t// GBATek says they're decremented every 1024 usecs\n\t\tif (!(wifiMac.usec & 1023))\n\t\t{\n\t\t\twifiMac.BeaconCount1--;\n\n\t\t\tif (wifiMac.BeaconCount1 == (WIFI_IOREG(REG_WIFI_PREBEACONCOUNT) >> 10))\n\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TIMEPREBEACON);\n\t\t\telse if (wifiMac.BeaconCount1 == 0)\n\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON);\n\n\t\t\tif (wifiMac.BeaconCount2 > 0)\n\t\t\t{\n\t\t\t\twifiMac.BeaconCount2--;\n\t\t\t\tif (wifiMac.BeaconCount2 == 0)\n\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TIMEPOSTBEACON);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ((wifiMac.ucmpEnable) && (wifiMac.ucmp == wifiMac.usec))\n\t\tWIFI_triggerIRQ(WIFI_IRQ_TIMEBEACON);\n\n\tif (wifiMac.TXCurSlot >= 0)\n\t{\n\t\tWifi_TXSlot& slot = wifiMac.TXSlots[wifiMac.TXCurSlot];\n\t\tif (slot.RemPreamble > 0)\n\t\t\tslot.RemPreamble--;\n\t\telse if ((wifiMac.GlobalUsecTimer & slot.TimeMask) == 0)\n\t\t{\n\t\t\tif (slot.NotStarted)\n\t\t\t{\n\t\t\t\tWIFI_PreTXAdjustments(wifiMac.TXCurSlot);\n\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TXSTART);\n\t\t\t\tif (wifiCom) wifiCom->SendPacket((u8*)&wifiMac.RAM[slot.CurAddr], slot.RemHWords << 1);\n\t\t\t\tslot.NotStarted = false;\n\t\t\t}\n\n\t\t\tslot.RemHWords--;\n\t\t\tslot.CurAddr++;\n\t\t\twifiMac.RXTXAddr = slot.CurAddr;\n\n\t\t\tif (slot.RemHWords == 0)\n\t\t\t{\n\t\t\t\tif (wifiMac.TXCurSlot == WIFI_TXSLOT_MPCMD)\n\t\t\t\t{\n\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_UNK);\n\t\t\t\t\tif (BIT13(wifiMac.TXStatCnt))\n\t\t\t\t\t{\n\t\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TXEND);\n\t\t\t\t\t\twifiMac.TXStat = 0x0B01;\n\t\t\t\t\t}\n\t\t\t\t\telse if (BIT14(wifiMac.TXStatCnt))\n\t\t\t\t\t{\n\t\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TXEND);\n\t\t\t\t\t\twifiMac.TXStat = 0x0801;\n\t\t\t\t\t}\n\n\t\t\t\t\tslot.RegVal &= 0x7FFF;\n\t\t\t\t}\n\t\t\t\telse if (wifiMac.TXCurSlot == WIFI_TXSLOT_BEACON)\n\t\t\t\t{\n\t\t\t\t\tif (BIT15(wifiMac.TXStatCnt))\n\t\t\t\t\t{\n\t\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TXEND);\n\t\t\t\t\t\twifiMac.TXStat = 0x0301;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (wifiMac.TXCurSlot == WIFI_TXSLOT_MPREPLY)\n\t\t\t\t{\n\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TXEND);\n\t\t\t\t\tslot.RegVal &= 0x7FFF;\n\t\t\t\t\tWIFI_IOREG(REG_WIFI_TXBUF_REPLY1) = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_TXEND);\n\t\t\t\t\twifiMac.TXStat = 0x0001 | (wifiMac.TXCurSlot == 0 ? 0 : ((wifiMac.TXCurSlot - 1) << 12));\n\t\t\t\t\tif (BIT12(slot.RegVal)) wifiMac.TXStat |= 0x0700;\n\n\t\t\t\t\tslot.RegVal &= 0x7FFF;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tu16 addr = slot.RegVal & 0x0FFF;\n\t\t\t\twifiMac.RAM[addr] = 0x0001;\n\t\t\t\twifiMac.RAM[addr+4] &= 0x00FF;\n\n\t\t\t\twifiMac.TXBusy &= ~(1 << wifiMac.TXCurSlot);\n\t\t\t\tint nextslot = -1;\n\t\t\t\tfor (int i = WIFI_TXSLOT_NUM-1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tif (BIT_N(wifiMac.TXBusy, i))\n\t\t\t\t\t{\n\t\t\t\t\t\tnextslot = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextslot < 0)\n\t\t\t\t{\n\t\t\t\t\t//wifiMac.rfStatus = 9;\n\t\t\t\t\t//wifiMac.rfPins = 0x00C6;\n\t\t\t\t\twifiMac.TXCurSlot = -1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twifiMac.TXCurSlot = nextslot;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (!wifiMac.RXPacketQueue.empty())\n\t{\n\t\tif ((wifiMac.GlobalUsecTimer & 7) == 0)\n\t\t{\n\t\t\tWifi_RXPacket& pkt = wifiMac.RXPacketQueue.front();\n\t\t\tif (pkt.NotStarted)\n\t\t\t{\n\t\t\t\tWIFI_RXPutWord(*(u16*)&pkt.Data[0]);\n\t\t\t\tWIFI_RXPutWord(*(u16*)&pkt.Data[2]);\n\t\t\t\tWIFI_RXPutWord(*(u16*)&pkt.Data[4]);\n\t\t\t\tWIFI_RXPutWord(*(u16*)&pkt.Data[6]);\n\t\t\t\tWIFI_RXPutWord(*(u16*)&pkt.Data[8]);\n\t\t\t\tWIFI_RXPutWord(*(u16*)&pkt.Data[10]);\n\n\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_RXSTART);\n\t\t\t\tpkt.NotStarted = false;\n\n\t\t\t\t//wifiMac.rfStatus = 1;\n\t\t\t\twifiMac.rfPins = 0x00C7;\n\t\t\t}\n\n\t\t\tWIFI_RXPutWord(*(u16*)&pkt.Data[pkt.CurOffset]);\n\n\t\t\tpkt.CurOffset += 2;\n\t\t\tpkt.RemHWords--;\n\n\t\t\tif (pkt.RemHWords == 0)\n\t\t\t{\n\t\t\t\twifiMac.RXWriteCursor = ((wifiMac.RXWriteCursor + 1) & (~1));\n\t\t\t\tif (wifiMac.RXWriteCursor >= (wifiMac.RXRangeEnd >> 1))\n\t\t\t\t\twifiMac.RXWriteCursor = (wifiMac.RXRangeBegin >> 1);\n\t\t\t\tWIFI_IOREG(REG_WIFI_RXHWWRITECSR) = wifiMac.RXWriteCursor;\n\n\t\t\t\twifiMac.RXNum++;\n\t\t\t\tWIFI_triggerIRQ(WIFI_IRQ_RXEND);\n\n\t\t\t\tWIFI_IncrementRXStat<7>();\n\t\t\t\tWIFI_DoAutoReply(pkt.Data);\n\n\t\t\t\tdelete[] pkt.Data;\n\t\t\t\twifiMac.RXPacketQueue.pop();\n\n\t\t\t\twifiMac.rfStatus = 9;\n\t\t\t\twifiMac.rfPins = 0x00C6;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ((wifiMac.GlobalUsecTimer & 1023) == 0)\n\t\tif (wifiCom)\n\t\t\twifiCom->msTrigger();\n}\n\n/*******************************************************************************\n\n\tAd-hoc communication interface\n\n *******************************************************************************/\n\n#ifdef EXPERIMENTAL_WIFI_COMM\n#define ADHOC_MAGIC\t\t\t\t\t\"NDSWIFI\\0\"\n#define ADHOC_PROTOCOL_VERSION \t\t0x0100  // v1.0\n\ntypedef struct _Adhoc_FrameHeader\n{\n\tchar magic[8];\t\t\t// \"NDSWIFI\\0\" (null terminated string)\n\tu16 version;\t\t\t// Ad-hoc protocol version (for example 0x0502 = v5.2)\n\tu16 packetLen;\t\t\t// Length of the packet\n\n} Adhoc_FrameHeader;\n\n\nbool Adhoc_Init()\n{\n\tBOOL opt_true = TRUE;\n\tint res;\n\n\tif (!driver->WIFI_SocketsAvailable())\n\t{\n\t\tWIFI_LOG(1, \"Ad-hoc: failed to initialize sockets.\\n\");\n\t\twifi_socket = INVALID_SOCKET;\n\t\treturn false;\n\t}\n\n\t// Create an UDP socket\n\twifi_socket = socket(AF_INET, SOCK_DGRAM, 0);\n\tif (wifi_socket < 0)\n\t{\n\t\tWIFI_LOG(1, \"Ad-hoc: Failed to create socket.\\n\");\n\t\treturn false;\n\t}\n\n\t// Enable the socket to be bound to an address/port that is already in use\n\t// This enables us to communicate with another DeSmuME instance running on the same computer.\n\tres = setsockopt(wifi_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(BOOL));\n\n\t// Bind the socket to any address on port 7000\n\tsockaddr_t saddr;\n\tsaddr.sa_family = AF_INET;\n\t*(u32*)&saddr.sa_data[2] = htonl(INADDR_ANY); \n\t*(u16*)&saddr.sa_data[0] = htons(BASEPORT);\n\tres = bind(wifi_socket, &saddr, sizeof(sockaddr_t));\n\tif (res < 0)\n\t{\n\t\tWIFI_LOG(1, \"Ad-hoc: failed to bind the socket.\\n\");\n\t\tclosesocket(wifi_socket); wifi_socket = INVALID_SOCKET;\n\t\treturn false;\n\t}\n\n\t// Enable broadcast mode\n\t// Not doing so results in failure when sendto'ing to broadcast address\n\tres = setsockopt(wifi_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(BOOL));\n\tif (res < 0)\n\t{\n\t\tWIFI_LOG(1, \"Ad-hoc: failed to enable broadcast mode.\\n\");\n\t\tclosesocket(wifi_socket); wifi_socket = INVALID_SOCKET;\n\t\treturn false;\n\t}\n\n\t// Prepare an address structure for sending packets\n\tsendAddr.sa_family = AF_INET;\n\t*(u32*)&sendAddr.sa_data[2] = htonl(INADDR_BROADCAST); \n\t*(u16*)&sendAddr.sa_data[0] = htons(BASEPORT);\n\n\tAdhoc_Reset();\n\n\tWIFI_LOG(1, \"Ad-hoc: initialization successful.\\n\");\n\n\treturn true;\n}\n\nvoid Adhoc_DeInit()\n{\n\tif (wifi_socket >= 0)\n\t\tclosesocket(wifi_socket);\n}\n\nvoid Adhoc_Reset()\n{\n\tdriver->WIFI_GetUniqueMAC(FW_Mac);\n\tNDS_PatchFirmwareMAC();\n\n\tprintf(\"WIFI: ADHOC: MAC = %02X:%02X:%02X:%02X:%02X:%02X\\n\",\n\t\tFW_Mac[0], FW_Mac[1], FW_Mac[2], FW_Mac[3], FW_Mac[4], FW_Mac[5]);\n}\n\nvoid Adhoc_SendPacket(u8* packet, u32 len)\n{\n\tif (wifi_socket < 0)\n\t\treturn;\n\n\tWIFI_LOG(3, \"Ad-hoc: sending a packet of %i bytes, frame control: %04X\\n\", len, *(u16*)&packet[0]);\n\n\tu32 frameLen = sizeof(Adhoc_FrameHeader) + len;\n\n\tu8* frame = new u8[frameLen];\n\tu8* ptr = frame;\n\n\tAdhoc_FrameHeader header;\n\tstrncpy(header.magic, ADHOC_MAGIC, 8);\n\theader.version = ADHOC_PROTOCOL_VERSION;\n\theader.packetLen = len;\n\tmemcpy(ptr, &header, sizeof(Adhoc_FrameHeader));\n\tptr += sizeof(Adhoc_FrameHeader);\n\n\tmemcpy(ptr, packet, len);\n\n\tint nbytes = sendto(wifi_socket, (const char*)frame, frameLen, 0, &sendAddr, sizeof(sockaddr_t));\n\t\n\tWIFI_LOG(4, \"Ad-hoc: sent %i/%i bytes of packet.\\n\", nbytes, frameLen);\n\n\tdelete[] frame;\n}\n\nvoid Adhoc_msTrigger()\n{\n\tif (wifi_socket < 0)\n\t\treturn;\n\n\t// Check every millisecond if we received a packet\n\tfd_set fd;\n\tstruct timeval tv;\n\n\tFD_ZERO(&fd);\n\tFD_SET(wifi_socket, &fd);\n\ttv.tv_sec = 0; \n\ttv.tv_usec = 0;\n\n\tif (select(1, &fd, 0, 0, &tv))\n\t{\n\t\tsockaddr_t fromAddr;\n\t\tsocklen_t fromLen = sizeof(sockaddr_t);\n\t\tu8 buf[1536];\n\t\tu8* ptr;\n\t\tu16 packetLen;\n\n\t\tint nbytes = recvfrom(wifi_socket, (char*)buf, 1536, 0, &fromAddr, &fromLen);\n\n\t\t// No packet arrived (or there was an error)\n\t\tif (nbytes <= 0)\n\t\t\treturn;\n\n\t\tptr = buf;\n\t\tAdhoc_FrameHeader header = *(Adhoc_FrameHeader*)ptr;\n\t\t\n\t\t// Check the magic string in header\n\t\tif (strncmp(header.magic, ADHOC_MAGIC, 8))\n\t\t\treturn;\n\n\t\t// Check the ad-hoc protocol version\n\t\tif (header.version != ADHOC_PROTOCOL_VERSION)\n\t\t\treturn;\n\n\t\tpacketLen = header.packetLen - 4;\n\t\tptr += sizeof(Adhoc_FrameHeader);\n\n\t\t// If the packet is for us, send it to the wifi core\n\t\tif (!WIFI_compareMAC(&ptr[10], &wifiMac.mac.bytes[0]))\n\t\t{\n\t\t\tif (WIFI_isBroadcastMAC(&ptr[16]) ||\n\t\t\t\tWIFI_compareMAC(&ptr[16], &wifiMac.bss.bytes[0]) ||\n\t\t\t\tWIFI_isBroadcastMAC(&wifiMac.bss.bytes[0]))\n\t\t\t{\n\t\t\t/*\tWIFI_LOG(3, \"Ad-hoc: received a packet of %i bytes from %i.%i.%i.%i (port %i).\\n\",\n\t\t\t\t\tnbytes,\n\t\t\t\t\t(u8)fromAddr.sa_data[2], (u8)fromAddr.sa_data[3], \n\t\t\t\t\t(u8)fromAddr.sa_data[4], (u8)fromAddr.sa_data[5],\n\t\t\t\t\tntohs(*(u16*)&fromAddr.sa_data[0]));*/\n\t\t\t\tWIFI_LOG(3, \"Ad-hoc: received a packet of %i bytes, frame control: %04X\\n\", packetLen, *(u16*)&ptr[0]);\n\t\t\t\tWIFI_LOG(4, \"Storing packet at %08X.\\n\", 0x04804000 + (wifiMac.RXWriteCursor<<1));\n\n\t\t\t\tu8* packet = new u8[12 + packetLen];\n\n\t\t\t\tWIFI_MakeRXHeader(packet, WIFI_GetRXFlags(ptr), 20, packetLen, 0, 0);\n\t\t\t\tmemcpy(&packet[12], ptr, packetLen);\n\t\t\t\tWIFI_RXQueuePacket(packet, 12+packetLen);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*******************************************************************************\n\n\tSoftAP (fake wifi access point)\n\n *******************************************************************************/\n\n// Note on the CRC32 field in received packets:\n// The wifi hardware doesn't store the CRC32 in memory when receiving a packet\n// so the RX header length field is indeed header+body\n// Hence the CRC32 has been removed from those templates.\n\n// If you wanna change SoftAP's MAC address, change this\n// Warning, don't mistake this for an array, it isn't\n#define SOFTAP_MACADDR 0x00, 0xF0, 0x1A, 0x2B, 0x3C, 0x4D\n\nconst u8 SoftAP_MACAddr[6] = {SOFTAP_MACADDR};\n\nconst u8 SoftAP_Beacon[] = {\n\t/* 802.11 header */\n\t0x80, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Frame control\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Duration ID\n\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\t\t\t\t\t// Receiver\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// Sender\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// BSSID\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Sequence control\n\n\t/* Frame body */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\t\t// Timestamp (modified later)\n\t0x80, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Beacon interval\n\t0x21, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Capablilty information\n\t0x01, 0x02, 0x82, 0x84,\t\t\t\t\t\t\t\t// Supported rates\n\t0x03, 0x01, 0x06,\t\t\t\t\t\t\t\t\t// Current channel\n\t0x05, 0x04, 0x02, 0x01, 0x00, 0x00,\t\t\t\t\t// TIM (no idea what the hell it is)\n\t0x00, 0x06, 'S', 'o', 'f', 't', 'A', 'P',\t\t\t// SSID\n};\n\nconst u8 SoftAP_ProbeResponse[] = {\n\t/* 802.11 header */\n\t0x50, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Frame control\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Duration ID\n\t0x00, 0x09, 0xBF, 0x12, 0x34, 0x56,\t\t\t\t\t// Receiver\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// Sender\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// BSSID\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Sequence control\n\n\t/* Frame body */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\t\t// Timestamp (modified later)\n\t0x80, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Beacon interval\n\t0x21, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Capablilty information\n\t0x01, 0x02, 0x82, 0x84,\t\t\t\t\t\t\t\t// Supported rates\n\t0x03, 0x01, 0x06,\t\t\t\t\t\t\t\t\t// Current channel\n\t0x00, 0x06, 'S', 'o', 'f', 't', 'A', 'P',\t\t\t// SSID\n};\n\n\nconst u8 SoftAP_AuthFrame[] = {\n\t/* 802.11 header */\n\t0xB0, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Frame control\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Duration ID\n\t0x00, 0x09, 0xBF, 0x12, 0x34, 0x56,\t\t\t\t\t// Receiver\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// Sender\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// BSSID\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Sequence control\n\n\t/* Frame body */\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Authentication algorithm\n\t0x02, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Authentication sequence\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Status\n};\n\nconst u8 SoftAP_AssocResponse[] = {\n\t/* 802.11 header */\n\t0x10, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Frame control\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Duration ID\n\t0x00, 0x09, 0xBF, 0x12, 0x34, 0x56,\t\t\t\t\t// Receiver\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// Sender\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// BSSID\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Sequence control\n\n\t/* Frame body */\n\t0x21, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Capability information\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Status\n\t0x01, 0xC0,\t\t\t\t\t\t\t\t\t\t\t// Assocation ID\n\t0x01, 0x02, 0x82, 0x84,\t\t\t\t\t\t\t\t// Supported rates\n};\n\n// Deauthentication frame - sent if the user chose not to connect to WFC\nconst u8 SoftAP_DeauthFrame[] = {\n\t/* 802.11 header */\n\t0xC0, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Frame control\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Duration ID\n\t0x00, 0x09, 0xBF, 0x12, 0x34, 0x56,\t\t\t\t\t// Receiver\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// Sender\n\tSOFTAP_MACADDR,\t\t\t\t\t\t\t\t\t\t// BSSID\n\t0x00, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Sequence control\n\n\t/* Frame body */\n\t0x01, 0x00,\t\t\t\t\t\t\t\t\t\t\t// Reason code (is \"unspecified\" ok?)\n};\n\n//todo - make a class to wrap this\n//todo - zeromus - inspect memory leak safety of all this\nstatic pcap_if_t * WIFI_index_device(pcap_if_t *alldevs, int index)\n{\n\tpcap_if_t *curr = alldevs;\n\n\tfor(int i = 0; i < index; i++)\n\t{\n\t\tif (curr->next == NULL) \n\t\t{\n\t\t\tCommonSettings.wifi.infraBridgeAdapter = i;\n\t\t\tbreak;\n\t\t}\n\t\tcurr = curr->next;\n\t}\n\n\tWIFI_LOG(2, \"SoftAP: using %s as device.\\n\", curr->PCAP_DEVICE_NAME);\n\n\treturn curr;\n}\n\nbool SoftAP_Init()\n{\n\tif (!driver->WIFI_PCapAvailable())\n\t{\n\t\tWIFI_LOG(1, \"SoftAP: PCap library not available on your system.\\n\");\n\t\twifi_bridge = NULL;\n\t\treturn false;\n\t}\n\t\n\tchar errbuf[PCAP_ERRBUF_SIZE];\n\tpcap_if_t *alldevs;\n\tint ret = 0;\n\n\tret = driver->PCAP_findalldevs(&alldevs, errbuf);\n\tif (ret == -1 || alldevs == NULL)\n\t{\n\t\tWIFI_LOG(1, \"SoftAP: PCap: failed to find any network adapter: %s\\n\", errbuf);\n\t\treturn false;\n\t}\n\n\tpcap_if_t* dev = WIFI_index_device(alldevs,CommonSettings.wifi.infraBridgeAdapter);\n\twifi_bridge = driver->PCAP_open(dev->name, PACKET_SIZE, PCAP_OPENFLAG_PROMISCUOUS, 1, errbuf);\n\tif(wifi_bridge == NULL)\n\t{\n\t\tWIFI_LOG(1, \"SoftAP: PCap: failed to open %s: %s\\n\", dev->PCAP_DEVICE_NAME, errbuf);\n\t\treturn false;\n\t}\n\n\tdriver->PCAP_freealldevs(alldevs);\n\n\t// Set non-blocking mode\n\tif (driver->PCAP_setnonblock(wifi_bridge, 1, errbuf) == -1)\n\t{\n\t\tWIFI_LOG(1, \"SoftAP: PCap: failed to set non-blocking mode: %s\\n\", errbuf);\n\t\tdriver->PCAP_close(wifi_bridge); wifi_bridge = NULL;\n\t\treturn false;\n\t}\n\n\tSoftAP_Reset();\n\n\treturn true;\n}\n\nvoid SoftAP_DeInit()\n{\n\tif(wifi_bridge != NULL)\n\t\tdriver->PCAP_close(wifi_bridge);\n}\n\nvoid SoftAP_Reset()\n{\n\tSoftAP.status = APStatus_Disconnected;\n\tSoftAP.seqNum = 0;\n}\n\nstatic bool SoftAP_IsDNSRequestToWFC(u16 ethertype, u8* body)\n{\n\t// Check the various headers...\n\tif (ntohs(ethertype) != 0x0800) return false;\t\t// EtherType: IP\n\tif (body[0] != 0x45) return false;\t\t\t\t\t// Version: 4, header len: 5\n\tif (body[9] != 0x11) return false;\t\t\t\t\t// Protocol: UDP\n\tif (ntohs(*(u16*)&body[22]) != 53) return false;\t// Dest. port: 53 (DNS)\n\tif (htons(ntohs(*(u16*)&body[28+2])) & 0x8000) return false;\t// must be a query\n\t\n\t// Analyze each question\n\tu16 numquestions = ntohs(*(u16*)&body[28+4]);\n\tu32 curoffset = 28+12;\n\tfor (u16 curquestion = 0; curquestion < numquestions; curquestion++)\n\t{\n\t\t// Assemble the requested domain name\n\t\tu8 bitlength = 0; char domainname[256] = \"\";\n\t\twhile ((bitlength = body[curoffset++]) != 0)\n\t\t{\n\t\t\tstrncat(domainname, (const char*)&body[curoffset], bitlength);\n\t\t\t\n\t\t\tcuroffset += bitlength;\n\t\t\tif (body[curoffset] != 0)\n\t\t\t\tstrcat(domainname, \".\");\n\t\t}\n\n\t\t// if the domain name contains nintendowifi.net\n\t\t// it is most likely a WFC server\n\t\t// (note, conntest.nintendowifi.net just contains a dummy HTML page and\n\t\t// is used for connection tests, I think we can let this one slide)\n\t\tif ((strstr(domainname, \"nintendowifi.net\") != NULL) && \n\t\t\t(strcmp(domainname, \"conntest.nintendowifi.net\") != 0))\n\t\t\treturn true;\n\n\t\t// Skip the type and class - we don't care about that\n\t\tcuroffset += 4;\n\t}\n\n\treturn false;\n}\n\nstatic void SoftAP_Deauthenticate()\n{\n\tu32 packetLen = sizeof(SoftAP_DeauthFrame);\n\tu8* packet = new u8[12 + packetLen];\n\n\tmemcpy(&packet[12], SoftAP_DeauthFrame, packetLen);\n\n\tmemcpy(&packet[12 + 4], FW_Mac, 6); // Receiver MAC\n\n\t*(u16*)&packet[12 + 22] = SoftAP.seqNum << 4;\t\t// Sequence number\n\tSoftAP.seqNum++;\n\n\tu16 rxflags = 0x0010;\n\tif (WIFI_compareMAC(wifiMac.bss.bytes, &packet[12 + 16]))\n\t\trxflags |= 0x8000;\n\n\tWIFI_MakeRXHeader(packet, rxflags, 20, packetLen, 0, 0);\n\tWIFI_RXQueuePacket(packet, 12 + packetLen);\n\n\tSoftAP.status = APStatus_Disconnected;\n}\n\nvoid SoftAP_SendPacket(u8 *packet, u32 len)\n{\n\tu16 frameCtl = *(u16*)&packet[0];\n\n\tWIFI_LOG(3, \"SoftAP: Received a packet of length %i bytes. Frame control = %04X\\n\",\n\t\tlen, frameCtl);\n\n\t//use this to log wifi messages easily\n\t/*static int ctr=0;\n\tchar buf[100];\n\tsprintf(buf,\"wifi%04d.txt\",ctr);\n\tFILE* outf = fopen(buf,\"wb\");\n\tfwrite(packet,1,len,outf);\n\tfclose(outf);\n\tctr++;*/\n\n\tswitch((frameCtl >> 2) & 0x3)\n\t{\n\tcase 0x0:\t\t\t\t// Management frame\n\t\t{\n\t\t\tu32 packetLen;\n\t\t\tu8* rpacket;\n\n\t\t\tswitch((frameCtl >> 4) & 0xF)\n\t\t\t{\n\t\t\tcase 0x4:\t\t// Probe request\n\t\t\t\t{\n\t\t\t\t\tpacketLen = sizeof(SoftAP_ProbeResponse);\n\t\t\t\t\trpacket = new u8[12 + packetLen];\n\t\t\t\t\tmemcpy(&rpacket[12], SoftAP_ProbeResponse, packetLen);\n\n\t\t\t\t\t// Add the timestamp\n\t\t\t\t\t*(u64*)&rpacket[12 + 24] = wifiMac.GlobalUsecTimer;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0xB:\t\t// Authentication\n\t\t\t\t{\n\t\t\t\t\tpacketLen = sizeof(SoftAP_AuthFrame);\n\t\t\t\t\trpacket = new u8[12 + packetLen];\n\t\t\t\t\tmemcpy(&rpacket[12], SoftAP_AuthFrame, packetLen);\n\n\t\t\t\t\tSoftAP.status = APStatus_Authenticated;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0:\t\t// Association request\n\t\t\t\t{\n\t\t\t\t\tif (SoftAP.status != APStatus_Authenticated)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tpacketLen = sizeof(SoftAP_AssocResponse);\n\t\t\t\t\trpacket = new u8[12 + packetLen];\n\t\t\t\t\tmemcpy(&rpacket[12], SoftAP_AssocResponse, packetLen);\n\n\t\t\t\t\tSoftAP.status = APStatus_Associated;\n\t\t\t\t\tWIFI_LOG(1, \"SoftAP connected!\\n\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0xA:\t\t// Disassociation\n\t\t\t\tSoftAP.status = APStatus_Authenticated;\n\t\t\t\treturn;\n\n\t\t\tcase 0xC:\t\t// Deauthentication\n\t\t\t\tSoftAP.status = APStatus_Disconnected;\n\t\t\t\tWIFI_LOG(1, \"SoftAP disconnected\\n\");\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tWIFI_LOG(2, \"SoftAP: unknown management frame type %04X\\n\", (frameCtl >> 4) & 0xF);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmemcpy(&rpacket[12 + 4], FW_Mac, 6); // Receiver MAC\n\n\t\t\t*(u16*)&rpacket[12 + 22] = SoftAP.seqNum << 4; // Sequence number\n\t\t\tSoftAP.seqNum++;\n\n\t\t\tu16 rxflags = 0x0010;\n\t\t\tif (WIFI_compareMAC(wifiMac.bss.bytes, &rpacket[12 + 16]))\n\t\t\t\trxflags |= 0x8000;\n\n\t\t\tWIFI_MakeRXHeader(rpacket, rxflags, 20, packetLen, 0, 0); // make the RX header\n\t\t\tWIFI_RXQueuePacket(rpacket, 12 + packetLen);\n\t\t}\n\t\tbreak;\n\n\tcase 0x2:\t\t\t\t// Data frame\n\t\t{\n\t\t\t// If it has a LLC/SLIP header, send it over the Ethernet\n\t\t\tif (((*(u16*)&packet[24]) == 0xAAAA) && ((*(u16*)&packet[26]) == 0x0003) && ((*(u16*)&packet[28]) == 0x0000))\n\t\t\t{\n\t\t\t\tif (SoftAP.status != APStatus_Associated)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (SoftAP_IsDNSRequestToWFC(*(u16*)&packet[30], &packet[32]))\n\t\t\t\t{\n\t\t\t\t\tSoftAP_Deauthenticate();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tu32 epacketLen = ((len - 30 - 4) + 14);\n\t\t\t\tu8 epacket[2048];\n\n\t\t\t\t//printf(\"----- SENDING ETHERNET PACKET: len=%i, ethertype=%04X -----\\n\",\n\t\t\t\t//\tlen, *(u16*)&packet[30]);\n\n\t\t\t\tmemcpy(&epacket[0], &packet[16], 6);\n\t\t\t\tmemcpy(&epacket[6], &packet[10], 6);\n\t\t\t\t*(u16*)&epacket[12] = *(u16*)&packet[30];\n\t\t\t\tmemcpy(&epacket[14], &packet[32], epacketLen - 14);\n\n\t\t\t\tif(wifi_bridge != NULL)\n\t\t\t\t\tdriver->PCAP_sendpacket(wifi_bridge, epacket, epacketLen);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tWIFI_LOG(1, \"SoftAP: received non-Ethernet data frame. wtf?\\n\");\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n}\n\nINLINE void SoftAP_SendBeacon()\n{\n\tu32 packetLen = sizeof(SoftAP_Beacon);\n\tu8* packet = new u8[12 + packetLen];\n\n\tmemcpy(&packet[12], SoftAP_Beacon, packetLen);\t// Copy the beacon template\n\n\t*(u16*)&packet[12 + 22] = SoftAP.seqNum << 4;\t\t// Sequence number\n\tSoftAP.seqNum++;\n\n\t*(u64*)&packet[12 + 24] = wifiMac.GlobalUsecTimer;\t// Timestamp\n\n\tu16 rxflags = 0x0011;\n\tif (WIFI_compareMAC(wifiMac.bss.bytes, &packet[12 + 16]))\n\t\trxflags |= 0x8000;\n\n\tWIFI_MakeRXHeader(packet, rxflags, 20, packetLen, 0, 0);\n\tWIFI_RXQueuePacket(packet, 12 + packetLen);\n}\n\nstatic void SoftAP_RXHandler(u_char* user, const struct pcap_pkthdr* h, const u_char* _data)\n{\n\t// safety checks\n\tif ((_data == NULL) || (h == NULL))\n\t\treturn;\n\n\tu8* data = (u8*)_data;\n\n\t// reject the packet if it wasn't for us\n\tif (!(WIFI_isBroadcastMAC(&data[0]) || WIFI_compareMAC(&data[0], wifiMac.mac.bytes)))\n\t\treturn;\n\n\t// reject the packet if we just sent it\n\tif (WIFI_compareMAC(&data[6], wifiMac.mac.bytes))\n\t\treturn;\n\n\t// The packet was for us. Let's process it then.\n\tint wpacketLen = WIFI_alignedLen(26 + 6 + (h->len-14));\n\tu8* wpacket = new u8[12 + wpacketLen];\n\n\tu16 rxflags = 0x0018;\n\tif (WIFI_compareMAC(wifiMac.bss.bytes, (u8*)SoftAP_MACAddr))\n\t\trxflags |= 0x8000;\n\n\t// Make a valid 802.11 frame\n\tWIFI_MakeRXHeader(wpacket, rxflags, 20, wpacketLen, 0, 0);\n\t*(u16*)&wpacket[12+0] = 0x0208;\n\t*(u16*)&wpacket[12+2] = 0x0000;\n\tmemcpy(&wpacket[12+4], &data[0], 6);\n\tmemcpy(&wpacket[12+10], SoftAP_MACAddr, 6);\n\tmemcpy(&wpacket[12+16], &data[6], 6);\n\t*(u16*)&wpacket[12+22] = SoftAP.seqNum << 4;\n\t*(u16*)&wpacket[12+24] = 0xAAAA;\n\t*(u16*)&wpacket[12+26] = 0x0003;\n\t*(u16*)&wpacket[12+28] = 0x0000;\n\t*(u16*)&wpacket[12+30] = *(u16*)&data[12];\n\tmemcpy(&wpacket[12+32], &data[14], h->len-14);\n\n\tSoftAP.seqNum++;\n\n\tWIFI_RXQueuePacket(wpacket, 12 + wpacketLen);\n}\n\nvoid SoftAP_msTrigger()\n{\n\t//zero sez: every 1/10 second? does it have to be precise? this is so costly..\n\t// Okay for 128 ms then\n\tif((wifiMac.GlobalUsecTimer & 131071) == 0)\n\t\tSoftAP_SendBeacon();\n\n\t// EXTREMELY EXPERIMENTAL packet receiving code\n\t// Can now receive 64 packets per millisecond. Completely arbitrary limit. Todo: tweak if needed.\n\t// But due to using non-blocking mode, this shouldn't be as slow as it used to be.\n\tif (wifi_bridge != NULL)\n\t\tdriver->PCAP_dispatch(wifi_bridge, 64, SoftAP_RXHandler, NULL);\n}\n\n#endif\n\n"
  },
  {
    "path": "app/src/main/jni/desmume/src/wifi.h",
    "content": "/*\n\tCopyright (C) 2007 Tim Seidel\n\tCopyright (C) 2008-2011 DeSmuME team\n\n\tThis file is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 2 of the License, or\n\t(at your option) any later version.\n\n\tThis file is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with the this software.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef WIFI_H\n#define WIFI_H\n\n#include <stdio.h>\n#include \"types.h\"\n\n#include <queue>\n\n#ifdef EXPERIMENTAL_WIFI_COMM\n\n#define HAVE_REMOTE\n#define WPCAP\n#define PACKET_SIZE 65535\n#define _INC_STDIO\n\n#endif\n\n\n#define\t\tREG_WIFI_ID\t\t\t\t\t0x000\n#define     REG_WIFI_MODE       \t\t0x004\n#define     REG_WIFI_WEP        \t\t0x006\n#define\t\tREG_WIFI_TXSTATCNT\t\t\t0x008\n#define\t\tREG_WIFI_0A\t\t\t\t\t0x00A\n#define     REG_WIFI_IF     \t\t\t0x010\n#define     REG_WIFI_IE     \t\t\t0x012\n#define     REG_WIFI_MAC0       \t\t0x018\n#define     REG_WIFI_MAC1       \t\t0x01A\n#define     REG_WIFI_MAC2       \t\t0x01C\n#define     REG_WIFI_BSS0       \t\t0x020\n#define     REG_WIFI_BSS1       \t\t0x022\n#define     REG_WIFI_BSS2       \t\t0x024\n#define     REG_WIFI_AID_LOW       \t\t0x028\n#define     REG_WIFI_AID_HIGH      \t\t0x02A\n#define     REG_WIFI_RETRYLIMIT \t\t0x02C\n// 02E - internal\n#define\t\tREG_WIFI_RXCNT\t\t\t\t0x030\n#define\t\tREG_WIFI_WEPCNT\t\t\t\t0x032\n// 034 - internal\n\n#define\t\tREG_WIFI_POWER_US\t\t\t0x036\n#define\t\tREG_WIFI_POWER_TX\t\t\t0x038\n#define     REG_WIFI_POWERSTATE \t\t0x03C\n#define     REG_WIFI_POWERFORCE    \t\t0x040\n#define     REG_WIFI_RANDOM     \t\t0x044\n#define\t\tREG_WIFI_POWER_UNK\t\t\t0x048\n\n#define     REG_WIFI_RXRANGEBEGIN       0x050\n#define     REG_WIFI_RXRANGEEND         0x052\n#define     REG_WIFI_RXHWWRITECSR       0x054\n#define     REG_WIFI_WRITECSRLATCH      0x056\n#define     REG_WIFI_CIRCBUFRADR        0x058\n#define     REG_WIFI_RXREADCSR          0x05A\n#define     REG_WIFI_RXBUF_COUNT\t\t0x05C\n#define     REG_WIFI_CIRCBUFREAD        0x060\n#define     REG_WIFI_CIRCBUFRD_END      0x062\n#define     REG_WIFI_CIRCBUFRD_SKIP     0x064\n#define     REG_WIFI_CIRCBUFWADR        0x068\n#define\t\tREG_WIFI_TXBUFCOUNT\t\t\t0x06C\n#define     REG_WIFI_CIRCBUFWRITE       0x070\n#define     REG_WIFI_CIRCBUFWR_END      0x074\n#define     REG_WIFI_CIRCBUFWR_SKIP     0x076\n\n// 078 - internal\n#define     REG_WIFI_TXBUF_BEACON       0x080\n#define     REG_WIFI_LISTENCOUNT        0x088\n#define     REG_WIFI_BEACONPERIOD       0x08C\n#define     REG_WIFI_LISTENINT          0x08E\n#define \tREG_WIFI_TXBUF_CMD\t\t\t0x090\n#define\t\tREG_WIFI_TXBUF_REPLY1\t\t0x094\n#define\t\tREG_WIFI_TXBUF_REPLY2\t\t0x098\n// 09C - internal\n#define     REG_WIFI_TXBUF_LOC1         0x0A0\n#define     REG_WIFI_TXBUF_LOC2         0x0A4\n#define     REG_WIFI_TXBUF_LOC3         0x0A8\n#define     REG_WIFI_TXREQ_RESET        0x0AC\n#define     REG_WIFI_TXREQ_SET          0x0AE\n#define\t\tREG_WIFI_TXREQ_READ\t\t\t0x0B0\n#define\t\tREG_WIFI_TXRESET\t\t\t0x0B4\n#define\t\tREG_WIFI_TXBUSY\t\t\t\t0x0B6\n#define     REG_WIFI_TXSTAT             0x0B8\n// 0BA - internal\n#define\t\tREG_WIFI_PREAMBLE\t\t\t0x0BC\n// 0C0 - ?\n// 0C4 - ?\n// 0C8 - internal\n#define     REG_WIFI_RXFILTER           0x0D0\n// 0D4 - config\n// 0D8 - config\n// 0DA - config\n#define\t\tREG_WIFI_RXFILTER2\t\t\t0x0E0\n\n#define     REG_WIFI_USCOUNTERCNT       0x0E8\n#define     REG_WIFI_USCOMPARECNT       0x0EA\n// 0EC - config\n#define\t\tREG_WIFI_EXTRACOUNTCNT\t\t0x0EE\n#define     REG_WIFI_USCOMPARE0         0x0F0\n#define     REG_WIFI_USCOMPARE1         0x0F2\n#define     REG_WIFI_USCOMPARE2         0x0F4\n#define     REG_WIFI_USCOMPARE3         0x0F6\n#define     REG_WIFI_USCOUNTER0         0x0F8\n#define     REG_WIFI_USCOUNTER1         0x0FA\n#define     REG_WIFI_USCOUNTER2         0x0FC\n#define     REG_WIFI_USCOUNTER3         0x0FE\n// 100 - internal\n// 102 - internal\n// 104 - internal\n// 106 - internal\n#define\t\tREG_WIFI_CONTENTFREE\t\t0x10C\n#define\t\tREG_WIFI_PREBEACONCOUNT\t\t0x110\n#define\t\tREG_WIFI_EXTRACOUNT\t\t\t0x118\n#define \tREG_WIFI_BEACONCOUNT1\t\t0x11C\n\n// 120 to 132 - config/internal ports\n#define \tREG_WIFI_BEACONCOUNT2\t\t0x134\n// 140 to 154 - config ports\n\n#define     REG_WIFI_BBCNT\t\t\t\t0x158\n#define     REG_WIFI_BBWRITE\t\t\t0x15A\n#define     REG_WIFI_BBREAD\t\t\t\t0x15C\n#define     REG_WIFI_BBBUSY\t\t\t\t0x15E\n#define\t\tREG_WIFI_BBMODE\t\t\t\t0x160\n#define\t\tREG_WIFI_BBPOWER\t\t\t0x168\n\n// 16A to 178 - internal\n\n#define     REG_WIFI_RFDATA2  \t\t\t0x17C\n#define     REG_WIFI_RFDATA1  \t\t\t0x17E\n#define     REG_WIFI_RFBUSY\t\t\t\t0x180\n#define     REG_WIFI_RFCNT\t\t  \t\t0x184\n\n// 190 - internal\n// 194 - ?\n// 198 - internal\n#define\t\tREG_WIFI_RFPINS\t\t\t\t0x19C\n// 1A0 - internal\n// 1A2 - internal\n#define\t\tREG_WIFI_MAYBE_RATE\t\t\t0x1A4\n\n#define\t\tREG_WIFI_RXSTAT_INC_IF\t\t0x1A8\n#define\t\tREG_WIFI_RXSTAT_INC_IE\t\t0x1AA\n#define\t\tREG_WIFI_RXSTAT_OVF_IF\t\t0x1AC\n#define\t\tREG_WIFI_RXSTAT_OVF_IE\t\t0x1AE\n#define\t\tREG_WIFI_TXERR_COUNT\t\t0x1C0\n#define\t\tREG_WIFI_RX_COUNT\t\t\t0x1C4\n\n// 1D0 to 1DE - related to multiplayer. argh.\n\n#define\t\tREG_WIFI_RFSTATUS\t\t\t0x214\n#define\t\tREG_WIFI_IF_SET\t\t\t\t0x21C\n#define \tREG_WIFI_TXSEQNO\t\t\t0x210\n#define\t\tREG_WIFI_RXTXADDR\t\t\t0x268\n#define\t\tREG_WIFI_POWERACK\t\t\t0x2D0\n\n\n#define\t\tWIFI_IOREG(reg)\t\t\t\twifiMac.IOPorts[(reg) >> 1]\n\n/* WIFI misc constants */\n#define\t\tWIFI_CHIPID\t\t\t\t\t0x1440\t\t/* emulates \"old\" wifi chip, new is 0xC340 */\n\n/* Referenced as RF_ in dswifi: rffilter_t */\n/* based on the documentation for the RF2958 chip of RF Micro Devices */\n/* using the register names as in docs ( http://www.rfmd.com/pdfs/2958.pdf )*/\n/* even tho every register only has 18 bits we are using u32 */\ntypedef struct rffilter_t\n{\n\tunion CFG1\n\t{\n\t\tstruct \n\t\t{\n/* 0*/\t\tunsigned IF_VGA_REG_EN:1;\n/* 1*/\t\tunsigned IF_VCO_REG_EN:1;\n/* 2*/\t\tunsigned RF_VCO_REG_EN:1;\n/* 3*/\t\tunsigned HYBERNATE:1;\n/* 4*/\t\tunsigned :10;\n/*14*/\t\tunsigned REF_SEL:2;\n/*16*/\t\tunsigned :2;\n\t\t} bits;\n\t\tu32 val;\n\t} CFG1;\n\tunion IFPLL1\n\t{\n\t\tstruct \n\t\t{\n/* 0*/\t\tunsigned DAC:4;\n/* 4*/\t\tunsigned :5;\n/* 9*/\t\tunsigned P1:1;\n/*10*/\t\tunsigned LD_EN1:1;\n/*11*/\t\tunsigned AUTOCAL_EN1:1;\n/*12*/\t\tunsigned PDP1:1;\n/*13*/\t\tunsigned CPL1:1;\n/*14*/\t\tunsigned LPF1:1;\n/*15*/\t\tunsigned VTC_EN1:1;\n/*16*/\t\tunsigned KV_EN1:1;\n/*17*/\t\tunsigned PLL_EN1:1;\n\t\t} bits;\n\t\tu32 val;\n\t} IFPLL1;\n\tunion IFPLL2\n\t{\n\t\tstruct \n\t\t{\n/* 0*/\t\tunsigned IF_N:16;\n/*16*/\t\tunsigned :2;\n\t\t} bits;\n\t\tu32 val;\n\t} IFPLL2;\n\tunion IFPLL3\n\t{\n\t\tstruct \n\t\t{\n/* 0*/\t\tunsigned KV_DEF1:4;\n/* 4*/\t\tunsigned CT_DEF1:4;\n/* 8*/\t\tunsigned DN1:9;\n/*17*/\t\tunsigned :1;\n\t\t} bits;\n\t\tu32 val;\n\t} IFPLL3;\n\tunion RFPLL1\n\t{\n\t\tstruct \n\t\t{\n/* 0*/      unsigned DAC:4;\n/* 4*/      unsigned :5;\n/* 9*/      unsigned P:1;\n/*10*/      unsigned LD_EN:1;\n/*11*/      unsigned AUTOCAL_EN:1;\n/*12*/      unsigned PDP:1;\n/*13*/      unsigned CPL:1;\n/*14*/      unsigned LPF:1;\n/*15*/      unsigned VTC_EN:1;\n/*16*/      unsigned KV_EN:1;\n/*17*/      unsigned PLL_EN:1;\n\t\t} bits;\n\t\tu32 val;\n\t} RFPLL1;\n\tunion RFPLL2\n\t{\n\t\tstruct \n\t\t{\n/* 0*/      unsigned NUM2:6;\n/* 6*/      unsigned N2:12;\n\t\t} bits;\n\t\tu32 val;\n\t} RFPLL2;\n\tunion RFPLL3\n\t{\n\t\tstruct \n\t\t{\n/* 0*/\t\tunsigned NUM2:18;\n\t\t} bits;\n\t\tu32 val;\n\t} RFPLL3;\n\tunion RFPLL4\n\t{\n\t\tstruct \n\t\t{\n/* 0*/\t\tunsigned KV_DEF:4;\n/* 4*/      unsigned CT_DEF:4;\n/* 8*/      unsigned DN:9;\n/*17*/      unsigned :1;\n\t\t} bits;\n\t\tu32 val;\n\t} RFPLL4;\n\tunion CAL1\n\t{\n\t\tstruct \n\t\t{\n/* 0*/      unsigned LD_WINDOW:3;\n/* 3*/      unsigned M_CT_VALUE:5;\n/* 8*/      unsigned TLOCK:5;\n/*13*/      unsigned TVCO:5;\n\t\t} bits;\n\t\tu32 val;\n\t} CAL1;\n\tunion TXRX1\n\t{\n\t\tstruct \n\t\t{\n/* 0*/      unsigned TXBYPASS:1;\n/* 1*/      unsigned INTBIASEN:1;\n/* 2*/      unsigned TXENMODE:1;\n/* 3*/      unsigned TXDIFFMODE:1;\n/* 4*/      unsigned TXLPFBW:3;\n/* 7*/      unsigned RXLPFBW:3;\n/*10*/      unsigned TXVGC:5;\n/*15*/      unsigned PCONTROL:2;\n/*17*/      unsigned RXDCFBBYPS:1;\n\t\t} bits;\n\t\tu32 val;\n\t} TXRX1;\n\tunion PCNT1\n\t{\n\t\tstruct \n\t\t{\n/* 0*/      unsigned TX_DELAY:3;\n/* 3*/      unsigned PC_OFFSET:6;\n/* 9*/      unsigned P_DESIRED:6;\n/*15*/      unsigned MID_BIAS:3;\n\t\t} bits;\n\t\tu32 val;\n\t} PCNT1;\n\tunion PCNT2\n\t{\n\t\tstruct \n\t\t{\n/* 0*/      unsigned MIN_POWER:6;\n/* 6*/      unsigned MID_POWER:6;\n/*12*/      unsigned MAX_POWER:6;\n\t\t} bits;\n\t\tu32 val;\n\t} PCNT2;\n\tunion VCOT1\n\t{\n\t\tstruct \n\t\t{\n/* 0*/      unsigned :16;\n/*16*/      unsigned AUX1:1;\n/*17*/      unsigned AUX:1;\n\t\t} bits;\n\t\tu32 val;\n\t} VCOT1;\n} rffilter_t;\n\n/* baseband chip refered as BB_, dataformat is unknown yet */\n/* it has at least 105 bytes of functional data */\ntypedef struct\n{\n\tu8    data[105];\n} bb_t;\n\n/* communication interface between RF,BB and the mac */\ntypedef union\n{\n\tstruct {\n/* 0*/  unsigned wordsize:5;\n/* 5*/  unsigned :2;\n/* 7*/  unsigned readOperation:1;\n/* 8*/  unsigned :8;\n\t} bits;\n\tu16 val;\n} rfIOCnt_t;\n\ntypedef union\n{\n\tstruct {\n/* 0*/\t\tunsigned busy:1;\n/* 1*/      unsigned :15;\n\t} bits;\n\tu16 val;\n} rfIOStat_t;\n\ntypedef union\n{\n\tstruct {\n/* 0*/  unsigned content:18;\n/*18*/  unsigned address:5;\n/*23*/  unsigned :9;\n\t} bits;\n\tstruct {\n/* 0*/  unsigned low:16;\n/*16*/  unsigned high:16;\n\t} val16;\n\tu16 array16[2];\n\tu32 val;\n} rfIOData_t;\n\ntypedef union\n{\n\tstruct {\n/* 0*/  unsigned address:7;\n/* 7*/  unsigned :5;\n/*12*/  unsigned mode:2;\n/*14*/  unsigned enable:1;\n/*15*/  unsigned :1;\n\t} bits;\n\tu16 val;\n} bbIOCnt_t;\n\n#define WIFI_IRQ_RXEND\t\t\t\t\t0\n#define WIFI_IRQ_TXEND\t\t\t\t\t1\n#define WIFI_IRQ_RXINC\t\t\t\t\t2\n#define WIFI_IRQ_TXERROR\t            3\n#define WIFI_IRQ_RXOVF\t\t\t\t\t4\n#define WIFI_IRQ_TXERROVF\t\t\t\t5\n#define WIFI_IRQ_RXSTART\t\t\t\t6\n#define WIFI_IRQ_TXSTART\t\t\t\t7\n#define WIFI_IRQ_TXCOUNTEXP\t\t\t\t8\n#define WIFI_IRQ_RXCOUNTEXP\t\t\t\t9\n#define WIFI_IRQ_RFWAKEUP               11\n#define WIFI_IRQ_UNK\t\t\t\t\t12\n#define WIFI_IRQ_TIMEPOSTBEACON\t\t\t13\n#define WIFI_IRQ_TIMEBEACON             14\n#define WIFI_IRQ_TIMEPREBEACON          15\n\nstruct Wifi_TXSlot\n{\n\tu16 RegVal;\n\n\tu16 CurAddr;\n\tint RemPreamble; // preamble time in s\n\tint RemHWords;\n\tu32 TimeMask; // 3 = 2mbps, 7 = 1mbps\n\tbool NotStarted;\n};\n\n#define WIFI_TXSLOT_LOC1\t\t0\n#define WIFI_TXSLOT_MPCMD\t\t1\n#define WIFI_TXSLOT_LOC2\t\t2\n#define WIFI_TXSLOT_LOC3\t\t3\n#define WIFI_TXSLOT_BEACON\t\t4\n#define WIFI_TXSLOT_MPREPLY\t\t5\n#define WIFI_TXSLOT_NUM\t\t\t6\n\nstruct Wifi_RXPacket\n{\n\tu8* Data;\n\tint CurOffset;\n\tint RemHWords;\n\tbool NotStarted;\n};\n\ntypedef std::queue<Wifi_RXPacket> Wifi_RXPacketQueue;\n\nenum EAPStatus\n{\n\tAPStatus_Disconnected = 0,\n\tAPStatus_Authenticated,\n\tAPStatus_Associated\n};\n\n/* wifimac_t: the buildin mac (arm7 addressrange: 0x04800000-0x04FFFFFF )*/\n/* http://www.akkit.org/info/dswifi.htm#WifiIOMap */\n\ntypedef struct \n{\n\t/* power */\n\tBOOL powerOn;\n\tBOOL powerOnPending;\n\n\t/* status */\n\tu16 rfStatus;\n\tu16 rfPins;\n\n\t/* wifi interrupt handling */\n    u16   IE;\n    u16   IF;\n\n\t/* modes */\n\tu16 macMode;\n\tu16 wepMode;\n\tBOOL WEP_enable;\n\n\t/* sending */\n\tu16 TXStatCnt;\n\tu16 TXPower;\n\tu16 TXCnt;\n\tu16 TXStat;\n\tu16 TXSeqNo;\n\tWifi_TXSlot TXSlots[WIFI_TXSLOT_NUM];\n\tint TXCurSlot;\n\tu16 TXBusy;\n\n\t/* receiving */\n\tu16 RXCnt;\n\tu16 RXCheckCounter;\n\tu8 RXNum;\n\tWifi_RXPacketQueue RXPacketQueue;\n\n\tu16 RXStatIncIF, RXStatIncIE;\n\tu16 RXStatOvfIF, RXStatOvfIE;\n\tu8 RXStat[16];\n\tu16 RXTXAddr;\n\n\t/* addressing/handshaking */\n\tunion\n\t{\n\t\t//TODO - is this endian safe? don't think so\n\t\tu16  words[3];\n\t\tu8\t bytes[6];\n\t} mac;\n\tunion\n\t{\n\t\tu16  words[3];\n\t\tu8\t bytes[6];\n\t} bss;\n\tu16 aid;\n\tu16 pid; /* player ID or aid_low */\n\tu16 retryLimit;\n\n\t/* timing */\n\tu64 GlobalUsecTimer;\n\tBOOL crystalEnabled;\n\tu64 usec;\n\tBOOL usecEnable;\n\tu64 ucmp;\n\tBOOL ucmpEnable;\n\tu32 eCount;\n\tBOOL eCountEnable;\n\tu16 BeaconInterval;\n\tu16 BeaconCount1;\n\tu16 BeaconCount2;\n\tu16 ListenInterval;\n\tu16 ListenCount;\n\n\t/* subchips */\n    rffilter_t \tRF;\n\tbb_t        BB;\n\n\t/* subchip communications */\n    rfIOCnt_t   rfIOCnt;\n\trfIOStat_t  rfIOStatus;\n\trfIOData_t  rfIOData;\n    bbIOCnt_t   bbIOCnt;\n\n\t/* buffers */\n\tu16         RAM[0x1000];\n\tu16         RXRangeBegin;\n\tu16         RXRangeEnd;\n\tu16\t\t\tRXWriteCursor;\n\tu16         RXReadCursor;\n\tu16         RXUnits;\n\tu16\t\t\tRXBufCount;\n\tu16         CircBufReadAddress;\n\tu16         CircBufWriteAddress;\n\tu16         CircBufRdEnd;\n\tu16         CircBufRdSkip;\n\tu16         CircBufWrEnd;\n\tu16         CircBufWrSkip;\n\n\t/* I/O ports */\n\tu16\t\t\tIOPorts[0x800];\n\n\t/* others */\n\tu16\t\t\trandomSeed;\n\n} wifimac_t;\n\n\ntypedef struct\n{\n\tEAPStatus status;\n\tu16 seqNum;\n\n} SoftAP_t;\n\n// desmume host communication\n#ifdef EXPERIMENTAL_WIFI_COMM\ntypedef struct pcap pcap_t;\nextern pcap_t *wifi_bridge;\n#endif\n\nextern wifimac_t wifiMac;\nextern SoftAP_t SoftAP;\n\nbool WIFI_Init();\nvoid WIFI_DeInit();\nvoid WIFI_Reset();\n\n/* subchip communication IO functions */\nvoid WIFI_setRF_CNT(u16 val);\nvoid WIFI_setRF_DATA(u16 val, u8 part);\nu16  WIFI_getRF_DATA(u8 part);\nu16  WIFI_getRF_STATUS();\n\nvoid WIFI_setBB_CNT(u16 val);\nu8   WIFI_getBB_DATA();\nvoid WIFI_setBB_DATA(u8 val);\n\n/* wifimac io */\nvoid WIFI_write16(u32 address, u16 val);\nu16  WIFI_read16(u32 address);\n\n/* wifimac timing */\nvoid WIFI_usTrigger();\n\n\n/* DS WFC profile data documented here : */\n/* http://dsdev.bigredpimp.com/2006/07/31/aoss-wfc-profile-data/ */\n/* Note : we use bytes to avoid endianness issues */\ntypedef struct _FW_WFCProfile\n{\n\tchar SSID[32];\n\tchar SSID_WEP64[32];\n\tchar WEPKEY_PART1[16];\n\tchar WEPKEY_PART2[16];\n\tchar WEPKEY_PART3[16];\n\tchar WEPKEY_PART4[16];\n\tu8 IP_ADDRESS[4];\n\tu8 GATEWAY[4];\n\tu8 PRIM_DNS[4];\n\tu8 SEC_DNS[4];\n\tu8 SUBNET_MASK;\n\tu8 WEP64_KEY_AOSS[20];\n\tu8 UNK1;\n\tu8 WEP_MODE;\n\tu8 STATUS;\n\tu8 UNK2[7];\n\tu8 UNK3;\n\tu8 UNK4[14];\n\tu8 CRC16[2];\n\n} FW_WFCProfile;\n\n/* wifi data to be stored in firmware, when no firmware image was loaded */\nextern u8 FW_Mac[6];\nextern const u8 FW_WIFIInit[32];\nextern const u8 FW_BBInit[105];\nextern const u8 FW_RFInit[36];\nextern const u8 FW_RFChannel[6*14];\nextern const u8 FW_BBChannel[14];\nextern FW_WFCProfile FW_WFCProfile1;\nextern FW_WFCProfile FW_WFCProfile2;\nextern FW_WFCProfile FW_WFCProfile3;\n\n#endif\n"
  },
  {
    "path": "app/src/main/jni/desmume/wxwin.m4",
    "content": "dnl ---------------------------------------------------------------------------\ndnl Macros for wxWidgets detection. Typically used in configure.in as:\ndnl\ndnl     AC_ARG_ENABLE(...)\ndnl     AC_ARG_WITH(...)\ndnl        ...\ndnl     AM_OPTIONS_WXCONFIG\ndnl        ...\ndnl        ...\ndnl     AM_PATH_WXCONFIG(2.6.0, wxWin=1)\ndnl     if test \"$wxWin\" != 1; then\ndnl        AC_MSG_ERROR([\ndnl                wxWidgets must be installed on your system\ndnl                but wx-config script couldn't be found.\ndnl\ndnl                Please check that wx-config is in path, the directory\ndnl                where wxWidgets libraries are installed (returned by\ndnl                'wx-config --libs' command) is in LD_LIBRARY_PATH or\ndnl                equivalent variable and wxWidgets version is 2.3.4 or above.\ndnl        ])\ndnl     fi\ndnl     CPPFLAGS=\"$CPPFLAGS $WX_CPPFLAGS\"\ndnl     CXXFLAGS=\"$CXXFLAGS $WX_CXXFLAGS_ONLY\"\ndnl     CFLAGS=\"$CFLAGS $WX_CFLAGS_ONLY\"\ndnl\ndnl     LIBS=\"$LIBS $WX_LIBS\"\ndnl ---------------------------------------------------------------------------\n\ndnl ---------------------------------------------------------------------------\ndnl AM_OPTIONS_WXCONFIG\ndnl\ndnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and\ndnl --wx-config command line options\ndnl ---------------------------------------------------------------------------\n\nAC_DEFUN([AM_OPTIONS_WXCONFIG],\n[\n    AC_ARG_WITH(wxdir,\n                [  --with-wxdir=PATH       Use uninstalled version of wxWidgets in PATH],\n                [ wx_config_name=\"$withval/wx-config\"\n                  wx_config_args=\"--inplace\"])\n    AC_ARG_WITH(wx-config,\n                [  --with-wx-config=CONFIG wx-config script to use (optional)],\n                wx_config_name=\"$withval\" )\n    AC_ARG_WITH(wx-prefix,\n                [  --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)],\n                wx_config_prefix=\"$withval\", wx_config_prefix=\"\")\n    AC_ARG_WITH(wx-exec-prefix,\n                [  --with-wx-exec-prefix=PREFIX\n                          Exec prefix where wxWidgets is installed (optional)],\n                wx_config_exec_prefix=\"$withval\", wx_config_exec_prefix=\"\")\n])\n\ndnl Helper macro for checking if wx version is at least $1.$2.$3, set's\ndnl wx_ver_ok=yes if it is:\nAC_DEFUN([_WX_PRIVATE_CHECK_VERSION],\n[\n    wx_ver_ok=\"\"\n    if test \"x$WX_VERSION\" != x ; then\n      if test $wx_config_major_version -gt $1; then\n        wx_ver_ok=yes\n      else\n        if test $wx_config_major_version -eq $1; then\n           if test $wx_config_minor_version -gt $2; then\n              wx_ver_ok=yes\n           else\n              if test $wx_config_minor_version -eq $2; then\n                 if test $wx_config_micro_version -ge $3; then\n                    wx_ver_ok=yes\n                 fi\n              fi\n           fi\n        fi\n      fi\n    fi\n])\n\ndnl ---------------------------------------------------------------------------\ndnl AM_PATH_WXCONFIG(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND\ndnl                  [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]])\ndnl\ndnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC\ndnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME\ndnl environment variable to override the default name of the wx-config script\ndnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this\ndnl case the macro won't even waste time on tests for its existence.\ndnl\ndnl Optional WX-LIBS argument contains comma- or space-separated list of\ndnl wxWidgets libraries to link against (it may include contrib libraries). If\ndnl it is not specified then WX_LIBS and WX_LIBS_STATIC will contain flags to\ndnl link with all of the core wxWidgets libraries.\ndnl\ndnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config\ndnl invocation command in present. It can be used to fine-tune lookup of\ndnl best wxWidgets build available.\ndnl\ndnl Example use:\ndnl   AM_PATH_WXCONFIG([2.6.0], [wxWin=1], [wxWin=0], [html,core,net]\ndnl                    [--unicode --debug])\ndnl ---------------------------------------------------------------------------\n\ndnl\ndnl Get the cflags and libraries from the wx-config script\ndnl\nAC_DEFUN([AM_PATH_WXCONFIG],\n[\n  dnl do we have wx-config name: it can be wx-config or wxd-config or ...\n  if test x${WX_CONFIG_NAME+set} != xset ; then\n     WX_CONFIG_NAME=wx-config\n  fi\n\n  if test \"x$wx_config_name\" != x ; then\n     WX_CONFIG_NAME=\"$wx_config_name\"\n  fi\n\n  dnl deal with optional prefixes\n  if test x$wx_config_exec_prefix != x ; then\n     wx_config_args=\"$wx_config_args --exec-prefix=$wx_config_exec_prefix\"\n     WX_LOOKUP_PATH=\"$wx_config_exec_prefix/bin\"\n  fi\n  if test x$wx_config_prefix != x ; then\n     wx_config_args=\"$wx_config_args --prefix=$wx_config_prefix\"\n     WX_LOOKUP_PATH=\"$WX_LOOKUP_PATH:$wx_config_prefix/bin\"\n  fi\n  if test \"$cross_compiling\" = \"yes\"; then\n     wx_config_args=\"$wx_config_args --host=$host_alias\"\n  fi\n\n  dnl don't search the PATH if WX_CONFIG_NAME is absolute filename\n  if test -x \"$WX_CONFIG_NAME\" ; then\n     AC_MSG_CHECKING(for wx-config)\n     WX_CONFIG_PATH=\"$WX_CONFIG_NAME\"\n     AC_MSG_RESULT($WX_CONFIG_PATH)\n  else\n     AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, \"$WX_LOOKUP_PATH:$PATH\")\n  fi\n\n  if test \"$WX_CONFIG_PATH\" != \"no\" ; then\n    WX_VERSION=\"\"\n\n    min_wx_version=ifelse([$1], ,2.2.1,$1)\n    if test -z \"$5\" ; then\n      AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version])\n    else\n      AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)])\n    fi\n\n    WX_CONFIG_WITH_ARGS=\"$WX_CONFIG_PATH $wx_config_args $5 $4\"\n\n    WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null`\n    wx_config_major_version=`echo $WX_VERSION | \\\n           sed 's/\\([[0-9]]*\\).\\([[0-9]]*\\).\\([[0-9]]*\\)/\\1/'`\n    wx_config_minor_version=`echo $WX_VERSION | \\\n           sed 's/\\([[0-9]]*\\).\\([[0-9]]*\\).\\([[0-9]]*\\)/\\2/'`\n    wx_config_micro_version=`echo $WX_VERSION | \\\n           sed 's/\\([[0-9]]*\\).\\([[0-9]]*\\).\\([[0-9]]*\\)/\\3/'`\n\n    wx_requested_major_version=`echo $min_wx_version | \\\n           sed 's/\\([[0-9]]*\\).\\([[0-9]]*\\).\\([[0-9]]*\\)/\\1/'`\n    wx_requested_minor_version=`echo $min_wx_version | \\\n           sed 's/\\([[0-9]]*\\).\\([[0-9]]*\\).\\([[0-9]]*\\)/\\2/'`\n    wx_requested_micro_version=`echo $min_wx_version | \\\n           sed 's/\\([[0-9]]*\\).\\([[0-9]]*\\).\\([[0-9]]*\\)/\\3/'`\n\n    _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version],\n                              [$wx_requested_minor_version],\n                              [$wx_requested_micro_version])\n\n    if test -n \"$wx_ver_ok\"; then\n\n      AC_MSG_RESULT(yes (version $WX_VERSION))\n      WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs`\n\n      dnl is this even still appropriate?  --static is a real option now\n      dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is\n      dnl what the user actually wants, making this redundant at best.\n      dnl For now keep it in case anyone actually used it in the past.\n      AC_MSG_CHECKING([for wxWidgets static library])\n      WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null`\n      if test \"x$WX_LIBS_STATIC\" = \"x\"; then\n        AC_MSG_RESULT(no)\n      else\n        AC_MSG_RESULT(yes)\n      fi\n\n      dnl starting with version 2.2.6 wx-config has --cppflags argument\n      wx_has_cppflags=\"\"\n      if test $wx_config_major_version -gt 2; then\n        wx_has_cppflags=yes\n      else\n        if test $wx_config_major_version -eq 2; then\n           if test $wx_config_minor_version -gt 2; then\n              wx_has_cppflags=yes\n           else\n              if test $wx_config_minor_version -eq 2; then\n                 if test $wx_config_micro_version -ge 6; then\n                    wx_has_cppflags=yes\n                 fi\n              fi\n           fi\n        fi\n      fi\n\n      dnl starting with version 2.7.0 wx-config has --rescomp option\n      wx_has_rescomp=\"\"\n      if test $wx_config_major_version -gt 2; then\n        wx_has_rescomp=yes\n      else\n        if test $wx_config_major_version -eq 2; then\n           if test $wx_config_minor_version -ge 7; then\n              wx_has_rescomp=yes\n           fi\n        fi\n      fi\n      if test \"x$wx_has_rescomp\" = x ; then\n         dnl cannot give any useful info for resource compiler\n         WX_RESCOMP=\n      else\n         WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp`\n      fi\n\n      if test \"x$wx_has_cppflags\" = x ; then\n         dnl no choice but to define all flags like CFLAGS\n         WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags`\n         WX_CPPFLAGS=$WX_CFLAGS\n         WX_CXXFLAGS=$WX_CFLAGS\n\n         WX_CFLAGS_ONLY=$WX_CFLAGS\n         WX_CXXFLAGS_ONLY=$WX_CFLAGS\n      else\n         dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS\n         WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags`\n         WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags`\n         WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags`\n\n         WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed \"s@^$WX_CPPFLAGS *@@\"`\n         WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed \"s@^$WX_CFLAGS *@@\"`\n      fi\n\n      ifelse([$2], , :, [$2])\n\n    else\n\n       if test \"x$WX_VERSION\" = x; then\n          dnl no wx-config at all\n          AC_MSG_RESULT(no)\n       else\n          AC_MSG_RESULT(no (version $WX_VERSION is not new enough))\n       fi\n\n       WX_CFLAGS=\"\"\n       WX_CPPFLAGS=\"\"\n       WX_CXXFLAGS=\"\"\n       WX_LIBS=\"\"\n       WX_LIBS_STATIC=\"\"\n       WX_RESCOMP=\"\"\n       ifelse([$3], , :, [$3])\n\n    fi\n  else\n\n    WX_CFLAGS=\"\"\n    WX_CPPFLAGS=\"\"\n    WX_CXXFLAGS=\"\"\n    WX_LIBS=\"\"\n    WX_LIBS_STATIC=\"\"\n    WX_RESCOMP=\"\"\n\n    ifelse([$3], , :, [$3])\n\n  fi\n\n  AC_SUBST(WX_CPPFLAGS)\n  AC_SUBST(WX_CFLAGS)\n  AC_SUBST(WX_CXXFLAGS)\n  AC_SUBST(WX_CFLAGS_ONLY)\n  AC_SUBST(WX_CXXFLAGS_ONLY)\n  AC_SUBST(WX_LIBS)\n  AC_SUBST(WX_LIBS_STATIC)\n  AC_SUBST(WX_VERSION)\n  AC_SUBST(WX_RESCOMP)\n])\n\ndnl ---------------------------------------------------------------------------\ndnl Get information on the wxrc program for making C++, Python and xrs\ndnl resource files.\ndnl\ndnl     AC_ARG_ENABLE(...)\ndnl     AC_ARG_WITH(...)\ndnl        ...\ndnl     AM_OPTIONS_WXCONFIG\ndnl        ...\ndnl     AM_PATH_WXCONFIG(2.6.0, wxWin=1)\ndnl     if test \"$wxWin\" != 1; then\ndnl        AC_MSG_ERROR([\ndnl                wxWidgets must be installed on your system\ndnl                but wx-config script couldn't be found.\ndnl\ndnl                Please check that wx-config is in path, the directory\ndnl                where wxWidgets libraries are installed (returned by\ndnl                'wx-config --libs' command) is in LD_LIBRARY_PATH or\ndnl                equivalent variable and wxWidgets version is 2.6.0 or above.\ndnl        ])\ndnl     fi\ndnl\ndnl     AM_PATH_WXRC([HAVE_WXRC=1], [HAVE_WXRC=0])\ndnl     if test \"x$HAVE_WXRC\" != x1; then\ndnl         AC_MSG_ERROR([\ndnl                The wxrc program was not installed or not found.\ndnl     \ndnl                Please check the wxWidgets installation.\ndnl         ])\ndnl     fi\ndnl\ndnl     CPPFLAGS=\"$CPPFLAGS $WX_CPPFLAGS\"\ndnl     CXXFLAGS=\"$CXXFLAGS $WX_CXXFLAGS_ONLY\"\ndnl     CFLAGS=\"$CFLAGS $WX_CFLAGS_ONLY\"\ndnl\ndnl     LDFLAGS=\"$LDFLAGS $WX_LIBS\"\ndnl ---------------------------------------------------------------------------\n\n\n\ndnl ---------------------------------------------------------------------------\ndnl AM_PATH_WXRC([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])\ndnl\ndnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS\ndnl resources.  The variable WXRC will be set and substituted in the configure\ndnl script and Makefiles.\ndnl\ndnl Example use:\ndnl   AM_PATH_WXRC([wxrc=1], [wxrc=0])\ndnl ---------------------------------------------------------------------------\n\ndnl\ndnl wxrc program from the wx-config script\ndnl\nAC_DEFUN([AM_PATH_WXRC],\n[\n  AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler])\n    \n  if test \"x$WX_CONFIG_NAME\" = x; then\n    AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.])\n  else\n    \n    AC_MSG_CHECKING([for wxrc])\n    \n    if test \"x$WXRC\" = x ; then\n      dnl wx-config --utility is a new addition to wxWidgets:\n      _WX_PRIVATE_CHECK_VERSION(2,5,3)\n      if test -n \"$wx_ver_ok\"; then\n        WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc`\n      fi\n    fi\n\n    if test \"x$WXRC\" = x ; then\n      AC_MSG_RESULT([not found])\n      ifelse([$2], , :, [$2])\n    else\n      AC_MSG_RESULT([$WXRC])\n      ifelse([$1], , :, [$1])\n    fi\n    \n    AC_SUBST(WXRC)\n  fi\n])\n"
  },
  {
    "path": "app/src/main/jni/desmume_compat.mk",
    "content": "# Android ndk makefile for ds4droid\r\n\r\nLOCAL_PATH := $(call my-dir)\r\n\r\nMY_LOCAL_PATH := $(LOCAL_PATH)\r\n\r\ninclude $(CLEAR_VARS)\r\n\r\n\r\nLOCAL_MODULE    \t\t:= \tlibdesmumecompat\r\nLOCAL_C_INCLUDES\t\t:= \t$(LOCAL_PATH)/desmume/src \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android/7z/CPP \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android/7z/CPP/include_windows \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/utils/lightning/include\r\n\t\t\t\t\t\t   \r\nLOCAL_SRC_FILES\t\t\t:= \tdesmume/src/addons/slot1_none.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_r4.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_retail.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_retail_nand.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_expMemory.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_gbagame.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_guitarGrip.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_mpcf.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_none.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_paddle.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_piano.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_rumblepak.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/crc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/decrypt.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/header.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/cache.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/directory.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/disc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/fatfile.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/fatdir.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/file_allocation_table.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/filetime.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/libfat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/libfat_public_api.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/lock.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/partition.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxml.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxmlparser.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxmlerror.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinystr.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/ConvertUTF.c \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/datetime.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/dlditool.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/emufat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/FileMap.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/guid.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/md5.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/MemBuffer.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/task.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/vfat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/xstring.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/metaspu/metaspu.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/2xsai.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/bilinear.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/epx.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/hq2x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/hq4x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/lq2x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/scanline.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/arm_instructions.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmAnalyze.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/armcpu.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmThreadedInterpreter.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmLJit.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/bios.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/cheatSystem.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/common.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/cp15.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/CpuBase.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/debug.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/Disassembler.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/driver.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/emufile.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/FIFO.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/firmware.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/fs-linux.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/gfx3d.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/GPU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/GPU_osd_stub.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/JitCommon.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/matrix.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/mc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/MMU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/movie.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/NDSSystem.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/OGLES2Render.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/path.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/rasterize.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/readwrite.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/render3D.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ROMReader.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/rtc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/saves.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/slot1.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/SPU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/texcache.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/thumb_instructions.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/version.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/wifi.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/mic.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/throttle.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/main.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/OpenArchive.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/7zip.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/sndopensl.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/draw.cpp \r\n\t\t\t\t\t\t\t\r\nLOCAL_ARM_MODE \t\t\t:= thumb\r\nLOCAL_ARM_NEON \t\t\t:= false\r\nLOCAL_CFLAGS\t\t\t:= -DANDROID -DHAVE_LIBZ -DNO_MEMDEBUG -DNO_GPUDEBUG -DHAVE_JIT\r\nLOCAL_STATIC_LIBRARIES \t:= sevenzip\r\nLOCAL_LDLIBS \t\t\t:= -llog -lz -lGLESv2 -lEGL -ljnigraphics -lOpenSLES -landroid\r\n\r\nifeq ($(TARGET_ARCH_ABI),armeabi)\r\nLOCAL_CFLAGS\t\t\t+= -DLIGHTNING_ARM\r\nendif\r\n\r\nifeq ($(TARGET_ARCH_ABI),armeabi-v7a)\r\nLOCAL_CFLAGS\t\t\t+= -DLIGHTNING_ARM\r\nendif\r\n\r\nifeq ($(TARGET_ARCH_ABI),x86)\r\nLOCAL_CFLAGS\t\t\t+= -DLIGHTNING_I386\r\nendif\r\n\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume_neon.mk",
    "content": "# Android ndk makefile for ds4droid\r\n\r\nLOCAL_PATH := $(call my-dir)\r\n\r\nMY_LOCAL_PATH := $(LOCAL_PATH)\r\n\r\ninclude $(CLEAR_VARS)\r\n\r\n\r\nLOCAL_MODULE    \t\t:= \tlibdesmumeneon\r\nLOCAL_C_INCLUDES\t\t:= \t$(LOCAL_PATH)/desmume/src \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android/7z/CPP \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android/7z/CPP/include_windows \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android/7z/CPP/myWindows \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/utils/lightning/include\r\n\t\t\t\t\t\t   \r\nLOCAL_SRC_FILES\t\t\t:= \tdesmume/src/addons/slot1_none.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_r4.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_retail.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_retail_nand.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_expMemory.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_gbagame.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_guitarGrip.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_mpcf.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_none.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_paddle.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_piano.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_rumblepak.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/crc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/decrypt.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/header.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/cache.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/directory.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/disc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/fatfile.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/fatdir.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/file_allocation_table.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/filetime.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/libfat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/libfat_public_api.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/lock.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/partition.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxml.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxmlparser.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxmlerror.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinystr.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/ConvertUTF.c \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/datetime.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/dlditool.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/emufat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/FileMap.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/guid.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/md5.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/MemBuffer.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/task.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/vfat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/xstring.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/metaspu/metaspu.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/2xsai.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/bilinear.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/epx.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/hq2x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/hq4x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/lq2x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/scanline.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/arm_instructions.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmAnalyze.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/armcpu.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmThreadedInterpreter.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmLJit.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/bios.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/cheatSystem.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/common.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/cp15.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/CpuBase.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/debug.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/Disassembler.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/driver.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/emufile.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/FIFO.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/firmware.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/fs-linux.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/gfx3d.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/GPU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/GPU_osd_stub.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/JitCommon.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/matrix.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/mc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/MMU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/movie.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/NDSSystem.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/OGLES2Render.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/path.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/rasterize.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/readwrite.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/render3D.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ROMReader.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/rtc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/saves.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/slot1.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/SPU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/texcache.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/thumb_instructions.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/version.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/wifi.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/mic.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/throttle.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/main.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/OpenArchive.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/7zip.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/neontest.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/sndopensl.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/draw.cpp \r\n\t\t\t\t\t\t\t\r\nLOCAL_ARM_NEON \t\t\t:= true\r\nLOCAL_ARM_MODE \t\t\t:= arm\r\nLOCAL_CFLAGS\t\t\t:= -DANDROID -DHAVE_LIBZ -DNO_MEMDEBUG -DNO_GPUDEBUG -DHAVE_JIT -DLIGHTNING_ARM -DHAVE_NEON=1 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a9\r\nLOCAL_STATIC_LIBRARIES \t:= mathneon sevenzip\r\nLOCAL_LDLIBS \t\t\t:= -llog -lz -lEGL -lGLESv2 -ljnigraphics -lOpenSLES -landroid\r\n\r\n#For profiling\r\n#LOCAL_CFLAGS += -DUSE_PROFILER -pg\r\n#LOCAL_STATIC_LIBRARIES += android-ndk-profiler\r\n\r\n#To check for speed improvements\r\n#LOCAL_CFLAGS += -DMEASURE_FIRST_FRAMES\r\n\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n\r\ninclude $(MY_LOCAL_PATH)/android-ndk-profiler/Android.mk\r\ninclude $(MY_LOCAL_PATH)/desmume/src/android/math-neon/Android.mk\r\n\r\n"
  },
  {
    "path": "app/src/main/jni/desmume_v7.mk",
    "content": "# Android ndk makefile for ds4droid\r\n\r\nLOCAL_PATH := $(call my-dir)\r\n\r\nMY_LOCAL_PATH := $(LOCAL_PATH)\r\n\r\ninclude $(CLEAR_VARS)\r\n\r\n\r\nLOCAL_MODULE    \t\t:= \tlibdesmumev7\r\nLOCAL_C_INCLUDES\t\t:= \t$(LOCAL_PATH)/desmume/src \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android/7z/CPP \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/android/7z/CPP/include_windows \\\r\n\t\t\t\t\t\t\t$(LOCAL_PATH)/desmume/src/utils/lightning/include\r\n\t\t\t\t\t\t   \r\nLOCAL_SRC_FILES\t\t\t:= \tdesmume/src/addons/slot1_none.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_r4.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_retail.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot1_retail_nand.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_expMemory.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_gbagame.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_guitarGrip.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_mpcf.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_none.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_paddle.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_piano.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons/slot2_rumblepak.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/crc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/decrypt.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/decrypt/header.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/cache.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/directory.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/disc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/fatfile.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/fatdir.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/file_allocation_table.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/filetime.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/libfat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/libfat_public_api.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/lock.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/libfat/partition.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxml.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxmlparser.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinyxmlerror.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/tinyxml/tinystr.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/ConvertUTF.c \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/datetime.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/dlditool.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/emufat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/FileMap.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/guid.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/md5.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/MemBuffer.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/task.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/vfat.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/utils/xstring.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/metaspu/metaspu.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/2xsai.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/bilinear.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/epx.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/hq2x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/hq4x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/lq2x.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/filter/scanline.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/addons.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/arm_instructions.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmAnalyze.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/armcpu.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmThreadedInterpreter.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ArmLJit.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/bios.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/cheatSystem.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/common.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/cp15.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/CpuBase.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/debug.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/Disassembler.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/driver.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/emufile.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/FIFO.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/firmware.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/fs-linux.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/gfx3d.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/GPU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/GPU_osd_stub.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/JitCommon.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/matrix.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/mc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/MMU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/movie.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/NDSSystem.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/OGLES2Render.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/path.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/rasterize.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/readwrite.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/render3D.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/ROMReader.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/rtc.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/saves.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/slot1.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/SPU.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/texcache.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/thumb_instructions.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/version.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/wifi.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/mic.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/throttle.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/main.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/OpenArchive.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/7zip.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/sndopensl.cpp \\\r\n\t\t\t\t\t\t\tdesmume/src/android/draw.cpp \r\n\t\t\t\t\t\t\t\r\nLOCAL_ARM_NEON \t\t\t:= true\r\nLOCAL_ARM_MODE \t\t\t:= arm\r\nLOCAL_CFLAGS\t\t\t:= -DANDROID -DHAVE_LIBZ -DNO_MEMDEBUG -DNO_GPUDEBUG -DHAVE_JIT -DLIGHTNING_ARM -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a\r\nLOCAL_STATIC_LIBRARIES \t:= sevenzip tinyccarm\r\nLOCAL_LDLIBS \t\t\t:= -llog -lz -lGLESv2 -lEGL -ljnigraphics -lOpenSLES -landroid \r\n\r\n#To check for speed improvements\r\n#LOCAL_CFLAGS += -DMEASURE_FIRST_FRAMES\r\n\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n\r\n\r\n"
  },
  {
    "path": "app/src/main/res/drawable/bkg_griditem.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:insetLeft=\"6dip\"\n\tandroid:insetTop=\"4dip\"\n\tandroid:insetRight=\"6dip\"\n\tandroid:insetBottom=\"4dip\">\n\t\n\t<layer-list>\n\t\t<item>\n\t\t\t<shape android:shape=\"rectangle\" android:dither=\"true\">\n\t\t\t\t<corners android:radius=\"2dip\"/>\n\t\t\t\t<solid android:color=\"@color/shadow\" />\n\t\t\t</shape>\n\t\t</item>\n\t\n\t\t<item android:bottom=\"2dip\">\n\t\t\t<selector>\n\t\t\t\t<item android:state_pressed=\"false\">\n\t\t\t\t\t<shape android:shape=\"rectangle\" android:dither=\"true\">\n\t\t\t\t\t\t<corners android:radius=\"2dip\" />\n\t\t\t\t\t\t<solid android:color=\"@color/bkg_card_normal\"/>\n\t\t\t\t\t\t<padding android:bottom=\"8dip\" android:left=\"8dip\" android:right=\"8dip\" android:top=\"8dip\" />\n\t\t\t\t\t</shape>\n\t\t\t\t</item>\n\t\t\t\t<item android:state_pressed=\"true\">\n\t\t\t\t\t<shape android:shape=\"rectangle\" android:dither=\"true\">\n\t\t\t\t\t\t<corners android:radius=\"2dip\" />\n\t\t\t\t\t\t<solid android:color=\"@color/bkg_card_pressed\"/>\n\t\t\t\t\t\t<padding android:bottom=\"8dip\" android:left=\"8dip\" android:right=\"8dip\" android:top=\"8dip\" />\n\t\t\t\t\t</shape>\n\t\t\t\t</item>\n\t\t\t</selector>\n\t\t</item>\n\t</layer-list>\n\t\n</inset>"
  },
  {
    "path": "app/src/main/res/layout/about.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:layout_width=\"fill_parent\"\r\n    android:layout_height=\"fill_parent\"\r\n    android:orientation=\"vertical\" >\r\n\r\n    <TextView\r\n        android:id=\"@+id/textView1\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:gravity=\"center_horizontal\"\r\n        android:text=\"@string/app_name\"\r\n        android:textAppearance=\"?android:attr/textAppearanceLarge\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/textView2\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"20dp\"\r\n        android:text=\"@string/about1\"\r\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/textView3\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"20dp\"\r\n        android:text=\"@string/about2\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/textView4\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"20dp\"\r\n        android:text=\"@string/about3\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/textView5\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"20dp\"\r\n        android:text=\"@string/about4\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/textView6\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"20dp\"\r\n        android:autoLink=\"web\"\r\n        android:text=\"@string/about5\" />\r\n    \r\n    <TextView\r\n        android:id=\"@+id/about_versionstring\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginTop=\"20dp\"\r\n        android:gravity=\"center_horizontal\"\r\n        android:text=\"version string\" />\r\n\r\n    <ImageView\r\n        android:id=\"@+id/imageView1\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"fill_parent\"\r\n        android:layout_margin=\"5dp\"\r\n        android:scaleType=\"fitCenter\"\r\n        android:src=\"@drawable/feature\" />\r\n\r\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/cheatedit.xml",
    "content": "\r\n    <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"fill_parent\"\r\n        android:orientation=\"vertical\" >\r\n\r\r\n        <TextView\r\n            android:id=\"@+id/textView1\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:text=\"@string/Description\" />\r\n\r\r\r\n        <EditText\r\n            android:id=\"@+id/cheatDesc\"\r\n            android:layout_width=\"match_parent\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:ems=\"10\"\r\n            android:inputType=\"text\" >\r\n\r\n            <requestFocus />\r\n        </EditText>\r\n\r\r\n        <TextView\r\n            android:id=\"@+id/textView2\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:text=\"Code\" />\r\n\r\r\r\r\n        <EditText\r\n            android:id=\"@+id/cheatCode\"\r\n            android:layout_width=\"match_parent\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:ems=\"10\"\r\n            android:inputType=\"text|textMultiLine|textNoSuggestions\" />\r\n\r\n    </LinearLayout>\r\n"
  },
  {
    "path": "app/src/main/res/layout/cheatrow.xml",
    "content": "\r\n    <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"fill_parent\" >\r\n\r\r\r\n        <CheckBox\r\n            android:id=\"@+id/cheatEnabled\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\" />\r\n\r\r\r\r\n        <RelativeLayout\r\n            android:layout_width=\"fill_parent\"\r\n            android:layout_height=\"fill_parent\" >\r\n\r\r\r\r\r\r\r\r\r\n            <Button\r\n                android:id=\"@+id/cheatDelete\"\r\n                style=\"?android:attr/buttonStyleSmall\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:layout_alignParentRight=\"true\"\r\n                android:layout_centerVertical=\"true\"\r\n                android:text=\"@string/Delete\" />\r\n\r\r\r\r\r\n            <Button\r\n                android:id=\"@+id/cheatEdit\"\r\n                style=\"?android:attr/buttonStyleSmall\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:layout_centerVertical=\"true\"\r\n                android:layout_toLeftOf=\"@+id/cheatDelete\"\r\n                android:text=\"@string/Edit\" />\r\n\r\n        </RelativeLayout>\r\n\r\n</LinearLayout>\r"
  },
  {
    "path": "app/src/main/res/layout/cheats.xml",
    "content": "\r\n    <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"fill_parent\"\r\n        android:orientation=\"vertical\" >\r\n\r\r\r\r\n        <Button\r\n            android:id=\"@+id/addcheat\"\r\n            android:layout_width=\"match_parent\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:text=\"@string/AddCheat\" />\r\n\r\r\n        <ListView\r\n            android:id=\"@+id/cheatList\"\r\n            android:layout_width=\"match_parent\"\r\n            android:layout_height=\"wrap_content\" >\r\n\r\n        </ListView>\r\n\r\n    </LinearLayout>\r\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_slider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:layout_width=\"fill_parent\"\r\n    android:layout_height=\"wrap_content\"\r\n    android:paddingBottom=\"20dp\"\r\n    android:paddingLeft=\"20dp\"\r\n    android:paddingRight=\"20dp\"\r\n    android:paddingTop=\"10dp\" >\r\n\r\n    <ImageView\r\n        android:id=\"@+id/current_value\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_alignParentTop=\"true\"\r\n        android:layout_centerHorizontal=\"true\"\r\n        android:textColor=\"#aaaaaa\" />\r\n\r\n    <SeekBar\r\n        android:id=\"@+id/seek_bar\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_below=\"@id/current_value\"\r\n        android:layout_marginTop=\"10dp\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/min_value\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_above=\"@id/seek_bar\"\r\n        android:layout_alignParentLeft=\"true\"\r\n        android:textColor=\"#aaaaaa\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/max_value\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_above=\"@id/seek_bar\"\r\n        android:layout_alignParentRight=\"true\"\r\n        android:textColor=\"#aaaaaa\" />\r\n\r\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_slider_noimg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:layout_width=\"fill_parent\"\r\n    android:layout_height=\"wrap_content\"\r\n    android:paddingBottom=\"20dp\"\r\n    android:paddingLeft=\"20dp\"\r\n    android:paddingRight=\"20dp\"\r\n    android:paddingTop=\"10dp\" >\r\n    \r\n   \t<TextView\r\n   \t    android:id=\"@+id/current_value_noimg\"\r\n   \t    android:layout_width=\"fill_parent\"\r\n   \t    android:layout_height=\"wrap_content\"\r\n   \t    android:gravity=\"center_horizontal\" />\r\n\r\n    <SeekBar\r\n        android:id=\"@+id/seek_bar_noimg\"\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_below=\"@id/current_value_noimg\"\r\n        android:layout_marginTop=\"10dp\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/min_value_noimg\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_below=\"@id/seek_bar_noimg\"\r\n        android:layout_alignParentLeft=\"true\"\r\n        android:textColor=\"#aaaaaa\" />\r\n\r\n    <TextView\r\n        android:id=\"@+id/max_value_noimg\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_alignParentRight=\"true\"\r\n        android:layout_below=\"@id/seek_bar_noimg\"\r\n        android:textColor=\"#aaaaaa\" />\r\n\r\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/file_dialog_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout android:id=\"@+id/relativeLayout01\"\n\txmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:orientation=\"vertical\" android:layout_width=\"fill_parent\"\n\tandroid:layout_height=\"fill_parent\">\n\n\t<LinearLayout android:id=\"@+id/fdLinearLayoutList\"\n\t\tandroid:orientation=\"vertical\" android:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\" android:layout_alignParentBottom=\"true\">\n\n\t\t<LinearLayout android:id=\"@+id/fdLinearLayoutSelect\"\n\t\t\tandroid:orientation=\"vertical\" android:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:layout_alignParentBottom=\"true\" android:paddingLeft=\"10dp\"\n\t\t\tandroid:paddingRight=\"10dp\" android:paddingBottom=\"5dp\">\n\n\t\t\t<LinearLayout android:orientation=\"horizontal\"\n\t\t\t\tandroid:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\">\n\t\t\t</LinearLayout>\n\t\t</LinearLayout>\n\n\t\t<LinearLayout android:id=\"@+id/fdLinearLayoutCreate\"\n\t\t\tandroid:orientation=\"vertical\" android:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:layout_alignParentBottom=\"true\" android:paddingLeft=\"10dp\"\n\t\t\tandroid:paddingRight=\"10dp\" android:paddingBottom=\"5dp\">\n\n\t\t\t<LinearLayout android:orientation=\"horizontal\"\n\t\t\t\tandroid:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\">\n\t\t\t</LinearLayout>\n\t\t</LinearLayout>\n\n\t</LinearLayout>\n\n\t<LinearLayout android:orientation=\"vertical\"\n\t\tandroid:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\"\n\t\tandroid:layout_above=\"@+id/fdLinearLayoutList\">\n\t\t<TextView android:id=\"@+id/path\" android:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\" />\n\t\t<ListView android:id=\"@android:id/list\" android:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"fill_parent\" />\n\t\t<TextView android:id=\"@android:id/empty\"\n\t\t\tandroid:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\"\n\t\t\tandroid:text=\"@string/no_data\" />\n\t</LinearLayout>\n\n\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/file_dialog_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\">\n\n\t<ImageView android:layout_alignParentLeft=\"true\" android:id=\"@+id/fdrowimage\"\n\t\tandroid:layout_height=\"35dp\" android:layout_width=\"wrap_content\"\n\t\tandroid:paddingRight=\"5dp\" android:paddingLeft=\"3dp\"></ImageView>\n\t<TextView android:text=\"@+id/fdrowtext\" android:layout_width=\"wrap_content\"\n\t\tandroid:id=\"@+id/fdrowtext\" android:layout_toRightOf=\"@+id/fdrowimage\"\n\t\tandroid:layout_alignTop=\"@+id/fdrowimage\" android:layout_alignBottom=\"@+id/fdrowimage\"\n\t\tandroid:gravity=\"center_vertical\" android:layout_height=\"35dp\"\n\t\tandroid:textSize=\"23dp\"></TextView> \n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_list.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"match_parent\">\n\t\n\t<GridView\n\t\tandroid:id=\"@+id/list\"\n\t\tandroid:layout_width=\"match_parent\"\n\t\tandroid:layout_height=\"match_parent\"\n\t\t\n\t\tandroid:paddingLeft=\"@dimen/activity_horizontal_margin\"\n\t\tandroid:paddingRight=\"@dimen/activity_horizontal_margin\"\n\t\t\n\t\tandroid:columnWidth=\"280dip\"\n\t\tandroid:numColumns=\"auto_fit\"\n\t\tandroid:stretchMode=\"columnWidth\"\n\t\tandroid:listSelector=\"#0000\" />\n\t\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/griditem_rom.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              \n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:gravity=\"center_vertical\"\n\tandroid:background=\"@drawable/bkg_griditem\">\n\t\n\t<ImageView\n\t\tandroid:id=\"@+id/icon\"\n\t\tandroid:layout_width=\"48dip\"\n\t\tandroid:layout_height=\"48dip\"\n\t\tandroid:layout_margin=\"8dip\"\n\t\t\n\t\tandroid:scaleType=\"fitXY\" />\n\t\n\t<TextView\n\t\tandroid:id=\"@+id/title\"\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\t\n\t\tandroid:gravity=\"left\" />\n\t\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/keymap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:id=\"@+id/keymap_layout\"\r\n    android:layout_width=\"fill_parent\"\r\n    android:layout_height=\"wrap_content\"\r\n    android:paddingBottom=\"20dp\"\r\n    android:paddingLeft=\"20dp\"\r\n    android:paddingRight=\"20dp\"\r\n    android:paddingTop=\"10dp\"\r\n    android:focusable=\"true\"\r\n    android:focusableInTouchMode=\"true\">\r\n<TextView\r\n        android:id=\"@+id/keymap_desc\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_alignParentTop=\"true\"\r\n        android:layout_centerHorizontal=\"true\"\r\n        android:text=\"@string/KeymapDialogDesc\"\r\n        android:textColor=\"#aaaaaa\"\r\n        android:focusable=\"false\"\r\n        android:focusableInTouchMode=\"false\" />\r\n    \r\n    <TextView\r\n        android:id=\"@+id/keymap_value\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_below=\"@id/keymap_desc\"\r\n        android:layout_centerHorizontal=\"true\"\r\n        android:textColor=\"#aaaaaa\"\r\n        android:focusable=\"false\"\r\n        android:focusableInTouchMode=\"false\" />\r\n\r\n\r\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/menu/activity_collection.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n\t<item\n\t\tandroid:id=\"@+id/scanner_rescan\"\n\t\tandroid:title=\"@string/Rescan\"/>\n\t\n\t<item\n\t    android:id=\"@+id/scanner_filebrowser\"\n\t    android:title=\"@string/FileBrowser\" />\n\t\n\t<item\n\t    android:id=\"@+id/scanner_settings\"\n\t    android:title=\"@string/Settings\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/activity_main.xml",
    "content": "\r\n    <menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n\t\t<item android:id=\"@+id/load\" android:title=\"@string/Load\"></item>\r\n        <item android:id=\"@+id/quicksave\" android:title=\"@string/QuickSave\"></item>\r\n        <item android:id=\"@+id/quickrestore\" android:title=\"@string/QuickRestore\"></item>\r\n        <item android:id=\"@+id/cheats\" android:title=\"@string/Cheats\"></item>\r\n        <item android:id=\"@+id/settings\" android:title=\"@string/Settings\"></item>\r\n        <item android:id=\"@+id/savestate\" android:title=\"@string/SaveState\">\r\n            <menu>\r\n                <item android:id=\"@+id/save1\" android:title=\"1\"/>\r\n                <item android:id=\"@+id/save2\" android:title=\"2\"/>\r\n                <item android:id=\"@+id/save3\" android:title=\"3\"/>\r\n                <item android:id=\"@+id/save4\" android:title=\"4\"/>\r\n                <item android:id=\"@+id/save5\" android:title=\"5\"/>\r\n                <item android:id=\"@+id/save6\" android:title=\"6\"/>\r\n                <item android:id=\"@+id/save7\" android:title=\"7\"/>\r\n                <item android:id=\"@+id/save8\" android:title=\"8\"/>\r\n                <item android:id=\"@+id/save9\" android:title=\"9\"/>\r\n            </menu>\r\n        </item>\r\n        <item android:id=\"@+id/restorestate\" android:title=\"@string/RestoreState\">\r\n            <menu>\r\n                <item android:id=\"@+id/restoreauto\" android:title=\"Autosave\"/>\r\n                <item android:id=\"@+id/restore1\" android:title=\"1\"/>\r\n                <item android:id=\"@+id/restore2\" android:title=\"2\"/>\r\n                <item android:id=\"@+id/restore3\" android:title=\"3\"/>\r\n                <item android:id=\"@+id/restore4\" android:title=\"4\"/>\r\n                <item android:id=\"@+id/restore5\" android:title=\"5\"/>\r\n                <item android:id=\"@+id/restore6\" android:title=\"6\"/>\r\n                <item android:id=\"@+id/restore7\" android:title=\"7\"/>\r\n                <item android:id=\"@+id/restore8\" android:title=\"8\"/>\r\n                <item android:id=\"@+id/restore9\" android:title=\"9\"/>\r\n            </menu>\r\n        </item>\r\n        <item android:id=\"@+id/lid\" android:title=\"@string/LidOpen\" android:checkable=\"true\"></item>\r\n        <item android:id=\"@+id/about\" android:title=\"@string/about\"/>\r\n        <item android:id=\"@+id/exit\" android:title=\"@string/Exit\"></item>\r\n    </menu>\r\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t\n\t<color name=\"bkg_collection\">#ddd</color>\n\t<color name=\"shadow\">#22000000</color>\n\t\n\t<color name=\"bkg_card_normal\">#fff</color>\n\t<color name=\"bkg_card_pressed\">#33b5e5</color>\n\t\n</resources>"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n\n\t<!-- Default screen margins, per the Android Design guidelines. -->\n\t<dimen name=\"activity_horizontal_margin\">16dp</dimen>\n\t<dimen name=\"activity_vertical_margin\">16dp</dimen>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/fileendings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n\t<array name=\"fileEndingImage\">\r\n        <item>\".png\"</item>\r\n        <item>\".gif\"</item>\r\n        <item>\".jpg\"</item>\r\n        <item>\".jpeg\"</item>\r\n        <item>\".bmp\"</item>\r\n    </array>\r\n\t<array name=\"fileEndingAudio\">\r\n        <item>\".mp3\"</item>\r\n        <item>\".wav\"</item>\r\n        <item>\".ogg\"</item>\r\n        <item>\".midi\"</item>\r\n    </array>\r\n\t<array name=\"fileEndingPackage\">\r\n        <item>.jar</item>\r\n        <item>.zip</item>\r\n        <item>.rar</item>\r\n        <item>.gz</item>\r\n    </array>\r\n\t<array name=\"fileEndingWebText\">\r\n        <item>.htm</item>\r\n        <item>.html</item>\r\n        <item>.php</item>\r\n    </array>\r\n    <array name=\"fileEndingText\">\r\n        <item>.txt</item>\r\n        <item>.log</item>\r\n    </array>\r\n    <array name=\"fileEndingVideo\">\r\n        <item>.wmv</item>\r\n        <item>.avi</item>\r\n        <item>.mpg</item>\r\n        <item>.mpeg</item>\r\n        <item>.mp4</item>\r\n    </array>\r\n    <array name=\"fileEndingGeoPosition\">\r\n        <item>.loc</item>\r\n        <item>.gpx</item>\r\n    </array>\r\n</resources>\r\n     "
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Hello world!</string>\r\n    <string name=\"menu_settings\">Settings</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Rename</item--> \r\n\t\t<item>Delete</item>\r\n\t\t<!--item>Cut</item-->\r\n\t\t<!--item>Copy</item-->\r\n\t\t<item>Send To...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">There was an error loading this ROM :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">Location</string>\r\n    <string name=\"cant_read_folder\">Folder can\\'t be read!</string>\r\n    <string name=\"nnew\">New</string>\r\n    <string name=\"select\">Select</string>\r\n    <string name=\"file_name\">File name:</string>\r\n    <string name=\"cancel\">Cancel</string>\r\n    <string name=\"create\">Save</string>\r\n    <string name=\"no_data\">No Data</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">Error</string>\r\n    <string name=\"Load\">Load</string>\r\n    <string name=\"QuickSave\">Quick Save</string>\r\n    <string name=\"QuickRestore\">Quick Restore</string>\r\n    <string name=\"SaveState\">Save State</string>\r\n    <string name=\"RestoreState\">Restore State</string>\r\n    <string name=\"Settings\">Settings</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">To toggle between touch mode and keypad mode, tap the \"touch\" button at the top</string>\r\n    <string name=\"frameskip\">Frame skip</string>\r\n    <string name=\"frameskipdesc\">How many frames to skip when emulating. Helps make slow emulation match real time.</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">Only draw to the screen in-between frames. Can slow down emulation but turning off may cause graphical glitches.</string>\r\n    <string name=\"fps\">Show FPS</string>\r\n    <string name=\"fpsdesc\">Draw FPS onto screen.</string>\r\n    <string name=\"showtouchmsg\">Show touch message</string>\r\n    <string name=\"showtouchmsgdesc\">Display a message to the user explaining touch/keypad mode switching.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">Loading</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">Screen filter</string>\r\n    <string name=\"filterdesc\">Filter to use when upscaling from Nintendo DS resolution to your screen. Higher quality filters may degrade performance.</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">3D Renderer</string>\r\n    <string name=\"threedrendererdesc\">Which 3D rendering engine to use.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>None</item>\r\n        <item>OpenGL</item>\r\n        <item>Software</item>\r\n    </string-array>\r\n    <string name=\"sound\">Enable sound</string>\r\n    <string name=\"sounddesc\">Enable processing and playback of audio. Disabling can increase performance.</string>\r\n    <string name=\"showsoundmsg\">Show sound message</string>\r\n    <string name=\"showsoundmsgdesc\">Display a question to the user asking if they would like to enable sound.</string>\r\n    <string name=\"soundmsg\">Would you like to enable sound? This can cause a 3 to 5 FPS performance loss.</string>\r\n    <string name=\"yes\">Yes</string>\r\n    <string name=\"no\">No</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Display</string>\r\n    <string name=\"Controls\">Controls</string>\r\n    <string name=\"EditLayout\">Edit controls layout</string>\r\n    <string name=\"EditLayoutDesc\">Edit where the touch controls are placed on the screen.</string>\r\n    <string name=\"UseTouchPort\">Portrait touch buttons</string>\r\n    <string name=\"UseTouchPortDesc\">Use touch buttons on the screen in portrait mode.</string>\r\n    <string name=\"UseTouchLand\">Landscape touch buttons</string>\r\n    <string name=\"UseTouchLandDesc\">Use touch buttons on the screen in landscape mode.</string>\r\n    <string name=\"ResetLayout\">Reset controls layout</string>\r\n    <string name=\"ResetLayoutDesc\">Reset the layout of touch controls to their defaults.</string>\r\n    <string name=\"Sound\">Sound</string>\r\n    <string name=\"LCDSwap\">Swap LCDs</string>\r\n    <string name=\"LCDSwapDesc\">Check to swap the location of the main and touch LCDs.</string>\r\n    <string name=\"ButtonTrans\">Button transparency</string>\r\n    <string name=\"ButtonTransDesc\">How transparent the on-screen touch buttons should be</string>\r\n    <string name=\"Haptic\">Haptic feedback</string>\r\n    <string name=\"HapticDesc\">Provide haptic feedback on button press if supported by device.</string>\r\n    <string name=\"KeymapDialogDesc\">Press a key to map to this button</string>\r\n    <string name=\"KeymapValuePreface\">Currently mapped to</string>\r\n    <string name=\"EditKeymap\">Edit key mappings</string>\r\n    <string name=\"EditKeymapDesc\">Edit mappings from hardware keys to DS buttons.</string>\r\n    <string name=\"Up\">Up</string>\r\n    <string name=\"Down\">Down</string>\r\n    <string name=\"Left\">Left</string>\r\n    <string name=\"Right\">Right</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Touch</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">Don\\'t rotate LCDs</string>\r\n    <string name=\"DontRotateLCDsDesc\">In landscape mode, don\\'t rotate the game LCDs. Use this for games that were intended to played with the DS held sideways.</string>\r\n    <string name=\"Language\">Language</string>\r\n    <string name=\"LanguageDesc\">The language of the system. Multilingual ROMs use this setting. Changes will be applied on the next ROM load.</string>\r\n    <string name=\"Gameplay\">Gameplay</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">Add a new Action Replay cheat</string>\r\n    <string name=\"Cheats\">Cheats</string>\r\n    <string name=\"Exit\">Exit</string>\r\n    <string name=\"Edit\">Edit</string>\r\n    <string name=\"Delete\">Delete</string>\r\n    <string name=\"Description\">Description</string>\r\n    <string name=\"Code\">Code</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">Enable microphone</string>\r\n    <string name=\"EnableMicrophoneDesc\">Use your device\\'s microphone as the DS microphone.</string>\r\n    <string name=\"AlwaysTouch\">Always allow touch</string>\r\n    <string name=\"AlwaysTouchDesc\">Always process the DS touchscreen, even when not in touch mode. For games that require using controls and touchscreen at the same time.</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">Maintain aspect ratio</string>\r\n    <string name=\"MaintainAspectRatioDesc\">Maintain the aspect ratio of the DS; don\\'t stretch to fit the screen.</string>\r\n\t<string name=\"MainScreenOnly\">Main screen only</string>\r\n\t<string name=\"MainScreenOnlyDesc\">Only display the main game screen, hiding the touch screen.</string>\r\n\t<string name=\"LidOpen\">Lid open</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">Select screens</string>\r\n\t<string name=\"SelectScreensDesc\">Pick which DS screens will be shown.</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>Both</item>\r\n\t    <item>Main</item>\r\n\t    <item>Touch</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">Options</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">Execution engine</string>\r\n\t<string name=\"ExecutionEngineDesc\">The engine used to emulate the ARM processors of the DS.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">Sound sync mode</string>\r\n\t<string name=\"SoundSyncModeDesc\">Synchronization of the game\\'s sound. Dual sync/async is usually okay and is faster, but Sync is sometimes needed for movies or voice.</string>\r\n\t\r\n\t<!-- Release 29 -->\r\n\t<string name=\"JitSize\">JIT block size</string>\r\n\t<string name=\"JitSizeDesc\">For the threaded interpreter/tinycc JIT execution engines, how big each JIT block should be. 1 is most accurate, while 100 is fastest</string>\r\n\t<string name=\"about1\">nds4droid is a free, open source Nintendo DS emulator.</string>\r\n\t<string name=\"about2\">nds4droid is the result of countless hours of work by dozens of contributators. The emulation core used by nds4droid is DeSmuME.</string>\r\n\t<string name=\"about3\">Jeffrey Quesnelle is the primary developer of nds4droid. nds4droid is a product of Sterling Heights, Michigan, United States of America.</string>\r\n\t<string name=\"about4\">Special thanks to gechdcb for his contribution of the threaded interpreter and lightning JIT.</string>\r\n\t<string name=\"about5\">nds4droid website: http://nds4droid.com\\nDeSmuME website: http://desmume.org</string>\r\n\t<string name=\"about\">About</string>\r\n\t\r\n\t<!-- Release 30 -->\r\n\t<string name=\"EnableFog\">Enable fog</string>\r\n\t<string name=\"EnableFogDesc\">When using the software renderer, enable processing of fog effects.</string>\r\n\t\r\n\t<!-- Release 38 -->\n\t<string name=\"EnableAutosave\">Enable autosave</string>\r\n\t<string name=\"EnableAutosaveDesc\">Automatically save the game state at a regular interval.</string>\r\n\t<string name=\"AutosaveFrequency\">Autosave frequency</string>\r\n\t<string name=\"AutosaveFrequencyDesc\">How frequently the autosave feature saves the game state.</string>\r\n\t<string-array name=\"AutosaveFrequencyNames\">\r\n\t    <item>1 minute</item>\r\n\t    <item>5 minutes</item>\r\n\t    <item>15 minutes</item>\r\n\t    <item>30 minutes</item>\r\n\t    <item>1 hour</item>    \r\n\t</string-array>\n\t<string name=\"Rescan\">Rescan</string>\r\n\t<string name=\"FileBrowser\">File browser</string>\r\n\t\r\n\t<!-- Release 39 -->\r\n\t<string name=\"ScanningForROMs\">Scanning external storage...</string>\r\n\t\r\n\t<!-- Release 43 -->\n\t<string name=\"DisableROMBrowser\">Disable ROM browser</string>\r\n\t<string name=\"DisableROMBrowserDesc\">Disable the auto-scanning ROM browser. Simply show the file browser on launch.</string>\r\n\t\r\n    <!-- Do not translate -->\r\n    <string-array name=\"filternames\">\r\n        <item>Normal</item>\r\n\t\t<item>HQ2x</item>\r\n\t\t<item>2XSaI</item>\r\n\t\t<item>Super2XSaI</item>\r\n\t\t<item>SuperEagle</item>\r\n\t\t<item>Scanline</item>\r\n\t\t<item>Bilinear</item>\r\n\t\t<item>Nearest 2X</item>\r\n\t\t<item>HQ2xS</item>\r\n\t\t<item>LQ2x</item>\r\n\t\t<item>LQ2xS</item>\r\n        <item>EPX</item>\r\n        <item>Nearest+ 1.5X</item>\r\n        <item>Nearest 1.5X</item>\r\n        <item>EPX+</item>\r\n        <item>EPX 1.5X</item>\r\n        <item>EPX+ 1.5X</item>\r\n        <item>HQ4x</item>\r\n    </string-array>\r\n        <string-array name=\"zerothroughnine\">\r\n        <item>0</item>\r\n        <item>1</item>\r\n        <item>2</item>\r\n        <item>3</item>\r\n        <item>4</item>\r\n        <item>5</item>\r\n        <item>6</item>\r\n        <item>7</item>\r\n        <item>8</item>\r\n        <item>9</item>\r\n    </string-array>\r\n    <string-array name=\"zerothroughseventeen\">\r\n        <item>0</item>\r\n        <item>1</item>\r\n        <item>2</item>\r\n        <item>3</item>\r\n        <item>4</item>\r\n        <item>5</item>\r\n        <item>6</item>\r\n        <item>7</item>\r\n        <item>8</item>\r\n        <item>9</item>\r\n        <item>10</item>\r\n        <item>11</item>\r\n        <item>12</item>\r\n        <item>13</item>\r\n        <item>14</item>\r\n        <item>15</item>\r\n        <item>16</item>\r\n        <item>17</item>\r\n    </string-array>\r\n   \t<string-array name=\"zerothroughtwo\">\r\n        <item>0</item>\r\n        <item>1</item>\r\n        <item>2</item>\r\n    </string-array>\r\n    <string-array name=\"languages\">\r\n        <item>日本語</item>\r\n        <item>English</item>\r\n        <item>Français</item>\r\n        <item>Deutsch</item>\r\n        <item>Italiano</item>\r\n        <item>Español</item>\r\n    </string-array>\r\n    <string-array name=\"zerothroughfive\">\r\n        <item>0</item>\r\n        <item>1</item>\r\n        <item>2</item>\r\n        <item>3</item>\r\n        <item>4</item>\r\n        <item>5</item>\r\n    </string-array>\r\n    <string-array name=\"executionengines\">\r\n        <item>Interpreter</item>\r\n        <item>Threaded interpreter</item>\r\n        <item>lightning JIT</item>\r\n    </string-array>\r\n    <string-array name=\"zerothroughthree\">\r\n        <item>0</item>\r\n        <item>1</item>\r\n        <item>2</item>\r\n        <item>3</item>\r\n    </string-array>\r\n    <string-array name=\"zerothroughone\">\r\n        <item>0</item>\r\n        <item>1</item>\r\n    </string-array>\r\n    <string-array name=\"soundsyncmodes\">\r\n        <item>Dual sync/async</item>\r\n        <item>Sync</item>\r\n    </string-array>\r\n    <string-array name=\"zerothroughfour\">\r\n        <item>0</item>\r\n        <item>1</item>\r\n        <item>2</item>\r\n        <item>3</item>\r\n        <item>4</item>\r\n    </string-array>\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\r\n\r\n    <style name=\"AppTheme\" parent=\"android:Theme.Light\" />\r\n\t\r\n\t<style name=\"CollectionTheme\" >\r\n\t\t<item name=\"android:windowBackground\">@color/bkg_collection</item>\r\n\t</style>\r\n\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-de/arrays.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<string-array name=\"file_options\"><item>L&#246;schen</item><item>Senden an...</item></string-array>\n<string-array name=\"threed_options\"><item>Kein</item><item>OpenGL</item><item>Software</item></string-array>\n<string-array name=\"screen_options\"><item>Beide</item><item>Hauptbildschirm</item><item>Touch-Bildschirm</item></string-array>\n<string-array name=\"AutosaveFrequencyNames\"><item>Jede Minute</item><item>Alle 5 Minuten</item><item>Alle 15 Minuten</item><item>Alle 30 Minuten</item><item>Jede Stunde</item></string-array>\n<string-array name=\"filternames\"><item>Normal</item><item>HQ2x</item><item>2XSaI</item><item>Super2XSaI</item><item>SuperEagle</item><item>Scanline</item><item>Bilinear</item><item>Nearest 2X</item><item>HQ2xS</item><item>LQ2x</item><item>LQ2xS</item><item>EPX</item><item>Nearest+ 1.5X</item><item>Nearest 1.5X</item><item>EPX+</item><item>EPX 1.5X</item><item>EPX+ 1.5X</item><item>HQ4x</item></string-array>\n<string-array name=\"zerothroughnine\"><item>0</item><item>1</item><item>2</item><item>3</item><item>4</item><item>5</item><item>6</item><item>7</item><item>8</item><item>9</item></string-array>\n<string-array name=\"zerothroughseventeen\"><item>0</item><item>1</item><item>2</item><item>3</item><item>4</item><item>5</item><item>6</item><item>7</item><item>8</item><item>9</item><item>10</item><item>11</item><item>12</item><item>13</item><item>14</item><item>15</item><item>16</item><item>17</item></string-array>\n<string-array name=\"zerothroughtwo\"><item>0</item><item>1</item><item>2</item></string-array>\n<string-array name=\"languages\"><item>&#26085;&#26412;&#35486;</item><item>English</item><item>Fran&#231;ais</item><item>Deutsch</item><item>Italiano</item><item>Espa&#241;ol</item></string-array>\n<string-array name=\"zerothroughfive\"><item>0</item><item>1</item><item>2</item><item>3</item><item>4</item><item>5</item></string-array>\n<string-array name=\"executionengines\"><item>Interpreter</item><item>Threaded interpreter</item><item>lightning JIT</item></string-array>\n<string-array name=\"zerothroughthree\"><item>0</item><item>1</item><item>2</item><item>3</item></string-array>\n<string-array name=\"zerothroughone\"><item>0</item><item>1</item></string-array>\n<string-array name=\"soundsyncmodes\"><item>Dual sync/async</item><item>Sync</item></string-array>\n<string-array name=\"zerothroughfour\"><item>0</item><item>1</item><item>2</item><item>3</item><item>4</item></string-array>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-de/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n<color name=\"bkg_collection\">#ffdddddd</color>\n<color name=\"shadow\">#22000000</color>\n<color name=\"bkg_card_normal\">#ffffffff</color>\n<color name=\"bkg_card_pressed\">#ff33b5e5</color>\n<color name=\"gray\">#ffff0000</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-de/strings.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n<string name=\"app_name\">nds4droid</string>\r\n<string name=\"hello_world\">Hallo Welt!</string>\r\n<string name=\"menu_settings\">Einstellungen</string>\r\n<string name=\"title_activity_main\">nds4droid</string>\r\n<string name=\"rom_error\">Es gab einen Fehler beim Laden des ROM. :(</string>\r\n<string name=\"OK\">OK</string>\r\n<string name=\"location\">Ort</string>\r\n<string name=\"cant_read_folder\">\"Der Ordner kann nicht gelesen werden!\"</string>\r\n<string name=\"nnew\">Neu</string>\r\n<string name=\"select\">Ausw&#228;hlen</string>\r\n<string name=\"file_name\">Dateiname:</string>\r\n<string name=\"cancel\">Abbrechen</string>\r\n<string name=\"create\">Speichern</string>\r\n<string name=\"no_data\">Keine Daten</string>\r\n<string name=\"err\">Fehler</string>\r\n<string name=\"Load\">Laden</string>\r\n<string name=\"QuickSave\">Schnell speichern</string>\r\n<string name=\"QuickRestore\">Schnell wiederherstellen</string>\r\n<string name=\"SaveState\">Status speichern</string>\r\n<string name=\"RestoreState\">Status wiederherstellen</string>\r\n<string name=\"Settings\">Einstellungen</string>\r\n<string name=\"touchnotify\">Um zwischen Tastatur und Touch-Modus umzuschalten, tippen Sie oben auf die Touch-Schaltfl&#228;che.</string>\r\n<string name=\"frameskip\">Bilder &#252;berspringen</string>\r\n<string name=\"frameskipdesc\">Legt fest, wieviele Bilder &#252;berprungen werden sollen. Dies ist hilfreich bei langsamen CPU-Prozessoren bzw. wenn Sie Spiele in Echtzeit (Einstellung: 0) spielen wollen.</string>\r\n<string name=\"vsync\">Vertikale Synchronisation</string>\r\n<string name=\"vsyncdesc\">Es werden Zwischenbilder berechnet. Dies kann die Emulation verlangsamen, ein Ausschalten dieser Funktion kann allerdings zu Grafikfehlern f&#252;hren.</string>\r\n<string name=\"fps\">Bildrate anzeigen</string>\r\n<string name=\"fpsdesc\">Zeigt die Anzahl an Bildern pro Sekunde auf dem Bildschirm an.</string>\r\n<string name=\"showtouchmsg\">Touch-Meldungen anzeigen</string>\r\n<string name=\"showtouchmsgdesc\">Zeigt eine Nachricht an, wenn der Benutzer zwischen Touch-Bildschirm und Tastaturmodus umschalten soll.</string>\r\n<string name=\"loading\">L&#228;dt</string>\r\n<string name=\"filter\">Bildschirmfilter</string>\r\n<string name=\"filterdesc\">Legt den Filter fest, mit der die Nitendo DS Aufl&#246;sung auf dem Bildschirm skaliert werden soll. Filter mit h&#246;herer Qualit&#228;t k&#246;nnen die Leistung beeintr&#228;chtigen.</string>\r\n<string name=\"threedrenderer\">3D-Grafik-Renderer</string>\r\n<string name=\"threedrendererdesc\">Legt fest, welcher 3D-Grafik-Renderer verwendet werden soll.</string>\r\n<string name=\"sound\">Soundausgabe aktivieren</string>\r\n<string name=\"sounddesc\">Aktivieret die Verarbeitung und Wiedergabe von Audiodaten. Die Deaktivierung dieser Funktion kann die Leistung erh&#246;hen.</string>\r\n<string name=\"showsoundmsg\">Meldung vor Sound-Aktivierung anzeigen</string>\r\n<string name=\"showsoundmsgdesc\">Zeigt eine entsprechende Meldung auf dem Bildschirm an, ob der Sound aktiviert werden soll.</string>\r\n<string name=\"soundmsg\">M&#246;chten Sie den Sound aktivieren? Dies kann allerdings zu 3 - 5 Bilder/Sekunde an Leistungsverlust f&#252;hren.</string>\r\n<string name=\"yes\">Ja</string>\r\n<string name=\"no\">Nein</string>\r\n<string name=\"Display\">Anzeige</string>\r\n<string name=\"Controls\">Steuerung</string>\r\n<string name=\"EditLayout\">Anordnung der Touchpad-Steuerung</string>\r\n<string name=\"EditLayoutDesc\">Legen Sie fest, wo die Elemente der Touchpad-Steuerung auf dem Bildschirm angeordnet werden sollen.</string>\r\n<string name=\"UseTouchPort\">Touchpad-Steuerung im Hochformat</string>\r\n<string name=\"UseTouchPortDesc\">Zeigt die Tasten f&#252;r die Touchpad-Steuerung auf dem Bildschirm im Hochformat (Portrait) an.</string>\r\n<string name=\"UseTouchLand\">Touchpad-Steuerung im Querformat</string>\r\n<string name=\"UseTouchLandDesc\">Zeigt die Tasten f&#252;r die Touchpad-Steuerung auf dem Bildschirm im Querformat (Landscape) an.</string>\r\n<string name=\"ResetLayout\">Steuerungslayout zur&#252;cksetzen</string>\r\n<string name=\"ResetLayoutDesc\">Hiermit wird die Anordnung der Tasten f&#252;r die Touchpad-Steuerung auf die Standardeinstellungen zur&#252;ckgesetzt.</string>\r\n<string name=\"Sound\">Sound</string>\r\n<string name=\"LCDSwap\">Bildschirme vertauschen</string>\r\n<string name=\"LCDSwapDesc\">Vertauscht die Anordnung des Hauptbildschirmes mit dem Touch-Bildschirm.</string>\r\n<string name=\"ButtonTrans\">Transparenz der Steuerung</string>\r\n<string name=\"ButtonTransDesc\">Legt fest, wie transparent die Tasten f&#252;r die Steuerung des Touchpad-Bildschirmes erscheinen sollen.</string>\r\n<string name=\"Haptic\">Haptisches Feedback</string>\r\n<string name=\"HapticDesc\">Schaltet Vibration bei Tastendruck ein, wenn das Ger&#228;t diese Funktion unterst&#252;tzt.</string>\r\n<string name=\"KeymapDialogDesc\">Dr&#252;cken Sie eine Taste zur Belegung dieser Funktion.</string>\r\n<string name=\"KeymapValuePreface\">Aktuell zugeordnete Taste: </string>\r\n<string name=\"EditKeymap\">Tastenzuordnung bearbeiten</string>\r\n<string name=\"EditKeymapDesc\">Legt die Tasten f&#252;r die Steuerung im DS-Emulator fest.</string>\r\n<string name=\"Up\">Oben</string>\r\n<string name=\"Down\">Unten</string>\r\n<string name=\"Left\">Links</string>\r\n<string name=\"Right\">Rechts</string>\r\n<string name=\"A\">A</string>\r\n<string name=\"B\">B</string>\r\n<string name=\"X\">X</string>\r\n<string name=\"Y\">Y</string>\r\n<string name=\"Select\">Start</string>\r\n<string name=\"Start\">Auswahl (Select)</string>\r\n<string name=\"L\">L</string>\r\n<string name=\"R\">R</string>\r\n<string name=\"Touch\">Touchpad</string>\r\n<string name=\"DontRotateLCDs\">\"Bildschirme nicht drehen\"</string>\r\n<string name=\"DontRotateLCDsDesc\">\"Im Landscape-Modus (Querformat) werden die Bildschirme nicht gedreht. Verwenden Sie diese Funktion bei Spielen, die normalerweise beim DS seitlich gehalten gespielt werden.\"</string>\r\n<string name=\"Language\">Sprache</string>\r\n<string name=\"LanguageDesc\">Die Sprache des Systemes. Mehrsprachige ROMs verwenden diese Einstellung dann, wenn das ROM das n&#228;chste Mal geladen wird.</string>\r\n<string name=\"Gameplay\">Gameplay</string>\r\n<string name=\"AddCheat\">F&#252;gt einen neuen Action Replay Cheat hinzu.</string>\r\n<string name=\"Cheats\">Cheats</string>\r\n<string name=\"Exit\">Beenden</string>\r\n<string name=\"Edit\">Bearbeiten</string>\r\n<string name=\"Delete\">L&#246;schen</string>\r\n<string name=\"Description\">Beschreibung</string>\r\n<string name=\"Code\">Code</string>\r\n<string name=\"EnableMicrophone\">Mikrofon aktivieren</string>\r\n<string name=\"EnableMicrophoneDesc\">\"Verwendet das Mikrofon Ihres Ger&#228;tes statt des DS-Mikrofons.\"</string>\r\n<string name=\"AlwaysTouch\">Touchpad immer erlauben</string>\r\n<string name=\"AlwaysTouchDesc\">Der Touchpad-Bildschirm wird auch verwendet, wenn Sie nicht im Touchpad-Modus sind. Dies ist wichtig f&#252;r Spiele, die gleichzeitig mit den Kontrolltasten und dem Touchpad gesteuert werden.</string>\r\n<string name=\"MaintainAspectRatio\">Seitenverh&#228;ltnis beibehalten</string>\r\n<string name=\"MaintainAspectRatioDesc\">\"Beh&#228;lt das Seitenverh&#228;ltnis des DS bei, falls einige Elemente nicht auf dem Bildschirm passen.\"</string>\r\n<string name=\"MainScreenOnly\">Nur Hauptbildschirm</string>\r\n<string name=\"MainScreenOnlyDesc\">Zeigt nur den Hauptbildschirm auf dem Bildschirm an. Der Touchpad-Bildschirm wird ausgeblendet.</string>\r\n<string name=\"LidOpen\">Deckel &#246;ffnen</string>\r\n<string name=\"SelectScreens\">Bildschirme ausw&#228;hlen</string>\r\n<string name=\"SelectScreensDesc\">W&#228;hlen Sie aus, welche DS-Bildschirme auf Ihrem Bildschirm angezeigt werden sollen.</string>\r\n<string name=\"Options\">Optionen</string>\r\n<string name=\"ExecutionEngine\">Ausf&#252;hrungs-Engine</string>\r\n<string name=\"ExecutionEngineDesc\">Legt die Engine fest, welche bei der Emulation des ARM Prozessors des DS verwendet werden soll.</string>\r\n<string name=\"SoundSyncMode\">Soundsynchronisationsmodus</string>\r\n<string name=\"SoundSyncModeDesc\">\"Legt die Synchronisation des Spielesounds fest. Dual-Sync/Async ist die Standard-Einstellung, da diese schneller ist. Aber die Einstellung Sync wird manchmal auch f&#252;r Filme und Sprache verwendet..\"</string>\r\n<string name=\"JitSize\">JIT-Blockgr&#246;&#223;e</string>\r\n<string name=\"JitSizeDesc\">Legt fest, wie gro&#223; der JIT-Block f&#252;r den Threaded Interpreter/tinycc sein soll. 1 ist am genauesten, w&#228;hrend 100 am schnellsten ist.</string>\r\n<string name=\"about1\">nds4droid ist ein freier Open-Source-Nintendo DS Emulator.</string>\r\n<string name=\"about2\">nds4droid ist das Ergebnis unz&#228;hliger Arbeitsstunden von dutzenden Entwicklern. Der Emulationskern der durch nds4droid verwendet wird, ist DeSmuME.</string>\r\n<string name=\"about3\">Jeffrey Quesnelle ist der Hauptentwickler von nds4droid. nds4droid ist ein Produkt von Sterling Heights, Michigan, Vereinigte Staaten von Amerika.</string>\r\n<string name=\"about4\">Ein besonderer Dank geht an den Entwickler des Threaded Interpreters und Lightning JITs.</string>\r\n<string name=\"about5\">\"nds4droid-Webseite: http://nds4droid.com\r\nDeSmuME-Webseite: http://desmume.org\"</string>\r\n<string name=\"about\">&#220;ber</string>\r\n<string name=\"EnableFog\">Nebel-Effekte aktivieren</string>\r\n<string name=\"EnableFogDesc\">Wenn der Software-Renderer verwendet wird, wird hiermit die Verarbeitung von Nebeleffekten aktiviert.</string>\r\n<string name=\"EnableAutosave\">Auto-Speicherung f&#252;r Spielst&#228;nde</string>\r\n<string name=\"EnableAutosaveDesc\">Hiermit wird der Spielstatus in regelm&#228;&#223;igen Abst&#228;nden automatisch gespeichert.</string>\r\n<string name=\"AutosaveFrequency\">Intervall f&#252;r Auto-Speicherung</string>\r\n<string name=\"AutosaveFrequencyDesc\">Legt fest, wie h&#228;ufig der Spielstatus gespeichert wird.</string>\r\n<string name=\"Rescan\">Erneut einlesen</string>\r\n<string name=\"FileBrowser\">Dateibrowser</string>\r\n<string name=\"ScanningForROMs\">Durchsuche externen Speicher...</string>\r\n<string name=\"DisableROMBrowser\">ROM-Dateibrowser deaktivieren</string>\r\n<string name=\"DisableROMBrowserDesc\">Deaktiviert die automatische Suche nach ROMs im Dateibrowser, welcher beim Start geladen wird.</string>\r\n</resources>\r\n"
  },
  {
    "path": "app/src/main/res/values-fr/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Bonjour tout le monde!</string>\r\n    <string name=\"menu_settings\">Réglages</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Rename</item--> \r\n\t\t<item>Delete</item>\r\n\t\t<!--item>Cut</item-->\r\n\t\t<!--item>Copy</item-->\r\n\t\t<item>Send To...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">Erreur de chargement de cette ROM :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">Emplacement</string>\r\n    <string name=\"cant_read_folder\">Impossible de lire le dossier!</string>\r\n    <string name=\"nnew\">Nouveau</string>\r\n    <string name=\"select\">Sélectionner</string>\r\n    <string name=\"file_name\">Nom du fichier:</string>\r\n    <string name=\"cancel\">Annuler</string>\r\n    <string name=\"create\">Sauver</string>\r\n    <string name=\"no_data\">Aucune donnée</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">Erreur</string>\r\n    <string name=\"Load\">Charger</string>\r\n    <string name=\"QuickSave\">Sauver rapidement</string>\r\n    <string name=\"QuickRestore\">Restauration rapide</string>\r\n    <string name=\"SaveState\">Sauver l\\'état</string>\r\n    <string name=\"RestoreState\">Restauration de l\\'état</string>\r\n    <string name=\"Settings\">Réglages</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">Pour basculer entre le mode tactile et le mode clavier, appuyez sur le bouton \"toucher\" dessus</string>\r\n    <string name=\"frameskip\">Sauter cadre</string>\r\n    <string name=\"frameskipdesc\">Combien des cadres à sauter pendant l\\'émulation. Pour faire l\\'émulation lente correspond à l\\'affichage en temps réel.</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">Peindre à l\\'écran seulement entre les cadres. Peut ralentir l\\'émulation mais l\\'éteignant peut causer des anomalies graphiques.</string>\r\n    <string name=\"fps\">Afficher FPS</string>\r\n    <string name=\"fpsdesc\">Draw FPS onto screen.</string>\r\n    <string name=\"showtouchmsg\">Afficher message de toucher</string>\r\n    <string name=\"showtouchmsgdesc\">Afficher un message à l\\'utilisateur expliquant commutation entre le mode tactile / clavier.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">Chargement</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">Filtre d\\'écran</string>\r\n    <string name=\"filterdesc\">Filtre à utiliser durant le changement d\\'échelle de la résolution Nintendo DS à celle de votre écran. Des filtres de qualité supérieure peuvent dégrader la performance.</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">Moteur de rendu 3D</string>\r\n    <string name=\"threedrendererdesc\">Quel moteur de rendu 3D à utiliser.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>Aucun</item>\r\n        <item>OpenGL</item>\r\n        <item>Software</item>\r\n    </string-array>\r\n    <string name=\"sound\">Activer le son</string>\r\n    <string name=\"sounddesc\">Activer le traitement et la lecture audio. La désactivation de cette fonctionnalité peut améliorer la performance.</string>\r\n    <string name=\"showsoundmsg\">Afficher le message de son</string>\r\n    <string name=\"showsoundmsgdesc\">Demander à l\\'utilisateur s\\'il veut activer le son.</string>\r\n    <string name=\"soundmsg\">Voulez-vous activer le son? Ça peut causer une perte de performance de 3 à 5 FPS.</string>\r\n    <string name=\"yes\">Oui</string>\r\n    <string name=\"no\">Non</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Afficher</string>\r\n    <string name=\"Controls\">Commandes</string>\r\n    <string name=\"EditLayout\">Modifier la disposition des commandes</string>\r\n    <string name=\"EditLayoutDesc\">Modifier où les commandes tactiles sont placés sur l\\'écran.</string>\r\n    <string name=\"UseTouchPort\">Boutons tactiles en mode portrait</string>\r\n    <string name=\"UseTouchPortDesc\">Utilisez les boutons tactiles en mode portrait sur l\\'écran.</string>\r\n    <string name=\"UseTouchLand\">Boutons tactiles en mode paysage</string>\r\n    <string name=\"UseTouchLandDesc\">Utilisez les boutons tactiles en mode paysage sur l\\'écran.</string>\r\n    <string name=\"ResetLayout\">Réinitialiser la disposition des commandes</string>\r\n    <string name=\"ResetLayoutDesc\">Réinitialiser la disposition des commandes tactiles à leurs valeurs par défaut.</string>\r\n    <string name=\"Sound\">Son</string>\r\n    <string name=\"LCDSwap\">Permuter les LCD</string>\r\n    <string name=\"LCDSwapDesc\">Cochez pour permuter l\\'emplacement de l\\'LCD principal et ceux tactiles.</string>\r\n    <string name=\"ButtonTrans\">Transparence des boutons</string>\r\n    <string name=\"ButtonTransDesc\">Quantité de transparence pour les boutons tactiles sur l\\'écran</string>\r\n    <string name=\"Haptic\">Réponse tactile</string>\r\n    <string name=\"HapticDesc\">Fournir une réponse tactile quand le bouton est pressé s\\'il est permis par le dispositif.</string>\r\n    <string name=\"KeymapDialogDesc\">Appuyez sur une touche pour mapper ce bouton</string>\r\n    <string name=\"KeymapValuePreface\">Actuellement mappé à</string>\r\n    <string name=\"EditKeymap\">Modifier le mappage des touches</string>\r\n    <string name=\"EditKeymapDesc\">Modifier le mappage des clés du clavier aux boutons DS.</string>\r\n    <string name=\"Up\">En haut</string>\r\n    <string name=\"Down\">Vers le bas</string>\r\n    <string name=\"Left\">À gauche</string>\r\n    <string name=\"Right\">À droite</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Commencer</string>\r\n    <string name=\"Start\">Sélectionner</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Toucher</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">Ne pas tourner les LCD</string>\r\n    <string name=\"DontRotateLCDsDesc\">En mode paysage, ne tourner pas les LCD des jeux. Utilisez ça pour des jeux qui sont conçus pour être joués avec le DS tenu latéralement.</string>\r\n    <string name=\"Language\">Langue</string>\r\n    <string name=\"LanguageDesc\">La langue du système. Des ROM multilingues utilisent ce paramètre. Les modifications seront appliquées au prochain chargement de ROM.</string>\r\n    <string name=\"Gameplay\">Jouabilité</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">Ajouter un nouveau triche pour Action Replay</string>\r\n    <string name=\"Cheats\">Tricheries</string>\r\n    <string name=\"Exit\">Sortie</string>\r\n    <string name=\"Edit\">Modifier</string>\r\n    <string name=\"Delete\">Supprimer</string>\r\n    <string name=\"Description\">Description</string>\r\n    <string name=\"Code\">Code</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">Activer le microphone</string>\r\n    <string name=\"EnableMicrophoneDesc\">Utilisez le microphone de votre appareil comme le microphone du DS.</string>\r\n    <string name=\"AlwaysTouch\">Toujours autoriser toucher</string>\r\n    <string name=\"AlwaysTouchDesc\">Toujours traiter le DS écran comme tactile, même lorsqu\\'il n\\'est pas en mode tactile. Pour les jeux qui nécessitent l\\'aide des commandes et de l\\'écran tactile en même temps.</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">Maintenir rapport d\\'aspect</string>\r\n    <string name=\"MaintainAspectRatioDesc\">Maintenir le rapport d\\'aspect du DS; n\\'étirez pas pour adapter l\\'écran.</string>\r\n\t<string name=\"MainScreenOnly\">Seulement l\\'écran principal</string>\r\n\t<string name=\"MainScreenOnlyDesc\">Seulement afficher l\\'écran principal de jeu, cachant l\\'écran tactile.</string>\r\n\t<string name=\"LidOpen\">Le couvercle est ouvert</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">Sélectionner les écrans</string>\r\n\t<string name=\"SelectScreensDesc\">Choisissez quels écrans DS seront affichés.</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>Tous les deux</item>\r\n\t    <item>Principal</item>\r\n\t    <item>Tactil</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">Options</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">Le moteur d\\'exécution</string>\r\n\t<string name=\"ExecutionEngineDesc\">Le moteur utilisé pour émuler les processeurs ARM du DS.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">Mode de synchronisation du son</string>\r\n\t<string name=\"SoundSyncModeDesc\">Synchronisation du son du jeu. Le mode double sync/async est généralement acceptable et le plus rapide, mais Sync est parfois nécessaire pour les films ou la voix.</string>\r\n\t\r\n    <!-- Do not translate -->\r\n    \r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-he/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">שלום עולם!</string>\r\n    <string name=\"menu_settings\">הגדרות</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>שנה שם</item--> \r\n\t\t<item>מחק</item>\r\n\t\t<!--item>גזור</item-->\r\n\t\t<!--item>העתק</item-->\r\n\t\t<item>שלח אל...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">ארעה שגיאה בטעינת הרום :(</string>\r\n\t<string name=\"OK\">אישור</string>\r\n\t<string name=\"location\">מיקום</string>\r\n    <string name=\"cant_read_folder\">קריאת התיקייה נכשלה</string>\r\n    <string name=\"nnew\">חדש</string>\r\n    <string name=\"select\">בחר</string>\r\n    <string name=\"file_name\">שם הקובץ:</string>\r\n    <string name=\"cancel\">בטל</string>\r\n    <string name=\"create\">שמור</string>\r\n    <string name=\"no_data\">אין נתונים</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">שגיאה</string>\r\n    <string name=\"Load\">טען</string>\r\n    <string name=\"QuickSave\">שמירה מהירה</string>\r\n    <string name=\"QuickRestore\">טעינה מהירה</string>\r\n    <string name=\"SaveState\">שמירה</string>\r\n    <string name=\"RestoreState\">טען שמירה</string>\r\n    <string name=\"Settings\">הגדרות</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">על מנת להחליף בין מצב מגע ל-מצב מקשים, לחץ על כפתור מגע שלמעלה</string>\r\n    <string name=\"frameskip\">דילוג פריימים</string>\r\n    <string name=\"frameskipdesc\">על כמה פריימים לדלג בשעת האימולציה. מסייע בהתאמת האימולציה האיטית לזמן האמת</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">העבר התמונות למסך בין הפריימים בלבד. יכול להאט את האימולציה, אך כיבויו עשוי לגרום לשיבושים חזותיים</string>\r\n    <string name=\"fps\">פריימים לשניה</string>\r\n    <string name=\"fpsdesc\">הצג על המסך את כמות הפריימים המוצגים בשניה</string>\r\n    <string name=\"showtouchmsg\">הראה את ההודעה בדבר מגע</string>\r\n    <string name=\"showtouchmsgdesc\">הצג הודעה למשתמש המסבירה לגבי המעבר בין מצב מגע למצב מקשים.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">טוען</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">פילטר מסך</string>\r\n    <string name=\"filterdesc\">הפילטר בו משתמשים בעת העלה הרזולוציה מזו של הנינטנדו די.אס לזו של המכשיר. בחירה בפילטרים באיכות גבוהה עשויה לפגוע בביצועים</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">3D Renderer</string>\r\n    <string name=\"threedrendererdesc\">באיזה מנוע רנדור בתלת מימד להשתמש</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>שום מנוע</item>\r\n        <item>OpenGL</item>\r\n        <item>תוכנה</item>\r\n    </string-array>\r\n    <string name=\"sound\">אפשר השמעת קול</string>\r\n    <string name=\"sounddesc\">אפשר עיבוד והשמעה של קול. נטרול יכול לשפר את הביצועים </string>\r\n    <string name=\"showsoundmsg\">הראה את ההודעה בדבר קול</string>\r\n    <string name=\"showsoundmsgdesc\">הצג למשתמש הודעה השואלת האם ברצונו לאפשר השמעת קול</string>\r\n    <string name=\"soundmsg\">האם תרצה לאפשר השמעת קול? זה עלול להביא לירידת הביצועים בכ-3 על 5 פריימים לשניה</string>\r\n    <string name=\"yes\">כן</string>\r\n    <string name=\"no\">לא</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">תצוגה</string>\r\n    <string name=\"Controls\">מקשים</string>\r\n    <string name=\"EditLayout\">ערוך את פריסת המקשים</string>\r\n    <string name=\"EditLayoutDesc\">ערוך את מיקומם של מקשי המגע על המסך</string>\r\n    <string name=\"UseTouchPort\">מקשי מגע בתצוגה אנכית</string>\r\n    <string name=\"UseTouchPortDesc\">השתמש במקשי המגע על המסך בעת תצוגה אנכית</string>\r\n    <string name=\"UseTouchLand\">מקשי המגע בתצוגה אופקית</string>\r\n    <string name=\"UseTouchLandDesc\">השתמש במקשי המגע על המסך בעת תצוגה אופקית</string>\r\n    <string name=\"ResetLayout\">אתחל את פריסת המקשים</string>\r\n    <string name=\"ResetLayoutDesc\">שחזר את הגדרות ברירת המחדל של פריסת המקשים</string>\r\n    <string name=\"Sound\">קול</string>\r\n    <string name=\"LCDSwap\">החלף בין המסכים</string>\r\n    <string name=\"LCDSwapDesc\">סמן על מנת להחליף בין מיקומיהם של המסך הראשי והמסך המשני</string>\r\n    <string name=\"ButtonTrans\">שקיפות מקשים</string>\r\n    <string name=\"ButtonTransDesc\">כמה שקופים צריכים להיות מקשי המגע שעל המסך</string>\r\n    <string name=\"Haptic\">רטט</string>\r\n    <string name=\"HapticDesc\">הפעל רטט בעת לחיצה על מקשים. מותנה בתמיכת המכשיר בפונקציה</string>\r\n    <string name=\"KeymapDialogDesc\">לחץ על כפתור על מנת למפות מקש זה</string>\r\n    <string name=\"KeymapValuePreface\">ממופה כעת ל</string>\r\n    <string name=\"EditKeymap\">ערוך את מיפוי המקשים</string>\r\n    <string name=\"EditKeymapDesc\">ערוך את המיפוי ממקשי החומרה למקשי הדי.אס</string>\r\n    <string name=\"Up\">למעלה</string>\r\n    <string name=\"Down\">למטה</string>\r\n    <string name=\"Left\">שמאל</string>\r\n    <string name=\"Right\">ימין</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">מגע</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">אל תחליף בין המסכים</string>\r\n    <string name=\"DontRotateLCDsDesc\">במצג תצוגה אופקית, המנע מלהחליף בין המשסכים. השתמש בפונקציה זו למשחקים שבהם אמורים להחזיק את הדי.אס על הצד</string>\r\n    <string name=\"Language\">שפה</string>\r\n    <string name=\"LanguageDesc\">שפת המערכת. רומים התומכים במספר שפות משתמשים בהגדרה זו. השינויים ייושמו כלפי הרום הבא שיטען</string>\r\n    <string name=\"Gameplay\">משחקיות</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">הוסף ציט מסוג אקשן ריפליי</string>\r\n    <string name=\"Cheats\">ציטים</string>\r\n    <string name=\"Exit\">יציאה</string>\r\n    <string name=\"Edit\">ערוך</string>\r\n    <string name=\"Delete\">מחק</string>\r\n    <string name=\"Description\">תיאור</string>\r\n    <string name=\"Code\">קוד</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">אפשר האזנה למיקרופטן</string>\r\n    <string name=\"EnableMicrophoneDesc\">משתמש במיקרופון המכשיר כמיקרופון הדי.אס</string>\r\n    <string name=\"AlwaysTouch\">אפשר מגע תמיד</string>\r\n    <string name=\"AlwaysTouchDesc\">אפשר תמיד לחיצה על מסך המגע, גם כשלא במצב מגע. השתמש בפונקציה זו בעת הפעלה משחקים שדורשים שימוש במסך המשני ובמקשים במקביל</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">שמור על יחס התצוגה</string>\r\n    <string name=\"MaintainAspectRatioDesc\">שמור על יחס התצוגה של הדי.אס. אל תמתח את המסך</string>\r\n\t<string name=\"MainScreenOnly\">מסך ראשי בלבד</string>\r\n\t<string name=\"MainScreenOnlyDesc\">הצג את המסך הראשי בלבד. החבא את המסך המשני</string>\r\n\t<string name=\"LidOpen\">מכסה פתוח</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">בחר מסכים</string>\r\n\t<string name=\"SelectScreensDesc\">בחר אילו מסכי די.אס יוצגו</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>שניהם</item>\r\n\t    <item>ראשי</item>\r\n\t    <item>מגע</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">אפשרויות</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">מנוע ביצוע</string>\r\n\t<string name=\"ExecutionEngineDesc\">המנוע המשמש לאימולציה של מעבדי הדי.אס</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">מצב סינכרון קול</string>\r\n\t<string name=\"SoundSyncModeDesc\">סינכרון הקול.האפשרות הראשונה טובה בדרך כלל, אבל השנייה דרושה לעיתים עבור סרטונים או קול</string>\r\n\t\r\n\t<!-- Release 29 -->\r\n\t<string name=\"JitSize\">JIT block size</string>\r\n\t<string name=\"JitSizeDesc\">For the threaded interpreter/tinycc JIT execution engines, how big each JIT block should be. 1 is most accurate, while 100 is fastest</string>\r\n\t<string name=\"about1\">הוא אימולטור חינמי לנינטנדו .די.אס המבוסס על קוד פתוח nds4droid</string>\r\n\t<string name=\"about2\">האימולטור הוא תוצר של אינספור שעות של מאמץ של תורמים רבים</string>\r\n\t<string name=\"about3\">גפרי קווסנל הוא המפתח העיקרי של האימולטור. האימולטור פותח בסטרלינג הייטס, מישיגן, ארצות הברית של אמריקה</string>\r\n\t<string name=\"about4\">Special thanks to gechdcb for his contribution of the threaded interpreter and tinycc JIT.</string>\r\n\t<string name=\"about5\">nds4droid website: http://nds4droid.com\\nDeSmuME website: http://desmume.org</string>\r\n\t<string name=\"about\">אודות</string>\r\n\t\r\n    <!-- Do not translate -->\r\n    \r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-it/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Ciao mondo!</string>\r\n    <string name=\"menu_settings\">Impostazioni</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Rename</item--> \r\n\t\t<item>Cancella</item>\r\n\t\t<!--item>Cut</item-->\r\n\t\t<!--item>Copy</item-->\r\n\t\t<item>Invia A...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">C\\'è stato un errore nel caricamento della ROM :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">Posizione</string>\r\n    <string name=\"cant_read_folder\">La cartella non può essere aperta!</string>\r\n    <string name=\"nnew\">Nuovo</string>\r\n    <string name=\"select\">Selezione</string>\r\n    <string name=\"file_name\">Nome file:</string>\r\n    <string name=\"cancel\">Annulla</string>\r\n    <string name=\"create\">Salva</string>\r\n    <string name=\"no_data\">Nessun Dato</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">Errore</string>\r\n    <string name=\"Load\">Carica</string>\r\n    <string name=\"QuickSave\">Salvataggio veloce</string>\r\n    <string name=\"QuickRestore\">Caricamento veloce</string>\r\n    <string name=\"SaveState\">Salva Stato</string>\r\n    <string name=\"RestoreState\">Carica Stato</string>\r\n    <string name=\"Settings\">Impostazioni</string>\r\n    \r\n    <!-- Release 2 -->\r\n\t<string name=\"touchnotify\">Per passare dalla modalità touch alla modalità keypad, premi il bottone \"touch\" in alto</string>\r\n    <string name=\"frameskip\">Salta fotogrammi</string>\r\n\t<string name=\"frameskipdesc\">Quanti fotogrammi bisogna saltare durante l\\'emulazione. Aiuta a far corrispondere l\\'emulazione lenta al tempo reale.</string>\r\n    <string name=\"vsync\">VSync</string>\r\n\t<string name=\"vsyncdesc\">Disegna sullo schermo solamente alla frequenza di aggiornamento dello schermo. Può rallentare l\\'emulazione, ma disabilitarlo può causare difetti grafici</string>\r\n    <string name=\"fps\">Mostra FPS</string>\r\n    <string name=\"fpsdesc\">Mostra gli FPS(fotogrammi al secondo) sullo schermo.</string>\r\n    <string name=\"showtouchmsg\">Mostra il messaggio del touchscreen</string>\r\n\t<string name=\"showtouchmsgdesc\">Mostra all\\'utente un messaggio che spiega come cambiare tra modalità touch e keypad.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">Caricamento</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">Filtro dello schermo</string>\r\n    <string name=\"filterdesc\">Filtro da usare quando si aumenta la risoluzione da quella del Nintendo DS a quella del tuo schermo. Filtri di qualità maggiore possono peggiorare le prestazioni.</string>\r\n\t\r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">3D Renderer</string>\r\n    <string name=\"threedrendererdesc\">Quale motore usare per il rendering 3D.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>Nessuno</item>\r\n        <item>OpenGL</item>\r\n        <item>Software</item>\r\n    </string-array>\r\n    <string name=\"sound\">Abilita i suoni</string>\r\n\t<string name=\"sounddesc\">Abilita l\\'elaborazione e la riproduzione dell\\'audio. Disabilitarla può migliorare le prestazioni.</string>\r\n    <string name=\"showsoundmsg\">Mostra il messaggio dei suoni</string>\r\n\t<string name=\"showsoundmsgdesc\">Mostra all\\'utente una domanda che chiede se vuole abilitare i suoni.</string>\r\n\t<string name=\"soundmsg\">Vuoi abilitare l\\'audio? Farlo può causare una perdita di prestazioni di 3-5 FPS.</string>\r\n    <string name=\"yes\">Si</string>\r\n    <string name=\"no\">No</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Display</string>\r\n    <string name=\"Controls\">Controlli</string>\r\n    <string name=\"EditLayout\">Modifica il layout dei controlli</string>\r\n    <string name=\"EditLayoutDesc\">Modifica la posizione dei tasti sullo schermo.</string>\r\n    <string name=\"UseTouchPort\">Tasti touch portrait</string>\r\n    <string name=\"UseTouchPortDesc\">Usa i tasti touch sullo schermo in modalità portrait.</string>\r\n    <string name=\"UseTouchLand\">Tasti touch landscape</string>\r\n    <string name=\"UseTouchLandDesc\">Usa i tasti touch sullo schermo in modalità landscape.</string>\r\n    <string name=\"ResetLayout\">Resetta il layout dei controlli</string>\r\n    <string name=\"ResetLayoutDesc\">Resetta il layout dei tasti alle impostazioni originali.</string>\r\n    <string name=\"Sound\">Suoni</string>\r\n    <string name=\"LCDSwap\">Scambia LCD</string>\r\n\t<string name=\"LCDSwapDesc\">Seleziona per scambiare lo schermo principale con quello touch. </string>\r\n    <string name=\"ButtonTrans\">Trasparenza dei tasti</string>\r\n    <string name=\"ButtonTransDesc\">Quanto devono essere trasparenti i tasti sullo schermo.</string>\r\n    <string name=\"Haptic\">Feedback aptico</string>\r\n    <string name=\"HapticDesc\">Abilita il feedback aptico alla pressione dei tasti se supportato dal dispositivo.</string>\r\n\t<string name=\"KeymapDialogDesc\">Premi un tasto touch da assegnare a questo tasto.</string>\r\n\t<string name=\"KeymapValuePreface\">Attualmente assegnato a</string>\r\n    <string name=\"EditKeymap\">Modifica le assegnazioni dei tasti</string>\r\n    <string name=\"EditKeymapDesc\">Modifica gli assegnamenti dei tasti touch a quelli fisici.</string>\t\r\n    <string name=\"Up\">Su</string>\r\n    <string name=\"Down\">Giù</string>\r\n    <string name=\"Left\">Sinistra</string>\r\n    <string name=\"Right\">Destra</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Touch</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">Non ruotare gli LCD</string>\r\n    <string name=\"DontRotateLCDsDesc\">In modalità landscape, non ruota gli schermi. Da usare per giochi pensati per essere giocati tenendo il DS di lato.</string>\r\n    <string name=\"Language\">Lingua</string>\r\n    <string name=\"LanguageDesc\">La lingua del sistema. Le ROM multilingua usano questa impostazione. Il cambiamento verrà applicato al prossimo caricamento della ROM.</string>\r\n    <string name=\"Gameplay\">Gameplay</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">Aggiunge un nuovo codice Action Replay</string>\r\n    <string name=\"Cheats\">Codici</string>\r\n    <string name=\"Exit\">Esci</string>\r\n    <string name=\"Edit\">Modifica</string>\r\n    <string name=\"Delete\">Cancella</string>\r\n    <string name=\"Description\">Descrizione</string>\r\n    <string name=\"Code\">Codice</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">Abilita il microfono</string>\r\n    <string name=\"EnableMicrophoneDesc\">Usa il microfono del tuo dispositivo come microfono del ds.</string>\r\n    <string name=\"AlwaysTouch\">Permetti sempre il touch</string>\r\n\t<string name=\"AlwaysTouchDesc\">Mantieni sempre attivo il touchscreen del DS, anche quando non in modalità touch. Per giochi che richiedono l\\'uso di tasti e touchscreen insieme.</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">Mantieni aspect ratio</string>\r\n    <string name=\"MaintainAspectRatioDesc\">Mantiene l\\'aspect ratio del DS; non modifica l\\'immagine per riempire lo schermo.</string>\r\n\t<string name=\"MainScreenOnly\">Solo schermo principale</string>\r\n\t<string name=\"MainScreenOnlyDesc\">Mostra solo lo schermo principale, il touchscreen viene nascosto.</string>\r\n\t<string name=\"LidOpen\">Coperchio aperto</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">Seleziona gli schermi</string>\r\n\t<string name=\"SelectScreensDesc\">Scegli gli schermi del DS che verranno mostrati.</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>Entrambi</item>\r\n\t    <item>Principale</item>\r\n\t    <item>Touch</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">Opzioni</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">Motore di esecuzione</string>\r\n\t<string name=\"ExecutionEngineDesc\">Il motore usato per emulare i processori ARM del DS.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">Sincronizza l\\'audio</string>\r\n    <string name=\"SoundSyncModeDesc\">Sincronizzazione dell\\'audio del gioco. Dual sync/async è solitamente okay ed è più veloce, ma Sync è a volte necessario per video o voci.</string>\r\n\t\r\n\t<!-- Release 29 -->\r\n\t<string name=\"JitSize\">dimensione del blocco JIT</string>\r\n\t<string name=\"JitSizeDesc\">Per i motori di esecuzione threaded interpreter/tinycc JIT, indica quanto grande deve essere ogni blocco JIT. 1 è il più accurato, mentre 100 è il più veloce</string>\r\n\t<string name=\"about1\">nds4droid è un emulatore per Nintendo DS gratuito e open source.</string>\r\n\t<string name=\"about2\">nds4droid è il risultato di incalcolabili ore di lavoro da parte di dozzine di collaboratori. Il nucleo di nds4droid è DeSmuME.</string>\r\n\t<string name=\"about3\">Jeffrey Quesnelle è lo sviluppatore principale di nds4droid. nds4droid è un prodotto di Sterling Heights, Michigan, Stati Uniti d\\'America.</string>\r\n\t<string name=\"about4\">Un ringraziamento speciale a gechdcb per il suo contributo al threaded interpreter e al tinycc JIT.</string>\r\n\t<string name=\"about5\">sito di nds4droid: http://nds4droid.com\\nsito di DeSmuME: http://desmume.org</string>\r\n\t<string name=\"about\">Informazioni su...</string>\r\n\r\n    <!-- Do not translate -->\r\n  \r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ja/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Hello world!</string>\r\n    <string name=\"menu_settings\">設定</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Rename</item--> \r\n\t\t<item>Delete</item>\r\n\t\t<!--item>Cut</item-->\r\n\t\t<!--item>Copy</item-->\r\n\t\t<item>Send To...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">ROMのロード中にエラーが発生しました :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">ROMの場所</string>\r\n    <string name=\"cant_read_folder\">このフォルダは読み込めません</string>\r\n    <string name=\"nnew\">新規</string>\r\n    <string name=\"select\">選択</string>\r\n    <string name=\"file_name\">ファイル名:</string>\r\n    <string name=\"cancel\">キャンセル</string>\r\n    <string name=\"create\">セーブ</string>\r\n    <string name=\"no_data\">データ無し</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">エラー</string>\r\n    <string name=\"Load\">ROMのロード</string>\r\n    <string name=\"QuickSave\">すぐにセーブ</string>\r\n    <string name=\"QuickRestore\">すぐに再開</string>\r\n    <string name=\"SaveState\">スロットにセーブ</string>\r\n    <string name=\"RestoreState\">スロットから再開</string>\r\n    <string name=\"Settings\">設定</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">タッチモードとキーパッドモードは、画面中央のtouchボタンで切り替わります</string>\r\n    <string name=\"frameskip\">フレームスキップ</string>\r\n    <string name=\"frameskipdesc\">フレーム描画を適宜スキップすることで、ゲームのリアルタイム性が向上します。</string>\r\n    <string name=\"vsync\">垂直同期</string>\r\n    <string name=\"vsyncdesc\">オフにすることでゲーム速度は向上しますが、描画に異常が発生する場合があります。</string>\r\n    <string name=\"fps\">FPS表示</string>\r\n    <string name=\"fpsdesc\">画面上にFPSを表示します。</string>\r\n    <string name=\"showtouchmsg\">タッチメッセージを表示</string>\r\n    <string name=\"showtouchmsgdesc\">タッチモード・キーパッドモードの切替を説明するメッセージを表示します。</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">ロード中</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">スクリーンフィルタ</string>\r\n    <string name=\"filterdesc\">ゲーム本来の解像度を、端末画面の解像度へと変換する際のフィルタを選択します。高品質なフィルタほどゲーム速度の低下を招きます。</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">3Dレンダラ</string>\r\n    <string name=\"threedrendererdesc\">３Dレンダリングエンジンを選択します。</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>なし</item>\r\n        <item>OpenGL</item>\r\n        <item>ソフトウェア処理</item>\r\n    </string-array>\r\n    <string name=\"sound\">サウンド有効化</string>\r\n    <string name=\"sounddesc\">ゲームサウンドの有無を設定します。無効化により、ゲーム速度が向上する場合があります。</string>\r\n    <string name=\"showsoundmsg\">サウンドメッセージ表示</string>\r\n    <string name=\"showsoundmsgdesc\">サウンドを有効化するか否かについて尋ねます。</string>\r\n    <string name=\"soundmsg\">サウンドを有効化しますか？（３～５FPS分の遅延が発生する場合があります）</string>\r\n    <string name=\"yes\">はい</string>\r\n    <string name=\"no\">いいえ</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Display</string>\r\n    <string name=\"Controls\">Controls</string>\r\n    <string name=\"EditLayout\">タッチボタン位置調整</string>\r\n    <string name=\"EditLayoutDesc\">各タッチボタンの、画面上の位置を調整します。</string>\r\n    <string name=\"UseTouchPort\">ボタン表示(ポートレート時)</string>\r\n    <string name=\"UseTouchPortDesc\">ポートレートモード(画面縦長)時にタッチボタンを表示します。</string>\r\n    <string name=\"UseTouchLand\">ボタン表示(ランドスケープ時)</string>\r\n    <string name=\"UseTouchLandDesc\">ランドスケープモード(画面横長)時にタッチボタンを表示します。</string>\r\n    <string name=\"ResetLayout\">タッチボタンの位置設定初期化</string>\r\n    <string name=\"ResetLayoutDesc\">タッチボタンの位置を初期化します。</string>\r\n    <string name=\"Sound\">サウンド</string>\r\n    <string name=\"LCDSwap\">LCD画面入替</string>\r\n    <string name=\"LCDSwapDesc\">メイン画面とタッチ画面の位置を入れ替えます。</string>\r\n    <string name=\"ButtonTrans\">タッチボタンの透明度</string>\r\n    <string name=\"ButtonTransDesc\">タッチボタンの透明度を調整します。</string>\r\n    <string name=\"Haptic\">触覚フィードバック</string>\r\n    <string name=\"HapticDesc\">タッチボタン押下に伴う触覚フィードバックを有効化します(端末がサポートしている場合)。</string>\r\n    <string name=\"KeymapDialogDesc\">このタッチボタンに対応させたいキーを押してください。</string>\r\n    <string name=\"KeymapValuePreface\">現在の割り当て：</string>\r\n    <string name=\"EditKeymap\">ハードウェアキーマッピング</string>\r\n    <string name=\"EditKeymapDesc\">端末のハードウェアキーをDSのボタンに対応させます。</string>\r\n    <string name=\"Up\">Up</string>\r\n    <string name=\"Down\">Down</string>\r\n    <string name=\"Left\">Left</string>\r\n    <string name=\"Right\">Right</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Touch</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">画面回転無効化</string>\r\n    <string name=\"DontRotateLCDsDesc\">ランドスケープモードにおけるLCD画面のローテーションを無効化します。</string>\r\n    <string name=\"Language\">言語</string>\r\n    <string name=\"LanguageDesc\">ゲームシステムの言語を選択します.多言語対応のROMはこの設定を利用します。変更は、次回ROMロード時に適用されます。</string>\r\n    <string name=\"Gameplay\">ゲームプレイ</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">プロアクションリプレイのチートを新規追加</string>\r\n    <string name=\"Cheats\">チート</string>\r\n    <string name=\"Exit\">終了</string>\r\n    <string name=\"Edit\">編集</string>\r\n    <string name=\"Delete\">削除</string>\r\n    <string name=\"Description\">説明</string>\r\n    <string name=\"Code\">コード</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">マイク有効化</string>\r\n    <string name=\"EnableMicrophoneDesc\">端末のマイクをDSのマイクとして使用します。</string>\r\n    <string name=\"AlwaysTouch\">タッチを常時有効化</string>\r\n    <string name=\"AlwaysTouchDesc\">タッチモード時でなくとも、常時DSタッチスクリーンを処理します。タッチとキー操作を同時に要求するゲームに対して有効です。</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">アスペクト比を保持</string>\r\n    <string name=\"MaintainAspectRatioDesc\">DSのアスペクト比を保持</string>\r\n\t<string name=\"MainScreenOnly\">メイン画面のみ</string>\r\n\t<string name=\"MainScreenOnlyDesc\">タッチスクリーンを隠し、メインのゲーム画面のみ表示</string>\r\n\t<string name=\"LidOpen\">蓋を開ける</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">画面選択</string>\r\n\t<string name=\"SelectScreensDesc\">どのDS画面を表示するか選択</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>両方</item>\r\n\t    <item>メイン</item>\r\n\t    <item>タッチ</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">オプション</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">実行エンジン</string>\r\n\t<string name=\"ExecutionEngineDesc\">DSのARMプロセッサをエミュレートするエンジン</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">サウンド同期モード</string>\r\n\t<string name=\"SoundSyncModeDesc\">ゲームサウンドの同期。同期・非同期併用で通常は問題ありませんが、音声や動画再生に有用な場合があります</string>\r\n\t\r\n    <!-- Do not translate -->\r\n\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ko/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Hello world!</string>\r\n    <string name=\"menu_settings\">설정</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>이름변경</item--> \r\n\t\t<item>삭제</item>\r\n\t\t<!--item>잘라내기</item-->\r\n\t\t<!--item>복사</item-->\r\n\t\t<item>보내기</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">ROM 로딩 중 에러가 발생하였습니다 :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">위치</string>\r\n    <string name=\"cant_read_folder\">폴더를 읽을 수 없습니다!</string>\r\n    <string name=\"nnew\">새로 만들기</string>\r\n    <string name=\"select\">선택</string>\r\n    <string name=\"file_name\">파일명:</string>\r\n    <string name=\"cancel\">취소</string>\r\n    <string name=\"create\">세이브</string>\r\n    <string name=\"no_data\">데이터 없음</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">에러</string>\r\n    <string name=\"Load\">로드</string>\r\n    <string name=\"QuickSave\">빠른 세이브</string>\r\n    <string name=\"QuickRestore\">빠른 복원</string>\r\n    <string name=\"SaveState\">현재상태 저장</string>\r\n    <string name=\"RestoreState\">상태 복원</string>\r\n    <string name=\"Settings\">설정</string>\r\n    \r\n\t<!-- Release 2 -->\r\n    <string name=\"touchnotify\">화면 상단 중앙의 \\'터치\\' 버튼을 사용하여 터치 모드에서 키패드 모드로 전환하실 수 있습니다</string>\r\n    <string name=\"frameskip\">프레임 건너뛰기</string>\r\n    <string name=\"frameskipdesc\">에뮬레이션 중 건너뛸 (Skip) 할 프레임 개수를 지정합니다. 느린 에뮬레이션을 실시간 속도에 맞추도록 돕습니다.</string>\r\n    <string name=\"vsync\">수직 동기화 (VSync)</string>\r\n    <string name=\"vsyncdesc\">화면의 주사율에 맞게 게임 화면의 갱신 속도를 동기화 합니다. 에뮬레이션을 느리게 하지만 꺼져있을 경우 화면에 글리치가 발생할 수 있습니다.</string>\r\n    <string name=\"fps\">FPS 보여주기</string>\r\n    <string name=\"fpsdesc\">FPS 를 스크린에 그립니다.</string>\r\n    <string name=\"showtouchmsg\">터치 메시지 보여주기</string>\r\n    <string name=\"showtouchmsgdesc\">터치방식/키패드방식 모드 변환에 관한 설명 메시지를 보여줍니다.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">로딩</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">스크린 필터</string>\r\n    <string name=\"filterdesc\">사용자 기기의 해상도에 맞게 Nintendo DS 게임 해상도를 높여줄때 필요한 필터를 선택합니다. 고사양의 필터일 수록 게임 속도를 저하시킵니다.</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">3D 렌더링</string>\r\n    <string name=\"threedrendererdesc\">원하시는 3D 렌더링 엔진을 선택합니다.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>사용안함</item>\r\n        <item>OpenGL 렌더링</item>\r\n        <item>소프트웨어 자체 렌더링</item>\r\n    </string-array>\r\n    <string name=\"sound\">사운드 켜기</string>\r\n    <string name=\"sounddesc\">오디오 처리 및 재생 사용하기. 끌경우 게임 속도가 향상 됩니다.</string>\r\n    <string name=\"showsoundmsg\">사운드 메시지 보여주기</string>\r\n    <string name=\"showsoundmsgdesc\">게임 사운드를 켜고 끔에 관하여 사용자의 의향을 묻는 메시지를 보여줍니다.</string>\r\n    <string name=\"soundmsg\">게임 사운드를 켜시겠습니까? 사운드를 켜실 경우 3 에서 5 FPS 성능 저하가 발생하게됩니다.</string>\r\n    <string name=\"yes\">예</string>\r\n    <string name=\"no\">아니오</string>\r\n    \r\n\t<!-- Release 8 -->\r\n    <string name=\"Display\">디스플레이</string>\r\n    <string name=\"Controls\">컨트롤</string>\r\n    <string name=\"EditLayout\">컨트롤 레이아웃 변경</string>\r\n    <string name=\"EditLayoutDesc\">터치 컨트롤을 화면 어디에 배치할지 설정합니다.</string>\r\n    <string name=\"UseTouchPort\">수직 터치버튼</string>\r\n    <string name=\"UseTouchPortDesc\">화면위에 터치스크린을 수직으로 배치합니다.</string>\r\n    <string name=\"UseTouchLand\">수평 터치버튼</string>\r\n    <string name=\"UseTouchLandDesc\">화면위에 터치스크린을 수평으로 배치합니다.</string>\r\n    <string name=\"ResetLayout\">터치 컨트롤 레이아웃 리셋</string>\r\n    <string name=\"ResetLayoutDesc\">터치 컨트롤의 레이아웃을 기본상태로 초기화합니다.</string>\r\n    <string name=\"Sound\">사운드</string>\r\n    <string name=\"LCDSwap\">LCD 바꾸기</string>\r\n    <string name=\"LCDSwapDesc\">메인 또는 터치 LCD의 위치를 바꿔줍니다.</string>\r\n    <string name=\"ButtonTrans\">버튼 투명도</string>\r\n    <string name=\"ButtonTransDesc\">버튼의 투명도를 설정합니다</string>\r\n    <string name=\"Haptic\">햅틱 피드백</string>\r\n    <string name=\"HapticDesc\">사용자 기기가 햅틱피드백을 지원할 경우 버튼을누를때 햅틱피드백 효과를냅니다.</string>\r\n    <string name=\"KeymapDialogDesc\">본버튼에 매핑할 키를 설정합니다</string>\r\n    <string name=\"KeymapValuePreface\">현재 매핑된 키</string>\r\n    <string name=\"EditKeymap\">키매핑 변경</string>\r\n    <string name=\"EditKeymapDesc\">하드웨어 키와 DS 버튼을 매핑합니다.</string>\r\n    <string name=\"Up\">위</string>\r\n    <string name=\"Down\">아래</string>\r\n    <string name=\"Left\">왼쪽</string>\r\n    <string name=\"Right\">오른쪽</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">터치</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">LCD회전 끄기</string>\r\n    <string name=\"DontRotateLCDsDesc\">수평모드일때 게임 LCD 회전을 끕니다. 수평화면으로 즐기실 DS게임의 경우사용해주십시오.</string>\r\n    <string name=\"Language\">언어</string>\r\n    <string name=\"LanguageDesc\">시스템 언어를 설정합니다. 다중언어 ROM의경우 설정가능합니다. 다음번 ROM 로딩시 적용됩니다</string>\r\n    <string name=\"Gameplay\">게임플레이</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">액션 리플레이 치트를 추가합니다</string>\r\n    <string name=\"Cheats\">치트</string>\r\n    <string name=\"Exit\">나가기</string>\r\n    <string name=\"Edit\">변경</string>\r\n    <string name=\"Delete\">삭제</string>\r\n    <string name=\"Description\">설명</string>\r\n    <string name=\"Code\">코드</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">마이크 사용하기</string>\r\n    <string name=\"EnableMicrophoneDesc\">사용자 기기의 마이크를 DS 마이크로 지정합니다.</string>\r\n    <string name=\"AlwaysTouch\">터치이벤트 항상 처리하기</string>\r\n    <string name=\"AlwaysTouchDesc\">터치모드가 아닌상태에서도 항상 DS터치스크린을 처리합니다. 컨트롤러와 터치스크린을 동시에 사용하는 게임을하실때 필요합니다.</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">화면비율 유지</string>\r\n    <string name=\"MaintainAspectRatioDesc\">DS의 화면비율을 유지합니다; 전체화면으로 부풀리지 않습니다.</string>\r\n\t<string name=\"MainScreenOnly\">메인스크린만 사용</string>\r\n\t<string name=\"MainScreenOnlyDesc\">터치스크린은 숨기고 메인 게임 스크린만 표시합니다</string>\r\n\t<string name=\"LidOpen\">lid 열림</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">스크린 선택</string>\r\n\t<string name=\"SelectScreensDesc\">어떤 DS스크린을 활성화할지 선택합니다.</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>둘다</item>\r\n\t    <item>메인스크린민</item>\r\n\t    <item>터치스크린만</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">옵션</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">처리엔진</string>\r\n\t<string name=\"ExecutionEngineDesc\">DS의 ARM 프로세서를 에뮬레이트할 엔진을 선택합니다.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">사운드 동기화 모드</string>\r\n\t<string name=\"SoundSyncModeDesc\">게임사운드 동기화 모드를 선택합니다. 보통 dual sync/async를 사용하시는게 빠르지만 영화나 음성처리에 sync가 필요할 수 있습니다.</string>\r\n\t\r\n    <!-- Do not translate -->\r\n    \r\n    \r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-nl/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Hallo wereld!</string>\r\n    <string name=\"menu_settings\">Instellingen</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Hernoem</item--> \r\n\t\t<item>Verwijder</item>\r\n\t\t<!--item>knip</item-->\r\n\t\t<!--item>Plak</item-->\r\n\t\t<item>Verstuur Naar...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">Er was een fout bij het laden van deze ROM :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">Locatie</string>\r\n    <string name=\"cant_read_folder\">Map kan niet worden gelezen!</string>\r\n    <string name=\"nnew\">Nieuw</string>\r\n    <string name=\"select\">Selecteer</string>\r\n    <string name=\"file_name\">Bestand Naam:</string>\r\n    <string name=\"cancel\">Annuleer</string>\r\n    <string name=\"create\">Opslaan</string>\r\n    <string name=\"no_data\">Geen Data</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">Error</string>\r\n    <string name=\"Load\">Laad</string>\r\n    <string name=\"QuickSave\">Quick Save</string>\r\n    <string name=\"QuickRestore\">Quick Restore</string>\r\n    <string name=\"SaveState\">Save State</string>\r\n    <string name=\"RestoreState\">Restore State</string>\r\n    <string name=\"Settings\">Instellingen</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">Om te schakelen tussen touch mode en keypad mode, tik op de \"touch\" knop bovenaan</string>\r\n    <string name=\"frameskip\">Frame overslaan</string>\r\n    <string name=\"frameskipdesc\">Hoeveel frames overslaan bij emulatie. Helpt bij trage emulatie overeen te komen met de echte tijd.</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">Enkel schrijven naar het scherm tussen frames. Kan emulatie vertragen maar uitschakelen kan grafische storingen veroorzaken.</string>\r\n    <string name=\"fps\">Toon FPS</string>\r\n    <string name=\"fpsdesc\">Toon FPS op het scherm.</string>\r\n    <string name=\"showtouchmsg\">Toon aanraak bericht</string>\r\n    <string name=\"showtouchmsgdesc\">Toon een bericht aan de gebruiker om wisselen tussen touch/keypad modus uit te leggen.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">Laden</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">Scherm Filter</string>\r\n    <string name=\"filterdesc\">Filter om te gebruiken bij het opschalen van de Nintendo DS resolutie naar die van het toestel. Hoge kwaliteit filters kunnen prestaties verminderen.</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">3D Renderer</string>\r\n    <string name=\"threedrendererdesc\">Welke 3D rendering engine te gebruiken.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>Geen</item>\r\n        <item>OpenGL</item>\r\n        <item>Software</item>\r\n    </string-array>\r\n    <string name=\"sound\">Geluid inschakelen</string>\r\n    <string name=\"sounddesc\">Schakel verwerken en afspelen van geluid in. Uitschakelen kan een performance verhogen.</string>\r\n    <string name=\"showsoundmsg\">Toon geluid bericht</string>\r\n    <string name=\"showsoundmsgdesc\">Toon de vraag aan de gebruiker of deze geluid wil inschakelen.</string>\r\n    <string name=\"soundmsg\">Wil je geluid inschakelen? Dit kan een verlies betekenen van 3 tot 5 FPS.</string>\r\n    <string name=\"yes\">ja</string>\r\n    <string name=\"no\">Neen</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Scherm</string>\r\n    <string name=\"Controls\">Controls</string>\r\n    <string name=\"EditLayout\">Pas knoppen lay-out aan</string>\r\n    <string name=\"EditLayoutDesc\">Verander locatie van de aanraak knoppen op het scherm.</string>\r\n    <string name=\"UseTouchPort\">Portret aanraak knoppen</string>\r\n    <string name=\"UseTouchPortDesc\">Gebruik aanraak knoppen op het scherm in portret modus.</string>\r\n    <string name=\"UseTouchLand\">Landschap aanraak knoppen</string>\r\n    <string name=\"UseTouchLandDesc\">Gebruik aanraak knoppen op het scherm in landschap modus.</string>\r\n    <string name=\"ResetLayout\">Reset knoppen lay-out</string>\r\n    <string name=\"ResetLayoutDesc\">Reset de lay-out van de aanraak knoppen naar de standaard waarden.</string>\r\n    <string name=\"Sound\">Geluid</string>\r\n    <string name=\"LCDSwap\">Wissel Schermen</string>\r\n    <string name=\"LCDSwapDesc\">Vink aan om de locatie van het hoofdscherm en aanraakscherm te wisselen.</string>\r\n    <string name=\"ButtonTrans\">Knoppen doorzichtigheid</string>\r\n    <string name=\"ButtonTransDesc\">Hoe transparant moeten de koppen op het scherm zijn</string>\r\n    <string name=\"Haptic\">Haptische feedback</string>\r\n    <string name=\"HapticDesc\">Geef haptische feedback wanneer er op een knop word gedrukt wanneer ondersteund door toestel.</string>\r\n    <string name=\"KeymapDialogDesc\">Druk een toets om deze knop aan toe te wijzen</string>\r\n    <string name=\"KeymapValuePreface\">Momenteel toegewezen aan</string>\r\n    <string name=\"EditKeymap\">Bewerk knoppen toewijzingen</string>\r\n    <string name=\"EditKeymapDesc\">Bewerk toewijzingen van de hardware knoppen naar de DS knoppen.</string>\r\n    <string name=\"Up\">Boven</string>\r\n    <string name=\"Down\">Onder</string>\r\n    <string name=\"Left\">Links</string>\r\n    <string name=\"Right\">Rechts</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Touch</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">LCDs niet draaien</string>\r\n    <string name=\"DontRotateLCDsDesc\">In landschap modus, draai de spel schermen niet. Gebruik dit voor spellen die bedoeld zijn om om zijdelings gespeeld te worden.</string>\r\n    <string name=\"Language\">Taal</string>\r\n    <string name=\"LanguageDesc\">De taal van het systeem. Meertalige ROMs gebruiken deze instelling. Aanpassingen worden doorgevoerd bij het laden volgende ROM.</string>\r\n    <string name=\"Gameplay\">Gameplay</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">Voeg nieuwe Action Replay cheat toe</string>\r\n    <string name=\"Cheats\">Cheats</string>\r\n    <string name=\"Exit\">Exit</string>\r\n    <string name=\"Edit\">Aanpassen</string>\r\n    <string name=\"Delete\">Verwijderen</string>\r\n    <string name=\"Description\">Beschrijving</string>\r\n    <string name=\"Code\">Code</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">Gebruik microfoon</string>\r\n    <string name=\"EnableMicrophoneDesc\">Gebruik microfoon toestel als die van de DS.</string>\r\n    <string name=\"AlwaysTouch\">Altijd touch toestaan</string>\r\n    <string name=\"AlwaysTouchDesc\">Verwerk altijd het DS aanraakscherm, ook wanneer niet in touch mode. Voor spellen die gebruik maken van knoppen en aanraakscherm tegelijk.</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">Behoud aspect ratio</string>\r\n    <string name=\"MaintainAspectRatioDesc\">Behoud aspect ratio van de DS; rek het beeld niet uit om op het scherm te passen.</string>\r\n\t<string name=\"MainScreenOnly\">Enkel Hoofdscherm</string>\r\n\t<string name=\"MainScreenOnlyDesc\">Geef enkel het hoofdscherm weer, aanraakscherm niet weergeven.</string>\r\n\t<string name=\"LidOpen\">Scherm open</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">Selecteer schermen</string>\r\n\t<string name=\"SelectScreensDesc\">Kies welke DS schermen getoond worden.</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>Beide</item>\r\n\t    <item>Hoofd scherm</item>\r\n\t    <item>Aanraakscherm</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">Opties</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">Execution engine</string>\r\n\t<string name=\"ExecutionEngineDesc\">De engine die de ARM processor emuleert van de DS.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">Geluid syncronisatie mode</string>\r\n\t<string name=\"SoundSyncModeDesc\">Syncronistatie van het spelgeluid.  Dual sync/async is meestal OK en sneller, maar Sync is  soms nodig voor films of spraak.</string>\r\n\t\r\n\t<!-- Release 29 -->\r\n\t<string name=\"JitSize\">JIT block grote</string>\r\n\t<string name=\"JitSizeDesc\">Voor de threaded interpreter/tinycc JIT execution engines, Toon hoe groot elke JIT block zou moeten zijn. 1 is het meest nauwkeurig, terwijl 100 de snelste is.</string>\r\n\t<string name=\"about1\">nds4droid is een gratis, open source Nintendo DS emulator.</string>\r\n\t<string name=\"about2\">nds4droid is het resultaat van ontelbare uren werk door tientallen medewerkers. De emulatie kern gebruikt door nds4droid is DeSmuME.</string>\r\n\t<string name=\"about3\">Jeffrey Quesnelle is de primaire ontwikkelaar van nds4droid. nds4droid is een product van Sterling Heights, Michigan, United States of America.</string>\r\n\t<string name=\"about4\">Speciale dank aan gechdcb voor zijn  bijdrage van de threaded interpreter en lightning JIT.</string>\r\n\t<string name=\"about5\">nds4droid website: http://nds4droid.com\\nDeSmuME website: http://desmume.org</string>\r\n\t<string name=\"about\">Over</string>\r\n\t\r\n\t<!-- Release 30 -->\r\n\t<string name=\"EnableFog\">activeer mist</string>\r\n\t<string name=\"EnableFogDesc\">Bij het gebruiken van de Software renderer, schakel het verwerken van mist effecten in.</string>\r\n\t\r\n    \r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-pt/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Olá Mundo!</string>\r\n    <string name=\"menu_settings\">Definições</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Rename</item--> \r\n\t\t<item>Apagar</item>\r\n\t\t<!--item>Cut</item-->\r\n\t\t<!--item>Copy</item-->\r\n\t\t<item>Enviar para...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">Ocorreu um erro ao carregar este ROM :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">Localização</string>\r\n    <string name=\"cant_read_folder\">Não é possivel ler a pasta!</string>\r\n    <string name=\"nnew\">Novo</string>\r\n    <string name=\"select\">Selecionar</string>\r\n    <string name=\"file_name\">Nome do ficheiro:</string>\r\n    <string name=\"cancel\">Cancelar</string>\r\n    <string name=\"create\">Salvar</string>\r\n    <string name=\"no_data\">Sem Data</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">Erro</string>\r\n    <string name=\"Load\">Carregar</string>\r\n    <string name=\"QuickSave\">Salvar Rápido</string>\r\n    <string name=\"QuickRestore\">Restaurar Rápido</string>\r\n    <string name=\"SaveState\">Salvar Estado</string>\r\n    <string name=\"RestoreState\">Restaurar Estado</string>\r\n    <string name=\"Settings\">Definições</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">Para alternar entre modo táctil e de teclas, toca no botão \"touch\" localizado no topo.</string>\r\n    <string name=\"frameskip\">Saltar Frames</string>\r\n    <string name=\"frameskipdesc\">Quantas frames saltar enquanto estiver a correr a emulação. Ajuda a emulação lenta a corresponder ao tempo real.</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">Só desenhar no ecrã entre frames. Pode tornar a emulação lenta mas desligando-o pode causar erros gráficos.</string>\r\n    <string name=\"fps\">Mostrar FPS</string>\r\n    <string name=\"fpsdesc\">Mostrar os FPS no ecrã.</string>\r\n    <string name=\"showtouchmsg\">Mostrar mensagem táctil</string>\r\n    <string name=\"showtouchmsgdesc\">Mostra uma mensagem ao utilizador explicando como mudar para o modo táctil/teclas.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">A Carregar</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">Filtro De Ecrã</string>\r\n    <string name=\"filterdesc\">Filtro a usar quando transformar a resolução da Nintendo DS para o teu ecrã. Filtros de alta qualidade podem diminuir a velocidade.</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">Renderização 3D</string>\r\n    <string name=\"threedrendererdesc\">Qual o motor de renderização 3D a usar.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>Nenhum</item>\r\n        <item>OpenGL</item>\r\n        <item>Software</item>\r\n    </string-array>\r\n    <string name=\"sound\">Ativar Som</string>\r\n    <string name=\"sounddesc\">Ativa o processamento e reprodução de audio. Desativar pode aumentar a velocidade.</string>\r\n    <string name=\"showsoundmsg\">Mostrar mensagem de som</string>\r\n    <string name=\"showsoundmsgdesc\">Mostrar uma pergunta ao utilizador perguntando se quer ativar o som.</string>\r\n    <string name=\"soundmsg\">Gostarias de ativar o som? Isto pode causar uma queda de 3 a 5 FPS.</string>\r\n    <string name=\"yes\">Sim</string>\r\n    <string name=\"no\">Não</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Ecrã</string>\r\n    <string name=\"Controls\">Controlos</string>\r\n    <string name=\"EditLayout\">Editar Controlos</string>\r\n    <string name=\"EditLayoutDesc\">Edita onde os controlos tácteis estao posicionados no ecrã.</string>\r\n    <string name=\"UseTouchPort\">Botões tácteis em modo vertical</string>\r\n    <string name=\"UseTouchPortDesc\">Usar os botões tácteis no ecrã em modo vertical.</string>\r\n    <string name=\"UseTouchLand\">Botões tácteis em modo horizontal</string>\r\n    <string name=\"UseTouchLandDesc\">Usar os botões tácteis no ecrã em modo horizontal.</string>\r\n    <string name=\"ResetLayout\">Restabelecer o layout dos botões</string>\r\n    <string name=\"ResetLayoutDesc\">Restabelecer a posição original dos botões.</string>\r\n    <string name=\"Sound\">Som</string>\r\n    <string name=\"LCDSwap\">Trocar Ecrãs</string>\r\n    <string name=\"LCDSwapDesc\">Seleciona para mudar a posição do ecra principal e do ecrã táctil.</string>\r\n    <string name=\"ButtonTrans\">Transparencia dos botões</string>\r\n    <string name=\"ButtonTransDesc\">O quanto transparente os botões no ecrã devem ser</string>\r\n    <string name=\"Haptic\">Resposta táctil</string>\r\n    <string name=\"HapticDesc\">Proporciona resposta táctil quando se toca nos botões se suportado pelo dispositivo.</string>\r\n    <string name=\"KeymapDialogDesc\">Pressiona uma tecla para mapear esta botão</string>\r\n    <string name=\"KeymapValuePreface\">Atualmente mapeado a</string>\r\n    <string name=\"EditKeymap\">Editar mapeados das teclas</string>\r\n    <string name=\"EditKeymapDesc\">Editar mapeados de teclas a botões da DS.</string>\r\n    <string name=\"Up\">Cima</string>\r\n    <string name=\"Down\">Baixo</string>\r\n    <string name=\"Left\">Esquerda</string>\r\n    <string name=\"Right\">Direita</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Touch</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">Nao Rodar Ecrãs</string>\r\n    <string name=\"DontRotateLCDsDesc\">Em modo horizontal, não rodar os ecrãs. Usa isto para jogos que sejam jogados com a DS de lado.</string>\r\n    <string name=\"Language\">Linguagem</string>\r\n    <string name=\"LanguageDesc\">A linguagem do sistema. ROMs de multi-linguagem usam esta definição. As mudaças serão aplicados na proxima ROM carregada.</string>\r\n    <string name=\"Gameplay\">Jogabilidade</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">Adiciona um cheat Action Replay</string>\r\n    <string name=\"Cheats\">Cheats</string>\r\n    <string name=\"Exit\">Sair</string>\r\n    <string name=\"Edit\">Editar</string>\r\n    <string name=\"Delete\">Apagar</string>\r\n    <string name=\"Description\">Descrição</string>\r\n    <string name=\"Code\">Codigo</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">Ativar Microfone</string>\r\n    <string name=\"EnableMicrophoneDesc\">Usa o microfone do teu dispositivo como microfone da DS.</string>\r\n    <string name=\"AlwaysTouch\">Permitir sempre toque</string>\r\n    <string name=\"AlwaysTouchDesc\">Processar sempre o ecrã táctil da DS, mesmo sem estar em modo táctil. Para jogos que utilizem controlos e ecrã táctil ao mesmo tempo.</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">Manter aspect ratio</string>\r\n    <string name=\"MaintainAspectRatioDesc\">Manter o aspect ratio da DS; nao esticar para encher o ecrã.</string>\r\n\t<string name=\"MainScreenOnly\">Só o ecrã principal</string>\r\n\t<string name=\"MainScreenOnlyDesc\">Mostrar só o ecrã principal, escondendo o ecrã táctil.</string>\r\n\t<string name=\"LidOpen\">Lid open</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">Seleccionar ecrãs</string>\r\n\t<string name=\"SelectScreensDesc\">Escolhe qual ecrã da DS será mostrado.</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>Ambos</item>\r\n\t    <item>Principal</item>\r\n\t    <item>Táctil</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">Opções</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">Motor de execução</string>\r\n\t<string name=\"ExecutionEngineDesc\">O motor usado para emulaor os processadores ARM da DS.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">Modo de sincronização do som</string>\r\n\t<string name=\"SoundSyncModeDesc\">Sincronização do som do jogo. Dual sync/async é o mais rapido, mas o Sync é por vezes preciso para videos ou voz.</string>\r\n\t\r\n    <!-- Do not translate -->\r\n\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-pt-rBR/strings.xml",
    "content": "<resources>\r\n\r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Hello world!</string>\r\n    <string name=\"menu_settings\">Configurações</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Renomear</item--> \r\n\t\t<item>Deletar</item>\r\n\t\t<!--item>Cortar</item-->\r\n\t\t<!--item>Copiar</item-->\r\n\t\t<item>Mandar para...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">Aconteceu um problema carregando este jogo ;(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">Localização</string>\r\n    <string name=\"cant_read_folder\">Pasta não pode ser lida</string>\r\n    <string name=\"nnew\">Novo</string>\r\n    <string name=\"select\">Selecionar</string>\r\n    <string name=\"file_name\">Nome do arquivo:</string>\r\n    <string name=\"cancel\">Cancelar</string>\r\n    <string name=\"create\">Salvar dados</string>\r\n    <string name=\"no_data\">Sem dados</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">Erro</string>\r\n    <string name=\"Load\">Selecionar</string>\r\n    <string name=\"QuickSave\">Salvar rápido</string>\r\n    <string name=\"QuickRestore\">Restaurar rápido</string>\r\n    <string name=\"SaveState\">Salvar estado</string>\r\n    <string name=\"RestoreState\">Restaurar estado</string>\r\n    <string name=\"Settings\">Configurações</string>\r\n\r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">Para escolher entre, tela touch e setas, aperte o botão circular touch na parte de cima.</string>\r\n    <string name=\"frameskip\">Saltar Frames</string>\r\n    <string name=\"frameskipdesc\">Quantos frames eu devo saltar? Ajuda a emulação alcançar a velocidade original.</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">Somente desenha na tela no espaço entre um frame e outro. Pode lentar a emulação porém desliga-lo pode causar desfunções no gráfico.</string>\r\n    <string name=\"fps\">Mostrar FPS</string>\r\n    <string name=\"fpsdesc\">Mostra \"frames per second\" na tela</string>\r\n    <string name=\"showtouchmsg\">Mostrar menssagem ao usar touch</string>\r\n    <string name=\"showtouchmsgdesc\">Mostra menssagem quando escolhendo entre setas e touchscreen.</string>\r\n\r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">Carregando</string>    \r\n\r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">Filtro de tela</string>\r\n    <string name=\"filterdesc\">Filtro quando aumentando a resolução do nds na sua tela. Aumentando diminuirá a performance.</string>\r\n\r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">Suporte 3D</string>\r\n    <string name=\"threedrendererdesc\">Qual driver de suporte 3D usar.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>Nenhuma</item>\r\n        <item>OpenGL</item>\r\n        <item>Sistema</item>\r\n    </string-array>\r\n    <string name=\"sound\">Ativar som</string>\r\n    <string name=\"sounddesc\">Ativar processo e reprodução do áudio. Desativando pode melhorar a performance.</string>\r\n    <string name=\"showsoundmsg\">Som ativado</string>\r\n    <string name=\"showsoundmsgdesc\">Mostrar pergunta ao usuário antes de ativar a reprodução do áudio.</string>\r\n    <string name=\"soundmsg\">Você tem certeza que deseja ativar o som? Ativando-o pode causar a perda de 3 a 5 Frames por segundo.</string>\r\n    <string name=\"yes\">Sim</string>\r\n    <string name=\"no\">Não</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Display</string>\r\n    <string name=\"Controls\">Controles</string>\r\n    <string name=\"EditLayout\">Editar o modo dos controles</string>\r\n    <string name=\"EditLayoutDesc\">Edite a posição dos controles</string>\r\n    <string name=\"UseTouchPort\">Modo de retratação</string>\r\n    <string name=\"UseTouchPortDesc\">Use controles em modo de retratação.</string>\r\n    <string name=\"UseTouchLand\">Modo de visualização</string>\r\n    <string name=\"UseTouchLandDesc\">Use controles maiores.</string>\r\n    <string name=\"ResetLayout\">Resetar controles</string>\r\n    <string name=\"ResetLayoutDesc\">Resetar configurações dos controles.</string>\r\n    <string name=\"Sound\">Som</string>\r\n    <string name=\"LCDSwap\">Trocar LCDs</string>\r\n    <string name=\"LCDSwapDesc\">Troque a localização da tela touch e a tela normal.</string>\r\n    <string name=\"ButtonTrans\">Transparência dos botões</string>\r\n    <string name=\"ButtonTransDesc\">Transparência dos botões na tela.</string>\r\n    <string name=\"Haptic\">Haptic feedback</string>\r\n    <string name=\"HapticDesc\">Fornece Haptic feedback se o aparelho suportar.</string>\r\n    <string name=\"KeymapDialogDesc\">Presione uma tecla para mapear o botão</string>\r\n    <string name=\"KeymapValuePreface\">Atualmente mapeado em...</string>\r\n    <string name=\"EditKeymap\">Editar mapeamentos de teclas</string>\r\n    <string name=\"EditKeymapDesc\">Use o mapeamento das teclas do seu celular para usar no DS.</string>\r\n    <string name=\"Up\">Cima</string>\r\n    <string name=\"Down\">Baixo</string>\r\n    <string name=\"Left\">Esquerda</string>\r\n    <string name=\"Right\">Direita</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Touch</string>\r\n    \r\n    <!-- Do not translate -->\r\n    \r\n    \r\n</resources>\r\n"
  },
  {
    "path": "app/src/main/res/values-ro/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">Bună ziua lume!</string>\r\n    <string name=\"menu_settings\">Setări</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>Rename</item--> \r\n\t\t<item>Delete</item>\r\n\t\t<!--item>Cut</item-->\r\n\t\t<!--item>Copy</item-->\r\n\t\t<item>Send To...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">A fost o eroare la încărcarea acest ROM :(</string>\r\n\t<string name=\"OK\">OK</string>\r\n\t<string name=\"location\">Locație</string>\r\n    <string name=\"cant_read_folder\">Dosarul nu poate fi citit!</string>\r\n    <string name=\"nnew\">Nou</string>\r\n    <string name=\"select\">Selecționează</string>\r\n    <string name=\"file_name\">Fișier:</string>\r\n    <string name=\"cancel\">Anulează</string>\r\n    <string name=\"create\">Salvează</string>\r\n    <string name=\"no_data\">Nu există date</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">Eroare</string>\r\n    <string name=\"Load\">Încarcă</string>\r\n    <string name=\"QuickSave\">Salvare rapidă</string>\r\n    <string name=\"QuickRestore\">Refacere rapidă</string>\r\n    <string name=\"SaveState\">Salvare de stare</string>\r\n    <string name=\"RestoreState\">Refacere de stare</string>\r\n    <string name=\"Settings\">Setări</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">Pentru a comuta între modul de atingere și modul de tastatură, apăsați butonul \"atingere\" de sus</string>\r\n    <string name=\"frameskip\">Sari cadru</string>\r\n    <string name=\"frameskipdesc\">Câte cadre să săriți când emulați. Ajută să încetiniți emulația ca în timp real.</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">Desenează pe ecran numai între cadre. Poate încetini emulația, dar oprirea poate cauza erori grafice.</string>\r\n    <string name=\"fps\">Arată FPS</string>\r\n    <string name=\"fpsdesc\">Desenează FPS-ul pe ecran.</string>\r\n    <string name=\"showtouchmsg\">Arată mesajul de atingere</string>\r\n    <string name=\"showtouchmsgdesc\">Afișează un mesaj utilizatorului explicând modul de comutare pentru atingere / tastatura.</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">Încărcare</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">Filtru de ecran</string>\r\n    <string name=\"filterdesc\">Filtru utilizat pentru conversia extinsă la rezoluția Nintendo DS pe ecran. Filtre de calitate mai ridicată pot degrada performanța.</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">Randare 3D</string>\r\n    <string name=\"threedrendererdesc\">Care motor de randare 3D să fie folosit.</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>Nici unul</item>\r\n        <item>OpenGL</item>\r\n        <item>Software</item>\r\n    </string-array>\r\n    <string name=\"sound\">Activează sunet</string>\r\n    <string name=\"sounddesc\">Activează prelucrarea și redarea audio. Dezactivarea poate crește performanța.</string>\r\n    <string name=\"showsoundmsg\">Arată mesajul pentru sunet</string>\r\n    <string name=\"showsoundmsgdesc\">Afișează o întrebare pentru utilizator întrebînd dacă dorește să activeze.</string>\r\n    <string name=\"soundmsg\">Vrei să activezi sunetul? Acest lucru poate duce la o pierdere de performanță între 3 și 5 FPS.</string>\r\n    <string name=\"yes\">Da</string>\r\n    <string name=\"no\">Nu</string>\r\n    \r\n    <!-- Release 8 -->\r\n    <string name=\"Display\">Afișează</string>\r\n    <string name=\"Controls\">Controale</string>\r\n    <string name=\"EditLayout\">Editează amplasarea controalelor</string>\r\n    <string name=\"EditLayoutDesc\">Editează unde sunt controalele de atingere plasate pe ecran.</string>\r\n    <string name=\"UseTouchPort\">Butoane de atingere portret</string>\r\n    <string name=\"UseTouchPortDesc\">Utilizați butoanele de atingere de pe ecran în modul portret.</string>\r\n    <string name=\"UseTouchLand\">Butoane de atingere peisaj</string>\r\n    <string name=\"UseTouchLandDesc\">Utilizați butoanele de atingere de pe ecran în modul peisaj.</string>\r\n    <string name=\"ResetLayout\">Resetează amplasarea controalelor</string>\r\n    <string name=\"ResetLayoutDesc\">Resetează amplasarea controalelor de atingere la forma initiala.</string>\r\n    <string name=\"Sound\">Sunet</string>\r\n    <string name=\"LCDSwap\">Schimba LCD-uri</string>\r\n    <string name=\"LCDSwapDesc\">Selectați pentru a schimba amplasarea LCD-ului principal și de atingere.</string>\r\n    <string name=\"ButtonTrans\">Transparența butoanelor</string>\r\n    <string name=\"ButtonTransDesc\">Cât de transparente ar trebui să fie butoanele de atingere de pe ecran</string>\r\n    <string name=\"Haptic\">Răspuns tactil</string>\r\n    <string name=\"HapticDesc\">Oferă răspuns tactil când este apăsat butonul dacă dispozitivul îl suportă.</string>\r\n    <string name=\"KeymapDialogDesc\">Apasă o tastă pentru a mapa a acest buton</string>\r\n    <string name=\"KeymapValuePreface\">În prezent mapat la</string>\r\n    <string name=\"EditKeymap\">Editează mapări de chei</string>\r\n    <string name=\"EditKeymapDesc\">Editează mapări de chei de hardware la butoane de DS.</string>\r\n    <string name=\"Up\">Sus</string>\r\n    <string name=\"Down\">Jos</string>\r\n    <string name=\"Left\">Stânga</string>\r\n    <string name=\"Right\">Dreapta</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Început</string>\r\n    <string name=\"Start\">Selecționează</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Atinge</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">Nu rotiți LCD-uri</string>\r\n    <string name=\"DontRotateLCDsDesc\">În modul peisaj, nu rotiți LCD-uri de joc. Folosiți pentru jocurile care au fost concepute pentru a fi jucate când DS-ul este ținut lateral.</string>\r\n    <string name=\"Language\">Limba</string>\r\n    <string name=\"LanguageDesc\">Limba sistemului. ROM-uri multilingve folosesc această setare. Modificările vor fi aplicate când ROM-ul este încărcat din nou.</string>\r\n    <string name=\"Gameplay\">Modul de joc</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">Adaugă un nou truc de reluare de acțiune</string>\r\n    <string name=\"Cheats\">Truc</string>\r\n    <string name=\"Exit\">Ieșire</string>\r\n    <string name=\"Edit\">Editare</string>\r\n    <string name=\"Delete\">Ștergere</string>\r\n    <string name=\"Description\">Descriere</string>\r\n    <string name=\"Code\">Cod</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">Activează microfonul</string>\r\n    <string name=\"EnableMicrophoneDesc\">Folosește microfonul aparatului ca microfonul DS-ului</string>\r\n    <string name=\"AlwaysTouch\">Permite atingerea întotdeauna</string>\r\n    <string name=\"AlwaysTouchDesc\">Procesează întotdeauna ecranul tactil DS, chiar și atunci când nu este în modul de atingere. Pentru jocurile care necesită utilizarea controalelor și ecranul tactil în același timp.</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">Menține raportul de aspect</string>\r\n    <string name=\"MaintainAspectRatioDesc\">Menține raportul de aspect al DS-ului; nu-l întinde pentru a se potrivi pe ecran.</string>\r\n\t<string name=\"MainScreenOnly\">Numai ecranul principal</string>\r\n\t<string name=\"MainScreenOnlyDesc\">Afișează numai ecranul de joc principal, ascunde ecranul tactil.</string>\r\n\t<string name=\"LidOpen\">Capacul deschis</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">Selectează ecrane</string>\r\n\t<string name=\"SelectScreensDesc\">Selectează care ecran DS va fi arătat.</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>Amândouă</item>\r\n\t    <item>Cel principal</item>\r\n\t    <item>Cel atins</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">Opțiuni</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">Motorul de execuție</string>\r\n\t<string name=\"ExecutionEngineDesc\">Motorul folosit pentru a emula procesoarele ARM ale DS-ului.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">Modul de sincronizare al sunetului</string>\r\n\t<string name=\"SoundSyncModeDesc\">Sincronizarea sunetului. Sync/async dublu este de obicei acceptabil și mai rapid, dar Sync este uneori necesar pentru filme sau voce.</string>\r\n\t\r\n    <!-- Do not translate -->\r\n    \r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sw600dp/dimens.xml",
    "content": "<resources>\n\n\t<!--\n         Customize dimensions originally defined in res/values/dimens.xml (such as\n         screen margins) for sw600dp devices (e.g. 7\" tablets) here.\n\t-->\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sw720dp-land/dimens.xml",
    "content": "<resources>\n\t\n\t<dimen name=\"activity_horizontal_margin\">128dp</dimen>\n\t\n</resources>"
  },
  {
    "path": "app/src/main/res/values-v11/styles.xml",
    "content": "<resources>\r\n\r\n    <!--  <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light\" /> -->\r\n\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-v14/styles.xml",
    "content": "<resources>\r\n\r\n    <!-- <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\" /> -->\r\n\r\n</resources>"
  },
  {
    "path": "app/src/main/res/values-zh-rCN/strings.xml",
    "content": "<resources>\r\n    \r\n\t<!-- Release 1 -->\r\n    <string name=\"app_name\">nds4droid</string>\r\n    <string name=\"hello_world\">测试程序!</string>\r\n    <string name=\"menu_settings\">设置</string>\r\n    <string name=\"title_activity_main\">nds4droid</string>\r\n\t<string-array name=\"file_options\">\r\n\t\t<!--item>重命名</item--> \r\n\t\t<item>删除</item>\r\n\t\t<!--item>剪切</item-->\r\n\t\t<!--item>拷贝</item-->\r\n\t\t<item>发送至...</item>\r\n\t</string-array>\r\n\t<string name=\"rom_error\">读取ROM出错(</string>\r\n\t<string name=\"OK\">确定</string>\r\n\t<string name=\"location\">定位</string>\r\n    <string name=\"cant_read_folder\">无法读取文件夹</string>\r\n    <string name=\"nnew\">新建</string>\r\n    <string name=\"select\">选择</string>\r\n    <string name=\"file_name\">文件名：</string>\r\n    <string name=\"cancel\">取消</string>\r\n    <string name=\"create\">保存</string>\r\n    <string name=\"no_data\">无数据</string>\r\n    <color name=\"gray\">#ffff0000</color>\r\n    <string name=\"err\">错误</string>\r\n    <string name=\"Load\">读取</string>\r\n    <string name=\"QuickSave\">快速保存</string>\r\n    <string name=\"QuickRestore\">快速恢复</string>\r\n    <string name=\"SaveState\">保存状态</string>\r\n    <string name=\"RestoreState\">恢复状态</string>\r\n    <string name=\"Settings\">设定</string>\r\n    \r\n    <!-- Release 2 -->\r\n    <string name=\"touchnotify\">请点击顶部的“点击”按钮以切换键盘和触屏模式</string>\r\n    <string name=\"frameskip\">跳帧</string>\r\n    <string name=\"frameskipdesc\">在模拟状态下跳过多少帧，可以加速实现实时仿真</string>\r\n    <string name=\"vsync\">VSync</string>\r\n    <string name=\"vsyncdesc\">只在帧间绘制屏幕. 可以减慢仿真，如关闭会导致图像故障</string>\r\n    <string name=\"fps\">显示 FPS</string>\r\n    <string name=\"fpsdesc\">绘制 FPS 到屏幕</string>\r\n    <string name=\"showtouchmsg\">显示触摸信息</string>\r\n    <string name=\"showtouchmsgdesc\">在触屏和键盘模式间切换时，显示一条消息给用户</string>\r\n    \r\n    <!-- Release 3 -->\r\n    <string name=\"loading\">加载中</string>    \r\n    \r\n    <!-- Release 4 -->\r\n    <string name=\"filter\">屏幕过滤器</string>\r\n    <string name=\"filterdesc\">过滤器用于调节屏幕分比率，在从任天堂DS屏幕转换到现有屏幕，高分辨率的过滤器会影响渲染性能.</string>\r\n    \r\n    <!-- Release 5 -->\r\n    <string name=\"threedrenderer\">三维渲染器</string>\r\n    <string name=\"threedrendererdesc\">选择三维渲染引擎</string>\r\n    <string-array name =\"threed_options\">\r\n        <item>无</item>\r\n        <item>OpenGL</item>\r\n        <item>软件</item>\r\n    </string-array>\r\n    <string name=\"sound\">开启声音</string>\r\n    <string name=\"sounddesc\">开启音频回放和音频处理。关闭此项可以提高性能</string>\r\n    <string name=\"showsoundmsg\">显示声音信息</string>\r\n    <string name=\"showsoundmsgdesc\">显示一条消息询问用户是否需要开启声音</string>\r\n    <string name=\"soundmsg\">是否需要开启声音? 这会导致降低 3 到5 FPS 的性能</string>\r\n    <string name=\"yes\">是</string>\r\n    <string name=\"no\">否</string>\r\n\t\r\n\t<!-- Release 8 -->\r\n    <string name=\"Display\">Display</string>\r\n    <string name=\"Controls\">Controls</string>\r\n    <string name=\"EditLayout\">编辑按键布局</string>\r\n    <string name=\"EditLayoutDesc\">编辑虚拟按键在屏幕上的位置</string>\r\n    <string name=\"UseTouchPort\">竖屏按键</string>\r\n    <string name=\"UseTouchPortDesc\">设备竖屏时使用虚拟按键</string>\r\n    <string name=\"UseTouchLand\">横屏按键</string>\r\n    <string name=\"UseTouchLandDesc\">手机横屏时使用虚拟按键</string>\r\n    <string name=\"ResetLayout\">重置虚拟按键</string>\r\n    <string name=\"ResetLayoutDesc\">重置虚拟按键到默认状态，包括布局与透明度。</string>\r\n    <string name=\"Sound\">Sound</string>\r\n    <string name=\"LCDSwap\">颠倒上下屏</string>\r\n    <string name=\"LCDSwapDesc\">颠倒上屏和触摸屏</string>\r\n    <string name=\"ButtonTrans\">按键透明度</string>\r\n    <string name=\"ButtonTransDesc\">设置虚拟按键的透明度</string>\r\n    <string name=\"Haptic\">按键震动</string>\r\n    <string name=\"HapticDesc\">如果设备支持，可以开启按键震动</string>\r\n    <string name=\"KeymapDialogDesc\">Press a key to to map to this button</string>\r\n    <string name=\"KeymapValuePreface\">Currently mapped to</string>\r\n    <string name=\"EditKeymap\">编辑按键映射</string>\r\n    <string name=\"EditKeymapDesc\">映射到设备的实体按键上</string>\r\n    <string name=\"Up\">上</string>\r\n    <string name=\"Down\">下</string>\r\n    <string name=\"Left\">左</string>\r\n    <string name=\"Right\">右</string>\r\n    <string name=\"A\">A</string>\r\n    <string name=\"B\">B</string>\r\n    <string name=\"X\">X</string>\r\n    <string name=\"Y\">Y</string>\r\n    <string name=\"Select\">Start</string>\r\n    <string name=\"Start\">Select</string>\r\n    <string name=\"L\">L</string>\r\n    <string name=\"R\">R</string>\r\n    <string name=\"Touch\">Touch</string>\r\n    \r\n    <!-- Release 10 -->\r\n    <string name=\"DontRotateLCDs\">固定的方向屏幕</string>\r\n    <string name=\"DontRotateLCDsDesc\">手机系统横屏时，上下屏幕不会翻转。用于横向持机的特殊游戏，如七日死。</string>\r\n    <string name=\"Language\">语言</string>\r\n    <string name=\"LanguageDesc\">The language of the system. Multilingual ROMs use this setting. Changes will be applied on the next ROM load.</string>\r\n    <string name=\"Gameplay\">Gameplay</string>\r\n    \r\n    <!-- Release 11 -->\r\n    <string name=\"AddCheat\">添加新的金手指</string>\r\n    <string name=\"Cheats\">金手指</string>\r\n    <string name=\"Exit\">退出</string>\r\n    <string name=\"Edit\">编辑</string>\r\n    <string name=\"Delete\">删除</string>\r\n    <string name=\"Description\">备注</string>\r\n    <string name=\"Code\">代码</string>\r\n    \r\n    <!-- Release 12 -->\r\n    <string name=\"EnableMicrophone\">模拟麦克风</string>\r\n    <string name=\"EnableMicrophoneDesc\">使用设备的麦克风来模拟ds的麦克风（线控耳机麦克风可用）</string>\r\n    <string name=\"AlwaysTouch\">总是允许触摸操作</string>\r\n    <string name=\"AlwaysTouchDesc\">在虚拟按键操作的同时进行触摸操作，用于某些特殊游戏，如美妙世界。</string>\r\n    \r\n    <!-- Release 16 -->\r\n    <string name=\"MaintainAspectRatio\">保持原有比例</string>\r\n    <string name=\"MaintainAspectRatioDesc\">不会拉伸至全屏</string>\r\n\t<string name=\"MainScreenOnly\">Main screen only</string>\r\n\t<string name=\"MainScreenOnlyDesc\">Only display the main game screen, hiding the touch screen.</string>\r\n\t<string name=\"LidOpen\">打开上屏</string>\r\n    \r\n\t<!-- Release 18 -->\r\n\t<string name=\"SelectScreens\">选择屏幕</string>\r\n\t<string name=\"SelectScreensDesc\">选择要显示的ds屏幕</string>\r\n\t<string-array name=\"screen_options\">\r\n\t    <item>全部显示</item>\r\n\t    <item>只显示上屏</item>\r\n\t    <item>只显示下屏</item>\r\n\t</string-array>\r\n\t\r\n\t<!-- Release 20 -->\r\n\t<string name=\"Options\">Options</string>\r\n\t\r\n\t<!-- Release 22 -->\r\n\t<string name=\"ExecutionEngine\">执行引擎</string>\r\n\t<string name=\"ExecutionEngineDesc\">The engine used to emulate the ARM processors of the DS.</string>\r\n\t\r\n\t<!-- Release 28 -->\r\n\t<string name=\"SoundSyncMode\">声音同步方式</string>\r\n\t<string name=\"SoundSyncModeDesc\">dual sync/async是通常选项，不会影响整体模拟速度。sync用来播放cg等，但是会稍微降低速度</string>\r\n    \r\n    <!-- Do not translate -->\r\n\r\n    \r\n</resources>"
  },
  {
    "path": "app/src/main/res/xml/keymap.xml",
    "content": "<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n    \r\n    <com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Up\"\r\n\t\t\tandroid:title=\"@string/Up\"\r\n\t\t\tandroid:dialogTitle=\"@string/Up\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Down\"\r\n\t\t\tandroid:title=\"@string/Down\"\r\n\t\t\tandroid:dialogTitle=\"@string/Down\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Left\"\r\n\t\t\tandroid:title=\"@string/Left\"\r\n\t\t\tandroid:dialogTitle=\"@string/Left\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Right\"\r\n\t\t\tandroid:title=\"@string/Right\"\r\n\t\t\tandroid:dialogTitle=\"@string/Right\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.A\"\r\n\t\t\tandroid:title=\"@string/A\"\r\n\t\t\tandroid:dialogTitle=\"@string/A\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.B\"\r\n\t\t\tandroid:title=\"@string/B\"\r\n\t\t\tandroid:dialogTitle=\"@string/B\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.X\"\r\n\t\t\tandroid:title=\"@string/X\"\r\n\t\t\tandroid:dialogTitle=\"@string/X\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Y\"\r\n\t\t\tandroid:title=\"@string/Y\"\r\n\t\t\tandroid:dialogTitle=\"@string/Y\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Start\"\r\n\t\t\tandroid:title=\"@string/Start\"\r\n\t\t\tandroid:dialogTitle=\"@string/Start\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Select\"\r\n\t\t\tandroid:title=\"@string/Select\"\r\n\t\t\tandroid:dialogTitle=\"@string/Select\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.L\"\r\n\t\t\tandroid:title=\"@string/L\"\r\n\t\t\tandroid:dialogTitle=\"@string/L\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.R\"\r\n\t\t\tandroid:title=\"@string/R\"\r\n\t\t\tandroid:dialogTitle=\"@string/R\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Touch\"\r\n\t\t\tandroid:title=\"@string/Touch\"\r\n\t\t\tandroid:dialogTitle=\"@string/Touch\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n   \t<com.opendoorstudios.ds4droid.KeyMapPreference\r\n\t\t\tandroid:key=\"Controls.KeyMap.Options\"\r\n\t\t\tandroid:title=\"@string/Options\"\r\n\t\t\tandroid:dialogTitle=\"@string/Options\"\r\n\t\t\tandroid:summary=\"@string/KeymapValuePreface\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n    \r\n</PreferenceScreen>"
  },
  {
    "path": "app/src/main/res/xml/settings.xml",
    "content": "<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n    \r\n      <PreferenceCategory android:title=\"@string/Gameplay\">\r\n          <ListPreference android:entries=\"@array/languages\" android:summary=\"@string/LanguageDesc\" android:title=\"@string/Language\" android:key=\"Language\" android:entryValues=\"@array/zerothroughfive\"/>\n          <ListPreference android:entries=\"@array/executionengines\" android:summary=\"@string/ExecutionEngineDesc\" android:title=\"@string/ExecutionEngine\" android:key=\"CpuMode\" android:entryValues=\"@array/zerothroughthree\" />\r\n      \t  <com.opendoorstudios.ds4droid.SliderPreference\r\n      \t      android:key=\"JitSize\"\r\n      \t      android:title=\"@string/JitSize\"\r\n      \t      android:dialogTitle=\"@string/JitSize\"\r\n      \t      android:summary=\"@string/JitSizeDesc\"\r\n      \t      android:persistent=\"true\" />\r\n      \t  <CheckBoxPreference android:title=\"@string/EnableAutosave\" android:key=\"EnableAutosave\" android:summary=\"@string/EnableAutosaveDesc\" />\r\n      \t  <ListPreference android:entries=\"@array/AutosaveFrequencyNames\" android:entryValues=\"@array/zerothroughfour\" android:key=\"AutosaveFrequency\" android:title=\"@string/AutosaveFrequency\" android:summary=\"@string/AutosaveFrequencyDesc\" />\n      \t  <CheckBoxPreference android:title=\"@string/DisableROMBrowser\" android:key=\"DisableROMBrowser\" android:summary=\"@string/DisableROMBrowserDesc\" />\r\n      </PreferenceCategory>\r\n    \r\n      <PreferenceCategory android:title=\"@string/Display\">\r\n\t      <ListPreference android:entries=\"@array/zerothroughnine\" android:entryValues=\"@array/zerothroughnine\" android:key=\"FrameSkip\" android:title=\"@string/frameskip\" android:summary=\"@string/frameskipdesc\"/>\r\n\t      <ListPreference android:title=\"@string/filter\" android:summary=\"@string/filterdesc\" android:key=\"Filter\" android:entryValues=\"@array/zerothroughseventeen\" android:entries=\"@array/filternames\"/>Filter\r\n\t      <ListPreference android:key=\"Renderer\" android:title=\"@string/threedrenderer\" android:summary=\"@string/threedrendererdesc\" android:entries=\"@array/threed_options\" android:entryValues=\"@array/zerothroughtwo\"/>\r\n\t      <CheckBoxPreference android:title=\"@string/fps\" android:summary=\"@string/fpsdesc\" android:key=\"DisplayFps\"/>\r\n\t      <CheckBoxPreference android:title=\"@string/LCDSwap\" android:key=\"LCDsSwap\" android:summary=\"@string/LCDSwapDesc\"/>\r\n\t\t  <CheckBoxPreference android:title=\"@string/DontRotateLCDs\" android:key=\"WindowRotate\" android:summary=\"@string/DontRotateLCDsDesc\"/>\r\n\t\t  <CheckBoxPreference android:title=\"@string/MaintainAspectRatio\" android:key=\"MaintainAspectRatio\" android:summary=\"@string/MaintainAspectRatioDesc\" />\r\n\t\t  <CheckBoxPreference android:title=\"@string/EnableFog\" android:key=\"EnableFog\" android:summary=\"@string/EnableFogDesc\" />\r\n\t\t  <ListPreference android:entries=\"@array/screen_options\" android:entryValues=\"@array/zerothroughtwo\" android:key=\"SpecificScreenOnly\" android:title=\"@string/SelectScreens\" android:summary=\"@string/SelectScreensDesc\"/>\r\n\t\t</PreferenceCategory>\r\n      \r\n      <PreferenceCategory android:title=\"@string/Sound\">\r\n          <CheckBoxPreference android:summary=\"@string/sounddesc\" android:key=\"SoundCore2\" android:title=\"@string/sound\"/>\r\n          <CheckBoxPreference android:summary=\"@string/EnableMicrophoneDesc\" android:key=\"EnableMicrophone\" android:title=\"@string/EnableMicrophone\" />\r\n          <ListPreference android:entries=\"@array/soundsyncmodes\" android:entryValues=\"@array/zerothroughone\" android:key=\"SynchMode\" android:title=\"@string/SoundSyncMode\" android:summary=\"@string/SoundSyncModeDesc\" />\r\n      </PreferenceCategory>  \r\n      \r\n      <PreferenceCategory android:title=\"@string/Controls\">\r\n          <Preference android:title=\"@string/EditLayout\" android:summary=\"@string/EditLayoutDesc\" android:key=\"Controls.EditLayout\"/>\r\n\t\t  <Preference android:title=\"@string/EditKeymap\" android:summary=\"@string/EditKeymapDesc\" android:key=\"Controls.EditMappings\"/>\r\n          <CheckBoxPreference android:title=\"@string/UseTouchPort\" android:summary=\"@string/UseTouchPortDesc\" android:key=\"Controls.Portrait.Draw\"/>\r\n          <CheckBoxPreference android:title=\"@string/UseTouchLand\" android:summary=\"@string/UseTouchLandDesc\" android:key=\"Controls.Landscape.Draw\"/>\r\n          <CheckBoxPreference android:title=\"@string/Haptic\" android:summary=\"@string/HapticDesc\" android:key=\"Controls.Haptic\"/>\r\n          <CheckBoxPreference android:title=\"@string/AlwaysTouch\" android:summary=\"@string/AlwaysTouchDesc\" android:key=\"Controls.AlwaysTouch\" />\r\n          <com.opendoorstudios.ds4droid.TransparencyPreference\r\n\t\t\tandroid:key=\"Controls.Transparency\"\r\n\t\t\tandroid:title=\"@string/ButtonTrans\"\r\n\t\t\tandroid:dialogTitle=\"@string/ButtonTrans\"\r\n\t\t\tandroid:summary=\"@string/ButtonTransDesc\"\r\n\t\t\tandroid:persistent=\"true\" />\r\n          <Preference android:title=\"@string/ResetLayout\" android:summary=\"@string/ResetLayoutDesc\" android:key=\"Controls.ResetLayout\"/>\r\n\r\n      </PreferenceCategory>\r\n\r\n  </PreferenceScreen>\r\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\r\nbuildscript {\r\n    repositories {\r\n        jcenter()\r\n    }\r\n    dependencies {\r\n        classpath 'com.android.tools.build:gradle:1.5.0'\r\n    }\r\n}\r\n\r\nallprojects {\r\n    repositories {\r\n        jcenter()\r\n    }\r\n}\r\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Oct 21 11:34:03 PDT 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.8-all.zip\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\r\n"
  }
]